ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMjBiNjQKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKyoucHljCmRpZmYgLS1naXQgYS9DSEFOR0VTLnR4dCBiL0NIQU5HRVMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzViMjkKLS0tIC9kZXYvbnVsbAorKysgYi9DSEFOR0VTLnR4dApAQCAtMCwwICsxLDM0NzUgQEAKKzIwMjItMTAtMjYgdmVyc2lvbiAyMS45IChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkpDQorDQorICBDKysNCisgICogVXBkYXRlIHpsaWIgdG8gMS4yLjEzICgjMTA4MTkpDQorDQorICBQeXRob24NCisgICogVGFyZ2V0IE1hY09TIDEwLjkgdG8gZml4ICMxMDc5OSAoIzEwODA3KQ0KKw0KKyAgUnVieQ0KKyAgKiBSZXBsYWNlIGxpYmMgc3RyZHVwIHVzYWdlIHdpdGggaW50ZXJuYWwgaW1wbCB0byByZXN0b3JlIG11c2wgY29tcGF0ICgjMTA4MTgpDQorDQorMjAyMi0xMC0xOCB2ZXJzaW9uIDIxLjggKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieSkNCisNCisgIE90aGVyDQorICAqIEZpeCBmb3IgZ3JwYy50b29scyAjMTc5OTUgJiBwcm90b2J1ZiAjNzQ3NCAoaGFuZGxlIFVURi04IHBhdGhzIGluIGFyZ3VtZW50ZmlsZSkgKCMxMDcyMSkNCisNCisgIEMrKw0KKyAgKiAyMS54IE5vIGxvbmdlciBkZWZpbmUgbm9fdGhyZWFkbG9jYWwgb24gT3BlbkJTRCAoIzEwNzQzKQ0KKw0KKyAgSmF2YQ0KKyAgKiBNYXJrIGRlZmF1bHQgaW5zdGFuY2UgYXMgaW1tdXRhYmxlIGZpcnN0IHRvIGF2b2lkIHJhY2UgZHVyaW5nIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiBkZWZhdWx0IGluc3RhbmNlcyAoIzEwNzcxKQ0KKw0KKyAgUnVieQ0KKyAgKiBBdXRvIGNhcGl0YWxpemUgZW51bXMgbmFtZSBpbiBSdWJ5ICgjMTA0NTQpICgjMTA3NjMpDQorDQorDQorMjAyMi0wOS0yOSB2ZXJzaW9uIDIxLjcgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieSkNCisgIEphdmENCisgICogUmVmYWN0b3JpbmcgamF2YSBmdWxsIHJ1bnRpbWUgdG8gcmV1c2Ugc3ViLW1lc3NhZ2UgYnVpbGRlcnMgYW5kIHByZXBhcmUgdG8NCisgICAgbWlncmF0ZSBwYXJzaW5nIGxvZ2ljIGZyb20gcGFyc2UgY29uc3RydWN0b3IgdG8gYnVpbGRlci4NCisgICogTW92ZSBwcm90byB3aXJlZm9ybWF0IHBhcnNpbmcgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBwcml2YXRlICJwYXJzaW5nDQorICAgIGNvbnN0cnVjdG9yIiB0byB0aGUgQnVpbGRlciBjbGFzcy4NCisgICogQ2hhbmdlIHRoZSBMaXRlIHJ1bnRpbWUgdG8gcHJlZmVyIG1lcmdpbmcgZnJvbSB0aGUgd2lyZWZvcm1hdCBpbnRvIG11dGFibGUNCisgICAgbWVzc2FnZXMgcmF0aGVyIHRoYW4gYnVpbGRpbmcgdXAgYSBuZXcgaW1tdXRhYmxlIG9iamVjdCBiZWZvcmUgbWVyZ2luZy4gVGhpcw0KKyAgICB3YXkgcmVzdWx0cyBpbiBmZXdlciBhbGxvY2F0aW9ucyBhbmQgY29weSBvcGVyYXRpb25zLg0KKyAgKiBNYWtlIG1lc3NhZ2UtdHlwZSBleHRlbnNpb25zIG1lcmdlIGZyb20gd2lyZS1mb3JtYXQgaW5zdGVhZCBvZiBidWlsZGluZyB1cA0KKyAgICBpbnN0YW5jZXMgYW5kIG1lcmdpbmcgYWZ0ZXJ3YXJkcy4gVGhpcyBoYXMgbXVjaCBiZXR0ZXIgcGVyZm9ybWFuY2UuDQorICAqIEZpeCBUZXh0Rm9ybWF0IHBhcnNlciB0byBidWlsZCB1cCByZWN1cnJpbmcgKGJ1dCBzdXBwb3NlZGx5IG5vdCByZXBlYXRlZCkNCisgICAgc3ViLW1lc3NhZ2VzIGRpcmVjdGx5IGZyb20gdGV4dCByYXRoZXIgdGhhbiBidWlsZGluZyBhIG5ldyBzdWItbWVzc2FnZSBhbmQNCisgICAgbWVyZ2luZyB0aGUgZnVsbHkgZm9ybWVkIG1lc3NhZ2UgaW50byB0aGUgZXhpc3RpbmcgZmllbGQuDQorDQorMjAyMi0wOS0xMyB2ZXJzaW9uIDIxLjYgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieSkNCisNCitDKysNCisqIFJlZHVjZSBtZW1vcnkgY29uc3VtcHRpb24gb2YgTWVzc2FnZVNldCBwYXJzaW5nDQorDQorMjAyMi0wOC0wOSB2ZXJzaW9uIDIxLjUgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieSkNCisNCisgIFBIUA0KKyAgKiBBZGRlZCBnZXRDb250YWluaW5nT25lb2YgYW5kIGdldFJlYWxDb250YWluaW5nT25lb2YgdG8gZGVzY3JpcHRvci4NCisgICogZml4IFBIUCByZWFkb25seSBsZWdhY3kgZmlsZXMgZm9yIG5lc3RlZCBtZXNzYWdlcw0KKw0KKyAgUHl0aG9uDQorICAqIEZpeGVkIGNvbXBhcmlzb24gb2YgbWFwcyBpbiBQeXRob24uDQorDQorDQorMjAyMi0wNy0yNSB2ZXJzaW9uIDIxLjQgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieSkNCisNCisgIEMrKw0KKyAgKiBSZWR1Y2UgdGhlIHJlcXVpcmVkIGFsaWdubWVudCBvZiBBcmVuYVN0cmluZyBmcm9tIDggdG8gNCAoIzEwMjk4KQ0KKw0KKw0KKzIwMjItMDctMTkgdmVyc2lvbiAyMS4zIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkpDQorICBDKysNCisgICogQWRkIGhlYWRlciBzZWFyY2ggcGF0aHMgdG8gUHJvdG9idWYtQysrLnBvZHNwZWMgKCMxMDAyNCkNCisgICogRml4ZWQgVmlzdWFsIFN0dWRpbyBjb25zdGluaXQgZXJyb3JzICgjMTAyMzIpDQorICAqIEZpeCAjOTk0NzogbWFrZSB0aGUgQUJJIGNvbXBhdGlibGUgYmV0d2VlbiBkZWJ1ZyBhbmQgbm9uLWRlYnVnIGJ1aWxkcyAoIzEwMjcxKQ0KKw0KKyAgVVBCDQorICAqIEFsbG93IGVtcHR5IHBhY2thZ2UgbmFtZXMgKGZpeGVzIGJlaGF2aW9yIHJlZ3Jlc3Npb24gaW4gNC4yMS4wKQ0KKyAgKiBGaXggYSBTRUdWIGJ1ZyB3aGVuIGNvbXBhcmluZyBhIG5vbi1tYXRlcmlhbGl6ZWQgc3ViLW1lc3NhZ2UgKCMxMDIwOCkNCisgICogRml4IHNldmVyYWwgYnVncyBpbiBkZXNjcmlwdG9yIG1hcHBpbmcgY29udGFpbmVycyAoZWcuIGRlc2NyaXB0b3Iuc2VydmljZXNfYnlfbmFtZSkNCisgICAgKiBmb3IgeCBpbiBtYXBwaW5nIG5vdyB5aWVsZHMga2V5cyByYXRoZXIgdGhhbiB2YWx1ZXMsIHRvIG1hdGNoIFB5dGhvbiBjb252ZW50aW9ucyBhbmQgdGhlIGJlaGF2aW9yIG9mIHRoZSBvbGQgbGlicmFyeS4NCisgICAgKiBMb29rdXAgb3BlcmF0aW9ucyBub3cgY29ycmVjdGx5IHJlamVjdCB1bmhhc2hhYmxlIHR5cGVzIGFzIG1hcCBrZXlzLg0KKyAgICAqIFdlIGltcGxlbWVudCByZXByKCkgdG8gdXNlIHRoZSBzYW1lIGZvcm1hdCBhcyBkaWN0Lg0KKyAgKiBGaXggbWFwcyB0byB1c2UgdGhlIFNjYWxhck1hcENvbnRhaW5lciBjbGFzcyB3aGVuIGFwcHJvcHJpYXRlDQorICAqIEZpeCBidWcgd2hlbiBwYXJzaW5nIGFuIHVua25vd24gdmFsdWUgaW4gYSBwcm90bzIgZW51bSBleHRlbnNpb24gKHByb3RvY29sYnVmZmVycy91cGIjNzE3KQ0KKw0KKyAgUEhQDQorICAqIEFkZCAicmVhZG9ubHkiIGFzIGEga2V5d29yZCBmb3IgUEhQIGFuZCBhZGQgcHJldmlvdXMgY2xhc3NuYW1lcyB0byBkZXNjcmlwdG9yIHBvb2wgKCMxMDA0MSkNCisNCisgIFB5dGhvbg0KKyAgKiBNYWtlIC8vOnByb3RvYnVmX3B5dGhvbiBhbmQgLy86d2VsbF9rbm93bl90eXBlc19weV9wYjIgcHVibGljICgjMTAxMTgpDQorDQorICBCYXplbA0KKyAgKiBBZGQgYmFjayBhIGZpbGVncm91cCBmb3IgOndlbGxfa25vd25fcHJvdG9zICgjMTAwNjEpDQorDQorMjAyMi0wNi0yNyB2ZXJzaW9uIDIxLjIgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieSkNCisgIEMrKw0KKyAgKiBBcmVuYVN0cmluZyBpbXByb3ZlbWVudHMgKGZpeCBhbGlnbm1lbnQgaXNzdWUpDQorDQorICBQSFANCisgICogQVBJIGNoYW5nZXMgZm9yIE9uZU9mICAoIzEwMTAyKQ0KKw0KKw0KKzIwMjItMDUtMjcgdmVyc2lvbiAyMS4xIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkpDQorDQorICBDKysNCisgICogY21ha2U6IFJldmVydCAiRml4IGNtYWtlIGluc3RhbGwgdGFyZ2V0cyAoIzk4MjIpIiAoIzEwMDYwKQ0KKyAgKiBSZW1vdmUgQWJzZWlsIGRlcGVuZGVuY3kgZnJvbSBDTWFrZSBidWlsZCAoIzEwMDU2KQ0KKw0KKyAgUHl0aG9uDQorICAqIFVwZGF0ZSBweXRob24gd2hlZWwgbWV0YWRhdGEgd2l0aCBtb3JlIGluZm9ybWF0aW9uIGluY2wuIHJlcXVpcmVkIHB5dGhvbiB2ZXJzaW9uICgjMTAwNTgpDQorICAqIEZpeCBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBpbnN0YW50aWF0aW5nIGZpZWxkIHZpYSByZXBlYXRlZCBmaWVsZCBhc3NpZ25tZW50ICgjMTAwNjYpDQorDQorMjAyMi0wNS0yNSB2ZXJzaW9uIDIxLjAgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieSkNCisNCisgIEMrKw0KKyAgKiBjbWFrZTogQ2FsbCBnZXRfZmlsZW5hbWVfY29tcG9uZW50KCkgd2l0aCBESVJFQ1RPUlkgbW9kZSBpbnN0ZWFkIG9mIFBBVEggbW9kZSAoIzk2MTQpDQorICAqIEVzY2FwZSBHZXRPYmplY3QgbWFjcm8gaW5zaWRlIHByb3RvYy1nZW5lcmF0ZWQgY29kZSAoIzk3MzkpDQorICAqIFVwZGF0ZSBDTWFrZSBjb25maWd1cmF0aW9uIHRvIGFkZCBhIGRlcGVuZGVuY3kgb24gQWJzZWlsICgjOTc5MykNCisgICogRml4IGNtYWtlIGluc3RhbGwgdGFyZ2V0cyAoIzk4MjIpDQorICAqIFVzZSBfX2NvbnN0aW5pdCBvbmx5IGluIEdDQyAxMi4yIGFuZCB1cCAoIzk5MzYpDQorDQorICBKYXZhDQorICAqIFVwZGF0ZSBwcm90b2J1Zl92ZXJzaW9uLmJ6bCB0byBzZXBhcmF0ZSBwcm90b2MgYW5kIHBlci1sYW5ndWFnZSBqYXZhIOKApiAoIzk5MDApDQorDQorICBQeXRob24NCisgICogSW5jcmVtZW50IHB5dGhvbiBtYWpvciB2ZXJzaW9uIHRvIDQgaW4gdmVyc2lvbi5qc29uIGZvciBweXRob24gdXBiICgjOTkyNikNCisgICogVGhlIEMgZXh0ZW5zaW9uIG1vZHVsZSBmb3IgUHl0aG9uIGhhcyBiZWVuIHJld3JpdHRlbiB0byB1c2UgdGhlIHVwYiBsaWJyYXJ5Lg0KKyAgICBUaGlzIGlzIGV4cGVjdGVkIHRvIGRlbGl2ZXIgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgYmVuZWZpdHMsIGVzcGVjaWFsbHkgd2hlbg0KKyAgICBwYXJzaW5nIGxhcmdlIHBheWxvYWRzLiAgVGhlcmUgYXJlIHNvbWUgbWlub3IgYnJlYWtpbmcgY2hhbmdlcywgYnV0IHRoZXNlDQorICAgIHNob3VsZCBub3QgaW1wYWN0IG1vc3QgdXNlcnMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWU6DQorICAgIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9uZXdzLzIwMjItMDUtMDYjcHl0aG9uLXVwZGF0ZXMNCisgICogRml4ZWQgd2luMzIgYnVpbGQgYW5kIGZpeGVkIHN0cihtZXNzYWdlKSBvbiBhbGwgV2luZG93cyBwbGF0Zm9ybXMuICgjOTk3NikNCisgICogVGhlIGJpbmFyeSB3aGVlbCBmb3IgbWFjT1Mgbm93IHN1cHBvcnRzIEFwcGxlIHNpbGljb24uDQorDQorICBQSFANCisgICogW1BIUF0gZml4IFBIUCBidWlsZCBzeXN0ZW0gKCM5NTcxKQ0KKyAgKiBGaXggYnVpbGRpbmcgcGFja2FnZWQgUEhQIGV4dGVuc2lvbiAoIzk3MjcpDQorICAqIGZpeDogcmVzZXJ2ZSAiUmVhZE9ubHkiIGtleXdvcmQgZm9yIFBIUCA4LjEgYW5kIGFkZCBjb21wYXRpYmlsaXR5ICgjOTYzMykNCisgICogZml4OiBwaHBkb2Mgc3ludGF4IGZvciByZXBlYXRlZGZpZWxkIHBhcmFtZXRlcnMgKCM5Nzg0KQ0KKyAgKiBmaXg6IHBocGRvYyBmb3IgcmVwZWF0ZWRmaWVsZCAoIzk3ODMpDQorICAqIENoYW5nZSBlbnVtIHN0cmluZyBuYW1lIGZvciByZXNlcnZlZCB3b3JkcyAoIzk3ODApDQorICAqIGNob3JlOiBbUEhQXSBmaXggcGhwZG9jIGZvciBNYXBGaWVsZCBrZXlzICgjOTUzNikNCisgICogRml4ZWQgUEhQIFNFR1YgYnkgbm90IHdyaXRpbmcgdG8gc2hhcmVkIG1lbW9yeSBmb3IgemVuZF9jbGFzc19lbnRyeS4gKCM5OTk2KQ0KKw0KKyAgUnVieQ0KKyAgKiBBbGxvdyBwcmUtY29tcGlsZWQgYmluYXJpZXMgZm9yIHJ1YnkgMy4xLjAgKCM5NTY2KQ0KKyAgKiBJbXBsZW1lbnQgYHJlc3BvbmRfdG8/YCBpbiBSdWJ5TWVzc2FnZSAoIzk2NzcpDQorICAqIFtSdWJ5XSBGaXggUmVwZWF0ZWRGaWVsZCNsYXN0LCAjZmlyc3QgaW5jb25zaXN0ZW5jaWVzICgjOTcyMikNCisgICogRG8gbm90IHVzZSByYW5nZSBiYXNlZCBVVEYtOCB2YWxpZGF0aW9uIGluIHRydWZmbGVydWJ5ICgjOTc2OSkNCisgICogSW1wcm92ZSByYW5nZSBoYW5kbGluZyBsb2dpYyBvZiBgUmVwZWF0ZWRGaWVsZGAgKCM5Nzk5KQ0KKyAgKiBTdXBwb3J0IHg2NC1taW5ndy11Y3J0IHBsYXRmb3JtDQorDQorICBPdGhlcg0KKyAgKiBbS290bGluXSByZW1vdmUgcmVkdW5kYW50IHB1YmxpYyBtb2RpZmllcnMgZm9yIGNvbXBpbGVkIGNvZGUgKCM5NjQyKQ0KKyAgKiBbQyNdIFVwZGF0ZSBHZXRFeHRlbnNpb24gdG8gc3VwcG9ydCBnZXR0aW5nIHR5cGVkIHZhbHVlICgjOTY1NSkNCisgICogRml4IGludmFsaWQgZGVwZW5kZW5jeSBtYW5pZmVzdCB3aGVuIHVzaW5nIGBkZXNjcmlwdG9yX3NldF9vdXRgICgjOTY0NykNCisgICogRml4IEMjIGdlbmVyYXRvciBoYW5kbGluZyBvZiBhIGZpZWxkIG5hbWVkICJub25lIiBpbiBhIG9uZW9mICgjOTYzNikNCisgICogQWRkIGluaXRpYWwgdmVyc2lvbi5qc29uIGZpbGUgZm9yIDIxLWRldiAoIzk4NDApDQorICAqIFJlbW92ZSBkdXBsaWNhdGUgamF2YSBnZW5lcmF0ZWQgY29kZSAoIzk5MDkpDQorICAqIENoZXJyeS1waWNrIFBSICM5OTgxIGludG8gMjEueCBicmFuY2ggKCMxMDAwMCkNCisNCisNCisyMDIyLTA1LTE5IHZlcnNpb24gMjEuMC1yYzIoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5KQ0KKw0KKyAgUHl0aG9uDQorICAqIEZpeCB3aW5kb3dzIGJ1aWxkcw0KKyAgKiBUaHJvdyBtb3JlIGhlbHBmdWwgZXJyb3IgaWYgZ2VuZXJhdGVkIGNvZGUgaXMgb3V0IG9mIGRhdGUNCisgICogRml4ZWQgdHdvIHJlZmVyZW5jZSBsZWFrcw0KKw0KKyAgUnVieQ0KKyAgKiBTdXBwb3J0IHg2NC1taW5ndy11Y3J0IHBsYXRmb3JtDQorDQorICBQSFANCisgICogRml4IFNFR1YgYnkgbm90IHdyaXRpbmcgdG8gc2hhcmVkIG1lbW9yeSBmb3IgemVuZF9jbGFzc19lbnRyeQ0KKw0KKyAgQyMNCisgICogU3VwcHJlc3Mgd2FybmluZyBDUzg5ODENCisNCisgIE90aGVyDQorICAqIEZpeCBNYXZlbiByZWxlYXNlIHRvIHJlbGVhc2UgYWN0dWFsIG9zeF9hYXJjaDY0IGJpbmFyeQ0KKyAgKiBGaXggcHJvdG9jIHppcHMgdG8gaGF2ZSB0aGUgcHJvdG8gZmlsZXMgZm9yIHdlbGwga25vd24gdHlwZXMNCisNCisyMDIyLTA1LTEwIHZlcnNpb24gMjEuMC1yYzEgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieSkNCisNCisgIEMrKw0KKyAgKiBSZW5hbWUgbWFpbiBjbWFrZS9DTWFrZUxpc3RzLnR4dCB0byBDTWFrZUxpc3RzLnR4dCAoIzk2MDMpDQorICAqIGF2b2lkIGFsbG9jYXRpbmcgbWVtb3J5IGlmIGFsbCBleHRlbnNpb24gYXJlIGNsZWFyZWQgKCM5MzQ1KQ0KKyAgKiBjbWFrZTogQ2FsbCBnZXRfZmlsZW5hbWVfY29tcG9uZW50KCkgd2l0aCBESVJFQ1RPUlkgbW9kZSBpbnN0ZWFkIG9mIFBBVEggbW9kZSAoIzk2MTQpDQorICAqIEVzY2FwZSBHZXRPYmplY3QgbWFjcm8gaW5zaWRlIHByb3RvYy1nZW5lcmF0ZWQgY29kZSAoIzk3MzkpDQorICAqIFVwZGF0ZSBDTWFrZSBjb25maWd1cmF0aW9uIHRvIGFkZCBhIGRlcGVuZGVuY3kgb24gQWJzZWlsICgjOTc5MykNCisgICogVXNlIF9fY29uc3Rpbml0IG9ubHkgaW4gR0NDIDEyLjIgYW5kIHVwICgjOTkzNikNCisgICogUmVmYWN0b3IgZ2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3MgbGF5b3V0DQorICAqIE9wdGltaXplIHRva2VuaXplciBQYXJzZUludGVnZXIgYnkgcmVtb3ZpbmcgZGl2aXNpb24NCisgICogUmVzZXJ2ZSBleGFjdGx5IHRoZSByaWdodCBhbW91bnQgb2YgY2FwYWNpdHkgaW4gRXh0ZW5zaW9uU2V0OjpNZXJnZUZyb20NCisgICogUGFyc2UgRkxUX01BWCBjb3JyZWN0bHkgd2hlbiByZXByZXNlbnRlZCBpbiBKU09ODQorDQorICBKYXZhDQorICAqIFVwZGF0ZSBwcm90b2J1Zl92ZXJzaW9uLmJ6bCB0byBzZXBhcmF0ZSBwcm90b2MgYW5kIHBlci1sYW5ndWFnZSBqYXZhIOKApiAoIzk5MDApDQorICAqIDZ4IHNwZWVkdXAgaW4gQXJyYXlFbmNvZGVyLndyaXRlVUludDMyTm90VGFnDQorDQorICBQeXRob24NCisgICogSW5jcmVtZW50IHB5dGhvbiBtYWpvciB2ZXJzaW9uIHRvIDQgaW4gdmVyc2lvbi5qc29uIGZvciBweXRob24gdXBiICgjOTkyNikNCisgICogVGhlIEMgZXh0ZW5zaW9uIG1vZHVsZSBmb3IgUHl0aG9uIGhhcyBiZWVuIHJld3JpdHRlbiB0byB1c2UgdGhlIHVwYiBsaWJyYXJ5Lg0KKyAgICBUaGlzIGlzIGV4cGVjdGVkIHRvIGRlbGl2ZXIgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgYmVuZWZpdHMsIGVzcGVjaWFsbHkgd2hlbg0KKyAgICBwYXJzaW5nIGxhcmdlIHBheWxvYWRzLiAgVGhlcmUgYXJlIHNvbWUgbWlub3IgYnJlYWtpbmcgY2hhbmdlcywgYnV0IHRoZXNlDQorICAgIHNob3VsZCBub3QgaW1wYWN0IG1vc3QgdXNlcnMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWU6DQorICAgIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9uZXdzLzIwMjItMDUtMDYjcHl0aG9uLXVwZGF0ZXMNCisgICogRHVlIHRvIHRoZSBicmVha2luZyBjaGFuZ2VzIGZvciBQeXRob24sIHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlciBmb3IgUHl0aG9uDQorICAgIGhhcyBiZWVuIGluY3JlbWVudGVkLg0KKyAgKiBUaGUgYmluYXJ5IHdoZWVsIGZvciBtYWNPUyBub3cgc3VwcG9ydHMgQXBwbGUgc2lsaWNvbi4NCisNCisNCisgIFBIUA0KKyAgKiBjaG9yZTogW1BIUF0gZml4IHBocGRvYyBmb3IgTWFwRmllbGQga2V5cyAoIzk1MzYpDQorICAqIFtQSFBdIFJlbW92ZSB1bm5lY2Vzc2FyeSB6dmFsIGluaXRpYWxpemF0aW9uICgjOTYwMCkNCisgICogW1BIUF0gZml4IFBIUCBidWlsZCBzeXN0ZW0gKCM5NTcxKQ0KKyAgKiBGaXggYnVpbGRpbmcgcGFja2FnZWQgUEhQIGV4dGVuc2lvbiAoIzk3MjcpDQorICAqIGZpeDogcmVzZXJ2ZSAiUmVhZE9ubHkiIGtleXdvcmQgZm9yIFBIUCA4LjEgYW5kIGFkZCBjb21wYXRpYmlsaXR5ICgjOTYzMykNCisgICogZml4OiBwaHBkb2Mgc3ludGF4IGZvciByZXBlYXRlZGZpZWxkIHBhcmFtZXRlcnMgKCM5Nzg0KQ0KKyAgKiBmaXg6IHBocGRvYyBmb3IgcmVwZWF0ZWRmaWVsZCAoIzk3ODMpDQorICAqIENoYW5nZSBlbnVtIHN0cmluZyBuYW1lIGZvciByZXNlcnZlZCB3b3JkcyAoIzk3ODApDQorICAqIEZpeGVkIGNvbXBvc2VyLmpzb24gdG8gb25seSBhZHZlcnRpc2UgY29tcGF0aWJpbGl0eSB3aXRoIFBIUCA3LjArLiAgKCM5ODE5KQ0KKw0KKyAgUnVieQ0KKyAgKiBBbGxvdyBwcmUtY29tcGlsZWQgYmluYXJpZXMgZm9yIHJ1YnkgMy4xLjAgKCM5NTY2KQ0KKyAgKiBJbXBsZW1lbnQgYHJlc3BvbmRfdG8/YCBpbiBSdWJ5TWVzc2FnZSAoIzk2NzcpDQorICAqIFtSdWJ5XSBGaXggUmVwZWF0ZWRGaWVsZCNsYXN0LCAjZmlyc3QgaW5jb25zaXN0ZW5jaWVzICgjOTcyMikNCisgICogRG8gbm90IHVzZSByYW5nZSBiYXNlZCBVVEYtOCB2YWxpZGF0aW9uIGluIHRydWZmbGVydWJ5ICgjOTc2OSkNCisgICogSW1wcm92ZSByYW5nZSBoYW5kbGluZyBsb2dpYyBvZiBgUmVwZWF0ZWRGaWVsZGAgKCM5Nzk5KQ0KKyAgKiBEaXNhYmxlIHRoZSBhYXJjaDY0IGJ1aWxkIG9uIG1hY09TIHVudGlsIGl0IGNhbiBiZSBmaXhlZC4gKCM5ODE2KQ0KKw0KKyAgT3RoZXINCisgICogW0tvdGxpbl0gcmVtb3ZlIHJlZHVuZGFudCBwdWJsaWMgbW9kaWZpZXJzIGZvciBjb21waWxlZCBjb2RlICgjOTY0MikNCisgICogW0MjXSBVcGRhdGUgR2V0RXh0ZW5zaW9uIHRvIHN1cHBvcnQgZ2V0dGluZyB0eXBlZCB2YWx1ZSAoIzk2NTUpDQorICAqIEZpeCBpbnZhbGlkIGRlcGVuZGVuY3kgbWFuaWZlc3Qgd2hlbiB1c2luZyBgZGVzY3JpcHRvcl9zZXRfb3V0YCAoIzk2NDcpDQorICAqIEZpeCBDIyBnZW5lcmF0b3IgaGFuZGxpbmcgb2YgYSBmaWVsZCBuYW1lZCAibm9uZSIgaW4gYSBvbmVvZiAoIzk2MzYpDQorICAqIEFkZCBpbml0aWFsIHZlcnNpb24uanNvbiBmaWxlIGZvciAyMS1kZXYgKCM5ODQwKQ0KKyAgKiBSZW1vdmUgZHVwbGljYXRlIGphdmEgZ2VuZXJhdGVkIGNvZGUgKCM5OTA5KQ0KKyAgKiBGaXggdmVyc2lvbmluZyBpc3N1ZXMgaW4gMy4yMC4wDQorDQorICBDb21waWxlcg0KKyAgKiBQcm90b2Mgb3V0cHV0cyB0aGUgbGlzdCBvZiBzdWdnZXN0ZWQgZmllbGQgbnVtYmVycyB3aGVuIGludmFsaWQgZmllbGQNCisgICAgbnVtYmVycyBhcmUgc3BlY2lmaWVkIGluIHRoZSAucHJvdG8gZmlsZS4NCisgICogUmVxdWlyZSBwYWNrYWdlIG5hbWVzIHRvIGJlIGxlc3MgdGhhbiA1MTIgYnl0ZXMgaW4gbGVuZ3RoDQorDQorMjAyMi0wNC0yMSB2ZXJzaW9uIDMuMjAuMSAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorDQorICBQSFANCisgICogRml4IGJ1aWxkaW5nIHBhY2thZ2VkIFBIUCBleHRlbnNpb24gKCM5NzI3KQ0KKw0KKyAgT3RoZXINCisgICogRml4IHZlcnNpb25pbmcgaXNzdWVzIGluIDMuMjAuMA0KKw0KKzIwMjItMDMtMDQgdmVyc2lvbiAzLjIwLjAgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieS9KYXZhU2NyaXB0KQ0KKw0KKyAgUnVieQ0KKyAgKiBEcm9wcGVkIFJ1YnkgMi4zIGFuZCAyLjQgc3VwcG9ydCBmb3IgQ0kgYW5kIHJlbGVhc2VzLiAoIzkzMTEpDQorICAqIEFkZGVkIFJ1YnkgMy4xIHN1cHBvcnQgZm9yIENJIGFuZCByZWxlYXNlcyAoIzk1NjYpLg0KKyAgKiBNZXNzYWdlLmRlY29kZS9lbmNvZGU6IEFkZCByZWN1cnNpb25fbGltaXQgb3B0aW9uICgjOTIxOC8jOTQ4NikNCisgICogQWxsb2NhdGUgd2l0aCB4cmVhbGxvYygpL3hmcmVlKCkgc28gbWVzc2FnZSBhbGxvY2F0aW9uIGlzIHZpc2libGUgdG8gdGhlDQorICAgIFJ1YnkgR0MuICBJbiBjZXJ0YWluIHRlc3RzIHRoaXMgbGVhZHMgdG8gbXVjaCBsb3dlciBtZW1vcnkgdXNhZ2UgZHVlIHRvIG1vcmUNCisgICAgZnJlcXVlbnQgR0MgcnVucyAoIzk1ODYpLg0KKyAgKiBGaXggY29udmVyc2lvbiBvZiBzaW5nbGV0b24gY2xhc3NlcyBpbiBSdWJ5ICgjOTM0MikNCisgICogU3VwcHJlc3Mgd2FybmluZyBmb3IgaW50ZW50aW9uYWwgY2lyY3VsYXIgcmVxdWlyZSAoIzk1NTYpDQorICAqIEpTT04gd2lsbCBub3cgb3V0cHV0IHNob3J0ZXIgc3RyaW5ncyBmb3IgZG91YmxlIGFuZCBmbG9hdCBmaWVsZHMgd2hlbiBwb3NzaWJsZQ0KKyAgICB3aXRob3V0IGxvc2luZyBwcmVjaXNpb24uDQorICAqIEVuY29kaW5nIGFuZCBkZWNvZGluZyBvZiBiaW5hcnkgZm9ybWF0IHdpbGwgbm93IHdvcmsgcHJvcGVybHkgb24gYmlnLWVuZGlhbg0KKyAgICBzeXN0ZW1zLg0KKyAgKiBVVEYtOCB2ZXJpZmljYXRpb24gd2FzIGZpeGVkIHRvIHByb3Blcmx5IHJlamVjdCBzdXJyb2dhdGUgY29kZSBwb2ludHMuDQorICAqIFVua25vd24gZW51bXMgZm9yIHByb3RvMiBwcm90b3Mgbm93IHByb3Blcmx5IGltcGxlbWVudCBwcm90bzIncyBiZWhhdmlvciBvZg0KKyAgICBwdXR0aW5nIHN1Y2ggdmFsdWVzIGluIHVua25vd24gZmllbGRzLg0KKw0KKyAgSmF2YQ0KKyAgKiBSZXZlcnQgIlN0YW5kYXJkaXplIG9uIEFycmF5IGNvcHlPZiIgKCM5NDAwKQ0KKyAgKiBSZXNvbHZlIG1vcmUgamF2YSBmaWVsZCBhY2Nlc3NvciBuYW1lIGNvbmZsaWN0cyAoIzgxOTgpDQorICAqIERvbid0IHN1cHBvcnQgbWFwIGZpZWxkcyBpbiBEeW5hbWljTWVzc2FnZS5CdWlsZGVyLntnZXRGaWVsZEJ1aWxkZXIsZ2V0UmVwZWF0ZWRGaWVsZEJ1aWxkZXJ9DQorICAqIEZpeCBwYXJzZUZyb20gdG8gb25seSB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24NCisgICogSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIG5vdyBhbGxvd3MgYXJiaXRyYXJ5IHdyYXBwZWQgRXhjZXB0aW9uIHR5cGVzLg0KKyAgKiBGaXggYnVnIGluIGBGaWVsZFNldC5CdWlsZGVyLm1lcmdlRnJvbWANCisgICogRmx1c2ggQ29kZWRPdXRwdXRTdHJlYW0gYWxzbyBmbHVzaGVzIHVuZGVybHlpbmcgT3V0cHV0U3RyZWFtDQorICAqIFdoZW4gb25lb2YgY2FzZSBpcyB0aGUgc2FtZSBhbmQgdGhlIGZpZWxkIHR5cGUgaXMgTWVzc2FnZSwgbWVyZ2UgdGhlDQorICAgIHN1YmZpZWxkLiAocHJldmlvdXNseSBpdCB3YXMgcmVwbGFjZWQuKeKAmQ0KKyAgKiBBZGQgQENoZWNrUmV0dXJuVmFsdWUgdG8gc29tZSBwcm90b2J1ZiB0eXBlcw0KKyAgKiBSZXBvcnQgb3JpZ2luYWwgZXhjZXB0aW9ucyB3aGVuIHBhcnNpbmcgSlNPTg0KKyAgKiBBZGQgbW9yZSBpbmZvIHRvIEBkZXByZWNhdGVkIGphdmFkb2MgZm9yIHNldC9nZXQvaGFzIG1ldGhvZHMNCisgICogRml4IGluaXRpYWxpemF0aW9uIGJ1ZyBpbiBkb2MgY29tbWVudCBsaW5lIG51bWJlcnMNCisgICogRml4IGNvbW1lbnRzIGZvciBtZXNzYWdlIHNldCB3aXJlIGZvcm1hdC4NCisNCisgIEtvdGxpbg0KKyAgKiBBZGQgdGVzdCBzY29wZSB0byBrb3RsaW4tdGVzdCBmb3IgcHJvdG9idWYta290bGluLWxpdGUgKCM5NTE4KQ0KKyAgKiBBZGQgb3JOdWxsIGV4dGVuc2lvbnMgZm9yIG9wdGlvbmFsIG1lc3NhZ2UgZmllbGRzLg0KKyAgKiBBZGQgb3JOdWxsIGV4dGVuc2lvbnMgdG8gYWxsIHByb3RvMyBtZXNzYWdlIGZpZWxkcy4NCisNCisgIFB5dGhvbg0KKyAgKiBEcm9wcGVkIHN1cHBvcnQgZm9yIFB5dGhvbiA8IDMuNyAoIzk0ODApDQorICAqIFByb3RvYyBpcyBub3cgYWJsZSB0byBnZW5lcmF0ZSBweXRob24gc3R1YnMgKC5weWkpIHdpdGggLS1weWlfb3V0DQorICAqIFBpbiBtdWx0aWJ1aWxkIHNjcmlwdHMgdG8gZ2V0IG1hbnlsaW51eDEgd2hlZWxzIGJhY2sgKCM5MjE2KQ0KKyAgKiBGaXggdHlwZSBhbm5vdGF0aW9ucyBvZiBzb21lIER1cmF0aW9uIGFuZCBUaW1lc3RhbXAgbWV0aG9kcy4NCisgICogUmVwZWF0ZWQgZmllbGQgY29udGFpbmVycyBhcmUgbm93IGdlbmVyaWMgaW4gZmllbGQgdHlwZXMgYW5kIGNvdWxkIGJlIHVzZWQNCisgICAgaW4gdHlwZSBhbm5vdGF0aW9ucy4NCisgICogUHJvdG9idWYgcHl0aG9uIGdlbmVyYXRlZCBjb2RlcyBhcmUgc2ltcGxpZmllZC4gRGVzY3JpcHRvcnMgYW5kIG1lc3NhZ2UNCisgICAgY2xhc3NlcycgZGVmaW5pdGlvbnMgYXJlIG5vdyBkeW5hbWljIGNyZWF0ZWQgaW4gaW50ZXJuYWwvYnVpbGRlci5weS4NCisgICAgSW5zZXJ0aW9uIFBvaW50cyBmb3IgbWVzc2FnZXMgY2xhc3NlcyBhcmUgZGlzY2FyZGVkLg0KKyAgKiBoYXNfcHJlc2VuY2UgaXMgYWRkZWQgZm9yIEZpZWxkRGVzY3JpcHRvciBpbiBweXRob24NCisgICogTG9vc2VuIGluZGV4aW5nIHR5cGUgcmVxdWlyZW1lbnRzIHRvIGFsbG93IHZhbGlkIF9faW5kZXhfXygpIGltcGxlbWVudGF0aW9ucw0KKyAgICByYXRoZXIgdGhhbiBvbmx5IFB5TG9uZ09iamVjdHMuDQorICAqIEZpeCB0aGUgZGVlcGNvcHkgYnVnIGNhdXNlZCBieSBub3QgY29weWluZyBtZXNzYWdlX2xpc3RlbmVyLg0KKyAgKiBBZGRlZCBweXRob24gSlNPTiBwYXJzZSByZWN1cnNpb24gbGltaXQgKGRlZmF1bHQgMTAwKQ0KKyAgKiBQYXRoIGluZm8gaXMgYWRkZWQgZm9yIHB5dGhvbiBKU09OIHBhcnNlIGVycm9ycw0KKyAgKiBQdXJlIHB5dGhvbiByZXBlYXRlZCBzY2FsYXIgZmllbGRzIHdpbGwgbm90IGFibGUgdG8gcGlja2xlLiBDb252ZXJ0IHRvIGxpc3QNCisgICAgZmlyc3QuDQorICAqIFRpbWVzdGFtcC5Ub0RhdGV0aW1lKCkgbm93IGFjY2VwdHMgYW4gb3B0aW9uYWwgdHppbmZvIHBhcmFtZXRlci4gSWYNCisgICAgc3BlY2lmaWVkLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHRpbWV6b25lLWF3YXJlIGRhdGV0aW1lIGluIHRoZSBnaXZlbiB0aW1lDQorICAgIHpvbmUuIElmIG9taXR0ZWQgb3IgTm9uZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSB0aW1lem9uZS1uYWl2ZSBVVEMgZGF0ZXRpbWUNCisgICAgKGFzIHByZXZpb3VzbHkpLg0KKyAgKiBBZGRzIGNsaWVudF9zdHJlYW1pbmcgYW5kIHNlcnZlcl9zdHJlYW1pbmcgZmllbGRzIHRvIE1ldGhvZERlc2NyaXB0b3IuDQorICAqIEFkZCAiZW5zdXJlX2FzY2lpIiBwYXJhbWV0ZXIgdG8ganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbi4gVGhpcyBhbGxvd3Mgc21hbGxlcg0KKyAgICBKU09OIHNlcmlhbGl6YXRpb25zIHdpdGggVVRGLTggb3Igb3RoZXIgbm9uLUFTQ0lJIGVuY29kaW5ncy4NCisgICogQWRkZWQgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGRpcmVjdGx5IGFzc2lnbmluZyBudW1weSBzY2FsYXJzIGFuZCBhcnJheS4NCisgICogSW1wcm92ZSB0aGUgY2FsY3VsYXRpb24gb2YgcHVibGljX2RlcGVuZGVuY2llcyBpbiBEZXNjcmlwdG9yUG9vbC4NCisgICogW0JyZWFraW5nIENoYW5nZV0gRGlzYWxsb3cgc2V0dGluZyBmaWVsZHMgdG8gbnVtcHkgc2luZ2xldG9uIGFycmF5cyBvciByZXBlYXRlZCBmaWVsZHMgdG8gbnVtcHkNCisgICAgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLiBOdW1weSBhcnJheXMgc2hvdWxkIGJlIGluZGV4ZWQgb3IgZmxhdHRlbmVkIGV4cGxpY2l0bHkgYmVmb3JlIGFzc2lnbm1lbnQuDQorDQorICBDb21waWxlcg0KKyAgKiBNaWdyYXRlIElzRGVmYXVsdChjb25zdCBzdGQ6OnN0cmluZyopIGFuZCBVbnNhZmVTZXREZWZhdWx0KGNvbnN0IHN0ZDo6c3RyaW5nKikNCisgICogSW1wbGVtZW50IHN0cm9uZyBxdWFsaWZpZWQgdGFncyBmb3IgVGFnZ2VkUHRyDQorICAqIFJld29yayBhbGxvY2F0aW9ucyB0byBwb3dlci1vZi10d28gYnl0ZSBzaXplcy4NCisgICogTWlncmF0ZSBJc0RlZmF1bHQoY29uc3Qgc3RkOjpzdHJpbmcqKSBhbmQgVW5zYWZlU2V0RGVmYXVsdChjb25zdCBzdGQ6OnN0cmluZyopDQorICAqIEltcGxlbWVudCBzdHJvbmcgcXVhbGlmaWVkIHRhZ3MgZm9yIFRhZ2dlZFB0cg0KKyAgKiBNYWtlIFRhZ2dlZFB0ciBTZXQuLi4oKSBjYWxscyBleHBsaWNpdGx5IHNwZWxsIG91dCB0aGUgY29udGVudCB0eXBlLg0KKyAgKiBDaGVjayBmb3IgcGFyc2luZyBlcnJvciBiZWZvcmUgdmVyaWZ5aW5nIFVURjguDQorICAqIEVuZm9yY2UgYSBtYXhpbXVtIG1lc3NhZ2UgbmVzdGluZyBsaW1pdCBvZiAzMiBpbiB0aGUgZGVzY3JpcHRvciBidWlsZGVyIHRvDQorICAgIGd1YXJkIGFnYWluc3Qgc3RhY2sgb3ZlcmZsb3dzDQorICAqIEZpeGVkIGJ1Z3MgaW4gb3BlcmF0b3JzIGZvciBSZXBlYXRlZFB0ckl0ZXJhdG9yDQorICAqIEFzc2VydCBhIG1heGltdW0gbWFwIGFsaWdubWVudCBmb3IgYWxsb2NhdGVkIHZhbHVlcw0KKyAgKiBGaXggcHJvdG8xIGdyb3VwIGV4dGVuc2lvbiBwcm90b2RiIHBhcnNpbmcgZXJyb3INCisgICogRG8gbm90IGxvZy9yZXBvcnQgdGhlIHNhbWUgZGVzY3JpcHRvciBzeW1ib2wgbXVsdGlwbGUgdGltZXMgaWYgaXQgY29udGFpbnMNCisgICAgbW9yZSB0aGFuIG9uZSBpbnZhbGlkIGNoYXJhY3Rlci4NCisgICogQWRkIFVua25vd25GaWVsZFNldDo6U2VyaWFsaXplVG9TdHJpbmcgYW5kIFNlcmlhbGl6ZVRvQ29kZWRTdHJlYW0uDQorICAqIFJlbW92ZSBleHBsaWNpdCBkZWZhdWx0IHBvaW50ZXJzIGFuZCBkZXByZWNhdGVkIEFQSSBmcm9tIHByb3RvY29sIGNvbXBpbGVyDQorDQorICBBcmVuYXMNCisgICogQ2hhbmdlIFJlcGVhdGVkKkZpZWxkIHRvIHJldXNlIG1lbW9yeSB3aGVuIHVzaW5nIGFyZW5hcy4NCisgICogSW1wbGVtZW50cyBwYmFyZW5heiBmb3IgcHJvZmlsaW5nIHByb3RvIGFyZW5hcw0KKyAgKiBJbnRyb2R1Y2UgQ3JlYXRlU3RyaW5nKCkgYW5kIENyZWF0ZUFyZW5hU3RyaW5nKCkgZm9yIGNsZWFuZXIgc2VtYW50aWNzDQorICAqIEZpeCB1bnJlZmVyZW5jZWQgcGFyYW1ldGVyIGZvciBNU1ZDIGJ1aWxkcw0KKyAgKiBBZGQgVW5zYWZlU2V0QWxsb2NhdGVkIHRvIGJlIHVzZWQgZm9yIG9uZS1vZiBzdHJpbmcgZmllbGRzLg0KKyAgKiBNYWtlIEFyZW5hOjpBbGxvY2F0ZUFsaWduZWQoKSBhIHB1YmxpYyBmdW5jdGlvbi4NCisgICogRGV0ZXJtaW5lIGlmIEFyZW5hRHRvciByZWxhdGVkIGNvZGUgZ2VuZXJhdGlvbiBpcyBuZWNlc3NhcnkgaW4gb25lIHBsYWNlLg0KKyAgKiBJbXBsZW1lbnQgb24gZGVtYW5kIHJlZ2lzdGVyIEFyZW5hRHRvciBmb3IgSW5saW5lZFN0cmluZ0ZpZWxkDQorDQorICBDKysNCisgICogRW5hYmxlIHRlc3RpbmcgdmlhIENUZXN0ICgjODczNykNCisgICogQWRkIG9wdGlvbiB0byB1c2UgZXh0ZXJuYWwgR1Rlc3QgaW4gQ01ha2UgKCM4NzM2KQ0KKyAgKiBDTWFrZTogU2V0IGNvcnJlY3Qgc29uYW1lcyBmb3IgbGlicHJvdG9idWYtbGl0ZS5zbyBhbmQgbGlicHJvdG9jLnNvICgjODYzNSkgKCM5NTI5KQ0KKyAgKiBBZGQgY21ha2Ugb3B0aW9uIGBwcm90b2J1Zl9JTlNUQUxMYCB0byBub3QgaW5zdGFsbCBmaWxlcyAoIzcxMjMpDQorICAqIENNYWtlOiBBbGxvdyBjdXN0b20gcGx1Z2luIG9wdGlvbnMgZS5nLiB0byBnZW5lcmF0ZSBtb2NrcyAoIzkxMDUpDQorICAqIENNYWtlOiBVc2UgbGlua2VyIHZlcnNpb24gc2NyaXB0cyAoIzk1NDUpDQorICAqIE1hbnVhbGx5ICpzdHJ1Y3QgQ29yZCBmaWVsZHMgdG8gd29yayBiZXR0ZXIgd2l0aCBhcmVuYXMuDQorICAqIE1hbnVhbGx5IGRlc3RydWN0IG1hcCBmaWVsZHMuDQorICAqIEdlbmVyYXRlIG5hcnJvd2VyIGNvZGUNCisgICogRml4IGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvaXNzdWVzLzkzNzggYnkgcmVtb3ZpbmcNCisgICAgc2hhZG93ZWQgX2NhY2hlZF9zaXplXyBmaWVsZA0KKyAgKiBSZW1vdmUgR2V0UG9pbnRlcigpIGFuZCBleHBsaWNpdCBudWxscHRyIGRlZmF1bHRzLg0KKyAgKiBBZGQgcHJvdG9faCBmbGFnIGZvciBzcGVlZGluZyB1cCBsYXJnZSBidWlsZHMNCisgICogQWRkIG1pc3Npbmcgb3ZlcmxvYWQgZm9yIHJlZmVyZW5jZSB3cmFwcGVkIGZpZWxkcy4NCisgICogQWRkIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEFsbEZpbGVOYW1lcygpDQorICAqIFJlcGVhdGVkRmllbGQgbm93IGRlZmluZXMgYW4gaXRlcmF0b3IgdHlwZSBpbnN0ZWFkIG9mIHVzaW5nIGEgcG9pbnRlci4NCisgICogUmVtb3ZlIG9ic29sZXRlIG1hY3JvcyBHT09HTEVfUFJPVE9CVUZfSEFTX09ORU9GIGFuZCBHT09HTEVfUFJPVE9CVUZfSEFTX0FSRU5BUy4NCisNCisgIFBIUA0KKyAgKiBGaXg6IGFkZCBtaXNzaW5nIHJlc2VydmVkIGNsYXNzbmFtZXMgKCM5NDU4KQ0KKyAgKiBQSFAgOC4xIGNvbXBhdGliaWxpdHkgKCM5MzcwKQ0KKw0KKyAgQyMNCisgICogRml4IHRyaW0gd2FybmluZ3MgKCM5MTgyKQ0KKyAgKiBGaXhlcyBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uIHdoZW4gYWNjZXNzaW5nIEZpZWxkRGVzY3JpcHRvci5Jc1BhY2tlZCAoIzk0MzApDQorICAqIEFkZCBUb1Byb3RvKCkgbWV0aG9kIHRvIGFsbCBkZXNjcmlwdG9yIGNsYXNzZXMgKCM5NDI2KQ0KKyAgKiBBZGQgYW4gb3B0aW9uIHRvIHByZXNlcnZlIHByb3RvIG5hbWVzIGluIEpzb25Gb3JtYXR0ZXIgKCM2MzA3KQ0KKw0KKyAgT2JqZWN0aXZlLUMNCisgICogQWRkIHByZWZpeF90b19wcm90b19wYWNrYWdlX21hcHBpbmdzX3BhdGggb3B0aW9uLiAoIzk0OTgpDQorICAqIFJlbmFtZSBgcHJvdG9fcGFja2FnZV90b19wcmVmaXhfbWFwcGluZ3NfcGF0aGAgdG8gYHBhY2thZ2VfdG9fcHJlZml4X21hcHBpbmdzX3BhdGhgLiAoIzk1NTIpDQorICAqIEFkZCBhIGdlbmVyYXRpb24gb3B0aW9uIHRvIGNvbnRyb2wgdXNlIG9mIGZvcndhcmQgZGVjbGFyYXRpb25zIGluIGhlYWRlcnMuICgjOTU2OCkNCisNCisyMDIyLTAxLTI4IHZlcnNpb24gMy4xOS40IChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIFB5dGhvbg0KKyAgKiBNYWtlIGxpYnByb3RvYnVmIHN5bWJvbHMgbG9jYWwgb24gT1NYIHRvIGZpeCBpc3N1ZSAjOTM5NSAoIzk0MzUpDQorDQorICBSdWJ5DQorICAqIEZpeGVkIGEgZGF0YSBsb3NzIGJ1ZyB0aGF0IGNvdWxkIG9jY3VyIHdoZW4gdGhlIG51bWJlciBvZiBgb3B0aW9uYWxgDQorICAgIGZpZWxkcyBpbiBhIG1lc3NhZ2UgaXMgYW4gZXhhY3QgbXVsdGlwbGUgb2YgMzIuICgjOTQ0MCkuDQorDQorICBQSFANCisgICogRml4ZWQgYSBkYXRhIGxvc3MgYnVnIHRoYXQgY291bGQgb2NjdXIgd2hlbiB0aGUgbnVtYmVyIG9mIGBvcHRpb25hbGANCisgICAgZmllbGRzIGluIGEgbWVzc2FnZSBpcyBhbiBleGFjdCBtdWx0aXBsZSBvZiAzMi4gKCM5NDQwKS4NCisNCisyMDIyLTAxLTEwIHZlcnNpb24gMy4xOS4zIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIFB5dGhvbg0KKyAgKiBGaXggbWlzc2luZyBXaW5kb3dzIHdoZWVsIGZvciBQeXRob24gMy4xMCBvbiBQeVBJDQorDQorMjAyMi0wMS0wNSB2ZXJzaW9uIDMuMTkuMiAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorDQorICBKYXZhDQorICAqIEltcHJvdmUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIFVua25vd25GaWVsZFNldCBwYXJzaW5nICgjOTM3MSkNCisgICogVGhpcyByZWxlYXNlIGFkZHJlc3NlcyBhIFNlY3VyaXR5IEFkdmlzb3J5IGZvciBKYXZhIHVzZXJzDQorICAgKGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvc2VjdXJpdHkvYWR2aXNvcmllcy9HSFNBLXdydnctaGcyMi00bTY3KQ0KKw0KKzIwMjItMDEtMDUgdmVyc2lvbiAzLjE4LjIgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieS9KYXZhU2NyaXB0KQ0KKw0KKyAgSmF2YQ0KKyAgKiBJbXByb3ZlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiBVbmtub3duRmllbGRTZXQgcGFyc2luZyAoIzkzNzEpDQorICAqIFRoaXMgcmVsZWFzZSBhZGRyZXNzZXMgYSBTZWN1cml0eSBBZHZpc29yeSBmb3IgSmF2YSB1c2Vycw0KKyAgIChodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL3NlY3VyaXR5L2Fkdmlzb3JpZXMvR0hTQS13cnZ3LWhnMjItNG02NykNCisNCisyMDIyLTAxLTA1IHZlcnNpb24gMy4xNi4xIChKYXZhKQ0KKw0KKyAgSmF2YQ0KKyAgKiBJbXByb3ZlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiBVbmtub3duRmllbGRTZXQgcGFyc2luZyAoIzkzNzEpDQorICAqIFRoaXMgcmVsZWFzZSBhZGRyZXNzZXMgYSBTZWN1cml0eSBBZHZpc29yeSBmb3IgSmF2YSB1c2Vycw0KKyAgIChodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL3NlY3VyaXR5L2Fkdmlzb3JpZXMvR0hTQS13cnZ3LWhnMjItNG02NykNCisNCisyMDIxLTEwLTI4IHZlcnNpb24gMy4xOS4xIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIEJhemVsDQorICAqIEVuc3VyZSB0aGF0IHJlbGVhc2UgYXJjaGl2ZXMgY29udGFpbiBldmVyeXRoaW5nIG5lZWRlZCBmb3IgQmF6ZWwgKCM5MTMxKQ0KKyAgKiBBbGlnbiBkZXBlbmRlbmN5IGhhbmRsaW5nIHdpdGggQmF6ZWwgYmVzdCBwcmFjdGljZXMgKCM5MTY1KQ0KKw0KKyAgSmF2YVNjcmlwdA0KKyAgKiBGaXggYFJlZmVyZW5jZUVycm9yOiB3aW5kb3cgaXMgbm90IGRlZmluZWRgIHdoZW4gZ2V0dGluZyB0aGUgZ2xvYmFsIG9iamVjdCAoIzkxNTYpDQorDQorICBSdWJ5DQorICAqIEZpeCBtZW1vcnkgbGVhayBpbiBNZXNzYWdlQ2xhc3MuZW5jb2RlICgjOTE1MCkNCisNCisyMDIxLTEwLTE1IHZlcnNpb24gMy4xOS4wIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIEMrKw0KKyAgKiBNYWtlIHByb3RvMjo6TWVzc2FnZTo6RGlzY2FyZFVua25vd25GaWVsZHMoKSBub24tdmlydHVhbA0KKyAgKiBTZXBhcmF0ZSBSZXBlYXRlZFB0ckZpZWxkIGludG8gaXRzIG93biBoZWFkZXIgZmlsZQ0KKyAgKiBGb3IgZGVmYXVsdCBmbG9hdGluZyBwb2ludCB2YWx1ZXMgb2YgMCwgY29uc2lkZXIgYWxsIGJpdHMgc2lnbmlmaWNhbnQNCisgICogY21ha2U6IHN1cHBvcnQgYE1TVkNfUlVOVElNRV9MSUJSQVJZYCBwcm9wZXJ0eSAoIzg4NTEpDQorICAqIEZpeCBzaGFkb3dpbmcgd2FybmluZ3MgKCM4OTI2KQ0KKyAgKiBGaXggZm9yIGlzc3VlICM4NDg0LCBjb25zdGFudCBpbml0aWFsaXphdGlvbiBkb2Vzbid0IGNvbXBpbGUgaW4gbXN2YyBjbGFuZy1jbCBlbnZpcm9ubWVudCAoIzg5OTMpDQorICAqIEZpeCBidWlsZCBvbiBBSVggYW5kIFN1bk9TICgjODM3MykgKCM5MDY1KQ0KKyAgKiBBZGQgQW5kcm9pZCBzdGxwb3J0IGFuZCBkZWZhdWx0IHRvb2xjaGFpbnMgdG8gQlVJTEQuICgjODI5MCkNCisNCisgIEphdmENCisgICogRm9yIGRlZmF1bHQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIG9mIDAsIGNvbnNpZGVyIGFsbCBiaXRzIHNpZ25pZmljYW50DQorICAqIEFubm90YXRlIGAvL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi91dGlsLy4uLmAgd2l0aCBudWxsbmVzcyBhbm5vdGF0aW9ucw0KKyAgKiBVc2UgQXJyYXlMaXN0IGNvcHkgY29uc3RydWN0b3IgKCM3ODUzKQ0KKw0KKyAgS290bGluDQorICAqIFN3aXRjaCBLb3RsaW4gcHJvdG8gRFNMcyB0byBiZSBpbXBsZW1lbnRlZCB3aXRoIGlubGluZSB2YWx1ZSBjbGFzc2VzDQorICAqIEZpeCBpbmxpbmluZyBhbmQgZGVwcmVjYXRpb24gZm9yIHJlcGVhdGVkIHN0cmluZyBmaWVsZHMgaW4ga290bGluICgjOTEyMCkNCisNCisgIFB5dGhvbg0KKyAgKiBQcm90bzIgRGVjb2RlRXJyb3Igbm93IGluY2x1ZGVzIG1lc3NhZ2UgbmFtZSBpbiBlcnJvciBtZXNzYWdlDQorICAqIE1ha2UgTWVzc2FnZVRvRGljdCBjb252ZXJ0IG1hcCBrZXlzIHRvIHN0cmluZ3MgKCM4MTIyKQ0KKyAgKiBBZGQgcHl0aG9uLXJlcXVpcmVzIGluIHNldHVwLnB5ICgjODk4OSkNCisgICogQWRkIHB5dGhvbiAzLjEwICgjOTAzNCkNCisNCisgIEphdmFTY3JpcHQNCisgICogU2tpcCBleHBvcnRzIGlmIG5vdCBhdmFpbGFibGUgYnkgQ29tbW9uSlMgKCM4ODU2KQ0KKyAgKiBKUzogQ29tcGx5IHdpdGggQ1NQIG5vLXVuc2FmZS1ldmFsLiAoIzg4NjQpDQorDQorICBQSFANCisgICogQWRkZWQgIm9iamVjdCIgYXMgYSByZXNlcnZlZCBuYW1lIGZvciBQSFAgKCM4OTYyKQ0KKw0KKyAgUnVieQ0KKyAgKiBPdmVycmlkZSBNYXAuY2xvbmUgdG8gdXNlIE1hcCdzIGR1cCBtZXRob2QgKCM3OTM4KQ0KKyAgKiBSdWJ5OiBidWlsZCBleHRlbnNpb25zIGZvciBhcm02NC1kYXJ3aW4gKCM4MjMyKQ0KKyAgKiBBZGQgY2xhc3MgbWV0aG9kIFRpbWVzdGFtcC5mcm9tX3RpbWUgdG8gcnVieSB3ZWxsIGtub3duIHR5cGVzICgjODU2MikNCisgICogQWRvcHQgcHVyZSBydWJ5IERTTCBpbXBsZW1lbnRhdGlvbiBmb3IgSlJ1YnkgKCM5MDQ3KQ0KKyAgKiBBZGQgc2l6ZSB0byBNYXAgY2xhc3MgKCM4MDY4KQ0KKyAgKiBGaXggZm9yIGRlc2NyaXB0b3JfcGIucmI6IGdvb2dsZS9wcm90b2J1ZiBzaG91bGQgYmUgcmVxdWlyZWQgZmlyc3QgKCM5MTIxKQ0KKw0KKyAgQyMNCisgICogQ29ycmVjdGx5IHNldCBFeHRlbnNpb25SZWdpc3RyeSB3aGVuIHBhcnNpbmcgd2l0aCBNZXNzYWdlUGFyc2VyLCBidXQgdXNpbmcgYW4gYWxyZWFkeSBleGlzdGluZyBDb2RlZElucHV0U3RyZWFtICgjNzI0NikNCisgICogW0MjXSBNYWtlIEZpZWxkRGVzY3JpcHRvciBwcm9wZXJ0eU5hbWUgcHVibGljICgjNzY0MikNCisNCisyMDIxLTEwLTA0IHZlcnNpb24gMy4xOC4xIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIFB5dGhvbg0KKyAgKiBVcGRhdGUgc2V0dXAucHkgdG8gcmVmbGVjdCB0aGF0IHdlIG5vdyByZXF1aXJlIGF0IGxlYXN0IFB5dGhvbiAzLjUgKCM4OTg5KQ0KKyAgKiBQZXJmb3JtYW5jZSBmaXggZm9yIER5bmFtaWNNZXNzYWdlOiBmb3JjZSBHZXRSYXcoKSB0byBiZSBpbmxpbmVkICgjOTAyMykNCisNCisgIFJ1YnkNCisgICogVXBkYXRlIHJ1YnlfZ2VuZXJhdG9yLmNjIHRvIGFsbG93IHByb3RvMiBpbXBvcnRzIGluIHByb3RvMyAoIzkwMDMpDQorDQorMjAyMS0wOS0xMyB2ZXJzaW9uIDMuMTguMCAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorDQorICBQeXRob24NCisgICogUmVtb3ZlZCBQeXRob24gMi54IHN1cHBvcnQuDQorICAqIFB1cmUgcHl0aG9uIGRlc2NyaXB0b3JfcG9vbC5BZGRTZXJpYWxpemVkRmlsZSgpIHdpbGwgYWx3YXlzIGJ1aWxkIHRoZQ0KKyAgICBmaWxlIGFuZCByZXR1cm4gRmlsZURlc2NyaXB0b3Igd2hpY2ggaXMgc2FtZSB3aXRoIHB5dGhvbiBjKysgZXh0ZW5zaW9uDQorICAqIHR5cGUgZXJyb3JzIHRocm93biBieSBNZXJnZUZyb20gbm93IHJlcG9ydCBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZXMNCisgICogUHJvdG9idWYgcHl0aG9uIGdlbmVyYXRlZCBjb2RlIGFyZSBzaW1wbGlmaWVkLiBTb21lIHBsYXRmb3JtcyB0aGF0IHVzZXMNCisgICAgImlzIigiaXMgbm90IikgdG8gY29tcGFyZSB0aGUgZW51bSBvciBkZXNjcmlwdG9yJ3MgbGFiZWwvdHlwZSBtYXkgZmFpbCwNCisgICAgc2hvdWxkIHVzZSAiPT0iKCIhPSIpIGluc3RlYWQuDQorDQorICBDKysNCisgICogR2VuZXJhdGVkIGNvZGUgbm93IHVzZXMgdGhlIGMrKzExIHN0YW5kYXJkIGludGVnZXIgdHlwZXMgaW50ezMyLDY0fV90IGFuZA0KKyAgICB1aW50ezMyLDY0fV90DQorICAqIFJlZHVjZSBtZW1vcnkgdXNhZ2Ugb2YgdGhlIERlc2NyaXB0b3JQb29sIHR5cGUuDQorICAqIE1vdmVkIHRoZSB6ZXJvLWFyZ3VtZW50IE5ldygpIG1ldGhvZCBvbiBtZXNzYWdlcyB0byB0aGUgYmFzZSBjbGFzcyAoaW50ZXJuYWwNCisgICAgb3B0aW1pemF0aW9uKS4NCisgICogVW51c2VkIHJldHVybiB2YWx1ZXMgbWFya2VkIHdpdGggYFBST1RPQlVGX01VU1RfVVNFX1JFU1VMVGAgYXJlIG5vdw0KKyAgICBjb3JyZWN0bHkgYXR0cmlidXRlZC4NCisgICogRGVtb3RlcyBQcmludFBhdGggbG9nIGZvciBtYXBzIGluIE1lc3NhZ2VEaWZmZXJlbmNlciBkb3duIGZyb20gV0FSTklORyB0bw0KKyAgICBJTkZPLg0KKyAgKiBNYWtlIHN1cmUgRnVsbE1lc3NhZ2VOYW1lKCkgaXMgYWx3YXlzIHByaXZhdGUuDQorICAqIEZpeCByYWNlIGNvbmRpdGlvbiBpbiBFbnVtRGVzY3JpcHRvci4NCisgICogUmVtb3ZlIE1lc3NhZ2VMaXRlOjpHZXRNYXliZUFyZW5hUG9pbnRlci4NCisNCisgIEphdmENCisgICogQWRkIEBkZXByZWNhdGVkIGphdmFkb2MgZm9yIHNldC9nZXQvaGFzIG1ldGhvZHMNCisgICogY29ycmVjdGx5IGRlY29kZSBcPyBlc2NhcGUgc2VxdWVuY2UgaW4gdGV4dCBwcm90b3MNCisgICogQXZvaWQgZGVwZW5kaW5nIG9uIE9iamVjdHMucmVxdWlyZU5vbk51bGwoKSB1bnRpbCB3ZSBjYW4gdmVyaWZ5IHRoYXQgbm8NCisgICAgdXNlcnMgYXJlIGRlcGVuZGluZyBvbiBvbGRlciBBbmRyb2lkIHZlcnNpb25zLg0KKyAgKiBkaXNhbGxvdyBudWxsIHN0cmluZyBtYXAgdmFsdWVzIGluIHB1dCBhbmQgcHV0QWxsDQorICAqIEFkZCBgQENoZWNrUmV0dXJuVmFsdWVgIHRvIGBCeXRlU3RyaW5nYCBBUEkuDQorICAqIE1ha2UgdGhlIGBoYXNQcmVzZW5jZWAgbWV0aG9kIHB1YmxpYyBpbiBgRmllbGREZXNjcmlwdG9yYC4NCisgICogUmVwb3J0IG1vcmUgZGV0YWlsZWQgbWVzc2FnZXMgaW4gRHVyYXRpb24gYW5kIFRpbWVzdGFtcCBwcm90byBwYXJzaW5nDQorICAgIGVycm9ycy4NCisgICogTmV3IFRpbWVzdGFtcHMuZnJvbURhdGUgdXRpbGl0eSBtZXRob2QgdGhhdCBjb252ZXJ0cyBhIGphdmEudXRpbC5EYXRlIHRvIGENCisgICAgVGltZXN0YW1wIHByb3RvIG9iamVjdC4NCisNCisgIEtvdGxpbg0KKyAgKiBHZW5lcmF0ZWQgS290bGluIGNvZGUgaXMgRXhwbGljaXQgQVBJIG1vZGUgY29tcGF0aWJsZQ0KKw0KKzIwMjEtMDktMTMgdmVyc2lvbiAzLjE4LjAgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieS9KYXZhU2NyaXB0KQ0KKyAgQysrDQorICAqIEZpeCB3YXJuaW5ncyByYWlzZWQgYnkgY2xhbmcgMTEgKCM4NjY0KQ0KKyAgKiBNYWtlIFN0cmluZ1BpZWNlIGNvbnN0cnVjdGlibGUgZnJvbSBzdGQ6OnN0cmluZ192aWV3ICgjODcwNykNCisgICogQWRkIG1pc3NpbmcgY2FwYWJpbGl0eSBhdHRyaWJ1dGVzIGZvciBMTFZNIDEyICgjODcxNCkNCisgICogU3RvcCB1c2luZyBzdGQ6Oml0ZXJhdG9yIChkZXByZWNhdGVkIGluIEMrKzE3KS4gKCM4NzQxKQ0KKyAgKiBNb3ZlIGZpZWxkX2FjY2Vzc19saXN0ZW5lciBmcm9tIGxpYnByb3RvYnVmLWxpdGUgdG8gbGlicHJvdG9idWYgKCM4Nzc1KQ0KKyAgKiBGaXggIzcwNDcgU2FmZWx5IGhhbmRsZSBzZXRsb2NhbGUgKCM4NzM1KQ0KKyAgKiBSZW1vdmUgZGVwcmVjYXRlZCB2ZXJzaW9uIG9mIFNldFRvdGFsQnl0ZXNMaW1pdCgpICgjODc5NCkNCisgICogU3VwcG9ydCBhcmVuYSBhbGxvY2F0aW9uIG9mIGdvb2dsZTo6cHJvdG9idWY6OkFueU1ldGFkYXRhICgjODc1OCkNCisgICogRml4IHVuZGVmaW5lZCBzeW1ib2wgZXJyb3IgYXJvdW5kIFNoYXJlZEN0b3IoKSAoIzg4MjcpDQorICAqIEZpeCBkZWZhdWx0IHZhbHVlIG9mIGVudW0oaW50KSBpbiBqc29uX3V0aWwgd2l0aCBwcm90bzIgKCM4ODM1KQ0KKyAgKiBCZXR0ZXIgU21hbGxlciBCeXRlU2l6ZUxvbmcNCisgICogSW50cm9kdWNlIGV2ZW50IGZpbHRlcnMgZm9yIGluamVjdF9maWVsZF9saXN0ZW5lcl9ldmVudHMNCisgICogUmVkdWNlIG1lbW9yeSB1c2FnZSBvZiBEZXNjcmlwdG9yUG9vbA0KKyAgKiBGb3IgbGF6eSBmaWVsZHMgY29weSBzZXJpYWxpemVkIGZvcm0gd2hlbiBhbGxvd2VkLg0KKyAgKiBSZS1pbnRyb2R1Y2UgdGhlIElubGluZWRTdHJpbmdGaWVsZCBjbGFzcw0KKyAgKiB2MiBhY2Nlc3MgbGlzdGVuZXINCisgICogUmVkdWNlIHBhZGRpbmcgaW4gdGhlIHByb3RvJ3MgRXh0ZW5zaW9uUmVnaXN0cnkgbWFwLg0KKyAgKiBHZXRFeHRlbnNpb24gcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucw0KKyAgKiBNYWtlIHRyYWNrZXIgYSBzdGF0aWMgdmFyaWFibGUgcmF0aGVyIHRoYW4gY2FsbCBzdGF0aWMgZnVuY3Rpb25zDQorICAqIFN1cHBvcnQgZXh0ZW5zaW9ucyBpbiBmaWVsZCBhY2Nlc3MgbGlzdGVuZXINCisgICogQW5ub3RhdGUgTWVyZ2VGcm9tIGZvciBmaWVsZCBhY2Nlc3MgbGlzdGVuZXINCisgICogRml4IGluY29tcGxldGUgdHlwZXMgZm9yIGZpZWxkIGFjY2VzcyBsaXN0ZW5lcg0KKyAgKiBBZGQgbWFwX2VudHJ5L25ld19tYXBfZW50cnkgdG8gU3BlY2lmaWNGaWVsZCBpbiBNZXNzYWdlRGlmZmVyZW5jZXIuIFRoZXkNCisgICAgcmVjb3JkIHRoZSBtYXAgaXRlbXMgd2hpY2ggYXJlIGRpZmZlcmVudCBpbiBNZXNzYWdlRGlmZmVyZW5jZXIncyByZXBvcnRlci4NCisgICogUmVkdWNlIGJpbmFyeSBzaXplIGR1ZSB0byBmaWVsZGxlc3MgcHJvdG8gbWVzc2FnZXMNCisgICogVGV4dEZvcm1hdDogUGFyc2VJbmZvVHJlZSBzdXBwb3J0cyBnZXR0aW5nIGZpZWxkIGVuZCBsb2NhdGlvbiBpbiBhZGRpdGlvbiB0bw0KKyAgICBzdGFydC4NCisgICogRml4IHJlcGVhdGVkIGVudW0gZXh0ZW5zaW9uIHNpemUgaW4gZmllbGQgbGlzdGVuZXINCisgICogRW5hYmxlIEFueSBUZXh0IEV4cGFuc2lvbiBmb3IgRGVzY3JpcHRvcnM6OkRlYnVnU3RyaW5nKCkNCisgICogU3dpdGNoIGZyb20gaW50ezgsMTYsMzIsNjR9IHRvIGludHs4LDE2LDMyLDY0fV90DQorICAqIFJlZHVjZSBtZW1vcnkgdXNhZ2Ugb2YgdGhlIERlc2NyaXB0b3JQb29sIHR5cGUuDQorDQorICBKYXZhDQorICAqIEZpeCBlcnJvcnByb25lIGNvbmZsaWN0ICgjODcyMykNCisgICogUmVtb3ZpbmcgZGVwcmVjYXRlZCBUaW1lVXRpbCBjbGFzcy4gKCM4NzQ5KQ0KKyAgKiBPcHRpbWl6ZWQgRmllbGREZXNjcmlwdG9yLnZhbHVlT2YoKSB0byBhdm9pZCBhcnJheSBjb3B5aW5nLg0KKyAgKiBSZW1vdmluZyBkZXByZWNhdGVkIFRpbWVVdGlsIGNsYXNzLg0KKyAgKiBBZGQgRHVyYXRpb25zLnBhcnNlVW5jaGVja2VkKFN0cmluZykgYW5kIFRpbWVzdGFtcHMucGFyc2VVbmNoZWNrZWQoU3RyaW5nKQ0KKyAgKiBGaWVsZE1hc2tVdGlsOiBBZGQgY29udmVuaWVuY2UgbWV0aG9kIHRvIG1hc2sgdGhlIGZpZWxkcyBvdXQgb2YgYSBnaXZlbiBwcm90by4NCisNCisgIEphdmFTY3JpcHQNCisgICogT3B0aW1pemUgYmluYXJ5IHBhcnNpbmcgb2YgcmVwZWF0ZWQgZmxvYXQ2NA0KKyAgKiBGaXggZm9yIG9wdGltaXphdGlvbiB3aGVuIHJlYWRpbmcgZG91YmxlcyBmcm9tIGJpbmFyeSB3aXJlIGZvcm1hdA0KKyAgKiBSZXBsYWNlIHRvQXJyYXkgaW1wbGVtZW50YXRpb24gd2l0aCB0b0pTT04uDQorDQorICBQeXRob24NCisgICogRHJvcHMgc3VwcG9ydCBmb3IgMi43IGFuZCAzLjUuDQorDQorICBQSFANCisgICogTWlncmF0ZSBQSFAgJiBSdWJ5IHRvIEFCU0wgd3loYXNoICgjODg1NCkNCisgICogQWRkZWQgc3VwcG9ydCBmb3IgUEhQIDguMSAoY3VycmVudGx5IGluIFJDMSkgdG8gdGhlIEMgZXh0ZW5zaW9uICgjODk2NCkNCisgICogRml4ZWQgUEhQIFNFR1Ygd2hlbiBjb25zdHJ1Y3RpbmcgbWVzc2FnZXMgZnJvbSBhIGRlc3RydWN0b3IuICgjODk2OSkNCisNCisgIFJ1YnkNCisgICogTW92ZSBEU0wgaW1wbGVtZW50YXRpb24gZnJvbSBDIHRvIHB1cmUgUnVieSAoIzg4NTApDQorICAqIEZpeGVkIGEgbWVtb3J5IGJ1ZyB3aXRoIFJlcGVhdGVkRmllbGQjKy4gKCM4OTcwKQ0KKw0KKyAgT3RoZXINCisgICogW2NzaGFycF0gQnl0ZVN0cmluZy5DcmVhdGVDb2RlZElucHV0IHNob3VsZCB1c2UgQXJyYXlTZWdtZW50IG9mZnNldCBhbmQgY291bnQgKCM4NzQwKQ0KKyAgKiBbT2JqQ10gQWRkIHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBwcm90byBwYWNrYWdlIHRvIHByZWZpeCBzeW1ib2xzLiAoIzg3NjApDQorICAqIGZpZWxkX3ByZXNlbmNlLm1kOiBmaXggR28gZXhhbXBsZSAoIzg3ODgpDQorDQorDQorICBLb3RsaW4NCisgICogU3VwcHJlc3MgTk9USElOR19UT19JTkxJTkUgaW4gS290bGluIGdlbmVyYXRlZCBpbmxpbmUgZnVuY3Rpb25zLg0KKw0KKzIwMjEtMDYtMDQgdmVyc2lvbiAzLjE3LjMgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieS9KYXZhU2NyaXB0KQ0KKyAgUHl0aG9uDQorICAqIE5vdGU6IFRoaXMgaXMgdGhlIGxhc3QgcmVsZWFzZSB0byBzdXBwb3J0IFB5dGhvbiAyLjcuIEZ1dHVyZSByZWxlYXNlcyB3aWxsDQorICAgIHJlcXVpcmUgUHl0aG9uID49IDMuNS4NCisNCisgIEMrKw0KKyAgKiBJbnRyb2R1Y2UgRmllbGRBY2Nlc3NMaXN0ZW5lci4NCisgICogU3RvcCBlbWl0dGluZyBib2lsZXJwbGF0ZSB7Q29weS9NZXJnZX1Gcm9tIGluIGVhY2ggUHJvdG9CdWYgY2xhc3MNCisgICogRml4ZWQgc29tZSB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHdhcm5pbmdzIGluIGdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uY2MuDQorDQorICBLb3RsaW4NCisgICogRml4IGR1cGxpY2F0ZSBwcm90byBmaWxlcyBlcnJvciAoIzg2OTkpDQorDQorICBKYXZhDQorICAqIEZpeGVkIHBhcnNlciB0byBjaGVjayB0aGF0IHdlIGFyZSBhdCBhIHByb3BlciBsaW1pdCB3aGVuIGEgc3ViLW1lc3NhZ2UgaGFzDQorICAgIGZpbmlzaGVkIHBhcnNpbmcuDQorDQorMjAyMS0wNS0yNSB2ZXJzaW9uIDMuMTcuMiAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorICBLb3RsaW4NCisgICogRml4IGR1cGxpY2F0ZSBjbGFzcyBlcnJvciAoIzg2NTMpDQorDQorICBQSFANCisgICogRml4ZWQgU0VHViBpbiBzdWItbWVzc2FnZSBnZXR0ZXJzIGZvciB3ZWxsLWtub3duIHR5cGVzIHdoZW4gbWVzc2FnZSBpcyB1bnNldA0KKyAgICAoIzg2NzApDQorDQorMjAyMS0wNS0wNyB2ZXJzaW9uIDMuMTcuMSAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorICBQSFANCisgICogRml4ZWQgUEhQIG1lbW9yeSBsZWFrcyBhbmQgYXJnaW5mbyBlcnJvcnMuICgjODYxNCkNCisgICogRml4ZWQgSlNPTiBwYXJzZXIgdG8gYWxsb3cgbXVsdGlwbGUgdmFsdWVzIGZyb20gdGhlIHNhbWUgb25lb2YgYXMgbG9uZyBhcw0KKyAgICBhbGwgYnV0IG9uZSBhcmUgbnVsbC4NCisNCisgIFJ1YnkNCisgICogRml4ZWQgbWVtb3J5IGJ1ZzogcHJvcGVybHkgcm9vdCByZXBlYXRlZC9tYXAgZmllbGQgd2hlbiBhc3NpZ25pbmcuICgjODYzOSkNCisgICogRml4ZWQgSlNPTiBwYXJzZXIgdG8gYWxsb3cgbXVsdGlwbGUgdmFsdWVzIGZyb20gdGhlIHNhbWUgb25lb2YgYXMgbG9uZyBhcw0KKyAgICBhbGwgYnV0IG9uZSBhcmUgbnVsbC4NCisNCisNCisyMDIxLTA1LTA3IHZlcnNpb24gMy4xNy4wIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIFByb3RvY29sIENvbXBpbGVyDQorICAqIEZpeCB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgcmVzZXJ2ZWQgdmFsdWVzIGluIEVudW1zLg0KKw0KKyAgQysrDQorICAqIEZpeCAtV3VudXNlZC1wYXJhbWV0ZXIgaW4gbWFwPHN0cmluZywgaW50PiBmaWVsZHMgKGZpeGVzICM4NDk0KSAoIzg1MDApDQorICAqIFVzZSBieXRlc3dhcC5oIHdoZW4gYnVpbGRpbmcgYWdhaW5zdCBtdXNsIGxpYmMgKCM4NTAzKQ0KKyAgKiBGaXggLVd1bmRlZmluZWQtaW5saW5lIGVycm9yIHdoZW4gdXNpbmcgU2hhcmVkQ3RvcigpIG9yIFNoYXJlZER0b3IoKSAoIzg1MzIpDQorICAqIEZpeCBidWcgd2hlcmUgYERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKClgIHByaW50ZWQgcHJvdG8zIHN5bnRoZXRpYyBvbmVvZnMuDQorICAqIFByb3ZpZGUgc3RhYmxlIHZlcnNpb25zIG9mIGBTb3J0QW5kVW5pcXVlKClgLg0KKyAgKiBNYWtlIHN1cmUgdG8gY2FjaGUgcHJvdG8zIG9wdGlvbmFsIG1lc3NhZ2UgZmllbGRzIHdoZW4gdGhleSBhcmUgY2xlYXJlZC4NCisgICogRXhwb3NlIFVuc2FmZUFyZW5hIG1ldGhvZHMgdG8gUmVmbGVjdGlvbi4NCisgICogVXNlIHN0ZDo6c3RyaW5nOjplbXB0eSgpIHJhdGhlciB0aGFuIHN0ZDo6c3RyaW5nOjpzaXplKCkgPiAwLg0KKw0KKyAgS290bGluDQorICAqIFJlc3RyaWN0IGV4dGVuc2lvbiBzZXR0ZXIgYW5kIGdldHRlciBvcGVyYXRvcnMgdG8gbm9uLW51bGxhYmxlIFQuDQorDQorICBKYXZhDQorICAqIHVwZGF0aW5nIEdTT04gYW5kIEd1YXZhIHRvIG1vcmUgcmVjZW50IHZlcnNpb25zICgjODUyNCkNCisgICogUmVkdWNlIHRoZSB0aW1lIHNwZW50IGV2YWx1YXRpbmcgaXNFeHRlbnNpb25OdW1iZXIgYnkgc3RvcmluZyB0aGUgZXh0ZW5zaW9uDQorICAgIHJhbmdlcyBpbiBhIFRyZWVNYXAgZm9yIGZhc3RlciBxdWVyaWVzLiBUaGlzIGlzIHBhcnRpY3VsYXJseSByZWxldmFudCBmb3INCisgICAgcHJvdG9zIHdoaWNoIGRlZmluZSBhIGxhcmdlIG51bWJlciBvZiBleHRlbnNpb24gcmFuZ2VzLCBmb3IgZXhhbXBsZSB3aGVuDQorICAgIGVhY2ggdGFnIGlzIGRlZmluZWQgYXMgYW4gZXh0ZW5zaW9uLg0KKyAgKiBGaXggamF2YSBieXRlY29kZSBlc3RpbWF0aW9uIGxvZ2ljIGZvciBvcHRpb25hbCBmaWVsZHMuDQorICAqIE9wdGltaXplIERlc2NyaXB0b3IuaXNFeHRlbnNpb25OdW1iZXIuDQorDQorICBQeXRob24NCisgICogQWRkIE1ldGhvZERlc2NyaXB0b3IuQ29weVRvUHJvdG8oKSAoIzgzMjcpDQorICAqIFJlbW92ZSB1bnVzZWQgcHl0aG9uX3Byb3RvYnVmLntjYyxofSAoIzg1MTMpDQorICAqIFN0YXJ0IHB1Ymxpc2hpbmcgcHl0aG9uIGFhcmNoNjQgbWFueWxpbnV4IHdoZWVscyBub3JtYWxseSAoIzg1MzApDQorICAqIEZpeCBjb25zdG5lc3MgaXNzdWUgZGV0ZWN0ZWQgYnkgTVNWQyBzdGFuZGFyZCBjb25mb3JtaW5nIG1vZGUgKCM4NTY4KQ0KKyAgKiBNYWtlIEpTT04gcGFyc2luZyBtYXRjaCBDKysgYW5kIEphdmEgd2hlbiBtdWx0aXBsZSBmaWVsZHMgZnJvbSB0aGUgc2FtZQ0KKyAgICBvbmVvZiBhcmUgcHJlc2VudCBhbmQgYWxsIGJ1dCBvbmUgaXMgbnVsbC4NCisNCisgIFJ1YnkNCisgICogQWRkIHN1cHBvcnQgZm9yIHByb3RvMyBqc29uX25hbWUgaW4gY29tcGlsZXIgYW5kIGZpZWxkIGRlZmluaXRpb25zICgjODM1NikNCisgICogRml4ZWQgbWVtb3J5IGxlYWsgb2YgUnVieSBhcmVuYSBvYmplY3RzLiAoIzg0NjEpDQorICAqIEZpeCBzb3VyY2UgZ2VtIGNvbXBpbGF0aW9uICgjODQ3MSkNCisgICogRml4IHZhcmlvdXMgZXhjZXB0aW9ucyBpbiBSdWJ5IG9uIDY0LWJpdCBXaW5kb3dzICgjODU2MykNCisgICogRml4IGNyYXNoIHdoZW4gY2FsY3VsYXRpbmcgTWVzc2FnZSBoYXNoIHZhbHVlcyBvbiA2NC1iaXQgV2luZG93cyAoIzg1NjUpDQorDQorICBDb25mb3JtYW5jZSBUZXN0cw0KKyAgKiBBZGRlZCBhIGNvbmZvcm1hbmNlIHRlc3QgZm9yIHRoZSBjYXNlIG9mIG11bHRpcGxlIGZpZWxkcyBmcm9tIHRoZSBzYW1lDQorICAgIG9uZW9mLg0KKw0KKzIwMjEtMDQtMDYgdmVyc2lvbiAzLjE2LjAgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieS9KYXZhU2NyaXB0KQ0KKyAgT3RoZXINCisgICogT3BlbnNvdXJjaW5nIGtvdGxpbiBwcm90b3MgKCM4MjcyKQ0KKyAgKiBVc2UgYSBuZXdlciB2ZXJzaW9uIG9mIHJ1bGVzX3Byb3RvLCB3aXRoIHRoZSBuZXcgcnVsZSBgcHJvdG9fZGVzY3JpcHRvcl9zZXRgICgjODQ2OSkNCisNCisgIEMrKw0KKyAgKiBGaXggY29tcGlsZXIgd2FybmluZ3MgaXNzdWUgZm91bmQgaW4gY29uZm9ybWFuY2VfdGVzdF9ydW5uZXIgIzgxODkgKCM4MTkwKQ0KKyAgKiBGaXggTWluR1ctdzY0IGJ1aWxkIGlzc3Vlcy4gKCM4Mjg2KQ0KKyAgKiBbUHJvdG9jXSBDKysgUmVzb2x2ZWQgYW4gaXNzdWUgd2hlcmUgTk9fREVTVFJPWSBhbmQgQ09OU1RJTklUIGFyZSBpbiBpbmNvcnJlY3Qgb3JkZXIgKCM4Mjk2KQ0KKyAgKiBGaXggUFJPVE9CVUZfQ09OU1RJTklUIG1hY3JvIHJlZGVmaW5pdGlvbiAoIzgzMjMpDQorICAqIERlbGV0ZSBTdHJpbmdQaWVjZVBvZCAoIzgzNTMpDQorICAqIEZpeCBnY2MgZXJyb3I6IGNvbXBhcmlzb24gb2YgdW5zaWduZWQgZXhwcmVzc2lvbiBpbiAnPj0gMCcgaXMgYWx3YXlzIOKApiAoIzgzMDkpDQorICAqIEZpeCBjbWFrZSBpbnN0YWxsIG9uIGlPUyAoIzgzMDEpDQorICAqIENyZWF0ZSBhIENNYWtlIG9wdGlvbiB0byBjb250cm9sIHdoZXRoZXIgb3Igbm90IFJUVEkgaXMgZW5hYmxlZCAoIzgzNDcpDQorICAqIEZpeCBlbmRpYW4uaCBsb2NhdGlvbiBvbiBGcmVlQlNEICgjODM1MSkNCisgICogUmVmYWN0b3IgdXRpbDo6U3RhdHVzICgjODM1NCkNCisgICogTWFrZSB1dGlsOjpTdGF0dXMgbW9yZSBzaW1pbGFyIHRvIGFic2w6OlN0YXR1cyAoIzg0MDUpDQorICAqIEZpeCAtV3N1Z2dlc3QtZGVzdHJ1Y3Rvci1vdmVycmlkZSBmb3IgZ2VuZXJhdGVkIEMrKyBwcm90byBjbGFzc2VzLiAoIzg0MDgpDQorICAqIFJlZmFjdG9yIFN0YXR1c09yIGFuZCBTdHJpbmdQaWVjZSAoIzg0MDYpDQorICAqIFJlZmFjdG9yIHVpbnQxMjggKCM4NDE2KQ0KKyAgKiBUaGUgOjpwYiBuYW1lc3BhY2UgaXMgbm8gbG9uZ2VyIGV4cG9zZWQgZHVlIHRvIGNvbmZsaWN0cy4NCisgICogQWxsb3cgTWVzc2FnZURpZmZlcmVuY2VyOjpUcmVhdEFzU2V0KCkgKGFuZCBmcmllbmRzKSB0byBvdmVycmlkZSBwcmV2aW91cw0KKyAgICBjYWxscyBpbnN0ZWFkIG9mIGNyYXNoaW5nLg0KKyAgKiBSZWR1Y2UgdGhlIHNpemUgb2YgZ2VuZXJhdGVkIHByb3RvIGhlYWRlcnMgZm9yIHByb3RvcyB3aXRoIGBzdHJpbmdgIG9yDQorICAgIGBieXRlc2AgZmllbGRzLg0KKyAgKiBNb3ZlIGFyZW5hKCkgb3BlcmF0aW9uIG9uIHVuY29tbW9uIHBhdGggdG8gb3V0LW9mLWxpbmUgcm91dGluZQ0KKyAgKiBGb3IgaXRlcmF0b3ItcGFpciBmdW5jdGlvbiBwYXJhbWV0ZXIgdHlwZXMsIHRha2UgYm90aCBpdGVyYXRvcnMgYnkgdmFsdWUuDQorICAqIENvZGUtc3BhY2Ugc2F2aW5ncyBhbmQgcGVyaGFwcyBzb21lIG1vZGVzdCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgaW4NCisgICAgUmVwZWF0ZWRQdHJGaWVsZC4NCisgICogRWxpbWluYXRlIG51bGxwdHIgY2hlY2sgZnJvbSBldmVyeSB0YWcgcGFyc2UuDQorICAqIFJlbW92ZSB1bnVzZWQgXyRuYW1lJF9jYWNoZWRfYnl0ZV9zaXplXyBmaWVsZHMuDQorICAqIFNlcmlhbGl6ZSBleHRlbnNpb24gcmFuZ2VzIHRvZ2V0aGVyIHdoZW4gbm90IGJyb2tlbiBieSBhIHByb3RvIGZpZWxkIGluIHRoZQ0KKyAgICBtaWRkbGUuDQorICAqIERvIG91dC1vZi1saW5lIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiBvZiBzdHJpbmcgb2JqZWN0IGluIEFyZW5hU3RyaW5nLg0KKyAgKiBTdHJlYW1saW5lIFBhcnNlQ29udGV4dDo6UGFyc2VNZXNzYWdlPFQ+IHRvIGF2b2lkIGNvZGUgYmxvYXQgYW5kIGltcHJvdmUNCisgICAgcGVyZm9ybWFuY2UuDQorICAqIE5ldyBtZW1iZXIgZnVuY3Rpb25zIFJlcGVhdGVkRmllbGQ6OkFzc2lnbiwgUmVwZWF0ZWRQdHJGaWVsZDo6e0FkZCwgQXNzaWdufS4NCisgICogRml4IHVuZGVmaW5lZCBiZWhhdmlvciB3YXJuaW5nIGR1ZSB0byBpbm5vY3VvdXMgdW5pbml0aWFsaXphdGlvbiBvZiB2YWx1ZQ0KKyAgICBvbiBhbiBlcnJvciBwYXRoLg0KKyAgKiBBdm9pZCBleHBlbnNpdmUgaW5saW5lZCBjb2RlIHNwYWNlIGZvciBlbmNvZGluZyBtZXNzYWdlIGxlbmd0aCBmb3IgbWVzc2FnZXMNCisgICAgPj0gMTI4IGJ5dGVzIGFuZCBpbnN0ZWFkIGRvIGEgcHJvY2VkdXJlIGNhbGwgdG8gYSBzaGFyZWQgb3V0LW9mLWxpbmUgcm91dGluZS4NCisgICogdXRpbDo6RGVmYXVsdEZpZWxkQ29tcGFyYXRvciB3aWxsIGJlIGZpbmFsIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgcHJvdG9idWYuDQorICAgIFN1YmNsYXNzZXMgc2hvdWxkIGluaGVyaXQgZnJvbSBTaW1wbGVGaWVsZENvbXBhcmF0b3IgaW5zdGVhZC4NCisNCisgIEMjDQorICAqIEFkZCAuTkVUIDUgdGFyZ2V0IGFuZCBpbXByb3ZlIFdyaXRlU3RyaW5nIHBlcmZvcm1hbmNlIHdpdGggU0lNRCAoIzgxNDcpDQorDQorICBKYXZhDQorICAqIGRlcHM6IHVwZGF0ZSBKVW5pdCBhbmQgVHJ1dGggKCM4MzE5KQ0KKyAgKiBEZXRlY3QgaW52YWxpZCBvdmVyZmxvdyBvZiBieXRlTGltaXQgYW5kIHJldHVybiBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gYXMgZG9jdW1lbnRlZC4NCisgICogRXhjZXB0aW9ucyB0aHJvd24gd2hpbGUgcmVhZGluZyBmcm9tIGFuIElucHV0U3RyZWFtIGluIHBhcnNlRnJvbSBhcmUgbm93DQorICAgIGluY2x1ZGVkIGFzIGNhdXNlcy4NCisgICogU3VwcG9ydCBwb3RlbnRpYWxseSBtb3JlIGVmZmljaWVudCBwcm90byBwYXJzaW5nIGZyb20gUm9wZUJ5dGVTdHJpbmdzLg0KKyAgKiBDbGFyaWZ5IHJ1bnRpbWUgb2YgQnl0ZVN0cmluZy5PdXRwdXQudG9TdHJpbmdCdWZmZXIoKS4NCisgICogQWRkZWQgVW5zYWZlQnl0ZU9wZXJhdGlvbnMgdG8gcHJvdG9idWYtbGl0ZSAoIzg0MjYpDQorDQorICBKYXZhU2NyaXB0DQorICAqIE1ha2UgQW55LnBhY2soKSBjaGFpbmFibGUuDQorDQorICBQeXRob24NCisgICogRml4IHNvbWUgY29uc3RuZXNzIC8gY2hhciBsaXRlcmFsIGlzc3VlcyBiZWluZyBmb3VuZCBieSBNU1ZDIHN0YW5kYXJkIGNvbmZvcm1pbmcgbW9kZSAoIzgzNDQpDQorICAqIFN3aXRjaCBvbiAibmV3IiBidWZmZXIgQVBJICgjODMzOSkNCisgICogRW5hYmxlIGNyb3NzY29tcGlsaW5nIGFhcmNoNjQgcHl0aG9uIHdoZWVscyB1bmRlciBkb2NrY3Jvc3MgbWFueWxpbnV4IGRvY2tlciBpbWFnZSAoIzgyODApDQorICAqIEZpeGVkIGEgYnVnIGluIHRleHQgZm9ybWF0IHdoZXJlIGEgdHJhaWxpbmcgY29sb24gd2FzIHByaW50ZWQgZm9yIHJlcGVhdGVkIGZpZWxkLg0KKyAgKiBXaGVuIFRleHRGb3JtYXQgZW5jb3VudGVycyBhIGR1cGxpY2F0ZSBtZXNzYWdlIG1hcCBrZXksIHJlcGxhY2UgdGhlIGN1cnJlbnQNCisgICAgb25lIGluc3RlYWQgb2YgbWVyZ2luZy4NCisNCisgIE9iamVjdGl2ZS1DDQorICAqIE1vdmUgdGhlIGNsYXNzIG1hcCB0byBhIENGRGljdGlvbmFyeS4gKCM4MzI4KQ0KKw0KKyAgUEhQDQorICAqIHJlYWRfcHJvcGVydHkoKSBoYW5kbGVyIGlzIG5vdCBzdXBwb3NlZCB0byByZXR1cm4gTlVMTCAoIzgzNjIpDQorICAqIENoYW5nZWQgcGFyYW1ldGVyIHR5cGUgZnJvbSBsb25nIHRvIGludGVnZXIgKCM3NjEzKQ0KKyAgKiBmaXg6IFJFQURNRSBzdXBwb3J0ZWQgUEhQIHZlcnNpb24gZm9yIEMgZXh0ZW5zaW9uICgjODIzNikNCisNCisgIFJ1YnkNCisgICogRml4ZWQgcXVhZHJhdGljIG1lbW9yeSB1c2FnZSB3aGVuIGFwcGVuZGluZyB0byBhcnJheXMuICgjODM2NCkNCisgICogRml4ZWQgbWVtb3J5IGxlYWsgb2YgUnVieSBhcmVuYSBvYmplY3RzLiAoIzg0NjEpDQorICAqIEFkZCBzdXBwb3J0IGZvciBwcm90bzMganNvbl9uYW1lIGluIGNvbXBpbGVyIGFuZCBmaWVsZCBkZWZpbml0aW9ucy4gKCM4MzU2KQ0KKw0KKyAgT3RoZXINCisgICogU29tZSBkb2Mgb24gQU9UIGNvbXBpbGF0aW9uIGFuZCBwcm90b2J1ZiAoIzgyOTQpDQorICAqIFtDTWFrZV0gQWJpbGl0eSB0byBwYXNzIG9wdGlvbnMgdG8gcHJvdG9jIGV4ZWN1dGFibGUgZnJvbSBjbWFrZSAoIzgzNzQpDQorICAqIEFkZCAtLWZhdGFsX3dhcm5pbmdzIGZsYWcgdG8gdHJlYXQgd2FybmluZ3MgYXMgZXJyb3JzICgjODEzMSkNCisgICogW2JhemVsXSBSZW1vdmUgZGVwcmVjYXRlZCB3YXkgdG8gZGVwZW5kIG9uIGdvb2dsZXRlc3QgKCM4Mzk2KQ0KKyAgKiBhZGQgZXJyb3IgcmV0dXJucyBtaXNzaW5nIGZyb20gcHJvdG9jIHRvIHByZXZlbnQgaXQgZnJvbSBleGl0aW5nIHdpdGjigKYgKCM4NDA5KQ0KKw0KKw0KKzIwMjEtMDQtMDcgdmVyc2lvbiAzLjE1LjggKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieS9KYXZhU2NyaXB0KQ0KKw0KKyAgUnVieQ0KKyAgKiBGaXhlZCBtZW1vcnkgbGVhayBvZiBSdWJ5IGFyZW5hIG9iamVjdHMgKCM4NDYxKQ0KKw0KKzIwMjEtMDQtMDIgdmVyc2lvbiAzLjE1LjcgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieS9KYXZhU2NyaXB0KQ0KKw0KKyAgQysrDQorICAqIFJlbW92ZSB0aGUgOjpwYiBuYW1lc3BhY2UgKGFsaWFzKSAoIzg0MjMpDQorDQorICBSdWJ5DQorICAqIEZpeCB1bmJvdW5kZWQgbWVtb3J5IGdyb3d0aCBmb3IgUnVieSA8Mi43ICgjODQyOSkNCisgICogRml4ZWQgbWVzc2FnZSBlcXVhbGl0eSBpbiBjYXNlcyB3aGVyZSB0aGUgbWVzc2FnZSB0eXBlIGlzIGRpZmZlcmVudCAoIzg0MzQpDQorDQorMjAyMS0wMy0xMCB2ZXJzaW9uIDMuMTUuNiAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorDQorICBSdWJ5DQorICAqIEZpeGVkIGJ1ZyBpbiBzdHJpbmcgY29tcGFyaXNvbiBsb2dpYyAoIzgzODYpDQorDQorMjAyMS0wMy0wNCB2ZXJzaW9uIDMuMTUuNSAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorDQorICBSdWJ5DQorICAqIEZpeGVkIHF1YWRyYXRpYyBtZW1vcnkgdXNlIGluIGFycmF5IGFwcGVuZCAoIzgzNzkpDQorDQorICBQSFANCisgICogRml4ZWQgcXVhZHJhdGljIG1lbW9yeSB1c2UgaW4gYXJyYXkgYXBwZW5kICgjODM3OSkNCisNCisgIEMrKw0KKyAgKiBEbyBub3QgZGlzYWJsZSBSVFRJIGJ5IGRlZmF1bHQgaW4gdGhlIENNYWtlIGJ1aWxkICgjODM3NykNCisNCisyMDIxLTAzLTAyIHZlcnNpb24gMy4xNS40IChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIFJ1YnkNCisgICogRml4ZWQgU0VHViB3aGVuIHVzZXJzIHBhc3MgbmlsIG1lc3NhZ2VzICgjODM2MykNCisgICogRml4ZWQgcXVhZHJhdGljIG1lbW9yeSB1c2FnZSB3aGVuIGFwcGVuZGluZyB0byBhcnJheXMgKCM4MzY0KQ0KKw0KKyAgQysrDQorICAqIENyZWF0ZSBhIENNYWtlIG9wdGlvbiB0byBjb250cm9sIHdoZXRoZXIgb3Igbm90IFJUVEkgaXMgZW5hYmxlZCAoIzgzNjEpDQorDQorICBQSFANCisgICogcmVhZF9wcm9wZXJ0eSgpIGhhbmRsZXIgaXMgbm90IHN1cHBvc2VkIHRvIHJldHVybiBOVUxMICgjODM2MikNCisNCisyMDIxLTAyLTI1IHZlcnNpb24gMy4xNS4zIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIFJ1YnkNCisgICogUnVieSA8Mi43IG5vdyB1c2VzIFdlYWtNYXAgdG9vLCB3aGljaCBwcmV2ZW50cyBtZW1vcnkgbGVha3MuICgjODM0MSkNCisNCisyMDIxLTAyLTIzIHZlcnNpb24gMy4xNS4yIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIFJ1YnkNCisgICogRml4IGZvciBGaWVsZERlc2NyaXB0b3IuZ2V0KG1zZykgKCM4MzMwKQ0KKw0KKyAgQysrDQorICAqIEZpeCBQUk9UT0JVRl9DT05TVElOSVQgbWFjcm8gcmVkZWZpbml0aW9uICgjODMyMykNCisNCisyMDIxLTAyLTA1IHZlcnNpb24gMy4xNS4xIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIFJ1YnkNCisgICogQnVnZml4IGZvciBNZXNzYWdlLltdIGZvciByZXBlYXRlZCBvciBtYXAgZmllbGRzICgjODMxMykNCisNCisyMDIxLTAyLTA1IHZlcnNpb24gMy4xNS4wIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIFByb3RvY29sIENvbXBpbGVyDQorICAqIE9wdGlvbmFsIGZpZWxkcyBmb3IgcHJvdG8zIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQsIGFuZCBubyBsb25nZXIgcmVxdWlyZQ0KKyAgICB0aGUgLS1leHBlcmltZW50YWxfYWxsb3dfcHJvdG8zX29wdGlvbmFsIGZsYWcuDQorDQorICBDKysNCisgICogTWVzc2FnZURpZmZlcmVuY2VyOiBmaXhlZCBidWcgd2hlbiB1c2luZyBjdXN0b20gaWdub3JlIHdpdGggbXVsdGlwbGUNCisgICAgdW5rbm93biBmaWVsZHMNCisgICogVXNlIGluaXRfc2VnIGluIE1TVkMgdG8gcHVzaCBpbml0aWFsaXphdGlvbiB0byBhbiBlYXJsaWVyIHBoYXNlLg0KKyAgKiBSdW50aW1lIG5vIGxvbmdlciB0cmlnZ2VycyAtV3NpZ24tY29tcGFyZSB3YXJuaW5ncy4NCisgICogRml4ZWQgLVd0YXV0b2xvZ2ljYWwtY29uc3RhbnQtb3V0LW9mLXJhbmdlLWNvbXBhcmUgd2FybmluZy4NCisgICogRHluYW1pY0Nhc3RUb0dlbmVyYXRlZCB3b3JrcyBmb3IgbnVsbHB0ciBpbnB1dCBmb3IgZXZlbiBpZiBSVFRJIGlzIGRpc2FibGVkDQorICAqIEFyZW5hIGlzIHJlZmFjdG9yZWQgYW5kIG9wdGltaXplZC4NCisgICogQ2xhcmlmaWVkL3NwZWNpZmllZCB0aGF0IHRoZSBleGFjdCB2YWx1ZSBvZiBBcmVuYTo6U3BhY2VBbGxvY2F0ZWQoKSBpcyBhbg0KKyAgICBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgdXNlcnMgbXVzdCBub3QgcmVseSBvbi4gSXQgc2hvdWxkIG5vdCBiZSB1c2VkIGluDQorICAgIHVuaXQgdGVzdHMuDQorICAqIENoYW5nZSB0aGUgc2lnbmF0dXJlIG9mIEFueTo6UGFja0Zyb20oKSB0byByZXR1cm4gZmFsc2Ugb24gZXJyb3IuDQorICAqIEFkZCBmYXN0IHJlZmxlY3Rpb24gZ2V0dGVyIEFQSSBmb3Igc3RyaW5ncy4NCisgICogQ29uc3RhbnQgaW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIG1lc3NhZ2UgaW5zdGFuY2VzDQorICAqIEF2b2lkIHBvdGVudGlhbCBmb3IgbWlzc2VkIHdha2V1cCBpbiBVbmtub3duRmllbGRTZXQNCisgICogTm93IFByb3RvMyBPbmVvZiBmaWVsZHMgaGF2ZSAiaGFzIiBtZXRob2RzIGZvciBjaGVja2luZyB0aGVpciBwcmVzZW5jZSBpbg0KKyAgICBDKysuDQorICAqIEJ1Z2ZpeCBmb3IgTlZDQw0KKyAgKiBSZXR1cm4gZWFybHkgaW4gX0ludGVybmFsU2VyaWFsaXplIGZvciBlbXB0eSBtYXBzLg0KKyAgKiBBZGRpbmcgZnVuY3Rpb25hbGl0eSBmb3Igb3V0cHV0dGluZyBtYXAga2V5IHZhbHVlcyBpbiBwcm90byBwYXRoIGxvZ2dpbmcNCisgICAgb3V0cHV0IChkb2VzIG5vdCBhZmZlY3QgY29tcGFyaXNvbiBsb2dpYykgYW5kIHN0b3AgcHJpbnRpbmcgJ3ZhbHVlJyBpbiB0aGUNCisgICAgcGF0aC4gVGhlIG1vZGlmaWVkIHByaW50IGZ1bmN0aW9uYWxpdHkgaXMgaW4gdGhlDQorICAgIE1lc3NhZ2VEaWZmZXJlbmNlcjo6U3RyZWFtUmVwb3J0ZXIuDQorICAqIEZpeGVkIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvaXNzdWVzLzgxMjkNCisgICogRW5zdXJlIHRoYXQgbnVsbCBjaGFyIHN5bWJvbCwgcGFja2FnZSBhbmQgZmlsZSBuYW1lcyBkbyBub3QgcmVzdWx0IGluIGENCisgICAgY3Jhc2guDQorICAqIENvbnN0YW50IGluaXRpYWxpemUgdGhlIGdsb2JhbCBtZXNzYWdlIGluc3RhbmNlcw0KKyAgKiBQcmV0dHkgcHJpbnQgJ21heCcgaW5zdGVhZCBvZiBudW1lcmljIHZhbHVlcyBpbiByZXNlcnZlZCByYW5nZXMuDQorICAqIFJlbW92ZWQgcmVtYWluaW5nIGluc3RhbmNlcyBvZiBzdGQ6OmlzX3BvZCwgd2hpY2ggaXMgZGVwcmVjYXRlZCBpbiBDKysyMC4NCisgICogQ2hhbmdlcyB0byByZWR1Y2UgY29kZSBzaXplIGZvciB1bmtub3duIGZpZWxkIGhhbmRsaW5nIGJ5IG1ha2luZyB1bmNvbW1vbg0KKyAgICBjYXNlcyBvdXQgb2YgbGluZS4NCisgICogRml4IHN0ZDo6aXNfcG9kIGRlcHJlY2F0ZWQgaW4gQysrMjAgKCM3MTgwKQ0KKyAgKiBGaXggc29tZSAtV3VudXNlZC1wYXJhbWV0ZXIgd2FybmluZ3MgKCM4MDUzKQ0KKyAgKiBGaXggZGV0ZWN0aW5nIGZpbGUgYXMgZGlyZWN0b3J5IG9uIHpPUyBpc3N1ZSAjODA1MSAoIzgwNTIpDQorICAqIERvbid0IGluY2x1ZGUgc3lzL3BhcmFtLmggZm9yIF9CWVRFX09SREVSICgjODEwNikNCisgICogcmVtb3ZlIENNQUtFX1RIUkVBRF9MSUJTX0lOSVQgZnJvbSBwa2djb25maWcgQ0ZMQUdTICgjODE1NCkNCisgICogRml4IFRleHRGb3JtYXRNYXBUZXN0LkR5bmFtaWNNZXNzYWdlIGlzc3VlIzUxMzYgKCM4MTU5KQ0KKyAgKiBGaXggZm9yIGNvbXBpbGVyIHdhcm5pbmcgaXNzdWUjODE0NSAoIzgxNjApDQorICAqIGZpeDogc3VwcG9ydCBkZXByZWNhdGVkIGVudW1zIGZvciBHQ0MgPCA2ICgjODE2NCkNCisgICogRml4IHNvbWUgd2FybmluZyB3aGVuIGNvbXBpbGluZyB3aXRoIFZpc3VhbCBTdHVkaW8gMjAxOSBvbiB4NjQgdGFyZ2V0ICgjODEyNSkNCisNCisgIFB5dGhvbg0KKyAgKiBQcm92aWRlZCBhbiBvdmVycmlkZSBmb3IgdGhlIHJldmVyc2UoKSBtZXRob2QgdGhhdCB3aWxsIHJldmVyc2UgdGhlIGludGVybmFsDQorICAgIGNvbGxlY3Rpb24gZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZyB0aGUgb3RoZXIgbWV0aG9kcyBvZiB0aGUgQmFzZUNvbnRhaW5lci4NCisgICogTWVzc2FnZUZhY3RvcnkuQ3JlYXRlUHJvdG95cGUgY2FuIGJlIG92ZXJyaWRkZW4gdG8gY3VzdG9taXplIGNsYXNzIGNyZWF0aW9uLg0KKyAgKiBGaXggUHlVbmtub3duRmllbGRzIG1lbW9yeSBsZWFrICgjNzkyOCkNCisgICogQWRkIG1hY09TIEJpZyBTdXIgY29tcGF0aWJpbGl0eSAoIzgxMjYpDQorDQorICBKYXZhU2NyaXB0DQorICAqIEdlbmVyYXRlIGBnZXREZXNjcmlwdG9yYCBtZXRob2RzIHdpdGggYCpgIGFzIHRoZWlyIGB0aGlzYCB0eXBlLg0KKyAgKiBFbmZvcmNlIGBsZXQvY29uc3RgIGZvciBnZW5lcmF0ZWQgbWVzc2FnZXMuDQorICAqIGpzL2JpbmFyeS91dGlscy5qczogRml4IGpzcGIudXRpbHMuam9pblVuc2lnbmVkRGVjaW1hbFN0cmluZyB0byB3b3JrIHdpdGggbmVnYXRpdmUgYml0c0xvdyBhbmQgbG93IGJ1dCBub24temVybyBiaXRzSGlnaCBwYXJhbWV0ZXIuICgjODE3MCkNCisNCisgIFBIUA0KKyAgKiBBZGRlZCBzdXBwb3J0IGZvciBQSFAgOC4gKCM4MTA1KQ0KKyAgKiB1bnJlZ2lzdGVyIElOSSBlbnRyaWVzIGFuZCBmaXggaW52YWxpZCByZWFkIG9uIHNodXRkb3duICgjODA0MikNCisgICogRml4IFBocERvYyBjb21tZW50cyBmb3IgbWVzc2FnZSBhY2Nlc3NvcnMgdG8gaW5jbHVkZSAifG51bGwiLiAoIzgxMzYpDQorICAqIGZpeDogY29udmVydCBuYXRpdmUgUEhQIGZsb2F0cyB0byBzaW5nbGUgcHJlY2lzaW9uICgjODE4NykNCisgICogRml4ZWQgUEhQIHRvIHN1cHBvcnQgZmllbGQgbnVtYmVycyA+PTIqKjI4LiAoIzgyMzUpDQorICAqIGZlYXQ6IGFkZCBzdXBwb3J0IGZvciBkZXByZWNhdGVkIGZpZWxkcyB0byBQSFAgY29tcGlsZXIgKCM4MjIzKQ0KKyAgKiBQcm90ZWN0IGFnYWluc3Qgc3RhY2sgb3ZlcmZsb3cgaWYgdGhlIHVzZXIgZGVyaXZlcyBmcm9tIE1lc3NhZ2UuICgjODI0OCkNCisgICogRml4ZWQgY2xvbmUgZm9yIE1lc3NhZ2UsIFJlcGVhdGVkRmllbGQsIGFuZCBNYXBGaWVsZC4gKCM4MjQ1KQ0KKyAgKiBVcGRhdGVkIHVwYiB0byBhbGxvdyBub256ZXJvIG9mZnNldCBtaW51dGVzIGluIEpTT04gdGltZXN0YW1wcy4gKCM4MjU4KQ0KKw0KKyAgUnVieQ0KKyAgKiBBZGRlZCBzdXBwb3J0IGZvciBSdWJ5IDMuICgjODE4NCkNCisgICogUmV3cm90ZSB0aGUgZGF0YSBzdG9yYWdlIGxheWVyIHRvIGJlIGJhc2VkIG9uIHVwYl9tc2cgb2JqZWN0cyBmcm9tIHRoZQ0KKyAgICB1cGIgbGlicmFyeS4gVGhpcyBzaG91bGQgbGVhZCB0byBtdWNoIGJldHRlciBwYXJzaW5nIHBlcmZvcm1hbmNlLA0KKyAgICBwYXJ0aWN1bGFybHkgZm9yIGxhcmdlIG1lc3NhZ2VzLiAoIzgxODQpLg0KKyAgKiBGaWxsIG91dCBKUnVieSBzdXBwb3J0ICgjNzkyMykNCisgICogW1J1YnldIEZpeDogKFNJR1NFR1YpIGdSUEMtUnVieSBpc3N1ZSBvbiBXaW5kb3dzLiBtZW1vcnkgYWxsb2MgaW5maW5pdGUNCisgICAgcmVjdXJzaW9uL3J1biBvdXQgb2YgbWVtb3J5ICgjODE5NSkNCisgICogRml4IGpydWJ5IHN1cHBvcnQgdG8gaGFuZGxlIG1lc3NhZ2VzIG5lc3RlZCBtb3JlIHRoYW4gMSBsZXZlbCBkZWVwICgjODE5NCkNCisNCisgIEphdmENCisgICogQXZvaWQgcG9zc2libGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gd2hlbiB1c2luZyBDb2RlZElucHV0U3RlYW0NCisgICAgd2l0aCBhIGRpcmVjdCBCeXRlQnVmZmVyLg0KKyAgKiBNYWtlIER1cmF0aW9ucy5jb21wYXJhdG9yKCkgYW5kIFRpbWVzdGFtcHMuY29tcGFyYXRvcigpIFNlcmlhbGl6YWJsZS4NCisgICogQWRkIG1vcmUgZGV0YWlsZWQgZXJyb3IgaW5mb3JtYXRpb24gZm9yIGR5bmFtaWMgbWVzc2FnZSBmaWVsZCB0eXBlDQorICAgIHZhbGlkYXRpb24gZmFpbHVyZQ0KKyAgKiBSZW1vdmVkIGRlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gamF2YV9uYW1lcy5oIGZyb20NCisgICAgamF2YV9oZWxwZXJzLmguDQorICAqIE5vdyBQcm90bzMgT25lb2YgZmllbGRzIGhhdmUgImhhcyIgbWV0aG9kcyBmb3IgY2hlY2tpbmcgdGhlaXIgcHJlc2VuY2UgaW4NCisgICAgSmF2YS4NCisgICogQW5ub3RhdGVzIEphdmEgcHJvdG8gZ2VuZXJhdGVkICpfRklFTERfTlVNQkVSIGNvbnN0YW50cy4NCisgICogQWRkIC1hc3N1bWV2YWx1ZXMgdG8gcmVtb3ZlIEp2bU1lbW9yeUFjY2Vzc29yIG9uIEFuZHJvaWQuDQorDQorICBDIw0KKyAgKiBGaXggcGFyc2luZyBuZWdhdGl2ZSBJbnQzMlZhbHVlIHRoYXQgY3Jvc3NlcyBzZWdtZW50IGJvdW5kYXJ5ICgjODAzNSkNCisgICogQ2hhbmdlIEJ5dGVTdHJpbmcgdG8gdXNlIG1lbW9yeSBhbmQgc3VwcG9ydCB1bnNhZmUgY3JlYXRlIHdpdGhvdXQgY29weSAoIzc2NDUpDQorICAqIE9wdGltaXplIE1hcEZpZWxkIHNlcmlhbGl6YXRpb24gYnkgcmVtb3ZpbmcgTWVzc2FnZUFkYXB0ZXIgKCM4MTQzKQ0KKyAgKiBBbGxvdyBGaWxlRGVzY3JpcHRvcnMgdG8gYmUgcGFyc2VkIHdpdGggZXh0ZW5zaW9uIHJlZ2lzdHJpZXMgKCM4MjIwKQ0KKyAgKiBPcHRpbWl6ZSB3cml0aW5nIHNtYWxsIHN0cmluZ3MgKCM4MTQ5KQ0KKw0KKzIwMjAtMTEtMTEgdmVyc2lvbiAzLjE0LjAgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieS9KYXZhU2NyaXB0KQ0KKw0KKyAgUHJvdG9jb2wgQ29tcGlsZXINCisgICogVGhlIHByb3RvIGNvbXBpbGVyIG5vIGxvbmdlciByZXF1aXJlcyBhIC5wcm90byBmaWxlbmFtZSB3aGVuIGl0IGlzIG5vdA0KKyAgICBnZW5lcmF0aW5nIGNvZGUuDQorICAqIEFkZGVkIGZsYWcgYC0tZGV0ZXJtaW5pc3RpY19vdXRwdXRgIHRvIGBwcm90b2MgLS1lbmNvZGU9Li4uYC4NCisgICogRml4ZWQgZGVhZGxvY2sgd2hlbiB1c2luZyBnb29nbGUucHJvdG9idWYuQW55IGVtYmVkZGVkIGluIGFnZ3JlZ2F0ZSBvcHRpb25zLg0KKw0KKyAgQysrDQorICAqIEFyZW5hcyBhcmUgbm93IHVuY29uZGl0aW9uYWxseSBlbmFibGVkLiBjY19lbmFibGVfYXJlbmFzIG5vIGxvbmdlciBoYXMNCisgICAgYW55IGVmZmVjdC4NCisgICogUmVtb3ZlZCBpbmxpbmVkIHN0cmluZyBzdXBwb3J0LCB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCBhcmVuYXMuDQorICAqIEZpeCBhIG1lbW9yeSBjb3JydXB0aW9uIGJ1ZyBpbiByZWZsZWN0aW9uIHdoZW4gbWl4aW5nIG9wdGlvbmFsIGFuZA0KKyAgICBub24tb3B0aW9uYWwgZmllbGRzLg0KKyAgKiBNYWtlIFNwYWNlVXNlZCgpIGNhbGN1bGF0aW9uIG1vcmUgdGhvcm91Z2ggZm9yIG1hcCBmaWVsZHMuDQorICAqIEFkZCBzdGFjayBvdmVyZmxvdyBwcm90ZWN0aW9uIGZvciB0ZXh0IGZvcm1hdCB3aXRoIHVua25vd24gZmllbGQgdmFsdWVzLg0KKyAgKiBGaWVsZFBhdGg6OkZvbGxvd0FsbCgpIG5vdyByZXR1cm5zIGEgYm9vbCB0byBzaWduYWwgaWYgYW4gb3V0LW9mLWJvdW5kcw0KKyAgICBlcnJvciB3YXMgZW5jb3VudGVyZWQuDQorICAqIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBmb3IgTWFwLg0KKyAgKiBNaW5vciBmb3JtYXR0aW5nIGZpeCB3aGVuIGR1bXBpbmcgYSBkZXNjcmlwdG9yIHRvIC5wcm90byBmb3JtYXQgd2l0aA0KKyAgICBEZWJ1Z1N0cmluZy4NCisgICogVUJTQU4gZml4IGluIFJlcGVhdGVkRmllbGQgKCMyMDczKS4NCisgICogV2hlbiBydW5uaW5nIHVuZGVyIEFTQU4sIHNraXAgYSB0ZXN0IHRoYXQgbWFrZXMgaHVnZSBhbGxvY2F0aW9ucy4NCisgICogRml4ZWQgYSBjcmFzaCB0aGF0IGNvdWxkIGhhcHBlbiB3aGVuIGNyZWF0aW5nIG1vcmUgdGhhbiAyNTYgZXh0ZW5zaW9ucyBpbg0KKyAgICBhIHNpbmdsZSBtZXNzYWdlLg0KKyAgKiBGaXggYSBjcmFzaCBpbiBCdWlsZEZpbGUgd2hlbiBwYXNzaW5nIGluIGludmFsaWQgZGVzY3JpcHRvciBwcm90by4NCisgICogUGFyc2VyIHNlY3VyaXR5IGZpeCB3aGVuIG9wZXJhdGluZyB3aXRoIENvZGVkSW5wdXRTdHJlYW0uDQorICAqIFdhcm4gYWdhaW5zdCB0aGUgdXNlIG9mIEFsbG93VW5rbm93bkV4dGVuc2lvbi4NCisgICogTWlncmF0ZWQgdG8gQysrMTEgZm9yLXJhbmdlIGxvb3BzIGluc3RlYWQgb2YgaW5kZXgtYmFzZWQgbG9vcHMgd2hlcmUNCisgICAgcG9zc2libGUuIFRoaXMgZml4ZXMgYSBsb3Qgb2Ygd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCAtV3NpZ24tY29tcGFyZS4NCisgICogRml4IHNlZ21lbnQgZmF1bHQgZm9yIHByb3RvMyBvcHRpb25hbCAoIzc4MDUpDQorICAqIEFkZHMgYSBDTWFrZSBvcHRpb24gdG8gYnVpbGQgYGxpYnByb3RvY2Agc2VwYXJhdGVseSAoIzc5NDkpDQorDQorICBKYXZhDQorICAqIEJ1Z2ZpeCBpbiBtZXJnZUZyb20oKSB3aGVuIGEgb25lb2YgaGFzIG11bHRpcGxlIG1lc3NhZ2UgZmllbGRzLg0KKyAgKiBGaXggUm9wZUJ5dGVTdHJpbmcuUm9wZUlucHV0U3RyZWFtLnJlYWQoKSByZXR1cm5pbmcgLTEgd2hlbiB0b2xkIHRvIHJlYWQNCisgICAgMCBieXRlcyB3aGVuIG5vdCBhdCBFT0YuDQorICAqIFJlZGVmaW5lIHJlbW92ZShPYmplY3QpIG9uIHByaW1pdGl2ZSByZXBlYXRlZCBmaWVsZCBMaXN0cyB0byBhdm9pZA0KKyAgICBhdXRvYm94aW5nLg0KKyAgKiBTdXBwb3J0ICJcdSIgZXNjYXBlcyBpbiB0ZXh0Zm9ybWF0IHN0cmluZyBsaXRlcmFscy4NCisgICogVHJhaWxpbmcgZW1wdHkgc3BhY2VzIGFyZSBubyBsb25nZXIgaWdub3JlZCBmb3IgRmllbGRNYXNrLg0KKyAgKiBGaXggRmllbGRNYXNrVXRpbC5zdWJ0cmFjdCB0byByZWN1cnNpdmVseSByZW1vdmUgbWFzay4NCisgICogTWFyayBlbnVtcyB3aXRoIGBAamF2YS5sYW5nLkRlcHJlY2F0ZWRgIGlmIHRoZSBwcm90byBlbnVtIGhhcyBvcHRpb24NCisgICAgYGRlcHJlY2F0ZWQgPSB0cnVlO2AuDQorICAqIEFkZGluZyBmb3Jnb3R0ZW4gZHVyYXRpb24ucHJvdG8gdG8gdGhlIGxpdGUgbGlicmFyeSAoIzc3MzgpDQorDQorICBQeXRob24NCisgICogUHJpbnQgZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZSBhcyBudWxsIGluc3RlYWQgb2YgIk5VTExfVkFMVUUiIHdoZW4gaXQgaXMNCisgICAgdXNlZCBvdXRzaWRlIFdLVCBWYWx1ZS9TdHJ1Y3QuDQorICAqIEZpeCBidWcgb2NjdXJyaW5nIHdoZW4gYXR0ZW1wdGluZyB0byBkZWVwIGNvcHkgYW4gZW51bSB0eXBlIGluIHB5dGhvbiAzLg0KKyAgKiBBZGQgYSBzZXR1cHRvb2xzIGV4dGVuc2lvbiBmb3IgZ2VuZXJhdGluZyBQeXRob24gcHJvdG9idWZzICgjNzc4MykNCisgICogUmVtb3ZlIHVzZXMgb2YgcGtnX3Jlc291cmNlcyBpbiBub24tbmFtZXNwYWNlIHBhY2thZ2VzLiAoIzc5MDIpDQorICAqIFtiYXplbC9weV0gT21pdCBnb29nbGUvX19pbml0X18ucHkgZnJvbSB0aGUgUHJvdG9idWYgcnVudGltZS4gKCM3OTA4KQ0KKyAgKiBSZW1vdmVkIHRoZSB1bm5lY2Vzc2FyeSBzZXR1cHRvb2xzIHBhY2thZ2UgZGVwZW5kZW5jeSBmb3IgUHl0aG9uIHBhY2thZ2UgKCM3NTExKQ0KKyAgKiBGaXggUHlVbmtub3duRmllbGRzIG1lbW9yeSBsZWFrICgjNzkyOCkNCisNCisgIFBIUA0KKyAgKiBBZGRlZCBzdXBwb3J0IGZvciAiPT0iIHRvIHRoZSBQSFAgQyBleHRlbnNpb24gKCM3ODgzKQ0KKyAgKiBBZGRlZCBgPT1gIG9wZXJhdG9ycyBmb3IgTWFwIGFuZCBBcnJheS4gKCM3OTAwKQ0KKyAgKiBOYXRpdmUgQyB3ZWxsLWtub3duIHR5cGVzICgjNzk0NCkNCisgICogT3B0aW1pemVkIGF3YXkgaGV4MmJpbigpIGNhbGwgaW4gZ2VuZXJhdGVkIGNvZGUgKCM4MDA2KQ0KKyAgKiBOZXcgdmVyc2lvbiBvZiB1cGIsIGFuZCBhIG5ldyBoYXNoIGZ1bmN0aW9uIHd5aGFzaCBpbiB0aGlyZF9wYXJ0eS4gKCM4MDAwKQ0KKyAgKiBhZGQgbWlzc2luZyBoYXNPbmVvZiBtZXRob2QgdG8gY2hlY2sgcHJlc2VuY2Ugb2Ygb25lb2YgZmllbGRzICgjODAwMykNCisNCisgIEdvOg0KKyAgKiBVcGRhdGUgZ29fcGFja2FnZSBvcHRpb25zIHRvIHJlZmVyZW5jZSBnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1ZiBtb2R1bGUuDQorDQorICBDIzoNCisgICogYW5ub3RhdGUgQnl0ZVN0cmluZy5Db3B5RnJvbShSZWFkT25seVNwYW48Ynl0ZT4pIGFzIFNlY3VyaXR5U2FmZUNyaXRpY2FsICgjNzcwMSkNCisgICogRml4IEMjIG9wdGlvbmFsIGZpZWxkIHJlZmxlY3Rpb24gd2hlbiB0aGVyZSBhcmUgcmVndWxhciBmaWVsZHMgdG9vICgjNzcwNSkNCisgICogRml4IHBhcnNpbmcgbmVnYXRpdmUgSW50MzJWYWx1ZSB0aGF0IGNyb3NzZXMgc2VnbWVudCBib3VuZGFyeSAoIzgwMzUpDQorDQorICBKYXZhc2NyaXB0Og0KKyAgKiBKUzogcGFyc2UgKHVuKXBhY2tlZCBmaWVsZHMgY29uZGl0aW9uYWxseSAoIzczNzkpDQorDQorMjAyMC0wNy0xNCB2ZXJzaW9uIDMuMTMuMCAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorDQorICBQSFA6DQorICAqIFRoZSBDIGV4dGVuc2lvbiBpcyBjb21wbGV0ZWx5IHJld3JpdHRlbi4gVGhlIG5ldyBDIGV4dGVuc2lvbiBoYXMgc2lnbmlmaWNhbnRseQ0KKyAgICBiZXR0ZXIgcGFyc2luZyBwZXJmb3JtYW5jZSBhbmQgZml4ZXMgYSBoYW5kZnVsIG9mIGNvbmZvcm1hbmNlIGlzc3Vlcy4gSXQgd2lsbA0KKyAgICBhbHNvIG1ha2UgaXQgZWFzaWVyIHRvIGFkZCBzdXBwb3J0IGZvciBtb3JlIGZlYXR1cmVzIGxpa2UgcHJvdG8yIGFuZCBwcm90bzMgcHJlc2VuY2UuDQorICAqIFRoZSBuZXcgQyBleHRlbnNpb24gZG9lcyBub3Qgc3VwcG9ydCBQSFAgNS54LiBQSFAgNS54IHVzZXJzIGNhbiBzdGlsbCB1c2UgcHVyZS1QSFAuDQorDQorICBDKys6DQorICAqIFJlbW92ZWQgZGVwcmVjYXRlZCB1bnNhZmUgYXJlbmEgc3RyaW5nIGFjY2Vzc29ycw0KKyAgKiBFbmFibGVkIGhldGVyb2dlbmVvdXMgbG9va3VwIGZvciBzdGQ6OnN0cmluZyBrZXlzIGluIG1hcHMuDQorICAqIFJlbW92ZWQgaW1wbGljaXQgY29udmVyc2lvbiBmcm9tIFN0cmluZ1BpZWNlIHRvIHN0ZDo6c3RyaW5nDQorICAqIEZpeCB1c2UtYWZ0ZXItZGVzdHJveSBidWcgd2hlbiB0aGUgTWFwIGlzIGFsbG9jYXRlZCBpbiB0aGUgYXJlbmEuDQorICAqIEltcHJvdmVkIHRoZSByYW5kb21uZXNzIG9mIG1hcCBvcmRlcmluZw0KKyAgKiBBZGRlZCBzdGFjayBvdmVyZmxvdyBwcm90ZWN0aW9uIGZvciB0ZXh0IGZvcm1hdCB3aXRoIHVua25vd24gZmllbGRzDQorICAqIFVzZSBzdGQ6Omhhc2ggZm9yIHByb3RvIG1hcHMgdG8gaGVscCB3aXRoIHBvcnRhYmlsaXR5Lg0KKyAgKiBBZGRlZCBtb3JlIFdpbmRvd3MgbWFjcm9zIHRvIHByb3RvIHdoaXRlbGlzdC4NCisgICogQXJlbmEgY29uc3RydWN0b3JzIGZvciBtYXAgZW50cnkgbWVzc2FnZXMgYXJlIG5vdyBtYXJrZWQgImV4cGxpY2l0Ig0KKyAgICAoZm9yIHJlZ3VsYXIgbWVzc2FnZXMgdGhleSB3ZXJlIGFscmVhZHkgZXhwbGljaXQpLg0KKyAgKiBGaXggc3VidGxlIGFsaWFzaW5nIGJ1ZyBpbiBSZXBlYXRlZEZpZWxkOjpBZGQNCisgICogRml4IG1pc21hdGNoIGJldHdlZW4gTWFwRW50cnkgQnl0ZVNpemUgYW5kIFNlcmlhbGl6ZSB3aXRoIHJlc3BlY3QgdG8gdW5zZXQNCisgICAgZmllbGRzLg0KKw0KKyAgUHl0aG9uOg0KKyAgKiBKU09OIGZvcm1hdCBjb25mb3JtYW5jZSBmaXhlczoNCisgICAgKiBSZWplY3QgbG93ZXJjYXNlIHQgZm9yIFRpbWVzdGFtcCBqc29uIGZvcm1hdC4NCisgICAgKiBQcmludCBmdWxsX25hbWUgZGlyZWN0bHkgZm9yIGV4dGVuc2lvbnMgKG5vIGNhbWVsQ2FzZSkuDQorICAgICogUmVqZWN0IGJvb2xlYW4gdmFsdWVzIGZvciBpbnRlZ2VyIGZpZWxkcy4NCisgICAgKiBSZWplY3QgTmFOLCBJbmZpbml0eSwgLUluZmluaXR5IHRoYXQgaXMgbm90IHF1b3RlZC4NCisgICAgKiBCYXNlNjQgZml4ZXMgZm9yIGJ5dGVzIGZpZWxkczogYWNjZXB0IFVSTC1zYWZlIGJhc2U2NCBhbmQgbWlzc2luZyBwYWRkaW5nLg0KKyAgKiBCdWdmaXggZm9yIGZpZWxkcy9maWxlcyBuYW1lZCAiYXN5bmMiIG9yICJhd2FpdCIuDQorICAqIEltcHJvdmVkIHRoZSBlcnJvciBtZXNzYWdlIHdoZW4gQXR0cmlidXRlRXJyb3IgaXMgcmV0dXJuZWQgZnJvbSBfX2dldGF0dHJfXw0KKyAgICBpbiBFbnVtVHlwZVdyYXBwZXIuDQorDQorICBKYXZhOg0KKyAgKiBGaXhlZCBhIGJ1ZyB3aGVyZSBzZXR0aW5nIG9wdGlvbmFsIHByb3RvMyBlbnVtcyB3aXRoIHNldEZvb1ZhbHVlKCkgd291bGQNCisgICAgbm90IG1hcmsgdGhlIHZhbHVlIGFzIHByZXNlbnQuDQorICAqIEFkZCBTdWJ0cmFjdCBmdW5jdGlvbiB0byBGaWVsZE1hc2tVdGlsLg0KKw0KKyAgQyM6DQorICAqIERyb3BwZWQgc3VwcG9ydCBmb3IgbmV0c3RhbmRhcmQxLjAgKHJlcGxhY2VkIGJ5IHN1cHBvcnQgZm9yIG5ldHN0YW5kYXJkMS4xKS4NCisgICAgVGhpcyB3YXMgcmVxdWlyZWQgdG8gbW9kZXJuaXplIHRoZSBwYXJzaW5nIHN0YWNrIHRvIHVzZSB0aGUgYFNwYW48Ynl0ZT5gDQorICAgIHR5cGUgaW50ZXJuYWxseS4gKCM3MzUxKQ0KKyAgKiBBZGQgYFBhcnNlRnJvbShSZWFkT25seVNlcXVlbmNlPGJ5dGU+KWAgbWV0aG9kIHRvIGVuYWJsZSBHQyBmcmllbmRseQ0KKyAgICBwYXJzaW5nIHdpdGggcmVkdWNlZCBhbGxvY2F0aW9ucyBhbmQgYnVmZmVyIGNvcGllcy4gKCM3MzUxKQ0KKyAgKiBBZGQgc3VwcG9ydCBmb3Igc2VyaWFsaXphdGlvbiBkaXJlY3RseSB0byBhIGBJQnVmZmVyV3JpdGVyPGJ5dGU+YCBvcg0KKyAgICB0byBhIGBTcGFuPGJ5dGU+YCB0byBlbmFibGUgR0MgZnJpZW5kbHkgc2VyaWFsaXphdGlvbi4NCisgICAgVGhlIG5ldyBBUEkgaXMgYXZhaWxhYmxlIGFzIGV4dGVuc2lvbiBtZXRob2RzIG9uIHRoZSBgSU1lc3NhZ2VgIHR5cGUuICgjNzU3NikNCisgICogQWRkIGBHT09HTEVfUFJPVE9CVUZfUkVGU1RSVUNUX0NPTVBBVElCSUxJVFlfTU9ERWAgZGVmaW5lIHRvIG1ha2UNCisgICAgZ2VuZXJhdGVkIGNvZGUgY29tcGF0aWJsZSB3aXRoIG9sZCBDIyBjb21waWxlcnMgKHByZS1yb3NseW4gY29tcGlsZXJzDQorICAgIGZyb20gLk5FVCBmcmFtZXdvcmsgYW5kIG9sZCB2ZXJzaW9ucyBvZiBtb25vKSB0aGF0IGRvIG5vdCBzdXBwb3J0DQorICAgIHJlZiBzdHJ1Y3RzLiBVc2VycyB0aGF0IGFyZSBzdGlsbCBvbiBhIGxlZ2FjeSBzdGFjayB0aGF0IGRvZXMNCisgICAgbm90IHN1cHBvcnQgQyMgNy4yIGNvbXBpbGVyIG1pZ2h0IG5lZWQgdG8gdXNlIHRoZSBuZXcgZGVmaW5lDQorICAgIGluIHRoZWlyIHByb2plY3RzIHRvIGJlIGFibGUgdG8gYnVpbGQgdGhlIG5ld2x5IGdlbmVyYXRlZCBjb2RlLiAoIzc0OTApDQorICAqIER1ZSB0byB0aGUgbWFqb3Igb3ZlcmhhdWwgb2YgcGFyc2luZyBhbmQgc2VyaWFsaXphdGlvbiBpbnRlcm5hbHMgKCM3MzUxIGFuZCAjNzU3NiksDQorICAgIGl0IGlzIHJlY29tbWVuZGVkIHRvIHJlZ2VuZXJhdGUgeW91ciBnZW5lcmF0ZWQgY29kZSB0byBhY2hpZXZlIHRoZSBiZXN0DQorICAgIHBlcmZvcm1hbmNlICh0aGUgbGVnYWN5IGdlbmVyYXRlZCBjb2RlIHdpbGwgc3RpbGwgd29yaywgYnV0IG1pZ2h0IGluY3VyDQorICAgIGEgc2xpZ2h0IHBlcmZvcm1hbmNlIHBlbmFsdHkpLg0KKw0KKzIwMjAtMDctMjggdmVyc2lvbiAzLjEyLjQgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieS9KYXZhU2NyaXB0KQ0KKw0KK1RoaXMgcmVsZWFzZSBjb250YWlucyBubyBzaWduaWZpY2FudCBjaGFuZ2VzLCBidXQgZXhpc3RzIGJlY2F1c2UgMy4xMi4zIHdhcw0KK21pc3Rha2VubHkgdGFnZ2VkIGF0IHRoZSB3cm9uZyBjb21taXQuDQorDQorMjAyMC0wNi0wMSB2ZXJzaW9uIDMuMTIuMyAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorDQorICBPYmplY3RpdmUtQw0KKyAgKiBUd2VhayB0aGUgdW5pb24gdXNlZCBmb3IgRXh0ZW5zaW9ucyB0byBzdXBwb3J0IG9sZCBnZW5lcmF0ZWQgY29kZS4gIzc1NzMNCisNCisyMDIwLTA1LTI2IHZlcnNpb24gMy4xMi4yIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIEMrKw0KKyAgKiBTaW1wbGlmaWVkIHRoZSB0ZW1wbGF0ZSBleHBvcnQgbWFjcm9zIHRvIGZpeCB0aGUgYnVpbGQgZm9yIG1pbmd3MzIuICgjNzUzOSkNCisNCisgIE9iamVjdGl2ZS1DDQorICAqIEZpeCBmb3IgdGhlIDpwcm90b2J1Zl9vYmpjIHRhcmdldCBpbiB0aGUgQmF6ZWwgQlVJTEQgZmlsZS4gKCM3NTM4KQ0KKw0KKzIwMjAtMDUtMjAgdmVyc2lvbiAzLjEyLjEgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieS9KYXZhU2NyaXB0KQ0KKw0KKyAgUnVieQ0KKyAgKiBSZS1hZGQgYmluYXJ5IGdlbXMgZm9yIFJ1YnkgMi4zIGFuZCAyLjQuIFRoZXNlIGFyZSBFT0wgdXBzdHJlYW0sIGhvd2V2ZXINCisgICAgbWFueSBwZW9wbGUgc3RpbGwgdXNlIHRoZW0gYW5kIGRyb3BwaW5nIHN1cHBvcnQgd2lsbCByZXF1aXJlIG1vcmUNCisgICAgY29vcmRpbmF0aW9uLg0KKw0KKzIwMjAtMDUtMTIgdmVyc2lvbiAzLjEyLjAgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieS9KYXZhU2NyaXB0KQ0KKw0KKyAgUHJvdG9jb2wgQ29tcGlsZXINCisgICogW2V4cGVyaW1lbnRhbF0gU2luZ3VsYXIsIG5vbi1tZXNzYWdlIHR5cGVkIGZpZWxkcyBpbiBwcm90bzMgbm93IHN1cHBvcnQNCisgICAgcHJlc2VuY2UgdHJhY2tpbmcuIFRoaXMgaXMgZW5hYmxlZCBieSBhZGRpbmcgdGhlICJvcHRpb25hbCIgZmllbGQgbGFiZWwgYW5kDQorICAgIHBhc3NpbmcgdGhlIC0tZXhwZXJpbWVudGFsX2FsbG93X3Byb3RvM19vcHRpb25hbCBmbGFnIHRvIHByb3RvYy4NCisgICAgKiBGb3IgdXNhZ2UgaW5mbywgc2VlIGRvY3MvZmllbGRfcHJlc2VuY2UubWQuDQorICAgICogRHVyaW5nIHRoaXMgZXhwZXJpbWVudGFsIHBoYXNlLCBjb2RlIGdlbmVyYXRvcnMgc2hvdWxkIHVwZGF0ZSB0byBzdXBwb3J0DQorICAgICAgcHJvdG8zIHByZXNlbmNlLCBzZWUgZG9jcy9pbXBsZW1lbnRpbmdfcHJvdG8zX3ByZXNlbmNlLm1kIGZvciBpbnN0cnVjdGlvbnMuDQorICAqIEFsbG93IGR1cGxpY2F0ZSBzeW1ib2wgbmFtZXMgd2hlbiBtdWx0aXBsZSBkZXNjcmlwdG9yIHNldHMgYXJlIHBhc3NlZCBvbg0KKyAgICB0aGUgY29tbWFuZC1saW5lLCB0byBtYXRjaCB0aGUgYmVoYXZpb3Igd2hlbiBtdWx0aXBsZSAucHJvdG8gZmlsZXMgYXJlIHBhc3NlZC4NCisgICogRGV0ZXJtaW5pc3RpYyBgcHJvdG9jIC0tZGVzY3JpcHRvcl9zZXRfb3V0YCAoIzcxNzUpDQorDQorICBDKysNCisgICogW2V4cGVyaW1lbnRhbF0gQWRkZWQgcHJvdG8zIHByZXNlbmNlIHN1cHBvcnQuDQorICAqIE5ldyBkZXNjcmlwdG9yIEFQSXMgdG8gc3VwcG9ydCBwcm90bzMgcHJlc2VuY2UuDQorICAqIEVuYWJsZSBBcmVuYXMgYnkgZGVmYXVsdCBvbiBhbGwgLnByb3RvIGZpbGVzLg0KKyAgKiBEb2N1bWVudGVkIHRoYXQgdXNlcnMgYXJlIG5vdCBhbGxvd2VkIHRvIHN1YmNsYXNzIE1lc3NhZ2Ugb3IgTWVzc2FnZUxpdGUuDQorICAqIE1hcmsgZ2VuZXJhdGVkIGNsYXNzZXMgYXMgZmluYWw7IGluaGVyaXRpbmcgZnJvbSBwcm90b3MgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQuDQorICAqIEFkZCBzdGFjayBvdmVyZmxvdyBwcm90ZWN0aW9uIGZvciB0ZXh0IGZvcm1hdCB3aXRoIHVua25vd24gZmllbGRzLg0KKyAgKiBBZGQgYWNjZXNzb3JzIGZvciBtYXAga2V5IGFuZCB2YWx1ZSBGaWVsZERlc2NyaXB0b3JzLg0KKyAgKiBBZGQgRmllbGRNYXNrVXRpbDo6RnJvbUZpZWxkTnVtYmVycygpLg0KKyAgKiBNZXNzYWdlRGlmZmVyZW5jZXI6IHVzZSBQYXJzZVBhcnRpYWwoKSBvbiBBbnkgZmllbGRzIHNvIHRoZSBkaWZmIGRvZXMgbm90DQorICAgIGZhaWwgd2hlbiB0aGVyZSBhcmUgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuDQorICAqIFJlZmxlY3Rpb25PcHM6Ok1lcmdlKCk6IGxvb2t1cCBtZXNzYWdlcyBpbiB0aGUgcmlnaHQgZmFjdG9yeSwgaWYgaXQgY2FuLg0KKyAgKiBBZGRlZCBEZXNjcmlwdG9yOjpXZWxsS25vd25UeXBlcyBlbnVtIGFuZCBEZXNjcmlwdG9yOjp3ZWxsX2tub3duX3R5cGUoKQ0KKyAgICBhY2Nlc3NvciBhcyBhbiBlYXNpZXIgd2F5IG9mIGRldGVybWluaW5nIGlmIGEgbWVzc2FnZSBpcyBhIFdlbGwtS25vd24gVHlwZS4NCisgICogT3B0aW1pemVkIFJlcGVhdGVkRmllbGQ6OkFkZCgpIHdoZW4gaXQgaXMgdXNlZCBpbiBhIGxvb3AuDQorICAqIE1hZGUgcHJvdG8gbW92ZS9zd2FwIG1vcmUgZWZmaWNpZW50Lg0KKyAgKiBEZS12aXJ0dWFsaXplIHRoZSBHZXRBcmVuYSgpIG1ldGhvZCBpbiBNZXNzYWdlTGl0ZS4NCisgICogSW1wcm92ZXMgcGVyZm9ybWFuY2Ugb2YganNvbl9zdHJlYW1fcGFyc2VyLmNjIGJ5IGZhY3RvciAxMDAwICgjNzIzMCkNCisgICogYnVnOiAjNzA3NiB1bmRlZmluZSBXaW5kb3dzIE9VVCBhbmQgT1BUSU9OQUwgbWFjcm9zICgjNzA4NykNCisgICogRml4ZWQgYSBidWcgaW4gRmllbGREZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpIHRoYXQgd291bGQgZXJyb25lb3VzbHkgcHJpbnQNCisgICAgYW4gIm9wdGlvbmFsIiBsYWJlbCBmb3IgYSBmaWVsZCBpbiBhIG9uZW9mLg0KKyAgKiBGaXggYnVnIGluIHBhcnNpbmcgYm9vbCBleHRlbnNpb25zIHRoYXQgYXNzdW1lZCB0aGV5IGFyZSBhbHdheXMgMSBieXRlLg0KKyAgKiBGaXggb2ZmLWJ5LW9uZSBlcnJvciBpbiBGaWVsZE9wdGlvbnM6OkJ5dGVTaXplKCkgd2hlbiBleHRlbnNpb25zIGFyZSBwcmVzZW50Lg0KKyAgKiBDbGFyaWZpZWQgdGhlIGNvbW1lbnRzIHRvIHNob3cgYW4gZXhhbXBsZSBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuDQorICAgIERlc2NyaXB0b3I6OmV4dGVuc2lvbiBhbmQgRGVzY3JpcHRvclBvb2w6OkZpbmRBbGxFeHRlbnNpb25zLg0KKyAgKiBBZGQgYSBjb21waWxlciBvcHRpb24gJ2NvZGVfc2l6ZScgdG8gZm9yY2Ugb3B0aW1pemVfZm9yPWNvZGVfc2l6ZSBvbiBhbGwNCisgICAgcHJvdG9zIHdoZXJlIHRoaXMgaXMgcG9zc2libGUuDQorDQorICBKYXZhDQorICAqIFtleHBlcmltZW50YWxdIEFkZGVkIHByb3RvMyBwcmVzZW5jZSBzdXBwb3J0Lg0KKyAgKiBNYXJrIGphdmEgZW51bSBfVkFMVUUgY29uc3RhbnRzIGFzIEBEZXByZWNhdGVkIGlmIHRoZSBlbnVtIGZpZWxkIGlzIGRlcHJlY2F0ZWQNCisgICogcmVkdWNlIDxjbGluaXQ+IHNpemUgZm9yIGVudW1zIHdpdGggYWxsb3dfYWxpYXMgc2V0IHRvIHRydWUuDQorICAqIFNvcnQgbWFwIGZpZWxkcyBhbHBoYWJldGljYWxseSBieSB0aGUgZmllbGQncyBrZXkgd2hlbiBwcmludGluZyB0ZXh0cHJvdG8uDQorICAqIEZpeGVkIGEgYnVnIGluIG1hcCBzb3J0aW5nIHRoYXQgYXBwZWFyZWQgaW4gLXJjMSBhbmQgLXJjMiAoIzc1MDgpLg0KKyAgKiBUZXh0Rm9ybWF0Lm1lcmdlKCkgaGFuZGxlcyBBbnkgYXMgdG9wIGxldmVsIHR5cGUuDQorICAqIFRocm93IGEgZGVzY3JpcHRpdmUgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gY2FsbGluZw0KKyAgICBnZXRWYWx1ZURlc2NyaXB0b3IoKSBvbiBlbnVtIHNwZWNpYWwgdmFsdWUgVU5SRUNPR05JWkVEIGluc3RlYWQgb2YNCisgICAgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLg0KKyAgKiBGaXhlZCBhbiBpc3N1ZSB3aXRoIEpzb25Gb3JtYXQucHJpbnRlcigpIHdoZXJlIHNldHRpbmcgcHJpbnRpbmdFbnVtc0FzSW50cygpDQorICAgIHdvdWxkIG92ZXJyaWRlIHRoZSBjb25maWd1cmF0aW9uIHBhc3NlZCBpbnRvIGluY2x1ZGluZ0RlZmF1bHRWYWx1ZUZpZWxkcygpLg0KKyAgKiBJbXBsZW1lbnQgb3ZlcnJpZGVzIG9mIGluZGV4T2YoKSBhbmQgY29udGFpbnMoKSBvbiBwcmltaXRpdmUgbGlzdHMgcmV0dXJuZWQNCisgICAgZm9yIHJlcGVhdGVkIGZpZWxkcyB0byBhdm9pZCBhdXRvYm94aW5nIHRoZSBsaXN0IGNvbnRlbnRzLg0KKyAgKiBBZGQgb3ZlcmxvYWQgdG8gRmllbGRNYXNrVXRpbC5mcm9tU3RyaW5nTGlzdCB0aGF0IGFjY2VwdHMgYSBkZXNjcmlwdG9yLg0KKyAgKiBbYmF6ZWxdIE1vdmUgSmF2YSBydW50aW1lL3Rvb2xjaGFpbnMgaW50byAvL2phdmEgKCM3MTkwKQ0KKw0KKyAgUHl0aG9uDQorICAqIFtleHBlcmltZW50YWxdIEFkZGVkIHByb3RvMyBwcmVzZW5jZSBzdXBwb3J0Lg0KKyAgKiBbZXhwZXJpbWVudGFsXSBmYXN0IGltcG9ydCBwcm90b2J1ZiBtb2R1bGUsIG9ubHkgd29ya3Mgd2l0aCBjcHAgZ2VuZXJhdGVkIGNvZGUgbGlua2VkIGluLg0KKyAgKiBUcnVuY2F0ZSAnZmxvYXQnIGZpZWxkcyB0byA0IGJ5dGVzIG9mIHByZWNpc2lvbiBpbiBzZXR0ZXJzIGZvciBwdXJlLVB5dGhvbg0KKyAgICBpbXBsZW1lbnRhdGlvbiAoQysrIGV4dGVuc2lvbiB3YXMgYWxyZWFkeSBkb2luZyB0aGlzKS4NCisgICogRml4ZWQgYSBtZW1vcnkgbGVhayBpbiBDKysgYmluZGluZ3MuDQorICAqIEFkZGVkIGEgZGVwcmVjYXRpb24gd2FybmluZyB3aGVuIGNvZGUgdHJpZXMgdG8gY3JlYXRlIERlc2NyaXB0b3Igb2JqZWN0cw0KKyAgICBkaXJlY3RseS4NCisgICogRml4IHVuaW50ZW5kZWQgY29tcGFyaXNvbiBiZXR3ZWVuIGJ5dGVzIGFuZCBzdHJpbmcgaW4gZGVzY3JpcHRvci5weS4NCisgICogQXZvaWQgcHJpbnRpbmcgZXhjZXNzIGRpZ2l0cyBmb3IgZmxvYXQgZmllbGRzIGluIFRleHRGb3JtYXQuDQorICAqIFJlbW92ZSBQeXRob24gMi41IHN5bnRheCBjb21wYXRpYmlsaXR5IGZyb20gdGhlIHByb3RvIGNvbXBpbGVyIGdlbmVyYXRlZCBfcGIyLnB5IG1vZHVsZSBjb2RlLg0KKyAgKiBEcm9wIDMuMywgMy40IGFuZCB1c2Ugc2luZ2xlIHZlcnNpb24gZG9ja2VyIGltYWdlcyBmb3IgYWxsIHB5dGhvbiB0ZXN0cyAoIzczOTYpDQorDQorICBKYXZhU2NyaXB0DQorICAqIEZpeCBqcyBtZXNzYWdlIHBpdm90IHNlbGVjdGlvbiAoIzY4MTMpDQorDQorICBQSFANCisgICogUGVyc2lzdGVudCBEZXNjcmlwdG9yIFBvb2wgKCM2ODk5KQ0KKyAgKiBJbXBsZW1lbnQgbGF6eSBsb2FkaW5nIG9mIHBocCBjbGFzcyBmb3IgcHJvdG8gbWVzc2FnZXMgKCM2OTExKQ0KKyAgKiBDb3JyZWN0IEByZXR1cm4gaW4gQW55LnVucGFjayBkb2NibG9jayAoIzcwODkpDQorICAqIElnbm9yZSB1bmtub3duIGVudW0gdmFsdWUgd2hlbiBpZ25vcmVfdW5rbm93biBzcGVjaWZpZWQgKCM3NDU1KQ0KKw0KKyAgUnVieQ0KKyAgKiBbZXhwZXJpbWVudGFsXSBJbXBsZW1lbnRlZCBwcm90bzMgcHJlc2VuY2UgZm9yIFJ1YnkuICgjNzQwNikNCisgICogU3RvcCBidWlsZGluZyBiaW5hcnkgZ2VtcyBmb3IgcnVieSA8Mi41ICgjNzQ1MykNCisgICogRml4IGZvciB3cmFwcGVycyB3aXRoIGEgemVybyB2YWx1ZSAoIzcxOTUpDQorICAqIEZpeCBmb3IgSlNPTiBzZXJpYWxpemF0aW9uIG9mIDAvZW1wdHktdmFsdWVkIHdyYXBwZXIgdHlwZXMgKCM3MTk4KQ0KKyAgKiBDYWxsICJDbGFzcyNuZXciIG92ZXIgcmJfY2xhc3NfbmV3X2luc3RhbmNlIGluIGRlY29kaW5nICgjNzM1MikNCisgICogQnVpbGQgZXh0ZW5zaW9ucyBmb3IgUnVieSAyLjcgKCM3MDI3KQ0KKyAgKiBhc3NpZ25pbmcgJ25pbCcgdG8gc3VibWVzc2FnZSBzaG91bGQgY2xlYXIgdGhlIGZpZWxkLiAoIzczOTcpDQorDQorICBDIw0KKyAgKiBbZXhwZXJpbWVudGFsXSBBZGQgc3VwcG9ydCBmb3IgcHJvdG8zIHByZXNlbmNlIGZpZWxkcyBpbiBDIyAoIzczODIpDQorICAqIE1hcmsgR2V0T3B0aW9uIEFQSSBhcyBvYnNvbGV0ZSBhbmQgZXhwb3NlIHRoZSAiR2V0T3B0aW9ucygpIiBtZXRob2Qgb24gZGVzY3JpcHRvcnMgaW5zdGVhZCAoIzc0OTEpDQorICAqIFJlbW92ZSBIYXMvQ2xlYXIgbWVtYmVycyBmb3IgQyMgbWVzc2FnZSBmaWVsZHMgaW4gcHJvdG8yICgjNzQyOSkNCisgICogRW5mb3JjZSByZWN1cnNpb24gZGVwdGggY2hlY2tpbmcgZm9yIHVua25vd24gZmllbGRzICgjNzEzMikNCisgICogRml4IGNvbmZvcm1hbmNlIHRlc3QgZmFpbHVyZXMgZm9yIEdvb2dsZS5Qcm90b2J1ZiAoIzY5MTApDQorICAqIENsZWFudXAgdmFyaW91cyBiaXRzIG9mIEdvb2dsZS5Qcm90b2J1ZiAoIzY2NzQpDQorICAqIEZpeCBsYXRlc3QgQXJndW1lbnRFeGNlcHRpb24gZm9yIEMjIGV4dGVuc2lvbnMgKCM2OTM4KQ0KKyAgKiBSZW1vdmUgdW5uZWNlc3NhcnkgYnJhbmNoIGZyb20gUmVhZFRhZyAoIzcyODkpDQorDQorICBPYmplY3RpdmUtQw0KKyAgKiBbZXhwZXJpbWVudGFsXSBPYmpDIFByb3RvMyBvcHRpb25hbCBzdXBwb3J0ICgjNzQyMSkNCisgICogQmxvY2sgc3ViY2xhc3Npbmcgb2YgZ2VuZXJhdGVkIGNsYXNzZXMgKCM3MTI0KQ0KKyAgKiBVc2UgcmVmZXJlbmNlcyB0byBPYmogQyBjbGFzc2VzIGluc3RlYWQgb2YgbmFtZXMgaW4gZGVzY3JpcHRvcnMuICgjNzAyNikNCisgICogUmV2aXNpdCBob3cgdGhlIFdLVHMgYXJlIGJ1bmRsZWQgd2l0aCBPYmpDLiAoIzcxNzMpDQorDQorICBPdGhlcg0KKyAgKiBBZGQgYSBwcm90b19sYW5nX3Rvb2xjaGFpbiBmb3IgamF2YWxpdGUgKCM2ODgyKQ0KKyAgKiBbYmF6ZWxdIFVwZGF0ZSBndGVzdCBhbmQgZGVwcmVjYXRlIC8vZXh0ZXJuYWw6e2d0ZXN0LGd0ZXN0X21haW59ICgjNzIzNykNCisgICogQWRkIGFwcGxpY2F0aW9uIG5vdGUgZm9yIGV4cGxpY2l0IHByZXNlbmNlIHRyYWNraW5nLiAoIzczOTApDQorICAqIEhvd3RvIGRvYyBmb3IgaW1wbGVtZW50aW5nIHByb3RvMyBwcmVzZW5jZSBpbiBhIGNvZGUgZ2VuZXJhdG9yLiAoIzc0MDcpDQorDQorDQorMjAyMC0wMi0xNCB2ZXJzaW9uIDMuMTEuNCAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorDQorICBDIw0KKyAgKiBGaXggbGF0ZXN0IEFyZ3VtZW50RXhjZXB0aW9uIGZvciBDIyBleHRlbnNpb25zICgjNzE4OCkNCisgICogRW5mb3JjZSByZWN1cnNpb24gZGVwdGggY2hlY2tpbmcgZm9yIHVua25vd24gZmllbGRzICgjNzIxMCkNCisNCisgIFJ1YnkNCisgICogRml4IHdyYXBwZXJzIHdpdGggYSB6ZXJvIHZhbHVlICgjNzE5NSkNCisgICogRml4IEpTT04gc2VyaWFsaXphdGlvbiBvZiAwL2VtcHR5LXZhbHVlZCB3cmFwcGVyIHR5cGVzICgjNzE5OCkNCisNCisyMDIwLTAxLTMxIHZlcnNpb24gMy4xMS4zIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIEMrKw0KKyAgKiBBZGQgT1VUIGFuZCBPUFRJT05BTCB0byB3aW5kb3dzIHBvcnRhYmlsaXR5IGZpbGVzICgjNzA4NykNCisNCisgIFBIUA0KKyAgKiBSZWZhY3RvcmVkIHVsb25nIHRvIHplbmRfdWxvbmcgZm9yIHBocDcuNCBjb21wYXRpYmlsaXR5ICgjNzE0NykNCisgICogQ2FsbCByZWdpc3Rlcl9jbGFzcyBiZWZvcmUgZ2V0Q2xhc3MgZnJvbSBkZXNjIHRvIGZpeCBzZWdmYXVsdCAoIzcwNzcpDQorDQorDQorMjAxOS0xMi0xMCB2ZXJzaW9uIDMuMTEuMiAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorDQorICBQSFANCisgICogTWFrZSBjIGV4dGVuc2lvbiBwb3J0YWJsZSBmb3IgcGhwIDcuNCAoIzY5NjgpDQorDQorDQorMjAxOS0xMi0wMiB2ZXJzaW9uIDMuMTEuMSAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorDQorICBQSFANCisgICogRXh0ZXJuIGRlY2xhcmUgcHJvdG9idWZfZ2xvYmFscyAoIzY5NDYpDQorDQorDQorMjAxOS0xMS0xOSB2ZXJzaW9uIDMuMTEuMCAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorDQorICBDKysNCisgICogTWFrZSBzZXJpYWxpemF0aW9uIG1ldGhvZCBuYW1pbmcgY29uc2lzdGVudA0KKyAgKiBNYWtlIHByb3RvIHJ1bnRpbWUgKyBnZW5lcmF0ZWQgY29kZSBmcmVlIG9mIGRlcHJlY2F0aW9uIHdhcm5pbmdzDQorICAqIE1vdmVkIFNodXRkb3duUHJvdG9idWZMaWJyYXJ5KCkgdG8gbWVzc2FnZV9saXRlLmguICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhIGRlY2xhcmF0aW9uIGlzIHN0aWxsIGF2YWlsYWJsZSBpbiBzdHVicy9jb21tb24uaCwgYnV0IHVzZXJzIHNob3VsZCBwcmVmZXIgbWVzc2FnZV9saXRlLmgNCisgICogUmVtb3ZlZCBub24tbmFtZXNwYWNlIG1hY3JvIEVYUEVDVF9PSygpDQorICAqIFJlbW92ZWQgbWF0aGxpbWl0cy5oIGZyb20gc3R1YnMgaW4gZmF2b3Igb2YgdXNpbmcgc3RkOjpudW1lcmljX2xpbWl0cyBmcm9tIEMrKzExDQorICAqIEZpeGVkIGJ1ZyBpbiBwYXJzZXIgd2hlbiBlbmRpbmcgb24gYSBncm91cCB0YWcNCisgICogQWRkIGEgaGVscGVyIGZ1bmN0aW9uIHRvIFVua25vd25GaWVsZFNldCB0byBkZWFsIHdpdGggdGhlIGNoYW5naW5nIHJldHVybiB2YWx1ZSBvZiBtZXNzYWdlOjp1bmtub3duX2ZpZWxkcygpDQorICAqIEZpeCBpbmNvcnJlY3QgdXNlIG9mIHN0cmluZ192aWV3IGl0ZXJhdG9ycw0KKyAgKiBTdXBwb3J0IGRpcmVjdCBwaWNrbGluZyBvZiBuZXN0ZWQgbWVzc2FnZXMNCisgICogU2tpcCBleHRlbnNpb24gdGFnIHZhbGlkYXRpb24gZm9yIE1lc3NhZ2VTZXQgaWYgdW5rbm93biBkZXBlbmRlbmNpZXMgYXJlIGFsbG93ZWQNCisgICogVXBkYXRlZCBkZXByZWNhdGlvbiBtYWNyb3MgdG8gYW5ub3RhdGUgZGVwcmVjYXRlZCBjb2RlICgjNjYxMikNCisgICogUmVtb3ZlIGNvbnZlcnNpb24gd2FybmluZyBpbiBNYXBFbnRyeUZ1bmNzOjpCeXRlU2l6ZUxvbmcgKCM2NzY2KQ0KKyAgKiBSZXZlcnQgIk1ha2Ugc2hhcmVkIGxpYnJhcmllcyBiZSBhYmxlIHRvIGxpbmsgdG8gTVNWQyBzdGF0aWMgcnVudGltZSBsaWJyYXJpZXMsIHNvIHRoYXQgVkMgcnVudGltZSBpcyBub3QgcmVxdWlyZWQuIiAoIzY5MTQpDQorDQorICBKYXZhDQorICAqIFJlbW92ZSB0aGUgdXNhZ2Ugb2YgTWV0aG9kSGFuZGxlLCBzbyB0aGF0IEFuZHJvaWQgdXNlcnMgcHJpb3IgdG8gQVBJIHZlcnNpb24gMjYgY2FuIHVzZSBwcm90b2J1Zi1qYXZhDQorICAqIFB1Ymxpc2ggUHJvR3VhcmQgY29uZmlnIGZvciBqYXZhbGl0ZQ0KKyAgKiBGaXggZm9yIFN0cmljdE1vZGUgZGlzayByZWFkIHZpb2xhdGlvbiBpbiBFeHRlbnNpb25SZWdpc3RyeUxpdGUNCisgICogSW5jbHVkZSBwYXJ0IG9mIHRoZSBCeXRlU3RyaW5nJ3MgY29udGVudCBpbiBpdHMgdG9TdHJpbmcoKS4NCisgICogSW5jbHVkZSB1bmtub3duIGZpZWxkcyB3aGVuIG1lcmdpbmcgcHJvdG8zIG1lc3NhZ2VzIGluIEphdmEgbGl0ZSBidWlsZGVycw0KKw0KKyAgUHl0aG9uDQorICAqIEFkZCBmbG9hdF9wcmVjaXNpb24gb3B0aW9uIGluIGpzb24gZm9ybWF0IHByaW50ZXINCisgICogT3B0aW9uYWxseSBwcmludCBieXRlcyBmaWVsZHMgYXMgbWVzc2FnZXMgaW4gdW5rbm93biBmaWVsZHMsIGlmIHBvc3NpYmxlDQorICAqIEZpZWxkUGF0aDogZml4IHRlc3RpbmcgSXNTZXQgb24gcm9vdCBwYXRoICcnDQorICAqIEV4cGVyaW1lbnRhbCBjb2RlIGdlbiAoZmFzdCBpbXBvcnQgcHJvdG9idWYgbW9kdWxlKSB3aGljaCBvbmx5IHdvcmsgd2l0aCBjcHAgZ2VuZXJhdGVkIGNvZGUgbGlua2VkIGluDQorDQorICBKYXZhU2NyaXB0DQorICAqIFJlbW92ZSBndWFyZCBmb3IgU3ltYm9sIGl0ZXJhdG9yIGZvciBqc3BiLk1hcA0KKw0KKyAgUEhQDQorICAqIEF2b2lkIHRvbyBtdWNoIG92ZXJoZWFkIGluIGxheW91dF9pbml0ICgjNjcxNikNCisgICogTGF6aWx5IENyZWF0ZSBTaW5ndWxhciBXcmFwcGVyIE1lc3NhZ2UgKCM2ODMzKQ0KKyAgKiBJbXBsZW1lbnQgbGF6eSBsb2FkaW5nIG9mIHBocCBjbGFzcyBmb3IgcHJvdG8gbWVzc2FnZXMgKCM2OTExKQ0KKw0KKyAgUnVieQ0KKyAgKiBSdWJ5IGxhenkgd3JhcHBlcnMgb3B0aW1pemF0aW9uICgjNjc5NykNCisNCisgIEMjDQorICAqIChSZXBlYXRlZEZpZWxkKTogQ2FwYWNpdHkgcHJvcGVydHkgdG8gcmVzaXplIHRoZSBpbnRlcm5hbCBhcnJheSAoIzY1MzApDQorICAqIEV4cGVyaW1lbnRhbCBwcm90bzIgc3VwcG9ydCBpcyBub3cgb2ZmaWNpYWxseSBhdmFpbGFibGUgKCM0NjQyLCAjNTE4MywgIzUzNTAsICM1OTM2KQ0KKyAgKiBHZXR0aW5nIHN0YXJ0ZWQgZG9jOiBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvbWFzdGVyL2RvY3MvY3NoYXJwL3Byb3RvMi5tZA0KKyAgKiBBZGQgbGVuZ3RoIGNoZWNrcyB0byBFeHRlbnNpb25Db2xsZWN0aW9uICgjNjc1OSkNCisgICogT3B0aW1pemUgcGFyc2luZyBvZiBzb21lIHByaW1pdGl2ZSBhbmQgd3JhcHBlciB0eXBlcyAoIzY4NDMpDQorICAqIFVzZSAzIHBhcmFtZXRlciBFbmNvZGluZy5HZXRTdHJpbmcgZm9yIGRlZmF1bHQgc3RyaW5nIHZhbHVlcyAoIzY4MjgpDQorICAqIENoYW5nZSBfRXh0ZW5zaW9ucyBwcm9wZXJ0eSB0byBub3JtYWwgYm9keSByYXRoZXIgdGhhbiBleHByZXNzaW9uICgjNjg1NikNCisNCisgIE9iamVjdGl2ZSBDDQorICAqIEZpeGVkIHVuYWxpZ25lZCByZWFkcyBmb3IgMzJiaXQgYXJtIHdpdGggbmV3ZXIgWGNvZGUgdmVyc2lvbnMgKCM2Njc4KQ0KKw0KKw0KKzIwMTktMDktMDMgdmVyc2lvbiAzLjEwLjAgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieS9KYXZhU2NyaXB0KQ0KKw0KKyAgQysrDQorICAqIFN3aXRjaCB0aGUgcHJvdG8gcGFyc2VyIHRvIHRoZSBmYXN0ZXIgTU9NSSBwYXJzZXIuDQorICAqIFByb3Blcmx5IGVzY2FwZSBTdHJ1Y3Qga2V5cyBpbiB0aGUgcHJvdG8zIEpTT04gc2VyaWFsaXplci4NCisgICogRml4IGNyYXNoIG9uIHVuaW5pdGlhbGl6ZWQgbWFwIGVudHJpZXMuDQorICAqIEluZm9ybWVkIHRoZSBjb21waWxlciBvZiBoYXMtYml0IGludmFyaWFudCB0byBwcm9kdWNlIGJldHRlciBjb2RlDQorICAqIFVudXNlZCBpbXBvcnRzIG9mIGZpbGVzIGRlZmluaW5nIGRlc2NyaXB0b3IgZXh0ZW5zaW9ucyB3aWxsIG5vdyBiZSByZXBvcnRlZA0KKyAgKiBBZGQgcHJvdG8yOjp1dGlsOjpSZW1vdmVTdWJyYW5nZXMgdG8gcmVtb3ZlIG11bHRpcGxlIHN1YnJhbmdlcyBpbiBsaW5lYXIgdGltZS4NCisgICogQWRkZWQgQmFzZVRleHRHZW5lcmF0b3I6OkdldEN1cnJlbnRJbmRlbnRhdGlvblNpemUoKQ0KKyAgKiBNYWRlIGltcGxpY2l0IHdlYWsgZmllbGRzIGNvbXBhdGlibGUgd2l0aCB0aGUgQXBwbGUgbGlua2VyDQorICAqIFN1cHBvcnQgMzIgYml0IHZhbHVlcyBmb3IgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXIgdG8gU3RydWN0Lg0KKyAgKiBSZW1vdmVkIHRoZSBpbnRlcm5hbC1vbmx5IGhlYWRlciBjb2RlZF9zdHJlYW1faW5sLmggYW5kIHRoZSBpbnRlcm5hbC1vbmx5IG1ldGhvZHMgZGVmaW5lZCB0aGVyZS4NCisgICogRW5mb3JjZWQgbm8gU1dJRyB3cmFwcGluZyBvZiBkZXNjcmlwdG9yX2RhdGFiYXNlLmggKG90aGVyIGhlYWRlcnMgYWxyZWFkeSBoYWQgdGhpcyByZXN0cmljdGlvbikuDQorICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBNT01JIHBhcnNlciBmb3Igc2VyaWFsaXphdGlvbi4gVGhpcyByZW1vdmVzIG9uZSBvZiB0aGUgdHdvIHNlcmlhbGl6YXRpb24gcm91dGluZXMsIGJ5IG1ha2luZyB0aGUgZmFzdCBhcnJheSBzZXJpYWxpemF0aW9uIHJvdXRpbmUgY29tcGxldGVseSBnZW5lcmFsLiBTZXJpYWxpemVUb0NvZGVkU3RyZWFtIGNhbiBub3cgYmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlIG11Y2ggbXVjaCBmYXN0ZXIgYXJyYXkgc2VyaWFsaXphdGlvbi4gVGhlIGFycmF5IHNlcmlhbGl6YXRpb24gcmVncmVzc2VzIHNsaWdodGx5LCBidXQgd2hlbiBhcnJheSBzZXJpYWxpemF0aW9uIGlzIG5vdCBwb3NzaWJsZSB0aGlzIHdpbnMgYmlnLg0KKyAgKiBEbyBub3QgY29udmVydCB1bmtub3duIGZpZWxkIG5hbWUgdG8gc25ha2UgY2FzZSB0byBhY2N1cmF0ZWx5IHJlcG9ydCBlcnJvci4NCisgICogRml4IGEgVUJTQU4gd2FybmluZ3MuICgjNjMzMykNCisgICogQWRkIHBvZHNwZWMgZm9yIEMrKyAoIzY0MDQpDQorICAqIHByb3RvYzogZml4IHNvdXJjZSBjb2RlIGluZm8gbG9jYXRpb24gZm9yIG1pc3NpbmcgbGFiZWwgKCM2NDM2KQ0KKyAgKiBDKysgQWRkIG1vdmUgY29uc3RydWN0b3IgZm9yIFJlZmxlY3Rpb24ncyBTZXRTdHJpbmcgKCM2NDc3KQ0KKw0KKyAgSmF2YQ0KKyAgKiBDYWxsIGxvYWREZXNjcmlwdG9yIG91dHNpZGUgb2Ygc3luY2hyb25pemVkIGJsb2NrIHRvIHJlbW92ZSBvbmUgcG9zc2libGUgc291cmNlIG9mIGRlYWRsb2NrLg0KKyAgKiBIYXZlIG9uZW9mIGVudW1zIGltcGxlbWVudCBhIHNlcGFyYXRlIGludGVyZmFjZSAob3RoZXIgdGhhbiBFbnVtTGl0ZSkgZm9yIGNsYXJpdHkuDQorICAqIE9wZW5zb3VyY2UgQW5kcm9pZCBNZW1vcnkgQWNjZXNzb3JzDQorICAqIFVwZGF0ZSBUZXh0Rm9ybWF0IHRvIG1ha2UgdXNlIG9mIHRoZSBuZXcgVHlwZVJlZ2lzdHJ5Lg0KKyAgKiBTdXBwb3J0IGdldEZpZWxkQnVpbGRlciBhbmQgZ2V0UmVwZWF0ZWRGaWVsZEJ1aWxkZXIgaW4gRXh0ZW5kYWJsZUJ1aWxkZXINCisgICogVXBkYXRlIEpzb25Gb3JtYXQgdG8gbWFrZSB1c2Ugb2YgdGhlIG5ldyBUeXBlUmVnaXN0cnkuDQorICAqIEFkZCBwcm9ndWFyZCBjb25maWcgZ2VuZXJhdG9yIGZvciBHbW1CZW5jaG1hcmtTdWl0ZUxpdGUuDQorICAqIENoYW5nZSBQcm90b2J1ZkFycmF5TGlzdCB0byB1c2UgT2JqZWN0W10gaW5zdGVhZCBvZiBBcnJheUxpc3QgZm9yIDUtMTAlIGZhc3RlciBwYXJzaW5nDQorICAqIEltcGxlbWVudCBQcm90b2J1ZkFycmF5TGlzdC5hZGQoRSkgZm9yIDIwJSAoNSUtNDAlKSBmYXN0ZXIgb3ZlcmFsbCBwcm90b2xpdGUyIHBhcnNpbmcNCisgICogTWFrZSBhIGNvcHkgb2YgSnNvbkZvcm1hdC5UeXBlUmVnaXN0cnkgYXQgdGhlIHByb3RvYnVmIHRvcCBsZXZlbCBwYWNrYWdlLiBUaGlzIHdpbGwgZXZlbnR1YWxseSByZXBsYWNlIEpzb25Gb3JtYXQuVHlwZVJlZ2lzdHJ5Lg0KKyAgKiBGaXggamF2YWRvYyB3YXJuaW5ncyBpbiBnZW5lcmF0ZWQgZmlsZXMgKCM2MjMxKQ0KKyAgKiBKYXZhOiBBZGQgQXV0b21hdGljLU1vZHVsZS1OYW1lIGVudHJpZXMgdG8gdGhlIE1hbmlmZXN0ICgjNjU2OCkNCisNCisgIFB5dGhvbg0KKyAgKiBBZGQgZGVzY3JpcHRvciBtZXRob2RzIGluIGRlc2NyaXB0b3JfcG9vbCBhcmUgZGVwcmVjYXRlZC4NCisgICogVXNlcyBleHBsaWNpdCBpbXBvcnRzIHRvIHByZXZlbnQgbXVsdGl0aHJlYWQgdGVzdCBmYWlsdXJlcyBpbiBweTMuDQorICAqIEFkZGVkIF9fZGVsaXRlbV9fIGZvciBQeXRob24gZXh0ZW5zaW9uIGRpY3QNCisgICogVXBkYXRlIHNpeCB2ZXJzaW9uIHRvIDEuMTIuMCBhbmQgZml4IGxlZ2FjeV9jcmVhdGVfaW5pdCBpc3N1ZSAoIzYzOTEpDQorDQorICBKYXZhU2NyaXB0DQorICAqIFJlbW92ZSBkZXByZWNhdGVkIGJvb2xlYW4gb3B0aW9uIHRvIGdldFJlc3VsdEJhc2U2NFN0cmluZygpLg0KKyAgKiBGaXggc2ludDY0IHppZy16YWcgZW5jb2RpbmcuDQorICAqIFNpbXBsaWZ5IGhhc2g2NCBzdHJpbmcgY29udmVyc2lvbiB0byBhdm9pZCBESUdJVCBhcnJheS4gU2hvdWxkIHJlZHVjZSBvdmVyaGVhZCBpZiB0aGVzZSBmdW5jdGlvbnMgYXJlbid0IHVzZWQsIGFuZCBiZSBtb3JlIGVmZmljaWVudCBieSBhdm9pZGluZyBsaW5lYXIgYXJyYXkgc2VhcmNoZXMuDQorICAqIENoYW5nZSB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIGJpbmFyeVJlYWRlckZuIGluIEV4dGVuc2lvbkZpZWxkQmluYXJ5SW5mbyB0byAobnVtYmVyLCA/LCA/KS4NCisgICogQ3JlYXRlIGRhdGVzLnRzIGFuZCB0aW1lX29mX2RheXMudHMgdG8gbWlycm9yIEphdmEgdmVyc2lvbnMuIFRoaXMgaXMgYSBuZWFyLWlkZW50aWNhbCBjb252ZXJzaW9uIG9mIGMuZy50eXBlLnV0aWwue0RhdGVzLFRpbWVPZkRheXN9IHJlc3BlY3RpdmVseS4NCisgICogTWlncmF0ZSBtb25leXMgdG8gVHlwZVNjcmlwdC4NCisNCisgIFBIUA0KKyAgKiBGaXggaW5jb3JyZWN0IGxlYXAgZGF5IGZvciBUaW1lc3RhbXAgKCM2Njk2KQ0KKyAgKiBJbml0aWFsaXplIHdlbGwga25vd24gdHlwZSB2YWx1ZXMgKCM2NzEzKQ0KKw0KKyAgUnVieQ0KKyAgKiBGaXggc2NvcGUgcmVzb2x1dGlvbiBmb3IgR29vZ2xlIG5hbWVzcGFjZSAoIzU4NzgpDQorICAqIFN1cHBvcnQgaGFzaGVzIGZvciBzdHJ1Y3QgaW5pdGlhbGl6ZXJzICgjNTcxNikNCisgICogT3B0aW1pemVkIGF3YXkgdGhlIGNyZWF0aW9uIG9mIGVtcHR5IHN0cmluZyBvYmplY3RzLiAoIzY1MDIpDQorICAqIFJvbGwgZm9yd2FyZCBSdWJ5IHVwYiBjaGFuZ2VzIG5vdyB0aGF0IHByb3RvYnVmIFJ1YnkgYnVpbGQgaXMgZml4ZWQgKCM1ODY2KQ0KKyAgKiBPcHRpbWl6ZWQgbGF5b3V0X21hcmsoKSBmb3IgUnVieSAoIzY1MjEpDQorICAqIE9wdGltaXphdGlvbiBmb3IgbGF5b3V0X2luaXQoKSAoIzY1NDcpDQorICAqIEZpeCBmb3IgR0Mgb2YgUnVieSBtYXAgZnJhbWVzLiAoIzY1MzMpDQorICAqIEZpeGVkIGxlYXAgeWVhciBoYW5kbGluZyBieSByZXdvcmtpbmcgdXBiX21rdGltZSgpIC0+IHVwYl90aW1lZ20oKS4gKCM2Njk1KQ0KKw0KKyAgT2JqZWN0aXZlIEMNCisgICogUmVtb3ZlIE9TUmVhZExpdHRsZSogZHVlIHRvIGFsaWdubWVudCByZXF1aXJlbWVudHMgKCM2Njc4KQ0KKyAgKiBEb24ndCB1c2UgdW5pb25zIGFuZCBpbnN0ZWFkIHVzZSBtZW1jcHkgZm9yIHRoZSB0eXBlIHN3YXBzLiAoIzY2NzIpDQorDQorICBPdGhlcg0KKyAgKiBPdmVycmlkZSBDb2NvYVBvZHMgbW9kdWxlIHRvIGxvd2VyY2FzZSAoIzY0NjQpDQorDQorDQorMjAxOS0wNi0yOCB2ZXJzaW9uIDMuOS4wIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIEMrKw0KKyAgKiBPcHRpbWl6ZSBhbmQgc2ltcGxpZnkgaW1wbGVtZW50YXRpb24gb2YgUmVwZWF0ZWRQdHJGaWVsZEJhc2UNCisgICogRG9uJ3QgY3JlYXRlIHVubmVjZXNzYXJ5IHVua25vd24gZmllbGQgc2V0cy4NCisgICogUmVtb3ZlIGJyYW5jaCBmcm9tIGFjY2Vzc29ycyB0byByZXBlYXRlZCBmaWVsZCBlbGVtZW50IGFycmF5Lg0KKyAgKiBBZGRlZCBkZWxpbWl0ZWQgcGFyc2UgYW5kIHNlcmlhbGl6ZSB1dGlsLg0KKyAgKiBSZWR1Y2Ugc2l6ZSBieSBub3QgZW1pdHRpbmcgY29uc3RhbnRzIGZvciBmaWVsZG51bWJlcnMNCisgICogRml4IGEgYnVnIHdoZW4gY29tcGFyaW5nIGZpbml0ZSBhbmQgaW5maW5pdGUgZmllbGQgdmFsdWVzIHdpdGggZXhwbGljaXQgdG9sZXJhbmNlcy4NCisgICogVGV4dEZvcm1hdDo6UGFyc2VyIHNob3VsZCB1c2UgYSBjdXN0b20gRmluZGVyIHRvIGxvb2sgdXAgZXh0ZW5zaW9ucyBieSBudW1iZXIgaWYgb25lIGlzIHByb3ZpZGVkLg0KKyAgKiBBZGQgTWVzc2FnZUxpdGU6OlV0ZjhEZWJ1Z1N0cmluZygpIHRvIG1ha2UgTWVzc2FnZUxpdGUgbW9yZSBjb21wYXRpYmxlIHdpdGggTWVzc2FnZS4NCisgICogRmFpbCBmYXN0IGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgaW4gRGVzY3JpcHRvclBvb2w6OkZpbmRFeHRlbnNpb25CeU51bWJlcigpIGlmIGRlc2NyaXB0b3IgaGFzIG5vIGRlZmluZWQgZXh0ZW5zaW9ucy4NCisgICogQWRkaW5nIHRoZSBmaWxlIG5hbWUgdG8gaGVscCBkZWJ1ZyBjb2xsaWRpbmcgZXh0ZW5zaW9ucw0KKyAgKiBBZGRlZCBGaWVsZERlc2NyaXB0b3I6OlByaW50YWJsZU5hbWVGb3JFeHRlbnNpb24oKSBhbmQgRGVzY3JpcHRvclBvb2w6OkZpbmRFeHRlbnNpb25CeVByaW50YWJsZU5hbWUoKS4NCisgICAgVGhlIGxhdHRlciB3aWxsIHJlcGxhY2UgUmVmbGVjdGlvbjo6RmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKCkuDQorICAqIFJlcGxhY2UgTlVMTCB3aXRoIG51bGxwdHINCisgICogQ3JlYXRlZCBhIG5ldyBBZGQgbWV0aG9kIGluIHJlcGVhdGVkIGZpZWxkIHRoYXQgYWxsb3dzIGFkZGluZyBhIHJhbmdlIG9mIGVsZW1lbnRzIGFsbCBhdCBvbmNlLg0KKyAgKiBFbmFibGVkIGVudW0gbmFtZS10by12YWx1ZSBtYXBwaW5nIGZ1bmN0aW9ucyBmb3IgQysrIGxpdGUNCisgICogQXZvaWQgZHluYW1pYyBpbml0aWFsaXphdGlvbiBpbiBkZXNjcmlwdG9yLnByb3RvIGdlbmVyYXRlZCBjb2RlDQorICAqIE1vdmUgc3RyZWFtIGZ1bmN0aW9ucyB0byBNZXNzYWdlTGl0ZSBmcm9tIE1lc3NhZ2UuDQorICAqIE1vdmUgYWxsIHplcm9fY29weV9zdHJlYW0gZnVuY3Rpb25hbGl0eSB0byBpb19saXRlLg0KKyAgKiBEbyBub3QgY3JlYXRlIGFycmF5IG9mIG1hdGNoZWQgZmllbGRzIGZvciBzaW1wbGUgcmVwZWF0ZWQgZmllbGRzDQorICAqIEVuYWJsaW5nIHNpbGVudCBtb2RlIGJ5IGRlZmF1bHQgdG8gcmVkdWNlIG1ha2UgY29tcGlsYXRpb24gbm9pc2UuICgjNjIzNykNCisNCisgIEphdmENCisgICogRXhwb3NlIFRleHRGb3JtYXQuUHJpbnRlciBhbmQgbWFrZSBpdCBjb25maWd1cmFibGUuIERlcHJlY2F0ZSB0aGUgc3RhdGljIG1ldGhvZHMuDQorICAqIExpYnJhcnkgZm9yIGNvbnN0cnVjdGluZyBnb29nbGUucHJvdG9idWYuU3RydWN0IGFuZCBnb29nbGUucHJvdG9idWYuVmFsdWUNCisgICogTWFrZSBPbmVvZkRlc2NyaXB0b3IgZXh0ZW5kIEdlbmVyaWNEZXNjcmlwdG9yLg0KKyAgKiBFeHBvc2Ugc3RyZWFtaW5nbmVzcyBvZiBzZXJ2aWNlIG1ldGhvZHMgZnJvbSBNZXRob2REZXNjcmlwdG9yLg0KKyAgKiBGaXggYSBidWcgd2hlcmUgVGV4dEZvcm1hdCBmYWlscyB0byBwYXJzZSBBbnkgZmlsZWQgd2l0aCA+IDEgZW1iZWRkZWQgbWVzc2FnZSBzdWItZmllbGRzLg0KKyAgKiBFc3RhYmxpc2ggY29uc2lzdGVudCBKc29uRm9ybWF0IGJlaGF2aW9yIGZvciBudWxscyBpbiBvbmVvZnMsIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIuDQorICAqIFVwZGF0ZSBHU09OIHZlcnNpb24gdG8gMy44LjUuICgjNjI2OCkNCisgICogQWRkIGBwcm90b2J1Zl9qYXZhX2xpdGVgIEJhemVsIHRhcmdldC4gKCM2MTc3KQ0KKw0KKyAgUHl0aG9uDQorICAqIENoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiBOYW1lKCkgZm9yIGVudW1zIHRoYXQgYWxsb3cgYWxpYXNlcyBpbiBwcm90bzIgaW4gUHl0aG9uDQorICAgIHRvIGJlIGluIGxpbmUgd2l0aCBjbGFpbXMgaW4gQysrIGltcGxlbWVudGF0aW9uICh0byByZXR1cm4gZmlyc3QgdmFsdWUpLg0KKyAgKiBFeHBsaWNpdGx5IHNheSB3aGF0IGZpZWxkIGNhbm5vdCBiZSBzZXQgd2hlbiB0aGUgbmV3IHZhbHVlIGZhaWxzIGEgdHlwZSBjaGVjay4NCisgICogRHVwbGljYXRlIHJlZ2lzdGVyIGluIGRlc2NyaXB0b3IgcG9vbCB3aWxsIHJhaXNlIGVycm9ycw0KKyAgKiBBZGQgX19zbG90c19fIHRvIGFsbCB3ZWxsX2tub3duX3R5cGVzIGNsYXNzZXMsIGN1c3RvbSBhdHRyaWJ1dGVzIGFyZSBub3QgYWxsb3dlZCBhbnltb3JlLg0KKyAgKiB0ZXh0X2Zvcm1hdCBvbmx5IHByZXNlbnQgOCB2YWxpZCBkaWdpdHMgZm9yIGZsb2F0IGZpZWxkcyBieSBkZWZhdWx0DQorDQorICBKYXZhU2NyaXB0DQorICAqIEFkZCBPbmVvZiBlbnVtIHRvIHRoZSBsaXN0IG9mIGdvb2cucHJvdmlkZQ0KKw0KKyAgUEhQDQorICAqIE1ha2UgcGhwIG1lc3NhZ2UgY2xhc3MgZmluYWwgdG8gYXZvaWQgbW9ja2luZy4gKCM2Mjc3KQ0KKyAgKiBSZW5hbWUgZ2V0L3NldFhYWFZhbHVlIHRvIGdldC9zZXRYWFhXcmFwcGVyLiAoIzYyOTUpDQorDQorICBSdWJ5DQorICAqIFJlbW92ZSB0b19oYXNoIG1ldGhvZHMuICgjNjE2NikNCisNCisNCisyMDE5LTA0LTI5IHZlcnNpb24gMy44LjAgKEMrKy9KYXZhL1B5dGhvbi9QSFAvT2JqZWN0aXZlLUMvQyMvUnVieS9KYXZhU2NyaXB0KQ0KKw0KKyAgQysrDQorICAqIFVzZSBzdGQ6OmF0b21pYzxpbnQzMj4gaW4gY2FzZSBvZiBteXJpYWQyIHBsYXRmb3JtDQorICAqIEFsd2F5cyBkZWNsYXJlIGVudW1zIHRvIGJlIGludC1zaXplZA0KKyAgKiBBZGRlZCBEZWJ1Z1N0cmluZygpIGFuZCBTaG9ydERlYnVnU3RyaW5nKCkgbWV0aG9kcyBvbiBNZXNzYWdlTGl0ZQ0KKyAgKiBTcGVjaWFsaXplZCBkaWZmZXJlbnQgcGFyc2UgbG9vcCBjb250cm9sIGZsb3dzDQorICAqIE1ha2UgaGFzYml0cyBwb3RlbnRpYWxseSBpbiByZWdpc3Rlci4gVGhlIG9yJ3Mgc3RhcnQgZm9ybWluZyBhbiBvYnN0YWNsZSBiZWNhdXNlIGl0J3MgYSByZWFkIG1vZGlmeSBzdG9yZSBvbiB0aGUgc2FtZSBtZW0gYWRkcmVzcyBvbiBlYWNoIGl0ZXJhdGlvbi4NCisgICogTW92ZSB0byBhbiBpbnRlcm5hbCBNQUNSTyBmb3IgcGFyc2VyIHZhbGlkaXR5IGNoZWNrcy4NCisgICogSW1wcm92ZSBtYXAgcGFyc2luZyBwZXJmb3JtYW5jZS4NCisgICogTWFrZSBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0gbm9uIHZpcnR1YWwuIFRoaXMgYWxsb3dzIGRpcmVjdCBjYWxscywgcG90ZW50aWFsIGlubGluaW5nIGFuZCBpcyBhbHNvIGEgY29kZSBoZWFsdGggaW1wcm92ZW1lbnQNCisgICogQWRkIGFuIG92ZXJhbGwgbGltaXQgdG8gcGFyc2VfY29udGV4dCB0byBwcmV2ZW50IHJlYWRpbmcgcGFzdCBpdC4gVGhpcyBhbGxvd3MgdG8gcmVtb3ZlIGEgYW5ub3lpbmcgbGV2ZWwgb2YgaW5kaXJlY3Rpb24uDQorICAqIEZpeCBhIG1pc3Rha2UsIHdlIHNob3VsZG4ndCB2ZXJpZnkgbWFwIGtleS92YWx1ZSBzdHJpbmdzIGZvciB1dGY4IGluIG9wdCBtb2RlIGZvciBwcm90bzIuDQorICAqIEZ1cnRoZXIgaW1wcm92ZW1lbnRzIHRvIGN1dCBiaW5hcnkgc2l6ZS4NCisgICogUHJlcGFyZSB0byBtYWtlIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSBub24tdmlydHVhbC4NCisgICogQSByZXBvcnQgb24gc29tZSBpbnRlcmVzdGluZyBiZWhhdmlvciBjaGFuZ2UgaW4gcHl0aG9uIChjYXVzZWQgYnkgYi8yNzQ5NDIxNikgbWFkZSBtZSByZWFsaXplIHRoZXJlIGlzIGEgY2hlY2sgdGhhdCBuZWVkcyB0byBiZSBkb25lIGluIGNhc2UgdGhlIHBhcnNlIGVuZGVkIG9uIGEgZW5kIGdyb3VwIHRhZy4NCisgICogQWRkIGEgbm90ZSBvZiBjYXV0aW9uIHRvIHRoZSBjb21tZW50cyBhcm91bmQgc2tpcCBpbiBDb2RlZE91dHB1dFN0cmVhbS4NCisgICogU2ltcGxpZnkgZW5kIGNoZWNrLg0KKyAgKiBBZGQgb3ZlcmxvYWQgZm9yIFBhcnNlTWVzc2FnZSBmb3IgTWVzc2FnZUxpdGUvTWVzc2FnZSB0eXBlcy4gSWYgdGhlIGV4cGxpY2l0IHR5cGUgaXMgbm90IGtub3duIGlubGluaW5nIHdvbid0IGhlbHAgZGUtdmlydHVhbGl6aW5nIHRoZSB2aXJ0dWFsIGNhbGwuDQorICAqIFJlZHVjZSBsaW5rZXIgaW5wdXQuIEl0IHR1cm5zIG91dCB0aGF0IFBhcnNlTWVzc2FnZSBpcyBub3QgaW5saW5lZCwgcHJvZHVjaW5nICB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ucyB0aGF0IGFyZSB1c2VkIG9ubHkgb25jZSBhbmQgc2F2ZSBub3RoaW5nIGJ1dCBjb3N0IG1vcmUuDQorICAqIEltcHJvdmUgdGhlIHBhcnNlci4NCisgICogW2MrKzE3XSBDaGFuZ2VkIHByb3RvMjo6UmVwZWF0ZWRQdHJGaWVsZCBpdGVyYXRvcnMgdG8gbm8gbG9uZ2VyIGRlcml2ZSBmcm9tIHRoZSBkZXByZWNhdGVkIHN0ZDo6aXRlcmF0b3IgY2xhc3MuDQorICAqIENoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBjYXNlX2luc2Vuc2l0aXZlX2VudW1fcGFyc2luZyB0byBmYWxzZSBmb3IgSnNvblN0cmluZ1RvTWVzc2FnZS4NCisgICogQWRkIGEgd2FybmluZyBpZiBhIGZpZWxkIG5hbWUgZG9lc24ndCBtYXRjaCB0aGUgc3R5bGUgZ3VpZGUuDQorICAqIEZpeCBUZXh0Rm9ybWF0IG5vdCByb3VuZC10cmlwIGNvcnJlY3RseSB3aGVuIGZsb2F0IHZhbHVlIGlzIG1heCBmbG9hdC4NCisgICogQWRkZWQgbG9jYXRpb25lZCBpbmZvIGZvciBzb21lIGVycm9ycyBhdCBjb21waWxlcg0KKyAgKiBQeXRob24gcmVzZXJ2ZWQga2V5d29yZHMgYXJlIG5vdyB3b3JraW5nIHdpdGggZ2V0YXR0cigpL3NldGF0dHIoKSBmb3IgbW9zdCBkZXNjcmlwdG9ycy4NCisgICogQWRkZWQgQWxsb3dVbmtub3duRmllbGQoKSBpbiB0ZXh0X2Zvcm1hdA0KKyAgKiBBcHBlbmQgJ18nIHRvIEMrKyByZXNlcnZlZCBrZXl3b3JkcyBmb3IgbWVzc2FnZSwgZW51bSwgZXh0ZW5zaW9uDQorICAqIEZpeCBNU1ZDIHdhcm5pbmcgQzQyNDQgaW4gcHJvdG9idWYncyBwYXJzZV9jb250ZXh0LmguDQorICAqIFVwZGF0aW5nIEl0ZXJhdG9ycyB0byBiZSBjb21wYXRpYmxlIHdpdGggQysrMTcgaW4gTVNWQy4NCisgICogVXNlIGNhcGFiaWxpdHkgYW5ub3RhdGlvbiBpbiBtdXRleC5oDQorICAqIEZpeCAiVW5kZWZpbmVkQmVoYXZpb3JTYW5pdGl6ZXI6IGNmaS1iYWQtdHlwZSINCisgICogQ3JpdGljYWxTZWN0aW9uTG9jayBjbGFzcyBhcyBhIGxpZ2h0d2VpZ2h0IHJlcGxhY2VtZW50IGZvciBzdGQ6Om11dGV4IG9uIFdpbmRvd3MgcGxhdGZvcm1zLg0KKyAgKiBSZW1vdmVkIHZlc3RpZ2lhbCB3aXJlX2Zvcm1hdF9saXRlX2lubC5oDQorDQorICBDIw0KKyAgKiBBZGRlZCBTeXN0ZW0uTWVtb3J5IGRlcGVuZGVuY3kuDQorDQorICBKYXZhDQorICAqIE1ha2UgSmF2YSBwcm90b2MgY29kZSBnZW5lcmF0b3IgaWdub3JlIG9wdGltaXplX2ZvciBMSVRFX1JVTlRJTUUuIFVzZXJzIHNob3VsZCBpbnN0ZWFkIHVzZSB0aGUgSmF2YSBsaXRlIHByb3RvYyBwbHVnaW4uDQorICAqIENoYW5nZSBFeHRlbnNpb24gZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpIHRvIHJldHVybiBNZXNzYWdlIGluc3RlYWQgb2YgTWVzc2FnZUxpdGUuDQorICAqIFByZXZlbnQgbWFsaWNpb3VzIGlucHV0IHN0cmVhbXMgZnJvbSBsZWFraW5nIGJ1ZmZlcnMgZm9yIEJ5dGVTdHJpbmcgb3IgQnl0ZUJ1ZmZlciBwYXJzaW5nLg0KKyAgKiBSZWxlYXNlIG5ldyBKYXZhbGl0ZSBydW50aW1lLg0KKyAgKiBTaG93IHdhcm5pbmcgaW4gY2FzZSBwb3RlbnRpYWwgZmlsZSBuYW1lIGNvbmZsaWN0Lg0KKyAgKiBBbGxvdyBKYXZhIHJlc2VydmVkIGtleXdvcmRzIHRvIGJlIHVzZWQgaW4gZXh0ZW5zaW9ucy4NCisgICogQWRkZWQgc2V0QWxsb3dVbmtub3duRmllbGRzKCkgaW4gdGV4dCBmb3JtYXQNCisgICogQWRkIG1lbW9pemF0aW9uIHRvIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5nZXRFbXB0eVJlZ2lzdHJ5KCkNCisgICogSW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBDb2RlZE91dHB1dFN0cmVhbS53cml0ZVVJbnQzMk5vVGFnDQorICAqIEFkZCBhbiBvcHRpbWl6ZWQgbWlzbWF0Y2gtZmluZGluZyBhbGdvcml0aG0gdG8gVW5zYWZlVXRpbC4NCisgICogV2hlbiBzZXJpYWxpemluZyB1aW50MzIgdmFyaW50cywgY2hlY2sgdGhhdCB3ZSBoYXZlIE1BWF9WQVJJTlQzMl9TSVpFIGJ5dGVzIGxlZnQsIG5vdCBqdXN0IE1BWF9WQVJJTlRfU0laRS4NCisgICogTWlub3Igb3B0aW1pemF0aW9uIHRvIFJvcGVCeXRlU3RyaW5nLlBpZWNlSXRlcmF0b3INCisNCisgIEphdmFTY3JpcHQNCisgICogU2ltcGxpZnkgZ2VuZXJhdGVkIHRvT2JqZWN0IGNvZGUgd2hlbiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkLg0KKw0KKyAgUHl0aG9uDQorICAqIENoYW5nZXMgaW1wbGVtZW50YXRpb24gb2YgTmFtZSgpIGZvciBlbnVtcyB0aGF0IGFsbG93IGFsaWFzZXMgaW4gcHJvdG8yIGluIFB5dGhvbiB0byBiZSBpbiBsaW5lIHdpdGggY2xhaW1zIGluIEMrKyBpbXBsZW1lbnRhdGlvbiAodG8gcmV0dXJuIGZpcnN0IHZhbHVlKS4NCisgICogQWRkZWQgZG91YmxlX2Zvcm1hdCBvcHRpb24gaW4gdGV4dCBmb3JtYXQgcHJpbnRlci4NCisgICogQWRkZWQgaXRlciBhbmQgX19jb250YWluc19fIHRvIGV4dGVuc2lvbiBkaWN0DQorICAqIEFkZGVkIGFsbG93X3Vua25vd25fZmllbGQgb3B0aW9uIGluIHB5dGhvbiB0ZXh0IGZvcm1hdCBwYXJzZXINCisgICogRml4ZWQgVGltZXN0YW1wLlRvRGF0ZXRpbWUoKSBsb3NlcyBwcmVjaXNpb24gaXNzdWUNCisgICogU3VwcG9ydCB1bmtub3duIGZpZWxkIGluIHRleHQgZm9ybWF0IHByaW50ZXIuDQorICAqIEZsb2F0IGZpZWxkIHdpbGwgYmUgY29udmVydCB0byBpbmYgaWYgYmlnZ2VyIHRoYW4gc3RydWN0LnVucGFjaygnZicsIGInXHhmZlx4ZmZceDdmXHg3ZicpWzBdIHdoaWNoIGlzIGFib3V0IDMuNDAyODIzNDY2NGUrMzgsDQorICBjb252ZXJ0IHRvIC1pbmYgaWYgc21hbGxlciB0aGFuIC0zLjQwMjgyMzQ2NjRlKzM4DQorICAqIEFsbG93ZWQgY2FzdGluZyBzdHItPmJ5dGVzIGluIE1lc3NhZ2UuX19zZXRzdGF0ZV9fDQorDQorICBSdWJ5DQorICAqIEhlbHBlciBtZXRob2RzIHRvIGdldCBlbnVtIG5hbWUgZm9yIFJ1YnkuDQorDQorDQorMjAxOS0wMS0yNCB2ZXJzaW9uIDMuNy4wIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisNCisgIEMrKw0KKyAgKiBJbnRyb2R1Y2VkIG5ldyBNT01JIChtYXliZS1vdXRzaWRlLW1lbW9yeS1pbnRlcnZhbCkgcGFyc2VyLg0KKyAgKiBBZGQgYW4gb3B0aW9uIHRvIGpzb25fdXRpbCB0byBwYXJzZSBlbnVtIGFzIGNhc2UtaW5zZW5zaXRpdmUuIEluIHRoZSBmdXR1cmUsIGVudW0gcGFyc2luZyBpbiBqc29uX3V0aWwgd2lsbCBiZWNvbWUgY2FzZS1zZW5zaXRpdmUuDQorICAqIEFkZGVkIGNvbmZvcm1hbmNlIHRlc3QgZm9yIGVudW0gYWxpYXNlcw0KKyAgKiBBZGRlZCBzdXBwb3J0IGZvciAtLWNwcF9vdXQ9c3BlZWQ6Li4uDQorICAqIEFkZGVkIHVzZSBvZiBDKysgb3ZlcnJpZGUga2V5d29yZCB3aGVyZSBhcHByb3ByaWF0ZQ0KKyAgKiBNYW55IG90aGVyIGNsZWFudXBzIGFuZCBmaXhlcy4NCisNCisgIEphdmENCisgICogRml4IGlsbGVnYWwgcmVmbGVjdGl2ZSBhY2Nlc3Mgd2FybmluZyBpbiBKREsgOSsNCisgICogQWRkIEJPTQ0KKw0KKyAgUHl0aG9uDQorICAqIEFkZGVkIFB5dGhvbiAzLjcgY29tcGF0aWJpbGl0eS4NCisgICogTW9kaWZpZWQgUGFyc2VGcm9tU3RyaW5nIHRvIHJldHVybiBieXRlcyBwYXJzZWQgLg0KKyAgKiBJbnRyb2R1Y2UgUHJvdG8gQyBBUEkuDQorICAqIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCBpbiBkZXNjcmlwdG9yIHBvb2wgaXMgbm93IGFibGUgdG8gZmluZCBmaWVsZCBhbmQgZW51bSB2YWx1ZXMuDQorICAqIHJlZmxlY3Rpb24uTWFrZUNsYXNzKCkgIGFuZCAgcmVmbGVjdGlvbi5QYXJzZU1lc3NhZ2UoKSBhcmUgZGVwcmVjYXRlZC4NCisgICogQWRkZWQgRGVzY3JpcHRvclBvb2wuRmluZE1ldGhvZEJ5TmFtZSgpIG1ldGhvZCBpbiBwdXJlIHB5dGhvbiAoYyBleHRlbnNpb24gYWxyZWFkeSBoYXMgaXQpDQorICAqIEZsaXBwZWQgcHJvdG8zIHRvIHByZXNlcnZlIHVua25vd24gZmllbGRzIGJ5IGRlZmF1bHQuDQorICAqIEFkZGVkIHN1cHBvcnQgZm9yIG1lbW9yeXZpZXcgaW4gcHl0aG9uMyBwcm90byBtZXNzYWdlIHBhcnNpbmcuDQorICAqIEFkZGVkIE1lcmdlRnJvbSBmb3IgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkcyBpbiBjIGV4dGVuc2lvbiAocHVyZSBweXRob24gYWxyZWFkeSBoYXMgaXQpDQorICAqIFN1cnJvZ2F0ZXMgYXJlIG5vdyByZWplY3RlZCBhdCBzZXR0ZXJzIGluIHB5dGhvbjMuDQorICAqIEFkZGVkIHB1YmxpYyB1bmtub3duIGZpZWxkIEFQSS4NCisgICogUmVjdXJzaW9uTGltaXQgaXMgYWxzbyBzZXQgdG8gbWF4IGlmIGFsbG93X292ZXJzaXplX3Byb3RvcyBpcyBlbmFibGVkLg0KKyAgKiBEaXNhbGxvdyBkdXBsaWNhdGUgc2NhbGFycyBpbiBwcm90bzMgdGV4dF9mb3JtYXQgcGFyc2UuDQorICAqIEZpeCBzb21lIHNlZ21lbnQgZmF1bHRzIGZvciBjIGV4dGVuc2lvbiBtYXAgZmllbGQuDQorDQorICBQSFANCisgICogTW9zdCBpc3N1ZXMgZm9yIGpzb24gZW5jb2RpbmcvZGVjb2RpbmcgaW4gdGhlIGMgZXh0ZW5zaW9uIGhhdmUgYmVlbiBmaXhlZC4gVGhlcmUgYXJlIHN0aWxsIHNvbWUgZWRnZSBjYXNlcyBub3QgZml4ZWQuIEZvciBtb3JlIGRldGFpbHMsIGNoZWNrIGNvbmZvcm1hbmNlL2ZhaWx1cmVfbGlzdF9waHBfYy50eHQuDQorICAqIFN1cHBvcnRzIHBocCA3LjMNCisgICogQWRkZWQgaGVscGVyIG1ldGhvZHMgdG8gY29udmVydCBiZXR3ZWVuIGVudW0gdmFsdWVzIGFuZCBuYW1lcy4NCisgICogQWxsb3cgc2V0dGluZy9nZXR0aW5nIHdyYXBwZXIgbWVzc2FnZSBmaWVsZHMgdXNpbmcgcHJpbWl0aXZlIHZhbHVlcy4NCisgICogVmFyaW91cyBidWcgZml4ZXMuDQorDQorICBSdWJ5DQorICAqIFJ1YnkgMi42IHN1cHBvcnQuDQorICAqIERyb3BzIHN1cHBvcnQgZm9yIHJ1YnkgPCAyLjMuDQorICAqIE1vc3QgaXNzdWVzIGZvciBqc29uIGVuY29kaW5nL2RlY29kaW5nIGluIHRoZSBjIGV4dGVuc2lvbiBoYXZlIGJlZW4gZml4ZWQuIFRoZXJlIGFyZSBzdGlsbCBzb21lIGVkZ2UgY2FzZXMgbm90IGZpeGVkLiBGb3IgbW9yZSBkZXRhaWxzLCBjaGVjayBjb25mb3JtYW5jZS9mYWlsdXJlX2xpc3RfcnVieS50eHQuDQorICAqIEpzb24gcGFyc2luZyBjYW4gc3BlY2lmeSBhbiBvcHRpb24gdG8gaWdub3JlIHVua25vd24gZmllbGRzOiBtc2cuZGVjb2RlX2pzb24oZGF0YSwge2lnbm9yZV91bmtub3duX2ZpZWxkczogdHJ1ZX0pLg0KKyAgKiBBZGRlZCBzdXBwb3J0IGZvciBwcm90bzIgc3ludGF4IChwYXJ0aWFsbHkpLg0KKyAgKiBWYXJpb3VzIGJ1ZyBmaXhlcy4NCisNCisgIENzaGFycA0KKyAgKiBNb3JlIHN1cHBvcnQgZm9yIEZpZWxkTWFzayBpbmNsdWRlIG1lcmdlLCBpbnRlcnNlY3QgYW5kIG1vcmUuDQorICAqIEluY3JlYXNpbmcgdGhlIGRlZmF1bHQgcmVjdXJzaW9uIGxpbWl0IHRvIDEwMC4NCisgICogU3VwcG9ydCBsb2FkaW5nIEZpbGVEZXNjcmlwdG9ycyBkeW5hbWljYWxseS4NCisgICogUHJvdmlkZSBhY2Nlc3MgdG8gY29tbWVudHMgZnJvbSBkZXNjcmlwdG9ycy4NCisgICogQWRkZWQgQW55LklzIG1ldGhvZC4NCisgICogQ29tcGF0aWJsZSB3aXRoIEMjIDYNCisgICogQWRkZWQgSUNvbXBhcmFibGUgYW5kIGNvbXBhcmlzb24gb3BlcmF0b3JzIG9uIFRpbWVzdGFtcC4NCisNCisgIE9iamVjdGl2ZSBDDQorICAqIEFkZCBhYmlsaXR5IHRvIGludHJvc3BlY3QgbGlzdCBvZiBlbnVtIHZhbHVlcyAoIzQ2NzgpDQorICAqIENvcHkgdGhlIHZhbHVlIHdoZW4gc2V0dGluZyBtZXNzYWdlL2RhdGEgZmllbGRzICgjNTIxNSkNCisgICogU3VwcG9ydCBzdXBwcmVzc2luZyB0aGUgb2JqYyBwYWNrYWdlIHByZWZpeCBjaGVja3Mgb24gYSBsaXN0IG9mIGZpbGVzICgjNTMwOSkNCisgICogTW9yZSBjb21wbGV0ZSBrZXl3b3JkIGFuZCBOU09iamVjdCBtZXRob2QgKHZpYSBjYXRlZ29yaWVzKSBjaGVja3MgZm9yIGZpZWxkIG5hbWVzLCBjYW4gcmVzdWx0IGluIG1vcmUgZmllbGRzIGJlaW5nIHJlbmFtZSwgYnV0IGF2b2lkcyB0aGUgY29sbGlzaW9ucyBhdCBydW50aW1lICgjNTI4OSkNCisgICogU21hbGwgZml4ZXMgdG8gVGV4dEZvcm1hdCBnZW5lcmF0aW9uIGZvciBleHRlbnNpb25zICgjNTM2MikNCisgICogUHJvdmlkZSBtb3JlIGRldGFpbHMvY29udGV4dCBpbiBkZXByZWNhdGlvbiBtZXNzYWdlcyAoIzU0MTIpDQorICAqIEFycmF5L0RpY3Rpb25hcnkgZW51bWVyYXRpb24gYmxvY2tzIE5TX05PRVNDQVBFIGFubm90YXRpb24gZm9yIFN3aWZ0ICgjNTQyMSkNCisgICogUHJvcGVybHkgYW5ub3RhdGUgZXh0ZW5zaW9ucyBmb3IgQVJDIHdoZW4gdGhlaXIgbmFtZXMgaW1wbHkgYmVoYXZpb3JzICgjNTQyNykNCisgICogRW51bSBhbGlhcyBuYW1lIGNvbGxpc2lvbiBpbXByb3ZlbWVudHMgKCM1NDgwKQ0KKw0KKw0KKzIwMTgtMDctMjcgdmVyc2lvbiAzLjYuMSAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorDQorICBDKysNCisgICogSW50cm9kdWNlZCB3b3JrYXJvdW5kIGZvciBXaW5kb3dzIGlzc3VlIHdpdGggc3RkOjphdG9taWMgYW5kIHN0ZDo6b25jZV9mbGFnDQorICAgIGluaXRpYWxpemF0aW9uICgjNDc3NywgIzQ3NzMpLg0KKw0KKyAgUEhQDQorICAqIEFkZGVkIGNvbXBhdGliaWxpdHkgd2l0aCBQSFAgNy4zICgjNDg5OCkuDQorDQorICBSdWJ5DQorICAqIEZpeGVkIFJ1YnkgY3Jhc2ggaW52b2x2aW5nIEFueSBlbmNvZGluZyAoIzQ3MTgpLg0KKw0KKzIwMTgtMDYtMDEgdmVyc2lvbiAzLjYuMCAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorDQorICBDKysNCisgICogU3RhcnRpbmcgZnJvbSB0aGlzIHJlbGVhc2UsIHdlIG5vdyByZXF1aXJlIEMrKzExLiBGb3IgdGhvc2Ugd2UgY2Fubm90IHlldA0KKyAgICB1cGdyYWRlIHRvIEMrKzExLCB3ZSB3aWxsIHRyeSB0byBrZWVwIHRoZSAzLjUueCBicmFuY2ggdXBkYXRlZCB3aXRoDQorICAgIGNyaXRpY2FsIGJ1ZyBmaXhlcyBvbmx5LiBJZiB5b3UgaGF2ZSBhbnkgY29uY2VybnMgYWJvdXQgdGhpcywgcGxlYXNlDQorICAgIGNvbW1lbnQgb24gaXNzdWUgIzI3ODAuDQorICAqIE1vdmVkIHRvIEMrKzExIHR5cGVzIGxpa2Ugc3RkOjphdG9taWMgYW5kIHN0ZDo6dW5pcXVlX3B0ciBhbmQgYXdheSBmcm9tIG91cg0KKyAgICBvbGQgY3VzdG9tLWJ1aWx0IGVxdWl2YWxlbnRzLg0KKyAgKiBBZGRlZCBzdXBwb3J0IGZvciByZXBlYXRlZCBtZXNzYWdlIGZpZWxkcyBpbiBsaXRlIHByb3RvcyB1c2luZyBpbXBsaWNpdA0KKyAgICB3ZWFrIGZpZWxkcy4gVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSB0aGF0IGFsbG93cyB0aGUgbGlua2VyIHRvDQorICAgIHN0cmlwIG91dCBtb3JlIHVudXNlZCBtZXNzYWdlcyB0aGFuIHByZXZpb3VzbHkgd2FzIHBvc3NpYmxlLg0KKyAgKiBGaXhlZCBTb3VyY2VDb2RlSW5mbyBmb3IgaW50ZXJwcmV0ZWQgb3B0aW9ucyBhbmQgZXh0ZW5zaW9uIHJhbmdlIG9wdGlvbnMuDQorICAqIEZpeGVkIGFsd2F5c19wcmludF9lbnVtc19hc19pbnRzIG9wdGlvbiBmb3IgSlNPTiBzZXJpYWxpemF0aW9uLg0KKyAgKiBBZGRlZCBzdXBwb3J0IGZvciBpZ25vcmluZyB1bmtub3duIGVudW0gdmFsdWVzIHdoZW4gcGFyc2luZyBKU09OLg0KKyAgKiBDcmVhdGUgc3RkOjpzdHJpbmcgaW4gQXJlbmEgbWVtb3J5Lg0KKyAgKiBGaXhlZCBWYWxpZGF0ZURhdGVUaW1lIHRvIGNvcnJlY3RseSBjaGVjayB0aGUgZGF5Lg0KKyAgKiBGaXhlZCBidWcgaW4gWmVyb0NvcHlTdHJlYW1CeXRlU2luay4NCisgICogVmFyaW91cyBvdGhlciBjbGVhbnVwcyBhbmQgZml4ZXMuDQorDQorICBKYXZhDQorICAqIERyb3BwZWQgc3VwcG9ydCBmb3IgSmF2YSA2Lg0KKyAgKiBBZGRlZCBhIFVURi04IGRlY29kZXIgdGhhdCB1c2VzIFVuc2FmZSB0byBkaXJlY3RseSBkZWNvZGUgYSBieXRlIGJ1ZmZlci4NCisgICogQWRkZWQgZGVwcmVjYXRpb24gYW5ub3RhdGlvbnMgdG8gZ2VuZXJhdGVkIGNvZGUgZm9yIGRlcHJlY2F0ZWQgb25lb2YNCisgICAgZmllbGRzLg0KKyAgKiBGaXhlZCBtYXAgZmllbGQgc2VyaWFsaXphdGlvbiBpbiBEeW5hbWljTWVzc2FnZS4NCisgICogQ2xlYW51cCBhbmQgZG9jdW1lbnRhdGlvbiBmb3IgSmF2YSBMaXRlIHJ1bnRpbWUuDQorICAqIFZhcmlvdXMgb3RoZXIgZml4ZXMgYW5kIGNsZWFudXBzDQorICAqIEZpeGVkIHVuYm94ZWQgYXJyYXlsaXN0cyB0byBoYW5kbGUgYW4gZWRnZSBjYXNlDQorICAqIEltcHJvdmVkIHBlcmZvcm1hbmNlIGZvciBjb3B5aW5nIGJldHdlZW4gdW5ib3hlZCBhcnJheWxpc3RzDQorICAqIEZpeGVkIGxpdGUgcHJvdG9idWYgdG8gYXZvaWQgSmF2YSBjb21waWxlciB3YXJuaW5ncw0KKyAgKiBJbXByb3ZlZCB0ZXN0IGNvdmVyYWdlIGZvciBsaXRlIHJ1bnRpbWUNCisgICogUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGZvciBsaXRlIHJ1bnRpbWUNCisNCisgIFB5dGhvbg0KKyAgKiBGaXhlZCBieXRlcy9zdHJpbmcgbWFwIGtleSBpbmNvbXBhdGliaWxpdHkgYmV0d2VlbiBDKysgYW5kIHB1cmUtUHl0aG9uDQorICAgIGltcGxlbWVudGF0aW9ucyAoaXNzdWUgIzQwMjkpDQorICAqIEFkZGVkIF9faW5pdF9fLnB5IGZpbGVzIHRvIGNvbXBpbGVyIGFuZCB1dGlsIHN1YnBhY2thZ2VzDQorICAqIFVzZSAvTVQgZm9yIGFsbCBXaW5kb3dzIHZlcnNpb25zDQorICAqIEZpeGVkIGFuIGlzc3VlIGFmZmVjdGluZyB0aGUgUHl0aG9uLUMrKyBpbXBsZW1lbnRhdGlvbiB3aGVuIHVzZWQgd2l0aA0KKyAgICBDeXRob24gKGlzc3VlICMyODk2KQ0KKyAgKiBWYXJpb3VzIHRleHQgZm9ybWF0IGZpeGVzDQorICAqIFZhcmlvdXMgZml4ZXMgdG8gcmVzb2x2ZSBiZWhhdmlvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBwdXJlLVB5dGhvbiBhbmQNCisgICAgUHl0aG9uLUMrKyBpbXBsZW1lbnRhdGlvbnMNCisNCisgIFBIUA0KKyAgKiBBZGRlZCBwaHBfbWV0YWRhdGFfbmFtZXNwYWNlIHRvIGNvbnRyb2wgdGhlIGZpbGUgcGF0aCBvZiBnZW5lcmF0ZWQgbWV0YWRhdGENCisgICAgZmlsZS4NCisgICogQ2hhbmdlZCBnZW5lcmF0ZWQgY2xhc3NlcyBvZiBuZXN0ZWQgbWVzc2FnZS9lbnVtLiBFLmcuLCBGb28uQmFyLCB3aGljaA0KKyAgICBwcmV2aW91c2x5IGdlbmVyYXRlcyBGb29fQmFyLCBub3cgZ2VuZXJhdGVzIEZvby9CYXINCisgICogQWRkZWQgYXJyYXkgY29uc3RydWN0b3IuIFdoZW4gY3JlYXRpbmcgYSBtZXNzYWdlLCB1c2VycyBjYW4gcGFzcyBhIHBocA0KKyAgICBhcnJheSB3aG9zZSBjb250ZW50IGlzIGZpZWxkIG5hbWUgdG8gdmFsdWUgcGFpcnMgaW50byBjb25zdHJ1Y3Rvci4gVGhlDQorICAgIGNyZWF0ZWQgbWVzc2FnZSB3aWxsIGJlIGluaXRpYWxpemVkIGFjY29yZGluZyB0byB0aGUgYXJyYXkuIE5vdGUgdGhhdA0KKyAgICBtZXNzYWdlIGZpZWxkIHNob3VsZCB1c2UgYSBtZXNzYWdlIHZhbHVlIGluc3RlYWQgb2YgYSBzdWItYXJyYXkuDQorICAqIFZhcmlvdXMgYnVnIGZpeGVzLg0KKw0KKyAgT2JqZWN0aXZlLUMNCisgICogV2UgcmVtb3ZlZCBzb21lIGhlbHBlciBjbGFzcyBtZXRob2RzIGZyb20gR1BCRGljdGlvbmFyeSB0byBzaHJpbmsgdGhlIHNpemUNCisgICAgb2YgdGhlIGxpYnJhcnksIHRoZSBmdW5jdGlvbmFyeSBpcyBzdGlsbCB0aGVyZSwgYnV0IHlvdSBtYXkgbmVlZCB0byBkbyBzb21lDQorICAgIHNwZWNpZmljICthbGxvYyAvIC1pbml04oCmIG1ldGhvZHMgaW5zdGVhZC4NCisgICogTWlub3IgaW1wcm92ZW1lbnRzIGluIHRoZSBwZXJmb3JtYW5jZSBvZiBvYmplY3QgZmllbGQgZ2V0dGVycy9zZXR0ZXJzIGJ5DQorICAgIGF2b2lkaW5nIHNvbWUgbWVtb3J5IG1hbmFnZW1lbnQgb3ZlcmhlYWQuDQorICAqIEZpeCBhIG1lbW9yeSBsZWFrIGR1cmluZyB0aGUgcmFpc2luZyBvZiBzb21lIGVycm9ycy4NCisgICogTWFrZSBoZWFkZXIgaW1wb3J0aW5nIGNvbXBsZXRlbHkgb3JkZXIgaW5kZXBlbmRlbnQuDQorICAqIFNtYWxsIGNvZGUgaW1wcm92ZW1lbnRzIGZvciB0aGluZ3MgdGhlIHVuZGVmaW5lZCBiZWhhdmlvcnMgY29tcGlsZXIgb3B0aW9uDQorICAgIHdhcyBmbGFnZ2luZy4NCisNCisgIFJ1YnkNCisgICogQWRkZWQgcnVieV9wYWNrYWdlIGZpbGUgb3B0aW9uIHRvIGNvbnRyb2wgdGhlIG1vZHVsZSBvZiBnZW5lcmF0ZWQgY2xhc3MuDQorICAqIFZhcmlvdXMgYnVnIGZpeGVzLg0KKw0KKyAgSmF2YXNjcmlwdA0KKyAgKiBBbGxvdyBzZXR0aW5nIHN0cmluZyB0byBpbnQ2NCBmaWVsZC4NCisNCisgIENzaGFycA0KKyAgKiBVbmtub3duIGZpZWxkcyBhcmUgbm93IHBhcnNlZCBhbmQgdGhlbiBzZW50IGJhY2sgb24gdGhlIHdpcmUuIFRoZXkgY2FuIGJlDQorICAgIGRpc2NhcmRlZCBhdCBwYXJzZSB0aW1lIHZpYSBhIENvZGVkSW5wdXRTdHJlYW0gb3B0aW9uLg0KKyAgKiBNb3ZlbWVudCB0b3dhcmRzIHdvcmtpbmcgd2l0aCAuTkVUIDMuNSBhbmQgVW5pdHkNCisgICogRXhwcmVzc2lvbiB0cmVlcyBhcmUgbm8gbG9uZ2VyIHVzZWQNCisgICogQU9UIGdlbmVyaWNzIGlzc3VlcyBpbiBVbml0eS9pbDJjcHAgaGF2ZSBhIHdvcmthcm91bmQgKHNlZSB0aGlzIGNvbW1pdCBmb3INCisgICAgZGV0YWlscykNCisgICogRmxvYXRpbmcgcG9pbnQgdmFsdWVzIGFyZSBub3cgY29tcGFyZWQgYml0d2lzZSAoYWZmZWN0cyBOYU4gdmFsdWUNCisgICAgY29tcGFyaXNvbnMpDQorICAqIFRoZSBkZWZhdWx0IHNpemUgbGltaXQgd2hlbiBwYXJzaW5nIGlzIG5vdyAyR0IgcmF0aGVyIHRoYW4gNjRNQg0KKyAgKiBNZXNzYWdlUGFyc2VyIG5vdyBzdXBwb3J0cyBwYXJzaW5nIGZyb20gYSBzbGljZSBvZiBhIGJ5dGUgYXJyYXkNCisgICogSlNPTiBsaXN0IHBhcnNpbmcgbm93IGFjY2VwdHMgbnVsbCB2YWx1ZXMgd2hlcmUgdGhlIHVuZGVybHlpbmcgcHJvdG8NCisgICAgcmVwcmVzZW50YXRpb24gZG9lcw0KKw0KKzIwMTctMTItMjAgdmVyc2lvbiAzLjUuMSAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorICBQbGFubmVkIEZ1dHVyZSBDaGFuZ2VzDQorICAqIE1ha2UgQysrIGltcGxlbWVudGF0aW9uIEMrKzExIG9ubHk6IHdlIHBsYW4gdG8gcmVxdWlyZSBDKysxMSB0byBidWlsZA0KKyAgICBwcm90b2J1ZiBjb2RlIHN0YXJ0aW5nIGZyb20gMy42LjAgcmVsZWFzZS4gUGxlYXNlIGpvaW4gdGhpcyBnaXRodWIgaXNzdWU6DQorICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvaXNzdWVzLzI3ODAgdG8gcHJvdmlkZSB5b3VyIGZlZWRiYWNrLg0KKw0KKyAgcHJvdG9jDQorICAqIEZpeGVkIGEgYnVnIGludHJvZHVjZWQgaW4gMy41LjAgYW5kIHByb3RvYyBpbiBXaW5kb3dzIG5vdyBhY2NlcHRzIG5vbi1hc2NpaQ0KKyAgICBjaGFyYWN0ZXJzIGluIHBhdGhzIGFnYWluLg0KKw0KKyAgQysrDQorICAqIFJlbW92ZWQgc2V2ZXJhbCB1c2FnZXMgb2YgQysrMTEgZmVhdHVyZXMgaW4gdGhlIGNvZGUgYmFzZS4NCisgICogRml4ZWQgc29tZSBjb21waWxlciB3YXJuaW5ncy4NCisNCisgIFBIUA0KKyAgKiBGaXhlZCBtZW1vcnkgbGVhayBpbiBDLWV4dGVuc2lvbiBpbXBsZW1lbnRhdGlvbi4NCisgICogQWRkZWQgZGlzY2FyZFVua25va3duRmllbGRzIEFQSS4NCisgICogUmVtb3ZlZCBkdXBsaWNhdGVkIHR5cGVkZWYgaW4gQy1leHRlbnNpb24gaGVhZGVycy4NCisgICogQXZvaWRlZCBjYWxsaW5nIHByaXZhdGUgcGhwIG1ldGhvZHMgKHRpbWVsaWJfdXBkYXRlX3RzKS4NCisgICogRml4ZWQgQW55LnBocCB0byB1c2UgZnVsbHktcXVhbGlmaWVkIG5hbWUgZm9yIERlc2NyaXB0b3JQb29sLg0KKw0KKyAgUnVieQ0KKyAgKiBBZGRlZCBHb29nbGVfUHJvdG9idWZfZGlzY2FyZF91bmtub3duIGZvciBkaXNjYXJkaW5nIHVua25vd24gZmllbGRzIGluDQorICAgIG1lc3NhZ2VzLg0KKw0KKyAgQyMNCisgICogVW5rbm93biBmaWVsZHMgYXJlIG5vdyBwcmVzZXJ2ZWQgYnkgZGVmYXVsdC4NCisgICogRmxvYXRpbmcgcG9pbnQgdmFsdWVzIGFyZSBub3cgYml0d2lzZSBjb21wYXJlZCwgYWZmZWN0aW5nIG1lc3NhZ2UgZXF1YWxpdHkNCisgICAgY2hlY2sgYW5kIENvbnRhaW5zKCkgQVBJIGluIG1hcCBhbmQgcmVwZWF0ZWQgZmllbGRzLg0KKw0KKw0KKzIwMTctMTEtMTMgdmVyc2lvbiAzLjUuMCAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorICBQbGFubmVkIEZ1dHVyZSBDaGFuZ2VzDQorICAqIE1ha2UgQysrIGltcGxlbWVudGF0aW9uIEMrKzExIG9ubHk6IHdlIHBsYW4gdG8gcmVxdWlyZSBDKysxMSB0byBidWlsZA0KKyAgICBwcm90b2J1ZiBjb2RlIHN0YXJ0aW5nIGZyb20gMy42LjAgcmVsZWFzZS4gUGxlYXNlIGpvaW4gdGhpcyBnaXRodWIgaXNzdWU6DQorICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvaXNzdWVzLzI3ODAgdG8gcHJvdmlkZSB5b3VyIGZlZWRiYWNrLg0KKw0KKyAgR2VuZXJhbA0KKyAgKiBVbmtub3duIGZpZWxkcyBhcmUgbm93IHByZXNlcnZlZCBpbiBwcm90bzMgZm9yIG1vc3Qgb2YgdGhlIGxhbmd1YWdlDQorICAgIGltcGxlbWVudGF0aW9ucyBmb3IgcHJvdG8zIGJ5IGRlZmF1bHQuIFNlZSB0aGUgcGVyLWxhbmd1YWdlIHNlY3Rpb24gZm9yDQorICAgIGRldGFpbHMuDQorICAqIHJlc2VydmUga2V5d29yZCBhcmUgbm93IHN1cHBvcnRlZCBpbiBlbnVtcw0KKw0KKyAgQysrDQorICAqIFByb3RvMyBtZXNzYWdlcyBhcmUgbm93IHByZXNlcnZpbmcgdW5rbm93biBmaWVsZHMgYnkgZGVmYXVsdC4gSWYgeW91IHJlbHkgb24NCisgICAgdW5rbm93bnMgZmllbGRzIGJlaW5nIGRyb3BwZWQuIFBsZWFzZSB1c2UgRGlzY2FyZFVua25vd25GaWVsZHMoKSBleHBsaWNpdGx5Lg0KKyAgKiBEZXByZWNhdGVkIHRoZSB1bnNhZmVfYXJlbmFfcmVsZWFzZV8qIGFuZCB1bnNhZmVfYXJlbmFfYWRkX2FsbG9jYXRlZF8qDQorICAgIG1ldGhvZHMgZm9yIHN0cmluZyBmaWVsZHMuDQorICAqIEFkZGVkIG1vdmUgY29uc3RydWN0b3IgYW5kIG1vdmUgYXNzaWdubWVudCB0byBSZXBlYXRlZEZpZWxkLA0KKyAgICBSZXBlYXRlZFB0ckZpZWxkIGFuZCBnb29nbGU6OnByb3RvYnVmOjpBbnkuDQorICAqIEFkZGVkIHBlcmZlY3QgZm9yd2FyZGluZyBpbiBBcmVuYTo6Q3JlYXRlTWVzc2FnZQ0KKyAgKiBJbi1wcm9ncmVzcyBleHBlcmltZW50YWwgc3VwcG9ydCBmb3IgaW1wbGljaXQgd2VhayBmaWVsZHMgd2l0aCBsaXRlIHByb3Rvcy4NCisgICAgVGhpcyBmZWF0dXJlIGFsbG93cyB0aGUgbGlua2VyIHRvIHN0cmlwIG91dCBtb3JlIHVudXNlZCBtZXNzYWdlcyBhbmQgcmVkdWNlDQorICAgIGJpbmFyeSBzaXplLg0KKyAgKiBWYXJpb3VzIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMuDQorDQorICBKYXZhDQorICAqIFByb3RvMyBtZXNzYWdlcyBhcmUgbm93IHByZXNlcnZpbmcgdW5rbm93biBmaWVsZHMgYnkgZGVmYXVsdC4gSWYgeW914oCZZCBsaWtlDQorICAgIHRvIGRyb3AgdW5rbm93biBmaWVsZHMsIHBsZWFzZSB1c2UgdGhlIERpc2NhcmRVbmtub3duRmllbGRzUGFyc2VywqBBUEkuIEZvcg0KKyAgICBleGFtcGxlOg0KKyAgICAgIFBhcnNlcjxGb28+IHBhcnNlciA9IERpc2NhcmRVbmtub3duRmllbGRzUGFyc2VyLndyYXAoRm9vLnBhcnNlcigpKTsNCisgICAgICBGb28gZm9vID0gcGFyc2VyLnBhcnNlRnJvbShpbnB1dCk7DQorICAqIEFkZGVkIGEgbmV3IENvZGVkSW5wdXRTdHJlYW0gZGVjb2RlciBmb3IgSXRlcmFibGU8Qnl0ZUJ1ZmZlcj4gd2l0aCBkaXJlY3QNCisgICAgQnl0ZUJ1ZmZlcnMuDQorICAqIFRleHRGb3JtYXQgbm93IHByaW50cyB1bmtub3duIGxlbmd0aC1kZWxpbWl0ZWQgZmllbGRzIGFzIG1lc3NhZ2VzIGlmDQorICAgIHBvc3NpYmxlLg0KKyAgKiBGaWVsZE1hc2tVdGlsLm1lcmdlKCkgbm8gbG9uZ2VyIGNyZWF0ZXMgdW5uZWNlc3NhcnkgZW1wdHkgbWVzc2FnZXMgd2hlbiBhDQorICAgIG1lc3NhZ2UgZmllbGQgaXMgdW5zZXQgaW4gYm90aCBzb3VyY2UgbWVzc2FnZSBhbmQgZGVzdGluYXRpb24gbWVzc2FnZS4NCisgICogVmFyaW91cyBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zLg0KKw0KKyAgUHl0aG9uDQorICAqIFByb3RvMyBtZXNzYWdlcyBhcmUgbm93IHByZXNlcnZpbmcgdW5rbm93biBmaWVsZHMgYnkgZGVmYXVsdC4gVXNlDQorICAgIG1lc3NhZ2UuRGlzY2FyZFVua25vd25GaWVsZHMoKSB0byBkcm9wIHVua25vd24gZmllbGRzLg0KKyAgKiBBZGQgRmllbGREZXNjcmlwdG9yLmZpbGUgaW4gZ2VuZXJhdGVkIGNvZGUuDQorICAqIEFkZCBkZXNjcmlwdG9yIHBvb2wgRmluZE9uZW9mQnlOYW1lIGluIHB1cmUgcHl0aG9uLg0KKyAgKiBDaGFuZ2UgdW5rbm93biBlbnVtIHZhbHVlcyBpbnRvIHVua25vd24gZmllbGQgc2V0IC4NCisgICogQWRkIG1vcmUgUHl0aG9uIGRpY3QvbGlzdCBjb21wYXRpYmlsaXR5IGZvciBTdHJ1Y3QvTGlzdFZhbHVlLg0KKyAgKiBBZGQgdXRmLTggc3VwcG9ydCBmb3IgdGV4dF9mb3JtYXQuTWVyZ2UoKS9QYXJzZSgpLg0KKyAgKiBTdXBwb3J0IG51bWVyaWMgdW5rbm93biBlbnVtIHZhbHVlcyBmb3IgcHJvdG8zIEpTT04gZm9ybWF0Lg0KKyAgKiBBZGQgd2FybmluZyBmb3IgVW5leHBlY3RlZCBlbmQtZ3JvdXAgdGFnIGluIGNwcCBleHRlbnNpb24uDQorDQorICBQSFANCisgICogUHJvdG8zIG1lc3NhZ2VzIGFyZSBub3cgcHJlc2VydmluZyB1bmtub3duIGZpZWxkcy4NCisgICogUHJvdmlkZSB3ZWxsIGtub3duIHR5cGUgbWVzc2FnZXMgaW4gcnVudGltZS4NCisgICogQWRkIHByZWZpeCDigJhQQuKAmSB0byBnZW5lcmF0ZWQgY2xhc3Mgb2YgcmVzZXJ2ZWQgbmFtZXMuDQorICAqIEZpeGVkIGFsbCBjb25mb3JtYW5jZSB0ZXN0cyBmb3IgZW5jb2RlL2RlY29kZSBqc29uIGluIHBocCBydW50aW1lLiBDDQorICAgIGV4dGVuc2lvbiBuZWVkcyBtb3JlIHdvcmsuDQorDQorICBPYmplY3RpdmUtQw0KKyAgKiBGaXhlZCBzb21lIGlzc3VlcyBhcm91bmQgY29weWluZyBvZiBtZXNzYWdlcyB3aXRoIHVua25vd24gZmllbGRzIGFuZCB0aGVuDQorICAgIG11dGF0aW5nIHRoZSB1bmtub3duIGZpZWxkcyBpbiB0aGUgY29weS4NCisNCisgIEMjDQorICAqIEFkZGVkIHVua25vd24gZmllbGQgc3VwcG9ydCBpbiBKc29uUGFyc2VyLg0KKyAgKiBGaXhlZCBvbmVvZiBtZXNzYWdlIGZpZWxkIG1lcmdlLg0KKyAgKiBTaW1wbGlmeSBwYXJzaW5nIG1lc3NhZ2VzIGZyb20gYXJyYXkgc2xpY2VzLg0KKw0KKyAgUnVieQ0KKyAgKiBVbmtub3duIGZpZWxkcyBhcmUgbm93IHByZXNlcnZlZCBieSBkZWZhdWx0Lg0KKyAgKiBGaXhlZCBzZXZlcmFsIGJ1Z3MgZm9yIHNlZ21lbnQgZmF1bHQuDQorDQorICBKYXZhc2NyaXB0DQorICAqIERlY29kZXIgY2FuIGhhbmRsZSBib3RoIHBhY2VkIGFuZCB1bnBhY2tlZCBkYXRhIG5vIG1hdHRlciBob3cgdGhlIHByb3RvIGlzDQorICAgIGRlZmluZWQuDQorICAqIERlY29kZXIgbm93IGFjY2VwdCBsb25nIHZhcmludCBmb3IgMzIgYml0IGludGVnZXJzLg0KKw0KKw0KKzIwMTctMDgtMTQgdmVyc2lvbiAzLjQuMCAoQysrL0phdmEvUHl0aG9uL1BIUC9PYmplY3RpdmUtQy9DIy9SdWJ5L0phdmFTY3JpcHQpDQorICBQbGFubmVkIEZ1dHVyZSBDaGFuZ2VzDQorICAqIFRoZXJlIGFyZSBzb21lIGNoYW5nZXMgdGhhdCBhcmUgbm90IGluY2x1ZGVkIGluIHRoaXMgcmVsZWFzZSBidXQgYXJlIHBsYW5uZWQNCisgICAgZm9yIHRoZSBuZWFyIGZ1dHVyZQ0KKyAgICAgIC0gUHJlc2VydmUgdW5rbm93biBmaWVsZHMgaW4gcHJvdG8zOiBXZSBhcmUgZ29pbmcgdG8gYnJpbmcgdW5rbm93biBmaWVsZHMNCisgICAgICAgIGJhY2sgaW50byBwcm90bzMuIEluIHRoaXMgcmVsZWFzZSwgc29tZSBsYW5ndWFnZXMgc3RhcnQgdG8gc3VwcG9ydA0KKyAgICAgICAgcHJlc2VydmluZyB1bmtub3duIGZpZWxkcyBpbiBwcm90bzMsIGNvbnRyb2xsZWQgYnkgZmxhZ3Mvb3B0aW9ucy4gU29tZQ0KKyAgICAgICAgbGFuZ3VhZ2VzIGFsc28gaW50cm9kdWNlIGV4cGxpY2l0IEFQSXMgdG8gZHJvcCB1bmtub3duIGZpZWxkcyBmb3INCisgICAgICAgIG1pZ3JhdGlvbi4gUGxlYXNlIHJlYWQgdGhlIGNoYW5nZSBsb2cgc2VjdGlvbnMgYnkgbGFuZ3VhZ2VzIGZvciBkZXRhaWxzLg0KKyAgICAgICAgRm9yIGdlbmVyYWwgdGltZWxpbmUgYW5kIHBsYW46DQorDQorICAgICAgICAgIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMUtNUlgtRzkxQWEtWTJGa0VhSGVldmlMUlJOYmxnSWFoYnNrNHdBMTRnUmsvdmlldw0KKw0KKyAgICAgICAgRm9yIGlzc3VlcyBhbmQgZGlzY3Vzc2lvbnM6DQorDQorICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvaXNzdWVzLzI3Mg0KKw0KKyAgICAgIC0gTWFrZSBDKysgaW1wbGVtZW50YXRpb24gQysrMTEgb25seTogd2UgcGxhbiB0byByZXF1aXJlIEMrKzExIHRvIGJ1aWxkDQorICAgICAgICBwcm90b2J1ZiBjb2RlIHN0YXJ0aW5nIGZyb20gMy41LjAgb3IgMy42LjAgcmVsZWFzZSwgYWZ0ZXIgdW5rbm93biBmaWVsZHMNCisgICAgICAgIHNlbWFudGljIGNoYW5nZXMgYXJlIGZpbmlzaGVkLiBQbGVhc2Ugam9pbiB0aGlzDQorICAgICAgICBnaXRodWIgaXNzdWU6DQorDQorICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvaXNzdWVzLzI3ODANCisNCisgICAgICAgIHRvIHByb3ZpZGUgeW91ciBmZWVkYmFjay4NCisNCisgIEdlbmVyYWwNCisgICogRXh0ZW5zaW9uIHJhbmdlcyBub3cgYWNjZXB0IG9wdGlvbnMgYW5kIGFyZSBjdXN0b21pemFibGUuDQorICAqICJyZXNlcnZlIiBrZXl3b3JkIG5vdyBzdXBwb3J0cyDigJxtYXjigJ0gaW4gZmllbGQgbnVtYmVyIHJhbmdlcywNCisgICAgZS5nLiAgcmVzZXJ2ZSAxMDAwIHRvIG1heDsNCisNCisgIEMrKw0KKyAgKiBQcm90bzMgbWVzc2FnZXMgYXJlIG5vdyBhYmxlIHRvIHByZXNlcnZlIHVua25vd24gZmllbGRzLiBUaGUgZGVmYXVsdA0KKyAgICBiZWhhdmlvciBpcyBzdGlsbCB0byBkcm9wIHVua25vd25zLCB3aGljaCB3aWxsIGJlIGZsaXBwZWQgaW4gYSBmdXR1cmUNCisgICAgcmVsZWFzZS4gSWYgeW91IHJlbHkgb24gdW5rbm93bnMgZmllbGRzIGJlaW5nIGRyb3BwZWQuIFBsZWFzZSB1c2UNCisgICAgTWVzc2FnZTo6RGlzY2FyZFVua25vd25GaWVsZHMoKSBleHBsaWNpdGx5Lg0KKyAgKiBQYWNrYWJsZSBwcm90bzMgZmllbGRzIGFyZSBub3cgcGFja2VkIGJ5IGRlZmF1bHQgaW4gc2VyaWFsaXphdGlvbi4NCisgICogRm9sbG93aW5nIEMrKzExIGZlYXR1cmVzIGFyZSBpbnRyb2R1Y2VkIHdoZW4gQysrMTEgaXMgYXZhaWxhYmxlOg0KKyAgICAgIC0gbW92ZS1jb25zdHJ1Y3RvciBhbmQgbW92ZS1hc3NpZ25tZW50IGFyZSBpbnRyb2R1Y2VkIHRvIG1lc3NhZ2VzDQorICAgICAgLSBSZXBlYXRlZCBmaWVsZHMgY29uc3RydWN0b3Igbm93IHRha2VzIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdA0KKyAgICAgIC0gcnZhbHVlIHNldHRlcnMgYXJlIGludHJvZHVjZWQgZm9yIHN0cmluZyBmaWVsZHMNCisgICogRXhwZXJpbWVudGFsIFRhYmxlLURyaXZlbiBwYXJzaW5nIGFuZCBzZXJpYWxpemF0aW9uIGF2YWlsYWJsZSB0byB0ZXN0LiBUbw0KKyAgICBlbmFibGUgaXQsIHBhc3MgaW4gdGFibGVfZHJpdmVuX3BhcnNpbmcgdGFibGVfZHJpdmVuX3NlcmlhbGl6YXRpb24gcHJvdG9jDQorICAgIGdlbmVyYXRvciBmbGFncyBmb3IgQysrDQorDQorICAgICAgJCBwcm90b2MgLS1jcHBfb3V0PXRhYmxlX2RyaXZlbl9wYXJzaW5nLHRhYmxlX2RyaXZlbl9zZXJpYWxpemF0aW9uOi4vIFwNCisgICAgICAgIHRlc3QucHJvdG8NCisNCisgICogbGl0ZSBnZW5lcmF0b3IgcGFyYW1ldGVyIHN1cHBvcnRlZCBieSB0aGUgZ2VuZXJhdG9yLiBPbmNlIHNldCwgYWxsIGdlbmVyYXRlZA0KKyAgICBmaWxlcywgdXNlIGxpdGUgcnVudGltZSByZWdhcmRsZXNzIG9mIHRoZSBvcHRpbWl6ZXJfZm9yIHNldHRpbmcgaW4gdGhlDQorICAgIC5wcm90byBmaWxlLg0KKyAgKiBWYXJpb3VzIG9wdGltaXphdGlvbnMgdG8gbWFrZSBDKysgY29kZSBtb3JlIHBlcmZvcm1hbnQgb24gUG93ZXJQQyBwbGF0Zm9ybQ0KKyAgKiBGaXhlZCBtYXBzIGRhdGEgY29ycnVwdGlvbiB3aGVuIHRoZSBtYXBzIGFyZSBtb2RpZmllZCBieSBib3RoIHJlZmxlY3Rpb24gQVBJDQorICAgIGFuZCBnZW5lcmF0ZWQgQVBJLg0KKyAgKiBEZXRlcm1pbmlzdGljIHNlcmlhbGl6YXRpb24gb24gbWFwcyByZWZsZWN0aW9uIG5vdyB1c2VzIHN0YWJsZSBzb3J0Lg0KKyAgKiBmaWxlKCkgYWNjZXNzb3JzIGFyZSBpbnRyb2R1Y2VkIHRvIHZhcmlvdXMgKkRlc2NyaXB0b3IgY2xhc3NlcyB0byBtYWtlDQorICAgIHdyaXRpbmcgdGVtcGxhdGUgZnVuY3Rpb24gZWFzaWVyLg0KKyAgKiBCeXRlU2l6ZSgpIGFuZCBTcGFjZVVzZWQoKSBhcmUgZGVwcmVjYXRlZC5Vc2UgQnl0ZVNpemVMb25nKCkgYW5kDQorICAgIFNwYWNlVXNlZExvbmcoKSBpbnN0ZWFkDQorICAqIENvbnNpc3RlbnQgaGFzaCBmdW5jdGlvbiBpcyB1c2VkIGZvciBtYXBzIGluIERFQlVHIGFuZCBOREVCVUcgYnVpbGQuDQorICAqICJ1c2luZyBuYW1lc3BhY2Ugc3RkIiBpcyByZW1vdmVkIGZyb20gc3R1YnMvY29tbW9uLmgNCisgICogVmFyaW91cyBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIGFuZCBidWcgZml4ZXMNCisNCisgIEphdmENCisgICogSW50cm9kdWNlZCBuZXcgcGFyc2VyIEFQSSBEaXNjYXJkVW5rbm93bkZpZWxkc1BhcnNlciBpbiBwcmVwYXJhdGlvbiBvZg0KKyAgICBwcm90bzMgdW5rbm93biBmaWVsZHMgcHJlc2VydmF0aW9uIGNoYW5nZS4gVXNlcnMgd2hvIHdhbnQgdG8gZHJvcCB1bmtub3duDQorICAgIGZpZWxkcyBzaG91bGQgbWlncmF0ZSB0byB1c2UgdGhpcyBuZXcgcGFyc2VyIEFQSS4gRm9yIGV4YW1wbGU6DQorDQorICAgICAgUGFyc2VyPEZvbz4gcGFyc2VyID0gRGlzY2FyZFVua25vd25GaWVsZHNQYXJzZXIud3JhcChGb28ucGFyc2VyKCkpOw0KKyAgICAgIEZvbyBmb28gPSBwYXJzZXIucGFyc2VGcm9tKGlucHV0KTsNCisNCisgICogSW50cm9kdWNlZCBuZXcgVGV4dEZvcm1hdCBBUEkgcHJpbnRVbmljb2RlRmllbGRWYWx1ZSgpIHRoYXQgcHJpbnRzIGZpZWxkDQorICAgIHZhbHVlIHdpdGhvdXQgZXNjYXBpbmcgdW5pY29kZSBjaGFyYWN0ZXJzLg0KKyAgKiBBZGRlZCBEdXJhdGlvbnMuY29tcGFyZShEdXJhdGlvbiwgRHVyYXRpb24pIGFuZA0KKyAgICBUaW1lc3RhbXBzLmNvbXBhcmUoVGltZXN0YW1wLCBUaW1lc3RhbXApLg0KKyAgKiBKc29uRm9ybWF0IG5vdyBhY2NlcHRzIGJhc2U2NHVybCBlbmNvZGVkIGJ5dGVzIGZpZWxkcy4NCisgICogT3B0aW1pemVkIENvZGVkSW5wdXRTdHJlYW0gdG8gZG8gbGVzcyBjb3BpZXMgd2hlbiBwYXJzaW5nIGxhcmdlIGJ5dGVzDQorICAgIGZpZWxkcy4NCisgICogT3B0aW1pemVkIFRleHRGb3JtYXQgdG8gYWxsb2NhdGUgbGVzcyBtZW1vcnkgd2hlbiBwcmludGluZy4NCisNCisgIFB5dGhvbg0KKyAgKiBTZXJpYWxpemVUb1N0cmluZyBBUEkgaXMgY2hhbmdlZCB0byBTZXJpYWxpemVUb1N0cmluZyhzZWxmLCAqKmt3YXJncyksDQorICAgIGRldGVybWluaXN0aWMgcGFyYW1ldGVyIGlzIGFjY2VwdGVkIGZvciBkZXRlcm1pbmlzdGljIHNlcmlhbGl6YXRpb24uDQorICAqIEFkZGVkIHNvcnRfa2V5cyBwYXJhbWV0ZXIgaW4ganNvbiBmb3JtYXQgdG8gbWFrZSB0aGUgb3V0cHV0IGRldGVybWluaXN0aWMuDQorICAqIEFkZGVkIGluZGVudCBwYXJhbWV0ZXIgaW4ganNvbiBmb3JtYXQuDQorICAqIEFkZGVkIGV4dGVuc2lvbiBzdXBwb3J0IGluIGpzb24gZm9ybWF0Lg0KKyAgKiBBZGRlZCBfX3JlcHJfXyBzdXBwb3J0IGZvciByZXBlYXRlZCBmaWVsZCBpbiBjcHAgaW1wbGVtZW50YXRpb24uDQorICAqIEFkZGVkIGZpbGUgaW4gRmllbGREZXNjcmlwdG9yLg0KKyAgKiBBZGRlZCBwcmV0dHktcHJpbnQgZmlsdGVyIHRvIHRleHQgZm9ybWF0Lg0KKyAgKiBTZXJ2aWNlcyBhbmQgbWV0aG9kIGRlc2NyaXB0b3JzIGFyZSBhbHdheXMgcHJpbnRlZCBldmVuIGlmIGdlbmVyaWNfc2VydmljZQ0KKyAgICBvcHRpb24gaXMgdHVybmVkIG9mZi4NCisgICogTm90ZTogQXBwRW5naW5lIDIuNSBpcyBkZXByZWNhdGVkIG9uIEp1bmUgMjAxNyB0aGF0IEFwcEVuZ2luZSAyLjUgd2lsbA0KKyAgICBuZXZlciB1cGRhdGUgcHJvdG9idWYgcnVudGltZS4gVXNlcnMgd2hvIGRlcGVuZCBvbiBBcHBFbmdpbmUgMi41IHNob3VsZCB1c2UNCisgICAgb2xkIHByb3RvYy4NCisNCisgIFBIUA0KKyAgKiBTdXBwb3J0IFBIUCBnZW5lcmljIHNlcnZpY2VzLiBTcGVjaWZ5IGZpbGUgb3B0aW9uIHBocF9nZW5lcmljX3NlcnZpY2U9dHJ1ZQ0KKyAgICB0byBlbmFibGUgZ2VuZXJhdGluZyBzZXJ2aWNlIGludGVyZmFjZS4NCisgICogTWVzc2FnZSwgcmVwZWF0ZWQgYW5kIG1hcCBmaWVsZHMgc2V0dGVycyB0YWtlIHZhbHVlIGluc3RlYWQgb2YgcmVmZXJlbmNlLg0KKyAgKiBBZGRlZCBtYXAgaXRlcmF0b3IgaW4gYyBleHRlbnNpb24uDQorICAqIFN1cHBvcnQganNvbiDCoGVuY29kZS9kZWNvZGUuDQorICAqIEFkZGVkIG1vcmUgdHlwZSBpbmZvIGluIGdldHRlci9zZXR0ZXIgcGhwZG9jDQorICAqIEZpeGVkIHRoZSBwcm9ibGVtIHRoYXQgYyBleHRlbnNpb24gYW5kIHBocCBpbXBsZW1lbnRhdGlvbiBjYW5ub3QgYmUgdXNlZA0KKyAgICB0b2dldGhlci4NCisgICogQWRkZWQgZmlsZSBvcHRpb24gcGhwX25hbWVzcGFjZSB0byB1c2UgY3VzdG9tIHBocCBuYW1lc3BhY2UgaW5zdGVhZCBvZg0KKyAgICBwYWNrYWdlLg0KKyAgKiBBZGRlZCBmbHVlbnQgc2V0dGVyLg0KKyAgKiBBZGRlZCBkZXNjcmlwdG9yIEFQSSBpbiBydW50aW1lIGZvciBjdXN0b20gZW5jb2RlL2RlY29kZS4NCisgICogVmFyaW91cyBidWcgZml4ZXMuDQorDQorICBPYmplY3RpdmUtQw0KKyAgKiBGaXggZm9yIEdQQkV4dGVuc2lvblJlZ2lzdHJ5IGNvcHlpbmcgYW5kIGFkZCB0ZXN0cy4NCisgICogT3B0aW1pemUgR1BCRGljdGlvbmFyeS5tIGNvZGVnZW4gdG8gcmVkdWNlIHNpemUgb2Ygb3ZlcmFsbCBsaWJyYXJ5IGJ5IDQ2Sw0KKyAgICBwZXIgYXJjaGl0ZWN0dXJlLg0KKyAgKiBGaXggc29tZSBjYXNlcyBvZiByZWFkaW5nIG9mIDY0Yml0IG1hcCB2YWx1ZXMuDQorICAqIFByb3Blcmx5IGVycm9yIG9uIGEgdGFnIHdpdGggZmllbGQgbnVtYmVyIHplcm8uDQorICAqIFByZXNlcnZlIHVua25vd24gZmllbGRzIGluIHByb3RvMyBzeW50YXggZmlsZXMuDQorICAqIERvY3VtZW50IHRoZSBleGNlcHRpb25zIG9uIHNvbWUgb2YgdGhlIHdyaXRpbmcgYXBpcy4NCisNCisgIEMjDQorICAqIEltcGxlbWVudGVkIElSZWFkT25seURpY3Rpb25hcnk8SyxWPiBpbiBNYXBGaWVsZDxLLFY+DQorICAqIEFkZGVkIFRyeVVucGFjayBtZXRob2QgZm9yIEFueSBtZXNzYWdlIGluIGFkZGl0aW9uIHRvIFVucGFjay4NCisgICogQ29udmVydGVkIEMjIHByb2plY3RzIHRvIE1TQnVpbGQgKGNzcHJvaikgZm9ybWF0Lg0KKw0KKyAgUnVieQ0KKyAgKiBTZXZlcmFsIGJ1ZyBmaXhlcy4NCisNCisgIEphdmFzY3JpcHQNCisgICogQWRkZWQgc3VwcG9ydCBvZiBmaWVsZCBvcHRpb24ganNfdHlwZS4gTm93IG9uZSBjYW4gc3BlY2lmeSB0aGUgSlMgdHlwZSBvZiBhDQorICAgIDY0LWJpdCBpbnRlZ2VyIGZpZWxkIHRvIGJlIHN0cmluZyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgYnkgYWRkaW5nIG9wdGlvbg0KKyAgICBbanN0eXBlID0gSlNfU1RSSU5HXSBvbiB0aGUgZmllbGQuDQorDQorMjAxNy0wNC0wNSB2ZXJzaW9uIDMuMy4wIChDKysvSmF2YS9QeXRob24vUEhQL09iamVjdGl2ZS1DL0MjL1J1YnkvSmF2YVNjcmlwdCkNCisgIFBsYW5uZWQgRnV0dXJlIENoYW5nZXMNCisgICogVGhlcmUgYXJlIHNvbWUgY2hhbmdlcyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhpcyByZWxlYXNlIGJ1dCBhcmUNCisgICAgcGxhbm5lZCBmb3IgdGhlIG5lYXIgZnV0dXJlOg0KKyAgICAgIC0gUHJlc2VydmUgdW5rbm93biBmaWVsZHMgaW4gcHJvdG8zOiBwbGVhc2UgcmVhZCB0aGlzIGRvYzoNCisNCisgICAgICAgICAgaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xS01SWC1HOTFBYS1ZMkZrRWFIZWV2aUxSUk5ibGdJYWhic2s0d0ExNGdSay92aWV3DQorDQorICAgICAgICBmb3IgdGhlIHRpbWVsaW5lIGFuZCBmb2xsb3cgdXAgdGhpcyBnaXRodWIgaXNzdWU6DQorDQorICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvaXNzdWVzLzI3Mg0KKw0KKyAgICAgICAgZm9yIGRpc2N1c3Npb24uDQorICAgICAgLSBNYWtlIEMrKyBpbXBsZW1lbnRhdGlvbiBDKysxMSBvbmx5OiB3ZSBwbGFuIHRvIHJlcXVpcmUgQysrMTEgdG8gYnVpbGQNCisgICAgICAgIHByb3RvYnVmIGNvZGUgc3RhcnRpbmcgZnJvbSAzLjQuMCBvciAzLjUuMCByZWxlYXNlLiBQbGVhc2Ugam9pbiB0aGlzDQorICAgICAgICBnaXRodWIgaXNzdWU6DQorDQorICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvaXNzdWVzLzI3ODANCisNCisgICAgICAgIHRvIHByb3ZpZGUgeW91ciBmZWVkYmFjay4NCisNCisgIEMrKw0KKyAgKiBGaXhlZCBtYXAgZmllbGRzIHNlcmlhbGl6YXRpb24gb2YgRHluYW1pY01lc3NhZ2UgdG8gY29ycmVjdGx5IHNlcmlhbGl6ZQ0KKyAgICBib3RoIGtleSBhbmQgdmFsdWUgcmVnYXJkbGVzcyBvZiB0aGVpciBwcmVzZW5jZS4NCisgICogUGFyc2VyIG5vdyByZWplY3RzIGZpZWxkIG51bWJlciAwIGNvcnJlY3RseS4NCisgICogTmV3IEFQSSBNZXNzYWdlOjpTcGFjZVVzZWRMb25nKCkgdGhhdOKAmXMgZXF1aXZhbGVudCB0bw0KKyAgICBNZXNzYWdlOjpTcGFjZVVzZWQoKSBidXQgcmV0dXJucyB0aGUgdmFsdWUgaW4gc2l6ZV90Lg0KKyAgKiBKU09OIHN1cHBvcnQNCisgICAgLSBOZXcgZmxhZyBhbHdheXNfcHJpbnRfZW51bXNfYXNfaW50cyBpbiBKc29uUHJpbnRPcHRpb25zLg0KKyAgICAtIE5ldyBmbGFnIHByZXNlcnZlX3Byb3RvX2ZpZWxkX25hbWVzIGluIEpzb25QcmludE9wdGlvbnMuIEl0IHdpbGwgaW5zdHJ1Y3QNCisgICAgICB0aGUgSlNPTiBwcmludGVyIHRvIHVzZSB0aGUgb3JpZ2luYWwgZmllbGQgbmFtZSBkZWNsYXJlZCBpbiB0aGUgLnByb3RvDQorICAgICAgZmlsZSBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcgdGhlbSB0byBsb3dlckNhbWVsQ2FzZSB3aGVuIHByaW50aW5nIEpTT04uDQorICAgIC0gSnNvblByaW50T3B0aW9ucy5hbHdheXNfcHJpbnRfcHJpbXRpdmVfZmllbGRzIG5vdyB3b3JrcyBmb3Igb25lb2YgbWVzc2FnZQ0KKyAgICAgIGZpZWxkcy4NCisgICAgLSBGaXhlZCBhIGJ1ZyB0aGF0IGRvZXNu4oCZdCBhbGxvdyBkaWZmZXJlbnQgZmllbGRzIHRvIHNldCB0aGUgc2FtZSBqc29uX25hbWUNCisgICAgICB2YWx1ZS4NCisgICAgLSBGaXhlZCBhIHBlcmZvcm1hbmNlIGJ1ZyB0aGF0IGNhdXNlcyBleGNlc3NpdmUgbWVtb3J5IGNvcHkgd2hlbiBwcmludGluZw0KKyAgICAgIGxhcmdlIG1lc3NhZ2VzLg0KKyAgKiBWYXJpb3VzIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMuDQorDQorICBKYXZhDQorICAqIE1hcCBmaWVsZCBzZXR0ZXJzIGVhZ2VybHkgdmFsaWRhdGUgaW5wdXRzIGFuZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbnMNCisgICAgYXMgYXBwcm9wcmlhdGUuDQorICAqIEFkZGVkIEJ5dGVCdWZmZXIgb3ZlcmxvYWRzIHRvIHRoZSBnZW5lcmF0ZWQgcGFyc2luZyBtZXRob2RzIGFuZCB0aGUgUGFyc2VyDQorICAgIGludGVyZmFjZS4NCisgICogcHJvdG8zIGVudW0ncyBnZXROdW1iZXIoKSBtZXRob2Qgbm93IHRocm93cyBvbiBVTlJFQ09HTklaRUQgdmFsdWVzLg0KKyAgKiBPdXRwdXQgb2YgSnNvbkZvcm1hdCBpcyBub3cgbG9jYWxlIGluZGVwZW5kZW50Lg0KKw0KKyAgUHl0aG9uDQorICAqIEFkZGVkIEZpbmRTZXJ2aWNlQnlOYW1lKCkgaW4gdGhlIHB1cmUtUHl0aG9uIERlc2NyaXB0b3JQb29sLiBUaGlzIHdvcmtzIG9ubHkNCisgICAgZm9yIGRlc2NyaXB0b3JzIGFkZGVkIHdpdGggRGVzY3JpcHRvclBvb2wuQWRkKCkuIEdlbmVyYXRlZCBkZXNjcmlwdG9yX3Bvb2wNCisgICAgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHlldC4NCisgICogQWRkZWQgYSBkZXNjcmlwdG9yX3Bvb2wgcGFyYW1ldGVyIGZvciBwYXJzaW5nIEFueSBpbiB0ZXh0X2Zvcm1hdC5QYXJzZSgpLg0KKyAgKiBkZXNjcmlwdG9yX3Bvb2wuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCkgbm93IGlzIGFibGUgdG8gZmluZCBuZXN0ZWQNCisgICAgZXh0ZW5zaW9ucy4NCisgICogRXh0ZW5kaW5nIGVtcHR5IFtdIHRvIHJlcGVhdGVkIGZpZWxkIG5vdyBzZXRzIHBhcmVudCBtZXNzYWdlIHByZXNlbmNlLg0KKw0KKyAgUEhQDQorICAqIEFkZGVkIGZpbGUgb3B0aW9uIHBocF9jbGFzc19wcmVmaXguIFRoZSBwcmVmaXggd2lsbCBiZSBwcmVwZW5kZWQgdG8gYWxsDQorICAgIGdlbmVyYXRlZCBjbGFzc2VzIGRlZmluZWQgaW4gdGhlIGZpbGUuDQorICAqIFdoZW4gZW5jb2RpbmcsIG5lZ2F0aXZlIGludDMyIHZhbHVlcyBhcmUgc2lnbi1leHRlbmRlZCB0byBpbnQ2NC4NCisgICogUmVwZWF0ZWQvTWFwIGZpZWxkIHNldHRlciBhY2NlcHRzIGEgcmVndWxhciBQSFAgYXJyYXkuIFR5cGUgY2hlY2tpbmcgaXMNCisgICAgZG9uZSBvbiB0aGUgYXJyYXkgZWxlbWVudHMuDQorICAqIGVuY29kZS9kZWNvZGUgYXJlIHJlbmFtZWQgdG8gc2VyaWFsaXplVG9TdHJpbmcvbWVyZ2VGcm9tU3RyaW5nLg0KKyAgKiBBZGRlZCBtZXJnZUZyb20sIGNsZWFyIG1ldGhvZCBvbiBNZXNzYWdlLg0KKyAgKiBGaXhlZCBhIGJ1ZyB0aGF0IG9uZW9mIGFjY2Vzc29yIGRpZG7igJl0IHJldHVybiB0aGUgZmllbGQgbmFtZSB0aGF0IGlzDQorICAgIGFjdHVhbGx5IHNldC4NCisgICogQyBleHRlbnNpb24gbm93IHdvcmtzIHdpdGggcGhwNy4NCisgICogVGhpcyBpcyB0aGUgZmlyc3QgR0EgcmVsZWFzZSBvZiBQSFAuIFdlIGd1YXJhbnRlZSB0aGF0IG9sZCBnZW5lcmF0ZWQgY29kZQ0KKyAgICBjYW4gYWx3YXlzIHdvcmsgd2l0aCBuZXcgcnVudGltZSBhbmQgbmV3IGdlbmVyYXRlZCBjb2RlLg0KKw0KKyAgT2JqZWN0aXZlLUMNCisgICogRml4ZWQgaGVscCBmb3IgR1BCVGltZXN0YW1wIGZvciBkYXRlcyBiZWZvcmUgdGhlIGVwb2NoIHRoYXQgY29udGFpbg0KKyAgICBmcmFjdGlvbmFsIHNlY29uZHMuDQorICAqIEFkZGVkIEdQQk1lc3NhZ2VEcm9wVW5rbm93bkZpZWxkc1JlY3Vyc2l2ZWx5KCkgdG8gcmVtb3ZlIHVua25vd25zIGZyb20gYQ0KKyAgICBtZXNzYWdlIGFuZCBhbnkgc3ViIG1lc3NhZ2VzLg0KKyAgKiBBZGRyZXNzZWQgYSB0aHJlYWRpbmcgcmFjZSBpbiBleHRlbnNpb24gcmVnaXN0cmF0aW9uL2xvb2t1cC4NCisgICogSW5jcmVhc2VkIHRoZSBtYXggbWVzc2FnZSBwYXJzaW5nIGRlcHRoIHRvIDEwMCB0byBtYXRjaCB0aGUgb3RoZXIgbGFuZ3VhZ2VzLg0KKyAgKiBSZW1vdmVkIHNvbWUgdXNlIG9mIGRpc3BhdGNoX29uY2UgaW4gZmF2b3Igb2YgYXRvbWljIGNvbXBhcmUvc2V0IHNpbmNlIGl0DQorICAgIG5lZWRzIHRvIGJlIGhlYXAgYmFzZWQuDQorICAqIEZpeGVzIGZvciBuZXcgWGNvZGUgOC4zIHdhcm5pbmdzLg0KKw0KKyAgQyMNCisgICogRml4ZWQgTWFwRmllbGQuVmFsdWVzLkNvcHlUbywgd2hpY2ggd291bGQgdGhyb3cgYW4gZXhjZXB0aW9uIHVubmVjZXNzYXJpbHkNCisgICAgaWYgcHJvdmlkZWQgZXhhY3RseSB0aGUgcmlnaHQgc2l6ZSBvZiBhcnJheSB0byBjb3B5IHRvLg0KKyAgKiBGaXhlZCBlbnVtIEpTT04gZm9ybWF0dGluZyB3aGVuIG11bHRpcGxlIG5hbWVzIG1hcHBlZCB0byB0aGUgc2FtZSBudW1lcmljDQorICAgIHZhbHVlLg0KKyAgKiBBZGRlZCBKU09OIGZvcm1hdHRpbmcgb3B0aW9uIHRvIGZvcm1hdCBlbnVtcyBhcyBpbnRlZ2Vycy4NCisgICogTW9kaWZpZWQgUmVwZWF0ZWRGaWVsZDxUPiB0byBpbXBsZW1lbnQgSVJlYWRPbmx5TGlzdDxUPi4NCisgICogSW50cm9kdWNlZCB0aGUgc3RhcnQgb2YgY3VzdG9tIG9wdGlvbiBoYW5kbGluZzsgaXQncyBub3QgYXMgcGxlYXNhbnQgYXMgaXQNCisgICAgbWlnaHQgYmUsIGJ1dCB0aGUgaW5mb3JtYXRpb24gaXMgYXQgbGVhc3QgcHJlc2VudC4gV2UgZXhwZWN0IHRvIGV4dGVuZCBjb2RlDQorICAgIGdlbmVyYXRpb24gdG8gaW1wcm92ZSB0aGlzIGluIHRoZSBmdXR1cmUuDQorICAqIEludHJvZHVjZWQgQnl0ZVN0cmluZy5Gcm9tU3RyZWFtIGFuZCBCeXRlU3RyaW5nLkZyb21TdHJlYW1Bc3luYyB0bw0KKyAgICBlZmZpY2llbnRseSBjcmVhdGUgYSBCeXRlU3RyaW5nIGZyb20gYSBzdHJlYW0uDQorICAqIEFkZGVkIHdob2xlLW1lc3NhZ2UgZGVwcmVjYXRpb24sIHdoaWNoIGRlY29yYXRlcyB0aGUgY2xhc3Mgd2l0aCBbT2Jzb2xldGVdLg0KKw0KKyAgUnVieQ0KKyAgKiBGaXhlZCBNZXNzYWdlI3RvX2ggZm9yIG1lc3NhZ2VzIHdpdGggbWFwIGZpZWxkcy4NCisgICogRml4ZWQgbWVtY3B5KCkgaW4gYmluYXJ5IGdlbXMgdG8gd29yayBmb3Igb2xkIGdsaWJjLCB3aXRob3V0IGJyZWFraW5nIHRoZQ0KKyAgICBidWlsZCBmb3Igbm9uLWdsaWJjIGxpYmPigJlzIGxpa2UgbXVzbC4NCisNCisgIEphdmFzY3JpcHQNCisgICogQWRkZWQgY29tcGF0aWJpbGl0eSB0ZXN0cyBmb3IgdmVyc2lvbiAzLjAuMC4NCisgICogQWRkZWQgY29uZm9ybWFuY2UgdGVzdHMuDQorICAqIEZpeGVkIHNlcmlhbGl6YXRpb24gb2YgZXh0ZW5zaW9uczogd2UgbmVlZCB0byBlbWl0IGEgdmFsdWUgZXZlbiBpZiBpdCBpcw0KKyAgICBmYWxzeSAobGlrZSB0aGUgbnVtYmVyIDApLg0KKyAgKiBVc2UgY2xvc3VyZWJ1aWxkZXIucHkgaW4gZmF2b3Igb2YgY2FsY2RlcHMucHkgZm9yIGNvbXBpbGluZyBKYXZhU2NyaXB0Lg0KKw0KKzIwMTctMDEtMjMgdmVyc2lvbiAzLjIuMCAoQysrL0phdmEvUHl0aG9uL1BIUC9SdWJ5L09iamVjdGl2ZS1DL0MjL0phdmFTY3JpcHQvTGl0ZSkNCisgIEdlbmVyYWwNCisgICogQWRkZWQgcHJvdG9jIHZlcnNpb24gbnVtYmVyIHRvIHByb3RvYyBwbHVnaW4gcHJvdG9jb2wuIEl0IGNhbiBiZSB1c2VkIGJ5DQorICAgIHByb3RvYyBwbHVnaW4gdG8gZGV0ZWN0IHdoaWNoIHZlcnNpb24gb2YgcHJvdG9jIGlzIHVzZWQgd2l0aCB0aGUgcGx1Z2luIGFuZA0KKyAgICBtaXRpZ2F0ZSBrbm93biBwcm9ibGVtcyBpbiBjZXJ0YWluIHZlcnNpb24gb2YgcHJvdG9jLg0KKw0KKyAgQysrDQorICAqIFRoZSBkZWZhdWx0IHBhcnNpbmcgYnl0ZSBzaXplIGxpbWl0IGhhcyBiZWVuIHJhaXNlZCBmcm9tIDY0TUIgdG8gMkdCLg0KKyAgKiBBZGRlZCBydmFsdWUgc2V0dGVycyBmb3Igbm9uLWFyZW5hIHN0cmluZyBmaWVsZHMuDQorICAqIEVuYWJsZWQgZGVidWcgbG9nZ2luZyBmb3IgQW5kcm9pZC4NCisgICogRml4ZWQgYSBkb3VibGUtZnJlZSBwcm9ibGVtIHdoZW4gdXNpbmcgUmVmbGVjdGlvbjo6U2V0QWxsb2NhdGVkTWVzc2FnZSgpDQorICAgIHdpdGggZXh0ZW5zaW9uIGZpZWxkcy4NCisgICogRml4ZWQgc2V2ZXJhbCBkZXRlcm1pbmlzdGljIHNlcmlhbGl6YXRpb24gYnVnczoNCisgICAgKiBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplQXNTdHJpbmcoKSBub3cgcmVzcGVjdHMgdGhlIGdsb2JhbCBkZXRlcm1pbmlzdGljDQorICAgICAgc2VyaWFsaXphdGlvbiBmbGFnLg0KKyAgICAqIEV4dGVuc2lvbiBmaWVsZHMgYXJlIHNlcmlhbGl6ZWQgZGV0ZXJtaW5pc3RpY2FsbHkgYXMgd2VsbC4gIEZpeGVkIHByb3RvY29sDQorICAgICAgY29tcGlsZXIgdG8gY29ycmVjdGx5IHJlcG9ydCBpbXBvcnRpbmctc2VsZiBhcyBhbiBlcnJvci4NCisgICogRml4ZWQgRmlsZURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgdG8gcHJpbnQgY3VzdG9tIG9wdGlvbnMgY29ycmVjdGx5Lg0KKyAgKiBWYXJpb3VzIHBlcmZvcm1hbmNlL2NvZGVzaXplIG9wdGltaXphdGlvbnMgYW5kIGNsZWFudXBzLg0KKw0KKyAgSmF2YQ0KKyAgKiBUaGUgZGVmYXVsdCBwYXJzaW5nIGJ5dGUgc2l6ZSBsaW1pdCBoYXMgYmVlbiByYWlzZWQgZnJvbSA2NE1CIHRvIDJHQi4NCisgICogQWRkZWQgcmVjdXJzaW9uIGxpbWl0IHdoZW4gcGFyc2luZyBKU09OLg0KKyAgKiBGaXhlZCBhIGJ1ZyB0aGF0IGVudW1UeXBlLmdldERlc2NyaXB0b3IoKS5nZXRPcHRpb25zKCkgZG9lc24ndCBoYXZlIGN1c3RvbQ0KKyAgICBvcHRpb25zLg0KKyAgKiBGaXhlZCBnZW5lcmF0ZWQgY29kZSB0byBzdXBwb3J0IGZpZWxkIG51bWJlcnMgdXAgdG8gMl4yOS0xLg0KKw0KKyAgUHl0aG9uDQorICAqIFlvdSBjYW4gbm93IGFzc2lnbiBOdW1QeSBzY2FsYXJzL2FycmF5cyAobnAuaW50MzIsIG5wLmludDY0KSB0byBwcm90b2J1Zg0KKyAgICBmaWVsZHMsIGFuZCBhc3NpZ25pbmcgb3RoZXIgbnVtZXJpYyB0eXBlcyBoYXMgYmVlbiBvcHRpbWl6ZWQgZm9yDQorICAgIHBlcmZvcm1hbmNlLg0KKyAgKiBQdXJlLVB5dGhvbjogbWVzc2FnZSB0eXBlcyBhcmUgbm93IGdhcmJhZ2UtY29sbGVjdGFibGUuDQorICAqIFB5dGhvbi9DKys6IGEgbG90IG9mIGludGVybmFsIGNsZWFudXAvcmVmYWN0b3JpbmcuDQorDQorICBQSFAgKEFscGhhKQ0KKyAgKiBGb3IgNjQtYml0IGludGVnZXJzIHR5cGUgKGludDY0L3VpbnQ2NC9zZml4ZWQ2NC9maXhlZDY0L3NpbnQ2NCksIHVzZSBQSFANCisgICAgaW50ZWdlciBvbiA2NC1iaXQgZW52aXJvbm1lbnQgYW5kIFBIUCBzdHJpbmcgb24gMzItYml0IGVudmlyb25tZW50Lg0KKyAgKiBQSFAgZ2VuZXJhdGVkIGNvZGUgYWxzbyBjb25mb3JtcyB0byBQU1ItNCBub3cuDQorICAqIEZpeGVkIFpUUyBidWlsZCBmb3IgYyBleHRlbnNpb24uDQorICAqIEZpeGVkIGMgZXh0ZW5zaW9uIGJ1aWxkIG9uIE1hYy4NCisgICogRml4ZWQgYyBleHRlbnNpb24gYnVpbGQgb24gMzItYml0IGxpbnV4Lg0KKyAgKiBGaXhlZCB0aGUgYnVnIHRoYXQgbWVzc2FnZSB3aXRob3V0IG5hbWVzcGFjZSBpcyBub3QgZm91bmQgaW4gdGhlIGRlc2NyaXB0b3INCisgICAgcG9vbC4gKCMyMjQwKQ0KKyAgKiBGaXhlZCB0aGUgYnVnIHRoYXQgcmVwZWF0ZWQgZmllbGQgaXMgbm90IGl0ZXJhYmxlIGluIGMgZXh0ZW5zaW9uLg0KKyAgKiBNZXNzYWdlIG5hbWVzIEVtcHR5IHdpbGwgYmUgY29udmVydGVkIHRvIEdQQkVtcHR5IGluIGdlbmVyYXRlZCBjb2RlLg0KKyAgKiBBZGRlZCBwaHBkb2MgaW4gZ2VuZXJhdGVkIGZpbGVzLg0KKyAgKiBUaGUgcmVsZWFzZWQgQVBJIGlzIGFsbW9zdCBzdGFibGUuIFVubGVzcyB0aGVyZSBpcyBsYXJnZSBwcm9ibGVtLCB3ZSB3b24ndA0KKyAgICBjaGFuZ2UgaXQuIFNlZQ0KKyAgICBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcmVmZXJlbmNlL3BocC1nZW5lcmF0ZWQNCisgICAgZm9yIG1vcmUgZGV0YWlscy4NCisNCisgIE9iamVjdGl2ZS1DDQorICAqIEFkZGVkIHN1cHBvcnQgZm9yIHB1c2gvcG9wIG9mIHRoZSBzdHJlYW0gbGltaXQgb24gQ29kZWRJbnB1dFN0cmVhbSBmb3INCisgICAgYW55b25lIGRvaW5nIG1hbnVhbCBwYXJzaW5nLg0KKw0KKyAgQyMNCisgICogTm8gY2hhbmdlcy4NCisNCisgIFJ1YnkNCisgICogTWVzc2FnZSBvYmplY3RzIG5vdyBzdXBwb3J0ICNyZXNwb25kX3RvPyBmb3IgZmllbGQgZ2V0dGVycy9zZXR0ZXJzLg0KKyAgKiBZb3UgY2FuIG5vdyBjb21wYXJlIOKAnG1lc3NhZ2UgPT0gbm9uX21lc3NhZ2Vfb2JqZWN04oCdIGFuZCBpdCB3aWxsIHJldHVybiBmYWxzZQ0KKyAgICBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4NCisgICogSlJ1Ynk6IGZpeGVkICNoYXNoQ29kZSB0byBwcm9wZXJseSByZWZsZWN0IHRoZSB2YWx1ZXMgaW4gdGhlIG1lc3NhZ2UuDQorDQorICBKYXZhc2NyaXB0DQorICAqIERlc2VyaWFsaXphdGlvbiBvZiByZXBlYXRlZCBmaWVsZHMgbm8gbG9uZ2VyIGhhcyBxdWFkcmF0aWMgcGVyZm9ybWFuY2UNCisgICAgYmVoYXZpb3IuDQorICAqIFVURi04IGVuY29kaW5nL2RlY29kaW5nIG5vdyBwcm9wZXJseSBzdXBwb3J0cyBoaWdoIGNvZGVwb2ludHMuDQorICAqIEFkZGVkIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIHNvbWUgd2VsbC1rbm93biB0eXBlczogQW55LCBTdHJ1Y3QsIGFuZA0KKyAgICBUaW1lc3RhbXAuIFRoZXNlIG1ha2UgaXQgZWFzaWVyIHRvIGNvbnZlcnQgZGF0YSBiZXR3ZWVuIG5hdGl2ZSBKYXZhU2NyaXB0DQorICAgIHR5cGVzIGFuZCB0aGUgd2VsbC1rbm93biBwcm90b2J1ZiB0eXBlcy4NCisNCisyMDE2LTA5LTIzIHZlcnNpb24gMy4xLjAgKEMrKy9KYXZhL1B5dGhvbi9QSFAvUnVieS9PYmplY3RpdmUtQy9DIy9KYXZhU2NyaXB0L0xpdGUpDQorICBHZW5lcmFsDQorICAqIFByb3RvMyBzdXBwb3J0IGluIFBIUCAoYWxwaGEpLg0KKyAgKiBWYXJpb3VzIGJ1ZyBmaXhlcy4NCisNCisgIEMrKw0KKyAgKiBBZGRlZCBNZXNzYWdlTGl0ZTo6Qnl0ZVNpemVMb25nKCkgdGhhdOKAmXMgZXF1aXZhbGVudCB0bw0KKyAgICBNZXNzYWdlTGl0ZTo6Qnl0ZVNpemUoKSBidXQgcmV0dXJucyB0aGUgdmFsdWUgaW4gc2l6ZV90LiBVc2VmdWwgdG8gY2hlY2sNCisgICAgd2hldGhlciBhIG1lc3NhZ2UgaXMgb3ZlciB0aGUgMkcgc2l6ZSBsaW1pdCB0aGF0IHByb3RvYnVmIGNhbiBzdXBwb3J0Lg0KKyAgKiBNb3ZlZCBkZWZhdWx0X2luc3RhbmNlcyB0byBnbG9iYWwgdmFyaWFibGVzLiBUaGlzIGFsbG93cyBkZWZhdWx0X2luc3RhbmNlDQorICAgIGFkZHJlc3NlcyB0byBiZSBrbm93biBhdCBjb21waWxlIHRpbWUuDQorICAqIEFkZGluZyBtaXNzaW5nIGdlbmVyaWMgZ2NjIDY0LWJpdCBhdG9taWNvcHMuDQorICAqIFJlc3RvcmUgTmV3KkNhbGxiYWNrIGludG8gZ29vZ2xlOjpwcm90b2J1ZiBuYW1lc3BhY2Ugc2luY2UgdGhlc2UgYXJlIHVzZWQNCisgICAgYnkgdGhlIHNlcnZpY2Ugc3R1YnMgY29kZQ0KKyAgKiBKU09OIHN1cHBvcnQuDQorICAgICogRml4ZWQgc29tZSBjb25mb3JtYW5jZSBpc3N1ZXMuDQorICAqIEZpeGVkIGEgSlNPTiBzZXJpYWxpemF0aW9uIGJ1ZyBmb3IgYnl0ZXMgZmllbGRzLg0KKw0KKyAgSmF2YQ0KKyAgKiBGaXhlZCBhIGJ1ZyBpbiBUZXh0Rm9ybWF0IHRoYXQgZG9lc27igJl0IGFjY2VwdCBlbXB0eSByZXBlYXRlZCBmaWVsZHMgKGkuZS4sDQorICAgIOKAnGZpZWxkOiBbIF3igJ0pLg0KKyAgKiBKU09OIHN1cHBvcnQNCisgICAgKiBGaXhlZCBKc29uRm9ybWF0IHRvIGRvIGNvcnJlY3Qgc25ha2VfY2FzZS10by1jYW1lbENhc2UgY29udmVyc2lvbiBmb3INCisgICAgICBub24tc3R5bGUtY29uZm9ybWluZyBmaWVsZCBuYW1lcy4NCisgICAgKiBGaXhlZCBKc29uRm9ybWF0IHRvIHBhcnNlIGVtcHR5IEFueSBtZXNzYWdlIGNvcnJlY3RseS4NCisgICAgKiBBZGRlZCBhbiBvcHRpb24gdG8gSnNvbkZvcm1hdC5QYXJzZXIgdG8gaWdub3JlIHVua25vd24gZmllbGRzLg0KKyAgKiBFeHBlcmltZW50YWwgQVBJDQorICAgICogQWRkZWQgVW5zYWZlQnl0ZU9wZXJhdGlvbnMudW5zYWZlV3JhcChieXRlW10pIHRvIHdyYXAgYSBieXRlIGFycmF5IGludG8NCisgICAgICBCeXRlU3RyaW5nIHdpdGhvdXQgY29weS4NCisNCisgIFB5dGhvbg0KKyAgKiBKU09OIHN1cHBvcnQNCisgICAgKiBGaXhlZCBzb21lIGNvbmZvcm1hbmNlIGlzc3Vlcy4NCisNCisgIFBIUCAoQWxwaGEpDQorICAqIFdlIGhhdmUgYWRkZWQgdGhlIHByb3RvMyBzdXBwb3J0IGZvciBQSFAgdmlhIGJvdGggYSBwdXJlIFBIUCBwYWNrYWdlIGFuZCBhDQorICAgIG5hdGl2ZSBjIGV4dGVuc2lvbi4gVGhlIHB1cmUgUEhQIHBhY2thZ2UgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSB1c2FiaWxpdHkNCisgICAgdG8gd2lkZXIgcmFuZ2Ugb2YgUEhQIHBsYXRmb3Jtcywgd2hpbGUgdGhlIGMgZXh0ZW5zaW9uIGlzIGludGVuZGVkIHRvDQorICAgIHByb3ZpZGUgaGlnaGVyIHBlcmZvcm1hbmNlLiBCb3RoIGltcGxlbWVudGF0aW9ucyBwcm92aWRlIHRoZSBzYW1lIHJ1bnRpbWUNCisgICAgQVBJcyBhbmQgc2hhcmUgdGhlIHNhbWUgZ2VuZXJhdGVkIGNvZGUuIFVzZXJzIGRvbuKAmXQgbmVlZCB0byByZS1nZW5lcmF0ZQ0KKyAgICBjb2RlIGZvciB0aGUgc2FtZSBwcm90byBkZWZpbml0aW9uIHdoZW4gdGhleSB3YW50IHRvIHN3aXRjaCB0aGUNCisgICAgaW1wbGVtZW50YXRpb24gbGF0ZXIuIFRoZSBwdXJlIFBIUCBwYWNrYWdlIGlzIGluY2x1ZGVkIGluIHRoZSBwaHAvc3JjDQorICAgIGRpcmVjdG9yeSwgYW5kIHRoZSBjIGV4dGVuc2lvbiBpcyBpbmNsdWRlZCBpbiB0aGUgcGhwL2V4dCBkaXJlY3RvcnkuDQorDQorICAgIEJvdGggaW1wbGVtZW50YXRpb25zIHByb3ZpZGUgaWRpb21hdGljIFBIUCBBUElzOg0KKyAgICAqIEFsbCBtZXNzYWdlcyBhbmQgZW51bXMgYXJlIGRlZmluZWQgYXMgUEhQIGNsYXNzZXMuDQorICAgICogQWxsIG1lc3NhZ2UgZmllbGRzIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIHZpYSBnZXR0ZXIvc2V0dGVyLg0KKyAgICAqIEJvdGggcmVwZWF0ZWQgZmllbGQgZWxlbWVudHMgYW5kIG1hcCBlbGVtZW50cyBhcmUgc3RvcmVkIGluIGNvbnRhaW5lcnMNCisgICAgICB0aGF0IGFjdCBsaWtlIGEgbm9ybWFsIFBIUCBhcnJheS4NCisNCisgICAgVW5saWtlIHNldmVyYWwgZXhpc3RpbmcgdGhpcmQtcGFydHkgUEhQIGltcGxlbWVudGF0aW9ucyBmb3IgcHJvdG9idWYsIG91cg0KKyAgICBpbXBsZW1lbnRhdGlvbnMgYXJlIGJ1aWx0IG9uIGEgInN0cm9uZ2x5LXR5cGVkIiBwaGlsb3NvcGh5OiBtZXNzYWdlIGZpZWxkcw0KKyAgICBhbmQgYXJyYXkvbWFwIGNvbnRhaW5lcnMgd2lsbCB0aHJvdyBleGNlcHRpb25zIGVhZ2VybHkgd2hlbiB2YWx1ZXMgb2YgdGhlDQorICAgIGluY29ycmVjdCB0eXBlIChub3QgaW5jbHVkaW5nIHRob3NlIHRoYXQgY2FuIGJlIHR5cGUgY29udmVydGVkLCBlLmcuLA0KKyAgICBkb3VibGUgPC0+IGludGVnZXIgPC0+IG51bWVyaWMgc3RyaW5nKSBhcmUgaW5zZXJ0ZWQuDQorDQorICAgIEN1cnJlbnRseSwgcHVyZSBQSFAgcnVudGltZSBzdXBwb3J0cyBwaHA1LjUsIDUuNiBhbmQgNyBvbiBsaW51eC4gQw0KKyAgICBleHRlbnNpb24gcnVudGltZSBzdXBwb3J0cyBwaHA1LjUgYW5kIDUuNiBvbiBsaW51eC4NCisNCisgICAgU2VlIHBocC9SRUFETUUubWQgZm9yIG1vcmUgZGV0YWlscyBhYm91dCBpbnN0YWxsbWVudC4gU2VlDQorICAgIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9waHB0dXRvcmlhbCBmb3IgbW9yZQ0KKyAgICBkZXRhaWxzIGFib3V0IEFQSXMuDQorDQorICBPYmplY3RpdmUtQw0KKyAgKiBIZWxwZXJzIGFyZSBub3cgcHJvdmlkZWQgZm9yIHdvcmtpbmcgdGhlIEFueSB3ZWxsIGtub3duIHR5cGUgKHNlZQ0KKyAgICBHUEJXZWxsS25vd25UeXBlcy5oIGZvciB0aGUgYXBpIGFkZGl0aW9ucykuDQorICAqIFNvbWUgaW1wcm92ZW1lbnRzIGluIHN0YXJ0dXAgY29kZSAoZXNwZWNpYWxseSB3aGVuIGV4dGVuc2lvbnMgYXJlbuKAmXQgdXNlZCkuDQorDQorICBKYXZhc2NyaXB0DQorICAqIEZpeGVkIG1pc3NpbmcgaW1wb3J0IG9mIGpzcGIuTWFwDQorICAqIEZpeGVkIHZhbHVlV3JpdGVyRm4gdmFyaWFibGUgbmFtZQ0KKw0KKyAgUnVieQ0KKyAgKiBGaXhlZCBoYXNoIGNvbXB1dGF0aW9uIGZvciBKUnVieSdzIFJ1YnlNZXNzYWdlDQorICAqIE1ha2Ugc3VyZSBtYXAgcGFyc2luZyBmcmFtZXMgYXJlIEdDLXJvb3RlZC4NCisgICogQWRkZWQgQVBJIHN1cHBvcnQgZm9yIHdlbGwta25vd24gdHlwZXMuDQorDQorICBDIw0KKyAgKiBSZW1vdmVkIGNoZWNrIG9uIGRlcGVuZGVuY3kgaW4gdGhlIEMjIHJlZmxlY3Rpb24gQVBJLg0KKw0KKzIwMTYtMDktMDYgdmVyc2lvbiAzLjAuMiAoQysrL0phdmEvUHl0aG9uL1J1YnkvT2JqZWN0aXZlLUMvQyMvSmF2YVNjcmlwdC9MaXRlKQ0KKyAgR2VuZXJhbA0KKyAgKiBWYXJpb3VzIGJ1ZyBmaXhlcy4NCisNCisgIE9iamVjdGl2ZSBDDQorICAqIEZpeCBmb3Igb25lb2ZzIGluIHByb3RvMyBzeW50YXggZmlsZXMgd2hlcmUgZmllbGRzIHdlcmUgc2V0IHRvIHRoZSB6ZXJvDQorICAgIHZhbHVlLg0KKyAgKiBGaXggZm9yIGVtYmVkZGVkIG51bGwgY2hhcmFjdGVyIGluIHN0cmluZ3MuDQorICAqIENvY29hRG9jcyBzdXBwb3J0DQorDQorICBSdWJ5DQorICAqIEZpeGVkIG1lbW9yeSBjb3JydXB0aW9uIGJ1ZyBpbiBwYXJzaW5nIHRoYXQgY291bGQgb2NjdXIgdW5kZXIgR0MgcHJlc3N1cmUuDQorDQorICBKYXZhc2NyaXB0DQorICAqIGpzcGIuTWFwIGlzIG5vdyBwcm9wZXJseSBleHBvcnRlZCB0byBDb21tb25KUyBtb2R1bGVzLg0KKw0KKyAgQyMNCisgICogUmVtb3ZlZCBsZWdhY3lfZW51bV92YWx1ZXMgZmxhZy4NCisNCisNCisyMDE2LTA3LTI3IHZlcnNpb24gMy4wLjAgKEMrKy9KYXZhL1B5dGhvbi9SdWJ5L09iamVjdGl2ZS1DL0MjL0phdmFTY3JpcHQvTGl0ZSkNCisgIEdlbmVyYWwNCisgICogVGhpcyBsb2cgb25seSBjb250YWlucyBjaGFuZ2VzIHNpbmNlIHRoZSBiZXRhLTQgcmVsZWFzZS4gU3VtbWFyaXplZCBjaGFuZ2UNCisgICAgbG9nIHNpbmNlIHRoZSBsYXN0IHN0YWJsZSByZWxlYXNlICh2Mi42LjEpIGNhbiBiZSBmb3VuZCBpbiB0aGUgZ2l0aHViDQorICAgIHJlbGVhc2UgcGFnZS4NCisNCisgIENvbXBhdGliaWxpdHkgTm90aWNlDQorICAqIHYzLjAuMCBpcyB0aGUgZmlyc3QgQVBJIHN0YWJsZSByZWxlYXNlIG9mIHRoZSB2My54IHNlcmllcy4gV2UgZG8gbm90IGV4cGVjdA0KKyAgICBhbnkgZnV0dXJlIEFQSSBicmVha2luZyBjaGFuZ2VzLg0KKyAgKiBGb3IgQysrLCBKYXZhIExpdGUgYW5kIE9iamVjdGl2ZS1DLCBzb3VyY2UgbGV2ZWwgY29tcGF0aWJpbGl0eSBpcw0KKyAgICBndWFyYW50ZWVkLiAgVXBncmFkaW5nIGZyb20gdjMuMC4wIHRvIG5ld2VyIG1pbm9yIHZlcnNpb24gcmVsZWFzZXMgd2lsbCBiZQ0KKyAgICBzb3VyY2UgY29tcGF0aWJsZS4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgY29kZSBjb21waWxlcyBhZ2FpbnN0IHByb3RvYnVmDQorICAgIHYzLjAuMCwgaXQgd2lsbCBjb250aW51ZSB0byBjb21waWxlIGFmdGVyIHlvdSB1cGdyYWRlIHByb3RvYnVmIGxpYnJhcnkgdG8NCisgICAgdjMuMS4wLg0KKyAgKiBGb3Igb3RoZXIgbGFuZ3VhZ2VzLCBib3RoIHNvdXJjZSBsZXZlbCBjb21wYXRpYmlsaXR5IGFuZCBiaW5hcnkgbGV2ZWwNCisgICAgY29tcGF0aWJpbGl0eSBhcmUgZ3VhcmFudGVlZC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgSmF2YSBiaW5hcnkgYnVpbHQNCisgICAgYWdhaW5zdCBwcm90b2J1ZiB2My4wLjAuIEFmdGVyIHN3aXRjaGluZyB0aGUgcHJvdG9idWYgcnVudGltZSBiaW5hcnkgdG8NCisgICAgdjMuMS4wLCB5b3VyIGJ1aWx0IGJpbmFyeSBzaG91bGQgY29udGludWUgdG8gd29yay4NCisgICogQ29tcGF0aWJpbGl0eSBpcyBvbmx5IGd1YXJhbnRlZWQgZm9yIGRvY3VtZW50ZWQgQVBJIGFuZCBkb2N1bWVudGVkDQorICAgIGJlaGF2aW9ycy4gSWYgeW91IGFyZSB1c2luZyB1bmRvY3VtZW50ZWQgQVBJIChlLmcuLCB1c2UgYW55dGhpbmcgaW4gdGhlIEMrKw0KKyAgICBpbnRlcm5hbCBuYW1lc3BhY2UpLCBpdCBjYW4gYmUgYnJva2VuIGJ5IG1pbm9yIHZlcnNpb24gcmVsZWFzZXMgaW4gYW4NCisgICAgdW5kZXRlcm1pbmVkIG1hbm5lci4NCisNCisgIFJ1YnkNCisgICogV2hlbiB5b3UgYXNzaWduIGEgc3RyaW5nIGZpZWxkIGBhLnN0cmluZ19maWVsZCA9ICJYImAsIHdlIG5vdyBjYWxsDQorICAgICNlbmNvZGUoVVRGLTgpIG9uIHRoZSBzdHJpbmcgYW5kIGZyZWV6ZSB0aGUgY29weS4gVGhpcyBzYXZlcyB5b3UgZnJvbQ0KKyAgICBuZWVkaW5nIHRvIGVuc3VyZSB0aGUgc3RyaW5nIGlzIGFscmVhZHkgZW5jb2RlZCBhcyBVVEYtOC4gSXQgYWxzbyBwcmV2ZW50cw0KKyAgICB5b3UgZnJvbSBtdXRhdGluZyB0aGUgc3RyaW5nIGFmdGVyIGl0IGhhcyBiZWVuIGFzc2lnbmVkICh0aGlzIGlzIGhvdyB3ZQ0KKyAgICBlbnN1cmUgaXQgc3RheXMgdmFsaWQgVVRGLTgpLg0KKyAgKiBUaGUgZ2VuZXJhdGVkIGZpbGUgZm9yIGBmb28ucHJvdG9gIGlzIG5vdyBgZm9vX3BiLnJiYCBpbnN0ZWFkIG9mIGp1c3QNCisgICAgYGZvby5yYmAuIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIHNlZSB3aGljaCBpbXBvcnRzL3JlcXVpcmVzIGFyZSBmcm9tDQorICAgIHByb3RvYnVmIGdlbmVyYXRlZCBjb2RlLCBhbmQgYWxzbyBwcmV2ZW50cyBjb25mbGljdHMgd2l0aCBhbnkgYGZvby5yYmAgZmlsZQ0KKyAgICB5b3UgbWlnaHQgaGF2ZSB3cml0dGVuIGRpcmVjdGx5IGluIFJ1YnkuIEl0IGlzIGEgYmFja3dhcmQtaW5jb21wYXRpYmxlDQorICAgIGNoYW5nZTogeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgYWxsIG9mIHlvdXIgYHJlcXVpcmVgIHN0YXRlbWVudHMuDQorICAqIEZvciBwYWNrYWdlIG5hbWVzIGxpa2UgYGZvb19iYXJgLCB3ZSBub3cgdHJhbnNsYXRlIHRoaXMgdG8gdGhlIFJ1YnkgbW9kdWxlDQorICAgIGBGb29CYXJgLiBUaGlzIGlzIG1vcmUgaWRpb21hdGljIFJ1YnkgdGhhbiB3aGF0IHdlIHVzZWQgdG8gZG8gKGBGb29fYmFyYCkuDQorDQorICBKYXZhU2NyaXB0DQorICAqIFNjYWxhciBmaWVsZHMgbGlrZSBudW1iZXJzIGFuZCBib29sZWFuIG5vdyByZXR1cm4gZGVmYXVsdHMgaW5zdGVhZCBvZg0KKyAgICBgdW5kZWZpbmVkYCBvciBgbnVsbGAgd2hlbiB0aGV5IGFyZSB1bnNldC4gWW91IGNhbiB0ZXN0IGZvciBwcmVzZW5jZQ0KKyAgICBleHBsaWNpdGx5IGJ5IGNhbGxpbmcgYGhhc0ZvbygpYCwgd2hpY2ggd2Ugbm93IGdlbmVyYXRlIGZvciBzY2FsYXIgZmllbGRzLg0KKw0KKyAgSmF2YSBMaXRlDQorICAqIEphdmEgTGl0ZSBpcyBub3cgaW1wbGVtZW50ZWQgYXMgYSBzZXBhcmF0ZSBwbHVnaW4sIG1haW50YWluZWQgaW4gdGhlDQorICAgIGBqYXZhbGl0ZWAgYnJhbmNoLiBCb3RoIGxpdGUgcnVudGltZSBhbmQgcHJvdG9jIGFydGlmYWN0cyB3aWxsIGJlIGF2YWlsYWJsZQ0KKyAgICBpbiBNYXZlbi4NCisNCisgIEMjDQorICAqIFRhcmdldCBwbGF0Zm9ybXMgbm93IC5ORVQgNC41LCBzZWxlY3RlZCBwb3J0YWJsZSBzdWJzZXRzIGFuZCAuTkVUIENvcmUuDQorICAqIGxlZ2FjeV9lbnVtX3ZhbHVlcyBvcHRpb24gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4NCisNCisyMDE2LTA3LTE1IHZlcnNpb24gMy4wLjAtYmV0YS00IChDKysvSmF2YS9QeXRob24vUnVieS9PYmplY3RpdmUtQy9DIy9KYXZhU2NyaXB0KQ0KKyAgR2VuZXJhbA0KKyAgKiBBZGRlZCBhIGRldGVybWluaXN0aWMgc2VyaWFsaXphdGlvbiBBUEkgZm9yIEMrKy4gVGhlIGRldGVybWluaXN0aWMNCisgICAgc2VyaWFsaXphdGlvbiBndWFyYW50ZWVzIHRoYXQgZ2l2ZW4gYSBiaW5hcnksIGVxdWFsIG1lc3NhZ2VzIHdpbGwgYmUNCisgICAgc2VyaWFsaXplZCB0byB0aGUgc2FtZSBieXRlcy4gVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zIGxpa2UgTWFwUmVkdWNlIHRvDQorICAgIGdyb3VwIGVxdWFsIG1lc3NhZ2VzIGJhc2VkIG9uIHRoZSBzZXJpYWxpemVkIGJ5dGVzLiBUaGUgZGV0ZXJtaW5pc3RpYw0KKyAgICBzZXJpYWxpemF0aW9uIGlzLCBob3dldmVyLCBOT1QgY2Fub25pY2FsIGFjcm9zcyBsYW5ndWFnZXM7IGl0IGlzIGFsc28NCisgICAgdW5zdGFibGUgYWNyb3NzIGRpZmZlcmVudCBidWlsZHMgd2l0aCBzY2hlbWEgY2hhbmdlcyBkdWUgdG8gdW5rbm93biBmaWVsZHMuDQorICAgIFVzZXJzIHdobyBuZWVkIGNhbm9uaWNhbCBzZXJpYWxpemF0aW9uLCBlLmcuIHBlcnNpc3RlbnQgc3RvcmFnZSBpbiBhDQorICAgIGNhbm9uaWNhbCBmb3JtLCBmaW5nZXJwcmludGluZywgZXRjLCBzaG91bGQgZGVmaW5lIHRoZWlyIG93bg0KKyAgICBjYW5vbmljYWxpemF0aW9uIHNwZWNpZmljYXRpb24gYW5kIGltcGxlbWVudCB0aGUgc2VyaWFsaXplciB1c2luZyByZWZsZWN0aW9uDQorICAgIEFQSXMgcmF0aGVyIHRoYW4gcmVseWluZyBvbiB0aGlzIEFQSS4NCisgICogQWRkZWQgT25lb2ZPcHRpb25zLiBZb3UgY2FuIG5vdyBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgZm9yIG9uZW9mIGdyb3Vwcy4NCisgICAgICBpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsNCisgICAgICBleHRlbmQgZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucyB7DQorICAgICAgICBvcHRpb25hbCBpbnQzMiBteV9vbmVvZl9leHRlbnNpb24gPSAxMjM0NTsNCisgICAgICB9DQorICAgICAgbWVzc2FnZSBGb28gew0KKyAgICAgICAgb25lb2Ygb25lb2ZfZ3JvdXAgew0KKyAgICAgICAgICAobXlfb25lb2ZfZXh0ZW5zaW9uKSA9IDU0MzIxOw0KKyAgICAgICAgICAuLi4NCisgICAgICAgIH0NCisgICAgICB9DQorDQorICBDKysgKGJldGEpDQorICAqIEludHJvZHVjZWQgYSBkZXRlcm1pbmlzdGljIHNlcmlhbGl6YXRpb24gQVBJIGluDQorICAgIENvZGVkT3V0cHV0U3RyZWFtOjpTZXRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYyhib29sKS4gU2VlIHRoZSBub3RlcyBhYm91dA0KKyAgICBkZXRlcm1pbmlzdGljIHNlcmlhbGl6YXRpb24gaW4gdGhlIEdlbmVyYWwgc2VjdGlvbi4NCisgICogQWRkZWQgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwOjpzd2FwKCkgdG8gc3dhcCB0d28gbWFwIGZpZWxkcy4NCisgICogRml4ZWQgYSBtZW1vcnkgbGVhayB3aGVuIGNhbGxpbmcgUmVmbGVjdGlvbjo6UmVsZWFzZU1lc3NhZ2UoKSBvbiBhIG1lc3NhZ2UNCisgICAgYWxsb2NhdGVkIG9uIGFyZW5hLg0KKyAgKiBJbXByb3ZlZCBlcnJvciByZXBvcnRpbmcgd2hlbiBwYXJzaW5nIHRleHQgZm9ybWF0IHByb3Rvcy4NCisgICogSlNPTg0KKyAgICAgIC0gQWRkZWQgYSBuZXcgcGFyc2VyIG9wdGlvbiB0byBpZ25vcmUgdW5rbm93biBmaWVsZHMgd2hlbiBwYXJzaW5nIEpTT04uDQorICAgICAgLSBBZGRlZCBjb252ZW5pZW50IG1ldGhvZHMgZm9yIG1lc3NhZ2UgdG8vZnJvbSBKU09OIGNvbnZlcnNpb24uDQorICAqIFZhcmlvdXMgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucy4NCisNCisgIEphdmEgKGJldGEpDQorICAqIEZpbGUgb3B0aW9uICJqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCIgaXMgbm93IGRlcHJlY2F0ZWQuIGVxdWFscygpIGFuZA0KKyAgICBoYXNoQ29kZSgpIG1ldGhvZHMgYXJlIGdlbmVyYXRlZCBieSBkZWZhdWx0Lg0KKyAgKiBBZGRlZCBhIG5ldyBKU09OIHByaW50ZXIgb3B0aW9uICJvbWl0dGluZ0luc2lnbmlmaWNhbnRXaGl0ZXNwYWNlIiB0byBwcm9kdWNlDQorICAgIGEgbW9yZSBjb21wYWN0IEpTT04gb3V0cHV0LiBUaGUgcHJpbnRlciB3aWxsIHByZXR0eS1wcmludCBieSBkZWZhdWx0Lg0KKyAgKiBVcGRhdGVkIEphdmEgcnVudGltZSB0byBiZSBjb21wYXRpYmxlIHdpdGggMi41LjAvMi42LjEgZ2VuZXJhdGVkIHByb3Rvcy4NCisNCisgIFB5dGhvbiAoYmV0YSkNCisgICogQWRkZWQgc3VwcG9ydCB0byBwcmV0dHkgcHJpbnQgQW55IG1lc3NhZ2VzIGluIHRleHQgZm9ybWF0Lg0KKyAgKiBBZGRlZCBhIGZsYWcgdG8gaWdub3JlIHVua25vd24gZmllbGRzIHdoZW4gcGFyc2luZyBKU09OLg0KKyAgKiBCdWdmaXg6ICJAdHlwZSIgZmllbGQgb2YgYSBKU09OIEFueSBtZXNzYWdlIGlzIG5vdyBjb3JyZWN0bHkgcHV0IGJlZm9yZQ0KKyAgICBvdGhlciBmaWVsZHMuDQorDQorICBPYmplY3RpdmUtQyAoYmV0YSkNCisgICogVXBkYXRlZCB0aGUgY29kZSB0byBzdXBwb3J0IGNvbXBpbGluZyB3aXRoIG1vcmUgY29tcGlsZXIgd2FybmluZ3MNCisgICAgZW5hYmxlZC4gKElzc3VlIDE2MTYpDQorICAqIEV4cG9zaW5nIG1vcmUgZGV0YWlsZWQgZXJyb3JzIGZvciBwYXJzaW5nIGZhaWx1cmVzLiAoUFIgMTYyMykNCisgICogU21hbGwgKGJyZWFraW5nKSBjaGFuZ2UgdG8gdGhlIG5hbWluZyBvZiBzb21lIG1ldGhvZHMgb24gdGhlIHN1cHBvcnQgY2xhc3Nlcw0KKyAgICBmb3IgbWFwPD4uIFRoZXJlIHdlcmUgY29sbGlzaW9ucyB3aXRoIHRoZSBzeXN0ZW0gcHJvdmlkZWQgS1ZPIHN1cHBvcnQsIHNvDQorICAgIHRoZSBuYW1lcyB3ZXJlIGNoYW5nZWQgdG8gYXZvaWQgdGhvc2UgaXNzdWVzLiAgKFBSIDE2OTkpDQorICAqIEZpeGVkIGZvciBwcm9wZXIgU3dpZnQgYnJpZGdpbmcgb2YgZXJyb3IgaGFuZGxpbmcgZHVyaW5nIHBhcnNpbmcuIChQUiAxNzEyKQ0KKyAgKiBDb21wbGV0ZSBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIHNvdXJjZXMgdGhhdCB3aWxsIGdvIGludG8gYSBGcmFtZXdvcmsgYW5kDQorICAgIGRlcGVuZCBvbiBnZW5lcmF0ZWQgc291cmNlcyBmcm9tIG90aGVyIEZyYW1ld29ya3MuIChJc3N1ZSAxNDU3KQ0KKw0KKyAgQyMgKGJldGEpDQorICAqIFJlcGVhdGVkRmllbGQgb3B0aW1pemF0aW9ucy4NCisgICogU3VwcG9ydCBmb3IgLk5FVCBDb3JlLg0KKyAgKiBNaW5vciBidWcgZml4ZXMuDQorICAqIEFiaWxpdHkgdG8gZm9ybWF0IGEgc2luZ2xlIHZhbHVlIGluIEpzb25Gb3JtYXR0ZXIgKGFkdmFuY2VkIHVzYWdlIG9ubHkpLg0KKyAgKiBNb2RpZmljYXRpb25zIHRvIGF0dHJpYnV0ZXMgYXBwbGllZCB0byBnZW5lcmF0ZWQgY29kZS4NCisNCisgIEphdmFzY3JpcHQgKGFscGhhKQ0KKyAgKiBNYXBzIG5vdyBoYXZlIGEgcmVhbCBtYXAgQVBJIGluc3RlYWQgb2YgYmVpbmcgdHJlYXRlZCBhcyByZXBlYXRlZCBmaWVsZHMuDQorICAqIFdlbGwta25vd24gdHlwZXMgYXJlIG5vdyBwcm92aWRlZCBpbiB0aGUgZ29vZ2xlLXByb3RvYnVmIHBhY2thZ2UsIGFuZCB0aGUNCisgICAgY29kZSBnZW5lcmF0b3Iga25vd3MgdG8gcmVxdWlyZSgpIHRoZW0gZnJvbSB0aGF0IHBhY2thZ2UuDQorICAqIEJ1Z2ZpeDogbm9uLWNhbm9uaWNhbCB2YXJpbnRzIGFyZSBjb3JyZWN0bHkgZGVjb2RlZC4NCisNCisgIFJ1YnkgKGFscGhhKQ0KKyAgKiBBY2Nlc3NvcnMgZm9yIG9uZW9mIGZpZWxkcyBub3cgcmV0dXJuIGRlZmF1bHQgdmFsdWVzIGluc3RlYWQgb2YgbmlsLg0KKw0KKyAgSmF2YSBMaXRlDQorICAqIEphdmEgbGl0ZSBzdXBwb3J0IGlzIHJlbW92ZWQgZnJvbSBwcm90b2NvbCBjb21waWxlci4gSXQgd2lsbCBiZSBzdXBwb3J0ZWQNCisgICAgYXMgYSBwcm90b2NvbCBjb21waWxlciBwbHVnaW4gaW4gYSBzZXBhcmF0ZSBjb2RlIGJyYW5jaC4NCisNCisyMDE2LTA1LTE2IHZlcnNpb24gMy4wLjAtYmV0YS0zIChDKysvSmF2YS9QeXRob24vUnVieS9OYW5vL09iamVjdGl2ZS1DL0MjL0phdmFTY3JpcHQpDQorICBHZW5lcmFsDQorICAqIFN1cHBvcnRlZCBQcm90bzMgbGl0ZS1ydW50aW1lIGluIEMrKy9KYXZhIGZvciBtb2JpbGUgcGxhdGZvcm1zLg0KKyAgKiBBbnkgdHlwZSBub3cgc3VwcG9ydHMgQVBJcyB0byBzcGVjaWZ5IHByZWZpeGVzIG90aGVyIHRoYW4NCisgICAgdHlwZS5nb29nbGVhcGlzLmNvbQ0KKyAgKiBSZW1vdmVkIGphdmFuYW5vX3VzZV9kZXByZWNhdGVkX3BhY2thZ2Ugb3B0aW9uOyBOYW5vIHdpbGwgYWx3YXlzIGhhcyBpdHMgb3duDQorICAgICIubmFubyIgcGFja2FnZS4NCisNCisgIEMrKyAoQmV0YSkNCisgICogSW1wcm92ZWQgaGFzaCBtYXBzLg0KKyAgICAgIC0gSW1wcm92ZWQgaGFzaCBtYXBzIGNvbW1lbnRzLiBJbiBwYXJ0aWN1bGFyLCBwbGVhc2Ugbm90ZSB0aGF0IGVxdWFsIGhhc2gNCisgICAgICAgIG1hcHMgd2lsbCBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0aGUgc2FtZSBpdGVyYXRpb24gb3JkZXIgYW5kDQorICAgICAgICBzZXJpYWxpemF0aW9uLg0KKyAgICAgIC0gQWRkZWQgYSBuZXcgaGFzaCBtYXBzIGltcGxlbWVudGF0aW9uIHRoYXQgd2lsbCBiZWNvbWUgdGhlIGRlZmF1bHQgaW4gYQ0KKyAgICAgICAgbGF0ZXIgcmVsZWFzZS4NCisgICogQXJlbmFzDQorICAgICAgLSBTZXZlcmFsIGlubGluZWQgbWV0aG9kcyBpbiBBcmVuYSB3ZXJlIG1vdmVkIHRvIG91dC1vZi1saW5lIHRvIGltcHJvdmUNCisgICAgICAgIGJ1aWxkIHBlcmZvcm1hbmNlIGFuZCBjb2RlIHNpemUuDQorICAgICAgLSBBZGRlZCBTcGFjZUFsbG9jYXRlZEFuZFVzZWQoKSB0byByZXBvcnQgYm90aCBzcGFjZSB1c2VkIGFuZCBhbGxvY2F0ZWQNCisgICAgICAtIEFkZGVkIGNvbnZlbmllbnQgY2xhc3MgVW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydGVyDQorICAqIEFueQ0KKyAgICAgIC0gQWxsb3cgY3VzdG9tIHR5cGUgVVJMIHByZWZpeGVzIGluIEFueSBwYWNraW5nLg0KKyAgICAgIC0gVGV4dEZvcm1hdCBub3cgZXhwYW5kIHRoZSBBbnkgdHlwZSByYXRoZXIgdGhhbiBwcmludGluZyBieXRlcy4NCisgICogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBhbmQgdmFyaW91cyBidWcgZml4ZXMuDQorDQorICBKYXZhIChCZXRhKQ0KKyAgKiBJbnRyb2R1Y2VkIGFuIEV4cGVyaW1lbnRhbEFwaSBhbm5vdGF0aW9uLiBBbm5vdGF0ZWQgQVBJcyBhcmUgZXhwZXJpbWVudGFsDQorICAgIGFuZCBhcmUgc3ViamVjdCB0byBjaGFuZ2UgaW4gYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgd2F5IGluIGZ1dHVyZSByZWxlYXNlcy4NCisgICogSW50cm9kdWNlZCB6ZXJvLWNvcHkgc2VyaWFsaXphdGlvbiBhcyBhbiBFeHBlcmltZW50YWxBcGkNCisgICAgICAtIEludHJvZHVjdGlvbiBvZiB0aGUgYEJ5dGVPdXRwdXRgIGludGVyZmFjZS4gVGhpcyBpcyBzaW1pbGFyIHRvDQorICAgICAgICBgT3V0cHV0U3RyZWFtYCBidXQgcHJvdmlkZXMgc2VtYW50aWNzIGZvciBsYXp5IHdyaXRpbmcgKGkuZS4gbm8NCisgICAgICAgIGltbWVkaWF0ZSBjb3B5IHJlcXVpcmVkKSBvZiBmaWVsZHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBpbW11dGFibGUuDQorICAgICAgLSBgQnl0ZVN0cmluZ2Agbm93IHN1cHBvcnRzIHdyaXRpbmcgdG8gYSBgQnl0ZU91dHB1dGAsIHdoaWNoIHdpbGwgZGlyZWN0bHkNCisgICAgICAgIGV4cG9zZSB0aGUgaW50ZXJuYWxzIG9mIHRoZSBgQnl0ZVN0cmluZ2AgKGkuZS4gYGJ5dGVbXWAgb3IgYEJ5dGVCdWZmZXJgKQ0KKyAgICAgICAgdG8gdGhlIGBCeXRlT3V0cHV0YCB3aXRob3V0IGNvcHlpbmcuDQorICAgICAgLSBgQ29kZWRPdXRwdXRTdHJlYW1gIG5vdyBzdXBwb3J0cyB3cml0aW5nIHRvIGEgYEJ5dGVPdXRwdXRgLiBgQnl0ZVN0cmluZ2ANCisgICAgICAgIGluc3RhbmNlcyB0aGF0IGFyZSB0b28gbGFyZ2UgdG8gZml0IGluIHRoZSBpbnRlcm5hbCBidWZmZXIgd2lsbCBiZQ0KKyAgICAgICAgKGxhemlseSkgd3JpdHRlbiB0byB0aGUgYEJ5dGVPdXRwdXRgIGRpcmVjdGx5Lg0KKyAgICAgIC0gVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zIHVzaW5nIGxhcmdlIGBCeXRlU3RyaW5nYCBmaWVsZHMgdG8gYXZvaWQNCisgICAgICAgIGR1cGxpY2F0aW9uIG9mIHRoZXNlIGZpZWxkcyBlbnRpcmVseS4gU3VjaCBhbiBhcHBsaWNhdGlvbiBjYW4gc3VwcGx5IGENCisgICAgICAgIGBCeXRlT3V0cHV0YCB0aGF0IGNoYWlucyB0b2dldGhlciB0aGUgY2h1bmtzIHJlY2VpdmVkIGZyb20NCisgICAgICAgIGBDb2RlZE91dHB1dFN0cmVhbWAgYmVmb3JlIGZvcndhcmRpbmcgdGhlbSBvbnRvIHRoZSBJTyBzeXN0ZW0uDQorICAqIE90aGVyIHJlbGF0ZWQgY2hhbmdlcyB0byBgQ29kZWRPdXRwdXRTdHJlYW1gDQorICAgICAgLSBBZGRpdGlvbmFsIHVzZSBvZiBgc3VuLm1pc2MuVW5zYWZlYCB3aGVyZSBwb3NzaWJsZSB0byBwZXJmb3JtIGZhc3QNCisgICAgICAgIGFjY2VzcyB0byBgYnl0ZVtdYCBhbmQgYEJ5dGVCdWZmZXJgIHZhbHVlcyBhbmQgYXZvaWRpbmcgdW5uZWNlc3NhcnkNCisgICAgICAgIHJhbmdlIGNoZWNraW5nLg0KKyAgICAgIC0gYEJ5dGVCdWZmZXJgLWJhY2tlZCBgQ29kZWRPdXRwdXRTdHJlYW1gIG5vdyB3cml0ZXMgZGlyZWN0bHkgdG8gdGhlDQorICAgICAgICBgQnl0ZUJ1ZmZlcmAgcmF0aGVyIHRoYW4gdG8gYW4gaW50ZXJtZWRpYXRlIGFycmF5Lg0KKyAgKiBJbXByb3ZlZCBsaXRlLXJ1bnRpbWUuDQorICAgICAgLSBMaXRlIHByb3RvcyBub3cgaW1wbGVtZW50IGRlZXAgZXF1YWxzL2hhc2hDb2RlL3RvU3RyaW5nDQorICAgICAgLSBTaWduaWZpY2FudGx5IGltcHJvdmVkIHRoZSBwZXJmb3JtYW5jZSBvZiBCdWlsZGVyI21lcmdlRnJvbSgpIGFuZA0KKyAgICAgICAgQnVpbGRlciNtZXJnZURlbGltaXRlZEZyb20oKQ0KKyAgKiBWYXJpb3VzIGJ1ZyBmaXhlcyBhbmQgc21hbGwgZmVhdHVyZSBlbmhhbmNlbWVudC4NCisgICAgICAtIEZpeGVkIHN0YWNrIG92ZXJmbG93IHdoZW4gaW4gaGFzaENvZGUoKSBmb3IgaW5maW5pdGUgcmVjdXJzaXZlIG9uZW9mcy4NCisgICAgICAtIEZpeGVkIHRoZSBsYXp5IGZpZWxkIHBhcnNpbmcgaW4gbGl0ZSB0byBtZXJnZSByYXRoZXIgdGhhbiBvdmVyd3JpdGUuDQorICAgICAgLSBUZXh0Rm9ybWF0IG5vdyBzdXBwb3J0cyByZXBvcnRpbmcgbGluZS9jb2x1bW4gbnVtYmVycyBvbiBlcnJvcnMuDQorICAgICAgLSBVcGRhdGVkIHRvIGFkZCBhcHByb3ByaWF0ZSBAT3ZlcnJpZGUgZm9yIGJldHRlciBjb21waWxlciBlcnJvcnMuDQorDQorICBQeXRob24gKEJldGEpDQorICAqIEFkZGVkIEpTT04gZm9ybWF0IGZvciBBbnksIFN0cnVjdCwgVmFsdWUgYW5kIExpc3RWYWx1ZQ0KKyAgKiBbIF0gaXMgbm93IGFjY2VwdGVkIGZvciBib3RoIHJlcGVhdGVkIHNjYWxhciBmaWVsZHMgYW5kIHJlcGVhdGVkIG1lc3NhZ2UNCisgICAgZmllbGRzIGluIHRleHQgZm9ybWF0IHBhcnNlci4NCisgICogTnVtZXJpY2FsIGZpZWxkIG5hbWUgaXMgbm93IHN1cHBvcnRlZCBpbiB0ZXh0IGZvcm1hdC4NCisgICogQWRkZWQgRGlzY2FyZFVua25vd25GaWVsZHMgQVBJIGZvciBweXRob24gcHJvdG9idWYgbWVzc2FnZS4NCisNCisgIE9iamVjdGl2ZS1DIChCZXRhKQ0KKyAgKiBQcm90byBjb21tZW50cyBub3cgY29tZSBvdmVyIGFzIEhlYWRlckRvYyBjb21tZW50cyBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMNCisgICAgc28gWGNvZGUgY2FuIHBpY2sgdGhlbSB1cCBhbmQgZGlzcGxheSB0aGVtLg0KKyAgKiBUaGUgbGlicmFyeSBoZWFkZXJzIGhhdmUgYmVlbiB1cGRhdGVkIHRvIHVzZSBIZWFkZXJEb2MgY29tbWVudHMgc28gWGNvZGUgY2FuDQorICAgIHBpY2sgdGhlbSB1cCBhbmQgZGlzcGxheSB0aGVtLg0KKyAgKiBUaGUgcGVyIG1lc3NhZ2UgYW5kIHBlciBmaWVsZCBvdmVyaGVhZCBpbiBib3RoIGdlbmVyYXRlZCBjb2RlIGFuZCBydW50aW1lDQorICAgIG9iamVjdCBzaXplcyB3YXMgcmVkdWNlZC4NCisgICogR2VuZXJhdGVkIGNvZGUgbm93IGluY2x1ZGUgZGVwcmVjYXRlZCBhbm5vdGF0aW9ucyB3aGVuIHRoZSBwcm90byBmaWxlDQorICAgIGluY2x1ZGVkIHRoZW0uDQorDQorICBDIyAoQmV0YSkNCisgIEluIGdlbmVyYWw6IHNvbWUgY2hhbmdlcyBhcmUgYnJlYWtpbmcsIHdoaWNoIHJlcXVpcmUgcmVnZW5lcmF0aW5nIG1lc3NhZ2VzLg0KKyAgTW9zdCB1c2VyLXdyaXR0ZW4gY29kZSB3aWxsIG5vdCBiZSBpbXBhY3RlZCAqZXhjZXB0KiBmb3IgdGhlIHJlbmFtaW5nIG9mIGVudW0NCisgIHZhbHVlcy4NCisNCisgICogQWxsb3cgY3VzdG9tIHR5cGUgVVJMIHByZWZpeGVzIGluIGBBbnlgIHBhY2tpbmcsIGFuZCBpZ25vcmUgdGhlbSB3aGVuDQorICAgIHVucGFja2luZw0KKyAgKiBgcHJvdG9jYCBpcyBub3cgaW4gYSBzZXBhcmF0ZSBOdUdldCBwYWNrYWdlIChHb29nbGUuUHJvdG9idWYuVG9vbHMpDQorICAqIE5ldyBvcHRpb246IGBpbnRlcm5hbF9hY2Nlc3NgIHRvIGdlbmVyYXRlIGludGVybmFsIGNsYXNzZXMNCisgICogRW51bSB2YWx1ZXMgYXJlIG5vdyBQYXNjYWxDYXNlZCwgYW5kIGlmIHRoZXJlJ3MgYSBwcmVmaXggd2hpY2ggbWF0Y2hlcyB0aGUNCisgICAgbmFtZSBvZiB0aGUgZW51bSwgdGhhdCBpcyByZW1vdmVkIChzbyBhbiBlbnVtIGBDT0xPUmAgd2l0aCBhIHZhbHVlDQorICAgIGBDT0xPUl9CTFVFYCB3b3VsZCBnZW5lcmF0ZSBhIHZhbHVlIG9mIGp1c3QgYEJsdWVgKS4gQW4gb3B0aW9uDQorICAgIChgbGVnYWN5X2VudW1fdmFsdWVzYCkgaXMgdGVtcG9yYXJpbHkgYXZhaWxhYmxlIHRvIGRpc2FibGUgdGhpcywgYnV0IHRoZQ0KKyAgICBvcHRpb24gd2lsbCBiZSByZW1vdmVkIGZvciBHQS4NCisgICogYGpzb25fbmFtZWAgb3B0aW9uIGlzIG5vdyBob25vcmVkDQorICAqIElmIGdyb3VwIHRhZ3MgYXJlIGVuY291bnRlcmVkIHdoZW4gcGFyc2luZywgdGhleSBhcmUgdmFsaWRhdGVkIG1vcmUNCisgICAgdGhvcm91Z2hseSAoYWx0aG91Z2ggd2UgZG9uJ3Qgc3VwcG9ydCBhY3R1YWwgZ3JvdXBzKQ0KKyAgKiBOdUdldCBkZXBlbmRlbmNpZXMgYXJlIGJldHRlciBzcGVjaWZpZWQNCisgICogQnJlYWtpbmc6IGBQcmVjb25kaXRpb25zYCBpcyByZW5hbWVkIHRvIGBQcm90b1ByZWNvbmRpdGlvbnNgDQorICAqIEJyZWFraW5nOiBgR2VuZXJhdGVkQ29kZUluZm9gIGlzIHJlbmFtZWQgdG8gYEdlbmVyYXRlZENsclR5cGVJbmZvYA0KKyAgKiBgSnNvbkZvcm1hdHRlcmAgbm93IGFsbG93cyB3cml0aW5nIHRvIGEgYFRleHRXcml0ZXJgDQorICAqIE5ldyBpbnRlcmZhY2UsIGBJQ3VzdG9tRGlhZ25vc3RpY01lc3NhZ2VgIHRvIGFsbG93IG1vcmUgY29tcGFjdA0KKyAgICByZXByZXNlbnRhdGlvbnMgZnJvbSBgVG9TdHJpbmdgDQorICAqIGBDb2RlZElucHV0U3RyZWFtYCBhbmQgYENvZGVkT3V0cHV0U3RyZWFtYCBub3cgaW1wbGVtZW50IGBJRGlzcG9zYWJsZWAsDQorICAgIHdoaWNoIHNpbXBseSBkaXNwb3NlcyBvZiB0aGUgc3RyZWFtcyB0aGV5IHdlcmUgY29uc3RydWN0ZWQgd2l0aA0KKyAgKiBNYXAgZmllbGRzIG5vIGxvbmdlciBzdXBwb3J0IG51bGwgdmFsdWVzIChpbiBsaW5lIHdpdGggb3RoZXIgbGFuZ3VhZ2VzKQ0KKyAgKiBJbXByb3ZlbWVudHMgaW4gSlNPTiBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nDQorDQorICBKYXZhc2NyaXB0IChBbHBoYSkNCisgICogQmV0dGVyIHN1cHBvcnQgZm9yICJieXRlcyIgZmllbGRzOiBieXRlcyBmaWVsZHMgY2FuIGJlIHJlYWQgYXMgZWl0aGVyIGENCisgICAgYmFzZTY0IHN0cmluZyBvciBVSW50OEFycmF5IChpbiBlbnZpcm9ubWVudHMgd2hlcmUgVHlwZWRBcnJheSBpcyBzdXBwb3J0ZWQpLg0KKyAgKiBOZXcgc3VwcG9ydCBmb3IgQ29tbW9uSlMgaW1wb3J0cy4gIFRoaXMgc2hvdWxkIG1ha2UgaXQgZWFzaWVyIHRvIHVzZSB0aGUNCisgICAgSmF2YVNjcmlwdCBzdXBwb3J0IGluIE5vZGUuanMgYW5kIHRvb2xzIGxpa2UgV2ViUGFjay4gIFNlZSBqcy9SRUFETUUubWQgZm9yDQorICAgIG1vcmUgaW5mb3JtYXRpb24uDQorICAqIFNvbWUgc2lnbmlmaWNhbnQgaW50ZXJuYWwgcmVmYWN0b3JpbmcgdG8gc2ltcGxpZnkgYW5kIG1vZHVsYXJpemUgdGhlIGNvZGUuDQorDQorICBSdWJ5IChBbHBoYSkNCisgICogSlNPTiBzZXJpYWxpemF0aW9uIG5vdyBwcm9wZXJseSB1c2VzIGNhbWVsQ2FzZWQgbmFtZXMsIHdpdGggYSBydW50aW1lIG9wdGlvbg0KKyAgICB0aGF0IHdpbGwgcHJlc2VydmUgb3JpZ2luYWwgbmFtZXMgZnJvbSAucHJvdG8gZmlsZXMgaW5zdGVhZC4NCisgICogV2VsbC1rbm93biB0eXBlcyBhcmUgbm93IGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24uDQorICAqIFJlbGVhc2Ugbm93IGluY2x1ZGVzIGJpbmFyeSBnZW1zIGZvciBXaW5kb3dzLCBNYWMsIGFuZCBMaW51eCBpbnN0ZWFkIG9mIGp1c3QNCisgICAgc291cmNlIGdlbXMuDQorICAqIEJ1Z2ZpeCBmb3Igc2VyaWFsaXppbmcgb25lb2ZzLg0KKw0KKyAgQysrL0phdmEgTGl0ZSAoQWxwaGEpDQorICAgIEEgbmV3ICJsaXRlIiBnZW5lcmF0b3IgcGFyYW1ldGVyIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBwcm90b2MgZm9yIEMrKyBhbmQNCisgICAgSmF2YSBmb3IgUHJvdG8zIHN5bnRheCBtZXNzYWdlcy4gRXhhbXBsZSB1c2FnZToNCisNCisgICAgIC4vcHJvdG9jIC0tY3BwX291dD1saXRlOiRPVVRQVVRfUEFUSCBmb28ucHJvdG8NCisNCisgICAgVGhlIHByb3RvYyB3aWxsIHRyZWF0IHRoZSBjdXJyZW50IGlucHV0IGFuZCBhbGwgdGhlIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzDQorICAgIGFzIExJVEUuIFRoZSBzYW1lIGdlbmVyYXRvciBwYXJhbWV0ZXIgbXVzdCBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZQ0KKyAgICBkZXBlbmRlbmNpZXMuDQorDQorICAgIEluIFByb3RvMyBzeW50YXggZmlsZXMsICJvcHRpbWl6ZWRfZm9yPUxJVEVfUlVOVElNRSIgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4NCisNCisNCisyMDE1LTEyLTMwIHZlcnNpb24gMy4wLjAtYmV0YS0yIChDKysvSmF2YS9QeXRob24vUnVieS9OYW5vL09iamVjdGl2ZS1DL0MjL0phdmFTY3JpcHQpDQorICBHZW5lcmFsDQorICAqIEludHJvZHVjZWQgYSBuZXcgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb246IEphdmFTY3JpcHQuDQorICAqIEFkZGVkIGEgbmV3IGZpZWxkIG9wdGlvbiAianNvbl9uYW1lIi4gQnkgZGVmYXVsdCBwcm90byBmaWVsZCBuYW1lcyBhcmUNCisgICAgY29udmVydGVkIHRvICJsb3dlckNhbWVsQ2FzZSIgaW4gcHJvdG8zIEpTT04gZm9ybWF0LiBUaGlzIG9wdGlvbiBjYW4gYmUNCisgICAgdXNlZCB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIGFuZCBzcGVjaWZ5IGEgZGlmZmVyZW50IEpTT04gbmFtZSBmb3IgdGhlDQorICAgIGZpZWxkLg0KKyAgKiBBZGRlZCBjb25mb3JtYW5jZSB0ZXN0cyB0byBlbnN1cmUgaW1wbGVtZW50YXRpb25zIGFyZSBmb2xsb3dpbmcgcHJvdG8zIEpTT04NCisgICAgc3BlY2lmaWNhdGlvbi4NCisNCisgIEMrKyAoQmV0YSkNCisgICogVmFyaW91cyBidWcgZml4ZXMgYW5kIGltcHJvdmVtZW50cyB0byB0aGUgSlNPTiBzdXBwb3J0IHV0aWxpdHk6DQorICAgICAgLSBEdXBsaWNhdGUgbWFwIGtleXMgaW4gSlNPTiBhcmUgbm93IHJlamVjdGVkIChpLmUuLCB0cmFuc2xhdGlvbiB3aWxsDQorICAgICAgICBmYWlsKS4NCisgICAgICAtIEZpeGVkIHdpcmUtZm9ybWF0IGZvciBnb29nbGUucHJvdG9idWYuVmFsdWUvTGlzdFZhbHVlLg0KKyAgICAgIC0gRml4ZWQgcHJlY2lzaW9uIGxvc3Mgd2hlbiBjb252ZXJ0aW5nIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAuDQorICAgICAgLSBGaXhlZCBhIGJ1ZyB3aGVuIHBhcnNpbmcgaW52YWxpZCBVVEYtOCBjb2RlIHBvaW50cy4NCisgICAgICAtIEZpeGVkIGEgbWVtb3J5IGxlYWsuDQorICAgICAgLSBSZWR1Y2VkIGNhbGwgc3RhY2sgdXNhZ2UuDQorDQorICBKYXZhIChCZXRhKQ0KKyAgKiBDbGVhbmVkIHVwIHNvbWUgdW51c2VkIG1ldGhvZHMgb24gQ29kZWRPdXRwdXRTdHJlYW0uDQorICAqIFByZXNpemVkIGxpc3RzIGZvciBwYWNrZWQgZmllbGRzIGR1cmluZyBwYXJzaW5nIGluIHRoZSBsaXRlIHJ1bnRpbWUgdG8NCisgICAgcmVkdWNlIGFsbG9jYXRpb25zIGFuZCBpbXByb3ZlIHBlcmZvcm1hbmNlLg0KKyAgKiBJbXByb3ZlZCB0aGUgcGVyZm9ybWFuY2Ugb2YgdW5rbm93biBmaWVsZHMgaW4gdGhlIGxpdGUgcnVudGltZS4NCisgICogSW50cm9kdWNlZCBVbnNhZmVCeXRlU3RyaW5ncyB0byBzdXBwb3J0IHplcm8tY29weSBCeXRlU3RyaW5nIGNyZWF0aW9uLg0KKyAgKiBWYXJpb3VzIGJ1ZyBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzIHRvIHRoZSBKU09OIHN1cHBvcnQgdXRpbGl0eToNCisgICAgICAtIEZpeGVkIGEgdGhyZWFkLXNhZmV0eSBidWcuDQorICAgICAgLSBBZGRlZCBhIG5ldyBvcHRpb24g4oCccHJlc2VydmluZ1Byb3RvRmllbGROYW1lc+KAnSB0byBKc29uRm9ybWF0Lg0KKyAgICAgIC0gQWRkZWQgYSBuZXcgb3B0aW9uIOKAnGluY2x1ZGluZ0RlZmF1bHRWYWx1ZUZpZWxkc+KAnSB0byBKc29uRm9ybWF0Lg0KKyAgICAgIC0gVXBkYXRlZCB0aGUgSlNPTiB1dGlsaXR5IHRvIGNvbXBseSB3aXRoIHByb3RvMyBKU09OIHNwZWNpZmljYXRpb24uDQorDQorICBQeXRob24gKEJldGEpDQorICAqIEFkZGVkIHByb3RvMyBKU09OIGZvcm1hdCB1dGlsaXR5LiBJdCBpbmNsdWRlcyBzdXBwb3J0IGZvciBhbGwgZmllbGQgdHlwZXMNCisgICAgYW5kIGEgZmV3IHdlbGwta25vd24gdHlwZXMgZXhjZXB0IGZvciBBbnkgYW5kIFN0cnVjdC4NCisgICogQWRkZWQgcnVudGltZSBzdXBwb3J0IGZvciBBbnksIFRpbWVzdGFtcCwgRHVyYXRpb24gYW5kIEZpZWxkTWFzay4NCisgICogWyBdIGlzIG5vdyBhY2NlcHRlZCBmb3IgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkcyBpbiB0ZXh0IGZvcm1hdCBwYXJzZXIuDQorICAqIE1hcCBmaWVsZHMgbm93IGhhdmUgcHJvcGVyIE8oMSkgcGVyZm9ybWFuY2UgZm9yIGxvb2t1cC9pbnNlcnQvZGVsZXRlDQorICAgIHdoZW4gdXNpbmcgdGhlIFB5dGhvbi9DKysgaW1wbGVtZW50YXRpb24uIFRoZXkgd2VyZSBwcmV2aW91c2x5IHVzaW5nIE8obikNCisgICAgc2VhcmNoLWJhc2VkIGFsZ29yaXRobXMgYmVjYXVzZSB0aGUgQysrIHJlZmxlY3Rpb24gaW50ZXJmYWNlIGRpZG4ndA0KKyAgICBzdXBwb3J0IHRydWUgbWFwIG9wZXJhdGlvbnMuDQorDQorICBPYmplY3RpdmUtQyAoQmV0YSkNCisgICogVmFyaW91cyBidWctZml4ZXMgYW5kIGNvZGUgdHdlYWtzIHRvIHBhc3MgbW9yZSBzdHJpY3QgY29tcGlsZXIgd2FybmluZ3MuDQorICAqIE5vdyBoYXMgY29uZm9ybWFuY2UgdGVzdCBjb3ZlcmFnZSBhbmQgaXMgcGFzc2luZyBhbGwgdGVzdHMuDQorDQorICBDIyAoQmV0YSkNCisgICogVmFyaW91cyBidWctZml4ZXMuDQorICAqIENvZGUgZ2VuZXJhdGlvbjogRmlsZXMgZ2VuZXJhdGVkIGluIGRpcmVjdG9yaWVzIGJhc2VkIG9uIG5hbWVzcGFjZS4NCisgICogQ29kZSBnZW5lcmF0aW9uOiBJbmNsdWRlIGNvbW1lbnRzIGZyb20gLnByb3RvIGZpbGVzIGluIFhNTCBkb2MNCisgICAgY29tbWVudHMgKG5haXZlbHkpDQorICAqIENvZGUgZ2VuZXJhdGlvbjogQ2hhbmdlIG9yZ2FuaXphdGlvbi9uYW1pbmcgb2YgInJlZmxlY3Rpb24gY2xhc3MiIChhY2Nlc3MNCisgICAgdG8gZmlsZSBkZXNjcmlwdG9yKQ0KKyAgKiBDb2RlIGdlbmVyYXRpb24gYW5kIGxpYnJhcnk6IEFkZCBQYXJzZXIgcHJvcGVydHkgdG8gTWVzc2FnZURlc2NyaXB0b3IsDQorICAgIGFuZCBpbnRyb2R1Y2UgYSBub24tZ2VuZXJpYyBwYXJzZXIgdHlwZS4NCisgICogTGlicmFyeTogQWRkZWQgVHlwZVJlZ2lzdHJ5IHRvIHN1cHBvcnQgSlNPTiBwYXJzaW5nL2Zvcm1hdHRpbmcgb2YgQW55Lg0KKyAgKiBMaWJyYXJ5OiBBZGRlZCBBbnkuUGFjay9VbnBhY2sgc3VwcG9ydC4NCisgICogTGlicmFyeTogSW1wbGVtZW50ZWQgSlNPTiBwYXJzaW5nLg0KKw0KKyAgSmF2YXNjcmlwdCAoQWxwaGEpDQorICAqIEFkZGVkIHByb3RvMyBzdXBwb3J0IGZvciBKYXZhU2NyaXB0LiBUaGUgcnVudGltZSBpcyB3cml0dGVuIGluIHB1cmUNCisgICAgSmF2YVNjcmlwdCBhbmQgd29ya3MgaW4gYnJvd3NlcnMgYW5kIGluIE5vZGUuanMuIFRvIGdlbmVyYXRlIEphdmFTY3JpcHQNCisgICAgY29kZSBmb3IgeW91ciBwcm90bywgaW52b2tlIHByb3RvYyB3aXRoICItLWpzX291dCIuIFNlZSBqcy9SRUFETUUubWQNCisgICAgZm9yIG1vcmUgYnVpbGQgaW5zdHJ1Y3Rpb25zLg0KKw0KKzIwMTUtMDgtMjYgdmVyc2lvbiAzLjAuMC1iZXRhLTEgKEMrKy9KYXZhL1B5dGhvbi9SdWJ5L05hbm8vT2JqZWN0aXZlLUMvQyMpDQorICBBYm91dCBCZXRhDQorICAqIFRoaXMgaXMgdGhlIGZpcnN0IGJldGEgcmVsZWFzZSBvZiBwcm90b2J1ZiB2My4wLjAuIE5vdCBhbGwgbGFuZ3VhZ2VzDQorICAgIGhhdmUgcmVhY2hlZCBiZXRhIHN0YWdlLiBMYW5ndWFnZXMgbm90IG1hcmtlZCBhcyBiZXRhIGFyZSBzdGlsbCBpbg0KKyAgICBhbHBoYSAoaS5lLiwgYmUgcHJlcGFyZWQgZm9yIEFQSSBicmVha2luZyBjaGFuZ2VzKS4NCisNCisgIEdlbmVyYWwNCisgICogUHJvdG8zIEpTT04gaXMgc3VwcG9ydGVkIGluIHNldmVyYWwgbGFuZ3VhZ2VzIChmdWxseSBzdXBwb3J0ZWQgaW4gQysrDQorICAgIGFuZCBKYXZhLCBwYXJ0aWFsbHkgc3VwcG9ydGVkIGluIFJ1YnkvQyMpLiBUaGUgSlNPTiBzcGVjIGlzIGRlZmluZWQgaW4NCisgICAgdGhlIHByb3RvMyBsYW5ndWFnZSBndWlkZToNCisNCisgICAgICBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb24NCisNCisgICAgV2Ugd2lsbCBwdWJsaXNoIGEgbW9yZSBkZXRhaWxlZCBzcGVjIHRvIGRlZmluZSB0aGUgZXhhY3QgYmVoYXZpb3Igb2YNCisgICAgcHJvdG8zLWNvbmZvcm1hbnQgSlNPTiBzZXJpYWxpemVycyBhbmQgcGFyc2Vycy4gVW50aWwgdGhlbiwgZG8gbm90IHJlbHkNCisgICAgb24gc3BlY2lmaWMgYmVoYXZpb3JzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpZiBpdOKAmXMgbm90IGRvY3VtZW50ZWQgaW4NCisgICAgdGhlIGFib3ZlIHNwZWMuIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGUgYmVoYXZpb3IgaXMgbm90IHlldCBmaW5hbGl6ZWQgZm9yDQorICAgIHRoZSBmb2xsb3dpbmc6DQorICAgICAgLSBQYXJzaW5nIGludmFsaWQgSlNPTiBpbnB1dCAoZS5nLiwgaW5wdXQgd2l0aCB0cmFpbGluZyBjb21tYXMpLg0KKyAgICAgIC0gTm9uLWNhbWVsQ2FzZSBuYW1lcyBpbiBKU09OIGlucHV0Lg0KKyAgICAgIC0gVGhlIHNhbWUgZmllbGQgYXBwZWFycyBtdWx0aXBsZSB0aW1lcyBpbiBKU09OIGlucHV0Lg0KKyAgICAgIC0gSlNPTiBhcnJheXMgY29udGFpbiDigJxudWxs4oCdIHZhbHVlcy4NCisgICAgICAtIFRoZSBtZXNzYWdlIGhhcyB1bmtub3duIGZpZWxkcy4NCisNCisgICogUHJvdG8zIG5vdyBlbmZvcmNlcyBzdHJpY3QgVVRGLTggY2hlY2tpbmcuIFBhcnNpbmcgd2lsbCBmYWlsIGlmIGEgc3RyaW5nDQorICAgIGZpZWxkIGNvbnRhaW5zIG5vbiBVVEYtOCBkYXRhLg0KKw0KKyAgQysrIChCZXRhKQ0KKyAgKiBJbnRyb2R1Y2VkIG5ldyB1dGlsaXR5IGZ1bmN0aW9ucy9jbGFzc2VzIGluIHRoZSBnb29nbGUvcHJvdG9idWYvdXRpbA0KKyAgICBkaXJlY3Rvcnk6DQorICAgICAgLSBNZXNzYWdlRGlmZmVyZW5jZXI6IGNvbXBhcmUgdHdvIHByb3RvIG1lc3NhZ2VzIGFuZCByZXBvcnQgdGhlaXINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZXMuDQorICAgICAgLSBKc29uVXRpbDogc3VwcG9ydCBjb252ZXJ0aW5nIHByb3RvYnVmIGJpbmFyeSBmb3JtYXQgdG8vZnJvbSBKU09OLg0KKyAgICAgIC0gVGltZVV0aWw6IHV0aWxpdHkgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aCB3ZWxsLWtub3duIHR5cGVzIFRpbWVzdGFtcA0KKyAgICAgICAgICAgICAgICAgIGFuZCBEdXJhdGlvbi4NCisgICAgICAtIEZpZWxkTWFza1V0aWw6IHV0aWxpdHkgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aCBGaWVsZE1hc2suDQorDQorICAqIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBvZiBhcmVuYSBjb25zdHJ1Y3Rpb24gYW5kIGRlc3RydWN0aW9uLg0KKyAgKiBCdWcgZml4ZXMgZm9yIGFyZW5hIGFuZCBtYXBzIHN1cHBvcnQuDQorICAqIENoYW5nZWQgdG8gdXNlIGNtYWtlIGZvciBXaW5kb3dzIFZpc3VhbCBTdHVkaW8gYnVpbGRzLg0KKyAgKiBBZGRlZCBCYXplbCBzdXBwb3J0Lg0KKw0KKyAgSmF2YSAoQmV0YSkNCisgICogSW50cm9kdWNlZCBhIG5ldyB1dGlsIHBhY2thZ2UgdGhhdCB3aWxsIGJlIGRpc3RyaWJ1dGVkIGFzIGEgc2VwYXJhdGUNCisgICAgYXJ0aWZhY3QgaW4gbWF2ZW4uIEl0IGNvbnRhaW5zOg0KKyAgICAgIC0gSnNvbkZvcm1hdDogY29udmVydCBwcm90byBtZXNzYWdlcyB0by9mcm9tIEpTT04uDQorICAgICAgLSBUaW1lVXRpbDogdXRpbGl0eSBmdW5jdGlvbnMgdG8gd29yayB3aXRoIFRpbWVzdGFtcCBhbmQgRHVyYXRpb24uDQorICAgICAgLSBGaWVsZE1hc2tVdGlsOiB1dGlsaXR5IGZ1bmN0aW9ucyB0byB3b3JrIHdpdGggRmllbGRNYXNrLg0KKw0KKyAgKiBUaGUgc3RhdGljIFBBUlNFUiBpbiBlYWNoIGdlbmVyYXRlZCBtZXNzYWdlIGlzIGRlcHJlY2F0ZWQsIGFuZCBpdCB3aWxsDQorICAgIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4gQSBzdGF0aWMgcGFyc2VyKCkgZ2V0dGVyIGlzIGdlbmVyYXRlZA0KKyAgICBmb3IgZWFjaCBtZXNzYWdlIHR5cGUgaW5zdGVhZC4NCisgICogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBmb3IgU3RyaW5nIGZpZWxkcyBzZXJpYWxpemF0aW9uLg0KKyAgKiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIGZvciBMaXRlIHJ1bnRpbWUgb24gQW5kcm9pZDoNCisgICAgICAtIFJlZHVjZWQgYWxsb2NhdGlvbnMNCisgICAgICAtIFJlZHVjZWQgbWV0aG9kIG92ZXJoZWFkIGFmdGVyIFByb0d1YXJkaW5nDQorICAgICAgLSBSZWR1Y2VkIGNvZGUgc2l6ZSBhZnRlciBQcm9HdWFyZGluZw0KKw0KKyAgUHl0aG9uIChBbHBoYSkNCisgICogUmVtb3ZlZCBsZWdhY3kgUHl0aG9uIDIuNSBzdXBwb3J0Lg0KKyAgKiBNb3ZlZCB0byBhIHNpbmdsZSBQeXRob24gMi54LzMueC1jb21wYXRpYmxlIGNvZGViYXNlLCBpbnN0ZWFkIG9mIHVzaW5nIDJ0bzMuDQorICAqIEZpeGVkIGJ1aWxkL3Rlc3RzIG9uIFB5dGhvbiAyLjYsIDIuNywgMy4zLCBhbmQgMy40Lg0KKyAgICAgIC0gUHVyZS1QeXRob24gd29ya3Mgb24gYWxsIGZvdXIuDQorICAgICAgLSBQeXRob24vQysrIGltcGxlbWVudGF0aW9uIHdvcmtzIG9uIGFsbCBidXQgMy40LCBkdWUgdG8gY2hhbmdlcyBpbiB0aGUNCisgICAgICAgIFB5dGhvbi9DKysgQVBJIGluIDMuNC4NCisgICogU29tZSBwcmVsaW1pbmFyeSB3b3JrIGhhcyBiZWVuIGRvbmUgdG8gYWxsb3cgZm9yIG11bHRpcGxlIERlc2NyaXB0b3JQb29scw0KKyAgICB3aXRoIFB5dGhvbi9DKysuDQorDQorICBSdWJ5IChBbHBoYSkNCisgICogTWFueSBidWdmaXhlczoNCisgICAgICAtIGZpeGVkIHBhcnNpbmcvc2VyaWFsaXphdGlvbiBvZiBieXRlcywgc2ludCwgc2ZpeGVkIHR5cGVzDQorICAgICAgLSBvdGhlciBwYXJzZXIgYnVnZml4ZXMNCisgICAgICAtIGZpeGVkIG1lbW9yeSBsZWFrIGFmZmVjdGluZyBSdWJ5IDIuMg0KKw0KKyAgSmF2YU5hbm8gKEFscGhhKQ0KKyAgKiBKYXZhTmFubyBnZW5lcmF0ZWQgY29kZSBub3cgd2lsbCBiZSBwdXQgaW4gYSBuYW5vIHBhY2thZ2UgYnkgZGVmYXVsdCB0bw0KKyAgICBhdm9pZCBjb25mbGljdHMgd2l0aCBKYXZhIGdlbmVyYXRlZCBjb2RlLg0KKw0KKyAgT2JqZWN0aXZlLUMgKEFscGhhKQ0KKyAgKiBBZGRlZCBub24tbnVsbCBtYXJrdXAgdG8gT2JqQyBsaWJyYXJ5LiBSZXF1aXJlcyBTREsgOC40KyB0byBidWlsZC4NCisgICogTWFueSBidWdmaXhlczoNCisgICAgICAtIFJlbW92ZWQgdGhlIGNsYXNzL2VudW0gZmlsdGVyLg0KKyAgICAgIC0gUmVuYW1lZCBzb21lIGludGVybmFsIHR5cGVzIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSB3ZWxsLWtub3duIHR5cGVzDQorICAgICAgICBwcm90b3MuDQorICAgICAgLSBBZGRlZCBtaXNzaW5nIHN1cHBvcnQgZm9yIHBhcnNpbmcgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkcyBpbiBwYWNrZWQgb3INCisgICAgICAgIHVucGFja2VkIGZvcm1zLg0KKyAgICAgIC0gQWRkZWQgKkNvdW50IGZvciByZXBlYXRlZCBhbmQgbWFwPD4gZmllbGRzIHRvIGF2b2lkIGF1dG8tY3JlYXRlIHdoZW4NCisgICAgICAgIGNoZWNraW5nIGZvciB0aGVtIGJlaW5nIHNldC4NCisNCisgIEMjIChBbHBoYSkNCisgICogTmFtZXNwYWNlIGNoYW5nZWQgdG8gR29vZ2xlLlByb3RvYnVmIChhbmQgTnVHZXQgcGFja2FnZSB3aWxsIGJlIG5hbWVkDQorICAgIGNvcnJlc3BvbmRpbmdseSkuDQorICAqIFRhcmdldCBwbGF0Zm9ybXMgbm93IC5ORVQgNC41IGFuZCBzZWxlY3RlZCBwb3J0YWJsZSBzdWJzZXRzIG9ubHkuDQorICAqIFJlbW92ZWQgbGl0ZSBydW50aW1lLg0KKyAgKiBSZWltcGxlbWVudGF0aW9uIHRvIHVzZSBtdXRhYmxlIG1lc3NhZ2UgdHlwZXMuDQorICAqIE51bGwgcmVmZXJlbmNlcyB1c2VkIHRvIHJlcHJlc2VudCAibm8gdmFsdWUiIGZvciBtZXNzYWdlIHR5cGUgZmllbGRzLg0KKyAgKiBQcm90bzMgc2VtYW50aWNzIHN1cHBvcnRlZDsgcHJvdG8yIGZpbGVzIGFyZSBwcm9oaWJpdGVkIGZvciBDIyBjb2RlZ2VuLg0KKyAgICBNb3N0IHByb3RvMyBmZWF0dXJlcyBzdXBwb3J0ZWQ6DQorICAgICAgLSBKU09OIGZvcm1hdHRpbmcgKGEuay5hLiBzZXJpYWxpemF0aW9uIHRvIEpTT04pLCBpbmNsdWRpbmcgd2VsbC1rbm93bg0KKyAgICAgICAgdHlwZXMgKGV4Y2VwdCBmb3IgQW55KS4NCisgICAgICAtIFdyYXBwZXIgdHlwZXMgbWFwcGVkIHRvIG51bGxhYmxlIHZhbHVlIHR5cGVzIChvciBzdHJpbmcvQnl0ZVN0cmluZw0KKyAgICAgICAgYWxsb3dpbmcgbnVsbGFiaWxpdHkpLiBKU09OIHBhcnNpbmcgaXMgbm90IHN1cHBvcnRlZCB5ZXQuDQorICAgICAgLSBtYXBzDQorICAgICAgLSBvbmVvZg0KKyAgICAgIC0gZW51bSB1bmtub3duIHZhbHVlIHByZXNlcnZhdGlvbg0KKw0KKzIwMTUtMDUtMjUgdmVyc2lvbiAzLjAuMC1hbHBoYS0zIChPYmplY3RpdmUtQy9DIyk6DQorICBHZW5lcmFsDQorICAqIEludHJvZHVjZWQgdHdvIG5ldyBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbnMgKE9iamVjdGl2ZS1DLCBDIykgdG8gcHJvdG8zLg0KKyAgKiBFeHBsaWNpdCAib3B0aW9uYWwiIGtleXdvcmQgYXJlIGRpc2FsbG93ZWQgaW4gcHJvdG8zIHN5bnRheCwgYXMgZmllbGRzIGFyZQ0KKyAgICBvcHRpb25hbCBieSBkZWZhdWx0Lg0KKyAgKiBHcm91cCBmaWVsZHMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gcHJvdG8zIHN5bnRheC4NCisgICogQ2hhbmdlZCByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzIHRvIHVzZSBwYWNrZWQgc2VyaWFsaXphdGlvbiBieSBkZWZhdWx0IGluDQorICAgIHByb3RvMyAoaW1wbGVtZW50ZWQgZm9yIEMrKywgSmF2YSwgUHl0aG9uIGluIHRoaXMgcmVsZWFzZSkuICBUaGUgdXNlciBjYW4NCisgICAgc3RpbGwgZGlzYWJsZSBwYWNrZWQgc2VyaWFsaXphdGlvbiBieSBzZXR0aW5nIHBhY2tlZCB0byBmYWxzZSBmb3Igbm93Lg0KKyAgKiBBZGRlZCB3ZWxsLWtub3duIHR5cGUgcHJvdG9zIChhbnkucHJvdG8sIGVtcHR5LnByb3RvLCB0aW1lc3RhbXAucHJvdG8sDQorICAgIGR1cmF0aW9uLnByb3RvLCBldGMuKS4gVXNlcnMgY2FuIGltcG9ydCBhbmQgdXNlIHRoZXNlIHByb3RvcyBqdXN0IGxpa2UNCisgICAgcmVndWxhciBwcm90byBmaWxlcy4gQWRkaXRpb25hbCBydW50aW1lIHN1cHBvcnQgd2lsbCBiZSBhZGRlZCBmb3IgdGhlbSBpbg0KKyAgICBmdXR1cmUgcmVsZWFzZXMgKGluIHRoZSBmb3JtIG9mIHV0aWxpdHkgaGVscGVyIGZ1bmN0aW9ucywgb3IgaGF2aW5nIHRoZW0NCisgICAgcmVwbGFjZWQgYnkgbGFuZ3VhZ2Ugc3BlY2lmaWMgdHlwZXMgaW4gZ2VuZXJhdGVkIGNvZGUpLg0KKyAgKiBBZGRlZCBhICJyZXNlcnZlZCIga2V5d29yZCBpbiBib3RoIHByb3RvMiBhbmQgcHJvdG8zIHN5bnRheC4gVXNlciBjYW4gdXNlDQorICAgIHRoaXMga2V5d29yZCB0byBkZWNsYXJlIHJlc2VydmVkIGZpZWxkIG51bWJlcnMgYW5kIG5hbWVzIHRvIHByZXZlbnQgdGhlbQ0KKyAgICBmcm9tIGJlaW5nIHJldXNlZCBieSBvdGhlciBmaWVsZHMgaW4gdGhlIHNhbWUgbWVzc2FnZS4NCisNCisgICAgVG8gcmVzZXJ2ZSBmaWVsZCBudW1iZXJzLCBhZGQgYSByZXNlcnZlZCBkZWNsYXJhdGlvbiBpbiB5b3VyIG1lc3NhZ2U6DQorDQorICAgICAgbWVzc2FnZSBUZXN0TWVzc2FnZSB7DQorICAgICAgICByZXNlcnZlZCAyLCAxNSwgOSB0byAxMSwgMzsNCisgICAgICB9DQorDQorICAgIFRoaXMgcmVzZXJ2ZXMgZmllbGQgbnVtYmVycyAyLCAzLCA5LCAxMCwgMTEgYW5kIDE1LiBJZiBhIHVzZXIgdXNlcyBhbnkgb2YNCisgICAgdGhlc2UgYXMgZmllbGQgbnVtYmVycywgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlciB3aWxsIHJlcG9ydCBhbiBlcnJvci4NCisNCisgICAgRmllbGQgbmFtZXMgY2FuIGFsc28gYmUgcmVzZXJ2ZWQ6DQorDQorICAgICAgbWVzc2FnZSBUZXN0TWVzc2FnZSB7DQorICAgICAgICByZXNlcnZlZCAiZm9vIiwgImJhciI7DQorICAgICAgfQ0KKw0KKyAgKiBWYXJpb3VzIGJ1ZyBmaXhlcyBzaW5jZSAzLjAuMC1hbHBoYS0yDQorDQorICBPYmplY3RpdmUtQw0KKyAgICBPYmplY3RpdmUtQyBpbmNsdWRlcyBhIGNvZGUgZ2VuZXJhdG9yIGFuZCBhIG5hdGl2ZSBvYmplY3RpdmUtYyBydW50aW1lDQorICAgIGxpYnJhcnkuICBCeSBhZGRpbmcg4oCcLS1vYmpjX291dOKAnSB0byBwcm90b2MsIHRoZSBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlDQorICAgIGEgaGVhZGVyKCoucGJvYmpjLmgpIGFuZCBhbiBpbXBsZW1lbnRhdGlvbiBmaWxlKCoucGJvYmpjLm0pIGZvciBlYWNoIHByb3RvDQorICAgIGZpbGUuDQorDQorICAgIEluIHRoaXMgZmlyc3QgcmVsZWFzZSwgdGhlIGdlbmVyYXRlZCBpbnRlcmZhY2UgcHJvdmlkZXM6IGVudW1zLCBtZXNzYWdlcywNCisgICAgZmllbGQgc3VwcG9ydChzaW5nbGUsIHJlcGVhdGVkLCBtYXAsIG9uZW9mKSwgcHJvdG8yIGFuZCBwcm90bzMgc3ludGF4DQorICAgIHN1cHBvcnQsIHBhcnNpbmcgYW5kIHNlcmlhbGl6YXRpb24uIEl04oCZcyAgY29tcGF0aWJsZSB3aXRoIEFSQyBhbmQgbm9uLUFSQw0KKyAgICB1c2FnZS4gQmVzaWRlcywgdXNlciBjYW4gYWxzbyBhY2Nlc3MgaXQgdmlhIHRoZSBzd2lmdCBicmlkZ2luZyBoZWFkZXIuDQorDQorICAgIFNlZSBvYmplY3RpdmVjL1JFQURNRS5tZCBmb3IgZGV0YWlscy4NCisNCisgIEMjDQorICAgICogQyMgcHJvdG9idWZzIGFyZSBiYXNlZCBvbiBwcm9qZWN0DQorICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2pza2VldC9wcm90b2J1Zi1jc2hhcnAtcG9ydC4gVGhlIG9yaWdpbmFsIHByb2plY3Qgd2FzDQorICAgICAgZnJvemVuIGFuZCBhbGwgdGhlIG5ldyBkZXZlbG9wbWVudCB3aWxsIGhhcHBlbiBoZXJlLg0KKyAgICAqIENvZGVnZW4gcGx1Z2luIGZvciBDIyB3YXMgY29tcGxldGVseSByZXdyaXR0ZW4gdG8gQysrIGFuZCBpcyBub3cgYW4NCisgICAgICBpbnRlZ3JhbCBwYXJ0IG9mIHByb3RvYy4NCisgICAgKiBTb21lIHJlZmFjdG9yaW5ncyBhbmQgY2xlYW51cCBoYXMgYmVlbiBhcHBsaWVkIHRvIHRoZSBDIyBydW50aW1lIGxpYnJhcnkuDQorICAgICogT25seSBwcm90bzIgaXMgc3VwcG9ydGVkIGluIEMjIGF0IHRoZSBtb21lbnQsIHByb3RvMyBzdXBwb3J0IGlzIGluDQorICAgICAgcHJvZ3Jlc3MgYW5kIHdpbGwgbGlrZWx5IGJyaW5nIHNpZ25pZmljYW50IGJyZWFraW5nIGNoYW5nZXMgdG8gdGhlIEFQSS4NCisNCisgICAgU2VlIGNzaGFycC9SRUFETUUubWQgZm9yIGRldGFpbHMuDQorDQorICBDKysNCisgICAgKiBBZGRlZCBydW50aW1lIHN1cHBvcnQgZm9yIEFueSB0eXBlLiBUbyB1c2UgQW55IGluIHlvdXIgcHJvdG8gZmlsZSwgZmlyc3QNCisgICAgICBpbXBvcnQgdGhlIGRlZmluaXRpb24gb2YgQW55Og0KKw0KKyAgICAgICAgLy8gZm9vLnByb3RvDQorICAgICAgICBpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8iOw0KKyAgICAgICAgbWVzc2FnZSBGb28gew0KKyAgICAgICAgICBnb29nbGUucHJvdG9idWYuQW55IGFueV9maWVsZCA9IDE7DQorICAgICAgICB9DQorICAgICAgICBtZXNzYWdlIEJhciB7DQorICAgICAgICAgIGludDMyIHZhbHVlID0gMTsNCisgICAgICAgIH0NCisNCisgICAgICBUaGVuIGluIEMrKyB5b3UgY2FuIGFjY2VzcyB0aGUgQW55IGZpZWxkIHVzaW5nIFBhY2tGcm9tKCkvVW5wYWNrVG8oKQ0KKyAgICAgIG1ldGhvZHM6DQorDQorICAgICAgICBGb28gZm9vOw0KKyAgICAgICAgQmFyIGJhciA9IC4uLjsNCisgICAgICAgIGZvby5tdXRhYmxlX2FueV9maWVsZCgpLT5QYWNrRnJvbShiYXIpOw0KKyAgICAgICAgLi4uDQorICAgICAgICBpZiAoZm9vLmFueV9maWVsZCgpLklzVHlwZTxCYXI+KCkpIHsNCisgICAgICAgICAgZm9vLmFueV9maWVsZCgpLlVucGFja1RvKCZiYXIpOw0KKyAgICAgICAgICAuLi4NCisgICAgICAgIH0NCisgICAgKiBJbiB0ZXh0IGZvcm1hdCwgZW50cmllcyBvZiBhIG1hcCBmaWVsZCB3aWxsIGJlIHNvcnRlZCBieSBrZXkuDQorDQorICBKYXZhDQorICAgICogQ29udGludWVkIG9wdGltaXphdGlvbnMgb24gdGhlIGxpdGUgcnVudGltZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGZvcg0KKyAgICAgIEFuZHJvaWQuDQorDQorICBQeXRob24NCisgICAgKiBBZGRlZCBtYXAgc3VwcG9ydC4NCisgICAgICAtIG1hcHMgbm93IGhhdmUgYSBkaWN0LWxpa2UgaW50ZXJmYWNlIChtc2cubWFwX2ZpZWxkW2tleV0gPSB2YWx1ZSkNCisgICAgICAtIGV4aXN0aW5nIGNvZGUgdGhhdCBtb2RpZmllcyBtYXBzIHZpYSB0aGUgcmVwZWF0ZWQgZmllbGQgaW50ZXJmYWNlDQorICAgICAgICB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZC4NCisNCisgIFJ1YnkNCisgICAgKiBJbXByb3ZlbWVudHMgdG8gUmVwZWF0ZWRGaWVsZCdzIGVtdWxhdGlvbiBvZiB0aGUgUnVieSBBcnJheSBBUEkuDQorICAgICogVmFyaW91cyBzcGVlZHVwcyBhbmQgaW50ZXJuYWwgY2xlYW51cHMuDQorDQorMjAxNS0wMi0yNiB2ZXJzaW9uIDMuMC4wLWFscGhhLTIgKFB5dGhvbi9SdWJ5L0phdmFOYW5vKToNCisgIEdlbmVyYWwNCisgICogSW50cm9kdWNlZCB0aHJlZSBuZXcgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb25zIChSdWJ5LCBKYXZhTmFubywgYW5kDQorICAgIFB5dGhvbikgdG8gcHJvdG8zLg0KKyAgKiBWYXJpb3VzIGJ1ZyBmaXhlcyBzaW5jZSAzLjAuMC1hbHBoYS0xDQorDQorICBQeXRob246DQorICAgIFB5dGhvbiBoYXMgcmVjZWl2ZWQgc2V2ZXJhbCB1cGRhdGVzLCBtb3N0IG5vdGFibHkgc3VwcG9ydCBmb3IgcHJvdG8zDQorICAgIHNlbWFudGljcyBpbiBhbnkgLnByb3RvIGZpbGUgdGhhdCBkZWNsYXJlcyBzeW50YXg9InByb3RvMyIuDQorICAgIE1lc3NhZ2VzIGRlY2xhcmVkIGluIHByb3RvMyBmaWxlcyBubyBsb25nZXIgcmVwcmVzZW50IGZpZWxkIHByZXNlbmNlDQorICAgIGZvciBzY2FsYXIgZmllbGRzIChudW1iZXIsIGVudW1zLCBib29sZWFucywgb3Igc3RyaW5ncykuICBZb3UgY2FuDQorICAgIG5vIGxvbmdlciBjYWxsIEhhc0ZpZWxkKCkgZm9yIHN1Y2ggZmllbGRzLCBhbmQgdGhleSBhcmUgc2VyaWFsaXplZA0KKyAgICBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgaGF2ZSBhIG5vbi16ZXJvL2VtcHR5L2ZhbHNlIHZhbHVlLg0KKw0KKyAgICBPbmUgb3RoZXIgbm90YWJsZSBjaGFuZ2UgaXMgaW4gdGhlIEMrKy1hY2NlbGVyYXRlZCBpbXBsZW1lbnRhdGlvbi4NCisgICAgRGVzY3JpcHRvciBvYmplY3RzICh3aGljaCBkZXNjcmliZSB0aGUgcHJvdG9idWYgc2NoZW1hIGFuZCBhbGxvdw0KKyAgICByZWZsZWN0aW9uIG92ZXIgaXQpIGFyZSBubyBsb25nZXIgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSBQeXRob24NCisgICAgYW5kIEMrKyBsYXllcnMuICBUaGUgUHl0aG9uIGRlc2NyaXB0b3JzIGFyZSBub3cgc2ltcGxlIHdyYXBwZXJzDQorICAgIGFyb3VuZCB0aGUgQysrIGRlc2NyaXB0b3JzLiAgVGhpcyBjaGFuZ2Ugc2hvdWxkIHNpZ25pZmljYW50bHkNCisgICAgcmVkdWNlIHRoZSBtZW1vcnkgdXNhZ2Ugb2YgcHJvZ3JhbXMgdGhhdCB1c2UgYSBsb3Qgb2YgbWVzc2FnZQ0KKyAgICB0eXBlcy4NCisNCisgIFJ1Ynk6DQorICAgIFdlIGhhdmUgYWRkZWQgcHJvdG8zIHN1cHBvcnQgZm9yIFJ1YnkgdmlhIGEgbmF0aXZlIEMgZXh0ZW5zaW9uLg0KKw0KKyAgICBUaGUgUnVieSBleHRlbnNpb24gaXRzZWxmIGlzIGluY2x1ZGVkIGluIHRoZSBydWJ5LyBkaXJlY3RvcnksIGFuZCBkZXRhaWxzIG9uDQorICAgIGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIHRoZSBleHRlbnNpb24gYXJlIGluIHJ1YnkvUkVBRE1FLm1kLiBUaGUgZXh0ZW5zaW9uDQorICAgIHdpbGwgYWxzbyBiZSBwdWJsaXNoZWQgYXMgYSBSdWJ5IGdlbS4gQ29kZSBnZW5lcmF0b3Igc3VwcG9ydCBpcyBpbmNsdWRlZCBhcw0KKyAgICBwYXJ0IG9mIGBwcm90b2NgIHdpdGggdGhlIGAtLXJ1Ynlfb3V0YCBmbGFnLg0KKw0KKyAgICBUaGUgUnVieSBleHRlbnNpb24gaW1wbGVtZW50cyBhIHVzZXItZnJpZW5kbHkgRFNMIHRvIGRlZmluZSBtZXNzYWdlIHR5cGVzDQorICAgIChhbHNvIGdlbmVyYXRlZCBieSB0aGUgY29kZSBnZW5lcmF0b3IgZnJvbSBgLnByb3RvYCBmaWxlcykuICBPbmNlIGEgbWVzc2FnZQ0KKyAgICB0eXBlIGlzIGRlZmluZWQsIHRoZSB1c2VyIG1heSBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSBtZXNzYWdlIHRoYXQgYmVoYXZlIGluDQorICAgIHdheXMgaWRpb21hdGljIHRvIFJ1YnkuIEZvciBleGFtcGxlOg0KKw0KKyAgICAtIE1lc3NhZ2UgZmllbGRzIGFyZSBwcmVzZW50IGFzIG9yZGluYXJ5IFJ1YnkgcHJvcGVydGllcyAoZ2V0dGVyIG1ldGhvZA0KKyAgICAgIGBmb29gIGFuZCBzZXR0ZXIgbWV0aG9kIGBmb289YCkuDQorICAgIC0gUmVwZWF0ZWQgZmllbGQgZWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIGNvbnRhaW5lciB0aGF0IGFjdHMgbGlrZSBhIG5hdGl2ZQ0KKyAgICAgIFJ1YnkgYXJyYXksIGFuZCBtYXAgZWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIGNvbnRhaW5lciB0aGF0IGFjdHMgbGlrZSBhDQorICAgICAgbmF0aXZlIFJ1YnkgaGFzaG1hcC4NCisgICAgLSBUaGUgdXN1YWwgd2VsbC1rbm93biBtZXRob2RzLCBzdWNoIGFzIGAjdG9fc2AsIGAjZHVwYCwgYW5kIHRoZSBsaWtlLCBhcmUNCisgICAgICBwcmVzZW50Lg0KKw0KKyAgICBVbmxpa2Ugc2V2ZXJhbCBleGlzdGluZyB0aGlyZC1wYXJ0eSBSdWJ5IGV4dGVuc2lvbnMgZm9yIHByb3RvYnVmLCB0aGlzDQorICAgIGV4dGVuc2lvbiBpcyBidWlsdCBvbiBhICJzdHJvbmdseS10eXBlZCIgcGhpbG9zb3BoeTogbWVzc2FnZSBmaWVsZHMgYW5kDQorICAgIGFycmF5L21hcCBjb250YWluZXJzIHdpbGwgdGhyb3cgZXhjZXB0aW9ucyBlYWdlcmx5IHdoZW4gdmFsdWVzIG9mIHRoZQ0KKyAgICBpbmNvcnJlY3QgdHlwZSBhcmUgaW5zZXJ0ZWQuDQorDQorICAgIFNlZSBydWJ5L1JFQURNRS5tZCBmb3IgZGV0YWlscy4NCisNCisgIEphdmFOYW5vOg0KKyAgICBKYXZhTmFubyBpcyBhIHNwZWNpYWwgY29kZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgbGlicmFyeSBkZXNpZ25lZCBlc3BlY2lhbGx5DQorICAgIGZvciByZXNvdXJjZS1yZXN0cmljdGVkIHN5c3RlbXMsIGxpa2UgQW5kcm9pZC4gSXQgaXMgdmVyeSByZXNvdXJjZS1mcmllbmRseQ0KKyAgICBpbiBib3RoIHRoZSBhbW91bnQgb2YgY29kZSBhbmQgdGhlIHJ1bnRpbWUgb3ZlcmhlYWQuIEhlcmUgaXMgYW4gYW4gb3ZlcnZpZXcNCisgICAgb2YgSmF2YU5hbm8gZmVhdHVyZXMgY29tcGFyZWQgd2l0aCB0aGUgb2ZmaWNpYWwgSmF2YSBwcm90b2J1ZjoNCisNCisgICAgLSBObyBkZXNjcmlwdG9ycyBvciBtZXNzYWdlIGJ1aWxkZXJzLg0KKyAgICAtIEFsbCBtZXNzYWdlcyBhcmUgbXV0YWJsZTsgZmllbGRzIGFyZSBwdWJsaWMgSmF2YSBmaWVsZHMuDQorICAgIC0gRm9yIG9wdGlvbmFsIGZpZWxkcyBvbmx5LCBlbmNhcHN1bGF0aW9uIGJlaGluZCBzZXR0ZXIvZ2V0dGVyL2hhenplci8NCisgICAgICBjbGVhcmVyIGZ1bmN0aW9ucyBpcyBvcHQtaW4sIHdoaWNoIHByb3ZpZGUgcHJvcGVyICdoYXMnIHN0YXRlIHN1cHBvcnQuDQorICAgIC0gRm9yIHByb3RvMiwgaWYgbm90IG9wdGVkIGluLCBoYXMgc3RhdGUgKGZpZWxkIHByZXNlbmNlKSBpcyBub3QgYXZhaWxhYmxlLg0KKyAgICAgIFNlcmlhbGl6YXRpb24gb3V0cHV0cyBhbGwgZmllbGRzIG5vdCBlcXVhbCB0byB0aGVpciBkZWZhdWx0cy4NCisgICAgICBUaGUgYmVoYXZpb3IgaXMgY29uc2lzdGVudCB3aXRoIHByb3RvMyBzZW1hbnRpY3MuDQorICAgIC0gUmVxdWlyZWQgZmllbGRzIChwcm90bzIgb25seSkgYXJlIGFsd2F5cyBzZXJpYWxpemVkLg0KKyAgICAtIEVudW0gY29uc3RhbnRzIGFyZSBpbnRlZ2VyczsgcHJvdGVjdGlvbiBhZ2FpbnN0IGludmFsaWQgdmFsdWVzIG9ubHkNCisgICAgICB3aGVuIHBhcnNpbmcgZnJvbSB0aGUgd2lyZS4NCisgICAgLSBFbnVtIGNvbnN0YW50cyBjYW4gYmUgZ2VuZXJhdGVkIGludG8gY29udGFpbmVyIGludGVyZmFjZXMgYmVhcmluZw0KKyAgICAgIHRoZSBlbnVtJ3MgbmFtZSAoc28gdGhlIHJlZmVyZW5jaW5nIGNvZGUgaXMgaW4gSmF2YSBzdHlsZSkuDQorICAgIC0gQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vIGNhbiBvbmx5IHRha2UgYnl0ZVtdIChub3QgSW5wdXRTdHJlYW0pLg0KKyAgICAtIFNpbWlsYXJseSBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vIGNhbiBvbmx5IHdyaXRlIHRvIGJ5dGVbXS4NCisgICAgLSBSZXBlYXRlZCBmaWVsZHMgYXJlIGluIGFycmF5cywgbm90IEFycmF5TGlzdCBvciBWZWN0b3IuIE51bGwgYXJyYXkNCisgICAgICBlbGVtZW50cyBhcmUgYWxsb3dlZCBhbmQgc2lsZW50bHkgaWdub3JlZC4NCisgICAgLSBGdWxsIHN1cHBvcnQgZm9yIHNlcmlhbGl6aW5nL2Rlc2VyaWFsaXppbmcgcmVwZWF0ZWQgcGFja2VkIGZpZWxkcy4NCisgICAgLSBTdXBwb3J0ICBleHRlbnNpb25zIChpbiBwcm90bzIpLg0KKyAgICAtIFVuc2V0IG1lc3NhZ2VzL2dyb3VwcyBhcmUgbnVsbCwgbm90IGFuIGltbXV0YWJsZSBlbXB0eSBkZWZhdWx0DQorICAgICAgaW5zdGFuY2UuDQorICAgIC0gdG9CeXRlQXJyYXkoLi4uKSBhbmQgbWVyZ2VGcm9tKC4uLikgYXJlIG5vdyBzdGF0aWMgZnVuY3Rpb25zIG9mDQorICAgICAgTWVzc2FnZU5hbm8uDQorICAgIC0gVGhlICdieXRlcycgdHlwZSB0cmFuc2xhdGVzIHRvIHRoZSBKYXZhIHR5cGUgYnl0ZVtdLg0KKw0KKyAgICBTZWUgamF2YW5hbm8vUkVBRE1FLnR4dCBmb3IgZGV0YWlscy4NCisNCisyMDE0LTEyLTAxIHZlcnNpb24gMy4wLjAtYWxwaGEtMSAoQysrL0phdmEpOg0KKw0KKyAgR2VuZXJhbA0KKyAgKiBJbnRyb2R1Y2VkIFByb3RvY29sIEJ1ZmZlcnMgbGFuZ3VhZ2UgdmVyc2lvbiAzIChha2EgcHJvdG8zKS4NCisNCisgICAgV2hlbiBwcm90b2J1ZiB3YXMgaW5pdGlhbGx5IG9wZW5zb3VyY2VkIGl0IGltcGxlbWVudGVkIFByb3RvY29sIEJ1ZmZlcnMNCisgICAgbGFuZ3VhZ2UgdmVyc2lvbiAyIChha2EgcHJvdG8yKSwgd2hpY2ggaXMgd2h5IHRoZSB2ZXJzaW9uIG51bWJlcg0KKyAgICBzdGFydGVkIGZyb20gdjIuMC4wLiBGcm9tIHYzLjAuMCwgYSBuZXcgbGFuZ3VhZ2UgdmVyc2lvbiAocHJvdG8zKSBpcw0KKyAgICBpbnRyb2R1Y2VkIHdoaWxlIHRoZSBvbGQgdmVyc2lvbiAocHJvdG8yKSB3aWxsIGNvbnRpbnVlIHRvIGJlIHN1cHBvcnRlZC4NCisNCisgICAgVGhlIG1haW4gaW50ZW50IG9mIGludHJvZHVjaW5nIHByb3RvMyBpcyB0byBjbGVhbiB1cCBwcm90b2J1ZiBiZWZvcmUNCisgICAgcHVzaGluZyB0aGUgbGFuZ3VhZ2UgYXMgdGhlIGZvdW5kYXRpb24gb2YgR29vZ2xlJ3MgbmV3IEFQSSBwbGF0Zm9ybS4NCisgICAgSW4gcHJvdG8zLCB0aGUgbGFuZ3VhZ2UgaXMgc2ltcGxpZmllZCwgYm90aCBmb3IgZWFzZSBvZiB1c2UgYW5kICB0bw0KKyAgICBtYWtlIGl0IGF2YWlsYWJsZSBpbiBhIHdpZGVyIHJhbmdlIG9mIHByb2dyYW1taW5nIGxhbmd1YWdlcy4gQXQgdGhlDQorICAgIHNhbWUgdGltZSBhIGZldyBmZWF0dXJlcyBhcmUgYWRkZWQgdG8gYmV0dGVyIHN1cHBvcnQgY29tbW9uIGlkaW9tcw0KKyAgICBmb3VuZCBpbiBBUElzLg0KKw0KKyAgICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbWFpbiBuZXcgZmVhdHVyZXMgaW4gbGFuZ3VhZ2UgdmVyc2lvbiAzOg0KKw0KKyAgICAgIDEuIFJlbW92YWwgb2YgZmllbGQgcHJlc2VuY2UgbG9naWMgZm9yIHByaW1pdGl2ZSB2YWx1ZSBmaWVsZHMsIHJlbW92YWwNCisgICAgICAgICBvZiByZXF1aXJlZCBmaWVsZHMsIGFuZCByZW1vdmFsIG9mIGRlZmF1bHQgdmFsdWVzLiBUaGlzIG1ha2VzIHByb3RvMw0KKyAgICAgICAgIHNpZ25pZmljYW50bHkgZWFzaWVyIHRvIGltcGxlbWVudCB3aXRoIG9wZW4gc3RydWN0IHJlcHJlc2VudGF0aW9ucywNCisgICAgICAgICBhcyBpbiBsYW5ndWFnZXMgbGlrZSBBbmRyb2lkIEphdmEsIE9iamVjdGl2ZSBDLCBvciBHby4NCisgICAgICAyLiBSZW1vdmFsIG9mIHVua25vd24gZmllbGRzLg0KKyAgICAgIDMuIFJlbW92YWwgb2YgZXh0ZW5zaW9ucywgd2hpY2ggYXJlIGluc3RlYWQgcmVwbGFjZWQgYnkgYSBuZXcgc3RhbmRhcmQNCisgICAgICAgICB0eXBlIGNhbGxlZCBBbnkuDQorICAgICAgNC4gRml4IHNlbWFudGljcyBmb3IgdW5rbm93biBlbnVtIHZhbHVlcy4NCisgICAgICA1LiBBZGRpdGlvbiBvZiBtYXBzLg0KKyAgICAgIDYuIEFkZGl0aW9uIG9mIGEgc21hbGwgc2V0IG9mIHN0YW5kYXJkIHR5cGVzIGZvciByZXByZXNlbnRhdGlvbiBvZiB0aW1lLA0KKyAgICAgICAgIGR5bmFtaWMgZGF0YSwgZXRjLg0KKyAgICAgIDcuIEEgd2VsbC1kZWZpbmVkIGVuY29kaW5nIGluIEpTT04gYXMgYW4gYWx0ZXJuYXRpdmUgdG8gYmluYXJ5IHByb3RvDQorICAgICAgICAgZW5jb2RpbmcuDQorDQorICAgIFRoaXMgcmVsZWFzZSAodjMuMC4wLWFscGhhLTEpIGluY2x1ZGVzIHBhcnRpYWwgcHJvdG8zIHN1cHBvcnQgZm9yIEMrKyBhbmQNCisgICAgSmF2YS4gSXRlbXMgNiAod2VsbC1rbm93biB0eXBlcykgYW5kIDcgKEpTT04gZm9ybWF0KSBpbiB0aGUgYWJvdmUgZmVhdHVyZQ0KKyAgICBsaXN0IGFyZSBub3QgaW1wbGVtZW50ZWQuDQorDQorICAgIEEgbmV3IG5vdGlvbiAic3ludGF4IiBpcyBpbnRyb2R1Y2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIC5wcm90byBmaWxlDQorICAgIHVzZXMgcHJvdG8yIG9yIHByb3RvMzoNCisNCisgICAgICAvLyBmb28ucHJvdG8NCisgICAgICBzeW50YXggPSAicHJvdG8zIjsNCisgICAgICBtZXNzYWdlIEJhciB7Li4ufQ0KKw0KKyAgICBJZiBvbWl0dGVkLCB0aGUgcHJvdG9jb2wgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSBhIHdhcm5pbmcgYW5kICJwcm90bzIiIHdpbGwNCisgICAgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdC4gVGhpcyB3YXJuaW5nIHdpbGwgYmUgdHVybmVkIGludG8gYW4gZXJyb3IgaW4gYQ0KKyAgICBmdXR1cmUgcmVsZWFzZS4NCisNCisgICAgV2UgcmVjb21tZW5kIHRoYXQgbmV3IFByb3RvY29sIEJ1ZmZlcnMgdXNlcnMgdXNlIHByb3RvMy4gSG93ZXZlciwgd2UgZG8gbm90DQorICAgIGdlbmVyYWxseSByZWNvbW1lbmQgdGhhdCBleGlzdGluZyB1c2VycyBtaWdyYXRlIGZyb20gcHJvdG8yIGZyb20gcHJvdG8zIGR1ZQ0KKyAgICB0byBBUEkgaW5jb21wYXRpYmlsaXR5LCBhbmQgd2Ugd2lsbCBjb250aW51ZSB0byBzdXBwb3J0IHByb3RvMiBmb3IgYSBsb25nDQorICAgIHRpbWUuDQorDQorICAqIEFkZGVkIHN1cHBvcnQgZm9yIG1hcCBmaWVsZHMgKGltcGxlbWVudGVkIGluIEMrKy9KYXZhIGZvciBib3RoIHByb3RvMiBhbmQNCisgICAgcHJvdG8zKS4NCisNCisgICAgTWFwIGZpZWxkcyBjYW4gYmUgZGVjbGFyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBzeW50YXg6DQorDQorICAgICAgbWVzc2FnZSBGb28gew0KKyAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YWx1ZXMgPSAxOw0KKyAgICAgIH0NCisNCisgICAgRGF0YSBvZiBhIG1hcCBmaWVsZCB3aWxsIGJlIHN0b3JlZCBpbiBtZW1vcnkgYXMgYW4gdW5vcmRlcmVkIG1hcCBhbmQgaXQNCisgICAgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggZ2VuZXJhdGVkIGFjY2Vzc29ycy4NCisNCisgIEMrKw0KKyAgKiBBZGRlZCBhcmVuYSBhbGxvY2F0aW9uIHN1cHBvcnQgKGZvciBib3RoIHByb3RvMiBhbmQgcHJvdG8zKS4NCisNCisgICAgUHJvZmlsaW5nIHNob3dzIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gY29uc3RpdHV0ZXMgYSBzaWduaWZpY2FudA0KKyAgICBmcmFjdGlvbiBvZiBDUFUtdGltZSBzcGVudCBpbiBwcm90b2J1ZiBjb2RlIGFuZCBhcmVuYSBhbGxvY2F0aW9uIGlzIGENCisgICAgdGVjaG5pcXVlIGludHJvZHVjZWQgdG8gcmVkdWNlIHRoaXMgY29zdC4gV2l0aCBhcmVuYSBhbGxvY2F0aW9uLCBuZXcNCisgICAgb2JqZWN0cyB3aWxsIGJlIGFsbG9jYXRlZCBmcm9tIGEgbGFyZ2UgcGllY2Ugb2YgcHJlYWxsb2NhdGVkIG1lbW9yeSBhbmQNCisgICAgZGVhbGxvY2F0aW9uIG9mIHRoZXNlIG9iamVjdHMgaXMgYWxtb3N0IGZyZWUuIEVhcmx5IGFkb3B0aW9uIHNob3dzIDIwJSB0bw0KKyAgICA1MCUgaW1wcm92ZW1lbnQgaW4gc29tZSBHb29nbGUgYmluYXJpZXMuDQorDQorICAgIFRvIGVuYWJsZSBhcmVuYSBzdXBwb3J0LCBhZGQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8geW91ciAucHJvdG8gZmlsZToNCisNCisgICAgICBvcHRpb24gY2NfZW5hYmxlX2FyZW5hcyA9IHRydWU7DQorDQorICAgIFByb3RvY29sIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgYWRkaXRpb25hbCBjb2RlIHRvIG1ha2UgdGhlIGdlbmVyYXRlZA0KKyAgICBtZXNzYWdlIGNsYXNzZXMgd29yayB3aXRoIGFyZW5hcy4gVGhpcyBkb2VzIG5vdCBjaGFuZ2UgdGhlIGV4aXN0aW5nIEFQSQ0KKyAgICBvZiBwcm90b2J1ZiBtZXNzYWdlcyBhbmQgZG9lcyBub3QgYWZmZWN0IHdpcmUgZm9ybWF0LiBZb3VyIGV4aXN0aW5nIGNvZGUNCisgICAgc2hvdWxkIGNvbnRpbnVlIHRvIHdvcmsgYWZ0ZXIgYWRkaW5nIHRoaXMgb3B0aW9uLiBJbiB0aGUgZnV0dXJlIHdlIHdpbGwNCisgICAgbWFrZSB0aGlzIG9wdGlvbiBlbmFibGVkIGJ5IGRlZmF1bHQuDQorDQorICAgIFRvIGFjdHVhbGx5IHRha2UgYWR2YW50YWdlIG9mIGFyZW5hIGFsbG9jYXRpb24sIHlvdSBuZWVkIHRvIHVzZSB0aGUgYXJlbmENCisgICAgQVBJcyB3aGVuIGNyZWF0aW5nIG1lc3NhZ2VzLiBBIHF1aWNrIGV4YW1wbGUgb2YgdXNpbmcgdGhlIGFyZW5hIEFQSToNCisNCisgICAgICB7DQorICAgICAgICBnb29nbGU6OnByb3RvYnVmOjpBcmVuYSBhcmVuYTsNCisgICAgICAgIC8vIEFsbG9jYXRlIGEgcHJvdG9idWYgbWVzc2FnZSBpbiB0aGUgYXJlbmEuDQorICAgICAgICBNeU1lc3NhZ2UqIG1lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxNeU1lc3NhZ2U+KCZhcmVuYSk7DQorICAgICAgICAvLyBBbGwgc3VibWVzc2FnZXMgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhlIHNhbWUgYXJlbmEuDQorICAgICAgICBpZiAoIW1lc3NhZ2UtPlBhcnNlRnJvbVN0cmluZyhkYXRhKSkgew0KKyAgICAgICAgICAvLyBEZWFsIHdpdGggbWFsZm9ybWVkIGlucHV0IGRhdGEuDQorICAgICAgICB9DQorICAgICAgICAvLyBNdXN0IG5vdCBkZWxldGUgdGhlIG1lc3NhZ2UgaGVyZS4gSXQgd2lsbCBiZSBkZWxldGVkIGF1dG9tYXRpY2FsbHkNCisgICAgICAgIC8vIHdoZW4gdGhlIGFyZW5hIGlzIGRlc3Ryb3llZC4NCisgICAgICB9DQorDQorICAgIEN1cnJlbnRseSBhcmVuYSBkb2VzIG5vdCB3b3JrIHdpdGggbWFwIGZpZWxkcy4gRW5hYmxpbmcgYXJlbmEgaW4gYSAucHJvdG8NCisgICAgZmlsZSBjb250YWluaW5nIG1hcCBmaWVsZHMgd2lsbCByZXN1bHQgaW4gY29tcGlsZSBlcnJvcnMgaW4gdGhlIGdlbmVyYXRlZA0KKyAgICBjb2RlLiBUaGlzIHdpbGwgYmUgYWRkcmVzc2VkIGluIGEgZnV0dXJlIHJlbGVhc2UuDQorDQorMjAxNC0xMC0yMCB2ZXJzaW9uIDIuNi4xOg0KKw0KKyAgQysrDQorICAqIEFkZGVkIGF0b21pY29wcyBzdXBwb3J0IGZvciBTb2xhcmlzLg0KKyAgKiBSZWxlYXNlZCBtZW1vcnkgYWxsb2NhdGVkIGJ5IEluaXRpYWxpemVEZWZhdWx0UmVwZWF0ZWRGaWVsZHMoKSBhbmQNCisgICAgR2V0RW1wdHlTdHJpbmcoKS4gU29tZSBtZW1vcnkgc2FuaXRpemVycyByZXBvcnRlZCB0aGVtIGFzIG1lbW9yeSBsZWFrcy4NCisNCisgIEphdmENCisgICogVXBkYXRlZCBEeW5hbWljTWVzc2FnZS5zZXRGaWVsZCgpIHRvIGhhbmRsZSByZXBlYXRlZCBlbnVtIHZhbHVlcw0KKyAgICBjb3JyZWN0bHkuDQorICAqIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIE51bGxQb2ludGVyRXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuDQorICAgIGNvbnZlcnRpbmcgbWFudWFsbHkgY29uc3RydWN0ZWQgRmlsZURlc2NyaXB0b3JQcm90byB0bw0KKyAgICBGaWxlRGVzY3JpcHRvci4NCisNCisgIFB5dGhvbg0KKyAgKiBGaXhlZCBXaGljaE9uZW9mKCkgdG8gd29yayB3aXRoIGRlLXNlcmlhbGl6ZWQgcHJvdG9idWYgbWVzc2FnZXMuDQorICAqIEZpeGVkIGEgbWlzc2luZyBmaWxlIHByb2JsZW0gb2YgUHl0aG9uIEMrKyBpbXBsZW1lbnRhdGlvbi4NCisNCisyMDE0LTA4LTE1IHZlcnNpb24gMi42LjA6DQorDQorICBHZW5lcmFsDQorICAqIEFkZGVkIG9uZW9mcyh1bmlvbnMpIGZlYXR1cmUuIEZpZWxkcyBpbiB0aGUgc2FtZSBvbmVvZiB3aWxsIHNoYXJlDQorICAgIG1lbW9yeSBhbmQgYXQgbW9zdCBvbmUgZmllbGQgY2FuIGJlIHNldCBhdCB0aGUgc2FtZSB0aW1lLiBVc2UgdGhlDQorICAgIG9uZW9mIGtleXdvcmQgdG8gZGVmaW5lIGEgb25lb2YgbGlrZToNCisgICAgICBtZXNzYWdlIFNhbXBsZU1lc3NhZ2Ugew0KKyAgICAgICAgb25lb2YgdGVzdF9vbmVvZiB7DQorICAgICAgICAgIHN0cmluZyBuYW1lID0gNDsNCisgICAgICAgICAgWW91ck1lc3NhZ2Ugc3ViX21lc3NhZ2UgPSA5Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICogRmlsZXMsIHNlcnZpY2VzLCBlbnVtcywgbWVzc2FnZXMsIG1ldGhvZHMgYW5kIGVudW0gdmFsdWVzIGNhbiBiZSBtYXJrZWQNCisgICAgYXMgZGVwcmVjYXRlZCBub3cuDQorICAqIEFkZGVkIFN1cHBvcnQgZm9yIGxpc3QgdmFsdWVzLCBpbmNsdWRpbmcgbGlzdHMgb2YgbWVzc2FnZXMsIHdoZW4NCisgICAgcGFyc2luZyB0ZXh0LWZvcm1hdHRlZCBwcm90b3MgaW4gQysrIGFuZCBKYXZhLg0KKyAgICAgIEZvciBleGFtcGxlOiAgZm9vOiBbMSwgMiwgM10NCisNCisgIEMrKw0KKyAgKiBFbmhhbmNlZCBjdXN0b21pemF0aW9uIG9uIFRlc3RGb3JtYXQgcHJpbnRpbmcuDQorICAqIEFkZGVkIFN3YXBGaWVsZHMoKSBpbiByZWZsZWN0aW9uIEFQSSB0byBzd2FwIGEgc3Vic2V0IG9mIGZpZWxkcy4NCisgICAgQWRkZWQgU2V0QWxsb2NhdGVkTWVzc2FnZSgpIGluIHJlZmxlY3Rpb24gQVBJLg0KKyAgKiBSZXBlYXRlZCBwcmltaXRpdmUgZXh0ZW5zaW9ucyBhcmUgbm93IHBhY2thYmxlLiBUaGUNCisgICAgW3BhY2tlZD10cnVlXSBvcHRpb24gb25seSBhZmZlY3RzIHNlcmlhbGl6ZXJzLiBUaGVyZWZvcmUsIGl0IGlzDQorICAgIHBvc3NpYmxlIHRvIHN3aXRjaCBhIHJlcGVhdGVkIGV4dGVuc2lvbiBmaWVsZCB0byBwYWNrZWQgZm9ybWF0DQorICAgIHdpdGhvdXQgYnJlYWtpbmcgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkuDQorICAqIFZhcmlvdXMgc3BlZWQgb3B0aW1pemF0aW9ucy4NCisNCisgIEphdmENCisgICogd3JpdGVUbygpIG1ldGhvZCBpbiBCeXRlU3RyaW5nIGNhbiBub3cgd3JpdGUgYSBzdWJzdHJpbmcgdG8gYW4NCisgICAgb3V0cHV0IHN0cmVhbS4gQWRkZWQgZW5kV2l0aCgpIG1ldGhvZCBmb3IgQnl0ZVN0cmluZy4NCisgICogQnl0ZVN0cmluZyBhbmQgQnl0ZUJ1ZmZlciBhcmUgbm93IHN1cHBvcnRlZCBpbiBDb2RlZElucHV0U3RyZWFtDQorICAgIGFuZCBDb2RlZE91dHB1dFN0cmVhbS4NCisgICogamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggY2FuIG5vdyBiZSB1c2VkIHdpdGggdGhlIExJVEVfUlVOVElNRS4NCisNCisgIFB5dGhvbg0KKyAgKiBBIG5ldyBDKystYmFja2VkIGV4dGVuc2lvbiBtb2R1bGUgKGFrYSAiY3BwIGFwaSB2MiIpIHRoYXQgcmVwbGFjZXMgdGhlDQorICAgIG9sZCAoImNwcCBhcGkgdjEiKSBvbmUuICBNdWNoIGZhc3RlciB0aGFuIHRoZSBwdXJlIFB5dGhvbiBjb2RlLiAgVGhpcyBvbmUNCisgICAgcmVzb2x2ZXMgbWFueSBidWdzIGFuZCBpcyByZWNvbW1lbmRlZCBmb3IgZ2VuZXJhbCB1c2Ugb3ZlciB0aGUNCisgICAgcHVyZSBQeXRob24gd2hlbiBwb3NzaWJsZS4NCisgICogRGVzY3JpcHRvcnMgbm93IGhhdmUgZW51bV90eXBlc19ieV9uYW1lIGFuZCBleHRlbnNpb25fdHlwZXNfYnlfbmFtZSBkaWN0DQorICAgIGF0dHJpYnV0ZXMuDQorICAqIFN1cHBvcnQgZm9yIFB5dGhvbiAzLg0KKw0KKzIwMTMtMDItMjcgdmVyc2lvbiAyLjUuMDoNCisNCisgIEdlbmVyYWwNCisgICogTmV3IG5vdGlvbiAiaW1wb3J0IHB1YmxpYyIgdGhhdCBhbGxvd3MgYSBwcm90byBmaWxlIHRvIGZvcndhcmQgdGhlIGNvbnRlbnQNCisgICAgaXQgaW1wb3J0cyB0byBpdHMgaW1wb3J0ZXJzLiBGb3IgZXhhbXBsZSwNCisgICAgICAvLyBmb28ucHJvdG8NCisgICAgICBpbXBvcnQgcHVibGljICJiYXIucHJvdG8iOw0KKyAgICAgIGltcG9ydCAiYmF6LnByb3RvIjsNCisNCisgICAgICAvLyBxdXgucHJvdG8NCisgICAgICBpbXBvcnQgImZvby5wcm90byI7DQorICAgICAgLy8gU3R1ZmYgZGVmaW5lZCBpbiBiYXIucHJvdG8gbWF5IGJlIHVzZWQgaW4gdGhpcyBmaWxlLCBidXQgc3R1ZmYgZnJvbQ0KKyAgICAgIC8vIGJhei5wcm90byBtYXkgTk9UIGJlIHVzZWQgd2l0aG91dCBpbXBvcnRpbmcgaXQgZXhwbGljaXRseS4NCisgICAgVGhpcyBpcyB1c2VmdWwgZm9yIG1vdmluZyBwcm90byBmaWxlcy4gVG8gbW92ZSBhIHByb3RvIGZpbGUsIGp1c3QgbGVhdmUNCisgICAgYSBzaW5nbGUgImltcG9ydCBwdWJsaWMiIGluIHRoZSBvbGQgcHJvdG8gZmlsZS4NCisgICogTmV3IGVudW0gb3B0aW9uICJhbGxvd19hbGlhcyIgdGhhdCBzcGVjaWZpZXMgd2hldGhlciBkaWZmZXJlbnQgc3ltYm9scyBjYW4NCisgICAgYmUgYXNzaWduZWQgdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZS4gRGVmYXVsdCB2YWx1ZSBpcyAidHJ1ZSIuIFNldHRpbmcgaXQgdG8NCisgICAgZmFsc2UgY2F1c2VzIHRoZSBjb21waWxlciB0byByZWplY3QgZW51bSBkZWZpbml0aW9ucyB3aGVyZSBtdWx0aXBsZSBzeW1ib2xzDQorICAgIGhhdmUgdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZS4NCisgICAgTm90ZTogV2UgcGxhbiB0byBmbGlwIHRoZSBkZWZhdWx0IHZhbHVlIHRvICJmYWxzZSIgaW4gYSBmdXR1cmUgcmVsZWFzZS4NCisgICAgUHJvamVjdHMgdXNpbmcgZW51bSBhbGlhc2VzIHNob3VsZCBzZXQgdGhlIG9wdGlvbiB0byAidHJ1ZSIgaW4gdGhlaXIgLnByb3RvDQorICAgIGZpbGVzLg0KKw0KKyAgQysrDQorICAqIE5ldyBnZW5lcmF0ZWQgbWV0aG9kIHNldF9hbGxvY2F0ZWRfZm9vKFR5cGUqIGZvbykgZm9yIG1lc3NhZ2UgYW5kIHN0cmluZw0KKyAgICBmaWVsZHMuIFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBmaWVsZCB0byBhIHByZS1hbGxvY2F0ZWQgb2JqZWN0DQorICAgIGFuZCB0aGUgY29udGFpbmluZyBtZXNzYWdlIHRha2VzIHRoZSBvd25lcnNoaXAgb2YgdGhhdCBvYmplY3QuDQorICAqIEFkZGVkIFNldEFsbG9jYXRlZEV4dGVuc2lvbigpIGFuZCBSZWxlYXNlRXh0ZW5zaW9uKCkgdG8gZXh0ZW5zaW9ucyBBUEkuDQorICAqIEN1c3RvbSBvcHRpb25zIGFyZSBub3cgZm9ybWF0dGVkIGNvcnJlY3RseSB3aGVuIGRlc2NyaXB0b3JzIGFyZSBwcmludGVkIGluDQorICAgIHRleHQgZm9ybWF0Lg0KKyAgKiBWYXJpb3VzIHNwZWVkIG9wdGltaXphdGlvbnMuDQorDQorICBKYXZhDQorICAqIENvbW1lbnRzIGluIHByb3RvIGZpbGVzIGFyZSBub3cgY29sbGVjdGVkIGFuZCBwdXQgaW50byBnZW5lcmF0ZWQgY29kZSBhcw0KKyAgICBjb21tZW50cyBmb3IgY29ycmVzcG9uZGluZyBjbGFzc2VzIGFuZCBkYXRhIG1lbWJlcnMuDQorICAqIEFkZGVkIFBhcnNlciB0byBwYXJzZSBkaXJlY3RseSBpbnRvIG1lc3NhZ2VzIHdpdGhvdXQgYSBCdWlsZGVyLiBGb3INCisgICAgZXhhbXBsZSwNCisgICAgICBGb28gZm9vID0gRm9vLlBBUlNFUi5QYXJzZUZyb20oaW5wdXQpOw0KKyAgICBVc2luZyBQYXJzZXIgaXMgfjI1JSBmYXN0ZXIgdGhhbiB1c2luZyBCdWlsZGVyIHRvIHBhcnNlIG1lc3NhZ2VzLg0KKyAgKiBBZGRlZCBnZXR0ZXJzL3NldHRlcnMgdG8gYWNjZXNzIHRoZSB1bmRlcmx5aW5nIEJ5dGVTdHJpbmcgb2YgYSBzdHJpbmcgZmllbGQNCisgICAgZGlyZWN0bHkuDQorICAqIEJ5dGVTdHJpbmcgbm93IHN1cHBvcnRzIG1vcmUgb3BlcmF0aW9uczogc3Vic3RyaW5nKCksIHByZXBlbmQoKSwgYW5kDQorICAgIGFwcGVuZCgpLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgQnl0ZVN0cmluZyB1c2VzIGEgYmluYXJ5IHRyZWUgc3RydWN0dXJlDQorICAgIHRvIHN1cHBvcnQgdGhlc2Ugb3BlcmF0aW9ucyBlZmZpY2llbnRseS4NCisgICogTmV3IG1ldGhvZCBmaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSB0aGF0IGxpc3RzIGFsbCBtaXNzaW5nIHJlcXVpcmVkDQorICAgIGZpZWxkcy4NCisgICogVmFyaW91cyBjb2RlIHNpemUgYW5kIHNwZWVkIG9wdGltaXphdGlvbnMuDQorDQorICBQeXRob24NCisgICogQWRkZWQgc3VwcG9ydCBmb3IgZHluYW1pYyBtZXNzYWdlIGNyZWF0aW9uLiBEZXNjcmlwdG9yRGF0YWJhc2UsDQorICAgIERlc2NyaXB0b3JQb29sLCBhbmQgTWVzc2FnZUZhY3Rvcnkgd29yayBsaWtlIHRoZWlyIEMrKyBjb3VudGVycGFydHMgdG8NCisgICAgc2ltcGxpZnkgRGVzY3JpcHRvciBjb25zdHJ1Y3Rpb24gZnJvbSAqRGVzY3JpcHRvclByb3RvcywgYW5kIE1lc3NhZ2VGYWN0b3J5DQorICAgIHByb3ZpZGVzIGEgbWVzc2FnZSBpbnN0YW5jZSBmcm9tIGEgRGVzY3JpcHRvci4NCisgICogQWRkZWQgcGlja2xlIHN1cHBvcnQgZm9yIHByb3RvYnVmIG1lc3NhZ2VzLg0KKyAgKiBVbmtub3duIGZpZWxkcyBhcmUgbm93IHByZXNlcnZlZCBhZnRlciBwYXJzaW5nLg0KKyAgKiBGaXhlZCBidWcgd2hlcmUgY3VzdG9tIG9wdGlvbnMgd2VyZSBub3QgY29ycmVjdGx5IHBvcHVsYXRlZC4gQ3VzdG9tDQorICAgIG9wdGlvbnMgY2FuIGJlIGFjY2Vzc2VkIG5vdy4NCisgICogQWRkZWQgRW51bVR5cGVXcmFwcGVyIHRoYXQgcHJvdmlkZXMgYmV0dGVyIGFjY2Vzc2liaWxpdHkgdG8gZW51bSB0eXBlcy4NCisgICogQWRkZWQgUGFyc2VNZXNzYWdlKGRlc2NyaXB0b3IsIGJ5dGVzKSB0byBnZW5lcmF0ZSBhIG5ldyBNZXNzYWdlIGluc3RhbmNlDQorICAgIGZyb20gYSBkZXNjcmlwdG9yIGFuZCBhIGJ5dGUgc3RyaW5nLg0KKw0KKzIwMTEtMDUtMDEgdmVyc2lvbiAyLjQuMToNCisNCisgIEMrKw0KKyAgKiBGaXhlZCB0aGUgZnJpZW5kc2hpcCBwcm9ibGVtIGZvciBvbGQgY29tcGlsZXJzIHRvIG1ha2UgdGhlIGxpYnJhcnkgbm93IGdjYyAzDQorICAgIGNvbXBhdGlibGUgYWdhaW4uDQorICAqIEZpeGVkIHZjcHJvamVjdHMvZXh0cmFjdF9pbmNsdWRlcy5iYXQgdG8gZXh0cmFjdCBjb21waWxlci9wbHVnaW4uaC4NCisNCisgIEphdmENCisgICogUmVtb3ZlZCB1c2FnZXMgb2YgSkRLIDEuNiBvbmx5IGZlYXR1cmVzIHRvIG1ha2UgdGhlIGxpYnJhcnkgbm93IEpESyAxLjUNCisgICAgY29tcGF0aWJsZSBhZ2Fpbi4NCisgICogRml4ZWQgYSBidWcgYWJvdXQgbmVnYXRpdmUgZW51bSB2YWx1ZXMuDQorICAqIHNlcmlhbFZlcnNpb25VSUQgaXMgbm93IGRlZmluZWQgaW4gZ2VuZXJhdGVkIG1lc3NhZ2VzIGZvciBqYXZhIHNlcmlhbGl6aW5nLg0KKyAgKiBGaXhlZCBwcm90b2MgdG8gdXNlIGphdmEubGFuZy5PYmplY3QsIHdoaWNoIG1ha2VzICJPYmplY3QiIG5vdyBhIHZhbGlkDQorICAgIG1lc3NhZ2UgbmFtZSBhZ2Fpbi4NCisNCisgIFB5dGhvbg0KKyAgKiBFeHBlcmltZW50YWwgQysrIGltcGxlbWVudGF0aW9uIG5vdyByZXF1aXJlcyBDKysgcHJvdG9idWYgbGlicmFyeSBpbnN0YWxsZWQuDQorICAgIFNlZSB0aGUgUkVBRE1FLnR4dCBpbiB0aGUgcHl0aG9uIGRpcmVjdG9yeSBmb3IgZGV0YWlscy4NCisNCisyMDExLTAyLTAyIHZlcnNpb24gMi40LjA6DQorDQorICBHZW5lcmFsDQorICAqIFRoZSBSUEMgKGNjfGphdmF8cHkpX2dlbmVyaWNfc2VydmljZXMgZGVmYXVsdCB2YWx1ZSBpcyBub3cgZmFsc2UgaW5zdGVhZCBvZg0KKyAgICB0cnVlLg0KKyAgKiBDdXN0b20gb3B0aW9ucyBjYW4gaGF2ZSBhZ2dyZWdhdGUgdHlwZXMuIEZvciBleGFtcGxlLA0KKyAgICAgIG1lc3NhZ2UgTXlPcHRpb24gew0KKyAgICAgICAgb3B0aW9uYWwgc3RyaW5nIGNvbW1lbnQgPSAxOw0KKyAgICAgICAgb3B0aW9uYWwgc3RyaW5nIGF1dGhvciA9IDI7DQorICAgICAgfQ0KKyAgICAgIGV4dGVuZCBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIHsNCisgICAgICAgIG9wdGlvbmFsIE15T3B0aW9uIG15b3B0aW9uID0gMTIzNDU7DQorICAgICAgfQ0KKyAgICBUaGlzIG9wdGlvbiBjYW4gbm93IGJlIHNldCBhcyBmb2xsb3dzOg0KKyAgICAgIG1lc3NhZ2UgU29tZVR5cGUgew0KKyAgICAgICAgb3B0aW9uYWwgaW50MzIgZmllbGQgPSAxIFsobXlvcHRpb24pID0geyBjb21tZW50Oid4JyBhdXRob3I6J3knIH1dOw0KKyAgICAgIH0NCisNCisgIEMrKw0KKyAgKiBWYXJpb3VzIHNwZWVkIGFuZCBjb2RlIHNpemUgb3B0aW1pemF0aW9ucy4NCisgICogQWRkZWQgYSByZWxlYXNlX2ZvbygpIG1ldGhvZCBvbiBzdHJpbmcgYW5kIG1lc3NhZ2UgZmllbGRzLg0KKyAgKiBGaXhlZCBnemlwX291dHB1dF9zdHJlYW0gc3ViLXN0cmVhbSBoYW5kbGluZy4NCisNCisgIEphdmENCisgICogQnVpbGRlcnMgbm93IG1haW50YWluIHN1Yi1idWlsZGVycyBmb3Igc3ViLW1lc3NhZ2VzLiBVc2UgZ2V0Rm9vQnVpbGRlcigpIHRvDQorICAgIGdldCB0aGUgYnVpbGRlciBmb3IgdGhlIHN1Yi1tZXNzYWdlICJmb28iLiBUaGlzIGFsbG93cyB5b3UgdG8gcmVwZWF0ZWRseQ0KKyAgICBtb2RpZnkgZGVlcGx5LW5lc3RlZCBzdWItbWVzc2FnZXMgd2l0aG91dCByZWJ1aWxkaW5nIHRoZW0uDQorICAqIEJ1aWxkZXIuYnVpbGQoKSBubyBsb25nZXIgaW52YWxpZGF0ZXMgdGhlIEJ1aWxkZXIgZm9yIGdlbmVyYXRlZCBtZXNzYWdlcw0KKyAgICAoWW91IG1heSBjb250aW51ZSB0byBtb2RpZnkgaXQgYW5kIHRoZW4gYnVpbGQgYW5vdGhlciBtZXNzYWdlKS4NCisgICogQ29kZSBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZSBlZmZpY2llbnQgZXF1YWxzKCkgYW5kIGhhc2hDb2RlKCkNCisgICAgaW1wbGVtZW50YXRpb25zIGlmIG5ldyBvcHRpb24gamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggaXMgZW5hYmxlZC4NCisgICAgKE90aGVyd2lzZSwgcmVmbGVjdGlvbi1iYXNlZCBpbXBsZW1lbnRhdGlvbnMgYXJlIHVzZWQuKQ0KKyAgKiBHZW5lcmF0ZWQgbWVzc2FnZXMgbm93IGltcGxlbWVudCBTZXJpYWxpemFibGUuDQorICAqIEZpZWxkcyB3aXRoIFtkZXByZWNhdGVkPXRydWVdIHdpbGwgYmUgbWFya2VkIHdpdGggQERlcHJlY2F0ZWQgaW4gSmF2YS4NCisgICogQWRkZWQgbGF6eSBjb252ZXJzaW9uIG9mIFVURi04IGVuY29kZWQgc3RyaW5ncyB0byBTdHJpbmcgb2JqZWN0cyB0byBpbXByb3ZlDQorICAgIHBlcmZvcm1hbmNlLg0KKyAgKiBWYXJpb3VzIG9wdGltaXphdGlvbnMuDQorICAqIEVudW0gdmFsdWUgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LCBpbnN0ZWFkIG9mIGNhbGxpbmcgZ2V0TnVtYmVyKCkgb24gdGhlDQorICAgIGVudW0gbWVtYmVyLg0KKyAgKiBGb3IgZWFjaCBlbnVtIHZhbHVlLCBhbiBpbnRlZ2VyIGNvbnN0YW50IGlzIGFsc28gZ2VuZXJhdGVkIHdpdGggdGhlIHN1ZmZpeA0KKyAgICBfVkFMVUUuDQorDQorICBQeXRob24NCisgICogQWRkZWQgYW4gZXhwZXJpbWVudGFsICBDKysgaW1wbGVtZW50YXRpb24gZm9yIFB5dGhvbiBtZXNzYWdlcyB2aWEgYSBQeXRob24NCisgICAgZXh0ZW5zaW9uLiBJbXBsZW1lbnRhdGlvbiB0eXBlIGlzIGNvbnRyb2xsZWQgYnkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUNCisgICAgUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT04gKHZhbGlkIHZhbHVlczogImNwcCIgYW5kICJweXRob24iKQ0KKyAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBjdXJyZW50bHkgInB5dGhvbiIgYnV0IHdpbGwgYmUgY2hhbmdlZCB0byAiY3BwIiBpbg0KKyAgICBmdXR1cmUgcmVsZWFzZS4NCisgICogSW1wcm92ZWQgcGVyZm9ybWFuY2Ugb24gbWVzc2FnZSBpbnN0YW50aWF0aW9uIHNpZ25pZmljYW50bHkuDQorICAgIE1vc3Qgb2YgdGhlIHdvcmsgb24gbWVzc2FnZSBpbnN0YW50aWF0aW9uIGlzIGRvbmUganVzdCBvbmNlIHBlciBtZXNzYWdlDQorICAgIGNsYXNzLCBpbnN0ZWFkIG9mIG9uY2UgcGVyIG1lc3NhZ2UgaW5zdGFuY2UuDQorICAqIEltcHJvdmVkIHBlcmZvcm1hbmNlIG9uIHRleHQgbWVzc2FnZSBwYXJzaW5nLg0KKyAgKiBBbGxvdyBhZGQoKSB0byBmb3J3YXJkIGtleXdvcmQgYXJndW1lbnRzIHRvIHRoZSBjb25jcmV0ZSBjbGFzcy4NCisgICAgICBFLmcuIGluc3RlYWQgb2YNCisgICAgICAgIGl0ZW0gPSByZXBlYXRlZF9maWVsZC5hZGQoKQ0KKyAgICAgICAgaXRlbS5mb28gPSBiYXINCisgICAgICAgIGl0ZW0uYmF6ID0gcXV1eA0KKyAgICAgIFlvdSBjYW4gZG86DQorICAgICAgICByZXBlYXRlZF9maWVsZC5hZGQoZm9vPWJhciwgYmF6PXF1dXgpDQorICAqIEFkZGVkIGEgc29ydCgpIGludGVyZmFjZSB0byB0aGUgQmFzZUNvbnRhaW5lci4NCisgICogQWRkZWQgYW4gZXh0ZW5kKCkgbWV0aG9kIHRvIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZHMuDQorICAqIEFkZGVkIFVURjggZGVidWcgc3RyaW5nIHN1cHBvcnQuDQorDQorMjAxMC0wMS0wOCB2ZXJzaW9uIDIuMy4wOg0KKw0KKyAgR2VuZXJhbA0KKyAgKiBQYXJzZXJzIGZvciByZXBlYXRlZCBudW1lcmljIGZpZWxkcyBub3cgYWx3YXlzIGFjY2VwdCBib3RoIHBhY2tlZCBhbmQNCisgICAgdW5wYWNrZWQgaW5wdXQuICBUaGUgW3BhY2tlZD10cnVlXSBvcHRpb24gb25seSBhZmZlY3RzIHNlcmlhbGl6ZXJzLg0KKyAgICBUaGVyZWZvcmUsIGl0IGlzIHBvc3NpYmxlIHRvIHN3aXRjaCBhIGZpZWxkIHRvIHBhY2tlZCBmb3JtYXQgd2l0aG91dA0KKyAgICBicmVha2luZyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSAtLSBhcyBsb25nIGFzIGFsbCBwYXJ0aWVzIGFyZSB1c2luZw0KKyAgICBwcm90b2J1ZiAyLjMuMCBvciBhYm92ZSwgYXQgbGVhc3QuDQorICAqIFRoZSBnZW5lcmljIFJQQyBzZXJ2aWNlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBDKyssIEphdmEsIGFuZCBQeXRob24NCisgICAgZ2VuZXJhdG9ycyBjYW4gYmUgZGlzYWJsZWQgdmlhIGZpbGUgb3B0aW9uczoNCisgICAgICBvcHRpb24gY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IGZhbHNlOw0KKyAgICAgIG9wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSBmYWxzZTsNCisgICAgICBvcHRpb24gcHlfZ2VuZXJpY19zZXJ2aWNlcyA9IGZhbHNlOw0KKyAgICBUaGlzIGFsbG93cyBwbHVnaW5zIHRvIGdlbmVyYXRlIGFsdGVybmF0aXZlIGNvZGUsIHBvc3NpYmx5IHNwZWNpZmljIHRvIHNvbWUNCisgICAgcGFydGljdWxhciBSUEMgaW1wbGVtZW50YXRpb24uDQorDQorICBwcm90b2MNCisgICogTm93IHN1cHBvcnRzIGEgcGx1Z2luIHN5c3RlbSBmb3IgY29kZSBnZW5lcmF0b3JzLiAgUGx1Z2lucyBjYW4gZ2VuZXJhdGUNCisgICAgY29kZSBmb3IgbmV3IGxhbmd1YWdlcyBvciBpbmplY3QgYWRkaXRpb25hbCBjb2RlIGludG8gdGhlIG91dHB1dCBvZiBvdGhlcg0KKyAgICBjb2RlIGdlbmVyYXRvcnMuICBQbHVnaW5zIGFyZSBqdXN0IGJpbmFyaWVzIHdoaWNoIGFjY2VwdCBhIHByb3RvY29sIGJ1ZmZlcg0KKyAgICBvbiBzdGRpbiBhbmQgd3JpdGUgYSBwcm90b2NvbCBidWZmZXIgdG8gc3Rkb3V0LCBzbyB0aGV5IG1heSBiZSB3cml0dGVuIGluDQorICAgIGFueSBsYW5ndWFnZS4gIFNlZSBzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90by4NCisgICAgKipXQVJOSU5HKio6ICBQbHVnaW5zIGFyZSBleHBlcmltZW50YWwuICBUaGUgaW50ZXJmYWNlIG1heSBjaGFuZ2UgaW4gYQ0KKyAgICBmdXR1cmUgdmVyc2lvbi4NCisgICogSWYgdGhlIG91dHB1dCBsb2NhdGlvbiBlbmRzIGluIC56aXAgb3IgLmphciwgcHJvdG9jIHdpbGwgd3JpdGUgaXRzIG91dHB1dA0KKyAgICB0byBhIHppcC9qYXIgYXJjaGl2ZSBpbnN0ZWFkIG9mIGEgZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGU6DQorICAgICAgcHJvdG9jIC0tamF2YV9vdXQ9bXlwcm90b19zcmNzLmphciAtLXB5dGhvbl9vdXQ9bXlwcm90by56aXAgbXlwcm90by5wcm90bw0KKyAgICBDdXJyZW50bHkgdGhlIGFyY2hpdmUgY29udGVudHMgYXJlIG5vdCBjb21wcmVzc2VkLCB0aG91Z2ggdGhpcyBjb3VsZCBjaGFuZ2UNCisgICAgaW4gdGhlIGZ1dHVyZS4NCisgICogaW5mLCAtaW5mLCBhbmQgbmFuIGNhbiBub3cgYmUgdXNlZCBhcyBkZWZhdWx0IHZhbHVlcyBmb3IgZmxvYXQgYW5kIGRvdWJsZQ0KKyAgICBmaWVsZHMuDQorDQorICBDKysNCisgICogVmFyaW91cyBzcGVlZCBhbmQgY29kZSBzaXplIG9wdGltaXphdGlvbnMuDQorICAqIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBpcyBub3cgZnVsbHkgdGhyZWFkLXNhZmUuDQorICAqIE1lc3NhZ2U6OlV0ZjhEZWJ1Z1N0cmluZygpIG1ldGhvZCBpcyBsaWtlIERlYnVnU3RyaW5nKCkgYnV0IGF2b2lkcyBlc2NhcGluZw0KKyAgICBVVEYtOCBieXRlcy4NCisgICogQ29tcGlsZWQtaW4gbWVzc2FnZSB0eXBlcyBjYW4gbm93IGNvbnRhaW4gZHluYW1pYyBleHRlbnNpb25zLCB0aHJvdWdoIHVzZQ0KKyAgICBvZiBDb2RlZElucHV0U3RyZWFtOjpTZXRFeHRlbnNpb25SZWdpc3RyeSgpLg0KKyAgKiBOb3cgY29tcGlsZXMgc2hhcmVkIGxpYnJhcmllcyAoRExMcykgYnkgZGVmYXVsdCBvbiBDeWd3aW4gYW5kIE1pbkdXLCB0bw0KKyAgICBtYXRjaCBvdGhlciBwbGF0Zm9ybXMuICBVc2UgLS1kaXNhYmxlLXNoYXJlZCB0byBhdm9pZCB0aGlzLg0KKw0KKyAgSmF2YQ0KKyAgKiBwYXJzZURlbGltaXRlZEZyb20oKSBhbmQgbWVyZ2VEZWxpbWl0ZWRGcm9tKCkgbm93IGRldGVjdCBFT0YgYW5kIHJldHVybg0KKyAgICBmYWxzZS9udWxsIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLg0KKyAgKiBGaXhlZCBzb21lIGluaXRpYWxpemF0aW9uIG9yZGVyaW5nIGJ1Z3MuDQorICAqIEZpeGVzIGZvciBPcGVuSkRLIDcuDQorDQorICBQeXRob24NCisgICogMTAtMjUgdGltZXMgZmFzdGVyIHRoYW4gMi4yLjAsIHN0aWxsIHB1cmUtUHl0aG9uLg0KKyAgKiBDYWxsaW5nIGEgbXV0YXRpbmcgbWV0aG9kIG9uIGEgc3ViLW1lc3NhZ2UgYWx3YXlzIGluc3RhbnRpYXRlcyB0aGUgbWVzc2FnZQ0KKyAgICBpbiBpdHMgcGFyZW50IGV2ZW4gaWYgdGhlIG11dGF0aW5nIG1ldGhvZCBkb2Vzbid0IGFjdHVhbGx5IG11dGF0ZSBhbnl0aGluZw0KKyAgICAoZS5nLiBwYXJzaW5nIGZyb20gYW4gZW1wdHkgc3RyaW5nKS4NCisgICogRXhwYW5kZWQgZGVzY3JpcHRvcnMgYSBiaXQuDQorDQorMjAwOS0wOC0xMSB2ZXJzaW9uIDIuMi4wOg0KKw0KKyAgQysrDQorICAqIExpdGUgbW9kZTogIFRoZSAib3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FIiBvcHRpb24gY2F1c2VzIHRoZSBjb21waWxlcg0KKyAgICB0byBnZW5lcmF0ZSBjb2RlIHdoaWNoIG9ubHkgZGVwZW5kcyBsaWJwcm90b2J1Zi1saXRlLCB3aGljaCBpcyBtdWNoIHNtYWxsZXINCisgICAgdGhhbiBsaWJwcm90b2J1ZiBidXQgbGFja3MgZGVzY3JpcHRvcnMsIHJlZmxlY3Rpb24sIGFuZCBzb21lIG90aGVyIGZlYXR1cmVzLg0KKyAgKiBGaXhlZCBidWcgd2hlcmUgTWVzc2FnZS5Td2FwKE1lc3NhZ2UpIHdhcyBvbmx5IGltcGxlbWVudGVkIGZvcg0KKyAgICBvcHRpbWl6ZV9mb3Jfc3BlZWQuICBTd2FwIG5vdyBwcm9wZXJseSBpbXBsZW1lbnRlZCBpbiBib3RoIG1vZGVzDQorICAgIChJc3N1ZSA5MSkuDQorICAqIEFkZGVkIFJlbW92ZUxhc3QgYW5kIFN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4MikgdG8gUmVmbGVjdGlvbg0KKyAgICBpbnRlcmZhY2UgZm9yIHJlcGVhdGVkIGVsZW1lbnRzLg0KKyAgKiBBZGRlZCBTd2FwKE1lc3NhZ2UpIHRvIFJlZmxlY3Rpb24gaW50ZXJmYWNlLg0KKyAgKiBGbG9hdGluZy1wb2ludCBsaXRlcmFscyBpbiBnZW5lcmF0ZWQgY29kZSB0aGF0IGFyZSBpbnRlbmRlZCB0byBiZQ0KKyAgICBzaW5nbGUtcHJlY2lzaW9uIG5vdyBleHBsaWNpdGx5IGhhdmUgJ2YnIHN1ZmZpeCB0byBhdm9pZCBwZWRhbnRpYyB3YXJuaW5ncw0KKyAgICBwcm9kdWNlZCBieSBzb21lIGNvbXBpbGVycy4NCisgICogVGhlIFtkZXByZWNhdGVkPXRydWVdIG9wdGlvbiBub3cgY2F1c2VzIHRoZSBDKysgY29kZSBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUNCisgICAgYSBHQ0Mtc3R5bGUgZGVwcmVjYXRpb24gYW5ub3RhdGlvbiAobm8tb3Agb24gb3RoZXIgY29tcGlsZXJzKS4NCisgICogZ29vZ2xlOjpwcm90b2J1Zjo6R2V0RW51bURlc2NyaXB0b3I8U29tZUdlbmVyYXRlZEVudW1UeXBlPigpIHJldHVybnMgdGhlDQorICAgIEVudW1EZXNjcmlwdG9yIGZvciB0aGF0IHR5cGUgLS0gdXNlZnVsIGZvciB0ZW1wbGF0ZXMgd2hpY2ggY2Fubm90IGNhbGwNCisgICAgU29tZUdlbmVyYXRlZEVudW1UeXBlX2Rlc2NyaXB0b3IoKS4NCisgICogVmFyaW91cyBvcHRpbWl6YXRpb25zIGFuZCBvYnNjdXJlIGJ1ZyBmaXhlcy4NCisNCisgIEphdmENCisgICogTGl0ZSBtb2RlOiAgVGhlICJvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUUiIG9wdGlvbiBjYXVzZXMgdGhlIGNvbXBpbGVyDQorICAgIHRvIGdlbmVyYXRlIGNvZGUgd2hpY2ggb25seSBkZXBlbmRzIGxpYnByb3RvYnVmLWxpdGUsIHdoaWNoIGlzIG11Y2ggc21hbGxlcg0KKyAgICB0aGFuIGxpYnByb3RvYnVmIGJ1dCBsYWNrcyBkZXNjcmlwdG9ycywgcmVmbGVjdGlvbiwgYW5kIHNvbWUgb3RoZXIgZmVhdHVyZXMuDQorICAqIExvdHMgb2Ygc3R5bGUgY2xlYW51cHMuDQorDQorICBQeXRob24NCisgICogRml4ZWQgZW5kaWFubmVzcyBidWcgd2l0aCBmbG9hdHMgYW5kIGRvdWJsZXMuDQorICAqIFRleHQgZm9ybWF0IHBhcnNpbmcgc3VwcG9ydC4NCisgICogRml4IGJ1ZyB3aXRoIHBhcnNpbmcgcGFja2VkIHJlcGVhdGVkIGZpZWxkcyBpbiBlbWJlZGRlZCBtZXNzYWdlcy4NCisgICogQWJpbGl0eSB0byBpbml0aWFsaXplIGZpZWxkcyBieSBwYXNzaW5nIGtleXdvcmQgYXJncyB0byBjb25zdHJ1Y3Rvci4NCisgICogU3VwcG9ydCBpdGVyYXRvcnMgaW4gZXh0ZW5kIGFuZCBfX3NldHNsaWNlX18gZm9yIGNvbnRhaW5lcnMuDQorDQorMjAwOS0wNS0xMyB2ZXJzaW9uIDIuMS4wOg0KKw0KKyAgR2VuZXJhbA0KKyAgKiBSZXBlYXRlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGVzICh0eXBlcyBvdGhlciB0aGF0IHN0cmluZywgZ3JvdXAsIGFuZA0KKyAgICBuZXN0ZWQgbWVzc2FnZXMpIG1heSBub3cgdXNlIHRoZSBvcHRpb24gW3BhY2tlZCA9IHRydWVdIHRvIGdldCBhIG1vcmUNCisgICAgZWZmaWNpZW50IGVuY29kaW5nLiAgSW4gdGhlIG5ldyBlbmNvZGluZywgdGhlIGVudGlyZSBsaXN0IGlzIHdyaXR0ZW4NCisgICAgYXMgYSBzaW5nbGUgYnl0ZSBibG9iIHVzaW5nIHRoZSAibGVuZ3RoLWRlbGltaXRlZCIgd2lyZSB0eXBlLiAgV2l0aGluDQorICAgIHRoaXMgYmxvYiwgdGhlIGluZGl2aWR1YWwgdmFsdWVzIGFyZSBlbmNvZGVkIHRoZSBzYW1lIHdheSB0aGV5IHdvdWxkDQorICAgIGJlIG5vcm1hbGx5IGV4Y2VwdCB3aXRob3V0IGEgdGFnIGJlZm9yZSBlYWNoIHZhbHVlICh0aHVzLCB0aGV5IGFyZQ0KKyAgICB0aWdodGx5ICJwYWNrZWQiKS4NCisgICogRm9yIGVhY2ggZmllbGQsIHRoZSBnZW5lcmF0ZWQgY29kZSBjb250YWlucyBhbiBpbnRlZ2VyIGNvbnN0YW50IGFzc2lnbmVkDQorICAgIHRvIHRoZSBmaWVsZCBudW1iZXIuICBGb3IgZXhhbXBsZSwgdGhlIC5wcm90byBmaWxlOg0KKyAgICAgIG1lc3NhZ2UgRm9vIHsgb3B0aW9uYWwgaW50IGJhcl9iYXogPSAxMjM7IH0NCisgICAgd291bGQgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBjb25zdGFudHMsIGFsbCB3aXRoIHRoZSBpbnRlZ2VyIHZhbHVlIDEyMzoNCisgICAgICBDKys6ICAgICBGb286OmtCYXJCYXpGaWVsZE51bWJlcg0KKyAgICAgIEphdmE6ICAgIEZvby5CQVJfQkFaX0ZJRUxEX05VTUJFUg0KKyAgICAgIFB5dGhvbjogIEZvby5CQVJfQkFaX0ZJRUxEX05VTUJFUg0KKyAgICBDb25zdGFudHMgYXJlIGFsc28gZ2VuZXJhdGVkIGZvciBleHRlbnNpb25zLCB3aXRoIHRoZSBzYW1lIG5hbWluZyBzY2hlbWUuDQorICAgIFRoZXNlIGNvbnN0YW50cyBtYXkgYmUgdXNlZCBhcyBzd2l0Y2ggY2FzZXMuDQorICAqIFVwZGF0ZWQgYnVuZGxlZCBHb29nbGUgVGVzdCB0byB2ZXJzaW9uIDEuMy4wLiAgR29vZ2xlIFRlc3QgaXMgbm93IGJ1bmRsZWQNCisgICAgaW4gaXRzIHZlcmJhdGltIGZvcm0gYXMgYSBuZXN0ZWQgYXV0b2NvbmYgcGFja2FnZSwgc28geW91IGNhbiBkcm9wIGluIGFueQ0KKyAgICBvdGhlciB2ZXJzaW9uIG9mIEdvb2dsZSBUZXN0IGlmIG5lZWRlZC4NCisgICogb3B0aW1pemVfZm9yID0gU1BFRUQgaXMgbm93IHRoZSBkZWZhdWx0LCBieSBwb3B1bGFyIGRlbWFuZC4gIFVzZQ0KKyAgICBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkUgaWYgY29kZSBzaXplIGlzIG1vcmUgaW1wb3J0YW50IGluIHlvdXIgYXBwLg0KKyAgKiBJdCBpcyBub3cgYW4gZXJyb3IgdG8gZGVmaW5lIGEgZGVmYXVsdCB2YWx1ZSBmb3IgYSByZXBlYXRlZCBmaWVsZC4NCisgICAgUHJldmlvdXNseSwgdGhpcyB3YXMgc2lsZW50bHkgaWdub3JlZCAoaXQgaGFkIG5vIGVmZmVjdCBvbiB0aGUgZ2VuZXJhdGVkDQorICAgIGNvZGUpLg0KKyAgKiBGaWVsZHMgY2FuIG5vdyBiZSBtYXJrZWQgZGVwcmVjYXRlZCBsaWtlOg0KKyAgICAgIG9wdGlvbmFsIGludDMyIGZvbyA9IDEgW2RlcHJlY2F0ZWQgPSB0cnVlXTsNCisgICAgQ3VycmVudGx5IHRoaXMgZG9lcyBub3QgaGF2ZSBhbnkgYWN0dWFsIGVmZmVjdCwgYnV0IGluIHRoZSBmdXR1cmUgdGhlIGNvZGUNCisgICAgZ2VuZXJhdG9ycyBtYXkgZ2VuZXJhdGUgZGVwcmVjYXRpb24gYW5ub3RhdGlvbnMgaW4gZWFjaCBsYW5ndWFnZS4NCisgICogQ3Jvc3MtY29tcGlsaW5nIHNob3VsZCBub3cgYmUgcG9zc2libGUgdXNpbmcgdGhlIC0td2l0aC1wcm90b2Mgb3B0aW9uIHRvDQorICAgIGNvbmZpZ3VyZS4gIFNlZSBSRUFETUUudHh0IGZvciBtb3JlIGluZm8uDQorDQorICBwcm90b2MNCisgICogLS1lcnJvcl9mb3JtYXQ9bXN2cyBvcHRpb24gY2F1c2VzIGVycm9ycyB0byBiZSBwcmludGVkIGluIFZpc3VhbCBTdHVkaW8NCisgICAgZm9ybWF0LCB3aGljaCBzaG91bGQgYWxsb3cgdGhlbSB0byBiZSBjbGlja2VkIG9uIGluIHRoZSBidWlsZCBsb2cgdG8gZ28NCisgICAgZGlyZWN0bHkgdG8gdGhlIGVycm9yIGxvY2F0aW9uLg0KKyAgKiBUaGUgdHlwZSBuYW1lIHJlc29sdmVyIHdpbGwgbm8gbG9uZ2VyIHJlc29sdmUgdHlwZSBuYW1lcyB0byBmaWVsZHMuICBGb3INCisgICAgZXhhbXBsZSwgdGhpcyBub3cgd29ya3M6DQorICAgICAgbWVzc2FnZSBGb28ge30NCisgICAgICBtZXNzYWdlIEJhciB7DQorICAgICAgICBvcHRpb25hbCBpbnQzMiBGb28gPSAxOw0KKyAgICAgICAgb3B0aW9uYWwgRm9vIGJheiA9IDI7DQorICAgICAgfQ0KKyAgICBQcmV2aW91c2x5LCB0aGUgdHlwZSBvZiAiYmF6IiB3b3VsZCByZXNvbHZlIHRvICJCYXIuRm9vIiwgYW5kIHlvdSdkIGdldA0KKyAgICBhbiBlcnJvciBiZWNhdXNlIEJhci5Gb28gaXMgYSBmaWVsZCwgbm90IGEgdHlwZS4gIE5vdyB0aGUgdHlwZSBvZiAiYmF6Ig0KKyAgICByZXNvbHZlcyB0byB0aGUgbWVzc2FnZSB0eXBlIEZvby4gIFRoaXMgY2hhbmdlIGlzIHVubGlrZWx5IHRvIG1ha2UgYQ0KKyAgICBkaWZmZXJlbmNlIHRvIGFueW9uZSB3aG8gZm9sbG93cyB0aGUgUHJvdG9jb2wgQnVmZmVycyBzdHlsZSBndWlkZS4NCisNCisgIEMrKw0KKyAgKiBTZXZlcmFsIG9wdGltaXphdGlvbnMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG86DQorICAgIC0gU2VyaWFsaXphdGlvbiwgZXNwZWNpYWxseSB0byBmbGF0IGFycmF5cywgaXMgMTAlLTUwJSBmYXN0ZXIsIHBvc3NpYmx5DQorICAgICAgbW9yZSBmb3Igc21hbGwgb2JqZWN0cy4NCisgICAgLSBTZXZlcmFsIGRlc2NyaXB0b3Igb3BlcmF0aW9ucyB3aGljaCBwcmV2aW91c2x5IHJlcXVpcmVkIGxvY2tpbmcgbm8gbG9uZ2VyDQorICAgICAgZG8uDQorICAgIC0gRGVzY3JpcHRvcnMgYXJlIG5vdyBjb25zdHJ1Y3RlZCBsYXppbHkgb24gZmlyc3QgdXNlLCByYXRoZXIgdGhhbiBhdA0KKyAgICAgIHByb2Nlc3Mgc3RhcnR1cCB0aW1lLiAgVGhpcyBzaG91bGQgc2F2ZSBtZW1vcnkgaW4gcHJvZ3JhbXMgd2hpY2ggZG8gbm90DQorICAgICAgdXNlIGRlc2NyaXB0b3JzIG9yIHJlZmxlY3Rpb24uDQorICAgIC0gVW5rbm93bkZpZWxkU2V0IGNvbXBsZXRlbHkgcmVkZXNpZ25lZCB0byBiZSBtb3JlIGVmZmljaWVudCAoZXNwZWNpYWxseSBpbg0KKyAgICAgIHRlcm1zIG9mIG1lbW9yeSB1c2FnZSkuDQorICAgIC0gVmFyaW91cyBvcHRpbWl6YXRpb25zIHRvIHJlZHVjZSBjb2RlIHNpemUgKHRob3VnaCB0aGUgc2VyaWFsaXphdGlvbiBzcGVlZA0KKyAgICAgIG9wdGltaXphdGlvbnMgaW5jcmVhc2VkIGNvZGUgc2l6ZSkuDQorICAqIE1lc3NhZ2UgaW50ZXJmYWNlIGhhcyBtZXRob2QgUGFyc2VGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtKCkgd2hpY2ggcGFyc2VzDQorICAgIGEgbGltaXRlZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBpbnB1dCBzdHJlYW0gcmF0aGVyIHRoYW4gcGFyc2luZyB1bnRpbA0KKyAgICBFT0YuDQorICAqIEd6aXBJbnB1dFN0cmVhbSBhbmQgR3ppcE91dHB1dFN0cmVhbSBzdXBwb3J0IHJlYWRpbmcvd3JpdGluZyBnemlwLSBvcg0KKyAgICB6bGliLWNvbXByZXNzZWQgc3RyZWFtcyBpZiB6bGliIGlzIGF2YWlsYWJsZS4NCisgICAgKGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oKQ0KKyAgKiBEZXNjcmlwdG9yUG9vbDo6RmluZEFsbEV4dGVuc2lvbnMoKSBhbmQgY29ycmVzcG9uZGluZw0KKyAgICBEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRBbGxFeHRlbnNpb25zKCkgY2FuIGJlIHVzZWQgdG8gZW51bWVyYXRlIGFsbA0KKyAgICBleHRlbnNpb25zIG9mIGEgZ2l2ZW4gdHlwZS4NCisgICogRm9yIGVhY2ggZW51bSB0eXBlIEZvbywgcHJvdG9jIHdpbGwgZ2VuZXJhdGUgZnVuY3Rpb25zOg0KKyAgICAgIGNvbnN0IHN0cmluZyYgRm9vX05hbWUoRm9vIHZhbHVlKTsNCisgICAgICBib29sIEZvb19QYXJzZShjb25zdCBzdHJpbmcmIG5hbWUsIEZvbyogcmVzdWx0KTsNCisgICAgVGhlIGZvcm1lciByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbnVtIGNvbnN0YW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuDQorICAgIHZhbHVlIHdoaWxlIHRoZSBsYXR0ZXIgZmluZHMgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYSBuYW1lLg0KKyAgKiBSZXBlYXRlZEZpZWxkIGFuZCBSZXBlYXRlZFB0ckZpZWxkIG5vdyBoYXZlIGJhY2staW5zZXJ0aW9uIGl0ZXJhdG9ycy4NCisgICogU3RyaW5nIGZpZWxkcyBub3cgaGF2ZSBzZXR0ZXJzIHRoYXQgdGFrZSBhIGNoYXIqIGFuZCBhIHNpemUsIGluIGFkZGl0aW9uDQorICAgIHRvIHRoZSBleGlzdGluZyBvbmVzIHRoYXQgdG9vayBjaGFyKiBvciBjb25zdCBzdHJpbmcmLg0KKyAgKiBEZXNjcmlwdG9yUG9vbDo6QWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgbWF5IGJlIHVzZWQgdG8gdGVsbA0KKyAgICBEZXNjcmlwdG9yUG9vbCB0byBjcmVhdGUgcGxhY2Vob2xkZXIgZGVzY3JpcHRvcnMgZm9yIHVua25vd24gZW50aXRpZXMNCisgICAgcmVmZXJlbmNlZCBpbiBhIEZpbGVEZXNjcmlwdG9yUHJvdG8uICBUaGlzIGNhbiBhbGxvdyB5b3UgdG8gcGFyc2UgYSAucHJvdG8NCisgICAgZmlsZSB3aXRob3V0IGhhdmluZyBhY2Nlc3MgdG8gb3RoZXIgLnByb3RvIGZpbGVzIHRoYXQgaXQgaW1wb3J0cywgZm9yDQorICAgIGV4YW1wbGUuDQorICAqIFVwZGF0ZWQgZ3Rlc3QgdG8gbGF0ZXN0IHZlcnNpb24uICBUaGUgZ3Rlc3QgcGFja2FnZSBpcyBub3cgaW5jbHVkZWQgYXMgYQ0KKyAgICBuZXN0ZWQgYXV0b2NvbmYgcGFja2FnZSwgc28gaXQgc2hvdWxkIGJlIGFibGUgdG8gZHJvcCBuZXcgdmVyc2lvbnMgaW50byB0aGUNCisgICAgImd0ZXN0IiBzdWJkaXJlY3Rvcnkgd2l0aG91dCBtb2RpZmljYXRpb24uDQorDQorICBKYXZhDQorICAqIEZpeGVkIGJ1ZyB3aGVyZSBNZXNzYWdlLm1lcmdlRnJvbShNZXNzYWdlKSBmYWlsZWQgdG8gbWVyZ2UgZXh0ZW5zaW9ucy4NCisgICogTWVzc2FnZSBpbnRlcmZhY2UgaGFzIG5ldyBtZXRob2QgdG9CdWlsZGVyKCkgd2hpY2ggaXMgZXF1aXZhbGVudCB0bw0KKyAgICBuZXdCdWlsZGVyRm9yVHlwZSgpLm1lcmdlRnJvbSh0aGlzKS4NCisgICogQWxsIGVudW1zIG5vdyBpbXBsZW1lbnQgdGhlIFByb3RvY29sTWVzc2FnZUVudW0gaW50ZXJmYWNlLg0KKyAgKiBTZXR0aW5nIGEgZmllbGQgdG8gbnVsbCBub3cgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uLg0KKyAgKiBGaXhlZCB0ZW5kZW5jeSBmb3IgVGV4dEZvcm1hdCdzIHBhcnNpbmcgdG8gb3ZlcmZsb3cgdGhlIHN0YWNrIHdoZW4NCisgICAgcGFyc2luZyBsYXJnZSBzdHJpbmcgdmFsdWVzLiAgVGhlIHVuZGVybHlpbmcgcHJvYmxlbSBpcyB3aXRoIEphdmEncw0KKyAgICByZWdleCBpbXBsZW1lbnRhdGlvbiAod2hpY2ggdW5mb3J0dW5hdGVseSB1c2VzIHJlY3Vyc2l2ZSBiYWNrdHJhY2tpbmcNCisgICAgcmF0aGVyIHRoYW4gYnVpbGRpbmcgYW4gTkZBKS4gIFdvcmtlZCBhcm91bmQgYnkgbWFraW5nIHVzZSBvZiBwb3NzZXNzaXZlDQorICAgIHF1YW50aWZpZXJzLg0KKyAgKiBHZW5lcmF0ZWQgc2VydmljZSBjbGFzc2VzIG5vdyBhbHNvIGdlbmVyYXRlIHB1cmUgaW50ZXJmYWNlcy4gIEZvciBhIHNlcnZpY2UNCisgICAgRm9vLCBGb28uSW50ZXJmYWNlIGlzIGEgcHVyZSBpbnRlcmZhY2UgY29udGFpbmluZyBhbGwgb2YgdGhlIHNlcnZpY2Uncw0KKyAgICBkZWZpbmVkIG1ldGhvZHMuICBGb28ubmV3UmVmbGVjdGl2ZVNlcnZpY2UoKSBjYW4gYmUgY2FsbGVkIHRvIHdyYXAgYW4NCisgICAgaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2UgaW4gYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGdlbmVyaWMNCisgICAgUnBjU2VydmljZSBpbnRlcmZhY2UsIHdoaWNoIHByb3ZpZGVzIHJlZmxlY3Rpb24gc3VwcG9ydCB0aGF0IGlzIHVzdWFsbHkNCisgICAgbmVlZGVkIGJ5IFJQQyBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zLg0KKyAgKiBSUEMgaW50ZXJmYWNlcyBub3cgc3VwcG9ydCBibG9ja2luZyBvcGVyYXRpb24gaW4gYWRkaXRpb24gdG8gbm9uLWJsb2NraW5nLg0KKyAgICBUaGUgcHJvdG9jb2wgY29tcGlsZXIgZ2VuZXJhdGVzIHNlcGFyYXRlIGJsb2NraW5nIGFuZCBub24tYmxvY2tpbmcgc3R1YnMNCisgICAgd2hpY2ggb3BlcmF0ZSBhZ2FpbnN0IHNlcGFyYXRlIGJsb2NraW5nIGFuZCBub24tYmxvY2tpbmcgUlBDIGludGVyZmFjZXMuDQorICAgIFJQQyBpbXBsZW1lbnRhdGlvbnMgd2lsbCBoYXZlIHRvIGltcGxlbWVudCB0aGUgbmV3IGludGVyZmFjZXMgaW4gb3JkZXIgdG8NCisgICAgc3VwcG9ydCBibG9ja2luZyBtb2RlLg0KKyAgKiBOZXcgSS9PIG1ldGhvZHMgcGFyc2VEZWxpbWl0ZWRGcm9tKCksIG1lcmdlRGVsaW1pdGVkRnJvbSgpLCBhbmQNCisgICAgd3JpdGVEZWxpbWl0ZWRUbygpIHJlYWQgYW5kIHdyaXRlICJkZWxpbWl0ZWQiIG1lc3NhZ2VzIGZyb20vdG8gYSBzdHJlYW0sDQorICAgIG1lYW5pbmcgdGhhdCB0aGUgbWVzc2FnZSBzaXplIHByZWNlZGVzIHRoZSBkYXRhLiAgVGhpcyB3YXksIHlvdSBjYW4gd3JpdGUNCisgICAgbXVsdGlwbGUgbWVzc2FnZXMgdG8gYSBzdHJlYW0gd2l0aG91dCBoYXZpbmcgdG8gd29ycnkgYWJvdXQgZGVsaW1pdGluZw0KKyAgICB0aGVtIHlvdXJzZWxmLg0KKyAgKiBUaHJvdyBhIG1vcmUgZGVzY3JpcHRpdmUgZXhjZXB0aW9uIHdoZW4gYnVpbGQoKSBpcyBkb3VibGUtY2FsbGVkLg0KKyAgKiBBZGQgYSBtZXRob2QgdG8gcXVlcnkgd2hldGhlciBDb2RlZElucHV0U3RyZWFtIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0DQorICAgIHN0cmVhbS4NCisgICogQWRkIGEgbWV0aG9kIHRvIHJlc2V0IGEgQ29kZWRJbnB1dFN0cmVhbSdzIHNpemUgY291bnRlcjsgdXNlZnVsIHdoZW4NCisgICAgcmVhZGluZyBtYW55IG1lc3NhZ2VzIHdpdGggdGhlIHNhbWUgc3RyZWFtLg0KKyAgKiBlcXVhbHMoKSBhbmQgaGFzaENvZGUoKSBub3cgYWNjb3VudCBmb3IgdW5rbm93biBmaWVsZHMuDQorDQorICBQeXRob24NCisgICogQWRkZWQgc2xpY2luZyBzdXBwb3J0IGZvciByZXBlYXRlZCBzY2FsYXIgZmllbGRzLiBBZGRlZCBzbGljZSByZXRyaWV2YWwgYW5kDQorICAgIHJlbW92YWwgb2YgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcy4NCisgICogVXBkYXRlZCBSUEMgaW50ZXJmYWNlcyB0byBhbGxvdyBmb3IgYmxvY2tpbmcgb3BlcmF0aW9uLiAgQSBjbGllbnQgbWF5DQorICAgIG5vdyBwYXNzIE5vbmUgZm9yIGEgY2FsbGJhY2sgd2hlbiBtYWtpbmcgYW4gUlBDLCBpbiB3aGljaCBjYXNlIHRoZQ0KKyAgICBjYWxsIHdpbGwgYmxvY2sgdW50aWwgdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkLCBhbmQgdGhlIHJlc3BvbnNlDQorICAgIG9iamVjdCB3aWxsIGJlIHJldHVybmVkIGRpcmVjdGx5IHRvIHRoZSBjYWxsZXIuICBUaGlzIGludGVyZmFjZSBjaGFuZ2UNCisgICAgY2Fubm90IGJlIHVzZWQgaW4gcHJhY3RpY2UgdW50aWwgUlBDIGltcGxlbWVudGF0aW9ucyBhcmUgdXBkYXRlZCB0bw0KKyAgICBpbXBsZW1lbnQgaXQuDQorICAqIENoYW5nZXMgdG8gaW5wdXRfc3RyZWFtLnB5IHNob3VsZCBtYWtlIHByb3RvYnVmIGNvbXBhdGlibGUgd2l0aCBhcHBlbmdpbmUuDQorDQorMjAwOC0xMS0yNSB2ZXJzaW9uIDIuMC4zOg0KKw0KKyAgcHJvdG9jDQorICAqIEVudW0gdmFsdWVzIG1heSBub3cgaGF2ZSBjdXN0b20gb3B0aW9ucywgdXNpbmcgc3ludGF4IHNpbWlsYXIgdG8gZmllbGQNCisgICAgb3B0aW9ucy4NCisgICogRml4ZWQgYnVnIHdoZXJlIC5wcm90byBmaWxlcyB3aGljaCB1c2UgY3VzdG9tIG9wdGlvbnMgYnV0IGRvbid0IGFjdHVhbGx5DQorICAgIGRlZmluZSB0aGVtIChpLmUuIHRoZXkgaW1wb3J0IGFub3RoZXIgLnByb3RvIGZpbGUgZGVmaW5pbmcgdGhlIG9wdGlvbnMpDQorICAgIGhhZCB0byBleHBsaWNpdGx5IGltcG9ydCBkZXNjcmlwdG9yLnByb3RvLg0KKyAgKiBBZGphY2VudCBzdHJpbmcgbGl0ZXJhbHMgaW4gLnByb3RvIGZpbGVzIHdpbGwgbm93IGJlIGNvbmNhdGVuYXRlZCwgbGlrZSBpbg0KKyAgICBDLg0KKyAgKiBJZiBhbiBpbnB1dCBmaWxlIGlzIGEgV2luZG93cyBhYnNvbHV0ZSBwYXRoIChlLmcuICJDOlxmb29cYmFyLnByb3RvIikgYW5kDQorICAgIHRoZSBpbXBvcnQgcGF0aCBvbmx5IGNvbnRhaW5zICIuIiAob3IgY29udGFpbnMgIi4iIGJ1dCBkb2VzIG5vdCBjb250YWluDQorICAgIHRoZSBmaWxlKSwgcHJvdG9jIGluY29ycmVjdGx5IHRob3VnaHQgdGhhdCB0aGUgZmlsZSB3YXMgdW5kZXIgIi4iLCBiZWNhdXNlDQorICAgIGl0IHRob3VnaHQgdGhhdCB0aGUgcGF0aCB3YXMgcmVsYXRpdmUgKHNpbmNlIGl0IGRpZG4ndCBzdGFydCB3aXRoIGEgc2xhc2gpLg0KKyAgICBUaGlzIGhhcyBiZWVuIGZpeGVkLg0KKw0KKyAgQysrDQorICAqIEdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMgbm93IGhhdmUgYSBTd2FwKCkgbWV0aG9kIHdoaWNoIGVmZmljaWVudGx5IHN3YXBzDQorICAgIHRoZSBjb250ZW50cyBvZiB0d28gb2JqZWN0cy4NCisgICogQWxsIG1lc3NhZ2UgY2xhc3NlcyBub3cgaGF2ZSBhIFNwYWNlVXNlZCgpIG1ldGhvZCB3aGljaCByZXR1cm5zIGFuIGVzdGltYXRlDQorICAgIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgYWxsb2NhdGVkIG1lbW9yeSBjdXJyZW50bHkgb3duZWQgYnkgdGhlIG9iamVjdC4NCisgICAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4geW91IGFyZSByZXVzaW5nIGEgc2luZ2xlIG1lc3NhZ2Ugb2JqZWN0DQorICAgIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYnV0IHdhbnQgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYmxvYXQgdXAgdG9vIGxhcmdlLg0KKyAgKiBOZXcgbWV0aG9kIE1lc3NhZ2U6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZQ0KKyAgICBzZXJpYWxpemVkIGRhdGEuICBNYXkgYmUgbW9yZSBjb252ZW5pZW50IHRoYW4gY2FsbGluZw0KKyAgICBTZXJpYWxpemVUb1N0cmluZyhzdHJpbmcqKS4NCisgICogSW4gZGVidWcgbW9kZSwgbG9nIGVycm9yIG1lc3NhZ2VzIHdoZW4gc3RyaW5nLXR5cGUgZmllbGRzIGFyZSBmb3VuZCB0bw0KKyAgICBjb250YWluIGJ5dGVzIHRoYXQgYXJlIG5vdCB2YWxpZCBVVEYtOC4NCisgICogRml4ZWQgYnVnIHdoZXJlIGEgbWVzc2FnZSB3aXRoIG11bHRpcGxlIGV4dGVuc2lvbiByYW5nZXMgY291bGRuJ3QgcGFyc2UNCisgICAgZXh0ZW5zaW9ucy4NCisgICogRml4ZWQgYnVnIHdoZXJlIE1lcmdlRnJvbShjb25zdCBNZXNzYWdlJikgZGlkbid0IGRvIGFueXRoaW5nIGlmIGludm9rZWQgb24NCisgICAgYSBtZXNzYWdlIHRoYXQgY29udGFpbmVkIG5vIGZpZWxkcyAoYnV0IHBvc3NpYmx5IGNvbnRhaW5lZCBleHRlbnNpb25zKS4NCisgICogRml4ZWQgU2hvcnREZWJ1Z1N0cmluZygpIHRvIG5vdCBiZSBPKG5eMikuICBEdXJyLg0KKyAgKiBGaXhlZCBjcmFzaCBpbiBUZXh0Rm9ybWF0IHBhcnNpbmcgaWYgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBpbnB1dCBjYXVzZWQgYQ0KKyAgICB0b2tlbml6YXRpb24gZXJyb3IuDQorICAqIEZpeGVkIG9ic2N1cmUgYnVncyBpbiB6ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MuDQorICAqIEFkZGVkIHN1cHBvcnQgZm9yIEhQIEMrKyBvbiBUcnU2NC4NCisgICogT25seSBidWlsZCB0ZXN0cyBvbiAibWFrZSBjaGVjayIsIG5vdCAibWFrZSIuDQorICAqIEZpeGVkIGFsaWdubWVudCBpc3N1ZSB0aGF0IGNhdXNlZCBjcmFzaGVzIHdoZW4gdXNpbmcgRHluYW1pY01lc3NhZ2Ugb24NCisgICAgNjQtYml0IFNwYXJjIG1hY2hpbmVzLg0KKyAgKiBTaW1wbGlmeSB0ZW1wbGF0ZSB1c2FnZSB0byB3b3JrIHdpdGggTVNWQyAyMDAzLg0KKyAgKiBXb3JrIGFyb3VuZCBHQ0MgNC4zLnggeDg2XzY0IGNvbXBpbGVyIGJ1ZyB0aGF0IGNhdXNlZCBjcmFzaGVzIG9uIHN0YXJ0dXAuDQorICAgIChUaGlzIGFmZmVjdGVkIEZlZG9yYSA5IGluIHBhcnRpY3VsYXIuKQ0KKyAgKiBOb3cgd29ya3Mgb24gIlNvbGFyaXMgMTAgdXNpbmcgcmVjZW50IFN1biBTdHVkaW8iLg0KKw0KKyAgSmF2YQ0KKyAgKiBOZXcgb3ZlcmxvYWQgb2YgbWVyZ2VGcm9tKCkgd2hpY2ggcGFyc2VzIGEgc2xpY2Ugb2YgYSBieXRlIGFycmF5IGluc3RlYWQNCisgICAgb2YgdGhlIHdob2xlIHRoaW5nLg0KKyAgKiBOZXcgbWV0aG9kIEJ5dGVTdHJpbmcuYXNSZWFkT25seUJ5dGVCdWZmZXIoKSBkb2VzIHdoYXQgaXQgc291bmRzIGxpa2UuDQorICAqIEltcHJvdmVkIHBlcmZvcm1hbmNlIG9mIGlzSW5pdGlhbGl6ZWQoKSB3aGVuIG9wdGltaXppbmcgZm9yIGNvZGUgc2l6ZS4NCisNCisgIFB5dGhvbg0KKyAgKiBDb3JyZWN0ZWQgTGlzdEZpZWxkcygpIHNpZ25hdHVyZSBpbiBNZXNzYWdlIGJhc2UgY2xhc3MgdG8gbWF0Y2ggd2hhdA0KKyAgICBzdWJjbGFzc2VzIGFjdHVhbGx5IGltcGxlbWVudC4NCisgICogU29tZSBtaW5vciByZWZhY3RvcmluZy4NCisgICogRG9uJ3QgcGFzcyBzZWxmIGFzIGZpcnN0IGFyZ3VtZW50IHRvIHN1cGVyY2xhc3MgY29uc3RydWN0b3IgKG5vIGxvbmdlcg0KKyAgICBhbGxvd2VkIGluIFB5dGhvbiAyLjYpLg0KKw0KKzIwMDgtMDktMjkgdmVyc2lvbiAyLjAuMjoNCisNCisgIEdlbmVyYWwNCisgICogTGljZW5zZSBjaGFuZ2VkIGZyb20gQXBhY2hlIDIuMCB0byAzLUNsYXVzZSBCU0QuDQorICAqIEl0IGlzIG5vdyBwb3NzaWJsZSB0byBkZWZpbmUgY3VzdG9tICJvcHRpb25zIiwgd2hpY2ggYXJlIGJhc2ljYWxseQ0KKyAgICBhbm5vdGF0aW9ucyB3aGljaCBtYXkgYmUgcGxhY2VkIG9uIGRlZmluaXRpb25zIGluIGEgLnByb3RvIGZpbGUuDQorICAgIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgZGVmaW5lIGEgZmllbGQgb3B0aW9uIGNhbGxlZCAiZm9vIiBsaWtlIHNvOg0KKyAgICAgIGltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iDQorICAgICAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgew0KKyAgICAgICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDEyMzQ1Ow0KKyAgICAgIH0NCisgICAgVGhlbiB5b3UgYW5ub3RhdGUgYSBmaWVsZCB1c2luZyB0aGUgImZvbyIgb3B0aW9uOg0KKyAgICAgIG1lc3NhZ2UgTXlNZXNzYWdlIHsNCisgICAgICAgIG9wdGlvbmFsIGludDMyIHNvbWVfZmllbGQgPSAxIFsoZm9vKSA9ICJiYXIiXQ0KKyAgICAgIH0NCisgICAgVGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uIGlzIHRoZW4gdmlzaWJsZSB2aWEgdGhlIG1lc3NhZ2Uncw0KKyAgICBEZXNjcmlwdG9yOg0KKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPQ0KKyAgICAgICAgTXlNZXNzYWdlOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgic29tZV9maWVsZCIpOw0KKyAgICAgIGFzc2VydChmaWVsZC0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihmb28pID09ICJiYXIiKTsNCisgICAgVGhpcyBmZWF0dXJlIGhhcyBiZWVuIGltcGxlbWVudGVkIGFuZCB0ZXN0ZWQgaW4gQysrIGFuZCBKYXZhLg0KKyAgICBPdGhlciBsYW5ndWFnZXMgbWF5IG9yIG1heSBub3QgbmVlZCB0byBkbyBleHRyYSB3b3JrIHRvIHN1cHBvcnQNCisgICAgY3VzdG9tIG9wdGlvbnMsIGRlcGVuZGluZyBvbiBob3cgdGhleSBjb25zdHJ1Y3QgZGVzY3JpcHRvcnMuDQorDQorICBDKysNCisgICogRml4ZWQgc29tZSBHQ0Mgd2FybmluZ3MgdGhhdCBvbmx5IG9jY3VyIHdoZW4gdXNpbmcgLXBlZGFudGljLg0KKyAgKiBJbXByb3ZlZCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gY29kZSwgbWFraW5nIG9yZGVyaW5nIG1vcmUNCisgICAgcHJlZGljdGFibGUgYW1vbmcgb3RoZXIgdGhpbmdzLg0KKyAgKiBUZXh0Rm9ybWF0IHdpbGwgbm8gbG9uZ2VyIGFjY2VwdCBtZXNzYWdlcyB3aGljaCBjb250YWluIG11bHRpcGxlDQorICAgIGluc3RhbmNlcyBvZiBhIHNpbmd1bGFyIGZpZWxkLiAgUHJldmlvdXNseSwgdGhlIGxhdHRlciBpbnN0YW5jZQ0KKyAgICB3b3VsZCBvdmVyd3JpdGUgdGhlIGZvcm1lci4NCisgICogTm93IHdvcmtzIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIGhhc2hfbWFwLg0KKw0KKyAgSmF2YQ0KKyAgKiBQcmludCBAT3ZlcnJpZGUgYW5ub3RhdGlvbiBpbiBnZW5lcmF0ZWQgY29kZSB3aGVyZSBhcHByb3ByaWF0ZS4NCisNCisgIFB5dGhvbg0KKyAgKiBTdHJpbmdzIG5vdyB1c2UgdGhlICJ1bmljb2RlIiB0eXBlIHJhdGhlciB0aGFuIHRoZSAic3RyIiB0eXBlLg0KKyAgICBTdHJpbmcgZmllbGRzIG1heSBzdGlsbCBiZSBhc3NpZ25lZCBBU0NJSSAic3RyIiB2YWx1ZXM7IHRoZXkgd2lsbA0KKyAgICBhdXRvbWF0aWNhbGx5IGJlIGNvbnZlcnRlZC4NCisgICogQWRkaW5nIGEgcHJvcGVydHkgdG8gYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHJlcGVhdGVkIGZpZWxkIG5vdw0KKyAgICByYWlzZXMgYW4gZXhjZXB0aW9uLiAgRm9yIGV4YW1wbGU6DQorICAgICAgIyBObyBsb25nZXIgd29ya3MgKGFuZCBuZXZlciBzaG91bGQgaGF2ZSkuDQorICAgICAgbWVzc2FnZS5zb21lX3JlcGVhdGVkX2ZpZWxkLmZvbyA9IDENCisNCisgIFdpbmRvd3MNCisgICogV2Ugbm93IGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgcmF0aGVyIHRoYW4gRExMcyBieSBkZWZhdWx0IG9uIE1TVkMuDQorICAgIFNlZSB2c3Byb2plY3RzL3JlYWRtZS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uDQorDQorMjAwOC0wOC0xNSB2ZXJzaW9uIDIuMC4xOg0KKw0KKyAgcHJvdG9jDQorICAqIE5ldyBmbGFncyAtLWVuY29kZSBhbmQgLS1kZWNvZGUgY2FuIGJlIHVzZWQgdG8gY29udmVydCBiZXR3ZWVuIHByb3RvYnVmIHRleHQNCisgICAgZm9ybWF0IGFuZCBiaW5hcnkgZm9ybWF0IGZyb20gdGhlIGNvbW1hbmQtbGluZS4NCisgICogTmV3IGZsYWcgLS1kZXNjcmlwdG9yX3NldF9vdXQgY2FuIGJlIHVzZWQgdG8gd3JpdGUgRmlsZURlc2NyaXB0b3JQcm90b3MgZm9yDQorICAgIGFsbCBwYXJzZWQgZmlsZXMgZGlyZWN0bHkgaW50byBhIHNpbmdsZSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgcGFydGljdWxhcmx5DQorICAgIHVzZWZ1bCBpZiB5b3Ugd2lzaCB0byBwYXJzZSAucHJvdG8gZmlsZXMgZnJvbSBwcm9ncmFtcyB3cml0dGVuIGluIGxhbmd1YWdlcw0KKyAgICBvdGhlciB0aGFuIEMrKzoganVzdCBydW4gcHJvdG9jIGFzIGEgYmFja2dyb3VuZCBwcm9jZXNzIGFuZCBoYXZlIGl0IG91dHB1dA0KKyAgICBhIEZpbGVEZXNjcmlwdG9yTGlzdCwgdGhlbiBwYXJzZSB0aGF0IG5hdGl2ZWx5Lg0KKyAgKiBJbXByb3ZlZCBlcnJvciBtZXNzYWdlIHdoZW4gYW4gZW51bSB2YWx1ZSdzIG5hbWUgY29uZmxpY3RzIHdpdGggYW5vdGhlcg0KKyAgICBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgZW51bSB0eXBlJ3Mgc2NvcGUsIGUuZy4gaWYgdHdvIGVudW0gdHlwZXMgZGVjbGFyZWQNCisgICAgaW4gdGhlIHNhbWUgc2NvcGUgaGF2ZSB2YWx1ZXMgd2l0aCB0aGUgc2FtZSBuYW1lLiAgVGhpcyBpcyBkaXNhbGxvd2VkIGZvcg0KKyAgICBjb21wYXRpYmlsaXR5IHdpdGggQysrLCBidXQgdGhpcyB3YXNuJ3QgY2xlYXIgZnJvbSB0aGUgZXJyb3IuDQorICAqIEZpeGVkIGFic29sdXRlIG91dHB1dCBwYXRocyBvbiBXaW5kb3dzLg0KKyAgKiBBbGxvdyB0cmFpbGluZyBzbGFzaGVzIGluIC0tcHJvdG9fcGF0aCBtYXBwaW5ncy4NCisNCisgIEMrKw0KKyAgKiBSZWZsZWN0aW9uIG9iamVjdHMgYXJlIG5vdyBwZXItY2xhc3MgcmF0aGVyIHRoYW4gcGVyLWluc3RhbmNlLiAgVG8gbWFrZSB0aGlzDQorICAgIHBvc3NpYmxlLCB0aGUgUmVmbGVjdGlvbiBpbnRlcmZhY2UgaGFkIHRvIGJlIGNoYW5nZWQgc3VjaCB0aGF0IGFsbCBtZXRob2RzDQorICAgIHRha2UgdGhlIE1lc3NhZ2UgaW5zdGFuY2UgYXMgYSBwYXJhbWV0ZXIuICBUaGlzIGNoYW5nZSBpbXByb3ZlcyBwZXJmb3JtYW5jZQ0KKyAgICBzaWduaWZpY2FudGx5IGluIG1lbW9yeS1iYW5kd2lkdGgtbGltaXRlZCB1c2UgY2FzZXMsIHNpbmNlIGl0IG1ha2VzIHRoZQ0KKyAgICBtZXNzYWdlIG9iamVjdHMgc21hbGxlci4gIE5vdGUgdGhhdCBzb3VyY2UtaW5jb21wYXRpYmxlIGludGVyZmFjZSBjaGFuZ2VzDQorICAgIGxpa2UgdGhpcyB3aWxsIG5vdCBiZSBtYWRlIGFnYWluIGFmdGVyIHRoZSBsaWJyYXJ5IGxlYXZlcyBiZXRhLg0KKyAgKiBIZXVyaXN0aWNhbGx5IGRldGVjdCBzdWItbWVzc2FnZXMgd2hlbiBwcmludGluZyB1bmtub3duIGZpZWxkcy4NCisgICogRml4IHN0YXRpYyBpbml0aWFsaXphdGlvbiBvcmRlcmluZyBidWcgdGhhdCBjYXVzZWQgY3Jhc2hlcyBhdCBzdGFydHVwIHdoZW4NCisgICAgY29tcGlsaW5nIG9uIE1hYyB3aXRoIHN0YXRpYyBsaW5raW5nLg0KKyAgKiBGaXhlZCBUb2tlbml6ZXJUZXN0IHdoZW4gY29tcGlsaW5nIHdpdGggLUROREVCVUcgb24gTGludXguDQorICAqIEZpeGVkIGluY29ycmVjdCBkZWZpbml0aW9uIG9mIGtpbnQzMm1pbi4NCisgICogRml4IGJ5dGVzIHR5cGUgc2V0dGVyIHRvIHdvcmsgd2l0aCBieXRlIHNlcXVlbmNlcyB3aXRoIGVtYmVkZGVkIE5VTExzLg0KKyAgKiBPdGhlciBpcnJlbGV2YW50IHR3ZWFrcy4NCisNCisgIEphdmENCisgICogRml4ZWQgVW5rbm93bkZpZWxkU2V0J3MgcGFyc2luZyBvZiB2YXJpbnRzIGxhcmdlciB0aGFuIDMyIGJpdHMuDQorICAqIEZpeGVkIFRleHRGb3JtYXQncyBwYXJzaW5nIG9mICJpbmYiIGFuZCAibmFuIi4NCisgICogRml4ZWQgVGV4dEZvcm1hdCdzIHBhcnNpbmcgb2YgY29tbWVudHMuDQorICAqIEFkZGVkIGluZm8gdG8gSmF2YSBQT00gdGhhdCB3aWxsIGJlIHJlcXVpcmVkIHdoZW4gd2UgdXBsb2FkIHRoZQ0KKyAgICBwYWNrYWdlIHRvIGEgTWF2ZW4gcmVwby4NCisNCisgIFB5dGhvbg0KKyAgKiBNZXJnZUZyb20obWVzc2FnZSkgYW5kIENvcHlGcm9tKG1lc3NhZ2UpIGFyZSBub3cgaW1wbGVtZW50ZWQuDQorICAqIFNlcmlhbGl6ZVRvU3RyaW5nKCkgcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkDQorICAgIGZpZWxkcy4NCisgICogQ29kZSBvcmdhbml6YXRpb24gaW1wcm92ZW1lbnRzLg0KKyAgKiBGaXhlZCBkb2MgY29tbWVudHMgZm9yIFJwY0NvbnRyb2xsZXIgYW5kIFJwY0NoYW5uZWwsIHdoaWNoIGhhZCBzb21laG93IGJlZW4NCisgICAgc3dhcHBlZC4NCisgICogRml4ZWQgdGV4dF9mb3JtYXRfdGVzdCBvbiBXaW5kb3dzIHdoZXJlIGZsb2F0aW5nLXBvaW50IGV4cG9uZW50cyBzb21ldGltZXMNCisgICAgY29udGFpbiBleHRyYSB6ZXJvcy4NCisgICogRml4IFB5dGhvbiBzZXJ2aWNlIENhbGxNZXRob2QoKSBpbXBsZW1lbnRhdGlvbi4NCisNCisgIE90aGVyDQorICAqIEltcHJvdmVkIHJlYWRtZXMuDQorICAqIFZJTSBzeW50YXggaGlnaGxpZ2h0aW5nIGltcHJvdmVtZW50cy4NCisNCisyMDA4LTA3LTA3IHZlcnNpb24gMi4wLjA6DQorDQorICAqIEZpcnN0IHB1YmxpYyByZWxlYXNlLg0KZGlmZiAtLWdpdCBhL0xJQ0VOU0UgYi9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjMwNWIKLS0tIC9kZXYvbnVsbAorKysgYi9MSUNFTlNFCkBAIC0wLDAgKzEsMzIgQEAKK0NvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKK21ldDoKKworICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKK2NvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKK2luIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKK2Rpc3RyaWJ1dGlvbi4KKyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKK2NvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCit0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCitBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCitPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitDb2RlIGdlbmVyYXRlZCBieSB0aGUgUHJvdG9jb2wgQnVmZmVyIGNvbXBpbGVyIGlzIG93bmVkIGJ5IHRoZSBvd25lcgorb2YgdGhlIGlucHV0IGZpbGUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgaXQuICBUaGlzIGNvZGUgaXMgbm90CitzdGFuZGFsb25lIGFuZCByZXF1aXJlcyBhIHN1cHBvcnQgbGlicmFyeSB0byBiZSBsaW5rZWQgd2l0aCBpdC4gIFRoaXMKK3N1cHBvcnQgbGlicmFyeSBpcyBpdHNlbGYgY292ZXJlZCBieSB0aGUgYWJvdmUgbGljZW5zZS4KZGlmZiAtLWdpdCBhL01FVEFEQVRBIGIvTUVUQURBVEEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyMmJhZgotLS0gL2Rldi9udWxsCisrKyBiL01FVEFEQVRBCkBAIC0wLDAgKzEsMTIgQEAKK25hbWU6ICJwcm90b2J1ZiIKK2Rlc2NyaXB0aW9uOgorICAgICJQcmVidWlsdHMgcHJvdG9jIGJpbmFyeSBhbmQgcHJvdG9idWYgcHl0aG9uIGxpYnJhcnkuIgorCit0aGlyZF9wYXJ0eSB7CisgIHVybCB7CisgICAgdHlwZTogR0lUCisgICAgdmFsdWU6ICJodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL3JlbGVhc2VzL2Rvd25sb2FkL3YyMS45LyIKKyAgfQorICB2ZXJzaW9uOiAiMjEuOSIKKyAgbGFzdF91cGdyYWRlX2RhdGUgeyB5ZWFyOiAyMDIyIG1vbnRoOiAxMCB9Cit9CmRpZmYgLS1naXQgYS9iaW4vcHJvdG9jIGIvYmluL3Byb3RvYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMWNmYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvYmluL3Byb3RvYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2dvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8gYi9pbmNsdWRlL2dvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjMjA0MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90bwpAQCAtMCwwICsxLDE1OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1ZjsKKworb3B0aW9uIGNzaGFycF9uYW1lc3BhY2UgPSAiR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzIjsKK29wdGlvbiBnb19wYWNrYWdlID0gImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2FueXBiIjsKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiQW55UHJvdG8iOworb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOworb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gIkdQQiI7CisKKy8vIGBBbnlgIGNvbnRhaW5zIGFuIGFyYml0cmFyeSBzZXJpYWxpemVkIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlIGFsb25nIHdpdGggYQorLy8gVVJMIHRoYXQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIHRoZSBzZXJpYWxpemVkIG1lc3NhZ2UuCisvLworLy8gUHJvdG9idWYgbGlicmFyeSBwcm92aWRlcyBzdXBwb3J0IHRvIHBhY2svdW5wYWNrIEFueSB2YWx1ZXMgaW4gdGhlIGZvcm0KKy8vIG9mIHV0aWxpdHkgZnVuY3Rpb25zIG9yIGFkZGl0aW9uYWwgZ2VuZXJhdGVkIG1ldGhvZHMgb2YgdGhlIEFueSB0eXBlLgorLy8KKy8vIEV4YW1wbGUgMTogUGFjayBhbmQgdW5wYWNrIGEgbWVzc2FnZSBpbiBDKysuCisvLworLy8gICAgIEZvbyBmb28gPSAuLi47CisvLyAgICAgQW55IGFueTsKKy8vICAgICBhbnkuUGFja0Zyb20oZm9vKTsKKy8vICAgICAuLi4KKy8vICAgICBpZiAoYW55LlVucGFja1RvKCZmb28pKSB7CisvLyAgICAgICAuLi4KKy8vICAgICB9CisvLworLy8gRXhhbXBsZSAyOiBQYWNrIGFuZCB1bnBhY2sgYSBtZXNzYWdlIGluIEphdmEuCisvLworLy8gICAgIEZvbyBmb28gPSAuLi47CisvLyAgICAgQW55IGFueSA9IEFueS5wYWNrKGZvbyk7CisvLyAgICAgLi4uCisvLyAgICAgaWYgKGFueS5pcyhGb28uY2xhc3MpKSB7CisvLyAgICAgICBmb28gPSBhbnkudW5wYWNrKEZvby5jbGFzcyk7CisvLyAgICAgfQorLy8KKy8vIEV4YW1wbGUgMzogUGFjayBhbmQgdW5wYWNrIGEgbWVzc2FnZSBpbiBQeXRob24uCisvLworLy8gICAgIGZvbyA9IEZvbyguLi4pCisvLyAgICAgYW55ID0gQW55KCkKKy8vICAgICBhbnkuUGFjayhmb28pCisvLyAgICAgLi4uCisvLyAgICAgaWYgYW55LklzKEZvby5ERVNDUklQVE9SKToKKy8vICAgICAgIGFueS5VbnBhY2soZm9vKQorLy8gICAgICAgLi4uCisvLworLy8gRXhhbXBsZSA0OiBQYWNrIGFuZCB1bnBhY2sgYSBtZXNzYWdlIGluIEdvCisvLworLy8gICAgICBmb28gOj0gJnBiLkZvb3suLi59CisvLyAgICAgIGFueSwgZXJyIDo9IGFueXBiLk5ldyhmb28pCisvLyAgICAgIGlmIGVyciAhPSBuaWwgeworLy8gICAgICAgIC4uLgorLy8gICAgICB9CisvLyAgICAgIC4uLgorLy8gICAgICBmb28gOj0gJnBiLkZvb3t9CisvLyAgICAgIGlmIGVyciA6PSBhbnkuVW5tYXJzaGFsVG8oZm9vKTsgZXJyICE9IG5pbCB7CisvLyAgICAgICAgLi4uCisvLyAgICAgIH0KKy8vCisvLyBUaGUgcGFjayBtZXRob2RzIHByb3ZpZGVkIGJ5IHByb3RvYnVmIGxpYnJhcnkgd2lsbCBieSBkZWZhdWx0IHVzZQorLy8gJ3R5cGUuZ29vZ2xlYXBpcy5jb20vZnVsbC50eXBlLm5hbWUnIGFzIHRoZSB0eXBlIFVSTCBhbmQgdGhlIHVucGFjaworLy8gbWV0aG9kcyBvbmx5IHVzZSB0aGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZSBhZnRlciB0aGUgbGFzdCAnLycKKy8vIGluIHRoZSB0eXBlIFVSTCwgZm9yIGV4YW1wbGUgImZvby5iYXIuY29tL3gveS56IiB3aWxsIHlpZWxkIHR5cGUKKy8vIG5hbWUgInkueiIuCisvLworLy8KKy8vIEpTT04KKy8vCisvLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhbiBgQW55YCB2YWx1ZSB1c2VzIHRoZSByZWd1bGFyCisvLyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVzZXJpYWxpemVkLCBlbWJlZGRlZCBtZXNzYWdlLCB3aXRoIGFuCisvLyBhZGRpdGlvbmFsIGZpZWxkIGBAdHlwZWAgd2hpY2ggY29udGFpbnMgdGhlIHR5cGUgVVJMLiBFeGFtcGxlOgorLy8KKy8vICAgICBwYWNrYWdlIGdvb2dsZS5wcm9maWxlOworLy8gICAgIG1lc3NhZ2UgUGVyc29uIHsKKy8vICAgICAgIHN0cmluZyBmaXJzdF9uYW1lID0gMTsKKy8vICAgICAgIHN0cmluZyBsYXN0X25hbWUgPSAyOworLy8gICAgIH0KKy8vCisvLyAgICAgeworLy8gICAgICAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb2ZpbGUuUGVyc29uIiwKKy8vICAgICAgICJmaXJzdE5hbWUiOiA8c3RyaW5nPiwKKy8vICAgICAgICJsYXN0TmFtZSI6IDxzdHJpbmc+CisvLyAgICAgfQorLy8KKy8vIElmIHRoZSBlbWJlZGRlZCBtZXNzYWdlIHR5cGUgaXMgd2VsbC1rbm93biBhbmQgaGFzIGEgY3VzdG9tIEpTT04KKy8vIHJlcHJlc2VudGF0aW9uLCB0aGF0IHJlcHJlc2VudGF0aW9uIHdpbGwgYmUgZW1iZWRkZWQgYWRkaW5nIGEgZmllbGQKKy8vIGB2YWx1ZWAgd2hpY2ggaG9sZHMgdGhlIGN1c3RvbSBKU09OIGluIGFkZGl0aW9uIHRvIHRoZSBgQHR5cGVgCisvLyBmaWVsZC4gRXhhbXBsZSAoZm9yIG1lc3NhZ2UgW2dvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbl1bXSk6CisvLworLy8gICAgIHsKKy8vICAgICAgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiIsCisvLyAgICAgICAidmFsdWUiOiAiMS4yMTJzIgorLy8gICAgIH0KKy8vCittZXNzYWdlIEFueSB7CisgIC8vIEEgVVJML3Jlc291cmNlIG5hbWUgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIHRoZSBzZXJpYWxpemVkCisgIC8vIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlLiBUaGlzIHN0cmluZyBtdXN0IGNvbnRhaW4gYXQgbGVhc3QKKyAgLy8gb25lICIvIiBjaGFyYWN0ZXIuIFRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIFVSTCdzIHBhdGggbXVzdCByZXByZXNlbnQKKyAgLy8gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlIChhcyBpbgorICAvLyBgcGF0aC9nb29nbGUucHJvdG9idWYuRHVyYXRpb25gKS4gVGhlIG5hbWUgc2hvdWxkIGJlIGluIGEgY2Fub25pY2FsIGZvcm0KKyAgLy8gKGUuZy4sIGxlYWRpbmcgIi4iIGlzIG5vdCBhY2NlcHRlZCkuCisgIC8vCisgIC8vIEluIHByYWN0aWNlLCB0ZWFtcyB1c3VhbGx5IHByZWNvbXBpbGUgaW50byB0aGUgYmluYXJ5IGFsbCB0eXBlcyB0aGF0IHRoZXkKKyAgLy8gZXhwZWN0IGl0IHRvIHVzZSBpbiB0aGUgY29udGV4dCBvZiBBbnkuIEhvd2V2ZXIsIGZvciBVUkxzIHdoaWNoIHVzZSB0aGUKKyAgLy8gc2NoZW1lIGBodHRwYCwgYGh0dHBzYCwgb3Igbm8gc2NoZW1lLCBvbmUgY2FuIG9wdGlvbmFsbHkgc2V0IHVwIGEgdHlwZQorICAvLyBzZXJ2ZXIgdGhhdCBtYXBzIHR5cGUgVVJMcyB0byBtZXNzYWdlIGRlZmluaXRpb25zIGFzIGZvbGxvd3M6CisgIC8vCisgIC8vICogSWYgbm8gc2NoZW1lIGlzIHByb3ZpZGVkLCBgaHR0cHNgIGlzIGFzc3VtZWQuCisgIC8vICogQW4gSFRUUCBHRVQgb24gdGhlIFVSTCBtdXN0IHlpZWxkIGEgW2dvb2dsZS5wcm90b2J1Zi5UeXBlXVtdCisgIC8vICAgdmFsdWUgaW4gYmluYXJ5IGZvcm1hdCwgb3IgcHJvZHVjZSBhbiBlcnJvci4KKyAgLy8gKiBBcHBsaWNhdGlvbnMgYXJlIGFsbG93ZWQgdG8gY2FjaGUgbG9va3VwIHJlc3VsdHMgYmFzZWQgb24gdGhlCisgIC8vICAgVVJMLCBvciBoYXZlIHRoZW0gcHJlY29tcGlsZWQgaW50byBhIGJpbmFyeSB0byBhdm9pZCBhbnkKKyAgLy8gICBsb29rdXAuIFRoZXJlZm9yZSwgYmluYXJ5IGNvbXBhdGliaWxpdHkgbmVlZHMgdG8gYmUgcHJlc2VydmVkCisgIC8vICAgb24gY2hhbmdlcyB0byB0eXBlcy4gKFVzZSB2ZXJzaW9uZWQgdHlwZSBuYW1lcyB0byBtYW5hZ2UKKyAgLy8gICBicmVha2luZyBjaGFuZ2VzLikKKyAgLy8KKyAgLy8gTm90ZTogdGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIGluIHRoZSBvZmZpY2lhbAorICAvLyBwcm90b2J1ZiByZWxlYXNlLCBhbmQgaXQgaXMgbm90IHVzZWQgZm9yIHR5cGUgVVJMcyBiZWdpbm5pbmcgd2l0aAorICAvLyB0eXBlLmdvb2dsZWFwaXMuY29tLgorICAvLworICAvLyBTY2hlbWVzIG90aGVyIHRoYW4gYGh0dHBgLCBgaHR0cHNgIChvciB0aGUgZW1wdHkgc2NoZW1lKSBtaWdodCBiZQorICAvLyB1c2VkIHdpdGggaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgc2VtYW50aWNzLgorICAvLworICBzdHJpbmcgdHlwZV91cmwgPSAxOworCisgIC8vIE11c3QgYmUgYSB2YWxpZCBzZXJpYWxpemVkIHByb3RvY29sIGJ1ZmZlciBvZiB0aGUgYWJvdmUgc3BlY2lmaWVkIHR5cGUuCisgIGJ5dGVzIHZhbHVlID0gMjsKK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90byBiL2luY2x1ZGUvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDU5OGZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9nb29nbGUvcHJvdG9idWYvYXBpLnByb3RvCkBAIC0wLDAgKzEsMjA4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90byI7CitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi90eXBlLnByb3RvIjsKKworb3B0aW9uIGNzaGFycF9uYW1lc3BhY2UgPSAiR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzIjsKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiQXBpUHJvdG8iOworb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOworb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gIkdQQiI7CitvcHRpb24gZ29fcGFja2FnZSA9ICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9hcGlwYiI7CisKKy8vIEFwaSBpcyBhIGxpZ2h0LXdlaWdodCBkZXNjcmlwdG9yIGZvciBhbiBBUEkgSW50ZXJmYWNlLgorLy8KKy8vIEludGVyZmFjZXMgYXJlIGFsc28gZGVzY3JpYmVkIGFzICJwcm90b2NvbCBidWZmZXIgc2VydmljZXMiIGluIHNvbWUgY29udGV4dHMsCisvLyBzdWNoIGFzIGJ5IHRoZSAic2VydmljZSIga2V5d29yZCBpbiBhIC5wcm90byBmaWxlLCBidXQgdGhleSBhcmUgZGlmZmVyZW50CisvLyBmcm9tIEFQSSBTZXJ2aWNlcywgd2hpY2ggcmVwcmVzZW50IGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgYW4gaW50ZXJmYWNlCisvLyBhcyBvcHBvc2VkIHRvIHNpbXBseSBhIGRlc2NyaXB0aW9uIG9mIG1ldGhvZHMgYW5kIGJpbmRpbmdzLiBUaGV5IGFyZSBhbHNvCisvLyBzb21ldGltZXMgc2ltcGx5IHJlZmVycmVkIHRvIGFzICJBUElzIiBpbiBvdGhlciBjb250ZXh0cywgc3VjaCBhcyB0aGUgbmFtZSBvZgorLy8gdGhpcyBtZXNzYWdlIGl0c2VsZi4gU2VlIGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9hcGlzL2Rlc2lnbi9nbG9zc2FyeSBmb3IKKy8vIGRldGFpbGVkIHRlcm1pbm9sb2d5LgorbWVzc2FnZSBBcGkgeworICAvLyBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyBpbnRlcmZhY2UsIGluY2x1ZGluZyBwYWNrYWdlIG5hbWUKKyAgLy8gZm9sbG93ZWQgYnkgdGhlIGludGVyZmFjZSdzIHNpbXBsZSBuYW1lLgorICBzdHJpbmcgbmFtZSA9IDE7CisKKyAgLy8gVGhlIG1ldGhvZHMgb2YgdGhpcyBpbnRlcmZhY2UsIGluIHVuc3BlY2lmaWVkIG9yZGVyLgorICByZXBlYXRlZCBNZXRob2QgbWV0aG9kcyA9IDI7CisKKyAgLy8gQW55IG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoZSBpbnRlcmZhY2UuCisgIHJlcGVhdGVkIE9wdGlvbiBvcHRpb25zID0gMzsKKworICAvLyBBIHZlcnNpb24gc3RyaW5nIGZvciB0aGlzIGludGVyZmFjZS4gSWYgc3BlY2lmaWVkLCBtdXN0IGhhdmUgdGhlIGZvcm0KKyAgLy8gYG1ham9yLXZlcnNpb24ubWlub3ItdmVyc2lvbmAsIGFzIGluIGAxLjEwYC4gSWYgdGhlIG1pbm9yIHZlcnNpb24gaXMKKyAgLy8gb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gemVyby4gSWYgdGhlIGVudGlyZSB2ZXJzaW9uIGZpZWxkIGlzIGVtcHR5LCB0aGUKKyAgLy8gbWFqb3IgdmVyc2lvbiBpcyBkZXJpdmVkIGZyb20gdGhlIHBhY2thZ2UgbmFtZSwgYXMgb3V0bGluZWQgYmVsb3cuIElmIHRoZQorICAvLyBmaWVsZCBpcyBub3QgZW1wdHksIHRoZSB2ZXJzaW9uIGluIHRoZSBwYWNrYWdlIG5hbWUgd2lsbCBiZSB2ZXJpZmllZCB0byBiZQorICAvLyBjb25zaXN0ZW50IHdpdGggd2hhdCBpcyBwcm92aWRlZCBoZXJlLgorICAvLworICAvLyBUaGUgdmVyc2lvbmluZyBzY2hlbWEgdXNlcyBbc2VtYW50aWMKKyAgLy8gdmVyc2lvbmluZ10oaHR0cDovL3NlbXZlci5vcmcpIHdoZXJlIHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlcgorICAvLyBpbmRpY2F0ZXMgYSBicmVha2luZyBjaGFuZ2UgYW5kIHRoZSBtaW5vciB2ZXJzaW9uIGFuIGFkZGl0aXZlLAorICAvLyBub24tYnJlYWtpbmcgY2hhbmdlLiBCb3RoIHZlcnNpb24gbnVtYmVycyBhcmUgc2lnbmFscyB0byB1c2VycworICAvLyB3aGF0IHRvIGV4cGVjdCBmcm9tIGRpZmZlcmVudCB2ZXJzaW9ucywgYW5kIHNob3VsZCBiZSBjYXJlZnVsbHkKKyAgLy8gY2hvc2VuIGJhc2VkIG9uIHRoZSBwcm9kdWN0IHBsYW4uCisgIC8vCisgIC8vIFRoZSBtYWpvciB2ZXJzaW9uIGlzIGFsc28gcmVmbGVjdGVkIGluIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlCisgIC8vIGludGVyZmFjZSwgd2hpY2ggbXVzdCBlbmQgaW4gYHY8bWFqb3ItdmVyc2lvbj5gLCBhcyBpbgorICAvLyBgZ29vZ2xlLmZlYXR1cmUudjFgLiBGb3IgbWFqb3IgdmVyc2lvbnMgMCBhbmQgMSwgdGhlIHN1ZmZpeCBjYW4KKyAgLy8gYmUgb21pdHRlZC4gWmVybyBtYWpvciB2ZXJzaW9ucyBtdXN0IG9ubHkgYmUgdXNlZCBmb3IKKyAgLy8gZXhwZXJpbWVudGFsLCBub24tR0EgaW50ZXJmYWNlcy4KKyAgLy8KKyAgLy8KKyAgc3RyaW5nIHZlcnNpb24gPSA0OworCisgIC8vIFNvdXJjZSBjb250ZXh0IGZvciB0aGUgcHJvdG9jb2wgYnVmZmVyIHNlcnZpY2UgcmVwcmVzZW50ZWQgYnkgdGhpcworICAvLyBtZXNzYWdlLgorICBTb3VyY2VDb250ZXh0IHNvdXJjZV9jb250ZXh0ID0gNTsKKworICAvLyBJbmNsdWRlZCBpbnRlcmZhY2VzLiBTZWUgW01peGluXVtdLgorICByZXBlYXRlZCBNaXhpbiBtaXhpbnMgPSA2OworCisgIC8vIFRoZSBzb3VyY2Ugc3ludGF4IG9mIHRoZSBzZXJ2aWNlLgorICBTeW50YXggc3ludGF4ID0gNzsKK30KKworLy8gTWV0aG9kIHJlcHJlc2VudHMgYSBtZXRob2Qgb2YgYW4gQVBJIGludGVyZmFjZS4KK21lc3NhZ2UgTWV0aG9kIHsKKyAgLy8gVGhlIHNpbXBsZSBuYW1lIG9mIHRoaXMgbWV0aG9kLgorICBzdHJpbmcgbmFtZSA9IDE7CisKKyAgLy8gQSBVUkwgb2YgdGhlIGlucHV0IG1lc3NhZ2UgdHlwZS4KKyAgc3RyaW5nIHJlcXVlc3RfdHlwZV91cmwgPSAyOworCisgIC8vIElmIHRydWUsIHRoZSByZXF1ZXN0IGlzIHN0cmVhbWVkLgorICBib29sIHJlcXVlc3Rfc3RyZWFtaW5nID0gMzsKKworICAvLyBUaGUgVVJMIG9mIHRoZSBvdXRwdXQgbWVzc2FnZSB0eXBlLgorICBzdHJpbmcgcmVzcG9uc2VfdHlwZV91cmwgPSA0OworCisgIC8vIElmIHRydWUsIHRoZSByZXNwb25zZSBpcyBzdHJlYW1lZC4KKyAgYm9vbCByZXNwb25zZV9zdHJlYW1pbmcgPSA1OworCisgIC8vIEFueSBtZXRhZGF0YSBhdHRhY2hlZCB0byB0aGUgbWV0aG9kLgorICByZXBlYXRlZCBPcHRpb24gb3B0aW9ucyA9IDY7CisKKyAgLy8gVGhlIHNvdXJjZSBzeW50YXggb2YgdGhpcyBtZXRob2QuCisgIFN5bnRheCBzeW50YXggPSA3OworfQorCisvLyBEZWNsYXJlcyBhbiBBUEkgSW50ZXJmYWNlIHRvIGJlIGluY2x1ZGVkIGluIHRoaXMgaW50ZXJmYWNlLiBUaGUgaW5jbHVkaW5nCisvLyBpbnRlcmZhY2UgbXVzdCByZWRlY2xhcmUgYWxsIHRoZSBtZXRob2RzIGZyb20gdGhlIGluY2x1ZGVkIGludGVyZmFjZSwgYnV0CisvLyBkb2N1bWVudGF0aW9uIGFuZCBvcHRpb25zIGFyZSBpbmhlcml0ZWQgYXMgZm9sbG93czoKKy8vCisvLyAtIElmIGFmdGVyIGNvbW1lbnQgYW5kIHdoaXRlc3BhY2Ugc3RyaXBwaW5nLCB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICBzdHJpbmcgb2YgdGhlIHJlZGVjbGFyZWQgbWV0aG9kIGlzIGVtcHR5LCBpdCB3aWxsIGJlIGluaGVyaXRlZAorLy8gICBmcm9tIHRoZSBvcmlnaW5hbCBtZXRob2QuCisvLworLy8gLSBFYWNoIGFubm90YXRpb24gYmVsb25naW5nIHRvIHRoZSBzZXJ2aWNlIGNvbmZpZyAoaHR0cCwKKy8vICAgdmlzaWJpbGl0eSkgd2hpY2ggaXMgbm90IHNldCBpbiB0aGUgcmVkZWNsYXJlZCBtZXRob2Qgd2lsbCBiZQorLy8gICBpbmhlcml0ZWQuCisvLworLy8gLSBJZiBhbiBodHRwIGFubm90YXRpb24gaXMgaW5oZXJpdGVkLCB0aGUgcGF0aCBwYXR0ZXJuIHdpbGwgYmUKKy8vICAgbW9kaWZpZWQgYXMgZm9sbG93cy4gQW55IHZlcnNpb24gcHJlZml4IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlCisvLyAgIHZlcnNpb24gb2YgdGhlIGluY2x1ZGluZyBpbnRlcmZhY2UgcGx1cyB0aGUgW3Jvb3RdW10gcGF0aCBpZgorLy8gICBzcGVjaWZpZWQuCisvLworLy8gRXhhbXBsZSBvZiBhIHNpbXBsZSBtaXhpbjoKKy8vCisvLyAgICAgcGFja2FnZSBnb29nbGUuYWNsLnYxOworLy8gICAgIHNlcnZpY2UgQWNjZXNzQ29udHJvbCB7CisvLyAgICAgICAvLyBHZXQgdGhlIHVuZGVybHlpbmcgQUNMIG9iamVjdC4KKy8vICAgICAgIHJwYyBHZXRBY2woR2V0QWNsUmVxdWVzdCkgcmV0dXJucyAoQWNsKSB7CisvLyAgICAgICAgIG9wdGlvbiAoZ29vZ2xlLmFwaS5odHRwKS5nZXQgPSAiL3YxL3tyZXNvdXJjZT0qKn06Z2V0QWNsIjsKKy8vICAgICAgIH0KKy8vICAgICB9CisvLworLy8gICAgIHBhY2thZ2UgZ29vZ2xlLnN0b3JhZ2UudjI7CisvLyAgICAgc2VydmljZSBTdG9yYWdlIHsKKy8vICAgICAgIHJwYyBHZXRBY2woR2V0QWNsUmVxdWVzdCkgcmV0dXJucyAoQWNsKTsKKy8vCisvLyAgICAgICAvLyBHZXQgYSBkYXRhIHJlY29yZC4KKy8vICAgICAgIHJwYyBHZXREYXRhKEdldERhdGFSZXF1ZXN0KSByZXR1cm5zIChEYXRhKSB7CisvLyAgICAgICAgIG9wdGlvbiAoZ29vZ2xlLmFwaS5odHRwKS5nZXQgPSAiL3YyL3tyZXNvdXJjZT0qKn0iOworLy8gICAgICAgfQorLy8gICAgIH0KKy8vCisvLyBFeGFtcGxlIG9mIGEgbWl4aW4gY29uZmlndXJhdGlvbjoKKy8vCisvLyAgICAgYXBpczoKKy8vICAgICAtIG5hbWU6IGdvb2dsZS5zdG9yYWdlLnYyLlN0b3JhZ2UKKy8vICAgICAgIG1peGluczoKKy8vICAgICAgIC0gbmFtZTogZ29vZ2xlLmFjbC52MS5BY2Nlc3NDb250cm9sCisvLworLy8gVGhlIG1peGluIGNvbnN0cnVjdCBpbXBsaWVzIHRoYXQgYWxsIG1ldGhvZHMgaW4gYEFjY2Vzc0NvbnRyb2xgIGFyZQorLy8gYWxzbyBkZWNsYXJlZCB3aXRoIHNhbWUgbmFtZSBhbmQgcmVxdWVzdC9yZXNwb25zZSB0eXBlcyBpbgorLy8gYFN0b3JhZ2VgLiBBIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yIG9yIGFubm90YXRpb24gcHJvY2Vzc29yIHdpbGwKKy8vIHNlZSB0aGUgZWZmZWN0aXZlIGBTdG9yYWdlLkdldEFjbGAgbWV0aG9kIGFmdGVyIGluaGVyaXRpbmcKKy8vIGRvY3VtZW50YXRpb24gYW5kIGFubm90YXRpb25zIGFzIGZvbGxvd3M6CisvLworLy8gICAgIHNlcnZpY2UgU3RvcmFnZSB7CisvLyAgICAgICAvLyBHZXQgdGhlIHVuZGVybHlpbmcgQUNMIG9iamVjdC4KKy8vICAgICAgIHJwYyBHZXRBY2woR2V0QWNsUmVxdWVzdCkgcmV0dXJucyAoQWNsKSB7CisvLyAgICAgICAgIG9wdGlvbiAoZ29vZ2xlLmFwaS5odHRwKS5nZXQgPSAiL3YyL3tyZXNvdXJjZT0qKn06Z2V0QWNsIjsKKy8vICAgICAgIH0KKy8vICAgICAgIC4uLgorLy8gICAgIH0KKy8vCisvLyBOb3RlIGhvdyB0aGUgdmVyc2lvbiBpbiB0aGUgcGF0aCBwYXR0ZXJuIGNoYW5nZWQgZnJvbSBgdjFgIHRvIGB2MmAuCisvLworLy8gSWYgdGhlIGByb290YCBmaWVsZCBpbiB0aGUgbWl4aW4gaXMgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYQorLy8gcmVsYXRpdmUgcGF0aCB1bmRlciB3aGljaCBpbmhlcml0ZWQgSFRUUCBwYXRocyBhcmUgcGxhY2VkLiBFeGFtcGxlOgorLy8KKy8vICAgICBhcGlzOgorLy8gICAgIC0gbmFtZTogZ29vZ2xlLnN0b3JhZ2UudjIuU3RvcmFnZQorLy8gICAgICAgbWl4aW5zOgorLy8gICAgICAgLSBuYW1lOiBnb29nbGUuYWNsLnYxLkFjY2Vzc0NvbnRyb2wKKy8vICAgICAgICAgcm9vdDogYWNscworLy8KKy8vIFRoaXMgaW1wbGllcyB0aGUgZm9sbG93aW5nIGluaGVyaXRlZCBIVFRQIGFubm90YXRpb246CisvLworLy8gICAgIHNlcnZpY2UgU3RvcmFnZSB7CisvLyAgICAgICAvLyBHZXQgdGhlIHVuZGVybHlpbmcgQUNMIG9iamVjdC4KKy8vICAgICAgIHJwYyBHZXRBY2woR2V0QWNsUmVxdWVzdCkgcmV0dXJucyAoQWNsKSB7CisvLyAgICAgICAgIG9wdGlvbiAoZ29vZ2xlLmFwaS5odHRwKS5nZXQgPSAiL3YyL2FjbHMve3Jlc291cmNlPSoqfTpnZXRBY2wiOworLy8gICAgICAgfQorLy8gICAgICAgLi4uCisvLyAgICAgfQorbWVzc2FnZSBNaXhpbiB7CisgIC8vIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHdoaWNoIGlzIGluY2x1ZGVkLgorICBzdHJpbmcgbmFtZSA9IDE7CisKKyAgLy8gSWYgbm9uLWVtcHR5IHNwZWNpZmllcyBhIHBhdGggdW5kZXIgd2hpY2ggaW5oZXJpdGVkIEhUVFAgcGF0aHMKKyAgLy8gYXJlIHJvb3RlZC4KKyAgc3RyaW5nIHJvb3QgPSAyOworfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvIGIvaW5jbHVkZS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNDJhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8KQEAgLTAsMCArMSwxODMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLworLy8gV0FSTklORzogIFRoZSBwbHVnaW4gaW50ZXJmYWNlIGlzIGN1cnJlbnRseSBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8KKy8vICAgY2hhbmdlLgorLy8KKy8vIHByb3RvYyAoYWthIHRoZSBQcm90b2NvbCBDb21waWxlcikgY2FuIGJlIGV4dGVuZGVkIHZpYSBwbHVnaW5zLiAgQSBwbHVnaW4gaXMKKy8vIGp1c3QgYSBwcm9ncmFtIHRoYXQgcmVhZHMgYSBDb2RlR2VuZXJhdG9yUmVxdWVzdCBmcm9tIHN0ZGluIGFuZCB3cml0ZXMgYQorLy8gQ29kZUdlbmVyYXRvclJlc3BvbnNlIHRvIHN0ZG91dC4KKy8vCisvLyBQbHVnaW5zIHdyaXR0ZW4gdXNpbmcgQysrIGNhbiB1c2UgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oIGluc3RlYWQKKy8vIG9mIGRlYWxpbmcgd2l0aCB0aGUgcmF3IHByb3RvY29sIGRlZmluZWQgaGVyZS4KKy8vCisvLyBBIHBsdWdpbiBleGVjdXRhYmxlIG5lZWRzIG9ubHkgdG8gYmUgcGxhY2VkIHNvbWV3aGVyZSBpbiB0aGUgcGF0aC4gIFRoZQorLy8gcGx1Z2luIHNob3VsZCBiZSBuYW1lZCAicHJvdG9jLWdlbi0kTkFNRSIsIGFuZCB3aWxsIHRoZW4gYmUgdXNlZCB3aGVuIHRoZQorLy8gZmxhZyAiLS0ke05BTUV9X291dCIgaXMgcGFzc2VkIHRvIHByb3RvYy4KKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJQbHVnaW5Qcm90b3MiOworCitvcHRpb24gZ29fcGFja2FnZSA9ICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9wbHVnaW5wYiI7CisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iOworCisvLyBUaGUgdmVyc2lvbiBudW1iZXIgb2YgcHJvdG9jb2wgY29tcGlsZXIuCittZXNzYWdlIFZlcnNpb24geworICBvcHRpb25hbCBpbnQzMiBtYWpvciA9IDE7CisgIG9wdGlvbmFsIGludDMyIG1pbm9yID0gMjsKKyAgb3B0aW9uYWwgaW50MzIgcGF0Y2ggPSAzOworICAvLyBBIHN1ZmZpeCBmb3IgYWxwaGEsIGJldGEgb3IgcmMgcmVsZWFzZSwgZS5nLiwgImFscGhhLTEiLCAicmMyIi4gSXQgc2hvdWxkCisgIC8vIGJlIGVtcHR5IGZvciBtYWlubGluZSBzdGFibGUgcmVsZWFzZXMuCisgIG9wdGlvbmFsIHN0cmluZyBzdWZmaXggPSA0OworfQorCisvLyBBbiBlbmNvZGVkIENvZGVHZW5lcmF0b3JSZXF1ZXN0IGlzIHdyaXR0ZW4gdG8gdGhlIHBsdWdpbidzIHN0ZGluLgorbWVzc2FnZSBDb2RlR2VuZXJhdG9yUmVxdWVzdCB7CisgIC8vIFRoZSAucHJvdG8gZmlsZXMgdGhhdCB3ZXJlIGV4cGxpY2l0bHkgbGlzdGVkIG9uIHRoZSBjb21tYW5kLWxpbmUuICBUaGUKKyAgLy8gY29kZSBnZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIGNvZGUgb25seSBmb3IgdGhlc2UgZmlsZXMuICBFYWNoIGZpbGUncworICAvLyBkZXNjcmlwdG9yIHdpbGwgYmUgaW5jbHVkZWQgaW4gcHJvdG9fZmlsZSwgYmVsb3cuCisgIHJlcGVhdGVkIHN0cmluZyBmaWxlX3RvX2dlbmVyYXRlID0gMTsKKworICAvLyBUaGUgZ2VuZXJhdG9yIHBhcmFtZXRlciBwYXNzZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KKyAgb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7CisKKyAgLy8gRmlsZURlc2NyaXB0b3JQcm90b3MgZm9yIGFsbCBmaWxlcyBpbiBmaWxlc190b19nZW5lcmF0ZSBhbmQgZXZlcnl0aGluZworICAvLyB0aGV5IGltcG9ydC4gIFRoZSBmaWxlcyB3aWxsIGFwcGVhciBpbiB0b3BvbG9naWNhbCBvcmRlciwgc28gZWFjaCBmaWxlCisgIC8vIGFwcGVhcnMgYmVmb3JlIGFueSBmaWxlIHRoYXQgaW1wb3J0cyBpdC4KKyAgLy8KKyAgLy8gcHJvdG9jIGd1YXJhbnRlZXMgdGhhdCBhbGwgcHJvdG9fZmlsZXMgd2lsbCBiZSB3cml0dGVuIGFmdGVyCisgIC8vIHRoZSBmaWVsZHMgYWJvdmUsIGV2ZW4gdGhvdWdoIHRoaXMgaXMgbm90IHRlY2huaWNhbGx5IGd1YXJhbnRlZWQgYnkgdGhlCisgIC8vIHByb3RvYnVmIHdpcmUgZm9ybWF0LiAgVGhpcyB0aGVvcmV0aWNhbGx5IGNvdWxkIGFsbG93IGEgcGx1Z2luIHRvIHN0cmVhbQorICAvLyBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90b3MgYW5kIGhhbmRsZSB0aGVtIG9uZSBieSBvbmUgcmF0aGVyIHRoYW4gcmVhZAorICAvLyB0aGUgZW50aXJlIHNldCBpbnRvIG1lbW9yeSBhdCBvbmNlLiAgSG93ZXZlciwgYXMgb2YgdGhpcyB3cml0aW5nLCB0aGlzCisgIC8vIGlzIG5vdCBzaW1pbGFybHkgb3B0aW1pemVkIG9uIHByb3RvYydzIGVuZCAtLSBpdCB3aWxsIHN0b3JlIGFsbCBmaWVsZHMgaW4KKyAgLy8gbWVtb3J5IGF0IG9uY2UgYmVmb3JlIHNlbmRpbmcgdGhlbSB0byB0aGUgcGx1Z2luLgorICAvLworICAvLyBUeXBlIG5hbWVzIG9mIGZpZWxkcyBhbmQgZXh0ZW5zaW9ucyBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90byBhcmUgYWx3YXlzCisgIC8vIGZ1bGx5IHF1YWxpZmllZC4KKyAgcmVwZWF0ZWQgRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7CisKKyAgLy8gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHByb3RvY29sIGNvbXBpbGVyLgorICBvcHRpb25hbCBWZXJzaW9uIGNvbXBpbGVyX3ZlcnNpb24gPSAzOworCit9CisKKy8vIFRoZSBwbHVnaW4gd3JpdGVzIGFuIGVuY29kZWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlIHRvIHN0ZG91dC4KK21lc3NhZ2UgQ29kZUdlbmVyYXRvclJlc3BvbnNlIHsKKyAgLy8gRXJyb3IgbWVzc2FnZS4gIElmIG5vbi1lbXB0eSwgY29kZSBnZW5lcmF0aW9uIGZhaWxlZC4gIFRoZSBwbHVnaW4gcHJvY2VzcworICAvLyBzaG91bGQgZXhpdCB3aXRoIHN0YXR1cyBjb2RlIHplcm8gZXZlbiBpZiBpdCByZXBvcnRzIGFuIGVycm9yIGluIHRoaXMgd2F5LgorICAvLworICAvLyBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIGluZGljYXRlIGVycm9ycyBpbiAucHJvdG8gZmlsZXMgd2hpY2ggcHJldmVudCB0aGUKKyAgLy8gY29kZSBnZW5lcmF0b3IgZnJvbSBnZW5lcmF0aW5nIGNvcnJlY3QgY29kZS4gIEVycm9ycyB3aGljaCBpbmRpY2F0ZSBhCisgIC8vIHByb2JsZW0gaW4gcHJvdG9jIGl0c2VsZiAtLSBzdWNoIGFzIHRoZSBpbnB1dCBDb2RlR2VuZXJhdG9yUmVxdWVzdCBiZWluZworICAvLyB1bnBhcnNlYWJsZSAtLSBzaG91bGQgYmUgcmVwb3J0ZWQgYnkgd3JpdGluZyBhIG1lc3NhZ2UgdG8gc3RkZXJyIGFuZAorICAvLyBleGl0aW5nIHdpdGggYSBub24temVybyBzdGF0dXMgY29kZS4KKyAgb3B0aW9uYWwgc3RyaW5nIGVycm9yID0gMTsKKworICAvLyBBIGJpdG1hc2sgb2Ygc3VwcG9ydGVkIGZlYXR1cmVzIHRoYXQgdGhlIGNvZGUgZ2VuZXJhdG9yIHN1cHBvcnRzLgorICAvLyBUaGlzIGlzIGEgYml0d2lzZSAib3IiIG9mIHZhbHVlcyBmcm9tIHRoZSBGZWF0dXJlIGVudW0uCisgIG9wdGlvbmFsIHVpbnQ2NCBzdXBwb3J0ZWRfZmVhdHVyZXMgPSAyOworCisgIC8vIFN5bmMgd2l0aCBjb2RlX2dlbmVyYXRvci5oLgorICBlbnVtIEZlYXR1cmUgeworICAgIEZFQVRVUkVfTk9ORSA9IDA7CisgICAgRkVBVFVSRV9QUk9UTzNfT1BUSU9OQUwgPSAxOworICB9CisKKyAgLy8gUmVwcmVzZW50cyBhIHNpbmdsZSBnZW5lcmF0ZWQgZmlsZS4KKyAgbWVzc2FnZSBGaWxlIHsKKyAgICAvLyBUaGUgZmlsZSBuYW1lLCByZWxhdGl2ZSB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gIFRoZSBuYW1lIG11c3Qgbm90CisgICAgLy8gY29udGFpbiAiLiIgb3IgIi4uIiBjb21wb25lbnRzIGFuZCBtdXN0IGJlIHJlbGF0aXZlLCBub3QgYmUgYWJzb2x1dGUgKHNvLAorICAgIC8vIHRoZSBmaWxlIGNhbm5vdCBsaWUgb3V0c2lkZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSkuICAiLyIgbXVzdCBiZSB1c2VkIGFzCisgICAgLy8gdGhlIHBhdGggc2VwYXJhdG9yLCBub3QgIlwiLgorICAgIC8vCisgICAgLy8gSWYgdGhlIG5hbWUgaXMgb21pdHRlZCwgdGhlIGNvbnRlbnQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcHJldmlvdXMKKyAgICAvLyBmaWxlLiAgVGhpcyBhbGxvd3MgdGhlIGdlbmVyYXRvciB0byBicmVhayBsYXJnZSBmaWxlcyBpbnRvIHNtYWxsIGNodW5rcywKKyAgICAvLyBhbmQgYWxsb3dzIHRoZSBnZW5lcmF0ZWQgdGV4dCB0byBiZSBzdHJlYW1lZCBiYWNrIHRvIHByb3RvYyBzbyB0aGF0IGxhcmdlCisgICAgLy8gZmlsZXMgbmVlZCBub3QgcmVzaWRlIGNvbXBsZXRlbHkgaW4gbWVtb3J5IGF0IG9uZSB0aW1lLiAgTm90ZSB0aGF0IGFzIG9mCisgICAgLy8gdGhpcyB3cml0aW5nIHByb3RvYyBkb2VzIG5vdCBvcHRpbWl6ZSBmb3IgdGhpcyAtLSBpdCB3aWxsIHJlYWQgdGhlIGVudGlyZQorICAgIC8vIENvZGVHZW5lcmF0b3JSZXNwb25zZSBiZWZvcmUgd3JpdGluZyBmaWxlcyB0byBkaXNrLgorICAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKworICAgIC8vIElmIG5vbi1lbXB0eSwgaW5kaWNhdGVzIHRoYXQgdGhlIG5hbWVkIGZpbGUgc2hvdWxkIGFscmVhZHkgZXhpc3QsIGFuZCB0aGUKKyAgICAvLyBjb250ZW50IGhlcmUgaXMgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGF0IGZpbGUgYXQgYSBkZWZpbmVkIGluc2VydGlvbgorICAgIC8vIHBvaW50LiAgVGhpcyBmZWF0dXJlIGFsbG93cyBhIGNvZGUgZ2VuZXJhdG9yIHRvIGV4dGVuZCB0aGUgb3V0cHV0CisgICAgLy8gcHJvZHVjZWQgYnkgYW5vdGhlciBjb2RlIGdlbmVyYXRvci4gIFRoZSBvcmlnaW5hbCBnZW5lcmF0b3IgbWF5IHByb3ZpZGUKKyAgICAvLyBpbnNlcnRpb24gcG9pbnRzIGJ5IHBsYWNpbmcgc3BlY2lhbCBhbm5vdGF0aW9ucyBpbiB0aGUgZmlsZSB0aGF0IGxvb2sKKyAgICAvLyBsaWtlOgorICAgIC8vICAgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KE5BTUUpCisgICAgLy8gVGhlIGFubm90YXRpb24gY2FuIGhhdmUgYXJiaXRyYXJ5IHRleHQgYmVmb3JlIGFuZCBhZnRlciBpdCBvbiB0aGUgbGluZSwKKyAgICAvLyB3aGljaCBhbGxvd3MgaXQgdG8gYmUgcGxhY2VkIGluIGEgY29tbWVudC4gIE5BTUUgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGgKKyAgICAvLyBhbiBpZGVudGlmaWVyIG5hbWluZyB0aGUgcG9pbnQgLS0gdGhpcyBpcyB3aGF0IG90aGVyIGdlbmVyYXRvcnMgd2lsbCB1c2UKKyAgICAvLyBhcyB0aGUgaW5zZXJ0aW9uX3BvaW50LiAgQ29kZSBpbnNlcnRlZCBhdCB0aGlzIHBvaW50IHdpbGwgYmUgcGxhY2VkCisgICAgLy8gaW1tZWRpYXRlbHkgYWJvdmUgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgaW5zZXJ0aW9uIHBvaW50ICh0aHVzIG11bHRpcGxlCisgICAgLy8gaW5zZXJ0aW9ucyB0byB0aGUgc2FtZSBwb2ludCB3aWxsIGNvbWUgb3V0IGluIHRoZSBvcmRlciB0aGV5IHdlcmUgYWRkZWQpLgorICAgIC8vIFRoZSBkb3VibGUtQCBpcyBpbnRlbmRlZCB0byBtYWtlIGl0IHVubGlrZWx5IHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlCisgICAgLy8gY291bGQgY29udGFpbiB0aGluZ3MgdGhhdCBsb29rIGxpa2UgaW5zZXJ0aW9uIHBvaW50cyBieSBhY2NpZGVudC4KKyAgICAvLworICAgIC8vIEZvciBleGFtcGxlLCB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yIHBsYWNlcyB0aGUgZm9sbG93aW5nIGxpbmUgaW4gdGhlCisgICAgLy8gLnBiLmggZmlsZXMgdGhhdCBpdCBnZW5lcmF0ZXM6CisgICAgLy8gICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorICAgIC8vIFRoaXMgbGluZSBhcHBlYXJzIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGZpbGUncyBwYWNrYWdlIG5hbWVzcGFjZSwgYnV0CisgICAgLy8gb3V0c2lkZSBvZiBhbnkgcGFydGljdWxhciBjbGFzcy4gIEFub3RoZXIgcGx1Z2luIGNhbiB0aGVuIHNwZWNpZnkgdGhlCisgICAgLy8gaW5zZXJ0aW9uX3BvaW50ICJuYW1lc3BhY2Vfc2NvcGUiIHRvIGdlbmVyYXRlIGFkZGl0aW9uYWwgY2xhc3NlcyBvcgorICAgIC8vIG90aGVyIGRlY2xhcmF0aW9ucyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW4gdGhpcyBzY29wZS4KKyAgICAvLworICAgIC8vIE5vdGUgdGhhdCBpZiB0aGUgbGluZSBjb250YWluaW5nIHRoZSBpbnNlcnRpb24gcG9pbnQgYmVnaW5zIHdpdGgKKyAgICAvLyB3aGl0ZXNwYWNlLCB0aGUgc2FtZSB3aGl0ZXNwYWNlIHdpbGwgYmUgYWRkZWQgdG8gZXZlcnkgbGluZSBvZiB0aGUKKyAgICAvLyBpbnNlcnRlZCB0ZXh0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGxhbmd1YWdlcyBsaWtlIFB5dGhvbiwgd2hlcmUKKyAgICAvLyBpbmRlbnRhdGlvbiBtYXR0ZXJzLiAgSW4gdGhlc2UgbGFuZ3VhZ2VzLCB0aGUgaW5zZXJ0aW9uIHBvaW50IGNvbW1lbnQKKyAgICAvLyBzaG91bGQgYmUgaW5kZW50ZWQgdGhlIHNhbWUgYW1vdW50IGFzIGFueSBpbnNlcnRlZCBjb2RlIHdpbGwgbmVlZCB0byBiZQorICAgIC8vIGluIG9yZGVyIHRvIHdvcmsgY29ycmVjdGx5IGluIHRoYXQgY29udGV4dC4KKyAgICAvLworICAgIC8vIFRoZSBjb2RlIGdlbmVyYXRvciB0aGF0IGdlbmVyYXRlcyB0aGUgaW5pdGlhbCBmaWxlIGFuZCB0aGUgb25lIHdoaWNoCisgICAgLy8gaW5zZXJ0cyBpbnRvIGl0IG11c3QgYm90aCBydW4gYXMgcGFydCBvZiBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mIHByb3RvYy4KKyAgICAvLyBDb2RlIGdlbmVyYXRvcnMgYXJlIGV4ZWN1dGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBvbiB0aGUKKyAgICAvLyBjb21tYW5kIGxpbmUuCisgICAgLy8KKyAgICAvLyBJZiB8aW5zZXJ0aW9uX3BvaW50fCBpcyBwcmVzZW50LCB8bmFtZXwgbXVzdCBhbHNvIGJlIHByZXNlbnQuCisgICAgb3B0aW9uYWwgc3RyaW5nIGluc2VydGlvbl9wb2ludCA9IDI7CisKKyAgICAvLyBUaGUgZmlsZSBjb250ZW50cy4KKyAgICBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1OworCisgICAgLy8gSW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgZmlsZSBjb250ZW50IGJlaW5nIGluc2VydGVkLiBJZiBhbiBpbnNlcnRpb24KKyAgICAvLyBwb2ludCBpcyB1c2VkLCB0aGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgYXBwcm9wcmlhdGVseSBvZmZzZXQgYW5kIGluc2VydGVkCisgICAgLy8gaW50byB0aGUgY29kZSBnZW5lcmF0aW9uIG1ldGFkYXRhIGZvciB0aGUgZ2VuZXJhdGVkIGZpbGVzLgorICAgIG9wdGlvbmFsIEdlbmVyYXRlZENvZGVJbmZvIGdlbmVyYXRlZF9jb2RlX2luZm8gPSAxNjsKKyAgfQorICByZXBlYXRlZCBGaWxlIGZpbGUgPSAxNTsKK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8gYi9pbmNsdWRlL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZWIyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvCkBAIC0wLDAgKzEsOTIxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhlIG1lc3NhZ2VzIGluIHRoaXMgZmlsZSBkZXNjcmliZSB0aGUgZGVmaW5pdGlvbnMgZm91bmQgaW4gLnByb3RvIGZpbGVzLgorLy8gQSB2YWxpZCAucHJvdG8gZmlsZSBjYW4gYmUgdHJhbnNsYXRlZCBkaXJlY3RseSB0byBhIEZpbGVEZXNjcmlwdG9yUHJvdG8KKy8vIHdpdGhvdXQgYW55IG90aGVyIGluZm9ybWF0aW9uIChlLmcuIHdpdGhvdXQgcmVhZGluZyBpdHMgaW1wb3J0cykuCisKKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOworCitvcHRpb24gZ29fcGFja2FnZSA9ICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9kZXNjcmlwdG9ycGIiOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJEZXNjcmlwdG9yUHJvdG9zIjsKK29wdGlvbiBjc2hhcnBfbmFtZXNwYWNlID0gIkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uIjsKK29wdGlvbiBvYmpjX2NsYXNzX3ByZWZpeCA9ICJHUEIiOworb3B0aW9uIGNjX2VuYWJsZV9hcmVuYXMgPSB0cnVlOworCisvLyBkZXNjcmlwdG9yLnByb3RvIG11c3QgYmUgb3B0aW1pemVkIGZvciBzcGVlZCBiZWNhdXNlIHJlZmxlY3Rpb24tYmFzZWQKKy8vIGFsZ29yaXRobXMgZG9uJ3Qgd29yayBkdXJpbmcgYm9vdHN0cmFwcGluZy4KK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKKworLy8gVGhlIHByb3RvY29sIGNvbXBpbGVyIGNhbiBvdXRwdXQgYSBGaWxlRGVzY3JpcHRvclNldCBjb250YWluaW5nIHRoZSAucHJvdG8KKy8vIGZpbGVzIGl0IHBhcnNlcy4KK21lc3NhZ2UgRmlsZURlc2NyaXB0b3JTZXQgeworICByZXBlYXRlZCBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOworfQorCisvLyBEZXNjcmliZXMgYSBjb21wbGV0ZSAucHJvdG8gZmlsZS4KK21lc3NhZ2UgRmlsZURlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsgICAgIC8vIGZpbGUgbmFtZSwgcmVsYXRpdmUgdG8gcm9vdCBvZiBzb3VyY2UgdHJlZQorICBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7ICAvLyBlLmcuICJmb28iLCAiZm9vLmJhciIsIGV0Yy4KKworICAvLyBOYW1lcyBvZiBmaWxlcyBpbXBvcnRlZCBieSB0aGlzIGZpbGUuCisgIHJlcGVhdGVkIHN0cmluZyBkZXBlbmRlbmN5ID0gMzsKKyAgLy8gSW5kZXhlcyBvZiB0aGUgcHVibGljIGltcG9ydGVkIGZpbGVzIGluIHRoZSBkZXBlbmRlbmN5IGxpc3QgYWJvdmUuCisgIHJlcGVhdGVkIGludDMyIHB1YmxpY19kZXBlbmRlbmN5ID0gMTA7CisgIC8vIEluZGV4ZXMgb2YgdGhlIHdlYWsgaW1wb3J0ZWQgZmlsZXMgaW4gdGhlIGRlcGVuZGVuY3kgbGlzdC4KKyAgLy8gRm9yIEdvb2dsZS1pbnRlcm5hbCBtaWdyYXRpb24gb25seS4gRG8gbm90IHVzZS4KKyAgcmVwZWF0ZWQgaW50MzIgd2Vha19kZXBlbmRlbmN5ID0gMTE7CisKKyAgLy8gQWxsIHRvcC1sZXZlbCBkZWZpbml0aW9ucyBpbiB0aGlzIGZpbGUuCisgIHJlcGVhdGVkIERlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OworICByZXBlYXRlZCBFbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDU7CisgIHJlcGVhdGVkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2VydmljZSA9IDY7CisgIHJlcGVhdGVkIEZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDc7CisKKyAgb3B0aW9uYWwgRmlsZU9wdGlvbnMgb3B0aW9ucyA9IDg7CisKKyAgLy8gVGhpcyBmaWVsZCBjb250YWlucyBvcHRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUuCisgIC8vIFlvdSBtYXkgc2FmZWx5IHJlbW92ZSB0aGlzIGVudGlyZSBmaWVsZCB3aXRob3V0IGhhcm1pbmcgcnVudGltZQorICAvLyBmdW5jdGlvbmFsaXR5IG9mIHRoZSBkZXNjcmlwdG9ycyAtLSB0aGUgaW5mb3JtYXRpb24gaXMgbmVlZGVkIG9ubHkgYnkKKyAgLy8gZGV2ZWxvcG1lbnQgdG9vbHMuCisgIG9wdGlvbmFsIFNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm8gPSA5OworCisgIC8vIFRoZSBzeW50YXggb2YgdGhlIHByb3RvIGZpbGUuCisgIC8vIFRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSAicHJvdG8yIiBhbmQgInByb3RvMyIuCisgIG9wdGlvbmFsIHN0cmluZyBzeW50YXggPSAxMjsKK30KKworLy8gRGVzY3JpYmVzIGEgbWVzc2FnZSB0eXBlLgorbWVzc2FnZSBEZXNjcmlwdG9yUHJvdG8geworICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisKKyAgcmVwZWF0ZWQgRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOworICByZXBlYXRlZCBGaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA2OworCisgIHJlcGVhdGVkIERlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7CisgIHJlcGVhdGVkIEVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNDsKKworICBtZXNzYWdlIEV4dGVuc2lvblJhbmdlIHsKKyAgICBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7ICAvLyBJbmNsdXNpdmUuCisgICAgb3B0aW9uYWwgaW50MzIgZW5kID0gMjsgICAgLy8gRXhjbHVzaXZlLgorCisgICAgb3B0aW9uYWwgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zIG9wdGlvbnMgPSAzOworICB9CisgIHJlcGVhdGVkIEV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7CisKKyAgcmVwZWF0ZWQgT25lb2ZEZXNjcmlwdG9yUHJvdG8gb25lb2ZfZGVjbCA9IDg7CisKKyAgb3B0aW9uYWwgTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7CisKKyAgLy8gUmFuZ2Ugb2YgcmVzZXJ2ZWQgdGFnIG51bWJlcnMuIFJlc2VydmVkIHRhZyBudW1iZXJzIG1heSBub3QgYmUgdXNlZCBieQorICAvLyBmaWVsZHMgb3IgZXh0ZW5zaW9uIHJhbmdlcyBpbiB0aGUgc2FtZSBtZXNzYWdlLiBSZXNlcnZlZCByYW5nZXMgbWF5CisgIC8vIG5vdCBvdmVybGFwLgorICBtZXNzYWdlIFJlc2VydmVkUmFuZ2UgeworICAgIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsgIC8vIEluY2x1c2l2ZS4KKyAgICBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOyAgICAvLyBFeGNsdXNpdmUuCisgIH0KKyAgcmVwZWF0ZWQgUmVzZXJ2ZWRSYW5nZSByZXNlcnZlZF9yYW5nZSA9IDk7CisgIC8vIFJlc2VydmVkIGZpZWxkIG5hbWVzLCB3aGljaCBtYXkgbm90IGJlIHVzZWQgYnkgZmllbGRzIGluIHRoZSBzYW1lIG1lc3NhZ2UuCisgIC8vIEEgZ2l2ZW4gbmFtZSBtYXkgb25seSBiZSByZXNlcnZlZCBvbmNlLgorICByZXBlYXRlZCBzdHJpbmcgcmVzZXJ2ZWRfbmFtZSA9IDEwOworfQorCittZXNzYWdlIEV4dGVuc2lvblJhbmdlT3B0aW9ucyB7CisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKKy8vIERlc2NyaWJlcyBhIGZpZWxkIHdpdGhpbiBhIG1lc3NhZ2UuCittZXNzYWdlIEZpZWxkRGVzY3JpcHRvclByb3RvIHsKKyAgZW51bSBUeXBlIHsKKyAgICAvLyAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMuCisgICAgLy8gT3JkZXIgaXMgd2VpcmQgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4KKyAgICBUWVBFX0RPVUJMRSA9IDE7CisgICAgVFlQRV9GTE9BVCA9IDI7CisgICAgLy8gTm90IFppZ1phZyBlbmNvZGVkLiAgTmVnYXRpdmUgbnVtYmVycyB0YWtlIDEwIGJ5dGVzLiAgVXNlIFRZUEVfU0lOVDY0IGlmCisgICAgLy8gbmVnYXRpdmUgdmFsdWVzIGFyZSBsaWtlbHkuCisgICAgVFlQRV9JTlQ2NCA9IDM7CisgICAgVFlQRV9VSU5UNjQgPSA0OworICAgIC8vIE5vdCBaaWdaYWcgZW5jb2RlZC4gIE5lZ2F0aXZlIG51bWJlcnMgdGFrZSAxMCBieXRlcy4gIFVzZSBUWVBFX1NJTlQzMiBpZgorICAgIC8vIG5lZ2F0aXZlIHZhbHVlcyBhcmUgbGlrZWx5LgorICAgIFRZUEVfSU5UMzIgPSA1OworICAgIFRZUEVfRklYRUQ2NCA9IDY7CisgICAgVFlQRV9GSVhFRDMyID0gNzsKKyAgICBUWVBFX0JPT0wgPSA4OworICAgIFRZUEVfU1RSSU5HID0gOTsKKyAgICAvLyBUYWctZGVsaW1pdGVkIGFnZ3JlZ2F0ZS4KKyAgICAvLyBHcm91cCB0eXBlIGlzIGRlcHJlY2F0ZWQgYW5kIG5vdCBzdXBwb3J0ZWQgaW4gcHJvdG8zLiBIb3dldmVyLCBQcm90bzMKKyAgICAvLyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcGFyc2UgdGhlIGdyb3VwIHdpcmUgZm9ybWF0IGFuZAorICAgIC8vIHRyZWF0IGdyb3VwIGZpZWxkcyBhcyB1bmtub3duIGZpZWxkcy4KKyAgICBUWVBFX0dST1VQID0gMTA7CisgICAgVFlQRV9NRVNTQUdFID0gMTE7ICAvLyBMZW5ndGgtZGVsaW1pdGVkIGFnZ3JlZ2F0ZS4KKworICAgIC8vIE5ldyBpbiB2ZXJzaW9uIDIuCisgICAgVFlQRV9CWVRFUyA9IDEyOworICAgIFRZUEVfVUlOVDMyID0gMTM7CisgICAgVFlQRV9FTlVNID0gMTQ7CisgICAgVFlQRV9TRklYRUQzMiA9IDE1OworICAgIFRZUEVfU0ZJWEVENjQgPSAxNjsKKyAgICBUWVBFX1NJTlQzMiA9IDE3OyAgLy8gVXNlcyBaaWdaYWcgZW5jb2RpbmcuCisgICAgVFlQRV9TSU5UNjQgPSAxODsgIC8vIFVzZXMgWmlnWmFnIGVuY29kaW5nLgorICB9CisKKyAgZW51bSBMYWJlbCB7CisgICAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzCisgICAgTEFCRUxfT1BUSU9OQUwgPSAxOworICAgIExBQkVMX1JFUVVJUkVEID0gMjsKKyAgICBMQUJFTF9SRVBFQVRFRCA9IDM7CisgIH0KKworICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDM7CisgIG9wdGlvbmFsIExhYmVsIGxhYmVsID0gNDsKKworICAvLyBJZiB0eXBlX25hbWUgaXMgc2V0LCB0aGlzIG5lZWQgbm90IGJlIHNldC4gIElmIGJvdGggdGhpcyBhbmQgdHlwZV9uYW1lCisgIC8vIGFyZSBzZXQsIHRoaXMgbXVzdCBiZSBvbmUgb2YgVFlQRV9FTlVNLCBUWVBFX01FU1NBR0Ugb3IgVFlQRV9HUk9VUC4KKyAgb3B0aW9uYWwgVHlwZSB0eXBlID0gNTsKKworICAvLyBGb3IgbWVzc2FnZSBhbmQgZW51bSB0eXBlcywgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZS4gIElmIHRoZSBuYW1lCisgIC8vIHN0YXJ0cyB3aXRoIGEgJy4nLCBpdCBpcyBmdWxseS1xdWFsaWZpZWQuICBPdGhlcndpc2UsIEMrKy1saWtlIHNjb3BpbmcKKyAgLy8gcnVsZXMgYXJlIHVzZWQgdG8gZmluZCB0aGUgdHlwZSAoaS5lLiBmaXJzdCB0aGUgbmVzdGVkIHR5cGVzIHdpdGhpbiB0aGlzCisgIC8vIG1lc3NhZ2UgYXJlIHNlYXJjaGVkLCB0aGVuIHdpdGhpbiB0aGUgcGFyZW50LCBvbiB1cCB0byB0aGUgcm9vdAorICAvLyBuYW1lc3BhY2UpLgorICBvcHRpb25hbCBzdHJpbmcgdHlwZV9uYW1lID0gNjsKKworICAvLyBGb3IgZXh0ZW5zaW9ucywgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBiZWluZyBleHRlbmRlZC4gIEl0IGlzCisgIC8vIHJlc29sdmVkIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0eXBlX25hbWUuCisgIG9wdGlvbmFsIHN0cmluZyBleHRlbmRlZSA9IDI7CisKKyAgLy8gRm9yIG51bWVyaWMgdHlwZXMsIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZS4KKyAgLy8gRm9yIGJvb2xlYW5zLCAidHJ1ZSIgb3IgImZhbHNlIi4KKyAgLy8gRm9yIHN0cmluZ3MsIGNvbnRhaW5zIHRoZSBkZWZhdWx0IHRleHQgY29udGVudHMgKG5vdCBlc2NhcGVkIGluIGFueSB3YXkpLgorICAvLyBGb3IgYnl0ZXMsIGNvbnRhaW5zIHRoZSBDIGVzY2FwZWQgdmFsdWUuICBBbGwgYnl0ZXMgPj0gMTI4IGFyZSBlc2NhcGVkLgorICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWx1ZSA9IDc7CisKKyAgLy8gSWYgc2V0LCBnaXZlcyB0aGUgaW5kZXggb2YgYSBvbmVvZiBpbiB0aGUgY29udGFpbmluZyB0eXBlJ3Mgb25lb2ZfZGVjbAorICAvLyBsaXN0LiAgVGhpcyBmaWVsZCBpcyBhIG1lbWJlciBvZiB0aGF0IG9uZW9mLgorICBvcHRpb25hbCBpbnQzMiBvbmVvZl9pbmRleCA9IDk7CisKKyAgLy8gSlNPTiBuYW1lIG9mIHRoaXMgZmllbGQuIFRoZSB2YWx1ZSBpcyBzZXQgYnkgcHJvdG9jb2wgY29tcGlsZXIuIElmIHRoZQorICAvLyB1c2VyIGhhcyBzZXQgYSAianNvbl9uYW1lIiBvcHRpb24gb24gdGhpcyBmaWVsZCwgdGhhdCBvcHRpb24ncyB2YWx1ZQorICAvLyB3aWxsIGJlIHVzZWQuIE90aGVyd2lzZSwgaXQncyBkZWR1Y2VkIGZyb20gdGhlIGZpZWxkJ3MgbmFtZSBieSBjb252ZXJ0aW5nCisgIC8vIGl0IHRvIGNhbWVsQ2FzZS4KKyAgb3B0aW9uYWwgc3RyaW5nIGpzb25fbmFtZSA9IDEwOworCisgIG9wdGlvbmFsIEZpZWxkT3B0aW9ucyBvcHRpb25zID0gODsKKworICAvLyBJZiB0cnVlLCB0aGlzIGlzIGEgcHJvdG8zICJvcHRpb25hbCIuIFdoZW4gYSBwcm90bzMgZmllbGQgaXMgb3B0aW9uYWwsIGl0CisgIC8vIHRyYWNrcyBwcmVzZW5jZSByZWdhcmRsZXNzIG9mIGZpZWxkIHR5cGUuCisgIC8vCisgIC8vIFdoZW4gcHJvdG8zX29wdGlvbmFsIGlzIHRydWUsIHRoaXMgZmllbGQgbXVzdCBiZSBiZWxvbmcgdG8gYSBvbmVvZiB0bworICAvLyBzaWduYWwgdG8gb2xkIHByb3RvMyBjbGllbnRzIHRoYXQgcHJlc2VuY2UgaXMgdHJhY2tlZCBmb3IgdGhpcyBmaWVsZC4gVGhpcworICAvLyBvbmVvZiBpcyBrbm93biBhcyBhICJzeW50aGV0aWMiIG9uZW9mLCBhbmQgdGhpcyBmaWVsZCBtdXN0IGJlIGl0cyBzb2xlCisgIC8vIG1lbWJlciAoZWFjaCBwcm90bzMgb3B0aW9uYWwgZmllbGQgZ2V0cyBpdHMgb3duIHN5bnRoZXRpYyBvbmVvZikuIFN5bnRoZXRpYworICAvLyBvbmVvZnMgZXhpc3QgaW4gdGhlIGRlc2NyaXB0b3Igb25seSwgYW5kIGRvIG5vdCBnZW5lcmF0ZSBhbnkgQVBJLiBTeW50aGV0aWMKKyAgLy8gb25lb2ZzIG11c3QgYmUgb3JkZXJlZCBhZnRlciBhbGwgInJlYWwiIG9uZW9mcy4KKyAgLy8KKyAgLy8gRm9yIG1lc3NhZ2UgZmllbGRzLCBwcm90bzNfb3B0aW9uYWwgZG9lc24ndCBjcmVhdGUgYW55IHNlbWFudGljIGNoYW5nZSwKKyAgLy8gc2luY2Ugbm9uLXJlcGVhdGVkIG1lc3NhZ2UgZmllbGRzIGFsd2F5cyB0cmFjayBwcmVzZW5jZS4gSG93ZXZlciBpdCBzdGlsbAorICAvLyBpbmRpY2F0ZXMgdGhlIHNlbWFudGljIGRldGFpbCBvZiB3aGV0aGVyIHRoZSB1c2VyIHdyb3RlICJvcHRpb25hbCIgb3Igbm90LgorICAvLyBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIHJvdW5kLXRyaXBwaW5nIHRoZSAucHJvdG8gZmlsZS4gRm9yIGNvbnNpc3RlbmN5IHdlCisgIC8vIGdpdmUgbWVzc2FnZSBmaWVsZHMgYSBzeW50aGV0aWMgb25lb2YgYWxzbywgZXZlbiB0aG91Z2ggaXQgaXMgbm90IHJlcXVpcmVkCisgIC8vIHRvIHRyYWNrIHByZXNlbmNlLiBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGJlY2F1c2UgdGhlIHBhcnNlciBjYW4ndAorICAvLyB0ZWxsIGlmIGEgZmllbGQgaXMgYSBtZXNzYWdlIG9yIGFuIGVudW0sIHNvIGl0IG11c3QgYWx3YXlzIGNyZWF0ZSBhCisgIC8vIHN5bnRoZXRpYyBvbmVvZi4KKyAgLy8KKyAgLy8gUHJvdG8yIG9wdGlvbmFsIGZpZWxkcyBkbyBub3Qgc2V0IHRoaXMgZmxhZywgYmVjYXVzZSB0aGV5IGFscmVhZHkgaW5kaWNhdGUKKyAgLy8gb3B0aW9uYWwgd2l0aCBgTEFCRUxfT1BUSU9OQUxgLgorICBvcHRpb25hbCBib29sIHByb3RvM19vcHRpb25hbCA9IDE3OworfQorCisvLyBEZXNjcmliZXMgYSBvbmVvZi4KK21lc3NhZ2UgT25lb2ZEZXNjcmlwdG9yUHJvdG8geworICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIG9wdGlvbmFsIE9uZW9mT3B0aW9ucyBvcHRpb25zID0gMjsKK30KKworLy8gRGVzY3JpYmVzIGFuIGVudW0gdHlwZS4KK21lc3NhZ2UgRW51bURlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKworICByZXBlYXRlZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdmFsdWUgPSAyOworCisgIG9wdGlvbmFsIEVudW1PcHRpb25zIG9wdGlvbnMgPSAzOworCisgIC8vIFJhbmdlIG9mIHJlc2VydmVkIG51bWVyaWMgdmFsdWVzLiBSZXNlcnZlZCB2YWx1ZXMgbWF5IG5vdCBiZSB1c2VkIGJ5CisgIC8vIGVudHJpZXMgaW4gdGhlIHNhbWUgZW51bS4gUmVzZXJ2ZWQgcmFuZ2VzIG1heSBub3Qgb3ZlcmxhcC4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgZGlzdGluY3QgZnJvbSBEZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSBpbiB0aGF0IGl0CisgIC8vIGlzIGluY2x1c2l2ZSBzdWNoIHRoYXQgaXQgY2FuIGFwcHJvcHJpYXRlbHkgcmVwcmVzZW50IHRoZSBlbnRpcmUgaW50MzIKKyAgLy8gZG9tYWluLgorICBtZXNzYWdlIEVudW1SZXNlcnZlZFJhbmdlIHsKKyAgICBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7ICAvLyBJbmNsdXNpdmUuCisgICAgb3B0aW9uYWwgaW50MzIgZW5kID0gMjsgICAgLy8gSW5jbHVzaXZlLgorICB9CisKKyAgLy8gUmFuZ2Ugb2YgcmVzZXJ2ZWQgbnVtZXJpYyB2YWx1ZXMuIFJlc2VydmVkIG51bWVyaWMgdmFsdWVzIG1heSBub3QgYmUgdXNlZAorICAvLyBieSBlbnVtIHZhbHVlcyBpbiB0aGUgc2FtZSBlbnVtIGRlY2xhcmF0aW9uLiBSZXNlcnZlZCByYW5nZXMgbWF5IG5vdAorICAvLyBvdmVybGFwLgorICByZXBlYXRlZCBFbnVtUmVzZXJ2ZWRSYW5nZSByZXNlcnZlZF9yYW5nZSA9IDQ7CisKKyAgLy8gUmVzZXJ2ZWQgZW51bSB2YWx1ZSBuYW1lcywgd2hpY2ggbWF5IG5vdCBiZSByZXVzZWQuIEEgZ2l2ZW4gbmFtZSBtYXkgb25seQorICAvLyBiZSByZXNlcnZlZCBvbmNlLgorICByZXBlYXRlZCBzdHJpbmcgcmVzZXJ2ZWRfbmFtZSA9IDU7Cit9CisKKy8vIERlc2NyaWJlcyBhIHZhbHVlIHdpdGhpbiBhbiBlbnVtLgorbWVzc2FnZSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8geworICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7CisKKyAgb3B0aW9uYWwgRW51bVZhbHVlT3B0aW9ucyBvcHRpb25zID0gMzsKK30KKworLy8gRGVzY3JpYmVzIGEgc2VydmljZS4KK21lc3NhZ2UgU2VydmljZURlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgcmVwZWF0ZWQgTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7CisKKyAgb3B0aW9uYWwgU2VydmljZU9wdGlvbnMgb3B0aW9ucyA9IDM7Cit9CisKKy8vIERlc2NyaWJlcyBhIG1ldGhvZCBvZiBhIHNlcnZpY2UuCittZXNzYWdlIE1ldGhvZERlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKworICAvLyBJbnB1dCBhbmQgb3V0cHV0IHR5cGUgbmFtZXMuICBUaGVzZSBhcmUgcmVzb2x2ZWQgaW4gdGhlIHNhbWUgd2F5IGFzCisgIC8vIEZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSwgYnV0IG11c3QgcmVmZXIgdG8gYSBtZXNzYWdlIHR5cGUuCisgIG9wdGlvbmFsIHN0cmluZyBpbnB1dF90eXBlID0gMjsKKyAgb3B0aW9uYWwgc3RyaW5nIG91dHB1dF90eXBlID0gMzsKKworICBvcHRpb25hbCBNZXRob2RPcHRpb25zIG9wdGlvbnMgPSA0OworCisgIC8vIElkZW50aWZpZXMgaWYgY2xpZW50IHN0cmVhbXMgbXVsdGlwbGUgY2xpZW50IG1lc3NhZ2VzCisgIG9wdGlvbmFsIGJvb2wgY2xpZW50X3N0cmVhbWluZyA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CisgIC8vIElkZW50aWZpZXMgaWYgc2VydmVyIHN0cmVhbXMgbXVsdGlwbGUgc2VydmVyIG1lc3NhZ2VzCisgIG9wdGlvbmFsIGJvb2wgc2VydmVyX3N0cmVhbWluZyA9IDYgW2RlZmF1bHQgPSBmYWxzZV07Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gT3B0aW9ucworCisvLyBFYWNoIG9mIHRoZSBkZWZpbml0aW9ucyBhYm92ZSBtYXkgaGF2ZSAib3B0aW9ucyIgYXR0YWNoZWQuICBUaGVzZSBhcmUKKy8vIGp1c3QgYW5ub3RhdGlvbnMgd2hpY2ggbWF5IGNhdXNlIGNvZGUgdG8gYmUgZ2VuZXJhdGVkIHNsaWdodGx5IGRpZmZlcmVudGx5CisvLyBvciBtYXkgY29udGFpbiBoaW50cyBmb3IgY29kZSB0aGF0IG1hbmlwdWxhdGVzIHByb3RvY29sIG1lc3NhZ2VzLgorLy8KKy8vIENsaWVudHMgbWF5IGRlZmluZSBjdXN0b20gb3B0aW9ucyBhcyBleHRlbnNpb25zIG9mIHRoZSAqT3B0aW9ucyBtZXNzYWdlcy4KKy8vIFRoZXNlIGV4dGVuc2lvbnMgbWF5IG5vdCB5ZXQgYmUga25vd24gYXQgcGFyc2luZyB0aW1lLCBzbyB0aGUgcGFyc2VyIGNhbm5vdAorLy8gc3RvcmUgdGhlIHZhbHVlcyBpbiB0aGVtLiAgSW5zdGVhZCBpdCBzdG9yZXMgdGhlbSBpbiBhIGZpZWxkIGluIHRoZSAqT3B0aW9ucworLy8gbWVzc2FnZSBjYWxsZWQgdW5pbnRlcnByZXRlZF9vcHRpb24uIFRoaXMgZmllbGQgbXVzdCBoYXZlIHRoZSBzYW1lIG5hbWUKKy8vIGFjcm9zcyBhbGwgKk9wdGlvbnMgbWVzc2FnZXMuIFdlIHRoZW4gdXNlIHRoaXMgZmllbGQgdG8gcG9wdWxhdGUgdGhlCisvLyBleHRlbnNpb25zIHdoZW4gd2UgYnVpbGQgYSBkZXNjcmlwdG9yLCBhdCB3aGljaCBwb2ludCBhbGwgcHJvdG9zIGhhdmUgYmVlbgorLy8gcGFyc2VkIGFuZCBzbyBhbGwgZXh0ZW5zaW9ucyBhcmUga25vd24uCisvLworLy8gRXh0ZW5zaW9uIG51bWJlcnMgZm9yIGN1c3RvbSBvcHRpb25zIG1heSBiZSBjaG9zZW4gYXMgZm9sbG93czoKKy8vICogRm9yIG9wdGlvbnMgd2hpY2ggd2lsbCBvbmx5IGJlIHVzZWQgd2l0aGluIGEgc2luZ2xlIGFwcGxpY2F0aW9uIG9yCisvLyAgIG9yZ2FuaXphdGlvbiwgb3IgZm9yIGV4cGVyaW1lbnRhbCBvcHRpb25zLCB1c2UgZmllbGQgbnVtYmVycyA1MDAwMAorLy8gICB0aHJvdWdoIDk5OTk5LiAgSXQgaXMgdXAgdG8geW91IHRvIGVuc3VyZSB0aGF0IHlvdSBkbyBub3QgdXNlIHRoZQorLy8gICBzYW1lIG51bWJlciBmb3IgbXVsdGlwbGUgb3B0aW9ucy4KKy8vICogRm9yIG9wdGlvbnMgd2hpY2ggd2lsbCBiZSBwdWJsaXNoZWQgYW5kIHVzZWQgcHVibGljbHkgYnkgbXVsdGlwbGUKKy8vICAgaW5kZXBlbmRlbnQgZW50aXRpZXMsIGUtbWFpbCBwcm90b2J1Zi1nbG9iYWwtZXh0ZW5zaW9uLXJlZ2lzdHJ5QGdvb2dsZS5jb20KKy8vICAgdG8gcmVzZXJ2ZSBleHRlbnNpb24gbnVtYmVycy4gU2ltcGx5IHByb3ZpZGUgeW91ciBwcm9qZWN0IG5hbWUgKGUuZy4KKy8vICAgT2JqZWN0aXZlLUMgcGx1Z2luKSBhbmQgeW91ciBwcm9qZWN0IHdlYnNpdGUgKGlmIGF2YWlsYWJsZSkgLS0gdGhlcmUncyBubworLy8gICBuZWVkIHRvIGV4cGxhaW4gaG93IHlvdSBpbnRlbmQgdG8gdXNlIHRoZW0uIFVzdWFsbHkgeW91IG9ubHkgbmVlZCBvbmUKKy8vICAgZXh0ZW5zaW9uIG51bWJlci4gWW91IGNhbiBkZWNsYXJlIG11bHRpcGxlIG9wdGlvbnMgd2l0aCBvbmx5IG9uZSBleHRlbnNpb24KKy8vICAgbnVtYmVyIGJ5IHB1dHRpbmcgdGhlbSBpbiBhIHN1Yi1tZXNzYWdlLiBTZWUgdGhlIEN1c3RvbSBPcHRpb25zIHNlY3Rpb24gb2YKKy8vICAgdGhlIGRvY3MgZm9yIGV4YW1wbGVzOgorLy8gICBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8jb3B0aW9ucworLy8gICBJZiB0aGlzIHR1cm5zIG91dCB0byBiZSBwb3B1bGFyLCBhIHdlYiBzZXJ2aWNlIHdpbGwgYmUgc2V0IHVwCisvLyAgIHRvIGF1dG9tYXRpY2FsbHkgYXNzaWduIG9wdGlvbiBudW1iZXJzLgorCittZXNzYWdlIEZpbGVPcHRpb25zIHsKKworICAvLyBTZXRzIHRoZSBKYXZhIHBhY2thZ2Ugd2hlcmUgY2xhc3NlcyBnZW5lcmF0ZWQgZnJvbSB0aGlzIC5wcm90byB3aWxsIGJlCisgIC8vIHBsYWNlZC4gIEJ5IGRlZmF1bHQsIHRoZSBwcm90byBwYWNrYWdlIGlzIHVzZWQsIGJ1dCB0aGlzIGlzIG9mdGVuCisgIC8vIGluYXBwcm9wcmlhdGUgYmVjYXVzZSBwcm90byBwYWNrYWdlcyBkbyBub3Qgbm9ybWFsbHkgc3RhcnQgd2l0aCBiYWNrd2FyZHMKKyAgLy8gZG9tYWluIG5hbWVzLgorICBvcHRpb25hbCBzdHJpbmcgamF2YV9wYWNrYWdlID0gMTsKKworCisgIC8vIENvbnRyb2xzIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVyIEphdmEgY2xhc3MgZ2VuZXJhdGVkIGZvciB0aGUgLnByb3RvIGZpbGUuCisgIC8vIFRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgY29udGFpbiB0aGUgLnByb3RvIGZpbGUncyBnZXREZXNjcmlwdG9yKCkgbWV0aG9kIGFzCisgIC8vIHdlbGwgYXMgYW55IHRvcC1sZXZlbCBleHRlbnNpb25zIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICAvLyBJZiBqYXZhX211bHRpcGxlX2ZpbGVzIGlzIGRpc2FibGVkLCB0aGVuIGFsbCB0aGUgb3RoZXIgY2xhc3NlcyBmcm9tIHRoZQorICAvLyAucHJvdG8gZmlsZSB3aWxsIGJlIG5lc3RlZCBpbnNpZGUgdGhlIHNpbmdsZSB3cmFwcGVyIG91dGVyIGNsYXNzLgorICBvcHRpb25hbCBzdHJpbmcgamF2YV9vdXRlcl9jbGFzc25hbWUgPSA4OworCisgIC8vIElmIGVuYWJsZWQsIHRoZW4gdGhlIEphdmEgY29kZSBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZSBhIHNlcGFyYXRlIC5qYXZhCisgIC8vIGZpbGUgZm9yIGVhY2ggdG9wLWxldmVsIG1lc3NhZ2UsIGVudW0sIGFuZCBzZXJ2aWNlIGRlZmluZWQgaW4gdGhlIC5wcm90bworICAvLyBmaWxlLiAgVGh1cywgdGhlc2UgdHlwZXMgd2lsbCAqbm90KiBiZSBuZXN0ZWQgaW5zaWRlIHRoZSB3cmFwcGVyIGNsYXNzCisgIC8vIG5hbWVkIGJ5IGphdmFfb3V0ZXJfY2xhc3NuYW1lLiAgSG93ZXZlciwgdGhlIHdyYXBwZXIgY2xhc3Mgd2lsbCBzdGlsbCBiZQorICAvLyBnZW5lcmF0ZWQgdG8gY29udGFpbiB0aGUgZmlsZSdzIGdldERlc2NyaXB0b3IoKSBtZXRob2QgYXMgd2VsbCBhcyBhbnkKKyAgLy8gdG9wLWxldmVsIGV4dGVuc2lvbnMgZGVmaW5lZCBpbiB0aGUgZmlsZS4KKyAgb3B0aW9uYWwgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07CisKKyAgLy8gVGhpcyBvcHRpb24gZG9lcyBub3RoaW5nLgorICBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gMjAgW2RlcHJlY2F0ZWQ9dHJ1ZV07CisKKyAgLy8gSWYgc2V0IHRydWUsIHRoZW4gdGhlIEphdmEyIGNvZGUgZ2VuZXJhdG9yIHdpbGwgZ2VuZXJhdGUgY29kZSB0aGF0CisgIC8vIHRocm93cyBhbiBleGNlcHRpb24gd2hlbmV2ZXIgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFzc2lnbiBhIG5vbi1VVEYtOAorICAvLyBieXRlIHNlcXVlbmNlIHRvIGEgc3RyaW5nIGZpZWxkLgorICAvLyBNZXNzYWdlIHJlZmxlY3Rpb24gd2lsbCBkbyB0aGUgc2FtZS4KKyAgLy8gSG93ZXZlciwgYW4gZXh0ZW5zaW9uIGZpZWxkIHN0aWxsIGFjY2VwdHMgbm9uLVVURi04IGJ5dGUgc2VxdWVuY2VzLgorICAvLyBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHdoZW4gdXNlZCB3aXRoIHRoZSBsaXRlIHJ1bnRpbWUuCisgIG9wdGlvbmFsIGJvb2wgamF2YV9zdHJpbmdfY2hlY2tfdXRmOCA9IDI3IFtkZWZhdWx0ID0gZmFsc2VdOworCisKKyAgLy8gR2VuZXJhdGVkIGNsYXNzZXMgY2FuIGJlIG9wdGltaXplZCBmb3Igc3BlZWQgb3IgY29kZSBzaXplLgorICBlbnVtIE9wdGltaXplTW9kZSB7CisgICAgU1BFRUQgPSAxOyAgICAgICAgIC8vIEdlbmVyYXRlIGNvbXBsZXRlIGNvZGUgZm9yIHBhcnNpbmcsIHNlcmlhbGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGV0Yy4KKyAgICBDT0RFX1NJWkUgPSAyOyAgICAgLy8gVXNlIFJlZmxlY3Rpb25PcHMgdG8gaW1wbGVtZW50IHRoZXNlIG1ldGhvZHMuCisgICAgTElURV9SVU5USU1FID0gMzsgIC8vIEdlbmVyYXRlIGNvZGUgdXNpbmcgTWVzc2FnZUxpdGUgYW5kIHRoZSBsaXRlIHJ1bnRpbWUuCisgIH0KKyAgb3B0aW9uYWwgT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQgPSBTUEVFRF07CisKKyAgLy8gU2V0cyB0aGUgR28gcGFja2FnZSB3aGVyZSBzdHJ1Y3RzIGdlbmVyYXRlZCBmcm9tIHRoaXMgLnByb3RvIHdpbGwgYmUKKyAgLy8gcGxhY2VkLiBJZiBvbWl0dGVkLCB0aGUgR28gcGFja2FnZSB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGUgZm9sbG93aW5nOgorICAvLyAgIC0gVGhlIGJhc2VuYW1lIG9mIHRoZSBwYWNrYWdlIGltcG9ydCBwYXRoLCBpZiBwcm92aWRlZC4KKyAgLy8gICAtIE90aGVyd2lzZSwgdGhlIHBhY2thZ2Ugc3RhdGVtZW50IGluIHRoZSAucHJvdG8gZmlsZSwgaWYgcHJlc2VudC4KKyAgLy8gICAtIE90aGVyd2lzZSwgdGhlIGJhc2VuYW1lIG9mIHRoZSAucHJvdG8gZmlsZSwgd2l0aG91dCBleHRlbnNpb24uCisgIG9wdGlvbmFsIHN0cmluZyBnb19wYWNrYWdlID0gMTE7CisKKworCisKKyAgLy8gU2hvdWxkIGdlbmVyaWMgc2VydmljZXMgYmUgZ2VuZXJhdGVkIGluIGVhY2ggbGFuZ3VhZ2U/ICAiR2VuZXJpYyIgc2VydmljZXMKKyAgLy8gYXJlIG5vdCBzcGVjaWZpYyB0byBhbnkgcGFydGljdWxhciBSUEMgc3lzdGVtLiAgVGhleSBhcmUgZ2VuZXJhdGVkIGJ5IHRoZQorICAvLyBtYWluIGNvZGUgZ2VuZXJhdG9ycyBpbiBlYWNoIGxhbmd1YWdlICh3aXRob3V0IGFkZGl0aW9uYWwgcGx1Z2lucykuCisgIC8vIEdlbmVyaWMgc2VydmljZXMgd2VyZSB0aGUgb25seSBraW5kIG9mIHNlcnZpY2UgZ2VuZXJhdGlvbiBzdXBwb3J0ZWQgYnkKKyAgLy8gZWFybHkgdmVyc2lvbnMgb2YgZ29vZ2xlLnByb3RvYnVmLgorICAvLworICAvLyBHZW5lcmljIHNlcnZpY2VzIGFyZSBub3cgY29uc2lkZXJlZCBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHVzaW5nIHBsdWdpbnMKKyAgLy8gdGhhdCBnZW5lcmF0ZSBjb2RlIHNwZWNpZmljIHRvIHlvdXIgcGFydGljdWxhciBSUEMgc3lzdGVtLiAgVGhlcmVmb3JlLAorICAvLyB0aGVzZSBkZWZhdWx0IHRvIGZhbHNlLiAgT2xkIGNvZGUgd2hpY2ggZGVwZW5kcyBvbiBnZW5lcmljIHNlcnZpY2VzIHNob3VsZAorICAvLyBleHBsaWNpdGx5IHNldCB0aGVtIHRvIHRydWUuCisgIG9wdGlvbmFsIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IDE2IFtkZWZhdWx0ID0gZmFsc2VdOworICBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0ID0gZmFsc2VdOworICBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgb3B0aW9uYWwgYm9vbCBwaHBfZ2VuZXJpY19zZXJ2aWNlcyA9IDQyIFtkZWZhdWx0ID0gZmFsc2VdOworCisgIC8vIElzIHRoaXMgZmlsZSBkZXByZWNhdGVkPworICAvLyBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCisgIC8vIGZvciBldmVyeXRoaW5nIGluIHRoZSBmaWxlLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkKKyAgLy8gbGVhc3QsIHRoaXMgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBmaWxlcy4KKyAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMjMgW2RlZmF1bHQgPSBmYWxzZV07CisKKyAgLy8gRW5hYmxlcyB0aGUgdXNlIG9mIGFyZW5hcyBmb3IgdGhlIHByb3RvIG1lc3NhZ2VzIGluIHRoaXMgZmlsZS4gVGhpcyBhcHBsaWVzCisgIC8vIG9ubHkgdG8gZ2VuZXJhdGVkIGNsYXNzZXMgZm9yIEMrKy4KKyAgb3B0aW9uYWwgYm9vbCBjY19lbmFibGVfYXJlbmFzID0gMzEgW2RlZmF1bHQgPSB0cnVlXTsKKworCisgIC8vIFNldHMgdGhlIG9iamVjdGl2ZSBjIGNsYXNzIHByZWZpeCB3aGljaCBpcyBwcmVwZW5kZWQgdG8gYWxsIG9iamVjdGl2ZSBjCisgIC8vIGdlbmVyYXRlZCBjbGFzc2VzIGZyb20gdGhpcyAucHJvdG8uIFRoZXJlIGlzIG5vIGRlZmF1bHQuCisgIG9wdGlvbmFsIHN0cmluZyBvYmpjX2NsYXNzX3ByZWZpeCA9IDM2OworCisgIC8vIE5hbWVzcGFjZSBmb3IgZ2VuZXJhdGVkIGNsYXNzZXM7IGRlZmF1bHRzIHRvIHRoZSBwYWNrYWdlLgorICBvcHRpb25hbCBzdHJpbmcgY3NoYXJwX25hbWVzcGFjZSA9IDM3OworCisgIC8vIEJ5IGRlZmF1bHQgU3dpZnQgZ2VuZXJhdG9ycyB3aWxsIHRha2UgdGhlIHByb3RvIHBhY2thZ2UgYW5kIENhbWVsQ2FzZSBpdAorICAvLyByZXBsYWNpbmcgJy4nIHdpdGggdW5kZXJzY29yZSBhbmQgdXNlIHRoYXQgdG8gcHJlZml4IHRoZSB0eXBlcy9zeW1ib2xzCisgIC8vIGRlZmluZWQuIFdoZW4gdGhpcyBvcHRpb25zIGlzIHByb3ZpZGVkLCB0aGV5IHdpbGwgdXNlIHRoaXMgdmFsdWUgaW5zdGVhZAorICAvLyB0byBwcmVmaXggdGhlIHR5cGVzL3N5bWJvbHMgZGVmaW5lZC4KKyAgb3B0aW9uYWwgc3RyaW5nIHN3aWZ0X3ByZWZpeCA9IDM5OworCisgIC8vIFNldHMgdGhlIHBocCBjbGFzcyBwcmVmaXggd2hpY2ggaXMgcHJlcGVuZGVkIHRvIGFsbCBwaHAgZ2VuZXJhdGVkIGNsYXNzZXMKKyAgLy8gZnJvbSB0aGlzIC5wcm90by4gRGVmYXVsdCBpcyBlbXB0eS4KKyAgb3B0aW9uYWwgc3RyaW5nIHBocF9jbGFzc19wcmVmaXggPSA0MDsKKworICAvLyBVc2UgdGhpcyBvcHRpb24gdG8gY2hhbmdlIHRoZSBuYW1lc3BhY2Ugb2YgcGhwIGdlbmVyYXRlZCBjbGFzc2VzLiBEZWZhdWx0CisgIC8vIGlzIGVtcHR5LiBXaGVuIHRoaXMgb3B0aW9uIGlzIGVtcHR5LCB0aGUgcGFja2FnZSBuYW1lIHdpbGwgYmUgdXNlZCBmb3IKKyAgLy8gZGV0ZXJtaW5pbmcgdGhlIG5hbWVzcGFjZS4KKyAgb3B0aW9uYWwgc3RyaW5nIHBocF9uYW1lc3BhY2UgPSA0MTsKKworICAvLyBVc2UgdGhpcyBvcHRpb24gdG8gY2hhbmdlIHRoZSBuYW1lc3BhY2Ugb2YgcGhwIGdlbmVyYXRlZCBtZXRhZGF0YSBjbGFzc2VzLgorICAvLyBEZWZhdWx0IGlzIGVtcHR5LiBXaGVuIHRoaXMgb3B0aW9uIGlzIGVtcHR5LCB0aGUgcHJvdG8gZmlsZSBuYW1lIHdpbGwgYmUKKyAgLy8gdXNlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIG5hbWVzcGFjZS4KKyAgb3B0aW9uYWwgc3RyaW5nIHBocF9tZXRhZGF0YV9uYW1lc3BhY2UgPSA0NDsKKworICAvLyBVc2UgdGhpcyBvcHRpb24gdG8gY2hhbmdlIHRoZSBwYWNrYWdlIG9mIHJ1YnkgZ2VuZXJhdGVkIGNsYXNzZXMuIERlZmF1bHQKKyAgLy8gaXMgZW1wdHkuIFdoZW4gdGhpcyBvcHRpb24gaXMgbm90IHNldCwgdGhlIHBhY2thZ2UgbmFtZSB3aWxsIGJlIHVzZWQgZm9yCisgIC8vIGRldGVybWluaW5nIHRoZSBydWJ5IHBhY2thZ2UuCisgIG9wdGlvbmFsIHN0cmluZyBydWJ5X3BhY2thZ2UgPSA0NTsKKworCisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4KKyAgLy8gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgIk9wdGlvbnMiIHNlY3Rpb24gYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLgorICAvLyBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSAiT3B0aW9ucyIgc2VjdGlvbiBhYm92ZS4KKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKKworICByZXNlcnZlZCAzODsKK30KKworbWVzc2FnZSBNZXNzYWdlT3B0aW9ucyB7CisgIC8vIFNldCB0cnVlIHRvIHVzZSB0aGUgb2xkIHByb3RvMSBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0IGZvciBleHRlbnNpb25zLgorICAvLyBUaGlzIGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBNZXNzYWdlU2V0IHdpcmUKKyAgLy8gZm9ybWF0LiAgWW91IHNob3VsZCBub3QgdXNlIHRoaXMgZm9yIGFueSBvdGhlciByZWFzb246ICBJdCdzIGxlc3MKKyAgLy8gZWZmaWNpZW50LCBoYXMgZmV3ZXIgZmVhdHVyZXMsIGFuZCBpcyBtb3JlIGNvbXBsaWNhdGVkLgorICAvLworICAvLyBUaGUgbWVzc2FnZSBtdXN0IGJlIGRlZmluZWQgZXhhY3RseSBhcyBmb2xsb3dzOgorICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICAgIG9wdGlvbiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IHRydWU7CisgIC8vICAgICBleHRlbnNpb25zIDQgdG8gbWF4OworICAvLyAgIH0KKyAgLy8gTm90ZSB0aGF0IHRoZSBtZXNzYWdlIGNhbm5vdCBoYXZlIGFueSBkZWZpbmVkIGZpZWxkczsgTWVzc2FnZVNldHMgb25seQorICAvLyBoYXZlIGV4dGVuc2lvbnMuCisgIC8vCisgIC8vIEFsbCBleHRlbnNpb25zIG9mIHlvdXIgdHlwZSBtdXN0IGJlIHNpbmd1bGFyIG1lc3NhZ2VzOyBlLmcuIHRoZXkgY2Fubm90CisgIC8vIGJlIGludDMycywgZW51bXMsIG9yIHJlcGVhdGVkIG1lc3NhZ2VzLgorICAvLworICAvLyBCZWNhdXNlIHRoaXMgaXMgYW4gb3B0aW9uLCB0aGUgYWJvdmUgdHdvIHJlc3RyaWN0aW9ucyBhcmUgbm90IGVuZm9yY2VkIGJ5CisgIC8vIHRoZSBwcm90b2NvbCBjb21waWxlci4KKyAgb3B0aW9uYWwgYm9vbCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IDEgW2RlZmF1bHQgPSBmYWxzZV07CisKKyAgLy8gRGlzYWJsZXMgdGhlIGdlbmVyYXRpb24gb2YgdGhlIHN0YW5kYXJkICJkZXNjcmlwdG9yKCkiIGFjY2Vzc29yLCB3aGljaCBjYW4KKyAgLy8gY29uZmxpY3Qgd2l0aCBhIGZpZWxkIG9mIHRoZSBzYW1lIG5hbWUuICBUaGlzIGlzIG1lYW50IHRvIG1ha2UgbWlncmF0aW9uCisgIC8vIGZyb20gcHJvdG8xIGVhc2llcjsgbmV3IGNvZGUgc2hvdWxkIGF2b2lkIGZpZWxkcyBuYW1lZCAiZGVzY3JpcHRvciIuCisgIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CisKKyAgLy8gSXMgdGhpcyBtZXNzYWdlIGRlcHJlY2F0ZWQ/CisgIC8vIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKKyAgLy8gZm9yIHRoZSBtZXNzYWdlLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsCisgIC8vIHRoaXMgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBtZXNzYWdlcy4KKyAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKKworICByZXNlcnZlZCA0LCA1LCA2OworCisgIC8vIFdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgYW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFwIGVudHJ5IHR5cGUgZm9yIHRoZQorICAvLyBtYXBzIGZpZWxkLgorICAvLworICAvLyBGb3IgbWFwcyBmaWVsZHM6CisgIC8vICAgICBtYXA8S2V5VHlwZSwgVmFsdWVUeXBlPiBtYXBfZmllbGQgPSAxOworICAvLyBUaGUgcGFyc2VkIGRlc2NyaXB0b3IgbG9va3MgbGlrZToKKyAgLy8gICAgIG1lc3NhZ2UgTWFwRmllbGRFbnRyeSB7CisgIC8vICAgICAgICAgb3B0aW9uIG1hcF9lbnRyeSA9IHRydWU7CisgIC8vICAgICAgICAgb3B0aW9uYWwgS2V5VHlwZSBrZXkgPSAxOworICAvLyAgICAgICAgIG9wdGlvbmFsIFZhbHVlVHlwZSB2YWx1ZSA9IDI7CisgIC8vICAgICB9CisgIC8vICAgICByZXBlYXRlZCBNYXBGaWVsZEVudHJ5IG1hcF9maWVsZCA9IDE7CisgIC8vCisgIC8vIEltcGxlbWVudGF0aW9ucyBtYXkgY2hvb3NlIG5vdCB0byBnZW5lcmF0ZSB0aGUgbWFwX2VudHJ5PXRydWUgbWVzc2FnZSwgYnV0CisgIC8vIHVzZSBhIG5hdGl2ZSBtYXAgaW4gdGhlIHRhcmdldCBsYW5ndWFnZSB0byBob2xkIHRoZSBrZXlzIGFuZCB2YWx1ZXMuCisgIC8vIFRoZSByZWZsZWN0aW9uIEFQSXMgaW4gc3VjaCBpbXBsZW1lbnRhdGlvbnMgc3RpbGwgbmVlZCB0byB3b3JrIGFzCisgIC8vIGlmIHRoZSBmaWVsZCBpcyBhIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGQuCisgIC8vCisgIC8vIE5PVEU6IERvIG5vdCBzZXQgdGhlIG9wdGlvbiBpbiAucHJvdG8gZmlsZXMuIEFsd2F5cyB1c2UgdGhlIG1hcHMgc3ludGF4CisgIC8vIGluc3RlYWQuIFRoZSBvcHRpb24gc2hvdWxkIG9ubHkgYmUgaW1wbGljaXRseSBzZXQgYnkgdGhlIHByb3RvIGNvbXBpbGVyCisgIC8vIHBhcnNlci4KKyAgb3B0aW9uYWwgYm9vbCBtYXBfZW50cnkgPSA3OworCisgIHJlc2VydmVkIDg7ICAvLyBqYXZhbGl0ZV9zZXJpYWxpemFibGUKKyAgcmVzZXJ2ZWQgOTsgIC8vIGphdmFuYW5vX2FzX2xpdGUKKworCisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCittZXNzYWdlIEZpZWxkT3B0aW9ucyB7CisgIC8vIFRoZSBjdHlwZSBvcHRpb24gaW5zdHJ1Y3RzIHRoZSBDKysgY29kZSBnZW5lcmF0b3IgdG8gdXNlIGEgZGlmZmVyZW50CisgIC8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmaWVsZCB0aGFuIGl0IG5vcm1hbGx5IHdvdWxkLiAgU2VlIHRoZSBzcGVjaWZpYworICAvLyBvcHRpb25zIGJlbG93LiAgVGhpcyBvcHRpb24gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiB0aGUgb3BlbiBzb3VyY2UKKyAgLy8gcmVsZWFzZSAtLSBzb3JyeSwgd2UnbGwgdHJ5IHRvIGluY2x1ZGUgaXQgaW4gYSBmdXR1cmUgdmVyc2lvbiEKKyAgb3B0aW9uYWwgQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKKyAgZW51bSBDVHlwZSB7CisgICAgLy8gRGVmYXVsdCBtb2RlLgorICAgIFNUUklORyA9IDA7CisKKyAgICBDT1JEID0gMTsKKworICAgIFNUUklOR19QSUVDRSA9IDI7CisgIH0KKyAgLy8gVGhlIHBhY2tlZCBvcHRpb24gY2FuIGJlIGVuYWJsZWQgZm9yIHJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZHMgdG8gZW5hYmxlCisgIC8vIGEgbW9yZSBlZmZpY2llbnQgcmVwcmVzZW50YXRpb24gb24gdGhlIHdpcmUuIFJhdGhlciB0aGFuIHJlcGVhdGVkbHkKKyAgLy8gd3JpdGluZyB0aGUgdGFnIGFuZCB0eXBlIGZvciBlYWNoIGVsZW1lbnQsIHRoZSBlbnRpcmUgYXJyYXkgaXMgZW5jb2RlZCBhcworICAvLyBhIHNpbmdsZSBsZW5ndGgtZGVsaW1pdGVkIGJsb2IuIEluIHByb3RvMywgb25seSBleHBsaWNpdCBzZXR0aW5nIGl0IHRvCisgIC8vIGZhbHNlIHdpbGwgYXZvaWQgdXNpbmcgcGFja2VkIGVuY29kaW5nLgorICBvcHRpb25hbCBib29sIHBhY2tlZCA9IDI7CisKKyAgLy8gVGhlIGpzdHlwZSBvcHRpb24gZGV0ZXJtaW5lcyB0aGUgSmF2YVNjcmlwdCB0eXBlIHVzZWQgZm9yIHZhbHVlcyBvZiB0aGUKKyAgLy8gZmllbGQuICBUaGUgb3B0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGZvciA2NCBiaXQgaW50ZWdyYWwgYW5kIGZpeGVkIHR5cGVzCisgIC8vIChpbnQ2NCwgdWludDY0LCBzaW50NjQsIGZpeGVkNjQsIHNmaXhlZDY0KS4gIEEgZmllbGQgd2l0aCBqc3R5cGUgSlNfU1RSSU5HCisgIC8vIGlzIHJlcHJlc2VudGVkIGFzIEphdmFTY3JpcHQgc3RyaW5nLCB3aGljaCBhdm9pZHMgbG9zcyBvZiBwcmVjaXNpb24gdGhhdAorICAvLyBjYW4gaGFwcGVuIHdoZW4gYSBsYXJnZSB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBmbG9hdGluZyBwb2ludCBKYXZhU2NyaXB0LgorICAvLyBTcGVjaWZ5aW5nIEpTX05VTUJFUiBmb3IgdGhlIGpzdHlwZSBjYXVzZXMgdGhlIGdlbmVyYXRlZCBKYXZhU2NyaXB0IGNvZGUgdG8KKyAgLy8gdXNlIHRoZSBKYXZhU2NyaXB0ICJudW1iZXIiIHR5cGUuICBUaGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQgb3B0aW9uCisgIC8vIEpTX05PUk1BTCBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuCisgIC8vCisgIC8vIFRoaXMgb3B0aW9uIGlzIGFuIGVudW0gdG8gcGVybWl0IGFkZGl0aW9uYWwgdHlwZXMgdG8gYmUgYWRkZWQsIGUuZy4KKyAgLy8gZ29vZy5tYXRoLkludGVnZXIuCisgIG9wdGlvbmFsIEpTVHlwZSBqc3R5cGUgPSA2IFtkZWZhdWx0ID0gSlNfTk9STUFMXTsKKyAgZW51bSBKU1R5cGUgeworICAgIC8vIFVzZSB0aGUgZGVmYXVsdCB0eXBlLgorICAgIEpTX05PUk1BTCA9IDA7CisKKyAgICAvLyBVc2UgSmF2YVNjcmlwdCBzdHJpbmdzLgorICAgIEpTX1NUUklORyA9IDE7CisKKyAgICAvLyBVc2UgSmF2YVNjcmlwdCBudW1iZXJzLgorICAgIEpTX05VTUJFUiA9IDI7CisgIH0KKworICAvLyBTaG91bGQgdGhpcyBmaWVsZCBiZSBwYXJzZWQgbGF6aWx5PyAgTGF6eSBhcHBsaWVzIG9ubHkgdG8gbWVzc2FnZS10eXBlCisgIC8vIGZpZWxkcy4gIEl0IG1lYW5zIHRoYXQgd2hlbiB0aGUgb3V0ZXIgbWVzc2FnZSBpcyBpbml0aWFsbHkgcGFyc2VkLCB0aGUKKyAgLy8gaW5uZXIgbWVzc2FnZSdzIGNvbnRlbnRzIHdpbGwgbm90IGJlIHBhcnNlZCBidXQgaW5zdGVhZCBzdG9yZWQgaW4gZW5jb2RlZAorICAvLyBmb3JtLiAgVGhlIGlubmVyIG1lc3NhZ2Ugd2lsbCBhY3R1YWxseSBiZSBwYXJzZWQgd2hlbiBpdCBpcyBmaXJzdCBhY2Nlc3NlZC4KKyAgLy8KKyAgLy8gVGhpcyBpcyBvbmx5IGEgaGludC4gIEltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0byBjaG9vc2Ugd2hldGhlciB0byB1c2UKKyAgLy8gZWFnZXIgb3IgbGF6eSBwYXJzaW5nIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uLiAgSG93ZXZlciwKKyAgLy8gc2V0dGluZyB0aGlzIG9wdGlvbiB0cnVlIHN1Z2dlc3RzIHRoYXQgdGhlIHByb3RvY29sIGF1dGhvciBiZWxpZXZlcyB0aGF0CisgIC8vIHVzaW5nIGxhenkgcGFyc2luZyBvbiB0aGlzIGZpZWxkIGlzIHdvcnRoIHRoZSBhZGRpdGlvbmFsIGJvb2trZWVwaW5nCisgIC8vIG92ZXJoZWFkIHR5cGljYWxseSBuZWVkZWQgdG8gaW1wbGVtZW50IGl0LgorICAvLworICAvLyBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIHB1YmxpYyBpbnRlcmZhY2Ugb2YgYW55IGdlbmVyYXRlZCBjb2RlOworICAvLyBhbGwgbWV0aG9kIHNpZ25hdHVyZXMgcmVtYWluIHRoZSBzYW1lLiAgRnVydGhlcm1vcmUsIHRocmVhZC1zYWZldHkgb2YgdGhlCisgIC8vIGludGVyZmFjZSBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyBvcHRpb247IGNvbnN0IG1ldGhvZHMgcmVtYWluIHNhZmUgdG8KKyAgLy8gY2FsbCBmcm9tIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LCB3aGlsZSBub24tY29uc3QgbWV0aG9kcyBjb250aW51ZQorICAvLyB0byByZXF1aXJlIGV4Y2x1c2l2ZSBhY2Nlc3MuCisgIC8vCisgIC8vCisgIC8vIE5vdGUgdGhhdCBpbXBsZW1lbnRhdGlvbnMgbWF5IGNob29zZSBub3QgdG8gY2hlY2sgcmVxdWlyZWQgZmllbGRzIHdpdGhpbgorICAvLyBhIGxhenkgc3ViLW1lc3NhZ2UuICBUaGF0IGlzLCBjYWxsaW5nIElzSW5pdGlhbGl6ZWQoKSBvbiB0aGUgb3V0ZXIgbWVzc2FnZQorICAvLyBtYXkgcmV0dXJuIHRydWUgZXZlbiBpZiB0aGUgaW5uZXIgbWVzc2FnZSBoYXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBpbm5lciBtZXNzYWdlIHdvdWxkIGhhdmUgdG8gYmUKKyAgLy8gcGFyc2VkIGluIG9yZGVyIHRvIHBlcmZvcm0gdGhlIGNoZWNrLCBkZWZlYXRpbmcgdGhlIHB1cnBvc2Ugb2YgbGF6eQorICAvLyBwYXJzaW5nLiAgQW4gaW1wbGVtZW50YXRpb24gd2hpY2ggY2hvb3NlcyBub3QgdG8gY2hlY2sgcmVxdWlyZWQgZmllbGRzCisgIC8vIG11c3QgYmUgY29uc2lzdGVudCBhYm91dCBpdC4gIFRoYXQgaXMsIGZvciBhbnkgcGFydGljdWxhciBzdWItbWVzc2FnZSwgdGhlCisgIC8vIGltcGxlbWVudGF0aW9uIG11c3QgZWl0aGVyICphbHdheXMqIGNoZWNrIGl0cyByZXF1aXJlZCBmaWVsZHMsIG9yICpuZXZlcioKKyAgLy8gY2hlY2sgaXRzIHJlcXVpcmVkIGZpZWxkcywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgbWVzc2FnZSBoYXMKKyAgLy8gYmVlbiBwYXJzZWQuCisgIC8vCisgIC8vIEFzIG9mIDIwMjEsIGxhenkgZG9lcyBubyBjb3JyZWN0bmVzcyBjaGVja3Mgb24gdGhlIGJ5dGUgc3RyZWFtIGR1cmluZworICAvLyBwYXJzaW5nLiAgVGhpcyBtYXkgbGVhZCB0byBjcmFzaGVzIGlmIGFuZCB3aGVuIGFuIGludmFsaWQgYnl0ZSBzdHJlYW0gaXMKKyAgLy8gZmluYWxseSBwYXJzZWQgdXBvbiBhY2Nlc3MuCisgIC8vCisgIC8vIFRPRE8oYi8yMTE5MDYxMTMpOiAgRW5hYmxlIHZhbGlkYXRpb24gb24gbGF6eSBmaWVsZHMuCisgIG9wdGlvbmFsIGJvb2wgbGF6eSA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CisKKyAgLy8gdW52ZXJpZmllZF9sYXp5IGRvZXMgbm8gY29ycmVjdG5lc3MgY2hlY2tzIG9uIHRoZSBieXRlIHN0cmVhbS4gVGhpcyBzaG91bGQKKyAgLy8gb25seSBiZSB1c2VkIHdoZXJlIGxhenkgd2l0aCB2ZXJpZmljYXRpb24gaXMgcHJvaGliaXRpdmUgZm9yIHBlcmZvcm1hbmNlCisgIC8vIHJlYXNvbnMuCisgIG9wdGlvbmFsIGJvb2wgdW52ZXJpZmllZF9sYXp5ID0gMTUgW2RlZmF1bHQgPSBmYWxzZV07CisKKyAgLy8gSXMgdGhpcyBmaWVsZCBkZXByZWNhdGVkPworICAvLyBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCisgIC8vIGZvciBhY2Nlc3NvcnMsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwgdGhpcworICAvLyBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIGZpZWxkcy4KKyAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKKworICAvLyBGb3IgR29vZ2xlLWludGVybmFsIG1pZ3JhdGlvbiBvbmx5LiBEbyBub3QgdXNlLgorICBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKworCisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworCisgIHJlc2VydmVkIDQ7ICAvLyByZW1vdmVkIGp0eXBlCit9CisKK21lc3NhZ2UgT25lb2ZPcHRpb25zIHsKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgRW51bU9wdGlvbnMgeworCisgIC8vIFNldCB0aGlzIG9wdGlvbiB0byB0cnVlIHRvIGFsbG93IG1hcHBpbmcgZGlmZmVyZW50IHRhZyBuYW1lcyB0byB0aGUgc2FtZQorICAvLyB2YWx1ZS4KKyAgb3B0aW9uYWwgYm9vbCBhbGxvd19hbGlhcyA9IDI7CisKKyAgLy8gSXMgdGhpcyBlbnVtIGRlcHJlY2F0ZWQ/CisgIC8vIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKKyAgLy8gZm9yIHRoZSBlbnVtLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsIHRoaXMKKyAgLy8gaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBlbnVtcy4KKyAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKKworICByZXNlcnZlZCA1OyAgLy8gamF2YW5hbm9fYXNfbGl0ZQorCisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCittZXNzYWdlIEVudW1WYWx1ZU9wdGlvbnMgeworICAvLyBJcyB0aGlzIGVudW0gdmFsdWUgZGVwcmVjYXRlZD8KKyAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucworICAvLyBmb3IgdGhlIGVudW0gdmFsdWUsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwKKyAgLy8gdGhpcyBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIGVudW0gdmFsdWVzLgorICBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOworCisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCittZXNzYWdlIFNlcnZpY2VPcHRpb25zIHsKKworICAvLyBOb3RlOiAgRmllbGQgbnVtYmVycyAxIHRocm91Z2ggMzIgYXJlIHJlc2VydmVkIGZvciBHb29nbGUncyBpbnRlcm5hbCBSUEMKKyAgLy8gICBmcmFtZXdvcmsuICBXZSBhcG9sb2dpemUgZm9yIGhvYXJkaW5nIHRoZXNlIG51bWJlcnMgdG8gb3Vyc2VsdmVzLCBidXQKKyAgLy8gICB3ZSB3ZXJlIGFscmVhZHkgdXNpbmcgdGhlbSBsb25nIGJlZm9yZSB3ZSBkZWNpZGVkIHRvIHJlbGVhc2UgUHJvdG9jb2wKKyAgLy8gICBCdWZmZXJzLgorCisgIC8vIElzIHRoaXMgc2VydmljZSBkZXByZWNhdGVkPworICAvLyBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCisgIC8vIGZvciB0aGUgc2VydmljZSwgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5IGxlYXN0LAorICAvLyB0aGlzIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgc2VydmljZXMuCisgIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMzIFtkZWZhdWx0ID0gZmFsc2VdOworCisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCittZXNzYWdlIE1ldGhvZE9wdGlvbnMgeworCisgIC8vIE5vdGU6ICBGaWVsZCBudW1iZXJzIDEgdGhyb3VnaCAzMiBhcmUgcmVzZXJ2ZWQgZm9yIEdvb2dsZSdzIGludGVybmFsIFJQQworICAvLyAgIGZyYW1ld29yay4gIFdlIGFwb2xvZ2l6ZSBmb3IgaG9hcmRpbmcgdGhlc2UgbnVtYmVycyB0byBvdXJzZWx2ZXMsIGJ1dAorICAvLyAgIHdlIHdlcmUgYWxyZWFkeSB1c2luZyB0aGVtIGxvbmcgYmVmb3JlIHdlIGRlY2lkZWQgdG8gcmVsZWFzZSBQcm90b2NvbAorICAvLyAgIEJ1ZmZlcnMuCisKKyAgLy8gSXMgdGhpcyBtZXRob2QgZGVwcmVjYXRlZD8KKyAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucworICAvLyBmb3IgdGhlIG1ldGhvZCwgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5IGxlYXN0LAorICAvLyB0aGlzIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgbWV0aG9kcy4KKyAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQgPSBmYWxzZV07CisKKyAgLy8gSXMgdGhpcyBtZXRob2Qgc2lkZS1lZmZlY3QtZnJlZSAob3Igc2FmZSBpbiBIVFRQIHBhcmxhbmNlKSwgb3IgaWRlbXBvdGVudCwKKyAgLy8gb3IgbmVpdGhlcj8gSFRUUCBiYXNlZCBSUEMgaW1wbGVtZW50YXRpb24gbWF5IGNob29zZSBHRVQgdmVyYiBmb3Igc2FmZQorICAvLyBtZXRob2RzLCBhbmQgUFVUIHZlcmIgZm9yIGlkZW1wb3RlbnQgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IFBPU1QuCisgIGVudW0gSWRlbXBvdGVuY3lMZXZlbCB7CisgICAgSURFTVBPVEVOQ1lfVU5LTk9XTiA9IDA7CisgICAgTk9fU0lERV9FRkZFQ1RTID0gMTsgIC8vIGltcGxpZXMgaWRlbXBvdGVudAorICAgIElERU1QT1RFTlQgPSAyOyAgICAgICAvLyBpZGVtcG90ZW50LCBidXQgbWF5IGhhdmUgc2lkZSBlZmZlY3RzCisgIH0KKyAgb3B0aW9uYWwgSWRlbXBvdGVuY3lMZXZlbCBpZGVtcG90ZW5jeV9sZXZlbCA9IDM0CisgICAgICBbZGVmYXVsdCA9IElERU1QT1RFTkNZX1VOS05PV05dOworCisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCisKKy8vIEEgbWVzc2FnZSByZXByZXNlbnRpbmcgYSBvcHRpb24gdGhlIHBhcnNlciBkb2VzIG5vdCByZWNvZ25pemUuIFRoaXMgb25seQorLy8gYXBwZWFycyBpbiBvcHRpb25zIHByb3RvcyBjcmVhdGVkIGJ5IHRoZSBjb21waWxlcjo6UGFyc2VyIGNsYXNzLgorLy8gRGVzY3JpcHRvclBvb2wgcmVzb2x2ZXMgdGhlc2Ugd2hlbiBidWlsZGluZyBEZXNjcmlwdG9yIG9iamVjdHMuIFRoZXJlZm9yZSwKKy8vIG9wdGlvbnMgcHJvdG9zIGluIGRlc2NyaXB0b3Igb2JqZWN0cyAoZS5nLiByZXR1cm5lZCBieSBEZXNjcmlwdG9yOjpvcHRpb25zKCksCisvLyBvciBwcm9kdWNlZCBieSBEZXNjcmlwdG9yOjpDb3B5VG8oKSkgd2lsbCBuZXZlciBoYXZlIFVuaW50ZXJwcmV0ZWRPcHRpb25zCisvLyBpbiB0aGVtLgorbWVzc2FnZSBVbmludGVycHJldGVkT3B0aW9uIHsKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIHVuaW50ZXJwcmV0ZWQgb3B0aW9uLiAgRWFjaCBzdHJpbmcgcmVwcmVzZW50cyBhIHNlZ21lbnQgaW4KKyAgLy8gYSBkb3Qtc2VwYXJhdGVkIG5hbWUuICBpc19leHRlbnNpb24gaXMgdHJ1ZSBpZmYgYSBzZWdtZW50IHJlcHJlc2VudHMgYW4KKyAgLy8gZXh0ZW5zaW9uIChkZW5vdGVkIHdpdGggcGFyZW50aGVzZXMgaW4gb3B0aW9ucyBzcGVjcyBpbiAucHJvdG8gZmlsZXMpLgorICAvLyBFLmcuLHsgWyJmb28iLCBmYWxzZV0sIFsiYmFyLmJheiIsIHRydWVdLCBbIm1vbyIsIGZhbHNlXSB9IHJlcHJlc2VudHMKKyAgLy8gImZvby4oYmFyLmJheikubW9vIi4KKyAgbWVzc2FnZSBOYW1lUGFydCB7CisgICAgcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7CisgICAgcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOworICB9CisgIHJlcGVhdGVkIE5hbWVQYXJ0IG5hbWUgPSAyOworCisgIC8vIFRoZSB2YWx1ZSBvZiB0aGUgdW5pbnRlcnByZXRlZCBvcHRpb24sIGluIHdoYXRldmVyIHR5cGUgdGhlIHRva2VuaXplcgorICAvLyBpZGVudGlmaWVkIGl0IGFzIGR1cmluZyBwYXJzaW5nLiBFeGFjdGx5IG9uZSBvZiB0aGVzZSBzaG91bGQgYmUgc2V0LgorICBvcHRpb25hbCBzdHJpbmcgaWRlbnRpZmllcl92YWx1ZSA9IDM7CisgIG9wdGlvbmFsIHVpbnQ2NCBwb3NpdGl2ZV9pbnRfdmFsdWUgPSA0OworICBvcHRpb25hbCBpbnQ2NCBuZWdhdGl2ZV9pbnRfdmFsdWUgPSA1OworICBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKKyAgb3B0aW9uYWwgYnl0ZXMgc3RyaW5nX3ZhbHVlID0gNzsKKyAgb3B0aW9uYWwgc3RyaW5nIGFnZ3JlZ2F0ZV92YWx1ZSA9IDg7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIE9wdGlvbmFsIHNvdXJjZSBjb2RlIGluZm8KKworLy8gRW5jYXBzdWxhdGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSBmcm9tIHdoaWNoIGEKKy8vIEZpbGVEZXNjcmlwdG9yUHJvdG8gd2FzIGdlbmVyYXRlZC4KK21lc3NhZ2UgU291cmNlQ29kZUluZm8geworICAvLyBBIExvY2F0aW9uIGlkZW50aWZpZXMgYSBwaWVjZSBvZiBzb3VyY2UgY29kZSBpbiBhIC5wcm90byBmaWxlIHdoaWNoCisgIC8vIGNvcnJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBkZWZpbml0aW9uLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbnRlbmRlZAorICAvLyB0byBiZSB1c2VmdWwgdG8gSURFcywgY29kZSBpbmRleGVycywgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3JzLCBhbmQgc2ltaWxhcgorICAvLyB0b29scy4KKyAgLy8KKyAgLy8gRm9yIGV4YW1wbGUsIHNheSB3ZSBoYXZlIGEgZmlsZSBsaWtlOgorICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICAgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxOworICAvLyAgIH0KKyAgLy8gTGV0J3MgbG9vayBhdCBqdXN0IHRoZSBmaWVsZCBkZWZpbml0aW9uOgorICAvLyAgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxOworICAvLyAgIF4gICAgICAgXl4gICAgIF5eICBeICBeXl4KKyAgLy8gICBhICAgICAgIGJjICAgICBkZSAgZiAgZ2hpCisgIC8vIFdlIGhhdmUgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgIC8vICAgc3BhbiAgIHBhdGggICAgICAgICAgICAgICByZXByZXNlbnRzCisgIC8vICAgW2EsaSkgIFsgNCwgMCwgMiwgMCBdICAgICBUaGUgd2hvbGUgZmllbGQgZGVmaW5pdGlvbi4KKyAgLy8gICBbYSxiKSAgWyA0LCAwLCAyLCAwLCA0IF0gIFRoZSBsYWJlbCAob3B0aW9uYWwpLgorICAvLyAgIFtjLGQpICBbIDQsIDAsIDIsIDAsIDUgXSAgVGhlIHR5cGUgKHN0cmluZykuCisgIC8vICAgW2UsZikgIFsgNCwgMCwgMiwgMCwgMSBdICBUaGUgbmFtZSAoZm9vKS4KKyAgLy8gICBbZyxoKSAgWyA0LCAwLCAyLCAwLCAzIF0gIFRoZSBudW1iZXIgKDEpLgorICAvLworICAvLyBOb3RlczoKKyAgLy8gLSBBIGxvY2F0aW9uIG1heSByZWZlciB0byBhIHJlcGVhdGVkIGZpZWxkIGl0c2VsZiAoaS5lLiBub3QgdG8gYW55CisgIC8vICAgcGFydGljdWxhciBpbmRleCB3aXRoaW4gaXQpLiAgVGhpcyBpcyB1c2VkIHdoZW5ldmVyIGEgc2V0IG9mIGVsZW1lbnRzIGFyZQorICAvLyAgIGxvZ2ljYWxseSBlbmNsb3NlZCBpbiBhIHNpbmdsZSBjb2RlIHNlZ21lbnQuICBGb3IgZXhhbXBsZSwgYW4gZW50aXJlCisgIC8vICAgZXh0ZW5kIGJsb2NrIChwb3NzaWJseSBjb250YWluaW5nIG11bHRpcGxlIGV4dGVuc2lvbiBkZWZpbml0aW9ucykgd2lsbAorICAvLyAgIGhhdmUgYW4gb3V0ZXIgbG9jYXRpb24gd2hvc2UgcGF0aCByZWZlcnMgdG8gdGhlICJleHRlbnNpb25zIiByZXBlYXRlZAorICAvLyAgIGZpZWxkIHdpdGhvdXQgYW4gaW5kZXguCisgIC8vIC0gTXVsdGlwbGUgbG9jYXRpb25zIG1heSBoYXZlIHRoZSBzYW1lIHBhdGguICBUaGlzIGhhcHBlbnMgd2hlbiBhIHNpbmdsZQorICAvLyAgIGxvZ2ljYWwgZGVjbGFyYXRpb24gaXMgc3ByZWFkIG91dCBhY3Jvc3MgbXVsdGlwbGUgcGxhY2VzLiAgVGhlIG1vc3QKKyAgLy8gICBvYnZpb3VzIGV4YW1wbGUgaXMgdGhlICJleHRlbmQiIGJsb2NrIGFnYWluIC0tIHRoZXJlIG1heSBiZSBtdWx0aXBsZQorICAvLyAgIGV4dGVuZCBibG9ja3MgaW4gdGhlIHNhbWUgc2NvcGUsIGVhY2ggb2Ygd2hpY2ggd2lsbCBoYXZlIHRoZSBzYW1lIHBhdGguCisgIC8vIC0gQSBsb2NhdGlvbidzIHNwYW4gaXMgbm90IGFsd2F5cyBhIHN1YnNldCBvZiBpdHMgcGFyZW50J3Mgc3Bhbi4gIEZvcgorICAvLyAgIGV4YW1wbGUsIHRoZSAiZXh0ZW5kZWUiIG9mIGFuIGV4dGVuc2lvbiBkZWNsYXJhdGlvbiBhcHBlYXJzIGF0IHRoZQorICAvLyAgIGJlZ2lubmluZyBvZiB0aGUgImV4dGVuZCIgYmxvY2sgYW5kIGlzIHNoYXJlZCBieSBhbGwgZXh0ZW5zaW9ucyB3aXRoaW4KKyAgLy8gICB0aGUgYmxvY2suCisgIC8vIC0gSnVzdCBiZWNhdXNlIGEgbG9jYXRpb24ncyBzcGFuIGlzIGEgc3Vic2V0IG9mIHNvbWUgb3RoZXIgbG9jYXRpb24ncyBzcGFuCisgIC8vICAgZG9lcyBub3QgbWVhbiB0aGF0IGl0IGlzIGEgZGVzY2VuZGFudC4gIEZvciBleGFtcGxlLCBhICJncm91cCIgZGVmaW5lcworICAvLyAgIGJvdGggYSB0eXBlIGFuZCBhIGZpZWxkIGluIGEgc2luZ2xlIGRlY2xhcmF0aW9uLiAgVGh1cywgdGhlIGxvY2F0aW9ucworICAvLyAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgYW5kIGZpZWxkIGFuZCB0aGVpciBjb21wb25lbnRzIHdpbGwgb3ZlcmxhcC4KKyAgLy8gLSBDb2RlIHdoaWNoIHRyaWVzIHRvIGludGVycHJldCBsb2NhdGlvbnMgc2hvdWxkIHByb2JhYmx5IGJlIGRlc2lnbmVkIHRvCisgIC8vICAgaWdub3JlIHRob3NlIHRoYXQgaXQgZG9lc24ndCB1bmRlcnN0YW5kLCBhcyBtb3JlIHR5cGVzIG9mIGxvY2F0aW9ucyBjb3VsZAorICAvLyAgIGJlIHJlY29yZGVkIGluIHRoZSBmdXR1cmUuCisgIHJlcGVhdGVkIExvY2F0aW9uIGxvY2F0aW9uID0gMTsKKyAgbWVzc2FnZSBMb2NhdGlvbiB7CisgICAgLy8gSWRlbnRpZmllcyB3aGljaCBwYXJ0IG9mIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHdhcyBkZWZpbmVkIGF0IHRoaXMKKyAgICAvLyBsb2NhdGlvbi4KKyAgICAvLworICAgIC8vIEVhY2ggZWxlbWVudCBpcyBhIGZpZWxkIG51bWJlciBvciBhbiBpbmRleC4gIFRoZXkgZm9ybSBhIHBhdGggZnJvbQorICAgIC8vIHRoZSByb290IEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gdGhlIHBsYWNlIHdoZXJlIHRoZSBkZWZpbml0aW9uIG9jY3Vycy4KKyAgICAvLyBGb3IgZXhhbXBsZSwgdGhpcyBwYXRoOgorICAgIC8vICAgWyA0LCAzLCAyLCA3LCAxIF0KKyAgICAvLyByZWZlcnMgdG86CisgICAgLy8gICBmaWxlLm1lc3NhZ2VfdHlwZSgzKSAgLy8gNCwgMworICAgIC8vICAgICAgIC5maWVsZCg3KSAgICAgICAgIC8vIDIsIDcKKyAgICAvLyAgICAgICAubmFtZSgpICAgICAgICAgICAvLyAxCisgICAgLy8gVGhpcyBpcyBiZWNhdXNlIEZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlIGhhcyBmaWVsZCBudW1iZXIgNDoKKyAgICAvLyAgIHJlcGVhdGVkIERlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OworICAgIC8vIGFuZCBEZXNjcmlwdG9yUHJvdG8uZmllbGQgaGFzIGZpZWxkIG51bWJlciAyOgorICAgIC8vICAgcmVwZWF0ZWQgRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOworICAgIC8vIGFuZCBGaWVsZERlc2NyaXB0b3JQcm90by5uYW1lIGhhcyBmaWVsZCBudW1iZXIgMToKKyAgICAvLyAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICAvLworICAgIC8vIFRodXMsIHRoZSBhYm92ZSBwYXRoIGdpdmVzIHRoZSBsb2NhdGlvbiBvZiBhIGZpZWxkIG5hbWUuICBJZiB3ZSByZW1vdmVkCisgICAgLy8gdGhlIGxhc3QgZWxlbWVudDoKKyAgICAvLyAgIFsgNCwgMywgMiwgNyBdCisgICAgLy8gdGhpcyBwYXRoIHJlZmVycyB0byB0aGUgd2hvbGUgZmllbGQgZGVjbGFyYXRpb24gKGZyb20gdGhlIGJlZ2lubmluZworICAgIC8vIG9mIHRoZSBsYWJlbCB0byB0aGUgdGVybWluYXRpbmcgc2VtaWNvbG9uKS4KKyAgICByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkID0gdHJ1ZV07CisKKyAgICAvLyBBbHdheXMgaGFzIGV4YWN0bHkgdGhyZWUgb3IgZm91ciBlbGVtZW50czogc3RhcnQgbGluZSwgc3RhcnQgY29sdW1uLAorICAgIC8vIGVuZCBsaW5lIChvcHRpb25hbCwgb3RoZXJ3aXNlIGFzc3VtZWQgc2FtZSBhcyBzdGFydCBsaW5lKSwgZW5kIGNvbHVtbi4KKyAgICAvLyBUaGVzZSBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgZmllbGQgZm9yIGVmZmljaWVuY3kuICBOb3RlIHRoYXQgbGluZQorICAgIC8vIGFuZCBjb2x1bW4gbnVtYmVycyBhcmUgemVyby1iYXNlZCAtLSB0eXBpY2FsbHkgeW91IHdpbGwgd2FudCB0byBhZGQKKyAgICAvLyAxIHRvIGVhY2ggYmVmb3JlIGRpc3BsYXlpbmcgdG8gYSB1c2VyLgorICAgIHJlcGVhdGVkIGludDMyIHNwYW4gPSAyIFtwYWNrZWQgPSB0cnVlXTsKKworICAgIC8vIElmIHRoaXMgU291cmNlQ29kZUluZm8gcmVwcmVzZW50cyBhIGNvbXBsZXRlIGRlY2xhcmF0aW9uLCB0aGVzZSBhcmUgYW55CisgICAgLy8gY29tbWVudHMgYXBwZWFyaW5nIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGRlY2xhcmF0aW9uIHdoaWNoIGFwcGVhciB0byBiZQorICAgIC8vIGF0dGFjaGVkIHRvIHRoZSBkZWNsYXJhdGlvbi4KKyAgICAvLworICAgIC8vIEEgc2VyaWVzIG9mIGxpbmUgY29tbWVudHMgYXBwZWFyaW5nIG9uIGNvbnNlY3V0aXZlIGxpbmVzLCB3aXRoIG5vIG90aGVyCisgICAgLy8gdG9rZW5zIGFwcGVhcmluZyBvbiB0aG9zZSBsaW5lcywgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2luZ2xlIGNvbW1lbnQuCisgICAgLy8KKyAgICAvLyBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzIHdpbGwga2VlcCBwYXJhZ3JhcGhzIG9mIGNvbW1lbnRzIHRoYXQgYXBwZWFyCisgICAgLy8gYmVmb3JlIChidXQgbm90IGNvbm5lY3RlZCB0bykgdGhlIGN1cnJlbnQgZWxlbWVudC4gRWFjaCBwYXJhZ3JhcGgsCisgICAgLy8gc2VwYXJhdGVkIGJ5IGVtcHR5IGxpbmVzLCB3aWxsIGJlIG9uZSBjb21tZW50IGVsZW1lbnQgaW4gdGhlIHJlcGVhdGVkCisgICAgLy8gZmllbGQuCisgICAgLy8KKyAgICAvLyBPbmx5IHRoZSBjb21tZW50IGNvbnRlbnQgaXMgcHJvdmlkZWQ7IGNvbW1lbnQgbWFya2VycyAoZS5nLiAvLykgYXJlCisgICAgLy8gc3RyaXBwZWQgb3V0LiAgRm9yIGJsb2NrIGNvbW1lbnRzLCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGFuIGFzdGVyaXNrCisgICAgLy8gd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lIG90aGVyIHRoYW4gdGhlIGZpcnN0LgorICAgIC8vIE5ld2xpbmVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgorICAgIC8vCisgICAgLy8gRXhhbXBsZXM6CisgICAgLy8KKyAgICAvLyAgIG9wdGlvbmFsIGludDMyIGZvbyA9IDE7ICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGZvby4KKyAgICAvLyAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gYmFyLgorICAgIC8vICAgb3B0aW9uYWwgaW50MzIgYmFyID0gMjsKKyAgICAvLworICAgIC8vICAgb3B0aW9uYWwgc3RyaW5nIGJheiA9IDM7CisgICAgLy8gICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhei4KKyAgICAvLyAgIC8vIEFub3RoZXIgbGluZSBhdHRhY2hlZCB0byBiYXouCisgICAgLy8KKyAgICAvLyAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gbW9vLgorICAgIC8vICAgLy8KKyAgICAvLyAgIC8vIEFub3RoZXIgbGluZSBhdHRhY2hlZCB0byBtb28uCisgICAgLy8gICBvcHRpb25hbCBkb3VibGUgbW9vID0gNDsKKyAgICAvLworICAgIC8vICAgLy8gRGV0YWNoZWQgY29tbWVudCBmb3IgY29yZ2UuIFRoaXMgaXMgbm90IGxlYWRpbmcgb3IgdHJhaWxpbmcgY29tbWVudHMKKyAgICAvLyAgIC8vIHRvIG1vbyBvciBjb3JnZSBiZWNhdXNlIHRoZXJlIGFyZSBibGFuayBsaW5lcyBzZXBhcmF0aW5nIGl0IGZyb20KKyAgICAvLyAgIC8vIGJvdGguCisgICAgLy8KKyAgICAvLyAgIC8vIERldGFjaGVkIGNvbW1lbnQgZm9yIGNvcmdlIHBhcmFncmFwaCAyLgorICAgIC8vCisgICAgLy8gICBvcHRpb25hbCBzdHJpbmcgY29yZ2UgPSA1OworICAgIC8vICAgLyogQmxvY2sgY29tbWVudCBhdHRhY2hlZAorICAgIC8vICAgICogdG8gY29yZ2UuICBMZWFkaW5nIGFzdGVyaXNrcworICAgIC8vICAgICogd2lsbCBiZSByZW1vdmVkLiAqLworICAgIC8vICAgLyogQmxvY2sgY29tbWVudCBhdHRhY2hlZCB0bworICAgIC8vICAgICogZ3JhdWx0LiAqLworICAgIC8vICAgb3B0aW9uYWwgaW50MzIgZ3JhdWx0ID0gNjsKKyAgICAvLworICAgIC8vICAgLy8gaWdub3JlZCBkZXRhY2hlZCBjb21tZW50cy4KKyAgICBvcHRpb25hbCBzdHJpbmcgbGVhZGluZ19jb21tZW50cyA9IDM7CisgICAgb3B0aW9uYWwgc3RyaW5nIHRyYWlsaW5nX2NvbW1lbnRzID0gNDsKKyAgICByZXBlYXRlZCBzdHJpbmcgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyA9IDY7CisgIH0KK30KKworLy8gRGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBnZW5lcmF0ZWQgY29kZSBhbmQgaXRzIG9yaWdpbmFsIHNvdXJjZQorLy8gZmlsZS4gQSBHZW5lcmF0ZWRDb2RlSW5mbyBtZXNzYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCBvbmx5IG9uZSBnZW5lcmF0ZWQKKy8vIHNvdXJjZSBmaWxlLCBidXQgbWF5IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBkaWZmZXJlbnQgc291cmNlIC5wcm90byBmaWxlcy4KK21lc3NhZ2UgR2VuZXJhdGVkQ29kZUluZm8geworICAvLyBBbiBBbm5vdGF0aW9uIGNvbm5lY3RzIHNvbWUgc3BhbiBvZiB0ZXh0IGluIGdlbmVyYXRlZCBjb2RlIHRvIGFuIGVsZW1lbnQKKyAgLy8gb2YgaXRzIGdlbmVyYXRpbmcgLnByb3RvIGZpbGUuCisgIHJlcGVhdGVkIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IDE7CisgIG1lc3NhZ2UgQW5ub3RhdGlvbiB7CisgICAgLy8gSWRlbnRpZmllcyB0aGUgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgc291cmNlIC5wcm90byBmaWxlLiBUaGlzIGZpZWxkCisgICAgLy8gaXMgZm9ybWF0dGVkIHRoZSBzYW1lIGFzIFNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnBhdGguCisgICAgcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworCisgICAgLy8gSWRlbnRpZmllcyB0aGUgZmlsZXN5c3RlbSBwYXRoIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgLnByb3RvLgorICAgIG9wdGlvbmFsIHN0cmluZyBzb3VyY2VfZmlsZSA9IDI7CisKKyAgICAvLyBJZGVudGlmaWVzIHRoZSBzdGFydGluZyBvZmZzZXQgaW4gYnl0ZXMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCisgICAgLy8gdGhhdCByZWxhdGVzIHRvIHRoZSBpZGVudGlmaWVkIG9iamVjdC4KKyAgICBvcHRpb25hbCBpbnQzMiBiZWdpbiA9IDM7CisKKyAgICAvLyBJZGVudGlmaWVzIHRoZSBlbmRpbmcgb2Zmc2V0IGluIGJ5dGVzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSB0aGF0CisgICAgLy8gcmVsYXRlcyB0byB0aGUgaWRlbnRpZmllZCBvZmZzZXQuIFRoZSBlbmQgb2Zmc2V0IHNob3VsZCBiZSBvbmUgcGFzdAorICAgIC8vIHRoZSBsYXN0IHJlbGV2YW50IGJ5dGUgKHNvIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgPSBlbmQgLSBiZWdpbikuCisgICAgb3B0aW9uYWwgaW50MzIgZW5kID0gNDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8gYi9pbmNsdWRlL2dvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWMzZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8KQEAgLTAsMCArMSwxMTYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBnb29nbGUucHJvdG9idWY7CisKK29wdGlvbiBjc2hhcnBfbmFtZXNwYWNlID0gIkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcyI7CitvcHRpb24gY2NfZW5hYmxlX2FyZW5hcyA9IHRydWU7CitvcHRpb24gZ29fcGFja2FnZSA9ICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9kdXJhdGlvbnBiIjsKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiRHVyYXRpb25Qcm90byI7CitvcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7CitvcHRpb24gb2JqY19jbGFzc19wcmVmaXggPSAiR1BCIjsKKworLy8gQSBEdXJhdGlvbiByZXByZXNlbnRzIGEgc2lnbmVkLCBmaXhlZC1sZW5ndGggc3BhbiBvZiB0aW1lIHJlcHJlc2VudGVkCisvLyBhcyBhIGNvdW50IG9mIHNlY29uZHMgYW5kIGZyYWN0aW9ucyBvZiBzZWNvbmRzIGF0IG5hbm9zZWNvbmQKKy8vIHJlc29sdXRpb24uIEl0IGlzIGluZGVwZW5kZW50IG9mIGFueSBjYWxlbmRhciBhbmQgY29uY2VwdHMgbGlrZSAiZGF5IgorLy8gb3IgIm1vbnRoIi4gSXQgaXMgcmVsYXRlZCB0byBUaW1lc3RhbXAgaW4gdGhhdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisvLyB0d28gVGltZXN0YW1wIHZhbHVlcyBpcyBhIER1cmF0aW9uIGFuZCBpdCBjYW4gYmUgYWRkZWQgb3Igc3VidHJhY3RlZAorLy8gZnJvbSBhIFRpbWVzdGFtcC4gUmFuZ2UgaXMgYXBwcm94aW1hdGVseSArLTEwLDAwMCB5ZWFycy4KKy8vCisvLyAjIEV4YW1wbGVzCisvLworLy8gRXhhbXBsZSAxOiBDb21wdXRlIER1cmF0aW9uIGZyb20gdHdvIFRpbWVzdGFtcHMgaW4gcHNldWRvIGNvZGUuCisvLworLy8gICAgIFRpbWVzdGFtcCBzdGFydCA9IC4uLjsKKy8vICAgICBUaW1lc3RhbXAgZW5kID0gLi4uOworLy8gICAgIER1cmF0aW9uIGR1cmF0aW9uID0gLi4uOworLy8KKy8vICAgICBkdXJhdGlvbi5zZWNvbmRzID0gZW5kLnNlY29uZHMgLSBzdGFydC5zZWNvbmRzOworLy8gICAgIGR1cmF0aW9uLm5hbm9zID0gZW5kLm5hbm9zIC0gc3RhcnQubmFub3M7CisvLworLy8gICAgIGlmIChkdXJhdGlvbi5zZWNvbmRzIDwgMCAmJiBkdXJhdGlvbi5uYW5vcyA+IDApIHsKKy8vICAgICAgIGR1cmF0aW9uLnNlY29uZHMgKz0gMTsKKy8vICAgICAgIGR1cmF0aW9uLm5hbm9zIC09IDEwMDAwMDAwMDA7CisvLyAgICAgfSBlbHNlIGlmIChkdXJhdGlvbi5zZWNvbmRzID4gMCAmJiBkdXJhdGlvbi5uYW5vcyA8IDApIHsKKy8vICAgICAgIGR1cmF0aW9uLnNlY29uZHMgLT0gMTsKKy8vICAgICAgIGR1cmF0aW9uLm5hbm9zICs9IDEwMDAwMDAwMDA7CisvLyAgICAgfQorLy8KKy8vIEV4YW1wbGUgMjogQ29tcHV0ZSBUaW1lc3RhbXAgZnJvbSBUaW1lc3RhbXAgKyBEdXJhdGlvbiBpbiBwc2V1ZG8gY29kZS4KKy8vCisvLyAgICAgVGltZXN0YW1wIHN0YXJ0ID0gLi4uOworLy8gICAgIER1cmF0aW9uIGR1cmF0aW9uID0gLi4uOworLy8gICAgIFRpbWVzdGFtcCBlbmQgPSAuLi47CisvLworLy8gICAgIGVuZC5zZWNvbmRzID0gc3RhcnQuc2Vjb25kcyArIGR1cmF0aW9uLnNlY29uZHM7CisvLyAgICAgZW5kLm5hbm9zID0gc3RhcnQubmFub3MgKyBkdXJhdGlvbi5uYW5vczsKKy8vCisvLyAgICAgaWYgKGVuZC5uYW5vcyA8IDApIHsKKy8vICAgICAgIGVuZC5zZWNvbmRzIC09IDE7CisvLyAgICAgICBlbmQubmFub3MgKz0gMTAwMDAwMDAwMDsKKy8vICAgICB9IGVsc2UgaWYgKGVuZC5uYW5vcyA+PSAxMDAwMDAwMDAwKSB7CisvLyAgICAgICBlbmQuc2Vjb25kcyArPSAxOworLy8gICAgICAgZW5kLm5hbm9zIC09IDEwMDAwMDAwMDA7CisvLyAgICAgfQorLy8KKy8vIEV4YW1wbGUgMzogQ29tcHV0ZSBEdXJhdGlvbiBmcm9tIGRhdGV0aW1lLnRpbWVkZWx0YSBpbiBQeXRob24uCisvLworLy8gICAgIHRkID0gZGF0ZXRpbWUudGltZWRlbHRhKGRheXM9MywgbWludXRlcz0xMCkKKy8vICAgICBkdXJhdGlvbiA9IER1cmF0aW9uKCkKKy8vICAgICBkdXJhdGlvbi5Gcm9tVGltZWRlbHRhKHRkKQorLy8KKy8vICMgSlNPTiBNYXBwaW5nCisvLworLy8gSW4gSlNPTiBmb3JtYXQsIHRoZSBEdXJhdGlvbiB0eXBlIGlzIGVuY29kZWQgYXMgYSBzdHJpbmcgcmF0aGVyIHRoYW4gYW4KKy8vIG9iamVjdCwgd2hlcmUgdGhlIHN0cmluZyBlbmRzIGluIHRoZSBzdWZmaXggInMiIChpbmRpY2F0aW5nIHNlY29uZHMpIGFuZAorLy8gaXMgcHJlY2VkZWQgYnkgdGhlIG51bWJlciBvZiBzZWNvbmRzLCB3aXRoIG5hbm9zZWNvbmRzIGV4cHJlc3NlZCBhcworLy8gZnJhY3Rpb25hbCBzZWNvbmRzLiBGb3IgZXhhbXBsZSwgMyBzZWNvbmRzIHdpdGggMCBuYW5vc2Vjb25kcyBzaG91bGQgYmUKKy8vIGVuY29kZWQgaW4gSlNPTiBmb3JtYXQgYXMgIjNzIiwgd2hpbGUgMyBzZWNvbmRzIGFuZCAxIG5hbm9zZWNvbmQgc2hvdWxkCisvLyBiZSBleHByZXNzZWQgaW4gSlNPTiBmb3JtYXQgYXMgIjMuMDAwMDAwMDAxcyIsIGFuZCAzIHNlY29uZHMgYW5kIDEKKy8vIG1pY3Jvc2Vjb25kIHNob3VsZCBiZSBleHByZXNzZWQgaW4gSlNPTiBmb3JtYXQgYXMgIjMuMDAwMDAxcyIuCisvLworLy8KK21lc3NhZ2UgRHVyYXRpb24geworICAvLyBTaWduZWQgc2Vjb25kcyBvZiB0aGUgc3BhbiBvZiB0aW1lLiBNdXN0IGJlIGZyb20gLTMxNSw1NzYsMDAwLDAwMAorICAvLyB0byArMzE1LDU3NiwwMDAsMDAwIGluY2x1c2l2ZS4gTm90ZTogdGhlc2UgYm91bmRzIGFyZSBjb21wdXRlZCBmcm9tOgorICAvLyA2MCBzZWMvbWluICogNjAgbWluL2hyICogMjQgaHIvZGF5ICogMzY1LjI1IGRheXMveWVhciAqIDEwMDAwIHllYXJzCisgIGludDY0IHNlY29uZHMgPSAxOworCisgIC8vIFNpZ25lZCBmcmFjdGlvbnMgb2YgYSBzZWNvbmQgYXQgbmFub3NlY29uZCByZXNvbHV0aW9uIG9mIHRoZSBzcGFuCisgIC8vIG9mIHRpbWUuIER1cmF0aW9ucyBsZXNzIHRoYW4gb25lIHNlY29uZCBhcmUgcmVwcmVzZW50ZWQgd2l0aCBhIDAKKyAgLy8gYHNlY29uZHNgIGZpZWxkIGFuZCBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGBuYW5vc2AgZmllbGQuIEZvciBkdXJhdGlvbnMKKyAgLy8gb2Ygb25lIHNlY29uZCBvciBtb3JlLCBhIG5vbi16ZXJvIHZhbHVlIGZvciB0aGUgYG5hbm9zYCBmaWVsZCBtdXN0IGJlCisgIC8vIG9mIHRoZSBzYW1lIHNpZ24gYXMgdGhlIGBzZWNvbmRzYCBmaWVsZC4gTXVzdCBiZSBmcm9tIC05OTksOTk5LDk5OQorICAvLyB0byArOTk5LDk5OSw5OTkgaW5jbHVzaXZlLgorICBpbnQzMiBuYW5vcyA9IDI7Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byBiL2luY2x1ZGUvZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMjc0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90bwpAQCAtMCwwICsxLDUxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOworCitvcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMiOworb3B0aW9uIGdvX3BhY2thZ2UgPSAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vZW1wdHlwYiI7CitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkVtcHR5UHJvdG8iOworb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOworb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gIkdQQiI7CitvcHRpb24gY2NfZW5hYmxlX2FyZW5hcyA9IHRydWU7CisKKy8vIEEgZ2VuZXJpYyBlbXB0eSBtZXNzYWdlIHRoYXQgeW91IGNhbiByZS11c2UgdG8gYXZvaWQgZGVmaW5pbmcgZHVwbGljYXRlZAorLy8gZW1wdHkgbWVzc2FnZXMgaW4geW91ciBBUElzLiBBIHR5cGljYWwgZXhhbXBsZSBpcyB0byB1c2UgaXQgYXMgdGhlIHJlcXVlc3QKKy8vIG9yIHRoZSByZXNwb25zZSB0eXBlIG9mIGFuIEFQSSBtZXRob2QuIEZvciBpbnN0YW5jZToKKy8vCisvLyAgICAgc2VydmljZSBGb28geworLy8gICAgICAgcnBjIEJhcihnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSk7CisvLyAgICAgfQorLy8KK21lc3NhZ2UgRW1wdHkge30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8gYi9pbmNsdWRlL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNTEwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvCkBAIC0wLDAgKzEsMjQ1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOworCitvcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMiOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJGaWVsZE1hc2tQcm90byI7CitvcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7CitvcHRpb24gb2JqY19jbGFzc19wcmVmaXggPSAiR1BCIjsKK29wdGlvbiBnb19wYWNrYWdlID0gImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2ZpZWxkbWFza3BiIjsKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKKworLy8gYEZpZWxkTWFza2AgcmVwcmVzZW50cyBhIHNldCBvZiBzeW1ib2xpYyBmaWVsZCBwYXRocywgZm9yIGV4YW1wbGU6CisvLworLy8gICAgIHBhdGhzOiAiZi5hIgorLy8gICAgIHBhdGhzOiAiZi5iLmQiCisvLworLy8gSGVyZSBgZmAgcmVwcmVzZW50cyBhIGZpZWxkIGluIHNvbWUgcm9vdCBtZXNzYWdlLCBgYWAgYW5kIGBiYAorLy8gZmllbGRzIGluIHRoZSBtZXNzYWdlIGZvdW5kIGluIGBmYCwgYW5kIGBkYCBhIGZpZWxkIGZvdW5kIGluIHRoZQorLy8gbWVzc2FnZSBpbiBgZi5iYC4KKy8vCisvLyBGaWVsZCBtYXNrcyBhcmUgdXNlZCB0byBzcGVjaWZ5IGEgc3Vic2V0IG9mIGZpZWxkcyB0aGF0IHNob3VsZCBiZQorLy8gcmV0dXJuZWQgYnkgYSBnZXQgb3BlcmF0aW9uIG9yIG1vZGlmaWVkIGJ5IGFuIHVwZGF0ZSBvcGVyYXRpb24uCisvLyBGaWVsZCBtYXNrcyBhbHNvIGhhdmUgYSBjdXN0b20gSlNPTiBlbmNvZGluZyAoc2VlIGJlbG93KS4KKy8vCisvLyAjIEZpZWxkIE1hc2tzIGluIFByb2plY3Rpb25zCisvLworLy8gV2hlbiB1c2VkIGluIHRoZSBjb250ZXh0IG9mIGEgcHJvamVjdGlvbiwgYSByZXNwb25zZSBtZXNzYWdlIG9yCisvLyBzdWItbWVzc2FnZSBpcyBmaWx0ZXJlZCBieSB0aGUgQVBJIHRvIG9ubHkgY29udGFpbiB0aG9zZSBmaWVsZHMgYXMKKy8vIHNwZWNpZmllZCBpbiB0aGUgbWFzay4gRm9yIGV4YW1wbGUsIGlmIHRoZSBtYXNrIGluIHRoZSBwcmV2aW91cworLy8gZXhhbXBsZSBpcyBhcHBsaWVkIHRvIGEgcmVzcG9uc2UgbWVzc2FnZSBhcyBmb2xsb3dzOgorLy8KKy8vICAgICBmIHsKKy8vICAgICAgIGEgOiAyMgorLy8gICAgICAgYiB7CisvLyAgICAgICAgIGQgOiAxCisvLyAgICAgICAgIHggOiAyCisvLyAgICAgICB9CisvLyAgICAgICB5IDogMTMKKy8vICAgICB9CisvLyAgICAgejogOAorLy8KKy8vIFRoZSByZXN1bHQgd2lsbCBub3QgY29udGFpbiBzcGVjaWZpYyB2YWx1ZXMgZm9yIGZpZWxkcyB4LHkgYW5kIHoKKy8vICh0aGVpciB2YWx1ZSB3aWxsIGJlIHNldCB0byB0aGUgZGVmYXVsdCwgYW5kIG9taXR0ZWQgaW4gcHJvdG8gdGV4dAorLy8gb3V0cHV0KToKKy8vCisvLworLy8gICAgIGYgeworLy8gICAgICAgYSA6IDIyCisvLyAgICAgICBiIHsKKy8vICAgICAgICAgZCA6IDEKKy8vICAgICAgIH0KKy8vICAgICB9CisvLworLy8gQSByZXBlYXRlZCBmaWVsZCBpcyBub3QgYWxsb3dlZCBleGNlcHQgYXQgdGhlIGxhc3QgcG9zaXRpb24gb2YgYQorLy8gcGF0aHMgc3RyaW5nLgorLy8KKy8vIElmIGEgRmllbGRNYXNrIG9iamVjdCBpcyBub3QgcHJlc2VudCBpbiBhIGdldCBvcGVyYXRpb24sIHRoZQorLy8gb3BlcmF0aW9uIGFwcGxpZXMgdG8gYWxsIGZpZWxkcyAoYXMgaWYgYSBGaWVsZE1hc2sgb2YgYWxsIGZpZWxkcworLy8gaGFkIGJlZW4gc3BlY2lmaWVkKS4KKy8vCisvLyBOb3RlIHRoYXQgYSBmaWVsZCBtYXNrIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGFwcGx5IHRvIHRoZQorLy8gdG9wLWxldmVsIHJlc3BvbnNlIG1lc3NhZ2UuIEluIGNhc2Ugb2YgYSBSRVNUIGdldCBvcGVyYXRpb24sIHRoZQorLy8gZmllbGQgbWFzayBhcHBsaWVzIGRpcmVjdGx5IHRvIHRoZSByZXNwb25zZSwgYnV0IGluIGNhc2Ugb2YgYSBSRVNUCisvLyBsaXN0IG9wZXJhdGlvbiwgdGhlIG1hc2sgaW5zdGVhZCBhcHBsaWVzIHRvIGVhY2ggaW5kaXZpZHVhbCBtZXNzYWdlCisvLyBpbiB0aGUgcmV0dXJuZWQgcmVzb3VyY2UgbGlzdC4gSW4gY2FzZSBvZiBhIFJFU1QgY3VzdG9tIG1ldGhvZCwKKy8vIG90aGVyIGRlZmluaXRpb25zIG1heSBiZSB1c2VkLiBXaGVyZSB0aGUgbWFzayBhcHBsaWVzIHdpbGwgYmUKKy8vIGNsZWFybHkgZG9jdW1lbnRlZCB0b2dldGhlciB3aXRoIGl0cyBkZWNsYXJhdGlvbiBpbiB0aGUgQVBJLiAgSW4KKy8vIGFueSBjYXNlLCB0aGUgZWZmZWN0IG9uIHRoZSByZXR1cm5lZCByZXNvdXJjZS9yZXNvdXJjZXMgaXMgcmVxdWlyZWQKKy8vIGJlaGF2aW9yIGZvciBBUElzLgorLy8KKy8vICMgRmllbGQgTWFza3MgaW4gVXBkYXRlIE9wZXJhdGlvbnMKKy8vCisvLyBBIGZpZWxkIG1hc2sgaW4gdXBkYXRlIG9wZXJhdGlvbnMgc3BlY2lmaWVzIHdoaWNoIGZpZWxkcyBvZiB0aGUKKy8vIHRhcmdldGVkIHJlc291cmNlIGFyZSBnb2luZyB0byBiZSB1cGRhdGVkLiBUaGUgQVBJIGlzIHJlcXVpcmVkCisvLyB0byBvbmx5IGNoYW5nZSB0aGUgdmFsdWVzIG9mIHRoZSBmaWVsZHMgYXMgc3BlY2lmaWVkIGluIHRoZSBtYXNrCisvLyBhbmQgbGVhdmUgdGhlIG90aGVycyB1bnRvdWNoZWQuIElmIGEgcmVzb3VyY2UgaXMgcGFzc2VkIGluIHRvCisvLyBkZXNjcmliZSB0aGUgdXBkYXRlZCB2YWx1ZXMsIHRoZSBBUEkgaWdub3JlcyB0aGUgdmFsdWVzIG9mIGFsbAorLy8gZmllbGRzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBtYXNrLgorLy8KKy8vIElmIGEgcmVwZWF0ZWQgZmllbGQgaXMgc3BlY2lmaWVkIGZvciBhbiB1cGRhdGUgb3BlcmF0aW9uLCBuZXcgdmFsdWVzIHdpbGwKKy8vIGJlIGFwcGVuZGVkIHRvIHRoZSBleGlzdGluZyByZXBlYXRlZCBmaWVsZCBpbiB0aGUgdGFyZ2V0IHJlc291cmNlLiBOb3RlIHRoYXQKKy8vIGEgcmVwZWF0ZWQgZmllbGQgaXMgb25seSBhbGxvd2VkIGluIHRoZSBsYXN0IHBvc2l0aW9uIG9mIGEgYHBhdGhzYCBzdHJpbmcuCisvLworLy8gSWYgYSBzdWItbWVzc2FnZSBpcyBzcGVjaWZpZWQgaW4gdGhlIGxhc3QgcG9zaXRpb24gb2YgdGhlIGZpZWxkIG1hc2sgZm9yIGFuCisvLyB1cGRhdGUgb3BlcmF0aW9uLCB0aGVuIG5ldyB2YWx1ZSB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBleGlzdGluZyBzdWItbWVzc2FnZQorLy8gaW4gdGhlIHRhcmdldCByZXNvdXJjZS4KKy8vCisvLyBGb3IgZXhhbXBsZSwgZ2l2ZW4gdGhlIHRhcmdldCBtZXNzYWdlOgorLy8KKy8vICAgICBmIHsKKy8vICAgICAgIGIgeworLy8gICAgICAgICBkOiAxCisvLyAgICAgICAgIHg6IDIKKy8vICAgICAgIH0KKy8vICAgICAgIGM6IFsxXQorLy8gICAgIH0KKy8vCisvLyBBbmQgYW4gdXBkYXRlIG1lc3NhZ2U6CisvLworLy8gICAgIGYgeworLy8gICAgICAgYiB7CisvLyAgICAgICAgIGQ6IDEwCisvLyAgICAgICB9CisvLyAgICAgICBjOiBbMl0KKy8vICAgICB9CisvLworLy8gdGhlbiBpZiB0aGUgZmllbGQgbWFzayBpczoKKy8vCisvLyAgcGF0aHM6IFsiZi5iIiwgImYuYyJdCisvLworLy8gdGhlbiB0aGUgcmVzdWx0IHdpbGwgYmU6CisvLworLy8gICAgIGYgeworLy8gICAgICAgYiB7CisvLyAgICAgICAgIGQ6IDEwCisvLyAgICAgICAgIHg6IDIKKy8vICAgICAgIH0KKy8vICAgICAgIGM6IFsxLCAyXQorLy8gICAgIH0KKy8vCisvLyBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgcHJvdmlkZSBvcHRpb25zIHRvIG92ZXJyaWRlIHRoaXMgZGVmYXVsdCBiZWhhdmlvciBmb3IKKy8vIHJlcGVhdGVkIGFuZCBtZXNzYWdlIGZpZWxkcy4KKy8vCisvLyBJbiBvcmRlciB0byByZXNldCBhIGZpZWxkJ3MgdmFsdWUgdG8gdGhlIGRlZmF1bHQsIHRoZSBmaWVsZCBtdXN0CisvLyBiZSBpbiB0aGUgbWFzayBhbmQgc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlIGluIHRoZSBwcm92aWRlZCByZXNvdXJjZS4KKy8vIEhlbmNlLCBpbiBvcmRlciB0byByZXNldCBhbGwgZmllbGRzIG9mIGEgcmVzb3VyY2UsIHByb3ZpZGUgYSBkZWZhdWx0CisvLyBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgYW5kIHNldCBhbGwgZmllbGRzIGluIHRoZSBtYXNrLCBvciBkbworLy8gbm90IHByb3ZpZGUgYSBtYXNrIGFzIGRlc2NyaWJlZCBiZWxvdy4KKy8vCisvLyBJZiBhIGZpZWxkIG1hc2sgaXMgbm90IHByZXNlbnQgb24gdXBkYXRlLCB0aGUgb3BlcmF0aW9uIGFwcGxpZXMgdG8KKy8vIGFsbCBmaWVsZHMgKGFzIGlmIGEgZmllbGQgbWFzayBvZiBhbGwgZmllbGRzIGhhcyBiZWVuIHNwZWNpZmllZCkuCisvLyBOb3RlIHRoYXQgaW4gdGhlIHByZXNlbmNlIG9mIHNjaGVtYSBldm9sdXRpb24sIHRoaXMgbWF5IG1lYW4gdGhhdAorLy8gZmllbGRzIHRoZSBjbGllbnQgZG9lcyBub3Qga25vdyBhbmQgaGFzIHRoZXJlZm9yZSBub3QgZmlsbGVkIGludG8KKy8vIHRoZSByZXF1ZXN0IHdpbGwgYmUgcmVzZXQgdG8gdGhlaXIgZGVmYXVsdC4gSWYgdGhpcyBpcyB1bndhbnRlZAorLy8gYmVoYXZpb3IsIGEgc3BlY2lmaWMgc2VydmljZSBtYXkgcmVxdWlyZSBhIGNsaWVudCB0byBhbHdheXMgc3BlY2lmeQorLy8gYSBmaWVsZCBtYXNrLCBwcm9kdWNpbmcgYW4gZXJyb3IgaWYgbm90LgorLy8KKy8vIEFzIHdpdGggZ2V0IG9wZXJhdGlvbnMsIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2Ugd2hpY2gKKy8vIGRlc2NyaWJlcyB0aGUgdXBkYXRlZCB2YWx1ZXMgaW4gdGhlIHJlcXVlc3QgbWVzc2FnZSBkZXBlbmRzIG9uIHRoZQorLy8gb3BlcmF0aW9uIGtpbmQuIEluIGFueSBjYXNlLCB0aGUgZWZmZWN0IG9mIHRoZSBmaWVsZCBtYXNrIGlzCisvLyByZXF1aXJlZCB0byBiZSBob25vcmVkIGJ5IHRoZSBBUEkuCisvLworLy8gIyMgQ29uc2lkZXJhdGlvbnMgZm9yIEhUVFAgUkVTVAorLy8KKy8vIFRoZSBIVFRQIGtpbmQgb2YgYW4gdXBkYXRlIG9wZXJhdGlvbiB3aGljaCB1c2VzIGEgZmllbGQgbWFzayBtdXN0CisvLyBiZSBzZXQgdG8gUEFUQ0ggaW5zdGVhZCBvZiBQVVQgaW4gb3JkZXIgdG8gc2F0aXNmeSBIVFRQIHNlbWFudGljcworLy8gKFBVVCBtdXN0IG9ubHkgYmUgdXNlZCBmb3IgZnVsbCB1cGRhdGVzKS4KKy8vCisvLyAjIEpTT04gRW5jb2Rpbmcgb2YgRmllbGQgTWFza3MKKy8vCisvLyBJbiBKU09OLCBhIGZpZWxkIG1hc2sgaXMgZW5jb2RlZCBhcyBhIHNpbmdsZSBzdHJpbmcgd2hlcmUgcGF0aHMgYXJlCisvLyBzZXBhcmF0ZWQgYnkgYSBjb21tYS4gRmllbGRzIG5hbWUgaW4gZWFjaCBwYXRoIGFyZSBjb252ZXJ0ZWQKKy8vIHRvL2Zyb20gbG93ZXItY2FtZWwgbmFtaW5nIGNvbnZlbnRpb25zLgorLy8KKy8vIEFzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgbWVzc2FnZSBkZWNsYXJhdGlvbnM6CisvLworLy8gICAgIG1lc3NhZ2UgUHJvZmlsZSB7CisvLyAgICAgICBVc2VyIHVzZXIgPSAxOworLy8gICAgICAgUGhvdG8gcGhvdG8gPSAyOworLy8gICAgIH0KKy8vICAgICBtZXNzYWdlIFVzZXIgeworLy8gICAgICAgc3RyaW5nIGRpc3BsYXlfbmFtZSA9IDE7CisvLyAgICAgICBzdHJpbmcgYWRkcmVzcyA9IDI7CisvLyAgICAgfQorLy8KKy8vIEluIHByb3RvIGEgZmllbGQgbWFzayBmb3IgYFByb2ZpbGVgIG1heSBsb29rIGFzIHN1Y2g6CisvLworLy8gICAgIG1hc2sgeworLy8gICAgICAgcGF0aHM6ICJ1c2VyLmRpc3BsYXlfbmFtZSIKKy8vICAgICAgIHBhdGhzOiAicGhvdG8iCisvLyAgICAgfQorLy8KKy8vIEluIEpTT04sIHRoZSBzYW1lIG1hc2sgaXMgcmVwcmVzZW50ZWQgYXMgYmVsb3c6CisvLworLy8gICAgIHsKKy8vICAgICAgIG1hc2s6ICJ1c2VyLmRpc3BsYXlOYW1lLHBob3RvIgorLy8gICAgIH0KKy8vCisvLyAjIEZpZWxkIE1hc2tzIGFuZCBPbmVvZiBGaWVsZHMKKy8vCisvLyBGaWVsZCBtYXNrcyB0cmVhdCBmaWVsZHMgaW4gb25lb2ZzIGp1c3QgYXMgcmVndWxhciBmaWVsZHMuIENvbnNpZGVyIHRoZQorLy8gZm9sbG93aW5nIG1lc3NhZ2U6CisvLworLy8gICAgIG1lc3NhZ2UgU2FtcGxlTWVzc2FnZSB7CisvLyAgICAgICBvbmVvZiB0ZXN0X29uZW9mIHsKKy8vICAgICAgICAgc3RyaW5nIG5hbWUgPSA0OworLy8gICAgICAgICBTdWJNZXNzYWdlIHN1Yl9tZXNzYWdlID0gOTsKKy8vICAgICAgIH0KKy8vICAgICB9CisvLworLy8gVGhlIGZpZWxkIG1hc2sgY2FuIGJlOgorLy8KKy8vICAgICBtYXNrIHsKKy8vICAgICAgIHBhdGhzOiAibmFtZSIKKy8vICAgICB9CisvLworLy8gT3I6CisvLworLy8gICAgIG1hc2sgeworLy8gICAgICAgcGF0aHM6ICJzdWJfbWVzc2FnZSIKKy8vICAgICB9CisvLworLy8gTm90ZSB0aGF0IG9uZW9mIHR5cGUgbmFtZXMgKCJ0ZXN0X29uZW9mIiBpbiB0aGlzIGNhc2UpIGNhbm5vdCBiZSB1c2VkIGluCisvLyBwYXRocy4KKy8vCisvLyAjIyBGaWVsZCBNYXNrIFZlcmlmaWNhdGlvbgorLy8KKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhbnkgQVBJIG1ldGhvZCB3aGljaCBoYXMgYSBGaWVsZE1hc2sgdHlwZSBmaWVsZCBpbiB0aGUKKy8vIHJlcXVlc3Qgc2hvdWxkIHZlcmlmeSB0aGUgaW5jbHVkZWQgZmllbGQgcGF0aHMsIGFuZCByZXR1cm4gYW4KKy8vIGBJTlZBTElEX0FSR1VNRU5UYCBlcnJvciBpZiBhbnkgcGF0aCBpcyB1bm1hcHBhYmxlLgorbWVzc2FnZSBGaWVsZE1hc2sgeworICAvLyBUaGUgc2V0IG9mIGZpZWxkIG1hc2sgcGF0aHMuCisgIHJlcGVhdGVkIHN0cmluZyBwYXRocyA9IDE7Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90byBiL2luY2x1ZGUvZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YmZjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90bwpAQCAtMCwwICsxLDQ4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOworCitvcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMiOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJTb3VyY2VDb250ZXh0UHJvdG8iOworb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOworb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gIkdQQiI7CitvcHRpb24gZ29fcGFja2FnZSA9ICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9zb3VyY2Vjb250ZXh0cGIiOworCisvLyBgU291cmNlQ29udGV4dGAgcmVwcmVzZW50cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc291cmNlIG9mIGEKKy8vIHByb3RvYnVmIGVsZW1lbnQsIGxpa2UgdGhlIGZpbGUgaW4gd2hpY2ggaXQgaXMgZGVmaW5lZC4KK21lc3NhZ2UgU291cmNlQ29udGV4dCB7CisgIC8vIFRoZSBwYXRoLXF1YWxpZmllZCBuYW1lIG9mIHRoZSAucHJvdG8gZmlsZSB0aGF0IGNvbnRhaW5lZCB0aGUgYXNzb2NpYXRlZAorICAvLyBwcm90b2J1ZiBlbGVtZW50LiAgRm9yIGV4YW1wbGU6IGAiZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvImAuCisgIHN0cmluZyBmaWxlX25hbWUgPSAxOworfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9nb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvIGIvaW5jbHVkZS9nb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYzg0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2dvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8KQEAgLTAsMCArMSw5NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1ZjsKKworb3B0aW9uIGNzaGFycF9uYW1lc3BhY2UgPSAiR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzIjsKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKK29wdGlvbiBnb19wYWNrYWdlID0gImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3N0cnVjdHBiIjsKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiU3RydWN0UHJvdG8iOworb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOworb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gIkdQQiI7CisKKy8vIGBTdHJ1Y3RgIHJlcHJlc2VudHMgYSBzdHJ1Y3R1cmVkIGRhdGEgdmFsdWUsIGNvbnNpc3Rpbmcgb2YgZmllbGRzCisvLyB3aGljaCBtYXAgdG8gZHluYW1pY2FsbHkgdHlwZWQgdmFsdWVzLiBJbiBzb21lIGxhbmd1YWdlcywgYFN0cnVjdGAKKy8vIG1pZ2h0IGJlIHN1cHBvcnRlZCBieSBhIG5hdGl2ZSByZXByZXNlbnRhdGlvbi4gRm9yIGV4YW1wbGUsIGluCisvLyBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGxpa2UgSlMgYSBzdHJ1Y3QgaXMgcmVwcmVzZW50ZWQgYXMgYW4KKy8vIG9iamVjdC4gVGhlIGRldGFpbHMgb2YgdGhhdCByZXByZXNlbnRhdGlvbiBhcmUgZGVzY3JpYmVkIHRvZ2V0aGVyCisvLyB3aXRoIHRoZSBwcm90byBzdXBwb3J0IGZvciB0aGUgbGFuZ3VhZ2UuCisvLworLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBTdHJ1Y3RgIGlzIEpTT04gb2JqZWN0LgorbWVzc2FnZSBTdHJ1Y3QgeworICAvLyBVbm9yZGVyZWQgbWFwIG9mIGR5bmFtaWNhbGx5IHR5cGVkIHZhbHVlcy4KKyAgbWFwPHN0cmluZywgVmFsdWU+IGZpZWxkcyA9IDE7Cit9CisKKy8vIGBWYWx1ZWAgcmVwcmVzZW50cyBhIGR5bmFtaWNhbGx5IHR5cGVkIHZhbHVlIHdoaWNoIGNhbiBiZSBlaXRoZXIKKy8vIG51bGwsIGEgbnVtYmVyLCBhIHN0cmluZywgYSBib29sZWFuLCBhIHJlY3Vyc2l2ZSBzdHJ1Y3QgdmFsdWUsIG9yIGEKKy8vIGxpc3Qgb2YgdmFsdWVzLiBBIHByb2R1Y2VyIG9mIHZhbHVlIGlzIGV4cGVjdGVkIHRvIHNldCBvbmUgb2YgdGhlc2UKKy8vIHZhcmlhbnRzLiBBYnNlbmNlIG9mIGFueSB2YXJpYW50IGluZGljYXRlcyBhbiBlcnJvci4KKy8vCisvLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYFZhbHVlYCBpcyBKU09OIHZhbHVlLgorbWVzc2FnZSBWYWx1ZSB7CisgIC8vIFRoZSBraW5kIG9mIHZhbHVlLgorICBvbmVvZiBraW5kIHsKKyAgICAvLyBSZXByZXNlbnRzIGEgbnVsbCB2YWx1ZS4KKyAgICBOdWxsVmFsdWUgbnVsbF92YWx1ZSA9IDE7CisgICAgLy8gUmVwcmVzZW50cyBhIGRvdWJsZSB2YWx1ZS4KKyAgICBkb3VibGUgbnVtYmVyX3ZhbHVlID0gMjsKKyAgICAvLyBSZXByZXNlbnRzIGEgc3RyaW5nIHZhbHVlLgorICAgIHN0cmluZyBzdHJpbmdfdmFsdWUgPSAzOworICAgIC8vIFJlcHJlc2VudHMgYSBib29sZWFuIHZhbHVlLgorICAgIGJvb2wgYm9vbF92YWx1ZSA9IDQ7CisgICAgLy8gUmVwcmVzZW50cyBhIHN0cnVjdHVyZWQgdmFsdWUuCisgICAgU3RydWN0IHN0cnVjdF92YWx1ZSA9IDU7CisgICAgLy8gUmVwcmVzZW50cyBhIHJlcGVhdGVkIGBWYWx1ZWAuCisgICAgTGlzdFZhbHVlIGxpc3RfdmFsdWUgPSA2OworICB9Cit9CisKKy8vIGBOdWxsVmFsdWVgIGlzIGEgc2luZ2xldG9uIGVudW1lcmF0aW9uIHRvIHJlcHJlc2VudCB0aGUgbnVsbCB2YWx1ZSBmb3IgdGhlCisvLyBgVmFsdWVgIHR5cGUgdW5pb24uCisvLworLy8gIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgTnVsbFZhbHVlYCBpcyBKU09OIGBudWxsYC4KK2VudW0gTnVsbFZhbHVlIHsKKyAgLy8gTnVsbCB2YWx1ZS4KKyAgTlVMTF9WQUxVRSA9IDA7Cit9CisKKy8vIGBMaXN0VmFsdWVgIGlzIGEgd3JhcHBlciBhcm91bmQgYSByZXBlYXRlZCBmaWVsZCBvZiB2YWx1ZXMuCisvLworLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBMaXN0VmFsdWVgIGlzIEpTT04gYXJyYXkuCittZXNzYWdlIExpc3RWYWx1ZSB7CisgIC8vIFJlcGVhdGVkIGZpZWxkIG9mIGR5bmFtaWNhbGx5IHR5cGVkIHZhbHVlcy4KKyAgcmVwZWF0ZWQgVmFsdWUgdmFsdWVzID0gMTsKK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byBiL2luY2x1ZGUvZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjJkZjZkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvCkBAIC0wLDAgKzEsMTQ3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOworCitvcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMiOworb3B0aW9uIGNjX2VuYWJsZV9hcmVuYXMgPSB0cnVlOworb3B0aW9uIGdvX3BhY2thZ2UgPSAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vdGltZXN0YW1wcGIiOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJUaW1lc3RhbXBQcm90byI7CitvcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7CitvcHRpb24gb2JqY19jbGFzc19wcmVmaXggPSAiR1BCIjsKKworLy8gQSBUaW1lc3RhbXAgcmVwcmVzZW50cyBhIHBvaW50IGluIHRpbWUgaW5kZXBlbmRlbnQgb2YgYW55IHRpbWUgem9uZSBvciBsb2NhbAorLy8gY2FsZW5kYXIsIGVuY29kZWQgYXMgYSBjb3VudCBvZiBzZWNvbmRzIGFuZCBmcmFjdGlvbnMgb2Ygc2Vjb25kcyBhdAorLy8gbmFub3NlY29uZCByZXNvbHV0aW9uLiBUaGUgY291bnQgaXMgcmVsYXRpdmUgdG8gYW4gZXBvY2ggYXQgVVRDIG1pZG5pZ2h0IG9uCisvLyBKYW51YXJ5IDEsIDE5NzAsIGluIHRoZSBwcm9sZXB0aWMgR3JlZ29yaWFuIGNhbGVuZGFyIHdoaWNoIGV4dGVuZHMgdGhlCisvLyBHcmVnb3JpYW4gY2FsZW5kYXIgYmFja3dhcmRzIHRvIHllYXIgb25lLgorLy8KKy8vIEFsbCBtaW51dGVzIGFyZSA2MCBzZWNvbmRzIGxvbmcuIExlYXAgc2Vjb25kcyBhcmUgInNtZWFyZWQiIHNvIHRoYXQgbm8gbGVhcAorLy8gc2Vjb25kIHRhYmxlIGlzIG5lZWRlZCBmb3IgaW50ZXJwcmV0YXRpb24sIHVzaW5nIGEgWzI0LWhvdXIgbGluZWFyCisvLyBzbWVhcl0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vdGltZS9zbWVhcikuCisvLworLy8gVGhlIHJhbmdlIGlzIGZyb20gMDAwMS0wMS0wMVQwMDowMDowMFogdG8gOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5OTlaLiBCeQorLy8gcmVzdHJpY3RpbmcgdG8gdGhhdCByYW5nZSwgd2UgZW5zdXJlIHRoYXQgd2UgY2FuIGNvbnZlcnQgdG8gYW5kIGZyb20gW1JGQworLy8gMzMzOV0oaHR0cHM6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMzMzkudHh0KSBkYXRlIHN0cmluZ3MuCisvLworLy8gIyBFeGFtcGxlcworLy8KKy8vIEV4YW1wbGUgMTogQ29tcHV0ZSBUaW1lc3RhbXAgZnJvbSBQT1NJWCBgdGltZSgpYC4KKy8vCisvLyAgICAgVGltZXN0YW1wIHRpbWVzdGFtcDsKKy8vICAgICB0aW1lc3RhbXAuc2V0X3NlY29uZHModGltZShOVUxMKSk7CisvLyAgICAgdGltZXN0YW1wLnNldF9uYW5vcygwKTsKKy8vCisvLyBFeGFtcGxlIDI6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gUE9TSVggYGdldHRpbWVvZmRheSgpYC4KKy8vCisvLyAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisvLyAgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisvLworLy8gICAgIFRpbWVzdGFtcCB0aW1lc3RhbXA7CisvLyAgICAgdGltZXN0YW1wLnNldF9zZWNvbmRzKHR2LnR2X3NlYyk7CisvLyAgICAgdGltZXN0YW1wLnNldF9uYW5vcyh0di50dl91c2VjICogMTAwMCk7CisvLworLy8gRXhhbXBsZSAzOiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIFdpbjMyIGBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgpYC4KKy8vCisvLyAgICAgRklMRVRJTUUgZnQ7CisvLyAgICAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoJmZ0KTsKKy8vICAgICBVSU5UNjQgdGlja3MgPSAoKChVSU5UNjQpZnQuZHdIaWdoRGF0ZVRpbWUpIDw8IDMyKSB8IGZ0LmR3TG93RGF0ZVRpbWU7CisvLworLy8gICAgIC8vIEEgV2luZG93cyB0aWNrIGlzIDEwMCBuYW5vc2Vjb25kcy4gV2luZG93cyBlcG9jaCAxNjAxLTAxLTAxVDAwOjAwOjAwWgorLy8gICAgIC8vIGlzIDExNjQ0NDczNjAwIHNlY29uZHMgYmVmb3JlIFVuaXggZXBvY2ggMTk3MC0wMS0wMVQwMDowMDowMFouCisvLyAgICAgVGltZXN0YW1wIHRpbWVzdGFtcDsKKy8vICAgICB0aW1lc3RhbXAuc2V0X3NlY29uZHMoKElOVDY0KSAoKHRpY2tzIC8gMTAwMDAwMDApIC0gMTE2NDQ0NzM2MDBMTCkpOworLy8gICAgIHRpbWVzdGFtcC5zZXRfbmFub3MoKElOVDMyKSAoKHRpY2tzICUgMTAwMDAwMDApICogMTAwKSk7CisvLworLy8gRXhhbXBsZSA0OiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIEphdmEgYFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpYC4KKy8vCisvLyAgICAgbG9uZyBtaWxsaXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKy8vCisvLyAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IFRpbWVzdGFtcC5uZXdCdWlsZGVyKCkuc2V0U2Vjb25kcyhtaWxsaXMgLyAxMDAwKQorLy8gICAgICAgICAuc2V0TmFub3MoKGludCkgKChtaWxsaXMgJSAxMDAwKSAqIDEwMDAwMDApKS5idWlsZCgpOworLy8KKy8vCisvLyBFeGFtcGxlIDU6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gSmF2YSBgSW5zdGFudC5ub3coKWAuCisvLworLy8gICAgIEluc3RhbnQgbm93ID0gSW5zdGFudC5ub3coKTsKKy8vCisvLyAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9CisvLyAgICAgICAgIFRpbWVzdGFtcC5uZXdCdWlsZGVyKCkuc2V0U2Vjb25kcyhub3cuZ2V0RXBvY2hTZWNvbmQoKSkKKy8vICAgICAgICAgICAgIC5zZXROYW5vcyhub3cuZ2V0TmFubygpKS5idWlsZCgpOworLy8KKy8vCisvLyBFeGFtcGxlIDY6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gY3VycmVudCB0aW1lIGluIFB5dGhvbi4KKy8vCisvLyAgICAgdGltZXN0YW1wID0gVGltZXN0YW1wKCkKKy8vICAgICB0aW1lc3RhbXAuR2V0Q3VycmVudFRpbWUoKQorLy8KKy8vICMgSlNPTiBNYXBwaW5nCisvLworLy8gSW4gSlNPTiBmb3JtYXQsIHRoZSBUaW1lc3RhbXAgdHlwZSBpcyBlbmNvZGVkIGFzIGEgc3RyaW5nIGluIHRoZQorLy8gW1JGQyAzMzM5XShodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQpIGZvcm1hdC4gVGhhdCBpcywgdGhlCisvLyBmb3JtYXQgaXMgInt5ZWFyfS17bW9udGh9LXtkYXl9VHtob3VyfTp7bWlufTp7c2VjfVsue2ZyYWNfc2VjfV1aIgorLy8gd2hlcmUge3llYXJ9IGlzIGFsd2F5cyBleHByZXNzZWQgdXNpbmcgZm91ciBkaWdpdHMgd2hpbGUge21vbnRofSwge2RheX0sCisvLyB7aG91cn0sIHttaW59LCBhbmQge3NlY30gYXJlIHplcm8tcGFkZGVkIHRvIHR3byBkaWdpdHMgZWFjaC4gVGhlIGZyYWN0aW9uYWwKKy8vIHNlY29uZHMsIHdoaWNoIGNhbiBnbyB1cCB0byA5IGRpZ2l0cyAoaS5lLiB1cCB0byAxIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiksCisvLyBhcmUgb3B0aW9uYWwuIFRoZSAiWiIgc3VmZml4IGluZGljYXRlcyB0aGUgdGltZXpvbmUgKCJVVEMiKTsgdGhlIHRpbWV6b25lCisvLyBpcyByZXF1aXJlZC4gQSBwcm90bzMgSlNPTiBzZXJpYWxpemVyIHNob3VsZCBhbHdheXMgdXNlIFVUQyAoYXMgaW5kaWNhdGVkIGJ5CisvLyAiWiIpIHdoZW4gcHJpbnRpbmcgdGhlIFRpbWVzdGFtcCB0eXBlIGFuZCBhIHByb3RvMyBKU09OIHBhcnNlciBzaG91bGQgYmUKKy8vIGFibGUgdG8gYWNjZXB0IGJvdGggVVRDIGFuZCBvdGhlciB0aW1lem9uZXMgKGFzIGluZGljYXRlZCBieSBhbiBvZmZzZXQpLgorLy8KKy8vIEZvciBleGFtcGxlLCAiMjAxNy0wMS0xNVQwMTozMDoxNS4wMVoiIGVuY29kZXMgMTUuMDEgc2Vjb25kcyBwYXN0CisvLyAwMTozMCBVVEMgb24gSmFudWFyeSAxNSwgMjAxNy4KKy8vCisvLyBJbiBKYXZhU2NyaXB0LCBvbmUgY2FuIGNvbnZlcnQgYSBEYXRlIG9iamVjdCB0byB0aGlzIGZvcm1hdCB1c2luZyB0aGUKKy8vIHN0YW5kYXJkCisvLyBbdG9JU09TdHJpbmcoKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZS90b0lTT1N0cmluZykKKy8vIG1ldGhvZC4gSW4gUHl0aG9uLCBhIHN0YW5kYXJkIGBkYXRldGltZS5kYXRldGltZWAgb2JqZWN0IGNhbiBiZSBjb252ZXJ0ZWQKKy8vIHRvIHRoaXMgZm9ybWF0IHVzaW5nCisvLyBbYHN0cmZ0aW1lYF0oaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMi9saWJyYXJ5L3RpbWUuaHRtbCN0aW1lLnN0cmZ0aW1lKSB3aXRoCisvLyB0aGUgdGltZSBmb3JtYXQgc3BlYyAnJVktJW0tJWRUJUg6JU06JVMuJWZaJy4gTGlrZXdpc2UsIGluIEphdmEsIG9uZSBjYW4gdXNlCisvLyB0aGUgSm9kYSBUaW1lJ3MgW2BJU09EYXRlVGltZUZvcm1hdC5kYXRlVGltZSgpYF0oCisvLyBodHRwOi8vd3d3LmpvZGEub3JnL2pvZGEtdGltZS9hcGlkb2NzL29yZy9qb2RhL3RpbWUvZm9ybWF0L0lTT0RhdGVUaW1lRm9ybWF0Lmh0bWwjZGF0ZVRpbWUlMkQlMkQKKy8vICkgdG8gb2J0YWluIGEgZm9ybWF0dGVyIGNhcGFibGUgb2YgZ2VuZXJhdGluZyB0aW1lc3RhbXBzIGluIHRoaXMgZm9ybWF0LgorLy8KKy8vCittZXNzYWdlIFRpbWVzdGFtcCB7CisgIC8vIFJlcHJlc2VudHMgc2Vjb25kcyBvZiBVVEMgdGltZSBzaW5jZSBVbml4IGVwb2NoCisgIC8vIDE5NzAtMDEtMDFUMDA6MDA6MDBaLiBNdXN0IGJlIGZyb20gMDAwMS0wMS0wMVQwMDowMDowMFogdG8KKyAgLy8gOTk5OS0xMi0zMVQyMzo1OTo1OVogaW5jbHVzaXZlLgorICBpbnQ2NCBzZWNvbmRzID0gMTsKKworICAvLyBOb24tbmVnYXRpdmUgZnJhY3Rpb25zIG9mIGEgc2Vjb25kIGF0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbi4gTmVnYXRpdmUKKyAgLy8gc2Vjb25kIHZhbHVlcyB3aXRoIGZyYWN0aW9ucyBtdXN0IHN0aWxsIGhhdmUgbm9uLW5lZ2F0aXZlIG5hbm9zIHZhbHVlcworICAvLyB0aGF0IGNvdW50IGZvcndhcmQgaW4gdGltZS4gTXVzdCBiZSBmcm9tIDAgdG8gOTk5LDk5OSw5OTkKKyAgLy8gaW5jbHVzaXZlLgorICBpbnQzMiBuYW5vcyA9IDI7Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2dvb2dsZS9wcm90b2J1Zi90eXBlLnByb3RvIGIvaW5jbHVkZS9nb29nbGUvcHJvdG9idWYvdHlwZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y2YTY4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9nb29nbGUvcHJvdG9idWYvdHlwZS5wcm90bwpAQCAtMCwwICsxLDE4NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvIjsKKworb3B0aW9uIGNzaGFycF9uYW1lc3BhY2UgPSAiR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzIjsKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiVHlwZVByb3RvIjsKK29wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKK29wdGlvbiBvYmpjX2NsYXNzX3ByZWZpeCA9ICJHUEIiOworb3B0aW9uIGdvX3BhY2thZ2UgPSAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vdHlwZXBiIjsKKworLy8gQSBwcm90b2NvbCBidWZmZXIgbWVzc2FnZSB0eXBlLgorbWVzc2FnZSBUeXBlIHsKKyAgLy8gVGhlIGZ1bGx5IHF1YWxpZmllZCBtZXNzYWdlIG5hbWUuCisgIHN0cmluZyBuYW1lID0gMTsKKyAgLy8gVGhlIGxpc3Qgb2YgZmllbGRzLgorICByZXBlYXRlZCBGaWVsZCBmaWVsZHMgPSAyOworICAvLyBUaGUgbGlzdCBvZiB0eXBlcyBhcHBlYXJpbmcgaW4gYG9uZW9mYCBkZWZpbml0aW9ucyBpbiB0aGlzIHR5cGUuCisgIHJlcGVhdGVkIHN0cmluZyBvbmVvZnMgPSAzOworICAvLyBUaGUgcHJvdG9jb2wgYnVmZmVyIG9wdGlvbnMuCisgIHJlcGVhdGVkIE9wdGlvbiBvcHRpb25zID0gNDsKKyAgLy8gVGhlIHNvdXJjZSBjb250ZXh0LgorICBTb3VyY2VDb250ZXh0IHNvdXJjZV9jb250ZXh0ID0gNTsKKyAgLy8gVGhlIHNvdXJjZSBzeW50YXguCisgIFN5bnRheCBzeW50YXggPSA2OworfQorCisvLyBBIHNpbmdsZSBmaWVsZCBvZiBhIG1lc3NhZ2UgdHlwZS4KK21lc3NhZ2UgRmllbGQgeworICAvLyBCYXNpYyBmaWVsZCB0eXBlcy4KKyAgZW51bSBLaW5kIHsKKyAgICAvLyBGaWVsZCB0eXBlIHVua25vd24uCisgICAgVFlQRV9VTktOT1dOID0gMDsKKyAgICAvLyBGaWVsZCB0eXBlIGRvdWJsZS4KKyAgICBUWVBFX0RPVUJMRSA9IDE7CisgICAgLy8gRmllbGQgdHlwZSBmbG9hdC4KKyAgICBUWVBFX0ZMT0FUID0gMjsKKyAgICAvLyBGaWVsZCB0eXBlIGludDY0LgorICAgIFRZUEVfSU5UNjQgPSAzOworICAgIC8vIEZpZWxkIHR5cGUgdWludDY0LgorICAgIFRZUEVfVUlOVDY0ID0gNDsKKyAgICAvLyBGaWVsZCB0eXBlIGludDMyLgorICAgIFRZUEVfSU5UMzIgPSA1OworICAgIC8vIEZpZWxkIHR5cGUgZml4ZWQ2NC4KKyAgICBUWVBFX0ZJWEVENjQgPSA2OworICAgIC8vIEZpZWxkIHR5cGUgZml4ZWQzMi4KKyAgICBUWVBFX0ZJWEVEMzIgPSA3OworICAgIC8vIEZpZWxkIHR5cGUgYm9vbC4KKyAgICBUWVBFX0JPT0wgPSA4OworICAgIC8vIEZpZWxkIHR5cGUgc3RyaW5nLgorICAgIFRZUEVfU1RSSU5HID0gOTsKKyAgICAvLyBGaWVsZCB0eXBlIGdyb3VwLiBQcm90bzIgc3ludGF4IG9ubHksIGFuZCBkZXByZWNhdGVkLgorICAgIFRZUEVfR1JPVVAgPSAxMDsKKyAgICAvLyBGaWVsZCB0eXBlIG1lc3NhZ2UuCisgICAgVFlQRV9NRVNTQUdFID0gMTE7CisgICAgLy8gRmllbGQgdHlwZSBieXRlcy4KKyAgICBUWVBFX0JZVEVTID0gMTI7CisgICAgLy8gRmllbGQgdHlwZSB1aW50MzIuCisgICAgVFlQRV9VSU5UMzIgPSAxMzsKKyAgICAvLyBGaWVsZCB0eXBlIGVudW0uCisgICAgVFlQRV9FTlVNID0gMTQ7CisgICAgLy8gRmllbGQgdHlwZSBzZml4ZWQzMi4KKyAgICBUWVBFX1NGSVhFRDMyID0gMTU7CisgICAgLy8gRmllbGQgdHlwZSBzZml4ZWQ2NC4KKyAgICBUWVBFX1NGSVhFRDY0ID0gMTY7CisgICAgLy8gRmllbGQgdHlwZSBzaW50MzIuCisgICAgVFlQRV9TSU5UMzIgPSAxNzsKKyAgICAvLyBGaWVsZCB0eXBlIHNpbnQ2NC4KKyAgICBUWVBFX1NJTlQ2NCA9IDE4OworICB9CisKKyAgLy8gV2hldGhlciBhIGZpZWxkIGlzIG9wdGlvbmFsLCByZXF1aXJlZCwgb3IgcmVwZWF0ZWQuCisgIGVudW0gQ2FyZGluYWxpdHkgeworICAgIC8vIEZvciBmaWVsZHMgd2l0aCB1bmtub3duIGNhcmRpbmFsaXR5LgorICAgIENBUkRJTkFMSVRZX1VOS05PV04gPSAwOworICAgIC8vIEZvciBvcHRpb25hbCBmaWVsZHMuCisgICAgQ0FSRElOQUxJVFlfT1BUSU9OQUwgPSAxOworICAgIC8vIEZvciByZXF1aXJlZCBmaWVsZHMuIFByb3RvMiBzeW50YXggb25seS4KKyAgICBDQVJESU5BTElUWV9SRVFVSVJFRCA9IDI7CisgICAgLy8gRm9yIHJlcGVhdGVkIGZpZWxkcy4KKyAgICBDQVJESU5BTElUWV9SRVBFQVRFRCA9IDM7CisgIH0KKworICAvLyBUaGUgZmllbGQgdHlwZS4KKyAgS2luZCBraW5kID0gMTsKKyAgLy8gVGhlIGZpZWxkIGNhcmRpbmFsaXR5LgorICBDYXJkaW5hbGl0eSBjYXJkaW5hbGl0eSA9IDI7CisgIC8vIFRoZSBmaWVsZCBudW1iZXIuCisgIGludDMyIG51bWJlciA9IDM7CisgIC8vIFRoZSBmaWVsZCBuYW1lLgorICBzdHJpbmcgbmFtZSA9IDQ7CisgIC8vIFRoZSBmaWVsZCB0eXBlIFVSTCwgd2l0aG91dCB0aGUgc2NoZW1lLCBmb3IgbWVzc2FnZSBvciBlbnVtZXJhdGlvbgorICAvLyB0eXBlcy4gRXhhbXBsZTogYCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiYC4KKyAgc3RyaW5nIHR5cGVfdXJsID0gNjsKKyAgLy8gVGhlIGluZGV4IG9mIHRoZSBmaWVsZCB0eXBlIGluIGBUeXBlLm9uZW9mc2AsIGZvciBtZXNzYWdlIG9yIGVudW1lcmF0aW9uCisgIC8vIHR5cGVzLiBUaGUgZmlyc3QgdHlwZSBoYXMgaW5kZXggMTsgemVybyBtZWFucyB0aGUgdHlwZSBpcyBub3QgaW4gdGhlIGxpc3QuCisgIGludDMyIG9uZW9mX2luZGV4ID0gNzsKKyAgLy8gV2hldGhlciB0byB1c2UgYWx0ZXJuYXRpdmUgcGFja2VkIHdpcmUgcmVwcmVzZW50YXRpb24uCisgIGJvb2wgcGFja2VkID0gODsKKyAgLy8gVGhlIHByb3RvY29sIGJ1ZmZlciBvcHRpb25zLgorICByZXBlYXRlZCBPcHRpb24gb3B0aW9ucyA9IDk7CisgIC8vIFRoZSBmaWVsZCBKU09OIG5hbWUuCisgIHN0cmluZyBqc29uX25hbWUgPSAxMDsKKyAgLy8gVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGZpZWxkLiBQcm90bzIgc3ludGF4IG9ubHkuCisgIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gMTE7Cit9CisKKy8vIEVudW0gdHlwZSBkZWZpbml0aW9uLgorbWVzc2FnZSBFbnVtIHsKKyAgLy8gRW51bSB0eXBlIG5hbWUuCisgIHN0cmluZyBuYW1lID0gMTsKKyAgLy8gRW51bSB2YWx1ZSBkZWZpbml0aW9ucy4KKyAgcmVwZWF0ZWQgRW51bVZhbHVlIGVudW12YWx1ZSA9IDI7CisgIC8vIFByb3RvY29sIGJ1ZmZlciBvcHRpb25zLgorICByZXBlYXRlZCBPcHRpb24gb3B0aW9ucyA9IDM7CisgIC8vIFRoZSBzb3VyY2UgY29udGV4dC4KKyAgU291cmNlQ29udGV4dCBzb3VyY2VfY29udGV4dCA9IDQ7CisgIC8vIFRoZSBzb3VyY2Ugc3ludGF4LgorICBTeW50YXggc3ludGF4ID0gNTsKK30KKworLy8gRW51bSB2YWx1ZSBkZWZpbml0aW9uLgorbWVzc2FnZSBFbnVtVmFsdWUgeworICAvLyBFbnVtIHZhbHVlIG5hbWUuCisgIHN0cmluZyBuYW1lID0gMTsKKyAgLy8gRW51bSB2YWx1ZSBudW1iZXIuCisgIGludDMyIG51bWJlciA9IDI7CisgIC8vIFByb3RvY29sIGJ1ZmZlciBvcHRpb25zLgorICByZXBlYXRlZCBPcHRpb24gb3B0aW9ucyA9IDM7Cit9CisKKy8vIEEgcHJvdG9jb2wgYnVmZmVyIG9wdGlvbiwgd2hpY2ggY2FuIGJlIGF0dGFjaGVkIHRvIGEgbWVzc2FnZSwgZmllbGQsCisvLyBlbnVtZXJhdGlvbiwgZXRjLgorbWVzc2FnZSBPcHRpb24geworICAvLyBUaGUgb3B0aW9uJ3MgbmFtZS4gRm9yIHByb3RvYnVmIGJ1aWx0LWluIG9wdGlvbnMgKG9wdGlvbnMgZGVmaW5lZCBpbgorICAvLyBkZXNjcmlwdG9yLnByb3RvKSwgdGhpcyBpcyB0aGUgc2hvcnQgbmFtZS4gRm9yIGV4YW1wbGUsIGAibWFwX2VudHJ5ImAuCisgIC8vIEZvciBjdXN0b20gb3B0aW9ucywgaXQgc2hvdWxkIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZS4gRm9yIGV4YW1wbGUsCisgIC8vIGAiZ29vZ2xlLmFwaS5odHRwImAuCisgIHN0cmluZyBuYW1lID0gMTsKKyAgLy8gVGhlIG9wdGlvbidzIHZhbHVlIHBhY2tlZCBpbiBhbiBBbnkgbWVzc2FnZS4gSWYgdGhlIHZhbHVlIGlzIGEgcHJpbWl0aXZlLAorICAvLyB0aGUgY29ycmVzcG9uZGluZyB3cmFwcGVyIHR5cGUgZGVmaW5lZCBpbiBnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8KKyAgLy8gc2hvdWxkIGJlIHVzZWQuIElmIHRoZSB2YWx1ZSBpcyBhbiBlbnVtLCBpdCBzaG91bGQgYmUgc3RvcmVkIGFzIGFuIGludDMyCisgIC8vIHZhbHVlIHVzaW5nIHRoZSBnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSB0eXBlLgorICBBbnkgdmFsdWUgPSAyOworfQorCisvLyBUaGUgc3ludGF4IGluIHdoaWNoIGEgcHJvdG9jb2wgYnVmZmVyIGVsZW1lbnQgaXMgZGVmaW5lZC4KK2VudW0gU3ludGF4IHsKKyAgLy8gU3ludGF4IGBwcm90bzJgLgorICBTWU5UQVhfUFJPVE8yID0gMDsKKyAgLy8gU3ludGF4IGBwcm90bzNgLgorICBTWU5UQVhfUFJPVE8zID0gMTsKK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvIGIvaW5jbHVkZS9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ5ZGQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvCkBAIC0wLDAgKzEsMTIzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gV3JhcHBlcnMgZm9yIHByaW1pdGl2ZSAobm9uLW1lc3NhZ2UpIHR5cGVzLiBUaGVzZSB0eXBlcyBhcmUgdXNlZnVsCisvLyBmb3IgZW1iZWRkaW5nIHByaW1pdGl2ZXMgaW4gdGhlIGBnb29nbGUucHJvdG9idWYuQW55YCB0eXBlIGFuZCBmb3IgcGxhY2VzCisvLyB3aGVyZSB3ZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIGFic2VuY2Ugb2YgYSBwcmltaXRpdmUKKy8vIHR5cGVkIGZpZWxkIGFuZCBpdHMgZGVmYXVsdCB2YWx1ZS4KKy8vCisvLyBUaGVzZSB3cmFwcGVycyBoYXZlIG5vIG1lYW5pbmdmdWwgdXNlIHdpdGhpbiByZXBlYXRlZCBmaWVsZHMgYXMgdGhleSBsYWNrCisvLyB0aGUgYWJpbGl0eSB0byBkZXRlY3QgcHJlc2VuY2Ugb24gaW5kaXZpZHVhbCBlbGVtZW50cy4KKy8vIFRoZXNlIHdyYXBwZXJzIGhhdmUgbm8gbWVhbmluZ2Z1bCB1c2Ugd2l0aGluIGEgbWFwIG9yIGEgb25lb2Ygc2luY2UKKy8vIGluZGl2aWR1YWwgZW50cmllcyBvZiBhIG1hcCBvciBmaWVsZHMgb2YgYSBvbmVvZiBjYW4gYWxyZWFkeSBkZXRlY3QgcHJlc2VuY2UuCisKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1ZjsKKworb3B0aW9uIGNzaGFycF9uYW1lc3BhY2UgPSAiR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzIjsKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKK29wdGlvbiBnb19wYWNrYWdlID0gImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3dyYXBwZXJzcGIiOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJXcmFwcGVyc1Byb3RvIjsKK29wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKK29wdGlvbiBvYmpjX2NsYXNzX3ByZWZpeCA9ICJHUEIiOworCisvLyBXcmFwcGVyIG1lc3NhZ2UgZm9yIGBkb3VibGVgLgorLy8KKy8vIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgRG91YmxlVmFsdWVgIGlzIEpTT04gbnVtYmVyLgorbWVzc2FnZSBEb3VibGVWYWx1ZSB7CisgIC8vIFRoZSBkb3VibGUgdmFsdWUuCisgIGRvdWJsZSB2YWx1ZSA9IDE7Cit9CisKKy8vIFdyYXBwZXIgbWVzc2FnZSBmb3IgYGZsb2F0YC4KKy8vCisvLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYEZsb2F0VmFsdWVgIGlzIEpTT04gbnVtYmVyLgorbWVzc2FnZSBGbG9hdFZhbHVlIHsKKyAgLy8gVGhlIGZsb2F0IHZhbHVlLgorICBmbG9hdCB2YWx1ZSA9IDE7Cit9CisKKy8vIFdyYXBwZXIgbWVzc2FnZSBmb3IgYGludDY0YC4KKy8vCisvLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYEludDY0VmFsdWVgIGlzIEpTT04gc3RyaW5nLgorbWVzc2FnZSBJbnQ2NFZhbHVlIHsKKyAgLy8gVGhlIGludDY0IHZhbHVlLgorICBpbnQ2NCB2YWx1ZSA9IDE7Cit9CisKKy8vIFdyYXBwZXIgbWVzc2FnZSBmb3IgYHVpbnQ2NGAuCisvLworLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBVSW50NjRWYWx1ZWAgaXMgSlNPTiBzdHJpbmcuCittZXNzYWdlIFVJbnQ2NFZhbHVlIHsKKyAgLy8gVGhlIHVpbnQ2NCB2YWx1ZS4KKyAgdWludDY0IHZhbHVlID0gMTsKK30KKworLy8gV3JhcHBlciBtZXNzYWdlIGZvciBgaW50MzJgLgorLy8KKy8vIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgSW50MzJWYWx1ZWAgaXMgSlNPTiBudW1iZXIuCittZXNzYWdlIEludDMyVmFsdWUgeworICAvLyBUaGUgaW50MzIgdmFsdWUuCisgIGludDMyIHZhbHVlID0gMTsKK30KKworLy8gV3JhcHBlciBtZXNzYWdlIGZvciBgdWludDMyYC4KKy8vCisvLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYFVJbnQzMlZhbHVlYCBpcyBKU09OIG51bWJlci4KK21lc3NhZ2UgVUludDMyVmFsdWUgeworICAvLyBUaGUgdWludDMyIHZhbHVlLgorICB1aW50MzIgdmFsdWUgPSAxOworfQorCisvLyBXcmFwcGVyIG1lc3NhZ2UgZm9yIGBib29sYC4KKy8vCisvLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYEJvb2xWYWx1ZWAgaXMgSlNPTiBgdHJ1ZWAgYW5kIGBmYWxzZWAuCittZXNzYWdlIEJvb2xWYWx1ZSB7CisgIC8vIFRoZSBib29sIHZhbHVlLgorICBib29sIHZhbHVlID0gMTsKK30KKworLy8gV3JhcHBlciBtZXNzYWdlIGZvciBgc3RyaW5nYC4KKy8vCisvLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYFN0cmluZ1ZhbHVlYCBpcyBKU09OIHN0cmluZy4KK21lc3NhZ2UgU3RyaW5nVmFsdWUgeworICAvLyBUaGUgc3RyaW5nIHZhbHVlLgorICBzdHJpbmcgdmFsdWUgPSAxOworfQorCisvLyBXcmFwcGVyIG1lc3NhZ2UgZm9yIGBieXRlc2AuCisvLworLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBCeXRlc1ZhbHVlYCBpcyBKU09OIHN0cmluZy4KK21lc3NhZ2UgQnl0ZXNWYWx1ZSB7CisgIC8vIFRoZSBieXRlcyB2YWx1ZS4KKyAgYnl0ZXMgdmFsdWUgPSAxOworfQpkaWZmIC0tZ2l0IGEvcHl0aG9uL01BTklGRVNULmluIGIvcHl0aG9uL01BTklGRVNULmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTc2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vTUFOSUZFU1QuaW4KQEAgLTAsMCArMSwxOSBAQAorcHJ1bmUgZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ltcG9ydF90ZXN0X3BhY2thZ2UKK2V4Y2x1ZGUgZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsLypfcGIyLnB5CitleGNsdWRlIGdvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC8qX3Rlc3QucHkKK2V4Y2x1ZGUgZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsLyoucHJvdG8KK2V4Y2x1ZGUgZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Rlc3RfdXRpbC5weQorCityZWN1cnNpdmUtaW5jbHVkZSBnb29nbGUgKi5jYworcmVjdXJzaXZlLWluY2x1ZGUgZ29vZ2xlICouaAorCityZWN1cnNpdmUtZXhjbHVkZSBnb29nbGUgKl90ZXN0LnB5CityZWN1cnNpdmUtZXhjbHVkZSBnb29nbGUgKl90ZXN0LnByb3RvCityZWN1cnNpdmUtZXhjbHVkZSBnb29nbGUgdW5pdHRlc3QqX3BiMi5weQorCitnbG9iYWwtZXhjbHVkZSAqLmRsbAorZ2xvYmFsLWV4Y2x1ZGUgKi5weWMKK2dsb2JhbC1leGNsdWRlICoucHlvCitnbG9iYWwtZXhjbHVkZSAqLnNvCisKK2luY2x1ZGUgTElDRU5TRQpkaWZmIC0tZ2l0IGEvcHl0aG9uL1JFQURNRS5tZCBiL3B5dGhvbi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmMjJjOAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9SRUFETUUubWQKQEAgLTAsMCArMSwxMzAgQEAKK1Byb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBQeXRob24gUHJvdG9jb2wgQnVmZmVycyBydW50aW1lIGxpYnJhcnkuCisKK05vcm1hbGx5LCB0aGlzIGRpcmVjdG9yeSBjb21lcyBhcyBwYXJ0IG9mIHRoZSBwcm90b2J1ZiBwYWNrYWdlLCBhdmFpbGFibGUKK2Zyb206CisKKyAgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKworVGhlIGNvbXBsZXRlIHBhY2thZ2UgaW5jbHVkZXMgdGhlIEMrKyBzb3VyY2UgY29kZSwgd2hpY2ggaW5jbHVkZXMgdGhlCitQcm90b2NvbCBDb21waWxlciAocHJvdG9jKS4gIElmIHlvdSBkb3dubG9hZGVkIHRoaXMgcGFja2FnZSBmcm9tIFB5UEkKK29yIHNvbWUgb3RoZXIgUHl0aG9uLXNwZWNpZmljIHNvdXJjZSwgeW91IG1heSBoYXZlIHJlY2VpdmVkIG9ubHkgdGhlCitQeXRob24gcGFydCBvZiB0aGUgY29kZS4gIEluIHRoaXMgY2FzZSwgeW91IHdpbGwgbmVlZCB0byBvYnRhaW4gdGhlCitQcm90b2NvbCBDb21waWxlciBmcm9tIHNvbWUgb3RoZXIgc291cmNlIGJlZm9yZSB5b3UgY2FuIHVzZSB0aGlzCitwYWNrYWdlLgorCitEZXZlbG9wbWVudCBXYXJuaW5nCis9PT09PT09PT09PT09PT09PT09CisKK1RoZSBwdXJlIHB5dGhvbiBwZXJmb3JtYW5jZSBpcyBzbG93LiBGb3IgYmV0dGVyIHBlcmZvcm1hbmNlIHBsZWFzZQordXNlIHB5dGhvbiBjKysgaW1wbGVtZW50YXRpb24uCisKK0luc3RhbGxhdGlvbgorPT09PT09PT09PT09CisKKzEpIE1ha2Ugc3VyZSB5b3UgaGF2ZSBQeXRob24gMy43IG9yIG5ld2VyLiAgSWYgaW4gZG91YnQsIHJ1bjoKKworICAgICAgICQgcHl0aG9uIC1WCisKKzIpIElmIHlvdSBkbyBub3QgaGF2ZSBzZXR1cHRvb2xzIGluc3RhbGxlZCwgbm90ZSB0aGF0IGl0IHdpbGwgYmUKKyAgIGRvd25sb2FkZWQgYW5kIGluc3RhbGxlZCBhdXRvbWF0aWNhbGx5IGFzIHNvb24gYXMgeW91IHJ1biBgc2V0dXAucHlgLgorICAgSWYgeW91IHdvdWxkIHJhdGhlciBpbnN0YWxsIGl0IG1hbnVhbGx5LCB5b3UgbWF5IGRvIHNvIGJ5IGZvbGxvd2luZworICAgdGhlIGluc3RydWN0aW9ucyBvbiBbdGhpcyBwYWdlXShodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9pbnN0YWxsaW5nLmh0bWwjc2V0dXAtZm9yLWluc3RhbGxpbmctcGFja2FnZXMpLgorCiszKSBCdWlsZCB0aGUgQysrIGNvZGUsIG9yIGluc3RhbGwgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIGBwcm90b2NgLiAgSWYKKyAgIHlvdSBpbnN0YWxsIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiwgbWFrZSBzdXJlIHRoYXQgaXQgaXMgdGhlIHNhbWUKKyAgIHZlcnNpb24gYXMgdGhpcyBwYWNrYWdlLiAgSWYgaW4gZG91YnQsIHJ1bjoKKworICAgICAgICQgcHJvdG9jIC0tdmVyc2lvbgorCis0KSBCdWlsZCBhbmQgcnVuIHRoZSB0ZXN0czoKKworICAgICAgICQgcHl0aG9uIHNldHVwLnB5IGJ1aWxkCisgICAgICAgJCBweXRob24gc2V0dXAucHkgdGVzdAorCisgICBUbyBidWlsZCwgdGVzdCwgYW5kIHVzZSB0aGUgQysrIGltcGxlbWVudGF0aW9uLCB5b3UgbXVzdCBmaXJzdCBjb21waWxlCisgICBgbGlicHJvdG9idWYuc29gOgorCisgICAgICAgJCAoY2QgLi4gJiYgbWFrZSkKKworICAgT24gT1MgWDoKKworICAgSWYgeW91IGFyZSBydW5uaW5nIGEgSG9tZWJyZXctcHJvdmlkZWQgUHl0aG9uLCB5b3UgbXVzdCBtYWtlIHN1cmUgYW5vdGhlcgorICAgdmVyc2lvbiBvZiBwcm90b2J1ZiBpcyBub3QgYWxyZWFkeSBpbnN0YWxsZWQsIGFzIEhvbWVicmV3J3MgUHl0aG9uIHdpbGwKKyAgIHNlYXJjaCBgL3Vzci9sb2NhbC9saWJgIGZvciBgbGlicHJvdG9idWYuc29gIGJlZm9yZSBpdCBzZWFyY2hlcworICAgYC4uL3NyYy8ubGlic2AuCisKKyAgIFlvdSBjYW4gZWl0aGVyIHVubGluayBIb21lYnJldydzIHByb3RvYnVmIG9yIGluc3RhbGwgdGhlIGBsaWJwcm90b2J1ZmAgeW91CisgICBidWlsdCBlYXJsaWVyOgorCisgICAgICAgJCBicmV3IHVubGluayBwcm90b2J1ZgorCisgICBvcgorCisgICAgICAgJCAoY2QgLi4gJiYgbWFrZSBpbnN0YWxsKQorCisgICAgT24gb3RoZXIgKm5peDoKKworICAgIFlvdSBtdXN0IG1ha2UgYGxpYnByb3RvYnVmLnNvYCBkeW5hbWljYWxseSBhdmFpbGFibGUuIFlvdSBjYW4gZWl0aGVyCisgICAgaW5zdGFsbCBsaWJwcm90b2J1ZiB5b3UgYnVpbHQgZWFybGllciwgb3Igc2V0IGBMRF9MSUJSQVJZX1BBVEhgOgorCisgICAgICAgJCBleHBvcnQgTERfTElCUkFSWV9QQVRIPS4uL3NyYy8ubGlicworCisgICAgb3IKKworICAgICAgICQgKGNkIC4uICYmIG1ha2UgaW5zdGFsbCkKKworICAgVG8gYnVpbGQgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBydW46CisKKyAgICAgICAkIHB5dGhvbiBzZXR1cC5weSBidWlsZCAtLWNwcF9pbXBsZW1lbnRhdGlvbgorCisgICBUaGVuIHJ1biB0aGUgdGVzdHMgbGlrZSBzbzoKKworICAgICAgICQgcHl0aG9uIHNldHVwLnB5IHRlc3QgLS1jcHBfaW1wbGVtZW50YXRpb24KKworICAgSWYgc29tZSB0ZXN0cyBmYWlsLCB0aGlzIGxpYnJhcnkgbWF5IG5vdCB3b3JrIGNvcnJlY3RseSBvbiB5b3VyCisgICBzeXN0ZW0uICBDb250aW51ZSBhdCB5b3VyIG93biByaXNrLgorCisgICBQbGVhc2Ugbm90ZSB0aGF0IHRoZXJlIGlzIGEga25vd24gcHJvYmxlbSB3aXRoIHNvbWUgdmVyc2lvbnMgb2YKKyAgIFB5dGhvbiBvbiBDeWd3aW4gd2hpY2ggY2F1c2VzIHRoZSB0ZXN0cyB0byBmYWlsIGFmdGVyIHByaW50aW5nIHRoZQorICAgZXJyb3I6ICBgc2VtX2luaXQ6IFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlYC4gIFRoaXMgYXBwZWFycworICAgdG8gYmUgYSBbYnVnIGVpdGhlciBpbiBDeWd3aW4gb3IgaW4KKyAgIFB5dGhvbl0oaHR0cDovL3d3dy5jeWd3aW4uY29tL21sL2N5Z3dpbi8yMDA1LTA3L21zZzAxMzc4Lmh0bWwpLgorCisgICBXZSBkbyBub3Qga25vdyBpZiBvciB3aGVuIGl0IG1pZ2h0IGJlIGZpeGVkLiAgV2UgYWxzbyBkbyBub3Qga25vdworICAgaG93IGxpa2VseSBpdCBpcyB0aGF0IHRoaXMgYnVnIHdpbGwgYWZmZWN0IHVzZXJzIGluIHByYWN0aWNlLgorCis1KSBJbnN0YWxsOgorCisgICAgICAgJCBweXRob24gc2V0dXAucHkgaW5zdGFsbAorCisgICBvcjoKKworICAgICAgICQgKGNkIC4uICYmIG1ha2UgaW5zdGFsbCkKKyAgICAgICAkIHB5dGhvbiBzZXR1cC5weSBpbnN0YWxsIC0tY3BwX2ltcGxlbWVudGF0aW9uCisKKyAgIFRoaXMgc3RlcCBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4KKyAgIE5PVEU6IFRvIHVzZSBDKysgaW1wbGVtZW50YXRpb24sIHlvdSBuZWVkIHRvIGV4cG9ydCBhbiBlbnZpcm9ubWVudAorICAgdmFyaWFibGUgYmVmb3JlIHJ1bm5pbmcgeW91ciBwcm9ncmFtLiAgU2VlIHRoZSAiQysrIEltcGxlbWVudGF0aW9uIgorICAgc2VjdGlvbiBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLgorCitVc2FnZQorPT09PT0KKworVGhlIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gZm9yIFByb3RvY29sIEJ1ZmZlcnMgaXMgYXZhaWxhYmxlIHZpYSB0aGUKK3dlYiBhdDoKKworICBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworCitDKysgSW1wbGVtZW50YXRpb24KKz09PT09PT09PT09PT09PT09PQorCitUaGUgQysrIGltcGxlbWVudGF0aW9uIGZvciBQeXRob24gbWVzc2FnZXMgaXMgYnVpbHQgYXMgYSBQeXRob24gZXh0ZW5zaW9uIHRvCitpbXByb3ZlIHRoZSBvdmVyYWxsIHByb3RvYnVmIFB5dGhvbiBwZXJmb3JtYW5jZS4KKworVG8gdXNlIHRoZSBDKysgaW1wbGVtZW50YXRpb24sIHlvdSBuZWVkIHRvIGluc3RhbGwgdGhlIEMrKyBwcm90b2J1ZiBydW50aW1lCitsaWJyYXJ5LCBwbGVhc2Ugc2VlIGluc3RydWN0aW9ucyBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvX19pbml0X18ucHkgYi9weXRob24vZ29vZ2xlL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ODU2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNCBAQAordHJ5OgorICBfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzJykuZGVjbGFyZV9uYW1lc3BhY2UoX19uYW1lX18pCitleGNlcHQgSW1wb3J0RXJyb3I6CisgIF9fcGF0aF9fID0gX19pbXBvcnRfXygncGtndXRpbCcpLmV4dGVuZF9wYXRoKF9fcGF0aF9fLCBfX25hbWVfXykKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvX19pbml0X18ucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YjE5N2UKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMzMgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBDb3B5cmlnaHQgMjAwNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitfX3ZlcnNpb25fXyA9ICc0LjIxLjknCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2FueV9wYjIucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2FueV9wYjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiNmFkOAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvYW55X3BiMi5weQpAQCAtMCwwICsxLDc4IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorIyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8KKyIiIkdlbmVyYXRlZCBwcm90b2NvbCBidWZmZXIgY29kZS4iIiIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yIGFzIF9kZXNjcmlwdG9yCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZSBhcyBfbWVzc2FnZQorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHJlZmxlY3Rpb24gYXMgX3JlZmxlY3Rpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzeW1ib2xfZGF0YWJhc2UgYXMgX3N5bWJvbF9kYXRhYmFzZQorIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW1wb3J0cykKKworX3N5bV9kYiA9IF9zeW1ib2xfZGF0YWJhc2UuRGVmYXVsdCgpCisKKworCisKK0RFU0NSSVBUT1IgPSBfZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcigKKyAgbmFtZT0nZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90bycsCisgIHBhY2thZ2U9J2dvb2dsZS5wcm90b2J1ZicsCisgIHN5bnRheD0ncHJvdG8zJywKKyAgc2VyaWFsaXplZF9vcHRpb25zPWInXG5cMDIzY29tLmdvb2dsZS5wcm90b2J1ZkJcMDEwQW55UHJvdG9QXDAwMVosZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vYW55cGJcMjQyXDAwMlwwMDNHUEJcMjUyXDAwMlwwMzZHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMnLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBzZXJpYWxpemVkX3BiPWInXG5ceDE5Z29vZ2xlL3Byb3RvYnVmL2FueS5wcm90b1x4MTJceDBmZ29vZ2xlLnByb3RvYnVmXCImXG5ceDAzXHg0MW55XHgxMlx4MTBcblx4MDh0eXBlX3VybFx4MThceDAxIFx4MDEoXHRceDEyXHJcblx4MDV2YWx1ZVx4MThceDAyIFx4MDEoXHgwY1x4NDJ2XG5ceDEzXHg2M29tLmdvb2dsZS5wcm90b2J1ZkJceDA4XHg0MW55UHJvdG9QXHgwMVosZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vYW55cGJceGEyXHgwMlx4MDNHUEJceGFhXHgwMlx4MWVHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiXHgwNnByb3RvMycKKykKKworCisKKworX0FOWSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0FueScsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkFueScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndHlwZV91cmwnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5BbnkudHlwZV91cmwnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd2YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkFueS52YWx1ZScsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xMiwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIiwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8zJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD00NiwKKyAgc2VyaWFsaXplZF9lbmQ9ODQsCispCisKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydBbnknXSA9IF9BTlkKK19zeW1fZGIuUmVnaXN0ZXJGaWxlRGVzY3JpcHRvcihERVNDUklQVE9SKQorCitBbnkgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdBbnknLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICdERVNDUklQVE9SJyA6IF9BTlksCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuYW55X3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkFueSkKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKEFueSkKKworCitERVNDUklQVE9SLl9vcHRpb25zID0gTm9uZQorIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobW9kdWxlX3Njb3BlKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdF9wYjIucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0X3BiMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGU1MzgzCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdF9wYjIucHkKQEAgLTAsMCArMSw5NiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMgR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKyMgc291cmNlOiBnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucHJvdG8KKyIiIkdlbmVyYXRlZCBwcm90b2NvbCBidWZmZXIgY29kZS4iIiIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yIGFzIF9kZXNjcmlwdG9yCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZSBhcyBfbWVzc2FnZQorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHJlZmxlY3Rpb24gYXMgX3JlZmxlY3Rpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzeW1ib2xfZGF0YWJhc2UgYXMgX3N5bWJvbF9kYXRhYmFzZQorIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW1wb3J0cykKKworX3N5bV9kYiA9IF9zeW1ib2xfZGF0YWJhc2UuRGVmYXVsdCgpCisKKworZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGFueV9wYjIgYXMgZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3RfYW55X19wYjIKKworCitERVNDUklQVE9SID0gX2Rlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IoCisgIG5hbWU9J2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wcm90bycsCisgIHBhY2thZ2U9J3Byb3RvYnVmX3VuaXR0ZXN0JywKKyAgc3ludGF4PSdwcm90bzMnLAorICBzZXJpYWxpemVkX29wdGlvbnM9YidCXDAxNFRlc3RBbnlQcm90bycsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIHNlcmlhbGl6ZWRfcGI9Yidcblx4MWVnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucHJvdG9ceDEyXHgxMXByb3RvYnVmX3VuaXR0ZXN0XHgxYVx4MTlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvXCJceDg3XHgwMVxuXHgwN1Rlc3RBbnlceDEyXHgxM1xuXHgwYmludDMyX3ZhbHVlXHgxOFx4MDEgXHgwMShceDA1XHgxMlwnXG5cdGFueV92YWx1ZVx4MThceDAyIFx4MDEoXHgwYlx4MzJceDE0Lmdvb2dsZS5wcm90b2J1Zi5BbnlceDEyXHgzMFxuXHgxMnJlcGVhdGVkX2FueV92YWx1ZVx4MThceDAzIFx4MDMoXHgwYlx4MzJceDE0Lmdvb2dsZS5wcm90b2J1Zi5BbnlceDEyXHgwY1xuXHgwNHRleHRceDE4XHgwNCBceDAxKFx0Qlx4MGVceDQyXHgwY1Rlc3RBbnlQcm90b2JceDA2cHJvdG8zJworICAsCisgIGRlcGVuZGVuY2llcz1bZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3RfYW55X19wYjIuREVTQ1JJUFRPUixdKQorCisKKworCitfVEVTVEFOWSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J1Rlc3RBbnknLAorICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbnknLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2ludDMyX3ZhbHVlJywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0QW55LmludDMyX3ZhbHVlJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nYW55X3ZhbHVlJywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0QW55LmFueV92YWx1ZScsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ncmVwZWF0ZWRfYW55X3ZhbHVlJywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0QW55LnJlcGVhdGVkX2FueV92YWx1ZScsIGluZGV4PTIsCisgICAgICBudW1iZXI9MywgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3RleHQnLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbnkudGV4dCcsIGluZGV4PTMsCisgICAgICBudW1iZXI9NCwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLmRlY29kZSgndXRmLTgnKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8zJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD04MSwKKyAgc2VyaWFsaXplZF9lbmQ9MjE2LAorKQorCitfVEVTVEFOWS5maWVsZHNfYnlfbmFtZVsnYW55X3ZhbHVlJ10ubWVzc2FnZV90eXBlID0gZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3RfYW55X19wYjIuX0FOWQorX1RFU1RBTlkuZmllbGRzX2J5X25hbWVbJ3JlcGVhdGVkX2FueV92YWx1ZSddLm1lc3NhZ2VfdHlwZSA9IGdvb2dsZV9kb3RfcHJvdG9idWZfZG90X2FueV9fcGIyLl9BTlkKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydUZXN0QW55J10gPSBfVEVTVEFOWQorX3N5bV9kYi5SZWdpc3RlckZpbGVEZXNjcmlwdG9yKERFU0NSSVBUT1IpCisKK1Rlc3RBbnkgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdUZXN0QW55JywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfVEVTVEFOWSwKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5hbnlfdGVzdF9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbnkpCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShUZXN0QW55KQorCisKK0RFU0NSSVBUT1IuX29wdGlvbnMgPSBOb25lCisjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtb2R1bGVfc2NvcGUpCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2FwaV9wYjIucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2FwaV9wYjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjYzA2NAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvYXBpX3BiMi5weQpAQCAtMCwwICsxLDI1MiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMgR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKyMgc291cmNlOiBnb29nbGUvcHJvdG9idWYvYXBpLnByb3RvCisiIiJHZW5lcmF0ZWQgcHJvdG9jb2wgYnVmZmVyIGNvZGUuIiIiCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvciBhcyBfZGVzY3JpcHRvcgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UgYXMgX21lc3NhZ2UKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCByZWZsZWN0aW9uIGFzIF9yZWZsZWN0aW9uCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc3ltYm9sX2RhdGFiYXNlIGFzIF9zeW1ib2xfZGF0YWJhc2UKKyMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGltcG9ydHMpCisKK19zeW1fZGIgPSBfc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKQorCisKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzb3VyY2VfY29udGV4dF9wYjIgYXMgZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3Rfc291cmNlX19jb250ZXh0X19wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0eXBlX3BiMiBhcyBnb29nbGVfZG90X3Byb3RvYnVmX2RvdF90eXBlX19wYjIKKworCitERVNDUklQVE9SID0gX2Rlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IoCisgIG5hbWU9J2dvb2dsZS9wcm90b2J1Zi9hcGkucHJvdG8nLAorICBwYWNrYWdlPSdnb29nbGUucHJvdG9idWYnLAorICBzeW50YXg9J3Byb3RvMycsCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1iJ1xuXDAyM2NvbS5nb29nbGUucHJvdG9idWZCXDAxMEFwaVByb3RvUFwwMDFaLGdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2FwaXBiXDI0MlwwMDJcMDAzR1BCXDI1MlwwMDJcMDM2R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzJywKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgc2VyaWFsaXplZF9wYj1iJ1xuXHgxOWdvb2dsZS9wcm90b2J1Zi9hcGkucHJvdG9ceDEyXHgwZmdvb2dsZS5wcm90b2J1Zlx4MWEkZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvXHgxYVx4MWFnb29nbGUvcHJvdG9idWYvdHlwZS5wcm90b1wiXHg4MVx4MDJcblx4MDNceDQxcGlceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMihcblx4MDdtZXRob2RzXHgxOFx4MDIgXHgwMyhceDBiXHgzMlx4MTcuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZFx4MTIoXG5ceDA3b3B0aW9uc1x4MThceDAzIFx4MDMoXHgwYlx4MzJceDE3Lmdvb2dsZS5wcm90b2J1Zi5PcHRpb25ceDEyXHgwZlxuXHgwN3ZlcnNpb25ceDE4XHgwNCBceDAxKFx0XHgxMlx4MzZcblx4MGVzb3VyY2VfY29udGV4dFx4MThceDA1IFx4MDEoXHgwYlx4MzJceDFlLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb250ZXh0XHgxMiZcblx4MDZtaXhpbnNceDE4XHgwNiBceDAzKFx4MGJceDMyXHgxNi5nb29nbGUucHJvdG9idWYuTWl4aW5ceDEyXCdcblx4MDZzeW50YXhceDE4XHgwNyBceDAxKFx4MGVceDMyXHgxNy5nb29nbGUucHJvdG9idWYuU3ludGF4XCJceGQ1XHgwMVxuXHgwNk1ldGhvZFx4MTJceDBjXG5ceDA0bmFtZVx4MThceDAxIFx4MDEoXHRceDEyXHgxOFxuXHgxMHJlcXVlc3RfdHlwZV91cmxceDE4XHgwMiBceDAxKFx0XHgxMlx4MTlcblx4MTFyZXF1ZXN0X3N0cmVhbWluZ1x4MThceDAzIFx4MDEoXHgwOFx4MTJceDE5XG5ceDExcmVzcG9uc2VfdHlwZV91cmxceDE4XHgwNCBceDAxKFx0XHgxMlx4MWFcblx4MTJyZXNwb25zZV9zdHJlYW1pbmdceDE4XHgwNSBceDAxKFx4MDhceDEyKFxuXHgwN29wdGlvbnNceDE4XHgwNiBceDAzKFx4MGJceDMyXHgxNy5nb29nbGUucHJvdG9idWYuT3B0aW9uXHgxMlwnXG5ceDA2c3ludGF4XHgxOFx4MDcgXHgwMShceDBlXHgzMlx4MTcuZ29vZ2xlLnByb3RvYnVmLlN5bnRheFwiI1xuXHgwNU1peGluXHgxMlx4MGNcblx4MDRuYW1lXHgxOFx4MDEgXHgwMShcdFx4MTJceDBjXG5ceDA0cm9vdFx4MThceDAyIFx4MDEoXHRCdlxuXHgxM1x4NjNvbS5nb29nbGUucHJvdG9idWZCXHgwOFx4NDFwaVByb3RvUFx4MDFaLGdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2FwaXBiXHhhMlx4MDJceDAzR1BCXHhhYVx4MDJceDFlR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYlx4MDZwcm90bzMnCisgICwKKyAgZGVwZW5kZW5jaWVzPVtnb29nbGVfZG90X3Byb3RvYnVmX2RvdF9zb3VyY2VfX2NvbnRleHRfX3BiMi5ERVNDUklQVE9SLGdvb2dsZV9kb3RfcHJvdG9idWZfZG90X3R5cGVfX3BiMi5ERVNDUklQVE9SLF0pCisKKworCisKK19BUEkgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdBcGknLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5BcGknLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5BcGkubmFtZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLmRlY29kZSgndXRmLTgnKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J21ldGhvZHMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5BcGkubWV0aG9kcycsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J29wdGlvbnMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5BcGkub3B0aW9ucycsIGluZGV4PTIsCisgICAgICBudW1iZXI9MywgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3ZlcnNpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5BcGkudmVyc2lvbicsIGluZGV4PTMsCisgICAgICBudW1iZXI9NCwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLmRlY29kZSgndXRmLTgnKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3NvdXJjZV9jb250ZXh0JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuQXBpLnNvdXJjZV9jb250ZXh0JywgaW5kZXg9NCwKKyAgICAgIG51bWJlcj01LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdtaXhpbnMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5BcGkubWl4aW5zJywgaW5kZXg9NSwKKyAgICAgIG51bWJlcj02LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nc3ludGF4JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuQXBpLnN5bnRheCcsIGluZGV4PTYsCisgICAgICBudW1iZXI9NywgdHlwZT0xNCwgY3BwX3R5cGU9OCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMycsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MTEzLAorICBzZXJpYWxpemVkX2VuZD0zNzAsCispCisKKworX01FVEhPRCA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J01ldGhvZCcsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1ldGhvZCcsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1ldGhvZC5uYW1lJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ncmVxdWVzdF90eXBlX3VybCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1ldGhvZC5yZXF1ZXN0X3R5cGVfdXJsJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ncmVxdWVzdF9zdHJlYW1pbmcnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2QucmVxdWVzdF9zdHJlYW1pbmcnLCBpbmRleD0yLAorICAgICAgbnVtYmVyPTMsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ncmVzcG9uc2VfdHlwZV91cmwnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2QucmVzcG9uc2VfdHlwZV91cmwnLCBpbmRleD0zLAorICAgICAgbnVtYmVyPTQsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdyZXNwb25zZV9zdHJlYW1pbmcnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2QucmVzcG9uc2Vfc3RyZWFtaW5nJywgaW5kZXg9NCwKKyAgICAgIG51bWJlcj01LCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J29wdGlvbnMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2Qub3B0aW9ucycsIGluZGV4PTUsCisgICAgICBudW1iZXI9NiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3N5bnRheCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1ldGhvZC5zeW50YXgnLCBpbmRleD02LAorICAgICAgbnVtYmVyPTcsIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzMnLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTM3MywKKyAgc2VyaWFsaXplZF9lbmQ9NTg2LAorKQorCisKK19NSVhJTiA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J01peGluJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWl4aW4nLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NaXhpbi5uYW1lJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ncm9vdCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1peGluLnJvb3QnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMycsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9NTg4LAorICBzZXJpYWxpemVkX2VuZD02MjMsCispCisKK19BUEkuZmllbGRzX2J5X25hbWVbJ21ldGhvZHMnXS5tZXNzYWdlX3R5cGUgPSBfTUVUSE9ECitfQVBJLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3RfdHlwZV9fcGIyLl9PUFRJT04KK19BUEkuZmllbGRzX2J5X25hbWVbJ3NvdXJjZV9jb250ZXh0J10ubWVzc2FnZV90eXBlID0gZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3Rfc291cmNlX19jb250ZXh0X19wYjIuX1NPVVJDRUNPTlRFWFQKK19BUEkuZmllbGRzX2J5X25hbWVbJ21peGlucyddLm1lc3NhZ2VfdHlwZSA9IF9NSVhJTgorX0FQSS5maWVsZHNfYnlfbmFtZVsnc3ludGF4J10uZW51bV90eXBlID0gZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3RfdHlwZV9fcGIyLl9TWU5UQVgKK19NRVRIT0QuZmllbGRzX2J5X25hbWVbJ29wdGlvbnMnXS5tZXNzYWdlX3R5cGUgPSBnb29nbGVfZG90X3Byb3RvYnVmX2RvdF90eXBlX19wYjIuX09QVElPTgorX01FVEhPRC5maWVsZHNfYnlfbmFtZVsnc3ludGF4J10uZW51bV90eXBlID0gZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3RfdHlwZV9fcGIyLl9TWU5UQVgKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydBcGknXSA9IF9BUEkKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydNZXRob2QnXSA9IF9NRVRIT0QKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydNaXhpbiddID0gX01JWElOCitfc3ltX2RiLlJlZ2lzdGVyRmlsZURlc2NyaXB0b3IoREVTQ1JJUFRPUikKKworQXBpID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnQXBpJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfQVBJLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLmFwaV9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5BcGkpCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShBcGkpCisKK01ldGhvZCA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ01ldGhvZCcsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX01FVEhPRCwKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5hcGlfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuTWV0aG9kKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoTWV0aG9kKQorCitNaXhpbiA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ01peGluJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfTUlYSU4sCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuYXBpX3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1peGluKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoTWl4aW4pCisKKworREVTQ1JJUFRPUi5fb3B0aW9ucyA9IE5vbmUKKyMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1vZHVsZV9zY29wZSkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvX19pbml0X18ucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbl9wYjIucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbl9wYjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5MGQxOAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luX3BiMi5weQpAQCAtMCwwICsxLDMwMSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMgR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKyMgc291cmNlOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvCisiIiJHZW5lcmF0ZWQgcHJvdG9jb2wgYnVmZmVyIGNvZGUuIiIiCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvciBhcyBfZGVzY3JpcHRvcgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UgYXMgX21lc3NhZ2UKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCByZWZsZWN0aW9uIGFzIF9yZWZsZWN0aW9uCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc3ltYm9sX2RhdGFiYXNlIGFzIF9zeW1ib2xfZGF0YWJhc2UKKyMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGltcG9ydHMpCisKK19zeW1fZGIgPSBfc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKQorCisKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMiBhcyBnb29nbGVfZG90X3Byb3RvYnVmX2RvdF9kZXNjcmlwdG9yX19wYjIKKworCitERVNDUklQVE9SID0gX2Rlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IoCisgIG5hbWU9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8nLAorICBwYWNrYWdlPSdnb29nbGUucHJvdG9idWYuY29tcGlsZXInLAorICBzeW50YXg9J3Byb3RvMicsCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1iJ1xuXDAzNGNvbS5nb29nbGUucHJvdG9idWYuY29tcGlsZXJCXDAxNFBsdWdpblByb3Rvc1opZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMvcGx1Z2lucGInLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBzZXJpYWxpemVkX3BiPWInXG4lZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90b1x4MTJceDE4Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyXHgxYSBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiRlxuXHgwN1ZlcnNpb25ceDEyXHJcblx4MDVtYWpvclx4MThceDAxIFx4MDEoXHgwNVx4MTJcclxuXHgwNW1pbm9yXHgxOFx4MDIgXHgwMShceDA1XHgxMlxyXG5ceDA1cGF0Y2hceDE4XHgwMyBceDAxKFx4MDVceDEyXHgwZVxuXHgwNnN1ZmZpeFx4MThceDA0IFx4MDEoXHRcIlx4YmFceDAxXG5ceDE0XHg0M29kZUdlbmVyYXRvclJlcXVlc3RceDEyXHgxOFxuXHgxMFx4NjZpbGVfdG9fZ2VuZXJhdGVceDE4XHgwMSBceDAzKFx0XHgxMlx4MTFcblx0cGFyYW1ldGVyXHgxOFx4MDIgXHgwMShcdFx4MTJceDM4XG5cbnByb3RvX2ZpbGVceDE4XHgwZiBceDAzKFx4MGJceDMyJC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90b1x4MTI7XG5ceDEwXHg2M29tcGlsZXJfdmVyc2lvblx4MThceDAzIFx4MDEoXHgwYlx4MzIhLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5WZXJzaW9uXCJceGMxXHgwMlxuXHgxNVx4NDNvZGVHZW5lcmF0b3JSZXNwb25zZVx4MTJcclxuXHgwNVx4NjVycm9yXHgxOFx4MDEgXHgwMShcdFx4MTJceDFhXG5ceDEyc3VwcG9ydGVkX2ZlYXR1cmVzXHgxOFx4MDIgXHgwMShceDA0XHgxMlx4NDJcblx4MDRceDY2aWxlXHgxOFx4MGYgXHgwMyhceDBiXHgzMlx4MzQuZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlXHgxYVx4N2Zcblx4MDRceDQ2aWxlXHgxMlx4MGNcblx4MDRuYW1lXHgxOFx4MDEgXHgwMShcdFx4MTJceDE3XG5ceDBmaW5zZXJ0aW9uX3BvaW50XHgxOFx4MDIgXHgwMShcdFx4MTJceDBmXG5ceDA3XHg2M29udGVudFx4MThceDBmIFx4MDEoXHRceDEyP1xuXHgxM2dlbmVyYXRlZF9jb2RlX2luZm9ceDE4XHgxMCBceDAxKFx4MGJceDMyXCIuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvXCI4XG5ceDA3XHg0Nlx4NjVceDYxdHVyZVx4MTJceDEwXG5ceDBjXHg0Nlx4NDVceDQxVFVSRV9OT05FXHgxMFx4MDBceDEyXHgxYlxuXHgxN1x4NDZceDQ1XHg0MVRVUkVfUFJPVE8zX09QVElPTkFMXHgxMFx4MDFceDQyV1xuXHgxY1x4NjNvbS5nb29nbGUucHJvdG9idWYuY29tcGlsZXJCXHgwY1BsdWdpblByb3Rvc1opZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMvcGx1Z2lucGInCisgICwKKyAgZGVwZW5kZW5jaWVzPVtnb29nbGVfZG90X3Byb3RvYnVmX2RvdF9kZXNjcmlwdG9yX19wYjIuREVTQ1JJUFRPUixdKQorCisKKworX0NPREVHRU5FUkFUT1JSRVNQT05TRV9GRUFUVVJFID0gX2Rlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IoCisgIG5hbWU9J0ZlYXR1cmUnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmVhdHVyZScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgdmFsdWVzPVsKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nRkVBVFVSRV9OT05FJywgaW5kZXg9MCwgbnVtYmVyPTAsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdGRUFUVVJFX1BST1RPM19PUFRJT05BTCcsIGluZGV4PTEsIG51bWJlcj0xLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBzZXJpYWxpemVkX3N0YXJ0PTYyOCwKKyAgc2VyaWFsaXplZF9lbmQ9Njg0LAorKQorX3N5bV9kYi5SZWdpc3RlckVudW1EZXNjcmlwdG9yKF9DT0RFR0VORVJBVE9SUkVTUE9OU0VfRkVBVFVSRSkKKworCitfVkVSU0lPTiA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J1ZlcnNpb24nLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5jb21waWxlci5WZXJzaW9uJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdtYWpvcicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24ubWFqb3InLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdtaW5vcicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24ubWlub3InLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdwYXRjaCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24ucGF0Y2gnLCBpbmRleD0yLAorICAgICAgbnVtYmVyPTMsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdzdWZmaXgnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5jb21waWxlci5WZXJzaW9uLnN1ZmZpeCcsIGluZGV4PTMsCisgICAgICBudW1iZXI9NCwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLmRlY29kZSgndXRmLTgnKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0xMDEsCisgIHNlcmlhbGl6ZWRfZW5kPTE3MSwKKykKKworCitfQ09ERUdFTkVSQVRPUlJFUVVFU1QgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdDb2RlR2VuZXJhdG9yUmVxdWVzdCcsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0JywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdmaWxlX3RvX2dlbmVyYXRlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdwYXJhbWV0ZXInLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wYXJhbWV0ZXInLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdwcm90b19maWxlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucHJvdG9fZmlsZScsIGluZGV4PTIsCisgICAgICBudW1iZXI9MTUsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdjb21waWxlcl92ZXJzaW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuY29tcGlsZXJfdmVyc2lvbicsIGluZGV4PTMsCisgICAgICBudW1iZXI9MywgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzInLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTE3NCwKKyAgc2VyaWFsaXplZF9lbmQ9MzYwLAorKQorCisKK19DT0RFR0VORVJBVE9SUkVTUE9OU0VfRklMRSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0ZpbGUnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdpbnNlcnRpb25fcG9pbnQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdjb250ZW50JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuY29udGVudCcsIGluZGV4PTIsCisgICAgICBudW1iZXI9MTUsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdnZW5lcmF0ZWRfY29kZV9pbmZvJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuZ2VuZXJhdGVkX2NvZGVfaW5mbycsIGluZGV4PTMsCisgICAgICBudW1iZXI9MTYsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD00OTksCisgIHNlcmlhbGl6ZWRfZW5kPTYyNiwKKykKKworX0NPREVHRU5FUkFUT1JSRVNQT05TRSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0NvZGVHZW5lcmF0b3JSZXNwb25zZScsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZXJyb3InLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZXJyb3InLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdzdXBwb3J0ZWRfZmVhdHVyZXMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2Uuc3VwcG9ydGVkX2ZlYXR1cmVzJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTQsIGNwcF90eXBlPTQsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZmlsZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5maWxlJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj0xNSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtfQ09ERUdFTkVSQVRPUlJFU1BPTlNFX0ZJTEUsIF0sCisgIGVudW1fdHlwZXM9WworICAgIF9DT0RFR0VORVJBVE9SUkVTUE9OU0VfRkVBVFVSRSwKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0zNjMsCisgIHNlcmlhbGl6ZWRfZW5kPTY4NCwKKykKKworX0NPREVHRU5FUkFUT1JSRVFVRVNULmZpZWxkc19ieV9uYW1lWydwcm90b19maWxlJ10ubWVzc2FnZV90eXBlID0gZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3RfZGVzY3JpcHRvcl9fcGIyLl9GSUxFREVTQ1JJUFRPUlBST1RPCitfQ09ERUdFTkVSQVRPUlJFUVVFU1QuZmllbGRzX2J5X25hbWVbJ2NvbXBpbGVyX3ZlcnNpb24nXS5tZXNzYWdlX3R5cGUgPSBfVkVSU0lPTgorX0NPREVHRU5FUkFUT1JSRVNQT05TRV9GSUxFLmZpZWxkc19ieV9uYW1lWydnZW5lcmF0ZWRfY29kZV9pbmZvJ10ubWVzc2FnZV90eXBlID0gZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3RfZGVzY3JpcHRvcl9fcGIyLl9HRU5FUkFURURDT0RFSU5GTworX0NPREVHRU5FUkFUT1JSRVNQT05TRV9GSUxFLmNvbnRhaW5pbmdfdHlwZSA9IF9DT0RFR0VORVJBVE9SUkVTUE9OU0UKK19DT0RFR0VORVJBVE9SUkVTUE9OU0UuZmllbGRzX2J5X25hbWVbJ2ZpbGUnXS5tZXNzYWdlX3R5cGUgPSBfQ09ERUdFTkVSQVRPUlJFU1BPTlNFX0ZJTEUKK19DT0RFR0VORVJBVE9SUkVTUE9OU0VfRkVBVFVSRS5jb250YWluaW5nX3R5cGUgPSBfQ09ERUdFTkVSQVRPUlJFU1BPTlNFCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnVmVyc2lvbiddID0gX1ZFUlNJT04KK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydDb2RlR2VuZXJhdG9yUmVxdWVzdCddID0gX0NPREVHRU5FUkFUT1JSRVFVRVNUCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnQ29kZUdlbmVyYXRvclJlc3BvbnNlJ10gPSBfQ09ERUdFTkVSQVRPUlJFU1BPTlNFCitfc3ltX2RiLlJlZ2lzdGVyRmlsZURlc2NyaXB0b3IoREVTQ1JJUFRPUikKKworVmVyc2lvbiA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ1ZlcnNpb24nLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICdERVNDUklQVE9SJyA6IF9WRVJTSU9OLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLnBsdWdpbl9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5WZXJzaW9uKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoVmVyc2lvbikKKworQ29kZUdlbmVyYXRvclJlcXVlc3QgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdDb2RlR2VuZXJhdG9yUmVxdWVzdCcsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX0NPREVHRU5FUkFUT1JSRVFVRVNULAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLnBsdWdpbl9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKENvZGVHZW5lcmF0b3JSZXF1ZXN0KQorCitDb2RlR2VuZXJhdG9yUmVzcG9uc2UgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdDb2RlR2VuZXJhdG9yUmVzcG9uc2UnLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisKKyAgJ0ZpbGUnIDogX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnRmlsZScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfQ09ERUdFTkVSQVRPUlJFU1BPTlNFX0ZJTEUsCisgICAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5jb21waWxlci5wbHVnaW5fcGIyJworICAgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKKyAgICB9KQorICAsCisgICdERVNDUklQVE9SJyA6IF9DT0RFR0VORVJBVE9SUkVTUE9OU0UsCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuY29tcGlsZXIucGx1Z2luX3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKENvZGVHZW5lcmF0b3JSZXNwb25zZSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKENvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQorCisKK0RFU0NSSVBUT1IuX29wdGlvbnMgPSBOb25lCisjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtb2R1bGVfc2NvcGUpCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhMGNhYQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5weQpAQCAtMCwwICsxLDEyMjggQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiRGVzY3JpcHRvcnMgZXNzZW50aWFsbHkgY29udGFpbiBleGFjdGx5IHRoZSBpbmZvcm1hdGlvbiBmb3VuZCBpbiBhIC5wcm90bworZmlsZSwgaW4gdHlwZXMgdGhhdCBtYWtlIHRoaXMgaW5mb3JtYXRpb24gYWNjZXNzaWJsZSBpbiBQeXRob24uCisiIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKworaW1wb3J0IHRocmVhZGluZworaW1wb3J0IHdhcm5pbmdzCisKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBhcGlfaW1wbGVtZW50YXRpb24KKworX1VTRV9DX0RFU0NSSVBUT1JTID0gRmFsc2UKK2lmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgIT0gJ3B5dGhvbic6CisgICMgVXNlZCBieSBNYWtlRGVzY3JpcHRvciBpbiBjcHAgbW9kZQorICBpbXBvcnQgYmluYXNjaWkKKyAgaW1wb3J0IG9zCisgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgX21lc3NhZ2UgPSBhcGlfaW1wbGVtZW50YXRpb24uX2NfbW9kdWxlCisgICMgVE9ETyhqaWVsdW8pOiBSZW1vdmUgdGhpcyBpbXBvcnQgYWZ0ZXIgZml4IGFwaV9pbXBsZW1lbnRhdGlvbgorICBpZiBfbWVzc2FnZSBpcyBOb25lOgorICAgIGZyb20gZ29vZ2xlLnByb3RvYnVmLnB5ZXh0IGltcG9ydCBfbWVzc2FnZQorICBfVVNFX0NfREVTQ1JJUFRPUlMgPSBUcnVlCisKKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgIiIiQmFzZSBlcnJvciBmb3IgdGhpcyBtb2R1bGUuIiIiCisKKworY2xhc3MgVHlwZVRyYW5zZm9ybWF0aW9uRXJyb3IoRXJyb3IpOgorICAiIiJFcnJvciB0cmFuc2Zvcm1pbmcgYmV0d2VlbiBweXRob24gcHJvdG8gdHlwZSBhbmQgY29ycmVzcG9uZGluZyBDKysgdHlwZS4iIiIKKworCitpZiBfVVNFX0NfREVTQ1JJUFRPUlM6CisgICMgVGhpcyBtZXRhY2xhc3MgYWxsb3dzIHRvIG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiBjb2RlIGxpa2UKKyAgIyAgICAgaXNpbnN0YW5jZShteV9kZXNjcmlwdG9yLCBGaWVsZERlc2NyaXB0b3IpCisgICMgYW5kIG1ha2UgaXQgcmV0dXJuIFRydWUgd2hlbiB0aGUgZGVzY3JpcHRvciBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZXh0ZW5zaW9uCisgICMgdHlwZSB3cml0dGVuIGluIEMrKy4KKyAgY2xhc3MgRGVzY3JpcHRvck1ldGFjbGFzcyh0eXBlKToKKyAgICBkZWYgX19pbnN0YW5jZWNoZWNrX18oY2xzLCBvYmopOgorICAgICAgaWYgc3VwZXIoRGVzY3JpcHRvck1ldGFjbGFzcywgY2xzKS5fX2luc3RhbmNlY2hlY2tfXyhvYmopOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgaWYgaXNpbnN0YW5jZShvYmosIGNscy5fQ19ERVNDUklQVE9SX0NMQVNTKToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgIHJldHVybiBGYWxzZQorZWxzZToKKyAgIyBUaGUgc3RhbmRhcmQgbWV0YWNsYXNzOyBub3RoaW5nIGNoYW5nZXMuCisgIERlc2NyaXB0b3JNZXRhY2xhc3MgPSB0eXBlCisKKworY2xhc3MgX0xvY2sob2JqZWN0KToKKyAgIiIiV3JhcHBlciBjbGFzcyBvZiB0aHJlYWRpbmcuTG9jaygpLCB3aGljaCBpcyBhbGxvd2VkIGJ5ICd3aXRoJy4iIiIKKworICBkZWYgX19uZXdfXyhjbHMpOgorICAgIHNlbGYgPSBvYmplY3QuX19uZXdfXyhjbHMpCisgICAgc2VsZi5fbG9jayA9IHRocmVhZGluZy5Mb2NrKCkgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICByZXR1cm4gc2VsZgorCisgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKworICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RiKToKKyAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorCisKK19sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorCisKK2RlZiBfRGVwcmVjYXRlZChuYW1lKToKKyAgaWYgX0RlcHJlY2F0ZWQuY291bnQgPiAwOgorICAgIF9EZXByZWNhdGVkLmNvdW50IC09IDEKKyAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAnQ2FsbCB0byBkZXByZWNhdGVkIGNyZWF0ZSBmdW5jdGlvbiAlcygpLiBOb3RlOiBDcmVhdGUgdW5saW5rZWQgJworICAgICAgICAnZGVzY3JpcHRvcnMgaXMgZ29pbmcgdG8gZ28gYXdheS4gUGxlYXNlIHVzZSBnZXQvZmluZCBkZXNjcmlwdG9ycyBmcm9tICcKKyAgICAgICAgJ2dlbmVyYXRlZCBjb2RlIG9yIHF1ZXJ5IHRoZSBkZXNjcmlwdG9yX3Bvb2wuJworICAgICAgICAlIG5hbWUsCisgICAgICAgIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0zKQorCisKKyMgRGVwcmVjYXRlZCB3YXJuaW5ncyB3aWxsIHByaW50IDEwMCB0aW1lcyBhdCBtb3N0IHdoaWNoIHNob3VsZCBiZSBlbm91Z2ggZm9yCisjIHVzZXJzIHRvIG5vdGljZSBhbmQgZG8gbm90IGNhdXNlIHRpbWVvdXQuCitfRGVwcmVjYXRlZC5jb3VudCA9IDEwMAorCisKK19pbnRlcm5hbF9jcmVhdGVfa2V5ID0gb2JqZWN0KCkKKworCitjbGFzcyBEZXNjcmlwdG9yQmFzZShtZXRhY2xhc3M9RGVzY3JpcHRvck1ldGFjbGFzcyk6CisKKyAgIiIiRGVzY3JpcHRvcnMgYmFzZSBjbGFzcy4KKworICBUaGlzIGNsYXNzIGlzIHRoZSBiYXNlIG9mIGFsbCBkZXNjcmlwdG9yIGNsYXNzZXMuIEl0IHByb3ZpZGVzIGNvbW1vbiBvcHRpb25zCisgIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eS4KKworICBBdHRyaWJ1dGVzOgorICAgIGhhc19vcHRpb25zOiAgVHJ1ZSBpZiB0aGUgZGVzY3JpcHRvciBoYXMgbm9uLWRlZmF1bHQgb3B0aW9ucy4gIFVzdWFsbHkgaXQKKyAgICAgICAgaXMgbm90IG5lY2Vzc2FyeSB0byByZWFkIHRoaXMgLS0ganVzdCBjYWxsIEdldE9wdGlvbnMoKSB3aGljaCB3aWxsCisgICAgICAgIGhhcHBpbHkgcmV0dXJuIHRoZSBkZWZhdWx0IGluc3RhbmNlLiAgSG93ZXZlciwgaXQncyBzb21ldGltZXMgdXNlZnVsCisgICAgICAgIGZvciBlZmZpY2llbmN5LCBhbmQgYWxzbyB1c2VmdWwgaW5zaWRlIHRoZSBwcm90b2J1ZiBpbXBsZW1lbnRhdGlvbiB0bworICAgICAgICBhdm9pZCBzb21lIGJvb3RzdHJhcHBpbmcgaXNzdWVzLgorICAiIiIKKworICBpZiBfVVNFX0NfREVTQ1JJUFRPUlM6CisgICAgIyBUaGUgY2xhc3MsIG9yIHR1cGxlIG9mIGNsYXNzZXMsIHRoYXQgYXJlIGNvbnNpZGVyZWQgYXMgInZpcnR1YWwKKyAgICAjIHN1YmNsYXNzZXMiIG9mIHRoaXMgZGVzY3JpcHRvciBjbGFzcy4KKyAgICBfQ19ERVNDUklQVE9SX0NMQVNTID0gKCkKKworICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucywgc2VyaWFsaXplZF9vcHRpb25zLCBvcHRpb25zX2NsYXNzX25hbWUpOgorICAgICIiIkluaXRpYWxpemUgdGhlIGRlc2NyaXB0b3IgZ2l2ZW4gaXRzIG9wdGlvbnMgbWVzc2FnZSBhbmQgdGhlIG5hbWUgb2YgdGhlCisgICAgY2xhc3Mgb2YgdGhlIG9wdGlvbnMgbWVzc2FnZS4gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIHJlcXVpcmVkIGluIGNhc2UKKyAgICB0aGUgb3B0aW9ucyBtZXNzYWdlIGlzIE5vbmUgYW5kIGhhcyB0byBiZSBjcmVhdGVkLgorICAgICIiIgorICAgIHNlbGYuX29wdGlvbnMgPSBvcHRpb25zCisgICAgc2VsZi5fb3B0aW9uc19jbGFzc19uYW1lID0gb3B0aW9uc19jbGFzc19uYW1lCisgICAgc2VsZi5fc2VyaWFsaXplZF9vcHRpb25zID0gc2VyaWFsaXplZF9vcHRpb25zCisKKyAgICAjIERvZXMgdGhpcyBkZXNjcmlwdG9yIGhhdmUgbm9uLWRlZmF1bHQgb3B0aW9ucz8KKyAgICBzZWxmLmhhc19vcHRpb25zID0gKG9wdGlvbnMgaXMgbm90IE5vbmUpIG9yIChzZXJpYWxpemVkX29wdGlvbnMgaXMgbm90IE5vbmUpCisKKyAgZGVmIF9TZXRPcHRpb25zKHNlbGYsIG9wdGlvbnMsIG9wdGlvbnNfY2xhc3NfbmFtZSk6CisgICAgIiIiU2V0cyB0aGUgZGVzY3JpcHRvcidzIG9wdGlvbnMKKworICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBnZW5lcmF0ZWQgcHJvdG8yIGZpbGVzIHRvIHVwZGF0ZSBkZXNjcmlwdG9yCisgICAgb3B0aW9ucy4gSXQgbXVzdCBub3QgYmUgdXNlZCBvdXRzaWRlIHByb3RvMi4KKyAgICAiIiIKKyAgICBzZWxmLl9vcHRpb25zID0gb3B0aW9ucworICAgIHNlbGYuX29wdGlvbnNfY2xhc3NfbmFtZSA9IG9wdGlvbnNfY2xhc3NfbmFtZQorCisgICAgIyBEb2VzIHRoaXMgZGVzY3JpcHRvciBoYXZlIG5vbi1kZWZhdWx0IG9wdGlvbnM/CisgICAgc2VsZi5oYXNfb3B0aW9ucyA9IG9wdGlvbnMgaXMgbm90IE5vbmUKKworICBkZWYgR2V0T3B0aW9ucyhzZWxmKToKKyAgICAiIiJSZXRyaWV2ZXMgZGVzY3JpcHRvciBvcHRpb25zLgorCisgICAgVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgb3B0aW9ucyBzZXQgb3IgY3JlYXRlcyB0aGUgZGVmYXVsdCBvcHRpb25zIGZvciB0aGUKKyAgICBkZXNjcmlwdG9yLgorICAgICIiIgorICAgIGlmIHNlbGYuX29wdGlvbnM6CisgICAgICByZXR1cm4gc2VsZi5fb3B0aW9ucworCisgICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcGIyCisgICAgdHJ5OgorICAgICAgb3B0aW9uc19jbGFzcyA9IGdldGF0dHIoZGVzY3JpcHRvcl9wYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9vcHRpb25zX2NsYXNzX25hbWUpCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdVbmtub3duIG9wdGlvbnMgY2xhc3MgbmFtZSAlcyEnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5fb3B0aW9uc19jbGFzc19uYW1lKSkKKworICAgIHdpdGggX2xvY2s6CisgICAgICBpZiBzZWxmLl9zZXJpYWxpemVkX29wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgc2VsZi5fb3B0aW9ucyA9IG9wdGlvbnNfY2xhc3MoKQorICAgICAgZWxzZToKKyAgICAgICAgc2VsZi5fb3B0aW9ucyA9IF9QYXJzZU9wdGlvbnMob3B0aW9uc19jbGFzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZXJpYWxpemVkX29wdGlvbnMpCisKKyAgICAgIHJldHVybiBzZWxmLl9vcHRpb25zCisKKworY2xhc3MgX05lc3RlZERlc2NyaXB0b3JCYXNlKERlc2NyaXB0b3JCYXNlKToKKyAgIiIiQ29tbW9uIGNsYXNzIGZvciBkZXNjcmlwdG9ycyB0aGF0IGNhbiBiZSBuZXN0ZWQuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbnMsIG9wdGlvbnNfY2xhc3NfbmFtZSwgbmFtZSwgZnVsbF9uYW1lLAorICAgICAgICAgICAgICAgZmlsZSwgY29udGFpbmluZ190eXBlLCBzZXJpYWxpemVkX3N0YXJ0PU5vbmUsCisgICAgICAgICAgICAgICBzZXJpYWxpemVkX2VuZD1Ob25lLCBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSk6CisgICAgIiIiQ29uc3RydWN0b3IuCisKKyAgICBBcmdzOgorICAgICAgb3B0aW9uczogUHJvdG9jb2wgbWVzc2FnZSBvcHRpb25zIG9yIE5vbmUKKyAgICAgICAgdG8gdXNlIGRlZmF1bHQgbWVzc2FnZSBvcHRpb25zLgorICAgICAgb3B0aW9uc19jbGFzc19uYW1lIChzdHIpOiBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgYWJvdmUgb3B0aW9ucy4KKyAgICAgIG5hbWUgKHN0cik6IE5hbWUgb2YgdGhpcyBwcm90b2NvbCBtZXNzYWdlIHR5cGUuCisgICAgICBmdWxsX25hbWUgKHN0cik6IEZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoaXMgcHJvdG9jb2wgbWVzc2FnZSB0eXBlLAorICAgICAgICB3aGljaCB3aWxsIGluY2x1ZGUgcHJvdG9jb2wgInBhY2thZ2UiIG5hbWUgYW5kIHRoZSBuYW1lIG9mIGFueQorICAgICAgICBlbmNsb3NpbmcgdHlwZXMuCisgICAgICBmaWxlIChGaWxlRGVzY3JpcHRvcik6IFJlZmVyZW5jZSB0byBmaWxlIGluZm8uCisgICAgICBjb250YWluaW5nX3R5cGU6IGlmIHByb3ZpZGVkLCB0aGlzIGlzIGEgbmVzdGVkIGRlc2NyaXB0b3IsIHdpdGggdGhpcworICAgICAgICBkZXNjcmlwdG9yIGFzIHBhcmVudCwgb3RoZXJ3aXNlIE5vbmUuCisgICAgICBzZXJpYWxpemVkX3N0YXJ0OiBUaGUgc3RhcnQgaW5kZXggKGluY2x1c2l2ZSkgaW4gYmxvY2sgaW4gdGhlCisgICAgICAgIGZpbGUuc2VyaWFsaXplZF9wYiB0aGF0IGRlc2NyaWJlcyB0aGlzIGRlc2NyaXB0b3IuCisgICAgICBzZXJpYWxpemVkX2VuZDogVGhlIGVuZCBpbmRleCAoZXhjbHVzaXZlKSBpbiBibG9jayBpbiB0aGUKKyAgICAgICAgZmlsZS5zZXJpYWxpemVkX3BiIHRoYXQgZGVzY3JpYmVzIHRoaXMgZGVzY3JpcHRvci4KKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9uczogUHJvdG9jb2wgbWVzc2FnZSBzZXJpYWxpemVkIG9wdGlvbnMgb3IgTm9uZS4KKyAgICAiIiIKKyAgICBzdXBlcihfTmVzdGVkRGVzY3JpcHRvckJhc2UsIHNlbGYpLl9faW5pdF9fKAorICAgICAgICBvcHRpb25zLCBzZXJpYWxpemVkX29wdGlvbnMsIG9wdGlvbnNfY2xhc3NfbmFtZSkKKworICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAjIFRPRE8oZmFsayk6IEFkZCBmdW5jdGlvbiB0byBjYWxjdWxhdGUgZnVsbF9uYW1lIGluc3RlYWQgb2YgaGF2aW5nIGl0IGluCisgICAgIyAgICAgICAgICAgICBtZW1vcnk/CisgICAgc2VsZi5mdWxsX25hbWUgPSBmdWxsX25hbWUKKyAgICBzZWxmLmZpbGUgPSBmaWxlCisgICAgc2VsZi5jb250YWluaW5nX3R5cGUgPSBjb250YWluaW5nX3R5cGUKKworICAgIHNlbGYuX3NlcmlhbGl6ZWRfc3RhcnQgPSBzZXJpYWxpemVkX3N0YXJ0CisgICAgc2VsZi5fc2VyaWFsaXplZF9lbmQgPSBzZXJpYWxpemVkX2VuZAorCisgIGRlZiBDb3B5VG9Qcm90byhzZWxmLCBwcm90byk6CisgICAgIiIiQ29waWVzIHRoaXMgdG8gdGhlIG1hdGNoaW5nIHByb3RvIGluIGRlc2NyaXB0b3JfcGIyLgorCisgICAgQXJnczoKKyAgICAgIHByb3RvOiBBbiBlbXB0eSBwcm90byBpbnN0YW5jZSBmcm9tIGRlc2NyaXB0b3JfcGIyLgorCisgICAgUmFpc2VzOgorICAgICAgRXJyb3I6IElmIHNlbGYgY291bGRuJ3QgYmUgc2VyaWFsaXplZCwgZHVlIHRvIHRvIGZldyBjb25zdHJ1Y3RvcgorICAgICAgICBhcmd1bWVudHMuCisgICAgIiIiCisgICAgaWYgKHNlbGYuZmlsZSBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgc2VsZi5fc2VyaWFsaXplZF9zdGFydCBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgc2VsZi5fc2VyaWFsaXplZF9lbmQgaXMgbm90IE5vbmUpOgorICAgICAgcHJvdG8uUGFyc2VGcm9tU3RyaW5nKHNlbGYuZmlsZS5zZXJpYWxpemVkX3BiWworICAgICAgICAgIHNlbGYuX3NlcmlhbGl6ZWRfc3RhcnQ6c2VsZi5fc2VyaWFsaXplZF9lbmRdKQorICAgIGVsc2U6CisgICAgICByYWlzZSBFcnJvcignRGVzY3JpcHRvciBkb2VzIG5vdCBjb250YWluIHNlcmlhbGl6YXRpb24uJykKKworCitjbGFzcyBEZXNjcmlwdG9yKF9OZXN0ZWREZXNjcmlwdG9yQmFzZSk6CisKKyAgIiIiRGVzY3JpcHRvciBmb3IgYSBwcm90b2NvbCBtZXNzYWdlIHR5cGUuCisKKyAgQXR0cmlidXRlczoKKyAgICAgIG5hbWUgKHN0cik6IE5hbWUgb2YgdGhpcyBwcm90b2NvbCBtZXNzYWdlIHR5cGUuCisgICAgICBmdWxsX25hbWUgKHN0cik6IEZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoaXMgcHJvdG9jb2wgbWVzc2FnZSB0eXBlLAorICAgICAgICAgIHdoaWNoIHdpbGwgaW5jbHVkZSBwcm90b2NvbCAicGFja2FnZSIgbmFtZSBhbmQgdGhlIG5hbWUgb2YgYW55CisgICAgICAgICAgZW5jbG9zaW5nIHR5cGVzLgorICAgICAgY29udGFpbmluZ190eXBlIChEZXNjcmlwdG9yKTogUmVmZXJlbmNlIHRvIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSB0eXBlCisgICAgICAgICAgY29udGFpbmluZyB1cywgb3IgTm9uZSBpZiB0aGlzIGlzIHRvcC1sZXZlbC4KKyAgICAgIGZpZWxkcyAobGlzdFtGaWVsZERlc2NyaXB0b3JdKTogRmllbGQgZGVzY3JpcHRvcnMgZm9yIGFsbCBmaWVsZHMgaW4KKyAgICAgICAgICB0aGlzIHR5cGUuCisgICAgICBmaWVsZHNfYnlfbnVtYmVyIChkaWN0KGludCwgRmllbGREZXNjcmlwdG9yKSk6IFNhbWUKKyAgICAgICAgICA6Y2xhc3M6YEZpZWxkRGVzY3JpcHRvcmAgb2JqZWN0cyBhcyBpbiA6YXR0cjpgZmllbGRzYCwgYnV0IGluZGV4ZWQKKyAgICAgICAgICBieSAibnVtYmVyIiBhdHRyaWJ1dGUgaW4gZWFjaCBGaWVsZERlc2NyaXB0b3IuCisgICAgICBmaWVsZHNfYnlfbmFtZSAoZGljdChzdHIsIEZpZWxkRGVzY3JpcHRvcikpOiBTYW1lCisgICAgICAgICAgOmNsYXNzOmBGaWVsZERlc2NyaXB0b3JgIG9iamVjdHMgYXMgaW4gOmF0dHI6YGZpZWxkc2AsIGJ1dCBpbmRleGVkIGJ5CisgICAgICAgICAgIm5hbWUiIGF0dHJpYnV0ZSBpbiBlYWNoIDpjbGFzczpgRmllbGREZXNjcmlwdG9yYC4KKyAgICAgIG5lc3RlZF90eXBlcyAobGlzdFtEZXNjcmlwdG9yXSk6IERlc2NyaXB0b3IgcmVmZXJlbmNlcworICAgICAgICAgIGZvciBhbGwgcHJvdG9jb2wgbWVzc2FnZSB0eXBlcyBuZXN0ZWQgd2l0aGluIHRoaXMgb25lLgorICAgICAgbmVzdGVkX3R5cGVzX2J5X25hbWUgKGRpY3Qoc3RyLCBEZXNjcmlwdG9yKSk6IFNhbWUgRGVzY3JpcHRvcgorICAgICAgICAgIG9iamVjdHMgYXMgaW4gOmF0dHI6YG5lc3RlZF90eXBlc2AsIGJ1dCBpbmRleGVkIGJ5ICJuYW1lIiBhdHRyaWJ1dGUKKyAgICAgICAgICBpbiBlYWNoIERlc2NyaXB0b3IuCisgICAgICBlbnVtX3R5cGVzIChsaXN0W0VudW1EZXNjcmlwdG9yXSk6IDpjbGFzczpgRW51bURlc2NyaXB0b3JgIHJlZmVyZW5jZXMKKyAgICAgICAgICBmb3IgYWxsIGVudW1zIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyB0eXBlLgorICAgICAgZW51bV90eXBlc19ieV9uYW1lIChkaWN0KHN0ciwgRW51bURlc2NyaXB0b3IpKTogU2FtZQorICAgICAgICAgIDpjbGFzczpgRW51bURlc2NyaXB0b3JgIG9iamVjdHMgYXMgaW4gOmF0dHI6YGVudW1fdHlwZXNgLCBidXQKKyAgICAgICAgICBpbmRleGVkIGJ5ICJuYW1lIiBhdHRyaWJ1dGUgaW4gZWFjaCBFbnVtRGVzY3JpcHRvci4KKyAgICAgIGVudW1fdmFsdWVzX2J5X25hbWUgKGRpY3Qoc3RyLCBFbnVtVmFsdWVEZXNjcmlwdG9yKSk6IERpY3QgbWFwcGluZworICAgICAgICAgIGZyb20gZW51bSB2YWx1ZSBuYW1lIHRvIDpjbGFzczpgRW51bVZhbHVlRGVzY3JpcHRvcmAgZm9yIHRoYXQgdmFsdWUuCisgICAgICBleHRlbnNpb25zIChsaXN0W0ZpZWxkRGVzY3JpcHRvcl0pOiBBbGwgZXh0ZW5zaW9ucyBkZWZpbmVkIGRpcmVjdGx5CisgICAgICAgICAgd2l0aGluIHRoaXMgbWVzc2FnZSB0eXBlIChOT1Qgd2l0aGluIGEgbmVzdGVkIHR5cGUpLgorICAgICAgZXh0ZW5zaW9uc19ieV9uYW1lIChkaWN0KHN0ciwgRmllbGREZXNjcmlwdG9yKSk6IFNhbWUgRmllbGREZXNjcmlwdG9yCisgICAgICAgICAgb2JqZWN0cyBhcyA6YXR0cjpgZXh0ZW5zaW9uc2AsIGJ1dCBpbmRleGVkIGJ5ICJuYW1lIiBhdHRyaWJ1dGUgb2YgZWFjaAorICAgICAgICAgIEZpZWxkRGVzY3JpcHRvci4KKyAgICAgIGlzX2V4dGVuZGFibGUgKGJvb2wpOiAgRG9lcyB0aGlzIHR5cGUgZGVmaW5lIGFueSBleHRlbnNpb24gcmFuZ2VzPworICAgICAgb25lb2ZzIChsaXN0W09uZW9mRGVzY3JpcHRvcl0pOiBUaGUgbGlzdCBvZiBkZXNjcmlwdG9ycyBmb3Igb25lb2YgZmllbGRzCisgICAgICAgICAgaW4gdGhpcyBtZXNzYWdlLgorICAgICAgb25lb2ZzX2J5X25hbWUgKGRpY3Qoc3RyLCBPbmVvZkRlc2NyaXB0b3IpKTogU2FtZSBvYmplY3RzIGFzIGluCisgICAgICAgICAgOmF0dHI6YG9uZW9mc2AsIGJ1dCBpbmRleGVkIGJ5ICJuYW1lIiBhdHRyaWJ1dGUuCisgICAgICBmaWxlIChGaWxlRGVzY3JpcHRvcik6IFJlZmVyZW5jZSB0byBmaWxlIGRlc2NyaXB0b3IuCisKKyAgIiIiCisKKyAgaWYgX1VTRV9DX0RFU0NSSVBUT1JTOgorICAgIF9DX0RFU0NSSVBUT1JfQ0xBU1MgPSBfbWVzc2FnZS5EZXNjcmlwdG9yCisKKyAgICBkZWYgX19uZXdfXygKKyAgICAgICAgY2xzLAorICAgICAgICBuYW1lPU5vbmUsCisgICAgICAgIGZ1bGxfbmFtZT1Ob25lLAorICAgICAgICBmaWxlbmFtZT1Ob25lLAorICAgICAgICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgICAgZmllbGRzPU5vbmUsCisgICAgICAgIG5lc3RlZF90eXBlcz1Ob25lLAorICAgICAgICBlbnVtX3R5cGVzPU5vbmUsCisgICAgICAgIGV4dGVuc2lvbnM9Tm9uZSwKKyAgICAgICAgb3B0aW9ucz1Ob25lLAorICAgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgICAgaXNfZXh0ZW5kYWJsZT1UcnVlLAorICAgICAgICBleHRlbnNpb25fcmFuZ2VzPU5vbmUsCisgICAgICAgIG9uZW9mcz1Ob25lLAorICAgICAgICBmaWxlPU5vbmUsICAjIHB5bGludDogZGlzYWJsZT1yZWRlZmluZWQtYnVpbHRpbgorICAgICAgICBzZXJpYWxpemVkX3N0YXJ0PU5vbmUsCisgICAgICAgIHNlcmlhbGl6ZWRfZW5kPU5vbmUsCisgICAgICAgIHN5bnRheD1Ob25lLAorICAgICAgICBjcmVhdGVfa2V5PU5vbmUpOgorICAgICAgX21lc3NhZ2UuTWVzc2FnZS5fQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgpCisgICAgICByZXR1cm4gX21lc3NhZ2UuZGVmYXVsdF9wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShmdWxsX25hbWUpCisKKyAgIyBOT1RFKHRtYXJlayk6IFRoZSBmaWxlIGFyZ3VtZW50IHJlZGVmaW5pbmcgYSBidWlsdGluIGlzIG5vdGhpbmcgd2UgY2FuCisgICMgZml4IHJpZ2h0IG5vdyBzaW5jZSB3ZSBkb24ndCBrbm93IGhvdyBtYW55IGNsaWVudHMgYWxyZWFkeSByZWx5IG9uIHRoZQorICAjIG5hbWUgb2YgdGhlIGFyZ3VtZW50LgorICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZnVsbF9uYW1lLCBmaWxlbmFtZSwgY29udGFpbmluZ190eXBlLCBmaWVsZHMsCisgICAgICAgICAgICAgICBuZXN0ZWRfdHlwZXMsIGVudW1fdHlwZXMsIGV4dGVuc2lvbnMsIG9wdGlvbnM9Tm9uZSwKKyAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgICAgICAgICAgaXNfZXh0ZW5kYWJsZT1UcnVlLCBleHRlbnNpb25fcmFuZ2VzPU5vbmUsIG9uZW9mcz1Ob25lLAorICAgICAgICAgICAgICAgZmlsZT1Ob25lLCBzZXJpYWxpemVkX3N0YXJ0PU5vbmUsIHNlcmlhbGl6ZWRfZW5kPU5vbmUsICAjIHB5bGludDogZGlzYWJsZT1yZWRlZmluZWQtYnVpbHRpbgorICAgICAgICAgICAgICAgc3ludGF4PU5vbmUsIGNyZWF0ZV9rZXk9Tm9uZSk6CisgICAgIiIiQXJndW1lbnRzIHRvIF9faW5pdF9fKCkgYXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRpb24KKyAgICBvZiBEZXNjcmlwdG9yIGZpZWxkcyBhYm92ZS4KKworICAgIE5vdGUgdGhhdCBmaWxlbmFtZSBpcyBhbiBvYnNvbGV0ZSBhcmd1bWVudCwgdGhhdCBpcyBub3QgdXNlZCBhbnltb3JlLgorICAgIFBsZWFzZSB1c2UgZmlsZS5uYW1lIHRvIGFjY2VzcyB0aGlzIGFzIGFuIGF0dHJpYnV0ZS4KKyAgICAiIiIKKyAgICBpZiBjcmVhdGVfa2V5IGlzIG5vdCBfaW50ZXJuYWxfY3JlYXRlX2tleToKKyAgICAgIF9EZXByZWNhdGVkKCdEZXNjcmlwdG9yJykKKworICAgIHN1cGVyKERlc2NyaXB0b3IsIHNlbGYpLl9faW5pdF9fKAorICAgICAgICBvcHRpb25zLCAnTWVzc2FnZU9wdGlvbnMnLCBuYW1lLCBmdWxsX25hbWUsIGZpbGUsCisgICAgICAgIGNvbnRhaW5pbmdfdHlwZSwgc2VyaWFsaXplZF9zdGFydD1zZXJpYWxpemVkX3N0YXJ0LAorICAgICAgICBzZXJpYWxpemVkX2VuZD1zZXJpYWxpemVkX2VuZCwgc2VyaWFsaXplZF9vcHRpb25zPXNlcmlhbGl6ZWRfb3B0aW9ucykKKworICAgICMgV2UgaGF2ZSBmaWVsZHMgaW4gYWRkaXRpb24gdG8gZmllbGRzX2J5X25hbWUgYW5kIGZpZWxkc19ieV9udW1iZXIsCisgICAgIyBzbyB0aGF0OgorICAgICMgICAxLiBDbGllbnRzIGNhbiBpbmRleCBmaWVsZHMgYnkgIm9yZGVyIGluIHdoaWNoIHRoZXkncmUgbGlzdGVkLiIKKyAgICAjICAgMi4gQ2xpZW50cyBjYW4gZWFzaWx5IGl0ZXJhdGUgb3ZlciBhbGwgZmllbGRzIHdpdGggdGhlIHRlcnNlCisgICAgIyAgICAgIHN5bnRheDogZm9yIGYgaW4gZGVzY3JpcHRvci5maWVsZHM6IC4uLgorICAgIHNlbGYuZmllbGRzID0gZmllbGRzCisgICAgZm9yIGZpZWxkIGluIHNlbGYuZmllbGRzOgorICAgICAgZmllbGQuY29udGFpbmluZ190eXBlID0gc2VsZgorICAgIHNlbGYuZmllbGRzX2J5X251bWJlciA9IGRpY3QoKGYubnVtYmVyLCBmKSBmb3IgZiBpbiBmaWVsZHMpCisgICAgc2VsZi5maWVsZHNfYnlfbmFtZSA9IGRpY3QoKGYubmFtZSwgZikgZm9yIGYgaW4gZmllbGRzKQorICAgIHNlbGYuX2ZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZSA9IE5vbmUKKworICAgIHNlbGYubmVzdGVkX3R5cGVzID0gbmVzdGVkX3R5cGVzCisgICAgZm9yIG5lc3RlZF90eXBlIGluIG5lc3RlZF90eXBlczoKKyAgICAgIG5lc3RlZF90eXBlLmNvbnRhaW5pbmdfdHlwZSA9IHNlbGYKKyAgICBzZWxmLm5lc3RlZF90eXBlc19ieV9uYW1lID0gZGljdCgodC5uYW1lLCB0KSBmb3IgdCBpbiBuZXN0ZWRfdHlwZXMpCisKKyAgICBzZWxmLmVudW1fdHlwZXMgPSBlbnVtX3R5cGVzCisgICAgZm9yIGVudW1fdHlwZSBpbiBzZWxmLmVudW1fdHlwZXM6CisgICAgICBlbnVtX3R5cGUuY29udGFpbmluZ190eXBlID0gc2VsZgorICAgIHNlbGYuZW51bV90eXBlc19ieV9uYW1lID0gZGljdCgodC5uYW1lLCB0KSBmb3IgdCBpbiBlbnVtX3R5cGVzKQorICAgIHNlbGYuZW51bV92YWx1ZXNfYnlfbmFtZSA9IGRpY3QoCisgICAgICAgICh2Lm5hbWUsIHYpIGZvciB0IGluIGVudW1fdHlwZXMgZm9yIHYgaW4gdC52YWx1ZXMpCisKKyAgICBzZWxmLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zCisgICAgZm9yIGV4dGVuc2lvbiBpbiBzZWxmLmV4dGVuc2lvbnM6CisgICAgICBleHRlbnNpb24uZXh0ZW5zaW9uX3Njb3BlID0gc2VsZgorICAgIHNlbGYuZXh0ZW5zaW9uc19ieV9uYW1lID0gZGljdCgoZi5uYW1lLCBmKSBmb3IgZiBpbiBleHRlbnNpb25zKQorICAgIHNlbGYuaXNfZXh0ZW5kYWJsZSA9IGlzX2V4dGVuZGFibGUKKyAgICBzZWxmLmV4dGVuc2lvbl9yYW5nZXMgPSBleHRlbnNpb25fcmFuZ2VzCisgICAgc2VsZi5vbmVvZnMgPSBvbmVvZnMgaWYgb25lb2ZzIGlzIG5vdCBOb25lIGVsc2UgW10KKyAgICBzZWxmLm9uZW9mc19ieV9uYW1lID0gZGljdCgoby5uYW1lLCBvKSBmb3IgbyBpbiBzZWxmLm9uZW9mcykKKyAgICBmb3Igb25lb2YgaW4gc2VsZi5vbmVvZnM6CisgICAgICBvbmVvZi5jb250YWluaW5nX3R5cGUgPSBzZWxmCisgICAgc2VsZi5zeW50YXggPSBzeW50YXggb3IgInByb3RvMiIKKworICBAcHJvcGVydHkKKyAgZGVmIGZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZShzZWxmKToKKyAgICAiIiJTYW1lIEZpZWxkRGVzY3JpcHRvciBvYmplY3RzIGFzIGluIDphdHRyOmBmaWVsZHNgLCBidXQgaW5kZXhlZCBieQorICAgIDphdHRyOmBGaWVsZERlc2NyaXB0b3IuY2FtZWxjYXNlX25hbWVgLgorICAgICIiIgorICAgIGlmIHNlbGYuX2ZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZSBpcyBOb25lOgorICAgICAgc2VsZi5fZmllbGRzX2J5X2NhbWVsY2FzZV9uYW1lID0gZGljdCgKKyAgICAgICAgICAoZi5jYW1lbGNhc2VfbmFtZSwgZikgZm9yIGYgaW4gc2VsZi5maWVsZHMpCisgICAgcmV0dXJuIHNlbGYuX2ZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZQorCisgIGRlZiBFbnVtVmFsdWVOYW1lKHNlbGYsIGVudW0sIHZhbHVlKToKKyAgICAiIiJSZXR1cm5zIHRoZSBzdHJpbmcgbmFtZSBvZiBhbiBlbnVtIHZhbHVlLgorCisgICAgVGhpcyBpcyBqdXN0IGEgc21hbGwgaGVscGVyIG1ldGhvZCB0byBzaW1wbGlmeSBhIGNvbW1vbiBvcGVyYXRpb24uCisKKyAgICBBcmdzOgorICAgICAgZW51bTogc3RyaW5nIG5hbWUgb2YgdGhlIEVudW0uCisgICAgICB2YWx1ZTogaW50LCB2YWx1ZSBvZiB0aGUgZW51bS4KKworICAgIFJldHVybnM6CisgICAgICBzdHJpbmcgbmFtZSBvZiB0aGUgZW51bSB2YWx1ZS4KKworICAgIFJhaXNlczoKKyAgICAgIEtleUVycm9yIGlmIGVpdGhlciB0aGUgRW51bSBkb2Vzbid0IGV4aXN0IG9yIHRoZSB2YWx1ZSBpcyBub3QgYSB2YWxpZAorICAgICAgICB2YWx1ZSBmb3IgdGhlIGVudW0uCisgICAgIiIiCisgICAgcmV0dXJuIHNlbGYuZW51bV90eXBlc19ieV9uYW1lW2VudW1dLnZhbHVlc19ieV9udW1iZXJbdmFsdWVdLm5hbWUKKworICBkZWYgQ29weVRvUHJvdG8oc2VsZiwgcHJvdG8pOgorICAgICIiIkNvcGllcyB0aGlzIHRvIGEgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLgorCisgICAgQXJnczoKKyAgICAgIHByb3RvOiBBbiBlbXB0eSBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8uCisgICAgIiIiCisgICAgIyBUaGlzIGZ1bmN0aW9uIGlzIG92ZXJyaWRkZW4gdG8gZ2l2ZSBhIGJldHRlciBkb2MgY29tbWVudC4KKyAgICBzdXBlcihEZXNjcmlwdG9yLCBzZWxmKS5Db3B5VG9Qcm90byhwcm90bykKKworCisjIFRPRE8ocm9iaW5zb24pOiBXZSBzaG91bGQgaGF2ZSBhZ2dyZXNzaXZlIGNoZWNraW5nIGhlcmUsCisjIGZvciBleGFtcGxlOgorIyAgICogSWYgeW91IHNwZWNpZnkgYSByZXBlYXRlZCBmaWVsZCwgeW91IHNob3VsZCBub3QgYmUgYWxsb3dlZAorIyAgICAgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUuCisjICAgKiBbT3RoZXIgZXhhbXBsZXMgaGVyZSBhcyBuZWVkZWRdLgorIworIyBUT0RPKHJvYmluc29uKTogZm9yIHRoaXMgYW5kIG90aGVyICpEZXNjcmlwdG9yIGNsYXNzZXMsIHdlCisjIG1pZ2h0IGFsc28gd2FudCB0byBsb2NrIHRoaW5ncyBkb3duIGFnZ3Jlc3NpdmVseSAoZS5nLiwKKyMgcHJldmVudCBjbGllbnRzIGZyb20gc2V0dGluZyB0aGUgYXR0cmlidXRlcykuICBIYXZpbmcKKyMgc3Ryb25nZXIgaW52YXJpYW50cyBoZXJlIGluIGdlbmVyYWwgd2lsbCByZWR1Y2UgdGhlIG51bWJlcgorIyBvZiBydW50aW1lIGNoZWNrcyB3ZSBtdXN0IGRvIGluIHJlZmxlY3Rpb24ucHkuLi4KK2NsYXNzIEZpZWxkRGVzY3JpcHRvcihEZXNjcmlwdG9yQmFzZSk6CisKKyAgIiIiRGVzY3JpcHRvciBmb3IgYSBzaW5nbGUgZmllbGQgaW4gYSAucHJvdG8gZmlsZS4KKworICBBdHRyaWJ1dGVzOgorICAgIG5hbWUgKHN0cik6IE5hbWUgb2YgdGhpcyBmaWVsZCwgZXhhY3RseSBhcyBpdCBhcHBlYXJzIGluIC5wcm90by4KKyAgICBmdWxsX25hbWUgKHN0cik6IE5hbWUgb2YgdGhpcyBmaWVsZCwgaW5jbHVkaW5nIGNvbnRhaW5pbmcgc2NvcGUuICBUaGlzIGlzCisgICAgICBwYXJ0aWN1bGFybHkgcmVsZXZhbnQgZm9yIGV4dGVuc2lvbnMuCisgICAgaW5kZXggKGludCk6IERlbnNlLCAwLWluZGV4ZWQgaW5kZXggZ2l2aW5nIHRoZSBvcmRlciB0aGF0IHRoaXMKKyAgICAgIGZpZWxkIHRleHR1YWxseSBhcHBlYXJzIHdpdGhpbiBpdHMgbWVzc2FnZSBpbiB0aGUgLnByb3RvIGZpbGUuCisgICAgbnVtYmVyIChpbnQpOiBUYWcgbnVtYmVyIGRlY2xhcmVkIGZvciB0aGlzIGZpZWxkIGluIHRoZSAucHJvdG8gZmlsZS4KKworICAgIHR5cGUgKGludCk6IChPbmUgb2YgdGhlIFRZUEVfKiBjb25zdGFudHMgYmVsb3cpIERlY2xhcmVkIHR5cGUuCisgICAgY3BwX3R5cGUgKGludCk6IChPbmUgb2YgdGhlIENQUFRZUEVfKiBjb25zdGFudHMgYmVsb3cpIEMrKyB0eXBlIHVzZWQgdG8KKyAgICAgIHJlcHJlc2VudCB0aGlzIGZpZWxkLgorCisgICAgbGFiZWwgKGludCk6IChPbmUgb2YgdGhlIExBQkVMXyogY29uc3RhbnRzIGJlbG93KSBUZWxscyB3aGV0aGVyIHRoaXMKKyAgICAgIGZpZWxkIGlzIG9wdGlvbmFsLCByZXF1aXJlZCwgb3IgcmVwZWF0ZWQuCisgICAgaGFzX2RlZmF1bHRfdmFsdWUgKGJvb2wpOiBUcnVlIGlmIHRoaXMgZmllbGQgaGFzIGEgZGVmYXVsdCB2YWx1ZSBkZWZpbmVkLAorICAgICAgb3RoZXJ3aXNlIGZhbHNlLgorICAgIGRlZmF1bHRfdmFsdWUgKFZhcmllcyk6IERlZmF1bHQgdmFsdWUgb2YgdGhpcyBmaWVsZC4gIE9ubHkKKyAgICAgIG1lYW5pbmdmdWwgZm9yIG5vbi1yZXBlYXRlZCBzY2FsYXIgZmllbGRzLiAgUmVwZWF0ZWQgZmllbGRzCisgICAgICBzaG91bGQgYWx3YXlzIHNldCB0aGlzIHRvIFtdLCBhbmQgbm9uLXJlcGVhdGVkIGNvbXBvc2l0ZQorICAgICAgZmllbGRzIHNob3VsZCBhbHdheXMgc2V0IHRoaXMgdG8gTm9uZS4KKworICAgIGNvbnRhaW5pbmdfdHlwZSAoRGVzY3JpcHRvcik6IERlc2NyaXB0b3Igb2YgdGhlIHByb3RvY29sIG1lc3NhZ2UKKyAgICAgIHR5cGUgdGhhdCBjb250YWlucyB0aGlzIGZpZWxkLiAgU2V0IGJ5IHRoZSBEZXNjcmlwdG9yIGNvbnN0cnVjdG9yCisgICAgICBpZiB3ZSdyZSBwYXNzZWQgaW50byBvbmUuCisgICAgICBTb21ld2hhdCBjb25mdXNpbmdseSwgZm9yIGV4dGVuc2lvbiBmaWVsZHMsIHRoaXMgaXMgdGhlCisgICAgICBkZXNjcmlwdG9yIG9mIHRoZSBFWFRFTkRFRCBtZXNzYWdlLCBub3QgdGhlIGRlc2NyaXB0b3IKKyAgICAgIG9mIHRoZSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhpcyBmaWVsZC4gIChTZWUgaXNfZXh0ZW5zaW9uIGFuZAorICAgICAgZXh0ZW5zaW9uX3Njb3BlIGJlbG93KS4KKyAgICBtZXNzYWdlX3R5cGUgKERlc2NyaXB0b3IpOiBJZiBhIGNvbXBvc2l0ZSBmaWVsZCwgYSBkZXNjcmlwdG9yCisgICAgICBvZiB0aGUgbWVzc2FnZSB0eXBlIGNvbnRhaW5lZCBpbiB0aGlzIGZpZWxkLiAgT3RoZXJ3aXNlLCB0aGlzIGlzIE5vbmUuCisgICAgZW51bV90eXBlIChFbnVtRGVzY3JpcHRvcik6IElmIHRoaXMgZmllbGQgY29udGFpbnMgYW4gZW51bSwgYQorICAgICAgZGVzY3JpcHRvciBvZiB0aGF0IGVudW0uICBPdGhlcndpc2UsIHRoaXMgaXMgTm9uZS4KKworICAgIGlzX2V4dGVuc2lvbjogVHJ1ZSBpZmYgdGhpcyBkZXNjcmliZXMgYW4gZXh0ZW5zaW9uIGZpZWxkLgorICAgIGV4dGVuc2lvbl9zY29wZSAoRGVzY3JpcHRvcik6IE9ubHkgbWVhbmluZ2Z1bCBpZiBpc19leHRlbnNpb24gaXMgVHJ1ZS4KKyAgICAgIEdpdmVzIHRoZSBtZXNzYWdlIHRoYXQgaW1tZWRpYXRlbHkgY29udGFpbnMgdGhpcyBleHRlbnNpb24gZmllbGQuCisgICAgICBXaWxsIGJlIE5vbmUgaWZmIHdlJ3JlIGEgdG9wLWxldmVsIChmaWxlLWxldmVsKSBleHRlbnNpb24gZmllbGQuCisKKyAgICBvcHRpb25zIChkZXNjcmlwdG9yX3BiMi5GaWVsZE9wdGlvbnMpOiBQcm90b2NvbCBtZXNzYWdlIGZpZWxkIG9wdGlvbnMgb3IKKyAgICAgIE5vbmUgdG8gdXNlIGRlZmF1bHQgZmllbGQgb3B0aW9ucy4KKworICAgIGNvbnRhaW5pbmdfb25lb2YgKE9uZW9mRGVzY3JpcHRvcik6IElmIHRoZSBmaWVsZCBpcyBhIG1lbWJlciBvZiBhIG9uZW9mCisgICAgICB1bmlvbiwgY29udGFpbnMgaXRzIGRlc2NyaXB0b3IuIE90aGVyd2lzZSwgTm9uZS4KKworICAgIGZpbGUgKEZpbGVEZXNjcmlwdG9yKTogUmVmZXJlbmNlIHRvIGZpbGUgZGVzY3JpcHRvci4KKyAgIiIiCisKKyAgIyBNdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBDKysgRmllbGREZXNjcmlwdG9yOjpUeXBlIGVudW0gaW4KKyAgIyBkZXNjcmlwdG9yLmguCisgICMKKyAgIyBUT0RPKHJvYmluc29uKTogRmluZCBhIHdheSB0byBlbGltaW5hdGUgdGhpcyByZXBldGl0aW9uLgorICBUWVBFX0RPVUJMRSAgICAgICAgID0gMQorICBUWVBFX0ZMT0FUICAgICAgICAgID0gMgorICBUWVBFX0lOVDY0ICAgICAgICAgID0gMworICBUWVBFX1VJTlQ2NCAgICAgICAgID0gNAorICBUWVBFX0lOVDMyICAgICAgICAgID0gNQorICBUWVBFX0ZJWEVENjQgICAgICAgID0gNgorICBUWVBFX0ZJWEVEMzIgICAgICAgID0gNworICBUWVBFX0JPT0wgICAgICAgICAgID0gOAorICBUWVBFX1NUUklORyAgICAgICAgID0gOQorICBUWVBFX0dST1VQICAgICAgICAgID0gMTAKKyAgVFlQRV9NRVNTQUdFICAgICAgICA9IDExCisgIFRZUEVfQllURVMgICAgICAgICAgPSAxMgorICBUWVBFX1VJTlQzMiAgICAgICAgID0gMTMKKyAgVFlQRV9FTlVNICAgICAgICAgICA9IDE0CisgIFRZUEVfU0ZJWEVEMzIgICAgICAgPSAxNQorICBUWVBFX1NGSVhFRDY0ICAgICAgID0gMTYKKyAgVFlQRV9TSU5UMzIgICAgICAgICA9IDE3CisgIFRZUEVfU0lOVDY0ICAgICAgICAgPSAxOAorICBNQVhfVFlQRSAgICAgICAgICAgID0gMTgKKworICAjIE11c3QgYmUgY29uc2lzdGVudCB3aXRoIEMrKyBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgZW51bSBpbgorICAjIGRlc2NyaXB0b3IuaC4KKyAgIworICAjIFRPRE8ocm9iaW5zb24pOiBGaW5kIGEgd2F5IHRvIGVsaW1pbmF0ZSB0aGlzIHJlcGV0aXRpb24uCisgIENQUFRZUEVfSU5UMzIgICAgICAgPSAxCisgIENQUFRZUEVfSU5UNjQgICAgICAgPSAyCisgIENQUFRZUEVfVUlOVDMyICAgICAgPSAzCisgIENQUFRZUEVfVUlOVDY0ICAgICAgPSA0CisgIENQUFRZUEVfRE9VQkxFICAgICAgPSA1CisgIENQUFRZUEVfRkxPQVQgICAgICAgPSA2CisgIENQUFRZUEVfQk9PTCAgICAgICAgPSA3CisgIENQUFRZUEVfRU5VTSAgICAgICAgPSA4CisgIENQUFRZUEVfU1RSSU5HICAgICAgPSA5CisgIENQUFRZUEVfTUVTU0FHRSAgICAgPSAxMAorICBNQVhfQ1BQVFlQRSAgICAgICAgID0gMTAKKworICBfUFlUSE9OX1RPX0NQUF9QUk9UT19UWVBFX01BUCA9IHsKKyAgICAgIFRZUEVfRE9VQkxFOiBDUFBUWVBFX0RPVUJMRSwKKyAgICAgIFRZUEVfRkxPQVQ6IENQUFRZUEVfRkxPQVQsCisgICAgICBUWVBFX0VOVU06IENQUFRZUEVfRU5VTSwKKyAgICAgIFRZUEVfSU5UNjQ6IENQUFRZUEVfSU5UNjQsCisgICAgICBUWVBFX1NJTlQ2NDogQ1BQVFlQRV9JTlQ2NCwKKyAgICAgIFRZUEVfU0ZJWEVENjQ6IENQUFRZUEVfSU5UNjQsCisgICAgICBUWVBFX1VJTlQ2NDogQ1BQVFlQRV9VSU5UNjQsCisgICAgICBUWVBFX0ZJWEVENjQ6IENQUFRZUEVfVUlOVDY0LAorICAgICAgVFlQRV9JTlQzMjogQ1BQVFlQRV9JTlQzMiwKKyAgICAgIFRZUEVfU0ZJWEVEMzI6IENQUFRZUEVfSU5UMzIsCisgICAgICBUWVBFX1NJTlQzMjogQ1BQVFlQRV9JTlQzMiwKKyAgICAgIFRZUEVfVUlOVDMyOiBDUFBUWVBFX1VJTlQzMiwKKyAgICAgIFRZUEVfRklYRUQzMjogQ1BQVFlQRV9VSU5UMzIsCisgICAgICBUWVBFX0JZVEVTOiBDUFBUWVBFX1NUUklORywKKyAgICAgIFRZUEVfU1RSSU5HOiBDUFBUWVBFX1NUUklORywKKyAgICAgIFRZUEVfQk9PTDogQ1BQVFlQRV9CT09MLAorICAgICAgVFlQRV9NRVNTQUdFOiBDUFBUWVBFX01FU1NBR0UsCisgICAgICBUWVBFX0dST1VQOiBDUFBUWVBFX01FU1NBR0UKKyAgICAgIH0KKworICAjIE11c3QgYmUgY29uc2lzdGVudCB3aXRoIEMrKyBGaWVsZERlc2NyaXB0b3I6OkxhYmVsIGVudW0gaW4KKyAgIyBkZXNjcmlwdG9yLmguCisgICMKKyAgIyBUT0RPKHJvYmluc29uKTogRmluZCBhIHdheSB0byBlbGltaW5hdGUgdGhpcyByZXBldGl0aW9uLgorICBMQUJFTF9PUFRJT05BTCAgICAgID0gMQorICBMQUJFTF9SRVFVSVJFRCAgICAgID0gMgorICBMQUJFTF9SRVBFQVRFRCAgICAgID0gMworICBNQVhfTEFCRUwgICAgICAgICAgID0gMworCisgICMgTXVzdCBiZSBjb25zaXN0ZW50IHdpdGggQysrIGNvbnN0YW50cyBrTWF4TnVtYmVyLCBrRmlyc3RSZXNlcnZlZE51bWJlciwKKyAgIyBhbmQga0xhc3RSZXNlcnZlZE51bWJlciBpbiBkZXNjcmlwdG9yLmgKKyAgTUFYX0ZJRUxEX05VTUJFUiA9ICgxIDw8IDI5KSAtIDEKKyAgRklSU1RfUkVTRVJWRURfRklFTERfTlVNQkVSID0gMTkwMDAKKyAgTEFTVF9SRVNFUlZFRF9GSUVMRF9OVU1CRVIgPSAxOTk5OQorCisgIGlmIF9VU0VfQ19ERVNDUklQVE9SUzoKKyAgICBfQ19ERVNDUklQVE9SX0NMQVNTID0gX21lc3NhZ2UuRmllbGREZXNjcmlwdG9yCisKKyAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIGZ1bGxfbmFtZSwgaW5kZXgsIG51bWJlciwgdHlwZSwgY3BwX3R5cGUsIGxhYmVsLAorICAgICAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUsIG1lc3NhZ2VfdHlwZSwgZW51bV90eXBlLCBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uLCBleHRlbnNpb25fc2NvcGUsIG9wdGlvbnM9Tm9uZSwKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgICAgICAgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBjb250YWluaW5nX29uZW9mPU5vbmUsIGpzb25fbmFtZT1Ob25lLAorICAgICAgICAgICAgICAgIGZpbGU9Tm9uZSwgY3JlYXRlX2tleT1Ob25lKTogICMgcHlsaW50OiBkaXNhYmxlPXJlZGVmaW5lZC1idWlsdGluCisgICAgICBfbWVzc2FnZS5NZXNzYWdlLl9DaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCkKKyAgICAgIGlmIGlzX2V4dGVuc2lvbjoKKyAgICAgICAgcmV0dXJuIF9tZXNzYWdlLmRlZmF1bHRfcG9vbC5GaW5kRXh0ZW5zaW9uQnlOYW1lKGZ1bGxfbmFtZSkKKyAgICAgIGVsc2U6CisgICAgICAgIHJldHVybiBfbWVzc2FnZS5kZWZhdWx0X3Bvb2wuRmluZEZpZWxkQnlOYW1lKGZ1bGxfbmFtZSkKKworICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZnVsbF9uYW1lLCBpbmRleCwgbnVtYmVyLCB0eXBlLCBjcHBfdHlwZSwgbGFiZWwsCisgICAgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlLCBtZXNzYWdlX3R5cGUsIGVudW1fdHlwZSwgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uLCBleHRlbnNpb25fc2NvcGUsIG9wdGlvbnM9Tm9uZSwKKyAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgICAgICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgY29udGFpbmluZ19vbmVvZj1Ob25lLCBqc29uX25hbWU9Tm9uZSwKKyAgICAgICAgICAgICAgIGZpbGU9Tm9uZSwgY3JlYXRlX2tleT1Ob25lKTogICMgcHlsaW50OiBkaXNhYmxlPXJlZGVmaW5lZC1idWlsdGluCisgICAgIiIiVGhlIGFyZ3VtZW50cyBhcmUgYXMgZGVzY3JpYmVkIGluIHRoZSBkZXNjcmlwdGlvbiBvZiBGaWVsZERlc2NyaXB0b3IKKyAgICBhdHRyaWJ1dGVzIGFib3ZlLgorCisgICAgTm90ZSB0aGF0IGNvbnRhaW5pbmdfdHlwZSBtYXkgYmUgTm9uZSwgYW5kIG1heSBiZSBzZXQgbGF0ZXIgaWYgbmVjZXNzYXJ5CisgICAgKHRvIGRlYWwgd2l0aCBjaXJjdWxhciByZWZlcmVuY2VzIGJldHdlZW4gbWVzc2FnZSB0eXBlcywgZm9yIGV4YW1wbGUpLgorICAgIExpa2V3aXNlIGZvciBleHRlbnNpb25fc2NvcGUuCisgICAgIiIiCisgICAgaWYgY3JlYXRlX2tleSBpcyBub3QgX2ludGVybmFsX2NyZWF0ZV9rZXk6CisgICAgICBfRGVwcmVjYXRlZCgnRmllbGREZXNjcmlwdG9yJykKKworICAgIHN1cGVyKEZpZWxkRGVzY3JpcHRvciwgc2VsZikuX19pbml0X18oCisgICAgICAgIG9wdGlvbnMsIHNlcmlhbGl6ZWRfb3B0aW9ucywgJ0ZpZWxkT3B0aW9ucycpCisgICAgc2VsZi5uYW1lID0gbmFtZQorICAgIHNlbGYuZnVsbF9uYW1lID0gZnVsbF9uYW1lCisgICAgc2VsZi5maWxlID0gZmlsZQorICAgIHNlbGYuX2NhbWVsY2FzZV9uYW1lID0gTm9uZQorICAgIGlmIGpzb25fbmFtZSBpcyBOb25lOgorICAgICAgc2VsZi5qc29uX25hbWUgPSBfVG9Kc29uTmFtZShuYW1lKQorICAgIGVsc2U6CisgICAgICBzZWxmLmpzb25fbmFtZSA9IGpzb25fbmFtZQorICAgIHNlbGYuaW5kZXggPSBpbmRleAorICAgIHNlbGYubnVtYmVyID0gbnVtYmVyCisgICAgc2VsZi50eXBlID0gdHlwZQorICAgIHNlbGYuY3BwX3R5cGUgPSBjcHBfdHlwZQorICAgIHNlbGYubGFiZWwgPSBsYWJlbAorICAgIHNlbGYuaGFzX2RlZmF1bHRfdmFsdWUgPSBoYXNfZGVmYXVsdF92YWx1ZQorICAgIHNlbGYuZGVmYXVsdF92YWx1ZSA9IGRlZmF1bHRfdmFsdWUKKyAgICBzZWxmLmNvbnRhaW5pbmdfdHlwZSA9IGNvbnRhaW5pbmdfdHlwZQorICAgIHNlbGYubWVzc2FnZV90eXBlID0gbWVzc2FnZV90eXBlCisgICAgc2VsZi5lbnVtX3R5cGUgPSBlbnVtX3R5cGUKKyAgICBzZWxmLmlzX2V4dGVuc2lvbiA9IGlzX2V4dGVuc2lvbgorICAgIHNlbGYuZXh0ZW5zaW9uX3Njb3BlID0gZXh0ZW5zaW9uX3Njb3BlCisgICAgc2VsZi5jb250YWluaW5nX29uZW9mID0gY29udGFpbmluZ19vbmVvZgorICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ3B5dGhvbic6CisgICAgICBzZWxmLl9jZGVzY3JpcHRvciA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgaWYgaXNfZXh0ZW5zaW9uOgorICAgICAgICBzZWxmLl9jZGVzY3JpcHRvciA9IF9tZXNzYWdlLmRlZmF1bHRfcG9vbC5GaW5kRXh0ZW5zaW9uQnlOYW1lKGZ1bGxfbmFtZSkKKyAgICAgIGVsc2U6CisgICAgICAgIHNlbGYuX2NkZXNjcmlwdG9yID0gX21lc3NhZ2UuZGVmYXVsdF9wb29sLkZpbmRGaWVsZEJ5TmFtZShmdWxsX25hbWUpCisKKyAgQHByb3BlcnR5CisgIGRlZiBjYW1lbGNhc2VfbmFtZShzZWxmKToKKyAgICAiIiJDYW1lbGNhc2UgbmFtZSBvZiB0aGlzIGZpZWxkLgorCisgICAgUmV0dXJuczoKKyAgICAgIHN0cjogdGhlIG5hbWUgaW4gQ2FtZWxDYXNlLgorICAgICIiIgorICAgIGlmIHNlbGYuX2NhbWVsY2FzZV9uYW1lIGlzIE5vbmU6CisgICAgICBzZWxmLl9jYW1lbGNhc2VfbmFtZSA9IF9Ub0NhbWVsQ2FzZShzZWxmLm5hbWUpCisgICAgcmV0dXJuIHNlbGYuX2NhbWVsY2FzZV9uYW1lCisKKyAgQHByb3BlcnR5CisgIGRlZiBoYXNfcHJlc2VuY2Uoc2VsZik6CisgICAgIiIiV2hldGhlciB0aGUgZmllbGQgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHVucG9wdWxhdGVkIGFuZCBkZWZhdWx0IHZhbHVlcy4KKworICAgIFJhaXNlczoKKyAgICAgIFJ1bnRpbWVFcnJvcjogc2luZ3VsYXIgZmllbGQgdGhhdCBpcyBub3QgbGlua2VkIHdpdGggbWVzc2FnZSBub3IgZmlsZS4KKyAgICAiIiIKKyAgICBpZiBzZWxmLmxhYmVsID09IEZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIChzZWxmLmNwcF90eXBlID09IEZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0Ugb3IKKyAgICAgICAgc2VsZi5jb250YWluaW5nX29uZW9mKToKKyAgICAgIHJldHVybiBUcnVlCisgICAgaWYgaGFzYXR0cihzZWxmLmZpbGUsICdzeW50YXgnKToKKyAgICAgIHJldHVybiBzZWxmLmZpbGUuc3ludGF4ID09ICdwcm90bzInCisgICAgaWYgaGFzYXR0cihzZWxmLm1lc3NhZ2VfdHlwZSwgJ3N5bnRheCcpOgorICAgICAgcmV0dXJuIHNlbGYubWVzc2FnZV90eXBlLnN5bnRheCA9PSAncHJvdG8yJworICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgJ2hhc19wcmVzZW5jZSBpcyBub3QgcmVhZHkgdG8gdXNlIGJlY2F1c2UgZmllbGQgJXMgaXMgbm90JworICAgICAgICAnIGxpbmtlZCB3aXRoIG1lc3NhZ2UgdHlwZSBub3IgZmlsZScgJSBzZWxmLmZ1bGxfbmFtZSkKKworICBAc3RhdGljbWV0aG9kCisgIGRlZiBQcm90b1R5cGVUb0NwcFByb3RvVHlwZShwcm90b190eXBlKToKKyAgICAiIiJDb252ZXJ0cyBmcm9tIGEgUHl0aG9uIHByb3RvIHR5cGUgdG8gYSBDKysgUHJvdG8gVHlwZS4KKworICAgIFRoZSBQeXRob24gUHJvdG9jb2xCdWZmZXIgY2xhc3NlcyBzcGVjaWZ5IGJvdGggdGhlICdQeXRob24nIGRhdGF0eXBlIGFuZCB0aGUKKyAgICAnQysrJyBkYXRhdHlwZSAtIGFuZCB0aGV5J3JlIG5vdCB0aGUgc2FtZS4gVGhpcyBoZWxwZXIgbWV0aG9kIHNob3VsZAorICAgIHRyYW5zbGF0ZSBmcm9tIG9uZSB0byBhbm90aGVyLgorCisgICAgQXJnczoKKyAgICAgIHByb3RvX3R5cGU6IHRoZSBQeXRob24gcHJvdG8gdHlwZSAoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV8qKQorICAgIFJldHVybnM6CisgICAgICBpbnQ6IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfKiwgdGhlIEMrKyB0eXBlLgorICAgIFJhaXNlczoKKyAgICAgIFR5cGVUcmFuc2Zvcm1hdGlvbkVycm9yOiB3aGVuIHRoZSBQeXRob24gcHJvdG8gdHlwZSBpc24ndCBrbm93bi4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yLl9QWVRIT05fVE9fQ1BQX1BST1RPX1RZUEVfTUFQW3Byb3RvX3R5cGVdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgcmFpc2UgVHlwZVRyYW5zZm9ybWF0aW9uRXJyb3IoJ1Vua25vd24gcHJvdG9fdHlwZTogJXMnICUgcHJvdG9fdHlwZSkKKworCitjbGFzcyBFbnVtRGVzY3JpcHRvcihfTmVzdGVkRGVzY3JpcHRvckJhc2UpOgorCisgICIiIkRlc2NyaXB0b3IgZm9yIGFuIGVudW0gZGVmaW5lZCBpbiBhIC5wcm90byBmaWxlLgorCisgIEF0dHJpYnV0ZXM6CisgICAgbmFtZSAoc3RyKTogTmFtZSBvZiB0aGUgZW51bSB0eXBlLgorICAgIGZ1bGxfbmFtZSAoc3RyKTogRnVsbCBuYW1lIG9mIHRoZSB0eXBlLCBpbmNsdWRpbmcgcGFja2FnZSBuYW1lCisgICAgICBhbmQgYW55IGVuY2xvc2luZyB0eXBlKHMpLgorCisgICAgdmFsdWVzIChsaXN0W0VudW1WYWx1ZURlc2NyaXB0b3JdKTogTGlzdCBvZiB0aGUgdmFsdWVzCisgICAgICBpbiB0aGlzIGVudW0uCisgICAgdmFsdWVzX2J5X25hbWUgKGRpY3Qoc3RyLCBFbnVtVmFsdWVEZXNjcmlwdG9yKSk6IFNhbWUgYXMgOmF0dHI6YHZhbHVlc2AsCisgICAgICBidXQgaW5kZXhlZCBieSB0aGUgIm5hbWUiIGZpZWxkIG9mIGVhY2ggRW51bVZhbHVlRGVzY3JpcHRvci4KKyAgICB2YWx1ZXNfYnlfbnVtYmVyIChkaWN0KGludCwgRW51bVZhbHVlRGVzY3JpcHRvcikpOiBTYW1lIGFzIDphdHRyOmB2YWx1ZXNgLAorICAgICAgYnV0IGluZGV4ZWQgYnkgdGhlICJudW1iZXIiIGZpZWxkIG9mIGVhY2ggRW51bVZhbHVlRGVzY3JpcHRvci4KKyAgICBjb250YWluaW5nX3R5cGUgKERlc2NyaXB0b3IpOiBEZXNjcmlwdG9yIG9mIHRoZSBpbW1lZGlhdGUgY29udGFpbmluZworICAgICAgdHlwZSBvZiB0aGlzIGVudW0sIG9yIE5vbmUgaWYgdGhpcyBpcyBhbiBlbnVtIGRlZmluZWQgYXQgdGhlCisgICAgICB0b3AgbGV2ZWwgaW4gYSAucHJvdG8gZmlsZS4gIFNldCBieSBEZXNjcmlwdG9yJ3MgY29uc3RydWN0b3IKKyAgICAgIGlmIHdlJ3JlIHBhc3NlZCBpbnRvIG9uZS4KKyAgICBmaWxlIChGaWxlRGVzY3JpcHRvcik6IFJlZmVyZW5jZSB0byBmaWxlIGRlc2NyaXB0b3IuCisgICAgb3B0aW9ucyAoZGVzY3JpcHRvcl9wYjIuRW51bU9wdGlvbnMpOiBFbnVtIG9wdGlvbnMgbWVzc2FnZSBvcgorICAgICAgTm9uZSB0byB1c2UgZGVmYXVsdCBlbnVtIG9wdGlvbnMuCisgICIiIgorCisgIGlmIF9VU0VfQ19ERVNDUklQVE9SUzoKKyAgICBfQ19ERVNDUklQVE9SX0NMQVNTID0gX21lc3NhZ2UuRW51bURlc2NyaXB0b3IKKworICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgZnVsbF9uYW1lLCBmaWxlbmFtZSwgdmFsdWVzLAorICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLCBvcHRpb25zPU5vbmUsCisgICAgICAgICAgICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9Tm9uZSwgICMgcHlsaW50OiBkaXNhYmxlPXJlZGVmaW5lZC1idWlsdGluCisgICAgICAgICAgICAgICAgc2VyaWFsaXplZF9zdGFydD1Ob25lLCBzZXJpYWxpemVkX2VuZD1Ob25lLCBjcmVhdGVfa2V5PU5vbmUpOgorICAgICAgX21lc3NhZ2UuTWVzc2FnZS5fQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgpCisgICAgICByZXR1cm4gX21lc3NhZ2UuZGVmYXVsdF9wb29sLkZpbmRFbnVtVHlwZUJ5TmFtZShmdWxsX25hbWUpCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGZ1bGxfbmFtZSwgZmlsZW5hbWUsIHZhbHVlcywKKyAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLCBvcHRpb25zPU5vbmUsCisgICAgICAgICAgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1Ob25lLCAgIyBweWxpbnQ6IGRpc2FibGU9cmVkZWZpbmVkLWJ1aWx0aW4KKyAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRfc3RhcnQ9Tm9uZSwgc2VyaWFsaXplZF9lbmQ9Tm9uZSwgY3JlYXRlX2tleT1Ob25lKToKKyAgICAiIiJBcmd1bWVudHMgYXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgYXR0cmlidXRlIGRlc2NyaXB0aW9uIGFib3ZlLgorCisgICAgTm90ZSB0aGF0IGZpbGVuYW1lIGlzIGFuIG9ic29sZXRlIGFyZ3VtZW50LCB0aGF0IGlzIG5vdCB1c2VkIGFueW1vcmUuCisgICAgUGxlYXNlIHVzZSBmaWxlLm5hbWUgdG8gYWNjZXNzIHRoaXMgYXMgYW4gYXR0cmlidXRlLgorICAgICIiIgorICAgIGlmIGNyZWF0ZV9rZXkgaXMgbm90IF9pbnRlcm5hbF9jcmVhdGVfa2V5OgorICAgICAgX0RlcHJlY2F0ZWQoJ0VudW1EZXNjcmlwdG9yJykKKworICAgIHN1cGVyKEVudW1EZXNjcmlwdG9yLCBzZWxmKS5fX2luaXRfXygKKyAgICAgICAgb3B0aW9ucywgJ0VudW1PcHRpb25zJywgbmFtZSwgZnVsbF9uYW1lLCBmaWxlLAorICAgICAgICBjb250YWluaW5nX3R5cGUsIHNlcmlhbGl6ZWRfc3RhcnQ9c2VyaWFsaXplZF9zdGFydCwKKyAgICAgICAgc2VyaWFsaXplZF9lbmQ9c2VyaWFsaXplZF9lbmQsIHNlcmlhbGl6ZWRfb3B0aW9ucz1zZXJpYWxpemVkX29wdGlvbnMpCisKKyAgICBzZWxmLnZhbHVlcyA9IHZhbHVlcworICAgIGZvciB2YWx1ZSBpbiBzZWxmLnZhbHVlczoKKyAgICAgIHZhbHVlLnR5cGUgPSBzZWxmCisgICAgc2VsZi52YWx1ZXNfYnlfbmFtZSA9IGRpY3QoKHYubmFtZSwgdikgZm9yIHYgaW4gdmFsdWVzKQorICAgICMgVmFsdWVzIGFyZSByZXZlcnNlZCB0byBlbnN1cmUgdGhhdCB0aGUgZmlyc3QgYWxpYXMgaXMgcmV0YWluZWQuCisgICAgc2VsZi52YWx1ZXNfYnlfbnVtYmVyID0gZGljdCgodi5udW1iZXIsIHYpIGZvciB2IGluIHJldmVyc2VkKHZhbHVlcykpCisKKyAgZGVmIENvcHlUb1Byb3RvKHNlbGYsIHByb3RvKToKKyAgICAiIiJDb3BpZXMgdGhpcyB0byBhIGRlc2NyaXB0b3JfcGIyLkVudW1EZXNjcmlwdG9yUHJvdG8uCisKKyAgICBBcmdzOgorICAgICAgcHJvdG8gKGRlc2NyaXB0b3JfcGIyLkVudW1EZXNjcmlwdG9yUHJvdG8pOiBBbiBlbXB0eSBkZXNjcmlwdG9yIHByb3RvLgorICAgICIiIgorICAgICMgVGhpcyBmdW5jdGlvbiBpcyBvdmVycmlkZGVuIHRvIGdpdmUgYSBiZXR0ZXIgZG9jIGNvbW1lbnQuCisgICAgc3VwZXIoRW51bURlc2NyaXB0b3IsIHNlbGYpLkNvcHlUb1Byb3RvKHByb3RvKQorCisKK2NsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3IoRGVzY3JpcHRvckJhc2UpOgorCisgICIiIkRlc2NyaXB0b3IgZm9yIGEgc2luZ2xlIHZhbHVlIHdpdGhpbiBhbiBlbnVtLgorCisgIEF0dHJpYnV0ZXM6CisgICAgbmFtZSAoc3RyKTogTmFtZSBvZiB0aGlzIHZhbHVlLgorICAgIGluZGV4IChpbnQpOiBEZW5zZSwgMC1pbmRleGVkIGluZGV4IGdpdmluZyB0aGUgb3JkZXIgdGhhdCB0aGlzCisgICAgICB2YWx1ZSBhcHBlYXJzIHRleHR1YWxseSB3aXRoaW4gaXRzIGVudW0gaW4gdGhlIC5wcm90byBmaWxlLgorICAgIG51bWJlciAoaW50KTogQWN0dWFsIG51bWJlciBhc3NpZ25lZCB0byB0aGlzIGVudW0gdmFsdWUuCisgICAgdHlwZSAoRW51bURlc2NyaXB0b3IpOiA6Y2xhc3M6YEVudW1EZXNjcmlwdG9yYCB0byB3aGljaCB0aGlzIHZhbHVlCisgICAgICBiZWxvbmdzLiAgU2V0IGJ5IDpjbGFzczpgRW51bURlc2NyaXB0b3JgJ3MgY29uc3RydWN0b3IgaWYgd2UncmUKKyAgICAgIHBhc3NlZCBpbnRvIG9uZS4KKyAgICBvcHRpb25zIChkZXNjcmlwdG9yX3BiMi5FbnVtVmFsdWVPcHRpb25zKTogRW51bSB2YWx1ZSBvcHRpb25zIG1lc3NhZ2Ugb3IKKyAgICAgIE5vbmUgdG8gdXNlIGRlZmF1bHQgZW51bSB2YWx1ZSBvcHRpb25zIG9wdGlvbnMuCisgICIiIgorCisgIGlmIF9VU0VfQ19ERVNDUklQVE9SUzoKKyAgICBfQ19ERVNDUklQVE9SX0NMQVNTID0gX21lc3NhZ2UuRW51bVZhbHVlRGVzY3JpcHRvcgorCisgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCBpbmRleCwgbnVtYmVyLAorICAgICAgICAgICAgICAgIHR5cGU9Tm9uZSwgICMgcHlsaW50OiBkaXNhYmxlPXJlZGVmaW5lZC1idWlsdGluCisgICAgICAgICAgICAgICAgb3B0aW9ucz1Ob25lLCBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgY3JlYXRlX2tleT1Ob25lKToKKyAgICAgIF9tZXNzYWdlLk1lc3NhZ2UuX0NoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoKQorICAgICAgIyBUaGVyZSBpcyBubyB3YXkgd2UgY2FuIGJ1aWxkIGEgY29tcGxldGUgRW51bVZhbHVlRGVzY3JpcHRvciB3aXRoIHRoZQorICAgICAgIyBnaXZlbiBwYXJhbWV0ZXJzICh0aGUgbmFtZSBvZiB0aGUgRW51bSBpcyBub3Qga25vd24sIGZvciBleGFtcGxlKS4KKyAgICAgICMgRm9ydHVuYXRlbHkgZ2VuZXJhdGVkIGZpbGVzIGp1c3QgcGFzcyBpdCB0byB0aGUgRW51bURlc2NyaXB0b3IoKQorICAgICAgIyBjb25zdHJ1Y3Rvciwgd2hpY2ggd2lsbCBpZ25vcmUgaXQsIHNvIHJldHVybmluZyBOb25lIGlzIGdvb2QgZW5vdWdoLgorICAgICAgcmV0dXJuIE5vbmUKKworICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgaW5kZXgsIG51bWJlciwKKyAgICAgICAgICAgICAgIHR5cGU9Tm9uZSwgICMgcHlsaW50OiBkaXNhYmxlPXJlZGVmaW5lZC1idWlsdGluCisgICAgICAgICAgICAgICBvcHRpb25zPU5vbmUsIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBjcmVhdGVfa2V5PU5vbmUpOgorICAgICIiIkFyZ3VtZW50cyBhcmUgYXMgZGVzY3JpYmVkIGluIHRoZSBhdHRyaWJ1dGUgZGVzY3JpcHRpb24gYWJvdmUuIiIiCisgICAgaWYgY3JlYXRlX2tleSBpcyBub3QgX2ludGVybmFsX2NyZWF0ZV9rZXk6CisgICAgICBfRGVwcmVjYXRlZCgnRW51bVZhbHVlRGVzY3JpcHRvcicpCisKKyAgICBzdXBlcihFbnVtVmFsdWVEZXNjcmlwdG9yLCBzZWxmKS5fX2luaXRfXygKKyAgICAgICAgb3B0aW9ucywgc2VyaWFsaXplZF9vcHRpb25zLCAnRW51bVZhbHVlT3B0aW9ucycpCisgICAgc2VsZi5uYW1lID0gbmFtZQorICAgIHNlbGYuaW5kZXggPSBpbmRleAorICAgIHNlbGYubnVtYmVyID0gbnVtYmVyCisgICAgc2VsZi50eXBlID0gdHlwZQorCisKK2NsYXNzIE9uZW9mRGVzY3JpcHRvcihEZXNjcmlwdG9yQmFzZSk6CisgICIiIkRlc2NyaXB0b3IgZm9yIGEgb25lb2YgZmllbGQuCisKKyAgQXR0cmlidXRlczoKKyAgICBuYW1lIChzdHIpOiBOYW1lIG9mIHRoZSBvbmVvZiBmaWVsZC4KKyAgICBmdWxsX25hbWUgKHN0cik6IEZ1bGwgbmFtZSBvZiB0aGUgb25lb2YgZmllbGQsIGluY2x1ZGluZyBwYWNrYWdlIG5hbWUuCisgICAgaW5kZXggKGludCk6IDAtYmFzZWQgaW5kZXggZ2l2aW5nIHRoZSBvcmRlciBvZiB0aGUgb25lb2YgZmllbGQgaW5zaWRlCisgICAgICBpdHMgY29udGFpbmluZyB0eXBlLgorICAgIGNvbnRhaW5pbmdfdHlwZSAoRGVzY3JpcHRvcik6IDpjbGFzczpgRGVzY3JpcHRvcmAgb2YgdGhlIHByb3RvY29sIG1lc3NhZ2UKKyAgICAgIHR5cGUgdGhhdCBjb250YWlucyB0aGlzIGZpZWxkLiAgU2V0IGJ5IHRoZSA6Y2xhc3M6YERlc2NyaXB0b3JgIGNvbnN0cnVjdG9yCisgICAgICBpZiB3ZSdyZSBwYXNzZWQgaW50byBvbmUuCisgICAgZmllbGRzIChsaXN0W0ZpZWxkRGVzY3JpcHRvcl0pOiBUaGUgbGlzdCBvZiBmaWVsZCBkZXNjcmlwdG9ycyB0aGlzCisgICAgICBvbmVvZiBjYW4gY29udGFpbi4KKyAgIiIiCisKKyAgaWYgX1VTRV9DX0RFU0NSSVBUT1JTOgorICAgIF9DX0RFU0NSSVBUT1JfQ0xBU1MgPSBfbWVzc2FnZS5PbmVvZkRlc2NyaXB0b3IKKworICAgIGRlZiBfX25ld19fKAorICAgICAgICBjbHMsIG5hbWUsIGZ1bGxfbmFtZSwgaW5kZXgsIGNvbnRhaW5pbmdfdHlwZSwgZmllbGRzLCBvcHRpb25zPU5vbmUsCisgICAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBjcmVhdGVfa2V5PU5vbmUpOgorICAgICAgX21lc3NhZ2UuTWVzc2FnZS5fQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgpCisgICAgICByZXR1cm4gX21lc3NhZ2UuZGVmYXVsdF9wb29sLkZpbmRPbmVvZkJ5TmFtZShmdWxsX25hbWUpCisKKyAgZGVmIF9faW5pdF9fKAorICAgICAgc2VsZiwgbmFtZSwgZnVsbF9uYW1lLCBpbmRleCwgY29udGFpbmluZ190eXBlLCBmaWVsZHMsIG9wdGlvbnM9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBjcmVhdGVfa2V5PU5vbmUpOgorICAgICIiIkFyZ3VtZW50cyBhcmUgYXMgZGVzY3JpYmVkIGluIHRoZSBhdHRyaWJ1dGUgZGVzY3JpcHRpb24gYWJvdmUuIiIiCisgICAgaWYgY3JlYXRlX2tleSBpcyBub3QgX2ludGVybmFsX2NyZWF0ZV9rZXk6CisgICAgICBfRGVwcmVjYXRlZCgnT25lb2ZEZXNjcmlwdG9yJykKKworICAgIHN1cGVyKE9uZW9mRGVzY3JpcHRvciwgc2VsZikuX19pbml0X18oCisgICAgICAgIG9wdGlvbnMsIHNlcmlhbGl6ZWRfb3B0aW9ucywgJ09uZW9mT3B0aW9ucycpCisgICAgc2VsZi5uYW1lID0gbmFtZQorICAgIHNlbGYuZnVsbF9uYW1lID0gZnVsbF9uYW1lCisgICAgc2VsZi5pbmRleCA9IGluZGV4CisgICAgc2VsZi5jb250YWluaW5nX3R5cGUgPSBjb250YWluaW5nX3R5cGUKKyAgICBzZWxmLmZpZWxkcyA9IGZpZWxkcworCisKK2NsYXNzIFNlcnZpY2VEZXNjcmlwdG9yKF9OZXN0ZWREZXNjcmlwdG9yQmFzZSk6CisKKyAgIiIiRGVzY3JpcHRvciBmb3IgYSBzZXJ2aWNlLgorCisgIEF0dHJpYnV0ZXM6CisgICAgbmFtZSAoc3RyKTogTmFtZSBvZiB0aGUgc2VydmljZS4KKyAgICBmdWxsX25hbWUgKHN0cik6IEZ1bGwgbmFtZSBvZiB0aGUgc2VydmljZSwgaW5jbHVkaW5nIHBhY2thZ2UgbmFtZS4KKyAgICBpbmRleCAoaW50KTogMC1pbmRleGVkIGluZGV4IGdpdmluZyB0aGUgb3JkZXIgdGhhdCB0aGlzIHNlcnZpY2VzCisgICAgICBkZWZpbml0aW9uIGFwcGVhcnMgd2l0aGluIHRoZSAucHJvdG8gZmlsZS4KKyAgICBtZXRob2RzIChsaXN0W01ldGhvZERlc2NyaXB0b3JdKTogTGlzdCBvZiBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoaXMKKyAgICAgIHNlcnZpY2UuCisgICAgbWV0aG9kc19ieV9uYW1lIChkaWN0KHN0ciwgTWV0aG9kRGVzY3JpcHRvcikpOiBTYW1lCisgICAgICA6Y2xhc3M6YE1ldGhvZERlc2NyaXB0b3JgIG9iamVjdHMgYXMgaW4gOmF0dHI6YG1ldGhvZHNfYnlfbmFtZWAsIGJ1dAorICAgICAgaW5kZXhlZCBieSAibmFtZSIgYXR0cmlidXRlIGluIGVhY2ggOmNsYXNzOmBNZXRob2REZXNjcmlwdG9yYC4KKyAgICBvcHRpb25zIChkZXNjcmlwdG9yX3BiMi5TZXJ2aWNlT3B0aW9ucyk6IFNlcnZpY2Ugb3B0aW9ucyBtZXNzYWdlIG9yCisgICAgICBOb25lIHRvIHVzZSBkZWZhdWx0IHNlcnZpY2Ugb3B0aW9ucy4KKyAgICBmaWxlIChGaWxlRGVzY3JpcHRvcik6IFJlZmVyZW5jZSB0byBmaWxlIGluZm8uCisgICIiIgorCisgIGlmIF9VU0VfQ19ERVNDUklQVE9SUzoKKyAgICBfQ19ERVNDUklQVE9SX0NMQVNTID0gX21lc3NhZ2UuU2VydmljZURlc2NyaXB0b3IKKworICAgIGRlZiBfX25ld19fKAorICAgICAgICBjbHMsCisgICAgICAgIG5hbWU9Tm9uZSwKKyAgICAgICAgZnVsbF9uYW1lPU5vbmUsCisgICAgICAgIGluZGV4PU5vbmUsCisgICAgICAgIG1ldGhvZHM9Tm9uZSwKKyAgICAgICAgb3B0aW9ucz1Ob25lLAorICAgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgICAgZmlsZT1Ob25lLCAgIyBweWxpbnQ6IGRpc2FibGU9cmVkZWZpbmVkLWJ1aWx0aW4KKyAgICAgICAgc2VyaWFsaXplZF9zdGFydD1Ob25lLAorICAgICAgICBzZXJpYWxpemVkX2VuZD1Ob25lLAorICAgICAgICBjcmVhdGVfa2V5PU5vbmUpOgorICAgICAgX21lc3NhZ2UuTWVzc2FnZS5fQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgpICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICByZXR1cm4gX21lc3NhZ2UuZGVmYXVsdF9wb29sLkZpbmRTZXJ2aWNlQnlOYW1lKGZ1bGxfbmFtZSkKKworICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZnVsbF9uYW1lLCBpbmRleCwgbWV0aG9kcywgb3B0aW9ucz1Ob25lLAorICAgICAgICAgICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9Tm9uZSwgICMgcHlsaW50OiBkaXNhYmxlPXJlZGVmaW5lZC1idWlsdGluCisgICAgICAgICAgICAgICBzZXJpYWxpemVkX3N0YXJ0PU5vbmUsIHNlcmlhbGl6ZWRfZW5kPU5vbmUsIGNyZWF0ZV9rZXk9Tm9uZSk6CisgICAgaWYgY3JlYXRlX2tleSBpcyBub3QgX2ludGVybmFsX2NyZWF0ZV9rZXk6CisgICAgICBfRGVwcmVjYXRlZCgnU2VydmljZURlc2NyaXB0b3InKQorCisgICAgc3VwZXIoU2VydmljZURlc2NyaXB0b3IsIHNlbGYpLl9faW5pdF9fKAorICAgICAgICBvcHRpb25zLCAnU2VydmljZU9wdGlvbnMnLCBuYW1lLCBmdWxsX25hbWUsIGZpbGUsCisgICAgICAgIE5vbmUsIHNlcmlhbGl6ZWRfc3RhcnQ9c2VyaWFsaXplZF9zdGFydCwKKyAgICAgICAgc2VyaWFsaXplZF9lbmQ9c2VyaWFsaXplZF9lbmQsIHNlcmlhbGl6ZWRfb3B0aW9ucz1zZXJpYWxpemVkX29wdGlvbnMpCisgICAgc2VsZi5pbmRleCA9IGluZGV4CisgICAgc2VsZi5tZXRob2RzID0gbWV0aG9kcworICAgIHNlbGYubWV0aG9kc19ieV9uYW1lID0gZGljdCgobS5uYW1lLCBtKSBmb3IgbSBpbiBtZXRob2RzKQorICAgICMgU2V0IHRoZSBjb250YWluaW5nIHNlcnZpY2UgZm9yIGVhY2ggbWV0aG9kIGluIHRoaXMgc2VydmljZS4KKyAgICBmb3IgbWV0aG9kIGluIHNlbGYubWV0aG9kczoKKyAgICAgIG1ldGhvZC5jb250YWluaW5nX3NlcnZpY2UgPSBzZWxmCisKKyAgZGVmIEZpbmRNZXRob2RCeU5hbWUoc2VsZiwgbmFtZSk6CisgICAgIiIiU2VhcmNoZXMgZm9yIHRoZSBzcGVjaWZpZWQgbWV0aG9kLCBhbmQgcmV0dXJucyBpdHMgZGVzY3JpcHRvci4KKworICAgIEFyZ3M6CisgICAgICBuYW1lIChzdHIpOiBOYW1lIG9mIHRoZSBtZXRob2QuCisgICAgUmV0dXJuczoKKyAgICAgIE1ldGhvZERlc2NyaXB0b3Igb3IgTm9uZTogdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSByZXF1ZXN0ZWQgbWV0aG9kLCBpZgorICAgICAgZm91bmQuCisgICAgIiIiCisgICAgcmV0dXJuIHNlbGYubWV0aG9kc19ieV9uYW1lLmdldChuYW1lLCBOb25lKQorCisgIGRlZiBDb3B5VG9Qcm90byhzZWxmLCBwcm90byk6CisgICAgIiIiQ29waWVzIHRoaXMgdG8gYSBkZXNjcmlwdG9yX3BiMi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLgorCisgICAgQXJnczoKKyAgICAgIHByb3RvIChkZXNjcmlwdG9yX3BiMi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKTogQW4gZW1wdHkgZGVzY3JpcHRvciBwcm90by4KKyAgICAiIiIKKyAgICAjIFRoaXMgZnVuY3Rpb24gaXMgb3ZlcnJpZGRlbiB0byBnaXZlIGEgYmV0dGVyIGRvYyBjb21tZW50LgorICAgIHN1cGVyKFNlcnZpY2VEZXNjcmlwdG9yLCBzZWxmKS5Db3B5VG9Qcm90byhwcm90bykKKworCitjbGFzcyBNZXRob2REZXNjcmlwdG9yKERlc2NyaXB0b3JCYXNlKToKKworICAiIiJEZXNjcmlwdG9yIGZvciBhIG1ldGhvZCBpbiBhIHNlcnZpY2UuCisKKyAgQXR0cmlidXRlczoKKyAgICBuYW1lIChzdHIpOiBOYW1lIG9mIHRoZSBtZXRob2Qgd2l0aGluIHRoZSBzZXJ2aWNlLgorICAgIGZ1bGxfbmFtZSAoc3RyKTogRnVsbCBuYW1lIG9mIG1ldGhvZC4KKyAgICBpbmRleCAoaW50KTogMC1pbmRleGVkIGluZGV4IG9mIHRoZSBtZXRob2QgaW5zaWRlIHRoZSBzZXJ2aWNlLgorICAgIGNvbnRhaW5pbmdfc2VydmljZSAoU2VydmljZURlc2NyaXB0b3IpOiBUaGUgc2VydmljZSB0aGF0IGNvbnRhaW5zIHRoaXMKKyAgICAgIG1ldGhvZC4KKyAgICBpbnB1dF90eXBlIChEZXNjcmlwdG9yKTogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIG1lc3NhZ2UgdGhhdCB0aGlzIG1ldGhvZAorICAgICAgYWNjZXB0cy4KKyAgICBvdXRwdXRfdHlwZSAoRGVzY3JpcHRvcik6IFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBtZXNzYWdlIHRoYXQgdGhpcyBtZXRob2QKKyAgICAgIHJldHVybnMuCisgICAgY2xpZW50X3N0cmVhbWluZyAoYm9vbCk6IFdoZXRoZXIgdGhpcyBtZXRob2QgdXNlcyBjbGllbnQgc3RyZWFtaW5nLgorICAgIHNlcnZlcl9zdHJlYW1pbmcgKGJvb2wpOiBXaGV0aGVyIHRoaXMgbWV0aG9kIHVzZXMgc2VydmVyIHN0cmVhbWluZy4KKyAgICBvcHRpb25zIChkZXNjcmlwdG9yX3BiMi5NZXRob2RPcHRpb25zIG9yIE5vbmUpOiBNZXRob2Qgb3B0aW9ucyBtZXNzYWdlLCBvcgorICAgICAgTm9uZSB0byB1c2UgZGVmYXVsdCBtZXRob2Qgb3B0aW9ucy4KKyAgIiIiCisKKyAgaWYgX1VTRV9DX0RFU0NSSVBUT1JTOgorICAgIF9DX0RFU0NSSVBUT1JfQ0xBU1MgPSBfbWVzc2FnZS5NZXRob2REZXNjcmlwdG9yCisKKyAgICBkZWYgX19uZXdfXyhjbHMsCisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBmdWxsX25hbWUsCisgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgY29udGFpbmluZ19zZXJ2aWNlLAorICAgICAgICAgICAgICAgIGlucHV0X3R5cGUsCisgICAgICAgICAgICAgICAgb3V0cHV0X3R5cGUsCisgICAgICAgICAgICAgICAgY2xpZW50X3N0cmVhbWluZz1GYWxzZSwKKyAgICAgICAgICAgICAgICBzZXJ2ZXJfc3RyZWFtaW5nPUZhbHNlLAorICAgICAgICAgICAgICAgIG9wdGlvbnM9Tm9uZSwKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgICAgICAgICAgICBjcmVhdGVfa2V5PU5vbmUpOgorICAgICAgX21lc3NhZ2UuTWVzc2FnZS5fQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgpICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICByZXR1cm4gX21lc3NhZ2UuZGVmYXVsdF9wb29sLkZpbmRNZXRob2RCeU5hbWUoZnVsbF9uYW1lKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgIGZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgY29udGFpbmluZ19zZXJ2aWNlLAorICAgICAgICAgICAgICAgaW5wdXRfdHlwZSwKKyAgICAgICAgICAgICAgIG91dHB1dF90eXBlLAorICAgICAgICAgICAgICAgY2xpZW50X3N0cmVhbWluZz1GYWxzZSwKKyAgICAgICAgICAgICAgIHNlcnZlcl9zdHJlYW1pbmc9RmFsc2UsCisgICAgICAgICAgICAgICBvcHRpb25zPU5vbmUsCisgICAgICAgICAgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgICAgICAgICAgIGNyZWF0ZV9rZXk9Tm9uZSk6CisgICAgIiIiVGhlIGFyZ3VtZW50cyBhcmUgYXMgZGVzY3JpYmVkIGluIHRoZSBkZXNjcmlwdGlvbiBvZiBNZXRob2REZXNjcmlwdG9yCisgICAgYXR0cmlidXRlcyBhYm92ZS4KKworICAgIE5vdGUgdGhhdCBjb250YWluaW5nX3NlcnZpY2UgbWF5IGJlIE5vbmUsIGFuZCBtYXkgYmUgc2V0IGxhdGVyIGlmIG5lY2Vzc2FyeS4KKyAgICAiIiIKKyAgICBpZiBjcmVhdGVfa2V5IGlzIG5vdCBfaW50ZXJuYWxfY3JlYXRlX2tleToKKyAgICAgIF9EZXByZWNhdGVkKCdNZXRob2REZXNjcmlwdG9yJykKKworICAgIHN1cGVyKE1ldGhvZERlc2NyaXB0b3IsIHNlbGYpLl9faW5pdF9fKAorICAgICAgICBvcHRpb25zLCBzZXJpYWxpemVkX29wdGlvbnMsICdNZXRob2RPcHRpb25zJykKKyAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgc2VsZi5mdWxsX25hbWUgPSBmdWxsX25hbWUKKyAgICBzZWxmLmluZGV4ID0gaW5kZXgKKyAgICBzZWxmLmNvbnRhaW5pbmdfc2VydmljZSA9IGNvbnRhaW5pbmdfc2VydmljZQorICAgIHNlbGYuaW5wdXRfdHlwZSA9IGlucHV0X3R5cGUKKyAgICBzZWxmLm91dHB1dF90eXBlID0gb3V0cHV0X3R5cGUKKyAgICBzZWxmLmNsaWVudF9zdHJlYW1pbmcgPSBjbGllbnRfc3RyZWFtaW5nCisgICAgc2VsZi5zZXJ2ZXJfc3RyZWFtaW5nID0gc2VydmVyX3N0cmVhbWluZworCisgIGRlZiBDb3B5VG9Qcm90byhzZWxmLCBwcm90byk6CisgICAgIiIiQ29waWVzIHRoaXMgdG8gYSBkZXNjcmlwdG9yX3BiMi5NZXRob2REZXNjcmlwdG9yUHJvdG8uCisKKyAgICBBcmdzOgorICAgICAgcHJvdG8gKGRlc2NyaXB0b3JfcGIyLk1ldGhvZERlc2NyaXB0b3JQcm90byk6IEFuIGVtcHR5IGRlc2NyaXB0b3IgcHJvdG8uCisKKyAgICBSYWlzZXM6CisgICAgICBFcnJvcjogSWYgc2VsZiBjb3VsZG4ndCBiZSBzZXJpYWxpemVkLCBkdWUgdG8gdG9vIGZldyBjb25zdHJ1Y3RvcgorICAgICAgICBhcmd1bWVudHMuCisgICAgIiIiCisgICAgaWYgc2VsZi5jb250YWluaW5nX3NlcnZpY2UgaXMgbm90IE5vbmU6CisgICAgICBmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wYjIKKyAgICAgIHNlcnZpY2VfcHJvdG8gPSBkZXNjcmlwdG9yX3BiMi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKCkKKyAgICAgIHNlbGYuY29udGFpbmluZ19zZXJ2aWNlLkNvcHlUb1Byb3RvKHNlcnZpY2VfcHJvdG8pCisgICAgICBwcm90by5Db3B5RnJvbShzZXJ2aWNlX3Byb3RvLm1ldGhvZFtzZWxmLmluZGV4XSkKKyAgICBlbHNlOgorICAgICAgcmFpc2UgRXJyb3IoJ0Rlc2NyaXB0b3IgZG9lcyBub3QgY29udGFpbiBhIHNlcnZpY2UuJykKKworCitjbGFzcyBGaWxlRGVzY3JpcHRvcihEZXNjcmlwdG9yQmFzZSk6CisgICIiIkRlc2NyaXB0b3IgZm9yIGEgZmlsZS4gTWltaWNzIHRoZSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLgorCisgIE5vdGUgdGhhdCA6YXR0cjpgZW51bV90eXBlc19ieV9uYW1lYCwgOmF0dHI6YGV4dGVuc2lvbnNfYnlfbmFtZWAsIGFuZAorICA6YXR0cjpgZGVwZW5kZW5jaWVzYCBmaWVsZHMgYXJlIG9ubHkgc2V0IGJ5IHRoZQorICA6cHk6bW9kOmBnb29nbGUucHJvdG9idWYubWVzc2FnZV9mYWN0b3J5YCBtb2R1bGUsIGFuZCBub3QgYnkgdGhlIGdlbmVyYXRlZAorICBwcm90byBjb2RlLgorCisgIEF0dHJpYnV0ZXM6CisgICAgbmFtZSAoc3RyKTogTmFtZSBvZiBmaWxlLCByZWxhdGl2ZSB0byByb290IG9mIHNvdXJjZSB0cmVlLgorICAgIHBhY2thZ2UgKHN0cik6IE5hbWUgb2YgdGhlIHBhY2thZ2UKKyAgICBzeW50YXggKHN0cik6IHN0cmluZyBpbmRpY2F0aW5nIHN5bnRheCBvZiB0aGUgZmlsZSAoY2FuIGJlICJwcm90bzIiIG9yCisgICAgICAicHJvdG8zIikKKyAgICBzZXJpYWxpemVkX3BiIChieXRlcyk6IEJ5dGUgc3RyaW5nIG9mIHNlcmlhbGl6ZWQKKyAgICAgIDpjbGFzczpgZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90b2AuCisgICAgZGVwZW5kZW5jaWVzIChsaXN0W0ZpbGVEZXNjcmlwdG9yXSk6IExpc3Qgb2Ygb3RoZXIgOmNsYXNzOmBGaWxlRGVzY3JpcHRvcmAKKyAgICAgIG9iamVjdHMgdGhpcyA6Y2xhc3M6YEZpbGVEZXNjcmlwdG9yYCBkZXBlbmRzIG9uLgorICAgIHB1YmxpY19kZXBlbmRlbmNpZXMgKGxpc3RbRmlsZURlc2NyaXB0b3JdKTogQSBzdWJzZXQgb2YKKyAgICAgIDphdHRyOmBkZXBlbmRlbmNpZXNgLCB3aGljaCB3ZXJlIGRlY2xhcmVkIGFzICJwdWJsaWMiLgorICAgIG1lc3NhZ2VfdHlwZXNfYnlfbmFtZSAoZGljdChzdHIsIERlc2NyaXB0b3IpKTogTWFwcGluZyBmcm9tIG1lc3NhZ2UgbmFtZXMKKyAgICAgIHRvIHRoZWlyIDpjbGFzczpgRGVzY3JpcHRvcmAuCisgICAgZW51bV90eXBlc19ieV9uYW1lIChkaWN0KHN0ciwgRW51bURlc2NyaXB0b3IpKTogTWFwcGluZyBmcm9tIGVudW0gbmFtZXMgdG8KKyAgICAgIHRoZWlyIDpjbGFzczpgRW51bURlc2NyaXB0b3JgLgorICAgIGV4dGVuc2lvbnNfYnlfbmFtZSAoZGljdChzdHIsIEZpZWxkRGVzY3JpcHRvcikpOiBNYXBwaW5nIGZyb20gZXh0ZW5zaW9uCisgICAgICBuYW1lcyBkZWNsYXJlZCBhdCBmaWxlIHNjb3BlIHRvIHRoZWlyIDpjbGFzczpgRmllbGREZXNjcmlwdG9yYC4KKyAgICBzZXJ2aWNlc19ieV9uYW1lIChkaWN0KHN0ciwgU2VydmljZURlc2NyaXB0b3IpKTogTWFwcGluZyBmcm9tIHNlcnZpY2VzJworICAgICAgbmFtZXMgdG8gdGhlaXIgOmNsYXNzOmBTZXJ2aWNlRGVzY3JpcHRvcmAuCisgICAgcG9vbCAoRGVzY3JpcHRvclBvb2wpOiBUaGUgcG9vbCB0aGlzIGRlc2NyaXB0b3IgYmVsb25ncyB0by4gIFdoZW4gbm90CisgICAgICBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCB0aGUgZ2xvYmFsIGRlZmF1bHQgcG9vbCBpcyB1c2VkLgorICAiIiIKKworICBpZiBfVVNFX0NfREVTQ1JJUFRPUlM6CisgICAgX0NfREVTQ1JJUFRPUl9DTEFTUyA9IF9tZXNzYWdlLkZpbGVEZXNjcmlwdG9yCisKKyAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHBhY2thZ2UsIG9wdGlvbnM9Tm9uZSwKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgc2VyaWFsaXplZF9wYj1Ob25lLAorICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcz1Ob25lLCBwdWJsaWNfZGVwZW5kZW5jaWVzPU5vbmUsCisgICAgICAgICAgICAgICAgc3ludGF4PU5vbmUsIHBvb2w9Tm9uZSwgY3JlYXRlX2tleT1Ob25lKToKKyAgICAgICMgRmlsZURlc2NyaXB0b3IoKSBpcyBjYWxsZWQgZnJvbSB2YXJpb3VzIHBsYWNlcywgbm90IG9ubHkgZnJvbSBnZW5lcmF0ZWQKKyAgICAgICMgZmlsZXMsIHRvIHJlZ2lzdGVyIGR5bmFtaWMgcHJvdG8gZmlsZXMgYW5kIG1lc3NhZ2VzLgorICAgICAgIyBweWxpbnQ6IGRpc2FibGU9Zy1leHBsaWNpdC1ib29sLWNvbXBhcmlzb24KKyAgICAgIGlmIHNlcmlhbGl6ZWRfcGIgPT0gYicnOgorICAgICAgICAjIENwcCBnZW5lcmF0ZWQgY29kZSBtdXN0IGJlIGxpbmtlZCBpbiBpZiBzZXJpYWxpemVkX3BiIGlzICcnCisgICAgICAgIHRyeToKKyAgICAgICAgICByZXR1cm4gX21lc3NhZ2UuZGVmYXVsdF9wb29sLkZpbmRGaWxlQnlOYW1lKG5hbWUpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ1BsZWFzZSBsaW5rIGluIGNwcCBnZW5lcmF0ZWQgbGliIGZvciAlcycgJSAobmFtZSkpCisgICAgICBlbGlmIHNlcmlhbGl6ZWRfcGI6CisgICAgICAgIHJldHVybiBfbWVzc2FnZS5kZWZhdWx0X3Bvb2wuQWRkU2VyaWFsaXplZEZpbGUoc2VyaWFsaXplZF9wYikKKyAgICAgIGVsc2U6CisgICAgICAgIHJldHVybiBzdXBlcihGaWxlRGVzY3JpcHRvciwgY2xzKS5fX25ld19fKGNscykKKworICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcGFja2FnZSwgb3B0aW9ucz1Ob25lLAorICAgICAgICAgICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIHNlcmlhbGl6ZWRfcGI9Tm9uZSwKKyAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcz1Ob25lLCBwdWJsaWNfZGVwZW5kZW5jaWVzPU5vbmUsCisgICAgICAgICAgICAgICBzeW50YXg9Tm9uZSwgcG9vbD1Ob25lLCBjcmVhdGVfa2V5PU5vbmUpOgorICAgICIiIkNvbnN0cnVjdG9yLiIiIgorICAgIGlmIGNyZWF0ZV9rZXkgaXMgbm90IF9pbnRlcm5hbF9jcmVhdGVfa2V5OgorICAgICAgX0RlcHJlY2F0ZWQoJ0ZpbGVEZXNjcmlwdG9yJykKKworICAgIHN1cGVyKEZpbGVEZXNjcmlwdG9yLCBzZWxmKS5fX2luaXRfXygKKyAgICAgICAgb3B0aW9ucywgc2VyaWFsaXplZF9vcHRpb25zLCAnRmlsZU9wdGlvbnMnKQorCisgICAgaWYgcG9vbCBpcyBOb25lOgorICAgICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbAorICAgICAgcG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZWZhdWx0KCkKKyAgICBzZWxmLnBvb2wgPSBwb29sCisgICAgc2VsZi5tZXNzYWdlX3R5cGVzX2J5X25hbWUgPSB7fQorICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICBzZWxmLnBhY2thZ2UgPSBwYWNrYWdlCisgICAgc2VsZi5zeW50YXggPSBzeW50YXggb3IgInByb3RvMiIKKyAgICBzZWxmLnNlcmlhbGl6ZWRfcGIgPSBzZXJpYWxpemVkX3BiCisKKyAgICBzZWxmLmVudW1fdHlwZXNfYnlfbmFtZSA9IHt9CisgICAgc2VsZi5leHRlbnNpb25zX2J5X25hbWUgPSB7fQorICAgIHNlbGYuc2VydmljZXNfYnlfbmFtZSA9IHt9CisgICAgc2VsZi5kZXBlbmRlbmNpZXMgPSAoZGVwZW5kZW5jaWVzIG9yIFtdKQorICAgIHNlbGYucHVibGljX2RlcGVuZGVuY2llcyA9IChwdWJsaWNfZGVwZW5kZW5jaWVzIG9yIFtdKQorCisgIGRlZiBDb3B5VG9Qcm90byhzZWxmLCBwcm90byk6CisgICAgIiIiQ29waWVzIHRoaXMgdG8gYSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLgorCisgICAgQXJnczoKKyAgICAgIHByb3RvOiBBbiBlbXB0eSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLgorICAgICIiIgorICAgIHByb3RvLlBhcnNlRnJvbVN0cmluZyhzZWxmLnNlcmlhbGl6ZWRfcGIpCisKKworZGVmIF9QYXJzZU9wdGlvbnMobWVzc2FnZSwgc3RyaW5nKToKKyAgIiIiUGFyc2VzIHNlcmlhbGl6ZWQgb3B0aW9ucy4KKworICBUaGlzIGhlbHBlciBmdW5jdGlvbiBpcyB1c2VkIHRvIHBhcnNlIHNlcmlhbGl6ZWQgb3B0aW9ucyBpbiBnZW5lcmF0ZWQKKyAgcHJvdG8yIGZpbGVzLiBJdCBtdXN0IG5vdCBiZSB1c2VkIG91dHNpZGUgcHJvdG8yLgorICAiIiIKKyAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoc3RyaW5nKQorICByZXR1cm4gbWVzc2FnZQorCisKK2RlZiBfVG9DYW1lbENhc2UobmFtZSk6CisgICIiIkNvbnZlcnRzIG5hbWUgdG8gY2FtZWwtY2FzZSBhbmQgcmV0dXJucyBpdC4iIiIKKyAgY2FwaXRhbGl6ZV9uZXh0ID0gRmFsc2UKKyAgcmVzdWx0ID0gW10KKworICBmb3IgYyBpbiBuYW1lOgorICAgIGlmIGMgPT0gJ18nOgorICAgICAgaWYgcmVzdWx0OgorICAgICAgICBjYXBpdGFsaXplX25leHQgPSBUcnVlCisgICAgZWxpZiBjYXBpdGFsaXplX25leHQ6CisgICAgICByZXN1bHQuYXBwZW5kKGMudXBwZXIoKSkKKyAgICAgIGNhcGl0YWxpemVfbmV4dCA9IEZhbHNlCisgICAgZWxzZToKKyAgICAgIHJlc3VsdCArPSBjCisKKyAgIyBMb3dlci1jYXNlIHRoZSBmaXJzdCBsZXR0ZXIuCisgIGlmIHJlc3VsdCBhbmQgcmVzdWx0WzBdLmlzdXBwZXIoKToKKyAgICByZXN1bHRbMF0gPSByZXN1bHRbMF0ubG93ZXIoKQorICByZXR1cm4gJycuam9pbihyZXN1bHQpCisKKworZGVmIF9PcHRpb25zT3JOb25lKGRlc2NyaXB0b3JfcHJvdG8pOgorICAiIiJSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgYG9wdGlvbnNgLCBvciBOb25lIGlmIGl0IGlzIG5vdCBzZXQuIiIiCisgIGlmIGRlc2NyaXB0b3JfcHJvdG8uSGFzRmllbGQoJ29wdGlvbnMnKToKKyAgICByZXR1cm4gZGVzY3JpcHRvcl9wcm90by5vcHRpb25zCisgIGVsc2U6CisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgX1RvSnNvbk5hbWUobmFtZSk6CisgICIiIkNvbnZlcnRzIG5hbWUgdG8gSnNvbiBuYW1lIGFuZCByZXR1cm5zIGl0LiIiIgorICBjYXBpdGFsaXplX25leHQgPSBGYWxzZQorICByZXN1bHQgPSBbXQorCisgIGZvciBjIGluIG5hbWU6CisgICAgaWYgYyA9PSAnXyc6CisgICAgICBjYXBpdGFsaXplX25leHQgPSBUcnVlCisgICAgZWxpZiBjYXBpdGFsaXplX25leHQ6CisgICAgICByZXN1bHQuYXBwZW5kKGMudXBwZXIoKSkKKyAgICAgIGNhcGl0YWxpemVfbmV4dCA9IEZhbHNlCisgICAgZWxzZToKKyAgICAgIHJlc3VsdCArPSBjCisKKyAgcmV0dXJuICcnLmpvaW4ocmVzdWx0KQorCisKK2RlZiBNYWtlRGVzY3JpcHRvcihkZXNjX3Byb3RvLCBwYWNrYWdlPScnLCBidWlsZF9maWxlX2lmX2NwcD1UcnVlLAorICAgICAgICAgICAgICAgICAgIHN5bnRheD1Ob25lKToKKyAgIiIiTWFrZSBhIHByb3RvYnVmIERlc2NyaXB0b3IgZ2l2ZW4gYSBEZXNjcmlwdG9yUHJvdG8gcHJvdG9idWYuCisKKyAgSGFuZGxlcyBuZXN0ZWQgZGVzY3JpcHRvcnMuIE5vdGUgdGhhdCB0aGlzIGlzIGxpbWl0ZWQgdG8gdGhlIHNjb3BlIG9mIGRlZmluaW5nCisgIGEgbWVzc2FnZSBpbnNpZGUgb2YgYW5vdGhlciBtZXNzYWdlLiBDb21wb3NpdGUgZmllbGRzIGNhbiBjdXJyZW50bHkgb25seSBiZQorICByZXNvbHZlZCBpZiB0aGUgbWVzc2FnZSBpcyBkZWZpbmVkIGluIHRoZSBzYW1lIHNjb3BlIGFzIHRoZSBmaWVsZC4KKworICBBcmdzOgorICAgIGRlc2NfcHJvdG86IFRoZSBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8gcHJvdG9idWYgbWVzc2FnZS4KKyAgICBwYWNrYWdlOiBPcHRpb25hbCBwYWNrYWdlIG5hbWUgZm9yIHRoZSBuZXcgbWVzc2FnZSBEZXNjcmlwdG9yIChzdHJpbmcpLgorICAgIGJ1aWxkX2ZpbGVfaWZfY3BwOiBVcGRhdGUgdGhlIEMrKyBkZXNjcmlwdG9yIHBvb2wgaWYgYXBpIG1hdGNoZXMuCisgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byBGYWxzZSBvbiByZWN1cnNpb24sIHNvIG5vIGR1cGxpY2F0ZXMgYXJlIGNyZWF0ZWQuCisgICAgc3ludGF4OiBUaGUgc3ludGF4L3NlbWFudGljcyB0aGF0IHNob3VsZCBiZSB1c2VkLiAgU2V0IHRvICJwcm90bzMiIHRvIGdldAorICAgICAgICAgICAgcHJvdG8zIGZpZWxkIHByZXNlbmNlIHNlbWFudGljcy4KKyAgUmV0dXJuczoKKyAgICBBIERlc2NyaXB0b3IgZm9yIHByb3RvYnVmIG1lc3NhZ2VzLgorICAiIiIKKyAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAncHl0aG9uJyBhbmQgYnVpbGRfZmlsZV9pZl9jcHA6CisgICAgIyBUaGUgQysrIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIGFsbCBkZXNjcmlwdG9ycyB0byBiZSBiYWNrZWQgYnkgdGhlIHNhbWUKKyAgICAjIGRlZmluaXRpb24gaW4gdGhlIEMrKyBkZXNjcmlwdG9yIHBvb2wuIFRvIGRvIHRoaXMsIHdlIGJ1aWxkIGEKKyAgICAjIEZpbGVEZXNjcmlwdG9yUHJvdG8gd2l0aCB0aGUgc2FtZSBkZWZpbml0aW9uIGFzIHRoaXMgZGVzY3JpcHRvciBhbmQgYnVpbGQKKyAgICAjIGl0IGludG8gdGhlIHBvb2wuCisgICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcGIyCisgICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bygpCisgICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLm1lc3NhZ2VfdHlwZS5hZGQoKS5NZXJnZUZyb20oZGVzY19wcm90bykKKworICAgICMgR2VuZXJhdGUgYSByYW5kb20gbmFtZSBmb3IgdGhpcyBwcm90byBmaWxlIHRvIHByZXZlbnQgY29uZmxpY3RzIHdpdGggYW55CisgICAgIyBpbXBvcnRlZCBvbmVzLiBXZSBuZWVkIHRvIHNwZWNpZnkgYSBmaWxlIG5hbWUgc28gdGhlIGRlc2NyaXB0b3IgcG9vbAorICAgICMgYWNjZXB0cyBvdXIgRmlsZURlc2NyaXB0b3JQcm90bywgYnV0IGl0IGlzIG5vdCBpbXBvcnRhbnQgd2hhdCB0aGF0IGZpbGUKKyAgICAjIG5hbWUgaXMgYWN0dWFsbHkgc2V0IHRvLgorICAgIHByb3RvX25hbWUgPSBiaW5hc2NpaS5oZXhsaWZ5KG9zLnVyYW5kb20oMTYpKS5kZWNvZGUoJ2FzY2lpJykKKworICAgIGlmIHBhY2thZ2U6CisgICAgICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8ubmFtZSA9IG9zLnBhdGguam9pbihwYWNrYWdlLnJlcGxhY2UoJy4nLCAnLycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9fbmFtZSArICcucHJvdG8nKQorICAgICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLnBhY2thZ2UgPSBwYWNrYWdlCisgICAgZWxzZToKKyAgICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90by5uYW1lID0gcHJvdG9fbmFtZSArICcucHJvdG8nCisKKyAgICBfbWVzc2FnZS5kZWZhdWx0X3Bvb2wuQWRkKGZpbGVfZGVzY3JpcHRvcl9wcm90bykKKyAgICByZXN1bHQgPSBfbWVzc2FnZS5kZWZhdWx0X3Bvb2wuRmluZEZpbGVCeU5hbWUoZmlsZV9kZXNjcmlwdG9yX3Byb3RvLm5hbWUpCisKKyAgICBpZiBfVVNFX0NfREVTQ1JJUFRPUlM6CisgICAgICByZXR1cm4gcmVzdWx0Lm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVtkZXNjX3Byb3RvLm5hbWVdCisKKyAgZnVsbF9tZXNzYWdlX25hbWUgPSBbZGVzY19wcm90by5uYW1lXQorICBpZiBwYWNrYWdlOiBmdWxsX21lc3NhZ2VfbmFtZS5pbnNlcnQoMCwgcGFja2FnZSkKKworICAjIENyZWF0ZSBEZXNjcmlwdG9ycyBmb3IgZW51bSB0eXBlcworICBlbnVtX3R5cGVzID0ge30KKyAgZm9yIGVudW1fcHJvdG8gaW4gZGVzY19wcm90by5lbnVtX3R5cGU6CisgICAgZnVsbF9uYW1lID0gJy4nLmpvaW4oZnVsbF9tZXNzYWdlX25hbWUgKyBbZW51bV9wcm90by5uYW1lXSkKKyAgICBlbnVtX2Rlc2MgPSBFbnVtRGVzY3JpcHRvcigKKyAgICAgICAgZW51bV9wcm90by5uYW1lLCBmdWxsX25hbWUsIE5vbmUsIFsKKyAgICAgICAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3IoZW51bV92YWwubmFtZSwgaWksIGVudW1fdmFsLm51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlX2tleT1faW50ZXJuYWxfY3JlYXRlX2tleSkKKyAgICAgICAgICAgIGZvciBpaSwgZW51bV92YWwgaW4gZW51bWVyYXRlKGVudW1fcHJvdG8udmFsdWUpXSwKKyAgICAgICAgY3JlYXRlX2tleT1faW50ZXJuYWxfY3JlYXRlX2tleSkKKyAgICBlbnVtX3R5cGVzW2Z1bGxfbmFtZV0gPSBlbnVtX2Rlc2MKKworICAjIENyZWF0ZSBEZXNjcmlwdG9ycyBmb3IgbmVzdGVkIHR5cGVzCisgIG5lc3RlZF90eXBlcyA9IHt9CisgIGZvciBuZXN0ZWRfcHJvdG8gaW4gZGVzY19wcm90by5uZXN0ZWRfdHlwZToKKyAgICBmdWxsX25hbWUgPSAnLicuam9pbihmdWxsX21lc3NhZ2VfbmFtZSArIFtuZXN0ZWRfcHJvdG8ubmFtZV0pCisgICAgIyBOZXN0ZWQgdHlwZXMgYXJlIGp1c3QgdGhvc2UgZGVmaW5lZCBpbnNpZGUgb2YgdGhlIG1lc3NhZ2UsIG5vdCBhbGwgdHlwZXMKKyAgICAjIHVzZWQgYnkgZmllbGRzIGluIHRoZSBtZXNzYWdlLCBzbyBubyBsb29wcyBhcmUgcG9zc2libGUgaGVyZS4KKyAgICBuZXN0ZWRfZGVzYyA9IE1ha2VEZXNjcmlwdG9yKG5lc3RlZF9wcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2U9Jy4nLmpvaW4oZnVsbF9tZXNzYWdlX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfZmlsZV9pZl9jcHA9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXg9c3ludGF4KQorICAgIG5lc3RlZF90eXBlc1tmdWxsX25hbWVdID0gbmVzdGVkX2Rlc2MKKworICBmaWVsZHMgPSBbXQorICBmb3IgZmllbGRfcHJvdG8gaW4gZGVzY19wcm90by5maWVsZDoKKyAgICBmdWxsX25hbWUgPSAnLicuam9pbihmdWxsX21lc3NhZ2VfbmFtZSArIFtmaWVsZF9wcm90by5uYW1lXSkKKyAgICBlbnVtX2Rlc2MgPSBOb25lCisgICAgbmVzdGVkX2Rlc2MgPSBOb25lCisgICAgaWYgZmllbGRfcHJvdG8uanNvbl9uYW1lOgorICAgICAganNvbl9uYW1lID0gZmllbGRfcHJvdG8uanNvbl9uYW1lCisgICAgZWxzZToKKyAgICAgIGpzb25fbmFtZSA9IE5vbmUKKyAgICBpZiBmaWVsZF9wcm90by5IYXNGaWVsZCgndHlwZV9uYW1lJyk6CisgICAgICB0eXBlX25hbWUgPSBmaWVsZF9wcm90by50eXBlX25hbWUKKyAgICAgIGZ1bGxfdHlwZV9uYW1lID0gJy4nLmpvaW4oZnVsbF9tZXNzYWdlX25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV9uYW1lW3R5cGVfbmFtZS5yZmluZCgnLicpKzE6XV0pCisgICAgICBpZiBmdWxsX3R5cGVfbmFtZSBpbiBuZXN0ZWRfdHlwZXM6CisgICAgICAgIG5lc3RlZF9kZXNjID0gbmVzdGVkX3R5cGVzW2Z1bGxfdHlwZV9uYW1lXQorICAgICAgZWxpZiBmdWxsX3R5cGVfbmFtZSBpbiBlbnVtX3R5cGVzOgorICAgICAgICBlbnVtX2Rlc2MgPSBlbnVtX3R5cGVzW2Z1bGxfdHlwZV9uYW1lXQorICAgICAgIyBFbHNlIHR5cGVfbmFtZSByZWZlcmVuY2VzIGEgbm9uLWxvY2FsIHR5cGUsIHdoaWNoIGlzbid0IGltcGxlbWVudGVkCisgICAgZmllbGQgPSBGaWVsZERlc2NyaXB0b3IoCisgICAgICAgIGZpZWxkX3Byb3RvLm5hbWUsIGZ1bGxfbmFtZSwgZmllbGRfcHJvdG8ubnVtYmVyIC0gMSwKKyAgICAgICAgZmllbGRfcHJvdG8ubnVtYmVyLCBmaWVsZF9wcm90by50eXBlLAorICAgICAgICBGaWVsZERlc2NyaXB0b3IuUHJvdG9UeXBlVG9DcHBQcm90b1R5cGUoZmllbGRfcHJvdG8udHlwZSksCisgICAgICAgIGZpZWxkX3Byb3RvLmxhYmVsLCBOb25lLCBuZXN0ZWRfZGVzYywgZW51bV9kZXNjLCBOb25lLCBGYWxzZSwgTm9uZSwKKyAgICAgICAgb3B0aW9ucz1fT3B0aW9uc09yTm9uZShmaWVsZF9wcm90byksIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgICBqc29uX25hbWU9anNvbl9uYW1lLCBjcmVhdGVfa2V5PV9pbnRlcm5hbF9jcmVhdGVfa2V5KQorICAgIGZpZWxkcy5hcHBlbmQoZmllbGQpCisKKyAgZGVzY19uYW1lID0gJy4nLmpvaW4oZnVsbF9tZXNzYWdlX25hbWUpCisgIHJldHVybiBEZXNjcmlwdG9yKGRlc2NfcHJvdG8ubmFtZSwgZGVzY19uYW1lLCBOb25lLCBOb25lLCBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgIGxpc3QobmVzdGVkX3R5cGVzLnZhbHVlcygpKSwgbGlzdChlbnVtX3R5cGVzLnZhbHVlcygpKSwgW10sCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9X09wdGlvbnNPck5vbmUoZGVzY19wcm90byksCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9rZXk9X2ludGVybmFsX2NyZWF0ZV9rZXkpCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczZWRkYwotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5weQpAQCAtMCwwICsxLDE3NyBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJQcm92aWRlcyBhIGNvbnRhaW5lciBmb3IgRGVzY3JpcHRvclByb3Rvcy4iIiIKKworX19hdXRob3JfXyA9ICdtYXR0aGV3dG9pYUBnb29nbGUuY29tIChNYXR0IFRvaWEpJworCitpbXBvcnQgd2FybmluZ3MKKworCitjbGFzcyBFcnJvcihFeGNlcHRpb24pOgorICBwYXNzCisKKworY2xhc3MgRGVzY3JpcHRvckRhdGFiYXNlQ29uZmxpY3RpbmdEZWZpbml0aW9uRXJyb3IoRXJyb3IpOgorICAiIiJSYWlzZWQgd2hlbiBhIHByb3RvIGlzIGFkZGVkIHdpdGggdGhlIHNhbWUgbmFtZSAmIGRpZmZlcmVudCBkZXNjcmlwdG9yLiIiIgorCisKK2NsYXNzIERlc2NyaXB0b3JEYXRhYmFzZShvYmplY3QpOgorICAiIiJBIGNvbnRhaW5lciBhY2NlcHRpbmcgRmlsZURlc2NyaXB0b3JQcm90b3MgYW5kIG1hcHMgRGVzY3JpcHRvclByb3Rvcy4iIiIKKworICBkZWYgX19pbml0X18oc2VsZik6CisgICAgc2VsZi5fZmlsZV9kZXNjX3Byb3Rvc19ieV9maWxlID0ge30KKyAgICBzZWxmLl9maWxlX2Rlc2NfcHJvdG9zX2J5X3N5bWJvbCA9IHt9CisKKyAgZGVmIEFkZChzZWxmLCBmaWxlX2Rlc2NfcHJvdG8pOgorICAgICIiIkFkZHMgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gYW5kIGl0cyB0eXBlcyB0byB0aGlzIGRhdGFiYXNlLgorCisgICAgQXJnczoKKyAgICAgIGZpbGVfZGVzY19wcm90bzogVGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gYWRkLgorICAgIFJhaXNlczoKKyAgICAgIERlc2NyaXB0b3JEYXRhYmFzZUNvbmZsaWN0aW5nRGVmaW5pdGlvbkVycm9yOiBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8KKyAgICAgICAgYWRkIGEgcHJvdG8gd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgZGVmaW5pdGlvbiB0aGFuIGFuCisgICAgICAgIGV4aXN0aW5nIHByb3RvIGluIHRoZSBkYXRhYmFzZS4KKyAgICAiIiIKKyAgICBwcm90b19uYW1lID0gZmlsZV9kZXNjX3Byb3RvLm5hbWUKKyAgICBpZiBwcm90b19uYW1lIG5vdCBpbiBzZWxmLl9maWxlX2Rlc2NfcHJvdG9zX2J5X2ZpbGU6CisgICAgICBzZWxmLl9maWxlX2Rlc2NfcHJvdG9zX2J5X2ZpbGVbcHJvdG9fbmFtZV0gPSBmaWxlX2Rlc2NfcHJvdG8KKyAgICBlbGlmIHNlbGYuX2ZpbGVfZGVzY19wcm90b3NfYnlfZmlsZVtwcm90b19uYW1lXSAhPSBmaWxlX2Rlc2NfcHJvdG86CisgICAgICByYWlzZSBEZXNjcmlwdG9yRGF0YWJhc2VDb25mbGljdGluZ0RlZmluaXRpb25FcnJvcigKKyAgICAgICAgICAnJXMgYWxyZWFkeSBhZGRlZCwgYnV0IHdpdGggZGlmZmVyZW50IGRlc2NyaXB0b3IuJyAlIHByb3RvX25hbWUpCisgICAgZWxzZToKKyAgICAgIHJldHVybgorCisgICAgIyBBZGQgYWxsIHRoZSB0b3AtbGV2ZWwgZGVzY3JpcHRvcnMgdG8gdGhlIGluZGV4LgorICAgIHBhY2thZ2UgPSBmaWxlX2Rlc2NfcHJvdG8ucGFja2FnZQorICAgIGZvciBtZXNzYWdlIGluIGZpbGVfZGVzY19wcm90by5tZXNzYWdlX3R5cGU6CisgICAgICBmb3IgbmFtZSBpbiBfRXh0cmFjdFN5bWJvbHMobWVzc2FnZSwgcGFja2FnZSk6CisgICAgICAgIHNlbGYuX0FkZFN5bWJvbChuYW1lLCBmaWxlX2Rlc2NfcHJvdG8pCisgICAgZm9yIGVudW0gaW4gZmlsZV9kZXNjX3Byb3RvLmVudW1fdHlwZToKKyAgICAgIHNlbGYuX0FkZFN5bWJvbCgoJy4nLmpvaW4oKHBhY2thZ2UsIGVudW0ubmFtZSkpKSwgZmlsZV9kZXNjX3Byb3RvKQorICAgICAgZm9yIGVudW1fdmFsdWUgaW4gZW51bS52YWx1ZToKKyAgICAgICAgc2VsZi5fZmlsZV9kZXNjX3Byb3Rvc19ieV9zeW1ib2xbCisgICAgICAgICAgICAnLicuam9pbigocGFja2FnZSwgZW51bV92YWx1ZS5uYW1lKSldID0gZmlsZV9kZXNjX3Byb3RvCisgICAgZm9yIGV4dGVuc2lvbiBpbiBmaWxlX2Rlc2NfcHJvdG8uZXh0ZW5zaW9uOgorICAgICAgc2VsZi5fQWRkU3ltYm9sKCgnLicuam9pbigocGFja2FnZSwgZXh0ZW5zaW9uLm5hbWUpKSksIGZpbGVfZGVzY19wcm90bykKKyAgICBmb3Igc2VydmljZSBpbiBmaWxlX2Rlc2NfcHJvdG8uc2VydmljZToKKyAgICAgIHNlbGYuX0FkZFN5bWJvbCgoJy4nLmpvaW4oKHBhY2thZ2UsIHNlcnZpY2UubmFtZSkpKSwgZmlsZV9kZXNjX3Byb3RvKQorCisgIGRlZiBGaW5kRmlsZUJ5TmFtZShzZWxmLCBuYW1lKToKKyAgICAiIiJGaW5kcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHByb3RvIGJ5IGZpbGUgbmFtZS4KKworICAgIFR5cGljYWxseSB0aGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCBlbmRpbmcgdG8gYSAucHJvdG8gZmlsZS4gVGhlCisgICAgcHJvdG8gd2l0aCB0aGUgZ2l2ZW4gbmFtZSB3aWxsIGhhdmUgdG8gaGF2ZSBiZWVuIGFkZGVkIHRvIHRoaXMgZGF0YWJhc2UKKyAgICB1c2luZyB0aGUgQWRkIG1ldGhvZCBvciBlbHNlIGFuIGVycm9yIHdpbGwgYmUgcmFpc2VkLgorCisgICAgQXJnczoKKyAgICAgIG5hbWU6IFRoZSBmaWxlIG5hbWUgdG8gZmluZC4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHByb3RvIG1hdGNoaW5nIHRoZSBuYW1lLgorCisgICAgUmFpc2VzOgorICAgICAgS2V5RXJyb3IgaWYgbm8gZmlsZSBieSB0aGUgZ2l2ZW4gbmFtZSB3YXMgYWRkZWQuCisgICAgIiIiCisKKyAgICByZXR1cm4gc2VsZi5fZmlsZV9kZXNjX3Byb3Rvc19ieV9maWxlW25hbWVdCisKKyAgZGVmIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzZWxmLCBzeW1ib2wpOgorICAgICIiIkZpbmRzIHRoZSBmaWxlIGRlc2NyaXB0b3IgcHJvdG8gY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIHN5bWJvbC4KKworICAgIFRoZSBzeW1ib2wgc2hvdWxkIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgaW5jbHVkaW5nIHRoZSBmaWxlIGRlc2NyaXB0b3IncworICAgIHBhY2thZ2UgYW5kIGFueSBjb250YWluaW5nIG1lc3NhZ2VzLiBTb21lIGV4YW1wbGVzOgorCisgICAgJ3NvbWUucGFja2FnZS5uYW1lLk1lc3NhZ2UnCisgICAgJ3NvbWUucGFja2FnZS5uYW1lLk1lc3NhZ2UuTmVzdGVkRW51bScKKyAgICAnc29tZS5wYWNrYWdlLm5hbWUuTWVzc2FnZS5zb21lX2ZpZWxkJworCisgICAgVGhlIGZpbGUgZGVzY3JpcHRvciBwcm90byBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgc3ltYm9sIG11c3QgYmUgYWRkZWQgdG8KKyAgICB0aGlzIGRhdGFiYXNlIHVzaW5nIHRoZSBBZGQgbWV0aG9kIG9yIGVsc2UgYW4gZXJyb3Igd2lsbCBiZSByYWlzZWQuCisKKyAgICBBcmdzOgorICAgICAgc3ltYm9sOiBUaGUgZnVsbHkgcXVhbGlmaWVkIHN5bWJvbCBuYW1lLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgcHJvdG8gY29udGFpbmluZyB0aGUgc3ltYm9sLgorCisgICAgUmFpc2VzOgorICAgICAgS2V5RXJyb3IgaWYgbm8gZmlsZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN5bWJvbC4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICByZXR1cm4gc2VsZi5fZmlsZV9kZXNjX3Byb3Rvc19ieV9zeW1ib2xbc3ltYm9sXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICMgRmllbGRzLCBlbnVtIHZhbHVlcywgYW5kIG5lc3RlZCBleHRlbnNpb25zIGFyZSBub3QgaW4KKyAgICAgICMgX2ZpbGVfZGVzY19wcm90b3NfYnlfc3ltYm9sLiBUcnkgdG8gZmluZCB0aGUgdG9wIGxldmVsCisgICAgICAjIGRlc2NyaXB0b3IuIE5vbi1leGlzdGVudCBuZXN0ZWQgc3ltYm9sIHVuZGVyIGEgdmFsaWQgdG9wIGxldmVsCisgICAgICAjIGRlc2NyaXB0b3IgY2FuIGFsc28gYmUgZm91bmQuIFRoZSBiZWhhdmlvciBpcyB0aGUgc2FtZSB3aXRoCisgICAgICAjIHByb3RvYnVmIEMrKy4KKyAgICAgIHRvcF9sZXZlbCwgXywgXyA9IHN5bWJvbC5ycGFydGl0aW9uKCcuJykKKyAgICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVfZGVzY19wcm90b3NfYnlfc3ltYm9sW3RvcF9sZXZlbF0KKyAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgIyBSYWlzZSB0aGUgb3JpZ2luYWwgc3ltYm9sIGFzIGEgS2V5RXJyb3IgZm9yIGJldHRlciBkaWFnbm9zdGljcy4KKyAgICAgICAgcmFpc2UgS2V5RXJyb3Ioc3ltYm9sKQorCisgIGRlZiBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oc2VsZiwgZXh0ZW5kZWVfbmFtZSwgZXh0ZW5zaW9uX251bWJlcik6CisgICAgIyBUT0RPKGppZWx1byk6IGltcGxlbWVudCB0aGlzIEFQSS4KKyAgICByZXR1cm4gTm9uZQorCisgIGRlZiBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhzZWxmLCBleHRlbmRlZV9uYW1lKToKKyAgICAjIFRPRE8oamllbHVvKTogaW1wbGVtZW50IHRoaXMgQVBJLgorICAgIHJldHVybiBbXQorCisgIGRlZiBfQWRkU3ltYm9sKHNlbGYsIG5hbWUsIGZpbGVfZGVzY19wcm90byk6CisgICAgaWYgbmFtZSBpbiBzZWxmLl9maWxlX2Rlc2NfcHJvdG9zX2J5X3N5bWJvbDoKKyAgICAgIHdhcm5fbXNnID0gKCdDb25mbGljdCByZWdpc3RlciBmb3IgZmlsZSAiJyArIGZpbGVfZGVzY19wcm90by5uYW1lICsKKyAgICAgICAgICAgICAgICAgICciOiAnICsgbmFtZSArCisgICAgICAgICAgICAgICAgICAnIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBmaWxlICInICsKKyAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVfZGVzY19wcm90b3NfYnlfc3ltYm9sW25hbWVdLm5hbWUgKyAnIicpCisgICAgICB3YXJuaW5ncy53YXJuKHdhcm5fbXNnLCBSdW50aW1lV2FybmluZykKKyAgICBzZWxmLl9maWxlX2Rlc2NfcHJvdG9zX2J5X3N5bWJvbFtuYW1lXSA9IGZpbGVfZGVzY19wcm90bworCisKK2RlZiBfRXh0cmFjdFN5bWJvbHMoZGVzY19wcm90bywgcGFja2FnZSk6CisgICIiIlB1bGxzIG91dCBhbGwgdGhlIHN5bWJvbHMgZnJvbSBhIGRlc2NyaXB0b3IgcHJvdG8uCisKKyAgQXJnczoKKyAgICBkZXNjX3Byb3RvOiBUaGUgcHJvdG8gdG8gZXh0cmFjdCBzeW1ib2xzIGZyb20uCisgICAgcGFja2FnZTogVGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZGVzY3JpcHRvciB0eXBlLgorCisgIFlpZWxkczoKKyAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm91bmQgaW4gdGhlIGRlc2NyaXB0b3IuCisgICIiIgorICBtZXNzYWdlX25hbWUgPSBwYWNrYWdlICsgJy4nICsgZGVzY19wcm90by5uYW1lIGlmIHBhY2thZ2UgZWxzZSBkZXNjX3Byb3RvLm5hbWUKKyAgeWllbGQgbWVzc2FnZV9uYW1lCisgIGZvciBuZXN0ZWRfdHlwZSBpbiBkZXNjX3Byb3RvLm5lc3RlZF90eXBlOgorICAgIGZvciBzeW1ib2wgaW4gX0V4dHJhY3RTeW1ib2xzKG5lc3RlZF90eXBlLCBtZXNzYWdlX25hbWUpOgorICAgICAgeWllbGQgc3ltYm9sCisgIGZvciBlbnVtX3R5cGUgaW4gZGVzY19wcm90by5lbnVtX3R5cGU6CisgICAgeWllbGQgJy4nLmpvaW4oKG1lc3NhZ2VfbmFtZSwgZW51bV90eXBlLm5hbWUpKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3BiMi5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9wYjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJkMDVlNwotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9wYjIucHkKQEAgLTAsMCArMSwyMTEzIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorIyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvCisiIiJHZW5lcmF0ZWQgcHJvdG9jb2wgYnVmZmVyIGNvZGUuIiIiCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvciBhcyBfZGVzY3JpcHRvcgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UgYXMgX21lc3NhZ2UKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCByZWZsZWN0aW9uIGFzIF9yZWZsZWN0aW9uCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc3ltYm9sX2RhdGFiYXNlIGFzIF9zeW1ib2xfZGF0YWJhc2UKKyMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGltcG9ydHMpCisKK19zeW1fZGIgPSBfc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKQorCisKKworCitERVNDUklQVE9SID0gX2Rlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IoCisgIG5hbWU9J2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvJywKKyAgcGFja2FnZT0nZ29vZ2xlLnByb3RvYnVmJywKKyAgc3ludGF4PSdwcm90bzInLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgc2VyaWFsaXplZF9wYj1iJ1xuIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXHgxMlx4MGZnb29nbGUucHJvdG9idWZcIkdcblx4MTFceDQ2aWxlRGVzY3JpcHRvclNldFx4MTJceDMyXG5ceDA0XHg2NmlsZVx4MThceDAxIFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvXCJceGRiXHgwM1xuXHgxM1x4NDZpbGVEZXNjcmlwdG9yUHJvdG9ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMlx4MGZcblx4MDdwYWNrYWdlXHgxOFx4MDIgXHgwMShcdFx4MTJceDEyXG5cbmRlcGVuZGVuY3lceDE4XHgwMyBceDAzKFx0XHgxMlx4MTlcblx4MTFwdWJsaWNfZGVwZW5kZW5jeVx4MThcbiBceDAzKFx4MDVceDEyXHgxN1xuXHgwZndlYWtfZGVwZW5kZW5jeVx4MThceDBiIFx4MDMoXHgwNVx4MTJceDM2XG5ceDBjbWVzc2FnZV90eXBlXHgxOFx4MDQgXHgwMyhceDBiXHgzMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1x4MTJceDM3XG5cdGVudW1fdHlwZVx4MThceDA1IFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvXHgxMlx4Mzhcblx4MDdzZXJ2aWNlXHgxOFx4MDYgXHgwMyhceDBiXHgzMlwnLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvXHgxMlx4Mzhcblx0ZXh0ZW5zaW9uXHgxOFx4MDcgXHgwMyhceDBiXHgzMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvXHgxMi1cblx4MDdvcHRpb25zXHgxOFx4MDggXHgwMShceDBiXHgzMlx4MWMuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXHgxMlx4Mzlcblx4MTBzb3VyY2VfY29kZV9pbmZvXHgxOFx0IFx4MDEoXHgwYlx4MzJceDFmLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mb1x4MTJceDBlXG5ceDA2c3ludGF4XHgxOFx4MGMgXHgwMShcdFwiXHhhOVx4MDVcblx4MGZceDQ0XHg2NXNjcmlwdG9yUHJvdG9ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMlx4MzRcblx4MDVceDY2aWVsZFx4MThceDAyIFx4MDMoXHgwYlx4MzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1x4MTJceDM4XG5cdGV4dGVuc2lvblx4MThceDA2IFx4MDMoXHgwYlx4MzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1x4MTJceDM1XG5ceDBibmVzdGVkX3R5cGVceDE4XHgwMyBceDAzKFx4MGJceDMyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvXHgxMlx4Mzdcblx0ZW51bV90eXBlXHgxOFx4MDQgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9ceDEySFxuXHgwZlx4NjV4dGVuc2lvbl9yYW5nZVx4MThceDA1IFx4MDMoXHgwYlx4MzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VceDEyXHgzOVxuXG5vbmVvZl9kZWNsXHgxOFx4MDggXHgwMyhceDBiXHgzMiUuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvXHgxMlx4MzBcblx4MDdvcHRpb25zXHgxOFx4MDcgXHgwMShceDBiXHgzMlx4MWYuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zXHgxMlx4NDZcblx4MGVyZXNlcnZlZF9yYW5nZVx4MThcdCBceDAzKFx4MGJceDMyLi5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2VceDEyXHgxNVxuXHJyZXNlcnZlZF9uYW1lXHgxOFxuIFx4MDMoXHRceDFhXHg2NVxuXHgwZVx4NDV4dGVuc2lvblJhbmdlXHgxMlxyXG5ceDA1c3RhcnRceDE4XHgwMSBceDAxKFx4MDVceDEyXHgwYlxuXHgwM1x4NjVuZFx4MThceDAyIFx4MDEoXHgwNVx4MTJceDM3XG5ceDA3b3B0aW9uc1x4MThceDAzIFx4MDEoXHgwYlx4MzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNceDFhK1xuXHJSZXNlcnZlZFJhbmdlXHgxMlxyXG5ceDA1c3RhcnRceDE4XHgwMSBceDAxKFx4MDVceDEyXHgwYlxuXHgwM1x4NjVuZFx4MThceDAyIFx4MDEoXHgwNVwiZ1xuXHgxNVx4NDV4dGVuc2lvblJhbmdlT3B0aW9uc1x4MTJceDQzXG5ceDE0dW5pbnRlcnByZXRlZF9vcHRpb25ceDE4XHhlN1x4MDcgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24qXHRceDA4XHhlOFx4MDdceDEwXHg4MFx4ODBceDgwXHg4MFx4MDJcIlx4ZDVceDA1XG5ceDE0XHg0NmllbGREZXNjcmlwdG9yUHJvdG9ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMlx4MGVcblx4MDZudW1iZXJceDE4XHgwMyBceDAxKFx4MDVceDEyOlxuXHgwNWxhYmVsXHgxOFx4MDQgXHgwMShceDBlXHgzMisuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsXHgxMlx4Mzhcblx4MDR0eXBlXHgxOFx4MDUgXHgwMShceDBlXHgzMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVceDEyXHgxMVxuXHR0eXBlX25hbWVceDE4XHgwNiBceDAxKFx0XHgxMlx4MTBcblx4MDhceDY1eHRlbmRlZVx4MThceDAyIFx4MDEoXHRceDEyXHgxNVxuXHJkZWZhdWx0X3ZhbHVlXHgxOFx4MDcgXHgwMShcdFx4MTJceDEzXG5ceDBib25lb2ZfaW5kZXhceDE4XHQgXHgwMShceDA1XHgxMlx4MTFcblx0anNvbl9uYW1lXHgxOFxuIFx4MDEoXHRceDEyLlxuXHgwN29wdGlvbnNceDE4XHgwOCBceDAxKFx4MGJceDMyXHgxZC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zXHgxMlx4MTdcblx4MGZwcm90bzNfb3B0aW9uYWxceDE4XHgxMSBceDAxKFx4MDhcIlx4YjZceDAyXG5ceDA0VHlwZVx4MTJceDBmXG5ceDBiVFlQRV9ET1VCTEVceDEwXHgwMVx4MTJceDBlXG5cblRZUEVfRkxPQVRceDEwXHgwMlx4MTJceDBlXG5cblRZUEVfSU5UNjRceDEwXHgwM1x4MTJceDBmXG5ceDBiVFlQRV9VSU5UNjRceDEwXHgwNFx4MTJceDBlXG5cblRZUEVfSU5UMzJceDEwXHgwNVx4MTJceDEwXG5ceDBjVFlQRV9GSVhFRDY0XHgxMFx4MDZceDEyXHgxMFxuXHgwY1RZUEVfRklYRUQzMlx4MTBceDA3XHgxMlxyXG5cdFRZUEVfQk9PTFx4MTBceDA4XHgxMlx4MGZcblx4MGJUWVBFX1NUUklOR1x4MTBcdFx4MTJceDBlXG5cblRZUEVfR1JPVVBceDEwXG5ceDEyXHgxMFxuXHgwY1RZUEVfTUVTU0FHRVx4MTBceDBiXHgxMlx4MGVcblxuVFlQRV9CWVRFU1x4MTBceDBjXHgxMlx4MGZcblx4MGJUWVBFX1VJTlQzMlx4MTBcclx4MTJcclxuXHRUWVBFX0VOVU1ceDEwXHgwZVx4MTJceDExXG5cclRZUEVfU0ZJWEVEMzJceDEwXHgwZlx4MTJceDExXG5cclRZUEVfU0ZJWEVENjRceDEwXHgxMFx4MTJceDBmXG5ceDBiVFlQRV9TSU5UMzJceDEwXHgxMVx4MTJceDBmXG5ceDBiVFlQRV9TSU5UNjRceDEwXHgxMlwiQ1xuXHgwNUxhYmVsXHgxMlx4MTJcblx4MGVMQUJFTF9PUFRJT05BTFx4MTBceDAxXHgxMlx4MTJcblx4MGVMQUJFTF9SRVFVSVJFRFx4MTBceDAyXHgxMlx4MTJcblx4MGVMQUJFTF9SRVBFQVRFRFx4MTBceDAzXCJUXG5ceDE0T25lb2ZEZXNjcmlwdG9yUHJvdG9ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMi5cblx4MDdvcHRpb25zXHgxOFx4MDIgXHgwMShceDBiXHgzMlx4MWQuZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9uc1wiXHhhNFx4MDJcblx4MTNceDQ1bnVtRGVzY3JpcHRvclByb3RvXHgxMlx4MGNcblx4MDRuYW1lXHgxOFx4MDEgXHgwMShcdFx4MTJceDM4XG5ceDA1dmFsdWVceDE4XHgwMiBceDAzKFx4MGJceDMyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvXHgxMi1cblx4MDdvcHRpb25zXHgxOFx4MDMgXHgwMShceDBiXHgzMlx4MWMuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zXHgxMk5cblx4MGVyZXNlcnZlZF9yYW5nZVx4MThceDA0IFx4MDMoXHgwYlx4MzJceDM2Lmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlXHgxMlx4MTVcblxycmVzZXJ2ZWRfbmFtZVx4MThceDA1IFx4MDMoXHRceDFhL1xuXHgxMVx4NDVudW1SZXNlcnZlZFJhbmdlXHgxMlxyXG5ceDA1c3RhcnRceDE4XHgwMSBceDAxKFx4MDVceDEyXHgwYlxuXHgwM1x4NjVuZFx4MThceDAyIFx4MDEoXHgwNVwibFxuXHgxOFx4NDVudW1WYWx1ZURlc2NyaXB0b3JQcm90b1x4MTJceDBjXG5ceDA0bmFtZVx4MThceDAxIFx4MDEoXHRceDEyXHgwZVxuXHgwNm51bWJlclx4MThceDAyIFx4MDEoXHgwNVx4MTJceDMyXG5ceDA3b3B0aW9uc1x4MThceDAzIFx4MDEoXHgwYlx4MzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zXCJceDkwXHgwMVxuXHgxNlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMlx4MzZcblx4MDZtZXRob2RceDE4XHgwMiBceDAzKFx4MGJceDMyJi5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvXHgxMlx4MzBcblx4MDdvcHRpb25zXHgxOFx4MDMgXHgwMShceDBiXHgzMlx4MWYuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zXCJceGMxXHgwMVxuXHgxNU1ldGhvZERlc2NyaXB0b3JQcm90b1x4MTJceDBjXG5ceDA0bmFtZVx4MThceDAxIFx4MDEoXHRceDEyXHgxMlxuXG5pbnB1dF90eXBlXHgxOFx4MDIgXHgwMShcdFx4MTJceDEzXG5ceDBib3V0cHV0X3R5cGVceDE4XHgwMyBceDAxKFx0XHgxMi9cblx4MDdvcHRpb25zXHgxOFx4MDQgXHgwMShceDBiXHgzMlx4MWUuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNceDEyXHgxZlxuXHgxMFx4NjNsaWVudF9zdHJlYW1pbmdceDE4XHgwNSBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXHgxMlx4MWZcblx4MTBzZXJ2ZXJfc3RyZWFtaW5nXHgxOFx4MDYgXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVwiXHhhNVx4MDZcblx4MGJceDQ2aWxlT3B0aW9uc1x4MTJceDE0XG5ceDBjamF2YV9wYWNrYWdlXHgxOFx4MDEgXHgwMShcdFx4MTJceDFjXG5ceDE0amF2YV9vdXRlcl9jbGFzc25hbWVceDE4XHgwOCBceDAxKFx0XHgxMlwiXG5ceDEzamF2YV9tdWx0aXBsZV9maWxlc1x4MThcbiBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXHgxMilcblx4MWRqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaFx4MThceDE0IFx4MDEoXHgwOFx4NDJceDAyXHgxOFx4MDFceDEyJVxuXHgxNmphdmFfc3RyaW5nX2NoZWNrX3V0ZjhceDE4XHgxYiBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXHgxMlx4NDZcblx4MGNvcHRpbWl6ZV9mb3JceDE4XHQgXHgwMShceDBlXHgzMikuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZTpceDA1U1BFRURceDEyXHgxMlxuXG5nb19wYWNrYWdlXHgxOFx4MGIgXHgwMShcdFx4MTJcIlxuXHgxM1x4NjNceDYzX2dlbmVyaWNfc2VydmljZXNceDE4XHgxMCBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXHgxMiRcblx4MTVqYXZhX2dlbmVyaWNfc2VydmljZXNceDE4XHgxMSBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXHgxMlwiXG5ceDEzcHlfZ2VuZXJpY19zZXJ2aWNlc1x4MThceDEyIFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyI1xuXHgxNHBocF9nZW5lcmljX3NlcnZpY2VzXHgxOCogXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTJceDE5XG5cbmRlcHJlY2F0ZWRceDE4XHgxNyBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXHgxMlx4MWVcblx4MTBceDYzXHg2M19lbmFibGVfYXJlbmFzXHgxOFx4MWYgXHgwMShceDA4Olx4MDR0cnVlXHgxMlx4MTlcblx4MTFvYmpjX2NsYXNzX3ByZWZpeFx4MTgkIFx4MDEoXHRceDEyXHgxOFxuXHgxMFx4NjNzaGFycF9uYW1lc3BhY2VceDE4JSBceDAxKFx0XHgxMlx4MTRcblx4MGNzd2lmdF9wcmVmaXhceDE4XCcgXHgwMShcdFx4MTJceDE4XG5ceDEwcGhwX2NsYXNzX3ByZWZpeFx4MTgoIFx4MDEoXHRceDEyXHgxNVxuXHJwaHBfbmFtZXNwYWNlXHgxOCkgXHgwMShcdFx4MTJceDFlXG5ceDE2cGhwX21ldGFkYXRhX25hbWVzcGFjZVx4MTgsIFx4MDEoXHRceDEyXHgxNFxuXHgwY3J1YnlfcGFja2FnZVx4MTgtIFx4MDEoXHRceDEyXHg0M1xuXHgxNHVuaW50ZXJwcmV0ZWRfb3B0aW9uXHgxOFx4ZTdceDA3IFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uXCI6XG5ceDBjT3B0aW1pemVNb2RlXHgxMlx0XG5ceDA1U1BFRURceDEwXHgwMVx4MTJcclxuXHRDT0RFX1NJWkVceDEwXHgwMlx4MTJceDEwXG5ceDBjTElURV9SVU5USU1FXHgxMFx4MDMqXHRceDA4XHhlOFx4MDdceDEwXHg4MFx4ODBceDgwXHg4MFx4MDJKXHgwNFx4MDgmXHgxMFwnXCJceDg0XHgwMlxuXHgwZU1lc3NhZ2VPcHRpb25zXHgxMiZcblx4MTdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdFx4MThceDAxIFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyLlxuXHgxZm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JceDE4XHgwMiBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXHgxMlx4MTlcblxuZGVwcmVjYXRlZFx4MThceDAzIFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyXHgxMVxuXHRtYXBfZW50cnlceDE4XHgwNyBceDAxKFx4MDhceDEyXHg0M1xuXHgxNHVuaW50ZXJwcmV0ZWRfb3B0aW9uXHgxOFx4ZTdceDA3IFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKlx0XHgwOFx4ZThceDA3XHgxMFx4ODBceDgwXHg4MFx4ODBceDAySlx4MDRceDA4XHgwNFx4MTBceDA1Slx4MDRceDA4XHgwNVx4MTBceDA2Slx4MDRceDA4XHgwNlx4MTBceDA3Slx4MDRceDA4XHgwOFx4MTBcdEpceDA0XHgwOFx0XHgxMFxuXCJceGJlXHgwM1xuXHgwY1x4NDZpZWxkT3B0aW9uc1x4MTI6XG5ceDA1XHg2M3R5cGVceDE4XHgwMSBceDAxKFx4MGVceDMyIy5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlOlx4MDZTVFJJTkdceDEyXHgwZVxuXHgwNnBhY2tlZFx4MThceDAyIFx4MDEoXHgwOFx4MTI/XG5ceDA2anN0eXBlXHgxOFx4MDYgXHgwMShceDBlXHgzMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6XHRKU19OT1JNQUxceDEyXHgxM1xuXHgwNGxhenlceDE4XHgwNSBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXHgxMlx4MWVcblx4MGZ1bnZlcmlmaWVkX2xhenlceDE4XHgwZiBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXHgxMlx4MTlcblxuZGVwcmVjYXRlZFx4MThceDAzIFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyXHgxM1xuXHgwNHdlYWtceDE4XG4gXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTJceDQzXG5ceDE0dW5pbnRlcnByZXRlZF9vcHRpb25ceDE4XHhlN1x4MDcgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25cIi9cblx4MDVceDQzVHlwZVx4MTJcblxuXHgwNlNUUklOR1x4MTBceDAwXHgxMlx4MDhcblx4MDRceDQzT1JEXHgxMFx4MDFceDEyXHgxMFxuXHgwY1NUUklOR19QSUVDRVx4MTBceDAyXCI1XG5ceDA2SlNUeXBlXHgxMlxyXG5cdEpTX05PUk1BTFx4MTBceDAwXHgxMlxyXG5cdEpTX1NUUklOR1x4MTBceDAxXHgxMlxyXG5cdEpTX05VTUJFUlx4MTBceDAyKlx0XHgwOFx4ZThceDA3XHgxMFx4ODBceDgwXHg4MFx4ODBceDAySlx4MDRceDA4XHgwNFx4MTBceDA1XCJeXG5ceDBjT25lb2ZPcHRpb25zXHgxMlx4NDNcblx4MTR1bmludGVycHJldGVkX29wdGlvblx4MThceGU3XHgwNyBceDAzKFx4MGJceDMyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdFx4MDhceGU4XHgwN1x4MTBceDgwXHg4MFx4ODBceDgwXHgwMlwiXHg5M1x4MDFcblx4MGJceDQ1bnVtT3B0aW9uc1x4MTJceDEzXG5ceDBiXHg2MWxsb3dfYWxpYXNceDE4XHgwMiBceDAxKFx4MDhceDEyXHgxOVxuXG5kZXByZWNhdGVkXHgxOFx4MDMgXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTJceDQzXG5ceDE0dW5pbnRlcnByZXRlZF9vcHRpb25ceDE4XHhlN1x4MDcgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24qXHRceDA4XHhlOFx4MDdceDEwXHg4MFx4ODBceDgwXHg4MFx4MDJKXHgwNFx4MDhceDA1XHgxMFx4MDZcIn1cblx4MTBceDQ1bnVtVmFsdWVPcHRpb25zXHgxMlx4MTlcblxuZGVwcmVjYXRlZFx4MThceDAxIFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyXHg0M1xuXHgxNHVuaW50ZXJwcmV0ZWRfb3B0aW9uXHgxOFx4ZTdceDA3IFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKlx0XHgwOFx4ZThceDA3XHgxMFx4ODBceDgwXHg4MFx4ODBceDAyXCJ7XG5ceDBlU2VydmljZU9wdGlvbnNceDEyXHgxOVxuXG5kZXByZWNhdGVkXHgxOCEgXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTJceDQzXG5ceDE0dW5pbnRlcnByZXRlZF9vcHRpb25ceDE4XHhlN1x4MDcgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24qXHRceDA4XHhlOFx4MDdceDEwXHg4MFx4ODBceDgwXHg4MFx4MDJcIlx4YWRceDAyXG5cck1ldGhvZE9wdGlvbnNceDEyXHgxOVxuXG5kZXByZWNhdGVkXHgxOCEgXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTJfXG5ceDExaWRlbXBvdGVuY3lfbGV2ZWxceDE4XCIgXHgwMShceDBlXHgzMi8uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuSWRlbXBvdGVuY3lMZXZlbDpceDEzSURFTVBPVEVOQ1lfVU5LTk9XTlx4MTJceDQzXG5ceDE0dW5pbnRlcnByZXRlZF9vcHRpb25ceDE4XHhlN1x4MDcgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25cIlBcblx4MTBJZGVtcG90ZW5jeUxldmVsXHgxMlx4MTdcblx4MTNJREVNUE9URU5DWV9VTktOT1dOXHgxMFx4MDBceDEyXHgxM1xuXHgwZk5PX1NJREVfRUZGRUNUU1x4MTBceDAxXHgxMlx4MGVcblxuSURFTVBPVEVOVFx4MTBceDAyKlx0XHgwOFx4ZThceDA3XHgxMFx4ODBceDgwXHg4MFx4ODBceDAyXCJceDllXHgwMlxuXHgxM1VuaW50ZXJwcmV0ZWRPcHRpb25ceDEyO1xuXHgwNG5hbWVceDE4XHgwMiBceDAzKFx4MGJceDMyLS5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydFx4MTJceDE4XG5ceDEwaWRlbnRpZmllcl92YWx1ZVx4MThceDAzIFx4MDEoXHRceDEyXHgxYVxuXHgxMnBvc2l0aXZlX2ludF92YWx1ZVx4MThceDA0IFx4MDEoXHgwNFx4MTJceDFhXG5ceDEybmVnYXRpdmVfaW50X3ZhbHVlXHgxOFx4MDUgXHgwMShceDAzXHgxMlx4MTRcblx4MGNceDY0b3VibGVfdmFsdWVceDE4XHgwNiBceDAxKFx4MDFceDEyXHgxNFxuXHgwY3N0cmluZ192YWx1ZVx4MThceDA3IFx4MDEoXHgwY1x4MTJceDE3XG5ceDBmXHg2MWdncmVnYXRlX3ZhbHVlXHgxOFx4MDggXHgwMShcdFx4MWFceDMzXG5ceDA4TmFtZVBhcnRceDEyXHgxMVxuXHRuYW1lX3BhcnRceDE4XHgwMSBceDAyKFx0XHgxMlx4MTRcblx4MGNpc19leHRlbnNpb25ceDE4XHgwMiBceDAyKFx4MDhcIlx4ZDVceDAxXG5ceDBlU291cmNlQ29kZUluZm9ceDEyOlxuXHgwOGxvY2F0aW9uXHgxOFx4MDEgXHgwMyhceDBiXHgzMiguZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uXHgxYVx4ODZceDAxXG5ceDA4TG9jYXRpb25ceDEyXHgxMFxuXHgwNHBhdGhceDE4XHgwMSBceDAzKFx4MDVceDQyXHgwMlx4MTBceDAxXHgxMlx4MTBcblx4MDRzcGFuXHgxOFx4MDIgXHgwMyhceDA1XHg0Mlx4MDJceDEwXHgwMVx4MTJceDE4XG5ceDEwbGVhZGluZ19jb21tZW50c1x4MThceDAzIFx4MDEoXHRceDEyXHgxOVxuXHgxMXRyYWlsaW5nX2NvbW1lbnRzXHgxOFx4MDQgXHgwMShcdFx4MTIhXG5ceDE5bGVhZGluZ19kZXRhY2hlZF9jb21tZW50c1x4MThceDA2IFx4MDMoXHRcIlx4YTdceDAxXG5ceDExR2VuZXJhdGVkQ29kZUluZm9ceDEyXHg0MVxuXG5hbm5vdGF0aW9uXHgxOFx4MDEgXHgwMyhceDBiXHgzMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25ceDFhT1xuXG5Bbm5vdGF0aW9uXHgxMlx4MTBcblx4MDRwYXRoXHgxOFx4MDEgXHgwMyhceDA1XHg0Mlx4MDJceDEwXHgwMVx4MTJceDEzXG5ceDBic291cmNlX2ZpbGVceDE4XHgwMiBceDAxKFx0XHgxMlxyXG5ceDA1XHg2Mlx4NjVnaW5ceDE4XHgwMyBceDAxKFx4MDVceDEyXHgwYlxuXHgwM1x4NjVuZFx4MThceDA0IFx4MDEoXHgwNVx4NDJ+XG5ceDEzXHg2M29tLmdvb2dsZS5wcm90b2J1ZkJceDEwXHg0NFx4NjVzY3JpcHRvclByb3Rvc0hceDAxWi1nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9kZXNjcmlwdG9ycGJceGY4XHgwMVx4MDFceGEyXHgwMlx4MDNHUEJceGFhXHgwMlx4MWFHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbicKKykKKworCisKK19GSUVMRERFU0NSSVBUT1JQUk9UT19UWVBFID0gX2Rlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IoCisgIG5hbWU9J1R5cGUnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICB2YWx1ZXM9WworICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX0RPVUJMRScsIGluZGV4PTAsIG51bWJlcj0xLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9GTE9BVCcsIGluZGV4PTEsIG51bWJlcj0yLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9JTlQ2NCcsIGluZGV4PTIsIG51bWJlcj0zLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9VSU5UNjQnLCBpbmRleD0zLCBudW1iZXI9NCwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfSU5UMzInLCBpbmRleD00LCBudW1iZXI9NSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfRklYRUQ2NCcsIGluZGV4PTUsIG51bWJlcj02LAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9GSVhFRDMyJywgaW5kZXg9NiwgbnVtYmVyPTcsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX0JPT0wnLCBpbmRleD03LCBudW1iZXI9OCwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfU1RSSU5HJywgaW5kZXg9OCwgbnVtYmVyPTksCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX0dST1VQJywgaW5kZXg9OSwgbnVtYmVyPTEwLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9NRVNTQUdFJywgaW5kZXg9MTAsIG51bWJlcj0xMSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfQllURVMnLCBpbmRleD0xMSwgbnVtYmVyPTEyLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9VSU5UMzInLCBpbmRleD0xMiwgbnVtYmVyPTEzLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9FTlVNJywgaW5kZXg9MTMsIG51bWJlcj0xNCwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfU0ZJWEVEMzInLCBpbmRleD0xNCwgbnVtYmVyPTE1LAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9TRklYRUQ2NCcsIGluZGV4PTE1LCBudW1iZXI9MTYsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX1NJTlQzMicsIGluZGV4PTE2LCBudW1iZXI9MTcsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX1NJTlQ2NCcsIGluZGV4PTE3LCBudW1iZXI9MTgsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MTc0MCwKKyAgc2VyaWFsaXplZF9lbmQ9MjA1MCwKKykKK19zeW1fZGIuUmVnaXN0ZXJFbnVtRGVzY3JpcHRvcihfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRSkKKworX0ZJRUxEREVTQ1JJUFRPUlBST1RPX0xBQkVMID0gX2Rlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IoCisgIG5hbWU9J0xhYmVsJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIHZhbHVlcz1bCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J0xBQkVMX09QVElPTkFMJywgaW5kZXg9MCwgbnVtYmVyPTEsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdMQUJFTF9SRVFVSVJFRCcsIGluZGV4PTEsIG51bWJlcj0yLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nTEFCRUxfUkVQRUFURUQnLCBpbmRleD0yLCBudW1iZXI9MywKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgc2VyaWFsaXplZF9zdGFydD0yMDUyLAorICBzZXJpYWxpemVkX2VuZD0yMTE5LAorKQorX3N5bV9kYi5SZWdpc3RlckVudW1EZXNjcmlwdG9yKF9GSUVMRERFU0NSSVBUT1JQUk9UT19MQUJFTCkKKworX0ZJTEVPUFRJT05TX09QVElNSVpFTU9ERSA9IF9kZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAorICBuYW1lPSdPcHRpbWl6ZU1vZGUnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGUnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIHZhbHVlcz1bCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1NQRUVEJywgaW5kZXg9MCwgbnVtYmVyPTEsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdDT0RFX1NJWkUnLCBpbmRleD0xLCBudW1iZXI9MiwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J0xJVEVfUlVOVElNRScsIGluZGV4PTIsIG51bWJlcj0zLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBzZXJpYWxpemVkX3N0YXJ0PTM2ODYsCisgIHNlcmlhbGl6ZWRfZW5kPTM3NDQsCispCitfc3ltX2RiLlJlZ2lzdGVyRW51bURlc2NyaXB0b3IoX0ZJTEVPUFRJT05TX09QVElNSVpFTU9ERSkKKworX0ZJRUxET1BUSU9OU19DVFlQRSA9IF9kZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAorICBuYW1lPSdDVHlwZScsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgdmFsdWVzPVsKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nU1RSSU5HJywgaW5kZXg9MCwgbnVtYmVyPTAsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdDT1JEJywgaW5kZXg9MSwgbnVtYmVyPTEsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdTVFJJTkdfUElFQ0UnLCBpbmRleD0yLCBudW1iZXI9MiwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgc2VyaWFsaXplZF9zdGFydD00MzU0LAorICBzZXJpYWxpemVkX2VuZD00NDAxLAorKQorX3N5bV9kYi5SZWdpc3RlckVudW1EZXNjcmlwdG9yKF9GSUVMRE9QVElPTlNfQ1RZUEUpCisKK19GSUVMRE9QVElPTlNfSlNUWVBFID0gX2Rlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IoCisgIG5hbWU9J0pTVHlwZScsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGUnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIHZhbHVlcz1bCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J0pTX05PUk1BTCcsIGluZGV4PTAsIG51bWJlcj0wLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nSlNfU1RSSU5HJywgaW5kZXg9MSwgbnVtYmVyPTEsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdKU19OVU1CRVInLCBpbmRleD0yLCBudW1iZXI9MiwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgc2VyaWFsaXplZF9zdGFydD00NDAzLAorICBzZXJpYWxpemVkX2VuZD00NDU2LAorKQorX3N5bV9kYi5SZWdpc3RlckVudW1EZXNjcmlwdG9yKF9GSUVMRE9QVElPTlNfSlNUWVBFKQorCitfTUVUSE9ET1BUSU9OU19JREVNUE9URU5DWUxFVkVMID0gX2Rlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IoCisgIG5hbWU9J0lkZW1wb3RlbmN5TGV2ZWwnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWwnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIHZhbHVlcz1bCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J0lERU1QT1RFTkNZX1VOS05PV04nLCBpbmRleD0wLCBudW1iZXI9MCwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J05PX1NJREVfRUZGRUNUUycsIGluZGV4PTEsIG51bWJlcj0xLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nSURFTVBPVEVOVCcsIGluZGV4PTIsIG51bWJlcj0yLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBzZXJpYWxpemVkX3N0YXJ0PTUxODQsCisgIHNlcmlhbGl6ZWRfZW5kPTUyNjQsCispCitfc3ltX2RiLlJlZ2lzdGVyRW51bURlc2NyaXB0b3IoX01FVEhPRE9QVElPTlNfSURFTVBPVEVOQ1lMRVZFTCkKKworCitfRklMRURFU0NSSVBUT1JTRVQgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdGaWxlRGVzY3JpcHRvclNldCcsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0JywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdmaWxlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQuZmlsZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD01MywKKyAgc2VyaWFsaXplZF9lbmQ9MTI0LAorKQorCisKK19GSUxFREVTQ1JJUFRPUlBST1RPID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nRmlsZURlc2NyaXB0b3JQcm90bycsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8nLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdwYWNrYWdlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wYWNrYWdlJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZGVwZW5kZW5jeScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeScsIGluZGV4PTIsCisgICAgICBudW1iZXI9MywgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdwdWJsaWNfZGVwZW5kZW5jeScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucHVibGljX2RlcGVuZGVuY3knLCBpbmRleD0zLAorICAgICAgbnVtYmVyPTEwLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3dlYWtfZGVwZW5kZW5jeScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ud2Vha19kZXBlbmRlbmN5JywgaW5kZXg9NCwKKyAgICAgIG51bWJlcj0xMSwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdtZXNzYWdlX3R5cGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm1lc3NhZ2VfdHlwZScsIGluZGV4PTUsCisgICAgICBudW1iZXI9NCwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2VudW1fdHlwZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlJywgaW5kZXg9NiwKKyAgICAgIG51bWJlcj01LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nc2VydmljZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc2VydmljZScsIGluZGV4PTcsCisgICAgICBudW1iZXI9NiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2V4dGVuc2lvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uJywgaW5kZXg9OCwKKyAgICAgIG51bWJlcj03LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nb3B0aW9ucycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucycsIGluZGV4PTksCisgICAgICBudW1iZXI9OCwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nc291cmNlX2NvZGVfaW5mbycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc291cmNlX2NvZGVfaW5mbycsIGluZGV4PTEwLAorICAgICAgbnVtYmVyPTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3N5bnRheCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4JywgaW5kZXg9MTEsCisgICAgICBudW1iZXI9MTIsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MTI3LAorICBzZXJpYWxpemVkX2VuZD02MDIsCispCisKKworX0RFU0NSSVBUT1JQUk9UT19FWFRFTlNJT05SQU5HRSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0V4dGVuc2lvblJhbmdlJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdzdGFydCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZS5zdGFydCcsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2VuZCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZS5lbmQnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdvcHRpb25zJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlLm9wdGlvbnMnLCBpbmRleD0yLAorICAgICAgbnVtYmVyPTMsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0xMTQwLAorICBzZXJpYWxpemVkX2VuZD0xMjQxLAorKQorCitfREVTQ1JJUFRPUlBST1RPX1JFU0VSVkVEUkFOR0UgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdSZXNlcnZlZFJhbmdlJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3N0YXJ0JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2Uuc3RhcnQnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdlbmQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZS5lbmQnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MTI0MywKKyAgc2VyaWFsaXplZF9lbmQ9MTI4NiwKKykKKworX0RFU0NSSVBUT1JQUk9UTyA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0Rlc2NyaXB0b3JQcm90bycsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bycsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZmllbGQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZmllbGQnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdleHRlbnNpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj02LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbmVzdGVkX3R5cGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmVzdGVkX3R5cGUnLCBpbmRleD0zLAorICAgICAgbnVtYmVyPTMsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdlbnVtX3R5cGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlJywgaW5kZXg9NCwKKyAgICAgIG51bWJlcj00LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZXh0ZW5zaW9uX3JhbmdlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbl9yYW5nZScsIGluZGV4PTUsCisgICAgICBudW1iZXI9NSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J29uZW9mX2RlY2wnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub25lb2ZfZGVjbCcsIGluZGV4PTYsCisgICAgICBudW1iZXI9OCwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J29wdGlvbnMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucycsIGluZGV4PTcsCisgICAgICBudW1iZXI9NywgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ncmVzZXJ2ZWRfcmFuZ2UnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfcmFuZ2UnLCBpbmRleD04LAorICAgICAgbnVtYmVyPTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdyZXNlcnZlZF9uYW1lJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUnLCBpbmRleD05LAorICAgICAgbnVtYmVyPTEwLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtfREVTQ1JJUFRPUlBST1RPX0VYVEVOU0lPTlJBTkdFLCBfREVTQ1JJUFRPUlBST1RPX1JFU0VSVkVEUkFOR0UsIF0sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzInLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTYwNSwKKyAgc2VyaWFsaXplZF9lbmQ9MTI4NiwKKykKKworCitfRVhURU5TSU9OUkFOR0VPUFRJT05TID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nRXh0ZW5zaW9uUmFuZ2VPcHRpb25zJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd1bmludGVycHJldGVkX29wdGlvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbicsIGluZGV4PTAsCisgICAgICBudW1iZXI9OTk5LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1UcnVlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9WygxMDAwLCA1MzY4NzA5MTIpLCBdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTEyODgsCisgIHNlcmlhbGl6ZWRfZW5kPTEzOTEsCispCisKKworX0ZJRUxEREVTQ1JJUFRPUlBST1RPID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nRmllbGREZXNjcmlwdG9yUHJvdG8nLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bycsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdudW1iZXInLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5udW1iZXInLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTMsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdsYWJlbCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmxhYmVsJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj00LCB0eXBlPTE0LCBjcHBfdHlwZT04LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3R5cGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlJywgaW5kZXg9MywKKyAgICAgIG51bWJlcj01LCB0eXBlPTE0LCBjcHBfdHlwZT04LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3R5cGVfbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZScsIGluZGV4PTQsCisgICAgICBudW1iZXI9NiwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLmRlY29kZSgndXRmLTgnKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2V4dGVuZGVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUnLCBpbmRleD01LAorICAgICAgbnVtYmVyPTIsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdkZWZhdWx0X3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZScsIGluZGV4PTYsCisgICAgICBudW1iZXI9NywgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLmRlY29kZSgndXRmLTgnKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J29uZW9mX2luZGV4JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub25lb2ZfaW5kZXgnLCBpbmRleD03LAorICAgICAgbnVtYmVyPTksIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdqc29uX25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUnLCBpbmRleD04LAorICAgICAgbnVtYmVyPTEwLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nb3B0aW9ucycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9wdGlvbnMnLCBpbmRleD05LAorICAgICAgbnVtYmVyPTgsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3Byb3RvM19vcHRpb25hbCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnByb3RvM19vcHRpb25hbCcsIGluZGV4PTEwLAorICAgICAgbnVtYmVyPTE3LCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgICBfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRSwKKyAgICBfRklFTERERVNDUklQVE9SUFJPVE9fTEFCRUwsCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MTM5NCwKKyAgc2VyaWFsaXplZF9lbmQ9MjExOSwKKykKKworCitfT05FT0ZERVNDUklQVE9SUFJPVE8gPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdPbmVvZkRlc2NyaXB0b3JQcm90bycsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSduYW1lJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8ubmFtZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLmRlY29kZSgndXRmLTgnKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J29wdGlvbnMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5vcHRpb25zJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MjEyMSwKKyAgc2VyaWFsaXplZF9lbmQ9MjIwNSwKKykKKworCitfRU5VTURFU0NSSVBUT1JQUk9UT19FTlVNUkVTRVJWRURSQU5HRSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0VudW1SZXNlcnZlZFJhbmdlJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nc3RhcnQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlLnN0YXJ0JywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZW5kJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZS5lbmQnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MjQ1MywKKyAgc2VyaWFsaXplZF9lbmQ9MjUwMCwKKykKKworX0VOVU1ERVNDUklQVE9SUFJPVE8gPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdFbnVtRGVzY3JpcHRvclByb3RvJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bycsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLmRlY29kZSgndXRmLTgnKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by52YWx1ZScsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J29wdGlvbnMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm9wdGlvbnMnLCBpbmRleD0yLAorICAgICAgbnVtYmVyPTMsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3Jlc2VydmVkX3JhbmdlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9yYW5nZScsIGluZGV4PTMsCisgICAgICBudW1iZXI9NCwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3Jlc2VydmVkX25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUnLCBpbmRleD00LAorICAgICAgbnVtYmVyPTUsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W19FTlVNREVTQ1JJUFRPUlBST1RPX0VOVU1SRVNFUlZFRFJBTkdFLCBdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0yMjA4LAorICBzZXJpYWxpemVkX2VuZD0yNTAwLAorKQorCisKK19FTlVNVkFMVUVERVNDUklQVE9SUFJPVE8gPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8nLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8nLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmFtZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLmRlY29kZSgndXRmLTgnKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J251bWJlcicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5udW1iZXInLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdvcHRpb25zJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMnLCBpbmRleD0yLAorICAgICAgbnVtYmVyPTMsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0yNTAyLAorICBzZXJpYWxpemVkX2VuZD0yNjEwLAorKQorCisKK19TRVJWSUNFREVTQ1JJUFRPUlBST1RPID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nU2VydmljZURlc2NyaXB0b3JQcm90bycsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8nLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdtZXRob2QnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm1ldGhvZCcsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J29wdGlvbnMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMnLCBpbmRleD0yLAorICAgICAgbnVtYmVyPTMsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0yNjEzLAorICBzZXJpYWxpemVkX2VuZD0yNzU3LAorKQorCisKK19NRVRIT0RERVNDUklQVE9SUFJPVE8gPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdNZXRob2REZXNjcmlwdG9yUHJvdG8nLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8nLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLmRlY29kZSgndXRmLTgnKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2lucHV0X3R5cGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZScsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLmRlY29kZSgndXRmLTgnKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J291dHB1dF90eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj0zLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nb3B0aW9ucycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vcHRpb25zJywgaW5kZXg9MywKKyAgICAgIG51bWJlcj00LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdjbGllbnRfc3RyZWFtaW5nJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmNsaWVudF9zdHJlYW1pbmcnLCBpbmRleD00LAorICAgICAgbnVtYmVyPTUsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdzZXJ2ZXJfc3RyZWFtaW5nJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLnNlcnZlcl9zdHJlYW1pbmcnLCBpbmRleD01LAorICAgICAgbnVtYmVyPTYsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9Mjc2MCwKKyAgc2VyaWFsaXplZF9lbmQ9Mjk1MywKKykKKworCitfRklMRU9QVElPTlMgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdGaWxlT3B0aW9ucycsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdqYXZhX3BhY2thZ2UnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdqYXZhX291dGVyX2NsYXNzbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj04LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0namF2YV9tdWx0aXBsZV9maWxlcycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfbXVsdGlwbGVfZmlsZXMnLCBpbmRleD0yLAorICAgICAgbnVtYmVyPTEwLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0namF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2gnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCcsIGluZGV4PTMsCisgICAgICBudW1iZXI9MjAsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0namF2YV9zdHJpbmdfY2hlY2tfdXRmOCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgnLCBpbmRleD00LAorICAgICAgbnVtYmVyPTI3LCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nb3B0aW1pemVfZm9yJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub3B0aW1pemVfZm9yJywgaW5kZXg9NSwKKyAgICAgIG51bWJlcj05LCB0eXBlPTE0LCBjcHBfdHlwZT04LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT0xLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZ29fcGFja2FnZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmdvX3BhY2thZ2UnLCBpbmRleD02LAorICAgICAgbnVtYmVyPTExLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nY2NfZ2VuZXJpY19zZXJ2aWNlcycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNjX2dlbmVyaWNfc2VydmljZXMnLCBpbmRleD03LAorICAgICAgbnVtYmVyPTE2LCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0namF2YV9nZW5lcmljX3NlcnZpY2VzJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9nZW5lcmljX3NlcnZpY2VzJywgaW5kZXg9OCwKKyAgICAgIG51bWJlcj0xNywgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3B5X2dlbmVyaWNfc2VydmljZXMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5weV9nZW5lcmljX3NlcnZpY2VzJywgaW5kZXg9OSwKKyAgICAgIG51bWJlcj0xOCwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3BocF9nZW5lcmljX3NlcnZpY2VzJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucGhwX2dlbmVyaWNfc2VydmljZXMnLCBpbmRleD0xMCwKKyAgICAgIG51bWJlcj00MiwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2RlcHJlY2F0ZWQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5kZXByZWNhdGVkJywgaW5kZXg9MTEsCisgICAgICBudW1iZXI9MjMsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdjY19lbmFibGVfYXJlbmFzJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY2NfZW5hYmxlX2FyZW5hcycsIGluZGV4PTEyLAorICAgICAgbnVtYmVyPTMxLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPVRydWUsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdvYmpjX2NsYXNzX3ByZWZpeCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4JywgaW5kZXg9MTMsCisgICAgICBudW1iZXI9MzYsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdjc2hhcnBfbmFtZXNwYWNlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZScsIGluZGV4PTE0LAorICAgICAgbnVtYmVyPTM3LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nc3dpZnRfcHJlZml4JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuc3dpZnRfcHJlZml4JywgaW5kZXg9MTUsCisgICAgICBudW1iZXI9MzksIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdwaHBfY2xhc3NfcHJlZml4JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucGhwX2NsYXNzX3ByZWZpeCcsIGluZGV4PTE2LAorICAgICAgbnVtYmVyPTQwLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ncGhwX25hbWVzcGFjZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnBocF9uYW1lc3BhY2UnLCBpbmRleD0xNywKKyAgICAgIG51bWJlcj00MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLmRlY29kZSgndXRmLTgnKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3BocF9tZXRhZGF0YV9uYW1lc3BhY2UnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5waHBfbWV0YWRhdGFfbmFtZXNwYWNlJywgaW5kZXg9MTgsCisgICAgICBudW1iZXI9NDQsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdydWJ5X3BhY2thZ2UnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5ydWJ5X3BhY2thZ2UnLCBpbmRleD0xOSwKKyAgICAgIG51bWJlcj00NSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLmRlY29kZSgndXRmLTgnKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3VuaW50ZXJwcmV0ZWRfb3B0aW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24nLCBpbmRleD0yMCwKKyAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgICAgX0ZJTEVPUFRJT05TX09QVElNSVpFTU9ERSwKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9VHJ1ZSwKKyAgc3ludGF4PSdwcm90bzInLAorICBleHRlbnNpb25fcmFuZ2VzPVsoMTAwMCwgNTM2ODcwOTEyKSwgXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0yOTU2LAorICBzZXJpYWxpemVkX2VuZD0zNzYxLAorKQorCisKK19NRVNTQUdFT1BUSU9OUyA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J01lc3NhZ2VPcHRpb25zJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcicsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2RlcHJlY2F0ZWQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5kZXByZWNhdGVkJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj0zLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbWFwX2VudHJ5JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubWFwX2VudHJ5JywgaW5kZXg9MywKKyAgICAgIG51bWJlcj03LCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3VuaW50ZXJwcmV0ZWRfb3B0aW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24nLCBpbmRleD00LAorICAgICAgbnVtYmVyPTk5OSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9VHJ1ZSwKKyAgc3ludGF4PSdwcm90bzInLAorICBleHRlbnNpb25fcmFuZ2VzPVsoMTAwMCwgNTM2ODcwOTEyKSwgXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0zNzY0LAorICBzZXJpYWxpemVkX2VuZD00MDI0LAorKQorCisKK19GSUVMRE9QVElPTlMgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdGaWVsZE9wdGlvbnMnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2N0eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmN0eXBlJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTE0LCBjcHBfdHlwZT04LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ncGFja2VkJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnBhY2tlZCcsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdqc3R5cGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuanN0eXBlJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj02LCB0eXBlPTE0LCBjcHBfdHlwZT04LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbGF6eScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5sYXp5JywgaW5kZXg9MywKKyAgICAgIG51bWJlcj01LCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndW52ZXJpZmllZF9sYXp5JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnVudmVyaWZpZWRfbGF6eScsIGluZGV4PTQsCisgICAgICBudW1iZXI9MTUsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdkZXByZWNhdGVkJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmRlcHJlY2F0ZWQnLCBpbmRleD01LAorICAgICAgbnVtYmVyPTMsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd3ZWFrJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLndlYWsnLCBpbmRleD02LAorICAgICAgbnVtYmVyPTEwLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndW5pbnRlcnByZXRlZF9vcHRpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24nLCBpbmRleD03LAorICAgICAgbnVtYmVyPTk5OSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgICBfRklFTERPUFRJT05TX0NUWVBFLAorICAgIF9GSUVMRE9QVElPTlNfSlNUWVBFLAorICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1UcnVlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9WygxMDAwLCA1MzY4NzA5MTIpLCBdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTQwMjcsCisgIHNlcmlhbGl6ZWRfZW5kPTQ0NzMsCispCisKKworX09ORU9GT1BUSU9OUyA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J09uZW9mT3B0aW9ucycsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucycsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndW5pbnRlcnByZXRlZF9vcHRpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24nLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTk5OSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9VHJ1ZSwKKyAgc3ludGF4PSdwcm90bzInLAorICBleHRlbnNpb25fcmFuZ2VzPVsoMTAwMCwgNTM2ODcwOTEyKSwgXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD00NDc1LAorICBzZXJpYWxpemVkX2VuZD00NTY5LAorKQorCisKK19FTlVNT1BUSU9OUyA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0VudW1PcHRpb25zJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2FsbG93X2FsaWFzJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMuYWxsb3dfYWxpYXMnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTIsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZGVwcmVjYXRlZCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLmRlcHJlY2F0ZWQnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTMsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd1bmludGVycHJldGVkX29wdGlvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPVRydWUsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bKDEwMDAsIDUzNjg3MDkxMiksIF0sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9NDU3MiwKKyAgc2VyaWFsaXplZF9lbmQ9NDcxOSwKKykKKworCitfRU5VTVZBTFVFT1BUSU9OUyA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0VudW1WYWx1ZU9wdGlvbnMnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdkZXByZWNhdGVkJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy5kZXByZWNhdGVkJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndW5pbnRlcnByZXRlZF9vcHRpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPVRydWUsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bKDEwMDAsIDUzNjg3MDkxMiksIF0sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9NDcyMSwKKyAgc2VyaWFsaXplZF9lbmQ9NDg0NiwKKykKKworCitfU0VSVklDRU9QVElPTlMgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdTZXJ2aWNlT3B0aW9ucycsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdkZXByZWNhdGVkJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMuZGVwcmVjYXRlZCcsIGluZGV4PTAsCisgICAgICBudW1iZXI9MzMsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd1bmludGVycHJldGVkX29wdGlvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPVRydWUsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bKDEwMDAsIDUzNjg3MDkxMiksIF0sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9NDg0OCwKKyAgc2VyaWFsaXplZF9lbmQ9NDk3MSwKKykKKworCitfTUVUSE9ET1BUSU9OUyA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J01ldGhvZE9wdGlvbnMnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdkZXByZWNhdGVkJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5kZXByZWNhdGVkJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0zMywgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2lkZW1wb3RlbmN5X2xldmVsJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5pZGVtcG90ZW5jeV9sZXZlbCcsIGluZGV4PTEsCisgICAgICBudW1iZXI9MzQsIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd1bmludGVycHJldGVkX29wdGlvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24nLCBpbmRleD0yLAorICAgICAgbnVtYmVyPTk5OSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgICBfTUVUSE9ET1BUSU9OU19JREVNUE9URU5DWUxFVkVMLAorICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1UcnVlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9WygxMDAwLCA1MzY4NzA5MTIpLCBdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTQ5NzQsCisgIHNlcmlhbGl6ZWRfZW5kPTUyNzUsCispCisKKworX1VOSU5URVJQUkVURURPUFRJT05fTkFNRVBBUlQgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdOYW1lUGFydCcsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J25hbWVfcGFydCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQubmFtZV9wYXJ0JywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTIsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0naXNfZXh0ZW5zaW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5pc19leHRlbnNpb24nLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MiwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzInLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTU1MTMsCisgIHNlcmlhbGl6ZWRfZW5kPTU1NjQsCispCisKK19VTklOVEVSUFJFVEVET1BUSU9OID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nVW5pbnRlcnByZXRlZE9wdGlvbicsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24nLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLm5hbWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTIsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdpZGVudGlmaWVyX3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0zLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ncG9zaXRpdmVfaW50X3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5wb3NpdGl2ZV9pbnRfdmFsdWUnLCBpbmRleD0yLAorICAgICAgbnVtYmVyPTQsIHR5cGU9NCwgY3BwX3R5cGU9NCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSduZWdhdGl2ZV9pbnRfdmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLm5lZ2F0aXZlX2ludF92YWx1ZScsIGluZGV4PTMsCisgICAgICBudW1iZXI9NSwgdHlwZT0zLCBjcHBfdHlwZT0yLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2RvdWJsZV92YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uZG91YmxlX3ZhbHVlJywgaW5kZXg9NCwKKyAgICAgIG51bWJlcj02LCB0eXBlPTEsIGNwcF90eXBlPTUsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1mbG9hdCgwKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3N0cmluZ192YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlJywgaW5kZXg9NSwKKyAgICAgIG51bWJlcj03LCB0eXBlPTEyLCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nYWdncmVnYXRlX3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUnLCBpbmRleD02LAorICAgICAgbnVtYmVyPTgsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bX1VOSU5URVJQUkVURURPUFRJT05fTkFNRVBBUlQsIF0sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzInLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTUyNzgsCisgIHNlcmlhbGl6ZWRfZW5kPTU1NjQsCispCisKKworX1NPVVJDRUNPREVJTkZPX0xPQ0FUSU9OID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nTG9jYXRpb24nLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbicsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ncGF0aCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnBhdGgnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nc3BhbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnNwYW4nLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbGVhZGluZ19jb21tZW50cycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMnLCBpbmRleD0yLAorICAgICAgbnVtYmVyPTMsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd0cmFpbGluZ19jb21tZW50cycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnRyYWlsaW5nX2NvbW1lbnRzJywgaW5kZXg9MywKKyAgICAgIG51bWJlcj00LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMnLCBpbmRleD00LAorICAgICAgbnVtYmVyPTYsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzInLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTU2NDYsCisgIHNlcmlhbGl6ZWRfZW5kPTU3ODAsCispCisKK19TT1VSQ0VDT0RFSU5GTyA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J1NvdXJjZUNvZGVJbmZvJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8nLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2xvY2F0aW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8ubG9jYXRpb24nLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bX1NPVVJDRUNPREVJTkZPX0xPQ0FUSU9OLCBdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD01NTY3LAorICBzZXJpYWxpemVkX2VuZD01NzgwLAorKQorCisKK19HRU5FUkFURURDT0RFSU5GT19BTk5PVEFUSU9OID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nQW5ub3RhdGlvbicsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24nLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3BhdGgnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnBhdGgnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nc291cmNlX2ZpbGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nYmVnaW4nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLmJlZ2luJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj0zLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZW5kJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5lbmQnLCBpbmRleD0zLAorICAgICAgbnVtYmVyPTQsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9NTg3MSwKKyAgc2VyaWFsaXplZF9lbmQ9NTk1MCwKKykKKworX0dFTkVSQVRFRENPREVJTkZPID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nR2VuZXJhdGVkQ29kZUluZm8nLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbycsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nYW5ub3RhdGlvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLmFubm90YXRpb24nLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bX0dFTkVSQVRFRENPREVJTkZPX0FOTk9UQVRJT04sIF0sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzInLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTU3ODMsCisgIHNlcmlhbGl6ZWRfZW5kPTU5NTAsCispCisKK19GSUxFREVTQ1JJUFRPUlNFVC5maWVsZHNfYnlfbmFtZVsnZmlsZSddLm1lc3NhZ2VfdHlwZSA9IF9GSUxFREVTQ1JJUFRPUlBST1RPCitfRklMRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnbWVzc2FnZV90eXBlJ10ubWVzc2FnZV90eXBlID0gX0RFU0NSSVBUT1JQUk9UTworX0ZJTEVERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ2VudW1fdHlwZSddLm1lc3NhZ2VfdHlwZSA9IF9FTlVNREVTQ1JJUFRPUlBST1RPCitfRklMRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnc2VydmljZSddLm1lc3NhZ2VfdHlwZSA9IF9TRVJWSUNFREVTQ1JJUFRPUlBST1RPCitfRklMRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnZXh0ZW5zaW9uJ10ubWVzc2FnZV90eXBlID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPCitfRklMRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnb3B0aW9ucyddLm1lc3NhZ2VfdHlwZSA9IF9GSUxFT1BUSU9OUworX0ZJTEVERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ3NvdXJjZV9jb2RlX2luZm8nXS5tZXNzYWdlX3R5cGUgPSBfU09VUkNFQ09ERUlORk8KK19ERVNDUklQVE9SUFJPVE9fRVhURU5TSU9OUkFOR0UuZmllbGRzX2J5X25hbWVbJ29wdGlvbnMnXS5tZXNzYWdlX3R5cGUgPSBfRVhURU5TSU9OUkFOR0VPUFRJT05TCitfREVTQ1JJUFRPUlBST1RPX0VYVEVOU0lPTlJBTkdFLmNvbnRhaW5pbmdfdHlwZSA9IF9ERVNDUklQVE9SUFJPVE8KK19ERVNDUklQVE9SUFJPVE9fUkVTRVJWRURSQU5HRS5jb250YWluaW5nX3R5cGUgPSBfREVTQ1JJUFRPUlBST1RPCitfREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydmaWVsZCddLm1lc3NhZ2VfdHlwZSA9IF9GSUVMRERFU0NSSVBUT1JQUk9UTworX0RFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnZXh0ZW5zaW9uJ10ubWVzc2FnZV90eXBlID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPCitfREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWyduZXN0ZWRfdHlwZSddLm1lc3NhZ2VfdHlwZSA9IF9ERVNDUklQVE9SUFJPVE8KK19ERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ2VudW1fdHlwZSddLm1lc3NhZ2VfdHlwZSA9IF9FTlVNREVTQ1JJUFRPUlBST1RPCitfREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydleHRlbnNpb25fcmFuZ2UnXS5tZXNzYWdlX3R5cGUgPSBfREVTQ1JJUFRPUlBST1RPX0VYVEVOU0lPTlJBTkdFCitfREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvbmVvZl9kZWNsJ10ubWVzc2FnZV90eXBlID0gX09ORU9GREVTQ1JJUFRPUlBST1RPCitfREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX01FU1NBR0VPUFRJT05TCitfREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydyZXNlcnZlZF9yYW5nZSddLm1lc3NhZ2VfdHlwZSA9IF9ERVNDUklQVE9SUFJPVE9fUkVTRVJWRURSQU5HRQorX0VYVEVOU0lPTlJBTkdFT1BUSU9OUy5maWVsZHNfYnlfbmFtZVsndW5pbnRlcnByZXRlZF9vcHRpb24nXS5tZXNzYWdlX3R5cGUgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgorX0ZJRUxEREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydsYWJlbCddLmVudW1fdHlwZSA9IF9GSUVMRERFU0NSSVBUT1JQUk9UT19MQUJFTAorX0ZJRUxEREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWyd0eXBlJ10uZW51bV90eXBlID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEUKK19GSUVMRERFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnb3B0aW9ucyddLm1lc3NhZ2VfdHlwZSA9IF9GSUVMRE9QVElPTlMKK19GSUVMRERFU0NSSVBUT1JQUk9UT19UWVBFLmNvbnRhaW5pbmdfdHlwZSA9IF9GSUVMRERFU0NSSVBUT1JQUk9UTworX0ZJRUxEREVTQ1JJUFRPUlBST1RPX0xBQkVMLmNvbnRhaW5pbmdfdHlwZSA9IF9GSUVMRERFU0NSSVBUT1JQUk9UTworX09ORU9GREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX09ORU9GT1BUSU9OUworX0VOVU1ERVNDUklQVE9SUFJPVE9fRU5VTVJFU0VSVkVEUkFOR0UuY29udGFpbmluZ190eXBlID0gX0VOVU1ERVNDUklQVE9SUFJPVE8KK19FTlVNREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddLm1lc3NhZ2VfdHlwZSA9IF9FTlVNVkFMVUVERVNDUklQVE9SUFJPVE8KK19FTlVNREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX0VOVU1PUFRJT05TCitfRU5VTURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsncmVzZXJ2ZWRfcmFuZ2UnXS5tZXNzYWdlX3R5cGUgPSBfRU5VTURFU0NSSVBUT1JQUk9UT19FTlVNUkVTRVJWRURSQU5HRQorX0VOVU1WQUxVRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnb3B0aW9ucyddLm1lc3NhZ2VfdHlwZSA9IF9FTlVNVkFMVUVPUFRJT05TCitfU0VSVklDRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnbWV0aG9kJ10ubWVzc2FnZV90eXBlID0gX01FVEhPRERFU0NSSVBUT1JQUk9UTworX1NFUlZJQ0VERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ29wdGlvbnMnXS5tZXNzYWdlX3R5cGUgPSBfU0VSVklDRU9QVElPTlMKK19NRVRIT0RERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ29wdGlvbnMnXS5tZXNzYWdlX3R5cGUgPSBfTUVUSE9ET1BUSU9OUworX0ZJTEVPUFRJT05TLmZpZWxkc19ieV9uYW1lWydvcHRpbWl6ZV9mb3InXS5lbnVtX3R5cGUgPSBfRklMRU9QVElPTlNfT1BUSU1JWkVNT0RFCitfRklMRU9QVElPTlMuZmllbGRzX2J5X25hbWVbJ3VuaW50ZXJwcmV0ZWRfb3B0aW9uJ10ubWVzc2FnZV90eXBlID0gX1VOSU5URVJQUkVURURPUFRJT04KK19GSUxFT1BUSU9OU19PUFRJTUlaRU1PREUuY29udGFpbmluZ190eXBlID0gX0ZJTEVPUFRJT05TCitfTUVTU0FHRU9QVElPTlMuZmllbGRzX2J5X25hbWVbJ3VuaW50ZXJwcmV0ZWRfb3B0aW9uJ10ubWVzc2FnZV90eXBlID0gX1VOSU5URVJQUkVURURPUFRJT04KK19GSUVMRE9QVElPTlMuZmllbGRzX2J5X25hbWVbJ2N0eXBlJ10uZW51bV90eXBlID0gX0ZJRUxET1BUSU9OU19DVFlQRQorX0ZJRUxET1BUSU9OUy5maWVsZHNfYnlfbmFtZVsnanN0eXBlJ10uZW51bV90eXBlID0gX0ZJRUxET1BUSU9OU19KU1RZUEUKK19GSUVMRE9QVElPTlMuZmllbGRzX2J5X25hbWVbJ3VuaW50ZXJwcmV0ZWRfb3B0aW9uJ10ubWVzc2FnZV90eXBlID0gX1VOSU5URVJQUkVURURPUFRJT04KK19GSUVMRE9QVElPTlNfQ1RZUEUuY29udGFpbmluZ190eXBlID0gX0ZJRUxET1BUSU9OUworX0ZJRUxET1BUSU9OU19KU1RZUEUuY29udGFpbmluZ190eXBlID0gX0ZJRUxET1BUSU9OUworX09ORU9GT1BUSU9OUy5maWVsZHNfYnlfbmFtZVsndW5pbnRlcnByZXRlZF9vcHRpb24nXS5tZXNzYWdlX3R5cGUgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgorX0VOVU1PUFRJT05TLmZpZWxkc19ieV9uYW1lWyd1bmludGVycHJldGVkX29wdGlvbiddLm1lc3NhZ2VfdHlwZSA9IF9VTklOVEVSUFJFVEVET1BUSU9OCitfRU5VTVZBTFVFT1BUSU9OUy5maWVsZHNfYnlfbmFtZVsndW5pbnRlcnByZXRlZF9vcHRpb24nXS5tZXNzYWdlX3R5cGUgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgorX1NFUlZJQ0VPUFRJT05TLmZpZWxkc19ieV9uYW1lWyd1bmludGVycHJldGVkX29wdGlvbiddLm1lc3NhZ2VfdHlwZSA9IF9VTklOVEVSUFJFVEVET1BUSU9OCitfTUVUSE9ET1BUSU9OUy5maWVsZHNfYnlfbmFtZVsnaWRlbXBvdGVuY3lfbGV2ZWwnXS5lbnVtX3R5cGUgPSBfTUVUSE9ET1BUSU9OU19JREVNUE9URU5DWUxFVkVMCitfTUVUSE9ET1BUSU9OUy5maWVsZHNfYnlfbmFtZVsndW5pbnRlcnByZXRlZF9vcHRpb24nXS5tZXNzYWdlX3R5cGUgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgorX01FVEhPRE9QVElPTlNfSURFTVBPVEVOQ1lMRVZFTC5jb250YWluaW5nX3R5cGUgPSBfTUVUSE9ET1BUSU9OUworX1VOSU5URVJQUkVURURPUFRJT05fTkFNRVBBUlQuY29udGFpbmluZ190eXBlID0gX1VOSU5URVJQUkVURURPUFRJT04KK19VTklOVEVSUFJFVEVET1BUSU9OLmZpZWxkc19ieV9uYW1lWyduYW1lJ10ubWVzc2FnZV90eXBlID0gX1VOSU5URVJQUkVURURPUFRJT05fTkFNRVBBUlQKK19TT1VSQ0VDT0RFSU5GT19MT0NBVElPTi5jb250YWluaW5nX3R5cGUgPSBfU09VUkNFQ09ERUlORk8KK19TT1VSQ0VDT0RFSU5GTy5maWVsZHNfYnlfbmFtZVsnbG9jYXRpb24nXS5tZXNzYWdlX3R5cGUgPSBfU09VUkNFQ09ERUlORk9fTE9DQVRJT04KK19HRU5FUkFURURDT0RFSU5GT19BTk5PVEFUSU9OLmNvbnRhaW5pbmdfdHlwZSA9IF9HRU5FUkFURURDT0RFSU5GTworX0dFTkVSQVRFRENPREVJTkZPLmZpZWxkc19ieV9uYW1lWydhbm5vdGF0aW9uJ10ubWVzc2FnZV90eXBlID0gX0dFTkVSQVRFRENPREVJTkZPX0FOTk9UQVRJT04KK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydGaWxlRGVzY3JpcHRvclNldCddID0gX0ZJTEVERVNDUklQVE9SU0VUCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnRmlsZURlc2NyaXB0b3JQcm90byddID0gX0ZJTEVERVNDUklQVE9SUFJPVE8KK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydEZXNjcmlwdG9yUHJvdG8nXSA9IF9ERVNDUklQVE9SUFJPVE8KK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydFeHRlbnNpb25SYW5nZU9wdGlvbnMnXSA9IF9FWFRFTlNJT05SQU5HRU9QVElPTlMKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydGaWVsZERlc2NyaXB0b3JQcm90byddID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnT25lb2ZEZXNjcmlwdG9yUHJvdG8nXSA9IF9PTkVPRkRFU0NSSVBUT1JQUk9UTworREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ0VudW1EZXNjcmlwdG9yUHJvdG8nXSA9IF9FTlVNREVTQ1JJUFRPUlBST1RPCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJ10gPSBfRU5VTVZBTFVFREVTQ1JJUFRPUlBST1RPCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnU2VydmljZURlc2NyaXB0b3JQcm90byddID0gX1NFUlZJQ0VERVNDUklQVE9SUFJPVE8KK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydNZXRob2REZXNjcmlwdG9yUHJvdG8nXSA9IF9NRVRIT0RERVNDUklQVE9SUFJPVE8KK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydGaWxlT3B0aW9ucyddID0gX0ZJTEVPUFRJT05TCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnTWVzc2FnZU9wdGlvbnMnXSA9IF9NRVNTQUdFT1BUSU9OUworREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ0ZpZWxkT3B0aW9ucyddID0gX0ZJRUxET1BUSU9OUworREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ09uZW9mT3B0aW9ucyddID0gX09ORU9GT1BUSU9OUworREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ0VudW1PcHRpb25zJ10gPSBfRU5VTU9QVElPTlMKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydFbnVtVmFsdWVPcHRpb25zJ10gPSBfRU5VTVZBTFVFT1BUSU9OUworREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ1NlcnZpY2VPcHRpb25zJ10gPSBfU0VSVklDRU9QVElPTlMKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydNZXRob2RPcHRpb25zJ10gPSBfTUVUSE9ET1BUSU9OUworREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ1VuaW50ZXJwcmV0ZWRPcHRpb24nXSA9IF9VTklOVEVSUFJFVEVET1BUSU9OCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnU291cmNlQ29kZUluZm8nXSA9IF9TT1VSQ0VDT0RFSU5GTworREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ0dlbmVyYXRlZENvZGVJbmZvJ10gPSBfR0VORVJBVEVEQ09ERUlORk8KK19zeW1fZGIuUmVnaXN0ZXJGaWxlRGVzY3JpcHRvcihERVNDUklQVE9SKQorCitGaWxlRGVzY3JpcHRvclNldCA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0ZpbGVEZXNjcmlwdG9yU2V0JywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfRklMRURFU0NSSVBUT1JTRVQsCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKEZpbGVEZXNjcmlwdG9yU2V0KQorCitGaWxlRGVzY3JpcHRvclByb3RvID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnRmlsZURlc2NyaXB0b3JQcm90bycsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX0ZJTEVERVNDUklQVE9SUFJPVE8sCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoRmlsZURlc2NyaXB0b3JQcm90bykKKworRGVzY3JpcHRvclByb3RvID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnRGVzY3JpcHRvclByb3RvJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworCisgICdFeHRlbnNpb25SYW5nZScgOiBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdFeHRlbnNpb25SYW5nZScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfREVTQ1JJUFRPUlBST1RPX0VYVEVOU0lPTlJBTkdFLAorICAgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wYjInCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKKyAgICB9KQorICAsCisKKyAgJ1Jlc2VydmVkUmFuZ2UnIDogX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnUmVzZXJ2ZWRSYW5nZScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfREVTQ1JJUFRPUlBST1RPX1JFU0VSVkVEUkFOR0UsCisgICAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKKyAgICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCisgICAgfSkKKyAgLAorICAnREVTQ1JJUFRPUicgOiBfREVTQ1JJUFRPUlBST1RPLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoRGVzY3JpcHRvclByb3RvKQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCisKK0V4dGVuc2lvblJhbmdlT3B0aW9ucyA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0V4dGVuc2lvblJhbmdlT3B0aW9ucycsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX0VYVEVOU0lPTlJBTkdFT1BUSU9OUywKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucykKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKEV4dGVuc2lvblJhbmdlT3B0aW9ucykKKworRmllbGREZXNjcmlwdG9yUHJvdG8gPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdGaWVsZERlc2NyaXB0b3JQcm90bycsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX0ZJRUxEREVTQ1JJUFRPUlBST1RPLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShGaWVsZERlc2NyaXB0b3JQcm90bykKKworT25lb2ZEZXNjcmlwdG9yUHJvdG8gPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdPbmVvZkRlc2NyaXB0b3JQcm90bycsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX09ORU9GREVTQ1JJUFRPUlBST1RPLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShPbmVvZkRlc2NyaXB0b3JQcm90bykKKworRW51bURlc2NyaXB0b3JQcm90byA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0VudW1EZXNjcmlwdG9yUHJvdG8nLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisKKyAgJ0VudW1SZXNlcnZlZFJhbmdlJyA6IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0VudW1SZXNlcnZlZFJhbmdlJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAgICdERVNDUklQVE9SJyA6IF9FTlVNREVTQ1JJUFRPUlBST1RPX0VOVU1SRVNFUlZFRFJBTkdFLAorICAgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wYjInCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2UpCisgICAgfSkKKyAgLAorICAnREVTQ1JJUFRPUicgOiBfRU5VTURFU0NSSVBUT1JQUk9UTywKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShFbnVtRGVzY3JpcHRvclByb3RvKQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZSkKKworRW51bVZhbHVlRGVzY3JpcHRvclByb3RvID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfRU5VTVZBTFVFREVTQ1JJUFRPUlBST1RPLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQorCitTZXJ2aWNlRGVzY3JpcHRvclByb3RvID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnU2VydmljZURlc2NyaXB0b3JQcm90bycsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX1NFUlZJQ0VERVNDUklQVE9SUFJPVE8sCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoU2VydmljZURlc2NyaXB0b3JQcm90bykKKworTWV0aG9kRGVzY3JpcHRvclByb3RvID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnTWV0aG9kRGVzY3JpcHRvclByb3RvJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfTUVUSE9EREVTQ1JJUFRPUlBST1RPLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoTWV0aG9kRGVzY3JpcHRvclByb3RvKQorCitGaWxlT3B0aW9ucyA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0ZpbGVPcHRpb25zJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfRklMRU9QVElPTlMsCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKEZpbGVPcHRpb25zKQorCitNZXNzYWdlT3B0aW9ucyA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ01lc3NhZ2VPcHRpb25zJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfTUVTU0FHRU9QVElPTlMsCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKE1lc3NhZ2VPcHRpb25zKQorCitGaWVsZE9wdGlvbnMgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdGaWVsZE9wdGlvbnMnLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICdERVNDUklQVE9SJyA6IF9GSUVMRE9QVElPTlMsCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShGaWVsZE9wdGlvbnMpCisKK09uZW9mT3B0aW9ucyA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ09uZW9mT3B0aW9ucycsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX09ORU9GT1BUSU9OUywKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucykKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKE9uZW9mT3B0aW9ucykKKworRW51bU9wdGlvbnMgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdFbnVtT3B0aW9ucycsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX0VOVU1PUFRJT05TLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShFbnVtT3B0aW9ucykKKworRW51bVZhbHVlT3B0aW9ucyA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0VudW1WYWx1ZU9wdGlvbnMnLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICdERVNDUklQVE9SJyA6IF9FTlVNVkFMVUVPUFRJT05TLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKEVudW1WYWx1ZU9wdGlvbnMpCisKK1NlcnZpY2VPcHRpb25zID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnU2VydmljZU9wdGlvbnMnLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICdERVNDUklQVE9SJyA6IF9TRVJWSUNFT1BUSU9OUywKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoU2VydmljZU9wdGlvbnMpCisKK01ldGhvZE9wdGlvbnMgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdNZXRob2RPcHRpb25zJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfTUVUSE9ET1BUSU9OUywKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShNZXRob2RPcHRpb25zKQorCitVbmludGVycHJldGVkT3B0aW9uID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnVW5pbnRlcnByZXRlZE9wdGlvbicsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKworICAnTmFtZVBhcnQnIDogX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnTmFtZVBhcnQnLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICAgJ0RFU0NSSVBUT1InIDogX1VOSU5URVJQUkVURURPUFRJT05fTkFNRVBBUlQsCisgICAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKKyAgICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKKyAgICB9KQorICAsCisgICdERVNDUklQVE9SJyA6IF9VTklOVEVSUFJFVEVET1BUSU9OLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbikKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKFVuaW50ZXJwcmV0ZWRPcHRpb24pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShVbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQorCitTb3VyY2VDb2RlSW5mbyA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ1NvdXJjZUNvZGVJbmZvJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworCisgICdMb2NhdGlvbicgOiBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdMb2NhdGlvbicsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfU09VUkNFQ09ERUlORk9fTE9DQVRJT04sCisgICAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKKyAgICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCisgICAgfSkKKyAgLAorICAnREVTQ1JJUFRPUicgOiBfU09VUkNFQ09ERUlORk8sCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKFNvdXJjZUNvZGVJbmZvKQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoU291cmNlQ29kZUluZm8uTG9jYXRpb24pCisKK0dlbmVyYXRlZENvZGVJbmZvID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnR2VuZXJhdGVkQ29kZUluZm8nLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisKKyAgJ0Fubm90YXRpb24nIDogX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnQW5ub3RhdGlvbicsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfR0VORVJBVEVEQ09ERUlORk9fQU5OT1RBVElPTiwKKyAgICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJworICAgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uKQorICAgIH0pCisgICwKKyAgJ0RFU0NSSVBUT1InIDogX0dFTkVSQVRFRENPREVJTkZPLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShHZW5lcmF0ZWRDb2RlSW5mbykKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKEdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCisKKworIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobW9kdWxlX3Njb3BlKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3Bvb2wucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfcG9vbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTEzNzJhCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3Bvb2wucHkKQEAgLTAsMCArMSwxMjk1IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlByb3ZpZGVzIERlc2NyaXB0b3JQb29sIHRvIHVzZSBhcyBhIGNvbnRhaW5lciBmb3IgcHJvdG8yIGRlc2NyaXB0b3JzLgorCitUaGUgRGVzY3JpcHRvclBvb2wgaXMgdXNlZCBpbiBjb25qZWN0aW9uIHdpdGggYSBEZXNjcmlwdG9yRGF0YWJhc2UgdG8gbWFpbnRhaW4KK2EgY29sbGVjdGlvbiBvZiBwcm90b2NvbCBidWZmZXIgZGVzY3JpcHRvcnMgZm9yIHVzZSB3aGVuIGR5bmFtaWNhbGx5IGNyZWF0aW5nCittZXNzYWdlIHR5cGVzIGF0IHJ1bnRpbWUuCisKK0ZvciBtb3N0IGFwcGxpY2F0aW9ucyBwcm90b2NvbCBidWZmZXJzIHNob3VsZCBiZSB1c2VkIHZpYSBtb2R1bGVzIGdlbmVyYXRlZCBieQordGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlciB0b29sLiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgdHlwZSBvZgorcHJvdG9jb2wgYnVmZmVycyB1c2VkIGluIGFuIGFwcGxpY2F0aW9uIG9yIGxpYnJhcnkgY2Fubm90IGJlIHByZWRldGVybWluZWQuCisKK0JlbG93IGlzIGEgc3RyYWlnaHRmb3J3YXJkIGV4YW1wbGUgb24gaG93IHRvIHVzZSB0aGlzIGNsYXNzOjoKKworICBwb29sID0gRGVzY3JpcHRvclBvb2woKQorICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG9zID0gWyAuLi4gXQorICBmb3IgZmlsZV9kZXNjcmlwdG9yX3Byb3RvIGluIGZpbGVfZGVzY3JpcHRvcl9wcm90b3M6CisgICAgcG9vbC5BZGQoZmlsZV9kZXNjcmlwdG9yX3Byb3RvKQorICBteV9tZXNzYWdlX2Rlc2NyaXB0b3IgPSBwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgnc29tZS5wYWNrYWdlLk1lc3NhZ2VUeXBlJykKKworVGhlIG1lc3NhZ2UgZGVzY3JpcHRvciBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBtZXNzYWdlX2ZhY3RvcnkKK21vZHVsZSBpbiBvcmRlciB0byBjcmVhdGUgYSBwcm90b2NvbCBidWZmZXIgY2xhc3MgdGhhdCBjYW4gYmUgZW5jb2RlZCBhbmQKK2RlY29kZWQuCisKK0lmIHlvdSB3YW50IHRvIGdldCBhIFB5dGhvbiBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBwcm90bywgdXNlIHRoZQoraGVscGVyIGZ1bmN0aW9ucyBpbnNpZGUgZ29vZ2xlLnByb3RvYnVmLm1lc3NhZ2VfZmFjdG9yeQorZGlyZWN0bHkgaW5zdGVhZCBvZiB0aGlzIGNsYXNzLgorIiIiCisKK19fYXV0aG9yX18gPSAnbWF0dGhld3RvaWFAZ29vZ2xlLmNvbSAoTWF0dCBUb2lhKScKKworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgd2FybmluZ3MKKworZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX2RhdGFiYXNlCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdGV4dF9lbmNvZGluZworCisKK19VU0VfQ19ERVNDUklQVE9SUyA9IGRlc2NyaXB0b3IuX1VTRV9DX0RFU0NSSVBUT1JTICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisKKworZGVmIF9EZXByZWNhdGVkKGZ1bmMpOgorICAiIiJNYXJrIGZ1bmN0aW9ucyBhcyBkZXByZWNhdGVkLiIiIgorCisgIGRlZiBOZXdGdW5jKCphcmdzLCAqKmt3YXJncyk6CisgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgJ0NhbGwgdG8gZGVwcmVjYXRlZCBmdW5jdGlvbiAlcygpLiBOb3RlOiBEbyBhZGQgdW5saW5rZWQgZGVzY3JpcHRvcnMgJworICAgICAgICAndG8gZGVzY3JpcHRvcl9wb29sIGlzIHdyb25nLiBVc2UgQWRkKCkgb3IgQWRkU2VyaWFsaXplZEZpbGUoKSAnCisgICAgICAgICdpbnN0ZWFkLicgJSBmdW5jLl9fbmFtZV9fLAorICAgICAgICBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcpCisgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQorICBOZXdGdW5jLl9fbmFtZV9fID0gZnVuYy5fX25hbWVfXworICBOZXdGdW5jLl9fZG9jX18gPSBmdW5jLl9fZG9jX18KKyAgTmV3RnVuYy5fX2RpY3RfXy51cGRhdGUoZnVuYy5fX2RpY3RfXykKKyAgcmV0dXJuIE5ld0Z1bmMKKworCitkZWYgX05vcm1hbGl6ZUZ1bGx5UXVhbGlmaWVkTmFtZShuYW1lKToKKyAgIiIiUmVtb3ZlIGxlYWRpbmcgcGVyaW9kIGZyb20gZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZS4KKworICBEdWUgdG8gYi8xMzg2MDM1MSBpbiBkZXNjcmlwdG9yX2RhdGFiYXNlLnB5LCB0eXBlcyBpbiB0aGUgcm9vdCBuYW1lc3BhY2UgYXJlCisgIGdlbmVyYXRlZCB3aXRoIGEgbGVhZGluZyBwZXJpb2QuIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGF0IHByZWZpeC4KKworICBBcmdzOgorICAgIG5hbWUgKHN0cik6IFRoZSBmdWxseS1xdWFsaWZpZWQgc3ltYm9sIG5hbWUuCisKKyAgUmV0dXJuczoKKyAgICBzdHI6IFRoZSBub3JtYWxpemVkIGZ1bGx5LXF1YWxpZmllZCBzeW1ib2wgbmFtZS4KKyAgIiIiCisgIHJldHVybiBuYW1lLmxzdHJpcCgnLicpCisKKworZGVmIF9PcHRpb25zT3JOb25lKGRlc2NyaXB0b3JfcHJvdG8pOgorICAiIiJSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgYG9wdGlvbnNgLCBvciBOb25lIGlmIGl0IGlzIG5vdCBzZXQuIiIiCisgIGlmIGRlc2NyaXB0b3JfcHJvdG8uSGFzRmllbGQoJ29wdGlvbnMnKToKKyAgICByZXR1cm4gZGVzY3JpcHRvcl9wcm90by5vcHRpb25zCisgIGVsc2U6CisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgX0lzTWVzc2FnZVNldEV4dGVuc2lvbihmaWVsZCk6CisgIHJldHVybiAoZmllbGQuaXNfZXh0ZW5zaW9uIGFuZAorICAgICAgICAgIGZpZWxkLmNvbnRhaW5pbmdfdHlwZS5oYXNfb3B0aW9ucyBhbmQKKyAgICAgICAgICBmaWVsZC5jb250YWluaW5nX3R5cGUuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IGFuZAorICAgICAgICAgIGZpZWxkLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFIGFuZAorICAgICAgICAgIGZpZWxkLmxhYmVsID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBQkVMX09QVElPTkFMKQorCisKK2NsYXNzIERlc2NyaXB0b3JQb29sKG9iamVjdCk6CisgICIiIkEgY29sbGVjdGlvbiBvZiBwcm90b2J1ZnMgZHluYW1pY2FsbHkgY29uc3RydWN0ZWQgYnkgZGVzY3JpcHRvciBwcm90b3MuIiIiCisKKyAgaWYgX1VTRV9DX0RFU0NSSVBUT1JTOgorCisgICAgZGVmIF9fbmV3X18oY2xzLCBkZXNjcmlwdG9yX2RiPU5vbmUpOgorICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuX21lc3NhZ2UuRGVzY3JpcHRvclBvb2woZGVzY3JpcHRvcl9kYikKKworICBkZWYgX19pbml0X18oc2VsZiwgZGVzY3JpcHRvcl9kYj1Ob25lKToKKyAgICAiIiJJbml0aWFsaXplcyBhIFBvb2wgb2YgcHJvdG8gYnVmZnMuCisKKyAgICBUaGUgZGVzY3JpcHRvcl9kYiBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3IgaXMgcHJvdmlkZWQgdG8gYWxsb3cKKyAgICBzcGVjaWFsaXplZCBmaWxlIGRlc2NyaXB0b3IgcHJvdG8gbG9va3VwIGNvZGUgdG8gYmUgdHJpZ2dlcmVkIG9uIGRlbWFuZC4gQW4KKyAgICBleGFtcGxlIHdvdWxkIGJlIGFuIGltcGxlbWVudGF0aW9uIHdoaWNoIHdpbGwgcmVhZCBhbmQgY29tcGlsZSBhIGZpbGUKKyAgICBzcGVjaWZpZWQgaW4gYSBjYWxsIHRvIEZpbmRGaWxlQnlOYW1lKCkgYW5kIG5vdCByZXF1aXJlIHRoZSBjYWxsIHRvIEFkZCgpCisgICAgYXQgYWxsLiBSZXN1bHRzIGZyb20gdGhpcyBkYXRhYmFzZSB3aWxsIGJlIGNhY2hlZCBpbnRlcm5hbGx5IGhlcmUgYXMgd2VsbC4KKworICAgIEFyZ3M6CisgICAgICBkZXNjcmlwdG9yX2RiOiBBIHNlY29uZGFyeSBzb3VyY2Ugb2YgZmlsZSBkZXNjcmlwdG9ycy4KKyAgICAiIiIKKworICAgIHNlbGYuX2ludGVybmFsX2RiID0gZGVzY3JpcHRvcl9kYXRhYmFzZS5EZXNjcmlwdG9yRGF0YWJhc2UoKQorICAgIHNlbGYuX2Rlc2NyaXB0b3JfZGIgPSBkZXNjcmlwdG9yX2RiCisgICAgc2VsZi5fZGVzY3JpcHRvcnMgPSB7fQorICAgIHNlbGYuX2VudW1fZGVzY3JpcHRvcnMgPSB7fQorICAgIHNlbGYuX3NlcnZpY2VfZGVzY3JpcHRvcnMgPSB7fQorICAgIHNlbGYuX2ZpbGVfZGVzY3JpcHRvcnMgPSB7fQorICAgIHNlbGYuX3RvcGxldmVsX2V4dGVuc2lvbnMgPSB7fQorICAgICMgVE9ETyhqaWVsdW8pOiBSZW1vdmUgX2ZpbGVfZGVzY19ieV90b3BsZXZlbF9leHRlbnNpb24gYWZ0ZXIKKyAgICAjIG1heWJlIHllYXIgMjAyMCBmb3IgY29tcGF0aWJpbGl0eSBpc3N1ZSAod2l0aCAzLjQuMSBvbmx5KS4KKyAgICBzZWxmLl9maWxlX2Rlc2NfYnlfdG9wbGV2ZWxfZXh0ZW5zaW9uID0ge30KKyAgICBzZWxmLl90b3BfZW51bV92YWx1ZXMgPSB7fQorICAgICMgV2Ugc3RvcmUgZXh0ZW5zaW9ucyBpbiB0d28gdHdvLWxldmVsIG1hcHBpbmdzOiBUaGUgZmlyc3Qga2V5IGlzIHRoZQorICAgICMgZGVzY3JpcHRvciBvZiB0aGUgbWVzc2FnZSBiZWluZyBleHRlbmRlZCwgdGhlIHNlY29uZCBrZXkgaXMgdGhlIGV4dGVuc2lvbgorICAgICMgZnVsbCBuYW1lIG9yIGl0cyB0YWcgbnVtYmVyLgorICAgIHNlbGYuX2V4dGVuc2lvbnNfYnlfbmFtZSA9IGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0KGRpY3QpCisgICAgc2VsZi5fZXh0ZW5zaW9uc19ieV9udW1iZXIgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChkaWN0KQorCisgIGRlZiBfQ2hlY2tDb25mbGljdFJlZ2lzdGVyKHNlbGYsIGRlc2MsIGRlc2NfbmFtZSwgZmlsZV9uYW1lKToKKyAgICAiIiJDaGVjayBpZiB0aGUgZGVzY3JpcHRvciBuYW1lIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgb2YgdGhlIHNhbWUgbmFtZS4KKworICAgIEFyZ3M6CisgICAgICBkZXNjOiBEZXNjcmlwdG9yIG9mIGEgbWVzc2FnZSwgZW51bSwgc2VydmljZSwgZXh0ZW5zaW9uIG9yIGVudW0gdmFsdWUuCisgICAgICBkZXNjX25hbWUgKHN0cik6IHRoZSBmdWxsIG5hbWUgb2YgZGVzYy4KKyAgICAgIGZpbGVfbmFtZSAoc3RyKTogVGhlIGZpbGUgbmFtZSBvZiBkZXNjcmlwdG9yLgorICAgICIiIgorICAgIGZvciByZWdpc3RlciwgZGVzY3JpcHRvcl90eXBlIGluIFsKKyAgICAgICAgKHNlbGYuX2Rlc2NyaXB0b3JzLCBkZXNjcmlwdG9yLkRlc2NyaXB0b3IpLAorICAgICAgICAoc2VsZi5fZW51bV9kZXNjcmlwdG9ycywgZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvciksCisgICAgICAgIChzZWxmLl9zZXJ2aWNlX2Rlc2NyaXB0b3JzLCBkZXNjcmlwdG9yLlNlcnZpY2VEZXNjcmlwdG9yKSwKKyAgICAgICAgKHNlbGYuX3RvcGxldmVsX2V4dGVuc2lvbnMsIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKSwKKyAgICAgICAgKHNlbGYuX3RvcF9lbnVtX3ZhbHVlcywgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKV06CisgICAgICBpZiBkZXNjX25hbWUgaW4gcmVnaXN0ZXI6CisgICAgICAgIG9sZF9kZXNjID0gcmVnaXN0ZXJbZGVzY19uYW1lXQorICAgICAgICBpZiBpc2luc3RhbmNlKG9sZF9kZXNjLCBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IpOgorICAgICAgICAgIG9sZF9maWxlID0gb2xkX2Rlc2MudHlwZS5maWxlLm5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBvbGRfZmlsZSA9IG9sZF9kZXNjLmZpbGUubmFtZQorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRlc2MsIGRlc2NyaXB0b3JfdHlwZSkgb3IgKAorICAgICAgICAgICAgb2xkX2ZpbGUgIT0gZmlsZV9uYW1lKToKKyAgICAgICAgICBlcnJvcl9tc2cgPSAoJ0NvbmZsaWN0IHJlZ2lzdGVyIGZvciBmaWxlICInICsgZmlsZV9uYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgJyI6ICcgKyBkZXNjX25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAnIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBmaWxlICInICsKKyAgICAgICAgICAgICAgICAgICAgICAgb2xkX2ZpbGUgKyAnIi4gUGxlYXNlIGZpeCB0aGUgY29uZmxpY3QgYnkgYWRkaW5nICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ3BhY2thZ2UgbmFtZSBvbiB0aGUgcHJvdG8gZmlsZSwgb3IgdXNlIGRpZmZlcmVudCAnCisgICAgICAgICAgICAgICAgICAgICAgICduYW1lIGZvciB0aGUgZHVwbGljYXRpb24uJykKKyAgICAgICAgICBpZiBpc2luc3RhbmNlKGRlc2MsIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcik6CisgICAgICAgICAgICBlcnJvcl9tc2cgKz0gKCdcbk5vdGU6IGVudW0gdmFsdWVzIGFwcGVhciBhcyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzaWJsaW5ncyBvZiB0aGUgZW51bSB0eXBlIGluc3RlYWQgb2YgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnY2hpbGRyZW4gb2YgaXQuJykKKworICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihlcnJvcl9tc2cpCisKKyAgICAgICAgcmV0dXJuCisKKyAgZGVmIEFkZChzZWxmLCBmaWxlX2Rlc2NfcHJvdG8pOgorICAgICIiIkFkZHMgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gYW5kIGl0cyB0eXBlcyB0byB0aGlzIHBvb2wuCisKKyAgICBBcmdzOgorICAgICAgZmlsZV9kZXNjX3Byb3RvIChGaWxlRGVzY3JpcHRvclByb3RvKTogVGhlIGZpbGUgZGVzY3JpcHRvciB0byBhZGQuCisgICAgIiIiCisKKyAgICBzZWxmLl9pbnRlcm5hbF9kYi5BZGQoZmlsZV9kZXNjX3Byb3RvKQorCisgIGRlZiBBZGRTZXJpYWxpemVkRmlsZShzZWxmLCBzZXJpYWxpemVkX2ZpbGVfZGVzY19wcm90byk6CisgICAgIiIiQWRkcyB0aGUgRmlsZURlc2NyaXB0b3JQcm90byBhbmQgaXRzIHR5cGVzIHRvIHRoaXMgcG9vbC4KKworICAgIEFyZ3M6CisgICAgICBzZXJpYWxpemVkX2ZpbGVfZGVzY19wcm90byAoYnl0ZXMpOiBBIGJ5dGVzIHN0cmluZywgc2VyaWFsaXphdGlvbiBvZiB0aGUKKyAgICAgICAgOmNsYXNzOmBGaWxlRGVzY3JpcHRvclByb3RvYCB0byBhZGQuCisKKyAgICBSZXR1cm5zOgorICAgICAgRmlsZURlc2NyaXB0b3I6IERlc2NyaXB0b3IgZm9yIHRoZSBhZGRlZCBmaWxlLgorICAgICIiIgorCisgICAgIyBweWxpbnQ6IGRpc2FibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAorICAgIGZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgorICAgIGZpbGVfZGVzY19wcm90byA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKKyAgICAgICAgc2VyaWFsaXplZF9maWxlX2Rlc2NfcHJvdG8pCisgICAgZmlsZV9kZXNjID0gc2VsZi5fQ29udmVydEZpbGVQcm90b1RvRmlsZURlc2NyaXB0b3IoZmlsZV9kZXNjX3Byb3RvKQorICAgIGZpbGVfZGVzYy5zZXJpYWxpemVkX3BiID0gc2VyaWFsaXplZF9maWxlX2Rlc2NfcHJvdG8KKyAgICByZXR1cm4gZmlsZV9kZXNjCisKKyAgIyBBZGQgRGVzY3JpcHRvciB0byBkZXNjcmlwdG9yIHBvb2wgaXMgZHJlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgQWRkKCkKKyAgIyBvciBBZGRTZXJpYWxpemVkRmlsZSgpIHRvIGFkZCBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gaW5zdGVhZC4KKyAgQF9EZXByZWNhdGVkCisgIGRlZiBBZGREZXNjcmlwdG9yKHNlbGYsIGRlc2MpOgorICAgIHNlbGYuX0FkZERlc2NyaXB0b3IoZGVzYykKKworICAjIE5ldmVyIGNhbGwgdGhpcyBtZXRob2QuIEl0IGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5LgorICBkZWYgX0FkZERlc2NyaXB0b3Ioc2VsZiwgZGVzYyk6CisgICAgIiIiQWRkcyBhIERlc2NyaXB0b3IgdG8gdGhlIHBvb2wsIG5vbi1yZWN1cnNpdmVseS4KKworICAgIElmIHRoZSBEZXNjcmlwdG9yIGNvbnRhaW5zIG5lc3RlZCBtZXNzYWdlcyBvciBlbnVtcywgdGhlIGNhbGxlciBtdXN0CisgICAgZXhwbGljaXRseSByZWdpc3RlciB0aGVtLiBUaGlzIG1ldGhvZCBhbHNvIHJlZ2lzdGVycyB0aGUgRmlsZURlc2NyaXB0b3IKKyAgICBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UuCisKKyAgICBBcmdzOgorICAgICAgZGVzYzogQSBEZXNjcmlwdG9yLgorICAgICIiIgorICAgIGlmIG5vdCBpc2luc3RhbmNlKGRlc2MsIGRlc2NyaXB0b3IuRGVzY3JpcHRvcik6CisgICAgICByYWlzZSBUeXBlRXJyb3IoJ0V4cGVjdGVkIGluc3RhbmNlIG9mIGRlc2NyaXB0b3IuRGVzY3JpcHRvci4nKQorCisgICAgc2VsZi5fQ2hlY2tDb25mbGljdFJlZ2lzdGVyKGRlc2MsIGRlc2MuZnVsbF9uYW1lLCBkZXNjLmZpbGUubmFtZSkKKworICAgIHNlbGYuX2Rlc2NyaXB0b3JzW2Rlc2MuZnVsbF9uYW1lXSA9IGRlc2MKKyAgICBzZWxmLl9BZGRGaWxlRGVzY3JpcHRvcihkZXNjLmZpbGUpCisKKyAgIyBBZGQgRW51bURlc2NyaXB0b3IgdG8gZGVzY3JpcHRvciBwb29sIGlzIGRyZXByZWNhdGVkLiBQbGVhc2UgdXNlIEFkZCgpCisgICMgb3IgQWRkU2VyaWFsaXplZEZpbGUoKSB0byBhZGQgYSBGaWxlRGVzY3JpcHRvclByb3RvIGluc3RlYWQuCisgIEBfRGVwcmVjYXRlZAorICBkZWYgQWRkRW51bURlc2NyaXB0b3Ioc2VsZiwgZW51bV9kZXNjKToKKyAgICBzZWxmLl9BZGRFbnVtRGVzY3JpcHRvcihlbnVtX2Rlc2MpCisKKyAgIyBOZXZlciBjYWxsIHRoaXMgbWV0aG9kLiBJdCBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seS4KKyAgZGVmIF9BZGRFbnVtRGVzY3JpcHRvcihzZWxmLCBlbnVtX2Rlc2MpOgorICAgICIiIkFkZHMgYW4gRW51bURlc2NyaXB0b3IgdG8gdGhlIHBvb2wuCisKKyAgICBUaGlzIG1ldGhvZCBhbHNvIHJlZ2lzdGVycyB0aGUgRmlsZURlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnVtLgorCisgICAgQXJnczoKKyAgICAgIGVudW1fZGVzYzogQW4gRW51bURlc2NyaXB0b3IuCisgICAgIiIiCisKKyAgICBpZiBub3QgaXNpbnN0YW5jZShlbnVtX2Rlc2MsIGRlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IpOgorICAgICAgcmFpc2UgVHlwZUVycm9yKCdFeHBlY3RlZCBpbnN0YW5jZSBvZiBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yLicpCisKKyAgICBmaWxlX25hbWUgPSBlbnVtX2Rlc2MuZmlsZS5uYW1lCisgICAgc2VsZi5fQ2hlY2tDb25mbGljdFJlZ2lzdGVyKGVudW1fZGVzYywgZW51bV9kZXNjLmZ1bGxfbmFtZSwgZmlsZV9uYW1lKQorICAgIHNlbGYuX2VudW1fZGVzY3JpcHRvcnNbZW51bV9kZXNjLmZ1bGxfbmFtZV0gPSBlbnVtX2Rlc2MKKworICAgICMgVG9wIGVudW0gdmFsdWVzIG5lZWQgdG8gYmUgaW5kZXhlZC4KKyAgICAjIENvdW50IHRoZSBudW1iZXIgb2YgZG90cyB0byBzZWUgd2hldGhlciB0aGUgZW51bSBpcyB0b3BsZXZlbCBvciBuZXN0ZWQKKyAgICAjIGluIGEgbWVzc2FnZS4gV2UgY2Fubm90IHVzZSBlbnVtX2Rlc2MuY29udGFpbmluZ190eXBlIGF0IHRoaXMgc3RhZ2UuCisgICAgaWYgZW51bV9kZXNjLmZpbGUucGFja2FnZToKKyAgICAgIHRvcF9sZXZlbCA9IChlbnVtX2Rlc2MuZnVsbF9uYW1lLmNvdW50KCcuJykKKyAgICAgICAgICAgICAgICAgICAtIGVudW1fZGVzYy5maWxlLnBhY2thZ2UuY291bnQoJy4nKSA9PSAxKQorICAgIGVsc2U6CisgICAgICB0b3BfbGV2ZWwgPSBlbnVtX2Rlc2MuZnVsbF9uYW1lLmNvdW50KCcuJykgPT0gMAorICAgIGlmIHRvcF9sZXZlbDoKKyAgICAgIGZpbGVfbmFtZSA9IGVudW1fZGVzYy5maWxlLm5hbWUKKyAgICAgIHBhY2thZ2UgPSBlbnVtX2Rlc2MuZmlsZS5wYWNrYWdlCisgICAgICBmb3IgZW51bV92YWx1ZSBpbiBlbnVtX2Rlc2MudmFsdWVzOgorICAgICAgICBmdWxsX25hbWUgPSBfTm9ybWFsaXplRnVsbHlRdWFsaWZpZWROYW1lKAorICAgICAgICAgICAgJy4nLmpvaW4oKHBhY2thZ2UsIGVudW1fdmFsdWUubmFtZSkpKQorICAgICAgICBzZWxmLl9DaGVja0NvbmZsaWN0UmVnaXN0ZXIoZW51bV92YWx1ZSwgZnVsbF9uYW1lLCBmaWxlX25hbWUpCisgICAgICAgIHNlbGYuX3RvcF9lbnVtX3ZhbHVlc1tmdWxsX25hbWVdID0gZW51bV92YWx1ZQorICAgIHNlbGYuX0FkZEZpbGVEZXNjcmlwdG9yKGVudW1fZGVzYy5maWxlKQorCisgICMgQWRkIFNlcnZpY2VEZXNjcmlwdG9yIHRvIGRlc2NyaXB0b3IgcG9vbCBpcyBkcmVwcmVjYXRlZC4gUGxlYXNlIHVzZSBBZGQoKQorICAjIG9yIEFkZFNlcmlhbGl6ZWRGaWxlKCkgdG8gYWRkIGEgRmlsZURlc2NyaXB0b3JQcm90byBpbnN0ZWFkLgorICBAX0RlcHJlY2F0ZWQKKyAgZGVmIEFkZFNlcnZpY2VEZXNjcmlwdG9yKHNlbGYsIHNlcnZpY2VfZGVzYyk6CisgICAgc2VsZi5fQWRkU2VydmljZURlc2NyaXB0b3Ioc2VydmljZV9kZXNjKQorCisgICMgTmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4gSXQgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkuCisgIGRlZiBfQWRkU2VydmljZURlc2NyaXB0b3Ioc2VsZiwgc2VydmljZV9kZXNjKToKKyAgICAiIiJBZGRzIGEgU2VydmljZURlc2NyaXB0b3IgdG8gdGhlIHBvb2wuCisKKyAgICBBcmdzOgorICAgICAgc2VydmljZV9kZXNjOiBBIFNlcnZpY2VEZXNjcmlwdG9yLgorICAgICIiIgorCisgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VydmljZV9kZXNjLCBkZXNjcmlwdG9yLlNlcnZpY2VEZXNjcmlwdG9yKToKKyAgICAgIHJhaXNlIFR5cGVFcnJvcignRXhwZWN0ZWQgaW5zdGFuY2Ugb2YgZGVzY3JpcHRvci5TZXJ2aWNlRGVzY3JpcHRvci4nKQorCisgICAgc2VsZi5fQ2hlY2tDb25mbGljdFJlZ2lzdGVyKHNlcnZpY2VfZGVzYywgc2VydmljZV9kZXNjLmZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9kZXNjLmZpbGUubmFtZSkKKyAgICBzZWxmLl9zZXJ2aWNlX2Rlc2NyaXB0b3JzW3NlcnZpY2VfZGVzYy5mdWxsX25hbWVdID0gc2VydmljZV9kZXNjCisKKyAgIyBBZGQgRXh0ZW5zaW9uRGVzY3JpcHRvciB0byBkZXNjcmlwdG9yIHBvb2wgaXMgZHJlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgQWRkKCkKKyAgIyBvciBBZGRTZXJpYWxpemVkRmlsZSgpIHRvIGFkZCBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gaW5zdGVhZC4KKyAgQF9EZXByZWNhdGVkCisgIGRlZiBBZGRFeHRlbnNpb25EZXNjcmlwdG9yKHNlbGYsIGV4dGVuc2lvbik6CisgICAgc2VsZi5fQWRkRXh0ZW5zaW9uRGVzY3JpcHRvcihleHRlbnNpb24pCisKKyAgIyBOZXZlciBjYWxsIHRoaXMgbWV0aG9kLiBJdCBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seS4KKyAgZGVmIF9BZGRFeHRlbnNpb25EZXNjcmlwdG9yKHNlbGYsIGV4dGVuc2lvbik6CisgICAgIiIiQWRkcyBhIEZpZWxkRGVzY3JpcHRvciBkZXNjcmliaW5nIGFuIGV4dGVuc2lvbiB0byB0aGUgcG9vbC4KKworICAgIEFyZ3M6CisgICAgICBleHRlbnNpb246IEEgRmllbGREZXNjcmlwdG9yLgorCisgICAgUmFpc2VzOgorICAgICAgQXNzZXJ0aW9uRXJyb3I6IHdoZW4gYW5vdGhlciBleHRlbnNpb24gd2l0aCB0aGUgc2FtZSBudW1iZXIgZXh0ZW5kcyB0aGUKKyAgICAgICAgc2FtZSBtZXNzYWdlLgorICAgICAgVHlwZUVycm9yOiB3aGVuIHRoZSBzcGVjaWZpZWQgZXh0ZW5zaW9uIGlzIG5vdCBhCisgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLgorICAgICIiIgorICAgIGlmIG5vdCAoaXNpbnN0YW5jZShleHRlbnNpb24sIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKSBhbmQKKyAgICAgICAgICAgIGV4dGVuc2lvbi5pc19leHRlbnNpb24pOgorICAgICAgcmFpc2UgVHlwZUVycm9yKCdFeHBlY3RlZCBhbiBleHRlbnNpb24gZGVzY3JpcHRvci4nKQorCisgICAgaWYgZXh0ZW5zaW9uLmV4dGVuc2lvbl9zY29wZSBpcyBOb25lOgorICAgICAgc2VsZi5fdG9wbGV2ZWxfZXh0ZW5zaW9uc1tleHRlbnNpb24uZnVsbF9uYW1lXSA9IGV4dGVuc2lvbgorCisgICAgdHJ5OgorICAgICAgZXhpc3RpbmdfZGVzYyA9IHNlbGYuX2V4dGVuc2lvbnNfYnlfbnVtYmVyWworICAgICAgICAgIGV4dGVuc2lvbi5jb250YWluaW5nX3R5cGVdW2V4dGVuc2lvbi5udW1iZXJdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICBpZiBleHRlbnNpb24gaXMgbm90IGV4aXN0aW5nX2Rlc2M6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAorICAgICAgICAgICAgJ0V4dGVuc2lvbnMgIiVzIiBhbmQgIiVzIiBib3RoIHRyeSB0byBleHRlbmQgbWVzc2FnZSB0eXBlICIlcyIgJworICAgICAgICAgICAgJ3dpdGggZmllbGQgbnVtYmVyICVkLicgJQorICAgICAgICAgICAgKGV4dGVuc2lvbi5mdWxsX25hbWUsIGV4aXN0aW5nX2Rlc2MuZnVsbF9uYW1lLAorICAgICAgICAgICAgIGV4dGVuc2lvbi5jb250YWluaW5nX3R5cGUuZnVsbF9uYW1lLCBleHRlbnNpb24ubnVtYmVyKSkKKworICAgIHNlbGYuX2V4dGVuc2lvbnNfYnlfbnVtYmVyW2V4dGVuc2lvbi5jb250YWluaW5nX3R5cGVdWworICAgICAgICBleHRlbnNpb24ubnVtYmVyXSA9IGV4dGVuc2lvbgorICAgIHNlbGYuX2V4dGVuc2lvbnNfYnlfbmFtZVtleHRlbnNpb24uY29udGFpbmluZ190eXBlXVsKKyAgICAgICAgZXh0ZW5zaW9uLmZ1bGxfbmFtZV0gPSBleHRlbnNpb24KKworICAgICMgQWxzbyByZWdpc3RlciBNZXNzYWdlU2V0IGV4dGVuc2lvbnMgd2l0aCB0aGUgdHlwZSBuYW1lLgorICAgIGlmIF9Jc01lc3NhZ2VTZXRFeHRlbnNpb24oZXh0ZW5zaW9uKToKKyAgICAgIHNlbGYuX2V4dGVuc2lvbnNfYnlfbmFtZVtleHRlbnNpb24uY29udGFpbmluZ190eXBlXVsKKyAgICAgICAgICBleHRlbnNpb24ubWVzc2FnZV90eXBlLmZ1bGxfbmFtZV0gPSBleHRlbnNpb24KKworICBAX0RlcHJlY2F0ZWQKKyAgZGVmIEFkZEZpbGVEZXNjcmlwdG9yKHNlbGYsIGZpbGVfZGVzYyk6CisgICAgc2VsZi5fSW50ZXJuYWxBZGRGaWxlRGVzY3JpcHRvcihmaWxlX2Rlc2MpCisKKyAgIyBOZXZlciBjYWxsIHRoaXMgbWV0aG9kLiBJdCBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seS4KKyAgZGVmIF9JbnRlcm5hbEFkZEZpbGVEZXNjcmlwdG9yKHNlbGYsIGZpbGVfZGVzYyk6CisgICAgIiIiQWRkcyBhIEZpbGVEZXNjcmlwdG9yIHRvIHRoZSBwb29sLCBub24tcmVjdXJzaXZlbHkuCisKKyAgICBJZiB0aGUgRmlsZURlc2NyaXB0b3IgY29udGFpbnMgbWVzc2FnZXMgb3IgZW51bXMsIHRoZSBjYWxsZXIgbXVzdCBleHBsaWNpdGx5CisgICAgcmVnaXN0ZXIgdGhlbS4KKworICAgIEFyZ3M6CisgICAgICBmaWxlX2Rlc2M6IEEgRmlsZURlc2NyaXB0b3IuCisgICAgIiIiCisKKyAgICBzZWxmLl9BZGRGaWxlRGVzY3JpcHRvcihmaWxlX2Rlc2MpCisgICAgIyBUT0RPKGppZWx1byk6IFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc29sdXRpb24gZm9yIEZpZWxkRGVzY3JpcHRvci5maWxlLgorICAgICMgRmllbGREZXNjcmlwdG9yLmZpbGUgaXMgYWRkZWQgaW4gY29kZSBnZW4uIFJlbW92ZSB0aGlzIHNvbHV0aW9uIGFmdGVyCisgICAgIyBtYXliZSAyMDIwIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbiAod2l0aCAzLjQuMSBvbmx5KS4KKyAgICBmb3IgZXh0ZW5zaW9uIGluIGZpbGVfZGVzYy5leHRlbnNpb25zX2J5X25hbWUudmFsdWVzKCk6CisgICAgICBzZWxmLl9maWxlX2Rlc2NfYnlfdG9wbGV2ZWxfZXh0ZW5zaW9uWworICAgICAgICAgIGV4dGVuc2lvbi5mdWxsX25hbWVdID0gZmlsZV9kZXNjCisKKyAgZGVmIF9BZGRGaWxlRGVzY3JpcHRvcihzZWxmLCBmaWxlX2Rlc2MpOgorICAgICIiIkFkZHMgYSBGaWxlRGVzY3JpcHRvciB0byB0aGUgcG9vbCwgbm9uLXJlY3Vyc2l2ZWx5LgorCisgICAgSWYgdGhlIEZpbGVEZXNjcmlwdG9yIGNvbnRhaW5zIG1lc3NhZ2VzIG9yIGVudW1zLCB0aGUgY2FsbGVyIG11c3QgZXhwbGljaXRseQorICAgIHJlZ2lzdGVyIHRoZW0uCisKKyAgICBBcmdzOgorICAgICAgZmlsZV9kZXNjOiBBIEZpbGVEZXNjcmlwdG9yLgorICAgICIiIgorCisgICAgaWYgbm90IGlzaW5zdGFuY2UoZmlsZV9kZXNjLCBkZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKToKKyAgICAgIHJhaXNlIFR5cGVFcnJvcignRXhwZWN0ZWQgaW5zdGFuY2Ugb2YgZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvci4nKQorICAgIHNlbGYuX2ZpbGVfZGVzY3JpcHRvcnNbZmlsZV9kZXNjLm5hbWVdID0gZmlsZV9kZXNjCisKKyAgZGVmIEZpbmRGaWxlQnlOYW1lKHNlbGYsIGZpbGVfbmFtZSk6CisgICAgIiIiR2V0cyBhIEZpbGVEZXNjcmlwdG9yIGJ5IGZpbGUgbmFtZS4KKworICAgIEFyZ3M6CisgICAgICBmaWxlX25hbWUgKHN0cik6IFRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGdldCBhIGRlc2NyaXB0b3IgZm9yLgorCisgICAgUmV0dXJuczoKKyAgICAgIEZpbGVEZXNjcmlwdG9yOiBUaGUgZGVzY3JpcHRvciBmb3IgdGhlIG5hbWVkIGZpbGUuCisKKyAgICBSYWlzZXM6CisgICAgICBLZXlFcnJvcjogaWYgdGhlIGZpbGUgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBwb29sLgorICAgICIiIgorCisgICAgdHJ5OgorICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVfZGVzY3JpcHRvcnNbZmlsZV9uYW1lXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIHBhc3MKKworICAgIHRyeToKKyAgICAgIGZpbGVfcHJvdG8gPSBzZWxmLl9pbnRlcm5hbF9kYi5GaW5kRmlsZUJ5TmFtZShmaWxlX25hbWUpCisgICAgZXhjZXB0IEtleUVycm9yIGFzIGVycm9yOgorICAgICAgaWYgc2VsZi5fZGVzY3JpcHRvcl9kYjoKKyAgICAgICAgZmlsZV9wcm90byA9IHNlbGYuX2Rlc2NyaXB0b3JfZGIuRmluZEZpbGVCeU5hbWUoZmlsZV9uYW1lKQorICAgICAgZWxzZToKKyAgICAgICAgcmFpc2UgZXJyb3IKKyAgICBpZiBub3QgZmlsZV9wcm90bzoKKyAgICAgIHJhaXNlIEtleUVycm9yKCdDYW5ub3QgZmluZCBhIGZpbGUgbmFtZWQgJXMnICUgZmlsZV9uYW1lKQorICAgIHJldHVybiBzZWxmLl9Db252ZXJ0RmlsZVByb3RvVG9GaWxlRGVzY3JpcHRvcihmaWxlX3Byb3RvKQorCisgIGRlZiBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woc2VsZiwgc3ltYm9sKToKKyAgICAiIiJHZXRzIHRoZSBGaWxlRGVzY3JpcHRvciBmb3IgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIHN5bWJvbC4KKworICAgIEFyZ3M6CisgICAgICBzeW1ib2wgKHN0cik6IFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gc2VhcmNoIGZvci4KKworICAgIFJldHVybnM6CisgICAgICBGaWxlRGVzY3JpcHRvcjogRGVzY3JpcHRvciBmb3IgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkCisgICAgICBzeW1ib2wuCisKKyAgICBSYWlzZXM6CisgICAgICBLZXlFcnJvcjogaWYgdGhlIGZpbGUgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBwb29sLgorICAgICIiIgorCisgICAgc3ltYm9sID0gX05vcm1hbGl6ZUZ1bGx5UXVhbGlmaWVkTmFtZShzeW1ib2wpCisgICAgdHJ5OgorICAgICAgcmV0dXJuIHNlbGYuX0ludGVybmFsRmluZEZpbGVDb250YWluaW5nU3ltYm9sKHN5bWJvbCkKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICBwYXNzCisKKyAgICB0cnk6CisgICAgICAjIFRyeSBmYWxsYmFjayBkYXRhYmFzZS4gQnVpbGQgYW5kIGZpbmQgYWdhaW4gaWYgcG9zc2libGUuCisgICAgICBzZWxmLl9GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2xJbkRiKHN5bWJvbCkKKyAgICAgIHJldHVybiBzZWxmLl9JbnRlcm5hbEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzeW1ib2wpCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Nhbm5vdCBmaW5kIGEgZmlsZSBjb250YWluaW5nICVzJyAlIHN5bWJvbCkKKworICBkZWYgX0ludGVybmFsRmluZEZpbGVDb250YWluaW5nU3ltYm9sKHNlbGYsIHN5bWJvbCk6CisgICAgIiIiR2V0cyB0aGUgYWxyZWFkeSBidWlsdCBGaWxlRGVzY3JpcHRvciBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgc3ltYm9sLgorCisgICAgQXJnczoKKyAgICAgIHN5bWJvbCAoc3RyKTogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0byBzZWFyY2ggZm9yLgorCisgICAgUmV0dXJuczoKKyAgICAgIEZpbGVEZXNjcmlwdG9yOiBEZXNjcmlwdG9yIGZvciB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQKKyAgICAgIHN5bWJvbC4KKworICAgIFJhaXNlczoKKyAgICAgIEtleUVycm9yOiBpZiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHBvb2wuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgcmV0dXJuIHNlbGYuX2Rlc2NyaXB0b3JzW3N5bWJvbF0uZmlsZQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIHBhc3MKKworICAgIHRyeToKKyAgICAgIHJldHVybiBzZWxmLl9lbnVtX2Rlc2NyaXB0b3JzW3N5bWJvbF0uZmlsZQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIHBhc3MKKworICAgIHRyeToKKyAgICAgIHJldHVybiBzZWxmLl9zZXJ2aWNlX2Rlc2NyaXB0b3JzW3N5bWJvbF0uZmlsZQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIHBhc3MKKworICAgIHRyeToKKyAgICAgIHJldHVybiBzZWxmLl90b3BfZW51bV92YWx1ZXNbc3ltYm9sXS50eXBlLmZpbGUKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICBwYXNzCisKKyAgICB0cnk6CisgICAgICByZXR1cm4gc2VsZi5fZmlsZV9kZXNjX2J5X3RvcGxldmVsX2V4dGVuc2lvbltzeW1ib2xdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgcGFzcworCisgICAgIyBUcnkgZmllbGRzLCBlbnVtIHZhbHVlcyBhbmQgbmVzdGVkIGV4dGVuc2lvbnMgaW5zaWRlIGEgbWVzc2FnZS4KKyAgICB0b3BfbmFtZSwgXywgc3ViX25hbWUgPSBzeW1ib2wucnBhcnRpdGlvbignLicpCisgICAgdHJ5OgorICAgICAgbWVzc2FnZSA9IHNlbGYuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKHRvcF9uYW1lKQorICAgICAgYXNzZXJ0IChzdWJfbmFtZSBpbiBtZXNzYWdlLmV4dGVuc2lvbnNfYnlfbmFtZSBvcgorICAgICAgICAgICAgICBzdWJfbmFtZSBpbiBtZXNzYWdlLmZpZWxkc19ieV9uYW1lIG9yCisgICAgICAgICAgICAgIHN1Yl9uYW1lIGluIG1lc3NhZ2UuZW51bV92YWx1ZXNfYnlfbmFtZSkKKyAgICAgIHJldHVybiBtZXNzYWdlLmZpbGUKKyAgICBleGNlcHQgKEtleUVycm9yLCBBc3NlcnRpb25FcnJvcik6CisgICAgICByYWlzZSBLZXlFcnJvcignQ2Fubm90IGZpbmQgYSBmaWxlIGNvbnRhaW5pbmcgJXMnICUgc3ltYm9sKQorCisgIGRlZiBGaW5kTWVzc2FnZVR5cGVCeU5hbWUoc2VsZiwgZnVsbF9uYW1lKToKKyAgICAiIiJMb2FkcyB0aGUgbmFtZWQgZGVzY3JpcHRvciBmcm9tIHRoZSBwb29sLgorCisgICAgQXJnczoKKyAgICAgIGZ1bGxfbmFtZSAoc3RyKTogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciB0byBsb2FkLgorCisgICAgUmV0dXJuczoKKyAgICAgIERlc2NyaXB0b3I6IFRoZSBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgdHlwZS4KKworICAgIFJhaXNlczoKKyAgICAgIEtleUVycm9yOiBpZiB0aGUgbWVzc2FnZSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHBvb2wuCisgICAgIiIiCisKKyAgICBmdWxsX25hbWUgPSBfTm9ybWFsaXplRnVsbHlRdWFsaWZpZWROYW1lKGZ1bGxfbmFtZSkKKyAgICBpZiBmdWxsX25hbWUgbm90IGluIHNlbGYuX2Rlc2NyaXB0b3JzOgorICAgICAgc2VsZi5fRmluZEZpbGVDb250YWluaW5nU3ltYm9sSW5EYihmdWxsX25hbWUpCisgICAgcmV0dXJuIHNlbGYuX2Rlc2NyaXB0b3JzW2Z1bGxfbmFtZV0KKworICBkZWYgRmluZEVudW1UeXBlQnlOYW1lKHNlbGYsIGZ1bGxfbmFtZSk6CisgICAgIiIiTG9hZHMgdGhlIG5hbWVkIGVudW0gZGVzY3JpcHRvciBmcm9tIHRoZSBwb29sLgorCisgICAgQXJnczoKKyAgICAgIGZ1bGxfbmFtZSAoc3RyKTogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgZW51bSBkZXNjcmlwdG9yIHRvIGxvYWQuCisKKyAgICBSZXR1cm5zOgorICAgICAgRW51bURlc2NyaXB0b3I6IFRoZSBlbnVtIGRlc2NyaXB0b3IgZm9yIHRoZSBuYW1lZCB0eXBlLgorCisgICAgUmFpc2VzOgorICAgICAgS2V5RXJyb3I6IGlmIHRoZSBlbnVtIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgcG9vbC4KKyAgICAiIiIKKworICAgIGZ1bGxfbmFtZSA9IF9Ob3JtYWxpemVGdWxseVF1YWxpZmllZE5hbWUoZnVsbF9uYW1lKQorICAgIGlmIGZ1bGxfbmFtZSBub3QgaW4gc2VsZi5fZW51bV9kZXNjcmlwdG9yczoKKyAgICAgIHNlbGYuX0ZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbEluRGIoZnVsbF9uYW1lKQorICAgIHJldHVybiBzZWxmLl9lbnVtX2Rlc2NyaXB0b3JzW2Z1bGxfbmFtZV0KKworICBkZWYgRmluZEZpZWxkQnlOYW1lKHNlbGYsIGZ1bGxfbmFtZSk6CisgICAgIiIiTG9hZHMgdGhlIG5hbWVkIGZpZWxkIGRlc2NyaXB0b3IgZnJvbSB0aGUgcG9vbC4KKworICAgIEFyZ3M6CisgICAgICBmdWxsX25hbWUgKHN0cik6IFRoZSBmdWxsIG5hbWUgb2YgdGhlIGZpZWxkIGRlc2NyaXB0b3IgdG8gbG9hZC4KKworICAgIFJldHVybnM6CisgICAgICBGaWVsZERlc2NyaXB0b3I6IFRoZSBmaWVsZCBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgZmllbGQuCisKKyAgICBSYWlzZXM6CisgICAgICBLZXlFcnJvcjogaWYgdGhlIGZpZWxkIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgcG9vbC4KKyAgICAiIiIKKyAgICBmdWxsX25hbWUgPSBfTm9ybWFsaXplRnVsbHlRdWFsaWZpZWROYW1lKGZ1bGxfbmFtZSkKKyAgICBtZXNzYWdlX25hbWUsIF8sIGZpZWxkX25hbWUgPSBmdWxsX25hbWUucnBhcnRpdGlvbignLicpCisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID0gc2VsZi5GaW5kTWVzc2FnZVR5cGVCeU5hbWUobWVzc2FnZV9uYW1lKQorICAgIHJldHVybiBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbZmllbGRfbmFtZV0KKworICBkZWYgRmluZE9uZW9mQnlOYW1lKHNlbGYsIGZ1bGxfbmFtZSk6CisgICAgIiIiTG9hZHMgdGhlIG5hbWVkIG9uZW9mIGRlc2NyaXB0b3IgZnJvbSB0aGUgcG9vbC4KKworICAgIEFyZ3M6CisgICAgICBmdWxsX25hbWUgKHN0cik6IFRoZSBmdWxsIG5hbWUgb2YgdGhlIG9uZW9mIGRlc2NyaXB0b3IgdG8gbG9hZC4KKworICAgIFJldHVybnM6CisgICAgICBPbmVvZkRlc2NyaXB0b3I6IFRoZSBvbmVvZiBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgb25lb2YuCisKKyAgICBSYWlzZXM6CisgICAgICBLZXlFcnJvcjogaWYgdGhlIG9uZW9mIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgcG9vbC4KKyAgICAiIiIKKyAgICBmdWxsX25hbWUgPSBfTm9ybWFsaXplRnVsbHlRdWFsaWZpZWROYW1lKGZ1bGxfbmFtZSkKKyAgICBtZXNzYWdlX25hbWUsIF8sIG9uZW9mX25hbWUgPSBmdWxsX25hbWUucnBhcnRpdGlvbignLicpCisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID0gc2VsZi5GaW5kTWVzc2FnZVR5cGVCeU5hbWUobWVzc2FnZV9uYW1lKQorICAgIHJldHVybiBtZXNzYWdlX2Rlc2NyaXB0b3Iub25lb2ZzX2J5X25hbWVbb25lb2ZfbmFtZV0KKworICBkZWYgRmluZEV4dGVuc2lvbkJ5TmFtZShzZWxmLCBmdWxsX25hbWUpOgorICAgICIiIkxvYWRzIHRoZSBuYW1lZCBleHRlbnNpb24gZGVzY3JpcHRvciBmcm9tIHRoZSBwb29sLgorCisgICAgQXJnczoKKyAgICAgIGZ1bGxfbmFtZSAoc3RyKTogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGRlc2NyaXB0b3IgdG8gbG9hZC4KKworICAgIFJldHVybnM6CisgICAgICBGaWVsZERlc2NyaXB0b3I6IFRoZSBmaWVsZCBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgZXh0ZW5zaW9uLgorCisgICAgUmFpc2VzOgorICAgICAgS2V5RXJyb3I6IGlmIHRoZSBleHRlbnNpb24gY2Fubm90IGJlIGZvdW5kIGluIHRoZSBwb29sLgorICAgICIiIgorICAgIGZ1bGxfbmFtZSA9IF9Ob3JtYWxpemVGdWxseVF1YWxpZmllZE5hbWUoZnVsbF9uYW1lKQorICAgIHRyeToKKyAgICAgICMgVGhlIHByb3RvIGNvbXBpbGVyIGRvZXMgbm90IGdpdmUgYW55IGxpbmsgYmV0d2VlbiB0aGUgRmlsZURlc2NyaXB0b3IKKyAgICAgICMgYW5kIHRvcC1sZXZlbCBleHRlbnNpb25zIHVubGVzcyB0aGUgRmlsZURlc2NyaXB0b3JQcm90byBpcyBhZGRlZCB0bworICAgICAgIyB0aGUgRGVzY3JpcHRvckRhdGFiYXNlLCBidXQgdGhpcyBjYW4gaW1wYWN0IG1lbW9yeSB1c2FnZS4KKyAgICAgICMgU28gd2UgcmVnaXN0ZXJlZCB0aGVzZSBleHRlbnNpb25zIGJ5IG5hbWUgZXhwbGljaXRseS4KKyAgICAgIHJldHVybiBzZWxmLl90b3BsZXZlbF9leHRlbnNpb25zW2Z1bGxfbmFtZV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICBwYXNzCisgICAgbWVzc2FnZV9uYW1lLCBfLCBleHRlbnNpb25fbmFtZSA9IGZ1bGxfbmFtZS5ycGFydGl0aW9uKCcuJykKKyAgICB0cnk6CisgICAgICAjIE1vc3QgZXh0ZW5zaW9ucyBhcmUgbmVzdGVkIGluc2lkZSBhIG1lc3NhZ2UuCisgICAgICBzY29wZSA9IHNlbGYuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKG1lc3NhZ2VfbmFtZSkKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAjIFNvbWUgZXh0ZW5zaW9ucyBhcmUgZGVmaW5lZCBhdCBmaWxlIHNjb3BlLgorICAgICAgc2NvcGUgPSBzZWxmLl9GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2xJbkRiKGZ1bGxfbmFtZSkKKyAgICByZXR1cm4gc2NvcGUuZXh0ZW5zaW9uc19ieV9uYW1lW2V4dGVuc2lvbl9uYW1lXQorCisgIGRlZiBGaW5kRXh0ZW5zaW9uQnlOdW1iZXIoc2VsZiwgbWVzc2FnZV9kZXNjcmlwdG9yLCBudW1iZXIpOgorICAgICIiIkdldHMgdGhlIGV4dGVuc2lvbiBvZiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG51bWJlci4KKworICAgIEV4dGVuc2lvbnMgaGF2ZSB0byBiZSByZWdpc3RlcmVkIHRvIHRoaXMgcG9vbCBieSBjYWxsaW5nIDpmdW5jOmBBZGRgIG9yCisgICAgOmZ1bmM6YEFkZEV4dGVuc2lvbkRlc2NyaXB0b3JgLgorCisgICAgQXJnczoKKyAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvciAoRGVzY3JpcHRvcik6IGRlc2NyaXB0b3Igb2YgdGhlIGV4dGVuZGVkIG1lc3NhZ2UuCisgICAgICBudW1iZXIgKGludCk6IE51bWJlciBvZiB0aGUgZXh0ZW5zaW9uIGZpZWxkLgorCisgICAgUmV0dXJuczoKKyAgICAgIEZpZWxkRGVzY3JpcHRvcjogVGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBleHRlbnNpb24uCisKKyAgICBSYWlzZXM6CisgICAgICBLZXlFcnJvcjogd2hlbiBubyBleHRlbnNpb24gd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyIGlzIGtub3duIGZvciB0aGUKKyAgICAgICAgc3BlY2lmaWVkIG1lc3NhZ2UuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgcmV0dXJuIHNlbGYuX2V4dGVuc2lvbnNfYnlfbnVtYmVyW21lc3NhZ2VfZGVzY3JpcHRvcl1bbnVtYmVyXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIHNlbGYuX1RyeUxvYWRFeHRlbnNpb25Gcm9tREIobWVzc2FnZV9kZXNjcmlwdG9yLCBudW1iZXIpCisgICAgICByZXR1cm4gc2VsZi5fZXh0ZW5zaW9uc19ieV9udW1iZXJbbWVzc2FnZV9kZXNjcmlwdG9yXVtudW1iZXJdCisKKyAgZGVmIEZpbmRBbGxFeHRlbnNpb25zKHNlbGYsIG1lc3NhZ2VfZGVzY3JpcHRvcik6CisgICAgIiIiR2V0cyBhbGwgdGhlIGtub3duIGV4dGVuc2lvbnMgb2YgYSBnaXZlbiBtZXNzYWdlLgorCisgICAgRXh0ZW5zaW9ucyBoYXZlIHRvIGJlIHJlZ2lzdGVyZWQgdG8gdGhpcyBwb29sIGJ5IGJ1aWxkIHJlbGF0ZWQKKyAgICA6ZnVuYzpgQWRkYCBvciA6ZnVuYzpgQWRkRXh0ZW5zaW9uRGVzY3JpcHRvcmAuCisKKyAgICBBcmdzOgorICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yIChEZXNjcmlwdG9yKTogRGVzY3JpcHRvciBvZiB0aGUgZXh0ZW5kZWQgbWVzc2FnZS4KKworICAgIFJldHVybnM6CisgICAgICBsaXN0W0ZpZWxkRGVzY3JpcHRvcl06IEZpZWxkIGRlc2NyaXB0b3JzIGRlc2NyaWJpbmcgdGhlIGV4dGVuc2lvbnMuCisgICAgIiIiCisgICAgIyBGYWxsYmFjayB0byBkZXNjcmlwdG9yIGRiIGlmIEZpbmRBbGxFeHRlbnNpb25OdW1iZXJzIGlzIHByb3ZpZGVkLgorICAgIGlmIHNlbGYuX2Rlc2NyaXB0b3JfZGIgYW5kIGhhc2F0dHIoCisgICAgICAgIHNlbGYuX2Rlc2NyaXB0b3JfZGIsICdGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycycpOgorICAgICAgZnVsbF9uYW1lID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZQorICAgICAgYWxsX251bWJlcnMgPSBzZWxmLl9kZXNjcmlwdG9yX2RiLkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGZ1bGxfbmFtZSkKKyAgICAgIGZvciBudW1iZXIgaW4gYWxsX251bWJlcnM6CisgICAgICAgIGlmIG51bWJlciBpbiBzZWxmLl9leHRlbnNpb25zX2J5X251bWJlclttZXNzYWdlX2Rlc2NyaXB0b3JdOgorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHNlbGYuX1RyeUxvYWRFeHRlbnNpb25Gcm9tREIobWVzc2FnZV9kZXNjcmlwdG9yLCBudW1iZXIpCisKKyAgICByZXR1cm4gbGlzdChzZWxmLl9leHRlbnNpb25zX2J5X251bWJlclttZXNzYWdlX2Rlc2NyaXB0b3JdLnZhbHVlcygpKQorCisgIGRlZiBfVHJ5TG9hZEV4dGVuc2lvbkZyb21EQihzZWxmLCBtZXNzYWdlX2Rlc2NyaXB0b3IsIG51bWJlcik6CisgICAgIiIiVHJ5IHRvIExvYWQgZXh0ZW5zaW9ucyBmcm9tIGRlc2NyaXB0b3IgZGIuCisKKyAgICBBcmdzOgorICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yOiBkZXNjcmlwdG9yIG9mIHRoZSBleHRlbmRlZCBtZXNzYWdlLgorICAgICAgbnVtYmVyOiB0aGUgZXh0ZW5zaW9uIG51bWJlciB0aGF0IG5lZWRzIHRvIGJlIGxvYWRlZC4KKyAgICAiIiIKKyAgICBpZiBub3Qgc2VsZi5fZGVzY3JpcHRvcl9kYjoKKyAgICAgIHJldHVybgorICAgICMgT25seSBzdXBwb3J0ZWQgd2hlbiBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24gaXMgcHJvdmlkZWQuCisgICAgaWYgbm90IGhhc2F0dHIoCisgICAgICAgIHNlbGYuX2Rlc2NyaXB0b3JfZGIsICdGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24nKToKKyAgICAgIHJldHVybgorCisgICAgZnVsbF9uYW1lID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZQorICAgIGZpbGVfcHJvdG8gPSBzZWxmLl9kZXNjcmlwdG9yX2RiLkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigKKyAgICAgICAgZnVsbF9uYW1lLCBudW1iZXIpCisKKyAgICBpZiBmaWxlX3Byb3RvIGlzIE5vbmU6CisgICAgICByZXR1cm4KKworICAgIHRyeToKKyAgICAgIHNlbGYuX0NvbnZlcnRGaWxlUHJvdG9Ub0ZpbGVEZXNjcmlwdG9yKGZpbGVfcHJvdG8pCisgICAgZXhjZXB0OgorICAgICAgd2Fybl9tc2cgPSAoJ1VuYWJsZSB0byBsb2FkIHByb3RvIGZpbGUgJXMgZm9yIGV4dGVuc2lvbiBudW1iZXIgJWQuJyAlCisgICAgICAgICAgICAgICAgICAoZmlsZV9wcm90by5uYW1lLCBudW1iZXIpKQorICAgICAgd2FybmluZ3Mud2Fybih3YXJuX21zZywgUnVudGltZVdhcm5pbmcpCisKKyAgZGVmIEZpbmRTZXJ2aWNlQnlOYW1lKHNlbGYsIGZ1bGxfbmFtZSk6CisgICAgIiIiTG9hZHMgdGhlIG5hbWVkIHNlcnZpY2UgZGVzY3JpcHRvciBmcm9tIHRoZSBwb29sLgorCisgICAgQXJnczoKKyAgICAgIGZ1bGxfbmFtZSAoc3RyKTogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgc2VydmljZSBkZXNjcmlwdG9yIHRvIGxvYWQuCisKKyAgICBSZXR1cm5zOgorICAgICAgU2VydmljZURlc2NyaXB0b3I6IFRoZSBzZXJ2aWNlIGRlc2NyaXB0b3IgZm9yIHRoZSBuYW1lZCBzZXJ2aWNlLgorCisgICAgUmFpc2VzOgorICAgICAgS2V5RXJyb3I6IGlmIHRoZSBzZXJ2aWNlIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgcG9vbC4KKyAgICAiIiIKKyAgICBmdWxsX25hbWUgPSBfTm9ybWFsaXplRnVsbHlRdWFsaWZpZWROYW1lKGZ1bGxfbmFtZSkKKyAgICBpZiBmdWxsX25hbWUgbm90IGluIHNlbGYuX3NlcnZpY2VfZGVzY3JpcHRvcnM6CisgICAgICBzZWxmLl9GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2xJbkRiKGZ1bGxfbmFtZSkKKyAgICByZXR1cm4gc2VsZi5fc2VydmljZV9kZXNjcmlwdG9yc1tmdWxsX25hbWVdCisKKyAgZGVmIEZpbmRNZXRob2RCeU5hbWUoc2VsZiwgZnVsbF9uYW1lKToKKyAgICAiIiJMb2FkcyB0aGUgbmFtZWQgc2VydmljZSBtZXRob2QgZGVzY3JpcHRvciBmcm9tIHRoZSBwb29sLgorCisgICAgQXJnczoKKyAgICAgIGZ1bGxfbmFtZSAoc3RyKTogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgbWV0aG9kIGRlc2NyaXB0b3IgdG8gbG9hZC4KKworICAgIFJldHVybnM6CisgICAgICBNZXRob2REZXNjcmlwdG9yOiBUaGUgbWV0aG9kIGRlc2NyaXB0b3IgZm9yIHRoZSBzZXJ2aWNlIG1ldGhvZC4KKworICAgIFJhaXNlczoKKyAgICAgIEtleUVycm9yOiBpZiB0aGUgbWV0aG9kIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgcG9vbC4KKyAgICAiIiIKKyAgICBmdWxsX25hbWUgPSBfTm9ybWFsaXplRnVsbHlRdWFsaWZpZWROYW1lKGZ1bGxfbmFtZSkKKyAgICBzZXJ2aWNlX25hbWUsIF8sIG1ldGhvZF9uYW1lID0gZnVsbF9uYW1lLnJwYXJ0aXRpb24oJy4nKQorICAgIHNlcnZpY2VfZGVzY3JpcHRvciA9IHNlbGYuRmluZFNlcnZpY2VCeU5hbWUoc2VydmljZV9uYW1lKQorICAgIHJldHVybiBzZXJ2aWNlX2Rlc2NyaXB0b3IubWV0aG9kc19ieV9uYW1lW21ldGhvZF9uYW1lXQorCisgIGRlZiBfRmluZEZpbGVDb250YWluaW5nU3ltYm9sSW5EYihzZWxmLCBzeW1ib2wpOgorICAgICIiIkZpbmRzIHRoZSBmaWxlIGluIGRlc2NyaXB0b3IgREIgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIHN5bWJvbC4KKworICAgIEFyZ3M6CisgICAgICBzeW1ib2wgKHN0cik6IFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gc2VhcmNoIGZvci4KKworICAgIFJldHVybnM6CisgICAgICBGaWxlRGVzY3JpcHRvcjogVGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN5bWJvbC4KKworICAgIFJhaXNlczoKKyAgICAgIEtleUVycm9yOiBpZiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGRlc2NyaXB0b3IgZGF0YWJhc2UuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgZmlsZV9wcm90byA9IHNlbGYuX2ludGVybmFsX2RiLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzeW1ib2wpCisgICAgZXhjZXB0IEtleUVycm9yIGFzIGVycm9yOgorICAgICAgaWYgc2VsZi5fZGVzY3JpcHRvcl9kYjoKKyAgICAgICAgZmlsZV9wcm90byA9IHNlbGYuX2Rlc2NyaXB0b3JfZGIuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKHN5bWJvbCkKKyAgICAgIGVsc2U6CisgICAgICAgIHJhaXNlIGVycm9yCisgICAgaWYgbm90IGZpbGVfcHJvdG86CisgICAgICByYWlzZSBLZXlFcnJvcignQ2Fubm90IGZpbmQgYSBmaWxlIGNvbnRhaW5pbmcgJXMnICUgc3ltYm9sKQorICAgIHJldHVybiBzZWxmLl9Db252ZXJ0RmlsZVByb3RvVG9GaWxlRGVzY3JpcHRvcihmaWxlX3Byb3RvKQorCisgIGRlZiBfQ29udmVydEZpbGVQcm90b1RvRmlsZURlc2NyaXB0b3Ioc2VsZiwgZmlsZV9wcm90byk6CisgICAgIiIiQ3JlYXRlcyBhIEZpbGVEZXNjcmlwdG9yIGZyb20gYSBwcm90byBvciByZXR1cm5zIGEgY2FjaGVkIGNvcHkuCisKKyAgICBUaGlzIG1ldGhvZCBhbHNvIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgbG9hZGluZyBhbGwgdGhlIHN5bWJvbHMgZm91bmQgaW4KKyAgICB0aGUgZmlsZSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBkaWN0aW9uYXJpZXMgaW4gdGhlIHBvb2wuCisKKyAgICBBcmdzOgorICAgICAgZmlsZV9wcm90bzogVGhlIHByb3RvIHRvIGNvbnZlcnQuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBGaWxlRGVzY3JpcHRvciBtYXRjaGluZyB0aGUgcGFzc2VkIGluIHByb3RvLgorICAgICIiIgorICAgIGlmIGZpbGVfcHJvdG8ubmFtZSBub3QgaW4gc2VsZi5fZmlsZV9kZXNjcmlwdG9yczoKKyAgICAgIGJ1aWx0X2RlcHMgPSBsaXN0KHNlbGYuX0dldERlcHMoZmlsZV9wcm90by5kZXBlbmRlbmN5KSkKKyAgICAgIGRpcmVjdF9kZXBzID0gW3NlbGYuRmluZEZpbGVCeU5hbWUobikgZm9yIG4gaW4gZmlsZV9wcm90by5kZXBlbmRlbmN5XQorICAgICAgcHVibGljX2RlcHMgPSBbZGlyZWN0X2RlcHNbaV0gZm9yIGkgaW4gZmlsZV9wcm90by5wdWJsaWNfZGVwZW5kZW5jeV0KKworICAgICAgZmlsZV9kZXNjcmlwdG9yID0gZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcigKKyAgICAgICAgICBwb29sPXNlbGYsCisgICAgICAgICAgbmFtZT1maWxlX3Byb3RvLm5hbWUsCisgICAgICAgICAgcGFja2FnZT1maWxlX3Byb3RvLnBhY2thZ2UsCisgICAgICAgICAgc3ludGF4PWZpbGVfcHJvdG8uc3ludGF4LAorICAgICAgICAgIG9wdGlvbnM9X09wdGlvbnNPck5vbmUoZmlsZV9wcm90byksCisgICAgICAgICAgc2VyaWFsaXplZF9wYj1maWxlX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCksCisgICAgICAgICAgZGVwZW5kZW5jaWVzPWRpcmVjdF9kZXBzLAorICAgICAgICAgIHB1YmxpY19kZXBlbmRlbmNpZXM9cHVibGljX2RlcHMsCisgICAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgICAgIGNyZWF0ZV9rZXk9ZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSkKKyAgICAgIHNjb3BlID0ge30KKworICAgICAgIyBUaGlzIGxvb3AgZXh0cmFjdHMgYWxsIHRoZSBtZXNzYWdlIGFuZCBlbnVtIHR5cGVzIGZyb20gYWxsIHRoZQorICAgICAgIyBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGVfcHJvdG8uIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGNyZWF0ZSB0aGUKKyAgICAgICMgc2NvcGUgb2YgYXZhaWxhYmxlIG1lc3NhZ2UgdHlwZXMgd2hlbiBkZWZpbmluZyB0aGUgcGFzc2VkIGluCisgICAgICAjIGZpbGUgcHJvdG8uCisgICAgICBmb3IgZGVwZW5kZW5jeSBpbiBidWlsdF9kZXBzOgorICAgICAgICBzY29wZS51cGRhdGUoc2VsZi5fRXh0cmFjdFN5bWJvbHMoCisgICAgICAgICAgICBkZXBlbmRlbmN5Lm1lc3NhZ2VfdHlwZXNfYnlfbmFtZS52YWx1ZXMoKSkpCisgICAgICAgIHNjb3BlLnVwZGF0ZSgoX1ByZWZpeFdpdGhEb3QoZW51bS5mdWxsX25hbWUpLCBlbnVtKQorICAgICAgICAgICAgICAgICAgICAgZm9yIGVudW0gaW4gZGVwZW5kZW5jeS5lbnVtX3R5cGVzX2J5X25hbWUudmFsdWVzKCkpCisKKyAgICAgIGZvciBtZXNzYWdlX3R5cGUgaW4gZmlsZV9wcm90by5tZXNzYWdlX3R5cGU6CisgICAgICAgIG1lc3NhZ2VfZGVzYyA9IHNlbGYuX0NvbnZlcnRNZXNzYWdlRGVzY3JpcHRvcigKKyAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwgZmlsZV9wcm90by5wYWNrYWdlLCBmaWxlX2Rlc2NyaXB0b3IsIHNjb3BlLAorICAgICAgICAgICAgZmlsZV9wcm90by5zeW50YXgpCisgICAgICAgIGZpbGVfZGVzY3JpcHRvci5tZXNzYWdlX3R5cGVzX2J5X25hbWVbbWVzc2FnZV9kZXNjLm5hbWVdID0gKAorICAgICAgICAgICAgbWVzc2FnZV9kZXNjKQorCisgICAgICBmb3IgZW51bV90eXBlIGluIGZpbGVfcHJvdG8uZW51bV90eXBlOgorICAgICAgICBmaWxlX2Rlc2NyaXB0b3IuZW51bV90eXBlc19ieV9uYW1lW2VudW1fdHlwZS5uYW1lXSA9ICgKKyAgICAgICAgICAgIHNlbGYuX0NvbnZlcnRFbnVtRGVzY3JpcHRvcihlbnVtX3R5cGUsIGZpbGVfcHJvdG8ucGFja2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2Rlc2NyaXB0b3IsIE5vbmUsIHNjb3BlLCBUcnVlKSkKKworICAgICAgZm9yIGluZGV4LCBleHRlbnNpb25fcHJvdG8gaW4gZW51bWVyYXRlKGZpbGVfcHJvdG8uZXh0ZW5zaW9uKToKKyAgICAgICAgZXh0ZW5zaW9uX2Rlc2MgPSBzZWxmLl9NYWtlRmllbGREZXNjcmlwdG9yKAorICAgICAgICAgICAgZXh0ZW5zaW9uX3Byb3RvLCBmaWxlX3Byb3RvLnBhY2thZ2UsIGluZGV4LCBmaWxlX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICBpc19leHRlbnNpb249VHJ1ZSkKKyAgICAgICAgZXh0ZW5zaW9uX2Rlc2MuY29udGFpbmluZ190eXBlID0gc2VsZi5fR2V0VHlwZUZyb21TY29wZSgKKyAgICAgICAgICAgIGZpbGVfZGVzY3JpcHRvci5wYWNrYWdlLCBleHRlbnNpb25fcHJvdG8uZXh0ZW5kZWUsIHNjb3BlKQorICAgICAgICBzZWxmLl9TZXRGaWVsZFR5cGUoZXh0ZW5zaW9uX3Byb3RvLCBleHRlbnNpb25fZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZGVzY3JpcHRvci5wYWNrYWdlLCBzY29wZSkKKyAgICAgICAgZmlsZV9kZXNjcmlwdG9yLmV4dGVuc2lvbnNfYnlfbmFtZVtleHRlbnNpb25fZGVzYy5uYW1lXSA9ICgKKyAgICAgICAgICAgIGV4dGVuc2lvbl9kZXNjKQorICAgICAgICBzZWxmLl9maWxlX2Rlc2NfYnlfdG9wbGV2ZWxfZXh0ZW5zaW9uW2V4dGVuc2lvbl9kZXNjLmZ1bGxfbmFtZV0gPSAoCisgICAgICAgICAgICBmaWxlX2Rlc2NyaXB0b3IpCisKKyAgICAgIGZvciBkZXNjX3Byb3RvIGluIGZpbGVfcHJvdG8ubWVzc2FnZV90eXBlOgorICAgICAgICBzZWxmLl9TZXRBbGxGaWVsZFR5cGVzKGZpbGVfcHJvdG8ucGFja2FnZSwgZGVzY19wcm90bywgc2NvcGUpCisKKyAgICAgIGlmIGZpbGVfcHJvdG8ucGFja2FnZToKKyAgICAgICAgZGVzY19wcm90b19wcmVmaXggPSBfUHJlZml4V2l0aERvdChmaWxlX3Byb3RvLnBhY2thZ2UpCisgICAgICBlbHNlOgorICAgICAgICBkZXNjX3Byb3RvX3ByZWZpeCA9ICcnCisKKyAgICAgIGZvciBkZXNjX3Byb3RvIGluIGZpbGVfcHJvdG8ubWVzc2FnZV90eXBlOgorICAgICAgICBkZXNjID0gc2VsZi5fR2V0VHlwZUZyb21TY29wZSgKKyAgICAgICAgICAgIGRlc2NfcHJvdG9fcHJlZml4LCBkZXNjX3Byb3RvLm5hbWUsIHNjb3BlKQorICAgICAgICBmaWxlX2Rlc2NyaXB0b3IubWVzc2FnZV90eXBlc19ieV9uYW1lW2Rlc2NfcHJvdG8ubmFtZV0gPSBkZXNjCisKKyAgICAgIGZvciBpbmRleCwgc2VydmljZV9wcm90byBpbiBlbnVtZXJhdGUoZmlsZV9wcm90by5zZXJ2aWNlKToKKyAgICAgICAgZmlsZV9kZXNjcmlwdG9yLnNlcnZpY2VzX2J5X25hbWVbc2VydmljZV9wcm90by5uYW1lXSA9ICgKKyAgICAgICAgICAgIHNlbGYuX01ha2VTZXJ2aWNlRGVzY3JpcHRvcihzZXJ2aWNlX3Byb3RvLCBpbmRleCwgc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wcm90by5wYWNrYWdlLCBmaWxlX2Rlc2NyaXB0b3IpKQorCisgICAgICBzZWxmLl9maWxlX2Rlc2NyaXB0b3JzW2ZpbGVfcHJvdG8ubmFtZV0gPSBmaWxlX2Rlc2NyaXB0b3IKKworICAgICMgQWRkIGV4dGVuc2lvbnMgdG8gdGhlIHBvb2wKKyAgICBmaWxlX2Rlc2MgPSBzZWxmLl9maWxlX2Rlc2NyaXB0b3JzW2ZpbGVfcHJvdG8ubmFtZV0KKyAgICBmb3IgZXh0ZW5zaW9uIGluIGZpbGVfZGVzYy5leHRlbnNpb25zX2J5X25hbWUudmFsdWVzKCk6CisgICAgICBzZWxmLl9BZGRFeHRlbnNpb25EZXNjcmlwdG9yKGV4dGVuc2lvbikKKyAgICBmb3IgbWVzc2FnZV90eXBlIGluIGZpbGVfZGVzYy5tZXNzYWdlX3R5cGVzX2J5X25hbWUudmFsdWVzKCk6CisgICAgICBmb3IgZXh0ZW5zaW9uIGluIG1lc3NhZ2VfdHlwZS5leHRlbnNpb25zOgorICAgICAgICBzZWxmLl9BZGRFeHRlbnNpb25EZXNjcmlwdG9yKGV4dGVuc2lvbikKKworICAgIHJldHVybiBmaWxlX2Rlc2MKKworICBkZWYgX0NvbnZlcnRNZXNzYWdlRGVzY3JpcHRvcihzZWxmLCBkZXNjX3Byb3RvLCBwYWNrYWdlPU5vbmUsIGZpbGVfZGVzYz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZT1Ob25lLCBzeW50YXg9Tm9uZSk6CisgICAgIiIiQWRkcyB0aGUgcHJvdG8gdG8gdGhlIHBvb2wgaW4gdGhlIHNwZWNpZmllZCBwYWNrYWdlLgorCisgICAgQXJnczoKKyAgICAgIGRlc2NfcHJvdG86IFRoZSBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8gcHJvdG9idWYgbWVzc2FnZS4KKyAgICAgIHBhY2thZ2U6IFRoZSBwYWNrYWdlIHRoZSBwcm90byBzaG91bGQgYmUgbG9jYXRlZCBpbi4KKyAgICAgIGZpbGVfZGVzYzogVGhlIGZpbGUgY29udGFpbmluZyB0aGlzIG1lc3NhZ2UuCisgICAgICBzY29wZTogRGljdCBtYXBwaW5nIHNob3J0IGFuZCBmdWxsIHN5bWJvbHMgdG8gbWVzc2FnZSBhbmQgZW51bSB0eXBlcy4KKyAgICAgIHN5bnRheDogc3RyaW5nIGluZGljYXRpbmcgc3ludGF4IG9mIHRoZSBmaWxlICgicHJvdG8yIiBvciAicHJvdG8zIikKKworICAgIFJldHVybnM6CisgICAgICBUaGUgYWRkZWQgZGVzY3JpcHRvci4KKyAgICAiIiIKKworICAgIGlmIHBhY2thZ2U6CisgICAgICBkZXNjX25hbWUgPSAnLicuam9pbigocGFja2FnZSwgZGVzY19wcm90by5uYW1lKSkKKyAgICBlbHNlOgorICAgICAgZGVzY19uYW1lID0gZGVzY19wcm90by5uYW1lCisKKyAgICBpZiBmaWxlX2Rlc2MgaXMgTm9uZToKKyAgICAgIGZpbGVfbmFtZSA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgZmlsZV9uYW1lID0gZmlsZV9kZXNjLm5hbWUKKworICAgIGlmIHNjb3BlIGlzIE5vbmU6CisgICAgICBzY29wZSA9IHt9CisKKyAgICBuZXN0ZWQgPSBbCisgICAgICAgIHNlbGYuX0NvbnZlcnRNZXNzYWdlRGVzY3JpcHRvcigKKyAgICAgICAgICAgIG5lc3RlZCwgZGVzY19uYW1lLCBmaWxlX2Rlc2MsIHNjb3BlLCBzeW50YXgpCisgICAgICAgIGZvciBuZXN0ZWQgaW4gZGVzY19wcm90by5uZXN0ZWRfdHlwZV0KKyAgICBlbnVtcyA9IFsKKyAgICAgICAgc2VsZi5fQ29udmVydEVudW1EZXNjcmlwdG9yKGVudW0sIGRlc2NfbmFtZSwgZmlsZV9kZXNjLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUsIEZhbHNlKQorICAgICAgICBmb3IgZW51bSBpbiBkZXNjX3Byb3RvLmVudW1fdHlwZV0KKyAgICBmaWVsZHMgPSBbc2VsZi5fTWFrZUZpZWxkRGVzY3JpcHRvcihmaWVsZCwgZGVzY19uYW1lLCBpbmRleCwgZmlsZV9kZXNjKQorICAgICAgICAgICAgICBmb3IgaW5kZXgsIGZpZWxkIGluIGVudW1lcmF0ZShkZXNjX3Byb3RvLmZpZWxkKV0KKyAgICBleHRlbnNpb25zID0gWworICAgICAgICBzZWxmLl9NYWtlRmllbGREZXNjcmlwdG9yKGV4dGVuc2lvbiwgZGVzY19uYW1lLCBpbmRleCwgZmlsZV9kZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbj1UcnVlKQorICAgICAgICBmb3IgaW5kZXgsIGV4dGVuc2lvbiBpbiBlbnVtZXJhdGUoZGVzY19wcm90by5leHRlbnNpb24pXQorICAgIG9uZW9mcyA9IFsKKyAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9Zy1jb21wbGV4LWNvbXByZWhlbnNpb24KKyAgICAgICAgZGVzY3JpcHRvci5PbmVvZkRlc2NyaXB0b3IoCisgICAgICAgICAgICBkZXNjLm5hbWUsCisgICAgICAgICAgICAnLicuam9pbigoZGVzY19uYW1lLCBkZXNjLm5hbWUpKSwKKyAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgIFtdLAorICAgICAgICAgICAgX09wdGlvbnNPck5vbmUoZGVzYyksCisgICAgICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgICAgICBjcmVhdGVfa2V5PWRlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpCisgICAgICAgIGZvciBpbmRleCwgZGVzYyBpbiBlbnVtZXJhdGUoZGVzY19wcm90by5vbmVvZl9kZWNsKQorICAgIF0KKyAgICBleHRlbnNpb25fcmFuZ2VzID0gWyhyLnN0YXJ0LCByLmVuZCkgZm9yIHIgaW4gZGVzY19wcm90by5leHRlbnNpb25fcmFuZ2VdCisgICAgaWYgZXh0ZW5zaW9uX3JhbmdlczoKKyAgICAgIGlzX2V4dGVuZGFibGUgPSBUcnVlCisgICAgZWxzZToKKyAgICAgIGlzX2V4dGVuZGFibGUgPSBGYWxzZQorICAgIGRlc2MgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgICAgICAgIG5hbWU9ZGVzY19wcm90by5uYW1lLAorICAgICAgICBmdWxsX25hbWU9ZGVzY19uYW1lLAorICAgICAgICBmaWxlbmFtZT1maWxlX25hbWUsCisgICAgICAgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgICBmaWVsZHM9ZmllbGRzLAorICAgICAgICBvbmVvZnM9b25lb2ZzLAorICAgICAgICBuZXN0ZWRfdHlwZXM9bmVzdGVkLAorICAgICAgICBlbnVtX3R5cGVzPWVudW1zLAorICAgICAgICBleHRlbnNpb25zPWV4dGVuc2lvbnMsCisgICAgICAgIG9wdGlvbnM9X09wdGlvbnNPck5vbmUoZGVzY19wcm90byksCisgICAgICAgIGlzX2V4dGVuZGFibGU9aXNfZXh0ZW5kYWJsZSwKKyAgICAgICAgZXh0ZW5zaW9uX3Jhbmdlcz1leHRlbnNpb25fcmFuZ2VzLAorICAgICAgICBmaWxlPWZpbGVfZGVzYywKKyAgICAgICAgc2VyaWFsaXplZF9zdGFydD1Ob25lLAorICAgICAgICBzZXJpYWxpemVkX2VuZD1Ob25lLAorICAgICAgICBzeW50YXg9c3ludGF4LAorICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgIGNyZWF0ZV9rZXk9ZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSkKKyAgICBmb3IgbmVzdGVkIGluIGRlc2MubmVzdGVkX3R5cGVzOgorICAgICAgbmVzdGVkLmNvbnRhaW5pbmdfdHlwZSA9IGRlc2MKKyAgICBmb3IgZW51bSBpbiBkZXNjLmVudW1fdHlwZXM6CisgICAgICBlbnVtLmNvbnRhaW5pbmdfdHlwZSA9IGRlc2MKKyAgICBmb3IgZmllbGRfaW5kZXgsIGZpZWxkX2Rlc2MgaW4gZW51bWVyYXRlKGRlc2NfcHJvdG8uZmllbGQpOgorICAgICAgaWYgZmllbGRfZGVzYy5IYXNGaWVsZCgnb25lb2ZfaW5kZXgnKToKKyAgICAgICAgb25lb2ZfaW5kZXggPSBmaWVsZF9kZXNjLm9uZW9mX2luZGV4CisgICAgICAgIG9uZW9mc1tvbmVvZl9pbmRleF0uZmllbGRzLmFwcGVuZChmaWVsZHNbZmllbGRfaW5kZXhdKQorICAgICAgICBmaWVsZHNbZmllbGRfaW5kZXhdLmNvbnRhaW5pbmdfb25lb2YgPSBvbmVvZnNbb25lb2ZfaW5kZXhdCisKKyAgICBzY29wZVtfUHJlZml4V2l0aERvdChkZXNjX25hbWUpXSA9IGRlc2MKKyAgICBzZWxmLl9DaGVja0NvbmZsaWN0UmVnaXN0ZXIoZGVzYywgZGVzYy5mdWxsX25hbWUsIGRlc2MuZmlsZS5uYW1lKQorICAgIHNlbGYuX2Rlc2NyaXB0b3JzW2Rlc2NfbmFtZV0gPSBkZXNjCisgICAgcmV0dXJuIGRlc2MKKworICBkZWYgX0NvbnZlcnRFbnVtRGVzY3JpcHRvcihzZWxmLCBlbnVtX3Byb3RvLCBwYWNrYWdlPU5vbmUsIGZpbGVfZGVzYz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGU9Tm9uZSwgc2NvcGU9Tm9uZSwgdG9wX2xldmVsPUZhbHNlKToKKyAgICAiIiJNYWtlIGEgcHJvdG9idWYgRW51bURlc2NyaXB0b3IgZ2l2ZW4gYW4gRW51bURlc2NyaXB0b3JQcm90byBwcm90b2J1Zi4KKworICAgIEFyZ3M6CisgICAgICBlbnVtX3Byb3RvOiBUaGUgZGVzY3JpcHRvcl9wYjIuRW51bURlc2NyaXB0b3JQcm90byBwcm90b2J1ZiBtZXNzYWdlLgorICAgICAgcGFja2FnZTogT3B0aW9uYWwgcGFja2FnZSBuYW1lIGZvciB0aGUgbmV3IG1lc3NhZ2UgRW51bURlc2NyaXB0b3IuCisgICAgICBmaWxlX2Rlc2M6IFRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGVudW0gZGVzY3JpcHRvci4KKyAgICAgIGNvbnRhaW5pbmdfdHlwZTogVGhlIHR5cGUgY29udGFpbmluZyB0aGlzIGVudW0uCisgICAgICBzY29wZTogU2NvcGUgY29udGFpbmluZyBhdmFpbGFibGUgdHlwZXMuCisgICAgICB0b3BfbGV2ZWw6IElmIFRydWUsIHRoZSBlbnVtIGlzIGEgdG9wIGxldmVsIHN5bWJvbC4gSWYgRmFsc2UsIHRoZSBlbnVtCisgICAgICAgICAgaXMgZGVmaW5lZCBpbnNpZGUgYSBtZXNzYWdlLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBhZGRlZCBkZXNjcmlwdG9yCisgICAgIiIiCisKKyAgICBpZiBwYWNrYWdlOgorICAgICAgZW51bV9uYW1lID0gJy4nLmpvaW4oKHBhY2thZ2UsIGVudW1fcHJvdG8ubmFtZSkpCisgICAgZWxzZToKKyAgICAgIGVudW1fbmFtZSA9IGVudW1fcHJvdG8ubmFtZQorCisgICAgaWYgZmlsZV9kZXNjIGlzIE5vbmU6CisgICAgICBmaWxlX25hbWUgPSBOb25lCisgICAgZWxzZToKKyAgICAgIGZpbGVfbmFtZSA9IGZpbGVfZGVzYy5uYW1lCisKKyAgICB2YWx1ZXMgPSBbc2VsZi5fTWFrZUVudW1WYWx1ZURlc2NyaXB0b3IodmFsdWUsIGluZGV4KQorICAgICAgICAgICAgICBmb3IgaW5kZXgsIHZhbHVlIGluIGVudW1lcmF0ZShlbnVtX3Byb3RvLnZhbHVlKV0KKyAgICBkZXNjID0gZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcihuYW1lPWVudW1fcHJvdG8ubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX25hbWU9ZW51bV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPWZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlPWZpbGVfZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9dmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZT1jb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz1fT3B0aW9uc09yTm9uZShlbnVtX3Byb3RvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlX2tleT1kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KQorICAgIHNjb3BlWycuJXMnICUgZW51bV9uYW1lXSA9IGRlc2MKKyAgICBzZWxmLl9DaGVja0NvbmZsaWN0UmVnaXN0ZXIoZGVzYywgZGVzYy5mdWxsX25hbWUsIGRlc2MuZmlsZS5uYW1lKQorICAgIHNlbGYuX2VudW1fZGVzY3JpcHRvcnNbZW51bV9uYW1lXSA9IGRlc2MKKworICAgICMgQWRkIHRvcCBsZXZlbCBlbnVtIHZhbHVlcy4KKyAgICBpZiB0b3BfbGV2ZWw6CisgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgorICAgICAgICBmdWxsX25hbWUgPSBfTm9ybWFsaXplRnVsbHlRdWFsaWZpZWROYW1lKAorICAgICAgICAgICAgJy4nLmpvaW4oKHBhY2thZ2UsIHZhbHVlLm5hbWUpKSkKKyAgICAgICAgc2VsZi5fQ2hlY2tDb25mbGljdFJlZ2lzdGVyKHZhbHVlLCBmdWxsX25hbWUsIGZpbGVfbmFtZSkKKyAgICAgICAgc2VsZi5fdG9wX2VudW1fdmFsdWVzW2Z1bGxfbmFtZV0gPSB2YWx1ZQorCisgICAgcmV0dXJuIGRlc2MKKworICBkZWYgX01ha2VGaWVsZERlc2NyaXB0b3Ioc2VsZiwgZmllbGRfcHJvdG8sIG1lc3NhZ2VfbmFtZSwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2Rlc2MsIGlzX2V4dGVuc2lvbj1GYWxzZSk6CisgICAgIiIiQ3JlYXRlcyBhIGZpZWxkIGRlc2NyaXB0b3IgZnJvbSBhIEZpZWxkRGVzY3JpcHRvclByb3RvLgorCisgICAgRm9yIG1lc3NhZ2UgYW5kIGVudW0gdHlwZSBmaWVsZHMsIHRoaXMgbWV0aG9kIHdpbGwgZG8gYSBsb29rIHVwCisgICAgaW4gdGhlIHBvb2wgZm9yIHRoZSBhcHByb3ByaWF0ZSBkZXNjcmlwdG9yIGZvciB0aGF0IHR5cGUuIElmIGl0CisgICAgaXMgdW5hdmFpbGFibGUsIGl0IHdpbGwgZmFsbCBiYWNrIHRvIHRoZSBfc291cmNlIGZ1bmN0aW9uIHRvCisgICAgY3JlYXRlIGl0LiBJZiB0aGlzIHR5cGUgaXMgc3RpbGwgdW5hdmFpbGFibGUsIGNvbnN0cnVjdGlvbiB3aWxsCisgICAgZmFpbC4KKworICAgIEFyZ3M6CisgICAgICBmaWVsZF9wcm90bzogVGhlIHByb3RvIGRlc2NyaWJpbmcgdGhlIGZpZWxkLgorICAgICAgbWVzc2FnZV9uYW1lOiBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmluZyBtZXNzYWdlLgorICAgICAgaW5kZXg6IEluZGV4IG9mIHRoZSBmaWVsZAorICAgICAgZmlsZV9kZXNjOiBUaGUgZmlsZSBjb250YWluaW5nIHRoZSBmaWVsZCBkZXNjcmlwdG9yLgorICAgICAgaXNfZXh0ZW5zaW9uOiBJbmRpY2F0aW9uIHRoYXQgdGhpcyBmaWVsZCBpcyBmb3IgYW4gZXh0ZW5zaW9uLgorCisgICAgUmV0dXJuczoKKyAgICAgIEFuIGluaXRpYWxpemVkIEZpZWxkRGVzY3JpcHRvciBvYmplY3QKKyAgICAiIiIKKworICAgIGlmIG1lc3NhZ2VfbmFtZToKKyAgICAgIGZ1bGxfbmFtZSA9ICcuJy5qb2luKChtZXNzYWdlX25hbWUsIGZpZWxkX3Byb3RvLm5hbWUpKQorICAgIGVsc2U6CisgICAgICBmdWxsX25hbWUgPSBmaWVsZF9wcm90by5uYW1lCisKKyAgICBpZiBmaWVsZF9wcm90by5qc29uX25hbWU6CisgICAgICBqc29uX25hbWUgPSBmaWVsZF9wcm90by5qc29uX25hbWUKKyAgICBlbHNlOgorICAgICAganNvbl9uYW1lID0gTm9uZQorCisgICAgcmV0dXJuIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgICBuYW1lPWZpZWxkX3Byb3RvLm5hbWUsCisgICAgICAgIGZ1bGxfbmFtZT1mdWxsX25hbWUsCisgICAgICAgIGluZGV4PWluZGV4LAorICAgICAgICBudW1iZXI9ZmllbGRfcHJvdG8ubnVtYmVyLAorICAgICAgICB0eXBlPWZpZWxkX3Byb3RvLnR5cGUsCisgICAgICAgIGNwcF90eXBlPU5vbmUsCisgICAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLAorICAgICAgICBlbnVtX3R5cGU9Tm9uZSwKKyAgICAgICAgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICAgIGxhYmVsPWZpZWxkX3Byb3RvLmxhYmVsLAorICAgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwKKyAgICAgICAgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgICBpc19leHRlbnNpb249aXNfZXh0ZW5zaW9uLAorICAgICAgICBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgICAgb3B0aW9ucz1fT3B0aW9uc09yTm9uZShmaWVsZF9wcm90byksCisgICAgICAgIGpzb25fbmFtZT1qc29uX25hbWUsCisgICAgICAgIGZpbGU9ZmlsZV9kZXNjLAorICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgIGNyZWF0ZV9rZXk9ZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSkKKworICBkZWYgX1NldEFsbEZpZWxkVHlwZXMoc2VsZiwgcGFja2FnZSwgZGVzY19wcm90bywgc2NvcGUpOgorICAgICIiIlNldHMgYWxsIHRoZSBkZXNjcmlwdG9yJ3MgZmllbGRzJ3MgdHlwZXMuCisKKyAgICBUaGlzIG1ldGhvZCBhbHNvIHNldHMgdGhlIGNvbnRhaW5pbmcgdHlwZXMgb24gYW55IGV4dGVuc2lvbnMuCisKKyAgICBBcmdzOgorICAgICAgcGFja2FnZTogVGhlIGN1cnJlbnQgcGFja2FnZSBvZiBkZXNjX3Byb3RvLgorICAgICAgZGVzY19wcm90bzogVGhlIG1lc3NhZ2UgZGVzY3JpcHRvciB0byB1cGRhdGUuCisgICAgICBzY29wZTogRW5jbG9zaW5nIHNjb3BlIG9mIGF2YWlsYWJsZSB0eXBlcy4KKyAgICAiIiIKKworICAgIHBhY2thZ2UgPSBfUHJlZml4V2l0aERvdChwYWNrYWdlKQorCisgICAgbWFpbl9kZXNjID0gc2VsZi5fR2V0VHlwZUZyb21TY29wZShwYWNrYWdlLCBkZXNjX3Byb3RvLm5hbWUsIHNjb3BlKQorCisgICAgaWYgcGFja2FnZSA9PSAnLic6CisgICAgICBuZXN0ZWRfcGFja2FnZSA9IF9QcmVmaXhXaXRoRG90KGRlc2NfcHJvdG8ubmFtZSkKKyAgICBlbHNlOgorICAgICAgbmVzdGVkX3BhY2thZ2UgPSAnLicuam9pbihbcGFja2FnZSwgZGVzY19wcm90by5uYW1lXSkKKworICAgIGZvciBmaWVsZF9wcm90bywgZmllbGRfZGVzYyBpbiB6aXAoZGVzY19wcm90by5maWVsZCwgbWFpbl9kZXNjLmZpZWxkcyk6CisgICAgICBzZWxmLl9TZXRGaWVsZFR5cGUoZmllbGRfcHJvdG8sIGZpZWxkX2Rlc2MsIG5lc3RlZF9wYWNrYWdlLCBzY29wZSkKKworICAgIGZvciBleHRlbnNpb25fcHJvdG8sIGV4dGVuc2lvbl9kZXNjIGluICgKKyAgICAgICAgemlwKGRlc2NfcHJvdG8uZXh0ZW5zaW9uLCBtYWluX2Rlc2MuZXh0ZW5zaW9ucykpOgorICAgICAgZXh0ZW5zaW9uX2Rlc2MuY29udGFpbmluZ190eXBlID0gc2VsZi5fR2V0VHlwZUZyb21TY29wZSgKKyAgICAgICAgICBuZXN0ZWRfcGFja2FnZSwgZXh0ZW5zaW9uX3Byb3RvLmV4dGVuZGVlLCBzY29wZSkKKyAgICAgIHNlbGYuX1NldEZpZWxkVHlwZShleHRlbnNpb25fcHJvdG8sIGV4dGVuc2lvbl9kZXNjLCBuZXN0ZWRfcGFja2FnZSwgc2NvcGUpCisKKyAgICBmb3IgbmVzdGVkX3R5cGUgaW4gZGVzY19wcm90by5uZXN0ZWRfdHlwZToKKyAgICAgIHNlbGYuX1NldEFsbEZpZWxkVHlwZXMobmVzdGVkX3BhY2thZ2UsIG5lc3RlZF90eXBlLCBzY29wZSkKKworICBkZWYgX1NldEZpZWxkVHlwZShzZWxmLCBmaWVsZF9wcm90bywgZmllbGRfZGVzYywgcGFja2FnZSwgc2NvcGUpOgorICAgICIiIlNldHMgdGhlIGZpZWxkJ3MgdHlwZSwgY3BwX3R5cGUsIG1lc3NhZ2VfdHlwZSBhbmQgZW51bV90eXBlLgorCisgICAgQXJnczoKKyAgICAgIGZpZWxkX3Byb3RvOiBEYXRhIGFib3V0IHRoZSBmaWVsZCBpbiBwcm90byBmb3JtYXQuCisgICAgICBmaWVsZF9kZXNjOiBUaGUgZGVzY3JpcHRvciB0byBtb2RpZnkuCisgICAgICBwYWNrYWdlOiBUaGUgcGFja2FnZSB0aGUgZmllbGQncyBjb250YWluZXIgaXMgaW4uCisgICAgICBzY29wZTogRW5jbG9zaW5nIHNjb3BlIG9mIGF2YWlsYWJsZSB0eXBlcy4KKyAgICAiIiIKKyAgICBpZiBmaWVsZF9wcm90by50eXBlX25hbWU6CisgICAgICBkZXNjID0gc2VsZi5fR2V0VHlwZUZyb21TY29wZShwYWNrYWdlLCBmaWVsZF9wcm90by50eXBlX25hbWUsIHNjb3BlKQorICAgIGVsc2U6CisgICAgICBkZXNjID0gTm9uZQorCisgICAgaWYgbm90IGZpZWxkX3Byb3RvLkhhc0ZpZWxkKCd0eXBlJyk6CisgICAgICBpZiBpc2luc3RhbmNlKGRlc2MsIGRlc2NyaXB0b3IuRGVzY3JpcHRvcik6CisgICAgICAgIGZpZWxkX3Byb3RvLnR5cGUgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0UKKyAgICAgIGVsc2U6CisgICAgICAgIGZpZWxkX3Byb3RvLnR5cGUgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU0KKworICAgIGZpZWxkX2Rlc2MuY3BwX3R5cGUgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5Qcm90b1R5cGVUb0NwcFByb3RvVHlwZSgKKyAgICAgICAgZmllbGRfcHJvdG8udHlwZSkKKworICAgIGlmIChmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRQorICAgICAgICBvciBmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVApOgorICAgICAgZmllbGRfZGVzYy5tZXNzYWdlX3R5cGUgPSBkZXNjCisKKyAgICBpZiBmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTToKKyAgICAgIGZpZWxkX2Rlc2MuZW51bV90eXBlID0gZGVzYworCisgICAgaWYgZmllbGRfcHJvdG8ubGFiZWwgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICBmaWVsZF9kZXNjLmhhc19kZWZhdWx0X3ZhbHVlID0gRmFsc2UKKyAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IFtdCisgICAgZWxpZiBmaWVsZF9wcm90by5IYXNGaWVsZCgnZGVmYXVsdF92YWx1ZScpOgorICAgICAgZmllbGRfZGVzYy5oYXNfZGVmYXVsdF92YWx1ZSA9IFRydWUKKyAgICAgIGlmIChmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFIG9yCisgICAgICAgICAgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0ZMT0FUKToKKyAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlID0gZmxvYXQoZmllbGRfcHJvdG8uZGVmYXVsdF92YWx1ZSkKKyAgICAgIGVsaWYgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1NUUklORzoKKyAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlID0gZmllbGRfcHJvdG8uZGVmYXVsdF92YWx1ZQorICAgICAgZWxpZiBmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDoKKyAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlID0gZmllbGRfcHJvdG8uZGVmYXVsdF92YWx1ZS5sb3dlcigpID09ICd0cnVlJworICAgICAgZWxpZiBmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTToKKyAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlID0gZmllbGRfZGVzYy5lbnVtX3R5cGUudmFsdWVzX2J5X25hbWVbCisgICAgICAgICAgICBmaWVsZF9wcm90by5kZWZhdWx0X3ZhbHVlXS5udW1iZXIKKyAgICAgIGVsaWYgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOgorICAgICAgICBmaWVsZF9kZXNjLmRlZmF1bHRfdmFsdWUgPSB0ZXh0X2VuY29kaW5nLkNVbmVzY2FwZSgKKyAgICAgICAgICAgIGZpZWxkX3Byb3RvLmRlZmF1bHRfdmFsdWUpCisgICAgICBlbGlmIGZpZWxkX3Byb3RvLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFOgorICAgICAgICBmaWVsZF9kZXNjLmRlZmF1bHRfdmFsdWUgPSBOb25lCisgICAgICBlbHNlOgorICAgICAgICAjIEFsbCBvdGhlciB0eXBlcyBhcmUgb2YgdGhlICJpbnQiIHR5cGUuCisgICAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IGludChmaWVsZF9wcm90by5kZWZhdWx0X3ZhbHVlKQorICAgIGVsc2U6CisgICAgICBmaWVsZF9kZXNjLmhhc19kZWZhdWx0X3ZhbHVlID0gRmFsc2UKKyAgICAgIGlmIChmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFIG9yCisgICAgICAgICAgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0ZMT0FUKToKKyAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlID0gMC4wCisgICAgICBlbGlmIGZpZWxkX3Byb3RvLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkc6CisgICAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IHUnJworICAgICAgZWxpZiBmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDoKKyAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlID0gRmFsc2UKKyAgICAgIGVsaWYgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU06CisgICAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IGZpZWxkX2Rlc2MuZW51bV90eXBlLnZhbHVlc1swXS5udW1iZXIKKyAgICAgIGVsaWYgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOgorICAgICAgICBmaWVsZF9kZXNjLmRlZmF1bHRfdmFsdWUgPSBiJycKKyAgICAgIGVsaWYgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0U6CisgICAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IE5vbmUKKyAgICAgIGVsaWYgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQOgorICAgICAgICBmaWVsZF9kZXNjLmRlZmF1bHRfdmFsdWUgPSBOb25lCisgICAgICBlbHNlOgorICAgICAgICAjIEFsbCBvdGhlciB0eXBlcyBhcmUgb2YgdGhlICJpbnQiIHR5cGUuCisgICAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IDAKKworICAgIGZpZWxkX2Rlc2MudHlwZSA9IGZpZWxkX3Byb3RvLnR5cGUKKworICBkZWYgX01ha2VFbnVtVmFsdWVEZXNjcmlwdG9yKHNlbGYsIHZhbHVlX3Byb3RvLCBpbmRleCk6CisgICAgIiIiQ3JlYXRlcyBhIGVudW0gdmFsdWUgZGVzY3JpcHRvciBvYmplY3QgZnJvbSBhIGVudW0gdmFsdWUgcHJvdG8uCisKKyAgICBBcmdzOgorICAgICAgdmFsdWVfcHJvdG86IFRoZSBwcm90byBkZXNjcmliaW5nIHRoZSBlbnVtIHZhbHVlLgorICAgICAgaW5kZXg6IFRoZSBpbmRleCBvZiB0aGUgZW51bSB2YWx1ZS4KKworICAgIFJldHVybnM6CisgICAgICBBbiBpbml0aWFsaXplZCBFbnVtVmFsdWVEZXNjcmlwdG9yIG9iamVjdC4KKyAgICAiIiIKKworICAgIHJldHVybiBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICAgIG5hbWU9dmFsdWVfcHJvdG8ubmFtZSwKKyAgICAgICAgaW5kZXg9aW5kZXgsCisgICAgICAgIG51bWJlcj12YWx1ZV9wcm90by5udW1iZXIsCisgICAgICAgIG9wdGlvbnM9X09wdGlvbnNPck5vbmUodmFsdWVfcHJvdG8pLAorICAgICAgICB0eXBlPU5vbmUsCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgY3JlYXRlX2tleT1kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KQorCisgIGRlZiBfTWFrZVNlcnZpY2VEZXNjcmlwdG9yKHNlbGYsIHNlcnZpY2VfcHJvdG8sIHNlcnZpY2VfaW5kZXgsIHNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLCBmaWxlX2Rlc2MpOgorICAgICIiIk1ha2UgYSBwcm90b2J1ZiBTZXJ2aWNlRGVzY3JpcHRvciBnaXZlbiBhIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8uCisKKyAgICBBcmdzOgorICAgICAgc2VydmljZV9wcm90bzogVGhlIGRlc2NyaXB0b3JfcGIyLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gcHJvdG9idWYgbWVzc2FnZS4KKyAgICAgIHNlcnZpY2VfaW5kZXg6IFRoZSBpbmRleCBvZiB0aGUgc2VydmljZSBpbiB0aGUgRmlsZS4KKyAgICAgIHNjb3BlOiBEaWN0IG1hcHBpbmcgc2hvcnQgYW5kIGZ1bGwgc3ltYm9scyB0byBtZXNzYWdlIGFuZCBlbnVtIHR5cGVzLgorICAgICAgcGFja2FnZTogT3B0aW9uYWwgcGFja2FnZSBuYW1lIGZvciB0aGUgbmV3IG1lc3NhZ2UgRW51bURlc2NyaXB0b3IuCisgICAgICBmaWxlX2Rlc2M6IFRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHNlcnZpY2UgZGVzY3JpcHRvci4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgYWRkZWQgZGVzY3JpcHRvci4KKyAgICAiIiIKKworICAgIGlmIHBhY2thZ2U6CisgICAgICBzZXJ2aWNlX25hbWUgPSAnLicuam9pbigocGFja2FnZSwgc2VydmljZV9wcm90by5uYW1lKSkKKyAgICBlbHNlOgorICAgICAgc2VydmljZV9uYW1lID0gc2VydmljZV9wcm90by5uYW1lCisKKyAgICBtZXRob2RzID0gW3NlbGYuX01ha2VNZXRob2REZXNjcmlwdG9yKG1ldGhvZF9wcm90bywgc2VydmljZV9uYW1lLCBwYWNrYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUsIGluZGV4KQorICAgICAgICAgICAgICAgZm9yIGluZGV4LCBtZXRob2RfcHJvdG8gaW4gZW51bWVyYXRlKHNlcnZpY2VfcHJvdG8ubWV0aG9kKV0KKyAgICBkZXNjID0gZGVzY3JpcHRvci5TZXJ2aWNlRGVzY3JpcHRvcigKKyAgICAgICAgbmFtZT1zZXJ2aWNlX3Byb3RvLm5hbWUsCisgICAgICAgIGZ1bGxfbmFtZT1zZXJ2aWNlX25hbWUsCisgICAgICAgIGluZGV4PXNlcnZpY2VfaW5kZXgsCisgICAgICAgIG1ldGhvZHM9bWV0aG9kcywKKyAgICAgICAgb3B0aW9ucz1fT3B0aW9uc09yTm9uZShzZXJ2aWNlX3Byb3RvKSwKKyAgICAgICAgZmlsZT1maWxlX2Rlc2MsCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgY3JlYXRlX2tleT1kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KQorICAgIHNlbGYuX0NoZWNrQ29uZmxpY3RSZWdpc3RlcihkZXNjLCBkZXNjLmZ1bGxfbmFtZSwgZGVzYy5maWxlLm5hbWUpCisgICAgc2VsZi5fc2VydmljZV9kZXNjcmlwdG9yc1tzZXJ2aWNlX25hbWVdID0gZGVzYworICAgIHJldHVybiBkZXNjCisKKyAgZGVmIF9NYWtlTWV0aG9kRGVzY3JpcHRvcihzZWxmLCBtZXRob2RfcHJvdG8sIHNlcnZpY2VfbmFtZSwgcGFja2FnZSwgc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOgorICAgICIiIkNyZWF0ZXMgYSBtZXRob2QgZGVzY3JpcHRvciBmcm9tIGEgTWV0aG9kRGVzY3JpcHRvclByb3RvLgorCisgICAgQXJnczoKKyAgICAgIG1ldGhvZF9wcm90bzogVGhlIHByb3RvIGRlc2NyaWJpbmcgdGhlIG1ldGhvZC4KKyAgICAgIHNlcnZpY2VfbmFtZTogVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5pbmcgc2VydmljZS4KKyAgICAgIHBhY2thZ2U6IE9wdGlvbmFsIHBhY2thZ2UgbmFtZSB0byBsb29rIHVwIGZvciB0eXBlcy4KKyAgICAgIHNjb3BlOiBTY29wZSBjb250YWluaW5nIGF2YWlsYWJsZSB0eXBlcy4KKyAgICAgIGluZGV4OiBJbmRleCBvZiB0aGUgbWV0aG9kIGluIHRoZSBzZXJ2aWNlLgorCisgICAgUmV0dXJuczoKKyAgICAgIEFuIGluaXRpYWxpemVkIE1ldGhvZERlc2NyaXB0b3Igb2JqZWN0LgorICAgICIiIgorICAgIGZ1bGxfbmFtZSA9ICcuJy5qb2luKChzZXJ2aWNlX25hbWUsIG1ldGhvZF9wcm90by5uYW1lKSkKKyAgICBpbnB1dF90eXBlID0gc2VsZi5fR2V0VHlwZUZyb21TY29wZSgKKyAgICAgICAgcGFja2FnZSwgbWV0aG9kX3Byb3RvLmlucHV0X3R5cGUsIHNjb3BlKQorICAgIG91dHB1dF90eXBlID0gc2VsZi5fR2V0VHlwZUZyb21TY29wZSgKKyAgICAgICAgcGFja2FnZSwgbWV0aG9kX3Byb3RvLm91dHB1dF90eXBlLCBzY29wZSkKKyAgICByZXR1cm4gZGVzY3JpcHRvci5NZXRob2REZXNjcmlwdG9yKAorICAgICAgICBuYW1lPW1ldGhvZF9wcm90by5uYW1lLAorICAgICAgICBmdWxsX25hbWU9ZnVsbF9uYW1lLAorICAgICAgICBpbmRleD1pbmRleCwKKyAgICAgICAgY29udGFpbmluZ19zZXJ2aWNlPU5vbmUsCisgICAgICAgIGlucHV0X3R5cGU9aW5wdXRfdHlwZSwKKyAgICAgICAgb3V0cHV0X3R5cGU9b3V0cHV0X3R5cGUsCisgICAgICAgIGNsaWVudF9zdHJlYW1pbmc9bWV0aG9kX3Byb3RvLmNsaWVudF9zdHJlYW1pbmcsCisgICAgICAgIHNlcnZlcl9zdHJlYW1pbmc9bWV0aG9kX3Byb3RvLnNlcnZlcl9zdHJlYW1pbmcsCisgICAgICAgIG9wdGlvbnM9X09wdGlvbnNPck5vbmUobWV0aG9kX3Byb3RvKSwKKyAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgICBjcmVhdGVfa2V5PWRlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpCisKKyAgZGVmIF9FeHRyYWN0U3ltYm9scyhzZWxmLCBkZXNjcmlwdG9ycyk6CisgICAgIiIiUHVsbHMgb3V0IGFsbCB0aGUgc3ltYm9scyBmcm9tIGRlc2NyaXB0b3IgcHJvdG9zLgorCisgICAgQXJnczoKKyAgICAgIGRlc2NyaXB0b3JzOiBUaGUgbWVzc2FnZXMgdG8gZXh0cmFjdCBkZXNjcmlwdG9ycyBmcm9tLgorICAgIFlpZWxkczoKKyAgICAgIEEgdHdvIGVsZW1lbnQgdHVwbGUgb2YgdGhlIHR5cGUgbmFtZSBhbmQgZGVzY3JpcHRvciBvYmplY3QuCisgICAgIiIiCisKKyAgICBmb3IgZGVzYyBpbiBkZXNjcmlwdG9yczoKKyAgICAgIHlpZWxkIChfUHJlZml4V2l0aERvdChkZXNjLmZ1bGxfbmFtZSksIGRlc2MpCisgICAgICBmb3Igc3ltYm9sIGluIHNlbGYuX0V4dHJhY3RTeW1ib2xzKGRlc2MubmVzdGVkX3R5cGVzKToKKyAgICAgICAgeWllbGQgc3ltYm9sCisgICAgICBmb3IgZW51bSBpbiBkZXNjLmVudW1fdHlwZXM6CisgICAgICAgIHlpZWxkIChfUHJlZml4V2l0aERvdChlbnVtLmZ1bGxfbmFtZSksIGVudW0pCisKKyAgZGVmIF9HZXREZXBzKHNlbGYsIGRlcGVuZGVuY2llcywgdmlzaXRlZD1Ob25lKToKKyAgICAiIiJSZWN1cnNpdmVseSBmaW5kcyBkZXBlbmRlbmNpZXMgZm9yIGZpbGUgcHJvdG9zLgorCisgICAgQXJnczoKKyAgICAgIGRlcGVuZGVuY2llczogVGhlIG5hbWVzIG9mIHRoZSBmaWxlcyBiZWluZyBkZXBlbmRlZCBvbi4KKyAgICAgIHZpc2l0ZWQ6IFRoZSBuYW1lcyBvZiBmaWxlcyBhbHJlYWR5IGZvdW5kLgorCisgICAgWWllbGRzOgorICAgICAgRWFjaCBkaXJlY3QgYW5kIGluZGlyZWN0IGRlcGVuZGVuY3kuCisgICAgIiIiCisKKyAgICB2aXNpdGVkID0gdmlzaXRlZCBvciBzZXQoKQorICAgIGZvciBkZXBlbmRlbmN5IGluIGRlcGVuZGVuY2llczoKKyAgICAgIGlmIGRlcGVuZGVuY3kgbm90IGluIHZpc2l0ZWQ6CisgICAgICAgIHZpc2l0ZWQuYWRkKGRlcGVuZGVuY3kpCisgICAgICAgIGRlcF9kZXNjID0gc2VsZi5GaW5kRmlsZUJ5TmFtZShkZXBlbmRlbmN5KQorICAgICAgICB5aWVsZCBkZXBfZGVzYworICAgICAgICBwdWJsaWNfZmlsZXMgPSBbZC5uYW1lIGZvciBkIGluIGRlcF9kZXNjLnB1YmxpY19kZXBlbmRlbmNpZXNdCisgICAgICAgIHlpZWxkIGZyb20gc2VsZi5fR2V0RGVwcyhwdWJsaWNfZmlsZXMsIHZpc2l0ZWQpCisKKyAgZGVmIF9HZXRUeXBlRnJvbVNjb3BlKHNlbGYsIHBhY2thZ2UsIHR5cGVfbmFtZSwgc2NvcGUpOgorICAgICIiIkZpbmRzIGEgZ2l2ZW4gdHlwZSBuYW1lIGluIHRoZSBjdXJyZW50IHNjb3BlLgorCisgICAgQXJnczoKKyAgICAgIHBhY2thZ2U6IFRoZSBwYWNrYWdlIHRoZSBwcm90byBzaG91bGQgYmUgbG9jYXRlZCBpbi4KKyAgICAgIHR5cGVfbmFtZTogVGhlIG5hbWUgb2YgdGhlIHR5cGUgdG8gYmUgZm91bmQgaW4gdGhlIHNjb3BlLgorICAgICAgc2NvcGU6IERpY3QgbWFwcGluZyBzaG9ydCBhbmQgZnVsbCBzeW1ib2xzIHRvIG1lc3NhZ2UgYW5kIGVudW0gdHlwZXMuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGRlc2NyaXB0b3IgZm9yIHRoZSByZXF1ZXN0ZWQgdHlwZS4KKyAgICAiIiIKKyAgICBpZiB0eXBlX25hbWUgbm90IGluIHNjb3BlOgorICAgICAgY29tcG9uZW50cyA9IF9QcmVmaXhXaXRoRG90KHBhY2thZ2UpLnNwbGl0KCcuJykKKyAgICAgIHdoaWxlIGNvbXBvbmVudHM6CisgICAgICAgIHBvc3NpYmxlX21hdGNoID0gJy4nLmpvaW4oY29tcG9uZW50cyArIFt0eXBlX25hbWVdKQorICAgICAgICBpZiBwb3NzaWJsZV9tYXRjaCBpbiBzY29wZToKKyAgICAgICAgICB0eXBlX25hbWUgPSBwb3NzaWJsZV9tYXRjaAorICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgY29tcG9uZW50cy5wb3AoLTEpCisgICAgcmV0dXJuIHNjb3BlW3R5cGVfbmFtZV0KKworCitkZWYgX1ByZWZpeFdpdGhEb3QobmFtZSk6CisgIHJldHVybiBuYW1lIGlmIG5hbWUuc3RhcnRzd2l0aCgnLicpIGVsc2UgJy4lcycgJSBuYW1lCisKKworaWYgX1VTRV9DX0RFU0NSSVBUT1JTOgorICAjIFRPRE8oYW1hdXJ5ZmEpOiBUaGlzIHBvb2wgY291bGQgYmUgY29uc3RydWN0ZWQgZnJvbSBQeXRob24gY29kZSwgd2hlbiB3ZQorICAjIHN1cHBvcnQgYSBmbGFnIGxpa2UgJ3VzZV9jcHBfZ2VuZXJhdGVkX3Bvb2w9VHJ1ZScuCisgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgX0RFRkFVTFQgPSBkZXNjcmlwdG9yLl9tZXNzYWdlLmRlZmF1bHRfcG9vbAorZWxzZToKKyAgX0RFRkFVTFQgPSBEZXNjcmlwdG9yUG9vbCgpCisKKworZGVmIERlZmF1bHQoKToKKyAgcmV0dXJuIF9ERUZBVUxUCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uX3BiMi5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZHVyYXRpb25fcGIyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2E5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uX3BiMi5weQpAQCAtMCwwICsxLDc4IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorIyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90bworIiIiR2VuZXJhdGVkIHByb3RvY29sIGJ1ZmZlciBjb2RlLiIiIgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IgYXMgX2Rlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlIGFzIF9tZXNzYWdlCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgcmVmbGVjdGlvbiBhcyBfcmVmbGVjdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHN5bWJvbF9kYXRhYmFzZSBhcyBfc3ltYm9sX2RhdGFiYXNlCisjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQorCitfc3ltX2RiID0gX3N5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkKKworCisKKworREVTQ1JJUFRPUiA9IF9kZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKAorICBuYW1lPSdnb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8nLAorICBwYWNrYWdlPSdnb29nbGUucHJvdG9idWYnLAorICBzeW50YXg9J3Byb3RvMycsCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1iJ1xuXDAyM2NvbS5nb29nbGUucHJvdG9idWZCXHJEdXJhdGlvblByb3RvUFwwMDFaMWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2R1cmF0aW9ucGJcMzcwXDAwMVwwMDFcMjQyXDAwMlwwMDNHUEJcMjUyXDAwMlwwMzZHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMnLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBzZXJpYWxpemVkX3BiPWInXG5ceDFlZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvXHgxMlx4MGZnb29nbGUucHJvdG9idWZcIipcblx4MDhceDQ0dXJhdGlvblx4MTJceDBmXG5ceDA3c2Vjb25kc1x4MThceDAxIFx4MDEoXHgwM1x4MTJcclxuXHgwNW5hbm9zXHgxOFx4MDIgXHgwMShceDA1XHg0Mlx4ODNceDAxXG5ceDEzXHg2M29tLmdvb2dsZS5wcm90b2J1ZkJcckR1cmF0aW9uUHJvdG9QXHgwMVoxZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vZHVyYXRpb25wYlx4ZjhceDAxXHgwMVx4YTJceDAyXHgwM0dQQlx4YWFceDAyXHgxZUdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2JceDA2cHJvdG8zJworKQorCisKKworCitfRFVSQVRJT04gPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdEdXJhdGlvbicsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdzZWNvbmRzJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRHVyYXRpb24uc2Vjb25kcycsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT0zLCBjcHBfdHlwZT0yLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J25hbm9zJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRHVyYXRpb24ubmFub3MnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMycsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9NTEsCisgIHNlcmlhbGl6ZWRfZW5kPTkzLAorKQorCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnRHVyYXRpb24nXSA9IF9EVVJBVElPTgorX3N5bV9kYi5SZWdpc3RlckZpbGVEZXNjcmlwdG9yKERFU0NSSVBUT1IpCisKK0R1cmF0aW9uID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnRHVyYXRpb24nLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICdERVNDUklQVE9SJyA6IF9EVVJBVElPTiwKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5kdXJhdGlvbl9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbikKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKER1cmF0aW9uKQorCisKK0RFU0NSSVBUT1IuX29wdGlvbnMgPSBOb25lCisjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtb2R1bGVfc2NvcGUpCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2VtcHR5X3BiMi5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZW1wdHlfcGIyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOWQ0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2VtcHR5X3BiMi5weQpAQCAtMCwwICsxLDY0IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorIyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90bworIiIiR2VuZXJhdGVkIHByb3RvY29sIGJ1ZmZlciBjb2RlLiIiIgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IgYXMgX2Rlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlIGFzIF9tZXNzYWdlCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgcmVmbGVjdGlvbiBhcyBfcmVmbGVjdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHN5bWJvbF9kYXRhYmFzZSBhcyBfc3ltYm9sX2RhdGFiYXNlCisjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQorCitfc3ltX2RiID0gX3N5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkKKworCisKKworREVTQ1JJUFRPUiA9IF9kZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKAorICBuYW1lPSdnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8nLAorICBwYWNrYWdlPSdnb29nbGUucHJvdG9idWYnLAorICBzeW50YXg9J3Byb3RvMycsCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1iJ1xuXDAyM2NvbS5nb29nbGUucHJvdG9idWZCXG5FbXB0eVByb3RvUFwwMDFaLmdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2VtcHR5cGJcMzcwXDAwMVwwMDFcMjQyXDAwMlwwMDNHUEJcMjUyXDAwMlwwMzZHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMnLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBzZXJpYWxpemVkX3BiPWInXG5ceDFiZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvXHgxMlx4MGZnb29nbGUucHJvdG9idWZcIlx4MDdcblx4MDVceDQ1bXB0eUJ9XG5ceDEzXHg2M29tLmdvb2dsZS5wcm90b2J1ZkJcbkVtcHR5UHJvdG9QXHgwMVouZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vZW1wdHlwYlx4ZjhceDAxXHgwMVx4YTJceDAyXHgwM0dQQlx4YWFceDAyXHgxZUdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2JceDA2cHJvdG8zJworKQorCisKKworCitfRU1QVFkgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdFbXB0eScsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVtcHR5JywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMycsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9NDgsCisgIHNlcmlhbGl6ZWRfZW5kPTU1LAorKQorCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnRW1wdHknXSA9IF9FTVBUWQorX3N5bV9kYi5SZWdpc3RlckZpbGVEZXNjcmlwdG9yKERFU0NSSVBUT1IpCisKK0VtcHR5ID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnRW1wdHknLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICdERVNDUklQVE9SJyA6IF9FTVBUWSwKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5lbXB0eV9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbXB0eSkKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKEVtcHR5KQorCisKK0RFU0NSSVBUT1IuX29wdGlvbnMgPSBOb25lCisjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtb2R1bGVfc2NvcGUpCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2tfcGIyLnB5IGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrX3BiMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQ5NDI0Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrX3BiMi5weQpAQCAtMCwwICsxLDcxIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorIyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvCisiIiJHZW5lcmF0ZWQgcHJvdG9jb2wgYnVmZmVyIGNvZGUuIiIiCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvciBhcyBfZGVzY3JpcHRvcgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UgYXMgX21lc3NhZ2UKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCByZWZsZWN0aW9uIGFzIF9yZWZsZWN0aW9uCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc3ltYm9sX2RhdGFiYXNlIGFzIF9zeW1ib2xfZGF0YWJhc2UKKyMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGltcG9ydHMpCisKK19zeW1fZGIgPSBfc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKQorCisKKworCitERVNDUklQVE9SID0gX2Rlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IoCisgIG5hbWU9J2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvJywKKyAgcGFja2FnZT0nZ29vZ2xlLnByb3RvYnVmJywKKyAgc3ludGF4PSdwcm90bzMnLAorICBzZXJpYWxpemVkX29wdGlvbnM9YidcblwwMjNjb20uZ29vZ2xlLnByb3RvYnVmQlwwMTZGaWVsZE1hc2tQcm90b1BcMDAxWjJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9maWVsZG1hc2twYlwzNzBcMDAxXDAwMVwyNDJcMDAyXDAwM0dQQlwyNTJcMDAyXDAzNkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcycsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIHNlcmlhbGl6ZWRfcGI9YidcbiBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90b1x4MTJceDBmZ29vZ2xlLnByb3RvYnVmXCJceDFhXG5cdEZpZWxkTWFza1x4MTJcclxuXHgwNXBhdGhzXHgxOFx4MDEgXHgwMyhcdEJceDg1XHgwMVxuXHgxM1x4NjNvbS5nb29nbGUucHJvdG9idWZCXHgwZVx4NDZpZWxkTWFza1Byb3RvUFx4MDFaMmdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2ZpZWxkbWFza3BiXHhmOFx4MDFceDAxXHhhMlx4MDJceDAzR1BCXHhhYVx4MDJceDFlR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYlx4MDZwcm90bzMnCispCisKKworCisKK19GSUVMRE1BU0sgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdGaWVsZE1hc2snLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2snLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3BhdGhzJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGRNYXNrLnBhdGhzJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8zJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD01MywKKyAgc2VyaWFsaXplZF9lbmQ9NzksCispCisKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydGaWVsZE1hc2snXSA9IF9GSUVMRE1BU0sKK19zeW1fZGIuUmVnaXN0ZXJGaWxlRGVzY3JpcHRvcihERVNDUklQVE9SKQorCitGaWVsZE1hc2sgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdGaWVsZE1hc2snLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICdERVNDUklQVE9SJyA6IF9GSUVMRE1BU0ssCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuZmllbGRfbWFza19wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2spCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShGaWVsZE1hc2spCisKKworREVTQ1JJUFRPUi5fb3B0aW9ucyA9IE5vbmUKKyMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1vZHVsZV9zY29wZSkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvX19pbml0X18ucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL19wYXJhbWV0ZXJpemVkLnB5IGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9fcGFyYW1ldGVyaXplZC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZmRiYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9fcGFyYW1ldGVyaXplZC5weQpAQCAtMCwwICsxLDQ0MyBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJBZGRzIHN1cHBvcnQgZm9yIHBhcmFtZXRlcml6ZWQgdGVzdHMgdG8gUHl0aG9uJ3MgdW5pdHRlc3QgVGVzdENhc2UgY2xhc3MuCisKK0EgcGFyYW1ldGVyaXplZCB0ZXN0IGlzIGEgbWV0aG9kIGluIGEgdGVzdCBjYXNlIHRoYXQgaXMgaW52b2tlZCB3aXRoIGRpZmZlcmVudAorYXJndW1lbnQgdHVwbGVzLgorCitBIHNpbXBsZSBleGFtcGxlOgorCisgIGNsYXNzIEFkZGl0aW9uRXhhbXBsZShwYXJhbWV0ZXJpemVkLlRlc3RDYXNlKToKKyAgICBAcGFyYW1ldGVyaXplZC5wYXJhbWV0ZXJzKAorICAgICAgICgxLCAyLCAzKSwKKyAgICAgICAoNCwgNSwgOSksCisgICAgICAgKDEsIDEsIDMpKQorICAgIGRlZiB0ZXN0QWRkaXRpb24oc2VsZiwgb3AxLCBvcDIsIHJlc3VsdCk6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgb3AxICsgb3AyKQorCisKK0VhY2ggaW52b2NhdGlvbiBpcyBhIHNlcGFyYXRlIHRlc3QgY2FzZSBhbmQgcHJvcGVybHkgaXNvbGF0ZWQganVzdAorbGlrZSBhIG5vcm1hbCB0ZXN0IG1ldGhvZCwgd2l0aCBpdHMgb3duIHNldFVwL3RlYXJEb3duIGN5Y2xlLiBJbiB0aGUKK2V4YW1wbGUgYWJvdmUsIHRoZXJlIGFyZSB0aHJlZSBzZXBhcmF0ZSB0ZXN0Y2FzZXMsIG9uZSBvZiB3aGljaCB3aWxsCitmYWlsIGR1ZSB0byBhbiBhc3NlcnRpb24gZXJyb3IgKDEgKyAxICE9IDMpLgorCitQYXJhbWV0ZXJzIGZvciBpbmRpdmlkdWFsIHRlc3QgY2FzZXMgY2FuIGJlIHR1cGxlcyAod2l0aCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMpCitvciBkaWN0aW9uYXJpZXMgKHdpdGggbmFtZWQgcGFyYW1ldGVycyk6CisKKyAgY2xhc3MgQWRkaXRpb25FeGFtcGxlKHBhcmFtZXRlcml6ZWQuVGVzdENhc2UpOgorICAgIEBwYXJhbWV0ZXJpemVkLnBhcmFtZXRlcnMoCisgICAgICAgeydvcDEnOiAxLCAnb3AyJzogMiwgJ3Jlc3VsdCc6IDN9LAorICAgICAgIHsnb3AxJzogNCwgJ29wMic6IDUsICdyZXN1bHQnOiA5fSwKKyAgICApCisgICAgZGVmIHRlc3RBZGRpdGlvbihzZWxmLCBvcDEsIG9wMiwgcmVzdWx0KToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBvcDEgKyBvcDIpCisKK0lmIGEgcGFyYW1ldGVyaXplZCB0ZXN0IGZhaWxzLCB0aGUgZXJyb3IgbWVzc2FnZSB3aWxsIHNob3cgdGhlCitvcmlnaW5hbCB0ZXN0IG5hbWUgKHdoaWNoIGlzIG1vZGlmaWVkIGludGVybmFsbHkpIGFuZCB0aGUgYXJndW1lbnRzCitmb3IgdGhlIHNwZWNpZmljIGludm9jYXRpb24sIHdoaWNoIGFyZSBwYXJ0IG9mIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkKK3RoZSBzaG9ydERlc2NyaXB0aW9uKCkgbWV0aG9kIG9uIHRlc3QgY2FzZXMuCisKK1RoZSBpZCBtZXRob2Qgb2YgdGhlIHRlc3QsIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgdW5pdHRlc3QgZnJhbWV3b3JrLAoraXMgYWxzbyBtb2RpZmllZCB0byBzaG93IHRoZSBhcmd1bWVudHMuIFRvIG1ha2Ugc3VyZSB0aGF0IHRlc3QgbmFtZXMKK3N0YXkgdGhlIHNhbWUgYWNyb3NzIHNldmVyYWwgaW52b2NhdGlvbnMsIG9iamVjdCByZXByZXNlbnRhdGlvbnMgbGlrZQorCisgID4+PiBjbGFzcyBGb28ob2JqZWN0KToKKyAgLi4uICBwYXNzCisgID4+PiByZXByKEZvbygpKQorICAnPF9fbWFpbl9fLkZvbyBvYmplY3QgYXQgMHgyM2Q4NjEwPicKKworYXJlIHR1cm5lZCBpbnRvICc8X19tYWluX18uRm9vPicuIEZvciBldmVuIG1vcmUgZGVzY3JpcHRpdmUgbmFtZXMsCitlc3BlY2lhbGx5IGluIHRlc3QgbG9ncywgeW91IGNhbiB1c2UgdGhlIG5hbWVkX3BhcmFtZXRlcnMgZGVjb3JhdG9yLiBJbgordGhpcyBjYXNlLCBvbmx5IHR1cGxlcyBhcmUgc3VwcG9ydGVkLCBhbmQgdGhlIGZpcnN0IHBhcmFtZXRlcnMgaGFzIHRvCitiZSBhIHN0cmluZyAob3IgYW4gb2JqZWN0IHRoYXQgcmV0dXJucyBhbiBhcHQgbmFtZSB3aGVuIGNvbnZlcnRlZCB2aWEKK3N0cigpKToKKworICBjbGFzcyBOYW1lZEV4YW1wbGUocGFyYW1ldGVyaXplZC5UZXN0Q2FzZSk6CisgICAgQHBhcmFtZXRlcml6ZWQubmFtZWRfcGFyYW1ldGVycygKKyAgICAgICAoJ05vcm1hbCcsICdhYScsICdhYWEnLCBUcnVlKSwKKyAgICAgICAoJ0VtcHR5UHJlZml4JywgJycsICdhYmMnLCBUcnVlKSwKKyAgICAgICAoJ0JvdGhFbXB0eScsICcnLCAnJywgVHJ1ZSkpCisgICAgZGVmIHRlc3RTdGFydHNXaXRoKHNlbGYsIHByZWZpeCwgc3RyaW5nLCByZXN1bHQpOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHN0cmluZ3Muc3RhcnRzd2l0aChwcmVmaXgpKQorCitOYW1lZCB0ZXN0cyBhbHNvIGhhdmUgdGhlIGJlbmVmaXQgdGhhdCB0aGV5IGNhbiBiZSBydW4gaW5kaXZpZHVhbGx5Citmcm9tIHRoZSBjb21tYW5kIGxpbmU6CisKKyAgJCB0ZXN0bW9kdWxlLnB5IE5hbWVkRXhhbXBsZS50ZXN0U3RhcnRzV2l0aE5vcm1hbAorICAuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFJhbiAxIHRlc3QgaW4gMC4wMDBzCisKKyAgT0sKKworUGFyYW1ldGVyaXplZCBDbGFzc2VzCis9PT09PT09PT09PT09PT09PT09PT0KK0lmIGludm9jYXRpb24gYXJndW1lbnRzIGFyZSBzaGFyZWQgYWNyb3NzIHRlc3QgbWV0aG9kcyBpbiBhIHNpbmdsZQorVGVzdENhc2UgY2xhc3MsIGluc3RlYWQgb2YgZGVjb3JhdGluZyBhbGwgdGVzdCBtZXRob2RzCitpbmRpdmlkdWFsbHksIHRoZSBjbGFzcyBpdHNlbGYgY2FuIGJlIGRlY29yYXRlZDoKKworICBAcGFyYW1ldGVyaXplZC5wYXJhbWV0ZXJzKAorICAgICgxLCAyLCAzKQorICAgICg0LCA1LCA5KSkKKyAgY2xhc3MgQXJpdGhtZXRpY1Rlc3QocGFyYW1ldGVyaXplZC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RBZGQoc2VsZiwgYXJnMSwgYXJnMiwgcmVzdWx0KToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJnMSArIGFyZzIsIHJlc3VsdCkKKworICAgIGRlZiB0ZXN0U3VidHJhY3Qoc2VsZiwgYXJnMiwgYXJnMiwgcmVzdWx0KToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0IC0gYXJnMSwgYXJnMikKKworSW5wdXRzIGZyb20gSXRlcmFibGVzCis9PT09PT09PT09PT09PT09PT09PT0KK0lmIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHNoYXJlZCBhY3Jvc3Mgc2V2ZXJhbCB0ZXN0IGNhc2VzLCBvciBhcmUgZHluYW1pY2FsbHkKK2NyZWF0ZWQgZnJvbSBvdGhlciBzb3VyY2VzLCBhIHNpbmdsZSBub24tdHVwbGUgaXRlcmFibGUgY2FuIGJlIHBhc3NlZCBpbnRvCit0aGUgZGVjb3JhdG9yLiBUaGlzIGl0ZXJhYmxlIHdpbGwgYmUgdXNlZCB0byBvYnRhaW4gdGhlIHRlc3QgY2FzZXM6CisKKyAgY2xhc3MgQWRkaXRpb25FeGFtcGxlKHBhcmFtZXRlcml6ZWQuVGVzdENhc2UpOgorICAgIEBwYXJhbWV0ZXJpemVkLnBhcmFtZXRlcnMoCisgICAgICBjLm9wMSwgYy5vcDIsIGMucmVzdWx0IGZvciBjIGluIHRlc3RjYXNlcworICAgICkKKyAgICBkZWYgdGVzdEFkZGl0aW9uKHNlbGYsIG9wMSwgb3AyLCByZXN1bHQpOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIG9wMSArIG9wMikKKworCitTaW5nbGUtQXJndW1lbnQgVGVzdCBNZXRob2RzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJZiBhIHRlc3QgbWV0aG9kIHRha2VzIG9ubHkgb25lIGFyZ3VtZW50LCB0aGUgc2luZ2xlIGFyZ3VtZW50IGRvZXMgbm90IG5lZWQgdG8KK2JlIHdyYXBwZWQgaW50byBhIHR1cGxlOgorCisgIGNsYXNzIE5lZ2F0aXZlTnVtYmVyRXhhbXBsZShwYXJhbWV0ZXJpemVkLlRlc3RDYXNlKToKKyAgICBAcGFyYW1ldGVyaXplZC5wYXJhbWV0ZXJzKAorICAgICAgIC0xLCAtMywgLTQsIC01CisgICAgKQorICAgIGRlZiB0ZXN0SXNOZWdhdGl2ZShzZWxmLCBhcmcpOgorICAgICAgc2VsZi5hc3NlcnRUcnVlKElzTmVnYXRpdmUoYXJnKSkKKyIiIgorCitfX2F1dGhvcl9fID0gJ3RtYXJla0Bnb29nbGUuY29tIChUb3JzdGVuIE1hcmVrKScKKworaW1wb3J0IGZ1bmN0b29scworaW1wb3J0IHJlCitpbXBvcnQgdHlwZXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHV1aWQKKwordHJ5OgorICAjIFNpbmNlIHB5dGhvbiAzCisgIGltcG9ydCBjb2xsZWN0aW9ucy5hYmMgYXMgY29sbGVjdGlvbnNfYWJjCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICMgV29uJ3Qgd29yayBhZnRlciBweXRob24gMy44CisgIGltcG9ydCBjb2xsZWN0aW9ucyBhcyBjb2xsZWN0aW9uc19hYmMKKworQUREUl9SRSA9IHJlLmNvbXBpbGUocidcPChbYS16QS1aMC05X1wtXC5dKykgb2JqZWN0IGF0IDB4W2EtZkEtRjAtOV0rXD4nKQorX1NFUEFSQVRPUiA9IHV1aWQudXVpZDEoKS5oZXgKK19GSVJTVF9BUkcgPSBvYmplY3QoKQorX0FSR1VNRU5UX1JFUFIgPSBvYmplY3QoKQorCisKK2RlZiBfQ2xlYW5SZXByKG9iaik6CisgIHJldHVybiBBRERSX1JFLnN1YihyJzxcMT4nLCByZXByKG9iaikpCisKKworIyBIZWxwZXIgZnVuY3Rpb24gZm9ybWVybHkgZnJvbSB0aGUgdW5pdHRlc3QgbW9kdWxlLCByZW1vdmVkIGZyb20gaXQgaW4KKyMgUHl0aG9uIDIuNy4KK2RlZiBfU3RyQ2xhc3MoY2xzKToKKyAgcmV0dXJuICclcy4lcycgJSAoY2xzLl9fbW9kdWxlX18sIGNscy5fX25hbWVfXykKKworCitkZWYgX05vblN0cmluZ0l0ZXJhYmxlKG9iaik6CisgIHJldHVybiAoaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zX2FiYy5JdGVyYWJsZSkgYW5kCisgICAgICAgICAgbm90IGlzaW5zdGFuY2Uob2JqLCBzdHIpKQorCisKK2RlZiBfRm9ybWF0UGFyYW1ldGVyTGlzdCh0ZXN0Y2FzZV9wYXJhbXMpOgorICBpZiBpc2luc3RhbmNlKHRlc3RjYXNlX3BhcmFtcywgY29sbGVjdGlvbnNfYWJjLk1hcHBpbmcpOgorICAgIHJldHVybiAnLCAnLmpvaW4oJyVzPSVzJyAlIChhcmduYW1lLCBfQ2xlYW5SZXByKHZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgIGZvciBhcmduYW1lLCB2YWx1ZSBpbiB0ZXN0Y2FzZV9wYXJhbXMuaXRlbXMoKSkKKyAgZWxpZiBfTm9uU3RyaW5nSXRlcmFibGUodGVzdGNhc2VfcGFyYW1zKToKKyAgICByZXR1cm4gJywgJy5qb2luKG1hcChfQ2xlYW5SZXByLCB0ZXN0Y2FzZV9wYXJhbXMpKQorICBlbHNlOgorICAgIHJldHVybiBfRm9ybWF0UGFyYW1ldGVyTGlzdCgodGVzdGNhc2VfcGFyYW1zLCkpCisKKworY2xhc3MgX1BhcmFtZXRlcml6ZWRUZXN0SXRlcihvYmplY3QpOgorICAiIiJDYWxsYWJsZSBhbmQgaXRlcmFibGUgY2xhc3MgZm9yIHByb2R1Y2luZyBuZXcgdGVzdCBjYXNlcy4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgdGVzdF9tZXRob2QsIHRlc3RjYXNlcywgbmFtaW5nX3R5cGUpOgorICAgICIiIlJldHVybnMgY29uY3JldGUgdGVzdCBmdW5jdGlvbnMgZm9yIGEgdGVzdCBhbmQgYSBsaXN0IG9mIHBhcmFtZXRlcnMuCisKKyAgICBUaGUgbmFtaW5nX3R5cGUgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIGNvbmNyZXRlCisgICAgZnVuY3Rpb25zIGFzIHJlcG9ydGVkIGJ5IHRoZSB1bml0dGVzdCBmcmFtZXdvcmsuIElmIG5hbWluZ190eXBlIGlzCisgICAgX0ZJUlNUX0FSRywgdGhlIHRlc3RjYXNlcyBtdXN0IGJlIHR1cGxlcywgYW5kIHRoZSBmaXJzdCBlbGVtZW50IG11c3QKKyAgICBoYXZlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgYSB2YWxpZCBQeXRob24gaWRlbnRpZmllci4KKworICAgIEFyZ3M6CisgICAgICB0ZXN0X21ldGhvZDogVGhlIGRlY29yYXRlZCB0ZXN0IG1ldGhvZC4KKyAgICAgIHRlc3RjYXNlczogKGxpc3Qgb2YgdHVwbGUvZGljdCkgQSBsaXN0IG9mIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICB0dXBsZXMvZGljdHMgZm9yIGluZGl2aWR1YWwgdGVzdCBpbnZvY2F0aW9ucy4KKyAgICAgIG5hbWluZ190eXBlOiBUaGUgdGVzdCBuYW1pbmcgdHlwZSwgZWl0aGVyIF9OQU1FRCBvciBfQVJHVU1FTlRfUkVQUi4KKyAgICAiIiIKKyAgICBzZWxmLl90ZXN0X21ldGhvZCA9IHRlc3RfbWV0aG9kCisgICAgc2VsZi50ZXN0Y2FzZXMgPSB0ZXN0Y2FzZXMKKyAgICBzZWxmLl9uYW1pbmdfdHlwZSA9IG5hbWluZ190eXBlCisKKyAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgcmFpc2UgUnVudGltZUVycm9yKCdZb3UgYXBwZWFyIHRvIGJlIHJ1bm5pbmcgYSBwYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSAnCisgICAgICAgICAgICAgICAgICAgICAgICd3aXRob3V0IGhhdmluZyBpbmhlcml0ZWQgZnJvbSBwYXJhbWV0ZXJpemVkLicKKyAgICAgICAgICAgICAgICAgICAgICAgJ1Rlc3RDYXNlLiBUaGlzIGlzIGJhZCBiZWNhdXNlIG5vbmUgb2YgJworICAgICAgICAgICAgICAgICAgICAgICAneW91ciB0ZXN0IGNhc2VzIGFyZSBhY3R1YWxseSBiZWluZyBydW4uJykKKworICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgdGVzdF9tZXRob2QgPSBzZWxmLl90ZXN0X21ldGhvZAorICAgIG5hbWluZ190eXBlID0gc2VsZi5fbmFtaW5nX3R5cGUKKworICAgIGRlZiBNYWtlQm91bmRQYXJhbVRlc3QodGVzdGNhc2VfcGFyYW1zKToKKyAgICAgIEBmdW5jdG9vbHMud3JhcHModGVzdF9tZXRob2QpCisgICAgICBkZWYgQm91bmRQYXJhbVRlc3Qoc2VsZik6CisgICAgICAgIGlmIGlzaW5zdGFuY2UodGVzdGNhc2VfcGFyYW1zLCBjb2xsZWN0aW9uc19hYmMuTWFwcGluZyk6CisgICAgICAgICAgdGVzdF9tZXRob2Qoc2VsZiwgKip0ZXN0Y2FzZV9wYXJhbXMpCisgICAgICAgIGVsaWYgX05vblN0cmluZ0l0ZXJhYmxlKHRlc3RjYXNlX3BhcmFtcyk6CisgICAgICAgICAgdGVzdF9tZXRob2Qoc2VsZiwgKnRlc3RjYXNlX3BhcmFtcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICB0ZXN0X21ldGhvZChzZWxmLCB0ZXN0Y2FzZV9wYXJhbXMpCisKKyAgICAgIGlmIG5hbWluZ190eXBlIGlzIF9GSVJTVF9BUkc6CisgICAgICAgICMgU2lnbmFsIHRoZSBtZXRhY2xhc3MgdGhhdCB0aGUgbmFtZSBvZiB0aGUgdGVzdCBmdW5jdGlvbiBpcyB1bmlxdWUKKyAgICAgICAgIyBhbmQgZGVzY3JpcHRpdmUuCisgICAgICAgIEJvdW5kUGFyYW1UZXN0Ll9feF91c2VfbmFtZV9fID0gVHJ1ZQorICAgICAgICBCb3VuZFBhcmFtVGVzdC5fX25hbWVfXyArPSBzdHIodGVzdGNhc2VfcGFyYW1zWzBdKQorICAgICAgICB0ZXN0Y2FzZV9wYXJhbXMgPSB0ZXN0Y2FzZV9wYXJhbXNbMTpdCisgICAgICBlbGlmIG5hbWluZ190eXBlIGlzIF9BUkdVTUVOVF9SRVBSOgorICAgICAgICAjIF9feF9leHRyYV9pZF9fIGlzIHVzZWQgdG8gcGFzcyBuYW1pbmcgaW5mb3JtYXRpb24gdG8gdGhlIF9fbmV3X18KKyAgICAgICAgIyBtZXRob2Qgb2YgVGVzdEdlbmVyYXRvck1ldGFjbGFzcy4KKyAgICAgICAgIyBUaGUgbWV0YWNsYXNzIHdpbGwgbWFrZSBzdXJlIHRvIGNyZWF0ZSBhIHVuaXF1ZSwgYnV0IG5vbmRlc2NyaXB0aXZlCisgICAgICAgICMgbmFtZSBmb3IgdGhpcyB0ZXN0LgorICAgICAgICBCb3VuZFBhcmFtVGVzdC5fX3hfZXh0cmFfaWRfXyA9ICcoJXMpJyAlICgKKyAgICAgICAgICAgIF9Gb3JtYXRQYXJhbWV0ZXJMaXN0KHRlc3RjYXNlX3BhcmFtcyksKQorICAgICAgZWxzZToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCclcyBpcyBub3QgYSB2YWxpZCBuYW1pbmcgdHlwZS4nICUgKG5hbWluZ190eXBlLCkpCisKKyAgICAgIEJvdW5kUGFyYW1UZXN0Ll9fZG9jX18gPSAnJXMoJXMpJyAlICgKKyAgICAgICAgICBCb3VuZFBhcmFtVGVzdC5fX25hbWVfXywgX0Zvcm1hdFBhcmFtZXRlckxpc3QodGVzdGNhc2VfcGFyYW1zKSkKKyAgICAgIGlmIHRlc3RfbWV0aG9kLl9fZG9jX186CisgICAgICAgIEJvdW5kUGFyYW1UZXN0Ll9fZG9jX18gKz0gJ1xuJXMnICUgKHRlc3RfbWV0aG9kLl9fZG9jX18sKQorICAgICAgcmV0dXJuIEJvdW5kUGFyYW1UZXN0CisgICAgcmV0dXJuIChNYWtlQm91bmRQYXJhbVRlc3QoYykgZm9yIGMgaW4gc2VsZi50ZXN0Y2FzZXMpCisKKworZGVmIF9Jc1NpbmdsZXRvbkxpc3QodGVzdGNhc2VzKToKKyAgIiIiVHJ1ZSBpZmYgdGVzdGNhc2VzIGNvbnRhaW5zIG9ubHkgYSBzaW5nbGUgbm9uLXR1cGxlIGVsZW1lbnQuIiIiCisgIHJldHVybiBsZW4odGVzdGNhc2VzKSA9PSAxIGFuZCBub3QgaXNpbnN0YW5jZSh0ZXN0Y2FzZXNbMF0sIHR1cGxlKQorCisKK2RlZiBfTW9kaWZ5Q2xhc3MoY2xhc3Nfb2JqZWN0LCB0ZXN0Y2FzZXMsIG5hbWluZ190eXBlKToKKyAgYXNzZXJ0IG5vdCBnZXRhdHRyKGNsYXNzX29iamVjdCwgJ19pZF9zdWZmaXgnLCBOb25lKSwgKAorICAgICAgJ0Nhbm5vdCBhZGQgcGFyYW1ldGVycyB0byAlcywnCisgICAgICAnIHdoaWNoIGFscmVhZHkgaGFzIHBhcmFtZXRlcml6ZWQgbWV0aG9kcy4nICUgKGNsYXNzX29iamVjdCwpKQorICBjbGFzc19vYmplY3QuX2lkX3N1ZmZpeCA9IGlkX3N1ZmZpeCA9IHt9CisgICMgV2UgY2hhbmdlIHRoZSBzaXplIG9mIF9fZGljdF9fIHdoaWxlIHdlIGl0ZXJhdGUgb3ZlciBpdCwKKyAgIyB3aGljaCBQeXRob24gMy54IHdpbGwgY29tcGxhaW4gYWJvdXQsIHNvIHVzZSBjb3B5KCkuCisgIGZvciBuYW1lLCBvYmogaW4gY2xhc3Nfb2JqZWN0Ll9fZGljdF9fLmNvcHkoKS5pdGVtcygpOgorICAgIGlmIChuYW1lLnN0YXJ0c3dpdGgodW5pdHRlc3QuVGVzdExvYWRlci50ZXN0TWV0aG9kUHJlZml4KQorICAgICAgICBhbmQgaXNpbnN0YW5jZShvYmosIHR5cGVzLkZ1bmN0aW9uVHlwZSkpOgorICAgICAgZGVsYXR0cihjbGFzc19vYmplY3QsIG5hbWUpCisgICAgICBtZXRob2RzID0ge30KKyAgICAgIF9VcGRhdGVDbGFzc0RpY3RGb3JQYXJhbVRlc3RDYXNlKAorICAgICAgICAgIG1ldGhvZHMsIGlkX3N1ZmZpeCwgbmFtZSwKKyAgICAgICAgICBfUGFyYW1ldGVyaXplZFRlc3RJdGVyKG9iaiwgdGVzdGNhc2VzLCBuYW1pbmdfdHlwZSkpCisgICAgICBmb3IgbmFtZSwgbWV0aCBpbiBtZXRob2RzLml0ZW1zKCk6CisgICAgICAgIHNldGF0dHIoY2xhc3Nfb2JqZWN0LCBuYW1lLCBtZXRoKQorCisKK2RlZiBfUGFyYW1ldGVyRGVjb3JhdG9yKG5hbWluZ190eXBlLCB0ZXN0Y2FzZXMpOgorICAiIiJJbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGFyYW1ldGVyaXphdGlvbiBkZWNvcmF0b3JzLgorCisgIEFyZ3M6CisgICAgbmFtaW5nX3R5cGU6IFRoZSBuYW1pbmcgdHlwZS4KKyAgICB0ZXN0Y2FzZXM6IFRlc3RjYXNlIHBhcmFtZXRlcnMuCisKKyAgUmV0dXJuczoKKyAgICBBIGZ1bmN0aW9uIGZvciBtb2RpZnlpbmcgdGhlIGRlY29yYXRlZCBvYmplY3QuCisgICIiIgorICBkZWYgX0FwcGx5KG9iaik6CisgICAgaWYgaXNpbnN0YW5jZShvYmosIHR5cGUpOgorICAgICAgX01vZGlmeUNsYXNzKAorICAgICAgICAgIG9iaiwKKyAgICAgICAgICBsaXN0KHRlc3RjYXNlcykgaWYgbm90IGlzaW5zdGFuY2UodGVzdGNhc2VzLCBjb2xsZWN0aW9uc19hYmMuU2VxdWVuY2UpCisgICAgICAgICAgZWxzZSB0ZXN0Y2FzZXMsCisgICAgICAgICAgbmFtaW5nX3R5cGUpCisgICAgICByZXR1cm4gb2JqCisgICAgZWxzZToKKyAgICAgIHJldHVybiBfUGFyYW1ldGVyaXplZFRlc3RJdGVyKG9iaiwgdGVzdGNhc2VzLCBuYW1pbmdfdHlwZSkKKworICBpZiBfSXNTaW5nbGV0b25MaXN0KHRlc3RjYXNlcyk6CisgICAgYXNzZXJ0IF9Ob25TdHJpbmdJdGVyYWJsZSh0ZXN0Y2FzZXNbMF0pLCAoCisgICAgICAgICdTaW5nbGUgcGFyYW1ldGVyIGFyZ3VtZW50IG11c3QgYmUgYSBub24tc3RyaW5nIGl0ZXJhYmxlJykKKyAgICB0ZXN0Y2FzZXMgPSB0ZXN0Y2FzZXNbMF0KKworICByZXR1cm4gX0FwcGx5CisKKworZGVmIHBhcmFtZXRlcnMoKnRlc3RjYXNlcyk6ICAjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKKyAgIiIiQSBkZWNvcmF0b3IgZm9yIGNyZWF0aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMuCisKKyAgU2VlIHRoZSBtb2R1bGUgZG9jc3RyaW5nIGZvciBhIHVzYWdlIGV4YW1wbGUuCisgIEFyZ3M6CisgICAgKnRlc3RjYXNlczogUGFyYW1ldGVycyBmb3IgdGhlIGRlY29yYXRlZCBtZXRob2QsIGVpdGhlciBhIHNpbmdsZQorICAgICAgICAgICAgICAgIGl0ZXJhYmxlLCBvciBhIGxpc3Qgb2YgdHVwbGVzL2RpY3RzL29iamVjdHMgKGZvciB0ZXN0cworICAgICAgICAgICAgICAgIHdpdGggb25seSBvbmUgYXJndW1lbnQpLgorCisgIFJldHVybnM6CisgICAgIEEgdGVzdCBnZW5lcmF0b3IgdG8gYmUgaGFuZGxlZCBieSBUZXN0R2VuZXJhdG9yTWV0YWNsYXNzLgorICAiIiIKKyAgcmV0dXJuIF9QYXJhbWV0ZXJEZWNvcmF0b3IoX0FSR1VNRU5UX1JFUFIsIHRlc3RjYXNlcykKKworCitkZWYgbmFtZWRfcGFyYW1ldGVycygqdGVzdGNhc2VzKTogICMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZQorICAiIiJBIGRlY29yYXRvciBmb3IgY3JlYXRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cy4KKworICBTZWUgdGhlIG1vZHVsZSBkb2NzdHJpbmcgZm9yIGEgdXNhZ2UgZXhhbXBsZS4gVGhlIGZpcnN0IGVsZW1lbnQgb2YKKyAgZWFjaCBwYXJhbWV0ZXIgdHVwbGUgc2hvdWxkIGJlIGEgc3RyaW5nIGFuZCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQorICBuYW1lIG9mIHRoZSB0ZXN0IG1ldGhvZC4KKworICBBcmdzOgorICAgICp0ZXN0Y2FzZXM6IFBhcmFtZXRlcnMgZm9yIHRoZSBkZWNvcmF0ZWQgbWV0aG9kLCBlaXRoZXIgYSBzaW5nbGUKKyAgICAgICAgICAgICAgICBpdGVyYWJsZSwgb3IgYSBsaXN0IG9mIHR1cGxlcy4KKworICBSZXR1cm5zOgorICAgICBBIHRlc3QgZ2VuZXJhdG9yIHRvIGJlIGhhbmRsZWQgYnkgVGVzdEdlbmVyYXRvck1ldGFjbGFzcy4KKyAgIiIiCisgIHJldHVybiBfUGFyYW1ldGVyRGVjb3JhdG9yKF9GSVJTVF9BUkcsIHRlc3RjYXNlcykKKworCitjbGFzcyBUZXN0R2VuZXJhdG9yTWV0YWNsYXNzKHR5cGUpOgorICAiIiJNZXRhY2xhc3MgZm9yIHRlc3QgY2FzZXMgd2l0aCB0ZXN0IGdlbmVyYXRvcnMuCisKKyAgQSB0ZXN0IGdlbmVyYXRvciBpcyBhbiBpdGVyYWJsZSBpbiBhIHRlc3RjYXNlIHRoYXQgcHJvZHVjZXMgY2FsbGFibGVzLiBUaGVzZQorICBjYWxsYWJsZXMgbXVzdCBiZSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kcy4gVGhlc2UgbWV0aG9kcyBhcmUgaW5qZWN0ZWQgaW50bworICB0aGUgY2xhc3MgbmFtZXNwYWNlIGFuZCB0aGUgb3JpZ2luYWwgaXRlcmFibGUgaXMgcmVtb3ZlZC4gSWYgdGhlIG5hbWUgb2YgdGhlCisgIGl0ZXJhYmxlIGNvbmZvcm1zIHRvIHRoZSB0ZXN0IHBhdHRlcm4sIHRoZSBpbmplY3RlZCBtZXRob2RzIHdpbGwgYmUgcGlja2VkCisgIHVwIGFzIHRlc3RzIGJ5IHRoZSB1bml0dGVzdCBmcmFtZXdvcmsuCisKKyAgSW4gZ2VuZXJhbCwgaXQgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQorICBwYXJhbWV0ZXJzIGRlY29yYXRvci4KKyAgIiIiCisKKyAgZGVmIF9fbmV3X18obWNzLCBjbGFzc19uYW1lLCBiYXNlcywgZGN0KToKKyAgICBkY3RbJ19pZF9zdWZmaXgnXSA9IGlkX3N1ZmZpeCA9IHt9CisgICAgZm9yIG5hbWUsIG9iaiBpbiBkY3QuY29weSgpLml0ZW1zKCk6CisgICAgICBpZiAobmFtZS5zdGFydHN3aXRoKHVuaXR0ZXN0LlRlc3RMb2FkZXIudGVzdE1ldGhvZFByZWZpeCkgYW5kCisgICAgICAgICAgX05vblN0cmluZ0l0ZXJhYmxlKG9iaikpOgorICAgICAgICBpdGVyYXRvciA9IGl0ZXIob2JqKQorICAgICAgICBkY3QucG9wKG5hbWUpCisgICAgICAgIF9VcGRhdGVDbGFzc0RpY3RGb3JQYXJhbVRlc3RDYXNlKGRjdCwgaWRfc3VmZml4LCBuYW1lLCBpdGVyYXRvcikKKworICAgIHJldHVybiB0eXBlLl9fbmV3X18obWNzLCBjbGFzc19uYW1lLCBiYXNlcywgZGN0KQorCisKK2RlZiBfVXBkYXRlQ2xhc3NEaWN0Rm9yUGFyYW1UZXN0Q2FzZShkY3QsIGlkX3N1ZmZpeCwgbmFtZSwgaXRlcmF0b3IpOgorICAiIiJBZGRzIGluZGl2aWR1YWwgdGVzdCBjYXNlcyB0byBhIGRpY3Rpb25hcnkuCisKKyAgQXJnczoKKyAgICBkY3Q6IFRoZSB0YXJnZXQgZGljdGlvbmFyeS4KKyAgICBpZF9zdWZmaXg6IFRoZSBkaWN0aW9uYXJ5IGZvciBtYXBwaW5nIG5hbWVzIHRvIHRlc3QgSURzLgorICAgIG5hbWU6IFRoZSBvcmlnaW5hbCBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UuCisgICAgaXRlcmF0b3I6IFRoZSBpdGVyYXRvciBnZW5lcmF0aW5nIHRoZSBpbmRpdmlkdWFsIHRlc3QgY2FzZXMuCisgICIiIgorICBmb3IgaWR4LCBmdW5jIGluIGVudW1lcmF0ZShpdGVyYXRvcik6CisgICAgYXNzZXJ0IGNhbGxhYmxlKGZ1bmMpLCAnVGVzdCBnZW5lcmF0b3JzIG11c3QgeWllbGQgY2FsbGFibGVzLCBnb3QgJXInICUgKAorICAgICAgICBmdW5jLCkKKyAgICBpZiBnZXRhdHRyKGZ1bmMsICdfX3hfdXNlX25hbWVfXycsIEZhbHNlKToKKyAgICAgIG5ld19uYW1lID0gZnVuYy5fX25hbWVfXworICAgIGVsc2U6CisgICAgICBuZXdfbmFtZSA9ICclcyVzJWQnICUgKG5hbWUsIF9TRVBBUkFUT1IsIGlkeCkKKyAgICBhc3NlcnQgbmV3X25hbWUgbm90IGluIGRjdCwgKAorICAgICAgICAnTmFtZSBvZiBwYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSAiJXMiIG5vdCB1bmlxdWUnICUgKG5ld19uYW1lLCkpCisgICAgZGN0W25ld19uYW1lXSA9IGZ1bmMKKyAgICBpZF9zdWZmaXhbbmV3X25hbWVdID0gZ2V0YXR0cihmdW5jLCAnX194X2V4dHJhX2lkX18nLCAnJykKKworCitjbGFzcyBUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSwgbWV0YWNsYXNzPVRlc3RHZW5lcmF0b3JNZXRhY2xhc3MpOgorICAiIiJCYXNlIGNsYXNzIGZvciB0ZXN0IGNhc2VzIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIGRlY29yYXRvci4iIiIKKworICBkZWYgX09yaWdpbmFsTmFtZShzZWxmKToKKyAgICByZXR1cm4gc2VsZi5fdGVzdE1ldGhvZE5hbWUuc3BsaXQoX1NFUEFSQVRPUilbMF0KKworICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICByZXR1cm4gJyVzICglcyknICUgKHNlbGYuX09yaWdpbmFsTmFtZSgpLCBfU3RyQ2xhc3Moc2VsZi5fX2NsYXNzX18pKQorCisgIGRlZiBpZChzZWxmKTogICMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZQorICAgICIiIlJldHVybnMgdGhlIGRlc2NyaXB0aXZlIElEIG9mIHRoZSB0ZXN0LgorCisgICAgVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIHVuaXR0ZXN0aW5nIGZyYW1ld29yayB0byBnZXQgYSBuYW1lCisgICAgZm9yIHRoZSB0ZXN0IHRvIGJlIHVzZWQgaW4gcmVwb3J0cy4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgdGVzdCBpZC4KKyAgICAiIiIKKyAgICByZXR1cm4gJyVzLiVzJXMnICUgKF9TdHJDbGFzcyhzZWxmLl9fY2xhc3NfXyksCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9PcmlnaW5hbE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lkX3N1ZmZpeC5nZXQoc2VsZi5fdGVzdE1ldGhvZE5hbWUsICcnKSkKKworCitkZWYgQ29vcFRlc3RDYXNlKG90aGVyX2Jhc2VfY2xhc3MpOgorICAiIiJSZXR1cm5zIGEgbmV3IGJhc2UgY2xhc3Mgd2l0aCBhIGNvb3BlcmF0aXZlIG1ldGFjbGFzcyBiYXNlLgorCisgIFRoaXMgZW5hYmxlcyB0aGUgVGVzdENhc2UgdG8gYmUgdXNlZCBpbiBjb21iaW5hdGlvbgorICB3aXRoIG90aGVyIGJhc2UgY2xhc3NlcyB0aGF0IGhhdmUgY3VzdG9tIG1ldGFjbGFzc2VzLCBzdWNoIGFzCisgIG1veC5Nb3hUZXN0QmFzZS4KKworICBPbmx5IHdvcmtzIHdpdGggbWV0YWNsYXNzZXMgdGhhdCBkbyBub3Qgb3ZlcnJpZGUgdHlwZS5fX25ld19fLgorCisgIEV4YW1wbGU6CisKKyAgICBpbXBvcnQgZ29vZ2xlMworICAgIGltcG9ydCBtb3gKKworICAgIGZyb20gZ29vZ2xlMy50ZXN0aW5nLnB5YmFzZSBpbXBvcnQgcGFyYW1ldGVyaXplZAorCisgICAgY2xhc3MgRXhhbXBsZVRlc3QocGFyYW1ldGVyaXplZC5Db29wVGVzdENhc2UobW94Lk1veFRlc3RCYXNlKSk6CisgICAgICAuLi4KKworICBBcmdzOgorICAgIG90aGVyX2Jhc2VfY2xhc3M6IChjbGFzcykgQSB0ZXN0IGNhc2UgYmFzZSBjbGFzcy4KKworICBSZXR1cm5zOgorICAgIEEgbmV3IGNsYXNzIG9iamVjdC4KKyAgIiIiCisgIG1ldGFjbGFzcyA9IHR5cGUoCisgICAgICAnQ29vcE1ldGFjbGFzcycsCisgICAgICAob3RoZXJfYmFzZV9jbGFzcy5fX21ldGFjbGFzc19fLAorICAgICAgIFRlc3RHZW5lcmF0b3JNZXRhY2xhc3MpLCB7fSkKKyAgcmV0dXJuIG1ldGFjbGFzcygKKyAgICAgICdDb29wVGVzdENhc2UnLAorICAgICAgKG90aGVyX2Jhc2VfY2xhc3MsIFRlc3RDYXNlKSwge30pCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2FueV90ZXN0LnByb3RvIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9hbnlfdGVzdC5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTU2M2ZkCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9hbnlfdGVzdC5wcm90bwpAQCAtMCwwICsxLDUxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBqaWVsdW9AZ29vZ2xlLmNvbSAoSmllIEx1bykKKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8iOworCittZXNzYWdlIFRlc3RBbnkgeworICBvcHRpb25hbCBnb29nbGUucHJvdG9idWYuQW55IHZhbHVlID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgaW50X3ZhbHVlID0gMjsKKyAgbWFwPHN0cmluZyxpbnQzMj4gbWFwX3ZhbHVlID0gMzsKKyAgZXh0ZW5zaW9ucyAxMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgVGVzdEFueUV4dGVuc2lvbjEgeworICBleHRlbmQgVGVzdEFueSB7CisgICAgb3B0aW9uYWwgVGVzdEFueUV4dGVuc2lvbjEgZXh0ZW5zaW9uMSA9IDk4NDE4NjAzOworICB9CisgIG9wdGlvbmFsIGludDMyIGkgPSAxNTsKK30KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYXBpX2ltcGxlbWVudGF0aW9uLmNjIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9hcGlfaW1wbGVtZW50YXRpb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmNWIwNAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYXBpX2ltcGxlbWVudGF0aW9uLmNjCkBAIC0wLDAgKzEsMTExIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCisjaW5jbHVkZSA8UHl0aG9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBweXRob24geworCisvLyBWZXJzaW9uIGNvbnN0YW50LgorLy8gVGhpcyBpcyBlaXRoZXIgMCBmb3IgcHl0aG9uLCAxIGZvciBDUFAgVjEsIDIgZm9yIENQUCBWMi4KKy8vCisvLyAwIGlzIGRlZmF1bHQgYW5kIGlzIGVxdWl2YWxlbnQgdG8KKy8vICAgUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT049cHl0aG9uCisvLworLy8gMSBpcyBzZXQgd2l0aCAtRFBZVEhPTl9QUk9UTzJfQ1BQX0lNUExfVjEgYW5kIGlzIGVxdWl2YWxlbnQgdG8KKy8vICAgUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT049Y3BwCisvLyBhbmQKKy8vICAgUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT05fVkVSU0lPTj0xCisvLworLy8gMiBpcyBzZXQgd2l0aCAtRFBZVEhPTl9QUk9UTzJfQ1BQX0lNUExfVjIgYW5kIGlzIGVxdWl2YWxlbnQgdG8KKy8vICAgUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT049Y3BwCisvLyBhbmQKKy8vICAgUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT05fVkVSU0lPTj0yCisjaWZkZWYgUFlUSE9OX1BST1RPMl9DUFBfSU1QTF9WMQorI2Vycm9yICJQWVRIT05fUFJPVE8yX0NQUF9JTVBMX1YxIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIgorI2Vsc2UKKyNpZmRlZiBQWVRIT05fUFJPVE8yX0NQUF9JTVBMX1YyCitzdGF0aWMgaW50IGtJbXBsVmVyc2lvbiA9IDI7CisjZWxzZQorI2lmZGVmIFBZVEhPTl9QUk9UTzJfUFlUSE9OX0lNUEwKK3N0YXRpYyBpbnQga0ltcGxWZXJzaW9uID0gMDsKKyNlbHNlCisKK3N0YXRpYyBpbnQga0ltcGxWZXJzaW9uID0gLTE7ICAvLyAtMSBtZWFucyAiVW5zcGVjaWZpZWQgYnkgY29tcGlsZXIgZmxhZ3MiLgorCisjZW5kaWYgIC8vIFBZVEhPTl9QUk9UTzJfUFlUSE9OX0lNUEwKKyNlbmRpZiAgLy8gUFlUSE9OX1BST1RPMl9DUFBfSU1QTF9WMgorI2VuZGlmICAvLyBQWVRIT05fUFJPVE8yX0NQUF9JTVBMX1YxCisKK3N0YXRpYyBjb25zdCBjaGFyKiBrSW1wbFZlcnNpb25OYW1lID0gImFwaV92ZXJzaW9uIjsKKworc3RhdGljIGNvbnN0IGNoYXIqIGtNb2R1bGVOYW1lID0gIl9hcGlfaW1wbGVtZW50YXRpb24iOworc3RhdGljIGNvbnN0IGNoYXIga01vZHVsZURvY3N0cmluZ1tdID0KKyAgICAiX2FwaV9pbXBsZW1lbnRhdGlvbiBpcyBhIG1vZHVsZSB0aGF0IGV4cG9zZXMgY29tcGlsZS10aW1lIGNvbnN0YW50cyB0aGF0XG4iCisgICAgImRldGVybWluZSB0aGUgZGVmYXVsdCBBUEkgaW1wbGVtZW50YXRpb24gdG8gdXNlIGZvciBQeXRob24gcHJvdG8yLlxuIgorICAgICJcbiIKKyAgICAiSXQgY29tcGxlbWVudHMgYXBpX2ltcGxlbWVudGF0aW9uLnB5IGJ5IHNldHRpbmcgZGVmYXVsdHMgdXNpbmcgIgorICAgICJjb21waWxlLXRpbWVcbiIKKyAgICAiY29uc3RhbnRzIGRlZmluZWQgaW4gQywgc3VjaCB0aGF0IG9uZSBjYW4gc2V0IGRlZmF1bHRzIGF0IGNvbXBpbGF0aW9uXG4iCisgICAgIihlLmcuIHdpdGggYmxhemUgZmxhZyAtLWNvcHQ9LURQWVRIT05fUFJPVE8yX0NQUF9JTVBMX1YyKS4iOworCitzdGF0aWMgc3RydWN0IFB5TW9kdWxlRGVmIF9tb2R1bGUgPSB7UHlNb2R1bGVEZWZfSEVBRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNb2R1bGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNb2R1bGVEb2NzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyfTsKKworZXh0ZXJuICJDIiB7CitQeU1PRElOSVRfRlVOQyBQeUluaXRfX2FwaV9pbXBsZW1lbnRhdGlvbigpIHsKKyAgUHlPYmplY3QqIG1vZHVsZSA9IFB5TW9kdWxlX0NyZWF0ZSgmX21vZHVsZSk7CisgIGlmIChtb2R1bGUgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gQWRkcyB0aGUgbW9kdWxlIHZhcmlhYmxlICJhcGlfdmVyc2lvbiIuCisgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsIGNvbnN0X2Nhc3Q8Y2hhcio+KGtJbXBsVmVyc2lvbk5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ltcGxWZXJzaW9uKSkgeworICAgIFB5X0RFQ1JFRihtb2R1bGUpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgcmV0dXJuIG1vZHVsZTsKK30KK30KKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2FwaV9pbXBsZW1lbnRhdGlvbi5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYXBpX2ltcGxlbWVudGF0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NTg2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2FwaV9pbXBsZW1lbnRhdGlvbi5weQpAQCAtMCwwICsxLDE2OCBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJEZXRlcm1pbmUgd2hpY2ggaW1wbGVtZW50YXRpb24gb2YgdGhlIHByb3RvYnVmIEFQSSBpcyB1c2VkIGluIHRoaXMgcHJvY2Vzcy4KKyIiIgorCitpbXBvcnQgaW1wb3J0bGliCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXJuaW5ncworCisKK2RlZiBfQXBpVmVyc2lvblRvSW1wbGVtZW50YXRpb25UeXBlKGFwaV92ZXJzaW9uKToKKyAgaWYgYXBpX3ZlcnNpb24gPT0gMjoKKyAgICByZXR1cm4gJ2NwcCcKKyAgaWYgYXBpX3ZlcnNpb24gPT0gMToKKyAgICByYWlzZSBWYWx1ZUVycm9yKCdhcGlfdmVyc2lvbj0xIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuJykKKyAgaWYgYXBpX3ZlcnNpb24gPT0gMDoKKyAgICByZXR1cm4gJ3B5dGhvbicKKyAgcmV0dXJuIE5vbmUKKworCitfaW1wbGVtZW50YXRpb25fdHlwZSA9IE5vbmUKK3RyeToKKyAgIyBweWxpbnQ6IGRpc2FibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAorICBmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgX2FwaV9pbXBsZW1lbnRhdGlvbgorICAjIFRoZSBjb21waWxlLXRpbWUgY29uc3RhbnRzIGluIHRoZSBfYXBpX2ltcGxlbWVudGF0aW9uIG1vZHVsZSBjYW4gYmUgdXNlZCB0bworICAjIHN3aXRjaCB0byBhIGNlcnRhaW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFB5dGhvbiBBUEkgYXQgYnVpbGQgdGltZS4KKyAgX2ltcGxlbWVudGF0aW9uX3R5cGUgPSBfQXBpVmVyc2lvblRvSW1wbGVtZW50YXRpb25UeXBlKAorICAgICAgX2FwaV9pbXBsZW1lbnRhdGlvbi5hcGlfdmVyc2lvbikKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgcGFzcyAgIyBVbnNwZWNpZmllZCBieSBjb21waWxlciBmbGFncy4KKworCitkZWYgX0NhbkltcG9ydChtb2RfbmFtZSk6CisgIHRyeToKKyAgICBtb2QgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShtb2RfbmFtZSkKKyAgICAjIFdvcmsgYXJvdW5kIGEga25vd24gaXNzdWUgaW4gdGhlIGNsYXNzaWMgYm9vdHN0cmFwIC5wYXIgaW1wb3J0IGhvb2suCisgICAgaWYgbm90IG1vZDoKKyAgICAgIHJhaXNlIEltcG9ydEVycm9yKG1vZF9uYW1lICsgJyBpbXBvcnQgc3VjY2VlZGVkIGJ1dCB3YXMgTm9uZScpCisgICAgcmV0dXJuIFRydWUKKyAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHJldHVybiBGYWxzZQorCisKK2lmIF9pbXBsZW1lbnRhdGlvbl90eXBlIGlzIE5vbmU6CisgIGlmIF9DYW5JbXBvcnQoJ2dvb2dsZS5fdXBiLl9tZXNzYWdlJyk6CisgICAgX2ltcGxlbWVudGF0aW9uX3R5cGUgPSAndXBiJworICBlbGlmIF9DYW5JbXBvcnQoJ2dvb2dsZS5wcm90b2J1Zi5weWV4dC5fbWVzc2FnZScpOgorICAgIF9pbXBsZW1lbnRhdGlvbl90eXBlID0gJ2NwcCcKKyAgZWxzZToKKyAgICBfaW1wbGVtZW50YXRpb25fdHlwZSA9ICdweXRob24nCisKKworIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIHN3aXRjaCB0byBhIGNlcnRhaW4gaW1wbGVtZW50YXRpb24KKyMgb2YgdGhlIFB5dGhvbiBBUEksIG92ZXJyaWRpbmcgdGhlIGNvbXBpbGUtdGltZSBjb25zdGFudHMgaW4gdGhlCisjIF9hcGlfaW1wbGVtZW50YXRpb24gbW9kdWxlLiBSaWdodCBub3cgb25seSAncHl0aG9uJywgJ2NwcCcgYW5kICd1cGInIGFyZQorIyB2YWxpZCB2YWx1ZXMuIEFueSBvdGhlciB2YWx1ZSB3aWxsIHJhaXNlIGVycm9yLgorX2ltcGxlbWVudGF0aW9uX3R5cGUgPSBvcy5nZXRlbnYoJ1BST1RPQ09MX0JVRkZFUlNfUFlUSE9OX0lNUExFTUVOVEFUSU9OJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbXBsZW1lbnRhdGlvbl90eXBlKQorCitpZiBfaW1wbGVtZW50YXRpb25fdHlwZSBub3QgaW4gKCdweXRob24nLCAnY3BwJywgJ3VwYicpOgorICByYWlzZSBWYWx1ZUVycm9yKCdQUk9UT0NPTF9CVUZGRVJTX1BZVEhPTl9JTVBMRU1FTlRBVElPTiB7MH0gaXMgbm90ICcKKyAgICAgICAgICAgICAgICAgICAnc3VwcG9ydGVkLiBQbGVhc2Ugc2V0IHRvIFwncHl0aG9uXCcsIFwnY3BwXCcgb3IgJworICAgICAgICAgICAgICAgICAgICdcJ3VwYlwnLicuZm9ybWF0KF9pbXBsZW1lbnRhdGlvbl90eXBlKSkKKworaWYgJ1B5UHknIGluIHN5cy52ZXJzaW9uIGFuZCBfaW1wbGVtZW50YXRpb25fdHlwZSA9PSAnY3BwJzoKKyAgd2FybmluZ3Mud2FybignUHlQeSBkb2VzIG5vdCB3b3JrIHlldCB3aXRoIGNwcCBwcm90b2NvbCBidWZmZXJzLiAnCisgICAgICAgICAgICAgICAgJ0ZhbGxpbmcgYmFjayB0byB0aGUgcHl0aG9uIGltcGxlbWVudGF0aW9uLicpCisgIF9pbXBsZW1lbnRhdGlvbl90eXBlID0gJ3B5dGhvbicKKworX2NfbW9kdWxlID0gTm9uZQorCitpZiBfaW1wbGVtZW50YXRpb25fdHlwZSA9PSAnY3BwJzoKKyAgdHJ5OgorICAgICMgcHlsaW50OiBkaXNhYmxlPWctaW1wb3J0LW5vdC1hdC10b3AKKyAgICBmcm9tIGdvb2dsZS5wcm90b2J1Zi5weWV4dCBpbXBvcnQgX21lc3NhZ2UKKyAgICBfY19tb2R1bGUgPSBfbWVzc2FnZQorICAgIGRlbCBfbWVzc2FnZQorICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBUT0RPKGppZWx1byk6IGZhaWwgYmFjayB0byBweXRob24KKyAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAnU2VsZWN0ZWQgaW1wbGVtZW50YXRpb24gY3BwIGlzIG5vdCBhdmFpbGFibGUuJykKKyAgICBwYXNzCisKK2lmIF9pbXBsZW1lbnRhdGlvbl90eXBlID09ICd1cGInOgorICB0cnk6CisgICAgIyBweWxpbnQ6IGRpc2FibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAorICAgIGZyb20gZ29vZ2xlLl91cGIgaW1wb3J0IF9tZXNzYWdlCisgICAgX2NfbW9kdWxlID0gX21lc3NhZ2UKKyAgICBkZWwgX21lc3NhZ2UKKyAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHdhcm5pbmdzLndhcm4oJ1NlbGVjdGVkIGltcGxlbWVudGF0aW9uIHVwYiBpcyBub3QgYXZhaWxhYmxlLiAnCisgICAgICAgICAgICAgICAgICAnRmFsbGluZyBiYWNrIHRvIHRoZSBweXRob24gaW1wbGVtZW50YXRpb24uJykKKyAgICBfaW1wbGVtZW50YXRpb25fdHlwZSA9ICdweXRob24nCisgICAgcGFzcworCisjIERldGVjdCBpZiBzZXJpYWxpemF0aW9uIHNob3VsZCBiZSBkZXRlcm1pbmlzdGljIGJ5IGRlZmF1bHQKK3RyeToKKyAgIyBUaGUgcHJlc2VuY2Ugb2YgdGhpcyBtb2R1bGUgaW4gYSBidWlsZCBhbGxvd3MgdGhlIHByb3RvIGltcGxlbWVudGF0aW9uIHRvCisgICMgYmUgdXBncmFkZWQgbWVyZWx5IHZpYSBidWlsZCBkZXBzLgorICAjCisgICMgTk9URTogTWVyZWx5IGltcG9ydGluZyB0aGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlcyBkZXRlcm1pbmlzdGljIHByb3RvCisgICMgc2VyaWFsaXphdGlvbiBmb3IgQysrIGNvZGUsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGV4cG9ydCBpdCBhcyBhIGJvb2xlYW4gc28KKyAgIyB0aGF0IHdlIGNhbiBkbyB0aGUgc2FtZSBmb3IgYF9pbXBsZW1lbnRhdGlvbl90eXBlID09ICdweXRob24nYC4KKyAgIworICAjIE5PVEUyOiBJdCBpcyBwb3NzaWJsZSBmb3IgQysrIGNvZGUgdG8gZW5hYmxlIGRldGVybWluaXN0aWMgc2VyaWFsaXphdGlvbiBieQorICAjIGRlZmF1bHQgX3dpdGhvdXRfIGFmZmVjdGluZyBQeXRob24gY29kZSwgaWYgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgaW4KKyAgIyB1c2UgYnkgdGhpcyBtb2R1bGUuICBUaGF0IGlzIGludGVuZGVkIGJlaGF2aW9yLCBzbyB3ZSBkb24ndCBhY3R1YWxseSBleHBvc2UKKyAgIyB0aGlzIGJvb2xlYW4gb3V0c2lkZSBvZiB0aGlzIG1vZHVsZS4KKyAgIworICAjIHB5bGludDogZGlzYWJsZT1nLWltcG9ydC1ub3QtYXQtdG9wLHVudXNlZC1pbXBvcnQKKyAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGVuYWJsZV9kZXRlcm1pbmlzdGljX3Byb3RvX3NlcmlhbGl6YXRpb24KKyAgX3B5dGhvbl9kZXRlcm1pbmlzdGljX3Byb3RvX3NlcmlhbGl6YXRpb24gPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgIF9weXRob25fZGV0ZXJtaW5pc3RpY19wcm90b19zZXJpYWxpemF0aW9uID0gRmFsc2UKKworCisjIFVzYWdlIG9mIHRoaXMgZnVuY3Rpb24gaXMgZGlzY291cmFnZWQuIENsaWVudHMgc2hvdWxkbid0IGNhcmUgd2hpY2gKKyMgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSSBpcyBpbiB1c2UuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUKKyMgdGhhdCBkaWZmZXJlbmNlcyBiZXR3ZWVuIEFQSXMgd2lsbCBiZSBtYWludGFpbmVkLgorIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgZnVuY3Rpb24gaWYgcG9zc2libGUuCitkZWYgVHlwZSgpOgorICByZXR1cm4gX2ltcGxlbWVudGF0aW9uX3R5cGUKKworCitkZWYgX1NldFR5cGUoaW1wbGVtZW50YXRpb25fdHlwZSk6CisgICIiIk5ldmVyIHVzZSEgT25seSBmb3IgcHJvdG9idWYgYmVuY2htYXJrLiIiIgorICBnbG9iYWwgX2ltcGxlbWVudGF0aW9uX3R5cGUKKyAgX2ltcGxlbWVudGF0aW9uX3R5cGUgPSBpbXBsZW1lbnRhdGlvbl90eXBlCisKKworIyBTZWUgY29tbWVudCBvbiAnVHlwZScgYWJvdmUuCisjIFRPRE8oamllbHVvKTogUmVtb3ZlIHRoZSBBUEksIGl0IHJldHVybnMgYSBjb25zdGFudC4gYi8yMjgxMDIxMDEKK2RlZiBWZXJzaW9uKCk6CisgIHJldHVybiAyCisKKworIyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkKK2RlZiBJc1B5dGhvbkRlZmF1bHRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYygpOgorICByZXR1cm4gX3B5dGhvbl9kZXRlcm1pbmlzdGljX3Byb3RvX3NlcmlhbGl6YXRpb24KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYnVpbGRlci5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYnVpbGRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDM1M2VlCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9idWlsZGVyLnB5CkBAIC0wLDAgKzEsMTMwIEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkJ1aWxkcyBkZXNjcmlwdG9ycywgbWVzc2FnZSBjbGFzc2VzIGFuZCBzZXJ2aWNlcyBmb3IgZ2VuZXJhdGVkIF9wYjIucHkuCisKK1RoaXMgZmlsZSBpcyBvbmx5IGNhbGxlZCBpbiBweXRob24gZ2VuZXJhdGVkIF9wYjIucHkgZmlsZXMuIEl0IGJ1aWxkcworZGVzY3JpcHRvcnMsIG1lc3NhZ2UgY2xhc3NlcyBhbmQgc2VydmljZXMgdGhhdCB1c2VycyBjYW4gZGlyZWN0bHkgdXNlCitpbiBnZW5lcmF0ZWQgY29kZS4KKyIiIgorCitfX2F1dGhvcl9fID0gJ2ppZWx1b0Bnb29nbGUuY29tIChKaWUgTHVvKScKKworZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGVudW1fdHlwZV93cmFwcGVyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZSBhcyBfbWVzc2FnZQorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHJlZmxlY3Rpb24gYXMgX3JlZmxlY3Rpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzeW1ib2xfZGF0YWJhc2UgYXMgX3N5bWJvbF9kYXRhYmFzZQorCitfc3ltX2RiID0gX3N5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkKKworCitkZWYgQnVpbGRNZXNzYWdlQW5kRW51bURlc2NyaXB0b3JzKGZpbGVfZGVzLCBtb2R1bGUpOgorICAiIiJCdWlsZHMgbWVzc2FnZSBhbmQgZW51bSBkZXNjcmlwdG9ycy4KKworICBBcmdzOgorICAgIGZpbGVfZGVzOiBGaWxlRGVzY3JpcHRvciBvZiB0aGUgLnByb3RvIGZpbGUKKyAgICBtb2R1bGU6IEdlbmVyYXRlZCBfcGIyIG1vZHVsZQorICAiIiIKKworICBkZWYgQnVpbGROZXN0ZWREZXNjcmlwdG9ycyhtc2dfZGVzLCBwcmVmaXgpOgorICAgIGZvciAobmFtZSwgbmVzdGVkX21zZykgaW4gbXNnX2Rlcy5uZXN0ZWRfdHlwZXNfYnlfbmFtZS5pdGVtcygpOgorICAgICAgbW9kdWxlX25hbWUgPSBwcmVmaXggKyBuYW1lLnVwcGVyKCkKKyAgICAgIG1vZHVsZVttb2R1bGVfbmFtZV0gPSBuZXN0ZWRfbXNnCisgICAgICBCdWlsZE5lc3RlZERlc2NyaXB0b3JzKG5lc3RlZF9tc2csIG1vZHVsZV9uYW1lICsgJ18nKQorICAgIGZvciBlbnVtX2RlcyBpbiBtc2dfZGVzLmVudW1fdHlwZXM6CisgICAgICBtb2R1bGVbcHJlZml4ICsgZW51bV9kZXMubmFtZS51cHBlcigpXSA9IGVudW1fZGVzCisKKyAgZm9yIChuYW1lLCBtc2dfZGVzKSBpbiBmaWxlX2Rlcy5tZXNzYWdlX3R5cGVzX2J5X25hbWUuaXRlbXMoKToKKyAgICBtb2R1bGVfbmFtZSA9ICdfJyArIG5hbWUudXBwZXIoKQorICAgIG1vZHVsZVttb2R1bGVfbmFtZV0gPSBtc2dfZGVzCisgICAgQnVpbGROZXN0ZWREZXNjcmlwdG9ycyhtc2dfZGVzLCBtb2R1bGVfbmFtZSArICdfJykKKworCitkZWYgQnVpbGRUb3BEZXNjcmlwdG9yc0FuZE1lc3NhZ2VzKGZpbGVfZGVzLCBtb2R1bGVfbmFtZSwgbW9kdWxlKToKKyAgIiIiQnVpbGRzIHRvcCBsZXZlbCBkZXNjcmlwdG9ycyBhbmQgbWVzc2FnZSBjbGFzc2VzLgorCisgIEFyZ3M6CisgICAgZmlsZV9kZXM6IEZpbGVEZXNjcmlwdG9yIG9mIHRoZSAucHJvdG8gZmlsZQorICAgIG1vZHVsZV9uYW1lOiBzdHIsIHRoZSBuYW1lIG9mIGdlbmVyYXRlZCBfcGIyIG1vZHVsZQorICAgIG1vZHVsZTogR2VuZXJhdGVkIF9wYjIgbW9kdWxlCisgICIiIgorCisgIGRlZiBCdWlsZE1lc3NhZ2UobXNnX2Rlcyk6CisgICAgY3JlYXRlX2RpY3QgPSB7fQorICAgIGZvciAobmFtZSwgbmVzdGVkX21zZykgaW4gbXNnX2Rlcy5uZXN0ZWRfdHlwZXNfYnlfbmFtZS5pdGVtcygpOgorICAgICAgY3JlYXRlX2RpY3RbbmFtZV0gPSBCdWlsZE1lc3NhZ2UobmVzdGVkX21zZykKKyAgICBjcmVhdGVfZGljdFsnREVTQ1JJUFRPUiddID0gbXNnX2RlcworICAgIGNyZWF0ZV9kaWN0WydfX21vZHVsZV9fJ10gPSBtb2R1bGVfbmFtZQorICAgIG1lc3NhZ2VfY2xhc3MgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKAorICAgICAgICBtc2dfZGVzLm5hbWUsIChfbWVzc2FnZS5NZXNzYWdlLCksIGNyZWF0ZV9kaWN0KQorICAgIF9zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKG1lc3NhZ2VfY2xhc3MpCisgICAgcmV0dXJuIG1lc3NhZ2VfY2xhc3MKKworICAjIHRvcCBsZXZlbCBlbnVtcworICBmb3IgKG5hbWUsIGVudW1fZGVzKSBpbiBmaWxlX2Rlcy5lbnVtX3R5cGVzX2J5X25hbWUuaXRlbXMoKToKKyAgICBtb2R1bGVbJ18nICsgbmFtZS51cHBlcigpXSA9IGVudW1fZGVzCisgICAgbW9kdWxlW25hbWVdID0gZW51bV90eXBlX3dyYXBwZXIuRW51bVR5cGVXcmFwcGVyKGVudW1fZGVzKQorICAgIGZvciBlbnVtX3ZhbHVlIGluIGVudW1fZGVzLnZhbHVlczoKKyAgICAgIG1vZHVsZVtlbnVtX3ZhbHVlLm5hbWVdID0gZW51bV92YWx1ZS5udW1iZXIKKworICAjIHRvcCBsZXZlbCBleHRlbnNpb25zCisgIGZvciAobmFtZSwgZXh0ZW5zaW9uX2RlcykgaW4gZmlsZV9kZXMuZXh0ZW5zaW9uc19ieV9uYW1lLml0ZW1zKCk6CisgICAgbW9kdWxlW25hbWUudXBwZXIoKSArICdfRklFTERfTlVNQkVSJ10gPSBleHRlbnNpb25fZGVzLm51bWJlcgorICAgIG1vZHVsZVtuYW1lXSA9IGV4dGVuc2lvbl9kZXMKKworICAjIHNlcnZpY2VzCisgIGZvciAobmFtZSwgc2VydmljZSkgaW4gZmlsZV9kZXMuc2VydmljZXNfYnlfbmFtZS5pdGVtcygpOgorICAgIG1vZHVsZVsnXycgKyBuYW1lLnVwcGVyKCldID0gc2VydmljZQorCisgICMgQnVpbGQgbWVzc2FnZXMuCisgIGZvciAobmFtZSwgbXNnX2RlcykgaW4gZmlsZV9kZXMubWVzc2FnZV90eXBlc19ieV9uYW1lLml0ZW1zKCk6CisgICAgbW9kdWxlW25hbWVdID0gQnVpbGRNZXNzYWdlKG1zZ19kZXMpCisKKworZGVmIEJ1aWxkU2VydmljZXMoZmlsZV9kZXMsIG1vZHVsZV9uYW1lLCBtb2R1bGUpOgorICAiIiJCdWlsZHMgc2VydmljZXMgY2xhc3NlcyBhbmQgc2VydmljZXMgc3R1YiBjbGFzcy4KKworICBBcmdzOgorICAgIGZpbGVfZGVzOiBGaWxlRGVzY3JpcHRvciBvZiB0aGUgLnByb3RvIGZpbGUKKyAgICBtb2R1bGVfbmFtZTogc3RyLCB0aGUgbmFtZSBvZiBnZW5lcmF0ZWQgX3BiMiBtb2R1bGUKKyAgICBtb2R1bGU6IEdlbmVyYXRlZCBfcGIyIG1vZHVsZQorICAiIiIKKyAgIyBweWxpbnQ6IGRpc2FibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAorICBmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc2VydmljZSBhcyBfc2VydmljZQorICBmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc2VydmljZV9yZWZsZWN0aW9uCisgICMgcHlsaW50OiBlbmFibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAorICBmb3IgKG5hbWUsIHNlcnZpY2UpIGluIGZpbGVfZGVzLnNlcnZpY2VzX2J5X25hbWUuaXRlbXMoKToKKyAgICBtb2R1bGVbbmFtZV0gPSBzZXJ2aWNlX3JlZmxlY3Rpb24uR2VuZXJhdGVkU2VydmljZVR5cGUoCisgICAgICAgIG5hbWUsIChfc2VydmljZS5TZXJ2aWNlLCksCisgICAgICAgIGRpY3QoREVTQ1JJUFRPUj1zZXJ2aWNlLCBfX21vZHVsZV9fPW1vZHVsZV9uYW1lKSkKKyAgICBzdHViX25hbWUgPSBuYW1lICsgJ19TdHViJworICAgIG1vZHVsZVtzdHViX25hbWVdID0gc2VydmljZV9yZWZsZWN0aW9uLkdlbmVyYXRlZFNlcnZpY2VTdHViVHlwZSgKKyAgICAgICAgc3R1Yl9uYW1lLCAobW9kdWxlW25hbWVdLCksCisgICAgICAgIGRpY3QoREVTQ1JJUFRPUj1zZXJ2aWNlLCBfX21vZHVsZV9fPW1vZHVsZV9uYW1lKSkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvY29udGFpbmVycy5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvY29udGFpbmVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWZiYjUzCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jb250YWluZXJzLnB5CkBAIC0wLDAgKzEsNzEwIEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkNvbnRhaW5zIGNvbnRhaW5lciBjbGFzc2VzIHRvIHJlcHJlc2VudCBkaWZmZXJlbnQgcHJvdG9jb2wgYnVmZmVyIHR5cGVzLgorCitUaGlzIGZpbGUgZGVmaW5lcyBjb250YWluZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgY2F0ZWdvcmllcyBvZiBwcm90b2NvbAorYnVmZmVyIGZpZWxkIHR5cGVzIHdoaWNoIG5lZWQgZXh0cmEgbWFpbnRlbmFuY2UuIEN1cnJlbnRseSB0aGVzZSBjYXRlZ29yaWVzCithcmU6CisKKy0gICBSZXBlYXRlZCBzY2FsYXIgZmllbGRzIC0gVGhlc2UgYXJlIGFsbCByZXBlYXRlZCBmaWVsZHMgd2hpY2ggYXJlbid0CisgICAgY29tcG9zaXRlIChlLmcuIHRoZXkgYXJlIG9mIHNpbXBsZSB0eXBlcyBsaWtlIGludDMyLCBzdHJpbmcsIGV0YykuCistICAgUmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcyAtIFJlcGVhdGVkIGZpZWxkcyB3aGljaCBhcmUgY29tcG9zaXRlLiBUaGlzCisgICAgaW5jbHVkZXMgZ3JvdXBzIGFuZCBuZXN0ZWQgbWVzc2FnZXMuCisiIiIKKworaW1wb3J0IGNvbGxlY3Rpb25zLmFiYworaW1wb3J0IGNvcHkKK2ltcG9ydCBwaWNrbGUKK2Zyb20gdHlwaW5nIGltcG9ydCAoCisgICAgQW55LAorICAgIEl0ZXJhYmxlLAorICAgIEl0ZXJhdG9yLAorICAgIExpc3QsCisgICAgTXV0YWJsZU1hcHBpbmcsCisgICAgTXV0YWJsZVNlcXVlbmNlLAorICAgIE5vUmV0dXJuLAorICAgIE9wdGlvbmFsLAorICAgIFNlcXVlbmNlLAorICAgIFR5cGVWYXIsCisgICAgVW5pb24sCisgICAgb3ZlcmxvYWQsCispCisKKworX1QgPSBUeXBlVmFyKCdfVCcpCitfSyA9IFR5cGVWYXIoJ19LJykKK19WID0gVHlwZVZhcignX1YnKQorCisKK2NsYXNzIEJhc2VDb250YWluZXIoU2VxdWVuY2VbX1RdKToKKyAgIiIiQmFzZSBjb250YWluZXIgY2xhc3MuIiIiCisKKyAgIyBNaW5pbWl6ZXMgbWVtb3J5IHVzYWdlIGFuZCBkaXNhbGxvd3MgYXNzaWdubWVudCB0byBvdGhlciBhdHRyaWJ1dGVzLgorICBfX3Nsb3RzX18gPSBbJ19tZXNzYWdlX2xpc3RlbmVyJywgJ192YWx1ZXMnXQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlX2xpc3RlbmVyOiBBbnkpIC0+IE5vbmU6CisgICAgIiIiCisgICAgQXJnczoKKyAgICAgIG1lc3NhZ2VfbGlzdGVuZXI6IEEgTWVzc2FnZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLgorICAgICAgICBUaGUgUmVwZWF0ZWRTY2FsYXJGaWVsZENvbnRhaW5lciB3aWxsIGNhbGwgdGhpcyBvYmplY3QncworICAgICAgICBNb2RpZmllZCgpIG1ldGhvZCB3aGVuIGl0IGlzIG1vZGlmaWVkLgorICAgICIiIgorICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIgPSBtZXNzYWdlX2xpc3RlbmVyCisgICAgc2VsZi5fdmFsdWVzID0gW10KKworICBAb3ZlcmxvYWQKKyAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleTogaW50KSAtPiBfVDoKKyAgICAuLi4KKworICBAb3ZlcmxvYWQKKyAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleTogc2xpY2UpIC0+IExpc3RbX1RdOgorICAgIC4uLgorCisgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICIiIlJldHJpZXZlcyBpdGVtIGJ5IHRoZSBzcGVjaWZpZWQga2V5LiIiIgorICAgIHJldHVybiBzZWxmLl92YWx1ZXNba2V5XQorCisgIGRlZiBfX2xlbl9fKHNlbGYpIC0+IGludDoKKyAgICAiIiJSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRhaW5lci4iIiIKKyAgICByZXR1cm4gbGVuKHNlbGYuX3ZhbHVlcykKKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyOiBBbnkpIC0+IGJvb2w6CisgICAgIiIiQ2hlY2tzIGlmIGFub3RoZXIgaW5zdGFuY2UgaXNuJ3QgZXF1YWwgdG8gdGhpcyBvbmUuIiIiCisgICAgIyBUaGUgY29uY3JldGUgY2xhc3NlcyBzaG91bGQgZGVmaW5lIF9fZXFfXy4KKyAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKKworICBfX2hhc2hfXyA9IE5vbmUKKworICBkZWYgX19yZXByX18oc2VsZikgLT4gc3RyOgorICAgIHJldHVybiByZXByKHNlbGYuX3ZhbHVlcykKKworICBkZWYgc29ydChzZWxmLCAqYXJncywgKiprd2FyZ3MpIC0+IE5vbmU6CisgICAgIyBDb250aW51ZSB0byBzdXBwb3J0IHRoZSBvbGQgc29ydF9mdW5jdGlvbiBrZXl3b3JkIGFyZ3VtZW50LgorICAgICMgVGhpcyBpcyBleHBlY3RlZCB0byBiZSBhIHJhcmUgb2NjdXJyZW5jZSwgc28gdXNlIExCWUwgdG8gYXZvaWQKKyAgICAjIHRoZSBvdmVyaGVhZCBvZiBhY3R1YWxseSBjYXRjaGluZyBLZXlFcnJvci4KKyAgICBpZiAnc29ydF9mdW5jdGlvbicgaW4ga3dhcmdzOgorICAgICAga3dhcmdzWydjbXAnXSA9IGt3YXJncy5wb3AoJ3NvcnRfZnVuY3Rpb24nKQorICAgIHNlbGYuX3ZhbHVlcy5zb3J0KCphcmdzLCAqKmt3YXJncykKKworICBkZWYgcmV2ZXJzZShzZWxmKSAtPiBOb25lOgorICAgIHNlbGYuX3ZhbHVlcy5yZXZlcnNlKCkKKworCisjIFRPRE8oc2xlYmVkZXYpOiBSZW1vdmUgdGhpcy4gQmFzZUNvbnRhaW5lciBkb2VzICpub3QqIGNvbmZvcm0gdG8KKyMgTXV0YWJsZVNlcXVlbmNlLCBvbmx5IGl0cyBzdWJjbGFzc2VzIGRvLgorY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXF1ZW5jZS5yZWdpc3RlcihCYXNlQ29udGFpbmVyKQorCisKK2NsYXNzIFJlcGVhdGVkU2NhbGFyRmllbGRDb250YWluZXIoQmFzZUNvbnRhaW5lcltfVF0sIE11dGFibGVTZXF1ZW5jZVtfVF0pOgorICAiIiJTaW1wbGUsIHR5cGUtY2hlY2tlZCwgbGlzdC1saWtlIGNvbnRhaW5lciBmb3IgaG9sZGluZyByZXBlYXRlZCBzY2FsYXJzLiIiIgorCisgICMgRGlzYWxsb3dzIGFzc2lnbm1lbnQgdG8gb3RoZXIgYXR0cmlidXRlcy4KKyAgX19zbG90c19fID0gWydfdHlwZV9jaGVja2VyJ10KKworICBkZWYgX19pbml0X18oCisgICAgICBzZWxmLAorICAgICAgbWVzc2FnZV9saXN0ZW5lcjogQW55LAorICAgICAgdHlwZV9jaGVja2VyOiBBbnksCisgICkgLT4gTm9uZToKKyAgICAiIiJBcmdzOgorCisgICAgICBtZXNzYWdlX2xpc3RlbmVyOiBBIE1lc3NhZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbi4gVGhlCisgICAgICBSZXBlYXRlZFNjYWxhckZpZWxkQ29udGFpbmVyIHdpbGwgY2FsbCB0aGlzIG9iamVjdCdzIE1vZGlmaWVkKCkgbWV0aG9kCisgICAgICB3aGVuIGl0IGlzIG1vZGlmaWVkLgorICAgICAgdHlwZV9jaGVja2VyOiBBIHR5cGVfY2hlY2tlcnMuVmFsdWVDaGVja2VyIGluc3RhbmNlIHRvIHJ1biBvbiBlbGVtZW50cworICAgICAgaW5zZXJ0ZWQgaW50byB0aGlzIGNvbnRhaW5lci4KKyAgICAiIiIKKyAgICBzdXBlcigpLl9faW5pdF9fKG1lc3NhZ2VfbGlzdGVuZXIpCisgICAgc2VsZi5fdHlwZV9jaGVja2VyID0gdHlwZV9jaGVja2VyCisKKyAgZGVmIGFwcGVuZChzZWxmLCB2YWx1ZTogX1QpIC0+IE5vbmU6CisgICAgIiIiQXBwZW5kcyBhbiBpdGVtIHRvIHRoZSBsaXN0LiBTaW1pbGFyIHRvIGxpc3QuYXBwZW5kKCkuIiIiCisgICAgc2VsZi5fdmFsdWVzLmFwcGVuZChzZWxmLl90eXBlX2NoZWNrZXIuQ2hlY2tWYWx1ZSh2YWx1ZSkpCisgICAgaWYgbm90IHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuZGlydHk6CisgICAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKKworICBkZWYgaW5zZXJ0KHNlbGYsIGtleTogaW50LCB2YWx1ZTogX1QpIC0+IE5vbmU6CisgICAgIiIiSW5zZXJ0cyB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBTaW1pbGFyIHRvIGxpc3QuaW5zZXJ0KCkuIiIiCisgICAgc2VsZi5fdmFsdWVzLmluc2VydChrZXksIHNlbGYuX3R5cGVfY2hlY2tlci5DaGVja1ZhbHVlKHZhbHVlKSkKKyAgICBpZiBub3Qgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5kaXJ0eToKKyAgICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiBleHRlbmQoc2VsZiwgZWxlbV9zZXE6IEl0ZXJhYmxlW19UXSkgLT4gTm9uZToKKyAgICAiIiJFeHRlbmRzIGJ5IGFwcGVuZGluZyB0aGUgZ2l2ZW4gaXRlcmFibGUuIFNpbWlsYXIgdG8gbGlzdC5leHRlbmQoKS4iIiIKKyAgICBpZiBlbGVtX3NlcSBpcyBOb25lOgorICAgICAgcmV0dXJuCisgICAgdHJ5OgorICAgICAgZWxlbV9zZXFfaXRlciA9IGl0ZXIoZWxlbV9zZXEpCisgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgIGlmIG5vdCBlbGVtX3NlcToKKyAgICAgICAgIyBzaWxlbnRseSBpZ25vcmUgZmFsc3kgaW5wdXRzIDotLy4KKyAgICAgICAgIyBUT0RPKHB0dWNrZXIpOiBEZXByZWNhdGUgdGhpcyBiZWhhdmlvci4gYi8xODQxMzg2MgorICAgICAgICByZXR1cm4KKyAgICAgIHJhaXNlCisKKyAgICBuZXdfdmFsdWVzID0gW3NlbGYuX3R5cGVfY2hlY2tlci5DaGVja1ZhbHVlKGVsZW0pIGZvciBlbGVtIGluIGVsZW1fc2VxX2l0ZXJdCisgICAgaWYgbmV3X3ZhbHVlczoKKyAgICAgIHNlbGYuX3ZhbHVlcy5leHRlbmQobmV3X3ZhbHVlcykKKyAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKKworICBkZWYgTWVyZ2VGcm9tKAorICAgICAgc2VsZiwKKyAgICAgIG90aGVyOiBVbmlvblsnUmVwZWF0ZWRTY2FsYXJGaWVsZENvbnRhaW5lcltfVF0nLCBJdGVyYWJsZVtfVF1dLAorICApIC0+IE5vbmU6CisgICAgIiIiQXBwZW5kcyB0aGUgY29udGVudHMgb2YgYW5vdGhlciByZXBlYXRlZCBmaWVsZCBvZiB0aGUgc2FtZSB0eXBlIHRvIHRoaXMKKyAgICBvbmUuIFdlIGRvIG5vdCBjaGVjayB0aGUgdHlwZXMgb2YgdGhlIGluZGl2aWR1YWwgZmllbGRzLgorICAgICIiIgorICAgIHNlbGYuX3ZhbHVlcy5leHRlbmQob3RoZXIpCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIHJlbW92ZShzZWxmLCBlbGVtOiBfVCk6CisgICAgIiIiUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGxpc3QuIFNpbWlsYXIgdG8gbGlzdC5yZW1vdmUoKS4iIiIKKyAgICBzZWxmLl92YWx1ZXMucmVtb3ZlKGVsZW0pCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIHBvcChzZWxmLCBrZXk6IE9wdGlvbmFsW2ludF0gPSAtMSkgLT4gX1Q6CisgICAgIiIiUmVtb3ZlcyBhbmQgcmV0dXJucyBhbiBpdGVtIGF0IGEgZ2l2ZW4gaW5kZXguIFNpbWlsYXIgdG8gbGlzdC5wb3AoKS4iIiIKKyAgICB2YWx1ZSA9IHNlbGYuX3ZhbHVlc1trZXldCisgICAgc2VsZi5fX2RlbGl0ZW1fXyhrZXkpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgQG92ZXJsb2FkCisgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXk6IGludCwgdmFsdWU6IF9UKSAtPiBOb25lOgorICAgIC4uLgorCisgIEBvdmVybG9hZAorICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5OiBzbGljZSwgdmFsdWU6IEl0ZXJhYmxlW19UXSkgLT4gTm9uZToKKyAgICAuLi4KKworICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSkgLT4gTm9uZToKKyAgICAiIiJTZXRzIHRoZSBpdGVtIG9uIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIiIiCisgICAgaWYgaXNpbnN0YW5jZShrZXksIHNsaWNlKToKKyAgICAgIGlmIGtleS5zdGVwIGlzIG5vdCBOb25lOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdFeHRlbmRlZCBzbGljZXMgbm90IHN1cHBvcnRlZCcpCisgICAgICBzZWxmLl92YWx1ZXNba2V5XSA9IG1hcChzZWxmLl90eXBlX2NoZWNrZXIuQ2hlY2tWYWx1ZSwgdmFsdWUpCisgICAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKKyAgICBlbHNlOgorICAgICAgc2VsZi5fdmFsdWVzW2tleV0gPSBzZWxmLl90eXBlX2NoZWNrZXIuQ2hlY2tWYWx1ZSh2YWx1ZSkKKyAgICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXk6IFVuaW9uW2ludCwgc2xpY2VdKSAtPiBOb25lOgorICAgICIiIkRlbGV0ZXMgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4iIiIKKyAgICBkZWwgc2VsZi5fdmFsdWVzW2tleV0KKyAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyOiBBbnkpIC0+IGJvb2w6CisgICAgIiIiQ29tcGFyZXMgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugd2l0aCBhbm90aGVyIG9uZS4iIiIKKyAgICBpZiBzZWxmIGlzIG90aGVyOgorICAgICAgcmV0dXJuIFRydWUKKyAgICAjIFNwZWNpYWwgY2FzZSBmb3IgdGhlIHNhbWUgdHlwZSB3aGljaCBzaG91bGQgYmUgY29tbW9uIGFuZCBmYXN0LgorICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgIHJldHVybiBvdGhlci5fdmFsdWVzID09IHNlbGYuX3ZhbHVlcworICAgICMgV2UgYXJlIHByZXN1bWFibHkgY29tcGFyaW5nIGFnYWluc3Qgc29tZSBvdGhlciBzZXF1ZW5jZSB0eXBlLgorICAgIHJldHVybiBvdGhlciA9PSBzZWxmLl92YWx1ZXMKKworICBkZWYgX19kZWVwY29weV9fKAorICAgICAgc2VsZiwKKyAgICAgIHVudXNlZF9tZW1vOiBBbnkgPSBOb25lLAorICApIC0+ICdSZXBlYXRlZFNjYWxhckZpZWxkQ29udGFpbmVyW19UXSc6CisgICAgY2xvbmUgPSBSZXBlYXRlZFNjYWxhckZpZWxkQ29udGFpbmVyKAorICAgICAgICBjb3B5LmRlZXBjb3B5KHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIpLCBzZWxmLl90eXBlX2NoZWNrZXIpCisgICAgY2xvbmUuTWVyZ2VGcm9tKHNlbGYpCisgICAgcmV0dXJuIGNsb25lCisKKyAgZGVmIF9fcmVkdWNlX18oc2VsZiwgKiprd2FyZ3MpIC0+IE5vUmV0dXJuOgorICAgIHJhaXNlIHBpY2tsZS5QaWNrbGVFcnJvcigKKyAgICAgICAgIkNhbid0IHBpY2tsZSByZXBlYXRlZCBzY2FsYXIgZmllbGRzLCBjb252ZXJ0IHRvIGxpc3QgZmlyc3QiKQorCisKKyMgVE9ETyhzbGViZWRldik6IENvbnN0cmFpbiBUIHRvIGJlIGEgc3VidHlwZSBvZiBNZXNzYWdlLgorY2xhc3MgUmVwZWF0ZWRDb21wb3NpdGVGaWVsZENvbnRhaW5lcihCYXNlQ29udGFpbmVyW19UXSwgTXV0YWJsZVNlcXVlbmNlW19UXSk6CisgICIiIlNpbXBsZSwgbGlzdC1saWtlIGNvbnRhaW5lciBmb3IgaG9sZGluZyByZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzLiIiIgorCisgICMgRGlzYWxsb3dzIGFzc2lnbm1lbnQgdG8gb3RoZXIgYXR0cmlidXRlcy4KKyAgX19zbG90c19fID0gWydfbWVzc2FnZV9kZXNjcmlwdG9yJ10KKworICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZV9saXN0ZW5lcjogQW55LCBtZXNzYWdlX2Rlc2NyaXB0b3I6IEFueSkgLT4gTm9uZToKKyAgICAiIiIKKyAgICBOb3RlIHRoYXQgd2UgcGFzcyBpbiBhIGRlc2NyaXB0b3IgaW5zdGVhZCBvZiB0aGUgZ2VuZXJhdGVkIGRpcmVjdGx5LAorICAgIHNpbmNlIGF0IHRoZSB0aW1lIHdlIGNvbnN0cnVjdCBhIF9SZXBlYXRlZENvbXBvc2l0ZUZpZWxkQ29udGFpbmVyIHdlCisgICAgaGF2ZW4ndCB5ZXQgbmVjZXNzYXJpbHkgaW5pdGlhbGl6ZWQgdGhlIHR5cGUgdGhhdCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGUKKyAgICBjb250YWluZXIuCisKKyAgICBBcmdzOgorICAgICAgbWVzc2FnZV9saXN0ZW5lcjogQSBNZXNzYWdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24uCisgICAgICAgIFRoZSBSZXBlYXRlZENvbXBvc2l0ZUZpZWxkQ29udGFpbmVyIHdpbGwgY2FsbCB0aGlzIG9iamVjdCdzCisgICAgICAgIE1vZGlmaWVkKCkgbWV0aG9kIHdoZW4gaXQgaXMgbW9kaWZpZWQuCisgICAgICBtZXNzYWdlX2Rlc2NyaXB0b3I6IEEgRGVzY3JpcHRvciBpbnN0YW5jZSBkZXNjcmliaW5nIHRoZSBwcm90b2NvbCB0eXBlCisgICAgICAgIHRoYXQgc2hvdWxkIGJlIHByZXNlbnQgaW4gdGhpcyBjb250YWluZXIuICBXZSdsbCB1c2UgdGhlCisgICAgICAgIF9jb25jcmV0ZV9jbGFzcyBmaWVsZCBvZiB0aGlzIGRlc2NyaXB0b3Igd2hlbiB0aGUgY2xpZW50IGNhbGxzIGFkZCgpLgorICAgICIiIgorICAgIHN1cGVyKCkuX19pbml0X18obWVzc2FnZV9saXN0ZW5lcikKKyAgICBzZWxmLl9tZXNzYWdlX2Rlc2NyaXB0b3IgPSBtZXNzYWdlX2Rlc2NyaXB0b3IKKworICBkZWYgYWRkKHNlbGYsICoqa3dhcmdzOiBBbnkpIC0+IF9UOgorICAgICIiIkFkZHMgYSBuZXcgZWxlbWVudCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiBLZXl3b3JkCisgICAgYXJndW1lbnRzIG1heSBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGVsZW1lbnQuCisgICAgIiIiCisgICAgbmV3X2VsZW1lbnQgPSBzZWxmLl9tZXNzYWdlX2Rlc2NyaXB0b3IuX2NvbmNyZXRlX2NsYXNzKCoqa3dhcmdzKQorICAgIG5ld19lbGVtZW50Ll9TZXRMaXN0ZW5lcihzZWxmLl9tZXNzYWdlX2xpc3RlbmVyKQorICAgIHNlbGYuX3ZhbHVlcy5hcHBlbmQobmV3X2VsZW1lbnQpCisgICAgaWYgbm90IHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuZGlydHk6CisgICAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKKyAgICByZXR1cm4gbmV3X2VsZW1lbnQKKworICBkZWYgYXBwZW5kKHNlbGYsIHZhbHVlOiBfVCkgLT4gTm9uZToKKyAgICAiIiJBcHBlbmRzIG9uZSBlbGVtZW50IGJ5IGNvcHlpbmcgdGhlIG1lc3NhZ2UuIiIiCisgICAgbmV3X2VsZW1lbnQgPSBzZWxmLl9tZXNzYWdlX2Rlc2NyaXB0b3IuX2NvbmNyZXRlX2NsYXNzKCkKKyAgICBuZXdfZWxlbWVudC5fU2V0TGlzdGVuZXIoc2VsZi5fbWVzc2FnZV9saXN0ZW5lcikKKyAgICBuZXdfZWxlbWVudC5Db3B5RnJvbSh2YWx1ZSkKKyAgICBzZWxmLl92YWx1ZXMuYXBwZW5kKG5ld19lbGVtZW50KQorICAgIGlmIG5vdCBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLmRpcnR5OgorICAgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIGluc2VydChzZWxmLCBrZXk6IGludCwgdmFsdWU6IF9UKSAtPiBOb25lOgorICAgICIiIkluc2VydHMgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBieSBjb3B5aW5nLiIiIgorICAgIG5ld19lbGVtZW50ID0gc2VsZi5fbWVzc2FnZV9kZXNjcmlwdG9yLl9jb25jcmV0ZV9jbGFzcygpCisgICAgbmV3X2VsZW1lbnQuX1NldExpc3RlbmVyKHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIpCisgICAgbmV3X2VsZW1lbnQuQ29weUZyb20odmFsdWUpCisgICAgc2VsZi5fdmFsdWVzLmluc2VydChrZXksIG5ld19lbGVtZW50KQorICAgIGlmIG5vdCBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLmRpcnR5OgorICAgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIGV4dGVuZChzZWxmLCBlbGVtX3NlcTogSXRlcmFibGVbX1RdKSAtPiBOb25lOgorICAgICIiIkV4dGVuZHMgYnkgYXBwZW5kaW5nIHRoZSBnaXZlbiBzZXF1ZW5jZSBvZiBlbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlCisKKyAgICBhcyB0aGlzIG9uZSwgY29weWluZyBlYWNoIGluZGl2aWR1YWwgbWVzc2FnZS4KKyAgICAiIiIKKyAgICBtZXNzYWdlX2NsYXNzID0gc2VsZi5fbWVzc2FnZV9kZXNjcmlwdG9yLl9jb25jcmV0ZV9jbGFzcworICAgIGxpc3RlbmVyID0gc2VsZi5fbWVzc2FnZV9saXN0ZW5lcgorICAgIHZhbHVlcyA9IHNlbGYuX3ZhbHVlcworICAgIGZvciBtZXNzYWdlIGluIGVsZW1fc2VxOgorICAgICAgbmV3X2VsZW1lbnQgPSBtZXNzYWdlX2NsYXNzKCkKKyAgICAgIG5ld19lbGVtZW50Ll9TZXRMaXN0ZW5lcihsaXN0ZW5lcikKKyAgICAgIG5ld19lbGVtZW50Lk1lcmdlRnJvbShtZXNzYWdlKQorICAgICAgdmFsdWVzLmFwcGVuZChuZXdfZWxlbWVudCkKKyAgICBsaXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIE1lcmdlRnJvbSgKKyAgICAgIHNlbGYsCisgICAgICBvdGhlcjogVW5pb25bJ1JlcGVhdGVkQ29tcG9zaXRlRmllbGRDb250YWluZXJbX1RdJywgSXRlcmFibGVbX1RdXSwKKyAgKSAtPiBOb25lOgorICAgICIiIkFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgcmVwZWF0ZWQgZmllbGQgb2YgdGhlIHNhbWUgdHlwZSB0byB0aGlzCisgICAgb25lLCBjb3B5aW5nIGVhY2ggaW5kaXZpZHVhbCBtZXNzYWdlLgorICAgICIiIgorICAgIHNlbGYuZXh0ZW5kKG90aGVyKQorCisgIGRlZiByZW1vdmUoc2VsZiwgZWxlbTogX1QpIC0+IE5vbmU6CisgICAgIiIiUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGxpc3QuIFNpbWlsYXIgdG8gbGlzdC5yZW1vdmUoKS4iIiIKKyAgICBzZWxmLl92YWx1ZXMucmVtb3ZlKGVsZW0pCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIHBvcChzZWxmLCBrZXk6IE9wdGlvbmFsW2ludF0gPSAtMSkgLT4gX1Q6CisgICAgIiIiUmVtb3ZlcyBhbmQgcmV0dXJucyBhbiBpdGVtIGF0IGEgZ2l2ZW4gaW5kZXguIFNpbWlsYXIgdG8gbGlzdC5wb3AoKS4iIiIKKyAgICB2YWx1ZSA9IHNlbGYuX3ZhbHVlc1trZXldCisgICAgc2VsZi5fX2RlbGl0ZW1fXyhrZXkpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgQG92ZXJsb2FkCisgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXk6IGludCwgdmFsdWU6IF9UKSAtPiBOb25lOgorICAgIC4uLgorCisgIEBvdmVybG9hZAorICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5OiBzbGljZSwgdmFsdWU6IEl0ZXJhYmxlW19UXSkgLT4gTm9uZToKKyAgICAuLi4KKworICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgIyBUaGlzIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCB0byBtYWtlIFJlcGVhdGVkQ29tcG9zaXRlRmllbGRDb250YWluZXIKKyAgICAjIHN0cnVjdHVyYWxseSBjb21wYXRpYmxlIHdpdGggdHlwaW5nLk11dGFibGVTZXF1ZW5jZS4gSXQgaXMKKyAgICAjIG90aGVyd2lzZSB1bnN1cHBvcnRlZCBhbmQgd2lsbCBhbHdheXMgcmFpc2UgYW4gZXJyb3IuCisgICAgcmFpc2UgVHlwZUVycm9yKAorICAgICAgICBmJ3tzZWxmLl9fY2xhc3NfXy5fX25hbWVfX30gb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50JykKKworICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5OiBVbmlvbltpbnQsIHNsaWNlXSkgLT4gTm9uZToKKyAgICAiIiJEZWxldGVzIHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIiIiCisgICAgZGVsIHNlbGYuX3ZhbHVlc1trZXldCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcjogQW55KSAtPiBib29sOgorICAgICIiIkNvbXBhcmVzIHRoZSBjdXJyZW50IGluc3RhbmNlIHdpdGggYW5vdGhlciBvbmUuIiIiCisgICAgaWYgc2VsZiBpcyBvdGhlcjoKKyAgICAgIHJldHVybiBUcnVlCisgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgIHJhaXNlIFR5cGVFcnJvcignQ2FuIG9ubHkgY29tcGFyZSByZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzIGFnYWluc3QgJworICAgICAgICAgICAgICAgICAgICAgICdvdGhlciByZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzLicpCisgICAgcmV0dXJuIHNlbGYuX3ZhbHVlcyA9PSBvdGhlci5fdmFsdWVzCisKKworY2xhc3MgU2NhbGFyTWFwKE11dGFibGVNYXBwaW5nW19LLCBfVl0pOgorICAiIiJTaW1wbGUsIHR5cGUtY2hlY2tlZCwgZGljdC1saWtlIGNvbnRhaW5lciBmb3IgaG9sZGluZyByZXBlYXRlZCBzY2FsYXJzLiIiIgorCisgICMgRGlzYWxsb3dzIGFzc2lnbm1lbnQgdG8gb3RoZXIgYXR0cmlidXRlcy4KKyAgX19zbG90c19fID0gWydfa2V5X2NoZWNrZXInLCAnX3ZhbHVlX2NoZWNrZXInLCAnX3ZhbHVlcycsICdfbWVzc2FnZV9saXN0ZW5lcicsCisgICAgICAgICAgICAgICAnX2VudHJ5X2Rlc2NyaXB0b3InXQorCisgIGRlZiBfX2luaXRfXygKKyAgICAgIHNlbGYsCisgICAgICBtZXNzYWdlX2xpc3RlbmVyOiBBbnksCisgICAgICBrZXlfY2hlY2tlcjogQW55LAorICAgICAgdmFsdWVfY2hlY2tlcjogQW55LAorICAgICAgZW50cnlfZGVzY3JpcHRvcjogQW55LAorICApIC0+IE5vbmU6CisgICAgIiIiCisgICAgQXJnczoKKyAgICAgIG1lc3NhZ2VfbGlzdGVuZXI6IEEgTWVzc2FnZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLgorICAgICAgICBUaGUgU2NhbGFyTWFwIHdpbGwgY2FsbCB0aGlzIG9iamVjdCdzIE1vZGlmaWVkKCkgbWV0aG9kIHdoZW4gaXQKKyAgICAgICAgaXMgbW9kaWZpZWQuCisgICAgICBrZXlfY2hlY2tlcjogQSB0eXBlX2NoZWNrZXJzLlZhbHVlQ2hlY2tlciBpbnN0YW5jZSB0byBydW4gb24ga2V5cworICAgICAgICBpbnNlcnRlZCBpbnRvIHRoaXMgY29udGFpbmVyLgorICAgICAgdmFsdWVfY2hlY2tlcjogQSB0eXBlX2NoZWNrZXJzLlZhbHVlQ2hlY2tlciBpbnN0YW5jZSB0byBydW4gb24gdmFsdWVzCisgICAgICAgIGluc2VydGVkIGludG8gdGhpcyBjb250YWluZXIuCisgICAgICBlbnRyeV9kZXNjcmlwdG9yOiBUaGUgTWVzc2FnZURlc2NyaXB0b3Igb2YgYSBtYXAgZW50cnk6IGtleSBhbmQgdmFsdWUuCisgICAgIiIiCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lciA9IG1lc3NhZ2VfbGlzdGVuZXIKKyAgICBzZWxmLl9rZXlfY2hlY2tlciA9IGtleV9jaGVja2VyCisgICAgc2VsZi5fdmFsdWVfY2hlY2tlciA9IHZhbHVlX2NoZWNrZXIKKyAgICBzZWxmLl9lbnRyeV9kZXNjcmlwdG9yID0gZW50cnlfZGVzY3JpcHRvcgorICAgIHNlbGYuX3ZhbHVlcyA9IHt9CisKKyAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleTogX0spIC0+IF9WOgorICAgIHRyeToKKyAgICAgIHJldHVybiBzZWxmLl92YWx1ZXNba2V5XQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIGtleSA9IHNlbGYuX2tleV9jaGVja2VyLkNoZWNrVmFsdWUoa2V5KQorICAgICAgdmFsID0gc2VsZi5fdmFsdWVfY2hlY2tlci5EZWZhdWx0VmFsdWUoKQorICAgICAgc2VsZi5fdmFsdWVzW2tleV0gPSB2YWwKKyAgICAgIHJldHVybiB2YWwKKworICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW06IF9LKSAtPiBib29sOgorICAgICMgV2UgY2hlY2sgdGhlIGtleSdzIHR5cGUgdG8gbWF0Y2ggdGhlIHN0cm9uZy10eXBpbmcgZmxhdm9yIG9mIHRoZSBBUEkuCisgICAgIyBBbHNvIHRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBvZiB0aGUgQysrIGltcGxlbWVudGF0aW9uLgorICAgIHNlbGYuX2tleV9jaGVja2VyLkNoZWNrVmFsdWUoaXRlbSkKKyAgICByZXR1cm4gaXRlbSBpbiBzZWxmLl92YWx1ZXMKKworICBAb3ZlcmxvYWQKKyAgZGVmIGdldChzZWxmLCBrZXk6IF9LKSAtPiBPcHRpb25hbFtfVl06CisgICAgLi4uCisKKyAgQG92ZXJsb2FkCisgIGRlZiBnZXQoc2VsZiwga2V5OiBfSywgZGVmYXVsdDogX1QpIC0+IFVuaW9uW19WLCBfVF06CisgICAgLi4uCisKKyAgIyBXZSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgZXhwbGljaXRseSwgYmVjYXVzZSBvdXIgZGVmYXVsdGRpY3QtbGlrZSBiZWhhdmlvcgorICAjIHdpbGwgbWFrZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAoZnJvbSBvdXIgYmFzZSBjbGFzcykgYWx3YXlzIGluc2VydAorICAjIHRoZSBrZXkuCisgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgIGlmIGtleSBpbiBzZWxmOgorICAgICAgcmV0dXJuIHNlbGZba2V5XQorICAgIGVsc2U6CisgICAgICByZXR1cm4gZGVmYXVsdAorCisgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXk6IF9LLCB2YWx1ZTogX1YpIC0+IF9UOgorICAgIGNoZWNrZWRfa2V5ID0gc2VsZi5fa2V5X2NoZWNrZXIuQ2hlY2tWYWx1ZShrZXkpCisgICAgY2hlY2tlZF92YWx1ZSA9IHNlbGYuX3ZhbHVlX2NoZWNrZXIuQ2hlY2tWYWx1ZSh2YWx1ZSkKKyAgICBzZWxmLl92YWx1ZXNbY2hlY2tlZF9rZXldID0gY2hlY2tlZF92YWx1ZQorICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXk6IF9LKSAtPiBOb25lOgorICAgIGRlbCBzZWxmLl92YWx1ZXNba2V5XQorICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiBfX2xlbl9fKHNlbGYpIC0+IGludDoKKyAgICByZXR1cm4gbGVuKHNlbGYuX3ZhbHVlcykKKworICBkZWYgX19pdGVyX18oc2VsZikgLT4gSXRlcmF0b3JbX0tdOgorICAgIHJldHVybiBpdGVyKHNlbGYuX3ZhbHVlcykKKworICBkZWYgX19yZXByX18oc2VsZikgLT4gc3RyOgorICAgIHJldHVybiByZXByKHNlbGYuX3ZhbHVlcykKKworICBkZWYgTWVyZ2VGcm9tKHNlbGYsIG90aGVyOiAnU2NhbGFyTWFwW19LLCBfVl0nKSAtPiBOb25lOgorICAgIHNlbGYuX3ZhbHVlcy51cGRhdGUob3RoZXIuX3ZhbHVlcykKKyAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKKworICBkZWYgSW52YWxpZGF0ZUl0ZXJhdG9ycyhzZWxmKSAtPiBOb25lOgorICAgICMgSXQgYXBwZWFycyB0aGF0IHRoZSBvbmx5IHdheSB0byByZWxpYWJseSBpbnZhbGlkYXRlIGl0ZXJhdG9ycyB0bworICAgICMgc2VsZi5fdmFsdWVzIGlzIHRvIGVuc3VyZSB0aGF0IGl0cyBzaXplIGNoYW5nZXMuCisgICAgb3JpZ2luYWwgPSBzZWxmLl92YWx1ZXMKKyAgICBzZWxmLl92YWx1ZXMgPSBvcmlnaW5hbC5jb3B5KCkKKyAgICBvcmlnaW5hbFtOb25lXSA9IE5vbmUKKworICAjIFRoaXMgaXMgZGVmaW5lZCBpbiB0aGUgYWJzdHJhY3QgYmFzZSwgYnV0IHdlIGNhbiBkbyBpdCBtdWNoIG1vcmUgY2hlYXBseS4KKyAgZGVmIGNsZWFyKHNlbGYpIC0+IE5vbmU6CisgICAgc2VsZi5fdmFsdWVzLmNsZWFyKCkKKyAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKKworICBkZWYgR2V0RW50cnlDbGFzcyhzZWxmKSAtPiBBbnk6CisgICAgcmV0dXJuIHNlbGYuX2VudHJ5X2Rlc2NyaXB0b3IuX2NvbmNyZXRlX2NsYXNzCisKKworY2xhc3MgTWVzc2FnZU1hcChNdXRhYmxlTWFwcGluZ1tfSywgX1ZdKToKKyAgIiIiU2ltcGxlLCB0eXBlLWNoZWNrZWQsIGRpY3QtbGlrZSBjb250YWluZXIgZm9yIHdpdGggc3VibWVzc2FnZSB2YWx1ZXMuIiIiCisKKyAgIyBEaXNhbGxvd3MgYXNzaWdubWVudCB0byBvdGhlciBhdHRyaWJ1dGVzLgorICBfX3Nsb3RzX18gPSBbJ19rZXlfY2hlY2tlcicsICdfdmFsdWVzJywgJ19tZXNzYWdlX2xpc3RlbmVyJywKKyAgICAgICAgICAgICAgICdfbWVzc2FnZV9kZXNjcmlwdG9yJywgJ19lbnRyeV9kZXNjcmlwdG9yJ10KKworICBkZWYgX19pbml0X18oCisgICAgICBzZWxmLAorICAgICAgbWVzc2FnZV9saXN0ZW5lcjogQW55LAorICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yOiBBbnksCisgICAgICBrZXlfY2hlY2tlcjogQW55LAorICAgICAgZW50cnlfZGVzY3JpcHRvcjogQW55LAorICApIC0+IE5vbmU6CisgICAgIiIiCisgICAgQXJnczoKKyAgICAgIG1lc3NhZ2VfbGlzdGVuZXI6IEEgTWVzc2FnZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLgorICAgICAgICBUaGUgU2NhbGFyTWFwIHdpbGwgY2FsbCB0aGlzIG9iamVjdCdzIE1vZGlmaWVkKCkgbWV0aG9kIHdoZW4gaXQKKyAgICAgICAgaXMgbW9kaWZpZWQuCisgICAgICBrZXlfY2hlY2tlcjogQSB0eXBlX2NoZWNrZXJzLlZhbHVlQ2hlY2tlciBpbnN0YW5jZSB0byBydW4gb24ga2V5cworICAgICAgICBpbnNlcnRlZCBpbnRvIHRoaXMgY29udGFpbmVyLgorICAgICAgdmFsdWVfY2hlY2tlcjogQSB0eXBlX2NoZWNrZXJzLlZhbHVlQ2hlY2tlciBpbnN0YW5jZSB0byBydW4gb24gdmFsdWVzCisgICAgICAgIGluc2VydGVkIGludG8gdGhpcyBjb250YWluZXIuCisgICAgICBlbnRyeV9kZXNjcmlwdG9yOiBUaGUgTWVzc2FnZURlc2NyaXB0b3Igb2YgYSBtYXAgZW50cnk6IGtleSBhbmQgdmFsdWUuCisgICAgIiIiCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lciA9IG1lc3NhZ2VfbGlzdGVuZXIKKyAgICBzZWxmLl9tZXNzYWdlX2Rlc2NyaXB0b3IgPSBtZXNzYWdlX2Rlc2NyaXB0b3IKKyAgICBzZWxmLl9rZXlfY2hlY2tlciA9IGtleV9jaGVja2VyCisgICAgc2VsZi5fZW50cnlfZGVzY3JpcHRvciA9IGVudHJ5X2Rlc2NyaXB0b3IKKyAgICBzZWxmLl92YWx1ZXMgPSB7fQorCisgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXk6IF9LKSAtPiBfVjoKKyAgICBrZXkgPSBzZWxmLl9rZXlfY2hlY2tlci5DaGVja1ZhbHVlKGtleSkKKyAgICB0cnk6CisgICAgICByZXR1cm4gc2VsZi5fdmFsdWVzW2tleV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICBuZXdfZWxlbWVudCA9IHNlbGYuX21lc3NhZ2VfZGVzY3JpcHRvci5fY29uY3JldGVfY2xhc3MoKQorICAgICAgbmV3X2VsZW1lbnQuX1NldExpc3RlbmVyKHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIpCisgICAgICBzZWxmLl92YWx1ZXNba2V5XSA9IG5ld19lbGVtZW50CisgICAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKKyAgICAgIHJldHVybiBuZXdfZWxlbWVudAorCisgIGRlZiBnZXRfb3JfY3JlYXRlKHNlbGYsIGtleTogX0spIC0+IF9WOgorICAgICIiImdldF9vcl9jcmVhdGUoKSBpcyBhbiBhbGlhcyBmb3IgZ2V0aXRlbSAoaWUuIG1hcFtrZXldKS4KKworICAgIEFyZ3M6CisgICAgICBrZXk6IFRoZSBrZXkgdG8gZ2V0IG9yIGNyZWF0ZSBpbiB0aGUgbWFwLgorCisgICAgVGhpcyBpcyB1c2VmdWwgaW4gY2FzZXMgd2hlcmUgeW91IHdhbnQgdG8gYmUgZXhwbGljaXQgdGhhdCB0aGUgY2FsbCBpcworICAgIG11dGF0aW5nIHRoZSBtYXAuICBUaGlzIGNhbiBhdm9pZCBsaW50IGVycm9ycyBmb3Igc3RhdGVtZW50cyBsaWtlIHRoaXMKKyAgICB0aGF0IG90aGVyd2lzZSB3b3VsZCBhcHBlYXIgdG8gYmUgcG9pbnRsZXNzIHN0YXRlbWVudHM6CisKKyAgICAgIG1zZy5teV9tYXBba2V5XQorICAgICIiIgorICAgIHJldHVybiBzZWxmW2tleV0KKworICBAb3ZlcmxvYWQKKyAgZGVmIGdldChzZWxmLCBrZXk6IF9LKSAtPiBPcHRpb25hbFtfVl06CisgICAgLi4uCisKKyAgQG92ZXJsb2FkCisgIGRlZiBnZXQoc2VsZiwga2V5OiBfSywgZGVmYXVsdDogX1QpIC0+IFVuaW9uW19WLCBfVF06CisgICAgLi4uCisKKyAgIyBXZSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgZXhwbGljaXRseSwgYmVjYXVzZSBvdXIgZGVmYXVsdGRpY3QtbGlrZSBiZWhhdmlvcgorICAjIHdpbGwgbWFrZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAoZnJvbSBvdXIgYmFzZSBjbGFzcykgYWx3YXlzIGluc2VydAorICAjIHRoZSBrZXkuCisgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgIGlmIGtleSBpbiBzZWxmOgorICAgICAgcmV0dXJuIHNlbGZba2V5XQorICAgIGVsc2U6CisgICAgICByZXR1cm4gZGVmYXVsdAorCisgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbTogX0spIC0+IGJvb2w6CisgICAgaXRlbSA9IHNlbGYuX2tleV9jaGVja2VyLkNoZWNrVmFsdWUoaXRlbSkKKyAgICByZXR1cm4gaXRlbSBpbiBzZWxmLl92YWx1ZXMKKworICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5OiBfSywgdmFsdWU6IF9WKSAtPiBOb1JldHVybjoKKyAgICByYWlzZSBWYWx1ZUVycm9yKCdNYXkgbm90IHNldCB2YWx1ZXMgZGlyZWN0bHksIGNhbGwgbXlfbWFwW2tleV0uZm9vID0gNScpCisKKyAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleTogX0spIC0+IE5vbmU6CisgICAga2V5ID0gc2VsZi5fa2V5X2NoZWNrZXIuQ2hlY2tWYWx1ZShrZXkpCisgICAgZGVsIHNlbGYuX3ZhbHVlc1trZXldCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIF9fbGVuX18oc2VsZikgLT4gaW50OgorICAgIHJldHVybiBsZW4oc2VsZi5fdmFsdWVzKQorCisgIGRlZiBfX2l0ZXJfXyhzZWxmKSAtPiBJdGVyYXRvcltfS106CisgICAgcmV0dXJuIGl0ZXIoc2VsZi5fdmFsdWVzKQorCisgIGRlZiBfX3JlcHJfXyhzZWxmKSAtPiBzdHI6CisgICAgcmV0dXJuIHJlcHIoc2VsZi5fdmFsdWVzKQorCisgIGRlZiBNZXJnZUZyb20oc2VsZiwgb3RoZXI6ICdNZXNzYWdlTWFwW19LLCBfVl0nKSAtPiBOb25lOgorICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICBmb3Iga2V5IGluIG90aGVyLl92YWx1ZXM6CisgICAgICAjIEFjY29yZGluZyB0byBkb2N1bWVudGF0aW9uOiAiV2hlbiBwYXJzaW5nIGZyb20gdGhlIHdpcmUgb3Igd2hlbiBtZXJnaW5nLAorICAgICAgIyBpZiB0aGVyZSBhcmUgZHVwbGljYXRlIG1hcCBrZXlzIHRoZSBsYXN0IGtleSBzZWVuIGlzIHVzZWQiLgorICAgICAgaWYga2V5IGluIHNlbGY6CisgICAgICAgIGRlbCBzZWxmW2tleV0KKyAgICAgIHNlbGZba2V5XS5Db3B5RnJvbShvdGhlcltrZXldKQorICAgICMgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpIG5vdCByZXF1aXJlZCBoZXJlLCBiZWNhdXNlCisgICAgIyBtdXRhdGlvbnMgdG8gc3VibWVzc2FnZXMgYWxyZWFkeSBwcm9wYWdhdGUuCisKKyAgZGVmIEludmFsaWRhdGVJdGVyYXRvcnMoc2VsZikgLT4gTm9uZToKKyAgICAjIEl0IGFwcGVhcnMgdGhhdCB0aGUgb25seSB3YXkgdG8gcmVsaWFibHkgaW52YWxpZGF0ZSBpdGVyYXRvcnMgdG8KKyAgICAjIHNlbGYuX3ZhbHVlcyBpcyB0byBlbnN1cmUgdGhhdCBpdHMgc2l6ZSBjaGFuZ2VzLgorICAgIG9yaWdpbmFsID0gc2VsZi5fdmFsdWVzCisgICAgc2VsZi5fdmFsdWVzID0gb3JpZ2luYWwuY29weSgpCisgICAgb3JpZ2luYWxbTm9uZV0gPSBOb25lCisKKyAgIyBUaGlzIGlzIGRlZmluZWQgaW4gdGhlIGFic3RyYWN0IGJhc2UsIGJ1dCB3ZSBjYW4gZG8gaXQgbXVjaCBtb3JlIGNoZWFwbHkuCisgIGRlZiBjbGVhcihzZWxmKSAtPiBOb25lOgorICAgIHNlbGYuX3ZhbHVlcy5jbGVhcigpCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIEdldEVudHJ5Q2xhc3Moc2VsZikgLT4gQW55OgorICAgIHJldHVybiBzZWxmLl9lbnRyeV9kZXNjcmlwdG9yLl9jb25jcmV0ZV9jbGFzcworCisKK2NsYXNzIF9Vbmtub3duRmllbGQ6CisgICIiIkEgcGFyc2VkIHVua25vd24gZmllbGQuIiIiCisKKyAgIyBEaXNhbGxvd3MgYXNzaWdubWVudCB0byBvdGhlciBhdHRyaWJ1dGVzLgorICBfX3Nsb3RzX18gPSBbJ19maWVsZF9udW1iZXInLCAnX3dpcmVfdHlwZScsICdfZGF0YSddCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGZpZWxkX251bWJlciwgd2lyZV90eXBlLCBkYXRhKToKKyAgICBzZWxmLl9maWVsZF9udW1iZXIgPSBmaWVsZF9udW1iZXIKKyAgICBzZWxmLl93aXJlX3R5cGUgPSB3aXJlX3R5cGUKKyAgICBzZWxmLl9kYXRhID0gZGF0YQorICAgIHJldHVybgorCisgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICByZXR1cm4gc2VsZi5fZmllbGRfbnVtYmVyIDwgb3RoZXIuX2ZpZWxkX251bWJlcgorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIGlmIHNlbGYgaXMgb3RoZXI6CisgICAgICByZXR1cm4gVHJ1ZQorICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICByZXR1cm4gKHNlbGYuX2ZpZWxkX251bWJlciA9PSBvdGhlci5fZmllbGRfbnVtYmVyIGFuZAorICAgICAgICAgICAgc2VsZi5fd2lyZV90eXBlID09IG90aGVyLl93aXJlX3R5cGUgYW5kCisgICAgICAgICAgICBzZWxmLl9kYXRhID09IG90aGVyLl9kYXRhKQorCisKK2NsYXNzIFVua25vd25GaWVsZFJlZjogICMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctY2xhc3MtZG9jc3RyaW5nCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgaW5kZXgpOgorICAgIHNlbGYuX3BhcmVudCA9IHBhcmVudAorICAgIHNlbGYuX2luZGV4ID0gaW5kZXgKKworICBkZWYgX2NoZWNrX3ZhbGlkKHNlbGYpOgorICAgIGlmIG5vdCBzZWxmLl9wYXJlbnQ6CisgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmtub3duRmllbGQgZG9lcyBub3QgZXhpc3QuICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBwYXJlbnQgbWVzc2FnZSBtaWdodCBiZSBjbGVhcmVkLicpCisgICAgaWYgc2VsZi5faW5kZXggPj0gbGVuKHNlbGYuX3BhcmVudCk6CisgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmtub3duRmllbGQgZG9lcyBub3QgZXhpc3QuICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBwYXJlbnQgbWVzc2FnZSBtaWdodCBiZSBjbGVhcmVkLicpCisKKyAgQHByb3BlcnR5CisgIGRlZiBmaWVsZF9udW1iZXIoc2VsZik6CisgICAgc2VsZi5fY2hlY2tfdmFsaWQoKQorICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICByZXR1cm4gc2VsZi5fcGFyZW50Ll9pbnRlcm5hbF9nZXQoc2VsZi5faW5kZXgpLl9maWVsZF9udW1iZXIKKworICBAcHJvcGVydHkKKyAgZGVmIHdpcmVfdHlwZShzZWxmKToKKyAgICBzZWxmLl9jaGVja192YWxpZCgpCisgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgIHJldHVybiBzZWxmLl9wYXJlbnQuX2ludGVybmFsX2dldChzZWxmLl9pbmRleCkuX3dpcmVfdHlwZQorCisgIEBwcm9wZXJ0eQorICBkZWYgZGF0YShzZWxmKToKKyAgICBzZWxmLl9jaGVja192YWxpZCgpCisgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgIHJldHVybiBzZWxmLl9wYXJlbnQuX2ludGVybmFsX2dldChzZWxmLl9pbmRleCkuX2RhdGEKKworCitjbGFzcyBVbmtub3duRmllbGRTZXQ6CisgICIiIlVua25vd25GaWVsZCBjb250YWluZXIiIiIKKworICAjIERpc2FsbG93cyBhc3NpZ25tZW50IHRvIG90aGVyIGF0dHJpYnV0ZXMuCisgIF9fc2xvdHNfXyA9IFsnX3ZhbHVlcyddCisKKyAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIHNlbGYuX3ZhbHVlcyA9IFtdCisKKyAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICBpZiBzZWxmLl92YWx1ZXMgaXMgTm9uZToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Vua25vd25GaWVsZHMgZG9lcyBub3QgZXhpc3QuICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBwYXJlbnQgbWVzc2FnZSBtaWdodCBiZSBjbGVhcmVkLicpCisgICAgc2l6ZSA9IGxlbihzZWxmLl92YWx1ZXMpCisgICAgaWYgaW5kZXggPCAwOgorICAgICAgaW5kZXggKz0gc2l6ZQorICAgIGlmIGluZGV4IDwgMCBvciBpbmRleCA+PSBzaXplOgorICAgICAgcmFpc2UgSW5kZXhFcnJvcignaW5kZXggJWQgb3V0IG9mIHJhbmdlJy5pbmRleCkKKworICAgIHJldHVybiBVbmtub3duRmllbGRSZWYoc2VsZiwgaW5kZXgpCisKKyAgZGVmIF9pbnRlcm5hbF9nZXQoc2VsZiwgaW5kZXgpOgorICAgIHJldHVybiBzZWxmLl92YWx1ZXNbaW5kZXhdCisKKyAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgaWYgc2VsZi5fdmFsdWVzIGlzIE5vbmU6CisgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmtub3duRmllbGRzIGRvZXMgbm90IGV4aXN0LiAnCisgICAgICAgICAgICAgICAgICAgICAgICdUaGUgcGFyZW50IG1lc3NhZ2UgbWlnaHQgYmUgY2xlYXJlZC4nKQorICAgIHJldHVybiBsZW4oc2VsZi5fdmFsdWVzKQorCisgIGRlZiBfYWRkKHNlbGYsIGZpZWxkX251bWJlciwgd2lyZV90eXBlLCBkYXRhKToKKyAgICB1bmtub3duX2ZpZWxkID0gX1Vua25vd25GaWVsZChmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSwgZGF0YSkKKyAgICBzZWxmLl92YWx1ZXMuYXBwZW5kKHVua25vd25fZmllbGQpCisgICAgcmV0dXJuIHVua25vd25fZmllbGQKKworICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYpKToKKyAgICAgIHlpZWxkIFVua25vd25GaWVsZFJlZihzZWxmLCBpKQorCisgIGRlZiBfZXh0ZW5kKHNlbGYsIG90aGVyKToKKyAgICBpZiBvdGhlciBpcyBOb25lOgorICAgICAgcmV0dXJuCisgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgIHNlbGYuX3ZhbHVlcy5leHRlbmQob3RoZXIuX3ZhbHVlcykKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICBpZiBzZWxmIGlzIG90aGVyOgorICAgICAgcmV0dXJuIFRydWUKKyAgICAjIFNvcnQgdW5rbm93biBmaWVsZHMgYmVjYXVzZSB0aGVpciBvcmRlciBzaG91bGRuJ3QKKyAgICAjIGFmZmVjdCBlcXVhbGl0eSB0ZXN0LgorICAgIHZhbHVlcyA9IGxpc3Qoc2VsZi5fdmFsdWVzKQorICAgIGlmIG90aGVyIGlzIE5vbmU6CisgICAgICByZXR1cm4gbm90IHZhbHVlcworICAgIHZhbHVlcy5zb3J0KCkKKyAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgb3RoZXJfdmFsdWVzID0gc29ydGVkKG90aGVyLl92YWx1ZXMpCisgICAgcmV0dXJuIHZhbHVlcyA9PSBvdGhlcl92YWx1ZXMKKworICBkZWYgX2NsZWFyKHNlbGYpOgorICAgIGZvciB2YWx1ZSBpbiBzZWxmLl92YWx1ZXM6CisgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLl9kYXRhLCBVbmtub3duRmllbGRTZXQpOgorICAgICAgICB2YWx1ZS5fZGF0YS5fY2xlYXIoKSAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgIHNlbGYuX3ZhbHVlcyA9IE5vbmUKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVjb2Rlci5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVjb2Rlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTE2Mjc2Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZWNvZGVyLnB5CkBAIC0wLDAgKzEsMTA2OCBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJDb2RlIGZvciBkZWNvZGluZyBwcm90b2NvbCBidWZmZXIgcHJpbWl0aXZlcy4KKworVGhpcyBjb2RlIGlzIHZlcnkgc2ltaWxhciB0byBlbmNvZGVyLnB5IC0tIHJlYWQgdGhlIGRvY3MgZm9yIHRoYXQgbW9kdWxlIGZpcnN0LgorCitBICJkZWNvZGVyIiBpcyBhIGZ1bmN0aW9uIHdpdGggdGhlIHNpZ25hdHVyZToKKyAgRGVjb2RlKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpCitUaGUgYXJndW1lbnRzIGFyZToKKyAgYnVmZmVyOiAgICAgVGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBlbmNvZGVkIG1lc3NhZ2UuCisgIHBvczogICAgICAgIFRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJpbmcuCisgIGVuZDogICAgICAgIFRoZSBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nIHdoZXJlIHRoZSBjdXJyZW50IG1lc3NhZ2UgZW5kcy4gIE1heSBiZQorICAgICAgICAgICAgICBsZXNzIHRoYW4gbGVuKGJ1ZmZlcikgaWYgd2UncmUgcmVhZGluZyBhIHN1Yi1tZXNzYWdlLgorICBtZXNzYWdlOiAgICBUaGUgbWVzc2FnZSBvYmplY3QgaW50byB3aGljaCB3ZSdyZSBwYXJzaW5nLgorICBmaWVsZF9kaWN0OiBtZXNzYWdlLl9maWVsZHMgKGF2b2lkcyBhIGhhc2h0YWJsZSBsb29rdXApLgorVGhlIGRlY29kZXIgcmVhZHMgdGhlIGZpZWxkIGFuZCBzdG9yZXMgaXQgaW50byBmaWVsZF9kaWN0LCByZXR1cm5pbmcgdGhlIG5ldworYnVmZmVyIHBvc2l0aW9uLiAgQSBkZWNvZGVyIGZvciBhIHJlcGVhdGVkIGZpZWxkIG1heSBwcm9hY3RpdmVseSBkZWNvZGUgYWxsIG9mCit0aGUgZWxlbWVudHMgb2YgdGhhdCBmaWVsZCwgaWYgdGhleSBhcHBlYXIgY29uc2VjdXRpdmVseS4KKworTm90ZSB0aGF0IGRlY29kZXJzIG1heSB0aHJvdyBhbnkgb2YgdGhlIGZvbGxvd2luZzoKKyAgSW5kZXhFcnJvcjogIEluZGljYXRlcyBhIHRydW5jYXRlZCBtZXNzYWdlLgorICBzdHJ1Y3QuZXJyb3I6ICBVbnBhY2tpbmcgb2YgYSBmaXhlZC13aWR0aCBmaWVsZCBmYWlsZWQuCisgIG1lc3NhZ2UuRGVjb2RlRXJyb3I6ICBPdGhlciBlcnJvcnMuCisKK0RlY29kZXJzIGFyZSBleHBlY3RlZCB0byByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhleSBhcmUgY2FsbGVkIHdpdGggcG9zID4gZW5kLgorVGhpcyBhbGxvd3MgY2FsbGVycyB0byBiZSBsYXggYWJvdXQgYm91bmRzIGNoZWNraW5nOiAgaXQncyBmaW5ldG8gcmVhZCBwYXN0CisiZW5kIiBhcyBsb25nIGFzIHlvdSBhcmUgc3VyZSB0aGF0IHNvbWVvbmUgZWxzZSB3aWxsIG5vdGljZSBhbmQgdGhyb3cgYW4KK2V4Y2VwdGlvbiBsYXRlciBvbi4KKworU29tZXRoaW5nIHVwIHRoZSBjYWxsIHN0YWNrIGlzIGV4cGVjdGVkIHRvIGNhdGNoIEluZGV4RXJyb3IgYW5kIHN0cnVjdC5lcnJvcgorYW5kIGNvbnZlcnQgdGhlbSB0byBtZXNzYWdlLkRlY29kZUVycm9yLgorCitEZWNvZGVycyBhcmUgY29uc3RydWN0ZWQgdXNpbmcgZGVjb2RlciBjb25zdHJ1Y3RvcnMgd2l0aCB0aGUgc2lnbmF0dXJlOgorICBNYWtlRGVjb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQsIGtleSwgbmV3X2RlZmF1bHQpCitUaGUgYXJndW1lbnRzIGFyZToKKyAgZmllbGRfbnVtYmVyOiAgVGhlIGZpZWxkIG51bWJlciBvZiB0aGUgZmllbGQgd2Ugd2FudCB0byBkZWNvZGUuCisgIGlzX3JlcGVhdGVkOiAgIElzIHRoZSBmaWVsZCBhIHJlcGVhdGVkIGZpZWxkPyAoYm9vbCkKKyAgaXNfcGFja2VkOiAgICAgSXMgdGhlIGZpZWxkIGEgcGFja2VkIGZpZWxkPyAoYm9vbCkKKyAga2V5OiAgICAgICAgICAgVGhlIGtleSB0byB1c2Ugd2hlbiBsb29raW5nIHVwIHRoZSBmaWVsZCB3aXRoaW4gZmllbGRfZGljdC4KKyAgICAgICAgICAgICAgICAgKFRoaXMgaXMgYWN0dWFsbHkgdGhlIEZpZWxkRGVzY3JpcHRvciBidXQgbm90aGluZyBpbiB0aGlzCisgICAgICAgICAgICAgICAgIGZpbGUgc2hvdWxkIGRlcGVuZCBvbiB0aGF0LikKKyAgbmV3X2RlZmF1bHQ6ICAgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyBhIG1lc3NhZ2Ugb2JqZWN0IGFzIGEgcGFyYW1ldGVyIGFuZAorICAgICAgICAgICAgICAgICByZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGZpZWxkLgorICAgICAgICAgICAgICAgICAoVGhpcyBpcyBjYWxsZWQgZm9yIHJlcGVhdGVkIGZpZWxkcyBhbmQgc3ViLW1lc3NhZ2VzLCB3aGVuIGFuCisgICAgICAgICAgICAgICAgIGluc3RhbmNlIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuKQorCitBcyB3aXRoIGVuY29kZXJzLCB3ZSBkZWZpbmUgYSBkZWNvZGVyIGNvbnN0cnVjdG9yIGZvciBldmVyeSB0eXBlIG9mIGZpZWxkLgorVGhlbiwgZm9yIGV2ZXJ5IGZpZWxkIG9mIGV2ZXJ5IG1lc3NhZ2UgY2xhc3Mgd2UgY29uc3RydWN0IGFuIGFjdHVhbCBkZWNvZGVyLgorVGhhdCBkZWNvZGVyIGdvZXMgaW50byBhIGRpY3QgaW5kZXhlZCBieSB0YWcsIHNvIHdoZW4gd2UgZGVjb2RlIGEgbWVzc2FnZQord2UgcmVwZWF0ZWRseSByZWFkIGEgdGFnLCBsb29rIHVwIHRoZSBjb3JyZXNwb25kaW5nIGRlY29kZXIsIGFuZCBpbnZva2UgaXQuCisiIiIKKworX19hdXRob3JfXyA9ICdrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKScKKworaW1wb3J0IG1hdGgKK2ltcG9ydCBzdHJ1Y3QKKworZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGNvbnRhaW5lcnMKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbmNvZGVyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlCisKKworIyBUaGlzIGlzIG5vdCBmb3Igb3B0aW1pemF0aW9uLCBidXQgcmF0aGVyIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIGxvY2FsCisjIHZhcmlhYmxlcyBuYW1lZCAibWVzc2FnZSIuCitfRGVjb2RlRXJyb3IgPSBtZXNzYWdlLkRlY29kZUVycm9yCisKKworZGVmIF9WYXJpbnREZWNvZGVyKG1hc2ssIHJlc3VsdF90eXBlKToKKyAgIiIiUmV0dXJuIGFuIGVuY29kZXIgZm9yIGEgYmFzaWMgdmFyaW50IHZhbHVlIChkb2VzIG5vdCBpbmNsdWRlIHRhZykuCisKKyAgRGVjb2RlZCB2YWx1ZXMgd2lsbCBiZSBiaXR3aXNlLWFuZGVkIHdpdGggdGhlIGdpdmVuIG1hc2sgYmVmb3JlIGJlaW5nCisgIHJldHVybmVkLCBlLmcuIHRvIGxpbWl0IHRoZW0gdG8gMzIgYml0cy4gIFRoZSByZXR1cm5lZCBkZWNvZGVyIGRvZXMgbm90CisgIHRha2UgdGhlIHVzdWFsICJlbmQiIHBhcmFtZXRlciAtLSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGRvIGJvdW5kcyBjaGVja2luZworICBhZnRlciB0aGUgZmFjdCAob2Z0ZW4gdGhlIGNhbGxlciBjYW4gZGVmZXIgc3VjaCBjaGVja2luZyB1bnRpbCBsYXRlcikuICBUaGUKKyAgZGVjb2RlciByZXR1cm5zIGEgKHZhbHVlLCBuZXdfcG9zKSBwYWlyLgorICAiIiIKKworICBkZWYgRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKToKKyAgICByZXN1bHQgPSAwCisgICAgc2hpZnQgPSAwCisgICAgd2hpbGUgMToKKyAgICAgIGIgPSBidWZmZXJbcG9zXQorICAgICAgcmVzdWx0IHw9ICgoYiAmIDB4N2YpIDw8IHNoaWZ0KQorICAgICAgcG9zICs9IDEKKyAgICAgIGlmIG5vdCAoYiAmIDB4ODApOgorICAgICAgICByZXN1bHQgJj0gbWFzaworICAgICAgICByZXN1bHQgPSByZXN1bHRfdHlwZShyZXN1bHQpCisgICAgICAgIHJldHVybiAocmVzdWx0LCBwb3MpCisgICAgICBzaGlmdCArPSA3CisgICAgICBpZiBzaGlmdCA+PSA2NDoKKyAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUb28gbWFueSBieXRlcyB3aGVuIGRlY29kaW5nIHZhcmludC4nKQorICByZXR1cm4gRGVjb2RlVmFyaW50CisKKworZGVmIF9TaWduZWRWYXJpbnREZWNvZGVyKGJpdHMsIHJlc3VsdF90eXBlKToKKyAgIiIiTGlrZSBfVmFyaW50RGVjb2RlcigpIGJ1dCBkZWNvZGVzIHNpZ25lZCB2YWx1ZXMuIiIiCisKKyAgc2lnbmJpdCA9IDEgPDwgKGJpdHMgLSAxKQorICBtYXNrID0gKDEgPDwgYml0cykgLSAxCisKKyAgZGVmIERlY29kZVZhcmludChidWZmZXIsIHBvcyk6CisgICAgcmVzdWx0ID0gMAorICAgIHNoaWZ0ID0gMAorICAgIHdoaWxlIDE6CisgICAgICBiID0gYnVmZmVyW3Bvc10KKyAgICAgIHJlc3VsdCB8PSAoKGIgJiAweDdmKSA8PCBzaGlmdCkKKyAgICAgIHBvcyArPSAxCisgICAgICBpZiBub3QgKGIgJiAweDgwKToKKyAgICAgICAgcmVzdWx0ICY9IG1hc2sKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCBeIHNpZ25iaXQpIC0gc2lnbmJpdAorICAgICAgICByZXN1bHQgPSByZXN1bHRfdHlwZShyZXN1bHQpCisgICAgICAgIHJldHVybiAocmVzdWx0LCBwb3MpCisgICAgICBzaGlmdCArPSA3CisgICAgICBpZiBzaGlmdCA+PSA2NDoKKyAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUb28gbWFueSBieXRlcyB3aGVuIGRlY29kaW5nIHZhcmludC4nKQorICByZXR1cm4gRGVjb2RlVmFyaW50CisKKyMgQWxsIDMyLWJpdCBhbmQgNjQtYml0IHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYXMgaW50LgorX0RlY29kZVZhcmludCA9IF9WYXJpbnREZWNvZGVyKCgxIDw8IDY0KSAtIDEsIGludCkKK19EZWNvZGVTaWduZWRWYXJpbnQgPSBfU2lnbmVkVmFyaW50RGVjb2Rlcig2NCwgaW50KQorCisjIFVzZSB0aGVzZSB2ZXJzaW9ucyBmb3IgdmFsdWVzIHdoaWNoIG11c3QgYmUgbGltaXRlZCB0byAzMiBiaXRzLgorX0RlY29kZVZhcmludDMyID0gX1ZhcmludERlY29kZXIoKDEgPDwgMzIpIC0gMSwgaW50KQorX0RlY29kZVNpZ25lZFZhcmludDMyID0gX1NpZ25lZFZhcmludERlY29kZXIoMzIsIGludCkKKworCitkZWYgUmVhZFRhZyhidWZmZXIsIHBvcyk6CisgICIiIlJlYWQgYSB0YWcgZnJvbSB0aGUgbWVtb3J5dmlldywgYW5kIHJldHVybiBhICh0YWdfYnl0ZXMsIG5ld19wb3MpIHR1cGxlLgorCisgIFdlIHJldHVybiB0aGUgcmF3IGJ5dGVzIG9mIHRoZSB0YWcgcmF0aGVyIHRoYW4gZGVjb2RpbmcgdGhlbS4gIFRoZSByYXcKKyAgYnl0ZXMgY2FuIHRoZW4gYmUgdXNlZCB0byBsb29rIHVwIHRoZSBwcm9wZXIgZGVjb2Rlci4gIFRoaXMgZWZmZWN0aXZlbHkgYWxsb3dzCisgIHVzIHRvIHRyYWRlIHNvbWUgd29yayB0aGF0IHdvdWxkIGJlIGRvbmUgaW4gcHVyZS1weXRob24gKGRlY29kaW5nIGEgdmFyaW50KQorICBmb3Igd29yayB0aGF0IGlzIGRvbmUgaW4gQyAoc2VhcmNoaW5nIGZvciBhIGJ5dGUgc3RyaW5nIGluIGEgaGFzaCB0YWJsZSkuCisgIEluIGEgbG93LWxldmVsIGxhbmd1YWdlIGl0IHdvdWxkIGJlIG11Y2ggY2hlYXBlciB0byBkZWNvZGUgdGhlIHZhcmludCBhbmQKKyAgdXNlIHRoYXQsIGJ1dCBub3QgaW4gUHl0aG9uLgorCisgIEFyZ3M6CisgICAgYnVmZmVyOiBtZW1vcnl2aWV3IG9iamVjdCBvZiB0aGUgZW5jb2RlZCBieXRlcworICAgIHBvczogaW50IG9mIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHN0YXJ0IGZyb20KKworICBSZXR1cm5zOgorICAgIFR1cGxlW2J5dGVzLCBpbnRdIG9mIHRoZSB0YWcgZGF0YSBhbmQgbmV3IHBvc2l0aW9uLgorICAiIiIKKyAgc3RhcnQgPSBwb3MKKyAgd2hpbGUgYnVmZmVyW3Bvc10gJiAweDgwOgorICAgIHBvcyArPSAxCisgIHBvcyArPSAxCisKKyAgdGFnX2J5dGVzID0gYnVmZmVyW3N0YXJ0OnBvc10udG9ieXRlcygpCisgIHJldHVybiB0YWdfYnl0ZXMsIHBvcworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitkZWYgX1NpbXBsZURlY29kZXIod2lyZV90eXBlLCBkZWNvZGVfdmFsdWUpOgorICAiIiJSZXR1cm4gYSBjb25zdHJ1Y3RvciBmb3IgYSBkZWNvZGVyIGZvciBmaWVsZHMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUuCisKKyAgQXJnczoKKyAgICAgIHdpcmVfdHlwZTogIFRoZSBmaWVsZCdzIHdpcmUgdHlwZS4KKyAgICAgIGRlY29kZV92YWx1ZTogIEEgZnVuY3Rpb24gd2hpY2ggZGVjb2RlcyBhbiBpbmRpdmlkdWFsIHZhbHVlLCBlLmcuCisgICAgICAgIF9EZWNvZGVWYXJpbnQoKQorICAiIiIKKworICBkZWYgU3BlY2lmaWNEZWNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCwga2V5LCBuZXdfZGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9pZl9kZWZhdWx0PUZhbHNlKToKKyAgICBpZiBpc19wYWNrZWQ6CisgICAgICBsb2NhbF9EZWNvZGVWYXJpbnQgPSBfRGVjb2RlVmFyaW50CisgICAgICBkZWYgRGVjb2RlUGFja2VkRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQorICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICAgIChlbmRwb2ludCwgcG9zKSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKKyAgICAgICAgZW5kcG9pbnQgKz0gcG9zCisgICAgICAgIGlmIGVuZHBvaW50ID4gZW5kOgorICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKKyAgICAgICAgd2hpbGUgcG9zIDwgZW5kcG9pbnQ6CisgICAgICAgICAgKGVsZW1lbnQsIHBvcykgPSBkZWNvZGVfdmFsdWUoYnVmZmVyLCBwb3MpCisgICAgICAgICAgdmFsdWUuYXBwZW5kKGVsZW1lbnQpCisgICAgICAgIGlmIHBvcyA+IGVuZHBvaW50OgorICAgICAgICAgIGRlbCB2YWx1ZVstMV0gICAjIERpc2NhcmQgY29ycnVwdCB2YWx1ZS4KKyAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1BhY2tlZCBlbGVtZW50IHdhcyB0cnVuY2F0ZWQuJykKKyAgICAgICAgcmV0dXJuIHBvcworICAgICAgcmV0dXJuIERlY29kZVBhY2tlZEZpZWxkCisgICAgZWxpZiBpc19yZXBlYXRlZDoKKyAgICAgIHRhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCisgICAgICB0YWdfbGVuID0gbGVuKHRhZ19ieXRlcykKKyAgICAgIGRlZiBEZWNvZGVSZXBlYXRlZEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgorICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKKyAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgIChlbGVtZW50LCBuZXdfcG9zKSA9IGRlY29kZV92YWx1ZShidWZmZXIsIHBvcykKKyAgICAgICAgICB2YWx1ZS5hcHBlbmQoZWxlbWVudCkKKyAgICAgICAgICAjIFByZWRpY3QgdGhhdCB0aGUgbmV4dCB0YWcgaXMgYW5vdGhlciBjb3B5IG9mIHRoZSBzYW1lIHJlcGVhdGVkCisgICAgICAgICAgIyBmaWVsZC4KKyAgICAgICAgICBwb3MgPSBuZXdfcG9zICsgdGFnX2xlbgorICAgICAgICAgIGlmIGJ1ZmZlcltuZXdfcG9zOnBvc10gIT0gdGFnX2J5dGVzIG9yIG5ld19wb3MgPj0gZW5kOgorICAgICAgICAgICAgIyBQcmVkaWN0aW9uIGZhaWxlZC4gIFJldHVybi4KKyAgICAgICAgICAgIGlmIG5ld19wb3MgPiBlbmQ6CisgICAgICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKKyAgICAgICAgICAgIHJldHVybiBuZXdfcG9zCisgICAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAorICAgIGVsc2U6CisgICAgICBkZWYgRGVjb2RlRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgICAgIChuZXdfdmFsdWUsIHBvcykgPSBkZWNvZGVfdmFsdWUoYnVmZmVyLCBwb3MpCisgICAgICAgIGlmIHBvcyA+IGVuZDoKKyAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCisgICAgICAgIGlmIGNsZWFyX2lmX2RlZmF1bHQgYW5kIG5vdCBuZXdfdmFsdWU6CisgICAgICAgICAgZmllbGRfZGljdC5wb3Aoa2V5LCBOb25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGZpZWxkX2RpY3Rba2V5XSA9IG5ld192YWx1ZQorICAgICAgICByZXR1cm4gcG9zCisgICAgICByZXR1cm4gRGVjb2RlRmllbGQKKworICByZXR1cm4gU3BlY2lmaWNEZWNvZGVyCisKKworZGVmIF9Nb2RpZmllZERlY29kZXIod2lyZV90eXBlLCBkZWNvZGVfdmFsdWUsIG1vZGlmeV92YWx1ZSk6CisgICIiIkxpa2UgU2ltcGxlRGVjb2RlciBidXQgYWRkaXRpb25hbGx5IGludm9rZXMgbW9kaWZ5X3ZhbHVlIG9uIGV2ZXJ5IHZhbHVlCisgIGJlZm9yZSBzdG9yaW5nIGl0LiAgVXN1YWxseSBtb2RpZnlfdmFsdWUgaXMgWmlnWmFnRGVjb2RlLgorICAiIiIKKworICAjIFJldXNpbmcgX1NpbXBsZURlY29kZXIgaXMgc2xpZ2h0bHkgc2xvd2VyIHRoYW4gY29weWluZyBhIGJ1bmNoIG9mIGNvZGUsIGJ1dAorICAjIG5vdCBlbm91Z2ggdG8gbWFrZSBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UuCisKKyAgZGVmIElubmVyRGVjb2RlKGJ1ZmZlciwgcG9zKToKKyAgICAocmVzdWx0LCBuZXdfcG9zKSA9IGRlY29kZV92YWx1ZShidWZmZXIsIHBvcykKKyAgICByZXR1cm4gKG1vZGlmeV92YWx1ZShyZXN1bHQpLCBuZXdfcG9zKQorICByZXR1cm4gX1NpbXBsZURlY29kZXIod2lyZV90eXBlLCBJbm5lckRlY29kZSkKKworCitkZWYgX1N0cnVjdFBhY2tEZWNvZGVyKHdpcmVfdHlwZSwgZm9ybWF0KToKKyAgIiIiUmV0dXJuIGEgY29uc3RydWN0b3IgZm9yIGEgZGVjb2RlciBmb3IgYSBmaXhlZC13aWR0aCBmaWVsZC4KKworICBBcmdzOgorICAgICAgd2lyZV90eXBlOiAgVGhlIGZpZWxkJ3Mgd2lyZSB0eXBlLgorICAgICAgZm9ybWF0OiAgVGhlIGZvcm1hdCBzdHJpbmcgdG8gcGFzcyB0byBzdHJ1Y3QudW5wYWNrKCkuCisgICIiIgorCisgIHZhbHVlX3NpemUgPSBzdHJ1Y3QuY2FsY3NpemUoZm9ybWF0KQorICBsb2NhbF91bnBhY2sgPSBzdHJ1Y3QudW5wYWNrCisKKyAgIyBSZXVzaW5nIF9TaW1wbGVEZWNvZGVyIGlzIHNsaWdodGx5IHNsb3dlciB0aGFuIGNvcHlpbmcgYSBidW5jaCBvZiBjb2RlLCBidXQKKyAgIyBub3QgZW5vdWdoIHRvIG1ha2UgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlLgorCisgICMgTm90ZSB0aGF0IHdlIGV4cGVjdCBzb21lb25lIHVwLXN0YWNrIHRvIGNhdGNoIHN0cnVjdC5lcnJvciBhbmQgY29udmVydAorICAjIGl0IHRvIF9EZWNvZGVFcnJvciAtLSB0aGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIHNldCB1cCBleGNlcHRpb24tCisgICMgaGFuZGxpbmcgYmxvY2tzIGV2ZXJ5IHRpbWUgd2UgcGFyc2Ugb25lIHZhbHVlLgorCisgIGRlZiBJbm5lckRlY29kZShidWZmZXIsIHBvcyk6CisgICAgbmV3X3BvcyA9IHBvcyArIHZhbHVlX3NpemUKKyAgICByZXN1bHQgPSBsb2NhbF91bnBhY2soZm9ybWF0LCBidWZmZXJbcG9zOm5ld19wb3NdKVswXQorICAgIHJldHVybiAocmVzdWx0LCBuZXdfcG9zKQorICByZXR1cm4gX1NpbXBsZURlY29kZXIod2lyZV90eXBlLCBJbm5lckRlY29kZSkKKworCitkZWYgX0Zsb2F0RGVjb2RlcigpOgorICAiIiJSZXR1cm5zIGEgZGVjb2RlciBmb3IgYSBmbG9hdCBmaWVsZC4KKworICBUaGlzIGNvZGUgd29ya3MgYXJvdW5kIGEgYnVnIGluIHN0cnVjdC51bnBhY2sgZm9yIG5vbi1maW5pdGUgMzItYml0CisgIGZsb2F0aW5nLXBvaW50IHZhbHVlcy4KKyAgIiIiCisKKyAgbG9jYWxfdW5wYWNrID0gc3RydWN0LnVucGFjaworCisgIGRlZiBJbm5lckRlY29kZShidWZmZXIsIHBvcyk6CisgICAgIiIiRGVjb2RlIHNlcmlhbGl6ZWQgZmxvYXQgdG8gYSBmbG9hdCBhbmQgbmV3IHBvc2l0aW9uLgorCisgICAgQXJnczoKKyAgICAgIGJ1ZmZlcjogbWVtb3J5dmlldyBvZiB0aGUgc2VyaWFsaXplZCBieXRlcworICAgICAgcG9zOiBpbnQsIHBvc2l0aW9uIGluIHRoZSBtZW1vcnkgdmlldyB0byBzdGFydCBhdC4KKworICAgIFJldHVybnM6CisgICAgICBUdXBsZVtmbG9hdCwgaW50XSBvZiB0aGUgZGVzZXJpYWxpemVkIGZsb2F0IHZhbHVlIGFuZCBuZXcgcG9zaXRpb24KKyAgICAgIGluIHRoZSBzZXJpYWxpemVkIGRhdGEuCisgICAgIiIiCisgICAgIyBXZSBleHBlY3QgYSAzMi1iaXQgdmFsdWUgaW4gbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyLiAgQml0IDEgaXMgdGhlIHNpZ24KKyAgICAjIGJpdCwgYml0cyAyLTkgcmVwcmVzZW50IHRoZSBleHBvbmVudCwgYW5kIGJpdHMgMTAtMzIgYXJlIHRoZSBzaWduaWZpY2FuZC4KKyAgICBuZXdfcG9zID0gcG9zICsgNAorICAgIGZsb2F0X2J5dGVzID0gYnVmZmVyW3BvczpuZXdfcG9zXS50b2J5dGVzKCkKKworICAgICMgSWYgdGhpcyB2YWx1ZSBoYXMgYWxsIGl0cyBleHBvbmVudCBiaXRzIHNldCwgdGhlbiBpdCdzIG5vbi1maW5pdGUuCisgICAgIyBJbiBQeXRob24gMi40LCBzdHJ1Y3QudW5wYWNrIHdpbGwgY29udmVydCBpdCB0byBhIGZpbml0ZSA2NC1iaXQgdmFsdWUuCisgICAgIyBUbyBhdm9pZCB0aGF0LCB3ZSBwYXJzZSBpdCBzcGVjaWFsbHkuCisgICAgaWYgKGZsb2F0X2J5dGVzWzM6NF0gaW4gYidceDdGXHhGRicgYW5kIGZsb2F0X2J5dGVzWzI6M10gPj0gYidceDgwJyk6CisgICAgICAjIElmIGF0IGxlYXN0IG9uZSBzaWduaWZpY2FuZCBiaXQgaXMgc2V0Li4uCisgICAgICBpZiBmbG9hdF9ieXRlc1swOjNdICE9IGInXHgwMFx4MDBceDgwJzoKKyAgICAgICAgcmV0dXJuIChtYXRoLm5hbiwgbmV3X3BvcykKKyAgICAgICMgSWYgc2lnbiBiaXQgaXMgc2V0Li4uCisgICAgICBpZiBmbG9hdF9ieXRlc1szOjRdID09IGInXHhGRic6CisgICAgICAgIHJldHVybiAoLW1hdGguaW5mLCBuZXdfcG9zKQorICAgICAgcmV0dXJuIChtYXRoLmluZiwgbmV3X3BvcykKKworICAgICMgTm90ZSB0aGF0IHdlIGV4cGVjdCBzb21lb25lIHVwLXN0YWNrIHRvIGNhdGNoIHN0cnVjdC5lcnJvciBhbmQgY29udmVydAorICAgICMgaXQgdG8gX0RlY29kZUVycm9yIC0tIHRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gc2V0IHVwIGV4Y2VwdGlvbi0KKyAgICAjIGhhbmRsaW5nIGJsb2NrcyBldmVyeSB0aW1lIHdlIHBhcnNlIG9uZSB2YWx1ZS4KKyAgICByZXN1bHQgPSBsb2NhbF91bnBhY2soJzxmJywgZmxvYXRfYnl0ZXMpWzBdCisgICAgcmV0dXJuIChyZXN1bHQsIG5ld19wb3MpCisgIHJldHVybiBfU2ltcGxlRGVjb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLCBJbm5lckRlY29kZSkKKworCitkZWYgX0RvdWJsZURlY29kZXIoKToKKyAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgZG91YmxlIGZpZWxkLgorCisgIFRoaXMgY29kZSB3b3JrcyBhcm91bmQgYSBidWcgaW4gc3RydWN0LnVucGFjayBmb3Igbm90LWEtbnVtYmVyLgorICAiIiIKKworICBsb2NhbF91bnBhY2sgPSBzdHJ1Y3QudW5wYWNrCisKKyAgZGVmIElubmVyRGVjb2RlKGJ1ZmZlciwgcG9zKToKKyAgICAiIiJEZWNvZGUgc2VyaWFsaXplZCBkb3VibGUgdG8gYSBkb3VibGUgYW5kIG5ldyBwb3NpdGlvbi4KKworICAgIEFyZ3M6CisgICAgICBidWZmZXI6IG1lbW9yeXZpZXcgb2YgdGhlIHNlcmlhbGl6ZWQgYnl0ZXMuCisgICAgICBwb3M6IGludCwgcG9zaXRpb24gaW4gdGhlIG1lbW9yeSB2aWV3IHRvIHN0YXJ0IGF0LgorCisgICAgUmV0dXJuczoKKyAgICAgIFR1cGxlW2Zsb2F0LCBpbnRdIG9mIHRoZSBkZWNvZGVkIGRvdWJsZSB2YWx1ZSBhbmQgbmV3IHBvc2l0aW9uCisgICAgICBpbiB0aGUgc2VyaWFsaXplZCBkYXRhLgorICAgICIiIgorICAgICMgV2UgZXhwZWN0IGEgNjQtYml0IHZhbHVlIGluIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlci4gIEJpdCAxIGlzIHRoZSBzaWduCisgICAgIyBiaXQsIGJpdHMgMi0xMiByZXByZXNlbnQgdGhlIGV4cG9uZW50LCBhbmQgYml0cyAxMy02NCBhcmUgdGhlIHNpZ25pZmljYW5kLgorICAgIG5ld19wb3MgPSBwb3MgKyA4CisgICAgZG91YmxlX2J5dGVzID0gYnVmZmVyW3BvczpuZXdfcG9zXS50b2J5dGVzKCkKKworICAgICMgSWYgdGhpcyB2YWx1ZSBoYXMgYWxsIGl0cyBleHBvbmVudCBiaXRzIHNldCBhbmQgYXQgbGVhc3Qgb25lIHNpZ25pZmljYW5kCisgICAgIyBiaXQgc2V0LCBpdCdzIG5vdCBhIG51bWJlci4gIEluIFB5dGhvbiAyLjQsIHN0cnVjdC51bnBhY2sgd2lsbCB0cmVhdCBpdAorICAgICMgYXMgaW5mIG9yIC1pbmYuICBUbyBhdm9pZCB0aGF0LCB3ZSB0cmVhdCBpdCBzcGVjaWFsbHkuCisgICAgaWYgKChkb3VibGVfYnl0ZXNbNzo4XSBpbiBiJ1x4N0ZceEZGJykKKyAgICAgICAgYW5kIChkb3VibGVfYnl0ZXNbNjo3XSA+PSBiJ1x4RjAnKQorICAgICAgICBhbmQgKGRvdWJsZV9ieXRlc1swOjddICE9IGInXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMCcpKToKKyAgICAgIHJldHVybiAobWF0aC5uYW4sIG5ld19wb3MpCisKKyAgICAjIE5vdGUgdGhhdCB3ZSBleHBlY3Qgc29tZW9uZSB1cC1zdGFjayB0byBjYXRjaCBzdHJ1Y3QuZXJyb3IgYW5kIGNvbnZlcnQKKyAgICAjIGl0IHRvIF9EZWNvZGVFcnJvciAtLSB0aGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIHNldCB1cCBleGNlcHRpb24tCisgICAgIyBoYW5kbGluZyBibG9ja3MgZXZlcnkgdGltZSB3ZSBwYXJzZSBvbmUgdmFsdWUuCisgICAgcmVzdWx0ID0gbG9jYWxfdW5wYWNrKCc8ZCcsIGRvdWJsZV9ieXRlcylbMF0KKyAgICByZXR1cm4gKHJlc3VsdCwgbmV3X3BvcykKKyAgcmV0dXJuIF9TaW1wbGVEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsIElubmVyRGVjb2RlKQorCisKK2RlZiBFbnVtRGVjb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQsIGtleSwgbmV3X2RlZmF1bHQsCisgICAgICAgICAgICAgICAgY2xlYXJfaWZfZGVmYXVsdD1GYWxzZSk6CisgICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBlbnVtIGZpZWxkLiIiIgorICBlbnVtX3R5cGUgPSBrZXkuZW51bV90eXBlCisgIGlmIGlzX3BhY2tlZDoKKyAgICBsb2NhbF9EZWNvZGVWYXJpbnQgPSBfRGVjb2RlVmFyaW50CisgICAgZGVmIERlY29kZVBhY2tlZEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgorICAgICAgIiIiRGVjb2RlIHNlcmlhbGl6ZWQgcGFja2VkIGVudW0gdG8gaXRzIHZhbHVlIGFuZCBhIG5ldyBwb3NpdGlvbi4KKworICAgICAgQXJnczoKKyAgICAgICAgYnVmZmVyOiBtZW1vcnl2aWV3IG9mIHRoZSBzZXJpYWxpemVkIGJ5dGVzLgorICAgICAgICBwb3M6IGludCwgcG9zaXRpb24gaW4gdGhlIG1lbW9yeSB2aWV3IHRvIHN0YXJ0IGF0LgorICAgICAgICBlbmQ6IGludCwgZW5kIHBvc2l0aW9uIG9mIHNlcmlhbGl6ZWQgZGF0YQorICAgICAgICBtZXNzYWdlOiBNZXNzYWdlIG9iamVjdCB0byBzdG9yZSB1bmtub3duIGZpZWxkcyBpbgorICAgICAgICBmaWVsZF9kaWN0OiBNYXBbRGVzY3JpcHRvciwgQW55XSB0byBzdG9yZSBkZWNvZGVkIHZhbHVlcyBpbi4KKworICAgICAgUmV0dXJuczoKKyAgICAgICAgaW50LCBuZXcgcG9zaXRpb24gaW4gc2VyaWFsaXplZCBkYXRhLgorICAgICAgIiIiCisgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKKyAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICAoZW5kcG9pbnQsIHBvcykgPSBsb2NhbF9EZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpCisgICAgICBlbmRwb2ludCArPSBwb3MKKyAgICAgIGlmIGVuZHBvaW50ID4gZW5kOgorICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCisgICAgICB3aGlsZSBwb3MgPCBlbmRwb2ludDoKKyAgICAgICAgdmFsdWVfc3RhcnRfcG9zID0gcG9zCisgICAgICAgIChlbGVtZW50LCBwb3MpID0gX0RlY29kZVNpZ25lZFZhcmludDMyKGJ1ZmZlciwgcG9zKQorICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgIGlmIGVsZW1lbnQgaW4gZW51bV90eXBlLnZhbHVlc19ieV9udW1iZXI6CisgICAgICAgICAgdmFsdWUuYXBwZW5kKGVsZW1lbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaWYgbm90IG1lc3NhZ2UuX3Vua25vd25fZmllbGRzOgorICAgICAgICAgICAgbWVzc2FnZS5fdW5rbm93bl9maWVsZHMgPSBbXQorICAgICAgICAgIHRhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKQorCisgICAgICAgICAgbWVzc2FnZS5fdW5rbm93bl9maWVsZHMuYXBwZW5kKAorICAgICAgICAgICAgICAodGFnX2J5dGVzLCBidWZmZXJbdmFsdWVfc3RhcnRfcG9zOnBvc10udG9ieXRlcygpKSkKKyAgICAgICAgICBpZiBtZXNzYWdlLl91bmtub3duX2ZpZWxkX3NldCBpcyBOb25lOgorICAgICAgICAgICAgbWVzc2FnZS5fdW5rbm93bl9maWVsZF9zZXQgPSBjb250YWluZXJzLlVua25vd25GaWVsZFNldCgpCisgICAgICAgICAgbWVzc2FnZS5fdW5rbm93bl9maWVsZF9zZXQuX2FkZCgKKyAgICAgICAgICAgICAgZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIGVsZW1lbnQpCisgICAgICAgICAgIyBweWxpbnQ6IGVuYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICBpZiBwb3MgPiBlbmRwb2ludDoKKyAgICAgICAgaWYgZWxlbWVudCBpbiBlbnVtX3R5cGUudmFsdWVzX2J5X251bWJlcjoKKyAgICAgICAgICBkZWwgdmFsdWVbLTFdICAgIyBEaXNjYXJkIGNvcnJ1cHQgdmFsdWUuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgZGVsIG1lc3NhZ2UuX3Vua25vd25fZmllbGRzWy0xXQorICAgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgICBkZWwgbWVzc2FnZS5fdW5rbm93bl9maWVsZF9zZXQuX3ZhbHVlc1stMV0KKyAgICAgICAgICAjIHB5bGludDogZW5hYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdQYWNrZWQgZWxlbWVudCB3YXMgdHJ1bmNhdGVkLicpCisgICAgICByZXR1cm4gcG9zCisgICAgcmV0dXJuIERlY29kZVBhY2tlZEZpZWxkCisgIGVsaWYgaXNfcmVwZWF0ZWQ6CisgICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCkKKyAgICB0YWdfbGVuID0gbGVuKHRhZ19ieXRlcykKKyAgICBkZWYgRGVjb2RlUmVwZWF0ZWRGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgICIiIkRlY29kZSBzZXJpYWxpemVkIHJlcGVhdGVkIGVudW0gdG8gaXRzIHZhbHVlIGFuZCBhIG5ldyBwb3NpdGlvbi4KKworICAgICAgQXJnczoKKyAgICAgICAgYnVmZmVyOiBtZW1vcnl2aWV3IG9mIHRoZSBzZXJpYWxpemVkIGJ5dGVzLgorICAgICAgICBwb3M6IGludCwgcG9zaXRpb24gaW4gdGhlIG1lbW9yeSB2aWV3IHRvIHN0YXJ0IGF0LgorICAgICAgICBlbmQ6IGludCwgZW5kIHBvc2l0aW9uIG9mIHNlcmlhbGl6ZWQgZGF0YQorICAgICAgICBtZXNzYWdlOiBNZXNzYWdlIG9iamVjdCB0byBzdG9yZSB1bmtub3duIGZpZWxkcyBpbgorICAgICAgICBmaWVsZF9kaWN0OiBNYXBbRGVzY3JpcHRvciwgQW55XSB0byBzdG9yZSBkZWNvZGVkIHZhbHVlcyBpbi4KKworICAgICAgUmV0dXJuczoKKyAgICAgICAgaW50LCBuZXcgcG9zaXRpb24gaW4gc2VyaWFsaXplZCBkYXRhLgorICAgICAgIiIiCisgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKKyAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICB3aGlsZSAxOgorICAgICAgICAoZWxlbWVudCwgbmV3X3BvcykgPSBfRGVjb2RlU2lnbmVkVmFyaW50MzIoYnVmZmVyLCBwb3MpCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgaWYgZWxlbWVudCBpbiBlbnVtX3R5cGUudmFsdWVzX2J5X251bWJlcjoKKyAgICAgICAgICB2YWx1ZS5hcHBlbmQoZWxlbWVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpZiBub3QgbWVzc2FnZS5fdW5rbm93bl9maWVsZHM6CisgICAgICAgICAgICBtZXNzYWdlLl91bmtub3duX2ZpZWxkcyA9IFtdCisgICAgICAgICAgbWVzc2FnZS5fdW5rbm93bl9maWVsZHMuYXBwZW5kKAorICAgICAgICAgICAgICAodGFnX2J5dGVzLCBidWZmZXJbcG9zOm5ld19wb3NdLnRvYnl0ZXMoKSkpCisgICAgICAgICAgaWYgbWVzc2FnZS5fdW5rbm93bl9maWVsZF9zZXQgaXMgTm9uZToKKyAgICAgICAgICAgIG1lc3NhZ2UuX3Vua25vd25fZmllbGRfc2V0ID0gY29udGFpbmVycy5Vbmtub3duRmllbGRTZXQoKQorICAgICAgICAgIG1lc3NhZ2UuX3Vua25vd25fZmllbGRfc2V0Ll9hZGQoCisgICAgICAgICAgICAgIGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBlbGVtZW50KQorICAgICAgICAjIHB5bGludDogZW5hYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgIyBQcmVkaWN0IHRoYXQgdGhlIG5leHQgdGFnIGlzIGFub3RoZXIgY29weSBvZiB0aGUgc2FtZSByZXBlYXRlZAorICAgICAgICAjIGZpZWxkLgorICAgICAgICBwb3MgPSBuZXdfcG9zICsgdGFnX2xlbgorICAgICAgICBpZiBidWZmZXJbbmV3X3Bvczpwb3NdICE9IHRhZ19ieXRlcyBvciBuZXdfcG9zID49IGVuZDoKKyAgICAgICAgICAjIFByZWRpY3Rpb24gZmFpbGVkLiAgUmV0dXJuLgorICAgICAgICAgIGlmIG5ld19wb3MgPiBlbmQ6CisgICAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCisgICAgICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgICIiIkRlY29kZSBzZXJpYWxpemVkIHJlcGVhdGVkIGVudW0gdG8gaXRzIHZhbHVlIGFuZCBhIG5ldyBwb3NpdGlvbi4KKworICAgICAgQXJnczoKKyAgICAgICAgYnVmZmVyOiBtZW1vcnl2aWV3IG9mIHRoZSBzZXJpYWxpemVkIGJ5dGVzLgorICAgICAgICBwb3M6IGludCwgcG9zaXRpb24gaW4gdGhlIG1lbW9yeSB2aWV3IHRvIHN0YXJ0IGF0LgorICAgICAgICBlbmQ6IGludCwgZW5kIHBvc2l0aW9uIG9mIHNlcmlhbGl6ZWQgZGF0YQorICAgICAgICBtZXNzYWdlOiBNZXNzYWdlIG9iamVjdCB0byBzdG9yZSB1bmtub3duIGZpZWxkcyBpbgorICAgICAgICBmaWVsZF9kaWN0OiBNYXBbRGVzY3JpcHRvciwgQW55XSB0byBzdG9yZSBkZWNvZGVkIHZhbHVlcyBpbi4KKworICAgICAgUmV0dXJuczoKKyAgICAgICAgaW50LCBuZXcgcG9zaXRpb24gaW4gc2VyaWFsaXplZCBkYXRhLgorICAgICAgIiIiCisgICAgICB2YWx1ZV9zdGFydF9wb3MgPSBwb3MKKyAgICAgIChlbnVtX3ZhbHVlLCBwb3MpID0gX0RlY29kZVNpZ25lZFZhcmludDMyKGJ1ZmZlciwgcG9zKQorICAgICAgaWYgcG9zID4gZW5kOgorICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCisgICAgICBpZiBjbGVhcl9pZl9kZWZhdWx0IGFuZCBub3QgZW51bV92YWx1ZToKKyAgICAgICAgZmllbGRfZGljdC5wb3Aoa2V5LCBOb25lKQorICAgICAgICByZXR1cm4gcG9zCisgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICBpZiBlbnVtX3ZhbHVlIGluIGVudW1fdHlwZS52YWx1ZXNfYnlfbnVtYmVyOgorICAgICAgICBmaWVsZF9kaWN0W2tleV0gPSBlbnVtX3ZhbHVlCisgICAgICBlbHNlOgorICAgICAgICBpZiBub3QgbWVzc2FnZS5fdW5rbm93bl9maWVsZHM6CisgICAgICAgICAgbWVzc2FnZS5fdW5rbm93bl9maWVsZHMgPSBbXQorICAgICAgICB0YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpCisgICAgICAgIG1lc3NhZ2UuX3Vua25vd25fZmllbGRzLmFwcGVuZCgKKyAgICAgICAgICAgICh0YWdfYnl0ZXMsIGJ1ZmZlclt2YWx1ZV9zdGFydF9wb3M6cG9zXS50b2J5dGVzKCkpKQorICAgICAgICBpZiBtZXNzYWdlLl91bmtub3duX2ZpZWxkX3NldCBpcyBOb25lOgorICAgICAgICAgIG1lc3NhZ2UuX3Vua25vd25fZmllbGRfc2V0ID0gY29udGFpbmVycy5Vbmtub3duRmllbGRTZXQoKQorICAgICAgICBtZXNzYWdlLl91bmtub3duX2ZpZWxkX3NldC5fYWRkKAorICAgICAgICAgICAgZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIGVudW1fdmFsdWUpCisgICAgICAgICMgcHlsaW50OiBlbmFibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgcmV0dXJuIHBvcworICAgIHJldHVybiBEZWNvZGVGaWVsZAorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitJbnQzMkRlY29kZXIgPSBfU2ltcGxlRGVjb2RlcigKKyAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9EZWNvZGVTaWduZWRWYXJpbnQzMikKKworSW50NjREZWNvZGVyID0gX1NpbXBsZURlY29kZXIoCisgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRGVjb2RlU2lnbmVkVmFyaW50KQorCitVSW50MzJEZWNvZGVyID0gX1NpbXBsZURlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRGVjb2RlVmFyaW50MzIpCitVSW50NjREZWNvZGVyID0gX1NpbXBsZURlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRGVjb2RlVmFyaW50KQorCitTSW50MzJEZWNvZGVyID0gX01vZGlmaWVkRGVjb2RlcigKKyAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9EZWNvZGVWYXJpbnQzMiwgd2lyZV9mb3JtYXQuWmlnWmFnRGVjb2RlKQorU0ludDY0RGVjb2RlciA9IF9Nb2RpZmllZERlY29kZXIoCisgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRGVjb2RlVmFyaW50LCB3aXJlX2Zvcm1hdC5aaWdaYWdEZWNvZGUpCisKKyMgTm90ZSB0aGF0IFB5dGhvbiBjb252ZW5pZW50bHkgZ3VhcmFudGVlcyB0aGF0IHdoZW4gdXNpbmcgdGhlICc8JyBwcmVmaXggb24KKyMgZm9ybWF0cywgdGhleSB3aWxsIGFsc28gaGF2ZSB0aGUgc2FtZSBzaXplIGFjcm9zcyBhbGwgcGxhdGZvcm1zIChhcyBvcHBvc2VkCisjIHRvIHdpdGhvdXQgdGhlIHByZWZpeCwgd2hlcmUgdGhlaXIgc2l6ZXMgZGVwZW5kIG9uIHRoZSBDIGNvbXBpbGVyJ3MgYmFzaWMKKyMgdHlwZSBzaXplcykuCitGaXhlZDMyRGVjb2RlciAgPSBfU3RydWN0UGFja0RlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwgJzxJJykKK0ZpeGVkNjREZWNvZGVyICA9IF9TdHJ1Y3RQYWNrRGVjb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDY0LCAnPFEnKQorU0ZpeGVkMzJEZWNvZGVyID0gX1N0cnVjdFBhY2tEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsICc8aScpCitTRml4ZWQ2NERlY29kZXIgPSBfU3RydWN0UGFja0RlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwgJzxxJykKK0Zsb2F0RGVjb2RlciA9IF9GbG9hdERlY29kZXIoKQorRG91YmxlRGVjb2RlciA9IF9Eb3VibGVEZWNvZGVyKCkKKworQm9vbERlY29kZXIgPSBfTW9kaWZpZWREZWNvZGVyKAorICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0RlY29kZVZhcmludCwgYm9vbCkKKworCitkZWYgU3RyaW5nRGVjb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQsIGtleSwgbmV3X2RlZmF1bHQsCisgICAgICAgICAgICAgICAgICBjbGVhcl9pZl9kZWZhdWx0PUZhbHNlKToKKyAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgc3RyaW5nIGZpZWxkLiIiIgorCisgIGxvY2FsX0RlY29kZVZhcmludCA9IF9EZWNvZGVWYXJpbnQKKworICBkZWYgX0NvbnZlcnRUb1VuaWNvZGUobWVtdmlldyk6CisgICAgIiIiQ29udmVydCBieXRlIHRvIHVuaWNvZGUuIiIiCisgICAgYnl0ZV9zdHIgPSBtZW12aWV3LnRvYnl0ZXMoKQorICAgIHRyeToKKyAgICAgIHZhbHVlID0gc3RyKGJ5dGVfc3RyLCAndXRmLTgnKQorICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3IgYXMgZToKKyAgICAgICMgYWRkIG1vcmUgaW5mb3JtYXRpb24gdG8gdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHJlLXJhaXNlIGl0LgorICAgICAgZS5yZWFzb24gPSAnJXMgaW4gZmllbGQ6ICVzJyAlIChlLCBrZXkuZnVsbF9uYW1lKQorICAgICAgcmFpc2UKKworICAgIHJldHVybiB2YWx1ZQorCisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIHRhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgICB0YWdfbGVuID0gbGVuKHRhZ19ieXRlcykKKyAgICBkZWYgRGVjb2RlUmVwZWF0ZWRGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQorICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKKyAgICAgIHdoaWxlIDE6CisgICAgICAgIChzaXplLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICAgICAgICBuZXdfcG9zID0gcG9zICsgc2l6ZQorICAgICAgICBpZiBuZXdfcG9zID4gZW5kOgorICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIHN0cmluZy4nKQorICAgICAgICB2YWx1ZS5hcHBlbmQoX0NvbnZlcnRUb1VuaWNvZGUoYnVmZmVyW3BvczpuZXdfcG9zXSkpCisgICAgICAgICMgUHJlZGljdCB0aGF0IHRoZSBuZXh0IHRhZyBpcyBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgcmVwZWF0ZWQgZmllbGQuCisgICAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCisgICAgICAgIGlmIGJ1ZmZlcltuZXdfcG9zOnBvc10gIT0gdGFnX2J5dGVzIG9yIG5ld19wb3MgPT0gZW5kOgorICAgICAgICAgICMgUHJlZGljdGlvbiBmYWlsZWQuICBSZXR1cm4uCisgICAgICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgIChzaXplLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKKyAgICAgIGlmIG5ld19wb3MgPiBlbmQ6CisgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIHN0cmluZy4nKQorICAgICAgaWYgY2xlYXJfaWZfZGVmYXVsdCBhbmQgbm90IHNpemU6CisgICAgICAgIGZpZWxkX2RpY3QucG9wKGtleSwgTm9uZSkKKyAgICAgIGVsc2U6CisgICAgICAgIGZpZWxkX2RpY3Rba2V5XSA9IF9Db252ZXJ0VG9Vbmljb2RlKGJ1ZmZlcltwb3M6bmV3X3Bvc10pCisgICAgICByZXR1cm4gbmV3X3BvcworICAgIHJldHVybiBEZWNvZGVGaWVsZAorCisKK2RlZiBCeXRlc0RlY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLCBrZXksIG5ld19kZWZhdWx0LAorICAgICAgICAgICAgICAgICBjbGVhcl9pZl9kZWZhdWx0PUZhbHNlKToKKyAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgYnl0ZXMgZmllbGQuIiIiCisKKyAgbG9jYWxfRGVjb2RlVmFyaW50ID0gX0RlY29kZVZhcmludAorCisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIHRhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgICB0YWdfbGVuID0gbGVuKHRhZ19ieXRlcykKKyAgICBkZWYgRGVjb2RlUmVwZWF0ZWRGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQorICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKKyAgICAgIHdoaWxlIDE6CisgICAgICAgIChzaXplLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICAgICAgICBuZXdfcG9zID0gcG9zICsgc2l6ZQorICAgICAgICBpZiBuZXdfcG9zID4gZW5kOgorICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIHN0cmluZy4nKQorICAgICAgICB2YWx1ZS5hcHBlbmQoYnVmZmVyW3BvczpuZXdfcG9zXS50b2J5dGVzKCkpCisgICAgICAgICMgUHJlZGljdCB0aGF0IHRoZSBuZXh0IHRhZyBpcyBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgcmVwZWF0ZWQgZmllbGQuCisgICAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCisgICAgICAgIGlmIGJ1ZmZlcltuZXdfcG9zOnBvc10gIT0gdGFnX2J5dGVzIG9yIG5ld19wb3MgPT0gZW5kOgorICAgICAgICAgICMgUHJlZGljdGlvbiBmYWlsZWQuICBSZXR1cm4uCisgICAgICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgIChzaXplLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKKyAgICAgIGlmIG5ld19wb3MgPiBlbmQ6CisgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIHN0cmluZy4nKQorICAgICAgaWYgY2xlYXJfaWZfZGVmYXVsdCBhbmQgbm90IHNpemU6CisgICAgICAgIGZpZWxkX2RpY3QucG9wKGtleSwgTm9uZSkKKyAgICAgIGVsc2U6CisgICAgICAgIGZpZWxkX2RpY3Rba2V5XSA9IGJ1ZmZlcltwb3M6bmV3X3Bvc10udG9ieXRlcygpCisgICAgICByZXR1cm4gbmV3X3BvcworICAgIHJldHVybiBEZWNvZGVGaWVsZAorCisKK2RlZiBHcm91cERlY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLCBrZXksIG5ld19kZWZhdWx0KToKKyAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgZ3JvdXAgZmllbGQuIiIiCisKKyAgZW5kX3RhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApCisgIGVuZF90YWdfbGVuID0gbGVuKGVuZF90YWdfYnl0ZXMpCisKKyAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKKyAgaWYgaXNfcmVwZWF0ZWQ6CisgICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUCkKKyAgICB0YWdfbGVuID0gbGVuKHRhZ19ieXRlcykKKyAgICBkZWYgRGVjb2RlUmVwZWF0ZWRGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQorICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKKyAgICAgIHdoaWxlIDE6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQorICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICAgICMgUmVhZCBzdWItbWVzc2FnZS4KKyAgICAgICAgcG9zID0gdmFsdWUuYWRkKCkuX0ludGVybmFsUGFyc2UoYnVmZmVyLCBwb3MsIGVuZCkKKyAgICAgICAgIyBSZWFkIGVuZCB0YWcuCisgICAgICAgIG5ld19wb3MgPSBwb3MrZW5kX3RhZ19sZW4KKyAgICAgICAgaWYgYnVmZmVyW3BvczpuZXdfcG9zXSAhPSBlbmRfdGFnX2J5dGVzIG9yIG5ld19wb3MgPiBlbmQ6CisgICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdNaXNzaW5nIGdyb3VwIGVuZCB0YWcuJykKKyAgICAgICAgIyBQcmVkaWN0IHRoYXQgdGhlIG5leHQgdGFnIGlzIGFub3RoZXIgY29weSBvZiB0aGUgc2FtZSByZXBlYXRlZCBmaWVsZC4KKyAgICAgICAgcG9zID0gbmV3X3BvcyArIHRhZ19sZW4KKyAgICAgICAgaWYgYnVmZmVyW25ld19wb3M6cG9zXSAhPSB0YWdfYnl0ZXMgb3IgbmV3X3BvcyA9PSBlbmQ6CisgICAgICAgICAgIyBQcmVkaWN0aW9uIGZhaWxlZC4gIFJldHVybi4KKyAgICAgICAgICByZXR1cm4gbmV3X3BvcworICAgIHJldHVybiBEZWNvZGVSZXBlYXRlZEZpZWxkCisgIGVsc2U6CisgICAgZGVmIERlY29kZUZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgorICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCisgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQorICAgICAgIyBSZWFkIHN1Yi1tZXNzYWdlLgorICAgICAgcG9zID0gdmFsdWUuX0ludGVybmFsUGFyc2UoYnVmZmVyLCBwb3MsIGVuZCkKKyAgICAgICMgUmVhZCBlbmQgdGFnLgorICAgICAgbmV3X3BvcyA9IHBvcytlbmRfdGFnX2xlbgorICAgICAgaWYgYnVmZmVyW3BvczpuZXdfcG9zXSAhPSBlbmRfdGFnX2J5dGVzIG9yIG5ld19wb3MgPiBlbmQ6CisgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignTWlzc2luZyBncm91cCBlbmQgdGFnLicpCisgICAgICByZXR1cm4gbmV3X3BvcworICAgIHJldHVybiBEZWNvZGVGaWVsZAorCisKK2RlZiBNZXNzYWdlRGVjb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQsIGtleSwgbmV3X2RlZmF1bHQpOgorICAiIiJSZXR1cm5zIGEgZGVjb2RlciBmb3IgYSBtZXNzYWdlIGZpZWxkLiIiIgorCisgIGxvY2FsX0RlY29kZVZhcmludCA9IF9EZWNvZGVWYXJpbnQKKworICBhc3NlcnQgbm90IGlzX3BhY2tlZAorICBpZiBpc19yZXBlYXRlZDoKKyAgICB0YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgICAgdGFnX2xlbiA9IGxlbih0YWdfYnl0ZXMpCisgICAgZGVmIERlY29kZVJlcGVhdGVkRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKKyAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICB3aGlsZSAxOgorICAgICAgICAjIFJlYWQgbGVuZ3RoLgorICAgICAgICAoc2l6ZSwgcG9zKSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKKyAgICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKKyAgICAgICAgaWYgbmV3X3BvcyA+IGVuZDoKKyAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCisgICAgICAgICMgUmVhZCBzdWItbWVzc2FnZS4KKyAgICAgICAgaWYgdmFsdWUuYWRkKCkuX0ludGVybmFsUGFyc2UoYnVmZmVyLCBwb3MsIG5ld19wb3MpICE9IG5ld19wb3M6CisgICAgICAgICAgIyBUaGUgb25seSByZWFzb24gX0ludGVybmFsUGFyc2Ugd291bGQgcmV0dXJuIGVhcmx5IGlzIGlmIGl0CisgICAgICAgICAgIyBlbmNvdW50ZXJlZCBhbiBlbmQtZ3JvdXAgdGFnLgorICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVW5leHBlY3RlZCBlbmQtZ3JvdXAgdGFnLicpCisgICAgICAgICMgUHJlZGljdCB0aGF0IHRoZSBuZXh0IHRhZyBpcyBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgcmVwZWF0ZWQgZmllbGQuCisgICAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCisgICAgICAgIGlmIGJ1ZmZlcltuZXdfcG9zOnBvc10gIT0gdGFnX2J5dGVzIG9yIG5ld19wb3MgPT0gZW5kOgorICAgICAgICAgICMgUHJlZGljdGlvbiBmYWlsZWQuICBSZXR1cm4uCisgICAgICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQorICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKKyAgICAgICMgUmVhZCBsZW5ndGguCisgICAgICAoc2l6ZSwgcG9zKSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKKyAgICAgIG5ld19wb3MgPSBwb3MgKyBzaXplCisgICAgICBpZiBuZXdfcG9zID4gZW5kOgorICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCisgICAgICAjIFJlYWQgc3ViLW1lc3NhZ2UuCisgICAgICBpZiB2YWx1ZS5fSW50ZXJuYWxQYXJzZShidWZmZXIsIHBvcywgbmV3X3BvcykgIT0gbmV3X3BvczoKKyAgICAgICAgIyBUaGUgb25seSByZWFzb24gX0ludGVybmFsUGFyc2Ugd291bGQgcmV0dXJuIGVhcmx5IGlzIGlmIGl0IGVuY291bnRlcmVkCisgICAgICAgICMgYW4gZW5kLWdyb3VwIHRhZy4KKyAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdVbmV4cGVjdGVkIGVuZC1ncm91cCB0YWcuJykKKyAgICAgIHJldHVybiBuZXdfcG9zCisgICAgcmV0dXJuIERlY29kZUZpZWxkCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNRVNTQUdFX1NFVF9JVEVNX1RBRyA9IGVuY29kZXIuVGFnQnl0ZXMoMSwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApCisKK2RlZiBNZXNzYWdlU2V0SXRlbURlY29kZXIoZGVzY3JpcHRvcik6CisgICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIE1lc3NhZ2VTZXQgaXRlbS4KKworICBUaGUgcGFyYW1ldGVyIGlzIHRoZSBtZXNzYWdlIERlc2NyaXB0b3IuCisKKyAgVGhlIG1lc3NhZ2Ugc2V0IG1lc3NhZ2UgbG9va3MgbGlrZSB0aGlzOgorICAgIG1lc3NhZ2UgTWVzc2FnZVNldCB7CisgICAgICByZXBlYXRlZCBncm91cCBJdGVtID0gMSB7CisgICAgICAgIHJlcXVpcmVkIGludDMyIHR5cGVfaWQgPSAyOworICAgICAgICByZXF1aXJlZCBzdHJpbmcgbWVzc2FnZSA9IDM7CisgICAgICB9CisgICAgfQorICAiIiIKKworICB0eXBlX2lkX3RhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoMiwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKQorICBtZXNzYWdlX3RhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoMywgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgaXRlbV9lbmRfdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcygxLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApCisKKyAgbG9jYWxfUmVhZFRhZyA9IFJlYWRUYWcKKyAgbG9jYWxfRGVjb2RlVmFyaW50ID0gX0RlY29kZVZhcmludAorICBsb2NhbF9Ta2lwRmllbGQgPSBTa2lwRmllbGQKKworICBkZWYgRGVjb2RlSXRlbShidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAiIiJEZWNvZGUgc2VyaWFsaXplZCBtZXNzYWdlIHNldCB0byBpdHMgdmFsdWUgYW5kIG5ldyBwb3NpdGlvbi4KKworICAgIEFyZ3M6CisgICAgICBidWZmZXI6IG1lbW9yeXZpZXcgb2YgdGhlIHNlcmlhbGl6ZWQgYnl0ZXMuCisgICAgICBwb3M6IGludCwgcG9zaXRpb24gaW4gdGhlIG1lbW9yeSB2aWV3IHRvIHN0YXJ0IGF0LgorICAgICAgZW5kOiBpbnQsIGVuZCBwb3NpdGlvbiBvZiBzZXJpYWxpemVkIGRhdGEKKyAgICAgIG1lc3NhZ2U6IE1lc3NhZ2Ugb2JqZWN0IHRvIHN0b3JlIHVua25vd24gZmllbGRzIGluCisgICAgICBmaWVsZF9kaWN0OiBNYXBbRGVzY3JpcHRvciwgQW55XSB0byBzdG9yZSBkZWNvZGVkIHZhbHVlcyBpbi4KKworICAgIFJldHVybnM6CisgICAgICBpbnQsIG5ldyBwb3NpdGlvbiBpbiBzZXJpYWxpemVkIGRhdGEuCisgICAgIiIiCisgICAgbWVzc2FnZV9zZXRfaXRlbV9zdGFydCA9IHBvcworICAgIHR5cGVfaWQgPSAtMQorICAgIG1lc3NhZ2Vfc3RhcnQgPSAtMQorICAgIG1lc3NhZ2VfZW5kID0gLTEKKworICAgICMgVGVjaG5pY2FsbHksIHR5cGVfaWQgYW5kIG1lc3NhZ2UgY2FuIGFwcGVhciBpbiBhbnkgb3JkZXIsIHNvIHdlIG5lZWQKKyAgICAjIGEgbGl0dGxlIGxvb3AgaGVyZS4KKyAgICB3aGlsZSAxOgorICAgICAgKHRhZ19ieXRlcywgcG9zKSA9IGxvY2FsX1JlYWRUYWcoYnVmZmVyLCBwb3MpCisgICAgICBpZiB0YWdfYnl0ZXMgPT0gdHlwZV9pZF90YWdfYnl0ZXM6CisgICAgICAgICh0eXBlX2lkLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICAgICAgZWxpZiB0YWdfYnl0ZXMgPT0gbWVzc2FnZV90YWdfYnl0ZXM6CisgICAgICAgIChzaXplLCBtZXNzYWdlX3N0YXJ0KSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKKyAgICAgICAgcG9zID0gbWVzc2FnZV9lbmQgPSBtZXNzYWdlX3N0YXJ0ICsgc2l6ZQorICAgICAgZWxpZiB0YWdfYnl0ZXMgPT0gaXRlbV9lbmRfdGFnX2J5dGVzOgorICAgICAgICBicmVhaworICAgICAgZWxzZToKKyAgICAgICAgcG9zID0gU2tpcEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIHRhZ19ieXRlcykKKyAgICAgICAgaWYgcG9zID09IC0xOgorICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignTWlzc2luZyBncm91cCBlbmQgdGFnLicpCisKKyAgICBpZiBwb3MgPiBlbmQ6CisgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCisKKyAgICBpZiB0eXBlX2lkID09IC0xOgorICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdNZXNzYWdlU2V0IGl0ZW0gbWlzc2luZyB0eXBlX2lkLicpCisgICAgaWYgbWVzc2FnZV9zdGFydCA9PSAtMToKKyAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignTWVzc2FnZVNldCBpdGVtIG1pc3NpbmcgbWVzc2FnZS4nKQorCisgICAgZXh0ZW5zaW9uID0gbWVzc2FnZS5FeHRlbnNpb25zLl9GaW5kRXh0ZW5zaW9uQnlOdW1iZXIodHlwZV9pZCkKKyAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgaWYgZXh0ZW5zaW9uIGlzIG5vdCBOb25lOgorICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChleHRlbnNpb24pCisgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICBtZXNzYWdlX3R5cGUgPSBleHRlbnNpb24ubWVzc2FnZV90eXBlCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG1lc3NhZ2VfdHlwZSwgJ19jb25jcmV0ZV9jbGFzcycpOgorICAgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgICBtZXNzYWdlLl9GQUNUT1JZLkdldFByb3RvdHlwZShtZXNzYWdlX3R5cGUpCisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KAorICAgICAgICAgICAgZXh0ZW5zaW9uLCBtZXNzYWdlX3R5cGUuX2NvbmNyZXRlX2NsYXNzKCkpCisgICAgICBpZiB2YWx1ZS5fSW50ZXJuYWxQYXJzZShidWZmZXIsIG1lc3NhZ2Vfc3RhcnQsbWVzc2FnZV9lbmQpICE9IG1lc3NhZ2VfZW5kOgorICAgICAgICAjIFRoZSBvbmx5IHJlYXNvbiBfSW50ZXJuYWxQYXJzZSB3b3VsZCByZXR1cm4gZWFybHkgaXMgaWYgaXQgZW5jb3VudGVyZWQKKyAgICAgICAgIyBhbiBlbmQtZ3JvdXAgdGFnLgorICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kLWdyb3VwIHRhZy4nKQorICAgIGVsc2U6CisgICAgICBpZiBub3QgbWVzc2FnZS5fdW5rbm93bl9maWVsZHM6CisgICAgICAgIG1lc3NhZ2UuX3Vua25vd25fZmllbGRzID0gW10KKyAgICAgIG1lc3NhZ2UuX3Vua25vd25fZmllbGRzLmFwcGVuZCgKKyAgICAgICAgICAoTUVTU0FHRV9TRVRfSVRFTV9UQUcsIGJ1ZmZlclttZXNzYWdlX3NldF9pdGVtX3N0YXJ0OnBvc10udG9ieXRlcygpKSkKKyAgICAgIGlmIG1lc3NhZ2UuX3Vua25vd25fZmllbGRfc2V0IGlzIE5vbmU6CisgICAgICAgIG1lc3NhZ2UuX3Vua25vd25fZmllbGRfc2V0ID0gY29udGFpbmVycy5Vbmtub3duRmllbGRTZXQoKQorICAgICAgbWVzc2FnZS5fdW5rbm93bl9maWVsZF9zZXQuX2FkZCgKKyAgICAgICAgICB0eXBlX2lkLAorICAgICAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsCisgICAgICAgICAgYnVmZmVyW21lc3NhZ2Vfc3RhcnQ6bWVzc2FnZV9lbmRdLnRvYnl0ZXMoKSkKKyAgICAgICMgcHlsaW50OiBlbmFibGU9cHJvdGVjdGVkLWFjY2VzcworCisgICAgcmV0dXJuIHBvcworCisgIHJldHVybiBEZWNvZGVJdGVtCisKKworZGVmIFVua25vd25NZXNzYWdlU2V0SXRlbURlY29kZXIoKToKKyAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgVW5rbm93biBNZXNzYWdlU2V0IGl0ZW0uIiIiCisKKyAgdHlwZV9pZF90YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKDIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCkKKyAgbWVzc2FnZV90YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKDMsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgIGl0ZW1fZW5kX3RhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoMSwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKQorCisgIGRlZiBEZWNvZGVVbmtub3duSXRlbShidWZmZXIpOgorICAgIHBvcyA9IDAKKyAgICBlbmQgPSBsZW4oYnVmZmVyKQorICAgIG1lc3NhZ2Vfc3RhcnQgPSAtMQorICAgIG1lc3NhZ2VfZW5kID0gLTEKKyAgICB3aGlsZSAxOgorICAgICAgKHRhZ19ieXRlcywgcG9zKSA9IFJlYWRUYWcoYnVmZmVyLCBwb3MpCisgICAgICBpZiB0YWdfYnl0ZXMgPT0gdHlwZV9pZF90YWdfYnl0ZXM6CisgICAgICAgICh0eXBlX2lkLCBwb3MpID0gX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKKyAgICAgIGVsaWYgdGFnX2J5dGVzID09IG1lc3NhZ2VfdGFnX2J5dGVzOgorICAgICAgICAoc2l6ZSwgbWVzc2FnZV9zdGFydCkgPSBfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICAgICAgICBwb3MgPSBtZXNzYWdlX2VuZCA9IG1lc3NhZ2Vfc3RhcnQgKyBzaXplCisgICAgICBlbGlmIHRhZ19ieXRlcyA9PSBpdGVtX2VuZF90YWdfYnl0ZXM6CisgICAgICAgIGJyZWFrCisgICAgICBlbHNlOgorICAgICAgICBwb3MgPSBTa2lwRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgdGFnX2J5dGVzKQorICAgICAgICBpZiBwb3MgPT0gLTE6CisgICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdNaXNzaW5nIGdyb3VwIGVuZCB0YWcuJykKKworICAgIGlmIHBvcyA+IGVuZDoKKyAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKKworICAgIGlmIHR5cGVfaWQgPT0gLTE6CisgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ01lc3NhZ2VTZXQgaXRlbSBtaXNzaW5nIHR5cGVfaWQuJykKKyAgICBpZiBtZXNzYWdlX3N0YXJ0ID09IC0xOgorICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdNZXNzYWdlU2V0IGl0ZW0gbWlzc2luZyBtZXNzYWdlLicpCisKKyAgICByZXR1cm4gKHR5cGVfaWQsIGJ1ZmZlclttZXNzYWdlX3N0YXJ0Om1lc3NhZ2VfZW5kXS50b2J5dGVzKCkpCisKKyAgcmV0dXJuIERlY29kZVVua25vd25JdGVtCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIE1hcERlY29kZXIoZmllbGRfZGVzY3JpcHRvciwgbmV3X2RlZmF1bHQsIGlzX21lc3NhZ2VfbWFwKToKKyAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgbWFwIGZpZWxkLiIiIgorCisgIGtleSA9IGZpZWxkX2Rlc2NyaXB0b3IKKyAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9kZXNjcmlwdG9yLm51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQorICB0YWdfbGVuID0gbGVuKHRhZ19ieXRlcykKKyAgbG9jYWxfRGVjb2RlVmFyaW50ID0gX0RlY29kZVZhcmludAorICAjIENhbid0IHJlYWQgX2NvbmNyZXRlX2NsYXNzIHlldDsgbWlnaHQgbm90IGJlIGluaXRpYWxpemVkLgorICBtZXNzYWdlX3R5cGUgPSBmaWVsZF9kZXNjcmlwdG9yLm1lc3NhZ2VfdHlwZQorCisgIGRlZiBEZWNvZGVNYXAoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgc3VibXNnID0gbWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcygpCisgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCisgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgd2hpbGUgMToKKyAgICAgICMgUmVhZCBsZW5ndGguCisgICAgICAoc2l6ZSwgcG9zKSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKKyAgICAgIG5ld19wb3MgPSBwb3MgKyBzaXplCisgICAgICBpZiBuZXdfcG9zID4gZW5kOgorICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCisgICAgICAjIFJlYWQgc3ViLW1lc3NhZ2UuCisgICAgICBzdWJtc2cuQ2xlYXIoKQorICAgICAgaWYgc3VibXNnLl9JbnRlcm5hbFBhcnNlKGJ1ZmZlciwgcG9zLCBuZXdfcG9zKSAhPSBuZXdfcG9zOgorICAgICAgICAjIFRoZSBvbmx5IHJlYXNvbiBfSW50ZXJuYWxQYXJzZSB3b3VsZCByZXR1cm4gZWFybHkgaXMgaWYgaXQKKyAgICAgICAgIyBlbmNvdW50ZXJlZCBhbiBlbmQtZ3JvdXAgdGFnLgorICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kLWdyb3VwIHRhZy4nKQorCisgICAgICBpZiBpc19tZXNzYWdlX21hcDoKKyAgICAgICAgdmFsdWVbc3VibXNnLmtleV0uQ29weUZyb20oc3VibXNnLnZhbHVlKQorICAgICAgZWxzZToKKyAgICAgICAgdmFsdWVbc3VibXNnLmtleV0gPSBzdWJtc2cudmFsdWUKKworICAgICAgIyBQcmVkaWN0IHRoYXQgdGhlIG5leHQgdGFnIGlzIGFub3RoZXIgY29weSBvZiB0aGUgc2FtZSByZXBlYXRlZCBmaWVsZC4KKyAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCisgICAgICBpZiBidWZmZXJbbmV3X3Bvczpwb3NdICE9IHRhZ19ieXRlcyBvciBuZXdfcG9zID09IGVuZDoKKyAgICAgICAgIyBQcmVkaWN0aW9uIGZhaWxlZC4gIFJldHVybi4KKyAgICAgICAgcmV0dXJuIG5ld19wb3MKKworICByZXR1cm4gRGVjb2RlTWFwCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT3B0aW1pemF0aW9uIGlzIG5vdCBhcyBoZWF2eSBoZXJlIGJlY2F1c2UgY2FsbHMgdG8gU2tpcEZpZWxkKCkgYXJlIHJhcmUsCisjIGV4Y2VwdCBmb3IgaGFuZGxpbmcgZW5kLWdyb3VwIHRhZ3MuCisKK2RlZiBfU2tpcFZhcmludChidWZmZXIsIHBvcywgZW5kKToKKyAgIiIiU2tpcCBhIHZhcmludCB2YWx1ZS4gIFJldHVybnMgdGhlIG5ldyBwb3NpdGlvbi4iIiIKKyAgIyBQcmV2aW91c2x5IG9yZChidWZmZXJbcG9zXSkgcmFpc2VkIEluZGV4RXJyb3Igd2hlbiBwb3MgaXMgb3V0IG9mIHJhbmdlLgorICAjIFdpdGggdGhpcyBjb2RlLCBvcmQoYicnKSByYWlzZXMgVHlwZUVycm9yLiAgQm90aCBhcmUgaGFuZGxlZCBpbgorICAjIHB5dGhvbl9tZXNzYWdlLnB5IHRvIGdlbmVyYXRlIGEgJ1RydW5jYXRlZCBtZXNzYWdlJyBlcnJvci4KKyAgd2hpbGUgb3JkKGJ1ZmZlcltwb3M6cG9zKzFdLnRvYnl0ZXMoKSkgJiAweDgwOgorICAgIHBvcyArPSAxCisgIHBvcyArPSAxCisgIGlmIHBvcyA+IGVuZDoKKyAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCisgIHJldHVybiBwb3MKKworZGVmIF9Ta2lwRml4ZWQ2NChidWZmZXIsIHBvcywgZW5kKToKKyAgIiIiU2tpcCBhIGZpeGVkNjQgdmFsdWUuICBSZXR1cm5zIHRoZSBuZXcgcG9zaXRpb24uIiIiCisKKyAgcG9zICs9IDgKKyAgaWYgcG9zID4gZW5kOgorICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKKyAgcmV0dXJuIHBvcworCisKK2RlZiBfRGVjb2RlRml4ZWQ2NChidWZmZXIsIHBvcyk6CisgICIiIkRlY29kZSBhIGZpeGVkNjQuIiIiCisgIG5ld19wb3MgPSBwb3MgKyA4CisgIHJldHVybiAoc3RydWN0LnVucGFjaygnPFEnLCBidWZmZXJbcG9zOm5ld19wb3NdKVswXSwgbmV3X3BvcykKKworCitkZWYgX1NraXBMZW5ndGhEZWxpbWl0ZWQoYnVmZmVyLCBwb3MsIGVuZCk6CisgICIiIlNraXAgYSBsZW5ndGgtZGVsaW1pdGVkIHZhbHVlLiAgUmV0dXJucyB0aGUgbmV3IHBvc2l0aW9uLiIiIgorCisgIChzaXplLCBwb3MpID0gX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKKyAgcG9zICs9IHNpemUKKyAgaWYgcG9zID4gZW5kOgorICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKKyAgcmV0dXJuIHBvcworCisKK2RlZiBfU2tpcEdyb3VwKGJ1ZmZlciwgcG9zLCBlbmQpOgorICAiIiJTa2lwIHN1Yi1ncm91cC4gIFJldHVybnMgdGhlIG5ldyBwb3NpdGlvbi4iIiIKKworICB3aGlsZSAxOgorICAgICh0YWdfYnl0ZXMsIHBvcykgPSBSZWFkVGFnKGJ1ZmZlciwgcG9zKQorICAgIG5ld19wb3MgPSBTa2lwRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgdGFnX2J5dGVzKQorICAgIGlmIG5ld19wb3MgPT0gLTE6CisgICAgICByZXR1cm4gcG9zCisgICAgcG9zID0gbmV3X3BvcworCisKK2RlZiBfRGVjb2RlVW5rbm93bkZpZWxkU2V0KGJ1ZmZlciwgcG9zLCBlbmRfcG9zPU5vbmUpOgorICAiIiJEZWNvZGUgVW5rbm93bkZpZWxkU2V0LiAgUmV0dXJucyB0aGUgVW5rbm93bkZpZWxkU2V0IGFuZCBuZXcgcG9zaXRpb24uIiIiCisKKyAgdW5rbm93bl9maWVsZF9zZXQgPSBjb250YWluZXJzLlVua25vd25GaWVsZFNldCgpCisgIHdoaWxlIGVuZF9wb3MgaXMgTm9uZSBvciBwb3MgPCBlbmRfcG9zOgorICAgICh0YWdfYnl0ZXMsIHBvcykgPSBSZWFkVGFnKGJ1ZmZlciwgcG9zKQorICAgICh0YWcsIF8pID0gX0RlY29kZVZhcmludCh0YWdfYnl0ZXMsIDApCisgICAgZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUgPSB3aXJlX2Zvcm1hdC5VbnBhY2tUYWcodGFnKQorICAgIGlmIHdpcmVfdHlwZSA9PSB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVA6CisgICAgICBicmVhaworICAgIChkYXRhLCBwb3MpID0gX0RlY29kZVVua25vd25GaWVsZChidWZmZXIsIHBvcywgd2lyZV90eXBlKQorICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICB1bmtub3duX2ZpZWxkX3NldC5fYWRkKGZpZWxkX251bWJlciwgd2lyZV90eXBlLCBkYXRhKQorCisgIHJldHVybiAodW5rbm93bl9maWVsZF9zZXQsIHBvcykKKworCitkZWYgX0RlY29kZVVua25vd25GaWVsZChidWZmZXIsIHBvcywgd2lyZV90eXBlKToKKyAgIiIiRGVjb2RlIGEgdW5rbm93biBmaWVsZC4gIFJldHVybnMgdGhlIFVua25vd25GaWVsZCBhbmQgbmV3IHBvc2l0aW9uLiIiIgorCisgIGlmIHdpcmVfdHlwZSA9PSB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQ6CisgICAgKGRhdGEsIHBvcykgPSBfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICBlbGlmIHdpcmVfdHlwZSA9PSB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDY0OgorICAgIChkYXRhLCBwb3MpID0gX0RlY29kZUZpeGVkNjQoYnVmZmVyLCBwb3MpCisgIGVsaWYgd2lyZV90eXBlID09IHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVEMzI6CisgICAgKGRhdGEsIHBvcykgPSBfRGVjb2RlRml4ZWQzMihidWZmZXIsIHBvcykKKyAgZWxpZiB3aXJlX3R5cGUgPT0gd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAoc2l6ZSwgcG9zKSA9IF9EZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpCisgICAgZGF0YSA9IGJ1ZmZlcltwb3M6cG9zK3NpemVdLnRvYnl0ZXMoKQorICAgIHBvcyArPSBzaXplCisgIGVsaWYgd2lyZV90eXBlID09IHdpcmVfZm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQOgorICAgIChkYXRhLCBwb3MpID0gX0RlY29kZVVua25vd25GaWVsZFNldChidWZmZXIsIHBvcykKKyAgZWxpZiB3aXJlX3R5cGUgPT0gd2lyZV9mb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQOgorICAgIHJldHVybiAoMCwgLTEpCisgIGVsc2U6CisgICAgcmFpc2UgX0RlY29kZUVycm9yKCdXcm9uZyB3aXJlIHR5cGUgaW4gdGFnLicpCisKKyAgcmV0dXJuIChkYXRhLCBwb3MpCisKKworZGVmIF9FbmRHcm91cChidWZmZXIsIHBvcywgZW5kKToKKyAgIiIiU2tpcHBpbmcgYW4gRU5EX0dST1VQIHRhZyByZXR1cm5zIC0xIHRvIHRlbGwgdGhlIHBhcmVudCBsb29wIHRvIGJyZWFrLiIiIgorCisgIHJldHVybiAtMQorCisKK2RlZiBfU2tpcEZpeGVkMzIoYnVmZmVyLCBwb3MsIGVuZCk6CisgICIiIlNraXAgYSBmaXhlZDMyIHZhbHVlLiAgUmV0dXJucyB0aGUgbmV3IHBvc2l0aW9uLiIiIgorCisgIHBvcyArPSA0CisgIGlmIHBvcyA+IGVuZDoKKyAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCisgIHJldHVybiBwb3MKKworCitkZWYgX0RlY29kZUZpeGVkMzIoYnVmZmVyLCBwb3MpOgorICAiIiJEZWNvZGUgYSBmaXhlZDMyLiIiIgorCisgIG5ld19wb3MgPSBwb3MgKyA0CisgIHJldHVybiAoc3RydWN0LnVucGFjaygnPEknLCBidWZmZXJbcG9zOm5ld19wb3NdKVswXSwgbmV3X3BvcykKKworCitkZWYgX1JhaXNlSW52YWxpZFdpcmVUeXBlKGJ1ZmZlciwgcG9zLCBlbmQpOgorICAiIiJTa2lwIGZ1bmN0aW9uIGZvciB1bmtub3duIHdpcmUgdHlwZXMuICBSYWlzZXMgYW4gZXhjZXB0aW9uLiIiIgorCisgIHJhaXNlIF9EZWNvZGVFcnJvcignVGFnIGhhZCBpbnZhbGlkIHdpcmUgdHlwZS4nKQorCitkZWYgX0ZpZWxkU2tpcHBlcigpOgorICAiIiJDb25zdHJ1Y3RzIHRoZSBTa2lwRmllbGQgZnVuY3Rpb24uIiIiCisKKyAgV0lSRVRZUEVfVE9fU0tJUFBFUiA9IFsKKyAgICAgIF9Ta2lwVmFyaW50LAorICAgICAgX1NraXBGaXhlZDY0LAorICAgICAgX1NraXBMZW5ndGhEZWxpbWl0ZWQsCisgICAgICBfU2tpcEdyb3VwLAorICAgICAgX0VuZEdyb3VwLAorICAgICAgX1NraXBGaXhlZDMyLAorICAgICAgX1JhaXNlSW52YWxpZFdpcmVUeXBlLAorICAgICAgX1JhaXNlSW52YWxpZFdpcmVUeXBlLAorICAgICAgXQorCisgIHdpcmV0eXBlX21hc2sgPSB3aXJlX2Zvcm1hdC5UQUdfVFlQRV9NQVNLCisKKyAgZGVmIFNraXBGaWVsZChidWZmZXIsIHBvcywgZW5kLCB0YWdfYnl0ZXMpOgorICAgICIiIlNraXBzIGEgZmllbGQgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZy4KKworICAgIHxwb3N8IHNob3VsZCBwb2ludCB0byB0aGUgYnl0ZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgdGFnLgorCisgICAgUmV0dXJuczoKKyAgICAgICAgVGhlIG5ldyBwb3NpdGlvbiAoYWZ0ZXIgdGhlIHRhZyB2YWx1ZSksIG9yIC0xIGlmIHRoZSB0YWcgaXMgYW4gZW5kLWdyb3VwCisgICAgICAgIHRhZyAoaW4gd2hpY2ggY2FzZSB0aGUgY2FsbGluZyBsb29wIHNob3VsZCBicmVhaykuCisgICAgIiIiCisKKyAgICAjIFRoZSB3aXJlIHR5cGUgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCBieXRlIHNpbmNlIHZhcmludHMgYXJlIGxpdHRsZS1lbmRpYW4uCisgICAgd2lyZV90eXBlID0gb3JkKHRhZ19ieXRlc1swOjFdKSAmIHdpcmV0eXBlX21hc2sKKyAgICByZXR1cm4gV0lSRVRZUEVfVE9fU0tJUFBFUlt3aXJlX3R5cGVdKGJ1ZmZlciwgcG9zLCBlbmQpCisKKyAgcmV0dXJuIFNraXBGaWVsZAorCitTa2lwRmllbGQgPSBfRmllbGRTa2lwcGVyKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9kYXRhYmFzZV90ZXN0LnB5IGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX2RhdGFiYXNlX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwODZiOQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9kYXRhYmFzZV90ZXN0LnB5CkBAIC0wLDAgKzEsMTI3IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIGZvciBnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9kYXRhYmFzZS4iIiIKKworX19hdXRob3JfXyA9ICdtYXR0aGV3dG9pYUBnb29nbGUuY29tIChNYXR0IFRvaWEpJworCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncworCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBmYWN0b3J5X3Rlc3QyX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IG5vX3BhY2thZ2VfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdGVzdGluZ19yZWZsZWFrcworZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfZGF0YWJhc2UKKworCitAdGVzdGluZ19yZWZsZWFrcy5UZXN0Q2FzZQorY2xhc3MgRGVzY3JpcHRvckRhdGFiYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RBZGQoc2VsZik6CisgICAgZGIgPSBkZXNjcmlwdG9yX2RhdGFiYXNlLkRlc2NyaXB0b3JEYXRhYmFzZSgpCisgICAgZmlsZV9kZXNjX3Byb3RvID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAorICAgICAgICBmYWN0b3J5X3Rlc3QyX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpCisgICAgZmlsZV9kZXNjX3Byb3RvMiA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKKyAgICAgICAgbm9fcGFja2FnZV9wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiKQorICAgIGRiLkFkZChmaWxlX2Rlc2NfcHJvdG8pCisgICAgZGIuQWRkKGZpbGVfZGVzY19wcm90bzIpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfZGVzY19wcm90bywgZGIuRmluZEZpbGVCeU5hbWUoCisgICAgICAgICdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0Mi5wcm90bycpKQorICAgICMgQ2FuIGZpbmQgbWVzc2FnZSB0eXBlLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9kZXNjX3Byb3RvLCBkYi5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZScpKQorICAgICMgQ2FuIGZpbmQgbmVzdGVkIG1lc3NhZ2UgdHlwZS4KKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfZGVzY19wcm90bywgZGIuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2UuTmVzdGVkRmFjdG9yeTJNZXNzYWdlJykpCisgICAgIyBDYW4gZmluZCBlbnVtIHR5cGUuCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2Rlc2NfcHJvdG8sIGRiLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJFbnVtJykpCisgICAgIyBDYW4gZmluZCBuZXN0ZWQgZW51bSB0eXBlLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9kZXNjX3Byb3RvLCBkYi5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZS5OZXN0ZWRGYWN0b3J5MkVudW0nKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfZGVzY19wcm90bywgZGIuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5NZXNzYWdlV2l0aE5lc3RlZEVudW1Pbmx5Lk5lc3RlZEVudW0nKSkKKyAgICAjIENhbiBmaW5kIGZpZWxkLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9kZXNjX3Byb3RvLCBkYi5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZS5saXN0X2ZpZWxkJykpCisgICAgIyBDYW4gZmluZCBlbnVtIHZhbHVlLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9kZXNjX3Byb3RvLCBkYi5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyRW51bS5GQUNUT1JZXzJfVkFMVUVfMCcpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9kZXNjX3Byb3RvLCBkYi5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZBQ1RPUllfMl9WQUxVRV8wJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2Rlc2NfcHJvdG8yLCBkYi5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgICAgICcuTk9fUEFDS0FHRV9WQUxVRV8wJykpCisgICAgIyBDYW4gZmluZCB0b3AgbGV2ZWwgZXh0ZW5zaW9uLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9kZXNjX3Byb3RvLCBkYi5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLmFub3RoZXJfZmllbGQnKSkKKyAgICAjIENhbiBmaW5kIG5lc3RlZCBleHRlbnNpb24gaW5zaWRlIGEgbWVzc2FnZS4KKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfZGVzY19wcm90bywgZGIuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2Uub25lX21vcmVfZmllbGQnKSkKKworICAgICMgQ2FuIGZpbmQgc2VydmljZS4KKyAgICBmaWxlX2Rlc2NfcHJvdG8yID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAorICAgICAgICB1bml0dGVzdF9wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiKQorICAgIGRiLkFkZChmaWxlX2Rlc2NfcHJvdG8yKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9kZXNjX3Byb3RvMiwgZGIuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdFNlcnZpY2UnKSkKKworICAgICMgTm9uLWV4aXN0ZW50IGZpZWxkIHVuZGVyIGEgdmFsaWQgdG9wIGxldmVsIHN5bWJvbCBjYW4gYWxzbyBiZQorICAgICMgZm91bmQuIFRoZSBiZWhhdmlvciBpcyB0aGUgc2FtZSB3aXRoIHByb3RvYnVmIEMrKy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfZGVzY19wcm90bzIsIGRiLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5ub25lX2ZpZWxkJykpCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoS2V5RXJyb3IsIHInXCdwcm90b2J1Zl91bml0dGVzdFwuTm9uZU1lc3NhZ2VcJycpOgorICAgICAgZGIuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCdwcm90b2J1Zl91bml0dGVzdC5Ob25lTWVzc2FnZScpCisKKyAgZGVmIHRlc3RDb25mbGljdFJlZ2lzdGVyKHNlbGYpOgorICAgIGRiID0gZGVzY3JpcHRvcl9kYXRhYmFzZS5EZXNjcmlwdG9yRGF0YWJhc2UoKQorICAgIHVuaXR0ZXN0X2ZkID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAorICAgICAgICB1bml0dGVzdF9wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiKQorICAgIGRiLkFkZCh1bml0dGVzdF9mZCkKKyAgICBjb25mbGljdF9mZCA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKKyAgICAgICAgdW5pdHRlc3RfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYikKKyAgICBjb25mbGljdF9mZC5uYW1lID0gJ290aGVyX2ZpbGUyJworICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAjIENhdXNlIGFsbCB3YXJuaW5ncyB0byBhbHdheXMgYmUgdHJpZ2dlcmVkLgorICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdhbHdheXMnKQorICAgICAgZGIuQWRkKGNvbmZsaWN0X2ZkKQorICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih3KSkKKyAgICAgIHNlbGYuYXNzZXJ0SXMod1swXS5jYXRlZ29yeSwgUnVudGltZVdhcm5pbmcpCisgICAgICBzZWxmLmFzc2VydEluKCdDb25mbGljdCByZWdpc3RlciBmb3IgZmlsZSAib3RoZXJfZmlsZTIiOiAnLAorICAgICAgICAgICAgICAgICAgICBzdHIod1swXS5tZXNzYWdlKSkKKyAgICAgIHNlbGYuYXNzZXJ0SW4oJ2FscmVhZHkgZGVmaW5lZCBpbiBmaWxlICcKKyAgICAgICAgICAgICAgICAgICAgJyJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iJywKKyAgICAgICAgICAgICAgICAgICAgc3RyKHdbMF0ubWVzc2FnZSkpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Bvb2xfdGVzdC5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9wb29sX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0NTFiNAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9wb29sX3Rlc3QucHkKQEAgLTAsMCArMSwxMTQ5IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIGZvciBnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wb29sLiIiIgorCitfX2F1dGhvcl9fID0gJ21hdHRoZXd0b2lhQGdvb2dsZS5jb20gKE1hdHQgVG9pYSknCisKK2ltcG9ydCBjb3B5CitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCisKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9pbXBvcnRfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGFwaV9pbXBsZW1lbnRhdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbF90ZXN0MV9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBkZXNjcmlwdG9yX3Bvb2xfdGVzdDJfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZmFjdG9yeV90ZXN0MV9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBmYWN0b3J5X3Rlc3QyX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGZpbGVfb3B0aW9uc190ZXN0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IG1vcmVfbWVzc2FnZXNfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgbm9fcGFja2FnZV9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB0ZXN0aW5nX3JlZmxlYWtzCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfZGF0YWJhc2UKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3Bvb2wKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlX2ZhY3RvcnkKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzeW1ib2xfZGF0YWJhc2UKKworCisKK3dhcm5pbmdzLnNpbXBsZWZpbHRlcignZXJyb3InLCBEZXByZWNhdGlvbldhcm5pbmcpCisKKworY2xhc3MgRGVzY3JpcHRvclBvb2xUZXN0QmFzZShvYmplY3QpOgorCisgIGRlZiB0ZXN0RmluZEZpbGVCeU5hbWUoc2VsZik6CisgICAgbmFtZTEgPSAnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDEucHJvdG8nCisgICAgZmlsZV9kZXNjMSA9IHNlbGYucG9vbC5GaW5kRmlsZUJ5TmFtZShuYW1lMSkKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmlsZV9kZXNjMSwgZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWUxLCBmaWxlX2Rlc2MxLm5hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbCcsIGZpbGVfZGVzYzEucGFja2FnZSkKKyAgICBzZWxmLmFzc2VydEluKCdGYWN0b3J5MU1lc3NhZ2UnLCBmaWxlX2Rlc2MxLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZSkKKworICAgIG5hbWUyID0gJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9mYWN0b3J5X3Rlc3QyLnByb3RvJworICAgIGZpbGVfZGVzYzIgPSBzZWxmLnBvb2wuRmluZEZpbGVCeU5hbWUobmFtZTIpCisgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZpbGVfZGVzYzIsIGRlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IpCisgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lMiwgZmlsZV9kZXNjMi5uYW1lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwnLCBmaWxlX2Rlc2MyLnBhY2thZ2UpCisgICAgc2VsZi5hc3NlcnRJbignRmFjdG9yeTJNZXNzYWdlJywgZmlsZV9kZXNjMi5tZXNzYWdlX3R5cGVzX2J5X25hbWUpCisKKyAgZGVmIHRlc3RGaW5kRmlsZUJ5TmFtZUZhaWx1cmUoc2VsZik6CisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICBzZWxmLnBvb2wuRmluZEZpbGVCeU5hbWUoJ0RvZXMgbm90IGV4aXN0JykKKworICBkZWYgdGVzdEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzZWxmKToKKyAgICBmaWxlX2Rlc2MxID0gc2VsZi5wb29sLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTFNZXNzYWdlJykKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmlsZV9kZXNjMSwgZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0MS5wcm90bycsCisgICAgICAgICAgICAgICAgICAgICBmaWxlX2Rlc2MxLm5hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbCcsIGZpbGVfZGVzYzEucGFja2FnZSkKKyAgICBzZWxmLmFzc2VydEluKCdGYWN0b3J5MU1lc3NhZ2UnLCBmaWxlX2Rlc2MxLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZSkKKworICAgIGZpbGVfZGVzYzIgPSBzZWxmLnBvb2wuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2UnKQorICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmaWxlX2Rlc2MyLCBkZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9mYWN0b3J5X3Rlc3QyLnByb3RvJywKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVfZGVzYzIubmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsJywgZmlsZV9kZXNjMi5wYWNrYWdlKQorICAgIHNlbGYuYXNzZXJ0SW4oJ0ZhY3RvcnkyTWVzc2FnZScsIGZpbGVfZGVzYzIubWVzc2FnZV90eXBlc19ieV9uYW1lKQorCisgICAgIyBUZXN0cyB0b3AgbGV2ZWwgZXh0ZW5zaW9uLgorICAgIGZpbGVfZGVzYzMgPSBzZWxmLnBvb2wuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5hbm90aGVyX2ZpZWxkJykKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmlsZV9kZXNjMywgZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0Mi5wcm90bycsCisgICAgICAgICAgICAgICAgICAgICBmaWxlX2Rlc2MzLm5hbWUpCisKKyAgICAjIFRlc3RzIG5lc3RlZCBleHRlbnNpb24gaW5zaWRlIGEgbWVzc2FnZS4KKyAgICBmaWxlX2Rlc2M0ID0gc2VsZi5wb29sLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlLm9uZV9tb3JlX2ZpZWxkJykKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmlsZV9kZXNjNCwgZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0Mi5wcm90bycsCisgICAgICAgICAgICAgICAgICAgICBmaWxlX2Rlc2M0Lm5hbWUpCisKKyAgICBmaWxlX2Rlc2M1ID0gc2VsZi5wb29sLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RTZXJ2aWNlJykKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmlsZV9kZXNjNSwgZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nLAorICAgICAgICAgICAgICAgICAgICAgZmlsZV9kZXNjNS5uYW1lKQorICAgICMgVGVzdHMgdGhlIGdlbmVyYXRlZCBwb29sLgorICAgIGFzc2VydCBkZXNjcmlwdG9yX3Bvb2wuRGVmYXVsdCgpLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlLm9uZV9tb3JlX2ZpZWxkJykKKyAgICBhc3NlcnQgZGVzY3JpcHRvcl9wb29sLkRlZmF1bHQoKS5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLmFub3RoZXJfZmllbGQnKQorICAgIGFzc2VydCBkZXNjcmlwdG9yX3Bvb2wuRGVmYXVsdCgpLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RTZXJ2aWNlJykKKworICAgICMgQ2FuIGZpbmQgZmllbGQuCisgICAgZmlsZV9kZXNjNiA9IHNlbGYucG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkxTWVzc2FnZS5saXN0X3ZhbHVlJykKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmlsZV9kZXNjNiwgZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0MS5wcm90bycsCisgICAgICAgICAgICAgICAgICAgICBmaWxlX2Rlc2M2Lm5hbWUpCisKKyAgICAjIENhbiBmaW5kIHRvcCBsZXZlbCBFbnVtIHZhbHVlLgorICAgIGZpbGVfZGVzYzcgPSBzZWxmLnBvb2wuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GQUNUT1JZXzFfVkFMVUVfMCcpCisgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZpbGVfZGVzYzcsIGRlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDEucHJvdG8nLAorICAgICAgICAgICAgICAgICAgICAgZmlsZV9kZXNjNy5uYW1lKQorCisgICAgIyBDYW4gZmluZCBuZXN0ZWQgRW51bSB2YWx1ZS4KKyAgICBmaWxlX2Rlc2M4ID0gc2VsZi5wb29sLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5GT08nKQorICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmaWxlX2Rlc2M4LCBkZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bycsCisgICAgICAgICAgICAgICAgICAgICBmaWxlX2Rlc2M4Lm5hbWUpCisKKyAgICAjIFRPRE8oamllbHVvKTogQWRkIHRlc3RzIGZvciBubyBwYWNrYWdlIHdoZW4gYi8xMzg2MDM1MSBpcyBmaXhlZC4KKworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBzZWxmLnBvb2wuRmluZEZpbGVDb250YWluaW5nU3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkxTWVzc2FnZS5ub25lX2ZpZWxkJykKKworICBkZWYgdGVzdEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbEZhaWx1cmUoc2VsZik6CisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICBzZWxmLnBvb2wuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCdEb2VzIG5vdCBleGlzdCcpCisKKyAgZGVmIHRlc3RGaW5kTWVzc2FnZVR5cGVCeU5hbWUoc2VsZik6CisgICAgbXNnMSA9IHNlbGYucG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCisgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkxTWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZzEsIGRlc2NyaXB0b3IuRGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdGYWN0b3J5MU1lc3NhZ2UnLCBtc2cxLm5hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5MU1lc3NhZ2UnLAorICAgICAgICAgICAgICAgICAgICAgbXNnMS5mdWxsX25hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBtc2cxLmNvbnRhaW5pbmdfdHlwZSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1zZzEuaGFzX29wdGlvbnMpCisKKyAgICBuZXN0ZWRfbXNnMSA9IG1zZzEubmVzdGVkX3R5cGVzWzBdCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnTmVzdGVkRmFjdG9yeTFNZXNzYWdlJywgbmVzdGVkX21zZzEubmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1zZzEsIG5lc3RlZF9tc2cxLmNvbnRhaW5pbmdfdHlwZSkKKworICAgIG5lc3RlZF9lbnVtMSA9IG1zZzEuZW51bV90eXBlc1swXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ05lc3RlZEZhY3RvcnkxRW51bScsIG5lc3RlZF9lbnVtMS5uYW1lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnMSwgbmVzdGVkX2VudW0xLmNvbnRhaW5pbmdfdHlwZSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwobmVzdGVkX21zZzEsIG1zZzEuZmllbGRzX2J5X25hbWVbCisgICAgICAgICduZXN0ZWRfZmFjdG9yeV8xX21lc3NhZ2UnXS5tZXNzYWdlX3R5cGUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChuZXN0ZWRfZW51bTEsIG1zZzEuZmllbGRzX2J5X25hbWVbCisgICAgICAgICduZXN0ZWRfZmFjdG9yeV8xX2VudW0nXS5lbnVtX3R5cGUpCisKKyAgICBtc2cyID0gc2VsZi5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlJykKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnMiwgZGVzY3JpcHRvci5EZXNjcmlwdG9yKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0ZhY3RvcnkyTWVzc2FnZScsIG1zZzIubmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZScsCisgICAgICAgICAgICAgICAgICAgICBtc2cyLmZ1bGxfbmFtZSkKKyAgICBzZWxmLmFzc2VydElzTm9uZShtc2cyLmNvbnRhaW5pbmdfdHlwZSkKKworICAgIG5lc3RlZF9tc2cyID0gbXNnMi5uZXN0ZWRfdHlwZXNbMF0KKyAgICBzZWxmLmFzc2VydEVxdWFsKCdOZXN0ZWRGYWN0b3J5Mk1lc3NhZ2UnLCBuZXN0ZWRfbXNnMi5uYW1lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnMiwgbmVzdGVkX21zZzIuY29udGFpbmluZ190eXBlKQorCisgICAgbmVzdGVkX2VudW0yID0gbXNnMi5lbnVtX3R5cGVzWzBdCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnTmVzdGVkRmFjdG9yeTJFbnVtJywgbmVzdGVkX2VudW0yLm5hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cyLCBuZXN0ZWRfZW51bTIuY29udGFpbmluZ190eXBlKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChuZXN0ZWRfbXNnMiwgbXNnMi5maWVsZHNfYnlfbmFtZVsKKyAgICAgICAgJ25lc3RlZF9mYWN0b3J5XzJfbWVzc2FnZSddLm1lc3NhZ2VfdHlwZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG5lc3RlZF9lbnVtMiwgbXNnMi5maWVsZHNfYnlfbmFtZVsKKyAgICAgICAgJ25lc3RlZF9mYWN0b3J5XzJfZW51bSddLmVudW1fdHlwZSkKKworICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cyLmZpZWxkc19ieV9uYW1lWydpbnRfd2l0aF9kZWZhdWx0J10uaGFzX2RlZmF1bHRfdmFsdWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgMTc3NiwgbXNnMi5maWVsZHNfYnlfbmFtZVsnaW50X3dpdGhfZGVmYXVsdCddLmRlZmF1bHRfdmFsdWUpCisKKyAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgIG1zZzIuZmllbGRzX2J5X25hbWVbJ2RvdWJsZV93aXRoX2RlZmF1bHQnXS5oYXNfZGVmYXVsdF92YWx1ZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICA5Ljk5LCBtc2cyLmZpZWxkc19ieV9uYW1lWydkb3VibGVfd2l0aF9kZWZhdWx0J10uZGVmYXVsdF92YWx1ZSkKKworICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgbXNnMi5maWVsZHNfYnlfbmFtZVsnc3RyaW5nX3dpdGhfZGVmYXVsdCddLmhhc19kZWZhdWx0X3ZhbHVlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICdoZWxsbyB3b3JsZCcsIG1zZzIuZmllbGRzX2J5X25hbWVbJ3N0cmluZ193aXRoX2RlZmF1bHQnXS5kZWZhdWx0X3ZhbHVlKQorCisgICAgc2VsZi5hc3NlcnRUcnVlKG1zZzIuZmllbGRzX2J5X25hbWVbJ2Jvb2xfd2l0aF9kZWZhdWx0J10uaGFzX2RlZmF1bHRfdmFsdWUpCisgICAgc2VsZi5hc3NlcnRGYWxzZShtc2cyLmZpZWxkc19ieV9uYW1lWydib29sX3dpdGhfZGVmYXVsdCddLmRlZmF1bHRfdmFsdWUpCisKKyAgICBzZWxmLmFzc2VydFRydWUobXNnMi5maWVsZHNfYnlfbmFtZVsnZW51bV93aXRoX2RlZmF1bHQnXS5oYXNfZGVmYXVsdF92YWx1ZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAxLCBtc2cyLmZpZWxkc19ieV9uYW1lWydlbnVtX3dpdGhfZGVmYXVsdCddLmRlZmF1bHRfdmFsdWUpCisKKyAgICBtc2czID0gc2VsZi5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlLk5lc3RlZEZhY3RvcnkyTWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnRFcXVhbChuZXN0ZWRfbXNnMiwgbXNnMykKKworICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cyLmZpZWxkc19ieV9uYW1lWydieXRlc193aXRoX2RlZmF1bHQnXS5oYXNfZGVmYXVsdF92YWx1ZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBiJ2FceGZiXHgwMGMnLAorICAgICAgICBtc2cyLmZpZWxkc19ieV9uYW1lWydieXRlc193aXRoX2RlZmF1bHQnXS5kZWZhdWx0X3ZhbHVlKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4obXNnMi5vbmVvZnMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKG1zZzIub25lb2ZzX2J5X25hbWUpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKG1zZzIub25lb2ZzWzBdLmZpZWxkcykpCisgICAgZm9yIG5hbWUgaW4gWydvbmVvZl9pbnQnLCAnb25lb2Zfc3RyaW5nJ106CisgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZzIub25lb2ZzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBtc2cyLmZpZWxkc19ieV9uYW1lW25hbWVdLmNvbnRhaW5pbmdfb25lb2YpCisgICAgICBzZWxmLmFzc2VydEluKG1zZzIuZmllbGRzX2J5X25hbWVbbmFtZV0sIG1zZzIub25lb2ZzWzBdLmZpZWxkcykKKworICBkZWYgdGVzdEZpbmRUeXBlRXJyb3JzKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5wb29sLkZpbmRFeHRlbnNpb25CeU51bWJlciwgJycpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHNlbGYucG9vbC5GaW5kTWV0aG9kQnlOYW1lLCAnJykKKworICAgICMgVE9ETyhqaWVsdW8pOiBGaXggcHl0aG9uIHRvIHJhaXNlIGNvcnJlY3QgZXJyb3JzLgorICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ3B5dGhvbic6CisgICAgICBlcnJvcl90eXBlID0gQXR0cmlidXRlRXJyb3IKKyAgICBlbHNlOgorICAgICAgZXJyb3JfdHlwZSA9IFR5cGVFcnJvcgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9yX3R5cGUsIHNlbGYucG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUsIDApCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3JfdHlwZSwgc2VsZi5wb29sLkZpbmRGaWVsZEJ5TmFtZSwgMCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhlcnJvcl90eXBlLCBzZWxmLnBvb2wuRmluZEV4dGVuc2lvbkJ5TmFtZSwgMCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhlcnJvcl90eXBlLCBzZWxmLnBvb2wuRmluZEVudW1UeXBlQnlOYW1lLCAwKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9yX3R5cGUsIHNlbGYucG9vbC5GaW5kT25lb2ZCeU5hbWUsIDApCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3JfdHlwZSwgc2VsZi5wb29sLkZpbmRTZXJ2aWNlQnlOYW1lLCAwKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9yX3R5cGUsIHNlbGYucG9vbC5GaW5kTWV0aG9kQnlOYW1lLCAwKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9yX3R5cGUsIHNlbGYucG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2wsIDApCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAncHl0aG9uJzoKKyAgICAgIGVycm9yX3R5cGUgPSBLZXlFcnJvcgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9yX3R5cGUsIHNlbGYucG9vbC5GaW5kRmlsZUJ5TmFtZSwgMCkKKworICBkZWYgdGVzdEZpbmRNZXNzYWdlVHlwZUJ5TmFtZUZhaWx1cmUoc2VsZik6CisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICBzZWxmLnBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCdEb2VzIG5vdCBleGlzdCcpCisKKyAgZGVmIHRlc3RGaW5kRW51bVR5cGVCeU5hbWUoc2VsZik6CisgICAgZW51bTEgPSBzZWxmLnBvb2wuRmluZEVudW1UeXBlQnlOYW1lKAorICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5MUVudW0nKQorICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlbnVtMSwgZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGVudW0xLnZhbHVlc19ieV9uYW1lWydGQUNUT1JZXzFfVkFMVUVfMCddLm51bWJlcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGVudW0xLnZhbHVlc19ieV9uYW1lWydGQUNUT1JZXzFfVkFMVUVfMSddLm51bWJlcikKKyAgICBzZWxmLmFzc2VydEZhbHNlKGVudW0xLmhhc19vcHRpb25zKQorCisgICAgbmVzdGVkX2VudW0xID0gc2VsZi5wb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgKKyAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTFNZXNzYWdlLk5lc3RlZEZhY3RvcnkxRW51bScpCisgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG5lc3RlZF9lbnVtMSwgZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAwLCBuZXN0ZWRfZW51bTEudmFsdWVzX2J5X25hbWVbJ05FU1RFRF9GQUNUT1JZXzFfVkFMVUVfMCddLm51bWJlcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAxLCBuZXN0ZWRfZW51bTEudmFsdWVzX2J5X25hbWVbJ05FU1RFRF9GQUNUT1JZXzFfVkFMVUVfMSddLm51bWJlcikKKworICAgIGVudW0yID0gc2VsZi5wb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgKKyAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJFbnVtJykKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZW51bTIsIGRlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBlbnVtMi52YWx1ZXNfYnlfbmFtZVsnRkFDVE9SWV8yX1ZBTFVFXzAnXS5udW1iZXIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBlbnVtMi52YWx1ZXNfYnlfbmFtZVsnRkFDVE9SWV8yX1ZBTFVFXzEnXS5udW1iZXIpCisKKyAgICBuZXN0ZWRfZW51bTIgPSBzZWxmLnBvb2wuRmluZEVudW1UeXBlQnlOYW1lKAorICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2UuTmVzdGVkRmFjdG9yeTJFbnVtJykKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobmVzdGVkX2VudW0yLCBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIDAsIG5lc3RlZF9lbnVtMi52YWx1ZXNfYnlfbmFtZVsnTkVTVEVEX0ZBQ1RPUllfMl9WQUxVRV8wJ10ubnVtYmVyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIDEsIG5lc3RlZF9lbnVtMi52YWx1ZXNfYnlfbmFtZVsnTkVTVEVEX0ZBQ1RPUllfMl9WQUxVRV8xJ10ubnVtYmVyKQorCisgIGRlZiB0ZXN0RmluZEVudW1UeXBlQnlOYW1lRmFpbHVyZShzZWxmKToKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKKyAgICAgIHNlbGYucG9vbC5GaW5kRW51bVR5cGVCeU5hbWUoJ0RvZXMgbm90IGV4aXN0JykKKworICBkZWYgdGVzdEZpbmRGaWVsZEJ5TmFtZShzZWxmKToKKyAgICBmaWVsZCA9IHNlbGYucG9vbC5GaW5kRmllbGRCeU5hbWUoCisgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkxTWVzc2FnZS5saXN0X3ZhbHVlJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpZWxkLm5hbWUsICdsaXN0X3ZhbHVlJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpZWxkLmxhYmVsLCBmaWVsZC5MQUJFTF9SRVBFQVRFRCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKGZpZWxkLmhhc19vcHRpb25zKQorCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICBzZWxmLnBvb2wuRmluZEZpZWxkQnlOYW1lKCdEb2VzIG5vdCBleGlzdCcpCisKKyAgZGVmIHRlc3RGaW5kT25lb2ZCeU5hbWUoc2VsZik6CisgICAgb25lb2YgPSBzZWxmLnBvb2wuRmluZE9uZW9mQnlOYW1lKAorICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2Uub25lb2ZfZmllbGQnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwob25lb2YubmFtZSwgJ29uZW9mX2ZpZWxkJykKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKKyAgICAgIHNlbGYucG9vbC5GaW5kT25lb2ZCeU5hbWUoJ0RvZXMgbm90IGV4aXN0JykKKworICBkZWYgdGVzdEZpbmRFeHRlbnNpb25CeU5hbWUoc2VsZik6CisgICAgIyBBbiBleHRlbnNpb24gZGVmaW5lZCBpbiBhIG1lc3NhZ2UuCisgICAgZXh0ZW5zaW9uID0gc2VsZi5wb29sLkZpbmRFeHRlbnNpb25CeU5hbWUoCisgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZS5vbmVfbW9yZV9maWVsZCcpCisgICAgc2VsZi5hc3NlcnRFcXVhbChleHRlbnNpb24ubmFtZSwgJ29uZV9tb3JlX2ZpZWxkJykKKyAgICAjIEFuIGV4dGVuc2lvbiBkZWZpbmVkIGF0IGZpbGUgc2NvcGUuCisgICAgZXh0ZW5zaW9uID0gc2VsZi5wb29sLkZpbmRFeHRlbnNpb25CeU5hbWUoCisgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLmFub3RoZXJfZmllbGQnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0ZW5zaW9uLm5hbWUsICdhbm90aGVyX2ZpZWxkJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGV4dGVuc2lvbi5udW1iZXIsIDEwMDIpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICBzZWxmLnBvb2wuRmluZEZpZWxkQnlOYW1lKCdEb2VzIG5vdCBleGlzdCcpCisKKyAgZGVmIHRlc3RGaW5kQWxsRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBmYWN0b3J5MV9tZXNzYWdlID0gc2VsZi5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTFNZXNzYWdlJykKKyAgICBmYWN0b3J5Ml9tZXNzYWdlID0gc2VsZi5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlJykKKyAgICAjIEFuIGV4dGVuc2lvbiBkZWZpbmVkIGluIGEgbWVzc2FnZS4KKyAgICBvbmVfbW9yZV9maWVsZCA9IGZhY3RvcnkyX21lc3NhZ2UuZXh0ZW5zaW9uc19ieV9uYW1lWydvbmVfbW9yZV9maWVsZCddCisgICAgIyBBbiBleHRlbnNpb24gZGVmaW5lZCBhdCBmaWxlIHNjb3BlLgorICAgIGZhY3RvcnlfdGVzdDIgPSBzZWxmLnBvb2wuRmluZEZpbGVCeU5hbWUoCisgICAgICAgICdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0Mi5wcm90bycpCisgICAgYW5vdGhlcl9maWVsZCA9IGZhY3RvcnlfdGVzdDIuZXh0ZW5zaW9uc19ieV9uYW1lWydhbm90aGVyX2ZpZWxkJ10KKworICAgIGV4dGVuc2lvbnMgPSBzZWxmLnBvb2wuRmluZEFsbEV4dGVuc2lvbnMoZmFjdG9yeTFfbWVzc2FnZSkKKyAgICBleHBlY3RlZF9leHRlbnNpb25fbnVtYmVycyA9IHNldChbb25lX21vcmVfZmllbGQsIGFub3RoZXJfZmllbGRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfZXh0ZW5zaW9uX251bWJlcnMsIHNldChleHRlbnNpb25zKSkKKyAgICAjIFZlcmlmeSB0aGF0IG11dGF0aW5nIHRoZSByZXR1cm5lZCBsaXN0IGRvZXMgbm90IGFmZmVjdCB0aGUgcG9vbC4KKyAgICBleHRlbnNpb25zLmFwcGVuZCgndW5leHBlY3RlZF9lbGVtZW50JykKKyAgICAjIEdldCB0aGUgZXh0ZW5zaW9ucyBhZ2FpbiwgdGhlIHJldHVybmVkIHZhbHVlIGRvZXMgbm90IGNvbnRhaW4gdGhlCisgICAgIyAndW5leHBlY3RlZF9lbGVtZW50Jy4KKyAgICBleHRlbnNpb25zID0gc2VsZi5wb29sLkZpbmRBbGxFeHRlbnNpb25zKGZhY3RvcnkxX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9leHRlbnNpb25fbnVtYmVycywgc2V0KGV4dGVuc2lvbnMpKQorCisgIGRlZiB0ZXN0RmluZEV4dGVuc2lvbkJ5TnVtYmVyKHNlbGYpOgorICAgIGZhY3RvcnkxX21lc3NhZ2UgPSBzZWxmLnBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKAorICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5MU1lc3NhZ2UnKQorICAgICMgQnVpbGQgZmFjdG9yeV90ZXN0Mi5wcm90byB3aGljaCB3aWxsIHB1dCBleHRlbnNpb25zIHRvIHRoZSBwb29sCisgICAgc2VsZi5wb29sLkZpbmRGaWxlQnlOYW1lKAorICAgICAgICAnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDIucHJvdG8nKQorCisgICAgIyBBbiBleHRlbnNpb24gZGVmaW5lZCBpbiBhIG1lc3NhZ2UuCisgICAgZXh0ZW5zaW9uID0gc2VsZi5wb29sLkZpbmRFeHRlbnNpb25CeU51bWJlcihmYWN0b3J5MV9tZXNzYWdlLCAxMDAxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0ZW5zaW9uLm5hbWUsICdvbmVfbW9yZV9maWVsZCcpCisgICAgIyBBbiBleHRlbnNpb24gZGVmaW5lZCBhdCBmaWxlIHNjb3BlLgorICAgIGV4dGVuc2lvbiA9IHNlbGYucG9vbC5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZmFjdG9yeTFfbWVzc2FnZSwgMTAwMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKGV4dGVuc2lvbi5uYW1lLCAnYW5vdGhlcl9maWVsZCcpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICBleHRlbnNpb24gPSBzZWxmLnBvb2wuRmluZEV4dGVuc2lvbkJ5TnVtYmVyKGZhY3RvcnkxX21lc3NhZ2UsIDEyMzQ1NjcpCisKKyAgZGVmIHRlc3RFeHRlbnNpb25zQXJlTm90RmllbGRzKHNlbGYpOgorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgc2VsZi5wb29sLkZpbmRGaWVsZEJ5TmFtZSgnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5hbm90aGVyX2ZpZWxkJykKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKKyAgICAgIHNlbGYucG9vbC5GaW5kRmllbGRCeU5hbWUoCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlLm9uZV9tb3JlX2ZpZWxkJykKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKKyAgICAgIHNlbGYucG9vbC5GaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkxTWVzc2FnZS5saXN0X3ZhbHVlJykKKworICBkZWYgdGVzdEZpbmRTZXJ2aWNlKHNlbGYpOgorICAgIHNlcnZpY2UgPSBzZWxmLnBvb2wuRmluZFNlcnZpY2VCeU5hbWUoJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RTZXJ2aWNlJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZpY2UuZnVsbF9uYW1lLCAncHJvdG9idWZfdW5pdHRlc3QuVGVzdFNlcnZpY2UnKQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgc2VsZi5wb29sLkZpbmRTZXJ2aWNlQnlOYW1lKCdEb2VzIG5vdCBleGlzdCcpCisKKyAgICBtZXRob2QgPSBzZWxmLnBvb2wuRmluZE1ldGhvZEJ5TmFtZSgncHJvdG9idWZfdW5pdHRlc3QuVGVzdFNlcnZpY2UuRm9vJykKKyAgICBzZWxmLmFzc2VydElzKG1ldGhvZC5jb250YWluaW5nX3NlcnZpY2UsIHNlcnZpY2UpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICBzZWxmLnBvb2wuRmluZE1ldGhvZEJ5TmFtZSgncHJvdG9idWZfdW5pdHRlc3QuVGVzdFNlcnZpY2UuRG9lc25vdGV4aXN0JykKKworICBkZWYgdGVzdFVzZXJEZWZpbmVkREIoc2VsZik6CisgICAgZGIgPSBkZXNjcmlwdG9yX2RhdGFiYXNlLkRlc2NyaXB0b3JEYXRhYmFzZSgpCisgICAgc2VsZi5wb29sID0gZGVzY3JpcHRvcl9wb29sLkRlc2NyaXB0b3JQb29sKGRiKQorICAgIGRiLkFkZChzZWxmLmZhY3RvcnlfdGVzdDFfZmQpCisgICAgZGIuQWRkKHNlbGYuZmFjdG9yeV90ZXN0Ml9mZCkKKyAgICBzZWxmLnRlc3RGaW5kTWVzc2FnZVR5cGVCeU5hbWUoKQorCisgIGRlZiB0ZXN0QWRkU2VyaWFsaXplZEZpbGUoc2VsZik6CisgICAgaWYgaXNpbnN0YW5jZShzZWxmLCBTZWNvbmRhcnlEZXNjcmlwdG9yRnJvbURlc2NyaXB0b3JEQik6CisgICAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nOgorICAgICAgICAjIENwcCBleHRlbnNpb24gY2Fubm90IGNhbGwgQWRkIG9uIGEgRGVzY3JpcHRvclBvb2wKKyAgICAgICAgIyB0aGF0IHVzZXMgYSBEZXNjcmlwdG9yRGF0YWJhc2UuCisgICAgICAgICMgVE9ETyhqaWVsdW8pOiBGaXggcHl0aG9uIGFuZCBjcHAgZXh0ZW5zaW9uIGRpZmYuCisgICAgICAgIHJldHVybgorICAgIHNlbGYucG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbCgpCisgICAgZmlsZTEgPSBzZWxmLnBvb2wuQWRkU2VyaWFsaXplZEZpbGUoCisgICAgICAgIHNlbGYuZmFjdG9yeV90ZXN0MV9mZC5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIGZpbGUyID0gc2VsZi5wb29sLkFkZFNlcmlhbGl6ZWRGaWxlKAorICAgICAgICBzZWxmLmZhY3RvcnlfdGVzdDJfZmQuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGUxLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDEucHJvdG8nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZTIubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0Mi5wcm90bycpCisgICAgc2VsZi50ZXN0RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCkKKyAgICBmaWxlX2pzb24gPSBzZWxmLnBvb2wuQWRkU2VyaWFsaXplZEZpbGUoCisgICAgICAgIG1vcmVfbWVzc2FnZXNfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYikKKyAgICBmaWVsZCA9IGZpbGVfanNvbi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ2NsYXNzJ10uZmllbGRzX2J5X25hbWVbJ2ludF9maWVsZCddCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaWVsZC5qc29uX25hbWUsICdqc29uX2ludCcpCisKKworICBkZWYgdGVzdEVudW1EZWZhdWx0VmFsdWUoc2VsZik6CisgICAgIiIiVGVzdCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBlbnVtcyB3aGljaCBkb24ndCBzdGFydCBhdCB6ZXJvLiIiIgorICAgIGRlZiBfQ2hlY2tEZWZhdWx0VmFsdWUoZmlsZV9kZXNjcmlwdG9yKToKKyAgICAgIGRlZmF1bHRfdmFsdWUgPSAoZmlsZV9kZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgIC5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ0Rlc2NyaXB0b3JQb29sVGVzdDEnXQorICAgICAgICAgICAgICAgICAgICAgICAuZmllbGRzX2J5X25hbWVbJ25lc3RlZF9lbnVtJ10KKyAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlZmF1bHRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcG9vbF90ZXN0MV9wYjIuRGVzY3JpcHRvclBvb2xUZXN0MS5CRVRBKQorICAgICMgRmlyc3QgY2hlY2sgd2hhdCB0aGUgZ2VuZXJhdGVkIGRlc2NyaXB0b3IgY29udGFpbnMuCisgICAgX0NoZWNrRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3JfcG9vbF90ZXN0MV9wYjIuREVTQ1JJUFRPUikKKyAgICAjIFRoZW4gY2hlY2sgdGhlIGdlbmVyYXRlZCBwb29sLiBOb3JtYWxseSB0aGlzIGlzIHRoZSBzYW1lIGRlc2NyaXB0b3IuCisgICAgZmlsZV9kZXNjcmlwdG9yID0gc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKS5wb29sLkZpbmRGaWxlQnlOYW1lKAorICAgICAgICAnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0MS5wcm90bycpCisgICAgc2VsZi5hc3NlcnRJcyhmaWxlX2Rlc2NyaXB0b3IsIGRlc2NyaXB0b3JfcG9vbF90ZXN0MV9wYjIuREVTQ1JJUFRPUikKKyAgICBfQ2hlY2tEZWZhdWx0VmFsdWUoZmlsZV9kZXNjcmlwdG9yKQorCisgICAgaWYgaXNpbnN0YW5jZShzZWxmLCBTZWNvbmRhcnlEZXNjcmlwdG9yRnJvbURlc2NyaXB0b3JEQik6CisgICAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nOgorICAgICAgICAjIENwcCBleHRlbnNpb24gY2Fubm90IGNhbGwgQWRkIG9uIGEgRGVzY3JpcHRvclBvb2wKKyAgICAgICAgIyB0aGF0IHVzZXMgYSBEZXNjcmlwdG9yRGF0YWJhc2UuCisgICAgICAgICMgVE9ETyhqaWVsdW8pOiBGaXggcHl0aG9uIGFuZCBjcHAgZXh0ZW5zaW9uIGRpZmYuCisgICAgICAgIHJldHVybgorICAgICMgVGhlbiBjaGVjayB0aGUgZHluYW1pYyBwb29sIGFuZCBpdHMgaW50ZXJuYWwgRGVzY3JpcHRvckRhdGFiYXNlLgorICAgIGRlc2NyaXB0b3JfcHJvdG8gPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCisgICAgICAgIGRlc2NyaXB0b3JfcG9vbF90ZXN0MV9wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiKQorICAgIHNlbGYucG9vbC5BZGQoZGVzY3JpcHRvcl9wcm90bykKKyAgICAjIEFuZCBkbyB0aGUgc2FtZSBjaGVjayBhcyBhYm92ZQorICAgIGZpbGVfZGVzY3JpcHRvciA9IHNlbGYucG9vbC5GaW5kRmlsZUJ5TmFtZSgKKyAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Bvb2xfdGVzdDEucHJvdG8nKQorICAgIF9DaGVja0RlZmF1bHRWYWx1ZShmaWxlX2Rlc2NyaXB0b3IpCisKKyAgZGVmIHRlc3REZWZhdWx0VmFsdWVGb3JDdXN0b21NZXNzYWdlcyhzZWxmKToKKyAgICAiIiJDaGVjayB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgbm9uLWV4aXN0ZW50IGZpZWxkcy4iIiIKKyAgICBkZWYgX0NoZWNrVmFsdWVBbmRUeXBlKHZhbHVlLCBleHBlY3RlZF92YWx1ZSwgZXhwZWN0ZWRfdHlwZSk6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCBleHBlY3RlZF92YWx1ZSkKKyAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2YWx1ZSwgZXhwZWN0ZWRfdHlwZSkKKworICAgIGRlZiBfQ2hlY2tEZWZhdWx0VmFsdWVzKG1zZyk6CisgICAgICB0cnk6CisgICAgICAgIGludDY0ID0gbG9uZworICAgICAgZXhjZXB0IE5hbWVFcnJvcjogICMgUHl0aG9uMworICAgICAgICBpbnQ2NCA9IGludAorICAgICAgdHJ5OgorICAgICAgICB1bmljb2RlX3R5cGUgPSB1bmljb2RlCisgICAgICBleGNlcHQgTmFtZUVycm9yOiAgIyBQeXRob24zCisgICAgICAgIHVuaWNvZGVfdHlwZSA9IHN0cgorICAgICAgX0NoZWNrVmFsdWVBbmRUeXBlKG1zZy5vcHRpb25hbF9pbnQzMiwgMCwgaW50KQorICAgICAgX0NoZWNrVmFsdWVBbmRUeXBlKG1zZy5vcHRpb25hbF91aW50NjQsIDAsIChpbnQ2NCwgaW50KSkKKyAgICAgIF9DaGVja1ZhbHVlQW5kVHlwZShtc2cub3B0aW9uYWxfZmxvYXQsIDAsIChmbG9hdCwgaW50KSkKKyAgICAgIF9DaGVja1ZhbHVlQW5kVHlwZShtc2cub3B0aW9uYWxfZG91YmxlLCAwLCAoZmxvYXQsIGludCkpCisgICAgICBfQ2hlY2tWYWx1ZUFuZFR5cGUobXNnLm9wdGlvbmFsX2Jvb2wsIEZhbHNlLCBib29sKQorICAgICAgX0NoZWNrVmFsdWVBbmRUeXBlKG1zZy5vcHRpb25hbF9zdHJpbmcsIHUnJywgdW5pY29kZV90eXBlKQorICAgICAgX0NoZWNrVmFsdWVBbmRUeXBlKG1zZy5vcHRpb25hbF9ieXRlcywgYicnLCBieXRlcykKKyAgICAgIF9DaGVja1ZhbHVlQW5kVHlwZShtc2cub3B0aW9uYWxfbmVzdGVkX2VudW0sIG1zZy5GT08sIGludCkKKyAgICAjIEZpcnN0IGZvciB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UKKyAgICBfQ2hlY2tEZWZhdWx0VmFsdWVzKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKSkKKyAgICAjIFRoZW4gZm9yIGEgbWVzc2FnZSBidWlsdCB3aXRoIGZyb20gdGhlIERlc2NyaXB0b3JQb29sLgorICAgIHBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woKQorICAgIHBvb2wuQWRkKGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKKyAgICAgICAgdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiKSkKKyAgICBwb29sLkFkZChkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCisgICAgICAgIHVuaXR0ZXN0X2ltcG9ydF9wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiKSkKKyAgICBwb29sLkFkZChkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpKQorICAgIG1lc3NhZ2VfY2xhc3MgPSBtZXNzYWdlX2ZhY3RvcnkuTWVzc2FnZUZhY3RvcnkocG9vbCkuR2V0UHJvdG90eXBlKAorICAgICAgICBwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUi5mdWxsX25hbWUpKQorICAgIF9DaGVja0RlZmF1bHRWYWx1ZXMobWVzc2FnZV9jbGFzcygpKQorCisgIGRlZiB0ZXN0QWRkRmlsZURlc2NyaXB0b3Ioc2VsZik6CisgICAgaWYgaXNpbnN0YW5jZShzZWxmLCBTZWNvbmRhcnlEZXNjcmlwdG9yRnJvbURlc2NyaXB0b3JEQik6CisgICAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nOgorICAgICAgICAjIENwcCBleHRlbnNpb24gY2Fubm90IGNhbGwgQWRkIG9uIGEgRGVzY3JpcHRvclBvb2wKKyAgICAgICAgIyB0aGF0IHVzZXMgYSBEZXNjcmlwdG9yRGF0YWJhc2UuCisgICAgICAgICMgVE9ETyhqaWVsdW8pOiBGaXggcHl0aG9uIGFuZCBjcHAgZXh0ZW5zaW9uIGRpZmYuCisgICAgICAgIHJldHVybgorICAgIGZpbGVfZGVzYyA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8obmFtZT0nc29tZS9maWxlLnByb3RvJykKKyAgICBzZWxmLnBvb2wuQWRkKGZpbGVfZGVzYykKKyAgICBzZWxmLnBvb2wuQWRkU2VyaWFsaXplZEZpbGUoZmlsZV9kZXNjLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisKKyAgZGVmIHRlc3RDb21wbGV4TmVzdGluZyhzZWxmKToKKyAgICBpZiBpc2luc3RhbmNlKHNlbGYsIFNlY29uZGFyeURlc2NyaXB0b3JGcm9tRGVzY3JpcHRvckRCKToKKyAgICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgIT0gJ3B5dGhvbic6CisgICAgICAgICMgQ3BwIGV4dGVuc2lvbiBjYW5ub3QgY2FsbCBBZGQgb24gYSBEZXNjcmlwdG9yUG9vbAorICAgICAgICAjIHRoYXQgdXNlcyBhIERlc2NyaXB0b3JEYXRhYmFzZS4KKyAgICAgICAgIyBUT0RPKGppZWx1byk6IEZpeCBweXRob24gYW5kIGNwcCBleHRlbnNpb24gZGlmZi4KKyAgICAgICAgcmV0dXJuCisgICAgbW9yZV9tZXNzYWdlc19kZXNjID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAorICAgICAgICBtb3JlX21lc3NhZ2VzX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpCisgICAgdGVzdDFfZGVzYyA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKKyAgICAgICAgZGVzY3JpcHRvcl9wb29sX3Rlc3QxX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpCisgICAgdGVzdDJfZGVzYyA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKKyAgICAgICAgZGVzY3JpcHRvcl9wb29sX3Rlc3QyX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpCisgICAgc2VsZi5wb29sLkFkZChtb3JlX21lc3NhZ2VzX2Rlc2MpCisgICAgc2VsZi5wb29sLkFkZCh0ZXN0MV9kZXNjKQorICAgIHNlbGYucG9vbC5BZGQodGVzdDJfZGVzYykKKyAgICBURVNUMV9GSUxFLkNoZWNrRmlsZShzZWxmLCBzZWxmLnBvb2wpCisgICAgVEVTVDJfRklMRS5DaGVja0ZpbGUoc2VsZiwgc2VsZi5wb29sKQorCisgIGRlZiB0ZXN0Q29uZmxpY3RSZWdpc3RlcihzZWxmKToKKyAgICBpZiBpc2luc3RhbmNlKHNlbGYsIFNlY29uZGFyeURlc2NyaXB0b3JGcm9tRGVzY3JpcHRvckRCKToKKyAgICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgIT0gJ3B5dGhvbic6CisgICAgICAgICMgQ3BwIGV4dGVuc2lvbiBjYW5ub3QgY2FsbCBBZGQgb24gYSBEZXNjcmlwdG9yUG9vbAorICAgICAgICAjIHRoYXQgdXNlcyBhIERlc2NyaXB0b3JEYXRhYmFzZS4KKyAgICAgICAgIyBUT0RPKGppZWx1byk6IEZpeCBweXRob24gYW5kIGNwcCBleHRlbnNpb24gZGlmZi4KKyAgICAgICAgcmV0dXJuCisgICAgdW5pdHRlc3RfZmQgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpCisgICAgY29uZmxpY3RfZmQgPSBjb3B5LmRlZXBjb3B5KHVuaXR0ZXN0X2ZkKQorICAgIGNvbmZsaWN0X2ZkLm5hbWUgPSAnb3RoZXJfZmlsZScKKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgIHBvb2wgPSBjb3B5LmRlZXBjb3B5KHNlbGYucG9vbCkKKyAgICAgIGZpbGVfZGVzY3JpcHRvciA9IHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SCisgICAgICBwb29sLl9BZGREZXNjcmlwdG9yKAorICAgICAgICAgIGZpbGVfZGVzY3JpcHRvci5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ1Rlc3RBbGxUeXBlcyddKQorICAgICAgcG9vbC5fQWRkRW51bURlc2NyaXB0b3IoCisgICAgICAgICAgZmlsZV9kZXNjcmlwdG9yLmVudW1fdHlwZXNfYnlfbmFtZVsnRm9yZWlnbkVudW0nXSkKKyAgICAgIHBvb2wuX0FkZFNlcnZpY2VEZXNjcmlwdG9yKAorICAgICAgICAgIGZpbGVfZGVzY3JpcHRvci5zZXJ2aWNlc19ieV9uYW1lWydUZXN0U2VydmljZSddKQorICAgICAgcG9vbC5fQWRkRXh0ZW5zaW9uRGVzY3JpcHRvcigKKyAgICAgICAgICBmaWxlX2Rlc2NyaXB0b3IuZXh0ZW5zaW9uc19ieV9uYW1lWydvcHRpb25hbF9pbnQzMl9leHRlbnNpb24nXSkKKyAgICAgIHBvb2wuQWRkKHVuaXR0ZXN0X2ZkKQorICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdhbHdheXMnKQorICAgICAgICBwb29sLkFkZChjb25mbGljdF9mZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh3WzBdLmNhdGVnb3J5LCBSdW50aW1lV2FybmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQ29uZmxpY3QgcmVnaXN0ZXIgZm9yIGZpbGUgIm90aGVyX2ZpbGUiOiAnLAorICAgICAgICAgICAgICAgICAgICAgIHN0cih3WzBdLm1lc3NhZ2UpKQorICAgICAgcG9vbC5GaW5kRmlsZUJ5TmFtZSh1bml0dGVzdF9mZC5uYW1lKQorICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICBwb29sLkZpbmRGaWxlQnlOYW1lKGNvbmZsaWN0X2ZkLm5hbWUpCisKKworQHRlc3RpbmdfcmVmbGVha3MuVGVzdENhc2UKK2NsYXNzIERlZmF1bHREZXNjcmlwdG9yUG9vbFRlc3QoRGVzY3JpcHRvclBvb2xUZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLnBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVmYXVsdCgpCisgICAgc2VsZi5mYWN0b3J5X3Rlc3QxX2ZkID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAorICAgICAgICBmYWN0b3J5X3Rlc3QxX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpCisgICAgc2VsZi5mYWN0b3J5X3Rlc3QyX2ZkID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAorICAgICAgICBmYWN0b3J5X3Rlc3QyX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpCisKKyAgZGVmIHRlc3RGaW5kTWV0aG9kcyhzZWxmKToKKyAgICBzZWxmLmFzc2VydElzKAorICAgICAgICBzZWxmLnBvb2wuRmluZEZpbGVCeU5hbWUoJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bycpLAorICAgICAgICB1bml0dGVzdF9wYjIuREVTQ1JJUFRPUikKKyAgICBzZWxmLmFzc2VydElzKAorICAgICAgICBzZWxmLnBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMnKSwKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SKQorICAgIHNlbGYuYXNzZXJ0SXMoCisgICAgICAgIHNlbGYucG9vbC5GaW5kRmllbGRCeU5hbWUoCisgICAgICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLm9wdGlvbmFsX2ludDMyJyksCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfaW50MzInXSkKKyAgICBzZWxmLmFzc2VydElzKAorICAgICAgICBzZWxmLnBvb2wuRmluZEVudW1UeXBlQnlOYW1lKCdwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bScpLAorICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uREVTQ1JJUFRPUikKKyAgICBzZWxmLmFzc2VydElzKAorICAgICAgICBzZWxmLnBvb2wuRmluZEV4dGVuc2lvbkJ5TmFtZSgKKyAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24nKSwKKyAgICAgICAgdW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IuZXh0ZW5zaW9uc19ieV9uYW1lWydvcHRpb25hbF9pbnQzMl9leHRlbnNpb24nXSkKKyAgICBzZWxmLmFzc2VydElzKAorICAgICAgICBzZWxmLnBvb2wuRmluZE9uZW9mQnlOYW1lKCdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMub25lb2ZfZmllbGQnKSwKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SLm9uZW9mc19ieV9uYW1lWydvbmVvZl9maWVsZCddKQorICAgIHNlbGYuYXNzZXJ0SXMoCisgICAgICAgIHNlbGYucG9vbC5GaW5kU2VydmljZUJ5TmFtZSgncHJvdG9idWZfdW5pdHRlc3QuVGVzdFNlcnZpY2UnKSwKKyAgICAgICAgdW5pdHRlc3RfcGIyLkRFU0NSSVBUT1Iuc2VydmljZXNfYnlfbmFtZVsnVGVzdFNlcnZpY2UnXSkKKworCitAdGVzdGluZ19yZWZsZWFrcy5UZXN0Q2FzZQorY2xhc3MgQ3JlYXRlRGVzY3JpcHRvclBvb2xUZXN0KERlc2NyaXB0b3JQb29sVGVzdEJhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc2VsZi5wb29sID0gZGVzY3JpcHRvcl9wb29sLkRlc2NyaXB0b3JQb29sKCkKKyAgICBzZWxmLmZhY3RvcnlfdGVzdDFfZmQgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCisgICAgICAgIGZhY3RvcnlfdGVzdDFfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYikKKyAgICBzZWxmLmZhY3RvcnlfdGVzdDJfZmQgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCisgICAgICAgIGZhY3RvcnlfdGVzdDJfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYikKKyAgICBzZWxmLnBvb2wuQWRkKHNlbGYuZmFjdG9yeV90ZXN0MV9mZCkKKyAgICBzZWxmLnBvb2wuQWRkKHNlbGYuZmFjdG9yeV90ZXN0Ml9mZCkKKworICAgIHNlbGYucG9vbC5BZGQoZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAorICAgICAgICB1bml0dGVzdF9pbXBvcnRfcHVibGljX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpKQorICAgIHNlbGYucG9vbC5BZGQoZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAorICAgICAgICB1bml0dGVzdF9pbXBvcnRfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYikpCisgICAgc2VsZi5wb29sLkFkZChkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpKQorICAgIHNlbGYucG9vbC5BZGQoZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAorICAgICAgICBub19wYWNrYWdlX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpKQorCisKK0B0ZXN0aW5nX3JlZmxlYWtzLlRlc3RDYXNlCitjbGFzcyBTZWNvbmRhcnlEZXNjcmlwdG9yRnJvbURlc2NyaXB0b3JEQihEZXNjcmlwdG9yUG9vbFRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLmZhY3RvcnlfdGVzdDFfZmQgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCisgICAgICAgIGZhY3RvcnlfdGVzdDFfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYikKKyAgICBzZWxmLmZhY3RvcnlfdGVzdDJfZmQgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCisgICAgICAgIGZhY3RvcnlfdGVzdDJfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYikKKyAgICBzZWxmLmRiID0gZGVzY3JpcHRvcl9kYXRhYmFzZS5EZXNjcmlwdG9yRGF0YWJhc2UoKQorICAgIHNlbGYuZGIuQWRkKHNlbGYuZmFjdG9yeV90ZXN0MV9mZCkKKyAgICBzZWxmLmRiLkFkZChzZWxmLmZhY3RvcnlfdGVzdDJfZmQpCisgICAgc2VsZi5kYi5BZGQoZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAorICAgICAgICB1bml0dGVzdF9pbXBvcnRfcHVibGljX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpKQorICAgIHNlbGYuZGIuQWRkKGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKKyAgICAgICAgdW5pdHRlc3RfaW1wb3J0X3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpKQorICAgIHNlbGYuZGIuQWRkKGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKKyAgICAgICAgdW5pdHRlc3RfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYikpCisgICAgc2VsZi5kYi5BZGQoZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAorICAgICAgICBub19wYWNrYWdlX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpKQorICAgIHNlbGYucG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbChkZXNjcmlwdG9yX2RiPXNlbGYuZGIpCisKKyAgZGVmIHRlc3RFcnJvckNvbGxlY3RvcihzZWxmKToKKyAgICBmaWxlX3Byb3RvID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bygpCisgICAgZmlsZV9wcm90by5wYWNrYWdlID0gJ2NvbGxlY3RvcicKKyAgICBmaWxlX3Byb3RvLm5hbWUgPSAnZXJyb3JfZmlsZScKKyAgICBtZXNzYWdlX3R5cGUgPSBmaWxlX3Byb3RvLm1lc3NhZ2VfdHlwZS5hZGQoKQorICAgIG1lc3NhZ2VfdHlwZS5uYW1lID0gJ0Vycm9yTWVzc2FnZScKKyAgICBmaWVsZCA9IG1lc3NhZ2VfdHlwZS5maWVsZC5hZGQoKQorICAgIGZpZWxkLm51bWJlciA9IDEKKyAgICBmaWVsZC5uYW1lID0gJ25lc3RlZF9tZXNzYWdlX2ZpZWxkJworICAgIGZpZWxkLmxhYmVsID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfT1BUSU9OQUwKKyAgICBmaWVsZC50eXBlID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFCisgICAgZmllbGQudHlwZV9uYW1lID0gJ1N1Yk1lc3NhZ2UnCisgICAgb25lb2YgPSBtZXNzYWdlX3R5cGUub25lb2ZfZGVjbC5hZGQoKQorICAgIG9uZW9mLm5hbWUgPSAnTXlPbmVvZicKKyAgICBlbnVtX3R5cGUgPSBmaWxlX3Byb3RvLmVudW1fdHlwZS5hZGQoKQorICAgIGVudW1fdHlwZS5uYW1lID0gJ015RW51bScKKyAgICBlbnVtX3ZhbHVlID0gZW51bV90eXBlLnZhbHVlLmFkZCgpCisgICAgZW51bV92YWx1ZS5uYW1lID0gJ015RW51bVZhbHVlJworICAgIGVudW1fdmFsdWUubnVtYmVyID0gMAorICAgIHNlbGYuZGIuQWRkKGZpbGVfcHJvdG8pCisKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KEtleUVycm9yLCAnU3ViTWVzc2FnZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbGxlY3Rvci5FcnJvck1lc3NhZ2UnKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoS2V5RXJyb3IsICdTdWJNZXNzYWdlJywgc2VsZi5wb29sLkZpbmRGaWxlQnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yX2ZpbGUnKQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpIGFzIGV4YzoKKyAgICAgIHNlbGYucG9vbC5GaW5kRmlsZUJ5TmFtZSgnbm9uZV9maWxlJykKKyAgICBzZWxmLmFzc2VydEluKHN0cihleGMuZXhjZXB0aW9uKSwgKCdcJ25vbmVfZmlsZVwnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcIkNvdWxkblwndCBmaW5kIGZpbGUgbm9uZV9maWxlXCInKSkKKworICAgICMgUHVyZSBweXRob24gX0NvbnZlcnRGaWxlUHJvdG9Ub0ZpbGVEZXNjcmlwdG9yKCkgbWV0aG9kIGhhcyBzaWRlIGVmZmVjdAorICAgICMgdGhhdCBhbGwgdGhlIHN5bWJvbHMgZm91bmQgaW4gdGhlIGZpbGUgd2lsbCBsb2FkIGludG8gdGhlIHBvb2wgZXZlbiB0aGUKKyAgICAjIGZpbGUgY2FuIG5vdCBidWlsZC4gU28gd2hlbiBGaW5kTWVzc2FnZVR5cGVCeU5hbWUoJ0Vycm9yTWVzc2FnZScpIHdhcworICAgICMgY2FsbGVkIHRoZSBmaXJzdCB0aW1lLCBhIEtleUVycm9yIHdpbGwgYmUgcmFpc2VkIGJ1dCBjYWxsIHRoZSBmaW5kCisgICAgIyBtZXRob2QgbGF0ZXIgd2lsbCByZXR1cm4gYSBkZXNjcmlwdG9yIHdoaWNoIGlzIG5vdCBidWlsZC4KKyAgICAjIFRPRE8oamllbHVvKTogZml4IHB1cmUgcHl0aG9uIHRvIHJldmVydCB0aGUgbG9hZCBpZiBmaWxlIGNhbiBub3QgYmUgYnVpbGQKKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nOgorICAgICAgZXJyb3JfbXNnID0gKCdJbnZhbGlkIHByb3RvIGRlc2NyaXB0b3IgZm9yIGZpbGUgImVycm9yX2ZpbGUiOlxcbiAgJworICAgICAgICAgICAgICAgICAgICdjb2xsZWN0b3IuRXJyb3JNZXNzYWdlLm5lc3RlZF9tZXNzYWdlX2ZpZWxkOiAiU3ViTWVzc2FnZSIgJworICAgICAgICAgICAgICAgICAgICdpcyBub3QgZGVmaW5lZC5cXG4gIGNvbGxlY3Rvci5FcnJvck1lc3NhZ2UuTXlPbmVvZjogT25lb2YgJworICAgICAgICAgICAgICAgICAgICdtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGZpZWxkLlxcblwnJykKKyAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpIGFzIGV4YzoKKyAgICAgICAgc2VsZi5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgnY29sbGVjdG9yLkVycm9yTWVzc2FnZScpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihleGMuZXhjZXB0aW9uKSwgJ1wnQ291bGRuXFxcJ3QgYnVpbGQgZmlsZSBmb3IgJworICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZSBjb2xsZWN0b3IuRXJyb3JNZXNzYWdlXFxuJyArIGVycm9yX21zZykKKworICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcikgYXMgZXhjOgorICAgICAgICBzZWxmLnBvb2wuRmluZEZpZWxkQnlOYW1lKCdjb2xsZWN0b3IuRXJyb3JNZXNzYWdlLm5lc3RlZF9tZXNzYWdlX2ZpZWxkJykKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGV4Yy5leGNlcHRpb24pLCAnXCdDb3VsZG5cXFwndCBidWlsZCBmaWxlIGZvciBmaWVsZCcKKyAgICAgICAgICAgICAgICAgICAgICAgJyBjb2xsZWN0b3IuRXJyb3JNZXNzYWdlLm5lc3RlZF9tZXNzYWdlX2ZpZWxkXFxuJworICAgICAgICAgICAgICAgICAgICAgICArIGVycm9yX21zZykKKworICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcikgYXMgZXhjOgorICAgICAgICBzZWxmLnBvb2wuRmluZEVudW1UeXBlQnlOYW1lKCdjb2xsZWN0b3IuTXlFbnVtJykKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGV4Yy5leGNlcHRpb24pLCAnXCdDb3VsZG5cXFwndCBidWlsZCBmaWxlIGZvciBlbnVtJworICAgICAgICAgICAgICAgICAgICAgICAnIGNvbGxlY3Rvci5NeUVudW1cXG4nICsgZXJyb3JfbXNnKQorCisgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKSBhcyBleGM6CisgICAgICAgIHNlbGYucG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woJ2NvbGxlY3Rvci5NeUVudW1WYWx1ZScpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihleGMuZXhjZXB0aW9uKSwgJ1wnQ291bGRuXFxcJ3QgYnVpbGQgZmlsZSBmb3Igc3ltYm9sJworICAgICAgICAgICAgICAgICAgICAgICAnIGNvbGxlY3Rvci5NeUVudW1WYWx1ZVxcbicgKyBlcnJvcl9tc2cpCisKKyAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpIGFzIGV4YzoKKyAgICAgICAgc2VsZi5wb29sLkZpbmRPbmVvZkJ5TmFtZSgnY29sbGVjdG9yLkVycm9yTWVzc2FnZS5NeU9uZW9mJykKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGV4Yy5leGNlcHRpb24pLCAnXCdDb3VsZG5cXFwndCBidWlsZCBmaWxlIGZvciBvbmVvZicKKyAgICAgICAgICAgICAgICAgICAgICAgJyBjb2xsZWN0b3IuRXJyb3JNZXNzYWdlLk15T25lb2ZcXG4nICsgZXJyb3JfbXNnKQorCisKK2NsYXNzIFByb3RvRmlsZShvYmplY3QpOgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwYWNrYWdlLCBtZXNzYWdlcywgZGVwZW5kZW5jaWVzPU5vbmUsCisgICAgICAgICAgICAgICBwdWJsaWNfZGVwZW5kZW5jaWVzPU5vbmUpOgorICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICBzZWxmLnBhY2thZ2UgPSBwYWNrYWdlCisgICAgc2VsZi5tZXNzYWdlcyA9IG1lc3NhZ2VzCisgICAgc2VsZi5kZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMgb3IgW10KKyAgICBzZWxmLnB1YmxpY19kZXBlbmRlbmNpZXMgPSBwdWJsaWNfZGVwZW5kZW5jaWVzIG9yIFtdCisKKyAgZGVmIENoZWNrRmlsZShzZWxmLCB0ZXN0LCBwb29sKToKKyAgICBmaWxlX2Rlc2MgPSBwb29sLkZpbmRGaWxlQnlOYW1lKHNlbGYubmFtZSkKKyAgICB0ZXN0LmFzc2VydEVxdWFsKHNlbGYubmFtZSwgZmlsZV9kZXNjLm5hbWUpCisgICAgdGVzdC5hc3NlcnRFcXVhbChzZWxmLnBhY2thZ2UsIGZpbGVfZGVzYy5wYWNrYWdlKQorICAgIGRlcGVuZGVuY2llc19uYW1lcyA9IFtmLm5hbWUgZm9yIGYgaW4gZmlsZV9kZXNjLmRlcGVuZGVuY2llc10KKyAgICB0ZXN0LmFzc2VydEVxdWFsKHNlbGYuZGVwZW5kZW5jaWVzLCBkZXBlbmRlbmNpZXNfbmFtZXMpCisgICAgcHVibGljX2RlcGVuZGVuY2llc19uYW1lcyA9IFtmLm5hbWUgZm9yIGYgaW4gZmlsZV9kZXNjLnB1YmxpY19kZXBlbmRlbmNpZXNdCisgICAgdGVzdC5hc3NlcnRFcXVhbChzZWxmLnB1YmxpY19kZXBlbmRlbmNpZXMsIHB1YmxpY19kZXBlbmRlbmNpZXNfbmFtZXMpCisgICAgZm9yIG5hbWUsIG1zZ190eXBlIGluIHNlbGYubWVzc2FnZXMuaXRlbXMoKToKKyAgICAgIG1zZ190eXBlLkNoZWNrVHlwZSh0ZXN0LCBOb25lLCBuYW1lLCBmaWxlX2Rlc2MpCisKKworY2xhc3MgRW51bVR5cGUob2JqZWN0KToKKworICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWVzKToKKyAgICBzZWxmLnZhbHVlcyA9IHZhbHVlcworCisgIGRlZiBDaGVja1R5cGUoc2VsZiwgdGVzdCwgbXNnX2Rlc2MsIG5hbWUsIGZpbGVfZGVzYyk6CisgICAgZW51bV9kZXNjID0gbXNnX2Rlc2MuZW51bV90eXBlc19ieV9uYW1lW25hbWVdCisgICAgdGVzdC5hc3NlcnRFcXVhbChuYW1lLCBlbnVtX2Rlc2MubmFtZSkKKyAgICBleHBlY3RlZF9lbnVtX2Z1bGxfbmFtZSA9ICcuJy5qb2luKFttc2dfZGVzYy5mdWxsX25hbWUsIG5hbWVdKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfZW51bV9mdWxsX25hbWUsIGVudW1fZGVzYy5mdWxsX25hbWUpCisgICAgdGVzdC5hc3NlcnRFcXVhbChtc2dfZGVzYywgZW51bV9kZXNjLmNvbnRhaW5pbmdfdHlwZSkKKyAgICB0ZXN0LmFzc2VydEVxdWFsKGZpbGVfZGVzYywgZW51bV9kZXNjLmZpbGUpCisgICAgZm9yIGluZGV4LCAodmFsdWUsIG51bWJlcikgaW4gZW51bWVyYXRlKHNlbGYudmFsdWVzKToKKyAgICAgIHZhbHVlX2Rlc2MgPSBlbnVtX2Rlc2MudmFsdWVzX2J5X25hbWVbdmFsdWVdCisgICAgICB0ZXN0LmFzc2VydEVxdWFsKHZhbHVlLCB2YWx1ZV9kZXNjLm5hbWUpCisgICAgICB0ZXN0LmFzc2VydEVxdWFsKGluZGV4LCB2YWx1ZV9kZXNjLmluZGV4KQorICAgICAgdGVzdC5hc3NlcnRFcXVhbChudW1iZXIsIHZhbHVlX2Rlc2MubnVtYmVyKQorICAgICAgdGVzdC5hc3NlcnRFcXVhbChlbnVtX2Rlc2MsIHZhbHVlX2Rlc2MudHlwZSkKKyAgICAgIHRlc3QuYXNzZXJ0SW4odmFsdWUsIG1zZ19kZXNjLmVudW1fdmFsdWVzX2J5X25hbWUpCisKKworY2xhc3MgTWVzc2FnZVR5cGUob2JqZWN0KToKKworICBkZWYgX19pbml0X18oc2VsZiwgdHlwZV9kaWN0LCBmaWVsZF9saXN0LCBpc19leHRlbmRhYmxlPUZhbHNlLAorICAgICAgICAgICAgICAgZXh0ZW5zaW9ucz1Ob25lKToKKyAgICBzZWxmLnR5cGVfZGljdCA9IHR5cGVfZGljdAorICAgIHNlbGYuZmllbGRfbGlzdCA9IGZpZWxkX2xpc3QKKyAgICBzZWxmLmlzX2V4dGVuZGFibGUgPSBpc19leHRlbmRhYmxlCisgICAgc2VsZi5leHRlbnNpb25zID0gZXh0ZW5zaW9ucyBvciBbXQorCisgIGRlZiBDaGVja1R5cGUoc2VsZiwgdGVzdCwgY29udGFpbmluZ190eXBlX2Rlc2MsIG5hbWUsIGZpbGVfZGVzYyk6CisgICAgaWYgY29udGFpbmluZ190eXBlX2Rlc2MgaXMgTm9uZToKKyAgICAgIGRlc2MgPSBmaWxlX2Rlc2MubWVzc2FnZV90eXBlc19ieV9uYW1lW25hbWVdCisgICAgICBleHBlY3RlZF9mdWxsX25hbWUgPSAnLicuam9pbihbZmlsZV9kZXNjLnBhY2thZ2UsIG5hbWVdKQorICAgIGVsc2U6CisgICAgICBkZXNjID0gY29udGFpbmluZ190eXBlX2Rlc2MubmVzdGVkX3R5cGVzX2J5X25hbWVbbmFtZV0KKyAgICAgIGV4cGVjdGVkX2Z1bGxfbmFtZSA9ICcuJy5qb2luKFtjb250YWluaW5nX3R5cGVfZGVzYy5mdWxsX25hbWUsIG5hbWVdKQorCisgICAgdGVzdC5hc3NlcnRFcXVhbChuYW1lLCBkZXNjLm5hbWUpCisgICAgdGVzdC5hc3NlcnRFcXVhbChleHBlY3RlZF9mdWxsX25hbWUsIGRlc2MuZnVsbF9uYW1lKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoY29udGFpbmluZ190eXBlX2Rlc2MsIGRlc2MuY29udGFpbmluZ190eXBlKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoZGVzYy5maWxlLCBmaWxlX2Rlc2MpCisgICAgdGVzdC5hc3NlcnRFcXVhbChzZWxmLmlzX2V4dGVuZGFibGUsIGRlc2MuaXNfZXh0ZW5kYWJsZSkKKyAgICBmb3IgbmFtZSwgc3VidHlwZSBpbiBzZWxmLnR5cGVfZGljdC5pdGVtcygpOgorICAgICAgc3VidHlwZS5DaGVja1R5cGUodGVzdCwgZGVzYywgbmFtZSwgZmlsZV9kZXNjKQorCisgICAgZm9yIGluZGV4LCAobmFtZSwgZmllbGQpIGluIGVudW1lcmF0ZShzZWxmLmZpZWxkX2xpc3QpOgorICAgICAgZmllbGQuQ2hlY2tGaWVsZCh0ZXN0LCBkZXNjLCBuYW1lLCBpbmRleCwgZmlsZV9kZXNjKQorCisgICAgZm9yIGluZGV4LCAobmFtZSwgZmllbGQpIGluIGVudW1lcmF0ZShzZWxmLmV4dGVuc2lvbnMpOgorICAgICAgZmllbGQuQ2hlY2tGaWVsZCh0ZXN0LCBkZXNjLCBuYW1lLCBpbmRleCwgZmlsZV9kZXNjKQorCisKK2NsYXNzIEVudW1GaWVsZChvYmplY3QpOgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBudW1iZXIsIHR5cGVfbmFtZSwgZGVmYXVsdF92YWx1ZSk6CisgICAgc2VsZi5udW1iZXIgPSBudW1iZXIKKyAgICBzZWxmLnR5cGVfbmFtZSA9IHR5cGVfbmFtZQorICAgIHNlbGYuZGVmYXVsdF92YWx1ZSA9IGRlZmF1bHRfdmFsdWUKKworICBkZWYgQ2hlY2tGaWVsZChzZWxmLCB0ZXN0LCBtc2dfZGVzYywgbmFtZSwgaW5kZXgsIGZpbGVfZGVzYyk6CisgICAgZmllbGRfZGVzYyA9IG1zZ19kZXNjLmZpZWxkc19ieV9uYW1lW25hbWVdCisgICAgZW51bV9kZXNjID0gbXNnX2Rlc2MuZW51bV90eXBlc19ieV9uYW1lW3NlbGYudHlwZV9uYW1lXQorICAgIHRlc3QuYXNzZXJ0RXF1YWwobmFtZSwgZmllbGRfZGVzYy5uYW1lKQorICAgIGV4cGVjdGVkX2ZpZWxkX2Z1bGxfbmFtZSA9ICcuJy5qb2luKFttc2dfZGVzYy5mdWxsX25hbWUsIG5hbWVdKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfZmllbGRfZnVsbF9uYW1lLCBmaWVsZF9kZXNjLmZ1bGxfbmFtZSkKKyAgICB0ZXN0LmFzc2VydEVxdWFsKGluZGV4LCBmaWVsZF9kZXNjLmluZGV4KQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoc2VsZi5udW1iZXIsIGZpZWxkX2Rlc2MubnVtYmVyKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNLCBmaWVsZF9kZXNjLnR5cGUpCisgICAgdGVzdC5hc3NlcnRFcXVhbChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0VOVU0sCisgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kZXNjLmNwcF90eXBlKQorICAgIHRlc3QuYXNzZXJ0VHJ1ZShmaWVsZF9kZXNjLmhhc19kZWZhdWx0X3ZhbHVlKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoZW51bV9kZXNjLnZhbHVlc19ieV9uYW1lW3NlbGYuZGVmYXVsdF92YWx1ZV0ubnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlKQorICAgIHRlc3QuYXNzZXJ0RmFsc2UoZW51bV9kZXNjLnZhbHVlc19ieV9uYW1lW3NlbGYuZGVmYXVsdF92YWx1ZV0uaGFzX29wdGlvbnMpCisgICAgdGVzdC5hc3NlcnRFcXVhbChtc2dfZGVzYywgZmllbGRfZGVzYy5jb250YWluaW5nX3R5cGUpCisgICAgdGVzdC5hc3NlcnRFcXVhbChlbnVtX2Rlc2MsIGZpZWxkX2Rlc2MuZW51bV90eXBlKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoZmlsZV9kZXNjLCBlbnVtX2Rlc2MuZmlsZSkKKworCitjbGFzcyBNZXNzYWdlRmllbGQob2JqZWN0KToKKworICBkZWYgX19pbml0X18oc2VsZiwgbnVtYmVyLCB0eXBlX25hbWUpOgorICAgIHNlbGYubnVtYmVyID0gbnVtYmVyCisgICAgc2VsZi50eXBlX25hbWUgPSB0eXBlX25hbWUKKworICBkZWYgQ2hlY2tGaWVsZChzZWxmLCB0ZXN0LCBtc2dfZGVzYywgbmFtZSwgaW5kZXgsIGZpbGVfZGVzYyk6CisgICAgZmllbGRfZGVzYyA9IG1zZ19kZXNjLmZpZWxkc19ieV9uYW1lW25hbWVdCisgICAgZmllbGRfdHlwZV9kZXNjID0gbXNnX2Rlc2MubmVzdGVkX3R5cGVzX2J5X25hbWVbc2VsZi50eXBlX25hbWVdCisgICAgdGVzdC5hc3NlcnRFcXVhbChuYW1lLCBmaWVsZF9kZXNjLm5hbWUpCisgICAgZXhwZWN0ZWRfZmllbGRfZnVsbF9uYW1lID0gJy4nLmpvaW4oW21zZ19kZXNjLmZ1bGxfbmFtZSwgbmFtZV0pCisgICAgdGVzdC5hc3NlcnRFcXVhbChleHBlY3RlZF9maWVsZF9mdWxsX25hbWUsIGZpZWxkX2Rlc2MuZnVsbF9uYW1lKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoaW5kZXgsIGZpZWxkX2Rlc2MuaW5kZXgpCisgICAgdGVzdC5hc3NlcnRFcXVhbChzZWxmLm51bWJlciwgZmllbGRfZGVzYy5udW1iZXIpCisgICAgdGVzdC5hc3NlcnRFcXVhbChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0UsIGZpZWxkX2Rlc2MudHlwZSkKKyAgICB0ZXN0LmFzc2VydEVxdWFsKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2Rlc2MuY3BwX3R5cGUpCisgICAgdGVzdC5hc3NlcnRGYWxzZShmaWVsZF9kZXNjLmhhc19kZWZhdWx0X3ZhbHVlKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwobXNnX2Rlc2MsIGZpZWxkX2Rlc2MuY29udGFpbmluZ190eXBlKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoZmllbGRfdHlwZV9kZXNjLCBmaWVsZF9kZXNjLm1lc3NhZ2VfdHlwZSkKKyAgICB0ZXN0LmFzc2VydEVxdWFsKGZpbGVfZGVzYywgZmllbGRfZGVzYy5maWxlKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlLCBOb25lKQorCisKK2NsYXNzIFN0cmluZ0ZpZWxkKG9iamVjdCk6CisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG51bWJlciwgZGVmYXVsdF92YWx1ZSk6CisgICAgc2VsZi5udW1iZXIgPSBudW1iZXIKKyAgICBzZWxmLmRlZmF1bHRfdmFsdWUgPSBkZWZhdWx0X3ZhbHVlCisKKyAgZGVmIENoZWNrRmllbGQoc2VsZiwgdGVzdCwgbXNnX2Rlc2MsIG5hbWUsIGluZGV4LCBmaWxlX2Rlc2MpOgorICAgIGZpZWxkX2Rlc2MgPSBtc2dfZGVzYy5maWVsZHNfYnlfbmFtZVtuYW1lXQorICAgIHRlc3QuYXNzZXJ0RXF1YWwobmFtZSwgZmllbGRfZGVzYy5uYW1lKQorICAgIGV4cGVjdGVkX2ZpZWxkX2Z1bGxfbmFtZSA9ICcuJy5qb2luKFttc2dfZGVzYy5mdWxsX25hbWUsIG5hbWVdKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfZmllbGRfZnVsbF9uYW1lLCBmaWVsZF9kZXNjLmZ1bGxfbmFtZSkKKyAgICB0ZXN0LmFzc2VydEVxdWFsKGluZGV4LCBmaWVsZF9kZXNjLmluZGV4KQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoc2VsZi5udW1iZXIsIGZpZWxkX2Rlc2MubnVtYmVyKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkcsIGZpZWxkX2Rlc2MudHlwZSkKKyAgICB0ZXN0LmFzc2VydEVxdWFsKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGVzYy5jcHBfdHlwZSkKKyAgICB0ZXN0LmFzc2VydFRydWUoZmllbGRfZGVzYy5oYXNfZGVmYXVsdF92YWx1ZSkKKyAgICB0ZXN0LmFzc2VydEVxdWFsKHNlbGYuZGVmYXVsdF92YWx1ZSwgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoZmlsZV9kZXNjLCBmaWVsZF9kZXNjLmZpbGUpCisKKworY2xhc3MgRXh0ZW5zaW9uRmllbGQob2JqZWN0KToKKworICBkZWYgX19pbml0X18oc2VsZiwgbnVtYmVyLCBleHRlbmRlZF90eXBlKToKKyAgICBzZWxmLm51bWJlciA9IG51bWJlcgorICAgIHNlbGYuZXh0ZW5kZWRfdHlwZSA9IGV4dGVuZGVkX3R5cGUKKworICBkZWYgQ2hlY2tGaWVsZChzZWxmLCB0ZXN0LCBtc2dfZGVzYywgbmFtZSwgaW5kZXgsIGZpbGVfZGVzYyk6CisgICAgZmllbGRfZGVzYyA9IG1zZ19kZXNjLmV4dGVuc2lvbnNfYnlfbmFtZVtuYW1lXQorICAgIHRlc3QuYXNzZXJ0RXF1YWwobmFtZSwgZmllbGRfZGVzYy5uYW1lKQorICAgIGV4cGVjdGVkX2ZpZWxkX2Z1bGxfbmFtZSA9ICcuJy5qb2luKFttc2dfZGVzYy5mdWxsX25hbWUsIG5hbWVdKQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfZmllbGRfZnVsbF9uYW1lLCBmaWVsZF9kZXNjLmZ1bGxfbmFtZSkKKyAgICB0ZXN0LmFzc2VydEVxdWFsKHNlbGYubnVtYmVyLCBmaWVsZF9kZXNjLm51bWJlcikKKyAgICB0ZXN0LmFzc2VydEVxdWFsKGluZGV4LCBmaWVsZF9kZXNjLmluZGV4KQorICAgIHRlc3QuYXNzZXJ0RXF1YWwoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFLCBmaWVsZF9kZXNjLnR5cGUpCisgICAgdGVzdC5hc3NlcnRFcXVhbChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0UsCisgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kZXNjLmNwcF90eXBlKQorICAgIHRlc3QuYXNzZXJ0RmFsc2UoZmllbGRfZGVzYy5oYXNfZGVmYXVsdF92YWx1ZSkKKyAgICB0ZXN0LmFzc2VydFRydWUoZmllbGRfZGVzYy5pc19leHRlbnNpb24pCisgICAgdGVzdC5hc3NlcnRFcXVhbChtc2dfZGVzYywgZmllbGRfZGVzYy5leHRlbnNpb25fc2NvcGUpCisgICAgdGVzdC5hc3NlcnRFcXVhbChtc2dfZGVzYywgZmllbGRfZGVzYy5tZXNzYWdlX3R5cGUpCisgICAgdGVzdC5hc3NlcnRFcXVhbChzZWxmLmV4dGVuZGVkX3R5cGUsIGZpZWxkX2Rlc2MuY29udGFpbmluZ190eXBlLm5hbWUpCisgICAgdGVzdC5hc3NlcnRFcXVhbChmaWxlX2Rlc2MsIGZpZWxkX2Rlc2MuZmlsZSkKKworCitAdGVzdGluZ19yZWZsZWFrcy5UZXN0Q2FzZQorY2xhc3MgQWRkRGVzY3JpcHRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiBfVGVzdE1lc3NhZ2Uoc2VsZiwgcHJlZml4KToKKyAgICBwb29sID0gZGVzY3JpcHRvcl9wb29sLkRlc2NyaXB0b3JQb29sKCkKKyAgICBwb29sLl9BZGREZXNjcmlwdG9yKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzJywKKyAgICAgICAgcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCisgICAgICAgICAgICBwcmVmaXggKyAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzJykuZnVsbF9uYW1lKQorCisgICAgIyBBZGREZXNjcmlwdG9yIGlzIG5vdCByZWN1cnNpdmUuCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICBwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgICBwcmVmaXggKyAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnKQorCisgICAgcG9vbC5fQWRkRGVzY3JpcHRvcih1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuREVTQ1JJUFRPUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLAorICAgICAgICBwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgICAgIHByZWZpeCArICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZScpLmZ1bGxfbmFtZSkKKworICAgICMgRmlsZXMgYXJlIGltcGxpY2l0bHkgYWxzbyBpbmRleGVkIHdoZW4gbWVzc2FnZXMgYXJlIGFkZGVkLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nLAorICAgICAgICBwb29sLkZpbmRGaWxlQnlOYW1lKAorICAgICAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bycpLm5hbWUpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvJywKKyAgICAgICAgcG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgICAgICAgICBwcmVmaXggKyAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnKS5uYW1lKQorCisgIEB1bml0dGVzdC5za2lwSWYoYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAncHl0aG9uJywKKyAgICAgICAgICAgICAgICAgICAnT25seSBwdXJlIHB5dGhvbiBhbGxvd3MgX0FkZCooKScpCisgIGRlZiB0ZXN0TWVzc2FnZShzZWxmKToKKyAgICBzZWxmLl9UZXN0TWVzc2FnZSgnJykKKyAgICBzZWxmLl9UZXN0TWVzc2FnZSgnLicpCisKKyAgZGVmIF9UZXN0RW51bShzZWxmLCBwcmVmaXgpOgorICAgIHBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woKQorICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ2NwcCc6CisgICAgICBwb29sLkFkZEVudW1EZXNjcmlwdG9yKHVuaXR0ZXN0X3BiMi5Gb3JlaWduRW51bS5ERVNDUklQVE9SKQorICAgIGVsc2U6CisgICAgICBwb29sLl9BZGRFbnVtRGVzY3JpcHRvcih1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uREVTQ1JJUFRPUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbkVudW0nLAorICAgICAgICBwb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgKKyAgICAgICAgICAgIHByZWZpeCArICdwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bScpLmZ1bGxfbmFtZSkKKworICAgICMgQWRkRW51bURlc2NyaXB0b3IgaXMgbm90IHJlY3Vyc2l2ZS4KKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKKyAgICAgIHBvb2wuRmluZEVudW1UeXBlQnlOYW1lKAorICAgICAgICAgIHByZWZpeCArICdwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bS5OZXN0ZWRFbnVtJykKKworICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ2NwcCc6CisgICAgICBwb29sLkFkZEVudW1EZXNjcmlwdG9yKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5ERVNDUklQVE9SKQorICAgIGVsc2U6CisgICAgICBwb29sLl9BZGRFbnVtRGVzY3JpcHRvcih1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uREVTQ1JJUFRPUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0nLAorICAgICAgICBwb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgKKyAgICAgICAgICAgIHByZWZpeCArICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScpLmZ1bGxfbmFtZSkKKworICAgICMgRmlsZXMgYXJlIGltcGxpY2l0bHkgYWxzbyBpbmRleGVkIHdoZW4gZW51bXMgYXJlIGFkZGVkLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nLAorICAgICAgICBwb29sLkZpbmRGaWxlQnlOYW1lKAorICAgICAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bycpLm5hbWUpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvJywKKyAgICAgICAgcG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgICAgICAgICBwcmVmaXggKyAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0nKS5uYW1lKQorCisgIEB1bml0dGVzdC5za2lwSWYoYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAncHl0aG9uJywKKyAgICAgICAgICAgICAgICAgICAnT25seSBwdXJlIHB5dGhvbiBhbGxvd3MgX0FkZCooKScpCisgIGRlZiB0ZXN0RW51bShzZWxmKToKKyAgICBzZWxmLl9UZXN0RW51bSgnJykKKyAgICBzZWxmLl9UZXN0RW51bSgnLicpCisKKyAgQHVuaXR0ZXN0LnNraXBJZihhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nLAorICAgICAgICAgICAgICAgICAgICdPbmx5IHB1cmUgcHl0aG9uIGFsbG93cyBfQWRkKigpJykKKyAgZGVmIHRlc3RTZXJ2aWNlKHNlbGYpOgorICAgIHBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woKQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgcG9vbC5GaW5kU2VydmljZUJ5TmFtZSgncHJvdG9idWZfdW5pdHRlc3QuVGVzdFNlcnZpY2UnKQorICAgIHBvb2wuX0FkZFNlcnZpY2VEZXNjcmlwdG9yKHVuaXR0ZXN0X3BiMi5fVEVTVFNFUlZJQ0UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RTZXJ2aWNlJywKKyAgICAgICAgcG9vbC5GaW5kU2VydmljZUJ5TmFtZSgncHJvdG9idWZfdW5pdHRlc3QuVGVzdFNlcnZpY2UnKS5mdWxsX25hbWUpCisKKyAgQHVuaXR0ZXN0LnNraXBJZihhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nLAorICAgICAgICAgICAgICAgICAgICdPbmx5IHB1cmUgcHl0aG9uIGFsbG93cyBfQWRkKigpJykKKyAgZGVmIHRlc3RGaWxlKHNlbGYpOgorICAgIHBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woKQorICAgIHBvb2wuX0FkZEZpbGVEZXNjcmlwdG9yKHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nLAorICAgICAgICBwb29sLkZpbmRGaWxlQnlOYW1lKAorICAgICAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bycpLm5hbWUpCisKKyAgICAjIEFkZEZpbGVEZXNjcmlwdG9yIGlzIG5vdCByZWN1cnNpdmU7IG1lc3NhZ2VzIGFuZCBlbnVtcyB3aXRoaW4gZmlsZXMgbXVzdAorICAgICMgYmUgZXhwbGljaXRseSByZWdpc3RlcmVkLgorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgcG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcycpCisKKyAgZGVmIHRlc3RFbXB0eURlc2NyaXB0b3JQb29sKHNlbGYpOgorICAgICMgQ2hlY2sgdGhhdCBhbiBlbXB0eSBEZXNjcmlwdG9yUG9vbCgpIGNvbnRhaW5zIG5vIG1lc3NhZ2VzLgorICAgIHBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woKQorICAgIHByb3RvX2ZpbGVfbmFtZSA9IGRlc2NyaXB0b3JfcGIyLkRFU0NSSVBUT1IubmFtZQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBwb29sLkZpbmRGaWxlQnlOYW1lLCBwcm90b19maWxlX25hbWUpCisgICAgIyBBZGQgdGhlIGFib3ZlIGZpbGUgdG8gdGhlIHBvb2wKKyAgICBmaWxlX2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvKCkKKyAgICBkZXNjcmlwdG9yX3BiMi5ERVNDUklQVE9SLkNvcHlUb1Byb3RvKGZpbGVfZGVzY3JpcHRvcikKKyAgICBwb29sLkFkZChmaWxlX2Rlc2NyaXB0b3IpCisgICAgIyBOb3cgaXQgZXhpc3RzLgorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb29sLkZpbmRGaWxlQnlOYW1lKHByb3RvX2ZpbGVfbmFtZSkpCisKKyAgZGVmIHRlc3RDdXN0b21EZXNjcmlwdG9yUG9vbChzZWxmKToKKyAgICAjIENyZWF0ZSBhIG5ldyBwb29sLCBhbmQgYWRkIGEgZmlsZSBkZXNjcmlwdG9yLgorICAgIHBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woKQorICAgIGZpbGVfZGVzYyA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oCisgICAgICAgIG5hbWU9J3NvbWUvZmlsZS5wcm90bycsIHBhY2thZ2U9J3BhY2thZ2UnKQorICAgIGZpbGVfZGVzYy5tZXNzYWdlX3R5cGUuYWRkKG5hbWU9J01lc3NhZ2UnKQorICAgIHBvb2wuQWRkKGZpbGVfZGVzYykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHBvb2wuRmluZEZpbGVCeU5hbWUoJ3NvbWUvZmlsZS5wcm90bycpLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAnc29tZS9maWxlLnByb3RvJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCdwYWNrYWdlLk1lc3NhZ2UnKS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgJ01lc3NhZ2UnKQorICAgICMgVGVzdCBubyBwYWNrYWdlCisgICAgZmlsZV9wcm90byA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oCisgICAgICAgIG5hbWU9J3NvbWUvZmlsZW5hbWUvY29udGFpbmVyLnByb3RvJykKKyAgICBtZXNzYWdlX3Byb3RvID0gZmlsZV9wcm90by5tZXNzYWdlX3R5cGUuYWRkKAorICAgICAgICBuYW1lPSdUb3BNZXNzYWdlJykKKyAgICBtZXNzYWdlX3Byb3RvLmZpZWxkLmFkZCgKKyAgICAgICAgbmFtZT0nYmInLAorICAgICAgICBudW1iZXI9MSwKKyAgICAgICAgdHlwZT1kZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90by5UWVBFX0lOVDMyLAorICAgICAgICBsYWJlbD1kZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90by5MQUJFTF9PUFRJT05BTCkKKyAgICBlbnVtX3Byb3RvID0gZmlsZV9wcm90by5lbnVtX3R5cGUuYWRkKG5hbWU9J1RvcEVudW0nKQorICAgIGVudW1fcHJvdG8udmFsdWUuYWRkKG5hbWU9J0ZPUkVJR05fRk9PJywgbnVtYmVyPTQpCisgICAgZmlsZV9wcm90by5zZXJ2aWNlLmFkZChuYW1lPSdUb3BTZXJ2aWNlJykKKyAgICBwb29sID0gZGVzY3JpcHRvcl9wb29sLkRlc2NyaXB0b3JQb29sKCkKKyAgICBwb29sLkFkZChmaWxlX3Byb3RvKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1RvcE1lc3NhZ2UnLAorICAgICAgICAgICAgICAgICAgICAgcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoJ1RvcE1lc3NhZ2UnKS5uYW1lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1RvcEVudW0nLCBwb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgnVG9wRW51bScpLm5hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnVG9wU2VydmljZScsIHBvb2wuRmluZFNlcnZpY2VCeU5hbWUoJ1RvcFNlcnZpY2UnKS5uYW1lKQorCisgIGRlZiB0ZXN0RmlsZURlc2NyaXB0b3JPcHRpb25zV2l0aEN1c3RvbURlc2NyaXB0b3JQb29sKHNlbGYpOgorICAgICMgQ3JlYXRlIGEgZGVzY3JpcHRvciBwb29sLCBhbmQgYWRkIGEgbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gaXQuCisgICAgcG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbCgpCisgICAgZmlsZV9uYW1lID0gJ2ZpbGVfZGVzY3JpcHRvcl9vcHRpb25zX3dpdGhfY3VzdG9tX2Rlc2NyaXB0b3JfcG9vbC5wcm90bycKKyAgICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvKG5hbWU9ZmlsZV9uYW1lKQorICAgIGV4dGVuc2lvbl9pZCA9IGZpbGVfb3B0aW9uc190ZXN0X3BiMi5mb29fb3B0aW9ucworICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90by5vcHRpb25zLkV4dGVuc2lvbnNbZXh0ZW5zaW9uX2lkXS5mb29fbmFtZSA9ICdmb28nCisgICAgcG9vbC5BZGQoZmlsZV9kZXNjcmlwdG9yX3Byb3RvKQorICAgICMgVGhlIG9wdGlvbnMgc2V0IG9uIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhlCisgICAgIyBkZXNjcmlwdG9yIGV2ZW4gaWYgdGhleSBjb250YWluIGV4dGVuc2lvbnMgdGhhdCBjYW5ub3QgYmUgZGVzZXJpYWxpemVkCisgICAgIyB1c2luZyB0aGUgcG9vbC4KKyAgICBmaWxlX2Rlc2NyaXB0b3IgPSBwb29sLkZpbmRGaWxlQnlOYW1lKGZpbGVfbmFtZSkKKyAgICBvcHRpb25zID0gZmlsZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbycsIG9wdGlvbnMuRXh0ZW5zaW9uc1tleHRlbnNpb25faWRdLmZvb19uYW1lKQorICAgICMgVGhlIG9iamVjdCByZXR1cm5lZCBieSBHZXRPcHRpb25zKCkgaXMgY2FjaGVkLgorICAgIHNlbGYuYXNzZXJ0SXMob3B0aW9ucywgZmlsZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKSkKKworICBkZWYgdGVzdEFkZFR5cGVFcnJvcihzZWxmKToKKyAgICBwb29sID0gZGVzY3JpcHRvcl9wb29sLkRlc2NyaXB0b3JQb29sKCkKKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nOgorICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICBwb29sLkFkZERlc2NyaXB0b3IoMCkKKyAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgcG9vbC5BZGRFbnVtRGVzY3JpcHRvcigwKQorICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICBwb29sLkFkZFNlcnZpY2VEZXNjcmlwdG9yKDApCisgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgIHBvb2wuQWRkRXh0ZW5zaW9uRGVzY3JpcHRvcigwKQorICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICBwb29sLkFkZEZpbGVEZXNjcmlwdG9yKDApCisgICAgZWxzZToKKyAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgcG9vbC5fQWRkRGVzY3JpcHRvcigwKQorICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICBwb29sLl9BZGRFbnVtRGVzY3JpcHRvcigwKQorICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICBwb29sLl9BZGRTZXJ2aWNlRGVzY3JpcHRvcigwKQorICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICBwb29sLl9BZGRFeHRlbnNpb25EZXNjcmlwdG9yKDApCisgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgIHBvb2wuX0FkZEZpbGVEZXNjcmlwdG9yKDApCisKKworVEVTVDFfRklMRSA9IFByb3RvRmlsZSgKKyAgICAnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0MS5wcm90bycsCisgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwnLAorICAgIHsKKyAgICAgICAgJ0Rlc2NyaXB0b3JQb29sVGVzdDEnOiBNZXNzYWdlVHlwZSh7CisgICAgICAgICAgICAnTmVzdGVkRW51bSc6IEVudW1UeXBlKFsoJ0FMUEhBJywgMSksICgnQkVUQScsIDIpXSksCisgICAgICAgICAgICAnTmVzdGVkTWVzc2FnZSc6IE1lc3NhZ2VUeXBlKHsKKyAgICAgICAgICAgICAgICAnTmVzdGVkRW51bSc6IEVudW1UeXBlKFsoJ0VQU0lMT04nLCA1KSwgKCdaRVRBJywgNildKSwKKyAgICAgICAgICAgICAgICAnRGVlcE5lc3RlZE1lc3NhZ2UnOiBNZXNzYWdlVHlwZSh7CisgICAgICAgICAgICAgICAgICAgICdOZXN0ZWRFbnVtJzogRW51bVR5cGUoWygnRVRBJywgNyksICgnVEhFVEEnLCA4KV0pLAorICAgICAgICAgICAgICAgIH0sIFsKKyAgICAgICAgICAgICAgICAgICAgKCduZXN0ZWRfZW51bScsIEVudW1GaWVsZCgxLCAnTmVzdGVkRW51bScsICdFVEEnKSksCisgICAgICAgICAgICAgICAgICAgICgnbmVzdGVkX2ZpZWxkJywgU3RyaW5nRmllbGQoMiwgJ3RoZXRhJykpLAorICAgICAgICAgICAgICAgIF0pLAorICAgICAgICAgICAgfSwgWworICAgICAgICAgICAgICAgICgnbmVzdGVkX2VudW0nLCBFbnVtRmllbGQoMSwgJ05lc3RlZEVudW0nLCAnWkVUQScpKSwKKyAgICAgICAgICAgICAgICAoJ25lc3RlZF9maWVsZCcsIFN0cmluZ0ZpZWxkKDIsICdiZXRhJykpLAorICAgICAgICAgICAgICAgICgnZGVlcF9uZXN0ZWRfbWVzc2FnZScsIE1lc3NhZ2VGaWVsZCgzLCAnRGVlcE5lc3RlZE1lc3NhZ2UnKSksCisgICAgICAgICAgICBdKQorICAgICAgICB9LCBbCisgICAgICAgICAgICAoJ25lc3RlZF9lbnVtJywgRW51bUZpZWxkKDEsICdOZXN0ZWRFbnVtJywgJ0JFVEEnKSksCisgICAgICAgICAgICAoJ25lc3RlZF9tZXNzYWdlJywgTWVzc2FnZUZpZWxkKDIsICdOZXN0ZWRNZXNzYWdlJykpLAorICAgICAgICBdLCBpc19leHRlbmRhYmxlPVRydWUpLAorCisgICAgICAgICdEZXNjcmlwdG9yUG9vbFRlc3QyJzogTWVzc2FnZVR5cGUoeworICAgICAgICAgICAgJ05lc3RlZEVudW0nOiBFbnVtVHlwZShbKCdHQU1NQScsIDMpLCAoJ0RFTFRBJywgNCldKSwKKyAgICAgICAgICAgICdOZXN0ZWRNZXNzYWdlJzogTWVzc2FnZVR5cGUoeworICAgICAgICAgICAgICAgICdOZXN0ZWRFbnVtJzogRW51bVR5cGUoWygnSU9UQScsIDkpLCAoJ0tBUFBBJywgMTApXSksCisgICAgICAgICAgICAgICAgJ0RlZXBOZXN0ZWRNZXNzYWdlJzogTWVzc2FnZVR5cGUoeworICAgICAgICAgICAgICAgICAgICAnTmVzdGVkRW51bSc6IEVudW1UeXBlKFsoJ0xBTUJEQScsIDExKSwgKCdNVScsIDEyKV0pLAorICAgICAgICAgICAgICAgIH0sIFsKKyAgICAgICAgICAgICAgICAgICAgKCduZXN0ZWRfZW51bScsIEVudW1GaWVsZCgxLCAnTmVzdGVkRW51bScsICdNVScpKSwKKyAgICAgICAgICAgICAgICAgICAgKCduZXN0ZWRfZmllbGQnLCBTdHJpbmdGaWVsZCgyLCAnbGFtYmRhJykpLAorICAgICAgICAgICAgICAgIF0pLAorICAgICAgICAgICAgfSwgWworICAgICAgICAgICAgICAgICgnbmVzdGVkX2VudW0nLCBFbnVtRmllbGQoMSwgJ05lc3RlZEVudW0nLCAnSU9UQScpKSwKKyAgICAgICAgICAgICAgICAoJ25lc3RlZF9maWVsZCcsIFN0cmluZ0ZpZWxkKDIsICdkZWx0YScpKSwKKyAgICAgICAgICAgICAgICAoJ2RlZXBfbmVzdGVkX21lc3NhZ2UnLCBNZXNzYWdlRmllbGQoMywgJ0RlZXBOZXN0ZWRNZXNzYWdlJykpLAorICAgICAgICAgICAgXSkKKyAgICAgICAgfSwgWworICAgICAgICAgICAgKCduZXN0ZWRfZW51bScsIEVudW1GaWVsZCgxLCAnTmVzdGVkRW51bScsICdHQU1NQScpKSwKKyAgICAgICAgICAgICgnbmVzdGVkX21lc3NhZ2UnLCBNZXNzYWdlRmllbGQoMiwgJ05lc3RlZE1lc3NhZ2UnKSksCisgICAgICAgIF0pLAorICAgIH0pCisKKworVEVTVDJfRklMRSA9IFByb3RvRmlsZSgKKyAgICAnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0Mi5wcm90bycsCisgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwnLAorICAgIHsKKyAgICAgICAgJ0Rlc2NyaXB0b3JQb29sVGVzdDMnOiBNZXNzYWdlVHlwZSh7CisgICAgICAgICAgICAnTmVzdGVkRW51bSc6IEVudW1UeXBlKFsoJ05VJywgMTMpLCAoJ1hJJywgMTQpXSksCisgICAgICAgICAgICAnTmVzdGVkTWVzc2FnZSc6IE1lc3NhZ2VUeXBlKHsKKyAgICAgICAgICAgICAgICAnTmVzdGVkRW51bSc6IEVudW1UeXBlKFsoJ09NSUNST04nLCAxNSksICgnUEknLCAxNildKSwKKyAgICAgICAgICAgICAgICAnRGVlcE5lc3RlZE1lc3NhZ2UnOiBNZXNzYWdlVHlwZSh7CisgICAgICAgICAgICAgICAgICAgICdOZXN0ZWRFbnVtJzogRW51bVR5cGUoWygnUkhPJywgMTcpLCAoJ1NJR01BJywgMTgpXSksCisgICAgICAgICAgICAgICAgfSwgWworICAgICAgICAgICAgICAgICAgICAoJ25lc3RlZF9lbnVtJywgRW51bUZpZWxkKDEsICdOZXN0ZWRFbnVtJywgJ1JITycpKSwKKyAgICAgICAgICAgICAgICAgICAgKCduZXN0ZWRfZmllbGQnLCBTdHJpbmdGaWVsZCgyLCAnc2lnbWEnKSksCisgICAgICAgICAgICAgICAgXSksCisgICAgICAgICAgICB9LCBbCisgICAgICAgICAgICAgICAgKCduZXN0ZWRfZW51bScsIEVudW1GaWVsZCgxLCAnTmVzdGVkRW51bScsICdQSScpKSwKKyAgICAgICAgICAgICAgICAoJ25lc3RlZF9maWVsZCcsIFN0cmluZ0ZpZWxkKDIsICdudScpKSwKKyAgICAgICAgICAgICAgICAoJ2RlZXBfbmVzdGVkX21lc3NhZ2UnLCBNZXNzYWdlRmllbGQoMywgJ0RlZXBOZXN0ZWRNZXNzYWdlJykpLAorICAgICAgICAgICAgXSkKKyAgICAgICAgfSwgWworICAgICAgICAgICAgKCduZXN0ZWRfZW51bScsIEVudW1GaWVsZCgxLCAnTmVzdGVkRW51bScsICdYSScpKSwKKyAgICAgICAgICAgICgnbmVzdGVkX21lc3NhZ2UnLCBNZXNzYWdlRmllbGQoMiwgJ05lc3RlZE1lc3NhZ2UnKSksCisgICAgICAgIF0sIGV4dGVuc2lvbnM9WworICAgICAgICAgICAgKCdkZXNjcmlwdG9yX3Bvb2xfdGVzdCcsCisgICAgICAgICAgICAgRXh0ZW5zaW9uRmllbGQoMTAwMSwgJ0Rlc2NyaXB0b3JQb29sVGVzdDEnKSksCisgICAgICAgIF0pLAorICAgIH0sCisgICAgZGVwZW5kZW5jaWVzPVsnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0MS5wcm90bycsCisgICAgICAgICAgICAgICAgICAnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfbWVzc2FnZXMucHJvdG8nXSwKKyAgICBwdWJsaWNfZGVwZW5kZW5jaWVzPVsnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfbWVzc2FnZXMucHJvdG8nXSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9wb29sX3Rlc3QxLnByb3RvIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Bvb2xfdGVzdDEucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4MTZiNwotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9wb29sX3Rlc3QxLnByb3RvCkBAIC0wLDAgKzEsOTYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsOworCisKK21lc3NhZ2UgRGVzY3JpcHRvclBvb2xUZXN0MSB7CisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7CisKKyAgZW51bSBOZXN0ZWRFbnVtIHsKKyAgICBBTFBIQSA9IDE7CisgICAgQkVUQSA9IDI7CisgIH0KKworICBvcHRpb25hbCBOZXN0ZWRFbnVtIG5lc3RlZF9lbnVtID0gMSBbZGVmYXVsdCA9IEJFVEFdOworCisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgZW51bSBOZXN0ZWRFbnVtIHsKKyAgICAgIEVQU0lMT04gPSA1OworICAgICAgWkVUQSA9IDY7CisgICAgfQorICAgIG9wdGlvbmFsIE5lc3RlZEVudW0gbmVzdGVkX2VudW0gPSAxIFtkZWZhdWx0ID0gWkVUQV07CisgICAgb3B0aW9uYWwgc3RyaW5nIG5lc3RlZF9maWVsZCA9IDIgW2RlZmF1bHQgPSAiYmV0YSJdOworICAgIG9wdGlvbmFsIERlZXBOZXN0ZWRNZXNzYWdlIGRlZXBfbmVzdGVkX21lc3NhZ2UgPSAzOworCisgICAgbWVzc2FnZSBEZWVwTmVzdGVkTWVzc2FnZSB7CisgICAgICBlbnVtIE5lc3RlZEVudW0geworICAgICAgICBFVEEgPSA3OworICAgICAgICBUSEVUQSA9IDg7CisgICAgICB9CisgICAgICBvcHRpb25hbCBOZXN0ZWRFbnVtIG5lc3RlZF9lbnVtID0gMSBbZGVmYXVsdCA9IEVUQV07CisgICAgICBvcHRpb25hbCBzdHJpbmcgbmVzdGVkX2ZpZWxkID0gMiBbZGVmYXVsdCA9ICJ0aGV0YSJdOworICAgIH0KKyAgfQorCisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2UgbmVzdGVkX21lc3NhZ2UgPSAyOworfQorCittZXNzYWdlIERlc2NyaXB0b3JQb29sVGVzdDIgeworICBlbnVtIE5lc3RlZEVudW0geworICAgIEdBTU1BID0gMzsKKyAgICBERUxUQSA9IDQ7CisgIH0KKworICBvcHRpb25hbCBOZXN0ZWRFbnVtIG5lc3RlZF9lbnVtID0gMSBbZGVmYXVsdCA9IEdBTU1BXTsKKworICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICAgIGVudW0gTmVzdGVkRW51bSB7CisgICAgICBJT1RBID0gOTsKKyAgICAgIEtBUFBBID0gMTA7CisgICAgfQorICAgIG9wdGlvbmFsIE5lc3RlZEVudW0gbmVzdGVkX2VudW0gPSAxIFtkZWZhdWx0ID0gSU9UQV07CisgICAgb3B0aW9uYWwgc3RyaW5nIG5lc3RlZF9maWVsZCA9IDIgW2RlZmF1bHQgPSAiZGVsdGEiXTsKKyAgICBvcHRpb25hbCBEZWVwTmVzdGVkTWVzc2FnZSBkZWVwX25lc3RlZF9tZXNzYWdlID0gMzsKKworICAgIG1lc3NhZ2UgRGVlcE5lc3RlZE1lc3NhZ2UgeworICAgICAgZW51bSBOZXN0ZWRFbnVtIHsKKyAgICAgICAgTEFNQkRBID0gMTE7CisgICAgICAgIE1VID0gMTI7CisgICAgICB9CisgICAgICBvcHRpb25hbCBOZXN0ZWRFbnVtIG5lc3RlZF9lbnVtID0gMSBbZGVmYXVsdCA9IE1VXTsKKyAgICAgIG9wdGlvbmFsIHN0cmluZyBuZXN0ZWRfZmllbGQgPSAyIFtkZWZhdWx0ID0gImxhbWJkYSJdOworICAgIH0KKyAgfQorCisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2UgbmVzdGVkX21lc3NhZ2UgPSAyOworfQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Bvb2xfdGVzdDIucHJvdG8gYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0Mi5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjE4ZWNjCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Bvb2xfdGVzdDIucHJvdG8KQEAgLTAsMCArMSw3MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWw7CisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0MS5wcm90byI7CitpbXBvcnQgcHVibGljICJnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9tZXNzYWdlcy5wcm90byI7CisKKworbWVzc2FnZSBEZXNjcmlwdG9yUG9vbFRlc3QzIHsKKworICBleHRlbmQgRGVzY3JpcHRvclBvb2xUZXN0MSB7CisgICAgb3B0aW9uYWwgRGVzY3JpcHRvclBvb2xUZXN0MyBkZXNjcmlwdG9yX3Bvb2xfdGVzdCA9IDEwMDE7CisgIH0KKworICBlbnVtIE5lc3RlZEVudW0geworICAgIE5VID0gMTM7CisgICAgWEkgPSAxNDsKKyAgfQorCisgIG9wdGlvbmFsIE5lc3RlZEVudW0gbmVzdGVkX2VudW0gPSAxIFtkZWZhdWx0ID0gWEldOworCisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgZW51bSBOZXN0ZWRFbnVtIHsKKyAgICAgIE9NSUNST04gPSAxNTsKKyAgICAgIFBJID0gMTY7CisgICAgfQorICAgIG9wdGlvbmFsIE5lc3RlZEVudW0gbmVzdGVkX2VudW0gPSAxIFtkZWZhdWx0ID0gUEldOworICAgIG9wdGlvbmFsIHN0cmluZyBuZXN0ZWRfZmllbGQgPSAyIFtkZWZhdWx0ID0gIm51Il07CisgICAgb3B0aW9uYWwgRGVlcE5lc3RlZE1lc3NhZ2UgZGVlcF9uZXN0ZWRfbWVzc2FnZSA9IDM7CisKKyAgICBtZXNzYWdlIERlZXBOZXN0ZWRNZXNzYWdlIHsKKyAgICAgIGVudW0gTmVzdGVkRW51bSB7CisgICAgICAgIFJITyA9IDE3OworICAgICAgICBTSUdNQSA9IDE4OworICAgICAgfQorICAgICAgb3B0aW9uYWwgTmVzdGVkRW51bSBuZXN0ZWRfZW51bSA9IDEgW2RlZmF1bHQgPSBSSE9dOworICAgICAgb3B0aW9uYWwgc3RyaW5nIG5lc3RlZF9maWVsZCA9IDIgW2RlZmF1bHQgPSAic2lnbWEiXTsKKyAgICB9CisgIH0KKworICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlIG5lc3RlZF9tZXNzYWdlID0gMjsKK30KKwpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Rlc3QucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTg1MzJjCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Rlc3QucHkKQEAgLTAsMCArMSwxMDc2IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXR0ZXN0IGZvciBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuZGVzY3JpcHRvci4iIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKKworZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2ltcG9ydF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGFwaV9pbXBsZW1lbnRhdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RfdXRpbAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3Bvb2wKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzeW1ib2xfZGF0YWJhc2UKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0ZXh0X2Zvcm1hdAorCisKK1RFU1RfRU1QVFlfTUVTU0FHRV9ERVNDUklQVE9SX0FTQ0lJID0gIiIiCituYW1lOiAnVGVzdEVtcHR5TWVzc2FnZScKKyIiIgorCitURVNUX0ZJTEVfREVTQ1JJUFRPUl9ERUJVRyA9ICIiInN5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCittZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICBlbnVtIEZvcmVpZ25FbnVtIHsKKyAgICBGT1JFSUdOX0ZPTyA9IDQ7CisgICAgRk9SRUlHTl9CQVIgPSA1OworICAgIEZPUkVJR05fQkFaID0gNjsKKyAgfQorICBvcHRpb25hbCBpbnQzMiBiYiA9IDE7Cit9CisKK21lc3NhZ2UgUmVzcG9uc2VNZXNzYWdlIHsKK30KKworc2VydmljZSBTZXJ2aWNlIHsKKyAgcnBjIENhbGxNZXRob2QoLnByb3RvYnVmX3VuaXR0ZXN0Lk5lc3RlZE1lc3NhZ2UpIHJldHVybnMgKC5wcm90b2J1Zl91bml0dGVzdC5SZXNwb25zZU1lc3NhZ2UpOworfQorCisiIiIKKworCit3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2Vycm9yJywgRGVwcmVjYXRpb25XYXJuaW5nKQorCisKK2NsYXNzIERlc2NyaXB0b3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgZmlsZV9wcm90byA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oCisgICAgICAgIG5hbWU9J3NvbWUvZmlsZW5hbWUvc29tZS5wcm90bycsCisgICAgICAgIHBhY2thZ2U9J3Byb3RvYnVmX3VuaXR0ZXN0JykKKyAgICBtZXNzYWdlX3Byb3RvID0gZmlsZV9wcm90by5tZXNzYWdlX3R5cGUuYWRkKAorICAgICAgICBuYW1lPSdOZXN0ZWRNZXNzYWdlJykKKyAgICBtZXNzYWdlX3Byb3RvLmZpZWxkLmFkZCgKKyAgICAgICAgbmFtZT0nYmInLAorICAgICAgICBudW1iZXI9MSwKKyAgICAgICAgdHlwZT1kZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90by5UWVBFX0lOVDMyLAorICAgICAgICBsYWJlbD1kZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90by5MQUJFTF9PUFRJT05BTCkKKyAgICBlbnVtX3Byb3RvID0gbWVzc2FnZV9wcm90by5lbnVtX3R5cGUuYWRkKAorICAgICAgICBuYW1lPSdGb3JlaWduRW51bScpCisgICAgZW51bV9wcm90by52YWx1ZS5hZGQobmFtZT0nRk9SRUlHTl9GT08nLCBudW1iZXI9NCkKKyAgICBlbnVtX3Byb3RvLnZhbHVlLmFkZChuYW1lPSdGT1JFSUdOX0JBUicsIG51bWJlcj01KQorICAgIGVudW1fcHJvdG8udmFsdWUuYWRkKG5hbWU9J0ZPUkVJR05fQkFaJywgbnVtYmVyPTYpCisKKyAgICBmaWxlX3Byb3RvLm1lc3NhZ2VfdHlwZS5hZGQobmFtZT0nUmVzcG9uc2VNZXNzYWdlJykKKyAgICBzZXJ2aWNlX3Byb3RvID0gZmlsZV9wcm90by5zZXJ2aWNlLmFkZCgKKyAgICAgICAgbmFtZT0nU2VydmljZScpCisgICAgbWV0aG9kX3Byb3RvID0gc2VydmljZV9wcm90by5tZXRob2QuYWRkKAorICAgICAgICBuYW1lPSdDYWxsTWV0aG9kJywKKyAgICAgICAgaW5wdXRfdHlwZT0nLnByb3RvYnVmX3VuaXR0ZXN0Lk5lc3RlZE1lc3NhZ2UnLAorICAgICAgICBvdXRwdXRfdHlwZT0nLnByb3RvYnVmX3VuaXR0ZXN0LlJlc3BvbnNlTWVzc2FnZScpCisKKyAgICAjIE5vdGU6IENhbGxpbmcgRGVzY3JpcHRvclBvb2wuQWRkKCkgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBmaWxlIG9ubHkKKyAgICAjIHdvcmtzIGlmIHRoZSBpbnB1dCBpcyBjYW5vbmljYWw7IGluIHBhcnRpY3VsYXIsIGFsbCB0eXBlIG5hbWVzIG11c3QgYmUKKyAgICAjIGZ1bGx5IHF1YWxpZmllZC4KKyAgICBzZWxmLnBvb2wgPSBzZWxmLkdldERlc2NyaXB0b3JQb29sKCkKKyAgICBzZWxmLnBvb2wuQWRkKGZpbGVfcHJvdG8pCisgICAgc2VsZi5teV9maWxlID0gc2VsZi5wb29sLkZpbmRGaWxlQnlOYW1lKGZpbGVfcHJvdG8ubmFtZSkKKyAgICBzZWxmLm15X21lc3NhZ2UgPSBzZWxmLm15X2ZpbGUubWVzc2FnZV90eXBlc19ieV9uYW1lW21lc3NhZ2VfcHJvdG8ubmFtZV0KKyAgICBzZWxmLm15X2VudW0gPSBzZWxmLm15X21lc3NhZ2UuZW51bV90eXBlc19ieV9uYW1lW2VudW1fcHJvdG8ubmFtZV0KKyAgICBzZWxmLm15X3NlcnZpY2UgPSBzZWxmLm15X2ZpbGUuc2VydmljZXNfYnlfbmFtZVtzZXJ2aWNlX3Byb3RvLm5hbWVdCisgICAgc2VsZi5teV9tZXRob2QgPSBzZWxmLm15X3NlcnZpY2UubWV0aG9kc19ieV9uYW1lW21ldGhvZF9wcm90by5uYW1lXQorCisgIGRlZiBHZXREZXNjcmlwdG9yUG9vbChzZWxmKToKKyAgICByZXR1cm4gc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKS5wb29sCisKKyAgZGVmIHRlc3RFbnVtVmFsdWVOYW1lKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9tZXNzYWdlLkVudW1WYWx1ZU5hbWUoJ0ZvcmVpZ25FbnVtJywgNCksCisgICAgICAgICAgICAgICAgICAgICAnRk9SRUlHTl9GT08nKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgc2VsZi5teV9tZXNzYWdlLmVudW1fdHlwZXNfYnlfbmFtZVsKKyAgICAgICAgICAgICdGb3JlaWduRW51bSddLnZhbHVlc19ieV9udW1iZXJbNF0ubmFtZSwKKyAgICAgICAgc2VsZi5teV9tZXNzYWdlLkVudW1WYWx1ZU5hbWUoJ0ZvcmVpZ25FbnVtJywgNCkpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICBzZWxmLm15X21lc3NhZ2UuRW51bVZhbHVlTmFtZSgnRm9yZWlnbkVudW0nLCA5OTkpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICBzZWxmLm15X21lc3NhZ2UuRW51bVZhbHVlTmFtZSgnTm9uZUVudW0nLCA5OTkpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgc2VsZi5teV9tZXNzYWdlLkVudW1WYWx1ZU5hbWUoKQorCisgIGRlZiB0ZXN0RW51bUZpeHVwcyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfZW51bSwgc2VsZi5teV9lbnVtLnZhbHVlc1swXS50eXBlKQorCisgIGRlZiB0ZXN0Q29udGFpbmluZ1R5cGVGaXh1cHMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X21lc3NhZ2UsIHNlbGYubXlfbWVzc2FnZS5maWVsZHNbMF0uY29udGFpbmluZ190eXBlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9tZXNzYWdlLCBzZWxmLm15X2VudW0uY29udGFpbmluZ190eXBlKQorCisgIGRlZiB0ZXN0Q29udGFpbmluZ1NlcnZpY2VGaXh1cHMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X3NlcnZpY2UsIHNlbGYubXlfbWV0aG9kLmNvbnRhaW5pbmdfc2VydmljZSkKKworICBAdW5pdHRlc3Quc2tpcElmKAorICAgICAgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAncHl0aG9uJywKKyAgICAgICdHZXREZWJ1Z1N0cmluZyBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoIHRoZSBjcHAgaW1wbGVtZW50YXRpb24nLAorICApCisgIGRlZiB0ZXN0R2V0RGVidWdTdHJpbmcoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X2ZpbGUuR2V0RGVidWdTdHJpbmcoKSwgVEVTVF9GSUxFX0RFU0NSSVBUT1JfREVCVUcpCisKKyAgZGVmIHRlc3RHZXRPcHRpb25zKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9lbnVtLkdldE9wdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcGIyLkVudW1PcHRpb25zKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X2VudW0udmFsdWVzWzBdLkdldE9wdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcGIyLkVudW1WYWx1ZU9wdGlvbnMoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfbWVzc2FnZS5HZXRPcHRpb25zKCksCisgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3BiMi5NZXNzYWdlT3B0aW9ucygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9tZXNzYWdlLmZpZWxkc1swXS5HZXRPcHRpb25zKCksCisgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3BiMi5GaWVsZE9wdGlvbnMoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfbWV0aG9kLkdldE9wdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcGIyLk1ldGhvZE9wdGlvbnMoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfc2VydmljZS5HZXRPcHRpb25zKCksCisgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3BiMi5TZXJ2aWNlT3B0aW9ucygpKQorCisgIGRlZiB0ZXN0U2ltcGxlQ3VzdG9tT3B0aW9ucyhzZWxmKToKKyAgICBmaWxlX2Rlc2NyaXB0b3IgPSB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuREVTQ1JJUFRPUgorICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9ICh1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMuREVTQ1JJUFRPUikKKyAgICBmaWVsZF9kZXNjcmlwdG9yID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lWydmaWVsZDEnXQorICAgIG9uZW9mX2Rlc2NyaXB0b3IgPSBtZXNzYWdlX2Rlc2NyaXB0b3Iub25lb2ZzX2J5X25hbWVbJ0FuT25lb2YnXQorICAgIGVudW1fZGVzY3JpcHRvciA9IG1lc3NhZ2VfZGVzY3JpcHRvci5lbnVtX3R5cGVzX2J5X25hbWVbJ0FuRW51bSddCisgICAgZW51bV92YWx1ZV9kZXNjcmlwdG9yID0gKG1lc3NhZ2VfZGVzY3JpcHRvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bV92YWx1ZXNfYnlfbmFtZVsnQU5FTlVNX1ZBTDInXSkKKyAgICBvdGhlcl9lbnVtX3ZhbHVlX2Rlc2NyaXB0b3IgPSAobWVzc2FnZV9kZXNjcmlwdG9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtX3ZhbHVlc19ieV9uYW1lWydBTkVOVU1fVkFMMSddKQorICAgIHNlcnZpY2VfZGVzY3JpcHRvciA9ICh1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RTZXJ2aWNlV2l0aEN1c3RvbU9wdGlvbnMuREVTQ1JJUFRPUikKKyAgICBtZXRob2RfZGVzY3JpcHRvciA9IHNlcnZpY2VfZGVzY3JpcHRvci5GaW5kTWV0aG9kQnlOYW1lKCdGb28nKQorCisgICAgZmlsZV9vcHRpb25zID0gZmlsZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQorICAgIGZpbGVfb3B0MSA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5maWxlX29wdDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDk4NzY1NDMyMTAsIGZpbGVfb3B0aW9ucy5FeHRlbnNpb25zW2ZpbGVfb3B0MV0pCisgICAgbWVzc2FnZV9vcHRpb25zID0gbWVzc2FnZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQorICAgIG1lc3NhZ2Vfb3B0MSA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5tZXNzYWdlX29wdDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKC01NiwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbbWVzc2FnZV9vcHQxXSkKKyAgICBmaWVsZF9vcHRpb25zID0gZmllbGRfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkKKyAgICBmaWVsZF9vcHQxID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpZWxkX29wdDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDg3NjU0MzIxMDksIGZpZWxkX29wdGlvbnMuRXh0ZW5zaW9uc1tmaWVsZF9vcHQxXSkKKyAgICBmaWVsZF9vcHQyID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpZWxkX29wdDIKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBmaWVsZF9vcHRpb25zLkV4dGVuc2lvbnNbZmllbGRfb3B0Ml0pCisgICAgb25lb2Zfb3B0aW9ucyA9IG9uZW9mX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpCisgICAgb25lb2Zfb3B0MSA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5vbmVvZl9vcHQxCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtOTksIG9uZW9mX29wdGlvbnMuRXh0ZW5zaW9uc1tvbmVvZl9vcHQxXSkKKyAgICBlbnVtX29wdGlvbnMgPSBlbnVtX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpCisgICAgZW51bV9vcHQxID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmVudW1fb3B0MQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTc4OSwgZW51bV9vcHRpb25zLkV4dGVuc2lvbnNbZW51bV9vcHQxXSkKKyAgICBlbnVtX3ZhbHVlX29wdGlvbnMgPSBlbnVtX3ZhbHVlX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpCisgICAgZW51bV92YWx1ZV9vcHQxID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmVudW1fdmFsdWVfb3B0MQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzLCBlbnVtX3ZhbHVlX29wdGlvbnMuRXh0ZW5zaW9uc1tlbnVtX3ZhbHVlX29wdDFdKQorCisgICAgc2VydmljZV9vcHRpb25zID0gc2VydmljZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQorICAgIHNlcnZpY2Vfb3B0MSA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5zZXJ2aWNlX29wdDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKC05ODc2NTQzMjEwLCBzZXJ2aWNlX29wdGlvbnMuRXh0ZW5zaW9uc1tzZXJ2aWNlX29wdDFdKQorICAgIG1ldGhvZF9vcHRpb25zID0gbWV0aG9kX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpCisgICAgbWV0aG9kX29wdDEgPSB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIubWV0aG9kX29wdDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5NRVRIT0RPUFQxX1ZBTDIsCisgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb3B0aW9ucy5FeHRlbnNpb25zW21ldGhvZF9vcHQxXSkKKworICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9ICgKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLkR1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtLkRFU0NSSVBUT1IpCisgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVfZGVzY3JpcHRvci5oYXNfb3B0aW9ucykKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1lc3NhZ2VfZGVzY3JpcHRvci5oYXNfb3B0aW9ucykKKyAgICBzZWxmLmFzc2VydFRydWUoZmllbGRfZGVzY3JpcHRvci5oYXNfb3B0aW9ucykKKyAgICBzZWxmLmFzc2VydFRydWUob25lb2ZfZGVzY3JpcHRvci5oYXNfb3B0aW9ucykKKyAgICBzZWxmLmFzc2VydFRydWUoZW51bV9kZXNjcmlwdG9yLmhhc19vcHRpb25zKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbnVtX3ZhbHVlX2Rlc2NyaXB0b3IuaGFzX29wdGlvbnMpCisgICAgc2VsZi5hc3NlcnRGYWxzZShvdGhlcl9lbnVtX3ZhbHVlX2Rlc2NyaXB0b3IuaGFzX29wdGlvbnMpCisKKyAgZGVmIHRlc3RDdXN0b21PcHRpb25zQ29weVRvKHNlbGYpOgorICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9ICh1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMuREVTQ1JJUFRPUikKKyAgICBtZXNzYWdlX3Byb3RvID0gZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvKCkKKyAgICBtZXNzYWdlX2Rlc2NyaXB0b3IuQ29weVRvUHJvdG8obWVzc2FnZV9wcm90bykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtZXNzYWdlX3Byb3RvLm9wdGlvbnMuTGlzdEZpZWxkcygpKSwKKyAgICAgICAgICAgICAgICAgICAgIDIpCisKKyAgZGVmIHRlc3REaWZmZXJlbnRDdXN0b21PcHRpb25UeXBlcyhzZWxmKToKKyAgICBraW50MzJtaW4gPSAtMioqMzEKKyAgICBraW50NjRtaW4gPSAtMioqNjMKKyAgICBraW50MzJtYXggPSAyKiozMSAtIDEKKyAgICBraW50NjRtYXggPSAyKio2MyAtIDEKKyAgICBrdWludDMybWF4ID0gMioqMzIgLSAxCisgICAga3VpbnQ2NG1heCA9IDIqKjY0IC0gMQorCisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID1cCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5DdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzLkRFU0NSSVBUT1IKKyAgICBtZXNzYWdlX29wdGlvbnMgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5ib29sX29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50MzJtaW4sIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuaW50MzJfb3B0XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGtpbnQ2NG1pbiwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5pbnQ2NF9vcHRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi51aW50MzJfb3B0XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIudWludDY0X29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50MzJtaW4sIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuc2ludDMyX29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50NjRtaW4sIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuc2ludDY0X29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpeGVkMzJfb3B0XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZml4ZWQ2NF9vcHRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2ludDMybWluLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnNmaXhlZDMyX29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50NjRtaW4sIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuc2ZpeGVkNjRfb3B0XSkKKworICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9XAorICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuQ3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlcy5ERVNDUklQVE9SCisgICAgbWVzc2FnZV9vcHRpb25zID0gbWVzc2FnZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5ib29sX29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50MzJtYXgsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuaW50MzJfb3B0XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGtpbnQ2NG1heCwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5pbnQ2NF9vcHRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoa3VpbnQzMm1heCwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi51aW50MzJfb3B0XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGt1aW50NjRtYXgsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIudWludDY0X29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50MzJtYXgsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuc2ludDMyX29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50NjRtYXgsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuc2ludDY0X29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChrdWludDMybWF4LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpeGVkMzJfb3B0XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGt1aW50NjRtYXgsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZml4ZWQ2NF9vcHRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2ludDMybWF4LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnNmaXhlZDMyX29wdF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChraW50NjRtYXgsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuc2ZpeGVkNjRfb3B0XSkKKworICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9XAorICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMuREVTQ1JJUFRPUgorICAgIG1lc3NhZ2Vfb3B0aW9ucyA9IG1lc3NhZ2VfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKC0xMDAsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuaW50MzJfb3B0XSkKKyAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKDEyLjM0NTY3ODksIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZmxvYXRfb3B0XSwgNikKKyAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKDEuMjM0NTY3ODkwMTIzNDU2Nzg5LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmRvdWJsZV9vcHRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkhlbGxvLCBcIldvcmxkXCIiLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnN0cmluZ19vcHRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJIZWxsb1wwV29ybGQiLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmJ5dGVzX29wdF0pCisgICAgZHVtbXlfZW51bSA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5EdW1teU1lc3NhZ2VDb250YWluaW5nRW51bQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGR1bW15X2VudW0uVEVTVF9PUFRJT05fRU5VTV9UWVBFMiwKKyAgICAgICAgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmVudW1fb3B0XSkKKworICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9XAorICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cy5ERVNDUklQVE9SCisgICAgbWVzc2FnZV9vcHRpb25zID0gbWVzc2FnZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQorICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoMTIsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZmxvYXRfb3B0XSwgNikKKyAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKDE1NCwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5kb3VibGVfb3B0XSkKKworICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9XAorICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuU2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50cy5ERVNDUklQVE9SCisgICAgbWVzc2FnZV9vcHRpb25zID0gbWVzc2FnZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQorICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoLTEyLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZsb2F0X29wdF0sIDYpCisgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgtMTU0LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmRvdWJsZV9vcHRdKQorCisgIGRlZiB0ZXN0Q29tcGxleEV4dGVuc2lvbk9wdGlvbnMoc2VsZik6CisgICAgZGVzY3JpcHRvciA9XAorICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuVmFyaW91c0NvbXBsZXhPcHRpb25zLkRFU0NSSVBUT1IKKyAgICBvcHRpb25zID0gZGVzY3JpcHRvci5HZXRPcHRpb25zKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBvcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4X29wdDFdLmZvbykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMyNCwgb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleF9vcHQxXS5FeHRlbnNpb25zWworICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLm1vb29dKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoODc2LCBvcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4X29wdDFdLkV4dGVuc2lvbnNbCisgICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29yZ2VdLm1vbykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDk4Nywgb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleF9vcHQyXS5iYXopCisgICAgc2VsZi5hc3NlcnRFcXVhbCg2NTQsIG9wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhfb3B0Ml0uRXh0ZW5zaW9uc1sKKyAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5ncmF1bHRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNzQzLCBvcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4X29wdDJdLmJhci5mb28pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxOTk5LCBvcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4X29wdDJdLmJhci5FeHRlbnNpb25zWworICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLm1vb29dKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjAwOCwgb3B0aW9ucy5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleF9vcHQyXS5iYXIuRXh0ZW5zaW9uc1sKKyAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb3JnZV0ubW9vKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNzQxLCBvcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4X29wdDJdLkV4dGVuc2lvbnNbCisgICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZ2FycGx5XS5mb28pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxOTk4LCBvcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4X29wdDJdLkV4dGVuc2lvbnNbCisgICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZ2FycGx5XS5FeHRlbnNpb25zWworICAgICAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5tb29vXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIxMjEsIG9wdGlvbnMuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhfb3B0Ml0uRXh0ZW5zaW9uc1sKKyAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5nYXJwbHldLkV4dGVuc2lvbnNbCisgICAgICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvcmdlXS5tb28pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxOTcxLCBvcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5Db21wbGV4T3B0aW9uVHlwZTIKKyAgICAgICAgLkNvbXBsZXhPcHRpb25UeXBlNC5jb21wbGV4X29wdDRdLndhbGRvKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzIxLCBvcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4X29wdDJdLmZyZWQud2FsZG8pCisgICAgc2VsZi5hc3NlcnRFcXVhbCg5LCBvcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4X29wdDNdLm1vbykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIyLCBvcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4X29wdDNdLmNvbXBsZXhvcHRpb250eXBlNS5wbHVnaCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDI0LCBvcHRpb25zLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4b3B0Nl0ueHl6enkpCisKKyAgIyBDaGVjayB0aGF0IGFnZ3JlZ2F0ZSBvcHRpb25zIHdlcmUgcGFyc2VkIGFuZCBzYXZlZCBjb3JyZWN0bHkgaW4KKyAgIyB0aGUgYXBwcm9wcmlhdGUgZGVzY3JpcHRvcnMuCisgIGRlZiB0ZXN0QWdncmVnYXRlT3B0aW9ucyhzZWxmKToKKyAgICBmaWxlX2Rlc2NyaXB0b3IgPSB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuREVTQ1JJUFRPUgorICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9XAorICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuQWdncmVnYXRlTWVzc2FnZS5ERVNDUklQVE9SCisgICAgZmllbGRfZGVzY3JpcHRvciA9IG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZVsiZmllbGRuYW1lIl0KKyAgICBlbnVtX2Rlc2NyaXB0b3IgPSB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuQWdncmVnYXRlRW51bS5ERVNDUklQVE9SCisgICAgZW51bV92YWx1ZV9kZXNjcmlwdG9yID0gZW51bV9kZXNjcmlwdG9yLnZhbHVlc19ieV9uYW1lWyJWQUxVRSJdCisgICAgc2VydmljZV9kZXNjcmlwdG9yID1cCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5BZ2dyZWdhdGVTZXJ2aWNlLkRFU0NSSVBUT1IKKyAgICBtZXRob2RfZGVzY3JpcHRvciA9IHNlcnZpY2VfZGVzY3JpcHRvci5GaW5kTWV0aG9kQnlOYW1lKCJNZXRob2QiKQorCisgICAgIyBUZXN0cyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhIGVtYmVkZGVkIGluIGZpbGVvcHQKKyAgICBmaWxlX29wdGlvbnMgPSBmaWxlX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5maWxlb3B0XQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwLCBmaWxlX29wdGlvbnMuaSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCJGaWxlQW5ub3RhdGlvbiIsIGZpbGVfb3B0aW9ucy5zKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoIk5lc3RlZEZpbGVBbm5vdGF0aW9uIiwgZmlsZV9vcHRpb25zLnN1Yi5zKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkZpbGVFeHRlbnNpb25Bbm5vdGF0aW9uIiwgZmlsZV9vcHRpb25zLmZpbGUuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpbGVvcHRdLnMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgiRW1iZWRkZWRNZXNzYWdlU2V0RWxlbWVudCIsIGZpbGVfb3B0aW9ucy5tc2V0LkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5BZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudAorICAgICAgICAubWVzc2FnZV9zZXRfZXh0ZW5zaW9uXS5zKQorCisgICAgIyBTaW1wbGUgdGVzdHMgZm9yIGFsbCB0aGUgb3RoZXIgdHlwZXMgb2YgYW5ub3RhdGlvbnMKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAiTWVzc2FnZUFubm90YXRpb24iLAorICAgICAgICBtZXNzYWdlX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpLkV4dGVuc2lvbnNbCisgICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIubXNnb3B0XS5zKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICJGaWVsZEFubm90YXRpb24iLAorICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5FeHRlbnNpb25zWworICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpZWxkb3B0XS5zKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICJFbnVtQW5ub3RhdGlvbiIsCisgICAgICAgIGVudW1fZGVzY3JpcHRvci5HZXRPcHRpb25zKCkuRXh0ZW5zaW9uc1sKKyAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5lbnVtb3B0XS5zKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICJFbnVtVmFsdWVBbm5vdGF0aW9uIiwKKyAgICAgICAgZW51bV92YWx1ZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5FeHRlbnNpb25zWworICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmVudW12YWxvcHRdLnMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgIlNlcnZpY2VBbm5vdGF0aW9uIiwKKyAgICAgICAgc2VydmljZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5FeHRlbnNpb25zWworICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnNlcnZpY2VvcHRdLnMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgIk1ldGhvZEFubm90YXRpb24iLAorICAgICAgICBtZXRob2RfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkuRXh0ZW5zaW9uc1sKKyAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5tZXRob2RvcHRdLnMpCisKKyAgZGVmIHRlc3ROZXN0ZWRPcHRpb25zKHNlbGYpOgorICAgIG5lc3RlZF9tZXNzYWdlID1cCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5OZXN0ZWRPcHRpb25UeXBlLk5lc3RlZE1lc3NhZ2UuREVTQ1JJUFRPUgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwMSwgbmVzdGVkX21lc3NhZ2UuR2V0T3B0aW9ucygpLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5tZXNzYWdlX29wdDFdKQorICAgIG5lc3RlZF9maWVsZCA9IG5lc3RlZF9tZXNzYWdlLmZpZWxkc19ieV9uYW1lWyJuZXN0ZWRfZmllbGQiXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwMiwgbmVzdGVkX2ZpZWxkLkdldE9wdGlvbnMoKS5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZmllbGRfb3B0MV0pCisgICAgb3V0ZXJfbWVzc2FnZSA9XAorICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuTmVzdGVkT3B0aW9uVHlwZS5ERVNDUklQVE9SCisgICAgbmVzdGVkX2VudW0gPSBvdXRlcl9tZXNzYWdlLmVudW1fdHlwZXNfYnlfbmFtZVsiTmVzdGVkRW51bSJdCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMDAzLCBuZXN0ZWRfZW51bS5HZXRPcHRpb25zKCkuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmVudW1fb3B0MV0pCisgICAgbmVzdGVkX2VudW1fdmFsdWUgPSBvdXRlcl9tZXNzYWdlLmVudW1fdmFsdWVzX2J5X25hbWVbIk5FU1RFRF9FTlVNX1ZBTFVFIl0KKyAgICBzZWxmLmFzc2VydEVxdWFsKDEwMDQsIG5lc3RlZF9lbnVtX3ZhbHVlLkdldE9wdGlvbnMoKS5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZW51bV92YWx1ZV9vcHQxXSkKKyAgICBuZXN0ZWRfZXh0ZW5zaW9uID0gb3V0ZXJfbWVzc2FnZS5leHRlbnNpb25zX2J5X25hbWVbIm5lc3RlZF9leHRlbnNpb24iXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwNSwgbmVzdGVkX2V4dGVuc2lvbi5HZXRPcHRpb25zKCkuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpZWxkX29wdDJdKQorCisgIGRlZiB0ZXN0RmlsZURlc2NyaXB0b3JSZWZlcmVuY2VzKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9lbnVtLmZpbGUsIHNlbGYubXlfZmlsZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfbWVzc2FnZS5maWxlLCBzZWxmLm15X2ZpbGUpCisKKyAgZGVmIHRlc3RGaWxlRGVzY3JpcHRvcihzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfZmlsZS5uYW1lLCAnc29tZS9maWxlbmFtZS9zb21lLnByb3RvJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfZmlsZS5wYWNrYWdlLCAncHJvdG9idWZfdW5pdHRlc3QnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9maWxlLnBvb2wsIHNlbGYucG9vbCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubXlfZmlsZS5oYXNfb3B0aW9ucykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdwcm90bzInLCBzZWxmLm15X2ZpbGUuc3ludGF4KQorICAgIGZpbGVfcHJvdG8gPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvKCkKKyAgICBzZWxmLm15X2ZpbGUuQ29weVRvUHJvdG8oZmlsZV9wcm90bykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfZmlsZS5zZXJpYWxpemVkX3BiLAorICAgICAgICAgICAgICAgICAgICAgZmlsZV9wcm90by5TZXJpYWxpemVUb1N0cmluZygpKQorICAgICMgR2VuZXJhdGVkIG1vZHVsZXMgYWxzbyBiZWxvbmcgdG8gdGhlIGRlZmF1bHQgcG9vbC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SLnBvb2wsIGRlc2NyaXB0b3JfcG9vbC5EZWZhdWx0KCkpCisKKyAgQHVuaXR0ZXN0LnNraXBJZigKKyAgICAgIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ3B5dGhvbicsCisgICAgICAnSW1tdXRhYmlsaXR5IG9mIGRlc2NyaXB0b3JzIGlzIG9ubHkgZW5mb3JjZWQgaW4gdjIgaW1wbGVtZW50YXRpb24nKQorICBkZWYgdGVzdEltbXV0YWJsZUNwcERlc2NyaXB0b3Ioc2VsZik6CisgICAgZmlsZV9kZXNjcmlwdG9yID0gdW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IKKyAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IKKyAgICBmaWVsZF9kZXNjcmlwdG9yID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9pbnQzMiddCisgICAgZW51bV9kZXNjcmlwdG9yID0gbWVzc2FnZV9kZXNjcmlwdG9yLmVudW1fdHlwZXNfYnlfbmFtZVsnTmVzdGVkRW51bSddCisgICAgb25lb2ZfZGVzY3JpcHRvciA9IG1lc3NhZ2VfZGVzY3JpcHRvci5vbmVvZnNfYnlfbmFtZVsnb25lb2ZfZmllbGQnXQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lID0gTm9uZQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZVsnQW5vdGhlciddID0gTm9uZQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHMuYXBwZW5kKE5vbmUpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICBmaWVsZF9kZXNjcmlwdG9yLmNvbnRhaW5pbmdfdHlwZSA9IG1lc3NhZ2VfZGVzY3JpcHRvcgorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgZmlsZV9kZXNjcmlwdG9yLmhhc19vcHRpb25zID0gRmFsc2UKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgIGZpZWxkX2Rlc2NyaXB0b3IuaGFzX29wdGlvbnMgPSBGYWxzZQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgb25lb2ZfZGVzY3JpcHRvci5oYXNfb3B0aW9ucyA9IEZhbHNlCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICBlbnVtX2Rlc2NyaXB0b3IuaGFzX29wdGlvbnMgPSBGYWxzZQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpIGFzIGU6CisgICAgICBtZXNzYWdlX2Rlc2NyaXB0b3IuaGFzX29wdGlvbnMgPSBUcnVlCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnYXR0cmlidXRlIGlzIG5vdCB3cml0YWJsZTogaGFzX29wdGlvbnMnLAorICAgICAgICAgICAgICAgICAgICAgc3RyKGUuZXhjZXB0aW9uKSkKKworICBkZWYgdGVzdERlZmF1bHQoc2VsZik6CisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SCisgICAgZmllbGQgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbJ3JlcGVhdGVkX2ludDMyJ10KKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpZWxkLmRlZmF1bHRfdmFsdWUsIFtdKQorICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lWydyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSddCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaWVsZC5kZWZhdWx0X3ZhbHVlLCBbXSkKKyAgICBmaWVsZCA9IG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxncm91cCddCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaWVsZC5kZWZhdWx0X3ZhbHVlLCBOb25lKQorICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSddCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaWVsZC5kZWZhdWx0X3ZhbHVlLCBOb25lKQorCisKK2NsYXNzIE5ld0Rlc2NyaXB0b3JUZXN0KERlc2NyaXB0b3JUZXN0KToKKyAgIiIiUmVkbyB0aGUgc2FtZSB0ZXN0cyBhcyBhYm92ZSwgYnV0IHdpdGggYSBzZXBhcmF0ZSBEZXNjcmlwdG9yUG9vbC4iIiIKKworICBkZWYgR2V0RGVzY3JpcHRvclBvb2woc2VsZik6CisgICAgcmV0dXJuIGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbCgpCisKKworY2xhc3MgR2VuZXJhdGVkRGVzY3JpcHRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAiIiJUZXN0cyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgZGVzY3JpcHRvcnMgaW4gZ2VuZXJhdGVkIGNvZGUuIiIiCisKKyAgZGVmIENoZWNrTWVzc2FnZURlc2NyaXB0b3Ioc2VsZiwgbWVzc2FnZV9kZXNjcmlwdG9yKToKKyAgICAjIEJhc2ljIHByb3BlcnRpZXMKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lLCAnVGVzdEFsbFR5cGVzJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzJykKKyAgICAjIFRlc3QgZXF1YWxpdHkgYW5kIGhhc2hhYmlsaXR5CisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlX2Rlc2NyaXB0b3IsIG1lc3NhZ2VfZGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNbMF0uY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yKQorICAgIHNlbGYuYXNzZXJ0SW4obWVzc2FnZV9kZXNjcmlwdG9yLCBbbWVzc2FnZV9kZXNjcmlwdG9yXSkKKyAgICBzZWxmLmFzc2VydEluKG1lc3NhZ2VfZGVzY3JpcHRvciwge21lc3NhZ2VfZGVzY3JpcHRvcjogTm9uZX0pCisgICAgIyBUZXN0IGZpZWxkIGNvbnRhaW5lcnMKKyAgICBzZWxmLkNoZWNrRGVzY3JpcHRvclNlcXVlbmNlKG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHMpCisgICAgc2VsZi5DaGVja0Rlc2NyaXB0b3JNYXBwaW5nKG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZSkKKyAgICBzZWxmLkNoZWNrRGVzY3JpcHRvck1hcHBpbmcobWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9udW1iZXIpCisgICAgc2VsZi5DaGVja0Rlc2NyaXB0b3JNYXBwaW5nKG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfY2FtZWxjYXNlX25hbWUpCisgICAgc2VsZi5DaGVja0Rlc2NyaXB0b3JNYXBwaW5nKG1lc3NhZ2VfZGVzY3JpcHRvci5lbnVtX3R5cGVzX2J5X25hbWUpCisgICAgc2VsZi5DaGVja0Rlc2NyaXB0b3JNYXBwaW5nKG1lc3NhZ2VfZGVzY3JpcHRvci5lbnVtX3ZhbHVlc19ieV9uYW1lKQorICAgIHNlbGYuQ2hlY2tEZXNjcmlwdG9yTWFwcGluZyhtZXNzYWdlX2Rlc2NyaXB0b3Iub25lb2ZzX2J5X25hbWUpCisgICAgc2VsZi5DaGVja0Rlc2NyaXB0b3JNYXBwaW5nKG1lc3NhZ2VfZGVzY3JpcHRvci5lbnVtX3R5cGVzWzBdLnZhbHVlc19ieV9uYW1lKQorICAgICMgVGVzdCBleHRlbnNpb24gcmFuZ2UKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2VfZGVzY3JpcHRvci5leHRlbnNpb25fcmFuZ2VzLCBbXSkKKworICBkZWYgQ2hlY2tGaWVsZERlc2NyaXB0b3Ioc2VsZiwgZmllbGRfZGVzY3JpcHRvcik6CisgICAgIyBCYXNpYyBwcm9wZXJ0aWVzCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaWVsZF9kZXNjcmlwdG9yLm5hbWUsICdvcHRpb25hbF9pbnQzMicpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaWVsZF9kZXNjcmlwdG9yLmNhbWVsY2FzZV9uYW1lLCAnb3B0aW9uYWxJbnQzMicpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaWVsZF9kZXNjcmlwdG9yLmZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMub3B0aW9uYWxfaW50MzInKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmllbGRfZGVzY3JpcHRvci5jb250YWluaW5nX3R5cGUubmFtZSwgJ1Rlc3RBbGxUeXBlcycpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaWVsZF9kZXNjcmlwdG9yLmZpbGUsIHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SKQorICAgICMgVGVzdCBlcXVhbGl0eSBhbmQgaGFzaGFiaWxpdHkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpZWxkX2Rlc2NyaXB0b3IsIGZpZWxkX2Rlc2NyaXB0b3IpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgZmllbGRfZGVzY3JpcHRvci5jb250YWluaW5nX3R5cGUuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2ludDMyJ10sCisgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgZmllbGRfZGVzY3JpcHRvci5jb250YWluaW5nX3R5cGUuZmllbGRzX2J5X2NhbWVsY2FzZV9uYW1lWworICAgICAgICAgICAgJ29wdGlvbmFsSW50MzInXSwKKyAgICAgICAgZmllbGRfZGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydEluKGZpZWxkX2Rlc2NyaXB0b3IsIFtmaWVsZF9kZXNjcmlwdG9yXSkKKyAgICBzZWxmLmFzc2VydEluKGZpZWxkX2Rlc2NyaXB0b3IsIHtmaWVsZF9kZXNjcmlwdG9yOiBOb25lfSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZpZWxkX2Rlc2NyaXB0b3IuZXh0ZW5zaW9uX3Njb3BlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZmllbGRfZGVzY3JpcHRvci5lbnVtX3R5cGUpCisgICAgc2VsZi5hc3NlcnRUcnVlKGZpZWxkX2Rlc2NyaXB0b3IuaGFzX3ByZXNlbmNlKQorICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ2NwcCc6CisgICAgICAjIEZvciB0ZXN0IGNvdmVyYWdlIG9ubHkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmllbGRfZGVzY3JpcHRvci5pZCwgZmllbGRfZGVzY3JpcHRvci5pZCkKKworICBkZWYgQ2hlY2tEZXNjcmlwdG9yU2VxdWVuY2Uoc2VsZiwgc2VxdWVuY2UpOgorICAgICMgVmVyaWZpZXMgdGhhdCBhIHByb3BlcnR5IGxpa2UgJ21lc3NhZ2VEZXNjcmlwdG9yLmZpZWxkcycgaGFzIGFsbCB0aGUKKyAgICAjIHByb3BlcnRpZXMgb2YgYW4gaW1tdXRhYmxlIGFiYy5TZXF1ZW5jZS4KKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zLkRFU0NSSVBUT1IuZmllbGRzKQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VxdWVuY2UsIFtdKQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VxdWVuY2UsIDEpCisgICAgc2VsZi5hc3NlcnRGYWxzZShzZXF1ZW5jZSA9PSAxKSAgIyBPbmx5IGZvciBjcHAgdGVzdCBjb3ZlcmFnZQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VxdWVuY2UsIHNlcXVlbmNlKQorICAgIGV4cGVjdGVkX2xpc3QgPSBsaXN0KHNlcXVlbmNlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfbGlzdCwgc2VxdWVuY2UpCisgICAgc2VsZi5hc3NlcnRHcmVhdGVyKGxlbihzZXF1ZW5jZSksIDApICAjIFNpemVkCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VxdWVuY2UpLCBsZW4oZXhwZWN0ZWRfbGlzdCkpICAjIEl0ZXJhYmxlCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZXF1ZW5jZVtsZW4oc2VxdWVuY2UpIC0xXSwgc2VxdWVuY2VbLTFdKQorICAgIGl0ZW0gPSBzZXF1ZW5jZVswXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbSwgc2VxdWVuY2VbMF0pCisgICAgc2VsZi5hc3NlcnRJbihpdGVtLCBzZXF1ZW5jZSkgICMgQ29udGFpbmVyCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZXF1ZW5jZS5pbmRleChpdGVtKSwgMCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlcXVlbmNlLmNvdW50KGl0ZW0pLCAxKQorICAgIG90aGVyX2l0ZW0gPSB1bml0dGVzdF9wYjIuTmVzdGVkVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IuZmllbGRzWzBdCisgICAgc2VsZi5hc3NlcnROb3RJbihvdGhlcl9pdGVtLCBzZXF1ZW5jZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlcXVlbmNlLmNvdW50KG90aGVyX2l0ZW0pLCAwKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlcXVlbmNlLmluZGV4LCBvdGhlcl9pdGVtKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlcXVlbmNlLmluZGV4LCBbXSkKKyAgICByZXZlcnNlZF9pdGVyYXRvciA9IHJldmVyc2VkKHNlcXVlbmNlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChyZXZlcnNlZF9pdGVyYXRvciksIGxpc3Qoc2VxdWVuY2UpWzo6LTFdKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIG5leHQsIHJldmVyc2VkX2l0ZXJhdG9yKQorICAgIGV4cGVjdGVkX2xpc3RbMF0gPSAnY2hhbmdlIHZhbHVlJworICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZXhwZWN0ZWRfbGlzdCwgc2VxdWVuY2UpCisgICAgIyBUT0RPKGppZWx1byk6IENoYW5nZSBfX3JlcHJfXyBzdXBwb3J0IGZvciBEZXNjcmlwdG9yU2VxdWVuY2UuCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAncHl0aG9uJzoKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGxpc3Qoc2VxdWVuY2UpKSwgc3RyKHNlcXVlbmNlKSkKKyAgICBlbHNlOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoc2VxdWVuY2UpWzBdLCAnPCcpCisKKyAgZGVmIENoZWNrRGVzY3JpcHRvck1hcHBpbmcoc2VsZiwgbWFwcGluZyk6CisgICAgIyBWZXJpZmllcyB0aGF0IGEgcHJvcGVydHkgbGlrZSAnbWVzc2FnZURlc2NyaXB0b3IuZmllbGRzJyBoYXMgYWxsIHRoZQorICAgICMgcHJvcGVydGllcyBvZiBhbiBpbW11dGFibGUgYWJjLk1hcHBpbmcuCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKKyAgICAgICAgbWFwcGluZywgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWUpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChtYXBwaW5nLCB7fSkKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG1hcHBpbmcsIDEpCisgICAgc2VsZi5hc3NlcnRGYWxzZShtYXBwaW5nID09IDEpICAjIE9ubHkgZm9yIGNwcCB0ZXN0IGNvdmVyYWdlCisgICAgZXhjZXB0ZWRfZGljdCA9IGRpY3QobWFwcGluZy5pdGVtcygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFwcGluZywgZXhjZXB0ZWRfZGljdCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1hcHBpbmcsIG1hcHBpbmcpCisgICAgc2VsZi5hc3NlcnRHcmVhdGVyKGxlbihtYXBwaW5nKSwgMCkgICMgU2l6ZWQKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtYXBwaW5nKSwgbGVuKGV4Y2VwdGVkX2RpY3QpKSAgIyBJdGVyYWJsZQorICAgIGtleSwgaXRlbSA9IG5leHQoaXRlcihtYXBwaW5nLml0ZW1zKCkpKQorICAgIHNlbGYuYXNzZXJ0SW4oa2V5LCBtYXBwaW5nKSAgIyBDb250YWluZXIKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1hcHBpbmcuZ2V0KGtleSksIGl0ZW0pCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgbWFwcGluZy5nZXQoKQorICAgICMgVE9ETyhqaWVsdW8pOiBGaXggcHl0aG9uIGFuZCBjcHAgZXh0ZW5zaW9uIGRpZmYuCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAncHl0aG9uJzoKKyAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWFwcGluZy5nZXQsIFtdKQorICAgIGVsc2U6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIG1hcHBpbmcuZ2V0KFtdKSkKKyAgICAjIGtleXMoKSwgaXRlcmtleXMoKSAmY28KKyAgICBpdGVtID0gKG5leHQoaXRlcihtYXBwaW5nLmtleXMoKSkpLCBuZXh0KGl0ZXIobWFwcGluZy52YWx1ZXMoKSkpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbSwgbmV4dChpdGVyKG1hcHBpbmcuaXRlbXMoKSkpKQorICAgIGV4Y2VwdGVkX2RpY3Rba2V5XSA9ICdjaGFuZ2UgdmFsdWUnCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChtYXBwaW5nLCBleGNlcHRlZF9kaWN0KQorICAgIGRlbCBleGNlcHRlZF9kaWN0W2tleV0KKyAgICBleGNlcHRlZF9kaWN0WyduZXdfa2V5J10gPSAnbmV3JworICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobWFwcGluZywgZXhjZXB0ZWRfZGljdCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbWFwcGluZy5fX2dldGl0ZW1fXywgJ2tleV9lcnJvcicpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIG1hcHBpbmcuX19nZXRpdGVtX18sIGxlbihtYXBwaW5nKSArIDEpCisgICAgIyBUT0RPKGppZWx1byk6IEFkZCBfX3JlcHJfXyBzdXBwb3J0IGZvciBEZXNjcmlwdG9yTWFwcGluZy4KKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdweXRob24nOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc3RyKGRpY3QobWFwcGluZy5pdGVtcygpKSkpLCBsZW4oc3RyKG1hcHBpbmcpKSkKKyAgICBlbHNlOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIobWFwcGluZylbMF0sICc8JykKKworICBkZWYgdGVzdERlc2NyaXB0b3Ioc2VsZik6CisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SCisgICAgc2VsZi5DaGVja01lc3NhZ2VEZXNjcmlwdG9yKG1lc3NhZ2VfZGVzY3JpcHRvcikKKyAgICBmaWVsZF9kZXNjcmlwdG9yID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9pbnQzMiddCisgICAgc2VsZi5DaGVja0ZpZWxkRGVzY3JpcHRvcihmaWVsZF9kZXNjcmlwdG9yKQorICAgIGZpZWxkX2Rlc2NyaXB0b3IgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzX2J5X2NhbWVsY2FzZV9uYW1lWworICAgICAgICAnb3B0aW9uYWxJbnQzMiddCisgICAgc2VsZi5DaGVja0ZpZWxkRGVzY3JpcHRvcihmaWVsZF9kZXNjcmlwdG9yKQorICAgIGVudW1fZGVzY3JpcHRvciA9IHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SLmVudW1fdHlwZXNfYnlfbmFtZVsKKyAgICAgICAgJ0ZvcmVpZ25FbnVtJ10KKyAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGVudW1fZGVzY3JpcHRvci5jb250YWluaW5nX3R5cGUpCisgICAgIyBUZXN0IGV4dGVuc2lvbiByYW5nZQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucy5ERVNDUklQVE9SLmV4dGVuc2lvbl9yYW5nZXMsCisgICAgICAgIFsoMSwgNTM2ODcwOTEyKV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcy5ERVNDUklQVE9SLmV4dGVuc2lvbl9yYW5nZXMsCisgICAgICAgIFsoNDIsIDQzKSwgKDQxNDMsIDQyNDQpLCAoNjU1MzYsIDUzNjg3MDkxMildKQorCisgIGRlZiB0ZXN0Q3BwRGVzY3JpcHRvckNvbnRhaW5lcihzZWxmKToKKyAgICBjb250YWluaW5nX2ZpbGUgPSB1bml0dGVzdF9wYjIuREVTQ1JJUFRPUgorICAgIHNlbGYuQ2hlY2tEZXNjcmlwdG9yU2VxdWVuY2UoY29udGFpbmluZ19maWxlLmRlcGVuZGVuY2llcykKKyAgICBzZWxmLkNoZWNrRGVzY3JpcHRvck1hcHBpbmcoY29udGFpbmluZ19maWxlLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZSkKKyAgICBzZWxmLkNoZWNrRGVzY3JpcHRvck1hcHBpbmcoY29udGFpbmluZ19maWxlLmVudW1fdHlwZXNfYnlfbmFtZSkKKyAgICBzZWxmLkNoZWNrRGVzY3JpcHRvck1hcHBpbmcoY29udGFpbmluZ19maWxlLnNlcnZpY2VzX2J5X25hbWUpCisgICAgc2VsZi5DaGVja0Rlc2NyaXB0b3JNYXBwaW5nKGNvbnRhaW5pbmdfZmlsZS5leHRlbnNpb25zX2J5X25hbWUpCisgICAgc2VsZi5DaGVja0Rlc2NyaXB0b3JNYXBwaW5nKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdE5lc3RlZEV4dGVuc2lvbi5ERVNDUklQVE9SLmV4dGVuc2lvbnNfYnlfbmFtZSkKKworICBkZWYgdGVzdENwcERlc2NyaXB0b3JDb250YWluZXJfSXRlcmF0b3Ioc2VsZik6CisgICAgIyBTYW1lIHRlc3Qgd2l0aCB0aGUgaXRlcmF0b3IKKyAgICBlbnVtID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SLmVudW1fdHlwZXNfYnlfbmFtZVsnTmVzdGVkRW51bSddCisgICAgdmFsdWVzX2l0ZXIgPSBpdGVyKGVudW0udmFsdWVzKQorICAgIGRlbCBlbnVtCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnRk9PJywgbmV4dCh2YWx1ZXNfaXRlcikubmFtZSkKKworICBkZWYgdGVzdERlc2NyaXB0b3JOZXN0ZWRUeXBlc0NvbnRhaW5lcihzZWxmKToKKyAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IKKyAgICBuZXN0ZWRfbWVzc2FnZV9kZXNjcmlwdG9yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtZXNzYWdlX2Rlc2NyaXB0b3IubmVzdGVkX3R5cGVzKSwgMykKKyAgICBzZWxmLmFzc2VydEZhbHNlKE5vbmUgaW4gbWVzc2FnZV9kZXNjcmlwdG9yLm5lc3RlZF90eXBlcykKKyAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgIG5lc3RlZF9tZXNzYWdlX2Rlc2NyaXB0b3IgaW4gbWVzc2FnZV9kZXNjcmlwdG9yLm5lc3RlZF90eXBlcykKKworICBkZWYgdGVzdFNlcnZpY2VEZXNjcmlwdG9yKHNlbGYpOgorICAgIHNlcnZpY2VfZGVzY3JpcHRvciA9IHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SLnNlcnZpY2VzX2J5X25hbWVbJ1Rlc3RTZXJ2aWNlJ10KKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZpY2VfZGVzY3JpcHRvci5uYW1lLCAnVGVzdFNlcnZpY2UnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmljZV9kZXNjcmlwdG9yLm1ldGhvZHNbMF0ubmFtZSwgJ0ZvbycpCisgICAgc2VsZi5hc3NlcnRJcyhzZXJ2aWNlX2Rlc2NyaXB0b3IuZmlsZSwgdW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2aWNlX2Rlc2NyaXB0b3IuaW5kZXgsIDApCisgICAgc2VsZi5DaGVja0Rlc2NyaXB0b3JNYXBwaW5nKHNlcnZpY2VfZGVzY3JpcHRvci5tZXRob2RzX2J5X25hbWUpCisKKyAgZGVmIHRlc3RPbmVvZkRlc2NyaXB0b3Ioc2VsZik6CisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SCisgICAgb25lb2ZfZGVzY3JpcHRvciA9IG1lc3NhZ2VfZGVzY3JpcHRvci5vbmVvZnNfYnlfbmFtZVsnb25lb2ZfZmllbGQnXQorICAgIHNlbGYuYXNzZXJ0RmFsc2Uob25lb2ZfZGVzY3JpcHRvci5oYXNfb3B0aW9ucykKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2VfZGVzY3JpcHRvciwgb25lb2ZfZGVzY3JpcHRvci5jb250YWluaW5nX3R5cGUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnb25lb2ZfZmllbGQnLCBvbmVvZl9kZXNjcmlwdG9yLm5hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLm9uZW9mX2ZpZWxkJywKKyAgICAgICAgICAgICAgICAgICAgIG9uZW9mX2Rlc2NyaXB0b3IuZnVsbF9uYW1lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgb25lb2ZfZGVzY3JpcHRvci5pbmRleCkKKworCitjbGFzcyBEZXNjcmlwdG9yQ29weVRvUHJvdG9UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgIiIiVGVzdHMgZm9yIENvcHlUbyBmdW5jdGlvbnMgb2YgRGVzY3JpcHRvci4iIiIKKworICBkZWYgX0Fzc2VydFByb3RvRXF1YWwoc2VsZiwgYWN0dWFsX3Byb3RvLCBleHBlY3RlZF9jbGFzcywgZXhwZWN0ZWRfYXNjaWkpOgorICAgIGV4cGVjdGVkX3Byb3RvID0gZXhwZWN0ZWRfY2xhc3MoKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKGV4cGVjdGVkX2FzY2lpLCBleHBlY3RlZF9wcm90bykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGFjdHVhbF9wcm90bywgZXhwZWN0ZWRfcHJvdG8sCisgICAgICAgICdOb3QgZXF1YWwsXG5BY3R1YWw6XG4lc1xuRXhwZWN0ZWQ6XG4lc1xuJworICAgICAgICAlIChzdHIoYWN0dWFsX3Byb3RvKSwgc3RyKGV4cGVjdGVkX3Byb3RvKSkpCisKKyAgZGVmIF9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90byhzZWxmLCBkZXNjLCBleHBlY3RlZF9wcm90b19jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9wcm90b19hc2NpaSk6CisgICAgYWN0dWFsID0gZXhwZWN0ZWRfcHJvdG9fY2xhc3MoKQorICAgIGRlc2MuQ29weVRvUHJvdG8oYWN0dWFsKQorICAgIHNlbGYuX0Fzc2VydFByb3RvRXF1YWwoCisgICAgICAgIGFjdHVhbCwgZXhwZWN0ZWRfcHJvdG9fY2xhc3MsIGV4cGVjdGVkX3Byb3RvX2FzY2lpKQorCisgIGRlZiB0ZXN0Q29weVRvUHJvdG9fRW1wdHlNZXNzYWdlKHNlbGYpOgorICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZS5ERVNDUklQVE9SLAorICAgICAgICBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8sCisgICAgICAgIFRFU1RfRU1QVFlfTUVTU0FHRV9ERVNDUklQVE9SX0FTQ0lJKQorCisgIGRlZiB0ZXN0Q29weVRvUHJvdG9fTmVzdGVkTWVzc2FnZShzZWxmKToKKyAgICBURVNUX05FU1RFRF9NRVNTQUdFX0FTQ0lJID0gIiIiCisgICAgICBuYW1lOiAnTmVzdGVkTWVzc2FnZScKKyAgICAgIGZpZWxkOiA8CisgICAgICAgIG5hbWU6ICdiYicKKyAgICAgICAgbnVtYmVyOiAxCisgICAgICAgIGxhYmVsOiAxICAjIE9wdGlvbmFsCisgICAgICAgIHR5cGU6IDUgICMgVFlQRV9JTlQzMgorICAgICAgPgorICAgICAgIiIiCisKKyAgICBzZWxmLl9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90bygKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IsCisgICAgICAgIGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bywKKyAgICAgICAgVEVTVF9ORVNURURfTUVTU0FHRV9BU0NJSSkKKworICBkZWYgdGVzdENvcHlUb1Byb3RvX0ZvcmVpZ25OZXN0ZWRNZXNzYWdlKHNlbGYpOgorICAgIFRFU1RfRk9SRUlHTl9ORVNURURfQVNDSUkgPSAiIiIKKyAgICAgIG5hbWU6ICdUZXN0Rm9yZWlnbk5lc3RlZCcKKyAgICAgIGZpZWxkOiA8CisgICAgICAgIG5hbWU6ICdmb3JlaWduX25lc3RlZCcKKyAgICAgICAgbnVtYmVyOiAxCisgICAgICAgIGxhYmVsOiAxICAjIE9wdGlvbmFsCisgICAgICAgIHR5cGU6IDExICAjIFRZUEVfTUVTU0FHRQorICAgICAgICB0eXBlX25hbWU6ICcucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnCisgICAgICA+CisgICAgICAiIiIKKworICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEZvcmVpZ25OZXN0ZWQuREVTQ1JJUFRPUiwKKyAgICAgICAgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLAorICAgICAgICBURVNUX0ZPUkVJR05fTkVTVEVEX0FTQ0lJKQorCisgIGRlZiB0ZXN0Q29weVRvUHJvdG9fRm9yZWlnbkVudW0oc2VsZik6CisgICAgVEVTVF9GT1JFSUdOX0VOVU1fQVNDSUkgPSAiIiIKKyAgICAgIG5hbWU6ICdGb3JlaWduRW51bScKKyAgICAgIHZhbHVlOiA8CisgICAgICAgIG5hbWU6ICdGT1JFSUdOX0ZPTycKKyAgICAgICAgbnVtYmVyOiA0CisgICAgICA+CisgICAgICB2YWx1ZTogPAorICAgICAgICBuYW1lOiAnRk9SRUlHTl9CQVInCisgICAgICAgIG51bWJlcjogNQorICAgICAgPgorICAgICAgdmFsdWU6IDwKKyAgICAgICAgbmFtZTogJ0ZPUkVJR05fQkFaJworICAgICAgICBudW1iZXI6IDYKKyAgICAgID4KKyAgICAgICIiIgorCisgICAgc2VsZi5fSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oCisgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduRW51bS5ERVNDUklQVE9SLAorICAgICAgICBkZXNjcmlwdG9yX3BiMi5FbnVtRGVzY3JpcHRvclByb3RvLAorICAgICAgICBURVNUX0ZPUkVJR05fRU5VTV9BU0NJSSkKKworICBkZWYgdGVzdENvcHlUb1Byb3RvX09wdGlvbnMoc2VsZik6CisgICAgVEVTVF9ERVBSRUNBVEVEX0ZJRUxEU19BU0NJSSA9ICIiIgorICAgICAgbmFtZTogJ1Rlc3REZXByZWNhdGVkRmllbGRzJworICAgICAgZmllbGQ6IDwKKyAgICAgICAgbmFtZTogJ2RlcHJlY2F0ZWRfaW50MzInCisgICAgICAgIG51bWJlcjogMQorICAgICAgICBsYWJlbDogMSAgIyBPcHRpb25hbAorICAgICAgICB0eXBlOiA1ICAjIFRZUEVfSU5UMzIKKyAgICAgICAgb3B0aW9uczogPAorICAgICAgICAgIGRlcHJlY2F0ZWQ6IHRydWUKKyAgICAgICAgPgorICAgICAgPgorICAgICAgZmllbGQgeworICAgICAgICBuYW1lOiAiZGVwcmVjYXRlZF9pbnQzMl9pbl9vbmVvZiIKKyAgICAgICAgbnVtYmVyOiAyCisgICAgICAgIGxhYmVsOiBMQUJFTF9PUFRJT05BTAorICAgICAgICB0eXBlOiBUWVBFX0lOVDMyCisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgIGRlcHJlY2F0ZWQ6IHRydWUKKyAgICAgICAgfQorICAgICAgICBvbmVvZl9pbmRleDogMAorICAgICAgfQorICAgICAgb25lb2ZfZGVjbCB7CisgICAgICAgIG5hbWU6ICJvbmVvZl9maWVsZHMiCisgICAgICB9CisgICAgICAiIiIKKworICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdERlcHJlY2F0ZWRGaWVsZHMuREVTQ1JJUFRPUiwKKyAgICAgICAgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLAorICAgICAgICBURVNUX0RFUFJFQ0FURURfRklFTERTX0FTQ0lJKQorCisgIGRlZiB0ZXN0Q29weVRvUHJvdG9fQWxsRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBURVNUX0VNUFRZX01FU1NBR0VfV0lUSF9FWFRFTlNJT05TX0FTQ0lJID0gIiIiCisgICAgICBuYW1lOiAnVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zJworICAgICAgZXh0ZW5zaW9uX3JhbmdlOiA8CisgICAgICAgIHN0YXJ0OiAxCisgICAgICAgIGVuZDogNTM2ODcwOTEyCisgICAgICA+CisgICAgICAiIiIKKworICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLkRFU0NSSVBUT1IsCisgICAgICAgIGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bywKKyAgICAgICAgVEVTVF9FTVBUWV9NRVNTQUdFX1dJVEhfRVhURU5TSU9OU19BU0NJSSkKKworICBkZWYgdGVzdENvcHlUb1Byb3RvX1NldmVyYWxFeHRlbnNpb25zKHNlbGYpOgorICAgIFRFU1RfTUVTU0FHRV9XSVRIX1NFVkVSQUxfRVhURU5TSU9OU19BU0NJSSA9ICIiIgorICAgICAgbmFtZTogJ1Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcycKKyAgICAgIGV4dGVuc2lvbl9yYW5nZTogPAorICAgICAgICBzdGFydDogNDIKKyAgICAgICAgZW5kOiA0MworICAgICAgPgorICAgICAgZXh0ZW5zaW9uX3JhbmdlOiA8CisgICAgICAgIHN0YXJ0OiA0MTQzCisgICAgICAgIGVuZDogNDI0NAorICAgICAgPgorICAgICAgZXh0ZW5zaW9uX3JhbmdlOiA8CisgICAgICAgIHN0YXJ0OiA2NTUzNgorICAgICAgICBlbmQ6IDUzNjg3MDkxMgorICAgICAgPgorICAgICAgIiIiCisKKyAgICBzZWxmLl9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90bygKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcy5ERVNDUklQVE9SLAorICAgICAgICBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8sCisgICAgICAgIFRFU1RfTUVTU0FHRV9XSVRIX1NFVkVSQUxfRVhURU5TSU9OU19BU0NJSSkKKworICBkZWYgdGVzdENvcHlUb1Byb3RvX0ZpbGVEZXNjcmlwdG9yKHNlbGYpOgorICAgIFVOSVRURVNUX0lNUE9SVF9GSUxFX0RFU0NSSVBUT1JfQVNDSUkgPSAoIiIiCisgICAgICBuYW1lOiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90bycKKyAgICAgIHBhY2thZ2U6ICdwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQnCisgICAgICBkZXBlbmRlbmN5OiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8nCisgICAgICBtZXNzYWdlX3R5cGU6IDwKKyAgICAgICAgbmFtZTogJ0ltcG9ydE1lc3NhZ2UnCisgICAgICAgIGZpZWxkOiA8CisgICAgICAgICAgbmFtZTogJ2QnCisgICAgICAgICAgbnVtYmVyOiAxCisgICAgICAgICAgbGFiZWw6IDEgICMgT3B0aW9uYWwKKyAgICAgICAgICB0eXBlOiA1ICAjIFRZUEVfSU5UMzIKKyAgICAgICAgPgorICAgICAgPgorICAgICAgIiIiICsKKyAgICAgICIiImVudW1fdHlwZTogPAorICAgICAgICBuYW1lOiAnSW1wb3J0RW51bScKKyAgICAgICAgdmFsdWU6IDwKKyAgICAgICAgICBuYW1lOiAnSU1QT1JUX0ZPTycKKyAgICAgICAgICBudW1iZXI6IDcKKyAgICAgICAgPgorICAgICAgICB2YWx1ZTogPAorICAgICAgICAgIG5hbWU6ICdJTVBPUlRfQkFSJworICAgICAgICAgIG51bWJlcjogOAorICAgICAgICA+CisgICAgICAgIHZhbHVlOiA8CisgICAgICAgICAgbmFtZTogJ0lNUE9SVF9CQVonCisgICAgICAgICAgbnVtYmVyOiA5CisgICAgICAgID4KKyAgICAgID4KKyAgICAgIGVudW1fdHlwZTogPAorICAgICAgICBuYW1lOiAnSW1wb3J0RW51bUZvck1hcCcKKyAgICAgICAgdmFsdWU6IDwKKyAgICAgICAgICBuYW1lOiAnVU5LTk9XTicKKyAgICAgICAgICBudW1iZXI6IDAKKyAgICAgICAgPgorICAgICAgICB2YWx1ZTogPAorICAgICAgICAgIG5hbWU6ICdGT08nCisgICAgICAgICAgbnVtYmVyOiAxCisgICAgICAgID4KKyAgICAgICAgdmFsdWU6IDwKKyAgICAgICAgICBuYW1lOiAnQkFSJworICAgICAgICAgIG51bWJlcjogMgorICAgICAgICA+CisgICAgICA+CisgICAgICBvcHRpb25zOiA8CisgICAgICAgIGphdmFfcGFja2FnZTogJ2NvbS5nb29nbGUucHJvdG9idWYudGVzdCcKKyAgICAgICAgb3B0aW1pemVfZm9yOiAxICAjIFNQRUVECisgICAgICAiIiIgKworICAgICAgIiIiCisgICAgICAgIGNjX2VuYWJsZV9hcmVuYXM6IHRydWUKKyAgICAgID4KKyAgICAgIHB1YmxpY19kZXBlbmRlbmN5OiAwCisgICAgIiIiKQorICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAorICAgICAgICB1bml0dGVzdF9pbXBvcnRfcGIyLkRFU0NSSVBUT1IsCisgICAgICAgIGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8sCisgICAgICAgIFVOSVRURVNUX0lNUE9SVF9GSUxFX0RFU0NSSVBUT1JfQVNDSUkpCisKKyAgZGVmIHRlc3RDb3B5VG9Qcm90b19TZXJ2aWNlRGVzY3JpcHRvcihzZWxmKToKKyAgICBURVNUX1NFUlZJQ0VfQVNDSUkgPSAiIiIKKyAgICAgIG5hbWU6ICdUZXN0U2VydmljZScKKyAgICAgIG1ldGhvZDogPAorICAgICAgICBuYW1lOiAnRm9vJworICAgICAgICBpbnB1dF90eXBlOiAnLnByb3RvYnVmX3VuaXR0ZXN0LkZvb1JlcXVlc3QnCisgICAgICAgIG91dHB1dF90eXBlOiAnLnByb3RvYnVmX3VuaXR0ZXN0LkZvb1Jlc3BvbnNlJworICAgICAgPgorICAgICAgbWV0aG9kOiA8CisgICAgICAgIG5hbWU6ICdCYXInCisgICAgICAgIGlucHV0X3R5cGU6ICcucHJvdG9idWZfdW5pdHRlc3QuQmFyUmVxdWVzdCcKKyAgICAgICAgb3V0cHV0X3R5cGU6ICcucHJvdG9idWZfdW5pdHRlc3QuQmFyUmVzcG9uc2UnCisgICAgICA+CisgICAgICAiIiIKKyAgICBzZWxmLl9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90bygKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RTZXJ2aWNlLkRFU0NSSVBUT1IsCisgICAgICAgIGRlc2NyaXB0b3JfcGIyLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8sCisgICAgICAgIFRFU1RfU0VSVklDRV9BU0NJSSkKKworICBkZWYgdGVzdENvcHlUb1Byb3RvX01ldGhvZERlc2NyaXB0b3Ioc2VsZik6CisgICAgZXhwZWN0ZWRfYXNjaWkgPSAiIiIKKyAgICAgIG5hbWU6ICdGb28nCisgICAgICBpbnB1dF90eXBlOiAnLnByb3RvYnVmX3VuaXR0ZXN0LkZvb1JlcXVlc3QnCisgICAgICBvdXRwdXRfdHlwZTogJy5wcm90b2J1Zl91bml0dGVzdC5Gb29SZXNwb25zZScKKyAgICAiIiIKKyAgICBtZXRob2RfZGVzY3JpcHRvciA9IHVuaXR0ZXN0X3BiMi5UZXN0U2VydmljZS5ERVNDUklQVE9SLkZpbmRNZXRob2RCeU5hbWUoCisgICAgICAgICdGb28nKQorICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAorICAgICAgICBtZXRob2RfZGVzY3JpcHRvciwKKyAgICAgICAgZGVzY3JpcHRvcl9wYjIuTWV0aG9kRGVzY3JpcHRvclByb3RvLAorICAgICAgICBleHBlY3RlZF9hc2NpaSkKKworICBAdW5pdHRlc3Quc2tpcElmKAorICAgICAgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAncHl0aG9uJywKKyAgICAgICdQdXJlIHB5dGhvbiBkb2VzIG5vdCByYWlzZSBlcnJvci4nKQorICAjIFRPRE8oamllbHVvKTogRml4IHB1cmUgcHl0aG9uIHRvIGNoZWNrIHdpdGggdGhlIHByb3RvIHR5cGUuCisgIGRlZiB0ZXN0Q29weVRvUHJvdG9fVHlwZUVycm9yKHNlbGYpOgorICAgIGZpbGVfcHJvdG8gPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UuREVTQ1JJUFRPUi5Db3B5VG9Qcm90bywKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlX3Byb3RvKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uREVTQ1JJUFRPUi5Db3B5VG9Qcm90bywKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlX3Byb3RvKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdFNlcnZpY2UuREVTQ1JJUFRPUi5Db3B5VG9Qcm90bywKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlX3Byb3RvKQorICAgIHByb3RvID0gZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfaW1wb3J0X3BiMi5ERVNDUklQVE9SLkNvcHlUb1Byb3RvLAorICAgICAgICAgICAgICAgICAgICAgIHByb3RvKQorCisKK2NsYXNzIE1ha2VEZXNjcmlwdG9yVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RNYWtlRGVzY3JpcHRvcldpdGhOZXN0ZWRGaWVsZHMoc2VsZik6CisgICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bygpCisgICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLm5hbWUgPSAnRm9vMicKKyAgICBtZXNzYWdlX3R5cGUgPSBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8ubWVzc2FnZV90eXBlLmFkZCgpCisgICAgbWVzc2FnZV90eXBlLm5hbWUgPSBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8ubmFtZQorICAgIG5lc3RlZF90eXBlID0gbWVzc2FnZV90eXBlLm5lc3RlZF90eXBlLmFkZCgpCisgICAgbmVzdGVkX3R5cGUubmFtZSA9ICdTdWInCisgICAgZW51bV90eXBlID0gbmVzdGVkX3R5cGUuZW51bV90eXBlLmFkZCgpCisgICAgZW51bV90eXBlLm5hbWUgPSAnRk9PJworICAgIGVudW1fdHlwZV92YWwgPSBlbnVtX3R5cGUudmFsdWUuYWRkKCkKKyAgICBlbnVtX3R5cGVfdmFsLm5hbWUgPSAnQkFSJworICAgIGVudW1fdHlwZV92YWwubnVtYmVyID0gMworICAgIGZpZWxkID0gbWVzc2FnZV90eXBlLmZpZWxkLmFkZCgpCisgICAgZmllbGQubnVtYmVyID0gMQorICAgIGZpZWxkLm5hbWUgPSAndWludDY0X2ZpZWxkJworICAgIGZpZWxkLmxhYmVsID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVRVUlSRUQKKyAgICBmaWVsZC50eXBlID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UNjQKKyAgICBmaWVsZCA9IG1lc3NhZ2VfdHlwZS5maWVsZC5hZGQoKQorICAgIGZpZWxkLm51bWJlciA9IDIKKyAgICBmaWVsZC5uYW1lID0gJ25lc3RlZF9tZXNzYWdlX2ZpZWxkJworICAgIGZpZWxkLmxhYmVsID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVRVUlSRUQKKyAgICBmaWVsZC50eXBlID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFCisgICAgZmllbGQudHlwZV9uYW1lID0gJ1N1YicKKyAgICBlbnVtX2ZpZWxkID0gbmVzdGVkX3R5cGUuZmllbGQuYWRkKCkKKyAgICBlbnVtX2ZpZWxkLm51bWJlciA9IDIKKyAgICBlbnVtX2ZpZWxkLm5hbWUgPSAnYmFyX2ZpZWxkJworICAgIGVudW1fZmllbGQubGFiZWwgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVFVSVJFRAorICAgIGVudW1fZmllbGQudHlwZSA9IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTQorICAgIGVudW1fZmllbGQudHlwZV9uYW1lID0gJ0ZvbzIuU3ViLkZPTycKKworICAgIHJlc3VsdCA9IGRlc2NyaXB0b3IuTWFrZURlc2NyaXB0b3IobWVzc2FnZV90eXBlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmZpZWxkc1swXS5jcHBfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfVUlOVDY0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmZpZWxkc1sxXS5jcHBfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5maWVsZHNbMV0ubWVzc2FnZV90eXBlLmNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5uZXN0ZWRfdHlwZXNbMF0uZmllbGRzWzBdLmZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICdGb28yLlN1Yi5iYXJfZmllbGQnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0Lm5lc3RlZF90eXBlc1swXS5maWVsZHNbMF0uZW51bV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm5lc3RlZF90eXBlc1swXS5lbnVtX3R5cGVzWzBdKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0Lmhhc19vcHRpb25zKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0LmZpZWxkc1swXS5oYXNfb3B0aW9ucykKKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdjcHAnOgorICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgIHJlc3VsdC5maWVsZHNbMF0uaGFzX29wdGlvbnMgPSBGYWxzZQorCisgIGRlZiB0ZXN0TWFrZURlc2NyaXB0b3JXaXRoVW5zaWduZWRJbnRGaWVsZChzZWxmKToKKyAgICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvKCkKKyAgICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8ubmFtZSA9ICdGb28nCisgICAgbWVzc2FnZV90eXBlID0gZmlsZV9kZXNjcmlwdG9yX3Byb3RvLm1lc3NhZ2VfdHlwZS5hZGQoKQorICAgIG1lc3NhZ2VfdHlwZS5uYW1lID0gZmlsZV9kZXNjcmlwdG9yX3Byb3RvLm5hbWUKKyAgICBlbnVtX3R5cGUgPSBtZXNzYWdlX3R5cGUuZW51bV90eXBlLmFkZCgpCisgICAgZW51bV90eXBlLm5hbWUgPSAnRk9PJworICAgIGVudW1fdHlwZV92YWwgPSBlbnVtX3R5cGUudmFsdWUuYWRkKCkKKyAgICBlbnVtX3R5cGVfdmFsLm5hbWUgPSAnQkFSJworICAgIGVudW1fdHlwZV92YWwubnVtYmVyID0gMworICAgIGZpZWxkID0gbWVzc2FnZV90eXBlLmZpZWxkLmFkZCgpCisgICAgZmllbGQubnVtYmVyID0gMQorICAgIGZpZWxkLm5hbWUgPSAndWludDY0X2ZpZWxkJworICAgIGZpZWxkLmxhYmVsID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVRVUlSRUQKKyAgICBmaWVsZC50eXBlID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UNjQKKyAgICBlbnVtX2ZpZWxkID0gbWVzc2FnZV90eXBlLmZpZWxkLmFkZCgpCisgICAgZW51bV9maWVsZC5udW1iZXIgPSAyCisgICAgZW51bV9maWVsZC5uYW1lID0gJ2Jhcl9maWVsZCcKKyAgICBlbnVtX2ZpZWxkLmxhYmVsID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVRVUlSRUQKKyAgICBlbnVtX2ZpZWxkLnR5cGUgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU0KKyAgICBlbnVtX2ZpZWxkLnR5cGVfbmFtZSA9ICdGb28uRk9PJworCisgICAgcmVzdWx0ID0gZGVzY3JpcHRvci5NYWtlRGVzY3JpcHRvcihtZXNzYWdlX3R5cGUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZmllbGRzWzBdLmNwcF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9VSU5UNjQpCisKKworICBkZWYgdGVzdE1ha2VEZXNjcmlwdG9yV2l0aE9wdGlvbnMoc2VsZik6CisgICAgZGVzY3JpcHRvcl9wcm90byA9IGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bygpCisgICAgYWdncmVnYXRlX21lc3NhZ2UgPSB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuQWdncmVnYXRlTWVzc2FnZQorICAgIGFnZ3JlZ2F0ZV9tZXNzYWdlLkRFU0NSSVBUT1IuQ29weVRvUHJvdG8oZGVzY3JpcHRvcl9wcm90bykKKyAgICByZWZvcm1lZF9kZXNjcmlwdG9yID0gZGVzY3JpcHRvci5NYWtlRGVzY3JpcHRvcihkZXNjcmlwdG9yX3Byb3RvKQorCisgICAgb3B0aW9ucyA9IHJlZm9ybWVkX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMDEsCisgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5FeHRlbnNpb25zW3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5tc2dvcHRdLmkpCisKKyAgZGVmIHRlc3RDYW1lbGNhc2VOYW1lKHNlbGYpOgorICAgIGRlc2NyaXB0b3JfcHJvdG8gPSBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8oKQorICAgIGRlc2NyaXB0b3JfcHJvdG8ubmFtZSA9ICdCYXInCisgICAgbmFtZXMgPSBbJ2Zvb19mb28nLCAnRm9vQmFyJywgJ2Zvb0JheicsICdmb29Gb28nLCAnZm9vYmFyJ10KKyAgICBjYW1lbGNhc2VfbmFtZXMgPSBbJ2Zvb0ZvbycsICdmb29CYXInLCAnZm9vQmF6JywgJ2Zvb0ZvbycsICdmb29iYXInXQorICAgIGZvciBpbmRleCBpbiByYW5nZShsZW4obmFtZXMpKToKKyAgICAgIGZpZWxkID0gZGVzY3JpcHRvcl9wcm90by5maWVsZC5hZGQoKQorICAgICAgZmllbGQubnVtYmVyID0gaW5kZXggKyAxCisgICAgICBmaWVsZC5uYW1lID0gbmFtZXNbaW5kZXhdCisgICAgcmVzdWx0ID0gZGVzY3JpcHRvci5NYWtlRGVzY3JpcHRvcihkZXNjcmlwdG9yX3Byb3RvKQorICAgIGZvciBpbmRleCBpbiByYW5nZShsZW4oY2FtZWxjYXNlX25hbWVzKSk6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5maWVsZHNbaW5kZXhdLmNhbWVsY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjYW1lbGNhc2VfbmFtZXNbaW5kZXhdKQorCisgIGRlZiB0ZXN0SnNvbk5hbWUoc2VsZik6CisgICAgZGVzY3JpcHRvcl9wcm90byA9IGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bygpCisgICAgZGVzY3JpcHRvcl9wcm90by5uYW1lID0gJ1Rlc3RKc29uTmFtZScKKyAgICBuYW1lcyA9IFsnZmllbGRfbmFtZScsICdmaWVsZE5hbWUnLCAnRmllbGROYW1lJywKKyAgICAgICAgICAgICAnX2ZpZWxkX25hbWUnLCAnRklFTERfTkFNRScsICdqc29uX25hbWUnXQorICAgIGpzb25fbmFtZXMgPSBbJ2ZpZWxkTmFtZScsICdmaWVsZE5hbWUnLCAnRmllbGROYW1lJywKKyAgICAgICAgICAgICAgICAgICdGaWVsZE5hbWUnLCAnRklFTEROQU1FJywgJ0B0eXBlJ10KKyAgICBmb3IgaW5kZXggaW4gcmFuZ2UobGVuKG5hbWVzKSk6CisgICAgICBmaWVsZCA9IGRlc2NyaXB0b3JfcHJvdG8uZmllbGQuYWRkKCkKKyAgICAgIGZpZWxkLm51bWJlciA9IGluZGV4ICsgMQorICAgICAgZmllbGQubmFtZSA9IG5hbWVzW2luZGV4XQorICAgIGZpZWxkLmpzb25fbmFtZSA9ICdAdHlwZScKKyAgICByZXN1bHQgPSBkZXNjcmlwdG9yLk1ha2VEZXNjcmlwdG9yKGRlc2NyaXB0b3JfcHJvdG8pCisgICAgZm9yIGluZGV4IGluIHJhbmdlKGxlbihqc29uX25hbWVzKSk6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5maWVsZHNbaW5kZXhdLmpzb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAganNvbl9uYW1lc1tpbmRleF0pCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VuY29kZXIucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VuY29kZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0ZjY1MgotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2Rlci5weQpAQCAtMCwwICsxLDgyOSBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJDb2RlIGZvciBlbmNvZGluZyBwcm90b2NvbCBtZXNzYWdlIHByaW1pdGl2ZXMuCisKK0NvbnRhaW5zIHRoZSBsb2dpYyBmb3IgZW5jb2RpbmcgZXZlcnkgbG9naWNhbCBwcm90b2NvbCBmaWVsZCB0eXBlCitpbnRvIG9uZSBvZiB0aGUgNSBwaHlzaWNhbCB3aXJlIHR5cGVzLgorCitUaGlzIGNvZGUgaXMgZGVzaWduZWQgdG8gcHVzaCB0aGUgUHl0aG9uIGludGVycHJldGVyJ3MgcGVyZm9ybWFuY2UgdG8gdGhlCitsaW1pdHMuCisKK1RoZSBiYXNpYyBpZGVhIGlzIHRoYXQgYXQgc3RhcnR1cCB0aW1lLCBmb3IgZXZlcnkgZmllbGQgKGkuZS4gZXZlcnkKK0ZpZWxkRGVzY3JpcHRvcikgd2UgY29uc3RydWN0IHR3byBmdW5jdGlvbnM6ICBhICJzaXplciIgYW5kIGFuICJlbmNvZGVyIi4gIFRoZQorc2l6ZXIgdGFrZXMgYSB2YWx1ZSBvZiB0aGlzIGZpZWxkJ3MgdHlwZSBhbmQgY29tcHV0ZXMgaXRzIGJ5dGUgc2l6ZS4gIFRoZQorZW5jb2RlciB0YWtlcyBhIHdyaXRlciBmdW5jdGlvbiBhbmQgYSB2YWx1ZS4gIEl0IGVuY29kZXMgdGhlIHZhbHVlIGludG8gYnl0ZQorc3RyaW5ncyBhbmQgaW52b2tlcyB0aGUgd3JpdGVyIGZ1bmN0aW9uIHRvIHdyaXRlIHRob3NlIHN0cmluZ3MuICBUeXBpY2FsbHkgdGhlCit3cml0ZXIgZnVuY3Rpb24gaXMgdGhlIHdyaXRlKCkgbWV0aG9kIG9mIGEgQnl0ZXNJTy4KKworV2UgdHJ5IHRvIGRvIGFzIG11Y2ggd29yayBhcyBwb3NzaWJsZSB3aGVuIGNvbnN0cnVjdGluZyB0aGUgd3JpdGVyIGFuZCB0aGUKK3NpemVyIHJhdGhlciB0aGFuIHdoZW4gY2FsbGluZyB0aGVtLiAgSW4gcGFydGljdWxhcjoKKyogV2UgY29weSBhbnkgbmVlZGVkIGdsb2JhbCBmdW5jdGlvbnMgdG8gbG9jYWwgdmFyaWFibGVzLCBzbyB0aGF0IHdlIGRvIG5vdCBuZWVkCisgIHRvIGRvIGNvc3RseSBnbG9iYWwgdGFibGUgbG9va3VwcyBhdCBydW50aW1lLgorKiBTaW1pbGFybHksIHdlIHRyeSB0byBkbyBhbnkgYXR0cmlidXRlIGxvb2t1cHMgYXQgc3RhcnR1cCB0aW1lIGlmIHBvc3NpYmxlLgorKiBFdmVyeSBmaWVsZCdzIHRhZyBpcyBlbmNvZGVkIHRvIGJ5dGVzIGF0IHN0YXJ0dXAsIHNpbmNlIGl0IGNhbid0IGNoYW5nZSBhdAorICBydW50aW1lLgorKiBXaGF0ZXZlciBjb21wb25lbnQgb2YgdGhlIGZpZWxkIHNpemUgd2UgY2FuIGNvbXB1dGUgYXQgc3RhcnR1cCwgd2UgZG8uCisqIFdlICphdm9pZCogc2hhcmluZyBjb2RlIGlmIGRvaW5nIHNvIHdvdWxkIG1ha2UgdGhlIGNvZGUgc2xvd2VyIGFuZCBub3Qgc2hhcmluZworICBkb2VzIG5vdCBidXJkZW4gdXMgdG9vIG11Y2guICBGb3IgZXhhbXBsZSwgZW5jb2RlcnMgZm9yIHJlcGVhdGVkIGZpZWxkcyBkbworICBub3QganVzdCBjYWxsIHRoZSBlbmNvZGVycyBmb3Igc2luZ3VsYXIgZmllbGRzIGluIGEgbG9vcCBiZWNhdXNlIHRoaXMgd291bGQKKyAgYWRkIGFuIGV4dHJhIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQgZm9yIGV2ZXJ5IGxvb3AgaXRlcmF0aW9uOyBpbnN0ZWFkLCB3ZQorICBtYW51YWxseSBpbmxpbmUgdGhlIHNpbmdsZS12YWx1ZSBlbmNvZGVyIGludG8gdGhlIGxvb3AuCisqIElmIGEgUHl0aG9uIGZ1bmN0aW9uIGxhY2tzIGEgcmV0dXJuIHN0YXRlbWVudCwgUHl0aG9uIGFjdHVhbGx5IGdlbmVyYXRlcworICBpbnN0cnVjdGlvbnMgdG8gcG9wIHRoZSByZXN1bHQgb2YgdGhlIGxhc3Qgc3RhdGVtZW50IG9mZiB0aGUgc3RhY2ssIHB1c2gKKyAgTm9uZSBvbnRvIHRoZSBzdGFjaywgYW5kIHRoZW4gcmV0dXJuIHRoYXQuICBJZiB3ZSByZWFsbHkgZG9uJ3QgY2FyZSB3aGF0CisgIHZhbHVlIGlzIHJldHVybmVkLCB0aGVuIHdlIGNhbiBzYXZlIHR3byBpbnN0cnVjdGlvbnMgYnkgcmV0dXJuaW5nIHRoZQorICByZXN1bHQgb2YgdGhlIGxhc3Qgc3RhdGVtZW50LiAgSXQgbG9va3MgZnVubnkgYnV0IGl0IGhlbHBzLgorKiBXZSBhc3N1bWUgdGhhdCB0eXBlIGFuZCBib3VuZHMgY2hlY2tpbmcgaGFzIGhhcHBlbmVkIGF0IGEgaGlnaGVyIGxldmVsLgorIiIiCisKK19fYXV0aG9yX18gPSAna2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSknCisKK2ltcG9ydCBzdHJ1Y3QKKworZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHdpcmVfZm9ybWF0CisKKworIyBUaGlzIHdpbGwgb3ZlcmZsb3cgYW5kIHRodXMgYmVjb21lIElFRUUtNzU0ICJpbmZpbml0eSIuICBXZSB3b3VsZCB1c2UKKyMgImZsb2F0KCdpbmYnKSIgYnV0IGl0IGRvZXNuJ3Qgd29yayBvbiBXaW5kb3dzIHByZS1QeXRob24tMi42LgorX1BPU19JTkYgPSAxZTEwMDAwCitfTkVHX0lORiA9IC1fUE9TX0lORgorCisKK2RlZiBfVmFyaW50U2l6ZSh2YWx1ZSk6CisgICIiIkNvbXB1dGUgdGhlIHNpemUgb2YgYSB2YXJpbnQgdmFsdWUuIiIiCisgIGlmIHZhbHVlIDw9IDB4N2Y6IHJldHVybiAxCisgIGlmIHZhbHVlIDw9IDB4M2ZmZjogcmV0dXJuIDIKKyAgaWYgdmFsdWUgPD0gMHgxZmZmZmY6IHJldHVybiAzCisgIGlmIHZhbHVlIDw9IDB4ZmZmZmZmZjogcmV0dXJuIDQKKyAgaWYgdmFsdWUgPD0gMHg3ZmZmZmZmZmY6IHJldHVybiA1CisgIGlmIHZhbHVlIDw9IDB4M2ZmZmZmZmZmZmY6IHJldHVybiA2CisgIGlmIHZhbHVlIDw9IDB4MWZmZmZmZmZmZmZmZjogcmV0dXJuIDcKKyAgaWYgdmFsdWUgPD0gMHhmZmZmZmZmZmZmZmZmZjogcmV0dXJuIDgKKyAgaWYgdmFsdWUgPD0gMHg3ZmZmZmZmZmZmZmZmZmZmOiByZXR1cm4gOQorICByZXR1cm4gMTAKKworCitkZWYgX1NpZ25lZFZhcmludFNpemUodmFsdWUpOgorICAiIiJDb21wdXRlIHRoZSBzaXplIG9mIGEgc2lnbmVkIHZhcmludCB2YWx1ZS4iIiIKKyAgaWYgdmFsdWUgPCAwOiByZXR1cm4gMTAKKyAgaWYgdmFsdWUgPD0gMHg3ZjogcmV0dXJuIDEKKyAgaWYgdmFsdWUgPD0gMHgzZmZmOiByZXR1cm4gMgorICBpZiB2YWx1ZSA8PSAweDFmZmZmZjogcmV0dXJuIDMKKyAgaWYgdmFsdWUgPD0gMHhmZmZmZmZmOiByZXR1cm4gNAorICBpZiB2YWx1ZSA8PSAweDdmZmZmZmZmZjogcmV0dXJuIDUKKyAgaWYgdmFsdWUgPD0gMHgzZmZmZmZmZmZmZjogcmV0dXJuIDYKKyAgaWYgdmFsdWUgPD0gMHgxZmZmZmZmZmZmZmZmOiByZXR1cm4gNworICBpZiB2YWx1ZSA8PSAweGZmZmZmZmZmZmZmZmZmOiByZXR1cm4gOAorICBpZiB2YWx1ZSA8PSAweDdmZmZmZmZmZmZmZmZmZmY6IHJldHVybiA5CisgIHJldHVybiAxMAorCisKK2RlZiBfVGFnU2l6ZShmaWVsZF9udW1iZXIpOgorICAiIiJSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGEgdGFnIHdpdGggdGhpcyBmaWVsZAorICBudW1iZXIuIiIiCisgICMgSnVzdCBwYXNzIGluIHR5cGUgMCwgc2luY2UgdGhlIHR5cGUgd29uJ3QgYWZmZWN0IHRoZSB0YWcrdHlwZSBzaXplLgorICByZXR1cm4gX1ZhcmludFNpemUod2lyZV9mb3JtYXQuUGFja1RhZyhmaWVsZF9udW1iZXIsIDApKQorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW4gdGhpcyBzZWN0aW9uIHdlIGRlZmluZSBzb21lIGdlbmVyaWMgc2l6ZXJzLiAgRWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMKKyMgdGFrZXMgcGFyYW1ldGVycyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgZmllbGQgdHlwZSwgZS5nLiBpbnQzMiBvciBmaXhlZDY0LgorIyBJdCByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24gd2hpY2ggaW4gdHVybiB0YWtlcyBwYXJhbWV0ZXJzIHNwZWNpZmljIHRvIGEKKyMgcGFydGljdWxhciBmaWVsZCwgZS5nLiB0aGUgZmllbGQgbnVtYmVyIGFuZCB3aGV0aGVyIGl0IGlzIHJlcGVhdGVkIG9yIHBhY2tlZC4KKyMgTG9vayBhdCB0aGUgbmV4dCBzZWN0aW9uIHRvIHNlZSBob3cgdGhlc2UgYXJlIHVzZWQuCisKKworZGVmIF9TaW1wbGVTaXplcihjb21wdXRlX3ZhbHVlX3NpemUpOgorICAiIiJBIHNpemVyIHdoaWNoIHVzZXMgdGhlIGZ1bmN0aW9uIGNvbXB1dGVfdmFsdWVfc2l6ZSB0byBjb21wdXRlIHRoZSBzaXplIG9mCisgIGVhY2ggdmFsdWUuICBUeXBpY2FsbHkgY29tcHV0ZV92YWx1ZV9zaXplIGlzIF9WYXJpbnRTaXplLiIiIgorCisgIGRlZiBTcGVjaWZpY1NpemVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICAgdGFnX3NpemUgPSBfVGFnU2l6ZShmaWVsZF9udW1iZXIpCisgICAgaWYgaXNfcGFja2VkOgorICAgICAgbG9jYWxfVmFyaW50U2l6ZSA9IF9WYXJpbnRTaXplCisgICAgICBkZWYgUGFja2VkRmllbGRTaXplKHZhbHVlKToKKyAgICAgICAgcmVzdWx0ID0gMAorICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICByZXN1bHQgKz0gY29tcHV0ZV92YWx1ZV9zaXplKGVsZW1lbnQpCisgICAgICAgIHJldHVybiByZXN1bHQgKyBsb2NhbF9WYXJpbnRTaXplKHJlc3VsdCkgKyB0YWdfc2l6ZQorICAgICAgcmV0dXJuIFBhY2tlZEZpZWxkU2l6ZQorICAgIGVsaWYgaXNfcmVwZWF0ZWQ6CisgICAgICBkZWYgUmVwZWF0ZWRGaWVsZFNpemUodmFsdWUpOgorICAgICAgICByZXN1bHQgPSB0YWdfc2l6ZSAqIGxlbih2YWx1ZSkKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgcmVzdWx0ICs9IGNvbXB1dGVfdmFsdWVfc2l6ZShlbGVtZW50KQorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICByZXR1cm4gUmVwZWF0ZWRGaWVsZFNpemUKKyAgICBlbHNlOgorICAgICAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgICAgIHJldHVybiB0YWdfc2l6ZSArIGNvbXB1dGVfdmFsdWVfc2l6ZSh2YWx1ZSkKKyAgICAgIHJldHVybiBGaWVsZFNpemUKKworICByZXR1cm4gU3BlY2lmaWNTaXplcgorCisKK2RlZiBfTW9kaWZpZWRTaXplcihjb21wdXRlX3ZhbHVlX3NpemUsIG1vZGlmeV92YWx1ZSk6CisgICIiIkxpa2UgU2ltcGxlU2l6ZXIsIGJ1dCBtb2RpZnlfdmFsdWUgaXMgaW52b2tlZCBvbiBlYWNoIHZhbHVlIGJlZm9yZSBpdCBpcworICBwYXNzZWQgdG8gY29tcHV0ZV92YWx1ZV9zaXplLiAgbW9kaWZ5X3ZhbHVlIGlzIHR5cGljYWxseSBaaWdaYWdFbmNvZGUuIiIiCisKKyAgZGVmIFNwZWNpZmljU2l6ZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgICB0YWdfc2l6ZSA9IF9UYWdTaXplKGZpZWxkX251bWJlcikKKyAgICBpZiBpc19wYWNrZWQ6CisgICAgICBsb2NhbF9WYXJpbnRTaXplID0gX1ZhcmludFNpemUKKyAgICAgIGRlZiBQYWNrZWRGaWVsZFNpemUodmFsdWUpOgorICAgICAgICByZXN1bHQgPSAwCisgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgIHJlc3VsdCArPSBjb21wdXRlX3ZhbHVlX3NpemUobW9kaWZ5X3ZhbHVlKGVsZW1lbnQpKQorICAgICAgICByZXR1cm4gcmVzdWx0ICsgbG9jYWxfVmFyaW50U2l6ZShyZXN1bHQpICsgdGFnX3NpemUKKyAgICAgIHJldHVybiBQYWNrZWRGaWVsZFNpemUKKyAgICBlbGlmIGlzX3JlcGVhdGVkOgorICAgICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKKyAgICAgICAgcmVzdWx0ID0gdGFnX3NpemUgKiBsZW4odmFsdWUpCisgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgIHJlc3VsdCArPSBjb21wdXRlX3ZhbHVlX3NpemUobW9kaWZ5X3ZhbHVlKGVsZW1lbnQpKQorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICByZXR1cm4gUmVwZWF0ZWRGaWVsZFNpemUKKyAgICBlbHNlOgorICAgICAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgICAgIHJldHVybiB0YWdfc2l6ZSArIGNvbXB1dGVfdmFsdWVfc2l6ZShtb2RpZnlfdmFsdWUodmFsdWUpKQorICAgICAgcmV0dXJuIEZpZWxkU2l6ZQorCisgIHJldHVybiBTcGVjaWZpY1NpemVyCisKKworZGVmIF9GaXhlZFNpemVyKHZhbHVlX3NpemUpOgorICAiIiJMaWtlIF9TaW1wbGVTaXplciBleGNlcHQgZm9yIGEgZml4ZWQtc2l6ZSBmaWVsZC4gIFRoZSBpbnB1dCBpcyB0aGUgc2l6ZQorICBvZiBvbmUgdmFsdWUuIiIiCisKKyAgZGVmIFNwZWNpZmljU2l6ZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgICB0YWdfc2l6ZSA9IF9UYWdTaXplKGZpZWxkX251bWJlcikKKyAgICBpZiBpc19wYWNrZWQ6CisgICAgICBsb2NhbF9WYXJpbnRTaXplID0gX1ZhcmludFNpemUKKyAgICAgIGRlZiBQYWNrZWRGaWVsZFNpemUodmFsdWUpOgorICAgICAgICByZXN1bHQgPSBsZW4odmFsdWUpICogdmFsdWVfc2l6ZQorICAgICAgICByZXR1cm4gcmVzdWx0ICsgbG9jYWxfVmFyaW50U2l6ZShyZXN1bHQpICsgdGFnX3NpemUKKyAgICAgIHJldHVybiBQYWNrZWRGaWVsZFNpemUKKyAgICBlbGlmIGlzX3JlcGVhdGVkOgorICAgICAgZWxlbWVudF9zaXplID0gdmFsdWVfc2l6ZSArIHRhZ19zaXplCisgICAgICBkZWYgUmVwZWF0ZWRGaWVsZFNpemUodmFsdWUpOgorICAgICAgICByZXR1cm4gbGVuKHZhbHVlKSAqIGVsZW1lbnRfc2l6ZQorICAgICAgcmV0dXJuIFJlcGVhdGVkRmllbGRTaXplCisgICAgZWxzZToKKyAgICAgIGZpZWxkX3NpemUgPSB2YWx1ZV9zaXplICsgdGFnX3NpemUKKyAgICAgIGRlZiBGaWVsZFNpemUodmFsdWUpOgorICAgICAgICByZXR1cm4gZmllbGRfc2l6ZQorICAgICAgcmV0dXJuIEZpZWxkU2l6ZQorCisgIHJldHVybiBTcGVjaWZpY1NpemVyCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBIZXJlIHdlIGRlY2xhcmUgYSBzaXplciBjb25zdHJ1Y3RvciBmb3IgZWFjaCBmaWVsZCB0eXBlLiAgRWFjaCAic2l6ZXIKKyMgY29uc3RydWN0b3IiIGlzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyAoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKQorIyBhcyBwYXJhbWV0ZXJzIGFuZCByZXR1cm5zIGEgc2l6ZXIsIHdoaWNoIGluIHR1cm4gdGFrZXMgYSBmaWVsZCB2YWx1ZSBhcworIyBhIHBhcmFtZXRlciBhbmQgcmV0dXJucyBpdHMgZW5jb2RlZCBzaXplLgorCisKK0ludDMyU2l6ZXIgPSBJbnQ2NFNpemVyID0gRW51bVNpemVyID0gX1NpbXBsZVNpemVyKF9TaWduZWRWYXJpbnRTaXplKQorCitVSW50MzJTaXplciA9IFVJbnQ2NFNpemVyID0gX1NpbXBsZVNpemVyKF9WYXJpbnRTaXplKQorCitTSW50MzJTaXplciA9IFNJbnQ2NFNpemVyID0gX01vZGlmaWVkU2l6ZXIoCisgICAgX1NpZ25lZFZhcmludFNpemUsIHdpcmVfZm9ybWF0LlppZ1phZ0VuY29kZSkKKworRml4ZWQzMlNpemVyID0gU0ZpeGVkMzJTaXplciA9IEZsb2F0U2l6ZXIgID0gX0ZpeGVkU2l6ZXIoNCkKK0ZpeGVkNjRTaXplciA9IFNGaXhlZDY0U2l6ZXIgPSBEb3VibGVTaXplciA9IF9GaXhlZFNpemVyKDgpCisKK0Jvb2xTaXplciA9IF9GaXhlZFNpemVyKDEpCisKKworZGVmIFN0cmluZ1NpemVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICIiIlJldHVybnMgYSBzaXplciBmb3IgYSBzdHJpbmcgZmllbGQuIiIiCisKKyAgdGFnX3NpemUgPSBfVGFnU2l6ZShmaWVsZF9udW1iZXIpCisgIGxvY2FsX1ZhcmludFNpemUgPSBfVmFyaW50U2l6ZQorICBsb2NhbF9sZW4gPSBsZW4KKyAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKKyAgaWYgaXNfcmVwZWF0ZWQ6CisgICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKKyAgICAgIHJlc3VsdCA9IHRhZ19zaXplICogbGVuKHZhbHVlKQorICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgIGwgPSBsb2NhbF9sZW4oZWxlbWVudC5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgIHJlc3VsdCArPSBsb2NhbF9WYXJpbnRTaXplKGwpICsgbAorICAgICAgcmV0dXJuIHJlc3VsdAorICAgIHJldHVybiBSZXBlYXRlZEZpZWxkU2l6ZQorICBlbHNlOgorICAgIGRlZiBGaWVsZFNpemUodmFsdWUpOgorICAgICAgbCA9IGxvY2FsX2xlbih2YWx1ZS5lbmNvZGUoJ3V0Zi04JykpCisgICAgICByZXR1cm4gdGFnX3NpemUgKyBsb2NhbF9WYXJpbnRTaXplKGwpICsgbAorICAgIHJldHVybiBGaWVsZFNpemUKKworCitkZWYgQnl0ZXNTaXplcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgorICAiIiJSZXR1cm5zIGEgc2l6ZXIgZm9yIGEgYnl0ZXMgZmllbGQuIiIiCisKKyAgdGFnX3NpemUgPSBfVGFnU2l6ZShmaWVsZF9udW1iZXIpCisgIGxvY2FsX1ZhcmludFNpemUgPSBfVmFyaW50U2l6ZQorICBsb2NhbF9sZW4gPSBsZW4KKyAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKKyAgaWYgaXNfcmVwZWF0ZWQ6CisgICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKKyAgICAgIHJlc3VsdCA9IHRhZ19zaXplICogbGVuKHZhbHVlKQorICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgIGwgPSBsb2NhbF9sZW4oZWxlbWVudCkKKyAgICAgICAgcmVzdWx0ICs9IGxvY2FsX1ZhcmludFNpemUobCkgKyBsCisgICAgICByZXR1cm4gcmVzdWx0CisgICAgcmV0dXJuIFJlcGVhdGVkRmllbGRTaXplCisgIGVsc2U6CisgICAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgICBsID0gbG9jYWxfbGVuKHZhbHVlKQorICAgICAgcmV0dXJuIHRhZ19zaXplICsgbG9jYWxfVmFyaW50U2l6ZShsKSArIGwKKyAgICByZXR1cm4gRmllbGRTaXplCisKKworZGVmIEdyb3VwU2l6ZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgIiIiUmV0dXJucyBhIHNpemVyIGZvciBhIGdyb3VwIGZpZWxkLiIiIgorCisgIHRhZ19zaXplID0gX1RhZ1NpemUoZmllbGRfbnVtYmVyKSAqIDIKKyAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKKyAgaWYgaXNfcmVwZWF0ZWQ6CisgICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKKyAgICAgIHJlc3VsdCA9IHRhZ19zaXplICogbGVuKHZhbHVlKQorICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgIHJlc3VsdCArPSBlbGVtZW50LkJ5dGVTaXplKCkKKyAgICAgIHJldHVybiByZXN1bHQKKyAgICByZXR1cm4gUmVwZWF0ZWRGaWVsZFNpemUKKyAgZWxzZToKKyAgICBkZWYgRmllbGRTaXplKHZhbHVlKToKKyAgICAgIHJldHVybiB0YWdfc2l6ZSArIHZhbHVlLkJ5dGVTaXplKCkKKyAgICByZXR1cm4gRmllbGRTaXplCisKKworZGVmIE1lc3NhZ2VTaXplcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgorICAiIiJSZXR1cm5zIGEgc2l6ZXIgZm9yIGEgbWVzc2FnZSBmaWVsZC4iIiIKKworICB0YWdfc2l6ZSA9IF9UYWdTaXplKGZpZWxkX251bWJlcikKKyAgbG9jYWxfVmFyaW50U2l6ZSA9IF9WYXJpbnRTaXplCisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIGRlZiBSZXBlYXRlZEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgICByZXN1bHQgPSB0YWdfc2l6ZSAqIGxlbih2YWx1ZSkKKyAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICBsID0gZWxlbWVudC5CeXRlU2l6ZSgpCisgICAgICAgIHJlc3VsdCArPSBsb2NhbF9WYXJpbnRTaXplKGwpICsgbAorICAgICAgcmV0dXJuIHJlc3VsdAorICAgIHJldHVybiBSZXBlYXRlZEZpZWxkU2l6ZQorICBlbHNlOgorICAgIGRlZiBGaWVsZFNpemUodmFsdWUpOgorICAgICAgbCA9IHZhbHVlLkJ5dGVTaXplKCkKKyAgICAgIHJldHVybiB0YWdfc2l6ZSArIGxvY2FsX1ZhcmludFNpemUobCkgKyBsCisgICAgcmV0dXJuIEZpZWxkU2l6ZQorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTWVzc2FnZVNldCBpcyBzcGVjaWFsOiBpdCBuZWVkcyBjdXN0b20gbG9naWMgdG8gY29tcHV0ZSBpdHMgc2l6ZSBwcm9wZXJseS4KKworCitkZWYgTWVzc2FnZVNldEl0ZW1TaXplcihmaWVsZF9udW1iZXIpOgorICAiIiJSZXR1cm5zIGEgc2l6ZXIgZm9yIGV4dGVuc2lvbnMgb2YgTWVzc2FnZVNldC4KKworICBUaGUgbWVzc2FnZSBzZXQgbWVzc2FnZSBsb29rcyBsaWtlIHRoaXM6CisgICAgbWVzc2FnZSBNZXNzYWdlU2V0IHsKKyAgICAgIHJlcGVhdGVkIGdyb3VwIEl0ZW0gPSAxIHsKKyAgICAgICAgcmVxdWlyZWQgaW50MzIgdHlwZV9pZCA9IDI7CisgICAgICAgIHJlcXVpcmVkIHN0cmluZyBtZXNzYWdlID0gMzsKKyAgICAgIH0KKyAgICB9CisgICIiIgorICBzdGF0aWNfc2l6ZSA9IChfVGFnU2l6ZSgxKSAqIDIgKyBfVGFnU2l6ZSgyKSArIF9WYXJpbnRTaXplKGZpZWxkX251bWJlcikgKworICAgICAgICAgICAgICAgICBfVGFnU2l6ZSgzKSkKKyAgbG9jYWxfVmFyaW50U2l6ZSA9IF9WYXJpbnRTaXplCisKKyAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgbCA9IHZhbHVlLkJ5dGVTaXplKCkKKyAgICByZXR1cm4gc3RhdGljX3NpemUgKyBsb2NhbF9WYXJpbnRTaXplKGwpICsgbAorCisgIHJldHVybiBGaWVsZFNpemUKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1hcCBpcyBzcGVjaWFsOiBpdCBuZWVkcyBjdXN0b20gbG9naWMgdG8gY29tcHV0ZSBpdHMgc2l6ZSBwcm9wZXJseS4KKworCitkZWYgTWFwU2l6ZXIoZmllbGRfZGVzY3JpcHRvciwgaXNfbWVzc2FnZV9tYXApOgorICAiIiJSZXR1cm5zIGEgc2l6ZXIgZm9yIGEgbWFwIGZpZWxkLiIiIgorCisgICMgQ2FuJ3QgbG9vayBhdCBmaWVsZF9kZXNjcmlwdG9yLm1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MgYmVjYXVzZSBpdCBtYXkKKyAgIyBub3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHlldC4KKyAgbWVzc2FnZV90eXBlID0gZmllbGRfZGVzY3JpcHRvci5tZXNzYWdlX3R5cGUKKyAgbWVzc2FnZV9zaXplciA9IE1lc3NhZ2VTaXplcihmaWVsZF9kZXNjcmlwdG9yLm51bWJlciwgRmFsc2UsIEZhbHNlKQorCisgIGRlZiBGaWVsZFNpemUobWFwX3ZhbHVlKToKKyAgICB0b3RhbCA9IDAKKyAgICBmb3Iga2V5IGluIG1hcF92YWx1ZToKKyAgICAgIHZhbHVlID0gbWFwX3ZhbHVlW2tleV0KKyAgICAgICMgSXQncyB3YXN0ZWZ1bCB0byBjcmVhdGUgdGhlIG1lc3NhZ2VzIGFuZCB0aHJvdyB0aGVtIGF3YXkgb25lIHNlY29uZAorICAgICAgIyBsYXRlciBzaW5jZSB3ZSdsbCBkbyB0aGUgc2FtZSBmb3IgdGhlIGFjdHVhbCBlbmNvZGUuICBCdXQgdGhlcmUncyBub3QgYW4KKyAgICAgICMgb2J2aW91cyB3YXkgdG8gYXZvaWQgdGhpcyB3aXRoaW4gdGhlIGN1cnJlbnQgZGVzaWduIHdpdGhvdXQgdG9ucyBvZiBjb2RlCisgICAgICAjIGR1cGxpY2F0aW9uLiBGb3IgbWVzc2FnZSBtYXAsIHZhbHVlLkJ5dGVTaXplKCkgc2hvdWxkIGJlIGNhbGxlZCB0bworICAgICAgIyB1cGRhdGUgdGhlIHN0YXR1cy4KKyAgICAgIGVudHJ5X21zZyA9IG1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3Moa2V5PWtleSwgdmFsdWU9dmFsdWUpCisgICAgICB0b3RhbCArPSBtZXNzYWdlX3NpemVyKGVudHJ5X21zZykKKyAgICAgIGlmIGlzX21lc3NhZ2VfbWFwOgorICAgICAgICB2YWx1ZS5CeXRlU2l6ZSgpCisgICAgcmV0dXJuIHRvdGFsCisKKyAgcmV0dXJuIEZpZWxkU2l6ZQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEVuY29kZXJzIQorCisKK2RlZiBfVmFyaW50RW5jb2RlcigpOgorICAiIiJSZXR1cm4gYW4gZW5jb2RlciBmb3IgYSBiYXNpYyB2YXJpbnQgdmFsdWUgKGRvZXMgbm90IGluY2x1ZGUgdGFnKS4iIiIKKworICBsb2NhbF9pbnQyYnl0ZSA9IHN0cnVjdC5TdHJ1Y3QoJz5CJykucGFjaworCisgIGRlZiBFbmNvZGVWYXJpbnQod3JpdGUsIHZhbHVlLCB1bnVzZWRfZGV0ZXJtaW5pc3RpYz1Ob25lKToKKyAgICBiaXRzID0gdmFsdWUgJiAweDdmCisgICAgdmFsdWUgPj49IDcKKyAgICB3aGlsZSB2YWx1ZToKKyAgICAgIHdyaXRlKGxvY2FsX2ludDJieXRlKDB4ODB8Yml0cykpCisgICAgICBiaXRzID0gdmFsdWUgJiAweDdmCisgICAgICB2YWx1ZSA+Pj0gNworICAgIHJldHVybiB3cml0ZShsb2NhbF9pbnQyYnl0ZShiaXRzKSkKKworICByZXR1cm4gRW5jb2RlVmFyaW50CisKKworZGVmIF9TaWduZWRWYXJpbnRFbmNvZGVyKCk6CisgICIiIlJldHVybiBhbiBlbmNvZGVyIGZvciBhIGJhc2ljIHNpZ25lZCB2YXJpbnQgdmFsdWUgKGRvZXMgbm90IGluY2x1ZGUKKyAgdGFnKS4iIiIKKworICBsb2NhbF9pbnQyYnl0ZSA9IHN0cnVjdC5TdHJ1Y3QoJz5CJykucGFjaworCisgIGRlZiBFbmNvZGVTaWduZWRWYXJpbnQod3JpdGUsIHZhbHVlLCB1bnVzZWRfZGV0ZXJtaW5pc3RpYz1Ob25lKToKKyAgICBpZiB2YWx1ZSA8IDA6CisgICAgICB2YWx1ZSArPSAoMSA8PCA2NCkKKyAgICBiaXRzID0gdmFsdWUgJiAweDdmCisgICAgdmFsdWUgPj49IDcKKyAgICB3aGlsZSB2YWx1ZToKKyAgICAgIHdyaXRlKGxvY2FsX2ludDJieXRlKDB4ODB8Yml0cykpCisgICAgICBiaXRzID0gdmFsdWUgJiAweDdmCisgICAgICB2YWx1ZSA+Pj0gNworICAgIHJldHVybiB3cml0ZShsb2NhbF9pbnQyYnl0ZShiaXRzKSkKKworICByZXR1cm4gRW5jb2RlU2lnbmVkVmFyaW50CisKKworX0VuY29kZVZhcmludCA9IF9WYXJpbnRFbmNvZGVyKCkKK19FbmNvZGVTaWduZWRWYXJpbnQgPSBfU2lnbmVkVmFyaW50RW5jb2RlcigpCisKKworZGVmIF9WYXJpbnRCeXRlcyh2YWx1ZSk6CisgICIiIkVuY29kZSB0aGUgZ2l2ZW4gaW50ZWdlciBhcyBhIHZhcmludCBhbmQgcmV0dXJuIHRoZSBieXRlcy4gIFRoaXMgaXMgb25seQorICBjYWxsZWQgYXQgc3RhcnR1cCB0aW1lIHNvIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBmYXN0LiIiIgorCisgIHBpZWNlcyA9IFtdCisgIF9FbmNvZGVWYXJpbnQocGllY2VzLmFwcGVuZCwgdmFsdWUsIFRydWUpCisgIHJldHVybiBiIiIuam9pbihwaWVjZXMpCisKKworZGVmIFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKToKKyAgIiIiRW5jb2RlIHRoZSBnaXZlbiB0YWcgYW5kIHJldHVybiB0aGUgYnl0ZXMuICBPbmx5IGNhbGxlZCBhdCBzdGFydHVwLiIiIgorCisgIHJldHVybiBieXRlcyhfVmFyaW50Qnl0ZXMod2lyZV9mb3JtYXQuUGFja1RhZyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFzIHdpdGggc2l6ZXJzIChzZWUgYWJvdmUpLCB3ZSBoYXZlIGEgbnVtYmVyIG9mIGNvbW1vbiBlbmNvZGVyCisjIGltcGxlbWVudGF0aW9ucy4KKworCitkZWYgX1NpbXBsZUVuY29kZXIod2lyZV90eXBlLCBlbmNvZGVfdmFsdWUsIGNvbXB1dGVfdmFsdWVfc2l6ZSk6CisgICIiIlJldHVybiBhIGNvbnN0cnVjdG9yIGZvciBhbiBlbmNvZGVyIGZvciBmaWVsZHMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUuCisKKyAgQXJnczoKKyAgICAgIHdpcmVfdHlwZTogIFRoZSBmaWVsZCdzIHdpcmUgdHlwZSwgZm9yIGVuY29kaW5nIHRhZ3MuCisgICAgICBlbmNvZGVfdmFsdWU6ICBBIGZ1bmN0aW9uIHdoaWNoIGVuY29kZXMgYW4gaW5kaXZpZHVhbCB2YWx1ZSwgZS5nLgorICAgICAgICBfRW5jb2RlVmFyaW50KCkuCisgICAgICBjb21wdXRlX3ZhbHVlX3NpemU6ICBBIGZ1bmN0aW9uIHdoaWNoIGNvbXB1dGVzIHRoZSBzaXplIG9mIGFuIGluZGl2aWR1YWwKKyAgICAgICAgdmFsdWUsIGUuZy4gX1ZhcmludFNpemUoKS4KKyAgIiIiCisKKyAgZGVmIFNwZWNpZmljRW5jb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgorICAgIGlmIGlzX3BhY2tlZDoKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgICAgIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKKyAgICAgIGRlZiBFbmNvZGVQYWNrZWRGaWVsZCh3cml0ZSwgdmFsdWUsIGRldGVybWluaXN0aWMpOgorICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgIHNpemUgPSAwCisgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgIHNpemUgKz0gY29tcHV0ZV92YWx1ZV9zaXplKGVsZW1lbnQpCisgICAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgc2l6ZSwgZGV0ZXJtaW5pc3RpYykKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgZW5jb2RlX3ZhbHVlKHdyaXRlLCBlbGVtZW50LCBkZXRlcm1pbmlzdGljKQorICAgICAgcmV0dXJuIEVuY29kZVBhY2tlZEZpZWxkCisgICAgZWxpZiBpc19yZXBlYXRlZDoKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKQorICAgICAgZGVmIEVuY29kZVJlcGVhdGVkRmllbGQod3JpdGUsIHZhbHVlLCBkZXRlcm1pbmlzdGljKToKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgd3JpdGUodGFnX2J5dGVzKQorICAgICAgICAgIGVuY29kZV92YWx1ZSh3cml0ZSwgZWxlbWVudCwgZGV0ZXJtaW5pc3RpYykKKyAgICAgIHJldHVybiBFbmNvZGVSZXBlYXRlZEZpZWxkCisgICAgZWxzZToKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKQorICAgICAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSwgZGV0ZXJtaW5pc3RpYyk6CisgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgICAgcmV0dXJuIGVuY29kZV92YWx1ZSh3cml0ZSwgdmFsdWUsIGRldGVybWluaXN0aWMpCisgICAgICByZXR1cm4gRW5jb2RlRmllbGQKKworICByZXR1cm4gU3BlY2lmaWNFbmNvZGVyCisKKworZGVmIF9Nb2RpZmllZEVuY29kZXIod2lyZV90eXBlLCBlbmNvZGVfdmFsdWUsIGNvbXB1dGVfdmFsdWVfc2l6ZSwgbW9kaWZ5X3ZhbHVlKToKKyAgIiIiTGlrZSBTaW1wbGVFbmNvZGVyIGJ1dCBhZGRpdGlvbmFsbHkgaW52b2tlcyBtb2RpZnlfdmFsdWUgb24gZXZlcnkgdmFsdWUKKyAgYmVmb3JlIHBhc3NpbmcgaXQgdG8gZW5jb2RlX3ZhbHVlLiAgVXN1YWxseSBtb2RpZnlfdmFsdWUgaXMgWmlnWmFnRW5jb2RlLiIiIgorCisgIGRlZiBTcGVjaWZpY0VuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgICBpZiBpc19wYWNrZWQ6CisgICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50CisgICAgICBkZWYgRW5jb2RlUGFja2VkRmllbGQod3JpdGUsIHZhbHVlLCBkZXRlcm1pbmlzdGljKToKKyAgICAgICAgd3JpdGUodGFnX2J5dGVzKQorICAgICAgICBzaXplID0gMAorICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICBzaXplICs9IGNvbXB1dGVfdmFsdWVfc2l6ZShtb2RpZnlfdmFsdWUoZWxlbWVudCkpCisgICAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgc2l6ZSwgZGV0ZXJtaW5pc3RpYykKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgZW5jb2RlX3ZhbHVlKHdyaXRlLCBtb2RpZnlfdmFsdWUoZWxlbWVudCksIGRldGVybWluaXN0aWMpCisgICAgICByZXR1cm4gRW5jb2RlUGFja2VkRmllbGQKKyAgICBlbGlmIGlzX3JlcGVhdGVkOgorICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCisgICAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUsIGRldGVybWluaXN0aWMpOgorICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgICAgZW5jb2RlX3ZhbHVlKHdyaXRlLCBtb2RpZnlfdmFsdWUoZWxlbWVudCksIGRldGVybWluaXN0aWMpCisgICAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAorICAgIGVsc2U6CisgICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkKKyAgICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUsIGRldGVybWluaXN0aWMpOgorICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgIHJldHVybiBlbmNvZGVfdmFsdWUod3JpdGUsIG1vZGlmeV92YWx1ZSh2YWx1ZSksIGRldGVybWluaXN0aWMpCisgICAgICByZXR1cm4gRW5jb2RlRmllbGQKKworICByZXR1cm4gU3BlY2lmaWNFbmNvZGVyCisKKworZGVmIF9TdHJ1Y3RQYWNrRW5jb2Rlcih3aXJlX3R5cGUsIGZvcm1hdCk6CisgICIiIlJldHVybiBhIGNvbnN0cnVjdG9yIGZvciBhbiBlbmNvZGVyIGZvciBhIGZpeGVkLXdpZHRoIGZpZWxkLgorCisgIEFyZ3M6CisgICAgICB3aXJlX3R5cGU6ICBUaGUgZmllbGQncyB3aXJlIHR5cGUsIGZvciBlbmNvZGluZyB0YWdzLgorICAgICAgZm9ybWF0OiAgVGhlIGZvcm1hdCBzdHJpbmcgdG8gcGFzcyB0byBzdHJ1Y3QucGFjaygpLgorICAiIiIKKworICB2YWx1ZV9zaXplID0gc3RydWN0LmNhbGNzaXplKGZvcm1hdCkKKworICBkZWYgU3BlY2lmaWNFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICAgbG9jYWxfc3RydWN0X3BhY2sgPSBzdHJ1Y3QucGFjaworICAgIGlmIGlzX3BhY2tlZDoKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgICAgIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKKyAgICAgIGRlZiBFbmNvZGVQYWNrZWRGaWVsZCh3cml0ZSwgdmFsdWUsIGRldGVybWluaXN0aWMpOgorICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgbGVuKHZhbHVlKSAqIHZhbHVlX3NpemUsIGRldGVybWluaXN0aWMpCisgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgIHdyaXRlKGxvY2FsX3N0cnVjdF9wYWNrKGZvcm1hdCwgZWxlbWVudCkpCisgICAgICByZXR1cm4gRW5jb2RlUGFja2VkRmllbGQKKyAgICBlbGlmIGlzX3JlcGVhdGVkOgorICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCisgICAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUsIHVudXNlZF9kZXRlcm1pbmlzdGljPU5vbmUpOgorICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgICAgd3JpdGUobG9jYWxfc3RydWN0X3BhY2soZm9ybWF0LCBlbGVtZW50KSkKKyAgICAgIHJldHVybiBFbmNvZGVSZXBlYXRlZEZpZWxkCisgICAgZWxzZToKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKQorICAgICAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSwgdW51c2VkX2RldGVybWluaXN0aWM9Tm9uZSk6CisgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgICAgcmV0dXJuIHdyaXRlKGxvY2FsX3N0cnVjdF9wYWNrKGZvcm1hdCwgdmFsdWUpKQorICAgICAgcmV0dXJuIEVuY29kZUZpZWxkCisKKyAgcmV0dXJuIFNwZWNpZmljRW5jb2RlcgorCisKK2RlZiBfRmxvYXRpbmdQb2ludEVuY29kZXIod2lyZV90eXBlLCBmb3JtYXQpOgorICAiIiJSZXR1cm4gYSBjb25zdHJ1Y3RvciBmb3IgYW4gZW5jb2RlciBmb3IgZmxvYXQgZmllbGRzLgorCisgIFRoaXMgaXMgbGlrZSBTdHJ1Y3RQYWNrRW5jb2RlciwgYnV0IGNhdGNoZXMgZXJyb3JzIHRoYXQgbWF5IGJlIGR1ZSB0bworICBwYXNzaW5nIG5vbi1maW5pdGUgZmxvYXRpbmctcG9pbnQgdmFsdWVzIHRvIHN0cnVjdC5wYWNrLCBhbmQgbWFrZXMgYQorICBzZWNvbmQgYXR0ZW1wdCB0byBlbmNvZGUgdGhvc2UgdmFsdWVzLgorCisgIEFyZ3M6CisgICAgICB3aXJlX3R5cGU6ICBUaGUgZmllbGQncyB3aXJlIHR5cGUsIGZvciBlbmNvZGluZyB0YWdzLgorICAgICAgZm9ybWF0OiAgVGhlIGZvcm1hdCBzdHJpbmcgdG8gcGFzcyB0byBzdHJ1Y3QucGFjaygpLgorICAiIiIKKworICB2YWx1ZV9zaXplID0gc3RydWN0LmNhbGNzaXplKGZvcm1hdCkKKyAgaWYgdmFsdWVfc2l6ZSA9PSA0OgorICAgIGRlZiBFbmNvZGVOb25GaW5pdGVPclJhaXNlKHdyaXRlLCB2YWx1ZSk6CisgICAgICAjIFJlbWVtYmVyIHRoYXQgdGhlIHNlcmlhbGl6ZWQgZm9ybSB1c2VzIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlci4KKyAgICAgIGlmIHZhbHVlID09IF9QT1NfSU5GOgorICAgICAgICB3cml0ZShiJ1x4MDBceDAwXHg4MFx4N0YnKQorICAgICAgZWxpZiB2YWx1ZSA9PSBfTkVHX0lORjoKKyAgICAgICAgd3JpdGUoYidceDAwXHgwMFx4ODBceEZGJykKKyAgICAgIGVsaWYgdmFsdWUgIT0gdmFsdWU6ICAgICAgICAgICAjIE5hTgorICAgICAgICB3cml0ZShiJ1x4MDBceDAwXHhDMFx4N0YnKQorICAgICAgZWxzZToKKyAgICAgICAgcmFpc2UKKyAgZWxpZiB2YWx1ZV9zaXplID09IDg6CisgICAgZGVmIEVuY29kZU5vbkZpbml0ZU9yUmFpc2Uod3JpdGUsIHZhbHVlKToKKyAgICAgIGlmIHZhbHVlID09IF9QT1NfSU5GOgorICAgICAgICB3cml0ZShiJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceDdGJykKKyAgICAgIGVsaWYgdmFsdWUgPT0gX05FR19JTkY6CisgICAgICAgIHdyaXRlKGInXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4RkYnKQorICAgICAgZWxpZiB2YWx1ZSAhPSB2YWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgIyBOYU4KKyAgICAgICAgd3JpdGUoYidceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEY4XHg3RicpCisgICAgICBlbHNlOgorICAgICAgICByYWlzZQorICBlbHNlOgorICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0NhblwndCBlbmNvZGUgZmxvYXRpbmctcG9pbnQgdmFsdWVzIHRoYXQgYXJlICcKKyAgICAgICAgICAgICAgICAgICAgICclZCBieXRlcyBsb25nIChvbmx5IDQgb3IgOCknICUgdmFsdWVfc2l6ZSkKKworICBkZWYgU3BlY2lmaWNFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICAgbG9jYWxfc3RydWN0X3BhY2sgPSBzdHJ1Y3QucGFjaworICAgIGlmIGlzX3BhY2tlZDoKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgICAgIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKKyAgICAgIGRlZiBFbmNvZGVQYWNrZWRGaWVsZCh3cml0ZSwgdmFsdWUsIGRldGVybWluaXN0aWMpOgorICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgbGVuKHZhbHVlKSAqIHZhbHVlX3NpemUsIGRldGVybWluaXN0aWMpCisgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgICMgVGhpcyB0cnkvZXhjZXB0IGJsb2NrIGlzIGdvaW5nIHRvIGJlIGZhc3RlciB0aGFuIGFueSBjb2RlIHRoYXQKKyAgICAgICAgICAjIHdlIGNvdWxkIHdyaXRlIHRvIGNoZWNrIHdoZXRoZXIgZWxlbWVudCBpcyBmaW5pdGUuCisgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3JpdGUobG9jYWxfc3RydWN0X3BhY2soZm9ybWF0LCBlbGVtZW50KSkKKyAgICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3I6CisgICAgICAgICAgICBFbmNvZGVOb25GaW5pdGVPclJhaXNlKHdyaXRlLCBlbGVtZW50KQorICAgICAgcmV0dXJuIEVuY29kZVBhY2tlZEZpZWxkCisgICAgZWxpZiBpc19yZXBlYXRlZDoKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKQorICAgICAgZGVmIEVuY29kZVJlcGVhdGVkRmllbGQod3JpdGUsIHZhbHVlLCB1bnVzZWRfZGV0ZXJtaW5pc3RpYz1Ob25lKToKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgd3JpdGUodGFnX2J5dGVzKQorICAgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdyaXRlKGxvY2FsX3N0cnVjdF9wYWNrKGZvcm1hdCwgZWxlbWVudCkpCisgICAgICAgICAgZXhjZXB0IFN5c3RlbUVycm9yOgorICAgICAgICAgICAgRW5jb2RlTm9uRmluaXRlT3JSYWlzZSh3cml0ZSwgZWxlbWVudCkKKyAgICAgIHJldHVybiBFbmNvZGVSZXBlYXRlZEZpZWxkCisgICAgZWxzZToKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKQorICAgICAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSwgdW51c2VkX2RldGVybWluaXN0aWM9Tm9uZSk6CisgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgICAgdHJ5OgorICAgICAgICAgIHdyaXRlKGxvY2FsX3N0cnVjdF9wYWNrKGZvcm1hdCwgdmFsdWUpKQorICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3I6CisgICAgICAgICAgRW5jb2RlTm9uRmluaXRlT3JSYWlzZSh3cml0ZSwgdmFsdWUpCisgICAgICByZXR1cm4gRW5jb2RlRmllbGQKKworICByZXR1cm4gU3BlY2lmaWNFbmNvZGVyCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBIZXJlIHdlIGRlY2xhcmUgYW4gZW5jb2RlciBjb25zdHJ1Y3RvciBmb3IgZWFjaCBmaWVsZCB0eXBlLiAgVGhlc2Ugd29yaworIyB2ZXJ5IHNpbWlsYXJseSB0byBzaXplciBjb25zdHJ1Y3RvcnMsIGRlc2NyaWJlZCBlYXJsaWVyLgorCisKK0ludDMyRW5jb2RlciA9IEludDY0RW5jb2RlciA9IEVudW1FbmNvZGVyID0gX1NpbXBsZUVuY29kZXIoCisgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRW5jb2RlU2lnbmVkVmFyaW50LCBfU2lnbmVkVmFyaW50U2l6ZSkKKworVUludDMyRW5jb2RlciA9IFVJbnQ2NEVuY29kZXIgPSBfU2ltcGxlRW5jb2RlcigKKyAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9FbmNvZGVWYXJpbnQsIF9WYXJpbnRTaXplKQorCitTSW50MzJFbmNvZGVyID0gU0ludDY0RW5jb2RlciA9IF9Nb2RpZmllZEVuY29kZXIoCisgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRW5jb2RlVmFyaW50LCBfVmFyaW50U2l6ZSwKKyAgICB3aXJlX2Zvcm1hdC5aaWdaYWdFbmNvZGUpCisKKyMgTm90ZSB0aGF0IFB5dGhvbiBjb252ZW5pZW50bHkgZ3VhcmFudGVlcyB0aGF0IHdoZW4gdXNpbmcgdGhlICc8JyBwcmVmaXggb24KKyMgZm9ybWF0cywgdGhleSB3aWxsIGFsc28gaGF2ZSB0aGUgc2FtZSBzaXplIGFjcm9zcyBhbGwgcGxhdGZvcm1zIChhcyBvcHBvc2VkCisjIHRvIHdpdGhvdXQgdGhlIHByZWZpeCwgd2hlcmUgdGhlaXIgc2l6ZXMgZGVwZW5kIG9uIHRoZSBDIGNvbXBpbGVyJ3MgYmFzaWMKKyMgdHlwZSBzaXplcykuCitGaXhlZDMyRW5jb2RlciAgPSBfU3RydWN0UGFja0VuY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwgJzxJJykKK0ZpeGVkNjRFbmNvZGVyICA9IF9TdHJ1Y3RQYWNrRW5jb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDY0LCAnPFEnKQorU0ZpeGVkMzJFbmNvZGVyID0gX1N0cnVjdFBhY2tFbmNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsICc8aScpCitTRml4ZWQ2NEVuY29kZXIgPSBfU3RydWN0UGFja0VuY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwgJzxxJykKK0Zsb2F0RW5jb2RlciAgICA9IF9GbG9hdGluZ1BvaW50RW5jb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLCAnPGYnKQorRG91YmxlRW5jb2RlciAgID0gX0Zsb2F0aW5nUG9pbnRFbmNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsICc8ZCcpCisKKworZGVmIEJvb2xFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICIiIlJldHVybnMgYW4gZW5jb2RlciBmb3IgYSBib29sZWFuIGZpZWxkLiIiIgorCisgIGZhbHNlX2J5dGUgPSBiJ1x4MDAnCisgIHRydWVfYnl0ZSA9IGInXHgwMScKKyAgaWYgaXNfcGFja2VkOgorICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50CisgICAgZGVmIEVuY29kZVBhY2tlZEZpZWxkKHdyaXRlLCB2YWx1ZSwgZGV0ZXJtaW5pc3RpYyk6CisgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIGxlbih2YWx1ZSksIGRldGVybWluaXN0aWMpCisgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgaWYgZWxlbWVudDoKKyAgICAgICAgICB3cml0ZSh0cnVlX2J5dGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgd3JpdGUoZmFsc2VfYnl0ZSkKKyAgICByZXR1cm4gRW5jb2RlUGFja2VkRmllbGQKKyAgZWxpZiBpc19yZXBlYXRlZDoKKyAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCkKKyAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUsIHVudXNlZF9kZXRlcm1pbmlzdGljPU5vbmUpOgorICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgICAgaWYgZWxlbWVudDoKKyAgICAgICAgICB3cml0ZSh0cnVlX2J5dGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgd3JpdGUoZmFsc2VfYnl0ZSkKKyAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKQorICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUsIHVudXNlZF9kZXRlcm1pbmlzdGljPU5vbmUpOgorICAgICAgd3JpdGUodGFnX2J5dGVzKQorICAgICAgaWYgdmFsdWU6CisgICAgICAgIHJldHVybiB3cml0ZSh0cnVlX2J5dGUpCisgICAgICByZXR1cm4gd3JpdGUoZmFsc2VfYnl0ZSkKKyAgICByZXR1cm4gRW5jb2RlRmllbGQKKworCitkZWYgU3RyaW5nRW5jb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgorICAiIiJSZXR1cm5zIGFuIGVuY29kZXIgZm9yIGEgc3RyaW5nIGZpZWxkLiIiIgorCisgIHRhZyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAorICBsb2NhbF9sZW4gPSBsZW4KKyAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKKyAgaWYgaXNfcmVwZWF0ZWQ6CisgICAgZGVmIEVuY29kZVJlcGVhdGVkRmllbGQod3JpdGUsIHZhbHVlLCBkZXRlcm1pbmlzdGljKToKKyAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICBlbmNvZGVkID0gZWxlbWVudC5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgd3JpdGUodGFnKQorICAgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIGxvY2FsX2xlbihlbmNvZGVkKSwgZGV0ZXJtaW5pc3RpYykKKyAgICAgICAgd3JpdGUoZW5jb2RlZCkKKyAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUsIGRldGVybWluaXN0aWMpOgorICAgICAgZW5jb2RlZCA9IHZhbHVlLmVuY29kZSgndXRmLTgnKQorICAgICAgd3JpdGUodGFnKQorICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsb2NhbF9sZW4oZW5jb2RlZCksIGRldGVybWluaXN0aWMpCisgICAgICByZXR1cm4gd3JpdGUoZW5jb2RlZCkKKyAgICByZXR1cm4gRW5jb2RlRmllbGQKKworCitkZWYgQnl0ZXNFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICIiIlJldHVybnMgYW4gZW5jb2RlciBmb3IgYSBieXRlcyBmaWVsZC4iIiIKKworICB0YWcgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKKyAgbG9jYWxfbGVuID0gbGVuCisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSwgZGV0ZXJtaW5pc3RpYyk6CisgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgd3JpdGUodGFnKQorICAgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIGxvY2FsX2xlbihlbGVtZW50KSwgZGV0ZXJtaW5pc3RpYykKKyAgICAgICAgd3JpdGUoZWxlbWVudCkKKyAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUsIGRldGVybWluaXN0aWMpOgorICAgICAgd3JpdGUodGFnKQorICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsb2NhbF9sZW4odmFsdWUpLCBkZXRlcm1pbmlzdGljKQorICAgICAgcmV0dXJuIHdyaXRlKHZhbHVlKQorICAgIHJldHVybiBFbmNvZGVGaWVsZAorCisKK2RlZiBHcm91cEVuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgIiIiUmV0dXJucyBhbiBlbmNvZGVyIGZvciBhIGdyb3VwIGZpZWxkLiIiIgorCisgIHN0YXJ0X3RhZyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApCisgIGVuZF90YWcgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCkKKyAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKKyAgaWYgaXNfcmVwZWF0ZWQ6CisgICAgZGVmIEVuY29kZVJlcGVhdGVkRmllbGQod3JpdGUsIHZhbHVlLCBkZXRlcm1pbmlzdGljKToKKyAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICB3cml0ZShzdGFydF90YWcpCisgICAgICAgIGVsZW1lbnQuX0ludGVybmFsU2VyaWFsaXplKHdyaXRlLCBkZXRlcm1pbmlzdGljKQorICAgICAgICB3cml0ZShlbmRfdGFnKQorICAgIHJldHVybiBFbmNvZGVSZXBlYXRlZEZpZWxkCisgIGVsc2U6CisgICAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSwgZGV0ZXJtaW5pc3RpYyk6CisgICAgICB3cml0ZShzdGFydF90YWcpCisgICAgICB2YWx1ZS5fSW50ZXJuYWxTZXJpYWxpemUod3JpdGUsIGRldGVybWluaXN0aWMpCisgICAgICByZXR1cm4gd3JpdGUoZW5kX3RhZykKKyAgICByZXR1cm4gRW5jb2RlRmllbGQKKworCitkZWYgTWVzc2FnZUVuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgIiIiUmV0dXJucyBhbiBlbmNvZGVyIGZvciBhIG1lc3NhZ2UgZmllbGQuIiIiCisKKyAgdGFnID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQorICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50CisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSwgZGV0ZXJtaW5pc3RpYyk6CisgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgd3JpdGUodGFnKQorICAgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIGVsZW1lbnQuQnl0ZVNpemUoKSwgZGV0ZXJtaW5pc3RpYykKKyAgICAgICAgZWxlbWVudC5fSW50ZXJuYWxTZXJpYWxpemUod3JpdGUsIGRldGVybWluaXN0aWMpCisgICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKKyAgZWxzZToKKyAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlLCBkZXRlcm1pbmlzdGljKToKKyAgICAgIHdyaXRlKHRhZykKKyAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgdmFsdWUuQnl0ZVNpemUoKSwgZGV0ZXJtaW5pc3RpYykKKyAgICAgIHJldHVybiB2YWx1ZS5fSW50ZXJuYWxTZXJpYWxpemUod3JpdGUsIGRldGVybWluaXN0aWMpCisgICAgcmV0dXJuIEVuY29kZUZpZWxkCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBcyBiZWZvcmUsIE1lc3NhZ2VTZXQgaXMgc3BlY2lhbC4KKworCitkZWYgTWVzc2FnZVNldEl0ZW1FbmNvZGVyKGZpZWxkX251bWJlcik6CisgICIiIkVuY29kZXIgZm9yIGV4dGVuc2lvbnMgb2YgTWVzc2FnZVNldC4KKworICBUaGUgbWVzc2FnZSBzZXQgbWVzc2FnZSBsb29rcyBsaWtlIHRoaXM6CisgICAgbWVzc2FnZSBNZXNzYWdlU2V0IHsKKyAgICAgIHJlcGVhdGVkIGdyb3VwIEl0ZW0gPSAxIHsKKyAgICAgICAgcmVxdWlyZWQgaW50MzIgdHlwZV9pZCA9IDI7CisgICAgICAgIHJlcXVpcmVkIHN0cmluZyBtZXNzYWdlID0gMzsKKyAgICAgIH0KKyAgICB9CisgICIiIgorICBzdGFydF9ieXRlcyA9IGIiIi5qb2luKFsKKyAgICAgIFRhZ0J5dGVzKDEsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKSwKKyAgICAgIFRhZ0J5dGVzKDIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCksCisgICAgICBfVmFyaW50Qnl0ZXMoZmllbGRfbnVtYmVyKSwKKyAgICAgIFRhZ0J5dGVzKDMsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpXSkKKyAgZW5kX2J5dGVzID0gVGFnQnl0ZXMoMSwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKQorICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50CisKKyAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSwgZGV0ZXJtaW5pc3RpYyk6CisgICAgd3JpdGUoc3RhcnRfYnl0ZXMpCisgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCB2YWx1ZS5CeXRlU2l6ZSgpLCBkZXRlcm1pbmlzdGljKQorICAgIHZhbHVlLl9JbnRlcm5hbFNlcmlhbGl6ZSh3cml0ZSwgZGV0ZXJtaW5pc3RpYykKKyAgICByZXR1cm4gd3JpdGUoZW5kX2J5dGVzKQorCisgIHJldHVybiBFbmNvZGVGaWVsZAorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXMgYmVmb3JlLCBNYXAgaXMgc3BlY2lhbC4KKworCitkZWYgTWFwRW5jb2RlcihmaWVsZF9kZXNjcmlwdG9yKToKKyAgIiIiRW5jb2RlciBmb3IgZXh0ZW5zaW9ucyBvZiBNZXNzYWdlU2V0LgorCisgIE1hcHMgYWx3YXlzIGhhdmUgYSB3aXJlIGZvcm1hdCBsaWtlIHRoaXM6CisgICAgbWVzc2FnZSBNYXBFbnRyeSB7CisgICAgICBrZXlfdHlwZSBrZXkgPSAxOworICAgICAgdmFsdWVfdHlwZSB2YWx1ZSA9IDI7CisgICAgfQorICAgIHJlcGVhdGVkIE1hcEVudHJ5IG1hcCA9IE47CisgICIiIgorICAjIENhbid0IGxvb2sgYXQgZmllbGRfZGVzY3JpcHRvci5tZXNzYWdlX3R5cGUuX2NvbmNyZXRlX2NsYXNzIGJlY2F1c2UgaXQgbWF5CisgICMgbm90IGhhdmUgYmVlbiBpbml0aWFsaXplZCB5ZXQuCisgIG1lc3NhZ2VfdHlwZSA9IGZpZWxkX2Rlc2NyaXB0b3IubWVzc2FnZV90eXBlCisgIGVuY29kZV9tZXNzYWdlID0gTWVzc2FnZUVuY29kZXIoZmllbGRfZGVzY3JpcHRvci5udW1iZXIsIEZhbHNlLCBGYWxzZSkKKworICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlLCBkZXRlcm1pbmlzdGljKToKKyAgICB2YWx1ZV9rZXlzID0gc29ydGVkKHZhbHVlLmtleXMoKSkgaWYgZGV0ZXJtaW5pc3RpYyBlbHNlIHZhbHVlCisgICAgZm9yIGtleSBpbiB2YWx1ZV9rZXlzOgorICAgICAgZW50cnlfbXNnID0gbWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcyhrZXk9a2V5LCB2YWx1ZT12YWx1ZVtrZXldKQorICAgICAgZW5jb2RlX21lc3NhZ2Uod3JpdGUsIGVudHJ5X21zZywgZGV0ZXJtaW5pc3RpYykKKworICByZXR1cm4gRW5jb2RlRmllbGQKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZW51bV90eXBlX3dyYXBwZXIucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VudW1fdHlwZV93cmFwcGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDJjN2EKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VudW1fdHlwZV93cmFwcGVyLnB5CkBAIC0wLDAgKzEsMTI0IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIGVudW0gdHlwZXMgdG8gZXhwb3NlIHV0aWxpdHkgZnVuY3Rpb25zLgorCitJbnN0YW5jZXMgYXJlIGNyZWF0ZWQgYXMgcHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGVudW0gdGhleSB3cmFwCitvbiBwcm90byBjbGFzc2VzLiAgRm9yIHVzYWdlLCBzZWU6CisgIHJlZmxlY3Rpb25fdGVzdC5weQorIiIiCisKK19fYXV0aG9yX18gPSAncmFic2F0dEBnb29nbGUuY29tIChLZXZpbiBSYWJzYXR0KScKKworCitjbGFzcyBFbnVtVHlwZVdyYXBwZXIob2JqZWN0KToKKyAgIiIiQSB1dGlsaXR5IGZvciBmaW5kaW5nIHRoZSBuYW1lcyBvZiBlbnVtIHZhbHVlcy4iIiIKKworICBERVNDUklQVE9SID0gTm9uZQorCisgICMgVGhpcyBpcyBhIHR5cGUgYWxpYXMsIHdoaWNoIG15cHkgdHlwaW5nIHN0dWJzIGNhbiB0eXBlIGFzCisgICMgYSBnZW5lcmljaXplZCBwYXJhbWV0ZXIgY29uc3RyYWluZWQgdG8gYW4gaW50LCBhbGxvd2luZyBzdWJjbGFzc2VzCisgICMgdG8gYmUgdHlwZWQgd2l0aCBtb3JlIGNvbnN0cmFpbnQgaW4gLnB5aSBzdHVicworICAjIEVnLgorICAjIGRlZiBNeUdlbmVyYXRlZEVudW0oTWVzc2FnZSk6CisgICMgICBWYWx1ZVR5cGUgPSBOZXdUeXBlKCdWYWx1ZVR5cGUnLCBpbnQpCisgICMgICBkZWYgTmFtZShzZWxmLCBudW1iZXI6IE15R2VuZXJhdGVkRW51bS5WYWx1ZVR5cGUpIC0+IHN0cgorICBWYWx1ZVR5cGUgPSBpbnQKKworICBkZWYgX19pbml0X18oc2VsZiwgZW51bV90eXBlKToKKyAgICAiIiJJbml0cyBFbnVtVHlwZVdyYXBwZXIgd2l0aCBhbiBFbnVtRGVzY3JpcHRvci4iIiIKKyAgICBzZWxmLl9lbnVtX3R5cGUgPSBlbnVtX3R5cGUKKyAgICBzZWxmLkRFU0NSSVBUT1IgPSBlbnVtX3R5cGUgICMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZQorCisgIGRlZiBOYW1lKHNlbGYsIG51bWJlcik6ICAjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKKyAgICAiIiJSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYW4gZW51bSB2YWx1ZS4iIiIKKyAgICB0cnk6CisgICAgICByZXR1cm4gc2VsZi5fZW51bV90eXBlLnZhbHVlc19ieV9udW1iZXJbbnVtYmVyXS5uYW1lCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgcGFzcyAgIyBmYWxsIG91dCB0byBicmVhayBleGNlcHRpb24gY2hhaW5pbmcKKworICAgIGlmIG5vdCBpc2luc3RhbmNlKG51bWJlciwgaW50KToKKyAgICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgICAnRW51bSB2YWx1ZSBmb3Ige30gbXVzdCBiZSBhbiBpbnQsIGJ1dCBnb3Qge30geyFyfS4nLmZvcm1hdCgKKyAgICAgICAgICAgICAgc2VsZi5fZW51bV90eXBlLm5hbWUsIHR5cGUobnVtYmVyKSwgbnVtYmVyKSkKKyAgICBlbHNlOgorICAgICAgIyByZXByIGhlcmUgdG8gaGFuZGxlIHRoZSBvZGQgY2FzZSB3aGVuIHlvdSBwYXNzIGluIGEgYm9vbGVhbi4KKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0VudW0ge30gaGFzIG5vIG5hbWUgZGVmaW5lZCBmb3IgdmFsdWUgeyFyfScuZm9ybWF0KAorICAgICAgICAgIHNlbGYuX2VudW1fdHlwZS5uYW1lLCBudW1iZXIpKQorCisgIGRlZiBWYWx1ZShzZWxmLCBuYW1lKTogICMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZQorICAgICIiIlJldHVybnMgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGVudW0gbmFtZS4iIiIKKyAgICB0cnk6CisgICAgICByZXR1cm4gc2VsZi5fZW51bV90eXBlLnZhbHVlc19ieV9uYW1lW25hbWVdLm51bWJlcgorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIHBhc3MgICMgZmFsbCBvdXQgdG8gYnJlYWsgZXhjZXB0aW9uIGNoYWluaW5nCisgICAgcmFpc2UgVmFsdWVFcnJvcignRW51bSB7fSBoYXMgbm8gdmFsdWUgZGVmaW5lZCBmb3IgbmFtZSB7IXJ9Jy5mb3JtYXQoCisgICAgICAgIHNlbGYuX2VudW1fdHlwZS5uYW1lLCBuYW1lKSkKKworICBkZWYga2V5cyhzZWxmKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHRoZSBzdHJpbmcgbmFtZXMgaW4gdGhlIGVudW0uCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBsaXN0IG9mIHN0cnMsIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgICAgIiIiCisKKyAgICByZXR1cm4gW3ZhbHVlX2Rlc2NyaXB0b3IubmFtZQorICAgICAgICAgICAgZm9yIHZhbHVlX2Rlc2NyaXB0b3IgaW4gc2VsZi5fZW51bV90eXBlLnZhbHVlc10KKworICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgdGhlIGludGVnZXIgdmFsdWVzIGluIHRoZSBlbnVtLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgbGlzdCBvZiBpbnRzLCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICAgICIiIgorCisgICAgcmV0dXJuIFt2YWx1ZV9kZXNjcmlwdG9yLm51bWJlcgorICAgICAgICAgICAgZm9yIHZhbHVlX2Rlc2NyaXB0b3IgaW4gc2VsZi5fZW51bV90eXBlLnZhbHVlc10KKworICBkZWYgaXRlbXMoc2VsZik6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiB0aGUgKG5hbWUsIHZhbHVlKSBwYWlycyBvZiB0aGUgZW51bS4KKworICAgIFJldHVybnM6CisgICAgICBBIGxpc3Qgb2YgKHN0ciwgaW50KSBwYWlycywgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkCisgICAgICBpbiB0aGUgLnByb3RvIGZpbGUuCisgICAgIiIiCisgICAgcmV0dXJuIFsodmFsdWVfZGVzY3JpcHRvci5uYW1lLCB2YWx1ZV9kZXNjcmlwdG9yLm51bWJlcikKKyAgICAgICAgICAgIGZvciB2YWx1ZV9kZXNjcmlwdG9yIGluIHNlbGYuX2VudW1fdHlwZS52YWx1ZXNdCisKKyAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICIiIlJldHVybnMgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGVudW0gbmFtZS4iIiIKKyAgICB0cnk6CisgICAgICByZXR1cm4gc3VwZXIoCisgICAgICAgICAgRW51bVR5cGVXcmFwcGVyLAorICAgICAgICAgIHNlbGYpLl9fZ2V0YXR0cmlidXRlX18oJ19lbnVtX3R5cGUnKS52YWx1ZXNfYnlfbmFtZVtuYW1lXS5udW1iZXIKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICBwYXNzICAjIGZhbGwgb3V0IHRvIGJyZWFrIGV4Y2VwdGlvbiBjaGFpbmluZworICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCdFbnVtIHt9IGhhcyBubyB2YWx1ZSBkZWZpbmVkIGZvciBuYW1lIHshcn0nLmZvcm1hdCgKKyAgICAgICAgc2VsZi5fZW51bV90eXBlLm5hbWUsIG5hbWUpKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9leHRlbnNpb25fZGljdC5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZXh0ZW5zaW9uX2RpY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0NmNmMgotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZXh0ZW5zaW9uX2RpY3QucHkKQEAgLTAsMCArMSwyMTMgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiQ29udGFpbnMgX0V4dGVuc2lvbkRpY3QgY2xhc3MgdG8gcmVwcmVzZW50IGV4dGVuc2lvbnMuCisiIiIKKworZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHR5cGVfY2hlY2tlcnMKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3IgaW1wb3J0IEZpZWxkRGVzY3JpcHRvcgorCisKK2RlZiBfVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKG1lc3NhZ2UsIGV4dGVuc2lvbl9oYW5kbGUpOgorICAiIiJWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIGhhbmRsZSBpcyB2YWxpZC4iIiIKKworICBpZiBub3QgaXNpbnN0YW5jZShleHRlbnNpb25faGFuZGxlLCBGaWVsZERlc2NyaXB0b3IpOgorICAgIHJhaXNlIEtleUVycm9yKCdIYXNFeHRlbnNpb24oKSBleHBlY3RzIGFuIGV4dGVuc2lvbiBoYW5kbGUsIGdvdDogJXMnICUKKyAgICAgICAgICAgICAgICAgICBleHRlbnNpb25faGFuZGxlKQorCisgIGlmIG5vdCBleHRlbnNpb25faGFuZGxlLmlzX2V4dGVuc2lvbjoKKyAgICByYWlzZSBLZXlFcnJvcignIiVzIiBpcyBub3QgYW4gZXh0ZW5zaW9uLicgJSBleHRlbnNpb25faGFuZGxlLmZ1bGxfbmFtZSkKKworICBpZiBub3QgZXh0ZW5zaW9uX2hhbmRsZS5jb250YWluaW5nX3R5cGU6CisgICAgcmFpc2UgS2V5RXJyb3IoJyIlcyIgaXMgbWlzc2luZyBhIGNvbnRhaW5pbmdfdHlwZS4nCisgICAgICAgICAgICAgICAgICAgJSBleHRlbnNpb25faGFuZGxlLmZ1bGxfbmFtZSkKKworICBpZiBleHRlbnNpb25faGFuZGxlLmNvbnRhaW5pbmdfdHlwZSBpcyBub3QgbWVzc2FnZS5ERVNDUklQVE9SOgorICAgIHJhaXNlIEtleUVycm9yKCdFeHRlbnNpb24gIiVzIiBleHRlbmRzIG1lc3NhZ2UgdHlwZSAiJXMiLCBidXQgdGhpcyAnCisgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UgaXMgb2YgdHlwZSAiJXMiLicgJQorICAgICAgICAgICAgICAgICAgIChleHRlbnNpb25faGFuZGxlLmZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZS5jb250YWluaW5nX3R5cGUuZnVsbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLkRFU0NSSVBUT1IuZnVsbF9uYW1lKSkKKworCisjIFRPRE8ocm9iaW5zb24pOiBVbmlmeSBlcnJvciBoYW5kbGluZyBvZiAidW5rbm93biBleHRlbnNpb24iIGNyYXAuCisjIFRPRE8ocm9iaW5zb24pOiBTdXBwb3J0IGl0ZXJpdGVtcygpLXN0eWxlIGl0ZXJhdGlvbiBvdmVyIGFsbAorIyBleHRlbnNpb25zIHdpdGggdGhlICJoYXMiIGJpdHMgdHVybmVkIG9uPworY2xhc3MgX0V4dGVuc2lvbkRpY3Qob2JqZWN0KToKKworICAiIiJEaWN0LWxpa2UgY29udGFpbmVyIGZvciBFeHRlbnNpb24gZmllbGRzIG9uIHByb3RvIGluc3RhbmNlcy4KKworICBOb3RlIHRoYXQgaW4gYWxsIGNhc2VzIHdlIGV4cGVjdCBleHRlbnNpb24gaGFuZGxlcyB0byBiZQorICBGaWVsZERlc2NyaXB0b3JzLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZXh0ZW5kZWRfbWVzc2FnZSk6CisgICAgIiIiCisgICAgQXJnczoKKyAgICAgIGV4dGVuZGVkX21lc3NhZ2U6IE1lc3NhZ2UgaW5zdGFuY2UgZm9yIHdoaWNoIHdlIGFyZSB0aGUgRXh0ZW5zaW9ucyBkaWN0LgorICAgICIiIgorICAgIHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UgPSBleHRlbmRlZF9tZXNzYWdlCisKKyAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGV4dGVuc2lvbl9oYW5kbGUpOgorICAgICIiIlJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGdpdmVuIGV4dGVuc2lvbiBoYW5kbGUuIiIiCisKKyAgICBfVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UsIGV4dGVuc2lvbl9oYW5kbGUpCisKKyAgICByZXN1bHQgPSBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLl9maWVsZHMuZ2V0KGV4dGVuc2lvbl9oYW5kbGUpCisgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgaWYgZXh0ZW5zaW9uX2hhbmRsZS5sYWJlbCA9PSBGaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICByZXN1bHQgPSBleHRlbnNpb25faGFuZGxlLl9kZWZhdWx0X2NvbnN0cnVjdG9yKHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UpCisgICAgZWxpZiBleHRlbnNpb25faGFuZGxlLmNwcF90eXBlID09IEZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgICBtZXNzYWdlX3R5cGUgPSBleHRlbnNpb25faGFuZGxlLm1lc3NhZ2VfdHlwZQorICAgICAgaWYgbm90IGhhc2F0dHIobWVzc2FnZV90eXBlLCAnX2NvbmNyZXRlX2NsYXNzJyk6CisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5fRkFDVE9SWS5HZXRQcm90b3R5cGUobWVzc2FnZV90eXBlKQorICAgICAgYXNzZXJ0IGdldGF0dHIoZXh0ZW5zaW9uX2hhbmRsZS5tZXNzYWdlX3R5cGUsICdfY29uY3JldGVfY2xhc3MnLCBOb25lKSwgKAorICAgICAgICAgICdVbmluaXRpYWxpemVkIGNvbmNyZXRlIGNsYXNzIGZvdW5kIGZvciBmaWVsZCAlciAobWVzc2FnZSB0eXBlICVyKScKKyAgICAgICAgICAlIChleHRlbnNpb25faGFuZGxlLmZ1bGxfbmFtZSwKKyAgICAgICAgICAgICBleHRlbnNpb25faGFuZGxlLm1lc3NhZ2VfdHlwZS5mdWxsX25hbWUpKQorICAgICAgcmVzdWx0ID0gZXh0ZW5zaW9uX2hhbmRsZS5tZXNzYWdlX3R5cGUuX2NvbmNyZXRlX2NsYXNzKCkKKyAgICAgIHRyeToKKyAgICAgICAgcmVzdWx0Ll9TZXRMaXN0ZW5lcihzZWxmLl9leHRlbmRlZF9tZXNzYWdlLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4pCisgICAgICBleGNlcHQgUmVmZXJlbmNlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgIyBTaW5ndWxhciBzY2FsYXIgLS0ganVzdCByZXR1cm4gdGhlIGRlZmF1bHQgd2l0aG91dCBpbnNlcnRpbmcgaW50byB0aGUKKyAgICAgICMgZGljdC4KKyAgICAgIHJldHVybiBleHRlbnNpb25faGFuZGxlLmRlZmF1bHRfdmFsdWUKKworICAgICMgQXRvbWljYWxseSBjaGVjayBpZiBhbm90aGVyIHRocmVhZCBoYXMgcHJlZW1wdGVkIHVzIGFuZCwgaWYgbm90LCBzd2FwCisgICAgIyBpbiB0aGUgbmV3IG9iamVjdCB3ZSBqdXN0IGNyZWF0ZWQuICBJZiBzb21lb25lIGhhcyBwcmVlbXB0ZWQgdXMsIHdlCisgICAgIyB0YWtlIHRoYXQgb2JqZWN0IGFuZCBkaXNjYXJkIG91cnMuCisgICAgIyBXQVJOSU5HOiAgV2UgYXJlIHJlbHlpbmcgb24gc2V0ZGVmYXVsdCgpIGJlaW5nIGF0b21pYy4gIFRoaXMgaXMgdHJ1ZQorICAgICMgICBpbiBDUHl0aG9uIGJ1dCB3ZSBoYXZlbid0IGludmVzdGlnYXRlZCBvdGhlcnMuICBUaGlzIHdhcm5pbmcgYXBwZWFycworICAgICMgICBpbiBzZXZlcmFsIG90aGVyIGxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuCisgICAgcmVzdWx0ID0gc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5fZmllbGRzLnNldGRlZmF1bHQoCisgICAgICAgIGV4dGVuc2lvbl9oYW5kbGUsIHJlc3VsdCkKKworICAgIHJldHVybiByZXN1bHQKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBteV9maWVsZHMgPSBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLkxpc3RGaWVsZHMoKQorICAgIG90aGVyX2ZpZWxkcyA9IG90aGVyLl9leHRlbmRlZF9tZXNzYWdlLkxpc3RGaWVsZHMoKQorCisgICAgIyBHZXQgcmlkIG9mIG5vbi1leHRlbnNpb24gZmllbGRzLgorICAgIG15X2ZpZWxkcyA9IFtmaWVsZCBmb3IgZmllbGQgaW4gbXlfZmllbGRzIGlmIGZpZWxkLmlzX2V4dGVuc2lvbl0KKyAgICBvdGhlcl9maWVsZHMgPSBbZmllbGQgZm9yIGZpZWxkIGluIG90aGVyX2ZpZWxkcyBpZiBmaWVsZC5pc19leHRlbnNpb25dCisKKyAgICByZXR1cm4gbXlfZmllbGRzID09IG90aGVyX2ZpZWxkcworCisgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgorCisgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgIGZpZWxkcyA9IHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UuTGlzdEZpZWxkcygpCisgICAgIyBHZXQgcmlkIG9mIG5vbi1leHRlbnNpb24gZmllbGRzLgorICAgIGV4dGVuc2lvbl9maWVsZHMgPSBbZmllbGQgZm9yIGZpZWxkIGluIGZpZWxkcyBpZiBmaWVsZFswXS5pc19leHRlbnNpb25dCisgICAgcmV0dXJuIGxlbihleHRlbnNpb25fZmllbGRzKQorCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICByYWlzZSBUeXBlRXJyb3IoJ3VuaGFzaGFibGUgb2JqZWN0JykKKworICAjIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3Igbm9uLXJlcGVhdGVkLCBzY2FsYXIgZXh0ZW5zaW9uCisgICMgZmllbGRzLiAgTm90ZSBhbHNvIHRoYXQgd2UgbWF5IGhhdmUgdG8gY2FsbCBfTW9kaWZpZWQoKSB3aGVuIHdlIGRvCisgICMgc3VjY2Vzc2Z1bGx5IHNldCBhIGZpZWxkIHRoaXMgd2F5LCB0byBzZXQgYW55IG5lY2Vzc2FyeSAiaGFzIiBiaXRzIGluIHRoZQorICAjIGFuY2VzdG9ycyBvZiB0aGUgZXh0ZW5kZWQgbWVzc2FnZS4KKyAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGV4dGVuc2lvbl9oYW5kbGUsIHZhbHVlKToKKyAgICAiIiJJZiBleHRlbnNpb25faGFuZGxlIHNwZWNpZmllcyBhIG5vbi1yZXBlYXRlZCwgc2NhbGFyIGV4dGVuc2lvbgorICAgIGZpZWxkLCBzZXRzIHRoZSB2YWx1ZSBvZiB0aGF0IGZpZWxkLgorICAgICIiIgorCisgICAgX1ZlcmlmeUV4dGVuc2lvbkhhbmRsZShzZWxmLl9leHRlbmRlZF9tZXNzYWdlLCBleHRlbnNpb25faGFuZGxlKQorCisgICAgaWYgKGV4dGVuc2lvbl9oYW5kbGUubGFiZWwgPT0gRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEIG9yCisgICAgICAgIGV4dGVuc2lvbl9oYW5kbGUuY3BwX3R5cGUgPT0gRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRSk6CisgICAgICByYWlzZSBUeXBlRXJyb3IoCisgICAgICAgICAgJ0Nhbm5vdCBhc3NpZ24gdG8gZXh0ZW5zaW9uICIlcyIgYmVjYXVzZSBpdCBpcyBhIHJlcGVhdGVkIG9yICcKKyAgICAgICAgICAnY29tcG9zaXRlIHR5cGUuJyAlIGV4dGVuc2lvbl9oYW5kbGUuZnVsbF9uYW1lKQorCisgICAgIyBJdCdzIHNsaWdodGx5IHdhc3RlZnVsIHRvIGxvb2t1cCB0aGUgdHlwZSBjaGVja2VyIGVhY2ggdGltZSwKKyAgICAjIGJ1dCB3ZSBleHBlY3QgdGhpcyB0byBiZSBhIHZhbmlzaGluZ2x5IHVuY29tbW9uIGNhc2UgYW55d2F5LgorICAgIHR5cGVfY2hlY2tlciA9IHR5cGVfY2hlY2tlcnMuR2V0VHlwZUNoZWNrZXIoZXh0ZW5zaW9uX2hhbmRsZSkKKyAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5fZmllbGRzW2V4dGVuc2lvbl9oYW5kbGVdID0gKAorICAgICAgICB0eXBlX2NoZWNrZXIuQ2hlY2tWYWx1ZSh2YWx1ZSkpCisgICAgc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5fTW9kaWZpZWQoKQorCisgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBleHRlbnNpb25faGFuZGxlKToKKyAgICBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbl9oYW5kbGUpCisKKyAgZGVmIF9GaW5kRXh0ZW5zaW9uQnlOYW1lKHNlbGYsIG5hbWUpOgorICAgICIiIlRyaWVzIHRvIGZpbmQgYSBrbm93biBleHRlbnNpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisKKyAgICBBcmdzOgorICAgICAgbmFtZTogRXh0ZW5zaW9uIGZ1bGwgbmFtZS4KKworICAgIFJldHVybnM6CisgICAgICBFeHRlbnNpb24gZmllbGQgZGVzY3JpcHRvci4KKyAgICAiIiIKKyAgICByZXR1cm4gc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5fZXh0ZW5zaW9uc19ieV9uYW1lLmdldChuYW1lLCBOb25lKQorCisgIGRlZiBfRmluZEV4dGVuc2lvbkJ5TnVtYmVyKHNlbGYsIG51bWJlcik6CisgICAgIiIiVHJpZXMgdG8gZmluZCBhIGtub3duIGV4dGVuc2lvbiB3aXRoIHRoZSBmaWVsZCBudW1iZXIuCisKKyAgICBBcmdzOgorICAgICAgbnVtYmVyOiBFeHRlbnNpb24gZmllbGQgbnVtYmVyLgorCisgICAgUmV0dXJuczoKKyAgICAgIEV4dGVuc2lvbiBmaWVsZCBkZXNjcmlwdG9yLgorICAgICIiIgorICAgIHJldHVybiBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLl9leHRlbnNpb25zX2J5X251bWJlci5nZXQobnVtYmVyLCBOb25lKQorCisgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAjIFJldHVybiBhIGdlbmVyYXRvciBvdmVyIHRoZSBwb3B1bGF0ZWQgZXh0ZW5zaW9uIGZpZWxkcworICAgIHJldHVybiAoZlswXSBmb3IgZiBpbiBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLkxpc3RGaWVsZHMoKQorICAgICAgICAgICAgaWYgZlswXS5pc19leHRlbnNpb24pCisKKyAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBleHRlbnNpb25faGFuZGxlKToKKyAgICBfVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UsIGV4dGVuc2lvbl9oYW5kbGUpCisKKyAgICBpZiBleHRlbnNpb25faGFuZGxlIG5vdCBpbiBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLl9maWVsZHM6CisgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIGV4dGVuc2lvbl9oYW5kbGUubGFiZWwgPT0gRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgorICAgICAgcmV0dXJuIGJvb2woc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5fZmllbGRzLmdldChleHRlbnNpb25faGFuZGxlKSkKKworICAgIGlmIGV4dGVuc2lvbl9oYW5kbGUuY3BwX3R5cGUgPT0gRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHZhbHVlID0gc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5fZmllbGRzLmdldChleHRlbnNpb25faGFuZGxlKQorICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgcmV0dXJuIHZhbHVlIGlzIG5vdCBOb25lIGFuZCB2YWx1ZS5faXNfcHJlc2VudF9pbl9wYXJlbnQKKworICAgIHJldHVybiBUcnVlCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDEucHJvdG8gYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDEucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3MjlmNQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0MS5wcm90bwpAQCAtMCwwICsxLDcwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBtYXR0aGV3dG9pYUBnb29nbGUuY29tIChNYXR0IFRvaWEpCisKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWw7CisKK2VudW0gRmFjdG9yeTFFbnVtIHsKKyAgRkFDVE9SWV8xX1ZBTFVFXzAgPSAwOworICBGQUNUT1JZXzFfVkFMVUVfMSA9IDE7Cit9CisKK21lc3NhZ2UgRmFjdG9yeTFNZXNzYWdlIHsKKyAgb3B0aW9uYWwgRmFjdG9yeTFFbnVtIGZhY3RvcnlfMV9lbnVtID0gMTsKKyAgZW51bSBOZXN0ZWRGYWN0b3J5MUVudW0geworICAgIE5FU1RFRF9GQUNUT1JZXzFfVkFMVUVfMCA9IDA7CisgICAgTkVTVEVEX0ZBQ1RPUllfMV9WQUxVRV8xID0gMTsKKyAgfQorICBvcHRpb25hbCBOZXN0ZWRGYWN0b3J5MUVudW0gbmVzdGVkX2ZhY3RvcnlfMV9lbnVtID0gMjsKKyAgbWVzc2FnZSBOZXN0ZWRGYWN0b3J5MU1lc3NhZ2UgeworICAgIG9wdGlvbmFsIHN0cmluZyB2YWx1ZSA9IDE7CisgIH0KKyAgb3B0aW9uYWwgTmVzdGVkRmFjdG9yeTFNZXNzYWdlIG5lc3RlZF9mYWN0b3J5XzFfbWVzc2FnZSA9IDM7CisgIG9wdGlvbmFsIGludDMyIHNjYWxhcl92YWx1ZSA9IDQ7CisgIHJlcGVhdGVkIHN0cmluZyBsaXN0X3ZhbHVlID0gNTsKKworICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCittZXNzYWdlIEZhY3RvcnkxTWV0aG9kUmVxdWVzdCB7CisgIG9wdGlvbmFsIHN0cmluZyBhcmd1bWVudCA9IDE7Cit9CisKK21lc3NhZ2UgRmFjdG9yeTFNZXRob2RSZXNwb25zZSB7CisgIG9wdGlvbmFsIHN0cmluZyByZXN1bHQgPSAxOworfQorCitzZXJ2aWNlIEZhY3RvcnkxU2VydmljZSB7CisgIC8vIER1bW15IG1ldGhvZCBmb3IgdGhpcyBkdW1teSBzZXJ2aWNlLgorICBycGMgRmFjdG9yeTFNZXRob2QoRmFjdG9yeTFNZXRob2RSZXF1ZXN0KSByZXR1cm5zIChGYWN0b3J5MU1ldGhvZFJlc3BvbnNlKSB7fQorfQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9mYWN0b3J5X3Rlc3QyLnByb3RvIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9mYWN0b3J5X3Rlc3QyLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmY2JjNWEKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDIucHJvdG8KQEAgLTAsMCArMSwxMDQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IG1hdHRoZXd0b2lhQGdvb2dsZS5jb20gKE1hdHQgVG9pYSkKKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbDsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0MS5wcm90byI7CisKKworZW51bSBGYWN0b3J5MkVudW0geworICBGQUNUT1JZXzJfVkFMVUVfMCA9IDA7CisgIEZBQ1RPUllfMl9WQUxVRV8xID0gMTsKK30KKworbWVzc2FnZSBGYWN0b3J5Mk1lc3NhZ2UgeworICByZXF1aXJlZCBpbnQzMiBtYW5kYXRvcnkgPSAxOworICBvcHRpb25hbCBGYWN0b3J5MkVudW0gZmFjdG9yeV8yX2VudW0gPSAyOworICBlbnVtIE5lc3RlZEZhY3RvcnkyRW51bSB7CisgICAgTkVTVEVEX0ZBQ1RPUllfMl9WQUxVRV8wID0gMDsKKyAgICBORVNURURfRkFDVE9SWV8yX1ZBTFVFXzEgPSAxOworICB9CisgIG9wdGlvbmFsIE5lc3RlZEZhY3RvcnkyRW51bSBuZXN0ZWRfZmFjdG9yeV8yX2VudW0gPSAzOworICBtZXNzYWdlIE5lc3RlZEZhY3RvcnkyTWVzc2FnZSB7CisgICAgb3B0aW9uYWwgc3RyaW5nIHZhbHVlID0gMTsKKyAgfQorICBvcHRpb25hbCBOZXN0ZWRGYWN0b3J5Mk1lc3NhZ2UgbmVzdGVkX2ZhY3RvcnlfMl9tZXNzYWdlID0gNDsKKyAgb3B0aW9uYWwgRmFjdG9yeTFNZXNzYWdlIGZhY3RvcnlfMV9tZXNzYWdlID0gNTsKKyAgb3B0aW9uYWwgRmFjdG9yeTFFbnVtIGZhY3RvcnlfMV9lbnVtID0gNjsKKyAgb3B0aW9uYWwgRmFjdG9yeTFNZXNzYWdlLk5lc3RlZEZhY3RvcnkxRW51bSBuZXN0ZWRfZmFjdG9yeV8xX2VudW0gPSA3OworICBvcHRpb25hbCBGYWN0b3J5MU1lc3NhZ2UuTmVzdGVkRmFjdG9yeTFNZXNzYWdlIG5lc3RlZF9mYWN0b3J5XzFfbWVzc2FnZSA9IDg7CisgIG9wdGlvbmFsIEZhY3RvcnkyTWVzc2FnZSBjaXJjdWxhcl9tZXNzYWdlID0gOTsKKyAgb3B0aW9uYWwgc3RyaW5nIHNjYWxhcl92YWx1ZSA9IDEwOworICByZXBlYXRlZCBzdHJpbmcgbGlzdF92YWx1ZSA9IDExOworICByZXBlYXRlZCBncm91cCBHcm91cGVkID0gMTIgeworICAgIG9wdGlvbmFsIHN0cmluZyBwYXJ0XzEgPSAxMzsKKyAgICBvcHRpb25hbCBzdHJpbmcgcGFydF8yID0gMTQ7CisgIH0KKyAgb3B0aW9uYWwgTG9vcE1lc3NhZ2UgbG9vcCA9IDE1OworICBvcHRpb25hbCBpbnQzMiBpbnRfd2l0aF9kZWZhdWx0ID0gMTYgW2RlZmF1bHQgPSAxNzc2XTsKKyAgb3B0aW9uYWwgZG91YmxlIGRvdWJsZV93aXRoX2RlZmF1bHQgPSAxNyBbZGVmYXVsdCA9IDkuOTldOworICBvcHRpb25hbCBzdHJpbmcgc3RyaW5nX3dpdGhfZGVmYXVsdCA9IDE4IFtkZWZhdWx0ID0gImhlbGxvIHdvcmxkIl07CisgIG9wdGlvbmFsIGJvb2wgYm9vbF93aXRoX2RlZmF1bHQgPSAxOSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgb3B0aW9uYWwgRmFjdG9yeTJFbnVtIGVudW1fd2l0aF9kZWZhdWx0ID0gMjAgW2RlZmF1bHQgPSBGQUNUT1JZXzJfVkFMVUVfMV07CisgIG9wdGlvbmFsIGJ5dGVzIGJ5dGVzX3dpdGhfZGVmYXVsdCA9IDIxIFtkZWZhdWx0ID0gImFcMzczXDAwMGMiXTsKKworCisgIGV4dGVuZCBGYWN0b3J5MU1lc3NhZ2UgeworICAgIG9wdGlvbmFsIHN0cmluZyBvbmVfbW9yZV9maWVsZCA9IDEwMDE7CisgIH0KKworICBvbmVvZiBvbmVvZl9maWVsZCB7CisgICAgaW50MzIgb25lb2ZfaW50ID0gMjI7CisgICAgc3RyaW5nIG9uZW9mX3N0cmluZyA9IDIzOworICB9Cit9CisKK21lc3NhZ2UgTG9vcE1lc3NhZ2UgeworICBvcHRpb25hbCBGYWN0b3J5Mk1lc3NhZ2UgbG9vcCA9IDE7Cit9CisKK21lc3NhZ2UgTWVzc2FnZVdpdGhOZXN0ZWRFbnVtT25seSB7CisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgTkVTVEVEX01FU1NBR0VfRU5VTV8wID0gMDsKKyAgfQorfQorCitleHRlbmQgRmFjdG9yeTFNZXNzYWdlIHsKKyAgb3B0aW9uYWwgc3RyaW5nIGFub3RoZXJfZmllbGQgPSAxMDAyOworfQorCittZXNzYWdlIE1lc3NhZ2VXaXRoT3B0aW9uIHsKKyAgb3B0aW9uIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IgPSB0cnVlOworICBvcHRpb25hbCBpbnQzMiBmaWVsZDEgPSAxOworfQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9maWxlX29wdGlvbnNfdGVzdC5wcm90byBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmlsZV9vcHRpb25zX3Rlc3QucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjZWViMAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmlsZV9vcHRpb25zX3Rlc3QucHJvdG8KQEAgLTAsMCArMSw0MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3N5bnRheCA9ICJwcm90bzIiOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKKworcGFja2FnZSBnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsOworCittZXNzYWdlIEZvb09wdGlvbnMgeworICBvcHRpb25hbCBzdHJpbmcgZm9vX25hbWUgPSAxOworfQorCitleHRlbmQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyB7CisgIG9wdGlvbmFsIEZvb09wdGlvbnMgZm9vX29wdGlvbnMgPSAxMjA0MzYyNjg7Cit9CmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2dlbmVyYXRvcl90ZXN0LnB5IGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9nZW5lcmF0b3JfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODgzZmNlCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9nZW5lcmF0b3JfdGVzdC5weQpAQCAtMCwwICsxLDM1NCBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjIFRPRE8ocm9iaW5zb24pOiBGbGVzaCB0aGlzIG91dCBjb25zaWRlcmFibHkuICBXZSBmb2N1c2VkIG9uIHJlZmxlY3Rpb25fdGVzdC5weQorIyBmaXJzdCwgc2luY2UgaXQncyB0ZXN0aW5nIHRoZSBzdWJ0bGVyIGNvZGUsIGFuZCBzaW5jZSBpdCBwcm92aWRlcyBkZWNlbnQKKyMgaW5kaXJlY3QgdGVzdGluZyBvZiB0aGUgcHJvdG9jb2wgY29tcGlsZXIgb3V0cHV0LgorCisiIiJVbml0dGVzdCB0aGF0IGRpcmVjdGx5IHRlc3RzIHRoZSBvdXRwdXQgb2YgdGhlIHB1cmUtUHl0aG9uIHByb3RvY29sCitjb21waWxlci4gIFNlZSAvL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9yZWZsZWN0aW9uX3Rlc3QucHkgZm9yIGEgdGVzdCB3aGljaAorZnVydGhlciBlbnN1cmVzIHRoYXQgd2UgY2FuIHVzZSBQeXRob24gcHJvdG9jb2wgbWVzc2FnZSBvYmplY3RzIGFzIHdlIGV4cGVjdC4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJworCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RfYmFkX2lkZW50aWZpZXJzX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2ltcG9ydF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9pbXBvcnRfcHVibGljX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X21zZXRfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHNlcnZpY2UKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzeW1ib2xfZGF0YWJhc2UKKworTUFYX0VYVEVOU0lPTiA9IDUzNjg3MDkxMgorCisKK2NsYXNzIEdlbmVyYXRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiB0ZXN0TmVzdGVkTWVzc2FnZURlc2NyaXB0b3Ioc2VsZik6CisgICAgZmllbGRfbmFtZSA9ICdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScKKyAgICBwcm90b190eXBlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcworICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHByb3RvX3R5cGUuTmVzdGVkTWVzc2FnZS5ERVNDUklQVE9SLAorICAgICAgICBwcm90b190eXBlLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbZmllbGRfbmFtZV0ubWVzc2FnZV90eXBlKQorCisgIGRlZiB0ZXN0RW51bXMoc2VsZik6CisgICAgIyBXZSB0ZXN0IG9ubHkgbW9kdWxlLWxldmVsIGVudW1zIGhlcmUuCisgICAgIyBUT0RPKHJvYmluc29uKTogRXhhbWluZSBkZXNjcmlwdG9ycyBkaXJlY3RseSB0byBjaGVjaworICAgICMgZW51bSBkZXNjcmlwdG9yIG91dHB1dC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDYsIHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWikKKworICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5GT08pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvLkJBUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgcHJvdG8uQkFaKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVopCisKKyAgZGVmIHRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyhzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcygpCisKKyAgICAjIFB5dGhvbiBwcmUtMi42IGRvZXMgbm90IGhhdmUgaXNpbmYoKSBvciBpc25hbigpIGZ1bmN0aW9ucywgc28gd2UgaGF2ZQorICAgICMgdG8gcHJvdmlkZSBvdXIgb3duLgorICAgIGRlZiBpc25hbih2YWwpOgorICAgICAgIyBOYU4gaXMgbmV2ZXIgZXF1YWwgdG8gaXRzZWxmLgorICAgICAgcmV0dXJuIHZhbCAhPSB2YWwKKyAgICBkZWYgaXNpbmYodmFsKToKKyAgICAgICMgSW5maW5pdHkgdGltZXMgemVybyBlcXVhbHMgTmFOLgorICAgICAgcmV0dXJuIG5vdCBpc25hbih2YWwpIGFuZCBpc25hbih2YWwgKiAwKQorCisgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5mKG1lc3NhZ2UuaW5mX2RvdWJsZSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UuaW5mX2RvdWJsZSA+IDApCisgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5mKG1lc3NhZ2UubmVnX2luZl9kb3VibGUpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm5lZ19pbmZfZG91YmxlIDwgMCkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4obWVzc2FnZS5uYW5fZG91YmxlKSkKKworICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luZihtZXNzYWdlLmluZl9mbG9hdCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UuaW5mX2Zsb2F0ID4gMCkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYobWVzc2FnZS5uZWdfaW5mX2Zsb2F0KSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5uZWdfaW5mX2Zsb2F0IDwgMCkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4obWVzc2FnZS5uYW5fZmxvYXQpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoIj8gPyA/PyA/PyA/Pz8gPz8vID8/LSIsIG1lc3NhZ2UuY3BwX3RyaWdyYXBoKQorCisgIGRlZiB0ZXN0SGFzRGVmYXVsdFZhbHVlcyhzZWxmKToKKyAgICBkZXNjID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SCisKKyAgICBleHBlY3RlZF9oYXNfZGVmYXVsdF9ieV9uYW1lID0geworICAgICAgICAnb3B0aW9uYWxfaW50MzInOiBGYWxzZSwKKyAgICAgICAgJ3JlcGVhdGVkX2ludDMyJzogRmFsc2UsCisgICAgICAgICdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSc6IEZhbHNlLAorICAgICAgICAnZGVmYXVsdF9pbnQzMic6IFRydWUsCisgICAgfQorCisgICAgaGFzX2RlZmF1bHRfYnlfbmFtZSA9IGRpY3QoCisgICAgICAgIFsoZi5uYW1lLCBmLmhhc19kZWZhdWx0X3ZhbHVlKQorICAgICAgICAgZm9yIGYgaW4gZGVzYy5maWVsZHMKKyAgICAgICAgIGlmIGYubmFtZSBpbiBleHBlY3RlZF9oYXNfZGVmYXVsdF9ieV9uYW1lXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2hhc19kZWZhdWx0X2J5X25hbWUsIGhhc19kZWZhdWx0X2J5X25hbWUpCisKKyAgZGVmIHRlc3RDb250YWluaW5nVHlwZUJlaGF2aW9yRm9yRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24uY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zLkRFU0NSSVBUT1IpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLnNpbmdsZS5jb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMuREVTQ1JJUFRPUikKKworICBkZWYgdGVzdEV4dGVuc2lvblNjb3BlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbi5leHRlbnNpb25fc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICBOb25lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5zaW5nbGUuZXh0ZW5zaW9uX3Njb3BlLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5ERVNDUklQVE9SKQorCisgIGRlZiB0ZXN0SXNFeHRlbnNpb24oc2VsZik6CisgICAgc2VsZi5hc3NlcnRUcnVlKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24uaXNfZXh0ZW5zaW9uKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLnNpbmdsZS5pc19leHRlbnNpb24pCisKKyAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLkRFU0NSSVBUT1IKKyAgICBub25fZXh0ZW5zaW9uX2Rlc2NyaXB0b3IgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbJ2EnXQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgbm9uX2V4dGVuc2lvbl9kZXNjcmlwdG9yLmlzX2V4dGVuc2lvbikKKworICBkZWYgdGVzdE9wdGlvbnMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0X3BiMi5UZXN0TWVzc2FnZVNldCgpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkRFU0NSSVBUT1IuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KQorCisgIGRlZiB0ZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMoKQorICAgIGVudW1fb3B0aW9ucyA9IHByb3RvLkRFU0NSSVBUT1IuZW51bV90eXBlc19ieV9uYW1lWydBbkVudW0nXS5HZXRPcHRpb25zKCkKKyAgICBzZWxmLmFzc2VydFRydWUoZW51bV9vcHRpb25zIGlzIG5vdCBOb25lKQorICAgICMgVE9ETyhncHMpOiBXZSByZWFsbHkgc2hvdWxkIHRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgZW51bV9vcHQxCisgICAgIyBleHRlbnNpb24gYW5kIGZvciBpdHMgdmFsdWUgdG8gYmUgc2V0IHRvIC03ODkuCisKKyAgZGVmIHRlc3ROZXN0ZWRUeXBlcyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBzZXQodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SLm5lc3RlZF90eXBlcyksCisgICAgICAgIHNldChbCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuREVTQ1JJUFRPUiwKKyAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuT3B0aW9uYWxHcm91cC5ERVNDUklQVE9SLAorICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwLkRFU0NSSVBUT1IsCisgICAgICAgIF0pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UuREVTQ1JJUFRPUi5uZXN0ZWRfdHlwZXMsIFtdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5ERVNDUklQVE9SLm5lc3RlZF90eXBlcywgW10pCisKKyAgZGVmIHRlc3RDb250YWluaW5nVHlwZShzZWxmKToKKyAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlIGlzIE5vbmUpCisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlIGlzIE5vbmUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlLAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlLAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlLAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IpCisKKyAgZGVmIHRlc3RDb250YWluaW5nVHlwZUluRW51bURlc2NyaXB0b3Ioc2VsZik6CisgICAgc2VsZi5hc3NlcnRUcnVlKHVuaXR0ZXN0X3BiMi5fRk9SRUlHTkVOVU0uY29udGFpbmluZ190eXBlIGlzIE5vbmUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuX1RFU1RBTExUWVBFU19ORVNURURFTlVNLmNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUikKKworICBkZWYgdGVzdFBhY2thZ2Uoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SLmZpbGUucGFja2FnZSwKKyAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKKyAgICBkZXNjID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IKKyAgICBzZWxmLmFzc2VydEVxdWFsKGRlc2MuZmlsZS5wYWNrYWdlLCAncHJvdG9idWZfdW5pdHRlc3QnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X2ltcG9ydF9wYjIuSW1wb3J0TWVzc2FnZS5ERVNDUklQVE9SLmZpbGUucGFja2FnZSwKKyAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydCcpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9wYjIuX0ZPUkVJR05FTlVNLmZpbGUucGFja2FnZSwgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9wYjIuX1RFU1RBTExUWVBFU19ORVNURURFTlVNLmZpbGUucGFja2FnZSwKKyAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9pbXBvcnRfcGIyLl9JTVBPUlRFTlVNLmZpbGUucGFja2FnZSwKKyAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydCcpCisKKyAgZGVmIHRlc3RFeHRlbnNpb25SYW5nZShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IuZXh0ZW5zaW9uX3JhbmdlcywgW10pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zLkRFU0NSSVBUT1IuZXh0ZW5zaW9uX3JhbmdlcywKKyAgICAgICAgWygxLCBNQVhfRVhURU5TSU9OKV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcy5ERVNDUklQVE9SLmV4dGVuc2lvbl9yYW5nZXMsCisgICAgICAgIFsoNDIsIDQzKSwgKDQxNDMsIDQyNDQpLCAoNjU1MzYsIE1BWF9FWFRFTlNJT04pXSkKKworICBkZWYgdGVzdEZpbGVEZXNjcmlwdG9yKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IucGFja2FnZSwgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKKyAgICBzZWxmLmFzc2VydEZhbHNlKHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIgaXMgTm9uZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SLmRlcGVuZGVuY2llcywKKyAgICAgICAgICAgICAgICAgICAgIFt1bml0dGVzdF9pbXBvcnRfcGIyLkRFU0NSSVBUT1JdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfaW1wb3J0X3BiMi5ERVNDUklQVE9SLmRlcGVuZGVuY2llcywKKyAgICAgICAgICAgICAgICAgICAgIFt1bml0dGVzdF9pbXBvcnRfcHVibGljX3BiMi5ERVNDUklQVE9SXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X2ltcG9ydF9wYjIuREVTQ1JJUFRPUi5wdWJsaWNfZGVwZW5kZW5jaWVzLAorICAgICAgICAgICAgICAgICAgICAgW3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfcGIyLkRFU0NSSVBUT1JdKQorICBkZWYgdGVzdE5vR2VuZXJpY1NlcnZpY2VzKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXNfcGIyLCAiVGVzdE1lc3NhZ2UiKSkKKyAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cih1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzX3BiMiwgIkZPTyIpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXNfcGIyLCAidGVzdF9leHRlbnNpb24iKSkKKworICAgICMgTWFrZSBzdXJlIHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXNfcGIyIGhhcyBubyBzZXJ2aWNlcyBzdWJjbGFzc2luZworICAgICMgUHJvdG8yIFNlcnZpY2UgY2xhc3MuCisgICAgaWYgaGFzYXR0cih1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzX3BiMiwgIlRlc3RTZXJ2aWNlIik6CisgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlc19wYjIuVGVzdFNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5TZXJ2aWNlKSkKKworICBkZWYgdGVzdE1lc3NhZ2VUeXBlc0J5TmFtZShzZWxmKToKKyAgICBmaWxlX3R5cGUgPSB1bml0dGVzdF9wYjIuREVTQ1JJUFRPUgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5fVEVTVEFMTFRZUEVTLAorICAgICAgICBmaWxlX3R5cGUubWVzc2FnZV90eXBlc19ieV9uYW1lW3VuaXR0ZXN0X3BiMi5fVEVTVEFMTFRZUEVTLm5hbWVdKQorCisgICAgIyBOZXN0ZWQgbWVzc2FnZXMgc2hvdWxkbid0IGJlIGluY2x1ZGVkIGluIHRoZSBtZXNzYWdlX3R5cGVzX2J5X25hbWUKKyAgICAjIGRpY3Rpb25hcnkgKGxpa2UgaW4gdGhlIEMrKyBBUEkpLgorICAgIHNlbGYuYXNzZXJ0RmFsc2UoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5fVEVTVEFMTFRZUEVTX05FU1RFRE1FU1NBR0UubmFtZSBpbgorICAgICAgICBmaWxlX3R5cGUubWVzc2FnZV90eXBlc19ieV9uYW1lKQorCisgIGRlZiB0ZXN0RW51bVR5cGVzQnlOYW1lKHNlbGYpOgorICAgIGZpbGVfdHlwZSA9IHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLl9GT1JFSUdORU5VTSwKKyAgICAgICAgZmlsZV90eXBlLmVudW1fdHlwZXNfYnlfbmFtZVt1bml0dGVzdF9wYjIuX0ZPUkVJR05FTlVNLm5hbWVdKQorCisgIGRlZiB0ZXN0RXh0ZW5zaW9uc0J5TmFtZShzZWxmKToKKyAgICBmaWxlX3R5cGUgPSB1bml0dGVzdF9wYjIuREVTQ1JJUFRPUgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25fc3RyaW5nLAorICAgICAgICBmaWxlX3R5cGUuZXh0ZW5zaW9uc19ieV9uYW1lW3VuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25fc3RyaW5nLm5hbWVdKQorCisgIGRlZiB0ZXN0UHVibGljSW1wb3J0cyhzZWxmKToKKyAgICAjIFRlc3QgcHVibGljIGltcG9ydHMgYXMgZW1iZWRkZWQgbWVzc2FnZS4KKyAgICBhbGxfdHlwZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgYWxsX3R5cGVfcHJvdG8ub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlLmUpCisKKyAgICAjIFB1YmxpY0ltcG9ydE1lc3NhZ2UgaXMgYWN0dWFsbHkgZGVmaW5lZCBpbiB1bml0dGVzdF9pbXBvcnRfcHVibGljX3BiMgorICAgICMgbW9kdWxlLCBhbmQgaXMgcHVibGljIGltcG9ydGVkIGJ5IHVuaXR0ZXN0X2ltcG9ydF9wYjIgbW9kdWxlLgorICAgIHB1YmxpY19pbXBvcnRfcHJvdG8gPSB1bml0dGVzdF9pbXBvcnRfcGIyLlB1YmxpY0ltcG9ydE1lc3NhZ2UoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHVibGljX2ltcG9ydF9wcm90by5lKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bml0dGVzdF9pbXBvcnRfcHVibGljX3BiMi5QdWJsaWNJbXBvcnRNZXNzYWdlIGlzCisgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X2ltcG9ydF9wYjIuUHVibGljSW1wb3J0TWVzc2FnZSkKKworICBkZWYgdGVzdEJhZElkZW50aWZpZXJzKHNlbGYpOgorICAgICMgV2UncmUganVzdCB0ZXN0aW5nIHRoYXQgdGhlIGNvZGUgd2FzIGltcG9ydGVkIHdpdGhvdXQgcHJvYmxlbXMuCisgICAgbWVzc2FnZSA9IHRlc3RfYmFkX2lkZW50aWZpZXJzX3BiMi5UZXN0QmFkSWRlbnRpZmllcnMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5FeHRlbnNpb25zW3Rlc3RfYmFkX2lkZW50aWZpZXJzX3BiMi5tZXNzYWdlXSwKKyAgICAgICAgICAgICAgICAgICAgICJmb28iKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5FeHRlbnNpb25zW3Rlc3RfYmFkX2lkZW50aWZpZXJzX3BiMi5kZXNjcmlwdG9yXSwKKyAgICAgICAgICAgICAgICAgICAgICJiYXIiKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5FeHRlbnNpb25zW3Rlc3RfYmFkX2lkZW50aWZpZXJzX3BiMi5yZWZsZWN0aW9uXSwKKyAgICAgICAgICAgICAgICAgICAgICJiYXoiKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5FeHRlbnNpb25zW3Rlc3RfYmFkX2lkZW50aWZpZXJzX3BiMi5zZXJ2aWNlXSwKKyAgICAgICAgICAgICAgICAgICAgICJxdXgiKQorCisgIGRlZiB0ZXN0T25lb2Yoc2VsZik6CisgICAgZGVzYyA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKGRlc2Mub25lb2ZzKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl9maWVsZCcsIGRlc2Mub25lb2ZzWzBdLm5hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBkZXNjLm9uZW9mc1swXS5pbmRleCkKKyAgICBzZWxmLmFzc2VydElzKGRlc2MsIGRlc2Mub25lb2ZzWzBdLmNvbnRhaW5pbmdfdHlwZSkKKyAgICBzZWxmLmFzc2VydElzKGRlc2Mub25lb2ZzWzBdLCBkZXNjLm9uZW9mc19ieV9uYW1lWydvbmVvZl9maWVsZCddKQorICAgIG5lc3RlZF9uYW1lcyA9IHNldChbJ29uZW9mX3VpbnQzMicsICdvbmVvZl9uZXN0ZWRfbWVzc2FnZScsCisgICAgICAgICAgICAgICAgICAgICAgICAnb25lb2Zfc3RyaW5nJywgJ29uZW9mX2J5dGVzJ10pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgbmVzdGVkX25hbWVzLAorICAgICAgICBzZXQoW2ZpZWxkLm5hbWUgZm9yIGZpZWxkIGluIGRlc2Mub25lb2ZzWzBdLmZpZWxkc10pKQorICAgIGZvciBmaWVsZF9uYW1lLCBmaWVsZF9kZXNjIGluIGRlc2MuZmllbGRzX2J5X25hbWUuaXRlbXMoKToKKyAgICAgIGlmIGZpZWxkX25hbWUgaW4gbmVzdGVkX25hbWVzOgorICAgICAgICBzZWxmLmFzc2VydElzKGRlc2Mub25lb2ZzWzBdLCBmaWVsZF9kZXNjLmNvbnRhaW5pbmdfb25lb2YpCisgICAgICBlbHNlOgorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShmaWVsZF9kZXNjLmNvbnRhaW5pbmdfb25lb2YpCisKKyAgZGVmIHRlc3RFbnVtV2l0aER1cFZhbHVlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0ZPTzEnLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RFbnVtV2l0aER1cFZhbHVlLk5hbWUodW5pdHRlc3RfcGIyLkZPTzEpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0ZPTzEnLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RFbnVtV2l0aER1cFZhbHVlLk5hbWUodW5pdHRlc3RfcGIyLkZPTzIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0JBUjEnLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RFbnVtV2l0aER1cFZhbHVlLk5hbWUodW5pdHRlc3RfcGIyLkJBUjEpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0JBUjEnLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RFbnVtV2l0aER1cFZhbHVlLk5hbWUodW5pdHRlc3RfcGIyLkJBUjIpKQorCisKK2NsYXNzIFN5bWJvbERhdGFiYXNlUmVnaXN0cmF0aW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICIiIkNoZWNrcyB0aGF0IG1lc3NhZ2VzLCBlbnVtcyBhbmQgZmlsZXMgYXJlIGNvcnJlY3RseSByZWdpc3RlcmVkLiIiIgorCisgIGRlZiB0ZXN0R2V0U3ltYm9sKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMsIHN5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkuR2V0U3ltYm9sKAorICAgICAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcycpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSwKKyAgICAgICAgc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKS5HZXRTeW1ib2woCisgICAgICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnKSkKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKKyAgICAgIHN5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkuR2V0U3ltYm9sKCdwcm90b2J1Zl91bml0dGVzdC5OZXN0ZWRNZXNzYWdlJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk9wdGlvbmFsR3JvdXAsCisgICAgICAgIHN5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkuR2V0U3ltYm9sKAorICAgICAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwLAorICAgICAgICBzeW1ib2xfZGF0YWJhc2UuRGVmYXVsdCgpLkdldFN5bWJvbCgKKyAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCcpKQorCisgIGRlZiB0ZXN0RW51bXMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtJywKKyAgICAgICAgc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKS5wb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgKKyAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bScpLmZ1bGxfbmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0nLAorICAgICAgICBzeW1ib2xfZGF0YWJhc2UuRGVmYXVsdCgpLnBvb2wuRmluZEVudW1UeXBlQnlOYW1lKAorICAgICAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtJykuZnVsbF9uYW1lKQorCisgIGRlZiB0ZXN0RmluZEZpbGVCeU5hbWUoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bycsCisgICAgICAgIHN5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkucG9vbC5GaW5kRmlsZUJ5TmFtZSgKKyAgICAgICAgICAgICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nKS5uYW1lKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvaW1wb3J0X3Rlc3QucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ltcG9ydF90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzU3MmMKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ltcG9ydF90ZXN0LnB5CkBAIC0wLDAgKzEsNDkgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXR0ZXN0IGZvciBuZXN0ZWQgcHVibGljIGltcG9ydHMuIiIiCisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5pbXBvcnRfdGVzdF9wYWNrYWdlIGltcG9ydCBvdXRlcl9wYjIKKworCitjbGFzcyBJbXBvcnRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdFBhY2thZ2VJbml0aWFsaXphdGlvbkltcG9ydChzZWxmKToKKyAgICAiIiJUZXN0IHRoYXQgd2UgY2FuIGltcG9ydCBuZXN0ZWQgaW1wb3J0IHB1YmxpYyBtZXNzYWdlcy4iIiIKKworICAgIG1zZyA9IG91dGVyX3BiMi5PdXRlcigpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1OCwgbXNnLmltcG9ydF9wdWJsaWNfbmVzdGVkLnZhbHVlKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9pbXBvcnRfdGVzdF9wYWNrYWdlL19faW5pdF9fLnB5IGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9pbXBvcnRfdGVzdF9wYWNrYWdlL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMjFkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ltcG9ydF90ZXN0X3BhY2thZ2UvX19pbml0X18ucHkKQEAgLTAsMCArMSwzMyBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJTYW1wbGUgbW9kdWxlIGltcG9ydGluZyBhIG5lc3RlZCBwcm90byBmcm9tIGl0c2VsZi4iIiIKKworZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuaW1wb3J0X3Rlc3RfcGFja2FnZSBpbXBvcnQgb3V0ZXJfcGIyIGFzIG15cHJvdG8KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvaW1wb3J0X3Rlc3RfcGFja2FnZS9pbXBvcnRfcHVibGljLnByb3RvIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9pbXBvcnRfdGVzdF9wYWNrYWdlL2ltcG9ydF9wdWJsaWMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3NDcwMgotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvaW1wb3J0X3Rlc3RfcGFja2FnZS9pbXBvcnRfcHVibGljLnByb3RvCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBIHByb3RvIGZpbGUgd2hpY2ggaXMgaW1wb3J0ZWQgYnkgaW5uZXIucHJvdG8gdG8gdGVzdCBwdWJsaWMgaW1wb3J0aW5nLgorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLmltcG9ydF90ZXN0X3BhY2thZ2U7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKKworLy8gVGVzdCBuZXN0ZWQgcHVibGljIGltcG9ydAoraW1wb3J0IHB1YmxpYyAiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ltcG9ydF90ZXN0X3BhY2thZ2UvaW1wb3J0X3B1YmxpY19uZXN0ZWQucHJvdG8iOwpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9pbXBvcnRfdGVzdF9wYWNrYWdlL2ltcG9ydF9wdWJsaWNfbmVzdGVkLnByb3RvIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9pbXBvcnRfdGVzdF9wYWNrYWdlL2ltcG9ydF9wdWJsaWNfbmVzdGVkLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZjRkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ltcG9ydF90ZXN0X3BhY2thZ2UvaW1wb3J0X3B1YmxpY19uZXN0ZWQucHJvdG8KQEAgLTAsMCArMSw0MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgcHJvdG8gZmlsZSB3aGljaCBpcyBpbXBvcnRlZCBieSBpbXBvcnRfcHVibGljLnByb3RvIHRvIHRlc3QgbmVzdGVkIHB1YmxpYworLy8gaW1wb3J0aW5nLgorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLmltcG9ydF90ZXN0X3BhY2thZ2U7CisKK21lc3NhZ2UgSW1wb3J0UHVibGljTmVzdGVkTWVzc2FnZSB7CisgIG9wdGlvbmFsIGludDMyIHZhbHVlID0gMSBbZGVmYXVsdCA9IDU4XTsKK30KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvaW1wb3J0X3Rlc3RfcGFja2FnZS9pbm5lci5wcm90byBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvaW1wb3J0X3Rlc3RfcGFja2FnZS9pbm5lci5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjBjMjJlCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9pbXBvcnRfdGVzdF9wYWNrYWdlL2lubmVyLnByb3RvCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLmltcG9ydF90ZXN0X3BhY2thZ2U7CisKKy8vIFRlc3QgcHVibGljIGltcG9ydAoraW1wb3J0IHB1YmxpYyAiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ltcG9ydF90ZXN0X3BhY2thZ2UvaW1wb3J0X3B1YmxpYy5wcm90byI7CisKK21lc3NhZ2UgSW5uZXIgeworICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDEgW2RlZmF1bHQgPSA1N107Cit9CmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ltcG9ydF90ZXN0X3BhY2thZ2Uvb3V0ZXIucHJvdG8gYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ltcG9ydF90ZXN0X3BhY2thZ2Uvb3V0ZXIucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxMGFlYwotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvaW1wb3J0X3Rlc3RfcGFja2FnZS9vdXRlci5wcm90bwpAQCAtMCwwICsxLDQwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5pbXBvcnRfdGVzdF9wYWNrYWdlOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9pbXBvcnRfdGVzdF9wYWNrYWdlL2lubmVyLnByb3RvIjsKKworbWVzc2FnZSBPdXRlciB7CisgIG9wdGlvbmFsIElubmVyIGlubmVyID0gMTsKKyAgb3B0aW9uYWwgSW1wb3J0UHVibGljTmVzdGVkTWVzc2FnZSBpbXBvcnRfcHVibGljX25lc3RlZCA9IDI7Cit9CmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2pzb25fZm9ybWF0X3Rlc3QucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2pzb25fZm9ybWF0X3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxOGMzZgotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvanNvbl9mb3JtYXRfdGVzdC5weQpAQCAtMCwwICsxLDEyODUgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdCBmb3IgZ29vZ2xlLnByb3RvYnVmLmpzb25fZm9ybWF0LiIiIgorCitfX2F1dGhvcl9fID0gJ2ppZWx1b0Bnb29nbGUuY29tIChKaWUgTHVvKScKKworaW1wb3J0IGpzb24KK2ltcG9ydCBtYXRoCitpbXBvcnQgc3RydWN0CisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgYW55X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGR1cmF0aW9uX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGZpZWxkX21hc2tfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc3RydWN0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHRpbWVzdGFtcF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB3cmFwcGVyc19wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBhbnlfdGVzdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9tc2V0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RfcHJvdG8zX29wdGlvbmFsX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGpzb25fZm9ybWF0Citmcm9tIGdvb2dsZS5wcm90b2J1Zi51dGlsIGltcG9ydCBqc29uX2Zvcm1hdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLnV0aWwgaW1wb3J0IGpzb25fZm9ybWF0X3Byb3RvM19wYjIKKworCitjbGFzcyBKc29uRm9ybWF0QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIEZpbGxBbGxGaWVsZHMoc2VsZiwgbWVzc2FnZSk6CisgICAgbWVzc2FnZS5pbnQzMl92YWx1ZSA9IDIwCisgICAgbWVzc2FnZS5pbnQ2NF92YWx1ZSA9IC0yMAorICAgIG1lc3NhZ2UudWludDMyX3ZhbHVlID0gMzEyMDk4NzY1NAorICAgIG1lc3NhZ2UudWludDY0X3ZhbHVlID0gMTIzNDU2Nzg5MDAKKyAgICBtZXNzYWdlLmZsb2F0X3ZhbHVlID0gZmxvYXQoJy1pbmYnKQorICAgIG1lc3NhZ2UuZG91YmxlX3ZhbHVlID0gMy4xNDE1CisgICAgbWVzc2FnZS5ib29sX3ZhbHVlID0gVHJ1ZQorICAgIG1lc3NhZ2Uuc3RyaW5nX3ZhbHVlID0gJ2ZvbycKKyAgICBtZXNzYWdlLmJ5dGVzX3ZhbHVlID0gYidiYXInCisgICAgbWVzc2FnZS5tZXNzYWdlX3ZhbHVlLnZhbHVlID0gMTAKKyAgICBtZXNzYWdlLmVudW1fdmFsdWUgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLkJBUgorICAgICMgUmVwZWF0ZWQKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3ZhbHVlLmFwcGVuZCgweDdGRkZGRkZGKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJfdmFsdWUuYXBwZW5kKC0yMTQ3NDgzNjQ4KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRfdmFsdWUuYXBwZW5kKDkwMDcxOTkyNTQ3NDA5OTIpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NF92YWx1ZS5hcHBlbmQoLTkwMDcxOTkyNTQ3NDA5OTIpCisgICAgbWVzc2FnZS5yZXBlYXRlZF91aW50MzJfdmFsdWUuYXBwZW5kKDB4RkZGRkZGRikKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl92YWx1ZS5hcHBlbmQoMHg3RkZGRkZGKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0X3ZhbHVlLmFwcGVuZCg5MDA3MTk5MjU0NzQwOTkyKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0X3ZhbHVlLmFwcGVuZCg5MDA3MTk5MjU0NzQwOTkxKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRfdmFsdWUuYXBwZW5kKDApCisKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV92YWx1ZS5hcHBlbmQoMUUtMTUpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVfdmFsdWUuYXBwZW5kKGZsb2F0KCdpbmYnKSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfdmFsdWUuYXBwZW5kKFRydWUpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9ib29sX3ZhbHVlLmFwcGVuZChGYWxzZSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ192YWx1ZS5hcHBlbmQoJ0ZldyBzeW1ib2xzISMkLDsnKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3ZhbHVlLmFwcGVuZCgnYmFyJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3ZhbHVlLmFwcGVuZChiJ2ZvbycpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9ieXRlc192YWx1ZS5hcHBlbmQoYidiYXInKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS5hZGQoKS52YWx1ZSA9IDEwCisgICAgbWVzc2FnZS5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLmFkZCgpLnZhbHVlID0gMTEKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2VudW1fdmFsdWUuYXBwZW5kKGpzb25fZm9ybWF0X3Byb3RvM19wYjIuRk9PKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZW51bV92YWx1ZS5hcHBlbmQoanNvbl9mb3JtYXRfcHJvdG8zX3BiMi5CQVIpCisgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorCisgIGRlZiBDaGVja1BhcnNlQmFjayhzZWxmLCBtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSk6CisgICAganNvbl9mb3JtYXQuUGFyc2UoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgIGRlZiBDaGVja0Vycm9yKHNlbGYsIHRleHQsIGVycm9yX21lc3NhZ2UpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KGpzb25fZm9ybWF0LlBhcnNlRXJyb3IsIGVycm9yX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKKworCitjbGFzcyBKc29uRm9ybWF0VGVzdChKc29uRm9ybWF0QmFzZSk6CisKKyAgZGVmIHRlc3RFbXB0eU1lc3NhZ2VUb0pzb24oc2VsZik6CisgICAgbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE1lc3NhZ2UoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICd7fScpCisgICAgcGFyc2VkX21lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKCkKKyAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgIGRlZiB0ZXN0UGFydGlhbE1lc3NhZ2VUb0pzb24oc2VsZik6CisgICAgbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE1lc3NhZ2UoCisgICAgICAgIHN0cmluZ192YWx1ZT0ndGVzdCcsCisgICAgICAgIHJlcGVhdGVkX2ludDMyX3ZhbHVlPVs4OSwgNF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChqc29uLmxvYWRzKGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSkpLAorICAgICAgICAgICAgICAgICAgICAganNvbi5sb2FkcygneyJzdHJpbmdWYWx1ZSI6ICJ0ZXN0IiwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnInJlcGVhdGVkSW50MzJWYWx1ZSI6IFs4OSwgNF19JykpCisgICAgcGFyc2VkX21lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKCkKKyAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgIGRlZiB0ZXN0QWxsRmllbGRzVG9Kc29uKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKCkKKyAgICB0ZXh0ID0gKCd7ImludDMyVmFsdWUiOiAyMCwgJworICAgICAgICAgICAgJyJpbnQ2NFZhbHVlIjogIi0yMCIsICcKKyAgICAgICAgICAgICcidWludDMyVmFsdWUiOiAzMTIwOTg3NjU0LCcKKyAgICAgICAgICAgICcidWludDY0VmFsdWUiOiAiMTIzNDU2Nzg5MDAiLCcKKyAgICAgICAgICAgICciZmxvYXRWYWx1ZSI6ICItSW5maW5pdHkiLCcKKyAgICAgICAgICAgICciZG91YmxlVmFsdWUiOiAzLjE0MTUsJworICAgICAgICAgICAgJyJib29sVmFsdWUiOiB0cnVlLCcKKyAgICAgICAgICAgICcic3RyaW5nVmFsdWUiOiAiZm9vIiwnCisgICAgICAgICAgICAnImJ5dGVzVmFsdWUiOiAiWW1GeSIsJworICAgICAgICAgICAgJyJtZXNzYWdlVmFsdWUiOiB7InZhbHVlIjogMTB9LCcKKyAgICAgICAgICAgICciZW51bVZhbHVlIjogIkJBUiIsJworICAgICAgICAgICAgJyJyZXBlYXRlZEludDMyVmFsdWUiOiBbMjE0NzQ4MzY0NywgLTIxNDc0ODM2NDhdLCcKKyAgICAgICAgICAgICcicmVwZWF0ZWRJbnQ2NFZhbHVlIjogWyI5MDA3MTk5MjU0NzQwOTkyIiwgIi05MDA3MTk5MjU0NzQwOTkyIl0sJworICAgICAgICAgICAgJyJyZXBlYXRlZFVpbnQzMlZhbHVlIjogWzI2ODQzNTQ1NSwgMTM0MjE3NzI3XSwnCisgICAgICAgICAgICAnInJlcGVhdGVkVWludDY0VmFsdWUiOiBbIjkwMDcxOTkyNTQ3NDA5OTIiLCAiOTAwNzE5OTI1NDc0MDk5MSJdLCcKKyAgICAgICAgICAgICcicmVwZWF0ZWRGbG9hdFZhbHVlIjogWzBdLCcKKyAgICAgICAgICAgICcicmVwZWF0ZWREb3VibGVWYWx1ZSI6IFsxZS0xNSwgIkluZmluaXR5Il0sJworICAgICAgICAgICAgJyJyZXBlYXRlZEJvb2xWYWx1ZSI6IFt0cnVlLCBmYWxzZV0sJworICAgICAgICAgICAgJyJyZXBlYXRlZFN0cmluZ1ZhbHVlIjogWyJGZXcgc3ltYm9scyEjJCw7IiwgImJhciJdLCcKKyAgICAgICAgICAgICcicmVwZWF0ZWRCeXRlc1ZhbHVlIjogWyJabTl2IiwgIlltRnkiXSwnCisgICAgICAgICAgICAnInJlcGVhdGVkTWVzc2FnZVZhbHVlIjogW3sidmFsdWUiOiAxMH0sIHsidmFsdWUiOiAxMX1dLCcKKyAgICAgICAgICAgICcicmVwZWF0ZWRFbnVtVmFsdWUiOiBbIkZPTyIsICJCQVIiXScKKyAgICAgICAgICAgICd9JykKKyAgICBzZWxmLkZpbGxBbGxGaWVsZHMobWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBqc29uLmxvYWRzKGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSkpLAorICAgICAgICBqc29uLmxvYWRzKHRleHQpKQorICAgIHBhcnNlZF9tZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCisgICAganNvbl9mb3JtYXQuUGFyc2UodGV4dCwgcGFyc2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKworICBkZWYgdGVzdFVua25vd25FbnVtVG9Kc29uQW5kQmFjayhzZWxmKToKKyAgICB0ZXh0ID0gJ3tcbiAgImVudW1WYWx1ZSI6IDk5OVxufScKKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCisgICAgbWVzc2FnZS5lbnVtX3ZhbHVlID0gOTk5CisgICAgc2VsZi5hc3NlcnRFcXVhbChqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgdGV4dCkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE1lc3NhZ2UoKQorICAgIGpzb25fZm9ybWF0LlBhcnNlKHRleHQsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RFeHRlbnNpb25Ub0pzb25BbmRCYWNrKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAgZXh0MSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlX3NldF9leHRlbnNpb24KKyAgICBleHQyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQxXS5pID0gMjMKKyAgICBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0Ml0uc3RyID0gJ2ZvbycKKyAgICBtZXNzYWdlX3RleHQgPSBqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKAorICAgICAgICBtZXNzYWdlCisgICAgKQorICAgIHBhcnNlZF9tZXNzYWdlID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIoKQorICAgIGpzb25fZm9ybWF0LlBhcnNlKG1lc3NhZ2VfdGV4dCwgcGFyc2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKworICBkZWYgdGVzdEV4dGVuc2lvbkVycm9ycyhzZWxmKToKKyAgICBzZWxmLkNoZWNrRXJyb3IoJ3siW2V4dGVuc2lvbkZpZWxkXSI6IHt9fScsCisgICAgICAgICAgICAgICAgICAgICdNZXNzYWdlIHR5cGUgcHJvdG8zLlRlc3RNZXNzYWdlIGRvZXMgbm90IGhhdmUgZXh0ZW5zaW9ucycpCisKKyAgZGVmIHRlc3RFeHRlbnNpb25Ub0RpY3RBbmRCYWNrKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAgZXh0MSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlX3NldF9leHRlbnNpb24KKyAgICBleHQyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQxXS5pID0gMjMKKyAgICBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0Ml0uc3RyID0gJ2ZvbycKKyAgICBtZXNzYWdlX2RpY3QgPSBqc29uX2Zvcm1hdC5NZXNzYWdlVG9EaWN0KAorICAgICAgICBtZXNzYWdlCisgICAgKQorICAgIHBhcnNlZF9tZXNzYWdlID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIoKQorICAgIGpzb25fZm9ybWF0LlBhcnNlRGljdChtZXNzYWdlX2RpY3QsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RFeHRlbnNpb25Ub0RpY3RBbmRCYWNrV2l0aFNjYWxhcihzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBleHQxID0gdW5pdHRlc3RfcGIyLlRlc3ROZXN0ZWRFeHRlbnNpb24udGVzdAorICAgIG1lc3NhZ2UuRXh0ZW5zaW9uc1tleHQxXSA9ICdkYXRhJworICAgIG1lc3NhZ2VfZGljdCA9IGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0RpY3QoCisgICAgICAgIG1lc3NhZ2UKKyAgICApCisgICAgcGFyc2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIGpzb25fZm9ybWF0LlBhcnNlRGljdChtZXNzYWdlX2RpY3QsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RKc29uUGFyc2VEaWN0VG9BbnlEb2VzTm90QWx0ZXJJbnB1dChzZWxmKToKKyAgICBvcmlnX2RpY3QgPSB7CisgICAgICAgICdpbnQzMlZhbHVlJzogMjAsCisgICAgICAgICdAdHlwZSc6ICd0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvMy5UZXN0TWVzc2FnZScKKyAgICB9CisgICAgY29waWVkX2RpY3QgPSBqc29uLmxvYWRzKGpzb24uZHVtcHMob3JpZ19kaWN0KSkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IGFueV9wYjIuQW55KCkKKyAgICBqc29uX2Zvcm1hdC5QYXJzZURpY3QoY29waWVkX2RpY3QsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29waWVkX2RpY3QsIG9yaWdfZGljdCkKKworICBkZWYgdGVzdEV4dGVuc2lvblNlcmlhbGl6YXRpb25EaWN0TWF0Y2hlc1Byb3RvM1NwZWMoc2VsZik6CisgICAgIiIiU2VlIGdvL3Byb3RvMy1qc29uLXNwZWMgZm9yIHNwZWMuCisgICAgIiIiCisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyKCkKKyAgICBleHQxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIGV4dDIgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCisgICAgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDFdLmkgPSAyMworICAgIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQyXS5zdHIgPSAnZm9vJworICAgIG1lc3NhZ2VfZGljdCA9IGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0RpY3QoCisgICAgICAgIG1lc3NhZ2UKKyAgICApCisgICAgZ29sZGVuX2RpY3QgPSB7CisgICAgICAgICdtZXNzYWdlU2V0JzogeworICAgICAgICAgICAgJ1twcm90b2J1Zl91bml0dGVzdC4nCisgICAgICAgICAgICAnVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbl0nOiB7CisgICAgICAgICAgICAgICAgJ2knOiAyMywKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAnW3Byb3RvYnVmX3VuaXR0ZXN0LicKKyAgICAgICAgICAgICdUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIubWVzc2FnZV9zZXRfZXh0ZW5zaW9uXSc6IHsKKyAgICAgICAgICAgICAgICAnc3RyJzogdSdmb28nLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICB9CisgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fZGljdCwgbWVzc2FnZV9kaWN0KQorICAgIHBhcnNlZF9tc2cgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAganNvbl9mb3JtYXQuUGFyc2VEaWN0KGdvbGRlbl9kaWN0LCBwYXJzZWRfbXNnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21zZykKKworICBkZWYgdGVzdEV4dGVuc2lvblNlcmlhbGl6YXRpb25EaWN0TWF0Y2hlc1Byb3RvM1NwZWNNb3JlKHNlbGYpOgorICAgICIiIlNlZSBnby9wcm90bzMtanNvbi1zcGVjIGZvciBzcGVjLgorICAgICIiIgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wYjIuVGVzdE1lc3NhZ2VXaXRoRXh0ZW5zaW9uKCkKKyAgICBleHQgPSBqc29uX2Zvcm1hdF9wYjIuVGVzdEV4dGVuc2lvbi5leHQKKyAgICBtZXNzYWdlLkV4dGVuc2lvbnNbZXh0XS52YWx1ZSA9ICdzdHVmZicKKyAgICBtZXNzYWdlX2RpY3QgPSBqc29uX2Zvcm1hdC5NZXNzYWdlVG9EaWN0KAorICAgICAgICBtZXNzYWdlCisgICAgKQorICAgIGV4cGVjdGVkX2RpY3QgPSB7CisgICAgICAgICdbcHJvdG9idWZfdW5pdHRlc3QuVGVzdEV4dGVuc2lvbi5leHRdJzogeworICAgICAgICAgICAgJ3ZhbHVlJzogdSdzdHVmZicsCisgICAgICAgIH0sCisgICAgfQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfZGljdCwgbWVzc2FnZV9kaWN0KQorCisgIGRlZiB0ZXN0RXh0ZW5zaW9uU2VyaWFsaXphdGlvbkpzb25NYXRjaGVzUHJvdG8zU3BlYyhzZWxmKToKKyAgICAiIiJTZWUgZ28vcHJvdG8zLWpzb24tc3BlYyBmb3Igc3BlYy4KKyAgICAiIiIKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIoKQorICAgIGV4dDEgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCisgICAgZXh0MiA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5tZXNzYWdlX3NldF9leHRlbnNpb24KKyAgICBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0MV0uaSA9IDIzCisgICAgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDJdLnN0ciA9ICdmb28nCisgICAgbWVzc2FnZV90ZXh0ID0ganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbigKKyAgICAgICAgbWVzc2FnZQorICAgICkKKyAgICBleHQxX3RleHQgPSAoJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS4nCisgICAgICAgICAgICAgICAgICdtZXNzYWdlX3NldF9leHRlbnNpb24nKQorICAgIGV4dDJfdGV4dCA9ICgncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLicKKyAgICAgICAgICAgICAgICAgJ21lc3NhZ2Vfc2V0X2V4dGVuc2lvbicpCisgICAgZ29sZGVuX3RleHQgPSAoJ3sibWVzc2FnZVNldCI6IHsnCisgICAgICAgICAgICAgICAgICAgJyAgICAiWyVzXSI6IHsnCisgICAgICAgICAgICAgICAgICAgJyAgICAgICAgImkiOiAyMycKKyAgICAgICAgICAgICAgICAgICAnICAgIH0sJworICAgICAgICAgICAgICAgICAgICcgICAgIlslc10iOiB7JworICAgICAgICAgICAgICAgICAgICcgICAgICAgICJzdHIiOiAiZm9vIicKKyAgICAgICAgICAgICAgICAgICAnICAgIH0nCisgICAgICAgICAgICAgICAgICAgJ319JykgJSAoZXh0MV90ZXh0LCBleHQyX3RleHQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChqc29uLmxvYWRzKGdvbGRlbl90ZXh0KSwganNvbi5sb2FkcyhtZXNzYWdlX3RleHQpKQorCisgIGRlZiB0ZXN0SnNvbkVzY2FwZVN0cmluZyhzZWxmKToKKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCisgICAgbWVzc2FnZS5zdHJpbmdfdmFsdWUgPSAnJlxuPFwiXHI+XGJcdFxmXFxcMDAxLycKKyAgICBtZXNzYWdlLnN0cmluZ192YWx1ZSArPSAoYidceGUyXHg4MFx4YThceGUyXHg4MFx4YTknKS5kZWNvZGUoJ3V0Zi04JykKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UpLAorICAgICAgICAne1xuICAic3RyaW5nVmFsdWUiOiAnCisgICAgICAgICciJlxcbjxcXFwiXFxyPlxcYlxcdFxcZlxcXFxcXHUwMDAxL1xcdTIwMjhcXHUyMDI5IlxufScpCisgICAgcGFyc2VkX21lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKCkKKyAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorICAgIHRleHQgPSB1J3siaW50MzJWYWx1ZSI6ICJcdTAwMzEifScKKyAgICBqc29uX2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5pbnQzMl92YWx1ZSwgMSkKKworICBkZWYgdGVzdEFsd2F5c1NlcmlsaWF6ZShzZWxmKToKKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgKKyAgICAgICAgc3RyaW5nX3ZhbHVlPSdmb28nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSksCisgICAgICAgIGpzb24ubG9hZHMoJ3snCisgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZFN0cmluZ1ZhbHVlIjogW10sJworICAgICAgICAgICAgICAgICAgICcic3RyaW5nVmFsdWUiOiAiZm9vIiwnCisgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZEJvb2xWYWx1ZSI6IFtdLCcKKyAgICAgICAgICAgICAgICAgICAnInJlcGVhdGVkVWludDMyVmFsdWUiOiBbXSwnCisgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZEludDMyVmFsdWUiOiBbXSwnCisgICAgICAgICAgICAgICAgICAgJyJlbnVtVmFsdWUiOiAiRk9PIiwnCisgICAgICAgICAgICAgICAgICAgJyJpbnQzMlZhbHVlIjogMCwnCisgICAgICAgICAgICAgICAgICAgJyJmbG9hdFZhbHVlIjogMCwnCisgICAgICAgICAgICAgICAgICAgJyJpbnQ2NFZhbHVlIjogIjAiLCcKKyAgICAgICAgICAgICAgICAgICAnInVpbnQzMlZhbHVlIjogMCwnCisgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZEJ5dGVzVmFsdWUiOiBbXSwnCisgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZFVpbnQ2NFZhbHVlIjogW10sJworICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWREb3VibGVWYWx1ZSI6IFtdLCcKKyAgICAgICAgICAgICAgICAgICAnImJ5dGVzVmFsdWUiOiAiIiwnCisgICAgICAgICAgICAgICAgICAgJyJib29sVmFsdWUiOiBmYWxzZSwnCisgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZEVudW1WYWx1ZSI6IFtdLCcKKyAgICAgICAgICAgICAgICAgICAnInVpbnQ2NFZhbHVlIjogIjAiLCcKKyAgICAgICAgICAgICAgICAgICAnImRvdWJsZVZhbHVlIjogMCwnCisgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZEZsb2F0VmFsdWUiOiBbXSwnCisgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZEludDY0VmFsdWUiOiBbXSwnCisgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZE1lc3NhZ2VWYWx1ZSI6IFtdfScpKQorICAgIHBhcnNlZF9tZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCisgICAgc2VsZi5DaGVja1BhcnNlQmFjayhtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKworICBkZWYgdGVzdFByb3RvM09wdGlvbmFsKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB0ZXN0X3Byb3RvM19vcHRpb25hbF9wYjIuVGVzdFByb3RvM09wdGlvbmFsKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBqc29uLmxvYWRzKAorICAgICAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbigKKyAgICAgICAgICAgICAgICBtZXNzYWdlLCBpbmNsdWRpbmdfZGVmYXVsdF92YWx1ZV9maWVsZHM9VHJ1ZSkpLAorICAgICAgICBqc29uLmxvYWRzKCd7fScpKQorICAgIG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIgPSAwCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbi5sb2FkcygKKyAgICAgICAgICAgIGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24oCisgICAgICAgICAgICAgICAgbWVzc2FnZSwgaW5jbHVkaW5nX2RlZmF1bHRfdmFsdWVfZmllbGRzPVRydWUpKSwKKyAgICAgICAganNvbi5sb2FkcygneyJvcHRpb25hbEludDMyIjogMH0nKSkKKworICBkZWYgdGVzdEludGVnZXJzUmVwcmVzZW50ZWRBc0Zsb2F0KHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKCkKKyAgICBqc29uX2Zvcm1hdC5QYXJzZSgneyJpbnQzMlZhbHVlIjogLTIuMTQ3NDgzNjQ4ZTl9JywgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UuaW50MzJfdmFsdWUsIC0yMTQ3NDgzNjQ4KQorICAgIGpzb25fZm9ybWF0LlBhcnNlKCd7ImludDMyVmFsdWUiOiAxZTV9JywgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UuaW50MzJfdmFsdWUsIDEwMDAwMCkKKyAgICBqc29uX2Zvcm1hdC5QYXJzZSgneyJpbnQzMlZhbHVlIjogMS4wfScsIG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLmludDMyX3ZhbHVlLCAxKQorCisgIGRlZiB0ZXN0TWFwRmllbGRzKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3ROZXN0ZWRNYXAoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSksCisgICAgICAgIGpzb24ubG9hZHMoJ3snCisgICAgICAgICAgICAgICAgICAgJyJib29sTWFwIjoge30sJworICAgICAgICAgICAgICAgICAgICciaW50MzJNYXAiOiB7fSwnCisgICAgICAgICAgICAgICAgICAgJyJpbnQ2NE1hcCI6IHt9LCcKKyAgICAgICAgICAgICAgICAgICAnInVpbnQzMk1hcCI6IHt9LCcKKyAgICAgICAgICAgICAgICAgICAnInVpbnQ2NE1hcCI6IHt9LCcKKyAgICAgICAgICAgICAgICAgICAnInN0cmluZ01hcCI6IHt9LCcKKyAgICAgICAgICAgICAgICAgICAnIm1hcE1hcCI6IHt9JworICAgICAgICAgICAgICAgICAgICd9JykpCisgICAgbWVzc2FnZS5ib29sX21hcFtUcnVlXSA9IDEKKyAgICBtZXNzYWdlLmJvb2xfbWFwW0ZhbHNlXSA9IDIKKyAgICBtZXNzYWdlLmludDMyX21hcFsxXSA9IDIKKyAgICBtZXNzYWdlLmludDMyX21hcFsyXSA9IDMKKyAgICBtZXNzYWdlLmludDY0X21hcFsxXSA9IDIKKyAgICBtZXNzYWdlLmludDY0X21hcFsyXSA9IDMKKyAgICBtZXNzYWdlLnVpbnQzMl9tYXBbMV0gPSAyCisgICAgbWVzc2FnZS51aW50MzJfbWFwWzJdID0gMworICAgIG1lc3NhZ2UudWludDY0X21hcFsxXSA9IDIKKyAgICBtZXNzYWdlLnVpbnQ2NF9tYXBbMl0gPSAzCisgICAgbWVzc2FnZS5zdHJpbmdfbWFwWycxJ10gPSAyCisgICAgbWVzc2FnZS5zdHJpbmdfbWFwWydudWxsJ10gPSAzCisgICAgbWVzc2FnZS5tYXBfbWFwWycxJ10uYm9vbF9tYXBbVHJ1ZV0gPSAzCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbi5sb2Fkcyhqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UsIEZhbHNlKSksCisgICAgICAgIGpzb24ubG9hZHMoJ3snCisgICAgICAgICAgICAgICAgICAgJyJib29sTWFwIjogeyJmYWxzZSI6IDIsICJ0cnVlIjogMX0sJworICAgICAgICAgICAgICAgICAgICciaW50MzJNYXAiOiB7IjEiOiAyLCAiMiI6IDN9LCcKKyAgICAgICAgICAgICAgICAgICAnImludDY0TWFwIjogeyIxIjogMiwgIjIiOiAzfSwnCisgICAgICAgICAgICAgICAgICAgJyJ1aW50MzJNYXAiOiB7IjEiOiAyLCAiMiI6IDN9LCcKKyAgICAgICAgICAgICAgICAgICAnInVpbnQ2NE1hcCI6IHsiMSI6IDIsICIyIjogM30sJworICAgICAgICAgICAgICAgICAgICcic3RyaW5nTWFwIjogeyIxIjogMiwgIm51bGwiOiAzfSwnCisgICAgICAgICAgICAgICAgICAgJyJtYXBNYXAiOiB7IjEiOiB7ImJvb2xNYXAiOiB7InRydWUiOiAzfX19JworICAgICAgICAgICAgICAgICAgICd9JykpCisgICAgcGFyc2VkX21lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3ROZXN0ZWRNYXAoKQorICAgIHNlbGYuQ2hlY2tQYXJzZUJhY2sobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RPbmVvZkZpZWxkcyhzZWxmKToKKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0T25lb2YoKQorICAgICMgQWx3YXlzIHByaW50IGRvZXMgbm90IGFmZmVjdCBvbmVvZiBmaWVsZHMuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSwKKyAgICAgICAgJ3t9JykKKyAgICBtZXNzYWdlLm9uZW9mX2ludDMyX3ZhbHVlID0gMAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSwgVHJ1ZSksCisgICAgICAgICd7XG4nCisgICAgICAgICcgICJvbmVvZkludDMyVmFsdWUiOiAwXG4nCisgICAgICAgICd9JykKKyAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE9uZW9mKCkKKyAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgIGRlZiB0ZXN0U3Vycm9nYXRlcyhzZWxmKToKKyAgICAjIFRlc3QgY29ycmVjdCBzdXJyb2dhdGUgaGFuZGxpbmcuCisgICAgbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE1lc3NhZ2UoKQorICAgIGpzb25fZm9ybWF0LlBhcnNlKCd7InN0cmluZ1ZhbHVlIjogIlxcdUQ4M0RcXHVERTAxIn0nLCBtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5zdHJpbmdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBiJ1x4RjBceDlGXHg5OFx4ODEnLmRlY29kZSgndXRmLTgnLCAnc3RyaWN0JykpCisKKyAgICAjIEVycm9yIGNhc2U6IHVucGFpcmVkIGhpZ2ggc3Vycm9nYXRlLgorICAgIHNlbGYuQ2hlY2tFcnJvcigKKyAgICAgICAgJ3sic3RyaW5nVmFsdWUiOiAiXFx1RDgzRCJ9JywKKyAgICAgICAgcidJbnZhbGlkIFxcdVhYWFggZXNjYXBlfFVucGFpcmVkLipzdXJyb2dhdGUnKQorCisgICAgIyBVbnBhaXJlZCBsb3cgc3Vycm9nYXRlLgorICAgIHNlbGYuQ2hlY2tFcnJvcigKKyAgICAgICAgJ3sic3RyaW5nVmFsdWUiOiAiXFx1REUwMSJ9JywKKyAgICAgICAgcidJbnZhbGlkIFxcdVhYWFggZXNjYXBlfFVucGFpcmVkLipzdXJyb2dhdGUnKQorCisgIGRlZiB0ZXN0VGltZXN0YW1wTWVzc2FnZShzZWxmKToKKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0VGltZXN0YW1wKCkKKyAgICBtZXNzYWdlLnZhbHVlLnNlY29uZHMgPSAwCisgICAgbWVzc2FnZS52YWx1ZS5uYW5vcyA9IDAKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlLmFkZCgpLnNlY29uZHMgPSAyMAorICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWVbMF0ubmFub3MgPSAxCisgICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZS5hZGQoKS5zZWNvbmRzID0gMAorICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWVbMV0ubmFub3MgPSAxMDAwMAorICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkuc2Vjb25kcyA9IDEwMDAwMDAwMAorICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWVbMl0ubmFub3MgPSAwCisgICAgIyBNYXhpbXVtIHRpbWUKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlLmFkZCgpLnNlY29uZHMgPSAyNTM0MDIzMDA3OTkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlWzNdLm5hbm9zID0gOTk5OTk5OTk5CisgICAgIyBNaW5pbXVtIHRpbWUKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlLmFkZCgpLnNlY29uZHMgPSAtNjIxMzU1OTY4MDAKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlWzRdLm5hbm9zID0gMAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSksCisgICAgICAgIGpzb24ubG9hZHMoJ3snCisgICAgICAgICAgICAgICAgICAgJyJ2YWx1ZSI6ICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsJworICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRWYWx1ZSI6IFsnCisgICAgICAgICAgICAgICAgICAgJyAgIjE5NzAtMDEtMDFUMDA6MDA6MjAuMDAwMDAwMDAxWiIsJworICAgICAgICAgICAgICAgICAgICcgICIxOTcwLTAxLTAxVDAwOjAwOjAwLjAwMDAxMFoiLCcKKyAgICAgICAgICAgICAgICAgICAnICAiMTk3My0wMy0wM1QwOTo0Njo0MFoiLCcKKyAgICAgICAgICAgICAgICAgICAnICAiOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5OTlaIiwnCisgICAgICAgICAgICAgICAgICAgJyAgIjAwMDEtMDEtMDFUMDA6MDA6MDBaIicKKyAgICAgICAgICAgICAgICAgICAnXScKKyAgICAgICAgICAgICAgICAgICAnfScpKQorICAgIHBhcnNlZF9tZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0VGltZXN0YW1wKCkKKyAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorICAgIHRleHQgPSAocid7InZhbHVlIjogIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDErMDg6MDAiLCcKKyAgICAgICAgICAgIHInInJlcGVhdGVkVmFsdWUiOlsnCisgICAgICAgICAgICByJyAgIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDErMDg6MzAiLCcKKyAgICAgICAgICAgIHInICAiMTk3MC0wMS0wMVQwMDowMDowMC4wMS0wMToyMyJdfScpCisgICAganNvbl9mb3JtYXQuUGFyc2UodGV4dCwgcGFyc2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWRfbWVzc2FnZS52YWx1ZS5zZWNvbmRzLCAtOCAqIDM2MDApCisgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWRfbWVzc2FnZS52YWx1ZS5uYW5vcywgMTAwMDAwMDApCisgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWRfbWVzc2FnZS5yZXBlYXRlZF92YWx1ZVswXS5zZWNvbmRzLCAtOC41ICogMzYwMCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZF9tZXNzYWdlLnJlcGVhdGVkX3ZhbHVlWzFdLnNlY29uZHMsIDM2MDAgKyAyMyAqIDYwKQorCisgIGRlZiB0ZXN0RHVyYXRpb25NZXNzYWdlKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3REdXJhdGlvbigpCisgICAgbWVzc2FnZS52YWx1ZS5zZWNvbmRzID0gMQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkuc2Vjb25kcyA9IDAKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlWzBdLm5hbm9zID0gMTAKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlLmFkZCgpLnNlY29uZHMgPSAtMQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWVbMV0ubmFub3MgPSAtMTAwMAorICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkuc2Vjb25kcyA9IDEwCisgICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZVsyXS5uYW5vcyA9IDExMDAwMDAwCisgICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZS5hZGQoKS5zZWNvbmRzID0gLTMxNTU3NjAwMDAwMAorICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkuc2Vjb25kcyA9IDMxNTU3NjAwMDAwMAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSksCisgICAgICAgIGpzb24ubG9hZHMoJ3snCisgICAgICAgICAgICAgICAgICAgJyJ2YWx1ZSI6ICIxcyIsJworICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRWYWx1ZSI6IFsnCisgICAgICAgICAgICAgICAgICAgJyAgIjAuMDAwMDAwMDEwcyIsJworICAgICAgICAgICAgICAgICAgICcgICItMS4wMDAwMDFzIiwnCisgICAgICAgICAgICAgICAgICAgJyAgIjEwLjAxMXMiLCcKKyAgICAgICAgICAgICAgICAgICAnICAiLTMxNTU3NjAwMDAwMHMiLCcKKyAgICAgICAgICAgICAgICAgICAnICAiMzE1NTc2MDAwMDAwcyInCisgICAgICAgICAgICAgICAgICAgJ10nCisgICAgICAgICAgICAgICAgICAgJ30nKSkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdER1cmF0aW9uKCkKKyAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgIGRlZiB0ZXN0RmllbGRNYXNrTWVzc2FnZShzZWxmKToKKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0RmllbGRNYXNrKCkKKyAgICBtZXNzYWdlLnZhbHVlLnBhdGhzLmFwcGVuZCgnZm9vLmJhcicpCisgICAgbWVzc2FnZS52YWx1ZS5wYXRocy5hcHBlbmQoJ2JhcicpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSwKKyAgICAgICAgJ3tcbicKKyAgICAgICAgJyAgInZhbHVlIjogImZvby5iYXIsYmFyIlxuJworICAgICAgICAnfScpCisgICAgcGFyc2VkX21lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RGaWVsZE1hc2soKQorICAgIHNlbGYuQ2hlY2tQYXJzZUJhY2sobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisKKyAgICBtZXNzYWdlLnZhbHVlLkNsZWFyKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UsIFRydWUpLAorICAgICAgICAne1xuJworICAgICAgICAnICAidmFsdWUiOiAiIlxuJworICAgICAgICAnfScpCisgICAgc2VsZi5DaGVja1BhcnNlQmFjayhtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKworICBkZWYgdGVzdFdyYXBwZXJNZXNzYWdlKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RXcmFwcGVyKCkKKyAgICBtZXNzYWdlLmJvb2xfdmFsdWUudmFsdWUgPSBGYWxzZQorICAgIG1lc3NhZ2UuaW50MzJfdmFsdWUudmFsdWUgPSAwCisgICAgbWVzc2FnZS5zdHJpbmdfdmFsdWUudmFsdWUgPSAnJworICAgIG1lc3NhZ2UuYnl0ZXNfdmFsdWUudmFsdWUgPSBiJycKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfdmFsdWUuYWRkKCkudmFsdWUgPSBUcnVlCisgICAgbWVzc2FnZS5yZXBlYXRlZF9ib29sX3ZhbHVlLmFkZCgpLnZhbHVlID0gRmFsc2UKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3ZhbHVlLmFkZCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbi5sb2Fkcyhqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UsIFRydWUpKSwKKyAgICAgICAganNvbi5sb2Fkcygne1xuJworICAgICAgICAgICAgICAgICAgICcgICJpbnQzMlZhbHVlIjogMCwnCisgICAgICAgICAgICAgICAgICAgJyAgImJvb2xWYWx1ZSI6IGZhbHNlLCcKKyAgICAgICAgICAgICAgICAgICAnICAic3RyaW5nVmFsdWUiOiAiIiwnCisgICAgICAgICAgICAgICAgICAgJyAgImJ5dGVzVmFsdWUiOiAiIiwnCisgICAgICAgICAgICAgICAgICAgJyAgInJlcGVhdGVkQm9vbFZhbHVlIjogW3RydWUsIGZhbHNlXSwnCisgICAgICAgICAgICAgICAgICAgJyAgInJlcGVhdGVkSW50MzJWYWx1ZSI6IFswXSwnCisgICAgICAgICAgICAgICAgICAgJyAgInJlcGVhdGVkVWludDMyVmFsdWUiOiBbXSwnCisgICAgICAgICAgICAgICAgICAgJyAgInJlcGVhdGVkRmxvYXRWYWx1ZSI6IFtdLCcKKyAgICAgICAgICAgICAgICAgICAnICAicmVwZWF0ZWREb3VibGVWYWx1ZSI6IFtdLCcKKyAgICAgICAgICAgICAgICAgICAnICAicmVwZWF0ZWRCeXRlc1ZhbHVlIjogW10sJworICAgICAgICAgICAgICAgICAgICcgICJyZXBlYXRlZEludDY0VmFsdWUiOiBbXSwnCisgICAgICAgICAgICAgICAgICAgJyAgInJlcGVhdGVkVWludDY0VmFsdWUiOiBbXSwnCisgICAgICAgICAgICAgICAgICAgJyAgInJlcGVhdGVkU3RyaW5nVmFsdWUiOiBbXScKKyAgICAgICAgICAgICAgICAgICAnfScpKQorICAgIHBhcnNlZF9tZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0V3JhcHBlcigpCisgICAgc2VsZi5DaGVja1BhcnNlQmFjayhtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKworICBkZWYgdGVzdFN0cnVjdE1lc3NhZ2Uoc2VsZik6CisgICAgbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdFN0cnVjdCgpCisgICAgbWVzc2FnZS52YWx1ZVsnbmFtZSddID0gJ0ppbScKKyAgICBtZXNzYWdlLnZhbHVlWydhZ2UnXSA9IDEwCisgICAgbWVzc2FnZS52YWx1ZVsnYXR0ZW5kJ10gPSBUcnVlCisgICAgbWVzc2FnZS52YWx1ZVsnZW1haWwnXSA9IE5vbmUKKyAgICBtZXNzYWdlLnZhbHVlLmdldF9vcl9jcmVhdGVfc3RydWN0KCdhZGRyZXNzJylbJ2NpdHknXSA9ICdTRk8nCisgICAgbWVzc2FnZS52YWx1ZVsnYWRkcmVzcyddWydob3VzZV9udW1iZXInXSA9IDEwMjQKKyAgICBtZXNzYWdlLnZhbHVlLmdldF9vcl9jcmVhdGVfc3RydWN0KCdlbXB0eV9zdHJ1Y3QnKQorICAgIG1lc3NhZ2UudmFsdWUuZ2V0X29yX2NyZWF0ZV9saXN0KCdlbXB0eV9saXN0JykKKyAgICBzdHJ1Y3RfbGlzdCA9IG1lc3NhZ2UudmFsdWUuZ2V0X29yX2NyZWF0ZV9saXN0KCdsaXN0JykKKyAgICBzdHJ1Y3RfbGlzdC5leHRlbmQoWzYsICdzZXZlbicsIFRydWUsIEZhbHNlLCBOb25lXSkKKyAgICBzdHJ1Y3RfbGlzdC5hZGRfc3RydWN0KClbJ3N1YmtleTInXSA9IDkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlLmFkZCgpWydhZ2UnXSA9IDExCisgICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZS5hZGQoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBGYWxzZSkpLAorICAgICAgICBqc29uLmxvYWRzKAorICAgICAgICAgICAgJ3snCisgICAgICAgICAgICAnICAidmFsdWUiOiB7JworICAgICAgICAgICAgJyAgICAiYWRkcmVzcyI6IHsnCisgICAgICAgICAgICAnICAgICAgImNpdHkiOiAiU0ZPIiwgJworICAgICAgICAgICAgJyAgICAgICJob3VzZV9udW1iZXIiOiAxMDI0JworICAgICAgICAgICAgJyAgICB9LCAnCisgICAgICAgICAgICAnICAgICJlbXB0eV9zdHJ1Y3QiOiB7fSwgJworICAgICAgICAgICAgJyAgICAiZW1wdHlfbGlzdCI6IFtdLCAnCisgICAgICAgICAgICAnICAgICJhZ2UiOiAxMCwgJworICAgICAgICAgICAgJyAgICAibmFtZSI6ICJKaW0iLCAnCisgICAgICAgICAgICAnICAgICJhdHRlbmQiOiB0cnVlLCAnCisgICAgICAgICAgICAnICAgICJlbWFpbCI6IG51bGwsICcKKyAgICAgICAgICAgICcgICAgImxpc3QiOiBbNiwgInNldmVuIiwgdHJ1ZSwgZmFsc2UsIG51bGwsIHsic3Via2V5MiI6IDl9XScKKyAgICAgICAgICAgICcgIH0sJworICAgICAgICAgICAgJyAgInJlcGVhdGVkVmFsdWUiOiBbeyJhZ2UiOiAxMX0sIHt9XScKKyAgICAgICAgICAgICd9JykpCisgICAgcGFyc2VkX21lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RTdHJ1Y3QoKQorICAgIHNlbGYuQ2hlY2tQYXJzZUJhY2sobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisgICAgIyBjaGVjayBmb3IgcmVncmVzc2lvbjsgdGhpcyB1c2VkIHRvIHJhaXNlCisgICAgcGFyc2VkX21lc3NhZ2UudmFsdWVbJ2VtcHR5X3N0cnVjdCddCisgICAgcGFyc2VkX21lc3NhZ2UudmFsdWVbJ2VtcHR5X2xpc3QnXQorCisgIGRlZiB0ZXN0VmFsdWVNZXNzYWdlKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RWYWx1ZSgpCisgICAgbWVzc2FnZS52YWx1ZS5zdHJpbmdfdmFsdWUgPSAnaGVsbG8nCisgICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZS5hZGQoKS5udW1iZXJfdmFsdWUgPSAxMS4xCisgICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZS5hZGQoKS5ib29sX3ZhbHVlID0gRmFsc2UKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlLmFkZCgpLm51bGxfdmFsdWUgPSAwCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbi5sb2Fkcyhqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UsIEZhbHNlKSksCisgICAgICAgIGpzb24ubG9hZHMoCisgICAgICAgICAgICAneycKKyAgICAgICAgICAgICcgICJ2YWx1ZSI6ICJoZWxsbyIsJworICAgICAgICAgICAgJyAgInJlcGVhdGVkVmFsdWUiOiBbMTEuMSwgZmFsc2UsIG51bGxdJworICAgICAgICAgICAgJ30nKSkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdFZhbHVlKCkKKyAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorICAgICMgQ2FuJ3QgcGFyc2UgYmFjayBpZiB0aGUgVmFsdWUgbWVzc2FnZSBpcyBub3Qgc2V0LgorICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBqc29uLmxvYWRzKGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSwgRmFsc2UpKSwKKyAgICAgICAganNvbi5sb2FkcygKKyAgICAgICAgICAgICd7JworICAgICAgICAgICAgJyAgInZhbHVlIjogImhlbGxvIiwnCisgICAgICAgICAgICAnICAicmVwZWF0ZWRWYWx1ZSI6IFsxMS4xLCBmYWxzZSwgbnVsbCwgbnVsbF0nCisgICAgICAgICAgICAnfScpKQorICAgIG1lc3NhZ2UuQ2xlYXIoKQorICAgIGpzb25fZm9ybWF0LlBhcnNlKCd7InZhbHVlIjogbnVsbH0nLCBtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS52YWx1ZS5XaGljaE9uZW9mKCdraW5kJyksICdudWxsX3ZhbHVlJykKKworICBkZWYgdGVzdExpc3RWYWx1ZU1lc3NhZ2Uoc2VsZik6CisgICAgbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdExpc3RWYWx1ZSgpCisgICAgbWVzc2FnZS52YWx1ZS52YWx1ZXMuYWRkKCkubnVtYmVyX3ZhbHVlID0gMTEuMQorICAgIG1lc3NhZ2UudmFsdWUudmFsdWVzLmFkZCgpLm51bGxfdmFsdWUgPSAwCisgICAgbWVzc2FnZS52YWx1ZS52YWx1ZXMuYWRkKCkuYm9vbF92YWx1ZSA9IFRydWUKKyAgICBtZXNzYWdlLnZhbHVlLnZhbHVlcy5hZGQoKS5zdHJpbmdfdmFsdWUgPSAnaGVsbG8nCisgICAgbWVzc2FnZS52YWx1ZS52YWx1ZXMuYWRkKCkuc3RydWN0X3ZhbHVlWyduYW1lJ10gPSAnSmltJworICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkudmFsdWVzLmFkZCgpLm51bWJlcl92YWx1ZSA9IDEKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlLmFkZCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbi5sb2Fkcyhqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UsIEZhbHNlKSksCisgICAgICAgIGpzb24ubG9hZHMoCisgICAgICAgICAgICAneyJ2YWx1ZSI6IFsxMS4xLCBudWxsLCB0cnVlLCAiaGVsbG8iLCB7Im5hbWUiOiAiSmltIn1dXG4sJworICAgICAgICAgICAgJyJyZXBlYXRlZFZhbHVlIjogW1sxXSwgW11dfScpKQorICAgIHBhcnNlZF9tZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TGlzdFZhbHVlKCkKKyAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgIGRlZiB0ZXN0TnVsbFZhbHVlKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RPbmVvZigpCisgICAgbWVzc2FnZS5vbmVvZl9udWxsX3ZhbHVlID0gMAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICd7XG4gICJvbmVvZk51bGxWYWx1ZSI6IG51bGxcbn0nKQorICAgIHBhcnNlZF9tZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0T25lb2YoKQorICAgIHNlbGYuQ2hlY2tQYXJzZUJhY2sobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisgICAgIyBDaGVjayBvbGQgZm9ybWF0IGlzIGFsc28gYWNjZXB0ZWQKKyAgICBuZXdfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE9uZW9mKCkKKyAgICBqc29uX2Zvcm1hdC5QYXJzZSgne1xuICAib25lb2ZOdWxsVmFsdWUiOiAiTlVMTF9WQUxVRSJcbn0nLAorICAgICAgICAgICAgICAgICAgICAgIG5ld19tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihuZXdfbWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAne1xuICAib25lb2ZOdWxsVmFsdWUiOiBudWxsXG59JykKKworICBkZWYgdGVzdEFueU1lc3NhZ2Uoc2VsZik6CisgICAgbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdEFueSgpCisgICAgdmFsdWUxID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5NZXNzYWdlVHlwZSgpCisgICAgdmFsdWUyID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5NZXNzYWdlVHlwZSgpCisgICAgdmFsdWUxLnZhbHVlID0gMTIzNAorICAgIHZhbHVlMi52YWx1ZSA9IDU2NzgKKyAgICBtZXNzYWdlLnZhbHVlLlBhY2sodmFsdWUxKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkuUGFjayh2YWx1ZTEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZS5hZGQoKS5QYWNrKHZhbHVlMikKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlLmFkZCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbi5sb2Fkcyhqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UsIFRydWUpKSwKKyAgICAgICAganNvbi5sb2FkcygKKyAgICAgICAgICAgICd7XG4nCisgICAgICAgICAgICAnICAicmVwZWF0ZWRWYWx1ZSI6IFsge1xuJworICAgICAgICAgICAgJyAgICAiQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9wcm90bzMuTWVzc2FnZVR5cGUiLFxuJworICAgICAgICAgICAgJyAgICAidmFsdWUiOiAxMjM0XG4nCisgICAgICAgICAgICAnICB9LCB7XG4nCisgICAgICAgICAgICAnICAgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvMy5NZXNzYWdlVHlwZSIsXG4nCisgICAgICAgICAgICAnICAgICJ2YWx1ZSI6IDU2NzhcbicKKyAgICAgICAgICAgICcgIH0sXG4nCisgICAgICAgICAgICAnICB7fV0sXG4nCisgICAgICAgICAgICAnICAidmFsdWUiOiB7XG4nCisgICAgICAgICAgICAnICAgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvMy5NZXNzYWdlVHlwZSIsXG4nCisgICAgICAgICAgICAnICAgICJ2YWx1ZSI6IDEyMzRcbicKKyAgICAgICAgICAgICcgIH1cbicKKyAgICAgICAgICAgICd9XG4nKSkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdEFueSgpCisgICAgc2VsZi5DaGVja1BhcnNlQmFjayhtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKyAgICAjIE11c3QgcHJpbnQgQHR5cGUgZmlyc3QKKyAgICB0ZXN0X21lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKAorICAgICAgICBib29sX3ZhbHVlPVRydWUsCisgICAgICAgIGludDMyX3ZhbHVlPTIwLAorICAgICAgICBpbnQ2NF92YWx1ZT0tMjAsCisgICAgICAgIHVpbnQzMl92YWx1ZT0yMCwKKyAgICAgICAgdWludDY0X3ZhbHVlPTIwLAorICAgICAgICBkb3VibGVfdmFsdWU9My4xNCwKKyAgICAgICAgc3RyaW5nX3ZhbHVlPSdmb28nKQorICAgIG1lc3NhZ2UuQ2xlYXIoKQorICAgIG1lc3NhZ2UudmFsdWUuUGFjayh0ZXN0X21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBGYWxzZSlbMDo2OF0sCisgICAgICAgICd7XG4nCisgICAgICAgICcgICJ2YWx1ZSI6IHtcbicKKyAgICAgICAgJyAgICAiQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9wcm90bzMuVGVzdE1lc3NhZ2UiJykKKworICBkZWYgdGVzdEFueU1lc3NhZ2VEZXNjcmlwdG9yUG9vbE1pc3NpbmdUeXBlKHNlbGYpOgorICAgIHBhY2tlZF9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLk9uZVN0cmluZygpCisgICAgcGFja2VkX21lc3NhZ2UuZGF0YSA9ICdzdHJpbmcnCisgICAgbWVzc2FnZSA9IGFueV90ZXN0X3BiMi5UZXN0QW55KCkKKyAgICBtZXNzYWdlLmFueV92YWx1ZS5QYWNrKHBhY2tlZF9tZXNzYWdlKQorICAgIGVtcHR5X3Bvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woKQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyBjbToKKyAgICAgIGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSwgVHJ1ZSwgZGVzY3JpcHRvcl9wb29sPWVtcHR5X3Bvb2wpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgJ0NhbiBub3QgZmluZCBtZXNzYWdlIGRlc2NyaXB0b3IgYnkgdHlwZV91cmw6JworICAgICAgICAnIHR5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9idWZfdW5pdHRlc3QuT25lU3RyaW5nJywgc3RyKGNtLmV4Y2VwdGlvbikpCisKKyAgZGVmIHRlc3RXZWxsS25vd25JbkFueU1lc3NhZ2Uoc2VsZik6CisgICAgbWVzc2FnZSA9IGFueV9wYjIuQW55KCkKKyAgICBpbnQzMl92YWx1ZSA9IHdyYXBwZXJzX3BiMi5JbnQzMlZhbHVlKCkKKyAgICBpbnQzMl92YWx1ZS52YWx1ZSA9IDEyMzQKKyAgICBtZXNzYWdlLlBhY2soaW50MzJfdmFsdWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbi5sb2Fkcyhqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UsIFRydWUpKSwKKyAgICAgICAganNvbi5sb2FkcygKKyAgICAgICAgICAgICd7XG4nCisgICAgICAgICAgICAnICAiQHR5cGUiOiBcInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVcIixcbicKKyAgICAgICAgICAgICcgICJ2YWx1ZSI6IDEyMzRcbicKKyAgICAgICAgICAgICd9XG4nKSkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IGFueV9wYjIuQW55KCkKKyAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgICAgdGltZXN0YW1wID0gdGltZXN0YW1wX3BiMi5UaW1lc3RhbXAoKQorICAgIG1lc3NhZ2UuUGFjayh0aW1lc3RhbXApCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbi5sb2Fkcyhqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UsIFRydWUpKSwKKyAgICAgICAganNvbi5sb2FkcygKKyAgICAgICAgICAgICd7XG4nCisgICAgICAgICAgICAnICAiQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIixcbicKKyAgICAgICAgICAgICcgICJ2YWx1ZSI6ICIxOTcwLTAxLTAxVDAwOjAwOjAwWiJcbicKKyAgICAgICAgICAgICd9XG4nKSkKKyAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgICAgZHVyYXRpb24gPSBkdXJhdGlvbl9wYjIuRHVyYXRpb24oKQorICAgIGR1cmF0aW9uLnNlY29uZHMgPSAxCisgICAgbWVzc2FnZS5QYWNrKGR1cmF0aW9uKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSksCisgICAgICAgIGpzb24ubG9hZHMoCisgICAgICAgICAgICAne1xuJworICAgICAgICAgICAgJyAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIixcbicKKyAgICAgICAgICAgICcgICJ2YWx1ZSI6ICIxcyJcbicKKyAgICAgICAgICAgICd9XG4nKSkKKyAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgICAgZmllbGRfbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCisgICAgZmllbGRfbWFzay5wYXRocy5hcHBlbmQoJ2Zvby5iYXInKQorICAgIGZpZWxkX21hc2sucGF0aHMuYXBwZW5kKCdiYXInKQorICAgIG1lc3NhZ2UuUGFjayhmaWVsZF9tYXNrKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSksCisgICAgICAgIGpzb24ubG9hZHMoCisgICAgICAgICAgICAne1xuJworICAgICAgICAgICAgJyAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayIsXG4nCisgICAgICAgICAgICAnICAidmFsdWUiOiAiZm9vLmJhcixiYXIiXG4nCisgICAgICAgICAgICAnfVxuJykpCisgICAgc2VsZi5DaGVja1BhcnNlQmFjayhtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKworICAgIHN0cnVjdF9tZXNzYWdlID0gc3RydWN0X3BiMi5TdHJ1Y3QoKQorICAgIHN0cnVjdF9tZXNzYWdlWyduYW1lJ10gPSAnSmltJworICAgIG1lc3NhZ2UuUGFjayhzdHJ1Y3RfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBqc29uLmxvYWRzKGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSwgVHJ1ZSkpLAorICAgICAgICBqc29uLmxvYWRzKAorICAgICAgICAgICAgJ3tcbicKKyAgICAgICAgICAgICcgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QiLFxuJworICAgICAgICAgICAgJyAgInZhbHVlIjogeyJuYW1lIjogIkppbSJ9XG4nCisgICAgICAgICAgICAnfVxuJykpCisgICAgc2VsZi5DaGVja1BhcnNlQmFjayhtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKworICAgIG5lc3RlZF9hbnkgPSBhbnlfcGIyLkFueSgpCisgICAgaW50MzJfdmFsdWUudmFsdWUgPSA1Njc4CisgICAgbmVzdGVkX2FueS5QYWNrKGludDMyX3ZhbHVlKQorICAgIG1lc3NhZ2UuUGFjayhuZXN0ZWRfYW55KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSksCisgICAgICAgIGpzb24ubG9hZHMoCisgICAgICAgICAgICAne1xuJworICAgICAgICAgICAgJyAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkFueSIsXG4nCisgICAgICAgICAgICAnICAidmFsdWUiOiB7XG4nCisgICAgICAgICAgICAnICAgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIixcbicKKyAgICAgICAgICAgICcgICAgInZhbHVlIjogNTY3OFxuJworICAgICAgICAgICAgJyAgfVxuJworICAgICAgICAgICAgJ31cbicpKQorICAgIHNlbGYuQ2hlY2tQYXJzZUJhY2sobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RQYXJzZU51bGwoc2VsZik6CisgICAgbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE1lc3NhZ2UoKQorICAgIHBhcnNlZF9tZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCisgICAgc2VsZi5GaWxsQWxsRmllbGRzKHBhcnNlZF9tZXNzYWdlKQorICAgIGpzb25fZm9ybWF0LlBhcnNlKCd7ImludDMyVmFsdWUiOiBudWxsLCAnCisgICAgICAgICAgICAgICAgICAgICAgJyJpbnQ2NFZhbHVlIjogbnVsbCwgJworICAgICAgICAgICAgICAgICAgICAgICcidWludDMyVmFsdWUiOiBudWxsLCcKKyAgICAgICAgICAgICAgICAgICAgICAnInVpbnQ2NFZhbHVlIjogbnVsbCwnCisgICAgICAgICAgICAgICAgICAgICAgJyJmbG9hdFZhbHVlIjogbnVsbCwnCisgICAgICAgICAgICAgICAgICAgICAgJyJkb3VibGVWYWx1ZSI6IG51bGwsJworICAgICAgICAgICAgICAgICAgICAgICciYm9vbFZhbHVlIjogbnVsbCwnCisgICAgICAgICAgICAgICAgICAgICAgJyJzdHJpbmdWYWx1ZSI6IG51bGwsJworICAgICAgICAgICAgICAgICAgICAgICciYnl0ZXNWYWx1ZSI6IG51bGwsJworICAgICAgICAgICAgICAgICAgICAgICcibWVzc2FnZVZhbHVlIjogbnVsbCwnCisgICAgICAgICAgICAgICAgICAgICAgJyJlbnVtVmFsdWUiOiBudWxsLCcKKyAgICAgICAgICAgICAgICAgICAgICAnInJlcGVhdGVkSW50MzJWYWx1ZSI6IG51bGwsJworICAgICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRJbnQ2NFZhbHVlIjogbnVsbCwnCisgICAgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZFVpbnQzMlZhbHVlIjogbnVsbCwnCisgICAgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZFVpbnQ2NFZhbHVlIjogbnVsbCwnCisgICAgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZEZsb2F0VmFsdWUiOiBudWxsLCcKKyAgICAgICAgICAgICAgICAgICAgICAnInJlcGVhdGVkRG91YmxlVmFsdWUiOiBudWxsLCcKKyAgICAgICAgICAgICAgICAgICAgICAnInJlcGVhdGVkQm9vbFZhbHVlIjogbnVsbCwnCisgICAgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZFN0cmluZ1ZhbHVlIjogbnVsbCwnCisgICAgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZEJ5dGVzVmFsdWUiOiBudWxsLCcKKyAgICAgICAgICAgICAgICAgICAgICAnInJlcGVhdGVkTWVzc2FnZVZhbHVlIjogbnVsbCwnCisgICAgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZEVudW1WYWx1ZSI6IG51bGwnCisgICAgICAgICAgICAgICAgICAgICAgJ30nLAorICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisgICAgIyBOdWxsIGFuZCB7fSBzaG91bGQgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IgZm9yIHN1YiBtZXNzYWdlLgorICAgIHNlbGYuYXNzZXJ0RmFsc2UocGFyc2VkX21lc3NhZ2UuSGFzRmllbGQoJ21lc3NhZ2VfdmFsdWUnKSkKKyAgICBqc29uX2Zvcm1hdC5QYXJzZSgneyJtZXNzYWdlVmFsdWUiOiB7fX0nLCBwYXJzZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydFRydWUocGFyc2VkX21lc3NhZ2UuSGFzRmllbGQoJ21lc3NhZ2VfdmFsdWUnKSkKKyAgICAjIE51bGwgaXMgbm90IGFsbG93ZWQgdG8gYmUgdXNlZCBhcyBhbiBlbGVtZW50IGluIHJlcGVhdGVkIGZpZWxkLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIGpzb25fZm9ybWF0LlBhcnNlRXJyb3IsIHInRmFpbGVkIHRvIHBhcnNlIHJlcGVhdGVkSW50MzJWYWx1ZSBmaWVsZDogJworICAgICAgICByJ251bGwgaXMgbm90IGFsbG93ZWQgdG8gYmUgdXNlZCBhcyBhbiBlbGVtZW50IGluIGEgcmVwZWF0ZWQgZmllbGQgJworICAgICAgICByJ2F0IFRlc3RNZXNzYWdlLnJlcGVhdGVkSW50MzJWYWx1ZVxbMVxdLicsIGpzb25fZm9ybWF0LlBhcnNlLAorICAgICAgICAneyJyZXBlYXRlZEludDMyVmFsdWUiOlsxLCBudWxsXX0nLCBwYXJzZWRfbWVzc2FnZSkKKyAgICBzZWxmLkNoZWNrRXJyb3IoCisgICAgICAgICd7InJlcGVhdGVkTWVzc2FnZVZhbHVlIjpbbnVsbF19JywKKyAgICAgICAgcidGYWlsZWQgdG8gcGFyc2UgcmVwZWF0ZWRNZXNzYWdlVmFsdWUgZmllbGQ6IG51bGwgaXMgbm90JworICAgICAgICByJyBhbGxvd2VkIHRvIGJlIHVzZWQgYXMgYW4gZWxlbWVudCBpbiBhIHJlcGVhdGVkIGZpZWxkICcKKyAgICAgICAgcidhdCBUZXN0TWVzc2FnZS5yZXBlYXRlZE1lc3NhZ2VWYWx1ZVxbMFxdLicpCisKKyAgZGVmIHRlc3ROYW5GbG9hdChzZWxmKToKKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCisgICAgbWVzc2FnZS5mbG9hdF92YWx1ZSA9IGZsb2F0KCduYW4nKQorICAgIHRleHQgPSAne1xuICAiZmxvYXRWYWx1ZSI6ICJOYU4iXG59JworICAgIHNlbGYuYXNzZXJ0RXF1YWwoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlKSwgdGV4dCkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE1lc3NhZ2UoKQorICAgIGpzb25fZm9ybWF0LlBhcnNlKHRleHQsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKHBhcnNlZF9tZXNzYWdlLmZsb2F0X3ZhbHVlKSkKKworICBkZWYgdGVzdFBhcnNlRG91YmxlVG9GbG9hdChzZWxmKToKKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCisgICAgdGV4dCA9ICgneyJyZXBlYXRlZERvdWJsZVZhbHVlIjogWzMuNDAyODIzNWUrMzksIDEuNDAyODIzNWUtMzldXG59JykKKyAgICBqc29uX2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9kb3VibGVfdmFsdWVbMF0sIDMuNDAyODIzNWUrMzkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV92YWx1ZVsxXSwgMS40MDI4MjM1ZS0zOSkKKyAgICB0ZXh0ID0gKCd7InJlcGVhdGVkRmxvYXRWYWx1ZSI6IFszLjQwMjgyMzVlKzM5LCAxLjQwMjgyMzVlLTM5XVxufScpCisgICAgc2VsZi5DaGVja0Vycm9yKAorICAgICAgICB0ZXh0LCByJ0ZhaWxlZCB0byBwYXJzZSByZXBlYXRlZEZsb2F0VmFsdWUgZmllbGQ6ICcKKyAgICAgICAgcidGbG9hdCB2YWx1ZSB0b28gbGFyZ2UgYXQgVGVzdE1lc3NhZ2UucmVwZWF0ZWRGbG9hdFZhbHVlXFswXF0uJykKKworICBkZWYgdGVzdEZsb2F0UHJlY2lzaW9uKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKCkKKyAgICBtZXNzYWdlLmZsb2F0X3ZhbHVlID0gMS4xMjM0NTY3ODkKKyAgICAjIFNldCB0byA4IHZhbGlkIGRpZ2l0cy4KKyAgICB0ZXh0ID0gJ3tcbiAgImZsb2F0VmFsdWUiOiAxLjEyMzQ1Njhcbn0nCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBmbG9hdF9wcmVjaXNpb249OCksIHRleHQpCisgICAgIyBTZXQgdG8gNyB2YWxpZCBkaWdpdHMuCisgICAgdGV4dCA9ICd7XG4gICJmbG9hdFZhbHVlIjogMS4xMjM0NTdcbn0nCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBmbG9hdF9wcmVjaXNpb249NyksIHRleHQpCisKKyAgICAjIERlZmF1bHQgZmxvYXRfcHJlY2lzaW9uIHdpbGwgYXV0b21hdGljIHByaW50IHNob3J0ZXN0IGZsb2F0LgorICAgIG1lc3NhZ2UuZmxvYXRfdmFsdWUgPSAxLjEwMDAwMDAwMTEKKyAgICB0ZXh0ID0gJ3tcbiAgImZsb2F0VmFsdWUiOiAxLjFcbn0nCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlKSwgdGV4dCkKKyAgICBtZXNzYWdlLmZsb2F0X3ZhbHVlID0gMS4wMDAwMDA3NWUtMzYKKyAgICB0ZXh0ID0gJ3tcbiAgImZsb2F0VmFsdWUiOiAxLjAwMDAwMDc1ZS0zNlxufScKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UpLCB0ZXh0KQorICAgIG1lc3NhZ2UuZmxvYXRfdmFsdWUgPSAxMjM0NTY3ODkxMjM0NWUrMTEKKyAgICB0ZXh0ID0gJ3tcbiAgImZsb2F0VmFsdWUiOiAxLjIzNDU2OGUrMjRcbn0nCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlKSwgdGV4dCkKKworICAgICMgVGVzdCBhIGJ1bmNoIG9mIGRhdGEgYW5kIGNoZWNrIGpzb24gZW5jb2RlL2RlY29kZSBkbyBub3QKKyAgICAjIGxvc2UgcHJlY2lzaW9uCisgICAgdmFsdWVfbGlzdCA9IFsweDAwLCAweEQ4LCAweDZFLCAweDAwXQorICAgIG1zZzIgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKCkKKyAgICBmb3IgYSBpbiByYW5nZSgwLCAyNTYpOgorICAgICAgdmFsdWVfbGlzdFszXSA9IGEKKyAgICAgIGZvciBiIGluIHJhbmdlKDAsIDI1Nik6CisgICAgICAgIHZhbHVlX2xpc3RbMF0gPSBiCisgICAgICAgIGJ5dGVfYXJyYXkgPSBieXRlYXJyYXkodmFsdWVfbGlzdCkKKyAgICAgICAgbWVzc2FnZS5mbG9hdF92YWx1ZSA9IHN0cnVjdC51bnBhY2soJzxmJywgYnl0ZV9hcnJheSlbMF0KKyAgICAgICAgc2VsZi5DaGVja1BhcnNlQmFjayhtZXNzYWdlLCBtc2cyKQorCisgIGRlZiB0ZXN0UGFyc2VFbXB0eVRleHQoc2VsZik6CisgICAgc2VsZi5DaGVja0Vycm9yKCcnLAorICAgICAgICAgICAgICAgICAgICByJ0ZhaWxlZCB0byBsb2FkIEpTT046IChFeHBlY3RpbmcgdmFsdWUpfChObyBKU09OKS4nKQorCisgIGRlZiB0ZXN0UGFyc2VFbnVtVmFsdWUoc2VsZik6CisgICAgbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE1lc3NhZ2UoKQorICAgIHRleHQgPSAneyJlbnVtVmFsdWUiOiAwfScKKyAgICBqc29uX2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQorICAgIHRleHQgPSAneyJlbnVtVmFsdWUiOiAxfScKKyAgICBqc29uX2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQorICAgIHNlbGYuQ2hlY2tFcnJvcigKKyAgICAgICAgJ3siZW51bVZhbHVlIjogImJheiJ9JywKKyAgICAgICAgJ0ZhaWxlZCB0byBwYXJzZSBlbnVtVmFsdWUgZmllbGQ6IEludmFsaWQgZW51bSB2YWx1ZSBiYXogJworICAgICAgICAnZm9yIGVudW0gdHlwZSBwcm90bzMuRW51bVR5cGUgYXQgVGVzdE1lc3NhZ2UuZW51bVZhbHVlLicpCisgICAgIyBQcm90bzMgYWNjZXB0cyBudW1lcmljIHVua25vd24gZW51bXMuCisgICAgdGV4dCA9ICd7ImVudW1WYWx1ZSI6IDEyMzQ1fScKKyAgICBqc29uX2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQorICAgICMgUHJvdG8yIGRvZXMgbm90IGFjY2VwdCB1bmtub3duIGVudW1zLgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIG9wdGlvbmFsTmVzdGVkRW51bSBmaWVsZDogSW52YWxpZCBlbnVtIHZhbHVlIDEyMzQ1ICcKKyAgICAgICAgJ2ZvciBlbnVtIHR5cGUgcHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0gYXQgJworICAgICAgICAnVGVzdEFsbFR5cGVzLm9wdGlvbmFsTmVzdGVkRW51bS4nLCBqc29uX2Zvcm1hdC5QYXJzZSwKKyAgICAgICAgJ3sib3B0aW9uYWxOZXN0ZWRFbnVtIjogMTIzNDV9JywgbWVzc2FnZSkKKworICBkZWYgdGVzdEJ5dGVzKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKCkKKyAgICAjIFRlc3QgdXJsIGJhc2U2NAorICAgIHRleHQgPSAneyJieXRlc1ZhbHVlIjogIi1fIn0nCisgICAganNvbl9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UuYnl0ZXNfdmFsdWUsIGInXHhmYicpCisgICAgIyBUZXN0IHBhZGRpbmcKKyAgICB0ZXh0ID0gJ3siYnl0ZXNWYWx1ZSI6ICJBUUk9In0nCisgICAganNvbl9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UuYnl0ZXNfdmFsdWUsIGInXHgwMVx4MDInKQorICAgIHRleHQgPSAneyJieXRlc1ZhbHVlIjogIkFRSSJ9JworICAgIGpzb25fZm9ybWF0LlBhcnNlKHRleHQsIG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLmJ5dGVzX3ZhbHVlLCBiJ1x4MDFceDAyJykKKyAgICB0ZXh0ID0gJ3siYnl0ZXNWYWx1ZSI6ICJBUUkqIn0nCisgICAganNvbl9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UuYnl0ZXNfdmFsdWUsIGInXHgwMVx4MDInKQorCisgIGRlZiB0ZXN0UGFyc2VCYWRJZGVudGlmZXIoc2VsZik6CisgICAgc2VsZi5DaGVja0Vycm9yKCd7aW50MzJWYWx1ZTogMX0nLAorICAgICAgICAgICAgICAgICAgICAocidGYWlsZWQgdG8gbG9hZCBKU09OOiBFeHBlY3RpbmcgcHJvcGVydHkgbmFtZScKKyAgICAgICAgICAgICAgICAgICAgIHInKCBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzKT86IGxpbmUgMScpKQorICAgIHNlbGYuQ2hlY2tFcnJvcigKKyAgICAgICAgJ3sidW5rbm93bk5hbWUiOiAxfScsCisgICAgICAgICdNZXNzYWdlIHR5cGUgInByb3RvMy5UZXN0TWVzc2FnZSIgaGFzIG5vIGZpZWxkIG5hbWVkICcKKyAgICAgICAgJyJ1bmtub3duTmFtZSIgYXQgIlRlc3RNZXNzYWdlIi4nKQorCisgIGRlZiB0ZXN0SWdub3JlVW5rbm93bkZpZWxkKHNlbGYpOgorICAgIHRleHQgPSAneyJ1bmtub3duTmFtZSI6IDF9JworICAgIHBhcnNlZF9tZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCisgICAganNvbl9mb3JtYXQuUGFyc2UodGV4dCwgcGFyc2VkX21lc3NhZ2UsIGlnbm9yZV91bmtub3duX2ZpZWxkcz1UcnVlKQorICAgIHRleHQgPSAoJ3tcbicKKyAgICAgICAgICAgICcgICJyZXBlYXRlZFZhbHVlIjogWyB7XG4nCisgICAgICAgICAgICAnICAgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvMy5NZXNzYWdlVHlwZSIsXG4nCisgICAgICAgICAgICAnICAgICJ1bmtub3duTmFtZSI6IDFcbicKKyAgICAgICAgICAgICcgIH1dXG4nCisgICAgICAgICAgICAnfVxuJykKKyAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdEFueSgpCisgICAganNvbl9mb3JtYXQuUGFyc2UodGV4dCwgcGFyc2VkX21lc3NhZ2UsIGlnbm9yZV91bmtub3duX2ZpZWxkcz1UcnVlKQorCisgIGRlZiB0ZXN0RHVwbGljYXRlRmllbGQoc2VsZik6CisgICAgc2VsZi5DaGVja0Vycm9yKCd7ImludDMyVmFsdWUiOiAxLFxuImludDMyVmFsdWUiOjJ9JywKKyAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBsb2FkIEpTT046IGR1cGxpY2F0ZSBrZXkgaW50MzJWYWx1ZS4nKQorCisgIGRlZiB0ZXN0SW52YWxpZEJvb2xWYWx1ZShzZWxmKToKKyAgICBzZWxmLkNoZWNrRXJyb3IoCisgICAgICAgICd7ImJvb2xWYWx1ZSI6IDF9JywgJ0ZhaWxlZCB0byBwYXJzZSBib29sVmFsdWUgZmllbGQ6ICcKKyAgICAgICAgJ0V4cGVjdGVkIHRydWUgb3IgZmFsc2Ugd2l0aG91dCBxdW90ZXMgYXQgVGVzdE1lc3NhZ2UuYm9vbFZhbHVlLicpCisgICAgc2VsZi5DaGVja0Vycm9yKAorICAgICAgICAneyJib29sVmFsdWUiOiAidHJ1ZSJ9JywgJ0ZhaWxlZCB0byBwYXJzZSBib29sVmFsdWUgZmllbGQ6ICcKKyAgICAgICAgJ0V4cGVjdGVkIHRydWUgb3IgZmFsc2Ugd2l0aG91dCBxdW90ZXMgYXQgVGVzdE1lc3NhZ2UuYm9vbFZhbHVlLicpCisKKyAgZGVmIHRlc3RJbnZhbGlkSW50ZWdlclZhbHVlKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKCkKKyAgICB0ZXh0ID0gJ3siaW50MzJWYWx1ZSI6IDB4MTIzNDV9JworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGpzb25fZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAganNvbl9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCisgICAgc2VsZi5DaGVja0Vycm9yKAorICAgICAgICAneyJpbnQzMlZhbHVlIjogMS41fScsICdGYWlsZWQgdG8gcGFyc2UgaW50MzJWYWx1ZSBmaWVsZDogJworICAgICAgICAnQ291bGRuXCd0IHBhcnNlIGludGVnZXI6IDEuNSBhdCBUZXN0TWVzc2FnZS5pbnQzMlZhbHVlLicpCisgICAgc2VsZi5DaGVja0Vycm9yKCd7ImludDMyVmFsdWUiOiAwMTIzNDV9JywKKyAgICAgICAgICAgICAgICAgICAgKHInRmFpbGVkIHRvIGxvYWQgSlNPTjogRXhwZWN0aW5nIFwnPyxcJz8gZGVsaW1pdGVyOiAnCisgICAgICAgICAgICAgICAgICAgICByJ2xpbmUgMS4nKSkKKyAgICBzZWxmLkNoZWNrRXJyb3IoCisgICAgICAgICd7ImludDMyVmFsdWUiOiAiIDEgIn0nLCAnRmFpbGVkIHRvIHBhcnNlIGludDMyVmFsdWUgZmllbGQ6ICcKKyAgICAgICAgJ0NvdWxkblwndCBwYXJzZSBpbnRlZ2VyOiAiIDEgIiBhdCBUZXN0TWVzc2FnZS5pbnQzMlZhbHVlLicpCisgICAgc2VsZi5DaGVja0Vycm9yKAorICAgICAgICAneyJpbnQzMlZhbHVlIjogIjEgIn0nLCAnRmFpbGVkIHRvIHBhcnNlIGludDMyVmFsdWUgZmllbGQ6ICcKKyAgICAgICAgJ0NvdWxkblwndCBwYXJzZSBpbnRlZ2VyOiAiMSAiIGF0IFRlc3RNZXNzYWdlLmludDMyVmFsdWUuJykKKyAgICBzZWxmLkNoZWNrRXJyb3IoCisgICAgICAgICd7ImludDMyVmFsdWUiOiBmYWxzZX0nLAorICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGludDMyVmFsdWUgZmllbGQ6IEJvb2wgdmFsdWUgRmFsc2UgJworICAgICAgICAnaXMgbm90IGFjY2VwdGFibGUgZm9yIGludGVnZXIgZmllbGQgYXQgVGVzdE1lc3NhZ2UuaW50MzJWYWx1ZS4nKQorICAgIHNlbGYuQ2hlY2tFcnJvcigneyJpbnQzMlZhbHVlIjogMTIzNDU2Nzg5MDEyMzQ1Njc4OTB9JywKKyAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBwYXJzZSBpbnQzMlZhbHVlIGZpZWxkOiBWYWx1ZSBvdXQgb2YgcmFuZ2U6ICcKKyAgICAgICAgICAgICAgICAgICAgJzEyMzQ1Njc4OTAxMjM0NTY3ODkwLicpCisgICAgc2VsZi5DaGVja0Vycm9yKCd7InVpbnQzMlZhbHVlIjogLTF9JywKKyAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBwYXJzZSB1aW50MzJWYWx1ZSBmaWVsZDogJworICAgICAgICAgICAgICAgICAgICAnVmFsdWUgb3V0IG9mIHJhbmdlOiAtMS4nKQorCisgIGRlZiB0ZXN0SW52YWxpZEZsb2F0VmFsdWUoc2VsZik6CisgICAgc2VsZi5DaGVja0Vycm9yKAorICAgICAgICAneyJmbG9hdFZhbHVlIjogIm5hbiJ9JywgJ0ZhaWxlZCB0byBwYXJzZSBmbG9hdFZhbHVlIGZpZWxkOiBDb3VsZG5cJ3QgJworICAgICAgICAncGFyc2UgZmxvYXQgIm5hbiIsIHVzZSAiTmFOIiBpbnN0ZWFkIGF0IFRlc3RNZXNzYWdlLmZsb2F0VmFsdWUuJykKKyAgICBzZWxmLkNoZWNrRXJyb3IoJ3siZmxvYXRWYWx1ZSI6IE5hTn0nLAorICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGZsb2F0VmFsdWUgZmllbGQ6IENvdWxkblwndCAnCisgICAgICAgICAgICAgICAgICAgICdwYXJzZSBOYU4sIHVzZSBxdW90ZWQgIk5hTiIgaW5zdGVhZC4nKQorICAgIHNlbGYuQ2hlY2tFcnJvcigneyJmbG9hdFZhbHVlIjogSW5maW5pdHl9JywKKyAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBwYXJzZSBmbG9hdFZhbHVlIGZpZWxkOiBDb3VsZG5cJ3QgcGFyc2UgSW5maW5pdHknCisgICAgICAgICAgICAgICAgICAgICcgb3IgdmFsdWUgdG9vIGxhcmdlLCB1c2UgcXVvdGVkICJJbmZpbml0eSIgaW5zdGVhZC4nKQorICAgIHNlbGYuQ2hlY2tFcnJvcigneyJmbG9hdFZhbHVlIjogLUluZmluaXR5fScsCisgICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gcGFyc2UgZmxvYXRWYWx1ZSBmaWVsZDogQ291bGRuXCd0IHBhcnNlICcKKyAgICAgICAgICAgICAgICAgICAgJy1JbmZpbml0eSBvciB2YWx1ZSB0b28gc21hbGwsICcKKyAgICAgICAgICAgICAgICAgICAgJ3VzZSBxdW90ZWQgIi1JbmZpbml0eSIgaW5zdGVhZC4nKQorICAgIHNlbGYuQ2hlY2tFcnJvcigneyJkb3VibGVWYWx1ZSI6IC0xLjg5NzY5ZSszMDh9JywKKyAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBwYXJzZSBkb3VibGVWYWx1ZSBmaWVsZDogQ291bGRuXCd0IHBhcnNlICcKKyAgICAgICAgICAgICAgICAgICAgJy1JbmZpbml0eSBvciB2YWx1ZSB0b28gc21hbGwsICcKKyAgICAgICAgICAgICAgICAgICAgJ3VzZSBxdW90ZWQgIi1JbmZpbml0eSIgaW5zdGVhZC4nKQorICAgIHNlbGYuQ2hlY2tFcnJvcigneyJmbG9hdFZhbHVlIjogMy40MDI4MjM1ZSszOX0nLAorICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGZsb2F0VmFsdWUgZmllbGQ6IEZsb2F0IHZhbHVlIHRvbyBsYXJnZS4nKQorICAgIHNlbGYuQ2hlY2tFcnJvcigneyJmbG9hdFZhbHVlIjogLTMuNTAyODIzZSszOH0nLAorICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGZsb2F0VmFsdWUgZmllbGQ6IEZsb2F0IHZhbHVlIHRvbyBzbWFsbC4nKQorCisgIGRlZiB0ZXN0SW52YWxpZFJlcGVhdGVkKHNlbGYpOgorICAgIHNlbGYuQ2hlY2tFcnJvcigKKyAgICAgICAgJ3sicmVwZWF0ZWRJbnQzMlZhbHVlIjogMTIzNDV9JywKKyAgICAgICAgKHInRmFpbGVkIHRvIHBhcnNlIHJlcGVhdGVkSW50MzJWYWx1ZSBmaWVsZDogcmVwZWF0ZWQgZmllbGQnCisgICAgICAgICByJyByZXBlYXRlZEludDMyVmFsdWUgbXVzdCBiZSBpbiBcW1xdIHdoaWNoIGlzIDEyMzQ1IGF0IFRlc3RNZXNzYWdlLicpKQorCisgIGRlZiB0ZXN0SW52YWxpZE1hcChzZWxmKToKKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWFwKCkKKyAgICB0ZXh0ID0gJ3siaW50MzJNYXAiOiB7Im51bGwiOiAyLCAiMiI6IDN9fScKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KGpzb25fZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGludDMyTWFwIGZpZWxkOiBpbnZhbGlkIGxpdGVyYWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbl9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCisgICAgdGV4dCA9ICd7ImludDMyTWFwIjogezE6IDIsICIyIjogM319JworICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoanNvbl9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChyJ0ZhaWxlZCB0byBsb2FkIEpTT046IEV4cGVjdGluZyBwcm9wZXJ0eSBuYW1lJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInKCBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzKT86IGxpbmUgMScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbl9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCisgICAgdGV4dCA9ICd7ImJvb2xNYXAiOiB7Im51bGwiOiAxfX0nCisgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAganNvbl9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgJ0ZhaWxlZCB0byBwYXJzZSBib29sTWFwIGZpZWxkOiBFeHBlY3RlZCAidHJ1ZSIgb3IgImZhbHNlIiwgbm90IG51bGwgYXQgJworICAgICAgICAnVGVzdE1hcC5ib29sTWFwLmtleScsIGpzb25fZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQorICAgIHRleHQgPSByJ3sic3RyaW5nTWFwIjogeyJhIjogMywgIlx1MDA2MSI6IDJ9fScKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KGpzb25fZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIGxvYWQgSlNPTjogZHVwbGljYXRlIGtleSBhJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25fZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQorICAgIHRleHQgPSByJ3sic3RyaW5nTWFwIjogMH0nCisgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAganNvbl9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgJ0ZhaWxlZCB0byBwYXJzZSBzdHJpbmdNYXAgZmllbGQ6IE1hcCBmaWVsZCBzdHJpbmdfbWFwIG11c3QgYmUgJworICAgICAgICAnaW4gYSBkaWN0IHdoaWNoIGlzIDAgYXQgVGVzdE1hcC5zdHJpbmdNYXAuJywganNvbl9mb3JtYXQuUGFyc2UsIHRleHQsCisgICAgICAgIG1lc3NhZ2UpCisKKyAgZGVmIHRlc3RJbnZhbGlkVGltZXN0YW1wKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RUaW1lc3RhbXAoKQorICAgIHRleHQgPSAneyJ2YWx1ZSI6ICIxMDAwMC0wMS0wMVQwMDowMDowMC4wMFoifScKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKKyAgICAgICAganNvbl9mb3JtYXQuUGFyc2VFcnJvciwgJ0ZhaWxlZCB0byBwYXJzZSB2YWx1ZSBmaWVsZDogJworICAgICAgICAndGltZSBkYXRhIFwnMTAwMDAtMDEtMDFUMDA6MDA6MDBcJyBkb2VzIG5vdCBtYXRjaCcKKyAgICAgICAgJyBmb3JtYXQgXCclWS0lbS0lZFQlSDolTTolU1wnIGF0IFRlc3RUaW1lc3RhbXAudmFsdWUuJywKKyAgICAgICAganNvbl9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCisgICAgdGV4dCA9ICd7InZhbHVlIjogIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDEyMzQ1Njc4OTAxMloifScKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAnbmFub3MgMDEyMzQ1Njc4OTAxMiBtb3JlIHRoYW4gOSBmcmFjdGlvbmFsIGRpZ2l0cy4nLCBqc29uX2Zvcm1hdC5QYXJzZSwKKyAgICAgICAgdGV4dCwgbWVzc2FnZSkKKyAgICB0ZXh0ID0gJ3sidmFsdWUiOiAiMTk3Mi0wMS0wMVQwMTowMDowMC4wMSswOCJ9JworICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoanNvbl9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChyJ0ludmFsaWQgdGltZXpvbmUgb2Zmc2V0IHZhbHVlOiBcKzA4LicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbl9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCisgICAgIyBUaW1lIHNtYWxsZXIgdGhhbiBtaW5pbXVtIHRpbWUuCisgICAgdGV4dCA9ICd7InZhbHVlIjogIjAwMDAtMDEtMDFUMDA6MDA6MDBaIn0nCisgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAganNvbl9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgJ0ZhaWxlZCB0byBwYXJzZSB2YWx1ZSBmaWVsZDogeWVhciAoMCApP2lzIG91dCBvZiByYW5nZS4nLAorICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKKyAgICAjIFRpbWUgYmlnZ2VyIHRoYW4gbWF4aW11bSB0aW1lLgorICAgIG1lc3NhZ2UudmFsdWUuc2Vjb25kcyA9IDI1MzQwMjMwMDgwMAorICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoT3ZlcmZsb3dFcnJvciwgJ2RhdGUgdmFsdWUgb3V0IG9mIHJhbmdlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24sIG1lc3NhZ2UpCisgICAgIyBMb3dlciBjYXNlIHQgZG9lcyBub3QgYWNjZXB0LgorICAgIHRleHQgPSAneyJ2YWx1ZSI6ICIwMDAxLTAxLTAxdDAwOjAwOjAwWiJ9JworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoanNvbl9mb3JtYXQuUGFyc2VFcnJvcikgYXMgZToKKyAgICAgIGpzb25fZm9ybWF0LlBhcnNlKHRleHQsIG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgJ0ZhaWxlZCB0byBwYXJzZSB2YWx1ZSBmaWVsZDogJworICAgICAgICAndGltZSBkYXRhIFwnMDAwMS0wMS0wMXQwMDowMDowMFwnIGRvZXMgbm90IG1hdGNoIGZvcm1hdCAnCisgICAgICAgICdcJyVZLSVtLSVkVCVIOiVNOiVTXCcsIGxvd2VyY2FzZSBcJ3RcJyBpcyBub3QgYWNjZXB0ZWQgJworICAgICAgICAnYXQgVGVzdFRpbWVzdGFtcC52YWx1ZS4nLCBzdHIoZS5leGNlcHRpb24pKQorCisgIGRlZiB0ZXN0SW52YWxpZE9uZW9mKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RPbmVvZigpCisgICAgdGV4dCA9ICd7Im9uZW9mSW50MzJWYWx1ZSI6IDEsICJvbmVvZlN0cmluZ1ZhbHVlIjogIjIifScKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKKyAgICAgICAganNvbl9mb3JtYXQuUGFyc2VFcnJvciwgJ01lc3NhZ2UgdHlwZSAicHJvdG8zLlRlc3RPbmVvZiInCisgICAgICAgICcgc2hvdWxkIG5vdCBoYXZlIG11bHRpcGxlICJvbmVvZl92YWx1ZSIgb25lb2YgZmllbGRzIGF0ICJUZXN0T25lb2YiLicsCisgICAgICAgIGpzb25fZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0SW52YWxpZExpc3RWYWx1ZShzZWxmKToKKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TGlzdFZhbHVlKCkKKyAgICB0ZXh0ID0gJ3sidmFsdWUiOiAxMjM0fScKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICByJ0ZhaWxlZCB0byBwYXJzZSB2YWx1ZSBmaWVsZDogTGlzdFZhbHVlIG11c3QgYmUgaW4gXFtcXSB3aGljaCBpcyAnCisgICAgICAgICcxMjM0IGF0IFRlc3RMaXN0VmFsdWUudmFsdWUuJywganNvbl9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCisKKyAgICBjbGFzcyBVbmtub3duQ2xhc3Mob2JqZWN0KToKKworICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAndicKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICByJyBhdCBUZXN0TGlzdFZhbHVlLnZhbHVlXFsxXF0uZmFrZS4nLAorICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZURpY3QsCisgICAgICAgIHsndmFsdWUnOiBbJ2hlbGxvJywgeydmYWtlJzogVW5rbm93bkNsYXNzKCl9XX0sIG1lc3NhZ2UpCisKKyAgZGVmIHRlc3RJbnZhbGlkU3RydWN0KHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RTdHJ1Y3QoKQorICAgIHRleHQgPSAneyJ2YWx1ZSI6IDEyMzR9JworICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIGpzb25fZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICdGYWlsZWQgdG8gcGFyc2UgdmFsdWUgZmllbGQ6IFN0cnVjdCBtdXN0IGJlIGluIGEgZGljdCB3aGljaCBpcyAnCisgICAgICAgICcxMjM0IGF0IFRlc3RTdHJ1Y3QudmFsdWUnLCBqc29uX2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKKworICBkZWYgdGVzdFRpbWVzdGFtcEludmFsaWRTdHJpbmdWYWx1ZShzZWxmKToKKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0VGltZXN0YW1wKCkKKyAgICB0ZXh0ID0gJ3sidmFsdWUiOiB7ImZvbyI6IDEyM319JworICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIGpzb25fZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgIHIiVGltZXN0YW1wIEpTT04gdmFsdWUgbm90IGEgc3RyaW5nOiB7dT8nZm9vJzogMTIzfSIsIGpzb25fZm9ybWF0LlBhcnNlLAorICAgICAgICB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0RHVyYXRpb25JbnZhbGlkU3RyaW5nVmFsdWUoc2VsZik6CisgICAgbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdER1cmF0aW9uKCkKKyAgICB0ZXh0ID0gJ3sidmFsdWUiOiB7ImZvbyI6IDEyM319JworICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoanNvbl9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiRHVyYXRpb24gSlNPTiB2YWx1ZSBub3QgYSBzdHJpbmc6IHt1Pydmb28nOiAxMjN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25fZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0RmllbGRNYXNrSW52YWxpZFN0cmluZ1ZhbHVlKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RGaWVsZE1hc2soKQorICAgIHRleHQgPSAneyJ2YWx1ZSI6IHsiZm9vIjogMTIzfX0nCisgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAganNvbl9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgciJGaWVsZE1hc2sgSlNPTiB2YWx1ZSBub3QgYSBzdHJpbmc6IHt1Pydmb28nOiAxMjN9IiwganNvbl9mb3JtYXQuUGFyc2UsCisgICAgICAgIHRleHQsIG1lc3NhZ2UpCisKKyAgZGVmIHRlc3RJbnZhbGlkQW55KHNlbGYpOgorICAgIG1lc3NhZ2UgPSBhbnlfcGIyLkFueSgpCisgICAgdGV4dCA9ICd7IkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUifScKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KEtleUVycm9yLCAndmFsdWUnLCBqc29uX2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKKyAgICB0ZXh0ID0gJ3sidmFsdWUiOiAxMjM0fScKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KGpzb25fZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHR5cGUgaXMgbWlzc2luZyB3aGVuIHBhcnNpbmcgYW55IG1lc3NhZ2UgYXQgQW55JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25fZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQorICAgIHRleHQgPSAneyJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL01lc3NhZ2VOb3RFeGlzdCIsICJ2YWx1ZSI6IDEyMzR9JworICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIGpzb25fZm9ybWF0LlBhcnNlRXJyb3IsICdDYW4gbm90IGZpbmQgbWVzc2FnZSBkZXNjcmlwdG9yIGJ5IHR5cGVfdXJsOiAnCisgICAgICAgICd0eXBlLmdvb2dsZWFwaXMuY29tL01lc3NhZ2VOb3RFeGlzdCBhdCBBbnknLCBqc29uX2Zvcm1hdC5QYXJzZSwgdGV4dCwKKyAgICAgICAgbWVzc2FnZSkKKyAgICAjIE9ubHkgbGFzdCBwYXJ0IGlzIHRvIGJlIHVzZWQ6IGIvMjU2MzAxMTIKKyAgICB0ZXh0ID0gKHIneyJAdHlwZSI6ICJpbmNvcnJlY3QuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUiLCcKKyAgICAgICAgICAgIHInInZhbHVlIjogMTIzNH0nKQorICAgIGpzb25fZm9ybWF0LlBhcnNlKHRleHQsIG1lc3NhZ2UpCisKKyAgZGVmIHRlc3RQcmVzZXJ2aW5nUHJvdG9GaWVsZE5hbWVzKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKCkKKyAgICBtZXNzYWdlLmludDMyX3ZhbHVlID0gMTIzNDUKKyAgICBzZWxmLmFzc2VydEVxdWFsKCd7XG4gICJpbnQzMlZhbHVlIjogMTIzNDVcbn0nLAorICAgICAgICAgICAgICAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCd7XG4gICJpbnQzMl92YWx1ZSI6IDEyMzQ1XG59JywKKyAgICAgICAgICAgICAgICAgICAgIGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSwgRmFsc2UsIFRydWUpKQorICAgICMgV2hlbiBpbmNsdWRpbmdfZGVmYXVsdF92YWx1ZV9maWVsZHMgaXMgVHJ1ZS4KKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0VGltZXN0YW1wKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCd7XG4gICJyZXBlYXRlZFZhbHVlIjogW11cbn0nLAorICAgICAgICAgICAgICAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlLCBGYWxzZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgne1xuICAicmVwZWF0ZWRfdmFsdWUiOiBbXVxufScsCisgICAgICAgICAgICAgICAgICAgICBqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UsIFRydWUsIFRydWUpKQorCisgICAgIyBQYXJzZXJzIGFjY2VwdCBib3RoIG9yaWdpbmFsIHByb3RvIGZpZWxkIG5hbWVzIGFuZCBsb3dlckNhbWVsQ2FzZSBuYW1lcy4KKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCisgICAganNvbl9mb3JtYXQuUGFyc2UoJ3siaW50MzJWYWx1ZSI6IDU0MzIxfScsIG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1NDMyMSwgbWVzc2FnZS5pbnQzMl92YWx1ZSkKKyAgICBqc29uX2Zvcm1hdC5QYXJzZSgneyJpbnQzMl92YWx1ZSI6IDEyMzQ1fScsIG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMjM0NSwgbWVzc2FnZS5pbnQzMl92YWx1ZSkKKworICBkZWYgdGVzdEluZGVudChzZWxmKToKKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCisgICAgbWVzc2FnZS5pbnQzMl92YWx1ZSA9IDEyMzQ1CisgICAgc2VsZi5hc3NlcnRFcXVhbCgne1xuImludDMyVmFsdWUiOiAxMjM0NVxufScsCisgICAgICAgICAgICAgICAgICAgICBqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UsIGluZGVudD0wKSkKKworICBkZWYgdGVzdEZvcm1hdEVudW1zQXNJbnRzKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKCkKKyAgICBtZXNzYWdlLmVudW1fdmFsdWUgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLkJBUgorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZW51bV92YWx1ZS5hcHBlbmQoanNvbl9mb3JtYXRfcHJvdG8zX3BiMi5GT08pCisgICAgbWVzc2FnZS5yZXBlYXRlZF9lbnVtX3ZhbHVlLmFwcGVuZChqc29uX2Zvcm1hdF9wcm90bzNfcGIyLkJBUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKGpzb24ubG9hZHMoJ3tcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgImVudW1WYWx1ZSI6IDEsXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICJyZXBlYXRlZEVudW1WYWx1ZSI6IFswLCAxXVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfVxuJyksCisgICAgICAgICAgICAgICAgICAgICBqc29uLmxvYWRzKGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgdXNlX2ludGVnZXJzX2Zvcl9lbnVtcz1UcnVlKSkpCisKKyAgZGVmIHRlc3RQYXJzZURpY3Qoc2VsZik6CisgICAgZXhwZWN0ZWQgPSAxMjM0NQorICAgIGpzX2RpY3QgPSB7J2ludDMyVmFsdWUnOiBleHBlY3RlZH0KKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCisgICAganNvbl9mb3JtYXQuUGFyc2VEaWN0KGpzX2RpY3QsIG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgbWVzc2FnZS5pbnQzMl92YWx1ZSkKKworICBkZWYgdGVzdFBhcnNlRGljdEFueURlc2NyaXB0b3JQb29sTWlzc2luZ1R5cGUoc2VsZik6CisgICAgIyBDb25maXJtIHRoYXQgUGFyc2VEaWN0IGRvZXMgbm90IHJhaXNlIFBhcnNlRXJyb3Igd2l0aCBkZWZhdWx0IHBvb2wKKyAgICBqc19kaWN0ID0geworICAgICAgICAnYW55X3ZhbHVlJzogeworICAgICAgICAgICAgJ0B0eXBlJzogJ3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG8zLk1lc3NhZ2VUeXBlJywKKyAgICAgICAgICAgICd2YWx1ZSc6IDEyMzQKKyAgICAgICAgfQorICAgIH0KKyAgICBqc29uX2Zvcm1hdC5QYXJzZURpY3QoanNfZGljdCwgYW55X3Rlc3RfcGIyLlRlc3RBbnkoKSkKKyAgICAjIENoZWNrIFBhcnNlRGljdCByYWlzZXMgUGFyc2VFcnJvciB3aXRoIGVtcHR5IHBvb2wKKyAgICBqc19kaWN0ID0geworICAgICAgICAnYW55X3ZhbHVlJzogeworICAgICAgICAgICAgJ0B0eXBlJzogJ3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG8zLk1lc3NhZ2VUeXBlJywKKyAgICAgICAgICAgICd2YWx1ZSc6IDEyMzQKKyAgICAgICAgfQorICAgIH0KKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGpzb25fZm9ybWF0LlBhcnNlRXJyb3IpIGFzIGNtOgorICAgICAgZW1wdHlfcG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbCgpCisgICAgICBqc29uX2Zvcm1hdC5QYXJzZURpY3QoanNfZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnlfdGVzdF9wYjIuVGVzdEFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcG9vbD1lbXB0eV9wb29sKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHN0cihjbS5leGNlcHRpb24pLAorICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGFueV92YWx1ZSBmaWVsZDogQ2FuIG5vdCBmaW5kIG1lc3NhZ2UgZGVzY3JpcHRvciBieScKKyAgICAgICAgJyB0eXBlX3VybDogdHlwZS5nb29nbGVhcGlzLmNvbS9wcm90bzMuTWVzc2FnZVR5cGUgYXQgJworICAgICAgICAnVGVzdEFueS5hbnlfdmFsdWUuJworICAgICkKKworICBkZWYgdGVzdFBhcnNlRGljdFVua25vd25WYWx1ZVR5cGUoc2VsZik6CisgICAgY2xhc3MgVW5rbm93bkNsYXNzKG9iamVjdCk6CisKKyAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICd2JworICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RWYWx1ZSgpCisgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAganNvbl9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgciJWYWx1ZSB2IGhhcyB1bmV4cGVjdGVkIHR5cGUgPGNsYXNzICcuKlwuVW5rbm93bkNsYXNzJz4uIiwKKyAgICAgICAganNvbl9mb3JtYXQuUGFyc2VEaWN0LCB7J3ZhbHVlJzogVW5rbm93bkNsYXNzKCl9LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0TWVzc2FnZVRvRGljdChzZWxmKToKKyAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCisgICAgbWVzc2FnZS5pbnQzMl92YWx1ZSA9IDEyMzQ1CisgICAgZXhwZWN0ZWQgPSB7J2ludDMyVmFsdWUnOiAxMjM0NX0KKyAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvRGljdChtZXNzYWdlKSkKKworICBkZWYgdGVzdEpzb25OYW1lKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RDdXN0b21Kc29uTmFtZSgpCisgICAgbWVzc2FnZS52YWx1ZSA9IDEyMzQ1CisgICAgc2VsZi5hc3NlcnRFcXVhbCgne1xuICAiQHZhbHVlIjogMTIzNDVcbn0nLAorICAgICAgICAgICAgICAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlKSkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdEN1c3RvbUpzb25OYW1lKCkKKyAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgIGRlZiB0ZXN0U29ydEtleXMoc2VsZik6CisgICAgIyBUZXN0aW5nIHNvcnRfa2V5cyBpcyBub3QgcGVyZmVjdGx5IHdvcmtpbmcsIGFzIGJ5IHJhbmRvbSBsdWNrIHdlIGNvdWxkCisgICAgIyBnZXQgdGhlIG91dHB1dCBzb3J0ZWQuIFdlIGp1c3QgdXNlIGEgc2VsZWN0aW9uIG9mIG5hbWVzLgorICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKGJvb2xfdmFsdWU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl92YWx1ZT0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3ZhbHVlPTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3ZhbHVlPTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3ZhbHVlPSdibGEnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSwgc29ydF9rZXlzPVRydWUpLAorICAgICAgICAjIFdlIHVzZSBqc29uLmR1bXBzKCkgaW5zdGVhZCBvZiBhIGhhcmRjb2RlZCBzdHJpbmcgZHVlIHRvIGRpZmZlcmVuY2VzCisgICAgICAgICMgYmV0d2VlbiBQeXRob24gMiBhbmQgUHl0aG9uIDMuCisgICAgICAgIGpzb24uZHVtcHMoeydib29sVmFsdWUnOiBUcnVlLCAnaW50MzJWYWx1ZSc6IDEsICdpbnQ2NFZhbHVlJzogJzMnLAorICAgICAgICAgICAgICAgICAgICAndWludDMyVmFsdWUnOiA0LCAnc3RyaW5nVmFsdWUnOiAnYmxhJ30sCisgICAgICAgICAgICAgICAgICAgaW5kZW50PTIsIHNvcnRfa2V5cz1UcnVlKSkKKworICBkZWYgdGVzdE5lc3RlZFJlY3Vyc2l2ZUxpbWl0KHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuTmVzdGVkVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAnTWVzc2FnZSB0b28gZGVlcC4gTWF4IHJlY3Vyc2lvbiBkZXB0aCBpcyAzJywKKyAgICAgICAganNvbl9mb3JtYXQuUGFyc2UsCisgICAgICAgICd7ImNoaWxkIjogeyJjaGlsZCI6IHsiY2hpbGQiIDoge319fX0nLAorICAgICAgICBtZXNzYWdlLAorICAgICAgICBtYXhfcmVjdXJzaW9uX2RlcHRoPTMpCisgICAgIyBUaGUgZm9sbG93aW5nIG9uZSBjYW4gcGFzcworICAgIGpzb25fZm9ybWF0LlBhcnNlKCd7InBheWxvYWQiOiB7fSwgImNoaWxkIjogeyJjaGlsZCI6e319fScsCisgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgbWF4X3JlY3Vyc2lvbl9kZXB0aD0zKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwva2V5d29yZHNfdGVzdC5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwva2V5d29yZHNfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTgyY2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9rZXl3b3Jkc190ZXN0LnB5CkBAIC0wLDAgKzEsMTAzIEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIGZvciBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwua2V5d29yZHMuIiIiCisKK2ltcG9ydCB1bml0dGVzdAorCisKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBtb3JlX21lc3NhZ2VzX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbAorCisKK2NsYXNzIEtleXdvcmRzQ29uZmxpY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc3VwZXIoS2V5d29yZHNDb25mbGljdFRlc3QsIHNlbGYpLnNldFVwKCkKKyAgICBzZWxmLnBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVmYXVsdCgpCisKKyAgZGVmIHRlc3RNZXNzYWdlKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBnZXRhdHRyKG1vcmVfbWVzc2FnZXNfcGIyLCAnY2xhc3MnKSgpCisgICAgbWVzc2FnZS5pbnRfZmllbGQgPSAxMjMKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UuaW50X2ZpZWxkLCAxMjMpCisgICAgZGVzID0gc2VsZi5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgnZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmNsYXNzJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGRlcy5uYW1lLCAnY2xhc3MnKQorCisgIGRlZiB0ZXN0TmVzdGVkTWVzc2FnZShzZWxmKToKKyAgICBtZXNzYWdlID0gZ2V0YXR0cihtb3JlX21lc3NhZ2VzX3BiMiwgJ2NsYXNzJykoKQorICAgIG1lc3NhZ2UubmVzdGVkX21lc3NhZ2UuZmllbGQgPSAyMzQKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UubmVzdGVkX21lc3NhZ2UuZmllbGQsIDIzNCkKKyAgICBkZXMgPSBzZWxmLnBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCdnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuY2xhc3MudHJ5JykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGRlcy5uYW1lLCAndHJ5JykKKworICBkZWYgdGVzdEZpZWxkKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBnZXRhdHRyKG1vcmVfbWVzc2FnZXNfcGIyLCAnY2xhc3MnKSgpCisgICAgc2V0YXR0cihtZXNzYWdlLCAnaWYnLCAxMjMpCisgICAgc2V0YXR0cihtZXNzYWdlLCAnYXMnLCAxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cihtZXNzYWdlLCAnaWYnKSwgMTIzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cihtZXNzYWdlLCAnYXMnKSwgMSkKKworICBkZWYgdGVzdEVudW0oc2VsZik6CisgICAgY2xhc3NfID0gZ2V0YXR0cihtb3JlX21lc3NhZ2VzX3BiMiwgJ2NsYXNzJykKKyAgICBtZXNzYWdlID0gY2xhc3NfKCkKKyAgICAjIE5vcm1hbCBlbnVtIHZhbHVlLgorICAgIG1lc3NhZ2UuZW51bV9maWVsZCA9IG1vcmVfbWVzc2FnZXNfcGIyLmRlZmF1bHQKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UuZW51bV9maWVsZCwgbW9yZV9tZXNzYWdlc19wYjIuZGVmYXVsdCkKKyAgICAjIFRvcCBsZXZlbCBlbnVtIHZhbHVlLgorICAgIG1lc3NhZ2UuZW51bV9maWVsZCA9IGdldGF0dHIobW9yZV9tZXNzYWdlc19wYjIsICdlbHNlJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UuZW51bV9maWVsZCwgMSkKKyAgICAjIE5lc3RlZCBlbnVtIHZhbHVlCisgICAgbWVzc2FnZS5uZXN0ZWRfZW51bV9maWVsZCA9IGdldGF0dHIoY2xhc3NfLCAnVHJ1ZScpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLm5lc3RlZF9lbnVtX2ZpZWxkLCAxKQorCisgIGRlZiB0ZXN0RXh0ZW5zaW9uKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBnZXRhdHRyKG1vcmVfbWVzc2FnZXNfcGIyLCAnY2xhc3MnKSgpCisgICAgIyBUb3AgbGV2ZWwgZXh0ZW5zaW9uCisgICAgZXh0ZW5zaW9uMSA9IGdldGF0dHIobW9yZV9tZXNzYWdlc19wYjIsICdjb250aW51ZScpCisgICAgbWVzc2FnZS5FeHRlbnNpb25zW2V4dGVuc2lvbjFdID0gNDU2CisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLkV4dGVuc2lvbnNbZXh0ZW5zaW9uMV0sIDQ1NikKKyAgICAjIE5vbmUgdG9wIGxldmVsIGV4dGVuc2lvbgorICAgIGV4dGVuc2lvbjIgPSBnZXRhdHRyKG1vcmVfbWVzc2FnZXNfcGIyLkV4dGVuZENsYXNzLCAncmV0dXJuJykKKyAgICBtZXNzYWdlLkV4dGVuc2lvbnNbZXh0ZW5zaW9uMl0gPSA3ODkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UuRXh0ZW5zaW9uc1tleHRlbnNpb24yXSwgNzg5KQorCisgIGRlZiB0ZXN0RXh0ZW5zaW9uRm9yTmVzdGVkTWVzc2FnZShzZWxmKToKKyAgICBtZXNzYWdlID0gZ2V0YXR0cihtb3JlX21lc3NhZ2VzX3BiMiwgJ2NsYXNzJykoKQorICAgIGV4dGVuc2lvbiA9IGdldGF0dHIobW9yZV9tZXNzYWdlc19wYjIsICd3aXRoJykKKyAgICBtZXNzYWdlLm5lc3RlZF9tZXNzYWdlLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9IDk5OQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5uZXN0ZWRfbWVzc2FnZS5FeHRlbnNpb25zW2V4dGVuc2lvbl0sIDk5OSkKKworICBkZWYgVGVzdEZ1bGxLZXl3b3JkVXNlZChzZWxmKToKKyAgICBtZXNzYWdlID0gbW9yZV9tZXNzYWdlc19wYjIuVGVzdEZ1bGxLZXl3b3JkKCkKKyAgICBtZXNzYWdlLmZpZWxkMi5pbnRfZmllbGQgPSAxMjMKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9mYWN0b3J5X3Rlc3QucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfZmFjdG9yeV90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYmE2MTkKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfZmFjdG9yeV90ZXN0LnB5CkBAIC0wLDAgKzEsMjk5IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIGZvciBnb29nbGUucHJvdG9idWYubWVzc2FnZV9mYWN0b3J5LiIiIgorCitfX2F1dGhvcl9fID0gJ21hdHRoZXd0b2lhQGdvb2dsZS5jb20gKE1hdHQgVG9pYSknCisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBhcGlfaW1wbGVtZW50YXRpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBmYWN0b3J5X3Rlc3QxX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGZhY3RvcnlfdGVzdDJfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdGVzdGluZ19yZWZsZWFrcworZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfZGF0YWJhc2UKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3Bvb2wKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlX2ZhY3RvcnkKKworCitAdGVzdGluZ19yZWZsZWFrcy5UZXN0Q2FzZQorY2xhc3MgTWVzc2FnZUZhY3RvcnlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc2VsZi5mYWN0b3J5X3Rlc3QxX2ZkID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAorICAgICAgICBmYWN0b3J5X3Rlc3QxX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpCisgICAgc2VsZi5mYWN0b3J5X3Rlc3QyX2ZkID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAorICAgICAgICBmYWN0b3J5X3Rlc3QyX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpCisKKyAgZGVmIF9FeGVyY2lzZUR5bmFtaWNDbGFzcyhzZWxmLCBjbHMpOgorICAgIG1zZyA9IGNscygpCisgICAgbXNnLm1hbmRhdG9yeSA9IDQyCisgICAgbXNnLm5lc3RlZF9mYWN0b3J5XzJfZW51bSA9IDAKKyAgICBtc2cubmVzdGVkX2ZhY3RvcnlfMl9tZXNzYWdlLnZhbHVlID0gJ25lc3RlZCBtZXNzYWdlIHZhbHVlJworICAgIG1zZy5mYWN0b3J5XzFfbWVzc2FnZS5mYWN0b3J5XzFfZW51bSA9IDEKKyAgICBtc2cuZmFjdG9yeV8xX21lc3NhZ2UubmVzdGVkX2ZhY3RvcnlfMV9lbnVtID0gMAorICAgIG1zZy5mYWN0b3J5XzFfbWVzc2FnZS5uZXN0ZWRfZmFjdG9yeV8xX21lc3NhZ2UudmFsdWUgPSAoCisgICAgICAgICduZXN0ZWQgbWVzc2FnZSB2YWx1ZScpCisgICAgbXNnLmZhY3RvcnlfMV9tZXNzYWdlLnNjYWxhcl92YWx1ZSA9IDIyCisgICAgbXNnLmZhY3RvcnlfMV9tZXNzYWdlLmxpc3RfdmFsdWUuZXh0ZW5kKFt1J29uZScsIHUndHdvJywgdSd0aHJlZSddKQorICAgIG1zZy5mYWN0b3J5XzFfbWVzc2FnZS5saXN0X3ZhbHVlLmFwcGVuZCh1J2ZvdXInKQorICAgIG1zZy5mYWN0b3J5XzFfZW51bSA9IDEKKyAgICBtc2cubmVzdGVkX2ZhY3RvcnlfMV9lbnVtID0gMAorICAgIG1zZy5uZXN0ZWRfZmFjdG9yeV8xX21lc3NhZ2UudmFsdWUgPSAnbmVzdGVkIG1lc3NhZ2UgdmFsdWUnCisgICAgbXNnLmNpcmN1bGFyX21lc3NhZ2UubWFuZGF0b3J5ID0gMQorICAgIG1zZy5jaXJjdWxhcl9tZXNzYWdlLmNpcmN1bGFyX21lc3NhZ2UubWFuZGF0b3J5ID0gMgorICAgIG1zZy5jaXJjdWxhcl9tZXNzYWdlLnNjYWxhcl92YWx1ZSA9ICdvbmUgZGVlcCcKKyAgICBtc2cuc2NhbGFyX3ZhbHVlID0gJ3plcm8gZGVlcCcKKyAgICBtc2cubGlzdF92YWx1ZS5leHRlbmQoW3UnZm91cicsIHUndGhyZWUnLCB1J3R3byddKQorICAgIG1zZy5saXN0X3ZhbHVlLmFwcGVuZCh1J29uZScpCisgICAgbXNnLmdyb3VwZWQuYWRkKCkKKyAgICBtc2cuZ3JvdXBlZFswXS5wYXJ0XzEgPSAnaGVsbG8nCisgICAgbXNnLmdyb3VwZWRbMF0ucGFydF8yID0gJ3dvcmxkJworICAgIG1zZy5ncm91cGVkLmFkZChwYXJ0XzE9J3Rlc3RpbmcnLCBwYXJ0XzI9JzEyMycpCisgICAgbXNnLmxvb3AubG9vcC5tYW5kYXRvcnkgPSAyCisgICAgbXNnLmxvb3AubG9vcC5sb29wLmxvb3AubWFuZGF0b3J5ID0gNAorICAgIHNlcmlhbGl6ZWQgPSBtc2cuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIGNvbnZlcnRlZCA9IGZhY3RvcnlfdGVzdDJfcGIyLkZhY3RvcnkyTWVzc2FnZS5Gcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgcmVzZXJpYWxpemVkID0gY29udmVydGVkLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlcmlhbGl6ZWQsIHJlc2VyaWFsaXplZCkKKyAgICByZXN1bHQgPSBjbHMuRnJvbVN0cmluZyhyZXNlcmlhbGl6ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIHJlc3VsdCkKKworICBkZWYgdGVzdEdldFByb3RvdHlwZShzZWxmKToKKyAgICBkYiA9IGRlc2NyaXB0b3JfZGF0YWJhc2UuRGVzY3JpcHRvckRhdGFiYXNlKCkKKyAgICBwb29sID0gZGVzY3JpcHRvcl9wb29sLkRlc2NyaXB0b3JQb29sKGRiKQorICAgIGRiLkFkZChzZWxmLmZhY3RvcnlfdGVzdDFfZmQpCisgICAgZGIuQWRkKHNlbGYuZmFjdG9yeV90ZXN0Ml9mZCkKKyAgICBmYWN0b3J5ID0gbWVzc2FnZV9mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5KCkKKyAgICBjbHMgPSBmYWN0b3J5LkdldFByb3RvdHlwZShwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRGYWxzZShjbHMgaXMgZmFjdG9yeV90ZXN0Ml9wYjIuRmFjdG9yeTJNZXNzYWdlKQorICAgIHNlbGYuX0V4ZXJjaXNlRHluYW1pY0NsYXNzKGNscykKKyAgICBjbHMyID0gZmFjdG9yeS5HZXRQcm90b3R5cGUocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCisgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbHMgaXMgY2xzMikKKworICBkZWYgdGVzdENyZWF0ZVByb3RvdHlwZU92ZXJyaWRlKHNlbGYpOgorICAgIGNsYXNzIE15TWVzc2FnZUZhY3RvcnkobWVzc2FnZV9mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5KToKKworICAgICAgZGVmIENyZWF0ZVByb3RvdHlwZShzZWxmLCBkZXNjcmlwdG9yKToKKyAgICAgICAgY2xzID0gc3VwZXIoTXlNZXNzYWdlRmFjdG9yeSwgc2VsZikuQ3JlYXRlUHJvdG90eXBlKGRlc2NyaXB0b3IpCisgICAgICAgIGNscy5hZGRpdGlvbmFsX2ZpZWxkID0gJ1NvbWUgdmFsdWUnCisgICAgICAgIHJldHVybiBjbHMKKworICAgIGRiID0gZGVzY3JpcHRvcl9kYXRhYmFzZS5EZXNjcmlwdG9yRGF0YWJhc2UoKQorICAgIHBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woZGIpCisgICAgZGIuQWRkKHNlbGYuZmFjdG9yeV90ZXN0MV9mZCkKKyAgICBkYi5BZGQoc2VsZi5mYWN0b3J5X3Rlc3QyX2ZkKQorICAgIGZhY3RvcnkgPSBNeU1lc3NhZ2VGYWN0b3J5KCkKKyAgICBjbHMgPSBmYWN0b3J5LkdldFByb3RvdHlwZShwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoY2xzLCAnYWRkaXRpb25hbF9maWVsZCcpKQorCisgIGRlZiB0ZXN0R2V0TWVzc2FnZXMoc2VsZik6CisgICAgIyBwZXJmb3JtZWQgdHdpY2UgYmVjYXVzZSBtdWx0aXBsZSBjYWxscyB3aXRoIHRoZSBzYW1lIGlucHV0IG11c3QgYmUgYWxsb3dlZAorICAgIGZvciBfIGluIHJhbmdlKDIpOgorICAgICAgIyBHZXRNZXNzYWdlIHNob3VsZCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhlIG9yZGVyIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvCisgICAgICAjIGFyZSBwcm92aWRlZC4gSW4gcGFydGljdWxhciwgdGhlIGZ1bmN0aW9uIHNob3VsZCBzdWNjZWVkIHdoZW4gdGhlIGZpbGVzCisgICAgICAjIGFyZSBub3QgaW4gdGhlIHRvcG9sb2dpY2FsIG9yZGVyIG9mIGRlcGVuZGVuY2llcy4KKworICAgICAgIyBBc3N1bWluZyBmYWN0b3J5X3Rlc3QyX2ZkIGRlcGVuZHMgb24gZmFjdG9yeV90ZXN0MV9mZC4KKyAgICAgIHNlbGYuYXNzZXJ0SW4oc2VsZi5mYWN0b3J5X3Rlc3QxX2ZkLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFjdG9yeV90ZXN0Ml9mZC5kZXBlbmRlbmN5KQorICAgICAgIyBHZXQgbWVzc2FnZXMgc2hvdWxkIHdvcmsgd2hlbiBhIGZpbGUgY29tZXMgYmVmb3JlIGl0cyBkZXBlbmRlbmNpZXM6CisgICAgICAjIGZhY3RvcnlfdGVzdDJfZmQgY29tZXMgYmVmb3JlIGZhY3RvcnlfdGVzdDFfZmQuCisgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VfZmFjdG9yeS5HZXRNZXNzYWdlcyhbc2VsZi5mYWN0b3J5X3Rlc3QyX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFjdG9yeV90ZXN0MV9mZF0pCisgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgc2V0KFsnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2UnLAorICAgICAgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTFNZXNzYWdlJ10sCisgICAgICAgICAgICAgKS5pc3N1YnNldChzZXQobWVzc2FnZXMua2V5cygpKSkpCisgICAgICBzZWxmLl9FeGVyY2lzZUR5bmFtaWNDbGFzcygKKyAgICAgICAgICBtZXNzYWdlc1snZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2UnXSkKKyAgICAgIGZhY3RvcnlfbXNnMSA9IG1lc3NhZ2VzWydnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkxTWVzc2FnZSddCisgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KAorICAgICAgICAgIFsnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2Uub25lX21vcmVfZmllbGQnLAorICAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5hbm90aGVyX2ZpZWxkJ10sKS5pc3N1YnNldChzZXQoCisgICAgICAgICAgICAgICBleHQuZnVsbF9uYW1lCisgICAgICAgICAgICAgICBmb3IgZXh0IGluIGZhY3RvcnlfbXNnMS5ERVNDUklQVE9SLmZpbGUucG9vbC5GaW5kQWxsRXh0ZW5zaW9ucygKKyAgICAgICAgICAgICAgICAgICBmYWN0b3J5X21zZzEuREVTQ1JJUFRPUikpKSkKKyAgICAgIG1zZzEgPSBtZXNzYWdlc1snZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5MU1lc3NhZ2UnXSgpCisgICAgICBleHQxID0gbXNnMS5FeHRlbnNpb25zLl9GaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZS5vbmVfbW9yZV9maWVsZCcpCisgICAgICBleHQyID0gbXNnMS5FeHRlbnNpb25zLl9GaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLmFub3RoZXJfZmllbGQnKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4obXNnMS5FeHRlbnNpb25zKSkKKyAgICAgIG1zZzEuRXh0ZW5zaW9uc1tleHQxXSA9ICd0ZXN0MScKKyAgICAgIG1zZzEuRXh0ZW5zaW9uc1tleHQyXSA9ICd0ZXN0MicKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3Rlc3QxJywgbXNnMS5FeHRlbnNpb25zW2V4dDFdKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgndGVzdDInLCBtc2cxLkV4dGVuc2lvbnNbZXh0Ml0pCisgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgIG1zZzEuRXh0ZW5zaW9ucy5fRmluZEV4dGVuc2lvbkJ5TnVtYmVyKDEyMzIxKSkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKG1zZzEuRXh0ZW5zaW9ucykpCisgICAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdjcHAnOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZzEuRXh0ZW5zaW9ucy5fRmluZEV4dGVuc2lvbkJ5TmFtZSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cxLkV4dGVuc2lvbnMuX0ZpbmRFeHRlbnNpb25CeU51bWJlciwgJycpCisgICAgICBlbHNlOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbXNnMS5FeHRlbnNpb25zLl9GaW5kRXh0ZW5zaW9uQnlOYW1lKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbXNnMS5FeHRlbnNpb25zLl9GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoJycpKQorCisgIGRlZiB0ZXN0RHVwbGljYXRlRXh0ZW5zaW9uTnVtYmVyKHNlbGYpOgorICAgIHBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woKQorICAgIGZhY3RvcnkgPSBtZXNzYWdlX2ZhY3RvcnkuTWVzc2FnZUZhY3RvcnkocG9vbD1wb29sKQorCisgICAgIyBBZGQgQ29udGFpbmVyIG1lc3NhZ2UuCisgICAgZiA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oCisgICAgICAgIG5hbWU9J2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jb250YWluZXIucHJvdG8nLAorICAgICAgICBwYWNrYWdlPSdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsJykKKyAgICBmLm1lc3NhZ2VfdHlwZS5hZGQobmFtZT0nQ29udGFpbmVyJykuZXh0ZW5zaW9uX3JhbmdlLmFkZChzdGFydD0xLCBlbmQ9MTApCisgICAgcG9vbC5BZGQoZikKKyAgICBtc2dzID0gZmFjdG9yeS5HZXRNZXNzYWdlcyhbZi5uYW1lXSkKKyAgICBzZWxmLmFzc2VydEluKCdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkNvbnRhaW5lcicsIG1zZ3MpCisKKyAgICAjIEV4dGVuZCBjb250YWluZXIuCisgICAgZiA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oCisgICAgICAgIG5hbWU9J2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9leHRlbnNpb24ucHJvdG8nLAorICAgICAgICBwYWNrYWdlPSdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsJywKKyAgICAgICAgZGVwZW5kZW5jeT1bJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jb250YWluZXIucHJvdG8nXSkKKyAgICBtc2cgPSBmLm1lc3NhZ2VfdHlwZS5hZGQobmFtZT0nRXh0ZW5zaW9uJykKKyAgICBtc2cuZXh0ZW5zaW9uLmFkZCgKKyAgICAgICAgbmFtZT0nZXh0ZW5zaW9uX2ZpZWxkJywKKyAgICAgICAgbnVtYmVyPTIsCisgICAgICAgIGxhYmVsPWRlc2NyaXB0b3JfcGIyLkZpZWxkRGVzY3JpcHRvclByb3RvLkxBQkVMX09QVElPTkFMLAorICAgICAgICB0eXBlX25hbWU9J0V4dGVuc2lvbicsCisgICAgICAgIGV4dGVuZGVlPSdDb250YWluZXInKQorICAgIHBvb2wuQWRkKGYpCisgICAgbXNncyA9IGZhY3RvcnkuR2V0TWVzc2FnZXMoW2YubmFtZV0pCisgICAgc2VsZi5hc3NlcnRJbignZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5FeHRlbnNpb24nLCBtc2dzKQorCisgICAgIyBBZGQgRHVwbGljYXRlIGV4dGVuZGluZyB0aGUgc2FtZSBmaWVsZCBudW1iZXIuCisgICAgZiA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oCisgICAgICAgIG5hbWU9J2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kdXBsaWNhdGUucHJvdG8nLAorICAgICAgICBwYWNrYWdlPSdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsJywKKyAgICAgICAgZGVwZW5kZW5jeT1bJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jb250YWluZXIucHJvdG8nXSkKKyAgICBtc2cgPSBmLm1lc3NhZ2VfdHlwZS5hZGQobmFtZT0nRHVwbGljYXRlJykKKyAgICBtc2cuZXh0ZW5zaW9uLmFkZCgKKyAgICAgICAgbmFtZT0nZXh0ZW5zaW9uX2ZpZWxkJywKKyAgICAgICAgbnVtYmVyPTIsCisgICAgICAgIGxhYmVsPWRlc2NyaXB0b3JfcGIyLkZpZWxkRGVzY3JpcHRvclByb3RvLkxBQkVMX09QVElPTkFMLAorICAgICAgICB0eXBlX25hbWU9J0R1cGxpY2F0ZScsCisgICAgICAgIGV4dGVuZGVlPSdDb250YWluZXInKQorICAgIHBvb2wuQWRkKGYpCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbikgYXMgY206CisgICAgICBmYWN0b3J5LkdldE1lc3NhZ2VzKFtmLm5hbWVdKQorCisgICAgc2VsZi5hc3NlcnRJbihzdHIoY20uZXhjZXB0aW9uKSwKKyAgICAgICAgICAgICAgICAgIFsnRXh0ZW5zaW9ucyAnCisgICAgICAgICAgICAgICAgICAgJyJnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkR1cGxpY2F0ZS5leHRlbnNpb25fZmllbGQiIGFuZCcKKyAgICAgICAgICAgICAgICAgICAnICJnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkV4dGVuc2lvbi5leHRlbnNpb25fZmllbGQiJworICAgICAgICAgICAgICAgICAgICcgYm90aCB0cnkgdG8gZXh0ZW5kIG1lc3NhZ2UgdHlwZScKKyAgICAgICAgICAgICAgICAgICAnICJnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkNvbnRhaW5lciInCisgICAgICAgICAgICAgICAgICAgJyB3aXRoIGZpZWxkIG51bWJlciAyLicsCisgICAgICAgICAgICAgICAgICAgJ0RvdWJsZSByZWdpc3RyYXRpb24gb2YgRXh0ZW5zaW9ucyddKQorCisgIGRlZiB0ZXN0RXh0ZW5zaW9uVmFsdWVJbkRpZmZlcmVudEZpbGUoc2VsZik6CisgICAgIyBBZGQgQ29udGFpbmVyIG1lc3NhZ2UuCisgICAgZjEgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvKAorICAgICAgICBuYW1lPSdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvY29udGFpbmVyLnByb3RvJywKKyAgICAgICAgcGFja2FnZT0nZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbCcpCisgICAgZjEubWVzc2FnZV90eXBlLmFkZChuYW1lPSdDb250YWluZXInKS5leHRlbnNpb25fcmFuZ2UuYWRkKHN0YXJ0PTEsIGVuZD0xMCkKKworICAgICMgQWRkIFZhbHVlVHlwZSBtZXNzYWdlLgorICAgIGYyID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bygKKyAgICAgICAgbmFtZT0nZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3ZhbHVlX3R5cGUucHJvdG8nLAorICAgICAgICBwYWNrYWdlPSdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsJykKKyAgICBmMi5tZXNzYWdlX3R5cGUuYWRkKG5hbWU9J1ZhbHVlVHlwZScpLmZpZWxkLmFkZCgKKyAgICAgICAgbmFtZT0nc2V0dGluZycsCisgICAgICAgIG51bWJlcj0xLAorICAgICAgICBsYWJlbD1kZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90by5MQUJFTF9PUFRJT05BTCwKKyAgICAgICAgdHlwZT1kZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90by5UWVBFX0lOVDMyLAorICAgICAgICBkZWZhdWx0X3ZhbHVlPScxMjMnKQorCisgICAgIyBFeHRlbmQgY29udGFpbmVyIHdpdGggZmllbGQgb2YgVmFsdWVUeXBlLgorICAgIGYzID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bygKKyAgICAgICAgbmFtZT0nZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2V4dGVuc2lvbi5wcm90bycsCisgICAgICAgIHBhY2thZ2U9J2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwnLAorICAgICAgICBkZXBlbmRlbmN5PVtmMS5uYW1lLCBmMi5uYW1lXSkKKyAgICBmMy5leHRlbnNpb24uYWRkKAorICAgICAgICBuYW1lPSd0b3BfbGV2ZWxfZXh0ZW5zaW9uX2ZpZWxkJywKKyAgICAgICAgbnVtYmVyPTIsCisgICAgICAgIGxhYmVsPWRlc2NyaXB0b3JfcGIyLkZpZWxkRGVzY3JpcHRvclByb3RvLkxBQkVMX09QVElPTkFMLAorICAgICAgICB0eXBlX25hbWU9J1ZhbHVlVHlwZScsCisgICAgICAgIGV4dGVuZGVlPSdDb250YWluZXInKQorICAgIGYzLm1lc3NhZ2VfdHlwZS5hZGQobmFtZT0nRXh0ZW5zaW9uJykuZXh0ZW5zaW9uLmFkZCgKKyAgICAgICAgbmFtZT0nbmVzdGVkX2V4dGVuc2lvbl9maWVsZCcsCisgICAgICAgIG51bWJlcj0zLAorICAgICAgICBsYWJlbD1kZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90by5MQUJFTF9PUFRJT05BTCwKKyAgICAgICAgdHlwZV9uYW1lPSdWYWx1ZVR5cGUnLAorICAgICAgICBleHRlbmRlZT0nQ29udGFpbmVyJykKKworICAgIGNsYXNzIFNpbXBsZURlc2NyaXB0b3JEQjoKKworICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVzKToKKyAgICAgICAgc2VsZi5fZmlsZXMgPSBmaWxlcworCisgICAgICBkZWYgRmluZEZpbGVCeU5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlc1tuYW1lXQorCisgICAgZGIgPSBTaW1wbGVEZXNjcmlwdG9yREIoe2YxLm5hbWU6IGYxLCBmMi5uYW1lOiBmMiwgZjMubmFtZTogZjN9KQorCisgICAgcG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbChkYikKKyAgICBmYWN0b3J5ID0gbWVzc2FnZV9mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5KHBvb2w9cG9vbCkKKyAgICBtc2dzID0gZmFjdG9yeS5HZXRNZXNzYWdlcyhbZjEubmFtZSwgZjMubmFtZV0pICAjIERlbGliZXJhdGVseSBub3QgZjIuCisgICAgbXNnID0gbXNnc1snZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5Db250YWluZXInXQorICAgIGRlc2MgPSBtc2dzWydnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkV4dGVuc2lvbiddLkRFU0NSSVBUT1IKKyAgICBleHQxID0gZGVzYy5maWxlLmV4dGVuc2lvbnNfYnlfbmFtZVsndG9wX2xldmVsX2V4dGVuc2lvbl9maWVsZCddCisgICAgZXh0MiA9IGRlc2MuZXh0ZW5zaW9uc19ieV9uYW1lWyduZXN0ZWRfZXh0ZW5zaW9uX2ZpZWxkJ10KKyAgICBtID0gbXNnKCkKKyAgICBtLkV4dGVuc2lvbnNbZXh0MV0uc2V0dGluZyA9IDIzNAorICAgIG0uRXh0ZW5zaW9uc1tleHQyXS5zZXR0aW5nID0gMzQ1CisgICAgc2VyaWFsaXplZCA9IG0uU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgcG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbChkYikKKyAgICBmYWN0b3J5ID0gbWVzc2FnZV9mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5KHBvb2w9cG9vbCkKKyAgICBtc2dzID0gZmFjdG9yeS5HZXRNZXNzYWdlcyhbZjEubmFtZSwgZjMubmFtZV0pICAjIERlbGliZXJhdGVseSBub3QgZjIuCisgICAgbXNnID0gbXNnc1snZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5Db250YWluZXInXQorICAgIGRlc2MgPSBtc2dzWydnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkV4dGVuc2lvbiddLkRFU0NSSVBUT1IKKyAgICBleHQxID0gZGVzYy5maWxlLmV4dGVuc2lvbnNfYnlfbmFtZVsndG9wX2xldmVsX2V4dGVuc2lvbl9maWVsZCddCisgICAgZXh0MiA9IGRlc2MuZXh0ZW5zaW9uc19ieV9uYW1lWyduZXN0ZWRfZXh0ZW5zaW9uX2ZpZWxkJ10KKyAgICBtID0gbXNnLkZyb21TdHJpbmcoc2VyaWFsaXplZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihtLkxpc3RGaWVsZHMoKSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMzQsIG0uRXh0ZW5zaW9uc1tleHQxXS5zZXR0aW5nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzQ1LCBtLkV4dGVuc2lvbnNbZXh0Ml0uc2V0dGluZykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9saXN0ZW5lci5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9saXN0ZW5lci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmMyNTVhCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX2xpc3RlbmVyLnB5CkBAIC0wLDAgKzEsNzggQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiRGVmaW5lcyBhIGxpc3RlbmVyIGludGVyZmFjZSBmb3Igb2JzZXJ2aW5nIGNlcnRhaW4KK3N0YXRlIHRyYW5zaXRpb25zIG9uIE1lc3NhZ2Ugb2JqZWN0cy4KKworQWxzbyBkZWZpbmVzIGEgbnVsbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJworCisKK2NsYXNzIE1lc3NhZ2VMaXN0ZW5lcihvYmplY3QpOgorCisgICIiIkxpc3RlbnMgZm9yIG1vZGlmaWNhdGlvbnMgbWFkZSB0byBhIG1lc3NhZ2UuICBNZWFudCB0byBiZSByZWdpc3RlcmVkIHZpYQorICBNZXNzYWdlLl9TZXRMaXN0ZW5lcigpLgorCisgIEF0dHJpYnV0ZXM6CisgICAgZGlydHk6ICBJZiBUcnVlLCB0aGVuIGNhbGxpbmcgTW9kaWZpZWQoKSB3b3VsZCBiZSBhIG5vLW9wLiAgVGhpcyBjYW4gYmUKKyAgICAgICAgICAgIHVzZWQgdG8gYXZvaWQgdGhlc2UgY2FsbHMgZW50aXJlbHkgaW4gdGhlIGNvbW1vbiBjYXNlLgorICAiIiIKKworICBkZWYgTW9kaWZpZWQoc2VsZik6CisgICAgIiIiQ2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIG1lc3NhZ2UgaXMgbW9kaWZpZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBwYXJlbnQKKyAgICBtZXNzYWdlIG1heSBuZWVkIHRvIGJlIHVwZGF0ZWQuICBUaGlzIGN1cnJlbnRseSBtZWFucyBlaXRoZXI6CisgICAgKGEpIFRoZSBtZXNzYWdlIHdhcyBtb2RpZmllZCBmb3IgdGhlIGZpcnN0IHRpbWUsIHNvIHRoZSBwYXJlbnQgbWVzc2FnZQorICAgICAgICBzaG91bGQgaGVuY2Vmb3J0aCBtYXJrIHRoZSBtZXNzYWdlIGFzIHByZXNlbnQuCisgICAgKGIpIFRoZSBtZXNzYWdlJ3MgY2FjaGVkIGJ5dGUgc2l6ZSBiZWNhbWUgZGlydHkgLS0gaS5lLiB0aGUgbWVzc2FnZSB3YXMKKyAgICAgICAgbW9kaWZpZWQgZm9yIHRoZSBmaXJzdCB0aW1lIGFmdGVyIGEgcHJldmlvdXMgY2FsbCB0byBCeXRlU2l6ZSgpLgorICAgICAgICBUaGVyZWZvcmUgdGhlIHBhcmVudCBzaG91bGQgYWxzbyBtYXJrIGl0cyBieXRlIHNpemUgYXMgZGlydHkuCisgICAgTm90ZSB0aGF0IChhKSBpbXBsaWVzIChiKSwgc2luY2UgbmV3IG9iamVjdHMgc3RhcnQgb3V0IHdpdGggYSBjbGllbnQgY2FjaGVkCisgICAgc2l6ZSAoemVybykuICBIb3dldmVyLCB3ZSBkb2N1bWVudCAoYSkgZXhwbGljaXRseSBiZWNhdXNlIGl0IGlzIGltcG9ydGFudC4KKworICAgIE1vZGlmaWVkKCkgd2lsbCAqb25seSogYmUgY2FsbGVkIGluIHJlc3BvbnNlIHRvIG9uZSBvZiB0aGVzZSB0d28gZXZlbnRzIC0tCisgICAgbm90IGV2ZXJ5IHRpbWUgdGhlIHN1Yi1tZXNzYWdlIGlzIG1vZGlmaWVkLgorCisgICAgTm90ZSB0aGF0IGlmIHRoZSBsaXN0ZW5lcidzIHxkaXJ0eXwgYXR0cmlidXRlIGlzIHRydWUsIHRoZW4gY2FsbGluZworICAgIE1vZGlmaWVkIGF0IHRoZSBtb21lbnQgd291bGQgYmUgYSBuby1vcCwgc28gaXQgY2FuIGJlIHNraXBwZWQuICBQZXJmb3JtYW5jZS0KKyAgICBzZW5zaXRpdmUgY2FsbGVycyBzaG91bGQgY2hlY2sgdGhpcyBhdHRyaWJ1dGUgZGlyZWN0bHkgYmVmb3JlIGNhbGxpbmcgc2luY2UKKyAgICBpdCB3aWxsIGJlIHRydWUgbW9zdCBvZiB0aGUgdGltZS4KKyAgICAiIiIKKworICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCitjbGFzcyBOdWxsTWVzc2FnZUxpc3RlbmVyKG9iamVjdCk6CisKKyAgIiIiTm8tb3AgTWVzc2FnZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLiIiIgorCisgIGRlZiBNb2RpZmllZChzZWxmKToKKyAgICBwYXNzCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2Vfc2V0X2V4dGVuc2lvbnMucHJvdG8gYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2Vfc2V0X2V4dGVuc2lvbnMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlNWYxOQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9zZXRfZXh0ZW5zaW9ucy5wcm90bwpAQCAtMCwwICsxLDc0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG1lc3NhZ2VzIHRoYXQgZXh0ZW5kIE1lc3NhZ2VTZXQuCisKK3N5bnRheCA9ICJwcm90bzIiOworcGFja2FnZSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWw7CisKKworLy8gQSBtZXNzYWdlIHdpdGggbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQuCittZXNzYWdlIFRlc3RNZXNzYWdlU2V0IHsKKyAgb3B0aW9uIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gdHJ1ZTsKKyAgZXh0ZW5zaW9ucyA0IHRvIG1heDsKK30KKworbWVzc2FnZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgeworICBleHRlbmQgVGVzdE1lc3NhZ2VTZXQgeworICAgIG9wdGlvbmFsIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBtZXNzYWdlX3NldF9leHRlbnNpb24gPSA5ODQxODYwMzsKKyAgfQorICBvcHRpb25hbCBpbnQzMiBpID0gMTU7Cit9CisKK21lc3NhZ2UgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIHsKKyAgZXh0ZW5kIFRlc3RNZXNzYWdlU2V0IHsKKyAgICBvcHRpb25hbCBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgbWVzc2FnZV9zZXRfZXh0ZW5zaW9uID0gOTg0MTg2MzQ7CisgIH0KKyAgb3B0aW9uYWwgc3RyaW5nIHN0ciA9IDI1OworfQorCittZXNzYWdlIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMyB7CisgIG9wdGlvbmFsIHN0cmluZyB0ZXh0ID0gMzU7Cit9CisKK2V4dGVuZCBUZXN0TWVzc2FnZVNldCB7CisgIG9wdGlvbmFsIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMyBtZXNzYWdlX3NldF9leHRlbnNpb24zID0gOTg0MTg2NTU7Cit9CisKKy8vIFRoaXMgbWVzc2FnZSB3YXMgdXNlZCB0byBnZW5lcmF0ZQorLy8gLy9uZXQvcHJvdG8yL3B5dGhvbi9pbnRlcm5hbC90ZXN0ZGF0YS9tZXNzYWdlX3NldF9tZXNzYWdlLCBidXQgaXMgY29tbWVudGVkCisvLyBvdXQgc2luY2UgaXQgbXVzdCBub3QgYWN0dWFsbHkgZXhpc3QgaW4gY29kZSwgdG8gc2ltdWxhdGUgYW4gInVua25vd24iCisvLyBleHRlbnNpb24uCisvLyBtZXNzYWdlIFRlc3RNZXNzYWdlU2V0VW5rbm93bkV4dGVuc2lvbiB7CisvLyAgIGV4dGVuZCBUZXN0TWVzc2FnZVNldCB7CisvLyAgICAgb3B0aW9uYWwgVGVzdE1lc3NhZ2VTZXRVbmtub3duRXh0ZW5zaW9uIG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiA9IDU2MTQxNDIxOworLy8gICB9CisvLyAgIG9wdGlvbmFsIGludDY0IGEgPSAxOworLy8gfQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX3Rlc3QucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGFiZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX3Rlc3QucHkKQEAgLTAsMCArMSwyNTcyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJUZXN0cyBweXRob24gcHJvdG9jb2wgYnVmZmVycyBhZ2FpbnN0IHRoZSBnb2xkZW4gbWVzc2FnZS4KKworTm90ZSB0aGF0IHRoZSBnb2xkZW4gbWVzc2FnZXMgZXhlcmNpc2UgZXZlcnkga25vd24gZmllbGQgdHlwZSwgdGh1cyB0aGlzCit0ZXN0IGVuZHMgdXAgZXhlcmNpc2luZyBhbmQgdmVyaWZ5aW5nIG5lYXJseSBhbGwgb2YgdGhlIHBhcnNpbmcgYW5kCitzZXJpYWxpemF0aW9uIGNvZGUgaW4gdGhlIHdob2xlIGxpYnJhcnkuCisKK1RPRE8oa2VudG9uKTogIE1lcmdlIHdpdGggd2lyZV9mb3JtYXRfdGVzdD8gIEl0IGRvZXNuJ3QgbWFrZSBhIHdob2xlIGxvdCBvZgorc2Vuc2UgdG8gY2FsbCB0aGlzIGEgdGVzdCBvZiB0aGUgIm1lc3NhZ2UiIG1vZHVsZSwgd2hpY2ggb25seSBkZWNsYXJlcyBhbgorYWJzdHJhY3QgaW50ZXJmYWNlLgorIiIiCisKK19fYXV0aG9yX18gPSAnZ3BzQGdvb2dsZS5jb20gKEdyZWdvcnkgUC4gU21pdGgpJworCitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCBjb3B5CitpbXBvcnQgbWF0aAoraW1wb3J0IG9wZXJhdG9yCitpbXBvcnQgcGlja2xlCitpbXBvcnQgcHlkb2MKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCisKK2NtcCA9IGxhbWJkYSB4LCB5OiAoeCA+IHkpIC0gKHggPCB5KQorCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWFwX3Byb3RvMl91bml0dGVzdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtYXBfdW5pdHRlc3RfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfcHJvdG8zX2FyZW5hX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBhcGlfaW1wbGVtZW50YXRpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbmNvZGVyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgbW9yZV9leHRlbnNpb25zX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHBhY2tlZF9maWVsZF90ZXN0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RfdXRpbAorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RfcHJvdG8zX29wdGlvbmFsX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RpbmdfcmVmbGVha3MKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgX3BhcmFtZXRlcml6ZWQKKworVUNTMl9NQVhVTklDT0RFID0gNjU1MzUKKword2FybmluZ3Muc2ltcGxlZmlsdGVyKCdlcnJvcicsIERlcHJlY2F0aW9uV2FybmluZykKKworCitAX3BhcmFtZXRlcml6ZWQubmFtZWRfcGFyYW1ldGVycygoJ19wcm90bzInLCB1bml0dGVzdF9wYjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ19wcm90bzMnLCB1bml0dGVzdF9wcm90bzNfYXJlbmFfcGIyKSkKK0B0ZXN0aW5nX3JlZmxlYWtzLlRlc3RDYXNlCitjbGFzcyBNZXNzYWdlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RCYWRVdGY4U3RyaW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nOgorICAgICAgc2VsZi5za2lwVGVzdCgnU2tpcHBpbmcgdGVzdEJhZFV0ZjhTdHJpbmcsIGN1cnJlbnRseSBvbmx5IHRoZSBweXRob24gJworICAgICAgICAgICAgICAgICAgICAnYXBpIGltcGxlbWVudGF0aW9uIHJhaXNlcyBVbmljb2RlRGVjb2RlRXJyb3Igd2hlbiBhICcKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZyBmaWVsZCBjb250YWlucyBiYWQgdXRmLTguJykKKyAgICBiYWRfdXRmOF9kYXRhID0gdGVzdF91dGlsLkdvbGRlbkZpbGVEYXRhKCdiYWRfdXRmOF9zdHJpbmcnKQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yKSBhcyBjb250ZXh0OgorICAgICAgbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLkZyb21TdHJpbmcoYmFkX3V0ZjhfZGF0YSkKKyAgICBzZWxmLmFzc2VydEluKCdUZXN0QWxsVHlwZXMub3B0aW9uYWxfc3RyaW5nJywgc3RyKGNvbnRleHQuZXhjZXB0aW9uKSkKKworICBkZWYgdGVzdEdvbGRlbk1lc3NhZ2Uoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgICMgUHJvdG8zIGRvZXNuJ3QgaGF2ZSB0aGUgImRlZmF1bHRfZm9vIiBtZW1iZXJzIG9yIGZvcmVpZ24gZW51bXMsCisgICAgIyBhbmQgZG9lc24ndCBwcmVzZXJ2ZSB1bmtub3duIGZpZWxkcywgc28gZm9yIHByb3RvMyB3ZSB1c2UgYSBnb2xkZW4KKyAgICAjIG1lc3NhZ2UgdGhhdCBkb2Vzbid0IGhhdmUgdGhlc2UgZmllbGRzIHNldC4KKyAgICBpZiBtZXNzYWdlX21vZHVsZSBpcyB1bml0dGVzdF9wYjI6CisgICAgICBnb2xkZW5fZGF0YSA9IHRlc3RfdXRpbC5Hb2xkZW5GaWxlRGF0YSgnZ29sZGVuX21lc3NhZ2Vfb25lb2ZfaW1wbGVtZW50ZWQnKQorICAgIGVsc2U6CisgICAgICBnb2xkZW5fZGF0YSA9IHRlc3RfdXRpbC5Hb2xkZW5GaWxlRGF0YSgnZ29sZGVuX21lc3NhZ2VfcHJvdG8zJykKKworICAgIGdvbGRlbl9tZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCisgICAgaWYgbWVzc2FnZV9tb2R1bGUgaXMgdW5pdHRlc3RfcGIyOgorICAgICAgdGVzdF91dGlsLkV4cGVjdEFsbEZpZWxkc1NldChzZWxmLCBnb2xkZW5fbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIGdvbGRlbl9jb3B5ID0gY29weS5kZWVwY29weShnb2xkZW5fbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBnb2xkZW5fY29weS5TZXJpYWxpemVUb1N0cmluZygpKQorCisgIGRlZiB0ZXN0R29sZGVuUGFja2VkTWVzc2FnZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgZ29sZGVuX2RhdGEgPSB0ZXN0X3V0aWwuR29sZGVuRmlsZURhdGEoJ2dvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UnKQorICAgIGdvbGRlbl9tZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICBwYXJzZWRfYnl0ZXMgPSBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCisgICAgYWxsX3NldCA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RQYWNrZWRUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbFBhY2tlZEZpZWxkcyhhbGxfc2V0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkX2J5dGVzLCBsZW4oZ29sZGVuX2RhdGEpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsX3NldCwgZ29sZGVuX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fZGF0YSwgYWxsX3NldC5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIGdvbGRlbl9jb3B5ID0gY29weS5kZWVwY29weShnb2xkZW5fbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBnb2xkZW5fY29weS5TZXJpYWxpemVUb1N0cmluZygpKQorCisgIGRlZiB0ZXN0UGFyc2VFcnJvcnMoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG1zZyA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtc2cuRnJvbVN0cmluZywgMCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIG1zZy5Gcm9tU3RyaW5nLCAnMCcpCisgICAgIyBUT0RPKGppZWx1byk6IEZpeCBjcHAgZXh0ZW5zaW9uIHRvIHJhaXNlIGVycm9yIGluc3RlYWQgb2Ygd2FybmluZy4KKyAgICAjIGIvMjc0OTQyMTYKKyAgICBlbmRfdGFnID0gZW5jb2Rlci5UYWdCeXRlcygxLCA0KQorICAgIGlmIChhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdweXRob24nIG9yCisgICAgICAgIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ3VwYicpOgorICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhtZXNzYWdlLkRlY29kZUVycm9yKSBhcyBjb250ZXh0OgorICAgICAgICBtc2cuRnJvbVN0cmluZyhlbmRfdGFnKQorICAgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAncHl0aG9uJzoKKyAgICAgICAgIyBPbmx5IHB1cmUtUHl0aG9uIGhhcyBhbiBlcnJvciBtZXNzYWdlIHRoaXMgc3BlY2lmaWMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VuZXhwZWN0ZWQgZW5kLWdyb3VwIHRhZy4nLCBzdHIoY29udGV4dC5leGNlcHRpb24pKQorCisgICAgIyBGaWVsZCBudW1iZXIgMCBpcyBpbGxlZ2FsLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG1lc3NhZ2UuRGVjb2RlRXJyb3IsIG1zZy5Gcm9tU3RyaW5nLCBiJ1wzXDQnKQorCisgIGRlZiB0ZXN0RGV0ZXJtaW5pc21QYXJhbWV0ZXJzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAjIFRoaXMgbWVzc2FnZSBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpY2FsbHkgc2VyaWFsaXplZCwgZXZlbiBpZiBkZXRlcm1pbmlzbQorICAgICMgaXMgZGlzYWJsZWQsIHNvIHdlIGNhbiB1c2UgaXQgdG8gdmVyaWZ5IHRoYXQgYWxsIHRoZSBkZXRlcm1pbmlzbQorICAgICMgcGFyYW1ldGVycyB3b3JrIGNvcnJlY3RseS4KKyAgICBnb2xkZW5fZGF0YSA9IChiJ1x4ZTJceDAyXG5PbmUgc3RyaW5nJworICAgICAgICAgICAgICAgICAgIGInXHhlMlx4MDJcblR3byBzdHJpbmcnCisgICAgICAgICAgICAgICAgICAgYidceGUyXHgwMlxuUmVkIHN0cmluZycKKyAgICAgICAgICAgICAgICAgICBiJ1x4ZTJceDAyXHgwYkJsdWUgc3RyaW5nJykKKyAgICBnb2xkZW5fbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgZ29sZGVuX21lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmV4dGVuZChbCisgICAgICAgICdPbmUgc3RyaW5nJywKKyAgICAgICAgJ1R3byBzdHJpbmcnLAorICAgICAgICAnUmVkIHN0cmluZycsCisgICAgICAgICdCbHVlIHN0cmluZycsCisgICAgXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgZ29sZGVuX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoZGV0ZXJtaW5pc3RpYz1Ob25lKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgZ29sZGVuX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoZGV0ZXJtaW5pc3RpYz1GYWxzZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGdvbGRlbl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKGRldGVybWluaXN0aWM9VHJ1ZSkpCisKKyAgICBjbGFzcyBCYWRBcmdFcnJvcihFeGNlcHRpb24pOgorICAgICAgcGFzcworCisgICAgY2xhc3MgQmFkQXJnKG9iamVjdCk6CisKKyAgICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgcmFpc2UgQmFkQXJnRXJyb3IoKQorCisgICAgICBkZWYgX19ib29sX18oc2VsZik6CisgICAgICAgIHJhaXNlIEJhZEFyZ0Vycm9yKCkKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQmFkQXJnRXJyb3IpOgorICAgICAgZ29sZGVuX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoZGV0ZXJtaW5pc3RpYz1CYWRBcmcoKSkKKworICBkZWYgdGVzdFBpY2tsZVN1cHBvcnQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIGdvbGRlbl9kYXRhID0gdGVzdF91dGlsLkdvbGRlbkZpbGVEYXRhKCdnb2xkZW5fbWVzc2FnZScpCisgICAgZ29sZGVuX21lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKKyAgICBwaWNrbGVkX21lc3NhZ2UgPSBwaWNrbGUuZHVtcHMoZ29sZGVuX21lc3NhZ2UpCisKKyAgICB1bnBpY2tsZWRfbWVzc2FnZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bnBpY2tsZWRfbWVzc2FnZSwgZ29sZGVuX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RQaWNrbGVOZXN0ZWRNZXNzYWdlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBnb2xkZW5fbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RQaWNrbGVOZXN0ZWRNZXNzYWdlLk5lc3RlZE1lc3NhZ2UoYmI9MSkKKyAgICBwaWNrbGVkX21lc3NhZ2UgPSBwaWNrbGUuZHVtcHMoZ29sZGVuX21lc3NhZ2UpCisgICAgdW5waWNrbGVkX21lc3NhZ2UgPSBwaWNrbGUubG9hZHMocGlja2xlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5waWNrbGVkX21lc3NhZ2UsIGdvbGRlbl9tZXNzYWdlKQorCisgIGRlZiB0ZXN0UGlja2xlTmVzdGVkTmVzdGVkTWVzc2FnZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgY2xzID0gbWVzc2FnZV9tb2R1bGUuVGVzdFBpY2tsZU5lc3RlZE1lc3NhZ2UuTmVzdGVkTWVzc2FnZQorICAgIGdvbGRlbl9tZXNzYWdlID0gY2xzLk5lc3RlZE5lc3RlZE1lc3NhZ2UoY2M9MSkKKyAgICBwaWNrbGVkX21lc3NhZ2UgPSBwaWNrbGUuZHVtcHMoZ29sZGVuX21lc3NhZ2UpCisgICAgdW5waWNrbGVkX21lc3NhZ2UgPSBwaWNrbGUubG9hZHMocGlja2xlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5waWNrbGVkX21lc3NhZ2UsIGdvbGRlbl9tZXNzYWdlKQorCisgIGRlZiB0ZXN0UG9zaXRpdmVJbmZpbml0eShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgaWYgbWVzc2FnZV9tb2R1bGUgaXMgdW5pdHRlc3RfcGIyOgorICAgICAgZ29sZGVuX2RhdGEgPSAoYidceDVEXHgwMFx4MDBceDgwXHg3RicKKyAgICAgICAgICAgICAgICAgICAgIGInXHg2MVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceDdGJworICAgICAgICAgICAgICAgICAgICAgYidceENEXHgwMlx4MDBceDAwXHg4MFx4N0YnCisgICAgICAgICAgICAgICAgICAgICBiJ1x4RDFceDAyXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4N0YnKQorICAgIGVsc2U6CisgICAgICBnb2xkZW5fZGF0YSA9IChiJ1x4NURceDAwXHgwMFx4ODBceDdGJworICAgICAgICAgICAgICAgICAgICAgYidceDYxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4N0YnCisgICAgICAgICAgICAgICAgICAgICBiJ1x4Q0FceDAyXHgwNFx4MDBceDAwXHg4MFx4N0YnCisgICAgICAgICAgICAgICAgICAgICBiJ1x4RDJceDAyXHgwOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceDdGJykKKworICAgIGdvbGRlbl9tZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCisgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fbWVzc2FnZS5vcHRpb25hbF9mbG9hdCwgbWF0aC5pbmYpCisgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fbWVzc2FnZS5vcHRpb25hbF9kb3VibGUsIG1hdGguaW5mKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX21lc3NhZ2UucmVwZWF0ZWRfZmxvYXRbMF0sIG1hdGguaW5mKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX21lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzBdLCBtYXRoLmluZikKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorCisgIGRlZiB0ZXN0TmVnYXRpdmVJbmZpbml0eShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgaWYgbWVzc2FnZV9tb2R1bGUgaXMgdW5pdHRlc3RfcGIyOgorICAgICAgZ29sZGVuX2RhdGEgPSAoYidceDVEXHgwMFx4MDBceDgwXHhGRicKKyAgICAgICAgICAgICAgICAgICAgIGInXHg2MVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceEZGJworICAgICAgICAgICAgICAgICAgICAgYidceENEXHgwMlx4MDBceDAwXHg4MFx4RkYnCisgICAgICAgICAgICAgICAgICAgICBiJ1x4RDFceDAyXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4RkYnKQorICAgIGVsc2U6CisgICAgICBnb2xkZW5fZGF0YSA9IChiJ1x4NURceDAwXHgwMFx4ODBceEZGJworICAgICAgICAgICAgICAgICAgICAgYidceDYxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4RkYnCisgICAgICAgICAgICAgICAgICAgICBiJ1x4Q0FceDAyXHgwNFx4MDBceDAwXHg4MFx4RkYnCisgICAgICAgICAgICAgICAgICAgICBiJ1x4RDJceDAyXHgwOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceEZGJykKKworICAgIGdvbGRlbl9tZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCisgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fbWVzc2FnZS5vcHRpb25hbF9mbG9hdCwgLW1hdGguaW5mKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX21lc3NhZ2Uub3B0aW9uYWxfZG91YmxlLCAtbWF0aC5pbmYpCisgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fbWVzc2FnZS5yZXBlYXRlZF9mbG9hdFswXSwgLW1hdGguaW5mKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX21lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzBdLCAtbWF0aC5pbmYpCisgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fZGF0YSwgZ29sZGVuX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKworICBkZWYgdGVzdE5vdEFOdW1iZXIoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIGdvbGRlbl9kYXRhID0gKGInXHg1RFx4MDBceDAwXHhDMFx4N0YnCisgICAgICAgICAgICAgICAgICAgYidceDYxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGOFx4N0YnCisgICAgICAgICAgICAgICAgICAgYidceENEXHgwMlx4MDBceDAwXHhDMFx4N0YnCisgICAgICAgICAgICAgICAgICAgYidceEQxXHgwMlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjhceDdGJykKKyAgICBnb2xkZW5fbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGdvbGRlbl9tZXNzYWdlLm9wdGlvbmFsX2Zsb2F0KSkKKyAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihnb2xkZW5fbWVzc2FnZS5vcHRpb25hbF9kb3VibGUpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGdvbGRlbl9tZXNzYWdlLnJlcGVhdGVkX2Zsb2F0WzBdKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihnb2xkZW5fbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMF0pKQorCisgICAgIyBUaGUgcHJvdG9jb2wgYnVmZmVyIG1heSBzZXJpYWxpemUgdG8gYW55IG9uZSBvZiBtdWx0aXBsZSBkaWZmZXJlbnQKKyAgICAjIHJlcHJlc2VudGF0aW9ucyBvZiBhIE5hTi4gIFJhdGhlciB0aGFuIHZlcmlmeSBhIHNwZWNpZmljIHJlcHJlc2VudGF0aW9uLAorICAgICMgdmVyaWZ5IHRoZSBzZXJpYWxpemVkIHN0cmluZyBjYW4gYmUgY29udmVydGVkIGludG8gYSBjb3JyZWN0bHkKKyAgICAjIGJlaGF2aW5nIHByb3RvY29sIGJ1ZmZlci4KKyAgICBzZXJpYWxpemVkID0gZ29sZGVuX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWVzc2FnZS5vcHRpb25hbF9mbG9hdCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWVzc2FnZS5vcHRpb25hbF9kb3VibGUpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRbMF0pKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzBdKSkKKworICBkZWYgdGVzdFBvc2l0aXZlSW5maW5pdHlQYWNrZWQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIGdvbGRlbl9kYXRhID0gKGInXHhBMlx4MDZceDA0XHgwMFx4MDBceDgwXHg3RicKKyAgICAgICAgICAgICAgICAgICBiJ1x4QUFceDA2XHgwOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceDdGJykKKyAgICBnb2xkZW5fbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RQYWNrZWRUeXBlcygpCisgICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX21lc3NhZ2UucGFja2VkX2Zsb2F0WzBdLCBtYXRoLmluZikKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9tZXNzYWdlLnBhY2tlZF9kb3VibGVbMF0sIG1hdGguaW5mKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisKKyAgZGVmIHRlc3ROZWdhdGl2ZUluZmluaXR5UGFja2VkKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBnb2xkZW5fZGF0YSA9IChiJ1x4QTJceDA2XHgwNFx4MDBceDAwXHg4MFx4RkYnCisgICAgICAgICAgICAgICAgICAgYidceEFBXHgwNlx4MDhceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEYwXHhGRicpCisgICAgZ29sZGVuX21lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0UGFja2VkVHlwZXMoKQorICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9tZXNzYWdlLnBhY2tlZF9mbG9hdFswXSwgLW1hdGguaW5mKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX21lc3NhZ2UucGFja2VkX2RvdWJsZVswXSwgLW1hdGguaW5mKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisKKyAgZGVmIHRlc3ROb3RBTnVtYmVyUGFja2VkKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBnb2xkZW5fZGF0YSA9IChiJ1x4QTJceDA2XHgwNFx4MDBceDAwXHhDMFx4N0YnCisgICAgICAgICAgICAgICAgICAgYidceEFBXHgwNlx4MDhceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEY4XHg3RicpCisgICAgZ29sZGVuX21lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0UGFja2VkVHlwZXMoKQorICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKKyAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihnb2xkZW5fbWVzc2FnZS5wYWNrZWRfZmxvYXRbMF0pKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGdvbGRlbl9tZXNzYWdlLnBhY2tlZF9kb3VibGVbMF0pKQorCisgICAgc2VyaWFsaXplZCA9IGdvbGRlbl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1lc3NhZ2UucGFja2VkX2Zsb2F0WzBdKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtZXNzYWdlLnBhY2tlZF9kb3VibGVbMF0pKQorCisgIGRlZiB0ZXN0RXh0cmVtZUZsb2F0VmFsdWVzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKworICAgICMgTW9zdCBwb3NpdGl2ZSBleHBvbmVudCwgbm8gc2lnbmlmaWNhbmQgYml0cyBzZXQuCisgICAga01vc3RQb3NFeHBvbmVudE5vU2lnQml0cyA9IG1hdGgucG93KDIsIDEyNykKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0ga01vc3RQb3NFeHBvbmVudE5vU2lnQml0cworICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9PSBrTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzKQorCisgICAgIyBNb3N0IHBvc2l0aXZlIGV4cG9uZW50LCBvbmUgc2lnbmlmaWNhbmQgYml0IHNldC4KKyAgICBrTW9zdFBvc0V4cG9uZW50T25lU2lnQml0ID0gMS41ICogbWF0aC5wb3coMiwgMTI3KQorICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSBrTW9zdFBvc0V4cG9uZW50T25lU2lnQml0CisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IGtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQpCisKKyAgICAjIFJlcGVhdCBsYXN0IHR3byBjYXNlcyB3aXRoIHZhbHVlcyBvZiBzYW1lIG1hZ25pdHVkZSwgYnV0IG5lZ2F0aXZlLgorICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSAta01vc3RQb3NFeHBvbmVudE5vU2lnQml0cworICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9PSAta01vc3RQb3NFeHBvbmVudE5vU2lnQml0cykKKworICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSAta01vc3RQb3NFeHBvbmVudE9uZVNpZ0JpdAorICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9PSAta01vc3RQb3NFeHBvbmVudE9uZVNpZ0JpdCkKKworICAgICMgTW9zdCBuZWdhdGl2ZSBleHBvbmVudCwgbm8gc2lnbmlmaWNhbmQgYml0cyBzZXQuCisgICAga01vc3ROZWdFeHBvbmVudE5vU2lnQml0cyA9IG1hdGgucG93KDIsIC0xMjcpCisgICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPT0ga01vc3ROZWdFeHBvbmVudE5vU2lnQml0cykKKworICAgICMgTW9zdCBuZWdhdGl2ZSBleHBvbmVudCwgb25lIHNpZ25pZmljYW5kIGJpdCBzZXQuCisgICAga01vc3ROZWdFeHBvbmVudE9uZVNpZ0JpdCA9IDEuNSAqIG1hdGgucG93KDIsIC0xMjcpCisgICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPT0ga01vc3ROZWdFeHBvbmVudE9uZVNpZ0JpdCkKKworICAgICMgUmVwZWF0IGxhc3QgdHdvIGNhc2VzIHdpdGggdmFsdWVzIG9mIHRoZSBzYW1lIG1hZ25pdHVkZSwgYnV0IG5lZ2F0aXZlLgorICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSAta01vc3ROZWdFeHBvbmVudE5vU2lnQml0cworICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9PSAta01vc3ROZWdFeHBvbmVudE5vU2lnQml0cykKKworICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSAta01vc3ROZWdFeHBvbmVudE9uZVNpZ0JpdAorICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9PSAta01vc3ROZWdFeHBvbmVudE9uZVNpZ0JpdCkKKworICAgICMgTWF4IDQgYnl0ZXMgZmxvYXQgdmFsdWUKKyAgICBtYXhfZmxvYXQgPSBmbG9hdC5mcm9taGV4KCcweDEuZmZmZmZlcCsxMjcnKQorICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSBtYXhfZmxvYXQKKyAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQsIG1heF9mbG9hdCkKKyAgICBzZXJpYWxpemVkX2RhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkX2RhdGEpCisgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0LCBtYXhfZmxvYXQpCisKKyAgICAjIFRlc3Qgc2V0IGRvdWJsZSB0byBmbG9hdCBmaWVsZC4KKyAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0gMy40MDI4MjM1ZSszOQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5vcHRpb25hbF9mbG9hdCwgZmxvYXQoJ2luZicpKQorICAgIHNlcmlhbGl6ZWRfZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWRfZGF0YSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQsIGZsb2F0KCdpbmYnKSkKKworICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSAtMy40MDI4MjM1ZSszOQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5vcHRpb25hbF9mbG9hdCwgZmxvYXQoJy1pbmYnKSkKKworICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSAxLjQwMjgyMzVlLTM5CisgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0LCAxLjQwMjgyMzVlLTM5KQorCisgIGRlZiB0ZXN0RXh0cmVtZURvdWJsZVZhbHVlcyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisKKyAgICAjIE1vc3QgcG9zaXRpdmUgZXhwb25lbnQsIG5vIHNpZ25pZmljYW5kIGJpdHMgc2V0LgorICAgIGtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMgPSBtYXRoLnBvdygyLCAxMDIzKQorICAgIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID0ga01vc3RQb3NFeHBvbmVudE5vU2lnQml0cworICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPT0ga01vc3RQb3NFeHBvbmVudE5vU2lnQml0cykKKworICAgICMgTW9zdCBwb3NpdGl2ZSBleHBvbmVudCwgb25lIHNpZ25pZmljYW5kIGJpdCBzZXQuCisgICAga01vc3RQb3NFeHBvbmVudE9uZVNpZ0JpdCA9IDEuNSAqIG1hdGgucG93KDIsIDEwMjMpCisgICAgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPSBrTW9zdFBvc0V4cG9uZW50T25lU2lnQml0CisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9PSBrTW9zdFBvc0V4cG9uZW50T25lU2lnQml0KQorCisgICAgIyBSZXBlYXQgbGFzdCB0d28gY2FzZXMgd2l0aCB2YWx1ZXMgb2Ygc2FtZSBtYWduaXR1ZGUsIGJ1dCBuZWdhdGl2ZS4KKyAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IC1rTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzCisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9PSAta01vc3RQb3NFeHBvbmVudE5vU2lnQml0cykKKworICAgIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID0gLWtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IC1rTW9zdFBvc0V4cG9uZW50T25lU2lnQml0KQorCisgICAgIyBNb3N0IG5lZ2F0aXZlIGV4cG9uZW50LCBubyBzaWduaWZpY2FuZCBiaXRzIHNldC4KKyAgICBrTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzID0gbWF0aC5wb3coMiwgLTEwMjMpCisgICAgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPSBrTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzCisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9PSBrTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzKQorCisgICAgIyBNb3N0IG5lZ2F0aXZlIGV4cG9uZW50LCBvbmUgc2lnbmlmaWNhbmQgYml0IHNldC4KKyAgICBrTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0ID0gMS41ICogbWF0aC5wb3coMiwgLTEwMjMpCisgICAgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPSBrTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0CisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9PSBrTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0KQorCisgICAgIyBSZXBlYXQgbGFzdCB0d28gY2FzZXMgd2l0aCB2YWx1ZXMgb2YgdGhlIHNhbWUgbWFnbml0dWRlLCBidXQgbmVnYXRpdmUuCisgICAgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPSAta01vc3ROZWdFeHBvbmVudE5vU2lnQml0cworICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPT0gLWtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMpCisKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IC1rTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0CisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9PSAta01vc3ROZWdFeHBvbmVudE9uZVNpZ0JpdCkKKworICBkZWYgdGVzdEZsb2F0UHJpbnRpbmcoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSAyLjAKKyAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihtZXNzYWdlKSwgJ29wdGlvbmFsX2Zsb2F0OiAyLjBcbicpCisKKyAgZGVmIHRlc3RIaWdoUHJlY2lzaW9uRmxvYXRQcmludGluZyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbXNnID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtc2cub3B0aW9uYWxfZmxvYXQgPSAwLjEyMzQ1Njc4OTEyMzQ1Njc4CisgICAgb2xkX2Zsb2F0ID0gbXNnLm9wdGlvbmFsX2Zsb2F0CisgICAgbXNnLlBhcnNlRnJvbVN0cmluZyhtc2cuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG9sZF9mbG9hdCwgbXNnLm9wdGlvbmFsX2Zsb2F0KQorCisgIGRlZiB0ZXN0SGlnaFByZWNpc2lvbkRvdWJsZVByaW50aW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtc2cgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG1zZy5vcHRpb25hbF9kb3VibGUgPSAwLjEyMzQ1Njc4OTEyMzQ1Njc4CisgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIobXNnKSwgJ29wdGlvbmFsX2RvdWJsZTogMC4xMjM0NTY3ODkxMjM0NTY3OFxuJykKKworICBkZWYgdGVzdFVua25vd25GaWVsZFByaW50aW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBwb3B1bGF0ZWQgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxOb25MYXp5RmllbGRzKHBvcHVsYXRlZCkKKyAgICBlbXB0eSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RFbXB0eU1lc3NhZ2UoKQorICAgIGVtcHR5LlBhcnNlRnJvbVN0cmluZyhwb3B1bGF0ZWQuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlbXB0eSksICcnKQorCisgIGRlZiB0ZXN0QXBwZW5kUmVwZWF0ZWRDb21wb3NpdGVGaWVsZChzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbXNnID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtc2cucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYXBwZW5kKAorICAgICAgICBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZShiYj0xKSkKKyAgICBuZXN0ZWQgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZShiYj0yKQorICAgIG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hcHBlbmQobmVzdGVkKQorICAgIHRyeToKKyAgICAgIG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hcHBlbmQoMSkKKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgcGFzcworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbMSwgMl0sIFttLmJiIGZvciBtIGluIG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV0pCisKKyAgZGVmIHRlc3RJbnNlcnRSZXBlYXRlZENvbXBvc2l0ZUZpZWxkKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtc2cgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5pbnNlcnQoCisgICAgICAgIC0xLCBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZShiYj0xKSkKKyAgICBzdWJfbXNnID0gbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdCisgICAgbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmluc2VydCgKKyAgICAgICAgMCwgbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoYmI9MikpCisgICAgbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmluc2VydCgKKyAgICAgICAgOTksIG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKGJiPTMpKQorICAgIG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5pbnNlcnQoCisgICAgICAgIC0yLCBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZShiYj0tMSkpCisgICAgbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmluc2VydCgKKyAgICAgICAgLTEwMDAsIG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKGJiPS0xMDAwKSkKKyAgICB0cnk6CisgICAgICBtc2cucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuaW5zZXJ0KDEsIDk5OSkKKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgcGFzcworICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgbGVuKG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbLTEwMDAsIDIsIC0xLCAxLCAzXSwKKyAgICAgICAgICAgICAgICAgICAgIFttLmJiIGZvciBtIGluIG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgc3RyKG1zZyksICdyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7XG4nCisgICAgICAgICcgIGJiOiAtMTAwMFxuJworICAgICAgICAnfVxuJworICAgICAgICAncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Uge1xuJworICAgICAgICAnICBiYjogMlxuJworICAgICAgICAnfVxuJworICAgICAgICAncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Uge1xuJworICAgICAgICAnICBiYjogLTFcbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHtcbicKKyAgICAgICAgJyAgYmI6IDFcbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHtcbicKKyAgICAgICAgJyAgYmI6IDNcbicKKyAgICAgICAgJ31cbicpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzdWJfbXNnLmJiLCAxKQorCisgIGRlZiB0ZXN0TWVyZ2VGcm9tUmVwZWF0ZWRGaWVsZChzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbXNnID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtc2cucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgbXNnLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgzKQorICAgIG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoYmI9MSkKKyAgICBtc2cucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKGJiPTIpCisgICAgb3RoZXJfbXNnID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBvdGhlcl9tc2cucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKGJiPTMpCisgICAgb3RoZXJfbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZChiYj00KQorICAgIG90aGVyX21zZy5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNSkKKyAgICBvdGhlcl9tc2cucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDcpCisKKyAgICBtc2cucmVwZWF0ZWRfaW50MzIuTWVyZ2VGcm9tKG90aGVyX21zZy5yZXBlYXRlZF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIGxlbihtc2cucmVwZWF0ZWRfaW50MzIpKQorCisgICAgbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLk1lcmdlRnJvbShvdGhlcl9tc2cucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbMSwgMiwgMywgNF0sIFttLmJiIGZvciBtIGluIG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV0pCisKKyAgZGVmIHRlc3RBZGRXcm9uZ1JlcGVhdGVkTmVzdGVkRmllbGQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG1zZyA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgdHJ5OgorICAgICAgbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgnd3JvbmcnKQorICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICBwYXNzCisgICAgdHJ5OgorICAgICAgbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCh2YWx1ZV9maWVsZD0nd3JvbmcnKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgcGFzcworICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSksIDApCisKKyAgZGVmIHRlc3RSZXBlYXRlZENvbnRhaW5zKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtc2cgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG1zZy5yZXBlYXRlZF9pbnQzMi5leHRlbmQoWzEsIDIsIDNdKQorICAgIHNlbGYuYXNzZXJ0SW4oMiwgbXNnLnJlcGVhdGVkX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0Tm90SW4oMCwgbXNnLnJlcGVhdGVkX2ludDMyKQorCisgICAgbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZChiYj0xKQorICAgIHN1Yl9tc2cxID0gbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdCisgICAgc3ViX21zZzIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZShiYj0yKQorICAgIHN1Yl9tc2czID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoYmI9MykKKyAgICBtc2cucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYXBwZW5kKHN1Yl9tc2cyKQorICAgIG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5pbnNlcnQoMCwgc3ViX21zZzMpCisgICAgc2VsZi5hc3NlcnRJbihzdWJfbXNnMSwgbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0SW4oc3ViX21zZzIsIG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEluKHN1Yl9tc2czLCBtc2cucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhckl0ZXJhYmxlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtc2cgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG1zZy5yZXBlYXRlZF9pbnQzMi5leHRlbmQoWzEsIDIsIDNdKQorICAgIGFkZCA9IDAKKyAgICBmb3IgaXRlbSBpbiBtc2cucmVwZWF0ZWRfaW50MzI6CisgICAgICBhZGQgKz0gaXRlbQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWRkLCA2KQorCisgIGRlZiB0ZXN0UmVwZWF0ZWROZXN0ZWRGaWVsZEl0ZXJhdGlvbihzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbXNnID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtc2cucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKGJiPTEpCisgICAgbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZChiYj0yKQorICAgIG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoYmI9MykKKyAgICBtc2cucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKGJiPTQpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKFsxLCAyLCAzLCA0XSwgW20uYmIgZm9yIG0gaW4gbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFs0LCAzLCAyLCAxXSwKKyAgICAgICAgICAgICAgICAgICAgIFttLmJiIGZvciBtIGluIHJldmVyc2VkKG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSldKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzQsIDMsIDIsIDFdLAorICAgICAgICAgICAgICAgICAgICAgW20uYmIgZm9yIG0gaW4gbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzo6LTFdXSkKKworICBkZWYgdGVzdFNvcnRpbmdSZXBlYXRlZFNjYWxhckZpZWxkc0RlZmF1bHRDb21wYXJhdG9yKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJDaGVjayBzb21lIGRpZmZlcmVudCB0eXBlcyB3aXRoIHRoZSBkZWZhdWx0IGNvbXBhcmF0b3IuIiIiCisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisKKyAgICAjIFRPRE8obWF0dHApOiB3b3VsZCB0ZXN0aW5nIG1vcmUgc2NhbGFyIHR5cGVzIHN0cmVuZ3RoZW4gdGVzdD8KKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDMpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMikKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLnNvcnQoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9pbnQzMlswXSwgMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMV0sIDIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2ludDMyWzJdLCAzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIpLCBzdHIoWzEsIDIsIDNdKSkKKworICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKDEuMSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LmFwcGVuZCgxLjMpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMS4yKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuc29ydCgpCisgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0WzBdLCAxLjEpCisgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0WzFdLCAxLjIpCisgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0WzJdLCAxLjMpCisKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2EnKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnYycpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdiJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5zb3J0KCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzBdLCAnYScpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1sxXSwgJ2InKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMl0sICdjJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyksIHN0cihbdSdhJywgdSdiJywgdSdjJ10pKQorCisgICAgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcy5hcHBlbmQoYidhJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzLmFwcGVuZChiJ2MnKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMuYXBwZW5kKGInYicpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcy5zb3J0KCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXNbMF0sIGInYScpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2J5dGVzWzFdLCBiJ2InKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9ieXRlc1syXSwgYidjJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihtZXNzYWdlLnJlcGVhdGVkX2J5dGVzKSwgc3RyKFtiJ2EnLCBiJ2InLCBiJ2MnXSkpCisKKyAgZGVmIHRlc3RTb3J0aW5nUmVwZWF0ZWRTY2FsYXJGaWVsZHNDdXN0b21Db21wYXJhdG9yKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJDaGVjayBzb21lIGRpZmZlcmVudCB0eXBlcyB3aXRoIGN1c3RvbSBjb21wYXJhdG9yLiIiIgorICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoLTMpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoLTIpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoLTEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5zb3J0KGtleT1hYnMpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2ludDMyWzBdLCAtMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMV0sIC0yKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9pbnQzMlsyXSwgLTMpCisKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2FhYScpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdiYicpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdjJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5zb3J0KGtleT1sZW4pCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1swXSwgJ2MnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMV0sICdiYicpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1syXSwgJ2FhYScpCisKKyAgZGVmIHRlc3RTb3J0aW5nUmVwZWF0ZWRDb21wb3NpdGVGaWVsZHNDdXN0b21Db21wYXJhdG9yKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJDaGVjayBwYXNzaW5nIGEgY3VzdG9tIGNvbXBhcmF0b3IgdG8gc29ydCBhIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZC4iIiIKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKworICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAxCisgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDMKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMgorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSA2CisgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDUKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gNAorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Uuc29ydChrZXk9b3BlcmF0b3IuYXR0cmdldHRlcignYmInKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uYmIsIDEpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzFdLmJiLCAyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsyXS5iYiwgMykKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbM10uYmIsIDQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzRdLmJiLCA1KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVs1XS5iYiwgNikKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBzdHIobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSksCisgICAgICAgICdbYmI6IDFcbiwgYmI6IDJcbiwgYmI6IDNcbiwgYmI6IDRcbiwgYmI6IDVcbiwgYmI6IDZcbl0nKQorCisgIGRlZiB0ZXN0U29ydGluZ1JlcGVhdGVkQ29tcG9zaXRlRmllbGRzU3RhYmxlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJDaGVjayBwYXNzaW5nIGEgY3VzdG9tIGNvbXBhcmF0b3IgdG8gc29ydCBhIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZC4iIiIKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKworICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAyMQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAyMAorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAxMworICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAzMworICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAxMQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAyNAorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAxMAorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Uuc29ydChrZXk9bGFtYmRhIHo6IHouYmIgLy8gMTApCisgICAgc2VsZi5hc3NlcnRFcXVhbChbMTMsIDExLCAxMCwgMjEsIDIwLCAyNCwgMzNdLAorICAgICAgICAgICAgICAgICAgICAgW24uYmIgZm9yIG4gaW4gbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV0pCisKKyAgICAjIE1ha2Ugc3VyZSB0aGF0IGZvciB0aGUgQysrIGltcGxlbWVudGF0aW9uLCB0aGUgdW5kZXJseWluZyBmaWVsZHMKKyAgICAjIGFyZSBhY3R1YWxseSByZW9yZGVyZWQuCisgICAgcGIgPSBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBtZXNzYWdlLkNsZWFyKCkKKyAgICBtZXNzYWdlLk1lcmdlRnJvbVN0cmluZyhwYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKFsxMywgMTEsIDEwLCAyMSwgMjAsIDI0LCAzM10sCisgICAgICAgICAgICAgICAgICAgICBbbi5iYiBmb3IgbiBpbiBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlXSkKKworICBkZWYgdGVzdFJlcGVhdGVkQ29tcG9zaXRlRmllbGRTb3J0QXJndW1lbnRzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJDaGVjayBzb3J0aW5nIGEgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkIHVzaW5nIGxpc3Quc29ydCgpIGFyZ3VtZW50cy4iIiIKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKworICAgIGdldF9iYiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoJ2JiJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAzCisgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDIKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gNgorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSA1CisgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDQKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnNvcnQoa2V5PWdldF9iYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKFtrLmJiIGZvciBrIGluIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VdLAorICAgICAgICAgICAgICAgICAgICAgWzEsIDIsIDMsIDQsIDUsIDZdKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Uuc29ydChrZXk9Z2V0X2JiLCByZXZlcnNlPVRydWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbay5iYiBmb3IgayBpbiBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlXSwKKyAgICAgICAgICAgICAgICAgICAgIFs2LCA1LCA0LCAzLCAyLCAxXSkKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyRmllbGRTb3J0QXJndW1lbnRzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJDaGVjayBzb3J0aW5nIGEgc2NhbGFyIGZpZWxkIHVzaW5nIGxpc3Quc29ydCgpIGFyZ3VtZW50cy4iIiIKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKworICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0zKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0yKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0xKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuc29ydChrZXk9YWJzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZXNzYWdlLnJlcGVhdGVkX2ludDMyKSwgWy0xLCAtMiwgLTNdKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuc29ydChrZXk9YWJzLCByZXZlcnNlPVRydWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIpLCBbLTMsIC0yLCAtMV0pCisKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2FhYScpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdiYicpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdjJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5zb3J0KGtleT1sZW4pCisgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKSwgWydjJywgJ2JiJywgJ2FhYSddKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLnNvcnQoa2V5PWxlbiwgcmV2ZXJzZT1UcnVlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyksIFsnYWFhJywgJ2JiJywgJ2MnXSkKKworICBkZWYgdGVzdFJlcGVhdGVkRmllbGRzQ29tcGFyYWJsZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbTEgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG0yID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtMS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMCkKKyAgICBtMS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMSkKKyAgICBtMS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMikKKyAgICBtMi5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMCkKKyAgICBtMi5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMSkKKyAgICBtMi5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMikKKyAgICBtMS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDEKKyAgICBtMS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDIKKyAgICBtMS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDMKKyAgICBtMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDEKKyAgICBtMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDIKKyAgICBtMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDMKKworICBkZWYgdGVzdFJlcGVhdGVkRmllbGRzQXJlU2VxdWVuY2VzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobS5yZXBlYXRlZF9pbnQzMiwgY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXF1ZW5jZSkKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXF1ZW5jZSkKKworICBkZWYgdGVzdFJlcGVhdGVkRmllbGRzTm90SGFzaGFibGUoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgIGhhc2gobS5yZXBlYXRlZF9pbnQzMikKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICBoYXNoKG0ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RSZXBlYXRlZEZpZWxkSW5zaWRlTmVzdGVkTWVzc2FnZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbSA9IG1lc3NhZ2VfbW9kdWxlLk5lc3RlZFRlc3RBbGxUeXBlcygpCisgICAgbS5wYXlsb2FkLnJlcGVhdGVkX2ludDMyLmV4dGVuZChbXSkKKyAgICBzZWxmLmFzc2VydFRydWUobS5IYXNGaWVsZCgncGF5bG9hZCcpKQorCisgIGRlZiB0ZXN0TWVyZ2VGcm9tKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtMSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgbTIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgICMgQ3BwIGV4dGVuc2lvbiB3aWxsIGxhemlseSBjcmVhdGUgYSBzdWIgbWVzc2FnZSB3aGljaCBpcyBpbW11dGFibGUuCisgICAgbmVzdGVkID0gbTEub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG5lc3RlZC5iYikKKyAgICBtMi5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDEKKyAgICAjIE1ha2Ugc3VyZSBjbWVzc2FnZSBwb2ludGluZyB0byBhIG11dGFibGUgbWVzc2FnZSBhZnRlciBtZXJnZSBpbnN0ZWFkIG9mCisgICAgIyB0aGUgbGF6aWx5IGNyZWF0ZWQgbWVzc2FnZS4KKyAgICBtMS5NZXJnZUZyb20obTIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBuZXN0ZWQuYmIpCisKKyAgICAjIFRlc3QgbW9yZSBuZXN0ZWQgc3ViIG1lc3NhZ2UuCisgICAgbXNnMSA9IG1lc3NhZ2VfbW9kdWxlLk5lc3RlZFRlc3RBbGxUeXBlcygpCisgICAgbXNnMiA9IG1lc3NhZ2VfbW9kdWxlLk5lc3RlZFRlc3RBbGxUeXBlcygpCisgICAgbmVzdGVkID0gbXNnMS5jaGlsZC5wYXlsb2FkLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBuZXN0ZWQuYmIpCisgICAgbXNnMi5jaGlsZC5wYXlsb2FkLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMQorICAgIG1zZzEuTWVyZ2VGcm9tKG1zZzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBuZXN0ZWQuYmIpCisKKyAgICAjIFRlc3QgcmVwZWF0ZWQgZmllbGQuCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cxLnBheWxvYWQucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICBtc2cxLnBheWxvYWQucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisgICAgbmVzdGVkID0gbXNnMi5wYXlsb2FkLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbmVzdGVkLmJiID0gMQorICAgIG1zZzEuTWVyZ2VGcm9tKG1zZzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4obXNnMS5wYXlsb2FkLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIG5lc3RlZC5iYikKKworICBkZWYgdGVzdE1lcmdlRnJvbVN0cmluZyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbTEgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG0yID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICAjIENwcCBleHRlbnNpb24gd2lsbCBsYXppbHkgY3JlYXRlIGEgc3ViIG1lc3NhZ2Ugd2hpY2ggaXMgaW1tdXRhYmxlLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbTEub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisgICAgbTIub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgPSAxCisgICAgIyBNYWtlIHN1cmUgY21lc3NhZ2UgcG9pbnRpbmcgdG8gYSBtdXRhYmxlIG1lc3NhZ2UgYWZ0ZXIgbWVyZ2UgaW5zdGVhZCBvZgorICAgICMgdGhlIGxhemlseSBjcmVhdGVkIG1lc3NhZ2UuCisgICAgbTEuTWVyZ2VGcm9tU3RyaW5nKG0yLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBtMS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYikKKworICBkZWYgdGVzdE1lcmdlRnJvbVN0cmluZ1VzaW5nTWVtb3J5VmlldyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbTIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG0yLm9wdGlvbmFsX3N0cmluZyA9ICdzY2FsYXIgc3RyaW5nJworICAgIG0yLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ3JlcGVhdGVkIHN0cmluZycpCisgICAgbTIub3B0aW9uYWxfYnl0ZXMgPSBiJ3NjYWxhciBieXRlcycKKyAgICBtMi5yZXBlYXRlZF9ieXRlcy5hcHBlbmQoYidyZXBlYXRlZCBieXRlcycpCisKKyAgICBzZXJpYWxpemVkID0gbTIuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIG1lbXZpZXcgPSBtZW1vcnl2aWV3KHNlcmlhbGl6ZWQpCisgICAgbTEgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuRnJvbVN0cmluZyhtZW12aWV3KQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChtMS5vcHRpb25hbF9ieXRlcywgYidzY2FsYXIgYnl0ZXMnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobTEucmVwZWF0ZWRfYnl0ZXMsIFtiJ3JlcGVhdGVkIGJ5dGVzJ10pCisgICAgc2VsZi5hc3NlcnRFcXVhbChtMS5vcHRpb25hbF9zdHJpbmcsICdzY2FsYXIgc3RyaW5nJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKG0xLnJlcGVhdGVkX3N0cmluZywgWydyZXBlYXRlZCBzdHJpbmcnXSkKKyAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBtZW1vcnl2aWV3IHdhcyBjb3JyZWN0bHkgY29udmVydGVkIHRvIGJ5dGVzLCBhbmQKKyAgICAjIHRoYXQgYSBzdWItc2xpY2VkIG1lbW9yeXZpZXcgaXMgbm90IGJlaW5nIHVzZWQuCisgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG0xLm9wdGlvbmFsX2J5dGVzLCBieXRlcykKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobTEucmVwZWF0ZWRfYnl0ZXNbMF0sIGJ5dGVzKQorICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtMS5vcHRpb25hbF9zdHJpbmcsIHN0cikKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobTEucmVwZWF0ZWRfc3RyaW5nWzBdLCBzdHIpCisKKyAgZGVmIHRlc3RNZXJnZUZyb21FbXB0eShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbTEgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgICMgQ3BwIGV4dGVuc2lvbiB3aWxsIGxhemlseSBjcmVhdGUgYSBzdWIgbWVzc2FnZSB3aGljaCBpcyBpbW11dGFibGUuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtMS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYikKKyAgICBzZWxmLmFzc2VydEZhbHNlKG0xLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorICAgICMgTWFrZSBzdXJlIHRoZSBzdWIgbWVzc2FnZSBpcyBzdGlsbCBpbW11dGFibGUgYWZ0ZXIgbWVyZ2UgZnJvbSBlbXB0eS4KKyAgICBtMS5NZXJnZUZyb21TdHJpbmcoYicnKSAgIyBmaWVsZCBzdGF0ZSBzaG91bGQgbm90IGNoYW5nZQorICAgIHNlbGYuYXNzZXJ0RmFsc2UobTEuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisKKyAgZGVmIGVuc3VyZU5lc3RlZE1lc3NhZ2VFeGlzdHMoc2VsZiwgbXNnLCBhdHRyaWJ1dGUpOgorICAgICIiIk1ha2Ugc3VyZSB0aGF0IGEgbmVzdGVkIG1lc3NhZ2Ugb2JqZWN0IGV4aXN0cy4KKworICAgIEFzIHNvb24gYXMgYSBuZXN0ZWQgbWVzc2FnZSBhdHRyaWJ1dGUgaXMgYWNjZXNzZWQsIGl0IHdpbGwgYmUgcHJlc2VudCBpbiB0aGUKKyAgICBfZmllbGRzIGRpY3QsIHdpdGhvdXQgYmVpbmcgbWFya2VkIGFzIGFjdHVhbGx5IGJlaW5nIHNldC4KKyAgICAiIiIKKyAgICBnZXRhdHRyKG1zZywgYXR0cmlidXRlKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLkhhc0ZpZWxkKGF0dHJpYnV0ZSkpCisKKyAgZGVmIHRlc3RPbmVvZkdldENhc2VOb25leGlzdGluZ0ZpZWxkKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLldoaWNoT25lb2YsICdub19zdWNoX29uZW9mX2ZpZWxkJykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIG0uV2hpY2hPbmVvZiwgMCkKKworICBkZWYgdGVzdE9uZW9mRGVmYXVsdFZhbHVlcyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRJcyhOb25lLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCisgICAgc2VsZi5hc3NlcnRGYWxzZShtLkhhc0ZpZWxkKCdvbmVvZl9maWVsZCcpKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UobS5IYXNGaWVsZCgnb25lb2ZfdWludDMyJykpCisKKyAgICAjIE9uZW9mIGlzIHNldCBldmVuIHdoZW4gc2V0dGluZyBpdCB0byBhIGRlZmF1bHQgdmFsdWUuCisgICAgbS5vbmVvZl91aW50MzIgPSAwCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnb25lb2ZfdWludDMyJywgbS5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLkhhc0ZpZWxkKCdvbmVvZl9maWVsZCcpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLkhhc0ZpZWxkKCdvbmVvZl91aW50MzInKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG0uSGFzRmllbGQoJ29uZW9mX3N0cmluZycpKQorCisgICAgbS5vbmVvZl9zdHJpbmcgPSAnJworICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29uZW9mX3N0cmluZycsIG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKKyAgICBzZWxmLmFzc2VydFRydWUobS5IYXNGaWVsZCgnb25lb2Zfc3RyaW5nJykpCisgICAgc2VsZi5hc3NlcnRGYWxzZShtLkhhc0ZpZWxkKCdvbmVvZl91aW50MzInKSkKKworICBkZWYgdGVzdE9uZW9mU2VtYW50aWNzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydElzKE5vbmUsIG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKKworICAgIG0ub25lb2ZfdWludDMyID0gMTEKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl91aW50MzInLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKG0uSGFzRmllbGQoJ29uZW9mX3VpbnQzMicpKQorCisgICAgbS5vbmVvZl9zdHJpbmcgPSB1J2ZvbycKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl9zdHJpbmcnLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCisgICAgc2VsZi5hc3NlcnRGYWxzZShtLkhhc0ZpZWxkKCdvbmVvZl91aW50MzInKSkKKyAgICBzZWxmLmFzc2VydFRydWUobS5IYXNGaWVsZCgnb25lb2Zfc3RyaW5nJykpCisKKyAgICAjIFJlYWQgbmVzdGVkIG1lc3NhZ2UgYWNjZXNzb3Igd2l0aG91dCBhY2Nlc3Npbmcgc3VibWVzc2FnZS4KKyAgICBtLm9uZW9mX25lc3RlZF9tZXNzYWdlCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnb25lb2Zfc3RyaW5nJywgbS5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLkhhc0ZpZWxkKCdvbmVvZl9zdHJpbmcnKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG0uSGFzRmllbGQoJ29uZW9mX25lc3RlZF9tZXNzYWdlJykpCisKKyAgICAjIFJlYWQgYWNjZXNzb3Igb2YgbmVzdGVkIG1lc3NhZ2Ugd2l0aG91dCBhY2Nlc3Npbmcgc3VibWVzc2FnZS4KKyAgICBtLm9uZW9mX25lc3RlZF9tZXNzYWdlLmJiCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnb25lb2Zfc3RyaW5nJywgbS5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLkhhc0ZpZWxkKCdvbmVvZl9zdHJpbmcnKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG0uSGFzRmllbGQoJ29uZW9mX25lc3RlZF9tZXNzYWdlJykpCisKKyAgICBtLm9uZW9mX25lc3RlZF9tZXNzYWdlLmJiID0gMTEKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl9uZXN0ZWRfbWVzc2FnZScsIG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG0uSGFzRmllbGQoJ29uZW9mX3N0cmluZycpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLkhhc0ZpZWxkKCdvbmVvZl9uZXN0ZWRfbWVzc2FnZScpKQorCisgICAgbS5vbmVvZl9ieXRlcyA9IGInYmInCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnb25lb2ZfYnl0ZXMnLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCisgICAgc2VsZi5hc3NlcnRGYWxzZShtLkhhc0ZpZWxkKCdvbmVvZl9uZXN0ZWRfbWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLkhhc0ZpZWxkKCdvbmVvZl9ieXRlcycpKQorCisgIGRlZiB0ZXN0T25lb2ZDb21wb3NpdGVGaWVsZFJlYWRBY2Nlc3Moc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG0ub25lb2ZfdWludDMyID0gMTEKKworICAgIHNlbGYuZW5zdXJlTmVzdGVkTWVzc2FnZUV4aXN0cyhtLCAnb25lb2ZfbmVzdGVkX21lc3NhZ2UnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29uZW9mX3VpbnQzMicsIG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDExLCBtLm9uZW9mX3VpbnQzMikKKworICBkZWYgdGVzdE9uZW9mV2hpY2hPbmVvZihzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRJcyhOb25lLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCisgICAgaWYgbWVzc2FnZV9tb2R1bGUgaXMgdW5pdHRlc3RfcGIyOgorICAgICAgc2VsZi5hc3NlcnRGYWxzZShtLkhhc0ZpZWxkKCdvbmVvZl9maWVsZCcpKQorCisgICAgbS5vbmVvZl91aW50MzIgPSAxMQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29uZW9mX3VpbnQzMicsIG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKKyAgICBpZiBtZXNzYWdlX21vZHVsZSBpcyB1bml0dGVzdF9wYjI6CisgICAgICBzZWxmLmFzc2VydFRydWUobS5IYXNGaWVsZCgnb25lb2ZfZmllbGQnKSkKKworICAgIG0ub25lb2ZfYnl0ZXMgPSBiJ2JiJworICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29uZW9mX2J5dGVzJywgbS5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQorCisgICAgbS5DbGVhckZpZWxkKCdvbmVvZl9ieXRlcycpCisgICAgc2VsZi5hc3NlcnRJcyhOb25lLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCisgICAgaWYgbWVzc2FnZV9tb2R1bGUgaXMgdW5pdHRlc3RfcGIyOgorICAgICAgc2VsZi5hc3NlcnRGYWxzZShtLkhhc0ZpZWxkKCdvbmVvZl9maWVsZCcpKQorCisgIGRlZiB0ZXN0T25lb2ZDbGVhckZpZWxkKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtLm9uZW9mX3VpbnQzMiA9IDExCisgICAgbS5DbGVhckZpZWxkKCdvbmVvZl9maWVsZCcpCisgICAgaWYgbWVzc2FnZV9tb2R1bGUgaXMgdW5pdHRlc3RfcGIyOgorICAgICAgc2VsZi5hc3NlcnRGYWxzZShtLkhhc0ZpZWxkKCdvbmVvZl9maWVsZCcpKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UobS5IYXNGaWVsZCgnb25lb2ZfdWludDMyJykpCisgICAgc2VsZi5hc3NlcnRJcyhOb25lLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCisKKyAgZGVmIHRlc3RPbmVvZkNsZWFyU2V0RmllbGQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG0ub25lb2ZfdWludDMyID0gMTEKKyAgICBtLkNsZWFyRmllbGQoJ29uZW9mX3VpbnQzMicpCisgICAgaWYgbWVzc2FnZV9tb2R1bGUgaXMgdW5pdHRlc3RfcGIyOgorICAgICAgc2VsZi5hc3NlcnRGYWxzZShtLkhhc0ZpZWxkKCdvbmVvZl9maWVsZCcpKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UobS5IYXNGaWVsZCgnb25lb2ZfdWludDMyJykpCisgICAgc2VsZi5hc3NlcnRJcyhOb25lLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCisKKyAgZGVmIHRlc3RPbmVvZkNsZWFyVW5zZXRGaWVsZChzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgbS5vbmVvZl91aW50MzIgPSAxMQorICAgIHNlbGYuZW5zdXJlTmVzdGVkTWVzc2FnZUV4aXN0cyhtLCAnb25lb2ZfbmVzdGVkX21lc3NhZ2UnKQorICAgIG0uQ2xlYXJGaWVsZCgnb25lb2ZfbmVzdGVkX21lc3NhZ2UnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTEsIG0ub25lb2ZfdWludDMyKQorICAgIGlmIG1lc3NhZ2VfbW9kdWxlIGlzIHVuaXR0ZXN0X3BiMjoKKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLkhhc0ZpZWxkKCdvbmVvZl9maWVsZCcpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLkhhc0ZpZWxkKCdvbmVvZl91aW50MzInKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl91aW50MzInLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCisKKyAgZGVmIHRlc3RPbmVvZkRlc2VyaWFsaXplKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtLm9uZW9mX3VpbnQzMiA9IDExCisgICAgbTIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG0yLlBhcnNlRnJvbVN0cmluZyhtLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnb25lb2ZfdWludDMyJywgbTIuV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKKworICBkZWYgdGVzdE9uZW9mQ29weUZyb20oc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG0ub25lb2ZfdWludDMyID0gMTEKKyAgICBtMiA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgbTIuQ29weUZyb20obSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl91aW50MzInLCBtMi5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQorCisgIGRlZiB0ZXN0T25lb2ZOZXN0ZWRNZXJnZUZyb20oc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5OZXN0ZWRUZXN0QWxsVHlwZXMoKQorICAgIG0ucGF5bG9hZC5vbmVvZl91aW50MzIgPSAxMQorICAgIG0yID0gbWVzc2FnZV9tb2R1bGUuTmVzdGVkVGVzdEFsbFR5cGVzKCkKKyAgICBtMi5wYXlsb2FkLm9uZW9mX2J5dGVzID0gYidiYicKKyAgICBtMi5jaGlsZC5wYXlsb2FkLm9uZW9mX2J5dGVzID0gYidiYicKKyAgICBtMi5NZXJnZUZyb20obSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl91aW50MzInLCBtMi5wYXlsb2FkLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnb25lb2ZfYnl0ZXMnLCBtMi5jaGlsZC5wYXlsb2FkLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCisKKyAgZGVmIHRlc3RPbmVvZk1lc3NhZ2VNZXJnZUZyb20oc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5OZXN0ZWRUZXN0QWxsVHlwZXMoKQorICAgIG0ucGF5bG9hZC5vbmVvZl9uZXN0ZWRfbWVzc2FnZS5iYiA9IDExCisgICAgbS5jaGlsZC5wYXlsb2FkLm9uZW9mX25lc3RlZF9tZXNzYWdlLmJiID0gMTIKKyAgICBtMiA9IG1lc3NhZ2VfbW9kdWxlLk5lc3RlZFRlc3RBbGxUeXBlcygpCisgICAgbTIucGF5bG9hZC5vbmVvZl91aW50MzIgPSAxMworICAgIG0yLk1lcmdlRnJvbShtKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29uZW9mX25lc3RlZF9tZXNzYWdlJywKKyAgICAgICAgICAgICAgICAgICAgIG0yLnBheWxvYWQuV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl9uZXN0ZWRfbWVzc2FnZScsCisgICAgICAgICAgICAgICAgICAgICBtMi5jaGlsZC5wYXlsb2FkLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCisKKyAgZGVmIHRlc3RPbmVvZk5lc3RlZE1lc3NhZ2VJbml0KHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKAorICAgICAgICBvbmVvZl9uZXN0ZWRfbWVzc2FnZT1tZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29uZW9mX25lc3RlZF9tZXNzYWdlJywgbS5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQorCisgIGRlZiB0ZXN0T25lb2ZDbGVhcihzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgbS5vbmVvZl91aW50MzIgPSAxMQorICAgIG0uQ2xlYXIoKQorICAgIHNlbGYuYXNzZXJ0SXNOb25lKG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKKyAgICBtLm9uZW9mX2J5dGVzID0gYidiYicKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl9ieXRlcycsIG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKKworICBkZWYgdGVzdEFzc2lnbkJ5dGVTdHJpbmdUb1VuaWNvZGVGaWVsZChzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgIiIiQXNzaWduaW5nIGEgYnl0ZSBzdHJpbmcgdG8gYSBzdHJpbmcgZmllbGQgc2hvdWxkIHJlc3VsdAorCisgICAgaW4gdGhlIHZhbHVlIGJlaW5nIGNvbnZlcnRlZCB0byBhIFVuaWNvZGUgc3RyaW5nLgorICAgICIiIgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG0ub3B0aW9uYWxfc3RyaW5nID0gc3RyKCcnKQorICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtLm9wdGlvbmFsX3N0cmluZywgc3RyKQorCisgIGRlZiB0ZXN0TG9uZ1ZhbHVlZFNsaWNlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gdXNlIGludC12YWx1ZWQgaW5kaWNlcyBpbiBzbGljZXMuCisKKyAgICBUaGlzIGRpZG4ndCB1c2VkIHRvIHdvcmsgaW4gdGhlIHYyIEMrKyBpbXBsZW1lbnRhdGlvbi4KKyAgICAiIiIKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKworICAgICMgUmVwZWF0ZWQgc2NhbGFyCisgICAgbS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMSkKKyAgICBzbCA9IG0ucmVwZWF0ZWRfaW50MzJbaW50KDApOmludChsZW4obS5yZXBlYXRlZF9pbnQzMikpXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG0ucmVwZWF0ZWRfaW50MzIpLCBsZW4oc2wpKQorCisgICAgIyBSZXBlYXRlZCBjb21wb3NpdGUKKyAgICBtLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMworICAgIHNsID0gbS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVtpbnQoMCk6aW50KGxlbihtLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSldCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSksIGxlbihzbCkpCisKKyAgZGVmIHRlc3RFeHRlbmRTaG91bGROb3RTd2FsbG93RXhjZXB0aW9ucyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgIiIiVGhpcyBkaWRuJ3QgdXNlIHRvIHdvcmsgaW4gdGhlIHYyIEMrKyBpbXBsZW1lbnRhdGlvbi4iIiIKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE5hbWVFcnJvcikgYXMgXzoKKyAgICAgIG0ucmVwZWF0ZWRfaW50MzIuZXh0ZW5kKGEgZm9yIGkgaW4gcmFuZ2UoMTApKSAgIyBweWxpbnQ6IGRpc2FibGU9dW5kZWZpbmVkLXZhcmlhYmxlCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhOYW1lRXJyb3IpIGFzIF86CisgICAgICBtLnJlcGVhdGVkX25lc3RlZF9lbnVtLmV4dGVuZChhIGZvciBpIGluIHJhbmdlKDEwKSkgICMgcHlsaW50OiBkaXNhYmxlPXVuZGVmaW5lZC12YXJpYWJsZQorCisgIEZBTFNZX1ZBTFVFUyA9IFtOb25lLCBGYWxzZSwgMCwgMC4wLCBiJycsIHUnJywgYnl0ZWFycmF5KCksIFtdLCB7fSwgc2V0KCldCisKKyAgZGVmIHRlc3RFeHRlbmRJbnQzMldpdGhOb3RoaW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJUZXN0IG5vLW9wcyBleHRlbmRpbmcgcmVwZWF0ZWQgaW50MzIgZmllbGRzLiIiIgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbXSwgbS5yZXBlYXRlZF9pbnQzMikKKworICAgICMgVE9ETyhwdHVja2VyKTogRGVwcmVjYXRlIHRoaXMgYmVoYXZpb3IuIGIvMTg0MTM4NjIKKyAgICBmb3IgZmFsc3lfdmFsdWUgaW4gTWVzc2FnZVRlc3QuRkFMU1lfVkFMVUVTOgorICAgICAgbS5yZXBlYXRlZF9pbnQzMi5leHRlbmQoZmFsc3lfdmFsdWUpCisgICAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfaW50MzIpCisKKyAgICBtLnJlcGVhdGVkX2ludDMyLmV4dGVuZChbXSkKKyAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfaW50MzIpCisKKyAgZGVmIHRlc3RFeHRlbmRGbG9hdFdpdGhOb3RoaW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJUZXN0IG5vLW9wcyBleHRlbmRpbmcgcmVwZWF0ZWQgZmxvYXQgZmllbGRzLiIiIgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbXSwgbS5yZXBlYXRlZF9mbG9hdCkKKworICAgICMgVE9ETyhwdHVja2VyKTogRGVwcmVjYXRlIHRoaXMgYmVoYXZpb3IuIGIvMTg0MTM4NjIKKyAgICBmb3IgZmFsc3lfdmFsdWUgaW4gTWVzc2FnZVRlc3QuRkFMU1lfVkFMVUVTOgorICAgICAgbS5yZXBlYXRlZF9mbG9hdC5leHRlbmQoZmFsc3lfdmFsdWUpCisgICAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfZmxvYXQpCisKKyAgICBtLnJlcGVhdGVkX2Zsb2F0LmV4dGVuZChbXSkKKyAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfZmxvYXQpCisKKyAgZGVmIHRlc3RFeHRlbmRTdHJpbmdXaXRoTm90aGluZyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgIiIiVGVzdCBuby1vcHMgZXh0ZW5kaW5nIHJlcGVhdGVkIHN0cmluZyBmaWVsZHMuIiIiCisgICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFtdLCBtLnJlcGVhdGVkX3N0cmluZykKKworICAgICMgVE9ETyhwdHVja2VyKTogRGVwcmVjYXRlIHRoaXMgYmVoYXZpb3IuIGIvMTg0MTM4NjIKKyAgICBmb3IgZmFsc3lfdmFsdWUgaW4gTWVzc2FnZVRlc3QuRkFMU1lfVkFMVUVTOgorICAgICAgbS5yZXBlYXRlZF9zdHJpbmcuZXh0ZW5kKGZhbHN5X3ZhbHVlKQorICAgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFtdLCBtLnJlcGVhdGVkX3N0cmluZykKKworICAgIG0ucmVwZWF0ZWRfc3RyaW5nLmV4dGVuZChbXSkKKyAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfc3RyaW5nKQorCisgIGRlZiB0ZXN0RXh0ZW5kSW50MzJXaXRoUHl0aG9uTGlzdChzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgIiIiVGVzdCBleHRlbmRpbmcgcmVwZWF0ZWQgaW50MzIgZmllbGRzIHdpdGggcHl0aG9uIGxpc3RzLiIiIgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbXSwgbS5yZXBlYXRlZF9pbnQzMikKKyAgICBtLnJlcGVhdGVkX2ludDMyLmV4dGVuZChbMF0pCisgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFswXSwgbS5yZXBlYXRlZF9pbnQzMikKKyAgICBtLnJlcGVhdGVkX2ludDMyLmV4dGVuZChbMSwgMl0pCisgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFswLCAxLCAyXSwgbS5yZXBlYXRlZF9pbnQzMikKKyAgICBtLnJlcGVhdGVkX2ludDMyLmV4dGVuZChbMywgNF0pCisgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFswLCAxLCAyLCAzLCA0XSwgbS5yZXBlYXRlZF9pbnQzMikKKworICBkZWYgdGVzdEV4dGVuZEZsb2F0V2l0aFB5dGhvbkxpc3Qoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgICIiIlRlc3QgZXh0ZW5kaW5nIHJlcGVhdGVkIGZsb2F0IGZpZWxkcyB3aXRoIHB5dGhvbiBsaXN0cy4iIiIKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfZmxvYXQpCisgICAgbS5yZXBlYXRlZF9mbG9hdC5leHRlbmQoWzAuMF0pCisgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFswLjBdLCBtLnJlcGVhdGVkX2Zsb2F0KQorICAgIG0ucmVwZWF0ZWRfZmxvYXQuZXh0ZW5kKFsxLjAsIDIuMF0pCisgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFswLjAsIDEuMCwgMi4wXSwgbS5yZXBlYXRlZF9mbG9hdCkKKyAgICBtLnJlcGVhdGVkX2Zsb2F0LmV4dGVuZChbMy4wLCA0LjBdKQorICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbMC4wLCAxLjAsIDIuMCwgMy4wLCA0LjBdLCBtLnJlcGVhdGVkX2Zsb2F0KQorCisgIGRlZiB0ZXN0RXh0ZW5kU3RyaW5nV2l0aFB5dGhvbkxpc3Qoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgICIiIlRlc3QgZXh0ZW5kaW5nIHJlcGVhdGVkIHN0cmluZyBmaWVsZHMgd2l0aCBweXRob24gbGlzdHMuIiIiCisgICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFtdLCBtLnJlcGVhdGVkX3N0cmluZykKKyAgICBtLnJlcGVhdGVkX3N0cmluZy5leHRlbmQoWycnXSkKKyAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoWycnXSwgbS5yZXBlYXRlZF9zdHJpbmcpCisgICAgbS5yZXBlYXRlZF9zdHJpbmcuZXh0ZW5kKFsnMTEnLCAnMjInXSkKKyAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoWycnLCAnMTEnLCAnMjInXSwgbS5yZXBlYXRlZF9zdHJpbmcpCisgICAgbS5yZXBlYXRlZF9zdHJpbmcuZXh0ZW5kKFsnMzMnLCAnNDQnXSkKKyAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoWycnLCAnMTEnLCAnMjInLCAnMzMnLCAnNDQnXSwgbS5yZXBlYXRlZF9zdHJpbmcpCisKKyAgZGVmIHRlc3RFeHRlbmRTdHJpbmdXaXRoU3RyaW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJUZXN0IGV4dGVuZGluZyByZXBlYXRlZCBzdHJpbmcgZmllbGRzIHdpdGggY2hhcmFjdGVycyBmcm9tIGEgc3RyaW5nLiIiIgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbXSwgbS5yZXBlYXRlZF9zdHJpbmcpCisgICAgbS5yZXBlYXRlZF9zdHJpbmcuZXh0ZW5kKCdhYmMnKQorICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbJ2EnLCAnYicsICdjJ10sIG0ucmVwZWF0ZWRfc3RyaW5nKQorCisgIGNsYXNzIFRlc3RJdGVyYWJsZShvYmplY3QpOgorICAgICIiIlRoaXMgaXRlcmFibGUgb2JqZWN0IG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgbnVtcHkuYXJyYXkuCisKKyAgICBfX25vbnplcm9fXyBmYWlscyBmb3IgbGVuZ3RoID4gMSwgYW5kIHJldHVybnMgYm9vbChpdGVtWzBdKSBmb3IgbGVuZ3RoID09IDEuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZXM9Tm9uZSk6CisgICAgICBzZWxmLl9saXN0ID0gdmFsdWVzIG9yIFtdCisKKyAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICBzaXplID0gbGVuKHNlbGYuX2xpc3QpCisgICAgICBpZiBzaXplID09IDA6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgaWYgc2l6ZSA9PSAxOgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9saXN0WzBdKQorICAgICAgcmFpc2UgVmFsdWVFcnJvcignVHJ1dGggdmFsdWUgaXMgYW1iaWd1b3VzLicpCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgIHJldHVybiBsZW4oc2VsZi5fbGlzdCkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgIHJldHVybiBzZWxmLl9saXN0Ll9faXRlcl9fKCkKKworICBkZWYgdGVzdEV4dGVuZEludDMyV2l0aEl0ZXJhYmxlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJUZXN0IGV4dGVuZGluZyByZXBlYXRlZCBpbnQzMiBmaWVsZHMgd2l0aCBpdGVyYWJsZS4iIiIKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfaW50MzIpCisgICAgbS5yZXBlYXRlZF9pbnQzMi5leHRlbmQoTWVzc2FnZVRlc3QuVGVzdEl0ZXJhYmxlKFtdKSkKKyAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfaW50MzIpCisgICAgbS5yZXBlYXRlZF9pbnQzMi5leHRlbmQoTWVzc2FnZVRlc3QuVGVzdEl0ZXJhYmxlKFswXSkpCisgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFswXSwgbS5yZXBlYXRlZF9pbnQzMikKKyAgICBtLnJlcGVhdGVkX2ludDMyLmV4dGVuZChNZXNzYWdlVGVzdC5UZXN0SXRlcmFibGUoWzEsIDJdKSkKKyAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoWzAsIDEsIDJdLCBtLnJlcGVhdGVkX2ludDMyKQorICAgIG0ucmVwZWF0ZWRfaW50MzIuZXh0ZW5kKE1lc3NhZ2VUZXN0LlRlc3RJdGVyYWJsZShbMywgNF0pKQorICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbMCwgMSwgMiwgMywgNF0sIG0ucmVwZWF0ZWRfaW50MzIpCisKKyAgZGVmIHRlc3RFeHRlbmRGbG9hdFdpdGhJdGVyYWJsZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgIiIiVGVzdCBleHRlbmRpbmcgcmVwZWF0ZWQgZmxvYXQgZmllbGRzIHdpdGggaXRlcmFibGUuIiIiCisgICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFtdLCBtLnJlcGVhdGVkX2Zsb2F0KQorICAgIG0ucmVwZWF0ZWRfZmxvYXQuZXh0ZW5kKE1lc3NhZ2VUZXN0LlRlc3RJdGVyYWJsZShbXSkpCisgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFtdLCBtLnJlcGVhdGVkX2Zsb2F0KQorICAgIG0ucmVwZWF0ZWRfZmxvYXQuZXh0ZW5kKE1lc3NhZ2VUZXN0LlRlc3RJdGVyYWJsZShbMC4wXSkpCisgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFswLjBdLCBtLnJlcGVhdGVkX2Zsb2F0KQorICAgIG0ucmVwZWF0ZWRfZmxvYXQuZXh0ZW5kKE1lc3NhZ2VUZXN0LlRlc3RJdGVyYWJsZShbMS4wLCAyLjBdKSkKKyAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoWzAuMCwgMS4wLCAyLjBdLCBtLnJlcGVhdGVkX2Zsb2F0KQorICAgIG0ucmVwZWF0ZWRfZmxvYXQuZXh0ZW5kKE1lc3NhZ2VUZXN0LlRlc3RJdGVyYWJsZShbMy4wLCA0LjBdKSkKKyAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoWzAuMCwgMS4wLCAyLjAsIDMuMCwgNC4wXSwgbS5yZXBlYXRlZF9mbG9hdCkKKworICBkZWYgdGVzdEV4dGVuZFN0cmluZ1dpdGhJdGVyYWJsZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgIiIiVGVzdCBleHRlbmRpbmcgcmVwZWF0ZWQgc3RyaW5nIGZpZWxkcyB3aXRoIGl0ZXJhYmxlLiIiIgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbXSwgbS5yZXBlYXRlZF9zdHJpbmcpCisgICAgbS5yZXBlYXRlZF9zdHJpbmcuZXh0ZW5kKE1lc3NhZ2VUZXN0LlRlc3RJdGVyYWJsZShbXSkpCisgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFtdLCBtLnJlcGVhdGVkX3N0cmluZykKKyAgICBtLnJlcGVhdGVkX3N0cmluZy5leHRlbmQoTWVzc2FnZVRlc3QuVGVzdEl0ZXJhYmxlKFsnJ10pKQorICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbJyddLCBtLnJlcGVhdGVkX3N0cmluZykKKyAgICBtLnJlcGVhdGVkX3N0cmluZy5leHRlbmQoTWVzc2FnZVRlc3QuVGVzdEl0ZXJhYmxlKFsnMScsICcyJ10pKQorICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbJycsICcxJywgJzInXSwgbS5yZXBlYXRlZF9zdHJpbmcpCisgICAgbS5yZXBlYXRlZF9zdHJpbmcuZXh0ZW5kKE1lc3NhZ2VUZXN0LlRlc3RJdGVyYWJsZShbJzMnLCAnNCddKSkKKyAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoWycnLCAnMScsICcyJywgJzMnLCAnNCddLCBtLnJlcGVhdGVkX3N0cmluZykKKworICBjbGFzcyBUZXN0SW5kZXgob2JqZWN0KToKKyAgICAiIiJUaGlzIGluZGV4IG9iamVjdCBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIG51bXB5LmludDY0IGFuZCBvdGhlciB0eXBlcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZT1Ob25lKToKKyAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorCisgICAgZGVmIF9faW5kZXhfXyhzZWxmKToKKyAgICAgIHJldHVybiBzZWxmLnZhbHVlCisKKyAgZGVmIHRlc3RSZXBlYXRlZEluZGV4aW5nV2l0aEludEluZGV4KHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtc2cgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG1zZy5yZXBlYXRlZF9pbnQzMi5leHRlbmQoWzEsIDIsIDNdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbXNnLnJlcGVhdGVkX2ludDMyW01lc3NhZ2VUZXN0LlRlc3RJbmRleCgwKV0pCisKKyAgZGVmIHRlc3RSZXBlYXRlZEluZGV4aW5nV2l0aE5lZ2F0aXZlMUludEluZGV4KHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtc2cgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG1zZy5yZXBlYXRlZF9pbnQzMi5leHRlbmQoWzEsIDIsIDNdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbXNnLnJlcGVhdGVkX2ludDMyW01lc3NhZ2VUZXN0LlRlc3RJbmRleCgtMSldKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRJbmRleGluZ1dpdGhOZWdhdGl2ZTFJbnQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG1zZyA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgbXNnLnJlcGVhdGVkX2ludDMyLmV4dGVuZChbMSwgMiwgM10pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBtc2cucmVwZWF0ZWRfaW50MzJbLTFdKQorCisgIGRlZiB0ZXN0UGlja2xlUmVwZWF0ZWRTY2FsYXJDb250YWluZXIoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgICMgUGlja2xlIHJlcGVhdGVkIHNjYWxhciBjb250YWluZXIgaXMgbm90IHN1cHBvcnRlZC4KKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHBpY2tsZS5QaWNrbGVFcnJvcikgYXMgXzoKKyAgICAgIHBpY2tsZS5kdW1wcyhtLnJlcGVhdGVkX2ludDMyLCBwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCkKKworICBkZWYgdGVzdFNvcnRFbXB0eVJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJFeGVyY2lzZSBhIHNjZW5hcmlvIHRoYXQgaGFzIGxlZCB0byBzZWdmYXVsdHMgaW4gdGhlIHBhc3QuIiIiCisgICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgbS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5zb3J0KCkKKworICBkZWYgdGVzdEhhc0ZpZWxkT25SZXBlYXRlZEZpZWxkKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJVc2luZyBIYXNGaWVsZCBvbiBhIHJlcGVhdGVkIGZpZWxkIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24uIiIiCisgICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBfOgorICAgICAgbS5IYXNGaWVsZCgncmVwZWF0ZWRfaW50MzInKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRTY2FsYXJGaWVsZFBvcChzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yKSBhcyBfOgorICAgICAgbS5yZXBlYXRlZF9pbnQzMi5wb3AoKQorICAgIG0ucmVwZWF0ZWRfaW50MzIuZXh0ZW5kKHJhbmdlKDUpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgbS5yZXBlYXRlZF9pbnQzMi5wb3AoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG0ucmVwZWF0ZWRfaW50MzIucG9wKDApKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbS5yZXBlYXRlZF9pbnQzMi5wb3AoMSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbMSwgM10sIG0ucmVwZWF0ZWRfaW50MzIpCisKKyAgZGVmIHRlc3RSZXBlYXRlZENvbXBvc2l0ZUZpZWxkUG9wKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IpIGFzIF86CisgICAgICBtLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnBvcCgpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIF86CisgICAgICBtLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnBvcCgnMCcpCisgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICBuID0gbS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgICAgbi5iYiA9IGkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIG0ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UucG9wKCkuYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnBvcCgwKS5iYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG0ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UucG9wKDEpLmJiKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzEsIDNdLCBbbi5iYiBmb3IgbiBpbiBtLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlXSkKKworICBkZWYgdGVzdFJlcGVhdGVkQ29tcGFyZVdpdGhTZWxmKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgIG0ucmVwZWF0ZWRfaW50MzIuaW5zZXJ0KGksIGkpCisgICAgICBuID0gbS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgICAgbi5iYiA9IGkKKyAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwobS5yZXBlYXRlZF9pbnQzMiwgbS5yZXBlYXRlZF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UsIG0ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RSZWxlYXNlZE5lc3RlZE1lc3NhZ2VzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJBIGNhc2UgdGhhdCBsZWFkIHRvIGEgc2VnZmF1bHQgd2hlbiBhIG1lc3NhZ2UgZGV0YWNoZWQgZnJvbSBpdHMgcGFyZW50CisKKyAgICBjb250YWluZXIgaGFzIGl0c2VsZiBhIGNoaWxkIGNvbnRhaW5lci4KKyAgICAiIiIKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuTmVzdGVkVGVzdEFsbFR5cGVzKCkKKyAgICBtID0gbS5yZXBlYXRlZF9jaGlsZC5hZGQoKQorICAgIG0gPSBtLmNoaWxkCisgICAgbSA9IG0ucmVwZWF0ZWRfY2hpbGQuYWRkKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG0ucGF5bG9hZC5vcHRpb25hbF9pbnQzMiwgMCkKKworICBkZWYgdGVzdFNldFJlcGVhdGVkQ29tcG9zaXRlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgIG0ucmVwZWF0ZWRfaW50MzIgPSBbXQorICAgIG0ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICBtLnJlcGVhdGVkX2ludDMyID0gW10KKworICBkZWYgdGVzdFJldHVybmluZ1R5cGUoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQsIHR5cGUobS5vcHRpb25hbF9mbG9hdCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCwgdHlwZShtLm9wdGlvbmFsX2RvdWJsZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChib29sLCB0eXBlKG0ub3B0aW9uYWxfYm9vbCkpCisgICAgbS5vcHRpb25hbF9mbG9hdCA9IDEKKyAgICBtLm9wdGlvbmFsX2RvdWJsZSA9IDEKKyAgICBtLm9wdGlvbmFsX2Jvb2wgPSAxCisgICAgbS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMSkKKyAgICBtLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMSkKKyAgICBtLnJlcGVhdGVkX2Jvb2wuYXBwZW5kKDEpCisgICAgbS5QYXJzZUZyb21TdHJpbmcobS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQsIHR5cGUobS5vcHRpb25hbF9mbG9hdCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCwgdHlwZShtLm9wdGlvbmFsX2RvdWJsZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnMS4wJywgc3RyKG0ub3B0aW9uYWxfZG91YmxlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGJvb2wsIHR5cGUobS5vcHRpb25hbF9ib29sKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0LCB0eXBlKG0ucmVwZWF0ZWRfZmxvYXRbMF0pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQsIHR5cGUobS5yZXBlYXRlZF9kb3VibGVbMF0pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoYm9vbCwgdHlwZShtLnJlcGVhdGVkX2Jvb2xbMF0pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgbS5yZXBlYXRlZF9ib29sWzBdKQorCisKKyMgQ2xhc3MgdG8gdGVzdCBwcm90bzItb25seSBmZWF0dXJlcyAocmVxdWlyZWQsIGV4dGVuc2lvbnMsIGV0Yy4pCitAdGVzdGluZ19yZWZsZWFrcy5UZXN0Q2FzZQorY2xhc3MgUHJvdG8yVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RGaWVsZFByZXNlbmNlKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgIHNlbGYuYXNzZXJ0RmFsc2UobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2Jvb2wnKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgbWVzc2FnZS5IYXNGaWVsZCgnZmllbGRfZG9lc250X2V4aXN0JykKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICBtZXNzYWdlLkhhc0ZpZWxkKCdyZXBlYXRlZF9pbnQzMicpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgIG1lc3NhZ2UuSGFzRmllbGQoJ3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlJykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBtZXNzYWdlLm9wdGlvbmFsX2Jvb2wpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQorCisgICAgIyBGaWVsZHMgYXJlIHNldCBldmVuIHdoZW4gc2V0dGluZyB0aGUgdmFsdWVzIHRvIGRlZmF1bHQgdmFsdWVzLgorICAgIG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIgPSAwCisgICAgbWVzc2FnZS5vcHRpb25hbF9ib29sID0gRmFsc2UKKyAgICBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMAorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9ib29sJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisKKyAgICAjIFNldCB0aGUgZmllbGRzIHRvIG5vbi1kZWZhdWx0IHZhbHVlcy4KKyAgICBtZXNzYWdlLm9wdGlvbmFsX2ludDMyID0gNQorICAgIG1lc3NhZ2Uub3B0aW9uYWxfYm9vbCA9IFRydWUKKyAgICBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMTUKKworICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKHUnb3B0aW9uYWxfaW50MzInKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfYm9vbCcpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorCisgICAgIyBDbGVhcmluZyB0aGUgZmllbGRzIHVuc2V0cyB0aGVtIGFuZCByZXNldHMgdGhlaXIgdmFsdWUgdG8gZGVmYXVsdC4KKyAgICBtZXNzYWdlLkNsZWFyRmllbGQoJ29wdGlvbmFsX2ludDMyJykKKyAgICBtZXNzYWdlLkNsZWFyRmllbGQodSdvcHRpb25hbF9ib29sJykKKyAgICBtZXNzYWdlLkNsZWFyRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykKKworICAgIHNlbGYuYXNzZXJ0RmFsc2UobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2Jvb2wnKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtZXNzYWdlLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIG1lc3NhZ2Uub3B0aW9uYWxfYm9vbCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisKKyAgZGVmIHRlc3RBc3NpZ25JbnZhbGlkRW51bShzZWxmKToKKyAgICAiIiJBc3NpZ25pbmcgYW4gaW52YWxpZCBlbnVtIG51bWJlciBpcyBub3QgYWxsb3dlZCBpbiBwcm90bzIuIiIiCisgICAgbSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgIyBQcm90bzIgY2FuIG5vdCBhc3NpZ24gdW5rbm93biBlbnVtLgorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcikgYXMgXzoKKyAgICAgIG0ub3B0aW9uYWxfbmVzdGVkX2VudW0gPSAxMjM0NTY3CisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbS5yZXBlYXRlZF9uZXN0ZWRfZW51bS5hcHBlbmQsIDEyMzQ1NjcpCisgICAgIyBBc3NpZ25tZW50IGlzIGEgZGlmZmVyZW50IGNvZGUgcGF0aCB0aGFuIGFwcGVuZCBmb3IgdGhlIEMrKyBpbXBsLgorICAgIG0ucmVwZWF0ZWRfbmVzdGVkX2VudW0uYXBwZW5kKDIpCisgICAgbS5yZXBlYXRlZF9uZXN0ZWRfZW51bVswXSA9IDIKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgbS5yZXBlYXRlZF9uZXN0ZWRfZW51bVswXSA9IDEyMzQ1NgorCisgICAgIyBVbmtub3duIGVudW0gdmFsdWUgY2FuIGJlIHBhcnNlZCBidXQgaXMgaWdub3JlZC4KKyAgICBtMiA9IHVuaXR0ZXN0X3Byb3RvM19hcmVuYV9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtMi5vcHRpb25hbF9uZXN0ZWRfZW51bSA9IDEyMzQ1NjcKKyAgICBtMi5yZXBlYXRlZF9uZXN0ZWRfZW51bS5hcHBlbmQoNzY1NDMyMSkKKyAgICBzZXJpYWxpemVkID0gbTIuU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgbTMgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtMy5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG0zLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfZW51bScpKQorICAgICMgMSBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igb3B0aW9uYWxfbmVzdGVkX2VudW0uCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBtMy5vcHRpb25hbF9uZXN0ZWRfZW51bSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihtMy5yZXBlYXRlZF9uZXN0ZWRfZW51bSkpCisgICAgbTIuQ2xlYXIoKQorICAgIG0yLlBhcnNlRnJvbVN0cmluZyhtMy5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzNDU2NywgbTIub3B0aW9uYWxfbmVzdGVkX2VudW0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCg3NjU0MzIxLCBtMi5yZXBlYXRlZF9uZXN0ZWRfZW51bVswXSkKKworICBkZWYgdGVzdFVua25vd25FbnVtTWFwKHNlbGYpOgorICAgIG0gPSBtYXBfcHJvdG8yX3VuaXR0ZXN0X3BiMi5UZXN0RW51bU1hcCgpCisgICAgbS5rbm93bl9tYXBfZmllbGRbMTIzXSA9IDAKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgbS51bmtub3duX21hcF9maWVsZFsxXSA9IDEyMworCisgIGRlZiB0ZXN0RXh0ZW5zaW9uc0Vycm9ycyhzZWxmKToKKyAgICBtc2cgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZ2V0YXR0ciwgbXNnLCAnRXh0ZW5zaW9ucycpCisKKyAgZGVmIHRlc3RNZXJnZUZyb21FeHRlbnNpb25zKHNlbGYpOgorICAgIG1zZzEgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLlRvcExldmVsTWVzc2FnZSgpCisgICAgbXNnMiA9IG1vcmVfZXh0ZW5zaW9uc19wYjIuVG9wTGV2ZWxNZXNzYWdlKCkKKyAgICAjIENwcCBleHRlbnNpb24gd2lsbCBsYXppbHkgY3JlYXRlIGEgc3ViIG1lc3NhZ2Ugd2hpY2ggaXMgaW1tdXRhYmxlLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIDAsCisgICAgICAgIG1zZzEuc3VibWVzc2FnZS5FeHRlbnNpb25zW21vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfaW50X2V4dGVuc2lvbl0pCisgICAgc2VsZi5hc3NlcnRGYWxzZShtc2cxLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCisgICAgbXNnMi5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9pbnRfZXh0ZW5zaW9uXSA9IDEyMworICAgICMgTWFrZSBzdXJlIGNtZXNzYWdlIGFuZCBleHRlbnNpb25zIHBvaW50aW5nIHRvIGEgbXV0YWJsZSBtZXNzYWdlCisgICAgIyBhZnRlciBtZXJnZSBpbnN0ZWFkIG9mIHRoZSBsYXppbHkgY3JlYXRlZCBtZXNzYWdlLgorICAgIG1zZzEuTWVyZ2VGcm9tKG1zZzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgMTIzLAorICAgICAgICBtc2cxLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1ttb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX2ludF9leHRlbnNpb25dKQorCisgIGRlZiB0ZXN0R29sZGVuRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBnb2xkZW5fZGF0YSA9IHRlc3RfdXRpbC5Hb2xkZW5GaWxlRGF0YSgnZ29sZGVuX21lc3NhZ2UnKQorICAgIGdvbGRlbl9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCisgICAgYWxsX3NldCA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgdGVzdF91dGlsLlNldEFsbEV4dGVuc2lvbnMoYWxsX3NldCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGFsbF9zZXQsIGdvbGRlbl9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgZ29sZGVuX2NvcHkgPSBjb3B5LmRlZXBjb3B5KGdvbGRlbl9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9jb3B5LlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisKKyAgZGVmIHRlc3RHb2xkZW5QYWNrZWRFeHRlbnNpb25zKHNlbGYpOgorICAgIGdvbGRlbl9kYXRhID0gdGVzdF91dGlsLkdvbGRlbkZpbGVEYXRhKCdnb2xkZW5fcGFja2VkX2ZpZWxkc19tZXNzYWdlJykKKyAgICBnb2xkZW5fbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkRXh0ZW5zaW9ucygpCisgICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQorICAgIGFsbF9zZXQgPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZEV4dGVuc2lvbnMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxQYWNrZWRFeHRlbnNpb25zKGFsbF9zZXQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChhbGxfc2V0LCBnb2xkZW5fbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBhbGxfc2V0LlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgZ29sZGVuX2NvcHkgPSBjb3B5LmRlZXBjb3B5KGdvbGRlbl9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9jb3B5LlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisKKyAgZGVmIHRlc3RQaWNrbGVJbmNvbXBsZXRlUHJvdG8oc2VsZik6CisgICAgZ29sZGVuX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkKGE9MSkKKyAgICBwaWNrbGVkX21lc3NhZ2UgPSBwaWNrbGUuZHVtcHMoZ29sZGVuX21lc3NhZ2UpCisKKyAgICB1bnBpY2tsZWRfbWVzc2FnZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bnBpY2tsZWRfbWVzc2FnZSwgZ29sZGVuX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bnBpY2tsZWRfbWVzc2FnZS5hLCAxKQorICAgICMgVGhpcyBpcyBzdGlsbCBhbiBpbmNvbXBsZXRlIHByb3RvIC0gc28gc2VyaWFsaXppbmcgc2hvdWxkIGZhaWwKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhtZXNzYWdlLkVuY29kZUVycm9yLCB1bnBpY2tsZWRfbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZykKKworICAjIFRPRE8oaGFiZXJtYW4pOiB0aGlzIGlzbid0IHJlYWxseSBhIHByb3RvMi1zcGVjaWZpYyB0ZXN0IGV4Y2VwdCB0aGF0IHRoaXMKKyAgIyBtZXNzYWdlIGhhcyBhIHJlcXVpcmVkIGZpZWxkIGluIGl0LiAgU2hvdWxkIHByb2JhYmx5IGJlIGZhY3RvcmVkIG91dCBzbworICAjIHRoYXQgd2UgY2FuIHRlc3QgdGhlIG90aGVyIHBhcnRzIHdpdGggcHJvdG8zLgorICBkZWYgdGVzdFBhcnNpbmdNZXJnZShzZWxmKToKKyAgICAiIiJDaGVjayB0aGUgbWVyZ2UgYmVoYXZpb3Igd2hlbiBhIHJlcXVpcmVkIG9yIG9wdGlvbmFsIGZpZWxkIGFwcGVhcnMKKworICAgIG11bHRpcGxlIHRpbWVzIGluIHRoZSBpbnB1dC4KKyAgICAiIiIKKyAgICBtZXNzYWdlcyA9IFsKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpLAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCksCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIF0KKyAgICBtZXNzYWdlc1swXS5vcHRpb25hbF9pbnQzMiA9IDEKKyAgICBtZXNzYWdlc1sxXS5vcHRpb25hbF9pbnQ2NCA9IDIKKyAgICBtZXNzYWdlc1syXS5vcHRpb25hbF9pbnQzMiA9IDMKKyAgICBtZXNzYWdlc1syXS5vcHRpb25hbF9zdHJpbmcgPSAnaGVsbG8nCisKKyAgICBtZXJnZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIG1lcmdlZF9tZXNzYWdlLm9wdGlvbmFsX2ludDMyID0gMworICAgIG1lcmdlZF9tZXNzYWdlLm9wdGlvbmFsX2ludDY0ID0gMgorICAgIG1lcmdlZF9tZXNzYWdlLm9wdGlvbmFsX3N0cmluZyA9ICdoZWxsbycKKworICAgIGdlbmVyYXRvciA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFyc2luZ01lcmdlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yKCkKKyAgICBnZW5lcmF0b3IuZmllbGQxLmV4dGVuZChtZXNzYWdlcykKKyAgICBnZW5lcmF0b3IuZmllbGQyLmV4dGVuZChtZXNzYWdlcykKKyAgICBnZW5lcmF0b3IuZmllbGQzLmV4dGVuZChtZXNzYWdlcykKKyAgICBnZW5lcmF0b3IuZXh0MS5leHRlbmQobWVzc2FnZXMpCisgICAgZ2VuZXJhdG9yLmV4dDIuZXh0ZW5kKG1lc3NhZ2VzKQorICAgIGdlbmVyYXRvci5ncm91cDEuYWRkKCkuZmllbGQxLk1lcmdlRnJvbShtZXNzYWdlc1swXSkKKyAgICBnZW5lcmF0b3IuZ3JvdXAxLmFkZCgpLmZpZWxkMS5NZXJnZUZyb20obWVzc2FnZXNbMV0pCisgICAgZ2VuZXJhdG9yLmdyb3VwMS5hZGQoKS5maWVsZDEuTWVyZ2VGcm9tKG1lc3NhZ2VzWzJdKQorICAgIGdlbmVyYXRvci5ncm91cDIuYWRkKCkuZmllbGQxLk1lcmdlRnJvbShtZXNzYWdlc1swXSkKKyAgICBnZW5lcmF0b3IuZ3JvdXAyLmFkZCgpLmZpZWxkMS5NZXJnZUZyb20obWVzc2FnZXNbMV0pCisgICAgZ2VuZXJhdG9yLmdyb3VwMi5hZGQoKS5maWVsZDEuTWVyZ2VGcm9tKG1lc3NhZ2VzWzJdKQorCisgICAgZGF0YSA9IGdlbmVyYXRvci5TZXJpYWxpemVUb1N0cmluZygpCisgICAgcGFyc2luZ19tZXJnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFyc2luZ01lcmdlKCkKKyAgICBwYXJzaW5nX21lcmdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKQorCisgICAgIyBSZXF1aXJlZCBhbmQgb3B0aW9uYWwgZmllbGRzIHNob3VsZCBiZSBtZXJnZWQuCisgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzaW5nX21lcmdlLnJlcXVpcmVkX2FsbF90eXBlcywgbWVyZ2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzaW5nX21lcmdlLm9wdGlvbmFsX2FsbF90eXBlcywgbWVyZ2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzaW5nX21lcmdlLm9wdGlvbmFsZ3JvdXAub3B0aW9uYWxfZ3JvdXBfYWxsX3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgcGFyc2luZ19tZXJnZS5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5UZXN0UGFyc2luZ01lcmdlLm9wdGlvbmFsX2V4dF0sCisgICAgICAgIG1lcmdlZF9tZXNzYWdlKQorCisgICAgIyBSZXBlYXRlZCBmaWVsZHMgc2hvdWxkIG5vdCBiZSBtZXJnZWQuCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocGFyc2luZ19tZXJnZS5yZXBlYXRlZF9hbGxfdHlwZXMpLCAzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBhcnNpbmdfbWVyZ2UucmVwZWF0ZWRncm91cCksIDMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgbGVuKHBhcnNpbmdfbWVyZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0UGFyc2luZ01lcmdlLnJlcGVhdGVkX2V4dF0pLCAzKQorCisgIGRlZiB0ZXN0UHl0aG9uaWNJbml0KHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKAorICAgICAgICBvcHRpb25hbF9pbnQzMj0xMDAsCisgICAgICAgIG9wdGlvbmFsX2ZpeGVkMzI9MjAwLAorICAgICAgICBvcHRpb25hbF9mbG9hdD0zMDAuNSwKKyAgICAgICAgb3B0aW9uYWxfYnl0ZXM9Yid4JywKKyAgICAgICAgb3B0aW9uYWxncm91cD17J2EnOiA0MDB9LAorICAgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZT17J2JiJzogNTAwfSwKKyAgICAgICAgb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlPXt9LAorICAgICAgICBvcHRpb25hbF9uZXN0ZWRfZW51bT0nQkFaJywKKyAgICAgICAgcmVwZWF0ZWRncm91cD1beworICAgICAgICAgICAgJ2EnOiA2MDAKKyAgICAgICAgfSwgeworICAgICAgICAgICAgJ2EnOiA3MDAKKyAgICAgICAgfV0sCisgICAgICAgIHJlcGVhdGVkX25lc3RlZF9lbnVtPVsnRk9PJywgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVJdLAorICAgICAgICBkZWZhdWx0X2ludDMyPTgwMCwKKyAgICAgICAgb25lb2Zfc3RyaW5nPSd5JykKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobWVzc2FnZSwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEwMCwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIwMCwgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzAwLjUsIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChiJ3gnLCBtZXNzYWdlLm9wdGlvbmFsX2J5dGVzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDAwLCBtZXNzYWdlLm9wdGlvbmFsZ3JvdXAuYSkKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNTAwLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWiwKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZGdyb3VwKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDYwMCwgbWVzc2FnZS5yZXBlYXRlZGdyb3VwWzBdLmEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg3MDAsIG1lc3NhZ2UucmVwZWF0ZWRncm91cFsxXS5hKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08sCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVIsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoODAwLCBtZXNzYWdlLmRlZmF1bHRfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgneScsIG1lc3NhZ2Uub25lb2Zfc3RyaW5nKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfaW50NjQnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0KSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBtZXNzYWdlLmRlZmF1bHRfaW50NjQpCisKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcyhvcHRpb25hbF9uZXN0ZWRfZW51bT11J0JBWicpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWiwKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0pCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKKyAgICAgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZT17J0lOVkFMSURfTkVTVEVEX0ZJRUxEJzogMTd9KQorCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKKyAgICAgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZT17J2JiJzogJ0lOVkFMSURfVkFMVUVfVFlQRSd9KQorCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMob3B0aW9uYWxfbmVzdGVkX2VudW09J0lOVkFMSURfTEFCRUwnKQorCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMocmVwZWF0ZWRfbmVzdGVkX2VudW09J0ZPTycpCisKKyAgZGVmIHRlc3RQeXRob25pY0luaXRXaXRoRGljdChzZWxmKToKKyAgICAjIEJvdGggc3RyaW5nL3VuaWNvZGUgZmllbGQgbmFtZSBrZXlzIHNob3VsZCB3b3JrLgorICAgIGt3YXJncyA9IHsKKyAgICAgICAgJ29wdGlvbmFsX2ludDMyJzogMTAwLAorICAgICAgICB1J29wdGlvbmFsX2ZpeGVkMzInOiAyMDAsCisgICAgfQorICAgIG1zZyA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKiprd2FyZ3MpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMDAsIG1zZy5vcHRpb25hbF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIwMCwgbXNnLm9wdGlvbmFsX2ZpeGVkMzIpCisKKworICBkZWYgdGVzdF9kb2N1bWVudGF0aW9uKHNlbGYpOgorICAgICMgQWxzbyB1c2VkIGJ5IHRoZSBpbnRlcmFjdGl2ZSBoZWxwKCkgZnVuY3Rpb24uCisgICAgZG9jID0gcHlkb2MuaHRtbC5kb2N1bWVudCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCAnbWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnRJbignY2xhc3MgVGVzdEFsbFR5cGVzJywgZG9jKQorICAgIHNlbGYuYXNzZXJ0SW4oJ1NlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZycsIGRvYykKKyAgICBzZWxmLmFzc2VydEluKCdyZXBlYXRlZF9mbG9hdCcsIGRvYykKKyAgICBiYXNlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5fX2Jhc2VzX19bMF0KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZ2V0YXR0ciwgYmFzZSwgJ19leHRlbnNpb25zX2J5X25hbWUnKQorCisKKyMgQ2xhc3MgdG8gdGVzdCBwcm90bzMtb25seSBmZWF0dXJlcy9iZWhhdmlvciAodXBkYXRlZCBmaWVsZCBwcmVzZW5jZSAmIGVudW1zKQorQHRlc3RpbmdfcmVmbGVha3MuVGVzdENhc2UKK2NsYXNzIFByb3RvM1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICMgVXRpbGl0eSBtZXRob2QgZm9yIGNvbXBhcmluZyBlcXVhbGl0eSB3aXRoIGEgbWFwLgorICBkZWYgYXNzZXJ0TWFwSXRlckVxdWFscyhzZWxmLCBtYXBfaXRlciwgZGljdF92YWx1ZSk6CisgICAgIyBBdm9pZCBtdXRhdGluZyBjYWxsZXIncyBjb3B5LgorICAgIGRpY3RfdmFsdWUgPSBkaWN0KGRpY3RfdmFsdWUpCisKKyAgICBmb3IgaywgdiBpbiBtYXBfaXRlcjoKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgZGljdF92YWx1ZVtrXSkKKyAgICAgIGRlbCBkaWN0X3ZhbHVlW2tdCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKHt9LCBkaWN0X3ZhbHVlKQorCisgIGRlZiB0ZXN0RmllbGRQcmVzZW5jZShzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcHJvdG8zX2FyZW5hX3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgIyBXZSBjYW4ndCB0ZXN0IHByZXNlbmNlIG9mIG5vbi1yZXBlYXRlZCwgbm9uLXN1Ym1lc3NhZ2UgZmllbGRzLgorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICBtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgIG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2Zsb2F0JykKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgbWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfc3RyaW5nJykKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgbWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfYm9vbCcpCisKKyAgICAjIEJ1dCB3ZSBjYW4gc3RpbGwgdGVzdCBwcmVzZW5jZSBvZiBzdWJtZXNzYWdlIGZpZWxkcy4KKyAgICBzZWxmLmFzc2VydEZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisKKyAgICAjIEFzIHdpdGggcHJvdG8yLCB3ZSBjYW4ndCB0ZXN0IHByZXNlbmNlIG9mIGZpZWxkcyB0aGF0IGRvbid0IGV4aXN0LCBvcgorICAgICMgcmVwZWF0ZWQgZmllbGRzLgorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICBtZXNzYWdlLkhhc0ZpZWxkKCdmaWVsZF9kb2VzbnRfZXhpc3QnKQorCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgIG1lc3NhZ2UuSGFzRmllbGQoJ3JlcGVhdGVkX2ludDMyJykKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgbWVzc2FnZS5IYXNGaWVsZCgncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UnKQorCisgICAgIyBGaWVsZHMgc2hvdWxkIGRlZmF1bHQgdG8gdGhlaXIgdHlwZS1zcGVjaWZpYyBkZWZhdWx0LgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcpCisgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgbWVzc2FnZS5vcHRpb25hbF9ib29sKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYikKKworICAgICMgU2V0dGluZyBhIHN1Ym1lc3NhZ2Ugc2hvdWxkIHN0aWxsIHJldHVybiBwcm9wZXIgcHJlc2VuY2UgaW5mb3JtYXRpb24uCisgICAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDAKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICAgICMgU2V0IHRoZSBmaWVsZHMgdG8gbm9uLWRlZmF1bHQgdmFsdWVzLgorICAgIG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIgPSA1CisgICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IDEuMQorICAgIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nID0gJ2FiYycKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2Jvb2wgPSBUcnVlCisgICAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDE1CisKKyAgICAjIENsZWFyaW5nIHRoZSBmaWVsZHMgdW5zZXRzIHRoZW0gYW5kIHJlc2V0cyB0aGVpciB2YWx1ZSB0byBkZWZhdWx0LgorICAgIG1lc3NhZ2UuQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQorICAgIG1lc3NhZ2UuQ2xlYXJGaWVsZCgnb3B0aW9uYWxfZmxvYXQnKQorICAgIG1lc3NhZ2UuQ2xlYXJGaWVsZCgnb3B0aW9uYWxfc3RyaW5nJykKKyAgICBtZXNzYWdlLkNsZWFyRmllbGQoJ29wdGlvbmFsX2Jvb2wnKQorICAgIG1lc3NhZ2UuQ2xlYXJGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtZXNzYWdlLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZykKKyAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBtZXNzYWdlLm9wdGlvbmFsX2Jvb2wpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQorCisgIGRlZiB0ZXN0UHJvdG8zUGFyc2VyRHJvcERlZmF1bHRTY2FsYXIoc2VsZik6CisgICAgbWVzc2FnZV9wcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlX3Byb3RvMi5vcHRpb25hbF9pbnQzMiA9IDAKKyAgICBtZXNzYWdlX3Byb3RvMi5vcHRpb25hbF9zdHJpbmcgPSAnJworICAgIG1lc3NhZ2VfcHJvdG8yLm9wdGlvbmFsX2J5dGVzID0gYicnCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obWVzc2FnZV9wcm90bzIuTGlzdEZpZWxkcygpKSwgMykKKworICAgIG1lc3NhZ2VfcHJvdG8zID0gdW5pdHRlc3RfcHJvdG8zX2FyZW5hX3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIG1lc3NhZ2VfcHJvdG8zLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlX3Byb3RvMi5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1lc3NhZ2VfcHJvdG8zLkxpc3RGaWVsZHMoKSksIDApCisKKyAgZGVmIHRlc3RQcm90bzNPcHRpb25hbChzZWxmKToKKyAgICBtc2cgPSB0ZXN0X3Byb3RvM19vcHRpb25hbF9wYjIuVGVzdFByb3RvM09wdGlvbmFsKCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1zZy5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1zZy5IYXNGaWVsZCgnb3B0aW9uYWxfZmxvYXQnKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1zZy5IYXNGaWVsZCgnb3B0aW9uYWxfc3RyaW5nJykpCisgICAgc2VsZi5hc3NlcnRGYWxzZShtc2cuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRGYWxzZShtc2cub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuSGFzRmllbGQoJ2JiJykpCisKKyAgICAjIFNldCBmaWVsZHMuCisgICAgbXNnLm9wdGlvbmFsX2ludDMyID0gMQorICAgIG1zZy5vcHRpb25hbF9mbG9hdCA9IDEuMAorICAgIG1zZy5vcHRpb25hbF9zdHJpbmcgPSAnMTIzJworICAgIG1zZy5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDEKKyAgICBzZWxmLmFzc2VydFRydWUobXNnLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuSGFzRmllbGQoJ29wdGlvbmFsX2Zsb2F0JykpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5IYXNGaWVsZCgnb3B0aW9uYWxfc3RyaW5nJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydFRydWUobXNnLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLkhhc0ZpZWxkKCdiYicpKQorICAgICMgU2V0IHRvIGRlZmF1bHQgdmFsdWUgZG9lcyBub3QgY2xlYXIgdGhlIGZpZWxkcworICAgIG1zZy5vcHRpb25hbF9pbnQzMiA9IDAKKyAgICBtc2cub3B0aW9uYWxfZmxvYXQgPSAwLjAKKyAgICBtc2cub3B0aW9uYWxfc3RyaW5nID0gJycKKyAgICBtc2cub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgPSAwCisgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgICBzZWxmLmFzc2VydFRydWUobXNnLkhhc0ZpZWxkKCdvcHRpb25hbF9mbG9hdCcpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuSGFzRmllbGQoJ29wdGlvbmFsX3N0cmluZycpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5IYXNGaWVsZCgnYmInKSkKKworICAgICMgVGVzdCBzZXJpYWxpemUKKyAgICBtc2cyID0gdGVzdF9wcm90bzNfb3B0aW9uYWxfcGIyLlRlc3RQcm90bzNPcHRpb25hbCgpCisgICAgbXNnMi5QYXJzZUZyb21TdHJpbmcobXNnLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1zZzIuSGFzRmllbGQoJ29wdGlvbmFsX2ludDMyJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1zZzIuSGFzRmllbGQoJ29wdGlvbmFsX2Zsb2F0JykpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1zZzIuSGFzRmllbGQoJ29wdGlvbmFsX3N0cmluZycpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cyLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cyLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLkhhc0ZpZWxkKCdiYicpKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuV2hpY2hPbmVvZignX29wdGlvbmFsX2ludDMyJyksICdvcHRpb25hbF9pbnQzMicpCisKKyAgICAjIENsZWFyIHRoZXNlIGZpZWxkcy4KKyAgICBtc2cuQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQorICAgIG1zZy5DbGVhckZpZWxkKCdvcHRpb25hbF9mbG9hdCcpCisgICAgbXNnLkNsZWFyRmllbGQoJ29wdGlvbmFsX3N0cmluZycpCisgICAgbXNnLkNsZWFyRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1zZy5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1zZy5IYXNGaWVsZCgnb3B0aW9uYWxfZmxvYXQnKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1zZy5IYXNGaWVsZCgnb3B0aW9uYWxfc3RyaW5nJykpCisgICAgc2VsZi5hc3NlcnRGYWxzZShtc2cuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRGYWxzZShtc2cub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuSGFzRmllbGQoJ2JiJykpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5XaGljaE9uZW9mKCdfb3B0aW9uYWxfaW50MzInKSwgTm9uZSkKKworICAgICMgVGVzdCBoYXMgcHJlc2VuY2U6CisgICAgZm9yIGZpZWxkIGluIHRlc3RfcHJvdG8zX29wdGlvbmFsX3BiMi5UZXN0UHJvdG8zT3B0aW9uYWwuREVTQ1JJUFRPUi5maWVsZHM6CisgICAgICBzZWxmLmFzc2VydFRydWUoZmllbGQuaGFzX3ByZXNlbmNlKQorICAgIGZvciBmaWVsZCBpbiB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IuZmllbGRzOgorICAgICAgaWYgZmllbGQubGFiZWwgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmllbGQuaGFzX3ByZXNlbmNlKQorICAgICAgZWxzZToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpZWxkLmhhc19wcmVzZW5jZSkKKyAgICBwcm90bzNfZGVzY3JpcHRvciA9IHVuaXR0ZXN0X3Byb3RvM19hcmVuYV9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IKKyAgICByZXBlYXRlZF9maWVsZCA9IHByb3RvM19kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lWydyZXBlYXRlZF9pbnQzMiddCisgICAgc2VsZi5hc3NlcnRGYWxzZShyZXBlYXRlZF9maWVsZC5oYXNfcHJlc2VuY2UpCisgICAgc2luZ3VsYXJfZmllbGQgPSBwcm90bzNfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfaW50MzInXQorICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2luZ3VsYXJfZmllbGQuaGFzX3ByZXNlbmNlKQorICAgIG9wdGlvbmFsX2ZpZWxkID0gcHJvdG8zX2Rlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbJ3Byb3RvM19vcHRpb25hbF9pbnQzMiddCisgICAgc2VsZi5hc3NlcnRUcnVlKG9wdGlvbmFsX2ZpZWxkLmhhc19wcmVzZW5jZSkKKyAgICBtZXNzYWdlX2ZpZWxkID0gcHJvdG8zX2Rlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJ10KKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZV9maWVsZC5oYXNfcHJlc2VuY2UpCisgICAgb25lb2ZfZmllbGQgPSBwcm90bzNfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZVsnb25lb2ZfdWludDMyJ10KKyAgICBzZWxmLmFzc2VydFRydWUob25lb2ZfZmllbGQuaGFzX3ByZXNlbmNlKQorCisgIGRlZiB0ZXN0QXNzaWduVW5rbm93bkVudW0oc2VsZik6CisgICAgIiIiQXNzaWduaW5nIGFuIHVua25vd24gZW51bSB2YWx1ZSBpcyBhbGxvd2VkIGFuZCBwcmVzZXJ2ZXMgdGhlIHZhbHVlLiIiIgorICAgIG0gPSB1bml0dGVzdF9wcm90bzNfYXJlbmFfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICAjIFByb3RvMyBjYW4gYXNzaWduIHVua25vd24gZW51bXMuCisgICAgbS5vcHRpb25hbF9uZXN0ZWRfZW51bSA9IDEyMzQ1NjcKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEyMzQ1NjcsIG0ub3B0aW9uYWxfbmVzdGVkX2VudW0pCisgICAgbS5yZXBlYXRlZF9uZXN0ZWRfZW51bS5hcHBlbmQoMjIzMzQ0NTUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMjMzNDQ1NSwgbS5yZXBlYXRlZF9uZXN0ZWRfZW51bVswXSkKKyAgICAjIEFzc2lnbm1lbnQgaXMgYSBkaWZmZXJlbnQgY29kZSBwYXRoIHRoYW4gYXBwZW5kIGZvciB0aGUgQysrIGltcGwuCisgICAgbS5yZXBlYXRlZF9uZXN0ZWRfZW51bVswXSA9IDc2NTQzMjEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDc2NTQzMjEsIG0ucmVwZWF0ZWRfbmVzdGVkX2VudW1bMF0pCisgICAgc2VyaWFsaXplZCA9IG0uU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgbTIgPSB1bml0dGVzdF9wcm90bzNfYXJlbmFfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbTIuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMjM0NTY3LCBtMi5vcHRpb25hbF9uZXN0ZWRfZW51bSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDc2NTQzMjEsIG0yLnJlcGVhdGVkX25lc3RlZF9lbnVtWzBdKQorCisgICMgTWFwIGlzbid0IHJlYWxseSBhIHByb3RvMy1vbmx5IGZlYXR1cmUuIEJ1dCB0aGVyZSBpcyBubyBwcm90bzIgZXF1aXZhbGVudAorICAjIG9mIGdvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucHJvdG8gcmlnaHQgbm93LCBzbyBpdCdzIG5vdCBlYXN5IHRvCisgICMgdGVzdCBib3RoIHdpdGggdGhlIHNhbWUgdGVzdCBsaWtlIHdlIGRvIGZvciB0aGUgb3RoZXIgcHJvdG8yL3Byb3RvMyB0ZXN0cy4KKyAgIyAoZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucHJvdG8gaXMgdmVyeSBkaWZmZXJlbnQgaW4gdGhlIHNldAorICAjIG9mIG1lc3NhZ2VzIGFuZCBmaWVsZHMgaXQgY29udGFpbnMpLgorICBkZWYgdGVzdFNjYWxhck1hcERlZmF1bHRzKHNlbGYpOgorICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisKKyAgICAjIFNjYWxhcnMgc3RhcnQgb3V0IHVuc2V0LgorICAgIHNlbGYuYXNzZXJ0RmFsc2UoLTEyMyBpbiBtc2cubWFwX2ludDMyX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoLTIqKjMzIGluIG1zZy5tYXBfaW50NjRfaW50NjQpCisgICAgc2VsZi5hc3NlcnRGYWxzZSgxMjMgaW4gbXNnLm1hcF91aW50MzJfdWludDMyKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoMioqMzMgaW4gbXNnLm1hcF91aW50NjRfdWludDY0KQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoMTIzIGluIG1zZy5tYXBfaW50MzJfZG91YmxlKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoRmFsc2UgaW4gbXNnLm1hcF9ib29sX2Jvb2wpCisgICAgc2VsZi5hc3NlcnRGYWxzZSgnYWJjJyBpbiBtc2cubWFwX3N0cmluZ19zdHJpbmcpCisgICAgc2VsZi5hc3NlcnRGYWxzZSgxMTEgaW4gbXNnLm1hcF9pbnQzMl9ieXRlcykKKyAgICBzZWxmLmFzc2VydEZhbHNlKDg4OCBpbiBtc2cubWFwX2ludDMyX2VudW0pCisKKyAgICAjIEFjY2Vzc2luZyBhbiB1bnNldCBrZXkgcmV0dXJucyB0aGUgZGVmYXVsdC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG1zZy5tYXBfaW50MzJfaW50MzJbLTEyM10pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtc2cubWFwX2ludDY0X2ludDY0Wy0yKiozM10pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtc2cubWFwX3VpbnQzMl91aW50MzJbMTIzXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG1zZy5tYXBfdWludDY0X3VpbnQ2NFsyKiozM10pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLjAsIG1zZy5tYXBfaW50MzJfZG91YmxlWzEyM10pCisgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnLm1hcF9pbnQzMl9kb3VibGVbMTIzXSwgZmxvYXQpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIG1zZy5tYXBfYm9vbF9ib29sW0ZhbHNlXSkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2cubWFwX2Jvb2xfYm9vbFtGYWxzZV0sIGJvb2wpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1snYWJjJ10pCisgICAgc2VsZi5hc3NlcnRFcXVhbChiJycsIG1zZy5tYXBfaW50MzJfYnl0ZXNbMTExXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG1zZy5tYXBfaW50MzJfZW51bVs4ODhdKQorCisgICAgIyBJdCBhbHNvIHNldHMgdGhlIHZhbHVlIGluIHRoZSBtYXAKKyAgICBzZWxmLmFzc2VydFRydWUoLTEyMyBpbiBtc2cubWFwX2ludDMyX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMioqMzMgaW4gbXNnLm1hcF9pbnQ2NF9pbnQ2NCkKKyAgICBzZWxmLmFzc2VydFRydWUoMTIzIGluIG1zZy5tYXBfdWludDMyX3VpbnQzMikKKyAgICBzZWxmLmFzc2VydFRydWUoMioqMzMgaW4gbXNnLm1hcF91aW50NjRfdWludDY0KQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxMjMgaW4gbXNnLm1hcF9pbnQzMl9kb3VibGUpCisgICAgc2VsZi5hc3NlcnRUcnVlKEZhbHNlIGluIG1zZy5tYXBfYm9vbF9ib29sKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYWJjJyBpbiBtc2cubWFwX3N0cmluZ19zdHJpbmcpCisgICAgc2VsZi5hc3NlcnRUcnVlKDExMSBpbiBtc2cubWFwX2ludDMyX2J5dGVzKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSg4ODggaW4gbXNnLm1hcF9pbnQzMl9lbnVtKQorCisgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZy5tYXBfc3RyaW5nX3N0cmluZ1snYWJjJ10sIHN0cikKKworICAgICMgQWNjZXNzaW5nIGFuIHVuc2V0IGtleSBzdGlsbCB0aHJvd3MgVHlwZUVycm9yIGlmIHRoZSB0eXBlIG9mIHRoZSBrZXkKKyAgICAjIGlzIGluY29ycmVjdC4KKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICBtc2cubWFwX3N0cmluZ19zdHJpbmdbMTIzXQorCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgMTIzIGluIG1zZy5tYXBfc3RyaW5nX3N0cmluZworCisgIGRlZiB0ZXN0TWFwR2V0KHNlbGYpOgorICAgICMgTmVlZCB0byB0ZXN0IHRoYXQgZ2V0KCkgcHJvcGVybHkgcmV0dXJucyB0aGUgZGVmYXVsdCwgZXZlbiB0aG91Z2ggdGhlIGRpY3QKKyAgICAjIGhhcyBkZWZhdWx0ZGljdC1saWtlIHNlbWFudGljcy4KKyAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorCisgICAgc2VsZi5hc3NlcnRJc05vbmUobXNnLm1hcF9pbnQzMl9pbnQzMi5nZXQoNSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMCwgbXNnLm1hcF9pbnQzMl9pbnQzMi5nZXQoNSwgMTApKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAsIG1zZy5tYXBfaW50MzJfaW50MzIuZ2V0KGtleT01LCBkZWZhdWx0PTEwKSkKKyAgICBzZWxmLmFzc2VydElzTm9uZShtc2cubWFwX2ludDMyX2ludDMyLmdldCg1KSkKKworICAgIG1zZy5tYXBfaW50MzJfaW50MzJbNV0gPSAxNQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTUsIG1zZy5tYXBfaW50MzJfaW50MzIuZ2V0KDUpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTUsIG1zZy5tYXBfaW50MzJfaW50MzIuZ2V0KDUpKQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgIG1zZy5tYXBfaW50MzJfaW50MzIuZ2V0KCcnKQorCisgICAgc2VsZi5hc3NlcnRJc05vbmUobXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UuZ2V0KDUpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAsIG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlLmdldCg1LCAxMCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMCwgbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UuZ2V0KGtleT01LCBkZWZhdWx0PTEwKSkKKworICAgIHN1Ym1zZyA9IG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzVdCisgICAgc2VsZi5hc3NlcnRJcyhzdWJtc2csIG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlLmdldCg1KSkKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5nZXQoJycpCisKKyAgZGVmIHRlc3RTY2FsYXJNYXAoc2VsZik6CisgICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKG1zZy5tYXBfaW50MzJfaW50MzIpKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoNSBpbiBtc2cubWFwX2ludDMyX2ludDMyKQorCisgICAgbXNnLm1hcF9pbnQzMl9pbnQzMlstMTIzXSA9IC00NTYKKyAgICBtc2cubWFwX2ludDY0X2ludDY0Wy0yKiozM10gPSAtMioqMzQKKyAgICBtc2cubWFwX3VpbnQzMl91aW50MzJbMTIzXSA9IDQ1NgorICAgIG1zZy5tYXBfdWludDY0X3VpbnQ2NFsyKiozM10gPSAyKiozNAorICAgIG1zZy5tYXBfaW50MzJfZmxvYXRbMl0gPSAxLjIKKyAgICBtc2cubWFwX2ludDMyX2RvdWJsZVsxXSA9IDMuMworICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1snYWJjJ10gPSAnMTIzJworICAgIG1zZy5tYXBfYm9vbF9ib29sW1RydWVdID0gVHJ1ZQorICAgIG1zZy5tYXBfaW50MzJfZW51bVs4ODhdID0gMgorICAgICMgVW5rbm93biBudW1lcmljIGVudW0gaXMgc3VwcG9ydGVkIGluIHByb3RvMy4KKyAgICBtc2cubWFwX2ludDMyX2VudW1bMTIzXSA9IDQ1NgorCisgICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgbXNnLkZpbmRJbml0aWFsaXphdGlvbkVycm9ycygpKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4obXNnLm1hcF9zdHJpbmdfc3RyaW5nKSkKKworICAgICMgQmFkIGtleS4KKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICBtc2cubWFwX3N0cmluZ19zdHJpbmdbMTIzXSA9ICcxMjMnCisKKyAgICAjIFZlcmlmeSB0aGF0IHRyeWluZyB0byBhc3NpZ24gYSBiYWQga2V5IGRvZXNuJ3QgYWN0dWFsbHkgYWRkIGEgbWVtYmVyIHRvCisgICAgIyB0aGUgbWFwLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKG1zZy5tYXBfc3RyaW5nX3N0cmluZykpCisKKyAgICAjIEJhZCB2YWx1ZS4KKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICBtc2cubWFwX3N0cmluZ19zdHJpbmdbJzEyMyddID0gMTIzCisKKyAgICBzZXJpYWxpemVkID0gbXNnLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBtc2cyID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKKyAgICBtc2cyLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorCisgICAgIyBCYWQga2V5LgorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgIG1zZzIubWFwX3N0cmluZ19zdHJpbmdbMTIzXSA9ICcxMjMnCisKKyAgICAjIEJhZCB2YWx1ZS4KKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICBtc2cyLm1hcF9zdHJpbmdfc3RyaW5nWycxMjMnXSA9IDEyMworCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtNDU2LCBtc2cyLm1hcF9pbnQzMl9pbnQzMlstMTIzXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKC0yKiozNCwgbXNnMi5tYXBfaW50NjRfaW50NjRbLTIqKjMzXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQ1NiwgbXNnMi5tYXBfdWludDMyX3VpbnQzMlsxMjNdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMioqMzQsIG1zZzIubWFwX3VpbnQ2NF91aW50NjRbMioqMzNdKQorICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoMS4yLCBtc2cubWFwX2ludDMyX2Zsb2F0WzJdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMy4zLCBtc2cubWFwX2ludDMyX2RvdWJsZVsxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCcxMjMnLCBtc2cyLm1hcF9zdHJpbmdfc3RyaW5nWydhYmMnXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIG1zZzIubWFwX2Jvb2xfYm9vbFtUcnVlXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG1zZzIubWFwX2ludDMyX2VudW1bODg4XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQ1NiwgbXNnMi5tYXBfaW50MzJfZW51bVsxMjNdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3stMTIzOiAtNDU2fScsIHN0cihtc2cyLm1hcF9pbnQzMl9pbnQzMikpCisKKyAgZGVmIHRlc3RNYXBFbnRyeUFsd2F5c1NlcmlhbGl6ZWQoc2VsZik6CisgICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKKyAgICBtc2cubWFwX2ludDMyX2ludDMyWzBdID0gMAorICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1snJ10gPSAnJworICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLkJ5dGVTaXplKCksIDEyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidcblx4MDRceDA4XHgwMFx4MTBceDAwclx4MDRcblx4MDBceDEyXHgwMCcsCisgICAgICAgICAgICAgICAgICAgICBtc2cuU2VyaWFsaXplVG9TdHJpbmcoKSkKKworICBkZWYgdGVzdFN0cmluZ1VuaWNvZGVDb252ZXJzaW9uSW5NYXAoc2VsZik6CisgICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKKworICAgIHVuaWNvZGVfb2JqID0gdSdcdTEyMzQnCisgICAgYnl0ZXNfb2JqID0gdW5pY29kZV9vYmouZW5jb2RlKCd1dGY4JykKKworICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1tieXRlc19vYmpdID0gYnl0ZXNfb2JqCisKKyAgICAoa2V5LCB2YWx1ZSkgPSBsaXN0KG1zZy5tYXBfc3RyaW5nX3N0cmluZy5pdGVtcygpKVswXQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChrZXksIHVuaWNvZGVfb2JqKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsIHVuaWNvZGVfb2JqKQorCisgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGtleSwgc3RyKQorICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2YWx1ZSwgc3RyKQorCisgIGRlZiB0ZXN0TWVzc2FnZU1hcChzZWxmKToKKyAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4obXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UpKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoNSBpbiBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSkKKworICAgIG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzEyM10KKyAgICAjIGdldF9vcl9jcmVhdGUoKSBpcyBhbiBhbGlhcyBmb3IgZ2V0aXRlbS4KKyAgICBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5nZXRfb3JfY3JlYXRlKC00NTYpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSkpCisgICAgc2VsZi5hc3NlcnRJbigxMjMsIG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0SW4oLTQ1NiwgbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4obXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UpKQorCisgICAgIyBCYWQga2V5LgorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgIG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWycxMjMnXQorCisgICAgIyBDYW4ndCBhc3NpZ24gZGlyZWN0bHkgdG8gc3VibWVzc2FnZS4KKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbOTk5XSA9IG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzEyM10KKworICAgICMgVmVyaWZ5IHRoYXQgdHJ5aW5nIHRvIGFzc2lnbiBhIGJhZCBrZXkgZG9lc24ndCBhY3R1YWxseSBhZGQgYSBtZW1iZXIgdG8KKyAgICAjIHRoZSBtYXAuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4obXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UpKQorCisgICAgc2VyaWFsaXplZCA9IG1zZy5TZXJpYWxpemVUb1N0cmluZygpCisgICAgbXNnMiA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgbXNnMi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKG1zZzIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSkpCisgICAgc2VsZi5hc3NlcnRJbigxMjMsIG1zZzIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEluKC00NTYsIG1zZzIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihtc2cyLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UpKQorICAgIG1zZzIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsxMjNdLmMgPSAxCisgICAgIyBUT0RPKGppZWx1byk6IEZpeCB0ZXh0IGZvcm1hdCBmb3IgbWVzc2FnZSBtYXAuCisgICAgc2VsZi5hc3NlcnRJbigKKyAgICAgICAgc3RyKG1zZzIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSksCisgICAgICAgICgney00NTY6ICwgMTIzOiBjOiAxXG59JywgJ3sxMjM6IGM6IDFcbiwgLTQ1NjogfScpKQorCisgIGRlZiB0ZXN0TmVzdGVkTWVzc2FnZU1hcEl0ZW1EZWxldGUoc2VsZik6CisgICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKKyAgICBtc2cubWFwX2ludDMyX2FsbF90eXBlc1sxXS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDEKKyAgICBkZWwgbXNnLm1hcF9pbnQzMl9hbGxfdHlwZXNbMV0KKyAgICBtc2cubWFwX2ludDMyX2FsbF90eXBlc1syXS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDIKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihtc2cubWFwX2ludDMyX2FsbF90eXBlcykpCisgICAgbXNnLm1hcF9pbnQzMl9hbGxfdHlwZXNbMV0ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgPSAxCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4obXNnLm1hcF9pbnQzMl9hbGxfdHlwZXMpKQorCisgICAgc2VyaWFsaXplZCA9IG1zZy5TZXJpYWxpemVUb1N0cmluZygpCisgICAgbXNnMiA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgbXNnMi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKyAgICBrZXlzID0gWzEsIDJdCisgICAgIyBUaGUgbG9vcCB0cmlnZ2VycyBQeUVycl9PY2N1cnJlZCgpIGluIGMgZXh0ZW5zaW9uLgorICAgIGZvciBrZXkgaW4ga2V5czoKKyAgICAgIGRlbCBtc2cyLm1hcF9pbnQzMl9hbGxfdHlwZXNba2V5XQorCisgIGRlZiB0ZXN0TWFwQnl0ZVNpemUoc2VsZik6CisgICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKKyAgICBtc2cubWFwX2ludDMyX2ludDMyWzFdID0gMQorICAgIHNpemUgPSBtc2cuQnl0ZVNpemUoKQorICAgIG1zZy5tYXBfaW50MzJfaW50MzJbMV0gPSAxMjgKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5CeXRlU2l6ZSgpLCBzaXplICsgMSkKKworICAgIG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzE5XS5jID0gMQorICAgIHNpemUgPSBtc2cuQnl0ZVNpemUoKQorICAgIG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzE5XS5jID0gMTI4CisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuQnl0ZVNpemUoKSwgc2l6ZSArIDEpCisKKyAgZGVmIHRlc3RNZXJnZUZyb20oc2VsZik6CisgICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKKyAgICBtc2cubWFwX2ludDMyX2ludDMyWzEyXSA9IDM0CisgICAgbXNnLm1hcF9pbnQzMl9pbnQzMls1Nl0gPSA3OAorICAgIG1zZy5tYXBfaW50NjRfaW50NjRbMjJdID0gMzMKKyAgICBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsxMTFdLmMgPSA1CisgICAgbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMjIyXS5jID0gMTAKKworICAgIG1zZzIgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorICAgIG1zZzIubWFwX2ludDMyX2ludDMyWzEyXSA9IDU1CisgICAgbXNnMi5tYXBfaW50NjRfaW50NjRbODhdID0gOTkKKyAgICBtc2cyLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMjIyXS5jID0gMTUKKyAgICBtc2cyLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMjIyXS5kID0gMjAKKyAgICBvbGRfbWFwX3ZhbHVlID0gbXNnMi5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzIyMl0KKworICAgIG1zZzIuTWVyZ2VGcm9tKG1zZykKKyAgICAjIENvbXBhcmUgd2l0aCBleHBlY3RlZCBtZXNzYWdlIGluc3RlYWQgb2YgY2FsbAorICAgICMgbXNnMi5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzIyMl0gdG8gbWFrZSBzdXJlIE1lcmdlRnJvbSBkb2VzIG5vdAorICAgICMgc3luYyB3aXRoIHJlcGVhdGVkIGZpZWxkIGFuZCB0aGVyZSBpcyBubyBkdXBsaWNhdGVkIGtleXMuCisgICAgZXhwZWN0ZWRfbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKKyAgICBleHBlY3RlZF9tc2cuQ29weUZyb20obXNnKQorICAgIGV4cGVjdGVkX21zZy5tYXBfaW50NjRfaW50NjRbODhdID0gOTkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1zZzIsIGV4cGVjdGVkX21zZykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzQsIG1zZzIubWFwX2ludDMyX2ludDMyWzEyXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDc4LCBtc2cyLm1hcF9pbnQzMl9pbnQzMls1Nl0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzMywgbXNnMi5tYXBfaW50NjRfaW50NjRbMjJdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIG1zZzIubWFwX2ludDY0X2ludDY0Wzg4XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIG1zZzIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsxMTFdLmMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMCwgbXNnMi5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzIyMl0uYykKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1zZzIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsyMjJdLkhhc0ZpZWxkKCdkJykpCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAnY3BwJzoKKyAgICAgICMgRHVyaW5nIHRoZSBjYWxsIHRvIE1lcmdlRnJvbSgpLCB0aGUgQysrIGltcGxlbWVudGF0aW9uIHdpbGwgaGF2ZQorICAgICAgIyBkZWFsbG9jYXRlZCB0aGUgdW5kZXJseWluZyBtZXNzYWdlLCBidXQgdGhpcyBpcyB2ZXJ5IGRpZmZpY3VsdCB0byBkZXRlY3QKKyAgICAgICMgcHJvcGVybHkuIFRoZSBsaW5lIGJlbG93IGlzIGxpa2VseSB0byBjYXVzZSBhIHNlZ21lbnRhdGlvbiBmYXVsdC4KKyAgICAgICMgV2l0aCB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uLCBvbGRfbWFwX3ZhbHVlIGlzIGp1c3QgJ2RldGFjaGVkJyBmcm9tCisgICAgICAjIHRoZSBtYWluIG1lc3NhZ2UuIFVzaW5nIGl0IHdpbGwgbm90IGNyYXNoIG9mIGNvdXJzZSwgYnV0IHNpbmNlIGl0IHN0aWxsCisgICAgICAjIGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBtZXNzYWdlIEknbSBzdXJlIHdlIGNhbiBmaW5kIGludGVyZXN0aW5nCisgICAgICAjIHdheXMgdG8gY2F1c2UgaW5jb25zaXN0ZW5jaWVzLgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxNSwgb2xkX21hcF92YWx1ZS5jKQorCisgICAgIyBWZXJpZnkgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBlbnRyeSBwZXIga2V5LCBldmVuIHRob3VnaCB0aGUgTWVyZ2VGcm9tCisgICAgIyBtYXkgaGF2ZSBpbnRlcm5hbGx5IGNyZWF0ZWQgbXVsdGlwbGUgZW50cmllcyBmb3IgYSBzaW5nbGUga2V5IGluIHRoZQorICAgICMgbGlzdCByZXByZXNlbnRhdGlvbi4KKyAgICBhc19kaWN0ID0ge30KKyAgICBmb3Iga2V5IGluIG1zZzIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZToKKyAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoa2V5IGluIGFzX2RpY3QpCisgICAgICBhc19kaWN0W2tleV0gPSBtc2cyLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2Vba2V5XS5jCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKHsxMTE6IDUsIDIyMjogMTB9LCBhc19kaWN0KQorCisgICAgIyBTcGVjaWFsIGNhc2U6IHRlc3QgdGhhdCBkZWxldGUgb2YgaXRlbSByZWFsbHkgcmVtb3ZlcyB0aGUgaXRlbSwgZXZlbiBpZgorICAgICMgdGhlcmUgbWlnaHQgaGF2ZSBwaHlzaWNhbGx5IGJlZW4gZHVwbGljYXRlIGtleXMgZHVlIHRvIHRoZSBwcmV2aW91cyBtZXJnZS4KKyAgICAjIFRoaXMgaXMgb25seSBhIHNwZWNpYWwgY2FzZSBmb3IgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiB3aGljaCBzdG9yZXMgdGhlCisgICAgIyBtYXAgYXMgYW4gYXJyYXkuCisgICAgZGVsIG1zZzIubWFwX2ludDMyX2ludDMyWzEyXQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoMTIgaW4gbXNnMi5tYXBfaW50MzJfaW50MzIpCisKKyAgICBkZWwgbXNnMi5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzIyMl0KKyAgICBzZWxmLmFzc2VydEZhbHNlKDIyMiBpbiBtc2cyLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgZGVsIG1zZzIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsnJ10KKworICBkZWYgdGVzdE1hcE1lcmdlRnJvbShzZWxmKToKKyAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorICAgIG1zZy5tYXBfaW50MzJfaW50MzJbMTJdID0gMzQKKyAgICBtc2cubWFwX2ludDMyX2ludDMyWzU2XSA9IDc4CisgICAgbXNnLm1hcF9pbnQ2NF9pbnQ2NFsyMl0gPSAzMworICAgIG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzExMV0uYyA9IDUKKyAgICBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsyMjJdLmMgPSAxMAorCisgICAgbXNnMiA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgbXNnMi5tYXBfaW50MzJfaW50MzJbMTJdID0gNTUKKyAgICBtc2cyLm1hcF9pbnQ2NF9pbnQ2NFs4OF0gPSA5OQorICAgIG1zZzIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsyMjJdLmMgPSAxNQorICAgIG1zZzIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsyMjJdLmQgPSAyMAorCisgICAgbXNnMi5tYXBfaW50MzJfaW50MzIuTWVyZ2VGcm9tKG1zZy5tYXBfaW50MzJfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzNCwgbXNnMi5tYXBfaW50MzJfaW50MzJbMTJdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNzgsIG1zZzIubWFwX2ludDMyX2ludDMyWzU2XSkKKworICAgIG1zZzIubWFwX2ludDY0X2ludDY0Lk1lcmdlRnJvbShtc2cubWFwX2ludDY0X2ludDY0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzMsIG1zZzIubWFwX2ludDY0X2ludDY0WzIyXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBtc2cyLm1hcF9pbnQ2NF9pbnQ2NFs4OF0pCisKKyAgICBtc2cyLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UuTWVyZ2VGcm9tKG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKQorICAgICMgQ29tcGFyZSB3aXRoIGV4cGVjdGVkIG1lc3NhZ2UgaW5zdGVhZCBvZiBjYWxsCisgICAgIyBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsyMjJdIHRvIG1ha2Ugc3VyZSBNZXJnZUZyb20gZG9lcyBub3QKKyAgICAjIHN5bmMgd2l0aCByZXBlYXRlZCBmaWVsZCBhbmQgbm8gZHVwbGljYXRlZCBrZXlzLgorICAgIGV4cGVjdGVkX21zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgZXhwZWN0ZWRfbXNnLkNvcHlGcm9tKG1zZykKKyAgICBleHBlY3RlZF9tc2cubWFwX2ludDY0X2ludDY0Wzg4XSA9IDk5CisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cyLCBleHBlY3RlZF9tc2cpCisKKyAgICAjIFRlc3Qgd2hlbiBjcHAgZXh0ZW5zaW9uIGNhY2hlIGEgbWFwLgorICAgIG0xID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKKyAgICBtMiA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtMS5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlLCBtMS5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKQorICAgIG0yLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMTIzXS5jID0gMTAKKyAgICBtMS5NZXJnZUZyb20obTIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMCwgbTIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsxMjNdLmMpCisKKyAgICAjIFRlc3QgbWVyZ2UgbWFwcyB3aXRoaW4gZGlmZmVyZW50IG1lc3NhZ2UgdHlwZXMuCisgICAgbTEgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorICAgIG0yID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWVzc2FnZU1hcCgpCisgICAgbTIubWFwX2ludDMyX21lc3NhZ2VbMTIzXS5vcHRpb25hbF9pbnQzMiA9IDEwCisgICAgbTEubWFwX2ludDMyX2FsbF90eXBlcy5NZXJnZUZyb20obTIubWFwX2ludDMyX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMCwgbTEubWFwX2ludDMyX2FsbF90eXBlc1sxMjNdLm9wdGlvbmFsX2ludDMyKQorCisgICAgIyBUZXN0IG92ZXJ3cml0ZSBtZXNzYWdlIHZhbHVlIG1hcAorICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMjIyXS5jID0gMTIzCisgICAgbXNnMiA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgbXNnMi5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzIyMl0uZCA9IDIwCisgICAgbXNnLk1lcmdlRnJvbVN0cmluZyhtc2cyLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsyMjJdLmQsIDIwKQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMjIyXS5jLCAxMjMpCisKKyAgICAjIE1lcmdlIGEgZGljdCB0byBtYXAgZmllbGQgaXMgbm90IGFjY2VwdGVkCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICBtMS5tYXBfaW50MzJfYWxsX3R5cGVzLk1lcmdlRnJvbSgKKyAgICAgICAgICB7MTogdW5pdHRlc3RfcHJvdG8zX2FyZW5hX3BiMi5UZXN0QWxsVHlwZXMoKX0pCisKKyAgZGVmIHRlc3RNZXJnZUZyb21CYWRUeXBlKHNlbGYpOgorICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgIHInUGFyYW1ldGVyIHRvIE1lcmdlRnJvbVwoXCkgbXVzdCBiZSBpbnN0YW5jZSBvZiBzYW1lIGNsYXNzOiBleHBlY3RlZCAnCisgICAgICAgIHInLitUZXN0TWFwIGdvdCBpbnRcLicpOgorICAgICAgbXNnLk1lcmdlRnJvbSgxKQorCisgIGRlZiB0ZXN0Q29weUZyb21CYWRUeXBlKHNlbGYpOgorICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgIHInUGFyYW1ldGVyIHRvIFtBLVphLXpdKkZyb21cKFwpIG11c3QgYmUgaW5zdGFuY2Ugb2Ygc2FtZSBjbGFzczogJworICAgICAgICByJ2V4cGVjdGVkIC4rVGVzdE1hcCBnb3QgaW50XC4nKToKKyAgICAgIG1zZy5Db3B5RnJvbSgxKQorCisgIGRlZiB0ZXN0SW50ZWdlck1hcFdpdGhMb25ncyhzZWxmKToKKyAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorICAgIG1zZy5tYXBfaW50MzJfaW50MzJbaW50KC0xMjMpXSA9IGludCgtNDU2KQorICAgIG1zZy5tYXBfaW50NjRfaW50NjRbaW50KC0yKiozMyldID0gaW50KC0yKiozNCkKKyAgICBtc2cubWFwX3VpbnQzMl91aW50MzJbaW50KDEyMyldID0gaW50KDQ1NikKKyAgICBtc2cubWFwX3VpbnQ2NF91aW50NjRbaW50KDIqKjMzKV0gPSBpbnQoMioqMzQpCisKKyAgICBzZXJpYWxpemVkID0gbXNnLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBtc2cyID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKKyAgICBtc2cyLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtNDU2LCBtc2cyLm1hcF9pbnQzMl9pbnQzMlstMTIzXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKC0yKiozNCwgbXNnMi5tYXBfaW50NjRfaW50NjRbLTIqKjMzXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQ1NiwgbXNnMi5tYXBfdWludDMyX3VpbnQzMlsxMjNdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMioqMzQsIG1zZzIubWFwX3VpbnQ2NF91aW50NjRbMioqMzNdKQorCisgIGRlZiB0ZXN0TWFwQXNzaWdubWVudENhdXNlc1ByZXNlbmNlKHNlbGYpOgorICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcFN1Ym1lc3NhZ2UoKQorICAgIG1zZy50ZXN0X21hcC5tYXBfaW50MzJfaW50MzJbMTIzXSA9IDQ1NgorCisgICAgc2VyaWFsaXplZCA9IG1zZy5TZXJpYWxpemVUb1N0cmluZygpCisgICAgbXNnMiA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcFN1Ym1lc3NhZ2UoKQorICAgIG1zZzIuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgbXNnMikKKworICAgICMgTm93IHRlc3QgdGhhdCB2YXJpb3VzIG11dGF0aW9ucyBvZiB0aGUgbWFwIHByb3Blcmx5IGludmFsaWRhdGUgdGhlCisgICAgIyBjYWNoZWQgc2l6ZSBvZiB0aGUgc3VibWVzc2FnZS4KKyAgICBtc2cudGVzdF9tYXAubWFwX2ludDMyX2ludDMyWzg4OF0gPSA5OTkKKyAgICBzZXJpYWxpemVkID0gbXNnLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBtc2cyLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBtc2cyKQorCisgICAgbXNnLnRlc3RfbWFwLm1hcF9pbnQzMl9pbnQzMi5jbGVhcigpCisgICAgc2VyaWFsaXplZCA9IG1zZy5TZXJpYWxpemVUb1N0cmluZygpCisgICAgbXNnMi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgbXNnMikKKworICBkZWYgdGVzdE1hcEFzc2lnbm1lbnRDYXVzZXNQcmVzZW5jZUZvclN1Ym1lc3NhZ2VzKHNlbGYpOgorICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcFN1Ym1lc3NhZ2UoKQorICAgIG1zZy50ZXN0X21hcC5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzEyM10uYyA9IDUKKworICAgIHNlcmlhbGl6ZWQgPSBtc2cuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIG1zZzIgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXBTdWJtZXNzYWdlKCkKKyAgICBtc2cyLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIG1zZzIpCisKKyAgICAjIE5vdyB0ZXN0IHRoYXQgdmFyaW91cyBtdXRhdGlvbnMgb2YgdGhlIG1hcCBwcm9wZXJseSBpbnZhbGlkYXRlIHRoZQorICAgICMgY2FjaGVkIHNpemUgb2YgdGhlIHN1Ym1lc3NhZ2UuCisgICAgbXNnLnRlc3RfbWFwLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbODg4XS5jID0gNworICAgIHNlcmlhbGl6ZWQgPSBtc2cuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIG1zZzIuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIG1zZzIpCisKKyAgICBtc2cudGVzdF9tYXAubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVs4ODhdLk1lcmdlRnJvbSgKKyAgICAgICAgbXNnLnRlc3RfbWFwLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMTIzXSkKKyAgICBzZXJpYWxpemVkID0gbXNnLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBtc2cyLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBtc2cyKQorCisgICAgbXNnLnRlc3RfbWFwLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UuY2xlYXIoKQorICAgIHNlcmlhbGl6ZWQgPSBtc2cuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIG1zZzIuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIG1zZzIpCisKKyAgZGVmIHRlc3RNb2RpZnlNYXBXaGlsZUl0ZXJhdGluZyhzZWxmKToKKyAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorCisgICAgc3RyaW5nX3N0cmluZ19pdGVyID0gaXRlcihtc2cubWFwX3N0cmluZ19zdHJpbmcpCisgICAgaW50MzJfZm9yZWlnbl9pdGVyID0gaXRlcihtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSkKKworICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1snYWJjJ10gPSAnMTIzJworICAgIG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzVdLmMgPSA1CisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICBmb3Iga2V5IGluIHN0cmluZ19zdHJpbmdfaXRlcjoKKyAgICAgICAgcGFzcworCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgZm9yIGtleSBpbiBpbnQzMl9mb3JlaWduX2l0ZXI6CisgICAgICAgIHBhc3MKKworICBkZWYgdGVzdE1vZGlmeU1hcEVudHJ5V2hpbGVJdGVyYXRpbmcoc2VsZik6CisgICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKKworICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1snYWJjJ10gPSAnMTIzJworICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1snZGVmJ10gPSAnNDU2JworICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1snZ2hpJ10gPSAnNzg5JworCisgICAgbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbNV0uYyA9IDUKKyAgICBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVs2XS5jID0gNgorICAgIG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzddLmMgPSA3CisKKyAgICBzdHJpbmdfc3RyaW5nX2tleXMgPSBsaXN0KG1zZy5tYXBfc3RyaW5nX3N0cmluZy5rZXlzKCkpCisgICAgaW50MzJfZm9yZWlnbl9rZXlzID0gbGlzdChtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5rZXlzKCkpCisKKyAgICBrZXlzID0gW10KKyAgICBmb3Iga2V5IGluIG1zZy5tYXBfc3RyaW5nX3N0cmluZzoKKyAgICAgIGtleXMuYXBwZW5kKGtleSkKKyAgICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1trZXldID0gJzAwMCcKKyAgICBzZWxmLmFzc2VydEVxdWFsKGtleXMsIHN0cmluZ19zdHJpbmdfa2V5cykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGtleXMsIGxpc3QobXNnLm1hcF9zdHJpbmdfc3RyaW5nLmtleXMoKSkpCisKKyAgICBrZXlzID0gW10KKyAgICBmb3Iga2V5IGluIG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlOgorICAgICAga2V5cy5hcHBlbmQoa2V5KQorICAgICAgbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2Vba2V5XS5jID0gMAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5cywgaW50MzJfZm9yZWlnbl9rZXlzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5cywgbGlzdChtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5rZXlzKCkpKQorCisgIGRlZiB0ZXN0U3VibWVzc2FnZU1hcChzZWxmKToKKyAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorCisgICAgc3VibXNnID0gbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMTExXQorICAgIHNlbGYuYXNzZXJ0SXMoc3VibXNnLCBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsxMTFdKQorICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWJtc2csIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZSkKKworICAgIHN1Ym1zZy5jID0gNQorCisgICAgc2VyaWFsaXplZCA9IG1zZy5TZXJpYWxpemVUb1N0cmluZygpCisgICAgbXNnMiA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgbXNnMi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgbXNnMi5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzExMV0uYykKKworICAgICMgRG9lc24ndCBhbGxvdyBkaXJlY3Qgc3VibWVzc2FnZSBhc3NpZ25tZW50LgorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVs4OF0gPSB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoKQorCisgIGRlZiB0ZXN0TWFwSXRlcmF0aW9uKHNlbGYpOgorICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisKKyAgICBmb3IgaywgdiBpbiBtc2cubWFwX2ludDMyX2ludDMyLml0ZW1zKCk6CisgICAgICAjIFNob3VsZCBub3QgYmUgcmVhY2hlZC4KKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGYWxzZSkKKworICAgIG1zZy5tYXBfaW50MzJfaW50MzJbMl0gPSA0CisgICAgbXNnLm1hcF9pbnQzMl9pbnQzMlszXSA9IDYKKyAgICBtc2cubWFwX2ludDMyX2ludDMyWzRdID0gOAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbGVuKG1zZy5tYXBfaW50MzJfaW50MzIpKQorCisgICAgbWF0Y2hpbmdfZGljdCA9IHsyOiA0LCAzOiA2LCA0OiA4fQorICAgIHNlbGYuYXNzZXJ0TWFwSXRlckVxdWFscyhtc2cubWFwX2ludDMyX2ludDMyLml0ZW1zKCksIG1hdGNoaW5nX2RpY3QpCisKKyAgZGVmIHRlc3RNYXBJdGVtcyhzZWxmKToKKyAgICAjIE1hcCBpdGVtcyB1c2VkIHRvIGhhdmUgc3RyYW5nZSBiZWhhdmlvcnMgd2hlbiB1c2UgYyBleHRlbnNpb24uIEJlY2F1c2UKKyAgICAjIFtdIG1heSByZW9yZGVyIHRoZSBtYXAgYW5kIGludmFsaWRhdGUgYW55IGV4aXN0aW5nIGl0ZXJhdG9ycy4KKyAgICAjIFRPRE8oamllbHVvKTogQ2hlY2sgaWYgW10gcmVvcmRlcmluZyB0aGUgbWFwIGlzIGEgYnVnIG9yIGludGVuZGVkCisgICAgIyBiZWhhdmlvci4KKyAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1snbG9jYWxfaW5pdF9vcCddID0gJycKKyAgICBtc2cubWFwX3N0cmluZ19zdHJpbmdbJ3RyYWluYWJsZV92YXJpYWJsZXMnXSA9ICcnCisgICAgbXNnLm1hcF9zdHJpbmdfc3RyaW5nWyd2YXJpYWJsZXMnXSA9ICcnCisgICAgbXNnLm1hcF9zdHJpbmdfc3RyaW5nWydpbml0X29wJ10gPSAnJworICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1snc3VtbWFyaWVzJ10gPSAnJworICAgIGl0ZW1zMSA9IG1zZy5tYXBfc3RyaW5nX3N0cmluZy5pdGVtcygpCisgICAgaXRlbXMyID0gbXNnLm1hcF9zdHJpbmdfc3RyaW5nLml0ZW1zKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW1zMSwgaXRlbXMyKQorCisgIGRlZiB0ZXN0TWFwRGV0ZXJtaW5pc3RpY1NlcmlhbGl6YXRpb24oc2VsZik6CisgICAgZ29sZGVuX2RhdGEgPSAoYidyXHgwY1xuXHgwN2luaXRfb3BceDEyXHgwMWQnCisgICAgICAgICAgICAgICAgICAgYidyXG5cblx4MDVpdGVtMVx4MTJceDAxZScKKyAgICAgICAgICAgICAgICAgICBiJ3JcblxuXHgwNWl0ZW0yXHgxMlx4MDFmJworICAgICAgICAgICAgICAgICAgIGInclxuXG5ceDA1aXRlbTNceDEyXHgwMWcnCisgICAgICAgICAgICAgICAgICAgYidyXHgwYlxuXHgwNWl0ZW00XHgxMlx4MDJRUScKKyAgICAgICAgICAgICAgICAgICBiJ3JceDEyXG5ccmxvY2FsX2luaXRfb3BceDEyXHgwMWEnCisgICAgICAgICAgICAgICAgICAgYidyXHgwZVxuXHRzdW1tYXJpZXNceDEyXHgwMWUnCisgICAgICAgICAgICAgICAgICAgYidyXHgxOFxuXHgxM3RyYWluYWJsZV92YXJpYWJsZXNceDEyXHgwMWInCisgICAgICAgICAgICAgICAgICAgYidyXHgwZVxuXHR2YXJpYWJsZXNceDEyXHgwMWMnKQorICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgbXNnLm1hcF9zdHJpbmdfc3RyaW5nWydsb2NhbF9pbml0X29wJ10gPSAnYScKKyAgICBtc2cubWFwX3N0cmluZ19zdHJpbmdbJ3RyYWluYWJsZV92YXJpYWJsZXMnXSA9ICdiJworICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1sndmFyaWFibGVzJ10gPSAnYycKKyAgICBtc2cubWFwX3N0cmluZ19zdHJpbmdbJ2luaXRfb3AnXSA9ICdkJworICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1snc3VtbWFyaWVzJ10gPSAnZScKKyAgICBtc2cubWFwX3N0cmluZ19zdHJpbmdbJ2l0ZW0xJ10gPSAnZScKKyAgICBtc2cubWFwX3N0cmluZ19zdHJpbmdbJ2l0ZW0yJ10gPSAnZicKKyAgICBtc2cubWFwX3N0cmluZ19zdHJpbmdbJ2l0ZW0zJ10gPSAnZycKKyAgICBtc2cubWFwX3N0cmluZ19zdHJpbmdbJ2l0ZW00J10gPSAnUVEnCisKKyAgICAjIElmIGRldGVybWluaXN0aWMgc2VyaWFsaXphdGlvbiBpcyBub3Qgd29ya2luZyBjb3JyZWN0bHksIHRoaXMgd2lsbCBiZQorICAgICMgImZsYWt5IiBkZXBlbmRpbmcgb24gdGhlIGV4YWN0IHB5dGhvbiBkaWN0IGhhc2ggc2VlZC4KKyAgICAjCisgICAgIyBGb3J0dW5hdGVseSwgdGhlcmUgYXJlIGVub3VnaCBpdGVtcyBpbiB0aGlzIG1hcCB0aGF0IGl0IGlzIGV4dHJlbWVseQorICAgICMgdW5saWtlbHkgdG8gZXZlciBoaXQgdGhlICJyaWdodCIgaW4tb3JkZXIgY29tYmluYXRpb24sIHNvIHRoZSB0ZXN0CisgICAgIyBpdHNlbGYgc2hvdWxkIGZhaWwgcmVsaWFibHkuCisgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fZGF0YSwgbXNnLlNlcmlhbGl6ZVRvU3RyaW5nKGRldGVybWluaXN0aWM9VHJ1ZSkpCisKKyAgZGVmIHRlc3RNYXBJdGVyYXRpb25DbGVhck1lc3NhZ2Uoc2VsZik6CisgICAgIyBJdGVyYXRvciBuZWVkcyB0byB3b3JrIGV2ZW4gaWYgbWVzc2FnZSBhbmQgbWFwIGFyZSBkZWxldGVkLgorICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisKKyAgICBtc2cubWFwX2ludDMyX2ludDMyWzJdID0gNAorICAgIG1zZy5tYXBfaW50MzJfaW50MzJbM10gPSA2CisgICAgbXNnLm1hcF9pbnQzMl9pbnQzMls0XSA9IDgKKworICAgIGl0ID0gbXNnLm1hcF9pbnQzMl9pbnQzMi5pdGVtcygpCisgICAgZGVsIG1zZworCisgICAgbWF0Y2hpbmdfZGljdCA9IHsyOiA0LCAzOiA2LCA0OiA4fQorICAgIHNlbGYuYXNzZXJ0TWFwSXRlckVxdWFscyhpdCwgbWF0Y2hpbmdfZGljdCkKKworICBkZWYgdGVzdE1hcENvbnN0cnVjdGlvbihzZWxmKToKKyAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAobWFwX2ludDMyX2ludDMyPXsxOiAyLCAzOiA0fSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG1zZy5tYXBfaW50MzJfaW50MzJbMV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBtc2cubWFwX2ludDMyX2ludDMyWzNdKQorCisgICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKAorICAgICAgICBtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlPXszOiB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz01KX0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVszXS5jKQorCisgIGRlZiB0ZXN0TWFwU2NhbGFyRmllbGRDb25zdHJ1Y3Rpb24oc2VsZik6CisgICAgbXNnMSA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgbXNnMS5tYXBfaW50MzJfaW50MzJbMV0gPSA0MgorICAgIG1zZzIgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAobWFwX2ludDMyX2ludDMyPW1zZzEubWFwX2ludDMyX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIG1zZzIubWFwX2ludDMyX2ludDMyWzFdKQorCisgIGRlZiB0ZXN0TWFwTWVzc2FnZUZpZWxkQ29uc3RydWN0aW9uKHNlbGYpOgorICAgIG1zZzEgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorICAgIG1zZzEubWFwX3N0cmluZ19mb3JlaWduX21lc3NhZ2VbJ3Rlc3QnXS5jID0gNDIKKyAgICBtc2cyID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKAorICAgICAgICBtYXBfc3RyaW5nX2ZvcmVpZ25fbWVzc2FnZT1tc2cxLm1hcF9zdHJpbmdfZm9yZWlnbl9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIG1zZzIubWFwX3N0cmluZ19mb3JlaWduX21lc3NhZ2VbJ3Rlc3QnXS5jKQorCisgIGRlZiB0ZXN0TWFwRmllbGRSYWlzZXNDb3JyZWN0RXJyb3Ioc2VsZik6CisgICAgIyBTaG91bGQgcmFpc2UgYSBUeXBlRXJyb3Igd2hlbiBnaXZlbiBhIG5vbi1pdGVyYWJsZS4KKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAobWFwX3N0cmluZ19mb3JlaWduX21lc3NhZ2U9MSkKKworICBkZWYgdGVzdE1hcFZhbGlkQWZ0ZXJGaWVsZENsZWFyZWQoc2VsZik6CisgICAgIyBNYXAgbmVlZHMgdG8gd29yayBldmVuIGlmIGZpZWxkIGlzIGNsZWFyZWQuCisgICAgIyBGb3IgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiB0aGlzIHRlc3RzIHRoZSBjb3JyZWN0bmVzcyBvZgorICAgICMgTWFwQ29udGFpbmVyOjpSZWxlYXNlKCkKKyAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorICAgIGludDMyX21hcCA9IG1zZy5tYXBfaW50MzJfaW50MzIKKworICAgIGludDMyX21hcFsyXSA9IDQKKyAgICBpbnQzMl9tYXBbM10gPSA2CisgICAgaW50MzJfbWFwWzRdID0gOAorCisgICAgbXNnLkNsZWFyRmllbGQoJ21hcF9pbnQzMl9pbnQzMicpCisgICAgc2VsZi5hc3NlcnRFcXVhbChiJycsIG1zZy5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIG1hdGNoaW5nX2RpY3QgPSB7MjogNCwgMzogNiwgNDogOH0KKyAgICBzZWxmLmFzc2VydE1hcEl0ZXJFcXVhbHMoaW50MzJfbWFwLml0ZW1zKCksIG1hdGNoaW5nX2RpY3QpCisKKyAgZGVmIHRlc3RNZXNzYWdlTWFwVmFsaWRBZnRlckZpZWxkQ2xlYXJlZChzZWxmKToKKyAgICAjIE1hcCBuZWVkcyB0byB3b3JrIGV2ZW4gaWYgZmllbGQgaXMgY2xlYXJlZC4KKyAgICAjIEZvciB0aGUgQysrIGltcGxlbWVudGF0aW9uIHRoaXMgdGVzdHMgdGhlIGNvcnJlY3RuZXNzIG9mCisgICAgIyBNYXBDb250YWluZXI6OlJlbGVhc2UoKQorICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgaW50MzJfZm9yZWlnbl9tZXNzYWdlID0gbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UKKworICAgIGludDMyX2ZvcmVpZ25fbWVzc2FnZVsyXS5jID0gNQorCisgICAgbXNnLkNsZWFyRmllbGQoJ21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLCBtc2cuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydFRydWUoMiBpbiBpbnQzMl9mb3JlaWduX21lc3NhZ2Uua2V5cygpKQorCisgIGRlZiB0ZXN0TWVzc2FnZU1hcEl0ZW1WYWxpZEFmdGVyVG9wTWVzc2FnZUNsZWFyZWQoc2VsZik6CisgICAgIyBNZXNzYWdlIG1hcCBpdGVtIG5lZWRzIHRvIHdvcmsgZXZlbiBpZiBpdCBpcyBjbGVhcmVkLgorICAgICMgRm9yIHRoZSBDKysgaW1wbGVtZW50YXRpb24gdGhpcyB0ZXN0cyB0aGUgY29ycmVjdG5lc3Mgb2YKKyAgICAjIE1hcENvbnRhaW5lcjo6UmVsZWFzZSgpCisgICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKKyAgICBtc2cubWFwX2ludDMyX2FsbF90eXBlc1syXS5vcHRpb25hbF9zdHJpbmcgPSAnYmFyJworCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAnY3BwJzoKKyAgICAgICMgTmVlZCB0byBrZWVwIHRoZSBtYXAgcmVmZXJlbmNlIGJlY2F1c2Ugb2YgYi8yNzk0MjYyNi4KKyAgICAgICMgVE9ETyhqaWVsdW8pOiBSZW1vdmUgaXQuCisgICAgICB1bnVzZWRfbWFwID0gbXNnLm1hcF9pbnQzMl9hbGxfdHlwZXMgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC12YXJpYWJsZQorICAgIG1zZ192YWx1ZSA9IG1zZy5tYXBfaW50MzJfYWxsX3R5cGVzWzJdCisgICAgbXNnLkNsZWFyKCkKKworICAgICMgUmVzZXQgdG8gdHJpZ2dlciBzeW5jIGJldHdlZW4gcmVwZWF0ZWQgZmllbGQgYW5kIG1hcCBpbiBjKysuCisgICAgbXNnLm1hcF9pbnQzMl9hbGxfdHlwZXNbM10ub3B0aW9uYWxfc3RyaW5nID0gJ2ZvbycKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ192YWx1ZS5vcHRpb25hbF9zdHJpbmcsICdiYXInKQorCisgIGRlZiB0ZXN0TWFwSXRlckludmFsaWRhdGVkQnlDbGVhckZpZWxkKHNlbGYpOgorICAgICMgTWFwIGl0ZXJhdG9yIGlzIGludmFsaWRhdGVkIHdoZW4gZmllbGQgaXMgY2xlYXJlZC4KKyAgICAjIEJ1dCB0aGlzIGNhc2UgZG9lcyBuZWVkIHRvIG5vdCBjcmFzaCB0aGUgaW50ZXJwcmV0ZXIuCisgICAgIyBGb3IgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiB0aGlzIHRlc3RzIHRoZSBjb3JyZWN0bmVzcyBvZgorICAgICMgU2NhbGFyTWFwQ29udGFpbmVyOjpSZWxlYXNlKCkKKyAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorCisgICAgaXQgPSBpdGVyKG1zZy5tYXBfaW50MzJfaW50MzIpCisKKyAgICBtc2cuQ2xlYXJGaWVsZCgnbWFwX2ludDMyX2ludDMyJykKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICBmb3IgXyBpbiBpdDoKKyAgICAgICAgcGFzcworCisgICAgaXQgPSBpdGVyKG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKQorICAgIG1zZy5DbGVhckZpZWxkKCdtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlJykKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICBmb3IgXyBpbiBpdDoKKyAgICAgICAgcGFzcworCisgIGRlZiB0ZXN0TWFwRGVsZXRlKHNlbGYpOgorICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihtc2cubWFwX2ludDMyX2ludDMyKSkKKworICAgIG1zZy5tYXBfaW50MzJfaW50MzJbNF0gPSA2CisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4obXNnLm1hcF9pbnQzMl9pbnQzMikpCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKKyAgICAgIGRlbCBtc2cubWFwX2ludDMyX2ludDMyWzg4XQorCisgICAgZGVsIG1zZy5tYXBfaW50MzJfaW50MzJbNF0KKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihtc2cubWFwX2ludDMyX2ludDMyKSkKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgZGVsIG1zZy5tYXBfaW50MzJfYWxsX3R5cGVzWzMyXQorCisgIGRlZiB0ZXN0TWFwc0FyZU1hcHBpbmcoc2VsZik6CisgICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnLm1hcF9pbnQzMl9pbnQzMiwgY29sbGVjdGlvbnMuYWJjLk1hcHBpbmcpCisgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZy5tYXBfaW50MzJfaW50MzIsIGNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlTWFwcGluZykKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25zLmFiYy5NYXBwaW5nKQorICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbnMuYWJjLk11dGFibGVNYXBwaW5nKQorCisgIGRlZiB0ZXN0TWFwc0NvbXBhcmUoc2VsZik6CisgICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKKyAgICBtc2cubWFwX2ludDMyX2ludDMyWy0xMjNdID0gLTQ1NgorICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLm1hcF9pbnQzMl9pbnQzMiwgbXNnLm1hcF9pbnQzMl9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChtc2cubWFwX2ludDMyX2ludDMyLCAwKQorCisgIGRlZiB0ZXN0TWFwRmluZEluaXRpYWxpemF0aW9uRXJyb3JzU21va2VUZXN0KHNlbGYpOgorICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgbXNnLm1hcF9zdHJpbmdfc3RyaW5nWydhYmMnXSA9ICcxMjMnCisgICAgbXNnLm1hcF9pbnQzMl9pbnQzMlszNV0gPSA2NAorICAgIG1zZy5tYXBfc3RyaW5nX2ZvcmVpZ25fbWVzc2FnZVsnZm9vJ10uYyA9IDUKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihtc2cuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkpKQorCisgIEB1bml0dGVzdC5za2lwSWYoc3lzLm1heHVuaWNvZGUgPT0gVUNTMl9NQVhVTklDT0RFLCAnU2tpcCBmb3IgdWNzMicpCisgIGRlZiB0ZXN0U3RyaWN0VXRmOENoZWNrKHNlbGYpOgorICAgICMgVGVzdCB1J1x1ZDgwMScgaXMgcmVqZWN0ZWQgYXQgcGFyc2VyIGluIGJvdGggcHl0aG9uMiBhbmQgcHl0aG9uMy4KKyAgICBzZXJpYWxpemVkID0gKGInclx4MDNceGVkXHhhMFx4ODEnKQorICAgIG1zZyA9IHVuaXR0ZXN0X3Byb3RvM19hcmVuYV9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbikgYXMgY29udGV4dDoKKyAgICAgIG1zZy5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdweXRob24nOgorICAgICAgc2VsZi5hc3NlcnRJbignb3B0aW9uYWxfc3RyaW5nJywgc3RyKGNvbnRleHQuZXhjZXB0aW9uKSkKKyAgICBlbHNlOgorICAgICAgc2VsZi5hc3NlcnRJbignRXJyb3IgcGFyc2luZyBtZXNzYWdlJywgc3RyKGNvbnRleHQuZXhjZXB0aW9uKSkKKworICAgICMgVGVzdCBvcHRpb25hbF9zdHJpbmc9dSfwn5iNJyBpcyBhY2NlcHRlZC4KKyAgICBzZXJpYWxpemVkID0gdW5pdHRlc3RfcHJvdG8zX2FyZW5hX3BiMi5UZXN0QWxsVHlwZXMoCisgICAgICAgIG9wdGlvbmFsX3N0cmluZz11J/CfmI0nKS5TZXJpYWxpemVUb1N0cmluZygpCisgICAgbXNnMiA9IHVuaXR0ZXN0X3Byb3RvM19hcmVuYV9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtc2cyLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnMi5vcHRpb25hbF9zdHJpbmcsIHUn8J+YjScpCisKKyAgICBtc2cgPSB1bml0dGVzdF9wcm90bzNfYXJlbmFfcGIyLlRlc3RBbGxUeXBlcyhvcHRpb25hbF9zdHJpbmc9dSdcdWQwMDEnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLm9wdGlvbmFsX3N0cmluZywgdSdcdWQwMDEnKQorCisgIGRlZiB0ZXN0U3Vycm9nYXRlc0luUHl0aG9uMyhzZWxmKToKKyAgICAjIFN1cnJvZ2F0ZXMgYXJlIHJlamVjdGVkIGF0IHNldHRlcnMgaW4gUHl0aG9uMy4KKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgdW5pdHRlc3RfcHJvdG8zX2FyZW5hX3BiMi5UZXN0QWxsVHlwZXMob3B0aW9uYWxfc3RyaW5nPXUnXHVkODAxXHVkYzAxJykKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgdW5pdHRlc3RfcHJvdG8zX2FyZW5hX3BiMi5UZXN0QWxsVHlwZXMob3B0aW9uYWxfc3RyaW5nPWInXHhlZFx4YTBceDgxJykKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgdW5pdHRlc3RfcHJvdG8zX2FyZW5hX3BiMi5UZXN0QWxsVHlwZXMob3B0aW9uYWxfc3RyaW5nPXUnXHVkODAxJykKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgdW5pdHRlc3RfcHJvdG8zX2FyZW5hX3BiMi5UZXN0QWxsVHlwZXMob3B0aW9uYWxfc3RyaW5nPXUnXHVkODAxXHVkODAxJykKKworCisKKworQHRlc3RpbmdfcmVmbGVha3MuVGVzdENhc2UKK2NsYXNzIFZhbGlkVHlwZU5hbWVzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIGFzc2VydEltcG9ydEZyb21OYW1lKHNlbGYsIG1zZywgYmFzZV9uYW1lKToKKyAgICAjIFBhcnNlIDx0eXBlICdtb2R1bGUuY2xhc3NfbmFtZSc+IHRvIGV4dHJhICdzb21lLm5hbWUnIGFzIGEgc3RyaW5nLgorICAgIHRwX25hbWUgPSBzdHIodHlwZShtc2cpKS5zcGxpdCgiJyIpWzFdCisgICAgdmFsaWRfbmFtZXMgPSAoJ1JlcGVhdGVkJXNDb250YWluZXInICUgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICdSZXBlYXRlZCVzRmllbGRDb250YWluZXInICUgYmFzZV9uYW1lKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgYW55KHRwX25hbWUuZW5kc3dpdGgodikgZm9yIHYgaW4gdmFsaWRfbmFtZXMpLAorICAgICAgICAnJXIgZG9lcyBlbmQgd2l0aCBhbnkgb2YgJXInICUgKHRwX25hbWUsIHZhbGlkX25hbWVzKSkKKworICAgIHBhcnRzID0gdHBfbmFtZS5zcGxpdCgnLicpCisgICAgY2xhc3NfbmFtZSA9IHBhcnRzWy0xXQorICAgIG1vZHVsZV9uYW1lID0gJy4nLmpvaW4ocGFydHNbOi0xXSkKKyAgICBfX2ltcG9ydF9fKG1vZHVsZV9uYW1lLCBmcm9tbGlzdD1bY2xhc3NfbmFtZV0pCisKKyAgZGVmIHRlc3RUeXBlTmFtZXNDYW5CZUltcG9ydGVkKHNlbGYpOgorICAgICMgSWYgaW1wb3J0IGRvZXNuJ3Qgd29yaywgcGlja2xpbmcgd29uJ3Qgd29yayBlaXRoZXIuCisgICAgcGIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydEltcG9ydEZyb21OYW1lKHBiLnJlcGVhdGVkX2ludDMyLCAnU2NhbGFyJykKKyAgICBzZWxmLmFzc2VydEltcG9ydEZyb21OYW1lKHBiLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLCAnQ29tcG9zaXRlJykKKworCitAdGVzdGluZ19yZWZsZWFrcy5UZXN0Q2FzZQorY2xhc3MgUGFja2VkRmllbGRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0TWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQuYXBwZW5kKDEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIuYXBwZW5kKDEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIuYXBwZW5kKDEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQuYXBwZW5kKDEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyLmFwcGVuZCgxKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NC5hcHBlbmQoMSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyLmFwcGVuZCgxKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQuYXBwZW5kKDEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMS4wKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjApCisgICAgbWVzc2FnZS5yZXBlYXRlZF9ib29sLmFwcGVuZChUcnVlKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0uYXBwZW5kKDEpCisKKyAgZGVmIHRlc3RQYWNrZWRGaWVsZHMoc2VsZik6CisgICAgbWVzc2FnZSA9IHBhY2tlZF9maWVsZF90ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQorICAgIHNlbGYuc2V0TWVzc2FnZShtZXNzYWdlKQorICAgIGdvbGRlbl9kYXRhID0gKGInXHgwQVx4MDFceDAxJworICAgICAgICAgICAgICAgICAgIGInXHgxMlx4MDFceDAxJworICAgICAgICAgICAgICAgICAgIGInXHgxQVx4MDFceDAxJworICAgICAgICAgICAgICAgICAgIGInXHgyMlx4MDFceDAxJworICAgICAgICAgICAgICAgICAgIGInXHgyQVx4MDFceDAyJworICAgICAgICAgICAgICAgICAgIGInXHgzMlx4MDFceDAyJworICAgICAgICAgICAgICAgICAgIGInXHgzQVx4MDRceDAxXHgwMFx4MDBceDAwJworICAgICAgICAgICAgICAgICAgIGInXHg0Mlx4MDhceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCcKKyAgICAgICAgICAgICAgICAgICBiJ1x4NEFceDA0XHgwMVx4MDBceDAwXHgwMCcKKyAgICAgICAgICAgICAgICAgICBiJ1x4NTJceDA4XHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnCisgICAgICAgICAgICAgICAgICAgYidceDVBXHgwNFx4MDBceDAwXHg4MFx4M2YnCisgICAgICAgICAgICAgICAgICAgYidceDYyXHgwOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ZjBceDNmJworICAgICAgICAgICAgICAgICAgIGInXHg2QVx4MDFceDAxJworICAgICAgICAgICAgICAgICAgIGInXHg3Mlx4MDFceDAxJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisKKyAgZGVmIHRlc3RVbnBhY2tlZEZpZWxkcyhzZWxmKToKKyAgICBtZXNzYWdlID0gcGFja2VkX2ZpZWxkX3Rlc3RfcGIyLlRlc3RVbnBhY2tlZFR5cGVzKCkKKyAgICBzZWxmLnNldE1lc3NhZ2UobWVzc2FnZSkKKyAgICBnb2xkZW5fZGF0YSA9IChiJ1x4MDhceDAxJworICAgICAgICAgICAgICAgICAgIGInXHgxMFx4MDEnCisgICAgICAgICAgICAgICAgICAgYidceDE4XHgwMScKKyAgICAgICAgICAgICAgICAgICBiJ1x4MjBceDAxJworICAgICAgICAgICAgICAgICAgIGInXHgyOFx4MDInCisgICAgICAgICAgICAgICAgICAgYidceDMwXHgwMicKKyAgICAgICAgICAgICAgICAgICBiJ1x4M0RceDAxXHgwMFx4MDBceDAwJworICAgICAgICAgICAgICAgICAgIGInXHg0MVx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJworICAgICAgICAgICAgICAgICAgIGInXHg0RFx4MDFceDAwXHgwMFx4MDAnCisgICAgICAgICAgICAgICAgICAgYidceDUxXHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnCisgICAgICAgICAgICAgICAgICAgYidceDVEXHgwMFx4MDBceDgwXHgzZicKKyAgICAgICAgICAgICAgICAgICBiJ1x4NjFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceGYwXHgzZicKKyAgICAgICAgICAgICAgICAgICBiJ1x4NjhceDAxJworICAgICAgICAgICAgICAgICAgIGInXHg3MFx4MDEnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKworCitAdW5pdHRlc3Quc2tpcElmKGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ3B5dGhvbicsCisgICAgICAgICAgICAgICAgICdleHBsaWNpdCB0ZXN0cyBvZiB0aGUgQysrIGltcGxlbWVudGF0aW9uJykKK0B0ZXN0aW5nX3JlZmxlYWtzLlRlc3RDYXNlCitjbGFzcyBPdmVyc2l6ZVByb3Rvc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiBHZW5lcmF0ZU5lc3RlZFByb3RvKHNlbGYsIG4pOgorICAgIG1zZyA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVjdXJzaXZlTWVzc2FnZSgpCisgICAgc3ViID0gbXNnCisgICAgZm9yIF8gaW4gcmFuZ2Uobik6CisgICAgICBzdWIgPSBzdWIuYQorICAgIHN1Yi5pID0gMAorICAgIHJldHVybiBtc2cuU2VyaWFsaXplVG9TdHJpbmcoKQorCisgIGRlZiB0ZXN0U3VjY2VlZE9rU2l6ZWRQcm90byhzZWxmKToKKyAgICBtc2cgPSB1bml0dGVzdF9wYjIuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UoKQorICAgIG1zZy5QYXJzZUZyb21TdHJpbmcoc2VsZi5HZW5lcmF0ZU5lc3RlZFByb3RvKDEwMCkpCisKKyAgZGVmIHRlc3RBc3NlcnRPdmVyc2l6ZVByb3RvKHNlbGYpOgorICAgIGFwaV9pbXBsZW1lbnRhdGlvbi5fY19tb2R1bGUuU2V0QWxsb3dPdmVyc2l6ZVByb3RvcyhGYWxzZSkKKyAgICBtc2cgPSB1bml0dGVzdF9wYjIuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UoKQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMobWVzc2FnZS5EZWNvZGVFcnJvcikgYXMgY29udGV4dDoKKyAgICAgIG1zZy5QYXJzZUZyb21TdHJpbmcoc2VsZi5HZW5lcmF0ZU5lc3RlZFByb3RvKDEwMSkpCisgICAgc2VsZi5hc3NlcnRJbignRXJyb3IgcGFyc2luZyBtZXNzYWdlJywgc3RyKGNvbnRleHQuZXhjZXB0aW9uKSkKKworICBkZWYgdGVzdFN1Y2NlZWRPdmVyc2l6ZVByb3RvKHNlbGYpOgorICAgIGFwaV9pbXBsZW1lbnRhdGlvbi5fY19tb2R1bGUuU2V0QWxsb3dPdmVyc2l6ZVByb3RvcyhUcnVlKQorICAgIG1zZyA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVjdXJzaXZlTWVzc2FnZSgpCisgICAgbXNnLlBhcnNlRnJvbVN0cmluZyhzZWxmLkdlbmVyYXRlTmVzdGVkUHJvdG8oMTAxKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWlzc2luZ19lbnVtX3ZhbHVlcy5wcm90byBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWlzc2luZ19lbnVtX3ZhbHVlcy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2JhY2E3Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9taXNzaW5nX2VudW1fdmFsdWVzLnByb3RvCkBAIC0wLDAgKzEsNTYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8yIjsKKworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWw7CisKK21lc3NhZ2UgVGVzdEVudW1WYWx1ZXMgeworICBlbnVtIE5lc3RlZEVudW0geworICAgIFpFUk8gPSAwOworICAgIE9ORSA9IDE7CisgIH0KKyAgb3B0aW9uYWwgTmVzdGVkRW51bSBvcHRpb25hbF9uZXN0ZWRfZW51bSA9IDE7CisgIHJlcGVhdGVkIE5lc3RlZEVudW0gcmVwZWF0ZWRfbmVzdGVkX2VudW0gPSAyOworICByZXBlYXRlZCBOZXN0ZWRFbnVtIHBhY2tlZF9uZXN0ZWRfZW51bSA9IDMgW3BhY2tlZCA9IHRydWVdOworfQorCittZXNzYWdlIFRlc3RNaXNzaW5nRW51bVZhbHVlcyB7CisgIGVudW0gTmVzdGVkRW51bSB7IFRXTyA9IDI7IH0KKyAgb3B0aW9uYWwgTmVzdGVkRW51bSBvcHRpb25hbF9uZXN0ZWRfZW51bSA9IDE7CisgIHJlcGVhdGVkIE5lc3RlZEVudW0gcmVwZWF0ZWRfbmVzdGVkX2VudW0gPSAyOworICByZXBlYXRlZCBOZXN0ZWRFbnVtIHBhY2tlZF9uZXN0ZWRfZW51bSA9IDMgW3BhY2tlZCA9IHRydWVdOworfQorCittZXNzYWdlIEp1c3RTdHJpbmcgeworICByZXF1aXJlZCBzdHJpbmcgZHVtbXkgPSAxOworfQorCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfZXh0ZW5zaW9ucy5wcm90byBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDBhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfZXh0ZW5zaW9ucy5wcm90bwpAQCAtMCwwICsxLDYyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiByb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKQorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWw7CisKK21lc3NhZ2UgVG9wTGV2ZWxNZXNzYWdlIHsKKyAgb3B0aW9uYWwgRXh0ZW5kZWRNZXNzYWdlIHN1Ym1lc3NhZ2UgPSAxIFtsYXp5ID0gdHJ1ZV07CisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2UgbmVzdGVkX21lc3NhZ2UgPSAyIFtsYXp5ID0gdHJ1ZV07Cit9CisKK21lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgIG9wdGlvbmFsIEV4dGVuZGVkTWVzc2FnZSBzdWJtZXNzYWdlID0gMSBbbGF6eSA9IHRydWVdOworfQorCittZXNzYWdlIEV4dGVuZGVkTWVzc2FnZSB7CisgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyID0gMTAwMTsKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZyA9IDEwMDI7CisgIGV4dGVuc2lvbnMgMSB0byA5OTk7Cit9CisKK21lc3NhZ2UgRm9yZWlnbk1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiBmb3JlaWduX21lc3NhZ2VfaW50ID0gMTsKK30KKworZXh0ZW5kIEV4dGVuZGVkTWVzc2FnZSB7CisgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludF9leHRlbnNpb24gPSAxOworICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSBvcHRpb25hbF9tZXNzYWdlX2V4dGVuc2lvbiA9IDI7CisKKyAgcmVwZWF0ZWQgaW50MzIgcmVwZWF0ZWRfaW50X2V4dGVuc2lvbiA9IDM7CisgIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlIHJlcGVhdGVkX21lc3NhZ2VfZXh0ZW5zaW9uID0gNDsKK30KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zX2R5bmFtaWMucHJvdG8gYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfZXh0ZW5zaW9uc19keW5hbWljLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZmNiY2IKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfZXh0ZW5zaW9uc19keW5hbWljLnByb3RvCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGphc29uaEBnb29nbGUuY29tIChKYXNvbiBIc3VlaCkKKy8vCisvLyBUaGlzIGZpbGUgaXMgdXNlZCB0byB0ZXN0IGEgY29ybmVyIGNhc2UgaW4gdGhlIENQUCBpbXBsZW1lbnRhdGlvbiB3aGVyZSB0aGUKKy8vIGdlbmVyYXRlZCBDKysgdHlwZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBleHRlbmRlZSwgYnV0IHRoZSBleHRlbnNpb24gaXMKKy8vIGRlZmluZWQgaW4gYSBmaWxlIHdob3NlIEMrKyB0eXBlIGlzIG5vdCBpbiB0aGUgYmluYXJ5LgorCitzeW50YXggPSAicHJvdG8yIjsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zLnByb3RvIjsKKworcGFja2FnZSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWw7CisKK21lc3NhZ2UgRHluYW1pY01lc3NhZ2VUeXBlIHsKKyAgb3B0aW9uYWwgaW50MzIgYSA9IDE7Cit9CisKK2V4dGVuZCBFeHRlbmRlZE1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiBkeW5hbWljX2ludDMyX2V4dGVuc2lvbiA9IDEwMDsKKyAgb3B0aW9uYWwgRHluYW1pY01lc3NhZ2VUeXBlIGR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24gPSAxMDE7CisgIHJlcGVhdGVkIER5bmFtaWNNZXNzYWdlVHlwZSByZXBlYXRlZF9keW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uID0gMTAyOworfQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX21lc3NhZ2VzLnByb3RvIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX21lc3NhZ2VzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNGRjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfbWVzc2FnZXMucHJvdG8KQEAgLTAsMCArMSwzNjAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHJvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pCisKKy8vIExJTlQ6IExFR0FDWV9OQU1FUworCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWw7CisKKy8vIEEgbWVzc2FnZSB3aGVyZSB0YWcgbnVtYmVycyBhcmUgbGlzdGVkIG91dCBvZiBvcmRlciwgdG8gYWxsb3cgdXMgdG8gdGVzdCBvdXIKKy8vIGNhbm9uaWNhbGl6YXRpb24gb2Ygc2VyaWFsaXplZCBvdXRwdXQsIHdoaWNoIHNob3VsZCBhbHdheXMgYmUgaW4gdGFnIG9yZGVyLgorLy8gV2UgYWxzbyBtaXggaW4gc29tZSBleHRlbnNpb25zIGZvciBleHRyYSBmdW4uCittZXNzYWdlIE91dE9mT3JkZXJGaWVsZHMgeworICBvcHRpb25hbCBzaW50MzIgb3B0aW9uYWxfc2ludDMyID0gNTsKKyAgZXh0ZW5zaW9ucyA0IHRvIDQ7CisgIG9wdGlvbmFsIHVpbnQzMiBvcHRpb25hbF91aW50MzIgPSAzOworICBleHRlbnNpb25zIDIgdG8gMjsKKyAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzIgPSAxOworfQorCitleHRlbmQgT3V0T2ZPcmRlckZpZWxkcyB7CisgIG9wdGlvbmFsIHVpbnQ2NCBvcHRpb25hbF91aW50NjQgPSA0OworICBvcHRpb25hbCBpbnQ2NCBvcHRpb25hbF9pbnQ2NCA9IDI7Cit9CisKK2VudW0gaXMgeyAgLy8gdG9wIGxldmVsIGVudW0ga2V5d29yZAorICBkZWZhdWx0ID0gMDsKKyAgZWxzZSA9IDE7ICAvLyB0b3AgbGV2ZWwgZW51bSB2YWx1ZSBrZXl3b3JkCit9CisKK21lc3NhZ2UgY2xhc3MgeyAgLy8gbWVzc2FnZSBrZXl3b3JkCisgIG9wdGlvbmFsIGludDMyIGludF9maWVsZCA9IDEgW2pzb25fbmFtZSA9ICJqc29uX2ludCJdOworICBvcHRpb25hbCBpbnQzMiBpZiA9IDI7ICAvLyBmaWVsZCBrZXl3b3JkCisgIG9wdGlvbmFsIGlzIGFzID0gMzsgICAgIC8vIGVudW0gZmllbGQga2V5d29yZAorICBvcHRpb25hbCBpcyBlbnVtX2ZpZWxkID0gNDsKKyAgZW51bSBmb3IgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXN0ZWQgZW51bSBrZXl3b3JkCisgICAgZGVmYXVsdCA9IDA7CisgICAgVHJ1ZSA9IDE7ICAvLyBuZXN0ZWQgZW51bSB2YWx1ZSBrZXl3b3JkCisgIH0KKyAgb3B0aW9uYWwgZm9yIG5lc3RlZF9lbnVtX2ZpZWxkID0gNTsKKyAgbWVzc2FnZSB0cnkgeworICAgIG9wdGlvbmFsIGludDMyIGZpZWxkID0gMTsKKyAgICBleHRlbnNpb25zIDk5OSB0byA5OTk5OworICB9CisgIG9wdGlvbmFsIHRyeQorICAgIG5lc3RlZF9tZXNzYWdlID0gNjsKKyAgZXh0ZW5zaW9ucyA5OTkgdG8gOTk5OTsKK30KKworZXh0ZW5kIGNsYXNzIHsKKyAgb3B0aW9uYWwgaW50MzIgY29udGludWUgPSAxMDAxOyAgLy8gdG9wIGxldmVsIGV4dGVuc2lvbiBrZXl3b3JkCit9CisKK2V4dGVuZCBjbGFzcy50cnkgeworICBvcHRpb25hbCBpbnQzMiB3aXRoID0gMTAwMTsKK30KKworbWVzc2FnZSBFeHRlbmRDbGFzcyB7CisgIGV4dGVuZCBjbGFzcyB7CisgICAgb3B0aW9uYWwgaW50MzIgcmV0dXJuID0gMTAwMjsgIC8vIG5lc3RlZCBleHRlbnNpb24ga2V5d29yZAorICB9Cit9CisKK21lc3NhZ2UgVGVzdEZ1bGxLZXl3b3JkIHsKKyAgb3B0aW9uYWwgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLk91dE9mT3JkZXJGaWVsZHMgZmllbGQxID0gMTsKKyAgb3B0aW9uYWwgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmNsYXNzIGZpZWxkMiA9IDI7Cit9CisKKy8vIFRPRE8oamllbHVvKTogQWRkIGtleXdvcmQgc3VwcG9ydCBmb3Igc2VydmljZS4KKy8vIHNlcnZpY2UgRmFsc2UgeworLy8gICBycGMgQmFyKGNsYXNzKSByZXR1cm5zIChjbGFzcyk7CisvLyB9CisKK21lc3NhZ2UgTG90c05lc3RlZE1lc3NhZ2UgeworICBtZXNzYWdlIEIwIHt9CisgIG1lc3NhZ2UgQjEge30KKyAgbWVzc2FnZSBCMiB7fQorICBtZXNzYWdlIEIzIHt9CisgIG1lc3NhZ2UgQjQge30KKyAgbWVzc2FnZSBCNSB7fQorICBtZXNzYWdlIEI2IHt9CisgIG1lc3NhZ2UgQjcge30KKyAgbWVzc2FnZSBCOCB7fQorICBtZXNzYWdlIEI5IHt9CisgIG1lc3NhZ2UgQjEwIHt9CisgIG1lc3NhZ2UgQjExIHt9CisgIG1lc3NhZ2UgQjEyIHt9CisgIG1lc3NhZ2UgQjEzIHt9CisgIG1lc3NhZ2UgQjE0IHt9CisgIG1lc3NhZ2UgQjE1IHt9CisgIG1lc3NhZ2UgQjE2IHt9CisgIG1lc3NhZ2UgQjE3IHt9CisgIG1lc3NhZ2UgQjE4IHt9CisgIG1lc3NhZ2UgQjE5IHt9CisgIG1lc3NhZ2UgQjIwIHt9CisgIG1lc3NhZ2UgQjIxIHt9CisgIG1lc3NhZ2UgQjIyIHt9CisgIG1lc3NhZ2UgQjIzIHt9CisgIG1lc3NhZ2UgQjI0IHt9CisgIG1lc3NhZ2UgQjI1IHt9CisgIG1lc3NhZ2UgQjI2IHt9CisgIG1lc3NhZ2UgQjI3IHt9CisgIG1lc3NhZ2UgQjI4IHt9CisgIG1lc3NhZ2UgQjI5IHt9CisgIG1lc3NhZ2UgQjMwIHt9CisgIG1lc3NhZ2UgQjMxIHt9CisgIG1lc3NhZ2UgQjMyIHt9CisgIG1lc3NhZ2UgQjMzIHt9CisgIG1lc3NhZ2UgQjM0IHt9CisgIG1lc3NhZ2UgQjM1IHt9CisgIG1lc3NhZ2UgQjM2IHt9CisgIG1lc3NhZ2UgQjM3IHt9CisgIG1lc3NhZ2UgQjM4IHt9CisgIG1lc3NhZ2UgQjM5IHt9CisgIG1lc3NhZ2UgQjQwIHt9CisgIG1lc3NhZ2UgQjQxIHt9CisgIG1lc3NhZ2UgQjQyIHt9CisgIG1lc3NhZ2UgQjQzIHt9CisgIG1lc3NhZ2UgQjQ0IHt9CisgIG1lc3NhZ2UgQjQ1IHt9CisgIG1lc3NhZ2UgQjQ2IHt9CisgIG1lc3NhZ2UgQjQ3IHt9CisgIG1lc3NhZ2UgQjQ4IHt9CisgIG1lc3NhZ2UgQjQ5IHt9CisgIG1lc3NhZ2UgQjUwIHt9CisgIG1lc3NhZ2UgQjUxIHt9CisgIG1lc3NhZ2UgQjUyIHt9CisgIG1lc3NhZ2UgQjUzIHt9CisgIG1lc3NhZ2UgQjU0IHt9CisgIG1lc3NhZ2UgQjU1IHt9CisgIG1lc3NhZ2UgQjU2IHt9CisgIG1lc3NhZ2UgQjU3IHt9CisgIG1lc3NhZ2UgQjU4IHt9CisgIG1lc3NhZ2UgQjU5IHt9CisgIG1lc3NhZ2UgQjYwIHt9CisgIG1lc3NhZ2UgQjYxIHt9CisgIG1lc3NhZ2UgQjYyIHt9CisgIG1lc3NhZ2UgQjYzIHt9CisgIG1lc3NhZ2UgQjY0IHt9CisgIG1lc3NhZ2UgQjY1IHt9CisgIG1lc3NhZ2UgQjY2IHt9CisgIG1lc3NhZ2UgQjY3IHt9CisgIG1lc3NhZ2UgQjY4IHt9CisgIG1lc3NhZ2UgQjY5IHt9CisgIG1lc3NhZ2UgQjcwIHt9CisgIG1lc3NhZ2UgQjcxIHt9CisgIG1lc3NhZ2UgQjcyIHt9CisgIG1lc3NhZ2UgQjczIHt9CisgIG1lc3NhZ2UgQjc0IHt9CisgIG1lc3NhZ2UgQjc1IHt9CisgIG1lc3NhZ2UgQjc2IHt9CisgIG1lc3NhZ2UgQjc3IHt9CisgIG1lc3NhZ2UgQjc4IHt9CisgIG1lc3NhZ2UgQjc5IHt9CisgIG1lc3NhZ2UgQjgwIHt9CisgIG1lc3NhZ2UgQjgxIHt9CisgIG1lc3NhZ2UgQjgyIHt9CisgIG1lc3NhZ2UgQjgzIHt9CisgIG1lc3NhZ2UgQjg0IHt9CisgIG1lc3NhZ2UgQjg1IHt9CisgIG1lc3NhZ2UgQjg2IHt9CisgIG1lc3NhZ2UgQjg3IHt9CisgIG1lc3NhZ2UgQjg4IHt9CisgIG1lc3NhZ2UgQjg5IHt9CisgIG1lc3NhZ2UgQjkwIHt9CisgIG1lc3NhZ2UgQjkxIHt9CisgIG1lc3NhZ2UgQjkyIHt9CisgIG1lc3NhZ2UgQjkzIHt9CisgIG1lc3NhZ2UgQjk0IHt9CisgIG1lc3NhZ2UgQjk1IHt9CisgIG1lc3NhZ2UgQjk2IHt9CisgIG1lc3NhZ2UgQjk3IHt9CisgIG1lc3NhZ2UgQjk4IHt9CisgIG1lc3NhZ2UgQjk5IHt9CisgIG1lc3NhZ2UgQjEwMCB7fQorICBtZXNzYWdlIEIxMDEge30KKyAgbWVzc2FnZSBCMTAyIHt9CisgIG1lc3NhZ2UgQjEwMyB7fQorICBtZXNzYWdlIEIxMDQge30KKyAgbWVzc2FnZSBCMTA1IHt9CisgIG1lc3NhZ2UgQjEwNiB7fQorICBtZXNzYWdlIEIxMDcge30KKyAgbWVzc2FnZSBCMTA4IHt9CisgIG1lc3NhZ2UgQjEwOSB7fQorICBtZXNzYWdlIEIxMTAge30KKyAgbWVzc2FnZSBCMTExIHt9CisgIG1lc3NhZ2UgQjExMiB7fQorICBtZXNzYWdlIEIxMTMge30KKyAgbWVzc2FnZSBCMTE0IHt9CisgIG1lc3NhZ2UgQjExNSB7fQorICBtZXNzYWdlIEIxMTYge30KKyAgbWVzc2FnZSBCMTE3IHt9CisgIG1lc3NhZ2UgQjExOCB7fQorICBtZXNzYWdlIEIxMTkge30KKyAgbWVzc2FnZSBCMTIwIHt9CisgIG1lc3NhZ2UgQjEyMSB7fQorICBtZXNzYWdlIEIxMjIge30KKyAgbWVzc2FnZSBCMTIzIHt9CisgIG1lc3NhZ2UgQjEyNCB7fQorICBtZXNzYWdlIEIxMjUge30KKyAgbWVzc2FnZSBCMTI2IHt9CisgIG1lc3NhZ2UgQjEyNyB7fQorICBtZXNzYWdlIEIxMjgge30KKyAgbWVzc2FnZSBCMTI5IHt9CisgIG1lc3NhZ2UgQjEzMCB7fQorICBtZXNzYWdlIEIxMzEge30KKyAgbWVzc2FnZSBCMTMyIHt9CisgIG1lc3NhZ2UgQjEzMyB7fQorICBtZXNzYWdlIEIxMzQge30KKyAgbWVzc2FnZSBCMTM1IHt9CisgIG1lc3NhZ2UgQjEzNiB7fQorICBtZXNzYWdlIEIxMzcge30KKyAgbWVzc2FnZSBCMTM4IHt9CisgIG1lc3NhZ2UgQjEzOSB7fQorICBtZXNzYWdlIEIxNDAge30KKyAgbWVzc2FnZSBCMTQxIHt9CisgIG1lc3NhZ2UgQjE0MiB7fQorICBtZXNzYWdlIEIxNDMge30KKyAgbWVzc2FnZSBCMTQ0IHt9CisgIG1lc3NhZ2UgQjE0NSB7fQorICBtZXNzYWdlIEIxNDYge30KKyAgbWVzc2FnZSBCMTQ3IHt9CisgIG1lc3NhZ2UgQjE0OCB7fQorICBtZXNzYWdlIEIxNDkge30KKyAgbWVzc2FnZSBCMTUwIHt9CisgIG1lc3NhZ2UgQjE1MSB7fQorICBtZXNzYWdlIEIxNTIge30KKyAgbWVzc2FnZSBCMTUzIHt9CisgIG1lc3NhZ2UgQjE1NCB7fQorICBtZXNzYWdlIEIxNTUge30KKyAgbWVzc2FnZSBCMTU2IHt9CisgIG1lc3NhZ2UgQjE1NyB7fQorICBtZXNzYWdlIEIxNTgge30KKyAgbWVzc2FnZSBCMTU5IHt9CisgIG1lc3NhZ2UgQjE2MCB7fQorICBtZXNzYWdlIEIxNjEge30KKyAgbWVzc2FnZSBCMTYyIHt9CisgIG1lc3NhZ2UgQjE2MyB7fQorICBtZXNzYWdlIEIxNjQge30KKyAgbWVzc2FnZSBCMTY1IHt9CisgIG1lc3NhZ2UgQjE2NiB7fQorICBtZXNzYWdlIEIxNjcge30KKyAgbWVzc2FnZSBCMTY4IHt9CisgIG1lc3NhZ2UgQjE2OSB7fQorICBtZXNzYWdlIEIxNzAge30KKyAgbWVzc2FnZSBCMTcxIHt9CisgIG1lc3NhZ2UgQjE3MiB7fQorICBtZXNzYWdlIEIxNzMge30KKyAgbWVzc2FnZSBCMTc0IHt9CisgIG1lc3NhZ2UgQjE3NSB7fQorICBtZXNzYWdlIEIxNzYge30KKyAgbWVzc2FnZSBCMTc3IHt9CisgIG1lc3NhZ2UgQjE3OCB7fQorICBtZXNzYWdlIEIxNzkge30KKyAgbWVzc2FnZSBCMTgwIHt9CisgIG1lc3NhZ2UgQjE4MSB7fQorICBtZXNzYWdlIEIxODIge30KKyAgbWVzc2FnZSBCMTgzIHt9CisgIG1lc3NhZ2UgQjE4NCB7fQorICBtZXNzYWdlIEIxODUge30KKyAgbWVzc2FnZSBCMTg2IHt9CisgIG1lc3NhZ2UgQjE4NyB7fQorICBtZXNzYWdlIEIxODgge30KKyAgbWVzc2FnZSBCMTg5IHt9CisgIG1lc3NhZ2UgQjE5MCB7fQorICBtZXNzYWdlIEIxOTEge30KKyAgbWVzc2FnZSBCMTkyIHt9CisgIG1lc3NhZ2UgQjE5MyB7fQorICBtZXNzYWdlIEIxOTQge30KKyAgbWVzc2FnZSBCMTk1IHt9CisgIG1lc3NhZ2UgQjE5NiB7fQorICBtZXNzYWdlIEIxOTcge30KKyAgbWVzc2FnZSBCMTk4IHt9CisgIG1lc3NhZ2UgQjE5OSB7fQorICBtZXNzYWdlIEIyMDAge30KKyAgbWVzc2FnZSBCMjAxIHt9CisgIG1lc3NhZ2UgQjIwMiB7fQorICBtZXNzYWdlIEIyMDMge30KKyAgbWVzc2FnZSBCMjA0IHt9CisgIG1lc3NhZ2UgQjIwNSB7fQorICBtZXNzYWdlIEIyMDYge30KKyAgbWVzc2FnZSBCMjA3IHt9CisgIG1lc3NhZ2UgQjIwOCB7fQorICBtZXNzYWdlIEIyMDkge30KKyAgbWVzc2FnZSBCMjEwIHt9CisgIG1lc3NhZ2UgQjIxMSB7fQorICBtZXNzYWdlIEIyMTIge30KKyAgbWVzc2FnZSBCMjEzIHt9CisgIG1lc3NhZ2UgQjIxNCB7fQorICBtZXNzYWdlIEIyMTUge30KKyAgbWVzc2FnZSBCMjE2IHt9CisgIG1lc3NhZ2UgQjIxNyB7fQorICBtZXNzYWdlIEIyMTgge30KKyAgbWVzc2FnZSBCMjE5IHt9CisgIG1lc3NhZ2UgQjIyMCB7fQorICBtZXNzYWdlIEIyMjEge30KKyAgbWVzc2FnZSBCMjIyIHt9CisgIG1lc3NhZ2UgQjIyMyB7fQorICBtZXNzYWdlIEIyMjQge30KKyAgbWVzc2FnZSBCMjI1IHt9CisgIG1lc3NhZ2UgQjIyNiB7fQorICBtZXNzYWdlIEIyMjcge30KKyAgbWVzc2FnZSBCMjI4IHt9CisgIG1lc3NhZ2UgQjIyOSB7fQorICBtZXNzYWdlIEIyMzAge30KKyAgbWVzc2FnZSBCMjMxIHt9CisgIG1lc3NhZ2UgQjIzMiB7fQorICBtZXNzYWdlIEIyMzMge30KKyAgbWVzc2FnZSBCMjM0IHt9CisgIG1lc3NhZ2UgQjIzNSB7fQorICBtZXNzYWdlIEIyMzYge30KKyAgbWVzc2FnZSBCMjM3IHt9CisgIG1lc3NhZ2UgQjIzOCB7fQorICBtZXNzYWdlIEIyMzkge30KKyAgbWVzc2FnZSBCMjQwIHt9CisgIG1lc3NhZ2UgQjI0MSB7fQorICBtZXNzYWdlIEIyNDIge30KKyAgbWVzc2FnZSBCMjQzIHt9CisgIG1lc3NhZ2UgQjI0NCB7fQorICBtZXNzYWdlIEIyNDUge30KKyAgbWVzc2FnZSBCMjQ2IHt9CisgIG1lc3NhZ2UgQjI0NyB7fQorICBtZXNzYWdlIEIyNDgge30KKyAgbWVzc2FnZSBCMjQ5IHt9CisgIG1lc3NhZ2UgQjI1MCB7fQorICBtZXNzYWdlIEIyNTEge30KKyAgbWVzc2FnZSBCMjUyIHt9CisgIG1lc3NhZ2UgQjI1MyB7fQorICBtZXNzYWdlIEIyNTQge30KKyAgbWVzc2FnZSBCMjU1IHt9Cit9CmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL25vX3BhY2thZ2UucHJvdG8gYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL25vX3BhY2thZ2UucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllZGE5NQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbm9fcGFja2FnZS5wcm90bwpAQCAtMCwwICsxLDQwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMiI7CisKK2VudW0gTm9QYWNrYWdlRW51bSB7CisgIE5PX1BBQ0tBR0VfVkFMVUVfMCA9IDA7CisgIE5PX1BBQ0tBR0VfVkFMVUVfMSA9IDE7Cit9CisKK21lc3NhZ2UgTm9QYWNrYWdlTWVzc2FnZSB7CisgIG9wdGlvbmFsIE5vUGFja2FnZUVudW0gbm9fcGFja2FnZV9lbnVtID0gMTsKK30KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcGFja2VkX2ZpZWxkX3Rlc3QucHJvdG8gYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3BhY2tlZF9maWVsZF90ZXN0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZmRjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3BhY2tlZF9maWVsZF90ZXN0LnByb3RvCkBAIC0wLDAgKzEsNzMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsOworCittZXNzYWdlIFRlc3RQYWNrZWRUeXBlcyB7CisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgRk9PID0gMDsKKyAgICBCQVIgPSAxOworICAgIEJBWiA9IDI7CisgIH0KKworICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMiAgICA9ICAxOworICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NCAgICA9ICAyOworICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzIgICA9ICAzOworICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgICA9ICA0OworICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzIgICA9ICA1OworICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgICA9ICA2OworICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyICA9ICA3OworICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ICA9ICA4OworICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9ICA5OworICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDEwOworICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdCAgICA9IDExOworICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgICA9IDEyOworICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sICAgICA9IDEzOworICByZXBlYXRlZCBOZXN0ZWRFbnVtIHJlcGVhdGVkX25lc3RlZF9lbnVtID0gMTQ7Cit9CisKK21lc3NhZ2UgVGVzdFVucGFja2VkVHlwZXMgeworICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMiAgICA9ICAxIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgIGludDY0IHJlcGVhdGVkX2ludDY0ICAgID0gIDIgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICB1aW50MzIgcmVwZWF0ZWRfdWludDMyICAgPSAgMyBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgICA9ICA0IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgc2ludDMyIHJlcGVhdGVkX3NpbnQzMiAgID0gIDUgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICBzaW50NjQgcmVwZWF0ZWRfc2ludDY0ICAgPSAgNiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyICA9ICA3IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICBmaXhlZDY0IHJlcGVhdGVkX2ZpeGVkNjQgID0gIDggW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcmVwZWF0ZWRfc2ZpeGVkMzIgPSAgOSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDEwIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgIGZsb2F0IHJlcGVhdGVkX2Zsb2F0ICAgID0gMTEgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICBkb3VibGUgcmVwZWF0ZWRfZG91YmxlICAgPSAxMiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sICAgICA9IDEzIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIFRlc3RQYWNrZWRUeXBlcy5OZXN0ZWRFbnVtIHJlcGVhdGVkX25lc3RlZF9lbnVtID0gMTQgW3BhY2tlZCA9IGZhbHNlXTsKK30KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcHJvdG9fYnVpbGRlcl90ZXN0LnB5IGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9wcm90b19idWlsZGVyX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwNzdiMAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcHJvdG9fYnVpbGRlcl90ZXN0LnB5CkBAIC0wLDAgKzEsMTA2IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIGZvciBnb29nbGUucHJvdG9idWYucHJvdG9fYnVpbGRlci4iIiIKKworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcGIyICAjIHB5bGludDogZGlzYWJsZT1nLWltcG9ydC1ub3QtYXQtdG9wCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHByb3RvX2J1aWxkZXIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0ZXh0X2Zvcm1hdAorCisKK2NsYXNzIFByb3RvQnVpbGRlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLm9yZGVyZWRfZmllbGRzID0gY29sbGVjdGlvbnMuT3JkZXJlZERpY3QoWworICAgICAgICAoJ2ZvbycsIGRlc2NyaXB0b3JfcGIyLkZpZWxkRGVzY3JpcHRvclByb3RvLlRZUEVfSU5UNjQpLAorICAgICAgICAoJ2JhcicsIGRlc2NyaXB0b3JfcGIyLkZpZWxkRGVzY3JpcHRvclByb3RvLlRZUEVfU1RSSU5HKSwKKyAgICAgICAgXSkKKyAgICBzZWxmLl9maWVsZHMgPSBkaWN0KHNlbGYub3JkZXJlZF9maWVsZHMpCisKKyAgZGVmIHRlc3RNYWtlU2ltcGxlUHJvdG9DbGFzcyhzZWxmKToKKyAgICAiIiJUZXN0IHRoYXQgd2UgY2FuIGNyZWF0ZSBhIHByb3RvIGNsYXNzLiIiIgorICAgIHByb3RvX2NscyA9IHByb3RvX2J1aWxkZXIuTWFrZVNpbXBsZVByb3RvQ2xhc3MoCisgICAgICAgIHNlbGYuX2ZpZWxkcywKKyAgICAgICAgZnVsbF9uYW1lPSduZXQucHJvdG8yLnB5dGhvbi5wdWJsaWMucHJvdG9fYnVpbGRlcl90ZXN0LlRlc3QnKQorICAgIHByb3RvID0gcHJvdG9fY2xzKCkKKyAgICBwcm90by5mb28gPSAxMjM0NQorICAgIHByb3RvLmJhciA9ICdhc2RmJworICAgIHNlbGYuYXNzZXJ0TXVsdGlMaW5lRXF1YWwoCisgICAgICAgICdiYXI6ICJhc2RmIlxuZm9vOiAxMjM0NVxuJywgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKHByb3RvKSkKKworICBkZWYgdGVzdE9yZGVyZWRGaWVsZHMoc2VsZik6CisgICAgIiIiVGVzdCB0aGF0IHRoZSBmaWVsZCBvcmRlciBpcyBtYWludGFpbmVkIHdoZW4gZ2l2ZW4gYW4gT3JkZXJlZERpY3QuIiIiCisgICAgcHJvdG9fY2xzID0gcHJvdG9fYnVpbGRlci5NYWtlU2ltcGxlUHJvdG9DbGFzcygKKyAgICAgICAgc2VsZi5vcmRlcmVkX2ZpZWxkcywKKyAgICAgICAgZnVsbF9uYW1lPSduZXQucHJvdG8yLnB5dGhvbi5wdWJsaWMucHJvdG9fYnVpbGRlcl90ZXN0Lk9yZGVyZWRUZXN0JykKKyAgICBwcm90byA9IHByb3RvX2NscygpCisgICAgcHJvdG8uZm9vID0gMTIzNDUKKyAgICBwcm90by5iYXIgPSAnYXNkZicKKyAgICBzZWxmLmFzc2VydE11bHRpTGluZUVxdWFsKAorICAgICAgICAnZm9vOiAxMjM0NVxuYmFyOiAiYXNkZiJcbicsIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhwcm90bykpCisKKyAgZGVmIHRlc3RNYWtlU2FtZVByb3RvQ2xhc3NUd2ljZShzZWxmKToKKyAgICAiIiJUZXN0IHRoYXQgdGhlIERlc2NyaXB0b3JQb29sIGlzIHVzZWQuIiIiCisgICAgcG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbCgpCisgICAgcHJvdG9fY2xzMSA9IHByb3RvX2J1aWxkZXIuTWFrZVNpbXBsZVByb3RvQ2xhc3MoCisgICAgICAgIHNlbGYuX2ZpZWxkcywKKyAgICAgICAgZnVsbF9uYW1lPSduZXQucHJvdG8yLnB5dGhvbi5wdWJsaWMucHJvdG9fYnVpbGRlcl90ZXN0LlRlc3QnLAorICAgICAgICBwb29sPXBvb2wpCisgICAgcHJvdG9fY2xzMiA9IHByb3RvX2J1aWxkZXIuTWFrZVNpbXBsZVByb3RvQ2xhc3MoCisgICAgICAgIHNlbGYuX2ZpZWxkcywKKyAgICAgICAgZnVsbF9uYW1lPSduZXQucHJvdG8yLnB5dGhvbi5wdWJsaWMucHJvdG9fYnVpbGRlcl90ZXN0LlRlc3QnLAorICAgICAgICBwb29sPXBvb2wpCisgICAgc2VsZi5hc3NlcnRJcyhwcm90b19jbHMxLkRFU0NSSVBUT1IsIHByb3RvX2NsczIuREVTQ1JJUFRPUikKKworICBkZWYgdGVzdE1ha2VMYXJnZVByb3RvQ2xhc3Moc2VsZik6CisgICAgIiIiVGVzdCB0aGF0IGxhcmdlIGNyZWF0ZWQgcHJvdG9zIGRvbid0IHVzZSByZXNlcnZlZCBmaWVsZCBudW1iZXJzLiIiIgorICAgIG51bV9maWVsZHMgPSAxMjM0NTYKKyAgICBmaWVsZHMgPSB7CisgICAgICAgICdmb28lZCcgJSBpOiBkZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90by5UWVBFX0lOVDY0CisgICAgICAgIGZvciBpIGluIHJhbmdlKG51bV9maWVsZHMpCisgICAgfQorICAgIHByb3RvX2NscyA9IHByb3RvX2J1aWxkZXIuTWFrZVNpbXBsZVByb3RvQ2xhc3MoCisgICAgICAgIGZpZWxkcywKKyAgICAgICAgZnVsbF9uYW1lPSduZXQucHJvdG8yLnB5dGhvbi5wdWJsaWMucHJvdG9fYnVpbGRlcl90ZXN0LkxhcmdlUHJvdG9UZXN0JykKKworICAgIHJlc2VydmVkX2ZpZWxkX251bWJlcnMgPSBzZXQoCisgICAgICAgIHJhbmdlKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkZJUlNUX1JFU0VSVkVEX0ZJRUxEX05VTUJFUiwKKyAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFTVF9SRVNFUlZFRF9GSUVMRF9OVU1CRVIgKyAxKSkKKyAgICBwcm90b19maWVsZF9udW1iZXJzID0gc2V0KHByb3RvX2Nscy5ERVNDUklQVE9SLmZpZWxkc19ieV9udW1iZXIpCisgICAgc2VsZi5hc3NlcnRGYWxzZShyZXNlcnZlZF9maWVsZF9udW1iZXJzLmludGVyc2VjdGlvbihwcm90b19maWVsZF9udW1iZXJzKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcHl0aG9uX21lc3NhZ2UucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3B5dGhvbl9tZXNzYWdlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NTBiNDIKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3B5dGhvbl9tZXNzYWdlLnB5CkBAIC0wLDAgKzEsMTUzOSBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjIFRoaXMgY29kZSBpcyBtZWFudCB0byB3b3JrIG9uIFB5dGhvbiAyLjQgYW5kIGFib3ZlIG9ubHkuCisjCisjIFRPRE8ocm9iaW5zb24pOiBIZWxwZXJzIGZvciB2ZXJib3NlLCBjb21tb24gY2hlY2tzIGxpa2Ugc2VlaW5nIGlmIGEKKyMgZGVzY3JpcHRvcidzIGNwcF90eXBlIGlzIENQUFRZUEVfTUVTU0FHRS4KKworIiIiQ29udGFpbnMgYSBtZXRhY2xhc3MgYW5kIGhlbHBlciBmdW5jdGlvbnMgdXNlZCB0byBjcmVhdGUKK3Byb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyBmcm9tIERlc2NyaXB0b3Igb2JqZWN0cyBhdCBydW50aW1lLgorCitSZWNhbGwgdGhhdCBhIG1ldGFjbGFzcyBpcyB0aGUgInR5cGUiIG9mIGEgY2xhc3MuCisoQSBjbGFzcyBpcyB0byBhIG1ldGFjbGFzcyB3aGF0IGFuIGluc3RhbmNlIGlzIHRvIGEgY2xhc3MuKQorCitJbiB0aGlzIGNhc2UsIHdlIHVzZSB0aGUgR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSBtZXRhY2xhc3MKK3RvIGluamVjdCBhbGwgdGhlIHVzZWZ1bCBmdW5jdGlvbmFsaXR5IGludG8gdGhlIGNsYXNzZXMKK291dHB1dCBieSB0aGUgcHJvdG9jb2wgY29tcGlsZXIgYXQgY29tcGlsZS10aW1lLgorCitUaGUgdXBzaG90IG9mIGFsbCB0aGlzIGlzIHRoYXQgdGhlIHJlYWwgaW1wbGVtZW50YXRpb24KK2RldGFpbHMgZm9yIEFMTCBwdXJlLVB5dGhvbiBwcm90b2NvbCBidWZmZXJzIGFyZSAqaGVyZSBpbgordGhpcyBmaWxlKi4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJworCitmcm9tIGlvIGltcG9ydCBCeXRlc0lPCitpbXBvcnQgc3RydWN0CitpbXBvcnQgc3lzCitpbXBvcnQgd2Vha3JlZgorCisjIFdlIHVzZSAiYXMiIHRvIGF2b2lkIG5hbWUgY29sbGlzaW9ucyB3aXRoIHZhcmlhYmxlcy4KK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBhcGlfaW1wbGVtZW50YXRpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBjb250YWluZXJzCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZGVjb2RlcgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGVuY29kZXIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbnVtX3R5cGVfd3JhcHBlcgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGV4dGVuc2lvbl9kaWN0Citmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgbWVzc2FnZV9saXN0ZW5lciBhcyBtZXNzYWdlX2xpc3RlbmVyX21vZAorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHR5cGVfY2hlY2tlcnMKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB3ZWxsX2tub3duX3R5cGVzCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yIGFzIGRlc2NyaXB0b3JfbW9kCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZSBhcyBtZXNzYWdlX21vZAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHRleHRfZm9ybWF0CisKK19GaWVsZERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yX21vZC5GaWVsZERlc2NyaXB0b3IKK19BbnlGdWxsVHlwZU5hbWUgPSAnZ29vZ2xlLnByb3RvYnVmLkFueScKK19FeHRlbnNpb25EaWN0ID0gZXh0ZW5zaW9uX2RpY3QuX0V4dGVuc2lvbkRpY3QKKworY2xhc3MgR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSh0eXBlKToKKworICAiIiJNZXRhY2xhc3MgZm9yIHByb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyBjcmVhdGVkIGF0IHJ1bnRpbWUgZnJvbSBEZXNjcmlwdG9ycy4KKworICBXZSBhZGQgaW1wbGVtZW50YXRpb25zIGZvciBhbGwgbWV0aG9kcyBkZXNjcmliZWQgaW4gdGhlIE1lc3NhZ2UgY2xhc3MuICBXZQorICBhbHNvIGNyZWF0ZSBwcm9wZXJ0aWVzIHRvIGFsbG93IGdldHRpbmcvc2V0dGluZyBhbGwgZmllbGRzIGluIHRoZSBwcm90b2NvbAorICBtZXNzYWdlLiAgRmluYWxseSwgd2UgY3JlYXRlIHNsb3RzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSBhY2NpZGVudGFsbHkKKyAgInNldHRpbmciIG5vbmV4aXN0ZW50IGZpZWxkcyBpbiB0aGUgcHJvdG9jb2wgbWVzc2FnZSwgd2hpY2ggdGhlbiB3b3VsZG4ndCBnZXQKKyAgc2VyaWFsaXplZCAvIGRlc2VyaWFsaXplZCBwcm9wZXJseS4KKworICBUaGUgcHJvdG9jb2wgY29tcGlsZXIgY3VycmVudGx5IHVzZXMgdGhpcyBtZXRhY2xhc3MgdG8gY3JlYXRlIHByb3RvY29sCisgIG1lc3NhZ2UgY2xhc3NlcyBhdCBydW50aW1lLiAgQ2xpZW50cyBjYW4gYWxzbyBtYW51YWxseSBjcmVhdGUgdGhlaXIgb3duCisgIGNsYXNzZXMgYXQgcnVudGltZSwgYXMgaW4gdGhpcyBleGFtcGxlOgorCisgIG15ZGVzY3JpcHRvciA9IERlc2NyaXB0b3IoLi4uLi4pCisgIGZhY3RvcnkgPSBzeW1ib2xfZGF0YWJhc2UuRGVmYXVsdCgpCisgIGZhY3RvcnkucG9vbC5BZGREZXNjcmlwdG9yKG15ZGVzY3JpcHRvcikKKyAgTXlQcm90b0NsYXNzID0gZmFjdG9yeS5HZXRQcm90b3R5cGUobXlkZXNjcmlwdG9yKQorICBteXByb3RvX2luc3RhbmNlID0gTXlQcm90b0NsYXNzKCkKKyAgbXlwcm90by5mb29fZmllbGQgPSAyMworICAuLi4KKyAgIiIiCisKKyAgIyBNdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcHJvdG9jb2wtY29tcGlsZXIgY29kZSBpbgorICAjIHByb3RvMi9jb21waWxlci9pbnRlcm5hbC9nZW5lcmF0b3IuKi4KKyAgX0RFU0NSSVBUT1JfS0VZID0gJ0RFU0NSSVBUT1InCisKKyAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdGlvbmFyeSk6CisgICAgIiIiQ3VzdG9tIGFsbG9jYXRpb24gZm9yIHJ1bnRpbWUtZ2VuZXJhdGVkIGNsYXNzIHR5cGVzLgorCisgICAgV2Ugb3ZlcnJpZGUgX19uZXdfXyBiZWNhdXNlIHRoaXMgaXMgYXBwYXJlbnRseSB0aGUgb25seSBwbGFjZQorICAgIHdoZXJlIHdlIGNhbiBtZWFuaW5nZnVsbHkgc2V0IF9fc2xvdHNfXyBvbiB0aGUgY2xhc3Mgd2UncmUgY3JlYXRpbmcoPykuCisgICAgKFRoZSBpbnRlcnBsYXkgYmV0d2VlbiBtZXRhY2xhc3NlcyBhbmQgc2xvdHMgaXMgbm90IHZlcnkgd2VsbC1kb2N1bWVudGVkKS4KKworICAgIEFyZ3M6CisgICAgICBuYW1lOiBOYW1lIG9mIHRoZSBjbGFzcyAoaWdub3JlZCwgYnV0IHJlcXVpcmVkIGJ5IHRoZQorICAgICAgICBtZXRhY2xhc3MgcHJvdG9jb2wpLgorICAgICAgYmFzZXM6IEJhc2UgY2xhc3NlcyBvZiB0aGUgY2xhc3Mgd2UncmUgY29uc3RydWN0aW5nLgorICAgICAgICAoU2hvdWxkIGJlIG1lc3NhZ2UuTWVzc2FnZSkuICBXZSBpZ25vcmUgdGhpcyBmaWVsZCwgYnV0CisgICAgICAgIGl0J3MgcmVxdWlyZWQgYnkgdGhlIG1ldGFjbGFzcyBwcm90b2NvbAorICAgICAgZGljdGlvbmFyeTogVGhlIGNsYXNzIGRpY3Rpb25hcnkgb2YgdGhlIGNsYXNzIHdlJ3JlCisgICAgICAgIGNvbnN0cnVjdGluZy4gIGRpY3Rpb25hcnlbX0RFU0NSSVBUT1JfS0VZXSBtdXN0IGNvbnRhaW4KKyAgICAgICAgYSBEZXNjcmlwdG9yIG9iamVjdCBkZXNjcmliaW5nIHRoaXMgcHJvdG9jb2wgbWVzc2FnZQorICAgICAgICB0eXBlLgorCisgICAgUmV0dXJuczoKKyAgICAgIE5ld2x5LWFsbG9jYXRlZCBjbGFzcy4KKworICAgIFJhaXNlczoKKyAgICAgIFJ1bnRpbWVFcnJvcjogR2VuZXJhdGVkIGNvZGUgb25seSB3b3JrIHdpdGggcHl0aG9uIGNwcCBleHRlbnNpb24uCisgICAgIiIiCisgICAgZGVzY3JpcHRvciA9IGRpY3Rpb25hcnlbR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZS5fREVTQ1JJUFRPUl9LRVldCisKKyAgICBpZiBpc2luc3RhbmNlKGRlc2NyaXB0b3IsIHN0cik6CisgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ1RoZSBnZW5lcmF0ZWQgY29kZSBvbmx5IHdvcmsgd2l0aCBweXRob24gY3BwICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZXh0ZW5zaW9uLCBidXQgaXQgaXMgdXNpbmcgcHVyZSBweXRob24gcnVudGltZS4nKQorCisgICAgIyBJZiBhIGNvbmNyZXRlIGNsYXNzIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIGRlc2NyaXB0b3IsIGRvbid0IHRyeSB0bworICAgICMgY3JlYXRlIGFub3RoZXIuICBEb2luZyBzbyB3aWxsIGJyZWFrIGFueSBtZXNzYWdlcyB0aGF0IGFscmVhZHkgZXhpc3Qgd2l0aAorICAgICMgdGhlIGV4aXN0aW5nIGNsYXNzLgorICAgICMKKyAgICAjIFRoZSBDKysgaW1wbGVtZW50YXRpb24gYXBwZWFycyB0byBoYXZlIGl0cyBvd24gaW50ZXJuYWwgYFB5TWVzc2FnZUZhY3RvcnlgCisgICAgIyB0byBhY2hpZXZlIHNpbWlsYXIgcmVzdWx0cy4KKyAgICAjCisgICAgIyBUaGlzIG1vc3QgY29tbW9ubHkgaGFwcGVucyBpbiBgdGV4dF9mb3JtYXQucHlgIHdoZW4gdXNpbmcgZGVzY3JpcHRvcnMgZnJvbQorICAgICMgYSBjdXN0b20gcG9vbDsgaXQgY2FsbHMgc3ltYm9sX2RhdGFiYXNlLkdsb2JhbCgpLmdldFByb3RvdHlwZSgpIG9uIGEKKyAgICAjIGRlc2NyaXB0b3Igd2hpY2ggYWxyZWFkeSBoYXMgYW4gZXhpc3RpbmcgY29uY3JldGUgY2xhc3MuCisgICAgbmV3X2NsYXNzID0gZ2V0YXR0cihkZXNjcmlwdG9yLCAnX2NvbmNyZXRlX2NsYXNzJywgTm9uZSkKKyAgICBpZiBuZXdfY2xhc3M6CisgICAgICByZXR1cm4gbmV3X2NsYXNzCisKKyAgICBpZiBkZXNjcmlwdG9yLmZ1bGxfbmFtZSBpbiB3ZWxsX2tub3duX3R5cGVzLldLVEJBU0VTOgorICAgICAgYmFzZXMgKz0gKHdlbGxfa25vd25fdHlwZXMuV0tUQkFTRVNbZGVzY3JpcHRvci5mdWxsX25hbWVdLCkKKyAgICBfQWRkQ2xhc3NBdHRyaWJ1dGVzRm9yTmVzdGVkRXh0ZW5zaW9ucyhkZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KQorICAgIF9BZGRTbG90cyhkZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KQorCisgICAgc3VwZXJjbGFzcyA9IHN1cGVyKEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUsIGNscykKKyAgICBuZXdfY2xhc3MgPSBzdXBlcmNsYXNzLl9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdGlvbmFyeSkKKyAgICByZXR1cm4gbmV3X2NsYXNzCisKKyAgZGVmIF9faW5pdF9fKGNscywgbmFtZSwgYmFzZXMsIGRpY3Rpb25hcnkpOgorICAgICIiIkhlcmUgd2UgcGVyZm9ybSB0aGUgbWFqb3JpdHkgb2Ygb3VyIHdvcmsgb24gdGhlIGNsYXNzLgorICAgIFdlIGFkZCBlbnVtIGdldHRlcnMsIGFuIF9faW5pdF9fIG1ldGhvZCwgaW1wbGVtZW50YXRpb25zCisgICAgb2YgYWxsIE1lc3NhZ2UgbWV0aG9kcywgYW5kIHByb3BlcnRpZXMgZm9yIGFsbCBmaWVsZHMKKyAgICBpbiB0aGUgcHJvdG9jb2wgdHlwZS4KKworICAgIEFyZ3M6CisgICAgICBuYW1lOiBOYW1lIG9mIHRoZSBjbGFzcyAoaWdub3JlZCwgYnV0IHJlcXVpcmVkIGJ5IHRoZQorICAgICAgICBtZXRhY2xhc3MgcHJvdG9jb2wpLgorICAgICAgYmFzZXM6IEJhc2UgY2xhc3NlcyBvZiB0aGUgY2xhc3Mgd2UncmUgY29uc3RydWN0aW5nLgorICAgICAgICAoU2hvdWxkIGJlIG1lc3NhZ2UuTWVzc2FnZSkuICBXZSBpZ25vcmUgdGhpcyBmaWVsZCwgYnV0CisgICAgICAgIGl0J3MgcmVxdWlyZWQgYnkgdGhlIG1ldGFjbGFzcyBwcm90b2NvbAorICAgICAgZGljdGlvbmFyeTogVGhlIGNsYXNzIGRpY3Rpb25hcnkgb2YgdGhlIGNsYXNzIHdlJ3JlCisgICAgICAgIGNvbnN0cnVjdGluZy4gIGRpY3Rpb25hcnlbX0RFU0NSSVBUT1JfS0VZXSBtdXN0IGNvbnRhaW4KKyAgICAgICAgYSBEZXNjcmlwdG9yIG9iamVjdCBkZXNjcmliaW5nIHRoaXMgcHJvdG9jb2wgbWVzc2FnZQorICAgICAgICB0eXBlLgorICAgICIiIgorICAgIGRlc2NyaXB0b3IgPSBkaWN0aW9uYXJ5W0dlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUuX0RFU0NSSVBUT1JfS0VZXQorCisgICAgIyBJZiB0aGlzIGlzIGFuIF9leGlzdGluZ18gY2xhc3MgbG9va2VkIHVwIHZpYSBgX2NvbmNyZXRlX2NsYXNzYCBpbiB0aGUKKyAgICAjIF9fbmV3X18gbWV0aG9kIGFib3ZlLCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gcmUtaW5pdGlhbGl6ZSBhbnl0aGluZy4KKyAgICBleGlzdGluZ19jbGFzcyA9IGdldGF0dHIoZGVzY3JpcHRvciwgJ19jb25jcmV0ZV9jbGFzcycsIE5vbmUpCisgICAgaWYgZXhpc3RpbmdfY2xhc3M6CisgICAgICBhc3NlcnQgZXhpc3RpbmdfY2xhc3MgaXMgY2xzLCAoCisgICAgICAgICAgJ0R1cGxpY2F0ZSBgR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZWAgY3JlYXRlZCBmb3IgZGVzY3JpcHRvciAlcicKKyAgICAgICAgICAlIChkZXNjcmlwdG9yLmZ1bGxfbmFtZSkpCisgICAgICByZXR1cm4KKworICAgIGNscy5fZGVjb2RlcnNfYnlfdGFnID0ge30KKyAgICBpZiAoZGVzY3JpcHRvci5oYXNfb3B0aW9ucyBhbmQKKyAgICAgICAgZGVzY3JpcHRvci5HZXRPcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQpOgorICAgICAgY2xzLl9kZWNvZGVyc19ieV90YWdbZGVjb2Rlci5NRVNTQUdFX1NFVF9JVEVNX1RBR10gPSAoCisgICAgICAgICAgZGVjb2Rlci5NZXNzYWdlU2V0SXRlbURlY29kZXIoZGVzY3JpcHRvciksIE5vbmUpCisKKyAgICAjIEF0dGFjaCBzdHVmZiB0byBlYWNoIEZpZWxkRGVzY3JpcHRvciBmb3IgcXVpY2sgbG9va3VwIGxhdGVyIG9uLgorICAgIGZvciBmaWVsZCBpbiBkZXNjcmlwdG9yLmZpZWxkczoKKyAgICAgIF9BdHRhY2hGaWVsZEhlbHBlcnMoY2xzLCBmaWVsZCkKKworICAgIGRlc2NyaXB0b3IuX2NvbmNyZXRlX2NsYXNzID0gY2xzICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgX0FkZEVudW1WYWx1ZXMoZGVzY3JpcHRvciwgY2xzKQorICAgIF9BZGRJbml0TWV0aG9kKGRlc2NyaXB0b3IsIGNscykKKyAgICBfQWRkUHJvcGVydGllc0ZvckZpZWxkcyhkZXNjcmlwdG9yLCBjbHMpCisgICAgX0FkZFByb3BlcnRpZXNGb3JFeHRlbnNpb25zKGRlc2NyaXB0b3IsIGNscykKKyAgICBfQWRkU3RhdGljTWV0aG9kcyhjbHMpCisgICAgX0FkZE1lc3NhZ2VNZXRob2RzKGRlc2NyaXB0b3IsIGNscykKKyAgICBfQWRkUHJpdmF0ZUhlbHBlck1ldGhvZHMoZGVzY3JpcHRvciwgY2xzKQorCisgICAgc3VwZXJjbGFzcyA9IHN1cGVyKEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUsIGNscykKKyAgICBzdXBlcmNsYXNzLl9faW5pdF9fKG5hbWUsIGJhc2VzLCBkaWN0aW9uYXJ5KQorCisKKyMgU3RhdGVsZXNzIGhlbHBlcnMgZm9yIEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUgYmVsb3cuCisjIE91dHNpZGUgY2xpZW50cyBzaG91bGQgbm90IGFjY2VzcyB0aGVzZSBkaXJlY3RseS4KKyMKKyMgSSBvcHRlZCBub3QgdG8gbWFrZSBhbnkgb2YgdGhlc2UgbWV0aG9kcyBvbiB0aGUgbWV0YWNsYXNzLCB0byBtYWtlIGl0IG1vcmUKKyMgY2xlYXIgdGhhdCBJJ20gbm90IHJlYWxseSB1c2luZyBhbnkgc3RhdGUgdGhlcmUgYW5kIHRvIGtlZXAgY2xpZW50cyBmcm9tCisjIHRoaW5raW5nIHRoYXQgdGhleSBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlc2UgY29uc3RydWN0aW9uIGhlbHBlcnMuCisKKworZGVmIF9Qcm9wZXJ0eU5hbWUocHJvdG9fZmllbGRfbmFtZSk6CisgICIiIlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHB1YmxpYyBwcm9wZXJ0eSBhdHRyaWJ1dGUgd2hpY2gKKyAgY2xpZW50cyBjYW4gdXNlIHRvIGdldCBhbmQgKGluIHNvbWUgY2FzZXMpIHNldCB0aGUgdmFsdWUKKyAgb2YgYSBwcm90b2NvbCBtZXNzYWdlIGZpZWxkLgorCisgIEFyZ3M6CisgICAgcHJvdG9fZmllbGRfbmFtZTogVGhlIHByb3RvY29sIG1lc3NhZ2UgZmllbGQgbmFtZSwgZXhhY3RseQorICAgICAgYXMgaXQgYXBwZWFycyAob3Igd291bGQgYXBwZWFyKSBpbiBhIC5wcm90byBmaWxlLgorICAiIiIKKyAgIyBUT0RPKHJvYmluc29uKTogRXNjYXBlIFB5dGhvbiBrZXl3b3JkcyAoZS5nLiwgeWllbGQpLCBhbmQgdGVzdCB0aGlzIHN1cHBvcnQuCisgICMgbm5vcndpdHogbWFrZXMgbXkgZGF5IGJ5IHdyaXRpbmc6CisgICMgIiIiCisgICMgRllJLiAgU2VlIHRoZSBrZXl3b3JkIG1vZHVsZSBpbiB0aGUgc3RkbGliLiBUaGlzIGNvdWxkIGJlIGFzIHNpbXBsZSBhczoKKyAgIworICAjIGlmIGtleXdvcmQuaXNrZXl3b3JkKHByb3RvX2ZpZWxkX25hbWUpOgorICAjICAgcmV0dXJuIHByb3RvX2ZpZWxkX25hbWUgKyAiXyIKKyAgIyByZXR1cm4gcHJvdG9fZmllbGRfbmFtZQorICAjICIiIgorICAjIEtlbnRvbiBzYXlzOiAgVGhlIGFib3ZlIGlzIGEgQkFEIElERUEuICBQZW9wbGUgcmVseSBvbiBiZWluZyBhYmxlIHRvIHVzZQorICAjICAgZ2V0YXR0cigpIGFuZCBzZXRhdHRyKCkgdG8gcmVmbGVjdGl2ZWx5IG1hbmlwdWxhdGUgZmllbGQgdmFsdWVzLiAgSWYgd2UKKyAgIyAgIHJlbmFtZSB0aGUgcHJvcGVydGllcywgdGhlbiBldmVyeSBzdWNoIHVzZXIgaGFzIHRvIGFsc28gbWFrZSBzdXJlIHRvIGFwcGx5CisgICMgICB0aGUgc2FtZSB0cmFuc2Zvcm1hdGlvbi4gIE5vdGUgdGhhdCBjdXJyZW50bHkgaWYgeW91IG5hbWUgYSBmaWVsZCAieWllbGQiLAorICAjICAgeW91IGNhbiBzdGlsbCBhY2Nlc3MgaXQganVzdCBmaW5lIHVzaW5nIGdldGF0dHIvc2V0YXR0ciAtLSBpdCdzIG5vdCBldmVuCisgICMgICB0aGF0IGN1bWJlcnNvbWUgdG8gZG8gc28uCisgICMgVE9ETyhrZW50b24pOiAgUmVtb3ZlIHRoaXMgbWV0aG9kIGVudGlyZWx5IGlmL3doZW4gZXZlcnlvbmUgYWdyZWVzIHdpdGggbXkKKyAgIyAgIHBvc2l0aW9uLgorICByZXR1cm4gcHJvdG9fZmllbGRfbmFtZQorCisKK2RlZiBfQWRkU2xvdHMobWVzc2FnZV9kZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KToKKyAgIiIiQWRkcyBhIF9fc2xvdHNfXyBlbnRyeSB0byBkaWN0aW9uYXJ5LCBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBhbGwgdmFsaWQKKyAgYXR0cmlidXRlcyBmb3IgdGhpcyBtZXNzYWdlIHR5cGUuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlX2Rlc2NyaXB0b3I6IEEgRGVzY3JpcHRvciBpbnN0YW5jZSBkZXNjcmliaW5nIHRoaXMgbWVzc2FnZSB0eXBlLgorICAgIGRpY3Rpb25hcnk6IENsYXNzIGRpY3Rpb25hcnkgdG8gd2hpY2ggd2UnbGwgYWRkIGEgJ19fc2xvdHNfXycgZW50cnkuCisgICIiIgorICBkaWN0aW9uYXJ5WydfX3Nsb3RzX18nXSA9IFsnX2NhY2hlZF9ieXRlX3NpemUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX2NhY2hlZF9ieXRlX3NpemVfZGlydHknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX2ZpZWxkcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfdW5rbm93bl9maWVsZHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX3Vua25vd25fZmllbGRfc2V0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19pc19wcmVzZW50X2luX3BhcmVudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfbGlzdGVuZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfX3dlYWtyZWZfXycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfb25lb2ZzJ10KKworCitkZWYgX0lzTWVzc2FnZVNldEV4dGVuc2lvbihmaWVsZCk6CisgIHJldHVybiAoZmllbGQuaXNfZXh0ZW5zaW9uIGFuZAorICAgICAgICAgIGZpZWxkLmNvbnRhaW5pbmdfdHlwZS5oYXNfb3B0aW9ucyBhbmQKKyAgICAgICAgICBmaWVsZC5jb250YWluaW5nX3R5cGUuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IGFuZAorICAgICAgICAgIGZpZWxkLnR5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0UgYW5kCisgICAgICAgICAgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9PUFRJT05BTCkKKworCitkZWYgX0lzTWFwRmllbGQoZmllbGQpOgorICByZXR1cm4gKGZpZWxkLnR5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0UgYW5kCisgICAgICAgICAgZmllbGQubWVzc2FnZV90eXBlLmhhc19vcHRpb25zIGFuZAorICAgICAgICAgIGZpZWxkLm1lc3NhZ2VfdHlwZS5HZXRPcHRpb25zKCkubWFwX2VudHJ5KQorCisKK2RlZiBfSXNNZXNzYWdlTWFwRmllbGQoZmllbGQpOgorICB2YWx1ZV90eXBlID0gZmllbGQubWVzc2FnZV90eXBlLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddCisgIHJldHVybiB2YWx1ZV90eXBlLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFCisKKworZGVmIF9BdHRhY2hGaWVsZEhlbHBlcnMoY2xzLCBmaWVsZF9kZXNjcmlwdG9yKToKKyAgaXNfcmVwZWF0ZWQgPSAoZmllbGRfZGVzY3JpcHRvci5sYWJlbCA9PSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEKQorICBpc19wYWNrYWJsZSA9IChpc19yZXBlYXRlZCBhbmQKKyAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuSXNUeXBlUGFja2FibGUoZmllbGRfZGVzY3JpcHRvci50eXBlKSkKKyAgaXNfcHJvdG8zID0gZmllbGRfZGVzY3JpcHRvci5jb250YWluaW5nX3R5cGUuc3ludGF4ID09ICdwcm90bzMnCisgIGlmIG5vdCBpc19wYWNrYWJsZToKKyAgICBpc19wYWNrZWQgPSBGYWxzZQorICBlbGlmIGZpZWxkX2Rlc2NyaXB0b3IuY29udGFpbmluZ190eXBlLnN5bnRheCA9PSAncHJvdG8yJzoKKyAgICBpc19wYWNrZWQgPSAoZmllbGRfZGVzY3JpcHRvci5oYXNfb3B0aW9ucyBhbmQKKyAgICAgICAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5wYWNrZWQpCisgIGVsc2U6CisgICAgaGFzX3BhY2tlZF9mYWxzZSA9IChmaWVsZF9kZXNjcmlwdG9yLmhhc19vcHRpb25zIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkuSGFzRmllbGQoJ3BhY2tlZCcpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkucGFja2VkID09IEZhbHNlKQorICAgIGlzX3BhY2tlZCA9IG5vdCBoYXNfcGFja2VkX2ZhbHNlCisgIGlzX21hcF9lbnRyeSA9IF9Jc01hcEZpZWxkKGZpZWxkX2Rlc2NyaXB0b3IpCisKKyAgaWYgaXNfbWFwX2VudHJ5OgorICAgIGZpZWxkX2VuY29kZXIgPSBlbmNvZGVyLk1hcEVuY29kZXIoZmllbGRfZGVzY3JpcHRvcikKKyAgICBzaXplciA9IGVuY29kZXIuTWFwU2l6ZXIoZmllbGRfZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lzTWVzc2FnZU1hcEZpZWxkKGZpZWxkX2Rlc2NyaXB0b3IpKQorICBlbGlmIF9Jc01lc3NhZ2VTZXRFeHRlbnNpb24oZmllbGRfZGVzY3JpcHRvcik6CisgICAgZmllbGRfZW5jb2RlciA9IGVuY29kZXIuTWVzc2FnZVNldEl0ZW1FbmNvZGVyKGZpZWxkX2Rlc2NyaXB0b3IubnVtYmVyKQorICAgIHNpemVyID0gZW5jb2Rlci5NZXNzYWdlU2V0SXRlbVNpemVyKGZpZWxkX2Rlc2NyaXB0b3IubnVtYmVyKQorICBlbHNlOgorICAgIGZpZWxkX2VuY29kZXIgPSB0eXBlX2NoZWNrZXJzLlRZUEVfVE9fRU5DT0RFUltmaWVsZF9kZXNjcmlwdG9yLnR5cGVdKAorICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLm51bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCkKKyAgICBzaXplciA9IHR5cGVfY2hlY2tlcnMuVFlQRV9UT19TSVpFUltmaWVsZF9kZXNjcmlwdG9yLnR5cGVdKAorICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLm51bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCkKKworICBmaWVsZF9kZXNjcmlwdG9yLl9lbmNvZGVyID0gZmllbGRfZW5jb2RlcgorICBmaWVsZF9kZXNjcmlwdG9yLl9zaXplciA9IHNpemVyCisgIGZpZWxkX2Rlc2NyaXB0b3IuX2RlZmF1bHRfY29uc3RydWN0b3IgPSBfRGVmYXVsdFZhbHVlQ29uc3RydWN0b3JGb3JGaWVsZCgKKyAgICAgIGZpZWxkX2Rlc2NyaXB0b3IpCisKKyAgZGVmIEFkZERlY29kZXIod2lyZXR5cGUsIGlzX3BhY2tlZCk6CisgICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9kZXNjcmlwdG9yLm51bWJlciwgd2lyZXR5cGUpCisgICAgZGVjb2RlX3R5cGUgPSBmaWVsZF9kZXNjcmlwdG9yLnR5cGUKKyAgICBpZiAoZGVjb2RlX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU0gYW5kCisgICAgICAgIHR5cGVfY2hlY2tlcnMuU3VwcG9ydHNPcGVuRW51bXMoZmllbGRfZGVzY3JpcHRvcikpOgorICAgICAgZGVjb2RlX3R5cGUgPSBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UMzIKKworICAgIG9uZW9mX2Rlc2NyaXB0b3IgPSBOb25lCisgICAgY2xlYXJfaWZfZGVmYXVsdCA9IEZhbHNlCisgICAgaWYgZmllbGRfZGVzY3JpcHRvci5jb250YWluaW5nX29uZW9mIGlzIG5vdCBOb25lOgorICAgICAgb25lb2ZfZGVzY3JpcHRvciA9IGZpZWxkX2Rlc2NyaXB0b3IKKyAgICBlbGlmIChpc19wcm90bzMgYW5kIG5vdCBpc19yZXBlYXRlZCBhbmQKKyAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLmNwcF90eXBlICE9IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFKToKKyAgICAgIGNsZWFyX2lmX2RlZmF1bHQgPSBUcnVlCisKKyAgICBpZiBpc19tYXBfZW50cnk6CisgICAgICBpc19tZXNzYWdlX21hcCA9IF9Jc01lc3NhZ2VNYXBGaWVsZChmaWVsZF9kZXNjcmlwdG9yKQorCisgICAgICBmaWVsZF9kZWNvZGVyID0gZGVjb2Rlci5NYXBEZWNvZGVyKAorICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IsIF9HZXRJbml0aWFsaXplRGVmYXVsdEZvck1hcChmaWVsZF9kZXNjcmlwdG9yKSwKKyAgICAgICAgICBpc19tZXNzYWdlX21hcCkKKyAgICBlbGlmIGRlY29kZV90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkc6CisgICAgICBmaWVsZF9kZWNvZGVyID0gZGVjb2Rlci5TdHJpbmdEZWNvZGVyKAorICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IubnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLAorICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IsIGZpZWxkX2Rlc2NyaXB0b3IuX2RlZmF1bHRfY29uc3RydWN0b3IsCisgICAgICAgICAgY2xlYXJfaWZfZGVmYXVsdCkKKyAgICBlbGlmIGZpZWxkX2Rlc2NyaXB0b3IuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgICBmaWVsZF9kZWNvZGVyID0gdHlwZV9jaGVja2Vycy5UWVBFX1RPX0RFQ09ERVJbZGVjb2RlX3R5cGVdKAorICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IubnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLAorICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IsIGZpZWxkX2Rlc2NyaXB0b3IuX2RlZmF1bHRfY29uc3RydWN0b3IpCisgICAgZWxzZToKKyAgICAgIGZpZWxkX2RlY29kZXIgPSB0eXBlX2NoZWNrZXJzLlRZUEVfVE9fREVDT0RFUltkZWNvZGVfdHlwZV0oCisgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci5udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQsCisgICAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IsIGZpZWxkX2Rlc2NyaXB0b3IuX2RlZmF1bHRfY29uc3RydWN0b3IsCisgICAgICAgICAgY2xlYXJfaWZfZGVmYXVsdCkKKworICAgIGNscy5fZGVjb2RlcnNfYnlfdGFnW3RhZ19ieXRlc10gPSAoZmllbGRfZGVjb2Rlciwgb25lb2ZfZGVzY3JpcHRvcikKKworICBBZGREZWNvZGVyKHR5cGVfY2hlY2tlcnMuRklFTERfVFlQRV9UT19XSVJFX1RZUEVbZmllbGRfZGVzY3JpcHRvci50eXBlXSwKKyAgICAgICAgICAgICBGYWxzZSkKKworICBpZiBpc19yZXBlYXRlZCBhbmQgd2lyZV9mb3JtYXQuSXNUeXBlUGFja2FibGUoZmllbGRfZGVzY3JpcHRvci50eXBlKToKKyAgICAjIFRvIHN1cHBvcnQgd2lyZSBjb21wYXRpYmlsaXR5IG9mIGFkZGluZyBwYWNrZWQgPSB0cnVlLCBhZGQgYSBkZWNvZGVyIGZvcgorICAgICMgcGFja2VkIHZhbHVlcyByZWdhcmRsZXNzIG9mIHRoZSBmaWVsZCdzIG9wdGlvbnMuCisgICAgQWRkRGVjb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBUcnVlKQorCisKK2RlZiBfQWRkQ2xhc3NBdHRyaWJ1dGVzRm9yTmVzdGVkRXh0ZW5zaW9ucyhkZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KToKKyAgZXh0ZW5zaW9ucyA9IGRlc2NyaXB0b3IuZXh0ZW5zaW9uc19ieV9uYW1lCisgIGZvciBleHRlbnNpb25fbmFtZSwgZXh0ZW5zaW9uX2ZpZWxkIGluIGV4dGVuc2lvbnMuaXRlbXMoKToKKyAgICBhc3NlcnQgZXh0ZW5zaW9uX25hbWUgbm90IGluIGRpY3Rpb25hcnkKKyAgICBkaWN0aW9uYXJ5W2V4dGVuc2lvbl9uYW1lXSA9IGV4dGVuc2lvbl9maWVsZAorCisKK2RlZiBfQWRkRW51bVZhbHVlcyhkZXNjcmlwdG9yLCBjbHMpOgorICAiIiJTZXRzIGNsYXNzLWxldmVsIGF0dHJpYnV0ZXMgZm9yIGFsbCBlbnVtIGZpZWxkcyBkZWZpbmVkIGluIHRoaXMgbWVzc2FnZS4KKworICBBbHNvIGV4cG9ydGluZyBhIGNsYXNzLWxldmVsIG9iamVjdCB0aGF0IGNhbiBuYW1lIGVudW0gdmFsdWVzLgorCisgIEFyZ3M6CisgICAgZGVzY3JpcHRvcjogRGVzY3JpcHRvciBvYmplY3QgZm9yIHRoaXMgbWVzc2FnZSB0eXBlLgorICAgIGNsczogQ2xhc3Mgd2UncmUgY29uc3RydWN0aW5nIGZvciB0aGlzIG1lc3NhZ2UgdHlwZS4KKyAgIiIiCisgIGZvciBlbnVtX3R5cGUgaW4gZGVzY3JpcHRvci5lbnVtX3R5cGVzOgorICAgIHNldGF0dHIoY2xzLCBlbnVtX3R5cGUubmFtZSwgZW51bV90eXBlX3dyYXBwZXIuRW51bVR5cGVXcmFwcGVyKGVudW1fdHlwZSkpCisgICAgZm9yIGVudW1fdmFsdWUgaW4gZW51bV90eXBlLnZhbHVlczoKKyAgICAgIHNldGF0dHIoY2xzLCBlbnVtX3ZhbHVlLm5hbWUsIGVudW1fdmFsdWUubnVtYmVyKQorCisKK2RlZiBfR2V0SW5pdGlhbGl6ZURlZmF1bHRGb3JNYXAoZmllbGQpOgorICBpZiBmaWVsZC5sYWJlbCAhPSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgorICAgIHJhaXNlIFZhbHVlRXJyb3IoJ21hcF9lbnRyeSBzZXQgb24gbm9uLXJlcGVhdGVkIGZpZWxkICVzJyAlICgKKyAgICAgICAgZmllbGQubmFtZSkpCisgIGZpZWxkc19ieV9uYW1lID0gZmllbGQubWVzc2FnZV90eXBlLmZpZWxkc19ieV9uYW1lCisgIGtleV9jaGVja2VyID0gdHlwZV9jaGVja2Vycy5HZXRUeXBlQ2hlY2tlcihmaWVsZHNfYnlfbmFtZVsna2V5J10pCisKKyAgdmFsdWVfZmllbGQgPSBmaWVsZHNfYnlfbmFtZVsndmFsdWUnXQorICBpZiBfSXNNZXNzYWdlTWFwRmllbGQoZmllbGQpOgorICAgIGRlZiBNYWtlTWVzc2FnZU1hcERlZmF1bHQobWVzc2FnZSk6CisgICAgICByZXR1cm4gY29udGFpbmVycy5NZXNzYWdlTWFwKAorICAgICAgICAgIG1lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbiwgdmFsdWVfZmllbGQubWVzc2FnZV90eXBlLCBrZXlfY2hlY2tlciwKKyAgICAgICAgICBmaWVsZC5tZXNzYWdlX3R5cGUpCisgICAgcmV0dXJuIE1ha2VNZXNzYWdlTWFwRGVmYXVsdAorICBlbHNlOgorICAgIHZhbHVlX2NoZWNrZXIgPSB0eXBlX2NoZWNrZXJzLkdldFR5cGVDaGVja2VyKHZhbHVlX2ZpZWxkKQorICAgIGRlZiBNYWtlUHJpbWl0aXZlTWFwRGVmYXVsdChtZXNzYWdlKToKKyAgICAgIHJldHVybiBjb250YWluZXJzLlNjYWxhck1hcCgKKyAgICAgICAgICBtZXNzYWdlLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4sIGtleV9jaGVja2VyLCB2YWx1ZV9jaGVja2VyLAorICAgICAgICAgIGZpZWxkLm1lc3NhZ2VfdHlwZSkKKyAgICByZXR1cm4gTWFrZVByaW1pdGl2ZU1hcERlZmF1bHQKKworZGVmIF9EZWZhdWx0VmFsdWVDb25zdHJ1Y3RvckZvckZpZWxkKGZpZWxkKToKKyAgIiIiUmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSBkZWZhdWx0IHZhbHVlIGZvciBhIGZpZWxkLgorCisgIEFyZ3M6CisgICAgZmllbGQ6IEZpZWxkRGVzY3JpcHRvciBvYmplY3QgZm9yIHRoaXMgZmllbGQuCisKKyAgVGhlIHJldHVybmVkIGZ1bmN0aW9uIGhhcyBvbmUgYXJndW1lbnQ6CisgICAgbWVzc2FnZTogTWVzc2FnZSBpbnN0YW5jZSBjb250YWluaW5nIHRoaXMgZmllbGQsIG9yIGEgd2Vha3JlZiBwcm94eQorICAgICAgb2Ygc2FtZS4KKworICBUaGF0IGZ1bmN0aW9uIGluIHR1cm4gcmV0dXJucyBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZmllbGQuICBUaGUgZGVmYXVsdAorICAgIHZhbHVlIG1heSByZWZlciBiYWNrIHRvIHxtZXNzYWdlfCB2aWEgYSB3ZWFrIHJlZmVyZW5jZS4KKyAgIiIiCisKKyAgaWYgX0lzTWFwRmllbGQoZmllbGQpOgorICAgIHJldHVybiBfR2V0SW5pdGlhbGl6ZURlZmF1bHRGb3JNYXAoZmllbGQpCisKKyAgaWYgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICBpZiBmaWVsZC5oYXNfZGVmYXVsdF92YWx1ZSBhbmQgZmllbGQuZGVmYXVsdF92YWx1ZSAhPSBbXToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1JlcGVhdGVkIGZpZWxkIGRlZmF1bHQgdmFsdWUgbm90IGVtcHR5IGxpc3Q6ICVzJyAlICgKKyAgICAgICAgICBmaWVsZC5kZWZhdWx0X3ZhbHVlKSkKKyAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICMgV2UgY2FuJ3QgbG9vayBhdCBfY29uY3JldGVfY2xhc3MgeWV0IHNpbmNlIGl0IG1pZ2h0IG5vdCBoYXZlCisgICAgICAjIGJlZW4gc2V0LiAgKERlcGVuZHMgb24gb3JkZXIgaW4gd2hpY2ggd2UgaW5pdGlhbGl6ZSB0aGUgY2xhc3NlcykuCisgICAgICBtZXNzYWdlX3R5cGUgPSBmaWVsZC5tZXNzYWdlX3R5cGUKKyAgICAgIGRlZiBNYWtlUmVwZWF0ZWRNZXNzYWdlRGVmYXVsdChtZXNzYWdlKToKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lcnMuUmVwZWF0ZWRDb21wb3NpdGVGaWVsZENvbnRhaW5lcigKKyAgICAgICAgICAgIG1lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbiwgZmllbGQubWVzc2FnZV90eXBlKQorICAgICAgcmV0dXJuIE1ha2VSZXBlYXRlZE1lc3NhZ2VEZWZhdWx0CisgICAgZWxzZToKKyAgICAgIHR5cGVfY2hlY2tlciA9IHR5cGVfY2hlY2tlcnMuR2V0VHlwZUNoZWNrZXIoZmllbGQpCisgICAgICBkZWYgTWFrZVJlcGVhdGVkU2NhbGFyRGVmYXVsdChtZXNzYWdlKToKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lcnMuUmVwZWF0ZWRTY2FsYXJGaWVsZENvbnRhaW5lcigKKyAgICAgICAgICAgIG1lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbiwgdHlwZV9jaGVja2VyKQorICAgICAgcmV0dXJuIE1ha2VSZXBlYXRlZFNjYWxhckRlZmF1bHQKKworICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAjIF9jb25jcmV0ZV9jbGFzcyBtYXkgbm90IHlldCBiZSBpbml0aWFsaXplZC4KKyAgICBtZXNzYWdlX3R5cGUgPSBmaWVsZC5tZXNzYWdlX3R5cGUKKyAgICBkZWYgTWFrZVN1Yk1lc3NhZ2VEZWZhdWx0KG1lc3NhZ2UpOgorICAgICAgYXNzZXJ0IGdldGF0dHIobWVzc2FnZV90eXBlLCAnX2NvbmNyZXRlX2NsYXNzJywgTm9uZSksICgKKyAgICAgICAgICAnVW5pbml0aWFsaXplZCBjb25jcmV0ZSBjbGFzcyBmb3VuZCBmb3IgZmllbGQgJXIgKG1lc3NhZ2UgdHlwZSAlciknCisgICAgICAgICAgJSAoZmllbGQuZnVsbF9uYW1lLCBtZXNzYWdlX3R5cGUuZnVsbF9uYW1lKSkKKyAgICAgIHJlc3VsdCA9IG1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MoKQorICAgICAgcmVzdWx0Ll9TZXRMaXN0ZW5lcigKKyAgICAgICAgICBfT25lb2ZMaXN0ZW5lcihtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgICBpZiBmaWVsZC5jb250YWluaW5nX29uZW9mIGlzIG5vdCBOb25lCisgICAgICAgICAgZWxzZSBtZXNzYWdlLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4pCisgICAgICByZXR1cm4gcmVzdWx0CisgICAgcmV0dXJuIE1ha2VTdWJNZXNzYWdlRGVmYXVsdAorCisgIGRlZiBNYWtlU2NhbGFyRGVmYXVsdChtZXNzYWdlKToKKyAgICAjIFRPRE8ocHJvdG9idWYtdGVhbSk6IFRoaXMgbWF5IGJlIGJyb2tlbiBzaW5jZSB0aGVyZSBtYXkgbm90IGJlCisgICAgIyBkZWZhdWx0X3ZhbHVlLiAgQ29tYmluZSB3aXRoIGhhc19kZWZhdWx0X3ZhbHVlIHNvbWVob3cuCisgICAgcmV0dXJuIGZpZWxkLmRlZmF1bHRfdmFsdWUKKyAgcmV0dXJuIE1ha2VTY2FsYXJEZWZhdWx0CisKKworZGVmIF9SZXJhaXNlVHlwZUVycm9yV2l0aEZpZWxkTmFtZShtZXNzYWdlX25hbWUsIGZpZWxkX25hbWUpOgorICAiIiJSZS1yYWlzZSB0aGUgY3VycmVudGx5LWhhbmRsZWQgVHlwZUVycm9yIHdpdGggdGhlIGZpZWxkIG5hbWUgYWRkZWQuIiIiCisgIGV4YyA9IHN5cy5leGNfaW5mbygpWzFdCisgIGlmIGxlbihleGMuYXJncykgPT0gMSBhbmQgdHlwZShleGMpIGlzIFR5cGVFcnJvcjoKKyAgICAjIHNpbXBsZSBUeXBlRXJyb3I7IGFkZCBmaWVsZCBuYW1lIHRvIGV4Y2VwdGlvbiBtZXNzYWdlCisgICAgZXhjID0gVHlwZUVycm9yKCclcyBmb3IgZmllbGQgJXMuJXMnICUgKHN0cihleGMpLCBtZXNzYWdlX25hbWUsIGZpZWxkX25hbWUpKQorCisgICMgcmUtcmFpc2UgcG9zc2libHktYW1lbmRlZCBleGNlcHRpb24gd2l0aCBvcmlnaW5hbCB0cmFjZWJhY2s6CisgIHJhaXNlIGV4Yy53aXRoX3RyYWNlYmFjayhzeXMuZXhjX2luZm8oKVsyXSkKKworCitkZWYgX0FkZEluaXRNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJBZGRzIGFuIF9faW5pdF9fIG1ldGhvZCB0byBjbHMuIiIiCisKKyAgZGVmIF9HZXRJbnRlZ2VyRW51bVZhbHVlKGVudW1fdHlwZSwgdmFsdWUpOgorICAgICIiIkNvbnZlcnQgYSBzdHJpbmcgb3IgaW50ZWdlciBlbnVtIHZhbHVlIHRvIGFuIGludGVnZXIuCisKKyAgICBJZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmcsIGl0IGlzIGNvbnZlcnRlZCB0byB0aGUgZW51bSB2YWx1ZSBpbgorICAgIGVudW1fdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUuICBJZiB0aGUgdmFsdWUgaXMgbm90IGEgc3RyaW5nLCBpdCdzCisgICAgcmV0dXJuZWQgYXMtaXMuICAoTm8gY29udmVyc2lvbiBvciBib3VuZHMtY2hlY2tpbmcgaXMgZG9uZS4pCisgICAgIiIiCisgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKToKKyAgICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGVudW1fdHlwZS52YWx1ZXNfYnlfbmFtZVt2YWx1ZV0ubnVtYmVyCisgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0VudW0gdHlwZSAlczogdW5rbm93biBsYWJlbCAiJXMiJyAlICgKKyAgICAgICAgICAgIGVudW1fdHlwZS5mdWxsX25hbWUsIHZhbHVlKSkKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgaW5pdChzZWxmLCAqKmt3YXJncyk6CisgICAgc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZSA9IDAKKyAgICBzZWxmLl9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5ID0gbGVuKGt3YXJncykgPiAwCisgICAgc2VsZi5fZmllbGRzID0ge30KKyAgICAjIENvbnRhaW5zIGEgbWFwcGluZyBmcm9tIG9uZW9mIGZpZWxkIGRlc2NyaXB0b3JzIHRvIHRoZSBkZXNjcmlwdG9yCisgICAgIyBvZiB0aGUgY3VycmVudGx5IHNldCBmaWVsZCBpbiB0aGF0IG9uZW9mIGZpZWxkLgorICAgIHNlbGYuX29uZW9mcyA9IHt9CisKKyAgICAjIF91bmtub3duX2ZpZWxkcyBpcyAoKSB3aGVuIGVtcHR5IGZvciBlZmZpY2llbmN5LCBhbmQgd2lsbCBiZSB0dXJuZWQgaW50bworICAgICMgYSBsaXN0IGlmIGZpZWxkcyBhcmUgYWRkZWQuCisgICAgc2VsZi5fdW5rbm93bl9maWVsZHMgPSAoKQorICAgICMgX3Vua25vd25fZmllbGRfc2V0IGlzIE5vbmUgd2hlbiBlbXB0eSBmb3IgZWZmaWNpZW5jeSwgYW5kIHdpbGwgYmUKKyAgICAjIHR1cm5lZCBpbnRvIFVua25vd25GaWVsZFNldCBzdHJ1Y3QgaWYgZmllbGRzIGFyZSBhZGRlZC4KKyAgICBzZWxmLl91bmtub3duX2ZpZWxkX3NldCA9IE5vbmUgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgc2VsZi5faXNfcHJlc2VudF9pbl9wYXJlbnQgPSBGYWxzZQorICAgIHNlbGYuX2xpc3RlbmVyID0gbWVzc2FnZV9saXN0ZW5lcl9tb2QuTnVsbE1lc3NhZ2VMaXN0ZW5lcigpCisgICAgc2VsZi5fbGlzdGVuZXJfZm9yX2NoaWxkcmVuID0gX0xpc3RlbmVyKHNlbGYpCisgICAgZm9yIGZpZWxkX25hbWUsIGZpZWxkX3ZhbHVlIGluIGt3YXJncy5pdGVtcygpOgorICAgICAgZmllbGQgPSBfR2V0RmllbGRCeU5hbWUobWVzc2FnZV9kZXNjcmlwdG9yLCBmaWVsZF9uYW1lKQorICAgICAgaWYgZmllbGQgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclcygpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgIiVzIicgJQorICAgICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lLCBmaWVsZF9uYW1lKSkKKyAgICAgIGlmIGZpZWxkX3ZhbHVlIGlzIE5vbmU6CisgICAgICAgICMgZmllbGQ9Tm9uZSBpcyB0aGUgc2FtZSBhcyBubyBmaWVsZCBhdCBhbGwuCisgICAgICAgIGNvbnRpbnVlCisgICAgICBpZiBmaWVsZC5sYWJlbCA9PSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgorICAgICAgICBjb3B5ID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKKyAgICAgICAgaWYgZmllbGQuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6ICAjIENvbXBvc2l0ZQorICAgICAgICAgIGlmIF9Jc01hcEZpZWxkKGZpZWxkKToKKyAgICAgICAgICAgIGlmIF9Jc01lc3NhZ2VNYXBGaWVsZChmaWVsZCk6CisgICAgICAgICAgICAgIGZvciBrZXkgaW4gZmllbGRfdmFsdWU6CisgICAgICAgICAgICAgICAgY29weVtrZXldLk1lcmdlRnJvbShmaWVsZF92YWx1ZVtrZXldKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgY29weS51cGRhdGUoZmllbGRfdmFsdWUpCisgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciB2YWwgaW4gZmllbGRfdmFsdWU6CisgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBkaWN0KToKKyAgICAgICAgICAgICAgICBjb3B5LmFkZCgqKnZhbCkKKyAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb3B5LmFkZCgpLk1lcmdlRnJvbSh2YWwpCisgICAgICAgIGVsc2U6ICAjIFNjYWxhcgorICAgICAgICAgIGlmIGZpZWxkLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9FTlVNOgorICAgICAgICAgICAgZmllbGRfdmFsdWUgPSBbX0dldEludGVnZXJFbnVtVmFsdWUoZmllbGQuZW51bV90eXBlLCB2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdmFsIGluIGZpZWxkX3ZhbHVlXQorICAgICAgICAgIGNvcHkuZXh0ZW5kKGZpZWxkX3ZhbHVlKQorICAgICAgICBzZWxmLl9maWVsZHNbZmllbGRdID0gY29weQorICAgICAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgY29weSA9IGZpZWxkLl9kZWZhdWx0X2NvbnN0cnVjdG9yKHNlbGYpCisgICAgICAgIG5ld192YWwgPSBmaWVsZF92YWx1ZQorICAgICAgICBpZiBpc2luc3RhbmNlKGZpZWxkX3ZhbHVlLCBkaWN0KToKKyAgICAgICAgICBuZXdfdmFsID0gZmllbGQubWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcygqKmZpZWxkX3ZhbHVlKQorICAgICAgICB0cnk6CisgICAgICAgICAgY29weS5NZXJnZUZyb20obmV3X3ZhbCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICBfUmVyYWlzZVR5cGVFcnJvcldpdGhGaWVsZE5hbWUobWVzc2FnZV9kZXNjcmlwdG9yLm5hbWUsIGZpZWxkX25hbWUpCisgICAgICAgIHNlbGYuX2ZpZWxkc1tmaWVsZF0gPSBjb3B5CisgICAgICBlbHNlOgorICAgICAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfRU5VTToKKyAgICAgICAgICBmaWVsZF92YWx1ZSA9IF9HZXRJbnRlZ2VyRW51bVZhbHVlKGZpZWxkLmVudW1fdHlwZSwgZmllbGRfdmFsdWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICBzZXRhdHRyKHNlbGYsIGZpZWxkX25hbWUsIGZpZWxkX3ZhbHVlKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgIF9SZXJhaXNlVHlwZUVycm9yV2l0aEZpZWxkTmFtZShtZXNzYWdlX2Rlc2NyaXB0b3IubmFtZSwgZmllbGRfbmFtZSkKKworICBpbml0Ll9fbW9kdWxlX18gPSBOb25lCisgIGluaXQuX19kb2NfXyA9IE5vbmUKKyAgY2xzLl9faW5pdF9fID0gaW5pdAorCisKK2RlZiBfR2V0RmllbGRCeU5hbWUobWVzc2FnZV9kZXNjcmlwdG9yLCBmaWVsZF9uYW1lKToKKyAgIiIiUmV0dXJucyBhIGZpZWxkIGRlc2NyaXB0b3IgYnkgZmllbGQgbmFtZS4KKworICBBcmdzOgorICAgIG1lc3NhZ2VfZGVzY3JpcHRvcjogQSBEZXNjcmlwdG9yIGRlc2NyaWJpbmcgYWxsIGZpZWxkcyBpbiBtZXNzYWdlLgorICAgIGZpZWxkX25hbWU6IFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byByZXRyaWV2ZS4KKyAgUmV0dXJuczoKKyAgICBUaGUgZmllbGQgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGZpZWxkIG5hbWUuCisgICIiIgorICB0cnk6CisgICAgcmV0dXJuIG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZVtmaWVsZF9uYW1lXQorICBleGNlcHQgS2V5RXJyb3I6CisgICAgcmFpc2UgVmFsdWVFcnJvcignUHJvdG9jb2wgbWVzc2FnZSAlcyBoYXMgbm8gIiVzIiBmaWVsZC4nICUKKyAgICAgICAgICAgICAgICAgICAgIChtZXNzYWdlX2Rlc2NyaXB0b3IubmFtZSwgZmllbGRfbmFtZSkpCisKKworZGVmIF9BZGRQcm9wZXJ0aWVzRm9yRmllbGRzKGRlc2NyaXB0b3IsIGNscyk6CisgICIiIkFkZHMgcHJvcGVydGllcyBmb3IgYWxsIGZpZWxkcyBpbiB0aGlzIHByb3RvY29sIG1lc3NhZ2UgdHlwZS4iIiIKKyAgZm9yIGZpZWxkIGluIGRlc2NyaXB0b3IuZmllbGRzOgorICAgIF9BZGRQcm9wZXJ0aWVzRm9yRmllbGQoZmllbGQsIGNscykKKworICBpZiBkZXNjcmlwdG9yLmlzX2V4dGVuZGFibGU6CisgICAgIyBfRXh0ZW5zaW9uRGljdCBpcyBqdXN0IGFuIGFkYXB0b3Igd2l0aCBubyBzdGF0ZSBzbyB3ZSBhbGxvY2F0ZSBhIG5ldyBvbmUKKyAgICAjIGV2ZXJ5IHRpbWUgaXQgaXMgYWNjZXNzZWQuCisgICAgY2xzLkV4dGVuc2lvbnMgPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogX0V4dGVuc2lvbkRpY3Qoc2VsZikpCisKKworZGVmIF9BZGRQcm9wZXJ0aWVzRm9yRmllbGQoZmllbGQsIGNscyk6CisgICIiIkFkZHMgYSBwdWJsaWMgcHJvcGVydHkgZm9yIGEgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZC4KKyAgQ2xpZW50cyBjYW4gdXNlIHRoaXMgcHJvcGVydHkgdG8gZ2V0IGFuZCAoaW4gdGhlIGNhc2UKKyAgb2Ygbm9uLXJlcGVhdGVkIHNjYWxhciBmaWVsZHMpIGRpcmVjdGx5IHNldCB0aGUgdmFsdWUKKyAgb2YgYSBwcm90b2NvbCBtZXNzYWdlIGZpZWxkLgorCisgIEFyZ3M6CisgICAgZmllbGQ6IEEgRmllbGREZXNjcmlwdG9yIGZvciB0aGlzIGZpZWxkLgorICAgIGNsczogVGhlIGNsYXNzIHdlJ3JlIGNvbnN0cnVjdGluZy4KKyAgIiIiCisgICMgQ2F0Y2ggaXQgaWYgd2UgYWRkIG90aGVyIHR5cGVzIHRoYXQgd2Ugc2hvdWxkCisgICMgaGFuZGxlIHNwZWNpYWxseSBoZXJlLgorICBhc3NlcnQgX0ZpZWxkRGVzY3JpcHRvci5NQVhfQ1BQVFlQRSA9PSAxMAorCisgIGNvbnN0YW50X25hbWUgPSBmaWVsZC5uYW1lLnVwcGVyKCkgKyAnX0ZJRUxEX05VTUJFUicKKyAgc2V0YXR0cihjbHMsIGNvbnN0YW50X25hbWUsIGZpZWxkLm51bWJlcikKKworICBpZiBmaWVsZC5sYWJlbCA9PSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgorICAgIF9BZGRQcm9wZXJ0aWVzRm9yUmVwZWF0ZWRGaWVsZChmaWVsZCwgY2xzKQorICBlbGlmIGZpZWxkLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgorICAgIF9BZGRQcm9wZXJ0aWVzRm9yTm9uUmVwZWF0ZWRDb21wb3NpdGVGaWVsZChmaWVsZCwgY2xzKQorICBlbHNlOgorICAgIF9BZGRQcm9wZXJ0aWVzRm9yTm9uUmVwZWF0ZWRTY2FsYXJGaWVsZChmaWVsZCwgY2xzKQorCisKK2NsYXNzIF9GaWVsZFByb3BlcnR5KHByb3BlcnR5KToKKyAgX19zbG90c19fID0gKCdERVNDUklQVE9SJywpCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGRlc2NyaXB0b3IsIGdldHRlciwgc2V0dGVyLCBkb2MpOgorICAgIHByb3BlcnR5Ll9faW5pdF9fKHNlbGYsIGdldHRlciwgc2V0dGVyLCBkb2M9ZG9jKQorICAgIHNlbGYuREVTQ1JJUFRPUiA9IGRlc2NyaXB0b3IKKworCitkZWYgX0FkZFByb3BlcnRpZXNGb3JSZXBlYXRlZEZpZWxkKGZpZWxkLCBjbHMpOgorICAiIiJBZGRzIGEgcHVibGljIHByb3BlcnR5IGZvciBhICJyZXBlYXRlZCIgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZC4gIENsaWVudHMKKyAgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLCB3aGljaCB3aWxsIGJlIGVpdGhlciBhCisgIFJlcGVhdGVkU2NhbGFyRmllbGRDb250YWluZXIgb3IgUmVwZWF0ZWRDb21wb3NpdGVGaWVsZENvbnRhaW5lciAoc2VlCisgIGJlbG93KS4KKworICBOb3RlIHRoYXQgd2hlbiBjbGllbnRzIGFkZCB2YWx1ZXMgdG8gdGhlc2UgY29udGFpbmVycywgd2UgcGVyZm9ybQorICB0eXBlLWNoZWNraW5nIGluIHRoZSBjYXNlIG9mIHJlcGVhdGVkIHNjYWxhciBmaWVsZHMsIGFuZCB3ZSBhbHNvIHNldCBhbnkKKyAgbmVjZXNzYXJ5ICJoYXMiIGJpdHMgYXMgYSBzaWRlLWVmZmVjdC4KKworICBBcmdzOgorICAgIGZpZWxkOiBBIEZpZWxkRGVzY3JpcHRvciBmb3IgdGhpcyBmaWVsZC4KKyAgICBjbHM6IFRoZSBjbGFzcyB3ZSdyZSBjb25zdHJ1Y3RpbmcuCisgICIiIgorICBwcm90b19maWVsZF9uYW1lID0gZmllbGQubmFtZQorICBwcm9wZXJ0eV9uYW1lID0gX1Byb3BlcnR5TmFtZShwcm90b19maWVsZF9uYW1lKQorCisgIGRlZiBnZXR0ZXIoc2VsZik6CisgICAgZmllbGRfdmFsdWUgPSBzZWxmLl9maWVsZHMuZ2V0KGZpZWxkKQorICAgIGlmIGZpZWxkX3ZhbHVlIGlzIE5vbmU6CisgICAgICAjIENvbnN0cnVjdCBhIG5ldyBvYmplY3QgdG8gcmVwcmVzZW50IHRoaXMgZmllbGQuCisgICAgICBmaWVsZF92YWx1ZSA9IGZpZWxkLl9kZWZhdWx0X2NvbnN0cnVjdG9yKHNlbGYpCisKKyAgICAgICMgQXRvbWljYWxseSBjaGVjayBpZiBhbm90aGVyIHRocmVhZCBoYXMgcHJlZW1wdGVkIHVzIGFuZCwgaWYgbm90LCBzd2FwCisgICAgICAjIGluIHRoZSBuZXcgb2JqZWN0IHdlIGp1c3QgY3JlYXRlZC4gIElmIHNvbWVvbmUgaGFzIHByZWVtcHRlZCB1cywgd2UKKyAgICAgICMgdGFrZSB0aGF0IG9iamVjdCBhbmQgZGlzY2FyZCBvdXJzLgorICAgICAgIyBXQVJOSU5HOiAgV2UgYXJlIHJlbHlpbmcgb24gc2V0ZGVmYXVsdCgpIGJlaW5nIGF0b21pYy4gIFRoaXMgaXMgdHJ1ZQorICAgICAgIyAgIGluIENQeXRob24gYnV0IHdlIGhhdmVuJ3QgaW52ZXN0aWdhdGVkIG90aGVycy4gIFRoaXMgd2FybmluZyBhcHBlYXJzCisgICAgICAjICAgaW4gc2V2ZXJhbCBvdGhlciBsb2NhdGlvbnMgaW4gdGhpcyBmaWxlLgorICAgICAgZmllbGRfdmFsdWUgPSBzZWxmLl9maWVsZHMuc2V0ZGVmYXVsdChmaWVsZCwgZmllbGRfdmFsdWUpCisgICAgcmV0dXJuIGZpZWxkX3ZhbHVlCisgIGdldHRlci5fX21vZHVsZV9fID0gTm9uZQorICBnZXR0ZXIuX19kb2NfXyA9ICdHZXR0ZXIgZm9yICVzLicgJSBwcm90b19maWVsZF9uYW1lCisKKyAgIyBXZSBkZWZpbmUgYSBzZXR0ZXIganVzdCBzbyB3ZSBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggYSBtb3JlCisgICMgaGVscGZ1bCBlcnJvciBtZXNzYWdlLgorICBkZWYgc2V0dGVyKHNlbGYsIG5ld192YWx1ZSk6CisgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoJ0Fzc2lnbm1lbnQgbm90IGFsbG93ZWQgdG8gcmVwZWF0ZWQgZmllbGQgJworICAgICAgICAgICAgICAgICAgICAgICAgICciJXMiIGluIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0LicgJSBwcm90b19maWVsZF9uYW1lKQorCisgIGRvYyA9ICdNYWdpYyBhdHRyaWJ1dGUgZ2VuZXJhdGVkIGZvciAiJXMiIHByb3RvIGZpZWxkLicgJSBwcm90b19maWVsZF9uYW1lCisgIHNldGF0dHIoY2xzLCBwcm9wZXJ0eV9uYW1lLCBfRmllbGRQcm9wZXJ0eShmaWVsZCwgZ2V0dGVyLCBzZXR0ZXIsIGRvYz1kb2MpKQorCisKK2RlZiBfQWRkUHJvcGVydGllc0Zvck5vblJlcGVhdGVkU2NhbGFyRmllbGQoZmllbGQsIGNscyk6CisgICIiIkFkZHMgYSBwdWJsaWMgcHJvcGVydHkgZm9yIGEgbm9ucmVwZWF0ZWQsIHNjYWxhciBwcm90b2NvbCBtZXNzYWdlIGZpZWxkLgorICBDbGllbnRzIGNhbiB1c2UgdGhpcyBwcm9wZXJ0eSB0byBnZXQgYW5kIGRpcmVjdGx5IHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgorICBOb3RlIHRoYXQgd2hlbiB0aGUgY2xpZW50IHNldHMgdGhlIHZhbHVlIG9mIGEgZmllbGQgYnkgdXNpbmcgdGhpcyBwcm9wZXJ0eSwKKyAgYWxsIG5lY2Vzc2FyeSAiaGFzIiBiaXRzIGFyZSBzZXQgYXMgYSBzaWRlLWVmZmVjdCwgYW5kIHdlIGFsc28gcGVyZm9ybQorICB0eXBlLWNoZWNraW5nLgorCisgIEFyZ3M6CisgICAgZmllbGQ6IEEgRmllbGREZXNjcmlwdG9yIGZvciB0aGlzIGZpZWxkLgorICAgIGNsczogVGhlIGNsYXNzIHdlJ3JlIGNvbnN0cnVjdGluZy4KKyAgIiIiCisgIHByb3RvX2ZpZWxkX25hbWUgPSBmaWVsZC5uYW1lCisgIHByb3BlcnR5X25hbWUgPSBfUHJvcGVydHlOYW1lKHByb3RvX2ZpZWxkX25hbWUpCisgIHR5cGVfY2hlY2tlciA9IHR5cGVfY2hlY2tlcnMuR2V0VHlwZUNoZWNrZXIoZmllbGQpCisgIGRlZmF1bHRfdmFsdWUgPSBmaWVsZC5kZWZhdWx0X3ZhbHVlCisgIGlzX3Byb3RvMyA9IGZpZWxkLmNvbnRhaW5pbmdfdHlwZS5zeW50YXggPT0gJ3Byb3RvMycKKworICBkZWYgZ2V0dGVyKHNlbGYpOgorICAgICMgVE9ETyhwcm90b2J1Zi10ZWFtKTogVGhpcyBtYXkgYmUgYnJva2VuIHNpbmNlIHRoZXJlIG1heSBub3QgYmUKKyAgICAjIGRlZmF1bHRfdmFsdWUuICBDb21iaW5lIHdpdGggaGFzX2RlZmF1bHRfdmFsdWUgc29tZWhvdy4KKyAgICByZXR1cm4gc2VsZi5fZmllbGRzLmdldChmaWVsZCwgZGVmYXVsdF92YWx1ZSkKKyAgZ2V0dGVyLl9fbW9kdWxlX18gPSBOb25lCisgIGdldHRlci5fX2RvY19fID0gJ0dldHRlciBmb3IgJXMuJyAlIHByb3RvX2ZpZWxkX25hbWUKKworICBjbGVhcl93aGVuX3NldF90b19kZWZhdWx0ID0gaXNfcHJvdG8zIGFuZCBub3QgZmllbGQuY29udGFpbmluZ19vbmVvZgorCisgIGRlZiBmaWVsZF9zZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKKyAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgIyBUZXN0aW5nIHRoZSB2YWx1ZSBmb3IgdHJ1dGhpbmVzcyBjYXB0dXJlcyBhbGwgb2YgdGhlIHByb3RvMyBkZWZhdWx0cworICAgICMgKDAsIDAuMCwgZW51bSAwLCBhbmQgRmFsc2UpLgorICAgIHRyeToKKyAgICAgIG5ld192YWx1ZSA9IHR5cGVfY2hlY2tlci5DaGVja1ZhbHVlKG5ld192YWx1ZSkKKyAgICBleGNlcHQgVHlwZUVycm9yIGFzIGU6CisgICAgICByYWlzZSBUeXBlRXJyb3IoCisgICAgICAgICAgJ0Nhbm5vdCBzZXQgJXMgdG8gJS4xMDI0cjogJXMnICUgKGZpZWxkLmZ1bGxfbmFtZSwgbmV3X3ZhbHVlLCBlKSkKKyAgICBpZiBjbGVhcl93aGVuX3NldF90b19kZWZhdWx0IGFuZCBub3QgbmV3X3ZhbHVlOgorICAgICAgc2VsZi5fZmllbGRzLnBvcChmaWVsZCwgTm9uZSkKKyAgICBlbHNlOgorICAgICAgc2VsZi5fZmllbGRzW2ZpZWxkXSA9IG5ld192YWx1ZQorICAgICMgQ2hlY2sgX2NhY2hlZF9ieXRlX3NpemVfZGlydHkgaW5saW5lIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIHNpbmNlIHNjYWxhcgorICAgICMgc2V0dGVycyBhcmUgY2FsbGVkIGZyZXF1ZW50bHkuCisgICAgaWYgbm90IHNlbGYuX2NhY2hlZF9ieXRlX3NpemVfZGlydHk6CisgICAgICBzZWxmLl9Nb2RpZmllZCgpCisKKyAgaWYgZmllbGQuY29udGFpbmluZ19vbmVvZjoKKyAgICBkZWYgc2V0dGVyKHNlbGYsIG5ld192YWx1ZSk6CisgICAgICBmaWVsZF9zZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKQorICAgICAgc2VsZi5fVXBkYXRlT25lb2ZTdGF0ZShmaWVsZCkKKyAgZWxzZToKKyAgICBzZXR0ZXIgPSBmaWVsZF9zZXR0ZXIKKworICBzZXR0ZXIuX19tb2R1bGVfXyA9IE5vbmUKKyAgc2V0dGVyLl9fZG9jX18gPSAnU2V0dGVyIGZvciAlcy4nICUgcHJvdG9fZmllbGRfbmFtZQorCisgICMgQWRkIGEgcHJvcGVydHkgdG8gZW5jYXBzdWxhdGUgdGhlIGdldHRlci9zZXR0ZXIuCisgIGRvYyA9ICdNYWdpYyBhdHRyaWJ1dGUgZ2VuZXJhdGVkIGZvciAiJXMiIHByb3RvIGZpZWxkLicgJSBwcm90b19maWVsZF9uYW1lCisgIHNldGF0dHIoY2xzLCBwcm9wZXJ0eV9uYW1lLCBfRmllbGRQcm9wZXJ0eShmaWVsZCwgZ2V0dGVyLCBzZXR0ZXIsIGRvYz1kb2MpKQorCisKK2RlZiBfQWRkUHJvcGVydGllc0Zvck5vblJlcGVhdGVkQ29tcG9zaXRlRmllbGQoZmllbGQsIGNscyk6CisgICIiIkFkZHMgYSBwdWJsaWMgcHJvcGVydHkgZm9yIGEgbm9ucmVwZWF0ZWQsIGNvbXBvc2l0ZSBwcm90b2NvbCBtZXNzYWdlIGZpZWxkLgorICBBIGNvbXBvc2l0ZSBmaWVsZCBpcyBhICJncm91cCIgb3IgIm1lc3NhZ2UiIGZpZWxkLgorCisgIENsaWVudHMgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLCBidXQgY2Fubm90CisgIGFzc2lnbiB0byB0aGUgcHJvcGVydHkgZGlyZWN0bHkuCisKKyAgQXJnczoKKyAgICBmaWVsZDogQSBGaWVsZERlc2NyaXB0b3IgZm9yIHRoaXMgZmllbGQuCisgICAgY2xzOiBUaGUgY2xhc3Mgd2UncmUgY29uc3RydWN0aW5nLgorICAiIiIKKyAgIyBUT0RPKHJvYmluc29uKTogUmVtb3ZlIGR1cGxpY2F0aW9uIHdpdGggc2ltaWxhciBtZXRob2QKKyAgIyBmb3Igbm9uLXJlcGVhdGVkIHNjYWxhcnMuCisgIHByb3RvX2ZpZWxkX25hbWUgPSBmaWVsZC5uYW1lCisgIHByb3BlcnR5X25hbWUgPSBfUHJvcGVydHlOYW1lKHByb3RvX2ZpZWxkX25hbWUpCisKKyAgZGVmIGdldHRlcihzZWxmKToKKyAgICBmaWVsZF92YWx1ZSA9IHNlbGYuX2ZpZWxkcy5nZXQoZmllbGQpCisgICAgaWYgZmllbGRfdmFsdWUgaXMgTm9uZToKKyAgICAgICMgQ29uc3RydWN0IGEgbmV3IG9iamVjdCB0byByZXByZXNlbnQgdGhpcyBmaWVsZC4KKyAgICAgIGZpZWxkX3ZhbHVlID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKKworICAgICAgIyBBdG9taWNhbGx5IGNoZWNrIGlmIGFub3RoZXIgdGhyZWFkIGhhcyBwcmVlbXB0ZWQgdXMgYW5kLCBpZiBub3QsIHN3YXAKKyAgICAgICMgaW4gdGhlIG5ldyBvYmplY3Qgd2UganVzdCBjcmVhdGVkLiAgSWYgc29tZW9uZSBoYXMgcHJlZW1wdGVkIHVzLCB3ZQorICAgICAgIyB0YWtlIHRoYXQgb2JqZWN0IGFuZCBkaXNjYXJkIG91cnMuCisgICAgICAjIFdBUk5JTkc6ICBXZSBhcmUgcmVseWluZyBvbiBzZXRkZWZhdWx0KCkgYmVpbmcgYXRvbWljLiAgVGhpcyBpcyB0cnVlCisgICAgICAjICAgaW4gQ1B5dGhvbiBidXQgd2UgaGF2ZW4ndCBpbnZlc3RpZ2F0ZWQgb3RoZXJzLiAgVGhpcyB3YXJuaW5nIGFwcGVhcnMKKyAgICAgICMgICBpbiBzZXZlcmFsIG90aGVyIGxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuCisgICAgICBmaWVsZF92YWx1ZSA9IHNlbGYuX2ZpZWxkcy5zZXRkZWZhdWx0KGZpZWxkLCBmaWVsZF92YWx1ZSkKKyAgICByZXR1cm4gZmllbGRfdmFsdWUKKyAgZ2V0dGVyLl9fbW9kdWxlX18gPSBOb25lCisgIGdldHRlci5fX2RvY19fID0gJ0dldHRlciBmb3IgJXMuJyAlIHByb3RvX2ZpZWxkX25hbWUKKworICAjIFdlIGRlZmluZSBhIHNldHRlciBqdXN0IHNvIHdlIGNhbiB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBhIG1vcmUKKyAgIyBoZWxwZnVsIGVycm9yIG1lc3NhZ2UuCisgIGRlZiBzZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKKyAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcignQXNzaWdubWVudCBub3QgYWxsb3dlZCB0byBjb21wb3NpdGUgZmllbGQgJworICAgICAgICAgICAgICAgICAgICAgICAgICciJXMiIGluIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0LicgJSBwcm90b19maWVsZF9uYW1lKQorCisgICMgQWRkIGEgcHJvcGVydHkgdG8gZW5jYXBzdWxhdGUgdGhlIGdldHRlci4KKyAgZG9jID0gJ01hZ2ljIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgZm9yICIlcyIgcHJvdG8gZmllbGQuJyAlIHByb3RvX2ZpZWxkX25hbWUKKyAgc2V0YXR0cihjbHMsIHByb3BlcnR5X25hbWUsIF9GaWVsZFByb3BlcnR5KGZpZWxkLCBnZXR0ZXIsIHNldHRlciwgZG9jPWRvYykpCisKKworZGVmIF9BZGRQcm9wZXJ0aWVzRm9yRXh0ZW5zaW9ucyhkZXNjcmlwdG9yLCBjbHMpOgorICAiIiJBZGRzIHByb3BlcnRpZXMgZm9yIGFsbCBmaWVsZHMgaW4gdGhpcyBwcm90b2NvbCBtZXNzYWdlIHR5cGUuIiIiCisgIGV4dGVuc2lvbnMgPSBkZXNjcmlwdG9yLmV4dGVuc2lvbnNfYnlfbmFtZQorICBmb3IgZXh0ZW5zaW9uX25hbWUsIGV4dGVuc2lvbl9maWVsZCBpbiBleHRlbnNpb25zLml0ZW1zKCk6CisgICAgY29uc3RhbnRfbmFtZSA9IGV4dGVuc2lvbl9uYW1lLnVwcGVyKCkgKyAnX0ZJRUxEX05VTUJFUicKKyAgICBzZXRhdHRyKGNscywgY29uc3RhbnRfbmFtZSwgZXh0ZW5zaW9uX2ZpZWxkLm51bWJlcikKKworICAjIFRPRE8oYW1hdXJ5ZmEpOiBNaWdyYXRlIGFsbCB1c2VycyBvZiB0aGVzZSBhdHRyaWJ1dGVzIHRvIGZ1bmN0aW9ucyBsaWtlCisgICMgICBwb29sLkZpbmRFeHRlbnNpb25CeU51bWJlcihkZXNjcmlwdG9yKS4KKyAgaWYgZGVzY3JpcHRvci5maWxlIGlzIG5vdCBOb25lOgorICAgICMgVE9ETyhhbWF1cnlmYSk6IFVzZSBjbHMuTUVTU0FHRV9GQUNUT1JZLnBvb2wgd2hlbiBhdmFpbGFibGUuCisgICAgcG9vbCA9IGRlc2NyaXB0b3IuZmlsZS5wb29sCisgICAgY2xzLl9leHRlbnNpb25zX2J5X251bWJlciA9IHBvb2wuX2V4dGVuc2lvbnNfYnlfbnVtYmVyW2Rlc2NyaXB0b3JdCisgICAgY2xzLl9leHRlbnNpb25zX2J5X25hbWUgPSBwb29sLl9leHRlbnNpb25zX2J5X25hbWVbZGVzY3JpcHRvcl0KKworZGVmIF9BZGRTdGF0aWNNZXRob2RzKGNscyk6CisgICMgVE9ETyhyb2JpbnNvbik6IFRoaXMgcHJvYmFibHkgbmVlZHMgdG8gYmUgdGhyZWFkLXNhZmUoPykKKyAgZGVmIFJlZ2lzdGVyRXh0ZW5zaW9uKGV4dGVuc2lvbl9oYW5kbGUpOgorICAgIGV4dGVuc2lvbl9oYW5kbGUuY29udGFpbmluZ190eXBlID0gY2xzLkRFU0NSSVBUT1IKKyAgICAjIFRPRE8oYW1hdXJ5ZmEpOiBVc2UgY2xzLk1FU1NBR0VfRkFDVE9SWS5wb29sIHdoZW4gYXZhaWxhYmxlLgorICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICBjbHMuREVTQ1JJUFRPUi5maWxlLnBvb2wuX0FkZEV4dGVuc2lvbkRlc2NyaXB0b3IoZXh0ZW5zaW9uX2hhbmRsZSkKKyAgICBfQXR0YWNoRmllbGRIZWxwZXJzKGNscywgZXh0ZW5zaW9uX2hhbmRsZSkKKyAgY2xzLlJlZ2lzdGVyRXh0ZW5zaW9uID0gc3RhdGljbWV0aG9kKFJlZ2lzdGVyRXh0ZW5zaW9uKQorCisgIGRlZiBGcm9tU3RyaW5nKHMpOgorICAgIG1lc3NhZ2UgPSBjbHMoKQorICAgIG1lc3NhZ2UuTWVyZ2VGcm9tU3RyaW5nKHMpCisgICAgcmV0dXJuIG1lc3NhZ2UKKyAgY2xzLkZyb21TdHJpbmcgPSBzdGF0aWNtZXRob2QoRnJvbVN0cmluZykKKworCitkZWYgX0lzUHJlc2VudChpdGVtKToKKyAgIiIiR2l2ZW4gYSAoRmllbGREZXNjcmlwdG9yLCB2YWx1ZSkgdHVwbGUgZnJvbSBfZmllbGRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUKKyAgdmFsdWUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IHJldHVybmVkIGJ5IExpc3RGaWVsZHMoKS4iIiIKKworICBpZiBpdGVtWzBdLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgcmV0dXJuIGJvb2woaXRlbVsxXSkKKyAgZWxpZiBpdGVtWzBdLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgorICAgIHJldHVybiBpdGVtWzFdLl9pc19wcmVzZW50X2luX3BhcmVudAorICBlbHNlOgorICAgIHJldHVybiBUcnVlCisKKworZGVmIF9BZGRMaXN0RmllbGRzTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKKworICBkZWYgTGlzdEZpZWxkcyhzZWxmKToKKyAgICBhbGxfZmllbGRzID0gW2l0ZW0gZm9yIGl0ZW0gaW4gc2VsZi5fZmllbGRzLml0ZW1zKCkgaWYgX0lzUHJlc2VudChpdGVtKV0KKyAgICBhbGxfZmllbGRzLnNvcnQoa2V5ID0gbGFtYmRhIGl0ZW06IGl0ZW1bMF0ubnVtYmVyKQorICAgIHJldHVybiBhbGxfZmllbGRzCisKKyAgY2xzLkxpc3RGaWVsZHMgPSBMaXN0RmllbGRzCisKK19QUk9UTzNfRVJST1JfVEVNUExBVEUgPSBcCisgICgnUHJvdG9jb2wgbWVzc2FnZSAlcyBoYXMgbm8gbm9uLXJlcGVhdGVkIHN1Ym1lc3NhZ2UgZmllbGQgIiVzIiAnCisgICAnbm9yIG1hcmtlZCBhcyBvcHRpb25hbCcpCitfUFJPVE8yX0VSUk9SX1RFTVBMQVRFID0gJ1Byb3RvY29sIG1lc3NhZ2UgJXMgaGFzIG5vIG5vbi1yZXBlYXRlZCBmaWVsZCAiJXMiJworCitkZWYgX0FkZEhhc0ZpZWxkTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKKworICBpc19wcm90bzMgPSAobWVzc2FnZV9kZXNjcmlwdG9yLnN5bnRheCA9PSAicHJvdG8zIikKKyAgZXJyb3JfbXNnID0gX1BST1RPM19FUlJPUl9URU1QTEFURSBpZiBpc19wcm90bzMgZWxzZSBfUFJPVE8yX0VSUk9SX1RFTVBMQVRFCisKKyAgaGFzc2FibGVfZmllbGRzID0ge30KKyAgZm9yIGZpZWxkIGluIG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHM6CisgICAgaWYgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgIGNvbnRpbnVlCisgICAgIyBGb3IgcHJvdG8zLCBvbmx5IHN1Ym1lc3NhZ2VzIGFuZCBmaWVsZHMgaW5zaWRlIGEgb25lb2YgaGF2ZSBwcmVzZW5jZS4KKyAgICBpZiAoaXNfcHJvdG8zIGFuZCBmaWVsZC5jcHBfdHlwZSAhPSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRSBhbmQKKyAgICAgICAgbm90IGZpZWxkLmNvbnRhaW5pbmdfb25lb2YpOgorICAgICAgY29udGludWUKKyAgICBoYXNzYWJsZV9maWVsZHNbZmllbGQubmFtZV0gPSBmaWVsZAorCisgICMgSGFzIG1ldGhvZHMgYXJlIHN1cHBvcnRlZCBmb3Igb25lb2YgZGVzY3JpcHRvcnMuCisgIGZvciBvbmVvZiBpbiBtZXNzYWdlX2Rlc2NyaXB0b3Iub25lb2ZzOgorICAgIGhhc3NhYmxlX2ZpZWxkc1tvbmVvZi5uYW1lXSA9IG9uZW9mCisKKyAgZGVmIEhhc0ZpZWxkKHNlbGYsIGZpZWxkX25hbWUpOgorICAgIHRyeToKKyAgICAgIGZpZWxkID0gaGFzc2FibGVfZmllbGRzW2ZpZWxkX25hbWVdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJvcl9tc2cgJSAobWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSwgZmllbGRfbmFtZSkpCisKKyAgICBpZiBpc2luc3RhbmNlKGZpZWxkLCBkZXNjcmlwdG9yX21vZC5PbmVvZkRlc2NyaXB0b3IpOgorICAgICAgdHJ5OgorICAgICAgICByZXR1cm4gSGFzRmllbGQoc2VsZiwgc2VsZi5fb25lb2ZzW2ZpZWxkXS5uYW1lKQorICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBlbHNlOgorICAgICAgaWYgZmllbGQuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgICAgIHZhbHVlID0gc2VsZi5fZmllbGRzLmdldChmaWVsZCkKKyAgICAgICAgcmV0dXJuIHZhbHVlIGlzIG5vdCBOb25lIGFuZCB2YWx1ZS5faXNfcHJlc2VudF9pbl9wYXJlbnQKKyAgICAgIGVsc2U6CisgICAgICAgIHJldHVybiBmaWVsZCBpbiBzZWxmLl9maWVsZHMKKworICBjbHMuSGFzRmllbGQgPSBIYXNGaWVsZAorCisKK2RlZiBfQWRkQ2xlYXJGaWVsZE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisgIGRlZiBDbGVhckZpZWxkKHNlbGYsIGZpZWxkX25hbWUpOgorICAgIHRyeToKKyAgICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lW2ZpZWxkX25hbWVdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgdHJ5OgorICAgICAgICBmaWVsZCA9IG1lc3NhZ2VfZGVzY3JpcHRvci5vbmVvZnNfYnlfbmFtZVtmaWVsZF9uYW1lXQorICAgICAgICBpZiBmaWVsZCBpbiBzZWxmLl9vbmVvZnM6CisgICAgICAgICAgZmllbGQgPSBzZWxmLl9vbmVvZnNbZmllbGRdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgcmV0dXJuCisgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Byb3RvY29sIG1lc3NhZ2UgJXMgaGFzIG5vICIlcyIgZmllbGQuJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lLCBmaWVsZF9uYW1lKSkKKworICAgIGlmIGZpZWxkIGluIHNlbGYuX2ZpZWxkczoKKyAgICAgICMgVG8gbWF0Y2ggdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwgd2UgbmVlZCB0byBpbnZhbGlkYXRlIGl0ZXJhdG9ycworICAgICAgIyBmb3IgbWFwIGZpZWxkcyB3aGVuIENsZWFyRmllbGQoKSBoYXBwZW5zLgorICAgICAgaWYgaGFzYXR0cihzZWxmLl9maWVsZHNbZmllbGRdLCAnSW52YWxpZGF0ZUl0ZXJhdG9ycycpOgorICAgICAgICBzZWxmLl9maWVsZHNbZmllbGRdLkludmFsaWRhdGVJdGVyYXRvcnMoKQorCisgICAgICAjIE5vdGU6ICBJZiB0aGUgZmllbGQgaXMgYSBzdWItbWVzc2FnZSwgaXRzIGxpc3RlbmVyIHdpbGwgc3RpbGwgcG9pbnQKKyAgICAgICMgICBhdCB1cy4gIFRoYXQncyBmaW5lLCBiZWNhdXNlIHRoZSB3b3JzdCB0aGFuIGNhbiBoYXBwZW4gaXMgdGhhdCBpdAorICAgICAgIyAgIHdpbGwgY2FsbCBfTW9kaWZpZWQoKSBhbmQgaW52YWxpZGF0ZSBvdXIgYnl0ZSBzaXplLiAgQmlnIGRlYWwuCisgICAgICBkZWwgc2VsZi5fZmllbGRzW2ZpZWxkXQorCisgICAgICBpZiBzZWxmLl9vbmVvZnMuZ2V0KGZpZWxkLmNvbnRhaW5pbmdfb25lb2YsIE5vbmUpIGlzIGZpZWxkOgorICAgICAgICBkZWwgc2VsZi5fb25lb2ZzW2ZpZWxkLmNvbnRhaW5pbmdfb25lb2ZdCisKKyAgICAjIEFsd2F5cyBjYWxsIF9Nb2RpZmllZCgpIC0tIGV2ZW4gaWYgbm90aGluZyB3YXMgY2hhbmdlZCwgdGhpcyBpcworICAgICMgYSBtdXRhdGluZyBtZXRob2QsIGFuZCB0aHVzIGNhbGxpbmcgaXQgc2hvdWxkIGNhdXNlIHRoZSBmaWVsZCB0byBiZWNvbWUKKyAgICAjIHByZXNlbnQgaW4gdGhlIHBhcmVudCBtZXNzYWdlLgorICAgIHNlbGYuX01vZGlmaWVkKCkKKworICBjbHMuQ2xlYXJGaWVsZCA9IENsZWFyRmllbGQKKworCitkZWYgX0FkZENsZWFyRXh0ZW5zaW9uTWV0aG9kKGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisgIGRlZiBDbGVhckV4dGVuc2lvbihzZWxmLCBleHRlbnNpb25faGFuZGxlKToKKyAgICBleHRlbnNpb25fZGljdC5fVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKHNlbGYsIGV4dGVuc2lvbl9oYW5kbGUpCisKKyAgICAjIFNpbWlsYXIgdG8gQ2xlYXJGaWVsZCgpLCBhYm92ZS4KKyAgICBpZiBleHRlbnNpb25faGFuZGxlIGluIHNlbGYuX2ZpZWxkczoKKyAgICAgIGRlbCBzZWxmLl9maWVsZHNbZXh0ZW5zaW9uX2hhbmRsZV0KKyAgICBzZWxmLl9Nb2RpZmllZCgpCisgIGNscy5DbGVhckV4dGVuc2lvbiA9IENsZWFyRXh0ZW5zaW9uCisKKworZGVmIF9BZGRIYXNFeHRlbnNpb25NZXRob2QoY2xzKToKKyAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKKyAgZGVmIEhhc0V4dGVuc2lvbihzZWxmLCBleHRlbnNpb25faGFuZGxlKToKKyAgICBleHRlbnNpb25fZGljdC5fVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKHNlbGYsIGV4dGVuc2lvbl9oYW5kbGUpCisgICAgaWYgZXh0ZW5zaW9uX2hhbmRsZS5sYWJlbCA9PSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgorICAgICAgcmFpc2UgS2V5RXJyb3IoJyIlcyIgaXMgcmVwZWF0ZWQuJyAlIGV4dGVuc2lvbl9oYW5kbGUuZnVsbF9uYW1lKQorCisgICAgaWYgZXh0ZW5zaW9uX2hhbmRsZS5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHZhbHVlID0gc2VsZi5fZmllbGRzLmdldChleHRlbnNpb25faGFuZGxlKQorICAgICAgcmV0dXJuIHZhbHVlIGlzIG5vdCBOb25lIGFuZCB2YWx1ZS5faXNfcHJlc2VudF9pbl9wYXJlbnQKKyAgICBlbHNlOgorICAgICAgcmV0dXJuIGV4dGVuc2lvbl9oYW5kbGUgaW4gc2VsZi5fZmllbGRzCisgIGNscy5IYXNFeHRlbnNpb24gPSBIYXNFeHRlbnNpb24KKworZGVmIF9JbnRlcm5hbFVucGFja0FueShtc2cpOgorICAiIiJVbnBhY2tzIEFueSBtZXNzYWdlIGFuZCByZXR1cm5zIHRoZSB1bnBhY2tlZCBtZXNzYWdlLgorCisgIFRoaXMgaW50ZXJuYWwgbWV0aG9kIGlzIGRpZmZlcmVudCBmcm9tIHB1YmxpYyBBbnkgVW5wYWNrIG1ldGhvZCB3aGljaCB0YWtlcworICB0aGUgdGFyZ2V0IG1lc3NhZ2UgYXMgYXJndW1lbnQuIF9JbnRlcm5hbFVucGFja0FueSBtZXRob2QgZG9lcyBub3QgaGF2ZQorICB0YXJnZXQgbWVzc2FnZSB0eXBlIGFuZCBuZWVkIHRvIGZpbmQgdGhlIG1lc3NhZ2UgdHlwZSBpbiBkZXNjcmlwdG9yIHBvb2wuCisKKyAgQXJnczoKKyAgICBtc2c6IEFuIEFueSBtZXNzYWdlIHRvIGJlIHVucGFja2VkLgorCisgIFJldHVybnM6CisgICAgVGhlIHVucGFja2VkIG1lc3NhZ2UuCisgICIiIgorICAjIFRPRE8oYW1hdXJ5ZmEpOiBEb24ndCB1c2UgdGhlIGZhY3Rvcnkgb2YgZ2VuZXJhdGVkIG1lc3NhZ2VzLgorICAjIFRvIG1ha2UgQW55IHdvcmsgd2l0aCBjdXN0b20gZmFjdG9yaWVzLCB1c2UgdGhlIG1lc3NhZ2UgZmFjdG9yeSBvZiB0aGUKKyAgIyBwYXJlbnQgbWVzc2FnZS4KKyAgIyBweWxpbnQ6IGRpc2FibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAorICBmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc3ltYm9sX2RhdGFiYXNlCisgIGZhY3RvcnkgPSBzeW1ib2xfZGF0YWJhc2UuRGVmYXVsdCgpCisKKyAgdHlwZV91cmwgPSBtc2cudHlwZV91cmwKKworICBpZiBub3QgdHlwZV91cmw6CisgICAgcmV0dXJuIE5vbmUKKworICAjIFRPRE8oaGFiZXJtYW4pOiBGb3Igbm93IHdlIGp1c3Qgc3RyaXAgdGhlIGhvc3RuYW1lLiAgQmV0dGVyIGxvZ2ljIHdpbGwgYmUKKyAgIyByZXF1aXJlZC4KKyAgdHlwZV9uYW1lID0gdHlwZV91cmwuc3BsaXQoJy8nKVstMV0KKyAgZGVzY3JpcHRvciA9IGZhY3RvcnkucG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUodHlwZV9uYW1lKQorCisgIGlmIGRlc2NyaXB0b3IgaXMgTm9uZToKKyAgICByZXR1cm4gTm9uZQorCisgIG1lc3NhZ2VfY2xhc3MgPSBmYWN0b3J5LkdldFByb3RvdHlwZShkZXNjcmlwdG9yKQorICBtZXNzYWdlID0gbWVzc2FnZV9jbGFzcygpCisKKyAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobXNnLnZhbHVlKQorICByZXR1cm4gbWVzc2FnZQorCisKK2RlZiBfQWRkRXF1YWxzTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKKyAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgaWYgKG5vdCBpc2luc3RhbmNlKG90aGVyLCBtZXNzYWdlX21vZC5NZXNzYWdlKSBvcgorICAgICAgICBvdGhlci5ERVNDUklQVE9SICE9IHNlbGYuREVTQ1JJUFRPUik6CisgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIHNlbGYgaXMgb3RoZXI6CisgICAgICByZXR1cm4gVHJ1ZQorCisgICAgaWYgc2VsZi5ERVNDUklQVE9SLmZ1bGxfbmFtZSA9PSBfQW55RnVsbFR5cGVOYW1lOgorICAgICAgYW55X2EgPSBfSW50ZXJuYWxVbnBhY2tBbnkoc2VsZikKKyAgICAgIGFueV9iID0gX0ludGVybmFsVW5wYWNrQW55KG90aGVyKQorICAgICAgaWYgYW55X2EgYW5kIGFueV9iOgorICAgICAgICByZXR1cm4gYW55X2EgPT0gYW55X2IKKworICAgIGlmIG5vdCBzZWxmLkxpc3RGaWVsZHMoKSA9PSBvdGhlci5MaXN0RmllbGRzKCk6CisgICAgICByZXR1cm4gRmFsc2UKKworICAgICMgVE9ETyhqaWVsdW8pOiBGaXggVW5rbm93bkZpZWxkU2V0IHRvIGNvbnNpZGVyIE1lc3NhZ2VTZXQgZXh0ZW5zaW9ucywKKyAgICAjIHRoZW4gdXNlIGl0IGZvciB0aGUgY29tcGFyaXNvbi4KKyAgICB1bmtub3duX2ZpZWxkcyA9IGxpc3Qoc2VsZi5fdW5rbm93bl9maWVsZHMpCisgICAgdW5rbm93bl9maWVsZHMuc29ydCgpCisgICAgb3RoZXJfdW5rbm93bl9maWVsZHMgPSBsaXN0KG90aGVyLl91bmtub3duX2ZpZWxkcykKKyAgICBvdGhlcl91bmtub3duX2ZpZWxkcy5zb3J0KCkKKyAgICByZXR1cm4gdW5rbm93bl9maWVsZHMgPT0gb3RoZXJfdW5rbm93bl9maWVsZHMKKworICBjbHMuX19lcV9fID0gX19lcV9fCisKKworZGVmIF9BZGRTdHJNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICByZXR1cm4gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKHNlbGYpCisgIGNscy5fX3N0cl9fID0gX19zdHJfXworCisKK2RlZiBfQWRkUmVwck1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICByZXR1cm4gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKHNlbGYpCisgIGNscy5fX3JlcHJfXyA9IF9fcmVwcl9fCisKKworZGVmIF9BZGRVbmljb2RlTWV0aG9kKHVudXNlZF9tZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisKKyAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgIHJldHVybiB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoc2VsZiwgYXNfdXRmOD1UcnVlKS5kZWNvZGUoJ3V0Zi04JykKKyAgY2xzLl9fdW5pY29kZV9fID0gX191bmljb2RlX18KKworCitkZWYgX0J5dGVzRm9yTm9uUmVwZWF0ZWRFbGVtZW50KHZhbHVlLCBmaWVsZF9udW1iZXIsIGZpZWxkX3R5cGUpOgorICAiIiJSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhIG5vbi1yZXBlYXRlZCBlbGVtZW50LgorICBUaGUgcmV0dXJuZWQgYnl0ZSBjb3VudCBpbmNsdWRlcyBzcGFjZSBmb3IgdGFnIGluZm9ybWF0aW9uIGFuZCBhbnkKKyAgb3RoZXIgYWRkaXRpb25hbCBzcGFjZSBhc3NvY2lhdGVkIHdpdGggc2VyaWFsaXppbmcgdmFsdWUuCisKKyAgQXJnczoKKyAgICB2YWx1ZTogVmFsdWUgd2UncmUgc2VyaWFsaXppbmcuCisgICAgZmllbGRfbnVtYmVyOiBGaWVsZCBudW1iZXIgb2YgdGhpcyB2YWx1ZS4gIChTaW5jZSB0aGUgZmllbGQgbnVtYmVyCisgICAgICBpcyBzdG9yZWQgYXMgcGFydCBvZiBhIHZhcmludC1lbmNvZGVkIHRhZywgdGhpcyBoYXMgYW4gaW1wYWN0CisgICAgICBvbiB0aGUgdG90YWwgYnl0ZXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIHRoZSB2YWx1ZSkuCisgICAgZmllbGRfdHlwZTogVGhlIHR5cGUgb2YgdGhlIGZpZWxkLiAgT25lIG9mIHRoZSBUWVBFXyogY29uc3RhbnRzCisgICAgICB3aXRoaW4gRmllbGREZXNjcmlwdG9yLgorICAiIiIKKyAgdHJ5OgorICAgIGZuID0gdHlwZV9jaGVja2Vycy5UWVBFX1RPX0JZVEVfU0laRV9GTltmaWVsZF90eXBlXQorICAgIHJldHVybiBmbihmaWVsZF9udW1iZXIsIHZhbHVlKQorICBleGNlcHQgS2V5RXJyb3I6CisgICAgcmFpc2UgbWVzc2FnZV9tb2QuRW5jb2RlRXJyb3IoJ1VucmVjb2duaXplZCBmaWVsZCB0eXBlOiAlZCcgJSBmaWVsZF90eXBlKQorCisKK2RlZiBfQWRkQnl0ZVNpemVNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorCisgIGRlZiBCeXRlU2l6ZShzZWxmKToKKyAgICBpZiBub3Qgc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eToKKyAgICAgIHJldHVybiBzZWxmLl9jYWNoZWRfYnl0ZV9zaXplCisKKyAgICBzaXplID0gMAorICAgIGRlc2NyaXB0b3IgPSBzZWxmLkRFU0NSSVBUT1IKKyAgICBpZiBkZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5tYXBfZW50cnk6CisgICAgICAjIEZpZWxkcyBvZiBtYXAgZW50cnkgc2hvdWxkIGFsd2F5cyBiZSBzZXJpYWxpemVkLgorICAgICAgc2l6ZSA9IGRlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbJ2tleSddLl9zaXplcihzZWxmLmtleSkKKyAgICAgIHNpemUgKz0gZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZVsndmFsdWUnXS5fc2l6ZXIoc2VsZi52YWx1ZSkKKyAgICBlbHNlOgorICAgICAgZm9yIGZpZWxkX2Rlc2NyaXB0b3IsIGZpZWxkX3ZhbHVlIGluIHNlbGYuTGlzdEZpZWxkcygpOgorICAgICAgICBzaXplICs9IGZpZWxkX2Rlc2NyaXB0b3IuX3NpemVyKGZpZWxkX3ZhbHVlKQorICAgICAgZm9yIHRhZ19ieXRlcywgdmFsdWVfYnl0ZXMgaW4gc2VsZi5fdW5rbm93bl9maWVsZHM6CisgICAgICAgIHNpemUgKz0gbGVuKHRhZ19ieXRlcykgKyBsZW4odmFsdWVfYnl0ZXMpCisKKyAgICBzZWxmLl9jYWNoZWRfYnl0ZV9zaXplID0gc2l6ZQorICAgIHNlbGYuX2NhY2hlZF9ieXRlX3NpemVfZGlydHkgPSBGYWxzZQorICAgIHNlbGYuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbi5kaXJ0eSA9IEZhbHNlCisgICAgcmV0dXJuIHNpemUKKworICBjbHMuQnl0ZVNpemUgPSBCeXRlU2l6ZQorCisKK2RlZiBfQWRkU2VyaWFsaXplVG9TdHJpbmdNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorCisgIGRlZiBTZXJpYWxpemVUb1N0cmluZyhzZWxmLCAqKmt3YXJncyk6CisgICAgIyBDaGVjayBpZiB0aGUgbWVzc2FnZSBoYXMgYWxsIG9mIGl0cyByZXF1aXJlZCBmaWVsZHMgc2V0LgorICAgIGlmIG5vdCBzZWxmLklzSW5pdGlhbGl6ZWQoKToKKyAgICAgIHJhaXNlIG1lc3NhZ2VfbW9kLkVuY29kZUVycm9yKAorICAgICAgICAgICdNZXNzYWdlICVzIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAlcycgJSAoCisgICAgICAgICAgc2VsZi5ERVNDUklQVE9SLmZ1bGxfbmFtZSwgJywnLmpvaW4oc2VsZi5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSkpKQorICAgIHJldHVybiBzZWxmLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygqKmt3YXJncykKKyAgY2xzLlNlcmlhbGl6ZVRvU3RyaW5nID0gU2VyaWFsaXplVG9TdHJpbmcKKworCitkZWYgX0FkZFNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZ01ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisKKyAgZGVmIFNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZyhzZWxmLCAqKmt3YXJncyk6CisgICAgb3V0ID0gQnl0ZXNJTygpCisgICAgc2VsZi5fSW50ZXJuYWxTZXJpYWxpemUob3V0LndyaXRlLCAqKmt3YXJncykKKyAgICByZXR1cm4gb3V0LmdldHZhbHVlKCkKKyAgY2xzLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZyA9IFNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZworCisgIGRlZiBJbnRlcm5hbFNlcmlhbGl6ZShzZWxmLCB3cml0ZV9ieXRlcywgZGV0ZXJtaW5pc3RpYz1Ob25lKToKKyAgICBpZiBkZXRlcm1pbmlzdGljIGlzIE5vbmU6CisgICAgICBkZXRlcm1pbmlzdGljID0gKAorICAgICAgICAgIGFwaV9pbXBsZW1lbnRhdGlvbi5Jc1B5dGhvbkRlZmF1bHRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYygpKQorICAgIGVsc2U6CisgICAgICBkZXRlcm1pbmlzdGljID0gYm9vbChkZXRlcm1pbmlzdGljKQorCisgICAgZGVzY3JpcHRvciA9IHNlbGYuREVTQ1JJUFRPUgorICAgIGlmIGRlc2NyaXB0b3IuR2V0T3B0aW9ucygpLm1hcF9lbnRyeToKKyAgICAgICMgRmllbGRzIG9mIG1hcCBlbnRyeSBzaG91bGQgYWx3YXlzIGJlIHNlcmlhbGl6ZWQuCisgICAgICBkZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lWydrZXknXS5fZW5jb2RlcigKKyAgICAgICAgICB3cml0ZV9ieXRlcywgc2VsZi5rZXksIGRldGVybWluaXN0aWMpCisgICAgICBkZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddLl9lbmNvZGVyKAorICAgICAgICAgIHdyaXRlX2J5dGVzLCBzZWxmLnZhbHVlLCBkZXRlcm1pbmlzdGljKQorICAgIGVsc2U6CisgICAgICBmb3IgZmllbGRfZGVzY3JpcHRvciwgZmllbGRfdmFsdWUgaW4gc2VsZi5MaXN0RmllbGRzKCk6CisgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IuX2VuY29kZXIod3JpdGVfYnl0ZXMsIGZpZWxkX3ZhbHVlLCBkZXRlcm1pbmlzdGljKQorICAgICAgZm9yIHRhZ19ieXRlcywgdmFsdWVfYnl0ZXMgaW4gc2VsZi5fdW5rbm93bl9maWVsZHM6CisgICAgICAgIHdyaXRlX2J5dGVzKHRhZ19ieXRlcykKKyAgICAgICAgd3JpdGVfYnl0ZXModmFsdWVfYnl0ZXMpCisgIGNscy5fSW50ZXJuYWxTZXJpYWxpemUgPSBJbnRlcm5hbFNlcmlhbGl6ZQorCisKK2RlZiBfQWRkTWVyZ2VGcm9tU3RyaW5nTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKKyAgZGVmIE1lcmdlRnJvbVN0cmluZyhzZWxmLCBzZXJpYWxpemVkKToKKyAgICBzZXJpYWxpemVkID0gbWVtb3J5dmlldyhzZXJpYWxpemVkKQorICAgIGxlbmd0aCA9IGxlbihzZXJpYWxpemVkKQorICAgIHRyeToKKyAgICAgIGlmIHNlbGYuX0ludGVybmFsUGFyc2Uoc2VyaWFsaXplZCwgMCwgbGVuZ3RoKSAhPSBsZW5ndGg6CisgICAgICAgICMgVGhlIG9ubHkgcmVhc29uIF9JbnRlcm5hbFBhcnNlIHdvdWxkIHJldHVybiBlYXJseSBpcyBpZiBpdAorICAgICAgICAjIGVuY291bnRlcmVkIGFuIGVuZC1ncm91cCB0YWcuCisgICAgICAgIHJhaXNlIG1lc3NhZ2VfbW9kLkRlY29kZUVycm9yKCdVbmV4cGVjdGVkIGVuZC1ncm91cCB0YWcuJykKKyAgICBleGNlcHQgKEluZGV4RXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAjIE5vdyBvcmQoYnVmW3A6cCsxXSkgPT0gb3JkKCcnKSBnZXRzIFR5cGVFcnJvci4KKyAgICAgIHJhaXNlIG1lc3NhZ2VfbW9kLkRlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQorICAgIGV4Y2VwdCBzdHJ1Y3QuZXJyb3IgYXMgZToKKyAgICAgIHJhaXNlIG1lc3NhZ2VfbW9kLkRlY29kZUVycm9yKGUpCisgICAgcmV0dXJuIGxlbmd0aCAgICMgUmV0dXJuIHRoaXMgZm9yIGxlZ2FjeSByZWFzb25zLgorICBjbHMuTWVyZ2VGcm9tU3RyaW5nID0gTWVyZ2VGcm9tU3RyaW5nCisKKyAgbG9jYWxfUmVhZFRhZyA9IGRlY29kZXIuUmVhZFRhZworICBsb2NhbF9Ta2lwRmllbGQgPSBkZWNvZGVyLlNraXBGaWVsZAorICBkZWNvZGVyc19ieV90YWcgPSBjbHMuX2RlY29kZXJzX2J5X3RhZworCisgIGRlZiBJbnRlcm5hbFBhcnNlKHNlbGYsIGJ1ZmZlciwgcG9zLCBlbmQpOgorICAgICIiIkNyZWF0ZSBhIG1lc3NhZ2UgZnJvbSBzZXJpYWxpemVkIGJ5dGVzLgorCisgICAgQXJnczoKKyAgICAgIHNlbGY6IE1lc3NhZ2UsIGluc3RhbmNlIG9mIHRoZSBwcm90byBtZXNzYWdlIG9iamVjdC4KKyAgICAgIGJ1ZmZlcjogbWVtb3J5dmlldyBvZiB0aGUgc2VyaWFsaXplZCBkYXRhLgorICAgICAgcG9zOiBpbnQsIHBvc2l0aW9uIHRvIHN0YXJ0IGluIHRoZSBzZXJpYWxpemVkIGRhdGEuCisgICAgICBlbmQ6IGludCwgZW5kIHBvc2l0aW9uIG9mIHRoZSBzZXJpYWxpemVkIGRhdGEuCisKKyAgICBSZXR1cm5zOgorICAgICAgTWVzc2FnZSBvYmplY3QuCisgICAgIiIiCisgICAgIyBHdWFyZCBhZ2FpbnN0IGludGVybmFsIG1pc3VzZSwgc2luY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW50ZXJuYWxseQorICAgICMgcXVpdGUgZXh0ZW5zaXZlbHksIGFuZCBpdHMgZWFzeSB0byBhY2NpZGVudGFsbHkgcGFzcyBieXRlcy4KKyAgICBhc3NlcnQgaXNpbnN0YW5jZShidWZmZXIsIG1lbW9yeXZpZXcpCisgICAgc2VsZi5fTW9kaWZpZWQoKQorICAgIGZpZWxkX2RpY3QgPSBzZWxmLl9maWVsZHMKKyAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgdW5rbm93bl9maWVsZF9zZXQgPSBzZWxmLl91bmtub3duX2ZpZWxkX3NldAorICAgIHdoaWxlIHBvcyAhPSBlbmQ6CisgICAgICAodGFnX2J5dGVzLCBuZXdfcG9zKSA9IGxvY2FsX1JlYWRUYWcoYnVmZmVyLCBwb3MpCisgICAgICBmaWVsZF9kZWNvZGVyLCBmaWVsZF9kZXNjID0gZGVjb2RlcnNfYnlfdGFnLmdldCh0YWdfYnl0ZXMsIChOb25lLCBOb25lKSkKKyAgICAgIGlmIGZpZWxkX2RlY29kZXIgaXMgTm9uZToKKyAgICAgICAgaWYgbm90IHNlbGYuX3Vua25vd25fZmllbGRzOiAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgICBzZWxmLl91bmtub3duX2ZpZWxkcyA9IFtdICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgaWYgdW5rbm93bl9maWVsZF9zZXQgaXMgTm9uZToKKyAgICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgICAgc2VsZi5fdW5rbm93bl9maWVsZF9zZXQgPSBjb250YWluZXJzLlVua25vd25GaWVsZFNldCgpCisgICAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgICAgIHVua25vd25fZmllbGRfc2V0ID0gc2VsZi5fdW5rbm93bl9maWVsZF9zZXQKKyAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgICAodGFnLCBfKSA9IGRlY29kZXIuX0RlY29kZVZhcmludCh0YWdfYnl0ZXMsIDApCisgICAgICAgIGZpZWxkX251bWJlciwgd2lyZV90eXBlID0gd2lyZV9mb3JtYXQuVW5wYWNrVGFnKHRhZykKKyAgICAgICAgaWYgZmllbGRfbnVtYmVyID09IDA6CisgICAgICAgICAgcmFpc2UgbWVzc2FnZV9tb2QuRGVjb2RlRXJyb3IoJ0ZpZWxkIG51bWJlciAwIGlzIGlsbGVnYWwuJykKKyAgICAgICAgIyBUT0RPKGppZWx1byk6IHJlbW92ZSBvbGRfcG9zLgorICAgICAgICBvbGRfcG9zID0gbmV3X3BvcworICAgICAgICAoZGF0YSwgbmV3X3BvcykgPSBkZWNvZGVyLl9EZWNvZGVVbmtub3duRmllbGQoCisgICAgICAgICAgICBidWZmZXIsIG5ld19wb3MsIHdpcmVfdHlwZSkgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgaWYgbmV3X3BvcyA9PSAtMToKKyAgICAgICAgICByZXR1cm4gcG9zCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgdW5rbm93bl9maWVsZF9zZXQuX2FkZChmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSwgZGF0YSkKKyAgICAgICAgIyBUT0RPKGppZWx1byk6IHJlbW92ZSBfdW5rbm93bl9maWVsZHMuCisgICAgICAgIG5ld19wb3MgPSBsb2NhbF9Ta2lwRmllbGQoYnVmZmVyLCBvbGRfcG9zLCBlbmQsIHRhZ19ieXRlcykKKyAgICAgICAgaWYgbmV3X3BvcyA9PSAtMToKKyAgICAgICAgICByZXR1cm4gcG9zCisgICAgICAgIHNlbGYuX3Vua25vd25fZmllbGRzLmFwcGVuZCgKKyAgICAgICAgICAgICh0YWdfYnl0ZXMsIGJ1ZmZlcltvbGRfcG9zOm5ld19wb3NdLnRvYnl0ZXMoKSkpCisgICAgICAgIHBvcyA9IG5ld19wb3MKKyAgICAgIGVsc2U6CisgICAgICAgIHBvcyA9IGZpZWxkX2RlY29kZXIoYnVmZmVyLCBuZXdfcG9zLCBlbmQsIHNlbGYsIGZpZWxkX2RpY3QpCisgICAgICAgIGlmIGZpZWxkX2Rlc2M6CisgICAgICAgICAgc2VsZi5fVXBkYXRlT25lb2ZTdGF0ZShmaWVsZF9kZXNjKQorICAgIHJldHVybiBwb3MKKyAgY2xzLl9JbnRlcm5hbFBhcnNlID0gSW50ZXJuYWxQYXJzZQorCisKK2RlZiBfQWRkSXNJbml0aWFsaXplZE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkFkZHMgdGhlIElzSW5pdGlhbGl6ZWQgYW5kIEZpbmRJbml0aWFsaXphdGlvbkVycm9yIG1ldGhvZHMgdG8gdGhlCisgIHByb3RvY29sIG1lc3NhZ2UgY2xhc3MuIiIiCisKKyAgcmVxdWlyZWRfZmllbGRzID0gW2ZpZWxkIGZvciBmaWVsZCBpbiBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmaWVsZC5sYWJlbCA9PSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUVVJUkVEXQorCisgIGRlZiBJc0luaXRpYWxpemVkKHNlbGYsIGVycm9ycz1Ob25lKToKKyAgICAiIiJDaGVja3MgaWYgYWxsIHJlcXVpcmVkIGZpZWxkcyBvZiBhIG1lc3NhZ2UgYXJlIHNldC4KKworICAgIEFyZ3M6CisgICAgICBlcnJvcnM6ICBBIGxpc3Qgd2hpY2gsIGlmIHByb3ZpZGVkLCB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBmaWVsZAorICAgICAgICAgICAgICAgcGF0aHMgb2YgYWxsIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRydWUgaWZmIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBoYXMgYWxsIHJlcXVpcmVkIGZpZWxkcyBzZXQuCisgICAgIiIiCisKKyAgICAjIFBlcmZvcm1hbmNlIGlzIGNyaXRpY2FsIHNvIHdlIGF2b2lkIEhhc0ZpZWxkKCkgYW5kIExpc3RGaWVsZHMoKS4KKworICAgIGZvciBmaWVsZCBpbiByZXF1aXJlZF9maWVsZHM6CisgICAgICBpZiAoZmllbGQgbm90IGluIHNlbGYuX2ZpZWxkcyBvcgorICAgICAgICAgIChmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRSBhbmQKKyAgICAgICAgICAgbm90IHNlbGYuX2ZpZWxkc1tmaWVsZF0uX2lzX3ByZXNlbnRfaW5fcGFyZW50KSk6CisgICAgICAgIGlmIGVycm9ycyBpcyBub3QgTm9uZToKKyAgICAgICAgICBlcnJvcnMuZXh0ZW5kKHNlbGYuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBsaXN0KHNlbGYuX2ZpZWxkcy5pdGVtcygpKTogICMgZGljdCBjYW4gY2hhbmdlIHNpemUhCisgICAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgaWYgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgICAgICBpZiAoZmllbGQubWVzc2FnZV90eXBlLmhhc19vcHRpb25zIGFuZAorICAgICAgICAgICAgICBmaWVsZC5tZXNzYWdlX3R5cGUuR2V0T3B0aW9ucygpLm1hcF9lbnRyeSk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgICAgaWYgbm90IGVsZW1lbnQuSXNJbml0aWFsaXplZCgpOgorICAgICAgICAgICAgICBpZiBlcnJvcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZXJyb3JzLmV4dGVuZChzZWxmLkZpbmRJbml0aWFsaXphdGlvbkVycm9ycygpKQorICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZWxpZiB2YWx1ZS5faXNfcHJlc2VudF9pbl9wYXJlbnQgYW5kIG5vdCB2YWx1ZS5Jc0luaXRpYWxpemVkKCk6CisgICAgICAgICAgaWYgZXJyb3JzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZXJyb3JzLmV4dGVuZChzZWxmLkZpbmRJbml0aWFsaXphdGlvbkVycm9ycygpKQorICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgcmV0dXJuIFRydWUKKworICBjbHMuSXNJbml0aWFsaXplZCA9IElzSW5pdGlhbGl6ZWQKKworICBkZWYgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKHNlbGYpOgorICAgICIiIkZpbmRzIHJlcXVpcmVkIGZpZWxkcyB3aGljaCBhcmUgbm90IGluaXRpYWxpemVkLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgbGlzdCBvZiBzdHJpbmdzLiAgRWFjaCBzdHJpbmcgaXMgYSBwYXRoIHRvIGFuIHVuaW5pdGlhbGl6ZWQgZmllbGQgZnJvbQorICAgICAgdGhlIHRvcC1sZXZlbCBtZXNzYWdlLCBlLmcuICJmb28uYmFyWzVdLmJheiIuCisgICAgIiIiCisKKyAgICBlcnJvcnMgPSBbXSAgIyBzaW1wbGlmeSB0aGluZ3MKKworICAgIGZvciBmaWVsZCBpbiByZXF1aXJlZF9maWVsZHM6CisgICAgICBpZiBub3Qgc2VsZi5IYXNGaWVsZChmaWVsZC5uYW1lKToKKyAgICAgICAgZXJyb3JzLmFwcGVuZChmaWVsZC5uYW1lKQorCisgICAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBzZWxmLkxpc3RGaWVsZHMoKToKKyAgICAgIGlmIGZpZWxkLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBpZiBmaWVsZC5pc19leHRlbnNpb246CisgICAgICAgICAgbmFtZSA9ICcoJXMpJyAlIGZpZWxkLmZ1bGxfbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgIG5hbWUgPSBmaWVsZC5uYW1lCisKKyAgICAgICAgaWYgX0lzTWFwRmllbGQoZmllbGQpOgorICAgICAgICAgIGlmIF9Jc01lc3NhZ2VNYXBGaWVsZChmaWVsZCk6CisgICAgICAgICAgICBmb3Iga2V5IGluIHZhbHVlOgorICAgICAgICAgICAgICBlbGVtZW50ID0gdmFsdWVba2V5XQorICAgICAgICAgICAgICBwcmVmaXggPSAnJXNbJXNdLicgJSAobmFtZSwga2V5KQorICAgICAgICAgICAgICBzdWJfZXJyb3JzID0gZWxlbWVudC5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKQorICAgICAgICAgICAgICBlcnJvcnMgKz0gW3ByZWZpeCArIGVycm9yIGZvciBlcnJvciBpbiBzdWJfZXJyb3JzXQorICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFNjYWxhck1hcHMgY2FuJ3QgaGF2ZSBhbnkgaW5pdGlhbGl6YXRpb24gZXJyb3JzLgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbGlmIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHZhbHVlKSk6CisgICAgICAgICAgICBlbGVtZW50ID0gdmFsdWVbaV0KKyAgICAgICAgICAgIHByZWZpeCA9ICclc1slZF0uJyAlIChuYW1lLCBpKQorICAgICAgICAgICAgc3ViX2Vycm9ycyA9IGVsZW1lbnQuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkKKyAgICAgICAgICAgIGVycm9ycyArPSBbcHJlZml4ICsgZXJyb3IgZm9yIGVycm9yIGluIHN1Yl9lcnJvcnNdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgcHJlZml4ID0gbmFtZSArICcuJworICAgICAgICAgIHN1Yl9lcnJvcnMgPSB2YWx1ZS5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKQorICAgICAgICAgIGVycm9ycyArPSBbcHJlZml4ICsgZXJyb3IgZm9yIGVycm9yIGluIHN1Yl9lcnJvcnNdCisKKyAgICByZXR1cm4gZXJyb3JzCisKKyAgY2xzLkZpbmRJbml0aWFsaXphdGlvbkVycm9ycyA9IEZpbmRJbml0aWFsaXphdGlvbkVycm9ycworCisKK2RlZiBfRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoa2xhc3MpOgorICBtb2R1bGUgPSBrbGFzcy5fX21vZHVsZV9fCisgIG5hbWUgPSBnZXRhdHRyKGtsYXNzLCAnX19xdWFsbmFtZV9fJywga2xhc3MuX19uYW1lX18pCisgIGlmIG1vZHVsZSBpbiAoTm9uZSwgJ2J1aWx0aW5zJywgJ19fYnVpbHRpbl9fJyk6CisgICAgcmV0dXJuIG5hbWUKKyAgcmV0dXJuIG1vZHVsZSArICcuJyArIG5hbWUKKworCitkZWYgX0FkZE1lcmdlRnJvbU1ldGhvZChjbHMpOgorICBMQUJFTF9SRVBFQVRFRCA9IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQKKyAgQ1BQVFlQRV9NRVNTQUdFID0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0UKKworICBkZWYgTWVyZ2VGcm9tKHNlbGYsIG1zZyk6CisgICAgaWYgbm90IGlzaW5zdGFuY2UobXNnLCBjbHMpOgorICAgICAgcmFpc2UgVHlwZUVycm9yKAorICAgICAgICAgICdQYXJhbWV0ZXIgdG8gTWVyZ2VGcm9tKCkgbXVzdCBiZSBpbnN0YW5jZSBvZiBzYW1lIGNsYXNzOiAnCisgICAgICAgICAgJ2V4cGVjdGVkICVzIGdvdCAlcy4nICUgKF9GdWxseVF1YWxpZmllZENsYXNzTmFtZShjbHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUobXNnLl9fY2xhc3NfXykpKQorCisgICAgYXNzZXJ0IG1zZyBpcyBub3Qgc2VsZgorICAgIHNlbGYuX01vZGlmaWVkKCkKKworICAgIGZpZWxkcyA9IHNlbGYuX2ZpZWxkcworCisgICAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBtc2cuX2ZpZWxkcy5pdGVtcygpOgorICAgICAgaWYgZmllbGQubGFiZWwgPT0gTEFCRUxfUkVQRUFURUQ6CisgICAgICAgIGZpZWxkX3ZhbHVlID0gZmllbGRzLmdldChmaWVsZCkKKyAgICAgICAgaWYgZmllbGRfdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAjIENvbnN0cnVjdCBhIG5ldyBvYmplY3QgdG8gcmVwcmVzZW50IHRoaXMgZmllbGQuCisgICAgICAgICAgZmllbGRfdmFsdWUgPSBmaWVsZC5fZGVmYXVsdF9jb25zdHJ1Y3RvcihzZWxmKQorICAgICAgICAgIGZpZWxkc1tmaWVsZF0gPSBmaWVsZF92YWx1ZQorICAgICAgICBmaWVsZF92YWx1ZS5NZXJnZUZyb20odmFsdWUpCisgICAgICBlbGlmIGZpZWxkLmNwcF90eXBlID09IENQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgaWYgdmFsdWUuX2lzX3ByZXNlbnRfaW5fcGFyZW50OgorICAgICAgICAgIGZpZWxkX3ZhbHVlID0gZmllbGRzLmdldChmaWVsZCkKKyAgICAgICAgICBpZiBmaWVsZF92YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgIyBDb25zdHJ1Y3QgYSBuZXcgb2JqZWN0IHRvIHJlcHJlc2VudCB0aGlzIGZpZWxkLgorICAgICAgICAgICAgZmllbGRfdmFsdWUgPSBmaWVsZC5fZGVmYXVsdF9jb25zdHJ1Y3RvcihzZWxmKQorICAgICAgICAgICAgZmllbGRzW2ZpZWxkXSA9IGZpZWxkX3ZhbHVlCisgICAgICAgICAgZmllbGRfdmFsdWUuTWVyZ2VGcm9tKHZhbHVlKQorICAgICAgZWxzZToKKyAgICAgICAgc2VsZi5fZmllbGRzW2ZpZWxkXSA9IHZhbHVlCisgICAgICAgIGlmIGZpZWxkLmNvbnRhaW5pbmdfb25lb2Y6CisgICAgICAgICAgc2VsZi5fVXBkYXRlT25lb2ZTdGF0ZShmaWVsZCkKKworICAgIGlmIG1zZy5fdW5rbm93bl9maWVsZHM6CisgICAgICBpZiBub3Qgc2VsZi5fdW5rbm93bl9maWVsZHM6CisgICAgICAgIHNlbGYuX3Vua25vd25fZmllbGRzID0gW10KKyAgICAgIHNlbGYuX3Vua25vd25fZmllbGRzLmV4dGVuZChtc2cuX3Vua25vd25fZmllbGRzKQorICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgaWYgc2VsZi5fdW5rbm93bl9maWVsZF9zZXQgaXMgTm9uZToKKyAgICAgICAgc2VsZi5fdW5rbm93bl9maWVsZF9zZXQgPSBjb250YWluZXJzLlVua25vd25GaWVsZFNldCgpCisgICAgICBzZWxmLl91bmtub3duX2ZpZWxkX3NldC5fZXh0ZW5kKG1zZy5fdW5rbm93bl9maWVsZF9zZXQpCisKKyAgY2xzLk1lcmdlRnJvbSA9IE1lcmdlRnJvbQorCisKK2RlZiBfQWRkV2hpY2hPbmVvZk1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgIGRlZiBXaGljaE9uZW9mKHNlbGYsIG9uZW9mX25hbWUpOgorICAgICIiIlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBzZXQgZmllbGQgaW5zaWRlIGEgb25lb2YsIG9yIE5vbmUuIiIiCisgICAgdHJ5OgorICAgICAgZmllbGQgPSBtZXNzYWdlX2Rlc2NyaXB0b3Iub25lb2ZzX2J5X25hbWVbb25lb2ZfbmFtZV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICdQcm90b2NvbCBtZXNzYWdlIGhhcyBubyBvbmVvZiAiJXMiIGZpZWxkLicgJSBvbmVvZl9uYW1lKQorCisgICAgbmVzdGVkX2ZpZWxkID0gc2VsZi5fb25lb2ZzLmdldChmaWVsZCwgTm9uZSkKKyAgICBpZiBuZXN0ZWRfZmllbGQgaXMgbm90IE5vbmUgYW5kIHNlbGYuSGFzRmllbGQobmVzdGVkX2ZpZWxkLm5hbWUpOgorICAgICAgcmV0dXJuIG5lc3RlZF9maWVsZC5uYW1lCisgICAgZWxzZToKKyAgICAgIHJldHVybiBOb25lCisKKyAgY2xzLldoaWNoT25lb2YgPSBXaGljaE9uZW9mCisKKworZGVmIF9DbGVhcihzZWxmKToKKyAgIyBDbGVhciBmaWVsZHMuCisgIHNlbGYuX2ZpZWxkcyA9IHt9CisgIHNlbGYuX3Vua25vd25fZmllbGRzID0gKCkKKyAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICBpZiBzZWxmLl91bmtub3duX2ZpZWxkX3NldCBpcyBub3QgTm9uZToKKyAgICBzZWxmLl91bmtub3duX2ZpZWxkX3NldC5fY2xlYXIoKQorICAgIHNlbGYuX3Vua25vd25fZmllbGRfc2V0ID0gTm9uZQorCisgIHNlbGYuX29uZW9mcyA9IHt9CisgIHNlbGYuX01vZGlmaWVkKCkKKworCitkZWYgX1Vua25vd25GaWVsZHMoc2VsZik6CisgIGlmIHNlbGYuX3Vua25vd25fZmllbGRfc2V0IGlzIE5vbmU6ICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgIHNlbGYuX3Vua25vd25fZmllbGRfc2V0ID0gY29udGFpbmVycy5Vbmtub3duRmllbGRTZXQoKQorICByZXR1cm4gc2VsZi5fdW5rbm93bl9maWVsZF9zZXQgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworCisKK2RlZiBfRGlzY2FyZFVua25vd25GaWVsZHMoc2VsZik6CisgIHNlbGYuX3Vua25vd25fZmllbGRzID0gW10KKyAgc2VsZi5fdW5rbm93bl9maWVsZF9zZXQgPSBOb25lICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICBmb3IgZmllbGQsIHZhbHVlIGluIHNlbGYuTGlzdEZpZWxkcygpOgorICAgIGlmIGZpZWxkLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgorICAgICAgaWYgX0lzTWFwRmllbGQoZmllbGQpOgorICAgICAgICBpZiBfSXNNZXNzYWdlTWFwRmllbGQoZmllbGQpOgorICAgICAgICAgIGZvciBrZXkgaW4gdmFsdWU6CisgICAgICAgICAgICB2YWx1ZVtrZXldLkRpc2NhcmRVbmtub3duRmllbGRzKCkKKyAgICAgIGVsaWYgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgICAgZm9yIHN1Yl9tZXNzYWdlIGluIHZhbHVlOgorICAgICAgICAgIHN1Yl9tZXNzYWdlLkRpc2NhcmRVbmtub3duRmllbGRzKCkKKyAgICAgIGVsc2U6CisgICAgICAgIHZhbHVlLkRpc2NhcmRVbmtub3duRmllbGRzKCkKKworCitkZWYgX1NldExpc3RlbmVyKHNlbGYsIGxpc3RlbmVyKToKKyAgaWYgbGlzdGVuZXIgaXMgTm9uZToKKyAgICBzZWxmLl9saXN0ZW5lciA9IG1lc3NhZ2VfbGlzdGVuZXJfbW9kLk51bGxNZXNzYWdlTGlzdGVuZXIoKQorICBlbHNlOgorICAgIHNlbGYuX2xpc3RlbmVyID0gbGlzdGVuZXIKKworCitkZWYgX0FkZE1lc3NhZ2VNZXRob2RzKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiQWRkcyBpbXBsZW1lbnRhdGlvbnMgb2YgYWxsIE1lc3NhZ2UgbWV0aG9kcyB0byBjbHMuIiIiCisgIF9BZGRMaXN0RmllbGRzTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkSGFzRmllbGRNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCisgIF9BZGRDbGVhckZpZWxkTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBpZiBtZXNzYWdlX2Rlc2NyaXB0b3IuaXNfZXh0ZW5kYWJsZToKKyAgICBfQWRkQ2xlYXJFeHRlbnNpb25NZXRob2QoY2xzKQorICAgIF9BZGRIYXNFeHRlbnNpb25NZXRob2QoY2xzKQorICBfQWRkRXF1YWxzTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkU3RyTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkUmVwck1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKKyAgX0FkZFVuaWNvZGVNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCisgIF9BZGRCeXRlU2l6ZU1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKKyAgX0FkZFNlcmlhbGl6ZVRvU3RyaW5nTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkTWVyZ2VGcm9tU3RyaW5nTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkSXNJbml0aWFsaXplZE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKKyAgX0FkZE1lcmdlRnJvbU1ldGhvZChjbHMpCisgIF9BZGRXaGljaE9uZW9mTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICAjIEFkZHMgbWV0aG9kcyB3aGljaCBkbyBub3QgZGVwZW5kIG9uIGNscy4KKyAgY2xzLkNsZWFyID0gX0NsZWFyCisgIGNscy5Vbmtub3duRmllbGRzID0gX1Vua25vd25GaWVsZHMKKyAgY2xzLkRpc2NhcmRVbmtub3duRmllbGRzID0gX0Rpc2NhcmRVbmtub3duRmllbGRzCisgIGNscy5fU2V0TGlzdGVuZXIgPSBfU2V0TGlzdGVuZXIKKworCitkZWYgX0FkZFByaXZhdGVIZWxwZXJNZXRob2RzKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiQWRkcyBpbXBsZW1lbnRhdGlvbiBvZiBwcml2YXRlIGhlbHBlciBtZXRob2RzIHRvIGNscy4iIiIKKworICBkZWYgTW9kaWZpZWQoc2VsZik6CisgICAgIiIiU2V0cyB0aGUgX2NhY2hlZF9ieXRlX3NpemVfZGlydHkgYml0IHRvIHRydWUsCisgICAgYW5kIHByb3BhZ2F0ZXMgdGhpcyB0byBvdXIgbGlzdGVuZXIgaWZmIHRoaXMgd2FzIGEgc3RhdGUgY2hhbmdlLgorICAgICIiIgorCisgICAgIyBOb3RlOiAgU29tZSBjYWxsZXJzIGNoZWNrIF9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5IGJlZm9yZSBjYWxsaW5nCisgICAgIyAgIF9Nb2RpZmllZCgpIGFzIGFuIGV4dHJhIG9wdGltaXphdGlvbi4gIFNvLCBpZiB0aGlzIG1ldGhvZCBpcyBldmVyCisgICAgIyAgIGNoYW5nZWQgc3VjaCB0aGF0IGl0IGRvZXMgc3R1ZmYgZXZlbiB3aGVuIF9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5IGlzCisgICAgIyAgIGFscmVhZHkgdHJ1ZSwgdGhlIGNhbGxlcnMgbmVlZCB0byBiZSB1cGRhdGVkLgorICAgIGlmIG5vdCBzZWxmLl9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5OgorICAgICAgc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eSA9IFRydWUKKyAgICAgIHNlbGYuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbi5kaXJ0eSA9IFRydWUKKyAgICAgIHNlbGYuX2lzX3ByZXNlbnRfaW5fcGFyZW50ID0gVHJ1ZQorICAgICAgc2VsZi5fbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiBfVXBkYXRlT25lb2ZTdGF0ZShzZWxmLCBmaWVsZCk6CisgICAgIiIiU2V0cyBmaWVsZCBhcyB0aGUgYWN0aXZlIGZpZWxkIGluIGl0cyBjb250YWluaW5nIG9uZW9mLgorCisgICAgV2lsbCBhbHNvIGRlbGV0ZSBjdXJyZW50bHkgYWN0aXZlIGZpZWxkIGluIHRoZSBvbmVvZiwgaWYgaXQgaXMgZGlmZmVyZW50CisgICAgZnJvbSB0aGUgYXJndW1lbnQuIERvZXMgbm90IG1hcmsgdGhlIG1lc3NhZ2UgYXMgbW9kaWZpZWQuCisgICAgIiIiCisgICAgb3RoZXJfZmllbGQgPSBzZWxmLl9vbmVvZnMuc2V0ZGVmYXVsdChmaWVsZC5jb250YWluaW5nX29uZW9mLCBmaWVsZCkKKyAgICBpZiBvdGhlcl9maWVsZCBpcyBub3QgZmllbGQ6CisgICAgICBkZWwgc2VsZi5fZmllbGRzW290aGVyX2ZpZWxkXQorICAgICAgc2VsZi5fb25lb2ZzW2ZpZWxkLmNvbnRhaW5pbmdfb25lb2ZdID0gZmllbGQKKworICBjbHMuX01vZGlmaWVkID0gTW9kaWZpZWQKKyAgY2xzLlNldEluUGFyZW50ID0gTW9kaWZpZWQKKyAgY2xzLl9VcGRhdGVPbmVvZlN0YXRlID0gX1VwZGF0ZU9uZW9mU3RhdGUKKworCitjbGFzcyBfTGlzdGVuZXIob2JqZWN0KToKKworICAiIiJNZXNzYWdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gdGhhdCBhIHBhcmVudCBtZXNzYWdlIHJlZ2lzdGVycyB3aXRoIGl0cworICBjaGlsZCBtZXNzYWdlLgorCisgIEluIG9yZGVyIHRvIHN1cHBvcnQgc2VtYW50aWNzIGxpa2U6CisKKyAgICBmb28uYmFyLmJhei5tb28gPSAyMworICAgIGFzc2VydCBmb28uSGFzRmllbGQoJ2JhcicpCisKKyAgLi4uY2hpbGQgb2JqZWN0cyBtdXN0IGhhdmUgYmFjayByZWZlcmVuY2VzIHRvIHRoZWlyIHBhcmVudHMuCisgIFRoaXMgaGVscGVyIGNsYXNzIGlzIGF0IHRoZSBoZWFydCBvZiB0aGlzIHN1cHBvcnQuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnRfbWVzc2FnZSk6CisgICAgIiIiQXJnczoKKyAgICAgIHBhcmVudF9tZXNzYWdlOiBUaGUgbWVzc2FnZSB3aG9zZSBfTW9kaWZpZWQoKSBtZXRob2Qgd2Ugc2hvdWxkIGNhbGwgd2hlbgorICAgICAgICB3ZSByZWNlaXZlIE1vZGlmaWVkKCkgbWVzc2FnZXMuCisgICAgIiIiCisgICAgIyBUaGlzIGxpc3RlbmVyIGVzdGFibGlzaGVzIGEgYmFjayByZWZlcmVuY2UgZnJvbSBhIGNoaWxkIChjb250YWluZWQpIG9iamVjdAorICAgICMgdG8gaXRzIHBhcmVudCAoY29udGFpbmluZykgb2JqZWN0LiAgV2UgbWFrZSB0aGlzIGEgd2VhayByZWZlcmVuY2UgdG8gYXZvaWQKKyAgICAjIGNyZWF0aW5nIGN5Y2xpYyBnYXJiYWdlIHdoZW4gdGhlIGNsaWVudCBmaW5pc2hlcyB3aXRoIHRoZSAncGFyZW50JyBvYmplY3QKKyAgICAjIGluIHRoZSB0cmVlLgorICAgIGlmIGlzaW5zdGFuY2UocGFyZW50X21lc3NhZ2UsIHdlYWtyZWYuUHJveHlUeXBlKToKKyAgICAgIHNlbGYuX3BhcmVudF9tZXNzYWdlX3dlYWtyZWYgPSBwYXJlbnRfbWVzc2FnZQorICAgIGVsc2U6CisgICAgICBzZWxmLl9wYXJlbnRfbWVzc2FnZV93ZWFrcmVmID0gd2Vha3JlZi5wcm94eShwYXJlbnRfbWVzc2FnZSkKKworICAgICMgQXMgYW4gb3B0aW1pemF0aW9uLCB3ZSBhbHNvIGluZGljYXRlIGRpcmVjdGx5IG9uIHRoZSBsaXN0ZW5lciB3aGV0aGVyCisgICAgIyBvciBub3QgdGhlIHBhcmVudCBtZXNzYWdlIGlzIGRpcnR5LiAgVGhpcyB3YXkgd2UgY2FuIGF2b2lkIHRyYXZlcnNpbmcKKyAgICAjIHVwIHRoZSB0cmVlIGluIHRoZSBjb21tb24gY2FzZS4KKyAgICBzZWxmLmRpcnR5ID0gRmFsc2UKKworICBkZWYgTW9kaWZpZWQoc2VsZik6CisgICAgaWYgc2VsZi5kaXJ0eToKKyAgICAgIHJldHVybgorICAgIHRyeToKKyAgICAgICMgUHJvcGFnYXRlIHRoZSBzaWduYWwgdG8gb3VyIHBhcmVudHMgaWZmIHRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIHNldC4KKyAgICAgIHNlbGYuX3BhcmVudF9tZXNzYWdlX3dlYWtyZWYuX01vZGlmaWVkKCkKKyAgICBleGNlcHQgUmVmZXJlbmNlRXJyb3I6CisgICAgICAjIFdlIGNhbiBnZXQgaGVyZSBpZiBhIGNsaWVudCBoYXMga2VwdCBhIHJlZmVyZW5jZSB0byBhIGNoaWxkIG9iamVjdCwKKyAgICAgICMgYW5kIGlzIG5vdyBzZXR0aW5nIGEgZmllbGQgb24gaXQsIGJ1dCB0aGUgY2hpbGQncyBwYXJlbnQgaGFzIGJlZW4KKyAgICAgICMgZ2FyYmFnZS1jb2xsZWN0ZWQuICBUaGlzIGlzIG5vdCBhbiBlcnJvci4KKyAgICAgIHBhc3MKKworCitjbGFzcyBfT25lb2ZMaXN0ZW5lcihfTGlzdGVuZXIpOgorICAiIiJTcGVjaWFsIGxpc3RlbmVyIGltcGxlbWVudGF0aW9uIGZvciBzZXR0aW5nIGNvbXBvc2l0ZSBvbmVvZiBmaWVsZHMuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudF9tZXNzYWdlLCBmaWVsZCk6CisgICAgIiIiQXJnczoKKyAgICAgIHBhcmVudF9tZXNzYWdlOiBUaGUgbWVzc2FnZSB3aG9zZSBfTW9kaWZpZWQoKSBtZXRob2Qgd2Ugc2hvdWxkIGNhbGwgd2hlbgorICAgICAgICB3ZSByZWNlaXZlIE1vZGlmaWVkKCkgbWVzc2FnZXMuCisgICAgICBmaWVsZDogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkIGJlaW5nIHNldCBpbiB0aGUgcGFyZW50IG1lc3NhZ2UuCisgICAgIiIiCisgICAgc3VwZXIoX09uZW9mTGlzdGVuZXIsIHNlbGYpLl9faW5pdF9fKHBhcmVudF9tZXNzYWdlKQorICAgIHNlbGYuX2ZpZWxkID0gZmllbGQKKworICBkZWYgTW9kaWZpZWQoc2VsZik6CisgICAgIiIiQWxzbyB1cGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgY29udGFpbmluZyBvbmVvZiBpbiB0aGUgcGFyZW50IG1lc3NhZ2UuIiIiCisgICAgdHJ5OgorICAgICAgc2VsZi5fcGFyZW50X21lc3NhZ2Vfd2Vha3JlZi5fVXBkYXRlT25lb2ZTdGF0ZShzZWxmLl9maWVsZCkKKyAgICAgIHN1cGVyKF9PbmVvZkxpc3RlbmVyLCBzZWxmKS5Nb2RpZmllZCgpCisgICAgZXhjZXB0IFJlZmVyZW5jZUVycm9yOgorICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9weXRob25fcHJvdG9idWYuY2MgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3B5dGhvbl9wcm90b2J1Zi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmUzYThiCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9weXRob25fcHJvdG9idWYuY2MKQEAgLTAsMCArMSw2MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogcXJjemFrQGdvb2dsZS5jb20gKE1hcmNpbiBLb3dhbGN6eWspCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHl0aG9uL3B5dGhvbl9wcm90b2J1Zi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgcHl0aG9uIHsKKworc3RhdGljIGNvbnN0IE1lc3NhZ2UqIEdldENQcm90b0luc2lkZVB5UHJvdG9TdHViKFB5T2JqZWN0KiBtc2cpIHsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CitzdGF0aWMgTWVzc2FnZSogTXV0YWJsZUNQcm90b0luc2lkZVB5UHJvdG9TdHViKFB5T2JqZWN0KiBtc2cpIHsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIFRoaXMgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIGRlZmF1bHQsIHN0dWIgaW1wbGVtZW50YXRpb24uCisvLyBJZiBweXRob24tZ29vZ2xlLnByb3RvYnVmLmNjIGlzIGxvYWRlZCwgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaXMgb3ZlcnJpZGRlbgorLy8gd2l0aCBhIGZ1bGwgaW1wbGVtZW50YXRpb24uCitjb25zdCBNZXNzYWdlKiAoKkdldENQcm90b0luc2lkZVB5UHJvdG9QdHIpKFB5T2JqZWN0KiBtc2cpID0KKyAgICBHZXRDUHJvdG9JbnNpZGVQeVByb3RvU3R1YjsKK01lc3NhZ2UqICgqTXV0YWJsZUNQcm90b0luc2lkZVB5UHJvdG9QdHIpKFB5T2JqZWN0KiBtc2cpID0KKyAgICBNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90b1N0dWI7CisKK2NvbnN0IE1lc3NhZ2UqIEdldENQcm90b0luc2lkZVB5UHJvdG8oUHlPYmplY3QqIG1zZykgeworICByZXR1cm4gR2V0Q1Byb3RvSW5zaWRlUHlQcm90b1B0cihtc2cpOworfQorTWVzc2FnZSogTXV0YWJsZUNQcm90b0luc2lkZVB5UHJvdG8oUHlPYmplY3QqIG1zZykgeworICByZXR1cm4gTXV0YWJsZUNQcm90b0luc2lkZVB5UHJvdG9QdHIobXNnKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3JlZmxlY3Rpb25fdGVzdC5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcmVmbGVjdGlvbl90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTU3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3JlZmxlY3Rpb25fdGVzdC5weQpAQCAtMCwwICsxLDMzODEgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXR0ZXN0IGZvciByZWZsZWN0aW9uLnB5LCB3aGljaCBhbHNvIGluZGlyZWN0bHkgdGVzdHMgdGhlIG91dHB1dCBvZiB0aGUKK3B1cmUtUHl0aG9uIHByb3RvY29sIGNvbXBpbGVyLgorIiIiCisKK2ltcG9ydCBjb3B5CitpbXBvcnQgZ2MKK2ltcG9ydCBvcGVyYXRvcgoraW1wb3J0IHN0cnVjdAoraW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2ltcG9ydF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9tc2V0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3Byb3RvM19hcmVuYV9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgcmVmbGVjdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHRleHRfZm9ybWF0Citmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgYXBpX2ltcGxlbWVudGF0aW9uCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgbW9yZV9leHRlbnNpb25zX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IG1vcmVfbWVzc2FnZXNfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB3aXJlX2Zvcm1hdAorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RfdXRpbAorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RpbmdfcmVmbGVha3MKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBkZWNvZGVyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgX3BhcmFtZXRlcml6ZWQKKworCit3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2Vycm9yJywgRGVwcmVjYXRpb25XYXJuaW5nKQorCisKK2NsYXNzIF9NaW5pRGVjb2RlcihvYmplY3QpOgorICAiIiJEZWNvZGVzIGEgc3RyZWFtIG9mIHZhbHVlcyBmcm9tIGEgc3RyaW5nLgorCisgIE9uY2UgdXBvbiBhIHRpbWUgd2UgYWN0dWFsbHkgaGFkIGEgY2xhc3MgY2FsbGVkIGRlY29kZXIuRGVjb2Rlci4gIFRoZW4gd2UKKyAgZ290IHJpZCBvZiBpdCBkdXJpbmcgYSByZWRlc2lnbiB0aGF0IG1hZGUgZGVjb2RpbmcgbXVjaCwgbXVjaCBmYXN0ZXIgb3ZlcmFsbC4KKyAgQnV0IGEgY291cGxlIHRlc3RzIGluIHRoaXMgZmlsZSB1c2VkIGl0IHRvIGNoZWNrIHRoYXQgdGhlIHNlcmlhbGl6ZWQgZm9ybSBvZgorICBhIG1lc3NhZ2Ugd2FzIGNvcnJlY3QuICBTbywgdGhpcyBjbGFzcyBpbXBsZW1lbnRzIGp1c3QgdGhlIG1ldGhvZHMgdGhhdCB3ZXJlCisgIHVzZWQgYnkgc2FpZCB0ZXN0cywgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJld3JpdGUgdGhlIHRlc3RzLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgYnl0ZXMpOgorICAgIHNlbGYuX2J5dGVzID0gYnl0ZXMKKyAgICBzZWxmLl9wb3MgPSAwCisKKyAgZGVmIFJlYWRWYXJpbnQoc2VsZik6CisgICAgcmVzdWx0LCBzZWxmLl9wb3MgPSBkZWNvZGVyLl9EZWNvZGVWYXJpbnQoc2VsZi5fYnl0ZXMsIHNlbGYuX3BvcykKKyAgICByZXR1cm4gcmVzdWx0CisKKyAgUmVhZEludDMyID0gUmVhZFZhcmludAorICBSZWFkSW50NjQgPSBSZWFkVmFyaW50CisgIFJlYWRVSW50MzIgPSBSZWFkVmFyaW50CisgIFJlYWRVSW50NjQgPSBSZWFkVmFyaW50CisKKyAgZGVmIFJlYWRTSW50NjQoc2VsZik6CisgICAgcmV0dXJuIHdpcmVfZm9ybWF0LlppZ1phZ0RlY29kZShzZWxmLlJlYWRWYXJpbnQoKSkKKworICBSZWFkU0ludDMyID0gUmVhZFNJbnQ2NAorCisgIGRlZiBSZWFkRmllbGROdW1iZXJBbmRXaXJlVHlwZShzZWxmKToKKyAgICByZXR1cm4gd2lyZV9mb3JtYXQuVW5wYWNrVGFnKHNlbGYuUmVhZFZhcmludCgpKQorCisgIGRlZiBSZWFkRmxvYXQoc2VsZik6CisgICAgcmVzdWx0ID0gc3RydWN0LnVucGFjaygnPGYnLCBzZWxmLl9ieXRlc1tzZWxmLl9wb3M6c2VsZi5fcG9zKzRdKVswXQorICAgIHNlbGYuX3BvcyArPSA0CisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBSZWFkRG91YmxlKHNlbGYpOgorICAgIHJlc3VsdCA9IHN0cnVjdC51bnBhY2soJzxkJywgc2VsZi5fYnl0ZXNbc2VsZi5fcG9zOnNlbGYuX3Bvcys4XSlbMF0KKyAgICBzZWxmLl9wb3MgKz0gOAorICAgIHJldHVybiByZXN1bHQKKworICBkZWYgRW5kT2ZTdHJlYW0oc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX3BvcyA9PSBsZW4oc2VsZi5fYnl0ZXMpCisKKworQF9wYXJhbWV0ZXJpemVkLm5hbWVkX3BhcmFtZXRlcnMoCisgICAgKCdfcHJvdG8yJywgdW5pdHRlc3RfcGIyKSwKKyAgICAoJ19wcm90bzMnLCB1bml0dGVzdF9wcm90bzNfYXJlbmFfcGIyKSkKK0B0ZXN0aW5nX3JlZmxlYWtzLlRlc3RDYXNlCitjbGFzcyBSZWZsZWN0aW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIGFzc2VydExpc3RzRXF1YWwoc2VsZiwgdmFsdWVzLCBvdGhlcnMpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlcyksIGxlbihvdGhlcnMpKQorICAgIGZvciBpIGluIHJhbmdlKGxlbih2YWx1ZXMpKToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzW2ldLCBvdGhlcnNbaV0pCisKKyAgZGVmIHRlc3RTY2FsYXJDb25zdHJ1Y3RvcihzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgIyBDb25zdHJ1Y3RvciB3aXRoIG9ubHkgc2NhbGFyIHR5cGVzIHNob3VsZCBzdWNjZWVkLgorICAgIHByb3RvID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKAorICAgICAgICBvcHRpb25hbF9pbnQzMj0yNCwKKyAgICAgICAgb3B0aW9uYWxfZG91YmxlPTU0LjMyMSwKKyAgICAgICAgb3B0aW9uYWxfc3RyaW5nPSdvcHRpb25hbF9zdHJpbmcnLAorICAgICAgICBvcHRpb25hbF9mbG9hdD1Ob25lKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyNCwgcHJvdG8ub3B0aW9uYWxfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1NC4zMjEsIHByb3RvLm9wdGlvbmFsX2RvdWJsZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvcHRpb25hbF9zdHJpbmcnLCBwcm90by5vcHRpb25hbF9zdHJpbmcpCisgICAgaWYgbWVzc2FnZV9tb2R1bGUgaXMgdW5pdHRlc3RfcGIyOgorICAgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5IYXNGaWVsZCgib3B0aW9uYWxfZmxvYXQiKSkKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyQ29uc3RydWN0b3Ioc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgICMgQ29uc3RydWN0b3Igd2l0aCBvbmx5IHJlcGVhdGVkIHNjYWxhciB0eXBlcyBzaG91bGQgc3VjY2VlZC4KKyAgICBwcm90byA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygKKyAgICAgICAgcmVwZWF0ZWRfaW50MzI9WzEsIDIsIDMsIDRdLAorICAgICAgICByZXBlYXRlZF9kb3VibGU9WzEuMjMsIDU0LjMyMV0sCisgICAgICAgIHJlcGVhdGVkX2Jvb2w9W1RydWUsIEZhbHNlLCBGYWxzZV0sCisgICAgICAgIHJlcGVhdGVkX3N0cmluZz1bIm9wdGlvbmFsX3N0cmluZyJdLAorICAgICAgICByZXBlYXRlZF9mbG9hdD1Ob25lKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChbMSwgMiwgMywgNF0sIGxpc3QocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzEuMjMsIDU0LjMyMV0sIGxpc3QocHJvdG8ucmVwZWF0ZWRfZG91YmxlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFtUcnVlLCBGYWxzZSwgRmFsc2VdLCBsaXN0KHByb3RvLnJlcGVhdGVkX2Jvb2wpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyJvcHRpb25hbF9zdHJpbmciXSwgbGlzdChwcm90by5yZXBlYXRlZF9zdHJpbmcpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIGxpc3QocHJvdG8ucmVwZWF0ZWRfZmxvYXQpKQorCisgIGRlZiB0ZXN0TWl4ZWRDb25zdHJ1Y3RvcihzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgIyBDb25zdHJ1Y3RvciB3aXRoIG9ubHkgbWl4ZWQgdHlwZXMgc2hvdWxkIHN1Y2NlZWQuCisgICAgcHJvdG8gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoCisgICAgICAgIG9wdGlvbmFsX2ludDMyPTI0LAorICAgICAgICBvcHRpb25hbF9zdHJpbmc9J29wdGlvbmFsX3N0cmluZycsCisgICAgICAgIHJlcGVhdGVkX2RvdWJsZT1bMS4yMywgNTQuMzIxXSwKKyAgICAgICAgcmVwZWF0ZWRfYm9vbD1bVHJ1ZSwgRmFsc2UsIEZhbHNlXSwKKyAgICAgICAgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2U9WworICAgICAgICAgICAgbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgYmI9bWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLkZPTyksCisgICAgICAgICAgICBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBiYj1tZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuQkFSKV0sCisgICAgICAgIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZT1bCisgICAgICAgICAgICBtZXNzYWdlX21vZHVsZS5Gb3JlaWduTWVzc2FnZShjPS00MyksCisgICAgICAgICAgICBtZXNzYWdlX21vZHVsZS5Gb3JlaWduTWVzc2FnZShjPTQ1MzI0KSwKKyAgICAgICAgICAgIG1lc3NhZ2VfbW9kdWxlLkZvcmVpZ25NZXNzYWdlKGM9MTIpXSwKKyAgICAgICAgb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2U9Tm9uZSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjQsIHByb3RvLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29wdGlvbmFsX3N0cmluZycsIHByb3RvLm9wdGlvbmFsX3N0cmluZykKKyAgICBzZWxmLmFzc2VydEVxdWFsKFsxLjIzLCA1NC4zMjFdLCBsaXN0KHByb3RvLnJlcGVhdGVkX2RvdWJsZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbVHJ1ZSwgRmFsc2UsIEZhbHNlXSwgbGlzdChwcm90by5yZXBlYXRlZF9ib29sKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBbbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoCisgICAgICAgICAgICBiYj1tZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuRk9PKSwKKyAgICAgICAgIG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKAorICAgICAgICAgICAgIGJiPW1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcy5CQVIpXSwKKyAgICAgICAgbGlzdChwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgW21lc3NhZ2VfbW9kdWxlLkZvcmVpZ25NZXNzYWdlKGM9LTQzKSwKKyAgICAgICAgIG1lc3NhZ2VfbW9kdWxlLkZvcmVpZ25NZXNzYWdlKGM9NDUzMjQpLAorICAgICAgICAgbWVzc2FnZV9tb2R1bGUuRm9yZWlnbk1lc3NhZ2UoYz0xMildLAorICAgICAgICBsaXN0KHByb3RvLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSkpCisgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5IYXNGaWVsZCgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSkKKworICBkZWYgdGVzdENvbnN0cnVjdG9yVHlwZUVycm9yKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgVHlwZUVycm9yLCBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMsIG9wdGlvbmFsX2ludDMyPSdmb28nKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICBUeXBlRXJyb3IsIG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcywgb3B0aW9uYWxfc3RyaW5nPTEyMzQpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgIFR5cGVFcnJvciwgbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLCBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZT0xMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICBUeXBlRXJyb3IsIG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcywgcmVwZWF0ZWRfaW50MzI9MTIzNCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgVHlwZUVycm9yLCBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMsIHJlcGVhdGVkX2ludDMyPVsnZm9vJ10pCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgIFR5cGVFcnJvciwgbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLCByZXBlYXRlZF9zdHJpbmc9MTIzNCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgVHlwZUVycm9yLCBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMsIHJlcGVhdGVkX3N0cmluZz1bMTIzNF0pCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgIFR5cGVFcnJvciwgbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLCByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZT0xMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICBUeXBlRXJyb3IsIG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcywgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2U9WzEyMzRdKQorCisgIGRlZiB0ZXN0Q29uc3RydWN0b3JJbnZhbGlkYXRlc0NhY2hlZEJ5dGVTaXplKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKG9wdGlvbmFsX2ludDMyPTEyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbWVzc2FnZS5CeXRlU2l6ZSgpKQorCisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygKKyAgICAgICAgb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2U9bWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIG1lc3NhZ2UuQnl0ZVNpemUoKSkKKworICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMocmVwZWF0ZWRfaW50MzI9WzEyXSkKKyAgICAjIFRPRE8oamllbHVvKTogQWRkIHRoaXMgdGVzdCBiYWNrIGZvciBwcm90bzMKKyAgICBpZiBtZXNzYWdlX21vZHVsZSBpcyB1bml0dGVzdF9wYjI6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIG1lc3NhZ2UuQnl0ZVNpemUoKSkKKworICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoCisgICAgICAgIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlPVttZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgpXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIG1lc3NhZ2UuQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdFJlZmVyZW5jZXNUb05lc3RlZE1lc3NhZ2Uoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIHByb3RvID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBuZXN0ZWQgPSBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZQorICAgIGRlbCBwcm90bworICAgICMgQSBwcmV2aW91cyB2ZXJzaW9uIGhhZCBhIGJ1ZyB3aGVyZSB0aGlzIHdvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuCisgICAgIyBoaXR0aW5nIGEgbm93LWRlYWQgd2VhayByZWZlcmVuY2UuCisgICAgbmVzdGVkLmJiID0gMjMKKworICBkZWYgdGVzdE9uZU9mKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBwcm90byA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ub25lb2ZfdWludDMyID0gMTAKKyAgICBwcm90by5vbmVvZl9uZXN0ZWRfbWVzc2FnZS5iYiA9IDExCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMSwgcHJvdG8ub25lb2ZfbmVzdGVkX21lc3NhZ2UuYmIpCisgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5IYXNGaWVsZCgnb25lb2ZfdWludDMyJykpCisgICAgbmVzdGVkID0gcHJvdG8ub25lb2ZfbmVzdGVkX21lc3NhZ2UKKyAgICBwcm90by5vbmVvZl9zdHJpbmcgPSAnYWJjJworICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiYycsIHByb3RvLm9uZW9mX3N0cmluZykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDExLCBuZXN0ZWQuYmIpCisgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5IYXNGaWVsZCgnb25lb2ZfbmVzdGVkX21lc3NhZ2UnKSkKKworICBkZWYgdGVzdEdldERlZmF1bHRNZXNzYWdlQWZ0ZXJEaXNjb25uZWN0aW5nRGVmYXVsdE1lc3NhZ2UoCisgICAgICBzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgcHJvdG8gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG5lc3RlZCA9IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCisgICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKQorICAgIGRlbCBwcm90bworICAgIGRlbCBuZXN0ZWQKKyAgICAjIEZvcmNlIGEgZ2FyYmFnZSBjb2xsZWN0IHNvIHRoYXQgdGhlIHVuZGVybHlpbmcgQ01lc3NhZ2VzIGFyZSBmcmVlZCBhbG9uZworICAgICMgd2l0aCB0aGUgTWVzc2FnZXMgdGhleSBwb2ludCB0by4gVGhpcyBpcyB0byBtYWtlIHN1cmUgd2UncmUgbm90IGRlbGV0aW5nCisgICAgIyBkZWZhdWx0IG1lc3NhZ2UgaW5zdGFuY2VzLgorICAgIGdjLmNvbGxlY3QoKQorICAgIHByb3RvID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBuZXN0ZWQgPSBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZQorCisgIGRlZiB0ZXN0RGlzY29ubmVjdGluZ05lc3RlZE1lc3NhZ2VBZnRlclNldHRpbmdGaWVsZChzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgcHJvdG8gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG5lc3RlZCA9IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCisgICAgbmVzdGVkLmJiID0gNQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKyAgICBwcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpICAjIFNob3VsZCBkaXNjb25uZWN0IGZyb20gcGFyZW50CisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBuZXN0ZWQuYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYikKKyAgICBzZWxmLmFzc2VydElzTm90KG5lc3RlZCwgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UpCisgICAgbmVzdGVkLmJiID0gMjMKKyAgICBzZWxmLmFzc2VydEZhbHNlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisKKyAgZGVmIHRlc3REaXNjb25uZWN0aW5nTmVzdGVkTWVzc2FnZUJlZm9yZUdldHRpbmdGaWVsZChzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgcHJvdG8gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisKKyAgZGVmIHRlc3REaXNjb25uZWN0aW5nTmVzdGVkTWVzc2FnZUFmdGVyTWVyZ2Uoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgICMgVGhpcyB0ZXN0IGV4ZXJjaXNlcyB0aGUgY29kZSBwYXRoIHRoYXQgZG9lcyBub3QgdXNlIFJlbGVhc2VNZXNzYWdlKCkuCisgICAgIyBUaGUgdW5kZXJseWluZyBmZWFyIGlzIHRoYXQgaWYgd2UgdXNlIFJlbGVhc2VNZXNzYWdlKCkgaW5jb3JyZWN0bHksCisgICAgIyB3ZSB3aWxsIGhhdmUgbWVtb3J5IGxlYWtzLiAgSXQncyBoYXJkIHRvIGNoZWNrIHRoYXQgdGhhdCBkb2Vzbid0IGhhcHBlbiwKKyAgICAjIGJ1dCBhdCBsZWFzdCB3ZSBjYW4gZXhlcmNpc2UgdGhhdCBjb2RlIHBhdGggdG8gbWFrZSBzdXJlIGl0IHdvcmtzLgorICAgIHByb3RvMSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8yID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90bzIub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgPSA1CisgICAgcHJvdG8xLk1lcmdlRnJvbShwcm90bzIpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvMS5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKyAgICBwcm90bzEuQ2xlYXJGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8xLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorCisgIGRlZiB0ZXN0RGlzY29ubmVjdGluZ0xhenlOZXN0ZWRNZXNzYWdlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAjIFRoaXMgdGVzdCBleGVyY2lzZXMgcmVsZWFzaW5nIGEgbmVzdGVkIG1lc3NhZ2UgdGhhdCBpcyBsYXp5LiBUaGlzIHRlc3QKKyAgICAjIG9ubHkgZXhlcmNpc2VzIHJlYWwgY29kZSBpbiB0aGUgQysrIGltcGxlbWVudGF0aW9uIGFzIFB5dGhvbiBkb2VzIG5vdAorICAgICMgc3VwcG9ydCBsYXp5IHBhcnNpbmcsIGJ1dCB0aGUgY3VycmVudCBDKysgaW1wbGVtZW50YXRpb24gcmVzdWx0cyBpbgorICAgICMgbWVtb3J5IGNvcnJ1cHRpb24gYW5kIGEgY3Jhc2guCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAncHl0aG9uJzoKKyAgICAgIHJldHVybgorICAgIHByb3RvID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90by5vcHRpb25hbF9sYXp5X21lc3NhZ2UuYmIgPSA1CisgICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfbGF6eV9tZXNzYWdlJykKKyAgICBkZWwgcHJvdG8KKyAgICBnYy5jb2xsZWN0KCkKKworICBkZWYgdGVzdFNpbmd1bGFyTGlzdEZpZWxkcyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgcHJvdG8gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvLm9wdGlvbmFsX2ZpeGVkMzIgPSAxCisgICAgcHJvdG8ub3B0aW9uYWxfaW50MzIgPSA1CisgICAgcHJvdG8ub3B0aW9uYWxfc3RyaW5nID0gJ2ZvbycKKyAgICAjIEFjY2VzcyBzdWItbWVzc2FnZSBidXQgZG9uJ3Qgc2V0IGl0IHlldC4KKyAgICBuZXN0ZWRfbWVzc2FnZSA9IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgIFsgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2ludDMyJyAgXSwgNSksCisgICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9maXhlZDMyJ10sIDEpLAorICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfc3RyaW5nJyBdLCAnZm9vJykgXSwKKyAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKKworICAgIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMTIzCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgIFsgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2ludDMyJyAgXSwgNSksCisgICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9maXhlZDMyJ10sIDEpLAorICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfc3RyaW5nJyBdLCAnZm9vJyksCisgICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScgXSwKKyAgICAgICAgICAgICBuZXN0ZWRfbWVzc2FnZSkgXSwKKyAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKKworICBkZWYgdGVzdFJlcGVhdGVkTGlzdEZpZWxkcyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgcHJvdG8gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvLnJlcGVhdGVkX2ZpeGVkMzIuYXBwZW5kKDEpCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDUpCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDExKQorICAgIHByb3RvLnJlcGVhdGVkX3N0cmluZy5leHRlbmQoWydmb28nLCAnYmFyJ10pCisgICAgcHJvdG8ucmVwZWF0ZWRfc3RyaW5nLmV4dGVuZChbXSkKKyAgICBwcm90by5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdiYXonKQorICAgIHByb3RvLnJlcGVhdGVkX3N0cmluZy5leHRlbmQoc3RyKHgpIGZvciB4IGluIHJhbmdlKDIpKQorICAgIHByb3RvLm9wdGlvbmFsX2ludDMyID0gMjEKKyAgICBwcm90by5yZXBlYXRlZF9ib29sICAjIEFjY2VzcyBidXQgZG9uJ3Qgc2V0IGFueXRoaW5nOyBzaG91bGQgbm90IGJlIGxpc3RlZC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgWyAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfaW50MzInICBdLCAyMSksCisgICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydyZXBlYXRlZF9pbnQzMicgIF0sIFs1LCAxMV0pLAorICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsncmVwZWF0ZWRfZml4ZWQzMiddLCBbMV0pLAorICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsncmVwZWF0ZWRfc3RyaW5nJyBdLAorICAgICAgICAgIFsnZm9vJywgJ2JhcicsICdiYXonLCAnMCcsICcxJ10pIF0sCisgICAgICBwcm90by5MaXN0RmllbGRzKCkpCisKKyAgZGVmIHRlc3RDbGVhckZpZWxkV2l0aFVua25vd25GaWVsZE5hbWUoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIHByb3RvID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwcm90by5DbGVhckZpZWxkLCAnbm9uZXhpc3RlbnRfZmllbGQnKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHByb3RvLkNsZWFyRmllbGQsIGInbm9uZXhpc3RlbnRfZmllbGQnKQorCisgIGRlZiB0ZXN0RGlzYWxsb3dlZEFzc2lnbm1lbnRzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAjIEl0J3MgaWxsZWdhbCB0byBhc3NpZ24gdmFsdWVzIGRpcmVjdGx5IHRvIHJlcGVhdGVkIGZpZWxkcworICAgICMgb3IgdG8gbm9ucmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcy4gIEVuc3VyZSB0aGF0IHRoaXMgZmFpbHMuCisgICAgcHJvdG8gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgICMgUmVwZWF0ZWQgZmllbGRzLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBwcm90bywgJ3JlcGVhdGVkX2ludDMyJywgMTApCisgICAgIyBMaXN0cyBzaG91bGRuJ3Qgd29yaywgZWl0aGVyLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBwcm90bywgJ3JlcGVhdGVkX2ludDMyJywgWzEwXSkKKyAgICAjIENvbXBvc2l0ZSBmaWVsZHMuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScsIDIzKQorICAgICMgQXNzaWdubWVudCB0byBhIHJlcGVhdGVkIG5lc3RlZCBtZXNzYWdlIGZpZWxkIHdpdGhvdXQgc3BlY2lmeWluZworICAgICMgdGhlIGluZGV4IGluIHRoZSBhcnJheSBvZiBuZXN0ZWQgbWVzc2FnZXMuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICdiYicsIDM0KQorICAgICMgQXNzaWdubWVudCB0byBhbiBhdHRyaWJ1dGUgb2YgYSByZXBlYXRlZCBmaWVsZC4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgcHJvdG8ucmVwZWF0ZWRfZmxvYXQsCisgICAgICAgICAgICAgICAgICAgICAgJ3NvbWVfYXR0cmlidXRlJywgMzQpCisgICAgIyBwcm90by5ub25leGlzdGVudF9maWVsZCA9IDIzIHNob3VsZCBmYWlsIGFzIHdlbGwuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAnbm9uZXhpc3RlbnRfZmllbGQnLCAyMykKKworICBkZWYgdGVzdFNpbmdsZVNjYWxhclR5cGVTYWZldHkoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIHByb3RvID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAnb3B0aW9uYWxfaW50MzInLCAxLjEpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX2ludDMyJywgJ2ZvbycpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX3N0cmluZycsIDEwKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgcHJvdG8sICdvcHRpb25hbF9ieXRlcycsIDEwKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgcHJvdG8sICdvcHRpb25hbF9ib29sJywgJ2ZvbycpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX2Zsb2F0JywgJ2ZvbycpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX2RvdWJsZScsICdmb28nKQorICAgICMgVE9ETyhqaWVsdW8pOiBGaXggdHlwZSBjaGVja2luZyBkaWZmZXJlbmNlIGZvciBweXRob24gYW5kIGMgZXh0ZW5zaW9uCisgICAgaWYgKGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ3B5dGhvbicgb3IKKyAgICAgICAgKHN5cy52ZXJzaW9uX2luZm8ubWFqb3IsIHN5cy52ZXJzaW9uX2luZm8ubWlub3IpID49ICgzLCAxMCkpOgorICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX2Jvb2wnLCAxLjEpCisgICAgZWxzZToKKyAgICAgIHByb3RvLm9wdGlvbmFsX2Jvb2wgPSAxLjEKKworICBkZWYgYXNzZXJ0SW50ZWdlclR5cGVzKHNlbGYsIGludGVnZXJfZm4sIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAiIiJWZXJpZmllcyBzZXR0aW5nIG9mIHNjYWxhciBpbnRlZ2Vycy4KKworICAgIEFyZ3M6CisgICAgICBpbnRlZ2VyX2ZuOiBBIGZ1bmN0aW9uIHRvIHdyYXAgdGhlIGludGVnZXJzIHRoYXQgd2lsbCBiZSBhc3NpZ25lZC4KKyAgICAgIG1lc3NhZ2VfbW9kdWxlOiB1bml0dGVzdF9wYjIgb3IgdW5pdHRlc3RfcHJvdG8zX2FyZW5hX3BiMgorICAgICIiIgorICAgIGRlZiBUZXN0R2V0QW5kRGVzZXJpYWxpemUoZmllbGRfbmFtZSwgdmFsdWUsIGV4cGVjdGVkX3R5cGUpOgorICAgICAgcHJvdG8gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgICAgdmFsdWUgPSBpbnRlZ2VyX2ZuKHZhbHVlKQorICAgICAgc2V0YXR0cihwcm90bywgZmllbGRfbmFtZSwgdmFsdWUpCisgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZ2V0YXR0cihwcm90bywgZmllbGRfbmFtZSksIGV4cGVjdGVkX3R5cGUpCisgICAgICBwcm90bzIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgICAgcHJvdG8yLlBhcnNlRnJvbVN0cmluZyhwcm90by5TZXJpYWxpemVUb1N0cmluZygpKQorICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGdldGF0dHIocHJvdG8yLCBmaWVsZF9uYW1lKSwgZXhwZWN0ZWRfdHlwZSkKKworICAgIFRlc3RHZXRBbmREZXNlcmlhbGl6ZSgnb3B0aW9uYWxfaW50MzInLCAxLCBpbnQpCisgICAgVGVzdEdldEFuZERlc2VyaWFsaXplKCdvcHRpb25hbF9pbnQzMicsIDEgPDwgMzAsIGludCkKKyAgICBUZXN0R2V0QW5kRGVzZXJpYWxpemUoJ29wdGlvbmFsX3VpbnQzMicsIDEgPDwgMzAsIGludCkKKyAgICBpbnRlZ2VyXzY0ID0gaW50CisgICAgaWYgc3RydWN0LmNhbGNzaXplKCdMJykgPT0gNDoKKyAgICAgICMgUHl0aG9uIG9ubHkgaGFzIHNpZ25lZCBpbnRzLCBzbyAzMi1iaXQgcHl0aG9uIGNhbid0IGZpdCBhbiB1aW50MzIKKyAgICAgICMgaW4gYW4gaW50LgorICAgICAgVGVzdEdldEFuZERlc2VyaWFsaXplKCdvcHRpb25hbF91aW50MzInLCAxIDw8IDMxLCBpbnRlZ2VyXzY0KQorICAgIGVsc2U6CisgICAgICAjIDY0LWJpdCBweXRob24gY2FuIGZpdCB1aW50MzIgaW5zaWRlIGFuIGludAorICAgICAgVGVzdEdldEFuZERlc2VyaWFsaXplKCdvcHRpb25hbF91aW50MzInLCAxIDw8IDMxLCBpbnQpCisgICAgVGVzdEdldEFuZERlc2VyaWFsaXplKCdvcHRpb25hbF9pbnQ2NCcsIDEgPDwgMzAsIGludGVnZXJfNjQpCisgICAgVGVzdEdldEFuZERlc2VyaWFsaXplKCdvcHRpb25hbF9pbnQ2NCcsIDEgPDwgNjAsIGludGVnZXJfNjQpCisgICAgVGVzdEdldEFuZERlc2VyaWFsaXplKCdvcHRpb25hbF91aW50NjQnLCAxIDw8IDMwLCBpbnRlZ2VyXzY0KQorICAgIFRlc3RHZXRBbmREZXNlcmlhbGl6ZSgnb3B0aW9uYWxfdWludDY0JywgMSA8PCA2MCwgaW50ZWdlcl82NCkKKworICBkZWYgdGVzdEludGVnZXJUeXBlcyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgc2VsZi5hc3NlcnRJbnRlZ2VyVHlwZXMobGFtYmRhIHg6IHgsIG1lc3NhZ2VfbW9kdWxlKQorCisgIGRlZiB0ZXN0Tm9uU3RhbmRhcmRJbnRlZ2VyVHlwZXMoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIHNlbGYuYXNzZXJ0SW50ZWdlclR5cGVzKHRlc3RfdXRpbC5Ob25TdGFuZGFyZEludGVnZXIsIG1lc3NhZ2VfbW9kdWxlKQorCisgIGRlZiB0ZXN0SWxsZWdhbFZhbHVlc0ZvckludGVnZXJzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBwYiA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisKKyAgICAjIFN0cmluZ3MgYXJlIGlsbGVnYWwsIGV2ZW4gd2hlbiB0aGUgcmVwcmVzZW50IGFuIGludGVnZXIuCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgcGIub3B0aW9uYWxfdWludDY0ID0gJzInCisKKyAgICAjIFRoZSBleGFjdCBlcnJvciBzaG91bGQgcHJvcGFnYXRlIHdpdGggYSBwb29ybHkgd3JpdHRlbiBjdXN0b20gaW50ZWdlci4KKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoUnVudGltZUVycm9yLCAnbXlfZXJyb3InKToKKyAgICAgIHBiLm9wdGlvbmFsX3VpbnQ2NCA9IHRlc3RfdXRpbC5Ob25TdGFuZGFyZEludGVnZXIoNSwgJ215X2Vycm9yJykKKworICBkZWYgYXNzZXRJbnRlZ2VyQm91bmRzQ2hlY2tpbmcoc2VsZiwgaW50ZWdlcl9mbiwgbWVzc2FnZV9tb2R1bGUpOgorICAgICIiIlZlcmlmaWVzIGJvdW5kcyBjaGVja2luZyBmb3Igc2NhbGFyIGludGVnZXIgZmllbGRzLgorCisgICAgQXJnczoKKyAgICAgIGludGVnZXJfZm46IEEgZnVuY3Rpb24gdG8gd3JhcCB0aGUgaW50ZWdlcnMgdGhhdCB3aWxsIGJlIGFzc2lnbmVkLgorICAgICAgbWVzc2FnZV9tb2R1bGU6IHVuaXR0ZXN0X3BiMiBvciB1bml0dGVzdF9wcm90bzNfYXJlbmFfcGIyCisgICAgIiIiCisgICAgZGVmIFRlc3RNaW5BbmRNYXhJbnRlZ2VycyhmaWVsZF9uYW1lLCBleHBlY3RlZF9taW4sIGV4cGVjdGVkX21heCk6CisgICAgICBwYiA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgICBleHBlY3RlZF9taW4gPSBpbnRlZ2VyX2ZuKGV4cGVjdGVkX21pbikKKyAgICAgIGV4cGVjdGVkX21heCA9IGludGVnZXJfZm4oZXhwZWN0ZWRfbWF4KQorICAgICAgc2V0YXR0cihwYiwgZmllbGRfbmFtZSwgZXhwZWN0ZWRfbWluKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9taW4sIGdldGF0dHIocGIsIGZpZWxkX25hbWUpKQorICAgICAgc2V0YXR0cihwYiwgZmllbGRfbmFtZSwgZXhwZWN0ZWRfbWF4KQorICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9tYXgsIGdldGF0dHIocGIsIGZpZWxkX25hbWUpKQorICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFZhbHVlRXJyb3IsIFR5cGVFcnJvciksIHNldGF0dHIsIHBiLCBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfbWluIC0gMSkKKyAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChWYWx1ZUVycm9yLCBUeXBlRXJyb3IpLCBzZXRhdHRyLCBwYiwgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX21heCArIDEpCisKKyAgICBUZXN0TWluQW5kTWF4SW50ZWdlcnMoJ29wdGlvbmFsX2ludDMyJywgLSgxIDw8IDMxKSwgKDEgPDwgMzEpIC0gMSkKKyAgICBUZXN0TWluQW5kTWF4SW50ZWdlcnMoJ29wdGlvbmFsX3VpbnQzMicsIDAsIDB4ZmZmZmZmZmYpCisgICAgVGVzdE1pbkFuZE1heEludGVnZXJzKCdvcHRpb25hbF9pbnQ2NCcsIC0oMSA8PCA2MyksICgxIDw8IDYzKSAtIDEpCisgICAgVGVzdE1pbkFuZE1heEludGVnZXJzKCdvcHRpb25hbF91aW50NjQnLCAwLCAweGZmZmZmZmZmZmZmZmZmZmYpCisgICAgIyBBIGJpdCBvZiB3aGl0ZS1ib3ggdGVzdGluZyBzaW5jZSAtMSBpcyBhbiBpbnQgYW5kIG5vdCBhIGxvbmcgaW4gQysrIGFuZAorICAgICMgc28gZ29lcyBkb3duIGEgZGlmZmVyZW50IHBhdGguCisgICAgcGIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoKFZhbHVlRXJyb3IsIFR5cGVFcnJvcikpOgorICAgICAgcGIub3B0aW9uYWxfdWludDY0ID0gaW50ZWdlcl9mbigtKDEgPDwgNjMpKQorCisgICAgcGIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHBiLm9wdGlvbmFsX25lc3RlZF9lbnVtID0gaW50ZWdlcl9mbigxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcGIub3B0aW9uYWxfbmVzdGVkX2VudW0pCisKKyAgZGVmIHRlc3RTaW5nbGVTY2FsYXJCb3VuZHNDaGVja2luZyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgc2VsZi5hc3NldEludGVnZXJCb3VuZHNDaGVja2luZyhsYW1iZGEgeDogeCwgbWVzc2FnZV9tb2R1bGUpCisKKyAgZGVmIHRlc3ROb25TdGFuZGFyZFNpbmdsZVNjYWxhckJvdW5kc0NoZWNraW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBzZWxmLmFzc2V0SW50ZWdlckJvdW5kc0NoZWNraW5nKAorICAgICAgICB0ZXN0X3V0aWwuTm9uU3RhbmRhcmRJbnRlZ2VyLCBtZXNzYWdlX21vZHVsZSkKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyVHlwZVNhZmV0eShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgcHJvdG8gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kLCAxLjEpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQsICdmb28nKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfc3RyaW5nLCAxMCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX2J5dGVzLCAxMCkKKworICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMlswXSA9IDIzCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuX19zZXRpdGVtX18sIDUwMCwgMjMpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5fX3NldGl0ZW1fXywgMCwgJ2FiYycpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5fX3NldGl0ZW1fXywgMCwgW10pCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5fX3NldGl0ZW1fXywKKyAgICAgICAgICAgICAgICAgICAgICAnaW5kZXgnLCAyMykKKworICAgIHByb3RvLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJzInKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfc3RyaW5nLl9fc2V0aXRlbV9fLCAwLCAxMCkKKworICAgICMgUmVwZWF0ZWQgZW51bXMgdGVzdHMuCisgICAgI3Byb3RvLnJlcGVhdGVkX25lc3RlZF9lbnVtLmFwcGVuZCgwKQorCisgIGRlZiB0ZXN0U2luZ2xlU2NhbGFyR2V0dGVyc0FuZFNldHRlcnMoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIHByb3RvID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX2ludDMyKQorICAgIHByb3RvLm9wdGlvbmFsX2ludDMyID0gMQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ub3B0aW9uYWxfaW50MzIpCisKKyAgICBwcm90by5vcHRpb25hbF91aW50NjQgPSAweGZmZmZmZmZmZmZmZgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHhmZmZmZmZmZmZmZmYsIHByb3RvLm9wdGlvbmFsX3VpbnQ2NCkKKyAgICBwcm90by5vcHRpb25hbF91aW50NjQgPSAweGZmZmZmZmZmZmZmZmZmZmYKKyAgICBzZWxmLmFzc2VydEVxdWFsKDB4ZmZmZmZmZmZmZmZmZmZmZiwgcHJvdG8ub3B0aW9uYWxfdWludDY0KQorICAgICMgVE9ETyhyb2JpbnNvbik6IFRlc3QgYWxsIG90aGVyIHNjYWxhciBmaWVsZCB0eXBlcy4KKworICBkZWYgdGVzdEVudW1zKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBwcm90byA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5GT08pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuRk9PKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8uQkFSKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLkJBUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHByb3RvLkJBWikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcy5CQVopCisKKyAgZGVmIHRlc3RFbnVtX05hbWUoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICdGT1JFSUdOX0ZPTycsCisgICAgICAgIG1lc3NhZ2VfbW9kdWxlLkZvcmVpZ25FbnVtLk5hbWUobWVzc2FnZV9tb2R1bGUuRk9SRUlHTl9GT08pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICdGT1JFSUdOX0JBUicsCisgICAgICAgIG1lc3NhZ2VfbW9kdWxlLkZvcmVpZ25FbnVtLk5hbWUobWVzc2FnZV9tb2R1bGUuRk9SRUlHTl9CQVIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICdGT1JFSUdOX0JBWicsCisgICAgICAgIG1lc3NhZ2VfbW9kdWxlLkZvcmVpZ25FbnVtLk5hbWUobWVzc2FnZV9tb2R1bGUuRk9SRUlHTl9CQVopKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9tb2R1bGUuRm9yZWlnbkVudW0uTmFtZSwgMTEzMTIpCisKKyAgICBwcm90byA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnRk9PJywKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLk5lc3RlZEVudW0uTmFtZShwcm90by5GT08pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0ZPTycsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5OYW1lKHByb3RvLkZPTykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnQkFSJywKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLk5lc3RlZEVudW0uTmFtZShwcm90by5CQVIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0JBUicsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5OYW1lKHByb3RvLkJBUikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnQkFaJywKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLk5lc3RlZEVudW0uTmFtZShwcm90by5CQVopKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0JBWicsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5OYW1lKHByb3RvLkJBWikpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBwcm90by5OZXN0ZWRFbnVtLk5hbWUsIDExMzEyKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uTmFtZSwgMTEzMTIpCisKKyAgICAjIENoZWNrIHNvbWUgY29lcmNpb24gY2FzZXMuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgIDExMzEyLjApCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgIE5vbmUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnRk9PJywgbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uTmFtZShUcnVlKSkKKworICBkZWYgdGVzdEVudW1fVmFsdWUoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZV9tb2R1bGUuRk9SRUlHTl9GT08sCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX21vZHVsZS5Gb3JlaWduRW51bS5WYWx1ZSgnRk9SRUlHTl9GT08nKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2VfbW9kdWxlLkZPUkVJR05fRk9PLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9tb2R1bGUuRm9yZWlnbkVudW0uRk9SRUlHTl9GT08pCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2VfbW9kdWxlLkZPUkVJR05fQkFSLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9tb2R1bGUuRm9yZWlnbkVudW0uVmFsdWUoJ0ZPUkVJR05fQkFSJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlX21vZHVsZS5GT1JFSUdOX0JBUiwKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbW9kdWxlLkZvcmVpZ25FbnVtLkZPUkVJR05fQkFSKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlX21vZHVsZS5GT1JFSUdOX0JBWiwKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbW9kdWxlLkZvcmVpZ25FbnVtLlZhbHVlKCdGT1JFSUdOX0JBWicpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZV9tb2R1bGUuRk9SRUlHTl9CQVosCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX21vZHVsZS5Gb3JlaWduRW51bS5GT1JFSUdOX0JBWikKKworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9tb2R1bGUuRm9yZWlnbkVudW0uVmFsdWUsICdGTycpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICBtZXNzYWdlX21vZHVsZS5Gb3JlaWduRW51bS5GTworCisgICAgcHJvdG8gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uRk9PLAorICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5WYWx1ZSgnRk9PJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5GT08sCisgICAgICAgICAgICAgICAgICAgICBwcm90by5OZXN0ZWRFbnVtLkZPTykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uRk9PLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVmFsdWUoJ0ZPTycpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uRk9PLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5CQVIsCisgICAgICAgICAgICAgICAgICAgICBwcm90by5OZXN0ZWRFbnVtLlZhbHVlKCdCQVInKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJBUiwKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLk5lc3RlZEVudW0uQkFSKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5CQVIsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5WYWx1ZSgnQkFSJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5CQVIsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJBWiwKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLk5lc3RlZEVudW0uVmFsdWUoJ0JBWicpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uQkFaLAorICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5CQVopCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJBWiwKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLlZhbHVlKCdCQVonKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJBWiwKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWikKKworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5WYWx1ZSwgJ0ZvbycpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICBwcm90by5OZXN0ZWRFbnVtLlZhbHVlLkZvbworCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5WYWx1ZSwgJ0ZvbycpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5WYWx1ZS5Gb28KKworICBkZWYgdGVzdEVudW1fS2V5c0FuZFZhbHVlcyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgaWYgbWVzc2FnZV9tb2R1bGUgPT0gdW5pdHRlc3RfcGIyOgorICAgICAga2V5cyA9IFsnRk9SRUlHTl9GT08nLCAnRk9SRUlHTl9CQVInLCAnRk9SRUlHTl9CQVonXQorICAgICAgdmFsdWVzID0gWzQsIDUsIDZdCisgICAgICBpdGVtcyA9IFsoJ0ZPUkVJR05fRk9PJywgNCksICgnRk9SRUlHTl9CQVInLCA1KSwgKCdGT1JFSUdOX0JBWicsIDYpXQorICAgIGVsc2U6CisgICAgICBrZXlzID0gWydGT1JFSUdOX1pFUk8nLCAnRk9SRUlHTl9GT08nLCAnRk9SRUlHTl9CQVInLCAnRk9SRUlHTl9CQVonXQorICAgICAgdmFsdWVzID0gWzAsIDQsIDUsIDZdCisgICAgICBpdGVtcyA9IFsoJ0ZPUkVJR05fWkVSTycsIDApLCAoJ0ZPUkVJR05fRk9PJywgNCksCisgICAgICAgICAgICAgICAoJ0ZPUkVJR05fQkFSJywgNSksICgnRk9SRUlHTl9CQVonLCA2KV0KKyAgICBzZWxmLmFzc2VydEVxdWFsKGtleXMsCisgICAgICAgICAgICAgICAgICAgICBsaXN0KG1lc3NhZ2VfbW9kdWxlLkZvcmVpZ25FbnVtLmtleXMoKSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICBsaXN0KG1lc3NhZ2VfbW9kdWxlLkZvcmVpZ25FbnVtLnZhbHVlcygpKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgbGlzdChtZXNzYWdlX21vZHVsZS5Gb3JlaWduRW51bS5pdGVtcygpKSkKKworICAgIHByb3RvID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBpZiBtZXNzYWdlX21vZHVsZSA9PSB1bml0dGVzdF9wYjI6CisgICAgICBrZXlzID0gWydGT08nLCAnQkFSJywgJ0JBWicsICdORUcnXQorICAgICAgdmFsdWVzID0gWzEsIDIsIDMsIC0xXQorICAgICAgaXRlbXMgPSBbKCdGT08nLCAxKSwgKCdCQVInLCAyKSwgKCdCQVonLCAzKSwgKCdORUcnLCAtMSldCisgICAgZWxzZToKKyAgICAgIGtleXMgPSBbJ1pFUk8nLCAnRk9PJywgJ0JBUicsICdCQVonLCAnTkVHJ10KKyAgICAgIHZhbHVlcyA9IFswLCAxLCAyLCAzLCAtMV0KKyAgICAgIGl0ZW1zID0gWygnWkVSTycsIDApLCAoJ0ZPTycsIDEpLCAoJ0JBUicsIDIpLCAoJ0JBWicsIDMpLCAoJ05FRycsIC0xKV0KKyAgICBzZWxmLmFzc2VydEVxdWFsKGtleXMsIGxpc3QocHJvdG8uTmVzdGVkRW51bS5rZXlzKCkpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBsaXN0KHByb3RvLk5lc3RlZEVudW0udmFsdWVzKCkpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMsCisgICAgICAgICAgICAgICAgICAgICBsaXN0KHByb3RvLk5lc3RlZEVudW0uaXRlbXMoKSkpCisKKyAgZGVmIHRlc3RTdGF0aWNQYXJzZUZyb20oc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIHByb3RvMSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhwcm90bzEpCisKKyAgICBzdHJpbmcxID0gcHJvdG8xLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBwcm90bzIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuRnJvbVN0cmluZyhzdHJpbmcxKQorCisgICAgIyBNZXNzYWdlcyBzaG91bGQgYmUgZXF1YWwuCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90bzIsIHByb3RvMSkKKworICBkZWYgdGVzdE1lcmdlRnJvbVNpbmd1bGFyRmllbGQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgICMgVGVzdCBtZXJnZSB3aXRoIGp1c3QgYSBzaW5ndWxhciBmaWVsZC4KKyAgICBwcm90bzEgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMS5vcHRpb25hbF9pbnQzMiA9IDEKKworICAgIHByb3RvMiA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgIyBUaGlzIHNob3VsZG4ndCBnZXQgb3ZlcndyaXR0ZW4uCisgICAgcHJvdG8yLm9wdGlvbmFsX3N0cmluZyA9ICd2YWx1ZScKKworICAgIHByb3RvMi5NZXJnZUZyb20ocHJvdG8xKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8yLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3ZhbHVlJywgcHJvdG8yLm9wdGlvbmFsX3N0cmluZykKKworICBkZWYgdGVzdE1lcmdlRnJvbVJlcGVhdGVkRmllbGQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgICMgVGVzdCBtZXJnZSB3aXRoIGp1c3QgYSByZXBlYXRlZCBmaWVsZC4KKyAgICBwcm90bzEgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMSkKKyAgICBwcm90bzEucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDIpCisKKyAgICBwcm90bzIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMi5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMCkKKyAgICBwcm90bzIuTWVyZ2VGcm9tKHByb3RvMSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8yLnJlcGVhdGVkX2ludDMyWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8yLnJlcGVhdGVkX2ludDMyWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8yLnJlcGVhdGVkX2ludDMyWzJdKQorCisgIGRlZiB0ZXN0TWVyZ2VGcm9tUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAjIFRlc3QgbWVyZ2Ugd2l0aCBhIHJlcGVhdGVkIG5lc3RlZCBtZXNzYWdlLgorICAgIHByb3RvMSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgbSA9IHByb3RvMS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIG0uYmIgPSAxMjMKKyAgICBtID0gcHJvdG8xLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbS5iYiA9IDMyMQorCisgICAgcHJvdG8yID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtID0gcHJvdG8yLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbS5iYiA9IDk5OQorICAgIHByb3RvMi5NZXJnZUZyb20ocHJvdG8xKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTk5LCBwcm90bzIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMjMsIHByb3RvMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsxXS5iYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMyMSwgcHJvdG8yLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzJdLmJiKQorCisgICAgcHJvdG8zID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90bzMucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuTWVyZ2VGcm9tKHByb3RvMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDk5OSwgcHJvdG8zLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdLmJiKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzLCBwcm90bzMucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMV0uYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzMjEsIHByb3RvMy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsyXS5iYikKKworICBkZWYgdGVzdE1lcmdlRnJvbUFsbEZpZWxkcyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgIyBXaXRoIGFsbCBmaWVsZHMgc2V0LgorICAgIHByb3RvMSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhwcm90bzEpCisgICAgcHJvdG8yID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90bzIuTWVyZ2VGcm9tKHByb3RvMSkKKworICAgICMgTWVzc2FnZXMgc2hvdWxkIGJlIGVxdWFsLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8yLCBwcm90bzEpCisKKyAgICAjIFNlcmlhbGl6ZWQgc3RyaW5nIHNob3VsZCBiZSBlcXVhbCB0b28uCisgICAgc3RyaW5nMSA9IHByb3RvMS5TZXJpYWxpemVUb1N0cmluZygpCisgICAgc3RyaW5nMiA9IHByb3RvMi5TZXJpYWxpemVUb1N0cmluZygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmcxLCBzdHJpbmcyKQorCisgIGRlZiB0ZXN0TWVyZ2VGcm9tQnVnKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlMSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgbWVzc2FnZTIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorCisgICAgIyBDYXVzZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB0byBiZSBpbnN0YW50aWF0ZWQgd2l0aGluIG1lc3NhZ2UxLCBldmVuCisgICAgIyB0aG91Z2ggaXQgaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUgInByZXNlbnQiLgorICAgIG1lc3NhZ2UxLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCisgICAgc2VsZi5hc3NlcnRGYWxzZShtZXNzYWdlMS5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICAgICMgTWVyZ2UgaW50byBtZXNzYWdlMi4gIFRoaXMgc2hvdWxkIG5vdCBpbnN0YW50aWF0ZSB0aGUgZmllbGQgaXMgbWVzc2FnZTIuCisgICAgbWVzc2FnZTIuTWVyZ2VGcm9tKG1lc3NhZ2UxKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UobWVzc2FnZTIuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisKKyAgZGVmIHRlc3RDb3B5RnJvbVNpbmd1bGFyRmllbGQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgICMgVGVzdCBjb3B5IHdpdGgganVzdCBhIHNpbmd1bGFyIGZpZWxkLgorICAgIHByb3RvMSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8xLm9wdGlvbmFsX2ludDMyID0gMQorICAgIHByb3RvMS5vcHRpb25hbF9zdHJpbmcgPSAnaW1wb3J0YW50LXRleHQnCisKKyAgICBwcm90bzIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMi5vcHRpb25hbF9zdHJpbmcgPSAndmFsdWUnCisKKyAgICBwcm90bzIuQ29weUZyb20ocHJvdG8xKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8yLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ltcG9ydGFudC10ZXh0JywgcHJvdG8yLm9wdGlvbmFsX3N0cmluZykKKworICBkZWYgdGVzdENvcHlGcm9tUmVwZWF0ZWRGaWVsZChzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgIyBUZXN0IGNvcHkgd2l0aCBhIHJlcGVhdGVkIGZpZWxkLgorICAgIHByb3RvMSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8xLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQorICAgIHByb3RvMS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMikKKworICAgIHByb3RvMiA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8yLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgwKQorICAgIHByb3RvMi5Db3B5RnJvbShwcm90bzEpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvMi5yZXBlYXRlZF9pbnQzMlswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvMi5yZXBlYXRlZF9pbnQzMlsxXSkKKworICBkZWYgdGVzdENvcHlGcm9tQWxsRmllbGRzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICAjIFdpdGggYWxsIGZpZWxkcyBzZXQuCisgICAgcHJvdG8xID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHByb3RvMSkKKyAgICBwcm90bzIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMi5Db3B5RnJvbShwcm90bzEpCisKKyAgICAjIE1lc3NhZ2VzIHNob3VsZCBiZSBlcXVhbC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvMiwgcHJvdG8xKQorCisgICAgIyBTZXJpYWxpemVkIHN0cmluZyBzaG91bGQgYmUgZXF1YWwgdG9vLgorICAgIHN0cmluZzEgPSBwcm90bzEuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHN0cmluZzIgPSBwcm90bzIuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nMSwgc3RyaW5nMikKKworICBkZWYgdGVzdENvcHlGcm9tU2VsZihzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgcHJvdG8xID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90bzEucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgcHJvdG8xLm9wdGlvbmFsX2ludDMyID0gMgorICAgIHByb3RvMS5vcHRpb25hbF9zdHJpbmcgPSAnaW1wb3J0YW50LXRleHQnCisKKyAgICBwcm90bzEuQ29weUZyb20ocHJvdG8xKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8xLnJlcGVhdGVkX2ludDMyWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8xLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ltcG9ydGFudC10ZXh0JywgcHJvdG8xLm9wdGlvbmFsX3N0cmluZykKKworICBkZWYgdGVzdERlZXBDb3B5KHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBwcm90bzEgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMS5vcHRpb25hbF9pbnQzMiA9IDEKKyAgICBwcm90bzIgPSBjb3B5LmRlZXBjb3B5KHByb3RvMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvMi5vcHRpb25hbF9pbnQzMikKKworICAgIHByb3RvMS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMikKKyAgICBwcm90bzEucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDMpCisgICAgY29udGFpbmVyID0gY29weS5kZWVwY29weShwcm90bzEucmVwZWF0ZWRfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbMiwgM10sIGNvbnRhaW5lcikKKyAgICBjb250YWluZXIucmVtb3ZlKGNvbnRhaW5lclswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFszXSwgY29udGFpbmVyKQorCisgICAgbWVzc2FnZTEgPSBwcm90bzEucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBtZXNzYWdlMS5iYiA9IDEKKyAgICBtZXNzYWdlcyA9IGNvcHkuZGVlcGNvcHkocHJvdG8xLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8xLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLCBtZXNzYWdlcykKKyAgICBtZXNzYWdlMS5iYiA9IDIKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHByb3RvMS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSwgbWVzc2FnZXMpCisgICAgbWVzc2FnZXMucmVtb3ZlKG1lc3NhZ2VzWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1lc3NhZ2VzKSwgMCkKKworICAgICMgVE9ETyhhbnVyYWFnKTogSW1wbGVtZW50IGRlZXBjb3B5IGZvciBleHRlbnNpb24gZGljdAorCisgIGRlZiB0ZXN0RGlzY29ubmVjdGluZ0JlZm9yZUNsZWFyKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBwcm90byA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgbmVzdGVkID0gcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKKyAgICBwcm90by5DbGVhcigpCisgICAgc2VsZi5hc3NlcnRJc05vdChuZXN0ZWQsIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKQorICAgIG5lc3RlZC5iYiA9IDIzCisgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQorCisgICAgcHJvdG8gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG5lc3RlZCA9IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCisgICAgbmVzdGVkLmJiID0gNQorICAgIGZvcmVpZ24gPSBwcm90by5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UKKyAgICBmb3JlaWduLmMgPSA2CisgICAgcHJvdG8uQ2xlYXIoKQorICAgIHNlbGYuYXNzZXJ0SXNOb3QobmVzdGVkLCBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydElzTm90KGZvcmVpZ24sIHByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIG5lc3RlZC5iYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDYsIGZvcmVpZ24uYykKKyAgICBuZXN0ZWQuYmIgPSAxNQorICAgIGZvcmVpZ24uYyA9IDE2CisgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlLmMpCisKKyAgZGVmIHRlc3RTdHJpbmdVVEY4RW5jb2Rpbmcoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIHByb3RvID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKworICAgICMgQXNzaWdubWVudCBvZiBhIHVuaWNvZGUgb2JqZWN0IHRvIGEgZmllbGQgb2YgdHlwZSAnYnl0ZXMnIGlzIG5vdCBhbGxvd2VkLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX2J5dGVzJywgdSd1bmljb2RlIG9iamVjdCcpCisKKyAgICAjIENoZWNrIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgaXMgb2YgcHl0aG9uJ3MgJ3VuaWNvZGUnIHR5cGUuCisgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHByb3RvLm9wdGlvbmFsX3N0cmluZyksIHN0cikKKworICAgIHByb3RvLm9wdGlvbmFsX3N0cmluZyA9IHN0cignVGVzdGluZycpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5vcHRpb25hbF9zdHJpbmcsIHN0cignVGVzdGluZycpKQorCisgICAgIyBBc3NpZ24gYSB2YWx1ZSBvZiB0eXBlICdzdHInIHdoaWNoIGNhbiBiZSBlbmNvZGVkIGluIFVURi04LgorICAgIHByb3RvLm9wdGlvbmFsX3N0cmluZyA9IHN0cignVGVzdGluZycpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5vcHRpb25hbF9zdHJpbmcsIHN0cignVGVzdGluZycpKQorCisgICAgIyBUcnkgdG8gYXNzaWduIGEgJ2J5dGVzJyBvYmplY3Qgd2hpY2ggY29udGFpbnMgbm9uLVVURi04LgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0ciwgcHJvdG8sICdvcHRpb25hbF9zdHJpbmcnLCBiJ2FceDgwYScpCisgICAgIyBObyBleGNlcHRpb246IEFzc2lnbiBhbHJlYWR5IGVuY29kZWQgVVRGLTggYnl0ZXMgdG8gYSBzdHJpbmcgZmllbGQuCisgICAgdXRmOF9ieXRlcyA9IHUn0KLQtdGB0YInLmVuY29kZSgndXRmLTgnKQorICAgIHByb3RvLm9wdGlvbmFsX3N0cmluZyA9IHV0ZjhfYnl0ZXMKKyAgICAjIE5vIGV4Y2VwdGlvbjogQXNzaWduIHRoZSBhIG5vbi1hc2NpaSB1bmljb2RlIG9iamVjdC4KKyAgICBwcm90by5vcHRpb25hbF9zdHJpbmcgPSB1J9Ci0LXRgdGCJworICAgICMgTm8gZXhjZXB0aW9uIHRocm93biAobm9ybWFsIHN0ciBhc3NpZ25tZW50IGNvbnRhaW5pbmcgQVNDSUkpLgorICAgIHByb3RvLm9wdGlvbmFsX3N0cmluZyA9ICdhYmMnCisKKyAgZGVmIHRlc3RCeXRlc0luVGV4dEZvcm1hdChzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgcHJvdG8gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMob3B0aW9uYWxfYnl0ZXM9YidceDAwXHg3Zlx4ODBceGZmJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHUnb3B0aW9uYWxfYnl0ZXM6ICJcXDAwMFxcMTc3XFwyMDBcXDM3NyJcbicsIHN0cihwcm90bykpCisKKyAgZGVmIHRlc3RFbXB0eU5lc3RlZE1lc3NhZ2Uoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIHByb3RvID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5NZXJnZUZyb20oCisgICAgICAgIG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorCisgICAgcHJvdG8gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLkNvcHlGcm9tKAorICAgICAgICBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICAgIHByb3RvID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBieXRlc19yZWFkID0gcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuTWVyZ2VGcm9tU3RyaW5nKGInJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGJ5dGVzX3JlYWQpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorCisgICAgcHJvdG8gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhiJycpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorCisgICAgc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBwcm90bzIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGxlbihzZXJpYWxpemVkKSwKKyAgICAgICAgcHJvdG8yLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8yLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorCisKKyMgQ2xhc3MgdG8gdGVzdCBwcm90bzItb25seSBmZWF0dXJlcyAocmVxdWlyZWQsIGV4dGVuc2lvbnMsIGV0Yy4pCitAdGVzdGluZ19yZWZsZWFrcy5UZXN0Q2FzZQorY2xhc3MgUHJvdG8yUmVmbGVjdGlvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGVDb25zdHJ1Y3RvcihzZWxmKToKKyAgICAjIENvbnN0cnVjdG9yIHdpdGggb25seSByZXBlYXRlZCBjb21wb3NpdGUgdHlwZXMgc2hvdWxkIHN1Y2NlZWQuCisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKAorICAgICAgICByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZT1bCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgYmI9dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08pLAorICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKAorICAgICAgICAgICAgICAgIGJiPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKV0sCisgICAgICAgIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZT1bCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0tNDMpLAorICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9NDUzMjQpLAorICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9MTIpXSwKKyAgICAgICAgcmVwZWF0ZWRncm91cD1bCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAoKSwKKyAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cChhPTEpLAorICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwKGE9MildKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgW3VuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgKKyAgICAgICAgICAgIGJiPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuRk9PKSwKKyAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgKKyAgICAgICAgICAgICBiYj11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBUildLAorICAgICAgICBsaXN0KHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBbdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9LTQzKSwKKyAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPTQ1MzI0KSwKKyAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPTEyKV0sCisgICAgICAgIGxpc3QocHJvdG8ucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBbdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwKCksCisgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAoYT0xKSwKKyAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cChhPTIpXSwKKyAgICAgICAgbGlzdChwcm90by5yZXBlYXRlZGdyb3VwKSkKKworICBkZWYgYXNzZXJ0TGlzdHNFcXVhbChzZWxmLCB2YWx1ZXMsIG90aGVycyk6CisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgbGVuKG90aGVycykpCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHZhbHVlcykpOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXNbaV0sIG90aGVyc1tpXSkKKworICBkZWYgdGVzdFNpbXBsZUhhc0JpdHMoc2VsZik6CisgICAgIyBUZXN0IGEgc2NhbGFyLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX2ludDMyKQorICAgICMgSGFzRmllbGQoKSBzaG91bGRuJ3QgYmUgdHJ1ZSBpZiBhbGwgd2UndmUgZG9uZSBpcworICAgICMgcmVhZCB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICBzZWxmLmFzc2VydEZhbHNlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQorICAgIHByb3RvLm9wdGlvbmFsX2ludDMyID0gMQorICAgICMgU2V0dGluZyBhIHZhbHVlIGhvd2V2ZXIgKnNob3VsZCogc2V0IHRoZSAiaGFzIiBiaXQuCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQorICAgIHByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX2ludDMyJykKKyAgICAjIEFuZCBjbGVhcmluZyB0aGF0IHZhbHVlIHNob3VsZCB1bnNldCB0aGUgImhhcyIgYml0LgorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX2ludDMyJykpCisKKyAgZGVmIHRlc3RIYXNCaXRzV2l0aFNpbmdseU5lc3RlZFNjYWxhcihzZWxmKToKKyAgICAjIEhlbHBlciB1c2VkIHRvIHRlc3QgZm9yZWlnbiBtZXNzYWdlcyBhbmQgZ3JvdXBzLgorICAgICMKKyAgICAjIGNvbXBvc2l0ZV9maWVsZF9uYW1lIHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIG5vbi1yZXBlYXRlZAorICAgICMgY29tcG9zaXRlIChpLmUuLCBmb3JlaWduIG9yIGdyb3VwKSBmaWVsZCBpbiBUZXN0QWxsVHlwZXMsCisgICAgIyBhbmQgc2NhbGFyX2ZpZWxkX25hbWUgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGFuIGludGVnZXItdmFsdWVkCisgICAgIyBzY2FsYXIgZmllbGQgd2l0aGluIHRoYXQgY29tcG9zaXRlLgorICAgICMKKyAgICAjIEkgbmV2ZXIgdGhvdWdodCBJJ2QgbWlzcyBDKysgbWFjcm9zIGFuZCB0ZW1wbGF0ZXMgc28gbXVjaC4gOigKKyAgICAjIFRoaXMgaGVscGVyIGlzIHNlbWFudGljYWxseSBqdXN0OgorICAgICMKKyAgICAjICAgYXNzZXJ0IHByb3RvLmNvbXBvc2l0ZV9maWVsZC5zY2FsYXJfZmllbGQgPT0gMAorICAgICMgICBhc3NlcnQgbm90IHByb3RvLmNvbXBvc2l0ZV9maWVsZC5IYXNGaWVsZCgnc2NhbGFyX2ZpZWxkJykKKyAgICAjICAgYXNzZXJ0IG5vdCBwcm90by5IYXNGaWVsZCgnY29tcG9zaXRlX2ZpZWxkJykKKyAgICAjCisgICAgIyAgIHByb3RvLmNvbXBvc2l0ZV9maWVsZC5zY2FsYXJfZmllbGQgPSAxMAorICAgICMgICBvbGRfY29tcG9zaXRlX2ZpZWxkID0gcHJvdG8uY29tcG9zaXRlX2ZpZWxkCisgICAgIworICAgICMgICBhc3NlcnQgcHJvdG8uY29tcG9zaXRlX2ZpZWxkLnNjYWxhcl9maWVsZCA9PSAxMAorICAgICMgICBhc3NlcnQgcHJvdG8uY29tcG9zaXRlX2ZpZWxkLkhhc0ZpZWxkKCdzY2FsYXJfZmllbGQnKQorICAgICMgICBhc3NlcnQgcHJvdG8uSGFzRmllbGQoJ2NvbXBvc2l0ZV9maWVsZCcpCisgICAgIworICAgICMgICBwcm90by5DbGVhckZpZWxkKCdjb21wb3NpdGVfZmllbGQnKQorICAgICMKKyAgICAjICAgYXNzZXJ0IG5vdCBwcm90by5jb21wb3NpdGVfZmllbGQuSGFzRmllbGQoJ3NjYWxhcl9maWVsZCcpCisgICAgIyAgIGFzc2VydCBub3QgcHJvdG8uSGFzRmllbGQoJ2NvbXBvc2l0ZV9maWVsZCcpCisgICAgIyAgIGFzc2VydCBwcm90by5jb21wb3NpdGVfZmllbGQuc2NhbGFyX2ZpZWxkID09IDAKKyAgICAjCisgICAgIyAgICMgTm93IGVuc3VyZSB0aGF0IENsZWFyRmllbGQoJ2NvbXBvc2l0ZV9maWVsZCcpIGRpc2Nvbm5lY3RlZAorICAgICMgICAjIHRoZSBvbGQgZmllbGQgb2JqZWN0IGZyb20gdGhlIG9iamVjdCB0cmVlLi4uCisgICAgIyAgIGFzc2VydCBvbGRfY29tcG9zaXRlX2ZpZWxkIGlzIG5vdCBwcm90by5jb21wb3NpdGVfZmllbGQKKyAgICAjICAgb2xkX2NvbXBvc2l0ZV9maWVsZC5zY2FsYXJfZmllbGQgPSAyMAorICAgICMgICBhc3NlcnQgbm90IHByb3RvLmNvbXBvc2l0ZV9maWVsZC5IYXNGaWVsZCgnc2NhbGFyX2ZpZWxkJykKKyAgICAjICAgYXNzZXJ0IG5vdCBwcm90by5IYXNGaWVsZCgnY29tcG9zaXRlX2ZpZWxkJykKKyAgICBkZWYgVGVzdENvbXBvc2l0ZUhhc0JpdHMoY29tcG9zaXRlX2ZpZWxkX25hbWUsIHNjYWxhcl9maWVsZF9uYW1lKToKKyAgICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgICAjIEZpcnN0LCBjaGVjayB0aGF0IHdlIGNhbiBnZXQgdGhlIHNjYWxhciB2YWx1ZSwgYW5kIHNlZSB0aGF0IGl0J3MgdGhlCisgICAgICAjIGRlZmF1bHQgKDApLCBidXQgdGhhdCBwcm90by5IYXNGaWVsZCgnb21wb3NpdGUnKSBhbmQKKyAgICAgICMgcHJvdG8uY29tcG9zaXRlLkhhc0ZpZWxkKCdzY2FsYXInKSB3aWxsIHN0aWxsIHJldHVybiBGYWxzZS4KKyAgICAgIGNvbXBvc2l0ZV9maWVsZCA9IGdldGF0dHIocHJvdG8sIGNvbXBvc2l0ZV9maWVsZF9uYW1lKQorICAgICAgb3JpZ2luYWxfc2NhbGFyX3ZhbHVlID0gZ2V0YXR0cihjb21wb3NpdGVfZmllbGQsIHNjYWxhcl9maWVsZF9uYW1lKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBvcmlnaW5hbF9zY2FsYXJfdmFsdWUpCisgICAgICAjIEFzc2VydCB0aGF0IHRoZSBjb21wb3NpdGUgb2JqZWN0IGRvZXMgbm90ICJoYXZlIiB0aGUgc2NhbGFyLgorICAgICAgc2VsZi5hc3NlcnRGYWxzZShjb21wb3NpdGVfZmllbGQuSGFzRmllbGQoc2NhbGFyX2ZpZWxkX25hbWUpKQorICAgICAgIyBBc3NlcnQgdGhhdCBwcm90byBkb2VzIG5vdCAiaGF2ZSIgdGhlIGNvbXBvc2l0ZSBmaWVsZC4KKyAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSGFzRmllbGQoY29tcG9zaXRlX2ZpZWxkX25hbWUpKQorCisgICAgICAjIE5vdyBzZXQgdGhlIHNjYWxhciB3aXRoaW4gdGhlIGNvbXBvc2l0ZSBmaWVsZC4gIEVuc3VyZSB0aGF0IHRoZSBzZXR0aW5nCisgICAgICAjIGlzIHJlZmxlY3RlZCwgYW5kIHRoYXQgcHJvdG8uSGFzRmllbGQoJ2NvbXBvc2l0ZScpIGFuZAorICAgICAgIyBwcm90by5jb21wb3NpdGUuSGFzRmllbGQoJ3NjYWxhcicpIG5vdyBib3RoIHJldHVybiBUcnVlLgorICAgICAgbmV3X3ZhbCA9IDIwCisgICAgICBzZXRhdHRyKGNvbXBvc2l0ZV9maWVsZCwgc2NhbGFyX2ZpZWxkX25hbWUsIG5ld192YWwpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld192YWwsIGdldGF0dHIoY29tcG9zaXRlX2ZpZWxkLCBzY2FsYXJfZmllbGRfbmFtZSkpCisgICAgICAjIEhvbGQgb24gdG8gYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgY29tcG9zaXRlX2ZpZWxkIG9iamVjdC4KKyAgICAgIG9sZF9jb21wb3NpdGVfZmllbGQgPSBjb21wb3NpdGVfZmllbGQKKyAgICAgICMgQXNzZXJ0IHRoYXQgdGhlIGhhcyBtZXRob2RzIG5vdyByZXR1cm4gdHJ1ZS4KKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21wb3NpdGVfZmllbGQuSGFzRmllbGQoc2NhbGFyX2ZpZWxkX25hbWUpKQorICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKGNvbXBvc2l0ZV9maWVsZF9uYW1lKSkKKworICAgICAgIyBOb3cgY2FsbCB0aGUgY2xlYXIgbWV0aG9kLi4uCisgICAgICBwcm90by5DbGVhckZpZWxkKGNvbXBvc2l0ZV9maWVsZF9uYW1lKQorCisgICAgICAjIC4uLmFuZCBlbnN1cmUgdGhhdCB0aGUgImhhcyIgYml0cyBhcmUgYWxsIGJhY2sgdG8gRmFsc2UuLi4KKyAgICAgIGNvbXBvc2l0ZV9maWVsZCA9IGdldGF0dHIocHJvdG8sIGNvbXBvc2l0ZV9maWVsZF9uYW1lKQorICAgICAgc2VsZi5hc3NlcnRGYWxzZShjb21wb3NpdGVfZmllbGQuSGFzRmllbGQoc2NhbGFyX2ZpZWxkX25hbWUpKQorICAgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5IYXNGaWVsZChjb21wb3NpdGVfZmllbGRfbmFtZSkpCisgICAgICAjIC4uLmFuZCBlbnN1cmUgdGhhdCB0aGUgc2NhbGFyIGZpZWxkIGhhcyByZXR1cm5lZCB0byBpdHMgZGVmYXVsdC4KKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXR0cihjb21wb3NpdGVfZmllbGQsIHNjYWxhcl9maWVsZF9uYW1lKSkKKworICAgICAgc2VsZi5hc3NlcnRJc05vdChvbGRfY29tcG9zaXRlX2ZpZWxkLCBjb21wb3NpdGVfZmllbGQpCisgICAgICBzZXRhdHRyKG9sZF9jb21wb3NpdGVfZmllbGQsIHNjYWxhcl9maWVsZF9uYW1lLCBuZXdfdmFsKQorICAgICAgc2VsZi5hc3NlcnRGYWxzZShjb21wb3NpdGVfZmllbGQuSGFzRmllbGQoc2NhbGFyX2ZpZWxkX25hbWUpKQorICAgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5IYXNGaWVsZChjb21wb3NpdGVfZmllbGRfbmFtZSkpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGF0dHIoY29tcG9zaXRlX2ZpZWxkLCBzY2FsYXJfZmllbGRfbmFtZSkpCisKKyAgICAjIFRlc3Qgc2ltcGxlLCBzaW5nbGUtbGV2ZWwgbmVzdGluZyB3aGVuIHdlIHNldCBhIHNjYWxhci4KKyAgICBUZXN0Q29tcG9zaXRlSGFzQml0cygnb3B0aW9uYWxncm91cCcsICdhJykKKyAgICBUZXN0Q29tcG9zaXRlSGFzQml0cygnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnLCAnYmInKQorICAgIFRlc3RDb21wb3NpdGVIYXNCaXRzKCdvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UnLCAnYycpCisgICAgVGVzdENvbXBvc2l0ZUhhc0JpdHMoJ29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlJywgJ2QnKQorCisgIGRlZiB0ZXN0SGFzQml0c1doZW5Nb2RpZnlpbmdSZXBlYXRlZEZpZWxkcyhzZWxmKToKKyAgICAjIFRlc3QgbmVzdGluZyB3aGVuIHdlIGFkZCBhbiBlbGVtZW50IHRvIGEgcmVwZWF0ZWQgZmllbGQgaW4gYSBzdWJtZXNzYWdlLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cygpCisgICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UubmVzdGVkbWVzc2FnZV9yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBbNV0sIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLm5lc3RlZG1lc3NhZ2VfcmVwZWF0ZWRfaW50MzIpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorCisgICAgIyBEbyB0aGUgc2FtZSB0ZXN0LCBidXQgd2l0aCBhIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZCB3aXRoaW4gdGhlCisgICAgIyBzdWJtZXNzYWdlLgorICAgIHByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykKKyAgICBzZWxmLmFzc2VydEZhbHNlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorICAgIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLm5lc3RlZG1lc3NhZ2VfcmVwZWF0ZWRfZm9yZWlnbm1lc3NhZ2UuYWRkKCkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisKKyAgZGVmIHRlc3RIYXNCaXRzRm9yTWFueUxldmVsc09mTmVzdGluZyhzZWxmKToKKyAgICAjIFRlc3QgbmVzdGluZyBtYW55IGxldmVscyBkZWVwLgorICAgIHJlY3Vyc2l2ZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0TXV0dWFsUmVjdXJzaW9uQSgpCisgICAgc2VsZi5hc3NlcnRGYWxzZShyZWN1cnNpdmVfcHJvdG8uSGFzRmllbGQoJ2JiJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCByZWN1cnNpdmVfcHJvdG8uYmIuYS5iYi5hLmJiLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVjdXJzaXZlX3Byb3RvLkhhc0ZpZWxkKCdiYicpKQorICAgIHJlY3Vyc2l2ZV9wcm90by5iYi5hLmJiLmEuYmIub3B0aW9uYWxfaW50MzIgPSA1CisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCByZWN1cnNpdmVfcHJvdG8uYmIuYS5iYi5hLmJiLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWN1cnNpdmVfcHJvdG8uSGFzRmllbGQoJ2JiJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKHJlY3Vyc2l2ZV9wcm90by5iYi5IYXNGaWVsZCgnYScpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWN1cnNpdmVfcHJvdG8uYmIuYS5IYXNGaWVsZCgnYmInKSkKKyAgICBzZWxmLmFzc2VydFRydWUocmVjdXJzaXZlX3Byb3RvLmJiLmEuYmIuSGFzRmllbGQoJ2EnKSkKKyAgICBzZWxmLmFzc2VydFRydWUocmVjdXJzaXZlX3Byb3RvLmJiLmEuYmIuYS5IYXNGaWVsZCgnYmInKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKHJlY3Vyc2l2ZV9wcm90by5iYi5hLmJiLmEuYmIuSGFzRmllbGQoJ2EnKSkKKyAgICBzZWxmLmFzc2VydFRydWUocmVjdXJzaXZlX3Byb3RvLmJiLmEuYmIuYS5iYi5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKworICBkZWYgdGVzdFNpbmd1bGFyTGlzdEV4dGVuc2lvbnMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uXSA9IDEKKyAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24gIF0gPSA1CisgICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiBdID0gJ2ZvbycKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgWyAodW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgLCA1KSwKKyAgICAgICAgKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbiwgMSksCisgICAgICAgICh1bml0dGVzdF9wYjIub3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiAsICdmb28nKSBdLAorICAgICAgcHJvdG8uTGlzdEZpZWxkcygpKQorICAgIGRlbCBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbl0KKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBbKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24sIDUpLAorICAgICAgICAgKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uLCAnZm9vJyldLAorICAgICAgICBwcm90by5MaXN0RmllbGRzKCkpCisKKyAgZGVmIHRlc3RSZXBlYXRlZExpc3RFeHRlbnNpb25zKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl0uYXBwZW5kKDEpCisgICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICBdLmFwcGVuZCg1KQorICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgXS5hcHBlbmQoMTEpCisgICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiBdLmFwcGVuZCgnZm9vJykKKyAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uIF0uYXBwZW5kKCdiYXInKQorICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gXS5hcHBlbmQoJ2JheicpCisgICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICBdID0gMjEKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgWyAodW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgLCAyMSksCisgICAgICAgICh1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAsIFs1LCAxMV0pLAorICAgICAgICAodW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uLCBbMV0pLAorICAgICAgICAodW5pdHRlc3RfcGIyLnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pIF0sCisgICAgICBwcm90by5MaXN0RmllbGRzKCkpCisgICAgZGVsIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl0KKyAgICBkZWwgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl0KKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBbKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24sIDIxKSwKKyAgICAgICAgICh1bml0dGVzdF9wYjIucmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24sIFsxXSldLAorICAgICAgICBwcm90by5MaXN0RmllbGRzKCkpCisKKyAgZGVmIHRlc3RMaXN0RmllbGRzQW5kRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0RmllbGRPcmRlcmluZ3MoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKHByb3RvKQorICAgIHVuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25faW50CisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgIFsgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ215X2ludCcgICBdLCAxKSwKKyAgICAgICAgKHVuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25faW50ICAgICAgICAgICAgICAgLCAyMyksCisgICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydteV9zdHJpbmcnXSwgJ2ZvbycpLAorICAgICAgICAodW5pdHRlc3RfcGIyLm15X2V4dGVuc2lvbl9zdHJpbmcgICAgICAgICAgICAsICdiYXInKSwKKyAgICAgICAgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ215X2Zsb2F0JyBdLCAxLjApIF0sCisgICAgICBwcm90by5MaXN0RmllbGRzKCkpCisKKyAgZGVmIHRlc3REZWZhdWx0VmFsdWVzKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX2ludDY0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfdWludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfdWludDY0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfc2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfc2ludDY0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfZml4ZWQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX2ZpeGVkNjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9zZml4ZWQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX3NmaXhlZDY0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMC4wLCBwcm90by5vcHRpb25hbF9mbG9hdCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAuMCwgcHJvdG8ub3B0aW9uYWxfZG91YmxlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIHByb3RvLm9wdGlvbmFsX2Jvb2wpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgcHJvdG8ub3B0aW9uYWxfc3RyaW5nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLCBwcm90by5vcHRpb25hbF9ieXRlcykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDEsIHByb3RvLmRlZmF1bHRfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgcHJvdG8uZGVmYXVsdF9pbnQ2NCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQzLCBwcm90by5kZWZhdWx0X3VpbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQ0LCBwcm90by5kZWZhdWx0X3VpbnQ2NCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKC00NSwgcHJvdG8uZGVmYXVsdF9zaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0NiwgcHJvdG8uZGVmYXVsdF9zaW50NjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0NywgcHJvdG8uZGVmYXVsdF9maXhlZDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDgsIHByb3RvLmRlZmF1bHRfZml4ZWQ2NCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQ5LCBwcm90by5kZWZhdWx0X3NmaXhlZDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTUwLCBwcm90by5kZWZhdWx0X3NmaXhlZDY0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNTEuNSwgcHJvdG8uZGVmYXVsdF9mbG9hdCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUyZTMsIHByb3RvLmRlZmF1bHRfZG91YmxlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgcHJvdG8uZGVmYXVsdF9ib29sKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2hlbGxvJywgcHJvdG8uZGVmYXVsdF9zdHJpbmcpCisgICAgc2VsZi5hc3NlcnRFcXVhbChiJ3dvcmxkJywgcHJvdG8uZGVmYXVsdF9ieXRlcykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSLCBwcm90by5kZWZhdWx0X25lc3RlZF9lbnVtKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSLCBwcm90by5kZWZhdWx0X2ZvcmVpZ25fZW51bSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X2ltcG9ydF9wYjIuSU1QT1JUX0JBUiwKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLmRlZmF1bHRfaW1wb3J0X2VudW0pCisKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcdTEyMzQnLCBwcm90by51dGY4X3N0cmluZykKKworICBkZWYgdGVzdEhhc0ZpZWxkV2l0aFVua25vd25GaWVsZE5hbWUoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwcm90by5IYXNGaWVsZCwgJ25vbmV4aXN0ZW50X2ZpZWxkJykKKworICBkZWYgdGVzdENsZWFyUmVtb3Zlc0NoaWxkcmVuKHNlbGYpOgorICAgICMgTWFrZSBzdXJlIHRoZXJlIGFyZW4ndCBhbnkgaW1wbGVtZW50YXRpb24gYnVncyB0aGF0IGFyZSBvbmx5IHBhcnRpYWxseQorICAgICMgY2xlYXJpbmcgdGhlIG1lc3NhZ2UgKHdoaWNoIGNhbiBoYXBwZW4gaW4gdGhlIG1vcmUgY29tcGxleCBDKysKKyAgICAjIGltcGxlbWVudGF0aW9uIHdoaWNoIGhhcyBwYXJhbGxlbCBtZXNzYWdlIGxpc3RzKS4KKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWRGb3JlaWduKCkKKyAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICBwcm90by5yZXBlYXRlZF9tZXNzYWdlLmFkZCgpCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZEZvcmVpZ24oKQorICAgIHByb3RvLkNvcHlGcm9tKHByb3RvMikKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBsYW1iZGE6IHByb3RvLnJlcGVhdGVkX21lc3NhZ2VbNV0pCisKKyAgZGVmIHRlc3RTaW5nbGVTY2FsYXJDbGVhckZpZWxkKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgIyBTaG91bGQgYmUgYWxsb3dlZCB0byBjbGVhciBzb21ldGhpbmcgdGhhdCdzIG5vdCB0aGVyZSAoYSBuby1vcCkuCisgICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQorICAgIHByb3RvLm9wdGlvbmFsX2ludDMyID0gMQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgICBwcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9pbnQzMicpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEZhbHNlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQorICAgICMgVE9ETyhyb2JpbnNvbik6IFRlc3QgYWxsIG90aGVyIHNjYWxhciBmaWVsZCB0eXBlcy4KKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFycyhzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5yZXBlYXRlZF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDUpCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEwKQorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxNSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8ucmVwZWF0ZWRfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMTAsIDE1XSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisKKyAgICAjIFRlc3Qgc2luZ2xlIHJldHJpZXZhbC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHByb3RvLnJlcGVhdGVkX2ludDMyWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTUsIHByb3RvLnJlcGVhdGVkX2ludDMyWy0xXSkKKyAgICAjIFRlc3Qgb3V0LW9mLWJvdW5kcyBpbmRpY2VzLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZ2V0aXRlbV9fLCAxMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZ2V0aXRlbV9fLCAtMTIzNCkKKyAgICAjIFRlc3QgaW5jb3JyZWN0IHR5cGVzIHBhc3NlZCB0byBfX2dldGl0ZW1fXy4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZ2V0aXRlbV9fLCAnZm9vJykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZ2V0aXRlbV9fLCBOb25lKQorCisgICAgIyBUZXN0IHNpbmdsZSBhc3NpZ25tZW50LgorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyWzFdID0gMjAKKyAgICBzZWxmLmFzc2VydEVxdWFsKFs1LCAyMCwgMTVdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKKworICAgICMgVGVzdCBpbnNlcnRpb24uCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuaW5zZXJ0KDEsIDI1KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDI1LCAyMCwgMTVdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKKworICAgICMgVGVzdCBzbGljZSByZXRyaWV2YWwuCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDMwKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzI1LCAyMCwgMTVdLCBwcm90by5yZXBlYXRlZF9pbnQzMlsxOjRdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDI1LCAyMCwgMTUsIDMwXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbOl0pCisKKyAgICAjIFRlc3Qgc2xpY2UgYXNzaWdubWVudCB3aXRoIGFuIGl0ZXJhdG9yCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMTo0XSA9IChpIGZvciBpIGluIHJhbmdlKDMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDAsIDEsIDIsIDMwXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisKKyAgICAjIFRlc3Qgc2xpY2UgYXNzaWdubWVudC4KKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMlsxOjRdID0gWzM1LCA0MCwgNDVdCisgICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMzUsIDQwLCA0NSwgMzBdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKKworICAgICMgVGVzdCB0aGF0IHdlIGNhbiB1c2UgdGhlIGZpZWxkIGFzIGFuIGl0ZXJhdG9yLgorICAgIHJlc3VsdCA9IFtdCisgICAgZm9yIGkgaW4gcHJvdG8ucmVwZWF0ZWRfaW50MzI6CisgICAgICByZXN1bHQuYXBwZW5kKGkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMzUsIDQwLCA0NSwgMzBdLCByZXN1bHQpCisKKyAgICAjIFRlc3Qgc2luZ2xlIGRlbGV0aW9uLgorICAgIGRlbCBwcm90by5yZXBlYXRlZF9pbnQzMlsyXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDM1LCA0NSwgMzBdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKKworICAgICMgVGVzdCBzbGljZSBkZWxldGlvbi4KKyAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMjpdCisgICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMzVdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKKworICAgICMgVGVzdCBleHRlbmRpbmcuCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuZXh0ZW5kKFszLCAxM10pCisgICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMzUsIDMsIDEzXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisKKyAgICAjIFRlc3QgY2xlYXJpbmcuCisgICAgcHJvdG8uQ2xlYXJGaWVsZCgncmVwZWF0ZWRfaW50MzInKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8ucmVwZWF0ZWRfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQorCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5yZXBlYXRlZF9pbnQzMlstMV0pCisgICAgIyBUZXN0IGFzc2lnbm1lbnQgdG8gYSBuZWdhdGl2ZSBpbmRleC4KKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMlstMV0gPSAyCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90by5yZXBlYXRlZF9pbnQzMlstMV0pCisKKyAgICAjIFRlc3QgZGVsZXRpb24gYXQgbmVnYXRpdmUgaW5kaWNlcy4KKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMls6XSA9IFswLCAxLCAyLCAzXQorICAgIGRlbCBwcm90by5yZXBlYXRlZF9pbnQzMlstMV0KKyAgICBzZWxmLmFzc2VydEVxdWFsKFswLCAxLCAyXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisKKyAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbLTJdCisgICAgc2VsZi5hc3NlcnRFcXVhbChbMCwgMl0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQorCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuX19kZWxpdGVtX18sIC0zKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZGVsaXRlbV9fLCAzMDApCisKKyAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbLTI6LTFdCisgICAgc2VsZi5hc3NlcnRFcXVhbChbMl0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQorCisgICAgZGVsIHByb3RvLnJlcGVhdGVkX2ludDMyWzEwMDoxMDAwMF0KKyAgICBzZWxmLmFzc2VydEVxdWFsKFsyXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisKKyAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhcnNSZW1vdmUoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8ucmVwZWF0ZWRfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCg1KQorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNSkKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgbGVuKHByb3RvLnJlcGVhdGVkX2ludDMyKSkKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5yZW1vdmUoNSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMCwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBwcm90by5yZXBlYXRlZF9pbnQzMlsxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHByb3RvLnJlcGVhdGVkX2ludDMyWzJdKQorCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIucmVtb3ZlKDUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAsIHByb3RvLnJlcGVhdGVkX2ludDMyWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMV0pCisKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5yZW1vdmUoMTApCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMF0pCisKKyAgICAjIFJlbW92ZSBhIG5vbi1leGlzdGVudCBlbGVtZW50LgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLnJlbW92ZSwgMTIzKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRTY2FsYXJzUmV2ZXJzZV9FbXB0eShzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5yZXBlYXRlZF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCisKKyAgICBzZWxmLmFzc2VydElzTm9uZShwcm90by5yZXBlYXRlZF9pbnQzMi5yZXZlcnNlKCkpCisKKyAgICBzZWxmLmFzc2VydEZhbHNlKHByb3RvLnJlcGVhdGVkX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHByb3RvLnJlcGVhdGVkX2ludDMyKSkKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyc1JldmVyc2VfTm9uRW1wdHkoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8ucmVwZWF0ZWRfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQorCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDIpCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDMpCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDQpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCisKKyAgICBzZWxmLmFzc2VydElzTm9uZShwcm90by5yZXBlYXRlZF9pbnQzMi5yZXZlcnNlKCkpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBwcm90by5yZXBlYXRlZF9pbnQzMlswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHByb3RvLnJlcGVhdGVkX2ludDMyWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMl0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5yZXBlYXRlZF9pbnQzMlszXSkKKworICBkZWYgdGVzdFJlcGVhdGVkQ29tcG9zaXRlcyhzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQorICAgIG0wID0gcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBtMSA9IHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKKyAgICBzZWxmLmFzc2VydExpc3RzRXF1YWwoW20wLCBtMV0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtMCwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKQorCisgICAgIyBUZXN0IG91dC1vZi1ib3VuZHMgaW5kaWNlcy4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5fX2dldGl0ZW1fXywKKyAgICAgICAgICAgICAgICAgICAgICAxMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLl9fZ2V0aXRlbV9fLAorICAgICAgICAgICAgICAgICAgICAgIC0xMjM0KQorCisgICAgIyBUZXN0IGluY29ycmVjdCB0eXBlcyBwYXNzZWQgdG8gX19nZXRpdGVtX18uCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5fX2dldGl0ZW1fXywKKyAgICAgICAgICAgICAgICAgICAgICAnZm9vJykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLl9fZ2V0aXRlbV9fLAorICAgICAgICAgICAgICAgICAgICAgIE5vbmUpCisKKyAgICAjIFRlc3Qgc2xpY2UgcmV0cmlldmFsLgorICAgIG0yID0gcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBtMyA9IHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbTQgPSBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbCgKKyAgICAgICAgW20xLCBtMiwgbTNdLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsxOjRdKQorICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbCgKKyAgICAgICAgW20wLCBtMSwgbTIsIG0zLCBtNF0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzpdKQorICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbCgKKyAgICAgICAgW20wLCBtMV0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzoyXSkKKyAgICBzZWxmLmFzc2VydExpc3RzRXF1YWwoCisgICAgICAgIFttMiwgbTMsIG00XSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMjpdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIG0wLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXSkKKyAgICBzZWxmLmFzc2VydExpc3RzRXF1YWwoCisgICAgICAgIFttMF0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzoxXSkKKworICAgICMgVGVzdCB0aGF0IHdlIGNhbiB1c2UgdGhlIGZpZWxkIGFzIGFuIGl0ZXJhdG9yLgorICAgIHJlc3VsdCA9IFtdCisgICAgZm9yIGkgaW4gcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2U6CisgICAgICByZXN1bHQuYXBwZW5kKGkpCisgICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKFttMCwgbTEsIG0yLCBtMywgbTRdLCByZXN1bHQpCisKKyAgICAjIFRlc3Qgc2luZ2xlIGRlbGV0aW9uLgorICAgIGRlbCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsyXQorICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbChbbTAsIG0xLCBtMywgbTRdLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKKworICAgICMgVGVzdCBzbGljZSBkZWxldGlvbi4KKyAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMjpdCisgICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKFttMCwgbTFdLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKKworICAgICMgVGVzdCBleHRlbmRpbmcuCisgICAgbjEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoYmI9MSkKKyAgICBuMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZShiYj0yKQorICAgIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmV4dGVuZChbbjEsbjJdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG4xLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsyXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG4yLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVszXSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuZXh0ZW5kLCBuMSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuZXh0ZW5kLCBbMF0pCisgICAgd3JvbmdfbWVzc2FnZV90eXBlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmV4dGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICBbd3JvbmdfbWVzc2FnZV90eXBlXSkKKworICAgICMgVGVzdCBjbGVhcmluZy4KKyAgICBwcm90by5DbGVhckZpZWxkKCdyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisKKyAgICAjIFRlc3QgY29uc3RydWN0aW5nIGFuIGVsZW1lbnQgd2hpbGUgYWRkaW5nIGl0LgorICAgIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZChiYj0yMykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uYmIpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQsIDIzKQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uKToKKyAgICAgIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdID0gMjMKKworICBkZWYgdGVzdFJlcGVhdGVkQ29tcG9zaXRlUmVtb3ZlKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisgICAgbTAgPSBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgICMgTmVlZCB0byBzZXQgc29tZSBkaWZmZXJlbnRpYXRpbmcgdmFyaWFibGUgc28gbTAgIT0gbTEgIT0gbTI6CisgICAgbTAuYmIgPSBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisgICAgbTEgPSBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIG0xLmJiID0gbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtMCAhPSBtMSkKKyAgICBtMiA9IHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbTIuYmIgPSBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKFttMCwgbTEsIG0yXSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisgICAgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UucmVtb3ZlKG0wKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG0xLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG0yLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsxXSkKKworICAgICMgUmVtb3ZpbmcgbTAgYWdhaW4gb3IgcmVtb3ZpbmcgTm9uZSBzaG91bGQgcmFpc2UgZXJyb3IKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5yZW1vdmUsIG0wKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnJlbW92ZSwgTm9uZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisKKyAgICBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5yZW1vdmUobTIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobTEsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGVSZXZlcnNlX0VtcHR5KHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICBzZWxmLmFzc2VydEZhbHNlKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKKworICAgIHNlbGYuYXNzZXJ0SXNOb25lKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnJldmVyc2UoKSkKKworICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGVSZXZlcnNlX05vbkVtcHR5KHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICBzZWxmLmFzc2VydEZhbHNlKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKKworICAgIG0wID0gcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBtMC5iYiA9IGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKKyAgICBtMSA9IHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbTEuYmIgPSBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisgICAgbTIgPSBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIG0yLmJiID0gbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbChbbTAsIG0xLCBtMl0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorCisgICAgc2VsZi5hc3NlcnRJc05vbmUocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UucmV2ZXJzZSgpKQorCisgICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKFttMiwgbTEsIG0wXSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RIYW5kV3JpdHRlblJlZmxlY3Rpb24oc2VsZik6CisgICAgIyBIYW5kIHdyaXR0ZW4gZXh0ZW5zaW9ucyBhcmUgb25seSBzdXBwb3J0ZWQgYnkgdGhlIHB1cmUtUHl0aG9uCisgICAgIyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQVBJLgorICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgIT0gJ3B5dGhvbic6CisgICAgICByZXR1cm4KKworICAgIEZpZWxkRGVzY3JpcHRvciA9IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yCisgICAgZm9vX2ZpZWxkX2Rlc2NyaXB0b3IgPSBGaWVsZERlc2NyaXB0b3IoCisgICAgICAgIG5hbWU9J2Zvb19maWVsZCcsIGZ1bGxfbmFtZT0nTXlQcm90by5mb29fZmllbGQnLAorICAgICAgICBpbmRleD0wLCBudW1iZXI9MSwgdHlwZT1GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQ2NCwKKyAgICAgICAgY3BwX3R5cGU9RmllbGREZXNjcmlwdG9yLkNQUFRZUEVfSU5UNjQsCisgICAgICAgIGxhYmVsPUZpZWxkRGVzY3JpcHRvci5MQUJFTF9PUFRJT05BTCwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgICBjb250YWluaW5nX3R5cGU9Tm9uZSwgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLAorICAgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgICBvcHRpb25zPWRlc2NyaXB0b3JfcGIyLkZpZWxkT3B0aW9ucygpLAorICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgIGNyZWF0ZV9rZXk9ZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSkKKyAgICBteWRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgICAgICAgIG5hbWU9J015UHJvdG8nLCBmdWxsX25hbWU9J015UHJvdG8nLCBmaWxlbmFtZT0naWdub3JlZCcsCisgICAgICAgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLCBuZXN0ZWRfdHlwZXM9W10sIGVudW1fdHlwZXM9W10sCisgICAgICAgIGZpZWxkcz1bZm9vX2ZpZWxkX2Rlc2NyaXB0b3JdLCBleHRlbnNpb25zPVtdLAorICAgICAgICBvcHRpb25zPWRlc2NyaXB0b3JfcGIyLk1lc3NhZ2VPcHRpb25zKCksCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgY3JlYXRlX2tleT1kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KQorCisgICAgY2xhc3MgTXlQcm90b0NsYXNzKAorICAgICAgICBtZXNzYWdlLk1lc3NhZ2UsIG1ldGFjbGFzcz1yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUpOgorICAgICAgREVTQ1JJUFRPUiA9IG15ZGVzY3JpcHRvcgorICAgIG15cHJvdG9faW5zdGFuY2UgPSBNeVByb3RvQ2xhc3MoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbXlwcm90b19pbnN0YW5jZS5mb29fZmllbGQpCisgICAgc2VsZi5hc3NlcnRGYWxzZShteXByb3RvX2luc3RhbmNlLkhhc0ZpZWxkKCdmb29fZmllbGQnKSkKKyAgICBteXByb3RvX2luc3RhbmNlLmZvb19maWVsZCA9IDIzCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgbXlwcm90b19pbnN0YW5jZS5mb29fZmllbGQpCisgICAgc2VsZi5hc3NlcnRUcnVlKG15cHJvdG9faW5zdGFuY2UuSGFzRmllbGQoJ2Zvb19maWVsZCcpKQorCisgIEB0ZXN0aW5nX3JlZmxlYWtzLlNraXBSZWZlcmVuY2VMZWFrQ2hlY2tlcignTWFrZURlc2NyaXB0b3IgaXMgbm90IHJlcGVhdGFibGUnKQorICBkZWYgdGVzdERlc2NyaXB0b3JQcm90b1N1cHBvcnQoc2VsZik6CisgICAgIyBIYW5kIHdyaXR0ZW4gZGVzY3JpcHRvcnMvcmVmbGVjdGlvbiBhcmUgb25seSBzdXBwb3J0ZWQgYnkgdGhlIHB1cmUtUHl0aG9uCisgICAgIyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQVBJLgorICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgIT0gJ3B5dGhvbic6CisgICAgICByZXR1cm4KKworICAgIGRlZiBBZGREZXNjcmlwdG9yRmllbGQocHJvdG8sIGZpZWxkX25hbWUsIGZpZWxkX3R5cGUpOgorICAgICAgQWRkRGVzY3JpcHRvckZpZWxkLmZpZWxkX2luZGV4ICs9IDEKKyAgICAgIG5ld19maWVsZCA9IHByb3RvLmZpZWxkLmFkZCgpCisgICAgICBuZXdfZmllbGQubmFtZSA9IGZpZWxkX25hbWUKKyAgICAgIG5ld19maWVsZC50eXBlID0gZmllbGRfdHlwZQorICAgICAgbmV3X2ZpZWxkLm51bWJlciA9IEFkZERlc2NyaXB0b3JGaWVsZC5maWVsZF9pbmRleAorICAgICAgbmV3X2ZpZWxkLmxhYmVsID0gZGVzY3JpcHRvcl9wYjIuRmllbGREZXNjcmlwdG9yUHJvdG8uTEFCRUxfT1BUSU9OQUwKKworICAgIEFkZERlc2NyaXB0b3JGaWVsZC5maWVsZF9pbmRleCA9IDAKKworICAgIGRlc2NfcHJvdG8gPSBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8oKQorICAgIGRlc2NfcHJvdG8ubmFtZSA9ICdDYXInCisgICAgZmRwID0gZGVzY3JpcHRvcl9wYjIuRmllbGREZXNjcmlwdG9yUHJvdG8KKyAgICBBZGREZXNjcmlwdG9yRmllbGQoZGVzY19wcm90bywgJ25hbWUnLCBmZHAuVFlQRV9TVFJJTkcpCisgICAgQWRkRGVzY3JpcHRvckZpZWxkKGRlc2NfcHJvdG8sICd5ZWFyJywgZmRwLlRZUEVfSU5UNjQpCisgICAgQWRkRGVzY3JpcHRvckZpZWxkKGRlc2NfcHJvdG8sICdhdXRvbWF0aWMnLCBmZHAuVFlQRV9CT09MKQorICAgIEFkZERlc2NyaXB0b3JGaWVsZChkZXNjX3Byb3RvLCAncHJpY2UnLCBmZHAuVFlQRV9ET1VCTEUpCisgICAgIyBBZGQgYSByZXBlYXRlZCBmaWVsZAorICAgIEFkZERlc2NyaXB0b3JGaWVsZC5maWVsZF9pbmRleCArPSAxCisgICAgbmV3X2ZpZWxkID0gZGVzY19wcm90by5maWVsZC5hZGQoKQorICAgIG5ld19maWVsZC5uYW1lID0gJ293bmVycycKKyAgICBuZXdfZmllbGQudHlwZSA9IGZkcC5UWVBFX1NUUklORworICAgIG5ld19maWVsZC5udW1iZXIgPSBBZGREZXNjcmlwdG9yRmllbGQuZmllbGRfaW5kZXgKKyAgICBuZXdfZmllbGQubGFiZWwgPSBkZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90by5MQUJFTF9SRVBFQVRFRAorCisgICAgZGVzYyA9IGRlc2NyaXB0b3IuTWFrZURlc2NyaXB0b3IoZGVzY19wcm90bykKKyAgICBzZWxmLmFzc2VydFRydWUoJ25hbWUnIGluIGRlc2MuZmllbGRzX2J5X25hbWUpCisgICAgc2VsZi5hc3NlcnRUcnVlKCd5ZWFyJyBpbiBkZXNjLmZpZWxkc19ieV9uYW1lKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYXV0b21hdGljJyBpbiBkZXNjLmZpZWxkc19ieV9uYW1lKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgncHJpY2UnIGluIGRlc2MuZmllbGRzX2J5X25hbWUpCisgICAgc2VsZi5hc3NlcnRUcnVlKCdvd25lcnMnIGluIGRlc2MuZmllbGRzX2J5X25hbWUpCisKKyAgICBjbGFzcyBDYXJNZXNzYWdlKAorICAgICAgICBtZXNzYWdlLk1lc3NhZ2UsIG1ldGFjbGFzcz1yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUpOgorICAgICAgREVTQ1JJUFRPUiA9IGRlc2MKKworICAgIHByaXVzID0gQ2FyTWVzc2FnZSgpCisgICAgcHJpdXMubmFtZSA9ICdwcml1cycKKyAgICBwcml1cy55ZWFyID0gMjAxMAorICAgIHByaXVzLmF1dG9tYXRpYyA9IFRydWUKKyAgICBwcml1cy5wcmljZSA9IDI1MTM0Ljc1CisgICAgcHJpdXMub3duZXJzLmV4dGVuZChbJ2JvYicsICdzdXNhbiddKQorCisgICAgc2VyaWFsaXplZF9wcml1cyA9IHByaXVzLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBuZXdfcHJpdXMgPSByZWZsZWN0aW9uLlBhcnNlTWVzc2FnZShkZXNjLCBzZXJpYWxpemVkX3ByaXVzKQorICAgIHNlbGYuYXNzZXJ0SXNOb3QobmV3X3ByaXVzLCBwcml1cykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByaXVzLCBuZXdfcHJpdXMpCisKKyAgICAjIHRoZXNlIGFyZSB1bm5lY2Vzc2FyeSBhc3N1bWluZyBtZXNzYWdlIGVxdWFsaXR5IHdvcmtzIGFzIGFkdmVydGlzZWQgYnV0CisgICAgIyBleHBsaWNpdGx5IGNoZWNrIHRvIGJlIHNhZmUgc2luY2Ugd2UncmUgbXVja2luZyBhYm91dCBpbiBtZXRhY2xhc3MgZm9vCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcml1cy5uYW1lLCBuZXdfcHJpdXMubmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByaXVzLnllYXIsIG5ld19wcml1cy55ZWFyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJpdXMuYXV0b21hdGljLCBuZXdfcHJpdXMuYXV0b21hdGljKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJpdXMucHJpY2UsIG5ld19wcml1cy5wcmljZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByaXVzLm93bmVycywgbmV3X3ByaXVzLm93bmVycykKKworICBkZWYgdGVzdEV4dGVuc2lvbkRlbGV0ZShzZWxmKToKKyAgICBleHRlbmRlZV9wcm90byA9IG1vcmVfZXh0ZW5zaW9uc19wYjIuRXh0ZW5kZWRNZXNzYWdlKCkKKworICAgIGV4dGVuc2lvbl9pbnQzMiA9IG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfaW50X2V4dGVuc2lvbgorICAgIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uX2ludDMyXSA9IDIzCisKKyAgICBleHRlbnNpb25fcmVwZWF0ZWQgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX2ludF9leHRlbnNpb24KKyAgICBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl9yZXBlYXRlZF0uYXBwZW5kKDExKQorCisgICAgZXh0ZW5zaW9uX21zZyA9IG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfbWVzc2FnZV9leHRlbnNpb24KKyAgICBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl9tc2ddLmZvcmVpZ25fbWVzc2FnZV9pbnQgPSA1NgorCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucyksIDMpCisgICAgZGVsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uX21zZ10KKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihleHRlbmRlZV9wcm90by5FeHRlbnNpb25zKSwgMikKKyAgICBkZWwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25fcmVwZWF0ZWRdCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucyksIDEpCisgICAgIyBEZWxldGUgYSBub25lIGV4aXN0IGV4dGVuc2lvbi4gSXQgaXMgT0sgdG8gImRlbCBtLkV4dGVuc2lvbnNbZXh0XSIKKyAgICAjIGV2ZW4gaWYgdGhlIGV4dGVuc2lvbiBpcyBub3QgcHJlc2VudCBpbiB0aGUgbWVzc2FnZTsgd2UgZG9uJ3QKKyAgICAjIHJhaXNlIEtleUVycm9yLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCAibS5FeHRlbnNpb25zW2V4dF0iCisgICAgIyByZXR1cm5pbmcgYSBkZWZhdWx0IHZhbHVlIGV2ZW4gaWYgd2UgZGlkIG5vdCBzZXQgYW55dGhpbmcuCisgICAgZGVsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uX3JlcGVhdGVkXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnMpLCAxKQorICAgIGRlbCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl9pbnQzMl0KKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihleHRlbmRlZV9wcm90by5FeHRlbnNpb25zKSwgMCkKKworICBkZWYgdGVzdEV4dGVuc2lvbkl0ZXIoc2VsZik6CisgICAgZXh0ZW5kZWVfcHJvdG8gPSBtb3JlX2V4dGVuc2lvbnNfcGIyLkV4dGVuZGVkTWVzc2FnZSgpCisKKyAgICBleHRlbnNpb25faW50MzIgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX2ludF9leHRlbnNpb24KKyAgICBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl9pbnQzMl0gPSAyMworCisgICAgZXh0ZW5zaW9uX3JlcGVhdGVkID0gbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9pbnRfZXh0ZW5zaW9uCisgICAgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25fcmVwZWF0ZWRdLmFwcGVuZCgxMSkKKworICAgIGV4dGVuc2lvbl9tc2cgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX21lc3NhZ2VfZXh0ZW5zaW9uCisgICAgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25fbXNnXS5mb3JlaWduX21lc3NhZ2VfaW50ID0gNTYKKworICAgICMgU2V0IHNvbWUgbm9ybWFsIGZpZWxkcy4KKyAgICBleHRlbmRlZV9wcm90by5vcHRpb25hbF9pbnQzMiA9IDEKKyAgICBleHRlbmRlZV9wcm90by5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdoaScpCisKKyAgICBleHBlY3RlZCA9IChleHRlbnNpb25faW50MzIsIGV4dGVuc2lvbl9tc2csIGV4dGVuc2lvbl9yZXBlYXRlZCkKKyAgICBjb3VudCA9IDAKKyAgICBmb3IgaXRlbSBpbiBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtLm5hbWUsIGV4cGVjdGVkW2NvdW50XS5uYW1lKQorICAgICAgc2VsZi5hc3NlcnRJbihpdGVtLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zKQorICAgICAgY291bnQgKz0gMQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIDMpCisKKyAgZGVmIHRlc3RFeHRlbnNpb25Db250YWluc0Vycm9yKHNlbGYpOgorICAgIGV4dGVuZGVlX3Byb3RvID0gbW9yZV9leHRlbnNpb25zX3BiMi5FeHRlbmRlZE1lc3NhZ2UoKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zLl9fY29udGFpbnNfXywgMCkKKworICAgIGZpZWxkID0gbW9yZV9leHRlbnNpb25zX3BiMi5FeHRlbmRlZE1lc3NhZ2UuREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsKKyAgICAgICAgJ29wdGlvbmFsX2ludDMyJ10KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucy5fX2NvbnRhaW5zX18sIGZpZWxkKQorCisgIGRlZiB0ZXN0VG9wTGV2ZWxFeHRlbnNpb25zRm9yT3B0aW9uYWxTY2FsYXIoc2VsZik6CisgICAgZXh0ZW5kZWVfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIGV4dGVuc2lvbiA9IHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24KKyAgICBzZWxmLmFzc2VydEZhbHNlKGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQorICAgIHNlbGYuYXNzZXJ0Tm90SW4oZXh0ZW5zaW9uLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKQorICAgICMgQXMgd2l0aCBub3JtYWwgc2NhbGFyIGZpZWxkcywganVzdCBkb2luZyBhIHJlYWQgZG9lc24ndCBhY3R1YWxseSBzZXQgdGhlCisgICAgIyAiaGFzIiBiaXQuCisgICAgc2VsZi5hc3NlcnRGYWxzZShleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKKyAgICBzZWxmLmFzc2VydE5vdEluKGV4dGVuc2lvbiwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucykKKyAgICAjIEFjdHVhbGx5IHNldCB0aGUgdGhpbmcuCisgICAgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dID0gMjMKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pCisgICAgc2VsZi5hc3NlcnRUcnVlKGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQorICAgIHNlbGYuYXNzZXJ0SW4oZXh0ZW5zaW9uLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zKQorICAgICMgRW5zdXJlIHRoYXQgY2xlYXJpbmcgd29ya3MgYXMgd2VsbC4KKyAgICBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pCisgICAgc2VsZi5hc3NlcnRGYWxzZShleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKKyAgICBzZWxmLmFzc2VydE5vdEluKGV4dGVuc2lvbiwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucykKKworICBkZWYgdGVzdFRvcExldmVsRXh0ZW5zaW9uc0ZvclJlcGVhdGVkU2NhbGFyKHNlbGYpOgorICAgIGV4dGVuZGVlX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkpCisgICAgc2VsZi5hc3NlcnROb3RJbihleHRlbnNpb24sIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnMpCisgICAgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmFwcGVuZCgnZm9vJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKFsnZm9vJ10sIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKKyAgICBzZWxmLmFzc2VydEluKGV4dGVuc2lvbiwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucykKKyAgICBzdHJpbmdfbGlzdCA9IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXQorICAgIGV4dGVuZGVlX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pKQorICAgIHNlbGYuYXNzZXJ0Tm90SW4oZXh0ZW5zaW9uLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zKQorICAgIHNlbGYuYXNzZXJ0SXNOb3Qoc3RyaW5nX2xpc3QsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKKyAgICAjIFNob3VsZG4ndCBiZSBhbGxvd2VkIHRvIGRvIEV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9ICdhJworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sICdhJykKKworICBkZWYgdGVzdFRvcExldmVsRXh0ZW5zaW9uc0Zvck9wdGlvbmFsTWVzc2FnZShzZWxmKToKKyAgICBleHRlbmRlZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgZXh0ZW5zaW9uID0gdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24KKyAgICBzZWxmLmFzc2VydEZhbHNlKGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQorICAgIHNlbGYuYXNzZXJ0Tm90SW4oZXh0ZW5zaW9uLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmMpCisgICAgIyBBcyB3aXRoIG5vcm1hbCAobm9uLWV4dGVuc2lvbikgZmllbGRzLCBtZXJlbHkgcmVhZGluZyBmcm9tIHRoZQorICAgICMgdGhpbmcgc2hvdWxkbid0IHNldCB0aGUgImhhcyIgYml0LgorICAgIHNlbGYuYXNzZXJ0RmFsc2UoZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCisgICAgc2VsZi5hc3NlcnROb3RJbihleHRlbnNpb24sIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnMpCisgICAgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmMgPSAyMworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5jKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKKyAgICBzZWxmLmFzc2VydEluKGV4dGVuc2lvbiwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucykKKyAgICAjIFNhdmUgYSByZWZlcmVuY2UgaGVyZS4KKyAgICBmb3JlaWduX21lc3NhZ2UgPSBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0KKyAgICBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCisgICAgc2VsZi5hc3NlcnRJc05vdChmb3JlaWduX21lc3NhZ2UsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKKyAgICAjIFNldHRpbmcgYSBmaWVsZCBvbiBmb3JlaWduX21lc3NhZ2Ugbm93IHNob3VsZG4ndCBzZXQKKyAgICAjIGFueSAiaGFzIiBiaXRzIG9uIGV4dGVuZGVlX3Byb3RvLgorICAgIGZvcmVpZ25fbWVzc2FnZS5jID0gNDIKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBmb3JlaWduX21lc3NhZ2UuYykKKyAgICBzZWxmLmFzc2VydFRydWUoZm9yZWlnbl9tZXNzYWdlLkhhc0ZpZWxkKCdjJykpCisgICAgc2VsZi5hc3NlcnRGYWxzZShleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKKyAgICBzZWxmLmFzc2VydE5vdEluKGV4dGVuc2lvbiwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucykKKyAgICAjIFNob3VsZG4ndCBiZSBhbGxvd2VkIHRvIGRvIEV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9ICdhJworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sICdhJykKKworICBkZWYgdGVzdFRvcExldmVsRXh0ZW5zaW9uc0ZvclJlcGVhdGVkTWVzc2FnZShzZWxmKToKKyAgICBleHRlbmRlZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgZXh0ZW5zaW9uID0gdW5pdHRlc3RfcGIyLnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4oZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKSkKKyAgICBncm91cCA9IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5hZGQoKQorICAgIGdyb3VwLmEgPSAyMworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXVswXS5hKQorICAgIGdyb3VwLmEgPSA0MgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXVswXS5hKQorICAgIGdyb3VwX2xpc3QgPSBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0KKyAgICBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4oZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKSkKKyAgICBzZWxmLmFzc2VydElzTm90KGdyb3VwX2xpc3QsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKKyAgICAjIFNob3VsZG4ndCBiZSBhbGxvd2VkIHRvIGRvIEV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9ICdhJworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sICdhJykKKworICBkZWYgdGVzdE5lc3RlZEV4dGVuc2lvbnMoc2VsZik6CisgICAgZXh0ZW5kZWVfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIGV4dGVuc2lvbiA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuc2luZ2xlCisKKyAgICAjIFdlIGp1c3QgdGVzdCB0aGUgbm9uLXJlcGVhdGVkIGNhc2UuCisgICAgc2VsZi5hc3NlcnRGYWxzZShleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKKyAgICBzZWxmLmFzc2VydE5vdEluKGV4dGVuc2lvbiwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucykKKyAgICByZXF1aXJlZCA9IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcmVxdWlyZWQuYSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQorICAgIHNlbGYuYXNzZXJ0Tm90SW4oZXh0ZW5zaW9uLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zKQorICAgIHJlcXVpcmVkLmEgPSAyMworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5hKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKKyAgICBzZWxmLmFzc2VydEluKGV4dGVuc2lvbiwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucykKKyAgICBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCisgICAgc2VsZi5hc3NlcnRJc05vdChyZXF1aXJlZCwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCisgICAgc2VsZi5hc3NlcnROb3RJbihleHRlbnNpb24sIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnMpCisKKyAgZGVmIHRlc3RSZWdpc3RlcmVkRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBwb29sID0gdW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IucG9vbAorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgcG9vbC5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMuREVTQ1JJUFRPUiwgMSkpCisgICAgc2VsZi5hc3NlcnRJcygKKyAgICAgICAgcG9vbC5GaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgICAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbicpLmNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zLkRFU0NSSVBUT1IpCisgICAgIyBNYWtlIHN1cmUgZXh0ZW5zaW9ucyBoYXZlbid0IGJlZW4gcmVnaXN0ZXJlZCBpbnRvIHR5cGVzIHRoYXQgc2hvdWxkbid0CisgICAgIyBoYXZlIGFueS4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbigKKyAgICAgICAgcG9vbC5GaW5kQWxsRXh0ZW5zaW9ucyh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IpKSkKKworICAjIElmIG1lc3NhZ2UgQSBkaXJlY3RseSBjb250YWlucyBtZXNzYWdlIEIsIGFuZAorICAjIGEuSGFzRmllbGQoJ2InKSBpcyBjdXJyZW50bHkgRmFsc2UsIHRoZW4gbXV0YXRpbmcgYW55CisgICMgZXh0ZW5zaW9uIGluIEIgc2hvdWxkIGNoYW5nZSBhLkhhc0ZpZWxkKCdiJykgdG8gVHJ1ZQorICAjIChhbmQgc28gb24gdXAgdGhlIG9iamVjdCB0cmVlKS4KKyAgZGVmIHRlc3RIYXNCaXRzRm9yQW5jZXN0b3JzT2ZFeHRlbmRlZE1lc3NhZ2Uoc2VsZik6CisgICAgIyBPcHRpb25hbCBzY2FsYXIgZXh0ZW5zaW9uLgorICAgIHRvcGxldmVsID0gbW9yZV9leHRlbnNpb25zX3BiMi5Ub3BMZXZlbE1lc3NhZ2UoKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UodG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9pbnRfZXh0ZW5zaW9uXSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCisgICAgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWworICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX2ludF9leHRlbnNpb25dID0gMjMKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCisgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfaW50X2V4dGVuc2lvbl0pCisgICAgc2VsZi5hc3NlcnRUcnVlKHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCisKKyAgICAjIFJlcGVhdGVkIHNjYWxhciBleHRlbnNpb24uCisgICAgdG9wbGV2ZWwgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLlRvcExldmVsTWVzc2FnZSgpCisgICAgc2VsZi5hc3NlcnRGYWxzZSh0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9pbnRfZXh0ZW5zaW9uXSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCisgICAgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWworICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX2ludF9leHRlbnNpb25dLmFwcGVuZCgyMykKKyAgICBzZWxmLmFzc2VydEVxdWFsKFsyM10sIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9pbnRfZXh0ZW5zaW9uXSkKKyAgICBzZWxmLmFzc2VydFRydWUodG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKKworICAgICMgT3B0aW9uYWwgbWVzc2FnZSBleHRlbnNpb24uCisgICAgdG9wbGV2ZWwgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLlRvcExldmVsTWVzc2FnZSgpCisgICAgc2VsZi5hc3NlcnRGYWxzZSh0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWworICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX21lc3NhZ2VfZXh0ZW5zaW9uXS5mb3JlaWduX21lc3NhZ2VfaW50KQorICAgIHNlbGYuYXNzZXJ0RmFsc2UodG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKKyAgICB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCisgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfbWVzc2FnZV9leHRlbnNpb25dLmZvcmVpZ25fbWVzc2FnZV9pbnQgPSAyMworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9tZXNzYWdlX2V4dGVuc2lvbl0uZm9yZWlnbl9tZXNzYWdlX2ludCkKKyAgICBzZWxmLmFzc2VydFRydWUodG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKKworICAgICMgUmVwZWF0ZWQgbWVzc2FnZSBleHRlbnNpb24uCisgICAgdG9wbGV2ZWwgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLlRvcExldmVsTWVzc2FnZSgpCisgICAgc2VsZi5hc3NlcnRGYWxzZSh0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9tZXNzYWdlX2V4dGVuc2lvbl0pKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UodG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKKyAgICBmb3JlaWduID0gdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWworICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXS5hZGQoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9yZWlnbiwgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWworICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXVswXSkKKyAgICBzZWxmLmFzc2VydFRydWUodG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKKworICBkZWYgdGVzdERpc2Nvbm5lY3Rpb25BZnRlckNsZWFyaW5nRW1wdHlNZXNzYWdlKHNlbGYpOgorICAgIHRvcGxldmVsID0gbW9yZV9leHRlbnNpb25zX3BiMi5Ub3BMZXZlbE1lc3NhZ2UoKQorICAgIGV4dGVuZGVlX3Byb3RvID0gdG9wbGV2ZWwuc3VibWVzc2FnZQorICAgIGV4dGVuc2lvbiA9IG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfbWVzc2FnZV9leHRlbnNpb24KKyAgICBleHRlbnNpb25fcHJvdG8gPSBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0KKyAgICBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCisgICAgZXh0ZW5zaW9uX3Byb3RvLmZvcmVpZ25fbWVzc2FnZV9pbnQgPSAyMworCisgICAgc2VsZi5hc3NlcnRJc05vdChleHRlbnNpb25fcHJvdG8sIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKKworICBkZWYgdGVzdEV4dGVuc2lvbkZhaWx1cmVNb2RlcyhzZWxmKToKKyAgICBleHRlbmRlZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisKKyAgICAjIFRyeSBub24tZXh0ZW5zaW9uLWhhbmRsZSBhcmd1bWVudHMgdG8gSGFzRXh0ZW5zaW9uLAorICAgICMgQ2xlYXJFeHRlbnNpb24oKSwgYW5kIEV4dGVuc2lvbnNbXS4uLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24sIDEyMzQpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGV4dGVuZGVlX3Byb3RvLkNsZWFyRXh0ZW5zaW9uLCAxMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zLl9fZ2V0aXRlbV9fLCAxMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zLl9fc2V0aXRlbV9fLCAxMjM0LCA1KQorCisgICAgIyBUcnkgc29tZXRoaW5nIHRoYXQgKmlzKiBhbiBleHRlbnNpb24gaGFuZGxlLCBqdXN0IG5vdCBmb3IKKyAgICAjIHRoaXMgbWVzc2FnZS4uLgorICAgIGZvciB1bmtub3duX2hhbmRsZSBpbiAobW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9pbnRfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9tZXNzYWdlX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIucmVwZWF0ZWRfaW50X2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIucmVwZWF0ZWRfbWVzc2FnZV9leHRlbnNpb24pOgorICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25faGFuZGxlKQorICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGV4dGVuZGVlX3Byb3RvLkNsZWFyRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9oYW5kbGUpCisgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucy5fX2dldGl0ZW1fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25faGFuZGxlKQorICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnMuX19zZXRpdGVtX18sCisgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duX2hhbmRsZSwgNSkKKworICAgICMgVHJ5IGNhbGwgSGFzRXh0ZW5zaW9uKCkgd2l0aCBhIHZhbGlkIGhhbmRsZSwgYnV0IGZvciBhCisgICAgIyAqcmVwZWF0ZWQqIGZpZWxkLiAgKEp1c3QgYXMgd2l0aCBub24tZXh0ZW5zaW9uIHJlcGVhdGVkCisgICAgIyBmaWVsZHMsIEhhcyooKSBpc24ndCBzdXBwb3J0ZWQgZm9yIGV4dGVuc2lvbiByZXBlYXRlZCBmaWVsZHMpLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pCisKKyAgZGVmIHRlc3RNZXJnZUZyb21PcHRpb25hbEdyb3VwKHNlbGYpOgorICAgICMgVGVzdCBtZXJnZSB3aXRoIGFuIG9wdGlvbmFsIGdyb3VwLgorICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMS5vcHRpb25hbGdyb3VwLmEgPSAxMgorICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMi5NZXJnZUZyb20ocHJvdG8xKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIsIHByb3RvMi5vcHRpb25hbGdyb3VwLmEpCisKKyAgZGVmIHRlc3RNZXJnZUZyb21FeHRlbnNpb25zU2luZ3VsYXIoc2VsZik6CisgICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBwcm90bzEuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSA9IDEKKworICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgcHJvdG8yLk1lcmdlRnJvbShwcm90bzEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgMSwgcHJvdG8yLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0pCisKKyAgZGVmIHRlc3RNZXJnZUZyb21FeHRlbnNpb25zUmVwZWF0ZWQoc2VsZik6CisgICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBwcm90bzEuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMSkKKyAgICBwcm90bzEuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMikKKworICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgcHJvdG8yLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl0uYXBwZW5kKDApCisgICAgcHJvdG8yLk1lcmdlRnJvbShwcm90bzEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgMywgbGVuKHByb3RvMi5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAwLCBwcm90bzIuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXVswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAxLCBwcm90bzIuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXVsxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAyLCBwcm90bzIuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXVsyXSkKKworICBkZWYgdGVzdE1lcmdlRnJvbUV4dGVuc2lvbnNOZXN0ZWRNZXNzYWdlKHNlbGYpOgorICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgZXh0MSA9IHByb3RvMS5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9wYjIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXQorICAgIG0gPSBleHQxLmFkZCgpCisgICAgbS5iYiA9IDIyMgorICAgIG0gPSBleHQxLmFkZCgpCisgICAgbS5iYiA9IDMzMworCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBleHQyID0gcHJvdG8yLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dCisgICAgbSA9IGV4dDIuYWRkKCkKKyAgICBtLmJiID0gMTExCisKKyAgICBwcm90bzIuTWVyZ2VGcm9tKHByb3RvMSkKKyAgICBleHQyID0gcHJvdG8yLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsZW4oZXh0MikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMTEsIGV4dDJbMF0uYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMjIsIGV4dDJbMV0uYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzMzMsIGV4dDJbMl0uYmIpCisKKyAgZGVmIHRlc3RDb3B5RnJvbUJhZFR5cGUoc2VsZik6CisgICAgIyBUaGUgcHl0aG9uIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIGluIHRoaXMKKyAgICAjIGNhc2UuIEluIHRoZW9yeSBpdCBzaG91bGQuCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAncHl0aG9uJzoKKyAgICAgIHJldHVybgorICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90bzEuQ29weUZyb20sIHByb3RvMikKKworICBkZWYgdGVzdENsZWFyKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgIyBDKysgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCBsYXp5IGZpZWxkcyByaWdodCBub3cgc28gbGVhdmUgaXQKKyAgICAjIG91dCBmb3Igbm93LgorICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ3B5dGhvbic6CisgICAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHByb3RvKQorICAgIGVsc2U6CisgICAgICB0ZXN0X3V0aWwuU2V0QWxsTm9uTGF6eUZpZWxkcyhwcm90bykKKyAgICAjIENsZWFyIHRoZSBtZXNzYWdlLgorICAgIHByb3RvLkNsZWFyKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJ5dGVTaXplKCksIDApCisgICAgZW1wdHlfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLCBlbXB0eV9wcm90bykKKworICAgICMgVGVzdCBpZiBleHRlbnNpb25zIHdoaWNoIHdlcmUgc2V0IGFyZSBjbGVhcmVkLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhwcm90bykKKyAgICAjIENsZWFyIHRoZSBtZXNzYWdlLgorICAgIHByb3RvLkNsZWFyKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJ5dGVTaXplKCksIDApCisgICAgZW1wdHlfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8sIGVtcHR5X3Byb3RvKQorCisgIGRlZiB0ZXN0RGlzY29ubmVjdGluZ0luT25lb2Yoc2VsZik6CisgICAgbSA9IHVuaXR0ZXN0X3BiMi5UZXN0T25lb2YyKCkgICMgVGhpcyBtZXNzYWdlIGhhcyB0d28gbWVzc2FnZXMgaW4gYSBvbmVvZi4KKyAgICBtLmZvb19tZXNzYWdlLm1vb19pbnQgPSA1CisgICAgc3ViX21lc3NhZ2UgPSBtLmZvb19tZXNzYWdlCisgICAgIyBBY2Nlc3NpbmcgYW5vdGhlciBtZXNzYWdlJ3MgZmllbGQgZG9lcyBub3QgY2xlYXIgdGhlIGZpcnN0IG9uZQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5mb29fbGF6eV9tZXNzYWdlLm1vb19pbnQsIDApCisgICAgc2VsZi5hc3NlcnRFcXVhbChtLmZvb19tZXNzYWdlLm1vb19pbnQsIDUpCisgICAgIyBCdXQgbXV0YXRpbmcgYW5vdGhlciBtZXNzYWdlIGluIHRoZSBvbmVvZiBkZXRhY2hlcyB0aGUgZmlyc3Qgb25lLgorICAgIG0uZm9vX2xhenlfbWVzc2FnZS5tb29faW50ID0gNgorICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5mb29fbWVzc2FnZS5tb29faW50LCAwKQorICAgICMgVGhlIHJlZmVyZW5jZSB3ZSBnb3QgYWJvdmUgd2FzIGRldGFjaGVkIGFuZCBpcyBzdGlsbCB2YWxpZC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKHN1Yl9tZXNzYWdlLm1vb19pbnQsIDUpCisgICAgc3ViX21lc3NhZ2UubW9vX2ludCA9IDcKKworICBkZWYgYXNzZXJ0SW5pdGlhbGl6ZWQoc2VsZiwgcHJvdG8pOgorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5Jc0luaXRpYWxpemVkKCkpCisgICAgIyBOZWl0aGVyIG1ldGhvZCBzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgIHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBwcm90by5TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoKQorCisgIGRlZiBhc3NlcnROb3RJbml0aWFsaXplZChzZWxmLCBwcm90bywgZXJyb3Jfc2l6ZT1Ob25lKToKKyAgICBlcnJvcnMgPSBbXQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSXNJbml0aWFsaXplZCgpKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSXNJbml0aWFsaXplZChlcnJvcnMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyb3Jfc2l6ZSwgbGVuKGVycm9ycykpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMobWVzc2FnZS5FbmNvZGVFcnJvciwgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcpCisgICAgIyAiUGFydGlhbCIgc2VyaWFsaXphdGlvbiBkb2Vzbid0IGNhcmUgaWYgbWVzc2FnZSBpcyB1bmluaXRpYWxpemVkLgorICAgIHByb3RvLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCisKKyAgZGVmIHRlc3RJc0luaXRpYWxpemVkKHNlbGYpOgorICAgICMgVHJpdmlhbCBjYXNlcyAtIGFsbCBvcHRpb25hbCBmaWVsZHMgYW5kIGV4dGVuc2lvbnMuCisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQorCisgICAgIyBUaGUgY2FzZSBvZiB1bmluaXRpYWxpemVkIHJlcXVpcmVkIGZpZWxkcy4KKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoKQorICAgIHNlbGYuYXNzZXJ0Tm90SW5pdGlhbGl6ZWQocHJvdG8sIDMpCisgICAgcHJvdG8uYSA9IHByb3RvLmIgPSBwcm90by5jID0gMgorICAgIHNlbGYuYXNzZXJ0SW5pdGlhbGl6ZWQocHJvdG8pCisKKyAgICAjIFRoZSBjYXNlIG9mIHVuaW5pdGlhbGl6ZWQgc3VibWVzc2FnZS4KKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWRGb3JlaWduKCkKKyAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQorICAgIHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuYSA9IDEKKyAgICBzZWxmLmFzc2VydE5vdEluaXRpYWxpemVkKHByb3RvLCAyKQorICAgIHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuYiA9IDAKKyAgICBwcm90by5vcHRpb25hbF9tZXNzYWdlLmMgPSAwCisgICAgc2VsZi5hc3NlcnRJbml0aWFsaXplZChwcm90bykKKworICAgICMgVW5pbml0aWFsaXplZCByZXBlYXRlZCBzdWJtZXNzYWdlLgorICAgIG1lc3NhZ2UxID0gcHJvdG8ucmVwZWF0ZWRfbWVzc2FnZS5hZGQoKQorICAgIHNlbGYuYXNzZXJ0Tm90SW5pdGlhbGl6ZWQocHJvdG8sIDMpCisgICAgbWVzc2FnZTEuYSA9IG1lc3NhZ2UxLmIgPSBtZXNzYWdlMS5jID0gMAorICAgIHNlbGYuYXNzZXJ0SW5pdGlhbGl6ZWQocHJvdG8pCisKKyAgICAjIFVuaW5pdGlhbGl6ZWQgcmVwZWF0ZWQgZ3JvdXAgaW4gYW4gZXh0ZW5zaW9uLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLm11bHRpCisgICAgbWVzc2FnZTEgPSBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYWRkKCkKKyAgICBtZXNzYWdlMiA9IHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5hZGQoKQorICAgIHNlbGYuYXNzZXJ0Tm90SW5pdGlhbGl6ZWQocHJvdG8sIDYpCisgICAgbWVzc2FnZTEuYSA9IDEKKyAgICBtZXNzYWdlMS5iID0gMQorICAgIG1lc3NhZ2UxLmMgPSAxCisgICAgc2VsZi5hc3NlcnROb3RJbml0aWFsaXplZChwcm90bywgMykKKyAgICBtZXNzYWdlMi5hID0gMgorICAgIG1lc3NhZ2UyLmIgPSAyCisgICAgbWVzc2FnZTIuYyA9IDIKKyAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQorCisgICAgIyBVbmluaXRpYWxpemVkIG5vbnJlcGVhdGVkIG1lc3NhZ2UgaW4gYW4gZXh0ZW5zaW9uLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLnNpbmdsZQorICAgIHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5hID0gMQorICAgIHNlbGYuYXNzZXJ0Tm90SW5pdGlhbGl6ZWQocHJvdG8sIDIpCisgICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmIgPSAyCisgICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmMgPSAzCisgICAgc2VsZi5hc3NlcnRJbml0aWFsaXplZChwcm90bykKKworICAgICMgVHJ5IHBhc3NpbmcgYW4gZXJyb3JzIGxpc3QuCisgICAgZXJyb3JzID0gW10KKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSXNJbml0aWFsaXplZChlcnJvcnMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyb3JzLCBbJ2EnLCAnYicsICdjJ10pCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5Jc0luaXRpYWxpemVkLCAxLCAyLCAzKQorCisgIEB1bml0dGVzdC5za2lwSWYoCisgICAgICBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdweXRob24nLAorICAgICAgJ0Vycm9ycyBhcmUgb25seSBhdmFpbGFibGUgZnJvbSB0aGUgbW9zdCByZWNlbnQgQysrIGltcGxlbWVudGF0aW9uLicpCisgIGRlZiB0ZXN0RmlsZURlc2NyaXB0b3JFcnJvcnMoc2VsZik6CisgICAgZmlsZV9uYW1lID0gJ3Rlc3RfZmlsZV9kZXNjcmlwdG9yX2Vycm9ycy5wcm90bycKKyAgICBwYWNrYWdlX25hbWUgPSAndGVzdF9maWxlX2Rlc2NyaXB0b3JfZXJyb3JzLnByb3RvJworICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90byA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oKQorICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90by5uYW1lID0gZmlsZV9uYW1lCisgICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLnBhY2thZ2UgPSBwYWNrYWdlX25hbWUKKyAgICBtMSA9IGZpbGVfZGVzY3JpcHRvcl9wcm90by5tZXNzYWdlX3R5cGUuYWRkKCkKKyAgICBtMS5uYW1lID0gJ21zZzEnCisgICAgIyBDb21waWxlcyB0aGUgcHJvdG8gaW50byB0aGUgQysrIGRlc2NyaXB0b3IgcG9vbAorICAgIGRlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IoCisgICAgICAgIGZpbGVfbmFtZSwKKyAgICAgICAgcGFja2FnZV9uYW1lLAorICAgICAgICBzZXJpYWxpemVkX3BiPWZpbGVfZGVzY3JpcHRvcl9wcm90by5TZXJpYWxpemVUb1N0cmluZygpKQorICAgICMgQWRkIGEgRmlsZURlc2NyaXB0b3JQcm90byB0aGF0IGhhcyBkdXBsaWNhdGUgc3ltYm9scworICAgIGFub3RoZXJfZmlsZV9uYW1lID0gJ2Fub3RoZXJfdGVzdF9maWxlX2Rlc2NyaXB0b3JfZXJyb3JzLnByb3RvJworICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90by5uYW1lID0gYW5vdGhlcl9maWxlX25hbWUKKyAgICBtMiA9IGZpbGVfZGVzY3JpcHRvcl9wcm90by5tZXNzYWdlX3R5cGUuYWRkKCkKKyAgICBtMi5uYW1lID0gJ21zZzInCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgorICAgICAgZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcigKKyAgICAgICAgICBhbm90aGVyX2ZpbGVfbmFtZSwKKyAgICAgICAgICBwYWNrYWdlX25hbWUsCisgICAgICAgICAgc2VyaWFsaXplZF9wYj1maWxlX2Rlc2NyaXB0b3JfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGNtLCAnZXhjZXB0aW9uJyksICclcyBub3QgcmFpc2VkJyAlCisgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihjbS5leHBlY3RlZCwgJ19fbmFtZV9fJywgY20uZXhwZWN0ZWQpKQorICAgICAgc2VsZi5hc3NlcnRJbigndGVzdF9maWxlX2Rlc2NyaXB0b3JfZXJyb3JzLnByb3RvJywgc3RyKGNtLmV4Y2VwdGlvbikpCisgICAgICAjIEVycm9yIG1lc3NhZ2Ugd2lsbCBzYXkgc29tZXRoaW5nIGFib3V0IHRoaXMgZGVmaW5pdGlvbiBiZWluZyBhCisgICAgICAjIGR1cGxpY2F0ZSwgdGhvdWdoIHdlIGRvbid0IGNoZWNrIHRoZSBtZXNzYWdlIGV4YWN0bHkgdG8gYXZvaWQgYQorICAgICAgIyBkZXBlbmRlbmN5IG9uIHRoZSBDKysgbG9nZ2luZyBjb2RlLgorICAgICAgc2VsZi5hc3NlcnRJbigndGVzdF9maWxlX2Rlc2NyaXB0b3JfZXJyb3JzLm1zZzEnLCBzdHIoY20uZXhjZXB0aW9uKSkKKworICBkZWYgdGVzdFN0cmluZ1VURjhTZXJpYWxpemF0aW9uKHNlbGYpOgorICAgIHByb3RvID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXQoKQorICAgIGV4dGVuc2lvbl9tZXNzYWdlID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yCisgICAgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uX21lc3NhZ2UubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCisKKyAgICB0ZXN0X3V0ZjggPSB1J9Ci0LXRgdGCJworICAgIHRlc3RfdXRmOF9ieXRlcyA9IHRlc3RfdXRmOC5lbmNvZGUoJ3V0Zi04JykKKworICAgICMgJ1Rlc3QnIGluIGFub3RoZXIgbGFuZ3VhZ2UsIHVzaW5nIFVURi04IGNoYXJzZXQuCisgICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLnN0ciA9IHRlc3RfdXRmOAorCisgICAgIyBTZXJpYWxpemUgdXNpbmcgdGhlIE1lc3NhZ2VTZXQgd2lyZSBmb3JtYXQgKHRoaXMgaXMgc3BlY2lmaWVkIGluIHRoZQorICAgICMgLnByb3RvIGZpbGUpLgorICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisKKyAgICAjIENoZWNrIGJ5dGUgc2l6ZS4KKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJ5dGVTaXplKCksIGxlbihzZXJpYWxpemVkKSkKKworICAgIHJhdyA9IHVuaXR0ZXN0X21zZXRfcGIyLlJhd01lc3NhZ2VTZXQoKQorICAgIGJ5dGVzX3JlYWQgPSByYXcuTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VyaWFsaXplZCksIGJ5dGVzX3JlYWQpCisKKyAgICBtZXNzYWdlMiA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMigpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihyYXcuaXRlbSkpCisgICAgIyBDaGVjayB0aGF0IHRoZSB0eXBlX2lkIGlzIHRoZSBzYW1lIGFzIHRoZSB0YWcgSUQgaW4gdGhlIC5wcm90byBmaWxlLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3Lml0ZW1bMF0udHlwZV9pZCwgOTg0MTg2MzQpCisKKyAgICAjIENoZWNrIHRoZSBhY3R1YWwgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgc2VsZi5hc3NlcnRUcnVlKHJhdy5pdGVtWzBdLm1lc3NhZ2UuZW5kc3dpdGgodGVzdF91dGY4X2J5dGVzKSkKKyAgICBieXRlc19yZWFkID0gbWVzc2FnZTIuTWVyZ2VGcm9tU3RyaW5nKHJhdy5pdGVtWzBdLm1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmF3Lml0ZW1bMF0ubWVzc2FnZSksIGJ5dGVzX3JlYWQpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUobWVzc2FnZTIuc3RyKSwgc3RyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZTIuc3RyLCB0ZXN0X3V0ZjgpCisKKyAgICAjIFRoZSBwdXJlIFB5dGhvbiBBUEkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvbiBNZXJnZUZyb21TdHJpbmcoKSwKKyAgICAjIGlmIGFueSBvZiB0aGUgc3RyaW5nIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSBjYW4ndCBiZSBVVEYtOCBkZWNvZGVkLgorICAgICMgVGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQVBJIGhhcyBubyB3YXkgdG8gY2hlY2sgdGhhdCBvbgorICAgICMgTWVyZ2VGcm9tU3RyaW5nIGFuZCB0aHVzIGhhcyBubyB3YXkgdG8gdGhyb3cgdGhlIGV4Y2VwdGlvbi4KKyAgICAjCisgICAgIyBUaGUgcHVyZSBQeXRob24gQVBJIGFsd2F5cyByZXR1cm5zIG9iamVjdHMgb2YgdHlwZSAndW5pY29kZScgKFVURi04CisgICAgIyBlbmNvZGVkKSwgb3IgJ2J5dGVzJyAoaW4gNyBiaXQgQVNDSUkpLgorICAgIGJhZGJ5dGVzID0gcmF3Lml0ZW1bMF0ubWVzc2FnZS5yZXBsYWNlKAorICAgICAgICB0ZXN0X3V0ZjhfYnl0ZXMsIGxlbih0ZXN0X3V0ZjhfYnl0ZXMpICogYidceGZmJykKKworICAgIHVuaWNvZGVfZGVjb2RlX2ZhaWxlZCA9IEZhbHNlCisgICAgdHJ5OgorICAgICAgbWVzc2FnZTIuTWVyZ2VGcm9tU3RyaW5nKGJhZGJ5dGVzKQorICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CisgICAgICB1bmljb2RlX2RlY29kZV9mYWlsZWQgPSBUcnVlCisgICAgc3RyaW5nX2ZpZWxkID0gbWVzc2FnZTIuc3RyCisgICAgc2VsZi5hc3NlcnRUcnVlKHVuaWNvZGVfZGVjb2RlX2ZhaWxlZCBvciB0eXBlKHN0cmluZ19maWVsZCkgaXMgYnl0ZXMpCisKKyAgZGVmIHRlc3RTZXRJblBhcmVudChzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsZ3JvdXAnKSkKKyAgICBwcm90by5vcHRpb25hbGdyb3VwLlNldEluUGFyZW50KCkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsZ3JvdXAnKSkKKworICBkZWYgdGVzdFBhY2thZ2VJbml0aWFsaXphdGlvbkltcG9ydChzZWxmKToKKyAgICAiIiJUZXN0IHRoYXQgd2UgY2FuIGltcG9ydCBuZXN0ZWQgbWVzc2FnZXMgZnJvbSB0aGVpciBfX2luaXRfXy5weS4KKworICAgIFN1Y2ggc2V0dXAgaXMgbm90IHRyaXZpYWwgc2luY2UgYXQgdGhlIHRpbWUgb2YgcHJvY2Vzc2luZyBvZiBfX2luaXRfXy5weSBvbmUKKyAgICBjYW4ndCByZWZlciB0byBpdHMgc3VibW9kdWxlcyBieSBuYW1lIGluIGNvZGUsIHNvIGV4cHJlc3Npb25zIGxpa2UKKyAgICBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuaW1wb3J0X3Rlc3RfcGFja2FnZS5pbm5lcl9wYjIKKyAgICBkb24ndCB3b3JrLiBUaGV5IGRvIHdvcmsgaW4gaW1wb3J0cywgc28gd2UgaGF2ZSBhc3NpZ24gYW4gYWxpYXMgYXQgaW1wb3J0CisgICAgYW5kIHRoZW4gdXNlIHRoYXQgYWxpYXMgaW4gZ2VuZXJhdGVkIGNvZGUuCisgICAgIiIiCisgICAgIyBXZSBpbXBvcnQgaGVyZSBzaW5jZSBpdCdzIHRoZSBpbXBvcnQgdGhhdCB1c2VkIHRvIGZhaWwsIGFuZCB3ZSB3YW50CisgICAgIyB0aGUgZmFpbHVyZSB0byBoYXZlIHRoZSByaWdodCBjb250ZXh0LgorICAgICMgcHlsaW50OiBkaXNhYmxlPWctaW1wb3J0LW5vdC1hdC10b3AKKyAgICBmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgaW1wb3J0X3Rlc3RfcGFja2FnZQorICAgICMgcHlsaW50OiBlbmFibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAorICAgIG1zZyA9IGltcG9ydF90ZXN0X3BhY2thZ2UubXlwcm90by5PdXRlcigpCisgICAgIyBKdXN0IGNoZWNrIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNTcsIG1zZy5pbm5lci52YWx1ZSkKKworIyAgU2luY2Ugd2UgaGFkIHNvIG1hbnkgdGVzdHMgZm9yIHByb3RvY29sIGJ1ZmZlciBlcXVhbGl0eSwgd2UgYnJva2UgdGhlc2Ugb3V0CisjICBpbnRvIHNlcGFyYXRlIFRlc3RDYXNlIGNsYXNzZXMuCisKKworQHRlc3RpbmdfcmVmbGVha3MuVGVzdENhc2UKK2NsYXNzIFRlc3RBbGxUeXBlc0VxdWFsaXR5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYuZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLnNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgIGRlZiB0ZXN0Tm90SGFzaGFibGUoc2VsZik6CisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBzZWxmLmZpcnN0X3Byb3RvKQorCisgIGRlZiB0ZXN0U2VsZkVxdWFsaXR5KHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5maXJzdF9wcm90bykKKworICBkZWYgdGVzdEVtcHR5UHJvdG9zRXF1YWwoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKworCitAdGVzdGluZ19yZWZsZWFrcy5UZXN0Q2FzZQorY2xhc3MgRnVsbFByb3Rvc0VxdWFsaXR5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgIiIiRXF1YWxpdHkgdGVzdHMgdXNpbmcgY29tcGxldGVseS1mdWxsIHByb3RvcyBhcyBhIHN0YXJ0aW5nIHBvaW50LiIiIgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLmZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5zZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHNlbGYuZmlyc3RfcHJvdG8pCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vdEhhc2hhYmxlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgc2VsZi5maXJzdF9wcm90bykKKworICBkZWYgdGVzdE5vbmVOb3RFcXVhbChzZWxmKToKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIE5vbmUpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChOb25lLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vdEVxdWFsVG9PdGhlck1lc3NhZ2Uoc2VsZik6CisgICAgdGhpcmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkKCkKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHRoaXJkX3Byb3RvKQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodGhpcmRfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQorCisgIGRlZiB0ZXN0QWxsRmllbGRzRmlsbGVkRXF1YWxpdHkoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vblJlcGVhdGVkU2NhbGFyKHNlbGYpOgorICAgICMgTm9ucmVwZWF0ZWQgc2NhbGFyIGZpZWxkIGNoYW5nZSBzaG91bGQgY2F1c2UgaW5lcXVhbGl0eS4KKyAgICBzZWxmLmZpcnN0X3Byb3RvLm9wdGlvbmFsX2ludDMyICs9IDEKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQorICAgICMgLi4uYXMgc2hvdWxkIGNsZWFyaW5nIGEgZmllbGQuCisgICAgc2VsZi5maXJzdF9wcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9pbnQzMicpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vblJlcGVhdGVkQ29tcG9zaXRlKHNlbGYpOgorICAgICMgQ2hhbmdlIGEgbm9ucmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgKz0gMQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisgICAgc2VsZi5maXJzdF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiAtPSAxCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICAjIENsZWFyIGEgZmllbGQgaW4gdGhlIG5lc3RlZCBtZXNzYWdlLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuQ2xlYXJGaWVsZCgnYmInKQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisgICAgc2VsZi5maXJzdF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9ICgKKyAgICAgICAgc2VsZi5zZWNvbmRfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICAjIFJlbW92ZSB0aGUgbmVzdGVkIG1lc3NhZ2UgZW50aXJlbHkuCisgICAgc2VsZi5maXJzdF9wcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyKHNlbGYpOgorICAgICMgQ2hhbmdlIGEgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDUpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICBzZWxmLmZpcnN0X3Byb3RvLkNsZWFyRmllbGQoJ3JlcGVhdGVkX2ludDMyJykKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGUoc2VsZik6CisgICAgIyBDaGFuZ2UgdmFsdWUgd2l0aGluIGEgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uYmIgKz0gMQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisgICAgc2VsZi5maXJzdF9wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYiAtPSAxCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICAjIEFkZCBhIHZhbHVlIHRvIGEgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQorICAgIHNlbGYuc2Vjb25kX3Byb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vblJlcGVhdGVkU2NhbGFySGFzQml0cyhzZWxmKToKKyAgICAjIEVuc3VyZSB0aGF0IHdlIHRlc3QgImhhcyIgYml0cyBhcyB3ZWxsIGFzIHZhbHVlIGZvcgorICAgICMgbm9ucmVwZWF0ZWQgc2NhbGFyIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQorICAgIHNlbGYuc2Vjb25kX3Byb3RvLm9wdGlvbmFsX2ludDMyID0gMAorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisKKyAgZGVmIHRlc3ROb25SZXBlYXRlZENvbXBvc2l0ZUhhc0JpdHMoc2VsZik6CisgICAgIyBFbnN1cmUgdGhhdCB3ZSB0ZXN0ICJoYXMiIGJpdHMgYXMgd2VsbCBhcyB2YWx1ZSBmb3IKKyAgICAjIG5vbnJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZC4KKyAgICBzZWxmLmZpcnN0X3Byb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykKKyAgICBzZWxmLnNlY29uZF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5DbGVhckZpZWxkKCdiYicpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICBzZWxmLmZpcnN0X3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMAorICAgIHNlbGYuZmlyc3RfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuQ2xlYXJGaWVsZCgnYmInKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisKKworQHRlc3RpbmdfcmVmbGVha3MuVGVzdENhc2UKK2NsYXNzIEV4dGVuc2lvbkVxdWFsaXR5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RFeHRlbnNpb25FcXVhbGl0eShzZWxmKToKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisgICAgdGVzdF91dGlsLlNldEFsbEV4dGVuc2lvbnMoZmlyc3RfcHJvdG8pCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorICAgIHRlc3RfdXRpbC5TZXRBbGxFeHRlbnNpb25zKHNlY29uZF9wcm90bykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisKKyAgICAjIEVuc3VyZSB0aGF0IHdlIGNoZWNrIHZhbHVlIGVxdWFsaXR5LgorICAgIGZpcnN0X3Byb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0gKz0gMQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKyAgICBmaXJzdF9wcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dIC09IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisKKyAgICAjIEVuc3VyZSB0aGF0IHdlIGFsc28gbG9vayBhdCAiaGFzIiBiaXRzLgorICAgIGZpcnN0X3Byb3RvLkNsZWFyRXh0ZW5zaW9uKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24pCisgICAgc2Vjb25kX3Byb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0gPSAwCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorICAgIGZpcnN0X3Byb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0gPSAwCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorCisgICAgIyBFbnN1cmUgdGhhdCBkaWZmZXJlbmNlcyBpbiBjYWNoZWQgdmFsdWVzCisgICAgIyBkb24ndCBtYXR0ZXIgaWYgImhhcyIgYml0cyBhcmUgYm90aCBmYWxzZS4KKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAwLCBmaXJzdF9wcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKworCitAdGVzdGluZ19yZWZsZWFrcy5UZXN0Q2FzZQorY2xhc3MgTXV0dWFsUmVjdXJzaW9uRXF1YWxpdHlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdEVxdWFsaXR5V2l0aE11dHVhbFJlY3Vyc2lvbihzZWxmKToKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0TXV0dWFsUmVjdXJzaW9uQSgpCisgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RNdXR1YWxSZWN1cnNpb25BKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisgICAgZmlyc3RfcHJvdG8uYmIuYS5iYi5vcHRpb25hbF9pbnQzMiA9IDIzCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorICAgIHNlY29uZF9wcm90by5iYi5hLmJiLm9wdGlvbmFsX2ludDMyID0gMjMKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisKKworQHRlc3RpbmdfcmVmbGVha3MuVGVzdENhc2UKK2NsYXNzIEJ5dGVTaXplVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYucHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmV4dGVuZGVkX3Byb3RvID0gbW9yZV9leHRlbnNpb25zX3BiMi5FeHRlbmRlZE1lc3NhZ2UoKQorICAgIHNlbGYucGFja2VkX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgc2VsZi5wYWNrZWRfZXh0ZW5kZWRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZEV4dGVuc2lvbnMoKQorCisgIGRlZiBTaXplKHNlbGYpOgorICAgIHJldHVybiBzZWxmLnByb3RvLkJ5dGVTaXplKCkKKworICBkZWYgdGVzdEVtcHR5TWVzc2FnZShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdFNpemVkT25Ld2FyZ3Moc2VsZik6CisgICAgIyBVc2UgYSBzZXBhcmF0ZSBtZXNzYWdlIHRvIGVuc3VyZSB0ZXN0aW5nIHJpZ2h0IGFmdGVyIGNyZWF0aW9uLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5CeXRlU2l6ZSgpKQorICAgIHByb3RvX2t3YXJncyA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMob3B0aW9uYWxfaW50NjQgPSAxKQorICAgICMgT25lIGJ5dGUgZm9yIHRoZSB0YWcsIG9uZSB0byBlbmNvZGUgdmFyaW50IDEuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90b19rd2FyZ3MuQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdFZhcmludHMoc2VsZik6CisgICAgZGVmIFRlc3QoaSwgZXhwZWN0ZWRfdmFyaW50X3NpemUpOgorICAgICAgc2VsZi5wcm90by5DbGVhcigpCisgICAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ludDY0ID0gaQorICAgICAgIyBBZGQgb25lIHRvIHRoZSB2YXJpbnQgc2l6ZSBmb3IgdGhlIHRhZyBpbmZvCisgICAgICAjIGZvciB0YWcgMS4KKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFyaW50X3NpemUgKyAxLCBzZWxmLlNpemUoKSkKKyAgICBUZXN0KDAsIDEpCisgICAgVGVzdCgxLCAxKQorICAgIGZvciBpLCBudW1fYnl0ZXMgaW4gemlwKHJhbmdlKDcsIDYzLCA3KSwgcmFuZ2UoMSwgMTAwMDApKToKKyAgICAgIFRlc3QoKDEgPDwgaSkgLSAxLCBudW1fYnl0ZXMpCisgICAgVGVzdCgtMSwgMTApCisgICAgVGVzdCgtMiwgMTApCisgICAgVGVzdCgtKDEgPDwgNjMpLCAxMCkKKworICBkZWYgdGVzdFN0cmluZ3Moc2VsZik6CisgICAgc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcgPSAnJworICAgICMgTmVlZCBvbmUgYnl0ZSBmb3IgdGFnIGluZm8gKHRhZyAjMTQpLCBhbmQgb25lIGJ5dGUgZm9yIGxlbmd0aC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNlbGYuU2l6ZSgpKQorCisgICAgc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcgPSAnYWJjJworICAgICMgTmVlZCBvbmUgYnl0ZSBmb3IgdGFnIGluZm8gKHRhZyAjMTQpLCBhbmQgb25lIGJ5dGUgZm9yIGxlbmd0aC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyBsZW4oc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcpLCBzZWxmLlNpemUoKSkKKworICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfc3RyaW5nID0gJ3gnICogMTI4CisgICAgIyBOZWVkIG9uZSBieXRlIGZvciB0YWcgaW5mbyAodGFnICMxNCksIGFuZCBUV08gYnl0ZXMgZm9yIGxlbmd0aC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDMgKyBsZW4oc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcpLCBzZWxmLlNpemUoKSkKKworICBkZWYgdGVzdE90aGVyTnVtZXJpY3Moc2VsZik6CisgICAgc2VsZi5wcm90by5vcHRpb25hbF9maXhlZDMyID0gMTIzNAorICAgICMgT25lIGJ5dGUgZm9yIHRhZyBhbmQgNCBieXRlcyBmb3IgZml4ZWQzMi4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHNlbGYuU2l6ZSgpKQorICAgIHNlbGYucHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfZml4ZWQ2NCA9IDEyMzQKKyAgICAjIE9uZSBieXRlIGZvciB0YWcgYW5kIDggYnl0ZXMgZm9yIGZpeGVkNjQuCisgICAgc2VsZi5hc3NlcnRFcXVhbCg5LCBzZWxmLlNpemUoKSkKKyAgICBzZWxmLnByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2Zsb2F0ID0gMS4yMzQKKyAgICAjIE9uZSBieXRlIGZvciB0YWcgYW5kIDQgYnl0ZXMgZm9yIGZsb2F0LgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgc2VsZi5TaXplKCkpCisgICAgc2VsZi5wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgc2VsZi5wcm90by5vcHRpb25hbF9kb3VibGUgPSAxLjIzNAorICAgICMgT25lIGJ5dGUgZm9yIHRhZyBhbmQgOCBieXRlcyBmb3IgZmxvYXQuCisgICAgc2VsZi5hc3NlcnRFcXVhbCg5LCBzZWxmLlNpemUoKSkKKyAgICBzZWxmLnByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX3NpbnQzMiA9IDY0CisgICAgIyBPbmUgYnl0ZSBmb3IgdGFnIGFuZCAyIGJ5dGVzIGZvciB6aWctemFnLWVuY29kZWQgNjQuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBzZWxmLlNpemUoKSkKKyAgICBzZWxmLnByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgZGVmIHRlc3RDb21wb3NpdGVzKHNlbGYpOgorICAgICMgMyBieXRlcy4KKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gKDEgPDwgMTQpCisgICAgIyBQbHVzIG9uZSBieXRlIGZvciBiYiB0YWcuCisgICAgIyBQbHVzIDEgYnl0ZSBmb3Igb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Ugc2VyaWFsaXplZCBzaXplLgorICAgICMgUGx1cyB0d28gYnl0ZXMgZm9yIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHRhZy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDMgKyAxICsgMSArIDIsIHNlbGYuU2l6ZSgpKQorCisgIGRlZiB0ZXN0R3JvdXBzKHNlbGYpOgorICAgICMgNCBieXRlcy4KKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsZ3JvdXAuYSA9ICgxIDw8IDIxKQorICAgICMgUGx1cyB0d28gYnl0ZXMgZm9yIHxhfCB0YWcuCisgICAgIyBQbHVzIDIgKiB0d28gYnl0ZXMgZm9yIFNUQVJUX0dST1VQIGFuZCBFTkRfR1JPVVAgdGFncy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDQgKyAyICsgMioyLCBzZWxmLlNpemUoKSkKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFycyhzZWxmKToKKyAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkgICMgMSBieXRlLgorICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEyOCkgICMgMiBieXRlcy4KKyAgICAjIEFsc28gbmVlZCAyIGJ5dGVzIGZvciBlYWNoIGVudHJ5IGZvciB0YWcuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxICsgMiArIDIqMiwgc2VsZi5TaXplKCkpCisKKyAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhcnNFeHRlbmQoc2VsZik6CisgICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMi5leHRlbmQoWzEwLCAxMjhdKSAgIyAzIGJ5dGVzLgorICAgICMgQWxzbyBuZWVkIDIgYnl0ZXMgZm9yIGVhY2ggZW50cnkgZm9yIHRhZy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDEgKyAyICsgMioyLCBzZWxmLlNpemUoKSkKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyc1JlbW92ZShzZWxmKToKKyAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkgICMgMSBieXRlLgorICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEyOCkgICMgMiBieXRlcy4KKyAgICAjIEFsc28gbmVlZCAyIGJ5dGVzIGZvciBlYWNoIGVudHJ5IGZvciB0YWcuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxICsgMiArIDIqMiwgc2VsZi5TaXplKCkpCisgICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMi5yZW1vdmUoMTI4KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSArIDIsIHNlbGYuU2l6ZSgpKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGVzKHNlbGYpOgorICAgICMgRW1wdHkgbWVzc2FnZS4gIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aC4KKyAgICBmb3JlaWduX21lc3NhZ2VfMCA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICAjIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aCBwbHVzIDEgYnl0ZSBiYiB0YWcgMSBieXRlIGludC4KKyAgICBmb3JlaWduX21lc3NhZ2VfMSA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBmb3JlaWduX21lc3NhZ2VfMS5iYiA9IDcKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyAxICsgMiArIDEgKyAxICsgMSwgc2VsZi5TaXplKCkpCisKKyAgZGVmIHRlc3RSZXBlYXRlZENvbXBvc2l0ZXNEZWxldGUoc2VsZik6CisgICAgIyBFbXB0eSBtZXNzYWdlLiAgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoLgorICAgIGZvcmVpZ25fbWVzc2FnZV8wID0gc2VsZi5wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgorICAgIGZvcmVpZ25fbWVzc2FnZV8xID0gc2VsZi5wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIGZvcmVpZ25fbWVzc2FnZV8xLmJiID0gOQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIDEgKyAyICsgMSArIDEgKyAxLCBzZWxmLlNpemUoKSkKKyAgICByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSA9IGNvcHkuZGVlcGNvcHkoCisgICAgICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisKKyAgICAjIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aCBwbHVzIDEgYnl0ZSBiYiB0YWcgMSBieXRlIGludC4KKyAgICBkZWwgc2VsZi5wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIDEgKyAxICsgMSwgc2VsZi5TaXplKCkpCisKKyAgICAjIE5vdyBhZGQgYSBuZXcgbWVzc2FnZS4KKyAgICBmb3JlaWduX21lc3NhZ2VfMiA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBmb3JlaWduX21lc3NhZ2VfMi5iYiA9IDEyCisKKyAgICAjIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aCBwbHVzIDEgYnl0ZSBiYiB0YWcgMSBieXRlIGludC4KKyAgICAjIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aCBwbHVzIDEgYnl0ZSBiYiB0YWcgMSBieXRlIGludC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyAxICsgMSArIDEgKyAyICsgMSArIDEgKyAxLCBzZWxmLlNpemUoKSkKKworICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgorICAgIGRlbCBzZWxmLnByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzFdCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyICsgMSArIDEgKyAxLCBzZWxmLlNpemUoKSkKKworICAgIGRlbCBzZWxmLnByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLlNpemUoKSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKKyAgICBkZWwgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMDoxXQorICAgICMgVE9ETyhqaWVsdW8pOiBGaXggY3BwIGV4dGVuc2lvbiBidWcgd2hlbiBkZWxldGUgcmVwZWF0ZWQgbWVzc2FnZS4KKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdweXRob24nOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4ocmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQorICAgIGRlbCByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVstMV0KKyAgICAjIFRPRE8oamllbHVvKTogRml4IGNwcCBleHRlbnNpb24gYnVnIHdoZW4gZGVsZXRlIHJlcGVhdGVkIG1lc3NhZ2UuCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAncHl0aG9uJzoKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKKworICBkZWYgdGVzdFJlcGVhdGVkR3JvdXBzKHNlbGYpOgorICAgICMgMi1ieXRlIFNUQVJUX0dST1VQIHBsdXMgMi1ieXRlIEVORF9HUk9VUC4KKyAgICBncm91cF8wID0gc2VsZi5wcm90by5yZXBlYXRlZGdyb3VwLmFkZCgpCisgICAgIyAyLWJ5dGUgU1RBUlRfR1JPVVAgcGx1cyAyLWJ5dGUgfGF8IHRhZyArIDEtYnl0ZSB8YXwKKyAgICAjIHBsdXMgMi1ieXRlIEVORF9HUk9VUC4KKyAgICBncm91cF8xID0gc2VsZi5wcm90by5yZXBlYXRlZGdyb3VwLmFkZCgpCisgICAgZ3JvdXBfMS5hID0gIDcKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyAyICsgMiArIDIgKyAxICsgMiwgc2VsZi5TaXplKCkpCisKKyAgZGVmIHRlc3RFeHRlbnNpb25zKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLkJ5dGVTaXplKCkpCisgICAgZXh0ZW5zaW9uID0gdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgIyBGaWVsZCAjMSwgMSBieXRlLgorICAgIHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9IDIzCisgICAgIyAxIGJ5dGUgZm9yIHRhZywgMSBieXRlIGZvciB2YWx1ZS4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvLkJ5dGVTaXplKCkpCisgICAgZmllbGQgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbCisgICAgICAgICdvcHRpb25hbF9pbnQzMiddCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICBwcm90by5FeHRlbnNpb25zW2ZpZWxkXSA9IDIzCisKKyAgZGVmIHRlc3RDYWNoZUludmFsaWRhdGlvbkZvck5vbnJlcGVhdGVkU2NhbGFyKHNlbGYpOgorICAgICMgVGVzdCBub24tZXh0ZW5zaW9uLgorICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfaW50MzIgPSAxCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5wcm90by5vcHRpb25hbF9pbnQzMiA9IDEyOAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorICAgIHNlbGYucHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorCisgICAgIyBUZXN0IHdpdGhpbiBleHRlbnNpb24uCisgICAgZXh0ZW5zaW9uID0gbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9pbnRfZXh0ZW5zaW9uCisgICAgc2VsZi5leHRlbmRlZF9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0gPSAxCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5leHRlbmRlZF9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0gPSAxMjgKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLmV4dGVuZGVkX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdENhY2hlSW52YWxpZGF0aW9uRm9yUmVwZWF0ZWRTY2FsYXIoc2VsZik6CisgICAgIyBUZXN0IG5vbi1leHRlbnNpb24uCisgICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNiwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzJbMV0gPSAxMjgKKyAgICBzZWxmLmFzc2VydEVxdWFsKDcsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLnByb3RvLkNsZWFyRmllbGQoJ3JlcGVhdGVkX2ludDMyJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKworICAgICMgVGVzdCB3aXRoaW4gZXh0ZW5zaW9uLgorICAgIGV4dGVuc2lvbiA9IG1vcmVfZXh0ZW5zaW9uc19wYjIucmVwZWF0ZWRfaW50X2V4dGVuc2lvbgorICAgIHJlcGVhdGVkID0gc2VsZi5leHRlbmRlZF9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0KKyAgICByZXBlYXRlZC5hcHBlbmQoMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICByZXBlYXRlZC5hcHBlbmQoMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICByZXBlYXRlZFsxXSA9IDEyOAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorICAgIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorCisgIGRlZiB0ZXN0Q2FjaGVJbnZhbGlkYXRpb25Gb3JOb25yZXBlYXRlZE1lc3NhZ2Uoc2VsZik6CisgICAgIyBUZXN0IG5vbi1leHRlbnNpb24uCisgICAgc2VsZi5wcm90by5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UuYyA9IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5jID0gMTI4CisgICAgc2VsZi5hc3NlcnRFcXVhbCg2LCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5wcm90by5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UuQ2xlYXJGaWVsZCgnYycpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5wcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAncHl0aG9uJzoKKyAgICAgICMgVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGluIHB1cmUtUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkuCisgICAgICBjaGlsZCA9IHNlbGYucHJvdG8ub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlCisgICAgICBzZWxmLnByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScpCisgICAgICBjaGlsZC5jID0gMTI4CisgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKworICAgICMgVGVzdCB3aXRoaW4gZXh0ZW5zaW9uLgorICAgIGV4dGVuc2lvbiA9IG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfbWVzc2FnZV9leHRlbnNpb24KKyAgICBjaGlsZCA9IHNlbGYuZXh0ZW5kZWRfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisgICAgY2hpbGQuZm9yZWlnbl9tZXNzYWdlX2ludCA9IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBjaGlsZC5mb3JlaWduX21lc3NhZ2VfaW50ID0gMTI4CisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5leHRlbmRlZF9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisKKyAgZGVmIHRlc3RDYWNoZUludmFsaWRhdGlvbkZvclJlcGVhdGVkTWVzc2FnZShzZWxmKToKKyAgICAjIFRlc3Qgbm9uLWV4dGVuc2lvbi4KKyAgICBjaGlsZDAgPSBzZWxmLnByb3RvLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZS5hZGQoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlLmFkZCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg2LCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisgICAgY2hpbGQwLmMgPSAxCisgICAgc2VsZi5hc3NlcnRFcXVhbCg4LCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5wcm90by5DbGVhckZpZWxkKCdyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorCisgICAgIyBUZXN0IHdpdGhpbiBleHRlbnNpb24uCisgICAgZXh0ZW5zaW9uID0gbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9tZXNzYWdlX2V4dGVuc2lvbgorICAgIGNoaWxkX2xpc3QgPSBzZWxmLmV4dGVuZGVkX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXQorICAgIGNoaWxkMCA9IGNoaWxkX2xpc3QuYWRkKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBjaGlsZF9saXN0LmFkZCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisgICAgY2hpbGQwLmZvcmVpZ25fbWVzc2FnZV9pbnQgPSAxCisgICAgc2VsZi5hc3NlcnRFcXVhbCg2LCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisgICAgY2hpbGQwLkNsZWFyRmllbGQoJ2ZvcmVpZ25fbWVzc2FnZV9pbnQnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorICAgIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorCisgIGRlZiB0ZXN0UGFja2VkUmVwZWF0ZWRTY2FsYXJzKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5wYWNrZWRfcHJvdG8uQnl0ZVNpemUoKSkKKworICAgIHNlbGYucGFja2VkX3Byb3RvLnBhY2tlZF9pbnQzMi5hcHBlbmQoMTApICAgIyAxIGJ5dGUuCisgICAgc2VsZi5wYWNrZWRfcHJvdG8ucGFja2VkX2ludDMyLmFwcGVuZCgxMjgpICAjIDIgYnl0ZXMuCisgICAgIyBUaGUgdGFnIGlzIDIgYnl0ZXMgKHRoZSBmaWVsZCBudW1iZXIgaXMgOTApLCBhbmQgdGhlIHZhcmludAorICAgICMgc3RvcmluZyB0aGUgbGVuZ3RoIGlzIDEgYnl0ZS4KKyAgICBpbnRfc2l6ZSA9IDEgKyAyICsgMworICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50X3NpemUsIHNlbGYucGFja2VkX3Byb3RvLkJ5dGVTaXplKCkpCisKKyAgICBzZWxmLnBhY2tlZF9wcm90by5wYWNrZWRfZG91YmxlLmFwcGVuZCg0LjIpICAgIyA4IGJ5dGVzCisgICAgc2VsZi5wYWNrZWRfcHJvdG8ucGFja2VkX2RvdWJsZS5hcHBlbmQoMy4yNSkgICMgOCBieXRlcworICAgICMgMiBtb3JlIHRhZyBieXRlcywgMSBtb3JlIGxlbmd0aCBieXRlLgorICAgIGRvdWJsZV9zaXplID0gOCArIDggKyAzCisgICAgc2VsZi5hc3NlcnRFcXVhbChpbnRfc2l6ZStkb3VibGVfc2l6ZSwgc2VsZi5wYWNrZWRfcHJvdG8uQnl0ZVNpemUoKSkKKworICAgIHNlbGYucGFja2VkX3Byb3RvLkNsZWFyRmllbGQoJ3BhY2tlZF9pbnQzMicpCisgICAgc2VsZi5hc3NlcnRFcXVhbChkb3VibGVfc2l6ZSwgc2VsZi5wYWNrZWRfcHJvdG8uQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdFBhY2tlZEV4dGVuc2lvbnMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnBhY2tlZF9leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorICAgIGV4dGVuc2lvbiA9IHNlbGYucGFja2VkX2V4dGVuZGVkX3Byb3RvLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X3BiMi5wYWNrZWRfZml4ZWQzMl9leHRlbnNpb25dCisgICAgZXh0ZW5zaW9uLmV4dGVuZChbMSwgMiwgMywgNF0pICAgIyAxNiBieXRlcworICAgICMgVGFnIGlzIDMgYnl0ZXMuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxOSwgc2VsZi5wYWNrZWRfZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKworCisjIElzc3VlcyB0byBiZSBzdXJlIHRvIGNvdmVyIGluY2x1ZGU6CisjICAgKiBIYW5kbGluZyBvZiB1bnJlY29nbml6ZWQgdGFncyAoInVuaW50ZXJwcmV0ZWRfYnl0ZXMiKS4KKyMgICAqIEhhbmRsaW5nIG9mIE1lc3NhZ2VTZXRzLgorIyAgICogQ29uc2lzdGVudCBvcmRlcmluZyBvZiB0YWdzIGluIHRoZSB3aXJlIGZvcm1hdCwKKyMgICAgIGluY2x1ZGluZyBvcmRlcmluZyBiZXR3ZWVuIGV4dGVuc2lvbnMgYW5kIG5vbi1leHRlbnNpb24KKyMgICAgIGZpZWxkcy4KKyMgICAqIENvbnNpc3RlbnQgc2VyaWFsaXphdGlvbiBvZiBuZWdhdGl2ZSBudW1iZXJzLCBlc3BlY2lhbGx5CisjICAgICBuZWdhdGl2ZSBpbnQzMnMuCisjICAgKiBIYW5kbGluZyBvZiBlbXB0eSBzdWJtZXNzYWdlcyAod2l0aCBhbmQgd2l0aG91dCAiaGFzIgorIyAgICAgYml0cyBzZXQpLgorCitAdGVzdGluZ19yZWZsZWFrcy5UZXN0Q2FzZQorY2xhc3MgU2VyaWFsaXphdGlvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiB0ZXN0U2VyaWFsaXplRW10cHlNZXNzYWdlKHNlbGYpOgorICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VyaWFsaXplZCA9IGZpcnN0X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLkJ5dGVTaXplKCksIGxlbihzZXJpYWxpemVkKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBsZW4oc2VyaWFsaXplZCksCisgICAgICAgIHNlY29uZF9wcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorCisgIGRlZiB0ZXN0U2VyaWFsaXplQWxsRmllbGRzKHNlbGYpOgorICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhmaXJzdF9wcm90bykKKyAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8uQnl0ZVNpemUoKSwgbGVuKHNlcmlhbGl6ZWQpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGxlbihzZXJpYWxpemVkKSwKKyAgICAgICAgc2Vjb25kX3Byb3RvLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisKKyAgZGVmIHRlc3RTZXJpYWxpemVBbGxFeHRlbnNpb25zKHNlbGYpOgorICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxFeHRlbnNpb25zKGZpcnN0X3Byb3RvKQorICAgIHNlcmlhbGl6ZWQgPSBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgbGVuKHNlcmlhbGl6ZWQpLAorICAgICAgICBzZWNvbmRfcHJvdG8uTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKworICBkZWYgdGVzdFNlcmlhbGl6ZVdpdGhPcHRpb25hbEdyb3VwKHNlbGYpOgorICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgZmlyc3RfcHJvdG8ub3B0aW9uYWxncm91cC5hID0gMjQyCisgICAgc2VyaWFsaXplZCA9IGZpcnN0X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBsZW4oc2VyaWFsaXplZCksCisgICAgICAgIHNlY29uZF9wcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorCisgIGRlZiB0ZXN0U2VyaWFsaXplTmVnYXRpdmVWYWx1ZXMoc2VsZik6CisgICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX2ludDMyID0gLTEKKyAgICBmaXJzdF9wcm90by5vcHRpb25hbF9pbnQ2NCA9IC0oMiA8PCA0MCkKKyAgICBmaXJzdF9wcm90by5vcHRpb25hbF9zaW50MzIgPSAtMworICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX3NpbnQ2NCA9IC0oNCA8PCA0MCkKKyAgICBmaXJzdF9wcm90by5vcHRpb25hbF9zZml4ZWQzMiA9IC01CisgICAgZmlyc3RfcHJvdG8ub3B0aW9uYWxfc2ZpeGVkNjQgPSAtKDYgPDwgNDApCisKKyAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZyb21TdHJpbmcoCisgICAgICAgIGZpcnN0X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisKKyAgZGVmIHRlc3RQYXJzZVRydW5jYXRlZChzZWxmKToKKyAgICAjIFRoaXMgdGVzdCBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSS4KKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nOgorICAgICAgcmV0dXJuCisKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMoZmlyc3RfcHJvdG8pCisgICAgc2VyaWFsaXplZCA9IG1lbW9yeXZpZXcoZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKSkKKworICAgIGZvciB0cnVuY2F0aW9uX3BvaW50IGluIHJhbmdlKGxlbihzZXJpYWxpemVkKSArIDEpOgorICAgICAgdHJ5OgorICAgICAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICAgICAgdW5rbm93bl9maWVsZHMgPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCisgICAgICAgIHBvcyA9IHNlY29uZF9wcm90by5fSW50ZXJuYWxQYXJzZShzZXJpYWxpemVkLCAwLCB0cnVuY2F0aW9uX3BvaW50KQorICAgICAgICAjIElmIHdlIGRpZG4ndCByYWlzZSBhbiBlcnJvciB0aGVuIHdlIHJlYWQgZXhhY3RseSB0aGUgYW1vdW50IGV4cGVjdGVkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRydW5jYXRpb25fcG9pbnQsIHBvcykKKworICAgICAgICAjIFBhcnNpbmcgdG8gdW5rbm93biBmaWVsZHMgc2hvdWxkIG5vdCB0aHJvdyBpZiBwYXJzaW5nIHRvIGtub3duIGZpZWxkcworICAgICAgICAjIGRpZCBub3QuCisgICAgICAgIHRyeToKKyAgICAgICAgICBwb3MyID0gdW5rbm93bl9maWVsZHMuX0ludGVybmFsUGFyc2Uoc2VyaWFsaXplZCwgMCwgdHJ1bmNhdGlvbl9wb2ludCkKKyAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRydW5jYXRpb25fcG9pbnQsIHBvczIpCisgICAgICAgIGV4Y2VwdCBtZXNzYWdlLkRlY29kZUVycm9yOgorICAgICAgICAgIHNlbGYuZmFpbCgnUGFyc2luZyB1bmtub3duIGZpZWxkcyBmYWlsZWQgd2hlbiBwYXJzaW5nIGtub3duIGZpZWxkcyAnCisgICAgICAgICAgICAgICAgICAgICdkaWQgbm90LicpCisgICAgICBleGNlcHQgbWVzc2FnZS5EZWNvZGVFcnJvcjoKKyAgICAgICAgIyBQYXJzaW5nIHVua25vd24gZmllbGRzIHNob3VsZCBhbHNvIGZhaWwuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG1lc3NhZ2UuRGVjb2RlRXJyb3IsIHVua25vd25fZmllbGRzLl9JbnRlcm5hbFBhcnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkLCAwLCB0cnVuY2F0aW9uX3BvaW50KQorCisgIGRlZiB0ZXN0Q2Fub25pY2FsU2VyaWFsaXphdGlvbk9yZGVyKHNlbGYpOgorICAgIHByb3RvID0gbW9yZV9tZXNzYWdlc19wYjIuT3V0T2ZPcmRlckZpZWxkcygpCisgICAgIyBUaGVzZSBhcmUgYWxzbyB0aGVpciB0YWcgbnVtYmVycy4gIEV2ZW4gdGhvdWdoIHdlJ3JlIHNldHRpbmcgdGhlc2UgaW4KKyAgICAjIHJldmVyc2UtdGFnIG9yZGVyIEFORCB0aGV5J3JlIGxpc3RlZCBpbiByZXZlcnNlIHRhZy1vcmRlciBpbiB0aGUgLnByb3RvCisgICAgIyBmaWxlLCB0aGV5IHNob3VsZCBub25ldGhlbGVzcyBiZSBzZXJpYWxpemVkIGluIHRhZyBvcmRlci4KKyAgICBwcm90by5vcHRpb25hbF9zaW50MzIgPSA1CisgICAgcHJvdG8uRXh0ZW5zaW9uc1ttb3JlX21lc3NhZ2VzX3BiMi5vcHRpb25hbF91aW50NjRdID0gNAorICAgIHByb3RvLm9wdGlvbmFsX3VpbnQzMiA9IDMKKyAgICBwcm90by5FeHRlbnNpb25zW21vcmVfbWVzc2FnZXNfcGIyLm9wdGlvbmFsX2ludDY0XSA9IDIKKyAgICBwcm90by5vcHRpb25hbF9pbnQzMiA9IDEKKyAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uQnl0ZVNpemUoKSwgbGVuKHNlcmlhbGl6ZWQpKQorICAgIGQgPSBfTWluaURlY29kZXIoc2VyaWFsaXplZCkKKyAgICBSZWFkVGFnID0gZC5SZWFkRmllbGROdW1iZXJBbmRXaXJlVHlwZQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCksIFJlYWRUYWcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGQuUmVhZEludDMyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgoMiwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKSwgUmVhZFRhZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgZC5SZWFkSW50NjQoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCgzLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpLCBSZWFkVGFnKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBkLlJlYWRVSW50MzIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCg0LCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpLCBSZWFkVGFnKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBkLlJlYWRVSW50NjQoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCg1LCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpLCBSZWFkVGFnKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBkLlJlYWRTSW50MzIoKSkKKworICBkZWYgdGVzdENhbm9uaWNhbFNlcmlhbGl6YXRpb25PcmRlclNhbWVBc0NwcChzZWxmKToKKyAgICAjIENvcHkgb2YgdGhlIHNhbWUgdGVzdCB3ZSB1c2UgZm9yIEMrKy4KKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0RmllbGRPcmRlcmluZ3MoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKHByb3RvKQorICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisgICAgdGVzdF91dGlsLkV4cGVjdEFsbEZpZWxkc0FuZEV4dGVuc2lvbnNJbk9yZGVyKHNlcmlhbGl6ZWQpCisKKyAgZGVmIHRlc3RNZXJnZUZyb21TdHJpbmdXaGVuRmllbGRzQWxyZWFkeVNldChzZWxmKToKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIGZpcnN0X3Byb3RvLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2Zvb2JhcicpCisgICAgZmlyc3RfcHJvdG8ub3B0aW9uYWxfaW50MzIgPSAyMworICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gNDIKKyAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2Vjb25kX3Byb3RvLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2JheicpCisgICAgc2Vjb25kX3Byb3RvLm9wdGlvbmFsX2ludDMyID0gMTAwCisgICAgc2Vjb25kX3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gOTk5CisKKyAgICBieXRlc19wYXJzZWQgPSBzZWNvbmRfcHJvdG8uTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VyaWFsaXplZCksIGJ5dGVzX3BhcnNlZCkKKworICAgICMgRW5zdXJlIHRoYXQgd2UgYXBwZW5kIHRvIHJlcGVhdGVkIGZpZWxkcy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKFsnYmF6JywgJ2Zvb2JhciddLCBsaXN0KHNlY29uZF9wcm90by5yZXBlYXRlZF9zdHJpbmcpKQorICAgICMgRW5zdXJlIHRoYXQgd2Ugb3ZlcndyaXRlIG5vbnJlcGVhdGQgc2NhbGFycy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCBzZWNvbmRfcHJvdG8ub3B0aW9uYWxfaW50MzIpCisgICAgIyBFbnN1cmUgdGhhdCB3ZSByZWN1cnNpdmVseSBjYWxsIE1lcmdlRnJvbVN0cmluZygpIG9uCisgICAgIyBzdWJtZXNzYWdlcy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBzZWNvbmRfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisKKyAgZGVmIHRlc3RNZXNzYWdlU2V0V2lyZUZvcm1hdChzZWxmKToKKyAgICBwcm90byA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLlRlc3RNZXNzYWdlU2V0KCkKKyAgICBleHRlbnNpb25fbWVzc2FnZTEgPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEKKyAgICBleHRlbnNpb25fbWVzc2FnZTIgPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIKKyAgICBleHRlbnNpb24xID0gZXh0ZW5zaW9uX21lc3NhZ2UxLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIGV4dGVuc2lvbjIgPSBleHRlbnNpb25fbWVzc2FnZTIubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCisgICAgZXh0ZW5zaW9uMyA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbjMKKyAgICBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbjFdLmkgPSAxMjMKKyAgICBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbjJdLnN0ciA9ICdmb28nCisgICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb24zXS50ZXh0ID0gJ2JhcicKKworICAgICMgU2VyaWFsaXplIHVzaW5nIHRoZSBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0ICh0aGlzIGlzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAjIC5wcm90byBmaWxlKS4KKyAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgcmF3ID0gdW5pdHRlc3RfbXNldF9wYjIuUmF3TWVzc2FnZVNldCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgIHJhdy5ERVNDUklQVE9SLkdldE9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBsZW4oc2VyaWFsaXplZCksCisgICAgICAgIHJhdy5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsZW4ocmF3Lml0ZW0pKQorCisgICAgbWVzc2FnZTEgPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGxlbihyYXcuaXRlbVswXS5tZXNzYWdlKSwKKyAgICAgICAgbWVzc2FnZTEuTWVyZ2VGcm9tU3RyaW5nKHJhdy5pdGVtWzBdLm1lc3NhZ2UpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzLCBtZXNzYWdlMS5pKQorCisgICAgbWVzc2FnZTIgPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGxlbihyYXcuaXRlbVsxXS5tZXNzYWdlKSwKKyAgICAgICAgbWVzc2FnZTIuTWVyZ2VGcm9tU3RyaW5nKHJhdy5pdGVtWzFdLm1lc3NhZ2UpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbycsIG1lc3NhZ2UyLnN0cikKKworICAgIG1lc3NhZ2UzID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24zKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBsZW4ocmF3Lml0ZW1bMl0ubWVzc2FnZSksCisgICAgICAgIG1lc3NhZ2UzLk1lcmdlRnJvbVN0cmluZyhyYXcuaXRlbVsyXS5tZXNzYWdlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdiYXInLCBtZXNzYWdlMy50ZXh0KQorCisgICAgIyBEZXNlcmlhbGl6ZSB1c2luZyB0aGUgTWVzc2FnZVNldCB3aXJlIGZvcm1hdC4KKyAgICBwcm90bzIgPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5UZXN0TWVzc2FnZVNldCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgbGVuKHNlcmlhbGl6ZWQpLAorICAgICAgICBwcm90bzIuTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzLCBwcm90bzIuRXh0ZW5zaW9uc1tleHRlbnNpb24xXS5pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbycsIHByb3RvMi5FeHRlbnNpb25zW2V4dGVuc2lvbjJdLnN0cikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdiYXInLCBwcm90bzIuRXh0ZW5zaW9uc1tleHRlbnNpb24zXS50ZXh0KQorCisgICAgIyBDaGVjayBieXRlIHNpemUuCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90bzIuQnl0ZVNpemUoKSwgbGVuKHNlcmlhbGl6ZWQpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uQnl0ZVNpemUoKSwgbGVuKHNlcmlhbGl6ZWQpKQorCisgIGRlZiB0ZXN0TWVzc2FnZVNldFdpcmVGb3JtYXRVbmtub3duRXh0ZW5zaW9uKHNlbGYpOgorICAgICMgQ3JlYXRlIGEgbWVzc2FnZSB1c2luZyB0aGUgbWVzc2FnZSBzZXQgd2lyZSBmb3JtYXQgd2l0aCBhbiB1bmtub3duCisgICAgIyBtZXNzYWdlLgorICAgIHJhdyA9IHVuaXR0ZXN0X21zZXRfcGIyLlJhd01lc3NhZ2VTZXQoKQorCisgICAgIyBBZGQgYW4gaXRlbS4KKyAgICBpdGVtID0gcmF3Lml0ZW0uYWRkKCkKKyAgICBpdGVtLnR5cGVfaWQgPSA5ODQxODYwMworICAgIGV4dGVuc2lvbl9tZXNzYWdlMSA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMQorICAgIG1lc3NhZ2UxID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xKCkKKyAgICBtZXNzYWdlMS5pID0gMTIzNDUKKyAgICBpdGVtLm1lc3NhZ2UgPSBtZXNzYWdlMS5TZXJpYWxpemVUb1N0cmluZygpCisKKyAgICAjIEFkZCBhIHNlY29uZCwgdW5rbm93biBleHRlbnNpb24uCisgICAgaXRlbSA9IHJhdy5pdGVtLmFkZCgpCisgICAgaXRlbS50eXBlX2lkID0gOTg0MTg2MDQKKyAgICBleHRlbnNpb25fbWVzc2FnZTEgPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEKKyAgICBtZXNzYWdlMSA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSgpCisgICAgbWVzc2FnZTEuaSA9IDEyMzQ2CisgICAgaXRlbS5tZXNzYWdlID0gbWVzc2FnZTEuU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgIyBBZGQgYW5vdGhlciB1bmtub3duIGV4dGVuc2lvbi4KKyAgICBpdGVtID0gcmF3Lml0ZW0uYWRkKCkKKyAgICBpdGVtLnR5cGVfaWQgPSA5ODQxODYwNQorICAgIG1lc3NhZ2UxID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yKCkKKyAgICBtZXNzYWdlMS5zdHIgPSAnZm9vJworICAgIGl0ZW0ubWVzc2FnZSA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgIHNlcmlhbGl6ZWQgPSByYXcuU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgIyBQYXJzZSBtZXNzYWdlIHVzaW5nIHRoZSBtZXNzYWdlIHNldCB3aXJlIGZvcm1hdC4KKyAgICBwcm90byA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLlRlc3RNZXNzYWdlU2V0KCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBsZW4oc2VyaWFsaXplZCksCisgICAgICAgIHByb3RvLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKSkKKworICAgICMgQ2hlY2sgdGhhdCB0aGUgbWVzc2FnZSBwYXJzZWQgd2VsbC4KKyAgICBleHRlbnNpb25fbWVzc2FnZTEgPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEKKyAgICBleHRlbnNpb24xID0gZXh0ZW5zaW9uX21lc3NhZ2UxLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzNDUsIHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uMV0uaSkKKworICBkZWYgdGVzdFVua25vd25GaWVsZHMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHByb3RvKQorCisgICAgc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgICMgVGhlIGVtcHR5IG1lc3NhZ2Ugc2hvdWxkIGJlIHBhcnNhYmxlIHdpdGggYWxsIG9mIHRoZSBmaWVsZHMKKyAgICAjIHVua25vd24uCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UoKQorCisgICAgIyBQYXJzaW5nIHRoaXMgbWVzc2FnZSBzaG91bGQgc3VjY2VlZC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBsZW4oc2VyaWFsaXplZCksCisgICAgICAgIHByb3RvMi5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpCisKKyAgICAjIE5vdyB0ZXN0IHdpdGggYSBpbnQ2NCBmaWVsZCBzZXQuCisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90by5vcHRpb25hbF9pbnQ2NCA9IDB4MGZmZmZmZmZmZmZmZmZmZgorICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisgICAgIyBUaGUgZW1wdHkgbWVzc2FnZSBzaG91bGQgYmUgcGFyc2FibGUgd2l0aCBhbGwgb2YgdGhlIGZpZWxkcworICAgICMgdW5rbm93bi4KKyAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCisgICAgIyBQYXJzaW5nIHRoaXMgbWVzc2FnZSBzaG91bGQgc3VjY2VlZC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBsZW4oc2VyaWFsaXplZCksCisgICAgICAgIHByb3RvMi5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpCisKKyAgZGVmIF9DaGVja1JhaXNlcyhzZWxmLCBleGNfY2xhc3MsIGNhbGxhYmxlX29iaiwgZXhjZXB0aW9uKToKKyAgICAiIiJUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIGV4Y2VwdGlvbiB0eXBlIGFuZCBtZXNzYWdlIGFyZSBhcyBleHBlY3RlZC4iIiIKKyAgICB0cnk6CisgICAgICBjYWxsYWJsZV9vYmooKQorICAgIGV4Y2VwdCBleGNfY2xhc3MgYXMgZXg6CisgICAgICAjIENoZWNrIGlmIHRoZSBleGNlcHRpb24gbWVzc2FnZSBpcyB0aGUgcmlnaHQgb25lLgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGNlcHRpb24sIHN0cihleCkpCisgICAgICByZXR1cm4KKyAgICBlbHNlOgorICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKCclcyBub3QgcmFpc2VkJyAlIHN0cihleGNfY2xhc3MpKQorCisgIGRlZiB0ZXN0U2VyaWFsaXplVW5pbml0aWFsaXplZChzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoKQorICAgIHNlbGYuX0NoZWNrUmFpc2VzKAorICAgICAgICBtZXNzYWdlLkVuY29kZUVycm9yLAorICAgICAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZywKKyAgICAgICAgJ01lc3NhZ2UgcHJvdG9idWZfdW5pdHRlc3QuVGVzdFJlcXVpcmVkIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAnCisgICAgICAgICdhLGIsYycpCisgICAgIyBTaG91bGRuJ3QgcmFpc2UgZXhjZXB0aW9ucy4KKyAgICBwYXJ0aWFsID0gcHJvdG8uU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKCkKKworICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8yLkhhc0ZpZWxkKCdhJykpCisgICAgIyBwcm90bzIgUGFyc2VGcm9tU3RyaW5nIGRvZXMgbm90IGNoZWNrIHRoYXQgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQuCisgICAgcHJvdG8yLlBhcnNlRnJvbVN0cmluZyhwYXJ0aWFsKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8yLkhhc0ZpZWxkKCdhJykpCisKKyAgICBwcm90by5hID0gMQorICAgIHNlbGYuX0NoZWNrUmFpc2VzKAorICAgICAgICBtZXNzYWdlLkVuY29kZUVycm9yLAorICAgICAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZywKKyAgICAgICAgJ01lc3NhZ2UgcHJvdG9idWZfdW5pdHRlc3QuVGVzdFJlcXVpcmVkIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiBiLGMnKQorICAgICMgU2hvdWxkbid0IHJhaXNlIGV4Y2VwdGlvbnMuCisgICAgcGFydGlhbCA9IHByb3RvLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCisKKyAgICBwcm90by5iID0gMgorICAgIHNlbGYuX0NoZWNrUmFpc2VzKAorICAgICAgICBtZXNzYWdlLkVuY29kZUVycm9yLAorICAgICAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZywKKyAgICAgICAgJ01lc3NhZ2UgcHJvdG9idWZfdW5pdHRlc3QuVGVzdFJlcXVpcmVkIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiBjJykKKyAgICAjIFNob3VsZG4ndCByYWlzZSBleGNlcHRpb25zLgorICAgIHBhcnRpYWwgPSBwcm90by5TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoKQorCisgICAgcHJvdG8uYyA9IDMKKyAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorICAgICMgU2hvdWxkbid0IHJhaXNlIGV4Y2VwdGlvbnMuCisgICAgcGFydGlhbCA9IHByb3RvLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCisKKyAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBsZW4oc2VyaWFsaXplZCksCisgICAgICAgIHByb3RvMi5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90bzIuYSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvMi5iKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgcHJvdG8yLmMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgbGVuKHBhcnRpYWwpLAorICAgICAgICBwcm90bzIuTWVyZ2VGcm9tU3RyaW5nKHBhcnRpYWwpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8yLmEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90bzIuYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHByb3RvMi5jKQorCisgIGRlZiB0ZXN0U2VyaWFsaXplVW5pbml0aWFsaXplZFN1Yk1lc3NhZ2Uoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkRm9yZWlnbigpCisKKyAgICAjIFN1Yi1tZXNzYWdlIGRvZXNuJ3QgZXhpc3QgeWV0LCBzbyB0aGlzIHN1Y2NlZWRzLgorICAgIHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgIHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuYSA9IDEKKyAgICBzZWxmLl9DaGVja1JhaXNlcygKKyAgICAgICAgbWVzc2FnZS5FbmNvZGVFcnJvciwKKyAgICAgICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcsCisgICAgICAgICdNZXNzYWdlIHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZEZvcmVpZ24gJworICAgICAgICAnaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICcKKyAgICAgICAgJ29wdGlvbmFsX21lc3NhZ2UuYixvcHRpb25hbF9tZXNzYWdlLmMnKQorCisgICAgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5iID0gMgorICAgIHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuYyA9IDMKKyAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisKKyAgICBwcm90by5yZXBlYXRlZF9tZXNzYWdlLmFkZCgpLmEgPSAxCisgICAgcHJvdG8ucmVwZWF0ZWRfbWVzc2FnZS5hZGQoKS5iID0gMgorICAgIHNlbGYuX0NoZWNrUmFpc2VzKAorICAgICAgICBtZXNzYWdlLkVuY29kZUVycm9yLAorICAgICAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZywKKyAgICAgICAgJ01lc3NhZ2UgcHJvdG9idWZfdW5pdHRlc3QuVGVzdFJlcXVpcmVkRm9yZWlnbiBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogJworICAgICAgICAncmVwZWF0ZWRfbWVzc2FnZVswXS5iLHJlcGVhdGVkX21lc3NhZ2VbMF0uYywnCisgICAgICAgICdyZXBlYXRlZF9tZXNzYWdlWzFdLmEscmVwZWF0ZWRfbWVzc2FnZVsxXS5jJykKKworICAgIHByb3RvLnJlcGVhdGVkX21lc3NhZ2VbMF0uYiA9IDIKKyAgICBwcm90by5yZXBlYXRlZF9tZXNzYWdlWzBdLmMgPSAzCisgICAgcHJvdG8ucmVwZWF0ZWRfbWVzc2FnZVsxXS5hID0gMQorICAgIHByb3RvLnJlcGVhdGVkX21lc3NhZ2VbMV0uYyA9IDMKKyAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisKKyAgZGVmIHRlc3RTZXJpYWxpemVBbGxQYWNrZWRGaWVsZHMoc2VsZik6CisgICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsUGFja2VkRmllbGRzKGZpcnN0X3Byb3RvKQorICAgIHNlcmlhbGl6ZWQgPSBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90by5CeXRlU2l6ZSgpLCBsZW4oc2VyaWFsaXplZCkpCisgICAgYnl0ZXNfcmVhZCA9IHNlY29uZF9wcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlY29uZF9wcm90by5CeXRlU2l6ZSgpLCBieXRlc19yZWFkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKworICBkZWYgdGVzdFNlcmlhbGl6ZUFsbFBhY2tlZEV4dGVuc2lvbnMoc2VsZik6CisgICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZEV4dGVuc2lvbnMoKQorICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkRXh0ZW5zaW9ucygpCisgICAgdGVzdF91dGlsLlNldEFsbFBhY2tlZEV4dGVuc2lvbnMoZmlyc3RfcHJvdG8pCisgICAgc2VyaWFsaXplZCA9IGZpcnN0X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBieXRlc19yZWFkID0gc2Vjb25kX3Byb3RvLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vjb25kX3Byb3RvLkJ5dGVTaXplKCksIGJ5dGVzX3JlYWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorCisgIGRlZiB0ZXN0TWVyZ2VQYWNrZWRGcm9tU3RyaW5nV2hlblNvbWVGaWVsZHNBbHJlYWR5U2V0KHNlbGYpOgorICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgZmlyc3RfcHJvdG8ucGFja2VkX2ludDMyLmV4dGVuZChbMSwgMl0pCisgICAgZmlyc3RfcHJvdG8ucGFja2VkX2RvdWJsZS5hcHBlbmQoMy4wKQorICAgIHNlcmlhbGl6ZWQgPSBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpCisKKyAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICBzZWNvbmRfcHJvdG8ucGFja2VkX2ludDMyLmFwcGVuZCgzKQorICAgIHNlY29uZF9wcm90by5wYWNrZWRfZG91YmxlLmV4dGVuZChbMS4wLCAyLjBdKQorICAgIHNlY29uZF9wcm90by5wYWNrZWRfc2ludDMyLmFwcGVuZCg0KQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgbGVuKHNlcmlhbGl6ZWQpLAorICAgICAgICBzZWNvbmRfcHJvdG8uTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzMsIDEsIDJdLCBzZWNvbmRfcHJvdG8ucGFja2VkX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzEuMCwgMi4wLCAzLjBdLCBzZWNvbmRfcHJvdG8ucGFja2VkX2RvdWJsZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFs0XSwgc2Vjb25kX3Byb3RvLnBhY2tlZF9zaW50MzIpCisKKyAgZGVmIHRlc3RQYWNrZWRGaWVsZHNXaXJlRm9ybWF0KHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgcHJvdG8ucGFja2VkX2ludDMyLmV4dGVuZChbMSwgMiwgMTUwLCAzXSkgICMgMSArIDEgKyAyICsgMSBieXRlcworICAgIHByb3RvLnBhY2tlZF9kb3VibGUuZXh0ZW5kKFsxLjAsIDEwMDAuMF0pICAjIDggKyA4IGJ5dGVzCisgICAgcHJvdG8ucGFja2VkX2Zsb2F0LmFwcGVuZCgyLjApICAgICAgICAgICAgICMgNCBieXRlcywgd2lsbCBiZSBiZWZvcmUgZG91YmxlCisgICAgc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJ5dGVTaXplKCksIGxlbihzZXJpYWxpemVkKSkKKyAgICBkID0gX01pbmlEZWNvZGVyKHNlcmlhbGl6ZWQpCisgICAgUmVhZFRhZyA9IGQuUmVhZEZpZWxkTnVtYmVyQW5kV2lyZVR5cGUKKyAgICBzZWxmLmFzc2VydEVxdWFsKCg5MCwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCksIFJlYWRUYWcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDErMSsxKzIsIGQuUmVhZEludDMyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBkLlJlYWRJbnQzMigpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgZC5SZWFkSW50MzIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDE1MCwgZC5SZWFkSW50MzIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGQuUmVhZEludDMyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgoMTAwLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSwgUmVhZFRhZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgZC5SZWFkSW50MzIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIuMCwgZC5SZWFkRmxvYXQoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCgxMDEsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpLCBSZWFkVGFnKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg4KzgsIGQuUmVhZEludDMyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLjAsIGQuUmVhZERvdWJsZSgpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwMC4wLCBkLlJlYWREb3VibGUoKSkKKyAgICBzZWxmLmFzc2VydFRydWUoZC5FbmRPZlN0cmVhbSgpKQorCisgIGRlZiB0ZXN0UGFyc2VQYWNrZWRGcm9tVW5wYWNrZWQoc2VsZik6CisgICAgdW5wYWNrZWQgPSB1bml0dGVzdF9wYjIuVGVzdFVucGFja2VkVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxVbnBhY2tlZEZpZWxkcyh1bnBhY2tlZCkKKyAgICBwYWNrZWQgPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICBzZXJpYWxpemVkID0gdW5wYWNrZWQuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGxlbihzZXJpYWxpemVkKSwKKyAgICAgICAgcGFja2VkLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKSkKKyAgICBleHBlY3RlZCA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxQYWNrZWRGaWVsZHMoZXhwZWN0ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgcGFja2VkKQorCisgIGRlZiB0ZXN0UGFyc2VVbnBhY2tlZEZyb21QYWNrZWQoc2VsZik6CisgICAgcGFja2VkID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbFBhY2tlZEZpZWxkcyhwYWNrZWQpCisgICAgdW5wYWNrZWQgPSB1bml0dGVzdF9wYjIuVGVzdFVucGFja2VkVHlwZXMoKQorICAgIHNlcmlhbGl6ZWQgPSBwYWNrZWQuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGxlbihzZXJpYWxpemVkKSwKKyAgICAgICAgdW5wYWNrZWQuTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKQorICAgIGV4cGVjdGVkID0gdW5pdHRlc3RfcGIyLlRlc3RVbnBhY2tlZFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsVW5wYWNrZWRGaWVsZHMoZXhwZWN0ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgdW5wYWNrZWQpCisKKyAgZGVmIHRlc3RGaWVsZE51bWJlcnMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5CQl9GSUVMRF9OVU1CRVIsIDEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk9QVElPTkFMX0lOVDMyX0ZJRUxEX05VTUJFUiwgMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuT1BUSU9OQUxHUk9VUF9GSUVMRF9OVU1CRVIsIDE2KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk9QVElPTkFMX05FU1RFRF9NRVNTQUdFX0ZJRUxEX05VTUJFUiwgMTgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuT1BUSU9OQUxfTkVTVEVEX0VOVU1fRklFTERfTlVNQkVSLCAyMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUkVQRUFURURfSU5UMzJfRklFTERfTlVNQkVSLCAzMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUkVQRUFURURHUk9VUF9GSUVMRF9OVU1CRVIsIDQ2KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJFUEVBVEVEX05FU1RFRF9NRVNTQUdFX0ZJRUxEX05VTUJFUiwgNDgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUkVQRUFURURfTkVTVEVEX0VOVU1fRklFTERfTlVNQkVSLCA1MSkKKworICBkZWYgdGVzdEV4dGVuc2lvbkZpZWxkTnVtYmVycyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuc2luZ2xlLm51bWJlciwgMTAwMCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuU0lOR0xFX0ZJRUxEX05VTUJFUiwgMTAwMCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQubXVsdGkubnVtYmVyLCAxMDAxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5NVUxUSV9GSUVMRF9OVU1CRVIsIDEwMDEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uLm51bWJlciwgMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5PUFRJT05BTF9JTlQzMl9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLm9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uLm51bWJlciwgMTYpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuT1BUSU9OQUxHUk9VUF9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAxNikKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24ubnVtYmVyLCAxOCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgdW5pdHRlc3RfcGIyLk9QVElPTkFMX05FU1RFRF9NRVNTQUdFX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDE4KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLm9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbi5udW1iZXIsIDIxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLk9QVElPTkFMX05FU1RFRF9FTlVNX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsCisgICAgICAyMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb24ubnVtYmVyLCAzMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5SRVBFQVRFRF9JTlQzMl9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAzMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbi5udW1iZXIsIDQ2KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlJFUEVBVEVER1JPVVBfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgNDYpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uLm51bWJlciwgNDgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgIHVuaXR0ZXN0X3BiMi5SRVBFQVRFRF9ORVNURURfTUVTU0FHRV9FWFRFTlNJT05fRklFTERfTlVNQkVSLCA0OCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24ubnVtYmVyLCA1MSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5SRVBFQVRFRF9ORVNURURfRU5VTV9FWFRFTlNJT05fRklFTERfTlVNQkVSLAorICAgICAgNTEpCisKKyAgZGVmIHRlc3RGaWVsZFByb3BlcnRpZXMoc2VsZik6CisgICAgY2xzID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcworICAgIHNlbGYuYXNzZXJ0SXMoY2xzLm9wdGlvbmFsX2ludDMyLkRFU0NSSVBUT1IsCisgICAgICAgICAgICAgICAgICBjbHMuREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfaW50MzInXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGNscy5PUFRJT05BTF9JTlQzMl9GSUVMRF9OVU1CRVIsCisgICAgICAgICAgICAgICAgICAgICBjbHMub3B0aW9uYWxfaW50MzIuREVTQ1JJUFRPUi5udW1iZXIpCisgICAgc2VsZi5hc3NlcnRJcyhjbHMub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuREVTQ1JJUFRPUiwKKyAgICAgICAgICAgICAgICAgIGNscy5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSddKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2xzLk9QVElPTkFMX05FU1RFRF9NRVNTQUdFX0ZJRUxEX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgIGNscy5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5ERVNDUklQVE9SLm51bWJlcikKKyAgICBzZWxmLmFzc2VydElzKGNscy5yZXBlYXRlZF9pbnQzMi5ERVNDUklQVE9SLAorICAgICAgICAgICAgICAgICAgY2xzLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ3JlcGVhdGVkX2ludDMyJ10pCisgICAgc2VsZi5hc3NlcnRFcXVhbChjbHMuUkVQRUFURURfSU5UMzJfRklFTERfTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgY2xzLnJlcGVhdGVkX2ludDMyLkRFU0NSSVBUT1IubnVtYmVyKQorCisgIGRlZiB0ZXN0RmllbGREYXRhRGVzY3JpcHRvcihzZWxmKToKKyAgICBtc2cgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtc2cub3B0aW9uYWxfaW50MzIgPSA0MgorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5vcHRpb25hbF9pbnQzMi5fX2dldF9fKG1zZyksIDQyKQorICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMub3B0aW9uYWxfaW50MzIuX19zZXRfXyhtc2csIDI1KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLm9wdGlvbmFsX2ludDMyLCAyNSkKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgIGRlbCBtc2cub3B0aW9uYWxfaW50MzIKKyAgICB0cnk6CisgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UuYy5fX2dldF9fKG1zZykKKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgcGFzcyAgIyBUaGUgY3BwIGltcGxlbWVudGF0aW9uIGNhbm5vdCBtaXggZmllbGRzIGZyb20gb3RoZXIgbWVzc2FnZXMuCisgICAgICAjIFRoaXMgdGVzdCBleGVyY2lzZXMgYSBzcGVjaWZpYyBjaGVjayB0aGF0IGF2b2lkcyBhIGNyYXNoLgorICAgIGVsc2U6CisgICAgICBwYXNzICAjIFRoZSBweXRob24gaW1wbGVtZW50YXRpb24gYWxsb3dzIGZpZWxkcyBmcm9tIG90aGVyIG1lc3NhZ2VzLgorICAgICAgIyBUaGlzIGlzIHVzZWxlc3MsIGJ1dCB3b3Jrcy4KKworICBkZWYgdGVzdEluaXRLd2FyZ3Moc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKAorICAgICAgICBvcHRpb25hbF9pbnQzMj0xLAorICAgICAgICBvcHRpb25hbF9zdHJpbmc9J2ZvbycsCisgICAgICAgIG9wdGlvbmFsX2Jvb2w9VHJ1ZSwKKyAgICAgICAgb3B0aW9uYWxfYnl0ZXM9YidiYXInLAorICAgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZT11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoYmI9MSksCisgICAgICAgIG9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZT11bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0xKSwKKyAgICAgICAgb3B0aW9uYWxfbmVzdGVkX2VudW09dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08sCisgICAgICAgIG9wdGlvbmFsX2ZvcmVpZ25fZW51bT11bml0dGVzdF9wYjIuRk9SRUlHTl9GT08sCisgICAgICAgIHJlcGVhdGVkX2ludDMyPVsxLCAyLCAzXSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSXNJbml0aWFsaXplZCgpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX3N0cmluZycpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfYm9vbCcpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfYnl0ZXMnKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9lbnVtJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9mb3JlaWduX2VudW0nKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbycsIHByb3RvLm9wdGlvbmFsX3N0cmluZykKKyAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIHByb3RvLm9wdGlvbmFsX2Jvb2wpCisgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2JhcicsIHByb3RvLm9wdGlvbmFsX2J5dGVzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UuYykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuRk9PLAorICAgICAgICAgICAgICAgICAgICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX2VudW0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuRk9SRUlHTl9GT08sIHByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fZW51bSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFsxLCAyLCAzXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisKKyAgZGVmIHRlc3RJbml0QXJnc1Vua25vd25GaWVsZE5hbWUoc2VsZik6CisgICAgZGVmIEluaXRhbGl6ZUVtcHR5TWVzc2FnZVdpdGhFeHRyYUtleXdvcmRBcmcoKToKKyAgICAgIHVudXNlZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlKHVua25vd249J3Vua25vd24nKQorICAgIHNlbGYuX0NoZWNrUmFpc2VzKAorICAgICAgICBWYWx1ZUVycm9yLAorICAgICAgICBJbml0YWxpemVFbXB0eU1lc3NhZ2VXaXRoRXh0cmFLZXl3b3JkQXJnLAorICAgICAgICAnUHJvdG9jb2wgbWVzc2FnZSBUZXN0RW1wdHlNZXNzYWdlIGhhcyBubyAidW5rbm93biIgZmllbGQuJykKKworICBkZWYgdGVzdEluaXRSZXF1aXJlZEt3YXJncyhzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoYT0xLCBiPTEsIGM9MSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSXNJbml0aWFsaXplZCgpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnYScpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnYicpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnYycpKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSGFzRmllbGQoJ2R1bW15MicpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8uYSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5jKQorCisgIGRlZiB0ZXN0SW5pdFJlcXVpcmVkRm9yZWlnbkt3YXJncyhzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWRGb3JlaWduKAorICAgICAgICBvcHRpb25hbF9tZXNzYWdlPXVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoYT0xLCBiPTEsIGM9MSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLklzSW5pdGlhbGl6ZWQoKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX21lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuSGFzRmllbGQoJ2EnKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5IYXNGaWVsZCgnYicpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5vcHRpb25hbF9tZXNzYWdlLkhhc0ZpZWxkKCdjJykpCisgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5vcHRpb25hbF9tZXNzYWdlLkhhc0ZpZWxkKCdkdW1teTInKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoYT0xLCBiPTEsIGM9MSksCisgICAgICAgICAgICAgICAgICAgICBwcm90by5vcHRpb25hbF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5hKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5iKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5jKQorCisgIGRlZiB0ZXN0SW5pdFJlcGVhdGVkS3dhcmdzKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcyhyZXBlYXRlZF9pbnQzMj1bMSwgMiwgM10pCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLklzSW5pdGlhbGl6ZWQoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLnJlcGVhdGVkX2ludDMyWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBwcm90by5yZXBlYXRlZF9pbnQzMlsyXSkKKworCitAdGVzdGluZ19yZWZsZWFrcy5UZXN0Q2FzZQorY2xhc3MgT3B0aW9uc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiB0ZXN0TWVzc2FnZU9wdGlvbnMoc2VsZik6CisgICAgcHJvdG8gPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5UZXN0TWVzc2FnZVNldCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLAorICAgICAgICAgICAgICAgICAgICAgcHJvdG8uREVTQ1JJUFRPUi5HZXRPcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQpCisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgcHJvdG8uREVTQ1JJUFRPUi5HZXRPcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQpCisKKyAgZGVmIHRlc3RQYWNrZWRPcHRpb25zKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ub3B0aW9uYWxfaW50MzIgPSAxCisgICAgcHJvdG8ub3B0aW9uYWxfZG91YmxlID0gMy4wCisgICAgZm9yIGZpZWxkX2Rlc2NyaXB0b3IsIF8gaW4gcHJvdG8uTGlzdEZpZWxkcygpOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgZmllbGRfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkucGFja2VkKQorCisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICBwcm90by5wYWNrZWRfaW50MzIuYXBwZW5kKDEpCisgICAgcHJvdG8ucGFja2VkX2RvdWJsZS5hcHBlbmQoMy4wKQorICAgIGZvciBmaWVsZF9kZXNjcmlwdG9yLCBfIGluIHByb3RvLkxpc3RGaWVsZHMoKToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgZmllbGRfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkucGFja2VkKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci5sYWJlbCkKKworCisKK0B0ZXN0aW5nX3JlZmxlYWtzLlRlc3RDYXNlCitjbGFzcyBDbGFzc0FQSVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIEB1bml0dGVzdC5za2lwSWYoCisgICAgICBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nLAorICAgICAgJ0MrKyBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyBhIGNhbGwgdG8gTWFrZURlc2NyaXB0b3IoKScpCisgIEB0ZXN0aW5nX3JlZmxlYWtzLlNraXBSZWZlcmVuY2VMZWFrQ2hlY2tlcignTWFrZUNsYXNzIGlzIG5vdCByZXBlYXRhYmxlJykKKyAgZGVmIHRlc3RNYWtlQ2xhc3NXaXRoTmVzdGVkRGVzY3JpcHRvcihzZWxmKToKKyAgICBsZWFmX2Rlc2MgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgICAgICAgICdsZWFmJywgJ3BhY2thZ2UucGFyZW50LmNoaWxkLmxlYWYnLCAnJywKKyAgICAgICAgY29udGFpbmluZ190eXBlPU5vbmUsIGZpZWxkcz1bXSwKKyAgICAgICAgbmVzdGVkX3R5cGVzPVtdLCBlbnVtX3R5cGVzPVtdLAorICAgICAgICBleHRlbnNpb25zPVtdLAorICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgIGNyZWF0ZV9rZXk9ZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSkKKyAgICBjaGlsZF9kZXNjID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICAgICAgICAnY2hpbGQnLCAncGFja2FnZS5wYXJlbnQuY2hpbGQnLCAnJywKKyAgICAgICAgY29udGFpbmluZ190eXBlPU5vbmUsIGZpZWxkcz1bXSwKKyAgICAgICAgbmVzdGVkX3R5cGVzPVtsZWFmX2Rlc2NdLCBlbnVtX3R5cGVzPVtdLAorICAgICAgICBleHRlbnNpb25zPVtdLAorICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgIGNyZWF0ZV9rZXk9ZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSkKKyAgICBzaWJsaW5nX2Rlc2MgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgICAgICAgICdzaWJsaW5nJywgJ3BhY2thZ2UucGFyZW50LnNpYmxpbmcnLAorICAgICAgICAnJywgY29udGFpbmluZ190eXBlPU5vbmUsIGZpZWxkcz1bXSwKKyAgICAgICAgbmVzdGVkX3R5cGVzPVtdLCBlbnVtX3R5cGVzPVtdLAorICAgICAgICBleHRlbnNpb25zPVtdLAorICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgIGNyZWF0ZV9rZXk9ZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSkKKyAgICBwYXJlbnRfZGVzYyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgICAgICAgJ3BhcmVudCcsICdwYWNrYWdlLnBhcmVudCcsICcnLAorICAgICAgICBjb250YWluaW5nX3R5cGU9Tm9uZSwgZmllbGRzPVtdLAorICAgICAgICBuZXN0ZWRfdHlwZXM9W2NoaWxkX2Rlc2MsIHNpYmxpbmdfZGVzY10sCisgICAgICAgIGVudW1fdHlwZXM9W10sIGV4dGVuc2lvbnM9W10sCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgY3JlYXRlX2tleT1kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KQorICAgIHJlZmxlY3Rpb24uTWFrZUNsYXNzKHBhcmVudF9kZXNjKQorCisgIGRlZiBfR2V0U2VyaWFsaXplZEZpbGVEZXNjcmlwdG9yKHNlbGYsIG5hbWUpOgorICAgICIiIkdldCBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgYSB0ZXN0IEZpbGVEZXNjcmlwdG9yUHJvdG8uCisKKyAgICBBcmdzOgorICAgICAgbmFtZTogQWxsIGNhbGxzIHRvIHRoaXMgbXVzdCB1c2UgYSB1bmlxdWUgbWVzc2FnZSBuYW1lLCB0byBhdm9pZAorICAgICAgICAgIGNvbGxpc2lvbnMgaW4gdGhlIGNwcCBkZXNjcmlwdG9yIHBvb2wuCisgICAgUmV0dXJuczoKKyAgICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNlcmlhbGl6ZWQgZm9ybSBvZiBhIHRlc3QgRmlsZURlc2NyaXB0b3JQcm90by4KKyAgICAiIiIKKyAgICBmaWxlX2Rlc2NyaXB0b3Jfc3RyID0gKAorICAgICAgICAnbWVzc2FnZV90eXBlIHsnCisgICAgICAgICcgIG5hbWU6ICInICsgbmFtZSArICciJworICAgICAgICAnICBmaWVsZCB7JworICAgICAgICAnICAgIG5hbWU6ICJmbGF0IicKKyAgICAgICAgJyAgICBudW1iZXI6IDEnCisgICAgICAgICcgICAgbGFiZWw6IExBQkVMX1JFUEVBVEVEJworICAgICAgICAnICAgIHR5cGU6IFRZUEVfVUlOVDMyJworICAgICAgICAnICB9JworICAgICAgICAnICBmaWVsZCB7JworICAgICAgICAnICAgIG5hbWU6ICJiYXIiJworICAgICAgICAnICAgIG51bWJlcjogMicKKyAgICAgICAgJyAgICBsYWJlbDogTEFCRUxfT1BUSU9OQUwnCisgICAgICAgICcgICAgdHlwZTogVFlQRV9NRVNTQUdFJworICAgICAgICAnICAgIHR5cGVfbmFtZTogIkJhciInCisgICAgICAgICcgIH0nCisgICAgICAgICcgIG5lc3RlZF90eXBlIHsnCisgICAgICAgICcgICAgbmFtZTogIkJhciInCisgICAgICAgICcgICAgZmllbGQgeycKKyAgICAgICAgJyAgICAgIG5hbWU6ICJiYXoiJworICAgICAgICAnICAgICAgbnVtYmVyOiAzJworICAgICAgICAnICAgICAgbGFiZWw6IExBQkVMX09QVElPTkFMJworICAgICAgICAnICAgICAgdHlwZTogVFlQRV9NRVNTQUdFJworICAgICAgICAnICAgICAgdHlwZV9uYW1lOiAiQmF6IicKKyAgICAgICAgJyAgICB9JworICAgICAgICAnICAgIG5lc3RlZF90eXBlIHsnCisgICAgICAgICcgICAgICBuYW1lOiAiQmF6IicKKyAgICAgICAgJyAgICAgIGVudW1fdHlwZSB7JworICAgICAgICAnICAgICAgICBuYW1lOiAiZGVlcF9lbnVtIicKKyAgICAgICAgJyAgICAgICAgdmFsdWUgeycKKyAgICAgICAgJyAgICAgICAgICBuYW1lOiAiVkFMVUVfQSInCisgICAgICAgICcgICAgICAgICAgbnVtYmVyOiAwJworICAgICAgICAnICAgICAgICB9JworICAgICAgICAnICAgICAgfScKKyAgICAgICAgJyAgICAgIGZpZWxkIHsnCisgICAgICAgICcgICAgICAgIG5hbWU6ICJkZWVwIicKKyAgICAgICAgJyAgICAgICAgbnVtYmVyOiA0JworICAgICAgICAnICAgICAgICBsYWJlbDogTEFCRUxfT1BUSU9OQUwnCisgICAgICAgICcgICAgICAgIHR5cGU6IFRZUEVfVUlOVDMyJworICAgICAgICAnICAgICAgfScKKyAgICAgICAgJyAgICB9JworICAgICAgICAnICB9JworICAgICAgICAnfScpCisgICAgZmlsZV9kZXNjcmlwdG9yID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bygpCisgICAgdGV4dF9mb3JtYXQuTWVyZ2UoZmlsZV9kZXNjcmlwdG9yX3N0ciwgZmlsZV9kZXNjcmlwdG9yKQorICAgIHJldHVybiBmaWxlX2Rlc2NyaXB0b3IuU2VyaWFsaXplVG9TdHJpbmcoKQorCisgIEB0ZXN0aW5nX3JlZmxlYWtzLlNraXBSZWZlcmVuY2VMZWFrQ2hlY2tlcignTWFrZURlc2NyaXB0b3IgaXMgbm90IHJlcGVhdGFibGUnKQorICAjIFRoaXMgdGVzdCBjYW4gb25seSBydW4gb25jZTsgdGhlIHNlY29uZCB0aW1lLCBpdCByYWlzZXMgZXJyb3JzIGFib3V0CisgICMgY29uZmxpY3RpbmcgbWVzc2FnZSBkZXNjcmlwdG9ycy4KKyAgZGVmIHRlc3RQYXJzaW5nRmxhdENsYXNzV2l0aEV4cGxpY2l0Q2xhc3NEZWNsYXJhdGlvbihzZWxmKToKKyAgICAiIiJUZXN0IHRoYXQgdGhlIGdlbmVyYXRlZCBjbGFzcyBjYW4gcGFyc2UgYSBmbGF0IG1lc3NhZ2UuIiIiCisgICAgIyBUT0RPKHhpYW9mZW5nKTogVGhpcyB0ZXN0IGZhaWxzIHdpdGggY3BwIGltcGxlbWVudGF0aW9uIGluIHRoZSBjYWxsCisgICAgIyBvZiBzaXgud2l0aF9tZXRhY2xhc3MoKS4gVGhlIG90aGVyIHR3byBjYWxsc2l0ZXMgb2Ygd2l0aF9tZXRhY2xhc3MKKyAgICAjIGluIHRoaXMgZmlsZSBhcmUgYm90aCBleGNsdWRlZCBmcm9tIGNwcCB0ZXN0LCBzbyBpdCBtaWdodCBiZSBleHBlY3RlZAorICAgICMgdG8gZmFpbC4gTmVlZCBzb21lb25lIG1vcmUgZmFtaWxpYXIgd2l0aCB0aGUgcHl0aG9uIGNvZGUgdG8gdGFrZSBhCisgICAgIyBsb29rIGF0IHRoaXMuCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAncHl0aG9uJzoKKyAgICAgIHJldHVybgorICAgIGZpbGVfZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oKQorICAgIGZpbGVfZGVzY3JpcHRvci5QYXJzZUZyb21TdHJpbmcoc2VsZi5fR2V0U2VyaWFsaXplZEZpbGVEZXNjcmlwdG9yKCdBJykpCisgICAgbXNnX2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLk1ha2VEZXNjcmlwdG9yKAorICAgICAgICBmaWxlX2Rlc2NyaXB0b3IubWVzc2FnZV90eXBlWzBdKQorCisgICAgY2xhc3MgTWVzc2FnZUNsYXNzKAorICAgICAgICBtZXNzYWdlLk1lc3NhZ2UsIG1ldGFjbGFzcz1yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUpOgorICAgICAgREVTQ1JJUFRPUiA9IG1zZ19kZXNjcmlwdG9yCisgICAgbXNnID0gTWVzc2FnZUNsYXNzKCkKKyAgICBtc2dfc3RyID0gKAorICAgICAgICAnZmxhdDogMCAnCisgICAgICAgICdmbGF0OiAxICcKKyAgICAgICAgJ2ZsYXQ6IDIgJykKKyAgICB0ZXh0X2Zvcm1hdC5NZXJnZShtc2dfc3RyLCBtc2cpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZmxhdCwgWzAsIDEsIDJdKQorCisgIEB0ZXN0aW5nX3JlZmxlYWtzLlNraXBSZWZlcmVuY2VMZWFrQ2hlY2tlcignTWFrZURlc2NyaXB0b3IgaXMgbm90IHJlcGVhdGFibGUnKQorICBkZWYgdGVzdFBhcnNpbmdGbGF0Q2xhc3Moc2VsZik6CisgICAgIiIiVGVzdCB0aGF0IHRoZSBnZW5lcmF0ZWQgY2xhc3MgY2FuIHBhcnNlIGEgZmxhdCBtZXNzYWdlLiIiIgorICAgIGZpbGVfZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oKQorICAgIGZpbGVfZGVzY3JpcHRvci5QYXJzZUZyb21TdHJpbmcoc2VsZi5fR2V0U2VyaWFsaXplZEZpbGVEZXNjcmlwdG9yKCdCJykpCisgICAgbXNnX2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLk1ha2VEZXNjcmlwdG9yKAorICAgICAgICBmaWxlX2Rlc2NyaXB0b3IubWVzc2FnZV90eXBlWzBdKQorICAgIG1zZ19jbGFzcyA9IHJlZmxlY3Rpb24uTWFrZUNsYXNzKG1zZ19kZXNjcmlwdG9yKQorICAgIG1zZyA9IG1zZ19jbGFzcygpCisgICAgbXNnX3N0ciA9ICgKKyAgICAgICAgJ2ZsYXQ6IDAgJworICAgICAgICAnZmxhdDogMSAnCisgICAgICAgICdmbGF0OiAyICcpCisgICAgdGV4dF9mb3JtYXQuTWVyZ2UobXNnX3N0ciwgbXNnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmZsYXQsIFswLCAxLCAyXSkKKworICBAdGVzdGluZ19yZWZsZWFrcy5Ta2lwUmVmZXJlbmNlTGVha0NoZWNrZXIoJ01ha2VEZXNjcmlwdG9yIGlzIG5vdCByZXBlYXRhYmxlJykKKyAgZGVmIHRlc3RQYXJzaW5nTmVzdGVkQ2xhc3Moc2VsZik6CisgICAgIiIiVGVzdCB0aGF0IHRoZSBnZW5lcmF0ZWQgY2xhc3MgY2FuIHBhcnNlIGEgbmVzdGVkIG1lc3NhZ2UuIiIiCisgICAgZmlsZV9kZXNjcmlwdG9yID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bygpCisgICAgZmlsZV9kZXNjcmlwdG9yLlBhcnNlRnJvbVN0cmluZyhzZWxmLl9HZXRTZXJpYWxpemVkRmlsZURlc2NyaXB0b3IoJ0MnKSkKKyAgICBtc2dfZGVzY3JpcHRvciA9IGRlc2NyaXB0b3IuTWFrZURlc2NyaXB0b3IoCisgICAgICAgIGZpbGVfZGVzY3JpcHRvci5tZXNzYWdlX3R5cGVbMF0pCisgICAgbXNnX2NsYXNzID0gcmVmbGVjdGlvbi5NYWtlQ2xhc3MobXNnX2Rlc2NyaXB0b3IpCisgICAgbXNnID0gbXNnX2NsYXNzKCkKKyAgICBtc2dfc3RyID0gKAorICAgICAgICAnYmFyIHsnCisgICAgICAgICcgIGJheiB7JworICAgICAgICAnICAgIGRlZXA6IDQnCisgICAgICAgICcgIH0nCisgICAgICAgICd9JykKKyAgICB0ZXh0X2Zvcm1hdC5NZXJnZShtc2dfc3RyLCBtc2cpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuYmFyLmJhei5kZWVwLCA0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvc2VydmljZV9yZWZsZWN0aW9uX3Rlc3QucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3NlcnZpY2VfcmVmbGVjdGlvbl90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNzIyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3NlcnZpY2VfcmVmbGVjdGlvbl90ZXN0LnB5CkBAIC0wLDAgKzEsMTM5IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIGZvciBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuc2VydmljZV9yZWZsZWN0aW9uLiIiIgorCitfX2F1dGhvcl9fID0gJ3BldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdiknCisKKworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzZXJ2aWNlX3JlZmxlY3Rpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzZXJ2aWNlCisKKworY2xhc3MgRm9vVW5pdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiB0ZXN0U2VydmljZShzZWxmKToKKyAgICBjbGFzcyBNb2NrUnBjQ2hhbm5lbChzZXJ2aWNlLlJwY0NoYW5uZWwpOgorICAgICAgZGVmIENhbGxNZXRob2Qoc2VsZiwgbWV0aG9kLCBjb250cm9sbGVyLCByZXF1ZXN0LCByZXNwb25zZSwgY2FsbGJhY2spOgorICAgICAgICBzZWxmLm1ldGhvZCA9IG1ldGhvZAorICAgICAgICBzZWxmLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyCisgICAgICAgIHNlbGYucmVxdWVzdCA9IHJlcXVlc3QKKyAgICAgICAgY2FsbGJhY2socmVzcG9uc2UpCisKKyAgICBjbGFzcyBNb2NrUnBjQ29udHJvbGxlcihzZXJ2aWNlLlJwY0NvbnRyb2xsZXIpOgorICAgICAgZGVmIFNldEZhaWxlZChzZWxmLCBtc2cpOgorICAgICAgICBzZWxmLmZhaWx1cmVfbWVzc2FnZSA9IG1zZworCisgICAgc2VsZi5jYWxsYmFja19yZXNwb25zZSA9IE5vbmUKKworICAgIGNsYXNzIE15U2VydmljZSh1bml0dGVzdF9wYjIuVGVzdFNlcnZpY2UpOgorICAgICAgcGFzcworCisgICAgc2VsZi5jYWxsYmFja19yZXNwb25zZSA9IE5vbmUKKworICAgIGRlZiBNeUNhbGxiYWNrKHJlc3BvbnNlKToKKyAgICAgIHNlbGYuY2FsbGJhY2tfcmVzcG9uc2UgPSByZXNwb25zZQorCisgICAgcnBjX2NvbnRyb2xsZXIgPSBNb2NrUnBjQ29udHJvbGxlcigpCisgICAgY2hhbm5lbCA9IE1vY2tScGNDaGFubmVsKCkKKyAgICBzcnZjID0gTXlTZXJ2aWNlKCkKKyAgICBzcnZjLkZvbyhycGNfY29udHJvbGxlciwgdW5pdHRlc3RfcGIyLkZvb1JlcXVlc3QoKSwgTXlDYWxsYmFjaykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdNZXRob2QgRm9vIG5vdCBpbXBsZW1lbnRlZC4nLAorICAgICAgICAgICAgICAgICAgICAgcnBjX2NvbnRyb2xsZXIuZmFpbHVyZV9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5jYWxsYmFja19yZXNwb25zZSkKKworICAgIHJwY19jb250cm9sbGVyLmZhaWx1cmVfbWVzc2FnZSA9IE5vbmUKKworICAgIHNlcnZpY2VfZGVzY3JpcHRvciA9IHVuaXR0ZXN0X3BiMi5UZXN0U2VydmljZS5HZXREZXNjcmlwdG9yKCkKKyAgICBzcnZjLkNhbGxNZXRob2Qoc2VydmljZV9kZXNjcmlwdG9yLm1ldGhvZHNbMV0sIHJwY19jb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuQmFyUmVxdWVzdCgpLCBNeUNhbGxiYWNrKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcnZjLkdldFJlcXVlc3RDbGFzcyhzZXJ2aWNlX2Rlc2NyaXB0b3IubWV0aG9kc1sxXSkgaXMKKyAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkJhclJlcXVlc3QpCisgICAgc2VsZi5hc3NlcnRUcnVlKHNydmMuR2V0UmVzcG9uc2VDbGFzcyhzZXJ2aWNlX2Rlc2NyaXB0b3IubWV0aG9kc1sxXSkgaXMKKyAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkJhclJlc3BvbnNlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ01ldGhvZCBCYXIgbm90IGltcGxlbWVudGVkLicsCisgICAgICAgICAgICAgICAgICAgICBycGNfY29udHJvbGxlci5mYWlsdXJlX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlKQorCisgICAgY2xhc3MgTXlTZXJ2aWNlSW1wbCh1bml0dGVzdF9wYjIuVGVzdFNlcnZpY2UpOgorICAgICAgZGVmIEZvbyhzZWxmLCBycGNfY29udHJvbGxlciwgcmVxdWVzdCwgZG9uZSk6CisgICAgICAgIHNlbGYuZm9vX2NhbGxlZCA9IFRydWUKKyAgICAgIGRlZiBCYXIoc2VsZiwgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGRvbmUpOgorICAgICAgICBzZWxmLmJhcl9jYWxsZWQgPSBUcnVlCisKKyAgICBzcnZjID0gTXlTZXJ2aWNlSW1wbCgpCisgICAgcnBjX2NvbnRyb2xsZXIuZmFpbHVyZV9tZXNzYWdlID0gTm9uZQorICAgIHNydmMuRm9vKHJwY19jb250cm9sbGVyLCB1bml0dGVzdF9wYjIuRm9vUmVxdWVzdCgpLCBNeUNhbGxiYWNrKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgcnBjX2NvbnRyb2xsZXIuZmFpbHVyZV9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgc3J2Yy5mb29fY2FsbGVkKQorCisgICAgcnBjX2NvbnRyb2xsZXIuZmFpbHVyZV9tZXNzYWdlID0gTm9uZQorICAgIHNydmMuQ2FsbE1ldGhvZChzZXJ2aWNlX2Rlc2NyaXB0b3IubWV0aG9kc1sxXSwgcnBjX2NvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5CYXJSZXF1ZXN0KCksIE15Q2FsbGJhY2spCisgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBycGNfY29udHJvbGxlci5mYWlsdXJlX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBzcnZjLmJhcl9jYWxsZWQpCisKKyAgZGVmIHRlc3RTZXJ2aWNlU3R1YihzZWxmKToKKyAgICBjbGFzcyBNb2NrUnBjQ2hhbm5lbChzZXJ2aWNlLlJwY0NoYW5uZWwpOgorICAgICAgZGVmIENhbGxNZXRob2Qoc2VsZiwgbWV0aG9kLCBjb250cm9sbGVyLCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VfY2xhc3MsIGNhbGxiYWNrKToKKyAgICAgICAgc2VsZi5tZXRob2QgPSBtZXRob2QKKyAgICAgICAgc2VsZi5jb250cm9sbGVyID0gY29udHJvbGxlcgorICAgICAgICBzZWxmLnJlcXVlc3QgPSByZXF1ZXN0CisgICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlX2NsYXNzKCkpCisKKyAgICBzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlID0gTm9uZQorCisgICAgZGVmIE15Q2FsbGJhY2socmVzcG9uc2UpOgorICAgICAgc2VsZi5jYWxsYmFja19yZXNwb25zZSA9IHJlc3BvbnNlCisKKyAgICBjaGFubmVsID0gTW9ja1JwY0NoYW5uZWwoKQorICAgIHN0dWIgPSB1bml0dGVzdF9wYjIuVGVzdFNlcnZpY2VfU3R1YihjaGFubmVsKQorICAgIHJwY19jb250cm9sbGVyID0gJ2NvbnRyb2xsZXInCisgICAgcmVxdWVzdCA9ICdyZXF1ZXN0JworCisgICAgIyBHZXREZXNjcmlwdG9yIG5vdyBzdGF0aWMsIHN0aWxsIHdvcmtzIGFzIGluc3RhbmNlIG1ldGhvZCBmb3IgY29tcGF0aWJpbGl0eQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RTZXJ2aWNlX1N0dWIuR2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICAgICAgc3R1Yi5HZXREZXNjcmlwdG9yKCkpCisKKyAgICAjIEludm9rZSBtZXRob2QuCisgICAgc3R1Yi5Gb28ocnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIE15Q2FsbGJhY2spCisKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi5jYWxsYmFja19yZXNwb25zZSwgdW5pdHRlc3RfcGIyLkZvb1Jlc3BvbnNlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxdWVzdCwgY2hhbm5lbC5yZXF1ZXN0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocnBjX2NvbnRyb2xsZXIsIGNoYW5uZWwuY29udHJvbGxlcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKHN0dWIuR2V0RGVzY3JpcHRvcigpLm1ldGhvZHNbMF0sIGNoYW5uZWwubWV0aG9kKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9zeW1ib2xfZGF0YWJhc2VfdGVzdC5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvc3ltYm9sX2RhdGFiYXNlX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkYzRlZQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvc3ltYm9sX2RhdGFiYXNlX3Rlc3QucHkKQEAgLTAsMCArMSwxMzMgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdHMgZm9yIGdvb2dsZS5wcm90b2J1Zi5zeW1ib2xfZGF0YWJhc2UuIiIiCisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHN5bWJvbF9kYXRhYmFzZQorCisKK2NsYXNzIFN5bWJvbERhdGFiYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIF9EYXRhYmFzZShzZWxmKToKKyAgICBpZiBkZXNjcmlwdG9yLl9VU0VfQ19ERVNDUklQVE9SUzoKKyAgICAgICMgVGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhbGxvdyBtaXhpbmcgZGVzY3JpcHRvcnMgZnJvbQorICAgICAgIyBkaWZmZXJlbnQgcG9vbHMuCisgICAgICBkYiA9IHN5bWJvbF9kYXRhYmFzZS5TeW1ib2xEYXRhYmFzZShwb29sPWRlc2NyaXB0b3JfcG9vbC5EZWZhdWx0KCkpCisgICAgZWxzZToKKyAgICAgIGRiID0gc3ltYm9sX2RhdGFiYXNlLlN5bWJvbERhdGFiYXNlKCkKKyAgICAjIFJlZ2lzdGVyIHJlcHJlc2VudGF0aXZlIHR5cGVzIGZyb20gdW5pdHRlc3RfcGIyLgorICAgIGRiLlJlZ2lzdGVyRmlsZURlc2NyaXB0b3IodW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IpCisgICAgZGIuUmVnaXN0ZXJNZXNzYWdlKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMpCisgICAgZGIuUmVnaXN0ZXJNZXNzYWdlKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSkKKyAgICBkYi5SZWdpc3Rlck1lc3NhZ2UodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwKQorICAgIGRiLlJlZ2lzdGVyTWVzc2FnZSh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXApCisgICAgZGIuUmVnaXN0ZXJFbnVtRGVzY3JpcHRvcih1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uREVTQ1JJUFRPUikKKyAgICBkYi5SZWdpc3RlckVudW1EZXNjcmlwdG9yKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5ERVNDUklQVE9SKQorICAgIGRiLlJlZ2lzdGVyU2VydmljZURlc2NyaXB0b3IodW5pdHRlc3RfcGIyLl9URVNUU0VSVklDRSkKKyAgICByZXR1cm4gZGIKKworICBkZWYgdGVzdEdldFByb3RvdHlwZShzZWxmKToKKyAgICBpbnN0YW5jZSA9IHNlbGYuX0RhdGFiYXNlKCkuR2V0UHJvdG90eXBlKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IpCisgICAgc2VsZi5hc3NlcnRUcnVlKGluc3RhbmNlIGlzIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMpCisKKyAgZGVmIHRlc3RHZXRNZXNzYWdlcyhzZWxmKToKKyAgICBtZXNzYWdlcyA9IHNlbGYuX0RhdGFiYXNlKCkuR2V0TWVzc2FnZXMoCisgICAgICAgIFsnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvJ10pCisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzIGlzCisgICAgICAgIG1lc3NhZ2VzWydwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMnXSkKKworICBkZWYgdGVzdEdldFN5bWJvbChzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCBzZWxmLl9EYXRhYmFzZSgpLkdldFN5bWJvbCgKKyAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UsIHNlbGYuX0RhdGFiYXNlKCkuR2V0U3ltYm9sKAorICAgICAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwLCBzZWxmLl9EYXRhYmFzZSgpLkdldFN5bWJvbCgKKyAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuT3B0aW9uYWxHcm91cCcpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCwgc2VsZi5fRGF0YWJhc2UoKS5HZXRTeW1ib2woCisgICAgICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAnKSkKKworICBkZWYgdGVzdEVudW1zKHNlbGYpOgorICAgICMgQ2hlY2sgcmVnaXN0cmF0aW9uIG9mIHR5cGVzIGluIHRoZSBwb29sLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bScsCisgICAgICAgIHNlbGYuX0RhdGFiYXNlKCkucG9vbC5GaW5kRW51bVR5cGVCeU5hbWUoCisgICAgICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbkVudW0nKS5mdWxsX25hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtJywKKyAgICAgICAgc2VsZi5fRGF0YWJhc2UoKS5wb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgKKyAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScpLmZ1bGxfbmFtZSkKKworICBkZWYgdGVzdEZpbmRNZXNzYWdlVHlwZUJ5TmFtZShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzJywKKyAgICAgICAgc2VsZi5fRGF0YWJhc2UoKS5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMnKS5mdWxsX25hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlJywKKyAgICAgICAgc2VsZi5fRGF0YWJhc2UoKS5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZScpLmZ1bGxfbmFtZSkKKworICBkZWYgdGVzdEZpbmRTZXJ2aWNlQnlOYW1lKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0U2VydmljZScsCisgICAgICAgIHNlbGYuX0RhdGFiYXNlKCkucG9vbC5GaW5kU2VydmljZUJ5TmFtZSgKKyAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0U2VydmljZScpLmZ1bGxfbmFtZSkKKworICBkZWYgdGVzdEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzZWxmKToKKyAgICAjIExvb2t1cCBiYXNlZCBvbiBlaXRoZXIgZW51bSBvciBtZXNzYWdlLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nLAorICAgICAgICBzZWxmLl9EYXRhYmFzZSgpLnBvb2wuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgICAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtJykubmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvJywKKyAgICAgICAgc2VsZi5fRGF0YWJhc2UoKS5wb29sLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMnKS5uYW1lKQorCisgIGRlZiB0ZXN0RmluZEZpbGVCeU5hbWUoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bycsCisgICAgICAgIHNlbGYuX0RhdGFiYXNlKCkucG9vbC5GaW5kRmlsZUJ5TmFtZSgKKyAgICAgICAgICAgICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nKS5uYW1lKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90byBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmODZiNQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8KQEAgLTAsMCArMSw1MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK29wdGlvbiBweV9nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsKKworbWVzc2FnZSBUZXN0QmFkSWRlbnRpZmllcnMgeworICBleHRlbnNpb25zIDEwMCB0byBtYXg7Cit9CisKKy8vIE1ha2Ugc3VyZSB0aGVzZSByZWFzb25hYmxlIGV4dGVuc2lvbiBuYW1lcyBkb24ndCBjb25mbGljdCB3aXRoIGludGVybmFsCisvLyB2YXJpYWJsZXMuCitleHRlbmQgVGVzdEJhZElkZW50aWZpZXJzIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG1lc3NhZ2UgPSAxMDAgW2RlZmF1bHQgPSAiZm9vIl07CisgIG9wdGlvbmFsIHN0cmluZyBkZXNjcmlwdG9yID0gMTAxIFtkZWZhdWx0ID0gImJhciJdOworICBvcHRpb25hbCBzdHJpbmcgcmVmbGVjdGlvbiA9IDEwMiBbZGVmYXVsdCA9ICJiYXoiXTsKKyAgb3B0aW9uYWwgc3RyaW5nIHNlcnZpY2UgPSAxMDMgW2RlZmF1bHQgPSAicXV4Il07Cit9CisKK21lc3NhZ2UgQW5vdGhlck1lc3NhZ2Uge30KK3NlcnZpY2UgQW5vdGhlclNlcnZpY2Uge30KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF9wcm90bzNfb3B0aW9uYWwucHJvdG8gYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Rlc3RfcHJvdG8zX29wdGlvbmFsLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZTBhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Rlc3RfcHJvdG8zX29wdGlvbmFsLnByb3RvCkBAIC0wLDAgKzEsNzAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsOworCittZXNzYWdlIFRlc3RQcm90bzNPcHRpb25hbCB7CisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgLy8gVGhlIGZpZWxkIG5hbWUgImIiIGZhaWxzIHRvIGNvbXBpbGUgaW4gcHJvdG8xIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGgKKyAgICAvLyBhIGxvY2FsIHZhcmlhYmxlIG5hbWVkICJiIiBpbiBvbmUgb2YgdGhlIGdlbmVyYXRlZCBtZXRob2RzLiAgRG9oLgorICAgIC8vIFRoaXMgZmlsZSBuZWVkcyB0byBjb21waWxlIGluIHByb3RvMSB0byB0ZXN0IGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgorICAgIG9wdGlvbmFsIGludDMyIGJiID0gMTsKKyAgfQorCisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgVU5TUEVDSUZJRUQgPSAwOworICAgIEZPTyA9IDE7CisgICAgQkFSID0gMjsKKyAgICBCQVogPSAzOworICAgIE5FRyA9IC0xOyAgLy8gSW50ZW50aW9uYWxseSBuZWdhdGl2ZS4KKyAgfQorCisgIC8vIFNpbmd1bGFyCisgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyID0gMTsKKyAgb3B0aW9uYWwgaW50NjQgb3B0aW9uYWxfaW50NjQgPSAyOworICBvcHRpb25hbCB1aW50MzIgb3B0aW9uYWxfdWludDMyID0gMzsKKyAgb3B0aW9uYWwgdWludDY0IG9wdGlvbmFsX3VpbnQ2NCA9IDQ7CisgIG9wdGlvbmFsIHNpbnQzMiBvcHRpb25hbF9zaW50MzIgPSA1OworICBvcHRpb25hbCBzaW50NjQgb3B0aW9uYWxfc2ludDY0ID0gNjsKKyAgb3B0aW9uYWwgZml4ZWQzMiBvcHRpb25hbF9maXhlZDMyID0gNzsKKyAgb3B0aW9uYWwgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0ID0gODsKKyAgb3B0aW9uYWwgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzIgPSA5OworICBvcHRpb25hbCBzZml4ZWQ2NCBvcHRpb25hbF9zZml4ZWQ2NCA9IDEwOworICBvcHRpb25hbCBmbG9hdCBvcHRpb25hbF9mbG9hdCA9IDExOworICBvcHRpb25hbCBkb3VibGUgb3B0aW9uYWxfZG91YmxlID0gMTI7CisgIG9wdGlvbmFsIGJvb2wgb3B0aW9uYWxfYm9vbCA9IDEzOworICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nID0gMTQ7CisgIG9wdGlvbmFsIGJ5dGVzIG9wdGlvbmFsX2J5dGVzID0gMTU7CisKKyAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSA9IDE4OworICBvcHRpb25hbCBOZXN0ZWRFbnVtIG9wdGlvbmFsX25lc3RlZF9lbnVtID0gMjE7Cit9CmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Rlc3RfdXRpbC5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZmI4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Rlc3RfdXRpbC5weQpAQCAtMCwwICsxLDg3OCBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJVdGlsaXRpZXMgZm9yIFB5dGhvbiBwcm90bzIgdGVzdHMuCisKK1RoaXMgaXMgaW50ZW50aW9uYWxseSBtb2RlbGVkIG9uIEMrKyBjb2RlIGluCisvL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuKi4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJworCitpbXBvcnQgbnVtYmVycworaW1wb3J0IG9wZXJhdG9yCitpbXBvcnQgb3MucGF0aAorCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfaW1wb3J0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgorCit0cnk6CisgIGxvbmcgICAgICAgICMgUHl0aG9uIDIKK2V4Y2VwdCBOYW1lRXJyb3I6CisgIGxvbmcgPSBpbnQgICMgUHl0aG9uIDMKKworCisjIFRlc3RzIHdoZXRoZXIgdGhlIGdpdmVuIFRlc3RBbGxUeXBlcyBtZXNzYWdlIGlzIHByb3RvMiBvciBub3QuCisjIFRoaXMgaXMgdXNlZCB0byBnYXRlIHNldmVyYWwgZmllbGRzL2ZlYXR1cmVzIHRoYXQgb25seSBleGlzdAorIyBmb3IgdGhlIHByb3RvMiB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlLgorZGVmIElzUHJvdG8yKG1lc3NhZ2UpOgorICByZXR1cm4gbWVzc2FnZS5ERVNDUklQVE9SLnN5bnRheCA9PSAicHJvdG8yIgorCisKK2RlZiBTZXRBbGxOb25MYXp5RmllbGRzKG1lc3NhZ2UpOgorICAiIiJTZXRzIGV2ZXJ5IG5vbi1sYXp5IGZpZWxkIGluIHRoZSBtZXNzYWdlIHRvIGEgdW5pcXVlIHZhbHVlLgorCisgIEFyZ3M6CisgICAgbWVzc2FnZTogQSBUZXN0QWxsVHlwZXMgaW5zdGFuY2UuCisgICIiIgorCisgICMKKyAgIyBPcHRpb25hbCBmaWVsZHMuCisgICMKKworICBtZXNzYWdlLm9wdGlvbmFsX2ludDMyICAgID0gMTAxCisgIG1lc3NhZ2Uub3B0aW9uYWxfaW50NjQgICAgPSAxMDIKKyAgbWVzc2FnZS5vcHRpb25hbF91aW50MzIgICA9IDEwMworICBtZXNzYWdlLm9wdGlvbmFsX3VpbnQ2NCAgID0gMTA0CisgIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDMyICAgPSAxMDUKKyAgbWVzc2FnZS5vcHRpb25hbF9zaW50NjQgICA9IDEwNgorICBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkMzIgID0gMTA3CisgIG1lc3NhZ2Uub3B0aW9uYWxfZml4ZWQ2NCAgPSAxMDgKKyAgbWVzc2FnZS5vcHRpb25hbF9zZml4ZWQzMiA9IDEwOQorICBtZXNzYWdlLm9wdGlvbmFsX3NmaXhlZDY0ID0gMTEwCisgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgICAgPSAxMTEKKyAgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgICA9IDExMgorICBtZXNzYWdlLm9wdGlvbmFsX2Jvb2wgICAgID0gVHJ1ZQorICBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyAgID0gdScxMTUnCisgIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMgICAgPSBiJzExNicKKworICBpZiBJc1Byb3RvMihtZXNzYWdlKToKKyAgICBtZXNzYWdlLm9wdGlvbmFsZ3JvdXAuYSA9IDExNworICBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMTE4CisgIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlLmMgPSAxMTkKKyAgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZS5kID0gMTIwCisgIG1lc3NhZ2Uub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlLmUgPSAxMjYKKworICBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9lbnVtID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVoKKyAgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX2VudW0gPSB1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVoKKyAgaWYgSXNQcm90bzIobWVzc2FnZSk6CisgICAgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfZW51bSA9IHVuaXR0ZXN0X2ltcG9ydF9wYjIuSU1QT1JUX0JBWgorCisgIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nX3BpZWNlID0gdScxMjQnCisgIG1lc3NhZ2Uub3B0aW9uYWxfY29yZCA9IHUnMTI1JworCisgICMKKyAgIyBSZXBlYXRlZCBmaWVsZHMuCisgICMKKworICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgyMDEpCisgIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQuYXBwZW5kKDIwMikKKyAgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIuYXBwZW5kKDIwMykKKyAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDIwNCkKKyAgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIuYXBwZW5kKDIwNSkKKyAgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQuYXBwZW5kKDIwNikKKyAgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyLmFwcGVuZCgyMDcpCisgIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NC5hcHBlbmQoMjA4KQorICBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyLmFwcGVuZCgyMDkpCisgIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQuYXBwZW5kKDIxMCkKKyAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMjExKQorICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMjEyKQorICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wuYXBwZW5kKFRydWUpCisgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCh1JzIxNScpCisgIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMuYXBwZW5kKGInMjE2JykKKworICBpZiBJc1Byb3RvMihtZXNzYWdlKToKKyAgICBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAuYWRkKCkuYSA9IDIxNworICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMjE4CisgIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlLmFkZCgpLmMgPSAyMTkKKyAgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZS5hZGQoKS5kID0gMjIwCisgIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlLmFkZCgpLmJiID0gMjI3CisKKyAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bS5hcHBlbmQodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVIpCisgIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtLmFwcGVuZCh1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVIpCisgIGlmIElzUHJvdG8yKG1lc3NhZ2UpOgorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0uYXBwZW5kKHVuaXR0ZXN0X2ltcG9ydF9wYjIuSU1QT1JUX0JBUikKKworICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19waWVjZS5hcHBlbmQodScyMjQnKQorICBtZXNzYWdlLnJlcGVhdGVkX2NvcmQuYXBwZW5kKHUnMjI1JykKKworICAjIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZCBhbmQgc2V0IHZhbHVlIGJ5IGluZGV4LgorICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgwKQorICBtZXNzYWdlLnJlcGVhdGVkX2ludDY0LmFwcGVuZCgwKQorICBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMi5hcHBlbmQoMCkKKyAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDApCisgIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyLmFwcGVuZCgwKQorICBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NC5hcHBlbmQoMCkKKyAgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyLmFwcGVuZCgwKQorICBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQuYXBwZW5kKDApCisgIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIuYXBwZW5kKDApCisgIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQuYXBwZW5kKDApCisgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKDApCisgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgwKQorICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wuYXBwZW5kKFRydWUpCisgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCh1JzAnKQorICBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzLmFwcGVuZChiJzAnKQorICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyWzFdID0gMzAxCisgIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRbMV0gPSAzMDIKKyAgbWVzc2FnZS5yZXBlYXRlZF91aW50MzJbMV0gPSAzMDMKKyAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRbMV0gPSAzMDQKKyAgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzJbMV0gPSAzMDUKKyAgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjRbMV0gPSAzMDYKKyAgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyWzFdID0gMzA3CisgIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NFsxXSA9IDMwOAorICBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyWzFdID0gMzA5CisgIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjRbMV0gPSAzMTAKKyAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdFsxXSA9IDMxMQorICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZVsxXSA9IDMxMgorICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xbMV0gPSBGYWxzZQorICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1sxXSA9IHUnMzE1JworICBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzWzFdID0gYiczMTYnCisKKyAgaWYgSXNQcm90bzIobWVzc2FnZSk6CisgICAgbWVzc2FnZS5yZXBlYXRlZGdyb3VwLmFkZCgpLmEgPSAzMTcKKyAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDMxOAorICBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZS5hZGQoKS5jID0gMzE5CisgIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UuYWRkKCkuZCA9IDMyMAorICBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZS5hZGQoKS5iYiA9IDMyNworCisgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0uYXBwZW5kKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKQorICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtWzFdID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVoKKyAgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0uYXBwZW5kKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWikKKyAgaWYgSXNQcm90bzIobWVzc2FnZSk6CisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bS5hcHBlbmQodW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFaKQorCisgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3BpZWNlLmFwcGVuZCh1JzMyNCcpCisgIG1lc3NhZ2UucmVwZWF0ZWRfY29yZC5hcHBlbmQodSczMjUnKQorCisgICMKKyAgIyBGaWVsZHMgdGhhdCBoYXZlIGRlZmF1bHRzLgorICAjCisKKyAgaWYgSXNQcm90bzIobWVzc2FnZSk6CisgICAgbWVzc2FnZS5kZWZhdWx0X2ludDMyID0gNDAxCisgICAgbWVzc2FnZS5kZWZhdWx0X2ludDY0ID0gNDAyCisgICAgbWVzc2FnZS5kZWZhdWx0X3VpbnQzMiA9IDQwMworICAgIG1lc3NhZ2UuZGVmYXVsdF91aW50NjQgPSA0MDQKKyAgICBtZXNzYWdlLmRlZmF1bHRfc2ludDMyID0gNDA1CisgICAgbWVzc2FnZS5kZWZhdWx0X3NpbnQ2NCA9IDQwNgorICAgIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDMyID0gNDA3CisgICAgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkNjQgPSA0MDgKKyAgICBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIgPSA0MDkKKyAgICBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkNjQgPSA0MTAKKyAgICBtZXNzYWdlLmRlZmF1bHRfZmxvYXQgPSA0MTEKKyAgICBtZXNzYWdlLmRlZmF1bHRfZG91YmxlID0gNDEyCisgICAgbWVzc2FnZS5kZWZhdWx0X2Jvb2wgPSBGYWxzZQorICAgIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcgPSAnNDE1JworICAgIG1lc3NhZ2UuZGVmYXVsdF9ieXRlcyA9IGInNDE2JworCisgICAgbWVzc2FnZS5kZWZhdWx0X25lc3RlZF9lbnVtID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08KKyAgICBtZXNzYWdlLmRlZmF1bHRfZm9yZWlnbl9lbnVtID0gdW5pdHRlc3RfcGIyLkZPUkVJR05fRk9PCisgICAgbWVzc2FnZS5kZWZhdWx0X2ltcG9ydF9lbnVtID0gdW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfRk9PCisKKyAgICBtZXNzYWdlLmRlZmF1bHRfc3RyaW5nX3BpZWNlID0gJzQyNCcKKyAgICBtZXNzYWdlLmRlZmF1bHRfY29yZCA9ICc0MjUnCisKKyAgbWVzc2FnZS5vbmVvZl91aW50MzIgPSA2MDEKKyAgbWVzc2FnZS5vbmVvZl9uZXN0ZWRfbWVzc2FnZS5iYiA9IDYwMgorICBtZXNzYWdlLm9uZW9mX3N0cmluZyA9ICc2MDMnCisgIG1lc3NhZ2Uub25lb2ZfYnl0ZXMgPSBiJzYwNCcKKworCitkZWYgU2V0QWxsRmllbGRzKG1lc3NhZ2UpOgorICBTZXRBbGxOb25MYXp5RmllbGRzKG1lc3NhZ2UpCisgIG1lc3NhZ2Uub3B0aW9uYWxfbGF6eV9tZXNzYWdlLmJiID0gMTI3CisgIG1lc3NhZ2Uub3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UuYmIgPSAxMjgKKworCitkZWYgU2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlKToKKyAgIiIiU2V0cyBldmVyeSBleHRlbnNpb24gaW4gdGhlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlOiBBIHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucyBpbnN0YW5jZS4KKyAgIiIiCisKKyAgZXh0ZW5zaW9ucyA9IG1lc3NhZ2UuRXh0ZW5zaW9ucworICBwYjIgPSB1bml0dGVzdF9wYjIKKyAgaW1wb3J0X3BiMiA9IHVuaXR0ZXN0X2ltcG9ydF9wYjIKKworICAjCisgICMgT3B0aW9uYWwgZmllbGRzLgorICAjCisKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSA9IDEwMQorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9pbnQ2NF9leHRlbnNpb25dID0gMTAyCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb25dID0gMTAzCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb25dID0gMTA0CisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb25dID0gMTA1CisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb25dID0gMTA2CisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uXSA9IDEwNworICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbl0gPSAxMDgKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uXSA9IDEwOQorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb25dID0gMTEwCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbl0gPSAxMTEKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbl0gPSAxMTIKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfYm9vbF9leHRlbnNpb25dID0gVHJ1ZQorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uXSA9IHUnMTE1JworICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9ieXRlc19leHRlbnNpb25dID0gYicxMTYnCisKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxncm91cF9leHRlbnNpb25dLmEgPSAxMTcKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXS5iYiA9IDExOAorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uXS5jID0gMTE5CisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0uZCA9IDEyMAorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uXS5lID0gMTI2CisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb25dLmJiID0gMTI3CisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl0uYmIgPSAxMjgKKworICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25dID0gcGIyLlRlc3RBbGxUeXBlcy5CQVoKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXSA9IHBiMi5UZXN0QWxsVHlwZXMuQkFaCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb25dID0gcGIyLkZPUkVJR05fQkFaCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl0gPSBpbXBvcnRfcGIyLklNUE9SVF9CQVoKKworICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXSA9IHUnMTI0JworICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9jb3JkX2V4dGVuc2lvbl0gPSB1JzEyNScKKworICAjCisgICMgUmVwZWF0ZWQgZmllbGRzLgorICAjCisKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjAxKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDIpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgyMDMpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDQpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgyMDUpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDYpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjA3KQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl0uYXBwZW5kKDIwOCkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjA5KQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMTApCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl0uYXBwZW5kKDIxMSkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl0uYXBwZW5kKDIxMikKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfYm9vbF9leHRlbnNpb25dLmFwcGVuZChUcnVlKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uXS5hcHBlbmQodScyMTUnKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9ieXRlc19leHRlbnNpb25dLmFwcGVuZChiJzIxNicpCisKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRncm91cF9leHRlbnNpb25dLmFkZCgpLmEgPSAyMTcKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXS5hZGQoKS5iYiA9IDIxOAorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uXS5hZGQoKS5jID0gMjE5CisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0uYWRkKCkuZCA9IDIyMAorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uXS5hZGQoKS5iYiA9IDIyNworCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl0uYXBwZW5kKHBiMi5UZXN0QWxsVHlwZXMuQkFSKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uXS5hcHBlbmQocGIyLkZPUkVJR05fQkFSKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25dLmFwcGVuZChpbXBvcnRfcGIyLklNUE9SVF9CQVIpCisKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl0uYXBwZW5kKHUnMjI0JykKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfY29yZF9leHRlbnNpb25dLmFwcGVuZCh1JzIyNScpCisKKyAgIyBBcHBlbmQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl0uYXBwZW5kKDMwMSkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uXS5hcHBlbmQoMzAyKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMzAzKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uXS5hcHBlbmQoMzA0KQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMzA1KQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uXS5hcHBlbmQoMzA2KQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl0uYXBwZW5kKDMwNykKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25dLmFwcGVuZCgzMDgpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl0uYXBwZW5kKDMwOSkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uXS5hcHBlbmQoMzEwKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9mbG9hdF9leHRlbnNpb25dLmFwcGVuZCgzMTEpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25dLmFwcGVuZCgzMTIpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uXS5hcHBlbmQoRmFsc2UpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25dLmFwcGVuZCh1JzMxNScpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl0uYXBwZW5kKGInMzE2JykKKworICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl0uYWRkKCkuYSA9IDMxNworICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmJiID0gMzE4CisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmMgPSAzMTkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uXS5hZGQoKS5kID0gMzIwCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmJiID0gMzI3CisKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXS5hcHBlbmQocGIyLlRlc3RBbGxUeXBlcy5CQVopCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25dLmFwcGVuZChwYjIuRk9SRUlHTl9CQVopCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl0uYXBwZW5kKGltcG9ydF9wYjIuSU1QT1JUX0JBWikKKworICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXS5hcHBlbmQodSczMjQnKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9jb3JkX2V4dGVuc2lvbl0uYXBwZW5kKHUnMzI1JykKKworICAjCisgICMgRmllbGRzIHdpdGggZGVmYXVsdHMuCisgICMKKworICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X2ludDMyX2V4dGVuc2lvbl0gPSA0MDEKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9pbnQ2NF9leHRlbnNpb25dID0gNDAyCisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl0gPSA0MDMKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uXSA9IDQwNAorICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3NpbnQzMl9leHRlbnNpb25dID0gNDA1CisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbl0gPSA0MDYKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbl0gPSA0MDcKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbl0gPSA0MDgKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb25dID0gNDA5CisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uXSA9IDQxMAorICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbl0gPSA0MTEKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uXSA9IDQxMgorICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uXSA9IEZhbHNlCisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl0gPSB1JzQxNScKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9ieXRlc19leHRlbnNpb25dID0gYic0MTYnCisKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb25dID0gcGIyLlRlc3RBbGxUeXBlcy5GT08KKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uXSA9IHBiMi5GT1JFSUdOX0ZPTworICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbl0gPSBpbXBvcnRfcGIyLklNUE9SVF9GT08KKworICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb25dID0gdSc0MjQnCisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfY29yZF9leHRlbnNpb25dID0gJzQyNScKKworICBleHRlbnNpb25zW3BiMi5vbmVvZl91aW50MzJfZXh0ZW5zaW9uXSA9IDYwMQorICBleHRlbnNpb25zW3BiMi5vbmVvZl9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dLmJiID0gNjAyCisgIGV4dGVuc2lvbnNbcGIyLm9uZW9mX3N0cmluZ19leHRlbnNpb25dID0gdSc2MDMnCisgIGV4dGVuc2lvbnNbcGIyLm9uZW9mX2J5dGVzX2V4dGVuc2lvbl0gPSBiJzYwNCcKKworCitkZWYgU2V0QWxsRmllbGRzQW5kRXh0ZW5zaW9ucyhtZXNzYWdlKToKKyAgIiIiU2V0cyBldmVyeSBmaWVsZCBhbmQgZXh0ZW5zaW9uIGluIHRoZSBtZXNzYWdlIHRvIGEgdW5pcXVlIHZhbHVlLgorCisgIEFyZ3M6CisgICAgbWVzc2FnZTogQSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZS4KKyAgIiIiCisgIG1lc3NhZ2UubXlfaW50ID0gMQorICBtZXNzYWdlLm15X3N0cmluZyA9ICdmb28nCisgIG1lc3NhZ2UubXlfZmxvYXQgPSAxLjAKKyAgbWVzc2FnZS5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25faW50XSA9IDIzCisgIG1lc3NhZ2UuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIubXlfZXh0ZW5zaW9uX3N0cmluZ10gPSAnYmFyJworCisKK2RlZiBFeHBlY3RBbGxGaWVsZHNBbmRFeHRlbnNpb25zSW5PcmRlcihzZXJpYWxpemVkKToKKyAgIiIiRW5zdXJlcyB0aGF0IHNlcmlhbGl6ZWQgaXMgdGhlIHNlcmlhbGl6YXRpb24gd2UgZXhwZWN0IGZvciBhIG1lc3NhZ2UKKyAgZmlsbGVkIHdpdGggU2V0QWxsRmllbGRzQW5kRXh0ZW5zaW9ucygpLiAgKFNwZWNpZmljYWxseSwgZW5zdXJlcyB0aGF0IHRoZQorICBzZXJpYWxpemF0aW9uIGlzIGluIGNhbm9uaWNhbCwgdGFnLW51bWJlciBvcmRlcikuCisgICIiIgorICBteV9leHRlbnNpb25faW50ID0gdW5pdHRlc3RfcGIyLm15X2V4dGVuc2lvbl9pbnQKKyAgbXlfZXh0ZW5zaW9uX3N0cmluZyA9IHVuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25fc3RyaW5nCisgIGV4cGVjdGVkX3N0cmluZ3MgPSBbXQorICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RGaWVsZE9yZGVyaW5ncygpCisgIG1lc3NhZ2UubXlfaW50ID0gMSAgIyBGaWVsZCAxLgorICBleHBlY3RlZF9zdHJpbmdzLmFwcGVuZChtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgIG1lc3NhZ2UuQ2xlYXIoKQorICBtZXNzYWdlLkV4dGVuc2lvbnNbbXlfZXh0ZW5zaW9uX2ludF0gPSAyMyAgIyBGaWVsZCA1LgorICBleHBlY3RlZF9zdHJpbmdzLmFwcGVuZChtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgIG1lc3NhZ2UuQ2xlYXIoKQorICBtZXNzYWdlLm15X3N0cmluZyA9ICdmb28nICAjIEZpZWxkIDExLgorICBleHBlY3RlZF9zdHJpbmdzLmFwcGVuZChtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgIG1lc3NhZ2UuQ2xlYXIoKQorICBtZXNzYWdlLkV4dGVuc2lvbnNbbXlfZXh0ZW5zaW9uX3N0cmluZ10gPSAnYmFyJyAgIyBGaWVsZCA1MC4KKyAgZXhwZWN0ZWRfc3RyaW5ncy5hcHBlbmQobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICBtZXNzYWdlLkNsZWFyKCkKKyAgbWVzc2FnZS5teV9mbG9hdCA9IDEuMAorICBleHBlY3RlZF9zdHJpbmdzLmFwcGVuZChtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgIG1lc3NhZ2UuQ2xlYXIoKQorICBleHBlY3RlZCA9IGInJy5qb2luKGV4cGVjdGVkX3N0cmluZ3MpCisKKyAgaWYgZXhwZWN0ZWQgIT0gc2VyaWFsaXplZDoKKyAgICByYWlzZSBWYWx1ZUVycm9yKCdFeHBlY3RlZCAlciwgZm91bmQgJXInICUgKGV4cGVjdGVkLCBzZXJpYWxpemVkKSkKKworCitkZWYgRXhwZWN0QWxsRmllbGRzU2V0KHRlc3RfY2FzZSwgbWVzc2FnZSk6CisgICIiIkNoZWNrIGFsbCBmaWVsZHMgZm9yIGNvcnJlY3QgdmFsdWVzIGhhdmUgYWZ0ZXIgU2V0KkZpZWxkcygpIGlzIGNhbGxlZC4iIiIKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfaW50NjQnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfdWludDMyJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX3VpbnQ2NCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zaW50MzInKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfc2ludDY0JykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ZpeGVkMzInKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfZml4ZWQ2NCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zZml4ZWQzMicpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zZml4ZWQ2NCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9mbG9hdCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9kb3VibGUnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfYm9vbCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zdHJpbmcnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfYnl0ZXMnKSkKKworICBpZiBJc1Byb3RvMihtZXNzYWdlKToKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbGdyb3VwJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9pbXBvcnRfbWVzc2FnZScpKQorCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxncm91cC5IYXNGaWVsZCgnYScpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLkhhc0ZpZWxkKCdiYicpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5IYXNGaWVsZCgnYycpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlLkhhc0ZpZWxkKCdkJykpCisKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX2VudW0nKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfZm9yZWlnbl9lbnVtJykpCisgIGlmIElzUHJvdG8yKG1lc3NhZ2UpOgorICAgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ltcG9ydF9lbnVtJykpCisKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfc3RyaW5nX3BpZWNlJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2NvcmQnKSkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAxLCBtZXNzYWdlLm9wdGlvbmFsX2ludDMyKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAyLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0KQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAzLCBtZXNzYWdlLm9wdGlvbmFsX3VpbnQzMikKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDEwNCwgbWVzc2FnZS5vcHRpb25hbF91aW50NjQpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMDUsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDMyKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTA2LCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQ2NCkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDEwNywgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTA4LCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMDksIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkNjQpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTEsIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTIsIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoVHJ1ZSwgbWVzc2FnZS5vcHRpb25hbF9ib29sKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzExNScsIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoYicxMTYnLCBtZXNzYWdlLm9wdGlvbmFsX2J5dGVzKQorCisgIGlmIElzUHJvdG8yKG1lc3NhZ2UpOgorICAgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTcsIG1lc3NhZ2Uub3B0aW9uYWxncm91cC5hKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTE4LCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTE5LCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5jKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTIwLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlLmQpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMjYsIG1lc3NhZ2Uub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlLmUpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMjcsIG1lc3NhZ2Uub3B0aW9uYWxfbGF6eV9tZXNzYWdlLmJiKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTI4LCBtZXNzYWdlLm9wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlLmJiKQorCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVosCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fZW51bSkKKyAgaWYgSXNQcm90bzIobWVzc2FnZSk6CisgICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X2ltcG9ydF9wYjIuSU1QT1JUX0JBWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfZW51bSkKKworICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ludDMyKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ludDY0KSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMikpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF91aW50NjQpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCkpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2Jvb2wpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2J5dGVzKSkKKworICBpZiBJc1Byb3RvMihtZXNzYWdlKToKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRncm91cCkpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0pKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKSkKKyAgaWYgSXNQcm90bzIobWVzc2FnZSk6CisgICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtKSkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3BpZWNlKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2NvcmQpKQorCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDMsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyWzBdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjA0LCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NFswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwNSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzJbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDYsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0WzBdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjA3LCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDgsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NFswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwOSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMlswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIxMCwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NFswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIxMSwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdFswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIxMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbChUcnVlLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgnMjE1JywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbChiJzIxNicsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXNbMF0pCisKKyAgaWYgSXNQcm90bzIobWVzc2FnZSk6CisgICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwWzBdLmEpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uYmIpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlWzBdLmMpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VbMF0uZCkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2VbMF0uYmIpCisKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bVswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtWzBdKQorICBpZiBJc1Byb3RvMihtZXNzYWdlKToKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtWzBdKQorCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDMsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyWzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzA0LCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NFsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMwNSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzJbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDYsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0WzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzA3LCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDgsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NFsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMwOSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMlsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMxMCwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NFsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMxMSwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdFsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMxMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbChGYWxzZSwgbWVzc2FnZS5yZXBlYXRlZF9ib29sWzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzMxNScsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoYiczMTYnLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzWzFdKQorCisgIGlmIElzUHJvdG8yKG1lc3NhZ2UpOgorICAgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cFsxXS5hKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzFdLmJiKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZVsxXS5jKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlWzFdLmQpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMjcsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlWzFdLmJiKQorCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW1bMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVosCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bVsxXSkKKyAgaWYgSXNQcm90bzIobWVzc2FnZSk6CisgICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X2ltcG9ydF9wYjIuSU1QT1JUX0JBWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bVsxXSkKKworICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgaWYgSXNQcm90bzIobWVzc2FnZSk6CisgICAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9pbnQzMicpKQorICAgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfaW50NjQnKSkKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X3VpbnQzMicpKQorICAgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfdWludDY0JykpCisgICAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9zaW50MzInKSkKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X3NpbnQ2NCcpKQorICAgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZml4ZWQzMicpKQorICAgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZml4ZWQ2NCcpKQorICAgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfc2ZpeGVkMzInKSkKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X3NmaXhlZDY0JykpCisgICAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9mbG9hdCcpKQorICAgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZG91YmxlJykpCisgICAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9ib29sJykpCisgICAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9zdHJpbmcnKSkKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X2J5dGVzJykpCisKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X25lc3RlZF9lbnVtJykpCisgICAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9mb3JlaWduX2VudW0nKSkKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X2ltcG9ydF9lbnVtJykpCisKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDAxLCBtZXNzYWdlLmRlZmF1bHRfaW50MzIpCisgICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwMiwgbWVzc2FnZS5kZWZhdWx0X2ludDY0KQorICAgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MDMsIG1lc3NhZ2UuZGVmYXVsdF91aW50MzIpCisgICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNCwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCkKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDA1LCBtZXNzYWdlLmRlZmF1bHRfc2ludDMyKQorICAgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MDYsIG1lc3NhZ2UuZGVmYXVsdF9zaW50NjQpCisgICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNywgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkMzIpCisgICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwOCwgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkNjQpCisgICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwOSwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDMyKQorICAgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MTAsIG1lc3NhZ2UuZGVmYXVsdF9zZml4ZWQ2NCkKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDExLCBtZXNzYWdlLmRlZmF1bHRfZmxvYXQpCisgICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQxMiwgbWVzc2FnZS5kZWZhdWx0X2RvdWJsZSkKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoRmFsc2UsIG1lc3NhZ2UuZGVmYXVsdF9ib29sKQorICAgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgnNDE1JywgbWVzc2FnZS5kZWZhdWx0X3N0cmluZykKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoYic0MTYnLCBtZXNzYWdlLmRlZmF1bHRfYnl0ZXMpCisKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVmYXVsdF9uZXN0ZWRfZW51bSkKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkZPUkVJR05fRk9PLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRlZmF1bHRfZm9yZWlnbl9lbnVtKQorICAgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9GT08sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVmYXVsdF9pbXBvcnRfZW51bSkKKworCitkZWYgR29sZGVuRmlsZShmaWxlbmFtZSk6CisgICIiIkZpbmRzIHRoZSBnaXZlbiBnb2xkZW4gZmlsZSBhbmQgcmV0dXJucyBhIGZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyBpdC4iIiIKKworICAjIFNlYXJjaCB1cCB0aGUgZGlyZWN0b3J5IHRyZWUgbG9va2luZyBmb3IgdGhlIEMrKyBwcm90b2J1ZiBzb3VyY2UgY29kZS4KKyAgcGF0aCA9ICcuJworICB3aGlsZSBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4ocGF0aCwgJ3NyYy9nb29nbGUvcHJvdG9idWYnKSk6CisgICAgICAjIEZvdW5kIGl0LiAgTG9hZCB0aGUgZ29sZGVuIGZpbGUgZnJvbSB0aGUgdGVzdGRhdGEgZGlyZWN0b3J5LgorICAgICAgZnVsbF9wYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhJywgZmlsZW5hbWUpCisgICAgICByZXR1cm4gb3BlbihmdWxsX3BhdGgsICdyYicpCisgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAnLi4nKQorCisgICMgU2VhcmNoIGludGVybmFsbHkuCisgIHBhdGggPSAnLicKKyAgZnVsbF9wYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICd0aGlyZF9wYXJ0eS9weS9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpCisgIGlmIG9zLnBhdGguZXhpc3RzKGZ1bGxfcGF0aCk6CisgICAgIyBGb3VuZCBpdC4gIExvYWQgdGhlIGdvbGRlbiBmaWxlIGZyb20gdGhlIHRlc3RkYXRhIGRpcmVjdG9yeS4KKyAgICByZXR1cm4gb3BlbihmdWxsX3BhdGgsICdyYicpCisKKyAgIyBTZWFyY2ggZm9yIGNyb3NzLXJlcG8gcGF0aC4KKyAgZnVsbF9wYXRoID0gb3MucGF0aC5qb2luKCdleHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpCisgIGlmIG9zLnBhdGguZXhpc3RzKGZ1bGxfcGF0aCk6CisgICAgIyBGb3VuZCBpdC4gIExvYWQgdGhlIGdvbGRlbiBmaWxlIGZyb20gdGhlIHRlc3RkYXRhIGRpcmVjdG9yeS4KKyAgICByZXR1cm4gb3BlbihmdWxsX3BhdGgsICdyYicpCisKKyAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgJ0NvdWxkIG5vdCBmaW5kIGdvbGRlbiBmaWxlcy4gIFRoaXMgdGVzdCBtdXN0IGJlIHJ1biBmcm9tIHdpdGhpbiB0aGUgJworICAgICAgJ3Byb3RvYnVmIHNvdXJjZSBwYWNrYWdlIHNvIHRoYXQgaXQgY2FuIHJlYWQgdGVzdCBkYXRhIGZpbGVzIGZyb20gdGhlICcKKyAgICAgICdDKysgc291cmNlIHRyZWUuJykKKworCitkZWYgR29sZGVuRmlsZURhdGEoZmlsZW5hbWUpOgorICAiIiJGaW5kcyB0aGUgZ2l2ZW4gZ29sZGVuIGZpbGUgYW5kIHJldHVybnMgaXRzIGNvbnRlbnRzLiIiIgorICB3aXRoIEdvbGRlbkZpbGUoZmlsZW5hbWUpIGFzIGY6CisgICAgcmV0dXJuIGYucmVhZCgpCisKKworZGVmIFNldEFsbFBhY2tlZEZpZWxkcyhtZXNzYWdlKToKKyAgIiIiU2V0cyBldmVyeSBmaWVsZCBpbiB0aGUgbWVzc2FnZSB0byBhIHVuaXF1ZSB2YWx1ZS4KKworICBBcmdzOgorICAgIG1lc3NhZ2U6IEEgVGVzdFBhY2tlZFR5cGVzIGluc3RhbmNlLgorICAiIiIKKyAgbWVzc2FnZS5wYWNrZWRfaW50MzIuZXh0ZW5kKFs2MDEsIDcwMV0pCisgIG1lc3NhZ2UucGFja2VkX2ludDY0LmV4dGVuZChbNjAyLCA3MDJdKQorICBtZXNzYWdlLnBhY2tlZF91aW50MzIuZXh0ZW5kKFs2MDMsIDcwM10pCisgIG1lc3NhZ2UucGFja2VkX3VpbnQ2NC5leHRlbmQoWzYwNCwgNzA0XSkKKyAgbWVzc2FnZS5wYWNrZWRfc2ludDMyLmV4dGVuZChbNjA1LCA3MDVdKQorICBtZXNzYWdlLnBhY2tlZF9zaW50NjQuZXh0ZW5kKFs2MDYsIDcwNl0pCisgIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIuZXh0ZW5kKFs2MDcsIDcwN10pCisgIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjQuZXh0ZW5kKFs2MDgsIDcwOF0pCisgIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyLmV4dGVuZChbNjA5LCA3MDldKQorICBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NC5leHRlbmQoWzYxMCwgNzEwXSkKKyAgbWVzc2FnZS5wYWNrZWRfZmxvYXQuZXh0ZW5kKFs2MTEuMCwgNzExLjBdKQorICBtZXNzYWdlLnBhY2tlZF9kb3VibGUuZXh0ZW5kKFs2MTIuMCwgNzEyLjBdKQorICBtZXNzYWdlLnBhY2tlZF9ib29sLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQorICBtZXNzYWdlLnBhY2tlZF9lbnVtLmV4dGVuZChbdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFaXSkKKworCitkZWYgU2V0QWxsUGFja2VkRXh0ZW5zaW9ucyhtZXNzYWdlKToKKyAgIiIiU2V0cyBldmVyeSBleHRlbnNpb24gaW4gdGhlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlOiBBIHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkRXh0ZW5zaW9ucyBpbnN0YW5jZS4KKyAgIiIiCisgIGV4dGVuc2lvbnMgPSBtZXNzYWdlLkV4dGVuc2lvbnMKKyAgcGIyID0gdW5pdHRlc3RfcGIyCisKKyAgZXh0ZW5zaW9uc1twYjIucGFja2VkX2ludDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDEsIDcwMV0pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9pbnQ2NF9leHRlbnNpb25dLmV4dGVuZChbNjAyLCA3MDJdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfdWludDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDMsIDcwM10pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uXS5leHRlbmQoWzYwNCwgNzA0XSkKKyAgZXh0ZW5zaW9uc1twYjIucGFja2VkX3NpbnQzMl9leHRlbnNpb25dLmV4dGVuZChbNjA1LCA3MDVdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfc2ludDY0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDYsIDcwNl0pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDcsIDcwN10pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDgsIDcwOF0pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25dLmV4dGVuZChbNjA5LCA3MDldKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uXS5leHRlbmQoWzYxMCwgNzEwXSkKKyAgZXh0ZW5zaW9uc1twYjIucGFja2VkX2Zsb2F0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MTEuMCwgNzExLjBdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfZG91YmxlX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MTIuMCwgNzEyLjBdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfYm9vbF9leHRlbnNpb25dLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfZW51bV9leHRlbnNpb25dLmV4dGVuZChbdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFaXSkKKworCitkZWYgU2V0QWxsVW5wYWNrZWRGaWVsZHMobWVzc2FnZSk6CisgICIiIlNldHMgZXZlcnkgZmllbGQgaW4gdGhlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlOiBBIHVuaXR0ZXN0X3BiMi5UZXN0VW5wYWNrZWRUeXBlcyBpbnN0YW5jZS4KKyAgIiIiCisgIG1lc3NhZ2UudW5wYWNrZWRfaW50MzIuZXh0ZW5kKFs2MDEsIDcwMV0pCisgIG1lc3NhZ2UudW5wYWNrZWRfaW50NjQuZXh0ZW5kKFs2MDIsIDcwMl0pCisgIG1lc3NhZ2UudW5wYWNrZWRfdWludDMyLmV4dGVuZChbNjAzLCA3MDNdKQorICBtZXNzYWdlLnVucGFja2VkX3VpbnQ2NC5leHRlbmQoWzYwNCwgNzA0XSkKKyAgbWVzc2FnZS51bnBhY2tlZF9zaW50MzIuZXh0ZW5kKFs2MDUsIDcwNV0pCisgIG1lc3NhZ2UudW5wYWNrZWRfc2ludDY0LmV4dGVuZChbNjA2LCA3MDZdKQorICBtZXNzYWdlLnVucGFja2VkX2ZpeGVkMzIuZXh0ZW5kKFs2MDcsIDcwN10pCisgIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQ2NC5leHRlbmQoWzYwOCwgNzA4XSkKKyAgbWVzc2FnZS51bnBhY2tlZF9zZml4ZWQzMi5leHRlbmQoWzYwOSwgNzA5XSkKKyAgbWVzc2FnZS51bnBhY2tlZF9zZml4ZWQ2NC5leHRlbmQoWzYxMCwgNzEwXSkKKyAgbWVzc2FnZS51bnBhY2tlZF9mbG9hdC5leHRlbmQoWzYxMS4wLCA3MTEuMF0pCisgIG1lc3NhZ2UudW5wYWNrZWRfZG91YmxlLmV4dGVuZChbNjEyLjAsIDcxMi4wXSkKKyAgbWVzc2FnZS51bnBhY2tlZF9ib29sLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQorICBtZXNzYWdlLnVucGFja2VkX2VudW0uZXh0ZW5kKFt1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWl0pCisKKworY2xhc3MgTm9uU3RhbmRhcmRJbnRlZ2VyKG51bWJlcnMuSW50ZWdyYWwpOgorICAiIiJBbiBpbnRlZ2VyIG9iamVjdCB0aGF0IGRvZXMgbm90IHN1YmNsYXNzIGludC4KKworICBUaGlzIGlzIHVzZWQgdG8gdmVyaWZ5IHRoYXQgYm90aCBDKysgYW5kIHJlZ3VsYXIgcHJvdG8gc3lzdGVtcyBjYW4gaGFuZGxlCisgIGludGVnZXIgb3RoZXJzIHRoYW4gaW50IGFuZCBsb25nIGFuZCB0aGF0IHRoZXkgaGFuZGxlIHRoZW0gaW4gcHJlZGljdGFibGUKKyAgd2F5cy4KKworICBOb25TdGFuZGFyZEludGVnZXIgaXMgdGhlIG1pbmltYWwgbGVnYWwgc3BlY2lmaWNhdGlvbiBmb3IgYSBjdXN0b20gSW50ZWdyYWwuCisgIEFzIHN1Y2gsIGl0IGRvZXMgbm90IHN1cHBvcnQgMCA8IHggPCA1IGFuZCBpdCBpcyBub3QgaGFzaGFibGUuCisKKyAgTm90ZTogVGhpcyBpcyBhZGRlZCBoZXJlIGluc3RlYWQgb2YgcmVseWluZyBvbiBudW1weSBvciBhIHNpbWlsYXIgbGlicmFyeQorICB3aXRoIGN1c3RvbSBpbnRlZ2VycyB0byBsaW1pdCBkZXBlbmRlbmNpZXMuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWwsIGVycm9yX3N0cmluZ19vbl9jb252ZXJzaW9uPU5vbmUpOgorICAgIGFzc2VydCBpc2luc3RhbmNlKHZhbCwgbnVtYmVycy5JbnRlZ3JhbCkKKyAgICBpZiBpc2luc3RhbmNlKHZhbCwgTm9uU3RhbmRhcmRJbnRlZ2VyKToKKyAgICAgIHZhbCA9IHZhbC52YWwKKyAgICBzZWxmLnZhbCA9IHZhbAorICAgIHNlbGYuZXJyb3Jfc3RyaW5nX29uX2NvbnZlcnNpb24gPSBlcnJvcl9zdHJpbmdfb25fY29udmVyc2lvbgorCisgIGRlZiBfX2xvbmdfXyhzZWxmKToKKyAgICBpZiBzZWxmLmVycm9yX3N0cmluZ19vbl9jb252ZXJzaW9uOgorICAgICAgcmFpc2UgUnVudGltZUVycm9yKHNlbGYuZXJyb3Jfc3RyaW5nX29uX2NvbnZlcnNpb24pCisgICAgcmV0dXJuIGxvbmcoc2VsZi52YWwpCisKKyAgZGVmIF9fYWJzX18oc2VsZik6CisgICAgcmV0dXJuIE5vblN0YW5kYXJkSW50ZWdlcihvcGVyYXRvci5hYnMoc2VsZi52YWwpKQorCisgIGRlZiBfX2FkZF9fKHNlbGYsIHkpOgorICAgIHJldHVybiBOb25TdGFuZGFyZEludGVnZXIob3BlcmF0b3IuYWRkKHNlbGYudmFsLCB5KSkKKworICBkZWYgX19kaXZfXyhzZWxmLCB5KToKKyAgICByZXR1cm4gTm9uU3RhbmRhcmRJbnRlZ2VyKG9wZXJhdG9yLmRpdihzZWxmLnZhbCwgeSkpCisKKyAgZGVmIF9fZXFfXyhzZWxmLCB5KToKKyAgICByZXR1cm4gb3BlcmF0b3IuZXEoc2VsZi52YWwsIHkpCisKKyAgZGVmIF9fZmxvb3JkaXZfXyhzZWxmLCB5KToKKyAgICByZXR1cm4gTm9uU3RhbmRhcmRJbnRlZ2VyKG9wZXJhdG9yLmZsb29yZGl2KHNlbGYudmFsLCB5KSkKKworICBkZWYgX190cnVlZGl2X18oc2VsZiwgeSk6CisgICAgcmV0dXJuIE5vblN0YW5kYXJkSW50ZWdlcihvcGVyYXRvci50cnVlZGl2KHNlbGYudmFsLCB5KSkKKworICBkZWYgX19pbnZlcnRfXyhzZWxmKToKKyAgICByZXR1cm4gTm9uU3RhbmRhcmRJbnRlZ2VyKG9wZXJhdG9yLmludmVydChzZWxmLnZhbCkpCisKKyAgZGVmIF9fbW9kX18oc2VsZiwgeSk6CisgICAgcmV0dXJuIE5vblN0YW5kYXJkSW50ZWdlcihvcGVyYXRvci5tb2Qoc2VsZi52YWwsIHkpKQorCisgIGRlZiBfX211bF9fKHNlbGYsIHkpOgorICAgIHJldHVybiBOb25TdGFuZGFyZEludGVnZXIob3BlcmF0b3IubXVsKHNlbGYudmFsLCB5KSkKKworICBkZWYgX19uZWdfXyhzZWxmKToKKyAgICByZXR1cm4gTm9uU3RhbmRhcmRJbnRlZ2VyKG9wZXJhdG9yLm5lZyhzZWxmLnZhbCkpCisKKyAgZGVmIF9fcG9zX18oc2VsZik6CisgICAgcmV0dXJuIE5vblN0YW5kYXJkSW50ZWdlcihvcGVyYXRvci5wb3Moc2VsZi52YWwpKQorCisgIGRlZiBfX3Bvd19fKHNlbGYsIHkpOgorICAgIHJldHVybiBOb25TdGFuZGFyZEludGVnZXIob3BlcmF0b3IucG93KHNlbGYudmFsLCB5KSkKKworICBkZWYgX190cnVuY19fKHNlbGYpOgorICAgIHJldHVybiBpbnQoc2VsZi52YWwpCisKKyAgZGVmIF9fcmFkZF9fKHNlbGYsIHkpOgorICAgIHJldHVybiBOb25TdGFuZGFyZEludGVnZXIob3BlcmF0b3IuYWRkKHksIHNlbGYudmFsKSkKKworICBkZWYgX19yZGl2X18oc2VsZiwgeSk6CisgICAgcmV0dXJuIE5vblN0YW5kYXJkSW50ZWdlcihvcGVyYXRvci5kaXYoeSwgc2VsZi52YWwpKQorCisgIGRlZiBfX3Jtb2RfXyhzZWxmLCB5KToKKyAgICByZXR1cm4gTm9uU3RhbmRhcmRJbnRlZ2VyKG9wZXJhdG9yLm1vZCh5LCBzZWxmLnZhbCkpCisKKyAgZGVmIF9fcm11bF9fKHNlbGYsIHkpOgorICAgIHJldHVybiBOb25TdGFuZGFyZEludGVnZXIob3BlcmF0b3IubXVsKHksIHNlbGYudmFsKSkKKworICBkZWYgX19ycG93X18oc2VsZiwgeSk6CisgICAgcmV0dXJuIE5vblN0YW5kYXJkSW50ZWdlcihvcGVyYXRvci5wb3coeSwgc2VsZi52YWwpKQorCisgIGRlZiBfX3JmbG9vcmRpdl9fKHNlbGYsIHkpOgorICAgIHJldHVybiBOb25TdGFuZGFyZEludGVnZXIob3BlcmF0b3IuZmxvb3JkaXYoeSwgc2VsZi52YWwpKQorCisgIGRlZiBfX3J0cnVlZGl2X18oc2VsZiwgeSk6CisgICAgcmV0dXJuIE5vblN0YW5kYXJkSW50ZWdlcihvcGVyYXRvci50cnVlZGl2KHksIHNlbGYudmFsKSkKKworICBkZWYgX19sc2hpZnRfXyhzZWxmLCB5KToKKyAgICByZXR1cm4gTm9uU3RhbmRhcmRJbnRlZ2VyKG9wZXJhdG9yLmxzaGlmdChzZWxmLnZhbCwgeSkpCisKKyAgZGVmIF9fcnNoaWZ0X18oc2VsZiwgeSk6CisgICAgcmV0dXJuIE5vblN0YW5kYXJkSW50ZWdlcihvcGVyYXRvci5yc2hpZnQoc2VsZi52YWwsIHkpKQorCisgIGRlZiBfX3Jsc2hpZnRfXyhzZWxmLCB5KToKKyAgICByZXR1cm4gTm9uU3RhbmRhcmRJbnRlZ2VyKG9wZXJhdG9yLmxzaGlmdCh5LCBzZWxmLnZhbCkpCisKKyAgZGVmIF9fcnJzaGlmdF9fKHNlbGYsIHkpOgorICAgIHJldHVybiBOb25TdGFuZGFyZEludGVnZXIob3BlcmF0b3IucnNoaWZ0KHksIHNlbGYudmFsKSkKKworICBkZWYgX19sZV9fKHNlbGYsIHkpOgorICAgIGlmIGlzaW5zdGFuY2UoeSwgTm9uU3RhbmRhcmRJbnRlZ2VyKToKKyAgICAgIHkgPSB5LnZhbAorICAgIHJldHVybiBvcGVyYXRvci5sZShzZWxmLnZhbCwgeSkKKworICBkZWYgX19sdF9fKHNlbGYsIHkpOgorICAgIGlmIGlzaW5zdGFuY2UoeSwgTm9uU3RhbmRhcmRJbnRlZ2VyKToKKyAgICAgIHkgPSB5LnZhbAorICAgIHJldHVybiBvcGVyYXRvci5sdChzZWxmLnZhbCwgeSkKKworICBkZWYgX19hbmRfXyhzZWxmLCB5KToKKyAgICByZXR1cm4gTm9uU3RhbmRhcmRJbnRlZ2VyKG9wZXJhdG9yLmFuZF8oc2VsZi52YWwsIHkpKQorCisgIGRlZiBfX29yX18oc2VsZiwgeSk6CisgICAgcmV0dXJuIE5vblN0YW5kYXJkSW50ZWdlcihvcGVyYXRvci5vcl8oc2VsZi52YWwsIHkpKQorCisgIGRlZiBfX3hvcl9fKHNlbGYsIHkpOgorICAgIHJldHVybiBOb25TdGFuZGFyZEludGVnZXIob3BlcmF0b3IueG9yKHNlbGYudmFsLCB5KSkKKworICBkZWYgX19yYW5kX18oc2VsZiwgeSk6CisgICAgcmV0dXJuIE5vblN0YW5kYXJkSW50ZWdlcihvcGVyYXRvci5hbmRfKHksIHNlbGYudmFsKSkKKworICBkZWYgX19yb3JfXyhzZWxmLCB5KToKKyAgICByZXR1cm4gTm9uU3RhbmRhcmRJbnRlZ2VyKG9wZXJhdG9yLm9yXyh5LCBzZWxmLnZhbCkpCisKKyAgZGVmIF9fcnhvcl9fKHNlbGYsIHkpOgorICAgIHJldHVybiBOb25TdGFuZGFyZEludGVnZXIob3BlcmF0b3IueG9yKHksIHNlbGYudmFsKSkKKworICBkZWYgX19ib29sX18oc2VsZik6CisgICAgcmV0dXJuIHNlbGYudmFsCisKKyAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgorICAgIHJldHVybiBzZWxmLnZhbAorCisgIGRlZiBfX2NlaWxfXyhzZWxmKToKKyAgICByZXR1cm4gc2VsZgorCisgIGRlZiBfX2Zsb29yX18oc2VsZik6CisgICAgcmV0dXJuIHNlbGYKKworICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICBpZiBzZWxmLmVycm9yX3N0cmluZ19vbl9jb252ZXJzaW9uOgorICAgICAgcmFpc2UgUnVudGltZUVycm9yKHNlbGYuZXJyb3Jfc3RyaW5nX29uX2NvbnZlcnNpb24pCisgICAgcmV0dXJuIGludChzZWxmLnZhbCkKKworICBkZWYgX19yb3VuZF9fKHNlbGYpOgorICAgIHJldHVybiBzZWxmCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIHJldHVybiAnTm9uU3RhbmRhcmRJbnRlZ2VyKCVzKScgJSBzZWxmLnZhbApkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXN0aW5nX3JlZmxlYWtzLnB5IGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXN0aW5nX3JlZmxlYWtzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMTljNDYKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Rlc3RpbmdfcmVmbGVha3MucHkKQEAgLTAsMCArMSwxNDIgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiQSBzdWJjbGFzcyBvZiB1bml0dGVzdC5UZXN0Q2FzZSB3aGljaCBjaGVja3MgZm9yIHJlZmVyZW5jZSBsZWFrcy4KKworVG8gdXNlOgorLSBVc2UgdGVzdGluZ19yZWZsZWFrLkJhc2VUZXN0Q2FzZSBpbnN0ZWFkIG9mIHVuaXR0ZXN0LlRlc3RDYXNlCistIENvbmZpZ3VyZSBhbmQgY29tcGlsZSBQeXRob24gd2l0aCAtLXdpdGgtcHlkZWJ1ZworCitJZiBzeXMuZ2V0dG90YWxyZWZjb3VudCgpIGlzIG5vdCBhdmFpbGFibGUgKGJlY2F1c2UgUHl0aG9uIHdhcyBidWlsdCB3aXRob3V0Cit0aGUgUHlfREVCVUcgb3B0aW9uKSwgdGhlbiB0aGlzIG1vZHVsZSBpcyBhIG5vLW9wIGFuZCB0ZXN0cyB3aWxsIHJ1biBub3JtYWxseS4KKyIiIgorCitpbXBvcnQgY29weXJlZworaW1wb3J0IGdjCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBMb2NhbFRlc3RSZXN1bHQodW5pdHRlc3QuVGVzdFJlc3VsdCk6CisgICIiIkEgVGVzdFJlc3VsdCB3aGljaCBmb3J3YXJkcyBldmVudHMgdG8gYSBwYXJlbnQgb2JqZWN0LCBleGNlcHQgZm9yIFNraXBzLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnRfcmVzdWx0KToKKyAgICB1bml0dGVzdC5UZXN0UmVzdWx0Ll9faW5pdF9fKHNlbGYpCisgICAgc2VsZi5wYXJlbnRfcmVzdWx0ID0gcGFyZW50X3Jlc3VsdAorCisgIGRlZiBhZGRFcnJvcihzZWxmLCB0ZXN0LCBlcnJvcik6CisgICAgc2VsZi5wYXJlbnRfcmVzdWx0LmFkZEVycm9yKHRlc3QsIGVycm9yKQorCisgIGRlZiBhZGRGYWlsdXJlKHNlbGYsIHRlc3QsIGVycm9yKToKKyAgICBzZWxmLnBhcmVudF9yZXN1bHQuYWRkRmFpbHVyZSh0ZXN0LCBlcnJvcikKKworICBkZWYgYWRkU2tpcChzZWxmLCB0ZXN0LCByZWFzb24pOgorICAgIHBhc3MKKworCitjbGFzcyBSZWZlcmVuY2VMZWFrQ2hlY2tlck1peGluKG9iamVjdCk6CisgICIiIkEgbWl4aW4gY2xhc3MgZm9yIFRlc3RDYXNlLCB3aGljaCBjaGVja3MgcmVmZXJlbmNlIGNvdW50cy4iIiIKKworICBOQl9SVU5TID0gMworCisgIGRlZiBydW4oc2VsZiwgcmVzdWx0PU5vbmUpOgorICAgIHRlc3RNZXRob2QgPSBnZXRhdHRyKHNlbGYsIHNlbGYuX3Rlc3RNZXRob2ROYW1lKQorICAgIGV4cGVjdGluZ19mYWlsdXJlX21ldGhvZCA9IGdldGF0dHIodGVzdE1ldGhvZCwgIl9fdW5pdHRlc3RfZXhwZWN0aW5nX2ZhaWx1cmVfXyIsIEZhbHNlKQorICAgIGV4cGVjdGluZ19mYWlsdXJlX2NsYXNzID0gZ2V0YXR0cihzZWxmLCAiX191bml0dGVzdF9leHBlY3RpbmdfZmFpbHVyZV9fIiwgRmFsc2UpCisgICAgaWYgZXhwZWN0aW5nX2ZhaWx1cmVfY2xhc3Mgb3IgZXhwZWN0aW5nX2ZhaWx1cmVfbWV0aG9kOgorICAgICAgcmV0dXJuCisKKyAgICAjIHB5dGhvbl9tZXNzYWdlLnB5IHJlZ2lzdGVycyBhbGwgTWVzc2FnZSBjbGFzc2VzIHRvIHNvbWUgcGlja2xlIGdsb2JhbAorICAgICMgcmVnaXN0cnksIHdoaWNoIG1ha2VzIHRoZSBjbGFzc2VzIGltbW9ydGFsLgorICAgICMgV2Ugc2F2ZSBhIGNvcHkgb2YgdGhpcyByZWdpc3RyeSwgYW5kIHJlc2V0IGl0IGJlZm9yZSB3ZSBjb3VsZCByZWZlcmVuY2VzLgorICAgIHNlbGYuX3NhdmVkX3BpY2tsZV9yZWdpc3RyeSA9IGNvcHlyZWcuZGlzcGF0Y2hfdGFibGUuY29weSgpCisKKyAgICAjIFJ1biB0aGUgdGVzdCB0d2ljZSwgdG8gd2FybSB1cCB0aGUgaW5zdGFuY2UgYXR0cmlidXRlcy4KKyAgICBzdXBlcihSZWZlcmVuY2VMZWFrQ2hlY2tlck1peGluLCBzZWxmKS5ydW4ocmVzdWx0PXJlc3VsdCkKKyAgICBzdXBlcihSZWZlcmVuY2VMZWFrQ2hlY2tlck1peGluLCBzZWxmKS5ydW4ocmVzdWx0PXJlc3VsdCkKKworICAgIG9sZHJlZmNvdW50ID0gMAorICAgIGxvY2FsX3Jlc3VsdCA9IExvY2FsVGVzdFJlc3VsdChyZXN1bHQpCisgICAgbnVtX2ZsYWtlcyA9IDAKKworICAgIHJlZmNvdW50X2RlbHRhcyA9IFtdCisgICAgd2hpbGUgbGVuKHJlZmNvdW50X2RlbHRhcykgPCBzZWxmLk5CX1JVTlM6CisgICAgICBvbGRyZWZjb3VudCA9IHNlbGYuX2dldFJlZmNvdW50cygpCisgICAgICBzdXBlcihSZWZlcmVuY2VMZWFrQ2hlY2tlck1peGluLCBzZWxmKS5ydW4ocmVzdWx0PWxvY2FsX3Jlc3VsdCkKKyAgICAgIG5ld3JlZmNvdW50ID0gc2VsZi5fZ2V0UmVmY291bnRzKCkKKyAgICAgICMgSWYgdGhlIEdDIHdhcyBhYmxlIHRvIGNvbGxlY3Qgc29tZSBvYmplY3RzIGFmdGVyIHRoZSBjYWxsIHRvIHJ1bigpIHRoYXQKKyAgICAgICMgaXQgY291bGQgbm90IGNvbGxlY3QgYmVmb3JlIHRoZSBjYWxsLCB0aGVuIHRoZSBjb3VudHMgd29uJ3QgbWF0Y2guCisgICAgICBpZiBuZXdyZWZjb3VudCA8IG9sZHJlZmNvdW50IGFuZCBudW1fZmxha2VzIDwgMjoKKyAgICAgICAgIyBUaGlzIHJlc3VsdCBpcyAocHJvYmFibHkpIGEgZmxha2UgLS0gZ2FyYmFnZSBjb2xsZWN0b3JzIGFyZW4ndCB2ZXJ5CisgICAgICAgICMgcHJlZGljdGFibGUsIGJ1dCBhIGxvd2VyIGVuZGluZyByZWZjb3VudCBpcyB0aGUgb3Bwb3NpdGUgb2YgdGhlCisgICAgICAgICMgZmFpbHVyZSB3ZSBhcmUgdGVzdGluZyBmb3IuIElmIHRoZSByZXN1bHQgaXMgcmVwZWF0YWJsZSwgdGhlbiB3ZSB3aWxsCisgICAgICAgICMgZXZlbnR1YWxseSByZXBvcnQgaXQsIGJ1dCBub3QgYWZ0ZXIgdHJ5aW5nIHRvIGVsaW1pbmF0ZSBpdC4KKyAgICAgICAgbnVtX2ZsYWtlcyArPSAxCisgICAgICAgIGNvbnRpbnVlCisgICAgICBudW1fZmxha2VzID0gMAorICAgICAgcmVmY291bnRfZGVsdGFzLmFwcGVuZChuZXdyZWZjb3VudCAtIG9sZHJlZmNvdW50KQorICAgIHByaW50KHJlZmNvdW50X2RlbHRhcywgc2VsZikKKworICAgIHRyeToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmY291bnRfZGVsdGFzLCBbMF0gKiBzZWxmLk5CX1JVTlMpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjogICMgcHlsaW50OiBkaXNhYmxlPWJyb2FkLWV4Y2VwdAorICAgICAgcmVzdWx0LmFkZEVycm9yKHNlbGYsIHN5cy5leGNfaW5mbygpKQorCisgIGRlZiBfZ2V0UmVmY291bnRzKHNlbGYpOgorICAgIGNvcHlyZWcuZGlzcGF0Y2hfdGFibGUuY2xlYXIoKQorICAgIGNvcHlyZWcuZGlzcGF0Y2hfdGFibGUudXBkYXRlKHNlbGYuX3NhdmVkX3BpY2tsZV9yZWdpc3RyeSkKKyAgICAjIEl0IGlzIHNvbWV0aW1lcyBuZWNlc3NhcnkgdG8gZ2MuY29sbGVjdCgpIG11bHRpcGxlIHRpbWVzLCB0byBlbnN1cmUKKyAgICAjIHRoYXQgYWxsIG9iamVjdHMgY2FuIGJlIGNvbGxlY3RlZC4KKyAgICBnYy5jb2xsZWN0KCkKKyAgICBnYy5jb2xsZWN0KCkKKyAgICBnYy5jb2xsZWN0KCkKKyAgICByZXR1cm4gc3lzLmdldHRvdGFscmVmY291bnQoKQorCisKK2lmIGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpOgorCisgIGRlZiBUZXN0Q2FzZSh0ZXN0X2NsYXNzKToKKyAgICBuZXdfYmFzZXMgPSAoUmVmZXJlbmNlTGVha0NoZWNrZXJNaXhpbiwpICsgdGVzdF9jbGFzcy5fX2Jhc2VzX18KKyAgICBuZXdfY2xhc3MgPSB0eXBlKHRlc3RfY2xhc3MpKAorICAgICAgICB0ZXN0X2NsYXNzLl9fbmFtZV9fLCBuZXdfYmFzZXMsIGRpY3QodGVzdF9jbGFzcy5fX2RpY3RfXykpCisgICAgcmV0dXJuIG5ld19jbGFzcworICBTa2lwUmVmZXJlbmNlTGVha0NoZWNrZXIgPSB1bml0dGVzdC5za2lwCisKK2Vsc2U6CisgICMgV2hlbiBQeURFQlVHIGlzIG5vdCBlbmFibGVkLCBydW4gdGhlIHRlc3RzIG5vcm1hbGx5LgorCisgIGRlZiBUZXN0Q2FzZSh0ZXN0X2NsYXNzKToKKyAgICByZXR1cm4gdGVzdF9jbGFzcworCisgIGRlZiBTa2lwUmVmZXJlbmNlTGVha0NoZWNrZXIocmVhc29uKToKKyAgICBkZWwgcmVhc29uICAjIERvbid0IHNraXAsIHNvIGRvbid0IG5lZWQgYSByZWFzb24uCisgICAgZGVmIFNhbWUoZnVuYyk6CisgICAgICByZXR1cm4gZnVuYworICAgIHJldHVybiBTYW1lCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3RleHRfZW5jb2RpbmdfdGVzdC5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGV4dF9lbmNvZGluZ190ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNmEyY2MKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3RleHRfZW5jb2RpbmdfdGVzdC5weQpAQCAtMCwwICsxLDY3IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIGZvciBnb29nbGUucHJvdG9idWYudGV4dF9lbmNvZGluZy4iIiIKKworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0ZXh0X2VuY29kaW5nCisKK1RFU1RfVkFMVUVTID0gWworICAgICgiZm9vXFxyYmFyXFxuYmF6XFx0IiwKKyAgICAgImZvb1xccmJhclxcbmJhelxcdCIsCisgICAgIGIiZm9vXHJiYXJcbmJhelx0IiksCisgICAgKCJcXCdmdWxsIG9mIFxcXCJzb3VuZFxcXCIgYW5kIFxcXCJmdXJ5XFxcIlxcJyIsCisgICAgICJcXCdmdWxsIG9mIFxcXCJzb3VuZFxcXCIgYW5kIFxcXCJmdXJ5XFxcIlxcJyIsCisgICAgIGIiJ2Z1bGwgb2YgXCJzb3VuZFwiIGFuZCBcImZ1cnlcIiciKSwKKyAgICAoInNpZ25pXFxcXGZ5aW5nXFxcXCBub3RoaW5nXFxcXCIsCisgICAgICJzaWduaVxcXFxmeWluZ1xcXFwgbm90aGluZ1xcXFwiLAorICAgICBiInNpZ25pXFxmeWluZ1xcIG5vdGhpbmdcXCIpLAorICAgICgiXFwwMTBcXHRcXG5cXDAxM1xcMDE0XFxyIiwKKyAgICAgIlx4MDhcXHRcXG5ceDBiXHgwY1xcciIsCisgICAgIGIiXDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1IildCisKKworY2xhc3MgVGV4dEVuY29kaW5nVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICBkZWYgdGVzdENFc2NhcGUoc2VsZik6CisgICAgZm9yIGVzY2FwZWQsIGVzY2FwZWRfdXRmOCwgdW5lc2NhcGVkIGluIFRFU1RfVkFMVUVTOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChlc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9lbmNvZGluZy5DRXNjYXBlKHVuZXNjYXBlZCwgYXNfdXRmOD1GYWxzZSkpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKGVzY2FwZWRfdXRmOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfZW5jb2RpbmcuQ0VzY2FwZSh1bmVzY2FwZWQsIGFzX3V0Zjg9VHJ1ZSkpCisKKyAgZGVmIHRlc3RDVW5lc2NhcGUoc2VsZik6CisgICAgZm9yIGVzY2FwZWQsIGVzY2FwZWRfdXRmOCwgdW5lc2NhcGVkIGluIFRFU1RfVkFMVUVTOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmVzY2FwZWQsIHRleHRfZW5jb2RpbmcuQ1VuZXNjYXBlKGVzY2FwZWQpKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmVzY2FwZWQsIHRleHRfZW5jb2RpbmcuQ1VuZXNjYXBlKGVzY2FwZWRfdXRmOCkpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3RleHRfZm9ybWF0X3Rlc3QucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3RleHRfZm9ybWF0X3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiNzg0ZQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGV4dF9mb3JtYXRfdGVzdC5weQpAQCAtMCwwICsxLDI0NDcgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3QgZm9yIGdvb2dsZS5wcm90b2J1Zi50ZXh0X2Zvcm1hdC4iIiIKKworaW1wb3J0IGlvCitpbXBvcnQgbWF0aAoraW1wb3J0IHJlCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgdGV4dHdyYXAKKworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBhbnlfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc3RydWN0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGFueV90ZXN0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1hcF91bml0dGVzdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9tc2V0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3Byb3RvM19hcmVuYV9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGFueV90ZXN0X3BiMiBhcyB0ZXN0X2V4dGVuZF9hbnkKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBhcGlfaW1wbGVtZW50YXRpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RfcHJvdG8zX29wdGlvbmFsX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RfdXRpbAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHRleHRfZm9ybWF0Citmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgX3BhcmFtZXRlcml6ZWQKKyMgcHlsaW50OiBlbmFibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAorCisKKyMgTG93LWxldmVsIG51dHMtbi1ib2x0cyB0ZXN0cy4KK2NsYXNzIFNpbXBsZVRleHRGb3JtYXRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgIyBUaGUgbWVtYmVycyBvZiBfUVVPVEVTIGFyZSBmb3JtYXR0ZWQgaW50byBhIHJlZ2V4cCB0ZW1wbGF0ZSB0aGF0CisgICMgZXhwZWN0cyBzaW5nbGUgY2hhcmFjdGVycy4gIFRoZXJlZm9yZSBpdCdzIGFuIGVycm9yIChpbiBhZGRpdGlvbiB0byBiZWluZworICAjIG5vbi1zZW5zaWNhbCBpbiB0aGUgZmlyc3QgcGxhY2UpIHRvIHRyeSB0byBzcGVjaWZ5IGEgInF1b3RlIG1hcmsiIHRoYXQgaXMKKyAgIyBtb3JlIHRoYW4gb25lIGNoYXJhY3Rlci4KKyAgZGVmIHRlc3RRdW90ZU1hcmtzQXJlU2luZ2xlQ2hhcnMoc2VsZik6CisgICAgZm9yIHF1b3RlIGluIHRleHRfZm9ybWF0Ll9RVU9URVM6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihxdW90ZSkpCisKKworIyBCYXNlIGNsYXNzIHdpdGggc29tZSBjb21tb24gZnVuY3Rpb25hbGl0eS4KK2NsYXNzIFRleHRGb3JtYXRCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgUmVhZEdvbGRlbihzZWxmLCBnb2xkZW5fZmlsZW5hbWUpOgorICAgIHdpdGggdGVzdF91dGlsLkdvbGRlbkZpbGUoZ29sZGVuX2ZpbGVuYW1lKSBhcyBmOgorICAgICAgcmV0dXJuIChmLnJlYWRsaW5lcygpIGlmIHN0ciBpcyBieXRlcyBlbHNlICAjIFBZMworICAgICAgICAgICAgICBbZ29sZGVuX2xpbmUuZGVjb2RlKCd1dGYtOCcpIGZvciBnb2xkZW5fbGluZSBpbiBmXSkKKworICBkZWYgQ29tcGFyZVRvR29sZGVuRmlsZShzZWxmLCB0ZXh0LCBnb2xkZW5fZmlsZW5hbWUpOgorICAgIGdvbGRlbl9saW5lcyA9IHNlbGYuUmVhZEdvbGRlbihnb2xkZW5fZmlsZW5hbWUpCisgICAgc2VsZi5hc3NlcnRNdWx0aUxpbmVFcXVhbCh0ZXh0LCAnJy5qb2luKGdvbGRlbl9saW5lcykpCisKKyAgZGVmIENvbXBhcmVUb0dvbGRlblRleHQoc2VsZiwgdGV4dCwgZ29sZGVuX3RleHQpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dCwgZ29sZGVuX3RleHQpCisKKyAgZGVmIFJlbW92ZVJlZHVuZGFudFplcm9zKHNlbGYsIHRleHQpOgorICAgICMgU29tZSBwbGF0Zm9ybXMgcHJpbnQgMWUrNSBhcyAxZSswMDUuICBUaGlzIGlzIGZpbmUsIGJ1dCB3ZSBuZWVkIHRvIHJlbW92ZQorICAgICMgdGhlc2UgemVyb3MgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIGdvbGRlbiBmaWxlLgorICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoJ2UrMCcsJ2UrJykucmVwbGFjZSgnZSswJywnZSsnKSBcCisgICAgICAgICAgICAgICAucmVwbGFjZSgnZS0wJywnZS0nKS5yZXBsYWNlKCdlLTAnLCdlLScpCisgICAgIyBGbG9hdGluZyBwb2ludCBmaWVsZHMgYXJlIHByaW50ZWQgd2l0aCAuMCBzdWZmaXggZXZlbiBpZiB0aGV5IGFyZQorICAgICMgYWN0dWFsbHkgaW50ZWdlciBudW1iZXJzLgorICAgIHRleHQgPSByZS5jb21waWxlKHInXC4wJCcsIHJlLk1VTFRJTElORSkuc3ViKCcnLCB0ZXh0KQorICAgIHJldHVybiB0ZXh0CisKKworQF9wYXJhbWV0ZXJpemVkLnBhcmFtZXRlcnModW5pdHRlc3RfcGIyLCB1bml0dGVzdF9wcm90bzNfYXJlbmFfcGIyKQorY2xhc3MgVGV4dEZvcm1hdE1lc3NhZ2VUb1N0cmluZ1Rlc3RzKFRleHRGb3JtYXRCYXNlKToKKworICBkZWYgdGVzdFByaW50RXhvdGljKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDY0LmFwcGVuZCgtOTIyMzM3MjAzNjg1NDc3NTgwOCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NC5hcHBlbmQoMTg0NDY3NDQwNzM3MDk1NTE2MTUpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEyMy40NTYpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjNlMjIpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjNlLTE4KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnXDAwMFwwMDFcYVxiXGZcblxyXHRcdlxcXCciJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQodSdcdTAwZmNcdWE3MWYnKQorICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgICAgc2VsZi5SZW1vdmVSZWR1bmRhbnRaZXJvcyh0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSkpLAorICAgICAgICAncmVwZWF0ZWRfaW50NjQ6IC05MjIzMzcyMDM2ODU0Nzc1ODA4XG4nCisgICAgICAgICdyZXBlYXRlZF91aW50NjQ6IDE4NDQ2NzQ0MDczNzA5NTUxNjE1XG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEyMy40NTZcbicKKyAgICAgICAgJ3JlcGVhdGVkX2RvdWJsZTogMS4yM2UrMjJcbicKKyAgICAgICAgJ3JlcGVhdGVkX2RvdWJsZTogMS4yM2UtMThcbicKKyAgICAgICAgJ3JlcGVhdGVkX3N0cmluZzonCisgICAgICAgICcgIlxcMDAwXFwwMDFcXDAwN1xcMDEwXFwwMTRcXG5cXHJcXHRcXDAxM1xcXFxcXFwnXFwiIlxuJworICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiXFwzMDNcXDI3NFxcMzUyXFwyMzRcXDIzNyJcbicpCisKKyAgZGVmIHRlc3RQcmludEZsb2F0UHJlY2lzaW9uKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKworICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKDAuMCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LmFwcGVuZCgwLjgpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMS4wKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKDEuMikKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LmFwcGVuZCgxLjIzKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKDEuMjM0KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKDEuMjM0NSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LmFwcGVuZCgxLjIzNDU2KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKDEuMmUxMCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LmFwcGVuZCgxLjIzZTEwKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKDEuMjM0ZTEwKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKDEuMjM0NWUxMCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LmFwcGVuZCgxLjIzNDU2ZTEwKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKGZsb2F0KCdOYU4nKSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LmFwcGVuZChmbG9hdCgnaW5mJykpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDAuMCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMC44KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjApCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMikKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjM0NSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1NikKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1NjcpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjM0NTY3OCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1Njc4OSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1Njc4OTgpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjM0NTY3ODk4NykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1Njc4OTg3NikKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1Njc4OTg3NjUpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjM0NTY3ODk4NzY1NCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1Njc4OTg3NjU0MykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yZTEwMCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yM2UxMDApCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjM0ZTEwMCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1ZTEwMCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1NmUxMDApCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjM0NTY3ZTEwMCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1Njc4ZTEwMCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1Njc4OWUxMDApCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjM0NTY3ODk4ZTEwMCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1Njc4OTg3ZTEwMCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1Njc4OTg3NmUxMDApCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjM0NTY3ODk4NzY1ZTEwMCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1Njc4OTg3NjU0ZTEwMCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yMzQ1Njc4OTg3NjU0M2UxMDApCisgICAgIyBweWxpbnQ6IGRpc2FibGU9Zy1sb25nLXRlcm5hcnkKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICAgIHNlbGYuUmVtb3ZlUmVkdW5kYW50WmVyb3ModGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpKSwKKyAgICAgICAgJ3JlcGVhdGVkX2Zsb2F0OiAwXG4nCisgICAgICAgICdyZXBlYXRlZF9mbG9hdDogMC44XG4nCisgICAgICAgICdyZXBlYXRlZF9mbG9hdDogMVxuJworICAgICAgICAncmVwZWF0ZWRfZmxvYXQ6IDEuMlxuJworICAgICAgICAncmVwZWF0ZWRfZmxvYXQ6IDEuMjNcbicKKyAgICAgICAgJ3JlcGVhdGVkX2Zsb2F0OiAxLjIzNFxuJworICAgICAgICAncmVwZWF0ZWRfZmxvYXQ6IDEuMjM0NVxuJworICAgICAgICAncmVwZWF0ZWRfZmxvYXQ6IDEuMjM0NTZcbicKKyAgICAgICAgIyBOb3RlIHRoYXQgdGhlc2UgZG9uJ3QgdXNlIHNjaWVudGlmaWMgbm90YXRpb24uCisgICAgICAgICdyZXBlYXRlZF9mbG9hdDogMTIwMDAwMDAwMDBcbicKKyAgICAgICAgJ3JlcGVhdGVkX2Zsb2F0OiAxMjMwMDAwMDAwMFxuJworICAgICAgICAncmVwZWF0ZWRfZmxvYXQ6IDEyMzQwMDAwMDAwXG4nCisgICAgICAgICdyZXBlYXRlZF9mbG9hdDogMTIzNDUwMDAwMDBcbicKKyAgICAgICAgJ3JlcGVhdGVkX2Zsb2F0OiAxMjM0NTYwMDAwMFxuJworICAgICAgICAncmVwZWF0ZWRfZmxvYXQ6IG5hblxuJworICAgICAgICAncmVwZWF0ZWRfZmxvYXQ6IGluZlxuJworICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAwXG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDAuOFxuJworICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxXG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMlxuJworICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxLjIzXG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0XG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NVxuJworICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2XG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3XG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3OFxuJworICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5XG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4XG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4N1xuJworICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5ODc2XG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4NzY1XG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4NzY1NFxuJworICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5ODc2NTQzXG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMmUrMTAwXG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjNlKzEwMFxuJworICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxLjIzNGUrMTAwXG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NWUrMTAwXG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTZlKzEwMFxuJworICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2N2UrMTAwXG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3OGUrMTAwXG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODllKzEwMFxuJworICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5OGUrMTAwXG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4N2UrMTAwXG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4NzZlKzEwMFxuJworICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxLjIzNDU2Nzg5ODc2NWUrMTAwXG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4NzY1NGUrMTAwXG4nCisgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4NzY1NDNlKzEwMFxuJykKKworICBkZWYgdGVzdFByaW50RXhvdGljVW5pY29kZVN1YmNsYXNzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKworICAgIGNsYXNzIFVuaWNvZGVTdWIoc3RyKToKKyAgICAgIHBhc3MKKworICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZChVbmljb2RlU3ViKHUnXHUwMGZjXHVhNzFmJykpCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSksCisgICAgICAgICdyZXBlYXRlZF9zdHJpbmc6ICJcXDMwM1xcMjc0XFwzNTJcXDIzNFxcMjM3IlxuJykKKworICBkZWYgdGVzdFByaW50TmVzdGVkTWVzc2FnZUFzT25lTGluZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgbXNnID0gbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIG1zZy5iYiA9IDQyCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfb25lX2xpbmU9VHJ1ZSksCisgICAgICAgICdyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7IGJiOiA0MiB9JykKKworICBkZWYgdGVzdFByaW50UmVwZWF0ZWRGaWVsZHNBc09uZUxpbmUoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgzKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnR29vZ2xlJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ1p1cmljaCcpCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfb25lX2xpbmU9VHJ1ZSksCisgICAgICAgICdyZXBlYXRlZF9pbnQzMjogMSByZXBlYXRlZF9pbnQzMjogMSByZXBlYXRlZF9pbnQzMjogMyAnCisgICAgICAgICdyZXBlYXRlZF9zdHJpbmc6ICJHb29nbGUiIHJlcGVhdGVkX3N0cmluZzogIlp1cmljaCInKQorCisgIGRlZiBWZXJpZnlQcmludFNob3J0Rm9ybWF0UmVwZWF0ZWRGaWVsZHMoc2VsZiwgbWVzc2FnZV9tb2R1bGUsIGFzX29uZV9saW5lKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnR29vZ2xlJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ0hlbGxvLFdvcmxkJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bS5hcHBlbmQodW5pdHRlc3RfcGIyLkZPUkVJR05fRk9PKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtLmFwcGVuZCh1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVIpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0uYXBwZW5kKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWikKKyAgICBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMworICAgIGZvciBpIGluICgyMSwgMzIpOgorICAgICAgbXNnID0gbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgICAgbXNnLmJiID0gaQorICAgIGV4cGVjdGVkX2FzY2lpID0gKAorICAgICAgICAnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Uge1xuICBiYjogM1xufVxuJworICAgICAgICAncmVwZWF0ZWRfaW50MzI6IFsxXVxuJworICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiR29vZ2xlIlxuJworICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiSGVsbG8sV29ybGQiXG4nCisgICAgICAgICdyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7XG4gIGJiOiAyMVxufVxuJworICAgICAgICAncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Uge1xuICBiYjogMzJcbn1cbicKKyAgICAgICAgJ3JlcGVhdGVkX2ZvcmVpZ25fZW51bTogW0ZPUkVJR05fRk9PLCBGT1JFSUdOX0JBUiwgRk9SRUlHTl9CQVpdXG4nKQorICAgIGlmIGFzX29uZV9saW5lOgorICAgICAgZXhwZWN0ZWRfYXNjaWkgPSBleHBlY3RlZF9hc2NpaS5yZXBsYWNlKCdcbicsICcgJykKKyAgICAgIGV4cGVjdGVkX2FzY2lpID0gcmUuc3ViKHInXHMrJywgJyAnLCBleHBlY3RlZF9hc2NpaSkKKyAgICAgIGV4cGVjdGVkX2FzY2lpID0gcmUuc3ViKHInXHMkJywgJycsIGV4cGVjdGVkX2FzY2lpKQorCisgICAgYWN0dWFsX2FzY2lpID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKAorICAgICAgICBtZXNzYWdlLCB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlcz1UcnVlLAorICAgICAgICBhc19vbmVfbGluZT1hc19vbmVfbGluZSkKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoYWN0dWFsX2FzY2lpLCBleHBlY3RlZF9hc2NpaSkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dF9mb3JtYXQuUGFyc2UoYWN0dWFsX2FzY2lpLCBwYXJzZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZF9tZXNzYWdlLCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0UHJpbnRTaG9ydEZvcm1hdFJlcGVhdGVkRmllbGRzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBzZWxmLlZlcmlmeVByaW50U2hvcnRGb3JtYXRSZXBlYXRlZEZpZWxkcyhtZXNzYWdlX21vZHVsZSwgRmFsc2UpCisgICAgc2VsZi5WZXJpZnlQcmludFNob3J0Rm9ybWF0UmVwZWF0ZWRGaWVsZHMobWVzc2FnZV9tb2R1bGUsIFRydWUpCisKKyAgZGVmIHRlc3RQcmludE5lc3RlZE5ld0xpbmVJblN0cmluZ0FzT25lTGluZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcgPSAnYVxubmV3XG5saW5lJworICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsIGFzX29uZV9saW5lPVRydWUpLAorICAgICAgICAnb3B0aW9uYWxfc3RyaW5nOiAiYVxcbm5ld1xcbmxpbmUiJykKKworICBkZWYgdGVzdFByaW50RXhvdGljQXNPbmVMaW5lKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDY0LmFwcGVuZCgtOTIyMzM3MjAzNjg1NDc3NTgwOCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NC5hcHBlbmQoMTg0NDY3NDQwNzM3MDk1NTE2MTUpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEyMy40NTYpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjNlMjIpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjNlLTE4KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnXDAwMFwwMDFcYVxiXGZcblxyXHRcdlxcXCciJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQodSdcdTAwZmNcdWE3MWYnKQorICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgICAgc2VsZi5SZW1vdmVSZWR1bmRhbnRaZXJvcyh0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoCisgICAgICAgICAgICBtZXNzYWdlLCBhc19vbmVfbGluZT1UcnVlKSksCisgICAgICAgICdyZXBlYXRlZF9pbnQ2NDogLTkyMjMzNzIwMzY4NTQ3NzU4MDgnCisgICAgICAgICcgcmVwZWF0ZWRfdWludDY0OiAxODQ0Njc0NDA3MzcwOTU1MTYxNScKKyAgICAgICAgJyByZXBlYXRlZF9kb3VibGU6IDEyMy40NTYnCisgICAgICAgICcgcmVwZWF0ZWRfZG91YmxlOiAxLjIzZSsyMicKKyAgICAgICAgJyByZXBlYXRlZF9kb3VibGU6IDEuMjNlLTE4JworICAgICAgICAnIHJlcGVhdGVkX3N0cmluZzogJworICAgICAgICAnIlxcMDAwXFwwMDFcXDAwN1xcMDEwXFwwMTRcXG5cXHJcXHRcXDAxM1xcXFxcXFwnXFwiIicKKyAgICAgICAgJyByZXBlYXRlZF9zdHJpbmc6ICJcXDMwM1xcMjc0XFwzNTJcXDIzNFxcMjM3IicpCisKKyAgZGVmIHRlc3RSb3VuZFRyaXBFeG90aWNBc09uZUxpbmUoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQuYXBwZW5kKC05MjIzMzcyMDM2ODU0Nzc1ODA4KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0LmFwcGVuZCgxODQ0Njc0NDA3MzcwOTU1MTYxNSkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMTIzLjQ1NikKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yM2UyMikKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yM2UtMTgpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdcMDAwXDAwMVxhXGJcZlxuXHJcdFx2XFxcJyInKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCh1J1x1MDBmY1x1YTcxZicpCisKKyAgICAjIFRlc3QgYXNfdXRmOCA9IEZhbHNlLgorICAgIHdpcmVfdGV4dCA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc19vbmVfbGluZT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc191dGY4PUZhbHNlKQorICAgIHBhcnNlZF9tZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICByID0gdGV4dF9mb3JtYXQuUGFyc2Uod2lyZV90ZXh0LCBwYXJzZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydElzKHIsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisKKyAgICAjIFRlc3QgYXNfdXRmOCA9IFRydWUuCisgICAgd2lyZV90ZXh0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzX29uZV9saW5lPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzX3V0Zjg9VHJ1ZSkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgciA9IHRleHRfZm9ybWF0LlBhcnNlKHdpcmVfdGV4dCwgcGFyc2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRJcyhyLCBwYXJzZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgJ1xuJXMgIT0gJXMnICUgKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKSkKKworICBkZWYgdGVzdFByaW50UmF3VXRmOFN0cmluZyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKHUnXHUwMGZjXHRcdWE3MWYnKQorICAgIHRleHQgPSB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfdXRmOD1UcnVlKQorICAgIGdvbGRlbl91bmljb2RlID0gdSdyZXBlYXRlZF9zdHJpbmc6ICJcdTAwZmNcXHRcdWE3MWYiXG4nCisgICAgZ29sZGVuX3RleHQgPSBnb2xkZW5fdW5pY29kZQorICAgICMgTWVzc2FnZVRvU3RyaW5nIGFsd2F5cyByZXR1cm5zIGEgbmF0aXZlIHN0ci4KKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQodGV4dCwgZ29sZGVuX3RleHQpCisgICAgcGFyc2VkX21lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHQsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlLCAnXG4lcyAhPSAlcyAgKCVzICE9ICVzKScgJQorICAgICAgICAobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzBdLAorICAgICAgICAgcGFyc2VkX21lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzBdKSkKKworICBkZWYgdGVzdFByaW50RmxvYXRGb3JtYXQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgICMgQ2hlY2sgdGhhdCBmbG9hdF9mb3JtYXQgYXJndW1lbnQgaXMgcGFzc2VkIHRvIHN1Yi1tZXNzYWdlIGZvcm1hdHRpbmcuCisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLk5lc3RlZFRlc3RBbGxUeXBlcygpCisgICAgbWVzc2FnZS5wYXlsb2FkLm9wdGlvbmFsX2Zsb2F0ID0gMS4yNQorICAgICMgQ2hlY2sgcm91bmRpbmcgYXQgMTUgc2lnbmlmaWNhbnQgZGlnaXRzCisgICAgbWVzc2FnZS5wYXlsb2FkLm9wdGlvbmFsX2RvdWJsZSA9IC0uMDAwMDAzNDU2Nzg5MDEyMzQ1Njc4CisgICAgIyBDaGVjayBubyBkZWNpbWFsIHBvaW50LgorICAgIG1lc3NhZ2UucGF5bG9hZC5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoLTU2NDIpCisgICAgIyBDaGVjayBubyB0cmFpbGluZyB6ZXJvcy4KKyAgICBtZXNzYWdlLnBheWxvYWQucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCguMDAwMDc4OTAwKQorICAgIGZvcm1hdHRlZF9maWVsZHMgPSBbJ29wdGlvbmFsX2Zsb2F0OiAxLjI1JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdvcHRpb25hbF9kb3VibGU6IC0zLjQ1Njc4OTAxMjM0NTY4ZS02JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdyZXBlYXRlZF9mbG9hdDogLTU2NDInLCAncmVwZWF0ZWRfZG91YmxlOiA3Ljg5ZS01J10KKyAgICB0ZXh0X21lc3NhZ2UgPSB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgZmxvYXRfZm9ybWF0PScuMTVnJykKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICAgIHNlbGYuUmVtb3ZlUmVkdW5kYW50WmVyb3ModGV4dF9tZXNzYWdlKSwKKyAgICAgICAgJ3BheWxvYWQge3tcbiAgezB9XG4gIHsxfVxuICB7Mn1cbiAgezN9XG59fVxuJy5mb3JtYXQoCisgICAgICAgICAgICAqZm9ybWF0dGVkX2ZpZWxkcykpCisgICAgIyBhc19vbmVfbGluZT1UcnVlIGlzIGEgc2VwYXJhdGUgY29kZSBicmFuY2ggd2hlcmUgZmxvYXRfZm9ybWF0IGlzIHBhc3NlZC4KKyAgICB0ZXh0X21lc3NhZ2UgPSB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNfb25lX2xpbmU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRfZm9ybWF0PScuMTVnJykKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICAgIHNlbGYuUmVtb3ZlUmVkdW5kYW50WmVyb3ModGV4dF9tZXNzYWdlKSwKKyAgICAgICAgJ3BheWxvYWQge3sgezB9IHsxfSB7Mn0gezN9IH19Jy5mb3JtYXQoKmZvcm1hdHRlZF9maWVsZHMpKQorCisgICAgIyAzMi1iaXQgMS4yIGlzIG5vaXN5IHdoZW4gZXh0ZW5kZWQgdG8gNjQtYml0OgorICAgICMgID4+PiBzdHJ1Y3QudW5wYWNrKCdmJywgc3RydWN0LnBhY2soJ2YnLCAxLjIpKVswXQorICAgICMgIDEuMjAwMDAwMDQ3NjgzNzE1OAorICAgIG1lc3NhZ2UucGF5bG9hZC5vcHRpb25hbF9mbG9hdCA9IDEuMgorICAgIGZvcm1hdHRlZF9maWVsZHMgPSBbJ29wdGlvbmFsX2Zsb2F0OiAxLjInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ29wdGlvbmFsX2RvdWJsZTogLTMuNDU2Nzg5MDEyMzQ1NjhlLTYnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcGVhdGVkX2Zsb2F0OiAtNTY0MicsICdyZXBlYXRlZF9kb3VibGU6IDcuODllLTUnXQorICAgIHRleHRfbWVzc2FnZSA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCBmbG9hdF9mb3JtYXQ9Jy43ZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZV9mb3JtYXQ9Jy4xNWcnKQorICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgICAgc2VsZi5SZW1vdmVSZWR1bmRhbnRaZXJvcyh0ZXh0X21lc3NhZ2UpLAorICAgICAgICAncGF5bG9hZCB7e1xuICB7MH1cbiAgezF9XG4gIHsyfVxuICB7M31cbn19XG4nLmZvcm1hdCgKKyAgICAgICAgICAgICpmb3JtYXR0ZWRfZmllbGRzKSkKKworICAgICMgVGVzdCBvbmx5IHNldCBmbG9hdF9mb3JtYXQgYWZmZWN0IGJvdGggZmxvYXQgYW5kIGRvdWJsZSBmaWVsZHMuCisgICAgZm9ybWF0dGVkX2ZpZWxkcyA9IFsnb3B0aW9uYWxfZmxvYXQ6IDEuMicsCisgICAgICAgICAgICAgICAgICAgICAgICAnb3B0aW9uYWxfZG91YmxlOiAtMy40NTY3ODllLTYnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcGVhdGVkX2Zsb2F0OiAtNTY0MicsICdyZXBlYXRlZF9kb3VibGU6IDcuODllLTUnXQorICAgIHRleHRfbWVzc2FnZSA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCBmbG9hdF9mb3JtYXQ9Jy43ZycpCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAorICAgICAgICBzZWxmLlJlbW92ZVJlZHVuZGFudFplcm9zKHRleHRfbWVzc2FnZSksCisgICAgICAgICdwYXlsb2FkIHt7XG4gIHswfVxuICB7MX1cbiAgezJ9XG4gIHszfVxufX1cbicuZm9ybWF0KAorICAgICAgICAgICAgKmZvcm1hdHRlZF9maWVsZHMpKQorCisgICAgIyBUZXN0IGRlZmF1bHQgZmxvYXRfZm9ybWF0IHdpbGwgYXV0b21hdGljIHByaW50IHNob3J0ZXN0IGZsb2F0LgorICAgIG1lc3NhZ2UucGF5bG9hZC5vcHRpb25hbF9mbG9hdCA9IDEuMjM0NTY3ODkxMgorICAgIG1lc3NhZ2UucGF5bG9hZC5vcHRpb25hbF9kb3VibGUgPSAxLjIzNDU2Nzg5MTIKKyAgICBmb3JtYXR0ZWRfZmllbGRzID0gWydvcHRpb25hbF9mbG9hdDogMS4yMzQ1Njc5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdvcHRpb25hbF9kb3VibGU6IDEuMjM0NTY3ODkxMicsCisgICAgICAgICAgICAgICAgICAgICAgICAncmVwZWF0ZWRfZmxvYXQ6IC01NjQyJywgJ3JlcGVhdGVkX2RvdWJsZTogNy44OWUtNSddCisgICAgdGV4dF9tZXNzYWdlID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAorICAgICAgICBzZWxmLlJlbW92ZVJlZHVuZGFudFplcm9zKHRleHRfbWVzc2FnZSksCisgICAgICAgICdwYXlsb2FkIHt7XG4gIHswfVxuICB7MX1cbiAgezJ9XG4gIHszfVxufX1cbicuZm9ybWF0KAorICAgICAgICAgICAgKmZvcm1hdHRlZF9maWVsZHMpKQorCisgICAgbWVzc2FnZS5DbGVhcigpCisgICAgbWVzc2FnZS5wYXlsb2FkLm9wdGlvbmFsX2Zsb2F0ID0gMS4xMDAwMDAwMDAwMDExCisgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAncGF5bG9hZCB7XG4gIG9wdGlvbmFsX2Zsb2F0OiAxLjFcbn1cbicpCisgICAgbWVzc2FnZS5wYXlsb2FkLm9wdGlvbmFsX2Zsb2F0ID0gMS4wMDAwMDA3NWUtMzYKKyAgICBzZWxmLmFzc2VydEVxdWFsKHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICdwYXlsb2FkIHtcbiAgb3B0aW9uYWxfZmxvYXQ6IDEuMDAwMDAwNzVlLTM2XG59XG4nKQorICAgIG1lc3NhZ2UucGF5bG9hZC5vcHRpb25hbF9mbG9hdCA9IDEyMzQ1Njc4OTEyMzQ1ZSsxMQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgJ3BheWxvYWQge1xuICBvcHRpb25hbF9mbG9hdDogMS4yMzQ1NjhlKzI0XG59XG4nKQorCisgIGRlZiB0ZXN0TWVzc2FnZVRvU3RyaW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuRm9yZWlnbk1lc3NhZ2UoKQorICAgIG1lc3NhZ2UuYyA9IDEyMworICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2M6IDEyM1xuJywgc3RyKG1lc3NhZ2UpKQorCisgIGRlZiB0ZXN0TWVzc2FnZVRvU3RyaW5nVW5pY29kZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgZ29sZGVuX3VuaWNvZGUgPSB1J8OBIHNob3J0IGRlc8OncmlwdGlvbiBhbmQgYSDwn42MLicKKyAgICBnb2xkZW5fYnl0ZXMgPSBnb2xkZW5fdW5pY29kZS5lbmNvZGUoJ3V0Zi04JykKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyA9IGdvbGRlbl91bmljb2RlCisgICAgbWVzc2FnZS5vcHRpb25hbF9ieXRlcyA9IGdvbGRlbl9ieXRlcworICAgIHRleHQgPSB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfdXRmOD1UcnVlKQorICAgIGdvbGRlbl9tZXNzYWdlID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAnb3B0aW9uYWxfc3RyaW5nOiAiw4Egc2hvcnQgZGVzw6dyaXB0aW9uIGFuZCBhIPCfjYwuIlxuJworICAgICAgICAnb3B0aW9uYWxfYnl0ZXM6ICcKKyAgICAgICAgciciXDMwM1wyMDEgc2hvcnQgZGVzXDMwM1wyNDdyaXB0aW9uIGFuZCBhIFwzNjBcMjM3XDIxNVwyMTQuIicKKyAgICAgICAgJ1xuJykKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQodGV4dCwgZ29sZGVuX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RNZXNzYWdlVG9TdHJpbmdBU0NJSShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgZ29sZGVuX3VuaWNvZGUgPSB1J8OBIHNob3J0IGRlc8OncmlwdGlvbiBhbmQgYSDwn42MLicKKyAgICBnb2xkZW5fYnl0ZXMgPSBnb2xkZW5fdW5pY29kZS5lbmNvZGUoJ3V0Zi04JykKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyA9IGdvbGRlbl91bmljb2RlCisgICAgbWVzc2FnZS5vcHRpb25hbF9ieXRlcyA9IGdvbGRlbl9ieXRlcworICAgIHRleHQgPSB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfdXRmOD1GYWxzZSkgICMgQVNDSUkKKyAgICBnb2xkZW5fbWVzc2FnZSA9ICgKKyAgICAgICAgJ29wdGlvbmFsX3N0cmluZzogJworICAgICAgICByJyJcMzAzXDIwMSBzaG9ydCBkZXNcMzAzXDI0N3JpcHRpb24gYW5kIGEgXDM2MFwyMzdcMjE1XDIxNC4iJworICAgICAgICAnXG4nCisgICAgICAgICdvcHRpb25hbF9ieXRlczogJworICAgICAgICByJyJcMzAzXDIwMSBzaG9ydCBkZXNcMzAzXDI0N3JpcHRpb24gYW5kIGEgXDM2MFwyMzdcMjE1XDIxNC4iJworICAgICAgICAnXG4nKQorICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCh0ZXh0LCBnb2xkZW5fbWVzc2FnZSkKKworICBkZWYgdGVzdFByaW50RmllbGQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIGZpZWxkID0gbWVzc2FnZS5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9mbG9hdCddCisgICAgdmFsdWUgPSBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0CisgICAgb3V0ID0gdGV4dF9mb3JtYXQuVGV4dFdyaXRlcihGYWxzZSkKKyAgICB0ZXh0X2Zvcm1hdC5QcmludEZpZWxkKGZpZWxkLCB2YWx1ZSwgb3V0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29wdGlvbmFsX2Zsb2F0OiAwLjBcbicsIG91dC5nZXR2YWx1ZSgpKQorICAgIG91dC5jbG9zZSgpCisgICAgIyBUZXN0IFByaW50ZXIKKyAgICBvdXQgPSB0ZXh0X2Zvcm1hdC5UZXh0V3JpdGVyKEZhbHNlKQorICAgIHByaW50ZXIgPSB0ZXh0X2Zvcm1hdC5fUHJpbnRlcihvdXQpCisgICAgcHJpbnRlci5QcmludEZpZWxkKGZpZWxkLCB2YWx1ZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvcHRpb25hbF9mbG9hdDogMC4wXG4nLCBvdXQuZ2V0dmFsdWUoKSkKKyAgICBvdXQuY2xvc2UoKQorCisgIGRlZiB0ZXN0UHJpbnRGaWVsZFZhbHVlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBmaWVsZCA9IG1lc3NhZ2UuREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfZmxvYXQnXQorICAgIHZhbHVlID0gbWVzc2FnZS5vcHRpb25hbF9mbG9hdAorICAgIG91dCA9IHRleHRfZm9ybWF0LlRleHRXcml0ZXIoRmFsc2UpCisgICAgdGV4dF9mb3JtYXQuUHJpbnRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgb3V0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzAuMCcsIG91dC5nZXR2YWx1ZSgpKQorICAgIG91dC5jbG9zZSgpCisgICAgIyBUZXN0IFByaW50ZXIKKyAgICBvdXQgPSB0ZXh0X2Zvcm1hdC5UZXh0V3JpdGVyKEZhbHNlKQorICAgIHByaW50ZXIgPSB0ZXh0X2Zvcm1hdC5fUHJpbnRlcihvdXQpCisgICAgcHJpbnRlci5QcmludEZpZWxkVmFsdWUoZmllbGQsIHZhbHVlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzAuMCcsIG91dC5nZXR2YWx1ZSgpKQorICAgIG91dC5jbG9zZSgpCisKKyAgZGVmIHRlc3RDdXN0b21PcHRpb25zKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSAodW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLgorICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zLkRFU0NSSVBUT1IpCisgICAgbWVzc2FnZV9wcm90byA9IGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bygpCisgICAgbWVzc2FnZV9kZXNjcmlwdG9yLkNvcHlUb1Byb3RvKG1lc3NhZ2VfcHJvdG8pCisgICAgZXhwZWN0ZWRfdGV4dCA9ICgKKyAgICAgICAgJ25hbWU6ICJUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zIlxuJworICAgICAgICAnZmllbGQge1xuJworICAgICAgICAnICBuYW1lOiAiZmllbGQxIlxuJworICAgICAgICAnICBudW1iZXI6IDFcbicKKyAgICAgICAgJyAgbGFiZWw6IExBQkVMX09QVElPTkFMXG4nCisgICAgICAgICcgIHR5cGU6IFRZUEVfU1RSSU5HXG4nCisgICAgICAgICcgIG9wdGlvbnMge1xuJworICAgICAgICAnICAgIGN0eXBlOiBDT1JEXG4nCisgICAgICAgICcgICAgW3Byb3RvYnVmX3VuaXR0ZXN0LmZpZWxkX29wdDFdOiA4NzY1NDMyMTA5XG4nCisgICAgICAgICcgIH1cbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ2ZpZWxkIHtcbicKKyAgICAgICAgJyAgbmFtZTogIm9uZW9mX2ZpZWxkIlxuJworICAgICAgICAnICBudW1iZXI6IDJcbicKKyAgICAgICAgJyAgbGFiZWw6IExBQkVMX09QVElPTkFMXG4nCisgICAgICAgICcgIHR5cGU6IFRZUEVfSU5UMzJcbicKKyAgICAgICAgJyAgb25lb2ZfaW5kZXg6IDBcbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ2ZpZWxkIHtcbicKKyAgICAgICAgJyAgbmFtZTogIm1hcF9maWVsZCJcbicKKyAgICAgICAgJyAgbnVtYmVyOiAzXG4nCisgICAgICAgICcgIGxhYmVsOiBMQUJFTF9SRVBFQVRFRFxuJworICAgICAgICAnICB0eXBlOiBUWVBFX01FU1NBR0VcbicKKyAgICAgICAgJyAgdHlwZV9uYW1lOiAiLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMuJworICAgICAgICAnTWFwRmllbGRFbnRyeSJcbicKKyAgICAgICAgJyAgb3B0aW9ucyB7XG4nCisgICAgICAgICcgICAgW3Byb3RvYnVmX3VuaXR0ZXN0LmZpZWxkX29wdDFdOiAxMjM0NVxuJworICAgICAgICAnICB9XG4nCisgICAgICAgICd9XG4nCisgICAgICAgICduZXN0ZWRfdHlwZSB7XG4nCisgICAgICAgICcgIG5hbWU6ICJNYXBGaWVsZEVudHJ5IlxuJworICAgICAgICAnICBmaWVsZCB7XG4nCisgICAgICAgICcgICAgbmFtZTogImtleSJcbicKKyAgICAgICAgJyAgICBudW1iZXI6IDFcbicKKyAgICAgICAgJyAgICBsYWJlbDogTEFCRUxfT1BUSU9OQUxcbicKKyAgICAgICAgJyAgICB0eXBlOiBUWVBFX1NUUklOR1xuJworICAgICAgICAnICB9XG4nCisgICAgICAgICcgIGZpZWxkIHtcbicKKyAgICAgICAgJyAgICBuYW1lOiAidmFsdWUiXG4nCisgICAgICAgICcgICAgbnVtYmVyOiAyXG4nCisgICAgICAgICcgICAgbGFiZWw6IExBQkVMX09QVElPTkFMXG4nCisgICAgICAgICcgICAgdHlwZTogVFlQRV9TVFJJTkdcbicKKyAgICAgICAgJyAgfVxuJworICAgICAgICAnICBvcHRpb25zIHtcbicKKyAgICAgICAgJyAgICBtYXBfZW50cnk6IHRydWVcbicKKyAgICAgICAgJyAgfVxuJworICAgICAgICAnfVxuJworICAgICAgICAnZW51bV90eXBlIHtcbicKKyAgICAgICAgJyAgbmFtZTogIkFuRW51bSJcbicKKyAgICAgICAgJyAgdmFsdWUge1xuJworICAgICAgICAnICAgIG5hbWU6ICJBTkVOVU1fVkFMMSJcbicKKyAgICAgICAgJyAgICBudW1iZXI6IDFcbicKKyAgICAgICAgJyAgfVxuJworICAgICAgICAnICB2YWx1ZSB7XG4nCisgICAgICAgICcgICAgbmFtZTogIkFORU5VTV9WQUwyIlxuJworICAgICAgICAnICAgIG51bWJlcjogMlxuJworICAgICAgICAnICAgIG9wdGlvbnMge1xuJworICAgICAgICAnICAgICAgW3Byb3RvYnVmX3VuaXR0ZXN0LmVudW1fdmFsdWVfb3B0MV06IDEyM1xuJworICAgICAgICAnICAgIH1cbicKKyAgICAgICAgJyAgfVxuJworICAgICAgICAnICBvcHRpb25zIHtcbicKKyAgICAgICAgJyAgICBbcHJvdG9idWZfdW5pdHRlc3QuZW51bV9vcHQxXTogLTc4OVxuJworICAgICAgICAnICB9XG4nCisgICAgICAgICd9XG4nCisgICAgICAgICdvcHRpb25zIHtcbicKKyAgICAgICAgJyAgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQ6IGZhbHNlXG4nCisgICAgICAgICcgIFtwcm90b2J1Zl91bml0dGVzdC5tZXNzYWdlX29wdDFdOiAtNTZcbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ29uZW9mX2RlY2wge1xuJworICAgICAgICAnICBuYW1lOiAiQW5PbmVvZiJcbicKKyAgICAgICAgJyAgb3B0aW9ucyB7XG4nCisgICAgICAgICcgICAgW3Byb3RvYnVmX3VuaXR0ZXN0Lm9uZW9mX29wdDFdOiAtOTlcbicKKyAgICAgICAgJyAgfVxuJworICAgICAgICAnfVxuJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3RleHQsCisgICAgICAgICAgICAgICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZV9wcm90bykpCisgICAgcGFyc2VkX3Byb3RvID0gZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvKCkKKyAgICB0ZXh0X2Zvcm1hdC5QYXJzZShleHBlY3RlZF90ZXh0LCBwYXJzZWRfcHJvdG8pCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlX3Byb3RvLCBwYXJzZWRfcHJvdG8pCisKKyAgQHVuaXR0ZXN0LnNraXBJZigKKyAgICAgIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ3VwYicsCisgICAgICAidXBiIEFQSSBkb2Vzbid0IHN1cHBvcnQgb2xkIFVua25vd25GaWVsZCBBUEkuIFRoZSBUZXh0Rm9ybWF0IGxpYnJhcnkgIgorICAgICAgIm5lZWRzIHRvIGNvbnZlcnQgdG8gdGhlIG5ldyBBUEkuIikKKyAgZGVmIHRlc3RQcmludFVua25vd25GaWVsZHNFbWJlZGRlZE1lc3NhZ2VJbkJ5dGVzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBpbm5lcl9tc2cgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIGlubmVyX21zZy5vcHRpb25hbF9pbnQzMiA9IDEwMQorICAgIGlubmVyX21zZy5vcHRpb25hbF9kb3VibGUgPSAxMDIuMAorICAgIGlubmVyX21zZy5vcHRpb25hbF9zdHJpbmcgPSB1J2hlbGxvJworICAgIGlubmVyX21zZy5vcHRpb25hbF9ieXRlcyA9IGInMTAzJworICAgIGlubmVyX21zZy5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDEwNQorICAgIGlubmVyX2RhdGEgPSBpbm5lcl9tc2cuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIG91dGVyX21lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG91dGVyX21lc3NhZ2Uub3B0aW9uYWxfaW50MzIgPSAxMDEKKyAgICBvdXRlcl9tZXNzYWdlLm9wdGlvbmFsX2J5dGVzID0gaW5uZXJfZGF0YQorICAgIGFsbF9kYXRhID0gb3V0ZXJfbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpCisgICAgZW1wdHlfbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RFbXB0eU1lc3NhZ2UoKQorICAgIGVtcHR5X21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGFsbF9kYXRhKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnICAxOiAxMDFcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIDE1IHtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgMTogMTAxXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIDEyOiA0NjM2ODc4MDI4ODQyOTkxNjE2XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIDE0OiAiaGVsbG8iXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIDE1OiAiMTAzIlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAxOCB7XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICAgMTogMTA1XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICcgIH1cbicsCisgICAgICAgICAgICAgICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoZW1wdHlfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ9MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2ZpZWxkcz1UcnVlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCcxOiAxMDEgJworICAgICAgICAgICAgICAgICAgICAgJzE1IHsgJworICAgICAgICAgICAgICAgICAgICAgJzE6IDEwMSAnCisgICAgICAgICAgICAgICAgICAgICAnMTI6IDQ2MzY4NzgwMjg4NDI5OTE2MTYgJworICAgICAgICAgICAgICAgICAgICAgJzE0OiAiaGVsbG8iICcKKyAgICAgICAgICAgICAgICAgICAgICcxNTogIjEwMyIgJworICAgICAgICAgICAgICAgICAgICAgJzE4IHsgMTogMTA1IH0gJworICAgICAgICAgICAgICAgICAgICAgJ30nLAorICAgICAgICAgICAgICAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKGVtcHR5X21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9maWVsZHM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc19vbmVfbGluZT1UcnVlKSkKKworCitAX3BhcmFtZXRlcml6ZWQucGFyYW1ldGVycyh1bml0dGVzdF9wYjIsIHVuaXR0ZXN0X3Byb3RvM19hcmVuYV9wYjIpCitjbGFzcyBUZXh0Rm9ybWF0TWVzc2FnZVRvVGV4dEJ5dGVzVGVzdHMoVGV4dEZvcm1hdEJhc2UpOgorCisgIGRlZiB0ZXN0TWVzc2FnZVRvQnl0ZXMoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5Gb3JlaWduTWVzc2FnZSgpCisgICAgbWVzc2FnZS5jID0gMTIzCisgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2M6IDEyM1xuJywgdGV4dF9mb3JtYXQuTWVzc2FnZVRvQnl0ZXMobWVzc2FnZSkpCisKKyAgZGVmIHRlc3RSYXdVdGY4Um91bmRUcmlwKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQodSdcdTAwZmNcdFx1YTcxZicpCisgICAgdXRmOF90ZXh0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvQnl0ZXMobWVzc2FnZSwgYXNfdXRmOD1UcnVlKQorICAgIGdvbGRlbl9ieXRlcyA9IGIncmVwZWF0ZWRfc3RyaW5nOiAiXHhjM1x4YmNcXHRceGVhXHg5Y1x4OWYiXG4nCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KHV0ZjhfdGV4dCwgZ29sZGVuX2J5dGVzKQorICAgIHBhcnNlZF9tZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0X2Zvcm1hdC5QYXJzZSh1dGY4X3RleHQsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlLCAnXG4lcyAhPSAlcyAgKCVzICE9ICVzKScgJQorICAgICAgICAobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzBdLAorICAgICAgICAgcGFyc2VkX21lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzBdKSkKKworICBkZWYgdGVzdEVzY2FwZWRVdGY4QVNDSUlSb3VuZFRyaXAoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCh1J1x1MDBmY1x0XHVhNzFmJykKKyAgICBhc2NpaV90ZXh0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvQnl0ZXMobWVzc2FnZSkgICMgYXNfdXRmOD1GYWxzZSBkZWZhdWx0CisgICAgZ29sZGVuX2J5dGVzID0gYidyZXBlYXRlZF9zdHJpbmc6ICJcXDMwM1xcMjc0XFx0XFwzNTJcXDIzNFxcMjM3IlxuJworICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dChhc2NpaV90ZXh0LCBnb2xkZW5fYnl0ZXMpCisgICAgcGFyc2VkX21lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHRleHRfZm9ybWF0LlBhcnNlKGFzY2lpX3RleHQsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlLCAnXG4lcyAhPSAlcyAgKCVzICE9ICVzKScgJQorICAgICAgICAobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzBdLAorICAgICAgICAgcGFyc2VkX21lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzBdKSkKKworCitAX3BhcmFtZXRlcml6ZWQucGFyYW1ldGVycyh1bml0dGVzdF9wYjIsIHVuaXR0ZXN0X3Byb3RvM19hcmVuYV9wYjIpCitjbGFzcyBUZXh0Rm9ybWF0UGFyc2VyVGVzdHMoVGV4dEZvcm1hdEJhc2UpOgorCisgIGRlZiB0ZXN0UGFyc2VBbGxGaWVsZHMoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMobWVzc2FnZSkKKyAgICBhc2NpaV90ZXh0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpCisKKyAgICBwYXJzZWRfbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dF9mb3JtYXQuUGFyc2UoYXNjaWlfdGV4dCwgcGFyc2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKyAgICBpZiBtZXNzYWdlX21vZHVsZSBpcyB1bml0dGVzdF9wYjI6CisgICAgICB0ZXN0X3V0aWwuRXhwZWN0QWxsRmllbGRzU2V0KHNlbGYsIG1lc3NhZ2UpCisKKyAgZGVmIHRlc3RQYXJzZUFuZE1lcmdlVXRmOChzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhtZXNzYWdlKQorICAgIGFzY2lpX3RleHQgPSB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSkKKyAgICBhc2NpaV90ZXh0ID0gYXNjaWlfdGV4dC5lbmNvZGUoJ3V0Zi04JykKKworICAgIHBhcnNlZF9tZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0X2Zvcm1hdC5QYXJzZShhc2NpaV90ZXh0LCBwYXJzZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorICAgIGlmIG1lc3NhZ2VfbW9kdWxlIGlzIHVuaXR0ZXN0X3BiMjoKKyAgICAgIHRlc3RfdXRpbC5FeHBlY3RBbGxGaWVsZHNTZXQoc2VsZiwgbWVzc2FnZSkKKworICAgIHBhcnNlZF9tZXNzYWdlLkNsZWFyKCkKKyAgICB0ZXh0X2Zvcm1hdC5NZXJnZShhc2NpaV90ZXh0LCBwYXJzZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorICAgIGlmIG1lc3NhZ2VfbW9kdWxlIGlzIHVuaXR0ZXN0X3BiMjoKKyAgICAgIHRlc3RfdXRpbC5FeHBlY3RBbGxGaWVsZHNTZXQoc2VsZiwgbWVzc2FnZSkKKworICAgIG1zZzIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHRleHQgPSAodSdvcHRpb25hbF9zdHJpbmc6ICJjYWbDqSInKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1zZzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cyLm9wdGlvbmFsX3N0cmluZywgdSdjYWbDqScpCisgICAgbXNnMi5DbGVhcigpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cyLm9wdGlvbmFsX3N0cmluZywgdScnKQorICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHQsIG1zZzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cyLm9wdGlvbmFsX3N0cmluZywgdSdjYWbDqScpCisKKyAgZGVmIHRlc3RQYXJzZURvdWJsZVRvRmxvYXQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHRleHQgPSAoJ3JlcGVhdGVkX2Zsb2F0OiAzLjQwMjgyMzVlKzM5XG4nCisgICAgICAgICAgICAncmVwZWF0ZWRfZmxvYXQ6IDEuNDAyODIzNWUtMzlcbicpCisgICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRbMF0sIGZsb2F0KCdpbmYnKSkKKyAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRbMV0sIDEuNDAyODIzNWUtMzkpCisKKyAgZGVmIHRlc3RQYXJzZUV4b3RpYyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dCA9ICgncmVwZWF0ZWRfaW50NjQ6IC05MjIzMzcyMDM2ODU0Nzc1ODA4XG4nCisgICAgICAgICAgICAncmVwZWF0ZWRfdWludDY0OiAxODQ0Njc0NDA3MzcwOTU1MTYxNVxuJworICAgICAgICAgICAgJ3JlcGVhdGVkX2RvdWJsZTogMTIzLjQ1NlxuJworICAgICAgICAgICAgJ3JlcGVhdGVkX2RvdWJsZTogMS4yM2UrMjJcbicKKyAgICAgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjNlLTE4XG4nCisgICAgICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiBcbicKKyAgICAgICAgICAgICciXFwwMDBcXDAwMVxcMDA3XFwwMTBcXDAxNFxcblxcclxcdFxcMDEzXFxcXFxcXCdcXCIiXG4nCisgICAgICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiZm9vIiBcJ2NvcmdlXCcgImdyYXVsdCJcbicKKyAgICAgICAgICAgICdyZXBlYXRlZF9zdHJpbmc6ICJcXDMwM1xcMjc0XFwzNTJcXDIzNFxcMjM3IlxuJworICAgICAgICAgICAgJ3JlcGVhdGVkX3N0cmluZzogIlxceGMzXFx4YmMiXG4nCisgICAgICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiXHhjM1x4YmMiXG4nKQorICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHQsIG1lc3NhZ2UpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKC05MjIzMzcyMDM2ODU0Nzc1ODA4LCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0WzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTg0NDY3NDQwNzM3MDk1NTE2MTUsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0WzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzLjQ1NiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLjIzZTIyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZVsxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEuMjNlLTE4LCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZVsyXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdcMDAwXDAwMVxhXGJcZlxuXHJcdFx2XFxcJyInLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1swXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdmb29jb3JnZWdyYXVsdCcsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcdTAwZmNcdWE3MWYnLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1syXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHUnXHUwMGZjJywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbM10pCisKKyAgZGVmIHRlc3RQYXJzZVRyYWlsaW5nQ29tbWFzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gKCdyZXBlYXRlZF9pbnQ2NDogMTAwO1xuJworICAgICAgICAgICAgJ3JlcGVhdGVkX2ludDY0OiAyMDA7XG4nCisgICAgICAgICAgICAncmVwZWF0ZWRfaW50NjQ6IDMwMCxcbicKKyAgICAgICAgICAgICdyZXBlYXRlZF9zdHJpbmc6ICJvbmUiLFxuJworICAgICAgICAgICAgJ3JlcGVhdGVkX3N0cmluZzogInR3byI7XG4nKQorICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHQsIG1lc3NhZ2UpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEwMCwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NFswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIwMCwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NFsxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMwMCwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NFsyXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHUnb25lJywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3R3bycsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzFdKQorCisgIGRlZiB0ZXN0UGFyc2VSZXBlYXRlZFNjYWxhclNob3J0Rm9ybWF0KHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gKCdyZXBlYXRlZF9pbnQ2NDogWzEwMCwgMjAwXTtcbicKKyAgICAgICAgICAgICdyZXBlYXRlZF9pbnQ2NDogW11cbicKKyAgICAgICAgICAgICdyZXBlYXRlZF9pbnQ2NDogMzAwLFxuJworICAgICAgICAgICAgJ3JlcGVhdGVkX3N0cmluZzogWyJvbmUiLCAidHdvIl07XG4nKQorICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHQsIG1lc3NhZ2UpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEwMCwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NFswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIwMCwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NFsxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMwMCwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NFsyXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHUnb25lJywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3R3bycsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzFdKQorCisgIGRlZiB0ZXN0UGFyc2VSZXBlYXRlZE1lc3NhZ2VTaG9ydEZvcm1hdChzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dCA9ICgncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2U6IFt7YmI6IDEwMH0sIHtiYjogMjAwfV0sXG4nCisgICAgICAgICAgICAncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2U6IHtiYjogMzAwfVxuJworICAgICAgICAgICAgJ3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlIFt7YmI6IDQwMH1dO1xuJykKKyAgICB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMDAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMDAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMV0uYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzMDAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMl0uYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0MDAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbM10uYmIpCisKKyAgZGVmIHRlc3RQYXJzZUVtcHR5VGV4dChzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dCA9ICcnCisgICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpLCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0UGFyc2VJbnZhbGlkVXRmOChzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dCA9ICdyZXBlYXRlZF9zdHJpbmc6ICJcXHhjM1xceGMzIicKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IpIGFzIGU6CisgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5leGNlcHRpb24uR2V0TGluZSgpLCAxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5leGNlcHRpb24uR2V0Q29sdW1uKCksIDI4KQorCisgIGRlZiB0ZXN0UGFyc2VTaW5nbGVXb3JkKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ2ZvbycKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAocicxOjEgOiBNZXNzYWdlIHR5cGUgIlx3Ky5UZXN0QWxsVHlwZXMiIGhhcyBubyBmaWVsZCBuYW1lZCAnCisgICAgICAgICByJyJmb28iLicpLCB0ZXh0X2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKKworICBkZWYgdGVzdFBhcnNlVW5rbm93bkZpZWxkKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ3Vua25vd25fZmllbGQ6IDhcbicKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAocicxOjEgOiBNZXNzYWdlIHR5cGUgIlx3Ky5UZXN0QWxsVHlwZXMiIGhhcyBubyBmaWVsZCBuYW1lZCAnCisgICAgICAgICByJyJ1bmtub3duX2ZpZWxkIi4nKSwgdGV4dF9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCisgICAgdGV4dCA9ICgnb3B0aW9uYWxfaW50MzI6IDEyM1xuJworICAgICAgICAgICAgJ3Vua25vd25fZmllbGQ6IDhcbicKKyAgICAgICAgICAgICdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7IGJiOiA0NSB9JykKKyAgICB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlLCBhbGxvd191bmtub3duX2ZpZWxkPVRydWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiLCA0NSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIsIDEyMykKKworICBkZWYgdGVzdFBhcnNlQmFkRW51bVZhbHVlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ29wdGlvbmFsX25lc3RlZF9lbnVtOiBCQVJSJworICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgodGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChyJzE6MjMgOiBcJ29wdGlvbmFsX25lc3RlZF9lbnVtOiBCQVJSXCc6ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ0VudW0gdHlwZSAiXHcrLlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtIiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidoYXMgbm8gdmFsdWUgbmFtZWQgQkFSUi4nKSwgdGV4dF9mb3JtYXQuUGFyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0UGFyc2VCYWRJbnRWYWx1ZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dCA9ICdvcHRpb25hbF9pbnQzMjogYm9yaycKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoJzE6MTcgOiBcJ29wdGlvbmFsX2ludDMyOiBib3JrXCc6ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ291bGRuXCd0IHBhcnNlIGludGVnZXI6IGJvcmsnKSwgdGV4dF9mb3JtYXQuUGFyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0UGFyc2VTdHJpbmdGaWVsZFVuZXNjYXBlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gcicnJ3JlcGVhdGVkX3N0cmluZzogIlx4Zlx4NjIiCisgICAgICAgICAgICAgICByZXBlYXRlZF9zdHJpbmc6ICJcXHhmXFx4NjIiCisgICAgICAgICAgICAgICByZXBlYXRlZF9zdHJpbmc6ICJcXFx4ZlxcXHg2MiIKKyAgICAgICAgICAgICAgIHJlcGVhdGVkX3N0cmluZzogIlxcXFx4ZlxcXFx4NjIiCisgICAgICAgICAgICAgICByZXBlYXRlZF9zdHJpbmc6ICJcXFxcXHhmXFxcXFx4NjIiCisgICAgICAgICAgICAgICByZXBlYXRlZF9zdHJpbmc6ICJceDVjeDIwIicnJworCisgICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSkKKworICAgIFNMQVNIID0gJ1xcJworICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4MGZiJywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChTTEFTSCArICd4ZicgKyBTTEFTSCArICd4NjInLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1sxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFNMQVNIICsgJ1x4MGYnICsgU0xBU0ggKyAnYicsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzJdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoU0xBU0ggKyBTTEFTSCArICd4ZicgKyBTTEFTSCArIFNMQVNIICsgJ3g2MicsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1szXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFNMQVNIICsgU0xBU0ggKyAnXHgwZicgKyBTTEFTSCArIFNMQVNIICsgJ2InLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbNF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChTTEFTSCArICd4MjAnLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1s1XSkKKworICBkZWYgdGVzdFBhcnNlT25lb2Yoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG0ub25lb2ZfdWludDMyID0gMTEKKyAgICBtMiA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG0pLCBtMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl91aW50MzInLCBtMi5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQorCisgIGRlZiB0ZXN0UGFyc2VNdWx0aXBsZU9uZW9mKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtX3N0cmluZyA9ICdcbicuam9pbihbJ29uZW9mX3VpbnQzMjogMTEnLCAnb25lb2Zfc3RyaW5nOiAiZm9vIiddKQorICAgIG0yID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgodGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBpcyBzcGVjaWZpZWQgYWxvbmcgd2l0aCBmaWVsZCAnKToKKyAgICAgIHRleHRfZm9ybWF0LlBhcnNlKG1fc3RyaW5nLCBtMikKKworICAjIFRoaXMgZXhhbXBsZSBjb250YWlucyBub24tQVNDSUkgY29kZXBvaW50IHVuaWNvZGUgZGF0YSBhcyBsaXRlcmFscworICAjIHdoaWNoIHNob3VsZCBjb21lIHRocm91Z2ggYXMgdXRmLTggZm9yIGJ5dGVzLCBhbmQgYXMgdGhlIHVuaWNvZGUKKyAgIyBpdHNlbGYgZm9yIHN0cmluZyBmaWVsZHMuICBJdCBhbHNvIGRlbW9uc3RyYXRlcyBlc2NhcGVkIGJpbmFyeSBkYXRhLgorICAjIFRoZSB1ciIiIHN0cmluZyBwcmVmaXggaXMgdW5mb3J0dW5hdGVseSBtaXNzaW5nIGZyb20gUHl0aG9uIDMKKyAgIyBzbyB3ZSByZXNvcnQgdG8gZG91YmxlIGVzY2FwaW5nIG91ciBccyBzbyB0aGF0IHRoZXkgY29tZSB0aHJvdWdoLgorICBfVU5JQ09ERV9TQU1QTEUgPSB1IiIiCisgICAgICBvcHRpb25hbF9ieXRlczogJ8OBIHNob3J0IGRlc8OncmlwdGlvbicKKyAgICAgIG9wdGlvbmFsX3N0cmluZzogJ8OBIHNob3J0IGRlc8OncmlwdGlvbicKKyAgICAgIHJlcGVhdGVkX2J5dGVzOiAnXFwzMDNcXDIwMSBzaG9ydCBkZXNcXDMwM1xcMjQ3cmlwdGlvbicKKyAgICAgIHJlcGVhdGVkX2J5dGVzOiAnXFx4MTJcXHgzNFxceDU2XFx4NzhcXHg5MFxceGFiXFx4Y2RcXHhlZicKKyAgICAgIHJlcGVhdGVkX3N0cmluZzogJ1xceGQwXFx4OWZcXHhkMVxceDgwXFx4ZDBcXHhiOFxceGQwXFx4YjJcXHhkMFxceGI1XFx4ZDFcXHg4MicKKyAgICAgICIiIgorICBfQllURVNfU0FNUExFID0gX1VOSUNPREVfU0FNUExFLmVuY29kZSgndXRmLTgnKQorICBfR09MREVOX1VOSUNPREUgPSB1J8OBIHNob3J0IGRlc8OncmlwdGlvbicKKyAgX0dPTERFTl9CWVRFUyA9IF9HT0xERU5fVU5JQ09ERS5lbmNvZGUoJ3V0Zi04JykKKyAgX0dPTERFTl9CWVRFU18xID0gYidceDEyXHgzNFx4NTZceDc4XHg5MFx4YWJceGNkXHhlZicKKyAgX0dPTERFTl9TVFJfMCA9IHUn0J/RgNC40LLQtdGCJworCisgIGRlZiB0ZXN0UGFyc2VVbmljb2RlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0X2Zvcm1hdC5QYXJzZShzZWxmLl9VTklDT0RFX1NBTVBMRSwgbSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG0ub3B0aW9uYWxfYnl0ZXMsIHNlbGYuX0dPTERFTl9CWVRFUykKKyAgICBzZWxmLmFzc2VydEVxdWFsKG0ub3B0aW9uYWxfc3RyaW5nLCBzZWxmLl9HT0xERU5fVU5JQ09ERSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmVwZWF0ZWRfYnl0ZXNbMF0sIHNlbGYuX0dPTERFTl9CWVRFUykKKyAgICAjIHJlcGVhdGVkX2J5dGVzWzFdIGNvbnRhaW5lZCBzaW1wbGUgXCBlc2NhcGVkIG5vbi1VVEYtOCByYXcgYmluYXJ5IGRhdGEuCisgICAgc2VsZi5hc3NlcnRFcXVhbChtLnJlcGVhdGVkX2J5dGVzWzFdLCBzZWxmLl9HT0xERU5fQllURVNfMSkKKyAgICAjIHJlcGVhdGVkX3N0cmluZ1swXSBjb250YWluZWQgXCBlc2NhcGVkIGRhdGEgcmVwcmVzZW50aW5nIHRoZSBVVEYtOAorICAgICMgcmVwcmVzZW50YXRpb24gb2YgX0dPTERFTl9TVFJfMCAtIGl0IG5lZWRzIHRvIGRlY29kZSBhcyBzdWNoLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZXBlYXRlZF9zdHJpbmdbMF0sIHNlbGYuX0dPTERFTl9TVFJfMCkKKworICBkZWYgdGVzdFBhcnNlQnl0ZXMoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHRleHRfZm9ybWF0LlBhcnNlKHNlbGYuX0JZVEVTX1NBTVBMRSwgbSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG0ub3B0aW9uYWxfYnl0ZXMsIHNlbGYuX0dPTERFTl9CWVRFUykKKyAgICBzZWxmLmFzc2VydEVxdWFsKG0ub3B0aW9uYWxfc3RyaW5nLCBzZWxmLl9HT0xERU5fVU5JQ09ERSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmVwZWF0ZWRfYnl0ZXNbMF0sIHNlbGYuX0dPTERFTl9CWVRFUykKKyAgICAjIHJlcGVhdGVkX2J5dGVzWzFdIGNvbnRhaW5lZCBzaW1wbGUgXCBlc2NhcGVkIG5vbi1VVEYtOCByYXcgYmluYXJ5IGRhdGEuCisgICAgc2VsZi5hc3NlcnRFcXVhbChtLnJlcGVhdGVkX2J5dGVzWzFdLCBzZWxmLl9HT0xERU5fQllURVNfMSkKKyAgICAjIHJlcGVhdGVkX3N0cmluZ1swXSBjb250YWluZWQgXCBlc2NhcGVkIGRhdGEgcmVwcmVzZW50aW5nIHRoZSBVVEYtOAorICAgICMgcmVwcmVzZW50YXRpb24gb2YgX0dPTERFTl9TVFJfMCAtIGl0IG5lZWRzIHRvIGRlY29kZSBhcyBzdWNoLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZXBlYXRlZF9zdHJpbmdbMF0sIHNlbGYuX0dPTERFTl9TVFJfMCkKKworICBkZWYgdGVzdEZyb21CeXRlc0ZpbGUoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIGYgPSBpby5CeXRlc0lPKHNlbGYuX0JZVEVTX1NBTVBMRSkKKyAgICB0ZXh0X2Zvcm1hdC5QYXJzZUxpbmVzKGYsIG0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChtLm9wdGlvbmFsX2J5dGVzLCBzZWxmLl9HT0xERU5fQllURVMpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtLm9wdGlvbmFsX3N0cmluZywgc2VsZi5fR09MREVOX1VOSUNPREUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtLnJlcGVhdGVkX2J5dGVzWzBdLCBzZWxmLl9HT0xERU5fQllURVMpCisKKyAgZGVmIHRlc3RGcm9tVW5pY29kZUZpbGUoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIGYgPSBpby5TdHJpbmdJTyhzZWxmLl9VTklDT0RFX1NBTVBMRSkKKyAgICB0ZXh0X2Zvcm1hdC5QYXJzZUxpbmVzKGYsIG0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChtLm9wdGlvbmFsX2J5dGVzLCBzZWxmLl9HT0xERU5fQllURVMpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtLm9wdGlvbmFsX3N0cmluZywgc2VsZi5fR09MREVOX1VOSUNPREUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtLnJlcGVhdGVkX2J5dGVzWzBdLCBzZWxmLl9HT0xERU5fQllURVMpCisKKyAgZGVmIHRlc3RGcm9tQnl0ZXNMaW5lcyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dF9mb3JtYXQuUGFyc2VMaW5lcyhzZWxmLl9CWVRFU19TQU1QTEUuc3BsaXQoYidcbicpLCBtKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5vcHRpb25hbF9ieXRlcywgc2VsZi5fR09MREVOX0JZVEVTKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5vcHRpb25hbF9zdHJpbmcsIHNlbGYuX0dPTERFTl9VTklDT0RFKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZXBlYXRlZF9ieXRlc1swXSwgc2VsZi5fR09MREVOX0JZVEVTKQorCisgIGRlZiB0ZXN0RnJvbVVuaWNvZGVMaW5lcyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dF9mb3JtYXQuUGFyc2VMaW5lcyhzZWxmLl9VTklDT0RFX1NBTVBMRS5zcGxpdCh1J1xuJyksIG0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChtLm9wdGlvbmFsX2J5dGVzLCBzZWxmLl9HT0xERU5fQllURVMpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtLm9wdGlvbmFsX3N0cmluZywgc2VsZi5fR09MREVOX1VOSUNPREUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtLnJlcGVhdGVkX2J5dGVzWzBdLCBzZWxmLl9HT0xERU5fQllURVMpCisKKyAgZGVmIHRlc3RQYXJzZUR1cGxpY2F0ZU1lc3NhZ2VzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7IGJiOiAxIH0gJworICAgICAgICAgICAgJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHsgYmI6IDIgfScpCisgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgKHInMTo1OSA6IE1lc3NhZ2UgdHlwZSAiXHcrLlRlc3RBbGxUeXBlcyIgJworICAgICAgICAgcidzaG91bGQgbm90IGhhdmUgbXVsdGlwbGUgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiBmaWVsZHMuJyksCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0UGFyc2VEdXBsaWNhdGVTY2FsYXJzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gKCdvcHRpb25hbF9pbnQzMjogNDIgJyAnb3B0aW9uYWxfaW50MzI6IDY3JykKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAocicxOjM2IDogTWVzc2FnZSB0eXBlICJcdysuVGVzdEFsbFR5cGVzIiBzaG91bGQgbm90ICcKKyAgICAgICAgIHInaGF2ZSBtdWx0aXBsZSAib3B0aW9uYWxfaW50MzIiIGZpZWxkcy4nKSwgdGV4dF9mb3JtYXQuUGFyc2UsIHRleHQsCisgICAgICAgIG1lc3NhZ2UpCisKKyAgZGVmIHRlc3RQYXJzZUV4aXN0aW5nU2NhbGFySW5NZXNzYWdlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKG9wdGlvbmFsX2ludDMyPTQyKQorICAgIHRleHQgPSAnb3B0aW9uYWxfaW50MzI6IDY3JworICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgodGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChyJ01lc3NhZ2UgdHlwZSAiXHcrLlRlc3RBbGxUeXBlcyIgc2hvdWxkIG5vdCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidoYXZlIG11bHRpcGxlICJvcHRpb25hbF9pbnQzMiIgZmllbGRzLicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCisKKworQF9wYXJhbWV0ZXJpemVkLnBhcmFtZXRlcnModW5pdHRlc3RfcGIyLCB1bml0dGVzdF9wcm90bzNfYXJlbmFfcGIyKQorY2xhc3MgVGV4dEZvcm1hdE1lcmdlVGVzdHMoVGV4dEZvcm1hdEJhc2UpOgorCisgIGRlZiB0ZXN0TWVyZ2VEdXBsaWNhdGVTY2FsYXJzSW5UZXh0KHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gKCdvcHRpb25hbF9pbnQzMjogNDIgJyAnb3B0aW9uYWxfaW50MzI6IDY3JykKKyAgICByID0gdGV4dF9mb3JtYXQuTWVyZ2UodGV4dCwgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydElzKHIsIG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg2NywgbWVzc2FnZS5vcHRpb25hbF9pbnQzMikKKworICBkZWYgdGVzdE1lcmdlRHVwbGljYXRlTmVzdGVkTWVzc2FnZVNjYWxhcnMoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHRleHQgPSAoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHsgYmI6IDEgfSAnCisgICAgICAgICAgICAnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgeyBiYjogMiB9JykKKyAgICByID0gdGV4dF9mb3JtYXQuTWVyZ2UodGV4dCwgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydFRydWUociBpcyBtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYikKKworICBkZWYgdGVzdFJlcGxhY2VTY2FsYXJJbk1lc3NhZ2Uoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMob3B0aW9uYWxfaW50MzI9NDIpCisgICAgdGV4dCA9ICdvcHRpb25hbF9pbnQzMjogNjcnCisgICAgciA9IHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRJcyhyLCBtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNjcsIG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIpCisKKyAgZGVmIHRlc3RSZXBsYWNlTWVzc2FnZUluTWVzc2FnZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6CisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygKKyAgICAgICAgb3B0aW9uYWxfaW50MzI9NDIsIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlPWRpY3QoKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKyAgICB0ZXh0ID0gJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdleyBiYjogMyB9JworICAgIHIgPSB0ZXh0X2Zvcm1hdC5NZXJnZSh0ZXh0LCBtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0SXMociwgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisKKyAgZGVmIHRlc3RNZXJnZU11bHRpcGxlT25lb2Yoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorICAgIG1fc3RyaW5nID0gJ1xuJy5qb2luKFsnb25lb2ZfdWludDMyOiAxMScsICdvbmVvZl9zdHJpbmc6ICJmb28iJ10pCisgICAgbTIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKG1fc3RyaW5nLCBtMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl9zdHJpbmcnLCBtMi5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQorCisKKyMgVGhlc2UgYXJlIHRlc3RzIHRoYXQgYXJlbid0IGZ1bmRhbWVudGFsbHkgc3BlY2lmaWMgdG8gcHJvdG8yLCBidXQgYXJlIGF0CisjIHRoZSBtb21lbnQgYmVjYXVzZSBvZiBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBwcm90bzIgYW5kIHByb3RvMyB0ZXN0IHNjaGVtYXMuCisjIElkZWFsbHkgdGhlIHNjaGVtYXMgd291bGQgYmUgbWFkZSBtb3JlIHNpbWlsYXIgc28gdGhlc2UgdGVzdHMgY291bGQgcGFzcy4KK2NsYXNzIE9ubHlXb3Jrc1dpdGhQcm90bzJSaWdodE5vd1Rlc3RzKFRleHRGb3JtYXRCYXNlKToKKworICBkZWYgdGVzdFByaW50QWxsRmllbGRzUG9pbnR5KHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKG1lc3NhZ2UpCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5GaWxlKAorICAgICAgICBzZWxmLlJlbW92ZVJlZHVuZGFudFplcm9zKHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZygKKyAgICAgICAgICAgIG1lc3NhZ2UsIHBvaW50eV9icmFja2V0cz1UcnVlKSksCisgICAgICAgICd0ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX3BvaW50eV9vbmVvZi50eHQnKQorCisgIGRlZiB0ZXN0UGFyc2VHb2xkZW4oc2VsZik6CisgICAgZ29sZGVuX3RleHQgPSAnXG4nLmpvaW4oc2VsZi5SZWFkR29sZGVuKAorICAgICAgICAndGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9vbmVvZl9pbXBsZW1lbnRlZC50eHQnKSkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHIgPSB0ZXh0X2Zvcm1hdC5QYXJzZShnb2xkZW5fdGV4dCwgcGFyc2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRJcyhyLCBwYXJzZWRfbWVzc2FnZSkKKworICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKworICBkZWYgdGVzdFByaW50QWxsRmllbGRzKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKG1lc3NhZ2UpCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5GaWxlKAorICAgICAgICBzZWxmLlJlbW92ZVJlZHVuZGFudFplcm9zKHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKSksCisgICAgICAgICd0ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX29uZW9mX2ltcGxlbWVudGVkLnR4dCcpCisKKyAgZGVmIHRlc3RQcmludFVua25vd25GaWVsZHMoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIgPSAxMDEKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IDEwMi4wCisgICAgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcgPSB1J2hlbGxvJworICAgIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMgPSBiJzEwMycKKyAgICBtZXNzYWdlLm9wdGlvbmFsZ3JvdXAuYSA9IDEwNAorICAgIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgPSAxMDUKKyAgICBhbGxfZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIGVtcHR5X21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCisgICAgZW1wdHlfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoYWxsX2RhdGEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnICAxOiAxMDFcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIDEyOiA0NjM2ODc4MDI4ODQyOTkxNjE2XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAxNDogImhlbGxvIlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgMTU6ICIxMDMiXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAxNiB7XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIDE3OiAxMDRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICcgIDE4IHtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgMTogMTA1XG4nCisgICAgICAgICAgICAgICAgICAgICAnICB9XG4nLAorICAgICAgICAgICAgICAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKGVtcHR5X21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50PTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9maWVsZHM9VHJ1ZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnMTogMTAxICcKKyAgICAgICAgICAgICAgICAgICAgICcxMjogNDYzNjg3ODAyODg0Mjk5MTYxNiAnCisgICAgICAgICAgICAgICAgICAgICAnMTQ6ICJoZWxsbyIgJworICAgICAgICAgICAgICAgICAgICAgJzE1OiAiMTAzIiAnCisgICAgICAgICAgICAgICAgICAgICAnMTYgeyAxNzogMTA0IH0gJworICAgICAgICAgICAgICAgICAgICAgJzE4IHsgMTogMTA1IH0nLAorICAgICAgICAgICAgICAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKGVtcHR5X21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9maWVsZHM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc19vbmVfbGluZT1UcnVlKSkKKworICBkZWYgdGVzdFByaW50SW5JbmRleE9yZGVyKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEZpZWxkT3JkZXJpbmdzKCkKKyAgICAjIEZpZWxkcyBhcmUgbGlzdGVkIGluIGluZGV4IG9yZGVyIGluc3RlYWQgb2YgZmllbGQgbnVtYmVyLgorICAgIG1lc3NhZ2UubXlfc3RyaW5nID0gJ3N0cicKKyAgICBtZXNzYWdlLm15X2ludCA9IDEwMQorICAgIG1lc3NhZ2UubXlfZmxvYXQgPSAxMTEKKyAgICBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLm9vID0gMAorICAgIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgPSAxCisgICAgbWVzc2FnZS5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25fc3RyaW5nXSA9ICdleHRfc3RyMCcKKyAgICAjIEV4dGVuc2lvbnMgYXJlIGxpc3RlZCBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgZXh0ZW5zaW9uIG51bWJlci4KKyAgICAjIEV4dGVuc2lvbiBudW1iZXIgMTIuCisgICAgbWVzc2FnZS5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5UZXN0RXh0ZW5zaW9uT3JkZXJpbmdzMi4KKyAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9leHRfb3JkZXJpbmdzMl0ubXlfc3RyaW5nID0gJ2V4dF9zdHIyJworICAgICMgRXh0ZW5zaW9uIG51bWJlciAxMy4KKyAgICBtZXNzYWdlLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLlRlc3RFeHRlbnNpb25PcmRlcmluZ3MxLgorICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2V4dF9vcmRlcmluZ3MxXS5teV9zdHJpbmcgPSAnZXh0X3N0cjEnCisgICAgIyBFeHRlbnNpb24gbnVtYmVyIDE0LgorICAgIG1lc3NhZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RFeHRlbnNpb25PcmRlcmluZ3MyLlRlc3RFeHRlbnNpb25PcmRlcmluZ3MzLgorICAgICAgICB0ZXN0X2V4dF9vcmRlcmluZ3MzXS5teV9zdHJpbmcgPSAnZXh0X3N0cjMnCisKKyAgICAjIFByaW50IGluIGluZGV4IG9yZGVyLgorICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgICAgc2VsZi5SZW1vdmVSZWR1bmRhbnRaZXJvcygKKyAgICAgICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCB1c2VfaW5kZXhfb3JkZXI9VHJ1ZSkpLAorICAgICAgICAnbXlfc3RyaW5nOiAic3RyIlxuJworICAgICAgICAnbXlfaW50OiAxMDFcbicKKyAgICAgICAgJ215X2Zsb2F0OiAxMTFcbicKKyAgICAgICAgJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHtcbicKKyAgICAgICAgJyAgb286IDBcbicKKyAgICAgICAgJyAgYmI6IDFcbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ1twcm90b2J1Zl91bml0dGVzdC5UZXN0RXh0ZW5zaW9uT3JkZXJpbmdzMi50ZXN0X2V4dF9vcmRlcmluZ3MyXSB7XG4nCisgICAgICAgICcgIG15X3N0cmluZzogImV4dF9zdHIyIlxuJworICAgICAgICAnfVxuJworICAgICAgICAnW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RFeHRlbnNpb25PcmRlcmluZ3MxLnRlc3RfZXh0X29yZGVyaW5nczFdIHtcbicKKyAgICAgICAgJyAgbXlfc3RyaW5nOiAiZXh0X3N0cjEiXG4nCisgICAgICAgICd9XG4nCisgICAgICAgICdbcHJvdG9idWZfdW5pdHRlc3QuVGVzdEV4dGVuc2lvbk9yZGVyaW5nczIuVGVzdEV4dGVuc2lvbk9yZGVyaW5nczMnCisgICAgICAgICcudGVzdF9leHRfb3JkZXJpbmdzM10ge1xuJworICAgICAgICAnICBteV9zdHJpbmc6ICJleHRfc3RyMyJcbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ1twcm90b2J1Zl91bml0dGVzdC5teV9leHRlbnNpb25fc3RyaW5nXTogImV4dF9zdHIwIlxuJykKKyAgICAjIEJ5IGRlZmF1bHQsIHByaW50IGluIGZpZWxkIG51bWJlciBvcmRlci4KKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICAgIHNlbGYuUmVtb3ZlUmVkdW5kYW50WmVyb3ModGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpKSwKKyAgICAgICAgJ215X2ludDogMTAxXG4nCisgICAgICAgICdteV9zdHJpbmc6ICJzdHIiXG4nCisgICAgICAgICdbcHJvdG9idWZfdW5pdHRlc3QuVGVzdEV4dGVuc2lvbk9yZGVyaW5nczIudGVzdF9leHRfb3JkZXJpbmdzMl0ge1xuJworICAgICAgICAnICBteV9zdHJpbmc6ICJleHRfc3RyMiJcbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ1twcm90b2J1Zl91bml0dGVzdC5UZXN0RXh0ZW5zaW9uT3JkZXJpbmdzMS50ZXN0X2V4dF9vcmRlcmluZ3MxXSB7XG4nCisgICAgICAgICcgIG15X3N0cmluZzogImV4dF9zdHIxIlxuJworICAgICAgICAnfVxuJworICAgICAgICAnW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RFeHRlbnNpb25PcmRlcmluZ3MyLlRlc3RFeHRlbnNpb25PcmRlcmluZ3MzJworICAgICAgICAnLnRlc3RfZXh0X29yZGVyaW5nczNdIHtcbicKKyAgICAgICAgJyAgbXlfc3RyaW5nOiAiZXh0X3N0cjMiXG4nCisgICAgICAgICd9XG4nCisgICAgICAgICdbcHJvdG9idWZfdW5pdHRlc3QubXlfZXh0ZW5zaW9uX3N0cmluZ106ICJleHRfc3RyMCJcbicKKyAgICAgICAgJ215X2Zsb2F0OiAxMTFcbicKKyAgICAgICAgJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHtcbicKKyAgICAgICAgJyAgYmI6IDFcbicKKyAgICAgICAgJyAgb286IDBcbicKKyAgICAgICAgJ31cbicpCisKKyAgZGVmIHRlc3RNZXJnZUxpbmVzR29sZGVuKHNlbGYpOgorICAgIG9wZW5lZCA9IHNlbGYuUmVhZEdvbGRlbigndGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9vbmVvZl9pbXBsZW1lbnRlZC50eHQnKQorICAgIHBhcnNlZF9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgciA9IHRleHRfZm9ybWF0Lk1lcmdlTGluZXMob3BlbmVkLCBwYXJzZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydElzKHIsIHBhcnNlZF9tZXNzYWdlKQorCisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMobWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgIGRlZiB0ZXN0UGFyc2VMaW5lc0dvbGRlbihzZWxmKToKKyAgICBvcGVuZWQgPSBzZWxmLlJlYWRHb2xkZW4oJ3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfb25lb2ZfaW1wbGVtZW50ZWQudHh0JykKKyAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHIgPSB0ZXh0X2Zvcm1hdC5QYXJzZUxpbmVzKG9wZW5lZCwgcGFyc2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRJcyhyLCBwYXJzZWRfbWVzc2FnZSkKKworICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKworICBkZWYgdGVzdFByaW50TWFwKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorCisgICAgbWVzc2FnZS5tYXBfaW50MzJfaW50MzJbLTEyM10gPSAtNDU2CisgICAgbWVzc2FnZS5tYXBfaW50NjRfaW50NjRbLTIqKjMzXSA9IC0yKiozNAorICAgIG1lc3NhZ2UubWFwX3VpbnQzMl91aW50MzJbMTIzXSA9IDQ1NgorICAgIG1lc3NhZ2UubWFwX3VpbnQ2NF91aW50NjRbMioqMzNdID0gMioqMzQKKyAgICBtZXNzYWdlLm1hcF9zdHJpbmdfc3RyaW5nWydhYmMnXSA9ICcxMjMnCisgICAgbWVzc2FnZS5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzExMV0uYyA9IDUKKworICAgICMgTWFwcyBhcmUgc2VyaWFsaXplZCB0byB0ZXh0IGZvcm1hdCB1c2luZyB0aGVpciB1bmRlcmx5aW5nIHJlcGVhdGVkCisgICAgIyByZXByZXNlbnRhdGlvbi4KKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKSwgJ21hcF9pbnQzMl9pbnQzMiB7XG4nCisgICAgICAgICcgIGtleTogLTEyM1xuJworICAgICAgICAnICB2YWx1ZTogLTQ1NlxuJworICAgICAgICAnfVxuJworICAgICAgICAnbWFwX2ludDY0X2ludDY0IHtcbicKKyAgICAgICAgJyAga2V5OiAtODU4OTkzNDU5MlxuJworICAgICAgICAnICB2YWx1ZTogLTE3MTc5ODY5MTg0XG4nCisgICAgICAgICd9XG4nCisgICAgICAgICdtYXBfdWludDMyX3VpbnQzMiB7XG4nCisgICAgICAgICcgIGtleTogMTIzXG4nCisgICAgICAgICcgIHZhbHVlOiA0NTZcbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ21hcF91aW50NjRfdWludDY0IHtcbicKKyAgICAgICAgJyAga2V5OiA4NTg5OTM0NTkyXG4nCisgICAgICAgICcgIHZhbHVlOiAxNzE3OTg2OTE4NFxuJworICAgICAgICAnfVxuJworICAgICAgICAnbWFwX3N0cmluZ19zdHJpbmcge1xuJworICAgICAgICAnICBrZXk6ICJhYmMiXG4nCisgICAgICAgICcgIHZhbHVlOiAiMTIzIlxuJworICAgICAgICAnfVxuJworICAgICAgICAnbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSB7XG4nCisgICAgICAgICcgIGtleTogMTExXG4nCisgICAgICAgICcgIHZhbHVlIHtcbicKKyAgICAgICAgJyAgICBjOiA1XG4nCisgICAgICAgICcgIH1cbicKKyAgICAgICAgJ31cbicpCisKKyAgZGVmIHRlc3REdXBsaWNhdGVNYXBLZXkoc2VsZik6CisgICAgbWVzc2FnZSA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgdGV4dCA9ICgKKyAgICAgICAgJ21hcF91aW50NjRfdWludDY0IHtcbicKKyAgICAgICAgJyAga2V5OiAxMjNcbicKKyAgICAgICAgJyAgdmFsdWU6IDE3MTc5ODY5MTg0XG4nCisgICAgICAgICd9XG4nCisgICAgICAgICdtYXBfc3RyaW5nX3N0cmluZyB7XG4nCisgICAgICAgICcgIGtleTogImFiYyJcbicKKyAgICAgICAgJyAgdmFsdWU6ICJmaXJzdCJcbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2Uge1xuJworICAgICAgICAnICBrZXk6IDExMVxuJworICAgICAgICAnICB2YWx1ZSB7XG4nCisgICAgICAgICcgICAgYzogNVxuJworICAgICAgICAnICB9XG4nCisgICAgICAgICd9XG4nCisgICAgICAgICdtYXBfdWludDY0X3VpbnQ2NCB7XG4nCisgICAgICAgICcgIGtleTogMTIzXG4nCisgICAgICAgICcgIHZhbHVlOiAzMjFcbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ21hcF9zdHJpbmdfc3RyaW5nIHtcbicKKyAgICAgICAgJyAga2V5OiAiYWJjIlxuJworICAgICAgICAnICB2YWx1ZTogInNlY29uZCJcbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2Uge1xuJworICAgICAgICAnICBrZXk6IDExMVxuJworICAgICAgICAnICB2YWx1ZSB7XG4nCisgICAgICAgICcgICAgZDogNVxuJworICAgICAgICAnICB9XG4nCisgICAgICAgICd9XG4nKQorICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHQsIG1lc3NhZ2UpCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSksICdtYXBfdWludDY0X3VpbnQ2NCB7XG4nCisgICAgICAgICcgIGtleTogMTIzXG4nCisgICAgICAgICcgIHZhbHVlOiAzMjFcbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ21hcF9zdHJpbmdfc3RyaW5nIHtcbicKKyAgICAgICAgJyAga2V5OiAiYWJjIlxuJworICAgICAgICAnICB2YWx1ZTogInNlY29uZCJcbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2Uge1xuJworICAgICAgICAnICBrZXk6IDExMVxuJworICAgICAgICAnICB2YWx1ZSB7XG4nCisgICAgICAgICcgICAgZDogNVxuJworICAgICAgICAnICB9XG4nCisgICAgICAgICd9XG4nKQorCisgICMgSW4gY3BwIGltcGxlbWVudGF0aW9uLCBfX3N0cl9fIGNhbGxzIHRoZSBjcHAgaW1wbGVtZW50YXRpb24gb2YgdGV4dCBmb3JtYXQuCisgIGRlZiB0ZXN0UHJpbnRNYXBVc2luZ0NwcEltcGxlbWVudGF0aW9uKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorICAgIGlubmVyX21zZyA9IG1lc3NhZ2UubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsxMTFdCisgICAgaW5uZXJfbXNnLmMgPSAxCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgc3RyKG1lc3NhZ2UpLAorICAgICAgICAnbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSB7XG4nCisgICAgICAgICcgIGtleTogMTExXG4nCisgICAgICAgICcgIHZhbHVlIHtcbicKKyAgICAgICAgJyAgICBjOiAxXG4nCisgICAgICAgICcgIH1cbicKKyAgICAgICAgJ31cbicpCisgICAgaW5uZXJfbXNnLmMgPSAyCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgc3RyKG1lc3NhZ2UpLAorICAgICAgICAnbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSB7XG4nCisgICAgICAgICcgIGtleTogMTExXG4nCisgICAgICAgICcgIHZhbHVlIHtcbicKKyAgICAgICAgJyAgICBjOiAyXG4nCisgICAgICAgICcgIH1cbicKKyAgICAgICAgJ31cbicpCisKKyAgZGVmIHRlc3RNYXBPcmRlckVuZm9yY2VtZW50KHNlbGYpOgorICAgIG1lc3NhZ2UgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorICAgIGZvciBsZXR0ZXIgaW4gc3RyaW5nLmFzY2lpX3VwcGVyY2FzZVsxMzoyNl06CisgICAgICBtZXNzYWdlLm1hcF9zdHJpbmdfc3RyaW5nW2xldHRlcl0gPSAnZHVtbXknCisgICAgZm9yIGxldHRlciBpbiByZXZlcnNlZChzdHJpbmcuYXNjaWlfdXBwZXJjYXNlWzA6MTNdKToKKyAgICAgIG1lc3NhZ2UubWFwX3N0cmluZ19zdHJpbmdbbGV0dGVyXSA9ICdkdW1teScKKyAgICBnb2xkZW4gPSAnJy5qb2luKCgnbWFwX3N0cmluZ19zdHJpbmcge1xuICBrZXk6ICIlYyJcbiAgdmFsdWU6ICJkdW1teSJcbn1cbicKKyAgICAgICAgICAgICAgICAgICAgICAlIChsZXR0ZXIsKSBmb3IgbGV0dGVyIGluIHN0cmluZy5hc2NpaV91cHBlcmNhc2UpKQorICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCh0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSksIGdvbGRlbikKKworICAjIFRPRE8odGVib3JpbmcpOiBJbiBjLzEzNzU1MzUyMywgbm90IHNlcmlhbGl6aW5nIGRlZmF1bHQgdmFsdWUgZm9yIG1hcCBlbnRyeQorICAjIG1lc3NhZ2UgaGFzIGJlZW4gZml4ZWQuIFRoaXMgdGVzdCBuZWVkcyB0byBiZSBkaXNhYmxlZCBpbiBvcmRlciB0byBzdWJtaXQKKyAgIyB0aGF0IGNsLiBBZGQgdGhpcyBiYWNrIHdoZW4gYy8xMzc1NTM1MjMgaGFzIGJlZW4gc3VibWl0dGVkLgorICAjIGRlZiB0ZXN0TWFwT3JkZXJTZW1hbnRpY3Moc2VsZik6CisgICMgICBnb2xkZW5fbGluZXMgPSBzZWxmLlJlYWRHb2xkZW4oJ21hcF90ZXN0X2RhdGEudHh0JykKKworICAjICAgbWVzc2FnZSA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICMgICB0ZXh0X2Zvcm1hdC5QYXJzZUxpbmVzKGdvbGRlbl9saW5lcywgbWVzc2FnZSkKKyAgIyAgIGNhbmRpZGF0ZSA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKQorICAjICAgIyBUaGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIGVtaXRzICIxLjAiIGZvciB0aGUgZG91YmxlIHZhbHVlIHRoYXQgdGhlIEMrKworICAjICAgIyBpbXBsZW1lbnRhdGlvbiBlbWl0cyBhcyAiMSIuCisgICMgICBjYW5kaWRhdGUgPSBjYW5kaWRhdGUucmVwbGFjZSgnMS4wJywgJzEnLCAyKQorICAjICAgY2FuZGlkYXRlID0gY2FuZGlkYXRlLnJlcGxhY2UoJzAuMCcsICcwJywgMikKKyAgIyAgIHNlbGYuYXNzZXJ0TXVsdGlMaW5lRXF1YWwoY2FuZGlkYXRlLCAnJy5qb2luKGdvbGRlbl9saW5lcykpCisKKworIyBUZXN0cyBvZiBwcm90bzItb25seSBmZWF0dXJlcyAoTWVzc2FnZVNldCwgZXh0ZW5zaW9ucywgZXRjLikuCitjbGFzcyBQcm90bzJUZXN0cyhUZXh0Rm9ybWF0QmFzZSk6CisKKyAgZGVmIHRlc3RQcmludE1lc3NhZ2VTZXQoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyKCkKKyAgICBleHQxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIGV4dDIgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCisgICAgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDFdLmkgPSAyMworICAgIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQyXS5zdHIgPSAnZm9vJworICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpLCAnbWVzc2FnZV9zZXQge1xuJworICAgICAgICAnICBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xXSB7XG4nCisgICAgICAgICcgICAgaTogMjNcbicKKyAgICAgICAgJyAgfVxuJworICAgICAgICAnICBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yXSB7XG4nCisgICAgICAgICcgICAgc3RyOiBcImZvb1wiXG4nCisgICAgICAgICcgIH1cbicKKyAgICAgICAgJ31cbicpCisKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXQoKQorICAgIGV4dCA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbjMKKyAgICBtZXNzYWdlLkV4dGVuc2lvbnNbZXh0XS50ZXh0ID0gJ2JhcicKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKSwKKyAgICAgICAgJ1tnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24zXSB7XG4nCisgICAgICAgICcgIHRleHQ6IFwiYmFyXCJcbicKKyAgICAgICAgJ31cbicpCisKKyAgZGVmIHRlc3RQcmludE1lc3NhZ2VTZXRCeUZpZWxkTnVtYmVyKHNlbGYpOgorICAgIG91dCA9IHRleHRfZm9ybWF0LlRleHRXcml0ZXIoRmFsc2UpCisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyKCkKKyAgICBleHQxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIGV4dDIgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCisgICAgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDFdLmkgPSAyMworICAgIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQyXS5zdHIgPSAnZm9vJworICAgIHRleHRfZm9ybWF0LlByaW50TWVzc2FnZShtZXNzYWdlLCBvdXQsIHVzZV9maWVsZF9udW1iZXI9VHJ1ZSkKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQob3V0LmdldHZhbHVlKCksICcxIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgMTU0NTAwOCB7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgMTU6IDIzXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgMTU0Nzc2OSB7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgMjU6IFwiZm9vXCJcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfVxuJykKKyAgICBvdXQuY2xvc2UoKQorCisgIGRlZiB0ZXN0UHJpbnRNZXNzYWdlU2V0QXNPbmVMaW5lKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAgZXh0MSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlX3NldF9leHRlbnNpb24KKyAgICBleHQyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQxXS5pID0gMjMKKyAgICBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0Ml0uc3RyID0gJ2ZvbycKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCBhc19vbmVfbGluZT1UcnVlKSwKKyAgICAgICAgJ21lc3NhZ2Vfc2V0IHsnCisgICAgICAgICcgW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMV0geycKKyAgICAgICAgJyBpOiAyMycKKyAgICAgICAgJyB9JworICAgICAgICAnIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjJdIHsnCisgICAgICAgICcgc3RyOiBcImZvb1wiJworICAgICAgICAnIH0nCisgICAgICAgICcgfScpCisKKyAgZGVmIHRlc3RQYXJzZU1lc3NhZ2VTZXQoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHQgPSAoJ3JlcGVhdGVkX3VpbnQ2NDogMVxuJyAncmVwZWF0ZWRfdWludDY0OiAyXG4nKQorICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHQsIG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NFswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0WzFdKQorCisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyKCkKKyAgICB0ZXh0ID0gKCdtZXNzYWdlX3NldCB7XG4nCisgICAgICAgICAgICAnICBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xXSB7XG4nCisgICAgICAgICAgICAnICAgIGk6IDIzXG4nCisgICAgICAgICAgICAnICB9XG4nCisgICAgICAgICAgICAnICBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yXSB7XG4nCisgICAgICAgICAgICAnICAgIHN0cjogXCJmb29cIlxuJworICAgICAgICAgICAgJyAgfVxuJworICAgICAgICAgICAgJ31cbicpCisgICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSkKKyAgICBleHQxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIGV4dDIgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDFdLmkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnZm9vJywgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDJdLnN0cikKKworICBkZWYgdGVzdEV4dGVuc2lvbkluc2lkZUFueU1lc3NhZ2Uoc2VsZik6CisgICAgbWVzc2FnZSA9IHRlc3RfZXh0ZW5kX2FueS5UZXN0QW55KCkKKyAgICB0ZXh0ID0gKCd2YWx1ZSB7XG4nCisgICAgICAgICAgICAnICBbdHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuaW50ZXJuYWwuVGVzdEFueV0ge1xuJworICAgICAgICAgICAgJyAgICBbZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLlRlc3RBbnlFeHRlbnNpb24xLmV4dGVuc2lvbjFdIHtcbicKKyAgICAgICAgICAgICcgICAgICBpOiAxMFxuJworICAgICAgICAgICAgJyAgICB9XG4nCisgICAgICAgICAgICAnICB9XG4nCisgICAgICAgICAgICAnfVxuJykKKyAgICB0ZXh0X2Zvcm1hdC5NZXJnZSh0ZXh0LCBtZXNzYWdlLCBkZXNjcmlwdG9yX3Bvb2w9ZGVzY3JpcHRvcl9wb29sLkRlZmF1bHQoKSkKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZygKKyAgICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3JfcG9vbD1kZXNjcmlwdG9yX3Bvb2wuRGVmYXVsdCgpKSwKKyAgICAgICAgdGV4dCkKKworICBkZWYgdGVzdFBhcnNlTWVzc2FnZUJ5RmllbGROdW1iZXIoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHQgPSAoJzM0OiAxXG4nICdyZXBlYXRlZF91aW50NjQ6IDJcbicpCisgICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSwgYWxsb3dfZmllbGRfbnVtYmVyPVRydWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NFswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0WzFdKQorCisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyKCkKKyAgICB0ZXh0ID0gKCcxIHtcbicKKyAgICAgICAgICAgICcgIDE1NDUwMDgge1xuJworICAgICAgICAgICAgJyAgICAxNTogMjNcbicKKyAgICAgICAgICAgICcgIH1cbicKKyAgICAgICAgICAgICcgIDE1NDc3Njkge1xuJworICAgICAgICAgICAgJyAgICAyNTogXCJmb29cIlxuJworICAgICAgICAgICAgJyAgfVxuJworICAgICAgICAgICAgJ31cbicpCisgICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSwgYWxsb3dfZmllbGRfbnVtYmVyPVRydWUpCisgICAgZXh0MSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlX3NldF9leHRlbnNpb24KKyAgICBleHQyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQxXS5pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbycsIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQyXS5zdHIpCisKKyAgICAjIENhbid0IHBhcnNlIGZpZWxkIG51bWJlciB3aXRob3V0IHNldCBhbGxvd19maWVsZF9udW1iZXI9VHJ1ZS4KKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dCA9ICczNDoxXG4nCisgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgKHInMToxIDogTWVzc2FnZSB0eXBlICJcdysuVGVzdEFsbFR5cGVzIiBoYXMgbm8gZmllbGQgbmFtZWQgJworICAgICAgICAgciciMzQiLicpLCB0ZXh0X2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKKworICAgICMgQ2FuJ3QgcGFyc2UgaWYgZmllbGQgbnVtYmVyIGlzIG5vdCBmb3VuZC4KKyAgICB0ZXh0ID0gJzEyMzQ6MVxuJworICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgIChyJzE6MSA6IE1lc3NhZ2UgdHlwZSAiXHcrLlRlc3RBbGxUeXBlcyIgaGFzIG5vIGZpZWxkIG5hbWVkICcKKyAgICAgICAgIHInIjEyMzQiLicpLAorICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZSwKKyAgICAgICAgdGV4dCwKKyAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgYWxsb3dfZmllbGRfbnVtYmVyPVRydWUpCisKKyAgZGVmIHRlc3RQcmludEFsbEV4dGVuc2lvbnMoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgdGVzdF91dGlsLlNldEFsbEV4dGVuc2lvbnMobWVzc2FnZSkKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlbkZpbGUoCisgICAgICAgIHNlbGYuUmVtb3ZlUmVkdW5kYW50WmVyb3ModGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpKSwKKyAgICAgICAgJ3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQnKQorCisgIGRlZiB0ZXN0UHJpbnRBbGxFeHRlbnNpb25zUG9pbnR5KHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UpCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5GaWxlKAorICAgICAgICBzZWxmLlJlbW92ZVJlZHVuZGFudFplcm9zKHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZygKKyAgICAgICAgICAgIG1lc3NhZ2UsIHBvaW50eV9icmFja2V0cz1UcnVlKSksCisgICAgICAgICd0ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGFfcG9pbnR5LnR4dCcpCisKKyAgZGVmIHRlc3RQYXJzZUdvbGRlbkV4dGVuc2lvbnMoc2VsZik6CisgICAgZ29sZGVuX3RleHQgPSAnXG4nLmpvaW4oc2VsZi5SZWFkR29sZGVuKAorICAgICAgICAndGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dCcpKQorICAgIHBhcnNlZF9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXh0X2Zvcm1hdC5QYXJzZShnb2xkZW5fdGV4dCwgcGFyc2VkX21lc3NhZ2UpCisKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RQYXJzZUFsbEV4dGVuc2lvbnMoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgdGVzdF91dGlsLlNldEFsbEV4dGVuc2lvbnMobWVzc2FnZSkKKyAgICBhc2NpaV90ZXh0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpCisKKyAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgdGV4dF9mb3JtYXQuUGFyc2UoYXNjaWlfdGV4dCwgcGFyc2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKworICBkZWYgdGVzdFBhcnNlQWxsb3dlZFVua25vd25FeHRlbnNpb24oc2VsZik6CisgICAgIyBTa2lwIG92ZXIgdW5rbm93biBleHRlbnNpb24gY29ycmVjdGx5LgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAgdGV4dCA9ICgnbWVzc2FnZV9zZXQge1xuJworICAgICAgICAgICAgJyAgW3Vua25vd25fZXh0ZW5zaW9uXSB7XG4nCisgICAgICAgICAgICAnICAgIGk6IDIzXG4nCisgICAgICAgICAgICAnICAgIHJlcGVhdGVkX2k6IFtdXG4nCisgICAgICAgICAgICAnICAgIGJpbjogIlx4ZTAiXG4nCisgICAgICAgICAgICAnICAgIFtuZXN0ZWRfdW5rbm93bl9leHRdOiB7XG4nCisgICAgICAgICAgICAnICAgICAgaTogMjNcbicKKyAgICAgICAgICAgICcgICAgICByZXBlYXRlZF9pOiBbMSwgMl1cbicKKyAgICAgICAgICAgICcgICAgICB4OiB4XG4nCisgICAgICAgICAgICAnICAgICAgdGVzdDogInRlc3Rfc3RyaW5nIlxuJworICAgICAgICAgICAgJyAgICAgIGZsb2F0eV9mbG9hdDogLTAuMzE1XG4nCisgICAgICAgICAgICAnICAgICAgbnVtOiAtaW5mXG4nCisgICAgICAgICAgICAnICAgICAgbXVsdGlsaW5lX3N0cjogImFiYyJcbicKKyAgICAgICAgICAgICcgICAgICAgICAgImRlZiJcbicKKyAgICAgICAgICAgICcgICAgICAgICAgInh5ei4iXG4nCisgICAgICAgICAgICAnICAgICAgW25lc3RlZF91bmtub3duX2V4dC5leHRdOiA8XG4nCisgICAgICAgICAgICAnICAgICAgICBpOiAyM1xuJworICAgICAgICAgICAgJyAgICAgICAgaTogMjRcbicKKyAgICAgICAgICAgICcgICAgICAgIHBvaW50ZmxvYXQ6IC4zXG4nCisgICAgICAgICAgICAnICAgICAgICB0ZXN0OiAidGVzdF9zdHJpbmciXG4nCisgICAgICAgICAgICAnICAgICAgICByZXBlYXRlZF90ZXN0OiBbInRlc3Rfc3RyaW5nMSIsICJ0ZXN0X3N0cmluZzIiXVxuJworICAgICAgICAgICAgJyAgICAgICAgZmxvYXR5X2Zsb2F0OiAtMC4zMTVcbicKKyAgICAgICAgICAgICcgICAgICAgIG51bTogLWluZlxuJworICAgICAgICAgICAgJyAgICAgICAgbG9uZ19zdHJpbmc6ICJ0ZXN0IiAidGVzdDIiIFxuJworICAgICAgICAgICAgJyAgICAgID5cbicKKyAgICAgICAgICAgICcgICAgfVxuJworICAgICAgICAgICAgJyAgfVxuJworICAgICAgICAgICAgJyAgW3Vua25vd25fZXh0ZW5zaW9uXTogNVxuJworICAgICAgICAgICAgJyAgW3Vua25vd25fZXh0ZW5zaW9uX3dpdGhfbnVtYmVyX2ZpZWxkXSB7XG4nCisgICAgICAgICAgICAnICAgIDE6ICJzb21lX2ZpZWxkIlxuJworICAgICAgICAgICAgJyAgICAyOiAtMC40NTFcbicKKyAgICAgICAgICAgICcgIH1cbicKKyAgICAgICAgICAgICd9XG4nKQorICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHQsIG1lc3NhZ2UsIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uPVRydWUpCisgICAgZ29sZGVuID0gJ21lc3NhZ2Vfc2V0IHtcbn1cbicKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQodGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpLCBnb2xkZW4pCisKKyAgICAjIENhdGNoIHBhcnNlIGVycm9ycyBpbiB1bmtub3duIGV4dGVuc2lvbi4KKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIoKQorICAgIG1hbGZvcm1lZCA9ICgnbWVzc2FnZV9zZXQge1xuJworICAgICAgICAgICAgICAgICAnICBbdW5rbm93bl9leHRlbnNpb25dIHtcbicKKyAgICAgICAgICAgICAgICAgJyAgICBpOlxuJyAgIyBNaXNzaW5nIHZhbHVlLgorICAgICAgICAgICAgICAgICAnICB9XG4nCisgICAgICAgICAgICAgICAgICd9XG4nKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICdJbnZhbGlkIGZpZWxkIHZhbHVlOiB9JywKKyAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsCisgICAgICAgIG1hbGZvcm1lZCwKKyAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgYWxsb3dfdW5rbm93bl9leHRlbnNpb249VHJ1ZSkKKworICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAgbWFsZm9ybWVkID0gKCdtZXNzYWdlX3NldCB7XG4nCisgICAgICAgICAgICAgICAgICcgIFt1bmtub3duX2V4dGVuc2lvbl0ge1xuJworICAgICAgICAgICAgICAgICAnICAgIHN0cjogIm1hbGZvcm1lZCBzdHJpbmdcbicgICMgTWlzc2luZyBjbG9zaW5nIHF1b3RlLgorICAgICAgICAgICAgICAgICAnICB9XG4nCisgICAgICAgICAgICAgICAgICd9XG4nKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICdJbnZhbGlkIGZpZWxkIHZhbHVlOiAiJywKKyAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsCisgICAgICAgIG1hbGZvcm1lZCwKKyAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgYWxsb3dfdW5rbm93bl9leHRlbnNpb249VHJ1ZSkKKworICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAgbWFsZm9ybWVkID0gKCdtZXNzYWdlX3NldCB7XG4nCisgICAgICAgICAgICAgICAgICcgIFt1bmtub3duX2V4dGVuc2lvbl0ge1xuJworICAgICAgICAgICAgICAgICAnICAgIHN0cjogIm1hbGZvcm1lZFxuIG11bHRpbGluZVxuIHN0cmluZ1xuJworICAgICAgICAgICAgICAgICAnICB9XG4nCisgICAgICAgICAgICAgICAgICd9XG4nKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICdJbnZhbGlkIGZpZWxkIHZhbHVlOiAiJywKKyAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsCisgICAgICAgIG1hbGZvcm1lZCwKKyAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgYWxsb3dfdW5rbm93bl9leHRlbnNpb249VHJ1ZSkKKworICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAgbWFsZm9ybWVkID0gKCdtZXNzYWdlX3NldCB7XG4nCisgICAgICAgICAgICAgICAgICcgIFttYWxmb3JtZWRfZXh0ZW5zaW9uXSA8XG4nCisgICAgICAgICAgICAgICAgICcgICAgaTogLTVcbicKKyAgICAgICAgICAgICAgICAgJyAgXG4nICAjIE1pc3NpbmcgJz4nIGhlcmUuCisgICAgICAgICAgICAgICAgICd9XG4nKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICc1OjEgOiBcJ31cJzogRXhwZWN0ZWQgIj4iLicsCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlLAorICAgICAgICBtYWxmb3JtZWQsCisgICAgICAgIG1lc3NhZ2UsCisgICAgICAgIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uPVRydWUpCisKKyAgICAjIERvbid0IGFsbG93IHVua25vd24gZmllbGRzIHdpdGggYWxsb3dfdW5rbm93bl9leHRlbnNpb249VHJ1ZS4KKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIoKQorICAgIG1hbGZvcm1lZCA9ICgnbWVzc2FnZV9zZXQge1xuJworICAgICAgICAgICAgICAgICAnICB1bmtub3duX2ZpZWxkOiB0cnVlXG4nCisgICAgICAgICAgICAgICAgICd9XG4nKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICgnMjozIDogTWVzc2FnZSB0eXBlICcKKyAgICAgICAgICcicHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXQiIGhhcyBubycKKyAgICAgICAgICcgZmllbGQgbmFtZWQgInVua25vd25fZmllbGQiLicpLAorICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZSwKKyAgICAgICAgbWFsZm9ybWVkLAorICAgICAgICBtZXNzYWdlLAorICAgICAgICBhbGxvd191bmtub3duX2V4dGVuc2lvbj1UcnVlKQorCisgICAgIyBQYXJzZSBrbm93biBleHRlbnNpb24gY29ycmVjdGx5LgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAgdGV4dCA9ICgnbWVzc2FnZV9zZXQge1xuJworICAgICAgICAgICAgJyAgW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMV0ge1xuJworICAgICAgICAgICAgJyAgICBpOiAyM1xuJworICAgICAgICAgICAgJyAgfVxuJworICAgICAgICAgICAgJyAgW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMl0ge1xuJworICAgICAgICAgICAgJyAgICBzdHI6IFwiZm9vXCJcbicKKyAgICAgICAgICAgICcgIH1cbicKKyAgICAgICAgICAgICd9XG4nKQorICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHQsIG1lc3NhZ2UsIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uPVRydWUpCisgICAgZXh0MSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlX3NldF9leHRlbnNpb24KKyAgICBleHQyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQxXS5pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbycsIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQyXS5zdHIpCisKKyAgZGVmIHRlc3RQYXJzZUJhZElkZW50aWZpZXIoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHQgPSAoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHsgImJiIjogMSB9JykKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IpIGFzIGU6CisgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGUuZXhjZXB0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICcxOjI3IDogXCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7ICJiYiI6IDEgfVwnOiAnCisgICAgICAgICAgICAgICAgICAgICAnRXhwZWN0ZWQgaWRlbnRpZmllciBvciBudW1iZXIsIGdvdCAiYmIiLicpCisKKyAgZGVmIHRlc3RQYXJzZUJhZEV4dGVuc2lvbihzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXh0ID0gJ1t1bmtub3duX2V4dGVuc2lvbl06IDhcbicKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAnMToyIDogRXh0ZW5zaW9uICJ1bmtub3duX2V4dGVuc2lvbiIgbm90IHJlZ2lzdGVyZWQuJywKKyAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICgnMToyIDogTWVzc2FnZSB0eXBlICJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMiIGRvZXMgbm90IGhhdmUgJworICAgICAgICAgJ2V4dGVuc2lvbnMuJyksIHRleHRfZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0UGFyc2VOdW1lcmljVW5rbm93bkVudW0oc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHQgPSAnb3B0aW9uYWxfbmVzdGVkX2VudW06IDEwMCcKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAocicxOjIzIDogXCdvcHRpb25hbF9uZXN0ZWRfZW51bTogMTAwXCc6ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ0VudW0gdHlwZSAiXHcrLlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtIiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidoYXMgbm8gdmFsdWUgd2l0aCBudW1iZXIgMTAwLicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCisKKyAgZGVmIHRlc3RNZXJnZUR1cGxpY2F0ZUV4dGVuc2lvblNjYWxhcnMoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgdGV4dCA9ICgnW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl06IDQyICcKKyAgICAgICAgICAgICdbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXTogNjcnKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg2NywKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSkKKworICBkZWYgdGVzdFBhcnNlRHVwbGljYXRlRXh0ZW5zaW9uU2NhbGFycyhzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXh0ID0gKCdbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXTogNDIgJworICAgICAgICAgICAgJ1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dOiA2NycpCisgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgKCcxOjk2IDogTWVzc2FnZSB0eXBlICJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucyIgJworICAgICAgICAgJ3Nob3VsZCBub3QgaGF2ZSBtdWx0aXBsZSAnCisgICAgICAgICAnInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiIgZXh0ZW5zaW9ucy4nKSwKKyAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCisKKyAgZGVmIHRlc3RQYXJzZUR1cGxpY2F0ZUV4dGVuc2lvbk1lc3NhZ2VzKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHRleHQgPSAoJ1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dOiB7fSAnCisgICAgICAgICAgICAnW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl06IHt9JykKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAoJzE6MTE0IDogTWVzc2FnZSB0eXBlICJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucyIgJworICAgICAgICAgJ3Nob3VsZCBub3QgaGF2ZSBtdWx0aXBsZSAnCisgICAgICAgICAnInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiIgZXh0ZW5zaW9ucy4nKSwKKyAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCisKKyAgZGVmIHRlc3RQYXJzZUdyb3VwTm90Q2xvc2VkKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ1JlcGVhdGVkR3JvdXA6IDwnCisgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleCh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCAnMToxNiA6IEV4cGVjdGVkICI+Ii4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCisgICAgdGV4dCA9ICdSZXBlYXRlZEdyb3VwOiB7JworICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgodGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgJzE6MTYgOiBFeHBlY3RlZCAifSIuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0UGFyc2VFbXB0eUdyb3VwKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ09wdGlvbmFsR3JvdXA6IHt9JworICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHQsIG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsZ3JvdXAnKSkKKworICAgIG1lc3NhZ2UuQ2xlYXIoKQorCisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHQgPSAnT3B0aW9uYWxHcm91cDogPD4nCisgICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxncm91cCcpKQorCisgICMgTWFwcyBhcmVuJ3QgcmVhbGx5IHByb3RvMi1vbmx5LCBidXQgb3VyIHRlc3Qgc2NoZW1hIG9ubHkgaGFzIG1hcHMgZm9yCisgICMgcHJvdG8yLgorICBkZWYgdGVzdFBhcnNlTWFwKHNlbGYpOgorICAgIHRleHQgPSAoJ21hcF9pbnQzMl9pbnQzMiB7XG4nCisgICAgICAgICAgICAnICBrZXk6IC0xMjNcbicKKyAgICAgICAgICAgICcgIHZhbHVlOiAtNDU2XG4nCisgICAgICAgICAgICAnfVxuJworICAgICAgICAgICAgJ21hcF9pbnQ2NF9pbnQ2NCB7XG4nCisgICAgICAgICAgICAnICBrZXk6IC04NTg5OTM0NTkyXG4nCisgICAgICAgICAgICAnICB2YWx1ZTogLTE3MTc5ODY5MTg0XG4nCisgICAgICAgICAgICAnfVxuJworICAgICAgICAgICAgJ21hcF91aW50MzJfdWludDMyIHtcbicKKyAgICAgICAgICAgICcgIGtleTogMTIzXG4nCisgICAgICAgICAgICAnICB2YWx1ZTogNDU2XG4nCisgICAgICAgICAgICAnfVxuJworICAgICAgICAgICAgJ21hcF91aW50NjRfdWludDY0IHtcbicKKyAgICAgICAgICAgICcgIGtleTogODU4OTkzNDU5MlxuJworICAgICAgICAgICAgJyAgdmFsdWU6IDE3MTc5ODY5MTg0XG4nCisgICAgICAgICAgICAnfVxuJworICAgICAgICAgICAgJ21hcF9zdHJpbmdfc3RyaW5nIHtcbicKKyAgICAgICAgICAgICcgIGtleTogImFiYyJcbicKKyAgICAgICAgICAgICcgIHZhbHVlOiAiMTIzIlxuJworICAgICAgICAgICAgJ31cbicKKyAgICAgICAgICAgICdtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlIHtcbicKKyAgICAgICAgICAgICcgIGtleTogMTExXG4nCisgICAgICAgICAgICAnICB2YWx1ZSB7XG4nCisgICAgICAgICAgICAnICAgIGM6IDVcbicKKyAgICAgICAgICAgICcgIH1cbicKKyAgICAgICAgICAgICd9XG4nKQorICAgIG1lc3NhZ2UgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQorICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHQsIG1lc3NhZ2UpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKC00NTYsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyWy0xMjNdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTIqKjM0LCBtZXNzYWdlLm1hcF9pbnQ2NF9pbnQ2NFstMioqMzNdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDU2LCBtZXNzYWdlLm1hcF91aW50MzJfdWludDMyWzEyM10pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyKiozNCwgbWVzc2FnZS5tYXBfdWludDY0X3VpbnQ2NFsyKiozM10pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnMTIzJywgbWVzc2FnZS5tYXBfc3RyaW5nX3N0cmluZ1snYWJjJ10pCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBtZXNzYWdlLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMTExXS5jKQorCisKK2NsYXNzIFByb3RvM1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdFByaW50TWVzc2FnZUV4cGFuZEFueShzZWxmKToKKyAgICBwYWNrZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5PbmVTdHJpbmcoKQorICAgIHBhY2tlZF9tZXNzYWdlLmRhdGEgPSAnc3RyaW5nJworICAgIG1lc3NhZ2UgPSBhbnlfdGVzdF9wYjIuVGVzdEFueSgpCisgICAgbWVzc2FnZS5hbnlfdmFsdWUuUGFjayhwYWNrZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcG9vbD1kZXNjcmlwdG9yX3Bvb2wuRGVmYXVsdCgpKSwKKyAgICAgICAgJ2FueV92YWx1ZSB7XG4nCisgICAgICAgICcgIFt0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvYnVmX3VuaXR0ZXN0Lk9uZVN0cmluZ10ge1xuJworICAgICAgICAnICAgIGRhdGE6ICJzdHJpbmciXG4nCisgICAgICAgICcgIH1cbicKKyAgICAgICAgJ31cbicpCisKKyAgZGVmIHRlc3RUb3BBbnlNZXNzYWdlKHNlbGYpOgorICAgIHBhY2tlZF9tc2cgPSB1bml0dGVzdF9wYjIuT25lU3RyaW5nKCkKKyAgICBtc2cgPSBhbnlfcGIyLkFueSgpCisgICAgbXNnLlBhY2socGFja2VkX21zZykKKyAgICB0ZXh0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1zZykKKyAgICBvdGhlcl9tc2cgPSB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBhbnlfcGIyLkFueSgpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBvdGhlcl9tc2cpCisKKyAgZGVmIHRlc3RQcmludE1lc3NhZ2VFeHBhbmRBbnlSZXBlYXRlZChzZWxmKToKKyAgICBwYWNrZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5PbmVTdHJpbmcoKQorICAgIG1lc3NhZ2UgPSBhbnlfdGVzdF9wYjIuVGVzdEFueSgpCisgICAgcGFja2VkX21lc3NhZ2UuZGF0YSA9ICdzdHJpbmcwJworICAgIG1lc3NhZ2UucmVwZWF0ZWRfYW55X3ZhbHVlLmFkZCgpLlBhY2socGFja2VkX21lc3NhZ2UpCisgICAgcGFja2VkX21lc3NhZ2UuZGF0YSA9ICdzdHJpbmcxJworICAgIG1lc3NhZ2UucmVwZWF0ZWRfYW55X3ZhbHVlLmFkZCgpLlBhY2socGFja2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpLAorICAgICAgICAncmVwZWF0ZWRfYW55X3ZhbHVlIHtcbicKKyAgICAgICAgJyAgW3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9idWZfdW5pdHRlc3QuT25lU3RyaW5nXSB7XG4nCisgICAgICAgICcgICAgZGF0YTogInN0cmluZzAiXG4nCisgICAgICAgICcgIH1cbicKKyAgICAgICAgJ31cbicKKyAgICAgICAgJ3JlcGVhdGVkX2FueV92YWx1ZSB7XG4nCisgICAgICAgICcgIFt0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvYnVmX3VuaXR0ZXN0Lk9uZVN0cmluZ10ge1xuJworICAgICAgICAnICAgIGRhdGE6ICJzdHJpbmcxIlxuJworICAgICAgICAnICB9XG4nCisgICAgICAgICd9XG4nKQorCisgIGRlZiB0ZXN0UHJpbnRNZXNzYWdlRXhwYW5kQW55RGVzY3JpcHRvclBvb2xNaXNzaW5nVHlwZShzZWxmKToKKyAgICBwYWNrZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5PbmVTdHJpbmcoKQorICAgIHBhY2tlZF9tZXNzYWdlLmRhdGEgPSAnc3RyaW5nJworICAgIG1lc3NhZ2UgPSBhbnlfdGVzdF9wYjIuVGVzdEFueSgpCisgICAgbWVzc2FnZS5hbnlfdmFsdWUuUGFjayhwYWNrZWRfbWVzc2FnZSkKKyAgICBlbXB0eV9wb29sID0gZGVzY3JpcHRvcl9wb29sLkRlc2NyaXB0b3JQb29sKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgZGVzY3JpcHRvcl9wb29sPWVtcHR5X3Bvb2wpLAorICAgICAgICAnYW55X3ZhbHVlIHtcbicKKyAgICAgICAgJyAgdHlwZV91cmw6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvYnVmX3VuaXR0ZXN0Lk9uZVN0cmluZyJcbicKKyAgICAgICAgJyAgdmFsdWU6ICJcXG5cXDAwNnN0cmluZyJcbicKKyAgICAgICAgJ31cbicpCisKKyAgZGVmIHRlc3RQcmludE1lc3NhZ2VFeHBhbmRBbnlQb2ludHlCcmFja2V0cyhzZWxmKToKKyAgICBwYWNrZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5PbmVTdHJpbmcoKQorICAgIHBhY2tlZF9tZXNzYWdlLmRhdGEgPSAnc3RyaW5nJworICAgIG1lc3NhZ2UgPSBhbnlfdGVzdF9wYjIuVGVzdEFueSgpCisgICAgbWVzc2FnZS5hbnlfdmFsdWUuUGFjayhwYWNrZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50eV9icmFja2V0cz1UcnVlKSwKKyAgICAgICAgJ2FueV92YWx1ZSA8XG4nCisgICAgICAgICcgIFt0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvYnVmX3VuaXR0ZXN0Lk9uZVN0cmluZ10gPFxuJworICAgICAgICAnICAgIGRhdGE6ICJzdHJpbmciXG4nCisgICAgICAgICcgID5cbicKKyAgICAgICAgJz5cbicpCisKKyAgZGVmIHRlc3RQcmludE1lc3NhZ2VFeHBhbmRBbnlBc09uZUxpbmUoc2VsZik6CisgICAgcGFja2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuT25lU3RyaW5nKCkKKyAgICBwYWNrZWRfbWVzc2FnZS5kYXRhID0gJ3N0cmluZycKKyAgICBtZXNzYWdlID0gYW55X3Rlc3RfcGIyLlRlc3RBbnkoKQorICAgIG1lc3NhZ2UuYW55X3ZhbHVlLlBhY2socGFja2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc19vbmVfbGluZT1UcnVlKSwKKyAgICAgICAgJ2FueV92YWx1ZSB7JworICAgICAgICAnIFt0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvYnVmX3VuaXR0ZXN0Lk9uZVN0cmluZ10nCisgICAgICAgICcgeyBkYXRhOiAic3RyaW5nIiB9ICcKKyAgICAgICAgJ30nKQorCisgIGRlZiB0ZXN0UHJpbnRNZXNzYWdlRXhwYW5kQW55QXNPbmVMaW5lUG9pbnR5QnJhY2tldHMoc2VsZik6CisgICAgcGFja2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuT25lU3RyaW5nKCkKKyAgICBwYWNrZWRfbWVzc2FnZS5kYXRhID0gJ3N0cmluZycKKyAgICBtZXNzYWdlID0gYW55X3Rlc3RfcGIyLlRlc3RBbnkoKQorICAgIG1lc3NhZ2UuYW55X3ZhbHVlLlBhY2socGFja2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc19vbmVfbGluZT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnR5X2JyYWNrZXRzPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3Bvb2w9ZGVzY3JpcHRvcl9wb29sLkRlZmF1bHQoKSksCisgICAgICAgICdhbnlfdmFsdWUgPCcKKyAgICAgICAgJyBbdHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2J1Zl91bml0dGVzdC5PbmVTdHJpbmddJworICAgICAgICAnIDwgZGF0YTogInN0cmluZyIgPiAnCisgICAgICAgICc+JykKKworICBkZWYgdGVzdFByaW50QW5kUGFyc2VNZXNzYWdlSW52YWxpZEFueShzZWxmKToKKyAgICBwYWNrZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5PbmVTdHJpbmcoKQorICAgIHBhY2tlZF9tZXNzYWdlLmRhdGEgPSAnc3RyaW5nJworICAgIG1lc3NhZ2UgPSBhbnlfdGVzdF9wYjIuVGVzdEFueSgpCisgICAgbWVzc2FnZS5hbnlfdmFsdWUuUGFjayhwYWNrZWRfbWVzc2FnZSkKKyAgICAjIE9ubHkgaW5jbHVkZSBzdHJpbmcgYWZ0ZXIgbGFzdCAnLycgaW4gdHlwZV91cmwuCisgICAgbWVzc2FnZS5hbnlfdmFsdWUudHlwZV91cmwgPSBtZXNzYWdlLmFueV92YWx1ZS5UeXBlTmFtZSgpCisgICAgdGV4dCA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHRleHQsICdhbnlfdmFsdWUge1xuJworICAgICAgICAnICB0eXBlX3VybDogInByb3RvYnVmX3VuaXR0ZXN0Lk9uZVN0cmluZyJcbicKKyAgICAgICAgJyAgdmFsdWU6ICJcXG5cXDAwNnN0cmluZyJcbicKKyAgICAgICAgJ31cbicpCisKKyAgICBwYXJzZWRfbWVzc2FnZSA9IGFueV90ZXN0X3BiMi5UZXN0QW55KCkKKyAgICB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBwYXJzZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgIGRlZiB0ZXN0VW5rbm93bkVudW1zKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wcm90bzNfYXJlbmFfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbWVzc2FnZTIgPSB1bml0dGVzdF9wcm90bzNfYXJlbmFfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfZW51bSA9IDk5OQorICAgIHRleHRfc3RyaW5nID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpCisgICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dF9zdHJpbmcsIG1lc3NhZ2UyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTk5LCBtZXNzYWdlMi5vcHRpb25hbF9uZXN0ZWRfZW51bSkKKworICBkZWYgdGVzdE1lcmdlRXhwYW5kZWRBbnkoc2VsZik6CisgICAgbWVzc2FnZSA9IGFueV90ZXN0X3BiMi5UZXN0QW55KCkKKyAgICB0ZXh0ID0gKCdhbnlfdmFsdWUge1xuJworICAgICAgICAgICAgJyAgW3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9idWZfdW5pdHRlc3QuT25lU3RyaW5nXSB7XG4nCisgICAgICAgICAgICAnICAgIGRhdGE6ICJzdHJpbmciXG4nCisgICAgICAgICAgICAnICB9XG4nCisgICAgICAgICAgICAnfVxuJykKKyAgICB0ZXh0X2Zvcm1hdC5NZXJnZSh0ZXh0LCBtZXNzYWdlKQorICAgIHBhY2tlZF9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLk9uZVN0cmluZygpCisgICAgbWVzc2FnZS5hbnlfdmFsdWUuVW5wYWNrKHBhY2tlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3N0cmluZycsIHBhY2tlZF9tZXNzYWdlLmRhdGEpCisgICAgbWVzc2FnZS5DbGVhcigpCisgICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSkKKyAgICBwYWNrZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5PbmVTdHJpbmcoKQorICAgIG1lc3NhZ2UuYW55X3ZhbHVlLlVucGFjayhwYWNrZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdzdHJpbmcnLCBwYWNrZWRfbWVzc2FnZS5kYXRhKQorCisgIGRlZiB0ZXN0TWVyZ2VFeHBhbmRlZEFueVJlcGVhdGVkKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBhbnlfdGVzdF9wYjIuVGVzdEFueSgpCisgICAgdGV4dCA9ICgncmVwZWF0ZWRfYW55X3ZhbHVlIHtcbicKKyAgICAgICAgICAgICcgIFt0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvYnVmX3VuaXR0ZXN0Lk9uZVN0cmluZ10ge1xuJworICAgICAgICAgICAgJyAgICBkYXRhOiAic3RyaW5nMCJcbicKKyAgICAgICAgICAgICcgIH1cbicKKyAgICAgICAgICAgICd9XG4nCisgICAgICAgICAgICAncmVwZWF0ZWRfYW55X3ZhbHVlIHtcbicKKyAgICAgICAgICAgICcgIFt0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvYnVmX3VuaXR0ZXN0Lk9uZVN0cmluZ10ge1xuJworICAgICAgICAgICAgJyAgICBkYXRhOiAic3RyaW5nMSJcbicKKyAgICAgICAgICAgICcgIH1cbicKKyAgICAgICAgICAgICd9XG4nKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1lc3NhZ2UpCisgICAgcGFja2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuT25lU3RyaW5nKCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2FueV92YWx1ZVswXS5VbnBhY2socGFja2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnc3RyaW5nMCcsIHBhY2tlZF9tZXNzYWdlLmRhdGEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9hbnlfdmFsdWVbMV0uVW5wYWNrKHBhY2tlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3N0cmluZzEnLCBwYWNrZWRfbWVzc2FnZS5kYXRhKQorCisgIGRlZiB0ZXN0TWVyZ2VFeHBhbmRlZEFueVBvaW50eUJyYWNrZXRzKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBhbnlfdGVzdF9wYjIuVGVzdEFueSgpCisgICAgdGV4dCA9ICgnYW55X3ZhbHVlIHtcbicKKyAgICAgICAgICAgICcgIFt0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvYnVmX3VuaXR0ZXN0Lk9uZVN0cmluZ10gPFxuJworICAgICAgICAgICAgJyAgICBkYXRhOiAic3RyaW5nIlxuJworICAgICAgICAgICAgJyAgPlxuJworICAgICAgICAgICAgJ31cbicpCisgICAgdGV4dF9mb3JtYXQuTWVyZ2UodGV4dCwgbWVzc2FnZSkKKyAgICBwYWNrZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5PbmVTdHJpbmcoKQorICAgIG1lc3NhZ2UuYW55X3ZhbHVlLlVucGFjayhwYWNrZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdzdHJpbmcnLCBwYWNrZWRfbWVzc2FnZS5kYXRhKQorCisgIGRlZiB0ZXN0TWVyZ2VBbHRlcm5hdGl2ZVVybChzZWxmKToKKyAgICBtZXNzYWdlID0gYW55X3Rlc3RfcGIyLlRlc3RBbnkoKQorICAgIHRleHQgPSAoJ2FueV92YWx1ZSB7XG4nCisgICAgICAgICAgICAnICBbdHlwZS5vdGhlcmFwaS5jb20vcHJvdG9idWZfdW5pdHRlc3QuT25lU3RyaW5nXSB7XG4nCisgICAgICAgICAgICAnICAgIGRhdGE6ICJzdHJpbmciXG4nCisgICAgICAgICAgICAnICB9XG4nCisgICAgICAgICAgICAnfVxuJykKKyAgICB0ZXh0X2Zvcm1hdC5NZXJnZSh0ZXh0LCBtZXNzYWdlKQorICAgIHBhY2tlZF9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLk9uZVN0cmluZygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgndHlwZS5vdGhlcmFwaS5jb20vcHJvdG9idWZfdW5pdHRlc3QuT25lU3RyaW5nJywKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYW55X3ZhbHVlLnR5cGVfdXJsKQorCisgIGRlZiB0ZXN0TWVyZ2VFeHBhbmRlZEFueURlc2NyaXB0b3JQb29sTWlzc2luZ1R5cGUoc2VsZik6CisgICAgbWVzc2FnZSA9IGFueV90ZXN0X3BiMi5UZXN0QW55KCkKKyAgICB0ZXh0ID0gKCdhbnlfdmFsdWUge1xuJworICAgICAgICAgICAgJyAgW3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9idWZfdW5pdHRlc3QuT25lU3RyaW5nXSB7XG4nCisgICAgICAgICAgICAnICAgIGRhdGE6ICJzdHJpbmciXG4nCisgICAgICAgICAgICAnICB9XG4nCisgICAgICAgICAgICAnfVxuJykKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IpIGFzIGU6CisgICAgICBlbXB0eV9wb29sID0gZGVzY3JpcHRvcl9wb29sLkRlc2NyaXB0b3JQb29sKCkKKyAgICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1lc3NhZ2UsIGRlc2NyaXB0b3JfcG9vbD1lbXB0eV9wb29sKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHN0cihlLmV4Y2VwdGlvbiksCisgICAgICAgICdUeXBlIHByb3RvYnVmX3VuaXR0ZXN0Lk9uZVN0cmluZyBub3QgZm91bmQgaW4gZGVzY3JpcHRvciBwb29sJykKKworICBkZWYgdGVzdE1lcmdlVW5leHBhbmRlZEFueShzZWxmKToKKyAgICB0ZXh0ID0gKCdhbnlfdmFsdWUge1xuJworICAgICAgICAgICAgJyAgdHlwZV91cmw6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvYnVmX3VuaXR0ZXN0Lk9uZVN0cmluZyJcbicKKyAgICAgICAgICAgICcgIHZhbHVlOiAiXFxuXFwwMDZzdHJpbmciXG4nCisgICAgICAgICAgICAnfVxuJykKKyAgICBtZXNzYWdlID0gYW55X3Rlc3RfcGIyLlRlc3RBbnkoKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1lc3NhZ2UpCisgICAgcGFja2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuT25lU3RyaW5nKCkKKyAgICBtZXNzYWdlLmFueV92YWx1ZS5VbnBhY2socGFja2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnc3RyaW5nJywgcGFja2VkX21lc3NhZ2UuZGF0YSkKKworICBkZWYgdGVzdE1lcmdlTWlzc2luZ0FueUVuZFRva2VuKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBhbnlfdGVzdF9wYjIuVGVzdEFueSgpCisgICAgdGV4dCA9ICgnYW55X3ZhbHVlIHtcbicKKyAgICAgICAgICAgICcgIFt0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvYnVmX3VuaXR0ZXN0Lk9uZVN0cmluZ10ge1xuJworICAgICAgICAgICAgJyAgICBkYXRhOiAic3RyaW5nIlxuJykKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IpIGFzIGU6CisgICAgICB0ZXh0X2Zvcm1hdC5NZXJnZSh0ZXh0LCBtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGUuZXhjZXB0aW9uKSwgJzM6MTEgOiBFeHBlY3RlZCAifSIuJykKKworICBkZWYgdGVzdFBhcnNlRXhwYW5kZWRBbnlMaXN0VmFsdWUoc2VsZik6CisgICAgYW55X21zZyA9IGFueV9wYjIuQW55KCkKKyAgICBhbnlfbXNnLlBhY2soc3RydWN0X3BiMi5MaXN0VmFsdWUoKSkKKyAgICBtc2cgPSBhbnlfdGVzdF9wYjIuVGVzdEFueShhbnlfdmFsdWU9YW55X21zZykKKyAgICB0ZXh0ID0gKCdhbnlfdmFsdWUge1xuJworICAgICAgICAgICAgJyAgW3R5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZV0ge31cbicKKyAgICAgICAgICAgICd9XG4nKQorICAgIHBhcnNlZF9tc2cgPSB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBhbnlfdGVzdF9wYjIuVGVzdEFueSgpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBwYXJzZWRfbXNnKQorCisgIGRlZiB0ZXN0UHJvdG8zT3B0aW9uYWwoc2VsZik6CisgICAgbXNnID0gdGVzdF9wcm90bzNfb3B0aW9uYWxfcGIyLlRlc3RQcm90bzNPcHRpb25hbCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobXNnKSwgJycpCisgICAgbXNnLm9wdGlvbmFsX2ludDMyID0gMAorICAgIG1zZy5vcHRpb25hbF9mbG9hdCA9IDAuMAorICAgIG1zZy5vcHRpb25hbF9zdHJpbmcgPSAnJworICAgIG1zZy5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDAKKyAgICB0ZXh0ID0gKCdvcHRpb25hbF9pbnQzMjogMFxuJworICAgICAgICAgICAgJ29wdGlvbmFsX2Zsb2F0OiAwLjBcbicKKyAgICAgICAgICAgICdvcHRpb25hbF9zdHJpbmc6ICIiXG4nCisgICAgICAgICAgICAnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Uge1xuJworICAgICAgICAgICAgJyAgYmI6IDBcbicKKyAgICAgICAgICAgICd9XG4nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1zZyksIHRleHQpCisgICAgbXNnMiA9IHRlc3RfcHJvdG8zX29wdGlvbmFsX3BiMi5UZXN0UHJvdG8zT3B0aW9uYWwoKQorICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHQsIG1zZzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobXNnMiksIHRleHQpCisKKworY2xhc3MgVG9rZW5pemVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RTaW1wbGVUb2tlbkNhc2VzKHNlbGYpOgorICAgIHRleHQgPSAoJ2lkZW50aWZpZXIxOiJzdHJpbmcxIlxuICAgICBcblxuJworICAgICAgICAgICAgJ2lkZW50aWZpZXIyIDogXG4gXG4xMjMgIFxuICBpZGVudGlmaWVyMyA6XCdzdHJpbmdcJ1xuJworICAgICAgICAgICAgJ2lkZW50aWZpRVJfNCA6IDEuMWUrMiBJRDU6LTAuMjMgSUQ2OlwnYWFhYVxcXCdiYmJiXCdcbicKKyAgICAgICAgICAgICdJRDcgOiAiYWFcXCJiYiJcblxuXG5cbiBJRDg6IHtBOmluZiBCOi1pbmYgQzp0cnVlIEQ6ZmFsc2V9XG4nCisgICAgICAgICAgICAnSUQ5OiAyMiBJRDEwOiAtMTExMTExMTExMTExMTExMTExIElEMTE6IC0yMlxuJworICAgICAgICAgICAgJ0lEMTI6IDIyMjIyMjIyMjIyMjIyMjIyMjIgSUQxMzogMS4yMzQ1NmYgSUQxNDogMS4yZSsyZiAnCisgICAgICAgICAgICAnZmFsc2VfYm9vbDogIDAgdHJ1ZV9CT09MOnQgXG4gdHJ1ZV9ib29sMTogIDEgZmFsc2VfQk9PTDE6ZiAnCisgICAgICAgICAgICAnRmFsc2VfYm9vbDogRmFsc2UgVHJ1ZV9ib29sOiBUcnVlIFg6aU5mIFk6LWluRiBaOm5BTicpCisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuVG9rZW5pemVyKHRleHQuc3BsaXRsaW5lcygpKQorICAgIG1ldGhvZHMgPSBbKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ2lkZW50aWZpZXIxJyksICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZVN0cmluZywgJ3N0cmluZzEnKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdpZGVudGlmaWVyMicpLCAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJbnRlZ2VyLCAxMjMpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ2lkZW50aWZpZXIzJyksICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZVN0cmluZywgJ3N0cmluZycpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ2lkZW50aWZpRVJfNCcpLCAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVGbG9hdCwgMS4xZSsyKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDUnKSwgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lRmxvYXQsIC0wLjIzKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDYnKSwgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lU3RyaW5nLCAnYWFhYVwnYmJiYicpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lENycpLCAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVTdHJpbmcsICdhYVwiYmInKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDgnKSwgJzonLCAneycsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnQScpLCAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVGbG9hdCwgZmxvYXQoJ2luZicpKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdCJyksICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUZsb2F0LCAtZmxvYXQoJ2luZicpKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdDJyksICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUJvb2wsIFRydWUpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0QnKSwgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lQm9vbCwgRmFsc2UpLCAnfScsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnSUQ5JyksICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUludGVnZXIsIDIyKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDEwJyksICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUludGVnZXIsIC0xMTExMTExMTExMTExMTExMTEpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lEMTEnKSwgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSW50ZWdlciwgLTIyKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDEyJyksICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUludGVnZXIsIDIyMjIyMjIyMjIyMjIyMjIyMjIpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lEMTMnKSwgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lRmxvYXQsIDEuMjM0NTYpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lEMTQnKSwgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lRmxvYXQsIDEuMmUrMiksCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnZmFsc2VfYm9vbCcpLCAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVCb29sLCBGYWxzZSksCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAndHJ1ZV9CT09MJyksICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUJvb2wsIFRydWUpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ3RydWVfYm9vbDEnKSwgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lQm9vbCwgVHJ1ZSksCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnZmFsc2VfQk9PTDEnKSwgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lQm9vbCwgRmFsc2UpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0ZhbHNlX2Jvb2wnKSwgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lQm9vbCwgRmFsc2UpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ1RydWVfYm9vbCcpLCAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVCb29sLCBUcnVlKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdYJyksICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUZsb2F0LCBmbG9hdCgnaW5mJykpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ1knKSwgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lRmxvYXQsIGZsb2F0KCctaW5mJykpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ1onKSwgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lRmxvYXQsIGZsb2F0KCduYW4nKSldCisKKyAgICBpID0gMAorICAgIHdoaWxlIG5vdCB0b2tlbml6ZXIuQXRFbmQoKToKKyAgICAgIG0gPSBtZXRob2RzW2ldCisgICAgICBpZiBpc2luc3RhbmNlKG0sIHN0cik6CisgICAgICAgIHRva2VuID0gdG9rZW5pemVyLnRva2VuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodG9rZW4sIG0pCisgICAgICAgIHRva2VuaXplci5OZXh0VG9rZW4oKQorICAgICAgZWxpZiBpc2luc3RhbmNlKG1bMV0sIGZsb2F0KSBhbmQgbWF0aC5pc25hbihtWzFdKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obVswXSgpKSkKKyAgICAgIGVsc2U6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVsxXSwgbVswXSgpKQorICAgICAgaSArPSAxCisKKyAgZGVmIHRlc3RDb25zdW1lQWJzdHJhY3RJbnRlZ2VycyhzZWxmKToKKyAgICAjIFRoaXMgdGVzdCBvbmx5IHRlc3RzIHRoZSBmYWlsdXJlcyBpbiB0aGUgaW50ZWdlciBwYXJzaW5nIG1ldGhvZHMgYXMgd2VsbAorICAgICMgYXMgdGhlICcwJyBzcGVjaWFsIGNhc2VzLgorICAgIGludDY0X21heCA9ICgxIDw8IDYzKSAtIDEKKyAgICB1aW50MzJfbWF4ID0gKDEgPDwgMzIpIC0gMQorICAgIHRleHQgPSAnLTEgJWQgJWQnICUgKHVpbnQzMl9tYXggKyAxLCBpbnQ2NF9tYXggKyAxKQorICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0LlRva2VuaXplcih0ZXh0LnNwbGl0bGluZXMoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCB0b2tlbml6ZXIuQ29uc3VtZUludGVnZXIoKSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwodWludDMyX21heCArIDEsIHRva2VuaXplci5Db25zdW1lSW50ZWdlcigpKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQ2NF9tYXggKyAxLCB0b2tlbml6ZXIuQ29uc3VtZUludGVnZXIoKSkKKyAgICBzZWxmLmFzc2VydFRydWUodG9rZW5pemVyLkF0RW5kKCkpCisKKyAgICB0ZXh0ID0gJy0wIDAgMCAxLjInCisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuVG9rZW5pemVyKHRleHQuc3BsaXRsaW5lcygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgdG9rZW5pemVyLkNvbnN1bWVJbnRlZ2VyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCB0b2tlbml6ZXIuQ29uc3VtZUludGVnZXIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIHRva2VuaXplci5UcnlDb25zdW1lSW50ZWdlcigpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIHRva2VuaXplci5UcnlDb25zdW1lSW50ZWdlcigpKQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvcik6CisgICAgICB0b2tlbml6ZXIuQ29uc3VtZUludGVnZXIoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMS4yLCB0b2tlbml6ZXIuQ29uc3VtZUZsb2F0KCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKHRva2VuaXplci5BdEVuZCgpKQorCisgIGRlZiB0ZXN0Q29uc3VtZUludGVnZXJzKHNlbGYpOgorICAgICMgVGhpcyB0ZXN0IG9ubHkgdGVzdHMgdGhlIGZhaWx1cmVzIGluIHRoZSBpbnRlZ2VyIHBhcnNpbmcgbWV0aG9kcyBhcyB3ZWxsCisgICAgIyBhcyB0aGUgJzAnIHNwZWNpYWwgY2FzZXMuCisgICAgaW50NjRfbWF4ID0gKDEgPDwgNjMpIC0gMQorICAgIHVpbnQzMl9tYXggPSAoMSA8PCAzMikgLSAxCisgICAgdGV4dCA9ICctMSAlZCAlZCcgJSAodWludDMyX21heCArIDEsIGludDY0X21heCArIDEpCisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuVG9rZW5pemVyKHRleHQuc3BsaXRsaW5lcygpKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgdGV4dF9mb3JtYXQuX0NvbnN1bWVVaW50MzIsIHRva2VuaXplcikKKyAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIHRleHRfZm9ybWF0Ll9Db25zdW1lVWludDY0LCB0b2tlbml6ZXIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgdGV4dF9mb3JtYXQuX0NvbnN1bWVJbnQzMih0b2tlbml6ZXIpKQorCisgICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2Zvcm1hdC5fQ29uc3VtZVVpbnQzMiwgdG9rZW5pemVyKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgdGV4dF9mb3JtYXQuX0NvbnN1bWVJbnQzMiwgdG9rZW5pemVyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodWludDMyX21heCArIDEsIHRleHRfZm9ybWF0Ll9Db25zdW1lSW50NjQodG9rZW5pemVyKSkKKworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgdGV4dF9mb3JtYXQuX0NvbnN1bWVJbnQ2NCwgdG9rZW5pemVyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50NjRfbWF4ICsgMSwgdGV4dF9mb3JtYXQuX0NvbnN1bWVVaW50NjQodG9rZW5pemVyKSkKKyAgICBzZWxmLmFzc2VydFRydWUodG9rZW5pemVyLkF0RW5kKCkpCisKKyAgICB0ZXh0ID0gJy0wIC0wIDAgMCcKKyAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5Ub2tlbml6ZXIodGV4dC5zcGxpdGxpbmVzKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCB0ZXh0X2Zvcm1hdC5fQ29uc3VtZVVpbnQzMih0b2tlbml6ZXIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgdGV4dF9mb3JtYXQuX0NvbnN1bWVVaW50NjQodG9rZW5pemVyKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHRleHRfZm9ybWF0Ll9Db25zdW1lVWludDMyKHRva2VuaXplcikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCB0ZXh0X2Zvcm1hdC5fQ29uc3VtZVVpbnQ2NCh0b2tlbml6ZXIpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b2tlbml6ZXIuQXRFbmQoKSkKKworICBkZWYgdGVzdENvbnN1bWVPY3RhbEludGVnZXJzKHNlbGYpOgorICAgICIiIlRlc3Qgc3VwcG9ydCBmb3IgQyBzdHlsZSBvY3RhbCBpbnRlZ2Vycy4iIiIKKyAgICB0ZXh0ID0gJzAwIC0wMCAwNCAwNzU1IC0wMTAgMDA3IC0wMDMzIDA4IC0wOSAwMScKKyAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5Ub2tlbml6ZXIodGV4dC5zcGxpdGxpbmVzKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCB0b2tlbml6ZXIuQ29uc3VtZUludGVnZXIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHRva2VuaXplci5Db25zdW1lSW50ZWdlcigpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgdG9rZW5pemVyLkNvbnN1bWVJbnRlZ2VyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwbzc1NSwgdG9rZW5pemVyLkNvbnN1bWVJbnRlZ2VyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtMG8xMCwgdG9rZW5pemVyLkNvbnN1bWVJbnRlZ2VyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg3LCB0b2tlbml6ZXIuQ29uc3VtZUludGVnZXIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKC0wbzAzMywgdG9rZW5pemVyLkNvbnN1bWVJbnRlZ2VyKCkpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yKToKKyAgICAgIHRva2VuaXplci5Db25zdW1lSW50ZWdlcigpICAjIDA4CisgICAgdG9rZW5pemVyLk5leHRUb2tlbigpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yKToKKyAgICAgIHRva2VuaXplci5Db25zdW1lSW50ZWdlcigpICAjIC0wOQorICAgIHRva2VuaXplci5OZXh0VG9rZW4oKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgdG9rZW5pemVyLkNvbnN1bWVJbnRlZ2VyKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKHRva2VuaXplci5BdEVuZCgpKQorCisgIGRlZiB0ZXN0Q29uc3VtZUJ5dGVTdHJpbmcoc2VsZik6CisgICAgdGV4dCA9ICcic3RyaW5nMVwnJworICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0LlRva2VuaXplcih0ZXh0LnNwbGl0bGluZXMoKSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUJ5dGVTdHJpbmcpCisKKyAgICB0ZXh0ID0gJ3N0cmluZzEiJworICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0LlRva2VuaXplcih0ZXh0LnNwbGl0bGluZXMoKSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUJ5dGVTdHJpbmcpCisKKyAgICB0ZXh0ID0gJ1xuIlxceHQiJworICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0LlRva2VuaXplcih0ZXh0LnNwbGl0bGluZXMoKSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUJ5dGVTdHJpbmcpCisKKyAgICB0ZXh0ID0gJ1xuIlxcIicKKyAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5Ub2tlbml6ZXIodGV4dC5zcGxpdGxpbmVzKCkpCisgICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgdG9rZW5pemVyLkNvbnN1bWVCeXRlU3RyaW5nKQorCisgICAgdGV4dCA9ICdcbiJcXHgiJworICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0LlRva2VuaXplcih0ZXh0LnNwbGl0bGluZXMoKSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUJ5dGVTdHJpbmcpCisKKyAgZGVmIHRlc3RDb25zdW1lQm9vbChzZWxmKToKKyAgICB0ZXh0ID0gJ25vdC1hLWJvb2wnCisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuVG9rZW5pemVyKHRleHQuc3BsaXRsaW5lcygpKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lQm9vbCkKKworICBkZWYgdGVzdFNraXBDb21tZW50KHNlbGYpOgorICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0LlRva2VuaXplcignIyBzb21lIGNvbW1lbnQnLnNwbGl0bGluZXMoKSkKKyAgICBzZWxmLmFzc2VydFRydWUodG9rZW5pemVyLkF0RW5kKCkpCisgICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgdG9rZW5pemVyLkNvbnN1bWVDb21tZW50KQorCisgIGRlZiB0ZXN0Q29uc3VtZUNvbW1lbnQoc2VsZik6CisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuVG9rZW5pemVyKCcjIHNvbWUgY29tbWVudCcuc3BsaXRsaW5lcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2NvbW1lbnRzPUZhbHNlKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UodG9rZW5pemVyLkF0RW5kKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnIyBzb21lIGNvbW1lbnQnLCB0b2tlbml6ZXIuQ29uc3VtZUNvbW1lbnQoKSkKKyAgICBzZWxmLmFzc2VydFRydWUodG9rZW5pemVyLkF0RW5kKCkpCisKKyAgZGVmIHRlc3RDb25zdW1lVHdvQ29tbWVudHMoc2VsZik6CisgICAgdGV4dCA9ICcjIHNvbWUgY29tbWVudFxuIyBhbm90aGVyIGNvbW1lbnQnCisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuVG9rZW5pemVyKHRleHQuc3BsaXRsaW5lcygpLCBza2lwX2NvbW1lbnRzPUZhbHNlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyMgc29tZSBjb21tZW50JywgdG9rZW5pemVyLkNvbnN1bWVDb21tZW50KCkpCisgICAgc2VsZi5hc3NlcnRGYWxzZSh0b2tlbml6ZXIuQXRFbmQoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCcjIGFub3RoZXIgY29tbWVudCcsIHRva2VuaXplci5Db25zdW1lQ29tbWVudCgpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b2tlbml6ZXIuQXRFbmQoKSkKKworICBkZWYgdGVzdENvbnN1bWVUcmFpbGluZ0NvbW1lbnQoc2VsZik6CisgICAgdGV4dCA9ICdzb21lX251bWJlcjogNFxuIyBzb21lIGNvbW1lbnQnCisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuVG9rZW5pemVyKHRleHQuc3BsaXRsaW5lcygpLCBza2lwX2NvbW1lbnRzPUZhbHNlKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lQ29tbWVudCkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3NvbWVfbnVtYmVyJywgdG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh0b2tlbml6ZXIudG9rZW4sICc6JykKKyAgICB0b2tlbml6ZXIuTmV4dFRva2VuKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUNvbW1lbnQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCB0b2tlbml6ZXIuQ29uc3VtZUludGVnZXIoKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKHRva2VuaXplci5BdEVuZCgpKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnIyBzb21lIGNvbW1lbnQnLCB0b2tlbml6ZXIuQ29uc3VtZUNvbW1lbnQoKSkKKyAgICBzZWxmLmFzc2VydFRydWUodG9rZW5pemVyLkF0RW5kKCkpCisKKyAgZGVmIHRlc3RDb25zdW1lTGluZUNvbW1lbnQoc2VsZik6CisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuVG9rZW5pemVyKCcjIHNvbWUgY29tbWVudCcuc3BsaXRsaW5lcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2NvbW1lbnRzPUZhbHNlKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UodG9rZW5pemVyLkF0RW5kKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgoRmFsc2UsICcjIHNvbWUgY29tbWVudCcpLAorICAgICAgICAgICAgICAgICAgICAgdG9rZW5pemVyLkNvbnN1bWVDb21tZW50T3JUcmFpbGluZ0NvbW1lbnQoKSkKKyAgICBzZWxmLmFzc2VydFRydWUodG9rZW5pemVyLkF0RW5kKCkpCisKKyAgZGVmIHRlc3RDb25zdW1lVHdvTGluZUNvbW1lbnRzKHNlbGYpOgorICAgIHRleHQgPSAnIyBzb21lIGNvbW1lbnRcbiMgYW5vdGhlciBjb21tZW50JworICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0LlRva2VuaXplcih0ZXh0LnNwbGl0bGluZXMoKSwgc2tpcF9jb21tZW50cz1GYWxzZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKChGYWxzZSwgJyMgc29tZSBjb21tZW50JyksCisgICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXIuQ29uc3VtZUNvbW1lbnRPclRyYWlsaW5nQ29tbWVudCgpKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UodG9rZW5pemVyLkF0RW5kKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgoRmFsc2UsICcjIGFub3RoZXIgY29tbWVudCcpLAorICAgICAgICAgICAgICAgICAgICAgdG9rZW5pemVyLkNvbnN1bWVDb21tZW50T3JUcmFpbGluZ0NvbW1lbnQoKSkKKyAgICBzZWxmLmFzc2VydFRydWUodG9rZW5pemVyLkF0RW5kKCkpCisKKyAgZGVmIHRlc3RDb25zdW1lQW5kQ2hlY2tUcmFpbGluZ0NvbW1lbnQoc2VsZik6CisgICAgdGV4dCA9ICdzb21lX251bWJlcjogNCAgIyBzb21lIGNvbW1lbnQnICAjIHRyYWlsaW5nIGNvbW1lbnQgb24gdGhlIHNhbWUgbGluZQorICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0LlRva2VuaXplcih0ZXh0LnNwbGl0bGluZXMoKSwgc2tpcF9jb21tZW50cz1GYWxzZSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIHRva2VuaXplci5Db25zdW1lQ29tbWVudE9yVHJhaWxpbmdDb21tZW50KQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnc29tZV9udW1iZXInLCB0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHRva2VuaXplci50b2tlbiwgJzonKQorICAgIHRva2VuaXplci5OZXh0VG9rZW4oKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgdG9rZW5pemVyLkNvbnN1bWVDb21tZW50T3JUcmFpbGluZ0NvbW1lbnQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCB0b2tlbml6ZXIuQ29uc3VtZUludGVnZXIoKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKHRva2VuaXplci5BdEVuZCgpKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgoVHJ1ZSwgJyMgc29tZSBjb21tZW50JyksCisgICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXIuQ29uc3VtZUNvbW1lbnRPclRyYWlsaW5nQ29tbWVudCgpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b2tlbml6ZXIuQXRFbmQoKSkKKworICBkZWYgdGVzdEhhc2hpbkNvbW1lbnQoc2VsZik6CisgICAgdGV4dCA9ICdzb21lX251bWJlcjogNCAgIyBzb21lIGNvbW1lbnQgIyBub3QgYSBuZXcgY29tbWVudCcKKyAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5Ub2tlbml6ZXIodGV4dC5zcGxpdGxpbmVzKCksIHNraXBfY29tbWVudHM9RmFsc2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnc29tZV9udW1iZXInLCB0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHRva2VuaXplci50b2tlbiwgJzonKQorICAgIHRva2VuaXplci5OZXh0VG9rZW4oKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgdG9rZW5pemVyLkNvbnN1bWVJbnRlZ2VyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgoVHJ1ZSwgJyMgc29tZSBjb21tZW50ICMgbm90IGEgbmV3IGNvbW1lbnQnKSwKKyAgICAgICAgICAgICAgICAgICAgIHRva2VuaXplci5Db25zdW1lQ29tbWVudE9yVHJhaWxpbmdDb21tZW50KCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKHRva2VuaXplci5BdEVuZCgpKQorCisgIGRlZiB0ZXN0SHVnZVN0cmluZyhzZWxmKToKKyAgICAjIFdpdGggcGF0aG9sb2dpYyBiYWNrdHJhY2tpbmcsIGZhaWxzIHdpdGggRm9yZ2UgT09NLgorICAgIHRleHQgPSAnIicgKyAnYScgKiAoMTAgKiAxMDI0ICogMTAyNCkgKyAnIicKKyAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5Ub2tlbml6ZXIodGV4dC5zcGxpdGxpbmVzKCksIHNraXBfY29tbWVudHM9RmFsc2UpCisgICAgdG9rZW5pemVyLkNvbnN1bWVTdHJpbmcoKQorCisKKyMgVGVzdHMgZm9yIHByZXR0eSBwcmludGVyIGZ1bmN0aW9uYWxpdHkuCitAX3BhcmFtZXRlcml6ZWQucGFyYW1ldGVycygodW5pdHRlc3RfcGIyKSwgKHVuaXR0ZXN0X3Byb3RvM19hcmVuYV9wYjIpKQorY2xhc3MgUHJldHR5UHJpbnRlclRlc3QoVGV4dEZvcm1hdEJhc2UpOgorCisgIGRlZiB0ZXN0UHJldHR5UHJpbnROb01hdGNoKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKworICAgIGRlZiBwcmludGVyKG1lc3NhZ2UsIGluZGVudCwgYXNfb25lX2xpbmUpOgorICAgICAgZGVsIG1lc3NhZ2UsIGluZGVudCwgYXNfb25lX2xpbmUKKyAgICAgIHJldHVybiBOb25lCisKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtc2cgPSBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbXNnLmJiID0gNDIKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZygKKyAgICAgICAgICAgIG1lc3NhZ2UsIGFzX29uZV9saW5lPVRydWUsIG1lc3NhZ2VfZm9ybWF0dGVyPXByaW50ZXIpLAorICAgICAgICAncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgeyBiYjogNDIgfScpCisKKyAgZGVmIHRlc3RQcmV0dHlQcmludE9uZUxpbmUoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorCisgICAgZGVmIHByaW50ZXIobSwgaW5kZW50LCBhc19vbmVfbGluZSk6CisgICAgICBkZWwgaW5kZW50LCBhc19vbmVfbGluZQorICAgICAgaWYgbS5ERVNDUklQVE9SID09IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1I6CisgICAgICAgIHJldHVybiAnTXkgbHVja3kgbnVtYmVyIGlzICVzJyAlIG0uYmIKKworICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIG1zZyA9IG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBtc2cuYmIgPSA0MgorICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKAorICAgICAgICAgICAgbWVzc2FnZSwgYXNfb25lX2xpbmU9VHJ1ZSwgbWVzc2FnZV9mb3JtYXR0ZXI9cHJpbnRlciksCisgICAgICAgICdyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7IE15IGx1Y2t5IG51bWJlciBpcyA0MiB9JykKKworICBkZWYgdGVzdFByZXR0eVByaW50TXVsdGlMaW5lKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKworICAgIGRlZiBwcmludGVyKG0sIGluZGVudCwgYXNfb25lX2xpbmUpOgorICAgICAgaWYgbS5ERVNDUklQVE9SID09IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1I6CisgICAgICAgIGxpbmVfZGVsaW1pbmF0b3IgPSAoJyAnIGlmIGFzX29uZV9saW5lIGVsc2UgJ1xuJykgKyAnICcgKiBpbmRlbnQKKyAgICAgICAgcmV0dXJuICdNeSBsdWNreSBudW1iZXIgaXM6JXMlcycgJSAobGluZV9kZWxpbWluYXRvciwgbS5iYikKKyAgICAgIHJldHVybiBOb25lCisKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtc2cgPSBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbXNnLmJiID0gNDIKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZygKKyAgICAgICAgICAgIG1lc3NhZ2UsIGFzX29uZV9saW5lPVRydWUsIG1lc3NhZ2VfZm9ybWF0dGVyPXByaW50ZXIpLAorICAgICAgICAncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgeyBNeSBsdWNreSBudW1iZXIgaXM6IDQyIH0nKQorICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKAorICAgICAgICAgICAgbWVzc2FnZSwgYXNfb25lX2xpbmU9RmFsc2UsIG1lc3NhZ2VfZm9ybWF0dGVyPXByaW50ZXIpLAorICAgICAgICAncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Uge1xuICBNeSBsdWNreSBudW1iZXIgaXM6XG4gIDQyXG59XG4nKQorCisgIGRlZiB0ZXN0UHJldHR5UHJpbnRFbnRpcmVNZXNzYWdlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKKworICAgIGRlZiBwcmludGVyKG0sIGluZGVudCwgYXNfb25lX2xpbmUpOgorICAgICAgZGVsIGluZGVudCwgYXNfb25lX2xpbmUKKyAgICAgIGlmIG0uREVTQ1JJUFRPUiA9PSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUjoKKyAgICAgICAgcmV0dXJuICdUaGUgaXMgdGhlIG1lc3NhZ2UhJworICAgICAgcmV0dXJuIE5vbmUKKworICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKAorICAgICAgICAgICAgbWVzc2FnZSwgYXNfb25lX2xpbmU9RmFsc2UsIG1lc3NhZ2VfZm9ybWF0dGVyPXByaW50ZXIpLAorICAgICAgICAnVGhlIGlzIHRoZSBtZXNzYWdlIVxuJykKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZygKKyAgICAgICAgICAgIG1lc3NhZ2UsIGFzX29uZV9saW5lPVRydWUsIG1lc3NhZ2VfZm9ybWF0dGVyPXByaW50ZXIpLAorICAgICAgICAnVGhlIGlzIHRoZSBtZXNzYWdlIScpCisKKyAgZGVmIHRlc3RQcmV0dHlQcmludE11bHRpcGxlUGFydHMoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgorCisgICAgZGVmIHByaW50ZXIobSwgaW5kZW50LCBhc19vbmVfbGluZSk6CisgICAgICBkZWwgaW5kZW50LCBhc19vbmVfbGluZQorICAgICAgaWYgbS5ERVNDUklQVE9SID09IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1I6CisgICAgICAgIHJldHVybiAnTXkgbHVja3kgbnVtYmVyIGlzICVzJyAlIG0uYmIKKyAgICAgIHJldHVybiBOb25lCisKKyAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2ludDMyID0gNjEKKyAgICBtc2cgPSBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbXNnLmJiID0gNDIKKyAgICBtc2cgPSBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbXNnLmJiID0gOTkKKyAgICBtc2cgPSBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCisgICAgbXNnLmJiID0gMQorICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKAorICAgICAgICAgICAgbWVzc2FnZSwgYXNfb25lX2xpbmU9VHJ1ZSwgbWVzc2FnZV9mb3JtYXR0ZXI9cHJpbnRlciksCisgICAgICAgICgnb3B0aW9uYWxfaW50MzI6IDYxICcKKyAgICAgICAgICdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7IE15IGx1Y2t5IG51bWJlciBpcyAxIH0gJworICAgICAgICAgJ3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsgTXkgbHVja3kgbnVtYmVyIGlzIDQyIH0gJworICAgICAgICAgJ3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsgTXkgbHVja3kgbnVtYmVyIGlzIDk5IH0nKSkKKworICAgIG91dCA9IHRleHRfZm9ybWF0LlRleHRXcml0ZXIoRmFsc2UpCisgICAgdGV4dF9mb3JtYXQuUHJpbnRGaWVsZCgKKyAgICAgICAgbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbCisgICAgICAgICAgICAnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnXSwKKyAgICAgICAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSwKKyAgICAgICAgb3V0LAorICAgICAgICBtZXNzYWdlX2Zvcm1hdHRlcj1wcmludGVyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7XG4gIE15IGx1Y2t5IG51bWJlciBpcyAxXG59XG4nLAorICAgICAgICBvdXQuZ2V0dmFsdWUoKSkKKyAgICBvdXQuY2xvc2UoKQorCisgICAgb3V0ID0gdGV4dF9mb3JtYXQuVGV4dFdyaXRlcihGYWxzZSkKKyAgICB0ZXh0X2Zvcm1hdC5QcmludEZpZWxkVmFsdWUoCisgICAgICAgIG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWworICAgICAgICAgICAgJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJ10sCisgICAgICAgIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UsCisgICAgICAgIG91dCwKKyAgICAgICAgbWVzc2FnZV9mb3JtYXR0ZXI9cHJpbnRlcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAne1xuICBNeSBsdWNreSBudW1iZXIgaXMgMVxufScsCisgICAgICAgIG91dC5nZXR2YWx1ZSgpKQorICAgIG91dC5jbG9zZSgpCisKKworY2xhc3MgV2hpdGVzcGFjZVRlc3QoVGV4dEZvcm1hdEJhc2UpOgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLm91dCA9IHRleHRfZm9ybWF0LlRleHRXcml0ZXIoRmFsc2UpCisgICAgc2VsZi5hZGRDbGVhbnVwKHNlbGYub3V0LmNsb3NlKQorICAgIHNlbGYubWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5OZXN0ZWRUZXN0QWxsVHlwZXMoKQorICAgIHNlbGYubWVzc2FnZS5jaGlsZC5wYXlsb2FkLm9wdGlvbmFsX3N0cmluZyA9ICd2YWx1ZScKKyAgICBzZWxmLmZpZWxkID0gc2VsZi5tZXNzYWdlLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ2NoaWxkJ10KKyAgICBzZWxmLnZhbHVlID0gc2VsZi5tZXNzYWdlLmNoaWxkCisKKyAgZGVmIHRlc3RNZXNzYWdlVG9TdHJpbmcoc2VsZik6CisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoc2VsZi5tZXNzYWdlKSwKKyAgICAgICAgdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIGNoaWxkIHsKKyAgICAgICAgICAgICAgcGF5bG9hZCB7CisgICAgICAgICAgICAgICAgb3B0aW9uYWxfc3RyaW5nOiAidmFsdWUiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICIiIikpCisKKyAgZGVmIHRlc3RQcmludE1lc3NhZ2Uoc2VsZik6CisgICAgdGV4dF9mb3JtYXQuUHJpbnRNZXNzYWdlKHNlbGYubWVzc2FnZSwgc2VsZi5vdXQpCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAorICAgICAgICBzZWxmLm91dC5nZXR2YWx1ZSgpLAorICAgICAgICB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgY2hpbGQgeworICAgICAgICAgICAgICBwYXlsb2FkIHsKKyAgICAgICAgICAgICAgICBvcHRpb25hbF9zdHJpbmc6ICJ2YWx1ZSIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgIiIiKSkKKworICBkZWYgdGVzdFByaW50RmllbGQoc2VsZik6CisgICAgdGV4dF9mb3JtYXQuUHJpbnRGaWVsZChzZWxmLmZpZWxkLCBzZWxmLnZhbHVlLCBzZWxmLm91dCkKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICAgIHNlbGYub3V0LmdldHZhbHVlKCksCisgICAgICAgIHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBjaGlsZCB7CisgICAgICAgICAgICAgIHBheWxvYWQgeworICAgICAgICAgICAgICAgIG9wdGlvbmFsX3N0cmluZzogInZhbHVlIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAiIiIpKQorCisgIGRlZiB0ZXN0UHJpbnRGaWVsZFZhbHVlKHNlbGYpOgorICAgIHRleHRfZm9ybWF0LlByaW50RmllbGRWYWx1ZSgKKyAgICAgICAgc2VsZi5maWVsZCwgc2VsZi52YWx1ZSwgc2VsZi5vdXQpCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAorICAgICAgICBzZWxmLm91dC5nZXR2YWx1ZSgpLAorICAgICAgICB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwYXlsb2FkIHsKKyAgICAgICAgICAgICAgICBvcHRpb25hbF9zdHJpbmc6ICJ2YWx1ZSIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSIiIikpCisKKworY2xhc3MgT3B0aW9uYWxDb2xvbk1lc3NhZ2VUb1N0cmluZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiB0ZXN0Rm9yY2VQcmludE9wdGlvbmFsQ29sb24oc2VsZik6CisgICAgcGFja2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuT25lU3RyaW5nKCkKKyAgICBwYWNrZWRfbWVzc2FnZS5kYXRhID0gJ3N0cmluZycKKyAgICBtZXNzYWdlID0gYW55X3Rlc3RfcGIyLlRlc3RBbnkoKQorICAgIG1lc3NhZ2UuYW55X3ZhbHVlLlBhY2socGFja2VkX21lc3NhZ2UpCisgICAgb3V0cHV0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKAorICAgICAgICBtZXNzYWdlLAorICAgICAgICBmb3JjZV9jb2xvbj1UcnVlKQorICAgIGV4cGVjdGVkID0gKCdhbnlfdmFsdWU6IHtcbicKKyAgICAgICAgICAgICAgICAnICBbdHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2J1Zl91bml0dGVzdC5PbmVTdHJpbmddOiB7XG4nCisgICAgICAgICAgICAgICAgJyAgICBkYXRhOiAic3RyaW5nIlxuJworICAgICAgICAgICAgICAgICcgIH1cbicKKyAgICAgICAgICAgICAgICAnfVxuJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBvdXRwdXQpCisKKyAgZGVmIHRlc3RQcmludFNob3J0Rm9ybWF0UmVwZWF0ZWRGaWVsZHMoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgb3V0cHV0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKAorICAgICAgICBtZXNzYWdlLCB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlcz1UcnVlLCBmb3JjZV9jb2xvbj1UcnVlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3JlcGVhdGVkX2ludDMyOiBbMV1cbicsIG91dHB1dCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdHlwZV9jaGVja2Vycy5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdHlwZV9jaGVja2Vycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTNlNzFmCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90eXBlX2NoZWNrZXJzLnB5CkBAIC0wLDAgKzEsNDM1IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlByb3ZpZGVzIHR5cGUgY2hlY2tpbmcgcm91dGluZXMuCisKK1RoaXMgbW9kdWxlIGRlZmluZXMgdHlwZSBjaGVja2luZyB1dGlsaXRpZXMgaW4gdGhlIGZvcm1zIG9mIGRpY3Rpb25hcmllczoKKworVkFMVUVfQ0hFQ0tFUlM6IEEgZGljdGlvbmFyeSBvZiBmaWVsZCB0eXBlcyBhbmQgYSB2YWx1ZSB2YWxpZGF0aW9uIG9iamVjdC4KK1RZUEVfVE9fQllURV9TSVpFX0ZOOiBBIGRpY3Rpb25hcnkgd2l0aCBmaWVsZCB0eXBlcyBhbmQgYSBzaXplIGNvbXB1dGluZworICBmdW5jdGlvbi4KK1RZUEVfVE9fU0VSSUFMSVpFX01FVEhPRDogQSBkaWN0aW9uYXJ5IHdpdGggZmllbGQgdHlwZXMgYW5kIHNlcmlhbGl6YXRpb24KKyAgZnVuY3Rpb24uCitGSUVMRF9UWVBFX1RPX1dJUkVfVFlQRTogQSBkaWN0aW9uYXJ5IHdpdGggZmllbGQgdHlwZWQgYW5kIHRoZWlyCisgIGNvcnJlc3BvbmRpbmcgd2lyZSB0eXBlcy4KK1RZUEVfVE9fREVTRVJJQUxJWkVfTUVUSE9EOiBBIGRpY3Rpb25hcnkgd2l0aCBmaWVsZCB0eXBlcyBhbmQgZGVzZXJpYWxpemF0aW9uCisgIGZ1bmN0aW9uLgorIiIiCisKK19fYXV0aG9yX18gPSAncm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbiknCisKK2ltcG9ydCBjdHlwZXMKK2ltcG9ydCBudW1iZXJzCisKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBkZWNvZGVyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZW5jb2RlcgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHdpcmVfZm9ybWF0Citmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgorCitfRmllbGREZXNjcmlwdG9yID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IKKworCitkZWYgVHJ1bmNhdGVUb0ZvdXJCeXRlRmxvYXQob3JpZ2luYWwpOgorICByZXR1cm4gY3R5cGVzLmNfZmxvYXQob3JpZ2luYWwpLnZhbHVlCisKKworZGVmIFRvU2hvcnRlc3RGbG9hdChvcmlnaW5hbCk6CisgICIiIlJldHVybnMgdGhlIHNob3J0ZXN0IGZsb2F0IHRoYXQgaGFzIHNhbWUgdmFsdWUgaW4gd2lyZS4iIiIKKyAgIyBBbGwgNCBieXRlIGZsb2F0cyBoYXZlIGJldHdlZW4gNiBhbmQgOSBzaWduaWZpY2FudCBkaWdpdHMsIHNvIHdlCisgICMgc3RhcnQgd2l0aCA2IGFzIHRoZSBsb3dlciBib3VuZC4KKyAgIyBJdCBoYXMgdG8gYmUgaXRlcmF0aXZlIGJlY2F1c2UgdXNlICcuOWcnIGRpcmVjdGx5IGNhbiBub3QgZ2V0IHJpZAorICAjIG9mIHRoZSBub2lzZXMgZm9yIG1vc3QgdmFsdWVzLiBGb3IgZXhhbXBsZSBpZiBzZXQgYSBmbG9hdF9maWVsZD0wLjkKKyAgIyB1c2UgJy45Zycgd2lsbCBwcmludCAwLjg5OTk5OTk3Ni4KKyAgcHJlY2lzaW9uID0gNgorICByb3VuZGVkID0gZmxvYXQoJ3swOi57MX1nfScuZm9ybWF0KG9yaWdpbmFsLCBwcmVjaXNpb24pKQorICB3aGlsZSBUcnVuY2F0ZVRvRm91ckJ5dGVGbG9hdChyb3VuZGVkKSAhPSBvcmlnaW5hbDoKKyAgICBwcmVjaXNpb24gKz0gMQorICAgIHJvdW5kZWQgPSBmbG9hdCgnezA6LnsxfWd9Jy5mb3JtYXQob3JpZ2luYWwsIHByZWNpc2lvbikpCisgIHJldHVybiByb3VuZGVkCisKKworZGVmIFN1cHBvcnRzT3BlbkVudW1zKGZpZWxkX2Rlc2NyaXB0b3IpOgorICByZXR1cm4gZmllbGRfZGVzY3JpcHRvci5jb250YWluaW5nX3R5cGUuc3ludGF4ID09ICdwcm90bzMnCisKKworZGVmIEdldFR5cGVDaGVja2VyKGZpZWxkKToKKyAgIiIiUmV0dXJucyBhIHR5cGUgY2hlY2tlciBmb3IgYSBtZXNzYWdlIGZpZWxkIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXMuCisKKyAgQXJnczoKKyAgICBmaWVsZDogRmllbGREZXNjcmlwdG9yIG9iamVjdCBmb3IgdGhpcyBmaWVsZC4KKworICBSZXR1cm5zOgorICAgIEFuIGluc3RhbmNlIG9mIFR5cGVDaGVja2VyIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgdHlwZXMKKyAgICBvZiB2YWx1ZXMgYXNzaWduZWQgdG8gYSBmaWVsZCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICIiIgorICBpZiAoZmllbGQuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX1NUUklORyBhbmQKKyAgICAgIGZpZWxkLnR5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NUUklORyk6CisgICAgcmV0dXJuIFVuaWNvZGVWYWx1ZUNoZWNrZXIoKQorICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfRU5VTToKKyAgICBpZiBTdXBwb3J0c09wZW5FbnVtcyhmaWVsZCk6CisgICAgICAjIFdoZW4gb3BlbiBlbnVtcyBhcmUgc3VwcG9ydGVkLCBhbnkgaW50MzIgY2FuIGJlIGFzc2lnbmVkLgorICAgICAgcmV0dXJuIF9WQUxVRV9DSEVDS0VSU1tfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfSU5UMzJdCisgICAgZWxzZToKKyAgICAgIHJldHVybiBFbnVtVmFsdWVDaGVja2VyKGZpZWxkLmVudW1fdHlwZSkKKyAgcmV0dXJuIF9WQUxVRV9DSEVDS0VSU1tmaWVsZC5jcHBfdHlwZV0KKworCisjIE5vbmUgb2YgdGhlIHR5cGVjaGVja2VycyBiZWxvdyBtYWtlIGFueSBhdHRlbXB0IHRvIGd1YXJkIGFnYWluc3QgcGVvcGxlCisjIHN1YmNsYXNzaW5nIGJ1aWx0aW4gdHlwZXMgYW5kIGRvaW5nIHdlaXJkIHRoaW5ncy4gIFdlJ3JlIG5vdCB0cnlpbmcgdG8KKyMgcHJvdGVjdCBhZ2FpbnN0IG1hbGljaW91cyBjbGllbnRzIGhlcmUsIGp1c3QgcGVvcGxlIGFjY2lkZW50YWxseSBzaG9vdGluZworIyB0aGVtc2VsdmVzIGluIHRoZSBmb290IGluIG9idmlvdXMgd2F5cy4KK2NsYXNzIFR5cGVDaGVja2VyKG9iamVjdCk6CisKKyAgIiIiVHlwZSBjaGVja2VyIHVzZWQgdG8gY2F0Y2ggdHlwZSBlcnJvcnMgYXMgZWFybHkgYXMgcG9zc2libGUKKyAgd2hlbiB0aGUgY2xpZW50IGlzIHNldHRpbmcgc2NhbGFyIGZpZWxkcyBpbiBwcm90b2NvbCBtZXNzYWdlcy4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsICphY2NlcHRhYmxlX3R5cGVzKToKKyAgICBzZWxmLl9hY2NlcHRhYmxlX3R5cGVzID0gYWNjZXB0YWJsZV90eXBlcworCisgIGRlZiBDaGVja1ZhbHVlKHNlbGYsIHByb3Bvc2VkX3ZhbHVlKToKKyAgICAiIiJUeXBlIGNoZWNrIHRoZSBwcm92aWRlZCB2YWx1ZSBhbmQgcmV0dXJuIGl0LgorCisgICAgVGhlIHJldHVybmVkIHZhbHVlIG1pZ2h0IGhhdmUgYmVlbiBub3JtYWxpemVkIHRvIGFub3RoZXIgdHlwZS4KKyAgICAiIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZShwcm9wb3NlZF92YWx1ZSwgc2VsZi5fYWNjZXB0YWJsZV90eXBlcyk6CisgICAgICBtZXNzYWdlID0gKCclLjEwMjRyIGhhcyB0eXBlICVzLCBidXQgZXhwZWN0ZWQgb25lIG9mOiAlcycgJQorICAgICAgICAgICAgICAgICAocHJvcG9zZWRfdmFsdWUsIHR5cGUocHJvcG9zZWRfdmFsdWUpLCBzZWxmLl9hY2NlcHRhYmxlX3R5cGVzKSkKKyAgICAgIHJhaXNlIFR5cGVFcnJvcihtZXNzYWdlKQorICAgIHJldHVybiBwcm9wb3NlZF92YWx1ZQorCisKK2NsYXNzIFR5cGVDaGVja2VyV2l0aERlZmF1bHQoVHlwZUNoZWNrZXIpOgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWZhdWx0X3ZhbHVlLCAqYWNjZXB0YWJsZV90eXBlcyk6CisgICAgVHlwZUNoZWNrZXIuX19pbml0X18oc2VsZiwgKmFjY2VwdGFibGVfdHlwZXMpCisgICAgc2VsZi5fZGVmYXVsdF92YWx1ZSA9IGRlZmF1bHRfdmFsdWUKKworICBkZWYgRGVmYXVsdFZhbHVlKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9kZWZhdWx0X3ZhbHVlCisKKworY2xhc3MgQm9vbFZhbHVlQ2hlY2tlcihvYmplY3QpOgorICAiIiJUeXBlIGNoZWNrZXIgdXNlZCBmb3IgYm9vbCBmaWVsZHMuIiIiCisKKyAgZGVmIENoZWNrVmFsdWUoc2VsZiwgcHJvcG9zZWRfdmFsdWUpOgorICAgIGlmIG5vdCBoYXNhdHRyKHByb3Bvc2VkX3ZhbHVlLCAnX19pbmRleF9fJykgb3IgKAorICAgICAgICB0eXBlKHByb3Bvc2VkX3ZhbHVlKS5fX21vZHVsZV9fID09ICdudW1weScgYW5kCisgICAgICAgIHR5cGUocHJvcG9zZWRfdmFsdWUpLl9fbmFtZV9fID09ICduZGFycmF5Jyk6CisgICAgICBtZXNzYWdlID0gKCclLjEwMjRyIGhhcyB0eXBlICVzLCBidXQgZXhwZWN0ZWQgb25lIG9mOiAlcycgJQorICAgICAgICAgICAgICAgICAocHJvcG9zZWRfdmFsdWUsIHR5cGUocHJvcG9zZWRfdmFsdWUpLCAoYm9vbCwgaW50KSkpCisgICAgICByYWlzZSBUeXBlRXJyb3IobWVzc2FnZSkKKyAgICByZXR1cm4gYm9vbChwcm9wb3NlZF92YWx1ZSkKKworICBkZWYgRGVmYXVsdFZhbHVlKHNlbGYpOgorICAgIHJldHVybiBGYWxzZQorCisKKyMgSW50VmFsdWVDaGVja2VyIGFuZCBpdHMgc3ViY2xhc3NlcyBwZXJmb3JtIGludGVnZXIgdHlwZS1jaGVja3MKKyMgYW5kIGJvdW5kcy1jaGVja3MuCitjbGFzcyBJbnRWYWx1ZUNoZWNrZXIob2JqZWN0KToKKworICAiIiJDaGVja2VyIHVzZWQgZm9yIGludGVnZXIgZmllbGRzLiAgUGVyZm9ybXMgdHlwZS1jaGVjayBhbmQgcmFuZ2UgY2hlY2suIiIiCisKKyAgZGVmIENoZWNrVmFsdWUoc2VsZiwgcHJvcG9zZWRfdmFsdWUpOgorICAgIGlmIG5vdCBoYXNhdHRyKHByb3Bvc2VkX3ZhbHVlLCAnX19pbmRleF9fJykgb3IgKAorICAgICAgICB0eXBlKHByb3Bvc2VkX3ZhbHVlKS5fX21vZHVsZV9fID09ICdudW1weScgYW5kCisgICAgICAgIHR5cGUocHJvcG9zZWRfdmFsdWUpLl9fbmFtZV9fID09ICduZGFycmF5Jyk6CisgICAgICBtZXNzYWdlID0gKCclLjEwMjRyIGhhcyB0eXBlICVzLCBidXQgZXhwZWN0ZWQgb25lIG9mOiAlcycgJQorICAgICAgICAgICAgICAgICAocHJvcG9zZWRfdmFsdWUsIHR5cGUocHJvcG9zZWRfdmFsdWUpLCAoaW50LCkpKQorICAgICAgcmFpc2UgVHlwZUVycm9yKG1lc3NhZ2UpCisKKyAgICBpZiBub3Qgc2VsZi5fTUlOIDw9IGludChwcm9wb3NlZF92YWx1ZSkgPD0gc2VsZi5fTUFYOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcignVmFsdWUgb3V0IG9mIHJhbmdlOiAlZCcgJSBwcm9wb3NlZF92YWx1ZSkKKyAgICAjIFdlIGZvcmNlIGFsbCB2YWx1ZXMgdG8gaW50IHRvIG1ha2UgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyB3aGVyZSB0aGUKKyAgICAjIGRpc3RpbmN0aW9uIGlzIG1vcmUgc2lnbmlmaWNhbnQgKGUuZy4gdGhlIEMrKyBpbXBsZW1lbnRhdGlvbikgc2ltcGxlci4KKyAgICBwcm9wb3NlZF92YWx1ZSA9IGludChwcm9wb3NlZF92YWx1ZSkKKyAgICByZXR1cm4gcHJvcG9zZWRfdmFsdWUKKworICBkZWYgRGVmYXVsdFZhbHVlKHNlbGYpOgorICAgIHJldHVybiAwCisKKworY2xhc3MgRW51bVZhbHVlQ2hlY2tlcihvYmplY3QpOgorCisgICIiIkNoZWNrZXIgdXNlZCBmb3IgZW51bSBmaWVsZHMuICBQZXJmb3JtcyB0eXBlLWNoZWNrIGFuZCByYW5nZSBjaGVjay4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZW51bV90eXBlKToKKyAgICBzZWxmLl9lbnVtX3R5cGUgPSBlbnVtX3R5cGUKKworICBkZWYgQ2hlY2tWYWx1ZShzZWxmLCBwcm9wb3NlZF92YWx1ZSk6CisgICAgaWYgbm90IGlzaW5zdGFuY2UocHJvcG9zZWRfdmFsdWUsIG51bWJlcnMuSW50ZWdyYWwpOgorICAgICAgbWVzc2FnZSA9ICgnJS4xMDI0ciBoYXMgdHlwZSAlcywgYnV0IGV4cGVjdGVkIG9uZSBvZjogJXMnICUKKyAgICAgICAgICAgICAgICAgKHByb3Bvc2VkX3ZhbHVlLCB0eXBlKHByb3Bvc2VkX3ZhbHVlKSwgKGludCwpKSkKKyAgICAgIHJhaXNlIFR5cGVFcnJvcihtZXNzYWdlKQorICAgIGlmIGludChwcm9wb3NlZF92YWx1ZSkgbm90IGluIHNlbGYuX2VudW1fdHlwZS52YWx1ZXNfYnlfbnVtYmVyOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5rbm93biBlbnVtIHZhbHVlOiAlZCcgJSBwcm9wb3NlZF92YWx1ZSkKKyAgICByZXR1cm4gcHJvcG9zZWRfdmFsdWUKKworICBkZWYgRGVmYXVsdFZhbHVlKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9lbnVtX3R5cGUudmFsdWVzWzBdLm51bWJlcgorCisKK2NsYXNzIFVuaWNvZGVWYWx1ZUNoZWNrZXIob2JqZWN0KToKKworICAiIiJDaGVja2VyIHVzZWQgZm9yIHN0cmluZyBmaWVsZHMuCisKKyAgQWx3YXlzIHJldHVybnMgYSB1bmljb2RlIHZhbHVlLCBldmVuIGlmIHRoZSBpbnB1dCBpcyBvZiB0eXBlIHN0ci4KKyAgIiIiCisKKyAgZGVmIENoZWNrVmFsdWUoc2VsZiwgcHJvcG9zZWRfdmFsdWUpOgorICAgIGlmIG5vdCBpc2luc3RhbmNlKHByb3Bvc2VkX3ZhbHVlLCAoYnl0ZXMsIHN0cikpOgorICAgICAgbWVzc2FnZSA9ICgnJS4xMDI0ciBoYXMgdHlwZSAlcywgYnV0IGV4cGVjdGVkIG9uZSBvZjogJXMnICUKKyAgICAgICAgICAgICAgICAgKHByb3Bvc2VkX3ZhbHVlLCB0eXBlKHByb3Bvc2VkX3ZhbHVlKSwgKGJ5dGVzLCBzdHIpKSkKKyAgICAgIHJhaXNlIFR5cGVFcnJvcihtZXNzYWdlKQorCisgICAgIyBJZiB0aGUgdmFsdWUgaXMgb2YgdHlwZSAnYnl0ZXMnIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHZhbGlkIFVURi04IGRhdGEuCisgICAgaWYgaXNpbnN0YW5jZShwcm9wb3NlZF92YWx1ZSwgYnl0ZXMpOgorICAgICAgdHJ5OgorICAgICAgICBwcm9wb3NlZF92YWx1ZSA9IHByb3Bvc2VkX3ZhbHVlLmRlY29kZSgndXRmLTgnKQorICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJS4xMDI0ciBoYXMgdHlwZSBieXRlcywgYnV0IGlzblwndCB2YWxpZCBVVEYtOCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuY29kaW5nLiBOb24tVVRGLTggc3RyaW5ncyBtdXN0IGJlIGNvbnZlcnRlZCB0byAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuaWNvZGUgb2JqZWN0cyBiZWZvcmUgYmVpbmcgYWRkZWQuJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3Bvc2VkX3ZhbHVlKSkKKyAgICBlbHNlOgorICAgICAgdHJ5OgorICAgICAgICBwcm9wb3NlZF92YWx1ZS5lbmNvZGUoJ3V0ZjgnKQorICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJS4xMDI0ciBpc25cJ3QgYSB2YWxpZCB1bmljb2RlIHN0cmluZyBhbmQgJworICAgICAgICAgICAgICAgICAgICAgICAgICdjYW5cJ3QgYmUgZW5jb2RlZCBpbiBVVEYtOC4nJQorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wb3NlZF92YWx1ZSkpCisKKyAgICByZXR1cm4gcHJvcG9zZWRfdmFsdWUKKworICBkZWYgRGVmYXVsdFZhbHVlKHNlbGYpOgorICAgIHJldHVybiB1IiIKKworCitjbGFzcyBJbnQzMlZhbHVlQ2hlY2tlcihJbnRWYWx1ZUNoZWNrZXIpOgorICAjIFdlJ3JlIHN1cmUgdG8gdXNlIGludHMgaW5zdGVhZCBvZiBsb25ncyBoZXJlIHNpbmNlIGNvbXBhcmlzb24gbWF5IGJlIG1vcmUKKyAgIyBlZmZpY2llbnQuCisgIF9NSU4gPSAtMjE0NzQ4MzY0OAorICBfTUFYID0gMjE0NzQ4MzY0NworCisKK2NsYXNzIFVpbnQzMlZhbHVlQ2hlY2tlcihJbnRWYWx1ZUNoZWNrZXIpOgorICBfTUlOID0gMAorICBfTUFYID0gKDEgPDwgMzIpIC0gMQorCisKK2NsYXNzIEludDY0VmFsdWVDaGVja2VyKEludFZhbHVlQ2hlY2tlcik6CisgIF9NSU4gPSAtKDEgPDwgNjMpCisgIF9NQVggPSAoMSA8PCA2MykgLSAxCisKKworY2xhc3MgVWludDY0VmFsdWVDaGVja2VyKEludFZhbHVlQ2hlY2tlcik6CisgIF9NSU4gPSAwCisgIF9NQVggPSAoMSA8PCA2NCkgLSAxCisKKworIyBUaGUgbWF4IDQgYnl0ZXMgZmxvYXQgaXMgYWJvdXQgMy40MDI4MjM0NjYzODUyODg2ZSszOAorX0ZMT0FUX01BWCA9IGZsb2F0LmZyb21oZXgoJzB4MS5mZmZmZmVwKzEyNycpCitfRkxPQVRfTUlOID0gLV9GTE9BVF9NQVgKK19JTkYgPSBmbG9hdCgnaW5mJykKK19ORUdfSU5GID0gZmxvYXQoJy1pbmYnKQorCisKK2NsYXNzIERvdWJsZVZhbHVlQ2hlY2tlcihvYmplY3QpOgorICAiIiJDaGVja2VyIHVzZWQgZm9yIGRvdWJsZSBmaWVsZHMuCisKKyAgUGVyZm9ybXMgdHlwZS1jaGVjayBhbmQgcmFuZ2UgY2hlY2suCisgICIiIgorCisgIGRlZiBDaGVja1ZhbHVlKHNlbGYsIHByb3Bvc2VkX3ZhbHVlKToKKyAgICAiIiJDaGVjayBhbmQgY29udmVydCBwcm9wb3NlZF92YWx1ZSB0byBmbG9hdC4iIiIKKyAgICBpZiAobm90IGhhc2F0dHIocHJvcG9zZWRfdmFsdWUsICdfX2Zsb2F0X18nKSBhbmQKKyAgICAgICAgbm90IGhhc2F0dHIocHJvcG9zZWRfdmFsdWUsICdfX2luZGV4X18nKSkgb3IgKAorICAgICAgICAgICAgdHlwZShwcm9wb3NlZF92YWx1ZSkuX19tb2R1bGVfXyA9PSAnbnVtcHknIGFuZAorICAgICAgICAgICAgdHlwZShwcm9wb3NlZF92YWx1ZSkuX19uYW1lX18gPT0gJ25kYXJyYXknKToKKyAgICAgIG1lc3NhZ2UgPSAoJyUuMTAyNHIgaGFzIHR5cGUgJXMsIGJ1dCBleHBlY3RlZCBvbmUgb2Y6IGludCwgZmxvYXQnICUKKyAgICAgICAgICAgICAgICAgKHByb3Bvc2VkX3ZhbHVlLCB0eXBlKHByb3Bvc2VkX3ZhbHVlKSkpCisgICAgICByYWlzZSBUeXBlRXJyb3IobWVzc2FnZSkKKyAgICByZXR1cm4gZmxvYXQocHJvcG9zZWRfdmFsdWUpCisKKyAgZGVmIERlZmF1bHRWYWx1ZShzZWxmKToKKyAgICByZXR1cm4gMC4wCisKKworY2xhc3MgRmxvYXRWYWx1ZUNoZWNrZXIoRG91YmxlVmFsdWVDaGVja2VyKToKKyAgIiIiQ2hlY2tlciB1c2VkIGZvciBmbG9hdCBmaWVsZHMuCisKKyAgUGVyZm9ybXMgdHlwZS1jaGVjayBhbmQgcmFuZ2UgY2hlY2suCisKKyAgVmFsdWVzIGV4Y2VlZGluZyBhIDMyLWJpdCBmbG9hdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBpbmYvLWluZi4KKyAgIiIiCisKKyAgZGVmIENoZWNrVmFsdWUoc2VsZiwgcHJvcG9zZWRfdmFsdWUpOgorICAgICIiIkNoZWNrIGFuZCBjb252ZXJ0IHByb3Bvc2VkX3ZhbHVlIHRvIGZsb2F0LiIiIgorICAgIGNvbnZlcnRlZF92YWx1ZSA9IHN1cGVyKCkuQ2hlY2tWYWx1ZShwcm9wb3NlZF92YWx1ZSkKKyAgICAjIFRoaXMgaW5mIHJvdW5kaW5nIG1hdGNoZXMgdGhlIEMrKyBwcm90byBTYWZlRG91YmxlVG9GbG9hdCBsb2dpYy4KKyAgICBpZiBjb252ZXJ0ZWRfdmFsdWUgPiBfRkxPQVRfTUFYOgorICAgICAgcmV0dXJuIF9JTkYKKyAgICBpZiBjb252ZXJ0ZWRfdmFsdWUgPCBfRkxPQVRfTUlOOgorICAgICAgcmV0dXJuIF9ORUdfSU5GCisKKyAgICByZXR1cm4gVHJ1bmNhdGVUb0ZvdXJCeXRlRmxvYXQoY29udmVydGVkX3ZhbHVlKQorCisjIFR5cGUtY2hlY2tlcnMgZm9yIGFsbCBzY2FsYXIgQ1BQVFlQRXMuCitfVkFMVUVfQ0hFQ0tFUlMgPSB7CisgICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0lOVDMyOiBJbnQzMlZhbHVlQ2hlY2tlcigpLAorICAgIF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9JTlQ2NDogSW50NjRWYWx1ZUNoZWNrZXIoKSwKKyAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfVUlOVDMyOiBVaW50MzJWYWx1ZUNoZWNrZXIoKSwKKyAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfVUlOVDY0OiBVaW50NjRWYWx1ZUNoZWNrZXIoKSwKKyAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfRE9VQkxFOiBEb3VibGVWYWx1ZUNoZWNrZXIoKSwKKyAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfRkxPQVQ6IEZsb2F0VmFsdWVDaGVja2VyKCksCisgICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0JPT0w6IEJvb2xWYWx1ZUNoZWNrZXIoKSwKKyAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfU1RSSU5HOiBUeXBlQ2hlY2tlcldpdGhEZWZhdWx0KGInJywgYnl0ZXMpLAorfQorCisKKyMgTWFwIGZyb20gZmllbGQgdHlwZSB0byBhIGZ1bmN0aW9uIEYsIHN1Y2ggdGhhdCBGKGZpZWxkX251bSwgdmFsdWUpCisjIGdpdmVzIHRoZSB0b3RhbCBieXRlIHNpemUgZm9yIGEgdmFsdWUgb2YgdGhlIGdpdmVuIHR5cGUuICBUaGlzCisjIGJ5dGUgc2l6ZSBpbmNsdWRlcyB0YWcgaW5mb3JtYXRpb24gYW5kIGFueSBvdGhlciBhZGRpdGlvbmFsIHNwYWNlCisjIGFzc29jaWF0ZWQgd2l0aCBzZXJpYWxpemluZyAidmFsdWUiLgorVFlQRV9UT19CWVRFX1NJWkVfRk4gPSB7CisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0RPVUJMRTogd2lyZV9mb3JtYXQuRG91YmxlQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZMT0FUOiB3aXJlX2Zvcm1hdC5GbG9hdEJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQ2NDogd2lyZV9mb3JtYXQuSW50NjRCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDY0OiB3aXJlX2Zvcm1hdC5VSW50NjRCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UMzI6IHdpcmVfZm9ybWF0LkludDMyQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVENjQ6IHdpcmVfZm9ybWF0LkZpeGVkNjRCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQzMjogd2lyZV9mb3JtYXQuRml4ZWQzMkJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CT09MOiB3aXJlX2Zvcm1hdC5Cb29sQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NUUklORzogd2lyZV9mb3JtYXQuU3RyaW5nQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQOiB3aXJlX2Zvcm1hdC5Hcm91cEJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFOiB3aXJlX2Zvcm1hdC5NZXNzYWdlQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOiB3aXJlX2Zvcm1hdC5CeXRlc0J5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UMzI6IHdpcmVfZm9ybWF0LlVJbnQzMkJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNOiB3aXJlX2Zvcm1hdC5FbnVtQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDMyOiB3aXJlX2Zvcm1hdC5TRml4ZWQzMkJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQ2NDogd2lyZV9mb3JtYXQuU0ZpeGVkNjRCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDMyOiB3aXJlX2Zvcm1hdC5TSW50MzJCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDY0OiB3aXJlX2Zvcm1hdC5TSW50NjRCeXRlU2l6ZQorICAgIH0KKworCisjIE1hcHMgZnJvbSBmaWVsZCB0eXBlcyB0byBlbmNvZGVyIGNvbnN0cnVjdG9ycy4KK1RZUEVfVE9fRU5DT0RFUiA9IHsKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFOiBlbmNvZGVyLkRvdWJsZUVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZMT0FUOiBlbmNvZGVyLkZsb2F0RW5jb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UNjQ6IGVuY29kZXIuSW50NjRFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UNjQ6IGVuY29kZXIuVUludDY0RW5jb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UMzI6IGVuY29kZXIuSW50MzJFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDY0OiBlbmNvZGVyLkZpeGVkNjRFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDMyOiBlbmNvZGVyLkZpeGVkMzJFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CT09MOiBlbmNvZGVyLkJvb2xFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkc6IGVuY29kZXIuU3RyaW5nRW5jb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVA6IGVuY29kZXIuR3JvdXBFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFOiBlbmNvZGVyLk1lc3NhZ2VFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CWVRFUzogZW5jb2Rlci5CeXRlc0VuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQzMjogZW5jb2Rlci5VSW50MzJFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNOiBlbmNvZGVyLkVudW1FbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQzMjogZW5jb2Rlci5TRml4ZWQzMkVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDY0OiBlbmNvZGVyLlNGaXhlZDY0RW5jb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDMyOiBlbmNvZGVyLlNJbnQzMkVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQ2NDogZW5jb2Rlci5TSW50NjRFbmNvZGVyLAorICAgIH0KKworCisjIE1hcHMgZnJvbSBmaWVsZCB0eXBlcyB0byBzaXplciBjb25zdHJ1Y3RvcnMuCitUWVBFX1RPX1NJWkVSID0geworICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9ET1VCTEU6IGVuY29kZXIuRG91YmxlU2l6ZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZMT0FUOiBlbmNvZGVyLkZsb2F0U2l6ZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDY0OiBlbmNvZGVyLkludDY0U2l6ZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQ2NDogZW5jb2Rlci5VSW50NjRTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UMzI6IGVuY29kZXIuSW50MzJTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQ2NDogZW5jb2Rlci5GaXhlZDY0U2l6ZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVEMzI6IGVuY29kZXIuRml4ZWQzMlNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CT09MOiBlbmNvZGVyLkJvb2xTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU1RSSU5HOiBlbmNvZGVyLlN0cmluZ1NpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9HUk9VUDogZW5jb2Rlci5Hcm91cFNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFOiBlbmNvZGVyLk1lc3NhZ2VTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVM6IGVuY29kZXIuQnl0ZXNTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDMyOiBlbmNvZGVyLlVJbnQzMlNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNOiBlbmNvZGVyLkVudW1TaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVEMzI6IGVuY29kZXIuU0ZpeGVkMzJTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVENjQ6IGVuY29kZXIuU0ZpeGVkNjRTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDMyOiBlbmNvZGVyLlNJbnQzMlNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UNjQ6IGVuY29kZXIuU0ludDY0U2l6ZXIsCisgICAgfQorCisKKyMgTWFwcyBmcm9tIGZpZWxkIHR5cGUgdG8gYSBkZWNvZGVyIGNvbnN0cnVjdG9yLgorVFlQRV9UT19ERUNPREVSID0geworICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9ET1VCTEU6IGRlY29kZXIuRG91YmxlRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRkxPQVQ6IGRlY29kZXIuRmxvYXREZWNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQ2NDogZGVjb2Rlci5JbnQ2NERlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQ2NDogZGVjb2Rlci5VSW50NjREZWNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQzMjogZGVjb2Rlci5JbnQzMkRlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVENjQ6IGRlY29kZXIuRml4ZWQ2NERlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVEMzI6IGRlY29kZXIuRml4ZWQzMkRlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JPT0w6IGRlY29kZXIuQm9vbERlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NUUklORzogZGVjb2Rlci5TdHJpbmdEZWNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9HUk9VUDogZGVjb2Rlci5Hcm91cERlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0U6IGRlY29kZXIuTWVzc2FnZURlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOiBkZWNvZGVyLkJ5dGVzRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDMyOiBkZWNvZGVyLlVJbnQzMkRlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU06IGRlY29kZXIuRW51bURlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDMyOiBkZWNvZGVyLlNGaXhlZDMyRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVENjQ6IGRlY29kZXIuU0ZpeGVkNjREZWNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UMzI6IGRlY29kZXIuU0ludDMyRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDY0OiBkZWNvZGVyLlNJbnQ2NERlY29kZXIsCisgICAgfQorCisjIE1hcHMgZnJvbSBmaWVsZCB0eXBlIHRvIGV4cGVjdGVkIHdpcmV0eXBlLgorRklFTERfVFlQRV9UT19XSVJFX1RZUEUgPSB7CisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0RPVUJMRTogd2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRkxPQVQ6IHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDY0OiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQ2NDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQzMjogd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDY0OiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDY0LAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDMyOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CT09MOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NUUklORzoKKyAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRToKKyAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOgorICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDMyOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU06IHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVEMzI6IHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDY0OiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDY0LAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UMzI6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDY0OiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsCisgICAgfQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC91bmtub3duX2ZpZWxkc190ZXN0LnB5IGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC91bmtub3duX2ZpZWxkc190ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YTAzNjcKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Vua25vd25fZmllbGRzX3Rlc3QucHkKQEAgLTAsMCArMSw0NjEgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3QgZm9yIHByZXNlcnZhdGlvbiBvZiB1bmtub3duIGZpZWxkcyBpbiB0aGUgcHVyZSBQeXRob24gaW1wbGVtZW50YXRpb24uIiIiCisKK19fYXV0aG9yX18gPSAnYm9oZGFua0Bnb29nbGUuY29tIChCb2hkYW4gS292YWwpJworCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1hcF91bml0dGVzdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9tc2V0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3Byb3RvM19hcmVuYV9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBhcGlfaW1wbGVtZW50YXRpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbmNvZGVyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBtaXNzaW5nX2VudW1fdmFsdWVzX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RfdXRpbAorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RpbmdfcmVmbGVha3MKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB0eXBlX2NoZWNrZXJzCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5rbm93bl9maWVsZHMKK3RyeToKKyAgaW1wb3J0IHRyYWNlbWFsbG9jICAjIHB5bGludDogZGlzYWJsZT1nLWltcG9ydC1ub3QtYXQtdG9wCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICMgUmVxdWlyZXMgcHl0aG9uIDMuNCsKKyAgcGFzcworCisKK0B0ZXN0aW5nX3JlZmxlYWtzLlRlc3RDYXNlCitjbGFzcyBVbmtub3duRmllbGRzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYuZGVzY3JpcHRvciA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUgorICAgIHNlbGYuYWxsX2ZpZWxkcyA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMoc2VsZi5hbGxfZmllbGRzKQorICAgIHNlbGYuYWxsX2ZpZWxkc19kYXRhID0gc2VsZi5hbGxfZmllbGRzLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBzZWxmLmVtcHR5X21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCisgICAgc2VsZi5lbXB0eV9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzZWxmLmFsbF9maWVsZHNfZGF0YSkKKworICBkZWYgdGVzdFNlcmlhbGl6ZShzZWxmKToKKyAgICBkYXRhID0gc2VsZi5lbXB0eV9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgICMgRG9uJ3QgdXNlIGFzc2VydEVxdWFsIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkdW1wIHJhdyBiaW5hcnkgZGF0YSB0bworICAgICMgc3Rkb3V0LgorICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhID09IHNlbGYuYWxsX2ZpZWxkc19kYXRhKQorCisgIGRlZiB0ZXN0U2VyaWFsaXplUHJvdG8zKHNlbGYpOgorICAgICMgVmVyaWZ5IHByb3RvMyB1bmtub3duIGZpZWxkcyBiZWhhdmlvci4KKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcHJvdG8zX2FyZW5hX3BiMi5UZXN0RW1wdHlNZXNzYWdlKCkKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzZWxmLmFsbF9maWVsZHNfZGF0YSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYWxsX2ZpZWxkc19kYXRhLCBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisKKyAgZGVmIHRlc3RCeXRlU2l6ZShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYWxsX2ZpZWxkcy5CeXRlU2l6ZSgpLCBzZWxmLmVtcHR5X21lc3NhZ2UuQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdExpc3RGaWVsZHMoc2VsZik6CisgICAgIyBNYWtlIHN1cmUgTGlzdEZpZWxkcyBkb2Vzbid0IHJldHVybiB1bmtub3duIGZpZWxkcy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihzZWxmLmVtcHR5X21lc3NhZ2UuTGlzdEZpZWxkcygpKSkKKworICBkZWYgdGVzdFNlcmlhbGl6ZU1lc3NhZ2VTZXRXaXJlRm9ybWF0VW5rbm93bkV4dGVuc2lvbihzZWxmKToKKyAgICAjIENyZWF0ZSBhIG1lc3NhZ2UgdXNpbmcgdGhlIG1lc3NhZ2Ugc2V0IHdpcmUgZm9ybWF0IHdpdGggYW4gdW5rbm93bgorICAgICMgbWVzc2FnZS4KKyAgICByYXcgPSB1bml0dGVzdF9tc2V0X3BiMi5SYXdNZXNzYWdlU2V0KCkKKworICAgICMgQWRkIGFuIHVua25vd24gZXh0ZW5zaW9uLgorICAgIGl0ZW0gPSByYXcuaXRlbS5hZGQoKQorICAgIGl0ZW0udHlwZV9pZCA9IDk4MjE4NjAzCisgICAgbWVzc2FnZTEgPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEoKQorICAgIG1lc3NhZ2UxLmkgPSAxMjM0NQorICAgIGl0ZW0ubWVzc2FnZSA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgIHNlcmlhbGl6ZWQgPSByYXcuU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgIyBQYXJzZSBtZXNzYWdlIHVzaW5nIHRoZSBtZXNzYWdlIHNldCB3aXJlIGZvcm1hdC4KKyAgICBwcm90byA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLlRlc3RNZXNzYWdlU2V0KCkKKyAgICBwcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKworICAgIHVua25vd25fZmllbGRfc2V0ID0gdW5rbm93bl9maWVsZHMuVW5rbm93bkZpZWxkU2V0KHByb3RvKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHVua25vd25fZmllbGRfc2V0KSwgMSkKKyAgICAjIFVua25vd24gZmllbGQgc2hvdWxkIGhhdmUgd2lyZSBmb3JtYXQgZGF0YSB3aGljaCBjYW4gYmUgcGFyc2VkIGJhY2sgdG8KKyAgICAjIG9yaWdpbmFsIG1lc3NhZ2UuCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmtub3duX2ZpZWxkX3NldFswXS5maWVsZF9udW1iZXIsIGl0ZW0udHlwZV9pZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVua25vd25fZmllbGRfc2V0WzBdLndpcmVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgICAgZCA9IHVua25vd25fZmllbGRfc2V0WzBdLmRhdGEKKyAgICBtZXNzYWdlX25ldyA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSgpCisgICAgbWVzc2FnZV9uZXcuUGFyc2VGcm9tU3RyaW5nKGQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlMSwgbWVzc2FnZV9uZXcpCisKKyAgICAjIFZlcmlmeSB0aGF0IHRoZSB1bmtub3duIGV4dGVuc2lvbiBpcyBzZXJpYWxpemVkIHVuY2hhbmdlZAorICAgIHJlc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBuZXdfcmF3ID0gdW5pdHRlc3RfbXNldF9wYjIuUmF3TWVzc2FnZVNldCgpCisgICAgbmV3X3Jhdy5NZXJnZUZyb21TdHJpbmcocmVzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3LCBuZXdfcmF3KQorCisgIGRlZiB0ZXN0RXF1YWxzKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoc2VsZi5hbGxfZmllbGRzX2RhdGEpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVtcHR5X21lc3NhZ2UsIG1lc3NhZ2UpCisKKyAgICBzZWxmLmFsbF9maWVsZHMuQ2xlYXJGaWVsZCgnb3B0aW9uYWxfc3RyaW5nJykKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzZWxmLmFsbF9maWVsZHMuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZW1wdHlfbWVzc2FnZSwgbWVzc2FnZSkKKworICBkZWYgdGVzdERpc2NhcmRVbmtub3duRmllbGRzKHNlbGYpOgorICAgIHNlbGYuZW1wdHlfbWVzc2FnZS5EaXNjYXJkVW5rbm93bkZpZWxkcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChiJycsIHNlbGYuZW1wdHlfbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgICMgVGVzdCBtZXNzYWdlIGZpZWxkIGFuZCByZXBlYXRlZCBtZXNzYWdlIGZpZWxkLgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBvdGhlcl9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgb3RoZXJfbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcgPSAnZGlzY2FyZCcKKyAgICBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZygKKyAgICAgICAgb3RoZXJfbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuUGFyc2VGcm9tU3RyaW5nKAorICAgICAgICBvdGhlcl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKKyAgICAgICAgYicnLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKKyAgICAgICAgYicnLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgbWVzc2FnZS5EaXNjYXJkVW5rbm93bkZpZWxkcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChiJycsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBiJycsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uU2VyaWFsaXplVG9TdHJpbmcoKSkKKworICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCisgICAgbXNnLm1hcF9pbnQzMl9hbGxfdHlwZXNbMV0ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKAorICAgICAgICBvdGhlcl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgbXNnLm1hcF9zdHJpbmdfc3RyaW5nWycxJ10gPSAndGVzdCcKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAorICAgICAgICBiJycsCisgICAgICAgIG1zZy5tYXBfaW50MzJfYWxsX3R5cGVzWzFdLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgbXNnLkRpc2NhcmRVbmtub3duRmllbGRzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBiJycsCisgICAgICAgIG1zZy5tYXBfaW50MzJfYWxsX3R5cGVzWzFdLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisKKworQHRlc3RpbmdfcmVmbGVha3MuVGVzdENhc2UKK2NsYXNzIFVua25vd25GaWVsZHNBY2Nlc3NvcnNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc2VsZi5kZXNjcmlwdG9yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SCisgICAgc2VsZi5hbGxfZmllbGRzID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhzZWxmLmFsbF9maWVsZHMpCisgICAgc2VsZi5hbGxfZmllbGRzX2RhdGEgPSBzZWxmLmFsbF9maWVsZHMuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHNlbGYuZW1wdHlfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlKCkKKyAgICBzZWxmLmVtcHR5X21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlbGYuYWxsX2ZpZWxkc19kYXRhKQorCisgICMgSW50ZXJuYWxDaGVja1Vua25vd25GaWVsZCgpIGlzIGFuIGFkZGl0aW9uYWwgUHVyZSBQeXRob24gY2hlY2sgd2hpY2ggY2hlY2tzCisgICMgYSBkZXRhaWwgb2YgdW5rbm93biBmaWVsZHMuIEl0IGNhbm5vdCBiZSB1c2VkIGJ5IHRoZSBDKysKKyAgIyBpbXBsZW1lbnRhdGlvbiBiZWNhdXNlIHNvbWUgcHJvdGVjdCBtZW1iZXJzIGFyZSBjYWxsZWQuCisgICMgVGhlIHRlc3QgaXMgYWRkZWQgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4gSXQgaXMgbm90IG5lY2Vzc2FyeSBhcworICAjIHNlcmlhbGl6ZWQgc3RyaW5nIGlzIGNoZWNrZWQuCisgICMgVE9ETyhqaWVsdW8pOiBSZW1vdmUgbWVzc2FnZS5fdW5rbm93bl9maWVsZHMuCisgIGRlZiBJbnRlcm5hbENoZWNrVW5rbm93bkZpZWxkKHNlbGYsIG5hbWUsIGV4cGVjdGVkX3ZhbHVlKToKKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nOgorICAgICAgcmV0dXJuCisgICAgZmllbGRfZGVzY3JpcHRvciA9IHNlbGYuZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZVtuYW1lXQorICAgIHdpcmVfdHlwZSA9IHR5cGVfY2hlY2tlcnMuRklFTERfVFlQRV9UT19XSVJFX1RZUEVbZmllbGRfZGVzY3JpcHRvci50eXBlXQorICAgIGZpZWxkX3RhZyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfZGVzY3JpcHRvci5udW1iZXIsIHdpcmVfdHlwZSkKKyAgICByZXN1bHRfZGljdCA9IHt9CisgICAgZm9yIHRhZ19ieXRlcywgdmFsdWUgaW4gc2VsZi5lbXB0eV9tZXNzYWdlLl91bmtub3duX2ZpZWxkczoKKyAgICAgIGlmIHRhZ19ieXRlcyA9PSBmaWVsZF90YWc6CisgICAgICAgIGRlY29kZXIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLl9kZWNvZGVyc19ieV90YWdbdGFnX2J5dGVzXVswXQorICAgICAgICBkZWNvZGVyKG1lbW9yeXZpZXcodmFsdWUpLCAwLCBsZW4odmFsdWUpLCBzZWxmLmFsbF9maWVsZHMsIHJlc3VsdF9kaWN0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFsdWUsIHJlc3VsdF9kaWN0W2ZpZWxkX2Rlc2NyaXB0b3JdKQorCisgIGRlZiBDaGVja1Vua25vd25GaWVsZChzZWxmLCBuYW1lLCB1bmtub3duX2ZpZWxkX3NldCwgZXhwZWN0ZWRfdmFsdWUpOgorICAgIGZpZWxkX2Rlc2NyaXB0b3IgPSBzZWxmLmRlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbbmFtZV0KKyAgICBleHBlY3RlZF90eXBlID0gdHlwZV9jaGVja2Vycy5GSUVMRF9UWVBFX1RPX1dJUkVfVFlQRVsKKyAgICAgICAgZmllbGRfZGVzY3JpcHRvci50eXBlXQorICAgIGZvciB1bmtub3duX2ZpZWxkIGluIHVua25vd25fZmllbGRfc2V0OgorICAgICAgaWYgdW5rbm93bl9maWVsZC5maWVsZF9udW1iZXIgPT0gZmllbGRfZGVzY3JpcHRvci5udW1iZXI6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdHlwZSwgdW5rbm93bl9maWVsZC53aXJlX3R5cGUpCisgICAgICAgIGlmIGV4cGVjdGVkX3R5cGUgPT0gMzoKKyAgICAgICAgICAjIENoZWNrIGdyb3VwCisgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF92YWx1ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25fZmllbGQuZGF0YVswXS5maWVsZF9udW1iZXIpCisgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF92YWx1ZVsxXSwgdW5rbm93bl9maWVsZC5kYXRhWzBdLndpcmVfdHlwZSkKKyAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3ZhbHVlWzJdLCB1bmtub3duX2ZpZWxkLmRhdGFbMF0uZGF0YSkKKyAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBleHBlY3RlZF90eXBlID09IHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6CisgICAgICAgICAgc2VsZi5hc3NlcnRJbih0eXBlKHVua25vd25fZmllbGQuZGF0YSksIChzdHIsIGJ5dGVzKSkKKyAgICAgICAgaWYgZmllbGRfZGVzY3JpcHRvci5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgICAgICBzZWxmLmFzc2VydEluKHVua25vd25fZmllbGQuZGF0YSwgZXhwZWN0ZWRfdmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF92YWx1ZSwgdW5rbm93bl9maWVsZC5kYXRhKQorCisgIGRlZiB0ZXN0Q2hlY2tVbmtub3duRmllbGRWYWx1ZShzZWxmKToKKyAgICB1bmtub3duX2ZpZWxkX3NldCA9IHVua25vd25fZmllbGRzLlVua25vd25GaWVsZFNldChzZWxmLmVtcHR5X21lc3NhZ2UpCisgICAgIyBUZXN0IGVudW0uCisgICAgc2VsZi5DaGVja1Vua25vd25GaWVsZCgnb3B0aW9uYWxfbmVzdGVkX2VudW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9maWVsZF9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFsbF9maWVsZHMub3B0aW9uYWxfbmVzdGVkX2VudW0pCisgICAgc2VsZi5JbnRlcm5hbENoZWNrVW5rbm93bkZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfZW51bScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWxsX2ZpZWxkcy5vcHRpb25hbF9uZXN0ZWRfZW51bSkKKworICAgICMgVGVzdCByZXBlYXRlZCBlbnVtLgorICAgIHNlbGYuQ2hlY2tVbmtub3duRmllbGQoJ3JlcGVhdGVkX25lc3RlZF9lbnVtJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25fZmllbGRfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxfZmllbGRzLnJlcGVhdGVkX25lc3RlZF9lbnVtKQorICAgIHNlbGYuSW50ZXJuYWxDaGVja1Vua25vd25GaWVsZCgncmVwZWF0ZWRfbmVzdGVkX2VudW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFsbF9maWVsZHMucmVwZWF0ZWRfbmVzdGVkX2VudW0pCisKKyAgICAjIFRlc3QgdmFyaW50LgorICAgIHNlbGYuQ2hlY2tVbmtub3duRmllbGQoJ29wdGlvbmFsX2ludDMyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25fZmllbGRfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxfZmllbGRzLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuSW50ZXJuYWxDaGVja1Vua25vd25GaWVsZCgnb3B0aW9uYWxfaW50MzInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFsbF9maWVsZHMub3B0aW9uYWxfaW50MzIpCisKKyAgICAjIFRlc3QgZml4ZWQzMi4KKyAgICBzZWxmLkNoZWNrVW5rbm93bkZpZWxkKCdvcHRpb25hbF9maXhlZDMyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25fZmllbGRfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxfZmllbGRzLm9wdGlvbmFsX2ZpeGVkMzIpCisgICAgc2VsZi5JbnRlcm5hbENoZWNrVW5rbm93bkZpZWxkKCdvcHRpb25hbF9maXhlZDMyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxfZmllbGRzLm9wdGlvbmFsX2ZpeGVkMzIpCisKKyAgICAjIFRlc3QgZml4ZWQ2NC4KKyAgICBzZWxmLkNoZWNrVW5rbm93bkZpZWxkKCdvcHRpb25hbF9maXhlZDY0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25fZmllbGRfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxfZmllbGRzLm9wdGlvbmFsX2ZpeGVkNjQpCisgICAgc2VsZi5JbnRlcm5hbENoZWNrVW5rbm93bkZpZWxkKCdvcHRpb25hbF9maXhlZDY0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxfZmllbGRzLm9wdGlvbmFsX2ZpeGVkNjQpCisKKyAgICAjIFRlc3QgbGVuZ3RoIGRlbGltaXRlZC4KKyAgICBzZWxmLkNoZWNrVW5rbm93bkZpZWxkKCdvcHRpb25hbF9zdHJpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9maWVsZF9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFsbF9maWVsZHMub3B0aW9uYWxfc3RyaW5nLmVuY29kZSgndXRmLTgnKSkKKyAgICBzZWxmLkludGVybmFsQ2hlY2tVbmtub3duRmllbGQoJ29wdGlvbmFsX3N0cmluZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWxsX2ZpZWxkcy5vcHRpb25hbF9zdHJpbmcpCisKKyAgICAjIFRlc3QgZ3JvdXAuCisgICAgc2VsZi5DaGVja1Vua25vd25GaWVsZCgnb3B0aW9uYWxncm91cCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duX2ZpZWxkX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxNywgMCwgMTE3KSkKKyAgICBzZWxmLkludGVybmFsQ2hlY2tVbmtub3duRmllbGQoJ29wdGlvbmFsZ3JvdXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFsbF9maWVsZHMub3B0aW9uYWxncm91cCkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTgsIGxlbih1bmtub3duX2ZpZWxkX3NldCkpCisKKyAgZGVmIHRlc3RDb3B5RnJvbShzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UoKQorICAgIG1lc3NhZ2UuQ29weUZyb20oc2VsZi5lbXB0eV9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpLCBzZWxmLmFsbF9maWVsZHNfZGF0YSkKKworICBkZWYgdGVzdE1lcmdlRnJvbShzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbWVzc2FnZS5vcHRpb25hbF9pbnQzMiA9IDEKKyAgICBtZXNzYWdlLm9wdGlvbmFsX3VpbnQzMiA9IDIKKyAgICBzb3VyY2UgPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCisgICAgc291cmNlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisKKyAgICBtZXNzYWdlLkNsZWFyRmllbGQoJ29wdGlvbmFsX2ludDMyJykKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2ludDY0ID0gMworICAgIG1lc3NhZ2Uub3B0aW9uYWxfdWludDMyID0gNAorICAgIGRlc3RpbmF0aW9uID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UoKQorICAgIHVua25vd25fZmllbGRfc2V0ID0gdW5rbm93bl9maWVsZHMuVW5rbm93bkZpZWxkU2V0KGRlc3RpbmF0aW9uKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHVua25vd25fZmllbGRfc2V0KSkKKyAgICBkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHVua25vd25fZmllbGRfc2V0KSkKKyAgICB1bmtub3duX2ZpZWxkX3NldCA9IHVua25vd25fZmllbGRzLlVua25vd25GaWVsZFNldChkZXN0aW5hdGlvbikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbih1bmtub3duX2ZpZWxkX3NldCkpCisgICAgZGVzdGluYXRpb24uTWVyZ2VGcm9tKHNvdXJjZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbih1bmtub3duX2ZpZWxkX3NldCkpCisgICAgIyBDaGVjayB0aGF0IHRoZSBmaWVsZHMgd2hlcmUgY29ycmVjdGx5IG1lcmdlZCwgZXZlbiBzdG9yZWQgaW4gdGhlIHVua25vd24KKyAgICAjIGZpZWxkcyBzZXQuCisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGVzdGluYXRpb24uU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIsIDEpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLm9wdGlvbmFsX3VpbnQzMiwgMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2Uub3B0aW9uYWxfaW50NjQsIDMpCisKKyAgZGVmIHRlc3RDbGVhcihzZWxmKToKKyAgICB1bmtub3duX2ZpZWxkX3NldCA9IHVua25vd25fZmllbGRzLlVua25vd25GaWVsZFNldChzZWxmLmVtcHR5X21lc3NhZ2UpCisgICAgc2VsZi5lbXB0eV9tZXNzYWdlLkNsZWFyKCkKKyAgICAjIEFsbCBjbGVhcmVkLCBldmVuIHVua25vd24gZmllbGRzLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbXB0eV9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCksIGInJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih1bmtub3duX2ZpZWxkX3NldCksIDk4KQorCisgIEB1bml0dGVzdC5za2lwSWYoKHN5cy52ZXJzaW9uX2luZm8ubWFqb3IsIHN5cy52ZXJzaW9uX2luZm8ubWlub3IpIDwgKDMsIDQpLAorICAgICAgICAgICAgICAgICAgICd0cmFjZW1hbGxvYyByZXF1aXJlcyBweXRob24gMy40KycpCisgIGRlZiB0ZXN0VW5rbm93bkZpZWxkc05vTWVtb3J5TGVhayhzZWxmKToKKyAgICAjIENhbGwgdG8gVW5rbm93bkZpZWxkcyBtdXN0IG5vdCBsZWFrIG1lbW9yeQorICAgIG5iX2xlYWtzID0gMTIzNAorCisgICAgZGVmIGxlYWtpbmdfZnVuY3Rpb24oKToKKyAgICAgIGZvciBfIGluIHJhbmdlKG5iX2xlYWtzKToKKyAgICAgICAgdW5rbm93bl9maWVsZHMuVW5rbm93bkZpZWxkU2V0KHNlbGYuZW1wdHlfbWVzc2FnZSkKKworICAgIHRyYWNlbWFsbG9jLnN0YXJ0KCkKKyAgICBzbmFwc2hvdDEgPSB0cmFjZW1hbGxvYy50YWtlX3NuYXBzaG90KCkKKyAgICBsZWFraW5nX2Z1bmN0aW9uKCkKKyAgICBzbmFwc2hvdDIgPSB0cmFjZW1hbGxvYy50YWtlX3NuYXBzaG90KCkKKyAgICB0b3Bfc3RhdHMgPSBzbmFwc2hvdDIuY29tcGFyZV90byhzbmFwc2hvdDEsICdsaW5lbm8nKQorICAgIHRyYWNlbWFsbG9jLnN0b3AoKQorICAgICMgVGhlcmUncyBubyBlYXN5IHdheSB0byBsb29rIGZvciBhIHByZWNpc2UgbGVhayBzb3VyY2UuCisgICAgIyBSZWx5IG9uIGEgIm1hcmtlciIgY291bnQgdmFsdWUgd2hpbGUgY2hlY2tpbmcgYWxsb2NhdGVkIG1lbW9yeS4KKyAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBbeCBmb3IgeCBpbiB0b3Bfc3RhdHMgaWYgeC5jb3VudF9kaWZmID09IG5iX2xlYWtzXSkKKworICBkZWYgdGVzdFN1YlVua25vd25GaWVsZHMoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIG1lc3NhZ2Uub3B0aW9uYWxncm91cC5hID0gMTIzCisgICAgZGVzdGluYXRpb24gPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCisgICAgZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzdWJfdW5rbm93bl9maWVsZHMgPSB1bmtub3duX2ZpZWxkcy5Vbmtub3duRmllbGRTZXQoZGVzdGluYXRpb24pWzBdLmRhdGEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihzdWJfdW5rbm93bl9maWVsZHMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3ViX3Vua25vd25fZmllbGRzWzBdLmRhdGEsIDEyMykKKyAgICBkZXN0aW5hdGlvbi5DbGVhcigpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4oc3ViX3Vua25vd25fZmllbGRzKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHN1Yl91bmtub3duX2ZpZWxkc1swXS5kYXRhLCAxMjMpCisgICAgbWVzc2FnZS5DbGVhcigpCisgICAgbWVzc2FnZS5vcHRpb25hbF91aW50MzIgPSA0NTYKKyAgICBuZXN0ZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5OZXN0ZWRUZXN0QWxsVHlwZXMoKQorICAgIG5lc3RlZF9tZXNzYWdlLnBheWxvYWQub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKAorICAgICAgICBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgdW5rbm93bl9maWVsZF9zZXQgPSB1bmtub3duX2ZpZWxkcy5Vbmtub3duRmllbGRTZXQoCisgICAgICAgIG5lc3RlZF9tZXNzYWdlLnBheWxvYWQub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmtub3duX2ZpZWxkX3NldFswXS5kYXRhLCA0NTYpCisgICAgbmVzdGVkX21lc3NhZ2UuQ2xlYXJGaWVsZCgncGF5bG9hZCcpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmtub3duX2ZpZWxkX3NldFswXS5kYXRhLCA0NTYpCisgICAgdW5rbm93bl9maWVsZF9zZXQgPSB1bmtub3duX2ZpZWxkcy5Vbmtub3duRmllbGRTZXQoCisgICAgICAgIG5lc3RlZF9tZXNzYWdlLnBheWxvYWQub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4odW5rbm93bl9maWVsZF9zZXQpKQorCisgIGRlZiB0ZXN0VW5rbm93bkZpZWxkKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2ludDMyID0gMTIzCisgICAgZGVzdGluYXRpb24gPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCisgICAgZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICB1bmtub3duX2ZpZWxkID0gdW5rbm93bl9maWVsZHMuVW5rbm93bkZpZWxkU2V0KGRlc3RpbmF0aW9uKVswXQorICAgIGRlc3RpbmF0aW9uLkNsZWFyKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVua25vd25fZmllbGQuZGF0YSwgMTIzKQorCisgIGRlZiB0ZXN0VW5rbm93bkV4dGVuc2lvbnMoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMoKQorICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlbGYuYWxsX2ZpZWxkc19kYXRhKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHVua25vd25fZmllbGRzLlVua25vd25GaWVsZFNldChtZXNzYWdlKSksIDk4KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpLCBzZWxmLmFsbF9maWVsZHNfZGF0YSkKKworCitAdGVzdGluZ19yZWZsZWFrcy5UZXN0Q2FzZQorY2xhc3MgVW5rbm93bkVudW1WYWx1ZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc2VsZi5kZXNjcmlwdG9yID0gbWlzc2luZ19lbnVtX3ZhbHVlc19wYjIuVGVzdEVudW1WYWx1ZXMuREVTQ1JJUFRPUgorCisgICAgc2VsZi5tZXNzYWdlID0gbWlzc2luZ19lbnVtX3ZhbHVlc19wYjIuVGVzdEVudW1WYWx1ZXMoKQorICAgICMgVGVzdEVudW1WYWx1ZXMuWkVSTyA9IDAsIGJ1dCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgb3RoZXIgTmVzdGVkRW51bS4KKyAgICBzZWxmLm1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0gPSAoCisgICAgICAgIG1pc3NpbmdfZW51bV92YWx1ZXNfcGIyLlRlc3RFbnVtVmFsdWVzLlpFUk8pCisgICAgc2VsZi5tZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtLmV4dGVuZChbCisgICAgICAgIG1pc3NpbmdfZW51bV92YWx1ZXNfcGIyLlRlc3RFbnVtVmFsdWVzLlpFUk8sCisgICAgICAgIG1pc3NpbmdfZW51bV92YWx1ZXNfcGIyLlRlc3RFbnVtVmFsdWVzLk9ORSwKKyAgICAgICAgXSkKKyAgICBzZWxmLm1lc3NhZ2UucGFja2VkX25lc3RlZF9lbnVtLmV4dGVuZChbCisgICAgICAgIG1pc3NpbmdfZW51bV92YWx1ZXNfcGIyLlRlc3RFbnVtVmFsdWVzLlpFUk8sCisgICAgICAgIG1pc3NpbmdfZW51bV92YWx1ZXNfcGIyLlRlc3RFbnVtVmFsdWVzLk9ORSwKKyAgICAgICAgXSkKKyAgICBzZWxmLm1lc3NhZ2VfZGF0YSA9IHNlbGYubWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpCisgICAgc2VsZi5taXNzaW5nX21lc3NhZ2UgPSBtaXNzaW5nX2VudW1fdmFsdWVzX3BiMi5UZXN0TWlzc2luZ0VudW1WYWx1ZXMoKQorICAgIHNlbGYubWlzc2luZ19tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzZWxmLm1lc3NhZ2VfZGF0YSkKKworICAjIENoZWNrVW5rbm93bkZpZWxkKCkgaXMgYW4gYWRkaXRpb25hbCBQdXJlIFB5dGhvbiBjaGVjayB3aGljaCBjaGVja3MKKyAgIyBhIGRldGFpbCBvZiB1bmtub3duIGZpZWxkcy4gSXQgY2Fubm90IGJlIHVzZWQgYnkgdGhlIEMrKworICAjIGltcGxlbWVudGF0aW9uIGJlY2F1c2Ugc29tZSBwcm90ZWN0IG1lbWJlcnMgYXJlIGNhbGxlZC4KKyAgIyBUaGUgdGVzdCBpcyBhZGRlZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLiBJdCBpcyBub3QgbmVjZXNzYXJ5IGFzCisgICMgc2VyaWFsaXplZCBzdHJpbmcgaXMgY2hlY2tlZC4KKworICBkZWYgQ2hlY2tVbmtub3duRmllbGQoc2VsZiwgbmFtZSwgZXhwZWN0ZWRfdmFsdWUpOgorICAgIGZpZWxkX2Rlc2NyaXB0b3IgPSBzZWxmLmRlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbbmFtZV0KKyAgICB1bmtub3duX2ZpZWxkX3NldCA9IHVua25vd25fZmllbGRzLlVua25vd25GaWVsZFNldChzZWxmLm1pc3NpbmdfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodW5rbm93bl9maWVsZF9zZXQsIHVua25vd25fZmllbGRzLlVua25vd25GaWVsZFNldCkKKyAgICBjb3VudCA9IDAKKyAgICBmb3IgZmllbGQgaW4gdW5rbm93bl9maWVsZF9zZXQ6CisgICAgICBpZiBmaWVsZC5maWVsZF9udW1iZXIgPT0gZmllbGRfZGVzY3JpcHRvci5udW1iZXI6CisgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgaWYgZmllbGRfZGVzY3JpcHRvci5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgICAgICBzZWxmLmFzc2VydEluKGZpZWxkLmRhdGEsIGV4cGVjdGVkX3ZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFsdWUsIGZpZWxkLmRhdGEpCisgICAgaWYgZmllbGRfZGVzY3JpcHRvci5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIGxlbihleHBlY3RlZF92YWx1ZSkpCisgICAgZWxzZToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIDEpCisKKyAgZGVmIHRlc3RVbmtub3duUGFyc2VNaXNtYXRjaEVudW1WYWx1ZShzZWxmKToKKyAgICBqdXN0X3N0cmluZyA9IG1pc3NpbmdfZW51bV92YWx1ZXNfcGIyLkp1c3RTdHJpbmcoKQorICAgIGp1c3Rfc3RyaW5nLmR1bW15ID0gJ2JsYWgnCisKKyAgICBtaXNzaW5nID0gbWlzc2luZ19lbnVtX3ZhbHVlc19wYjIuVGVzdEVudW1WYWx1ZXMoKQorICAgICMgVGhlIHBhcnNlIGlzIGludmFsaWQsIHN0b3JpbmcgdGhlIHN0cmluZyBwcm90byBpbnRvIHRoZSBzZXQgb2YKKyAgICAjIHVua25vd24gZmllbGRzLgorICAgIG1pc3NpbmcuUGFyc2VGcm9tU3RyaW5nKGp1c3Rfc3RyaW5nLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisKKyAgICAjIEZldGNoaW5nIHRoZSBlbnVtIGZpZWxkIHNob3VsZG4ndCBjcmFzaCwgaW5zdGVhZCByZXR1cm5pbmcgdGhlCisgICAgIyBkZWZhdWx0IHZhbHVlLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWlzc2luZy5vcHRpb25hbF9uZXN0ZWRfZW51bSwgMCkKKworICBkZWYgdGVzdFVua25vd25FbnVtVmFsdWUoc2VsZik6CisgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1pc3NpbmdfbWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX2VudW0nKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubWlzc2luZ19tZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9lbnVtLCAyKQorICAgICMgQ2xlYXIgZG9lcyBub3QgZG8gYW55dGhpbmcuCisgICAgc2VyaWFsaXplZCA9IHNlbGYubWlzc2luZ19tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBzZWxmLm1pc3NpbmdfbWVzc2FnZS5DbGVhckZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfZW51bScpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1pc3NpbmdfbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpLCBzZXJpYWxpemVkKQorCisgIGRlZiB0ZXN0VW5rbm93blJlcGVhdGVkRW51bVZhbHVlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIHNlbGYubWlzc2luZ19tZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtKQorCisgIGRlZiB0ZXN0VW5rbm93blBhY2tlZEVudW1WYWx1ZShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBzZWxmLm1pc3NpbmdfbWVzc2FnZS5wYWNrZWRfbmVzdGVkX2VudW0pCisKKyAgZGVmIHRlc3RDaGVja1Vua25vd25GaWVsZFZhbHVlRm9yRW51bShzZWxmKToKKyAgICB1bmtub3duX2ZpZWxkX3NldCA9IHVua25vd25fZmllbGRzLlVua25vd25GaWVsZFNldChzZWxmLm1pc3NpbmdfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih1bmtub3duX2ZpZWxkX3NldCksIDUpCisgICAgc2VsZi5DaGVja1Vua25vd25GaWVsZCgnb3B0aW9uYWxfbmVzdGVkX2VudW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9lbnVtKQorICAgIHNlbGYuQ2hlY2tVbmtub3duRmllbGQoJ3JlcGVhdGVkX25lc3RlZF9lbnVtJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSkKKyAgICBzZWxmLkNoZWNrVW5rbm93bkZpZWxkKCdwYWNrZWRfbmVzdGVkX2VudW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXNzYWdlLnBhY2tlZF9uZXN0ZWRfZW51bSkKKworICBkZWYgdGVzdFJvdW5kVHJpcChzZWxmKToKKyAgICBuZXdfbWVzc2FnZSA9IG1pc3NpbmdfZW51bV92YWx1ZXNfcGIyLlRlc3RFbnVtVmFsdWVzKCkKKyAgICBuZXdfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoc2VsZi5taXNzaW5nX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubWVzc2FnZSwgbmV3X21lc3NhZ2UpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dlbGxfa25vd25fdHlwZXMucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dlbGxfa25vd25fdHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4MWQ3NQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2VsbF9rbm93bl90eXBlcy5weQpAQCAtMCwwICsxLDg4MCBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJDb250YWlucyB3ZWxsIGtub3duIGNsYXNzZXMuCisKK1RoaXMgZmlsZXMgZGVmaW5lcyB3ZWxsIGtub3duIGNsYXNzZXMgd2hpY2ggbmVlZCBleHRyYSBtYWludGVuYW5jZSBpbmNsdWRpbmc6CisgIC0gQW55CisgIC0gRHVyYXRpb24KKyAgLSBGaWVsZE1hc2sKKyAgLSBTdHJ1Y3QKKyAgLSBUaW1lc3RhbXAKKyIiIgorCitfX2F1dGhvcl9fID0gJ2ppZWx1b0Bnb29nbGUuY29tIChKaWUgTHVvKScKKworaW1wb3J0IGNhbGVuZGFyCitpbXBvcnQgY29sbGVjdGlvbnMuYWJjCitpbXBvcnQgZGF0ZXRpbWUKKworZnJvbSBnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvciBpbXBvcnQgRmllbGREZXNjcmlwdG9yCisKK19USU1FU1RBTVBGT01BVCA9ICclWS0lbS0lZFQlSDolTTolUycKK19OQU5PU19QRVJfU0VDT05EID0gMTAwMDAwMDAwMAorX05BTk9TX1BFUl9NSUxMSVNFQ09ORCA9IDEwMDAwMDAKK19OQU5PU19QRVJfTUlDUk9TRUNPTkQgPSAxMDAwCitfTUlMTElTX1BFUl9TRUNPTkQgPSAxMDAwCitfTUlDUk9TX1BFUl9TRUNPTkQgPSAxMDAwMDAwCitfU0VDT05EU19QRVJfREFZID0gMjQgKiAzNjAwCitfRFVSQVRJT05fU0VDT05EU19NQVggPSAzMTU1NzYwMDAwMDAKKworCitjbGFzcyBBbnkob2JqZWN0KToKKyAgIiIiQ2xhc3MgZm9yIEFueSBNZXNzYWdlIHR5cGUuIiIiCisKKyAgX19zbG90c19fID0gKCkKKworICBkZWYgUGFjayhzZWxmLCBtc2csIHR5cGVfdXJsX3ByZWZpeD0ndHlwZS5nb29nbGVhcGlzLmNvbS8nLAorICAgICAgICAgICBkZXRlcm1pbmlzdGljPU5vbmUpOgorICAgICIiIlBhY2tzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpbnRvIGN1cnJlbnQgQW55IG1lc3NhZ2UuIiIiCisgICAgaWYgbGVuKHR5cGVfdXJsX3ByZWZpeCkgPCAxIG9yIHR5cGVfdXJsX3ByZWZpeFstMV0gIT0gJy8nOgorICAgICAgc2VsZi50eXBlX3VybCA9ICclcy8lcycgJSAodHlwZV91cmxfcHJlZml4LCBtc2cuREVTQ1JJUFRPUi5mdWxsX25hbWUpCisgICAgZWxzZToKKyAgICAgIHNlbGYudHlwZV91cmwgPSAnJXMlcycgJSAodHlwZV91cmxfcHJlZml4LCBtc2cuREVTQ1JJUFRPUi5mdWxsX25hbWUpCisgICAgc2VsZi52YWx1ZSA9IG1zZy5TZXJpYWxpemVUb1N0cmluZyhkZXRlcm1pbmlzdGljPWRldGVybWluaXN0aWMpCisKKyAgZGVmIFVucGFjayhzZWxmLCBtc2cpOgorICAgICIiIlVucGFja3MgdGhlIGN1cnJlbnQgQW55IG1lc3NhZ2UgaW50byBzcGVjaWZpZWQgbWVzc2FnZS4iIiIKKyAgICBkZXNjcmlwdG9yID0gbXNnLkRFU0NSSVBUT1IKKyAgICBpZiBub3Qgc2VsZi5JcyhkZXNjcmlwdG9yKToKKyAgICAgIHJldHVybiBGYWxzZQorICAgIG1zZy5QYXJzZUZyb21TdHJpbmcoc2VsZi52YWx1ZSkKKyAgICByZXR1cm4gVHJ1ZQorCisgIGRlZiBUeXBlTmFtZShzZWxmKToKKyAgICAiIiJSZXR1cm5zIHRoZSBwcm90b2J1ZiB0eXBlIG5hbWUgb2YgdGhlIGlubmVyIG1lc3NhZ2UuIiIiCisgICAgIyBPbmx5IGxhc3QgcGFydCBpcyB0byBiZSB1c2VkOiBiLzI1NjMwMTEyCisgICAgcmV0dXJuIHNlbGYudHlwZV91cmwuc3BsaXQoJy8nKVstMV0KKworICBkZWYgSXMoc2VsZiwgZGVzY3JpcHRvcik6CisgICAgIiIiQ2hlY2tzIGlmIHRoaXMgQW55IHJlcHJlc2VudHMgdGhlIGdpdmVuIHByb3RvYnVmIHR5cGUuIiIiCisgICAgcmV0dXJuICcvJyBpbiBzZWxmLnR5cGVfdXJsIGFuZCBzZWxmLlR5cGVOYW1lKCkgPT0gZGVzY3JpcHRvci5mdWxsX25hbWUKKworCitfRVBPQ0hfREFURVRJTUVfTkFJVkUgPSBkYXRldGltZS5kYXRldGltZS51dGNmcm9tdGltZXN0YW1wKDApCitfRVBPQ0hfREFURVRJTUVfQVdBUkUgPSBkYXRldGltZS5kYXRldGltZS5mcm9tdGltZXN0YW1wKAorICAgIDAsIHR6PWRhdGV0aW1lLnRpbWV6b25lLnV0YykKKworCitjbGFzcyBUaW1lc3RhbXAob2JqZWN0KToKKyAgIiIiQ2xhc3MgZm9yIFRpbWVzdGFtcCBtZXNzYWdlIHR5cGUuIiIiCisKKyAgX19zbG90c19fID0gKCkKKworICBkZWYgVG9Kc29uU3RyaW5nKHNlbGYpOgorICAgICIiIkNvbnZlcnRzIFRpbWVzdGFtcCB0byBSRkMgMzMzOSBkYXRlIHN0cmluZyBmb3JtYXQuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBzdHJpbmcgY29udmVydGVkIGZyb20gdGltZXN0YW1wLiBUaGUgc3RyaW5nIGlzIGFsd2F5cyBaLW5vcm1hbGl6ZWQKKyAgICAgIGFuZCB1c2VzIDMsIDYgb3IgOSBmcmFjdGlvbmFsIGRpZ2l0cyBhcyByZXF1aXJlZCB0byByZXByZXNlbnQgdGhlCisgICAgICBleGFjdCB0aW1lLiBFeGFtcGxlIG9mIHRoZSByZXR1cm4gZm9ybWF0OiAnMTk3Mi0wMS0wMVQxMDowMDoyMC4wMjFaJworICAgICIiIgorICAgIG5hbm9zID0gc2VsZi5uYW5vcyAlIF9OQU5PU19QRVJfU0VDT05ECisgICAgdG90YWxfc2VjID0gc2VsZi5zZWNvbmRzICsgKHNlbGYubmFub3MgLSBuYW5vcykgLy8gX05BTk9TX1BFUl9TRUNPTkQKKyAgICBzZWNvbmRzID0gdG90YWxfc2VjICUgX1NFQ09ORFNfUEVSX0RBWQorICAgIGRheXMgPSAodG90YWxfc2VjIC0gc2Vjb25kcykgLy8gX1NFQ09ORFNfUEVSX0RBWQorICAgIGR0ID0gZGF0ZXRpbWUuZGF0ZXRpbWUoMTk3MCwgMSwgMSkgKyBkYXRldGltZS50aW1lZGVsdGEoZGF5cywgc2Vjb25kcykKKworICAgIHJlc3VsdCA9IGR0Lmlzb2Zvcm1hdCgpCisgICAgaWYgKG5hbm9zICUgMWU5KSA9PSAwOgorICAgICAgIyBJZiB0aGVyZSBhcmUgMCBmcmFjdGlvbmFsIGRpZ2l0cywgdGhlIGZyYWN0aW9uYWwKKyAgICAgICMgcG9pbnQgJy4nIHNob3VsZCBiZSBvbWl0dGVkIHdoZW4gc2VyaWFsaXppbmcuCisgICAgICByZXR1cm4gcmVzdWx0ICsgJ1onCisgICAgaWYgKG5hbm9zICUgMWU2KSA9PSAwOgorICAgICAgIyBTZXJpYWxpemUgMyBmcmFjdGlvbmFsIGRpZ2l0cy4KKyAgICAgIHJldHVybiByZXN1bHQgKyAnLiUwM2RaJyAlIChuYW5vcyAvIDFlNikKKyAgICBpZiAobmFub3MgJSAxZTMpID09IDA6CisgICAgICAjIFNlcmlhbGl6ZSA2IGZyYWN0aW9uYWwgZGlnaXRzLgorICAgICAgcmV0dXJuIHJlc3VsdCArICcuJTA2ZFonICUgKG5hbm9zIC8gMWUzKQorICAgICMgU2VyaWFsaXplIDkgZnJhY3Rpb25hbCBkaWdpdHMuCisgICAgcmV0dXJuIHJlc3VsdCArICcuJTA5ZFonICUgbmFub3MKKworICBkZWYgRnJvbUpzb25TdHJpbmcoc2VsZiwgdmFsdWUpOgorICAgICIiIlBhcnNlIGEgUkZDIDMzMzkgZGF0ZSBzdHJpbmcgZm9ybWF0IHRvIFRpbWVzdGFtcC4KKworICAgIEFyZ3M6CisgICAgICB2YWx1ZTogQSBkYXRlIHN0cmluZy4gQW55IGZyYWN0aW9uYWwgZGlnaXRzIChvciBub25lKSBhbmQgYW55IG9mZnNldCBhcmUKKyAgICAgICAgICBhY2NlcHRlZCBhcyBsb25nIGFzIHRoZXkgZml0IGludG8gbmFuby1zZWNvbmRzIHByZWNpc2lvbi4KKyAgICAgICAgICBFeGFtcGxlIG9mIGFjY2VwdGVkIGZvcm1hdDogJzE5NzItMDEtMDFUMTA6MDA6MjAuMDIxLTA1OjAwJworCisgICAgUmFpc2VzOgorICAgICAgVmFsdWVFcnJvcjogT24gcGFyc2luZyBwcm9ibGVtcy4KKyAgICAiIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1RpbWVzdGFtcCBKU09OIHZhbHVlIG5vdCBhIHN0cmluZzogeyFyfScuZm9ybWF0KHZhbHVlKSkKKyAgICB0aW1lem9uZV9vZmZzZXQgPSB2YWx1ZS5maW5kKCdaJykKKyAgICBpZiB0aW1lem9uZV9vZmZzZXQgPT0gLTE6CisgICAgICB0aW1lem9uZV9vZmZzZXQgPSB2YWx1ZS5maW5kKCcrJykKKyAgICBpZiB0aW1lem9uZV9vZmZzZXQgPT0gLTE6CisgICAgICB0aW1lem9uZV9vZmZzZXQgPSB2YWx1ZS5yZmluZCgnLScpCisgICAgaWYgdGltZXpvbmVfb2Zmc2V0ID09IC0xOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIHRpbWVzdGFtcDogbWlzc2luZyB2YWxpZCB0aW1lem9uZSBvZmZzZXQuJykKKyAgICB0aW1lX3ZhbHVlID0gdmFsdWVbMDp0aW1lem9uZV9vZmZzZXRdCisgICAgIyBQYXJzZSBkYXRldGltZSBhbmQgbmFub3MuCisgICAgcG9pbnRfcG9zaXRpb24gPSB0aW1lX3ZhbHVlLmZpbmQoJy4nKQorICAgIGlmIHBvaW50X3Bvc2l0aW9uID09IC0xOgorICAgICAgc2Vjb25kX3ZhbHVlID0gdGltZV92YWx1ZQorICAgICAgbmFub192YWx1ZSA9ICcnCisgICAgZWxzZToKKyAgICAgIHNlY29uZF92YWx1ZSA9IHRpbWVfdmFsdWVbOnBvaW50X3Bvc2l0aW9uXQorICAgICAgbmFub192YWx1ZSA9IHRpbWVfdmFsdWVbcG9pbnRfcG9zaXRpb24gKyAxOl0KKyAgICBpZiAndCcgaW4gc2Vjb25kX3ZhbHVlOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAndGltZSBkYXRhIFwnezB9XCcgZG9lcyBub3QgbWF0Y2ggZm9ybWF0IFwnJVktJW0tJWRUJUg6JU06JVNcJywgJworICAgICAgICAgICdsb3dlcmNhc2UgXCd0XCcgaXMgbm90IGFjY2VwdGVkJy5mb3JtYXQoc2Vjb25kX3ZhbHVlKSkKKyAgICBkYXRlX29iamVjdCA9IGRhdGV0aW1lLmRhdGV0aW1lLnN0cnB0aW1lKHNlY29uZF92YWx1ZSwgX1RJTUVTVEFNUEZPTUFUKQorICAgIHRkID0gZGF0ZV9vYmplY3QgLSBkYXRldGltZS5kYXRldGltZSgxOTcwLCAxLCAxKQorICAgIHNlY29uZHMgPSB0ZC5zZWNvbmRzICsgdGQuZGF5cyAqIF9TRUNPTkRTX1BFUl9EQVkKKyAgICBpZiBsZW4obmFub192YWx1ZSkgPiA5OgorICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIFRpbWVzdGFtcDogbmFub3MgezB9IG1vcmUgdGhhbiAnCisgICAgICAgICAgJzkgZnJhY3Rpb25hbCBkaWdpdHMuJy5mb3JtYXQobmFub192YWx1ZSkpCisgICAgaWYgbmFub192YWx1ZToKKyAgICAgIG5hbm9zID0gcm91bmQoZmxvYXQoJzAuJyArIG5hbm9fdmFsdWUpICogMWU5KQorICAgIGVsc2U6CisgICAgICBuYW5vcyA9IDAKKyAgICAjIFBhcnNlIHRpbWV6b25lIG9mZnNldHMuCisgICAgaWYgdmFsdWVbdGltZXpvbmVfb2Zmc2V0XSA9PSAnWic6CisgICAgICBpZiBsZW4odmFsdWUpICE9IHRpbWV6b25lX29mZnNldCArIDE6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSB0aW1lc3RhbXA6IGludmFsaWQgdHJhaWxpbmcnCisgICAgICAgICAgICAgICAgICAgICAgICAgJyBkYXRhIHswfS4nLmZvcm1hdCh2YWx1ZSkpCisgICAgZWxzZToKKyAgICAgIHRpbWV6b25lID0gdmFsdWVbdGltZXpvbmVfb2Zmc2V0Ol0KKyAgICAgIHBvcyA9IHRpbWV6b25lLmZpbmQoJzonKQorICAgICAgaWYgcG9zID09IC0xOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgJ0ludmFsaWQgdGltZXpvbmUgb2Zmc2V0IHZhbHVlOiB7MH0uJy5mb3JtYXQodGltZXpvbmUpKQorICAgICAgaWYgdGltZXpvbmVbMF0gPT0gJysnOgorICAgICAgICBzZWNvbmRzIC09IChpbnQodGltZXpvbmVbMTpwb3NdKSo2MCtpbnQodGltZXpvbmVbcG9zKzE6XSkpKjYwCisgICAgICBlbHNlOgorICAgICAgICBzZWNvbmRzICs9IChpbnQodGltZXpvbmVbMTpwb3NdKSo2MCtpbnQodGltZXpvbmVbcG9zKzE6XSkpKjYwCisgICAgIyBTZXQgc2Vjb25kcyBhbmQgbmFub3MKKyAgICBzZWxmLnNlY29uZHMgPSBpbnQoc2Vjb25kcykKKyAgICBzZWxmLm5hbm9zID0gaW50KG5hbm9zKQorCisgIGRlZiBHZXRDdXJyZW50VGltZShzZWxmKToKKyAgICAiIiJHZXQgdGhlIGN1cnJlbnQgVVRDIGludG8gVGltZXN0YW1wLiIiIgorICAgIHNlbGYuRnJvbURhdGV0aW1lKGRhdGV0aW1lLmRhdGV0aW1lLnV0Y25vdygpKQorCisgIGRlZiBUb05hbm9zZWNvbmRzKHNlbGYpOgorICAgICIiIkNvbnZlcnRzIFRpbWVzdGFtcCB0byBuYW5vc2Vjb25kcyBzaW5jZSBlcG9jaC4iIiIKKyAgICByZXR1cm4gc2VsZi5zZWNvbmRzICogX05BTk9TX1BFUl9TRUNPTkQgKyBzZWxmLm5hbm9zCisKKyAgZGVmIFRvTWljcm9zZWNvbmRzKHNlbGYpOgorICAgICIiIkNvbnZlcnRzIFRpbWVzdGFtcCB0byBtaWNyb3NlY29uZHMgc2luY2UgZXBvY2guIiIiCisgICAgcmV0dXJuIChzZWxmLnNlY29uZHMgKiBfTUlDUk9TX1BFUl9TRUNPTkQgKworICAgICAgICAgICAgc2VsZi5uYW5vcyAvLyBfTkFOT1NfUEVSX01JQ1JPU0VDT05EKQorCisgIGRlZiBUb01pbGxpc2Vjb25kcyhzZWxmKToKKyAgICAiIiJDb252ZXJ0cyBUaW1lc3RhbXAgdG8gbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoLiIiIgorICAgIHJldHVybiAoc2VsZi5zZWNvbmRzICogX01JTExJU19QRVJfU0VDT05EICsKKyAgICAgICAgICAgIHNlbGYubmFub3MgLy8gX05BTk9TX1BFUl9NSUxMSVNFQ09ORCkKKworICBkZWYgVG9TZWNvbmRzKHNlbGYpOgorICAgICIiIkNvbnZlcnRzIFRpbWVzdGFtcCB0byBzZWNvbmRzIHNpbmNlIGVwb2NoLiIiIgorICAgIHJldHVybiBzZWxmLnNlY29uZHMKKworICBkZWYgRnJvbU5hbm9zZWNvbmRzKHNlbGYsIG5hbm9zKToKKyAgICAiIiJDb252ZXJ0cyBuYW5vc2Vjb25kcyBzaW5jZSBlcG9jaCB0byBUaW1lc3RhbXAuIiIiCisgICAgc2VsZi5zZWNvbmRzID0gbmFub3MgLy8gX05BTk9TX1BFUl9TRUNPTkQKKyAgICBzZWxmLm5hbm9zID0gbmFub3MgJSBfTkFOT1NfUEVSX1NFQ09ORAorCisgIGRlZiBGcm9tTWljcm9zZWNvbmRzKHNlbGYsIG1pY3Jvcyk6CisgICAgIiIiQ29udmVydHMgbWljcm9zZWNvbmRzIHNpbmNlIGVwb2NoIHRvIFRpbWVzdGFtcC4iIiIKKyAgICBzZWxmLnNlY29uZHMgPSBtaWNyb3MgLy8gX01JQ1JPU19QRVJfU0VDT05ECisgICAgc2VsZi5uYW5vcyA9IChtaWNyb3MgJSBfTUlDUk9TX1BFUl9TRUNPTkQpICogX05BTk9TX1BFUl9NSUNST1NFQ09ORAorCisgIGRlZiBGcm9tTWlsbGlzZWNvbmRzKHNlbGYsIG1pbGxpcyk6CisgICAgIiIiQ29udmVydHMgbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoIHRvIFRpbWVzdGFtcC4iIiIKKyAgICBzZWxmLnNlY29uZHMgPSBtaWxsaXMgLy8gX01JTExJU19QRVJfU0VDT05ECisgICAgc2VsZi5uYW5vcyA9IChtaWxsaXMgJSBfTUlMTElTX1BFUl9TRUNPTkQpICogX05BTk9TX1BFUl9NSUxMSVNFQ09ORAorCisgIGRlZiBGcm9tU2Vjb25kcyhzZWxmLCBzZWNvbmRzKToKKyAgICAiIiJDb252ZXJ0cyBzZWNvbmRzIHNpbmNlIGVwb2NoIHRvIFRpbWVzdGFtcC4iIiIKKyAgICBzZWxmLnNlY29uZHMgPSBzZWNvbmRzCisgICAgc2VsZi5uYW5vcyA9IDAKKworICBkZWYgVG9EYXRldGltZShzZWxmLCB0emluZm89Tm9uZSk6CisgICAgIiIiQ29udmVydHMgVGltZXN0YW1wIHRvIGEgZGF0ZXRpbWUuCisKKyAgICBBcmdzOgorICAgICAgdHppbmZvOiBBIGRhdGV0aW1lLnR6aW5mbyBzdWJjbGFzczsgZGVmYXVsdHMgdG8gTm9uZS4KKworICAgIFJldHVybnM6CisgICAgICBJZiB0emluZm8gaXMgTm9uZSwgcmV0dXJucyBhIHRpbWV6b25lLW5haXZlIFVUQyBkYXRldGltZSAod2l0aCBubyB0aW1lem9uZQorICAgICAgaW5mb3JtYXRpb24sIGkuZS4gbm90IGF3YXJlIHRoYXQgaXQncyBVVEMpLgorCisgICAgICBPdGhlcndpc2UsIHJldHVybnMgYSB0aW1lem9uZS1hd2FyZSBkYXRldGltZSBpbiB0aGUgaW5wdXQgdGltZXpvbmUuCisgICAgIiIiCisgICAgZGVsdGEgPSBkYXRldGltZS50aW1lZGVsdGEoCisgICAgICAgIHNlY29uZHM9c2VsZi5zZWNvbmRzLAorICAgICAgICBtaWNyb3NlY29uZHM9X1JvdW5kVG93YXJkWmVybyhzZWxmLm5hbm9zLCBfTkFOT1NfUEVSX01JQ1JPU0VDT05EKSkKKyAgICBpZiB0emluZm8gaXMgTm9uZToKKyAgICAgIHJldHVybiBfRVBPQ0hfREFURVRJTUVfTkFJVkUgKyBkZWx0YQorICAgIGVsc2U6CisgICAgICByZXR1cm4gX0VQT0NIX0RBVEVUSU1FX0FXQVJFLmFzdGltZXpvbmUodHppbmZvKSArIGRlbHRhCisKKyAgZGVmIEZyb21EYXRldGltZShzZWxmLCBkdCk6CisgICAgIiIiQ29udmVydHMgZGF0ZXRpbWUgdG8gVGltZXN0YW1wLgorCisgICAgQXJnczoKKyAgICAgIGR0OiBBIGRhdGV0aW1lLiBJZiBpdCdzIHRpbWV6b25lLW5haXZlLCBpdCdzIGFzc3VtZWQgdG8gYmUgaW4gVVRDLgorICAgICIiIgorICAgICMgVXNpbmcgdGhpcyBndWlkZTogaHR0cDovL3dpa2kucHl0aG9uLm9yZy9tb2luL1dvcmtpbmdXaXRoVGltZQorICAgICMgQW5kIHRoaXMgY29udmVyc2lvbiBndWlkZTogaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3RpbWUuaHRtbAorCisgICAgIyBUdXJuIHRoZSBkYXRlIHBhcmFtZXRlciBpbnRvIGEgdHVwbGUgKHN0cnVjdF90aW1lKSB0aGF0IGNhbiB0aGVuIGJlCisgICAgIyBtYW5pcHVsYXRlZCBpbnRvIGEgbG9uZyB2YWx1ZSBvZiBzZWNvbmRzLiAgRHVyaW5nIHRoZSBjb252ZXJzaW9uIGZyb20KKyAgICAjIHN0cnVjdF90aW1lIHRvIGxvbmcsIHRoZSBzb3VyY2UgZGF0ZSBpbiBVVEMsIGFuZCBzbyBpdCBmb2xsb3dzIHRoYXQgdGhlCisgICAgIyBjb3JyZWN0IHRyYW5zZm9ybWF0aW9uIGlzIGNhbGVuZGFyLnRpbWVnbSgpCisgICAgc2VsZi5zZWNvbmRzID0gY2FsZW5kYXIudGltZWdtKGR0LnV0Y3RpbWV0dXBsZSgpKQorICAgIHNlbGYubmFub3MgPSBkdC5taWNyb3NlY29uZCAqIF9OQU5PU19QRVJfTUlDUk9TRUNPTkQKKworCitjbGFzcyBEdXJhdGlvbihvYmplY3QpOgorICAiIiJDbGFzcyBmb3IgRHVyYXRpb24gbWVzc2FnZSB0eXBlLiIiIgorCisgIF9fc2xvdHNfXyA9ICgpCisKKyAgZGVmIFRvSnNvblN0cmluZyhzZWxmKToKKyAgICAiIiJDb252ZXJ0cyBEdXJhdGlvbiB0byBzdHJpbmcgZm9ybWF0LgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgc3RyaW5nIGNvbnZlcnRlZCBmcm9tIHNlbGYuIFRoZSBzdHJpbmcgZm9ybWF0IHdpbGwgY29udGFpbnMKKyAgICAgIDMsIDYsIG9yIDkgZnJhY3Rpb25hbCBkaWdpdHMgZGVwZW5kaW5nIG9uIHRoZSBwcmVjaXNpb24gcmVxdWlyZWQgdG8KKyAgICAgIHJlcHJlc2VudCB0aGUgZXhhY3QgRHVyYXRpb24gdmFsdWUuIEZvciBleGFtcGxlOiAiMXMiLCAiMS4wMTBzIiwKKyAgICAgICIxLjAwMDAwMDEwMHMiLCAiLTMuMTAwcyIKKyAgICAiIiIKKyAgICBfQ2hlY2tEdXJhdGlvblZhbGlkKHNlbGYuc2Vjb25kcywgc2VsZi5uYW5vcykKKyAgICBpZiBzZWxmLnNlY29uZHMgPCAwIG9yIHNlbGYubmFub3MgPCAwOgorICAgICAgcmVzdWx0ID0gJy0nCisgICAgICBzZWNvbmRzID0gLSBzZWxmLnNlY29uZHMgKyBpbnQoKDAgLSBzZWxmLm5hbm9zKSAvLyAxZTkpCisgICAgICBuYW5vcyA9ICgwIC0gc2VsZi5uYW5vcykgJSAxZTkKKyAgICBlbHNlOgorICAgICAgcmVzdWx0ID0gJycKKyAgICAgIHNlY29uZHMgPSBzZWxmLnNlY29uZHMgKyBpbnQoc2VsZi5uYW5vcyAvLyAxZTkpCisgICAgICBuYW5vcyA9IHNlbGYubmFub3MgJSAxZTkKKyAgICByZXN1bHQgKz0gJyVkJyAlIHNlY29uZHMKKyAgICBpZiAobmFub3MgJSAxZTkpID09IDA6CisgICAgICAjIElmIHRoZXJlIGFyZSAwIGZyYWN0aW9uYWwgZGlnaXRzLCB0aGUgZnJhY3Rpb25hbAorICAgICAgIyBwb2ludCAnLicgc2hvdWxkIGJlIG9taXR0ZWQgd2hlbiBzZXJpYWxpemluZy4KKyAgICAgIHJldHVybiByZXN1bHQgKyAncycKKyAgICBpZiAobmFub3MgJSAxZTYpID09IDA6CisgICAgICAjIFNlcmlhbGl6ZSAzIGZyYWN0aW9uYWwgZGlnaXRzLgorICAgICAgcmV0dXJuIHJlc3VsdCArICcuJTAzZHMnICUgKG5hbm9zIC8gMWU2KQorICAgIGlmIChuYW5vcyAlIDFlMykgPT0gMDoKKyAgICAgICMgU2VyaWFsaXplIDYgZnJhY3Rpb25hbCBkaWdpdHMuCisgICAgICByZXR1cm4gcmVzdWx0ICsgJy4lMDZkcycgJSAobmFub3MgLyAxZTMpCisgICAgIyBTZXJpYWxpemUgOSBmcmFjdGlvbmFsIGRpZ2l0cy4KKyAgICByZXR1cm4gcmVzdWx0ICsgJy4lMDlkcycgJSBuYW5vcworCisgIGRlZiBGcm9tSnNvblN0cmluZyhzZWxmLCB2YWx1ZSk6CisgICAgIiIiQ29udmVydHMgYSBzdHJpbmcgdG8gRHVyYXRpb24uCisKKyAgICBBcmdzOgorICAgICAgdmFsdWU6IEEgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC4gVGhlIHN0cmluZyBtdXN0IGVuZCB3aXRoICdzJy4gQW55CisgICAgICAgICAgZnJhY3Rpb25hbCBkaWdpdHMgKG9yIG5vbmUpIGFyZSBhY2NlcHRlZCBhcyBsb25nIGFzIHRoZXkgZml0IGludG8KKyAgICAgICAgICBwcmVjaXNpb24uIEZvciBleGFtcGxlOiAiMXMiLCAiMS4wMXMiLCAiMS4wMDAwMDAxcyIsICItMy4xMDBzCisKKyAgICBSYWlzZXM6CisgICAgICBWYWx1ZUVycm9yOiBPbiBwYXJzaW5nIHByb2JsZW1zLgorICAgICIiIgorICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzdHIpOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcignRHVyYXRpb24gSlNPTiB2YWx1ZSBub3QgYSBzdHJpbmc6IHshcn0nLmZvcm1hdCh2YWx1ZSkpCisgICAgaWYgbGVuKHZhbHVlKSA8IDEgb3IgdmFsdWVbLTFdICE9ICdzJzoKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgJ0R1cmF0aW9uIG11c3QgZW5kIHdpdGggbGV0dGVyICJzIjogezB9LicuZm9ybWF0KHZhbHVlKSkKKyAgICB0cnk6CisgICAgICBwb3MgPSB2YWx1ZS5maW5kKCcuJykKKyAgICAgIGlmIHBvcyA9PSAtMToKKyAgICAgICAgc2Vjb25kcyA9IGludCh2YWx1ZVs6LTFdKQorICAgICAgICBuYW5vcyA9IDAKKyAgICAgIGVsc2U6CisgICAgICAgIHNlY29uZHMgPSBpbnQodmFsdWVbOnBvc10pCisgICAgICAgIGlmIHZhbHVlWzBdID09ICctJzoKKyAgICAgICAgICBuYW5vcyA9IGludChyb3VuZChmbG9hdCgnLTB7MH0nLmZvcm1hdCh2YWx1ZVtwb3M6IC0xXSkpICoxZTkpKQorICAgICAgICBlbHNlOgorICAgICAgICAgIG5hbm9zID0gaW50KHJvdW5kKGZsb2F0KCcwezB9Jy5mb3JtYXQodmFsdWVbcG9zOiAtMV0pKSAqMWU5KSkKKyAgICAgIF9DaGVja0R1cmF0aW9uVmFsaWQoc2Vjb25kcywgbmFub3MpCisgICAgICBzZWxmLnNlY29uZHMgPSBzZWNvbmRzCisgICAgICBzZWxmLm5hbm9zID0gbmFub3MKKyAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAnQ291bGRuXCd0IHBhcnNlIGR1cmF0aW9uOiB7MH0gOiB7MX0uJy5mb3JtYXQodmFsdWUsIGUpKQorCisgIGRlZiBUb05hbm9zZWNvbmRzKHNlbGYpOgorICAgICIiIkNvbnZlcnRzIGEgRHVyYXRpb24gdG8gbmFub3NlY29uZHMuIiIiCisgICAgcmV0dXJuIHNlbGYuc2Vjb25kcyAqIF9OQU5PU19QRVJfU0VDT05EICsgc2VsZi5uYW5vcworCisgIGRlZiBUb01pY3Jvc2Vjb25kcyhzZWxmKToKKyAgICAiIiJDb252ZXJ0cyBhIER1cmF0aW9uIHRvIG1pY3Jvc2Vjb25kcy4iIiIKKyAgICBtaWNyb3MgPSBfUm91bmRUb3dhcmRaZXJvKHNlbGYubmFub3MsIF9OQU5PU19QRVJfTUlDUk9TRUNPTkQpCisgICAgcmV0dXJuIHNlbGYuc2Vjb25kcyAqIF9NSUNST1NfUEVSX1NFQ09ORCArIG1pY3JvcworCisgIGRlZiBUb01pbGxpc2Vjb25kcyhzZWxmKToKKyAgICAiIiJDb252ZXJ0cyBhIER1cmF0aW9uIHRvIG1pbGxpc2Vjb25kcy4iIiIKKyAgICBtaWxsaXMgPSBfUm91bmRUb3dhcmRaZXJvKHNlbGYubmFub3MsIF9OQU5PU19QRVJfTUlMTElTRUNPTkQpCisgICAgcmV0dXJuIHNlbGYuc2Vjb25kcyAqIF9NSUxMSVNfUEVSX1NFQ09ORCArIG1pbGxpcworCisgIGRlZiBUb1NlY29uZHMoc2VsZik6CisgICAgIiIiQ29udmVydHMgYSBEdXJhdGlvbiB0byBzZWNvbmRzLiIiIgorICAgIHJldHVybiBzZWxmLnNlY29uZHMKKworICBkZWYgRnJvbU5hbm9zZWNvbmRzKHNlbGYsIG5hbm9zKToKKyAgICAiIiJDb252ZXJ0cyBuYW5vc2Vjb25kcyB0byBEdXJhdGlvbi4iIiIKKyAgICBzZWxmLl9Ob3JtYWxpemVEdXJhdGlvbihuYW5vcyAvLyBfTkFOT1NfUEVSX1NFQ09ORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW5vcyAlIF9OQU5PU19QRVJfU0VDT05EKQorCisgIGRlZiBGcm9tTWljcm9zZWNvbmRzKHNlbGYsIG1pY3Jvcyk6CisgICAgIiIiQ29udmVydHMgbWljcm9zZWNvbmRzIHRvIER1cmF0aW9uLiIiIgorICAgIHNlbGYuX05vcm1hbGl6ZUR1cmF0aW9uKAorICAgICAgICBtaWNyb3MgLy8gX01JQ1JPU19QRVJfU0VDT05ELAorICAgICAgICAobWljcm9zICUgX01JQ1JPU19QRVJfU0VDT05EKSAqIF9OQU5PU19QRVJfTUlDUk9TRUNPTkQpCisKKyAgZGVmIEZyb21NaWxsaXNlY29uZHMoc2VsZiwgbWlsbGlzKToKKyAgICAiIiJDb252ZXJ0cyBtaWxsaXNlY29uZHMgdG8gRHVyYXRpb24uIiIiCisgICAgc2VsZi5fTm9ybWFsaXplRHVyYXRpb24oCisgICAgICAgIG1pbGxpcyAvLyBfTUlMTElTX1BFUl9TRUNPTkQsCisgICAgICAgIChtaWxsaXMgJSBfTUlMTElTX1BFUl9TRUNPTkQpICogX05BTk9TX1BFUl9NSUxMSVNFQ09ORCkKKworICBkZWYgRnJvbVNlY29uZHMoc2VsZiwgc2Vjb25kcyk6CisgICAgIiIiQ29udmVydHMgc2Vjb25kcyB0byBEdXJhdGlvbi4iIiIKKyAgICBzZWxmLnNlY29uZHMgPSBzZWNvbmRzCisgICAgc2VsZi5uYW5vcyA9IDAKKworICBkZWYgVG9UaW1lZGVsdGEoc2VsZik6CisgICAgIiIiQ29udmVydHMgRHVyYXRpb24gdG8gdGltZWRlbHRhLiIiIgorICAgIHJldHVybiBkYXRldGltZS50aW1lZGVsdGEoCisgICAgICAgIHNlY29uZHM9c2VsZi5zZWNvbmRzLCBtaWNyb3NlY29uZHM9X1JvdW5kVG93YXJkWmVybygKKyAgICAgICAgICAgIHNlbGYubmFub3MsIF9OQU5PU19QRVJfTUlDUk9TRUNPTkQpKQorCisgIGRlZiBGcm9tVGltZWRlbHRhKHNlbGYsIHRkKToKKyAgICAiIiJDb252ZXJ0cyB0aW1lZGVsdGEgdG8gRHVyYXRpb24uIiIiCisgICAgc2VsZi5fTm9ybWFsaXplRHVyYXRpb24odGQuc2Vjb25kcyArIHRkLmRheXMgKiBfU0VDT05EU19QRVJfREFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLm1pY3Jvc2Vjb25kcyAqIF9OQU5PU19QRVJfTUlDUk9TRUNPTkQpCisKKyAgZGVmIF9Ob3JtYWxpemVEdXJhdGlvbihzZWxmLCBzZWNvbmRzLCBuYW5vcyk6CisgICAgIiIiU2V0IER1cmF0aW9uIGJ5IHNlY29uZHMgYW5kIG5hbm9zLiIiIgorICAgICMgRm9yY2UgbmFub3MgdG8gYmUgbmVnYXRpdmUgaWYgdGhlIGR1cmF0aW9uIGlzIG5lZ2F0aXZlLgorICAgIGlmIHNlY29uZHMgPCAwIGFuZCBuYW5vcyA+IDA6CisgICAgICBzZWNvbmRzICs9IDEKKyAgICAgIG5hbm9zIC09IF9OQU5PU19QRVJfU0VDT05ECisgICAgc2VsZi5zZWNvbmRzID0gc2Vjb25kcworICAgIHNlbGYubmFub3MgPSBuYW5vcworCisKK2RlZiBfQ2hlY2tEdXJhdGlvblZhbGlkKHNlY29uZHMsIG5hbm9zKToKKyAgaWYgc2Vjb25kcyA8IC1fRFVSQVRJT05fU0VDT05EU19NQVggb3Igc2Vjb25kcyA+IF9EVVJBVElPTl9TRUNPTkRTX01BWDoKKyAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAnRHVyYXRpb24gaXMgbm90IHZhbGlkOiBTZWNvbmRzIHswfSBtdXN0IGJlIGluIHJhbmdlICcKKyAgICAgICAgJ1stMzE1NTc2MDAwMDAwLCAzMTU1NzYwMDAwMDBdLicuZm9ybWF0KHNlY29uZHMpKQorICBpZiBuYW5vcyA8PSAtX05BTk9TX1BFUl9TRUNPTkQgb3IgbmFub3MgPj0gX05BTk9TX1BFUl9TRUNPTkQ6CisgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgJ0R1cmF0aW9uIGlzIG5vdCB2YWxpZDogTmFub3MgezB9IG11c3QgYmUgaW4gcmFuZ2UgJworICAgICAgICAnWy05OTk5OTk5OTksIDk5OTk5OTk5OV0uJy5mb3JtYXQobmFub3MpKQorICBpZiAobmFub3MgPCAwIGFuZCBzZWNvbmRzID4gMCkgb3IgKG5hbm9zID4gMCBhbmQgc2Vjb25kcyA8IDApOgorICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICdEdXJhdGlvbiBpcyBub3QgdmFsaWQ6IFNpZ24gbWlzbWF0Y2guJykKKworCitkZWYgX1JvdW5kVG93YXJkWmVybyh2YWx1ZSwgZGl2aWRlcik6CisgICIiIlRydW5jYXRlcyB0aGUgcmVtYWluZGVyIHBhcnQgYWZ0ZXIgZGl2aXNpb24uIiIiCisgICMgRm9yIHNvbWUgbGFuZ3VhZ2VzLCB0aGUgc2lnbiBvZiB0aGUgcmVtYWluZGVyIGlzIGltcGxlbWVudGF0aW9uCisgICMgZGVwZW5kZW50IGlmIGFueSBvZiB0aGUgb3BlcmFuZHMgaXMgbmVnYXRpdmUuIEhlcmUgd2UgZW5mb3JjZQorICAjICJyb3VuZGVkIHRvd2FyZCB6ZXJvIiBzZW1hbnRpY3MuIEZvciBleGFtcGxlLCBmb3IgKC01KSAvIDIgYW4KKyAgIyBpbXBsZW1lbnRhdGlvbiBtYXkgZ2l2ZSAtMyBhcyB0aGUgcmVzdWx0IHdpdGggdGhlIHJlbWFpbmRlciBiZWluZworICAjIDEuIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB3ZSBhbHdheXMgcmV0dXJuIC0yIChjbG9zZXIgdG8gemVybykuCisgIHJlc3VsdCA9IHZhbHVlIC8vIGRpdmlkZXIKKyAgcmVtYWluZGVyID0gdmFsdWUgJSBkaXZpZGVyCisgIGlmIHJlc3VsdCA8IDAgYW5kIHJlbWFpbmRlciA+IDA6CisgICAgcmV0dXJuIHJlc3VsdCArIDEKKyAgZWxzZToKKyAgICByZXR1cm4gcmVzdWx0CisKKworY2xhc3MgRmllbGRNYXNrKG9iamVjdCk6CisgICIiIkNsYXNzIGZvciBGaWVsZE1hc2sgbWVzc2FnZSB0eXBlLiIiIgorCisgIF9fc2xvdHNfXyA9ICgpCisKKyAgZGVmIFRvSnNvblN0cmluZyhzZWxmKToKKyAgICAiIiJDb252ZXJ0cyBGaWVsZE1hc2sgdG8gc3RyaW5nIGFjY29yZGluZyB0byBwcm90bzMgSlNPTiBzcGVjLiIiIgorICAgIGNhbWVsY2FzZV9wYXRocyA9IFtdCisgICAgZm9yIHBhdGggaW4gc2VsZi5wYXRoczoKKyAgICAgIGNhbWVsY2FzZV9wYXRocy5hcHBlbmQoX1NuYWtlQ2FzZVRvQ2FtZWxDYXNlKHBhdGgpKQorICAgIHJldHVybiAnLCcuam9pbihjYW1lbGNhc2VfcGF0aHMpCisKKyAgZGVmIEZyb21Kc29uU3RyaW5nKHNlbGYsIHZhbHVlKToKKyAgICAiIiJDb252ZXJ0cyBzdHJpbmcgdG8gRmllbGRNYXNrIGFjY29yZGluZyB0byBwcm90bzMgSlNPTiBzcGVjLiIiIgorICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzdHIpOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcignRmllbGRNYXNrIEpTT04gdmFsdWUgbm90IGEgc3RyaW5nOiB7IXJ9Jy5mb3JtYXQodmFsdWUpKQorICAgIHNlbGYuQ2xlYXIoKQorICAgIGlmIHZhbHVlOgorICAgICAgZm9yIHBhdGggaW4gdmFsdWUuc3BsaXQoJywnKToKKyAgICAgICAgc2VsZi5wYXRocy5hcHBlbmQoX0NhbWVsQ2FzZVRvU25ha2VDYXNlKHBhdGgpKQorCisgIGRlZiBJc1ZhbGlkRm9yRGVzY3JpcHRvcihzZWxmLCBtZXNzYWdlX2Rlc2NyaXB0b3IpOgorICAgICIiIkNoZWNrcyB3aGV0aGVyIHRoZSBGaWVsZE1hc2sgaXMgdmFsaWQgZm9yIE1lc3NhZ2UgRGVzY3JpcHRvci4iIiIKKyAgICBmb3IgcGF0aCBpbiBzZWxmLnBhdGhzOgorICAgICAgaWYgbm90IF9Jc1ZhbGlkUGF0aChtZXNzYWdlX2Rlc2NyaXB0b3IsIHBhdGgpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCisgIGRlZiBBbGxGaWVsZHNGcm9tRGVzY3JpcHRvcihzZWxmLCBtZXNzYWdlX2Rlc2NyaXB0b3IpOgorICAgICIiIkdldHMgYWxsIGRpcmVjdCBmaWVsZHMgb2YgTWVzc2FnZSBEZXNjcmlwdG9yIHRvIEZpZWxkTWFzay4iIiIKKyAgICBzZWxmLkNsZWFyKCkKKyAgICBmb3IgZmllbGQgaW4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkczoKKyAgICAgIHNlbGYucGF0aHMuYXBwZW5kKGZpZWxkLm5hbWUpCisKKyAgZGVmIENhbm9uaWNhbEZvcm1Gcm9tTWFzayhzZWxmLCBtYXNrKToKKyAgICAiIiJDb252ZXJ0cyBhIEZpZWxkTWFzayB0byB0aGUgY2Fub25pY2FsIGZvcm0uCisKKyAgICBSZW1vdmVzIHBhdGhzIHRoYXQgYXJlIGNvdmVyZWQgYnkgYW5vdGhlciBwYXRoLiBGb3IgZXhhbXBsZSwKKyAgICAiZm9vLmJhciIgaXMgY292ZXJlZCBieSAiZm9vIiBhbmQgd2lsbCBiZSByZW1vdmVkIGlmICJmb28iCisgICAgaXMgYWxzbyBpbiB0aGUgRmllbGRNYXNrLiBUaGVuIHNvcnRzIGFsbCBwYXRocyBpbiBhbHBoYWJldGljYWwgb3JkZXIuCisKKyAgICBBcmdzOgorICAgICAgbWFzazogVGhlIG9yaWdpbmFsIEZpZWxkTWFzayB0byBiZSBjb252ZXJ0ZWQuCisgICAgIiIiCisgICAgdHJlZSA9IF9GaWVsZE1hc2tUcmVlKG1hc2spCisgICAgdHJlZS5Ub0ZpZWxkTWFzayhzZWxmKQorCisgIGRlZiBVbmlvbihzZWxmLCBtYXNrMSwgbWFzazIpOgorICAgICIiIk1lcmdlcyBtYXNrMSBhbmQgbWFzazIgaW50byB0aGlzIEZpZWxkTWFzay4iIiIKKyAgICBfQ2hlY2tGaWVsZE1hc2tNZXNzYWdlKG1hc2sxKQorICAgIF9DaGVja0ZpZWxkTWFza01lc3NhZ2UobWFzazIpCisgICAgdHJlZSA9IF9GaWVsZE1hc2tUcmVlKG1hc2sxKQorICAgIHRyZWUuTWVyZ2VGcm9tRmllbGRNYXNrKG1hc2syKQorICAgIHRyZWUuVG9GaWVsZE1hc2soc2VsZikKKworICBkZWYgSW50ZXJzZWN0KHNlbGYsIG1hc2sxLCBtYXNrMik6CisgICAgIiIiSW50ZXJzZWN0cyBtYXNrMSBhbmQgbWFzazIgaW50byB0aGlzIEZpZWxkTWFzay4iIiIKKyAgICBfQ2hlY2tGaWVsZE1hc2tNZXNzYWdlKG1hc2sxKQorICAgIF9DaGVja0ZpZWxkTWFza01lc3NhZ2UobWFzazIpCisgICAgdHJlZSA9IF9GaWVsZE1hc2tUcmVlKG1hc2sxKQorICAgIGludGVyc2VjdGlvbiA9IF9GaWVsZE1hc2tUcmVlKCkKKyAgICBmb3IgcGF0aCBpbiBtYXNrMi5wYXRoczoKKyAgICAgIHRyZWUuSW50ZXJzZWN0UGF0aChwYXRoLCBpbnRlcnNlY3Rpb24pCisgICAgaW50ZXJzZWN0aW9uLlRvRmllbGRNYXNrKHNlbGYpCisKKyAgZGVmIE1lcmdlTWVzc2FnZSgKKyAgICAgIHNlbGYsIHNvdXJjZSwgZGVzdGluYXRpb24sCisgICAgICByZXBsYWNlX21lc3NhZ2VfZmllbGQ9RmFsc2UsIHJlcGxhY2VfcmVwZWF0ZWRfZmllbGQ9RmFsc2UpOgorICAgICIiIk1lcmdlcyBmaWVsZHMgc3BlY2lmaWVkIGluIEZpZWxkTWFzayBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbi4KKworICAgIEFyZ3M6CisgICAgICBzb3VyY2U6IFNvdXJjZSBtZXNzYWdlLgorICAgICAgZGVzdGluYXRpb246IFRoZSBkZXN0aW5hdGlvbiBtZXNzYWdlIHRvIGJlIG1lcmdlZCBpbnRvLgorICAgICAgcmVwbGFjZV9tZXNzYWdlX2ZpZWxkOiBSZXBsYWNlIG1lc3NhZ2UgZmllbGQgaWYgVHJ1ZS4gTWVyZ2UgbWVzc2FnZQorICAgICAgICAgIGZpZWxkIGlmIEZhbHNlLgorICAgICAgcmVwbGFjZV9yZXBlYXRlZF9maWVsZDogUmVwbGFjZSByZXBlYXRlZCBmaWVsZCBpZiBUcnVlLiBBcHBlbmQKKyAgICAgICAgICBlbGVtZW50cyBvZiByZXBlYXRlZCBmaWVsZCBpZiBGYWxzZS4KKyAgICAiIiIKKyAgICB0cmVlID0gX0ZpZWxkTWFza1RyZWUoc2VsZikKKyAgICB0cmVlLk1lcmdlTWVzc2FnZSgKKyAgICAgICAgc291cmNlLCBkZXN0aW5hdGlvbiwgcmVwbGFjZV9tZXNzYWdlX2ZpZWxkLCByZXBsYWNlX3JlcGVhdGVkX2ZpZWxkKQorCisKK2RlZiBfSXNWYWxpZFBhdGgobWVzc2FnZV9kZXNjcmlwdG9yLCBwYXRoKToKKyAgIiIiQ2hlY2tzIHdoZXRoZXIgdGhlIHBhdGggaXMgdmFsaWQgZm9yIE1lc3NhZ2UgRGVzY3JpcHRvci4iIiIKKyAgcGFydHMgPSBwYXRoLnNwbGl0KCcuJykKKyAgbGFzdCA9IHBhcnRzLnBvcCgpCisgIGZvciBuYW1lIGluIHBhcnRzOgorICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lLmdldChuYW1lKQorICAgIGlmIChmaWVsZCBpcyBOb25lIG9yCisgICAgICAgIGZpZWxkLmxhYmVsID09IEZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRCBvcgorICAgICAgICBmaWVsZC50eXBlICE9IEZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0UpOgorICAgICAgcmV0dXJuIEZhbHNlCisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID0gZmllbGQubWVzc2FnZV90eXBlCisgIHJldHVybiBsYXN0IGluIG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZQorCisKK2RlZiBfQ2hlY2tGaWVsZE1hc2tNZXNzYWdlKG1lc3NhZ2UpOgorICAiIiJSYWlzZXMgVmFsdWVFcnJvciBpZiBtZXNzYWdlIGlzIG5vdCBhIEZpZWxkTWFzay4iIiIKKyAgbWVzc2FnZV9kZXNjcmlwdG9yID0gbWVzc2FnZS5ERVNDUklQVE9SCisgIGlmIChtZXNzYWdlX2Rlc2NyaXB0b3IubmFtZSAhPSAnRmllbGRNYXNrJyBvcgorICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLmZpbGUubmFtZSAhPSAnZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8nKToKKyAgICByYWlzZSBWYWx1ZUVycm9yKCdNZXNzYWdlIHswfSBpcyBub3QgYSBGaWVsZE1hc2suJy5mb3JtYXQoCisgICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUpKQorCisKK2RlZiBfU25ha2VDYXNlVG9DYW1lbENhc2UocGF0aF9uYW1lKToKKyAgIiIiQ29udmVydHMgYSBwYXRoIG5hbWUgZnJvbSBzbmFrZV9jYXNlIHRvIGNhbWVsQ2FzZS4iIiIKKyAgcmVzdWx0ID0gW10KKyAgYWZ0ZXJfdW5kZXJzY29yZSA9IEZhbHNlCisgIGZvciBjIGluIHBhdGhfbmFtZToKKyAgICBpZiBjLmlzdXBwZXIoKToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgJ0ZhaWwgdG8gcHJpbnQgRmllbGRNYXNrIHRvIEpzb24gc3RyaW5nOiBQYXRoIG5hbWUgJworICAgICAgICAgICd7MH0gbXVzdCBub3QgY29udGFpbiB1cHBlcmNhc2UgbGV0dGVycy4nLmZvcm1hdChwYXRoX25hbWUpKQorICAgIGlmIGFmdGVyX3VuZGVyc2NvcmU6CisgICAgICBpZiBjLmlzbG93ZXIoKToKKyAgICAgICAgcmVzdWx0LmFwcGVuZChjLnVwcGVyKCkpCisgICAgICAgIGFmdGVyX3VuZGVyc2NvcmUgPSBGYWxzZQorICAgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICdGYWlsIHRvIHByaW50IEZpZWxkTWFzayB0byBKc29uIHN0cmluZzogVGhlICcKKyAgICAgICAgICAgICdjaGFyYWN0ZXIgYWZ0ZXIgYSAiXyIgbXVzdCBiZSBhIGxvd2VyY2FzZSBsZXR0ZXIgJworICAgICAgICAgICAgJ2luIHBhdGggbmFtZSB7MH0uJy5mb3JtYXQocGF0aF9uYW1lKSkKKyAgICBlbGlmIGMgPT0gJ18nOgorICAgICAgYWZ0ZXJfdW5kZXJzY29yZSA9IFRydWUKKyAgICBlbHNlOgorICAgICAgcmVzdWx0ICs9IGMKKworICBpZiBhZnRlcl91bmRlcnNjb3JlOgorICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ZhaWwgdG8gcHJpbnQgRmllbGRNYXNrIHRvIEpzb24gc3RyaW5nOiBUcmFpbGluZyAiXyIgJworICAgICAgICAgICAgICAgICAgICAgJ2luIHBhdGggbmFtZSB7MH0uJy5mb3JtYXQocGF0aF9uYW1lKSkKKyAgcmV0dXJuICcnLmpvaW4ocmVzdWx0KQorCisKK2RlZiBfQ2FtZWxDYXNlVG9TbmFrZUNhc2UocGF0aF9uYW1lKToKKyAgIiIiQ29udmVydHMgYSBmaWVsZCBuYW1lIGZyb20gY2FtZWxDYXNlIHRvIHNuYWtlX2Nhc2UuIiIiCisgIHJlc3VsdCA9IFtdCisgIGZvciBjIGluIHBhdGhfbmFtZToKKyAgICBpZiBjID09ICdfJzoKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ZhaWwgdG8gcGFyc2UgRmllbGRNYXNrOiBQYXRoIG5hbWUgJworICAgICAgICAgICAgICAgICAgICAgICAnezB9IG11c3Qgbm90IGNvbnRhaW4gIl8icy4nLmZvcm1hdChwYXRoX25hbWUpKQorICAgIGlmIGMuaXN1cHBlcigpOgorICAgICAgcmVzdWx0ICs9ICdfJworICAgICAgcmVzdWx0ICs9IGMubG93ZXIoKQorICAgIGVsc2U6CisgICAgICByZXN1bHQgKz0gYworICByZXR1cm4gJycuam9pbihyZXN1bHQpCisKKworY2xhc3MgX0ZpZWxkTWFza1RyZWUob2JqZWN0KToKKyAgIiIiUmVwcmVzZW50cyBhIEZpZWxkTWFzayBpbiBhIHRyZWUgc3RydWN0dXJlLgorCisgIEZvciBleGFtcGxlLCBnaXZlbiBhIEZpZWxkTWFzayAiZm9vLmJhcixmb28uYmF6LGJhci5iYXoiLAorICB0aGUgRmllbGRNYXNrVHJlZSB3aWxsIGJlOgorICAgICAgW19yb290XSAtKy0gZm9vIC0rLSBiYXIKKyAgICAgICAgICAgIHwgICAgICAgfAorICAgICAgICAgICAgfCAgICAgICArLSBiYXoKKyAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstIGJhciAtLS0gYmF6CisgIEluIHRoZSB0cmVlLCBlYWNoIGxlYWYgbm9kZSByZXByZXNlbnRzIGEgZmllbGQgcGF0aC4KKyAgIiIiCisKKyAgX19zbG90c19fID0gKCdfcm9vdCcsKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWVsZF9tYXNrPU5vbmUpOgorICAgICIiIkluaXRpYWxpemVzIHRoZSB0cmVlIGJ5IEZpZWxkTWFzay4iIiIKKyAgICBzZWxmLl9yb290ID0ge30KKyAgICBpZiBmaWVsZF9tYXNrOgorICAgICAgc2VsZi5NZXJnZUZyb21GaWVsZE1hc2soZmllbGRfbWFzaykKKworICBkZWYgTWVyZ2VGcm9tRmllbGRNYXNrKHNlbGYsIGZpZWxkX21hc2spOgorICAgICIiIk1lcmdlcyBhIEZpZWxkTWFzayB0byB0aGUgdHJlZS4iIiIKKyAgICBmb3IgcGF0aCBpbiBmaWVsZF9tYXNrLnBhdGhzOgorICAgICAgc2VsZi5BZGRQYXRoKHBhdGgpCisKKyAgZGVmIEFkZFBhdGgoc2VsZiwgcGF0aCk6CisgICAgIiIiQWRkcyBhIGZpZWxkIHBhdGggaW50byB0aGUgdHJlZS4KKworICAgIElmIHRoZSBmaWVsZCBwYXRoIHRvIGFkZCBpcyBhIHN1Yi1wYXRoIG9mIGFuIGV4aXN0aW5nIGZpZWxkIHBhdGgKKyAgICBpbiB0aGUgdHJlZSAoaS5lLiwgYSBsZWFmIG5vZGUpLCBpdCBtZWFucyB0aGUgdHJlZSBhbHJlYWR5IG1hdGNoZXMKKyAgICB0aGUgZ2l2ZW4gcGF0aCBzbyBub3RoaW5nIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRyZWUuIElmIHRoZSBwYXRoCisgICAgbWF0Y2hlcyBhbiBleGlzdGluZyBub24tbGVhZiBub2RlIGluIHRoZSB0cmVlLCB0aGF0IG5vbi1sZWFmIG5vZGUKKyAgICB3aWxsIGJlIHR1cm5lZCBpbnRvIGEgbGVhZiBub2RlIHdpdGggYWxsIGl0cyBjaGlsZHJlbiByZW1vdmVkIGJlY2F1c2UKKyAgICB0aGUgcGF0aCBtYXRjaGVzIGFsbCB0aGUgbm9kZSdzIGNoaWxkcmVuLiBPdGhlcndpc2UsIGEgbmV3IHBhdGggd2lsbAorICAgIGJlIGFkZGVkLgorCisgICAgQXJnczoKKyAgICAgIHBhdGg6IFRoZSBmaWVsZCBwYXRoIHRvIGFkZC4KKyAgICAiIiIKKyAgICBub2RlID0gc2VsZi5fcm9vdAorICAgIGZvciBuYW1lIGluIHBhdGguc3BsaXQoJy4nKToKKyAgICAgIGlmIG5hbWUgbm90IGluIG5vZGU6CisgICAgICAgIG5vZGVbbmFtZV0gPSB7fQorICAgICAgZWxpZiBub3Qgbm9kZVtuYW1lXToKKyAgICAgICAgIyBQcmUtZXhpc3RpbmcgZW1wdHkgbm9kZSBpbXBsaWVzIHdlIGFscmVhZHkgaGF2ZSB0aGlzIGVudGlyZSB0cmVlLgorICAgICAgICByZXR1cm4KKyAgICAgIG5vZGUgPSBub2RlW25hbWVdCisgICAgIyBSZW1vdmUgYW55IHN1Yi10cmVlcyB3ZSBtaWdodCBoYXZlIGhhZC4KKyAgICBub2RlLmNsZWFyKCkKKworICBkZWYgVG9GaWVsZE1hc2soc2VsZiwgZmllbGRfbWFzayk6CisgICAgIiIiQ29udmVydHMgdGhlIHRyZWUgdG8gYSBGaWVsZE1hc2suIiIiCisgICAgZmllbGRfbWFzay5DbGVhcigpCisgICAgX0FkZEZpZWxkUGF0aHMoc2VsZi5fcm9vdCwgJycsIGZpZWxkX21hc2spCisKKyAgZGVmIEludGVyc2VjdFBhdGgoc2VsZiwgcGF0aCwgaW50ZXJzZWN0aW9uKToKKyAgICAiIiJDYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gcGFydCBvZiBhIGZpZWxkIHBhdGggd2l0aCB0aGlzIHRyZWUuCisKKyAgICBBcmdzOgorICAgICAgcGF0aDogVGhlIGZpZWxkIHBhdGggdG8gY2FsY3VsYXRlcy4KKyAgICAgIGludGVyc2VjdGlvbjogVGhlIG91dCB0cmVlIHRvIHJlY29yZCB0aGUgaW50ZXJzZWN0aW9uIHBhcnQuCisgICAgIiIiCisgICAgbm9kZSA9IHNlbGYuX3Jvb3QKKyAgICBmb3IgbmFtZSBpbiBwYXRoLnNwbGl0KCcuJyk6CisgICAgICBpZiBuYW1lIG5vdCBpbiBub2RlOgorICAgICAgICByZXR1cm4KKyAgICAgIGVsaWYgbm90IG5vZGVbbmFtZV06CisgICAgICAgIGludGVyc2VjdGlvbi5BZGRQYXRoKHBhdGgpCisgICAgICAgIHJldHVybgorICAgICAgbm9kZSA9IG5vZGVbbmFtZV0KKyAgICBpbnRlcnNlY3Rpb24uQWRkTGVhZk5vZGVzKHBhdGgsIG5vZGUpCisKKyAgZGVmIEFkZExlYWZOb2RlcyhzZWxmLCBwcmVmaXgsIG5vZGUpOgorICAgICIiIkFkZHMgbGVhZiBub2RlcyBiZWdpbiB3aXRoIHByZWZpeCB0byB0aGlzIHRyZWUuIiIiCisgICAgaWYgbm90IG5vZGU6CisgICAgICBzZWxmLkFkZFBhdGgocHJlZml4KQorICAgIGZvciBuYW1lIGluIG5vZGU6CisgICAgICBjaGlsZF9wYXRoID0gcHJlZml4ICsgJy4nICsgbmFtZQorICAgICAgc2VsZi5BZGRMZWFmTm9kZXMoY2hpbGRfcGF0aCwgbm9kZVtuYW1lXSkKKworICBkZWYgTWVyZ2VNZXNzYWdlKAorICAgICAgc2VsZiwgc291cmNlLCBkZXN0aW5hdGlvbiwKKyAgICAgIHJlcGxhY2VfbWVzc2FnZSwgcmVwbGFjZV9yZXBlYXRlZCk6CisgICAgIiIiTWVyZ2UgYWxsIGZpZWxkcyBzcGVjaWZpZWQgYnkgdGhpcyB0cmVlIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uLiIiIgorICAgIF9NZXJnZU1lc3NhZ2UoCisgICAgICAgIHNlbGYuX3Jvb3QsIHNvdXJjZSwgZGVzdGluYXRpb24sIHJlcGxhY2VfbWVzc2FnZSwgcmVwbGFjZV9yZXBlYXRlZCkKKworCitkZWYgX1N0ckNvbnZlcnQodmFsdWUpOgorICAiIiJDb252ZXJ0cyB2YWx1ZSB0byBzdHIgaWYgaXQgaXMgbm90LiIiIgorICAjIFRoaXMgZmlsZSBpcyBpbXBvcnRlZCBieSBjIGV4dGVuc2lvbiBhbmQgc29tZSBtZXRob2RzIGxpa2UgQ2xlYXJGaWVsZAorICAjIHJlcXVpcmVzIHN0cmluZyBmb3IgdGhlIGZpZWxkIG5hbWUuIHB5Mi9weTMgaGFzIGRpZmZlcmVudCB0ZXh0CisgICMgdHlwZSBhbmQgbWF5IHVzZSB1bmljb2RlLgorICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKToKKyAgICByZXR1cm4gdmFsdWUuZW5jb2RlKCd1dGYtOCcpCisgIHJldHVybiB2YWx1ZQorCisKK2RlZiBfTWVyZ2VNZXNzYWdlKAorICAgIG5vZGUsIHNvdXJjZSwgZGVzdGluYXRpb24sIHJlcGxhY2VfbWVzc2FnZSwgcmVwbGFjZV9yZXBlYXRlZCk6CisgICIiIk1lcmdlIGFsbCBmaWVsZHMgc3BlY2lmaWVkIGJ5IGEgc3ViLXRyZWUgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24uIiIiCisgIHNvdXJjZV9kZXNjcmlwdG9yID0gc291cmNlLkRFU0NSSVBUT1IKKyAgZm9yIG5hbWUgaW4gbm9kZToKKyAgICBjaGlsZCA9IG5vZGVbbmFtZV0KKyAgICBmaWVsZCA9IHNvdXJjZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lW25hbWVdCisgICAgaWYgZmllbGQgaXMgTm9uZToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0Vycm9yOiBDYW5cJ3QgZmluZCBmaWVsZCB7MH0gaW4gbWVzc2FnZSB7MX0uJy5mb3JtYXQoCisgICAgICAgICAgbmFtZSwgc291cmNlX2Rlc2NyaXB0b3IuZnVsbF9uYW1lKSkKKyAgICBpZiBjaGlsZDoKKyAgICAgICMgU3ViLXBhdGhzIGFyZSBvbmx5IGFsbG93ZWQgZm9yIHNpbmd1bGFyIG1lc3NhZ2UgZmllbGRzLgorICAgICAgaWYgKGZpZWxkLmxhYmVsID09IEZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRCBvcgorICAgICAgICAgIGZpZWxkLmNwcF90eXBlICE9IEZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0UpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdFcnJvcjogRmllbGQgezB9IGluIG1lc3NhZ2UgezF9IGlzIG5vdCBhIHNpbmd1bGFyICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZSBmaWVsZCBhbmQgY2Fubm90IGhhdmUgc3ViLWZpZWxkcy4nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgc291cmNlX2Rlc2NyaXB0b3IuZnVsbF9uYW1lKSkKKyAgICAgIGlmIHNvdXJjZS5IYXNGaWVsZChuYW1lKToKKyAgICAgICAgX01lcmdlTWVzc2FnZSgKKyAgICAgICAgICAgIGNoaWxkLCBnZXRhdHRyKHNvdXJjZSwgbmFtZSksIGdldGF0dHIoZGVzdGluYXRpb24sIG5hbWUpLAorICAgICAgICAgICAgcmVwbGFjZV9tZXNzYWdlLCByZXBsYWNlX3JlcGVhdGVkKQorICAgICAgY29udGludWUKKyAgICBpZiBmaWVsZC5sYWJlbCA9PSBGaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICBpZiByZXBsYWNlX3JlcGVhdGVkOgorICAgICAgICBkZXN0aW5hdGlvbi5DbGVhckZpZWxkKF9TdHJDb252ZXJ0KG5hbWUpKQorICAgICAgcmVwZWF0ZWRfc291cmNlID0gZ2V0YXR0cihzb3VyY2UsIG5hbWUpCisgICAgICByZXBlYXRlZF9kZXN0aW5hdGlvbiA9IGdldGF0dHIoZGVzdGluYXRpb24sIG5hbWUpCisgICAgICByZXBlYXRlZF9kZXN0aW5hdGlvbi5NZXJnZUZyb20ocmVwZWF0ZWRfc291cmNlKQorICAgIGVsc2U6CisgICAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBGaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBpZiByZXBsYWNlX21lc3NhZ2U6CisgICAgICAgICAgZGVzdGluYXRpb24uQ2xlYXJGaWVsZChfU3RyQ29udmVydChuYW1lKSkKKyAgICAgICAgaWYgc291cmNlLkhhc0ZpZWxkKG5hbWUpOgorICAgICAgICAgIGdldGF0dHIoZGVzdGluYXRpb24sIG5hbWUpLk1lcmdlRnJvbShnZXRhdHRyKHNvdXJjZSwgbmFtZSkpCisgICAgICBlbHNlOgorICAgICAgICBzZXRhdHRyKGRlc3RpbmF0aW9uLCBuYW1lLCBnZXRhdHRyKHNvdXJjZSwgbmFtZSkpCisKKworZGVmIF9BZGRGaWVsZFBhdGhzKG5vZGUsIHByZWZpeCwgZmllbGRfbWFzayk6CisgICIiIkFkZHMgdGhlIGZpZWxkIHBhdGhzIGRlc2NlbmRlZCBmcm9tIG5vZGUgdG8gZmllbGRfbWFzay4iIiIKKyAgaWYgbm90IG5vZGUgYW5kIHByZWZpeDoKKyAgICBmaWVsZF9tYXNrLnBhdGhzLmFwcGVuZChwcmVmaXgpCisgICAgcmV0dXJuCisgIGZvciBuYW1lIGluIHNvcnRlZChub2RlKToKKyAgICBpZiBwcmVmaXg6CisgICAgICBjaGlsZF9wYXRoID0gcHJlZml4ICsgJy4nICsgbmFtZQorICAgIGVsc2U6CisgICAgICBjaGlsZF9wYXRoID0gbmFtZQorICAgIF9BZGRGaWVsZFBhdGhzKG5vZGVbbmFtZV0sIGNoaWxkX3BhdGgsIGZpZWxkX21hc2spCisKKworZGVmIF9TZXRTdHJ1Y3RWYWx1ZShzdHJ1Y3RfdmFsdWUsIHZhbHVlKToKKyAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICBzdHJ1Y3RfdmFsdWUubnVsbF92YWx1ZSA9IDAKKyAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBib29sKToKKyAgICAjIE5vdGU6IHRoaXMgY2hlY2sgbXVzdCBjb21lIGJlZm9yZSB0aGUgbnVtYmVyIGNoZWNrIGJlY2F1c2UgaW4gUHl0aG9uCisgICAgIyBUcnVlIGFuZCBGYWxzZSBhcmUgYWxzbyBjb25zaWRlcmVkIG51bWJlcnMuCisgICAgc3RydWN0X3ZhbHVlLmJvb2xfdmFsdWUgPSB2YWx1ZQorICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cik6CisgICAgc3RydWN0X3ZhbHVlLnN0cmluZ192YWx1ZSA9IHZhbHVlCisgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGludCwgZmxvYXQpKToKKyAgICBzdHJ1Y3RfdmFsdWUubnVtYmVyX3ZhbHVlID0gdmFsdWUKKyAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCAoZGljdCwgU3RydWN0KSk6CisgICAgc3RydWN0X3ZhbHVlLnN0cnVjdF92YWx1ZS5DbGVhcigpCisgICAgc3RydWN0X3ZhbHVlLnN0cnVjdF92YWx1ZS51cGRhdGUodmFsdWUpCisgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGxpc3QsIExpc3RWYWx1ZSkpOgorICAgIHN0cnVjdF92YWx1ZS5saXN0X3ZhbHVlLkNsZWFyKCkKKyAgICBzdHJ1Y3RfdmFsdWUubGlzdF92YWx1ZS5leHRlbmQodmFsdWUpCisgIGVsc2U6CisgICAgcmFpc2UgVmFsdWVFcnJvcignVW5leHBlY3RlZCB0eXBlJykKKworCitkZWYgX0dldFN0cnVjdFZhbHVlKHN0cnVjdF92YWx1ZSk6CisgIHdoaWNoID0gc3RydWN0X3ZhbHVlLldoaWNoT25lb2YoJ2tpbmQnKQorICBpZiB3aGljaCA9PSAnc3RydWN0X3ZhbHVlJzoKKyAgICByZXR1cm4gc3RydWN0X3ZhbHVlLnN0cnVjdF92YWx1ZQorICBlbGlmIHdoaWNoID09ICdudWxsX3ZhbHVlJzoKKyAgICByZXR1cm4gTm9uZQorICBlbGlmIHdoaWNoID09ICdudW1iZXJfdmFsdWUnOgorICAgIHJldHVybiBzdHJ1Y3RfdmFsdWUubnVtYmVyX3ZhbHVlCisgIGVsaWYgd2hpY2ggPT0gJ3N0cmluZ192YWx1ZSc6CisgICAgcmV0dXJuIHN0cnVjdF92YWx1ZS5zdHJpbmdfdmFsdWUKKyAgZWxpZiB3aGljaCA9PSAnYm9vbF92YWx1ZSc6CisgICAgcmV0dXJuIHN0cnVjdF92YWx1ZS5ib29sX3ZhbHVlCisgIGVsaWYgd2hpY2ggPT0gJ2xpc3RfdmFsdWUnOgorICAgIHJldHVybiBzdHJ1Y3RfdmFsdWUubGlzdF92YWx1ZQorICBlbGlmIHdoaWNoIGlzIE5vbmU6CisgICAgcmFpc2UgVmFsdWVFcnJvcignVmFsdWUgbm90IHNldCcpCisKKworY2xhc3MgU3RydWN0KG9iamVjdCk6CisgICIiIkNsYXNzIGZvciBTdHJ1Y3QgbWVzc2FnZSB0eXBlLiIiIgorCisgIF9fc2xvdHNfXyA9ICgpCisKKyAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgcmV0dXJuIF9HZXRTdHJ1Y3RWYWx1ZShzZWxmLmZpZWxkc1trZXldKQorCisgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CisgICAgcmV0dXJuIGl0ZW0gaW4gc2VsZi5maWVsZHMKKworICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgX1NldFN0cnVjdFZhbHVlKHNlbGYuZmllbGRzW2tleV0sIHZhbHVlKQorCisgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgIGRlbCBzZWxmLmZpZWxkc1trZXldCisKKyAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgcmV0dXJuIGxlbihzZWxmLmZpZWxkcykKKworICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgcmV0dXJuIGl0ZXIoc2VsZi5maWVsZHMpCisKKyAgZGVmIGtleXMoc2VsZik6ICAjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKKyAgICByZXR1cm4gc2VsZi5maWVsZHMua2V5cygpCisKKyAgZGVmIHZhbHVlcyhzZWxmKTogICMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZQorICAgIHJldHVybiBbc2VsZltrZXldIGZvciBrZXkgaW4gc2VsZl0KKworICBkZWYgaXRlbXMoc2VsZik6ICAjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKKyAgICByZXR1cm4gWyhrZXksIHNlbGZba2V5XSkgZm9yIGtleSBpbiBzZWxmXQorCisgIGRlZiBnZXRfb3JfY3JlYXRlX2xpc3Qoc2VsZiwga2V5KToKKyAgICAiIiJSZXR1cm5zIGEgbGlzdCBmb3IgdGhpcyBrZXksIGNyZWF0aW5nIGlmIGl0IGRpZG4ndCBleGlzdCBhbHJlYWR5LiIiIgorICAgIGlmIG5vdCBzZWxmLmZpZWxkc1trZXldLkhhc0ZpZWxkKCdsaXN0X3ZhbHVlJyk6CisgICAgICAjIENsZWFyIHdpbGwgbWFyayBsaXN0X3ZhbHVlIG1vZGlmaWVkIHdoaWNoIHdpbGwgaW5kZWVkIGNyZWF0ZSBhIGxpc3QuCisgICAgICBzZWxmLmZpZWxkc1trZXldLmxpc3RfdmFsdWUuQ2xlYXIoKQorICAgIHJldHVybiBzZWxmLmZpZWxkc1trZXldLmxpc3RfdmFsdWUKKworICBkZWYgZ2V0X29yX2NyZWF0ZV9zdHJ1Y3Qoc2VsZiwga2V5KToKKyAgICAiIiJSZXR1cm5zIGEgc3RydWN0IGZvciB0aGlzIGtleSwgY3JlYXRpbmcgaWYgaXQgZGlkbid0IGV4aXN0IGFscmVhZHkuIiIiCisgICAgaWYgbm90IHNlbGYuZmllbGRzW2tleV0uSGFzRmllbGQoJ3N0cnVjdF92YWx1ZScpOgorICAgICAgIyBDbGVhciB3aWxsIG1hcmsgc3RydWN0X3ZhbHVlIG1vZGlmaWVkIHdoaWNoIHdpbGwgaW5kZWVkIGNyZWF0ZSBhIHN0cnVjdC4KKyAgICAgIHNlbGYuZmllbGRzW2tleV0uc3RydWN0X3ZhbHVlLkNsZWFyKCkKKyAgICByZXR1cm4gc2VsZi5maWVsZHNba2V5XS5zdHJ1Y3RfdmFsdWUKKworICBkZWYgdXBkYXRlKHNlbGYsIGRpY3Rpb25hcnkpOiAgIyBweWxpbnQ6IGRpc2FibGU9aW52YWxpZC1uYW1lCisgICAgZm9yIGtleSwgdmFsdWUgaW4gZGljdGlvbmFyeS5pdGVtcygpOgorICAgICAgX1NldFN0cnVjdFZhbHVlKHNlbGYuZmllbGRzW2tleV0sIHZhbHVlKQorCitjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZU1hcHBpbmcucmVnaXN0ZXIoU3RydWN0KQorCisKK2NsYXNzIExpc3RWYWx1ZShvYmplY3QpOgorICAiIiJDbGFzcyBmb3IgTGlzdFZhbHVlIG1lc3NhZ2UgdHlwZS4iIiIKKworICBfX3Nsb3RzX18gPSAoKQorCisgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgIHJldHVybiBsZW4oc2VsZi52YWx1ZXMpCisKKyAgZGVmIGFwcGVuZChzZWxmLCB2YWx1ZSk6CisgICAgX1NldFN0cnVjdFZhbHVlKHNlbGYudmFsdWVzLmFkZCgpLCB2YWx1ZSkKKworICBkZWYgZXh0ZW5kKHNlbGYsIGVsZW1fc2VxKToKKyAgICBmb3IgdmFsdWUgaW4gZWxlbV9zZXE6CisgICAgICBzZWxmLmFwcGVuZCh2YWx1ZSkKKworICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICIiIlJldHJpZXZlcyBpdGVtIGJ5IHRoZSBzcGVjaWZpZWQgaW5kZXguIiIiCisgICAgcmV0dXJuIF9HZXRTdHJ1Y3RWYWx1ZShzZWxmLnZhbHVlcy5fX2dldGl0ZW1fXyhpbmRleCkpCisKKyAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCB2YWx1ZSk6CisgICAgX1NldFN0cnVjdFZhbHVlKHNlbGYudmFsdWVzLl9fZ2V0aXRlbV9fKGluZGV4KSwgdmFsdWUpCisKKyAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgZGVsIHNlbGYudmFsdWVzW2tleV0KKworICBkZWYgaXRlbXMoc2VsZik6CisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYpKToKKyAgICAgIHlpZWxkIHNlbGZbaV0KKworICBkZWYgYWRkX3N0cnVjdChzZWxmKToKKyAgICAiIiJBcHBlbmRzIGFuZCByZXR1cm5zIGEgc3RydWN0IHZhbHVlIGFzIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBsaXN0LiIiIgorICAgIHN0cnVjdF92YWx1ZSA9IHNlbGYudmFsdWVzLmFkZCgpLnN0cnVjdF92YWx1ZQorICAgICMgQ2xlYXIgd2lsbCBtYXJrIHN0cnVjdF92YWx1ZSBtb2RpZmllZCB3aGljaCB3aWxsIGluZGVlZCBjcmVhdGUgYSBzdHJ1Y3QuCisgICAgc3RydWN0X3ZhbHVlLkNsZWFyKCkKKyAgICByZXR1cm4gc3RydWN0X3ZhbHVlCisKKyAgZGVmIGFkZF9saXN0KHNlbGYpOgorICAgICIiIkFwcGVuZHMgYW5kIHJldHVybnMgYSBsaXN0IHZhbHVlIGFzIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBsaXN0LiIiIgorICAgIGxpc3RfdmFsdWUgPSBzZWxmLnZhbHVlcy5hZGQoKS5saXN0X3ZhbHVlCisgICAgIyBDbGVhciB3aWxsIG1hcmsgbGlzdF92YWx1ZSBtb2RpZmllZCB3aGljaCB3aWxsIGluZGVlZCBjcmVhdGUgYSBsaXN0LgorICAgIGxpc3RfdmFsdWUuQ2xlYXIoKQorICAgIHJldHVybiBsaXN0X3ZhbHVlCisKK2NvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UucmVnaXN0ZXIoTGlzdFZhbHVlKQorCisKKyMgTElOVC5JZkNoYW5nZSh3a3RiYXNlcykKK1dLVEJBU0VTID0geworICAgICdnb29nbGUucHJvdG9idWYuQW55JzogQW55LAorICAgICdnb29nbGUucHJvdG9idWYuRHVyYXRpb24nOiBEdXJhdGlvbiwKKyAgICAnZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayc6IEZpZWxkTWFzaywKKyAgICAnZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZSc6IExpc3RWYWx1ZSwKKyAgICAnZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCc6IFN0cnVjdCwKKyAgICAnZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCc6IFRpbWVzdGFtcCwKK30KKyMgTElOVC5UaGVuQ2hhbmdlKC8vZGVwb3QvZ29vZ2xlLnByb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weWlfZ2VuZXJhdG9yLmNjOndrdGJhc2VzKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93ZWxsX2tub3duX3R5cGVzX3Rlc3QucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dlbGxfa25vd25fdHlwZXNfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzI0NTlhCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93ZWxsX2tub3duX3R5cGVzX3Rlc3QucHkKQEAgLTAsMCArMSwxMDEzIEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3QgZm9yIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC53ZWxsX2tub3duX3R5cGVzLiIiIgorCitfX2F1dGhvcl9fID0gJ2ppZWx1b0Bnb29nbGUuY29tIChKaWUgTHVvKScKKworaW1wb3J0IGNvbGxlY3Rpb25zLmFiYyBhcyBjb2xsZWN0aW9uc19hYmMKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBhbnlfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZHVyYXRpb25fcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZmllbGRfbWFza19wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzdHJ1Y3RfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdGltZXN0YW1wX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1hcF91bml0dGVzdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBhbnlfdGVzdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB0ZXN0X3V0aWwKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB3ZWxsX2tub3duX3R5cGVzCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHRleHRfZm9ybWF0Citmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgX3BhcmFtZXRlcml6ZWQKKwordHJ5OgorICAjIE5ldyBtb2R1bGUgaW4gUHl0aG9uIDMuOToKKyAgaW1wb3J0IHpvbmVpbmZvICAjIHB5bGludDpkaXNhYmxlPWctaW1wb3J0LW5vdC1hdC10b3AKKyAgX1RaX0pBUEFOID0gem9uZWluZm8uWm9uZUluZm8oJ0phcGFuJykKKyAgX1RaX1BBQ0lGSUMgPSB6b25laW5mby5ab25lSW5mbygnVVMvUGFjaWZpYycpCitleGNlcHQgSW1wb3J0RXJyb3I6CisgIF9UWl9KQVBBTiA9IGRhdGV0aW1lLnRpbWV6b25lKGRhdGV0aW1lLnRpbWVkZWx0YShob3Vycz05KSwgJ0phcGFuJykKKyAgX1RaX1BBQ0lGSUMgPSBkYXRldGltZS50aW1lem9uZShkYXRldGltZS50aW1lZGVsdGEoaG91cnM9LTgpLCAnVVMvUGFjaWZpYycpCisKKworY2xhc3MgVGltZVV0aWxUZXN0QmFzZShfcGFyYW1ldGVyaXplZC5UZXN0Q2FzZSk6CisKKyAgZGVmIENoZWNrVGltZXN0YW1wQ29udmVyc2lvbihzZWxmLCBtZXNzYWdlLCB0ZXh0KToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsIG1lc3NhZ2UuVG9Kc29uU3RyaW5nKCkpCisgICAgcGFyc2VkX21lc3NhZ2UgPSB0aW1lc3RhbXBfcGIyLlRpbWVzdGFtcCgpCisgICAgcGFyc2VkX21lc3NhZ2UuRnJvbUpzb25TdHJpbmcodGV4dCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgIGRlZiBDaGVja0R1cmF0aW9uQ29udmVyc2lvbihzZWxmLCBtZXNzYWdlLCB0ZXh0KToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsIG1lc3NhZ2UuVG9Kc29uU3RyaW5nKCkpCisgICAgcGFyc2VkX21lc3NhZ2UgPSBkdXJhdGlvbl9wYjIuRHVyYXRpb24oKQorICAgIHBhcnNlZF9tZXNzYWdlLkZyb21Kc29uU3RyaW5nKHRleHQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKworCitjbGFzcyBUaW1lVXRpbFRlc3QoVGltZVV0aWxUZXN0QmFzZSk6CisKKyAgZGVmIHRlc3RUaW1lc3RhbXBTZXJpYWxpemVBbmRQYXJzZShzZWxmKToKKyAgICBtZXNzYWdlID0gdGltZXN0YW1wX3BiMi5UaW1lc3RhbXAoKQorICAgICMgR2VuZXJhdGVkIG91dHB1dCBzaG91bGQgY29udGFpbiAzLCA2LCBvciA5IGZyYWN0aW9uYWwgZGlnaXRzLgorICAgIG1lc3NhZ2Uuc2Vjb25kcyA9IDAKKyAgICBtZXNzYWdlLm5hbm9zID0gMAorICAgIHNlbGYuQ2hlY2tUaW1lc3RhbXBDb252ZXJzaW9uKG1lc3NhZ2UsICcxOTcwLTAxLTAxVDAwOjAwOjAwWicpCisgICAgbWVzc2FnZS5uYW5vcyA9IDEwMDAwMDAwCisgICAgc2VsZi5DaGVja1RpbWVzdGFtcENvbnZlcnNpb24obWVzc2FnZSwgJzE5NzAtMDEtMDFUMDA6MDA6MDAuMDEwWicpCisgICAgbWVzc2FnZS5uYW5vcyA9IDEwMDAwCisgICAgc2VsZi5DaGVja1RpbWVzdGFtcENvbnZlcnNpb24obWVzc2FnZSwgJzE5NzAtMDEtMDFUMDA6MDA6MDAuMDAwMDEwWicpCisgICAgbWVzc2FnZS5uYW5vcyA9IDEwCisgICAgc2VsZi5DaGVja1RpbWVzdGFtcENvbnZlcnNpb24obWVzc2FnZSwgJzE5NzAtMDEtMDFUMDA6MDA6MDAuMDAwMDAwMDEwWicpCisgICAgIyBUZXN0IG1pbiB0aW1lc3RhbXBzLgorICAgIG1lc3NhZ2Uuc2Vjb25kcyA9IC02MjEzNTU5NjgwMAorICAgIG1lc3NhZ2UubmFub3MgPSAwCisgICAgc2VsZi5DaGVja1RpbWVzdGFtcENvbnZlcnNpb24obWVzc2FnZSwgJzAwMDEtMDEtMDFUMDA6MDA6MDBaJykKKyAgICAjIFRlc3QgbWF4IHRpbWVzdGFtcHMuCisgICAgbWVzc2FnZS5zZWNvbmRzID0gMjUzNDAyMzAwNzk5CisgICAgbWVzc2FnZS5uYW5vcyA9IDk5OTk5OTk5OQorICAgIHNlbGYuQ2hlY2tUaW1lc3RhbXBDb252ZXJzaW9uKG1lc3NhZ2UsICc5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVonKQorICAgICMgVGVzdCBuZWdhdGl2ZSB0aW1lc3RhbXBzLgorICAgIG1lc3NhZ2Uuc2Vjb25kcyA9IC0xCisgICAgc2VsZi5DaGVja1RpbWVzdGFtcENvbnZlcnNpb24obWVzc2FnZSwgJzE5NjktMTItMzFUMjM6NTk6NTkuOTk5OTk5OTk5WicpCisKKyAgICAjIFBhcnNpbmcgYWNjZXB0cyBhbiBmcmFjdGlvbmFsIGRpZ2l0cyBhcyBsb25nIGFzIHRoZXkgZml0IGludG8gbmFubworICAgICMgcHJlY2lzaW9uLgorICAgIG1lc3NhZ2UuRnJvbUpzb25TdHJpbmcoJzE5NzAtMDEtMDFUMDA6MDA6MDAuMVonKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5zZWNvbmRzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwMDAwMDAwLCBtZXNzYWdlLm5hbm9zKQorICAgICMgUGFyc2luZyBhY2NlcHRzIG9mZnNldHMuCisgICAgbWVzc2FnZS5Gcm9tSnNvblN0cmluZygnMTk3MC0wMS0wMVQwMDowMDowMC0wODowMCcpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg4ICogMzYwMCwgbWVzc2FnZS5zZWNvbmRzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5uYW5vcykKKworICAgICMgSXQgaXMgbm90IGVhc3kgdG8gY2hlY2sgd2l0aCBjdXJyZW50IHRpbWUuIEZvciB0ZXN0IGNvdmVyYWdlIG9ubHkuCisgICAgbWVzc2FnZS5HZXRDdXJyZW50VGltZSgpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbCg4ICogMzYwMCwgbWVzc2FnZS5zZWNvbmRzKQorCisgIGRlZiB0ZXN0RHVyYXRpb25TZXJpYWxpemVBbmRQYXJzZShzZWxmKToKKyAgICBtZXNzYWdlID0gZHVyYXRpb25fcGIyLkR1cmF0aW9uKCkKKyAgICAjIEdlbmVyYXRlZCBvdXRwdXQgc2hvdWxkIGNvbnRhaW4gMywgNiwgb3IgOSBmcmFjdGlvbmFsIGRpZ2l0cy4KKyAgICBtZXNzYWdlLnNlY29uZHMgPSAwCisgICAgbWVzc2FnZS5uYW5vcyA9IDAKKyAgICBzZWxmLkNoZWNrRHVyYXRpb25Db252ZXJzaW9uKG1lc3NhZ2UsICcwcycpCisgICAgbWVzc2FnZS5uYW5vcyA9IDEwMDAwMDAwCisgICAgc2VsZi5DaGVja0R1cmF0aW9uQ29udmVyc2lvbihtZXNzYWdlLCAnMC4wMTBzJykKKyAgICBtZXNzYWdlLm5hbm9zID0gMTAwMDAKKyAgICBzZWxmLkNoZWNrRHVyYXRpb25Db252ZXJzaW9uKG1lc3NhZ2UsICcwLjAwMDAxMHMnKQorICAgIG1lc3NhZ2UubmFub3MgPSAxMAorICAgIHNlbGYuQ2hlY2tEdXJhdGlvbkNvbnZlcnNpb24obWVzc2FnZSwgJzAuMDAwMDAwMDEwcycpCisKKyAgICAjIFRlc3QgbWluIGFuZCBtYXgKKyAgICBtZXNzYWdlLnNlY29uZHMgPSAzMTU1NzYwMDAwMDAKKyAgICBtZXNzYWdlLm5hbm9zID0gOTk5OTk5OTk5CisgICAgc2VsZi5DaGVja0R1cmF0aW9uQ29udmVyc2lvbihtZXNzYWdlLCAnMzE1NTc2MDAwMDAwLjk5OTk5OTk5OXMnKQorICAgIG1lc3NhZ2Uuc2Vjb25kcyA9IC0zMTU1NzYwMDAwMDAKKyAgICBtZXNzYWdlLm5hbm9zID0gLTk5OTk5OTk5OQorICAgIHNlbGYuQ2hlY2tEdXJhdGlvbkNvbnZlcnNpb24obWVzc2FnZSwgJy0zMTU1NzYwMDAwMDAuOTk5OTk5OTk5cycpCisKKyAgICAjIFBhcnNpbmcgYWNjZXB0cyBhbiBmcmFjdGlvbmFsIGRpZ2l0cyBhcyBsb25nIGFzIHRoZXkgZml0IGludG8gbmFubworICAgICMgcHJlY2lzaW9uLgorICAgIG1lc3NhZ2UuRnJvbUpzb25TdHJpbmcoJzAuMXMnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwMDAwMDAwLCBtZXNzYWdlLm5hbm9zKQorICAgIG1lc3NhZ2UuRnJvbUpzb25TdHJpbmcoJzAuMDAwMDAwMXMnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwLCBtZXNzYWdlLm5hbm9zKQorCisgIGRlZiB0ZXN0VGltZXN0YW1wSW50ZWdlckNvbnZlcnNpb24oc2VsZik6CisgICAgbWVzc2FnZSA9IHRpbWVzdGFtcF9wYjIuVGltZXN0YW1wKCkKKyAgICBtZXNzYWdlLkZyb21OYW5vc2Vjb25kcygxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzE5NzAtMDEtMDFUMDA6MDA6MDAuMDAwMDAwMDAxWicsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbWVzc2FnZS5Ub05hbm9zZWNvbmRzKCkpCisKKyAgICBtZXNzYWdlLkZyb21OYW5vc2Vjb25kcygtMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCcxOTY5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVonLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5Ub0pzb25TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCBtZXNzYWdlLlRvTmFub3NlY29uZHMoKSkKKworICAgIG1lc3NhZ2UuRnJvbU1pY3Jvc2Vjb25kcygxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzE5NzAtMDEtMDFUMDA6MDA6MDAuMDAwMDAxWicsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbWVzc2FnZS5Ub01pY3Jvc2Vjb25kcygpKQorCisgICAgbWVzc2FnZS5Gcm9tTWljcm9zZWNvbmRzKC0xKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzE5NjktMTItMzFUMjM6NTk6NTkuOTk5OTk5WicsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEsIG1lc3NhZ2UuVG9NaWNyb3NlY29uZHMoKSkKKworICAgIG1lc3NhZ2UuRnJvbU1pbGxpc2Vjb25kcygxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzE5NzAtMDEtMDFUMDA6MDA6MDAuMDAxWicsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbWVzc2FnZS5Ub01pbGxpc2Vjb25kcygpKQorCisgICAgbWVzc2FnZS5Gcm9tTWlsbGlzZWNvbmRzKC0xKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzE5NjktMTItMzFUMjM6NTk6NTkuOTk5WicsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEsIG1lc3NhZ2UuVG9NaWxsaXNlY29uZHMoKSkKKworICAgIG1lc3NhZ2UuRnJvbVNlY29uZHMoMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCcxOTcwLTAxLTAxVDAwOjAwOjAxWicsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbWVzc2FnZS5Ub1NlY29uZHMoKSkKKworICAgIG1lc3NhZ2UuRnJvbVNlY29uZHMoLTEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnMTk2OS0xMi0zMVQyMzo1OTo1OVonLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5Ub0pzb25TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCBtZXNzYWdlLlRvU2Vjb25kcygpKQorCisgICAgbWVzc2FnZS5Gcm9tTmFub3NlY29uZHMoMTk5OSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIG1lc3NhZ2UuVG9NaWNyb3NlY29uZHMoKSkKKyAgICAjIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIFRpbWVzdGFtcCB3aWxsIGJlIHJvdW5kZWQgZG93bi4KKyAgICAjIEZvciBleGFtcGxlLCAiMTk2OS0xMi0zMVQyMzo1OTo1OS41WiIgKGkuZS4sIC0wLjVzKSByb3VuZGVkIHRvIHNlY29uZHMKKyAgICAjIHdpbGwgYmUgIjE5NjktMTItMzFUMjM6NTk6NTlaIiAoaS5lLiwgLTFzKSByYXRoZXIgdGhhbgorICAgICMgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiAoaS5lLiwgMHMpLgorICAgIG1lc3NhZ2UuRnJvbU5hbm9zZWNvbmRzKC0xOTk5KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTIsIG1lc3NhZ2UuVG9NaWNyb3NlY29uZHMoKSkKKworICBkZWYgdGVzdER1cmF0aW9uSW50ZWdlckNvbnZlcnNpb24oc2VsZik6CisgICAgbWVzc2FnZSA9IGR1cmF0aW9uX3BiMi5EdXJhdGlvbigpCisgICAgbWVzc2FnZS5Gcm9tTmFub3NlY29uZHMoMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCcwLjAwMDAwMDAwMXMnLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5Ub0pzb25TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIG1lc3NhZ2UuVG9OYW5vc2Vjb25kcygpKQorCisgICAgbWVzc2FnZS5Gcm9tTmFub3NlY29uZHMoLTEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnLTAuMDAwMDAwMDAxcycsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEsIG1lc3NhZ2UuVG9OYW5vc2Vjb25kcygpKQorCisgICAgbWVzc2FnZS5Gcm9tTWljcm9zZWNvbmRzKDEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnMC4wMDAwMDFzJywKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVG9Kc29uU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBtZXNzYWdlLlRvTWljcm9zZWNvbmRzKCkpCisKKyAgICBtZXNzYWdlLkZyb21NaWNyb3NlY29uZHMoLTEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnLTAuMDAwMDAxcycsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEsIG1lc3NhZ2UuVG9NaWNyb3NlY29uZHMoKSkKKworICAgIG1lc3NhZ2UuRnJvbU1pbGxpc2Vjb25kcygxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzAuMDAxcycsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbWVzc2FnZS5Ub01pbGxpc2Vjb25kcygpKQorCisgICAgbWVzc2FnZS5Gcm9tTWlsbGlzZWNvbmRzKC0xKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy0wLjAwMXMnLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5Ub0pzb25TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCBtZXNzYWdlLlRvTWlsbGlzZWNvbmRzKCkpCisKKyAgICBtZXNzYWdlLkZyb21TZWNvbmRzKDEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnMXMnLCBtZXNzYWdlLlRvSnNvblN0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbWVzc2FnZS5Ub1NlY29uZHMoKSkKKworICAgIG1lc3NhZ2UuRnJvbVNlY29uZHMoLTEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnLTFzJywKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVG9Kc29uU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgbWVzc2FnZS5Ub1NlY29uZHMoKSkKKworICAgICMgVGVzdCB0cnVuY2F0aW9uIGJlaGF2aW9yLgorICAgIG1lc3NhZ2UuRnJvbU5hbm9zZWNvbmRzKDE5OTkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBtZXNzYWdlLlRvTWljcm9zZWNvbmRzKCkpCisKKyAgICAjIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIER1cmF0aW9uIHdpbGwgYmUgcm91bmRlZCB0b3dhcmRzIDAuCisgICAgbWVzc2FnZS5Gcm9tTmFub3NlY29uZHMoLTE5OTkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgbWVzc2FnZS5Ub01pY3Jvc2Vjb25kcygpKQorCisgIGRlZiB0ZXN0VGltZXpvbmVOYWl2ZURhdGV0aW1lQ29udmVyc2lvbihzZWxmKToKKyAgICBtZXNzYWdlID0gdGltZXN0YW1wX3BiMi5UaW1lc3RhbXAoKQorICAgIG5haXZlX3V0Y19lcG9jaCA9IGRhdGV0aW1lLmRhdGV0aW1lKDE5NzAsIDEsIDEpCisgICAgbWVzc2FnZS5Gcm9tRGF0ZXRpbWUobmFpdmVfdXRjX2Vwb2NoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5zZWNvbmRzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5uYW5vcykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFpdmVfdXRjX2Vwb2NoLCBtZXNzYWdlLlRvRGF0ZXRpbWUoKSkKKworICAgIG5haXZlX2Vwb2NoX21vcm5pbmcgPSBkYXRldGltZS5kYXRldGltZSgxOTcwLCAxLCAxLCA4LCAwLCAwLCAxKQorICAgIG1lc3NhZ2UuRnJvbURhdGV0aW1lKG5haXZlX2Vwb2NoX21vcm5pbmcpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg4ICogMzYwMCwgbWVzc2FnZS5zZWNvbmRzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwMCwgbWVzc2FnZS5uYW5vcykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFpdmVfZXBvY2hfbW9ybmluZywgbWVzc2FnZS5Ub0RhdGV0aW1lKCkpCisKKyAgICBtZXNzYWdlLkZyb21NaWxsaXNlY29uZHMoMTk5OSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIG1lc3NhZ2Uuc2Vjb25kcykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDk5OV8wMDBfMDAwLCBtZXNzYWdlLm5hbm9zKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRldGltZS5kYXRldGltZSgxOTcwLCAxLCAxLCAwLCAwLCAxLCA5OTkwMDApLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5Ub0RhdGV0aW1lKCkpCisKKyAgICBuYWl2ZV9mdXR1cmUgPSBkYXRldGltZS5kYXRldGltZSgyNTU1LCAyLCAyMiwgMSwgMiwgMywgNDU2Nzg5KQorICAgIG1lc3NhZ2UuRnJvbURhdGV0aW1lKG5haXZlX2Z1dHVyZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG5haXZlX2Z1dHVyZSwgbWVzc2FnZS5Ub0RhdGV0aW1lKCkpCisKKyAgICBuYWl2ZV9lbmRfb2ZfdGltZSA9IGRhdGV0aW1lLmRhdGV0aW1lLm1heAorICAgIG1lc3NhZ2UuRnJvbURhdGV0aW1lKG5haXZlX2VuZF9vZl90aW1lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFpdmVfZW5kX29mX3RpbWUsIG1lc3NhZ2UuVG9EYXRldGltZSgpKQorCisgICMgVHdvIGhvdXJzIGFmdGVyIHRoZSBVbml4IEVwb2NoLCBhcm91bmQgdGhlIHdvcmxkLgorICBAX3BhcmFtZXRlcml6ZWQubmFtZWRfcGFyYW1ldGVycygKKyAgICAgICgnTG9uZG9uJywgWzE5NzAsIDEsIDEsIDJdLCBkYXRldGltZS50aW1lem9uZS51dGMpLAorICAgICAgKCdUb2t5bycsIFsxOTcwLCAxLCAxLCAxMV0sIF9UWl9KQVBBTiksCisgICAgICAoJ0xBJywgWzE5NjksIDEyLCAzMSwgMThdLCBfVFpfUEFDSUZJQyksCisgICkKKyAgZGVmIHRlc3RUaW1lem9uZUF3YXJlRGF0ZXRpbWVDb252ZXJzaW9uKHNlbGYsIGRhdGVfcGFydHMsIHR6aW5mbyk6CisgICAgb3JpZ2luYWxfZGF0ZXRpbWUgPSBkYXRldGltZS5kYXRldGltZSgqZGF0ZV9wYXJ0cywgdHppbmZvPXR6aW5mbykgICMgcHlsaW50OmRpc2FibGU9Zy10emluZm8tZGF0ZXRpbWUKKworICAgIG1lc3NhZ2UgPSB0aW1lc3RhbXBfcGIyLlRpbWVzdGFtcCgpCisgICAgbWVzc2FnZS5Gcm9tRGF0ZXRpbWUob3JpZ2luYWxfZGF0ZXRpbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg3MjAwLCBtZXNzYWdlLnNlY29uZHMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtZXNzYWdlLm5hbm9zKQorCisgICAgIyBUb0RhdGV0aW1lKCkgd2l0aCBubyBwYXJhbWV0ZXJzIHByb2R1Y2VzIGEgbmFpdmUgVVRDIGRhdGV0aW1lLCBpLmUuIGl0IG5vdAorICAgICMgb25seSBsb3NlcyB0aGUgb3JpZ2luYWwgdGltZXpvbmUgaW5mb3JtYXRpb24gKGUuZy4gVVMvUGFjaWZpYykgYXMgaXQncworICAgICMgIm5vcm1hbGlzZWQiIHRvIFVUQywgYnV0IGFsc28gZHJvcHMgdGhlIGluZm9ybWF0aW9uIHRoYXQgdGhlIGRhdGV0aW1lCisgICAgIyByZXByZXNlbnRzIGEgVVRDIG9uZS4KKyAgICBuYWl2ZV9kYXRldGltZSA9IG1lc3NhZ2UuVG9EYXRldGltZSgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRldGltZS5kYXRldGltZSgxOTcwLCAxLCAxLCAyKSwgbmFpdmVfZGF0ZXRpbWUpCisgICAgc2VsZi5hc3NlcnRJc05vbmUobmFpdmVfZGF0ZXRpbWUudHppbmZvKQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwob3JpZ2luYWxfZGF0ZXRpbWUsIG5haXZlX2RhdGV0aW1lKSAgIyBub3QgZXZlbiBmb3IgVVRDIQorCisgICAgIyBJbiBjb250cmFzdCwgVG9EYXRldGltZSh0emluZm89KSBwcm9kdWNlcyBhbiBhd2FyZSBkYXRldGltZSBpbiB0aGUgZ2l2ZW4KKyAgICAjIHRpbWV6b25lLgorICAgIGF3YXJlX2RhdGV0aW1lID0gbWVzc2FnZS5Ub0RhdGV0aW1lKHR6aW5mbz10emluZm8pCisgICAgc2VsZi5hc3NlcnRFcXVhbChvcmlnaW5hbF9kYXRldGltZSwgYXdhcmVfZGF0ZXRpbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgZGF0ZXRpbWUuZGF0ZXRpbWUoMTk3MCwgMSwgMSwgMiwgdHppbmZvPWRhdGV0aW1lLnRpbWV6b25lLnV0YyksCisgICAgICAgIGF3YXJlX2RhdGV0aW1lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodHppbmZvLCBhd2FyZV9kYXRldGltZS50emluZm8pCisKKyAgZGVmIHRlc3RUaW1lZGVsdGFDb252ZXJzaW9uKHNlbGYpOgorICAgIG1lc3NhZ2UgPSBkdXJhdGlvbl9wYjIuRHVyYXRpb24oKQorICAgIG1lc3NhZ2UuRnJvbU5hbm9zZWNvbmRzKDE5OTk5OTk5OTkpCisgICAgdGQgPSBtZXNzYWdlLlRvVGltZWRlbHRhKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHRkLnNlY29uZHMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg5OTk5OTksIHRkLm1pY3Jvc2Vjb25kcykKKworICAgIG1lc3NhZ2UuRnJvbU5hbm9zZWNvbmRzKC0xOTk5OTk5OTk5KQorICAgIHRkID0gbWVzc2FnZS5Ub1RpbWVkZWx0YSgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgdGQuZGF5cykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDg2Mzk4LCB0ZC5zZWNvbmRzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgdGQubWljcm9zZWNvbmRzKQorCisgICAgbWVzc2FnZS5Gcm9tTWljcm9zZWNvbmRzKC0xKQorICAgIHRkID0gbWVzc2FnZS5Ub1RpbWVkZWx0YSgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgdGQuZGF5cykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDg2Mzk5LCB0ZC5zZWNvbmRzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTk5OTk5LCB0ZC5taWNyb3NlY29uZHMpCisgICAgY29udmVydGVkX21lc3NhZ2UgPSBkdXJhdGlvbl9wYjIuRHVyYXRpb24oKQorICAgIGNvbnZlcnRlZF9tZXNzYWdlLkZyb21UaW1lZGVsdGEodGQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCBjb252ZXJ0ZWRfbWVzc2FnZSkKKworICBkZWYgdGVzdEludmFsaWRUaW1lc3RhbXAoc2VsZik6CisgICAgbWVzc2FnZSA9IHRpbWVzdGFtcF9wYjIuVGltZXN0YW1wKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICBWYWx1ZUVycm9yLCAnRmFpbGVkIHRvIHBhcnNlIHRpbWVzdGFtcDogbWlzc2luZyB2YWxpZCB0aW1lem9uZSBvZmZzZXQuJywKKyAgICAgICAgbWVzc2FnZS5Gcm9tSnNvblN0cmluZywgJycpCisgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAgVmFsdWVFcnJvciwgJ0ZhaWxlZCB0byBwYXJzZSB0aW1lc3RhbXA6IGludmFsaWQgdHJhaWxpbmcgZGF0YSAnCisgICAgICAgICcxOTcwLTAxLTAxVDAwOjAwOjAxWnRyYWlsLicsIG1lc3NhZ2UuRnJvbUpzb25TdHJpbmcsCisgICAgICAgICcxOTcwLTAxLTAxVDAwOjAwOjAxWnRyYWlsJykKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICBWYWx1ZUVycm9yLCAndGltZSBkYXRhIFwnMTAwMDAtMDEtMDFUMDA6MDA6MDBcJyBkb2VzIG5vdCBtYXRjaCcKKyAgICAgICAgJyBmb3JtYXQgXCclWS0lbS0lZFQlSDolTTolU1wnJywgbWVzc2FnZS5Gcm9tSnNvblN0cmluZywKKyAgICAgICAgJzEwMDAwLTAxLTAxVDAwOjAwOjAwLjAwWicpCisgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAgVmFsdWVFcnJvciwgJ25hbm9zIDAxMjM0NTY3ODkwMTIgbW9yZSB0aGFuIDkgZnJhY3Rpb25hbCBkaWdpdHMuJywKKyAgICAgICAgbWVzc2FnZS5Gcm9tSnNvblN0cmluZywgJzE5NzAtMDEtMDFUMDA6MDA6MDAuMDEyMzQ1Njc4OTAxMlonKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIFZhbHVlRXJyb3IsCisgICAgICAgIChyJ0ludmFsaWQgdGltZXpvbmUgb2Zmc2V0IHZhbHVlOiBcKzA4LicpLAorICAgICAgICBtZXNzYWdlLkZyb21Kc29uU3RyaW5nLAorICAgICAgICAnMTk3Mi0wMS0wMVQwMTowMDowMC4wMSswOCcsCisgICAgKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVmFsdWVFcnJvciwgJ3llYXIgKDAgKT9pcyBvdXQgb2YgcmFuZ2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5Gcm9tSnNvblN0cmluZywgJzAwMDAtMDEtMDFUMDA6MDA6MDBaJykKKyAgICBtZXNzYWdlLnNlY29uZHMgPSAyNTM0MDIzMDA4MDAKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KE92ZXJmbG93RXJyb3IsICdkYXRlIHZhbHVlIG91dCBvZiByYW5nZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZykKKworICBkZWYgdGVzdEludmFsaWREdXJhdGlvbihzZWxmKToKKyAgICBtZXNzYWdlID0gZHVyYXRpb25fcGIyLkR1cmF0aW9uKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsICdEdXJhdGlvbiBtdXN0IGVuZCB3aXRoIGxldHRlciAicyI6IDEuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuRnJvbUpzb25TdHJpbmcsICcxJykKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsICdDb3VsZG5cJ3QgcGFyc2UgZHVyYXRpb246IDEuLi4ycy4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5Gcm9tSnNvblN0cmluZywgJzEuLi4ycycpCisgICAgdGV4dCA9ICctMzE1NTc2MDAwMDAxLjAwMDAwMDAwMHMnCisgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAgVmFsdWVFcnJvciwKKyAgICAgICAgcidEdXJhdGlvbiBpcyBub3QgdmFsaWRcOiBTZWNvbmRzIC0zMTU1NzYwMDAwMDEgbXVzdCBiZSBpbiByYW5nZScKKyAgICAgICAgcicgXFstMzE1NTc2MDAwMDAwXCwgMzE1NTc2MDAwMDAwXF0uJywgbWVzc2FnZS5Gcm9tSnNvblN0cmluZywgdGV4dCkKKyAgICB0ZXh0ID0gJzMxNTU3NjAwMDAwMS4wMDAwMDAwMDBzJworICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIFZhbHVlRXJyb3IsCisgICAgICAgIHInRHVyYXRpb24gaXMgbm90IHZhbGlkXDogU2Vjb25kcyAzMTU1NzYwMDAwMDEgbXVzdCBiZSBpbiByYW5nZScKKyAgICAgICAgcicgXFstMzE1NTc2MDAwMDAwXCwgMzE1NTc2MDAwMDAwXF0uJywgbWVzc2FnZS5Gcm9tSnNvblN0cmluZywgdGV4dCkKKyAgICBtZXNzYWdlLnNlY29uZHMgPSAtMzE1NTc2MDAwMDAxCisgICAgbWVzc2FnZS5uYW5vcyA9IDAKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICBWYWx1ZUVycm9yLAorICAgICAgICByJ0R1cmF0aW9uIGlzIG5vdCB2YWxpZFw6IFNlY29uZHMgLTMxNTU3NjAwMDAwMSBtdXN0IGJlIGluIHJhbmdlJworICAgICAgICByJyBcWy0zMTU1NzYwMDAwMDBcLCAzMTU1NzYwMDAwMDBcXS4nLCBtZXNzYWdlLlRvSnNvblN0cmluZykKKyAgICBtZXNzYWdlLnNlY29uZHMgPSAwCisgICAgbWVzc2FnZS5uYW5vcyA9IDk5OTk5OTk5OSArIDEKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICBWYWx1ZUVycm9yLCByJ0R1cmF0aW9uIGlzIG5vdCB2YWxpZFw6IE5hbm9zIDEwMDAwMDAwMDAgbXVzdCBiZSBpbiByYW5nZScKKyAgICAgICAgcicgXFstOTk5OTk5OTk5XCwgOTk5OTk5OTk5XF0uJywgbWVzc2FnZS5Ub0pzb25TdHJpbmcpCisgICAgbWVzc2FnZS5zZWNvbmRzID0gLTEKKyAgICBtZXNzYWdlLm5hbm9zID0gMQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHInRHVyYXRpb24gaXMgbm90IHZhbGlkXDogU2lnbiBtaXNtYXRjaC4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5Ub0pzb25TdHJpbmcpCisKKworY2xhc3MgRmllbGRNYXNrVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RTdHJpbmdGb3JtYXQoc2VsZik6CisgICAgbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgbWFzay5Ub0pzb25TdHJpbmcoKSkKKyAgICBtYXNrLnBhdGhzLmFwcGVuZCgnZm9vJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28nLCBtYXNrLlRvSnNvblN0cmluZygpKQorICAgIG1hc2sucGF0aHMuYXBwZW5kKCdiYXInKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbyxiYXInLCBtYXNrLlRvSnNvblN0cmluZygpKQorCisgICAgbWFzay5Gcm9tSnNvblN0cmluZygnJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBtYXNrLlRvSnNvblN0cmluZygpKQorICAgIG1hc2suRnJvbUpzb25TdHJpbmcoJ2ZvbycpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbJ2ZvbyddLCBtYXNrLnBhdGhzKQorICAgIG1hc2suRnJvbUpzb25TdHJpbmcoJ2ZvbyxiYXInKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydmb28nLCAnYmFyJ10sIG1hc2sucGF0aHMpCisKKyAgICAjIFRlc3QgY2FtZWwgY2FzZQorICAgIG1hc2suQ2xlYXIoKQorICAgIG1hc2sucGF0aHMuYXBwZW5kKCdmb29fYmFyJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdmb29CYXInLCBtYXNrLlRvSnNvblN0cmluZygpKQorICAgIG1hc2sucGF0aHMuYXBwZW5kKCdiYXJfcXV6JykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdmb29CYXIsYmFyUXV6JywgbWFzay5Ub0pzb25TdHJpbmcoKSkKKworICAgIG1hc2suRnJvbUpzb25TdHJpbmcoJycpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgbWFzay5Ub0pzb25TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBtYXNrLnBhdGhzKQorICAgIG1hc2suRnJvbUpzb25TdHJpbmcoJ2Zvb0JhcicpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbJ2Zvb19iYXInXSwgbWFzay5wYXRocykKKyAgICBtYXNrLkZyb21Kc29uU3RyaW5nKCdmb29CYXIsYmFyUXV6JykKKyAgICBzZWxmLmFzc2VydEVxdWFsKFsnZm9vX2JhcicsICdiYXJfcXV6J10sIG1hc2sucGF0aHMpCisKKyAgZGVmIHRlc3REZXNjcmlwdG9yVG9GaWVsZE1hc2soc2VsZik6CisgICAgbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCisgICAgbXNnX2Rlc2NyaXB0b3IgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IKKyAgICBtYXNrLkFsbEZpZWxkc0Zyb21EZXNjcmlwdG9yKG1zZ19kZXNjcmlwdG9yKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNzYsIGxlbihtYXNrLnBhdGhzKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWFzay5Jc1ZhbGlkRm9yRGVzY3JpcHRvcihtc2dfZGVzY3JpcHRvcikpCisgICAgZm9yIGZpZWxkIGluIG1zZ19kZXNjcmlwdG9yLmZpZWxkczoKKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWVsZC5uYW1lIGluIG1hc2sucGF0aHMpCisKKyAgZGVmIHRlc3RJc1ZhbGlkRm9yRGVzY3JpcHRvcihzZWxmKToKKyAgICBtc2dfZGVzY3JpcHRvciA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUgorICAgICMgRW1wdHkgbWFzaworICAgIG1hc2sgPSBmaWVsZF9tYXNrX3BiMi5GaWVsZE1hc2soKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXNrLklzVmFsaWRGb3JEZXNjcmlwdG9yKG1zZ19kZXNjcmlwdG9yKSkKKyAgICAjIEFsbCBmaWVsZHMgZnJvbSBkZXNjcmlwdG9yCisgICAgbWFzay5BbGxGaWVsZHNGcm9tRGVzY3JpcHRvcihtc2dfZGVzY3JpcHRvcikKKyAgICBzZWxmLmFzc2VydFRydWUobWFzay5Jc1ZhbGlkRm9yRGVzY3JpcHRvcihtc2dfZGVzY3JpcHRvcikpCisgICAgIyBDaGlsZCB1bmRlciBvcHRpb25hbCBtZXNzYWdlCisgICAgbWFzay5wYXRocy5hcHBlbmQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiJykKKyAgICBzZWxmLmFzc2VydFRydWUobWFzay5Jc1ZhbGlkRm9yRGVzY3JpcHRvcihtc2dfZGVzY3JpcHRvcikpCisgICAgIyBSZXBlYXRlZCBmaWVsZCBpcyBvbmx5IGFsbG93ZWQgaW4gdGhlIGxhc3QgcG9zaXRpb24gb2YgcGF0aAorICAgIG1hc2sucGF0aHMuYXBwZW5kKCdyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5iYicpCisgICAgc2VsZi5hc3NlcnRGYWxzZShtYXNrLklzVmFsaWRGb3JEZXNjcmlwdG9yKG1zZ19kZXNjcmlwdG9yKSkKKyAgICAjIEludmFsaWQgdG9wIGxldmVsIGZpZWxkCisgICAgbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCisgICAgbWFzay5wYXRocy5hcHBlbmQoJ3h4eCcpCisgICAgc2VsZi5hc3NlcnRGYWxzZShtYXNrLklzVmFsaWRGb3JEZXNjcmlwdG9yKG1zZ19kZXNjcmlwdG9yKSkKKyAgICAjIEludmFsaWQgZmllbGQgaW4gcm9vdAorICAgIG1hc2sgPSBmaWVsZF9tYXNrX3BiMi5GaWVsZE1hc2soKQorICAgIG1hc2sucGF0aHMuYXBwZW5kKCd4eHguenp6JykKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1hc2suSXNWYWxpZEZvckRlc2NyaXB0b3IobXNnX2Rlc2NyaXB0b3IpKQorICAgICMgSW52YWxpZCBmaWVsZCBpbiBpbnRlcm5hbCBub2RlCisgICAgbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCisgICAgbWFzay5wYXRocy5hcHBlbmQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlLnh4eC56enonKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UobWFzay5Jc1ZhbGlkRm9yRGVzY3JpcHRvcihtc2dfZGVzY3JpcHRvcikpCisgICAgIyBJbnZhbGlkIGZpZWxkIGluIGxlYWYKKyAgICBtYXNrID0gZmllbGRfbWFza19wYjIuRmllbGRNYXNrKCkKKyAgICBtYXNrLnBhdGhzLmFwcGVuZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UueHh4JykKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1hc2suSXNWYWxpZEZvckRlc2NyaXB0b3IobXNnX2Rlc2NyaXB0b3IpKQorCisgIGRlZiB0ZXN0Q2Fub25pY2FsRnJvbShzZWxmKToKKyAgICBtYXNrID0gZmllbGRfbWFza19wYjIuRmllbGRNYXNrKCkKKyAgICBvdXRfbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCisgICAgIyBQYXRocyB3aWxsIGJlIHNvcnRlZC4KKyAgICBtYXNrLkZyb21Kc29uU3RyaW5nKCdiYXoucXV6LGJhcixmb28nKQorICAgIG91dF9tYXNrLkNhbm9uaWNhbEZvcm1Gcm9tTWFzayhtYXNrKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2JhcixiYXoucXV6LGZvbycsIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQorICAgICMgRHVwbGljYXRlZCBwYXRocyB3aWxsIGJlIHJlbW92ZWQuCisgICAgbWFzay5Gcm9tSnNvblN0cmluZygnZm9vLGJhcixmb28nKQorICAgIG91dF9tYXNrLkNhbm9uaWNhbEZvcm1Gcm9tTWFzayhtYXNrKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2Jhcixmb28nLCBvdXRfbWFzay5Ub0pzb25TdHJpbmcoKSkKKyAgICAjIFN1Yi1wYXRocyBvZiBvdGhlciBwYXRocyB3aWxsIGJlIHJlbW92ZWQuCisgICAgbWFzay5Gcm9tSnNvblN0cmluZygnZm9vLmIxLGJhci5iMSxmb28uYjIsYmFyJykKKyAgICBvdXRfbWFzay5DYW5vbmljYWxGb3JtRnJvbU1hc2sobWFzaykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdiYXIsZm9vLmIxLGZvby5iMicsIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQorCisgICAgIyBUZXN0IG1vcmUgZGVlcGx5IG5lc3RlZCBjYXNlcy4KKyAgICBtYXNrLkZyb21Kc29uU3RyaW5nKAorICAgICAgICAnZm9vLmJhci5iYXoxLGZvby5iYXIuYmF6Mi5xdXosZm9vLmJhci5iYXoyJykKKyAgICBvdXRfbWFzay5DYW5vbmljYWxGb3JtRnJvbU1hc2sobWFzaykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28uYmFyLmJhejEsZm9vLmJhci5iYXoyJywKKyAgICAgICAgICAgICAgICAgICAgIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQorICAgIG1hc2suRnJvbUpzb25TdHJpbmcoCisgICAgICAgICdmb28uYmFyLmJhejEsZm9vLmJhci5iYXoyLGZvby5iYXIuYmF6Mi5xdXonKQorICAgIG91dF9tYXNrLkNhbm9uaWNhbEZvcm1Gcm9tTWFzayhtYXNrKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2Zvby5iYXIuYmF6MSxmb28uYmFyLmJhejInLAorICAgICAgICAgICAgICAgICAgICAgb3V0X21hc2suVG9Kc29uU3RyaW5nKCkpCisgICAgbWFzay5Gcm9tSnNvblN0cmluZygKKyAgICAgICAgJ2Zvby5iYXIuYmF6MSxmb28uYmFyLmJhejIsZm9vLmJhci5iYXoyLnF1eixmb28uYmFyJykKKyAgICBvdXRfbWFzay5DYW5vbmljYWxGb3JtRnJvbU1hc2sobWFzaykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28uYmFyJywgb3V0X21hc2suVG9Kc29uU3RyaW5nKCkpCisgICAgbWFzay5Gcm9tSnNvblN0cmluZygKKyAgICAgICAgJ2Zvby5iYXIuYmF6MSxmb28uYmFyLmJhejIsZm9vLmJhci5iYXoyLnF1eixmb28nKQorICAgIG91dF9tYXNrLkNhbm9uaWNhbEZvcm1Gcm9tTWFzayhtYXNrKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbycsIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQorCisgIGRlZiB0ZXN0VW5pb24oc2VsZik6CisgICAgbWFzazEgPSBmaWVsZF9tYXNrX3BiMi5GaWVsZE1hc2soKQorICAgIG1hc2syID0gZmllbGRfbWFza19wYjIuRmllbGRNYXNrKCkKKyAgICBvdXRfbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCisgICAgbWFzazEuRnJvbUpzb25TdHJpbmcoJ2ZvbyxiYXonKQorICAgIG1hc2syLkZyb21Kc29uU3RyaW5nKCdiYXIscXV6JykKKyAgICBvdXRfbWFzay5VbmlvbihtYXNrMSwgbWFzazIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnYmFyLGJheixmb28scXV6Jywgb3V0X21hc2suVG9Kc29uU3RyaW5nKCkpCisgICAgIyBPdmVybGFwIHdpdGggZHVwbGljYXRlZCBwYXRocy4KKyAgICBtYXNrMS5Gcm9tSnNvblN0cmluZygnZm9vLGJhei5iYicpCisgICAgbWFzazIuRnJvbUpzb25TdHJpbmcoJ2Jhei5iYixxdXonKQorICAgIG91dF9tYXNrLlVuaW9uKG1hc2sxLCBtYXNrMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdiYXouYmIsZm9vLHF1eicsIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQorICAgICMgT3ZlcmxhcCB3aXRoIHBhdGhzIGNvdmVyaW5nIHNvbWUgb3RoZXIgcGF0aHMuCisgICAgbWFzazEuRnJvbUpzb25TdHJpbmcoJ2Zvby5iYXIuYmF6LHF1eicpCisgICAgbWFzazIuRnJvbUpzb25TdHJpbmcoJ2Zvby5iYXIsYmFyJykKKyAgICBvdXRfbWFzay5VbmlvbihtYXNrMSwgbWFzazIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnYmFyLGZvby5iYXIscXV6Jywgb3V0X21hc2suVG9Kc29uU3RyaW5nKCkpCisgICAgc3JjID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgIG91dF9tYXNrLlVuaW9uKHNyYywgbWFzazIpCisKKyAgZGVmIHRlc3RJbnRlcnNlY3Qoc2VsZik6CisgICAgbWFzazEgPSBmaWVsZF9tYXNrX3BiMi5GaWVsZE1hc2soKQorICAgIG1hc2syID0gZmllbGRfbWFza19wYjIuRmllbGRNYXNrKCkKKyAgICBvdXRfbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCisgICAgIyBUZXN0IGNhc2VzIHdpdGhvdXQgb3ZlcmxhcHBpbmcuCisgICAgbWFzazEuRnJvbUpzb25TdHJpbmcoJ2ZvbyxiYXonKQorICAgIG1hc2syLkZyb21Kc29uU3RyaW5nKCdiYXIscXV6JykKKyAgICBvdXRfbWFzay5JbnRlcnNlY3QobWFzazEsIG1hc2syKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG91dF9tYXNrLnBhdGhzKSwgMCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG91dF9tYXNrLnBhdGhzLCBbXSkKKyAgICAjIE92ZXJsYXAgd2l0aCBkdXBsaWNhdGVkIHBhdGhzLgorICAgIG1hc2sxLkZyb21Kc29uU3RyaW5nKCdmb28sYmF6LmJiJykKKyAgICBtYXNrMi5Gcm9tSnNvblN0cmluZygnYmF6LmJiLHF1eicpCisgICAgb3V0X21hc2suSW50ZXJzZWN0KG1hc2sxLCBtYXNrMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdiYXouYmInLCBvdXRfbWFzay5Ub0pzb25TdHJpbmcoKSkKKyAgICAjIE92ZXJsYXAgd2l0aCBwYXRocyBjb3ZlcmluZyBzb21lIG90aGVyIHBhdGhzLgorICAgIG1hc2sxLkZyb21Kc29uU3RyaW5nKCdmb28uYmFyLmJheixxdXonKQorICAgIG1hc2syLkZyb21Kc29uU3RyaW5nKCdmb28uYmFyLGJhcicpCisgICAgb3V0X21hc2suSW50ZXJzZWN0KG1hc2sxLCBtYXNrMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28uYmFyLmJheicsIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQorICAgIG1hc2sxLkZyb21Kc29uU3RyaW5nKCdmb28uYmFyLGJhcicpCisgICAgbWFzazIuRnJvbUpzb25TdHJpbmcoJ2Zvby5iYXIuYmF6LHF1eicpCisgICAgb3V0X21hc2suSW50ZXJzZWN0KG1hc2sxLCBtYXNrMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28uYmFyLmJheicsIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQorICAgICMgSW50ZXJzZWN0ICcnIHdpdGggJycKKyAgICBtYXNrMS5DbGVhcigpCisgICAgbWFzazIuQ2xlYXIoKQorICAgIG1hc2sxLnBhdGhzLmFwcGVuZCgnJykKKyAgICBtYXNrMi5wYXRocy5hcHBlbmQoJycpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtYXNrMS5wYXRocywgWycnXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBtYXNrMS5Ub0pzb25TdHJpbmcoKSkKKyAgICBvdXRfbWFzay5JbnRlcnNlY3QobWFzazEsIG1hc2syKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0X21hc2sucGF0aHMsIFtdKQorCisgIGRlZiB0ZXN0TWVyZ2VNZXNzYWdlV2l0aG91dE1hcEZpZWxkcyhzZWxmKToKKyAgICAjIFRlc3QgbWVyZ2Ugb25lIGZpZWxkLgorICAgIHNyYyA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMoc3JjKQorICAgIGZvciBmaWVsZCBpbiBzcmMuREVTQ1JJUFRPUi5maWVsZHM6CisgICAgICBpZiBmaWVsZC5jb250YWluaW5nX29uZW9mOgorICAgICAgICBjb250aW51ZQorICAgICAgZmllbGRfbmFtZSA9IGZpZWxkLm5hbWUKKyAgICAgIGRzdCA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgICAgIyBPbmx5IHNldCBvbmUgcGF0aCB0byBtYXNrLgorICAgICAgbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCisgICAgICBtYXNrLnBhdGhzLmFwcGVuZChmaWVsZF9uYW1lKQorICAgICAgbWFzay5NZXJnZU1lc3NhZ2Uoc3JjLCBkc3QpCisgICAgICAjIFRoZSBleHBlY3RlZCByZXN1bHQgbWVzc2FnZS4KKyAgICAgIG1zZyA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgICAgaWYgZmllbGQubGFiZWwgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICAgIHJlcGVhdGVkX3NyYyA9IGdldGF0dHIoc3JjLCBmaWVsZF9uYW1lKQorICAgICAgICByZXBlYXRlZF9tc2cgPSBnZXRhdHRyKG1zZywgZmllbGRfbmFtZSkKKyAgICAgICAgaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgorICAgICAgICAgIGZvciBpdGVtIGluIHJlcGVhdGVkX3NyYzoKKyAgICAgICAgICAgIHJlcGVhdGVkX21zZy5hZGQoKS5Db3B5RnJvbShpdGVtKQorICAgICAgICBlbHNlOgorICAgICAgICAgIHJlcGVhdGVkX21zZy5leHRlbmQocmVwZWF0ZWRfc3JjKQorICAgICAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgICAgIGdldGF0dHIobXNnLCBmaWVsZF9uYW1lKS5Db3B5RnJvbShnZXRhdHRyKHNyYywgZmllbGRfbmFtZSkpCisgICAgICBlbHNlOgorICAgICAgICBzZXRhdHRyKG1zZywgZmllbGRfbmFtZSwgZ2V0YXR0cihzcmMsIGZpZWxkX25hbWUpKQorICAgICAgIyBPbmx5IGZpZWxkIHNwZWNpZmllZCBpbiBtYXNrIGlzIG1lcmdlZC4KKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBkc3QpCisKKyAgICAjIFRlc3QgbWVyZ2UgbmVzdGVkIGZpZWxkcy4KKyAgICBuZXN0ZWRfc3JjID0gdW5pdHRlc3RfcGIyLk5lc3RlZFRlc3RBbGxUeXBlcygpCisgICAgbmVzdGVkX2RzdCA9IHVuaXR0ZXN0X3BiMi5OZXN0ZWRUZXN0QWxsVHlwZXMoKQorICAgIG5lc3RlZF9zcmMuY2hpbGQucGF5bG9hZC5vcHRpb25hbF9pbnQzMiA9IDEyMzQKKyAgICBuZXN0ZWRfc3JjLmNoaWxkLmNoaWxkLnBheWxvYWQub3B0aW9uYWxfaW50MzIgPSA1Njc4CisgICAgbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCisgICAgbWFzay5Gcm9tSnNvblN0cmluZygnY2hpbGQucGF5bG9hZCcpCisgICAgbWFzay5NZXJnZU1lc3NhZ2UobmVzdGVkX3NyYywgbmVzdGVkX2RzdCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEyMzQsIG5lc3RlZF9kc3QuY2hpbGQucGF5bG9hZC5vcHRpb25hbF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG5lc3RlZF9kc3QuY2hpbGQuY2hpbGQucGF5bG9hZC5vcHRpb25hbF9pbnQzMikKKworICAgIG1hc2suRnJvbUpzb25TdHJpbmcoJ2NoaWxkLmNoaWxkLnBheWxvYWQnKQorICAgIG1hc2suTWVyZ2VNZXNzYWdlKG5lc3RlZF9zcmMsIG5lc3RlZF9kc3QpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMjM0LCBuZXN0ZWRfZHN0LmNoaWxkLnBheWxvYWQub3B0aW9uYWxfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1Njc4LCBuZXN0ZWRfZHN0LmNoaWxkLmNoaWxkLnBheWxvYWQub3B0aW9uYWxfaW50MzIpCisKKyAgICBuZXN0ZWRfZHN0LkNsZWFyKCkKKyAgICBtYXNrLkZyb21Kc29uU3RyaW5nKCdjaGlsZC5jaGlsZC5wYXlsb2FkJykKKyAgICBtYXNrLk1lcmdlTWVzc2FnZShuZXN0ZWRfc3JjLCBuZXN0ZWRfZHN0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbmVzdGVkX2RzdC5jaGlsZC5wYXlsb2FkLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNTY3OCwgbmVzdGVkX2RzdC5jaGlsZC5jaGlsZC5wYXlsb2FkLm9wdGlvbmFsX2ludDMyKQorCisgICAgbmVzdGVkX2RzdC5DbGVhcigpCisgICAgbWFzay5Gcm9tSnNvblN0cmluZygnY2hpbGQnKQorICAgIG1hc2suTWVyZ2VNZXNzYWdlKG5lc3RlZF9zcmMsIG5lc3RlZF9kc3QpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMjM0LCBuZXN0ZWRfZHN0LmNoaWxkLnBheWxvYWQub3B0aW9uYWxfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1Njc4LCBuZXN0ZWRfZHN0LmNoaWxkLmNoaWxkLnBheWxvYWQub3B0aW9uYWxfaW50MzIpCisKKyAgICAjIFRlc3QgTWVyZ2VPcHRpb25zLgorICAgIG5lc3RlZF9kc3QuQ2xlYXIoKQorICAgIG5lc3RlZF9kc3QuY2hpbGQucGF5bG9hZC5vcHRpb25hbF9pbnQ2NCA9IDQzMjEKKyAgICAjIE1lc3NhZ2UgZmllbGRzIHdpbGwgYmUgbWVyZ2VkIGJ5IGRlZmF1bHQuCisgICAgbWFzay5Gcm9tSnNvblN0cmluZygnY2hpbGQucGF5bG9hZCcpCisgICAgbWFzay5NZXJnZU1lc3NhZ2UobmVzdGVkX3NyYywgbmVzdGVkX2RzdCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEyMzQsIG5lc3RlZF9kc3QuY2hpbGQucGF5bG9hZC5vcHRpb25hbF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQzMjEsIG5lc3RlZF9kc3QuY2hpbGQucGF5bG9hZC5vcHRpb25hbF9pbnQ2NCkKKyAgICAjIENoYW5nZSB0aGUgYmVoYXZpb3IgdG8gcmVwbGFjZSBtZXNzYWdlIGZpZWxkcy4KKyAgICBtYXNrLkZyb21Kc29uU3RyaW5nKCdjaGlsZC5wYXlsb2FkJykKKyAgICBtYXNrLk1lcmdlTWVzc2FnZShuZXN0ZWRfc3JjLCBuZXN0ZWRfZHN0LCBUcnVlLCBGYWxzZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEyMzQsIG5lc3RlZF9kc3QuY2hpbGQucGF5bG9hZC5vcHRpb25hbF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG5lc3RlZF9kc3QuY2hpbGQucGF5bG9hZC5vcHRpb25hbF9pbnQ2NCkKKworICAgICMgQnkgZGVmYXVsdCwgZmllbGRzIG1pc3NpbmcgaW4gc291cmNlIGFyZSBub3QgY2xlYXJlZCBpbiBkZXN0aW5hdGlvbi4KKyAgICBuZXN0ZWRfZHN0LnBheWxvYWQub3B0aW9uYWxfaW50MzIgPSAxMjM0CisgICAgc2VsZi5hc3NlcnRUcnVlKG5lc3RlZF9kc3QuSGFzRmllbGQoJ3BheWxvYWQnKSkKKyAgICBtYXNrLkZyb21Kc29uU3RyaW5nKCdwYXlsb2FkJykKKyAgICBtYXNrLk1lcmdlTWVzc2FnZShuZXN0ZWRfc3JjLCBuZXN0ZWRfZHN0KQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShuZXN0ZWRfZHN0Lkhhc0ZpZWxkKCdwYXlsb2FkJykpCisgICAgIyBCdXQgdGhleSBhcmUgY2xlYXJlZCB3aGVuIHJlcGxhY2luZyBtZXNzYWdlIGZpZWxkcy4KKyAgICBuZXN0ZWRfZHN0LkNsZWFyKCkKKyAgICBuZXN0ZWRfZHN0LnBheWxvYWQub3B0aW9uYWxfaW50MzIgPSAxMjM0CisgICAgbWFzay5Gcm9tSnNvblN0cmluZygncGF5bG9hZCcpCisgICAgbWFzay5NZXJnZU1lc3NhZ2UobmVzdGVkX3NyYywgbmVzdGVkX2RzdCwgVHJ1ZSwgRmFsc2UpCisgICAgc2VsZi5hc3NlcnRGYWxzZShuZXN0ZWRfZHN0Lkhhc0ZpZWxkKCdwYXlsb2FkJykpCisKKyAgICBuZXN0ZWRfc3JjLnBheWxvYWQucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEyMzQpCisgICAgbmVzdGVkX2RzdC5wYXlsb2FkLnJlcGVhdGVkX2ludDMyLmFwcGVuZCg1Njc4KQorICAgICMgUmVwZWF0ZWQgZmllbGRzIHdpbGwgYmUgYXBwZW5kZWQgYnkgZGVmYXVsdC4KKyAgICBtYXNrLkZyb21Kc29uU3RyaW5nKCdwYXlsb2FkLnJlcGVhdGVkSW50MzInKQorICAgIG1hc2suTWVyZ2VNZXNzYWdlKG5lc3RlZF9zcmMsIG5lc3RlZF9kc3QpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4obmVzdGVkX2RzdC5wYXlsb2FkLnJlcGVhdGVkX2ludDMyKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDU2NzgsIG5lc3RlZF9kc3QucGF5bG9hZC5yZXBlYXRlZF9pbnQzMlswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEyMzQsIG5lc3RlZF9kc3QucGF5bG9hZC5yZXBlYXRlZF9pbnQzMlsxXSkKKyAgICAjIENoYW5nZSB0aGUgYmVoYXZpb3IgdG8gcmVwbGFjZSByZXBlYXRlZCBmaWVsZHMuCisgICAgbWFzay5Gcm9tSnNvblN0cmluZygncGF5bG9hZC5yZXBlYXRlZEludDMyJykKKyAgICBtYXNrLk1lcmdlTWVzc2FnZShuZXN0ZWRfc3JjLCBuZXN0ZWRfZHN0LCBGYWxzZSwgVHJ1ZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihuZXN0ZWRfZHN0LnBheWxvYWQucmVwZWF0ZWRfaW50MzIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzNCwgbmVzdGVkX2RzdC5wYXlsb2FkLnJlcGVhdGVkX2ludDMyWzBdKQorCisgICAgIyBUZXN0IE1lcmdlIG9uZW9mIGZpZWxkLgorICAgIG5ld19tc2cgPSB1bml0dGVzdF9wYjIuVGVzdE9uZW9mMigpCisgICAgZHN0ID0gdW5pdHRlc3RfcGIyLlRlc3RPbmVvZjIoKQorICAgIGRzdC5mb29fbWVzc2FnZS5tb29faW50ID0gMQorICAgIG1hc2sgPSBmaWVsZF9tYXNrX3BiMi5GaWVsZE1hc2soKQorICAgIG1hc2suRnJvbUpzb25TdHJpbmcoJ2Zvb01lc3NhZ2UsZm9vTGF6eU1lc3NhZ2UubW9vSW50JykKKyAgICBtYXNrLk1lcmdlTWVzc2FnZShuZXdfbXNnLCBkc3QpCisgICAgc2VsZi5hc3NlcnRUcnVlKGRzdC5IYXNGaWVsZCgnZm9vX21lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKGRzdC5IYXNGaWVsZCgnZm9vX2xhenlfbWVzc2FnZScpKQorCisgIGRlZiB0ZXN0TWVyZ2VNZXNzYWdlV2l0aE1hcEZpZWxkKHNlbGYpOgorICAgIGVtcHR5X21hcCA9IG1hcF91bml0dGVzdF9wYjIuVGVzdFJlY3Vyc2l2ZU1hcE1lc3NhZ2UoKQorICAgIHNyY19sZXZlbF8yID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0UmVjdXJzaXZlTWFwTWVzc2FnZSgpCisgICAgc3JjX2xldmVsXzIuYVsnc3JjIGxldmVsIDInXS5Db3B5RnJvbShlbXB0eV9tYXApCisgICAgc3JjID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0UmVjdXJzaXZlTWFwTWVzc2FnZSgpCisgICAgc3JjLmFbJ2NvbW1vbiBrZXknXS5Db3B5RnJvbShzcmNfbGV2ZWxfMikKKyAgICBzcmMuYVsnc3JjIGxldmVsIDEnXS5Db3B5RnJvbShzcmNfbGV2ZWxfMikKKworICAgIGRzdF9sZXZlbF8yID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0UmVjdXJzaXZlTWFwTWVzc2FnZSgpCisgICAgZHN0X2xldmVsXzIuYVsnZHN0IGxldmVsIDInXS5Db3B5RnJvbShlbXB0eV9tYXApCisgICAgZHN0ID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0UmVjdXJzaXZlTWFwTWVzc2FnZSgpCisgICAgZHN0LmFbJ2NvbW1vbiBrZXknXS5Db3B5RnJvbShkc3RfbGV2ZWxfMikKKyAgICBkc3QuYVsnZHN0IGxldmVsIDEnXS5Db3B5RnJvbShlbXB0eV9tYXApCisKKyAgICBtYXNrID0gZmllbGRfbWFza19wYjIuRmllbGRNYXNrKCkKKyAgICBtYXNrLkZyb21Kc29uU3RyaW5nKCdhJykKKyAgICBtYXNrLk1lcmdlTWVzc2FnZShzcmMsIGRzdCkKKworICAgICMgbWFwIGZyb20gZHN0IGlzIHJlcGxhY2VkIHdpdGggbWFwIGZyb20gc3JjLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHN0LmFbJ2NvbW1vbiBrZXknXSwgc3JjX2xldmVsXzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChkc3QuYVsnc3JjIGxldmVsIDEnXSwgc3JjX2xldmVsXzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChkc3QuYVsnZHN0IGxldmVsIDEnXSwgZW1wdHlfbWFwKQorCisgIGRlZiB0ZXN0TWVyZ2VFcnJvcnMoc2VsZik6CisgICAgc3JjID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgZHN0ID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhzcmMpCisgICAgbWFzay5Gcm9tSnNvblN0cmluZygnb3B0aW9uYWxJbnQzMi5maWVsZCcpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBlOgorICAgICAgbWFzay5NZXJnZU1lc3NhZ2Uoc3JjLCBkc3QpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnRXJyb3I6IEZpZWxkIG9wdGlvbmFsX2ludDMyIGluIG1lc3NhZ2UgJworICAgICAgICAgICAgICAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyBpcyBub3QgYSBzaW5ndWxhciAnCisgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZSBmaWVsZCBhbmQgY2Fubm90IGhhdmUgc3ViLWZpZWxkcy4nLAorICAgICAgICAgICAgICAgICAgICAgc3RyKGUuZXhjZXB0aW9uKSkKKworICBkZWYgdGVzdFNuYWtlQ2FzZVRvQ2FtZWxDYXNlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2Zvb0JhcicsCisgICAgICAgICAgICAgICAgICAgICB3ZWxsX2tub3duX3R5cGVzLl9TbmFrZUNhc2VUb0NhbWVsQ2FzZSgnZm9vX2JhcicpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0Zvb0JhcicsCisgICAgICAgICAgICAgICAgICAgICB3ZWxsX2tub3duX3R5cGVzLl9TbmFrZUNhc2VUb0NhbWVsQ2FzZSgnX2Zvb19iYXInKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28zQmFyJywKKyAgICAgICAgICAgICAgICAgICAgIHdlbGxfa25vd25fdHlwZXMuX1NuYWtlQ2FzZVRvQ2FtZWxDYXNlKCdmb28zX2JhcicpKQorCisgICAgIyBObyB1cHBlcmNhc2UgbGV0dGVyIGlzIGFsbG93ZWQuCisgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAgVmFsdWVFcnJvciwKKyAgICAgICAgJ0ZhaWwgdG8gcHJpbnQgRmllbGRNYXNrIHRvIEpzb24gc3RyaW5nOiBQYXRoIG5hbWUgRm9vIG11c3QgJworICAgICAgICAnbm90IGNvbnRhaW4gdXBwZXJjYXNlIGxldHRlcnMuJywKKyAgICAgICAgd2VsbF9rbm93bl90eXBlcy5fU25ha2VDYXNlVG9DYW1lbENhc2UsICdGb28nKQorICAgICMgQW55IGNoYXJhY3RlciBhZnRlciBhICJfIiBtdXN0IGJlIGEgbG93ZXJjYXNlIGxldHRlci4KKyAgICAjICAgMS4gIl8iIGNhbm5vdCBiZSBmb2xsb3dlZCBieSBhbm90aGVyICJfIi4KKyAgICAjICAgMi4gIl8iIGNhbm5vdCBiZSBmb2xsb3dlZCBieSBhIGRpZ2l0LgorICAgICMgICAzLiAiXyIgY2Fubm90IGFwcGVhciBhcyB0aGUgbGFzdCBjaGFyYWN0ZXIuCisgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAgVmFsdWVFcnJvciwKKyAgICAgICAgJ0ZhaWwgdG8gcHJpbnQgRmllbGRNYXNrIHRvIEpzb24gc3RyaW5nOiBUaGUgY2hhcmFjdGVyIGFmdGVyIGEgJworICAgICAgICAnIl8iIG11c3QgYmUgYSBsb3dlcmNhc2UgbGV0dGVyIGluIHBhdGggbmFtZSBmb29fX2Jhci4nLAorICAgICAgICB3ZWxsX2tub3duX3R5cGVzLl9TbmFrZUNhc2VUb0NhbWVsQ2FzZSwgJ2Zvb19fYmFyJykKKyAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICBWYWx1ZUVycm9yLAorICAgICAgICAnRmFpbCB0byBwcmludCBGaWVsZE1hc2sgdG8gSnNvbiBzdHJpbmc6IFRoZSBjaGFyYWN0ZXIgYWZ0ZXIgYSAnCisgICAgICAgICciXyIgbXVzdCBiZSBhIGxvd2VyY2FzZSBsZXR0ZXIgaW4gcGF0aCBuYW1lIGZvb18zYmFyLicsCisgICAgICAgIHdlbGxfa25vd25fdHlwZXMuX1NuYWtlQ2FzZVRvQ2FtZWxDYXNlLCAnZm9vXzNiYXInKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIFZhbHVlRXJyb3IsCisgICAgICAgICdGYWlsIHRvIHByaW50IEZpZWxkTWFzayB0byBKc29uIHN0cmluZzogVHJhaWxpbmcgIl8iIGluIHBhdGggJworICAgICAgICAnbmFtZSBmb29fYmFyXy4nLCB3ZWxsX2tub3duX3R5cGVzLl9TbmFrZUNhc2VUb0NhbWVsQ2FzZSwgJ2Zvb19iYXJfJykKKworICBkZWYgdGVzdENhbWVsQ2FzZVRvU25ha2VDYXNlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2Zvb19iYXInLAorICAgICAgICAgICAgICAgICAgICAgd2VsbF9rbm93bl90eXBlcy5fQ2FtZWxDYXNlVG9TbmFrZUNhc2UoJ2Zvb0JhcicpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ19mb29fYmFyJywKKyAgICAgICAgICAgICAgICAgICAgIHdlbGxfa25vd25fdHlwZXMuX0NhbWVsQ2FzZVRvU25ha2VDYXNlKCdGb29CYXInKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28zX2JhcicsCisgICAgICAgICAgICAgICAgICAgICB3ZWxsX2tub3duX3R5cGVzLl9DYW1lbENhc2VUb1NuYWtlQ2FzZSgnZm9vM0JhcicpKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIFZhbHVlRXJyb3IsCisgICAgICAgICdGYWlsIHRvIHBhcnNlIEZpZWxkTWFzazogUGF0aCBuYW1lIGZvb19iYXIgbXVzdCBub3QgY29udGFpbiAiXyJzLicsCisgICAgICAgIHdlbGxfa25vd25fdHlwZXMuX0NhbWVsQ2FzZVRvU25ha2VDYXNlLCAnZm9vX2JhcicpCisKKworY2xhc3MgU3RydWN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZik6CisgICAgc3RydWN0ID0gc3RydWN0X3BiMi5TdHJ1Y3QoKQorICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdHJ1Y3QsIGNvbGxlY3Rpb25zX2FiYy5NYXBwaW5nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHN0cnVjdCkpCisgICAgc3RydWN0X2NsYXNzID0gc3RydWN0Ll9fY2xhc3NfXworCisgICAgc3RydWN0WydrZXkxJ10gPSA1CisgICAgc3RydWN0WydrZXkyJ10gPSAnYWJjJworICAgIHN0cnVjdFsna2V5MyddID0gVHJ1ZQorICAgIHN0cnVjdC5nZXRfb3JfY3JlYXRlX3N0cnVjdCgna2V5NCcpWydzdWJrZXknXSA9IDExLjAKKyAgICBzdHJ1Y3RfbGlzdCA9IHN0cnVjdC5nZXRfb3JfY3JlYXRlX2xpc3QoJ2tleTUnKQorICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdHJ1Y3RfbGlzdCwgY29sbGVjdGlvbnNfYWJjLlNlcXVlbmNlKQorICAgIHN0cnVjdF9saXN0LmV4dGVuZChbNiwgJ3NldmVuJywgVHJ1ZSwgRmFsc2UsIE5vbmVdKQorICAgIHN0cnVjdF9saXN0LmFkZF9zdHJ1Y3QoKVsnc3Via2V5MiddID0gOQorICAgIHN0cnVjdFsna2V5NiddID0geydzdWJrZXknOiB7fX0KKyAgICBzdHJ1Y3RbJ2tleTcnXSA9IFsyLCBGYWxzZV0KKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoNywgbGVuKHN0cnVjdCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3RydWN0LCB3ZWxsX2tub3duX3R5cGVzLlN0cnVjdCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBzdHJ1Y3RbJ2tleTEnXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmMnLCBzdHJ1Y3RbJ2tleTInXSkKKyAgICBzZWxmLmFzc2VydElzKFRydWUsIHN0cnVjdFsna2V5MyddKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTEsIHN0cnVjdFsna2V5NCddWydzdWJrZXknXSkKKyAgICBpbm5lcl9zdHJ1Y3QgPSBzdHJ1Y3RfY2xhc3MoKQorICAgIGlubmVyX3N0cnVjdFsnc3Via2V5MiddID0gOQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzYsICdzZXZlbicsIFRydWUsIEZhbHNlLCBOb25lLCBpbm5lcl9zdHJ1Y3RdLAorICAgICAgICAgICAgICAgICAgICAgbGlzdChzdHJ1Y3RbJ2tleTUnXS5pdGVtcygpKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHt9LCBkaWN0KHN0cnVjdFsna2V5NiddWydzdWJrZXknXS5maWVsZHMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzIsIEZhbHNlXSwgbGlzdChzdHJ1Y3RbJ2tleTcnXS5pdGVtcygpKSkKKworICAgIHNlcmlhbGl6ZWQgPSBzdHJ1Y3QuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHN0cnVjdDIgPSBzdHJ1Y3RfcGIyLlN0cnVjdCgpCisgICAgc3RydWN0Mi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydWN0LCBzdHJ1Y3QyKQorICAgIGZvciBrZXksIHZhbHVlIGluIHN0cnVjdC5pdGVtcygpOgorICAgICAgc2VsZi5hc3NlcnRJbihrZXksIHN0cnVjdCkKKyAgICAgIHNlbGYuYXNzZXJ0SW4oa2V5LCBzdHJ1Y3QyKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgc3RydWN0MltrZXldKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCg3LCBsZW4oc3RydWN0LmtleXMoKSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg3LCBsZW4oc3RydWN0LnZhbHVlcygpKSkKKyAgICBmb3Iga2V5IGluIHN0cnVjdC5rZXlzKCk6CisgICAgICBzZWxmLmFzc2VydEluKGtleSwgc3RydWN0KQorICAgICAgc2VsZi5hc3NlcnRJbihrZXksIHN0cnVjdDIpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cnVjdFtrZXldLCBzdHJ1Y3QyW2tleV0pCisKKyAgICBpdGVtID0gKG5leHQoaXRlcihzdHJ1Y3Qua2V5cygpKSksIG5leHQoaXRlcihzdHJ1Y3QudmFsdWVzKCkpKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW0sIG5leHQoaXRlcihzdHJ1Y3QuaXRlbXMoKSkpKQorCisgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3RydWN0Miwgd2VsbF9rbm93bl90eXBlcy5TdHJ1Y3QpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgc3RydWN0Mlsna2V5MSddKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiYycsIHN0cnVjdDJbJ2tleTInXSkKKyAgICBzZWxmLmFzc2VydElzKFRydWUsIHN0cnVjdDJbJ2tleTMnXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDExLCBzdHJ1Y3QyWydrZXk0J11bJ3N1YmtleSddKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzYsICdzZXZlbicsIFRydWUsIEZhbHNlLCBOb25lLCBpbm5lcl9zdHJ1Y3RdLAorICAgICAgICAgICAgICAgICAgICAgbGlzdChzdHJ1Y3QyWydrZXk1J10uaXRlbXMoKSkpCisKKyAgICBzdHJ1Y3RfbGlzdCA9IHN0cnVjdDJbJ2tleTUnXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNiwgc3RydWN0X2xpc3RbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnc2V2ZW4nLCBzdHJ1Y3RfbGlzdFsxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIHN0cnVjdF9saXN0WzJdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIHN0cnVjdF9saXN0WzNdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc3RydWN0X2xpc3RbNF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChpbm5lcl9zdHJ1Y3QsIHN0cnVjdF9saXN0WzVdKQorCisgICAgc3RydWN0X2xpc3RbMV0gPSA3CisgICAgc2VsZi5hc3NlcnRFcXVhbCg3LCBzdHJ1Y3RfbGlzdFsxXSkKKworICAgIHN0cnVjdF9saXN0LmFkZF9saXN0KCkuZXh0ZW5kKFsxLCAndHdvJywgVHJ1ZSwgRmFsc2UsIE5vbmVdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzEsICd0d28nLCBUcnVlLCBGYWxzZSwgTm9uZV0sCisgICAgICAgICAgICAgICAgICAgICBsaXN0KHN0cnVjdF9saXN0WzZdLml0ZW1zKCkpKQorICAgIHN0cnVjdF9saXN0LmV4dGVuZChbeyduZXN0ZWRfc3RydWN0JzogMzB9LCBbJ25lc3RlZF9saXN0JywgOTldLCB7fSwgW11dKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTEsIGxlbihzdHJ1Y3RfbGlzdC52YWx1ZXMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzAsIHN0cnVjdF9saXN0WzddWyduZXN0ZWRfc3RydWN0J10pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnbmVzdGVkX2xpc3QnLCBzdHJ1Y3RfbGlzdFs4XVswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBzdHJ1Y3RfbGlzdFs4XVsxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHt9LCBkaWN0KHN0cnVjdF9saXN0WzldLmZpZWxkcykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgbGlzdChzdHJ1Y3RfbGlzdFsxMF0uaXRlbXMoKSkpCisgICAgc3RydWN0X2xpc3RbMF0gPSB7J3JlcGxhY2UnOiAnc2V0J30KKyAgICBzdHJ1Y3RfbGlzdFsxXSA9IFsncmVwbGFjZScsICdzZXQnXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3NldCcsIHN0cnVjdF9saXN0WzBdWydyZXBsYWNlJ10pCisgICAgc2VsZi5hc3NlcnRFcXVhbChbJ3JlcGxhY2UnLCAnc2V0J10sIGxpc3Qoc3RydWN0X2xpc3RbMV0uaXRlbXMoKSkpCisKKyAgICB0ZXh0X3NlcmlhbGl6ZWQgPSBzdHIoc3RydWN0KQorICAgIHN0cnVjdDMgPSBzdHJ1Y3RfcGIyLlN0cnVjdCgpCisgICAgdGV4dF9mb3JtYXQuTWVyZ2UodGV4dF9zZXJpYWxpemVkLCBzdHJ1Y3QzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydWN0LCBzdHJ1Y3QzKQorCisgICAgc3RydWN0LmdldF9vcl9jcmVhdGVfc3RydWN0KCdrZXkzJylbJ3JlcGxhY2UnXSA9IDEyCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMiwgc3RydWN0WydrZXkzJ11bJ3JlcGxhY2UnXSkKKworICAgICMgVGVzdHMgZW1wdHkgbGlzdC4KKyAgICBzdHJ1Y3QuZ2V0X29yX2NyZWF0ZV9saXN0KCdlbXB0eV9saXN0JykKKyAgICBlbXB0eV9saXN0ID0gc3RydWN0WydlbXB0eV9saXN0J10KKyAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBsaXN0KGVtcHR5X2xpc3QuaXRlbXMoKSkpCisgICAgbGlzdDIgPSBzdHJ1Y3RfcGIyLkxpc3RWYWx1ZSgpCisgICAgbGlzdDIuYWRkX2xpc3QoKQorICAgIGVtcHR5X2xpc3QgPSBsaXN0MlswXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIGxpc3QoZW1wdHlfbGlzdC5pdGVtcygpKSkKKworICAgICMgVGVzdHMgZW1wdHkgc3RydWN0LgorICAgIHN0cnVjdC5nZXRfb3JfY3JlYXRlX3N0cnVjdCgnZW1wdHlfc3RydWN0JykKKyAgICBlbXB0eV9zdHJ1Y3QgPSBzdHJ1Y3RbJ2VtcHR5X3N0cnVjdCddCisgICAgc2VsZi5hc3NlcnRFcXVhbCh7fSwgZGljdChlbXB0eV9zdHJ1Y3QuZmllbGRzKSkKKyAgICBsaXN0Mi5hZGRfc3RydWN0KCkKKyAgICBlbXB0eV9zdHJ1Y3QgPSBsaXN0MlsxXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIGRpY3QoZW1wdHlfc3RydWN0LmZpZWxkcykpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDksIGxlbihzdHJ1Y3QpKQorICAgIGRlbCBzdHJ1Y3RbJ2tleTMnXQorICAgIGRlbCBzdHJ1Y3RbJ2tleTQnXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNywgbGVuKHN0cnVjdCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg2LCBsZW4oc3RydWN0WydrZXk1J10pKQorICAgIGRlbCBzdHJ1Y3RbJ2tleTUnXVsxXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgbGVuKHN0cnVjdFsna2V5NSddKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFs2LCBUcnVlLCBGYWxzZSwgTm9uZSwgaW5uZXJfc3RydWN0XSwKKyAgICAgICAgICAgICAgICAgICAgIGxpc3Qoc3RydWN0WydrZXk1J10uaXRlbXMoKSkpCisKKyAgZGVmIHRlc3RTdHJ1Y3RBc3NpZ25tZW50KHNlbGYpOgorICAgICMgVGVzdHMgc3RydWN0IGFzc2lnbm1lbnQgZnJvbSBhbm90aGVyIHN0cnVjdAorICAgIHMxID0gc3RydWN0X3BiMi5TdHJ1Y3QoKQorICAgIHMyID0gc3RydWN0X3BiMi5TdHJ1Y3QoKQorICAgIGZvciB2YWx1ZSBpbiBbMSwgJ2EnLCBbMV0sIFsnYSddLCB7J2EnOiAnYid9XToKKyAgICAgIHMxWyd4J10gPSB2YWx1ZQorICAgICAgczJbJ3gnXSA9IHMxWyd4J10KKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczFbJ3gnXSwgczJbJ3gnXSkKKworICBkZWYgdGVzdE1lcmdlRnJvbShzZWxmKToKKyAgICBzdHJ1Y3QgPSBzdHJ1Y3RfcGIyLlN0cnVjdCgpCisgICAgc3RydWN0X2NsYXNzID0gc3RydWN0Ll9fY2xhc3NfXworCisgICAgZGljdGlvbmFyeSA9IHsKKyAgICAgICAgJ2tleTEnOiA1LAorICAgICAgICAna2V5Mic6ICdhYmMnLAorICAgICAgICAna2V5Myc6IFRydWUsCisgICAgICAgICdrZXk0JzogeydzdWJrZXknOiAxMS4wfSwKKyAgICAgICAgJ2tleTUnOiBbNiwgJ3NldmVuJywgVHJ1ZSwgRmFsc2UsIE5vbmUsIHsnc3Via2V5Mic6IDl9XSwKKyAgICAgICAgJ2tleTYnOiBbWyduZXN0ZWRfbGlzdCcsIFRydWVdXSwKKyAgICAgICAgJ2VtcHR5X3N0cnVjdCc6IHt9LAorICAgICAgICAnZW1wdHlfbGlzdCc6IFtdCisgICAgfQorICAgIHN0cnVjdC51cGRhdGUoZGljdGlvbmFyeSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHN0cnVjdFsna2V5MSddKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiYycsIHN0cnVjdFsna2V5MiddKQorICAgIHNlbGYuYXNzZXJ0SXMoVHJ1ZSwgc3RydWN0WydrZXkzJ10pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMSwgc3RydWN0WydrZXk0J11bJ3N1YmtleSddKQorICAgIGlubmVyX3N0cnVjdCA9IHN0cnVjdF9jbGFzcygpCisgICAgaW5uZXJfc3RydWN0WydzdWJrZXkyJ10gPSA5CisgICAgc2VsZi5hc3NlcnRFcXVhbChbNiwgJ3NldmVuJywgVHJ1ZSwgRmFsc2UsIE5vbmUsIGlubmVyX3N0cnVjdF0sCisgICAgICAgICAgICAgICAgICAgICBsaXN0KHN0cnVjdFsna2V5NSddLml0ZW1zKCkpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKHN0cnVjdFsna2V5NiddWzBdLnZhbHVlcykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnbmVzdGVkX2xpc3QnLCBzdHJ1Y3RbJ2tleTYnXVswXVswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIHN0cnVjdFsna2V5NiddWzBdWzFdKQorICAgIGVtcHR5X2xpc3QgPSBzdHJ1Y3RbJ2VtcHR5X2xpc3QnXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIGxpc3QoZW1wdHlfbGlzdC5pdGVtcygpKSkKKyAgICBlbXB0eV9zdHJ1Y3QgPSBzdHJ1Y3RbJ2VtcHR5X3N0cnVjdCddCisgICAgc2VsZi5hc3NlcnRFcXVhbCh7fSwgZGljdChlbXB0eV9zdHJ1Y3QuZmllbGRzKSkKKworICAgICMgQWNjb3JkaW5nIHRvIGRvY3VtZW50YXRpb246ICJXaGVuIHBhcnNpbmcgZnJvbSB0aGUgd2lyZSBvciB3aGVuIG1lcmdpbmcsCisgICAgIyBpZiB0aGVyZSBhcmUgZHVwbGljYXRlIG1hcCBrZXlzIHRoZSBsYXN0IGtleSBzZWVuIGlzIHVzZWQiLgorICAgIGR1cGxpY2F0ZSA9IHsKKyAgICAgICAgJ2tleTQnOiB7J3JlcGxhY2UnOiAyMH0sCisgICAgICAgICdrZXk1JzogW1tGYWxzZSwgNV1dCisgICAgfQorICAgIHN0cnVjdC51cGRhdGUoZHVwbGljYXRlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKHN0cnVjdFsna2V5NCddLmZpZWxkcykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMCwgc3RydWN0WydrZXk0J11bJ3JlcGxhY2UnXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihzdHJ1Y3RbJ2tleTUnXS52YWx1ZXMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIHN0cnVjdFsna2V5NSddWzBdWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgc3RydWN0WydrZXk1J11bMF1bMV0pCisKKworY2xhc3MgQW55VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RBbnlNZXNzYWdlKHNlbGYpOgorICAgICMgQ3JlYXRlcyBhbmQgc2V0cyBtZXNzYWdlLgorICAgIG1zZyA9IGFueV90ZXN0X3BiMi5UZXN0QW55KCkKKyAgICBtc2dfZGVzY3JpcHRvciA9IG1zZy5ERVNDUklQVE9SCisgICAgYWxsX3R5cGVzID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgYWxsX2Rlc2NyaXB0b3IgPSBhbGxfdHlwZXMuREVTQ1JJUFRPUgorICAgIGFsbF90eXBlcy5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKHUnXHUwMGZjXHVhNzFmJykKKyAgICAjIFBhY2tzIHRvIEFueS4KKyAgICBtc2cudmFsdWUuUGFjayhhbGxfdHlwZXMpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cudmFsdWUudHlwZV91cmwsCisgICAgICAgICAgICAgICAgICAgICAndHlwZS5nb29nbGVhcGlzLmNvbS8lcycgJSBhbGxfZGVzY3JpcHRvci5mdWxsX25hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cudmFsdWUudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBhbGxfdHlwZXMuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICAjIFRlc3RzIElzKCkgbWV0aG9kLgorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cudmFsdWUuSXMoYWxsX2Rlc2NyaXB0b3IpKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLnZhbHVlLklzKG1zZ19kZXNjcmlwdG9yKSkKKyAgICAjIFVucGFja3MgQW55LgorICAgIHVucGFja2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydFRydWUobXNnLnZhbHVlLlVucGFjayh1bnBhY2tlZF9tZXNzYWdlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGFsbF90eXBlcywgdW5wYWNrZWRfbWVzc2FnZSkKKyAgICAjIFVucGFja3MgdG8gZGlmZmVyZW50IHR5cGUuCisgICAgc2VsZi5hc3NlcnRGYWxzZShtc2cudmFsdWUuVW5wYWNrKG1zZykpCisgICAgIyBPbmx5IEFueSBtZXNzYWdlcyBoYXZlIFBhY2sgbWV0aG9kLgorICAgIHRyeToKKyAgICAgIG1zZy5QYWNrKGFsbF90eXBlcykKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCclcyBzaG91bGQgbm90IGhhdmUgUGFjayBtZXRob2QuJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfZGVzY3JpcHRvci5mdWxsX25hbWUpCisKKyAgZGVmIHRlc3RVbnBhY2tXaXRoTm9TbGFzaEluVHlwZVVybChzZWxmKToKKyAgICBtc2cgPSBhbnlfdGVzdF9wYjIuVGVzdEFueSgpCisgICAgYWxsX3R5cGVzID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgYWxsX2Rlc2NyaXB0b3IgPSBhbGxfdHlwZXMuREVTQ1JJUFRPUgorICAgIG1zZy52YWx1ZS5QYWNrKGFsbF90eXBlcykKKyAgICAjIFJlc2V0IHR5cGVfdXJsIHRvIHBhcnQgb2YgdHlwZV91cmwgYWZ0ZXIgJy8nCisgICAgbXNnLnZhbHVlLnR5cGVfdXJsID0gbXNnLnZhbHVlLlR5cGVOYW1lKCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKG1zZy52YWx1ZS5JcyhhbGxfZGVzY3JpcHRvcikpCisgICAgdW5wYWNrZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLnZhbHVlLlVucGFjayh1bnBhY2tlZF9tZXNzYWdlKSkKKworICBkZWYgdGVzdE1lc3NhZ2VOYW1lKHNlbGYpOgorICAgICMgQ3JlYXRlcyBhbmQgc2V0cyBtZXNzYWdlLgorICAgIHN1Ym1lc3NhZ2UgPSBhbnlfdGVzdF9wYjIuVGVzdEFueSgpCisgICAgc3VibWVzc2FnZS5pbnRfdmFsdWUgPSAxMjM0NQorICAgIG1zZyA9IGFueV9wYjIuQW55KCkKKyAgICBtc2cuUGFjayhzdWJtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLlR5cGVOYW1lKCksICdnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuVGVzdEFueScpCisKKyAgZGVmIHRlc3RQYWNrV2l0aEN1c3RvbVR5cGVVcmwoc2VsZik6CisgICAgc3VibWVzc2FnZSA9IGFueV90ZXN0X3BiMi5UZXN0QW55KCkKKyAgICBzdWJtZXNzYWdlLmludF92YWx1ZSA9IDEyMzQ1CisgICAgbXNnID0gYW55X3BiMi5BbnkoKQorICAgICMgUGFjayB3aXRoIGEgY3VzdG9tIHR5cGUgVVJMIHByZWZpeC4KKyAgICBtc2cuUGFjayhzdWJtZXNzYWdlLCAndHlwZS5teXNlcnZpY2UuY29tJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy50eXBlX3VybCwKKyAgICAgICAgICAgICAgICAgICAgICd0eXBlLm15c2VydmljZS5jb20vJXMnICUgc3VibWVzc2FnZS5ERVNDUklQVE9SLmZ1bGxfbmFtZSkKKyAgICAjIFBhY2sgd2l0aCBhIGN1c3RvbSB0eXBlIFVSTCBwcmVmaXggZW5kaW5nIHdpdGggJy8nLgorICAgIG1zZy5QYWNrKHN1Ym1lc3NhZ2UsICd0eXBlLm15c2VydmljZS5jb20vJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy50eXBlX3VybCwKKyAgICAgICAgICAgICAgICAgICAgICd0eXBlLm15c2VydmljZS5jb20vJXMnICUgc3VibWVzc2FnZS5ERVNDUklQVE9SLmZ1bGxfbmFtZSkKKyAgICAjIFBhY2sgd2l0aCBhbiBlbXB0eSB0eXBlIFVSTCBwcmVmaXguCisgICAgbXNnLlBhY2soc3VibWVzc2FnZSwgJycpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cudHlwZV91cmwsCisgICAgICAgICAgICAgICAgICAgICAnLyVzJyAlIHN1Ym1lc3NhZ2UuREVTQ1JJUFRPUi5mdWxsX25hbWUpCisgICAgIyBUZXN0IHVucGFja2luZyB0aGUgdHlwZS4KKyAgICB1bnBhY2tlZF9tZXNzYWdlID0gYW55X3Rlc3RfcGIyLlRlc3RBbnkoKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuVW5wYWNrKHVucGFja2VkX21lc3NhZ2UpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VibWVzc2FnZSwgdW5wYWNrZWRfbWVzc2FnZSkKKworICBkZWYgdGVzdFBhY2tEZXRlcm1pbmlzdGljKHNlbGYpOgorICAgIHN1Ym1lc3NhZ2UgPSBhbnlfdGVzdF9wYjIuVGVzdEFueSgpCisgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgc3VibWVzc2FnZS5tYXBfdmFsdWVbc3RyKGkpXSA9IGkgKiAyCisgICAgbXNnID0gYW55X3BiMi5BbnkoKQorICAgIG1zZy5QYWNrKHN1Ym1lc3NhZ2UsIGRldGVybWluaXN0aWM9VHJ1ZSkKKyAgICBzZXJpYWxpemVkID0gbXNnLlNlcmlhbGl6ZVRvU3RyaW5nKGRldGVybWluaXN0aWM9VHJ1ZSkKKyAgICBnb2xkZW4gPSAoYidcbjR0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5UZXN0QW55XHgxMkYnCisgICAgICAgICAgICAgIGInXHgxYVx4MDVcblx4MDEwXHgxMFx4MDBceDFhXHgwNVxuXHgwMTFceDEwXHgwMlx4MWFceDA1XG5ceDAxJworICAgICAgICAgICAgICBiJzJceDEwXHgwNFx4MWFceDA1XG5ceDAxM1x4MTBceDA2XHgxYVx4MDVcblx4MDE0XHgxMFx4MDhceDFhJworICAgICAgICAgICAgICBiJ1x4MDVcblx4MDE1XHgxMFxuXHgxYVx4MDVcblx4MDE2XHgxMFx4MGNceDFhXHgwNVxuXHgwMTdceDEwJworICAgICAgICAgICAgICBiJ1x4MGVceDFhXHgwNVxuXHgwMThceDEwXHgxMFx4MWFceDA1XG5ceDAxOVx4MTBceDEyJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbiwgc2VyaWFsaXplZCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXQucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dpcmVfZm9ybWF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4M2Y1MjUKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dpcmVfZm9ybWF0LnB5CkBAIC0wLDAgKzEsMjY4IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkNvbnN0YW50cyBhbmQgc3RhdGljIGZ1bmN0aW9ucyB0byBzdXBwb3J0IHByb3RvY29sIGJ1ZmZlciB3aXJlIGZvcm1hdC4iIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKworaW1wb3J0IHN0cnVjdAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlCisKKworVEFHX1RZUEVfQklUUyA9IDMgICMgTnVtYmVyIG9mIGJpdHMgdXNlZCB0byBob2xkIHR5cGUgaW5mbyBpbiBhIHByb3RvIHRhZy4KK1RBR19UWVBFX01BU0sgPSAoMSA8PCBUQUdfVFlQRV9CSVRTKSAtIDEgICMgMHg3CisKKyMgVGhlc2UgbnVtYmVycyBpZGVudGlmeSB0aGUgd2lyZSB0eXBlIG9mIGEgcHJvdG9jb2wgYnVmZmVyIHZhbHVlLgorIyBXZSB1c2UgdGhlIGxlYXN0LXNpZ25pZmljYW50IFRBR19UWVBFX0JJVFMgYml0cyBvZiB0aGUgdmFyaW50LWVuY29kZWQKKyMgdGFnLWFuZC10eXBlIHRvIHN0b3JlIG9uZSBvZiB0aGVzZSBXSVJFVFlQRV8qIGNvbnN0YW50cy4KKyMgVGhlc2UgdmFsdWVzIG11c3QgbWF0Y2ggV2lyZVR5cGUgZW51bSBpbiBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaC4KK1dJUkVUWVBFX1ZBUklOVCA9IDAKK1dJUkVUWVBFX0ZJWEVENjQgPSAxCitXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEID0gMgorV0lSRVRZUEVfU1RBUlRfR1JPVVAgPSAzCitXSVJFVFlQRV9FTkRfR1JPVVAgPSA0CitXSVJFVFlQRV9GSVhFRDMyID0gNQorX1dJUkVUWVBFX01BWCA9IDUKKworCisjIEJvdW5kcyBmb3IgdmFyaW91cyBpbnRlZ2VyIHR5cGVzLgorSU5UMzJfTUFYID0gaW50KCgxIDw8IDMxKSAtIDEpCitJTlQzMl9NSU4gPSBpbnQoLSgxIDw8IDMxKSkKK1VJTlQzMl9NQVggPSAoMSA8PCAzMikgLSAxCisKK0lOVDY0X01BWCA9ICgxIDw8IDYzKSAtIDEKK0lOVDY0X01JTiA9IC0oMSA8PCA2MykKK1VJTlQ2NF9NQVggPSAoMSA8PCA2NCkgLSAxCisKKyMgInN0cnVjdCIgZm9ybWF0IHN0cmluZ3MgdGhhdCB3aWxsIGVuY29kZS9kZWNvZGUgdGhlIHNwZWNpZmllZCBmb3JtYXRzLgorRk9STUFUX1VJTlQzMl9MSVRUTEVfRU5ESUFOID0gJzxJJworRk9STUFUX1VJTlQ2NF9MSVRUTEVfRU5ESUFOID0gJzxRJworRk9STUFUX0ZMT0FUX0xJVFRMRV9FTkRJQU4gPSAnPGYnCitGT1JNQVRfRE9VQkxFX0xJVFRMRV9FTkRJQU4gPSAnPGQnCisKKworIyBXZSdsbCBoYXZlIHRvIHByb3ZpZGUgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyBvZiBBcHBlbmRMaXR0bGVFbmRpYW4qKCkgb24KKyMgYW55IGFyY2hpdGVjdHVyZXMgd2hlcmUgdGhlc2UgY2hlY2tzIGZhaWwuCitpZiBzdHJ1Y3QuY2FsY3NpemUoRk9STUFUX1VJTlQzMl9MSVRUTEVfRU5ESUFOKSAhPSA0OgorICByYWlzZSBBc3NlcnRpb25FcnJvcignRm9ybWF0ICJJIiBpcyBub3QgYSAzMi1iaXQgbnVtYmVyLicpCitpZiBzdHJ1Y3QuY2FsY3NpemUoRk9STUFUX1VJTlQ2NF9MSVRUTEVfRU5ESUFOKSAhPSA4OgorICByYWlzZSBBc3NlcnRpb25FcnJvcignRm9ybWF0ICJRIiBpcyBub3QgYSA2NC1iaXQgbnVtYmVyLicpCisKKworZGVmIFBhY2tUYWcoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpOgorICAiIiJSZXR1cm5zIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHRoYXQgZW5jb2RlcyB0aGUgZmllbGQgbnVtYmVyIGFuZAorICB3aXJlIHR5cGUgaW5mb3JtYXRpb24gaW4gc3RhbmRhcmQgcHJvdG9jb2wgbWVzc2FnZSB3aXJlIGZvcm1hdC4KKworICBBcmdzOgorICAgIGZpZWxkX251bWJlcjogRXhwZWN0ZWQgdG8gYmUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgWzEsIDEgPDwgMjkpCisgICAgd2lyZV90eXBlOiBPbmUgb2YgdGhlIFdJUkVUWVBFXyogY29uc3RhbnRzLgorICAiIiIKKyAgaWYgbm90IDAgPD0gd2lyZV90eXBlIDw9IF9XSVJFVFlQRV9NQVg6CisgICAgcmFpc2UgbWVzc2FnZS5FbmNvZGVFcnJvcignVW5rbm93biB3aXJlIHR5cGU6ICVkJyAlIHdpcmVfdHlwZSkKKyAgcmV0dXJuIChmaWVsZF9udW1iZXIgPDwgVEFHX1RZUEVfQklUUykgfCB3aXJlX3R5cGUKKworCitkZWYgVW5wYWNrVGFnKHRhZyk6CisgICIiIlRoZSBpbnZlcnNlIG9mIFBhY2tUYWcoKS4gIEdpdmVuIGFuIHVuc2lnbmVkIDMyLWJpdCBudW1iZXIsCisgIHJldHVybnMgYSAoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpIHR1cGxlLgorICAiIiIKKyAgcmV0dXJuICh0YWcgPj4gVEFHX1RZUEVfQklUUyksICh0YWcgJiBUQUdfVFlQRV9NQVNLKQorCisKK2RlZiBaaWdaYWdFbmNvZGUodmFsdWUpOgorICAiIiJaaWdaYWcgVHJhbnNmb3JtOiAgRW5jb2RlcyBzaWduZWQgaW50ZWdlcnMgc28gdGhhdCB0aGV5IGNhbiBiZQorICBlZmZlY3RpdmVseSB1c2VkIHdpdGggdmFyaW50IGVuY29kaW5nLiAgU2VlIHdpcmVfZm9ybWF0LmggZm9yCisgIG1vcmUgZGV0YWlscy4KKyAgIiIiCisgIGlmIHZhbHVlID49IDA6CisgICAgcmV0dXJuIHZhbHVlIDw8IDEKKyAgcmV0dXJuICh2YWx1ZSA8PCAxKSBeICh+MCkKKworCitkZWYgWmlnWmFnRGVjb2RlKHZhbHVlKToKKyAgIiIiSW52ZXJzZSBvZiBaaWdaYWdFbmNvZGUoKS4iIiIKKyAgaWYgbm90IHZhbHVlICYgMHgxOgorICAgIHJldHVybiB2YWx1ZSA+PiAxCisgIHJldHVybiAodmFsdWUgPj4gMSkgXiAofjApCisKKworCisjIFRoZSAqQnl0ZVNpemUoKSBmdW5jdGlvbnMgYmVsb3cgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8KKyMgc2VyaWFsaXplICJmaWVsZCBudW1iZXIgKyB0eXBlIiBpbmZvcm1hdGlvbiBhbmQgdGhlbiBzZXJpYWxpemUgdGhlIHZhbHVlLgorCisKK2RlZiBJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgaW50MzIpOgorICByZXR1cm4gSW50NjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGludDMyKQorCisKK2RlZiBJbnQzMkJ5dGVTaXplTm9UYWcoaW50MzIpOgorICByZXR1cm4gX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcoMHhmZmZmZmZmZmZmZmZmZmZmICYgaW50MzIpCisKKworZGVmIEludDY0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBpbnQ2NCk6CisgICMgSGF2ZSB0byBjb252ZXJ0IHRvIHVpbnQgYmVmb3JlIGNhbGxpbmcgVUludDY0Qnl0ZVNpemUoKS4KKyAgcmV0dXJuIFVJbnQ2NEJ5dGVTaXplKGZpZWxkX251bWJlciwgMHhmZmZmZmZmZmZmZmZmZmZmICYgaW50NjQpCisKKworZGVmIFVJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgdWludDMyKToKKyAgcmV0dXJuIFVJbnQ2NEJ5dGVTaXplKGZpZWxkX251bWJlciwgdWludDMyKQorCisKK2RlZiBVSW50NjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHVpbnQ2NCk6CisgIHJldHVybiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpICsgX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcodWludDY0KQorCisKK2RlZiBTSW50MzJCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGludDMyKToKKyAgcmV0dXJuIFVJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgWmlnWmFnRW5jb2RlKGludDMyKSkKKworCitkZWYgU0ludDY0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBpbnQ2NCk6CisgIHJldHVybiBVSW50NjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIFppZ1phZ0VuY29kZShpbnQ2NCkpCisKKworZGVmIEZpeGVkMzJCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGZpeGVkMzIpOgorICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDQKKworCitkZWYgRml4ZWQ2NEJ5dGVTaXplKGZpZWxkX251bWJlciwgZml4ZWQ2NCk6CisgIHJldHVybiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpICsgOAorCisKK2RlZiBTRml4ZWQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgc2ZpeGVkMzIpOgorICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDQKKworCitkZWYgU0ZpeGVkNjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHNmaXhlZDY0KToKKyAgcmV0dXJuIFRhZ0J5dGVTaXplKGZpZWxkX251bWJlcikgKyA4CisKKworZGVmIEZsb2F0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBmbHQpOgorICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDQKKworCitkZWYgRG91YmxlQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBkb3VibGUpOgorICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDgKKworCitkZWYgQm9vbEJ5dGVTaXplKGZpZWxkX251bWJlciwgYik6CisgIHJldHVybiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpICsgMQorCisKK2RlZiBFbnVtQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBlbnVtKToKKyAgcmV0dXJuIFVJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgZW51bSkKKworCitkZWYgU3RyaW5nQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBzdHJpbmcpOgorICByZXR1cm4gQnl0ZXNCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHN0cmluZy5lbmNvZGUoJ3V0Zi04JykpCisKKworZGVmIEJ5dGVzQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBiKToKKyAgcmV0dXJuIChUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpCisgICAgICAgICAgKyBfVmFyVUludDY0Qnl0ZVNpemVOb1RhZyhsZW4oYikpCisgICAgICAgICAgKyBsZW4oYikpCisKKworZGVmIEdyb3VwQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBtZXNzYWdlKToKKyAgcmV0dXJuICgyICogVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSAgIyBTVEFSVCBhbmQgRU5EIGdyb3VwLgorICAgICAgICAgICsgbWVzc2FnZS5CeXRlU2l6ZSgpKQorCisKK2RlZiBNZXNzYWdlQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBtZXNzYWdlKToKKyAgcmV0dXJuIChUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpCisgICAgICAgICAgKyBfVmFyVUludDY0Qnl0ZVNpemVOb1RhZyhtZXNzYWdlLkJ5dGVTaXplKCkpCisgICAgICAgICAgKyBtZXNzYWdlLkJ5dGVTaXplKCkpCisKKworZGVmIE1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBtc2cpOgorICAjIEZpcnN0IGNvbXB1dGUgdGhlIHNpemVzIG9mIHRoZSB0YWdzLgorICAjIFRoZXJlIGFyZSAyIHRhZ3MgZm9yIHRoZSBiZWdpbm5pbmcgYW5kIGVuZGluZyBvZiB0aGUgcmVwZWF0ZWQgZ3JvdXAsIHRoYXQKKyAgIyBpcyBmaWVsZCBudW1iZXIgMSwgb25lIHdpdGggZmllbGQgbnVtYmVyIDIgKHR5cGVfaWQpIGFuZCBvbmUgd2l0aCBmaWVsZAorICAjIG51bWJlciAzIChtZXNzYWdlKS4KKyAgdG90YWxfc2l6ZSA9ICgyICogVGFnQnl0ZVNpemUoMSkgKyBUYWdCeXRlU2l6ZSgyKSArIFRhZ0J5dGVTaXplKDMpKQorCisgICMgQWRkIHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yIHR5cGVfaWQuCisgIHRvdGFsX3NpemUgKz0gX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcoZmllbGRfbnVtYmVyKQorCisgIG1lc3NhZ2Vfc2l6ZSA9IG1zZy5CeXRlU2l6ZSgpCisKKyAgIyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGZvciBlbmNvZGluZyB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlLgorICB0b3RhbF9zaXplICs9IF9WYXJVSW50NjRCeXRlU2l6ZU5vVGFnKG1lc3NhZ2Vfc2l6ZSkKKworICAjIFRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgorICB0b3RhbF9zaXplICs9IG1lc3NhZ2Vfc2l6ZQorICByZXR1cm4gdG90YWxfc2l6ZQorCisKK2RlZiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpOgorICAiIiJSZXR1cm5zIHRoZSBieXRlcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYSB0YWcgd2l0aCB0aGlzIGZpZWxkIG51bWJlci4iIiIKKyAgIyBKdXN0IHBhc3MgaW4gdHlwZSAwLCBzaW5jZSB0aGUgdHlwZSB3b24ndCBhZmZlY3QgdGhlIHRhZyt0eXBlIHNpemUuCisgIHJldHVybiBfVmFyVUludDY0Qnl0ZVNpemVOb1RhZyhQYWNrVGFnKGZpZWxkX251bWJlciwgMCkpCisKKworIyBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlICpCeXRlU2l6ZSgpIGZ1bmN0aW9ucyBhYm92ZS4KKworZGVmIF9WYXJVSW50NjRCeXRlU2l6ZU5vVGFnKHVpbnQ2NCk6CisgICIiIlJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYSBzaW5nbGUgdmFyaW50CisgIHVzaW5nIGJvdW5kYXJ5IHZhbHVlIGNvbXBhcmlzb25zLiAodW5yb2xsZWQgbG9vcCBvcHRpbWl6YXRpb24gLVdQaWVyY2UpCisgIHVpbnQ2NCBtdXN0IGJlIHVuc2lnbmVkLgorICAiIiIKKyAgaWYgdWludDY0IDw9IDB4N2Y6IHJldHVybiAxCisgIGlmIHVpbnQ2NCA8PSAweDNmZmY6IHJldHVybiAyCisgIGlmIHVpbnQ2NCA8PSAweDFmZmZmZjogcmV0dXJuIDMKKyAgaWYgdWludDY0IDw9IDB4ZmZmZmZmZjogcmV0dXJuIDQKKyAgaWYgdWludDY0IDw9IDB4N2ZmZmZmZmZmOiByZXR1cm4gNQorICBpZiB1aW50NjQgPD0gMHgzZmZmZmZmZmZmZjogcmV0dXJuIDYKKyAgaWYgdWludDY0IDw9IDB4MWZmZmZmZmZmZmZmZjogcmV0dXJuIDcKKyAgaWYgdWludDY0IDw9IDB4ZmZmZmZmZmZmZmZmZmY6IHJldHVybiA4CisgIGlmIHVpbnQ2NCA8PSAweDdmZmZmZmZmZmZmZmZmZmY6IHJldHVybiA5CisgIGlmIHVpbnQ2NCA+IFVJTlQ2NF9NQVg6CisgICAgcmFpc2UgbWVzc2FnZS5FbmNvZGVFcnJvcignVmFsdWUgb3V0IG9mIHJhbmdlOiAlZCcgJSB1aW50NjQpCisgIHJldHVybiAxMAorCisKK05PTl9QQUNLQUJMRV9UWVBFUyA9ICgKKyAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkcsCisgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVAsCisgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRSwKKyAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9CWVRFUworKQorCisKK2RlZiBJc1R5cGVQYWNrYWJsZShmaWVsZF90eXBlKToKKyAgIiIiUmV0dXJuIHRydWUgaWZmIHBhY2thYmxlID0gdHJ1ZSBpcyB2YWxpZCBmb3IgZmllbGRzIG9mIHRoaXMgdHlwZS4KKworICBBcmdzOgorICAgIGZpZWxkX3R5cGU6IGEgRmllbGREZXNjcmlwdG9yOjpUeXBlIHZhbHVlLgorCisgIFJldHVybnM6CisgICAgVHJ1ZSBpZmYgZmllbGRzIG9mIHRoaXMgdHlwZSBhcmUgcGFja2FibGUuCisgICIiIgorICByZXR1cm4gZmllbGRfdHlwZSBub3QgaW4gTk9OX1BBQ0tBQkxFX1RZUEVTCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dpcmVfZm9ybWF0X3Rlc3QucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dpcmVfZm9ybWF0X3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhZDBjNwotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXRfdGVzdC5weQpAQCAtMCwwICsxLDI1MiBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJUZXN0IGZvciBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwud2lyZV9mb3JtYXQuIiIiCisKK19fYXV0aG9yX18gPSAncm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbiknCisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZQorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHdpcmVfZm9ybWF0CisKKworY2xhc3MgV2lyZUZvcm1hdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiB0ZXN0UGFja1RhZyhzZWxmKToKKyAgICBmaWVsZF9udW1iZXIgPSAweGFiYworICAgIHRhZ190eXBlID0gMgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGZpZWxkX251bWJlciA8PCAzKSB8IHRhZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuUGFja1RhZyhmaWVsZF9udW1iZXIsIHRhZ190eXBlKSkKKyAgICBQYWNrVGFnID0gd2lyZV9mb3JtYXQuUGFja1RhZworICAgICMgTnVtYmVyIHRvbyBoaWdoLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG1lc3NhZ2UuRW5jb2RlRXJyb3IsIFBhY2tUYWcsIGZpZWxkX251bWJlciwgNikKKyAgICAjIE51bWJlciB0b28gbG93LgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG1lc3NhZ2UuRW5jb2RlRXJyb3IsIFBhY2tUYWcsIGZpZWxkX251bWJlciwgLTEpCisKKyAgZGVmIHRlc3RVbnBhY2tUYWcoc2VsZik6CisgICAgIyBUZXN0IGZpZWxkIG51bWJlcnMgdGhhdCB3aWxsIHJlcXVpcmUgdmFyaW91cyB2YXJpbnQgc2l6ZXMuCisgICAgZm9yIGV4cGVjdGVkX2ZpZWxkX251bWJlciBpbiAoMSwgMTUsIDE2LCAyMDQ3LCAyMDQ4KToKKyAgICAgIGZvciBleHBlY3RlZF93aXJlX3R5cGUgaW4gcmFuZ2UoNik6ICAjIEhpZ2hlc3QtbnVtYmVyZWQgd2lyZXR5cGUgaXMgNS4KKyAgICAgICAgZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUgPSB3aXJlX2Zvcm1hdC5VbnBhY2tUYWcoCisgICAgICAgICAgICB3aXJlX2Zvcm1hdC5QYWNrVGFnKGV4cGVjdGVkX2ZpZWxkX251bWJlciwgZXhwZWN0ZWRfd2lyZV90eXBlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9maWVsZF9udW1iZXIsIGZpZWxkX251bWJlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF93aXJlX3R5cGUsIHdpcmVfdHlwZSkKKworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2lyZV9mb3JtYXQuVW5wYWNrVGFnLCBOb25lKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2lyZV9mb3JtYXQuVW5wYWNrVGFnLCAnYWJjJykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHdpcmVfZm9ybWF0LlVucGFja1RhZywgMC4wKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2lyZV9mb3JtYXQuVW5wYWNrVGFnLCBvYmplY3QoKSkKKworICBkZWYgdGVzdFppZ1phZ0VuY29kZShzZWxmKToKKyAgICBaID0gd2lyZV9mb3JtYXQuWmlnWmFnRW5jb2RlCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBaKDApKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgWigtMSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBaKDEpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgWigtMikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBaKDIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHhmZmZmZmZmZSwgWigweDdmZmZmZmZmKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDB4ZmZmZmZmZmYsIFooLTB4ODAwMDAwMDApKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHhmZmZmZmZmZmZmZmZmZmZlLCBaKDB4N2ZmZmZmZmZmZmZmZmZmZikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgweGZmZmZmZmZmZmZmZmZmZmYsIFooLTB4ODAwMDAwMDAwMDAwMDAwMCkpCisKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosIE5vbmUpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBaLCAnYWJjZCcpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBaLCAwLjApCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBaLCBvYmplY3QoKSkKKworICBkZWYgdGVzdFppZ1phZ0RlY29kZShzZWxmKToKKyAgICBaID0gd2lyZV9mb3JtYXQuWmlnWmFnRGVjb2RlCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBaKDApKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEsIFooMSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBaKDIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTIsIFooMykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBaKDQpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHg3ZmZmZmZmZiwgWigweGZmZmZmZmZlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKC0weDgwMDAwMDAwLCBaKDB4ZmZmZmZmZmYpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHg3ZmZmZmZmZmZmZmZmZmZmLCBaKDB4ZmZmZmZmZmZmZmZmZmZmZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtMHg4MDAwMDAwMDAwMDAwMDAwLCBaKDB4ZmZmZmZmZmZmZmZmZmZmZikpCisKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosIE5vbmUpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBaLCAnYWJjZCcpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBaLCAwLjApCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBaLCBvYmplY3QoKSkKKworICBkZWYgTnVtZXJpY0J5dGVTaXplVGVzdEhlbHBlcihzZWxmLCBieXRlX3NpemVfZm4sIHZhbHVlLCBleHBlY3RlZF92YWx1ZV9zaXplKToKKyAgICAjIFVzZSBmaWVsZCBudW1iZXJzIHRoYXQgY2F1c2UgdmFyaW91cyBieXRlIHNpemVzIGZvciB0aGUgdGFnIGluZm9ybWF0aW9uLgorICAgIGZvciBmaWVsZF9udW1iZXIsIHRhZ19ieXRlcyBpbiAoKDE1LCAxKSwgKDE2LCAyKSwgKDIwNDcsIDIpLCAoMjA0OCwgMykpOgorICAgICAgZXhwZWN0ZWRfc2l6ZSA9IGV4cGVjdGVkX3ZhbHVlX3NpemUgKyB0YWdfYnl0ZXMKKyAgICAgIGFjdHVhbF9zaXplID0gYnl0ZV9zaXplX2ZuKGZpZWxkX251bWJlciwgdmFsdWUpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3NpemUsIGFjdHVhbF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAnYnl0ZV9zaXplX2ZuOiAlcywgZmllbGRfbnVtYmVyOiAlZCwgdmFsdWU6ICVyXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdFeHBlY3RlZDogJWQsIEFjdHVhbDogJWQnJSAoCisgICAgICAgICAgYnl0ZV9zaXplX2ZuLCBmaWVsZF9udW1iZXIsIHZhbHVlLCBleHBlY3RlZF9zaXplLCBhY3R1YWxfc2l6ZSkpCisKKyAgZGVmIHRlc3RCeXRlU2l6ZUZ1bmN0aW9ucyhzZWxmKToKKyAgICAjIFRlc3QgYWxsIG51bWVyaWMgKkJ5dGVTaXplKCkgZnVuY3Rpb25zLgorICAgIE5VTUVSSUNfQVJHUyA9IFsKKyAgICAgICAgIyBJbnQzMkJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5JbnQzMkJ5dGVTaXplLCAwLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkludDMyQnl0ZVNpemUsIDEyNywgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5JbnQzMkJ5dGVTaXplLCAxMjgsIDJdLAorICAgICAgICBbd2lyZV9mb3JtYXQuSW50MzJCeXRlU2l6ZSwgLTEsIDEwXSwKKyAgICAgICAgIyBJbnQ2NEJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5JbnQ2NEJ5dGVTaXplLCAwLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkludDY0Qnl0ZVNpemUsIDEyNywgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5JbnQ2NEJ5dGVTaXplLCAxMjgsIDJdLAorICAgICAgICBbd2lyZV9mb3JtYXQuSW50NjRCeXRlU2l6ZSwgLTEsIDEwXSwKKyAgICAgICAgIyBVSW50MzJCeXRlU2l6ZSgpLgorICAgICAgICBbd2lyZV9mb3JtYXQuVUludDMyQnl0ZVNpemUsIDAsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuVUludDMyQnl0ZVNpemUsIDEyNywgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5VSW50MzJCeXRlU2l6ZSwgMTI4LCAyXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlVJbnQzMkJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5VSU5UMzJfTUFYLCA1XSwKKyAgICAgICAgIyBVSW50NjRCeXRlU2l6ZSgpLgorICAgICAgICBbd2lyZV9mb3JtYXQuVUludDY0Qnl0ZVNpemUsIDAsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuVUludDY0Qnl0ZVNpemUsIDEyNywgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5VSW50NjRCeXRlU2l6ZSwgMTI4LCAyXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlVJbnQ2NEJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5VSU5UNjRfTUFYLCAxMF0sCisgICAgICAgICMgU0ludDMyQnl0ZVNpemUoKS4KKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLCAwLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLCAtMSwgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50MzJCeXRlU2l6ZSwgMSwgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50MzJCeXRlU2l6ZSwgLTYzLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLCA2MywgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50MzJCeXRlU2l6ZSwgLTY0LCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLCA2NCwgMl0sCisgICAgICAgICMgU0ludDY0Qnl0ZVNpemUoKS4KKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplLCAwLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplLCAtMSwgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50NjRCeXRlU2l6ZSwgMSwgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50NjRCeXRlU2l6ZSwgLTYzLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplLCA2MywgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50NjRCeXRlU2l6ZSwgLTY0LCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplLCA2NCwgMl0sCisgICAgICAgICMgRml4ZWQzMkJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5GaXhlZDMyQnl0ZVNpemUsIDAsIDRdLAorICAgICAgICBbd2lyZV9mb3JtYXQuRml4ZWQzMkJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5VSU5UMzJfTUFYLCA0XSwKKyAgICAgICAgIyBGaXhlZDY0Qnl0ZVNpemUoKS4KKyAgICAgICAgW3dpcmVfZm9ybWF0LkZpeGVkNjRCeXRlU2l6ZSwgMCwgOF0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5GaXhlZDY0Qnl0ZVNpemUsIHdpcmVfZm9ybWF0LlVJTlQ2NF9NQVgsIDhdLAorICAgICAgICAjIFNGaXhlZDMyQnl0ZVNpemUoKS4KKyAgICAgICAgW3dpcmVfZm9ybWF0LlNGaXhlZDMyQnl0ZVNpemUsIDAsIDRdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ZpeGVkMzJCeXRlU2l6ZSwgd2lyZV9mb3JtYXQuSU5UMzJfTUlOLCA0XSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNGaXhlZDMyQnl0ZVNpemUsIHdpcmVfZm9ybWF0LklOVDMyX01BWCwgNF0sCisgICAgICAgICMgU0ZpeGVkNjRCeXRlU2l6ZSgpLgorICAgICAgICBbd2lyZV9mb3JtYXQuU0ZpeGVkNjRCeXRlU2l6ZSwgMCwgOF0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5TRml4ZWQ2NEJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5JTlQ2NF9NSU4sIDhdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ZpeGVkNjRCeXRlU2l6ZSwgd2lyZV9mb3JtYXQuSU5UNjRfTUFYLCA4XSwKKyAgICAgICAgIyBGbG9hdEJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5GbG9hdEJ5dGVTaXplLCAwLjAsIDRdLAorICAgICAgICBbd2lyZV9mb3JtYXQuRmxvYXRCeXRlU2l6ZSwgMTAwMDAwMDAwMC4wLCA0XSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkZsb2F0Qnl0ZVNpemUsIC0xMDAwMDAwMDAwLjAsIDRdLAorICAgICAgICAjIERvdWJsZUJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5Eb3VibGVCeXRlU2l6ZSwgMC4wLCA4XSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkRvdWJsZUJ5dGVTaXplLCAxMDAwMDAwMDAwLjAsIDhdLAorICAgICAgICBbd2lyZV9mb3JtYXQuRG91YmxlQnl0ZVNpemUsIC0xMDAwMDAwMDAwLjAsIDhdLAorICAgICAgICAjIEJvb2xCeXRlU2l6ZSgpLgorICAgICAgICBbd2lyZV9mb3JtYXQuQm9vbEJ5dGVTaXplLCBGYWxzZSwgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5Cb29sQnl0ZVNpemUsIFRydWUsIDFdLAorICAgICAgICAjIEVudW1CeXRlU2l6ZSgpLgorICAgICAgICBbd2lyZV9mb3JtYXQuRW51bUJ5dGVTaXplLCAwLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkVudW1CeXRlU2l6ZSwgMTI3LCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkVudW1CeXRlU2l6ZSwgMTI4LCAyXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkVudW1CeXRlU2l6ZSwgd2lyZV9mb3JtYXQuVUlOVDMyX01BWCwgNV0sCisgICAgICAgIF0KKyAgICBmb3IgYXJncyBpbiBOVU1FUklDX0FSR1M6CisgICAgICBzZWxmLk51bWVyaWNCeXRlU2l6ZVRlc3RIZWxwZXIoKmFyZ3MpCisKKyAgICAjIFRlc3Qgc3RyaW5ncyBhbmQgYnl0ZXMuCisgICAgZm9yIGJ5dGVfc2l6ZV9mbiBpbiAod2lyZV9mb3JtYXQuU3RyaW5nQnl0ZVNpemUsIHdpcmVfZm9ybWF0LkJ5dGVzQnl0ZVNpemUpOgorICAgICAgIyAxIGJ5dGUgZm9yIHRhZywgMSBieXRlIGZvciBsZW5ndGgsIDMgYnl0ZXMgZm9yIGNvbnRlbnRzLgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBieXRlX3NpemVfZm4oMTAsICdhYmMnKSkKKyAgICAgICMgMiBieXRlcyBmb3IgdGFnLCAxIGJ5dGUgZm9yIGxlbmd0aCwgMyBieXRlcyBmb3IgY29udGVudHMuCisgICAgICBzZWxmLmFzc2VydEVxdWFsKDYsIGJ5dGVfc2l6ZV9mbigxNiwgJ2FiYycpKQorICAgICAgIyAyIGJ5dGVzIGZvciB0YWcsIDIgYnl0ZXMgZm9yIGxlbmd0aCwgMTI4IGJ5dGVzIGZvciBjb250ZW50cy4KKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTMyLCBieXRlX3NpemVfZm4oMTYsICdhJyAqIDEyOCkpCisKKyAgICAjIFRlc3QgVVRGLTggc3RyaW5nIGJ5dGUgc2l6ZSBjYWxjdWxhdGlvbi4KKyAgICAjIDEgYnl0ZSBmb3IgdGFnLCAxIGJ5dGUgZm9yIGxlbmd0aCwgOCBieXRlcyBmb3IgY29udGVudC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDEwLCB3aXJlX2Zvcm1hdC5TdHJpbmdCeXRlU2l6ZSgKKyAgICAgICAgNSwgYidceGQwXHhhMlx4ZDBceGI1XHhkMVx4ODFceGQxXHg4MicuZGVjb2RlKCd1dGYtOCcpKSkKKworICAgIGNsYXNzIE1vY2tNZXNzYWdlKG9iamVjdCk6CisgICAgICBkZWYgX19pbml0X18oc2VsZiwgYnl0ZV9zaXplKToKKyAgICAgICAgc2VsZi5ieXRlX3NpemUgPSBieXRlX3NpemUKKyAgICAgIGRlZiBCeXRlU2l6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYnl0ZV9zaXplCisKKyAgICBtZXNzYWdlX2J5dGVfc2l6ZSA9IDEwCisgICAgbW9ja19tZXNzYWdlID0gTW9ja01lc3NhZ2UoYnl0ZV9zaXplPW1lc3NhZ2VfYnl0ZV9zaXplKQorICAgICMgVGVzdCBncm91cHMuCisgICAgIyAoMiAqIDEpIGJ5dGVzIGZvciBiZWdpbiBhbmQgZW5kIHRhZ3MsIHBsdXMgbWVzc2FnZV9ieXRlX3NpemUuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyICsgbWVzc2FnZV9ieXRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5Hcm91cEJ5dGVTaXplKDEsIG1vY2tfbWVzc2FnZSkpCisgICAgIyAoMiAqIDIpIGJ5dGVzIGZvciBiZWdpbiBhbmQgZW5kIHRhZ3MsIHBsdXMgbWVzc2FnZV9ieXRlX3NpemUuCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0ICsgbWVzc2FnZV9ieXRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5Hcm91cEJ5dGVTaXplKDE2LCBtb2NrX21lc3NhZ2UpKQorCisgICAgIyBUZXN0IG1lc3NhZ2VzLgorICAgICMgMSBieXRlIGZvciB0YWcsIHBsdXMgMSBieXRlIGZvciBsZW5ndGgsIHBsdXMgY29udGVudHMuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyICsgbW9ja19tZXNzYWdlLmJ5dGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0Lk1lc3NhZ2VCeXRlU2l6ZSgxLCBtb2NrX21lc3NhZ2UpKQorICAgICMgMiBieXRlcyBmb3IgdGFnLCBwbHVzIDEgYnl0ZSBmb3IgbGVuZ3RoLCBwbHVzIGNvbnRlbnRzLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMyArIG1vY2tfbWVzc2FnZS5ieXRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5NZXNzYWdlQnl0ZVNpemUoMTYsIG1vY2tfbWVzc2FnZSkpCisgICAgIyAyIGJ5dGVzIGZvciB0YWcsIHBsdXMgMiBieXRlcyBmb3IgbGVuZ3RoLCBwbHVzIGNvbnRlbnRzLgorICAgIG1vY2tfbWVzc2FnZS5ieXRlX3NpemUgPSAxMjgKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQgKyBtb2NrX21lc3NhZ2UuYnl0ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuTWVzc2FnZUJ5dGVTaXplKDE2LCBtb2NrX21lc3NhZ2UpKQorCisKKyAgICAjIFRlc3QgbWVzc2FnZSBzZXQgaXRlbSBieXRlIHNpemUuCisgICAgIyA0IGJ5dGVzIGZvciB0YWdzLCBwbHVzIDEgYnl0ZSBmb3IgbGVuZ3RoLCBwbHVzIDEgYnl0ZSBmb3IgdHlwZV9pZCwKKyAgICAjIHBsdXMgY29udGVudHMuCisgICAgbW9ja19tZXNzYWdlLmJ5dGVfc2l6ZSA9IDEwCisgICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrX21lc3NhZ2UuYnl0ZV9zaXplICsgNiwKKyAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0Lk1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoMSwgbW9ja19tZXNzYWdlKSkKKworICAgICMgNCBieXRlcyBmb3IgdGFncywgcGx1cyAyIGJ5dGVzIGZvciBsZW5ndGgsIHBsdXMgMSBieXRlIGZvciB0eXBlX2lkLAorICAgICMgcGx1cyBjb250ZW50cy4KKyAgICBtb2NrX21lc3NhZ2UuYnl0ZV9zaXplID0gMTI4CisgICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrX21lc3NhZ2UuYnl0ZV9zaXplICsgNywKKyAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0Lk1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoMSwgbW9ja19tZXNzYWdlKSkKKworICAgICMgNCBieXRlcyBmb3IgdGFncywgcGx1cyAyIGJ5dGVzIGZvciBsZW5ndGgsIHBsdXMgMiBieXRlIGZvciB0eXBlX2lkLAorICAgICMgcGx1cyBjb250ZW50cy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKG1vY2tfbWVzc2FnZS5ieXRlX3NpemUgKyA4LAorICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuTWVzc2FnZVNldEl0ZW1CeXRlU2l6ZSgxMjgsIG1vY2tfbWVzc2FnZSkpCisKKyAgICAjIFRvby1sb25nIHZhcmludC4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhtZXNzYWdlLkVuY29kZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LlVJbnQ2NEJ5dGVTaXplLCAxLCAxIDw8IDEyOCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvanNvbl9mb3JtYXQucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2pzb25fZm9ybWF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMjRlZDgKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2pzb25fZm9ybWF0LnB5CkBAIC0wLDAgKzEsOTEyIEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkNvbnRhaW5zIHJvdXRpbmVzIGZvciBwcmludGluZyBwcm90b2NvbCBtZXNzYWdlcyBpbiBKU09OIGZvcm1hdC4KKworU2ltcGxlIHVzYWdlIGV4YW1wbGU6CisKKyAgIyBDcmVhdGUgYSBwcm90byBvYmplY3QgYW5kIHNlcmlhbGl6ZSBpdCB0byBhIGpzb24gZm9ybWF0IHN0cmluZy4KKyAgbWVzc2FnZSA9IG15X3Byb3RvX3BiMi5NeU1lc3NhZ2UoZm9vPSdiYXInKQorICBqc29uX3N0cmluZyA9IGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSkKKworICAjIFBhcnNlIGEganNvbiBmb3JtYXQgc3RyaW5nIHRvIHByb3RvIG9iamVjdC4KKyAgbWVzc2FnZSA9IGpzb25fZm9ybWF0LlBhcnNlKGpzb25fc3RyaW5nLCBteV9wcm90b19wYjIuTXlNZXNzYWdlKCkpCisiIiIKKworX19hdXRob3JfXyA9ICdqaWVsdW9AZ29vZ2xlLmNvbSAoSmllIEx1byknCisKKworaW1wb3J0IGJhc2U2NAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKK2ltcG9ydCBqc29uCitpbXBvcnQgbWF0aAorZnJvbSBvcGVyYXRvciBpbXBvcnQgbWV0aG9kY2FsbGVyCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHR5cGVfY2hlY2tlcnMKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc3ltYm9sX2RhdGFiYXNlCisKKworX1RJTUVTVEFNUEZPTUFUID0gJyVZLSVtLSVkVCVIOiVNOiVTJworX0lOVF9UWVBFUyA9IGZyb3plbnNldChbZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9JTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfVUlOVDY0XSkKK19JTlQ2NF9UWVBFUyA9IGZyb3plbnNldChbZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9JTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9VSU5UNjRdKQorX0ZMT0FUX1RZUEVTID0gZnJvemVuc2V0KFtkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0ZMT0FULAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0RPVUJMRV0pCitfSU5GSU5JVFkgPSAnSW5maW5pdHknCitfTkVHX0lORklOSVRZID0gJy1JbmZpbml0eScKK19OQU4gPSAnTmFOJworCitfVU5QQUlSRURfU1VSUk9HQVRFX1BBVFRFUk4gPSByZS5jb21waWxlKAorICAgIHUnW1x1ZDgwMC1cdWRiZmZdKD8hW1x1ZGMwMC1cdWRmZmZdKXwoPzwhW1x1ZDgwMC1cdWRiZmZdKVtcdWRjMDAtXHVkZmZmXScpCisKK19WQUxJRF9FWFRFTlNJT05fTkFNRSA9IHJlLmNvbXBpbGUocidcW1thLXpBLVowLTlcLl9dKlxdJCcpCisKKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgIiIiVG9wLWxldmVsIG1vZHVsZSBlcnJvciBmb3IganNvbl9mb3JtYXQuIiIiCisKKworY2xhc3MgU2VyaWFsaXplVG9Kc29uRXJyb3IoRXJyb3IpOgorICAiIiJUaHJvd24gaWYgc2VyaWFsaXphdGlvbiB0byBKU09OIGZhaWxzLiIiIgorCisKK2NsYXNzIFBhcnNlRXJyb3IoRXJyb3IpOgorICAiIiJUaHJvd24gaW4gY2FzZSBvZiBwYXJzaW5nIGVycm9yLiIiIgorCisKK2RlZiBNZXNzYWdlVG9Kc29uKAorICAgIG1lc3NhZ2UsCisgICAgaW5jbHVkaW5nX2RlZmF1bHRfdmFsdWVfZmllbGRzPUZhbHNlLAorICAgIHByZXNlcnZpbmdfcHJvdG9fZmllbGRfbmFtZT1GYWxzZSwKKyAgICBpbmRlbnQ9MiwKKyAgICBzb3J0X2tleXM9RmFsc2UsCisgICAgdXNlX2ludGVnZXJzX2Zvcl9lbnVtcz1GYWxzZSwKKyAgICBkZXNjcmlwdG9yX3Bvb2w9Tm9uZSwKKyAgICBmbG9hdF9wcmVjaXNpb249Tm9uZSwKKyAgICBlbnN1cmVfYXNjaWk9VHJ1ZSk6CisgICIiIkNvbnZlcnRzIHByb3RvYnVmIG1lc3NhZ2UgdG8gSlNPTiBmb3JtYXQuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlOiBUaGUgcHJvdG9jb2wgYnVmZmVycyBtZXNzYWdlIGluc3RhbmNlIHRvIHNlcmlhbGl6ZS4KKyAgICBpbmNsdWRpbmdfZGVmYXVsdF92YWx1ZV9maWVsZHM6IElmIFRydWUsIHNpbmd1bGFyIHByaW1pdGl2ZSBmaWVsZHMsCisgICAgICAgIHJlcGVhdGVkIGZpZWxkcywgYW5kIG1hcCBmaWVsZHMgd2lsbCBhbHdheXMgYmUgc2VyaWFsaXplZC4gIElmCisgICAgICAgIEZhbHNlLCBvbmx5IHNlcmlhbGl6ZSBub24tZW1wdHkgZmllbGRzLiAgU2luZ3VsYXIgbWVzc2FnZSBmaWVsZHMKKyAgICAgICAgYW5kIG9uZW9mIGZpZWxkcyBhcmUgbm90IGFmZmVjdGVkIGJ5IHRoaXMgb3B0aW9uLgorICAgIHByZXNlcnZpbmdfcHJvdG9fZmllbGRfbmFtZTogSWYgVHJ1ZSwgdXNlIHRoZSBvcmlnaW5hbCBwcm90byBmaWVsZAorICAgICAgICBuYW1lcyBhcyBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4gSWYgRmFsc2UsIGNvbnZlcnQgdGhlIGZpZWxkCisgICAgICAgIG5hbWVzIHRvIGxvd2VyQ2FtZWxDYXNlLgorICAgIGluZGVudDogVGhlIEpTT04gb2JqZWN0IHdpbGwgYmUgcHJldHR5LXByaW50ZWQgd2l0aCB0aGlzIGluZGVudCBsZXZlbC4KKyAgICAgICAgQW4gaW5kZW50IGxldmVsIG9mIDAgb3IgbmVnYXRpdmUgd2lsbCBvbmx5IGluc2VydCBuZXdsaW5lcy4KKyAgICBzb3J0X2tleXM6IElmIFRydWUsIHRoZW4gdGhlIG91dHB1dCB3aWxsIGJlIHNvcnRlZCBieSBmaWVsZCBuYW1lcy4KKyAgICB1c2VfaW50ZWdlcnNfZm9yX2VudW1zOiBJZiB0cnVlLCBwcmludCBpbnRlZ2VycyBpbnN0ZWFkIG9mIGVudW0gbmFtZXMuCisgICAgZGVzY3JpcHRvcl9wb29sOiBBIERlc2NyaXB0b3IgUG9vbCBmb3IgcmVzb2x2aW5nIHR5cGVzLiBJZiBOb25lIHVzZSB0aGUKKyAgICAgICAgZGVmYXVsdC4KKyAgICBmbG9hdF9wcmVjaXNpb246IElmIHNldCwgdXNlIHRoaXMgdG8gc3BlY2lmeSBmbG9hdCBmaWVsZCB2YWxpZCBkaWdpdHMuCisgICAgZW5zdXJlX2FzY2lpOiBJZiBUcnVlLCBzdHJpbmdzIHdpdGggbm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQuCisgICAgICAgIElmIEZhbHNlLCBVbmljb2RlIHN0cmluZ3MgYXJlIHJldHVybmVkIHVuY2hhbmdlZC4KKworICBSZXR1cm5zOgorICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIEpTT04gZm9ybWF0dGVkIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlLgorICAiIiIKKyAgcHJpbnRlciA9IF9QcmludGVyKAorICAgICAgaW5jbHVkaW5nX2RlZmF1bHRfdmFsdWVfZmllbGRzLAorICAgICAgcHJlc2VydmluZ19wcm90b19maWVsZF9uYW1lLAorICAgICAgdXNlX2ludGVnZXJzX2Zvcl9lbnVtcywKKyAgICAgIGRlc2NyaXB0b3JfcG9vbCwKKyAgICAgIGZsb2F0X3ByZWNpc2lvbj1mbG9hdF9wcmVjaXNpb24pCisgIHJldHVybiBwcmludGVyLlRvSnNvblN0cmluZyhtZXNzYWdlLCBpbmRlbnQsIHNvcnRfa2V5cywgZW5zdXJlX2FzY2lpKQorCisKK2RlZiBNZXNzYWdlVG9EaWN0KAorICAgIG1lc3NhZ2UsCisgICAgaW5jbHVkaW5nX2RlZmF1bHRfdmFsdWVfZmllbGRzPUZhbHNlLAorICAgIHByZXNlcnZpbmdfcHJvdG9fZmllbGRfbmFtZT1GYWxzZSwKKyAgICB1c2VfaW50ZWdlcnNfZm9yX2VudW1zPUZhbHNlLAorICAgIGRlc2NyaXB0b3JfcG9vbD1Ob25lLAorICAgIGZsb2F0X3ByZWNpc2lvbj1Ob25lKToKKyAgIiIiQ29udmVydHMgcHJvdG9idWYgbWVzc2FnZSB0byBhIGRpY3Rpb25hcnkuCisKKyAgV2hlbiB0aGUgZGljdGlvbmFyeSBpcyBlbmNvZGVkIHRvIEpTT04sIGl0IGNvbmZvcm1zIHRvIHByb3RvMyBKU09OIHNwZWMuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlOiBUaGUgcHJvdG9jb2wgYnVmZmVycyBtZXNzYWdlIGluc3RhbmNlIHRvIHNlcmlhbGl6ZS4KKyAgICBpbmNsdWRpbmdfZGVmYXVsdF92YWx1ZV9maWVsZHM6IElmIFRydWUsIHNpbmd1bGFyIHByaW1pdGl2ZSBmaWVsZHMsCisgICAgICAgIHJlcGVhdGVkIGZpZWxkcywgYW5kIG1hcCBmaWVsZHMgd2lsbCBhbHdheXMgYmUgc2VyaWFsaXplZC4gIElmCisgICAgICAgIEZhbHNlLCBvbmx5IHNlcmlhbGl6ZSBub24tZW1wdHkgZmllbGRzLiAgU2luZ3VsYXIgbWVzc2FnZSBmaWVsZHMKKyAgICAgICAgYW5kIG9uZW9mIGZpZWxkcyBhcmUgbm90IGFmZmVjdGVkIGJ5IHRoaXMgb3B0aW9uLgorICAgIHByZXNlcnZpbmdfcHJvdG9fZmllbGRfbmFtZTogSWYgVHJ1ZSwgdXNlIHRoZSBvcmlnaW5hbCBwcm90byBmaWVsZAorICAgICAgICBuYW1lcyBhcyBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4gSWYgRmFsc2UsIGNvbnZlcnQgdGhlIGZpZWxkCisgICAgICAgIG5hbWVzIHRvIGxvd2VyQ2FtZWxDYXNlLgorICAgIHVzZV9pbnRlZ2Vyc19mb3JfZW51bXM6IElmIHRydWUsIHByaW50IGludGVnZXJzIGluc3RlYWQgb2YgZW51bSBuYW1lcy4KKyAgICBkZXNjcmlwdG9yX3Bvb2w6IEEgRGVzY3JpcHRvciBQb29sIGZvciByZXNvbHZpbmcgdHlwZXMuIElmIE5vbmUgdXNlIHRoZQorICAgICAgICBkZWZhdWx0LgorICAgIGZsb2F0X3ByZWNpc2lvbjogSWYgc2V0LCB1c2UgdGhpcyB0byBzcGVjaWZ5IGZsb2F0IGZpZWxkIHZhbGlkIGRpZ2l0cy4KKworICBSZXR1cm5zOgorICAgIEEgZGljdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdG9jb2wgYnVmZmVyIG1lc3NhZ2UuCisgICIiIgorICBwcmludGVyID0gX1ByaW50ZXIoCisgICAgICBpbmNsdWRpbmdfZGVmYXVsdF92YWx1ZV9maWVsZHMsCisgICAgICBwcmVzZXJ2aW5nX3Byb3RvX2ZpZWxkX25hbWUsCisgICAgICB1c2VfaW50ZWdlcnNfZm9yX2VudW1zLAorICAgICAgZGVzY3JpcHRvcl9wb29sLAorICAgICAgZmxvYXRfcHJlY2lzaW9uPWZsb2F0X3ByZWNpc2lvbikKKyAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICByZXR1cm4gcHJpbnRlci5fTWVzc2FnZVRvSnNvbk9iamVjdChtZXNzYWdlKQorCisKK2RlZiBfSXNNYXBFbnRyeShmaWVsZCk6CisgIHJldHVybiAoZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0UgYW5kCisgICAgICAgICAgZmllbGQubWVzc2FnZV90eXBlLmhhc19vcHRpb25zIGFuZAorICAgICAgICAgIGZpZWxkLm1lc3NhZ2VfdHlwZS5HZXRPcHRpb25zKCkubWFwX2VudHJ5KQorCisKK2NsYXNzIF9QcmludGVyKG9iamVjdCk6CisgICIiIkpTT04gZm9ybWF0IHByaW50ZXIgZm9yIHByb3RvY29sIG1lc3NhZ2UuIiIiCisKKyAgZGVmIF9faW5pdF9fKAorICAgICAgc2VsZiwKKyAgICAgIGluY2x1ZGluZ19kZWZhdWx0X3ZhbHVlX2ZpZWxkcz1GYWxzZSwKKyAgICAgIHByZXNlcnZpbmdfcHJvdG9fZmllbGRfbmFtZT1GYWxzZSwKKyAgICAgIHVzZV9pbnRlZ2Vyc19mb3JfZW51bXM9RmFsc2UsCisgICAgICBkZXNjcmlwdG9yX3Bvb2w9Tm9uZSwKKyAgICAgIGZsb2F0X3ByZWNpc2lvbj1Ob25lKToKKyAgICBzZWxmLmluY2x1ZGluZ19kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IGluY2x1ZGluZ19kZWZhdWx0X3ZhbHVlX2ZpZWxkcworICAgIHNlbGYucHJlc2VydmluZ19wcm90b19maWVsZF9uYW1lID0gcHJlc2VydmluZ19wcm90b19maWVsZF9uYW1lCisgICAgc2VsZi51c2VfaW50ZWdlcnNfZm9yX2VudW1zID0gdXNlX2ludGVnZXJzX2Zvcl9lbnVtcworICAgIHNlbGYuZGVzY3JpcHRvcl9wb29sID0gZGVzY3JpcHRvcl9wb29sCisgICAgaWYgZmxvYXRfcHJlY2lzaW9uOgorICAgICAgc2VsZi5mbG9hdF9mb3JtYXQgPSAnLnt9ZycuZm9ybWF0KGZsb2F0X3ByZWNpc2lvbikKKyAgICBlbHNlOgorICAgICAgc2VsZi5mbG9hdF9mb3JtYXQgPSBOb25lCisKKyAgZGVmIFRvSnNvblN0cmluZyhzZWxmLCBtZXNzYWdlLCBpbmRlbnQsIHNvcnRfa2V5cywgZW5zdXJlX2FzY2lpKToKKyAgICBqcyA9IHNlbGYuX01lc3NhZ2VUb0pzb25PYmplY3QobWVzc2FnZSkKKyAgICByZXR1cm4ganNvbi5kdW1wcygKKyAgICAgICAganMsIGluZGVudD1pbmRlbnQsIHNvcnRfa2V5cz1zb3J0X2tleXMsIGVuc3VyZV9hc2NpaT1lbnN1cmVfYXNjaWkpCisKKyAgZGVmIF9NZXNzYWdlVG9Kc29uT2JqZWN0KHNlbGYsIG1lc3NhZ2UpOgorICAgICIiIkNvbnZlcnRzIG1lc3NhZ2UgdG8gYW4gb2JqZWN0IGFjY29yZGluZyB0byBQcm90bzMgSlNPTiBTcGVjaWZpY2F0aW9uLiIiIgorICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9IG1lc3NhZ2UuREVTQ1JJUFRPUgorICAgIGZ1bGxfbmFtZSA9IG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUKKyAgICBpZiBfSXNXcmFwcGVyTWVzc2FnZShtZXNzYWdlX2Rlc2NyaXB0b3IpOgorICAgICAgcmV0dXJuIHNlbGYuX1dyYXBwZXJNZXNzYWdlVG9Kc29uT2JqZWN0KG1lc3NhZ2UpCisgICAgaWYgZnVsbF9uYW1lIGluIF9XS1RKU09OTUVUSE9EUzoKKyAgICAgIHJldHVybiBtZXRob2RjYWxsZXIoX1dLVEpTT05NRVRIT0RTW2Z1bGxfbmFtZV1bMF0sIG1lc3NhZ2UpKHNlbGYpCisgICAganMgPSB7fQorICAgIHJldHVybiBzZWxmLl9SZWd1bGFyTWVzc2FnZVRvSnNvbk9iamVjdChtZXNzYWdlLCBqcykKKworICBkZWYgX1JlZ3VsYXJNZXNzYWdlVG9Kc29uT2JqZWN0KHNlbGYsIG1lc3NhZ2UsIGpzKToKKyAgICAiIiJDb252ZXJ0cyBub3JtYWwgbWVzc2FnZSBhY2NvcmRpbmcgdG8gUHJvdG8zIEpTT04gU3BlY2lmaWNhdGlvbi4iIiIKKyAgICBmaWVsZHMgPSBtZXNzYWdlLkxpc3RGaWVsZHMoKQorCisgICAgdHJ5OgorICAgICAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBmaWVsZHM6CisgICAgICAgIGlmIHNlbGYucHJlc2VydmluZ19wcm90b19maWVsZF9uYW1lOgorICAgICAgICAgIG5hbWUgPSBmaWVsZC5uYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgbmFtZSA9IGZpZWxkLmpzb25fbmFtZQorICAgICAgICBpZiBfSXNNYXBFbnRyeShmaWVsZCk6CisgICAgICAgICAgIyBDb252ZXJ0IGEgbWFwIGZpZWxkLgorICAgICAgICAgIHZfZmllbGQgPSBmaWVsZC5tZXNzYWdlX3R5cGUuZmllbGRzX2J5X25hbWVbJ3ZhbHVlJ10KKyAgICAgICAgICBqc19tYXAgPSB7fQorICAgICAgICAgIGZvciBrZXkgaW4gdmFsdWU6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgYm9vbCk6CisgICAgICAgICAgICAgIGlmIGtleToKKyAgICAgICAgICAgICAgICByZWNvcmRlZF9rZXkgPSAndHJ1ZScKKyAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZWNvcmRlZF9rZXkgPSAnZmFsc2UnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICByZWNvcmRlZF9rZXkgPSBzdHIoa2V5KQorICAgICAgICAgICAganNfbWFwW3JlY29yZGVkX2tleV0gPSBzZWxmLl9GaWVsZFRvSnNvbk9iamVjdCgKKyAgICAgICAgICAgICAgICB2X2ZpZWxkLCB2YWx1ZVtrZXldKQorICAgICAgICAgIGpzW25hbWVdID0ganNfbWFwCisgICAgICAgIGVsaWYgZmllbGQubGFiZWwgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICAgICAgIyBDb252ZXJ0IGEgcmVwZWF0ZWQgZmllbGQuCisgICAgICAgICAganNbbmFtZV0gPSBbc2VsZi5fRmllbGRUb0pzb25PYmplY3QoZmllbGQsIGspCisgICAgICAgICAgICAgICAgICAgICAgZm9yIGsgaW4gdmFsdWVdCisgICAgICAgIGVsaWYgZmllbGQuaXNfZXh0ZW5zaW9uOgorICAgICAgICAgIG5hbWUgPSAnWyVzXScgJSBmaWVsZC5mdWxsX25hbWUKKyAgICAgICAgICBqc1tuYW1lXSA9IHNlbGYuX0ZpZWxkVG9Kc29uT2JqZWN0KGZpZWxkLCB2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBqc1tuYW1lXSA9IHNlbGYuX0ZpZWxkVG9Kc29uT2JqZWN0KGZpZWxkLCB2YWx1ZSkKKworICAgICAgIyBTZXJpYWxpemUgZGVmYXVsdCB2YWx1ZSBpZiBpbmNsdWRpbmdfZGVmYXVsdF92YWx1ZV9maWVsZHMgaXMgVHJ1ZS4KKyAgICAgIGlmIHNlbGYuaW5jbHVkaW5nX2RlZmF1bHRfdmFsdWVfZmllbGRzOgorICAgICAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSBtZXNzYWdlLkRFU0NSSVBUT1IKKyAgICAgICAgZm9yIGZpZWxkIGluIG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHM6CisgICAgICAgICAgIyBTaW5ndWxhciBtZXNzYWdlIGZpZWxkcyBhbmQgb25lb2YgZmllbGRzIHdpbGwgbm90IGJlIGFmZmVjdGVkLgorICAgICAgICAgIGlmICgoZmllbGQubGFiZWwgIT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQgYW5kCisgICAgICAgICAgICAgICBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0UpIG9yCisgICAgICAgICAgICAgIGZpZWxkLmNvbnRhaW5pbmdfb25lb2YpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICBpZiBzZWxmLnByZXNlcnZpbmdfcHJvdG9fZmllbGRfbmFtZToKKyAgICAgICAgICAgIG5hbWUgPSBmaWVsZC5uYW1lCisgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWUgPSBmaWVsZC5qc29uX25hbWUKKyAgICAgICAgICBpZiBuYW1lIGluIGpzOgorICAgICAgICAgICAgIyBTa2lwIHRoZSBmaWVsZCB3aGljaCBoYXMgYmVlbiBzZXJpYWxpemVkIGFscmVhZHkuCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgIGlmIF9Jc01hcEVudHJ5KGZpZWxkKToKKyAgICAgICAgICAgIGpzW25hbWVdID0ge30KKyAgICAgICAgICBlbGlmIGZpZWxkLmxhYmVsID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgorICAgICAgICAgICAganNbbmFtZV0gPSBbXQorICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICBqc1tuYW1lXSA9IHNlbGYuX0ZpZWxkVG9Kc29uT2JqZWN0KGZpZWxkLCBmaWVsZC5kZWZhdWx0X3ZhbHVlKQorCisgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKKyAgICAgIHJhaXNlIFNlcmlhbGl6ZVRvSnNvbkVycm9yKAorICAgICAgICAgICdGYWlsZWQgdG8gc2VyaWFsaXplIHswfSBmaWVsZDogezF9LicuZm9ybWF0KGZpZWxkLm5hbWUsIGUpKQorCisgICAgcmV0dXJuIGpzCisKKyAgZGVmIF9GaWVsZFRvSnNvbk9iamVjdChzZWxmLCBmaWVsZCwgdmFsdWUpOgorICAgICIiIkNvbnZlcnRzIGZpZWxkIHZhbHVlIGFjY29yZGluZyB0byBQcm90bzMgSlNPTiBTcGVjaWZpY2F0aW9uLiIiIgorICAgIGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiBzZWxmLl9NZXNzYWdlVG9Kc29uT2JqZWN0KHZhbHVlKQorICAgIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9FTlVNOgorICAgICAgaWYgc2VsZi51c2VfaW50ZWdlcnNfZm9yX2VudW1zOgorICAgICAgICByZXR1cm4gdmFsdWUKKyAgICAgIGlmIGZpZWxkLmVudW1fdHlwZS5mdWxsX25hbWUgPT0gJ2dvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUnOgorICAgICAgICByZXR1cm4gTm9uZQorICAgICAgZW51bV92YWx1ZSA9IGZpZWxkLmVudW1fdHlwZS52YWx1ZXNfYnlfbnVtYmVyLmdldCh2YWx1ZSwgTm9uZSkKKyAgICAgIGlmIGVudW1fdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBlbnVtX3ZhbHVlLm5hbWUKKyAgICAgIGVsc2U6CisgICAgICAgIGlmIGZpZWxkLmZpbGUuc3ludGF4ID09ICdwcm90bzMnOgorICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICByYWlzZSBTZXJpYWxpemVUb0pzb25FcnJvcignRW51bSBmaWVsZCBjb250YWlucyBhbiBpbnRlZ2VyIHZhbHVlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doaWNoIGNhbiBub3QgbWFwcGVkIHRvIGFuIGVudW0gdmFsdWUuJykKKyAgICBlbGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfU1RSSU5HOgorICAgICAgaWYgZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOgorICAgICAgICAjIFVzZSBiYXNlNjQgRGF0YSBlbmNvZGluZyBmb3IgYnl0ZXMKKyAgICAgICAgcmV0dXJuIGJhc2U2NC5iNjRlbmNvZGUodmFsdWUpLmRlY29kZSgndXRmLTgnKQorICAgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gYm9vbCh2YWx1ZSkKKyAgICBlbGlmIGZpZWxkLmNwcF90eXBlIGluIF9JTlQ2NF9UWVBFUzoKKyAgICAgIHJldHVybiBzdHIodmFsdWUpCisgICAgZWxpZiBmaWVsZC5jcHBfdHlwZSBpbiBfRkxPQVRfVFlQRVM6CisgICAgICBpZiBtYXRoLmlzaW5mKHZhbHVlKToKKyAgICAgICAgaWYgdmFsdWUgPCAwLjA6CisgICAgICAgICAgcmV0dXJuIF9ORUdfSU5GSU5JVFkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICByZXR1cm4gX0lORklOSVRZCisgICAgICBpZiBtYXRoLmlzbmFuKHZhbHVlKToKKyAgICAgICAgcmV0dXJuIF9OQU4KKyAgICAgIGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfRkxPQVQ6CisgICAgICAgIGlmIHNlbGYuZmxvYXRfZm9ybWF0OgorICAgICAgICAgIHJldHVybiBmbG9hdChmb3JtYXQodmFsdWUsIHNlbGYuZmxvYXRfZm9ybWF0KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICByZXR1cm4gdHlwZV9jaGVja2Vycy5Ub1Nob3J0ZXN0RmxvYXQodmFsdWUpCisKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX0FueU1lc3NhZ2VUb0pzb25PYmplY3Qoc2VsZiwgbWVzc2FnZSk6CisgICAgIiIiQ29udmVydHMgQW55IG1lc3NhZ2UgYWNjb3JkaW5nIHRvIFByb3RvMyBKU09OIFNwZWNpZmljYXRpb24uIiIiCisgICAgaWYgbm90IG1lc3NhZ2UuTGlzdEZpZWxkcygpOgorICAgICAgcmV0dXJuIHt9CisgICAgIyBNdXN0IHByaW50IEB0eXBlIGZpcnN0LCB1c2UgT3JkZXJlZERpY3QgaW5zdGVhZCBvZiB7fQorICAgIGpzID0gT3JkZXJlZERpY3QoKQorICAgIHR5cGVfdXJsID0gbWVzc2FnZS50eXBlX3VybAorICAgIGpzWydAdHlwZSddID0gdHlwZV91cmwKKyAgICBzdWJfbWVzc2FnZSA9IF9DcmVhdGVNZXNzYWdlRnJvbVR5cGVVcmwodHlwZV91cmwsIHNlbGYuZGVzY3JpcHRvcl9wb29sKQorICAgIHN1Yl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLnZhbHVlKQorICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9IHN1Yl9tZXNzYWdlLkRFU0NSSVBUT1IKKyAgICBmdWxsX25hbWUgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuZnVsbF9uYW1lCisgICAgaWYgX0lzV3JhcHBlck1lc3NhZ2UobWVzc2FnZV9kZXNjcmlwdG9yKToKKyAgICAgIGpzWyd2YWx1ZSddID0gc2VsZi5fV3JhcHBlck1lc3NhZ2VUb0pzb25PYmplY3Qoc3ViX21lc3NhZ2UpCisgICAgICByZXR1cm4ganMKKyAgICBpZiBmdWxsX25hbWUgaW4gX1dLVEpTT05NRVRIT0RTOgorICAgICAganNbJ3ZhbHVlJ10gPSBtZXRob2RjYWxsZXIoX1dLVEpTT05NRVRIT0RTW2Z1bGxfbmFtZV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfbWVzc2FnZSkoc2VsZikKKyAgICAgIHJldHVybiBqcworICAgIHJldHVybiBzZWxmLl9SZWd1bGFyTWVzc2FnZVRvSnNvbk9iamVjdChzdWJfbWVzc2FnZSwganMpCisKKyAgZGVmIF9HZW5lcmljTWVzc2FnZVRvSnNvbk9iamVjdChzZWxmLCBtZXNzYWdlKToKKyAgICAiIiJDb252ZXJ0cyBtZXNzYWdlIGFjY29yZGluZyB0byBQcm90bzMgSlNPTiBTcGVjaWZpY2F0aW9uLiIiIgorICAgICMgRHVyYXRpb24sIFRpbWVzdGFtcCBhbmQgRmllbGRNYXNrIGhhdmUgVG9Kc29uU3RyaW5nIG1ldGhvZCB0byBkbyB0aGUKKyAgICAjIGNvbnZlcnQuIFVzZXJzIGNhbiBhbHNvIGNhbGwgdGhlIG1ldGhvZCBkaXJlY3RseS4KKyAgICByZXR1cm4gbWVzc2FnZS5Ub0pzb25TdHJpbmcoKQorCisgIGRlZiBfVmFsdWVNZXNzYWdlVG9Kc29uT2JqZWN0KHNlbGYsIG1lc3NhZ2UpOgorICAgICIiIkNvbnZlcnRzIFZhbHVlIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIFByb3RvMyBKU09OIFNwZWNpZmljYXRpb24uIiIiCisgICAgd2hpY2ggPSBtZXNzYWdlLldoaWNoT25lb2YoJ2tpbmQnKQorICAgICMgSWYgdGhlIFZhbHVlIG1lc3NhZ2UgaXMgbm90IHNldCB0cmVhdCBhcyBudWxsX3ZhbHVlIHdoZW4gc2VyaWFsaXplCisgICAgIyB0byBKU09OLiBUaGUgcGFyc2UgYmFjayByZXN1bHQgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSBvcmlnaW5hbCBtZXNzYWdlLgorICAgIGlmIHdoaWNoIGlzIE5vbmUgb3Igd2hpY2ggPT0gJ251bGxfdmFsdWUnOgorICAgICAgcmV0dXJuIE5vbmUKKyAgICBpZiB3aGljaCA9PSAnbGlzdF92YWx1ZSc6CisgICAgICByZXR1cm4gc2VsZi5fTGlzdFZhbHVlTWVzc2FnZVRvSnNvbk9iamVjdChtZXNzYWdlLmxpc3RfdmFsdWUpCisgICAgaWYgd2hpY2ggPT0gJ3N0cnVjdF92YWx1ZSc6CisgICAgICB2YWx1ZSA9IG1lc3NhZ2Uuc3RydWN0X3ZhbHVlCisgICAgZWxzZToKKyAgICAgIHZhbHVlID0gZ2V0YXR0cihtZXNzYWdlLCB3aGljaCkKKyAgICBvbmVvZl9kZXNjcmlwdG9yID0gbWVzc2FnZS5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lW3doaWNoXQorICAgIHJldHVybiBzZWxmLl9GaWVsZFRvSnNvbk9iamVjdChvbmVvZl9kZXNjcmlwdG9yLCB2YWx1ZSkKKworICBkZWYgX0xpc3RWYWx1ZU1lc3NhZ2VUb0pzb25PYmplY3Qoc2VsZiwgbWVzc2FnZSk6CisgICAgIiIiQ29udmVydHMgTGlzdFZhbHVlIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIFByb3RvMyBKU09OIFNwZWNpZmljYXRpb24uIiIiCisgICAgcmV0dXJuIFtzZWxmLl9WYWx1ZU1lc3NhZ2VUb0pzb25PYmplY3QodmFsdWUpCisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gbWVzc2FnZS52YWx1ZXNdCisKKyAgZGVmIF9TdHJ1Y3RNZXNzYWdlVG9Kc29uT2JqZWN0KHNlbGYsIG1lc3NhZ2UpOgorICAgICIiIkNvbnZlcnRzIFN0cnVjdCBtZXNzYWdlIGFjY29yZGluZyB0byBQcm90bzMgSlNPTiBTcGVjaWZpY2F0aW9uLiIiIgorICAgIGZpZWxkcyA9IG1lc3NhZ2UuZmllbGRzCisgICAgcmV0ID0ge30KKyAgICBmb3Iga2V5IGluIGZpZWxkczoKKyAgICAgIHJldFtrZXldID0gc2VsZi5fVmFsdWVNZXNzYWdlVG9Kc29uT2JqZWN0KGZpZWxkc1trZXldKQorICAgIHJldHVybiByZXQKKworICBkZWYgX1dyYXBwZXJNZXNzYWdlVG9Kc29uT2JqZWN0KHNlbGYsIG1lc3NhZ2UpOgorICAgIHJldHVybiBzZWxmLl9GaWVsZFRvSnNvbk9iamVjdCgKKyAgICAgICAgbWVzc2FnZS5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddLCBtZXNzYWdlLnZhbHVlKQorCisKK2RlZiBfSXNXcmFwcGVyTWVzc2FnZShtZXNzYWdlX2Rlc2NyaXB0b3IpOgorICByZXR1cm4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpbGUubmFtZSA9PSAnZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvJworCisKK2RlZiBfRHVwbGljYXRlQ2hlY2tlcihqcyk6CisgIHJlc3VsdCA9IHt9CisgIGZvciBuYW1lLCB2YWx1ZSBpbiBqczoKKyAgICBpZiBuYW1lIGluIHJlc3VsdDoKKyAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIEpTT046IGR1cGxpY2F0ZSBrZXkgezB9LicuZm9ybWF0KG5hbWUpKQorICAgIHJlc3VsdFtuYW1lXSA9IHZhbHVlCisgIHJldHVybiByZXN1bHQKKworCitkZWYgX0NyZWF0ZU1lc3NhZ2VGcm9tVHlwZVVybCh0eXBlX3VybCwgZGVzY3JpcHRvcl9wb29sKToKKyAgIiIiQ3JlYXRlcyBhIG1lc3NhZ2UgZnJvbSBhIHR5cGUgVVJMLiIiIgorICBkYiA9IHN5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkKKyAgcG9vbCA9IGRiLnBvb2wgaWYgZGVzY3JpcHRvcl9wb29sIGlzIE5vbmUgZWxzZSBkZXNjcmlwdG9yX3Bvb2wKKyAgdHlwZV9uYW1lID0gdHlwZV91cmwuc3BsaXQoJy8nKVstMV0KKyAgdHJ5OgorICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKHR5cGVfbmFtZSkKKyAgZXhjZXB0IEtleUVycm9yOgorICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgJ0NhbiBub3QgZmluZCBtZXNzYWdlIGRlc2NyaXB0b3IgYnkgdHlwZV91cmw6IHswfScuZm9ybWF0KHR5cGVfdXJsKSkKKyAgbWVzc2FnZV9jbGFzcyA9IGRiLkdldFByb3RvdHlwZShtZXNzYWdlX2Rlc2NyaXB0b3IpCisgIHJldHVybiBtZXNzYWdlX2NsYXNzKCkKKworCitkZWYgUGFyc2UodGV4dCwKKyAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgIGlnbm9yZV91bmtub3duX2ZpZWxkcz1GYWxzZSwKKyAgICAgICAgICBkZXNjcmlwdG9yX3Bvb2w9Tm9uZSwKKyAgICAgICAgICBtYXhfcmVjdXJzaW9uX2RlcHRoPTEwMCk6CisgICIiIlBhcnNlcyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYSBwcm90b2NvbCBtZXNzYWdlIGludG8gYSBtZXNzYWdlLgorCisgIEFyZ3M6CisgICAgdGV4dDogTWVzc2FnZSBKU09OIHJlcHJlc2VudGF0aW9uLgorICAgIG1lc3NhZ2U6IEEgcHJvdG9jb2wgYnVmZmVyIG1lc3NhZ2UgdG8gbWVyZ2UgaW50by4KKyAgICBpZ25vcmVfdW5rbm93bl9maWVsZHM6IElmIFRydWUsIGRvIG5vdCByYWlzZSBlcnJvcnMgZm9yIHVua25vd24gZmllbGRzLgorICAgIGRlc2NyaXB0b3JfcG9vbDogQSBEZXNjcmlwdG9yIFBvb2wgZm9yIHJlc29sdmluZyB0eXBlcy4gSWYgTm9uZSB1c2UgdGhlCisgICAgICBkZWZhdWx0LgorICAgIG1heF9yZWN1cnNpb25fZGVwdGg6IG1heCByZWN1cnNpb24gZGVwdGggb2YgSlNPTiBtZXNzYWdlIHRvIGJlCisgICAgICBkZXNlcmlhbGl6ZWQuIEpTT04gbWVzc2FnZXMgb3ZlciB0aGlzIGRlcHRoIHdpbGwgZmFpbCB0byBiZQorICAgICAgZGVzZXJpYWxpemVkLiBEZWZhdWx0IHZhbHVlIGlzIDEwMC4KKworICBSZXR1cm5zOgorICAgIFRoZSBzYW1lIG1lc3NhZ2UgcGFzc2VkIGFzIGFyZ3VtZW50LgorCisgIFJhaXNlczo6CisgICAgUGFyc2VFcnJvcjogT24gSlNPTiBwYXJzaW5nIHByb2JsZW1zLgorICAiIiIKKyAgaWYgbm90IGlzaW5zdGFuY2UodGV4dCwgc3RyKToKKyAgICB0ZXh0ID0gdGV4dC5kZWNvZGUoJ3V0Zi04JykKKyAgdHJ5OgorICAgIGpzID0ganNvbi5sb2Fkcyh0ZXh0LCBvYmplY3RfcGFpcnNfaG9vaz1fRHVwbGljYXRlQ2hlY2tlcikKKyAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKKyAgICByYWlzZSBQYXJzZUVycm9yKCdGYWlsZWQgdG8gbG9hZCBKU09OOiB7MH0uJy5mb3JtYXQoc3RyKGUpKSkKKyAgcmV0dXJuIFBhcnNlRGljdChqcywgbWVzc2FnZSwgaWdub3JlX3Vua25vd25fZmllbGRzLCBkZXNjcmlwdG9yX3Bvb2wsCisgICAgICAgICAgICAgICAgICAgbWF4X3JlY3Vyc2lvbl9kZXB0aCkKKworCitkZWYgUGFyc2VEaWN0KGpzX2RpY3QsCisgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgIGlnbm9yZV91bmtub3duX2ZpZWxkcz1GYWxzZSwKKyAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wb29sPU5vbmUsCisgICAgICAgICAgICAgIG1heF9yZWN1cnNpb25fZGVwdGg9MTAwKToKKyAgIiIiUGFyc2VzIGEgSlNPTiBkaWN0aW9uYXJ5IHJlcHJlc2VudGF0aW9uIGludG8gYSBtZXNzYWdlLgorCisgIEFyZ3M6CisgICAganNfZGljdDogRGljdCByZXByZXNlbnRhdGlvbiBvZiBhIEpTT04gbWVzc2FnZS4KKyAgICBtZXNzYWdlOiBBIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlIHRvIG1lcmdlIGludG8uCisgICAgaWdub3JlX3Vua25vd25fZmllbGRzOiBJZiBUcnVlLCBkbyBub3QgcmFpc2UgZXJyb3JzIGZvciB1bmtub3duIGZpZWxkcy4KKyAgICBkZXNjcmlwdG9yX3Bvb2w6IEEgRGVzY3JpcHRvciBQb29sIGZvciByZXNvbHZpbmcgdHlwZXMuIElmIE5vbmUgdXNlIHRoZQorICAgICAgZGVmYXVsdC4KKyAgICBtYXhfcmVjdXJzaW9uX2RlcHRoOiBtYXggcmVjdXJzaW9uIGRlcHRoIG9mIEpTT04gbWVzc2FnZSB0byBiZQorICAgICAgZGVzZXJpYWxpemVkLiBKU09OIG1lc3NhZ2VzIG92ZXIgdGhpcyBkZXB0aCB3aWxsIGZhaWwgdG8gYmUKKyAgICAgIGRlc2VyaWFsaXplZC4gRGVmYXVsdCB2YWx1ZSBpcyAxMDAuCisKKyAgUmV0dXJuczoKKyAgICBUaGUgc2FtZSBtZXNzYWdlIHBhc3NlZCBhcyBhcmd1bWVudC4KKyAgIiIiCisgIHBhcnNlciA9IF9QYXJzZXIoaWdub3JlX3Vua25vd25fZmllbGRzLCBkZXNjcmlwdG9yX3Bvb2wsIG1heF9yZWN1cnNpb25fZGVwdGgpCisgIHBhcnNlci5Db252ZXJ0TWVzc2FnZShqc19kaWN0LCBtZXNzYWdlLCAnJykKKyAgcmV0dXJuIG1lc3NhZ2UKKworCitfSU5UX09SX0ZMT0FUID0gKGludCwgZmxvYXQpCisKKworY2xhc3MgX1BhcnNlcihvYmplY3QpOgorICAiIiJKU09OIGZvcm1hdCBwYXJzZXIgZm9yIHByb3RvY29sIG1lc3NhZ2UuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGlnbm9yZV91bmtub3duX2ZpZWxkcywgZGVzY3JpcHRvcl9wb29sLAorICAgICAgICAgICAgICAgbWF4X3JlY3Vyc2lvbl9kZXB0aCk6CisgICAgc2VsZi5pZ25vcmVfdW5rbm93bl9maWVsZHMgPSBpZ25vcmVfdW5rbm93bl9maWVsZHMKKyAgICBzZWxmLmRlc2NyaXB0b3JfcG9vbCA9IGRlc2NyaXB0b3JfcG9vbAorICAgIHNlbGYubWF4X3JlY3Vyc2lvbl9kZXB0aCA9IG1heF9yZWN1cnNpb25fZGVwdGgKKyAgICBzZWxmLnJlY3Vyc2lvbl9kZXB0aCA9IDAKKworICBkZWYgQ29udmVydE1lc3NhZ2Uoc2VsZiwgdmFsdWUsIG1lc3NhZ2UsIHBhdGgpOgorICAgICIiIkNvbnZlcnQgYSBKU09OIG9iamVjdCBpbnRvIGEgbWVzc2FnZS4KKworICAgIEFyZ3M6CisgICAgICB2YWx1ZTogQSBKU09OIG9iamVjdC4KKyAgICAgIG1lc3NhZ2U6IEEgV0tUIG9yIHJlZ3VsYXIgcHJvdG9jb2wgbWVzc2FnZSB0byByZWNvcmQgdGhlIGRhdGEuCisgICAgICBwYXRoOiBwYXJlbnQgcGF0aCB0byBsb2cgcGFyc2UgZXJyb3IgaW5mby4KKworICAgIFJhaXNlczoKKyAgICAgIFBhcnNlRXJyb3I6IEluIGNhc2Ugb2YgY29udmVydCBwcm9ibGVtcy4KKyAgICAiIiIKKyAgICBzZWxmLnJlY3Vyc2lvbl9kZXB0aCArPSAxCisgICAgaWYgc2VsZi5yZWN1cnNpb25fZGVwdGggPiBzZWxmLm1heF9yZWN1cnNpb25fZGVwdGg6CisgICAgICByYWlzZSBQYXJzZUVycm9yKCdNZXNzYWdlIHRvbyBkZWVwLiBNYXggcmVjdXJzaW9uIGRlcHRoIGlzIHswfScuZm9ybWF0KAorICAgICAgICAgIHNlbGYubWF4X3JlY3Vyc2lvbl9kZXB0aCkpCisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID0gbWVzc2FnZS5ERVNDUklQVE9SCisgICAgZnVsbF9uYW1lID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZQorICAgIGlmIG5vdCBwYXRoOgorICAgICAgcGF0aCA9IG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lCisgICAgaWYgX0lzV3JhcHBlck1lc3NhZ2UobWVzc2FnZV9kZXNjcmlwdG9yKToKKyAgICAgIHNlbGYuX0NvbnZlcnRXcmFwcGVyTWVzc2FnZSh2YWx1ZSwgbWVzc2FnZSwgcGF0aCkKKyAgICBlbGlmIGZ1bGxfbmFtZSBpbiBfV0tUSlNPTk1FVEhPRFM6CisgICAgICBtZXRob2RjYWxsZXIoX1dLVEpTT05NRVRIT0RTW2Z1bGxfbmFtZV1bMV0sIHZhbHVlLCBtZXNzYWdlLCBwYXRoKShzZWxmKQorICAgIGVsc2U6CisgICAgICBzZWxmLl9Db252ZXJ0RmllbGRWYWx1ZVBhaXIodmFsdWUsIG1lc3NhZ2UsIHBhdGgpCisgICAgc2VsZi5yZWN1cnNpb25fZGVwdGggLT0gMQorCisgIGRlZiBfQ29udmVydEZpZWxkVmFsdWVQYWlyKHNlbGYsIGpzLCBtZXNzYWdlLCBwYXRoKToKKyAgICAiIiJDb252ZXJ0IGZpZWxkIHZhbHVlIHBhaXJzIGludG8gcmVndWxhciBtZXNzYWdlLgorCisgICAgQXJnczoKKyAgICAgIGpzOiBBIEpTT04gb2JqZWN0IHRvIGNvbnZlcnQgdGhlIGZpZWxkIHZhbHVlIHBhaXJzLgorICAgICAgbWVzc2FnZTogQSByZWd1bGFyIHByb3RvY29sIG1lc3NhZ2UgdG8gcmVjb3JkIHRoZSBkYXRhLgorICAgICAgcGF0aDogcGFyZW50IHBhdGggdG8gbG9nIHBhcnNlIGVycm9yIGluZm8uCisKKyAgICBSYWlzZXM6CisgICAgICBQYXJzZUVycm9yOiBJbiBjYXNlIG9mIHByb2JsZW1zIGNvbnZlcnRpbmcuCisgICAgIiIiCisgICAgbmFtZXMgPSBbXQorICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9IG1lc3NhZ2UuREVTQ1JJUFRPUgorICAgIGZpZWxkc19ieV9qc29uX25hbWUgPSBkaWN0KChmLmpzb25fbmFtZSwgZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzKQorICAgIGZvciBuYW1lIGluIGpzOgorICAgICAgdHJ5OgorICAgICAgICBmaWVsZCA9IGZpZWxkc19ieV9qc29uX25hbWUuZ2V0KG5hbWUsIE5vbmUpCisgICAgICAgIGlmIG5vdCBmaWVsZDoKKyAgICAgICAgICBmaWVsZCA9IG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZS5nZXQobmFtZSwgTm9uZSkKKyAgICAgICAgaWYgbm90IGZpZWxkIGFuZCBfVkFMSURfRVhURU5TSU9OX05BTUUubWF0Y2gobmFtZSk6CisgICAgICAgICAgaWYgbm90IG1lc3NhZ2VfZGVzY3JpcHRvci5pc19leHRlbmRhYmxlOgorICAgICAgICAgICAgcmFpc2UgUGFyc2VFcnJvcigKKyAgICAgICAgICAgICAgICAnTWVzc2FnZSB0eXBlIHswfSBkb2VzIG5vdCBoYXZlIGV4dGVuc2lvbnMgYXQgezF9Jy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUsIHBhdGgpKQorICAgICAgICAgIGlkZW50aWZpZXIgPSBuYW1lWzE6LTFdICAjIHN0cmlwIFtdIGJyYWNrZXRzCisgICAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgICAgIGZpZWxkID0gbWVzc2FnZS5FeHRlbnNpb25zLl9GaW5kRXh0ZW5zaW9uQnlOYW1lKGlkZW50aWZpZXIpCisgICAgICAgICAgIyBweWxpbnQ6IGVuYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgICAgaWYgbm90IGZpZWxkOgorICAgICAgICAgICAgIyBUcnkgbG9va2luZyBmb3IgZXh0ZW5zaW9uIGJ5IHRoZSBtZXNzYWdlIHR5cGUgbmFtZSwgZHJvcHBpbmcgdGhlCisgICAgICAgICAgICAjIGZpZWxkIG5hbWUgZm9sbG93aW5nIHRoZSBmaW5hbCAuIHNlcGFyYXRvciBpbiBmdWxsX25hbWUuCisgICAgICAgICAgICBpZGVudGlmaWVyID0gJy4nLmpvaW4oaWRlbnRpZmllci5zcGxpdCgnLicpWzotMV0pCisgICAgICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgICAgICBmaWVsZCA9IG1lc3NhZ2UuRXh0ZW5zaW9ucy5fRmluZEV4dGVuc2lvbkJ5TmFtZShpZGVudGlmaWVyKQorICAgICAgICAgICAgIyBweWxpbnQ6IGVuYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgIGlmIG5vdCBmaWVsZDoKKyAgICAgICAgICBpZiBzZWxmLmlnbm9yZV91bmtub3duX2ZpZWxkczoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgcmFpc2UgUGFyc2VFcnJvcigKKyAgICAgICAgICAgICAgKCdNZXNzYWdlIHR5cGUgInswfSIgaGFzIG5vIGZpZWxkIG5hbWVkICJ7MX0iIGF0ICJ7Mn0iLlxuJworICAgICAgICAgICAgICAgJyBBdmFpbGFibGUgRmllbGRzKGV4Y2VwdCBleHRlbnNpb25zKTogInszfSInKS5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSwgbmFtZSwgcGF0aCwKKyAgICAgICAgICAgICAgICAgICBbZi5qc29uX25hbWUgZm9yIGYgaW4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc10pKQorICAgICAgICBpZiBuYW1lIGluIG5hbWVzOgorICAgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ01lc3NhZ2UgdHlwZSAiezB9IiBzaG91bGQgbm90IGhhdmUgbXVsdGlwbGUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJyJ7MX0iIGZpZWxkcyBhdCAiezJ9Ii4nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLkRFU0NSSVBUT1IuZnVsbF9uYW1lLCBuYW1lLCBwYXRoKSkKKyAgICAgICAgbmFtZXMuYXBwZW5kKG5hbWUpCisgICAgICAgIHZhbHVlID0ganNbbmFtZV0KKyAgICAgICAgIyBDaGVjayBubyBvdGhlciBvbmVvZiBmaWVsZCBpcyBwYXJzZWQuCisgICAgICAgIGlmIGZpZWxkLmNvbnRhaW5pbmdfb25lb2YgaXMgbm90IE5vbmUgYW5kIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgIG9uZW9mX25hbWUgPSBmaWVsZC5jb250YWluaW5nX29uZW9mLm5hbWUKKyAgICAgICAgICBpZiBvbmVvZl9uYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgcmFpc2UgUGFyc2VFcnJvcignTWVzc2FnZSB0eXBlICJ7MH0iIHNob3VsZCBub3QgaGF2ZSBtdWx0aXBsZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciezF9IiBvbmVvZiBmaWVsZHMgYXQgInsyfSIuJy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLkRFU0NSSVBUT1IuZnVsbF9uYW1lLCBvbmVvZl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCkpCisgICAgICAgICAgbmFtZXMuYXBwZW5kKG9uZW9mX25hbWUpCisKKyAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICBpZiAoZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFCisgICAgICAgICAgICAgIGFuZCBmaWVsZC5tZXNzYWdlX3R5cGUuZnVsbF9uYW1lID09ICdnb29nbGUucHJvdG9idWYuVmFsdWUnKToKKyAgICAgICAgICAgIHN1Yl9tZXNzYWdlID0gZ2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lKQorICAgICAgICAgICAgc3ViX21lc3NhZ2UubnVsbF92YWx1ZSA9IDAKKyAgICAgICAgICBlbGlmIChmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0VOVU0KKyAgICAgICAgICAgICAgICBhbmQgZmllbGQuZW51bV90eXBlLmZ1bGxfbmFtZSA9PSAnZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZScpOgorICAgICAgICAgICAgc2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lLCAwKQorICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtZXNzYWdlLkNsZWFyRmllbGQoZmllbGQubmFtZSkKKyAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICMgUGFyc2UgZmllbGQgdmFsdWUuCisgICAgICAgIGlmIF9Jc01hcEVudHJ5KGZpZWxkKToKKyAgICAgICAgICBtZXNzYWdlLkNsZWFyRmllbGQoZmllbGQubmFtZSkKKyAgICAgICAgICBzZWxmLl9Db252ZXJ0TWFwRmllbGRWYWx1ZSh2YWx1ZSwgbWVzc2FnZSwgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3swfS57MX0nLmZvcm1hdChwYXRoLCBuYW1lKSkKKyAgICAgICAgZWxpZiBmaWVsZC5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgICAgICBtZXNzYWdlLkNsZWFyRmllbGQoZmllbGQubmFtZSkKKyAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CisgICAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKCdyZXBlYXRlZCBmaWVsZCB7MH0gbXVzdCBiZSBpbiBbXSB3aGljaCBpcyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7MX0gYXQgezJ9Jy5mb3JtYXQobmFtZSwgdmFsdWUsIHBhdGgpKQorICAgICAgICAgIGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICAgICMgUmVwZWF0ZWQgbWVzc2FnZSBmaWVsZC4KKyAgICAgICAgICAgIGZvciBpbmRleCwgaXRlbSBpbiBlbnVtZXJhdGUodmFsdWUpOgorICAgICAgICAgICAgICBzdWJfbWVzc2FnZSA9IGdldGF0dHIobWVzc2FnZSwgZmllbGQubmFtZSkuYWRkKCkKKyAgICAgICAgICAgICAgIyBOb25lIGlzIGEgbnVsbF92YWx1ZSBpbiBWYWx1ZS4KKyAgICAgICAgICAgICAgaWYgKGl0ZW0gaXMgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICAgIHN1Yl9tZXNzYWdlLkRFU0NSSVBUT1IuZnVsbF9uYW1lICE9ICdnb29nbGUucHJvdG9idWYuVmFsdWUnKToKKyAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKCdudWxsIGlzIG5vdCBhbGxvd2VkIHRvIGJlIHVzZWQgYXMgYW4gZWxlbWVudCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgaW4gYSByZXBlYXRlZCBmaWVsZCBhdCB7MH0uezF9W3syfV0nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBuYW1lLCBpbmRleCkpCisgICAgICAgICAgICAgIHNlbGYuQ29udmVydE1lc3NhZ2UoaXRlbSwgc3ViX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3swfS57MX1bezJ9XScuZm9ybWF0KHBhdGgsIG5hbWUsIGluZGV4KSkKKyAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBSZXBlYXRlZCBzY2FsYXIgZmllbGQuCisgICAgICAgICAgICBmb3IgaW5kZXgsIGl0ZW0gaW4gZW51bWVyYXRlKHZhbHVlKToKKyAgICAgICAgICAgICAgaWYgaXRlbSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ251bGwgaXMgbm90IGFsbG93ZWQgdG8gYmUgdXNlZCBhcyBhbiBlbGVtZW50JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBpbiBhIHJlcGVhdGVkIGZpZWxkIGF0IHswfS57MX1bezJ9XScuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIG5hbWUsIGluZGV4KSkKKyAgICAgICAgICAgICAgZ2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lKS5hcHBlbmQoCisgICAgICAgICAgICAgICAgICBfQ29udmVydFNjYWxhckZpZWxkVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgaXRlbSwgZmllbGQsICd7MH0uezF9W3syfV0nLmZvcm1hdChwYXRoLCBuYW1lLCBpbmRleCkpKQorICAgICAgICBlbGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICBpZiBmaWVsZC5pc19leHRlbnNpb246CisgICAgICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2UuRXh0ZW5zaW9uc1tmaWVsZF0KKyAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3ViX21lc3NhZ2UgPSBnZXRhdHRyKG1lc3NhZ2UsIGZpZWxkLm5hbWUpCisgICAgICAgICAgc3ViX21lc3NhZ2UuU2V0SW5QYXJlbnQoKQorICAgICAgICAgIHNlbGYuQ29udmVydE1lc3NhZ2UodmFsdWUsIHN1Yl9tZXNzYWdlLCAnezB9LnsxfScuZm9ybWF0KHBhdGgsIG5hbWUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlmIGZpZWxkLmlzX2V4dGVuc2lvbjoKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uc1tmaWVsZF0gPSBfQ29udmVydFNjYWxhckZpZWxkVmFsdWUoCisgICAgICAgICAgICAgICAgdmFsdWUsIGZpZWxkLCAnezB9LnsxfScuZm9ybWF0KHBhdGgsIG5hbWUpKQorICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXRhdHRyKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLm5hbWUsCisgICAgICAgICAgICAgICAgX0NvbnZlcnRTY2FsYXJGaWVsZFZhbHVlKHZhbHVlLCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3swfS57MX0nLmZvcm1hdChwYXRoLCBuYW1lKSkpCisgICAgICBleGNlcHQgUGFyc2VFcnJvciBhcyBlOgorICAgICAgICBpZiBmaWVsZCBhbmQgZmllbGQuY29udGFpbmluZ19vbmVvZiBpcyBOb25lOgorICAgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSB7MH0gZmllbGQ6IHsxfS4nLmZvcm1hdChuYW1lLCBlKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKHN0cihlKSkKKyAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CisgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSB7MH0gZmllbGQ6IHsxfS4nLmZvcm1hdChuYW1lLCBlKSkKKyAgICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgZToKKyAgICAgICAgcmFpc2UgUGFyc2VFcnJvcignRmFpbGVkIHRvIHBhcnNlIHswfSBmaWVsZDogezF9LicuZm9ybWF0KG5hbWUsIGUpKQorCisgIGRlZiBfQ29udmVydEFueU1lc3NhZ2Uoc2VsZiwgdmFsdWUsIG1lc3NhZ2UsIHBhdGgpOgorICAgICIiIkNvbnZlcnQgYSBKU09OIHJlcHJlc2VudGF0aW9uIGludG8gQW55IG1lc3NhZ2UuIiIiCisgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCkgYW5kIG5vdCB2YWx1ZToKKyAgICAgIHJldHVybgorICAgIHRyeToKKyAgICAgIHR5cGVfdXJsID0gdmFsdWVbJ0B0eXBlJ10KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICByYWlzZSBQYXJzZUVycm9yKAorICAgICAgICAgICdAdHlwZSBpcyBtaXNzaW5nIHdoZW4gcGFyc2luZyBhbnkgbWVzc2FnZSBhdCB7MH0nLmZvcm1hdChwYXRoKSkKKworICAgIHRyeToKKyAgICAgIHN1Yl9tZXNzYWdlID0gX0NyZWF0ZU1lc3NhZ2VGcm9tVHlwZVVybCh0eXBlX3VybCwgc2VsZi5kZXNjcmlwdG9yX3Bvb2wpCisgICAgZXhjZXB0IFR5cGVFcnJvciBhcyBlOgorICAgICAgcmFpc2UgUGFyc2VFcnJvcignezB9IGF0IHsxfScuZm9ybWF0KGUsIHBhdGgpKQorICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9IHN1Yl9tZXNzYWdlLkRFU0NSSVBUT1IKKyAgICBmdWxsX25hbWUgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuZnVsbF9uYW1lCisgICAgaWYgX0lzV3JhcHBlck1lc3NhZ2UobWVzc2FnZV9kZXNjcmlwdG9yKToKKyAgICAgIHNlbGYuX0NvbnZlcnRXcmFwcGVyTWVzc2FnZSh2YWx1ZVsndmFsdWUnXSwgc3ViX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3swfS52YWx1ZScuZm9ybWF0KHBhdGgpKQorICAgIGVsaWYgZnVsbF9uYW1lIGluIF9XS1RKU09OTUVUSE9EUzoKKyAgICAgIG1ldGhvZGNhbGxlcihfV0tUSlNPTk1FVEhPRFNbZnVsbF9uYW1lXVsxXSwgdmFsdWVbJ3ZhbHVlJ10sIHN1Yl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICd7MH0udmFsdWUnLmZvcm1hdChwYXRoKSkoCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpCisgICAgZWxzZToKKyAgICAgIGRlbCB2YWx1ZVsnQHR5cGUnXQorICAgICAgc2VsZi5fQ29udmVydEZpZWxkVmFsdWVQYWlyKHZhbHVlLCBzdWJfbWVzc2FnZSwgcGF0aCkKKyAgICAgIHZhbHVlWydAdHlwZSddID0gdHlwZV91cmwKKyAgICAjIFNldHMgQW55IG1lc3NhZ2UKKyAgICBtZXNzYWdlLnZhbHVlID0gc3ViX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIG1lc3NhZ2UudHlwZV91cmwgPSB0eXBlX3VybAorCisgIGRlZiBfQ29udmVydEdlbmVyaWNNZXNzYWdlKHNlbGYsIHZhbHVlLCBtZXNzYWdlLCBwYXRoKToKKyAgICAiIiJDb252ZXJ0IGEgSlNPTiByZXByZXNlbnRhdGlvbiBpbnRvIG1lc3NhZ2Ugd2l0aCBGcm9tSnNvblN0cmluZy4iIiIKKyAgICAjIER1cmF0aW9uLCBUaW1lc3RhbXAsIEZpZWxkTWFzayBoYXZlIGEgRnJvbUpzb25TdHJpbmcgbWV0aG9kIHRvIGRvIHRoZQorICAgICMgY29udmVyc2lvbi4gVXNlcnMgY2FuIGFsc28gY2FsbCB0aGUgbWV0aG9kIGRpcmVjdGx5LgorICAgIHRyeToKKyAgICAgIG1lc3NhZ2UuRnJvbUpzb25TdHJpbmcodmFsdWUpCisgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKKyAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ3swfSBhdCB7MX0nLmZvcm1hdChlLCBwYXRoKSkKKworICBkZWYgX0NvbnZlcnRWYWx1ZU1lc3NhZ2Uoc2VsZiwgdmFsdWUsIG1lc3NhZ2UsIHBhdGgpOgorICAgICIiIkNvbnZlcnQgYSBKU09OIHJlcHJlc2VudGF0aW9uIGludG8gVmFsdWUgbWVzc2FnZS4iIiIKKyAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBkaWN0KToKKyAgICAgIHNlbGYuX0NvbnZlcnRTdHJ1Y3RNZXNzYWdlKHZhbHVlLCBtZXNzYWdlLnN0cnVjdF92YWx1ZSwgcGF0aCkKKyAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOgorICAgICAgc2VsZi5fQ29udmVydExpc3RWYWx1ZU1lc3NhZ2UodmFsdWUsIG1lc3NhZ2UubGlzdF92YWx1ZSwgcGF0aCkKKyAgICBlbGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICBtZXNzYWdlLm51bGxfdmFsdWUgPSAwCisgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBib29sKToKKyAgICAgIG1lc3NhZ2UuYm9vbF92YWx1ZSA9IHZhbHVlCisgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHIpOgorICAgICAgbWVzc2FnZS5zdHJpbmdfdmFsdWUgPSB2YWx1ZQorICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgX0lOVF9PUl9GTE9BVCk6CisgICAgICBtZXNzYWdlLm51bWJlcl92YWx1ZSA9IHZhbHVlCisgICAgZWxzZToKKyAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ1ZhbHVlIHswfSBoYXMgdW5leHBlY3RlZCB0eXBlIHsxfSBhdCB7Mn0nLmZvcm1hdCgKKyAgICAgICAgICB2YWx1ZSwgdHlwZSh2YWx1ZSksIHBhdGgpKQorCisgIGRlZiBfQ29udmVydExpc3RWYWx1ZU1lc3NhZ2Uoc2VsZiwgdmFsdWUsIG1lc3NhZ2UsIHBhdGgpOgorICAgICIiIkNvbnZlcnQgYSBKU09OIHJlcHJlc2VudGF0aW9uIGludG8gTGlzdFZhbHVlIG1lc3NhZ2UuIiIiCisgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOgorICAgICAgcmFpc2UgUGFyc2VFcnJvcignTGlzdFZhbHVlIG11c3QgYmUgaW4gW10gd2hpY2ggaXMgezB9IGF0IHsxfScuZm9ybWF0KAorICAgICAgICAgIHZhbHVlLCBwYXRoKSkKKyAgICBtZXNzYWdlLkNsZWFyRmllbGQoJ3ZhbHVlcycpCisgICAgZm9yIGluZGV4LCBpdGVtIGluIGVudW1lcmF0ZSh2YWx1ZSk6CisgICAgICBzZWxmLl9Db252ZXJ0VmFsdWVNZXNzYWdlKGl0ZW0sIG1lc3NhZ2UudmFsdWVzLmFkZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnezB9W3sxfV0nLmZvcm1hdChwYXRoLCBpbmRleCkpCisKKyAgZGVmIF9Db252ZXJ0U3RydWN0TWVzc2FnZShzZWxmLCB2YWx1ZSwgbWVzc2FnZSwgcGF0aCk6CisgICAgIiIiQ29udmVydCBhIEpTT04gcmVwcmVzZW50YXRpb24gaW50byBTdHJ1Y3QgbWVzc2FnZS4iIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CisgICAgICByYWlzZSBQYXJzZUVycm9yKCdTdHJ1Y3QgbXVzdCBiZSBpbiBhIGRpY3Qgd2hpY2ggaXMgezB9IGF0IHsxfScuZm9ybWF0KAorICAgICAgICAgIHZhbHVlLCBwYXRoKSkKKyAgICAjIENsZWFyIHdpbGwgbWFyayB0aGUgc3RydWN0IGFzIG1vZGlmaWVkIHNvIGl0IHdpbGwgYmUgY3JlYXRlZCBldmVuIGlmCisgICAgIyB0aGVyZSBhcmUgbm8gdmFsdWVzLgorICAgIG1lc3NhZ2UuQ2xlYXIoKQorICAgIGZvciBrZXkgaW4gdmFsdWU6CisgICAgICBzZWxmLl9Db252ZXJ0VmFsdWVNZXNzYWdlKHZhbHVlW2tleV0sIG1lc3NhZ2UuZmllbGRzW2tleV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7MH0uezF9Jy5mb3JtYXQocGF0aCwga2V5KSkKKyAgICByZXR1cm4KKworICBkZWYgX0NvbnZlcnRXcmFwcGVyTWVzc2FnZShzZWxmLCB2YWx1ZSwgbWVzc2FnZSwgcGF0aCk6CisgICAgIiIiQ29udmVydCBhIEpTT04gcmVwcmVzZW50YXRpb24gaW50byBXcmFwcGVyIG1lc3NhZ2UuIiIiCisgICAgZmllbGQgPSBtZXNzYWdlLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ3ZhbHVlJ10KKyAgICBzZXRhdHRyKAorICAgICAgICBtZXNzYWdlLCAndmFsdWUnLAorICAgICAgICBfQ29udmVydFNjYWxhckZpZWxkVmFsdWUodmFsdWUsIGZpZWxkLCBwYXRoPSd7MH0udmFsdWUnLmZvcm1hdChwYXRoKSkpCisKKyAgZGVmIF9Db252ZXJ0TWFwRmllbGRWYWx1ZShzZWxmLCB2YWx1ZSwgbWVzc2FnZSwgZmllbGQsIHBhdGgpOgorICAgICIiIkNvbnZlcnQgbWFwIGZpZWxkIHZhbHVlIGZvciBhIG1lc3NhZ2UgbWFwIGZpZWxkLgorCisgICAgQXJnczoKKyAgICAgIHZhbHVlOiBBIEpTT04gb2JqZWN0IHRvIGNvbnZlcnQgdGhlIG1hcCBmaWVsZCB2YWx1ZS4KKyAgICAgIG1lc3NhZ2U6IEEgcHJvdG9jb2wgbWVzc2FnZSB0byByZWNvcmQgdGhlIGNvbnZlcnRlZCBkYXRhLgorICAgICAgZmllbGQ6IFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBtYXAgZmllbGQgdG8gYmUgY29udmVydGVkLgorICAgICAgcGF0aDogcGFyZW50IHBhdGggdG8gbG9nIHBhcnNlIGVycm9yIGluZm8uCisKKyAgICBSYWlzZXM6CisgICAgICBQYXJzZUVycm9yOiBJbiBjYXNlIG9mIGNvbnZlcnQgcHJvYmxlbXMuCisgICAgIiIiCisgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIGRpY3QpOgorICAgICAgcmFpc2UgUGFyc2VFcnJvcigKKyAgICAgICAgICAnTWFwIGZpZWxkIHswfSBtdXN0IGJlIGluIGEgZGljdCB3aGljaCBpcyB7MX0gYXQgezJ9Jy5mb3JtYXQoCisgICAgICAgICAgICAgIGZpZWxkLm5hbWUsIHZhbHVlLCBwYXRoKSkKKyAgICBrZXlfZmllbGQgPSBmaWVsZC5tZXNzYWdlX3R5cGUuZmllbGRzX2J5X25hbWVbJ2tleSddCisgICAgdmFsdWVfZmllbGQgPSBmaWVsZC5tZXNzYWdlX3R5cGUuZmllbGRzX2J5X25hbWVbJ3ZhbHVlJ10KKyAgICBmb3Iga2V5IGluIHZhbHVlOgorICAgICAga2V5X3ZhbHVlID0gX0NvbnZlcnRTY2FsYXJGaWVsZFZhbHVlKGtleSwga2V5X2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7MH0ua2V5Jy5mb3JtYXQocGF0aCksIFRydWUpCisgICAgICBpZiB2YWx1ZV9maWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgICAgIHNlbGYuQ29udmVydE1lc3NhZ2UodmFsdWVba2V5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKG1lc3NhZ2UsIGZpZWxkLm5hbWUpW2tleV92YWx1ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3swfVt7MX1dJy5mb3JtYXQocGF0aCwga2V5X3ZhbHVlKSkKKyAgICAgIGVsc2U6CisgICAgICAgIGdldGF0dHIobWVzc2FnZSwgZmllbGQubmFtZSlba2V5X3ZhbHVlXSA9IF9Db252ZXJ0U2NhbGFyRmllbGRWYWx1ZSgKKyAgICAgICAgICAgIHZhbHVlW2tleV0sIHZhbHVlX2ZpZWxkLCBwYXRoPSd7MH1bezF9XScuZm9ybWF0KHBhdGgsIGtleV92YWx1ZSkpCisKKworZGVmIF9Db252ZXJ0U2NhbGFyRmllbGRWYWx1ZSh2YWx1ZSwgZmllbGQsIHBhdGgsIHJlcXVpcmVfc3RyPUZhbHNlKToKKyAgIiIiQ29udmVydCBhIHNpbmdsZSBzY2FsYXIgZmllbGQgdmFsdWUuCisKKyAgQXJnczoKKyAgICB2YWx1ZTogQSBzY2FsYXIgdmFsdWUgdG8gY29udmVydCB0aGUgc2NhbGFyIGZpZWxkIHZhbHVlLgorICAgIGZpZWxkOiBUaGUgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQgdG8gY29udmVydC4KKyAgICBwYXRoOiBwYXJlbnQgcGF0aCB0byBsb2cgcGFyc2UgZXJyb3IgaW5mby4KKyAgICByZXF1aXJlX3N0cjogSWYgVHJ1ZSwgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgYSBzdHIuCisKKyAgUmV0dXJuczoKKyAgICBUaGUgY29udmVydGVkIHNjYWxhciBmaWVsZCB2YWx1ZQorCisgIFJhaXNlczoKKyAgICBQYXJzZUVycm9yOiBJbiBjYXNlIG9mIGNvbnZlcnQgcHJvYmxlbXMuCisgICIiIgorICB0cnk6CisgICAgaWYgZmllbGQuY3BwX3R5cGUgaW4gX0lOVF9UWVBFUzoKKyAgICAgIHJldHVybiBfQ29udmVydEludGVnZXIodmFsdWUpCisgICAgZWxpZiBmaWVsZC5jcHBfdHlwZSBpbiBfRkxPQVRfVFlQRVM6CisgICAgICByZXR1cm4gX0NvbnZlcnRGbG9hdCh2YWx1ZSwgZmllbGQpCisgICAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gX0NvbnZlcnRCb29sKHZhbHVlLCByZXF1aXJlX3N0cikKKyAgICBlbGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfU1RSSU5HOgorICAgICAgaWYgZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOgorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHIpOgorICAgICAgICAgIGVuY29kZWQgPSB2YWx1ZS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBlbmNvZGVkID0gdmFsdWUKKyAgICAgICAgIyBBZGQgZXh0cmEgcGFkZGluZyAnPScKKyAgICAgICAgcGFkZGVkX3ZhbHVlID0gZW5jb2RlZCArIGInPScgKiAoNCAtIGxlbihlbmNvZGVkKSAlIDQpCisgICAgICAgIHJldHVybiBiYXNlNjQudXJsc2FmZV9iNjRkZWNvZGUocGFkZGVkX3ZhbHVlKQorICAgICAgZWxzZToKKyAgICAgICAgIyBDaGVja2luZyBmb3IgdW5wYWlyZWQgc3Vycm9nYXRlcyBhcHBlYXJzIHRvIGJlIHVucmVsaWFibGUsCisgICAgICAgICMgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpYyBQeXRob24gdmVyc2lvbiwgc28gd2UgY2hlY2sgbWFudWFsbHkuCisgICAgICAgIGlmIF9VTlBBSVJFRF9TVVJST0dBVEVfUEFUVEVSTi5zZWFyY2godmFsdWUpOgorICAgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ1VucGFpcmVkIHN1cnJvZ2F0ZScpCisgICAgICAgIHJldHVybiB2YWx1ZQorICAgIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9FTlVNOgorICAgICAgIyBDb252ZXJ0IGFuIGVudW0gdmFsdWUuCisgICAgICBlbnVtX3ZhbHVlID0gZmllbGQuZW51bV90eXBlLnZhbHVlc19ieV9uYW1lLmdldCh2YWx1ZSwgTm9uZSkKKyAgICAgIGlmIGVudW1fdmFsdWUgaXMgTm9uZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgIG51bWJlciA9IGludCh2YWx1ZSkKKyAgICAgICAgICBlbnVtX3ZhbHVlID0gZmllbGQuZW51bV90eXBlLnZhbHVlc19ieV9udW1iZXIuZ2V0KG51bWJlciwgTm9uZSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgcmFpc2UgUGFyc2VFcnJvcignSW52YWxpZCBlbnVtIHZhbHVlIHswfSBmb3IgZW51bSB0eXBlIHsxfScuZm9ybWF0KAorICAgICAgICAgICAgICB2YWx1ZSwgZmllbGQuZW51bV90eXBlLmZ1bGxfbmFtZSkpCisgICAgICAgIGlmIGVudW1fdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICBpZiBmaWVsZC5maWxlLnN5bnRheCA9PSAncHJvdG8zJzoKKyAgICAgICAgICAgICMgUHJvdG8zIGFjY2VwdHMgdW5rbm93biBlbnVtcy4KKyAgICAgICAgICAgIHJldHVybiBudW1iZXIKKyAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKCdJbnZhbGlkIGVudW0gdmFsdWUgezB9IGZvciBlbnVtIHR5cGUgezF9Jy5mb3JtYXQoCisgICAgICAgICAgICAgIHZhbHVlLCBmaWVsZC5lbnVtX3R5cGUuZnVsbF9uYW1lKSkKKyAgICAgIHJldHVybiBlbnVtX3ZhbHVlLm51bWJlcgorICBleGNlcHQgUGFyc2VFcnJvciBhcyBlOgorICAgIHJhaXNlIFBhcnNlRXJyb3IoJ3swfSBhdCB7MX0nLmZvcm1hdChlLCBwYXRoKSkKKworCitkZWYgX0NvbnZlcnRJbnRlZ2VyKHZhbHVlKToKKyAgIiIiQ29udmVydCBhbiBpbnRlZ2VyLgorCisgIEFyZ3M6CisgICAgdmFsdWU6IEEgc2NhbGFyIHZhbHVlIHRvIGNvbnZlcnQuCisKKyAgUmV0dXJuczoKKyAgICBUaGUgaW50ZWdlciB2YWx1ZS4KKworICBSYWlzZXM6CisgICAgUGFyc2VFcnJvcjogSWYgYW4gaW50ZWdlciBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgIiIiCisgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGZsb2F0KSBhbmQgbm90IHZhbHVlLmlzX2ludGVnZXIoKToKKyAgICByYWlzZSBQYXJzZUVycm9yKCdDb3VsZG5cJ3QgcGFyc2UgaW50ZWdlcjogezB9Jy5mb3JtYXQodmFsdWUpKQorCisgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cikgYW5kIHZhbHVlLmZpbmQoJyAnKSAhPSAtMToKKyAgICByYWlzZSBQYXJzZUVycm9yKCdDb3VsZG5cJ3QgcGFyc2UgaW50ZWdlcjogInswfSInLmZvcm1hdCh2YWx1ZSkpCisKKyAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYm9vbCk6CisgICAgcmFpc2UgUGFyc2VFcnJvcignQm9vbCB2YWx1ZSB7MH0gaXMgbm90IGFjY2VwdGFibGUgZm9yICcKKyAgICAgICAgICAgICAgICAgICAgICdpbnRlZ2VyIGZpZWxkJy5mb3JtYXQodmFsdWUpKQorCisgIHJldHVybiBpbnQodmFsdWUpCisKKworZGVmIF9Db252ZXJ0RmxvYXQodmFsdWUsIGZpZWxkKToKKyAgIiIiQ29udmVydCBhbiBmbG9hdGluZyBwb2ludCBudW1iZXIuIiIiCisgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGZsb2F0KToKKyAgICBpZiBtYXRoLmlzbmFuKHZhbHVlKToKKyAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0NvdWxkblwndCBwYXJzZSBOYU4sIHVzZSBxdW90ZWQgIk5hTiIgaW5zdGVhZCcpCisgICAgaWYgbWF0aC5pc2luZih2YWx1ZSk6CisgICAgICBpZiB2YWx1ZSA+IDA6CisgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0NvdWxkblwndCBwYXJzZSBJbmZpbml0eSBvciB2YWx1ZSB0b28gbGFyZ2UsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHF1b3RlZCAiSW5maW5pdHkiIGluc3RlYWQnKQorICAgICAgZWxzZToKKyAgICAgICAgcmFpc2UgUGFyc2VFcnJvcignQ291bGRuXCd0IHBhcnNlIC1JbmZpbml0eSBvciB2YWx1ZSB0b28gc21hbGwsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHF1b3RlZCAiLUluZmluaXR5IiBpbnN0ZWFkJykKKyAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0ZMT0FUOgorICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgaWYgdmFsdWUgPiB0eXBlX2NoZWNrZXJzLl9GTE9BVF9NQVg6CisgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0Zsb2F0IHZhbHVlIHRvbyBsYXJnZScpCisgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICBpZiB2YWx1ZSA8IHR5cGVfY2hlY2tlcnMuX0ZMT0FUX01JTjoKKyAgICAgICAgcmFpc2UgUGFyc2VFcnJvcignRmxvYXQgdmFsdWUgdG9vIHNtYWxsJykKKyAgaWYgdmFsdWUgPT0gJ25hbic6CisgICAgcmFpc2UgUGFyc2VFcnJvcignQ291bGRuXCd0IHBhcnNlIGZsb2F0ICJuYW4iLCB1c2UgIk5hTiIgaW5zdGVhZCcpCisgIHRyeToKKyAgICAjIEFzc3VtZSBQeXRob24gY29tcGF0aWJsZSBzeW50YXguCisgICAgcmV0dXJuIGZsb2F0KHZhbHVlKQorICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAjIENoZWNrIGFsdGVybmF0aXZlIHNwZWxsaW5ncy4KKyAgICBpZiB2YWx1ZSA9PSBfTkVHX0lORklOSVRZOgorICAgICAgcmV0dXJuIGZsb2F0KCctaW5mJykKKyAgICBlbGlmIHZhbHVlID09IF9JTkZJTklUWToKKyAgICAgIHJldHVybiBmbG9hdCgnaW5mJykKKyAgICBlbGlmIHZhbHVlID09IF9OQU46CisgICAgICByZXR1cm4gZmxvYXQoJ25hbicpCisgICAgZWxzZToKKyAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0NvdWxkblwndCBwYXJzZSBmbG9hdDogezB9Jy5mb3JtYXQodmFsdWUpKQorCisKK2RlZiBfQ29udmVydEJvb2wodmFsdWUsIHJlcXVpcmVfc3RyKToKKyAgIiIiQ29udmVydCBhIGJvb2xlYW4gdmFsdWUuCisKKyAgQXJnczoKKyAgICB2YWx1ZTogQSBzY2FsYXIgdmFsdWUgdG8gY29udmVydC4KKyAgICByZXF1aXJlX3N0cjogSWYgVHJ1ZSwgdmFsdWUgbXVzdCBiZSBhIHN0ci4KKworICBSZXR1cm5zOgorICAgIFRoZSBib29sIHBhcnNlZC4KKworICBSYWlzZXM6CisgICAgUGFyc2VFcnJvcjogSWYgYSBib29sZWFuIHZhbHVlIGNvdWxkbid0IGJlIGNvbnN1bWVkLgorICAiIiIKKyAgaWYgcmVxdWlyZV9zdHI6CisgICAgaWYgdmFsdWUgPT0gJ3RydWUnOgorICAgICAgcmV0dXJuIFRydWUKKyAgICBlbGlmIHZhbHVlID09ICdmYWxzZSc6CisgICAgICByZXR1cm4gRmFsc2UKKyAgICBlbHNlOgorICAgICAgcmFpc2UgUGFyc2VFcnJvcignRXhwZWN0ZWQgInRydWUiIG9yICJmYWxzZSIsIG5vdCB7MH0nLmZvcm1hdCh2YWx1ZSkpCisKKyAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIGJvb2wpOgorICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0V4cGVjdGVkIHRydWUgb3IgZmFsc2Ugd2l0aG91dCBxdW90ZXMnKQorICByZXR1cm4gdmFsdWUKKworX1dLVEpTT05NRVRIT0RTID0geworICAgICdnb29nbGUucHJvdG9idWYuQW55JzogWydfQW55TWVzc2FnZVRvSnNvbk9iamVjdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19Db252ZXJ0QW55TWVzc2FnZSddLAorICAgICdnb29nbGUucHJvdG9idWYuRHVyYXRpb24nOiBbJ19HZW5lcmljTWVzc2FnZVRvSnNvbk9iamVjdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX0NvbnZlcnRHZW5lcmljTWVzc2FnZSddLAorICAgICdnb29nbGUucHJvdG9idWYuRmllbGRNYXNrJzogWydfR2VuZXJpY01lc3NhZ2VUb0pzb25PYmplY3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfQ29udmVydEdlbmVyaWNNZXNzYWdlJ10sCisgICAgJ2dvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUnOiBbJ19MaXN0VmFsdWVNZXNzYWdlVG9Kc29uT2JqZWN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX0NvbnZlcnRMaXN0VmFsdWVNZXNzYWdlJ10sCisgICAgJ2dvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QnOiBbJ19TdHJ1Y3RNZXNzYWdlVG9Kc29uT2JqZWN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX0NvbnZlcnRTdHJ1Y3RNZXNzYWdlJ10sCisgICAgJ2dvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAnOiBbJ19HZW5lcmljTWVzc2FnZVRvSnNvbk9iamVjdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19Db252ZXJ0R2VuZXJpY01lc3NhZ2UnXSwKKyAgICAnZ29vZ2xlLnByb3RvYnVmLlZhbHVlJzogWydfVmFsdWVNZXNzYWdlVG9Kc29uT2JqZWN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfQ29udmVydFZhbHVlTWVzc2FnZSddCit9CmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3RfcGIyLnB5IGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0X3BiMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODYzZmYzCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0X3BiMi5weQpAQCAtMCwwICsxLDEzNDUgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisjIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucHJvdG8KKyIiIkdlbmVyYXRlZCBwcm90b2NvbCBidWZmZXIgY29kZS4iIiIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbnVtX3R5cGVfd3JhcHBlcgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IgYXMgX2Rlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlIGFzIF9tZXNzYWdlCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgcmVmbGVjdGlvbiBhcyBfcmVmbGVjdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHN5bWJvbF9kYXRhYmFzZSBhcyBfc3ltYm9sX2RhdGFiYXNlCisjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQorCitfc3ltX2RiID0gX3N5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkKKworCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfaW1wb3J0X3BiMiBhcyBnb29nbGVfZG90X3Byb3RvYnVmX2RvdF91bml0dGVzdF9faW1wb3J0X19wYjIKK3RyeToKKyAgZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3RfdW5pdHRlc3RfX2ltcG9ydF9fcHVibGljX19wYjIgPSBnb29nbGVfZG90X3Byb3RvYnVmX2RvdF91bml0dGVzdF9faW1wb3J0X19wYjIuZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3RfdW5pdHRlc3RfX2ltcG9ydF9fcHVibGljX19wYjIKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3RfdW5pdHRlc3RfX2ltcG9ydF9fcHVibGljX19wYjIgPSBnb29nbGVfZG90X3Byb3RvYnVmX2RvdF91bml0dGVzdF9faW1wb3J0X19wYjIuZ29vZ2xlLnByb3RvYnVmLnVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfcGIyCisKKworREVTQ1JJUFRPUiA9IF9kZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKAorICBuYW1lPSdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wcm90bycsCisgIHBhY2thZ2U9J3Byb3RvYnVmX3VuaXR0ZXN0JywKKyAgc3ludGF4PSdwcm90bzInLAorICBzZXJpYWxpemVkX29wdGlvbnM9YidcMzcwXDAwMVwwMDEnLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBzZXJpYWxpemVkX3BiPWInXG4pZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucHJvdG9ceDEyXHgxMXByb3RvYnVmX3VuaXR0ZXN0XHgxYSVnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvXCJceGRiXHgwMlxuXHgwYlRlc3RFbnVtTWFwXHgxMkpcblx4MGZrbm93bl9tYXBfZmllbGRceDE4XHg2NSBceDAzKFx4MGJceDMyXHgzMS5wcm90b2J1Zl91bml0dGVzdC5UZXN0RW51bU1hcC5Lbm93bk1hcEZpZWxkRW50cnlceDEyTlxuXHgxMXVua25vd25fbWFwX2ZpZWxkXHgxOFx4NjYgXHgwMyhceDBiXHgzMlx4MzMucHJvdG9idWZfdW5pdHRlc3QuVGVzdEVudW1NYXAuVW5rbm93bk1hcEZpZWxkRW50cnlceDFhVlxuXHgxMktub3duTWFwRmllbGRFbnRyeVx4MTJceDBiXG5ceDAza2V5XHgxOFx4MDEgXHgwMShceDA1XHgxMi9cblx4MDV2YWx1ZVx4MThceDAyIFx4MDEoXHgwZVx4MzIgLnByb3RvYnVmX3VuaXR0ZXN0LlByb3RvMk1hcEVudW06XHgwMlx4MzhceDAxXHgxYVhcblx4MTRVbmtub3duTWFwRmllbGRFbnRyeVx4MTJceDBiXG5ceDAza2V5XHgxOFx4MDEgXHgwMShceDA1XHgxMi9cblx4MDV2YWx1ZVx4MThceDAyIFx4MDEoXHgwZVx4MzIgLnByb3RvYnVmX3VuaXR0ZXN0LlByb3RvMk1hcEVudW06XHgwMlx4MzhceDAxXCJceDg4XHgwM1xuXHgxNFRlc3RFbnVtTWFwUGx1c0V4dHJhXHgxMlNcblx4MGZrbm93bl9tYXBfZmllbGRceDE4XHg2NSBceDAzKFx4MGJceDMyOi5wcm90b2J1Zl91bml0dGVzdC5UZXN0RW51bU1hcFBsdXNFeHRyYS5Lbm93bk1hcEZpZWxkRW50cnlceDEyV1xuXHgxMXVua25vd25fbWFwX2ZpZWxkXHgxOFx4NjYgXHgwMyhceDBiXHgzMjwucHJvdG9idWZfdW5pdHRlc3QuVGVzdEVudW1NYXBQbHVzRXh0cmEuVW5rbm93bk1hcEZpZWxkRW50cnlceDFhX1xuXHgxMktub3duTWFwRmllbGRFbnRyeVx4MTJceDBiXG5ceDAza2V5XHgxOFx4MDEgXHgwMShceDA1XHgxMlx4Mzhcblx4MDV2YWx1ZVx4MThceDAyIFx4MDEoXHgwZVx4MzIpLnByb3RvYnVmX3VuaXR0ZXN0LlByb3RvMk1hcEVudW1QbHVzRXh0cmE6XHgwMlx4MzhceDAxXHgxYVx4NjFcblx4MTRVbmtub3duTWFwRmllbGRFbnRyeVx4MTJceDBiXG5ceDAza2V5XHgxOFx4MDEgXHgwMShceDA1XHgxMlx4Mzhcblx4MDV2YWx1ZVx4MThceDAyIFx4MDEoXHgwZVx4MzIpLnByb3RvYnVmX3VuaXR0ZXN0LlByb3RvMk1hcEVudW1QbHVzRXh0cmE6XHgwMlx4MzhceDAxXCJceGM3XHgwMVxuXHgxMVRlc3RJbXBvcnRFbnVtTWFwXHgxMlBcblx4MGZpbXBvcnRfZW51bV9hbXBceDE4XHgwMSBceDAzKFx4MGJceDMyXHgzNy5wcm90b2J1Zl91bml0dGVzdC5UZXN0SW1wb3J0RW51bU1hcC5JbXBvcnRFbnVtQW1wRW50cnlceDFhYFxuXHgxMkltcG9ydEVudW1BbXBFbnRyeVx4MTJceDBiXG5ceDAza2V5XHgxOFx4MDEgXHgwMShceDA1XHgxMlx4Mzlcblx4MDV2YWx1ZVx4MThceDAyIFx4MDEoXHgwZVx4MzIqLnByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtRm9yTWFwOlx4MDJceDM4XHgwMVwibVxuXHJUZXN0SW50SW50TWFwXHgxMlx4MzJcblx4MDFtXHgxOFx4MDEgXHgwMyhceDBiXHgzMlwnLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RJbnRJbnRNYXAuTUVudHJ5XHgxYShcblx4MDZNRW50cnlceDEyXHgwYlxuXHgwM2tleVx4MThceDAxIFx4MDEoXHgwNVx4MTJcclxuXHgwNXZhbHVlXHgxOFx4MDIgXHgwMShceDA1Olx4MDJceDM4XHgwMVwiXHhiOFxyXG5ceDA4VGVzdE1hcHNceDEyXHgzOFxuXHgwN21faW50MzJceDE4XHgwMSBceDAzKFx4MGJceDMyXCcucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTUludDMyRW50cnlceDEyXHgzOFxuXHgwN21faW50NjRceDE4XHgwMiBceDAzKFx4MGJceDMyXCcucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTUludDY0RW50cnlceDEyOlxuXHgwOG1fdWludDMyXHgxOFx4MDMgXHgwMyhceDBiXHgzMigucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVVpbnQzMkVudHJ5XHgxMjpcblx4MDhtX3VpbnQ2NFx4MThceDA0IFx4MDMoXHgwYlx4MzIoLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1VaW50NjRFbnRyeVx4MTI6XG5ceDA4bV9zaW50MzJceDE4XHgwNSBceDAzKFx4MGJceDMyKC5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcy5NU2ludDMyRW50cnlceDEyOlxuXHgwOG1fc2ludDY0XHgxOFx4MDYgXHgwMyhceDBiXHgzMigucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVNpbnQ2NEVudHJ5XHgxMjxcblx0bV9maXhlZDMyXHgxOFx4MDcgXHgwMyhceDBiXHgzMikucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTUZpeGVkMzJFbnRyeVx4MTI8XG5cdG1fZml4ZWQ2NFx4MThceDA4IFx4MDMoXHgwYlx4MzIpLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1GaXhlZDY0RW50cnlceDEyPlxuXG5tX3NmaXhlZDMyXHgxOFx0IFx4MDMoXHgwYlx4MzIqLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1TZml4ZWQzMkVudHJ5XHgxMj5cblxubV9zZml4ZWQ2NFx4MThcbiBceDAzKFx4MGJceDMyKi5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcy5NU2ZpeGVkNjRFbnRyeVx4MTJceDM2XG5ceDA2bV9ib29sXHgxOFx4MGIgXHgwMyhceDBiXHgzMiYucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTUJvb2xFbnRyeVx4MTI6XG5ceDA4bV9zdHJpbmdceDE4XHgwYyBceDAzKFx4MGJceDMyKC5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcy5NU3RyaW5nRW50cnlceDFhT1xuXHgwYk1JbnQzMkVudHJ5XHgxMlx4MGJcblx4MDNrZXlceDE4XHgwMSBceDAxKFx4MDVceDEyL1xuXHgwNXZhbHVlXHgxOFx4MDIgXHgwMShceDBiXHgzMiAucHJvdG9idWZfdW5pdHRlc3QuVGVzdEludEludE1hcDpceDAyXHgzOFx4MDFceDFhT1xuXHgwYk1JbnQ2NEVudHJ5XHgxMlx4MGJcblx4MDNrZXlceDE4XHgwMSBceDAxKFx4MDNceDEyL1xuXHgwNXZhbHVlXHgxOFx4MDIgXHgwMShceDBiXHgzMiAucHJvdG9idWZfdW5pdHRlc3QuVGVzdEludEludE1hcDpceDAyXHgzOFx4MDFceDFhUFxuXHgwY01VaW50MzJFbnRyeVx4MTJceDBiXG5ceDAza2V5XHgxOFx4MDEgXHgwMShcclx4MTIvXG5ceDA1dmFsdWVceDE4XHgwMiBceDAxKFx4MGJceDMyIC5wcm90b2J1Zl91bml0dGVzdC5UZXN0SW50SW50TWFwOlx4MDJceDM4XHgwMVx4MWFQXG5ceDBjTVVpbnQ2NEVudHJ5XHgxMlx4MGJcblx4MDNrZXlceDE4XHgwMSBceDAxKFx4MDRceDEyL1xuXHgwNXZhbHVlXHgxOFx4MDIgXHgwMShceDBiXHgzMiAucHJvdG9idWZfdW5pdHRlc3QuVGVzdEludEludE1hcDpceDAyXHgzOFx4MDFceDFhUFxuXHgwY01TaW50MzJFbnRyeVx4MTJceDBiXG5ceDAza2V5XHgxOFx4MDEgXHgwMShceDExXHgxMi9cblx4MDV2YWx1ZVx4MThceDAyIFx4MDEoXHgwYlx4MzIgLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RJbnRJbnRNYXA6XHgwMlx4MzhceDAxXHgxYVBcblx4MGNNU2ludDY0RW50cnlceDEyXHgwYlxuXHgwM2tleVx4MThceDAxIFx4MDEoXHgxMlx4MTIvXG5ceDA1dmFsdWVceDE4XHgwMiBceDAxKFx4MGJceDMyIC5wcm90b2J1Zl91bml0dGVzdC5UZXN0SW50SW50TWFwOlx4MDJceDM4XHgwMVx4MWFRXG5cck1GaXhlZDMyRW50cnlceDEyXHgwYlxuXHgwM2tleVx4MThceDAxIFx4MDEoXHgwN1x4MTIvXG5ceDA1dmFsdWVceDE4XHgwMiBceDAxKFx4MGJceDMyIC5wcm90b2J1Zl91bml0dGVzdC5UZXN0SW50SW50TWFwOlx4MDJceDM4XHgwMVx4MWFRXG5cck1GaXhlZDY0RW50cnlceDEyXHgwYlxuXHgwM2tleVx4MThceDAxIFx4MDEoXHgwNlx4MTIvXG5ceDA1dmFsdWVceDE4XHgwMiBceDAxKFx4MGJceDMyIC5wcm90b2J1Zl91bml0dGVzdC5UZXN0SW50SW50TWFwOlx4MDJceDM4XHgwMVx4MWFSXG5ceDBlTVNmaXhlZDMyRW50cnlceDEyXHgwYlxuXHgwM2tleVx4MThceDAxIFx4MDEoXHgwZlx4MTIvXG5ceDA1dmFsdWVceDE4XHgwMiBceDAxKFx4MGJceDMyIC5wcm90b2J1Zl91bml0dGVzdC5UZXN0SW50SW50TWFwOlx4MDJceDM4XHgwMVx4MWFSXG5ceDBlTVNmaXhlZDY0RW50cnlceDEyXHgwYlxuXHgwM2tleVx4MThceDAxIFx4MDEoXHgxMFx4MTIvXG5ceDA1dmFsdWVceDE4XHgwMiBceDAxKFx4MGJceDMyIC5wcm90b2J1Zl91bml0dGVzdC5UZXN0SW50SW50TWFwOlx4MDJceDM4XHgwMVx4MWFOXG5cbk1Cb29sRW50cnlceDEyXHgwYlxuXHgwM2tleVx4MThceDAxIFx4MDEoXHgwOFx4MTIvXG5ceDA1dmFsdWVceDE4XHgwMiBceDAxKFx4MGJceDMyIC5wcm90b2J1Zl91bml0dGVzdC5UZXN0SW50SW50TWFwOlx4MDJceDM4XHgwMVx4MWFQXG5ceDBjTVN0cmluZ0VudHJ5XHgxMlx4MGJcblx4MDNrZXlceDE4XHgwMSBceDAxKFx0XHgxMi9cblx4MDV2YWx1ZVx4MThceDAyIFx4MDEoXHgwYlx4MzIgLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RJbnRJbnRNYXA6XHgwMlx4MzhceDAxXCI8XG5ceDEyVGVzdFN1Ym1lc3NhZ2VNYXBzXHgxMiZcblx4MDFtXHgxOFx4MDEgXHgwMShceDBiXHgzMlx4MWIucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMqWlxuXHJQcm90bzJNYXBFbnVtXHgxMlx4MTdcblx4MTNQUk9UTzJfTUFQX0VOVU1fRk9PXHgxMFx4MDBceDEyXHgxN1xuXHgxM1BST1RPMl9NQVBfRU5VTV9CQVJceDEwXHgwMVx4MTJceDE3XG5ceDEzUFJPVE8yX01BUF9FTlVNX0JBWlx4MTBceDAyKlx4ODZceDAxXG5ceDE2UHJvdG8yTWFwRW51bVBsdXNFeHRyYVx4MTJceDE5XG5ceDE1XHg0NV9QUk9UTzJfTUFQX0VOVU1fRk9PXHgxMFx4MDBceDEyXHgxOVxuXHgxNVx4NDVfUFJPVE8yX01BUF9FTlVNX0JBUlx4MTBceDAxXHgxMlx4MTlcblx4MTVceDQ1X1BST1RPMl9NQVBfRU5VTV9CQVpceDEwXHgwMlx4MTJceDFiXG5ceDE3XHg0NV9QUk9UTzJfTUFQX0VOVU1fRVhUUkFceDEwXHgwM1x4NDJceDAzXHhmOFx4MDFceDAxJworICAsCisgIGRlcGVuZGVuY2llcz1bZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3RfdW5pdHRlc3RfX2ltcG9ydF9fcGIyLkRFU0NSSVBUT1IsXSkKKworX1BST1RPMk1BUEVOVU0gPSBfZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcigKKyAgbmFtZT0nUHJvdG8yTWFwRW51bScsCisgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuUHJvdG8yTWFwRW51bScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgdmFsdWVzPVsKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nUFJPVE8yX01BUF9FTlVNX0ZPTycsIGluZGV4PTAsIG51bWJlcj0wLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nUFJPVE8yX01BUF9FTlVNX0JBUicsIGluZGV4PTEsIG51bWJlcj0xLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nUFJPVE8yX01BUF9FTlVNX0JBWicsIGluZGV4PTIsIG51bWJlcj0yLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBzZXJpYWxpemVkX3N0YXJ0PTI5NDYsCisgIHNlcmlhbGl6ZWRfZW5kPTMwMzYsCispCitfc3ltX2RiLlJlZ2lzdGVyRW51bURlc2NyaXB0b3IoX1BST1RPMk1BUEVOVU0pCisKK1Byb3RvMk1hcEVudW0gPSBlbnVtX3R5cGVfd3JhcHBlci5FbnVtVHlwZVdyYXBwZXIoX1BST1RPMk1BUEVOVU0pCitfUFJPVE8yTUFQRU5VTVBMVVNFWFRSQSA9IF9kZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAorICBuYW1lPSdQcm90bzJNYXBFbnVtUGx1c0V4dHJhJywKKyAgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5Qcm90bzJNYXBFbnVtUGx1c0V4dHJhJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICB2YWx1ZXM9WworICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdFX1BST1RPMl9NQVBfRU5VTV9GT08nLCBpbmRleD0wLCBudW1iZXI9MCwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J0VfUFJPVE8yX01BUF9FTlVNX0JBUicsIGluZGV4PTEsIG51bWJlcj0xLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nRV9QUk9UTzJfTUFQX0VOVU1fQkFaJywgaW5kZXg9MiwgbnVtYmVyPTIsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdFX1BST1RPMl9NQVBfRU5VTV9FWFRSQScsIGluZGV4PTMsIG51bWJlcj0zLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBzZXJpYWxpemVkX3N0YXJ0PTMwMzksCisgIHNlcmlhbGl6ZWRfZW5kPTMxNzMsCispCitfc3ltX2RiLlJlZ2lzdGVyRW51bURlc2NyaXB0b3IoX1BST1RPMk1BUEVOVU1QTFVTRVhUUkEpCisKK1Byb3RvMk1hcEVudW1QbHVzRXh0cmEgPSBlbnVtX3R5cGVfd3JhcHBlci5FbnVtVHlwZVdyYXBwZXIoX1BST1RPMk1BUEVOVU1QTFVTRVhUUkEpCitQUk9UTzJfTUFQX0VOVU1fRk9PID0gMAorUFJPVE8yX01BUF9FTlVNX0JBUiA9IDEKK1BST1RPMl9NQVBfRU5VTV9CQVogPSAyCitFX1BST1RPMl9NQVBfRU5VTV9GT08gPSAwCitFX1BST1RPMl9NQVBfRU5VTV9CQVIgPSAxCitFX1BST1RPMl9NQVBfRU5VTV9CQVogPSAyCitFX1BST1RPMl9NQVBfRU5VTV9FWFRSQSA9IDMKKworCisKK19URVNURU5VTU1BUF9LTk9XTk1BUEZJRUxERU5UUlkgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdLbm93bk1hcEZpZWxkRW50cnknLAorICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RFbnVtTWFwLktub3duTWFwRmllbGRFbnRyeScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0na2V5JywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0RW51bU1hcC5Lbm93bk1hcEZpZWxkRW50cnkua2V5JywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndmFsdWUnLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RFbnVtTWFwLktub3duTWFwRmllbGRFbnRyeS52YWx1ZScsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xNCwgY3BwX3R5cGU9OCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1iJzhcMDAxJywKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzInLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTI3NSwKKyAgc2VyaWFsaXplZF9lbmQ9MzYxLAorKQorCitfVEVTVEVOVU1NQVBfVU5LTk9XTk1BUEZJRUxERU5UUlkgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdVbmtub3duTWFwRmllbGRFbnRyeScsCisgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdEVudW1NYXAuVW5rbm93bk1hcEZpZWxkRW50cnknLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2tleScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdEVudW1NYXAuVW5rbm93bk1hcEZpZWxkRW50cnkua2V5JywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndmFsdWUnLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RFbnVtTWFwLlVua25vd25NYXBGaWVsZEVudHJ5LnZhbHVlJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTE0LCBjcHBfdHlwZT04LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPWInOFwwMDEnLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MzYzLAorICBzZXJpYWxpemVkX2VuZD00NTEsCispCisKK19URVNURU5VTU1BUCA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J1Rlc3RFbnVtTWFwJywKKyAgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0RW51bU1hcCcsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0na25vd25fbWFwX2ZpZWxkJywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0RW51bU1hcC5rbm93bl9tYXBfZmllbGQnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEwMSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3Vua25vd25fbWFwX2ZpZWxkJywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0RW51bU1hcC51bmtub3duX21hcF9maWVsZCcsIGluZGV4PTEsCisgICAgICBudW1iZXI9MTAyLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W19URVNURU5VTU1BUF9LTk9XTk1BUEZJRUxERU5UUlksIF9URVNURU5VTU1BUF9VTktOT1dOTUFQRklFTERFTlRSWSwgXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MTA0LAorICBzZXJpYWxpemVkX2VuZD00NTEsCispCisKKworX1RFU1RFTlVNTUFQUExVU0VYVFJBX0tOT1dOTUFQRklFTERFTlRSWSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0tub3duTWFwRmllbGRFbnRyeScsCisgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdEVudW1NYXBQbHVzRXh0cmEuS25vd25NYXBGaWVsZEVudHJ5JywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdrZXknLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RFbnVtTWFwUGx1c0V4dHJhLktub3duTWFwRmllbGRFbnRyeS5rZXknLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd2YWx1ZScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdEVudW1NYXBQbHVzRXh0cmEuS25vd25NYXBGaWVsZEVudHJ5LnZhbHVlJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTE0LCBjcHBfdHlwZT04LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPWInOFwwMDEnLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9NjUyLAorICBzZXJpYWxpemVkX2VuZD03NDcsCispCisKK19URVNURU5VTU1BUFBMVVNFWFRSQV9VTktOT1dOTUFQRklFTERFTlRSWSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J1Vua25vd25NYXBGaWVsZEVudHJ5JywKKyAgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0RW51bU1hcFBsdXNFeHRyYS5Vbmtub3duTWFwRmllbGRFbnRyeScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0na2V5JywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0RW51bU1hcFBsdXNFeHRyYS5Vbmtub3duTWFwRmllbGRFbnRyeS5rZXknLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd2YWx1ZScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdEVudW1NYXBQbHVzRXh0cmEuVW5rbm93bk1hcEZpZWxkRW50cnkudmFsdWUnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Yic4XDAwMScsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD03NDksCisgIHNlcmlhbGl6ZWRfZW5kPTg0NiwKKykKKworX1RFU1RFTlVNTUFQUExVU0VYVFJBID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nVGVzdEVudW1NYXBQbHVzRXh0cmEnLAorICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RFbnVtTWFwUGx1c0V4dHJhJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdrbm93bl9tYXBfZmllbGQnLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RFbnVtTWFwUGx1c0V4dHJhLmtub3duX21hcF9maWVsZCcsIGluZGV4PTAsCisgICAgICBudW1iZXI9MTAxLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndW5rbm93bl9tYXBfZmllbGQnLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RFbnVtTWFwUGx1c0V4dHJhLnVua25vd25fbWFwX2ZpZWxkJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0xMDIsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bX1RFU1RFTlVNTUFQUExVU0VYVFJBX0tOT1dOTUFQRklFTERFTlRSWSwgX1RFU1RFTlVNTUFQUExVU0VYVFJBX1VOS05PV05NQVBGSUVMREVOVFJZLCBdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD00NTQsCisgIHNlcmlhbGl6ZWRfZW5kPTg0NiwKKykKKworCitfVEVTVElNUE9SVEVOVU1NQVBfSU1QT1JURU5VTUFNUEVOVFJZID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nSW1wb3J0RW51bUFtcEVudHJ5JywKKyAgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0SW1wb3J0RW51bU1hcC5JbXBvcnRFbnVtQW1wRW50cnknLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2tleScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdEltcG9ydEVudW1NYXAuSW1wb3J0RW51bUFtcEVudHJ5LmtleScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3ZhbHVlJywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0SW1wb3J0RW51bU1hcC5JbXBvcnRFbnVtQW1wRW50cnkudmFsdWUnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Yic4XDAwMScsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD05NTIsCisgIHNlcmlhbGl6ZWRfZW5kPTEwNDgsCispCisKK19URVNUSU1QT1JURU5VTU1BUCA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J1Rlc3RJbXBvcnRFbnVtTWFwJywKKyAgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0SW1wb3J0RW51bU1hcCcsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0naW1wb3J0X2VudW1fYW1wJywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0SW1wb3J0RW51bU1hcC5pbXBvcnRfZW51bV9hbXAnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bX1RFU1RJTVBPUlRFTlVNTUFQX0lNUE9SVEVOVU1BTVBFTlRSWSwgXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9ODQ5LAorICBzZXJpYWxpemVkX2VuZD0xMDQ4LAorKQorCisKK19URVNUSU5USU5UTUFQX01FTlRSWSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J01FbnRyeScsCisgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdEludEludE1hcC5NRW50cnknLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2tleScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdEludEludE1hcC5NRW50cnkua2V5JywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndmFsdWUnLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RJbnRJbnRNYXAuTUVudHJ5LnZhbHVlJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Yic4XDAwMScsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0xMTE5LAorICBzZXJpYWxpemVkX2VuZD0xMTU5LAorKQorCitfVEVTVElOVElOVE1BUCA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J1Rlc3RJbnRJbnRNYXAnLAorICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RJbnRJbnRNYXAnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J20nLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RJbnRJbnRNYXAubScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtfVEVTVElOVElOVE1BUF9NRU5UUlksIF0sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzInLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTEwNTAsCisgIHNlcmlhbGl6ZWRfZW5kPTExNTksCispCisKKworX1RFU1RNQVBTX01JTlQzMkVOVFJZID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nTUludDMyRW50cnknLAorICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1JbnQzMkVudHJ5JywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdrZXknLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1JbnQzMkVudHJ5LmtleScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3ZhbHVlJywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcy5NSW50MzJFbnRyeS52YWx1ZScsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Yic4XDAwMScsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0xODk4LAorICBzZXJpYWxpemVkX2VuZD0xOTc3LAorKQorCitfVEVTVE1BUFNfTUlOVDY0RU5UUlkgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdNSW50NjRFbnRyeScsCisgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTUludDY0RW50cnknLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2tleScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTUludDY0RW50cnkua2V5JywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTMsIGNwcF90eXBlPTIsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndmFsdWUnLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1JbnQ2NEVudHJ5LnZhbHVlJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1iJzhcMDAxJywKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzInLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTE5NzksCisgIHNlcmlhbGl6ZWRfZW5kPTIwNTgsCispCisKK19URVNUTUFQU19NVUlOVDMyRU5UUlkgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdNVWludDMyRW50cnknLAorICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1VaW50MzJFbnRyeScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0na2V5JywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcy5NVWludDMyRW50cnkua2V5JywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTEzLCBjcHBfdHlwZT0zLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3ZhbHVlJywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcy5NVWludDMyRW50cnkudmFsdWUnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPWInOFwwMDEnLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MjA2MCwKKyAgc2VyaWFsaXplZF9lbmQ9MjE0MCwKKykKKworX1RFU1RNQVBTX01VSU5UNjRFTlRSWSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J01VaW50NjRFbnRyeScsCisgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVVpbnQ2NEVudHJ5JywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdrZXknLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1VaW50NjRFbnRyeS5rZXknLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9NCwgY3BwX3R5cGU9NCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd2YWx1ZScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVVpbnQ2NEVudHJ5LnZhbHVlJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1iJzhcMDAxJywKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzInLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTIxNDIsCisgIHNlcmlhbGl6ZWRfZW5kPTIyMjIsCispCisKK19URVNUTUFQU19NU0lOVDMyRU5UUlkgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdNU2ludDMyRW50cnknLAorICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1TaW50MzJFbnRyeScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0na2V5JywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcy5NU2ludDMyRW50cnkua2V5JywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTE3LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3ZhbHVlJywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcy5NU2ludDMyRW50cnkudmFsdWUnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPWInOFwwMDEnLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MjIyNCwKKyAgc2VyaWFsaXplZF9lbmQ9MjMwNCwKKykKKworX1RFU1RNQVBTX01TSU5UNjRFTlRSWSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J01TaW50NjRFbnRyeScsCisgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVNpbnQ2NEVudHJ5JywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdrZXknLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1TaW50NjRFbnRyeS5rZXknLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9MTgsIGNwcF90eXBlPTIsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndmFsdWUnLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1TaW50NjRFbnRyeS52YWx1ZScsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Yic4XDAwMScsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0yMzA2LAorICBzZXJpYWxpemVkX2VuZD0yMzg2LAorKQorCitfVEVTVE1BUFNfTUZJWEVEMzJFTlRSWSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J01GaXhlZDMyRW50cnknLAorICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1GaXhlZDMyRW50cnknLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2tleScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTUZpeGVkMzJFbnRyeS5rZXknLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9NywgY3BwX3R5cGU9MywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd2YWx1ZScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTUZpeGVkMzJFbnRyeS52YWx1ZScsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Yic4XDAwMScsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0yMzg4LAorICBzZXJpYWxpemVkX2VuZD0yNDY5LAorKQorCitfVEVTVE1BUFNfTUZJWEVENjRFTlRSWSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J01GaXhlZDY0RW50cnknLAorICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1GaXhlZDY0RW50cnknLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2tleScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTUZpeGVkNjRFbnRyeS5rZXknLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9NiwgY3BwX3R5cGU9NCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd2YWx1ZScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTUZpeGVkNjRFbnRyeS52YWx1ZScsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Yic4XDAwMScsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0yNDcxLAorICBzZXJpYWxpemVkX2VuZD0yNTUyLAorKQorCitfVEVTVE1BUFNfTVNGSVhFRDMyRU5UUlkgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdNU2ZpeGVkMzJFbnRyeScsCisgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVNmaXhlZDMyRW50cnknLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2tleScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVNmaXhlZDMyRW50cnkua2V5JywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTE1LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3ZhbHVlJywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcy5NU2ZpeGVkMzJFbnRyeS52YWx1ZScsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Yic4XDAwMScsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0yNTU0LAorICBzZXJpYWxpemVkX2VuZD0yNjM2LAorKQorCitfVEVTVE1BUFNfTVNGSVhFRDY0RU5UUlkgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdNU2ZpeGVkNjRFbnRyeScsCisgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVNmaXhlZDY0RW50cnknLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2tleScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVNmaXhlZDY0RW50cnkua2V5JywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTE2LCBjcHBfdHlwZT0yLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3ZhbHVlJywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcy5NU2ZpeGVkNjRFbnRyeS52YWx1ZScsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Yic4XDAwMScsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8yJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0yNjM4LAorICBzZXJpYWxpemVkX2VuZD0yNzIwLAorKQorCitfVEVTVE1BUFNfTUJPT0xFTlRSWSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J01Cb29sRW50cnknLAorICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1Cb29sRW50cnknLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2tleScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTUJvb2xFbnRyeS5rZXknLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndmFsdWUnLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1Cb29sRW50cnkudmFsdWUnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPWInOFwwMDEnLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MjcyMiwKKyAgc2VyaWFsaXplZF9lbmQ9MjgwMCwKKykKKworX1RFU1RNQVBTX01TVFJJTkdFTlRSWSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J01TdHJpbmdFbnRyeScsCisgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVN0cmluZ0VudHJ5JywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdrZXknLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1TdHJpbmdFbnRyeS5rZXknLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd2YWx1ZScsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVN0cmluZ0VudHJ5LnZhbHVlJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1iJzhcMDAxJywKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzInLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTI4MDIsCisgIHNlcmlhbGl6ZWRfZW5kPTI4ODIsCispCisKK19URVNUTUFQUyA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J1Rlc3RNYXBzJywKKyAgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcycsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbV9pbnQzMicsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMubV9pbnQzMicsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J21faW50NjQnLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLm1faW50NjQnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdtX3VpbnQzMicsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMubV91aW50MzInLCBpbmRleD0yLAorICAgICAgbnVtYmVyPTMsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdtX3VpbnQ2NCcsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMubV91aW50NjQnLCBpbmRleD0zLAorICAgICAgbnVtYmVyPTQsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdtX3NpbnQzMicsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMubV9zaW50MzInLCBpbmRleD00LAorICAgICAgbnVtYmVyPTUsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdtX3NpbnQ2NCcsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMubV9zaW50NjQnLCBpbmRleD01LAorICAgICAgbnVtYmVyPTYsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdtX2ZpeGVkMzInLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLm1fZml4ZWQzMicsIGluZGV4PTYsCisgICAgICBudW1iZXI9NywgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J21fZml4ZWQ2NCcsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMubV9maXhlZDY0JywgaW5kZXg9NywKKyAgICAgIG51bWJlcj04LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbV9zZml4ZWQzMicsIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMubV9zZml4ZWQzMicsIGluZGV4PTgsCisgICAgICBudW1iZXI9OSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J21fc2ZpeGVkNjQnLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLm1fc2ZpeGVkNjQnLCBpbmRleD05LAorICAgICAgbnVtYmVyPTEwLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbV9ib29sJywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcy5tX2Jvb2wnLCBpbmRleD0xMCwKKyAgICAgIG51bWJlcj0xMSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J21fc3RyaW5nJywgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcy5tX3N0cmluZycsIGluZGV4PTExLAorICAgICAgbnVtYmVyPTEyLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W19URVNUTUFQU19NSU5UMzJFTlRSWSwgX1RFU1RNQVBTX01JTlQ2NEVOVFJZLCBfVEVTVE1BUFNfTVVJTlQzMkVOVFJZLCBfVEVTVE1BUFNfTVVJTlQ2NEVOVFJZLCBfVEVTVE1BUFNfTVNJTlQzMkVOVFJZLCBfVEVTVE1BUFNfTVNJTlQ2NEVOVFJZLCBfVEVTVE1BUFNfTUZJWEVEMzJFTlRSWSwgX1RFU1RNQVBTX01GSVhFRDY0RU5UUlksIF9URVNUTUFQU19NU0ZJWEVEMzJFTlRSWSwgX1RFU1RNQVBTX01TRklYRUQ2NEVOVFJZLCBfVEVTVE1BUFNfTUJPT0xFTlRSWSwgX1RFU1RNQVBTX01TVFJJTkdFTlRSWSwgXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MTE2MiwKKyAgc2VyaWFsaXplZF9lbmQ9Mjg4MiwKKykKKworCitfVEVTVFNVQk1FU1NBR0VNQVBTID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nVGVzdFN1Ym1lc3NhZ2VNYXBzJywKKyAgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0U3VibWVzc2FnZU1hcHMnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J20nLCBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RTdWJtZXNzYWdlTWFwcy5tJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMicsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9Mjg4NCwKKyAgc2VyaWFsaXplZF9lbmQ9Mjk0NCwKKykKKworX1RFU1RFTlVNTUFQX0tOT1dOTUFQRklFTERFTlRSWS5maWVsZHNfYnlfbmFtZVsndmFsdWUnXS5lbnVtX3R5cGUgPSBfUFJPVE8yTUFQRU5VTQorX1RFU1RFTlVNTUFQX0tOT1dOTUFQRklFTERFTlRSWS5jb250YWluaW5nX3R5cGUgPSBfVEVTVEVOVU1NQVAKK19URVNURU5VTU1BUF9VTktOT1dOTUFQRklFTERFTlRSWS5maWVsZHNfYnlfbmFtZVsndmFsdWUnXS5lbnVtX3R5cGUgPSBfUFJPVE8yTUFQRU5VTQorX1RFU1RFTlVNTUFQX1VOS05PV05NQVBGSUVMREVOVFJZLmNvbnRhaW5pbmdfdHlwZSA9IF9URVNURU5VTU1BUAorX1RFU1RFTlVNTUFQLmZpZWxkc19ieV9uYW1lWydrbm93bl9tYXBfZmllbGQnXS5tZXNzYWdlX3R5cGUgPSBfVEVTVEVOVU1NQVBfS05PV05NQVBGSUVMREVOVFJZCitfVEVTVEVOVU1NQVAuZmllbGRzX2J5X25hbWVbJ3Vua25vd25fbWFwX2ZpZWxkJ10ubWVzc2FnZV90eXBlID0gX1RFU1RFTlVNTUFQX1VOS05PV05NQVBGSUVMREVOVFJZCitfVEVTVEVOVU1NQVBQTFVTRVhUUkFfS05PV05NQVBGSUVMREVOVFJZLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddLmVudW1fdHlwZSA9IF9QUk9UTzJNQVBFTlVNUExVU0VYVFJBCitfVEVTVEVOVU1NQVBQTFVTRVhUUkFfS05PV05NQVBGSUVMREVOVFJZLmNvbnRhaW5pbmdfdHlwZSA9IF9URVNURU5VTU1BUFBMVVNFWFRSQQorX1RFU1RFTlVNTUFQUExVU0VYVFJBX1VOS05PV05NQVBGSUVMREVOVFJZLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddLmVudW1fdHlwZSA9IF9QUk9UTzJNQVBFTlVNUExVU0VYVFJBCitfVEVTVEVOVU1NQVBQTFVTRVhUUkFfVU5LTk9XTk1BUEZJRUxERU5UUlkuY29udGFpbmluZ190eXBlID0gX1RFU1RFTlVNTUFQUExVU0VYVFJBCitfVEVTVEVOVU1NQVBQTFVTRVhUUkEuZmllbGRzX2J5X25hbWVbJ2tub3duX21hcF9maWVsZCddLm1lc3NhZ2VfdHlwZSA9IF9URVNURU5VTU1BUFBMVVNFWFRSQV9LTk9XTk1BUEZJRUxERU5UUlkKK19URVNURU5VTU1BUFBMVVNFWFRSQS5maWVsZHNfYnlfbmFtZVsndW5rbm93bl9tYXBfZmllbGQnXS5tZXNzYWdlX3R5cGUgPSBfVEVTVEVOVU1NQVBQTFVTRVhUUkFfVU5LTk9XTk1BUEZJRUxERU5UUlkKK19URVNUSU1QT1JURU5VTU1BUF9JTVBPUlRFTlVNQU1QRU5UUlkuZmllbGRzX2J5X25hbWVbJ3ZhbHVlJ10uZW51bV90eXBlID0gZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3RfdW5pdHRlc3RfX2ltcG9ydF9fcGIyLl9JTVBPUlRFTlVNRk9STUFQCitfVEVTVElNUE9SVEVOVU1NQVBfSU1QT1JURU5VTUFNUEVOVFJZLmNvbnRhaW5pbmdfdHlwZSA9IF9URVNUSU1QT1JURU5VTU1BUAorX1RFU1RJTVBPUlRFTlVNTUFQLmZpZWxkc19ieV9uYW1lWydpbXBvcnRfZW51bV9hbXAnXS5tZXNzYWdlX3R5cGUgPSBfVEVTVElNUE9SVEVOVU1NQVBfSU1QT1JURU5VTUFNUEVOVFJZCitfVEVTVElOVElOVE1BUF9NRU5UUlkuY29udGFpbmluZ190eXBlID0gX1RFU1RJTlRJTlRNQVAKK19URVNUSU5USU5UTUFQLmZpZWxkc19ieV9uYW1lWydtJ10ubWVzc2FnZV90eXBlID0gX1RFU1RJTlRJTlRNQVBfTUVOVFJZCitfVEVTVE1BUFNfTUlOVDMyRU5UUlkuZmllbGRzX2J5X25hbWVbJ3ZhbHVlJ10ubWVzc2FnZV90eXBlID0gX1RFU1RJTlRJTlRNQVAKK19URVNUTUFQU19NSU5UMzJFTlRSWS5jb250YWluaW5nX3R5cGUgPSBfVEVTVE1BUFMKK19URVNUTUFQU19NSU5UNjRFTlRSWS5maWVsZHNfYnlfbmFtZVsndmFsdWUnXS5tZXNzYWdlX3R5cGUgPSBfVEVTVElOVElOVE1BUAorX1RFU1RNQVBTX01JTlQ2NEVOVFJZLmNvbnRhaW5pbmdfdHlwZSA9IF9URVNUTUFQUworX1RFU1RNQVBTX01VSU5UMzJFTlRSWS5maWVsZHNfYnlfbmFtZVsndmFsdWUnXS5tZXNzYWdlX3R5cGUgPSBfVEVTVElOVElOVE1BUAorX1RFU1RNQVBTX01VSU5UMzJFTlRSWS5jb250YWluaW5nX3R5cGUgPSBfVEVTVE1BUFMKK19URVNUTUFQU19NVUlOVDY0RU5UUlkuZmllbGRzX2J5X25hbWVbJ3ZhbHVlJ10ubWVzc2FnZV90eXBlID0gX1RFU1RJTlRJTlRNQVAKK19URVNUTUFQU19NVUlOVDY0RU5UUlkuY29udGFpbmluZ190eXBlID0gX1RFU1RNQVBTCitfVEVTVE1BUFNfTVNJTlQzMkVOVFJZLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddLm1lc3NhZ2VfdHlwZSA9IF9URVNUSU5USU5UTUFQCitfVEVTVE1BUFNfTVNJTlQzMkVOVFJZLmNvbnRhaW5pbmdfdHlwZSA9IF9URVNUTUFQUworX1RFU1RNQVBTX01TSU5UNjRFTlRSWS5maWVsZHNfYnlfbmFtZVsndmFsdWUnXS5tZXNzYWdlX3R5cGUgPSBfVEVTVElOVElOVE1BUAorX1RFU1RNQVBTX01TSU5UNjRFTlRSWS5jb250YWluaW5nX3R5cGUgPSBfVEVTVE1BUFMKK19URVNUTUFQU19NRklYRUQzMkVOVFJZLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddLm1lc3NhZ2VfdHlwZSA9IF9URVNUSU5USU5UTUFQCitfVEVTVE1BUFNfTUZJWEVEMzJFTlRSWS5jb250YWluaW5nX3R5cGUgPSBfVEVTVE1BUFMKK19URVNUTUFQU19NRklYRUQ2NEVOVFJZLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddLm1lc3NhZ2VfdHlwZSA9IF9URVNUSU5USU5UTUFQCitfVEVTVE1BUFNfTUZJWEVENjRFTlRSWS5jb250YWluaW5nX3R5cGUgPSBfVEVTVE1BUFMKK19URVNUTUFQU19NU0ZJWEVEMzJFTlRSWS5maWVsZHNfYnlfbmFtZVsndmFsdWUnXS5tZXNzYWdlX3R5cGUgPSBfVEVTVElOVElOVE1BUAorX1RFU1RNQVBTX01TRklYRUQzMkVOVFJZLmNvbnRhaW5pbmdfdHlwZSA9IF9URVNUTUFQUworX1RFU1RNQVBTX01TRklYRUQ2NEVOVFJZLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddLm1lc3NhZ2VfdHlwZSA9IF9URVNUSU5USU5UTUFQCitfVEVTVE1BUFNfTVNGSVhFRDY0RU5UUlkuY29udGFpbmluZ190eXBlID0gX1RFU1RNQVBTCitfVEVTVE1BUFNfTUJPT0xFTlRSWS5maWVsZHNfYnlfbmFtZVsndmFsdWUnXS5tZXNzYWdlX3R5cGUgPSBfVEVTVElOVElOVE1BUAorX1RFU1RNQVBTX01CT09MRU5UUlkuY29udGFpbmluZ190eXBlID0gX1RFU1RNQVBTCitfVEVTVE1BUFNfTVNUUklOR0VOVFJZLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddLm1lc3NhZ2VfdHlwZSA9IF9URVNUSU5USU5UTUFQCitfVEVTVE1BUFNfTVNUUklOR0VOVFJZLmNvbnRhaW5pbmdfdHlwZSA9IF9URVNUTUFQUworX1RFU1RNQVBTLmZpZWxkc19ieV9uYW1lWydtX2ludDMyJ10ubWVzc2FnZV90eXBlID0gX1RFU1RNQVBTX01JTlQzMkVOVFJZCitfVEVTVE1BUFMuZmllbGRzX2J5X25hbWVbJ21faW50NjQnXS5tZXNzYWdlX3R5cGUgPSBfVEVTVE1BUFNfTUlOVDY0RU5UUlkKK19URVNUTUFQUy5maWVsZHNfYnlfbmFtZVsnbV91aW50MzInXS5tZXNzYWdlX3R5cGUgPSBfVEVTVE1BUFNfTVVJTlQzMkVOVFJZCitfVEVTVE1BUFMuZmllbGRzX2J5X25hbWVbJ21fdWludDY0J10ubWVzc2FnZV90eXBlID0gX1RFU1RNQVBTX01VSU5UNjRFTlRSWQorX1RFU1RNQVBTLmZpZWxkc19ieV9uYW1lWydtX3NpbnQzMiddLm1lc3NhZ2VfdHlwZSA9IF9URVNUTUFQU19NU0lOVDMyRU5UUlkKK19URVNUTUFQUy5maWVsZHNfYnlfbmFtZVsnbV9zaW50NjQnXS5tZXNzYWdlX3R5cGUgPSBfVEVTVE1BUFNfTVNJTlQ2NEVOVFJZCitfVEVTVE1BUFMuZmllbGRzX2J5X25hbWVbJ21fZml4ZWQzMiddLm1lc3NhZ2VfdHlwZSA9IF9URVNUTUFQU19NRklYRUQzMkVOVFJZCitfVEVTVE1BUFMuZmllbGRzX2J5X25hbWVbJ21fZml4ZWQ2NCddLm1lc3NhZ2VfdHlwZSA9IF9URVNUTUFQU19NRklYRUQ2NEVOVFJZCitfVEVTVE1BUFMuZmllbGRzX2J5X25hbWVbJ21fc2ZpeGVkMzInXS5tZXNzYWdlX3R5cGUgPSBfVEVTVE1BUFNfTVNGSVhFRDMyRU5UUlkKK19URVNUTUFQUy5maWVsZHNfYnlfbmFtZVsnbV9zZml4ZWQ2NCddLm1lc3NhZ2VfdHlwZSA9IF9URVNUTUFQU19NU0ZJWEVENjRFTlRSWQorX1RFU1RNQVBTLmZpZWxkc19ieV9uYW1lWydtX2Jvb2wnXS5tZXNzYWdlX3R5cGUgPSBfVEVTVE1BUFNfTUJPT0xFTlRSWQorX1RFU1RNQVBTLmZpZWxkc19ieV9uYW1lWydtX3N0cmluZyddLm1lc3NhZ2VfdHlwZSA9IF9URVNUTUFQU19NU1RSSU5HRU5UUlkKK19URVNUU1VCTUVTU0FHRU1BUFMuZmllbGRzX2J5X25hbWVbJ20nXS5tZXNzYWdlX3R5cGUgPSBfVEVTVE1BUFMKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydUZXN0RW51bU1hcCddID0gX1RFU1RFTlVNTUFQCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnVGVzdEVudW1NYXBQbHVzRXh0cmEnXSA9IF9URVNURU5VTU1BUFBMVVNFWFRSQQorREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ1Rlc3RJbXBvcnRFbnVtTWFwJ10gPSBfVEVTVElNUE9SVEVOVU1NQVAKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydUZXN0SW50SW50TWFwJ10gPSBfVEVTVElOVElOVE1BUAorREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ1Rlc3RNYXBzJ10gPSBfVEVTVE1BUFMKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydUZXN0U3VibWVzc2FnZU1hcHMnXSA9IF9URVNUU1VCTUVTU0FHRU1BUFMKK0RFU0NSSVBUT1IuZW51bV90eXBlc19ieV9uYW1lWydQcm90bzJNYXBFbnVtJ10gPSBfUFJPVE8yTUFQRU5VTQorREVTQ1JJUFRPUi5lbnVtX3R5cGVzX2J5X25hbWVbJ1Byb3RvMk1hcEVudW1QbHVzRXh0cmEnXSA9IF9QUk9UTzJNQVBFTlVNUExVU0VYVFJBCitfc3ltX2RiLlJlZ2lzdGVyRmlsZURlc2NyaXB0b3IoREVTQ1JJUFRPUikKKworVGVzdEVudW1NYXAgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdUZXN0RW51bU1hcCcsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKworICAnS25vd25NYXBGaWVsZEVudHJ5JyA6IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0tub3duTWFwRmllbGRFbnRyeScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfVEVTVEVOVU1NQVBfS05PV05NQVBGSUVMREVOVFJZLAorICAgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYubWFwX3Byb3RvMl91bml0dGVzdF9wYjInCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cHJvdG9idWZfdW5pdHRlc3QuVGVzdEVudW1NYXAuS25vd25NYXBGaWVsZEVudHJ5KQorICAgIH0pCisgICwKKworICAnVW5rbm93bk1hcEZpZWxkRW50cnknIDogX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnVW5rbm93bk1hcEZpZWxkRW50cnknLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICAgJ0RFU0NSSVBUT1InIDogX1RFU1RFTlVNTUFQX1VOS05PV05NQVBGSUVMREVOVFJZLAorICAgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYubWFwX3Byb3RvMl91bml0dGVzdF9wYjInCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cHJvdG9idWZfdW5pdHRlc3QuVGVzdEVudW1NYXAuVW5rbm93bk1hcEZpZWxkRW50cnkpCisgICAgfSkKKyAgLAorICAnREVTQ1JJUFRPUicgOiBfVEVTVEVOVU1NQVAsCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYubWFwX3Byb3RvMl91bml0dGVzdF9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RFbnVtTWFwKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoVGVzdEVudW1NYXApCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShUZXN0RW51bU1hcC5Lbm93bk1hcEZpZWxkRW50cnkpCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShUZXN0RW51bU1hcC5Vbmtub3duTWFwRmllbGRFbnRyeSkKKworVGVzdEVudW1NYXBQbHVzRXh0cmEgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdUZXN0RW51bU1hcFBsdXNFeHRyYScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKworICAnS25vd25NYXBGaWVsZEVudHJ5JyA6IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0tub3duTWFwRmllbGRFbnRyeScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfVEVTVEVOVU1NQVBQTFVTRVhUUkFfS05PV05NQVBGSUVMREVOVFJZLAorICAgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYubWFwX3Byb3RvMl91bml0dGVzdF9wYjInCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cHJvdG9idWZfdW5pdHRlc3QuVGVzdEVudW1NYXBQbHVzRXh0cmEuS25vd25NYXBGaWVsZEVudHJ5KQorICAgIH0pCisgICwKKworICAnVW5rbm93bk1hcEZpZWxkRW50cnknIDogX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnVW5rbm93bk1hcEZpZWxkRW50cnknLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICAgJ0RFU0NSSVBUT1InIDogX1RFU1RFTlVNTUFQUExVU0VYVFJBX1VOS05PV05NQVBGSUVMREVOVFJZLAorICAgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYubWFwX3Byb3RvMl91bml0dGVzdF9wYjInCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cHJvdG9idWZfdW5pdHRlc3QuVGVzdEVudW1NYXBQbHVzRXh0cmEuVW5rbm93bk1hcEZpZWxkRW50cnkpCisgICAgfSkKKyAgLAorICAnREVTQ1JJUFRPUicgOiBfVEVTVEVOVU1NQVBQTFVTRVhUUkEsCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYubWFwX3Byb3RvMl91bml0dGVzdF9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RFbnVtTWFwUGx1c0V4dHJhKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoVGVzdEVudW1NYXBQbHVzRXh0cmEpCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShUZXN0RW51bU1hcFBsdXNFeHRyYS5Lbm93bk1hcEZpZWxkRW50cnkpCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShUZXN0RW51bU1hcFBsdXNFeHRyYS5Vbmtub3duTWFwRmllbGRFbnRyeSkKKworVGVzdEltcG9ydEVudW1NYXAgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdUZXN0SW1wb3J0RW51bU1hcCcsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKworICAnSW1wb3J0RW51bUFtcEVudHJ5JyA6IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0ltcG9ydEVudW1BbXBFbnRyeScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfVEVTVElNUE9SVEVOVU1NQVBfSU1QT1JURU5VTUFNUEVOVFJZLAorICAgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYubWFwX3Byb3RvMl91bml0dGVzdF9wYjInCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cHJvdG9idWZfdW5pdHRlc3QuVGVzdEltcG9ydEVudW1NYXAuSW1wb3J0RW51bUFtcEVudHJ5KQorICAgIH0pCisgICwKKyAgJ0RFU0NSSVBUT1InIDogX1RFU1RJTVBPUlRFTlVNTUFQLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLm1hcF9wcm90bzJfdW5pdHRlc3RfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpwcm90b2J1Zl91bml0dGVzdC5UZXN0SW1wb3J0RW51bU1hcCkKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKFRlc3RJbXBvcnRFbnVtTWFwKQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoVGVzdEltcG9ydEVudW1NYXAuSW1wb3J0RW51bUFtcEVudHJ5KQorCitUZXN0SW50SW50TWFwID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnVGVzdEludEludE1hcCcsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKworICAnTUVudHJ5JyA6IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ01FbnRyeScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfVEVTVElOVElOVE1BUF9NRU5UUlksCisgICAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5tYXBfcHJvdG8yX3VuaXR0ZXN0X3BiMicKKyAgICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpwcm90b2J1Zl91bml0dGVzdC5UZXN0SW50SW50TWFwLk1FbnRyeSkKKyAgICB9KQorICAsCisgICdERVNDUklQVE9SJyA6IF9URVNUSU5USU5UTUFQLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLm1hcF9wcm90bzJfdW5pdHRlc3RfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpwcm90b2J1Zl91bml0dGVzdC5UZXN0SW50SW50TWFwKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoVGVzdEludEludE1hcCkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKFRlc3RJbnRJbnRNYXAuTUVudHJ5KQorCitUZXN0TWFwcyA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ1Rlc3RNYXBzJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworCisgICdNSW50MzJFbnRyeScgOiBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdNSW50MzJFbnRyeScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfVEVTVE1BUFNfTUlOVDMyRU5UUlksCisgICAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5tYXBfcHJvdG8yX3VuaXR0ZXN0X3BiMicKKyAgICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpwcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcy5NSW50MzJFbnRyeSkKKyAgICB9KQorICAsCisKKyAgJ01JbnQ2NEVudHJ5JyA6IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ01JbnQ2NEVudHJ5JywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAgICdERVNDUklQVE9SJyA6IF9URVNUTUFQU19NSU5UNjRFTlRSWSwKKyAgICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLm1hcF9wcm90bzJfdW5pdHRlc3RfcGIyJworICAgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1JbnQ2NEVudHJ5KQorICAgIH0pCisgICwKKworICAnTVVpbnQzMkVudHJ5JyA6IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ01VaW50MzJFbnRyeScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfVEVTVE1BUFNfTVVJTlQzMkVOVFJZLAorICAgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYubWFwX3Byb3RvMl91bml0dGVzdF9wYjInCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVVpbnQzMkVudHJ5KQorICAgIH0pCisgICwKKworICAnTVVpbnQ2NEVudHJ5JyA6IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ01VaW50NjRFbnRyeScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfVEVTVE1BUFNfTVVJTlQ2NEVOVFJZLAorICAgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYubWFwX3Byb3RvMl91bml0dGVzdF9wYjInCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVVpbnQ2NEVudHJ5KQorICAgIH0pCisgICwKKworICAnTVNpbnQzMkVudHJ5JyA6IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ01TaW50MzJFbnRyeScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfVEVTVE1BUFNfTVNJTlQzMkVOVFJZLAorICAgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYubWFwX3Byb3RvMl91bml0dGVzdF9wYjInCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVNpbnQzMkVudHJ5KQorICAgIH0pCisgICwKKworICAnTVNpbnQ2NEVudHJ5JyA6IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ01TaW50NjRFbnRyeScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfVEVTVE1BUFNfTVNJTlQ2NEVOVFJZLAorICAgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYubWFwX3Byb3RvMl91bml0dGVzdF9wYjInCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTVNpbnQ2NEVudHJ5KQorICAgIH0pCisgICwKKworICAnTUZpeGVkMzJFbnRyeScgOiBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdNRml4ZWQzMkVudHJ5JywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAgICdERVNDUklQVE9SJyA6IF9URVNUTUFQU19NRklYRUQzMkVOVFJZLAorICAgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYubWFwX3Byb3RvMl91bml0dGVzdF9wYjInCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTUZpeGVkMzJFbnRyeSkKKyAgICB9KQorICAsCisKKyAgJ01GaXhlZDY0RW50cnknIDogX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnTUZpeGVkNjRFbnRyeScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfVEVTVE1BUFNfTUZJWEVENjRFTlRSWSwKKyAgICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLm1hcF9wcm90bzJfdW5pdHRlc3RfcGIyJworICAgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1GaXhlZDY0RW50cnkpCisgICAgfSkKKyAgLAorCisgICdNU2ZpeGVkMzJFbnRyeScgOiBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdNU2ZpeGVkMzJFbnRyeScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfVEVTVE1BUFNfTVNGSVhFRDMyRU5UUlksCisgICAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5tYXBfcHJvdG8yX3VuaXR0ZXN0X3BiMicKKyAgICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpwcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwcy5NU2ZpeGVkMzJFbnRyeSkKKyAgICB9KQorICAsCisKKyAgJ01TZml4ZWQ2NEVudHJ5JyA6IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ01TZml4ZWQ2NEVudHJ5JywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAgICdERVNDUklQVE9SJyA6IF9URVNUTUFQU19NU0ZJWEVENjRFTlRSWSwKKyAgICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLm1hcF9wcm90bzJfdW5pdHRlc3RfcGIyJworICAgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1TZml4ZWQ2NEVudHJ5KQorICAgIH0pCisgICwKKworICAnTUJvb2xFbnRyeScgOiBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdNQm9vbEVudHJ5JywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAgICdERVNDUklQVE9SJyA6IF9URVNUTUFQU19NQk9PTEVOVFJZLAorICAgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYubWFwX3Byb3RvMl91bml0dGVzdF9wYjInCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMuTUJvb2xFbnRyeSkKKyAgICB9KQorICAsCisKKyAgJ01TdHJpbmdFbnRyeScgOiBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdNU3RyaW5nRW50cnknLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICAgJ0RFU0NSSVBUT1InIDogX1RFU1RNQVBTX01TVFJJTkdFTlRSWSwKKyAgICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLm1hcF9wcm90bzJfdW5pdHRlc3RfcGIyJworICAgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXBzLk1TdHJpbmdFbnRyeSkKKyAgICB9KQorICAsCisgICdERVNDUklQVE9SJyA6IF9URVNUTUFQUywKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5tYXBfcHJvdG8yX3VuaXR0ZXN0X3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcHMpCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShUZXN0TWFwcykKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKFRlc3RNYXBzLk1JbnQzMkVudHJ5KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoVGVzdE1hcHMuTUludDY0RW50cnkpCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShUZXN0TWFwcy5NVWludDMyRW50cnkpCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShUZXN0TWFwcy5NVWludDY0RW50cnkpCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShUZXN0TWFwcy5NU2ludDMyRW50cnkpCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShUZXN0TWFwcy5NU2ludDY0RW50cnkpCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShUZXN0TWFwcy5NRml4ZWQzMkVudHJ5KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoVGVzdE1hcHMuTUZpeGVkNjRFbnRyeSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKFRlc3RNYXBzLk1TZml4ZWQzMkVudHJ5KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoVGVzdE1hcHMuTVNmaXhlZDY0RW50cnkpCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShUZXN0TWFwcy5NQm9vbEVudHJ5KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoVGVzdE1hcHMuTVN0cmluZ0VudHJ5KQorCitUZXN0U3VibWVzc2FnZU1hcHMgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdUZXN0U3VibWVzc2FnZU1hcHMnLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICdERVNDUklQVE9SJyA6IF9URVNUU1VCTUVTU0FHRU1BUFMsCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYubWFwX3Byb3RvMl91bml0dGVzdF9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RTdWJtZXNzYWdlTWFwcykKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKFRlc3RTdWJtZXNzYWdlTWFwcykKKworCitERVNDUklQVE9SLl9vcHRpb25zID0gTm9uZQorX1RFU1RFTlVNTUFQX0tOT1dOTUFQRklFTERFTlRSWS5fb3B0aW9ucyA9IE5vbmUKK19URVNURU5VTU1BUF9VTktOT1dOTUFQRklFTERFTlRSWS5fb3B0aW9ucyA9IE5vbmUKK19URVNURU5VTU1BUFBMVVNFWFRSQV9LTk9XTk1BUEZJRUxERU5UUlkuX29wdGlvbnMgPSBOb25lCitfVEVTVEVOVU1NQVBQTFVTRVhUUkFfVU5LTk9XTk1BUEZJRUxERU5UUlkuX29wdGlvbnMgPSBOb25lCitfVEVTVElNUE9SVEVOVU1NQVBfSU1QT1JURU5VTUFNUEVOVFJZLl9vcHRpb25zID0gTm9uZQorX1RFU1RJTlRJTlRNQVBfTUVOVFJZLl9vcHRpb25zID0gTm9uZQorX1RFU1RNQVBTX01JTlQzMkVOVFJZLl9vcHRpb25zID0gTm9uZQorX1RFU1RNQVBTX01JTlQ2NEVOVFJZLl9vcHRpb25zID0gTm9uZQorX1RFU1RNQVBTX01VSU5UMzJFTlRSWS5fb3B0aW9ucyA9IE5vbmUKK19URVNUTUFQU19NVUlOVDY0RU5UUlkuX29wdGlvbnMgPSBOb25lCitfVEVTVE1BUFNfTVNJTlQzMkVOVFJZLl9vcHRpb25zID0gTm9uZQorX1RFU1RNQVBTX01TSU5UNjRFTlRSWS5fb3B0aW9ucyA9IE5vbmUKK19URVNUTUFQU19NRklYRUQzMkVOVFJZLl9vcHRpb25zID0gTm9uZQorX1RFU1RNQVBTX01GSVhFRDY0RU5UUlkuX29wdGlvbnMgPSBOb25lCitfVEVTVE1BUFNfTVNGSVhFRDMyRU5UUlkuX29wdGlvbnMgPSBOb25lCitfVEVTVE1BUFNfTVNGSVhFRDY0RU5UUlkuX29wdGlvbnMgPSBOb25lCitfVEVTVE1BUFNfTUJPT0xFTlRSWS5fb3B0aW9ucyA9IE5vbmUKK19URVNUTUFQU19NU1RSSU5HRU5UUlkuX29wdGlvbnMgPSBOb25lCisjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtb2R1bGVfc2NvcGUpCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjNjgwMgotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5weQpAQCAtMCwwICsxLDQyNCBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjIFRPRE8ocm9iaW5zb24pOiBXZSBzaG91bGQganVzdCBtYWtlIHRoZXNlIG1ldGhvZHMgYWxsICJwdXJlLXZpcnR1YWwiIGFuZCBtb3ZlCisjIGFsbCBpbXBsZW1lbnRhdGlvbiBvdXQsIGludG8gcmVmbGVjdGlvbi5weSBmb3Igbm93LgorCisKKyIiIkNvbnRhaW5zIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHByb3RvY29sIG1lc3NhZ2VzLiIiIgorCitfX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJworCitjbGFzcyBFcnJvcihFeGNlcHRpb24pOgorICAiIiJCYXNlIGVycm9yIHR5cGUgZm9yIHRoaXMgbW9kdWxlLiIiIgorICBwYXNzCisKKworY2xhc3MgRGVjb2RlRXJyb3IoRXJyb3IpOgorICAiIiJFeGNlcHRpb24gcmFpc2VkIHdoZW4gZGVzZXJpYWxpemluZyBtZXNzYWdlcy4iIiIKKyAgcGFzcworCisKK2NsYXNzIEVuY29kZUVycm9yKEVycm9yKToKKyAgIiIiRXhjZXB0aW9uIHJhaXNlZCB3aGVuIHNlcmlhbGl6aW5nIG1lc3NhZ2VzLiIiIgorICBwYXNzCisKKworY2xhc3MgTWVzc2FnZShvYmplY3QpOgorCisgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHByb3RvY29sIG1lc3NhZ2VzLgorCisgIFByb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyBhcmUgYWxtb3N0IGFsd2F5cyBnZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sCisgIGNvbXBpbGVyLiAgVGhlc2UgZ2VuZXJhdGVkIHR5cGVzIHN1YmNsYXNzIE1lc3NhZ2UgYW5kIGltcGxlbWVudCB0aGUgbWV0aG9kcworICBzaG93biBiZWxvdy4KKyAgIiIiCisKKyAgIyBUT0RPKHJvYmluc29uKTogTGluayB0byBhbiBIVE1MIGRvY3VtZW50IGhlcmUuCisKKyAgIyBUT0RPKHJvYmluc29uKTogRG9jdW1lbnQgdGhhdCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB3aWxsIGFsc28KKyAgIyBoYXZlIGFuIEV4dGVuc2lvbnMgYXR0cmlidXRlIHdpdGggX19nZXRpdGVtX18gYW5kIF9fc2V0aXRlbV9fLgorICAjIEFnYWluLCBub3Qgc3VyZSBob3cgdG8gYmVzdCBjb252ZXkgdGhpcy4KKworICAjIFRPRE8ocm9iaW5zb24pOiBEb2N1bWVudCB0aGF0IHRoZSBjbGFzcyBtdXN0IGFsc28gaGF2ZSBhIHN0YXRpYworICAjICAgUmVnaXN0ZXJFeHRlbnNpb24oZXh0ZW5zaW9uX2ZpZWxkKSBtZXRob2QuCisgICMgICBOb3Qgc3VyZSBob3cgdG8gYmVzdCBleHByZXNzIGF0IHRoaXMgcG9pbnQuCisKKyAgIyBUT0RPKHJvYmluc29uKTogRG9jdW1lbnQgdGhlc2UgZmllbGRzIGFuZCBtZXRob2RzLgorCisgIF9fc2xvdHNfXyA9IFtdCisKKyAgIzogVGhlIDpjbGFzczpgZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3IuRGVzY3JpcHRvcmAgZm9yIHRoaXMgbWVzc2FnZSB0eXBlLgorICBERVNDUklQVE9SID0gTm9uZQorCisgIGRlZiBfX2RlZXBjb3B5X18oc2VsZiwgbWVtbz1Ob25lKToKKyAgICBjbG9uZSA9IHR5cGUoc2VsZikoKQorICAgIGNsb25lLk1lcmdlRnJvbShzZWxmKQorICAgIHJldHVybiBjbG9uZQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXJfbXNnKToKKyAgICAiIiJSZWN1cnNpdmVseSBjb21wYXJlcyB0d28gbWVzc2FnZXMgYnkgdmFsdWUgYW5kIHN0cnVjdHVyZS4iIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcl9tc2cpOgorICAgICMgQ2FuJ3QganVzdCBzYXkgc2VsZiAhPSBvdGhlcl9tc2csIHNpbmNlIHRoYXQgd291bGQgaW5maW5pdGVseSByZWN1cnNlLiA6KQorICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcl9tc2cKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgcmFpc2UgVHlwZUVycm9yKCd1bmhhc2hhYmxlIG9iamVjdCcpCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgIiIiT3V0cHV0cyBhIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlLiIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgIiIiT3V0cHV0cyBhIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlLiIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgTWVyZ2VGcm9tKHNlbGYsIG90aGVyX21zZyk6CisgICAgIiIiTWVyZ2VzIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgaW50byBjdXJyZW50IG1lc3NhZ2UuCisKKyAgICBUaGlzIG1ldGhvZCBtZXJnZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpbnRvIHRoZSBjdXJyZW50CisgICAgbWVzc2FnZS4gU2luZ3VsYXIgZmllbGRzIHRoYXQgYXJlIHNldCBpbiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2Ugb3ZlcndyaXRlCisgICAgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIHRoZSBjdXJyZW50IG1lc3NhZ2UuIFJlcGVhdGVkIGZpZWxkcyBhcmUKKyAgICBhcHBlbmRlZC4gU2luZ3VsYXIgc3ViLW1lc3NhZ2VzIGFuZCBncm91cHMgYXJlIHJlY3Vyc2l2ZWx5IG1lcmdlZC4KKworICAgIEFyZ3M6CisgICAgICBvdGhlcl9tc2cgKE1lc3NhZ2UpOiBBIG1lc3NhZ2UgdG8gbWVyZ2UgaW50byB0aGUgY3VycmVudCBtZXNzYWdlLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgQ29weUZyb20oc2VsZiwgb3RoZXJfbXNnKToKKyAgICAiIiJDb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4KKworICAgIFRoZSBtZXRob2QgY2xlYXJzIHRoZSBjdXJyZW50IG1lc3NhZ2UgYW5kIHRoZW4gbWVyZ2VzIHRoZSBzcGVjaWZpZWQKKyAgICBtZXNzYWdlIHVzaW5nIE1lcmdlRnJvbS4KKworICAgIEFyZ3M6CisgICAgICBvdGhlcl9tc2cgKE1lc3NhZ2UpOiBBIG1lc3NhZ2UgdG8gY29weSBpbnRvIHRoZSBjdXJyZW50IG9uZS4KKyAgICAiIiIKKyAgICBpZiBzZWxmIGlzIG90aGVyX21zZzoKKyAgICAgIHJldHVybgorICAgIHNlbGYuQ2xlYXIoKQorICAgIHNlbGYuTWVyZ2VGcm9tKG90aGVyX21zZykKKworICBkZWYgQ2xlYXIoc2VsZik6CisgICAgIiIiQ2xlYXJzIGFsbCBkYXRhIHRoYXQgd2FzIHNldCBpbiB0aGUgbWVzc2FnZS4iIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIFNldEluUGFyZW50KHNlbGYpOgorICAgICIiIk1hcmsgdGhpcyBhcyBwcmVzZW50IGluIHRoZSBwYXJlbnQuCisKKyAgICBUaGlzIG5vcm1hbGx5IGhhcHBlbnMgYXV0b21hdGljYWxseSB3aGVuIHlvdSBhc3NpZ24gYSBmaWVsZCBvZiBhCisgICAgc3ViLW1lc3NhZ2UsIGJ1dCBzb21ldGltZXMgeW91IHdhbnQgdG8gbWFrZSB0aGUgc3ViLW1lc3NhZ2UKKyAgICBwcmVzZW50IHdoaWxlIGtlZXBpbmcgaXQgZW1wdHkuICBJZiB5b3UgZmluZCB5b3Vyc2VsZiB1c2luZyB0aGlzLAorICAgIHlvdSBtYXkgd2FudCB0byByZWNvbnNpZGVyIHlvdXIgZGVzaWduLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgSXNJbml0aWFsaXplZChzZWxmKToKKyAgICAiIiJDaGVja3MgaWYgdGhlIG1lc3NhZ2UgaXMgaW5pdGlhbGl6ZWQuCisKKyAgICBSZXR1cm5zOgorICAgICAgYm9vbDogVGhlIG1ldGhvZCByZXR1cm5zIFRydWUgaWYgdGhlIG1lc3NhZ2UgaXMgaW5pdGlhbGl6ZWQgKGkuZS4gYWxsIG9mCisgICAgICBpdHMgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAjIFRPRE8ocm9iaW5zb24pOiBNZXJnZUZyb21TdHJpbmcoKSBzaG91bGQgcHJvYmFibHkgcmV0dXJuIE5vbmUgYW5kIGJlCisgICMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgYSBoZWxwZXIgdGhhdCByZXR1cm5zIHRoZSAjIG9mIGJ5dGVzIHJlYWQuICBPdXIKKyAgIyBkZXNlcmlhbGl6YXRpb24gcm91dGluZXMgd291bGQgdXNlIHRoZSBoZWxwZXIgd2hlbiByZWN1cnNpdmVseQorICAjIGRlc2VyaWFsaXppbmcsIGJ1dCB0aGUgZW5kIHVzZXIgd291bGQgYWxtb3N0IGFsd2F5cyBqdXN0IHdhbnQgdGhlIG5vLXJldHVybgorICAjIE1lcmdlRnJvbVN0cmluZygpLgorCisgIGRlZiBNZXJnZUZyb21TdHJpbmcoc2VsZiwgc2VyaWFsaXplZCk6CisgICAgIiIiTWVyZ2VzIHNlcmlhbGl6ZWQgcHJvdG9jb2wgYnVmZmVyIGRhdGEgaW50byB0aGlzIG1lc3NhZ2UuCisKKyAgICBXaGVuIHdlIGZpbmQgYSBmaWVsZCBpbiBgc2VyaWFsaXplZGAgdGhhdCBpcyBhbHJlYWR5IHByZXNlbnQKKyAgICBpbiB0aGlzIG1lc3NhZ2U6CisKKyAgICAtICAgSWYgaXQncyBhICJyZXBlYXRlZCIgZmllbGQsIHdlIGFwcGVuZCB0byB0aGUgZW5kIG9mIG91ciBsaXN0LgorICAgIC0gICBFbHNlLCBpZiBpdCdzIGEgc2NhbGFyLCB3ZSBvdmVyd3JpdGUgb3VyIGZpZWxkLgorICAgIC0gICBFbHNlLCAoaXQncyBhIG5vbnJlcGVhdGVkIGNvbXBvc2l0ZSksIHdlIHJlY3Vyc2l2ZWx5IG1lcmdlCisgICAgICAgIGludG8gdGhlIGV4aXN0aW5nIGNvbXBvc2l0ZS4KKworICAgIEFyZ3M6CisgICAgICBzZXJpYWxpemVkIChieXRlcyk6IEFueSBvYmplY3QgdGhhdCBhbGxvd3MgdXMgdG8gY2FsbAorICAgICAgICBgYG1lbW9yeXZpZXcoc2VyaWFsaXplZClgYCB0byBhY2Nlc3MgYSBzdHJpbmcgb2YgYnl0ZXMgdXNpbmcgdGhlCisgICAgICAgIGJ1ZmZlciBpbnRlcmZhY2UuCisKKyAgICBSZXR1cm5zOgorICAgICAgaW50OiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBgc2VyaWFsaXplZGAuCisgICAgICBGb3Igbm9uLWdyb3VwIG1lc3NhZ2VzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIGBsZW4oc2VyaWFsaXplZClgLAorICAgICAgYnV0IGZvciBtZXNzYWdlcyB3aGljaCBhcmUgYWN0dWFsbHkgZ3JvdXBzLCB0aGlzIHdpbGwKKyAgICAgIGdlbmVyYWxseSBiZSBsZXNzIHRoYW4gYGxlbihzZXJpYWxpemVkKWAsIHNpbmNlIHdlIG11c3QKKyAgICAgIHN0b3Agd2hlbiB3ZSByZWFjaCBhbiBgYEVORF9HUk9VUGBgIHRhZy4gIE5vdGUgdGhhdCBpZgorICAgICAgd2UgKmRvKiBzdG9wIGJlY2F1c2Ugb2YgYW4gYGBFTkRfR1JPVVBgYCB0YWcsIHRoZSBudW1iZXIKKyAgICAgIG9mIGJ5dGVzIHJldHVybmVkIGRvZXMgbm90IGluY2x1ZGUgdGhlIGJ5dGVzCisgICAgICBmb3IgdGhlIGBgRU5EX0dST1VQYGAgdGFnIGluZm9ybWF0aW9uLgorCisgICAgUmFpc2VzOgorICAgICAgRGVjb2RlRXJyb3I6IGlmIHRoZSBpbnB1dCBjYW5ub3QgYmUgcGFyc2VkLgorICAgICIiIgorICAgICMgVE9ETyhyb2JpbnNvbik6IERvY3VtZW50IGhhbmRsaW5nIG9mIHVua25vd24gZmllbGRzLgorICAgICMgVE9ETyhyb2JpbnNvbik6IFdoZW4gd2Ugc3dpdGNoIHRvIGEgaGVscGVyLCB0aGlzIHdpbGwgcmV0dXJuIE5vbmUuCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBQYXJzZUZyb21TdHJpbmcoc2VsZiwgc2VyaWFsaXplZCk6CisgICAgIiIiUGFyc2Ugc2VyaWFsaXplZCBwcm90b2NvbCBidWZmZXIgZGF0YSBpbnRvIHRoaXMgbWVzc2FnZS4KKworICAgIExpa2UgOmZ1bmM6YE1lcmdlRnJvbVN0cmluZygpYCwgZXhjZXB0IHdlIGNsZWFyIHRoZSBvYmplY3QgZmlyc3QuCisKKyAgICBSYWlzZXM6CisgICAgICBtZXNzYWdlLkRlY29kZUVycm9yIGlmIHRoZSBpbnB1dCBjYW5ub3QgYmUgcGFyc2VkLgorICAgICIiIgorICAgIHNlbGYuQ2xlYXIoKQorICAgIHJldHVybiBzZWxmLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorCisgIGRlZiBTZXJpYWxpemVUb1N0cmluZyhzZWxmLCAqKmt3YXJncyk6CisgICAgIiIiU2VyaWFsaXplcyB0aGUgcHJvdG9jb2wgbWVzc2FnZSB0byBhIGJpbmFyeSBzdHJpbmcuCisKKyAgICBLZXl3b3JkIEFyZ3M6CisgICAgICBkZXRlcm1pbmlzdGljIChib29sKTogSWYgdHJ1ZSwgcmVxdWVzdHMgZGV0ZXJtaW5pc3RpYyBzZXJpYWxpemF0aW9uCisgICAgICAgIG9mIHRoZSBwcm90b2J1Ziwgd2l0aCBwcmVkaWN0YWJsZSBvcmRlcmluZyBvZiBtYXAga2V5cy4KKworICAgIFJldHVybnM6CisgICAgICBBIGJpbmFyeSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UgaWYgYWxsIG9mIHRoZSByZXF1aXJlZAorICAgICAgZmllbGRzIGluIHRoZSBtZXNzYWdlIGFyZSBzZXQgKGkuZS4gdGhlIG1lc3NhZ2UgaXMgaW5pdGlhbGl6ZWQpLgorCisgICAgUmFpc2VzOgorICAgICAgRW5jb2RlRXJyb3I6IGlmIHRoZSBtZXNzYWdlIGlzbid0IGluaXRpYWxpemVkIChzZWUgOmZ1bmM6YElzSW5pdGlhbGl6ZWRgKS4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIFNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZyhzZWxmLCAqKmt3YXJncyk6CisgICAgIiIiU2VyaWFsaXplcyB0aGUgcHJvdG9jb2wgbWVzc2FnZSB0byBhIGJpbmFyeSBzdHJpbmcuCisKKyAgICBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIFNlcmlhbGl6ZVRvU3RyaW5nIGJ1dCBkb2Vzbid0IGNoZWNrIGlmIHRoZQorICAgIG1lc3NhZ2UgaXMgaW5pdGlhbGl6ZWQuCisKKyAgICBLZXl3b3JkIEFyZ3M6CisgICAgICBkZXRlcm1pbmlzdGljIChib29sKTogSWYgdHJ1ZSwgcmVxdWVzdHMgZGV0ZXJtaW5pc3RpYyBzZXJpYWxpemF0aW9uCisgICAgICAgIG9mIHRoZSBwcm90b2J1Ziwgd2l0aCBwcmVkaWN0YWJsZSBvcmRlcmluZyBvZiBtYXAga2V5cy4KKworICAgIFJldHVybnM6CisgICAgICBieXRlczogQSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXJ0aWFsIG1lc3NhZ2UuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICMgVE9ETyhyb2JpbnNvbik6IERlY2lkZSB3aGV0aGVyIHdlIGxpa2UgdGhlc2UgYmV0dGVyCisgICMgdGhhbiBhdXRvLWdlbmVyYXRlZCBoYXNfZm9vKCkgYW5kIGNsZWFyX2ZvbygpIG1ldGhvZHMKKyAgIyBvbiB0aGUgaW5zdGFuY2VzIHRoZW1zZWx2ZXMuICBUaGlzIHdheSBpcyBsZXNzIGNvbnNpc3RlbnQKKyAgIyB3aXRoIEMrKywgYnV0IGl0IG1ha2VzIHJlZmxlY3Rpb24tdHlwZSBhY2Nlc3MgZWFzaWVyIGFuZAorICAjIHJlZHVjZXMgdGhlIG51bWJlciBvZiBtYWdpY2FsbHkgYXV0b2dlbmVyYXRlZCB0aGluZ3MuCisgICMKKyAgIyBUT0RPKHJvYmluc29uKTogQmUgc3VyZSB0byBkb2N1bWVudCAoYW5kIHRlc3QpIGV4YWN0bHkKKyAgIyB3aGljaCBmaWVsZCBuYW1lcyBhcmUgYWNjZXB0ZWQgaGVyZS4gIEFyZSB3ZSBjYXNlLXNlbnNpdGl2ZT8KKyAgIyBXaGF0IGRvIHdlIGRvIHdpdGggZmllbGRzIHRoYXQgc2hhcmUgbmFtZXMgd2l0aCBQeXRob24ga2V5d29yZHMKKyAgIyBsaWtlICdsYW1iZGEnIGFuZCAneWllbGQnPworICAjCisgICMgbm5vcndpdHogc2F5czoKKyAgIyAiIiIKKyAgIyBUeXBpY2FsbHkgKGluIHB5dGhvbiksIGFuIHVuZGVyc2NvcmUgaXMgYXBwZW5kZWQgdG8gbmFtZXMgdGhhdCBhcmUKKyAgIyBrZXl3b3Jkcy4gU28gdGhleSB3b3VsZCBiZWNvbWUgbGFtYmRhXyBvciB5aWVsZF8uCisgICMgIiIiCisgIGRlZiBMaXN0RmllbGRzKHNlbGYpOgorICAgICIiIlJldHVybnMgYSBsaXN0IG9mIChGaWVsZERlc2NyaXB0b3IsIHZhbHVlKSB0dXBsZXMgZm9yIHByZXNlbnQgZmllbGRzLgorCisgICAgQSBtZXNzYWdlIGZpZWxkIGlzIG5vbi1lbXB0eSBpZiBIYXNGaWVsZCgpIHdvdWxkIHJldHVybiB0cnVlLiBBIHNpbmd1bGFyCisgICAgcHJpbWl0aXZlIGZpZWxkIGlzIG5vbi1lbXB0eSBpZiBIYXNGaWVsZCgpIHdvdWxkIHJldHVybiB0cnVlIGluIHByb3RvMiBvciBpdAorICAgIGlzIG5vbiB6ZXJvIGluIHByb3RvMy4gQSByZXBlYXRlZCBmaWVsZCBpcyBub24tZW1wdHkgaWYgaXQgY29udGFpbnMgYXQgbGVhc3QKKyAgICBvbmUgZWxlbWVudC4gVGhlIGZpZWxkcyBhcmUgb3JkZXJlZCBieSBmaWVsZCBudW1iZXIuCisKKyAgICBSZXR1cm5zOgorICAgICAgbGlzdFt0dXBsZShGaWVsZERlc2NyaXB0b3IsIHZhbHVlKV06IGZpZWxkIGRlc2NyaXB0b3JzIGFuZCB2YWx1ZXMKKyAgICAgIGZvciBhbGwgZmllbGRzIGluIHRoZSBtZXNzYWdlIHdoaWNoIGFyZSBub3QgZW1wdHkuIFRoZSB2YWx1ZXMgdmFyeSBieQorICAgICAgZmllbGQgdHlwZS4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIEhhc0ZpZWxkKHNlbGYsIGZpZWxkX25hbWUpOgorICAgICIiIkNoZWNrcyBpZiBhIGNlcnRhaW4gZmllbGQgaXMgc2V0IGZvciB0aGUgbWVzc2FnZS4KKworICAgIEZvciBhIG9uZW9mIGdyb3VwLCBjaGVja3MgaWYgYW55IGZpZWxkIGluc2lkZSBpcyBzZXQuIE5vdGUgdGhhdCBpZiB0aGUKKyAgICBmaWVsZF9uYW1lIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBtZXNzYWdlIGRlc2NyaXB0b3IsIDpleGM6YFZhbHVlRXJyb3JgIHdpbGwKKyAgICBiZSByYWlzZWQuCisKKyAgICBBcmdzOgorICAgICAgZmllbGRfbmFtZSAoc3RyKTogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGNoZWNrIGZvciBwcmVzZW5jZS4KKworICAgIFJldHVybnM6CisgICAgICBib29sOiBXaGV0aGVyIGEgdmFsdWUgaGFzIGJlZW4gc2V0IGZvciB0aGUgbmFtZWQgZmllbGQuCisKKyAgICBSYWlzZXM6CisgICAgICBWYWx1ZUVycm9yOiBpZiB0aGUgYGZpZWxkX25hbWVgIGlzIG5vdCBhIG1lbWJlciBvZiB0aGlzIG1lc3NhZ2UuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBDbGVhckZpZWxkKHNlbGYsIGZpZWxkX25hbWUpOgorICAgICIiIkNsZWFycyB0aGUgY29udGVudHMgb2YgYSBnaXZlbiBmaWVsZC4KKworICAgIEluc2lkZSBhIG9uZW9mIGdyb3VwLCBjbGVhcnMgdGhlIGZpZWxkIHNldC4gSWYgdGhlIG5hbWUgbmVpdGhlciByZWZlcnMgdG8gYQorICAgIGRlZmluZWQgZmllbGQgb3Igb25lb2YgZ3JvdXAsIDpleGM6YFZhbHVlRXJyb3JgIGlzIHJhaXNlZC4KKworICAgIEFyZ3M6CisgICAgICBmaWVsZF9uYW1lIChzdHIpOiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gY2hlY2sgZm9yIHByZXNlbmNlLgorCisgICAgUmFpc2VzOgorICAgICAgVmFsdWVFcnJvcjogaWYgdGhlIGBmaWVsZF9uYW1lYCBpcyBub3QgYSBtZW1iZXIgb2YgdGhpcyBtZXNzYWdlLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgV2hpY2hPbmVvZihzZWxmLCBvbmVvZl9ncm91cCk6CisgICAgIiIiUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgdGhhdCBpcyBzZXQgaW5zaWRlIGEgb25lb2YgZ3JvdXAuCisKKyAgICBJZiBubyBmaWVsZCBpcyBzZXQsIHJldHVybnMgTm9uZS4KKworICAgIEFyZ3M6CisgICAgICBvbmVvZl9ncm91cCAoc3RyKTogdGhlIG5hbWUgb2YgdGhlIG9uZW9mIGdyb3VwIHRvIGNoZWNrLgorCisgICAgUmV0dXJuczoKKyAgICAgIHN0ciBvciBOb25lOiBUaGUgbmFtZSBvZiB0aGUgZ3JvdXAgdGhhdCBpcyBzZXQsIG9yIE5vbmUuCisKKyAgICBSYWlzZXM6CisgICAgICBWYWx1ZUVycm9yOiBubyBncm91cCB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cworICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgSGFzRXh0ZW5zaW9uKHNlbGYsIGV4dGVuc2lvbl9oYW5kbGUpOgorICAgICIiIkNoZWNrcyBpZiBhIGNlcnRhaW4gZXh0ZW5zaW9uIGlzIHByZXNlbnQgZm9yIHRoaXMgbWVzc2FnZS4KKworICAgIEV4dGVuc2lvbnMgYXJlIHJldHJpZXZlZCB1c2luZyB0aGUgOmF0dHI6YEV4dGVuc2lvbnNgIG1hcHBpbmcgKGlmIHByZXNlbnQpLgorCisgICAgQXJnczoKKyAgICAgIGV4dGVuc2lvbl9oYW5kbGU6IFRoZSBoYW5kbGUgZm9yIHRoZSBleHRlbnNpb24gdG8gY2hlY2suCisKKyAgICBSZXR1cm5zOgorICAgICAgYm9vbDogV2hldGhlciB0aGUgZXh0ZW5zaW9uIGlzIHByZXNlbnQgZm9yIHRoaXMgbWVzc2FnZS4KKworICAgIFJhaXNlczoKKyAgICAgIEtleUVycm9yOiBpZiB0aGUgZXh0ZW5zaW9uIGlzIHJlcGVhdGVkLiBTaW1pbGFyIHRvIHJlcGVhdGVkIGZpZWxkcywKKyAgICAgICAgdGhlcmUgaXMgbm8gc2VwYXJhdGUgbm90aW9uIG9mIHByZXNlbmNlOiBhICJub3QgcHJlc2VudCIgcmVwZWF0ZWQKKyAgICAgICAgZXh0ZW5zaW9uIGlzIGFuIGVtcHR5IGxpc3QuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBDbGVhckV4dGVuc2lvbihzZWxmLCBleHRlbnNpb25faGFuZGxlKToKKyAgICAiIiJDbGVhcnMgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gZXh0ZW5zaW9uLgorCisgICAgQXJnczoKKyAgICAgIGV4dGVuc2lvbl9oYW5kbGU6IFRoZSBoYW5kbGUgZm9yIHRoZSBleHRlbnNpb24gdG8gY2xlYXIuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBVbmtub3duRmllbGRzKHNlbGYpOgorICAgICIiIlJldHVybnMgdGhlIFVua25vd25GaWVsZFNldC4KKworICAgIFJldHVybnM6CisgICAgICBVbmtub3duRmllbGRTZXQ6IFRoZSB1bmtub3duIGZpZWxkcyBzdG9yZWQgaW4gdGhpcyBtZXNzYWdlLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgRGlzY2FyZFVua25vd25GaWVsZHMoc2VsZik6CisgICAgIiIiQ2xlYXJzIGFsbCBmaWVsZHMgaW4gdGhlIDpjbGFzczpgVW5rbm93bkZpZWxkU2V0YC4KKworICAgIFRoaXMgb3BlcmF0aW9uIGlzIHJlY3Vyc2l2ZSBmb3IgbmVzdGVkIG1lc3NhZ2UuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBCeXRlU2l6ZShzZWxmKToKKyAgICAiIiJSZXR1cm5zIHRoZSBzZXJpYWxpemVkIHNpemUgb2YgdGhpcyBtZXNzYWdlLgorCisgICAgUmVjdXJzaXZlbHkgY2FsbHMgQnl0ZVNpemUoKSBvbiBhbGwgY29udGFpbmVkIG1lc3NhZ2VzLgorCisgICAgUmV0dXJuczoKKyAgICAgIGludDogVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzZXJpYWxpemUgdGhpcyBtZXNzYWdlLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBAY2xhc3NtZXRob2QKKyAgZGVmIEZyb21TdHJpbmcoY2xzLCBzKToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgQHN0YXRpY21ldGhvZAorICBkZWYgUmVnaXN0ZXJFeHRlbnNpb24oZXh0ZW5zaW9uX2hhbmRsZSk6CisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBfU2V0TGlzdGVuZXIoc2VsZiwgbWVzc2FnZV9saXN0ZW5lcik6CisgICAgIiIiSW50ZXJuYWwgbWV0aG9kIHVzZWQgYnkgdGhlIHByb3RvY29sIG1lc3NhZ2UgaW1wbGVtZW50YXRpb24uCisgICAgQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBkaXJlY3RseS4KKworICAgIFNldHMgYSBsaXN0ZW5lciB0aGF0IHRoaXMgbWVzc2FnZSB3aWxsIGNhbGwgb24gY2VydGFpbiBzdGF0ZSB0cmFuc2l0aW9ucy4KKworICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJlZ2lzdGVyIGJhY2stZWRnZXMgZnJvbSBjaGlsZHJlbiB0bworICAgIHBhcmVudHMgYXQgcnVudGltZSwgZm9yIHRoZSBwdXJwb3NlIG9mIHNldHRpbmcgImhhcyIgYml0cyBhbmQKKyAgICBieXRlLXNpemUtZGlydHkgYml0cyBpbiB0aGUgcGFyZW50IGFuZCBhbmNlc3RvciBvYmplY3RzIHdoZW5ldmVyIGEgY2hpbGQgb3IKKyAgICBkZXNjZW5kYW50IG9iamVjdCBpcyBtb2RpZmllZC4KKworICAgIElmIHRoZSBjbGllbnQgd2FudHMgdG8gZGlzY29ubmVjdCB0aGlzIE1lc3NhZ2UgZnJvbSB0aGUgb2JqZWN0IHRyZWUsIHNoZQorICAgIGV4cGxpY2l0bHkgc2V0cyBjYWxsYmFjayB0byBOb25lLgorCisgICAgSWYgbWVzc2FnZV9saXN0ZW5lciBpcyBOb25lLCB1bnJlZ2lzdGVycyBhbnkgZXhpc3RpbmcgbGlzdGVuZXIuICBPdGhlcndpc2UsCisgICAgbWVzc2FnZV9saXN0ZW5lciBtdXN0IGltcGxlbWVudCB0aGUgTWVzc2FnZUxpc3RlbmVyIGludGVyZmFjZSBpbgorICAgIGludGVybmFsL21lc3NhZ2VfbGlzdGVuZXIucHksIGFuZCB3ZSBkaXNjYXJkIGFueSBsaXN0ZW5lciByZWdpc3RlcmVkCisgICAgdmlhIGEgcHJldmlvdXMgX1NldExpc3RlbmVyKCkgY2FsbC4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAiIiJTdXBwb3J0IHRoZSBwaWNrbGUgcHJvdG9jb2wuIiIiCisgICAgcmV0dXJuIGRpY3Qoc2VyaWFsaXplZD1zZWxmLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpKQorCisgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICIiIlN1cHBvcnQgdGhlIHBpY2tsZSBwcm90b2NvbC4iIiIKKyAgICBzZWxmLl9faW5pdF9fKCkKKyAgICBzZXJpYWxpemVkID0gc3RhdGVbJ3NlcmlhbGl6ZWQnXQorICAgICMgT24gUHl0aG9uIDMsIHVzaW5nIGVuY29kaW5nPSdsYXRpbjEnIGlzIHJlcXVpcmVkIGZvciB1bnBpY2tsaW5nCisgICAgIyBwcm90b3MgcGlja2xlZCBieSBQeXRob24gMi4KKyAgICBpZiBub3QgaXNpbnN0YW5jZShzZXJpYWxpemVkLCBieXRlcyk6CisgICAgICBzZXJpYWxpemVkID0gc2VyaWFsaXplZC5lbmNvZGUoJ2xhdGluMScpCisgICAgc2VsZi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKworICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSBzZWxmLkRFU0NSSVBUT1IKKyAgICBpZiBtZXNzYWdlX2Rlc2NyaXB0b3IuY29udGFpbmluZ190eXBlIGlzIE5vbmU6CisgICAgICByZXR1cm4gdHlwZShzZWxmKSwgKCksIHNlbGYuX19nZXRzdGF0ZV9fKCkKKyAgICAjIHRoZSBtZXNzYWdlIHR5cGUgbXVzdCBiZSBuZXN0ZWQuCisgICAgIyBQeXRob24gZG9lcyBub3QgcGlja2xlIG5lc3RlZCBjbGFzc2VzOyB1c2UgdGhlIHN5bWJvbF9kYXRhYmFzZSBvbiB0aGUKKyAgICAjIHJlY2VpdmluZyBlbmQuCisgICAgY29udGFpbmVyID0gbWVzc2FnZV9kZXNjcmlwdG9yCisgICAgcmV0dXJuIChfSW50ZXJuYWxDb25zdHJ1Y3RNZXNzYWdlLCAoY29udGFpbmVyLmZ1bGxfbmFtZSwpLAorICAgICAgICAgICAgc2VsZi5fX2dldHN0YXRlX18oKSkKKworCitkZWYgX0ludGVybmFsQ29uc3RydWN0TWVzc2FnZShmdWxsX25hbWUpOgorICAiIiJDb25zdHJ1Y3RzIGEgbmVzdGVkIG1lc3NhZ2UuIiIiCisgIGZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzeW1ib2xfZGF0YWJhc2UgICMgcHlsaW50OmRpc2FibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAorCisgIHJldHVybiBzeW1ib2xfZGF0YWJhc2UuRGVmYXVsdCgpLkdldFN5bWJvbChmdWxsX25hbWUpKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9mYWN0b3J5LnB5IGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2ZhY3RvcnkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2NTIwNAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9mYWN0b3J5LnB5CkBAIC0wLDAgKzEsMTg5IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlByb3ZpZGVzIGEgZmFjdG9yeSBjbGFzcyBmb3IgZ2VuZXJhdGluZyBkeW5hbWljIG1lc3NhZ2VzLgorCitUaGUgZWFzaWVzdCB3YXkgdG8gdXNlIHRoaXMgY2xhc3MgaXMgaWYgeW91IGhhdmUgYWNjZXNzIHRvIHRoZSBGaWxlRGVzY3JpcHRvcgorcHJvdG9zIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2VzIHlvdSB3YW50IHRvIGNyZWF0ZSB5b3UgY2FuIGp1c3QgZG8gdGhlIGZvbGxvd2luZzoKKworbWVzc2FnZV9jbGFzc2VzID0gbWVzc2FnZV9mYWN0b3J5LkdldE1lc3NhZ2VzKGl0ZXJhYmxlX29mX2ZpbGVfZGVzY3JpcHRvcnMpCitteV9wcm90b19pbnN0YW5jZSA9IG1lc3NhZ2VfY2xhc3Nlc1snc29tZS5wcm90by5wYWNrYWdlLk1lc3NhZ2VOYW1lJ10oKQorIiIiCisKK19fYXV0aG9yX18gPSAnbWF0dGhld3RvaWFAZ29vZ2xlLmNvbSAoTWF0dCBUb2lhKScKKworZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGFwaV9pbXBsZW1lbnRhdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UKKworaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAncHl0aG9uJzoKKyAgZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHB5dGhvbl9tZXNzYWdlIGFzIG1lc3NhZ2VfaW1wbAorZWxzZToKKyAgZnJvbSBnb29nbGUucHJvdG9idWYucHlleHQgaW1wb3J0IGNwcF9tZXNzYWdlIGFzIG1lc3NhZ2VfaW1wbCAgIyBweWxpbnQ6IGRpc2FibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAorCisKKyMgVGhlIHR5cGUgb2YgYWxsIE1lc3NhZ2UgY2xhc3Nlcy4KK19HRU5FUkFURURfUFJPVE9DT0xfTUVTU0FHRV9UWVBFID0gbWVzc2FnZV9pbXBsLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKKworCitjbGFzcyBNZXNzYWdlRmFjdG9yeShvYmplY3QpOgorICAiIiJGYWN0b3J5IGZvciBjcmVhdGluZyBQcm90bzIgbWVzc2FnZXMgZnJvbSBkZXNjcmlwdG9ycyBpbiBhIHBvb2wuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHBvb2w9Tm9uZSk6CisgICAgIiIiSW5pdGlhbGl6ZXMgYSBuZXcgZmFjdG9yeS4iIiIKKyAgICBzZWxmLnBvb2wgPSBwb29sIG9yIGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbCgpCisKKyAgICAjIGxvY2FsIGNhY2hlIG9mIGFsbCBjbGFzc2VzIGJ1aWx0IGZyb20gcHJvdG9idWYgZGVzY3JpcHRvcnMKKyAgICBzZWxmLl9jbGFzc2VzID0ge30KKworICBkZWYgR2V0UHJvdG90eXBlKHNlbGYsIGRlc2NyaXB0b3IpOgorICAgICIiIk9idGFpbnMgYSBwcm90bzIgbWVzc2FnZSBjbGFzcyBiYXNlZCBvbiB0aGUgcGFzc2VkIGluIGRlc2NyaXB0b3IuCisKKyAgICBQYXNzaW5nIGEgZGVzY3JpcHRvciB3aXRoIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgbWF0Y2hpbmcgYSBwcmV2aW91cworICAgIGludm9jYXRpb24gd2lsbCBjYXVzZSB0aGUgc2FtZSBjbGFzcyB0byBiZSByZXR1cm5lZC4KKworICAgIEFyZ3M6CisgICAgICBkZXNjcmlwdG9yOiBUaGUgZGVzY3JpcHRvciB0byBidWlsZCBmcm9tLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgY2xhc3MgZGVzY3JpYmluZyB0aGUgcGFzc2VkIGluIGRlc2NyaXB0b3IuCisgICAgIiIiCisgICAgaWYgZGVzY3JpcHRvciBub3QgaW4gc2VsZi5fY2xhc3NlczoKKyAgICAgIHJlc3VsdF9jbGFzcyA9IHNlbGYuQ3JlYXRlUHJvdG90eXBlKGRlc2NyaXB0b3IpCisgICAgICAjIFRoZSBhc3NpZ25tZW50IHRvIF9jbGFzc2VzIGlzIHJlZHVuZGFudCBmb3IgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24sIGJ1dAorICAgICAgIyBtaWdodCBhdm9pZCBjb25mdXNpb24gaW4gY2FzZXMgd2hlcmUgQ3JlYXRlUHJvdG90eXBlIGdldHMgb3ZlcnJpZGRlbiBhbmQKKyAgICAgICMgZG9lcyBub3QgY2FsbCB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgIHNlbGYuX2NsYXNzZXNbZGVzY3JpcHRvcl0gPSByZXN1bHRfY2xhc3MKKyAgICAgIHJldHVybiByZXN1bHRfY2xhc3MKKyAgICByZXR1cm4gc2VsZi5fY2xhc3Nlc1tkZXNjcmlwdG9yXQorCisgIGRlZiBDcmVhdGVQcm90b3R5cGUoc2VsZiwgZGVzY3JpcHRvcik6CisgICAgIiIiQnVpbGRzIGEgcHJvdG8yIG1lc3NhZ2UgY2xhc3MgYmFzZWQgb24gdGhlIHBhc3NlZCBpbiBkZXNjcmlwdG9yLgorCisgICAgRG9uJ3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LCBpdCBhbHdheXMgY3JlYXRlcyBhIG5ldyBjbGFzcy4gQ2FsbAorICAgIEdldFByb3RvdHlwZSgpIGluc3RlYWQuIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIGJlIG92ZXJyaWRkZW4gaW4gc3ViYmxhc3NlcworICAgIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBvcGVyYXRpb25zIG9uIHRoZSBuZXdseSBjb25zdHJ1Y3RlZCBjbGFzcy4KKworICAgIEFyZ3M6CisgICAgICBkZXNjcmlwdG9yOiBUaGUgZGVzY3JpcHRvciB0byBidWlsZCBmcm9tLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgY2xhc3MgZGVzY3JpYmluZyB0aGUgcGFzc2VkIGluIGRlc2NyaXB0b3IuCisgICAgIiIiCisgICAgZGVzY3JpcHRvcl9uYW1lID0gZGVzY3JpcHRvci5uYW1lCisgICAgcmVzdWx0X2NsYXNzID0gX0dFTkVSQVRFRF9QUk9UT0NPTF9NRVNTQUdFX1RZUEUoCisgICAgICAgIGRlc2NyaXB0b3JfbmFtZSwKKyAgICAgICAgKG1lc3NhZ2UuTWVzc2FnZSwpLAorICAgICAgICB7CisgICAgICAgICAgICAnREVTQ1JJUFRPUic6IGRlc2NyaXB0b3IsCisgICAgICAgICAgICAjIElmIG1vZHVsZSBub3Qgc2V0LCBpdCB3cm9uZ2x5IHBvaW50cyB0byBtZXNzYWdlX2ZhY3RvcnkgbW9kdWxlLgorICAgICAgICAgICAgJ19fbW9kdWxlX18nOiBOb25lLAorICAgICAgICB9KQorICAgIHJlc3VsdF9jbGFzcy5fRkFDVE9SWSA9IHNlbGYgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAjIEFzc2lnbiBpbiBfY2xhc3NlcyBiZWZvcmUgZG9pbmcgcmVjdXJzaXZlIGNhbGxzIHRvIGF2b2lkIGluZmluaXRlCisgICAgIyByZWN1cnNpb24uCisgICAgc2VsZi5fY2xhc3Nlc1tkZXNjcmlwdG9yXSA9IHJlc3VsdF9jbGFzcworICAgIGZvciBmaWVsZCBpbiBkZXNjcmlwdG9yLmZpZWxkczoKKyAgICAgIGlmIGZpZWxkLm1lc3NhZ2VfdHlwZToKKyAgICAgICAgc2VsZi5HZXRQcm90b3R5cGUoZmllbGQubWVzc2FnZV90eXBlKQorICAgIGZvciBleHRlbnNpb24gaW4gcmVzdWx0X2NsYXNzLkRFU0NSSVBUT1IuZXh0ZW5zaW9uczoKKyAgICAgIGlmIGV4dGVuc2lvbi5jb250YWluaW5nX3R5cGUgbm90IGluIHNlbGYuX2NsYXNzZXM6CisgICAgICAgIHNlbGYuR2V0UHJvdG90eXBlKGV4dGVuc2lvbi5jb250YWluaW5nX3R5cGUpCisgICAgICBleHRlbmRlZF9jbGFzcyA9IHNlbGYuX2NsYXNzZXNbZXh0ZW5zaW9uLmNvbnRhaW5pbmdfdHlwZV0KKyAgICAgIGV4dGVuZGVkX2NsYXNzLlJlZ2lzdGVyRXh0ZW5zaW9uKGV4dGVuc2lvbikKKyAgICAgIGlmIGV4dGVuc2lvbi5tZXNzYWdlX3R5cGU6CisgICAgICAgIHNlbGYuR2V0UHJvdG90eXBlKGV4dGVuc2lvbi5tZXNzYWdlX3R5cGUpCisgICAgcmV0dXJuIHJlc3VsdF9jbGFzcworCisgIGRlZiBHZXRNZXNzYWdlcyhzZWxmLCBmaWxlcyk6CisgICAgIiIiR2V0cyBhbGwgdGhlIG1lc3NhZ2VzIGZyb20gYSBzcGVjaWZpZWQgZmlsZS4KKworICAgIFRoaXMgd2lsbCBmaW5kIGFuZCByZXNvbHZlIGRlcGVuZGVuY2llcywgZmFpbGluZyBpZiB0aGUgZGVzY3JpcHRvcgorICAgIHBvb2wgY2Fubm90IHNhdGlzZnkgdGhlbS4KKworICAgIEFyZ3M6CisgICAgICBmaWxlczogVGhlIGZpbGUgbmFtZXMgdG8gZXh0cmFjdCBtZXNzYWdlcyBmcm9tLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgZGljdGlvbmFyeSBtYXBwaW5nIHByb3RvIG5hbWVzIHRvIHRoZSBtZXNzYWdlIGNsYXNzZXMuIFRoaXMgd2lsbCBpbmNsdWRlCisgICAgICBhbnkgZGVwZW5kZW50IG1lc3NhZ2VzIGFzIHdlbGwgYXMgYW55IG1lc3NhZ2VzIGRlZmluZWQgaW4gdGhlIHNhbWUgZmlsZSBhcworICAgICAgYSBzcGVjaWZpZWQgbWVzc2FnZS4KKyAgICAiIiIKKyAgICByZXN1bHQgPSB7fQorICAgIGZvciBmaWxlX25hbWUgaW4gZmlsZXM6CisgICAgICBmaWxlX2Rlc2MgPSBzZWxmLnBvb2wuRmluZEZpbGVCeU5hbWUoZmlsZV9uYW1lKQorICAgICAgZm9yIGRlc2MgaW4gZmlsZV9kZXNjLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZS52YWx1ZXMoKToKKyAgICAgICAgcmVzdWx0W2Rlc2MuZnVsbF9uYW1lXSA9IHNlbGYuR2V0UHJvdG90eXBlKGRlc2MpCisKKyAgICAgICMgV2hpbGUgdGhlIGV4dGVuc2lvbiBGaWVsZERlc2NyaXB0b3JzIGFyZSBjcmVhdGVkIGJ5IHRoZSBkZXNjcmlwdG9yIHBvb2wsCisgICAgICAjIHRoZSBweXRob24gY2xhc3NlcyBjcmVhdGVkIGluIHRoZSBmYWN0b3J5IG5lZWQgdGhlbSB0byBiZSByZWdpc3RlcmVkCisgICAgICAjIGV4cGxpY2l0bHksIHdoaWNoIGlzIGRvbmUgYmVsb3cuCisgICAgICAjCisgICAgICAjIFRoZSBjYWxsIHRvIFJlZ2lzdGVyRXh0ZW5zaW9uIHdpbGwgc3BlY2lmaWNhbGx5IGNoZWNrIGlmIHRoZQorICAgICAgIyBleHRlbnNpb24gd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCBvbiB0aGUgb2JqZWN0IGFuZCBlaXRoZXIKKyAgICAgICMgaWdub3JlIHRoZSByZWdpc3RyYXRpb24gaWYgdGhlIG9yaWdpbmFsIHdhcyB0aGUgc2FtZSwgb3IgcmFpc2UKKyAgICAgICMgYW4gZXJyb3IgaWYgdGhleSB3ZXJlIGRpZmZlcmVudC4KKworICAgICAgZm9yIGV4dGVuc2lvbiBpbiBmaWxlX2Rlc2MuZXh0ZW5zaW9uc19ieV9uYW1lLnZhbHVlcygpOgorICAgICAgICBpZiBleHRlbnNpb24uY29udGFpbmluZ190eXBlIG5vdCBpbiBzZWxmLl9jbGFzc2VzOgorICAgICAgICAgIHNlbGYuR2V0UHJvdG90eXBlKGV4dGVuc2lvbi5jb250YWluaW5nX3R5cGUpCisgICAgICAgIGV4dGVuZGVkX2NsYXNzID0gc2VsZi5fY2xhc3Nlc1tleHRlbnNpb24uY29udGFpbmluZ190eXBlXQorICAgICAgICBleHRlbmRlZF9jbGFzcy5SZWdpc3RlckV4dGVuc2lvbihleHRlbnNpb24pCisgICAgICAgIGlmIGV4dGVuc2lvbi5tZXNzYWdlX3R5cGU6CisgICAgICAgICAgc2VsZi5HZXRQcm90b3R5cGUoZXh0ZW5zaW9uLm1lc3NhZ2VfdHlwZSkKKyAgICByZXR1cm4gcmVzdWx0CisKKworX0ZBQ1RPUlkgPSBNZXNzYWdlRmFjdG9yeSgpCisKKworZGVmIEdldE1lc3NhZ2VzKGZpbGVfcHJvdG9zKToKKyAgIiIiQnVpbGRzIGEgZGljdGlvbmFyeSBvZiBhbGwgdGhlIG1lc3NhZ2VzIGF2YWlsYWJsZSBpbiBhIHNldCBvZiBmaWxlcy4KKworICBBcmdzOgorICAgIGZpbGVfcHJvdG9zOiBJdGVyYWJsZSBvZiBGaWxlRGVzY3JpcHRvclByb3RvIHRvIGJ1aWxkIG1lc3NhZ2VzIG91dCBvZi4KKworICBSZXR1cm5zOgorICAgIEEgZGljdGlvbmFyeSBtYXBwaW5nIHByb3RvIG5hbWVzIHRvIHRoZSBtZXNzYWdlIGNsYXNzZXMuIFRoaXMgd2lsbCBpbmNsdWRlCisgICAgYW55IGRlcGVuZGVudCBtZXNzYWdlcyBhcyB3ZWxsIGFzIGFueSBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSBzYW1lIGZpbGUgYXMKKyAgICBhIHNwZWNpZmllZCBtZXNzYWdlLgorICAiIiIKKyAgIyBUaGUgY3BwIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcm90b2NvbCBidWZmZXIgbGlicmFyeSByZXF1aXJlcyB0byBhZGQgdGhlCisgICMgbWVzc2FnZSBpbiB0b3BvbG9naWNhbCBvcmRlciBvZiB0aGUgZGVwZW5kZW5jeSBncmFwaC4KKyAgZmlsZV9ieV9uYW1lID0ge2ZpbGVfcHJvdG8ubmFtZTogZmlsZV9wcm90byBmb3IgZmlsZV9wcm90byBpbiBmaWxlX3Byb3Rvc30KKyAgZGVmIF9BZGRGaWxlKGZpbGVfcHJvdG8pOgorICAgIGZvciBkZXBlbmRlbmN5IGluIGZpbGVfcHJvdG8uZGVwZW5kZW5jeToKKyAgICAgIGlmIGRlcGVuZGVuY3kgaW4gZmlsZV9ieV9uYW1lOgorICAgICAgICAjIFJlbW92ZSBmcm9tIGVsZW1lbnRzIHRvIGJlIHZpc2l0ZWQsIGluIG9yZGVyIHRvIGN1dCBjeWNsZXMuCisgICAgICAgIF9BZGRGaWxlKGZpbGVfYnlfbmFtZS5wb3AoZGVwZW5kZW5jeSkpCisgICAgX0ZBQ1RPUlkucG9vbC5BZGQoZmlsZV9wcm90bykKKyAgd2hpbGUgZmlsZV9ieV9uYW1lOgorICAgIF9BZGRGaWxlKGZpbGVfYnlfbmFtZS5wb3BpdGVtKClbMV0pCisgIHJldHVybiBfRkFDVE9SWS5HZXRNZXNzYWdlcyhbZmlsZV9wcm90by5uYW1lIGZvciBmaWxlX3Byb3RvIGluIGZpbGVfcHJvdG9zXSkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHJvdG9fYXBpLmggYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3Byb3RvX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NjlhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3Byb3RvX2FwaS5oCkBAIC0wLDAgKzEsMTQ1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBmaWxlIGNhbiBiZSBpbmNsdWRlZCBieSBvdGhlciBDKysgbGlicmFyaWVzLCB0eXBpY2FsbHkgZXh0ZW5zaW9uIG1vZHVsZXMKKy8vIHdoaWNoIHdhbnQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgUHl0aG9uIE1lc3NhZ2VzIGNvbWluZyBmcm9tIHRoZSAiY3BwIgorLy8gaW1wbGVtZW50YXRpb24gb2YgcHJvdG9jb2wgYnVmZmVycy4KKy8vCisvLyBVc2FnZToKKy8vIERlY2xhcmUgYSAocHJvYmFibHkgc3RhdGljKSB2YXJpYWJsZSB0byBob2xkIHRoZSBBUEk6CisvLyAgICBjb25zdCBQeVByb3RvX0FQSSogcHlfcHJvdG9fYXBpOworLy8gSW4gc29tZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiwgd3JpdGU6CisvLyAgICBweV9wcm90b19hcGkgPSBzdGF0aWNfY2FzdDxjb25zdCBQeVByb3RvX0FQSSo+KFB5Q2Fwc3VsZV9JbXBvcnQoCisvLyAgICAgICAgUHlQcm90b0FQSUNhcHN1bGVOYW1lKCksIDApKTsKKy8vICAgIGlmICghcHlfcHJvdG9fYXBpKSB7IC4uLmhhbmRsZSBJbXBvcnRFcnJvci4uLiB9CisvLyBUaGVuIHVzZSB0aGUgbWV0aG9kcyBvZiB0aGUgcmV0dXJuZWQgY2xhc3M6CisvLyAgICBweV9wcm90b19hcGktPkdldE1lc3NhZ2VQb2ludGVyKC4uLik7CisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9QUk9UT19BUElfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fUFJPVE9fQVBJX0hfXworCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHB5dGhvbiB7CisKKy8vIE5vdGUgb24gdGhlIGltcGxlbWVudGF0aW9uOgorLy8gVGhpcyBBUEkgaXMgZGVzaWduZWQgYWZ0ZXIKKy8vIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMvZXh0ZW5kaW5nL2V4dGVuZGluZy5odG1sI3Byb3ZpZGluZy1hLWMtYXBpLWZvci1hbi1leHRlbnNpb24tbW9kdWxlCisvLyBUaGUgY2xhc3MgYmVsb3cgY29udGFpbnMgbm8gbXV0YWJsZSBzdGF0ZSwgYW5kIGFsbCBtZXRob2RzIGFyZSAiY29uc3QiOworLy8gd2UgdXNlIGEgQysrIGNsYXNzIGluc3RlYWQgb2YgYSBDIHN0cnVjdCB3aXRoIGZ1bmN0aW9ucyBwb2ludGVycyBqdXN0IGJlY2F1c2UKKy8vIHRoZSBjb2RlIGxvb2tzIG1vcmUgcmVhZGFibGUuCitzdHJ1Y3QgUHlQcm90b19BUEkgeworICAvLyBUaGUgQVBJIG9iamVjdCBpcyBjcmVhdGVkIGF0IGluaXRpYWxpemF0aW9uIHRpbWUgYW5kIG5ldmVyIGZyZWVkLgorICAvLyBUaGlzIGRlc3RydWN0b3IgaXMgbmV2ZXIgY2FsbGVkLgorICB2aXJ0dWFsIH5QeVByb3RvX0FQSSgpIHt9CisKKyAgLy8gT3BlcmF0aW9ucyBvbiBNZXNzYWdlcy4KKworICAvLyBJZiB0aGUgcGFzc2VkIG9iamVjdCBpcyBhIFB5dGhvbiBNZXNzYWdlLCByZXR1cm5zIGl0cyBpbnRlcm5hbCBwb2ludGVyLgorICAvLyBPdGhlcndpc2UsIHJldHVybnMgTlVMTCB3aXRoIGFuIGV4Y2VwdGlvbiBzZXQuCisgIHZpcnR1YWwgY29uc3QgTWVzc2FnZSogR2V0TWVzc2FnZVBvaW50ZXIoUHlPYmplY3QqIG1zZykgY29uc3QgPSAwOworCisgIC8vIElmIHRoZSBwYXNzZWQgb2JqZWN0IGlzIGEgUHl0aG9uIE1lc3NhZ2UsIHJldHVybnMgYSBtdXRhYmxlIHBvaW50ZXIuCisgIC8vIE90aGVyd2lzZSwgcmV0dXJucyBOVUxMIHdpdGggYW4gZXhjZXB0aW9uIHNldC4KKyAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHN1Y2NlZWQgb25seSBpZiB0aGVyZSBhcmUgbm8gb3RoZXIgUHl0aG9uIG9iamVjdHMKKyAgLy8gcG9pbnRpbmcgdG8gdGhlIG1lc3NhZ2UsIGxpa2Ugc3VibWVzc2FnZXMgb3IgcmVwZWF0ZWQgY29udGFpbmVycy4KKyAgLy8gV2l0aCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgb25seSBlbXB0eSBtZXNzYWdlcyBhcmUgaW4gdGhpcyBjYXNlLgorICB2aXJ0dWFsIE1lc3NhZ2UqIEdldE11dGFibGVNZXNzYWdlUG9pbnRlcihQeU9iamVjdCogbXNnKSBjb25zdCA9IDA7CisKKyAgLy8gSWYgdGhlIHBhc3NlZCBvYmplY3QgaXMgYSBQeXRob24gTWVzc2FnZSBEZXNjcmlwdG9yLCByZXR1cm5zIGl0cyBpbnRlcm5hbAorICAvLyBwb2ludGVyLgorICAvLyBPdGhlcndpc2UsIHJldHVybnMgTlVMTCB3aXRoIGFuIGV4Y2VwdGlvbiBzZXQuCisgIHZpcnR1YWwgY29uc3QgRGVzY3JpcHRvciogTWVzc2FnZURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKAorICAgICAgUHlPYmplY3QqIGRlc2MpIGNvbnN0ID0gMDsKKworICAvLyBJZiB0aGUgcGFzc2VkIG9iamVjdCBpcyBhIFB5dGhvbiBFbnVtIERlc2NyaXB0b3IsIHJldHVybnMgaXRzIGludGVybmFsCisgIC8vIHBvaW50ZXIuCisgIC8vIE90aGVyd2lzZSwgcmV0dXJucyBOVUxMIHdpdGggYW4gZXhjZXB0aW9uIHNldC4KKyAgdmlydHVhbCBjb25zdCBFbnVtRGVzY3JpcHRvciogRW51bURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKAorICAgICAgUHlPYmplY3QqIGVudW1fZGVzYykgY29uc3QgPSAwOworCisgIC8vIEV4cG9zZSB0aGUgdW5kZXJseWluZyBEZXNjcmlwdG9yUG9vbCBhbmQgTWVzc2FnZUZhY3RvcnkgdG8gZW5hYmxlIEMrKyBjb2RlCisgIC8vIHRvIGNyZWF0ZSBQeXRob24tY29tcGF0aWJsZSBtZXNzYWdlLgorICB2aXJ0dWFsIGNvbnN0IERlc2NyaXB0b3JQb29sKiBHZXREZWZhdWx0RGVzY3JpcHRvclBvb2woKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgTWVzc2FnZUZhY3RvcnkqIEdldERlZmF1bHRNZXNzYWdlRmFjdG9yeSgpIGNvbnN0ID0gMDsKKworICAvLyBBbGxvY2F0ZSBhIG5ldyBwcm90b2NvbCBidWZmZXIgYXMgYSBweXRob24gb2JqZWN0IGZvciB0aGUgcHJvdmlkZWQKKyAgLy8gZGVzY3JpcHRvci4gVGhpcyBmdW5jdGlvbiB3b3JrcyBldmVuIGlmIG5vIFB5dGhvbiBtb2R1bGUgaGFzIGJlZW4gaW1wb3J0ZWQKKyAgLy8gZm9yIHRoZSBjb3JyZXNwb25kaW5nIHByb3RvY29sIGJ1ZmZlciBjbGFzcy4KKyAgLy8gVGhlIGZhY3RvcnkgaXMgdXN1YWxseSBudWxsOyB3aGVuIHByb3ZpZGVkLCBpdCBpcyB0aGUgTWVzc2FnZUZhY3Rvcnkgd2hpY2gKKyAgLy8gb3ducyB0aGUgUHl0aG9uIGNsYXNzLCBhbmQgd2lsbCBiZSB1c2VkIHRvIGZpbmQgYW5kIGNyZWF0ZSBFeHRlbnNpb25zIGZvcgorICAvLyB0aGlzIG1lc3NhZ2UuCisgIC8vIFdoZW4gbnVsbCBpcyByZXR1cm5lZCwgYSBweXRob24gZXJyb3IgaGFzIGFscmVhZHkgYmVlbiBzZXQuCisgIHZpcnR1YWwgUHlPYmplY3QqIE5ld01lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogcHlfbWVzc2FnZV9mYWN0b3J5KSBjb25zdCA9IDA7CisKKyAgLy8gQWxsb2NhdGUgYSBuZXcgcHJvdG9jb2wgYnVmZmVyIHdoZXJlIHRoZSB1bmRlcmx5aW5nIG9iamVjdCBpcyBvd25lZCBieSBDKysuCisgIC8vIFRoZSBmYWN0b3J5IG11c3QgY3VycmVudGx5IGJlIG51bGwuICBUaGlzIGZ1bmN0aW9uIHdvcmtzIGV2ZW4gaWYgbm8gUHl0aG9uCisgIC8vIG1vZHVsZSBoYXMgYmVlbiBpbXBvcnRlZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcHJvdG9jb2wgYnVmZmVyIGNsYXNzLgorICAvLyBXaGVuIG51bGwgaXMgcmV0dXJuZWQsIGEgcHl0aG9uIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gc2V0LgorICAvLworICAvLyBTaW5jZSB0aGlzIGNhbGwgcmV0dXJucyBhIHB5dGhvbiBvYmplY3Qgb3duZWQgYnkgQysrLCBzb21lIG9wZXJhdGlvbnMKKyAgLy8gYXJlIHJpc2t5LCBhbmQgaXQgbXVzdCBiZSB1c2VkIGNhcmVmdWxseS4gSW4gcGFydGljdWxhcjoKKyAgLy8gKiBBdm9pZCBtb2RpZnlpbmcgdGhlIHJldHVybmVkIG9iamVjdCBmcm9tIHRoZSBDKysgc2lkZSB3aGlsZSB0aGVyZSBhcmUKKyAgLy8gZXhpc3RpbmcgcHl0aG9uIHJlZmVyZW5jZXMgdG8gaXQgb3IgaXQncyBzdWJvYmplY3RzLgorICAvLyAqIEF2b2lkIHVzaW5nIHB5dGhvbiByZWZlcmVuY2VzIHRvIHRoaXMgb2JqZWN0IG9yIGFueSBzdWJvYmplY3RzIGFmdGVyIHRoZQorICAvLyBDKysgb2JqZWN0IGhhcyBiZWVuIGZyZWVkLgorICAvLyAqIENhbGxpbmcgdGhpcyB3aXRoIHRoZSBzYW1lIEMrKyBwb2ludGVyIHdpbGwgcmVzdWx0IGluIG11bHRpcGxlIGRpc3RpbmN0CisgIC8vIHB5dGhvbiBvYmplY3RzIHJlZmVyZW5jaW5nIHRoZSBzYW1lIEMrKyBvYmplY3QuCisgIHZpcnR1YWwgUHlPYmplY3QqIE5ld01lc3NhZ2VPd25lZEV4dGVybmFsbHkoCisgICAgICBNZXNzYWdlKiBtc2csIFB5T2JqZWN0KiBweV9tZXNzYWdlX2ZhY3RvcnkpIGNvbnN0ID0gMDsKKworICAvLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIERlc2NyaXB0b3JQb29sLgorICAvLyBUaGUgcmV0dXJuZWQgb2JqZWN0IGRvZXMgbm90IG1hbmFnZSB0aGUgQysrIERlc2NyaXB0b3JQb29sOiBpdCBpcyB0aGUKKyAgLy8gcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBrZWVwIGl0IGFsaXZlLgorICAvLyBBcyBsb25nIGFzIHRoZSByZXR1cm5lZCBQeXRob24gRGVzY3JpcHRvclBvb2wgb2JqZWN0IGlzIGtlcHQgYWxpdmUsCisgIC8vIGZ1bmN0aW9ucyB0aGF0IHByb2Nlc3MgQysrIGRlc2NyaXB0b3JzIG9yIG1lc3NhZ2VzIGNyZWF0ZWQgZnJvbSB0aGlzIHBvb2wKKyAgLy8gY2FuIHdvcmsgYW5kIHJldHVybiB0aGVpciBQeXRob24gY291bnRlcnBhcnRzLgorICB2aXJ0dWFsIFB5T2JqZWN0KiBEZXNjcmlwdG9yUG9vbF9Gcm9tUG9vbCgKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sKiBwb29sKSBjb25zdCA9IDA7Cit9OworCitpbmxpbmUgY29uc3QgY2hhciogUHlQcm90b0FQSUNhcHN1bGVOYW1lKCkgeworICBzdGF0aWMgY29uc3QgY2hhciBrQ2Fwc3VsZU5hbWVbXSA9CisgICAgICAiZ29vZ2xlLnByb3RvYnVmLnB5ZXh0Ll9tZXNzYWdlLnByb3RvX0FQSSI7CisgIHJldHVybiBrQ2Fwc3VsZU5hbWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fUFJPVE9fQVBJX0hfXwpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9wcm90b19idWlsZGVyLnB5IGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9wcm90b19idWlsZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NjY3Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3Byb3RvX2J1aWxkZXIucHkKQEAgLTAsMCArMSwxMzQgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiRHluYW1pYyBQcm90b2J1ZiBjbGFzcyBjcmVhdG9yLiIiIgorCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAoraW1wb3J0IGhhc2hsaWIKK2ltcG9ydCBvcworCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZV9mYWN0b3J5CisKKworZGVmIF9HZXRNZXNzYWdlRnJvbUZhY3RvcnkoZmFjdG9yeSwgZnVsbF9uYW1lKToKKyAgIiIiR2V0IGEgcHJvdG8gY2xhc3MgZnJvbSB0aGUgTWVzc2FnZUZhY3RvcnkgYnkgbmFtZS4KKworICBBcmdzOgorICAgIGZhY3Rvcnk6IGEgTWVzc2FnZUZhY3RvcnkgaW5zdGFuY2UuCisgICAgZnVsbF9uYW1lOiBzdHIsIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcHJvdG8gdHlwZS4KKyAgUmV0dXJuczoKKyAgICBBIGNsYXNzLCBmb3IgdGhlIHR5cGUgaWRlbnRpZmllZCBieSBmdWxsX25hbWUuCisgIFJhaXNlczoKKyAgICBLZXlFcnJvciwgaWYgdGhlIHByb3RvIGlzIG5vdCBmb3VuZCBpbiB0aGUgZmFjdG9yeSdzIGRlc2NyaXB0b3IgcG9vbC4KKyAgIiIiCisgIHByb3RvX2Rlc2NyaXB0b3IgPSBmYWN0b3J5LnBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKGZ1bGxfbmFtZSkKKyAgcHJvdG9fY2xzID0gZmFjdG9yeS5HZXRQcm90b3R5cGUocHJvdG9fZGVzY3JpcHRvcikKKyAgcmV0dXJuIHByb3RvX2NscworCisKK2RlZiBNYWtlU2ltcGxlUHJvdG9DbGFzcyhmaWVsZHMsIGZ1bGxfbmFtZT1Ob25lLCBwb29sPU5vbmUpOgorICAiIiJDcmVhdGUgYSBQcm90b2J1ZiBjbGFzcyB3aG9zZSBmaWVsZHMgYXJlIGJhc2ljIHR5cGVzLgorCisgIE5vdGU6IHRoaXMgZG9lc24ndCB2YWxpZGF0ZSBmaWVsZCBuYW1lcyEKKworICBBcmdzOgorICAgIGZpZWxkczogZGljdCBvZiB7bmFtZTogZmllbGRfdHlwZX0gbWFwcGluZ3MgZm9yIGVhY2ggZmllbGQgaW4gdGhlIHByb3RvLiBJZgorICAgICAgICB0aGlzIGlzIGFuIE9yZGVyZWREaWN0IHRoZSBvcmRlciB3aWxsIGJlIG1haW50YWluZWQsIG90aGVyd2lzZSB0aGUKKyAgICAgICAgZmllbGRzIHdpbGwgYmUgc29ydGVkIGJ5IG5hbWUuCisgICAgZnVsbF9uYW1lOiBvcHRpb25hbCBzdHIsIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgcHJvdG8gdHlwZS4KKyAgICBwb29sOiBvcHRpb25hbCBEZXNjcmlwdG9yUG9vbCBpbnN0YW5jZS4KKyAgUmV0dXJuczoKKyAgICBhIGNsYXNzLCB0aGUgbmV3IHByb3RvYnVmIGNsYXNzIHdpdGggYSBGaWxlRGVzY3JpcHRvci4KKyAgIiIiCisgIGZhY3RvcnkgPSBtZXNzYWdlX2ZhY3RvcnkuTWVzc2FnZUZhY3RvcnkocG9vbD1wb29sKQorCisgIGlmIGZ1bGxfbmFtZSBpcyBub3QgTm9uZToKKyAgICB0cnk6CisgICAgICBwcm90b19jbHMgPSBfR2V0TWVzc2FnZUZyb21GYWN0b3J5KGZhY3RvcnksIGZ1bGxfbmFtZSkKKyAgICAgIHJldHVybiBwcm90b19jbHMKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAjIFRoZSBmYWN0b3J5J3MgRGVzY3JpcHRvclBvb2wgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgY2xhc3MgeWV0LgorICAgICAgcGFzcworCisgICMgR2V0IGEgbGlzdCBvZiAobmFtZSwgZmllbGRfdHlwZSkgdHVwbGVzIGZyb20gdGhlIGZpZWxkcyBkaWN0LiBJZiBmaWVsZHMgd2FzCisgICMgYW4gT3JkZXJlZERpY3Qgd2Uga2VlcCB0aGUgb3JkZXIsIGJ1dCBvdGhlcndpc2Ugd2Ugc29ydCB0aGUgZmllbGQgdG8gZW5zdXJlCisgICMgY29uc2lzdGVudCBvcmRlcmluZy4KKyAgZmllbGRfaXRlbXMgPSBmaWVsZHMuaXRlbXMoKQorICBpZiBub3QgaXNpbnN0YW5jZShmaWVsZHMsIE9yZGVyZWREaWN0KToKKyAgICBmaWVsZF9pdGVtcyA9IHNvcnRlZChmaWVsZF9pdGVtcykKKworICAjIFVzZSBhIGNvbnNpc3RlbnQgZmlsZSBuYW1lIHRoYXQgaXMgdW5saWtlbHkgdG8gY29uZmxpY3Qgd2l0aCBhbnkgaW1wb3J0ZWQKKyAgIyBwcm90byBmaWxlcy4KKyAgZmllbGRzX2hhc2ggPSBoYXNobGliLnNoYTEoKQorICBmb3IgZl9uYW1lLCBmX3R5cGUgaW4gZmllbGRfaXRlbXM6CisgICAgZmllbGRzX2hhc2gudXBkYXRlKGZfbmFtZS5lbmNvZGUoJ3V0Zi04JykpCisgICAgZmllbGRzX2hhc2gudXBkYXRlKHN0cihmX3R5cGUpLmVuY29kZSgndXRmLTgnKSkKKyAgcHJvdG9fZmlsZV9uYW1lID0gZmllbGRzX2hhc2guaGV4ZGlnZXN0KCkgKyAnLnByb3RvJworCisgICMgSWYgdGhlIHByb3RvIGlzIGFub255bW91cywgdXNlIHRoZSBzYW1lIGhhc2ggdG8gbmFtZSBpdC4KKyAgaWYgZnVsbF9uYW1lIGlzIE5vbmU6CisgICAgZnVsbF9uYW1lID0gKCduZXQucHJvdG8yLnB5dGhvbi5wdWJsaWMucHJvdG9fYnVpbGRlci5Bbm9ueW1vdXNQcm90b18nICsKKyAgICAgICAgICAgICAgICAgZmllbGRzX2hhc2guaGV4ZGlnZXN0KCkpCisgICAgdHJ5OgorICAgICAgcHJvdG9fY2xzID0gX0dldE1lc3NhZ2VGcm9tRmFjdG9yeShmYWN0b3J5LCBmdWxsX25hbWUpCisgICAgICByZXR1cm4gcHJvdG9fY2xzCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgIyBUaGUgZmFjdG9yeSdzIERlc2NyaXB0b3JQb29sIGRvZXNuJ3Qga25vdyBhYm91dCB0aGlzIGNsYXNzIHlldC4KKyAgICAgIHBhc3MKKworICAjIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2Ugc2VlIHRoaXMgcHJvdG86IGFkZCBhIG5ldyBkZXNjcmlwdG9yIHRvIHRoZSBwb29sLgorICBmYWN0b3J5LnBvb2wuQWRkKAorICAgICAgX01ha2VGaWxlRGVzY3JpcHRvclByb3RvKHByb3RvX2ZpbGVfbmFtZSwgZnVsbF9uYW1lLCBmaWVsZF9pdGVtcykpCisgIHJldHVybiBfR2V0TWVzc2FnZUZyb21GYWN0b3J5KGZhY3RvcnksIGZ1bGxfbmFtZSkKKworCitkZWYgX01ha2VGaWxlRGVzY3JpcHRvclByb3RvKHByb3RvX2ZpbGVfbmFtZSwgZnVsbF9uYW1lLCBmaWVsZF9pdGVtcyk6CisgICIiIlBvcHVsYXRlIEZpbGVEZXNjcmlwdG9yUHJvdG8gZm9yIE1lc3NhZ2VGYWN0b3J5J3MgRGVzY3JpcHRvclBvb2wuIiIiCisgIHBhY2thZ2UsIG5hbWUgPSBmdWxsX25hbWUucnNwbGl0KCcuJywgMSkKKyAgZmlsZV9wcm90byA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oKQorICBmaWxlX3Byb3RvLm5hbWUgPSBvcy5wYXRoLmpvaW4ocGFja2FnZS5yZXBsYWNlKCcuJywgJy8nKSwgcHJvdG9fZmlsZV9uYW1lKQorICBmaWxlX3Byb3RvLnBhY2thZ2UgPSBwYWNrYWdlCisgIGRlc2NfcHJvdG8gPSBmaWxlX3Byb3RvLm1lc3NhZ2VfdHlwZS5hZGQoKQorICBkZXNjX3Byb3RvLm5hbWUgPSBuYW1lCisgIGZvciBmX251bWJlciwgKGZfbmFtZSwgZl90eXBlKSBpbiBlbnVtZXJhdGUoZmllbGRfaXRlbXMsIDEpOgorICAgIGZpZWxkX3Byb3RvID0gZGVzY19wcm90by5maWVsZC5hZGQoKQorICAgIGZpZWxkX3Byb3RvLm5hbWUgPSBmX25hbWUKKyAgICAjICMgSWYgdGhlIG51bWJlciBmYWxscyBpbiB0aGUgcmVzZXJ2ZWQgcmFuZ2UsIHJlYXNzaWduIGl0IHRvIHRoZSBjb3JyZWN0CisgICAgIyAjIG51bWJlciBhZnRlciB0aGUgcmFuZ2UuCisgICAgaWYgZl9udW1iZXIgPj0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuRklSU1RfUkVTRVJWRURfRklFTERfTlVNQkVSOgorICAgICAgZl9udW1iZXIgKz0gKAorICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBU1RfUkVTRVJWRURfRklFTERfTlVNQkVSIC0KKyAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5GSVJTVF9SRVNFUlZFRF9GSUVMRF9OVU1CRVIgKyAxKQorICAgIGZpZWxkX3Byb3RvLm51bWJlciA9IGZfbnVtYmVyCisgICAgZmllbGRfcHJvdG8ubGFiZWwgPSBkZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90by5MQUJFTF9PUFRJT05BTAorICAgIGZpZWxkX3Byb3RvLnR5cGUgPSBmX3R5cGUKKyAgcmV0dXJuIGZpbGVfcHJvdG8KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvUkVBRE1FIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2MWNiNAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvUkVBRE1FCkBAIC0wLDAgKzEsNiBAQAorVGhpcyBpcyB0aGUgJ3YyJyBDKysgaW1wbGVtZW50YXRpb24gZm9yIHB5dGhvbiBwcm90bzIuCisKK0l0IGlzIGFjdGl2ZSB3aGVuOgorCitQUk9UT0NPTF9CVUZGRVJTX1BZVEhPTl9JTVBMRU1FTlRBVElPTj1jcHAKK1BST1RPQ09MX0JVRkZFUlNfUFlUSE9OX0lNUExFTUVOVEFUSU9OX1ZFUlNJT049MgpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9fX2luaXRfXy5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvY3BwX21lc3NhZ2UucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2NwcF9tZXNzYWdlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjkwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2NwcF9tZXNzYWdlLnB5CkBAIC0wLDAgKzEsNzIgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiUHJvdG9jb2wgbWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBob29rcyBmb3IgQysrIGltcGxlbWVudGF0aW9uLgorCitDb250YWlucyBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgdG8gY3JlYXRlIHByb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyBmcm9tCitEZXNjcmlwdG9yIG9iamVjdHMgYXQgcnVudGltZSBiYWNrZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBDKysgQVBJLgorIiIiCisKK19fYXV0aG9yX18gPSAndGliZWxsQGdvb2dsZS5jb20gKEpvaGFuIFRpYmVsbCknCisKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBhcGlfaW1wbGVtZW50YXRpb24KKworCisjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCitfbWVzc2FnZSA9IGFwaV9pbXBsZW1lbnRhdGlvbi5fY19tb2R1bGUKKyMgVE9ETyhqaWVsdW8pOiBSZW1vdmUgdGhpcyBpbXBvcnQgYWZ0ZXIgZml4IGFwaV9pbXBsZW1lbnRhdGlvbgoraWYgX21lc3NhZ2UgaXMgTm9uZToKKyAgZnJvbSBnb29nbGUucHJvdG9idWYucHlleHQgaW1wb3J0IF9tZXNzYWdlCisKKworY2xhc3MgR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZShfbWVzc2FnZS5NZXNzYWdlTWV0YSk6CisKKyAgIiIiTWV0YWNsYXNzIGZvciBwcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgY3JlYXRlZCBhdCBydW50aW1lIGZyb20gRGVzY3JpcHRvcnMuCisKKyAgVGhlIHByb3RvY29sIGNvbXBpbGVyIGN1cnJlbnRseSB1c2VzIHRoaXMgbWV0YWNsYXNzIHRvIGNyZWF0ZSBwcm90b2NvbAorICBtZXNzYWdlIGNsYXNzZXMgYXQgcnVudGltZS4gIENsaWVudHMgY2FuIGFsc28gbWFudWFsbHkgY3JlYXRlIHRoZWlyIG93bgorICBjbGFzc2VzIGF0IHJ1bnRpbWUsIGFzIGluIHRoaXMgZXhhbXBsZToKKworICBteWRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yKC4uLi4uKQorICBmYWN0b3J5ID0gc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKQorICBmYWN0b3J5LnBvb2wuQWRkRGVzY3JpcHRvcihteWRlc2NyaXB0b3IpCisgIE15UHJvdG9DbGFzcyA9IGZhY3RvcnkuR2V0UHJvdG90eXBlKG15ZGVzY3JpcHRvcikKKyAgbXlwcm90b19pbnN0YW5jZSA9IE15UHJvdG9DbGFzcygpCisgIG15cHJvdG8uZm9vX2ZpZWxkID0gMjMKKyAgLi4uCisKKyAgVGhlIGFib3ZlIGV4YW1wbGUgd2lsbCBub3Qgd29yayBmb3IgbmVzdGVkIHR5cGVzLiBJZiB5b3Ugd2lzaCB0byBpbmNsdWRlIHRoZW0sCisgIHVzZSByZWZsZWN0aW9uLk1ha2VDbGFzcygpIGluc3RlYWQgb2YgbWFudWFsbHkgaW5zdGFudGlhdGluZyB0aGUgY2xhc3MgaW4KKyAgb3JkZXIgdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBzdHJ1Y3R1cmUuCisgICIiIgorCisgICMgTXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHByb3RvY29sLWNvbXBpbGVyIGNvZGUgaW4KKyAgIyBwcm90bzIvY29tcGlsZXIvaW50ZXJuYWwvZ2VuZXJhdG9yLiouCisgIF9ERVNDUklQVE9SX0tFWSA9ICdERVNDUklQVE9SJwpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yLmNjIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MjUzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3IuY2MKQEAgLTAsMCArMSwyMDQwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBwZXRhckBnb29nbGUuY29tIChQZXRhciBQZXRyb3YpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvci5oPgorCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlIDxmcmFtZW9iamVjdC5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9jb250YWluZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfcG9vbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2VfZmFjdG9yeS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9zY29wZWRfcHlvYmplY3RfcHRyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KKworI2RlZmluZSBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUob2IsIGNoYXJwcCwgc2l6ZXApICAgICAgICAgICAgICBcCisgIChQeVVuaWNvZGVfQ2hlY2sob2IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoKihjaGFycHApID0gY29uc3RfY2FzdDxjaGFyKj4oICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgUHlVbmljb2RlX0FzVVRGOEFuZFNpemUob2IsIChzaXplcCkpKSkgPT0gbnVsbHB0ciBcCisgICAgICAgICAgICAgID8gLTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgOiAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUob2IsIChjaGFycHApLCAoc2l6ZXApKSkKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHB5dGhvbiB7CisKKy8vIFN0b3JlIGludGVybmVkIGRlc2NyaXB0b3JzLCBzbyB0aGF0IHRoZSBzYW1lIEMrKyBkZXNjcmlwdG9yIHlpZWxkcyB0aGUgc2FtZQorLy8gUHl0aG9uIG9iamVjdC4gT2JqZWN0cyBhcmUgbm90IGltbW9ydGFsOiB0aGlzIG1hcCBkb2VzIG5vdCBvd24gdGhlCisvLyByZWZlcmVuY2VzLCBhbmQgaXRlbXMgYXJlIGRlbGV0ZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBpcworLy8gcmVsZWFzZWQuCisvLyBUaGlzIGlzIGVub3VnaCB0byBzdXBwb3J0IHRoZSAiaXMiIG9wZXJhdG9yIG9uIGxpdmUgb2JqZWN0cy4KKy8vIEFsbCBkZXNjcmlwdG9ycyBhcmUgc3RvcmVkIGhlcmUuCitzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3Qgdm9pZCosIFB5T2JqZWN0Kj4qIGludGVybmVkX2Rlc2NyaXB0b3JzOworCitQeU9iamVjdCogUHlTdHJpbmdfRnJvbUNwcFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUoc3RyLmNfc3RyKCksIHN0ci5zaXplKCkpOworfQorCisvLyBDaGVjayB0aGF0IHRoZSBjYWxsaW5nIFB5dGhvbiBjb2RlIGlzIHRoZSBnbG9iYWwgc2NvcGUgb2YgYSBfcGIyLnB5IG1vZHVsZS4KKy8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdXBwb3J0IHRoZSBjdXJyZW50IGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBwcm90bworLy8gY29tcGlsZXIsIHdoaWNoIGNyZWF0ZXMgZGVzY3JpcHRvcnMsIHRoZW4gdXBkYXRlIHNvbWUgcHJvcGVydGllcy4KKy8vIEZvciBleGFtcGxlOgorLy8gICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSBEZXNjcmlwdG9yKAorLy8gICAgICAgbmFtZT0nTWVzc2FnZScsCisvLyAgICAgICBmaWVsZHMgPSBbRmllbGREZXNjcmlwdG9yKG5hbWU9J2ZpZWxkJyldCisvLyAgIG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNbMF0uY29udGFpbmluZ190eXBlID0gbWVzc2FnZV9kZXNjcmlwdG9yCisvLworLy8gVGhpcyBjb2RlIGlzIHN0aWxsIGV4ZWN1dGVkLCBidXQgdGhlIGRlc2NyaXB0b3JzIG5vdyBoYXZlIG5vIG90aGVyIHN0b3JhZ2UKKy8vIHRoYW4gdGhlIChjb25zdCkgQysrIHBvaW50ZXIsIGFuZCBhcmUgaW1tdXRhYmxlLgorLy8gU28gd2UgbGV0IHRoaXMgY29kZSBwYXNzLCBieSBzaW1wbHkgaWdub3JpbmcgdGhlIG5ldyB2YWx1ZS4KKy8vCisvLyBGcm9tIHVzZXIgY29kZSwgZGVzY3JpcHRvcnMgc3RpbGwgbG9vayBpbW11dGFibGUuCisvLworLy8gVE9ETyhhbWF1cnlmYSk6IENoYW5nZSB0aGUgcHJvdG8yIGNvbXBpbGVyIHRvIHJlbW92ZSB0aGUgYXNzaWdubWVudHMsIGFuZAorLy8gcmVtb3ZlIHRoaXMgaGFjay4KK2Jvb2wgX0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKGludCBzdGFja2xldmVsKSB7CisjaWZuZGVmIFBZUFlfVkVSU0lPTgorICAvLyBUaGlzIGNoZWNrIGlzIG5vdCBjcml0aWNhbCBhbmQgaXMgc29tZXdoYXQgZGlmZmljdWx0IHRvIGltcGxlbWVudCBjb3JyZWN0bHkKKyAgLy8gaW4gUHlQeS4KKyAgUHlGcmFtZU9iamVjdCogZnJhbWUgPSBQeUV2YWxfR2V0RnJhbWUoKTsKKyAgaWYgKGZyYW1lID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgd2hpbGUgKHN0YWNrbGV2ZWwtLSA+IDApIHsKKyAgICBmcmFtZSA9IGZyYW1lLT5mX2JhY2s7CisgICAgaWYgKGZyYW1lID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBpZiAoZnJhbWUtPmZfY29kZS0+Y29fZmlsZW5hbWUgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjaGFyKiBmaWxlbmFtZTsKKyAgUHlfc3NpemVfdCBmaWxlbmFtZV9zaXplOworICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGZyYW1lLT5mX2NvZGUtPmNvX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlbmFtZSwgJmZpbGVuYW1lX3NpemUpIDwgMCkgeworICAgIC8vIGZpbGVuYW1lIGlzIG5vdCBhIHN0cmluZy4KKyAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoKGZpbGVuYW1lX3NpemUgPCAzKSB8fAorICAgICAgKHN0cmNtcCgmZmlsZW5hbWVbZmlsZW5hbWVfc2l6ZSAtIDNdLCAiLnB5IikgIT0gMCkpIHsKKyAgICAvLyBDeXRob24ncyBzdGFjayBkb2VzIG5vdCBoYXZlIC5weSBmaWxlIG5hbWUgYW5kIGlzIG5vdCBhdCBnbG9iYWwgbW9kdWxlCisgICAgLy8gc2NvcGUuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKGZpbGVuYW1lX3NpemUgPCA3KSB7CisgICAgLy8gZmlsZW5hbWUgaXMgdG9vIHNob3J0LgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoc3RyY21wKCZmaWxlbmFtZVtmaWxlbmFtZV9zaXplIC0gN10sICJfcGIyLnB5IikgIT0gMCkgeworICAgIC8vIEZpbGVuYW1lIGlzIG5vdCBlbmRpbmcgd2l0aCBfcGIyLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChmcmFtZS0+Zl9nbG9iYWxzICE9IGZyYW1lLT5mX2xvY2FscykgeworICAgIC8vIE5vdCBhdCBnbG9iYWwgbW9kdWxlIHNjb3BlCisgICAgcmV0dXJuIGZhbHNlOworICB9CisjZW5kaWYKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIElmIHRoZSBjYWxsaW5nIGNvZGUgaXMgbm90IGEgX3BiMi5weSBmaWxlLCByYWlzZSBBdHRyaWJ1dGVFcnJvci4KKy8vIFRvIGJlIHVzZWQgaW4gYXR0cmlidXRlIHNldHRlcnMuCitzdGF0aWMgaW50IENoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoY29uc3QgY2hhciogYXR0cl9uYW1lKSB7CisgIGlmIChfQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAiYXR0cmlidXRlIGlzIG5vdCB3cml0YWJsZTogJXMiLCBhdHRyX25hbWUpOworICByZXR1cm4gLTE7Cit9CisKKworI2lmbmRlZiBQeVZhck9iamVjdF9IRUFEX0lOSVQKKyNkZWZpbmUgUHlWYXJPYmplY3RfSEVBRF9JTklUKHR5cGUsIHNpemUpIFB5T2JqZWN0X0hFQURfSU5JVCh0eXBlKSBzaXplLAorI2VuZGlmCisjaWZuZGVmIFB5X1RZUEUKKyNkZWZpbmUgUHlfVFlQRShvYikgKCgoUHlPYmplY3QqKShvYikpLT5vYl90eXBlKQorI2VuZGlmCisKKworLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgZGVzY3JpcHRvciBvYmplY3RzLgorCisvLyBBIHNldCBvZiB0ZW1wbGF0ZXMgdG8gcmV0cmlldmUgdGhlIEMrKyBGaWxlRGVzY3JpcHRvciBvZiBhbnkgZGVzY3JpcHRvci4KK3RlbXBsYXRlPGNsYXNzIERlc2NyaXB0b3JDbGFzcz4KK2NvbnN0IEZpbGVEZXNjcmlwdG9yKiBHZXRGaWxlRGVzY3JpcHRvcihjb25zdCBEZXNjcmlwdG9yQ2xhc3MqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPmZpbGUoKTsKK30KK3RlbXBsYXRlPD4KK2NvbnN0IEZpbGVEZXNjcmlwdG9yKiBHZXRGaWxlRGVzY3JpcHRvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvcjsKK30KK3RlbXBsYXRlPD4KK2NvbnN0IEZpbGVEZXNjcmlwdG9yKiBHZXRGaWxlRGVzY3JpcHRvcihjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT50eXBlKCktPmZpbGUoKTsKK30KK3RlbXBsYXRlPD4KK2NvbnN0IEZpbGVEZXNjcmlwdG9yKiBHZXRGaWxlRGVzY3JpcHRvcihjb25zdCBPbmVvZkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpLT5maWxlKCk7Cit9Cit0ZW1wbGF0ZTw+Citjb25zdCBGaWxlRGVzY3JpcHRvciogR2V0RmlsZURlc2NyaXB0b3IoY29uc3QgTWV0aG9kRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvci0+c2VydmljZSgpLT5maWxlKCk7Cit9CisKK2Jvb2wgUmVwYXJzZSgKKyAgICBQeU1lc3NhZ2VGYWN0b3J5KiBtZXNzYWdlX2ZhY3RvcnksIGNvbnN0IE1lc3NhZ2UmIGZyb20sIE1lc3NhZ2UqIHRvKSB7CisgIC8vIFJlcGFyc2UgbWVzc2FnZS4KKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgZnJvbS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oc2VyaWFsaXplZC5jX3N0cigpKSwgc2VyaWFsaXplZC5zaXplKCkpOworICBpbnB1dC5TZXRFeHRlbnNpb25SZWdpc3RyeShtZXNzYWdlX2ZhY3RvcnktPnBvb2wtPnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfZmFjdG9yeS0+bWVzc2FnZV9mYWN0b3J5KTsKKyAgYm9vbCBzdWNjZXNzID0gdG8tPlBhcnNlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCk7CisgIGlmICghc3VjY2VzcykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKy8vIENvbnZlcnRzIG9wdGlvbnMgaW50byBhIFB5dGhvbiBwcm90b2J1ZiwgYW5kIGNhY2hlIHRoZSByZXN1bHQuCisvLworLy8gVGhpcyBpcyBhIGJpdCB0cmlja3kgYmVjYXVzZSBvcHRpb25zIGNhbiBjb250YWluIGV4dGVuc2lvbiBmaWVsZHMgZGVmaW5lZCBpbgorLy8gdGhlIHNhbWUgcHJvdG8gZmlsZS4gSW4gdGhpcyBjYXNlIHRoZSBvcHRpb25zIHBhcnNlZCBmcm9tIHRoZSBzZXJpYWxpemVkX3BiCisvLyBoYXZlIHVua25vd24gZmllbGRzLCBhbmQgd2UgbmVlZCB0byBwYXJzZSB0aGVtIGFnYWluLgorLy8KKy8vIEFsd2F5cyByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KK3RlbXBsYXRlPGNsYXNzIERlc2NyaXB0b3JDbGFzcz4KK3N0YXRpYyBQeU9iamVjdCogR2V0T3JCdWlsZE9wdGlvbnMoY29uc3QgRGVzY3JpcHRvckNsYXNzICpkZXNjcmlwdG9yKSB7CisgIC8vIE9wdGlvbnMgYXJlIGNhY2hlZCBpbiB0aGUgcG9vbCB0aGF0IG93bnMgdGhlIGRlc2NyaXB0b3IuCisgIC8vIEZpcnN0IHNlYXJjaCBpbiB0aGUgY2FjaGUuCisgIFB5RGVzY3JpcHRvclBvb2wqIGNhY2hpbmdfcG9vbCA9IEdldERlc2NyaXB0b3JQb29sX0Zyb21Qb29sKAorICAgICAgR2V0RmlsZURlc2NyaXB0b3IoZGVzY3JpcHRvciktPnBvb2woKSk7CisgIHN0ZDo6dW5vcmRlcmVkX21hcDxjb25zdCB2b2lkKiwgUHlPYmplY3QqPiogZGVzY3JpcHRvcl9vcHRpb25zID0KKyAgICAgIGNhY2hpbmdfcG9vbC0+ZGVzY3JpcHRvcl9vcHRpb25zOworICBpZiAoZGVzY3JpcHRvcl9vcHRpb25zLT5maW5kKGRlc2NyaXB0b3IpICE9IGRlc2NyaXB0b3Jfb3B0aW9ucy0+ZW5kKCkpIHsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSAoKmRlc2NyaXB0b3Jfb3B0aW9ucylbZGVzY3JpcHRvcl07CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICAvLyBTaW1pbGFyIHRvIHRoZSBDKysgaW1wbGVtZW50YXRpb24sIHdlIHJldHVybiBhbiBPcHRpb25zIG9iamVjdCBmcm9tIHRoZQorICAvLyBkZWZhdWx0IChnZW5lcmF0ZWQpIGZhY3RvcnksIHNvIHRoYXQgY2xpZW50IGNvZGUga25vdyB0aGF0IHRoZXkgY2FuIHVzZQorICAvLyBleHRlbnNpb25zIGZyb20gZ2VuZXJhdGVkIGZpbGVzOgorICAvLyAgICBkLkdldE9wdGlvbnMoKS5FeHRlbnNpb25zW3NvbWVfcGIyLmV4dGVuc2lvbl0KKyAgLy8KKyAgLy8gVGhlIGNvbnNlcXVlbmNlIGlzIHRoYXQgZXh0ZW5zaW9ucyBub3QgZGVmaW5lZCBpbiB0aGUgZGVmYXVsdCBwb29sIHdvbid0CisgIC8vIGJlIGF2YWlsYWJsZS4gIElmIG5lZWRlZCwgd2UgY291bGQgYWRkIGFuIG9wdGlvbmFsICdtZXNzYWdlX2ZhY3RvcnknCisgIC8vIHBhcmFtZXRlciB0byB0aGUgR2V0T3B0aW9ucygpIGZ1bmN0aW9uLgorICBQeU1lc3NhZ2VGYWN0b3J5KiBtZXNzYWdlX2ZhY3RvcnkgPQorICAgICAgR2V0RGVmYXVsdERlc2NyaXB0b3JQb29sKCktPnB5X21lc3NhZ2VfZmFjdG9yeTsKKworICAvLyBCdWlsZCB0aGUgT3B0aW9ucyBvYmplY3Q6IGdldCBpdHMgUHl0aG9uIGNsYXNzLCBhbmQgbWFrZSBhIGNvcHkgb2YgdGhlIEMrKworICAvLyByZWFkLW9ubHkgaW5zdGFuY2UuCisgIGNvbnN0IE1lc3NhZ2UmIG9wdGlvbnMoZGVzY3JpcHRvci0+b3B0aW9ucygpKTsKKyAgY29uc3QgRGVzY3JpcHRvciAqbWVzc2FnZV90eXBlID0gb3B0aW9ucy5HZXREZXNjcmlwdG9yKCk7CisgIENNZXNzYWdlQ2xhc3MqIG1lc3NhZ2VfY2xhc3MgPSBtZXNzYWdlX2ZhY3Rvcnk6OkdldE9yQ3JlYXRlTWVzc2FnZUNsYXNzKAorICAgICAgbWVzc2FnZV9mYWN0b3J5LCBtZXNzYWdlX3R5cGUpOworICBpZiAobWVzc2FnZV9jbGFzcyA9PSBudWxscHRyKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIkNvdWxkIG5vdCByZXRyaWV2ZSBjbGFzcyBmb3IgT3B0aW9uczogJXMiLAorICAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGUtPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFNjb3BlZFB5T2JqZWN0UHRyIGFyZ3MoUHlUdXBsZV9OZXcoMCkpOworICBTY29wZWRQeU9iamVjdFB0ciB2YWx1ZSgKKyAgICAgIFB5T2JqZWN0X0NhbGwobWVzc2FnZV9jbGFzcy0+QXNQeU9iamVjdCgpLCBhcmdzLmdldCgpLCBudWxscHRyKSk7CisgIFB5X0RFQ1JFRihtZXNzYWdlX2NsYXNzKTsKKyAgaWYgKHZhbHVlID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayh2YWx1ZS5nZXQoKSwgQ01lc3NhZ2VfVHlwZSkpIHsKKyAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJJbnZhbGlkIGNsYXNzIGZvciAlczogJXMiLAorICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZS0+ZnVsbF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHZhbHVlLmdldCgpKS0+dHBfbmFtZSk7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBDTWVzc2FnZSogY21zZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPih2YWx1ZS5nZXQoKSk7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG9wdGlvbnMuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKHJlZmxlY3Rpb24tPkdldFVua25vd25GaWVsZHMob3B0aW9ucykpOworICBpZiAodW5rbm93bl9maWVsZHMuZW1wdHkoKSkgeworICAgIGNtc2ctPm1lc3NhZ2UtPkNvcHlGcm9tKG9wdGlvbnMpOworICB9IGVsc2UgeworICAgIC8vIFJlcGFyc2Ugb3B0aW9ucyBzdHJpbmchICBYWFggY2FsbCBjbWVzc2FnZTo6TWVyZ2VGcm9tU3RyaW5nCisgICAgaWYgKCFSZXBhcnNlKG1lc3NhZ2VfZmFjdG9yeSwgb3B0aW9ucywgY21zZy0+bWVzc2FnZSkpIHsKKyAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiRXJyb3IgcmVwYXJzaW5nIE9wdGlvbnMgbWVzc2FnZSIpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICB9CisKKyAgLy8gQ2FjaGUgdGhlIHJlc3VsdC4KKyAgUHlfSU5DUkVGKHZhbHVlLmdldCgpKTsKKyAgKCpkZXNjcmlwdG9yX29wdGlvbnMpW2Rlc2NyaXB0b3JdID0gdmFsdWUuZ2V0KCk7CisKKyAgcmV0dXJuIHZhbHVlLnJlbGVhc2UoKTsKK30KKworLy8gQ29weSB0aGUgQysrIGRlc2NyaXB0b3IgdG8gYSBQeXRob24gbWVzc2FnZS4KKy8vIFRoZSBQeXRob24gbWVzc2FnZSBpcyBhbiBpbnN0YW5jZSBvZiBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8KKy8vIG9yIHNpbWlsYXIuCit0ZW1wbGF0ZTxjbGFzcyBEZXNjcmlwdG9yUHJvdG9DbGFzcywgY2xhc3MgRGVzY3JpcHRvckNsYXNzPgorc3RhdGljIFB5T2JqZWN0KiBDb3B5VG9QeXRob25Qcm90byhjb25zdCBEZXNjcmlwdG9yQ2xhc3MgKmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0YXJnZXQpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogc2VsZl9kZXNjcmlwdG9yID0KKyAgICAgIERlc2NyaXB0b3JQcm90b0NsYXNzOjpkZWZhdWx0X2luc3RhbmNlKCkuR2V0RGVzY3JpcHRvcigpOworICBDTWVzc2FnZSogbWVzc2FnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPih0YXJnZXQpOworICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayh0YXJnZXQsIENNZXNzYWdlX1R5cGUpIHx8CisgICAgICBtZXNzYWdlLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkgIT0gc2VsZl9kZXNjcmlwdG9yKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIk5vdCBhICVzIG1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICBzZWxmX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGNtZXNzYWdlOjpBc3N1cmVXcml0YWJsZShtZXNzYWdlKTsKKyAgRGVzY3JpcHRvclByb3RvQ2xhc3MqIGRlc2NyaXB0b3JfbWVzc2FnZSA9CisgICAgICBzdGF0aWNfY2FzdDxEZXNjcmlwdG9yUHJvdG9DbGFzcyo+KG1lc3NhZ2UtPm1lc3NhZ2UpOworICBkZXNjcmlwdG9yLT5Db3B5VG8oZGVzY3JpcHRvcl9tZXNzYWdlKTsKKyAgLy8gQ3VzdG9tIG9wdGlvbnMgbWlnaHQgaW4gdW5rbm93biBleHRlbnNpb25zLiBSZXBhcnNlCisgIC8vIHRoZSBkZXNjcmlwdG9yX21lc3NhZ2UuIENhbid0IHNraXAgcmVwYXJzZSB3aGVuIG9wdGlvbnMgdW5rbm93bgorICAvLyBmaWVsZHMgaXMgZW1wdHksIGJlY2F1c2UgdGhleSBtaWdodCBpbiBzdWIgZGVzY3JpcHRvcnMnIG9wdGlvbnMuCisgIFB5TWVzc2FnZUZhY3RvcnkqIG1lc3NhZ2VfZmFjdG9yeSA9CisgICAgICBHZXREZWZhdWx0RGVzY3JpcHRvclBvb2woKS0+cHlfbWVzc2FnZV9mYWN0b3J5OworICBpZiAoIVJlcGFyc2UobWVzc2FnZV9mYWN0b3J5LCAqZGVzY3JpcHRvcl9tZXNzYWdlLCBkZXNjcmlwdG9yX21lc3NhZ2UpKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJFcnJvciByZXBhcnNpbmcgZGVzY3JpcHRvciBtZXNzYWdlIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBQeV9SRVRVUk5fTk9ORTsKK30KKworLy8gQWxsIERlc2NyaXB0b3JzIGNsYXNzZXMgc2hhcmUgdGhlIHNhbWUgbWVtb3J5IGxheW91dC4KK3R5cGVkZWYgc3RydWN0IFB5QmFzZURlc2NyaXB0b3IgeworICBQeU9iamVjdF9IRUFECisKKyAgLy8gUG9pbnRlciB0byB0aGUgQysrIHByb3RvMiBkZXNjcmlwdG9yLgorICAvLyBMaWtlIGFsbCBkZXNjcmlwdG9ycywgaXQgaXMgb3duZWQgYnkgdGhlIGdsb2JhbCBEZXNjcmlwdG9yUG9vbC4KKyAgY29uc3Qgdm9pZCogZGVzY3JpcHRvcjsKKworICAvLyBPd25lZCByZWZlcmVuY2UgdG8gdGhlIERlc2NyaXB0b3JQb29sLCB0byBlbnN1cmUgaXQgaXMga2VwdCBhbGl2ZS4KKyAgUHlEZXNjcmlwdG9yUG9vbCogcG9vbDsKK30gUHlCYXNlRGVzY3JpcHRvcjsKKworCisvLyBGaWxlRGVzY3JpcHRvciBzdHJ1Y3R1cmUgImluaGVyaXRzIiBmcm9tIHRoZSBiYXNlIGRlc2NyaXB0b3IuCit0eXBlZGVmIHN0cnVjdCBQeUZpbGVEZXNjcmlwdG9yIHsKKyAgUHlCYXNlRGVzY3JpcHRvciBiYXNlOworCisgIC8vIFRoZSBjYWNoZWQgdmVyc2lvbiBvZiBzZXJpYWxpemVkIHBiLiBFaXRoZXIgbnVsbCwgb3IgYSBCeXRlcyBzdHJpbmcuCisgIC8vIFdlIG93biB0aGUgcmVmZXJlbmNlLgorICBQeU9iamVjdCAqc2VyaWFsaXplZF9wYjsKK30gUHlGaWxlRGVzY3JpcHRvcjsKKworCituYW1lc3BhY2UgZGVzY3JpcHRvciB7CisKKy8vIENyZWF0ZXMgb3IgcmV0cmlldmUgYSBQeXRob24gZGVzY3JpcHRvciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisvLyBPYmplY3RzIGFyZSBpbnRlcm5lZDogdGhlIHNhbWUgZGVzY3JpcHRvciB3aWxsIHJldHVybiB0aGUgc2FtZSBvYmplY3QgaWYgaXQKKy8vIHdhcyBrZXB0IGFsaXZlLgorLy8gJ3dhc19jcmVhdGVkJyBpcyBhbiBvcHRpb25hbCBwb2ludGVyIHRvIGEgYm9vbCwgYW5kIGlzIHNldCB0byB0cnVlIGlmIGEgbmV3CisvLyBvYmplY3Qgd2FzIGFsbG9jYXRlZC4KKy8vIEFsd2F5cyByZXR1cm4gYSBuZXcgcmVmZXJlbmNlLgordGVtcGxhdGU8Y2xhc3MgRGVzY3JpcHRvckNsYXNzPgorUHlPYmplY3QqIE5ld0ludGVybmVkRGVzY3JpcHRvcihQeVR5cGVPYmplY3QqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JDbGFzcyogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FzX2NyZWF0ZWQpIHsKKyAgaWYgKHdhc19jcmVhdGVkKSB7CisgICAgKndhc19jcmVhdGVkID0gZmFsc2U7CisgIH0KKyAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gU2VlIGlmIHRoZSBvYmplY3QgaXMgaW4gdGhlIG1hcCBvZiBpbnRlcm5lZCBkZXNjcmlwdG9ycworICBzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3Qgdm9pZCosIFB5T2JqZWN0Kj46Oml0ZXJhdG9yIGl0ID0KKyAgICAgIGludGVybmVkX2Rlc2NyaXB0b3JzLT5maW5kKGRlc2NyaXB0b3IpOworICBpZiAoaXQgIT0gaW50ZXJuZWRfZGVzY3JpcHRvcnMtPmVuZCgpKSB7CisgICAgR09PR0xFX0RDSEVDSyhQeV9UWVBFKGl0LT5zZWNvbmQpID09IHR5cGUpOworICAgIFB5X0lOQ1JFRihpdC0+c2Vjb25kKTsKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgfQorICAvLyBDcmVhdGUgYSBuZXcgZGVzY3JpcHRvciBvYmplY3QKKyAgUHlCYXNlRGVzY3JpcHRvciogcHlfZGVzY3JpcHRvciA9IFB5T2JqZWN0X0dDX05ldygKKyAgICAgIFB5QmFzZURlc2NyaXB0b3IsIHR5cGUpOworICBpZiAocHlfZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcHlfZGVzY3JpcHRvci0+ZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisKKyAgLy8gYW5kIGNhY2hlIGl0LgorICBpbnRlcm5lZF9kZXNjcmlwdG9ycy0+aW5zZXJ0KAorICAgICAgc3RkOjptYWtlX3BhaXIoZGVzY3JpcHRvciwgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHB5X2Rlc2NyaXB0b3IpKSk7CisKKyAgLy8gRW5zdXJlcyB0aGF0IHRoZSBEZXNjcmlwdG9yUG9vbCBzdGF5cyBhbGl2ZS4KKyAgUHlEZXNjcmlwdG9yUG9vbCogcG9vbCA9IEdldERlc2NyaXB0b3JQb29sX0Zyb21Qb29sKAorICAgICAgR2V0RmlsZURlc2NyaXB0b3IoZGVzY3JpcHRvciktPnBvb2woKSk7CisgIGlmIChwb29sID09IG51bGxwdHIpIHsKKyAgICAvLyBEb24ndCBERUNSRUYsIHRoZSBvYmplY3QgaXMgbm90IGZ1bGx5IGluaXRpYWxpemVkLgorICAgIFB5T2JqZWN0X0RlbChweV9kZXNjcmlwdG9yKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeV9JTkNSRUYocG9vbCk7CisgIHB5X2Rlc2NyaXB0b3ItPnBvb2wgPSBwb29sOworCisgIFB5T2JqZWN0X0dDX1RyYWNrKHB5X2Rlc2NyaXB0b3IpOworCisgIGlmICh3YXNfY3JlYXRlZCkgeworICAgICp3YXNfY3JlYXRlZCA9IHRydWU7CisgIH0KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihweV9kZXNjcmlwdG9yKTsKK30KKworc3RhdGljIHZvaWQgRGVhbGxvYyhQeU9iamVjdCogcHNlbGYpIHsKKyAgUHlCYXNlRGVzY3JpcHRvciogc2VsZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlCYXNlRGVzY3JpcHRvcio+KHBzZWxmKTsKKyAgLy8gUmVtb3ZlIGZyb20gaW50ZXJuZWQgZGljdGlvbmFyeQorICBpbnRlcm5lZF9kZXNjcmlwdG9ycy0+ZXJhc2Uoc2VsZi0+ZGVzY3JpcHRvcik7CisgIFB5X0NMRUFSKHNlbGYtPnBvb2wpOworICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHBzZWxmKTsKK30KKworc3RhdGljIGludCBHY1RyYXZlcnNlKFB5T2JqZWN0KiBwc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkKiBhcmcpIHsKKyAgUHlCYXNlRGVzY3JpcHRvciogc2VsZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlCYXNlRGVzY3JpcHRvcio+KHBzZWxmKTsKKyAgUHlfVklTSVQoc2VsZi0+cG9vbCk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEdjQ2xlYXIoUHlPYmplY3QqIHBzZWxmKSB7CisgIFB5QmFzZURlc2NyaXB0b3IqIHNlbGYgPSByZWludGVycHJldF9jYXN0PFB5QmFzZURlc2NyaXB0b3IqPihwc2VsZik7CisgIFB5X0NMRUFSKHNlbGYtPnBvb2wpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIFB5R2V0U2V0RGVmIEdldHRlcnNbXSA9IHsKKyAgICB7bnVsbHB0cn0sCit9OworCitQeVR5cGVPYmplY3QgUHlCYXNlRGVzY3JpcHRvcl9UeXBlID0geworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApIEZVTExfTU9EVUxFX05BTUUKKyAgICAiLkRlc2NyaXB0b3JCYXNlIiwgICAgICAgICAvLyB0cF9uYW1lCisgICAgc2l6ZW9mKFB5QmFzZURlc2NyaXB0b3IpLCAgLy8gdHBfYmFzaWNzaXplCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKKyAgICAoZGVzdHJ1Y3RvcilEZWFsbG9jLCAgICAgICAvLyB0cF9kZWFsbG9jCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDgwMDAwCisgICAgbnVsbHB0ciwgIC8vIHRwX3ByaW50CisjZWxzZQorICAgIDAsICAvLyB0cF92ZWN0b3JjYWxsX29mZnNldAorI2VuZGlmCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jb21wYXJlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmVwcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX251bWJlcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX3NlcXVlbmNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbWFwcGluZworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2hhc2gKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jYWxsCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc3RyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cm8KKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX2J1ZmZlcgorICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgIC8vIHRwX2ZsYWdzCisgICAgIkRlc2NyaXB0b3JzIGJhc2UgY2xhc3MiLCAgICAgICAgICAgICAgICAgLy8gdHBfZG9jCisgICAgR2NUcmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfdHJhdmVyc2UKKyAgICBHY0NsZWFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jbGVhcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JpY2hjb21wYXJlCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfd2Vha2xpc3RvZmZzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcm5leHQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZXRob2RzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbWVtYmVycworICAgIEdldHRlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldHNldAorfTsKKworfSAgLy8gbmFtZXNwYWNlIGRlc2NyaXB0b3IKKworY29uc3Qgdm9pZCogUHlEZXNjcmlwdG9yX0FzVm9pZFB0cihQeU9iamVjdCogb2JqKSB7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKG9iaiwgJmRlc2NyaXB0b3I6OlB5QmFzZURlc2NyaXB0b3JfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTm90IGEgQmFzZURlc2NyaXB0b3IiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeUJhc2VEZXNjcmlwdG9yKj4ob2JqKS0+ZGVzY3JpcHRvcjsKK30KKworbmFtZXNwYWNlIG1lc3NhZ2VfZGVzY3JpcHRvciB7CisKKy8vIFVuY2hlY2tlZCBhY2Nlc3NvciB0byB0aGUgQysrIHBvaW50ZXIuCitzdGF0aWMgY29uc3QgRGVzY3JpcHRvciogX0dldERlc2NyaXB0b3IoUHlCYXNlRGVzY3JpcHRvciogc2VsZikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBEZXNjcmlwdG9yKj4oc2VsZi0+ZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0TmFtZShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBQeVN0cmluZ19Gcm9tQ3BwU3RyaW5nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5uYW1lKCkpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEZ1bGxOYW1lKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5U3RyaW5nX0Zyb21DcHBTdHJpbmcoX0dldERlc2NyaXB0b3Ioc2VsZiktPmZ1bGxfbmFtZSgpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRGaWxlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5RmlsZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoX0dldERlc2NyaXB0b3Ioc2VsZiktPmZpbGUoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0Q29uY3JldGVDbGFzcyhQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIC8vIFJldHVybnMgdGhlIGNhbm9uaWNhbCBjbGFzcyBmb3IgdGhlIGdpdmVuIGRlc2NyaXB0b3IuCisgIC8vIFRoaXMgaXMgdGhlIGNsYXNzIHRoYXQgd2FzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcHJpbWFyeSBkZXNjcmlwdG9yIHBvb2wKKyAgLy8gd2hpY2ggY29udGFpbnMgdGhpcyBkZXNjcmlwdG9yLgorICAvLyBUaGlzIG1pZ2h0IG5vdCBiZSB0aGUgb25lIHlvdSBleHBlY3QhIEZvciBleGFtcGxlIHRoZSByZXR1cm5lZCBvYmplY3QgZG9lcworICAvLyBub3Qga25vdyBhYm91dCBleHRlbnNpb25zIGRlZmluZWQgaW4gYSBjdXN0b20gcG9vbC4KKyAgQ01lc3NhZ2VDbGFzcyogY29uY3JldGVfY2xhc3MobWVzc2FnZV9mYWN0b3J5OjpHZXRNZXNzYWdlQ2xhc3MoCisgICAgICBHZXREZXNjcmlwdG9yUG9vbF9Gcm9tUG9vbCgKKyAgICAgICAgICBfR2V0RGVzY3JpcHRvcihzZWxmKS0+ZmlsZSgpLT5wb29sKCkpLT5weV9tZXNzYWdlX2ZhY3RvcnksCisgICAgICBfR2V0RGVzY3JpcHRvcihzZWxmKSkpOworICBQeV9YSU5DUkVGKGNvbmNyZXRlX2NsYXNzKTsKKyAgcmV0dXJuIGNvbmNyZXRlX2NsYXNzLT5Bc1B5T2JqZWN0KCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RmllbGRzQnlOYW1lKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIE5ld01lc3NhZ2VGaWVsZHNCeU5hbWUoX0dldERlc2NyaXB0b3Ioc2VsZikpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEZpZWxkc0J5Q2FtZWxjYXNlTmFtZShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gTmV3TWVzc2FnZUZpZWxkc0J5Q2FtZWxjYXNlTmFtZShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RmllbGRzQnlOdW1iZXIoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gTmV3TWVzc2FnZUZpZWxkc0J5TnVtYmVyKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRGaWVsZHNTZXEoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gTmV3TWVzc2FnZUZpZWxkc1NlcShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0TmVzdGVkVHlwZXNCeU5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gTmV3TWVzc2FnZU5lc3RlZFR5cGVzQnlOYW1lKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXROZXN0ZWRUeXBlc1NlcShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBOZXdNZXNzYWdlTmVzdGVkVHlwZXNTZXEoX0dldERlc2NyaXB0b3Ioc2VsZikpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEV4dGVuc2lvbnNCeU5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gTmV3TWVzc2FnZUV4dGVuc2lvbnNCeU5hbWUoX0dldERlc2NyaXB0b3Ioc2VsZikpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEV4dGVuc2lvbnMoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gTmV3TWVzc2FnZUV4dGVuc2lvbnNTZXEoX0dldERlc2NyaXB0b3Ioc2VsZikpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEVudW1zU2VxKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIE5ld01lc3NhZ2VFbnVtc1NlcShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RW51bVR5cGVzQnlOYW1lKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIE5ld01lc3NhZ2VFbnVtc0J5TmFtZShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RW51bVZhbHVlc0J5TmFtZShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBOZXdNZXNzYWdlRW51bVZhbHVlc0J5TmFtZShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0T25lb2ZzQnlOYW1lKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIE5ld01lc3NhZ2VPbmVvZnNCeU5hbWUoX0dldERlc2NyaXB0b3Ioc2VsZikpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldE9uZW9mc1NlcShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBOZXdNZXNzYWdlT25lb2ZzU2VxKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBJc0V4dGVuZGFibGUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBpZiAoX0dldERlc2NyaXB0b3Ioc2VsZiktPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIFB5X1JFVFVSTl9UUlVFOworICB9IGVsc2UgeworICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgfQorfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEV4dGVuc2lvblJhbmdlcyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBfR2V0RGVzY3JpcHRvcihzZWxmKTsKKyAgUHlPYmplY3QqIHJhbmdlX2xpc3QgPSBQeUxpc3RfTmV3KGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UgPSBkZXNjcmlwdG9yLT5leHRlbnNpb25fcmFuZ2UoaSk7CisgICAgUHlPYmplY3QqIHN0YXJ0ID0gUHlMb25nX0Zyb21Mb25nKHJhbmdlLT5zdGFydCk7CisgICAgUHlPYmplY3QqIGVuZCA9IFB5TG9uZ19Gcm9tTG9uZyhyYW5nZS0+ZW5kKTsKKyAgICBQeUxpc3RfU2V0SXRlbShyYW5nZV9saXN0LCBpLCBQeVR1cGxlX1BhY2soMiwgc3RhcnQsIGVuZCkpOworICB9CisKKyAgcmV0dXJuIHJhbmdlX2xpc3Q7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0Q29udGFpbmluZ1R5cGUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUgPQorICAgICAgX0dldERlc2NyaXB0b3Ioc2VsZiktPmNvbnRhaW5pbmdfdHlwZSgpOworICBpZiAoY29udGFpbmluZ190eXBlKSB7CisgICAgcmV0dXJuIFB5TWVzc2FnZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoY29udGFpbmluZ190eXBlKTsKKyAgfSBlbHNlIHsKKyAgICBQeV9SRVRVUk5fTk9ORTsKKyAgfQorfQorCitzdGF0aWMgaW50IFNldENvbnRhaW5pbmdUeXBlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgiY29udGFpbmluZ190eXBlIik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0SGFzT3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBvcHRpb25zKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5vcHRpb25zKCkpOworICBpZiAoJm9wdGlvbnMgIT0gJk1lc3NhZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpIHsKKyAgICBQeV9SRVRVUk5fVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBQeV9SRVRVUk5fRkFMU0U7CisgIH0KK30KK3N0YXRpYyBpbnQgU2V0SGFzT3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIENoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoImhhc19vcHRpb25zIik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0T3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmKSB7CisgIHJldHVybiBHZXRPckJ1aWxkT3B0aW9ucyhfR2V0RGVzY3JpcHRvcihzZWxmKSk7Cit9CisKK3N0YXRpYyBpbnQgU2V0T3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgiX29wdGlvbnMiKTsKK30KKworc3RhdGljIGludCBTZXRTZXJpYWxpemVkT3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIENoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoIl9zZXJpYWxpemVkX29wdGlvbnMiKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDb3B5VG9Qcm90byhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdGFyZ2V0KSB7CisgIHJldHVybiBDb3B5VG9QeXRob25Qcm90bzxEZXNjcmlwdG9yUHJvdG8+KF9HZXREZXNjcmlwdG9yKHNlbGYpLCB0YXJnZXQpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEVudW1WYWx1ZU5hbWUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgY29uc3QgY2hhciAqZW51bV9uYW1lOworICBpbnQgbnVtYmVyOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpIiwgJmVudW1fbmFtZSwgJm51bWJlcikpIHJldHVybiBudWxscHRyOworICBjb25zdCBFbnVtRGVzY3JpcHRvciAqZW51bV90eXBlID0KKyAgICAgIF9HZXREZXNjcmlwdG9yKHNlbGYpLT5GaW5kRW51bVR5cGVCeU5hbWUoZW51bV9uYW1lKTsKKyAgaWYgKGVudW1fdHlwZSA9PSBudWxscHRyKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLCBlbnVtX25hbWUpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IgKmVudW1fdmFsdWUgPQorICAgICAgZW51bV90eXBlLT5GaW5kVmFsdWVCeU51bWJlcihudW1iZXIpOworICBpZiAoZW51bV92YWx1ZSA9PSBudWxscHRyKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLCAiJWQiLCBudW1iZXIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBQeVN0cmluZ19Gcm9tQ3BwU3RyaW5nKGVudW1fdmFsdWUtPm5hbWUoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0U3ludGF4KFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nKAorICAgICAgRmlsZURlc2NyaXB0b3I6OlN5bnRheE5hbWUoX0dldERlc2NyaXB0b3Ioc2VsZiktPmZpbGUoKS0+c3ludGF4KCkpKTsKK30KKworc3RhdGljIFB5R2V0U2V0RGVmIEdldHRlcnNbXSA9IHsKKyAgICB7Im5hbWUiLCAoZ2V0dGVyKUdldE5hbWUsIG51bGxwdHIsICJMYXN0IG5hbWUifSwKKyAgICB7ImZ1bGxfbmFtZSIsIChnZXR0ZXIpR2V0RnVsbE5hbWUsIG51bGxwdHIsICJGdWxsIG5hbWUifSwKKyAgICB7Il9jb25jcmV0ZV9jbGFzcyIsIChnZXR0ZXIpR2V0Q29uY3JldGVDbGFzcywgbnVsbHB0ciwgImNvbmNyZXRlIGNsYXNzIn0sCisgICAgeyJmaWxlIiwgKGdldHRlcilHZXRGaWxlLCBudWxscHRyLCAiRmlsZSBkZXNjcmlwdG9yIn0sCisKKyAgICB7ImZpZWxkcyIsIChnZXR0ZXIpR2V0RmllbGRzU2VxLCBudWxscHRyLCAiRmllbGRzIHNlcXVlbmNlIn0sCisgICAgeyJmaWVsZHNfYnlfbmFtZSIsIChnZXR0ZXIpR2V0RmllbGRzQnlOYW1lLCBudWxscHRyLCAiRmllbGRzIGJ5IG5hbWUifSwKKyAgICB7ImZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZSIsIChnZXR0ZXIpR2V0RmllbGRzQnlDYW1lbGNhc2VOYW1lLCBudWxscHRyLAorICAgICAiRmllbGRzIGJ5IGNhbWVsQ2FzZSBuYW1lIn0sCisgICAgeyJmaWVsZHNfYnlfbnVtYmVyIiwgKGdldHRlcilHZXRGaWVsZHNCeU51bWJlciwgbnVsbHB0ciwKKyAgICAgIkZpZWxkcyBieSBudW1iZXIifSwKKyAgICB7Im5lc3RlZF90eXBlcyIsIChnZXR0ZXIpR2V0TmVzdGVkVHlwZXNTZXEsIG51bGxwdHIsCisgICAgICJOZXN0ZWQgdHlwZXMgc2VxdWVuY2UifSwKKyAgICB7Im5lc3RlZF90eXBlc19ieV9uYW1lIiwgKGdldHRlcilHZXROZXN0ZWRUeXBlc0J5TmFtZSwgbnVsbHB0ciwKKyAgICAgIk5lc3RlZCB0eXBlcyBieSBuYW1lIn0sCisgICAgeyJleHRlbnNpb25zIiwgKGdldHRlcilHZXRFeHRlbnNpb25zLCBudWxscHRyLCAiRXh0ZW5zaW9ucyBTZXF1ZW5jZSJ9LAorICAgIHsiZXh0ZW5zaW9uc19ieV9uYW1lIiwgKGdldHRlcilHZXRFeHRlbnNpb25zQnlOYW1lLCBudWxscHRyLAorICAgICAiRXh0ZW5zaW9ucyBieSBuYW1lIn0sCisgICAgeyJleHRlbnNpb25fcmFuZ2VzIiwgKGdldHRlcilHZXRFeHRlbnNpb25SYW5nZXMsIG51bGxwdHIsCisgICAgICJFeHRlbnNpb24gcmFuZ2VzIn0sCisgICAgeyJlbnVtX3R5cGVzIiwgKGdldHRlcilHZXRFbnVtc1NlcSwgbnVsbHB0ciwgIkVudW0gc2VxdWVuY2UifSwKKyAgICB7ImVudW1fdHlwZXNfYnlfbmFtZSIsIChnZXR0ZXIpR2V0RW51bVR5cGVzQnlOYW1lLCBudWxscHRyLAorICAgICAiRW51bSB0eXBlcyBieSBuYW1lIn0sCisgICAgeyJlbnVtX3ZhbHVlc19ieV9uYW1lIiwgKGdldHRlcilHZXRFbnVtVmFsdWVzQnlOYW1lLCBudWxscHRyLAorICAgICAiRW51bSB2YWx1ZXMgYnkgbmFtZSJ9LAorICAgIHsib25lb2ZzX2J5X25hbWUiLCAoZ2V0dGVyKUdldE9uZW9mc0J5TmFtZSwgbnVsbHB0ciwgIk9uZW9mcyBieSBuYW1lIn0sCisgICAgeyJvbmVvZnMiLCAoZ2V0dGVyKUdldE9uZW9mc1NlcSwgbnVsbHB0ciwgIk9uZW9mcyBieSBuYW1lIn0sCisgICAgeyJjb250YWluaW5nX3R5cGUiLCAoZ2V0dGVyKUdldENvbnRhaW5pbmdUeXBlLCAoc2V0dGVyKVNldENvbnRhaW5pbmdUeXBlLAorICAgICAiQ29udGFpbmluZyB0eXBlIn0sCisgICAgeyJpc19leHRlbmRhYmxlIiwgKGdldHRlcilJc0V4dGVuZGFibGUsIChzZXR0ZXIpIG51bGxwdHJ9LAorICAgIHsiaGFzX29wdGlvbnMiLCAoZ2V0dGVyKUdldEhhc09wdGlvbnMsIChzZXR0ZXIpU2V0SGFzT3B0aW9ucywKKyAgICAgIkhhcyBPcHRpb25zIn0sCisgICAgeyJfb3B0aW9ucyIsIChnZXR0ZXIpIG51bGxwdHIsIChzZXR0ZXIpU2V0T3B0aW9ucywgIk9wdGlvbnMifSwKKyAgICB7Il9zZXJpYWxpemVkX29wdGlvbnMiLCAoZ2V0dGVyKSBudWxscHRyLCAoc2V0dGVyKVNldFNlcmlhbGl6ZWRPcHRpb25zLAorICAgICAiU2VyaWFsaXplZCBPcHRpb25zIn0sCisgICAgeyJzeW50YXgiLCAoZ2V0dGVyKUdldFN5bnRheCwgKHNldHRlcikgbnVsbHB0ciwgIlN5bnRheCJ9LAorICAgIHtudWxscHRyfSwKK307CisKK3N0YXRpYyBQeU1ldGhvZERlZiBNZXRob2RzW10gPSB7CisgICAgeyJHZXRPcHRpb25zIiwgKFB5Q0Z1bmN0aW9uKUdldE9wdGlvbnMsIE1FVEhfTk9BUkdTfSwKKyAgICB7IkNvcHlUb1Byb3RvIiwgKFB5Q0Z1bmN0aW9uKUNvcHlUb1Byb3RvLCBNRVRIX099LAorICAgIHsiRW51bVZhbHVlTmFtZSIsIChQeUNGdW5jdGlvbilFbnVtVmFsdWVOYW1lLCBNRVRIX1ZBUkFSR1N9LAorICAgIHtudWxscHRyfSwKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZXNzYWdlX2Rlc2NyaXB0b3IKKworUHlUeXBlT2JqZWN0IFB5TWVzc2FnZURlc2NyaXB0b3JfVHlwZSA9IHsKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKSBGVUxMX01PRFVMRV9OQU1FCisgICAgIi5NZXNzYWdlRGVzY3JpcHRvciIsICAgICAgLy8gdHBfbmFtZQorICAgIHNpemVvZihQeUJhc2VEZXNjcmlwdG9yKSwgIC8vIHRwX2Jhc2ljc2l6ZQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZW1zaXplCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVhbGxvYworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMzA4MDAwMAorICAgIG51bGxwdHIsICAvLyB0cF9wcmludAorI2Vsc2UKKyAgICAwLCAgLy8gdHBfdmVjdG9yY2FsbF9vZmZzZXQKKyNlbmRpZgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY29tcGFyZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yZXByCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX251bWJlcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19zZXF1ZW5jZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19tYXBwaW5nCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2hhc2gKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2FsbAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zdHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cm8KKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cm8KKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfYnVmZmVyCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgIC8vIHRwX2ZsYWdzCisgICAgIkEgTWVzc2FnZSBEZXNjcmlwdG9yIiwgICAgICAgICAgICAgIC8vIHRwX2RvYworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF90cmF2ZXJzZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jbGVhcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yaWNoY29tcGFyZQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF93ZWFrbGlzdG9mZnNldAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXJuZXh0CisgICAgbWVzc2FnZV9kZXNjcmlwdG9yOjpNZXRob2RzLCAgICAgICAgIC8vIHRwX21ldGhvZHMKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbWVtYmVycworICAgIG1lc3NhZ2VfZGVzY3JpcHRvcjo6R2V0dGVycywgICAgICAgICAvLyB0cF9nZXRzZXQKKyAgICAmZGVzY3JpcHRvcjo6UHlCYXNlRGVzY3JpcHRvcl9UeXBlLCAgLy8gdHBfYmFzZQorfTsKKworUHlPYmplY3QqIFB5TWVzc2FnZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoCisgICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV9kZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yOjpOZXdJbnRlcm5lZERlc2NyaXB0b3IoJlB5TWVzc2FnZURlc2NyaXB0b3JfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2Rlc2NyaXB0b3IsIG51bGxwdHIpOworfQorCitjb25zdCBEZXNjcmlwdG9yKiBQeU1lc3NhZ2VEZXNjcmlwdG9yX0FzRGVzY3JpcHRvcihQeU9iamVjdCogb2JqKSB7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKG9iaiwgJlB5TWVzc2FnZURlc2NyaXB0b3JfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTm90IGEgTWVzc2FnZURlc2NyaXB0b3IiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBEZXNjcmlwdG9yKj4oCisgICAgICByZWludGVycHJldF9jYXN0PFB5QmFzZURlc2NyaXB0b3IqPihvYmopLT5kZXNjcmlwdG9yKTsKK30KKworbmFtZXNwYWNlIGZpZWxkX2Rlc2NyaXB0b3IgeworCisvLyBVbmNoZWNrZWQgYWNjZXNzb3IgdG8gdGhlIEMrKyBwb2ludGVyLgorc3RhdGljIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogX0dldERlc2NyaXB0b3IoCisgICAgUHlCYXNlRGVzY3JpcHRvciAqc2VsZikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBGaWVsZERlc2NyaXB0b3IqPihzZWxmLT5kZXNjcmlwdG9yKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRGdWxsTmFtZShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBQeVN0cmluZ19Gcm9tQ3BwU3RyaW5nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5mdWxsX25hbWUoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0TmFtZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBQeVN0cmluZ19Gcm9tQ3BwU3RyaW5nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5uYW1lKCkpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldENhbWVsY2FzZU5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gUHlTdHJpbmdfRnJvbUNwcFN0cmluZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+Y2FtZWxjYXNlX25hbWUoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0SnNvbk5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gUHlTdHJpbmdfRnJvbUNwcFN0cmluZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+anNvbl9uYW1lKCkpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEZpbGUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gUHlGaWxlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihfR2V0RGVzY3JpcHRvcihzZWxmKS0+ZmlsZSgpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRUeXBlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+dHlwZSgpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRDcHBUeXBlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+Y3BwX3R5cGUoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0TGFiZWwoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5sYWJlbCgpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXROdW1iZXIoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5udW1iZXIoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0SW5kZXgoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5pbmRleCgpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRJRChQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoc2VsZik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogSXNFeHRlbnNpb24oUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5pc19leHRlbnNpb24oKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogSGFzRGVmYXVsdFZhbHVlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RGVmYXVsdFZhbHVlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgUHlPYmplY3QgKnJlc3VsdDsKKworICBpZiAoX0dldERlc2NyaXB0b3Ioc2VsZiktPmlzX3JlcGVhdGVkKCkpIHsKKyAgICByZXR1cm4gUHlMaXN0X05ldygwKTsKKyAgfQorCisKKyAgc3dpdGNoIChfR2V0RGVzY3JpcHRvcihzZWxmKS0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7CisgICAgICBpbnQzMl90IHZhbHVlID0gX0dldERlc2NyaXB0b3Ioc2VsZiktPmRlZmF1bHRfdmFsdWVfaW50MzIoKTsKKyAgICAgIHJlc3VsdCA9IFB5TG9uZ19Gcm9tTG9uZyh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKKyAgICAgIGludDY0X3QgdmFsdWUgPSBfR2V0RGVzY3JpcHRvcihzZWxmKS0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCgpOworICAgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7CisgICAgICB1aW50MzJfdCB2YWx1ZSA9IF9HZXREZXNjcmlwdG9yKHNlbGYpLT5kZWZhdWx0X3ZhbHVlX3VpbnQzMigpOworICAgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21Tc2l6ZV90KHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6IHsKKyAgICAgIHVpbnQ2NF90IHZhbHVlID0gX0dldERlc2NyaXB0b3Ioc2VsZiktPmRlZmF1bHRfdmFsdWVfdWludDY0KCk7CisgICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CisgICAgICBmbG9hdCB2YWx1ZSA9IF9HZXREZXNjcmlwdG9yKHNlbGYpLT5kZWZhdWx0X3ZhbHVlX2Zsb2F0KCk7CisgICAgICByZXN1bHQgPSBQeUZsb2F0X0Zyb21Eb3VibGUodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRTogeworICAgICAgZG91YmxlIHZhbHVlID0gX0dldERlc2NyaXB0b3Ioc2VsZiktPmRlZmF1bHRfdmFsdWVfZG91YmxlKCk7CisgICAgICByZXN1bHQgPSBQeUZsb2F0X0Zyb21Eb3VibGUodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6IHsKKyAgICAgIGJvb2wgdmFsdWUgPSBfR2V0RGVzY3JpcHRvcihzZWxmKS0+ZGVmYXVsdF92YWx1ZV9ib29sKCk7CisgICAgICByZXN1bHQgPSBQeUJvb2xfRnJvbUxvbmcodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlID0gX0dldERlc2NyaXB0b3Ioc2VsZiktPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCk7CisgICAgICByZXN1bHQgPSBUb1N0cmluZ09iamVjdChfR2V0RGVzY3JpcHRvcihzZWxmKSwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06IHsKKyAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlID0KKyAgICAgICAgICBfR2V0RGVzY3JpcHRvcihzZWxmKS0+ZGVmYXVsdF92YWx1ZV9lbnVtKCk7CisgICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbUxvbmcodmFsdWUtPm51bWJlcigpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOiB7CisgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsICJkZWZhdWx0IHZhbHVlIGZvciAlcyIsCisgICAgICAgICAgICAgICAgICAgX0dldERlc2NyaXB0b3Ioc2VsZiktPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRDRGVzY3JpcHRvcihQeU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBQeV9JTkNSRUYoc2VsZik7CisgIHJldHVybiBzZWxmOworfQorCitzdGF0aWMgUHlPYmplY3QgKkdldEVudW1UeXBlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZSA9IF9HZXREZXNjcmlwdG9yKHNlbGYpLT5lbnVtX3R5cGUoKTsKKyAgaWYgKGVudW1fdHlwZSkgeworICAgIHJldHVybiBQeUVudW1EZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGVudW1fdHlwZSk7CisgIH0gZWxzZSB7CisgICAgUHlfUkVUVVJOX05PTkU7CisgIH0KK30KKworc3RhdGljIGludCBTZXRFbnVtVHlwZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIENoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoImVudW1fdHlwZSIpOworfQorCitzdGF0aWMgUHlPYmplY3QgKkdldE1lc3NhZ2VUeXBlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlID0gX0dldERlc2NyaXB0b3Ioc2VsZiktPm1lc3NhZ2VfdHlwZSgpOworICBpZiAobWVzc2FnZV90eXBlKSB7CisgICAgcmV0dXJuIFB5TWVzc2FnZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IobWVzc2FnZV90eXBlKTsKKyAgfSBlbHNlIHsKKyAgICBQeV9SRVRVUk5fTk9ORTsKKyAgfQorfQorCitzdGF0aWMgaW50IFNldE1lc3NhZ2VUeXBlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgibWVzc2FnZV90eXBlIik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0Q29udGFpbmluZ1R5cGUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUgPQorICAgICAgX0dldERlc2NyaXB0b3Ioc2VsZiktPmNvbnRhaW5pbmdfdHlwZSgpOworICBpZiAoY29udGFpbmluZ190eXBlKSB7CisgICAgcmV0dXJuIFB5TWVzc2FnZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoY29udGFpbmluZ190eXBlKTsKKyAgfSBlbHNlIHsKKyAgICBQeV9SRVRVUk5fTk9ORTsKKyAgfQorfQorCitzdGF0aWMgaW50IFNldENvbnRhaW5pbmdUeXBlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgiY29udGFpbmluZ190eXBlIik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RXh0ZW5zaW9uU2NvcGUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBjb25zdCBhdXRvKiBkZXNjID0gX0dldERlc2NyaXB0b3Ioc2VsZik7CisgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuc2lvbl9zY29wZSA9CisgICAgICBkZXNjLT5pc19leHRlbnNpb24oKSA/IGRlc2MtPmV4dGVuc2lvbl9zY29wZSgpIDogbnVsbHB0cjsKKyAgaWYgKGV4dGVuc2lvbl9zY29wZSkgeworICAgIHJldHVybiBQeU1lc3NhZ2VEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGV4dGVuc2lvbl9zY29wZSk7CisgIH0gZWxzZSB7CisgICAgUHlfUkVUVVJOX05PTkU7CisgIH0KK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRDb250YWluaW5nT25lb2YoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIGNvbnRhaW5pbmdfb25lb2YgPQorICAgICAgX0dldERlc2NyaXB0b3Ioc2VsZiktPmNvbnRhaW5pbmdfb25lb2YoKTsKKyAgaWYgKGNvbnRhaW5pbmdfb25lb2YpIHsKKyAgICByZXR1cm4gUHlPbmVvZkRlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoY29udGFpbmluZ19vbmVvZik7CisgIH0gZWxzZSB7CisgICAgUHlfUkVUVVJOX05PTkU7CisgIH0KK30KKworc3RhdGljIGludCBTZXRDb250YWluaW5nT25lb2YoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgiY29udGFpbmluZ19vbmVvZiIpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEhhc09wdGlvbnMoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBjb25zdCBGaWVsZE9wdGlvbnMmIG9wdGlvbnMoX0dldERlc2NyaXB0b3Ioc2VsZiktPm9wdGlvbnMoKSk7CisgIGlmICgmb3B0aW9ucyAhPSAmRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpIHsKKyAgICBQeV9SRVRVUk5fVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBQeV9SRVRVUk5fRkFMU0U7CisgIH0KK30KK3N0YXRpYyBpbnQgU2V0SGFzT3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgiaGFzX29wdGlvbnMiKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRIYXNQcmVzZW5jZShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkKiBjbG9zdXJlKSB7CisgIGlmIChfR2V0RGVzY3JpcHRvcihzZWxmKS0+aGFzX3ByZXNlbmNlKCkpIHsKKyAgICBQeV9SRVRVUk5fVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBQeV9SRVRVUk5fRkFMU0U7CisgIH0KK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRPcHRpb25zKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYpIHsKKyAgcmV0dXJuIEdldE9yQnVpbGRPcHRpb25zKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKK30KKworc3RhdGljIGludCBTZXRPcHRpb25zKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBDaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCJfb3B0aW9ucyIpOworfQorCitzdGF0aWMgaW50IFNldFNlcmlhbGl6ZWRPcHRpb25zKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgiX3NlcmlhbGl6ZWRfb3B0aW9ucyIpOworfQorCitzdGF0aWMgUHlHZXRTZXREZWYgR2V0dGVyc1tdID0geworICAgIHsiZnVsbF9uYW1lIiwgKGdldHRlcilHZXRGdWxsTmFtZSwgbnVsbHB0ciwgIkZ1bGwgbmFtZSJ9LAorICAgIHsibmFtZSIsIChnZXR0ZXIpR2V0TmFtZSwgbnVsbHB0ciwgIlVucXVhbGlmaWVkIG5hbWUifSwKKyAgICB7ImNhbWVsY2FzZV9uYW1lIiwgKGdldHRlcilHZXRDYW1lbGNhc2VOYW1lLCBudWxscHRyLCAiQ2FtZWxjYXNlIG5hbWUifSwKKyAgICB7Impzb25fbmFtZSIsIChnZXR0ZXIpR2V0SnNvbk5hbWUsIG51bGxwdHIsICJKc29uIG5hbWUifSwKKyAgICB7ImZpbGUiLCAoZ2V0dGVyKUdldEZpbGUsIG51bGxwdHIsICJGaWxlIERlc2NyaXB0b3IifSwKKyAgICB7InR5cGUiLCAoZ2V0dGVyKUdldFR5cGUsIG51bGxwdHIsICJDKysgVHlwZSJ9LAorICAgIHsiY3BwX3R5cGUiLCAoZ2V0dGVyKUdldENwcFR5cGUsIG51bGxwdHIsICJDKysgVHlwZSJ9LAorICAgIHsibGFiZWwiLCAoZ2V0dGVyKUdldExhYmVsLCBudWxscHRyLCAiTGFiZWwifSwKKyAgICB7Im51bWJlciIsIChnZXR0ZXIpR2V0TnVtYmVyLCBudWxscHRyLCAiTnVtYmVyIn0sCisgICAgeyJpbmRleCIsIChnZXR0ZXIpR2V0SW5kZXgsIG51bGxwdHIsICJJbmRleCJ9LAorICAgIHsiZGVmYXVsdF92YWx1ZSIsIChnZXR0ZXIpR2V0RGVmYXVsdFZhbHVlLCBudWxscHRyLCAiRGVmYXVsdCBWYWx1ZSJ9LAorICAgIHsiaGFzX2RlZmF1bHRfdmFsdWUiLCAoZ2V0dGVyKUhhc0RlZmF1bHRWYWx1ZX0sCisgICAgeyJpc19leHRlbnNpb24iLCAoZ2V0dGVyKUlzRXh0ZW5zaW9uLCBudWxscHRyLCAiSUQifSwKKyAgICB7ImlkIiwgKGdldHRlcilHZXRJRCwgbnVsbHB0ciwgIklEIn0sCisgICAgeyJfY2Rlc2NyaXB0b3IiLCAoZ2V0dGVyKUdldENEZXNjcmlwdG9yLCBudWxscHRyLCAiSEFBQ0sgUkVNT1ZFIE1FIn0sCisKKyAgICB7Im1lc3NhZ2VfdHlwZSIsIChnZXR0ZXIpR2V0TWVzc2FnZVR5cGUsIChzZXR0ZXIpU2V0TWVzc2FnZVR5cGUsCisgICAgICJNZXNzYWdlIHR5cGUifSwKKyAgICB7ImVudW1fdHlwZSIsIChnZXR0ZXIpR2V0RW51bVR5cGUsIChzZXR0ZXIpU2V0RW51bVR5cGUsICJFbnVtIHR5cGUifSwKKyAgICB7ImNvbnRhaW5pbmdfdHlwZSIsIChnZXR0ZXIpR2V0Q29udGFpbmluZ1R5cGUsIChzZXR0ZXIpU2V0Q29udGFpbmluZ1R5cGUsCisgICAgICJDb250YWluaW5nIHR5cGUifSwKKyAgICB7ImV4dGVuc2lvbl9zY29wZSIsIChnZXR0ZXIpR2V0RXh0ZW5zaW9uU2NvcGUsIChzZXR0ZXIpIG51bGxwdHIsCisgICAgICJFeHRlbnNpb24gc2NvcGUifSwKKyAgICB7ImNvbnRhaW5pbmdfb25lb2YiLCAoZ2V0dGVyKUdldENvbnRhaW5pbmdPbmVvZiwgKHNldHRlcilTZXRDb250YWluaW5nT25lb2YsCisgICAgICJDb250YWluaW5nIG9uZW9mIn0sCisgICAgeyJoYXNfb3B0aW9ucyIsIChnZXR0ZXIpR2V0SGFzT3B0aW9ucywgKHNldHRlcilTZXRIYXNPcHRpb25zLAorICAgICAiSGFzIE9wdGlvbnMifSwKKyAgICB7Imhhc19wcmVzZW5jZSIsIChnZXR0ZXIpR2V0SGFzUHJlc2VuY2UsIChzZXR0ZXIpIG51bGxwdHIsICJIYXMgUHJlc2VuY2UifSwKKyAgICB7Il9vcHRpb25zIiwgKGdldHRlcikgbnVsbHB0ciwgKHNldHRlcilTZXRPcHRpb25zLCAiT3B0aW9ucyJ9LAorICAgIHsiX3NlcmlhbGl6ZWRfb3B0aW9ucyIsIChnZXR0ZXIpIG51bGxwdHIsIChzZXR0ZXIpU2V0U2VyaWFsaXplZE9wdGlvbnMsCisgICAgICJTZXJpYWxpemVkIE9wdGlvbnMifSwKKyAgICB7bnVsbHB0cn0sCit9OworCitzdGF0aWMgUHlNZXRob2REZWYgTWV0aG9kc1tdID0geworICAgIHsiR2V0T3B0aW9ucyIsIChQeUNGdW5jdGlvbilHZXRPcHRpb25zLCBNRVRIX05PQVJHU30sCisgICAge251bGxwdHJ9LAorfTsKKworfSAgLy8gbmFtZXNwYWNlIGZpZWxkX2Rlc2NyaXB0b3IKKworUHlUeXBlT2JqZWN0IFB5RmllbGREZXNjcmlwdG9yX1R5cGUgPSB7CisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkgRlVMTF9NT0RVTEVfTkFNRQorICAgICIuRmllbGREZXNjcmlwdG9yIiwgICAgICAgIC8vIHRwX25hbWUKKyAgICBzaXplb2YoUHlCYXNlRGVzY3JpcHRvciksICAvLyB0cF9iYXNpY3NpemUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVtc2l6ZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2RlYWxsb2MKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwODAwMDAKKyAgICBudWxscHRyLCAgLy8gdHBfcHJpbnQKKyNlbHNlCisgICAgMCwgIC8vIHRwX3ZlY3RvcmNhbGxfb2Zmc2V0CisjZW5kaWYKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NvbXBhcmUKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmVwcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19udW1iZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfc2VxdWVuY2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbWFwcGluZworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9oYXNoCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NhbGwKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc3RyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX2J1ZmZlcgorICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAvLyB0cF9mbGFncworICAgICJBIEZpZWxkIERlc2NyaXB0b3IiLCAgICAgICAgICAgICAgICAvLyB0cF9kb2MKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfdHJhdmVyc2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2xlYXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmljaGNvbXBhcmUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfd2Vha2xpc3RvZmZzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVybmV4dAorICAgIGZpZWxkX2Rlc2NyaXB0b3I6Ok1ldGhvZHMsICAgICAgICAgICAvLyB0cF9tZXRob2RzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21lbWJlcnMKKyAgICBmaWVsZF9kZXNjcmlwdG9yOjpHZXR0ZXJzLCAgICAgICAgICAgLy8gdHBfZ2V0c2V0CisgICAgJmRlc2NyaXB0b3I6OlB5QmFzZURlc2NyaXB0b3JfVHlwZSwgIC8vIHRwX2Jhc2UKK307CisKK1B5T2JqZWN0KiBQeUZpZWxkRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld0ludGVybmVkRGVzY3JpcHRvcigmUHlGaWVsZERlc2NyaXB0b3JfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLCBudWxscHRyKTsKK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKiBQeUZpZWxkRGVzY3JpcHRvcl9Bc0Rlc2NyaXB0b3IoUHlPYmplY3QqIG9iaikgeworICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhvYmosICZQeUZpZWxkRGVzY3JpcHRvcl9UeXBlKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJOb3QgYSBGaWVsZERlc2NyaXB0b3IiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBGaWVsZERlc2NyaXB0b3IqPigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlCYXNlRGVzY3JpcHRvcio+KG9iaiktPmRlc2NyaXB0b3IpOworfQorCituYW1lc3BhY2UgZW51bV9kZXNjcmlwdG9yIHsKKworLy8gVW5jaGVja2VkIGFjY2Vzc29yIHRvIHRoZSBDKysgcG9pbnRlci4KK3N0YXRpYyBjb25zdCBFbnVtRGVzY3JpcHRvciogX0dldERlc2NyaXB0b3IoCisgICAgUHlCYXNlRGVzY3JpcHRvciAqc2VsZikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbnVtRGVzY3JpcHRvcio+KHNlbGYtPmRlc2NyaXB0b3IpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEZ1bGxOYW1lKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5U3RyaW5nX0Zyb21DcHBTdHJpbmcoX0dldERlc2NyaXB0b3Ioc2VsZiktPmZ1bGxfbmFtZSgpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXROYW1lKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5U3RyaW5nX0Zyb21DcHBTdHJpbmcoX0dldERlc2NyaXB0b3Ioc2VsZiktPm5hbWUoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RmlsZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBQeUZpbGVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5maWxlKCkpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEVudW12YWx1ZXNCeU5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gTmV3RW51bVZhbHVlc0J5TmFtZShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RW51bXZhbHVlc0J5TnVtYmVyKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIE5ld0VudW1WYWx1ZXNCeU51bWJlcihfR2V0RGVzY3JpcHRvcihzZWxmKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RW51bXZhbHVlc1NlcShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBOZXdFbnVtVmFsdWVzU2VxKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRDb250YWluaW5nVHlwZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSA9CisgICAgICBfR2V0RGVzY3JpcHRvcihzZWxmKS0+Y29udGFpbmluZ190eXBlKCk7CisgIGlmIChjb250YWluaW5nX3R5cGUpIHsKKyAgICByZXR1cm4gUHlNZXNzYWdlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihjb250YWluaW5nX3R5cGUpOworICB9IGVsc2UgeworICAgIFB5X1JFVFVSTl9OT05FOworICB9Cit9CisKK3N0YXRpYyBpbnQgU2V0Q29udGFpbmluZ1R5cGUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBDaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCJjb250YWluaW5nX3R5cGUiKTsKK30KKworCitzdGF0aWMgUHlPYmplY3QqIEdldEhhc09wdGlvbnMoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBjb25zdCBFbnVtT3B0aW9ucyYgb3B0aW9ucyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+b3B0aW9ucygpKTsKKyAgaWYgKCZvcHRpb25zICE9ICZFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgUHlfUkVUVVJOX1RSVUU7CisgIH0gZWxzZSB7CisgICAgUHlfUkVUVVJOX0ZBTFNFOworICB9Cit9CitzdGF0aWMgaW50IFNldEhhc09wdGlvbnMoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIENoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoImhhc19vcHRpb25zIik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0T3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmKSB7CisgIHJldHVybiBHZXRPckJ1aWxkT3B0aW9ucyhfR2V0RGVzY3JpcHRvcihzZWxmKSk7Cit9CisKK3N0YXRpYyBpbnQgU2V0T3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgiX29wdGlvbnMiKTsKK30KKworc3RhdGljIGludCBTZXRTZXJpYWxpemVkT3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIENoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoIl9zZXJpYWxpemVkX29wdGlvbnMiKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDb3B5VG9Qcm90byhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdGFyZ2V0KSB7CisgIHJldHVybiBDb3B5VG9QeXRob25Qcm90bzxFbnVtRGVzY3JpcHRvclByb3RvPihfR2V0RGVzY3JpcHRvcihzZWxmKSwgdGFyZ2V0KTsKK30KKworc3RhdGljIFB5TWV0aG9kRGVmIE1ldGhvZHNbXSA9IHsKKyAgICB7IkdldE9wdGlvbnMiLCAoUHlDRnVuY3Rpb24pR2V0T3B0aW9ucywgTUVUSF9OT0FSR1N9LAorICAgIHsiQ29weVRvUHJvdG8iLCAoUHlDRnVuY3Rpb24pQ29weVRvUHJvdG8sIE1FVEhfT30sCisgICAge251bGxwdHJ9LAorfTsKKworc3RhdGljIFB5R2V0U2V0RGVmIEdldHRlcnNbXSA9IHsKKyAgICB7ImZ1bGxfbmFtZSIsIChnZXR0ZXIpR2V0RnVsbE5hbWUsIG51bGxwdHIsICJGdWxsIG5hbWUifSwKKyAgICB7Im5hbWUiLCAoZ2V0dGVyKUdldE5hbWUsIG51bGxwdHIsICJsYXN0IG5hbWUifSwKKyAgICB7ImZpbGUiLCAoZ2V0dGVyKUdldEZpbGUsIG51bGxwdHIsICJGaWxlIGRlc2NyaXB0b3IifSwKKyAgICB7InZhbHVlcyIsIChnZXR0ZXIpR2V0RW51bXZhbHVlc1NlcSwgbnVsbHB0ciwgInZhbHVlcyJ9LAorICAgIHsidmFsdWVzX2J5X25hbWUiLCAoZ2V0dGVyKUdldEVudW12YWx1ZXNCeU5hbWUsIG51bGxwdHIsCisgICAgICJFbnVtIHZhbHVlcyBieSBuYW1lIn0sCisgICAgeyJ2YWx1ZXNfYnlfbnVtYmVyIiwgKGdldHRlcilHZXRFbnVtdmFsdWVzQnlOdW1iZXIsIG51bGxwdHIsCisgICAgICJFbnVtIHZhbHVlcyBieSBudW1iZXIifSwKKworICAgIHsiY29udGFpbmluZ190eXBlIiwgKGdldHRlcilHZXRDb250YWluaW5nVHlwZSwgKHNldHRlcilTZXRDb250YWluaW5nVHlwZSwKKyAgICAgIkNvbnRhaW5pbmcgdHlwZSJ9LAorICAgIHsiaGFzX29wdGlvbnMiLCAoZ2V0dGVyKUdldEhhc09wdGlvbnMsIChzZXR0ZXIpU2V0SGFzT3B0aW9ucywKKyAgICAgIkhhcyBPcHRpb25zIn0sCisgICAgeyJfb3B0aW9ucyIsIChnZXR0ZXIpIG51bGxwdHIsIChzZXR0ZXIpU2V0T3B0aW9ucywgIk9wdGlvbnMifSwKKyAgICB7Il9zZXJpYWxpemVkX29wdGlvbnMiLCAoZ2V0dGVyKSBudWxscHRyLCAoc2V0dGVyKVNldFNlcmlhbGl6ZWRPcHRpb25zLAorICAgICAiU2VyaWFsaXplZCBPcHRpb25zIn0sCisgICAge251bGxwdHJ9LAorfTsKKworfSAgLy8gbmFtZXNwYWNlIGVudW1fZGVzY3JpcHRvcgorCitQeVR5cGVPYmplY3QgUHlFbnVtRGVzY3JpcHRvcl9UeXBlID0geworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApIEZVTExfTU9EVUxFX05BTUUKKyAgICAiLkVudW1EZXNjcmlwdG9yIiwgICAgICAgICAvLyB0cF9uYW1lCisgICAgc2l6ZW9mKFB5QmFzZURlc2NyaXB0b3IpLCAgLy8gdHBfYmFzaWNzaXplCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9kZWFsbG9jCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDgwMDAwCisgICAgbnVsbHB0ciwgIC8vIHRwX3ByaW50CisjZWxzZQorICAgIDAsICAvLyB0cF92ZWN0b3JjYWxsX29mZnNldAorI2VuZGlmCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jb21wYXJlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JlcHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbnVtYmVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX3NlcXVlbmNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX21hcHBpbmcKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaGFzaAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jYWxsCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3N0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19idWZmZXIKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgLy8gdHBfZmxhZ3MKKyAgICAiQSBFbnVtIERlc2NyaXB0b3IiLCAgICAgICAgICAgICAgICAgLy8gdHBfZG9jCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3RyYXZlcnNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NsZWFyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JpY2hjb21wYXJlCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3dlYWtsaXN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcm5leHQKKyAgICBlbnVtX2Rlc2NyaXB0b3I6Ok1ldGhvZHMsICAgICAgICAgICAgLy8gdHBfbWV0aG9kcworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCisgICAgZW51bV9kZXNjcmlwdG9yOjpHZXR0ZXJzLCAgICAgICAgICAgIC8vIHRwX2dldHNldAorICAgICZkZXNjcmlwdG9yOjpQeUJhc2VEZXNjcmlwdG9yX1R5cGUsICAvLyB0cF9iYXNlCit9OworCitQeU9iamVjdCogUHlFbnVtRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcigKKyAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yOjpOZXdJbnRlcm5lZERlc2NyaXB0b3IoJlB5RW51bURlc2NyaXB0b3JfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtX2Rlc2NyaXB0b3IsIG51bGxwdHIpOworfQorCitjb25zdCBFbnVtRGVzY3JpcHRvciogUHlFbnVtRGVzY3JpcHRvcl9Bc0Rlc2NyaXB0b3IoUHlPYmplY3QqIG9iaikgeworICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhvYmosICZQeUVudW1EZXNjcmlwdG9yX1R5cGUpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk5vdCBhbiBFbnVtRGVzY3JpcHRvciIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEVudW1EZXNjcmlwdG9yKj4oCisgICAgICByZWludGVycHJldF9jYXN0PFB5QmFzZURlc2NyaXB0b3IqPihvYmopLT5kZXNjcmlwdG9yKTsKK30KKworbmFtZXNwYWNlIGVudW12YWx1ZV9kZXNjcmlwdG9yIHsKKworLy8gVW5jaGVja2VkIGFjY2Vzc29yIHRvIHRoZSBDKysgcG9pbnRlci4KK3N0YXRpYyBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBfR2V0RGVzY3JpcHRvcigKKyAgICBQeUJhc2VEZXNjcmlwdG9yICpzZWxmKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqPihzZWxmLT5kZXNjcmlwdG9yKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXROYW1lKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5U3RyaW5nX0Zyb21DcHBTdHJpbmcoX0dldERlc2NyaXB0b3Ioc2VsZiktPm5hbWUoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0TnVtYmVyKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+bnVtYmVyKCkpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEluZGV4KFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+aW5kZXgoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0VHlwZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBQeUVudW1EZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKF9HZXREZXNjcmlwdG9yKHNlbGYpLT50eXBlKCkpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEhhc09wdGlvbnMoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBvcHRpb25zKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5vcHRpb25zKCkpOworICBpZiAoJm9wdGlvbnMgIT0gJkVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSkgeworICAgIFB5X1JFVFVSTl9UUlVFOworICB9IGVsc2UgeworICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgfQorfQorc3RhdGljIGludCBTZXRIYXNPcHRpb25zKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBDaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCJoYXNfb3B0aW9ucyIpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldE9wdGlvbnMoUHlCYXNlRGVzY3JpcHRvciAqc2VsZikgeworICByZXR1cm4gR2V0T3JCdWlsZE9wdGlvbnMoX0dldERlc2NyaXB0b3Ioc2VsZikpOworfQorCitzdGF0aWMgaW50IFNldE9wdGlvbnMoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIENoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoIl9vcHRpb25zIik7Cit9CisKK3N0YXRpYyBpbnQgU2V0U2VyaWFsaXplZE9wdGlvbnMoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBDaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCJfc2VyaWFsaXplZF9vcHRpb25zIik7Cit9CisKK3N0YXRpYyBQeUdldFNldERlZiBHZXR0ZXJzW10gPSB7CisgICAgeyJuYW1lIiwgKGdldHRlcilHZXROYW1lLCBudWxscHRyLCAibmFtZSJ9LAorICAgIHsibnVtYmVyIiwgKGdldHRlcilHZXROdW1iZXIsIG51bGxwdHIsICJudW1iZXIifSwKKyAgICB7ImluZGV4IiwgKGdldHRlcilHZXRJbmRleCwgbnVsbHB0ciwgImluZGV4In0sCisgICAgeyJ0eXBlIiwgKGdldHRlcilHZXRUeXBlLCBudWxscHRyLCAiaW5kZXgifSwKKworICAgIHsiaGFzX29wdGlvbnMiLCAoZ2V0dGVyKUdldEhhc09wdGlvbnMsIChzZXR0ZXIpU2V0SGFzT3B0aW9ucywKKyAgICAgIkhhcyBPcHRpb25zIn0sCisgICAgeyJfb3B0aW9ucyIsIChnZXR0ZXIpIG51bGxwdHIsIChzZXR0ZXIpU2V0T3B0aW9ucywgIk9wdGlvbnMifSwKKyAgICB7Il9zZXJpYWxpemVkX29wdGlvbnMiLCAoZ2V0dGVyKSBudWxscHRyLCAoc2V0dGVyKVNldFNlcmlhbGl6ZWRPcHRpb25zLAorICAgICAiU2VyaWFsaXplZCBPcHRpb25zIn0sCisgICAge251bGxwdHJ9LAorfTsKKworc3RhdGljIFB5TWV0aG9kRGVmIE1ldGhvZHNbXSA9IHsKKyAgICB7IkdldE9wdGlvbnMiLCAoUHlDRnVuY3Rpb24pR2V0T3B0aW9ucywgTUVUSF9OT0FSR1N9LAorICAgIHtudWxscHRyfSwKK307CisKK30gIC8vIG5hbWVzcGFjZSBlbnVtdmFsdWVfZGVzY3JpcHRvcgorCitQeVR5cGVPYmplY3QgUHlFbnVtVmFsdWVEZXNjcmlwdG9yX1R5cGUgPSB7CisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkgRlVMTF9NT0RVTEVfTkFNRQorICAgICIuRW51bVZhbHVlRGVzY3JpcHRvciIsICAgIC8vIHRwX25hbWUKKyAgICBzaXplb2YoUHlCYXNlRGVzY3JpcHRvciksICAvLyB0cF9iYXNpY3NpemUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVtc2l6ZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2RlYWxsb2MKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwODAwMDAKKyAgICBudWxscHRyLCAgLy8gdHBfcHJpbnQKKyNlbHNlCisgICAgMCwgIC8vIHRwX3ZlY3RvcmNhbGxfb2Zmc2V0CisjZW5kaWYKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NvbXBhcmUKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmVwcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19udW1iZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfc2VxdWVuY2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbWFwcGluZworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9oYXNoCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NhbGwKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc3RyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX2J1ZmZlcgorICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAvLyB0cF9mbGFncworICAgICJBIEVudW1WYWx1ZSBEZXNjcmlwdG9yIiwgICAgICAgICAgICAvLyB0cF9kb2MKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfdHJhdmVyc2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2xlYXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmljaGNvbXBhcmUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfd2Vha2xpc3RvZmZzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVybmV4dAorICAgIGVudW12YWx1ZV9kZXNjcmlwdG9yOjpNZXRob2RzLCAgICAgICAvLyB0cF9tZXRob2RzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21lbWJlcnMKKyAgICBlbnVtdmFsdWVfZGVzY3JpcHRvcjo6R2V0dGVycywgICAgICAgLy8gdHBfZ2V0c2V0CisgICAgJmRlc2NyaXB0b3I6OlB5QmFzZURlc2NyaXB0b3JfVHlwZSwgIC8vIHRwX2Jhc2UKK307CisKK1B5T2JqZWN0KiBQeUVudW1WYWx1ZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoCisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bXZhbHVlX2Rlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld0ludGVybmVkRGVzY3JpcHRvcigmUHlFbnVtVmFsdWVEZXNjcmlwdG9yX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bXZhbHVlX2Rlc2NyaXB0b3IsIG51bGxwdHIpOworfQorCituYW1lc3BhY2UgZmlsZV9kZXNjcmlwdG9yIHsKKworLy8gVW5jaGVja2VkIGFjY2Vzc29yIHRvIHRoZSBDKysgcG9pbnRlci4KK3N0YXRpYyBjb25zdCBGaWxlRGVzY3JpcHRvciogX0dldERlc2NyaXB0b3IoUHlGaWxlRGVzY3JpcHRvciAqc2VsZikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBGaWxlRGVzY3JpcHRvcio+KHNlbGYtPmJhc2UuZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyB2b2lkIERlYWxsb2MoUHlGaWxlRGVzY3JpcHRvciogc2VsZikgeworICBQeV9YREVDUkVGKHNlbGYtPnNlcmlhbGl6ZWRfcGIpOworICBkZXNjcmlwdG9yOjpEZWFsbG9jKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0UG9vbChQeUZpbGVEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIFB5T2JqZWN0KiBwb29sID0gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KAorICAgICAgR2V0RGVzY3JpcHRvclBvb2xfRnJvbVBvb2woX0dldERlc2NyaXB0b3Ioc2VsZiktPnBvb2woKSkpOworICBQeV9YSU5DUkVGKHBvb2wpOworICByZXR1cm4gcG9vbDsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXROYW1lKFB5RmlsZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5U3RyaW5nX0Zyb21DcHBTdHJpbmcoX0dldERlc2NyaXB0b3Ioc2VsZiktPm5hbWUoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0UGFja2FnZShQeUZpbGVEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBQeVN0cmluZ19Gcm9tQ3BwU3RyaW5nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5wYWNrYWdlKCkpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldFNlcmlhbGl6ZWRQYihQeUZpbGVEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIFB5T2JqZWN0ICpzZXJpYWxpemVkX3BiID0gc2VsZi0+c2VyaWFsaXplZF9wYjsKKyAgaWYgKHNlcmlhbGl6ZWRfcGIgIT0gbnVsbHB0cikgeworICAgIFB5X0lOQ1JFRihzZXJpYWxpemVkX3BiKTsKKyAgICByZXR1cm4gc2VyaWFsaXplZF9wYjsKKyAgfQorICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIF9HZXREZXNjcmlwdG9yKHNlbGYpLT5Db3B5VG8oJmZpbGVfcHJvdG8pOworICBzdGQ6OnN0cmluZyBjb250ZW50czsKKyAgZmlsZV9wcm90by5TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoJmNvbnRlbnRzKTsKKyAgc2VsZi0+c2VyaWFsaXplZF9wYiA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICBjb250ZW50cy5jX3N0cigpLCBjb250ZW50cy5zaXplKCkpOworICBpZiAoc2VsZi0+c2VyaWFsaXplZF9wYiA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgUHlfSU5DUkVGKHNlbGYtPnNlcmlhbGl6ZWRfcGIpOworICByZXR1cm4gc2VsZi0+c2VyaWFsaXplZF9wYjsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRNZXNzYWdlVHlwZXNCeU5hbWUoUHlGaWxlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gTmV3RmlsZU1lc3NhZ2VUeXBlc0J5TmFtZShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RW51bVR5cGVzQnlOYW1lKFB5RmlsZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIE5ld0ZpbGVFbnVtVHlwZXNCeU5hbWUoX0dldERlc2NyaXB0b3Ioc2VsZikpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEV4dGVuc2lvbnNCeU5hbWUoUHlGaWxlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gTmV3RmlsZUV4dGVuc2lvbnNCeU5hbWUoX0dldERlc2NyaXB0b3Ioc2VsZikpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldFNlcnZpY2VzQnlOYW1lKFB5RmlsZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIE5ld0ZpbGVTZXJ2aWNlc0J5TmFtZShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RGVwZW5kZW5jaWVzKFB5RmlsZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIE5ld0ZpbGVEZXBlbmRlbmNpZXMoX0dldERlc2NyaXB0b3Ioc2VsZikpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldFB1YmxpY0RlcGVuZGVuY2llcyhQeUZpbGVEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBOZXdGaWxlUHVibGljRGVwZW5kZW5jaWVzKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRIYXNPcHRpb25zKFB5RmlsZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgY29uc3QgRmlsZU9wdGlvbnMmIG9wdGlvbnMoX0dldERlc2NyaXB0b3Ioc2VsZiktPm9wdGlvbnMoKSk7CisgIGlmICgmb3B0aW9ucyAhPSAmRmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSkgeworICAgIFB5X1JFVFVSTl9UUlVFOworICB9IGVsc2UgeworICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgfQorfQorc3RhdGljIGludCBTZXRIYXNPcHRpb25zKFB5RmlsZURlc2NyaXB0b3IgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBDaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCJoYXNfb3B0aW9ucyIpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldERlYnVnU3RyaW5nKFB5RmlsZURlc2NyaXB0b3IqIHNlbGYpIHsKKyAgcmV0dXJuIFB5U3RyaW5nX0Zyb21DcHBTdHJpbmcoX0dldERlc2NyaXB0b3Ioc2VsZiktPkRlYnVnU3RyaW5nKCkpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldE9wdGlvbnMoUHlGaWxlRGVzY3JpcHRvciAqc2VsZikgeworICByZXR1cm4gR2V0T3JCdWlsZE9wdGlvbnMoX0dldERlc2NyaXB0b3Ioc2VsZikpOworfQorCitzdGF0aWMgaW50IFNldE9wdGlvbnMoUHlGaWxlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIENoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoIl9vcHRpb25zIik7Cit9CisKK3N0YXRpYyBpbnQgU2V0U2VyaWFsaXplZE9wdGlvbnMoUHlGaWxlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBDaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCJfc2VyaWFsaXplZF9vcHRpb25zIik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0U3ludGF4KFB5RmlsZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nKAorICAgICAgRmlsZURlc2NyaXB0b3I6OlN5bnRheE5hbWUoX0dldERlc2NyaXB0b3Ioc2VsZiktPnN5bnRheCgpKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ29weVRvUHJvdG8oUHlGaWxlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnRhcmdldCkgeworICByZXR1cm4gQ29weVRvUHl0aG9uUHJvdG88RmlsZURlc2NyaXB0b3JQcm90bz4oX0dldERlc2NyaXB0b3Ioc2VsZiksIHRhcmdldCk7Cit9CisKK3N0YXRpYyBQeUdldFNldERlZiBHZXR0ZXJzW10gPSB7CisgICAgeyJwb29sIiwgKGdldHRlcilHZXRQb29sLCBudWxscHRyLCAicG9vbCJ9LAorICAgIHsibmFtZSIsIChnZXR0ZXIpR2V0TmFtZSwgbnVsbHB0ciwgIm5hbWUifSwKKyAgICB7InBhY2thZ2UiLCAoZ2V0dGVyKUdldFBhY2thZ2UsIG51bGxwdHIsICJwYWNrYWdlIn0sCisgICAgeyJzZXJpYWxpemVkX3BiIiwgKGdldHRlcilHZXRTZXJpYWxpemVkUGJ9LAorICAgIHsibWVzc2FnZV90eXBlc19ieV9uYW1lIiwgKGdldHRlcilHZXRNZXNzYWdlVHlwZXNCeU5hbWUsIG51bGxwdHIsCisgICAgICJNZXNzYWdlcyBieSBuYW1lIn0sCisgICAgeyJlbnVtX3R5cGVzX2J5X25hbWUiLCAoZ2V0dGVyKUdldEVudW1UeXBlc0J5TmFtZSwgbnVsbHB0ciwKKyAgICAgIkVudW1zIGJ5IG5hbWUifSwKKyAgICB7ImV4dGVuc2lvbnNfYnlfbmFtZSIsIChnZXR0ZXIpR2V0RXh0ZW5zaW9uc0J5TmFtZSwgbnVsbHB0ciwKKyAgICAgIkV4dGVuc2lvbnMgYnkgbmFtZSJ9LAorICAgIHsic2VydmljZXNfYnlfbmFtZSIsIChnZXR0ZXIpR2V0U2VydmljZXNCeU5hbWUsIG51bGxwdHIsCisgICAgICJTZXJ2aWNlcyBieSBuYW1lIn0sCisgICAgeyJkZXBlbmRlbmNpZXMiLCAoZ2V0dGVyKUdldERlcGVuZGVuY2llcywgbnVsbHB0ciwgIkRlcGVuZGVuY2llcyJ9LAorICAgIHsicHVibGljX2RlcGVuZGVuY2llcyIsIChnZXR0ZXIpR2V0UHVibGljRGVwZW5kZW5jaWVzLCBudWxscHRyLAorICAgICAiRGVwZW5kZW5jaWVzIn0sCisKKyAgICB7Imhhc19vcHRpb25zIiwgKGdldHRlcilHZXRIYXNPcHRpb25zLCAoc2V0dGVyKVNldEhhc09wdGlvbnMsCisgICAgICJIYXMgT3B0aW9ucyJ9LAorICAgIHsiX29wdGlvbnMiLCAoZ2V0dGVyKSBudWxscHRyLCAoc2V0dGVyKVNldE9wdGlvbnMsICJPcHRpb25zIn0sCisgICAgeyJfc2VyaWFsaXplZF9vcHRpb25zIiwgKGdldHRlcikgbnVsbHB0ciwgKHNldHRlcilTZXRTZXJpYWxpemVkT3B0aW9ucywKKyAgICAgIlNlcmlhbGl6ZWQgT3B0aW9ucyJ9LAorICAgIHsic3ludGF4IiwgKGdldHRlcilHZXRTeW50YXgsIChzZXR0ZXIpIG51bGxwdHIsICJTeW50YXgifSwKKyAgICB7bnVsbHB0cn0sCit9OworCitzdGF0aWMgUHlNZXRob2REZWYgTWV0aG9kc1tdID0geworICAgIHsiR2V0RGVidWdTdHJpbmciLCAoUHlDRnVuY3Rpb24pR2V0RGVidWdTdHJpbmcsIE1FVEhfTk9BUkdTfSwKKyAgICB7IkdldE9wdGlvbnMiLCAoUHlDRnVuY3Rpb24pR2V0T3B0aW9ucywgTUVUSF9OT0FSR1N9LAorICAgIHsiQ29weVRvUHJvdG8iLCAoUHlDRnVuY3Rpb24pQ29weVRvUHJvdG8sIE1FVEhfT30sCisgICAge251bGxwdHJ9LAorfTsKKworfSAgLy8gbmFtZXNwYWNlIGZpbGVfZGVzY3JpcHRvcgorCitQeVR5cGVPYmplY3QgUHlGaWxlRGVzY3JpcHRvcl9UeXBlID0geworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApIEZVTExfTU9EVUxFX05BTUUKKyAgICAiLkZpbGVEZXNjcmlwdG9yIiwgICAgICAgICAgICAgICAgICAgICAvLyB0cF9uYW1lCisgICAgc2l6ZW9mKFB5RmlsZURlc2NyaXB0b3IpLCAgICAgICAgICAgICAgLy8gdHBfYmFzaWNzaXplCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKKyAgICAoZGVzdHJ1Y3RvcilmaWxlX2Rlc2NyaXB0b3I6OkRlYWxsb2MsICAvLyB0cF9kZWFsbG9jCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDgwMDAwCisgICAgbnVsbHB0ciwgIC8vIHRwX3ByaW50CisjZWxzZQorICAgIDAsICAvLyB0cF92ZWN0b3JjYWxsX29mZnNldAorI2VuZGlmCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jb21wYXJlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JlcHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbnVtYmVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX3NlcXVlbmNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX21hcHBpbmcKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaGFzaAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jYWxsCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3N0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19idWZmZXIKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgLy8gdHBfZmxhZ3MKKyAgICAiQSBGaWxlIERlc2NyaXB0b3IiLCAgICAgICAgICAgICAgICAgLy8gdHBfZG9jCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3RyYXZlcnNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NsZWFyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JpY2hjb21wYXJlCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3dlYWtsaXN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcm5leHQKKyAgICBmaWxlX2Rlc2NyaXB0b3I6Ok1ldGhvZHMsICAgICAgICAgICAgLy8gdHBfbWV0aG9kcworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCisgICAgZmlsZV9kZXNjcmlwdG9yOjpHZXR0ZXJzLCAgICAgICAgICAgIC8vIHRwX2dldHNldAorICAgICZkZXNjcmlwdG9yOjpQeUJhc2VEZXNjcmlwdG9yX1R5cGUsICAvLyB0cF9iYXNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RpY3QKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVzY3JfZ2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Rlc2NyX3NldAorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2luaXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYWxsb2MKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbmV3CisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2ZyZWUKK307CisKK1B5T2JqZWN0KiBQeUZpbGVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlX2Rlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIFB5RmlsZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3JXaXRoU2VyaWFsaXplZFBiKGZpbGVfZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworfQorCitQeU9iamVjdCogUHlGaWxlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcldpdGhTZXJpYWxpemVkUGIoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfZGVzY3JpcHRvciwgUHlPYmplY3QgKnNlcmlhbGl6ZWRfcGIpIHsKKyAgYm9vbCB3YXNfY3JlYXRlZDsKKyAgUHlPYmplY3QqIHB5X2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOjpOZXdJbnRlcm5lZERlc2NyaXB0b3IoCisgICAgICAmUHlGaWxlRGVzY3JpcHRvcl9UeXBlLCBmaWxlX2Rlc2NyaXB0b3IsICZ3YXNfY3JlYXRlZCk7CisgIGlmIChweV9kZXNjcmlwdG9yID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAod2FzX2NyZWF0ZWQpIHsKKyAgICBQeUZpbGVEZXNjcmlwdG9yKiBjZmlsZV9kZXNjcmlwdG9yID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeUZpbGVEZXNjcmlwdG9yKj4ocHlfZGVzY3JpcHRvcik7CisgICAgUHlfWElOQ1JFRihzZXJpYWxpemVkX3BiKTsKKyAgICBjZmlsZV9kZXNjcmlwdG9yLT5zZXJpYWxpemVkX3BiID0gc2VyaWFsaXplZF9wYjsKKyAgfQorICAvLyBUT0RPKGFtYXVyeWZhKTogSW4gdGhlIGNhc2Ugb2YgYSBjYWNoZWQgb2JqZWN0LCBjaGVjayB0aGF0IHNlcmlhbGl6ZWRfcGIKKyAgLy8gaXMgdGhlIHNhbWUgYXMgYmVmb3JlLgorCisgIHJldHVybiBweV9kZXNjcmlwdG9yOworfQorCitjb25zdCBGaWxlRGVzY3JpcHRvciogUHlGaWxlRGVzY3JpcHRvcl9Bc0Rlc2NyaXB0b3IoUHlPYmplY3QqIG9iaikgeworICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhvYmosICZQeUZpbGVEZXNjcmlwdG9yX1R5cGUpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk5vdCBhIEZpbGVEZXNjcmlwdG9yIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRmlsZURlc2NyaXB0b3IqPigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlCYXNlRGVzY3JpcHRvcio+KG9iaiktPmRlc2NyaXB0b3IpOworfQorCituYW1lc3BhY2Ugb25lb2ZfZGVzY3JpcHRvciB7CisKKy8vIFVuY2hlY2tlZCBhY2Nlc3NvciB0byB0aGUgQysrIHBvaW50ZXIuCitzdGF0aWMgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBfR2V0RGVzY3JpcHRvcigKKyAgICBQeUJhc2VEZXNjcmlwdG9yICpzZWxmKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IE9uZW9mRGVzY3JpcHRvcio+KHNlbGYtPmRlc2NyaXB0b3IpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldE5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gUHlTdHJpbmdfRnJvbUNwcFN0cmluZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+bmFtZSgpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRGdWxsTmFtZShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBQeVN0cmluZ19Gcm9tQ3BwU3RyaW5nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5mdWxsX25hbWUoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0SW5kZXgoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5pbmRleCgpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRGaWVsZHMoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gTmV3T25lb2ZGaWVsZHNTZXEoX0dldERlc2NyaXB0b3Ioc2VsZikpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldENvbnRhaW5pbmdUeXBlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlID0KKyAgICAgIF9HZXREZXNjcmlwdG9yKHNlbGYpLT5jb250YWluaW5nX3R5cGUoKTsKKyAgaWYgKGNvbnRhaW5pbmdfdHlwZSkgeworICAgIHJldHVybiBQeU1lc3NhZ2VEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGNvbnRhaW5pbmdfdHlwZSk7CisgIH0gZWxzZSB7CisgICAgUHlfUkVUVVJOX05PTkU7CisgIH0KK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRIYXNPcHRpb25zKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgY29uc3QgT25lb2ZPcHRpb25zJiBvcHRpb25zKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5vcHRpb25zKCkpOworICBpZiAoJm9wdGlvbnMgIT0gJk9uZW9mT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgUHlfUkVUVVJOX1RSVUU7CisgIH0gZWxzZSB7CisgICAgUHlfUkVUVVJOX0ZBTFNFOworICB9Cit9CisKK3N0YXRpYyBpbnQgU2V0SGFzT3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgiaGFzX29wdGlvbnMiKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRPcHRpb25zKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYpIHsKKyAgcmV0dXJuIEdldE9yQnVpbGRPcHRpb25zKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKK30KKworc3RhdGljIGludCBTZXRPcHRpb25zKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBDaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCJfb3B0aW9ucyIpOworfQorCitzdGF0aWMgaW50IFNldFNlcmlhbGl6ZWRPcHRpb25zKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgiX3NlcmlhbGl6ZWRfb3B0aW9ucyIpOworfQorCitzdGF0aWMgUHlHZXRTZXREZWYgR2V0dGVyc1tdID0geworICAgIHsibmFtZSIsIChnZXR0ZXIpR2V0TmFtZSwgbnVsbHB0ciwgIk5hbWUifSwKKyAgICB7ImZ1bGxfbmFtZSIsIChnZXR0ZXIpR2V0RnVsbE5hbWUsIG51bGxwdHIsICJGdWxsIG5hbWUifSwKKyAgICB7ImluZGV4IiwgKGdldHRlcilHZXRJbmRleCwgbnVsbHB0ciwgIkluZGV4In0sCisKKyAgICB7ImNvbnRhaW5pbmdfdHlwZSIsIChnZXR0ZXIpR2V0Q29udGFpbmluZ1R5cGUsIG51bGxwdHIsICJDb250YWluaW5nIHR5cGUifSwKKyAgICB7Imhhc19vcHRpb25zIiwgKGdldHRlcilHZXRIYXNPcHRpb25zLCAoc2V0dGVyKVNldEhhc09wdGlvbnMsCisgICAgICJIYXMgT3B0aW9ucyJ9LAorICAgIHsiX29wdGlvbnMiLCAoZ2V0dGVyKSBudWxscHRyLCAoc2V0dGVyKVNldE9wdGlvbnMsICJPcHRpb25zIn0sCisgICAgeyJfc2VyaWFsaXplZF9vcHRpb25zIiwgKGdldHRlcikgbnVsbHB0ciwgKHNldHRlcilTZXRTZXJpYWxpemVkT3B0aW9ucywKKyAgICAgIlNlcmlhbGl6ZWQgT3B0aW9ucyJ9LAorICAgIHsiZmllbGRzIiwgKGdldHRlcilHZXRGaWVsZHMsIG51bGxwdHIsICJGaWVsZHMifSwKKyAgICB7bnVsbHB0cn0sCit9OworCitzdGF0aWMgUHlNZXRob2REZWYgTWV0aG9kc1tdID0geworICAgIHsiR2V0T3B0aW9ucyIsIChQeUNGdW5jdGlvbilHZXRPcHRpb25zLCBNRVRIX05PQVJHU30sCisgICAge251bGxwdHJ9LAorfTsKKworfSAgLy8gbmFtZXNwYWNlIG9uZW9mX2Rlc2NyaXB0b3IKKworUHlUeXBlT2JqZWN0IFB5T25lb2ZEZXNjcmlwdG9yX1R5cGUgPSB7CisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkgRlVMTF9NT0RVTEVfTkFNRQorICAgICIuT25lb2ZEZXNjcmlwdG9yIiwgICAgICAgIC8vIHRwX25hbWUKKyAgICBzaXplb2YoUHlCYXNlRGVzY3JpcHRvciksICAvLyB0cF9iYXNpY3NpemUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVtc2l6ZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2RlYWxsb2MKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwODAwMDAKKyAgICBudWxscHRyLCAgLy8gdHBfcHJpbnQKKyNlbHNlCisgICAgMCwgIC8vIHRwX3ZlY3RvcmNhbGxfb2Zmc2V0CisjZW5kaWYKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NvbXBhcmUKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmVwcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19udW1iZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfc2VxdWVuY2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbWFwcGluZworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9oYXNoCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NhbGwKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc3RyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX2J1ZmZlcgorICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAvLyB0cF9mbGFncworICAgICJBIE9uZW9mIERlc2NyaXB0b3IiLCAgICAgICAgICAgICAgICAvLyB0cF9kb2MKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfdHJhdmVyc2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2xlYXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmljaGNvbXBhcmUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfd2Vha2xpc3RvZmZzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVybmV4dAorICAgIG9uZW9mX2Rlc2NyaXB0b3I6Ok1ldGhvZHMsICAgICAgICAgICAvLyB0cF9tZXRob2RzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21lbWJlcnMKKyAgICBvbmVvZl9kZXNjcmlwdG9yOjpHZXR0ZXJzLCAgICAgICAgICAgLy8gdHBfZ2V0c2V0CisgICAgJmRlc2NyaXB0b3I6OlB5QmFzZURlc2NyaXB0b3JfVHlwZSwgIC8vIHRwX2Jhc2UKK307CisKK1B5T2JqZWN0KiBQeU9uZW9mRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcigKKyAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld0ludGVybmVkRGVzY3JpcHRvcigmUHlPbmVvZkRlc2NyaXB0b3JfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVvZl9kZXNjcmlwdG9yLCBudWxscHRyKTsKK30KKworbmFtZXNwYWNlIHNlcnZpY2VfZGVzY3JpcHRvciB7CisKKy8vIFVuY2hlY2tlZCBhY2Nlc3NvciB0byB0aGUgQysrIHBvaW50ZXIuCitzdGF0aWMgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIF9HZXREZXNjcmlwdG9yKAorICAgIFB5QmFzZURlc2NyaXB0b3IgKnNlbGYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2VydmljZURlc2NyaXB0b3IqPihzZWxmLT5kZXNjcmlwdG9yKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXROYW1lKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5U3RyaW5nX0Zyb21DcHBTdHJpbmcoX0dldERlc2NyaXB0b3Ioc2VsZiktPm5hbWUoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RnVsbE5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gUHlTdHJpbmdfRnJvbUNwcFN0cmluZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+ZnVsbF9uYW1lKCkpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEZpbGUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gUHlGaWxlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihfR2V0RGVzY3JpcHRvcihzZWxmKS0+ZmlsZSgpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRJbmRleChQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoX0dldERlc2NyaXB0b3Ioc2VsZiktPmluZGV4KCkpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldE1ldGhvZHMoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gTmV3U2VydmljZU1ldGhvZHNTZXEoX0dldERlc2NyaXB0b3Ioc2VsZikpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldE1ldGhvZHNCeU5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gTmV3U2VydmljZU1ldGhvZHNCeU5hbWUoX0dldERlc2NyaXB0b3Ioc2VsZikpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEZpbmRNZXRob2RCeU5hbWUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QqIGFyZykgeworICBQeV9zc2l6ZV90IG5hbWVfc2l6ZTsKKyAgY2hhciogbmFtZTsKKyAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmcsICZuYW1lLCAmbmFtZV9zaXplKSA8IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZF9kZXNjcmlwdG9yID0KKyAgICAgIF9HZXREZXNjcmlwdG9yKHNlbGYpLT5GaW5kTWV0aG9kQnlOYW1lKFN0cmluZ1BhcmFtKG5hbWUsIG5hbWVfc2l6ZSkpOworICBpZiAobWV0aG9kX2Rlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwgIkNvdWxkbid0IGZpbmQgbWV0aG9kICUuMjAwcyIsIG5hbWUpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgcmV0dXJuIFB5TWV0aG9kRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihtZXRob2RfZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0T3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmKSB7CisgIHJldHVybiBHZXRPckJ1aWxkT3B0aW9ucyhfR2V0RGVzY3JpcHRvcihzZWxmKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ29weVRvUHJvdG8oUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnRhcmdldCkgeworICByZXR1cm4gQ29weVRvUHl0aG9uUHJvdG88U2VydmljZURlc2NyaXB0b3JQcm90bz4oX0dldERlc2NyaXB0b3Ioc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOworfQorCitzdGF0aWMgUHlHZXRTZXREZWYgR2V0dGVyc1tdID0geworICAgIHsibmFtZSIsIChnZXR0ZXIpR2V0TmFtZSwgbnVsbHB0ciwgIk5hbWUiLCBudWxscHRyfSwKKyAgICB7ImZ1bGxfbmFtZSIsIChnZXR0ZXIpR2V0RnVsbE5hbWUsIG51bGxwdHIsICJGdWxsIG5hbWUiLCBudWxscHRyfSwKKyAgICB7ImZpbGUiLCAoZ2V0dGVyKUdldEZpbGUsIG51bGxwdHIsICJGaWxlIGRlc2NyaXB0b3IifSwKKyAgICB7ImluZGV4IiwgKGdldHRlcilHZXRJbmRleCwgbnVsbHB0ciwgIkluZGV4IiwgbnVsbHB0cn0sCisgICAgeyJtZXRob2RzIiwgKGdldHRlcilHZXRNZXRob2RzLCBudWxscHRyLCAiTWV0aG9kcyIsIG51bGxwdHJ9LAorICAgIHsibWV0aG9kc19ieV9uYW1lIiwgKGdldHRlcilHZXRNZXRob2RzQnlOYW1lLCBudWxscHRyLCAiTWV0aG9kcyBieSBuYW1lIiwKKyAgICAgbnVsbHB0cn0sCisgICAge251bGxwdHJ9LAorfTsKKworc3RhdGljIFB5TWV0aG9kRGVmIE1ldGhvZHNbXSA9IHsKKyAgICB7IkdldE9wdGlvbnMiLCAoUHlDRnVuY3Rpb24pR2V0T3B0aW9ucywgTUVUSF9OT0FSR1N9LAorICAgIHsiQ29weVRvUHJvdG8iLCAoUHlDRnVuY3Rpb24pQ29weVRvUHJvdG8sIE1FVEhfT30sCisgICAgeyJGaW5kTWV0aG9kQnlOYW1lIiwgKFB5Q0Z1bmN0aW9uKUZpbmRNZXRob2RCeU5hbWUsIE1FVEhfT30sCisgICAge251bGxwdHJ9LAorfTsKKworfSAgLy8gbmFtZXNwYWNlIHNlcnZpY2VfZGVzY3JpcHRvcgorCitQeVR5cGVPYmplY3QgUHlTZXJ2aWNlRGVzY3JpcHRvcl9UeXBlID0geworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApIEZVTExfTU9EVUxFX05BTUUKKyAgICAiLlNlcnZpY2VEZXNjcmlwdG9yIiwgICAgICAvLyB0cF9uYW1lCisgICAgc2l6ZW9mKFB5QmFzZURlc2NyaXB0b3IpLCAgLy8gdHBfYmFzaWNzaXplCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9kZWFsbG9jCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDgwMDAwCisgICAgbnVsbHB0ciwgIC8vIHRwX3ByaW50CisjZWxzZQorICAgIDAsICAvLyB0cF92ZWN0b3JjYWxsX29mZnNldAorI2VuZGlmCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jb21wYXJlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JlcHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbnVtYmVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX3NlcXVlbmNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX21hcHBpbmcKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaGFzaAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jYWxsCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3N0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19idWZmZXIKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgLy8gdHBfZmxhZ3MKKyAgICAiQSBTZXJ2aWNlIERlc2NyaXB0b3IiLCAgICAgICAgICAgICAgLy8gdHBfZG9jCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3RyYXZlcnNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NsZWFyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JpY2hjb21wYXJlCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3dlYWtsaXN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcm5leHQKKyAgICBzZXJ2aWNlX2Rlc2NyaXB0b3I6Ok1ldGhvZHMsICAgICAgICAgLy8gdHBfbWV0aG9kcworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCisgICAgc2VydmljZV9kZXNjcmlwdG9yOjpHZXR0ZXJzLCAgICAgICAgIC8vIHRwX2dldHNldAorICAgICZkZXNjcmlwdG9yOjpQeUJhc2VEZXNjcmlwdG9yX1R5cGUsICAvLyB0cF9iYXNlCit9OworCitQeU9iamVjdCogUHlTZXJ2aWNlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcigKKyAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZV9kZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yOjpOZXdJbnRlcm5lZERlc2NyaXB0b3IoJlB5U2VydmljZURlc2NyaXB0b3JfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX2Rlc2NyaXB0b3IsIG51bGxwdHIpOworfQorCitjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogUHlTZXJ2aWNlRGVzY3JpcHRvcl9Bc0Rlc2NyaXB0b3IoUHlPYmplY3QqIG9iaikgeworICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhvYmosICZQeVNlcnZpY2VEZXNjcmlwdG9yX1R5cGUpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk5vdCBhIFNlcnZpY2VEZXNjcmlwdG9yIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2VydmljZURlc2NyaXB0b3IqPigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlCYXNlRGVzY3JpcHRvcio+KG9iaiktPmRlc2NyaXB0b3IpOworfQorCituYW1lc3BhY2UgbWV0aG9kX2Rlc2NyaXB0b3IgeworCisvLyBVbmNoZWNrZWQgYWNjZXNzb3IgdG8gdGhlIEMrKyBwb2ludGVyLgorc3RhdGljIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIF9HZXREZXNjcmlwdG9yKAorICAgIFB5QmFzZURlc2NyaXB0b3IgKnNlbGYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWV0aG9kRGVzY3JpcHRvcio+KHNlbGYtPmRlc2NyaXB0b3IpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldE5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gUHlTdHJpbmdfRnJvbUNwcFN0cmluZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+bmFtZSgpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRGdWxsTmFtZShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBQeVN0cmluZ19Gcm9tQ3BwU3RyaW5nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5mdWxsX25hbWUoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0SW5kZXgoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5pbmRleCgpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRDb250YWluaW5nU2VydmljZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBjb250YWluaW5nX3NlcnZpY2UgPQorICAgICAgX0dldERlc2NyaXB0b3Ioc2VsZiktPnNlcnZpY2UoKTsKKyAgcmV0dXJuIFB5U2VydmljZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoY29udGFpbmluZ19zZXJ2aWNlKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRJbnB1dFR5cGUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBjb25zdCBEZXNjcmlwdG9yKiBpbnB1dF90eXBlID0gX0dldERlc2NyaXB0b3Ioc2VsZiktPmlucHV0X3R5cGUoKTsKKyAgcmV0dXJuIFB5TWVzc2FnZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoaW5wdXRfdHlwZSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0T3V0cHV0VHlwZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIG91dHB1dF90eXBlID0gX0dldERlc2NyaXB0b3Ioc2VsZiktPm91dHB1dF90eXBlKCk7CisgIHJldHVybiBQeU1lc3NhZ2VEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKG91dHB1dF90eXBlKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRDbGllbnRTdHJlYW1pbmcoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCogY2xvc3VyZSkgeworICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5jbGllbnRfc3RyZWFtaW5nKCkgPyAxIDogMCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0U2VydmVyU3RyZWFtaW5nKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQqIGNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+c2VydmVyX3N0cmVhbWluZygpID8gMSA6IDApOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldE9wdGlvbnMoUHlCYXNlRGVzY3JpcHRvciAqc2VsZikgeworICByZXR1cm4gR2V0T3JCdWlsZE9wdGlvbnMoX0dldERlc2NyaXB0b3Ioc2VsZikpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENvcHlUb1Byb3RvKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIFB5T2JqZWN0ICp0YXJnZXQpIHsKKyAgcmV0dXJuIENvcHlUb1B5dGhvblByb3RvPE1ldGhvZERlc2NyaXB0b3JQcm90bz4oX0dldERlc2NyaXB0b3Ioc2VsZiksIHRhcmdldCk7Cit9CisKK3N0YXRpYyBQeUdldFNldERlZiBHZXR0ZXJzW10gPSB7CisgICAgeyJuYW1lIiwgKGdldHRlcilHZXROYW1lLCBudWxscHRyLCAiTmFtZSIsIG51bGxwdHJ9LAorICAgIHsiZnVsbF9uYW1lIiwgKGdldHRlcilHZXRGdWxsTmFtZSwgbnVsbHB0ciwgIkZ1bGwgbmFtZSIsIG51bGxwdHJ9LAorICAgIHsiaW5kZXgiLCAoZ2V0dGVyKUdldEluZGV4LCBudWxscHRyLCAiSW5kZXgiLCBudWxscHRyfSwKKyAgICB7ImNvbnRhaW5pbmdfc2VydmljZSIsIChnZXR0ZXIpR2V0Q29udGFpbmluZ1NlcnZpY2UsIG51bGxwdHIsCisgICAgICJDb250YWluaW5nIHNlcnZpY2UiLCBudWxscHRyfSwKKyAgICB7ImlucHV0X3R5cGUiLCAoZ2V0dGVyKUdldElucHV0VHlwZSwgbnVsbHB0ciwgIklucHV0IHR5cGUiLCBudWxscHRyfSwKKyAgICB7Im91dHB1dF90eXBlIiwgKGdldHRlcilHZXRPdXRwdXRUeXBlLCBudWxscHRyLCAiT3V0cHV0IHR5cGUiLCBudWxscHRyfSwKKyAgICB7ImNsaWVudF9zdHJlYW1pbmciLCAoZ2V0dGVyKUdldENsaWVudFN0cmVhbWluZywgbnVsbHB0ciwKKyAgICAgIkNsaWVudCBzdHJlYW1pbmciLCBudWxscHRyfSwKKyAgICB7InNlcnZlcl9zdHJlYW1pbmciLCAoZ2V0dGVyKUdldFNlcnZlclN0cmVhbWluZywgbnVsbHB0ciwKKyAgICAgIlNlcnZlciBzdHJlYW1pbmciLCBudWxscHRyfSwKKyAgICB7bnVsbHB0cn0sCit9OworCitzdGF0aWMgUHlNZXRob2REZWYgTWV0aG9kc1tdID0geworICAgIHsiR2V0T3B0aW9ucyIsIChQeUNGdW5jdGlvbilHZXRPcHRpb25zLCBNRVRIX05PQVJHU30sCisgICAgeyJDb3B5VG9Qcm90byIsIChQeUNGdW5jdGlvbilDb3B5VG9Qcm90bywgTUVUSF9PfSwKKyAgICB7bnVsbHB0cn0sCit9OworCit9ICAvLyBuYW1lc3BhY2UgbWV0aG9kX2Rlc2NyaXB0b3IKKworUHlUeXBlT2JqZWN0IFB5TWV0aG9kRGVzY3JpcHRvcl9UeXBlID0geworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApIEZVTExfTU9EVUxFX05BTUUKKyAgICAiLk1ldGhvZERlc2NyaXB0b3IiLCAgICAgICAvLyB0cF9uYW1lCisgICAgc2l6ZW9mKFB5QmFzZURlc2NyaXB0b3IpLCAgLy8gdHBfYmFzaWNzaXplCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9kZWFsbG9jCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDgwMDAwCisgICAgbnVsbHB0ciwgIC8vIHRwX3ByaW50CisjZWxzZQorICAgIDAsICAvLyB0cF92ZWN0b3JjYWxsX29mZnNldAorI2VuZGlmCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jb21wYXJlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JlcHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbnVtYmVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX3NlcXVlbmNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX21hcHBpbmcKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaGFzaAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jYWxsCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3N0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19idWZmZXIKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgLy8gdHBfZmxhZ3MKKyAgICAiQSBNZXRob2QgRGVzY3JpcHRvciIsICAgICAgICAgICAgICAgLy8gdHBfZG9jCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3RyYXZlcnNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NsZWFyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JpY2hjb21wYXJlCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3dlYWtsaXN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcm5leHQKKyAgICBtZXRob2RfZGVzY3JpcHRvcjo6TWV0aG9kcywgICAgICAgICAgLy8gdHBfbWV0aG9kcworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCisgICAgbWV0aG9kX2Rlc2NyaXB0b3I6OkdldHRlcnMsICAgICAgICAgIC8vIHRwX2dldHNldAorICAgICZkZXNjcmlwdG9yOjpQeUJhc2VEZXNjcmlwdG9yX1R5cGUsICAvLyB0cF9iYXNlCit9OworCitQeU9iamVjdCogUHlNZXRob2REZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKAorICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZF9kZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yOjpOZXdJbnRlcm5lZERlc2NyaXB0b3IoJlB5TWV0aG9kRGVzY3JpcHRvcl9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9kZXNjcmlwdG9yLCBudWxscHRyKTsKK30KKworLy8gQWRkIGEgZW51bSB2YWx1ZXMgdG8gYSB0eXBlIGRpY3Rpb25hcnkuCitzdGF0aWMgYm9vbCBBZGRFbnVtVmFsdWVzKFB5VHlwZU9iamVjdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fZGVzY3JpcHRvci0+dmFsdWVfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUgPSBlbnVtX2Rlc2NyaXB0b3ItPnZhbHVlKGkpOworICAgIFNjb3BlZFB5T2JqZWN0UHRyIG9iaihQeUxvbmdfRnJvbUxvbmcodmFsdWUtPm51bWJlcigpKSk7CisgICAgaWYgKG9iaiA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LCB2YWx1ZS0+bmFtZSgpLmNfc3RyKCksIG9iai5nZXQoKSkgPAorICAgICAgICAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBBZGRJbnRDb25zdGFudChQeVR5cGVPYmplY3QgKnR5cGUsIGNvbnN0IGNoYXIqIG5hbWUsIGludCB2YWx1ZSkgeworICBTY29wZWRQeU9iamVjdFB0ciBvYmooUHlMb25nX0Zyb21Mb25nKHZhbHVlKSk7CisgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LCBuYW1lLCBvYmouZ2V0KCkpIDwgMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIEluaXREZXNjcmlwdG9yKCkgeworICBpZiAoUHlUeXBlX1JlYWR5KCZQeU1lc3NhZ2VEZXNjcmlwdG9yX1R5cGUpIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKFB5VHlwZV9SZWFkeSgmUHlGaWVsZERlc2NyaXB0b3JfVHlwZSkgPCAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoIUFkZEVudW1WYWx1ZXMoJlB5RmllbGREZXNjcmlwdG9yX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWxfZGVzY3JpcHRvcigpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUFkZEVudW1WYWx1ZXMoJlB5RmllbGREZXNjcmlwdG9yX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZV9kZXNjcmlwdG9yKCkpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisjZGVmaW5lIEFERF9GSUVMRERFU0NfQ09OU1RBTlQoTkFNRSkgQWRkSW50Q29uc3RhbnQoIFwKKyAgICAmUHlGaWVsZERlc2NyaXB0b3JfVHlwZSwgI05BTUUsIEZpZWxkRGVzY3JpcHRvcjo6TkFNRSkKKyAgaWYgKCFBRERfRklFTERERVNDX0NPTlNUQU5UKENQUFRZUEVfSU5UMzIpIHx8CisgICAgICAhQUREX0ZJRUxEREVTQ19DT05TVEFOVChDUFBUWVBFX0lOVDY0KSB8fAorICAgICAgIUFERF9GSUVMRERFU0NfQ09OU1RBTlQoQ1BQVFlQRV9VSU5UMzIpIHx8CisgICAgICAhQUREX0ZJRUxEREVTQ19DT05TVEFOVChDUFBUWVBFX1VJTlQ2NCkgfHwKKyAgICAgICFBRERfRklFTERERVNDX0NPTlNUQU5UKENQUFRZUEVfRE9VQkxFKSB8fAorICAgICAgIUFERF9GSUVMRERFU0NfQ09OU1RBTlQoQ1BQVFlQRV9GTE9BVCkgfHwKKyAgICAgICFBRERfRklFTERERVNDX0NPTlNUQU5UKENQUFRZUEVfQk9PTCkgfHwKKyAgICAgICFBRERfRklFTERERVNDX0NPTlNUQU5UKENQUFRZUEVfRU5VTSkgfHwKKyAgICAgICFBRERfRklFTERERVNDX0NPTlNUQU5UKENQUFRZUEVfU1RSSU5HKSB8fAorICAgICAgIUFERF9GSUVMRERFU0NfQ09OU1RBTlQoQ1BQVFlQRV9NRVNTQUdFKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorI3VuZGVmIEFERF9GSUVMRERFU0NfQ09OU1RBTlQKKworICBpZiAoUHlUeXBlX1JlYWR5KCZQeUVudW1EZXNjcmlwdG9yX1R5cGUpIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKFB5VHlwZV9SZWFkeSgmUHlFbnVtVmFsdWVEZXNjcmlwdG9yX1R5cGUpIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKFB5VHlwZV9SZWFkeSgmUHlGaWxlRGVzY3JpcHRvcl9UeXBlKSA8IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChQeVR5cGVfUmVhZHkoJlB5T25lb2ZEZXNjcmlwdG9yX1R5cGUpIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKFB5VHlwZV9SZWFkeSgmUHlTZXJ2aWNlRGVzY3JpcHRvcl9UeXBlKSA8IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChQeVR5cGVfUmVhZHkoJlB5TWV0aG9kRGVzY3JpcHRvcl9UeXBlKSA8IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghSW5pdERlc2NyaXB0b3JNYXBwaW5nVHlwZXMoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSW5pdGlhbGl6ZSBnbG9iYWxzIGRlZmluZWQgaW4gdGhpcyBmaWxlLgorICBpbnRlcm5lZF9kZXNjcmlwdG9ycyA9IG5ldyBzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3Qgdm9pZCosIFB5T2JqZWN0Kj47CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yLmggYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTdlMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yLmgKQEAgLTAsMCArMSwxMDggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHBldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdikKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9ERVNDUklQVE9SX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9ERVNDUklQVE9SX0hfXworCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBweXRob24geworCisvLyBTaG91bGQgbWF0Y2ggdGhlIHR5cGUgb2YgQ29uc3RTdHJpbmdQYXJhbS4KK3VzaW5nIFN0cmluZ1BhcmFtID0gc3RkOjpzdHJpbmc7CisKK2V4dGVybiBQeVR5cGVPYmplY3QgUHlNZXNzYWdlRGVzY3JpcHRvcl9UeXBlOworZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUZpZWxkRGVzY3JpcHRvcl9UeXBlOworZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUVudW1EZXNjcmlwdG9yX1R5cGU7CitleHRlcm4gUHlUeXBlT2JqZWN0IFB5RW51bVZhbHVlRGVzY3JpcHRvcl9UeXBlOworZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUZpbGVEZXNjcmlwdG9yX1R5cGU7CitleHRlcm4gUHlUeXBlT2JqZWN0IFB5T25lb2ZEZXNjcmlwdG9yX1R5cGU7CitleHRlcm4gUHlUeXBlT2JqZWN0IFB5U2VydmljZURlc2NyaXB0b3JfVHlwZTsKK2V4dGVybiBQeVR5cGVPYmplY3QgUHlNZXRob2REZXNjcmlwdG9yX1R5cGU7CisKKy8vIFdyYXBzIGEgRGVzY3JpcHRvciBpbiBhIFB5dGhvbiBvYmplY3QuCisvLyBUaGUgQysrIHBvaW50ZXIgaXMgdXN1YWxseSBib3Jyb3dlZCBmcm9tIHRoZSBnbG9iYWwgRGVzY3JpcHRvclBvb2wuCisvLyBJbiBhbnkgY2FzZSwgaXQgbXVzdCBzdGF5IGFsaXZlIGFzIGxvbmcgYXMgdGhlIFB5dGhvbiBvYmplY3QuCisvLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KK1B5T2JqZWN0KiBQeU1lc3NhZ2VEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworUHlPYmplY3QqIFB5RmllbGREZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CitQeU9iamVjdCogUHlFbnVtRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CitQeU9iamVjdCogUHlFbnVtVmFsdWVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKAorICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworUHlPYmplY3QqIFB5T25lb2ZEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGNvbnN0IE9uZW9mRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CitQeU9iamVjdCogUHlGaWxlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcigKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV9kZXNjcmlwdG9yKTsKK1B5T2JqZWN0KiBQeVNlcnZpY2VEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKAorICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKK1B5T2JqZWN0KiBQeU1ldGhvZERlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoCisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKKy8vIEFsdGVybmF0ZSBjb25zdHJ1Y3RvciBvZiBQeUZpbGVEZXNjcmlwdG9yLCB1c2VkIHdoZW4gd2UgYWxyZWFkeSBoYXZlIGEKKy8vIHNlcmlhbGl6ZWQgRmlsZURlc2NyaXB0b3JQcm90byB0aGF0IGNhbiBiZSBjYWNoZWQuCisvLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KK1B5T2JqZWN0KiBQeUZpbGVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yV2l0aFNlcmlhbGl6ZWRQYigKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV9kZXNjcmlwdG9yLCBQeU9iamVjdCogc2VyaWFsaXplZF9wYik7CisKKy8vIFJldHVybiB0aGUgQysrIGRlc2NyaXB0b3IgcG9pbnRlci4KKy8vIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBwYXJhbWV0ZXIgdHlwZTsgb24gZXJyb3IsIHJldHVybiBOVUxMIHdpdGggYSBQeXRob24KKy8vIGV4Y2VwdGlvbiBzZXQuCitjb25zdCBEZXNjcmlwdG9yKiBQeU1lc3NhZ2VEZXNjcmlwdG9yX0FzRGVzY3JpcHRvcihQeU9iamVjdCogb2JqKTsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvciogUHlGaWVsZERlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKFB5T2JqZWN0KiBvYmopOworY29uc3QgRW51bURlc2NyaXB0b3IqIFB5RW51bURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKFB5T2JqZWN0KiBvYmopOworY29uc3QgRmlsZURlc2NyaXB0b3IqIFB5RmlsZURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKFB5T2JqZWN0KiBvYmopOworY29uc3QgU2VydmljZURlc2NyaXB0b3IqIFB5U2VydmljZURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKFB5T2JqZWN0KiBvYmopOworCisvLyBSZXR1cm5zIHRoZSByYXcgQysrIHBvaW50ZXIuCitjb25zdCB2b2lkKiBQeURlc2NyaXB0b3JfQXNWb2lkUHRyKFB5T2JqZWN0KiBvYmopOworCisvLyBDaGVjayB0aGF0IHRoZSBjYWxsaW5nIFB5dGhvbiBjb2RlIGlzIHRoZSBnbG9iYWwgc2NvcGUgb2YgYSBfcGIyLnB5IG1vZHVsZS4KKy8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdXBwb3J0IHRoZSBjdXJyZW50IGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBwcm90bworLy8gY29tcGlsZXIsIHdoaWNoIGluc2lzdHMgb24gbW9kaWZ5aW5nIGRlc2NyaXB0b3JzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuCisvLyBjcmVhdGVkLgorLy8KKy8vIHN0YWNrbGV2ZWwgaW5kaWNhdGVzIHdoaWNoIFB5dGhvbiBmcmFtZSBzaG91bGQgYmUgdGhlIF9wYjIucHkgbW9kdWxlLgorLy8KKy8vIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIG91dHNpZGUgZGVzY3JpcHRvciBjbGFzc2VzLgorYm9vbCBfQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoaW50IHN0YWNrbGV2ZWwpOworCitib29sIEluaXREZXNjcmlwdG9yKCk7CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX0RFU0NSSVBUT1JfSF9fCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfY29udGFpbmVycy5jYyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9jb250YWluZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NzE1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfY29udGFpbmVycy5jYwpAQCAtMCwwICsxLDE2ODkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBNYXBwaW5ncyBhbmQgU2VxdWVuY2VzIG9mIGRlc2NyaXB0b3JzLgorLy8gVXNlZCBieSBEZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lLCBFbnVtRGVzY3JpcHRvci52YWx1ZXMuLi4KKy8vCisvLyBUaGV5IGF2b2lkIHRoZSBhbGxvY2F0aW9uIG9mIGEgZnVsbCBkaWN0aW9uYXJ5IG9yIGEgZnVsbCBsaXN0OiB0aGV5IHNpbXBseQorLy8gc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGVzY3JpcHRvciwgdXNlIHRoZSBDKysgRGVzY3JpcHRvciBtZXRob2RzIChzZWUKKy8vIG5ldC9wcm90bzIvcHVibGljL2Rlc2NyaXB0b3IuaCkgdG8gcmV0cmlldmUgb3RoZXIgZGVzY3JpcHRvcnMsIGFuZCBjcmVhdGUKKy8vIFB5dGhvbiBvYmplY3RzIG9uIHRoZSBmbHkuCisvLworLy8gVGhlIGNvbnRhaW5lcnMgZnVsbHkgY29uZm9ybSB0byBhYmMuTWFwcGluZyBhbmQgYWJjLlNlcXVlbmNlLCBhbmQgYmVoYXZlIGp1c3QKKy8vIGxpa2UgcmVhZC1vbmx5IGRpY3Rpb25hcmllcyBhbmQgbGlzdHMuCisvLworLy8gQmVjYXVzZSB0aGUgaW50ZXJmYWNlIG9mIEMrKyBEZXNjcmlwdG9ycyBpcyBxdWl0ZSByZWd1bGFyLCB0aGlzIGZpbGUgYWN0dWFsbHkKKy8vIGRlZmluZXMgb25seSB0aHJlZSB0eXBlcywgdGhlIGV4YWN0IGJlaGF2aW9yIG9mIGEgY29udGFpbmVyIGlzIGNvbnRyb2xsZWQgYnkKKy8vIGEgRGVzY3JpcHRvckNvbnRhaW5lckRlZiBzdHJ1Y3R1cmUsIHdoaWNoIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IHVzZXMgdGhlCisvLyBwdWJsaWMgRGVzY3JpcHRvciBBUEkuCisvLworLy8gTm90ZTogVGhpcyBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIGlzIHNpbWlsYXIgdG8gdGhlICJ2aXJ0dWFsIG1ldGhvZHMgdGFibGUiCisvLyB0aGF0IGEgQysrIGNvbXBpbGVyIGdlbmVyYXRlcyBmb3IgYSBjbGFzcy4gV2UgaGF2ZSB0byBtYWtlIGl0IGV4cGxpY2l0CisvLyBiZWNhdXNlIHRoZSBQeXRob24gQVBJIGlzIGJhc2VkIG9uIEMsIGFuZCBkb2VzIG5vdCBwbGF5IHdlbGwgd2l0aCBDKysKKy8vIGluaGVyaXRhbmNlLgorCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfY29udGFpbmVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yX3Bvb2wuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9zY29wZWRfcHlvYmplY3RfcHRyLmg+CisKKyNkZWZpbmUgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKG9iLCBjaGFycHAsIHNpemVwKSAgICAgICAgICAgICAgXAorICAoUHlVbmljb2RlX0NoZWNrKG9iKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKCooY2hhcnBwKSA9IGNvbnN0X2Nhc3Q8Y2hhcio+KCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIFB5VW5pY29kZV9Bc1VURjhBbmRTaXplKG9iLCAoc2l6ZXApKSkpID09IG51bGxwdHIgXAorICAgICAgICAgICAgICA/IC0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIDogMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6IFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplKG9iLCAoY2hhcnBwKSwgKHNpemVwKSkpCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBweXRob24geworCitzdHJ1Y3QgUHlDb250YWluZXI7CisKK3R5cGVkZWYgaW50ICgqQ291bnRNZXRob2QpKFB5Q29udGFpbmVyKiBzZWxmKTsKK3R5cGVkZWYgY29uc3Qgdm9pZCogKCpHZXRCeUluZGV4TWV0aG9kKShQeUNvbnRhaW5lciogc2VsZiwgaW50IGluZGV4KTsKK3R5cGVkZWYgY29uc3Qgdm9pZCogKCpHZXRCeU5hbWVNZXRob2QpKFB5Q29udGFpbmVyKiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RTdHJpbmdQYXJhbSBuYW1lKTsKK3R5cGVkZWYgY29uc3Qgdm9pZCogKCpHZXRCeUNhbWVsY2FzZU5hbWVNZXRob2QpKFB5Q29udGFpbmVyKiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RTdHJpbmdQYXJhbSBuYW1lKTsKK3R5cGVkZWYgY29uc3Qgdm9pZCogKCpHZXRCeU51bWJlck1ldGhvZCkoUHlDb250YWluZXIqIHNlbGYsIGludCBpbmRleCk7Cit0eXBlZGVmIFB5T2JqZWN0KiAoKk5ld09iamVjdEZyb21JdGVtTWV0aG9kKShjb25zdCB2b2lkKiBkZXNjcmlwdG9yKTsKK3R5cGVkZWYgY29uc3Qgc3RkOjpzdHJpbmcmICgqR2V0SXRlbU5hbWVNZXRob2QpKGNvbnN0IHZvaWQqIGRlc2NyaXB0b3IpOwordHlwZWRlZiBjb25zdCBzdGQ6OnN0cmluZyYgKCpHZXRJdGVtQ2FtZWxjYXNlTmFtZU1ldGhvZCkoCisgICAgY29uc3Qgdm9pZCogZGVzY3JpcHRvcik7Cit0eXBlZGVmIGludCAoKkdldEl0ZW1OdW1iZXJNZXRob2QpKGNvbnN0IHZvaWQqIGRlc2NyaXB0b3IpOwordHlwZWRlZiBpbnQgKCpHZXRJdGVtSW5kZXhNZXRob2QpKGNvbnN0IHZvaWQqIGRlc2NyaXB0b3IpOworCitzdHJ1Y3QgRGVzY3JpcHRvckNvbnRhaW5lckRlZiB7CisgIGNvbnN0IGNoYXIqIG1hcHBpbmdfbmFtZTsKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBjb250YWluZXIuCisgIENvdW50TWV0aG9kIGNvdW50X2ZuOworICAvLyBSZXRyaWV2ZSBpdGVtIGJ5IGluZGV4ICh1c3VhbGx5IHRoZSBvcmRlciBvZiBkZWNsYXJhdGlvbiBpbiB0aGUgcHJvdG8gZmlsZSkKKyAgLy8gVXNlZCBieSBzZXF1ZW5jZXMsIGJ1dCBhbHNvIGl0ZXJhdG9ycy4gMCA8PSBpbmRleCA8IENvdW50KCkuCisgIEdldEJ5SW5kZXhNZXRob2QgZ2V0X2J5X2luZGV4X2ZuOworICAvLyBSZXRyaWV2ZSBpdGVtIGJ5IG5hbWUgKHVzdWFsbHkgYSBjYWxsIHRvIHNvbWUgJ0ZpbmRCeU5hbWUnIG1ldGhvZCkuCisgIC8vIFVzZWQgYnkgImJ5X25hbWUiIG1hcHBpbmdzLgorICBHZXRCeU5hbWVNZXRob2QgZ2V0X2J5X25hbWVfZm47CisgIC8vIFJldHJpZXZlIGl0ZW0gYnkgY2FtZWxjYXNlIG5hbWUgKHVzdWFsbHkgYSBjYWxsIHRvIHNvbWUKKyAgLy8gJ0ZpbmRCeUNhbWVsY2FzZU5hbWUnIG1ldGhvZCkuIFVzZWQgYnkgImJ5X2NhbWVsY2FzZV9uYW1lIiBtYXBwaW5ncy4KKyAgR2V0QnlDYW1lbGNhc2VOYW1lTWV0aG9kIGdldF9ieV9jYW1lbGNhc2VfbmFtZV9mbjsKKyAgLy8gUmV0cmlldmUgaXRlbSBieSBkZWNsYXJlZCBudW1iZXIgKGZpZWxkIHRhZywgb3IgZW51bSB2YWx1ZSkuCisgIC8vIFVzZWQgYnkgImJ5X251bWJlciIgbWFwcGluZ3MuCisgIEdldEJ5TnVtYmVyTWV0aG9kIGdldF9ieV9udW1iZXJfZm47CisgIC8vIENvbnZlcnRzIGEgaXRlbSBDKysgZGVzY3JpcHRvciB0byBhIFB5dGhvbiBvYmplY3QuIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlLgorICBOZXdPYmplY3RGcm9tSXRlbU1ldGhvZCBuZXdfb2JqZWN0X2Zyb21faXRlbV9mbjsKKyAgLy8gUmV0cmlldmUgdGhlIG5hbWUgb2YgYW4gaXRlbS4gVXNlZCBieSBpdGVyYXRvcnMgb24gImJ5X25hbWUiIG1hcHBpbmdzLgorICBHZXRJdGVtTmFtZU1ldGhvZCBnZXRfaXRlbV9uYW1lX2ZuOworICAvLyBSZXRyaWV2ZSB0aGUgY2FtZWxjYXNlIG5hbWUgb2YgYW4gaXRlbS4gVXNlZCBieSBpdGVyYXRvcnMgb24KKyAgLy8gImJ5X2NhbWVsY2FzZV9uYW1lIiBtYXBwaW5ncy4KKyAgR2V0SXRlbUNhbWVsY2FzZU5hbWVNZXRob2QgZ2V0X2l0ZW1fY2FtZWxjYXNlX25hbWVfZm47CisgIC8vIFJldHJpZXZlIHRoZSBudW1iZXIgb2YgYW4gaXRlbS4gVXNlZCBieSBpdGVyYXRvcnMgb24gImJ5X251bWJlciIgbWFwcGluZ3MuCisgIEdldEl0ZW1OdW1iZXJNZXRob2QgZ2V0X2l0ZW1fbnVtYmVyX2ZuOworICAvLyBSZXRyaWV2ZSB0aGUgaW5kZXggb2YgYW4gaXRlbSBmb3IgdGhlIGNvbnRhaW5lciB0eXBlLgorICAvLyBVc2VkIGJ5ICJfX2NvbnRhaW5zX18iLgorICAvLyBJZiBub3Qgc2V0LCAieCBpbiBzZXF1ZW5jZSIgd2lsbCBkbyBhIGxpbmVhciBzZWFyY2guCisgIEdldEl0ZW1JbmRleE1ldGhvZCBnZXRfaXRlbV9pbmRleF9mbjsKK307CisKK3N0cnVjdCBQeUNvbnRhaW5lciB7CisgIFB5T2JqZWN0X0hFQUQKKworICAvLyBUaGUgcHJvdG8yIGRlc2NyaXB0b3IgdGhpcyBjb250YWluZXIgYmVsb25ncyB0byB0aGUgZ2xvYmFsIERlc2NyaXB0b3JQb29sLgorICBjb25zdCB2b2lkKiBkZXNjcmlwdG9yOworCisgIC8vIEEgcG9pbnRlciB0byBhIHN0YXRpYyBzdHJ1Y3R1cmUgd2l0aCBmdW5jdGlvbiBwb2ludGVycyB0aGF0IGNvbnRyb2wgdGhlCisgIC8vIGJlaGF2aW9yIG9mIHRoZSBjb250YWluZXIuIFZlcnkgc2ltaWxhciB0byB0aGUgdGFibGUgb2YgdmlydHVhbCBmdW5jdGlvbnMKKyAgLy8gb2YgYSBDKysgY2xhc3MuCisgIGNvbnN0IERlc2NyaXB0b3JDb250YWluZXJEZWYqIGNvbnRhaW5lcl9kZWY7CisKKyAgLy8gVGhlIGtpbmQgb2YgY29udGFpbmVyOiBsaXN0LCBvciBkaWN0IGJ5IG5hbWUgb3IgdmFsdWUuCisgIGVudW0gQ29udGFpbmVyS2luZCB7CisgICAgS0lORF9TRVFVRU5DRSwKKyAgICBLSU5EX0JZTkFNRSwKKyAgICBLSU5EX0JZQ0FNRUxDQVNFTkFNRSwKKyAgICBLSU5EX0JZTlVNQkVSLAorICB9IGtpbmQ7Cit9OworCitzdHJ1Y3QgUHlDb250YWluZXJJdGVyYXRvciB7CisgIFB5T2JqZWN0X0hFQUQKKworICAvLyBUaGUgY29udGFpbmVyIHdlIGFyZSBpdGVyYXRpbmcgb3Zlci4gT3duIGEgcmVmZXJlbmNlLgorICBQeUNvbnRhaW5lciogY29udGFpbmVyOworCisgIC8vIFRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRvci4KKyAgaW50IGluZGV4OworCisgIC8vIFRoZSBraW5kIG9mIGNvbnRhaW5lcjogbGlzdCwgb3IgZGljdCBieSBuYW1lIG9yIHZhbHVlLgorICBlbnVtIEl0ZXJLaW5kIHsKKyAgICBLSU5EX0lURVJLRVksCisgICAgS0lORF9JVEVSVkFMVUUsCisgICAgS0lORF9JVEVSSVRFTSwKKyAgICBLSU5EX0lURVJWQUxVRV9SRVZFUlNFRCwgIC8vIEZvciBzZXF1ZW5jZXMKKyAgfSBraW5kOworfTsKKworbmFtZXNwYWNlIGRlc2NyaXB0b3IgeworCisvLyBSZXR1cm5zIHRoZSBDKysgaXRlbSBkZXNjcmlwdG9yIGZvciBhIGdpdmVuIFB5dGhvbiBrZXkuCisvLyBXaGVuIHRoZSBkZXNjcmlwdG9yIGlzIGZvdW5kLCByZXR1cm4gdHJ1ZSBhbmQgc2V0ICppdGVtLgorLy8gV2hlbiB0aGUgZGVzY3JpcHRvciBpcyBub3QgZm91bmQsIHJldHVybiB0cnVlLCBidXQgc2V0ICppdGVtIHRvIG51bGwuCisvLyBPbiBlcnJvciwgcmV0dXJucyBmYWxzZSB3aXRoIGFuIGV4Y2VwdGlvbiBzZXQuCitzdGF0aWMgYm9vbCBfR2V0SXRlbUJ5S2V5KFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCoga2V5LCBjb25zdCB2b2lkKiogaXRlbSkgeworICBzd2l0Y2ggKHNlbGYtPmtpbmQpIHsKKyAgICBjYXNlIFB5Q29udGFpbmVyOjpLSU5EX0JZTkFNRTogeworICAgICAgY2hhciogbmFtZTsKKyAgICAgIFB5X3NzaXplX3QgbmFtZV9zaXplOworICAgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShrZXksICZuYW1lLCAmbmFtZV9zaXplKSA8IDApIHsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkgeworICAgICAgICAgIC8vIE5vdCBhIHN0cmluZywgY2Fubm90IGJlIGluIHRoZSBjb250YWluZXIuCisgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAqaXRlbSA9IG51bGxwdHI7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgKml0ZW0gPSBzZWxmLT5jb250YWluZXJfZGVmLT5nZXRfYnlfbmFtZV9mbihzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQYXJhbShuYW1lLCBuYW1lX3NpemUpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIFB5Q29udGFpbmVyOjpLSU5EX0JZQ0FNRUxDQVNFTkFNRTogeworICAgICAgY2hhciogY2FtZWxjYXNlX25hbWU7CisgICAgICBQeV9zc2l6ZV90IG5hbWVfc2l6ZTsKKyAgICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoa2V5LCAmY2FtZWxjYXNlX25hbWUsICZuYW1lX3NpemUpIDwgMCkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKSB7CisgICAgICAgICAgLy8gTm90IGEgc3RyaW5nLCBjYW5ub3QgYmUgaW4gdGhlIGNvbnRhaW5lci4KKyAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICppdGVtID0gbnVsbHB0cjsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAqaXRlbSA9IHNlbGYtPmNvbnRhaW5lcl9kZWYtPmdldF9ieV9jYW1lbGNhc2VfbmFtZV9mbigKKyAgICAgICAgICBzZWxmLCBTdHJpbmdQYXJhbShjYW1lbGNhc2VfbmFtZSwgbmFtZV9zaXplKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBQeUNvbnRhaW5lcjo6S0lORF9CWU5VTUJFUjogeworICAgICAgUHlfc3NpemVfdCBudW1iZXIgPSBQeU51bWJlcl9Bc1NzaXplX3Qoa2V5LCBudWxscHRyKTsKKyAgICAgIGlmIChudW1iZXIgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKSB7CisgICAgICAgICAgLy8gTm90IGEgbnVtYmVyLCBjYW5ub3QgYmUgaW4gdGhlIGNvbnRhaW5lci4KKyAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICppdGVtID0gbnVsbHB0cjsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAqaXRlbSA9IHNlbGYtPmNvbnRhaW5lcl9kZWYtPmdldF9ieV9udW1iZXJfZm4oc2VsZiwgbnVtYmVyKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG9iamVjdCBhdCB0aGUgZ2l2ZW4gaW5kZXguCisvLyBVc2VkIHdoZW4gaXRlcmF0aW5nIG92ZXIgbWFwcGluZ3MuCitzdGF0aWMgUHlPYmplY3QqIF9OZXdLZXlfQnlJbmRleChQeUNvbnRhaW5lciogc2VsZiwgUHlfc3NpemVfdCBpbmRleCkgeworICBjb25zdCB2b2lkKiBpdGVtID0gc2VsZi0+Y29udGFpbmVyX2RlZi0+Z2V0X2J5X2luZGV4X2ZuKHNlbGYsIGluZGV4KTsKKyAgc3dpdGNoIChzZWxmLT5raW5kKSB7CisgICAgY2FzZSBQeUNvbnRhaW5lcjo6S0lORF9CWU5BTUU6IHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKHNlbGYtPmNvbnRhaW5lcl9kZWYtPmdldF9pdGVtX25hbWVfZm4oaXRlbSkpOworICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZShuYW1lLmNfc3RyKCksIG5hbWUuc2l6ZSgpKTsKKyAgICB9CisgICAgY2FzZSBQeUNvbnRhaW5lcjo6S0lORF9CWUNBTUVMQ0FTRU5BTUU6IHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKAorICAgICAgICAgIHNlbGYtPmNvbnRhaW5lcl9kZWYtPmdldF9pdGVtX2NhbWVsY2FzZV9uYW1lX2ZuKGl0ZW0pKTsKKyAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUobmFtZS5jX3N0cigpLCBuYW1lLnNpemUoKSk7CisgICAgfQorICAgIGNhc2UgUHlDb250YWluZXI6OktJTkRfQllOVU1CRVI6IHsKKyAgICAgIGludCB2YWx1ZSA9IHNlbGYtPmNvbnRhaW5lcl9kZWYtPmdldF9pdGVtX251bWJlcl9mbihpdGVtKTsKKyAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcodmFsdWUpOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICB9Cit9CisKKy8vIFJldHVybnMgdGhlIG9iamVjdCBhdCB0aGUgZ2l2ZW4gaW5kZXguCisvLyBBbHNvIHVzZWQgd2hlbiBpdGVyYXRpbmcgb3ZlciBtYXBwaW5ncy4KK3N0YXRpYyBQeU9iamVjdCogX05ld09ial9CeUluZGV4KFB5Q29udGFpbmVyKiBzZWxmLCBQeV9zc2l6ZV90IGluZGV4KSB7CisgIHJldHVybiBzZWxmLT5jb250YWluZXJfZGVmLT5uZXdfb2JqZWN0X2Zyb21faXRlbV9mbigKKyAgICAgIHNlbGYtPmNvbnRhaW5lcl9kZWYtPmdldF9ieV9pbmRleF9mbihzZWxmLCBpbmRleCkpOworfQorCitzdGF0aWMgUHlfc3NpemVfdCBMZW5ndGgoUHlDb250YWluZXIqIHNlbGYpIHsKKyAgcmV0dXJuIHNlbGYtPmNvbnRhaW5lcl9kZWYtPmNvdW50X2ZuKHNlbGYpOworfQorCisvLyBUaGUgRGVzY3JpcHRvck1hcHBpbmcgdHlwZS4KKworc3RhdGljIFB5T2JqZWN0KiBTdWJzY3JpcHQoUHlDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBrZXkpIHsKKyAgY29uc3Qgdm9pZCogaXRlbSA9IG51bGxwdHI7CisgIGlmICghX0dldEl0ZW1CeUtleShzZWxmLCBrZXksICZpdGVtKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmICghaXRlbSkgeworICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwga2V5KTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gc2VsZi0+Y29udGFpbmVyX2RlZi0+bmV3X29iamVjdF9mcm9tX2l0ZW1fZm4oaXRlbSk7Cit9CisKK3N0YXRpYyBpbnQgQXNzU3Vic2NyaXB0KFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCoga2V5LCBQeU9iamVjdCogdmFsdWUpIHsKKyAgaWYgKF9DYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgwKSkgeworICAgIHJldHVybiAwOworICB9CisgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAiJyUuMjAwcycgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50IiwKKyAgICAgICAgICAgICAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUpOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBQeU1hcHBpbmdNZXRob2RzIE1hcHBpbmdNYXBwaW5nTWV0aG9kcyA9IHsKKyAgKGxlbmZ1bmMpTGVuZ3RoLCAgICAgICAgICAgICAgIC8vIG1wX2xlbmd0aAorICAoYmluYXJ5ZnVuYylTdWJzY3JpcHQsICAgICAgICAgLy8gbXBfc3Vic2NyaXB0CisgIChvYmpvYmphcmdwcm9jKUFzc1N1YnNjcmlwdCwgICAvLyBtcF9hc3Nfc3Vic2NyaXB0Cit9OworCitzdGF0aWMgaW50IENvbnRhaW5zKFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCoga2V5KSB7CisgIGNvbnN0IHZvaWQqIGl0ZW0gPSBudWxscHRyOworICBpZiAoIV9HZXRJdGVtQnlLZXkoc2VsZiwga2V5LCAmaXRlbSkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKGl0ZW0pIHsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitzdGF0aWMgUHlPYmplY3QqIENvbnRhaW5lclJlcHIoUHlDb250YWluZXIqIHNlbGYpIHsKKyAgY29uc3QgY2hhcioga2luZCA9ICIiOworICBzd2l0Y2ggKHNlbGYtPmtpbmQpIHsKKyAgICBjYXNlIFB5Q29udGFpbmVyOjpLSU5EX1NFUVVFTkNFOgorICAgICAga2luZCA9ICJzZXF1ZW5jZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFB5Q29udGFpbmVyOjpLSU5EX0JZTkFNRToKKyAgICAgIGtpbmQgPSAibWFwcGluZyBieSBuYW1lIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUHlDb250YWluZXI6OktJTkRfQllDQU1FTENBU0VOQU1FOgorICAgICAga2luZCA9ICJtYXBwaW5nIGJ5IGNhbWVsQ2FzZSBuYW1lIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUHlDb250YWluZXI6OktJTkRfQllOVU1CRVI6CisgICAgICBraW5kID0gIm1hcHBpbmcgYnkgbnVtYmVyIjsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiPCVzICVzPiIsIHNlbGYtPmNvbnRhaW5lcl9kZWYtPm1hcHBpbmdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQpOworfQorCitleHRlcm4gUHlUeXBlT2JqZWN0IERlc2NyaXB0b3JNYXBwaW5nX1R5cGU7CitleHRlcm4gUHlUeXBlT2JqZWN0IERlc2NyaXB0b3JTZXF1ZW5jZV9UeXBlOworCisvLyBBIHNlcXVlbmNlIGNvbnRhaW5lciBjYW4gb25seSBiZSBlcXVhbCB0byBhbm90aGVyIHNlcXVlbmNlIGNvbnRhaW5lciwgb3IgKGZvcgorLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgdG8gYSBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgaXRlbXMuCisvLyBSZXR1cm5zIDEgaWYgZXF1YWwsIDAgaWYgdW5lcXVhbCwgLTEgb24gZXJyb3IuCitzdGF0aWMgaW50IERlc2NyaXB0b3JTZXF1ZW5jZV9FcXVhbChQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIG90aGVyKSB7CisgIC8vIENoZWNrIHRoZSBpZGVudGl0eSBvZiBDKysgcG9pbnRlcnMuCisgIGlmIChQeU9iamVjdF9UeXBlQ2hlY2sob3RoZXIsICZEZXNjcmlwdG9yU2VxdWVuY2VfVHlwZSkpIHsKKyAgICBQeUNvbnRhaW5lciogb3RoZXJfY29udGFpbmVyID0gcmVpbnRlcnByZXRfY2FzdDxQeUNvbnRhaW5lcio+KG90aGVyKTsKKyAgICBpZiAoc2VsZi0+ZGVzY3JpcHRvciA9PSBvdGhlcl9jb250YWluZXItPmRlc2NyaXB0b3IgJiYKKyAgICAgICAgc2VsZi0+Y29udGFpbmVyX2RlZiA9PSBvdGhlcl9jb250YWluZXItPmNvbnRhaW5lcl9kZWYgJiYKKyAgICAgICAgc2VsZi0+a2luZCA9PSBvdGhlcl9jb250YWluZXItPmtpbmQpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICAvLyBJZiBvdGhlciBpcyBhIGxpc3QKKyAgaWYgKFB5TGlzdF9DaGVjayhvdGhlcikpIHsKKyAgICAvLyByZXR1cm4gbGlzdChzZWxmKSA9PSBvdGhlcgorICAgIGludCBzaXplID0gTGVuZ3RoKHNlbGYpOworICAgIGlmIChzaXplICE9IFB5TGlzdF9TaXplKG90aGVyKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykgeworICAgICAgU2NvcGVkUHlPYmplY3RQdHIgdmFsdWUxKF9OZXdPYmpfQnlJbmRleChzZWxmLCBpbmRleCkpOworICAgICAgaWYgKHZhbHVlMSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIFB5T2JqZWN0KiB2YWx1ZTIgPSBQeUxpc3RfR2V0SXRlbShvdGhlciwgaW5kZXgpOworICAgICAgaWYgKHZhbHVlMiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wodmFsdWUxLmdldCgpLCB2YWx1ZTIsIFB5X0VRKTsKKyAgICAgIGlmIChjbXAgIT0gMSkgIC8vIGVycm9yIG9yIG5vdCBlcXVhbAorICAgICAgICAgIHJldHVybiBjbXA7CisgICAgfQorICAgIC8vIEFsbCBpdGVtcyB3ZXJlIGZvdW5kIGFuZCBlcXVhbAorICAgIHJldHVybiAxOworICB9CisKKyAgLy8gQW55IG90aGVyIG9iamVjdCBpcyBkaWZmZXJlbnQuCisgIHJldHVybiAwOworfQorCisvLyBBIG1hcHBpbmcgY29udGFpbmVyIGNhbiBvbmx5IGJlIGVxdWFsIHRvIGFub3RoZXIgbWFwcGluZyBjb250YWluZXIsIG9yIChmb3IKKy8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpIHRvIGEgZGljdCBjb250YWluaW5nIHRoZSBzYW1lIGl0ZW1zLgorLy8gUmV0dXJucyAxIGlmIGVxdWFsLCAwIGlmIHVuZXF1YWwsIC0xIG9uIGVycm9yLgorc3RhdGljIGludCBEZXNjcmlwdG9yTWFwcGluZ19FcXVhbChQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIG90aGVyKSB7CisgIC8vIENoZWNrIHRoZSBpZGVudGl0eSBvZiBDKysgcG9pbnRlcnMuCisgIGlmIChQeU9iamVjdF9UeXBlQ2hlY2sob3RoZXIsICZEZXNjcmlwdG9yTWFwcGluZ19UeXBlKSkgeworICAgIFB5Q29udGFpbmVyKiBvdGhlcl9jb250YWluZXIgPSByZWludGVycHJldF9jYXN0PFB5Q29udGFpbmVyKj4ob3RoZXIpOworICAgIGlmIChzZWxmLT5kZXNjcmlwdG9yID09IG90aGVyX2NvbnRhaW5lci0+ZGVzY3JpcHRvciAmJgorICAgICAgICBzZWxmLT5jb250YWluZXJfZGVmID09IG90aGVyX2NvbnRhaW5lci0+Y29udGFpbmVyX2RlZiAmJgorICAgICAgICBzZWxmLT5raW5kID09IG90aGVyX2NvbnRhaW5lci0+a2luZCkgeworICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIC8vIElmIG90aGVyIGlzIGEgZGljdAorICBpZiAoUHlEaWN0X0NoZWNrKG90aGVyKSkgeworICAgIC8vIGVxdWl2YWxlbnQgdG8gZGljdChzZWxmLml0ZW1zKCkpID09IG90aGVyCisgICAgaW50IHNpemUgPSBMZW5ndGgoc2VsZik7CisgICAgaWYgKHNpemUgIT0gUHlEaWN0X1NpemUob3RoZXIpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyBpbmRleCsrKSB7CisgICAgICBTY29wZWRQeU9iamVjdFB0ciBrZXkoX05ld0tleV9CeUluZGV4KHNlbGYsIGluZGV4KSk7CisgICAgICBpZiAoa2V5ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgU2NvcGVkUHlPYmplY3RQdHIgdmFsdWUxKF9OZXdPYmpfQnlJbmRleChzZWxmLCBpbmRleCkpOworICAgICAgaWYgKHZhbHVlMSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIFB5T2JqZWN0KiB2YWx1ZTIgPSBQeURpY3RfR2V0SXRlbShvdGhlciwga2V5LmdldCgpKTsKKyAgICAgIGlmICh2YWx1ZTIgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBOb3QgZm91bmQgaW4gdGhlIG90aGVyIGRpY3Rpb25hcnkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHZhbHVlMS5nZXQoKSwgdmFsdWUyLCBQeV9FUSk7CisgICAgICBpZiAoY21wICE9IDEpICAvLyBlcnJvciBvciBub3QgZXF1YWwKKyAgICAgICAgICByZXR1cm4gY21wOworICAgIH0KKyAgICAvLyBBbGwgaXRlbXMgd2VyZSBmb3VuZCBhbmQgZXF1YWwKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vIEFueSBvdGhlciBvYmplY3QgaXMgZGlmZmVyZW50LgorICByZXR1cm4gMDsKK30KKworc3RhdGljIFB5T2JqZWN0KiBSaWNoQ29tcGFyZShQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIG90aGVyLCBpbnQgb3BpZCkgeworICBpZiAob3BpZCAhPSBQeV9FUSAmJiBvcGlkICE9IFB5X05FKSB7CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgIH0KKworICBpbnQgcmVzdWx0OworCisgIGlmIChzZWxmLT5raW5kID09IFB5Q29udGFpbmVyOjpLSU5EX1NFUVVFTkNFKSB7CisgICAgcmVzdWx0ID0gRGVzY3JpcHRvclNlcXVlbmNlX0VxdWFsKHNlbGYsIG90aGVyKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBEZXNjcmlwdG9yTWFwcGluZ19FcXVhbChzZWxmLCBvdGhlcik7CisgIH0KKyAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAocmVzdWx0IF4gKG9waWQgPT0gUHlfTkUpKSB7CisgICAgUHlfUkVUVVJOX1RSVUU7CisgIH0gZWxzZSB7CisgICAgUHlfUkVUVVJOX0ZBTFNFOworICB9Cit9CisKK3N0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBNYXBwaW5nU2VxdWVuY2VNZXRob2RzID0geworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgLy8gc3FfbGVuZ3RoCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAvLyBzcV9jb25jYXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgIC8vIHNxX3JlcGVhdAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgLy8gc3FfaXRlbQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgLy8gc3Ffc2xpY2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgIC8vIHNxX2Fzc19pdGVtCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAvLyBzcV9hc3Nfc2xpY2UKKyAgICAob2Jqb2JqcHJvYylDb250YWlucywgIC8vIHNxX2NvbnRhaW5zCit9OworCitzdGF0aWMgUHlPYmplY3QqIEdldChQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgUHlPYmplY3QqIGtleTsKKyAgUHlPYmplY3QqIGRlZmF1bHRfdmFsdWUgPSBQeV9Ob25lOworICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJnZXQiLCAxLCAyLCAma2V5LCAmZGVmYXVsdF92YWx1ZSkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGNvbnN0IHZvaWQqIGl0ZW07CisgIGlmICghX0dldEl0ZW1CeUtleShzZWxmLCBrZXksICZpdGVtKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChpdGVtID09IG51bGxwdHIpIHsKKyAgICBQeV9JTkNSRUYoZGVmYXVsdF92YWx1ZSk7CisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIH0KKyAgcmV0dXJuIHNlbGYtPmNvbnRhaW5lcl9kZWYtPm5ld19vYmplY3RfZnJvbV9pdGVtX2ZuKGl0ZW0pOworfQorCitzdGF0aWMgUHlPYmplY3QqIEtleXMoUHlDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIFB5X3NzaXplX3QgY291bnQgPSBMZW5ndGgoc2VsZik7CisgIFNjb3BlZFB5T2JqZWN0UHRyIGxpc3QoUHlMaXN0X05ldyhjb3VudCkpOworICBpZiAobGlzdCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgZm9yIChQeV9zc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgKytpbmRleCkgeworICAgIFB5T2JqZWN0KiBrZXkgPSBfTmV3S2V5X0J5SW5kZXgoc2VsZiwgaW5kZXgpOworICAgIGlmIChrZXkgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIFB5TGlzdF9TRVRfSVRFTShsaXN0LmdldCgpLCBpbmRleCwga2V5KTsKKyAgfQorICByZXR1cm4gbGlzdC5yZWxlYXNlKCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogVmFsdWVzKFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBQeV9zc2l6ZV90IGNvdW50ID0gTGVuZ3RoKHNlbGYpOworICBTY29wZWRQeU9iamVjdFB0ciBsaXN0KFB5TGlzdF9OZXcoY291bnQpKTsKKyAgaWYgKGxpc3QgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGZvciAoUHlfc3NpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7ICsraW5kZXgpIHsKKyAgICBQeU9iamVjdCogdmFsdWUgPSBfTmV3T2JqX0J5SW5kZXgoc2VsZiwgaW5kZXgpOworICAgIGlmICh2YWx1ZSA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgUHlMaXN0X1NFVF9JVEVNKGxpc3QuZ2V0KCksIGluZGV4LCB2YWx1ZSk7CisgIH0KKyAgcmV0dXJuIGxpc3QucmVsZWFzZSgpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEl0ZW1zKFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBQeV9zc2l6ZV90IGNvdW50ID0gTGVuZ3RoKHNlbGYpOworICBTY29wZWRQeU9iamVjdFB0ciBsaXN0KFB5TGlzdF9OZXcoY291bnQpKTsKKyAgaWYgKGxpc3QgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGZvciAoUHlfc3NpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7ICsraW5kZXgpIHsKKyAgICBTY29wZWRQeU9iamVjdFB0ciBvYmooUHlUdXBsZV9OZXcoMikpOworICAgIGlmIChvYmogPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIFB5T2JqZWN0KiBrZXkgPSBfTmV3S2V5X0J5SW5kZXgoc2VsZiwgaW5kZXgpOworICAgIGlmIChrZXkgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIFB5VHVwbGVfU0VUX0lURU0ob2JqLmdldCgpLCAwLCBrZXkpOworICAgIFB5T2JqZWN0KiB2YWx1ZSA9IF9OZXdPYmpfQnlJbmRleChzZWxmLCBpbmRleCk7CisgICAgaWYgKHZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBQeVR1cGxlX1NFVF9JVEVNKG9iai5nZXQoKSwgMSwgdmFsdWUpOworICAgIFB5TGlzdF9TRVRfSVRFTShsaXN0LmdldCgpLCBpbmRleCwgb2JqLnJlbGVhc2UoKSk7CisgIH0KKyAgcmV0dXJuIGxpc3QucmVsZWFzZSgpOworfQorCitzdGF0aWMgUHlPYmplY3QqIE5ld0NvbnRhaW5lckl0ZXJhdG9yKFB5Q29udGFpbmVyKiBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbnRhaW5lckl0ZXJhdG9yOjpJdGVyS2luZCBraW5kKTsKKworc3RhdGljIFB5T2JqZWN0KiBJdGVyKFB5Q29udGFpbmVyKiBzZWxmKSB7CisgIHJldHVybiBOZXdDb250YWluZXJJdGVyYXRvcihzZWxmLCBQeUNvbnRhaW5lckl0ZXJhdG9yOjpLSU5EX0lURVJLRVkpOworfQorc3RhdGljIFB5T2JqZWN0KiBJdGVyS2V5cyhQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgcmV0dXJuIE5ld0NvbnRhaW5lckl0ZXJhdG9yKHNlbGYsIFB5Q29udGFpbmVySXRlcmF0b3I6OktJTkRfSVRFUktFWSk7Cit9CitzdGF0aWMgUHlPYmplY3QqIEl0ZXJWYWx1ZXMoUHlDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBOZXdDb250YWluZXJJdGVyYXRvcihzZWxmLCBQeUNvbnRhaW5lckl0ZXJhdG9yOjpLSU5EX0lURVJWQUxVRSk7Cit9CitzdGF0aWMgUHlPYmplY3QqIEl0ZXJJdGVtcyhQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgcmV0dXJuIE5ld0NvbnRhaW5lckl0ZXJhdG9yKHNlbGYsIFB5Q29udGFpbmVySXRlcmF0b3I6OktJTkRfSVRFUklURU0pOworfQorCitzdGF0aWMgUHlNZXRob2REZWYgTWFwcGluZ01ldGhvZHNbXSA9IHsKKyAgICB7ImdldCIsIChQeUNGdW5jdGlvbilHZXQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJrZXlzIiwgKFB5Q0Z1bmN0aW9uKUtleXMsIE1FVEhfTk9BUkdTfSwKKyAgICB7InZhbHVlcyIsIChQeUNGdW5jdGlvbilWYWx1ZXMsIE1FVEhfTk9BUkdTfSwKKyAgICB7Iml0ZW1zIiwgKFB5Q0Z1bmN0aW9uKUl0ZW1zLCBNRVRIX05PQVJHU30sCisgICAgeyJpdGVya2V5cyIsIChQeUNGdW5jdGlvbilJdGVyS2V5cywgTUVUSF9OT0FSR1N9LAorICAgIHsiaXRlcnZhbHVlcyIsIChQeUNGdW5jdGlvbilJdGVyVmFsdWVzLCBNRVRIX05PQVJHU30sCisgICAgeyJpdGVyaXRlbXMiLCAoUHlDRnVuY3Rpb24pSXRlckl0ZW1zLCBNRVRIX05PQVJHU30sCisgICAge251bGxwdHJ9LAorfTsKKworUHlUeXBlT2JqZWN0IERlc2NyaXB0b3JNYXBwaW5nX1R5cGUgPSB7CisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkgIkRlc2NyaXB0b3JNYXBwaW5nIiwgIC8vIHRwX25hbWUKKyAgICBzaXplb2YoUHlDb250YWluZXIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYmFzaWNzaXplCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZW1zaXplCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RlYWxsb2MKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwODAwMDAKKyAgICBudWxscHRyLCAgLy8gdHBfcHJpbnQKKyNlbHNlCisgICAgMCwgIC8vIHRwX3ZlY3RvcmNhbGxfb2Zmc2V0CisjZW5kaWYKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2NvbXBhcmUKKyAgICAocmVwcmZ1bmMpQ29udGFpbmVyUmVwciwgICAvLyB0cF9yZXByCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbnVtYmVyCisgICAgJk1hcHBpbmdTZXF1ZW5jZU1ldGhvZHMsICAgLy8gdHBfYXNfc2VxdWVuY2UKKyAgICAmTWFwcGluZ01hcHBpbmdNZXRob2RzLCAgICAvLyB0cF9hc19tYXBwaW5nCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfaGFzaAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2NhbGwKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9zdHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfYnVmZmVyCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgLy8gdHBfZmxhZ3MKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9kb2MKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF90cmF2ZXJzZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2NsZWFyCisgICAgKHJpY2hjbXBmdW5jKVJpY2hDb21wYXJlLCAgLy8gdHBfcmljaGNvbXBhcmUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF93ZWFrbGlzdG9mZnNldAorICAgIChnZXRpdGVyZnVuYylJdGVyLCAgICAgICAgIC8vIHRwX2l0ZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVybmV4dAorICAgIE1hcHBpbmdNZXRob2RzLCAgICAgICAgICAgIC8vIHRwX21ldGhvZHMKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0c2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfYmFzZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2RpY3QKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9nZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9zZXQKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfaW5pdAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2FsbG9jCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfbmV3CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfZnJlZQorfTsKKworLy8gVGhlIERlc2NyaXB0b3JTZXF1ZW5jZSB0eXBlLgorCitzdGF0aWMgUHlPYmplY3QqIEdldEl0ZW0oUHlDb250YWluZXIqIHNlbGYsIFB5X3NzaXplX3QgaW5kZXgpIHsKKyAgaWYgKGluZGV4IDwgMCkgeworICAgIGluZGV4ICs9IExlbmd0aChzZWxmKTsKKyAgfQorICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IExlbmd0aChzZWxmKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIF9OZXdPYmpfQnlJbmRleChzZWxmLCBpbmRleCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitTZXFTdWJzY3JpcHQoUHlDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBpdGVtKSB7CisgIGlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7CisgICAgICBQeV9zc2l6ZV90IGluZGV4OworICAgICAgaW5kZXggPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICBpZiAoaW5kZXggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgcmV0dXJuIG51bGxwdHI7CisgICAgICByZXR1cm4gR2V0SXRlbShzZWxmLCBpbmRleCk7CisgIH0KKyAgLy8gTWF0ZXJpYWxpemUgdGhlIGxpc3QgYW5kIGRlbGVnYXRlIHRoZSBvcGVyYXRpb24gdG8gaXQuCisgIFNjb3BlZFB5T2JqZWN0UHRyIGxpc3QoUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigmUHlMaXN0X1R5cGUpLCBzZWxmLCBudWxscHRyKSk7CisgIGlmIChsaXN0ID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gUHlfVFlQRShsaXN0LmdldCgpKS0+dHBfYXNfbWFwcGluZy0+bXBfc3Vic2NyaXB0KGxpc3QuZ2V0KCksIGl0ZW0pOworfQorCisvLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSBpbiB0aGUgc2VxdWVuY2UsIG9mIC0xIGlmIG5vdCBmb3VuZC4KKy8vIFRoaXMgZnVuY3Rpb24gbmV2ZXIgZmFpbHMuCitpbnQgRmluZChQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIGl0ZW0pIHsKKyAgLy8gVGhlIGl0ZW0gY2FuIG9ubHkgYmUgaW4gb25lIHBvc2l0aW9uOiBpdGVtLmluZGV4LgorICAvLyBDaGVjayB0aGF0IHNlbGZbaXRlbS5pbmRleF0gPT0gaXRlbSwgaXQncyBmYXN0ZXIgdGhhbiBhIGxpbmVhciBzZWFyY2guCisgIC8vCisgIC8vIFRoaXMgYXNzdW1lcyB0aGF0IHNlcXVlbmNlcyBhcmUgb25seSBkZWZpbmVkIGJ5IHN5bnRheCBvZiB0aGUgLnByb3RvIGZpbGU6CisgIC8vIGEgc3BlY2lmaWMgaXRlbSBiZWxvbmdzIHRvIG9ubHkgb25lIHNlcXVlbmNlLCBkZXBlbmRpbmcgb24gaXRzIHBvc2l0aW9uIGluCisgIC8vIHRoZSAucHJvdG8gZmlsZSBkZWZpbml0aW9uLgorICBjb25zdCB2b2lkKiBkZXNjcmlwdG9yX3B0ciA9IFB5RGVzY3JpcHRvcl9Bc1ZvaWRQdHIoaXRlbSk7CisgIGlmIChkZXNjcmlwdG9yX3B0ciA9PSBudWxscHRyKSB7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAvLyBOb3QgYSBkZXNjcmlwdG9yLCBpdCBjYW5ub3QgYmUgaW4gdGhlIGxpc3QuCisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChzZWxmLT5jb250YWluZXJfZGVmLT5nZXRfaXRlbV9pbmRleF9mbikgeworICAgIGludCBpbmRleCA9IHNlbGYtPmNvbnRhaW5lcl9kZWYtPmdldF9pdGVtX2luZGV4X2ZuKGRlc2NyaXB0b3JfcHRyKTsKKyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IExlbmd0aChzZWxmKSkgeworICAgICAgLy8gVGhpcyBpbmRleCBpcyBub3QgZnJvbSB0aGlzIGNvbGxlY3Rpb24uCisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzZWxmLT5jb250YWluZXJfZGVmLT5nZXRfYnlfaW5kZXhfZm4oc2VsZiwgaW5kZXgpICE9IGRlc2NyaXB0b3JfcHRyKSB7CisgICAgICAvLyBUaGUgZGVzY3JpcHRvciBhdCB0aGlzIGluZGV4IGlzIG5vdCB0aGUgc2FtZS4KKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLy8gc2VsZltpdGVtLmluZGV4XSA9PSBpdGVtLCBzbyByZXR1cm4gdGhlIGluZGV4LgorICAgIHJldHVybiBpbmRleDsKKyAgfSBlbHNlIHsKKyAgICAvLyBGYWxsIGJhY2sgdG8gbGluZWFyIHNlYXJjaC4KKyAgICBpbnQgbGVuZ3RoID0gTGVuZ3RoKHNlbGYpOworICAgIGZvciAoaW50IGluZGV4PTA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CisgICAgICBpZiAoc2VsZi0+Y29udGFpbmVyX2RlZi0+Z2V0X2J5X2luZGV4X2ZuKHNlbGYsIGluZGV4KSA9PSBkZXNjcmlwdG9yX3B0cikgeworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICB9CisgICAgfQorICAgIC8vIE5vdCBmb3VuZAorICAgIHJldHVybiAtMTsKKyAgfQorfQorCisvLyBJbXBsZW1lbnRzIGxpc3QuaW5kZXgoKTogdGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIGlzIGluIHRoZSBzZXF1ZW5jZS4KK3N0YXRpYyBQeU9iamVjdCogSW5kZXgoUHlDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBpdGVtKSB7CisgIGludCBwb3NpdGlvbiA9IEZpbmQoc2VsZiwgaXRlbSk7CisgIGlmIChwb3NpdGlvbiA8IDApIHsKKyAgICAvLyBOb3QgZm91bmQKKyAgICBQeUVycl9TZXROb25lKFB5RXhjX1ZhbHVlRXJyb3IpOworICAgIHJldHVybiBudWxscHRyOworICB9IGVsc2UgeworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcocG9zaXRpb24pOworICB9Cit9CisvLyBJbXBsZW1lbnRzICJsaXN0Ll9fY29udGFpbnNfXygpIjogaXMgdGhlIG9iamVjdCBpbiB0aGUgc2VxdWVuY2UuCitzdGF0aWMgaW50IFNlcUNvbnRhaW5zKFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogaXRlbSkgeworICBpbnQgcG9zaXRpb24gPSBGaW5kKHNlbGYsIGl0ZW0pOworICBpZiAocG9zaXRpb24gPCAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworLy8gSW1wbGVtZW50cyBsaXN0LmNvdW50KCk6IG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB0aGUgaXRlbSBpbiB0aGUgc2VxdWVuY2UuCisvLyBBbiBpdGVtIGNhbiBvbmx5IGFwcGVhciBvbmNlIGluIGEgc2VxdWVuY2UuIElmIGl0IGV4aXN0cywgcmV0dXJuIDEuCitzdGF0aWMgUHlPYmplY3QqIENvdW50KFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogaXRlbSkgeworICBpbnQgcG9zaXRpb24gPSBGaW5kKHNlbGYsIGl0ZW0pOworICBpZiAocG9zaXRpb24gPCAwKSB7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKDEpOworICB9Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQXBwZW5kKFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBpZiAoX0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKDApKSB7CisgICAgUHlfUkVUVVJOX05PTkU7CisgIH0KKyAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICInJS4yMDBzJyBvYmplY3QgaXMgbm90IGEgbXV0YWJsZSBzZXF1ZW5jZSIsCisgICAgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lKTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogUmV2ZXJzZWQoUHlDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBOZXdDb250YWluZXJJdGVyYXRvcihzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb250YWluZXJJdGVyYXRvcjo6S0lORF9JVEVSVkFMVUVfUkVWRVJTRUQpOworfQorCitzdGF0aWMgUHlNZXRob2REZWYgU2VxTWV0aG9kc1tdID0geworICAgIHsiaW5kZXgiLCAoUHlDRnVuY3Rpb24pSW5kZXgsIE1FVEhfT30sCisgICAgeyJjb3VudCIsIChQeUNGdW5jdGlvbilDb3VudCwgTUVUSF9PfSwKKyAgICB7ImFwcGVuZCIsIChQeUNGdW5jdGlvbilBcHBlbmQsIE1FVEhfT30sCisgICAgeyJfX3JldmVyc2VkX18iLCAoUHlDRnVuY3Rpb24pUmV2ZXJzZWQsIE1FVEhfTk9BUkdTfSwKKyAgICB7bnVsbHB0cn0sCit9OworCitzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgU2VxU2VxdWVuY2VNZXRob2RzID0geworICAgIChsZW5mdW5jKUxlbmd0aCwgICAgICAgICAgLy8gc3FfbGVuZ3RoCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAvLyBzcV9jb25jYXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgIC8vIHNxX3JlcGVhdAorICAgIChzc2l6ZWFyZ2Z1bmMpR2V0SXRlbSwgICAgLy8gc3FfaXRlbQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgLy8gc3Ffc2xpY2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgIC8vIHNxX2Fzc19pdGVtCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAvLyBzcV9hc3Nfc2xpY2UKKyAgICAob2Jqb2JqcHJvYylTZXFDb250YWlucywgIC8vIHNxX2NvbnRhaW5zCit9OworCitzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBTZXFNYXBwaW5nTWV0aG9kcyA9IHsKKyAgICAobGVuZnVuYylMZW5ndGgsICAgICAgICAgICAvLyBtcF9sZW5ndGgKKyAgICAoYmluYXJ5ZnVuYylTZXFTdWJzY3JpcHQsICAvLyBtcF9zdWJzY3JpcHQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyBtcF9hc3Nfc3Vic2NyaXB0Cit9OworCitQeVR5cGVPYmplY3QgRGVzY3JpcHRvclNlcXVlbmNlX1R5cGUgPSB7CisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkgIkRlc2NyaXB0b3JTZXF1ZW5jZSIsICAvLyB0cF9uYW1lCisgICAgc2l6ZW9mKFB5Q29udGFpbmVyKSwgIC8vIHRwX2Jhc2ljc2l6ZQorICAgIDAsICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVtc2l6ZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAvLyB0cF9kZWFsbG9jCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDgwMDAwCisgICAgbnVsbHB0ciwgIC8vIHRwX3ByaW50CisjZWxzZQorICAgIDAsICAvLyB0cF92ZWN0b3JjYWxsX29mZnNldAorI2VuZGlmCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9jb21wYXJlCisgICAgKHJlcHJmdW5jKUNvbnRhaW5lclJlcHIsICAgLy8gdHBfcmVwcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX251bWJlcgorICAgICZTZXFTZXF1ZW5jZU1ldGhvZHMsICAgICAgIC8vIHRwX2FzX3NlcXVlbmNlCisgICAgJlNlcU1hcHBpbmdNZXRob2RzLCAgICAgICAgLy8gdHBfYXNfbWFwcGluZworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2hhc2gKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9jYWxsCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfc3RyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cm8KKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX2J1ZmZlcgorICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgIC8vIHRwX2ZsYWdzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfZG9jCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfdHJhdmVyc2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9jbGVhcgorICAgIChyaWNoY21wZnVuYylSaWNoQ29tcGFyZSwgIC8vIHRwX3JpY2hjb21wYXJlCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfd2Vha2xpc3RvZmZzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcm5leHQKKyAgICBTZXFNZXRob2RzLCAgICAgICAgICAgICAgICAvLyB0cF9tZXRob2RzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfbWVtYmVycworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldHNldAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2Jhc2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVzY3JfZ2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVzY3Jfc2V0CisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGljdG9mZnNldAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2luaXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9hbGxvYworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX25ldworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2ZyZWUKK307CisKK3N0YXRpYyBQeU9iamVjdCogTmV3TWFwcGluZ0J5TmFtZSgKKyAgICBEZXNjcmlwdG9yQ29udGFpbmVyRGVmKiBjb250YWluZXJfZGVmLCBjb25zdCB2b2lkKiBkZXNjcmlwdG9yKSB7CisgIFB5Q29udGFpbmVyKiBzZWxmID0gUHlPYmplY3RfTmV3KFB5Q29udGFpbmVyLCAmRGVzY3JpcHRvck1hcHBpbmdfVHlwZSk7CisgIGlmIChzZWxmID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBzZWxmLT5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKKyAgc2VsZi0+Y29udGFpbmVyX2RlZiA9IGNvbnRhaW5lcl9kZWY7CisgIHNlbGYtPmtpbmQgPSBQeUNvbnRhaW5lcjo6S0lORF9CWU5BTUU7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogTmV3TWFwcGluZ0J5Q2FtZWxjYXNlTmFtZSgKKyAgICBEZXNjcmlwdG9yQ29udGFpbmVyRGVmKiBjb250YWluZXJfZGVmLCBjb25zdCB2b2lkKiBkZXNjcmlwdG9yKSB7CisgIFB5Q29udGFpbmVyKiBzZWxmID0gUHlPYmplY3RfTmV3KFB5Q29udGFpbmVyLCAmRGVzY3JpcHRvck1hcHBpbmdfVHlwZSk7CisgIGlmIChzZWxmID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBzZWxmLT5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKKyAgc2VsZi0+Y29udGFpbmVyX2RlZiA9IGNvbnRhaW5lcl9kZWY7CisgIHNlbGYtPmtpbmQgPSBQeUNvbnRhaW5lcjo6S0lORF9CWUNBTUVMQ0FTRU5BTUU7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogTmV3TWFwcGluZ0J5TnVtYmVyKAorICAgIERlc2NyaXB0b3JDb250YWluZXJEZWYqIGNvbnRhaW5lcl9kZWYsIGNvbnN0IHZvaWQqIGRlc2NyaXB0b3IpIHsKKyAgaWYgKGNvbnRhaW5lcl9kZWYtPmdldF9ieV9udW1iZXJfZm4gPT0gbnVsbHB0ciB8fAorICAgICAgY29udGFpbmVyX2RlZi0+Z2V0X2l0ZW1fbnVtYmVyX2ZuID09IG51bGxwdHIpIHsKKyAgICBQeUVycl9TZXROb25lKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFB5Q29udGFpbmVyKiBzZWxmID0gUHlPYmplY3RfTmV3KFB5Q29udGFpbmVyLCAmRGVzY3JpcHRvck1hcHBpbmdfVHlwZSk7CisgIGlmIChzZWxmID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBzZWxmLT5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKKyAgc2VsZi0+Y29udGFpbmVyX2RlZiA9IGNvbnRhaW5lcl9kZWY7CisgIHNlbGYtPmtpbmQgPSBQeUNvbnRhaW5lcjo6S0lORF9CWU5VTUJFUjsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBOZXdTZXF1ZW5jZSgKKyAgICBEZXNjcmlwdG9yQ29udGFpbmVyRGVmKiBjb250YWluZXJfZGVmLCBjb25zdCB2b2lkKiBkZXNjcmlwdG9yKSB7CisgIFB5Q29udGFpbmVyKiBzZWxmID0gUHlPYmplY3RfTmV3KFB5Q29udGFpbmVyLCAmRGVzY3JpcHRvclNlcXVlbmNlX1R5cGUpOworICBpZiAoc2VsZiA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgc2VsZi0+ZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgIHNlbGYtPmNvbnRhaW5lcl9kZWYgPSBjb250YWluZXJfZGVmOworICBzZWxmLT5raW5kID0gUHlDb250YWluZXI6OktJTkRfU0VRVUVOQ0U7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZik7Cit9CisKKy8vIEltcGxlbWVudCBpdGVyYXRvcnMgb3ZlciBQeUNvbnRhaW5lcnMuCisKK3N0YXRpYyB2b2lkIEl0ZXJhdG9yX0RlYWxsb2MoUHlDb250YWluZXJJdGVyYXRvciogc2VsZikgeworICBQeV9DTEVBUihzZWxmLT5jb250YWluZXIpOworICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogSXRlcmF0b3JfTmV4dChQeUNvbnRhaW5lckl0ZXJhdG9yKiBzZWxmKSB7CisgIGludCBjb3VudCA9IHNlbGYtPmNvbnRhaW5lci0+Y29udGFpbmVyX2RlZi0+Y291bnRfZm4oc2VsZi0+Y29udGFpbmVyKTsKKyAgaWYgKHNlbGYtPmluZGV4ID49IGNvdW50KSB7CisgICAgLy8gUmV0dXJuIG51bGwgd2l0aCBubyBleGNlcHRpb24gdG8gaW5kaWNhdGUgdGhlIGVuZC4KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpbnQgaW5kZXggPSBzZWxmLT5pbmRleDsKKyAgc2VsZi0+aW5kZXggKz0gMTsKKyAgc3dpdGNoIChzZWxmLT5raW5kKSB7CisgICAgY2FzZSBQeUNvbnRhaW5lckl0ZXJhdG9yOjpLSU5EX0lURVJLRVk6CisgICAgICByZXR1cm4gX05ld0tleV9CeUluZGV4KHNlbGYtPmNvbnRhaW5lciwgaW5kZXgpOworICAgIGNhc2UgUHlDb250YWluZXJJdGVyYXRvcjo6S0lORF9JVEVSVkFMVUU6CisgICAgICByZXR1cm4gX05ld09ial9CeUluZGV4KHNlbGYtPmNvbnRhaW5lciwgaW5kZXgpOworICAgIGNhc2UgUHlDb250YWluZXJJdGVyYXRvcjo6S0lORF9JVEVSVkFMVUVfUkVWRVJTRUQ6CisgICAgICByZXR1cm4gX05ld09ial9CeUluZGV4KHNlbGYtPmNvbnRhaW5lciwgY291bnQgLSBpbmRleCAtIDEpOworICAgIGNhc2UgUHlDb250YWluZXJJdGVyYXRvcjo6S0lORF9JVEVSSVRFTTogeworICAgICAgUHlPYmplY3QqIG9iaiA9IFB5VHVwbGVfTmV3KDIpOworICAgICAgaWYgKG9iaiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfQorICAgICAgUHlPYmplY3QqIGtleSA9IF9OZXdLZXlfQnlJbmRleChzZWxmLT5jb250YWluZXIsIGluZGV4KTsKKyAgICAgIGlmIChrZXkgPT0gbnVsbHB0cikgeworICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAgICBQeVR1cGxlX1NFVF9JVEVNKG9iaiwgMCwga2V5KTsKKyAgICAgIFB5T2JqZWN0KiB2YWx1ZSA9IF9OZXdPYmpfQnlJbmRleChzZWxmLT5jb250YWluZXIsIGluZGV4KTsKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKyAgICAgIFB5VHVwbGVfU0VUX0lURU0ob2JqLCAxLCB2YWx1ZSk7CisgICAgICByZXR1cm4gb2JqOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICB9Cit9CisKK3N0YXRpYyBQeVR5cGVPYmplY3QgQ29udGFpbmVySXRlcmF0b3JfVHlwZSA9IHsKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwKSAiRGVzY3JpcHRvckNvbnRhaW5lckl0ZXJhdG9yIiwgIC8vIHRwX25hbWUKKyAgICBzaXplb2YoUHlDb250YWluZXJJdGVyYXRvciksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9iYXNpY3NpemUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVtc2l6ZQorICAgIChkZXN0cnVjdG9yKUl0ZXJhdG9yX0RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RlYWxsb2MKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwODAwMDAKKyAgICBudWxscHRyLCAgLy8gdHBfcHJpbnQKKyNlbHNlCisgICAgMCwgIC8vIHRwX3ZlY3RvcmNhbGxfb2Zmc2V0CisjZW5kaWYKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NvbXBhcmUKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yZXByCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbnVtYmVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfc2VxdWVuY2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19tYXBwaW5nCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaGFzaAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NhbGwKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zdHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfYnVmZmVyCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgLy8gdHBfZmxhZ3MKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kb2MKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyB0cF90cmF2ZXJzZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NsZWFyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmljaGNvbXBhcmUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF93ZWFrbGlzdG9mZnNldAorICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgIC8vIHRwX2l0ZXIKKyAgICAoaXRlcm5leHRmdW5jKUl0ZXJhdG9yX05leHQsICAvLyB0cF9pdGVybmV4dAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21ldGhvZHMKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0c2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYmFzZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RpY3QKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9nZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9zZXQKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaW5pdAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FsbG9jCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbmV3CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZnJlZQorfTsKKworc3RhdGljIFB5T2JqZWN0KiBOZXdDb250YWluZXJJdGVyYXRvcihQeUNvbnRhaW5lciogY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbnRhaW5lckl0ZXJhdG9yOjpJdGVyS2luZCBraW5kKSB7CisgIFB5Q29udGFpbmVySXRlcmF0b3IqIHNlbGYgPSBQeU9iamVjdF9OZXcoUHlDb250YWluZXJJdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29udGFpbmVySXRlcmF0b3JfVHlwZSk7CisgIGlmIChzZWxmID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeV9JTkNSRUYoY29udGFpbmVyKTsKKyAgc2VsZi0+Y29udGFpbmVyID0gY29udGFpbmVyOworICBzZWxmLT5raW5kID0ga2luZDsKKyAgc2VsZi0+aW5kZXggPSAwOworCisgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBkZXNjcmlwdG9yCisKKy8vIE5vdyBkZWZpbmUgdGhlIHJlYWwgY29sbGVjdGlvbnMhCisKK25hbWVzcGFjZSBtZXNzYWdlX2Rlc2NyaXB0b3IgeworCit0eXBlZGVmIGNvbnN0IERlc2NyaXB0b3IqIFBhcmVudERlc2NyaXB0b3I7CisKK3N0YXRpYyBQYXJlbnREZXNjcmlwdG9yIEdldERlc2NyaXB0b3IoUHlDb250YWluZXIqIHNlbGYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UGFyZW50RGVzY3JpcHRvcj4oc2VsZi0+ZGVzY3JpcHRvcik7Cit9CisKK25hbWVzcGFjZSBmaWVsZHMgeworCit0eXBlZGVmIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogSXRlbURlc2NyaXB0b3I7CisKK3N0YXRpYyBpbnQgQ291bnQoUHlDb250YWluZXIqIHNlbGYpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPmZpZWxkX2NvdW50KCk7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkKiBHZXRCeU5hbWUoUHlDb250YWluZXIqIHNlbGYsIENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgeworICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+RmluZEZpZWxkQnlOYW1lKG5hbWUpOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCogR2V0QnlDYW1lbGNhc2VOYW1lKFB5Q29udGFpbmVyKiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFN0cmluZ1BhcmFtIG5hbWUpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZShuYW1lKTsKK30KKworc3RhdGljIGNvbnN0IHZvaWQqIEdldEJ5TnVtYmVyKFB5Q29udGFpbmVyKiBzZWxmLCBpbnQgbnVtYmVyKSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5GaW5kRmllbGRCeU51bWJlcihudW1iZXIpOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCogR2V0QnlJbmRleChQeUNvbnRhaW5lciogc2VsZiwgaW50IGluZGV4KSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5maWVsZChpbmRleCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogTmV3T2JqZWN0RnJvbUl0ZW0oY29uc3Qgdm9pZCogaXRlbSkgeworICByZXR1cm4gUHlGaWVsZERlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3Ioc3RhdGljX2Nhc3Q8SXRlbURlc2NyaXB0b3I+KGl0ZW0pKTsKK30KKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRJdGVtTmFtZShjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSktPm5hbWUoKTsKK30KKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRJdGVtQ2FtZWxjYXNlTmFtZShjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSktPmNhbWVsY2FzZV9uYW1lKCk7Cit9CisKK3N0YXRpYyBpbnQgR2V0SXRlbU51bWJlcihjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSktPm51bWJlcigpOworfQorCitzdGF0aWMgaW50IEdldEl0ZW1JbmRleChjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSktPmluZGV4KCk7Cit9CisKK3N0YXRpYyBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIENvbnRhaW5lckRlZiA9IHsKKyAgICAiTWVzc2FnZUZpZWxkcyIsICAgICAgQ291bnQsICAgICAgICAgR2V0QnlJbmRleCwgICAgICAgIEdldEJ5TmFtZSwKKyAgICBHZXRCeUNhbWVsY2FzZU5hbWUsICAgR2V0QnlOdW1iZXIsICAgTmV3T2JqZWN0RnJvbUl0ZW0sIEdldEl0ZW1OYW1lLAorICAgIEdldEl0ZW1DYW1lbGNhc2VOYW1lLCBHZXRJdGVtTnVtYmVyLCBHZXRJdGVtSW5kZXgsCit9OworCit9ICAvLyBuYW1lc3BhY2UgZmllbGRzCisKK1B5T2JqZWN0KiBOZXdNZXNzYWdlRmllbGRzQnlOYW1lKFBhcmVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3TWFwcGluZ0J5TmFtZSgmZmllbGRzOjpDb250YWluZXJEZWYsIGRlc2NyaXB0b3IpOworfQorCitQeU9iamVjdCogTmV3TWVzc2FnZUZpZWxkc0J5Q2FtZWxjYXNlTmFtZShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld01hcHBpbmdCeUNhbWVsY2FzZU5hbWUoJmZpZWxkczo6Q29udGFpbmVyRGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yKTsKK30KKworUHlPYmplY3QqIE5ld01lc3NhZ2VGaWVsZHNCeU51bWJlcihQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld01hcHBpbmdCeU51bWJlcigmZmllbGRzOjpDb250YWluZXJEZWYsIGRlc2NyaXB0b3IpOworfQorCitQeU9iamVjdCogTmV3TWVzc2FnZUZpZWxkc1NlcShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld1NlcXVlbmNlKCZmaWVsZHM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK25hbWVzcGFjZSBuZXN0ZWRfdHlwZXMgeworCit0eXBlZGVmIGNvbnN0IERlc2NyaXB0b3IqIEl0ZW1EZXNjcmlwdG9yOworCitzdGF0aWMgaW50IENvdW50KFB5Q29udGFpbmVyKiBzZWxmKSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5uZXN0ZWRfdHlwZV9jb3VudCgpOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCogR2V0QnlOYW1lKFB5Q29udGFpbmVyKiBzZWxmLCBDb25zdFN0cmluZ1BhcmFtIG5hbWUpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPkZpbmROZXN0ZWRUeXBlQnlOYW1lKG5hbWUpOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCogR2V0QnlJbmRleChQeUNvbnRhaW5lciogc2VsZiwgaW50IGluZGV4KSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5uZXN0ZWRfdHlwZShpbmRleCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogTmV3T2JqZWN0RnJvbUl0ZW0oY29uc3Qgdm9pZCogaXRlbSkgeworICByZXR1cm4gUHlNZXNzYWdlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSkpOworfQorCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcmIEdldEl0ZW1OYW1lKGNvbnN0IHZvaWQqIGl0ZW0pIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEl0ZW1EZXNjcmlwdG9yPihpdGVtKS0+bmFtZSgpOworfQorCitzdGF0aWMgaW50IEdldEl0ZW1JbmRleChjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSktPmluZGV4KCk7Cit9CisKK3N0YXRpYyBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIENvbnRhaW5lckRlZiA9IHsKKyAgICAiTWVzc2FnZU5lc3RlZFR5cGVzIiwKKyAgICBDb3VudCwKKyAgICBHZXRCeUluZGV4LAorICAgIEdldEJ5TmFtZSwKKyAgICBudWxscHRyLAorICAgIG51bGxwdHIsCisgICAgTmV3T2JqZWN0RnJvbUl0ZW0sCisgICAgR2V0SXRlbU5hbWUsCisgICAgbnVsbHB0ciwKKyAgICBudWxscHRyLAorICAgIEdldEl0ZW1JbmRleCwKK307CisKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWRfdHlwZXMKKworUHlPYmplY3QqIE5ld01lc3NhZ2VOZXN0ZWRUeXBlc1NlcShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld1NlcXVlbmNlKCZuZXN0ZWRfdHlwZXM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK1B5T2JqZWN0KiBOZXdNZXNzYWdlTmVzdGVkVHlwZXNCeU5hbWUoUGFyZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yOjpOZXdNYXBwaW5nQnlOYW1lKCZuZXN0ZWRfdHlwZXM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK25hbWVzcGFjZSBlbnVtcyB7CisKK3R5cGVkZWYgY29uc3QgRW51bURlc2NyaXB0b3IqIEl0ZW1EZXNjcmlwdG9yOworCitzdGF0aWMgaW50IENvdW50KFB5Q29udGFpbmVyKiBzZWxmKSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5lbnVtX3R5cGVfY291bnQoKTsKK30KKworc3RhdGljIGNvbnN0IHZvaWQqIEdldEJ5TmFtZShQeUNvbnRhaW5lciogc2VsZiwgQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5GaW5kRW51bVR5cGVCeU5hbWUobmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkKiBHZXRCeUluZGV4KFB5Q29udGFpbmVyKiBzZWxmLCBpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPmVudW1fdHlwZShpbmRleCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogTmV3T2JqZWN0RnJvbUl0ZW0oY29uc3Qgdm9pZCogaXRlbSkgeworICByZXR1cm4gUHlFbnVtRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSkpOworfQorCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcmIEdldEl0ZW1OYW1lKGNvbnN0IHZvaWQqIGl0ZW0pIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEl0ZW1EZXNjcmlwdG9yPihpdGVtKS0+bmFtZSgpOworfQorCitzdGF0aWMgaW50IEdldEl0ZW1JbmRleChjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSktPmluZGV4KCk7Cit9CisKK3N0YXRpYyBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIENvbnRhaW5lckRlZiA9IHsKKyAgICAiTWVzc2FnZU5lc3RlZEVudW1zIiwKKyAgICBDb3VudCwKKyAgICBHZXRCeUluZGV4LAorICAgIEdldEJ5TmFtZSwKKyAgICBudWxscHRyLAorICAgIG51bGxwdHIsCisgICAgTmV3T2JqZWN0RnJvbUl0ZW0sCisgICAgR2V0SXRlbU5hbWUsCisgICAgbnVsbHB0ciwKKyAgICBudWxscHRyLAorICAgIEdldEl0ZW1JbmRleCwKK307CisKK30gIC8vIG5hbWVzcGFjZSBlbnVtcworCitQeU9iamVjdCogTmV3TWVzc2FnZUVudW1zQnlOYW1lKFBhcmVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3TWFwcGluZ0J5TmFtZSgmZW51bXM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK1B5T2JqZWN0KiBOZXdNZXNzYWdlRW51bXNTZXEoUGFyZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yOjpOZXdTZXF1ZW5jZSgmZW51bXM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK25hbWVzcGFjZSBlbnVtdmFsdWVzIHsKKworLy8gVGhpcyBpcyB0aGUgImVudW1fdmFsdWVzX2J5X25hbWUiIG1hcHBpbmcsIHdoaWNoIGNvbGxlY3RzIHZhbHVlcyBmcm9tIGFsbAorLy8gZW51bSB0eXBlcyBpbiBhIG1lc3NhZ2UuCisvLworLy8gTm90ZSB0aGF0IHRoZSBiZWhhdmlvciBvZiB0aGUgQysrIGRlc2NyaXB0b3IgaXMgZGlmZmVyZW50OiBpdCB3aWxsIHNlYXJjaCBhbmQKKy8vIHJldHVybiB0aGUgZmlyc3QgdmFsdWUgdGhhdCBtYXRjaGVzIHRoZSBuYW1lLCB3aGVyZWFzIHRoZSBQeXRob24KKy8vIGltcGxlbWVudGF0aW9uIHJldHJpZXZlcyB0aGUgbGFzdCBvbmUuCisKK3R5cGVkZWYgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogSXRlbURlc2NyaXB0b3I7CisKK3N0YXRpYyBpbnQgQ291bnQoUHlDb250YWluZXIqIHNlbGYpIHsKKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBHZXREZXNjcmlwdG9yKHNlbGYpLT5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgY291bnQgKz0gR2V0RGVzY3JpcHRvcihzZWxmKS0+ZW51bV90eXBlKGkpLT52YWx1ZV9jb3VudCgpOworICB9CisgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHZvaWQqIEdldEJ5TmFtZShQeUNvbnRhaW5lciogc2VsZiwgQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5GaW5kRW51bVZhbHVlQnlOYW1lKG5hbWUpOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCogR2V0QnlJbmRleChQeUNvbnRhaW5lciogc2VsZiwgaW50IGluZGV4KSB7CisgIC8vIFRoaXMgaXMgbm90IG9wdGltYWwsIGJ1dCB0aGUgbnVtYmVyIG9mIGVudW1zICp0eXBlcyogaW4gYSBnaXZlbiBtZXNzYWdlCisgIC8vIGlzIHNtYWxsLiAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgd2hlbiBpdGVyYXRpbmcgb3ZlciB0aGUgbWFwcGluZy4KKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZSA9IG51bGxwdHI7CisgIGludCBlbnVtX3R5cGVfY291bnQgPSBHZXREZXNjcmlwdG9yKHNlbGYpLT5lbnVtX3R5cGVfY291bnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtX3R5cGVfY291bnQ7ICsraSkgeworICAgIGVudW1fdHlwZSA9IEdldERlc2NyaXB0b3Ioc2VsZiktPmVudW1fdHlwZShpKTsKKyAgICBpbnQgZW51bV92YWx1ZV9jb3VudCA9IGVudW1fdHlwZS0+dmFsdWVfY291bnQoKTsKKyAgICBpZiAoaW5kZXggPCBlbnVtX3ZhbHVlX2NvdW50KSB7CisgICAgICAvLyBGb3VuZCBpdCEKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpbmRleCAtPSBlbnVtX3ZhbHVlX2NvdW50OworICB9CisgIC8vIFRoZSBuZXh0IHN0YXRlbWVudCBjYW5ub3Qgb3ZlcmZsb3csIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBieQorICAvLyBpbnRlcm5hbCBpdGVyYXRvcnMgd2hpY2ggZW5zdXJlIHRoYXQgMCA8PSBpbmRleCA8IENvdW50KCkuCisgIHJldHVybiBlbnVtX3R5cGUtPnZhbHVlKGluZGV4KTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBOZXdPYmplY3RGcm9tSXRlbShjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBQeUVudW1WYWx1ZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoCisgICAgICBzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSkpOworfQorCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcmIEdldEl0ZW1OYW1lKGNvbnN0IHZvaWQqIGl0ZW0pIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEl0ZW1EZXNjcmlwdG9yPihpdGVtKS0+bmFtZSgpOworfQorCitzdGF0aWMgRGVzY3JpcHRvckNvbnRhaW5lckRlZiBDb250YWluZXJEZWYgPSB7CisgICAgIk1lc3NhZ2VFbnVtVmFsdWVzIiwgQ291bnQsICAgICAgIEdldEJ5SW5kZXgsIEdldEJ5TmFtZSwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICBOZXdPYmplY3RGcm9tSXRlbSwgICBHZXRJdGVtTmFtZSwgbnVsbHB0ciwgICAgbnVsbHB0ciwgICBudWxscHRyLAorfTsKKworfSAgLy8gbmFtZXNwYWNlIGVudW12YWx1ZXMKKworUHlPYmplY3QqIE5ld01lc3NhZ2VFbnVtVmFsdWVzQnlOYW1lKFBhcmVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3TWFwcGluZ0J5TmFtZSgmZW51bXZhbHVlczo6Q29udGFpbmVyRGVmLCBkZXNjcmlwdG9yKTsKK30KKworbmFtZXNwYWNlIGV4dGVuc2lvbnMgeworCit0eXBlZGVmIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogSXRlbURlc2NyaXB0b3I7CisKK3N0YXRpYyBpbnQgQ291bnQoUHlDb250YWluZXIqIHNlbGYpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPmV4dGVuc2lvbl9jb3VudCgpOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCogR2V0QnlOYW1lKFB5Q29udGFpbmVyKiBzZWxmLCBDb25zdFN0cmluZ1BhcmFtIG5hbWUpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPkZpbmRFeHRlbnNpb25CeU5hbWUobmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkKiBHZXRCeUluZGV4KFB5Q29udGFpbmVyKiBzZWxmLCBpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPmV4dGVuc2lvbihpbmRleCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogTmV3T2JqZWN0RnJvbUl0ZW0oY29uc3Qgdm9pZCogaXRlbSkgeworICByZXR1cm4gUHlGaWVsZERlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3Ioc3RhdGljX2Nhc3Q8SXRlbURlc2NyaXB0b3I+KGl0ZW0pKTsKK30KKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRJdGVtTmFtZShjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSktPm5hbWUoKTsKK30KKworc3RhdGljIGludCBHZXRJdGVtSW5kZXgoY29uc3Qgdm9pZCogaXRlbSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8SXRlbURlc2NyaXB0b3I+KGl0ZW0pLT5pbmRleCgpOworfQorCitzdGF0aWMgRGVzY3JpcHRvckNvbnRhaW5lckRlZiBDb250YWluZXJEZWYgPSB7CisgICAgIk1lc3NhZ2VFeHRlbnNpb25zIiwKKyAgICBDb3VudCwKKyAgICBHZXRCeUluZGV4LAorICAgIEdldEJ5TmFtZSwKKyAgICBudWxscHRyLAorICAgIG51bGxwdHIsCisgICAgTmV3T2JqZWN0RnJvbUl0ZW0sCisgICAgR2V0SXRlbU5hbWUsCisgICAgbnVsbHB0ciwKKyAgICBudWxscHRyLAorICAgIEdldEl0ZW1JbmRleCwKK307CisKK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb25zCisKK1B5T2JqZWN0KiBOZXdNZXNzYWdlRXh0ZW5zaW9uc0J5TmFtZShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld01hcHBpbmdCeU5hbWUoJmV4dGVuc2lvbnM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK1B5T2JqZWN0KiBOZXdNZXNzYWdlRXh0ZW5zaW9uc1NlcShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld1NlcXVlbmNlKCZleHRlbnNpb25zOjpDb250YWluZXJEZWYsIGRlc2NyaXB0b3IpOworfQorCituYW1lc3BhY2Ugb25lb2ZzIHsKKwordHlwZWRlZiBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIEl0ZW1EZXNjcmlwdG9yOworCitzdGF0aWMgaW50IENvdW50KFB5Q29udGFpbmVyKiBzZWxmKSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5vbmVvZl9kZWNsX2NvdW50KCk7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkKiBHZXRCeU5hbWUoUHlDb250YWluZXIqIHNlbGYsIENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgeworICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+RmluZE9uZW9mQnlOYW1lKG5hbWUpOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCogR2V0QnlJbmRleChQeUNvbnRhaW5lciogc2VsZiwgaW50IGluZGV4KSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5vbmVvZl9kZWNsKGluZGV4KTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBOZXdPYmplY3RGcm9tSXRlbShjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBQeU9uZW9mRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSkpOworfQorCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcmIEdldEl0ZW1OYW1lKGNvbnN0IHZvaWQqIGl0ZW0pIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEl0ZW1EZXNjcmlwdG9yPihpdGVtKS0+bmFtZSgpOworfQorCitzdGF0aWMgaW50IEdldEl0ZW1JbmRleChjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSktPmluZGV4KCk7Cit9CisKK3N0YXRpYyBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIENvbnRhaW5lckRlZiA9IHsKKyAgICAiTWVzc2FnZU9uZW9mcyIsIENvdW50LCAgIEdldEJ5SW5kZXgsICAgICAgICBHZXRCeU5hbWUsCisgICAgbnVsbHB0ciwgICAgICAgICBudWxscHRyLCBOZXdPYmplY3RGcm9tSXRlbSwgR2V0SXRlbU5hbWUsCisgICAgbnVsbHB0ciwgICAgICAgICBudWxscHRyLCBHZXRJdGVtSW5kZXgsCit9OworCit9ICAvLyBuYW1lc3BhY2Ugb25lb2ZzCisKK1B5T2JqZWN0KiBOZXdNZXNzYWdlT25lb2ZzQnlOYW1lKFBhcmVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3TWFwcGluZ0J5TmFtZSgmb25lb2ZzOjpDb250YWluZXJEZWYsIGRlc2NyaXB0b3IpOworfQorCitQeU9iamVjdCogTmV3TWVzc2FnZU9uZW9mc1NlcShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld1NlcXVlbmNlKCZvbmVvZnM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZXNzYWdlX2Rlc2NyaXB0b3IKKworbmFtZXNwYWNlIGVudW1fZGVzY3JpcHRvciB7CisKK3R5cGVkZWYgY29uc3QgRW51bURlc2NyaXB0b3IqIFBhcmVudERlc2NyaXB0b3I7CisKK3N0YXRpYyBQYXJlbnREZXNjcmlwdG9yIEdldERlc2NyaXB0b3IoUHlDb250YWluZXIqIHNlbGYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UGFyZW50RGVzY3JpcHRvcj4oc2VsZi0+ZGVzY3JpcHRvcik7Cit9CisKK25hbWVzcGFjZSBlbnVtdmFsdWVzIHsKKwordHlwZWRlZiBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBJdGVtRGVzY3JpcHRvcjsKKworc3RhdGljIGludCBDb3VudChQeUNvbnRhaW5lciogc2VsZikgeworICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+dmFsdWVfY291bnQoKTsKK30KKworc3RhdGljIGNvbnN0IHZvaWQqIEdldEJ5SW5kZXgoUHlDb250YWluZXIqIHNlbGYsIGludCBpbmRleCkgeworICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+dmFsdWUoaW5kZXgpOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCogR2V0QnlOYW1lKFB5Q29udGFpbmVyKiBzZWxmLCBDb25zdFN0cmluZ1BhcmFtIG5hbWUpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPkZpbmRWYWx1ZUJ5TmFtZShuYW1lKTsKK30KKworc3RhdGljIGNvbnN0IHZvaWQqIEdldEJ5TnVtYmVyKFB5Q29udGFpbmVyKiBzZWxmLCBpbnQgbnVtYmVyKSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5GaW5kVmFsdWVCeU51bWJlcihudW1iZXIpOworfQorCitzdGF0aWMgUHlPYmplY3QqIE5ld09iamVjdEZyb21JdGVtKGNvbnN0IHZvaWQqIGl0ZW0pIHsKKyAgcmV0dXJuIFB5RW51bVZhbHVlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcigKKyAgICAgIHN0YXRpY19jYXN0PEl0ZW1EZXNjcmlwdG9yPihpdGVtKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyYgR2V0SXRlbU5hbWUoY29uc3Qgdm9pZCogaXRlbSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8SXRlbURlc2NyaXB0b3I+KGl0ZW0pLT5uYW1lKCk7Cit9CisKK3N0YXRpYyBpbnQgR2V0SXRlbU51bWJlcihjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSktPm51bWJlcigpOworfQorCitzdGF0aWMgaW50IEdldEl0ZW1JbmRleChjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSktPmluZGV4KCk7Cit9CisKK3N0YXRpYyBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIENvbnRhaW5lckRlZiA9IHsKKyAgICAiRW51bVZhbHVlcyIsIENvdW50LCAgICAgICAgIEdldEJ5SW5kZXgsICAgICAgICBHZXRCeU5hbWUsCisgICAgbnVsbHB0ciwgICAgICBHZXRCeU51bWJlciwgICBOZXdPYmplY3RGcm9tSXRlbSwgR2V0SXRlbU5hbWUsCisgICAgbnVsbHB0ciwgICAgICBHZXRJdGVtTnVtYmVyLCBHZXRJdGVtSW5kZXgsCit9OworCit9ICAvLyBuYW1lc3BhY2UgZW51bXZhbHVlcworCitQeU9iamVjdCogTmV3RW51bVZhbHVlc0J5TmFtZShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld01hcHBpbmdCeU5hbWUoJmVudW12YWx1ZXM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK1B5T2JqZWN0KiBOZXdFbnVtVmFsdWVzQnlOdW1iZXIoUGFyZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yOjpOZXdNYXBwaW5nQnlOdW1iZXIoJmVudW12YWx1ZXM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK1B5T2JqZWN0KiBOZXdFbnVtVmFsdWVzU2VxKFBhcmVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3U2VxdWVuY2UoJmVudW12YWx1ZXM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlbnVtX2Rlc2NyaXB0b3IKKworbmFtZXNwYWNlIG9uZW9mX2Rlc2NyaXB0b3IgeworCit0eXBlZGVmIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogUGFyZW50RGVzY3JpcHRvcjsKKworc3RhdGljIFBhcmVudERlc2NyaXB0b3IgR2V0RGVzY3JpcHRvcihQeUNvbnRhaW5lciogc2VsZikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQYXJlbnREZXNjcmlwdG9yPihzZWxmLT5kZXNjcmlwdG9yKTsKK30KKworbmFtZXNwYWNlIGZpZWxkcyB7CisKK3R5cGVkZWYgY29uc3QgRmllbGREZXNjcmlwdG9yKiBJdGVtRGVzY3JpcHRvcjsKKworc3RhdGljIGludCBDb3VudChQeUNvbnRhaW5lciogc2VsZikgeworICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+ZmllbGRfY291bnQoKTsKK30KKworc3RhdGljIGNvbnN0IHZvaWQqIEdldEJ5SW5kZXgoUHlDb250YWluZXIqIHNlbGYsIGludCBpbmRleCkgeworICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+ZmllbGQoaW5kZXgpOworfQorCitzdGF0aWMgUHlPYmplY3QqIE5ld09iamVjdEZyb21JdGVtKGNvbnN0IHZvaWQqIGl0ZW0pIHsKKyAgcmV0dXJuIFB5RmllbGREZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKHN0YXRpY19jYXN0PEl0ZW1EZXNjcmlwdG9yPihpdGVtKSk7Cit9CisKK3N0YXRpYyBpbnQgR2V0SXRlbUluZGV4KGNvbnN0IHZvaWQqIGl0ZW0pIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEl0ZW1EZXNjcmlwdG9yPihpdGVtKS0+aW5kZXhfaW5fb25lb2YoKTsKK30KKworc3RhdGljIERlc2NyaXB0b3JDb250YWluZXJEZWYgQ29udGFpbmVyRGVmID0geworICAgICJPbmVvZkZpZWxkcyIsICAgICBDb3VudCwgICBHZXRCeUluZGV4LCBudWxscHRyLCBudWxscHRyLCAgICAgIG51bGxwdHIsCisgICAgTmV3T2JqZWN0RnJvbUl0ZW0sIG51bGxwdHIsIG51bGxwdHIsICAgIG51bGxwdHIsIEdldEl0ZW1JbmRleCwKK307CisKK30gIC8vIG5hbWVzcGFjZSBmaWVsZHMKKworUHlPYmplY3QqIE5ld09uZW9mRmllbGRzU2VxKFBhcmVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3U2VxdWVuY2UoJmZpZWxkczo6Q29udGFpbmVyRGVmLCBkZXNjcmlwdG9yKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG9uZW9mX2Rlc2NyaXB0b3IKKworbmFtZXNwYWNlIHNlcnZpY2VfZGVzY3JpcHRvciB7CisKK3R5cGVkZWYgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIFBhcmVudERlc2NyaXB0b3I7CisKK3N0YXRpYyBQYXJlbnREZXNjcmlwdG9yIEdldERlc2NyaXB0b3IoUHlDb250YWluZXIqIHNlbGYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UGFyZW50RGVzY3JpcHRvcj4oc2VsZi0+ZGVzY3JpcHRvcik7Cit9CisKK25hbWVzcGFjZSBtZXRob2RzIHsKKwordHlwZWRlZiBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBJdGVtRGVzY3JpcHRvcjsKKworc3RhdGljIGludCBDb3VudChQeUNvbnRhaW5lciogc2VsZikgeworICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+bWV0aG9kX2NvdW50KCk7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkKiBHZXRCeU5hbWUoUHlDb250YWluZXIqIHNlbGYsIENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgeworICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+RmluZE1ldGhvZEJ5TmFtZShuYW1lKTsKK30KKworc3RhdGljIGNvbnN0IHZvaWQqIEdldEJ5SW5kZXgoUHlDb250YWluZXIqIHNlbGYsIGludCBpbmRleCkgeworICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+bWV0aG9kKGluZGV4KTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBOZXdPYmplY3RGcm9tSXRlbShjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBQeU1ldGhvZERlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3Ioc3RhdGljX2Nhc3Q8SXRlbURlc2NyaXB0b3I+KGl0ZW0pKTsKK30KKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRJdGVtTmFtZShjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSktPm5hbWUoKTsKK30KKworc3RhdGljIGludCBHZXRJdGVtSW5kZXgoY29uc3Qgdm9pZCogaXRlbSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8SXRlbURlc2NyaXB0b3I+KGl0ZW0pLT5pbmRleCgpOworfQorCitzdGF0aWMgRGVzY3JpcHRvckNvbnRhaW5lckRlZiBDb250YWluZXJEZWYgPSB7CisgICAgIlNlcnZpY2VNZXRob2RzIiwgQ291bnQsICAgR2V0QnlJbmRleCwgICAgICAgIEdldEJ5TmFtZSwKKyAgICBudWxscHRyLCAgICAgICAgICBudWxscHRyLCBOZXdPYmplY3RGcm9tSXRlbSwgR2V0SXRlbU5hbWUsCisgICAgbnVsbHB0ciwgICAgICAgICAgbnVsbHB0ciwgR2V0SXRlbUluZGV4LAorfTsKKworfSAgLy8gbmFtZXNwYWNlIG1ldGhvZHMKKworUHlPYmplY3QqIE5ld1NlcnZpY2VNZXRob2RzU2VxKFBhcmVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3U2VxdWVuY2UoJm1ldGhvZHM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK1B5T2JqZWN0KiBOZXdTZXJ2aWNlTWV0aG9kc0J5TmFtZShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld01hcHBpbmdCeU5hbWUoJm1ldGhvZHM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzZXJ2aWNlX2Rlc2NyaXB0b3IKKworbmFtZXNwYWNlIGZpbGVfZGVzY3JpcHRvciB7CisKK3R5cGVkZWYgY29uc3QgRmlsZURlc2NyaXB0b3IqIFBhcmVudERlc2NyaXB0b3I7CisKK3N0YXRpYyBQYXJlbnREZXNjcmlwdG9yIEdldERlc2NyaXB0b3IoUHlDb250YWluZXIqIHNlbGYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UGFyZW50RGVzY3JpcHRvcj4oc2VsZi0+ZGVzY3JpcHRvcik7Cit9CisKK25hbWVzcGFjZSBtZXNzYWdlcyB7CisKK3R5cGVkZWYgY29uc3QgRGVzY3JpcHRvciogSXRlbURlc2NyaXB0b3I7CisKK3N0YXRpYyBpbnQgQ291bnQoUHlDb250YWluZXIqIHNlbGYpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPm1lc3NhZ2VfdHlwZV9jb3VudCgpOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCogR2V0QnlOYW1lKFB5Q29udGFpbmVyKiBzZWxmLCBDb25zdFN0cmluZ1BhcmFtIG5hbWUpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShuYW1lKTsKK30KKworc3RhdGljIGNvbnN0IHZvaWQqIEdldEJ5SW5kZXgoUHlDb250YWluZXIqIHNlbGYsIGludCBpbmRleCkgeworICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+bWVzc2FnZV90eXBlKGluZGV4KTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBOZXdPYmplY3RGcm9tSXRlbShjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBQeU1lc3NhZ2VEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKHN0YXRpY19jYXN0PEl0ZW1EZXNjcmlwdG9yPihpdGVtKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyYgR2V0SXRlbU5hbWUoY29uc3Qgdm9pZCogaXRlbSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8SXRlbURlc2NyaXB0b3I+KGl0ZW0pLT5uYW1lKCk7Cit9CisKK3N0YXRpYyBpbnQgR2V0SXRlbUluZGV4KGNvbnN0IHZvaWQqIGl0ZW0pIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEl0ZW1EZXNjcmlwdG9yPihpdGVtKS0+aW5kZXgoKTsKK30KKworc3RhdGljIERlc2NyaXB0b3JDb250YWluZXJEZWYgQ29udGFpbmVyRGVmID0geworICAgICJGaWxlTWVzc2FnZXMiLCBDb3VudCwgICBHZXRCeUluZGV4LCAgICAgICAgR2V0QnlOYW1lLAorICAgIG51bGxwdHIsICAgICAgICBudWxscHRyLCBOZXdPYmplY3RGcm9tSXRlbSwgR2V0SXRlbU5hbWUsCisgICAgbnVsbHB0ciwgICAgICAgIG51bGxwdHIsIEdldEl0ZW1JbmRleCwKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZXNzYWdlcworCitQeU9iamVjdCogTmV3RmlsZU1lc3NhZ2VUeXBlc0J5TmFtZShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld01hcHBpbmdCeU5hbWUoJm1lc3NhZ2VzOjpDb250YWluZXJEZWYsIGRlc2NyaXB0b3IpOworfQorCituYW1lc3BhY2UgZW51bXMgeworCit0eXBlZGVmIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBJdGVtRGVzY3JpcHRvcjsKKworc3RhdGljIGludCBDb3VudChQeUNvbnRhaW5lciogc2VsZikgeworICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+ZW51bV90eXBlX2NvdW50KCk7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkKiBHZXRCeU5hbWUoUHlDb250YWluZXIqIHNlbGYsIENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgeworICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+RmluZEVudW1UeXBlQnlOYW1lKG5hbWUpOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCogR2V0QnlJbmRleChQeUNvbnRhaW5lciogc2VsZiwgaW50IGluZGV4KSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5lbnVtX3R5cGUoaW5kZXgpOworfQorCitzdGF0aWMgUHlPYmplY3QqIE5ld09iamVjdEZyb21JdGVtKGNvbnN0IHZvaWQqIGl0ZW0pIHsKKyAgcmV0dXJuIFB5RW51bURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3Ioc3RhdGljX2Nhc3Q8SXRlbURlc2NyaXB0b3I+KGl0ZW0pKTsKK30KKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRJdGVtTmFtZShjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSktPm5hbWUoKTsKK30KKworc3RhdGljIGludCBHZXRJdGVtSW5kZXgoY29uc3Qgdm9pZCogaXRlbSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8SXRlbURlc2NyaXB0b3I+KGl0ZW0pLT5pbmRleCgpOworfQorCitzdGF0aWMgRGVzY3JpcHRvckNvbnRhaW5lckRlZiBDb250YWluZXJEZWYgPSB7CisgICAgIkZpbGVFbnVtcyIsIENvdW50LCAgIEdldEJ5SW5kZXgsICAgICAgICBHZXRCeU5hbWUsCisgICAgbnVsbHB0ciwgICAgIG51bGxwdHIsIE5ld09iamVjdEZyb21JdGVtLCBHZXRJdGVtTmFtZSwKKyAgICBudWxscHRyLCAgICAgbnVsbHB0ciwgR2V0SXRlbUluZGV4LAorfTsKKworfSAgLy8gbmFtZXNwYWNlIGVudW1zCisKK1B5T2JqZWN0KiBOZXdGaWxlRW51bVR5cGVzQnlOYW1lKFBhcmVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3TWFwcGluZ0J5TmFtZSgmZW51bXM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK25hbWVzcGFjZSBleHRlbnNpb25zIHsKKwordHlwZWRlZiBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEl0ZW1EZXNjcmlwdG9yOworCitzdGF0aWMgaW50IENvdW50KFB5Q29udGFpbmVyKiBzZWxmKSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5leHRlbnNpb25fY291bnQoKTsKK30KKworc3RhdGljIGNvbnN0IHZvaWQqIEdldEJ5TmFtZShQeUNvbnRhaW5lciogc2VsZiwgQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKG5hbWUpOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCogR2V0QnlJbmRleChQeUNvbnRhaW5lciogc2VsZiwgaW50IGluZGV4KSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5leHRlbnNpb24oaW5kZXgpOworfQorCitzdGF0aWMgUHlPYmplY3QqIE5ld09iamVjdEZyb21JdGVtKGNvbnN0IHZvaWQqIGl0ZW0pIHsKKyAgcmV0dXJuIFB5RmllbGREZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKHN0YXRpY19jYXN0PEl0ZW1EZXNjcmlwdG9yPihpdGVtKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyYgR2V0SXRlbU5hbWUoY29uc3Qgdm9pZCogaXRlbSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8SXRlbURlc2NyaXB0b3I+KGl0ZW0pLT5uYW1lKCk7Cit9CisKK3N0YXRpYyBpbnQgR2V0SXRlbUluZGV4KGNvbnN0IHZvaWQqIGl0ZW0pIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEl0ZW1EZXNjcmlwdG9yPihpdGVtKS0+aW5kZXgoKTsKK30KKworc3RhdGljIERlc2NyaXB0b3JDb250YWluZXJEZWYgQ29udGFpbmVyRGVmID0geworICAgICJGaWxlRXh0ZW5zaW9ucyIsIENvdW50LCAgIEdldEJ5SW5kZXgsICAgICAgICBHZXRCeU5hbWUsCisgICAgbnVsbHB0ciwgICAgICAgICAgbnVsbHB0ciwgTmV3T2JqZWN0RnJvbUl0ZW0sIEdldEl0ZW1OYW1lLAorICAgIG51bGxwdHIsICAgICAgICAgIG51bGxwdHIsIEdldEl0ZW1JbmRleCwKK307CisKK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb25zCisKK1B5T2JqZWN0KiBOZXdGaWxlRXh0ZW5zaW9uc0J5TmFtZShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld01hcHBpbmdCeU5hbWUoJmV4dGVuc2lvbnM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK25hbWVzcGFjZSBzZXJ2aWNlcyB7CisKK3R5cGVkZWYgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIEl0ZW1EZXNjcmlwdG9yOworCitzdGF0aWMgaW50IENvdW50KFB5Q29udGFpbmVyKiBzZWxmKSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5zZXJ2aWNlX2NvdW50KCk7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkKiBHZXRCeU5hbWUoUHlDb250YWluZXIqIHNlbGYsIENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgeworICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+RmluZFNlcnZpY2VCeU5hbWUobmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkKiBHZXRCeUluZGV4KFB5Q29udGFpbmVyKiBzZWxmLCBpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPnNlcnZpY2UoaW5kZXgpOworfQorCitzdGF0aWMgUHlPYmplY3QqIE5ld09iamVjdEZyb21JdGVtKGNvbnN0IHZvaWQqIGl0ZW0pIHsKKyAgcmV0dXJuIFB5U2VydmljZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3Ioc3RhdGljX2Nhc3Q8SXRlbURlc2NyaXB0b3I+KGl0ZW0pKTsKK30KKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRJdGVtTmFtZShjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSktPm5hbWUoKTsKK30KKworc3RhdGljIGludCBHZXRJdGVtSW5kZXgoY29uc3Qgdm9pZCogaXRlbSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8SXRlbURlc2NyaXB0b3I+KGl0ZW0pLT5pbmRleCgpOworfQorCitzdGF0aWMgRGVzY3JpcHRvckNvbnRhaW5lckRlZiBDb250YWluZXJEZWYgPSB7CisgICAgIkZpbGVTZXJ2aWNlcyIsIENvdW50LCAgIEdldEJ5SW5kZXgsICAgICAgICBHZXRCeU5hbWUsCisgICAgbnVsbHB0ciwgICAgICAgIG51bGxwdHIsIE5ld09iamVjdEZyb21JdGVtLCBHZXRJdGVtTmFtZSwKKyAgICBudWxscHRyLCAgICAgICAgbnVsbHB0ciwgR2V0SXRlbUluZGV4LAorfTsKKworfSAgLy8gbmFtZXNwYWNlIHNlcnZpY2VzCisKK1B5T2JqZWN0KiBOZXdGaWxlU2VydmljZXNCeU5hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld01hcHBpbmdCeU5hbWUoJnNlcnZpY2VzOjpDb250YWluZXJEZWYsIGRlc2NyaXB0b3IpOworfQorCituYW1lc3BhY2UgZGVwZW5kZW5jaWVzIHsKKwordHlwZWRlZiBjb25zdCBGaWxlRGVzY3JpcHRvciogSXRlbURlc2NyaXB0b3I7CisKK3N0YXRpYyBpbnQgQ291bnQoUHlDb250YWluZXIqIHNlbGYpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPmRlcGVuZGVuY3lfY291bnQoKTsKK30KKworc3RhdGljIGNvbnN0IHZvaWQqIEdldEJ5SW5kZXgoUHlDb250YWluZXIqIHNlbGYsIGludCBpbmRleCkgeworICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+ZGVwZW5kZW5jeShpbmRleCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogTmV3T2JqZWN0RnJvbUl0ZW0oY29uc3Qgdm9pZCogaXRlbSkgeworICByZXR1cm4gUHlGaWxlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihzdGF0aWNfY2FzdDxJdGVtRGVzY3JpcHRvcj4oaXRlbSkpOworfQorCitzdGF0aWMgRGVzY3JpcHRvckNvbnRhaW5lckRlZiBDb250YWluZXJEZWYgPSB7CisgICAgIkZpbGVEZXBlbmRlbmNpZXMiLCBDb3VudCwgICBHZXRCeUluZGV4LCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLAorICAgIE5ld09iamVjdEZyb21JdGVtLCAgbnVsbHB0ciwgbnVsbHB0ciwgICAgbnVsbHB0ciwgbnVsbHB0ciwKK307CisKK30gIC8vIG5hbWVzcGFjZSBkZXBlbmRlbmNpZXMKKworUHlPYmplY3QqIE5ld0ZpbGVEZXBlbmRlbmNpZXMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld1NlcXVlbmNlKCZkZXBlbmRlbmNpZXM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Cit9CisKK25hbWVzcGFjZSBwdWJsaWNfZGVwZW5kZW5jaWVzIHsKKwordHlwZWRlZiBjb25zdCBGaWxlRGVzY3JpcHRvciogSXRlbURlc2NyaXB0b3I7CisKK3N0YXRpYyBpbnQgQ291bnQoUHlDb250YWluZXIqIHNlbGYpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPnB1YmxpY19kZXBlbmRlbmN5X2NvdW50KCk7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkKiBHZXRCeUluZGV4KFB5Q29udGFpbmVyKiBzZWxmLCBpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPnB1YmxpY19kZXBlbmRlbmN5KGluZGV4KTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBOZXdPYmplY3RGcm9tSXRlbShjb25zdCB2b2lkKiBpdGVtKSB7CisgIHJldHVybiBQeUZpbGVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKHN0YXRpY19jYXN0PEl0ZW1EZXNjcmlwdG9yPihpdGVtKSk7Cit9CisKK3N0YXRpYyBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIENvbnRhaW5lckRlZiA9IHsKKyAgICAiRmlsZVB1YmxpY0RlcGVuZGVuY2llcyIsIENvdW50LCAgIEdldEJ5SW5kZXgsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsCisgICAgTmV3T2JqZWN0RnJvbUl0ZW0sICAgICAgICBudWxscHRyLCBudWxscHRyLCAgICBudWxscHRyLCBudWxscHRyLAorfTsKKworfSAgLy8gbmFtZXNwYWNlIHB1YmxpY19kZXBlbmRlbmNpZXMKKworUHlPYmplY3QqIE5ld0ZpbGVQdWJsaWNEZXBlbmRlbmNpZXMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld1NlcXVlbmNlKCZwdWJsaWNfZGVwZW5kZW5jaWVzOjpDb250YWluZXJEZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZpbGVfZGVzY3JpcHRvcgorCisKKy8vIFJlZ2lzdGVyIGFsbCBpbXBsZW1lbnRhdGlvbnMKKworYm9vbCBJbml0RGVzY3JpcHRvck1hcHBpbmdUeXBlcygpIHsKKyAgaWYgKFB5VHlwZV9SZWFkeSgmZGVzY3JpcHRvcjo6RGVzY3JpcHRvck1hcHBpbmdfVHlwZSkgPCAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKFB5VHlwZV9SZWFkeSgmZGVzY3JpcHRvcjo6RGVzY3JpcHRvclNlcXVlbmNlX1R5cGUpIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChQeVR5cGVfUmVhZHkoJmRlc2NyaXB0b3I6OkNvbnRhaW5lckl0ZXJhdG9yX1R5cGUpIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9jb250YWluZXJzLmggYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfY29udGFpbmVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMmNmNGEKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfY29udGFpbmVycy5oCkBAIC0wLDAgKzEsMTEwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9ERVNDUklQVE9SX0NPTlRBSU5FUlNfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX0RFU0NSSVBUT1JfQ09OVEFJTkVSU19IX18KKworLy8gTWFwcGluZ3MgYW5kIFNlcXVlbmNlcyBvZiBkZXNjcmlwdG9ycy4KKy8vIFRoZXkgaW1wbGVtZW50IGNvbnRhaW5lcnMgbGlrZSBmaWVsZHNfYnlfbmFtZSwgRW51bURlc2NyaXB0b3IudmFsdWVzLi4uCisvLyBTZWUgZGVzY3JpcHRvcl9jb250YWluZXJzLmNjIGZvciBtb3JlIGRlc2NyaXB0aW9uLgorI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCisjaW5jbHVkZSA8UHl0aG9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgRGVzY3JpcHRvcjsKK2NsYXNzIEZpbGVEZXNjcmlwdG9yOworY2xhc3MgRW51bURlc2NyaXB0b3I7CitjbGFzcyBPbmVvZkRlc2NyaXB0b3I7CitjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsKKworbmFtZXNwYWNlIHB5dGhvbiB7CisKKy8vIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgdHlwZXMgYW5kIG9iamVjdHMuCitib29sIEluaXREZXNjcmlwdG9yTWFwcGluZ1R5cGVzKCk7CisKKy8vIEVhY2ggZnVuY3Rpb24gYmVsb3cgcmV0dXJucyBhIE1hcHBpbmcsIG9yIGEgU2VxdWVuY2Ugb2YgZGVzY3JpcHRvcnMuCisvLyBUaGV5IGFsbCByZXR1cm4gYSBuZXcgcmVmZXJlbmNlLgorCituYW1lc3BhY2UgbWVzc2FnZV9kZXNjcmlwdG9yIHsKK1B5T2JqZWN0KiBOZXdNZXNzYWdlRmllbGRzQnlOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworUHlPYmplY3QqIE5ld01lc3NhZ2VGaWVsZHNCeUNhbWVsY2FzZU5hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CitQeU9iamVjdCogTmV3TWVzc2FnZUZpZWxkc0J5TnVtYmVyKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworUHlPYmplY3QqIE5ld01lc3NhZ2VGaWVsZHNTZXEoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKK1B5T2JqZWN0KiBOZXdNZXNzYWdlTmVzdGVkVHlwZXNTZXEoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CitQeU9iamVjdCogTmV3TWVzc2FnZU5lc3RlZFR5cGVzQnlOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCitQeU9iamVjdCogTmV3TWVzc2FnZUVudW1zQnlOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworUHlPYmplY3QqIE5ld01lc3NhZ2VFbnVtc1NlcShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKK1B5T2JqZWN0KiBOZXdNZXNzYWdlRW51bVZhbHVlc0J5TmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKworUHlPYmplY3QqIE5ld01lc3NhZ2VFeHRlbnNpb25zQnlOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworUHlPYmplY3QqIE5ld01lc3NhZ2VFeHRlbnNpb25zU2VxKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCitQeU9iamVjdCogTmV3TWVzc2FnZU9uZW9mc0J5TmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKK1B5T2JqZWN0KiBOZXdNZXNzYWdlT25lb2ZzU2VxKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworfSAgLy8gbmFtZXNwYWNlIG1lc3NhZ2VfZGVzY3JpcHRvcgorCituYW1lc3BhY2UgZW51bV9kZXNjcmlwdG9yIHsKK1B5T2JqZWN0KiBOZXdFbnVtVmFsdWVzQnlOYW1lKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKK1B5T2JqZWN0KiBOZXdFbnVtVmFsdWVzQnlOdW1iZXIoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworUHlPYmplY3QqIE5ld0VudW1WYWx1ZXNTZXEoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworfSAgLy8gbmFtZXNwYWNlIGVudW1fZGVzY3JpcHRvcgorCituYW1lc3BhY2Ugb25lb2ZfZGVzY3JpcHRvciB7CitQeU9iamVjdCogTmV3T25lb2ZGaWVsZHNTZXEoY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKK30gIC8vIG5hbWVzcGFjZSBvbmVvZl9kZXNjcmlwdG9yCisKK25hbWVzcGFjZSBmaWxlX2Rlc2NyaXB0b3IgeworUHlPYmplY3QqIE5ld0ZpbGVNZXNzYWdlVHlwZXNCeU5hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCitQeU9iamVjdCogTmV3RmlsZUVudW1UeXBlc0J5TmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKK1B5T2JqZWN0KiBOZXdGaWxlRXh0ZW5zaW9uc0J5TmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKK1B5T2JqZWN0KiBOZXdGaWxlU2VydmljZXNCeU5hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCitQeU9iamVjdCogTmV3RmlsZURlcGVuZGVuY2llcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CitQeU9iamVjdCogTmV3RmlsZVB1YmxpY0RlcGVuZGVuY2llcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Cit9ICAvLyBuYW1lc3BhY2UgZmlsZV9kZXNjcmlwdG9yCisKK25hbWVzcGFjZSBzZXJ2aWNlX2Rlc2NyaXB0b3IgeworUHlPYmplY3QqIE5ld1NlcnZpY2VNZXRob2RzU2VxKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKK1B5T2JqZWN0KiBOZXdTZXJ2aWNlTWV0aG9kc0J5TmFtZShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Cit9ICAvLyBuYW1lc3BhY2Ugc2VydmljZV9kZXNjcmlwdG9yCisKKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfREVTQ1JJUFRPUl9DT05UQUlORVJTX0hfXwpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yX2RhdGFiYXNlLmNjIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yX2RhdGFiYXNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4N2YyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MKQEAgLTAsMCArMSwxODcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIEMrKyBEZXNjcmlwdG9yRGF0YWJhc2UsIHdoaWNoIHdyYXBzIGEgUHl0aG9uIERhdGFiYXNlCisvLyBhbmQgZGVsZWdhdGUgYWxsIGl0cyBvcGVyYXRpb25zIHRvIFB5dGhvbiBtZXRob2RzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfZGF0YWJhc2UuaD4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3Njb3BlZF9weW9iamVjdF9wdHIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHB5dGhvbiB7CisKK1B5RGVzY3JpcHRvckRhdGFiYXNlOjpQeURlc2NyaXB0b3JEYXRhYmFzZShQeU9iamVjdCogcHlfZGF0YWJhc2UpCisgICAgOiBweV9kYXRhYmFzZV8ocHlfZGF0YWJhc2UpIHsKKyAgUHlfSU5DUkVGKHB5X2RhdGFiYXNlXyk7Cit9CisKK1B5RGVzY3JpcHRvckRhdGFiYXNlOjp+UHlEZXNjcmlwdG9yRGF0YWJhc2UoKSB7IFB5X0RFQ1JFRihweV9kYXRhYmFzZV8pOyB9CisKKy8vIENvbnZlcnQgYSBQeXRob24gb2JqZWN0IHRvIGEgRmlsZURlc2NyaXB0b3JQcm90byBwb2ludGVyLgorLy8gSGFuZGxlcyBhbGwga2luZHMgb2YgUHl0aG9uIGVycm9ycywgd2hpY2ggYXJlIHNpbXBseSBsb2dnZWQuCitzdGF0aWMgYm9vbCBHZXRGaWxlRGVzY3JpcHRvclByb3RvKFB5T2JqZWN0KiBweV9kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgaWYgKHB5X2Rlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkgeworICAgICAgLy8gRXhwZWN0ZWQgZXJyb3I6IGl0ZW0gd2FzIHNpbXBseSBub3QgZm91bmQuCisgICAgICBQeUVycl9DbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRGVzY3JpcHRvckRhdGFiYXNlIG1ldGhvZCByYWlzZWQgYW4gZXJyb3IiOworICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChweV9kZXNjcmlwdG9yID09IFB5X05vbmUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgRGVzY3JpcHRvciogZmlsZWRlc2NyaXB0b3JfZGVzY3JpcHRvciA9CisgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkuR2V0RGVzY3JpcHRvcigpOworICBDTWVzc2FnZSogbWVzc2FnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPihweV9kZXNjcmlwdG9yKTsKKyAgaWYgKFB5T2JqZWN0X1R5cGVDaGVjayhweV9kZXNjcmlwdG9yLCBDTWVzc2FnZV9UeXBlKSAmJgorICAgICAgbWVzc2FnZS0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpID09IGZpbGVkZXNjcmlwdG9yX2Rlc2NyaXB0b3IpIHsKKyAgICAvLyBGYXN0IHBhdGg6IEp1c3QgdXNlIHRoZSBwb2ludGVyLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGVfcHJvdG8gPQorICAgICAgICBzdGF0aWNfY2FzdDxGaWxlRGVzY3JpcHRvclByb3RvKj4obWVzc2FnZS0+bWVzc2FnZSk7CisgICAgKm91dHB1dCA9ICpmaWxlX3Byb3RvOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIC8vIFNsb3cgcGF0aDogc2VyaWFsaXplIHRoZSBtZXNzYWdlLiBUaGlzIGFsbG93cyB0byB1c2UgZGF0YWJhc2VzIHdoaWNoCisgICAgLy8gdXNlIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIG9mIEZpbGVEZXNjcmlwdG9yUHJvdG8uCisgICAgU2NvcGVkUHlPYmplY3RQdHIgc2VyaWFsaXplZF9wYigKKyAgICAgICAgUHlPYmplY3RfQ2FsbE1ldGhvZChweV9kZXNjcmlwdG9yLCAiU2VyaWFsaXplVG9TdHJpbmciLCBudWxscHRyKSk7CisgICAgaWYgKHNlcmlhbGl6ZWRfcGIgPT0gbnVsbHB0cikgeworICAgICAgR09PR0xFX0xPRyhFUlJPUikKKyAgICAgICAgICA8PCAiRGVzY3JpcHRvckRhdGFiYXNlIG1ldGhvZCBkaWQgbm90IHJldHVybiBhIEZpbGVEZXNjcmlwdG9yUHJvdG8iOworICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY2hhciogc3RyOworICAgIFB5X3NzaXplX3QgbGVuOworICAgIGlmIChQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZShzZXJpYWxpemVkX3BiLmdldCgpLCAmc3RyLCAmbGVuKSA8IDApIHsKKyAgICAgIEdPT0dMRV9MT0coRVJST1IpCisgICAgICAgICAgPDwgIkRlc2NyaXB0b3JEYXRhYmFzZSBtZXRob2QgZGlkIG5vdCByZXR1cm4gYSBGaWxlRGVzY3JpcHRvclByb3RvIjsKKyAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgICBpZiAoIWZpbGVfcHJvdG8uUGFyc2VGcm9tQXJyYXkoc3RyLCBsZW4pKSB7CisgICAgICBHT09HTEVfTE9HKEVSUk9SKQorICAgICAgICAgIDw8ICJEZXNjcmlwdG9yRGF0YWJhc2UgbWV0aG9kIGRpZCBub3QgcmV0dXJuIGEgRmlsZURlc2NyaXB0b3JQcm90byI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICpvdXRwdXQgPSBmaWxlX3Byb3RvOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKKy8vIEZpbmQgYSBmaWxlIGJ5IGZpbGUgbmFtZS4KK2Jvb2wgUHlEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICBTY29wZWRQeU9iamVjdFB0ciBweV9kZXNjcmlwdG9yKFB5T2JqZWN0X0NhbGxNZXRob2QoCisgICAgICBweV9kYXRhYmFzZV8sICJGaW5kRmlsZUJ5TmFtZSIsICJzIyIsIGZpbGVuYW1lLmNfc3RyKCksIGZpbGVuYW1lLnNpemUoKSkpOworICByZXR1cm4gR2V0RmlsZURlc2NyaXB0b3JQcm90byhweV9kZXNjcmlwdG9yLmdldCgpLCBvdXRwdXQpOworfQorCisvLyBGaW5kIHRoZSBmaWxlIHRoYXQgZGVjbGFyZXMgdGhlIGdpdmVuIGZ1bGx5LXF1YWxpZmllZCBzeW1ib2wgbmFtZS4KK2Jvb2wgUHlEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9sX25hbWUsIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICBTY29wZWRQeU9iamVjdFB0ciBweV9kZXNjcmlwdG9yKAorICAgICAgUHlPYmplY3RfQ2FsbE1ldGhvZChweV9kYXRhYmFzZV8sICJGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2wiLCAicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfbmFtZS5jX3N0cigpLCBzeW1ib2xfbmFtZS5zaXplKCkpKTsKKyAgcmV0dXJuIEdldEZpbGVEZXNjcmlwdG9yUHJvdG8ocHlfZGVzY3JpcHRvci5nZXQoKSwgb3V0cHV0KTsKK30KKworLy8gRmluZCB0aGUgZmlsZSB3aGljaCBkZWZpbmVzIGFuIGV4dGVuc2lvbiBleHRlbmRpbmcgdGhlIGdpdmVuIG1lc3NhZ2UgdHlwZQorLy8gd2l0aCB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyLgorLy8gUHl0aG9uIERlc2NyaXB0b3JEYXRhYmFzZXMgYXJlIG5vdCByZXF1aXJlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCitib29sIFB5RGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwgaW50IGZpZWxkX251bWJlciwKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgU2NvcGVkUHlPYmplY3RQdHIgcHlfbWV0aG9kKAorICAgICAgUHlPYmplY3RfR2V0QXR0clN0cmluZyhweV9kYXRhYmFzZV8sICJGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24iKSk7CisgIGlmIChweV9tZXRob2QgPT0gbnVsbHB0cikgeworICAgIC8vIFRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJucyB3aXRob3V0IGVycm9yLgorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFNjb3BlZFB5T2JqZWN0UHRyIHB5X2Rlc2NyaXB0b3IoCisgICAgICBQeU9iamVjdF9DYWxsRnVuY3Rpb24ocHlfbWV0aG9kLmdldCgpLCAicyNpIiwgY29udGFpbmluZ190eXBlLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlLnNpemUoKSwgZmllbGRfbnVtYmVyKSk7CisgIHJldHVybiBHZXRGaWxlRGVzY3JpcHRvclByb3RvKHB5X2Rlc2NyaXB0b3IuZ2V0KCksIG91dHB1dCk7Cit9CisKKy8vIEZpbmRzIHRoZSB0YWcgbnVtYmVycyB1c2VkIGJ5IGFsbCBrbm93biBleHRlbnNpb25zIG9mCisvLyBjb250YWluaW5nX3R5cGUsIGFuZCBhcHBlbmRzIHRoZW0gdG8gb3V0cHV0IGluIGFuIHVuZGVmaW5lZAorLy8gb3JkZXIuCisvLyBQeXRob24gRGVzY3JpcHRvckRhdGFiYXNlcyBhcmUgbm90IHJlcXVpcmVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KK2Jvb2wgUHlEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250YWluaW5nX3R5cGUsIHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgeworICBTY29wZWRQeU9iamVjdFB0ciBweV9tZXRob2QoCisgICAgICBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHB5X2RhdGFiYXNlXywgIkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzIikpOworICBpZiAocHlfbWV0aG9kID09IG51bGxwdHIpIHsKKyAgICAvLyBUaGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQsIHJldHVybnMgd2l0aG91dCBlcnJvci4KKyAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBTY29wZWRQeU9iamVjdFB0ciBweV9saXN0KAorICAgICAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHB5X21ldGhvZC5nZXQoKSwgInMjIiwgY29udGFpbmluZ190eXBlLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlLnNpemUoKSkpOworICBpZiAocHlfbGlzdCA9PSBudWxscHRyKSB7CisgICAgUHlFcnJfUHJpbnQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgUHlfc3NpemVfdCBzaXplID0gUHlMaXN0X1NpemUocHlfbGlzdC5nZXQoKSk7CisgIGludDY0X3QgaXRlbV92YWx1ZTsKKyAgZm9yIChQeV9zc2l6ZV90IGkgPSAwIDsgaSA8IHNpemU7ICsraSkgeworICAgIFNjb3BlZFB5T2JqZWN0UHRyIGl0ZW0oUHlTZXF1ZW5jZV9HZXRJdGVtKHB5X2xpc3QuZ2V0KCksIGkpKTsKKyAgICBpdGVtX3ZhbHVlID0gUHlMb25nX0FzTG9uZyhpdGVtLmdldCgpKTsKKyAgICBpZiAoaXRlbV92YWx1ZSA8IDApIHsKKyAgICAgIEdPT0dMRV9MT0coRVJST1IpCisgICAgICAgICAgPDwgIkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzIG1ldGhvZCBkaWQgbm90IHJldHVybiAiCisgICAgICAgICAgPDwgInZhbGlkIGV4dGVuc2lvbiBudW1iZXJzLiI7CisgICAgICBQeUVycl9QcmludCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBvdXRwdXQtPnB1c2hfYmFjayhpdGVtX3ZhbHVlKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfZGF0YWJhc2UuaCBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9kYXRhYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjFhMjIKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfZGF0YWJhc2UuaApAQCAtMCwwICsxLDgzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9ERVNDUklQVE9SX0RBVEFCQVNFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9ERVNDUklQVE9SX0RBVEFCQVNFX0hfXworCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBweXRob24geworCitjbGFzcyBQeURlc2NyaXB0b3JEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUHlEZXNjcmlwdG9yRGF0YWJhc2UoUHlPYmplY3QqIHB5X2RhdGFiYXNlKTsKKyAgflB5RGVzY3JpcHRvckRhdGFiYXNlKCkgb3ZlcnJpZGU7CisKKyAgLy8gSW1wbGVtZW50IHRoZSBhYnN0cmFjdCBpbnRlcmZhY2UuIEFsbCB0aGVzZSBmdW5jdGlvbnMgZmlsbCB0aGUgb3V0cHV0CisgIC8vIHdpdGggYSBjb3B5IG9mIEZpbGVEZXNjcmlwdG9yUHJvdG8uCisKKyAgLy8gRmluZCBhIGZpbGUgYnkgZmlsZSBuYW1lLgorICBib29sIEZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIG92ZXJyaWRlOworCisgIC8vIEZpbmQgdGhlIGZpbGUgdGhhdCBkZWNsYXJlcyB0aGUgZ2l2ZW4gZnVsbHktcXVhbGlmaWVkIHN5bWJvbCBuYW1lLgorICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgb3ZlcnJpZGU7CisKKyAgLy8gRmluZCB0aGUgZmlsZSB3aGljaCBkZWZpbmVzIGFuIGV4dGVuc2lvbiBleHRlbmRpbmcgdGhlIGdpdmVuIG1lc3NhZ2UgdHlwZQorICAvLyB3aXRoIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCisgIC8vIENvbnRhaW5pbmdfdHlwZSBtdXN0IGJlIGEgZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZS4KKyAgLy8gUHl0aG9uIG9iamVjdHMgYXJlIG5vdCByZXF1aXJlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCisgIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgb3ZlcnJpZGU7CisKKyAgLy8gRmluZHMgdGhlIHRhZyBudW1iZXJzIHVzZWQgYnkgYWxsIGtub3duIGV4dGVuc2lvbnMgb2YKKyAgLy8gY29udGFpbmluZ190eXBlLCBhbmQgYXBwZW5kcyB0aGVtIHRvIG91dHB1dCBpbiBhbiB1bmRlZmluZWQKKyAgLy8gb3JkZXIuCisgIC8vIFB5dGhvbiBvYmplY3RzIGFyZSBub3QgcmVxdWlyZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLgorICBib29sIEZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50Piogb3V0cHV0KSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIC8vIFRoZSBweXRob24gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgZGF0YWJhc2UuIFRoZSByZWZlcmVuY2UgaXMgb3duZWQuCisgIFB5T2JqZWN0KiBweV9kYXRhYmFzZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9ERVNDUklQVE9SX0RBVEFCQVNFX0hfXwpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yX3Bvb2wuY2MgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfcG9vbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjM5MjgxCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yX3Bvb2wuY2MKQEAgLTAsMCArMSw4MTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBJbXBsZW1lbnRzIHRoZSBEZXNjcmlwdG9yUG9vbCwgd2hpY2ggY29sbGVjdHMgYWxsIGRlc2NyaXB0b3JzLgorCisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCisjaW5jbHVkZSA8UHl0aG9uLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfZGF0YWJhc2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9wb29sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZV9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3Njb3BlZF9weW9iamVjdF9wdHIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgorCisjZGVmaW5lIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShvYiwgY2hhcnBwLCBzaXplcCkgICAgICAgICAgICAgIFwKKyAgKFB5VW5pY29kZV9DaGVjayhvYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKCgqKGNoYXJwcCkgPSBjb25zdF9jYXN0PGNoYXIqPiggICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBQeVVuaWNvZGVfQXNVVEY4QW5kU2l6ZShvYiwgKHNpemVwKSkpKSA9PSBudWxscHRyIFwKKyAgICAgICAgICAgICAgPyAtMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICA6IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiBQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZShvYiwgKGNoYXJwcCksIChzaXplcCkpKQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgcHl0aG9uIHsKKworLy8gQSBtYXAgdG8gY2FjaGUgUHl0aG9uIFBvb2xzIHBlciBDKysgcG9pbnRlci4KKy8vIFBvaW50ZXJzIGFyZSBub3Qgb3duZWQgaGVyZSwgYW5kIGJlbG9uZyB0byB0aGUgUHlEZXNjcmlwdG9yUG9vbC4KK3N0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3QgRGVzY3JpcHRvclBvb2wqLCBQeURlc2NyaXB0b3JQb29sKj4qCisgICAgZGVzY3JpcHRvcl9wb29sX21hcDsKKworbmFtZXNwYWNlIGNkZXNjcmlwdG9yX3Bvb2wgeworCisvLyBDb2xsZWN0cyBlcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgcHJvdG8gZmlsZSBidWlsZGluZyB0byBhbGxvdyB0aGVtIHRvIGJlCisvLyBwcm9wYWdhdGVkIGluIHRoZSBweXRob24gZXhjZXB0aW9uIGluc3RlYWQgb2Ygb25seSBsaXZpbmcgaW4gRVJST1IgbG9ncy4KK2NsYXNzIEJ1aWxkRmlsZUVycm9yQ29sbGVjdG9yIDogcHVibGljIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciB7CisgcHVibGljOgorICBCdWlsZEZpbGVFcnJvckNvbGxlY3RvcigpIDogZXJyb3JfbWVzc2FnZSgiIiksIGhhZF9lcnJvcnNfKGZhbHNlKSB7fQorCisgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsIEVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIG92ZXJyaWRlIHsKKyAgICAvLyBSZXBsaWNhdGVzIHRoZSBsb2dnaW5nIGJlaGF2aW9yIHRoYXQgaGFwcGVucyBpbiB0aGUgQysrIGltcGxlbWVudGF0aW9uCisgICAgLy8gd2hlbiBhbiBlcnJvciBjb2xsZWN0b3IgaXMgbm90IHBhc3NlZCBpbi4KKyAgICBpZiAoIWhhZF9lcnJvcnNfKSB7CisgICAgICBlcnJvcl9tZXNzYWdlICs9CisgICAgICAgICAgKCJJbnZhbGlkIHByb3RvIGRlc2NyaXB0b3IgZm9yIGZpbGUgXCIiICsgZmlsZW5hbWUgKyAiXCI6XG4iKTsKKyAgICAgIGhhZF9lcnJvcnNfID0gdHJ1ZTsKKyAgICB9CisgICAgLy8gQXMgdGhpcyBvbmx5IGhhcHBlbnMgb24gZmFpbHVyZSBhbmQgd2lsbCByZXN1bHQgaW4gdGhlIHByb2dyYW0gbm90CisgICAgLy8gcnVubmluZyBhdCBhbGwsIG5vIGVmZm9ydCBpcyBtYWRlIHRvIG9wdGltaXplIHRoaXMgc3RyaW5nIG1hbmlwdWxhdGlvbi4KKyAgICBlcnJvcl9tZXNzYWdlICs9ICgiICAiICsgZWxlbWVudF9uYW1lICsgIjogIiArIG1lc3NhZ2UgKyAiXG4iKTsKKyAgfQorCisgIHZvaWQgQ2xlYXIoKSB7CisgICAgaGFkX2Vycm9yc18gPSBmYWxzZTsKKyAgICBlcnJvcl9tZXNzYWdlID0gIiI7CisgIH0KKworICBzdGQ6OnN0cmluZyBlcnJvcl9tZXNzYWdlOworCisgcHJpdmF0ZToKKyAgYm9vbCBoYWRfZXJyb3JzXzsKK307CisKKy8vIENyZWF0ZSBhIFB5dGhvbiBEZXNjcmlwdG9yUG9vbCBvYmplY3QsIGJ1dCBkb2VzIG5vdCBmaWxsIHRoZSAicG9vbCIKKy8vIGF0dHJpYnV0ZS4KK3N0YXRpYyBQeURlc2NyaXB0b3JQb29sKiBfQ3JlYXRlRGVzY3JpcHRvclBvb2woKSB7CisgIFB5RGVzY3JpcHRvclBvb2wqIGNwb29sID0gUHlPYmplY3RfR0NfTmV3KAorICAgICAgUHlEZXNjcmlwdG9yUG9vbCwgJlB5RGVzY3JpcHRvclBvb2xfVHlwZSk7CisgIGlmIChjcG9vbCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBjcG9vbC0+ZXJyb3JfY29sbGVjdG9yID0gbnVsbHB0cjsKKyAgY3Bvb2wtPnVuZGVybGF5ID0gbnVsbHB0cjsKKyAgY3Bvb2wtPmRhdGFiYXNlID0gbnVsbHB0cjsKKyAgY3Bvb2wtPmlzX293bmVkID0gZmFsc2U7CisgIGNwb29sLT5pc19tdXRhYmxlID0gZmFsc2U7CisKKyAgY3Bvb2wtPmRlc2NyaXB0b3Jfb3B0aW9ucyA9IG5ldyBzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3Qgdm9pZCosIFB5T2JqZWN0Kj4oKTsKKworICBjcG9vbC0+cHlfbWVzc2FnZV9mYWN0b3J5ID0gbWVzc2FnZV9mYWN0b3J5OjpOZXdNZXNzYWdlRmFjdG9yeSgKKyAgICAgICZQeU1lc3NhZ2VGYWN0b3J5X1R5cGUsIGNwb29sKTsKKyAgaWYgKGNwb29sLT5weV9tZXNzYWdlX2ZhY3RvcnkgPT0gbnVsbHB0cikgeworICAgIFB5X0RFQ1JFRihjcG9vbCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBQeU9iamVjdF9HQ19UcmFjayhjcG9vbCk7CisKKyAgcmV0dXJuIGNwb29sOworfQorCisvLyBDcmVhdGUgYSBQeXRob24gRGVzY3JpcHRvclBvb2wsIHVzaW5nIHRoZSBnaXZlbiBwb29sIGFzIGFuIHVuZGVybGF5OgorLy8gbmV3IG1lc3NhZ2VzIHdpbGwgYmUgYWRkZWQgdG8gYSBjdXN0b20gcG9vbCwgbm90IHRvIHRoZSB1bmRlcmxheS4KKy8vCisvLyBPd25lcnNoaXAgb2YgdGhlIHVuZGVybGF5IGlzIG5vdCB0cmFuc2ZlcnJlZCwgaXRzIHBvaW50ZXIgc2hvdWxkCisvLyBzdGF5IGFsaXZlLgorc3RhdGljIFB5RGVzY3JpcHRvclBvb2wqIFB5RGVzY3JpcHRvclBvb2xfTmV3V2l0aFVuZGVybGF5KAorICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiB1bmRlcmxheSkgeworICBQeURlc2NyaXB0b3JQb29sKiBjcG9vbCA9IF9DcmVhdGVEZXNjcmlwdG9yUG9vbCgpOworICBpZiAoY3Bvb2wgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGNwb29sLT5wb29sID0gbmV3IERlc2NyaXB0b3JQb29sKHVuZGVybGF5KTsKKyAgY3Bvb2wtPmlzX293bmVkID0gdHJ1ZTsKKyAgY3Bvb2wtPmlzX211dGFibGUgPSB0cnVlOworICBjcG9vbC0+dW5kZXJsYXkgPSB1bmRlcmxheTsKKworICBpZiAoIWRlc2NyaXB0b3JfcG9vbF9tYXAtPmluc2VydCgKKyAgICAgIHN0ZDo6bWFrZV9wYWlyKGNwb29sLT5wb29sLCBjcG9vbCkpLnNlY29uZCkgeworICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gLS0gd291bGQgaW5kaWNhdGUgYW4gaW50ZXJuYWwgZXJyb3IgLyBidWcuCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJEZXNjcmlwdG9yUG9vbCBhbHJlYWR5IHJlZ2lzdGVyZWQiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHJldHVybiBjcG9vbDsKK30KKworc3RhdGljIFB5RGVzY3JpcHRvclBvb2wqIFB5RGVzY3JpcHRvclBvb2xfTmV3V2l0aERhdGFiYXNlKAorICAgIERlc2NyaXB0b3JEYXRhYmFzZSogZGF0YWJhc2UpIHsKKyAgUHlEZXNjcmlwdG9yUG9vbCogY3Bvb2wgPSBfQ3JlYXRlRGVzY3JpcHRvclBvb2woKTsKKyAgaWYgKGNwb29sID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoZGF0YWJhc2UgIT0gbnVsbHB0cikgeworICAgIGNwb29sLT5lcnJvcl9jb2xsZWN0b3IgPSBuZXcgQnVpbGRGaWxlRXJyb3JDb2xsZWN0b3IoKTsKKyAgICBjcG9vbC0+cG9vbCA9IG5ldyBEZXNjcmlwdG9yUG9vbChkYXRhYmFzZSwgY3Bvb2wtPmVycm9yX2NvbGxlY3Rvcik7CisgICAgY3Bvb2wtPmlzX211dGFibGUgPSBmYWxzZTsKKyAgICBjcG9vbC0+ZGF0YWJhc2UgPSBkYXRhYmFzZTsKKyAgfSBlbHNlIHsKKyAgICBjcG9vbC0+cG9vbCA9IG5ldyBEZXNjcmlwdG9yUG9vbCgpOworICAgIGNwb29sLT5pc19tdXRhYmxlID0gdHJ1ZTsKKyAgfQorICBjcG9vbC0+aXNfb3duZWQgPSB0cnVlOworCisgIGlmICghZGVzY3JpcHRvcl9wb29sX21hcC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNwb29sLT5wb29sLCBjcG9vbCkpLnNlY29uZCkgeworICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gLS0gd291bGQgaW5kaWNhdGUgYW4gaW50ZXJuYWwgZXJyb3IgLyBidWcuCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJEZXNjcmlwdG9yUG9vbCBhbHJlYWR5IHJlZ2lzdGVyZWQiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHJldHVybiBjcG9vbDsKK30KKworLy8gVGhlIHB1YmxpYyBEZXNjcmlwdG9yUG9vbCBjb25zdHJ1Y3Rvci4KK3N0YXRpYyBQeU9iamVjdCogTmV3KFB5VHlwZU9iamVjdCogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBrd2xpc3RbXSA9IHsiZGVzY3JpcHRvcl9kYiIsIG51bGxwdHJ9OworICBQeU9iamVjdCogcHlfZGF0YWJhc2UgPSBudWxscHRyOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcioqPihrd2xpc3QpLCAmcHlfZGF0YWJhc2UpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgRGVzY3JpcHRvckRhdGFiYXNlKiBkYXRhYmFzZSA9IG51bGxwdHI7CisgIGlmIChweV9kYXRhYmFzZSAmJiBweV9kYXRhYmFzZSAhPSBQeV9Ob25lKSB7CisgICAgZGF0YWJhc2UgPSBuZXcgUHlEZXNjcmlwdG9yRGF0YWJhc2UocHlfZGF0YWJhc2UpOworICB9CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oCisgICAgICBQeURlc2NyaXB0b3JQb29sX05ld1dpdGhEYXRhYmFzZShkYXRhYmFzZSkpOworfQorCitzdGF0aWMgdm9pZCBEZWFsbG9jKFB5T2JqZWN0KiBwc2VsZikgeworICBQeURlc2NyaXB0b3JQb29sKiBzZWxmID0gcmVpbnRlcnByZXRfY2FzdDxQeURlc2NyaXB0b3JQb29sKj4ocHNlbGYpOworICBkZXNjcmlwdG9yX3Bvb2xfbWFwLT5lcmFzZShzZWxmLT5wb29sKTsKKyAgUHlfQ0xFQVIoc2VsZi0+cHlfbWVzc2FnZV9mYWN0b3J5KTsKKyAgZm9yIChzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3Qgdm9pZCosIFB5T2JqZWN0Kj46Oml0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgc2VsZi0+ZGVzY3JpcHRvcl9vcHRpb25zLT5iZWdpbigpOworICAgICAgIGl0ICE9IHNlbGYtPmRlc2NyaXB0b3Jfb3B0aW9ucy0+ZW5kKCk7ICsraXQpIHsKKyAgICBQeV9ERUNSRUYoaXQtPnNlY29uZCk7CisgIH0KKyAgZGVsZXRlIHNlbGYtPmRlc2NyaXB0b3Jfb3B0aW9uczsKKyAgZGVsZXRlIHNlbGYtPmRhdGFiYXNlOworICBpZiAoc2VsZi0+aXNfb3duZWQpIHsKKyAgICBkZWxldGUgc2VsZi0+cG9vbDsKKyAgfQorICBkZWxldGUgc2VsZi0+ZXJyb3JfY29sbGVjdG9yOworICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHBzZWxmKTsKK30KKworc3RhdGljIGludCBHY1RyYXZlcnNlKFB5T2JqZWN0KiBwc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkKiBhcmcpIHsKKyAgUHlEZXNjcmlwdG9yUG9vbCogc2VsZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlEZXNjcmlwdG9yUG9vbCo+KHBzZWxmKTsKKyAgUHlfVklTSVQoc2VsZi0+cHlfbWVzc2FnZV9mYWN0b3J5KTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgR2NDbGVhcihQeU9iamVjdCogcHNlbGYpIHsKKyAgUHlEZXNjcmlwdG9yUG9vbCogc2VsZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlEZXNjcmlwdG9yUG9vbCo+KHBzZWxmKTsKKyAgUHlfQ0xFQVIoc2VsZi0+cHlfbWVzc2FnZV9mYWN0b3J5KTsKKyAgcmV0dXJuIDA7Cit9CisKK1B5T2JqZWN0KiBTZXRFcnJvckZyb21Db2xsZWN0b3IoRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yKiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBlcnJvcl90eXBlKSB7CisgIEJ1aWxkRmlsZUVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxCdWlsZEZpbGVFcnJvckNvbGxlY3Rvcio+KHNlbGYpOworICBpZiAoZXJyb3JfY29sbGVjdG9yICYmICFlcnJvcl9jb2xsZWN0b3ItPmVycm9yX21lc3NhZ2UuZW1wdHkoKSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwgIkNvdWxkbid0IGJ1aWxkIGZpbGUgZm9yICVzICUuMjAwc1xuJXMiLAorICAgICAgICAgICAgICAgICBlcnJvcl90eXBlLCBuYW1lLCBlcnJvcl9jb2xsZWN0b3ItPmVycm9yX21lc3NhZ2UuY19zdHIoKSk7CisgICAgZXJyb3JfY29sbGVjdG9yLT5DbGVhcigpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwgIkNvdWxkbid0IGZpbmQgJXMgJS4yMDBzIiwgZXJyb3JfdHlwZSwgbmFtZSk7CisgIHJldHVybiBudWxscHRyOworfQorCitzdGF0aWMgUHlPYmplY3QqIEZpbmRNZXNzYWdlQnlOYW1lKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJnKSB7CisgIFB5X3NzaXplX3QgbmFtZV9zaXplOworICBjaGFyKiBuYW1lOworICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZywgJm5hbWUsICZuYW1lX3NpemUpIDwgMCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV9kZXNjcmlwdG9yID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlEZXNjcmlwdG9yUG9vbCo+KHNlbGYpLT5wb29sLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCisgICAgICAgICAgU3RyaW5nUGFyYW0obmFtZSwgbmFtZV9zaXplKSk7CisKKyAgaWYgKG1lc3NhZ2VfZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIFNldEVycm9yRnJvbUNvbGxlY3RvcigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeURlc2NyaXB0b3JQb29sKj4oc2VsZiktPmVycm9yX2NvbGxlY3RvciwgbmFtZSwKKyAgICAgICAgIm1lc3NhZ2UiKTsKKyAgfQorCisKKyAgcmV0dXJuIFB5TWVzc2FnZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IobWVzc2FnZV9kZXNjcmlwdG9yKTsKK30KKworCisKKworc3RhdGljIFB5T2JqZWN0KiBGaW5kRmlsZUJ5TmFtZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICBQeV9zc2l6ZV90IG5hbWVfc2l6ZTsKKyAgY2hhciogbmFtZTsKKyAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmcsICZuYW1lLCAmbmFtZV9zaXplKSA8IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5RGVzY3JpcHRvclBvb2wqIHB5X3Bvb2wgPSByZWludGVycHJldF9jYXN0PFB5RGVzY3JpcHRvclBvb2wqPihzZWxmKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfZGVzY3JpcHRvciA9CisgICAgICBweV9wb29sLT5wb29sLT5GaW5kRmlsZUJ5TmFtZShTdHJpbmdQYXJhbShuYW1lLCBuYW1lX3NpemUpKTsKKworICBpZiAoZmlsZV9kZXNjcmlwdG9yID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gU2V0RXJyb3JGcm9tQ29sbGVjdG9yKHB5X3Bvb2wtPmVycm9yX2NvbGxlY3RvciwgbmFtZSwgImZpbGUiKTsKKyAgfQorICByZXR1cm4gUHlGaWxlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihmaWxlX2Rlc2NyaXB0b3IpOworfQorCitQeU9iamVjdCogRmluZEZpZWxkQnlOYW1lKFB5RGVzY3JpcHRvclBvb2wqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgUHlfc3NpemVfdCBuYW1lX3NpemU7CisgIGNoYXIqIG5hbWU7CisgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJnLCAmbmFtZSwgJm5hbWVfc2l6ZSkgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPQorICAgICAgc2VsZi0+cG9vbC0+RmluZEZpZWxkQnlOYW1lKFN0cmluZ1BhcmFtKG5hbWUsIG5hbWVfc2l6ZSkpOworICBpZiAoZmllbGRfZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIFNldEVycm9yRnJvbUNvbGxlY3RvcihzZWxmLT5lcnJvcl9jb2xsZWN0b3IsIG5hbWUsICJmaWVsZCIpOworICB9CisKKworICByZXR1cm4gUHlGaWVsZERlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoZmllbGRfZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogRmluZEZpZWxkQnlOYW1lTWV0aG9kKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJnKSB7CisgIHJldHVybiBGaW5kRmllbGRCeU5hbWUocmVpbnRlcnByZXRfY2FzdDxQeURlc2NyaXB0b3JQb29sKj4oc2VsZiksIGFyZyk7Cit9CisKK1B5T2JqZWN0KiBGaW5kRXh0ZW5zaW9uQnlOYW1lKFB5RGVzY3JpcHRvclBvb2wqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgUHlfc3NpemVfdCBuYW1lX3NpemU7CisgIGNoYXIqIG5hbWU7CisgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJnLCAmbmFtZSwgJm5hbWVfc2l6ZSkgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPQorICAgICAgc2VsZi0+cG9vbC0+RmluZEV4dGVuc2lvbkJ5TmFtZShTdHJpbmdQYXJhbShuYW1lLCBuYW1lX3NpemUpKTsKKyAgaWYgKGZpZWxkX2Rlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBTZXRFcnJvckZyb21Db2xsZWN0b3Ioc2VsZi0+ZXJyb3JfY29sbGVjdG9yLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVuc2lvbiBmaWVsZCIpOworICB9CisKKworICByZXR1cm4gUHlGaWVsZERlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoZmllbGRfZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogRmluZEV4dGVuc2lvbkJ5TmFtZU1ldGhvZChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICByZXR1cm4gRmluZEV4dGVuc2lvbkJ5TmFtZShyZWludGVycHJldF9jYXN0PFB5RGVzY3JpcHRvclBvb2wqPihzZWxmKSwgYXJnKTsKK30KKworUHlPYmplY3QqIEZpbmRFbnVtVHlwZUJ5TmFtZShQeURlc2NyaXB0b3JQb29sKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7CisgIFB5X3NzaXplX3QgbmFtZV9zaXplOworICBjaGFyKiBuYW1lOworICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZywgJm5hbWUsICZuYW1lX3NpemUpIDwgMCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvciA9CisgICAgICBzZWxmLT5wb29sLT5GaW5kRW51bVR5cGVCeU5hbWUoU3RyaW5nUGFyYW0obmFtZSwgbmFtZV9zaXplKSk7CisgIGlmIChlbnVtX2Rlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBTZXRFcnJvckZyb21Db2xsZWN0b3Ioc2VsZi0+ZXJyb3JfY29sbGVjdG9yLCBuYW1lLCAiZW51bSIpOworICB9CisKKworICByZXR1cm4gUHlFbnVtRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihlbnVtX2Rlc2NyaXB0b3IpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEZpbmRFbnVtVHlwZUJ5TmFtZU1ldGhvZChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICByZXR1cm4gRmluZEVudW1UeXBlQnlOYW1lKHJlaW50ZXJwcmV0X2Nhc3Q8UHlEZXNjcmlwdG9yUG9vbCo+KHNlbGYpLCBhcmcpOworfQorCitQeU9iamVjdCogRmluZE9uZW9mQnlOYW1lKFB5RGVzY3JpcHRvclBvb2wqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgUHlfc3NpemVfdCBuYW1lX3NpemU7CisgIGNoYXIqIG5hbWU7CisgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJnLCAmbmFtZSwgJm5hbWVfc2l6ZSkgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IgPQorICAgICAgc2VsZi0+cG9vbC0+RmluZE9uZW9mQnlOYW1lKFN0cmluZ1BhcmFtKG5hbWUsIG5hbWVfc2l6ZSkpOworICBpZiAob25lb2ZfZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIFNldEVycm9yRnJvbUNvbGxlY3RvcihzZWxmLT5lcnJvcl9jb2xsZWN0b3IsIG5hbWUsICJvbmVvZiIpOworICB9CisKKworICByZXR1cm4gUHlPbmVvZkRlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3Iob25lb2ZfZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogRmluZE9uZW9mQnlOYW1lTWV0aG9kKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJnKSB7CisgIHJldHVybiBGaW5kT25lb2ZCeU5hbWUocmVpbnRlcnByZXRfY2FzdDxQeURlc2NyaXB0b3JQb29sKj4oc2VsZiksIGFyZyk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogRmluZFNlcnZpY2VCeU5hbWUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgUHlfc3NpemVfdCBuYW1lX3NpemU7CisgIGNoYXIqIG5hbWU7CisgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJnLCAmbmFtZSwgJm5hbWVfc2l6ZSkgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZV9kZXNjcmlwdG9yID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlEZXNjcmlwdG9yUG9vbCo+KHNlbGYpLT5wb29sLT5GaW5kU2VydmljZUJ5TmFtZSgKKyAgICAgICAgICBTdHJpbmdQYXJhbShuYW1lLCBuYW1lX3NpemUpKTsKKyAgaWYgKHNlcnZpY2VfZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIFNldEVycm9yRnJvbUNvbGxlY3RvcigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeURlc2NyaXB0b3JQb29sKj4oc2VsZiktPmVycm9yX2NvbGxlY3RvciwgbmFtZSwKKyAgICAgICAgInNlcnZpY2UiKTsKKyAgfQorCisKKyAgcmV0dXJuIFB5U2VydmljZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3Ioc2VydmljZV9kZXNjcmlwdG9yKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBGaW5kTWV0aG9kQnlOYW1lKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJnKSB7CisgIFB5X3NzaXplX3QgbmFtZV9zaXplOworICBjaGFyKiBuYW1lOworICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZywgJm5hbWUsICZuYW1lX3NpemUpIDwgMCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kX2Rlc2NyaXB0b3IgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeURlc2NyaXB0b3JQb29sKj4oc2VsZiktPnBvb2wtPkZpbmRNZXRob2RCeU5hbWUoCisgICAgICAgICAgU3RyaW5nUGFyYW0obmFtZSwgbmFtZV9zaXplKSk7CisgIGlmIChtZXRob2RfZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIFNldEVycm9yRnJvbUNvbGxlY3RvcigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeURlc2NyaXB0b3JQb29sKj4oc2VsZiktPmVycm9yX2NvbGxlY3RvciwgbmFtZSwKKyAgICAgICAgIm1ldGhvZCIpOworICB9CisKKworICByZXR1cm4gUHlNZXRob2REZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKG1ldGhvZF9kZXNjcmlwdG9yKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgUHlfc3NpemVfdCBuYW1lX3NpemU7CisgIGNoYXIqIG5hbWU7CisgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJnLCAmbmFtZSwgJm5hbWVfc2l6ZSkgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV9kZXNjcmlwdG9yID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlEZXNjcmlwdG9yUG9vbCo+KHNlbGYpLT5wb29sLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgICAgICAgU3RyaW5nUGFyYW0obmFtZSwgbmFtZV9zaXplKSk7CisgIGlmIChmaWxlX2Rlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBTZXRFcnJvckZyb21Db2xsZWN0b3IoCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlEZXNjcmlwdG9yUG9vbCo+KHNlbGYpLT5lcnJvcl9jb2xsZWN0b3IsIG5hbWUsCisgICAgICAgICJzeW1ib2wiKTsKKyAgfQorCisKKyAgcmV0dXJuIFB5RmlsZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoZmlsZV9kZXNjcmlwdG9yKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBGaW5kRXh0ZW5zaW9uQnlOdW1iZXIoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIFB5T2JqZWN0KiBtZXNzYWdlX2Rlc2NyaXB0b3I7CisgIGludCBudW1iZXI7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2kiLCAmbWVzc2FnZV9kZXNjcmlwdG9yLCAmbnVtYmVyKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBQeU1lc3NhZ2VEZXNjcmlwdG9yX0FzRGVzY3JpcHRvcigKKyAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvcik7CisgIGlmIChkZXNjcmlwdG9yID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uX2Rlc2NyaXB0b3IgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeURlc2NyaXB0b3JQb29sKj4oc2VsZiktPnBvb2wtPkZpbmRFeHRlbnNpb25CeU51bWJlcigKKyAgICAgICAgICBkZXNjcmlwdG9yLCBudW1iZXIpOworICBpZiAoZXh0ZW5zaW9uX2Rlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgIEJ1aWxkRmlsZUVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IgPQorICAgICAgICByZWludGVycHJldF9jYXN0PEJ1aWxkRmlsZUVycm9yQ29sbGVjdG9yKj4oCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFB5RGVzY3JpcHRvclBvb2wqPihzZWxmKS0+ZXJyb3JfY29sbGVjdG9yKTsKKyAgICBpZiAoZXJyb3JfY29sbGVjdG9yICYmICFlcnJvcl9jb2xsZWN0b3ItPmVycm9yX21lc3NhZ2UuZW1wdHkoKSkgeworICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLCAiQ291bGRuJ3QgYnVpbGQgZmlsZSBmb3IgRXh0ZW5zaW9uICUuZFxuJXMiLAorICAgICAgICAgICAgICAgICAgIG51bWJlciwgZXJyb3JfY29sbGVjdG9yLT5lcnJvcl9tZXNzYWdlLmNfc3RyKCkpOworICAgICAgZXJyb3JfY29sbGVjdG9yLT5DbGVhcigpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwgIkNvdWxkbid0IGZpbmQgRXh0ZW5zaW9uICVkIiwgbnVtYmVyKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisKKyAgcmV0dXJuIFB5RmllbGREZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGV4dGVuc2lvbl9kZXNjcmlwdG9yKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBGaW5kQWxsRXh0ZW5zaW9ucyhQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gUHlNZXNzYWdlRGVzY3JpcHRvcl9Bc0Rlc2NyaXB0b3IoYXJnKTsKKyAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZXh0ZW5zaW9uczsKKyAgcmVpbnRlcnByZXRfY2FzdDxQeURlc2NyaXB0b3JQb29sKj4oc2VsZiktPnBvb2wtPkZpbmRBbGxFeHRlbnNpb25zKAorICAgICAgZGVzY3JpcHRvciwgJmV4dGVuc2lvbnMpOworCisgIFNjb3BlZFB5T2JqZWN0UHRyIHJlc3VsdChQeUxpc3RfTmV3KGV4dGVuc2lvbnMuc2l6ZSgpKSk7CisgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5zaXplKCk7IGkrKykgeworICAgIFB5T2JqZWN0KiBleHRlbnNpb24gPSBQeUZpZWxkRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihleHRlbnNpb25zW2ldKTsKKyAgICBpZiAoZXh0ZW5zaW9uID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBQeUxpc3RfU0VUX0lURU0ocmVzdWx0LmdldCgpLCBpLCBleHRlbnNpb24pOyAgLy8gU3RlYWxzIHRoZSByZWZlcmVuY2UuCisgIH0KKyAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7Cit9CisKKy8vIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgbm90IGV4aXN0IC0tIHRoZSBvbmx5IHZhbGlkIHdheSB0byBjcmVhdGUKKy8vIGRlc2NyaXB0b3JzIGlzIHRvIGNhbGwgQWRkKCkgb3IgQWRkU2VyaWFsaXplZEZpbGUoKS4KKy8vIEJ1dCB0aGVzZSBBZGREZXNjcmlwdG9yKCkgZnVuY3Rpb25zIHdlcmUgY3JlYXRlZCBpbiBQeXRob24gYW5kIHNvbWUgcGVvcGxlCisvLyBjYWxsIHRoZW0sIHNvIHdlIHN1cHBvcnQgdGhlbSBmb3Igbm93IGZvciBjb21wYXRpYmlsaXR5LgorLy8gSG93ZXZlciB3ZSBkbyBjaGVjayB0aGF0IHRoZSBleGlzdGluZyBkZXNjcmlwdG9yIGFscmVhZHkgZXhpc3RzIGluIHRoZSBwb29sLAorLy8gd2hpY2ggYXBwZWFycyB0byBhbHdheXMgYmUgdHJ1ZSBmb3IgZXhpc3RpbmcgY2FsbHMgLS0gYnV0IHRoZW4gd2h5IGRvIHBlb3BsZQorLy8gY2FsbCBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBqdXN0IGJlIGEgbm8tb3A/CisvLyBUT0RPKGFtYXVyeWZhKTogTmVlZCB0byBpbnZlc3RpZ2F0ZSBmdXJ0aGVyLgorCitzdGF0aWMgUHlPYmplY3QqIEFkZEZpbGVEZXNjcmlwdG9yKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogZGVzY3JpcHRvcikgeworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV9kZXNjcmlwdG9yID0KKyAgICAgIFB5RmlsZURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOworICBpZiAoIWZpbGVfZGVzY3JpcHRvcikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChmaWxlX2Rlc2NyaXB0b3IgIT0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlEZXNjcmlwdG9yUG9vbCo+KHNlbGYpLT5wb29sLT5GaW5kRmlsZUJ5TmFtZSgKKyAgICAgICAgICBmaWxlX2Rlc2NyaXB0b3ItPm5hbWUoKSkpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgIlRoZSBmaWxlIGRlc2NyaXB0b3IgJXMgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgcG9vbCIsCisgICAgICAgICAgICAgICAgIGZpbGVfZGVzY3JpcHRvci0+bmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqIEFkZERlc2NyaXB0b3IoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBkZXNjcmlwdG9yKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfZGVzY3JpcHRvciA9CisgICAgICBQeU1lc3NhZ2VEZXNjcmlwdG9yX0FzRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKKyAgaWYgKCFtZXNzYWdlX2Rlc2NyaXB0b3IpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAobWVzc2FnZV9kZXNjcmlwdG9yICE9CisgICAgICByZWludGVycHJldF9jYXN0PFB5RGVzY3JpcHRvclBvb2wqPihzZWxmKS0+cG9vbC0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKAorICAgICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkpKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICJUaGUgbWVzc2FnZSBkZXNjcmlwdG9yICVzIGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIHBvb2wiLAorICAgICAgICAgICAgICAgICBtZXNzYWdlX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqIEFkZEVudW1EZXNjcmlwdG9yKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogZGVzY3JpcHRvcikgeworICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yID0KKyAgICAgIFB5RW51bURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOworICBpZiAoIWVudW1fZGVzY3JpcHRvcikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChlbnVtX2Rlc2NyaXB0b3IgIT0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlEZXNjcmlwdG9yUG9vbCo+KHNlbGYpLT5wb29sLT5GaW5kRW51bVR5cGVCeU5hbWUoCisgICAgICAgICAgZW51bV9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKSkpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgIlRoZSBlbnVtIGRlc2NyaXB0b3IgJXMgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgcG9vbCIsCisgICAgICAgICAgICAgICAgIGVudW1fZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQWRkRXh0ZW5zaW9uRGVzY3JpcHRvcihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGRlc2NyaXB0b3IpIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb25fZGVzY3JpcHRvciA9CisgICAgICBQeUZpZWxkRGVzY3JpcHRvcl9Bc0Rlc2NyaXB0b3IoZGVzY3JpcHRvcik7CisgIGlmICghZXh0ZW5zaW9uX2Rlc2NyaXB0b3IpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoZXh0ZW5zaW9uX2Rlc2NyaXB0b3IgIT0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlEZXNjcmlwdG9yUG9vbCo+KHNlbGYpLT5wb29sLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgICAgICAgIGV4dGVuc2lvbl9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKSkpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgIlRoZSBleHRlbnNpb24gZGVzY3JpcHRvciAlcyBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBwb29sIiwKKyAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqIEFkZFNlcnZpY2VEZXNjcmlwdG9yKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogZGVzY3JpcHRvcikgeworICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZV9kZXNjcmlwdG9yID0KKyAgICAgIFB5U2VydmljZURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOworICBpZiAoIXNlcnZpY2VfZGVzY3JpcHRvcikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChzZXJ2aWNlX2Rlc2NyaXB0b3IgIT0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlEZXNjcmlwdG9yUG9vbCo+KHNlbGYpLT5wb29sLT5GaW5kU2VydmljZUJ5TmFtZSgKKyAgICAgICAgICBzZXJ2aWNlX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpKSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAiVGhlIHNlcnZpY2UgZGVzY3JpcHRvciAlcyBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBwb29sIiwKKyAgICAgICAgICAgICAgICAgc2VydmljZV9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeV9SRVRVUk5fTk9ORTsKK30KKworLy8gVGhlIGNvZGUgYmVsb3cgbG9hZHMgbmV3IERlc2NyaXB0b3JzIGZyb20gYSBzZXJpYWxpemVkIEZpbGVEZXNjcmlwdG9yUHJvdG8uCitzdGF0aWMgUHlPYmplY3QqIEFkZFNlcmlhbGl6ZWRGaWxlKFB5T2JqZWN0KiBwc2VsZiwgUHlPYmplY3QqIHNlcmlhbGl6ZWRfcGIpIHsKKyAgUHlEZXNjcmlwdG9yUG9vbCogc2VsZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlEZXNjcmlwdG9yUG9vbCo+KHBzZWxmKTsKKyAgY2hhciogbWVzc2FnZV90eXBlOworICBQeV9zc2l6ZV90IG1lc3NhZ2VfbGVuOworCisgIGlmIChzZWxmLT5kYXRhYmFzZSAhPSBudWxscHRyKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICBQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAiQ2Fubm90IGNhbGwgQWRkIG9uIGEgRGVzY3JpcHRvclBvb2wgdGhhdCB1c2VzIGEgRGVzY3JpcHRvckRhdGFiYXNlLiAiCisgICAgICAgICJBZGQgeW91ciBmaWxlIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlLiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmICghc2VsZi0+aXNfbXV0YWJsZSkgeworICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgIlRoaXMgRGVzY3JpcHRvclBvb2wgaXMgbm90IG11dGFibGUgYW5kIGNhbm5vdCBhZGQgbmV3IGRlZmluaXRpb25zLiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgaWYgKFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplKHNlcmlhbGl6ZWRfcGIsICZtZXNzYWdlX3R5cGUsICZtZXNzYWdlX2xlbikgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIGlmICghZmlsZV9wcm90by5QYXJzZUZyb21BcnJheShtZXNzYWdlX3R5cGUsIG1lc3NhZ2VfbGVuKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDb3VsZG4ndCBwYXJzZSBmaWxlIGNvbnRlbnQhIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBJZiB0aGUgZmlsZSB3YXMgYWxyZWFkeSBwYXJ0IG9mIGEgQysrIGxpYnJhcnksIGFsbCBpdHMgZGVzY3JpcHRvcnMgYXJlIGluCisgIC8vIHRoZSB1bmRlcmx5aW5nIHBvb2wuICBObyBuZWVkIHRvIGRvIGFueXRoaW5nIGVsc2UuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBnZW5lcmF0ZWRfZmlsZSA9IG51bGxwdHI7CisgIGlmIChzZWxmLT51bmRlcmxheSkgeworICAgIGdlbmVyYXRlZF9maWxlID0gc2VsZi0+dW5kZXJsYXktPkZpbmRGaWxlQnlOYW1lKGZpbGVfcHJvdG8ubmFtZSgpKTsKKyAgfQorICBpZiAoZ2VuZXJhdGVkX2ZpbGUgIT0gbnVsbHB0cikgeworICAgIHJldHVybiBQeUZpbGVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yV2l0aFNlcmlhbGl6ZWRQYigKKyAgICAgICAgZ2VuZXJhdGVkX2ZpbGUsIHNlcmlhbGl6ZWRfcGIpOworICB9CisKKyAgQnVpbGRGaWxlRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciA9CisgICAgICAvLyBQb29sIGlzIG11dGFibGUsIHdlIGNhbiByZW1vdmUgdGhlICJjb25zdCIuCisgICAgICBjb25zdF9jYXN0PERlc2NyaXB0b3JQb29sKj4oc2VsZi0+cG9vbCkKKyAgICAgICAgICAtPkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoZmlsZV9wcm90bywgJmVycm9yX2NvbGxlY3Rvcik7CisgIGlmIChkZXNjcmlwdG9yID09IG51bGxwdHIpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgYnVpbGQgcHJvdG8gZmlsZSBpbnRvIGRlc2NyaXB0b3IgcG9vbCFcbiVzIiwKKyAgICAgICAgICAgICAgICAgZXJyb3JfY29sbGVjdG9yLmVycm9yX21lc3NhZ2UuY19zdHIoKSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworCisgIHJldHVybiBQeUZpbGVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yV2l0aFNlcmlhbGl6ZWRQYigKKyAgICAgIGRlc2NyaXB0b3IsIHNlcmlhbGl6ZWRfcGIpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEFkZChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGZpbGVfZGVzY3JpcHRvcl9wcm90bykgeworICBTY29wZWRQeU9iamVjdFB0ciBzZXJpYWxpemVkX3BiKAorICAgICAgUHlPYmplY3RfQ2FsbE1ldGhvZChmaWxlX2Rlc2NyaXB0b3JfcHJvdG8sICJTZXJpYWxpemVUb1N0cmluZyIsIG51bGxwdHIpKTsKKyAgaWYgKHNlcmlhbGl6ZWRfcGIgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBBZGRTZXJpYWxpemVkRmlsZShzZWxmLCBzZXJpYWxpemVkX3BiLmdldCgpKTsKK30KKworc3RhdGljIFB5TWV0aG9kRGVmIE1ldGhvZHNbXSA9IHsKKyAgICB7IkFkZCIsIEFkZCwgTUVUSF9PLAorICAgICAiQWRkcyB0aGUgRmlsZURlc2NyaXB0b3JQcm90byBhbmQgaXRzIHR5cGVzIHRvIHRoaXMgcG9vbC4ifSwKKyAgICB7IkFkZFNlcmlhbGl6ZWRGaWxlIiwgQWRkU2VyaWFsaXplZEZpbGUsIE1FVEhfTywKKyAgICAgIkFkZHMgYSBzZXJpYWxpemVkIEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gdGhpcyBwb29sLiJ9LAorCisgICAgLy8gVE9ETyhhbWF1cnlmYSk6IFVuZGVyc3RhbmQgd2h5IHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gZGlmZmVycyBmcm9tCisgICAgLy8gdGhpcyBvbmUsIGFzayB1c2VycyB0byB1c2UgYW5vdGhlciBBUEkgYW5kIGRlcHJlY2F0ZSB0aGVzZSBmdW5jdGlvbnMuCisgICAgeyJBZGRGaWxlRGVzY3JpcHRvciIsIEFkZEZpbGVEZXNjcmlwdG9yLCBNRVRIX08sCisgICAgICJOby1vcC4gQWRkKCkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGJlZm9yZS4ifSwKKyAgICB7IkFkZERlc2NyaXB0b3IiLCBBZGREZXNjcmlwdG9yLCBNRVRIX08sCisgICAgICJOby1vcC4gQWRkKCkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGJlZm9yZS4ifSwKKyAgICB7IkFkZEVudW1EZXNjcmlwdG9yIiwgQWRkRW51bURlc2NyaXB0b3IsIE1FVEhfTywKKyAgICAgIk5vLW9wLiBBZGQoKSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgYmVmb3JlLiJ9LAorICAgIHsiQWRkRXh0ZW5zaW9uRGVzY3JpcHRvciIsIEFkZEV4dGVuc2lvbkRlc2NyaXB0b3IsIE1FVEhfTywKKyAgICAgIk5vLW9wLiBBZGQoKSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgYmVmb3JlLiJ9LAorICAgIHsiQWRkU2VydmljZURlc2NyaXB0b3IiLCBBZGRTZXJ2aWNlRGVzY3JpcHRvciwgTUVUSF9PLAorICAgICAiTm8tb3AuIEFkZCgpIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBiZWZvcmUuIn0sCisKKyAgICB7IkZpbmRGaWxlQnlOYW1lIiwgRmluZEZpbGVCeU5hbWUsIE1FVEhfTywKKyAgICAgIlNlYXJjaGVzIGZvciBhIGZpbGUgZGVzY3JpcHRvciBieSBpdHMgLnByb3RvIG5hbWUuIn0sCisgICAgeyJGaW5kTWVzc2FnZVR5cGVCeU5hbWUiLCBGaW5kTWVzc2FnZUJ5TmFtZSwgTUVUSF9PLAorICAgICAiU2VhcmNoZXMgZm9yIGEgbWVzc2FnZSBkZXNjcmlwdG9yIGJ5IGZ1bGwgbmFtZS4ifSwKKyAgICB7IkZpbmRGaWVsZEJ5TmFtZSIsIEZpbmRGaWVsZEJ5TmFtZU1ldGhvZCwgTUVUSF9PLAorICAgICAiU2VhcmNoZXMgZm9yIGEgZmllbGQgZGVzY3JpcHRvciBieSBmdWxsIG5hbWUuIn0sCisgICAgeyJGaW5kRXh0ZW5zaW9uQnlOYW1lIiwgRmluZEV4dGVuc2lvbkJ5TmFtZU1ldGhvZCwgTUVUSF9PLAorICAgICAiU2VhcmNoZXMgZm9yIGV4dGVuc2lvbiBkZXNjcmlwdG9yIGJ5IGZ1bGwgbmFtZS4ifSwKKyAgICB7IkZpbmRFbnVtVHlwZUJ5TmFtZSIsIEZpbmRFbnVtVHlwZUJ5TmFtZU1ldGhvZCwgTUVUSF9PLAorICAgICAiU2VhcmNoZXMgZm9yIGVudW0gdHlwZSBkZXNjcmlwdG9yIGJ5IGZ1bGwgbmFtZS4ifSwKKyAgICB7IkZpbmRPbmVvZkJ5TmFtZSIsIEZpbmRPbmVvZkJ5TmFtZU1ldGhvZCwgTUVUSF9PLAorICAgICAiU2VhcmNoZXMgZm9yIG9uZW9mIGRlc2NyaXB0b3IgYnkgZnVsbCBuYW1lLiJ9LAorICAgIHsiRmluZFNlcnZpY2VCeU5hbWUiLCBGaW5kU2VydmljZUJ5TmFtZSwgTUVUSF9PLAorICAgICAiU2VhcmNoZXMgZm9yIHNlcnZpY2UgZGVzY3JpcHRvciBieSBmdWxsIG5hbWUuIn0sCisgICAgeyJGaW5kTWV0aG9kQnlOYW1lIiwgRmluZE1ldGhvZEJ5TmFtZSwgTUVUSF9PLAorICAgICAiU2VhcmNoZXMgZm9yIG1ldGhvZCBkZXNjcmlwdG9yIGJ5IGZ1bGwgbmFtZS4ifSwKKworICAgIHsiRmluZEZpbGVDb250YWluaW5nU3ltYm9sIiwgRmluZEZpbGVDb250YWluaW5nU3ltYm9sLCBNRVRIX08sCisgICAgICJHZXRzIHRoZSBGaWxlRGVzY3JpcHRvciBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgc3ltYm9sLiJ9LAorICAgIHsiRmluZEV4dGVuc2lvbkJ5TnVtYmVyIiwgRmluZEV4dGVuc2lvbkJ5TnVtYmVyLCBNRVRIX1ZBUkFSR1MsCisgICAgICJHZXRzIHRoZSBleHRlbnNpb24gZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIG51bWJlci4ifSwKKyAgICB7IkZpbmRBbGxFeHRlbnNpb25zIiwgRmluZEFsbEV4dGVuc2lvbnMsIE1FVEhfTywKKyAgICAgIkdldHMgYWxsIGtub3duIGV4dGVuc2lvbnMgb2YgdGhlIGdpdmVuIG1lc3NhZ2UgZGVzY3JpcHRvci4ifSwKKyAgICB7bnVsbHB0cn0sCit9OworCit9ICAvLyBuYW1lc3BhY2UgY2Rlc2NyaXB0b3JfcG9vbAorCitQeVR5cGVPYmplY3QgUHlEZXNjcmlwdG9yUG9vbF9UeXBlID0geworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApIEZVTExfTU9EVUxFX05BTUUKKyAgICAiLkRlc2NyaXB0b3JQb29sIiwgICAgICAgICAgLy8gdHBfbmFtZQorICAgIHNpemVvZihQeURlc2NyaXB0b3JQb29sKSwgICAvLyB0cF9iYXNpY3NpemUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKKyAgICBjZGVzY3JpcHRvcl9wb29sOjpEZWFsbG9jLCAgLy8gdHBfZGVhbGxvYworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMzA4MDAwMAorICAgIG51bGxwdHIsICAvLyB0cF9wcmludAorI2Vsc2UKKyAgICAwLCAgLy8gdHBfdmVjdG9yY2FsbF9vZmZzZXQKKyNlbmRpZgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY29tcGFyZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JlcHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19udW1iZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19zZXF1ZW5jZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX21hcHBpbmcKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9oYXNoCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2FsbAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3N0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cm8KKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19idWZmZXIKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAvLyB0cF9mbGFncworICAgICJBIERlc2NyaXB0b3IgUG9vbCIsICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RvYworICAgIGNkZXNjcmlwdG9yX3Bvb2w6OkdjVHJhdmVyc2UsICAgICAgICAgICAgIC8vIHRwX3RyYXZlcnNlCisgICAgY2Rlc2NyaXB0b3JfcG9vbDo6R2NDbGVhciwgICAgICAgICAgICAgICAgLy8gdHBfY2xlYXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yaWNoY29tcGFyZQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3dlYWtsaXN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXJuZXh0CisgICAgY2Rlc2NyaXB0b3JfcG9vbDo6TWV0aG9kcywgICAgICAgICAgICAgICAgLy8gdHBfbWV0aG9kcworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21lbWJlcnMKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9iYXNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGljdAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Rlc2NyX2dldAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Rlc2NyX3NldAorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RpY3RvZmZzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pbml0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYWxsb2MKKyAgICBjZGVzY3JpcHRvcl9wb29sOjpOZXcsICAgICAgICAgICAgICAgICAgICAvLyB0cF9uZXcKKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9mcmVlCit9OworCisvLyBUaGlzIGlzIHRoZSBEZXNjcmlwdG9yUG9vbCB3aGljaCBjb250YWlucyBhbGwgdGhlIGRlZmluaXRpb25zIGZyb20gdGhlCisvLyBnZW5lcmF0ZWQgX3BiMi5weSBtb2R1bGVzLgorc3RhdGljIFB5RGVzY3JpcHRvclBvb2wqIHB5dGhvbl9nZW5lcmF0ZWRfcG9vbCA9IG51bGxwdHI7CisKK2Jvb2wgSW5pdERlc2NyaXB0b3JQb29sKCkgeworICBpZiAoUHlUeXBlX1JlYWR5KCZQeURlc2NyaXB0b3JQb29sX1R5cGUpIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gVGhlIFBvb2wgb2YgbWVzc2FnZXMgZGVjbGFyZWQgaW4gUHl0aG9uIGxpYnJhcmllcy4KKyAgLy8gZ2VuZXJhdGVkX3Bvb2woKSBjb250YWlucyBhbGwgbWVzc2FnZXMgYWxyZWFkeSBsaW5rZWQgaW4gQysrIGxpYnJhcmllcywgYW5kCisgIC8vIGlzIHVzZWQgYXMgdW5kZXJsYXkuCisgIGRlc2NyaXB0b3JfcG9vbF9tYXAgPQorICAgICAgbmV3IHN0ZDo6dW5vcmRlcmVkX21hcDxjb25zdCBEZXNjcmlwdG9yUG9vbCosIFB5RGVzY3JpcHRvclBvb2wqPjsKKyAgcHl0aG9uX2dlbmVyYXRlZF9wb29sID0gY2Rlc2NyaXB0b3JfcG9vbDo6UHlEZXNjcmlwdG9yUG9vbF9OZXdXaXRoVW5kZXJsYXkoCisgICAgICBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSk7CisgIGlmIChweXRob25fZ2VuZXJhdGVkX3Bvb2wgPT0gbnVsbHB0cikgeworICAgIGRlbGV0ZSBkZXNjcmlwdG9yX3Bvb2xfbWFwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFJlZ2lzdGVyIHRoaXMgcG9vbCB0byBiZSBmb3VuZCBmb3IgQysrLWdlbmVyYXRlZCBkZXNjcmlwdG9ycy4KKyAgZGVzY3JpcHRvcl9wb29sX21hcC0+aW5zZXJ0KAorICAgICAgc3RkOjptYWtlX3BhaXIoRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICAgICAgICAgICAgICAgICBweXRob25fZ2VuZXJhdGVkX3Bvb2wpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVGhlIGRlZmF1bHQgRGVzY3JpcHRvclBvb2wgdXNlZCBldmVyeXdoZXJlIGluIHRoaXMgbW9kdWxlLgorLy8gVG9kYXkgaXQncyB0aGUgcHl0aG9uX2dlbmVyYXRlZF9wb29sLgorLy8gVE9ETyhhbWF1cnlmYSk6IFJlbW92ZSBhbGwgdXNhZ2VzIG9mIHRoaXMgZnVuY3Rpb246IHRoZSBwb29sIHNob3VsZCBiZQorLy8gZGVyaXZlZCBmcm9tIHRoZSBjb250ZXh0LgorUHlEZXNjcmlwdG9yUG9vbCogR2V0RGVmYXVsdERlc2NyaXB0b3JQb29sKCkgeworICByZXR1cm4gcHl0aG9uX2dlbmVyYXRlZF9wb29sOworfQorCitQeURlc2NyaXB0b3JQb29sKiBHZXREZXNjcmlwdG9yUG9vbF9Gcm9tUG9vbChjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCkgeworICAvLyBGYXN0IHBhdGggZm9yIHN0YW5kYXJkIGRlc2NyaXB0b3JzLgorICBpZiAocG9vbCA9PSBweXRob25fZ2VuZXJhdGVkX3Bvb2wtPnBvb2wgfHwKKyAgICAgIHBvb2wgPT0gRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkpIHsKKyAgICByZXR1cm4gcHl0aG9uX2dlbmVyYXRlZF9wb29sOworICB9CisgIHN0ZDo6dW5vcmRlcmVkX21hcDxjb25zdCBEZXNjcmlwdG9yUG9vbCosIFB5RGVzY3JpcHRvclBvb2wqPjo6aXRlcmF0b3IgaXQgPQorICAgICAgZGVzY3JpcHRvcl9wb29sX21hcC0+ZmluZChwb29sKTsKKyAgaWYgKGl0ID09IGRlc2NyaXB0b3JfcG9vbF9tYXAtPmVuZCgpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLCAiVW5rbm93biBkZXNjcmlwdG9yIHBvb2wiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gaXQtPnNlY29uZDsKK30KKworUHlPYmplY3QqIFB5RGVzY3JpcHRvclBvb2xfRnJvbVBvb2woY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpIHsKKyAgUHlEZXNjcmlwdG9yUG9vbCogZXhpc3RpbmdfcG9vbCA9IEdldERlc2NyaXB0b3JQb29sX0Zyb21Qb29sKHBvb2wpOworICBpZiAoZXhpc3RpbmdfcG9vbCAhPSBudWxscHRyKSB7CisgICAgUHlfSU5DUkVGKGV4aXN0aW5nX3Bvb2wpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oZXhpc3RpbmdfcG9vbCk7CisgIH0gZWxzZSB7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgfQorCisgIFB5RGVzY3JpcHRvclBvb2wqIGNwb29sID0gY2Rlc2NyaXB0b3JfcG9vbDo6X0NyZWF0ZURlc2NyaXB0b3JQb29sKCk7CisgIGlmIChjcG9vbCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgY3Bvb2wtPnBvb2wgPSBjb25zdF9jYXN0PERlc2NyaXB0b3JQb29sKj4ocG9vbCk7CisgIGNwb29sLT5pc19vd25lZCA9IGZhbHNlOworICBjcG9vbC0+aXNfbXV0YWJsZSA9IGZhbHNlOworICBjcG9vbC0+dW5kZXJsYXkgPSBudWxscHRyOworCisgIGlmICghZGVzY3JpcHRvcl9wb29sX21hcC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNwb29sLT5wb29sLCBjcG9vbCkpLnNlY29uZCkgeworICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gLS0gV2UgYWxyZWFkeSBjaGVja2VkIHRoZSBleGlzdGVuY2UgYWJvdmUuCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJEZXNjcmlwdG9yUG9vbCBhbHJlYWR5IHJlZ2lzdGVyZWQiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oY3Bvb2wpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9wb29sLmggYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfcG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkM2MzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfcG9vbC5oCkBAIC0wLDAgKzEsMTQ5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9ERVNDUklQVE9SX1BPT0xfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX0RFU0NSSVBUT1JfUE9PTF9IX18KKworI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCisjaW5jbHVkZSA8UHl0aG9uLmg+CisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBweXRob24geworCitzdHJ1Y3QgUHlNZXNzYWdlRmFjdG9yeTsKKworLy8gVGhlIChtZXRhKSB0eXBlIG9mIGFsbCBNZXNzYWdlcyBjbGFzc2VzLgorc3RydWN0IENNZXNzYWdlQ2xhc3M7CisKKy8vIFdyYXBzIG9wZXJhdGlvbnMgdG8gdGhlIGdsb2JhbCBEZXNjcmlwdG9yUG9vbCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbgorLy8gYWJvdXQgYWxsIG1lc3NhZ2VzIGFuZCBmaWVsZHMuCisvLworLy8gVGhlcmUgaXMgbm9ybWFsbHkgb25lIHBvb2wgcGVyIHByb2Nlc3MuIFdlIG1ha2UgaXQgYSBQeXRob24gb2JqZWN0IG9ubHkKKy8vIGJlY2F1c2UgaXQgY29udGFpbnMgbWFueSBQeXRob24gcmVmZXJlbmNlcy4KKy8vCisvLyAiTWV0aG9kcyIgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGlzIERlc2NyaXB0b3JQb29sIGFyZSBpbiB0aGUgY2Rlc2NyaXB0b3JfcG9vbAorLy8gbmFtZXNwYWNlLgordHlwZWRlZiBzdHJ1Y3QgUHlEZXNjcmlwdG9yUG9vbCB7CisgIFB5T2JqZWN0X0hFQUQ7CisKKyAgLy8gVGhlIEMrKyBwb29sIGNvbnRhaW5pbmcgRGVzY3JpcHRvcnMuCisgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sOworCisgIC8vIFRydWUgaWYgd2Ugc2hvdWxkIGZyZWUgdGhlIHBvaW50ZXIgYWJvdmUuCisgIGJvb2wgaXNfb3duZWQ7CisKKyAgLy8gVHJ1ZSBpZiB0aGlzIHBvb2wgYWNjZXB0cyBuZXcgcHJvdG8gZGVmaW5pdGlvbnMuCisgIC8vIEluIHRoaXMgY2FzZSBpdCBpcyBhbGxvd2VkIHRvIGNvbnN0X2Nhc3Q8RGVzY3JpcHRvclBvb2wqPihwb29sKS4KKyAgYm9vbCBpc19tdXRhYmxlOworCisKKyAgLy8gVGhlIGVycm9yIGNvbGxlY3RvciB0byBzdG9yZSBlcnJvciBpbmZvLiBDYW4gYmUgTlVMTC4gVGhpcyBwb2ludGVyIGlzCisgIC8vIG93bmVkLgorICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3RvcjsKKworICAvLyBUaGUgQysrIHBvb2wgYWN0aW5nIGFzIGFuIHVuZGVybGF5LiBDYW4gYmUgTlVMTC4KKyAgLy8gVGhpcyBwb2ludGVyIGlzIG5vdCBvd25lZCBhbmQgbXVzdCBzdGF5IGFsaXZlLgorICBjb25zdCBEZXNjcmlwdG9yUG9vbCogdW5kZXJsYXk7CisKKyAgLy8gVGhlIEMrKyBkZXNjcmlwdG9yIGRhdGFiYXNlIHVzZWQgdG8gZmV0Y2ggdW5rbm93biBwcm90b3MuIENhbiBiZSBOVUxMLgorICAvLyBUaGlzIHBvaW50ZXIgaXMgb3duZWQuCisgIGNvbnN0IERlc2NyaXB0b3JEYXRhYmFzZSogZGF0YWJhc2U7CisKKyAgLy8gVGhlIHByZWZlcnJlZCBNZXNzYWdlRmFjdG9yeSB0byBiZSB1c2VkIGJ5IGRlc2NyaXB0b3JzLgorICAvLyBUT0RPKGFtYXVyeWZhKTogRG9uJ3QgY3JlYXRlIHRoZSBGYWN0b3J5IGZyb20gdGhlIERlc2NyaXB0b3JQb29sLCBidXQKKyAgLy8gdXNlIHRoZSBvbmUgcGFzc2VkIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2UgY2xhc3Nlcy4gQW5kIHJlbW92ZSB0aGlzIG1lbWJlci4KKyAgUHlNZXNzYWdlRmFjdG9yeSogcHlfbWVzc2FnZV9mYWN0b3J5OworCisgIC8vIENhY2hlIHRoZSBvcHRpb25zIGZvciBhbnkga2luZCBvZiBkZXNjcmlwdG9yLgorICAvLyBEZXNjcmlwdG9yIHBvaW50ZXJzIGFyZSBvd25lZCBieSB0aGUgRGVzY3JpcHRvclBvb2wgYWJvdmUuCisgIC8vIFB5dGhvbiBvYmplY3RzIGFyZSBvd25lZCBieSB0aGUgbWFwLgorICBzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3Qgdm9pZCosIFB5T2JqZWN0Kj4qIGRlc2NyaXB0b3Jfb3B0aW9uczsKK30gUHlEZXNjcmlwdG9yUG9vbDsKKworCitleHRlcm4gUHlUeXBlT2JqZWN0IFB5RGVzY3JpcHRvclBvb2xfVHlwZTsKKworbmFtZXNwYWNlIGNkZXNjcmlwdG9yX3Bvb2wgeworCisKKy8vIFRoZSBmdW5jdGlvbnMgYmVsb3cgYXJlIGFsc28gZXhwb3NlZCBhcyBtZXRob2RzIG9mIHRoZSBEZXNjcmlwdG9yUG9vbCB0eXBlLgorCisvLyBMb29rcyB1cCBhIGZpZWxkIGJ5IG5hbWUuIFJldHVybnMgYSBQeUZpZWxkRGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvCisvLyB0aGUgZmllbGQgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgorLy8KKy8vIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlLgorUHlPYmplY3QqIEZpbmRGaWVsZEJ5TmFtZShQeURlc2NyaXB0b3JQb29sKiBzZWxmLCBQeU9iamVjdCogbmFtZSk7CisKKy8vIExvb2tzIHVwIGFuIGV4dGVuc2lvbiBieSBuYW1lLiBSZXR1cm5zIGEgUHlGaWVsZERlc2NyaXB0b3IgY29ycmVzcG9uZGluZworLy8gdG8gdGhlIGZpZWxkIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KKy8vCisvLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KK1B5T2JqZWN0KiBGaW5kRXh0ZW5zaW9uQnlOYW1lKFB5RGVzY3JpcHRvclBvb2wqIHNlbGYsIFB5T2JqZWN0KiBhcmcpOworCisvLyBMb29rcyB1cCBhbiBlbnVtIHR5cGUgYnkgbmFtZS4gUmV0dXJucyBhIFB5RW51bURlc2NyaXB0b3IgY29ycmVzcG9uZGluZworLy8gdG8gdGhlIGZpZWxkIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KKy8vCisvLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KK1B5T2JqZWN0KiBGaW5kRW51bVR5cGVCeU5hbWUoUHlEZXNjcmlwdG9yUG9vbCogc2VsZiwgUHlPYmplY3QqIGFyZyk7CisKKy8vIExvb2tzIHVwIGEgb25lb2YgYnkgbmFtZS4gUmV0dXJucyBhIENPbmVvZkRlc2NyaXB0b3IgY29ycmVzcG9uZGluZworLy8gdG8gdGhlIG9uZW9mIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KKy8vCisvLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KK1B5T2JqZWN0KiBGaW5kT25lb2ZCeU5hbWUoUHlEZXNjcmlwdG9yUG9vbCogc2VsZiwgUHlPYmplY3QqIGFyZyk7CisKK30gIC8vIG5hbWVzcGFjZSBjZGVzY3JpcHRvcl9wb29sCisKKy8vIFJldHJpZXZlcyB0aGUgZ2xvYmFsIGRlc2NyaXB0b3IgcG9vbCBvd25lZCBieSB0aGUgX21lc3NhZ2UgbW9kdWxlLgorLy8gVGhpcyBpcyB0aGUgb25lIHVzZWQgYnkgcGIyLnB5IGdlbmVyYXRlZCBtb2R1bGVzLgorLy8gUmV0dXJucyBhICpib3Jyb3dlZCogcmVmZXJlbmNlLgorLy8gIkRlZmF1bHQiIHBvb2wgdXNlZCB0byByZWdpc3RlciBtZXNzYWdlcyBmcm9tIF9wYjIucHkgbW9kdWxlcy4KK1B5RGVzY3JpcHRvclBvb2wqIEdldERlZmF1bHREZXNjcmlwdG9yUG9vbCgpOworCisvLyBSZXRyaWV2ZXMgYW4gZXhpc3RpbmcgcHl0aG9uIGRlc2NyaXB0b3IgcG9vbCBvd25pbmcgdGhlIEMrKyBkZXNjcmlwdG9yIHBvb2wuCisvLyBSZXR1cm5zIGEgKmJvcnJvd2VkKiByZWZlcmVuY2UuCitQeURlc2NyaXB0b3JQb29sKiBHZXREZXNjcmlwdG9yUG9vbF9Gcm9tUG9vbChjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCk7CisKKy8vIFdyYXBzIGEgQysrIGRlc2NyaXB0b3IgcG9vbCBpbiBhIFB5dGhvbiBvYmplY3QsIGNyZWF0ZXMgaXQgaWYgbmVjZXNzYXJ5LgorLy8gUmV0dXJucyBhIG5ldyByZWZlcmVuY2UuCitQeU9iamVjdCogUHlEZXNjcmlwdG9yUG9vbF9Gcm9tUG9vbChjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCk7CisKKy8vIEluaXRpYWxpemUgb2JqZWN0cyB1c2VkIGJ5IHRoaXMgbW9kdWxlLgorYm9vbCBJbml0RGVzY3JpcHRvclBvb2woKTsKKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfREVTQ1JJUFRPUl9QT09MX0hfXwpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9leHRlbnNpb25fZGljdC5jYyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZXh0ZW5zaW9uX2RpY3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3MDNkYQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZXh0ZW5zaW9uX2RpY3QuY2MKQEAgLTAsMCArMSw0ODQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGFudXJhYWdAZ29vZ2xlLmNvbSAoQW51cmFhZyBBZ3Jhd2FsKQorLy8gQXV0aG9yOiB0aWJlbGxAZ29vZ2xlLmNvbSAoSm9oYW4gVGliZWxsKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2V4dGVuc2lvbl9kaWN0Lmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2VfZmFjdG9yeS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9yZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3JlcGVhdGVkX3NjYWxhcl9jb250YWluZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvc2NvcGVkX3B5b2JqZWN0X3B0ci5oPgorCisjZGVmaW5lIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShvYiwgY2hhcnBwLCBzaXplcCkgICAgICAgICAgICAgIFwKKyAgKFB5VW5pY29kZV9DaGVjayhvYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKCgqKGNoYXJwcCkgPSBjb25zdF9jYXN0PGNoYXIqPiggICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBQeVVuaWNvZGVfQXNVVEY4QW5kU2l6ZShvYiwgKHNpemVwKSkpKSA9PSBudWxscHRyIFwKKyAgICAgICAgICAgICAgPyAtMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICA6IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiBQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZShvYiwgKGNoYXJwcCksIChzaXplcCkpKQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgcHl0aG9uIHsKKworbmFtZXNwYWNlIGV4dGVuc2lvbl9kaWN0IHsKKworc3RhdGljIFB5X3NzaXplX3QgbGVuKEV4dGVuc2lvbkRpY3QqIHNlbGYpIHsKKyAgUHlfc3NpemVfdCBzaXplID0gMDsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBzZWxmLT5wYXJlbnQtPm1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TGlzdEZpZWxkcygqc2VsZi0+cGFyZW50LT5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRzKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgIGlmIChmaWVsZHNbaV0tPmlzX2V4dGVuc2lvbigpKSB7CisgICAgICAvLyBXaXRoIEMrKyBkZXNjcmlwdG9ycywgdGhlIGZpZWxkIGNhbiBhbHdheXMgYmUgcmV0cmlldmVkLCBidXQgZm9yCisgICAgICAvLyB1bmtub3duIGV4dGVuc2lvbnMgd2hpY2ggaGF2ZSBub3QgYmVlbiBpbXBvcnRlZCBpbiBQeXRob24gY29kZSwgdGhlcmUKKyAgICAgIC8vIGlzIG5vIG1lc3NhZ2UgY2xhc3MgYW5kIHdlIGNhbm5vdCByZXRyaWV2ZSB0aGUgdmFsdWUuCisgICAgICAvLyBMaXN0RmllbGRzKCkgaGFzIHRoZSBzYW1lIGJlaGF2aW9yLgorICAgICAgaWYgKGZpZWxkc1tpXS0+bWVzc2FnZV90eXBlKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICAgIG1lc3NhZ2VfZmFjdG9yeTo6R2V0TWVzc2FnZUNsYXNzKAorICAgICAgICAgICAgICBjbWVzc2FnZTo6R2V0RmFjdG9yeUZvck1lc3NhZ2Uoc2VsZi0+cGFyZW50KSwKKyAgICAgICAgICAgICAgZmllbGRzW2ldLT5tZXNzYWdlX3R5cGUoKSkgPT0gbnVsbHB0cikgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgICsrc2l6ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKK3N0cnVjdCBFeHRlbnNpb25JdGVyYXRvciB7CisgIFB5T2JqZWN0X0hFQUQ7CisgIFB5X3NzaXplX3QgaW5kZXg7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKworICAvLyBPd25lZCByZWZlcmVuY2UsIHRvIGtlZXAgdGhlIEZpZWxkRGVzY3JpcHRvcnMgYWxpdmUuCisgIEV4dGVuc2lvbkRpY3QqIGV4dGVuc2lvbl9kaWN0OworfTsKKworUHlPYmplY3QqIEdldEl0ZXIoUHlPYmplY3QqIF9zZWxmKSB7CisgIEV4dGVuc2lvbkRpY3QqIHNlbGYgPSByZWludGVycHJldF9jYXN0PEV4dGVuc2lvbkRpY3QqPihfc2VsZik7CisKKyAgU2NvcGVkUHlPYmplY3RQdHIgb2JqKFB5VHlwZV9HZW5lcmljQWxsb2MoJkV4dGVuc2lvbkl0ZXJhdG9yX1R5cGUsIDApKTsKKyAgaWYgKG9iaiA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgZXh0ZW5zaW9uIGl0ZXJhdG9yIik7CisgIH0KKworICBFeHRlbnNpb25JdGVyYXRvciogaXRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8RXh0ZW5zaW9uSXRlcmF0b3IqPihvYmouZ2V0KCkpOworCisgIC8vIENhbGwgInBsYWNlbWVudCBuZXciIHRvIGluaXRpYWxpemUuIFNvIHRoZSBjb25zdHJ1Y3RvciBvZgorICAvLyBzdGQ6OnZlY3RvcjwuLi4+IGZpZWxkcyB3aWxsIGJlIGNhbGxlZC4KKyAgbmV3IChpdGVyKSBFeHRlbnNpb25JdGVyYXRvcjsKKworICBzZWxmLT5wYXJlbnQtPm1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TGlzdEZpZWxkcygqc2VsZi0+cGFyZW50LT5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlci0+ZmllbGRzKTsKKyAgaXRlci0+aW5kZXggPSAwOworICBQeV9JTkNSRUYoc2VsZik7CisgIGl0ZXItPmV4dGVuc2lvbl9kaWN0ID0gc2VsZjsKKworICByZXR1cm4gb2JqLnJlbGVhc2UoKTsKK30KKworc3RhdGljIHZvaWQgRGVhbGxvY0V4dGVuc2lvbkl0ZXJhdG9yKFB5T2JqZWN0KiBfc2VsZikgeworICBFeHRlbnNpb25JdGVyYXRvciogc2VsZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8RXh0ZW5zaW9uSXRlcmF0b3IqPihfc2VsZik7CisgIHNlbGYtPmZpZWxkcy5jbGVhcigpOworICBQeV9YREVDUkVGKHNlbGYtPmV4dGVuc2lvbl9kaWN0KTsKKyAgc2VsZi0+fkV4dGVuc2lvbkl0ZXJhdG9yKCk7CisgIFB5X1RZUEUoX3NlbGYpLT50cF9mcmVlKF9zZWxmKTsKK30KKworUHlPYmplY3QqIHN1YnNjcmlwdChFeHRlbnNpb25EaWN0KiBzZWxmLCBQeU9iamVjdCoga2V5KSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IGNtZXNzYWdlOjpHZXRFeHRlbnNpb25EZXNjcmlwdG9yKGtleSk7CisgIGlmIChkZXNjcmlwdG9yID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoIUNoZWNrRmllbGRCZWxvbmdzVG9NZXNzYWdlKGRlc2NyaXB0b3IsIHNlbGYtPnBhcmVudC0+bWVzc2FnZSkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yLT5sYWJlbCgpICE9IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQgJiYKKyAgICAgIGRlc2NyaXB0b3ItPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICByZXR1cm4gY21lc3NhZ2U6OkludGVybmFsR2V0U2NhbGFyKHNlbGYtPnBhcmVudC0+bWVzc2FnZSwgZGVzY3JpcHRvcik7CisgIH0KKworICBDTWVzc2FnZTo6Q29tcG9zaXRlRmllbGRzTWFwOjppdGVyYXRvciBpdGVyYXRvciA9CisgICAgICBzZWxmLT5wYXJlbnQtPmNvbXBvc2l0ZV9maWVsZHMtPmZpbmQoZGVzY3JpcHRvcik7CisgIGlmIChpdGVyYXRvciAhPSBzZWxmLT5wYXJlbnQtPmNvbXBvc2l0ZV9maWVsZHMtPmVuZCgpKSB7CisgICAgUHlfSU5DUkVGKGl0ZXJhdG9yLT5zZWNvbmQpOworICAgIHJldHVybiBpdGVyYXRvci0+c2Vjb25kLT5Bc1B5T2JqZWN0KCk7CisgIH0KKworICBpZiAoZGVzY3JpcHRvci0+bGFiZWwoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEICYmCisgICAgICBkZXNjcmlwdG9yLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgLy8gVE9ETyhwbGFiYXR1dCk6IGNvbnNpZGVyIGJ1aWxkaW5nIHRoZSBjbGFzcyBvbiB0aGUgZmx5IQorICAgIENvbnRhaW5lckJhc2UqIHN1Yl9tZXNzYWdlID0gY21lc3NhZ2U6OkludGVybmFsR2V0U3ViTWVzc2FnZSgKKyAgICAgICAgc2VsZi0+cGFyZW50LCBkZXNjcmlwdG9yKTsKKyAgICBpZiAoc3ViX21lc3NhZ2UgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgICgqc2VsZi0+cGFyZW50LT5jb21wb3NpdGVfZmllbGRzKVtkZXNjcmlwdG9yXSA9IHN1Yl9tZXNzYWdlOworICAgIHJldHVybiBzdWJfbWVzc2FnZS0+QXNQeU9iamVjdCgpOworICB9CisKKyAgaWYgKGRlc2NyaXB0b3ItPmxhYmVsKCkgPT0gRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCkgeworICAgIGlmIChkZXNjcmlwdG9yLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICAvLyBPbiB0aGUgZmx5IG1lc3NhZ2UgY2xhc3MgY3JlYXRpb24gaXMgbmVlZGVkIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZworICAgICAgLy8gc2l0dWF0aW9uOgorICAgICAgLy8gMS0gYWRkIEZpbGVEZXNjcmlwdG9yIHRvIHRoZSBwb29sIHRoYXQgY29udGFpbnMgZXh0ZW5zaW9ucyBvZiBhIG1lc3NhZ2UKKyAgICAgIC8vICAgIGRlZmluZWQgYnkgYW5vdGhlciBwcm90byBmaWxlLiBEbyBub3QgY3JlYXRlIGFueSBtZXNzYWdlIGNsYXNzZXMuCisgICAgICAvLyAyLSBpbnN0YW50aWF0ZSBhbiBleHRlbmRlZCBtZXNzYWdlLCBhbmQgYWNjZXNzIHRoZSBleHRlbnNpb24gdXNpbmcKKyAgICAgIC8vICAgIHRoZSBmaWVsZCBkZXNjcmlwdG9yLgorICAgICAgLy8gMy0gdGhlIGV4dGVuc2lvbiBzdWJtZXNzYWdlIGZhaWxzIHRvIGJlIHJldHVybmVkLCBiZWNhdXNlIG5vIGNsYXNzIGhhcworICAgICAgLy8gICAgYmVlbiBjcmVhdGVkLgorICAgICAgLy8gSXQgaGFwcGVucyB3aGVuIGRlc2VyaWFsaXppbmcgdGV4dCBwcm90byBmb3JtYXQsIG9yIHdoZW4gZW51bWVyYXRpbmcKKyAgICAgIC8vIGZpZWxkcyBvZiBhIGRlc2VyaWFsaXplZCBtZXNzYWdlLgorICAgICAgQ01lc3NhZ2VDbGFzcyogbWVzc2FnZV9jbGFzcyA9IG1lc3NhZ2VfZmFjdG9yeTo6R2V0T3JDcmVhdGVNZXNzYWdlQ2xhc3MoCisgICAgICAgICAgY21lc3NhZ2U6OkdldEZhY3RvcnlGb3JNZXNzYWdlKHNlbGYtPnBhcmVudCksCisgICAgICAgICAgZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAgICAgU2NvcGVkUHlPYmplY3RQdHIgbWVzc2FnZV9jbGFzc19oYW5kbGVyKAorICAgICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4obWVzc2FnZV9jbGFzcykpOworICAgICAgaWYgKG1lc3NhZ2VfY2xhc3MgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKyAgICAgIENvbnRhaW5lckJhc2UqIHB5X2NvbnRhaW5lciA9IHJlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXI6Ok5ld0NvbnRhaW5lcigKKyAgICAgICAgICBzZWxmLT5wYXJlbnQsIGRlc2NyaXB0b3IsIG1lc3NhZ2VfY2xhc3MpOworICAgICAgaWYgKHB5X2NvbnRhaW5lciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfQorICAgICAgKCpzZWxmLT5wYXJlbnQtPmNvbXBvc2l0ZV9maWVsZHMpW2Rlc2NyaXB0b3JdID0gcHlfY29udGFpbmVyOworICAgICAgcmV0dXJuIHB5X2NvbnRhaW5lci0+QXNQeU9iamVjdCgpOworICAgIH0gZWxzZSB7CisgICAgICBDb250YWluZXJCYXNlKiBweV9jb250YWluZXIgPSByZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyOjpOZXdDb250YWluZXIoCisgICAgICAgICAgc2VsZi0+cGFyZW50LCBkZXNjcmlwdG9yKTsKKyAgICAgIGlmIChweV9jb250YWluZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKyAgICAgICgqc2VsZi0+cGFyZW50LT5jb21wb3NpdGVfZmllbGRzKVtkZXNjcmlwdG9yXSA9IHB5X2NvbnRhaW5lcjsKKyAgICAgIHJldHVybiBweV9jb250YWluZXItPkFzUHlPYmplY3QoKTsKKyAgICB9CisgIH0KKyAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJjb250cm9sIHJlYWNoZWQgdW5leHBlY3RlZCBsaW5lIik7CisgIHJldHVybiBudWxscHRyOworfQorCitpbnQgYXNzX3N1YnNjcmlwdChFeHRlbnNpb25EaWN0KiBzZWxmLCBQeU9iamVjdCoga2V5LCBQeU9iamVjdCogdmFsdWUpIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gY21lc3NhZ2U6OkdldEV4dGVuc2lvbkRlc2NyaXB0b3Ioa2V5KTsKKyAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoIUNoZWNrRmllbGRCZWxvbmdzVG9NZXNzYWdlKGRlc2NyaXB0b3IsIHNlbGYtPnBhcmVudC0+bWVzc2FnZSkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAodmFsdWUgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBjbWVzc2FnZTo6Q2xlYXJGaWVsZEJ5RGVzY3JpcHRvcihzZWxmLT5wYXJlbnQsIGRlc2NyaXB0b3IpOworICB9CisKKyAgaWYgKGRlc2NyaXB0b3ItPmxhYmVsKCkgIT0gRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTCB8fAorICAgICAgZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFeHRlbnNpb24gaXMgcmVwZWF0ZWQgYW5kL29yIGNvbXBvc2l0ZSAiCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGNtZXNzYWdlOjpBc3N1cmVXcml0YWJsZShzZWxmLT5wYXJlbnQpOworICBpZiAoY21lc3NhZ2U6OkludGVybmFsU2V0U2NhbGFyKHNlbGYtPnBhcmVudCwgZGVzY3JpcHRvciwgdmFsdWUpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworUHlPYmplY3QqIF9GaW5kRXh0ZW5zaW9uQnlOYW1lKEV4dGVuc2lvbkRpY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgY2hhciogbmFtZTsKKyAgUHlfc3NpemVfdCBuYW1lX3NpemU7CisgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJnLCAmbmFtZSwgJm5hbWVfc2l6ZSkgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBQeURlc2NyaXB0b3JQb29sKiBwb29sID0gY21lc3NhZ2U6OkdldEZhY3RvcnlGb3JNZXNzYWdlKHNlbGYtPnBhcmVudCktPnBvb2w7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWVzc2FnZV9leHRlbnNpb24gPQorICAgICAgcG9vbC0+cG9vbC0+RmluZEV4dGVuc2lvbkJ5TmFtZShTdHJpbmdQYXJhbShuYW1lLCBuYW1lX3NpemUpKTsKKyAgaWYgKG1lc3NhZ2VfZXh0ZW5zaW9uID09IG51bGxwdHIpIHsKKyAgICAvLyBJcyBpcyB0aGUgbmFtZSBvZiBhIG1lc3NhZ2Ugc2V0IGV4dGVuc2lvbj8KKyAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX2Rlc2NyaXB0b3IgPQorICAgICAgICBwb29sLT5wb29sLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoU3RyaW5nUGFyYW0obmFtZSwgbmFtZV9zaXplKSk7CisgICAgaWYgKG1lc3NhZ2VfZGVzY3JpcHRvciAmJiBtZXNzYWdlX2Rlc2NyaXB0b3ItPmV4dGVuc2lvbl9jb3VudCgpID4gMCkgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24gPSBtZXNzYWdlX2Rlc2NyaXB0b3ItPmV4dGVuc2lvbigwKTsKKyAgICAgIGlmIChleHRlbnNpb24tPmlzX2V4dGVuc2lvbigpICYmCisgICAgICAgICAgZXh0ZW5zaW9uLT5jb250YWluaW5nX3R5cGUoKS0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgJiYKKyAgICAgICAgICBleHRlbnNpb24tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSAmJgorICAgICAgICAgIGV4dGVuc2lvbi0+bGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMKSB7CisgICAgICAgIG1lc3NhZ2VfZXh0ZW5zaW9uID0gZXh0ZW5zaW9uOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAobWVzc2FnZV9leHRlbnNpb24gPT0gbnVsbHB0cikgeworICAgIFB5X1JFVFVSTl9OT05FOworICB9CisKKyAgcmV0dXJuIFB5RmllbGREZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKG1lc3NhZ2VfZXh0ZW5zaW9uKTsKK30KKworUHlPYmplY3QqIF9GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoRXh0ZW5zaW9uRGljdCogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICBpbnQ2NF90IG51bWJlciA9IFB5TG9uZ19Bc0xvbmcoYXJnKTsKKyAgaWYgKG51bWJlciA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBQeURlc2NyaXB0b3JQb29sKiBwb29sID0gY21lc3NhZ2U6OkdldEZhY3RvcnlGb3JNZXNzYWdlKHNlbGYtPnBhcmVudCktPnBvb2w7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWVzc2FnZV9leHRlbnNpb24gPSBwb29sLT5wb29sLT5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoCisgICAgICBzZWxmLT5wYXJlbnQtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSwgbnVtYmVyKTsKKyAgaWYgKG1lc3NhZ2VfZXh0ZW5zaW9uID09IG51bGxwdHIpIHsKKyAgICBQeV9SRVRVUk5fTk9ORTsKKyAgfQorCisgIHJldHVybiBQeUZpZWxkRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihtZXNzYWdlX2V4dGVuc2lvbik7Cit9CisKK3N0YXRpYyBpbnQgQ29udGFpbnMoUHlPYmplY3QqIF9zZWxmLCBQeU9iamVjdCoga2V5KSB7CisgIEV4dGVuc2lvbkRpY3QqIHNlbGYgPSByZWludGVycHJldF9jYXN0PEV4dGVuc2lvbkRpY3QqPihfc2VsZik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9CisgICAgICBjbWVzc2FnZTo6R2V0RXh0ZW5zaW9uRGVzY3JpcHRvcihrZXkpOworICBpZiAoZmllbGRfZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKCFmaWVsZF9kZXNjcmlwdG9yLT5pc19leHRlbnNpb24oKSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwgIiVzIGlzIG5vdCBhbiBleHRlbnNpb24iLAorICAgICAgICAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBjb25zdCBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+cGFyZW50LT5tZXNzYWdlOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBpZiAoZmllbGRfZGVzY3JpcHRvci0+aXNfcmVwZWF0ZWQoKSkgeworICAgIGlmIChyZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpID4gMCkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChyZWZsZWN0aW9uLT5IYXNGaWVsZCgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcikpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCitFeHRlbnNpb25EaWN0KiBOZXdFeHRlbnNpb25EaWN0KENNZXNzYWdlICpwYXJlbnQpIHsKKyAgRXh0ZW5zaW9uRGljdCogc2VsZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8RXh0ZW5zaW9uRGljdCo+KAorICAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYygmRXh0ZW5zaW9uRGljdF9UeXBlLCAwKSk7CisgIGlmIChzZWxmID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5X0lOQ1JFRihwYXJlbnQpOworICBzZWxmLT5wYXJlbnQgPSBwYXJlbnQ7CisgIHJldHVybiBzZWxmOworfQorCit2b2lkIGRlYWxsb2MoUHlPYmplY3QqIHBzZWxmKSB7CisgIEV4dGVuc2lvbkRpY3QqIHNlbGYgPSByZWludGVycHJldF9jYXN0PEV4dGVuc2lvbkRpY3QqPihwc2VsZik7CisgIFB5X0NMRUFSKHNlbGYtPnBhcmVudCk7CisgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUocmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBSaWNoQ29tcGFyZShFeHRlbnNpb25EaWN0KiBzZWxmLCBQeU9iamVjdCogb3RoZXIsIGludCBvcGlkKSB7CisgIC8vIE9ubHkgZXF1YWxpdHkgY29tcGFyaXNvbnMgYXJlIGltcGxlbWVudGVkLgorICBpZiAob3BpZCAhPSBQeV9FUSAmJiBvcGlkICE9IFB5X05FKSB7CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgIH0KKyAgYm9vbCBlcXVhbHMgPSBmYWxzZTsKKyAgaWYgKFB5T2JqZWN0X1R5cGVDaGVjayhvdGhlciwgJkV4dGVuc2lvbkRpY3RfVHlwZSkpIHsKKyAgICBlcXVhbHMgPSBzZWxmLT5wYXJlbnQgPT0gcmVpbnRlcnByZXRfY2FzdDxFeHRlbnNpb25EaWN0Kj4ob3RoZXIpLT5wYXJlbnQ7CisgIH0KKyAgaWYgKGVxdWFscyBeIChvcGlkID09IFB5X0VRKSkgeworICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBQeV9SRVRVUk5fVFJVRTsKKyAgfQorfQorc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIFNlcU1ldGhvZHMgPSB7CisgICAgKGxlbmZ1bmMpbGVuLCAgICAgICAgICAvLyBzcV9sZW5ndGgKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgIC8vIHNxX2NvbmNhdAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgLy8gc3FfcmVwZWF0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAvLyBzcV9pdGVtCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAvLyBzcV9zbGljZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgLy8gc3FfYXNzX2l0ZW0KKyAgICBudWxscHRyLCAgICAgICAgICAgICAgIC8vIHNxX2Fzc19zbGljZQorICAgIChvYmpvYmpwcm9jKUNvbnRhaW5zLCAgLy8gc3FfY29udGFpbnMKK307CisKK3N0YXRpYyBQeU1hcHBpbmdNZXRob2RzIE1wTWV0aG9kcyA9IHsKKyAgKGxlbmZ1bmMpbGVuLCAgICAgICAgICAgICAgICAvKiBtcF9sZW5ndGggKi8KKyAgKGJpbmFyeWZ1bmMpc3Vic2NyaXB0LCAgICAgICAvKiBtcF9zdWJzY3JpcHQgKi8KKyAgKG9iam9iamFyZ3Byb2MpYXNzX3N1YnNjcmlwdCwvKiBtcF9hc3Nfc3Vic2NyaXB0ICovCit9OworCisjZGVmaW5lIEVETUVUSE9EKG5hbWUsIGFyZ3MsIGRvYykgeyAjbmFtZSwgKFB5Q0Z1bmN0aW9uKW5hbWUsIGFyZ3MsIGRvYyB9CitzdGF0aWMgUHlNZXRob2REZWYgTWV0aG9kc1tdID0geworICAgIEVETUVUSE9EKF9GaW5kRXh0ZW5zaW9uQnlOYW1lLCBNRVRIX08sICJGaW5kcyBhbiBleHRlbnNpb24gYnkgbmFtZS4iKSwKKyAgICBFRE1FVEhPRChfRmluZEV4dGVuc2lvbkJ5TnVtYmVyLCBNRVRIX08sCisgICAgICAgICAgICAgIkZpbmRzIGFuIGV4dGVuc2lvbiBieSBmaWVsZCBudW1iZXIuIiksCisgICAge251bGxwdHIsIG51bGxwdHJ9LAorfTsKKworfSAgLy8gbmFtZXNwYWNlIGV4dGVuc2lvbl9kaWN0CisKK1B5VHlwZU9iamVjdCBFeHRlbnNpb25EaWN0X1R5cGUgPSB7CisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkgIC8vCisgICAgRlVMTF9NT0RVTEVfTkFNRSAiLkV4dGVuc2lvbkRpY3QiLCAgICAgIC8vIHRwX25hbWUKKyAgICBzaXplb2YoRXh0ZW5zaW9uRGljdCksICAgICAgICAgICAgICAgICAgLy8gdHBfYmFzaWNzaXplCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVtc2l6ZQorICAgIChkZXN0cnVjdG9yKWV4dGVuc2lvbl9kaWN0OjpkZWFsbG9jLCAgICAvLyAgdHBfZGVhbGxvYworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMzA4MDAwMAorICAgIG51bGxwdHIsICAvLyB0cF9wcmludAorI2Vsc2UKKyAgICAwLCAgLy8gdHBfdmVjdG9yY2FsbF9vZmZzZXQKKyNlbmRpZgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY29tcGFyZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcmVwcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfbnVtYmVyCisgICAgJmV4dGVuc2lvbl9kaWN0OjpTZXFNZXRob2RzLCAgICAgICAgICAgICAgIC8vICB0cF9hc19zZXF1ZW5jZQorICAgICZleHRlbnNpb25fZGljdDo6TXBNZXRob2RzLCAgICAgICAgICAgICAgICAvLyAgdHBfYXNfbWFwcGluZworICAgIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwgICAgICAgICAgICAgICAvLyAgdHBfaGFzaAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY2FsbAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc3RyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cm8KKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2FzX2J1ZmZlcgorICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZmxhZ3MKKyAgICAiQW4gZXh0ZW5zaW9uIGRpY3QiLCAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RvYworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfdHJhdmVyc2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NsZWFyCisgICAgKHJpY2hjbXBmdW5jKWV4dGVuc2lvbl9kaWN0OjpSaWNoQ29tcGFyZSwgIC8vICB0cF9yaWNoY29tcGFyZQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfd2Vha2xpc3RvZmZzZXQKKyAgICBleHRlbnNpb25fZGljdDo6R2V0SXRlciwgICAgICAgICAgICAgICAgICAgLy8gIHRwX2l0ZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2l0ZXJuZXh0CisgICAgZXh0ZW5zaW9uX2RpY3Q6Ok1ldGhvZHMsICAgICAgICAgICAgICAgICAgIC8vICB0cF9tZXRob2RzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9tZW1iZXJzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Jhc2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3QKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX2dldAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGVzY3Jfc2V0CisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kaWN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pbml0Cit9OworCitQeU9iamVjdCogSXRlck5leHQoUHlPYmplY3QqIF9zZWxmKSB7CisgIGV4dGVuc2lvbl9kaWN0OjpFeHRlbnNpb25JdGVyYXRvciogc2VsZiA9CisgICAgICByZWludGVycHJldF9jYXN0PGV4dGVuc2lvbl9kaWN0OjpFeHRlbnNpb25JdGVyYXRvcio+KF9zZWxmKTsKKyAgUHlfc3NpemVfdCB0b3RhbF9zaXplID0gc2VsZi0+ZmllbGRzLnNpemUoKTsKKyAgUHlfc3NpemVfdCBpbmRleCA9IHNlbGYtPmluZGV4OworICB3aGlsZSAoc2VsZi0+aW5kZXggPCB0b3RhbF9zaXplKSB7CisgICAgaW5kZXggPSBzZWxmLT5pbmRleDsKKyAgICArK3NlbGYtPmluZGV4OworICAgIGlmIChzZWxmLT5maWVsZHNbaW5kZXhdLT5pc19leHRlbnNpb24oKSkgeworICAgICAgLy8gV2l0aCBDKysgZGVzY3JpcHRvcnMsIHRoZSBmaWVsZCBjYW4gYWx3YXlzIGJlIHJldHJpZXZlZCwgYnV0IGZvcgorICAgICAgLy8gdW5rbm93biBleHRlbnNpb25zIHdoaWNoIGhhdmUgbm90IGJlZW4gaW1wb3J0ZWQgaW4gUHl0aG9uIGNvZGUsIHRoZXJlCisgICAgICAvLyBpcyBubyBtZXNzYWdlIGNsYXNzIGFuZCB3ZSBjYW5ub3QgcmV0cmlldmUgdGhlIHZhbHVlLgorICAgICAgLy8gTGlzdEZpZWxkcygpIGhhcyB0aGUgc2FtZSBiZWhhdmlvci4KKyAgICAgIGlmIChzZWxmLT5maWVsZHNbaW5kZXhdLT5tZXNzYWdlX3R5cGUoKSAhPSBudWxscHRyICYmCisgICAgICAgICAgbWVzc2FnZV9mYWN0b3J5OjpHZXRNZXNzYWdlQ2xhc3MoCisgICAgICAgICAgICAgIGNtZXNzYWdlOjpHZXRGYWN0b3J5Rm9yTWVzc2FnZShzZWxmLT5leHRlbnNpb25fZGljdC0+cGFyZW50KSwKKyAgICAgICAgICAgICAgc2VsZi0+ZmllbGRzW2luZGV4XS0+bWVzc2FnZV90eXBlKCkpID09IG51bGxwdHIpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHJldHVybiBQeUZpZWxkRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihzZWxmLT5maWVsZHNbaW5kZXhdKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gbnVsbHB0cjsKK30KKworUHlUeXBlT2JqZWN0IEV4dGVuc2lvbkl0ZXJhdG9yX1R5cGUgPSB7CisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkgICAgICAvLworICAgIEZVTExfTU9EVUxFX05BTUUgIi5FeHRlbnNpb25JdGVyYXRvciIsICAgICAgLy8gIHRwX25hbWUKKyAgICBzaXplb2YoZXh0ZW5zaW9uX2RpY3Q6OkV4dGVuc2lvbkl0ZXJhdG9yKSwgIC8vICB0cF9iYXNpY3NpemUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVtc2l6ZQorICAgIGV4dGVuc2lvbl9kaWN0OjpEZWFsbG9jRXh0ZW5zaW9uSXRlcmF0b3IsICAgLy8gIHRwX2RlYWxsb2MKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwODAwMDAKKyAgICBudWxscHRyLCAgLy8gdHBfcHJpbnQKKyNlbHNlCisgICAgMCwgIC8vIHRwX3ZlY3RvcmNhbGxfb2Zmc2V0CisjZW5kaWYKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgLy8gIHRwX2NvbXBhcmUKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgIC8vICB0cF9yZXByCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfbnVtYmVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfc2VxdWVuY2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19tYXBwaW5nCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAvLyAgdHBfaGFzaAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgLy8gIHRwX2NhbGwKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgIC8vICB0cF9zdHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgLy8gIHRwX3NldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfYnVmZmVyCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAvLyAgdHBfZmxhZ3MKKyAgICAiQSBzY2FsYXIgbWFwIGl0ZXJhdG9yIiwgIC8vICB0cF9kb2MKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgIC8vICB0cF90cmF2ZXJzZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgLy8gIHRwX2NsZWFyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAvLyAgdHBfcmljaGNvbXBhcmUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF93ZWFrbGlzdG9mZnNldAorICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgLy8gIHRwX2l0ZXIKKyAgICBJdGVyTmV4dCwgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVybmV4dAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgLy8gIHRwX21ldGhvZHMKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgIC8vICB0cF9tZW1iZXJzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0c2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAvLyAgdHBfYmFzZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3QKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9nZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9zZXQKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kaWN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAvLyAgdHBfaW5pdAorfTsKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9leHRlbnNpb25fZGljdC5oIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9leHRlbnNpb25fZGljdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZDI0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2V4dGVuc2lvbl9kaWN0LmgKQEAgLTAsMCArMSw3MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogYW51cmFhZ0Bnb29nbGUuY29tIChBbnVyYWFnIEFncmF3YWwpCisvLyBBdXRob3I6IHRpYmVsbEBnb29nbGUuY29tIChKb2hhbiBUaWJlbGwpCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfRVhURU5TSU9OX0RJQ1RfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX0VYVEVOU0lPTl9ESUNUX0hfXworCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgTWVzc2FnZTsKK2NsYXNzIEZpZWxkRGVzY3JpcHRvcjsKKworbmFtZXNwYWNlIHB5dGhvbiB7CisKK3R5cGVkZWYgc3RydWN0IEV4dGVuc2lvbkRpY3QgeworICBQeU9iamVjdF9IRUFEOworCisgIC8vIFN0cm9uZywgb3duZWQgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgbWVzc2FnZS4gTmV2ZXIgTlVMTC4KKyAgQ01lc3NhZ2UqIHBhcmVudDsKK30gRXh0ZW5zaW9uRGljdDsKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBFeHRlbnNpb25EaWN0X1R5cGU7CitleHRlcm4gUHlUeXBlT2JqZWN0IEV4dGVuc2lvbkl0ZXJhdG9yX1R5cGU7CisKK25hbWVzcGFjZSBleHRlbnNpb25fZGljdCB7CisKKy8vIEJ1aWxkcyBhbiBFeHRlbnNpb25zIGRpY3QgZm9yIGEgc3BlY2lmaWMgbWVzc2FnZS4KK0V4dGVuc2lvbkRpY3QqIE5ld0V4dGVuc2lvbkRpY3QoQ01lc3NhZ2UgKnBhcmVudCk7CisKK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb25fZGljdAorfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfRVhURU5TSU9OX0RJQ1RfSF9fCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2ZpZWxkLmNjIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9maWVsZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDNiMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9maWVsZC5jYwpAQCAtMCwwICsxLDE0MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZmllbGQuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgcHl0aG9uIHsKKworbmFtZXNwYWNlIGZpZWxkIHsKKworc3RhdGljIFB5T2JqZWN0KiBSZXByKFB5TWVzc2FnZUZpZWxkUHJvcGVydHkqIHNlbGYpIHsKKyAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tRm9ybWF0KCI8ZmllbGQgcHJvcGVydHkgJyVzJz4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmllbGRfZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkuY19zdHIoKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogRGVzY3JHZXQoUHlNZXNzYWdlRmllbGRQcm9wZXJ0eSogc2VsZiwgUHlPYmplY3QqIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHR5cGUpIHsKKyAgaWYgKG9iaiA9PSBudWxscHRyKSB7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZik7CisgIH0KKyAgcmV0dXJuIGNtZXNzYWdlOjpHZXRGaWVsZFZhbHVlKHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPihvYmopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmllbGRfZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBpbnQgRGVzY3JTZXQoUHlNZXNzYWdlRmllbGRQcm9wZXJ0eSogc2VsZiwgUHlPYmplY3QqIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHZhbHVlKSB7CisgIGlmICh2YWx1ZSA9PSBudWxscHRyKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAiQ2Fubm90IGRlbGV0ZSBmaWVsZCBhdHRyaWJ1dGUiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIGNtZXNzYWdlOjpTZXRGaWVsZFZhbHVlKHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPihvYmopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldERlc2NyaXB0b3IoUHlNZXNzYWdlRmllbGRQcm9wZXJ0eSogc2VsZiwgdm9pZCogY2xvc3VyZSkgeworICByZXR1cm4gUHlGaWVsZERlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3Ioc2VsZi0+ZmllbGRfZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RG9jKFB5TWVzc2FnZUZpZWxkUHJvcGVydHkqIHNlbGYsIHZvaWQqIGNsb3N1cmUpIHsKKyAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tRm9ybWF0KCJGaWVsZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5maWVsZF9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKK30KKworc3RhdGljIFB5R2V0U2V0RGVmIEdldHRlcnNbXSA9IHsKKyAgICB7IkRFU0NSSVBUT1IiLCAoZ2V0dGVyKUdldERlc2NyaXB0b3IsIG51bGxwdHIsICJGaWVsZCBkZXNjcmlwdG9yIn0sCisgICAgeyJfX2RvY19fIiwgKGdldHRlcilHZXREb2MsIG51bGxwdHIsIG51bGxwdHJ9LAorICAgIHtudWxscHRyfSwKK307Cit9ICAvLyBuYW1lc3BhY2UgZmllbGQKKworc3RhdGljIFB5VHlwZU9iamVjdCBfQ0ZpZWxkUHJvcGVydHlfVHlwZSA9IHsKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKSAgLy8gaGVhZAorICAgIEZVTExfTU9EVUxFX05BTUUgIi5GaWVsZFByb3BlcnR5IiwgICAgICAvLyB0cF9uYW1lCisgICAgc2l6ZW9mKFB5TWVzc2FnZUZpZWxkUHJvcGVydHkpLCAgICAgICAgIC8vIHRwX2Jhc2ljc2l6ZQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVtc2l6ZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZWFsbG9jCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDgwMDAwCisgICAgbnVsbHB0ciwgIC8vIHRwX3ByaW50CisjZWxzZQorICAgIDAsICAvLyB0cF92ZWN0b3JjYWxsX29mZnNldAorI2VuZGlmCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jb21wYXJlCisgICAgKHJlcHJmdW5jKWZpZWxkOjpSZXByLCAgICAgICAgICAvLyB0cF9yZXByCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19udW1iZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX3NlcXVlbmNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19tYXBwaW5nCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9oYXNoCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jYWxsCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zdHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfYnVmZmVyCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAvLyB0cF9mbGFncworICAgICJGaWVsZCBwcm9wZXJ0eSBvZiBhIE1lc3NhZ2UiLCAgLy8gdHBfZG9jCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF90cmF2ZXJzZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2xlYXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JpY2hjb21wYXJlCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF93ZWFrbGlzdG9mZnNldAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcm5leHQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21ldGhvZHMKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21lbWJlcnMKKyAgICBmaWVsZDo6R2V0dGVycywgICAgICAgICAgICAgICAgIC8vIHRwX2dldHNldAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYmFzZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGljdAorICAgIChkZXNjcmdldGZ1bmMpZmllbGQ6OkRlc2NyR2V0LCAgLy8gdHBfZGVzY3JfZ2V0CisgICAgKGRlc2Nyc2V0ZnVuYylmaWVsZDo6RGVzY3JTZXQsICAvLyB0cF9kZXNjcl9zZXQKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RpY3RvZmZzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2luaXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FsbG9jCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9uZXcKK307CitQeVR5cGVPYmplY3QqIENGaWVsZFByb3BlcnR5X1R5cGUgPSAmX0NGaWVsZFByb3BlcnR5X1R5cGU7CisKK1B5T2JqZWN0KiBOZXdGaWVsZFByb3BlcnR5KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcikgeworICAvLyBDcmVhdGUgYSBuZXcgZGVzY3JpcHRvciBvYmplY3QKKyAgUHlNZXNzYWdlRmllbGRQcm9wZXJ0eSogcHJvcGVydHkgPQorICAgICAgUHlPYmplY3RfTmV3KFB5TWVzc2FnZUZpZWxkUHJvcGVydHksIENGaWVsZFByb3BlcnR5X1R5cGUpOworICBpZiAocHJvcGVydHkgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHByb3BlcnR5LT5maWVsZF9kZXNjcmlwdG9yID0gZmllbGRfZGVzY3JpcHRvcjsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihwcm9wZXJ0eSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9maWVsZC5oIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Zjk0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2ZpZWxkLmgKQEAgLTAsMCArMSw2MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX0ZJRUxEX0hfXworCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitjbGFzcyBGaWVsZERlc2NyaXB0b3I7CisKK25hbWVzcGFjZSBweXRob24geworCisvLyBBIGRhdGEgZGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBmaWVsZCBpbiBhIE1lc3NhZ2UgY2xhc3MuCitzdHJ1Y3QgUHlNZXNzYWdlRmllbGRQcm9wZXJ0eSB7CisgIFB5T2JqZWN0X0hFQUQ7CisKKyAgLy8gVGhpcyBwb2ludGVyIGlzIG93bmVkIGJ5IHRoZSBzYW1lIHBvb2wgYXMgdGhlIE1lc3NhZ2UgY2xhc3MgaXQgYmVsb25ncyB0by4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yOworfTsKKworZXh0ZXJuIFB5VHlwZU9iamVjdCogQ0ZpZWxkUHJvcGVydHlfVHlwZTsKKworUHlPYmplY3QqIE5ld0ZpZWxkUHJvcGVydHkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yKTsKKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfRklFTERfSF9fCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21hcF9jb250YWluZXIuY2MgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21hcF9jb250YWluZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhNjg4OAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvbWFwX2NvbnRhaW5lci5jYwpAQCAtMCwwICsxLDkzMSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogaGFiZXJtYW5AZ29vZ2xlLmNvbSAoSm9zaCBIYWJlcm1hbikKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9tYXBfY29udGFpbmVyLmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXAuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlX2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9zY29wZWRfcHlvYmplY3RfcHRyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBweXRob24geworCisvLyBGdW5jdGlvbnMgdGhhdCBuZWVkIGFjY2VzcyB0byBtYXAgcmVmbGVjdGlvbiBmdW5jdGlvbmFsaXR5LgorLy8gVGhleSBuZWVkIHRvIGJlIGNvbnRhaW5lZCBpbiB0aGlzIGNsYXNzIGJlY2F1c2UgaXQgaXMgZnJpZW5kZWQuCitjbGFzcyBNYXBSZWZsZWN0aW9uRnJpZW5kIHsKKyBwdWJsaWM6CisgIC8vIE1ldGhvZHMgdGhhdCBhcmUgaW4gY29tbW9uIGJldHdlZW4gdGhlIG1hcCB0eXBlcy4KKyAgc3RhdGljIFB5T2JqZWN0KiBDb250YWlucyhQeU9iamVjdCogX3NlbGYsIFB5T2JqZWN0KiBrZXkpOworICBzdGF0aWMgUHlfc3NpemVfdCBMZW5ndGgoUHlPYmplY3QqIF9zZWxmKTsKKyAgc3RhdGljIFB5T2JqZWN0KiBHZXRJdGVyYXRvcihQeU9iamVjdCAqX3NlbGYpOworICBzdGF0aWMgUHlPYmplY3QqIEl0ZXJOZXh0KFB5T2JqZWN0KiBfc2VsZik7CisgIHN0YXRpYyBQeU9iamVjdCogTWVyZ2VGcm9tKFB5T2JqZWN0KiBfc2VsZiwgUHlPYmplY3QqIGFyZyk7CisKKyAgLy8gTWV0aG9kcyB0aGF0IGRpZmZlciBiZXR3ZWVuIHRoZSBtYXAgdHlwZXMuCisgIHN0YXRpYyBQeU9iamVjdCogU2NhbGFyTWFwR2V0SXRlbShQeU9iamVjdCogX3NlbGYsIFB5T2JqZWN0KiBrZXkpOworICBzdGF0aWMgUHlPYmplY3QqIE1lc3NhZ2VNYXBHZXRJdGVtKFB5T2JqZWN0KiBfc2VsZiwgUHlPYmplY3QqIGtleSk7CisgIHN0YXRpYyBpbnQgU2NhbGFyTWFwU2V0SXRlbShQeU9iamVjdCogX3NlbGYsIFB5T2JqZWN0KiBrZXksIFB5T2JqZWN0KiB2KTsKKyAgc3RhdGljIGludCBNZXNzYWdlTWFwU2V0SXRlbShQeU9iamVjdCogX3NlbGYsIFB5T2JqZWN0KiBrZXksIFB5T2JqZWN0KiB2KTsKKyAgc3RhdGljIFB5T2JqZWN0KiBTY2FsYXJNYXBUb1N0cihQeU9iamVjdCogX3NlbGYpOworICBzdGF0aWMgUHlPYmplY3QqIE1lc3NhZ2VNYXBUb1N0cihQeU9iamVjdCogX3NlbGYpOworfTsKKworc3RydWN0IE1hcEl0ZXJhdG9yIHsKKyAgUHlPYmplY3RfSEVBRDsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Ojpnb29nbGU6OnByb3RvYnVmOjpNYXBJdGVyYXRvcj4gaXRlcjsKKworICAvLyBBIHBvaW50ZXIgYmFjayB0byB0aGUgY29udGFpbmVyLCBzbyB3ZSBjYW4gbm90aWNlIGNoYW5nZXMgdG8gdGhlIHZlcnNpb24uCisgIC8vIFdlIG93biBhIHJlZiBvbiB0aGlzLgorICBNYXBDb250YWluZXIqIGNvbnRhaW5lcjsKKworICAvLyBXZSBuZWVkIHRvIGtlZXAgYSByZWYgb24gdGhlIHBhcmVudCBNZXNzYWdlIHRvbywgYmVjYXVzZQorICAvLyBNYXBJdGVyYXRvcjo6fk1hcEl0ZXJhdG9yKCkgYWNjZXNzZXMgaXQuICBOb3JtYWxseSB0aGlzIHdvdWxkIGJlIG9rIGJlY2F1c2UKKyAgLy8gdGhlIHJlZiBvbiBjb250YWluZXIgKGFib3ZlKSB3b3VsZCBndWFyYW50ZWUgb3V0bGl2ZSBzZW1hbnRpY3MuICBIb3dldmVyIGluCisgIC8vIHRoZSBjYXNlIG9mIENsZWFyRmllbGQoKSwgdGhlIE1hcENvbnRhaW5lciBwb2ludHMgdG8gYSBkaWZmZXJlbnQgbWVzc2FnZSwKKyAgLy8gYSBjb3B5IG9mIHRoZSBvcmlnaW5hbC4gIEJ1dCBvdXIgaXRlcmF0b3Igc3RpbGwgcG9pbnRzIHRvIHRoZSBvcmlnaW5hbCwKKyAgLy8gd2hpY2ggY291bGQgbm93IGdldCBkZWxldGVkIGJlZm9yZSB1cy4KKyAgLy8KKyAgLy8gVG8gcHJldmVudCB0aGlzLCB3ZSBlbnN1cmUgdGhhdCB0aGUgTWVzc2FnZSB3aWxsIGFsd2F5cyBzdGF5IGFsaXZlIGFzIGxvbmcKKyAgLy8gYXMgdGhpcyBpdGVyYXRvciBkb2VzLiAgVGhpcyBpcyBzb2xlbHkgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSBNYXBJdGVyYXRvcgorICAvLyBkZXN0cnVjdG9yIC0tIHdlIHNob3VsZCBuZXZlciBhY3R1YWxseSBhY2Nlc3MgdGhlIGl0ZXJhdG9yIGluIHRoaXMgc3RhdGUKKyAgLy8gZXhjZXB0IHRvIGRlbGV0ZSBpdC4KKyAgQ01lc3NhZ2UqIHBhcmVudDsKKyAgLy8gVGhlIHZlcnNpb24gb2YgdGhlIG1hcCB3aGVuIHdlIHRvb2sgdGhlIGl0ZXJhdG9yIHRvIGl0LgorICAvLworICAvLyBXZSBzdG9yZSB0aGlzIHNvIHRoYXQgaWYgdGhlIG1hcCBpcyBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uIHdlIGNhbiB0aHJvdworICAvLyBhbiBlcnJvci4KKyAgdWludDY0X3QgdmVyc2lvbjsKK307CisKK01lc3NhZ2UqIE1hcENvbnRhaW5lcjo6R2V0TXV0YWJsZU1lc3NhZ2UoKSB7CisgIGNtZXNzYWdlOjpBc3N1cmVXcml0YWJsZShwYXJlbnQpOworICByZXR1cm4gcGFyZW50LT5tZXNzYWdlOworfQorCisvLyBDb25zdW1lcyBhIHJlZmVyZW5jZSBvbiB0aGUgUHl0aG9uIHN0cmluZyBvYmplY3QuCitzdGF0aWMgYm9vbCBQeVN0cmluZ1RvU1RMKFB5T2JqZWN0KiBweV9zdHJpbmcsIHN0ZDo6c3RyaW5nKiBzdGxfc3RyaW5nKSB7CisgIGNoYXIgKnZhbHVlOworICBQeV9zc2l6ZV90IHZhbHVlX2xlbjsKKworICBpZiAoIXB5X3N0cmluZykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUocHlfc3RyaW5nLCAmdmFsdWUsICZ2YWx1ZV9sZW4pIDwgMCkgeworICAgIFB5X0RFQ1JFRihweV9zdHJpbmcpOworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBzdGxfc3RyaW5nLT5hc3NpZ24odmFsdWUsIHZhbHVlX2xlbik7CisgICAgUHlfREVDUkVGKHB5X3N0cmluZyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKworc3RhdGljIGJvb2wgUHl0aG9uVG9NYXBLZXkoTWFwQ29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogb2JqLCBNYXBLZXkqIGtleSkgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPQorICAgICAgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLT5tYXBfa2V5KCk7CisgIHN3aXRjaCAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDMyKG9iaiwgdmFsdWUsIGZhbHNlKTsKKyAgICAgIGtleS0+U2V0SW50MzJWYWx1ZSh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UNjQob2JqLCB2YWx1ZSwgZmFsc2UpOworICAgICAga2V5LT5TZXRJbnQ2NFZhbHVlKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfVUlOVDMyKG9iaiwgdmFsdWUsIGZhbHNlKTsKKyAgICAgIGtleS0+U2V0VUludDMyVmFsdWUodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9VSU5UNjQob2JqLCB2YWx1ZSwgZmFsc2UpOworICAgICAga2V5LT5TZXRVSW50NjRWYWx1ZSh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9CT09MKG9iaiwgdmFsdWUsIGZhbHNlKTsKKyAgICAgIGtleS0+U2V0Qm9vbFZhbHVlKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKKyAgICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICAgIGlmICghUHlTdHJpbmdUb1NUTChDaGVja1N0cmluZyhvYmosIGZpZWxkX2Rlc2NyaXB0b3IpLCAmc3RyKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBrZXktPlNldFN0cmluZ1ZhbHVlKHN0cik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICBQeUV4Y19TeXN0ZW1FcnJvciwgIlR5cGUgJWQgY2Fubm90IGJlIGEgbWFwIGtleSIsCisgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogTWFwS2V5VG9QeXRob24oTWFwQ29udGFpbmVyKiBzZWxmLCBjb25zdCBNYXBLZXkmIGtleSkgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPQorICAgICAgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLT5tYXBfa2V5KCk7CisgIHN3aXRjaCAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhrZXkuR2V0SW50MzJWYWx1ZSgpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKGtleS5HZXRJbnQ2NFZhbHVlKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiBQeUxvbmdfRnJvbVNpemVfdChrZXkuR2V0VUludDMyVmFsdWUoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyhrZXkuR2V0VUludDY0VmFsdWUoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKKyAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoa2V5LkdldEJvb2xWYWx1ZSgpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gVG9TdHJpbmdPYmplY3QoZmllbGRfZGVzY3JpcHRvciwga2V5LkdldFN0cmluZ1ZhbHVlKCkpOworICAgIGRlZmF1bHQ6CisgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsICJDb3VsZG4ndCBjb252ZXJ0IHR5cGUgJWQgdG8gdmFsdWUiLAorICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK30KKworLy8gVGhpcyBpcyBvbmx5IHVzZWQgZm9yIFNjYWxhck1hcCwgc28gd2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgdGhlCisvLyBDUFBUWVBFX01FU1NBR0UgY2FzZS4KK1B5T2JqZWN0KiBNYXBWYWx1ZVJlZlRvUHl0aG9uKE1hcENvbnRhaW5lciogc2VsZiwgY29uc3QgTWFwVmFsdWVSZWYmIHZhbHVlKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9CisgICAgICBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCktPm1hcF92YWx1ZSgpOworICBzd2l0Y2ggKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcodmFsdWUuR2V0SW50MzJWYWx1ZSgpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlLkdldEludDY0VmFsdWUoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU2l6ZV90KHZhbHVlLkdldFVJbnQzMlZhbHVlKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsdWUuR2V0VUludDY0VmFsdWUoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbHVlLkdldEZsb2F0VmFsdWUoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZS5HZXREb3VibGVWYWx1ZSgpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyh2YWx1ZS5HZXRCb29sVmFsdWUoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuIFRvU3RyaW5nT2JqZWN0KGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlLkdldFN0cmluZ1ZhbHVlKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHZhbHVlLkdldEVudW1WYWx1ZSgpKTsKKyAgICBkZWZhdWx0OgorICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLCAiQ291bGRuJ3QgY29udmVydCB0eXBlICVkIHRvIHZhbHVlIiwKKyAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICB9Cit9CisKKy8vIFRoaXMgaXMgb25seSB1c2VkIGZvciBTY2FsYXJNYXAsIHNvIHdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIHRoZQorLy8gQ1BQVFlQRV9NRVNTQUdFIGNhc2UuCitzdGF0aWMgYm9vbCBQeXRob25Ub01hcFZhbHVlUmVmKE1hcENvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd191bmtub3duX2VudW1fdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBWYWx1ZVJlZiogdmFsdWVfcmVmKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9CisgICAgICBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCktPm1hcF92YWx1ZSgpOworICBzd2l0Y2ggKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9JTlQzMihvYmosIHZhbHVlLCBmYWxzZSk7CisgICAgICB2YWx1ZV9yZWYtPlNldEludDMyVmFsdWUodmFsdWUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDY0KG9iaiwgdmFsdWUsIGZhbHNlKTsKKyAgICAgIHZhbHVlX3JlZi0+U2V0SW50NjRWYWx1ZSh2YWx1ZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX1VJTlQzMihvYmosIHZhbHVlLCBmYWxzZSk7CisgICAgICB2YWx1ZV9yZWYtPlNldFVJbnQzMlZhbHVlKHZhbHVlKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfVUlOVDY0KG9iaiwgdmFsdWUsIGZhbHNlKTsKKyAgICAgIHZhbHVlX3JlZi0+U2V0VUludDY0VmFsdWUodmFsdWUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0ZMT0FUKG9iaiwgdmFsdWUsIGZhbHNlKTsKKyAgICAgIHZhbHVlX3JlZi0+U2V0RmxvYXRWYWx1ZSh2YWx1ZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0RPVUJMRShvYmosIHZhbHVlLCBmYWxzZSk7CisgICAgICB2YWx1ZV9yZWYtPlNldERvdWJsZVZhbHVlKHZhbHVlKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0JPT0wob2JqLCB2YWx1ZSwgZmFsc2UpOworICAgICAgdmFsdWVfcmVmLT5TZXRCb29sVmFsdWUodmFsdWUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgc3RkOjpzdHJpbmcgc3RyOworICAgICAgaWYgKCFQeVN0cmluZ1RvU1RMKENoZWNrU3RyaW5nKG9iaiwgZmllbGRfZGVzY3JpcHRvciksICZzdHIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHZhbHVlX3JlZi0+U2V0U3RyaW5nVmFsdWUoc3RyKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDMyKG9iaiwgdmFsdWUsIGZhbHNlKTsKKyAgICAgIGlmIChhbGxvd191bmtub3duX2VudW1fdmFsdWVzKSB7CisgICAgICAgIHZhbHVlX3JlZi0+U2V0RW51bVZhbHVlKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yID0gZmllbGRfZGVzY3JpcHRvci0+ZW51bV90eXBlKCk7CisgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUgPQorICAgICAgICAgICAgZW51bV9kZXNjcmlwdG9yLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7CisgICAgICAgIGlmIChlbnVtX3ZhbHVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICB2YWx1ZV9yZWYtPlNldEVudW1WYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJVbmtub3duIGVudW0gdmFsdWU6ICVkIiwgdmFsdWUpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsICJTZXR0aW5nIHZhbHVlIHRvIGEgZmllbGQgb2YgdW5rbm93biB0eXBlICVkIiwKKyAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvLyBNYXAgbWV0aG9kcyBjb21tb24gdG8gU2NhbGFyTWFwIGFuZCBNZXNzYWdlTWFwIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgTWFwQ29udGFpbmVyKiBHZXRNYXAoUHlPYmplY3QqIG9iaikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxNYXBDb250YWluZXIqPihvYmopOworfQorCitQeV9zc2l6ZV90IE1hcFJlZmxlY3Rpb25GcmllbmQ6Okxlbmd0aChQeU9iamVjdCogX3NlbGYpIHsKKyAgTWFwQ29udGFpbmVyKiBzZWxmID0gR2V0TWFwKF9zZWxmKTsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPnBhcmVudC0+bWVzc2FnZTsKKyAgcmV0dXJuIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TWFwU2l6ZSgqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvcik7Cit9CisKK1B5T2JqZWN0KiBDbGVhcihQeU9iamVjdCogX3NlbGYpIHsKKyAgTWFwQ29udGFpbmVyKiBzZWxmID0gR2V0TWFwKF9zZWxmKTsKKyAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPkdldE11dGFibGVNZXNzYWdlKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgcmVmbGVjdGlvbi0+Q2xlYXJGaWVsZChtZXNzYWdlLCBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvcik7CisKKyAgUHlfUkVUVVJOX05PTkU7Cit9CisKK1B5T2JqZWN0KiBHZXRFbnRyeUNsYXNzKFB5T2JqZWN0KiBfc2VsZikgeworICBNYXBDb250YWluZXIqIHNlbGYgPSBHZXRNYXAoX3NlbGYpOworICBDTWVzc2FnZUNsYXNzKiBtZXNzYWdlX2NsYXNzID0gbWVzc2FnZV9mYWN0b3J5OjpHZXRNZXNzYWdlQ2xhc3MoCisgICAgICBjbWVzc2FnZTo6R2V0RmFjdG9yeUZvck1lc3NhZ2Uoc2VsZi0+cGFyZW50KSwKKyAgICAgIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKSk7CisgIFB5X1hJTkNSRUYobWVzc2FnZV9jbGFzcyk7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4obWVzc2FnZV9jbGFzcyk7Cit9CisKK1B5T2JqZWN0KiBNYXBSZWZsZWN0aW9uRnJpZW5kOjpNZXJnZUZyb20oUHlPYmplY3QqIF9zZWxmLCBQeU9iamVjdCogYXJnKSB7CisgIE1hcENvbnRhaW5lciogc2VsZiA9IEdldE1hcChfc2VsZik7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKGFyZywgU2NhbGFyTWFwQ29udGFpbmVyX1R5cGUpICYmCisgICAgICAhUHlPYmplY3RfVHlwZUNoZWNrKGFyZywgTWVzc2FnZU1hcENvbnRhaW5lcl9UeXBlKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgIk5vdCBhIG1hcCBmaWVsZCIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIE1hcENvbnRhaW5lciogb3RoZXJfbWFwID0gR2V0TWFwKGFyZyk7CisgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5HZXRNdXRhYmxlTWVzc2FnZSgpOworICBjb25zdCBNZXNzYWdlKiBvdGhlcl9tZXNzYWdlID0gb3RoZXJfbWFwLT5wYXJlbnQtPm1lc3NhZ2U7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIG90aGVyX3JlZmxlY3Rpb24gPSBvdGhlcl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIGludGVybmFsOjpNYXBGaWVsZEJhc2UqIGZpZWxkID0gcmVmbGVjdGlvbi0+TXV0YWJsZU1hcERhdGEoCisgICAgICBtZXNzYWdlLCBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvcik7CisgIGNvbnN0IGludGVybmFsOjpNYXBGaWVsZEJhc2UqIG90aGVyX2ZpZWxkID0gb3RoZXJfcmVmbGVjdGlvbi0+R2V0TWFwRGF0YSgKKyAgICAgICpvdGhlcl9tZXNzYWdlLCBvdGhlcl9tYXAtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKKyAgZmllbGQtPk1lcmdlRnJvbSgqb3RoZXJfZmllbGQpOworICBzZWxmLT52ZXJzaW9uKys7CisgIFB5X1JFVFVSTl9OT05FOworfQorCitQeU9iamVjdCogTWFwUmVmbGVjdGlvbkZyaWVuZDo6Q29udGFpbnMoUHlPYmplY3QqIF9zZWxmLCBQeU9iamVjdCoga2V5KSB7CisgIE1hcENvbnRhaW5lciogc2VsZiA9IEdldE1hcChfc2VsZik7CisKKyAgY29uc3QgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPnBhcmVudC0+bWVzc2FnZTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgTWFwS2V5IG1hcF9rZXk7CisKKyAgaWYgKCFQeXRob25Ub01hcEtleShzZWxmLCBrZXksICZtYXBfa2V5KSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgaWYgKHJlZmxlY3Rpb24tPkNvbnRhaW5zTWFwS2V5KCptZXNzYWdlLCBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXkpKSB7CisgICAgUHlfUkVUVVJOX1RSVUU7CisgIH0gZWxzZSB7CisgICAgUHlfUkVUVVJOX0ZBTFNFOworICB9Cit9CisKKy8vIFNjYWxhck1hcCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK01hcENvbnRhaW5lciogTmV3U2NhbGFyTWFwQ29udGFpbmVyKAorICAgIENNZXNzYWdlKiBwYXJlbnQsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogcGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IpIHsKKyAgaWYgKCFDaGVja0ZpZWxkQmVsb25nc1RvTWVzc2FnZShwYXJlbnRfZmllbGRfZGVzY3JpcHRvciwgcGFyZW50LT5tZXNzYWdlKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgUHlPYmplY3QqIG9iaihQeVR5cGVfR2VuZXJpY0FsbG9jKFNjYWxhck1hcENvbnRhaW5lcl9UeXBlLCAwKSk7CisgIGlmIChvYmogPT0gbnVsbHB0cikgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgbmV3IGNvbnRhaW5lci4iKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIE1hcENvbnRhaW5lciogc2VsZiA9IEdldE1hcChvYmopOworCisgIFB5X0lOQ1JFRihwYXJlbnQpOworICBzZWxmLT5wYXJlbnQgPSBwYXJlbnQ7CisgIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yID0gcGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3I7CisgIHNlbGYtPnZlcnNpb24gPSAwOworCisgIHJldHVybiBzZWxmOworfQorCitQeU9iamVjdCogTWFwUmVmbGVjdGlvbkZyaWVuZDo6U2NhbGFyTWFwR2V0SXRlbShQeU9iamVjdCogX3NlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCoga2V5KSB7CisgIE1hcENvbnRhaW5lciogc2VsZiA9IEdldE1hcChfc2VsZik7CisKKyAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPkdldE11dGFibGVNZXNzYWdlKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIE1hcEtleSBtYXBfa2V5OworICBNYXBWYWx1ZVJlZiB2YWx1ZTsKKworICBpZiAoIVB5dGhvblRvTWFwS2V5KHNlbGYsIGtleSwgJm1hcF9rZXkpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBpZiAocmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSwgJnZhbHVlKSkgeworICAgIHNlbGYtPnZlcnNpb24rKzsKKyAgfQorCisgIHJldHVybiBNYXBWYWx1ZVJlZlRvUHl0aG9uKHNlbGYsIHZhbHVlKTsKK30KKworaW50IE1hcFJlZmxlY3Rpb25GcmllbmQ6OlNjYWxhck1hcFNldEl0ZW0oUHlPYmplY3QqIF9zZWxmLCBQeU9iamVjdCoga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHYpIHsKKyAgTWFwQ29udGFpbmVyKiBzZWxmID0gR2V0TWFwKF9zZWxmKTsKKworICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+R2V0TXV0YWJsZU1lc3NhZ2UoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgTWFwS2V5IG1hcF9rZXk7CisgIE1hcFZhbHVlUmVmIHZhbHVlOworCisgIGlmICghUHl0aG9uVG9NYXBLZXkoc2VsZiwga2V5LCAmbWFwX2tleSkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAodikgeworICAgIC8vIFNldCBpdGVtIHRvIHYuCisgICAgaWYgKHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUoCisgICAgICAgICAgICBtZXNzYWdlLCBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciwgbWFwX2tleSwgJnZhbHVlKSkgeworICAgICAgc2VsZi0+dmVyc2lvbisrOworICAgIH0KKworICAgIGlmICghUHl0aG9uVG9NYXBWYWx1ZVJlZihzZWxmLCB2LCByZWZsZWN0aW9uLT5TdXBwb3J0c1Vua25vd25FbnVtVmFsdWVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgLy8gRGVsZXRlIGtleSBmcm9tIG1hcC4KKyAgICBpZiAocmVmbGVjdGlvbi0+RGVsZXRlTWFwVmFsdWUobWVzc2FnZSwgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXkpKSB7CisgICAgICBzZWxmLT52ZXJzaW9uKys7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLCAiS2V5IG5vdCBwcmVzZW50IGluIG1hcCIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgUHlPYmplY3QqIFNjYWxhck1hcEdldChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCoga3dhcmdzKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBrd2xpc3RbXSA9IHsia2V5IiwgImRlZmF1bHQiLCBudWxscHRyfTsKKyAgUHlPYmplY3QqIGtleTsKKyAgUHlPYmplY3QqIGRlZmF1bHRfdmFsdWUgPSBudWxscHRyOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqKj4oa3dsaXN0KSwgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRfdmFsdWUpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBTY29wZWRQeU9iamVjdFB0ciBpc19wcmVzZW50KE1hcFJlZmxlY3Rpb25GcmllbmQ6OkNvbnRhaW5zKHNlbGYsIGtleSkpOworICBpZiAoaXNfcHJlc2VudC5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBpZiAoUHlPYmplY3RfSXNUcnVlKGlzX3ByZXNlbnQuZ2V0KCkpKSB7CisgICAgcmV0dXJuIE1hcFJlZmxlY3Rpb25GcmllbmQ6OlNjYWxhck1hcEdldEl0ZW0oc2VsZiwga2V5KTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZGVmYXVsdF92YWx1ZSAhPSBudWxscHRyKSB7CisgICAgICBQeV9JTkNSRUYoZGVmYXVsdF92YWx1ZSk7CisgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQorICB9Cit9CisKK1B5T2JqZWN0KiBNYXBSZWZsZWN0aW9uRnJpZW5kOjpTY2FsYXJNYXBUb1N0cihQeU9iamVjdCogX3NlbGYpIHsKKyAgU2NvcGVkUHlPYmplY3RQdHIgZGljdChQeURpY3RfTmV3KCkpOworICBpZiAoZGljdCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgU2NvcGVkUHlPYmplY3RQdHIga2V5OworICBTY29wZWRQeU9iamVjdFB0ciB2YWx1ZTsKKworICBNYXBDb250YWluZXIqIHNlbGYgPSBHZXRNYXAoX3NlbGYpOworICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+R2V0TXV0YWJsZU1lc3NhZ2UoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgZm9yIChnb29nbGU6OnByb3RvYnVmOjpNYXBJdGVyYXRvciBpdCA9IHJlZmxlY3Rpb24tPk1hcEJlZ2luKAorICAgICAgICAgICBtZXNzYWdlLCBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvcik7CisgICAgICAgaXQgIT0gcmVmbGVjdGlvbi0+TWFwRW5kKG1lc3NhZ2UsIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKKyAgICAgICArK2l0KSB7CisgICAga2V5LnJlc2V0KE1hcEtleVRvUHl0aG9uKHNlbGYsIGl0LkdldEtleSgpKSk7CisgICAgaWYgKGtleSA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgdmFsdWUucmVzZXQoTWFwVmFsdWVSZWZUb1B5dGhvbihzZWxmLCBpdC5HZXRWYWx1ZVJlZigpKSk7CisgICAgaWYgKHZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoUHlEaWN0X1NldEl0ZW0oZGljdC5nZXQoKSwga2V5LmdldCgpLCB2YWx1ZS5nZXQoKSkgPCAwKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFB5T2JqZWN0X1JlcHIoZGljdC5nZXQoKSk7Cit9CisKK3N0YXRpYyB2b2lkIFNjYWxhck1hcERlYWxsb2MoUHlPYmplY3QqIF9zZWxmKSB7CisgIE1hcENvbnRhaW5lciogc2VsZiA9IEdldE1hcChfc2VsZik7CisgIHNlbGYtPlJlbW92ZUZyb21QYXJlbnRDYWNoZSgpOworICBQeVR5cGVPYmplY3QgKnR5cGUgPSBQeV9UWVBFKF9zZWxmKTsKKyAgdHlwZS0+dHBfZnJlZShfc2VsZik7CisgIGlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpIHsKKyAgICAvLyBXaXRoIFB5dGhvbjMsIHRoZSBNYXAgY2xhc3MgaXMgbm90IHN0YXRpYywgYW5kIG11c3QgYmUgbWFuYWdlZC4KKyAgICBQeV9ERUNSRUYodHlwZSk7CisgIH0KK30KKworc3RhdGljIFB5TWV0aG9kRGVmIFNjYWxhck1hcE1ldGhvZHNbXSA9IHsKKyAgICB7Il9fY29udGFpbnNfXyIsIE1hcFJlZmxlY3Rpb25GcmllbmQ6OkNvbnRhaW5zLCBNRVRIX08sCisgICAgICJUZXN0cyB3aGV0aGVyIGEga2V5IGlzIGEgbWVtYmVyIG9mIHRoZSBtYXAuIn0sCisgICAgeyJjbGVhciIsIChQeUNGdW5jdGlvbilDbGVhciwgTUVUSF9OT0FSR1MsCisgICAgICJSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBtYXAuIn0sCisgICAgeyJnZXQiLCAoUHlDRnVuY3Rpb24pU2NhbGFyTWFwR2V0LCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAiR2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaWYgcHJlc2VudCwgb3Igb3RoZXJ3aXNlIGEgZGVmYXVsdCJ9LAorICAgIHsiR2V0RW50cnlDbGFzcyIsIChQeUNGdW5jdGlvbilHZXRFbnRyeUNsYXNzLCBNRVRIX05PQVJHUywKKyAgICAgIlJldHVybiB0aGUgY2xhc3MgdXNlZCB0byBidWlsZCBFbnRyaWVzIG9mIChrZXksIHZhbHVlKSBwYWlycy4ifSwKKyAgICB7Ik1lcmdlRnJvbSIsIChQeUNGdW5jdGlvbilNYXBSZWZsZWN0aW9uRnJpZW5kOjpNZXJnZUZyb20sIE1FVEhfTywKKyAgICAgIk1lcmdlcyBhIG1hcCBpbnRvIHRoZSBjdXJyZW50IG1hcC4ifSwKKyAgICAvKgorICAgIHsgIl9fZGVlcGNvcHlfXyIsIChQeUNGdW5jdGlvbilEZWVwQ29weSwgTUVUSF9WQVJBUkdTLAorICAgICAgIk1ha2VzIGEgZGVlcCBjb3B5IG9mIHRoZSBjbGFzcy4iIH0sCisgICAgeyAiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilSZWR1Y2UsIE1FVEhfTk9BUkdTLAorICAgICAgIk91dHB1dHMgcGlja2xhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXBlYXRlZCBmaWVsZC4iIH0sCisgICAgKi8KKyAgICB7bnVsbHB0ciwgbnVsbHB0cn0sCit9OworCitQeVR5cGVPYmplY3QqIFNjYWxhck1hcENvbnRhaW5lcl9UeXBlOworc3RhdGljIFB5VHlwZV9TbG90IFNjYWxhck1hcENvbnRhaW5lcl9UeXBlX3Nsb3RzW10gPSB7CisgICAge1B5X3RwX2RlYWxsb2MsICh2b2lkKilTY2FsYXJNYXBEZWFsbG9jfSwKKyAgICB7UHlfbXBfbGVuZ3RoLCAodm9pZCopTWFwUmVmbGVjdGlvbkZyaWVuZDo6TGVuZ3RofSwKKyAgICB7UHlfbXBfc3Vic2NyaXB0LCAodm9pZCopTWFwUmVmbGVjdGlvbkZyaWVuZDo6U2NhbGFyTWFwR2V0SXRlbX0sCisgICAge1B5X21wX2Fzc19zdWJzY3JpcHQsICh2b2lkKilNYXBSZWZsZWN0aW9uRnJpZW5kOjpTY2FsYXJNYXBTZXRJdGVtfSwKKyAgICB7UHlfdHBfbWV0aG9kcywgKHZvaWQqKVNjYWxhck1hcE1ldGhvZHN9LAorICAgIHtQeV90cF9pdGVyLCAodm9pZCopTWFwUmVmbGVjdGlvbkZyaWVuZDo6R2V0SXRlcmF0b3J9LAorICAgIHtQeV90cF9yZXByLCAodm9pZCopTWFwUmVmbGVjdGlvbkZyaWVuZDo6U2NhbGFyTWFwVG9TdHJ9LAorICAgIHswLCBudWxscHRyfSwKK307CisKK1B5VHlwZV9TcGVjIFNjYWxhck1hcENvbnRhaW5lcl9UeXBlX3NwZWMgPSB7CisgICAgRlVMTF9NT0RVTEVfTkFNRSAiLlNjYWxhck1hcENvbnRhaW5lciIsIHNpemVvZihNYXBDb250YWluZXIpLCAwLAorICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgU2NhbGFyTWFwQ29udGFpbmVyX1R5cGVfc2xvdHN9OworCisvLyBNZXNzYWdlTWFwIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgTWVzc2FnZU1hcENvbnRhaW5lciogR2V0TWVzc2FnZU1hcChQeU9iamVjdCogb2JqKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PE1lc3NhZ2VNYXBDb250YWluZXIqPihvYmopOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldENNZXNzYWdlKE1lc3NhZ2VNYXBDb250YWluZXIqIHNlbGYsIE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgLy8gR2V0IG9yIGNyZWF0ZSB0aGUgQ01lc3NhZ2Ugb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZXNzYWdlLgorICByZXR1cm4gc2VsZi0+cGFyZW50CisgICAgICAtPkJ1aWxkU3ViTWVzc2FnZUZyb21Qb2ludGVyKHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5tZXNzYWdlX2NsYXNzKQorICAgICAgLT5Bc1B5T2JqZWN0KCk7Cit9CisKK01lc3NhZ2VNYXBDb250YWluZXIqIE5ld01lc3NhZ2VNYXBDb250YWluZXIoCisgICAgQ01lc3NhZ2UqIHBhcmVudCwgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBwYXJlbnRfZmllbGRfZGVzY3JpcHRvciwKKyAgICBDTWVzc2FnZUNsYXNzKiBtZXNzYWdlX2NsYXNzKSB7CisgIGlmICghQ2hlY2tGaWVsZEJlbG9uZ3NUb01lc3NhZ2UocGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsIHBhcmVudC0+bWVzc2FnZSkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5T2JqZWN0KiBvYmogPSBQeVR5cGVfR2VuZXJpY0FsbG9jKE1lc3NhZ2VNYXBDb250YWluZXJfVHlwZSwgMCk7CisgIGlmIChvYmogPT0gbnVsbHB0cikgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJDb3VsZCBub3QgYWxsb2NhdGUgbmV3IGNvbnRhaW5lci4iKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIE1lc3NhZ2VNYXBDb250YWluZXIqIHNlbGYgPSBHZXRNZXNzYWdlTWFwKG9iaik7CisKKyAgUHlfSU5DUkVGKHBhcmVudCk7CisgIHNlbGYtPnBhcmVudCA9IHBhcmVudDsKKyAgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IgPSBwYXJlbnRfZmllbGRfZGVzY3JpcHRvcjsKKyAgc2VsZi0+dmVyc2lvbiA9IDA7CisKKyAgUHlfSU5DUkVGKG1lc3NhZ2VfY2xhc3MpOworICBzZWxmLT5tZXNzYWdlX2NsYXNzID0gbWVzc2FnZV9jbGFzczsKKworICByZXR1cm4gc2VsZjsKK30KKworaW50IE1hcFJlZmxlY3Rpb25GcmllbmQ6Ok1lc3NhZ2VNYXBTZXRJdGVtKFB5T2JqZWN0KiBfc2VsZiwgUHlPYmplY3QqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogdikgeworICBpZiAodikgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAiRGlyZWN0IGFzc2lnbm1lbnQgb2Ygc3VibWVzc2FnZSBub3QgYWxsb3dlZCIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vIE5vdyB3ZSBrbm93IHRoYXQgdGhpcyBpcyBhIGRlbGV0ZSwgbm90IGEgc2V0LgorCisgIE1lc3NhZ2VNYXBDb250YWluZXIqIHNlbGYgPSBHZXRNZXNzYWdlTWFwKF9zZWxmKTsKKyAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPkdldE11dGFibGVNZXNzYWdlKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIE1hcEtleSBtYXBfa2V5OworICBNYXBWYWx1ZVJlZiB2YWx1ZTsKKworICBzZWxmLT52ZXJzaW9uKys7CisKKyAgaWYgKCFQeXRob25Ub01hcEtleShzZWxmLCBrZXksICZtYXBfa2V5KSkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vIERlbGV0ZSBrZXkgZnJvbSBtYXAuCisgIGlmIChyZWZsZWN0aW9uLT5Db250YWluc01hcEtleSgqbWVzc2FnZSwgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5KSkgeworICAgIC8vIERlbGV0ZSBrZXkgZnJvbSBDTWVzc2FnZSBkaWN0LgorICAgIE1hcFZhbHVlUmVmIHZhbHVlOworICAgIHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmdmFsdWUpOworICAgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlID0gdmFsdWUuTXV0YWJsZU1lc3NhZ2VWYWx1ZSgpOworICAgIC8vIElmIHRoZXJlIGlzIGEgbGl2aW5nIHdlYWsgcmVmZXJlbmNlIHRvIGFuIGl0ZW0sIHdlICJSZWxlYXNlIiBpdCwKKyAgICAvLyBvdGhlcndpc2Ugd2UganVzdCBkaXNjYXJkIHRoZSBDKysgdmFsdWUuCisgICAgaWYgKENNZXNzYWdlKiByZWxlYXNlZCA9CisgICAgICAgICAgICBzZWxmLT5wYXJlbnQtPk1heWJlUmVsZWFzZVN1Yk1lc3NhZ2Uoc3ViX21lc3NhZ2UpKSB7CisgICAgICBNZXNzYWdlKiBtc2cgPSByZWxlYXNlZC0+bWVzc2FnZTsKKyAgICAgIHJlbGVhc2VkLT5tZXNzYWdlID0gbXNnLT5OZXcoKTsKKyAgICAgIG1zZy0+R2V0UmVmbGVjdGlvbigpLT5Td2FwKG1zZywgcmVsZWFzZWQtPm1lc3NhZ2UpOworICAgIH0KKworICAgIC8vIERlbGV0ZSBrZXkgZnJvbSBtYXAuCisgICAgcmVmbGVjdGlvbi0+RGVsZXRlTWFwVmFsdWUobWVzc2FnZSwgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSk7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLCAiS2V5IG5vdCBwcmVzZW50IGluIG1hcCIpOworICAgIHJldHVybiAtMTsKKyAgfQorfQorCitQeU9iamVjdCogTWFwUmVmbGVjdGlvbkZyaWVuZDo6TWVzc2FnZU1hcEdldEl0ZW0oUHlPYmplY3QqIF9zZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBrZXkpIHsKKyAgTWVzc2FnZU1hcENvbnRhaW5lciogc2VsZiA9IEdldE1lc3NhZ2VNYXAoX3NlbGYpOworCisgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5HZXRNdXRhYmxlTWVzc2FnZSgpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBNYXBLZXkgbWFwX2tleTsKKyAgTWFwVmFsdWVSZWYgdmFsdWU7CisKKyAgaWYgKCFQeXRob25Ub01hcEtleShzZWxmLCBrZXksICZtYXBfa2V5KSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgaWYgKHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXksICZ2YWx1ZSkpIHsKKyAgICBzZWxmLT52ZXJzaW9uKys7CisgIH0KKworICByZXR1cm4gR2V0Q01lc3NhZ2Uoc2VsZiwgdmFsdWUuTXV0YWJsZU1lc3NhZ2VWYWx1ZSgpKTsKK30KKworUHlPYmplY3QqIE1hcFJlZmxlY3Rpb25GcmllbmQ6Ok1lc3NhZ2VNYXBUb1N0cihQeU9iamVjdCogX3NlbGYpIHsKKyAgU2NvcGVkUHlPYmplY3RQdHIgZGljdChQeURpY3RfTmV3KCkpOworICBpZiAoZGljdCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgU2NvcGVkUHlPYmplY3RQdHIga2V5OworICBTY29wZWRQeU9iamVjdFB0ciB2YWx1ZTsKKworICBNZXNzYWdlTWFwQ29udGFpbmVyKiBzZWxmID0gR2V0TWVzc2FnZU1hcChfc2VsZik7CisgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5HZXRNdXRhYmxlTWVzc2FnZSgpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBmb3IgKGdvb2dsZTo6cHJvdG9idWY6Ok1hcEl0ZXJhdG9yIGl0ID0gcmVmbGVjdGlvbi0+TWFwQmVnaW4oCisgICAgICAgICAgIG1lc3NhZ2UsIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKKyAgICAgICBpdCAhPSByZWZsZWN0aW9uLT5NYXBFbmQobWVzc2FnZSwgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IpOworICAgICAgICsraXQpIHsKKyAgICBrZXkucmVzZXQoTWFwS2V5VG9QeXRob24oc2VsZiwgaXQuR2V0S2V5KCkpKTsKKyAgICBpZiAoa2V5ID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICB2YWx1ZS5yZXNldChHZXRDTWVzc2FnZShzZWxmLCBpdC5NdXRhYmxlVmFsdWVSZWYoKS0+TXV0YWJsZU1lc3NhZ2VWYWx1ZSgpKSk7CisgICAgaWYgKHZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoUHlEaWN0X1NldEl0ZW0oZGljdC5nZXQoKSwga2V5LmdldCgpLCB2YWx1ZS5nZXQoKSkgPCAwKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFB5T2JqZWN0X1JlcHIoZGljdC5nZXQoKSk7Cit9CisKK1B5T2JqZWN0KiBNZXNzYWdlTWFwR2V0KFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykgeworICBzdGF0aWMgY29uc3QgY2hhcioga3dsaXN0W10gPSB7ImtleSIsICJkZWZhdWx0IiwgbnVsbHB0cn07CisgIFB5T2JqZWN0KiBrZXk7CisgIFB5T2JqZWN0KiBkZWZhdWx0X3ZhbHVlID0gbnVsbHB0cjsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKio+KGt3bGlzdCksICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0X3ZhbHVlKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgU2NvcGVkUHlPYmplY3RQdHIgaXNfcHJlc2VudChNYXBSZWZsZWN0aW9uRnJpZW5kOjpDb250YWlucyhzZWxmLCBrZXkpKTsKKyAgaWYgKGlzX3ByZXNlbnQuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgaWYgKFB5T2JqZWN0X0lzVHJ1ZShpc19wcmVzZW50LmdldCgpKSkgeworICAgIHJldHVybiBNYXBSZWZsZWN0aW9uRnJpZW5kOjpNZXNzYWdlTWFwR2V0SXRlbShzZWxmLCBrZXkpOworICB9IGVsc2UgeworICAgIGlmIChkZWZhdWx0X3ZhbHVlICE9IG51bGxwdHIpIHsKKyAgICAgIFB5X0lOQ1JFRihkZWZhdWx0X3ZhbHVlKTsKKyAgICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgTWVzc2FnZU1hcERlYWxsb2MoUHlPYmplY3QqIF9zZWxmKSB7CisgIE1lc3NhZ2VNYXBDb250YWluZXIqIHNlbGYgPSBHZXRNZXNzYWdlTWFwKF9zZWxmKTsKKyAgc2VsZi0+UmVtb3ZlRnJvbVBhcmVudENhY2hlKCk7CisgIFB5X0RFQ1JFRihzZWxmLT5tZXNzYWdlX2NsYXNzKTsKKyAgUHlUeXBlT2JqZWN0ICp0eXBlID0gUHlfVFlQRShfc2VsZik7CisgIHR5cGUtPnRwX2ZyZWUoX3NlbGYpOworICBpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSB7CisgICAgLy8gV2l0aCBQeXRob24zLCB0aGUgTWFwIGNsYXNzIGlzIG5vdCBzdGF0aWMsIGFuZCBtdXN0IGJlIG1hbmFnZWQuCisgICAgUHlfREVDUkVGKHR5cGUpOworICB9Cit9CisKK3N0YXRpYyBQeU1ldGhvZERlZiBNZXNzYWdlTWFwTWV0aG9kc1tdID0geworICAgIHsiX19jb250YWluc19fIiwgKFB5Q0Z1bmN0aW9uKU1hcFJlZmxlY3Rpb25GcmllbmQ6OkNvbnRhaW5zLCBNRVRIX08sCisgICAgICJUZXN0cyB3aGV0aGVyIHRoZSBtYXAgY29udGFpbnMgdGhpcyBlbGVtZW50LiJ9LAorICAgIHsiY2xlYXIiLCAoUHlDRnVuY3Rpb24pQ2xlYXIsIE1FVEhfTk9BUkdTLAorICAgICAiUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGUgbWFwLiJ9LAorICAgIHsiZ2V0IiwgKFB5Q0Z1bmN0aW9uKU1lc3NhZ2VNYXBHZXQsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgICJHZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpZiBwcmVzZW50LCBvciBvdGhlcndpc2UgYSBkZWZhdWx0In0sCisgICAgeyJnZXRfb3JfY3JlYXRlIiwgTWFwUmVmbGVjdGlvbkZyaWVuZDo6TWVzc2FnZU1hcEdldEl0ZW0sIE1FVEhfTywKKyAgICAgIkFsaWFzIGZvciBnZXRpdGVtLCB1c2VmdWwgdG8gbWFrZSBleHBsaWNpdCB0aGF0IHRoZSBtYXAgaXMgbXV0YXRlZC4ifSwKKyAgICB7IkdldEVudHJ5Q2xhc3MiLCAoUHlDRnVuY3Rpb24pR2V0RW50cnlDbGFzcywgTUVUSF9OT0FSR1MsCisgICAgICJSZXR1cm4gdGhlIGNsYXNzIHVzZWQgdG8gYnVpbGQgRW50cmllcyBvZiAoa2V5LCB2YWx1ZSkgcGFpcnMuIn0sCisgICAgeyJNZXJnZUZyb20iLCAoUHlDRnVuY3Rpb24pTWFwUmVmbGVjdGlvbkZyaWVuZDo6TWVyZ2VGcm9tLCBNRVRIX08sCisgICAgICJNZXJnZXMgYSBtYXAgaW50byB0aGUgY3VycmVudCBtYXAuIn0sCisgICAgLyoKKyAgICB7ICJfX2RlZXBjb3B5X18iLCAoUHlDRnVuY3Rpb24pRGVlcENvcHksIE1FVEhfVkFSQVJHUywKKyAgICAgICJNYWtlcyBhIGRlZXAgY29weSBvZiB0aGUgY2xhc3MuIiB9LAorICAgIHsgIl9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pUmVkdWNlLCBNRVRIX05PQVJHUywKKyAgICAgICJPdXRwdXRzIHBpY2tsYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVwZWF0ZWQgZmllbGQuIiB9LAorICAgICovCisgICAge251bGxwdHIsIG51bGxwdHJ9LAorfTsKKworUHlUeXBlT2JqZWN0KiBNZXNzYWdlTWFwQ29udGFpbmVyX1R5cGU7CitzdGF0aWMgUHlUeXBlX1Nsb3QgTWVzc2FnZU1hcENvbnRhaW5lcl9UeXBlX3Nsb3RzW10gPSB7CisgICAge1B5X3RwX2RlYWxsb2MsICh2b2lkKilNZXNzYWdlTWFwRGVhbGxvY30sCisgICAge1B5X21wX2xlbmd0aCwgKHZvaWQqKU1hcFJlZmxlY3Rpb25GcmllbmQ6Okxlbmd0aH0sCisgICAge1B5X21wX3N1YnNjcmlwdCwgKHZvaWQqKU1hcFJlZmxlY3Rpb25GcmllbmQ6Ok1lc3NhZ2VNYXBHZXRJdGVtfSwKKyAgICB7UHlfbXBfYXNzX3N1YnNjcmlwdCwgKHZvaWQqKU1hcFJlZmxlY3Rpb25GcmllbmQ6Ok1lc3NhZ2VNYXBTZXRJdGVtfSwKKyAgICB7UHlfdHBfbWV0aG9kcywgKHZvaWQqKU1lc3NhZ2VNYXBNZXRob2RzfSwKKyAgICB7UHlfdHBfaXRlciwgKHZvaWQqKU1hcFJlZmxlY3Rpb25GcmllbmQ6OkdldEl0ZXJhdG9yfSwKKyAgICB7UHlfdHBfcmVwciwgKHZvaWQqKU1hcFJlZmxlY3Rpb25GcmllbmQ6Ok1lc3NhZ2VNYXBUb1N0cn0sCisgICAgezAsIG51bGxwdHJ9fTsKKworUHlUeXBlX1NwZWMgTWVzc2FnZU1hcENvbnRhaW5lcl9UeXBlX3NwZWMgPSB7CisgICAgRlVMTF9NT0RVTEVfTkFNRSAiLk1lc3NhZ2VNYXBDb250YWluZXIiLCBzaXplb2YoTWVzc2FnZU1hcENvbnRhaW5lciksIDAsCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCBNZXNzYWdlTWFwQ29udGFpbmVyX1R5cGVfc2xvdHN9OworCisvLyBNYXBJdGVyYXRvciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgTWFwSXRlcmF0b3IqIEdldEl0ZXIoUHlPYmplY3QqIG9iaikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxNYXBJdGVyYXRvcio+KG9iaik7Cit9CisKK1B5T2JqZWN0KiBNYXBSZWZsZWN0aW9uRnJpZW5kOjpHZXRJdGVyYXRvcihQeU9iamVjdCAqX3NlbGYpIHsKKyAgTWFwQ29udGFpbmVyKiBzZWxmID0gR2V0TWFwKF9zZWxmKTsKKworICBTY29wZWRQeU9iamVjdFB0ciBvYmooUHlUeXBlX0dlbmVyaWNBbGxvYygmTWFwSXRlcmF0b3JfVHlwZSwgMCkpOworICBpZiAob2JqID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLCAiQ291bGQgbm90IGFsbG9jYXRlIGl0ZXJhdG9yIik7CisgIH0KKworICBNYXBJdGVyYXRvciogaXRlciA9IEdldEl0ZXIob2JqLmdldCgpKTsKKworICBQeV9JTkNSRUYoc2VsZik7CisgIGl0ZXItPmNvbnRhaW5lciA9IHNlbGY7CisgIGl0ZXItPnZlcnNpb24gPSBzZWxmLT52ZXJzaW9uOworICBQeV9JTkNSRUYoc2VsZi0+cGFyZW50KTsKKyAgaXRlci0+cGFyZW50ID0gc2VsZi0+cGFyZW50OworCisgIGlmIChNYXBSZWZsZWN0aW9uRnJpZW5kOjpMZW5ndGgoX3NlbGYpID4gMCkgeworICAgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5HZXRNdXRhYmxlTWVzc2FnZSgpOworICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgICBpdGVyLT5pdGVyLnJlc2V0KG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1hcEl0ZXJhdG9yKAorICAgICAgICByZWZsZWN0aW9uLT5NYXBCZWdpbihtZXNzYWdlLCBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvcikpKTsKKyAgfQorCisgIHJldHVybiBvYmoucmVsZWFzZSgpOworfQorCitQeU9iamVjdCogTWFwUmVmbGVjdGlvbkZyaWVuZDo6SXRlck5leHQoUHlPYmplY3QqIF9zZWxmKSB7CisgIE1hcEl0ZXJhdG9yKiBzZWxmID0gR2V0SXRlcihfc2VsZik7CisKKyAgLy8gVGhpcyB3b24ndCBjYXRjaCBtdXRhdGlvbnMgdG8gdGhlIG1hcCBwZXJmb3JtZWQgYnkgTWVyZ2VGcm9tKCk7IG5vIGVhc3kgd2F5CisgIC8vIHRvIGFkZHJlc3MgdGhhdC4KKyAgaWYgKHNlbGYtPnZlcnNpb24gIT0gc2VsZi0+Y29udGFpbmVyLT52ZXJzaW9uKSB7CisgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiTWFwIG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uIik7CisgIH0KKyAgaWYgKHNlbGYtPnBhcmVudCAhPSBzZWxmLT5jb250YWluZXItPnBhcmVudCkgeworICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk1hcCBjbGVhcmVkIGR1cmluZyBpdGVyYXRpb24uIik7CisgIH0KKworICBpZiAoc2VsZi0+aXRlci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+Y29udGFpbmVyLT5HZXRNdXRhYmxlTWVzc2FnZSgpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworCisgIGlmICgqc2VsZi0+aXRlciA9PQorICAgICAgcmVmbGVjdGlvbi0+TWFwRW5kKG1lc3NhZ2UsIHNlbGYtPmNvbnRhaW5lci0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBQeU9iamVjdCogcmV0ID0gTWFwS2V5VG9QeXRob24oc2VsZi0+Y29udGFpbmVyLCBzZWxmLT5pdGVyLT5HZXRLZXkoKSk7CisKKyAgKysoKnNlbGYtPml0ZXIpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIERlYWxsb2NNYXBJdGVyYXRvcihQeU9iamVjdCogX3NlbGYpIHsKKyAgTWFwSXRlcmF0b3IqIHNlbGYgPSBHZXRJdGVyKF9zZWxmKTsKKyAgc2VsZi0+aXRlci5yZXNldCgpOworICBQeV9DTEVBUihzZWxmLT5jb250YWluZXIpOworICBQeV9DTEVBUihzZWxmLT5wYXJlbnQpOworICBQeV9UWVBFKF9zZWxmKS0+dHBfZnJlZShfc2VsZik7Cit9CisKK1B5VHlwZU9iamVjdCBNYXBJdGVyYXRvcl9UeXBlID0geworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApIEZVTExfTU9EVUxFX05BTUUKKyAgICAiLk1hcEl0ZXJhdG9yIiwgICAgICAgLy8gIHRwX25hbWUKKyAgICBzaXplb2YoTWFwSXRlcmF0b3IpLCAgLy8gIHRwX2Jhc2ljc2l6ZQorICAgIDAsICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlbXNpemUKKyAgICBEZWFsbG9jTWFwSXRlcmF0b3IsICAgLy8gIHRwX2RlYWxsb2MKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwODAwMDAKKyAgICBudWxscHRyLCAgLy8gdHBfcHJpbnQKKyNlbHNlCisgICAgMCwgIC8vIHRwX3ZlY3RvcmNhbGxfb2Zmc2V0CisjZW5kaWYKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NvbXBhcmUKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9yZXByCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfbnVtYmVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfc2VxdWVuY2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19tYXBwaW5nCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaGFzaAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NhbGwKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9zdHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3NldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfYnVmZmVyCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAvLyAgdHBfZmxhZ3MKKyAgICAiQSBzY2FsYXIgbWFwIGl0ZXJhdG9yIiwgICAgICAgIC8vICB0cF9kb2MKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF90cmF2ZXJzZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NsZWFyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcmljaGNvbXBhcmUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF93ZWFrbGlzdG9mZnNldAorICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgLy8gIHRwX2l0ZXIKKyAgICBNYXBSZWZsZWN0aW9uRnJpZW5kOjpJdGVyTmV4dCwgIC8vICB0cF9pdGVybmV4dAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX21ldGhvZHMKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9tZW1iZXJzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0c2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYmFzZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3QKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9nZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9zZXQKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kaWN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaW5pdAorfTsKKworYm9vbCBJbml0TWFwQ29udGFpbmVycygpIHsKKyAgLy8gU2NhbGFyTWFwQ29udGFpbmVyX1R5cGUgZGVyaXZlcyBmcm9tIG91ciBNdXRhYmxlTWFwcGluZyB0eXBlLgorICBTY29wZWRQeU9iamVjdFB0ciBhYmMoUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJjb2xsZWN0aW9ucy5hYmMiKSk7CisgIGlmIChhYmMgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFNjb3BlZFB5T2JqZWN0UHRyIG11dGFibGVfbWFwcGluZygKKyAgICAgIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoYWJjLmdldCgpLCAiTXV0YWJsZU1hcHBpbmciKSk7CisgIGlmIChtdXRhYmxlX21hcHBpbmcgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFB5X0lOQ1JFRihtdXRhYmxlX21hcHBpbmcuZ2V0KCkpOworICBTY29wZWRQeU9iamVjdFB0ciBiYXNlcyhQeVR1cGxlX1BhY2soMSwgbXV0YWJsZV9tYXBwaW5nLmdldCgpKSk7CisgIGlmIChiYXNlcyA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU2NhbGFyTWFwQ29udGFpbmVyX1R5cGUgPSByZWludGVycHJldF9jYXN0PFB5VHlwZU9iamVjdCo+KAorICAgICAgUHlUeXBlX0Zyb21TcGVjV2l0aEJhc2VzKCZTY2FsYXJNYXBDb250YWluZXJfVHlwZV9zcGVjLCBiYXNlcy5nZXQoKSkpOworCisgIGlmIChQeVR5cGVfUmVhZHkoJk1hcEl0ZXJhdG9yX1R5cGUpIDwgMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIE1lc3NhZ2VNYXBDb250YWluZXJfVHlwZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlUeXBlT2JqZWN0Kj4oCisgICAgICBQeVR5cGVfRnJvbVNwZWNXaXRoQmFzZXMoJk1lc3NhZ2VNYXBDb250YWluZXJfVHlwZV9zcGVjLCBiYXNlcy5nZXQoKSkpOworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21hcF9jb250YWluZXIuaCBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvbWFwX2NvbnRhaW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMzM0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21hcF9jb250YWluZXIuaApAQCAtMCwwICsxLDg5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9NQVBfQ09OVEFJTkVSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9NQVBfQ09OVEFJTkVSX0hfXworCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitjbGFzcyBNZXNzYWdlOworCituYW1lc3BhY2UgcHl0aG9uIHsKKworc3RydWN0IENNZXNzYWdlQ2xhc3M7CisKKy8vIFRoaXMgc3RydWN0IGlzIHVzZWQgZGlyZWN0bHkgZm9yIFNjYWxhck1hcCwgYW5kIGlzIHRoZSBiYXNlIGNsYXNzIG9mCisvLyBNZXNzYWdlTWFwQ29udGFpbmVyLCB3aGljaCBpcyB1c2VkIGZvciBNZXNzYWdlTWFwLgorc3RydWN0IE1hcENvbnRhaW5lciA6IHB1YmxpYyBDb250YWluZXJCYXNlIHsKKyAgLy8gVXNlIHRvIGdldCBhIG11dGFibGUgbWVzc2FnZSB3aGVuIG5lY2Vzc2FyeS4KKyAgTWVzc2FnZSogR2V0TXV0YWJsZU1lc3NhZ2UoKTsKKworICAvLyBXZSBidW1wIHRoaXMgd2hlbmV2ZXIgd2UgcGVyZm9ybSBhIG11dGF0aW9uLCB0byBpbnZhbGlkYXRlIGV4aXN0aW5nCisgIC8vIGl0ZXJhdG9ycy4KKyAgdWludDY0X3QgdmVyc2lvbjsKK307CisKK3N0cnVjdCBNZXNzYWdlTWFwQ29udGFpbmVyIDogcHVibGljIE1hcENvbnRhaW5lciB7CisgIC8vIFRoZSB0eXBlIHVzZWQgdG8gY3JlYXRlIG5ldyBjaGlsZCBtZXNzYWdlcy4KKyAgQ01lc3NhZ2VDbGFzcyogbWVzc2FnZV9jbGFzczsKK307CisKK2Jvb2wgSW5pdE1hcENvbnRhaW5lcnMoKTsKKworZXh0ZXJuIFB5VHlwZU9iamVjdCogTWVzc2FnZU1hcENvbnRhaW5lcl9UeXBlOworZXh0ZXJuIFB5VHlwZU9iamVjdCogU2NhbGFyTWFwQ29udGFpbmVyX1R5cGU7CitleHRlcm4gUHlUeXBlT2JqZWN0IE1hcEl0ZXJhdG9yX1R5cGU7ICAvLyBCb3RoIG1hcCB0eXBlcyB1c2UgdGhlIHNhbWUgaXRlcmF0b3IuCisKKy8vIEJ1aWxkcyBhIE1hcENvbnRhaW5lciBvYmplY3QsIGZyb20gYSBwYXJlbnQgbWVzc2FnZSBhbmQgYQorLy8gZmllbGQgZGVzY3JpcHRvci4KK2V4dGVybiBNYXBDb250YWluZXIqIE5ld1NjYWxhck1hcENvbnRhaW5lcigKKyAgICBDTWVzc2FnZSogcGFyZW50LCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKKworLy8gQnVpbGRzIGEgTWVzc2FnZU1hcCBvYmplY3QsIGZyb20gYSBwYXJlbnQgbWVzc2FnZSBhbmQgYQorLy8gZmllbGQgZGVzY3JpcHRvci4KK2V4dGVybiBNZXNzYWdlTWFwQ29udGFpbmVyKiBOZXdNZXNzYWdlTWFwQ29udGFpbmVyKAorICAgIENNZXNzYWdlKiBwYXJlbnQsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsCisgICAgQ01lc3NhZ2VDbGFzcyogbWVzc2FnZV9jbGFzcyk7CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX01BUF9DT05UQUlORVJfSF9fCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2UuY2MgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0YTk1NwotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZS5jYwpAQCAtMCwwICsxLDMwNzIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGFudXJhYWdAZ29vZ2xlLmNvbSAoQW51cmFhZyBBZ3Jhd2FsKQorLy8gQXV0aG9yOiB0aWJlbGxAZ29vZ2xlLmNvbSAoSm9oYW4gVGliZWxsKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2UuaD4KKworI2luY2x1ZGUgPHN0cnVjdG1lbWJlci5oPiAgLy8gQSBQeXRob24gaGVhZGVyIGZpbGUuCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKKyNpZm5kZWYgUHlWYXJPYmplY3RfSEVBRF9JTklUCisjZGVmaW5lIFB5VmFyT2JqZWN0X0hFQURfSU5JVCh0eXBlLCBzaXplKSBQeU9iamVjdF9IRUFEX0lOSVQodHlwZSkgc2l6ZSwKKyNlbmRpZgorI2lmbmRlZiBQeV9UWVBFCisjZGVmaW5lIFB5X1RZUEUob2IpICgoKFB5T2JqZWN0Kikob2IpKS0+b2JfdHlwZSkKKyNlbmRpZgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yX3Bvb2wuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZXh0ZW5zaW9uX2RpY3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvbWFwX2NvbnRhaW5lci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlX2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9yZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3NhZmVfbnVtZXJpY3MuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvc2NvcGVkX3B5b2JqZWN0X3B0ci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC91bmtub3duX2ZpZWxkX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC91bmtub3duX2ZpZWxkcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vc3RydG9kLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+CisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorLy8gY2xhbmctZm9ybWF0IG9uCisKKyNkZWZpbmUgUHlTdHJpbmdfQXNTdHJpbmcob2IpIFwKKyAgKFB5VW5pY29kZV9DaGVjayhvYikgPyBQeVVuaWNvZGVfQXNVVEY4KG9iKSA6IFB5Qnl0ZXNfQXNTdHJpbmcob2IpKQorI2RlZmluZSBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUob2IsIGNoYXJwcCwgc2l6ZXApICAgICAgICAgICAgICBcCisgIChQeVVuaWNvZGVfQ2hlY2sob2IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgoKihjaGFycHApID0gY29uc3RfY2FzdDxjaGFyKj4oICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgUHlVbmljb2RlX0FzVVRGOEFuZFNpemUob2IsIChzaXplcCkpKSkgPT0gbnVsbHB0ciBcCisgICAgICAgICAgICAgID8gLTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgOiAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUob2IsIChjaGFycHApLCAoc2l6ZXApKSkKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHB5dGhvbiB7CisKK2NsYXNzIE1lc3NhZ2VSZWZsZWN0aW9uRnJpZW5kIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFVuc2FmZVNoYWxsb3dTd2FwRmllbGRzKAorICAgICAgTWVzc2FnZSogbGhzLCBNZXNzYWdlKiByaHMsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgZmllbGRzKSB7CisgICAgbGhzLT5HZXRSZWZsZWN0aW9uKCktPlVuc2FmZVNoYWxsb3dTd2FwRmllbGRzKGxocywgcmhzLCBmaWVsZHMpOworICB9CisgIHN0YXRpYyBib29sIElzTGF6eUZpZWxkKGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgICByZXR1cm4gcmVmbGVjdGlvbi0+SXNMYXp5RmllbGQoZmllbGQpIHx8CisgICAgICAgICAgIHJlZmxlY3Rpb24tPklzTGF6eUV4dGVuc2lvbihtZXNzYWdlLCBmaWVsZCk7CisgIH0KK307CisKK3N0YXRpYyBQeU9iamVjdCoga0RFU0NSSVBUT1I7CitQeU9iamVjdCogRW51bVR5cGVXcmFwcGVyX2NsYXNzOworc3RhdGljIFB5T2JqZWN0KiBQeXRob25NZXNzYWdlX2NsYXNzOworc3RhdGljIFB5T2JqZWN0KiBrRW1wdHlXZWFrcmVmOworc3RhdGljIFB5T2JqZWN0KiBXS1RfY2xhc3NlcyA9IG51bGxwdHI7CisKK25hbWVzcGFjZSBtZXNzYWdlX21ldGEgeworCituYW1lc3BhY2UgeworLy8gQ29waWVkIG92ZXIgZnJvbSBpbnRlcm5hbCAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaCcuCitpbmxpbmUgdm9pZCBMb3dlclN0cmluZyhzdGQ6OnN0cmluZyogcykgeworICBzdGQ6OnN0cmluZzo6aXRlcmF0b3IgZW5kID0gcy0+ZW5kKCk7CisgIGZvciAoc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGkgPSBzLT5iZWdpbigpOyBpICE9IGVuZDsgKytpKSB7CisgICAgLy8gdG9sb3dlcigpIGNoYW5nZXMgYmFzZWQgb24gbG9jYWxlLiAgV2UgZG9uJ3Qgd2FudCB0aGlzIQorICAgIGlmICgnQScgPD0gKmkgJiYgKmkgPD0gJ1onKSAqaSArPSAnYScgLSAnQSc7CisgIH0KK30KK30gIC8vIG5hbWVzcGFjZQorCisvLyBGaW5hbGl6ZSB0aGUgY3JlYXRpb24gb2YgdGhlIE1lc3NhZ2UgY2xhc3MuCitzdGF0aWMgaW50IEFkZERlc2NyaXB0b3JzKFB5T2JqZWN0KiBjbHMsIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgLy8gRm9yIGVhY2ggZmllbGQgc2V0OiBjbHMuPGZpZWxkPl9GSUVMRF9OVU1CRVIgPSA8bnVtYmVyPgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9IGRlc2NyaXB0b3ItPmZpZWxkKGkpOworICAgIFNjb3BlZFB5T2JqZWN0UHRyIHByb3BlcnR5KE5ld0ZpZWxkUHJvcGVydHkoZmllbGRfZGVzY3JpcHRvcikpOworICAgIGlmIChwcm9wZXJ0eSA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKGNscywgZmllbGRfZGVzY3JpcHRvci0+bmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0KCkpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIC8vIEZvciBlYWNoIGVudW0gc2V0IGNscy48ZW51bSBuYW1lPiA9IEVudW1UeXBlV3JhcHBlcig8ZW51bSBkZXNjcmlwdG9yPikuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLT5lbnVtX3R5cGUoaSk7CisgICAgU2NvcGVkUHlPYmplY3RQdHIgZW51bV90eXBlKAorICAgICAgICBQeUVudW1EZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGVudW1fZGVzY3JpcHRvcikpOworICAgIGlmIChlbnVtX3R5cGUgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvLyBBZGQgd3JhcHBlZCBlbnVtIHR5cGUgdG8gbWVzc2FnZSBjbGFzcy4KKyAgICBTY29wZWRQeU9iamVjdFB0ciB3cmFwcGVkKFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCisgICAgICAgIEVudW1UeXBlV3JhcHBlcl9jbGFzcywgZW51bV90eXBlLmdldCgpLCBudWxscHRyKSk7CisgICAgaWYgKHdyYXBwZWQgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZygKKyAgICAgICAgICAgIGNscywgZW51bV9kZXNjcmlwdG9yLT5uYW1lKCkuY19zdHIoKSwgd3JhcHBlZC5nZXQoKSkgPT0gLTEpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBGb3IgZWFjaCBlbnVtIHZhbHVlIGFkZCBjbHMuPG5hbWU+ID0gPG51bWJlcj4KKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGVudW1fZGVzY3JpcHRvci0+dmFsdWVfY291bnQoKTsgKytqKSB7CisgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlX2Rlc2NyaXB0b3IgPQorICAgICAgICAgIGVudW1fZGVzY3JpcHRvci0+dmFsdWUoaik7CisgICAgICBTY29wZWRQeU9iamVjdFB0ciB2YWx1ZV9udW1iZXIoCisgICAgICAgICAgUHlMb25nX0Zyb21Mb25nKGVudW1fdmFsdWVfZGVzY3JpcHRvci0+bnVtYmVyKCkpKTsKKyAgICAgIGlmICh2YWx1ZV9udW1iZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhjbHMsIGVudW1fdmFsdWVfZGVzY3JpcHRvci0+bmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9udW1iZXIuZ2V0KCkpID09IC0xKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBGb3IgZWFjaCBleHRlbnNpb24gc2V0IGNscy48ZXh0ZW5zaW9uIG5hbWU+ID0gPGV4dGVuc2lvbiBkZXNjcmlwdG9yPi4KKyAgLy8KKyAgLy8gRXh0ZW5zaW9uIGRlc2NyaXB0b3JzIGNvbWUgZnJvbQorICAvLyA8bWVzc2FnZSBkZXNjcmlwdG9yPi5leHRlbnNpb25zX2J5X25hbWVbbmFtZV0KKyAgLy8gd2hpY2ggd2FzIGRlZmluZWQgcHJldmlvdXNseS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5leHRlbnNpb25fY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3ItPmV4dGVuc2lvbihpKTsKKyAgICBTY29wZWRQeU9iamVjdFB0ciBleHRlbnNpb25fZmllbGQoUHlGaWVsZERlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoZmllbGQpKTsKKyAgICBpZiAoZXh0ZW5zaW9uX2ZpZWxkID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBBZGQgdGhlIGV4dGVuc2lvbiBmaWVsZCB0byB0aGUgbWVzc2FnZSBjbGFzcy4KKyAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZygKKyAgICAgICAgICAgIGNscywgZmllbGQtPm5hbWUoKS5jX3N0cigpLCBleHRlbnNpb25fZmllbGQuZ2V0KCkpID09IC0xKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogTmV3KFB5VHlwZU9iamVjdCogdHlwZSwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGt3bGlzdFtdID0geyJuYW1lIiwgImJhc2VzIiwgImRpY3QiLCBudWxscHRyfTsKKyAgUHlPYmplY3QgKmJhc2VzLCAqZGljdDsKKyAgY29uc3QgY2hhciogbmFtZTsKKworICAvLyBDaGVjayBhcmd1bWVudHM6IChuYW1lLCBiYXNlcywgZGljdCkKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoCisgICAgICAgICAgYXJncywga3dhcmdzLCAic08hTyE6dHlwZSIsIGNvbnN0X2Nhc3Q8Y2hhcioqPihrd2xpc3QpLCAmbmFtZSwKKyAgICAgICAgICAmUHlUdXBsZV9UeXBlLCAmYmFzZXMsICZQeURpY3RfVHlwZSwgJmRpY3QpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBDaGVjayBiYXNlczogb25seSAoKSwgb3IgKG1lc3NhZ2UuTWVzc2FnZSwpIGFyZSBhbGxvd2VkCisgIGlmICghKFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpID09IDAgfHwKKyAgICAgICAgKFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpID09IDEgJiYKKyAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIDApID09IFB5dGhvbk1lc3NhZ2VfY2xhc3MpKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJBIE1lc3NhZ2UgY2xhc3MgY2FuIG9ubHkgaW5oZXJpdCBmcm9tIE1lc3NhZ2UiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIENoZWNrIGRpY3RbJ0RFU0NSSVBUT1InXQorICBQeU9iamVjdCogcHlfZGVzY3JpcHRvciA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIGtERVNDUklQVE9SKTsKKyAgaWYgKHB5X2Rlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNZXNzYWdlIGNsYXNzIGhhcyBubyBERVNDUklQVE9SIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2socHlfZGVzY3JpcHRvciwgJlB5TWVzc2FnZURlc2NyaXB0b3JfVHlwZSkpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiRXhwZWN0ZWQgYSBtZXNzYWdlIERlc2NyaXB0b3IsIGdvdCAlcyIsCisgICAgICAgICAgICAgICAgIHB5X2Rlc2NyaXB0b3ItPm9iX3R5cGUtPnRwX25hbWUpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfZGVzY3JpcHRvciA9CisgICAgICBQeU1lc3NhZ2VEZXNjcmlwdG9yX0FzRGVzY3JpcHRvcihweV9kZXNjcmlwdG9yKTsKKyAgaWYgKG1lc3NhZ2VfZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBNZXNzYWdlcyBoYXZlIG5vIF9fZGljdF9fCisgIFNjb3BlZFB5T2JqZWN0UHRyIHNsb3RzKFB5VHVwbGVfTmV3KDApKTsKKyAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX3Nsb3RzX18iLCBzbG90cy5nZXQoKSkgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBCdWlsZCB0aGUgYXJndW1lbnRzIHRvIHRoZSBiYXNlIG1ldGFjbGFzcy4KKyAgLy8gV2UgY2hhbmdlIHRoZSBfX2Jhc2VzX18gY2xhc3Nlcy4KKyAgU2NvcGVkUHlPYmplY3RQdHIgbmV3X2FyZ3M7CisKKyAgaWYgKFdLVF9jbGFzc2VzID09IG51bGxwdHIpIHsKKyAgICBTY29wZWRQeU9iamVjdFB0ciB3ZWxsX2tub3duX3R5cGVzKFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgKKyAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC53ZWxsX2tub3duX3R5cGVzIikpOworICAgIEdPT0dMRV9EQ0hFQ0sod2VsbF9rbm93bl90eXBlcyAhPSBudWxscHRyKTsKKworICAgIFdLVF9jbGFzc2VzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh3ZWxsX2tub3duX3R5cGVzLmdldCgpLCAiV0tUQkFTRVMiKTsKKyAgICBHT09HTEVfRENIRUNLKFdLVF9jbGFzc2VzICE9IG51bGxwdHIpOworICB9CisKKyAgUHlPYmplY3QqIHdlbGxfa25vd25fY2xhc3MgPSBQeURpY3RfR2V0SXRlbVN0cmluZygKKyAgICAgIFdLVF9jbGFzc2VzLCBtZXNzYWdlX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOworICBpZiAod2VsbF9rbm93bl9jbGFzcyA9PSBudWxscHRyKSB7CisgICAgbmV3X2FyZ3MucmVzZXQoUHlfQnVpbGRWYWx1ZSgicyhPTylPIiwgbmFtZSwgQ01lc3NhZ2VfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5dGhvbk1lc3NhZ2VfY2xhc3MsIGRpY3QpKTsKKyAgfSBlbHNlIHsKKyAgICBuZXdfYXJncy5yZXNldChQeV9CdWlsZFZhbHVlKCJzKE9PTylPIiwgbmFtZSwgQ01lc3NhZ2VfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5dGhvbk1lc3NhZ2VfY2xhc3MsIHdlbGxfa25vd25fY2xhc3MsIGRpY3QpKTsKKyAgfQorCisgIGlmIChuZXdfYXJncyA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgLy8gQ2FsbCB0aGUgYmFzZSBtZXRhY2xhc3MuCisgIFNjb3BlZFB5T2JqZWN0UHRyIHJlc3VsdChQeVR5cGVfVHlwZS50cF9uZXcodHlwZSwgbmV3X2FyZ3MuZ2V0KCksIG51bGxwdHIpKTsKKyAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgQ01lc3NhZ2VDbGFzcyogbmV3dHlwZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2VDbGFzcyo+KHJlc3VsdC5nZXQoKSk7CisKKyAgLy8gQ2FjaGUgdGhlIGRlc2NyaXB0b3IsIGJvdGggYXMgUHl0aG9uIG9iamVjdCBhbmQgYXMgQysrIHBvaW50ZXIuCisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPQorICAgICAgUHlNZXNzYWdlRGVzY3JpcHRvcl9Bc0Rlc2NyaXB0b3IocHlfZGVzY3JpcHRvcik7CisgIGlmIChkZXNjcmlwdG9yID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeV9JTkNSRUYocHlfZGVzY3JpcHRvcik7CisgIG5ld3R5cGUtPnB5X21lc3NhZ2VfZGVzY3JpcHRvciA9IHB5X2Rlc2NyaXB0b3I7CisgIG5ld3R5cGUtPm1lc3NhZ2VfZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgIC8vIFRPRE8oYW1hdXJ5ZmEpOiBEb24ndCBhbHdheXMgdXNlIHRoZSBjYW5vbmljYWwgcG9vbCBvZiB0aGUgZGVzY3JpcHRvciwKKyAgLy8gdXNlIHRoZSBNZXNzYWdlRmFjdG9yeSBvcHRpb25hbGx5IHBhc3NlZCBpbiB0aGUgY2xhc3MgZGljdC4KKyAgUHlEZXNjcmlwdG9yUG9vbCogcHlfZGVzY3JpcHRvcl9wb29sID0KKyAgICAgIEdldERlc2NyaXB0b3JQb29sX0Zyb21Qb29sKGRlc2NyaXB0b3ItPmZpbGUoKS0+cG9vbCgpKTsKKyAgaWYgKHB5X2Rlc2NyaXB0b3JfcG9vbCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgbmV3dHlwZS0+cHlfbWVzc2FnZV9mYWN0b3J5ID0gcHlfZGVzY3JpcHRvcl9wb29sLT5weV9tZXNzYWdlX2ZhY3Rvcnk7CisgIFB5X0lOQ1JFRihuZXd0eXBlLT5weV9tZXNzYWdlX2ZhY3RvcnkpOworCisgIC8vIFJlZ2lzdGVyIHRoZSBtZXNzYWdlIGluIHRoZSBNZXNzYWdlRmFjdG9yeS4KKyAgLy8gVE9ETyhhbWF1cnlmYSk6IE1vdmUgdGhpcyBjYWxsIHRvIE1lc3NhZ2VGYWN0b3J5LkdldFByb3RvdHlwZSgpIHdoZW4gdGhlCisgIC8vIE1lc3NhZ2VGYWN0b3J5IGlzIGZ1bGx5IGltcGxlbWVudGVkIGluIEMrKy4KKyAgaWYgKG1lc3NhZ2VfZmFjdG9yeTo6UmVnaXN0ZXJNZXNzYWdlQ2xhc3MobmV3dHlwZS0+cHlfbWVzc2FnZV9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLCBuZXd0eXBlKSA8IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIENvbnRpbnVlIHdpdGggdHlwZSBpbml0aWFsaXphdGlvbjogYWRkIG90aGVyIGRlc2NyaXB0b3JzLCBlbnVtIHZhbHVlcy4uLgorICBpZiAoQWRkRGVzY3JpcHRvcnMocmVzdWx0LmdldCgpLCBkZXNjcmlwdG9yKSA8IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsKK30KKworc3RhdGljIHZvaWQgRGVhbGxvYyhQeU9iamVjdCogcHNlbGYpIHsKKyAgQ01lc3NhZ2VDbGFzcyogc2VsZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2VDbGFzcyo+KHBzZWxmKTsKKyAgUHlfWERFQ1JFRihzZWxmLT5weV9tZXNzYWdlX2Rlc2NyaXB0b3IpOworICBQeV9YREVDUkVGKHNlbGYtPnB5X21lc3NhZ2VfZmFjdG9yeSk7CisgIHJldHVybiBQeVR5cGVfVHlwZS50cF9kZWFsbG9jKHBzZWxmKTsKK30KKworc3RhdGljIGludCBHY1RyYXZlcnNlKFB5T2JqZWN0KiBwc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkKiBhcmcpIHsKKyAgQ01lc3NhZ2VDbGFzcyogc2VsZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2VDbGFzcyo+KHBzZWxmKTsKKyAgUHlfVklTSVQoc2VsZi0+cHlfbWVzc2FnZV9kZXNjcmlwdG9yKTsKKyAgUHlfVklTSVQoc2VsZi0+cHlfbWVzc2FnZV9mYWN0b3J5KTsKKyAgcmV0dXJuIFB5VHlwZV9UeXBlLnRwX3RyYXZlcnNlKHBzZWxmLCB2aXNpdCwgYXJnKTsKK30KKworc3RhdGljIGludCBHY0NsZWFyKFB5T2JqZWN0KiBwc2VsZikgeworICAvLyBJdCdzIGltcG9ydGFudCB0byBrZWVwIHRoZSBkZXNjcmlwdG9yIGFuZCBmYWN0b3J5IGFsaXZlLCB1bnRpbCB0aGUKKyAgLy8gQysrIG1lc3NhZ2UgaXMgZnVsbHkgZGVzdHJ1Y3RlZC4KKyAgcmV0dXJuIFB5VHlwZV9UeXBlLnRwX2NsZWFyKHBzZWxmKTsKK30KKworLy8gVGhlIF9leHRlbnNpb25zX2J5X25hbWUgZGljdGlvbmFyeSBpcyBidWlsdCBvbiBldmVyeSBhY2Nlc3MuCisvLyBUT0RPKGFtYXVyeWZhKTogTWlncmF0ZSBhbGwgdXNlcnMgdG8gcG9vbC5GaW5kQWxsRXh0ZW5zaW9ucygpCitzdGF0aWMgUHlPYmplY3QqIEdldEV4dGVuc2lvbnNCeU5hbWUoQ01lc3NhZ2VDbGFzcyAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBpZiAoc2VsZi0+bWVzc2FnZV9kZXNjcmlwdG9yID09IG51bGxwdHIpIHsKKyAgICAvLyBUaGlzIGlzIHRoZSBiYXNlIE1lc3NhZ2Ugb2JqZWN0LCBzaW1wbHkgcmFpc2UgQXR0cmlidXRlRXJyb3IuCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiQmFzZSBNZXNzYWdlIGNsYXNzIGhhcyBubyBERVNDUklQVE9SIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBjb25zdCBQeURlc2NyaXB0b3JQb29sKiBwb29sID0gc2VsZi0+cHlfbWVzc2FnZV9mYWN0b3J5LT5wb29sOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGV4dGVuc2lvbnM7CisgIHBvb2wtPnBvb2wtPkZpbmRBbGxFeHRlbnNpb25zKHNlbGYtPm1lc3NhZ2VfZGVzY3JpcHRvciwgJmV4dGVuc2lvbnMpOworCisgIFNjb3BlZFB5T2JqZWN0UHRyIHJlc3VsdChQeURpY3RfTmV3KCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICBTY29wZWRQeU9iamVjdFB0ciBleHRlbnNpb24oCisgICAgICAgIFB5RmllbGREZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGV4dGVuc2lvbnNbaV0pKTsKKyAgICBpZiAoZXh0ZW5zaW9uID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcocmVzdWx0LmdldCgpLCBleHRlbnNpb25zW2ldLT5mdWxsX25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2V0KCkpIDwgMCkgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOworfQorCisvLyBUaGUgX2V4dGVuc2lvbnNfYnlfbnVtYmVyIGRpY3Rpb25hcnkgaXMgYnVpbHQgb24gZXZlcnkgYWNjZXNzLgorLy8gVE9ETyhhbWF1cnlmYSk6IE1pZ3JhdGUgYWxsIHVzZXJzIHRvIHBvb2wuRmluZEV4dGVuc2lvbkJ5TnVtYmVyKCkKK3N0YXRpYyBQeU9iamVjdCogR2V0RXh0ZW5zaW9uc0J5TnVtYmVyKENNZXNzYWdlQ2xhc3MgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgaWYgKHNlbGYtPm1lc3NhZ2VfZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgLy8gVGhpcyBpcyB0aGUgYmFzZSBNZXNzYWdlIG9iamVjdCwgc2ltcGx5IHJhaXNlIEF0dHJpYnV0ZUVycm9yLgorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkJhc2UgTWVzc2FnZSBjbGFzcyBoYXMgbm8gREVTQ1JJUFRPUiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgY29uc3QgUHlEZXNjcmlwdG9yUG9vbCogcG9vbCA9IHNlbGYtPnB5X21lc3NhZ2VfZmFjdG9yeS0+cG9vbDsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBleHRlbnNpb25zOworICBwb29sLT5wb29sLT5GaW5kQWxsRXh0ZW5zaW9ucyhzZWxmLT5tZXNzYWdlX2Rlc2NyaXB0b3IsICZleHRlbnNpb25zKTsKKworICBTY29wZWRQeU9iamVjdFB0ciByZXN1bHQoUHlEaWN0X05ldygpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLnNpemUoKTsgaSsrKSB7CisgICAgU2NvcGVkUHlPYmplY3RQdHIgZXh0ZW5zaW9uKAorICAgICAgICBQeUZpZWxkRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihleHRlbnNpb25zW2ldKSk7CisgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgU2NvcGVkUHlPYmplY3RQdHIgbnVtYmVyKFB5TG9uZ19Gcm9tTG9uZyhleHRlbnNpb25zW2ldLT5udW1iZXIoKSkpOworICAgIGlmIChudW1iZXIgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChQeURpY3RfU2V0SXRlbShyZXN1bHQuZ2V0KCksIG51bWJlci5nZXQoKSwgZXh0ZW5zaW9uLmdldCgpKSA8IDApIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsKK30KKworc3RhdGljIFB5R2V0U2V0RGVmIEdldHRlcnNbXSA9IHsKKyAgICB7Il9leHRlbnNpb25zX2J5X25hbWUiLCAoZ2V0dGVyKUdldEV4dGVuc2lvbnNCeU5hbWUsIG51bGxwdHJ9LAorICAgIHsiX2V4dGVuc2lvbnNfYnlfbnVtYmVyIiwgKGdldHRlcilHZXRFeHRlbnNpb25zQnlOdW1iZXIsIG51bGxwdHJ9LAorICAgIHtudWxscHRyfSwKK307CisKKy8vIENvbXB1dGUgc29tZSBjbGFzcyBhdHRyaWJ1dGVzIG9uIHRoZSBmbHk6CisvLyAtIEFsbCB0aGUgX0ZJRUxEX05VTUJFUiBhdHRyaWJ1dGVzLCBmb3IgYWxsIGZpZWxkcyBhbmQgbmVzdGVkIGV4dGVuc2lvbnMuCisvLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZSwgb3IgTlVMTCB3aXRoIGFuIGV4Y2VwdGlvbiBzZXQuCitzdGF0aWMgUHlPYmplY3QqIEdldENsYXNzQXR0cmlidXRlKENNZXNzYWdlQ2xhc3MgKnNlbGYsIFB5T2JqZWN0KiBuYW1lKSB7CisgIGNoYXIqIGF0dHI7CisgIFB5X3NzaXplX3QgYXR0cl9zaXplOworICBzdGF0aWMgY29uc3QgY2hhciBrU3VmZml4W10gPSAiX0ZJRUxEX05VTUJFUiI7CisgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUobmFtZSwgJmF0dHIsICZhdHRyX3NpemUpID49IDAgJiYKKyAgICAgIEhhc1N1ZmZpeFN0cmluZyhTdHJpbmdQaWVjZShhdHRyLCBhdHRyX3NpemUpLCBrU3VmZml4KSkgeworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUoYXR0ciwgYXR0cl9zaXplIC0gc2l6ZW9mKGtTdWZmaXgpICsgMSk7CisgICAgTG93ZXJTdHJpbmcoJmZpZWxkX25hbWUpOworCisgICAgLy8gVHJ5IHRvIGZpbmQgYSBmaWVsZCB3aXRoIHRoZSBnaXZlbiBuYW1lLCB3aXRob3V0IHRoZSBzdWZmaXguCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9CisgICAgICAgIHNlbGYtPm1lc3NhZ2VfZGVzY3JpcHRvci0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKGZpZWxkX25hbWUpOworICAgIGlmICghZmllbGQpIHsKKyAgICAgIC8vIFNlYXJjaCBuZXN0ZWQgZXh0ZW5zaW9ucyBhcyB3ZWxsLgorICAgICAgZmllbGQgPQorICAgICAgICAgIHNlbGYtPm1lc3NhZ2VfZGVzY3JpcHRvci0+RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZShmaWVsZF9uYW1lKTsKKyAgICB9CisgICAgaWYgKGZpZWxkKSB7CisgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKGZpZWxkLT5udW1iZXIoKSk7CisgICAgfQorICB9CisgIFB5RXJyX1NldE9iamVjdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisgIHJldHVybiBudWxscHRyOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldEF0dHIoQ01lc3NhZ2VDbGFzcyogc2VsZiwgUHlPYmplY3QqIG5hbWUpIHsKKyAgUHlPYmplY3QqIHJlc3VsdCA9IENNZXNzYWdlQ2xhc3NfVHlwZS0+dHBfYmFzZS0+dHBfZ2V0YXR0cm8oCisgICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZiksIG5hbWUpOworICBpZiAocmVzdWx0ICE9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5RXJyX0NsZWFyKCk7CisgIHJldHVybiBHZXRDbGFzc0F0dHJpYnV0ZShzZWxmLCBuYW1lKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lc3NhZ2VfbWV0YQorCisvLyBQcm90b2J1ZiBoYXMgYSA2NE1CIGxpbWl0IGJ1aWx0IGluLCB0aGlzIHZhcmlhYmxlIHdpbGwgb3ZlcnJpZGUgdGhpcy4gUGxlYXNlCisvLyBkbyBub3QgZW5hYmxlIHRoaXMgdW5sZXNzIHlvdSBmdWxseSB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnM6IHByb3RvYnVmcworLy8gbXVzdCBhbGwgYmUga2VwdCBpbiBtZW1vcnkgYXQgdGhlIHNhbWUgdGltZSwgc28gaWYgdGhleSBncm93IHRvbyBiaWcgeW91IG1heQorLy8gZ2V0IE9PTSBlcnJvcnMuIFRoZSBwcm90b2J1ZiBBUElzIGRvIG5vdCBwcm92aWRlIGFueSB0b29scyBmb3IgcHJvY2Vzc2luZworLy8gcHJvdG9idWZzIGluIGNodW5rcy4gIElmIHlvdSBoYXZlIHByb3RvcyB0aGlzIGJpZyB5b3Ugc2hvdWxkIGJyZWFrIHRoZW0gdXAgaWYKKy8vIGl0IGlzIGF0IGFsbCBjb252ZW5pZW50IHRvIGRvIHNvLgorI2lmZGVmIFBST1RPQlVGX1BZVEhPTl9BTExPV19PVkVSU0laRV9QUk9UT1MKK3N0YXRpYyBib29sIGFsbG93X292ZXJzaXplX3Byb3RvcyA9IHRydWU7CisjZWxzZQorc3RhdGljIGJvb2wgYWxsb3dfb3ZlcnNpemVfcHJvdG9zID0gZmFsc2U7CisjZW5kaWYKKworc3RhdGljIFB5VHlwZU9iamVjdCBfQ01lc3NhZ2VDbGFzc19UeXBlID0geworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApIEZVTExfTU9EVUxFX05BTUUKKyAgICAiLk1lc3NhZ2VNZXRhIiwgICAgICAgICAvLyB0cF9uYW1lCisgICAgc2l6ZW9mKENNZXNzYWdlQ2xhc3MpLCAgLy8gdHBfYmFzaWNzaXplCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKKyAgICBtZXNzYWdlX21ldGE6OkRlYWxsb2MsICAvLyB0cF9kZWFsbG9jCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDgwMDAwCisgICAgbnVsbHB0ciwgLyogdHBfcHJpbnQgKi8KKyNlbHNlCisgICAgMCwgLyogdHBfdmVjdG9yY2FsbF9vZmZzZXQgKi8KKyNlbmRpZgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY29tcGFyZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmVwcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbnVtYmVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19zZXF1ZW5jZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbWFwcGluZworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaGFzaAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2FsbAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc3RyCisgICAgKGdldGF0dHJvZnVuYyltZXNzYWdlX21ldGE6OkdldEF0dHIsICAvLyB0cF9nZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cm8KKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX2J1ZmZlcgorICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAvLyB0cF9mbGFncworICAgICJUaGUgbWV0YWNsYXNzIG9mIFByb3RvY29sTWVzc2FnZXMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kb2MKKyAgICBtZXNzYWdlX21ldGE6OkdjVHJhdmVyc2UsICAvLyB0cF90cmF2ZXJzZQorICAgIG1lc3NhZ2VfbWV0YTo6R2NDbGVhciwgICAgIC8vIHRwX2NsZWFyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfcmljaGNvbXBhcmUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF93ZWFrbGlzdG9mZnNldAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVybmV4dAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX21ldGhvZHMKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCisgICAgbWVzc2FnZV9tZXRhOjpHZXR0ZXJzLCAgICAgLy8gdHBfZ2V0c2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfYmFzZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2RpY3QKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9nZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9zZXQKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgLy8gdHBfaW5pdAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIHRwX2FsbG9jCisgICAgbWVzc2FnZV9tZXRhOjpOZXcsICAgICAgICAgLy8gdHBfbmV3Cit9OworUHlUeXBlT2JqZWN0KiBDTWVzc2FnZUNsYXNzX1R5cGUgPSAmX0NNZXNzYWdlQ2xhc3NfVHlwZTsKKworc3RhdGljIENNZXNzYWdlQ2xhc3MqIENoZWNrTWVzc2FnZUNsYXNzKFB5VHlwZU9iamVjdCogY2xzKSB7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKGNscywgQ01lc3NhZ2VDbGFzc19UeXBlKSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJDbGFzcyAlcyBpcyBub3QgYSBNZXNzYWdlIiwgY2xzLT50cF9uYW1lKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZUNsYXNzKj4oY2xzKTsKK30KKworc3RhdGljIGNvbnN0IERlc2NyaXB0b3IqIEdldE1lc3NhZ2VEZXNjcmlwdG9yKFB5VHlwZU9iamVjdCogY2xzKSB7CisgIENNZXNzYWdlQ2xhc3MqIHR5cGUgPSBDaGVja01lc3NhZ2VDbGFzcyhjbHMpOworICBpZiAodHlwZSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIHR5cGUtPm1lc3NhZ2VfZGVzY3JpcHRvcjsKK30KKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMKK25hbWVzcGFjZSBjbWVzc2FnZSB7CitpbnQgSW50ZXJuYWxSZWxlYXNlRmllbGRCeURlc2NyaXB0b3IoCisgICAgQ01lc3NhZ2UqIHNlbGYsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yKTsKK30gIC8vIG5hbWVzcGFjZSBjbWVzc2FnZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUHlPYmplY3QqIEVuY29kZUVycm9yX2NsYXNzOworUHlPYmplY3QqIERlY29kZUVycm9yX2NsYXNzOworUHlPYmplY3QqIFBpY2tsZUVycm9yX2NsYXNzOworCisvLyBGb3JtYXQgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdW5leHBlY3RlZCB0eXBlcy4KKy8vIEFsd2F5cyByZXR1cm4gd2l0aCBhbiBleGNlcHRpb24gc2V0Lgordm9pZCBGb3JtYXRUeXBlRXJyb3IoUHlPYmplY3QqIGFyZywgY29uc3QgY2hhciogZXhwZWN0ZWRfdHlwZXMpIHsKKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvZnRlbiBjYWxsZWQgd2l0aCBhbiBleGNlcHRpb24gc2V0LgorICAvLyBDbGVhciBpdCB0byBjYWxsIFB5T2JqZWN0X1JlcHIoKSBpbiBnb29kIGNvbmRpdGlvbnMuCisgIFB5RXJyX0NsZWFyKCk7CisgIFB5T2JqZWN0KiByZXByID0gUHlPYmplY3RfUmVwcihhcmcpOworICBpZiAocmVwcikgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICIlLjEwMHMgaGFzIHR5cGUgJS4xMDBzLCBidXQgZXhwZWN0ZWQgb25lIG9mOiAlcyIsCisgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKHJlcHIpLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKGFyZyktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3R5cGVzKTsKKyAgICBQeV9ERUNSRUYocmVwcik7CisgIH0KK30KKwordm9pZCBPdXRPZlJhbmdlRXJyb3IoUHlPYmplY3QqIGFyZykgeworICBQeU9iamVjdCAqcyA9IFB5T2JqZWN0X1N0cihhcmcpOworICBpZiAocykgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAiVmFsdWUgb3V0IG9mIHJhbmdlOiAlcyIsCisgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKHMpKTsKKyAgICBQeV9ERUNSRUYocyk7CisgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgUmFuZ2VUeXBlLCBjbGFzcyBWYWx1ZVR5cGU+Citib29sIFZlcmlmeUludGVnZXJDYXN0QW5kUmFuZ2UoUHlPYmplY3QqIGFyZywgVmFsdWVUeXBlIHZhbHVlKSB7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpKSB7CisgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpIHsKKyAgICAgIC8vIFJlcGxhY2UgaXQgd2l0aCB0aGUgc2FtZSBWYWx1ZUVycm9yIGFzIHB1cmUgcHl0aG9uIHByb3RvcyBpbnN0ZWFkIG9mCisgICAgICAvLyB0aGUgZGVmYXVsdCBvbmUuCisgICAgICBQeUVycl9DbGVhcigpOworICAgICAgT3V0T2ZSYW5nZUVycm9yKGFyZyk7CisgICAgfSAgLy8gT3RoZXJ3aXNlIHByb3BhZ2F0ZSBleGlzdGluZyBlcnJvci4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoIUlzVmFsaWROdW1lcmljQ2FzdDxSYW5nZVR5cGU+KHZhbHVlKSkpIHsKKyAgICBPdXRPZlJhbmdlRXJyb3IoYXJnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBDaGVja0FuZEdldEludGVnZXIoUHlPYmplY3QqIGFyZywgVCogdmFsdWUpIHsKKyAgLy8gVGhpcyBlZmZlY3RpdmVseSBkZWZpbmVzIGFuIGludGVnZXIgYXMgImFuIG9iamVjdCB0aGF0IGNhbiBiZSBjYXN0IGFzCisgIC8vIGFuIGludGVnZXIgYW5kIGNhbiBiZSB1c2VkIGFzIGFuIG9yZGluYWwgbnVtYmVyIi4KKyAgLy8gVGhpcyBkZWZpbml0aW9uIGluY2x1ZGVzIGV2ZXJ5dGhpbmcgd2l0aCBhIHZhbGlkIF9faW5kZXhfXygpIGltcGxlbWVudGF0aW9uCisgIC8vIGFuZCBzaG91bGRuJ3QgY2FzdCB0aGUgbmV0IHRvbyB3aWRlLgorICBpZiAoIXN0cmNtcChQeV9UWVBFKGFyZyktPnRwX25hbWUsICJudW1weS5uZGFycmF5IikgfHwKKyAgICAgIFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoIVB5SW5kZXhfQ2hlY2soYXJnKSkpIHsKKyAgICBGb3JtYXRUeXBlRXJyb3IoYXJnLCAiaW50Iik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgUHlPYmplY3QqIGFyZ19weV9pbnQgPSBQeU51bWJlcl9JbmRleChhcmcpOworICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgIC8vIFByb3BhZ2F0ZSBleGlzdGluZyBlcnJvci4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWluKCkgPT0gMCkgeworICAgIC8vIFVuc2lnbmVkIGNhc2UuCisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHVsb25nX3Jlc3VsdCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcoYXJnX3B5X2ludCk7CisgICAgUHlfREVDUkVGKGFyZ19weV9pbnQpOworICAgIGlmIChWZXJpZnlJbnRlZ2VyQ2FzdEFuZFJhbmdlPFQsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORz4oYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxvbmdfcmVzdWx0KSkgeworICAgICAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8VD4odWxvbmdfcmVzdWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBTaWduZWQgY2FzZS4KKyAgICBQeV9ERUNSRUYoYXJnX3B5X2ludCk7CisgICAgUFlfTE9OR19MT05HIGxvbmdfcmVzdWx0ID0gUHlMb25nX0FzTG9uZ0xvbmcoYXJnKTsKKyAgICBpZiAoVmVyaWZ5SW50ZWdlckNhc3RBbmRSYW5nZTxULCBQWV9MT05HX0xPTkc+KGFyZywgbG9uZ19yZXN1bHQpKSB7CisgICAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxUPihsb25nX3Jlc3VsdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRoZXNlIGFyZSByZWZlcmVuY2VkIGJ5IHJlcGVhdGVkX3NjYWxhcl9jb250YWluZXIsIGFuZCBtdXN0CisvLyBiZSBleHBsaWNpdGx5IGluc3RhbnRpYXRlZC4KK3RlbXBsYXRlIGJvb2wgQ2hlY2tBbmRHZXRJbnRlZ2VyPGludDMyPihQeU9iamVjdCosIGludDMyKik7Cit0ZW1wbGF0ZSBib29sIENoZWNrQW5kR2V0SW50ZWdlcjxpbnQ2ND4oUHlPYmplY3QqLCBpbnQ2NCopOwordGVtcGxhdGUgYm9vbCBDaGVja0FuZEdldEludGVnZXI8dWludDMyPihQeU9iamVjdCosIHVpbnQzMiopOwordGVtcGxhdGUgYm9vbCBDaGVja0FuZEdldEludGVnZXI8dWludDY0PihQeU9iamVjdCosIHVpbnQ2NCopOworCitib29sIENoZWNrQW5kR2V0RG91YmxlKFB5T2JqZWN0KiBhcmcsIGRvdWJsZSogdmFsdWUpIHsKKyAgKnZhbHVlID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOworICBpZiAoIXN0cmNtcChQeV9UWVBFKGFyZyktPnRwX25hbWUsICJudW1weS5uZGFycmF5IikgfHwKKyAgICAgIFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoKnZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpKSB7CisgICAgRm9ybWF0VHlwZUVycm9yKGFyZywgImludCwgZmxvYXQiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ2hlY2tBbmRHZXRGbG9hdChQeU9iamVjdCogYXJnLCBmbG9hdCogdmFsdWUpIHsKKyAgZG91YmxlIGRvdWJsZV92YWx1ZTsKKyAgaWYgKCFDaGVja0FuZEdldERvdWJsZShhcmcsICZkb3VibGVfdmFsdWUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgICp2YWx1ZSA9IGlvOjpTYWZlRG91YmxlVG9GbG9hdChkb3VibGVfdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDaGVja0FuZEdldEJvb2woUHlPYmplY3QqIGFyZywgYm9vbCogdmFsdWUpIHsKKyAgbG9uZyBsb25nX3ZhbHVlID0gUHlMb25nX0FzTG9uZyhhcmcpOyAgLy8gTk9MSU5UCisgIGlmICghc3RyY21wKFB5X1RZUEUoYXJnKS0+dHBfbmFtZSwgIm51bXB5Lm5kYXJyYXkiKSB8fAorICAgICAgKGxvbmdfdmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkpIHsKKyAgICBGb3JtYXRUeXBlRXJyb3IoYXJnLCAiaW50LCBib29sIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgICp2YWx1ZSA9IHN0YXRpY19jYXN0PGJvb2w+KGxvbmdfdmFsdWUpOworCisgIHJldHVybiB0cnVlOworfQorCisvLyBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0ICh3aGljaCBtdXN0IGJlICJieXRlcyIgb3IgInVuaWNvZGUiKSBjb250YWlucworLy8gdmFsaWQgVVRGLTguCitib29sIElzVmFsaWRVVEY4KFB5T2JqZWN0KiBvYmopIHsKKyAgaWYgKFB5Qnl0ZXNfQ2hlY2sob2JqKSkgeworICAgIFB5T2JqZWN0KiB1bmljb2RlID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KG9iaiwgInV0Zi04IiwgbnVsbHB0cik7CisKKyAgICAvLyBDbGVhciB0aGUgZXJyb3IgaW5kaWNhdG9yOyB3ZSByZXBvcnQgb3VyIG93biBlcnJvciB3aGVuIGRlc2lyZWQuCisgICAgUHlFcnJfQ2xlYXIoKTsKKworICAgIGlmICh1bmljb2RlKSB7CisgICAgICBQeV9ERUNSRUYodW5pY29kZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBVbmljb2RlIG9iamVjdCwga25vd24gdG8gYmUgdmFsaWQgVVRGLTguCisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKworYm9vbCBBbGxvd0ludmFsaWRVVEY4KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsgcmV0dXJuIGZhbHNlOyB9CisKK1B5T2JqZWN0KiBDaGVja1N0cmluZyhQeU9iamVjdCogYXJnLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgR09PR0xFX0RDSEVDSyhkZXNjcmlwdG9yLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyB8fAorICAgICAgICAgZGVzY3JpcHRvci0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyk7CisgIGlmIChkZXNjcmlwdG9yLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgeworICAgIGlmICghUHlCeXRlc19DaGVjayhhcmcpICYmICFQeVVuaWNvZGVfQ2hlY2soYXJnKSkgeworICAgICAgRm9ybWF0VHlwZUVycm9yKGFyZywgImJ5dGVzLCB1bmljb2RlIik7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAoIUlzVmFsaWRVVEY4KGFyZykgJiYgIUFsbG93SW52YWxpZFVURjgoZGVzY3JpcHRvcikpIHsKKyAgICAgIFB5T2JqZWN0KiByZXByID0gUHlPYmplY3RfUmVwcihhcmcpOworICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIiVzIGhhcyB0eXBlIHN0ciwgYnV0IGlzbid0IHZhbGlkIFVURi04ICIKKyAgICAgICAgICAgICAgICAgICAiZW5jb2RpbmcuIE5vbi1VVEYtOCBzdHJpbmdzIG11c3QgYmUgY29udmVydGVkIHRvICIKKyAgICAgICAgICAgICAgICAgICAidW5pY29kZSBvYmplY3RzIGJlZm9yZSBiZWluZyBhZGRlZC4iLAorICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKHJlcHIpKTsKKyAgICAgIFB5X0RFQ1JFRihyZXByKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgfSBlbHNlIGlmICghUHlCeXRlc19DaGVjayhhcmcpKSB7CisgICAgRm9ybWF0VHlwZUVycm9yKGFyZywgImJ5dGVzIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBQeU9iamVjdCogZW5jb2RlZF9zdHJpbmcgPSBudWxscHRyOworICBpZiAoZGVzY3JpcHRvci0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKKyAgICBpZiAoUHlCeXRlc19DaGVjayhhcmcpKSB7CisgICAgICAvLyBUaGUgYnl0ZXMgd2VyZSBhbHJlYWR5IHZhbGlkYXRlZCBhcyBjb3JyZWN0bHkgZW5jb2RlZCBVVEYtOCBhYm92ZS4KKyAgICAgIGVuY29kZWRfc3RyaW5nID0gYXJnOyAgLy8gQWxyZWFkeSBlbmNvZGVkLgorICAgICAgUHlfSU5DUkVGKGVuY29kZWRfc3RyaW5nKTsKKyAgICB9IGVsc2UgeworICAgICAgZW5jb2RlZF9zdHJpbmcgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKGFyZywgInV0Zi04IiwgbnVsbHB0cik7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIEluIHRoaXMgY2FzZSBmaWVsZCB0eXBlIGlzICJieXRlcyIuCisgICAgZW5jb2RlZF9zdHJpbmcgPSBhcmc7CisgICAgUHlfSU5DUkVGKGVuY29kZWRfc3RyaW5nKTsKKyAgfQorCisgIHJldHVybiBlbmNvZGVkX3N0cmluZzsKK30KKworYm9vbCBDaGVja0FuZFNldFN0cmluZygKKyAgICBQeU9iamVjdCogYXJnLCBNZXNzYWdlKiBtZXNzYWdlLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAorICAgIGJvb2wgYXBwZW5kLAorICAgIGludCBpbmRleCkgeworICBTY29wZWRQeU9iamVjdFB0ciBlbmNvZGVkX3N0cmluZyhDaGVja1N0cmluZyhhcmcsIGRlc2NyaXB0b3IpKTsKKworICBpZiAoZW5jb2RlZF9zdHJpbmcuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNoYXIqIHZhbHVlOworICBQeV9zc2l6ZV90IHZhbHVlX2xlbjsKKyAgaWYgKFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplKGVuY29kZWRfc3RyaW5nLmdldCgpLCAmdmFsdWUsICZ2YWx1ZV9sZW4pIDwgMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHZhbHVlX3N0cmluZyh2YWx1ZSwgdmFsdWVfbGVuKTsKKyAgaWYgKGFwcGVuZCkgeworICAgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBkZXNjcmlwdG9yLCBzdGQ6Om1vdmUodmFsdWVfc3RyaW5nKSk7CisgIH0gZWxzZSBpZiAoaW5kZXggPCAwKSB7CisgICAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIGRlc2NyaXB0b3IsIHN0ZDo6bW92ZSh2YWx1ZV9zdHJpbmcpKTsKKyAgfSBlbHNlIHsKKyAgICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBkZXNjcmlwdG9yLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUodmFsdWVfc3RyaW5nKSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK1B5T2JqZWN0KiBUb1N0cmluZ09iamVjdChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGlmIChkZXNjcmlwdG9yLT50eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgeworICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHZhbHVlLmNfc3RyKCksIHZhbHVlLmxlbmd0aCgpKTsKKyAgfQorCisgIFB5T2JqZWN0KiByZXN1bHQgPQorICAgICAgUHlVbmljb2RlX0RlY29kZVVURjgodmFsdWUuY19zdHIoKSwgdmFsdWUubGVuZ3RoKCksIG51bGxwdHIpOworICAvLyBJZiB0aGUgc3RyaW5nIGNhbid0IGJlIGRlY29kZWQgaW4gVVRGLTgsIGp1c3QgcmV0dXJuIGEgc3RyaW5nIG9iamVjdCB0aGF0CisgIC8vIGNvbnRhaW5zIHRoZSByYXcgYnl0ZXMuIFRoaXMgY2FuJ3QgaGFwcGVuIGlmIHRoZSB2YWx1ZSB3YXMgYXNzaWduZWQgdXNpbmcKKyAgLy8gdGhlIG1lbWJlcnMgb2YgdGhlIFB5dGhvbiBtZXNzYWdlIG9iamVjdCwgYnV0IGNhbiBoYXBwZW4gaWYgdGhlIHZhbHVlcyB3ZXJlCisgIC8vIHBhcnNlZCBmcm9tIHRoZSB3aXJlIChiaW5hcnkpLgorICBpZiAocmVzdWx0ID09IG51bGxwdHIpIHsKKyAgICBQeUVycl9DbGVhcigpOworICAgIHJlc3VsdCA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUodmFsdWUuY19zdHIoKSwgdmFsdWUubGVuZ3RoKCkpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgQ2hlY2tGaWVsZEJlbG9uZ3NUb01lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGlmIChtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkgPT0gZmllbGRfZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsICJGaWVsZCAnJXMnIGRvZXMgbm90IGJlbG9uZyB0byBtZXNzYWdlICclcyciLAorICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkuY19zdHIoKSk7CisgIHJldHVybiBmYWxzZTsKK30KKworbmFtZXNwYWNlIGNtZXNzYWdlIHsKKworUHlNZXNzYWdlRmFjdG9yeSogR2V0RmFjdG9yeUZvck1lc3NhZ2UoQ01lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgR09PR0xFX0RDSEVDSyhQeU9iamVjdF9UeXBlQ2hlY2sobWVzc2FnZSwgQ01lc3NhZ2VfVHlwZSkpOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZUNsYXNzKj4oUHlfVFlQRShtZXNzYWdlKSktPnB5X21lc3NhZ2VfZmFjdG9yeTsKK30KKworc3RhdGljIGludCBNYXliZVJlbGVhc2VPdmVybGFwcGluZ09uZW9mRmllbGQoCisgICAgQ01lc3NhZ2UqIGNtZXNzYWdlLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgTWVzc2FnZSogbWVzc2FnZSA9IGNtZXNzYWdlLT5tZXNzYWdlOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBpZiAoIWZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgfHwKKyAgICAgICFyZWZsZWN0aW9uLT5IYXNPbmVvZigqbWVzc2FnZSwgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgfHwKKyAgICAgIHJlZmxlY3Rpb24tPkhhc0ZpZWxkKCptZXNzYWdlLCBmaWVsZCkpIHsKKyAgICAvLyBObyBvdGhlciBmaWVsZCBpbiB0aGlzIG9uZW9mLCBubyBuZWVkIHRvIHJlbGVhc2UuCisgICAgcmV0dXJuIDA7CisgIH0KKworICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleGlzdGluZ19maWVsZCA9CisgICAgICByZWZsZWN0aW9uLT5HZXRPbmVvZkZpZWxkRGVzY3JpcHRvcigqbWVzc2FnZSwgb25lb2YpOworICBpZiAoZXhpc3RpbmdfZmllbGQtPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAvLyBOb24tbWVzc2FnZSBmaWVsZHMgZG9uJ3QgbmVlZCB0byBiZSByZWxlYXNlZC4KKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoSW50ZXJuYWxSZWxlYXNlRmllbGRCeURlc2NyaXB0b3IoY21lc3NhZ2UsIGV4aXN0aW5nX2ZpZWxkKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIEFmdGVyIGEgTWVyZ2UsIHZpc2l0IGV2ZXJ5IHN1Yi1tZXNzYWdlIHRoYXQgd2FzIHJlYWQtb25seSwgYW5kCisvLyBldmVudHVhbGx5IHVwZGF0ZSB0aGVpciBwb2ludGVyIGlmIHRoZSBNZXJnZSBvcGVyYXRpb24gbW9kaWZpZWQgdGhlbS4KK2ludCBGaXh1cE1lc3NhZ2VBZnRlck1lcmdlKENNZXNzYWdlKiBzZWxmKSB7CisgIGlmICghc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcykgeworICAgIHJldHVybiAwOworICB9CisgIFB5TWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkgPSBHZXRGYWN0b3J5Rm9yTWVzc2FnZShzZWxmKTsKKyAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDogKnNlbGYtPmNvbXBvc2l0ZV9maWVsZHMpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBpdGVtLmZpcnN0OworICAgIGlmIChkZXNjcmlwdG9yLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFICYmCisgICAgICAgICFkZXNjcmlwdG9yLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBDTWVzc2FnZSogY21zZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPihpdGVtLnNlY29uZCk7CisgICAgICBpZiAoY21zZy0+cmVhZF9vbmx5ID09IGZhbHNlKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7CisgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICAgICAgaWYgKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKCptZXNzYWdlLCBkZXNjcmlwdG9yKSkgeworICAgICAgICAvLyBNZXNzYWdlIHVzZWQgdG8gYmUgcmVhZF9vbmx5LCBidXQgaXMgbm8gbG9uZ2VyLiBHZXQgdGhlIG5ldyBwb2ludGVyCisgICAgICAgIC8vIGFuZCByZWNvcmQgaXQuCisgICAgICAgIE1lc3NhZ2UqIG11dGFibGVfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKAorICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvciwgZmFjdG9yeS0+bWVzc2FnZV9mYWN0b3J5KTsKKyAgICAgICAgY21zZy0+bWVzc2FnZSA9IG11dGFibGVfbWVzc2FnZTsKKyAgICAgICAgY21zZy0+cmVhZF9vbmx5ID0gZmFsc2U7CisgICAgICAgIGlmIChGaXh1cE1lc3NhZ2VBZnRlck1lcmdlKGNtc2cpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1ha2luZyBhIG1lc3NhZ2Ugd3JpdGFibGUKKworaW50IEFzc3VyZVdyaXRhYmxlKENNZXNzYWdlKiBzZWxmKSB7CisgIGlmIChzZWxmID09IG51bGxwdHIgfHwgIXNlbGYtPnJlYWRfb25seSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gVG9wbGV2ZWwgbWVzc2FnZXMgYXJlIGFsd2F5cyBtdXRhYmxlLgorICBHT09HTEVfRENIRUNLKHNlbGYtPnBhcmVudCk7CisKKyAgaWYgKEFzc3VyZVdyaXRhYmxlKHNlbGYtPnBhcmVudCkgPT0gLTEpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgLy8gSWYgdGhpcyBtZXNzYWdlIGlzIHBhcnQgb2YgYSBvbmVvZiwgdGhlcmUgbWlnaHQgYmUgYSBmaWVsZCB0byByZWxlYXNlIGluCisgIC8vIHRoZSBwYXJlbnQuCisgIGlmIChNYXliZVJlbGVhc2VPdmVybGFwcGluZ09uZW9mRmllbGQoc2VsZi0+cGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLyBNYWtlIHNlbGYtPm1lc3NhZ2Ugd3JpdGFibGUuCisgIE1lc3NhZ2UqIHBhcmVudF9tZXNzYWdlID0gc2VsZi0+cGFyZW50LT5tZXNzYWdlOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gcGFyZW50X21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgTWVzc2FnZSogbXV0YWJsZV9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UoCisgICAgICBwYXJlbnRfbWVzc2FnZSwgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsCisgICAgICBHZXRGYWN0b3J5Rm9yTWVzc2FnZShzZWxmLT5wYXJlbnQpLT5tZXNzYWdlX2ZhY3RvcnkpOworICBpZiAobXV0YWJsZV9tZXNzYWdlID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgc2VsZi0+bWVzc2FnZSA9IG11dGFibGVfbWVzc2FnZTsKKyAgc2VsZi0+cmVhZF9vbmx5ID0gZmFsc2U7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIC0tLSBHbG9iYWxzOgorCisvLyBSZXRyaWV2ZSBhIEMrKyBGaWVsZERlc2NyaXB0b3IgZm9yIGFuIGV4dGVuc2lvbiBoYW5kbGUuCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIEdldEV4dGVuc2lvbkRlc2NyaXB0b3IoUHlPYmplY3QqIGV4dGVuc2lvbikgeworICBTY29wZWRQeU9iamVjdFB0ciBjZGVzY3JpcHRvcjsKKyAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2soZXh0ZW5zaW9uLCAmUHlGaWVsZERlc2NyaXB0b3JfVHlwZSkpIHsKKyAgICAvLyBNb3N0IGNhbGxlcnMgY29uc2lkZXIgZXh0ZW5zaW9ucyBhcyBhIHBsYWluIGRpY3Rpb25hcnkuICBXZSBzaG91bGQKKyAgICAvLyBhbGxvdyBpbnB1dCB3aGljaCBpcyBub3QgYSBmaWVsZCBkZXNjcmlwdG9yLCBhbmQgc2ltcGx5IHByZXRlbmQgaXQgZG9lcworICAgIC8vIG5vdCBleGlzdC4KKyAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIGV4dGVuc2lvbik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIFB5RmllbGREZXNjcmlwdG9yX0FzRGVzY3JpcHRvcihleHRlbnNpb24pOworfQorCisvLyBJZiB2YWx1ZSBpcyBhIHN0cmluZywgY29udmVydCBpdCBpbnRvIGFuIGVudW0gdmFsdWUgYmFzZWQgb24gdGhlIGxhYmVscyBpbgorLy8gZGVzY3JpcHRvciwgb3RoZXJ3aXNlIHNpbXBseSByZXR1cm4gdmFsdWUuICBBbHdheXMgcmV0dXJucyBhIG5ldyByZWZlcmVuY2UuCitzdGF0aWMgUHlPYmplY3QqIEdldEludGVnZXJFbnVtVmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yJiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiB2YWx1ZSkgeworICBpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgeworICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLmVudW1fdHlwZSgpOworICAgIGlmIChlbnVtX2Rlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm5vdCBhbiBlbnVtIGZpZWxkIik7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2hhciogZW51bV9sYWJlbDsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZSh2YWx1ZSwgJmVudW1fbGFiZWwsICZzaXplKSA8IDApIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlX2Rlc2NyaXB0b3IgPQorICAgICAgICBlbnVtX2Rlc2NyaXB0b3ItPkZpbmRWYWx1ZUJ5TmFtZShTdHJpbmdQYXJhbShlbnVtX2xhYmVsLCBzaXplKSk7CisgICAgaWYgKGVudW1fdmFsdWVfZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgInVua25vd24gZW51bSBsYWJlbCBcIiVzXCIiLCBlbnVtX2xhYmVsKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKGVudW1fdmFsdWVfZGVzY3JpcHRvci0+bnVtYmVyKCkpOworICB9CisgIFB5X0lOQ1JFRih2YWx1ZSk7CisgIHJldHVybiB2YWx1ZTsKK30KKworLy8gRGVsZXRlIGEgc2xpY2UgZnJvbSBhIHJlcGVhdGVkIGZpZWxkLgorLy8gVGhlIG9ubHkgd2F5IHRvIHJlbW92ZSBpdGVtcyBpbiBDKysgcHJvdG9zIGlzIHRvIGRlbGV0ZSB0aGUgbGFzdCBvbmUsCisvLyBzbyB3ZSBzd2FwIGl0ZW1zIHRvIG1vdmUgdGhlIGRlbGV0ZWQgb25lcyBhdCB0aGUgZW5kLCBhbmQgdGhlbiBzdHJpcCB0aGUKKy8vIHNlcXVlbmNlLgoraW50IERlbGV0ZVJlcGVhdGVkRmllbGQoCisgICAgQ01lc3NhZ2UqIHNlbGYsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yLAorICAgIFB5T2JqZWN0KiBzbGljZSkgeworICBQeV9zc2l6ZV90IGxlbmd0aCwgZnJvbSwgdG8sIHN0ZXAsIHNsaWNlX2xlbmd0aDsKKyAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIGludCBtaW4sIG1heDsKKyAgbGVuZ3RoID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKworICBpZiAoUHlTbGljZV9DaGVjayhzbGljZSkpIHsKKyAgICBmcm9tID0gdG8gPSBzdGVwID0gc2xpY2VfbGVuZ3RoID0gMDsKKyAgICBQeVNsaWNlX0dldEluZGljZXNFeChzbGljZSwgbGVuZ3RoLCAmZnJvbSwgJnRvLCAmc3RlcCwgJnNsaWNlX2xlbmd0aCk7CisgICAgaWYgKGZyb20gPCB0bykgeworICAgICAgbWluID0gZnJvbTsKKyAgICAgIG1heCA9IHRvIC0gMTsKKyAgICB9IGVsc2UgeworICAgICAgbWluID0gdG8gKyAxOworICAgICAgbWF4ID0gZnJvbTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZnJvbSA9IHRvID0gUHlMb25nX0FzTG9uZyhzbGljZSk7CisgICAgaWYgKGZyb20gPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxpc3QgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGZyb20gPCAwKSB7CisgICAgICBmcm9tID0gdG8gPSBsZW5ndGggKyBmcm9tOworICAgIH0KKyAgICBzdGVwID0gMTsKKyAgICBtaW4gPSBtYXggPSBmcm9tOworCisgICAgLy8gUmFuZ2UgY2hlY2suCisgICAgaWYgKGZyb20gPCAwIHx8IGZyb20gPj0gbGVuZ3RoKSB7CisgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW5kZXhFcnJvciwgImxpc3QgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICBQeV9zc2l6ZV90IGkgPSBmcm9tOworICBzdGQ6OnZlY3Rvcjxib29sPiB0b19kZWxldGUobGVuZ3RoLCBmYWxzZSk7CisgIHdoaWxlIChpID49IG1pbiAmJiBpIDw9IG1heCkgeworICAgIHRvX2RlbGV0ZVtpXSA9IHRydWU7CisgICAgaSArPSBzdGVwOworICB9CisKKyAgLy8gU3dhcCBlbGVtZW50cyBzbyB0aGF0IGl0ZW1zIHRvIGRlbGV0ZSBhcmUgYXQgdGhlIGVuZC4KKyAgdG8gPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBpZiAoIXRvX2RlbGV0ZVtpXSkgeworICAgICAgaWYgKGkgIT0gdG8pIHsKKyAgICAgICAgcmVmbGVjdGlvbi0+U3dhcEVsZW1lbnRzKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGksIHRvKTsKKyAgICAgIH0KKyAgICAgICsrdG87CisgICAgfQorICB9CisKKyAgQXJlbmEqIGFyZW5hID0gQXJlbmE6OkludGVybmFsR2V0QXJlbmFGb3JBbGxvY2F0aW9uKG1lc3NhZ2UpOworICBHT09HTEVfRENIRUNLX0VRKGFyZW5hLCBudWxscHRyKQorICAgICAgPDwgInB5dGhvbiBwcm90b2J1ZiBpcyBleHBlY3RlZCB0byBiZSBhbGxvY2F0ZWQgZnJvbSBoZWFwIjsKKyAgLy8gUmVtb3ZlIGl0ZW1zLCBzdGFydGluZyBmcm9tIHRoZSBlbmQuCisgIGZvciAoOyBsZW5ndGggPiB0bzsgbGVuZ3RoLS0pIHsKKyAgICBpZiAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgcmVmbGVjdGlvbi0+UmVtb3ZlTGFzdChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvLyBJdCBzZWVtcyB0aGF0IFJlbW92ZUxhc3QoKSBpcyBsZXNzIGVmZmljaWVudCBmb3Igc3ViLW1lc3NhZ2VzLCBhbmQKKyAgICAvLyB0aGUgbWVtb3J5IGlzIG5vdCBjb21wbGV0ZWx5IHJlbGVhc2VkLiBQcmVmZXIgUmVsZWFzZUxhc3QoKS4KKyAgICAvLworICAgIC8vIFRvIHdvcmsgYXJvdW5kIGEgZGVidWcgaGFyZGVuaW5nIChQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UpLAorICAgIC8vIGV4cGxpY2l0bHkgdXNlIFVuc2FmZUFyZW5hUmVsZWFzZUxhc3QuIFRvIG5vdCBicmVhayByYXJlIHVzZSBjYXNlcyB3aGVyZQorICAgIC8vIGFyZW5hIGlzIHVzZWQsIHdlIGZhbGxiYWNrIHRvIFJlbGVhc2VMYXN0IChidXQgR09PR0xFX0RDSEVDSyB0byBmaW5kL2ZpeCBpdCkuCisgICAgLy8KKyAgICAvLyBOb3RlIHRoYXQgYXJlbmEgaXMgbGlrZWx5IG51bGwgYW5kIEdPT0dMRV9EQ0hFQ0sgYW5kIFJlbGVhZXNMYXN0IG1pZ2h0IGJlCisgICAgLy8gcmVkdW5kYW50LiBUaGUgY3VycmVudCBhcHByb2FjaCB0YWtlcyBleHRyYSBjYXV0aW91cyBwYXRoIG5vdCB0byBkaXNydXB0CisgICAgLy8gcHJvZHVjdGlvbi4KKyAgICBNZXNzYWdlKiBzdWJfbWVzc2FnZSA9CisgICAgICAgIChhcmVuYSA9PSBudWxscHRyKQorICAgICAgICAgICAgPyByZWZsZWN0aW9uLT5VbnNhZmVBcmVuYVJlbGVhc2VMYXN0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpCisgICAgICAgICAgICA6IHJlZmxlY3Rpb24tPlJlbGVhc2VMYXN0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICAgIC8vIElmIHRoZXJlIGlzIGEgbGl2ZSB3ZWFrIHJlZmVyZW5jZSB0byBhbiBpdGVtIGJlaW5nIHJlbW92ZWQsIHdlICJSZWxlYXNlIgorICAgIC8vIGl0LCBhbmQgaXQgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBtZXNzYWdlLgorICAgIGlmIChDTWVzc2FnZSogcmVsZWFzZWQgPSBzZWxmLT5NYXliZVJlbGVhc2VTdWJNZXNzYWdlKHN1Yl9tZXNzYWdlKSkgeworICAgICAgcmVsZWFzZWQtPm1lc3NhZ2UgPSBzdWJfbWVzc2FnZTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gc3ViX21lc3NhZ2Ugd2FzIG5vdCB0cmFuc2ZlcnJlZCwgZGVsZXRlIGl0LgorICAgICAgZGVsZXRlIHN1Yl9tZXNzYWdlOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCisvLyBJbml0aWFsaXplcyBmaWVsZHMgb2YgYSBtZXNzYWdlLiBVc2VkIGluIGNvbnN0cnVjdG9ycy4KK2ludCBJbml0QXR0cmlidXRlcyhDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpIHsKKyAgaWYgKGFyZ3MgIT0gbnVsbHB0ciAmJiBQeVR1cGxlX1NpemUoYXJncykgIT0gMCkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJObyBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhbGxvd2VkIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKGt3YXJncyA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgIFB5T2JqZWN0KiBuYW1lOworICBQeU9iamVjdCogdmFsdWU7CisgIHdoaWxlIChQeURpY3RfTmV4dChrd2FyZ3MsICZwb3MsICZuYW1lLCAmdmFsdWUpKSB7CisgICAgaWYgKCEoUHlVbmljb2RlX0NoZWNrKG5hbWUpKSkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJGaWVsZCBuYW1lIG11c3QgYmUgYSBzdHJpbmciKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgU2NvcGVkUHlPYmplY3RQdHIgcHJvcGVydHkoCisgICAgICAgIFB5T2JqZWN0X0dldEF0dHIocmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KFB5X1RZUEUoc2VsZikpLCBuYW1lKSk7CisgICAgaWYgKHByb3BlcnR5ID09IG51bGxwdHIgfHwKKyAgICAgICAgIVB5T2JqZWN0X1R5cGVDaGVjayhwcm9wZXJ0eS5nZXQoKSwgQ0ZpZWxkUHJvcGVydHlfVHlwZSkpIHsKKyAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiUHJvdG9jb2wgbWVzc2FnZSAlcyBoYXMgbm8gXCIlc1wiIGZpZWxkLiIsCisgICAgICAgICAgICAgICAgICAgc2VsZi0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlNZXNzYWdlRmllbGRQcm9wZXJ0eSo+KHByb3BlcnR5LmdldCgpKQorICAgICAgICAgICAgLT5maWVsZF9kZXNjcmlwdG9yOworICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7CisgICAgICAvLyBmaWVsZD1Ob25lIGlzIHRoZSBzYW1lIGFzIG5vIGZpZWxkIGF0IGFsbC4KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRvci0+aXNfbWFwKCkpIHsKKyAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIG1hcChHZXRGaWVsZFZhbHVlKHNlbGYsIGRlc2NyaXB0b3IpKTsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsdWVfZGVzY3JpcHRvciA9CisgICAgICAgICAgZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCktPm1hcF92YWx1ZSgpOworICAgICAgaWYgKHZhbHVlX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgICAgU2NvcGVkUHlPYmplY3RQdHIgaXRlcihQeU9iamVjdF9HZXRJdGVyKHZhbHVlKSk7CisgICAgICAgIGlmIChpdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiQXJndW1lbnQgJXMgaXMgbm90IGl0ZXJhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcobmFtZSkpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBTY29wZWRQeU9iamVjdFB0ciBuZXh0OworICAgICAgICB3aGlsZSAoKG5leHQucmVzZXQoUHlJdGVyX05leHQoaXRlci5nZXQoKSkpKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgU2NvcGVkUHlPYmplY3RQdHIgc291cmNlX3ZhbHVlKFB5T2JqZWN0X0dldEl0ZW0odmFsdWUsIG5leHQuZ2V0KCkpKTsKKyAgICAgICAgICBTY29wZWRQeU9iamVjdFB0ciBkZXN0X3ZhbHVlKFB5T2JqZWN0X0dldEl0ZW0obWFwLmdldCgpLCBuZXh0LmdldCgpKSk7CisgICAgICAgICAgaWYgKHNvdXJjZV92YWx1ZS5nZXQoKSA9PSBudWxscHRyIHx8IGRlc3RfdmFsdWUuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBTY29wZWRQeU9iamVjdFB0ciBvayhQeU9iamVjdF9DYWxsTWV0aG9kKAorICAgICAgICAgICAgICBkZXN0X3ZhbHVlLmdldCgpLCAiTWVyZ2VGcm9tIiwgIk8iLCBzb3VyY2VfdmFsdWUuZ2V0KCkpKTsKKyAgICAgICAgICBpZiAob2suZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgU2NvcGVkUHlPYmplY3RQdHIgZnVuY3Rpb25fcmV0dXJuOworICAgICAgICBmdW5jdGlvbl9yZXR1cm4ucmVzZXQoCisgICAgICAgICAgICBQeU9iamVjdF9DYWxsTWV0aG9kKG1hcC5nZXQoKSwgInVwZGF0ZSIsICJPIiwgdmFsdWUpKTsKKyAgICAgICAgaWYgKGZ1bmN0aW9uX3JldHVybi5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChkZXNjcmlwdG9yLT5sYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQpIHsKKyAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIGNvbnRhaW5lcihHZXRGaWVsZFZhbHVlKHNlbGYsIGRlc2NyaXB0b3IpKTsKKyAgICAgIGlmIChjb250YWluZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgICBSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogcmNfY29udGFpbmVyID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqPihjb250YWluZXIuZ2V0KCkpOworICAgICAgICBTY29wZWRQeU9iamVjdFB0ciBpdGVyKFB5T2JqZWN0X0dldEl0ZXIodmFsdWUpKTsKKyAgICAgICAgaWYgKGl0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJWYWx1ZSBtdXN0IGJlIGl0ZXJhYmxlIik7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIG5leHQ7CisgICAgICAgIHdoaWxlICgobmV4dC5yZXNldChQeUl0ZXJfTmV4dChpdGVyLmdldCgpKSkpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICBQeU9iamVjdCoga3dhcmdzID0gKFB5RGljdF9DaGVjayhuZXh0LmdldCgpKSA/IG5leHQuZ2V0KCkgOiBudWxscHRyKTsKKyAgICAgICAgICBTY29wZWRQeU9iamVjdFB0ciBuZXdfbXNnKAorICAgICAgICAgICAgICByZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyOjpBZGQocmNfY29udGFpbmVyLCBudWxscHRyLCBrd2FyZ3MpKTsKKyAgICAgICAgICBpZiAobmV3X21zZyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChrd2FyZ3MgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gbmV4dCB3YXMgbm90IGEgZGljdCwgaXQncyBhIG1lc3NhZ2Ugd2UgbmVlZCB0byBtZXJnZQorICAgICAgICAgICAgU2NvcGVkUHlPYmplY3RQdHIgbWVyZ2VkKE1lcmdlRnJvbSgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4obmV3X21zZy5nZXQoKSksIG5leHQuZ2V0KCkpKTsKKyAgICAgICAgICAgIGlmIChtZXJnZWQuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGhvdyBQeUl0ZXJfTmV4dCgpIGV4aXRlZC4KKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTSkgeworICAgICAgICBSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogcnNfY29udGFpbmVyID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRTY2FsYXJDb250YWluZXIqPihjb250YWluZXIuZ2V0KCkpOworICAgICAgICBTY29wZWRQeU9iamVjdFB0ciBpdGVyKFB5T2JqZWN0X0dldEl0ZXIodmFsdWUpKTsKKyAgICAgICAgaWYgKGl0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJWYWx1ZSBtdXN0IGJlIGl0ZXJhYmxlIik7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIG5leHQ7CisgICAgICAgIHdoaWxlICgobmV4dC5yZXNldChQeUl0ZXJfTmV4dChpdGVyLmdldCgpKSkpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICBTY29wZWRQeU9iamVjdFB0ciBlbnVtX3ZhbHVlKAorICAgICAgICAgICAgICBHZXRJbnRlZ2VyRW51bVZhbHVlKCpkZXNjcmlwdG9yLCBuZXh0LmdldCgpKSk7CisgICAgICAgICAgaWYgKGVudW1fdmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBTY29wZWRQeU9iamVjdFB0ciBuZXdfbXNnKHJlcGVhdGVkX3NjYWxhcl9jb250YWluZXI6OkFwcGVuZCgKKyAgICAgICAgICAgICAgcnNfY29udGFpbmVyLCBlbnVtX3ZhbHVlLmdldCgpKSk7CisgICAgICAgICAgaWYgKG5ld19tc2cgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBob3cgUHlJdGVyX05leHQoKSBleGl0ZWQuCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoU2NvcGVkUHlPYmplY3RQdHIocmVwZWF0ZWRfc2NhbGFyX2NvbnRhaW5lcjo6RXh0ZW5kKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRTY2FsYXJDb250YWluZXIqPihjb250YWluZXIuZ2V0KCkpLAorICAgICAgICAgICAgICAgIHZhbHVlKSkgPT0gbnVsbHB0cikgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgU2NvcGVkUHlPYmplY3RQdHIgbWVzc2FnZShHZXRGaWVsZFZhbHVlKHNlbGYsIGRlc2NyaXB0b3IpKTsKKyAgICAgIGlmIChtZXNzYWdlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgQ01lc3NhZ2UqIGNtZXNzYWdlID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KG1lc3NhZ2UuZ2V0KCkpOworICAgICAgaWYgKFB5RGljdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgLy8gTWFrZSB0aGUgbWVzc2FnZSBleGlzdCBldmVuIGlmIHRoZSBkaWN0IGlzIGVtcHR5LgorICAgICAgICBBc3N1cmVXcml0YWJsZShjbWVzc2FnZSk7CisgICAgICAgIGlmIChJbml0QXR0cmlidXRlcyhjbWVzc2FnZSwgbnVsbHB0ciwgdmFsdWUpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgU2NvcGVkUHlPYmplY3RQdHIgbWVyZ2VkKE1lcmdlRnJvbShjbWVzc2FnZSwgdmFsdWUpKTsKKyAgICAgICAgaWYgKG1lcmdlZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIG5ld192YWw7CisgICAgICBpZiAoZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTSkgeworICAgICAgICBuZXdfdmFsLnJlc2V0KEdldEludGVnZXJFbnVtVmFsdWUoKmRlc2NyaXB0b3IsIHZhbHVlKSk7CisgICAgICAgIGlmIChuZXdfdmFsID09IG51bGxwdHIpIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgdmFsdWUgPSBuZXdfdmFsLmdldCgpOworICAgICAgfQorICAgICAgaWYgKFNldEZpZWxkVmFsdWUoc2VsZiwgZGVzY3JpcHRvciwgdmFsdWUpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvLyBBbGxvY2F0ZXMgYW4gaW5jb21wbGV0ZSBQeXRob24gTWVzc2FnZTogdGhlIGNhbGxlciBtdXN0IGZpbGwgc2VsZi0+bWVzc2FnZQorLy8gYW5kIGV2ZW50dWFsbHkgc2VsZi0+cGFyZW50LgorQ01lc3NhZ2UqIE5ld0VtcHR5TWVzc2FnZShDTWVzc2FnZUNsYXNzKiB0eXBlKSB7CisgIENNZXNzYWdlKiBzZWxmID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KAorICAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYygmdHlwZS0+c3VwZXIuaHRfdHlwZSwgMCkpOworICBpZiAoc2VsZiA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBzZWxmLT5tZXNzYWdlID0gbnVsbHB0cjsKKyAgc2VsZi0+cGFyZW50ID0gbnVsbHB0cjsKKyAgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IgPSBudWxscHRyOworICBzZWxmLT5yZWFkX29ubHkgPSBmYWxzZTsKKworICBzZWxmLT5jb21wb3NpdGVfZmllbGRzID0gbnVsbHB0cjsKKyAgc2VsZi0+Y2hpbGRfc3VibWVzc2FnZXMgPSBudWxscHRyOworCisgIHNlbGYtPnVua25vd25fZmllbGRfc2V0ID0gbnVsbHB0cjsKKworICByZXR1cm4gc2VsZjsKK30KKworLy8gVGhlIF9fbmV3X18gbWV0aG9kIG9mIE1lc3NhZ2UgY2xhc3Nlcy4KKy8vIENyZWF0ZXMgYSBuZXcgQysrIG1lc3NhZ2UgYW5kIHRha2VzIG93bmVyc2hpcC4KK3N0YXRpYyBDTWVzc2FnZSogTmV3Q01lc3NhZ2UoQ01lc3NhZ2VDbGFzcyogdHlwZSkgeworICAvLyBSZXRyaWV2ZSB0aGUgbWVzc2FnZSBkZXNjcmlwdG9yIGFuZCB0aGUgZGVmYXVsdCBpbnN0YW5jZSAoPXByb3RvdHlwZSkuCisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfZGVzY3JpcHRvciA9IHR5cGUtPm1lc3NhZ2VfZGVzY3JpcHRvcjsKKyAgaWYgKG1lc3NhZ2VfZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgLy8gVGhpcyB3b3VsZCBiZSB2ZXJ5IHVuZXhwZWN0ZWQgc2luY2UgdGhlIENNZXNzYWdlQ2xhc3MgaGFzIGFscmVhZHkKKyAgICAvLyBiZWVuIGNoZWNrZWQuCisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIkNNZXNzYWdlQ2xhc3Mgb2JqZWN0ICclcycgaGFzIG5vIGRlc2NyaXB0b3IuIiwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRSh0eXBlKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgY29uc3QgTWVzc2FnZSogcHJvdG90eXBlID0KKyAgICAgIHR5cGUtPnB5X21lc3NhZ2VfZmFjdG9yeS0+bWVzc2FnZV9mYWN0b3J5LT5HZXRQcm90b3R5cGUoCisgICAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yKTsKKyAgaWYgKHByb3RvdHlwZSA9PSBudWxscHRyKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbWVzc2FnZV9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIENNZXNzYWdlKiBzZWxmID0gTmV3RW1wdHlNZXNzYWdlKHR5cGUpOworICBpZiAoc2VsZiA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgc2VsZi0+bWVzc2FnZSA9IHByb3RvdHlwZS0+TmV3KG51bGxwdHIpOyAgLy8gRW5zdXJlcyBubyBhcmVuYSBpcyB1c2VkLgorICBzZWxmLT5wYXJlbnQgPSBudWxscHRyOyAgLy8gVGhpcyBtZXNzYWdlIG93bnMgaXRzIGRhdGEuCisgIHJldHVybiBzZWxmOworfQorCitzdGF0aWMgUHlPYmplY3QqIE5ldyhQeVR5cGVPYmplY3QqIGNscywgUHlPYmplY3QqIHVudXNlZF9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHVudXNlZF9rd2FyZ3MpIHsKKyAgQ01lc3NhZ2VDbGFzcyogdHlwZSA9IENoZWNrTWVzc2FnZUNsYXNzKGNscyk7CisgIGlmICh0eXBlID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KE5ld0NNZXNzYWdlKHR5cGUpKTsKK30KKworLy8gVGhlIF9faW5pdF9fIG1ldGhvZCBvZiBNZXNzYWdlIGNsYXNzZXMuCisvLyBJdCBpbml0aWFsaXplcyBmaWVsZHMgZnJvbSBrZXl3b3JkcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorc3RhdGljIGludCBJbml0KENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykgeworICByZXR1cm4gSW5pdEF0dHJpYnV0ZXMoc2VsZiwgYXJncywga3dhcmdzKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWFsbG9jYXRpbmcgYSBDTWVzc2FnZQorCitzdGF0aWMgdm9pZCBEZWFsbG9jKENNZXNzYWdlKiBzZWxmKSB7CisgIGlmIChzZWxmLT53ZWFrcmVmbGlzdCkgeworICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMocmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpKTsKKyAgfQorICAvLyBBdCB0aGlzIHBvaW50IGFsbCBkZXBlbmRlbnQgb2JqZWN0cyBoYXZlIGJlZW4gcmVtb3ZlZC4KKyAgR09PR0xFX0RDSEVDSyghc2VsZi0+Y2hpbGRfc3VibWVzc2FnZXMgfHwgc2VsZi0+Y2hpbGRfc3VibWVzc2FnZXMtPmVtcHR5KCkpOworICBHT09HTEVfRENIRUNLKCFzZWxmLT5jb21wb3NpdGVfZmllbGRzIHx8IHNlbGYtPmNvbXBvc2l0ZV9maWVsZHMtPmVtcHR5KCkpOworICBkZWxldGUgc2VsZi0+Y2hpbGRfc3VibWVzc2FnZXM7CisgIGRlbGV0ZSBzZWxmLT5jb21wb3NpdGVfZmllbGRzOworICBpZiAoc2VsZi0+dW5rbm93bl9maWVsZF9zZXQpIHsKKyAgICB1bmtub3duX2ZpZWxkczo6Q2xlYXIoCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlVbmtub3duRmllbGRzKj4oc2VsZi0+dW5rbm93bl9maWVsZF9zZXQpKTsKKyAgfQorCisgIENNZXNzYWdlKiBwYXJlbnQgPSBzZWxmLT5wYXJlbnQ7CisgIGlmICghcGFyZW50KSB7CisgICAgLy8gTm8gcGFyZW50LCB3ZSBvd24gdGhlIG1lc3NhZ2UuCisgICAgZGVsZXRlIHNlbGYtPm1lc3NhZ2U7CisgIH0gZWxzZSBpZiAocGFyZW50LT5Bc1B5T2JqZWN0KCkgPT0gUHlfTm9uZSkgeworICAgIC8vIE1lc3NhZ2Ugb3duZWQgZXh0ZXJuYWxseTogTm90aGluZyB0byBkZWFsbG9jCisgICAgUHlfQ0xFQVIoc2VsZi0+cGFyZW50KTsKKyAgfSBlbHNlIHsKKyAgICAvLyBDbGVhciB0aGlzIG1lc3NhZ2UgZnJvbSBpdHMgcGFyZW50J3MgbWFwLgorICAgIGlmIChzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvci0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgaWYgKHBhcmVudC0+Y2hpbGRfc3VibWVzc2FnZXMpCisgICAgICAgIHBhcmVudC0+Y2hpbGRfc3VibWVzc2FnZXMtPmVyYXNlKHNlbGYtPm1lc3NhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAocGFyZW50LT5jb21wb3NpdGVfZmllbGRzKQorICAgICAgICBwYXJlbnQtPmNvbXBvc2l0ZV9maWVsZHMtPmVyYXNlKHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKKyAgICB9CisgICAgUHlfQ0xFQVIoc2VsZi0+cGFyZW50KTsKKyAgfQorICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1B5T2JqZWN0KiBJc0luaXRpYWxpemVkKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBQeU9iamVjdCogZXJyb3JzID0gbnVsbHB0cjsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8TyIsICZlcnJvcnMpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKHNlbGYtPm1lc3NhZ2UtPklzSW5pdGlhbGl6ZWQoKSkgeworICAgIFB5X1JFVFVSTl9UUlVFOworICB9CisgIGlmIChlcnJvcnMgIT0gbnVsbHB0cikgeworICAgIFNjb3BlZFB5T2JqZWN0UHRyIGluaXRpYWxpemF0aW9uX2Vycm9ycygKKyAgICAgICAgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKHNlbGYpKTsKKyAgICBpZiAoaW5pdGlhbGl6YXRpb25fZXJyb3JzID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBTY29wZWRQeU9iamVjdFB0ciBleHRlbmRfbmFtZShQeVVuaWNvZGVfRnJvbVN0cmluZygiZXh0ZW5kIikpOworICAgIGlmIChleHRlbmRfbmFtZSA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgU2NvcGVkUHlPYmplY3RQdHIgcmVzdWx0KFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKAorICAgICAgICBlcnJvcnMsIGV4dGVuZF9uYW1lLmdldCgpLCBpbml0aWFsaXphdGlvbl9lcnJvcnMuZ2V0KCksIG51bGxwdHIpKTsKKyAgICBpZiAocmVzdWx0ID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgfQorICBQeV9SRVRVUk5fRkFMU0U7Cit9CisKK2ludCBIYXNGaWVsZEJ5RGVzY3JpcHRvcihDTWVzc2FnZSogc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IpIHsKKyAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7CisgIGlmICghQ2hlY2tGaWVsZEJlbG9uZ3NUb01lc3NhZ2UoZmllbGRfZGVzY3JpcHRvciwgbWVzc2FnZSkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKGZpZWxkX2Rlc2NyaXB0b3ItPmxhYmVsKCkgPT0gRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkZpZWxkIGlzIHJlcGVhdGVkLiBBIHNpbmd1bGFyIG1ldGhvZCBpcyByZXF1aXJlZC4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRGaWVsZFdpdGhPbmVvZnMoY29uc3QgTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFN0cmluZ1BhcmFtIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogaW5fb25lb2YpIHsKKyAgKmluX29uZW9mID0gZmFsc2U7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9CisgICAgICBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoZmllbGRfbmFtZSk7CisgIGlmIChmaWVsZF9kZXNjcmlwdG9yICE9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gZmllbGRfZGVzY3JpcHRvcjsKKyAgfQorICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2MgPQorICAgICAgZGVzY3JpcHRvci0+RmluZE9uZW9mQnlOYW1lKGZpZWxkX25hbWUpOworICBpZiAob25lb2ZfZGVzYyAhPSBudWxscHRyKSB7CisgICAgKmluX29uZW9mID0gdHJ1ZTsKKyAgICByZXR1cm4gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRPbmVvZkZpZWxkRGVzY3JpcHRvcigqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVvZl9kZXNjKTsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKworYm9vbCBDaGVja0hhc1ByZXNlbmNlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwgYm9vbCBpbl9vbmVvZikgeworICBhdXRvIG1lc3NhZ2VfbmFtZSA9IGZpZWxkX2Rlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpLT5uYW1lKCk7CisgIGlmIChmaWVsZF9kZXNjcmlwdG9yLT5sYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgIlByb3RvY29sIG1lc3NhZ2UgJXMgaGFzIG5vIHNpbmd1bGFyIFwiJXNcIiBmaWVsZC4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlX25hbWUuY19zdHIoKSwgZmllbGRfZGVzY3JpcHRvci0+bmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghZmllbGRfZGVzY3JpcHRvci0+aGFzX3ByZXNlbmNlKCkpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgIkNhbid0IHRlc3Qgbm9uLW9wdGlvbmFsLCBub24tc3VibWVzc2FnZSBmaWVsZCBcIiVzLiVzXCIgZm9yICIKKyAgICAgICAgICAgICAgICAgInByZXNlbmNlIGluIHByb3RvMy4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlX25hbWUuY19zdHIoKSwgZmllbGRfZGVzY3JpcHRvci0+bmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitQeU9iamVjdCogSGFzRmllbGQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgY2hhciogZmllbGRfbmFtZTsKKyAgUHlfc3NpemVfdCBzaXplOworICBmaWVsZF9uYW1lID0gY29uc3RfY2FzdDxjaGFyKj4oUHlVbmljb2RlX0FzVVRGOEFuZFNpemUoYXJnLCAmc2l6ZSkpOworICBpZiAoIWZpZWxkX25hbWUpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOworICBib29sIGlzX2luX29uZW9mOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPQorICAgICAgRmluZEZpZWxkV2l0aE9uZW9mcyhtZXNzYWdlLCBTdHJpbmdQYXJhbShmaWVsZF9uYW1lLCBzaXplKSwgJmlzX2luX29uZW9mKTsKKyAgaWYgKGZpZWxkX2Rlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgIGlmICghaXNfaW5fb25lb2YpIHsKKyAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiUHJvdG9jb2wgbWVzc2FnZSAlcyBoYXMgbm8gZmllbGQgJXMuIiwKKyAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPm5hbWUoKS5jX3N0cigpLCBmaWVsZF9uYW1lKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgfQorICB9CisKKyAgaWYgKCFDaGVja0hhc1ByZXNlbmNlKGZpZWxkX2Rlc2NyaXB0b3IsIGlzX2luX29uZW9mKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgaWYgKG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpKSB7CisgICAgUHlfUkVUVVJOX1RSVUU7CisgIH0KKworICBQeV9SRVRVUk5fRkFMU0U7Cit9CisKK1B5T2JqZWN0KiBDbGVhckV4dGVuc2lvbihDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGV4dGVuc2lvbikgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBHZXRFeHRlbnNpb25EZXNjcmlwdG9yKGV4dGVuc2lvbik7CisgIGlmIChkZXNjcmlwdG9yID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoQ2xlYXJGaWVsZEJ5RGVzY3JpcHRvcihzZWxmLCBkZXNjcmlwdG9yKSA8IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeV9SRVRVUk5fTk9ORTsKK30KKworUHlPYmplY3QqIEhhc0V4dGVuc2lvbihDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGV4dGVuc2lvbikgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBHZXRFeHRlbnNpb25EZXNjcmlwdG9yKGV4dGVuc2lvbik7CisgIGlmIChkZXNjcmlwdG9yID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpbnQgaGFzX2ZpZWxkID0gSGFzRmllbGRCeURlc2NyaXB0b3Ioc2VsZiwgZGVzY3JpcHRvcik7CisgIGlmIChoYXNfZmllbGQgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhoYXNfZmllbGQpOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmVsZWFzaW5nIG1lc3NhZ2VzCisvLworLy8gVGhlIFB5dGhvbiBBUEkncyBDbGVhckZpZWxkKCkgYW5kIENsZWFyKCkgbWV0aG9kcyBiZWhhdmUKKy8vIGRpZmZlcmVudGx5IHRoYW4gdGhlaXIgQysrIGNvdW50ZXJwYXJ0cy4gIFdoaWxlIHRoZSBDKysgdmVyc2lvbnMKKy8vIGNsZWFycyB0aGUgY2hpbGRyZW4sIHRoZSBQeXRob24gdmVyc2lvbnMgZGV0YWNoZXMgdGhlIGNoaWxkcmVuLAorLy8gd2l0aG91dCB0b3VjaGluZyB0aGVpciBjb250ZW50LiAgVGhpcyBpbXBlZGFuY2UgbWlzbWF0Y2ggY2F1c2VzCisvLyBzb21lIGNvbXBsZXhpdHkgaW4gdGhlIGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBjYXB0dXJlZCBpbiB0aGlzCisvLyBzZWN0aW9uLgorLy8KKy8vIFdoZW4gb25lIG9yIG11bHRpcGxlIGZpZWxkcyBhcmUgY2xlYXJlZCB3ZSBuZWVkIHRvOgorLy8KKy8vICogR2F0aGVyIGFsbCBjaGlsZCBvYmplY3RzIHRoYXQgbmVlZCB0byBiZSBkZXRhY2hlZCBmcm9tIHRoZSBtZXNzYWdlLgorLy8gICBJbiBjb21wb3NpdGVfZmllbGRzIGFuZCBjaGlsZF9zdWJtZXNzYWdlcy4KKy8vCisvLyAqIENyZWF0ZSBhIG5ldyBQeXRob24gbWVzc2FnZSBvZiB0aGUgc2FtZSBraW5kLiBVc2UgU3dhcEZpZWxkcygpIHRvIG1vdmUKKy8vICAgZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCBtZXNzYWdlLgorLy8KKy8vICogQ2hhbmdlIHRoZSBwYXJlbnQgb2YgYWxsIGNoaWxkIG9iamVjdHM6IHVwZGF0ZSB0aGVpciBzdHJvbmcgcmVmZXJlbmNlCisvLyAgIHRvIHRoZWlyIHBhcmVudCwgYW5kIG1vdmUgdGhlaXIgcHJlc2VuY2UgaW4gY29tcG9zaXRlX2ZpZWxkcyBhbmQKKy8vICAgY2hpbGRfc3VibWVzc2FnZXMuCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmVsZWFzZSBhIGNvbXBvc2l0ZSBjaGlsZCBvZiBhIENNZXNzYWdlCisKK3N0YXRpYyBpbnQgSW50ZXJuYWxSZXBhcmVudEZpZWxkcygKKyAgICBDTWVzc2FnZSogc2VsZiwgY29uc3Qgc3RkOjp2ZWN0b3I8Q01lc3NhZ2UqPiYgbWVzc2FnZXNfdG9fcmVsZWFzZSwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDb250YWluZXJCYXNlKj4mIGNvbnRhaW5lcnNfdG9fcmVsZWFzZSkgeworICBpZiAobWVzc2FnZXNfdG9fcmVsZWFzZS5lbXB0eSgpICYmIGNvbnRhaW5lcnNfdG9fcmVsZWFzZS5lbXB0eSgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBNb3ZlIGFsbCB0aGUgcGFzc2VkIHN1Yl9tZXNzYWdlcyB0byBhbm90aGVyIG1lc3NhZ2UuCisgIENNZXNzYWdlKiBuZXdfbWVzc2FnZSA9IGNtZXNzYWdlOjpOZXdFbXB0eU1lc3NhZ2Uoc2VsZi0+R2V0TWVzc2FnZUNsYXNzKCkpOworICBpZiAobmV3X21lc3NhZ2UgPT0gbnVsbHB0cikgeworICAgIHJldHVybiAtMTsKKyAgfQorICBuZXdfbWVzc2FnZS0+bWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2UtPk5ldyhudWxscHRyKTsKKyAgU2NvcGVkUHlPYmplY3RQdHIgaG9sZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihuZXdfbWVzc2FnZSkpOworICBuZXdfbWVzc2FnZS0+Y2hpbGRfc3VibWVzc2FnZXMgPSBuZXcgQ01lc3NhZ2U6OlN1Yk1lc3NhZ2VzTWFwKCk7CisgIG5ld19tZXNzYWdlLT5jb21wb3NpdGVfZmllbGRzID0gbmV3IENNZXNzYWdlOjpDb21wb3NpdGVGaWVsZHNNYXAoKTsKKyAgc3RkOjpzZXQ8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzX3RvX3N3YXA7CisKKyAgLy8gSW4gY2FzZSB0aGlzIHRoZSByZW1vdmVkIGZpZWxkcyBhcmUgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGEgbWVzc2FnZSwga2VlcAorICAvLyBhIHJlZmVyZW5jZS4KKyAgUHlfSU5DUkVGKHNlbGYpOworCisgIGZvciAoY29uc3QgYXV0byYgdG9fcmVsZWFzZSA6IG1lc3NhZ2VzX3RvX3JlbGVhc2UpIHsKKyAgICBmaWVsZHNfdG9fc3dhcC5pbnNlcnQodG9fcmVsZWFzZS0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IpOworICAgIC8vIFJlcGFyZW50CisgICAgUHlfSU5DUkVGKG5ld19tZXNzYWdlKTsKKyAgICBQeV9ERUNSRUYodG9fcmVsZWFzZS0+cGFyZW50KTsKKyAgICB0b19yZWxlYXNlLT5wYXJlbnQgPSBuZXdfbWVzc2FnZTsKKyAgICBzZWxmLT5jaGlsZF9zdWJtZXNzYWdlcy0+ZXJhc2UodG9fcmVsZWFzZS0+bWVzc2FnZSk7CisgICAgbmV3X21lc3NhZ2UtPmNoaWxkX3N1Ym1lc3NhZ2VzLT5lbXBsYWNlKHRvX3JlbGVhc2UtPm1lc3NhZ2UsIHRvX3JlbGVhc2UpOworICB9CisKKyAgZm9yIChjb25zdCBhdXRvJiB0b19yZWxlYXNlIDogY29udGFpbmVyc190b19yZWxlYXNlKSB7CisgICAgZmllbGRzX3RvX3N3YXAuaW5zZXJ0KHRvX3JlbGVhc2UtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKKyAgICBQeV9JTkNSRUYobmV3X21lc3NhZ2UpOworICAgIFB5X0RFQ1JFRih0b19yZWxlYXNlLT5wYXJlbnQpOworICAgIHRvX3JlbGVhc2UtPnBhcmVudCA9IG5ld19tZXNzYWdlOworICAgIHNlbGYtPmNvbXBvc2l0ZV9maWVsZHMtPmVyYXNlKHRvX3JlbGVhc2UtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKKyAgICBuZXdfbWVzc2FnZS0+Y29tcG9zaXRlX2ZpZWxkcy0+ZW1wbGFjZSh0b19yZWxlYXNlLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19yZWxlYXNlKTsKKyAgfQorCisgIGlmIChzZWxmLT5tZXNzYWdlLT5HZXRBcmVuYSgpID09IG5ld19tZXNzYWdlLT5tZXNzYWdlLT5HZXRBcmVuYSgpKSB7CisgICAgTWVzc2FnZVJlZmxlY3Rpb25GcmllbmQ6OlVuc2FmZVNoYWxsb3dTd2FwRmllbGRzKAorICAgICAgICBzZWxmLT5tZXNzYWdlLCBuZXdfbWVzc2FnZS0+bWVzc2FnZSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4oZmllbGRzX3RvX3N3YXAuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzX3RvX3N3YXAuZW5kKCkpKTsKKyAgfSBlbHNlIHsKKyAgICBzZWxmLT5tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlN3YXBGaWVsZHMoCisgICAgICAgIHNlbGYtPm1lc3NhZ2UsIG5ld19tZXNzYWdlLT5tZXNzYWdlLAorICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPihmaWVsZHNfdG9fc3dhcC5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNfdG9fc3dhcC5lbmQoKSkpOworICB9CisKKyAgLy8gVGhpcyBtaWdodCBkZWxldGUgdGhlIFB5dGhvbiBtZXNzYWdlIGNvbXBsZXRlbHkgaWYgYWxsIGNoaWxkcmVuIHdlcmUgbW92ZWQuCisgIFB5X0RFQ1JFRihzZWxmKTsKKworICByZXR1cm4gMDsKK30KKworaW50IEludGVybmFsUmVsZWFzZUZpZWxkQnlEZXNjcmlwdG9yKAorICAgIENNZXNzYWdlKiBzZWxmLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcikgeworICBpZiAoIWZpZWxkX2Rlc2NyaXB0b3ItPmlzX3JlcGVhdGVkKCkgJiYKKyAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAvLyBTaW5nbGUgc2NhbGFycyBhcmUgbm90IGluIGFueSBjYWNoZS4KKyAgICByZXR1cm4gMDsKKyAgfQorICBzdGQ6OnZlY3RvcjxDTWVzc2FnZSo+IG1lc3NhZ2VzX3RvX3JlbGVhc2U7CisgIHN0ZDo6dmVjdG9yPENvbnRhaW5lckJhc2UqPiBjb250YWluZXJzX3RvX3JlbGVhc2U7CisgIGlmIChzZWxmLT5jaGlsZF9zdWJtZXNzYWdlcyAmJiBmaWVsZF9kZXNjcmlwdG9yLT5pc19yZXBlYXRlZCgpICYmCisgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBjaGlsZF9pdGVtIDogKnNlbGYtPmNoaWxkX3N1Ym1lc3NhZ2VzKSB7CisgICAgICBpZiAoY2hpbGRfaXRlbS5zZWNvbmQtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yID09IGZpZWxkX2Rlc2NyaXB0b3IpIHsKKyAgICAgICAgbWVzc2FnZXNfdG9fcmVsZWFzZS5wdXNoX2JhY2soY2hpbGRfaXRlbS5zZWNvbmQpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcykgeworICAgIENNZXNzYWdlOjpDb21wb3NpdGVGaWVsZHNNYXA6Oml0ZXJhdG9yIGl0ID0KKyAgICAgICAgc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcy0+ZmluZChmaWVsZF9kZXNjcmlwdG9yKTsKKyAgICBpZiAoaXQgIT0gc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcy0+ZW5kKCkpIHsKKyAgICAgIGNvbnRhaW5lcnNfdG9fcmVsZWFzZS5wdXNoX2JhY2soaXQtPnNlY29uZCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEludGVybmFsUmVwYXJlbnRGaWVsZHMoc2VsZiwgbWVzc2FnZXNfdG9fcmVsZWFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyc190b19yZWxlYXNlKTsKK30KKworaW50IENsZWFyRmllbGRCeURlc2NyaXB0b3IoQ01lc3NhZ2UqIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IpIHsKKyAgaWYgKCFDaGVja0ZpZWxkQmVsb25nc1RvTWVzc2FnZShmaWVsZF9kZXNjcmlwdG9yLCBzZWxmLT5tZXNzYWdlKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoSW50ZXJuYWxSZWxlYXNlRmllbGRCeURlc2NyaXB0b3Ioc2VsZiwgZmllbGRfZGVzY3JpcHRvcikgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIEFzc3VyZVdyaXRhYmxlKHNlbGYpOworICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKKyAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5DbGVhckZpZWxkKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICByZXR1cm4gMDsKK30KKworUHlPYmplY3QqIENsZWFyRmllbGQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgY2hhciogZmllbGRfbmFtZTsKKyAgUHlfc3NpemVfdCBmaWVsZF9zaXplOworICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZywgJmZpZWxkX25hbWUsICZmaWVsZF9zaXplKSA8IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBBc3N1cmVXcml0YWJsZShzZWxmKTsKKyAgYm9vbCBpc19pbl9vbmVvZjsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0gRmluZEZpZWxkV2l0aE9uZW9mcygKKyAgICAgIHNlbGYtPm1lc3NhZ2UsIFN0cmluZ1BhcmFtKGZpZWxkX25hbWUsIGZpZWxkX3NpemUpLCAmaXNfaW5fb25lb2YpOworICBpZiAoZmllbGRfZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgaWYgKGlzX2luX29uZW9mKSB7CisgICAgICAvLyBXZSBnYXZlIHRoZSBuYW1lIG9mIGEgb25lb2YsIGFuZCBub25lIG9mIGl0cyBmaWVsZHMgYXJlIHNldC4KKyAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0gZWxzZSB7CisgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiUHJvdG9jb2wgbWVzc2FnZSBoYXMgbm8gXCIlc1wiIGZpZWxkLiIsIGZpZWxkX25hbWUpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICB9CisKKyAgaWYgKENsZWFyRmllbGRCeURlc2NyaXB0b3Ioc2VsZiwgZmllbGRfZGVzY3JpcHRvcikgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgUHlfUkVUVVJOX05PTkU7Cit9CisKK1B5T2JqZWN0KiBDbGVhcihDTWVzc2FnZSogc2VsZikgeworICBBc3N1cmVXcml0YWJsZShzZWxmKTsKKyAgLy8gRGV0YWNoIGFsbCBjdXJyZW50IGZpZWxkcyBvZiB0aGlzIG1lc3NhZ2UKKyAgc3RkOjp2ZWN0b3I8Q01lc3NhZ2UqPiBtZXNzYWdlc190b19yZWxlYXNlOworICBzdGQ6OnZlY3RvcjxDb250YWluZXJCYXNlKj4gY29udGFpbmVyc190b19yZWxlYXNlOworICBpZiAoc2VsZi0+Y2hpbGRfc3VibWVzc2FnZXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiAqc2VsZi0+Y2hpbGRfc3VibWVzc2FnZXMpIHsKKyAgICAgIG1lc3NhZ2VzX3RvX3JlbGVhc2UucHVzaF9iYWNrKGl0ZW0uc2Vjb25kKTsKKyAgICB9CisgIH0KKyAgaWYgKHNlbGYtPmNvbXBvc2l0ZV9maWVsZHMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiAqc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcykgeworICAgICAgY29udGFpbmVyc190b19yZWxlYXNlLnB1c2hfYmFjayhpdGVtLnNlY29uZCk7CisgICAgfQorICB9CisgIGlmIChJbnRlcm5hbFJlcGFyZW50RmllbGRzKHNlbGYsIG1lc3NhZ2VzX3RvX3JlbGVhc2UsIGNvbnRhaW5lcnNfdG9fcmVsZWFzZSkgPAorICAgICAgMCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChzZWxmLT51bmtub3duX2ZpZWxkX3NldCkgeworICAgIHVua25vd25fZmllbGRzOjpDbGVhcigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeVVua25vd25GaWVsZHMqPihzZWxmLT51bmtub3duX2ZpZWxkX3NldCkpOworICAgIHNlbGYtPnVua25vd25fZmllbGRfc2V0ID0gbnVsbHB0cjsKKyAgfQorICBzZWxmLT5tZXNzYWdlLT5DbGVhcigpOworICBQeV9SRVRVUk5fTk9ORTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBzdGQ6OnN0cmluZyBHZXRNZXNzYWdlTmFtZShDTWVzc2FnZSogc2VsZikgeworICBpZiAoc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IgIT0gbnVsbHB0cikgeworICAgIHJldHVybiBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHNlbGYtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCk7CisgIH0KK30KKworc3RhdGljIFB5T2JqZWN0KiBJbnRlcm5hbFNlcmlhbGl6ZVRvU3RyaW5nKAorICAgIENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncywKKyAgICBib29sIHJlcXVpcmVfaW5pdGlhbGl6ZWQpIHsKKyAgLy8gUGFyc2UgdGhlICJkZXRlcm1pbmlzdGljIiBrd2FyZzsgZGVmYXVsdHMgdG8gRmFsc2UuCisgIHN0YXRpYyBjb25zdCBjaGFyKiBrd2xpc3RbXSA9IHsiZGV0ZXJtaW5pc3RpYyIsIG51bGxwdHJ9OworICBQeU9iamVjdCogZGV0ZXJtaW5pc3RpY19vYmogPSBQeV9Ob25lOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygKKyAgICAgICAgICBhcmdzLCBrd2FyZ3MsICJ8TyIsIGNvbnN0X2Nhc3Q8Y2hhcioqPihrd2xpc3QpLCAmZGV0ZXJtaW5pc3RpY19vYmopKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgLy8gUHJlZW1wdGl2ZWx5IGNvbnZlcnQgdG8gYSBib29sIGZpcnN0LCBzbyB3ZSBkb24ndCBuZWVkIHRvIGJhY2sgb3V0IG9mCisgIC8vIGFsbG9jYXRpbmcgbWVtb3J5IGlmIHRoaXMgcmFpc2VzIGFuIGV4Y2VwdGlvbi4KKyAgLy8gTk9URTogVGhpcyBpcyB1bnVzZWQgbGF0ZXIgaWYgZGV0ZXJtaW5pc3RpYyA9PSBQeV9Ob25lLCBidXQgdGhhdCdzIGZpbmUuCisgIGludCBkZXRlcm1pbmlzdGljID0gUHlPYmplY3RfSXNUcnVlKGRldGVybWluaXN0aWNfb2JqKTsKKyAgaWYgKGRldGVybWluaXN0aWMgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBpZiAocmVxdWlyZV9pbml0aWFsaXplZCAmJiAhc2VsZi0+bWVzc2FnZS0+SXNJbml0aWFsaXplZCgpKSB7CisgICAgU2NvcGVkUHlPYmplY3RQdHIgZXJyb3JzKEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhzZWxmKSk7CisgICAgaWYgKGVycm9ycyA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgU2NvcGVkUHlPYmplY3RQdHIgY29tbWEoUHlVbmljb2RlX0Zyb21TdHJpbmcoIiwiKSk7CisgICAgaWYgKGNvbW1hID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBTY29wZWRQeU9iamVjdFB0ciBqb2luZWQoCisgICAgICAgIFB5T2JqZWN0X0NhbGxNZXRob2QoY29tbWEuZ2V0KCksICJqb2luIiwgIk8iLCBlcnJvcnMuZ2V0KCkpKTsKKyAgICBpZiAoam9pbmVkID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIC8vIFRPRE8oaGFiZXJtYW4pOiB0aGlzIGlzIGEgKGhvcGVmdWxseSB0ZW1wb3JhcnkpIGhhY2suICBUaGUgdW5pdCB0ZXN0aW5nCisgICAgLy8gaW5mcmFzdHJ1Y3R1cmUgcmVsb2FkcyBhbGwgcHVyZS1QeXRob24gbW9kdWxlcyBmb3IgZXZlcnkgdGVzdCwgYnV0IG5vdAorICAgIC8vIEMrKyBtb2R1bGVzIChiZWNhdXNlIHRoYXQncyBnZW5lcmFsbHkgaW1wb3NzaWJsZToKKyAgICAvLyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTE0NDI2MykuICBCdXQgaWYgd2UgY2FjaGUgRW5jb2RlRXJyb3IsIHdlJ2xsCisgICAgLy8gcmV0dXJuIHRoZSBFbmNvZGVFcnJvciBmcm9tIGEgcHJldmlvdXMgbG9hZCBvZiB0aGUgbW9kdWxlLCB3aGljaCB3b24ndAorICAgIC8vIG1hdGNoIGEgdXNlcidzIGF0dGVtcHQgdG8gY2F0Y2ggRW5jb2RlRXJyb3IuICBTbyB3ZSBoYXZlIHRvIGxvb2sgaXQgdXAKKyAgICAvLyBhZ2FpbiBldmVyeSB0aW1lLgorICAgIFNjb3BlZFB5T2JqZWN0UHRyIG1lc3NhZ2VfbW9kdWxlKFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgKKyAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5tZXNzYWdlIikpOworICAgIGlmIChtZXNzYWdlX21vZHVsZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBTY29wZWRQeU9iamVjdFB0ciBlbmNvZGVfZXJyb3IoCisgICAgICAgIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobWVzc2FnZV9tb2R1bGUuZ2V0KCksICJFbmNvZGVFcnJvciIpKTsKKyAgICBpZiAoZW5jb2RlX2Vycm9yLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoZW5jb2RlX2Vycm9yLmdldCgpLAorICAgICAgICAgICAgICAgICAiTWVzc2FnZSAlcyBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogJXMiLAorICAgICAgICAgICAgICAgICBHZXRNZXNzYWdlTmFtZShzZWxmKS5jX3N0cigpLCBQeVN0cmluZ19Bc1N0cmluZyhqb2luZWQuZ2V0KCkpKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIE9rLCBhcmd1bWVudHMgcGFyc2VkIGFuZCBlcnJvcnMgY2hlY2tlZCwgbm93IGVuY29kZSB0byBhIHN0cmluZworICBjb25zdCBzaXplX3Qgc2l6ZSA9IHNlbGYtPm1lc3NhZ2UtPkJ5dGVTaXplTG9uZygpOworICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZygiIik7CisgIH0KKworICBpZiAoc2l6ZSA+IElOVF9NQVgpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgJXMgZXhjZWVkcyBtYXhpbXVtIHByb3RvYnVmICIKKyAgICAgICAgICAgICAgICAgInNpemUgb2YgMkdCOiAlenUiLAorICAgICAgICAgICAgICAgICBHZXRNZXNzYWdlTmFtZShzZWxmKS5jX3N0cigpLCBzaXplKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5T2JqZWN0KiByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKG51bGxwdHIsIHNpemUpOworICBpZiAocmVzdWx0ID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gb3V0KFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCksIHNpemUpOworICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0KCZvdXQpOworICBpZiAoZGV0ZXJtaW5pc3RpY19vYmogIT0gUHlfTm9uZSkgeworICAgIGNvZGVkX291dC5TZXRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYyhkZXRlcm1pbmlzdGljKTsKKyAgfQorICBzZWxmLT5tZXNzYWdlLT5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJmNvZGVkX291dCk7CisgIEdPT0dMRV9DSEVDSyghY29kZWRfb3V0LkhhZEVycm9yKCkpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgUHlPYmplY3QqIFNlcmlhbGl6ZVRvU3RyaW5nKAorICAgIENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykgeworICByZXR1cm4gSW50ZXJuYWxTZXJpYWxpemVUb1N0cmluZyhzZWxmLCBhcmdzLCBrd2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVxdWlyZV9pbml0aWFsaXplZD0qL3RydWUpOworfQorCitzdGF0aWMgUHlPYmplY3QqIFNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygKKyAgICBDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpIHsKKyAgcmV0dXJuIEludGVybmFsU2VyaWFsaXplVG9TdHJpbmcoc2VsZiwgYXJncywga3dhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJlcXVpcmVfaW5pdGlhbGl6ZWQ9Ki9mYWxzZSk7Cit9CisKKy8vIEZvcm1hdHMgcHJvdG8gZmllbGRzIGZvciBhc2NpaSBkdW1wcyB1c2luZyBweXRob24gZm9ybWF0dGluZyBmdW5jdGlvbnMgd2hlcmUKKy8vIGFwcHJvcHJpYXRlLgorY2xhc3MgUHl0aG9uRmllbGRWYWx1ZVByaW50ZXIgOiBwdWJsaWMgVGV4dEZvcm1hdDo6RmFzdEZpZWxkVmFsdWVQcmludGVyIHsKKyBwdWJsaWM6CisgIC8vIFB5dGhvbiBoYXMgc29tZSBkaWZmZXJlbmNlcyBmcm9tIEMrKyB3aGVuIHByaW50aW5nIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCisgIC8vCisgIC8vIDEpIFRyYWlsaW5nIC4wIGlzIGFsd2F5cyBwcmludGVkLgorICAvLyAyKSAoUHl0aG9uMikgT3V0cHV0IGlzIHJvdW5kZWQgdG8gMTIgZGlnaXRzLgorICAvLyAzKSAoUHl0aG9uMykgVGhlIGZ1bGwgcHJlY2lzaW9uIG9mIHRoZSBkb3VibGUgaXMgcHJlc2VydmVkIChhbmQgUHl0aG9uIHVzZXMKKyAgLy8gICAgRGF2aWQgTS4gR2F5J3MgZHRvYSgpLCB3aGVuIHRoZSBDKysgY29kZSB1c2VzIFNpbXBsZUR0b2EuIFRoZXJlIGFyZSBzb21lCisgIC8vICAgIGRpZmZlcmVuY2VzLCBidXQgdGhleSByYXJlbHkgaGFwcGVuKQorICAvLworICAvLyBXZSBvdmVycmlkZSBmbG9hdGluZyBwb2ludCBwcmludGluZyB3aXRoIHRoZSBDLUFQSSBmdW5jdGlvbiBmb3IgcHJpbnRpbmcKKyAgLy8gUHl0aG9uIGZsb2F0cyB0byBlbnN1cmUgY29uc2lzdGVuY3kuCisgIHZvaWQgUHJpbnRGbG9hdChmbG9hdCB2YWwsCisgICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0OjpCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgUHJpbnREb3VibGUodmFsLCBnZW5lcmF0b3IpOworICB9CisgIHZvaWQgUHJpbnREb3VibGUoZG91YmxlIHZhbCwKKyAgICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0OjpCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgaGlnaGx5IG9wdGltaXplZCAoaXQgYWxsb2NhdGVzIHR3byB0ZW1wb3JhcnkKKyAgICAvLyBQeXRob24gb2JqZWN0cykgYnV0IGl0IGlzIHNpbXBsZSBhbmQgcG9ydGFibGUuICBJZiB0aGlzIGlzIHNob3duIHRvIGJlIGEKKyAgICAvLyBwZXJmb3JtYW5jZSBib3R0bGVuZWNrLCB3ZSBjYW4gb3B0aW1pemUgaXQsIGJ1dCB0aGUgcmVzdWx0cyB3aWxsIGxpa2VseQorICAgIC8vIGJlIG1vcmUgY29tcGxpY2F0ZWQgdG8gYWNjb21tb2RhdGUgdGhlIGRpZmZlcmluZyBiZWhhdmlvciBvZiBkb3VibGUKKyAgICAvLyBmb3JtYXR0aW5nIGJldHdlZW4gUHl0aG9uIDIgYW5kIFB5dGhvbiAzLgorICAgIC8vCisgICAgLy8gKFRob3VnaCBhIHZhbGlkIHF1ZXN0aW9uIGlzOiBkbyB3ZSByZWFsbHkgd2FudCB0byBtYWtlIG91dCBvdXRwdXQKKyAgICAvLyBkZXBlbmRlbnQgb24gdGhlIFB5dGhvbiB2ZXJzaW9uPykKKyAgICBTY29wZWRQeU9iamVjdFB0ciBweV92YWx1ZShQeUZsb2F0X0Zyb21Eb3VibGUodmFsKSk7CisgICAgaWYgKCFweV92YWx1ZS5nZXQoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNjb3BlZFB5T2JqZWN0UHRyIHB5X3N0cihQeU9iamVjdF9TdHIocHlfdmFsdWUuZ2V0KCkpKTsKKyAgICBpZiAoIXB5X3N0ci5nZXQoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdlbmVyYXRvci0+UHJpbnRTdHJpbmcoUHlTdHJpbmdfQXNTdHJpbmcocHlfc3RyLmdldCgpKSk7CisgIH0KK307CisKK3N0YXRpYyBQeU9iamVjdCogVG9TdHIoQ01lc3NhZ2UqIHNlbGYpIHsKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICAvLyBQYXNzZXMgb3duZXJzaGlwCisgIHByaW50ZXIuU2V0RGVmYXVsdEZpZWxkVmFsdWVQcmludGVyKG5ldyBQeXRob25GaWVsZFZhbHVlUHJpbnRlcigpKTsKKyAgcHJpbnRlci5TZXRIaWRlVW5rbm93bkZpZWxkcyh0cnVlKTsKKyAgc3RkOjpzdHJpbmcgb3V0cHV0OworICBpZiAoIXByaW50ZXIuUHJpbnRUb1N0cmluZygqc2VsZi0+bWVzc2FnZSwgJm91dHB1dCkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIlVuYWJsZSB0byBjb252ZXJ0IG1lc3NhZ2UgdG8gc3RyIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKG91dHB1dC5jX3N0cigpKTsKK30KKworUHlPYmplY3QqIE1lcmdlRnJvbShDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICBDTWVzc2FnZSogb3RoZXJfbWVzc2FnZTsKKyAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2soYXJnLCBDTWVzc2FnZV9UeXBlKSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJQYXJhbWV0ZXIgdG8gTWVyZ2VGcm9tKCkgbXVzdCBiZSBpbnN0YW5jZSBvZiBzYW1lIGNsYXNzOiAiCisgICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcyBnb3QgJXMuIiwKKyAgICAgICAgICAgICAgICAgc2VsZi0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKGFyZyktPnRwX25hbWUpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgb3RoZXJfbWVzc2FnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPihhcmcpOworICBpZiAob3RoZXJfbWVzc2FnZS0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpICE9CisgICAgICBzZWxmLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiUGFyYW1ldGVyIHRvIE1lcmdlRnJvbSgpIG11c3QgYmUgaW5zdGFuY2Ugb2Ygc2FtZSBjbGFzczogIgorICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJXMgZ290ICVzLiIsCisgICAgICAgICAgICAgICAgIHNlbGYtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgb3RoZXJfbWVzc2FnZS0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBBc3N1cmVXcml0YWJsZShzZWxmKTsKKworICBzZWxmLT5tZXNzYWdlLT5NZXJnZUZyb20oKm90aGVyX21lc3NhZ2UtPm1lc3NhZ2UpOworICAvLyBDaGlsZCBtZXNzYWdlIG1pZ2h0IGJlIGxhemlseSBjcmVhdGVkIGJlZm9yZSBNZXJnZUZyb20uIE1ha2Ugc3VyZSB0aGV5CisgIC8vIGFyZSBtdXRhYmxlIGF0IHRoaXMgcG9pbnQgaWYgY2hpbGQgbWVzc2FnZXMgYXJlIHJlYWxseSBjcmVhdGVkLgorICBpZiAoRml4dXBNZXNzYWdlQWZ0ZXJNZXJnZShzZWxmKSA8IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqIENvcHlGcm9tKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7CisgIENNZXNzYWdlKiBvdGhlcl9tZXNzYWdlOworICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhhcmcsIENNZXNzYWdlX1R5cGUpKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIlBhcmFtZXRlciB0byBDb3B5RnJvbSgpIG11c3QgYmUgaW5zdGFuY2Ugb2Ygc2FtZSBjbGFzczogIgorICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJXMgZ290ICVzLiIsCisgICAgICAgICAgICAgICAgIHNlbGYtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIG90aGVyX21lc3NhZ2UgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4oYXJnKTsKKworICBpZiAoc2VsZiA9PSBvdGhlcl9tZXNzYWdlKSB7CisgICAgUHlfUkVUVVJOX05PTkU7CisgIH0KKworICBpZiAob3RoZXJfbWVzc2FnZS0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpICE9CisgICAgICBzZWxmLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiUGFyYW1ldGVyIHRvIENvcHlGcm9tKCkgbXVzdCBiZSBpbnN0YW5jZSBvZiBzYW1lIGNsYXNzOiAiCisgICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcyBnb3QgJXMuIiwKKyAgICAgICAgICAgICAgICAgc2VsZi0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBvdGhlcl9tZXNzYWdlLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgQXNzdXJlV3JpdGFibGUoc2VsZik7CisKKyAgLy8gQ29weUZyb20gb24gdGhlIG1lc3NhZ2Ugd2lsbCBub3QgY2xlYW4gdXAgc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcywKKyAgLy8gd2hpY2ggY2FuIGxlYXZlIHVzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSwgc28gY2xlYXIgaXQgb3V0IGhlcmUuCisgICh2b2lkKVNjb3BlZFB5T2JqZWN0UHRyKENsZWFyKHNlbGYpKTsKKworICBzZWxmLT5tZXNzYWdlLT5Db3B5RnJvbSgqb3RoZXJfbWVzc2FnZS0+bWVzc2FnZSk7CisKKyAgUHlfUkVUVVJOX05PTkU7Cit9CisKKy8vIFByb3ZpZGUgYSBtZXRob2QgaW4gdGhlIG1vZHVsZSB0byBzZXQgYWxsb3dfb3ZlcnNpemVfcHJvdG9zIHRvIGEgYm9vbGVhbgorLy8gdmFsdWUuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5ld2x5IHZhbHVlIG9mIGFsbG93X292ZXJzaXplX3Byb3Rvcy4KK1B5T2JqZWN0KiBTZXRBbGxvd092ZXJzaXplUHJvdG9zKFB5T2JqZWN0KiBtLCBQeU9iamVjdCogYXJnKSB7CisgIGlmICghYXJnIHx8ICFQeUJvb2xfQ2hlY2soYXJnKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCB0byBTZXRBbGxvd092ZXJzaXplUHJvdG9zIG11c3QgYmUgYm9vbGVhbiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGFsbG93X292ZXJzaXplX3Byb3RvcyA9IFB5T2JqZWN0X0lzVHJ1ZShhcmcpOworICBpZiAoYWxsb3dfb3ZlcnNpemVfcHJvdG9zKSB7CisgICAgUHlfUkVUVVJOX1RSVUU7CisgIH0gZWxzZSB7CisgICAgUHlfUkVUVVJOX0ZBTFNFOworICB9Cit9CisKK3N0YXRpYyBQeU9iamVjdCogTWVyZ2VGcm9tU3RyaW5nKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7CisgIFB5X2J1ZmZlciBkYXRhOworICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKGFyZywgJmRhdGEsIFB5QlVGX1NJTVBMRSkgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBBc3N1cmVXcml0YWJsZShzZWxmKTsKKworICBQeU1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gR2V0RmFjdG9yeUZvck1lc3NhZ2Uoc2VsZik7CisgIGludCBkZXB0aCA9IGFsbG93X292ZXJzaXplX3Byb3RvcworICAgICAgICAgICAgICAgICAgPyBJTlRfTUFYCisgICAgICAgICAgICAgICAgICA6IGlvOjpDb2RlZElucHV0U3RyZWFtOjpHZXREZWZhdWx0UmVjdXJzaW9uTGltaXQoKTsKKyAgY29uc3QgY2hhciogcHRyOworICBpbnRlcm5hbDo6UGFyc2VDb250ZXh0IGN0eCgKKyAgICAgIGRlcHRoLCBmYWxzZSwgJnB0ciwKKyAgICAgIFN0cmluZ1BpZWNlKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihkYXRhLmJ1ZiksIGRhdGEubGVuKSk7CisgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICBjdHguZGF0YSgpLnBvb2wgPSBmYWN0b3J5LT5wb29sLT5wb29sOworICBjdHguZGF0YSgpLmZhY3RvcnkgPSBmYWN0b3J5LT5tZXNzYWdlX2ZhY3Rvcnk7CisKKyAgcHRyID0gc2VsZi0+bWVzc2FnZS0+X0ludGVybmFsUGFyc2UocHRyLCAmY3R4KTsKKworICAvLyBDaGlsZCBtZXNzYWdlIG1pZ2h0IGJlIGxhemlseSBjcmVhdGVkIGJlZm9yZSBNZXJnZUZyb20uIE1ha2Ugc3VyZSB0aGV5CisgIC8vIGFyZSBtdXRhYmxlIGF0IHRoaXMgcG9pbnQgaWYgY2hpbGQgbWVzc2FnZXMgYXJlIHJlYWxseSBjcmVhdGVkLgorICBpZiAoRml4dXBNZXNzYWdlQWZ0ZXJNZXJnZShzZWxmKSA8IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIFB5dGhvbiBtYWtlcyBkaXN0aW5jdGlvbiBpbiBlcnJvciBtZXNzYWdlLCBiZXR3ZWVuIGEgZ2VuZXJhbCBwYXJzZSBmYWlsdXJlCisgIC8vIGFuZCBpbi1jb3JyZWN0IGVuZGluZyBvbiBhIHRlcm1pbmF0aW5nIHRhZy4gSGVuY2Ugd2UgbmVlZCB0byBiZSBhIGJpdCBtb3JlCisgIC8vIGV4cGxpY2l0IGluIG91ciBjb3JyZWN0bmVzcyBjaGVja3MuCisgIGlmIChwdHIgPT0gbnVsbHB0cikgeworICAgIC8vIFBhcnNlIGVycm9yLgorICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgRGVjb2RlRXJyb3JfY2xhc3MsICJFcnJvciBwYXJzaW5nIG1lc3NhZ2Ugd2l0aCB0eXBlICclcyciLAorICAgICAgICBzZWxmLT5HZXRNZXNzYWdlQ2xhc3MoKS0+bWVzc2FnZV9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoY3R4LkJ5dGVzVW50aWxMaW1pdChwdHIpIDwgMCkgeworICAgIC8vIFRoZSBwYXJzZXIgb3ZlcnNob3QgdGhlIGxpbWl0LgorICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgRGVjb2RlRXJyb3JfY2xhc3MsCisgICAgICAgICJFcnJvciBwYXJzaW5nIG1lc3NhZ2UgYXMgdGhlIG1lc3NhZ2UgZXhjZWVkZWQgdGhlIHByb3RvYnVmIGxpbWl0ICIKKyAgICAgICAgIndpdGggdHlwZSAnJXMnIiwKKyAgICAgICAgc2VsZi0+R2V0TWVzc2FnZUNsYXNzKCktPm1lc3NhZ2VfZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBjdHggaGFzIGFuIGV4cGxpY2l0IGxpbWl0IHNldCAobGVuZ3RoIG9mIHN0cmluZ192aWV3KSwgc28gd2UgaGF2ZSB0bworICAvLyBjaGVjayB3ZSBlbmRlZCBhdCB0aGF0IGxpbWl0LgorICBpZiAoIWN0eC5FbmRlZEF0TGltaXQoKSkgeworICAgIC8vIFRPRE8oamllbHVvKTogUmFpc2UgZXJyb3IgYW5kIHJldHVybiBOVUxMIGluc3RlYWQuCisgICAgLy8gYi8yNzQ5NDIxNgorICAgIFB5RXJyX1dhcm4obnVsbHB0ciwgIlVuZXhwZWN0ZWQgZW5kLWdyb3VwIHRhZzogTm90IGFsbCBkYXRhIHdhcyBjb252ZXJ0ZWQiKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKGRhdGEubGVuIC0gY3R4LkJ5dGVzVW50aWxMaW1pdChwdHIpKTsKKyAgfQorICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKGRhdGEubGVuKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBQYXJzZUZyb21TdHJpbmcoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgaWYgKFNjb3BlZFB5T2JqZWN0UHRyKENsZWFyKHNlbGYpKSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIE1lcmdlRnJvbVN0cmluZyhzZWxmLCBhcmcpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEJ5dGVTaXplKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHNlbGYtPm1lc3NhZ2UtPkJ5dGVTaXplTG9uZygpKTsKK30KKworUHlPYmplY3QqIFJlZ2lzdGVyRXh0ZW5zaW9uKFB5T2JqZWN0KiBjbHMsIFB5T2JqZWN0KiBleHRlbnNpb25faGFuZGxlKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciA9CisgICAgICBHZXRFeHRlbnNpb25EZXNjcmlwdG9yKGV4dGVuc2lvbl9oYW5kbGUpOworICBpZiAoZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2soY2xzLCBDTWVzc2FnZUNsYXNzX1R5cGUpKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIkV4cGVjdGVkIGEgbWVzc2FnZSBjbGFzcywgZ290ICVzIiwKKyAgICAgICAgICAgICAgICAgY2xzLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBDTWVzc2FnZUNsYXNzICptZXNzYWdlX2NsYXNzID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZUNsYXNzKj4oY2xzKTsKKyAgaWYgKG1lc3NhZ2VfY2xhc3MgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIC8vIElmIHRoZSBleHRlbnNpb24gd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCwgY2hlY2sgdGhhdCBpdCBpcyB0aGUgc2FtZS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleGlzdGluZ19leHRlbnNpb24gPQorICAgICAgbWVzc2FnZV9jbGFzcy0+cHlfbWVzc2FnZV9mYWN0b3J5LT5wb29sLT5wb29sLT5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoCisgICAgICAgICAgZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCksIGRlc2NyaXB0b3ItPm51bWJlcigpKTsKKyAgaWYgKGV4aXN0aW5nX2V4dGVuc2lvbiAhPSBudWxscHRyICYmIGV4aXN0aW5nX2V4dGVuc2lvbiAhPSBkZXNjcmlwdG9yKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJEb3VibGUgcmVnaXN0cmF0aW9uIG9mIEV4dGVuc2lvbnMiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBTZXRJblBhcmVudChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgQXNzdXJlV3JpdGFibGUoc2VsZik7CisgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqIFdoaWNoT25lb2YoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgUHlfc3NpemVfdCBuYW1lX3NpemU7CisgIGNoYXIgKm5hbWVfZGF0YTsKKyAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmcsICZuYW1lX2RhdGEsICZuYW1lX3NpemUpIDwgMCkgcmV0dXJuIG51bGxwdHI7CisgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzYyA9CisgICAgICBzZWxmLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPkZpbmRPbmVvZkJ5TmFtZSgKKyAgICAgICAgICBTdHJpbmdQYXJhbShuYW1lX2RhdGEsIG5hbWVfc2l6ZSkpOworICBpZiAob25lb2ZfZGVzYyA9PSBudWxscHRyKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICJQcm90b2NvbCBtZXNzYWdlIGhhcyBubyBvbmVvZiBcIiVzXCIgZmllbGQuIiwgbmFtZV9kYXRhKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2luX29uZW9mID0KKyAgICAgIHNlbGYtPm1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0T25lb2ZGaWVsZERlc2NyaXB0b3IoCisgICAgICAgICAgKnNlbGYtPm1lc3NhZ2UsIG9uZW9mX2Rlc2MpOworICBpZiAoZmllbGRfaW5fb25lb2YgPT0gbnVsbHB0cikgeworICAgIFB5X1JFVFVSTl9OT05FOworICB9IGVsc2UgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lID0gZmllbGRfaW5fb25lb2YtPm5hbWUoKTsKKyAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplKG5hbWUuY19zdHIoKSwgbmFtZS5zaXplKCkpOworICB9Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RXh0ZW5zaW9uRGljdChDTWVzc2FnZSogc2VsZiwgdm9pZCAqY2xvc3VyZSk7CisKK3N0YXRpYyBQeU9iamVjdCogTGlzdEZpZWxkcyhDTWVzc2FnZSogc2VsZikgeworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIHNlbGYtPm1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TGlzdEZpZWxkcygqc2VsZi0+bWVzc2FnZSwgJmZpZWxkcyk7CisKKyAgLy8gTm9ybWFsbHksIHRoZSBsaXN0IHdpbGwgYmUgZXhhY3RseSB0aGUgc2l6ZSBvZiB0aGUgZmllbGRzLgorICBTY29wZWRQeU9iamVjdFB0ciBhbGxfZmllbGRzKFB5TGlzdF9OZXcoZmllbGRzLnNpemUoKSkpOworICBpZiAoYWxsX2ZpZWxkcyA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBXaGVuIHRoZXJlIGFyZSB1bmtub3duIGV4dGVuc2lvbnMsIHRoZSBweSBsaXN0IHdpbGwgKm5vdCogY29udGFpbgorICAvLyB0aGUgZmllbGQgaW5mb3JtYXRpb24uICBUaHVzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgcHkgbGlzdCB3aWxsIGJlCisgIC8vIHNtYWxsZXIgdGhhbiB0aGUgc2l6ZSBvZiBmaWVsZHMuICBTZXQgdGhlIGFjdHVhbCBzaXplIGF0IHRoZSBlbmQuCisgIFB5X3NzaXplX3QgYWN0dWFsX3NpemUgPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgIFNjb3BlZFB5T2JqZWN0UHRyIHQoUHlUdXBsZV9OZXcoMikpOworICAgIGlmICh0ID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGlmIChmaWVsZHNbaV0tPmlzX2V4dGVuc2lvbigpKSB7CisgICAgICBTY29wZWRQeU9iamVjdFB0ciBleHRlbnNpb25fZmllbGQoCisgICAgICAgICAgUHlGaWVsZERlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoZmllbGRzW2ldKSk7CisgICAgICBpZiAoZXh0ZW5zaW9uX2ZpZWxkID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAgICAvLyBXaXRoIEMrKyBkZXNjcmlwdG9ycywgdGhlIGZpZWxkIGNhbiBhbHdheXMgYmUgcmV0cmlldmVkLCBidXQgZm9yCisgICAgICAvLyB1bmtub3duIGV4dGVuc2lvbnMgd2hpY2ggaGF2ZSBub3QgYmVlbiBpbXBvcnRlZCBpbiBQeXRob24gY29kZSwgdGhlcmUKKyAgICAgIC8vIGlzIG5vIG1lc3NhZ2UgY2xhc3MgYW5kIHdlIGNhbm5vdCByZXRyaWV2ZSB0aGUgdmFsdWUuCisgICAgICAvLyBUT0RPKGFtYXVyeWZhKTogY29uc2lkZXIgYnVpbGRpbmcgdGhlIGNsYXNzIG9uIHRoZSBmbHkhCisgICAgICBpZiAoZmllbGRzW2ldLT5tZXNzYWdlX3R5cGUoKSAhPSBudWxscHRyICYmCisgICAgICAgICAgbWVzc2FnZV9mYWN0b3J5OjpHZXRNZXNzYWdlQ2xhc3MoR2V0RmFjdG9yeUZvck1lc3NhZ2Uoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzW2ldLT5tZXNzYWdlX3R5cGUoKSkgPT0KKyAgICAgICAgICAgICAgbnVsbHB0cikgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIGV4dGVuc2lvbnMoR2V0RXh0ZW5zaW9uRGljdChzZWxmLCBudWxscHRyKSk7CisgICAgICBpZiAoZXh0ZW5zaW9ucyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfQorICAgICAgLy8gJ2V4dGVuc2lvbicgcmVmZXJlbmNlIGxhdGVyIHN0b2xlbiBieSBQeVR1cGxlX1NFVF9JVEVNLgorICAgICAgUHlPYmplY3QqIGV4dGVuc2lvbiA9IFB5T2JqZWN0X0dldEl0ZW0oCisgICAgICAgICAgZXh0ZW5zaW9ucy5nZXQoKSwgZXh0ZW5zaW9uX2ZpZWxkLmdldCgpKTsKKyAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKyAgICAgIFB5VHVwbGVfU0VUX0lURU0odC5nZXQoKSwgMCwgZXh0ZW5zaW9uX2ZpZWxkLnJlbGVhc2UoKSk7CisgICAgICAvLyBTdGVhbHMgcmVmZXJlbmNlIHRvICdleHRlbnNpb24nCisgICAgICBQeVR1cGxlX1NFVF9JVEVNKHQuZ2V0KCksIDEsIGV4dGVuc2lvbik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5vcm1hbCBmaWVsZAorICAgICAgU2NvcGVkUHlPYmplY3RQdHIgZmllbGRfZGVzY3JpcHRvcigKKyAgICAgICAgICBQeUZpZWxkRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihmaWVsZHNbaV0pKTsKKyAgICAgIGlmIChmaWVsZF9kZXNjcmlwdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisKKyAgICAgIFB5T2JqZWN0KiBmaWVsZF92YWx1ZSA9IEdldEZpZWxkVmFsdWUoc2VsZiwgZmllbGRzW2ldKTsKKyAgICAgIGlmIChmaWVsZF92YWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBmaWVsZHNbaV0tPm5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAgICBQeVR1cGxlX1NFVF9JVEVNKHQuZ2V0KCksIDAsIGZpZWxkX2Rlc2NyaXB0b3IucmVsZWFzZSgpKTsKKyAgICAgIFB5VHVwbGVfU0VUX0lURU0odC5nZXQoKSwgMSwgZmllbGRfdmFsdWUpOworICAgIH0KKyAgICBQeUxpc3RfU0VUX0lURU0oYWxsX2ZpZWxkcy5nZXQoKSwgYWN0dWFsX3NpemUsIHQucmVsZWFzZSgpKTsKKyAgICArK2FjdHVhbF9zaXplOworICB9CisgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGFjdHVhbF9zaXplKSAhPSBmaWVsZHMuc2l6ZSgpICYmCisgICAgICAoUHlMaXN0X1NldFNsaWNlKGFsbF9maWVsZHMuZ2V0KCksIGFjdHVhbF9zaXplLCBmaWVsZHMuc2l6ZSgpLCBudWxscHRyKSA8CisgICAgICAgMCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gYWxsX2ZpZWxkcy5yZWxlYXNlKCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogRGlzY2FyZFVua25vd25GaWVsZHMoQ01lc3NhZ2UqIHNlbGYpIHsKKyAgQXNzdXJlV3JpdGFibGUoc2VsZik7CisgIHNlbGYtPm1lc3NhZ2UtPkRpc2NhcmRVbmtub3duRmllbGRzKCk7CisgIFB5X1JFVFVSTl9OT05FOworfQorCitQeU9iamVjdCogRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKENNZXNzYWdlKiBzZWxmKSB7CisgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXJyb3JzOworICBtZXNzYWdlLT5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoJmVycm9ycyk7CisKKyAgUHlPYmplY3QqIGVycm9yX2xpc3QgPSBQeUxpc3RfTmV3KGVycm9ycy5zaXplKCkpOworICBpZiAoZXJyb3JfbGlzdCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlcnJvcnMuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IgPSBlcnJvcnNbaV07CisgICAgUHlPYmplY3QqIGVycm9yX3N0cmluZyA9CisgICAgICAgIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZShlcnJvci5jX3N0cigpLCBlcnJvci5sZW5ndGgoKSk7CisgICAgaWYgKGVycm9yX3N0cmluZyA9PSBudWxscHRyKSB7CisgICAgICBQeV9ERUNSRUYoZXJyb3JfbGlzdCk7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgUHlMaXN0X1NFVF9JVEVNKGVycm9yX2xpc3QsIGksIGVycm9yX3N0cmluZyk7CisgIH0KKyAgcmV0dXJuIGVycm9yX2xpc3Q7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogUmljaENvbXBhcmUoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBvdGhlciwgaW50IG9waWQpIHsKKyAgLy8gT25seSBlcXVhbGl0eSBjb21wYXJpc29ucyBhcmUgaW1wbGVtZW50ZWQuCisgIGlmIChvcGlkICE9IFB5X0VRICYmIG9waWQgIT0gUHlfTkUpIHsKKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgfQorICBib29sIGVxdWFscyA9IHRydWU7CisgIC8vIElmIG90aGVyIGlzIG5vdCBhIG1lc3NhZ2UsIGl0IGNhbm5vdCBiZSBlcXVhbC4KKyAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2sob3RoZXIsIENNZXNzYWdlX1R5cGUpKSB7CisgICAgZXF1YWxzID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgLy8gT3RoZXJ3aXNlLCB3ZSBoYXZlIGEgQ01lc3NhZ2Ugd2hvc2UgbWVzc2FnZSB3ZSBjYW4gaW5zcGVjdC4KKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBvdGhlcl9tZXNzYWdlID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KG90aGVyKS0+bWVzc2FnZTsKKyAgICAvLyBJZiBtZXNzYWdlcyBkb24ndCBoYXZlIHRoZSBzYW1lIGRlc2NyaXB0b3JzLCB0aGV5IGFyZSBub3QgZXF1YWwuCisgICAgaWYgKGVxdWFscyAmJgorICAgICAgICBzZWxmLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkgIT0gb3RoZXJfbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpKSB7CisgICAgICBlcXVhbHMgPSBmYWxzZTsKKyAgICB9CisgICAgLy8gQ2hlY2sgdGhlIG1lc3NhZ2UgY29udGVudHMuCisgICAgaWYgKGVxdWFscyAmJgorICAgICAgICAhZ29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFcXVhbHMoCisgICAgICAgICAgICAqc2VsZi0+bWVzc2FnZSwgKnJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPihvdGhlciktPm1lc3NhZ2UpKSB7CisgICAgICBlcXVhbHMgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBpZiAoZXF1YWxzIF4gKG9waWQgPT0gUHlfRVEpKSB7CisgICAgUHlfUkVUVVJOX0ZBTFNFOworICB9IGVsc2UgeworICAgIFB5X1JFVFVSTl9UUlVFOworICB9Cit9CisKK1B5T2JqZWN0KiBJbnRlcm5hbEdldFNjYWxhcihjb25zdCBNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcikgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworCisgIGlmICghQ2hlY2tGaWVsZEJlbG9uZ3NUb01lc3NhZ2UoZmllbGRfZGVzY3JpcHRvciwgbWVzc2FnZSkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5T2JqZWN0KiByZXN1bHQgPSBudWxscHRyOworICBzd2l0Y2ggKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjogeworICAgICAgaW50MzJfdCB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldEludDMyKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyAgICAgIHJlc3VsdCA9IFB5TG9uZ19Gcm9tTG9uZyh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKKyAgICAgIGludDY0X3QgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRJbnQ2NCgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisgICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKKyAgICAgIHVpbnQzMl90IHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0VUludDMyKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyAgICAgIHJlc3VsdCA9IFB5TG9uZ19Gcm9tU3NpemVfdCh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7CisgICAgICB1aW50NjRfdCB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFVJbnQ2NCgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisgICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CisgICAgICBmbG9hdCB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldEZsb2F0KCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyAgICAgIHJlc3VsdCA9IFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7CisgICAgICBkb3VibGUgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXREb3VibGUoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICAgICAgcmVzdWx0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOiB7CisgICAgICBib29sIHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0Qm9vbCgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisgICAgICByZXN1bHQgPSBQeUJvb2xfRnJvbUxvbmcodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgc3RkOjpzdHJpbmcgc2NyYXRjaDsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSA9CisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCAmc2NyYXRjaCk7CisgICAgICByZXN1bHQgPSBUb1N0cmluZ09iamVjdChmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogeworICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9CisgICAgICAgICAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRFbnVtKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyAgICAgIHJlc3VsdCA9IFB5TG9uZ19Gcm9tTG9uZyhlbnVtX3ZhbHVlLT5udW1iZXIoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICBQeUV4Y19TeXN0ZW1FcnJvciwgIkdldHRpbmcgYSB2YWx1ZSBmcm9tIGEgZmllbGQgb2YgdW5rbm93biB0eXBlICVkIiwKKyAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK0NNZXNzYWdlKiBJbnRlcm5hbEdldFN1Yk1lc3NhZ2UoCisgICAgQ01lc3NhZ2UqIHNlbGYsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcikgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gc2VsZi0+bWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBQeU1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gR2V0RmFjdG9yeUZvck1lc3NhZ2Uoc2VsZik7CisKKyAgQ01lc3NhZ2VDbGFzcyogbWVzc2FnZV9jbGFzcyA9IG1lc3NhZ2VfZmFjdG9yeTo6R2V0T3JDcmVhdGVNZXNzYWdlQ2xhc3MoCisgICAgICBmYWN0b3J5LCBmaWVsZF9kZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKSk7CisgIFNjb3BlZFB5T2JqZWN0UHRyIG1lc3NhZ2VfY2xhc3Nfb3duZXIoCisgICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4obWVzc2FnZV9jbGFzcykpOworICBpZiAobWVzc2FnZV9jbGFzcyA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBDTWVzc2FnZSogY21zZyA9IGNtZXNzYWdlOjpOZXdFbXB0eU1lc3NhZ2UobWVzc2FnZV9jbGFzcyk7CisgIGlmIChjbXNnID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5X0lOQ1JFRihzZWxmKTsKKyAgY21zZy0+cGFyZW50ID0gc2VsZjsKKyAgY21zZy0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IgPSBmaWVsZF9kZXNjcmlwdG9yOworICBpZiAocmVmbGVjdGlvbi0+SGFzRmllbGQoKnNlbGYtPm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpKSB7CisgICAgLy8gRm9yY2UgdHJpZ2dlcmluZyBNdXRhYmxlTWVzc2FnZSB0byBzZXQgdGhlIGxhenkgbWVzc2FnZSAnRGlydHknCisgICAgaWYgKE1lc3NhZ2VSZWZsZWN0aW9uRnJpZW5kOjpJc0xhenlGaWVsZChyZWZsZWN0aW9uLCAqc2VsZi0+bWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IpKSB7CisgICAgICBNZXNzYWdlKiBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKAorICAgICAgICAgIHNlbGYtPm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGZhY3RvcnktPm1lc3NhZ2VfZmFjdG9yeSk7CisgICAgICBjbXNnLT5yZWFkX29ubHkgPSBmYWxzZTsKKyAgICAgIGNtc2ctPm1lc3NhZ2UgPSBzdWJfbWVzc2FnZTsKKyAgICAgIHJldHVybiBjbXNnOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjbXNnLT5yZWFkX29ubHkgPSB0cnVlOworICB9CisgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgKKyAgICAgICpzZWxmLT5tZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBmYWN0b3J5LT5tZXNzYWdlX2ZhY3RvcnkpOworICBjbXNnLT5tZXNzYWdlID0gY29uc3RfY2FzdDxNZXNzYWdlKj4oJnN1Yl9tZXNzYWdlKTsKKyAgcmV0dXJuIGNtc2c7Cit9CisKK2ludCBJbnRlcm5hbFNldE5vbk9uZW9mU2NhbGFyKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yLAorICAgIFB5T2JqZWN0KiBhcmcpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICBpZiAoIUNoZWNrRmllbGRCZWxvbmdzVG9NZXNzYWdlKGZpZWxkX2Rlc2NyaXB0b3IsIG1lc3NhZ2UpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgc3dpdGNoIChmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UMzIoYXJnLCB2YWx1ZSwgLTEpOworICAgICAgcmVmbGVjdGlvbi0+U2V0SW50MzIobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDY0KGFyZywgdmFsdWUsIC0xKTsKKyAgICAgIHJlZmxlY3Rpb24tPlNldEludDY0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfVUlOVDMyKGFyZywgdmFsdWUsIC0xKTsKKyAgICAgIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX1VJTlQ2NChhcmcsIHZhbHVlLCAtMSk7CisgICAgICByZWZsZWN0aW9uLT5TZXRVSW50NjQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0ZMT0FUKGFyZywgdmFsdWUsIC0xKTsKKyAgICAgIHJlZmxlY3Rpb24tPlNldEZsb2F0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfRE9VQkxFKGFyZywgdmFsdWUsIC0xKTsKKyAgICAgIHJlZmxlY3Rpb24tPlNldERvdWJsZShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9CT09MKGFyZywgdmFsdWUsIC0xKTsKKyAgICAgIHJlZmxlY3Rpb24tPlNldEJvb2wobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgaWYgKCFDaGVja0FuZFNldFN0cmluZygKKyAgICAgICAgICBhcmcsIG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHJlZmxlY3Rpb24sIGZhbHNlLCAtMSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UMzIoYXJnLCB2YWx1ZSwgLTEpOworICAgICAgaWYgKHJlZmxlY3Rpb24tPlN1cHBvcnRzVW5rbm93bkVudW1WYWx1ZXMoKSkgeworICAgICAgICByZWZsZWN0aW9uLT5TZXRFbnVtVmFsdWUobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvciA9IGZpZWxkX2Rlc2NyaXB0b3ItPmVudW1fdHlwZSgpOworICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0KKyAgICAgICAgICAgIGVudW1fZGVzY3JpcHRvci0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOworICAgICAgICBpZiAoZW51bV92YWx1ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgcmVmbGVjdGlvbi0+U2V0RW51bShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBlbnVtX3ZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIlVua25vd24gZW51bSB2YWx1ZTogJWQiLCB2YWx1ZSk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICBQeUV4Y19TeXN0ZW1FcnJvciwgIlNldHRpbmcgdmFsdWUgdG8gYSBmaWVsZCBvZiB1bmtub3duIHR5cGUgJWQiLAorICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpOworICAgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBJbnRlcm5hbFNldFNjYWxhcigKKyAgICBDTWVzc2FnZSogc2VsZiwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IsCisgICAgUHlPYmplY3QqIGFyZykgeworICBpZiAoIUNoZWNrRmllbGRCZWxvbmdzVG9NZXNzYWdlKGZpZWxkX2Rlc2NyaXB0b3IsIHNlbGYtPm1lc3NhZ2UpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKE1heWJlUmVsZWFzZU92ZXJsYXBwaW5nT25lb2ZGaWVsZChzZWxmLCBmaWVsZF9kZXNjcmlwdG9yKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4gSW50ZXJuYWxTZXROb25PbmVvZlNjYWxhcihzZWxmLT5tZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBhcmcpOworfQorCitQeU9iamVjdCogRnJvbVN0cmluZyhQeVR5cGVPYmplY3QqIGNscywgUHlPYmplY3QqIHNlcmlhbGl6ZWQpIHsKKyAgUHlPYmplY3QqIHB5X2Ntc2cgPQorICAgICAgUHlPYmplY3RfQ2FsbE9iamVjdChyZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oY2xzKSwgbnVsbHB0cik7CisgIGlmIChweV9jbXNnID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBDTWVzc2FnZSogY21zZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPihweV9jbXNnKTsKKworICBTY29wZWRQeU9iamVjdFB0ciBweV9sZW5ndGgoTWVyZ2VGcm9tU3RyaW5nKGNtc2csIHNlcmlhbGl6ZWQpKTsKKyAgaWYgKHB5X2xlbmd0aCA9PSBudWxscHRyKSB7CisgICAgUHlfREVDUkVGKHB5X2Ntc2cpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgcmV0dXJuIHB5X2Ntc2c7Cit9CisKK1B5T2JqZWN0KiBEZWVwQ29weShDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICBQeU9iamVjdCogY2xvbmUgPQorICAgICAgUHlPYmplY3RfQ2FsbE9iamVjdChyZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oUHlfVFlQRShzZWxmKSksIG51bGxwdHIpOworICBpZiAoY2xvbmUgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKGNsb25lLCBDTWVzc2FnZV9UeXBlKSkgeworICAgIFB5X0RFQ1JFRihjbG9uZSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKFNjb3BlZFB5T2JqZWN0UHRyKE1lcmdlRnJvbShyZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4oY2xvbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKSkpID09CisgICAgICBudWxscHRyKSB7CisgICAgUHlfREVDUkVGKGNsb25lKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gY2xvbmU7Cit9CisKK1B5T2JqZWN0KiBUb1VuaWNvZGUoQ01lc3NhZ2UqIHNlbGYpIHsKKyAgLy8gTGF6eSBpbXBvcnQgdG8gcHJldmVudCBjaXJjdWxhciBkZXBlbmRlbmNpZXMKKyAgU2NvcGVkUHlPYmplY3RQdHIgdGV4dF9mb3JtYXQoCisgICAgICBQeUltcG9ydF9JbXBvcnRNb2R1bGUoImdvb2dsZS5wcm90b2J1Zi50ZXh0X2Zvcm1hdCIpKTsKKyAgaWYgKHRleHRfZm9ybWF0ID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBTY29wZWRQeU9iamVjdFB0ciBtZXRob2RfbmFtZShQeVVuaWNvZGVfRnJvbVN0cmluZygiTWVzc2FnZVRvU3RyaW5nIikpOworICBpZiAobWV0aG9kX25hbWUgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFB5X0lOQ1JFRihQeV9UcnVlKTsKKyAgU2NvcGVkUHlPYmplY3RQdHIgZW5jb2RlZChQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncygKKyAgICAgIHRleHRfZm9ybWF0LmdldCgpLCBtZXRob2RfbmFtZS5nZXQoKSwgc2VsZiwgUHlfVHJ1ZSwgbnVsbHB0cikpOworICBQeV9ERUNSRUYoUHlfVHJ1ZSk7CisgIGlmIChlbmNvZGVkID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeU9iamVjdCogZGVjb2RlZCA9CisgICAgICBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QoZW5jb2RlZC5nZXQoKSwgInV0Zi04IiwgbnVsbHB0cik7CisgIGlmIChkZWNvZGVkID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gZGVjb2RlZDsKK30KKworLy8gQ01lc3NhZ2Ugc3RhdGljIG1ldGhvZHM6CitQeU9iamVjdCogX0NoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoUHlPYmplY3QqIHVudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogdW51c2VkX2FyZykgeworICBpZiAoIV9DYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgxKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJEZXNjcmlwdG9ycyBzaG91bGQgbm90IGJlIGNyZWF0ZWQgZGlyZWN0bHksICIKKyAgICAgICAgICAgICAgICAgICAgImJ1dCBvbmx5IHJldHJpZXZlZCBmcm9tIHRoZWlyIHBhcmVudC4iKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRFeHRlbnNpb25EaWN0KENNZXNzYWdlKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIC8vIElmIHRoZXJlIGFyZSBleHRlbnNpb25fcmFuZ2VzLCB0aGUgbWVzc2FnZSBpcyAiZXh0ZW5kYWJsZSIuIEFsbG9jYXRlIGEKKyAgLy8gZGljdGlvbmFyeSB0byBzdG9yZSB0aGUgZXh0ZW5zaW9uIGZpZWxkcy4KKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IEdldE1lc3NhZ2VEZXNjcmlwdG9yKFB5X1RZUEUoc2VsZikpOworICBpZiAoIWRlc2NyaXB0b3ItPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpKSB7CisgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19BdHRyaWJ1dGVFcnJvcik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKCFzZWxmLT5jb21wb3NpdGVfZmllbGRzKSB7CisgICAgc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcyA9IG5ldyBDTWVzc2FnZTo6Q29tcG9zaXRlRmllbGRzTWFwKCk7CisgIH0KKyAgaWYgKCFzZWxmLT5jb21wb3NpdGVfZmllbGRzKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgRXh0ZW5zaW9uRGljdCogZXh0ZW5zaW9uX2RpY3QgPSBleHRlbnNpb25fZGljdDo6TmV3RXh0ZW5zaW9uRGljdChzZWxmKTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihleHRlbnNpb25fZGljdCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0VW5rbm93bkZpZWxkcyhDTWVzc2FnZSogc2VsZikgeworICBpZiAoc2VsZi0+dW5rbm93bl9maWVsZF9zZXQgPT0gbnVsbHB0cikgeworICAgIHNlbGYtPnVua25vd25fZmllbGRfc2V0ID0gdW5rbm93bl9maWVsZHM6Ok5ld1B5VW5rbm93bkZpZWxkcyhzZWxmKTsKKyAgfSBlbHNlIHsKKyAgICBQeV9JTkNSRUYoc2VsZi0+dW5rbm93bl9maWVsZF9zZXQpOworICB9CisgIHJldHVybiBzZWxmLT51bmtub3duX2ZpZWxkX3NldDsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRFeHRlbnNpb25zQnlOYW1lKENNZXNzYWdlICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBtZXNzYWdlX21ldGE6OkdldEV4dGVuc2lvbnNCeU5hbWUoCisgICAgICByZWludGVycHJldF9jYXN0PENNZXNzYWdlQ2xhc3MqPihQeV9UWVBFKHNlbGYpKSwgY2xvc3VyZSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RXh0ZW5zaW9uc0J5TnVtYmVyKENNZXNzYWdlICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIHJldHVybiBtZXNzYWdlX21ldGE6OkdldEV4dGVuc2lvbnNCeU51bWJlcigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2VDbGFzcyo+KFB5X1RZUEUoc2VsZikpLCBjbG9zdXJlKTsKK30KKworc3RhdGljIFB5R2V0U2V0RGVmIEdldHRlcnNbXSA9IHsKKyAgICB7IkV4dGVuc2lvbnMiLCAoZ2V0dGVyKUdldEV4dGVuc2lvbkRpY3QsIG51bGxwdHIsICJFeHRlbnNpb24gZGljdCJ9LAorICAgIHsiX2V4dGVuc2lvbnNfYnlfbmFtZSIsIChnZXR0ZXIpR2V0RXh0ZW5zaW9uc0J5TmFtZSwgbnVsbHB0cn0sCisgICAgeyJfZXh0ZW5zaW9uc19ieV9udW1iZXIiLCAoZ2V0dGVyKUdldEV4dGVuc2lvbnNCeU51bWJlciwgbnVsbHB0cn0sCisgICAge251bGxwdHJ9LAorfTsKKworc3RhdGljIFB5TWV0aG9kRGVmIE1ldGhvZHNbXSA9IHsKKyAgICB7Il9fZGVlcGNvcHlfXyIsIChQeUNGdW5jdGlvbilEZWVwQ29weSwgTUVUSF9WQVJBUkdTLAorICAgICAiTWFrZXMgYSBkZWVwIGNvcHkgb2YgdGhlIGNsYXNzLiJ9LAorICAgIHsiX191bmljb2RlX18iLCAoUHlDRnVuY3Rpb24pVG9Vbmljb2RlLCBNRVRIX05PQVJHUywKKyAgICAgIk91dHB1dHMgYSB1bmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlLiJ9LAorICAgIHsiQnl0ZVNpemUiLCAoUHlDRnVuY3Rpb24pQnl0ZVNpemUsIE1FVEhfTk9BUkdTLAorICAgICAiUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSBpbiBieXRlcy4ifSwKKyAgICB7IkNsZWFyIiwgKFB5Q0Z1bmN0aW9uKUNsZWFyLCBNRVRIX05PQVJHUywgIkNsZWFycyB0aGUgbWVzc2FnZS4ifSwKKyAgICB7IkNsZWFyRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKUNsZWFyRXh0ZW5zaW9uLCBNRVRIX08sCisgICAgICJDbGVhcnMgYSBtZXNzYWdlIGZpZWxkLiJ9LAorICAgIHsiQ2xlYXJGaWVsZCIsIChQeUNGdW5jdGlvbilDbGVhckZpZWxkLCBNRVRIX08sICJDbGVhcnMgYSBtZXNzYWdlIGZpZWxkLiJ9LAorICAgIHsiQ29weUZyb20iLCAoUHlDRnVuY3Rpb24pQ29weUZyb20sIE1FVEhfTywKKyAgICAgIkNvcGllcyBhIHByb3RvY29sIG1lc3NhZ2UgaW50byB0aGUgY3VycmVudCBtZXNzYWdlLiJ9LAorICAgIHsiRGlzY2FyZFVua25vd25GaWVsZHMiLCAoUHlDRnVuY3Rpb24pRGlzY2FyZFVua25vd25GaWVsZHMsIE1FVEhfTk9BUkdTLAorICAgICAiRGlzY2FyZHMgdGhlIHVua25vd24gZmllbGRzLiJ9LAorICAgIHsiRmluZEluaXRpYWxpemF0aW9uRXJyb3JzIiwgKFB5Q0Z1bmN0aW9uKUZpbmRJbml0aWFsaXphdGlvbkVycm9ycywKKyAgICAgTUVUSF9OT0FSR1MsICJGaW5kcyB1bnNldCByZXF1aXJlZCBmaWVsZHMuIn0sCisgICAgeyJGcm9tU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUZyb21TdHJpbmcsIE1FVEhfTyB8IE1FVEhfQ0xBU1MsCisgICAgICJDcmVhdGVzIG5ldyBtZXRob2QgaW5zdGFuY2UgZnJvbSBnaXZlbiBzZXJpYWxpemVkIGRhdGEuIn0sCisgICAgeyJIYXNFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pSGFzRXh0ZW5zaW9uLCBNRVRIX08sCisgICAgICJDaGVja3MgaWYgYSBtZXNzYWdlIGZpZWxkIGlzIHNldC4ifSwKKyAgICB7Ikhhc0ZpZWxkIiwgKFB5Q0Z1bmN0aW9uKUhhc0ZpZWxkLCBNRVRIX08sCisgICAgICJDaGVja3MgaWYgYSBtZXNzYWdlIGZpZWxkIGlzIHNldC4ifSwKKyAgICB7IklzSW5pdGlhbGl6ZWQiLCAoUHlDRnVuY3Rpb24pSXNJbml0aWFsaXplZCwgTUVUSF9WQVJBUkdTLAorICAgICAiQ2hlY2tzIGlmIGFsbCByZXF1aXJlZCBmaWVsZHMgb2YgYSBwcm90b2NvbCBtZXNzYWdlIGFyZSBzZXQuIn0sCisgICAgeyJMaXN0RmllbGRzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RGaWVsZHMsIE1FVEhfTk9BUkdTLAorICAgICAiTGlzdHMgYWxsIHNldCBmaWVsZHMgb2YgYSBtZXNzYWdlLiJ9LAorICAgIHsiTWVyZ2VGcm9tIiwgKFB5Q0Z1bmN0aW9uKU1lcmdlRnJvbSwgTUVUSF9PLAorICAgICAiTWVyZ2VzIGEgcHJvdG9jb2wgbWVzc2FnZSBpbnRvIHRoZSBjdXJyZW50IG1lc3NhZ2UuIn0sCisgICAgeyJNZXJnZUZyb21TdHJpbmciLCAoUHlDRnVuY3Rpb24pTWVyZ2VGcm9tU3RyaW5nLCBNRVRIX08sCisgICAgICJNZXJnZXMgYSBzZXJpYWxpemVkIG1lc3NhZ2UgaW50byB0aGUgY3VycmVudCBtZXNzYWdlLiJ9LAorICAgIHsiUGFyc2VGcm9tU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVBhcnNlRnJvbVN0cmluZywgTUVUSF9PLAorICAgICAiUGFyc2VzIGEgc2VyaWFsaXplZCBtZXNzYWdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4ifSwKKyAgICB7IlJlZ2lzdGVyRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVJlZ2lzdGVyRXh0ZW5zaW9uLCBNRVRIX08gfCBNRVRIX0NMQVNTLAorICAgICAiUmVnaXN0ZXJzIGFuIGV4dGVuc2lvbiB3aXRoIHRoZSBjdXJyZW50IG1lc3NhZ2UuIn0sCisgICAgeyJTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmciLCAoUHlDRnVuY3Rpb24pU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAiU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBhIHN0cmluZywgZXZlbiBpZiBpdCBpc24ndCBpbml0aWFsaXplZC4ifSwKKyAgICB7IlNlcmlhbGl6ZVRvU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVNlcmlhbGl6ZVRvU3RyaW5nLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAiU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBhIHN0cmluZywgb25seSBmb3IgaW5pdGlhbGl6ZWQgbWVzc2FnZXMuIn0sCisgICAgeyJTZXRJblBhcmVudCIsIChQeUNGdW5jdGlvbilTZXRJblBhcmVudCwgTUVUSF9OT0FSR1MsCisgICAgICJTZXRzIHRoZSBoYXMgYml0IG9mIHRoZSBnaXZlbiBmaWVsZCBpbiBpdHMgcGFyZW50IG1lc3NhZ2UuIn0sCisgICAgeyJVbmtub3duRmllbGRzIiwgKFB5Q0Z1bmN0aW9uKUdldFVua25vd25GaWVsZHMsIE1FVEhfTk9BUkdTLAorICAgICAiUGFyc2UgdW5rbm93biBmaWVsZCBzZXQifSwKKyAgICB7IldoaWNoT25lb2YiLCAoUHlDRnVuY3Rpb24pV2hpY2hPbmVvZiwgTUVUSF9PLAorICAgICAiUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc2V0IGluc2lkZSBhIG9uZW9mLCAiCisgICAgICJvciBOb25lIGlmIG5vIGZpZWxkIGlzIHNldC4ifSwKKworICAgIC8vIFN0YXRpYyBNZXRob2RzLgorICAgIHsiX0NoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUiLAorICAgICAoUHlDRnVuY3Rpb24pX0NoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUsIE1FVEhfTk9BUkdTIHwgTUVUSF9TVEFUSUMsCisgICAgICJSYWlzZXMgVHlwZUVycm9yIGlmIHRoZSBjYWxsZXIgaXMgbm90IGluIGEgX3BiMi5weSBmaWxlLiJ9LAorICAgIHtudWxscHRyLCBudWxscHRyfX07CisKK2Jvb2wgU2V0Q29tcG9zaXRlRmllbGQoQ01lc3NhZ2UqIHNlbGYsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lckJhc2UqIHZhbHVlKSB7CisgIGlmIChzZWxmLT5jb21wb3NpdGVfZmllbGRzID09IG51bGxwdHIpIHsKKyAgICBzZWxmLT5jb21wb3NpdGVfZmllbGRzID0gbmV3IENNZXNzYWdlOjpDb21wb3NpdGVGaWVsZHNNYXAoKTsKKyAgfQorICAoKnNlbGYtPmNvbXBvc2l0ZV9maWVsZHMpW2ZpZWxkXSA9IHZhbHVlOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTZXRTdWJtZXNzYWdlKENNZXNzYWdlKiBzZWxmLCBDTWVzc2FnZSogc3VibWVzc2FnZSkgeworICBpZiAoc2VsZi0+Y2hpbGRfc3VibWVzc2FnZXMgPT0gbnVsbHB0cikgeworICAgIHNlbGYtPmNoaWxkX3N1Ym1lc3NhZ2VzID0gbmV3IENNZXNzYWdlOjpTdWJNZXNzYWdlc01hcCgpOworICB9CisgICgqc2VsZi0+Y2hpbGRfc3VibWVzc2FnZXMpW3N1Ym1lc3NhZ2UtPm1lc3NhZ2VdID0gc3VibWVzc2FnZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK1B5T2JqZWN0KiBHZXRBdHRyKFB5T2JqZWN0KiBwc2VsZiwgUHlPYmplY3QqIG5hbWUpIHsKKyAgQ01lc3NhZ2UqIHNlbGYgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4ocHNlbGYpOworICBQeU9iamVjdCogcmVzdWx0ID0gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoCisgICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZiksIG5hbWUpOworICBpZiAocmVzdWx0ICE9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5RXJyX0NsZWFyKCk7CisgIHJldHVybiBtZXNzYWdlX21ldGE6OkdldENsYXNzQXR0cmlidXRlKAorICAgICAgQ2hlY2tNZXNzYWdlQ2xhc3MoUHlfVFlQRShzZWxmKSksIG5hbWUpOworfQorCitQeU9iamVjdCogR2V0RmllbGRWYWx1ZShDTWVzc2FnZSogc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcikgeworICBpZiAoc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcykgeworICAgIENNZXNzYWdlOjpDb21wb3NpdGVGaWVsZHNNYXA6Oml0ZXJhdG9yIGl0ID0KKyAgICAgICAgc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcy0+ZmluZChmaWVsZF9kZXNjcmlwdG9yKTsKKyAgICBpZiAoaXQgIT0gc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcy0+ZW5kKCkpIHsKKyAgICAgIENvbnRhaW5lckJhc2UqIHZhbHVlID0gaXQtPnNlY29uZDsKKyAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICByZXR1cm4gdmFsdWUtPkFzUHlPYmplY3QoKTsKKyAgICB9CisgIH0KKworICBpZiAoc2VsZi0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpICE9IGZpZWxkX2Rlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3IgdG8gZmllbGQgJyVzJyBkb2Vzbid0IGFwcGx5IHRvICclcycgb2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBpZiAoIWZpZWxkX2Rlc2NyaXB0b3ItPmlzX3JlcGVhdGVkKCkgJiYKKyAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICByZXR1cm4gSW50ZXJuYWxHZXRTY2FsYXIoc2VsZi0+bWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisgIH0KKworICBDb250YWluZXJCYXNlKiBweV9jb250YWluZXIgPSBudWxscHRyOworICBpZiAoZmllbGRfZGVzY3JpcHRvci0+aXNfbWFwKCkpIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBlbnRyeV90eXBlID0gZmllbGRfZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCk7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZV90eXBlID0gZW50cnlfdHlwZS0+bWFwX3ZhbHVlKCk7CisgICAgaWYgKHZhbHVlX3R5cGUtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIENNZXNzYWdlQ2xhc3MqIHZhbHVlX2NsYXNzID0gbWVzc2FnZV9mYWN0b3J5OjpHZXRNZXNzYWdlQ2xhc3MoCisgICAgICAgICAgR2V0RmFjdG9yeUZvck1lc3NhZ2Uoc2VsZiksIHZhbHVlX3R5cGUtPm1lc3NhZ2VfdHlwZSgpKTsKKyAgICAgIGlmICh2YWx1ZV9jbGFzcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfQorICAgICAgcHlfY29udGFpbmVyID0KKyAgICAgICAgICBOZXdNZXNzYWdlTWFwQ29udGFpbmVyKHNlbGYsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlX2NsYXNzKTsKKyAgICB9IGVsc2UgeworICAgICAgcHlfY29udGFpbmVyID0gTmV3U2NhbGFyTWFwQ29udGFpbmVyKHNlbGYsIGZpZWxkX2Rlc2NyaXB0b3IpOworICAgIH0KKyAgfSBlbHNlIGlmIChmaWVsZF9kZXNjcmlwdG9yLT5pc19yZXBlYXRlZCgpKSB7CisgICAgaWYgKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIENNZXNzYWdlQ2xhc3MqIG1lc3NhZ2VfY2xhc3MgPSBtZXNzYWdlX2ZhY3Rvcnk6OkdldE1lc3NhZ2VDbGFzcygKKyAgICAgICAgICBHZXRGYWN0b3J5Rm9yTWVzc2FnZShzZWxmKSwgZmllbGRfZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAgICAgaWYgKG1lc3NhZ2VfY2xhc3MgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKyAgICAgIHB5X2NvbnRhaW5lciA9IHJlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXI6Ok5ld0NvbnRhaW5lcigKKyAgICAgICAgICBzZWxmLCBmaWVsZF9kZXNjcmlwdG9yLCBtZXNzYWdlX2NsYXNzKTsKKyAgICB9IGVsc2UgeworICAgICAgcHlfY29udGFpbmVyID0KKyAgICAgICAgICByZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyOjpOZXdDb250YWluZXIoc2VsZiwgZmllbGRfZGVzY3JpcHRvcik7CisgICAgfQorICB9IGVsc2UgaWYgKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkgPT0KKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgIHB5X2NvbnRhaW5lciA9IEludGVybmFsR2V0U3ViTWVzc2FnZShzZWxmLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyAgfSBlbHNlIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJTaG91bGQgbmV2ZXIgaGFwcGVuIik7CisgIH0KKworICBpZiAocHlfY29udGFpbmVyID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoIVNldENvbXBvc2l0ZUZpZWxkKHNlbGYsIGZpZWxkX2Rlc2NyaXB0b3IsIHB5X2NvbnRhaW5lcikpIHsKKyAgICBQeV9ERUNSRUYocHlfY29udGFpbmVyKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gcHlfY29udGFpbmVyLT5Bc1B5T2JqZWN0KCk7Cit9CisKK2ludCBTZXRGaWVsZFZhbHVlKENNZXNzYWdlKiBzZWxmLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCogdmFsdWUpIHsKKyAgaWYgKHNlbGYtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSAhPSBmaWVsZF9kZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yIHRvIGZpZWxkICclcycgZG9lc24ndCBhcHBseSB0byAnJXMnIG9iamVjdCIsCisgICAgICAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUpOworICAgIHJldHVybiAtMTsKKyAgfSBlbHNlIGlmIChmaWVsZF9kZXNjcmlwdG9yLT5sYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICJBc3NpZ25tZW50IG5vdCBhbGxvd2VkIHRvIHJlcGVhdGVkICIKKyAgICAgICAgICAgICAgICAgImZpZWxkIFwiJXNcIiBpbiBwcm90b2NvbCBtZXNzYWdlIG9iamVjdC4iLAorICAgICAgICAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5uYW1lKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgaWYgKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICJBc3NpZ25tZW50IG5vdCBhbGxvd2VkIHRvICIKKyAgICAgICAgICAgICAgICAgImZpZWxkIFwiJXNcIiBpbiBwcm90b2NvbCBtZXNzYWdlIG9iamVjdC4iLAorICAgICAgICAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5uYW1lKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgeworICAgIEFzc3VyZVdyaXRhYmxlKHNlbGYpOworICAgIHJldHVybiBJbnRlcm5hbFNldFNjYWxhcihzZWxmLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNtZXNzYWdlCisKKy8vIEFsbCBjb250YWluZXJzIHdoaWNoIGFyZSBub3QgbWVzc2FnZXM6CisvLyAtIE1ha2UgYSBuZXcgcGFyZW50IG1lc3NhZ2UKKy8vIC0gQ29weSB0aGUgZmllbGQKKy8vIC0gcmV0dXJuIHRoZSBmaWVsZC4KK1B5T2JqZWN0KiBDb250YWluZXJCYXNlOjpEZWVwQ29weSgpIHsKKyAgQ01lc3NhZ2UqIG5ld19wYXJlbnQgPQorICAgICAgY21lc3NhZ2U6Ok5ld0VtcHR5TWVzc2FnZSh0aGlzLT5wYXJlbnQtPkdldE1lc3NhZ2VDbGFzcygpKTsKKyAgbmV3X3BhcmVudC0+bWVzc2FnZSA9IHRoaXMtPnBhcmVudC0+bWVzc2FnZS0+TmV3KG51bGxwdHIpOworCisgIC8vIENvcHkgdGhlIG1hcCBmaWVsZCBpbnRvIHRoZSBuZXcgbWVzc2FnZS4KKyAgdGhpcy0+cGFyZW50LT5tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlN3YXBGaWVsZHMoCisgICAgICB0aGlzLT5wYXJlbnQtPm1lc3NhZ2UsIG5ld19wYXJlbnQtPm1lc3NhZ2UsCisgICAgICB7dGhpcy0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3J9KTsKKyAgdGhpcy0+cGFyZW50LT5tZXNzYWdlLT5NZXJnZUZyb20oKm5ld19wYXJlbnQtPm1lc3NhZ2UpOworCisgIFB5T2JqZWN0KiByZXN1bHQgPQorICAgICAgY21lc3NhZ2U6OkdldEZpZWxkVmFsdWUobmV3X3BhcmVudCwgdGhpcy0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IpOworICBQeV9ERUNSRUYobmV3X3BhcmVudCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgQ29udGFpbmVyQmFzZTo6UmVtb3ZlRnJvbVBhcmVudENhY2hlKCkgeworICBDTWVzc2FnZSogcGFyZW50ID0gdGhpcy0+cGFyZW50OworICBpZiAocGFyZW50KSB7CisgICAgaWYgKHBhcmVudC0+Y29tcG9zaXRlX2ZpZWxkcykKKyAgICAgIHBhcmVudC0+Y29tcG9zaXRlX2ZpZWxkcy0+ZXJhc2UodGhpcy0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IpOworICAgIFB5X0NMRUFSKHBhcmVudCk7CisgIH0KK30KKworQ01lc3NhZ2UqIENNZXNzYWdlOjpCdWlsZFN1Yk1lc3NhZ2VGcm9tUG9pbnRlcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IsIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlLAorICAgIENNZXNzYWdlQ2xhc3MqIG1lc3NhZ2VfY2xhc3MpIHsKKyAgaWYgKCF0aGlzLT5jaGlsZF9zdWJtZXNzYWdlcykgeworICAgIHRoaXMtPmNoaWxkX3N1Ym1lc3NhZ2VzID0gbmV3IENNZXNzYWdlOjpTdWJNZXNzYWdlc01hcCgpOworICB9CisgIENNZXNzYWdlKiBjbXNnID0gRmluZFB0ck9yTnVsbCgKKyAgICAgICp0aGlzLT5jaGlsZF9zdWJtZXNzYWdlcywgc3ViX21lc3NhZ2UpOworICBpZiAoY21zZykgeworICAgIFB5X0lOQ1JFRihjbXNnKTsKKyAgfSBlbHNlIHsKKyAgICBjbXNnID0gY21lc3NhZ2U6Ok5ld0VtcHR5TWVzc2FnZShtZXNzYWdlX2NsYXNzKTsKKworICAgIGlmIChjbXNnID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjbXNnLT5tZXNzYWdlID0gc3ViX21lc3NhZ2U7CisgICAgUHlfSU5DUkVGKHRoaXMpOworICAgIGNtc2ctPnBhcmVudCA9IHRoaXM7CisgICAgY21zZy0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IgPSBmaWVsZF9kZXNjcmlwdG9yOworICAgIGNtZXNzYWdlOjpTZXRTdWJtZXNzYWdlKHRoaXMsIGNtc2cpOworICB9CisgIHJldHVybiBjbXNnOworfQorCitDTWVzc2FnZSogQ01lc3NhZ2U6Ok1heWJlUmVsZWFzZVN1Yk1lc3NhZ2UoTWVzc2FnZSogc3ViX21lc3NhZ2UpIHsKKyAgaWYgKCF0aGlzLT5jaGlsZF9zdWJtZXNzYWdlcykgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIENNZXNzYWdlKiByZWxlYXNlZCA9IEZpbmRQdHJPck51bGwoCisgICAgICAqdGhpcy0+Y2hpbGRfc3VibWVzc2FnZXMsIHN1Yl9tZXNzYWdlKTsKKyAgaWYgKCFyZWxlYXNlZCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIC8vIFRoZSB0YXJnZXQgbWVzc2FnZSB3aWxsIG5vdyBvd24gaXRzIGNvbnRlbnQuCisgIFB5X0NMRUFSKHJlbGVhc2VkLT5wYXJlbnQpOworICByZWxlYXNlZC0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IgPSBudWxscHRyOworICByZWxlYXNlZC0+cmVhZF9vbmx5ID0gZmFsc2U7CisgIC8vIERlbGV0ZSBpdCBmcm9tIHRoZSBjYWNoZS4KKyAgdGhpcy0+Y2hpbGRfc3VibWVzc2FnZXMtPmVyYXNlKHN1Yl9tZXNzYWdlKTsKKyAgcmV0dXJuIHJlbGVhc2VkOworfQorCitzdGF0aWMgQ01lc3NhZ2VDbGFzcyBfQ01lc3NhZ2VfVHlwZSA9IHt7eworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmX0NNZXNzYWdlQ2xhc3NfVHlwZSwgMCkgRlVMTF9NT0RVTEVfTkFNRQorICAgICIuQ01lc3NhZ2UiLCAgICAgICAgICAgICAgICAgICAgLy8gdHBfbmFtZQorICAgIHNpemVvZihDTWVzc2FnZSksICAgICAgICAgICAgICAgLy8gdHBfYmFzaWNzaXplCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlbXNpemUKKyAgICAoZGVzdHJ1Y3RvciljbWVzc2FnZTo6RGVhbGxvYywgIC8vICB0cF9kZWFsbG9jCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDgwMDAwCisgICAgbnVsbHB0ciwgIC8vIHRwX3ByaW50CisjZWxzZQorICAgIDAsICAvLyB0cF92ZWN0b3JjYWxsX29mZnNldAorI2VuZGlmCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9jb21wYXJlCisgICAgKHJlcHJmdW5jKWNtZXNzYWdlOjpUb1N0ciwgICAgLy8gIHRwX3JlcHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfbnVtYmVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2FzX3NlcXVlbmNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2FzX21hcHBpbmcKKyAgICBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQsICAvLyAgdHBfaGFzaAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9jYWxsCisgICAgKHJlcHJmdW5jKWNtZXNzYWdlOjpUb1N0ciwgICAgLy8gIHRwX3N0cgorICAgIGNtZXNzYWdlOjpHZXRBdHRyLCAgICAgICAgICAgIC8vICB0cF9nZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9zZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19idWZmZXIKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwKKyAgICAgICAgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHLCAgICAgLy8gIHRwX2ZsYWdzCisgICAgIkEgUHJvdG9jb2xNZXNzYWdlIiwgICAgICAgICAgICAgICAgIC8vICB0cF9kb2MKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3RyYXZlcnNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9jbGVhcgorICAgIChyaWNoY21wZnVuYyljbWVzc2FnZTo6UmljaENvbXBhcmUsICAvLyAgdHBfcmljaGNvbXBhcmUKKyAgICBvZmZzZXRvZihDTWVzc2FnZSwgd2Vha3JlZmxpc3QpLCAgICAgLy8gIHRwX3dlYWtsaXN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVybmV4dAorICAgIGNtZXNzYWdlOjpNZXRob2RzLCAgICAgICAgICAgICAgICAgICAvLyAgdHBfbWV0aG9kcworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfbWVtYmVycworICAgIGNtZXNzYWdlOjpHZXR0ZXJzLCAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0c2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9iYXNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kaWN0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9nZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX3NldAorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGljdG9mZnNldAorICAgIChpbml0cHJvYyljbWVzc2FnZTo6SW5pdCwgICAgICAgICAgICAvLyAgdHBfaW5pdAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYWxsb2MKKyAgICBjbWVzc2FnZTo6TmV3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX25ldworfX19OworUHlUeXBlT2JqZWN0KiBDTWVzc2FnZV9UeXBlID0gJl9DTWVzc2FnZV9UeXBlLnN1cGVyLmh0X3R5cGU7CisKKy8vIC0tLSBFeHBvc2luZyB0aGUgQyBwcm90byBsaXZpbmcgaW5zaWRlIFB5dGhvbiBwcm90byB0byBDIGNvZGU6CisKK2NvbnN0IE1lc3NhZ2UqICgqR2V0Q1Byb3RvSW5zaWRlUHlQcm90b1B0cikoUHlPYmplY3QqIG1zZyk7CitNZXNzYWdlKiAoKk11dGFibGVDUHJvdG9JbnNpZGVQeVByb3RvUHRyKShQeU9iamVjdCogbXNnKTsKKworc3RhdGljIGNvbnN0IE1lc3NhZ2UqIEdldENQcm90b0luc2lkZVB5UHJvdG9JbXBsKFB5T2JqZWN0KiBtc2cpIHsKKyAgY29uc3QgTWVzc2FnZSogbWVzc2FnZSA9IFB5TWVzc2FnZV9HZXRNZXNzYWdlUG9pbnRlcihtc2cpOworICBpZiAobWVzc2FnZSA9PSBudWxscHRyKSB7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gbWVzc2FnZTsKK30KKworc3RhdGljIE1lc3NhZ2UqIE11dGFibGVDUHJvdG9JbnNpZGVQeVByb3RvSW1wbChQeU9iamVjdCogbXNnKSB7CisgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBQeU1lc3NhZ2VfR2V0TXV0YWJsZU1lc3NhZ2VQb2ludGVyKG1zZyk7CisgIGlmIChtZXNzYWdlID09IG51bGxwdHIpIHsKKyAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBtZXNzYWdlOworfQorCitjb25zdCBNZXNzYWdlKiBQeU1lc3NhZ2VfR2V0TWVzc2FnZVBvaW50ZXIoUHlPYmplY3QqIG1zZykgeworICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhtc2csIENNZXNzYWdlX1R5cGUpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk5vdCBhIE1lc3NhZ2UgaW5zdGFuY2UiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBDTWVzc2FnZSogY21zZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPihtc2cpOworICByZXR1cm4gY21zZy0+bWVzc2FnZTsKK30KKworTWVzc2FnZSogUHlNZXNzYWdlX0dldE11dGFibGVNZXNzYWdlUG9pbnRlcihQeU9iamVjdCogbXNnKSB7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKG1zZywgQ01lc3NhZ2VfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTm90IGEgTWVzc2FnZSBpbnN0YW5jZSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIENNZXNzYWdlKiBjbXNnID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KG1zZyk7CisKKworICBpZiAoKGNtc2ctPmNvbXBvc2l0ZV9maWVsZHMgJiYgIWNtc2ctPmNvbXBvc2l0ZV9maWVsZHMtPmVtcHR5KCkpIHx8CisgICAgICAoY21zZy0+Y2hpbGRfc3VibWVzc2FnZXMgJiYgIWNtc2ctPmNoaWxkX3N1Ym1lc3NhZ2VzLT5lbXB0eSgpKSkgeworICAgIC8vIFRoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkgb2YgYWNjdXJhdGVseSBzeW5jaW5nIGFyYml0cmFyeSBjaGFuZ2VzIHRvCisgICAgLy8gdGhlIHVuZGVybHlpbmcgQysrIG1lc3NhZ2UgYmFjayB0byB0aGUgQ01lc3NhZ2UgKGUuZy4gcmVtb3ZlZCByZXBlYXRlZAorICAgIC8vIGNvbXBvc2l0ZSBjb250YWluZXJzKS4gV2Ugb25seSBhbGxvdyBkaXJlY3QgbXV0YXRpb24gb2YgdGhlIHVuZGVybHlpbmcKKyAgICAvLyBDKysgbWVzc2FnZSBpZiB0aGVyZSBpcyBubyBjaGlsZCBkYXRhIGluIHRoZSBDTWVzc2FnZS4KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWxpYWJseSBnZXQgYSBtdXRhYmxlIHBvaW50ZXIgIgorICAgICAgICAgICAgICAgICAgICAidG8gYSBtZXNzYWdlIHdpdGggZXh0cmEgcmVmZXJlbmNlcyIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGNtZXNzYWdlOjpBc3N1cmVXcml0YWJsZShjbXNnKTsKKyAgcmV0dXJuIGNtc2ctPm1lc3NhZ2U7Cit9CisKKy8vIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBNZXNzYWdlQ2xhc3MgdG8gdXNlIGZvciBtZXNzYWdlIGNyZWF0aW9uLgorLy8gLSBpZiBhIFB5TWVzc2FnZUZhY3RvcnkgaXMgcGFzc2VkLCB1c2UgaXQuCisvLyAtIE90aGVyd2lzZSwgaWYgYSBQeURlc2NyaXB0b3JQb29sIHdhcyBjcmVhdGVkLCB1c2UgaXRzIGZhY3RvcnkuCitzdGF0aWMgQ01lc3NhZ2VDbGFzcyogR2V0TWVzc2FnZUNsYXNzRnJvbURlc2NyaXB0b3IoCisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgUHlPYmplY3QqIHB5X21lc3NhZ2VfZmFjdG9yeSkgeworICBQeU1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gbnVsbHB0cjsKKyAgaWYgKHB5X21lc3NhZ2VfZmFjdG9yeSA9PSBudWxscHRyKSB7CisgICAgUHlEZXNjcmlwdG9yUG9vbCogcG9vbCA9CisgICAgICAgIEdldERlc2NyaXB0b3JQb29sX0Zyb21Qb29sKGRlc2NyaXB0b3ItPmZpbGUoKS0+cG9vbCgpKTsKKyAgICBpZiAocG9vbCA9PSBudWxscHRyKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGRlc2NyaXB0b3IgcG9vbDsgQysrIHVzZXJzIHNob3VsZCBjYWxsICIKKyAgICAgICAgICAgICAgICAgICAgICAiRGVzY3JpcHRvclBvb2xfRnJvbVBvb2wgYW5kIGtlZXAgaXQgYWxpdmUiKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBmYWN0b3J5ID0gcG9vbC0+cHlfbWVzc2FnZV9mYWN0b3J5OworICB9IGVsc2UgaWYgKFB5T2JqZWN0X1R5cGVDaGVjayhweV9tZXNzYWdlX2ZhY3RvcnksICZQeU1lc3NhZ2VGYWN0b3J5X1R5cGUpKSB7CisgICAgZmFjdG9yeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlNZXNzYWdlRmFjdG9yeSo+KHB5X21lc3NhZ2VfZmFjdG9yeSk7CisgIH0gZWxzZSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV4cGVjdGVkIGEgTWVzc2FnZUZhY3RvcnkiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHJldHVybiBtZXNzYWdlX2ZhY3Rvcnk6OkdldE9yQ3JlYXRlTWVzc2FnZUNsYXNzKGZhY3RvcnksIGRlc2NyaXB0b3IpOworfQorCitQeU9iamVjdCogUHlNZXNzYWdlX05ldyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHB5X21lc3NhZ2VfZmFjdG9yeSkgeworICBDTWVzc2FnZUNsYXNzKiBtZXNzYWdlX2NsYXNzID0KKyAgICAgIEdldE1lc3NhZ2VDbGFzc0Zyb21EZXNjcmlwdG9yKGRlc2NyaXB0b3IsIHB5X21lc3NhZ2VfZmFjdG9yeSk7CisgIGlmIChtZXNzYWdlX2NsYXNzID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIENNZXNzYWdlKiBzZWxmID0gY21lc3NhZ2U6Ok5ld0NNZXNzYWdlKG1lc3NhZ2VfY2xhc3MpOworICBQeV9ERUNSRUYobWVzc2FnZV9jbGFzcyk7CisgIGlmIChzZWxmID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gc2VsZi0+QXNQeU9iamVjdCgpOworfQorCitQeU9iamVjdCogUHlNZXNzYWdlX05ld01lc3NhZ2VPd25lZEV4dGVybmFsbHkoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogcHlfbWVzc2FnZV9mYWN0b3J5KSB7CisgIENNZXNzYWdlQ2xhc3MqIG1lc3NhZ2VfY2xhc3MgPSBHZXRNZXNzYWdlQ2xhc3NGcm9tRGVzY3JpcHRvcigKKyAgICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSwgcHlfbWVzc2FnZV9mYWN0b3J5KTsKKyAgaWYgKG1lc3NhZ2VfY2xhc3MgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgQ01lc3NhZ2UqIHNlbGYgPSBjbWVzc2FnZTo6TmV3RW1wdHlNZXNzYWdlKG1lc3NhZ2VfY2xhc3MpOworICBQeV9ERUNSRUYobWVzc2FnZV9jbGFzcyk7CisgIGlmIChzZWxmID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBzZWxmLT5tZXNzYWdlID0gbWVzc2FnZTsKKyAgUHlfSU5DUkVGKFB5X05vbmUpOworICBzZWxmLT5wYXJlbnQgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4oUHlfTm9uZSk7CisgIHJldHVybiBzZWxmLT5Bc1B5T2JqZWN0KCk7Cit9CisKK3ZvaWQgSW5pdEdsb2JhbHMoKSB7CisgIC8vIFRPRE8oZ3BzKTogQ2hlY2sgYWxsIHJldHVybiB2YWx1ZXMgaW4gdGhpcyBmdW5jdGlvbiBmb3IgTlVMTCBhbmQgcHJvcGFnYXRlCisgIC8vIHRoZSBlcnJvciAoTWVtb3J5RXJyb3IpIG9uIHVwIHRvIHJlc3VsdCBpbiBhbiBpbXBvcnQgZmFpbHVyZS4gIFRoZXNlIHNob3VsZAorICAvLyBhbHNvIGJlIGZyZWVkIGFuZCByZXNldCB0byBOVUxMIGR1cmluZyBmaW5hbGl6YXRpb24uCisgIGtERVNDUklQVE9SID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoIkRFU0NSSVBUT1IiKTsKKworICBQeU9iamVjdCogZHVtbXlfb2JqID0gUHlTZXRfTmV3KG51bGxwdHIpOworICBrRW1wdHlXZWFrcmVmID0gUHlXZWFrcmVmX05ld1JlZihkdW1teV9vYmosIG51bGxwdHIpOworICBQeV9ERUNSRUYoZHVtbXlfb2JqKTsKK30KKworYm9vbCBJbml0UHJvdG8yTWVzc2FnZU1vZHVsZShQeU9iamVjdCAqbSkgeworICAvLyBJbml0aWFsaXplIHR5cGVzIGFuZCBnbG9iYWxzIGluIGRlc2NyaXB0b3IuY2MKKyAgaWYgKCFJbml0RGVzY3JpcHRvcigpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSW5pdGlhbGl6ZSB0eXBlcyBhbmQgZ2xvYmFscyBpbiBkZXNjcmlwdG9yX3Bvb2wuY2MKKyAgaWYgKCFJbml0RGVzY3JpcHRvclBvb2woKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEluaXRpYWxpemUgdHlwZXMgYW5kIGdsb2JhbHMgaW4gbWVzc2FnZV9mYWN0b3J5LmNjCisgIGlmICghSW5pdE1lc3NhZ2VGYWN0b3J5KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJbml0aWFsaXplIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoaXMgZmlsZS4KKyAgSW5pdEdsb2JhbHMoKTsKKworICBDTWVzc2FnZUNsYXNzX1R5cGUtPnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7CisgIGlmIChQeVR5cGVfUmVhZHkoQ01lc3NhZ2VDbGFzc19UeXBlKSA8IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNZXNzYWdlTWV0YSIsCisgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oQ01lc3NhZ2VDbGFzc19UeXBlKSk7CisKKyAgaWYgKFB5VHlwZV9SZWFkeShDTWVzc2FnZV9UeXBlKSA8IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKFB5VHlwZV9SZWFkeShDRmllbGRQcm9wZXJ0eV9UeXBlKSA8IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBERVNDUklQVE9SIGlzIHNldCBvbiBlYWNoIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlIGNsYXNzIGVsc2V3aGVyZSwgYnV0IHNldAorICAvLyBpdCBoZXJlIGFzIHdlbGwgdG8gZG9jdW1lbnQgdGhhdCBzdWJjbGFzc2VzIG5lZWQgdG8gc2V0IGl0LgorICBQeURpY3RfU2V0SXRlbShDTWVzc2FnZV9UeXBlLT50cF9kaWN0LCBrREVTQ1JJUFRPUiwgUHlfTm9uZSk7CisgIC8vIEludmFsaWRhdGUgYW55IGNhY2hlZCBkYXRhIGZvciB0aGUgQ01lc3NhZ2UgdHlwZS4KKyAgLy8gVGhpcyBjYWxsIGlzIG5lY2Vzc2FyeSB0byBjb3JyZWN0bHkgc3VwcG9ydCBQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUcsCisgIC8vIGFmdGVyIHdlIGhhdmUgbW9kaWZpZWQgQ01lc3NhZ2VfVHlwZS50cF9kaWN0LgorICBQeVR5cGVfTW9kaWZpZWQoQ01lc3NhZ2VfVHlwZSk7CisKKyAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNZXNzYWdlIiwgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KENNZXNzYWdlX1R5cGUpKTsKKworICAvLyBJbml0aWFsaXplIFJlcGVhdGVkIGNvbnRhaW5lciB0eXBlcy4KKyAgeworICAgIGlmIChQeVR5cGVfUmVhZHkoJlJlcGVhdGVkU2NhbGFyQ29udGFpbmVyX1R5cGUpIDwgMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFB5TW9kdWxlX0FkZE9iamVjdCgKKyAgICAgICAgbSwgIlJlcGVhdGVkU2NhbGFyQ29udGFpbmVyIiwKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KCZSZXBlYXRlZFNjYWxhckNvbnRhaW5lcl9UeXBlKSk7CisKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcl9UeXBlKSA8IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QoCisgICAgICAgIG0sICJSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciIsCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigmUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXJfVHlwZSkpOworCisgICAgLy8gUmVnaXN0ZXIgdGhlbSBhcyBNdXRhYmxlU2VxdWVuY2UuCisgICAgU2NvcGVkUHlPYmplY3RQdHIgY29sbGVjdGlvbnMoUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJjb2xsZWN0aW9ucy5hYmMiKSk7CisgICAgaWYgKGNvbGxlY3Rpb25zID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU2NvcGVkUHlPYmplY3RQdHIgbXV0YWJsZV9zZXF1ZW5jZSgKKyAgICAgICAgUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb2xsZWN0aW9ucy5nZXQoKSwgIk11dGFibGVTZXF1ZW5jZSIpKTsKKyAgICBpZiAobXV0YWJsZV9zZXF1ZW5jZSA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChTY29wZWRQeU9iamVjdFB0cigKKyAgICAgICAgICAgIFB5T2JqZWN0X0NhbGxNZXRob2QobXV0YWJsZV9zZXF1ZW5jZS5nZXQoKSwgInJlZ2lzdGVyIiwgIk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUmVwZWF0ZWRTY2FsYXJDb250YWluZXJfVHlwZSkpID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKFNjb3BlZFB5T2JqZWN0UHRyKAorICAgICAgICAgICAgUHlPYmplY3RfQ2FsbE1ldGhvZChtdXRhYmxlX3NlcXVlbmNlLmdldCgpLCAicmVnaXN0ZXIiLCAiTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcl9UeXBlKSkgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIGlmIChQeVR5cGVfUmVhZHkoJlB5VW5rbm93bkZpZWxkc19UeXBlKSA8IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoUHlUeXBlX1JlYWR5KCZQeVVua25vd25GaWVsZFNldF9UeXBlKSA8IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVua25vd25GaWVsZFNldCIsCisgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oJlB5VW5rbm93bkZpZWxkU2V0X1R5cGUpKTsKKworICBpZiAoUHlUeXBlX1JlYWR5KCZQeVVua25vd25GaWVsZFJlZl9UeXBlKSA8IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoUHlUeXBlX1JlYWR5KCZQeVVua25vd25GaWVsZF9UeXBlKSA8IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJbml0aWFsaXplIE1hcCBjb250YWluZXIgdHlwZXMuCisgIGlmICghSW5pdE1hcENvbnRhaW5lcnMoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNjYWxhck1hcENvbnRhaW5lciIsCisgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oU2NhbGFyTWFwQ29udGFpbmVyX1R5cGUpKTsKKyAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNZXNzYWdlTWFwQ29udGFpbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihNZXNzYWdlTWFwQ29udGFpbmVyX1R5cGUpKTsKKyAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNYXBJdGVyYXRvciIsCisgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oJk1hcEl0ZXJhdG9yX1R5cGUpKTsKKworICBpZiAoUHlUeXBlX1JlYWR5KCZFeHRlbnNpb25EaWN0X1R5cGUpIDwgMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV4dGVuc2lvbkRpY3QiLAorICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KCZFeHRlbnNpb25EaWN0X1R5cGUpKTsKKyAgaWYgKFB5VHlwZV9SZWFkeSgmRXh0ZW5zaW9uSXRlcmF0b3JfVHlwZSkgPCAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXh0ZW5zaW9uSXRlcmF0b3IiLAorICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KCZFeHRlbnNpb25JdGVyYXRvcl9UeXBlKSk7CisKKyAgLy8gRXhwb3NlIHRoZSBEZXNjcmlwdG9yUG9vbCB1c2VkIHRvIGhvbGQgYWxsIGRlc2NyaXB0b3JzIGFkZGVkIGZyb20gZ2VuZXJhdGVkCisgIC8vIHBiMi5weSBmaWxlcy4KKyAgLy8gUHlNb2R1bGVfQWRkT2JqZWN0IHN0ZWFscyBhIHJlZmVyZW5jZS4KKyAgUHlfSU5DUkVGKEdldERlZmF1bHREZXNjcmlwdG9yUG9vbCgpKTsKKyAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJkZWZhdWx0X3Bvb2wiLAorICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KEdldERlZmF1bHREZXNjcmlwdG9yUG9vbCgpKSk7CisKKyAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEZXNjcmlwdG9yUG9vbCIsCisgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oJlB5RGVzY3JpcHRvclBvb2xfVHlwZSkpOworICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRlc2NyaXB0b3IiLAorICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KCZQeU1lc3NhZ2VEZXNjcmlwdG9yX1R5cGUpKTsKKyAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGaWVsZERlc2NyaXB0b3IiLAorICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KCZQeUZpZWxkRGVzY3JpcHRvcl9UeXBlKSk7CisgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRW51bURlc2NyaXB0b3IiLAorICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KCZQeUVudW1EZXNjcmlwdG9yX1R5cGUpKTsKKyAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFbnVtVmFsdWVEZXNjcmlwdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigmUHlFbnVtVmFsdWVEZXNjcmlwdG9yX1R5cGUpKTsKKyAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGaWxlRGVzY3JpcHRvciIsCisgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oJlB5RmlsZURlc2NyaXB0b3JfVHlwZSkpOworICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk9uZW9mRGVzY3JpcHRvciIsCisgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oJlB5T25lb2ZEZXNjcmlwdG9yX1R5cGUpKTsKKyAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTZXJ2aWNlRGVzY3JpcHRvciIsCisgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oJlB5U2VydmljZURlc2NyaXB0b3JfVHlwZSkpOworICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1ldGhvZERlc2NyaXB0b3IiLAorICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KCZQeU1ldGhvZERlc2NyaXB0b3JfVHlwZSkpOworCisgIFB5T2JqZWN0KiBlbnVtX3R5cGVfd3JhcHBlciA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgKKyAgICAgICJnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuZW51bV90eXBlX3dyYXBwZXIiKTsKKyAgaWYgKGVudW1fdHlwZV93cmFwcGVyID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRW51bVR5cGVXcmFwcGVyX2NsYXNzID0KKyAgICAgIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZW51bV90eXBlX3dyYXBwZXIsICJFbnVtVHlwZVdyYXBwZXIiKTsKKyAgUHlfREVDUkVGKGVudW1fdHlwZV93cmFwcGVyKTsKKworICBQeU9iamVjdCogbWVzc2FnZV9tb2R1bGUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLm1lc3NhZ2UiKTsKKyAgaWYgKG1lc3NhZ2VfbW9kdWxlID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRW5jb2RlRXJyb3JfY2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1lc3NhZ2VfbW9kdWxlLCAiRW5jb2RlRXJyb3IiKTsKKyAgRGVjb2RlRXJyb3JfY2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1lc3NhZ2VfbW9kdWxlLCAiRGVjb2RlRXJyb3IiKTsKKyAgUHl0aG9uTWVzc2FnZV9jbGFzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobWVzc2FnZV9tb2R1bGUsICJNZXNzYWdlIik7CisgIFB5X0RFQ1JFRihtZXNzYWdlX21vZHVsZSk7CisKKyAgUHlPYmplY3QqIHBpY2tsZV9tb2R1bGUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInBpY2tsZSIpOworICBpZiAocGlja2xlX21vZHVsZSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFBpY2tsZUVycm9yX2NsYXNzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhwaWNrbGVfbW9kdWxlLCAiUGlja2xlRXJyb3IiKTsKKyAgUHlfREVDUkVGKHBpY2tsZV9tb2R1bGUpOworCisgIC8vIE92ZXJyaWRlIHtHZXQsTXV0YWJsZX1DUHJvdG9JbnNpZGVQeVByb3RvLgorICBHZXRDUHJvdG9JbnNpZGVQeVByb3RvUHRyID0gR2V0Q1Byb3RvSW5zaWRlUHlQcm90b0ltcGw7CisgIE11dGFibGVDUHJvdG9JbnNpZGVQeVByb3RvUHRyID0gTXV0YWJsZUNQcm90b0luc2lkZVB5UHJvdG9JbXBsOworCisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZS5oIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3ZGFhNQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZS5oCkBAIC0wLDAgKzEsMzc3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBhbnVyYWFnQGdvb2dsZS5jb20gKEFudXJhYWcgQWdyYXdhbCkKKy8vIEF1dGhvcjogdGliZWxsQGdvb2dsZS5jb20gKEpvaGFuIFRpYmVsbCkKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9NRVNTQUdFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9NRVNTQUdFX0hfXworCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIE1lc3NhZ2U7CitjbGFzcyBSZWZsZWN0aW9uOworY2xhc3MgRmllbGREZXNjcmlwdG9yOworY2xhc3MgRGVzY3JpcHRvcjsKK2NsYXNzIERlc2NyaXB0b3JQb29sOworY2xhc3MgTWVzc2FnZUZhY3Rvcnk7CisKK25hbWVzcGFjZSBweXRob24geworCitzdHJ1Y3QgRXh0ZW5zaW9uRGljdDsKK3N0cnVjdCBQeU1lc3NhZ2VGYWN0b3J5Oworc3RydWN0IENNZXNzYWdlQ2xhc3M7CisKKy8vIE1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgb2YgdGhlIE1lc3NhZ2UgY2xhc3MgY29tZXMgZnJvbSB0aGUgIlJlbGVhc2UiCisvLyBiZWhhdmlvcjoKKy8vCisvLyBXaGVuIGEgZmllbGQgaXMgY2xlYXJlZCwgaXQgaXMgb25seSBkZXRhY2hlZCBmcm9tIGl0cyBtZXNzYWdlLiBFeGlzdGluZworLy8gcmVmZXJlbmNlcyB0byBzdWJtZXNzYWdlcywgdG8gcmVwZWF0ZWQgY29udGFpbmVyIGV0Yy4gd29uJ3Qgc2VlIGFueSBjaGFuZ2UsCisvLyBhcyBpZiB0aGUgZGF0YSB3YXMgZWZmZWN0aXZlbHkgbWFuYWdlZCBieSB0aGVzZSBjb250YWluZXJzLgorLy8KKy8vIEV4dGVuc2lvbkRpY3RzIGFuZCBVbmtub3duRmllbGRzIGNvbnRhaW5lcnMgZG8gTk9UIGZvbGxvdyB0aGlzIHJ1bGUuIFRoZXkKKy8vIGRvbid0IHN0b3JlIGFueSBkYXRhLCBhbmQgYWx3YXlzIHJlZmVyIHRvIHRoZWlyIHBhcmVudCBtZXNzYWdlLgorCitzdHJ1Y3QgQ29udGFpbmVyQmFzZSB7CisgIFB5T2JqZWN0X0hFQUQ7CisKKyAgLy8gU3Ryb25nIHJlZmVyZW5jZSB0byBhIHBhcmVudCBtZXNzYWdlIG9iamVjdC4gRm9yIGEgQ01lc3NhZ2UgdGhlcmUgYXJlIHRocmVlCisgIC8vIGNhc2VzOgorICAvLyAtIEZvciBhIHRvcC1sZXZlbCBtZXNzYWdlLCB0aGlzIHBvaW50ZXIgaXMgTlVMTC4KKyAgLy8gLSBGb3IgYSBzdWItbWVzc2FnZSwgdGhpcyBwb2ludHMgdG8gdGhlIHBhcmVudCBtZXNzYWdlLgorICAvLyAtIEZvciBhIG1lc3NhZ2UgbWFuYWdlZCBleHRlcm5hbGx5LCB0aGlzIGlzIGEgb3duZWQgcmVmZXJlbmNlIHRvIFB5X05vbmUuCisgIC8vCisgIC8vIEZvciBhbGwgb3RoZXIgdHlwZXM6IHJlcGVhdGVkIGNvbnRhaW5lcnMsIG1hcHMsIGl0IGFsd2F5cyBwb2ludCB0byBhCisgIC8vIHZhbGlkIHBhcmVudCBDTWVzc2FnZS4KKyAgc3RydWN0IENNZXNzYWdlKiBwYXJlbnQ7CisKKyAgLy8gSWYgdGhpcyBvYmplY3QgYmVsb25ncyB0byBhIHBhcmVudCBtZXNzYWdlLCBkZXNjcmliZXMgd2hpY2ggZmllbGQgaXQgY29tZXMKKyAgLy8gZnJvbS4KKyAgLy8gVGhlIHBvaW50ZXIgaXMgb3duZWQgYnkgdGhlIERlc2NyaXB0b3JQb29sICh3aGljaCBpcyBrZXB0IGFsaXZlCisgIC8vIHRocm91Z2ggdGhlIG1lc3NhZ2UncyBQeXRob24gY2xhc3MpCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3I7CisKKyAgUHlPYmplY3QqIEFzUHlPYmplY3QoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4odGhpcyk7IH0KKworICAvLyBUaGUgVGhyZWUgbWV0aG9kcyBiZWxvdyBhcmUgb25seSB1c2VkIGJ5IFJlcGVhdGVkIGNvbnRhaW5lcnMsIGFuZCBNYXBzLgorCisgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gd29ya3MgZm9yIGFsbCBjb250YWluZXJzIHdoaWNoIGhhdmUgYSBwYXJlbnQuCisgIFB5T2JqZWN0KiBEZWVwQ29weSgpOworICAvLyBEZWxldGUgdGhpcyBjb250YWluZXIgb2JqZWN0IGZyb20gaXRzIHBhcmVudC4gRG9lcyBub3Qgd29yayBmb3IgbWVzc2FnZXMuCisgIHZvaWQgUmVtb3ZlRnJvbVBhcmVudENhY2hlKCk7Cit9OworCit0eXBlZGVmIHN0cnVjdCBDTWVzc2FnZSA6IHB1YmxpYyBDb250YWluZXJCYXNlIHsKKyAgLy8gUG9pbnRlciB0byB0aGUgQysrIE1lc3NhZ2Ugb2JqZWN0IGZvciB0aGlzIENNZXNzYWdlLgorICAvLyAtIElmIHRoaXMgb2JqZWN0IGhhcyBubyBwYXJlbnQsIHdlIG93biB0aGlzIHBvaW50ZXIuCisgIC8vIC0gSWYgdGhpcyBvYmplY3QgaGFzIGEgcGFyZW50IG1lc3NhZ2UsIHRoZSBwYXJlbnQgb3ducyB0aGlzIHBvaW50ZXIuCisgIE1lc3NhZ2UqIG1lc3NhZ2U7CisKKyAgLy8gSW5kaWNhdGVzIHRoaXMgc3VibWVzc2FnZSBpcyBwb2ludGluZyB0byBhIGRlZmF1bHQgaW5zdGFuY2Ugb2YgYSBtZXNzYWdlLgorICAvLyBTdWJtZXNzYWdlcyBhcmUgYWx3YXlzIGZpcnN0IGNyZWF0ZWQgYXMgcmVhZCBvbmx5IG1lc3NhZ2VzIGFuZCBhcmUgdGhlbgorICAvLyBtYWRlIHdyaXRhYmxlLCBhdCB3aGljaCBwb2ludCB0aGlzIGZpZWxkIGlzIHNldCB0byBmYWxzZS4KKyAgYm9vbCByZWFkX29ubHk7CisKKyAgLy8gQSBtYXBwaW5nIGluZGV4ZWQgYnkgZmllbGQsIGNvbnRhaW5pbmcgd2VhayByZWZlcmVuY2VzIHRvIGNvbnRhaW5lZCBvYmplY3RzCisgIC8vIHdoaWNoIG5lZWQgdG8gaW1wbGVtZW50IHRoZSAiUmVsZWFzZSIgbWVjaGFuaXNtOgorICAvLyBkaXJlY3Qgc3VibWVzc2FnZXMsIFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyLCBSZXBlYXRlZFNjYWxhckNvbnRhaW5lcgorICAvLyBhbmQgTWFwQ29udGFpbmVyLgorICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxjb25zdCBGaWVsZERlc2NyaXB0b3IqLCBDb250YWluZXJCYXNlKj4KKyAgICAgIENvbXBvc2l0ZUZpZWxkc01hcDsKKyAgQ29tcG9zaXRlRmllbGRzTWFwKiBjb21wb3NpdGVfZmllbGRzOworCisgIC8vIEEgbWFwcGluZyBjb250YWluaW5nIHdlYWsgcmVmZXJlbmNlcyB0byBpbmRpcmVjdCBjaGlsZCBtZXNzYWdlcywgYWNjZXNzZWQKKyAgLy8gdGhyb3VnaCBjb250YWluZXJzOiByZXBlYXRlZCBtZXNzYWdlcywgYW5kIHZhbHVlcyBvZiBtZXNzYWdlIG1hcHMuCisgIC8vIFRoaXMgYXZvaWQgdGhlIGNyZWF0aW9uIG9mIHNpbWlsYXIgbWFwcyBpbiBlYWNoIG9mIHRob3NlIGNvbnRhaW5lcnMuCisgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPGNvbnN0IE1lc3NhZ2UqLCBDTWVzc2FnZSo+IFN1Yk1lc3NhZ2VzTWFwOworICBTdWJNZXNzYWdlc01hcCogY2hpbGRfc3VibWVzc2FnZXM7CisKKyAgLy8gQSByZWZlcmVuY2UgdG8gUHlVbmtub3duRmllbGRzLgorICBQeU9iamVjdCogdW5rbm93bl9maWVsZF9zZXQ7CisKKyAgLy8gSW1wbGVtZW50cyB0aGUgIndlYWtyZWYiIHByb3RvY29sIGZvciB0aGlzIG9iamVjdC4KKyAgUHlPYmplY3QqIHdlYWtyZWZsaXN0OworCisgIC8vIFJldHVybiBhICpib3Jyb3dlZCogcmVmZXJlbmNlIHRvIHRoZSBtZXNzYWdlIGNsYXNzLgorICBDTWVzc2FnZUNsYXNzKiBHZXRNZXNzYWdlQ2xhc3MoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2VDbGFzcyo+KFB5X1RZUEUodGhpcykpOworICB9CisKKyAgLy8gRm9yIGNvbnRhaW5lciBjb250YWluaW5nIG1lc3NhZ2VzLCByZXR1cm4gYSBQeXRob24gb2JqZWN0IGZvciB0aGUgZ2l2ZW4KKyAgLy8gcG9pbnRlciB0byBhIG1lc3NhZ2UuCisgIENNZXNzYWdlKiBCdWlsZFN1Yk1lc3NhZ2VGcm9tUG9pbnRlcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBzdWJfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENNZXNzYWdlQ2xhc3MqIG1lc3NhZ2VfY2xhc3MpOworICBDTWVzc2FnZSogTWF5YmVSZWxlYXNlU3ViTWVzc2FnZShNZXNzYWdlKiBzdWJfbWVzc2FnZSk7Cit9IENNZXNzYWdlOworCisvLyBUaGUgKG1ldGEpIHR5cGUgb2YgYWxsIE1lc3NhZ2VzIGNsYXNzZXMuCisvLyBJdCBhbGxvd3MgdXMgdG8gY2FjaGUgc29tZSBDKysgcG9pbnRlcnMgaW4gdGhlIGNsYXNzIG9iamVjdCBpdHNlbGYsIHRoZXkgYXJlCisvLyBmYXN0ZXIgdG8gZXh0cmFjdCB0aGFuIGZyb20gdGhlIHR5cGUncyBkaWN0aW9uYXJ5LgorCitzdHJ1Y3QgQ01lc3NhZ2VDbGFzcyB7CisgIC8vIFRoaXMgaXMgaG93IENQeXRob24gc3ViY2xhc3NlcyBDIHN0cnVjdHVyZXM6IHRoZSBiYXNlIHN0cnVjdHVyZSBtdXN0IGJlCisgIC8vIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIG9iamVjdC4KKyAgUHlIZWFwVHlwZU9iamVjdCBzdXBlcjsKKworICAvLyBDKysgZGVzY3JpcHRvciBvZiB0aGlzIG1lc3NhZ2UuCisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfZGVzY3JpcHRvcjsKKworICAvLyBPd25lZCByZWZlcmVuY2UsIHVzZWQgdG8ga2VlcCB0aGUgcG9pbnRlciBhYm92ZSBhbGl2ZS4KKyAgLy8gVGhpcyByZWZlcmVuY2UgbXVzdCBzdGF5IGFsaXZlIHVudGlsIGFsbCBtZXNzYWdlIHBvaW50ZXJzIGFyZSBkZXN0cnVjdGVkLgorICBQeU9iamVjdCogcHlfbWVzc2FnZV9kZXNjcmlwdG9yOworCisgIC8vIFRoZSBQeXRob24gTWVzc2FnZUZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIGNsYXNzLiBJdCBpcyBuZWVkZWQgdG8gcmVzb2x2ZQorICAvLyBmaWVsZHMgZGVzY3JpcHRvcnMsIGluY2x1ZGluZyBleHRlbnNpb25zIGZpZWxkczsgaXRzIEMrKyBNZXNzYWdlRmFjdG9yeSBpcworICAvLyB1c2VkIHRvIGluc3RhbnRpYXRlIHN1Ym1lc3NhZ2VzLgorICAvLyBUaGlzIHJlZmVyZW5jZSBtdXN0IHN0YXkgYWxpdmUgdW50aWwgYWxsIG1lc3NhZ2UgcG9pbnRlcnMgYXJlIGRlc3RydWN0ZWQuCisgIFB5TWVzc2FnZUZhY3RvcnkqIHB5X21lc3NhZ2VfZmFjdG9yeTsKKworICBQeU9iamVjdCogQXNQeU9iamVjdCgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHRoaXMpOworICB9Cit9OworCitleHRlcm4gUHlUeXBlT2JqZWN0KiBDTWVzc2FnZUNsYXNzX1R5cGU7CitleHRlcm4gUHlUeXBlT2JqZWN0KiBDTWVzc2FnZV9UeXBlOworCituYW1lc3BhY2UgY21lc3NhZ2UgeworCisvLyBJbnRlcm5hbCBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZW1wdHkgTWVzc2FnZSBQeXRob24gb2JqZWN0LCBidXQgd2l0aCBlbXB0eQorLy8gcG9pbnRlcnMgdG8gdGhlIEMrKyBvYmplY3RzLgorLy8gVGhlIGNhbGxlciBtdXN0IGZpbGwgc2VsZi0+bWVzc2FnZSwgc2VsZi0+b3duZXIgYW5kIGV2ZW50dWFsbHkgc2VsZi0+cGFyZW50LgorQ01lc3NhZ2UqIE5ld0VtcHR5TWVzc2FnZShDTWVzc2FnZUNsYXNzKiB0eXBlKTsKKworLy8gUmV0cmlldmVzIHRoZSBDKysgZGVzY3JpcHRvciBvZiBhIFB5dGhvbiBFeHRlbnNpb24gZGVzY3JpcHRvci4KKy8vIE9uIGVycm9yLCByZXR1cm4gTlVMTCB3aXRoIGFuIGV4Y2VwdGlvbiBzZXQuCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIEdldEV4dGVuc2lvbkRlc2NyaXB0b3IoUHlPYmplY3QqIGV4dGVuc2lvbik7CisKKy8vIEluaXRpYWxpemVzIGEgbmV3IENNZXNzYWdlIGluc3RhbmNlIGZvciBhIHN1Ym1lc3NhZ2UuIE9ubHkgY2FsbGVkIG9uY2UgcGVyCisvLyBzdWJtZXNzYWdlIGFzIHRoZSByZXN1bHQgaXMgY2FjaGVkIGluIGNvbXBvc2l0ZV9maWVsZHMuCisvLworLy8gQ29ycmVzcG9uZHMgdG8gcmVmbGVjdGlvbiBhcGkgbWV0aG9kIEdldE1lc3NhZ2UuCitDTWVzc2FnZSogSW50ZXJuYWxHZXRTdWJNZXNzYWdlKAorICAgIENNZXNzYWdlKiBzZWxmLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IpOworCisvLyBEZWxldGVzIGEgcmFuZ2Ugb2YgaXRlbXMgaW4gYSByZXBlYXRlZCBmaWVsZCAoZm9sbG93aW5nIGEKKy8vIHJlbW92YWwgaW4gYSBSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcikuCisvLworLy8gQ29ycmVzcG9uZHMgdG8gcmVmbGVjdGlvbiBhcGkgbWV0aG9kIFJlbW92ZUxhc3QuCitpbnQgRGVsZXRlUmVwZWF0ZWRGaWVsZChDTWVzc2FnZSogc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBzbGljZSk7CisKKy8vIFNldHMgdGhlIHNwZWNpZmllZCBzY2FsYXIgdmFsdWUgdG8gdGhlIG1lc3NhZ2UuCitpbnQgSW50ZXJuYWxTZXRTY2FsYXIoQ01lc3NhZ2UqIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiB2YWx1ZSk7CisKKy8vIFNldHMgdGhlIHNwZWNpZmllZCBzY2FsYXIgdmFsdWUgdG8gdGhlIG1lc3NhZ2UuICBSZXF1aXJlcyBpdCBpcyBub3QgYSBPbmVvZi4KK2ludCBJbnRlcm5hbFNldE5vbk9uZW9mU2NhbGFyKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogYXJnKTsKKworLy8gUmV0cmlldmVzIHRoZSBzcGVjaWZpZWQgc2NhbGFyIHZhbHVlIGZyb20gdGhlIG1lc3NhZ2UuCisvLworLy8gUmV0dXJucyBhIG5ldyBweXRob24gcmVmZXJlbmNlLgorUHlPYmplY3QqIEludGVybmFsR2V0U2NhbGFyKGNvbnN0IE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yKTsKKworYm9vbCBTZXRDb21wb3NpdGVGaWVsZChDTWVzc2FnZSogc2VsZiwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyQmFzZSogdmFsdWUpOworCitib29sIFNldFN1Ym1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIENNZXNzYWdlKiBzdWJtZXNzYWdlKTsKKworLy8gQ2xlYXJzIHRoZSBtZXNzYWdlLCByZW1vdmluZyBhbGwgY29udGFpbmVkIGRhdGEuIEV4dGVuc2lvbiBkaWN0aW9uYXJ5IGFuZAorLy8gc3VibWVzc2FnZXMgYXJlIHJlbGVhc2VkIGZpcnN0IGlmIHRoZXJlIGFyZSByZW1haW5pbmcgZXh0ZXJuYWwgcmVmZXJlbmNlcy4KKy8vCisvLyBDb3JyZXNwb25kcyB0byBtZXNzYWdlIGFwaSBtZXRob2QgQ2xlYXIuCitQeU9iamVjdCogQ2xlYXIoQ01lc3NhZ2UqIHNlbGYpOworCisvLyBDbGVhcnMgdGhlIGRhdGEgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBkZXNjcmlwdG9yLgorLy8gUmV0dXJucyAtMSBvbiBlcnJvci4KKy8vCisvLyBDb3JyZXNwb25kcyB0byByZWZsZWN0aW9uIGFwaSBtZXRob2QgQ2xlYXJGaWVsZC4KK2ludCBDbGVhckZpZWxkQnlEZXNjcmlwdG9yKENNZXNzYWdlKiBzZWxmLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisvLyBDaGVja3MgaWYgdGhlIG1lc3NhZ2UgaGFzIHRoZSBmaWVsZCBkZXNjcmliZWQgYnkgdGhlIGRlc2NyaXB0b3IuIFVzZWQgZm9yCisvLyBleHRlbnNpb25zICh3aGljaCBoYXZlIG5vIG5hbWUpLgorLy8gUmV0dXJucyAxIGlmIHRydWUsIDAgaWYgZmFsc2UsIGFuZCAtMSBvbiBlcnJvci4KKy8vCisvLyBDb3JyZXNwb25kcyB0byByZWZsZWN0aW9uIGFwaSBtZXRob2QgSGFzRmllbGQKK2ludCBIYXNGaWVsZEJ5RGVzY3JpcHRvcihDTWVzc2FnZSogc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IpOworCisvLyBDaGVja3MgaWYgdGhlIG1lc3NhZ2UgaGFzIHRoZSBuYW1lZCBmaWVsZC4KKy8vCisvLyBDb3JyZXNwb25kcyB0byByZWZsZWN0aW9uIGFwaSBtZXRob2QgSGFzRmllbGQuCitQeU9iamVjdCogSGFzRmllbGQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpOworCisvLyBJbml0aWFsaXplcyB2YWx1ZXMgb2YgZmllbGRzIG9uIGEgbmV3bHkgY29uc3RydWN0ZWQgbWVzc2FnZS4KKy8vIE5vdGUgdGhhdCBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhcmUgZGlzYWxsb3dlZDogJ2FyZ3MnIG11c3QgYmUgTlVMTCBvciB0aGUKKy8vIGVtcHR5IHR1cGxlLgoraW50IEluaXRBdHRyaWJ1dGVzKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7CisKK1B5T2JqZWN0KiBNZXJnZUZyb20oQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpOworCisvLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBkbyBhbnl0aGluZyBiZXlvbmQgY2hlY2tpbmcgdGhhdCBubyBvdGhlciBleHRlbnNpb24KKy8vIGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2FtZSBmaWVsZCBudW1iZXIgb24gdGhpcyBjbGFzcy4KK1B5T2JqZWN0KiBSZWdpc3RlckV4dGVuc2lvbihQeU9iamVjdCogY2xzLCBQeU9iamVjdCogZXh0ZW5zaW9uX2hhbmRsZSk7CisKKy8vIEdldCBhIGZpZWxkIGZyb20gYSBtZXNzYWdlLgorUHlPYmplY3QqIEdldEZpZWxkVmFsdWUoQ01lc3NhZ2UqIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IpOworLy8gU2V0cyB0aGUgdmFsdWUgb2YgYSBzY2FsYXIgZmllbGQgaW4gYSBtZXNzYWdlLgorLy8gT24gZXJyb3IsIHJldHVybiAtMSB3aXRoIGFuIGV4dGVuc2lvbiBzZXQuCitpbnQgU2V0RmllbGRWYWx1ZShDTWVzc2FnZSogc2VsZiwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHZhbHVlKTsKKworUHlPYmplY3QqIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhDTWVzc2FnZSogc2VsZik7CisKK2ludCBBc3N1cmVXcml0YWJsZShDTWVzc2FnZSogc2VsZik7CisKKy8vIFJldHVybnMgdGhlIG1lc3NhZ2UgZmFjdG9yeSBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UuCisvLyBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gbWVzc2FnZS5NRVNTQUdFX0ZBQ1RPUlkKKy8vCisvLyBUaGUgcmV0dXJuZWQgZmFjdG9yeSBpcyBzdWl0YWJsZSBmb3IgZmluZGluZyBmaWVsZHMgYW5kIGJ1aWxkaW5nIHN1Ym1lc3NhZ2VzLAorLy8gZXZlbiBpbiB0aGUgY2FzZSBvZiBleHRlbnNpb25zLgorLy8gUmV0dXJucyBhICpib3Jyb3dlZCogcmVmZXJlbmNlLCBhbmQgbmV2ZXIgZmFpbHMgYmVjYXVzZSB3ZSBwYXNzIGEgQ01lc3NhZ2UuCitQeU1lc3NhZ2VGYWN0b3J5KiBHZXRGYWN0b3J5Rm9yTWVzc2FnZShDTWVzc2FnZSogbWVzc2FnZSk7CisKK1B5T2JqZWN0KiBTZXRBbGxvd092ZXJzaXplUHJvdG9zKFB5T2JqZWN0KiBtLCBQeU9iamVjdCogYXJnKTsKKworfSAgLy8gbmFtZXNwYWNlIGNtZXNzYWdlCisKKworLyogSXMgNjRiaXQgKi8KKyNkZWZpbmUgSVNfNjRCSVQgKFNJWkVPRl9MT05HID09IDgpCisKKyNkZWZpbmUgRklFTERfSVNfUkVQRUFURUQoZmllbGRfZGVzY3JpcHRvcikgXAorICAoKGZpZWxkX2Rlc2NyaXB0b3IpLT5sYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQpCisKKyNkZWZpbmUgR09PR0xFX0NIRUNLX0dFVF9JTlQzMihhcmcsIHZhbHVlLCBlcnIpICBcCisgIGludDMyX3QgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghQ2hlY2tBbmRHZXRJbnRlZ2VyKGFyZywgJnZhbHVlKSkgeyBcCisgICAgcmV0dXJuIGVycjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0VUX0lOVDY0KGFyZywgdmFsdWUsIGVycikgIFwKKyAgaW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCFDaGVja0FuZEdldEludGVnZXIoYXJnLCAmdmFsdWUpKSB7IFwKKyAgICByZXR1cm4gZXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEdPT0dMRV9DSEVDS19HRVRfVUlOVDMyKGFyZywgdmFsdWUsIGVycikgXAorICB1aW50MzJfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoIUNoZWNrQW5kR2V0SW50ZWdlcihhcmcsICZ2YWx1ZSkpIHsgXAorICAgIHJldHVybiBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgR09PR0xFX0NIRUNLX0dFVF9VSU5UNjQoYXJnLCB2YWx1ZSwgZXJyKSBcCisgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghQ2hlY2tBbmRHZXRJbnRlZ2VyKGFyZywgJnZhbHVlKSkgeyBcCisgICAgcmV0dXJuIGVycjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0VUX0ZMT0FUKGFyZywgdmFsdWUsIGVycikgXAorICBmbG9hdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghQ2hlY2tBbmRHZXRGbG9hdChhcmcsICZ2YWx1ZSkpIHsgIFwKKyAgICByZXR1cm4gZXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgR09PR0xFX0NIRUNLX0dFVF9ET1VCTEUoYXJnLCB2YWx1ZSwgZXJyKSBcCisgIGRvdWJsZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghQ2hlY2tBbmRHZXREb3VibGUoYXJnLCAmdmFsdWUpKSB7ICBcCisgICAgcmV0dXJuIGVycjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0VUX0JPT0woYXJnLCB2YWx1ZSwgZXJyKSBcCisgIGJvb2wgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoIUNoZWNrQW5kR2V0Qm9vbChhcmcsICZ2YWx1ZSkpIHsgIFwKKyAgICByZXR1cm4gZXJyOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBGVUxMX01PRFVMRV9OQU1FICJnb29nbGUucHJvdG9idWYucHlleHQuX21lc3NhZ2UiCisKK3ZvaWQgRm9ybWF0VHlwZUVycm9yKFB5T2JqZWN0KiBhcmcsIGNvbnN0IGNoYXIqIGV4cGVjdGVkX3R5cGVzKTsKK3RlbXBsYXRlPGNsYXNzIFQ+Citib29sIENoZWNrQW5kR2V0SW50ZWdlcihQeU9iamVjdCogYXJnLCBUKiB2YWx1ZSk7Citib29sIENoZWNrQW5kR2V0RG91YmxlKFB5T2JqZWN0KiBhcmcsIGRvdWJsZSogdmFsdWUpOworYm9vbCBDaGVja0FuZEdldEZsb2F0KFB5T2JqZWN0KiBhcmcsIGZsb2F0KiB2YWx1ZSk7Citib29sIENoZWNrQW5kR2V0Qm9vbChQeU9iamVjdCogYXJnLCBib29sKiB2YWx1ZSk7CitQeU9iamVjdCogQ2hlY2tTdHJpbmcoUHlPYmplY3QqIGFyZywgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKK2Jvb2wgQ2hlY2tBbmRTZXRTdHJpbmcoCisgICAgUHlPYmplY3QqIGFyZywgTWVzc2FnZSogbWVzc2FnZSwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICBib29sIGFwcGVuZCwKKyAgICBpbnQgaW5kZXgpOworUHlPYmplY3QqIFRvU3RyaW5nT2JqZWN0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworCisvLyBDaGVjayBpZiB0aGUgcGFzc2VkIGZpZWxkIGRlc2NyaXB0b3IgYmVsb25ncyB0byB0aGUgZ2l2ZW4gbWVzc2FnZS4KKy8vIElmIG5vdCwgcmV0dXJuIGZhbHNlIGFuZCBzZXQgYSBQeXRob24gZXhjZXB0aW9uIChhIEtleUVycm9yKQorYm9vbCBDaGVja0ZpZWxkQmVsb25nc1RvTWVzc2FnZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIG1lc3NhZ2UpOworCitleHRlcm4gUHlPYmplY3QqIFBpY2tsZUVycm9yX2NsYXNzOworCitQeU9iamVjdCogUHlNZXNzYWdlX05ldyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHB5X21lc3NhZ2VfZmFjdG9yeSk7Citjb25zdCBNZXNzYWdlKiBQeU1lc3NhZ2VfR2V0TWVzc2FnZVBvaW50ZXIoUHlPYmplY3QqIG1zZyk7CitNZXNzYWdlKiBQeU1lc3NhZ2VfR2V0TXV0YWJsZU1lc3NhZ2VQb2ludGVyKFB5T2JqZWN0KiBtc2cpOworUHlPYmplY3QqIFB5TWVzc2FnZV9OZXdNZXNzYWdlT3duZWRFeHRlcm5hbGx5KE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHB5X21lc3NhZ2VfZmFjdG9yeSk7CisKK2Jvb2wgSW5pdFByb3RvMk1lc3NhZ2VNb2R1bGUoUHlPYmplY3QgKm0pOworCisvLyBUaGVzZSBhcmUgcmVmZXJlbmNlZCBieSByZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyLCBhbmQgbXVzdAorLy8gYmUgZXhwbGljaXRseSBpbnN0YW50aWF0ZWQuCitleHRlcm4gdGVtcGxhdGUgYm9vbCBDaGVja0FuZEdldEludGVnZXI8aW50MzI+KFB5T2JqZWN0KiwgaW50MzIqKTsKK2V4dGVybiB0ZW1wbGF0ZSBib29sIENoZWNrQW5kR2V0SW50ZWdlcjxpbnQ2ND4oUHlPYmplY3QqLCBpbnQ2NCopOworZXh0ZXJuIHRlbXBsYXRlIGJvb2wgQ2hlY2tBbmRHZXRJbnRlZ2VyPHVpbnQzMj4oUHlPYmplY3QqLCB1aW50MzIqKTsKK2V4dGVybiB0ZW1wbGF0ZSBib29sIENoZWNrQW5kR2V0SW50ZWdlcjx1aW50NjQ+KFB5T2JqZWN0KiwgdWludDY0Kik7CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX01FU1NBR0VfSF9fCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2VfZmFjdG9yeS5jYyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZV9mYWN0b3J5LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDRkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2VfZmFjdG9yeS5jYwpAQCAtMCwwICsxLDMwNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2VfZmFjdG9yeS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9zY29wZWRfcHlvYmplY3RfcHRyLmg+CisKKyNkZWZpbmUgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKG9iLCBjaGFycHAsIHNpemVwKSAgICAgICAgICAgICAgXAorICAoUHlVbmljb2RlX0NoZWNrKG9iKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKCooY2hhcnBwKSA9IGNvbnN0X2Nhc3Q8Y2hhcio+KCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIFB5VW5pY29kZV9Bc1VURjhBbmRTaXplKG9iLCAoc2l6ZXApKSkpID09IG51bGxwdHIgXAorICAgICAgICAgICAgICA/IC0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIDogMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6IFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplKG9iLCAoY2hhcnBwKSwgKHNpemVwKSkpCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBweXRob24geworCituYW1lc3BhY2UgbWVzc2FnZV9mYWN0b3J5IHsKKworUHlNZXNzYWdlRmFjdG9yeSogTmV3TWVzc2FnZUZhY3RvcnkoUHlUeXBlT2JqZWN0KiB0eXBlLCBQeURlc2NyaXB0b3JQb29sKiBwb29sKSB7CisgIFB5TWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkgPSByZWludGVycHJldF9jYXN0PFB5TWVzc2FnZUZhY3RvcnkqPigKKyAgICAgIFB5VHlwZV9HZW5lcmljQWxsb2ModHlwZSwgMCkpOworICBpZiAoZmFjdG9yeSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBEeW5hbWljTWVzc2FnZUZhY3RvcnkqIG1lc3NhZ2VfZmFjdG9yeSA9IG5ldyBEeW5hbWljTWVzc2FnZUZhY3RvcnkoKTsKKyAgLy8gVGhpcyBvcHRpb24gbWlnaHQgYmUgdGhlIGRlZmF1bHQgc29tZSBkYXkuCisgIG1lc3NhZ2VfZmFjdG9yeS0+U2V0RGVsZWdhdGVUb0dlbmVyYXRlZEZhY3RvcnkodHJ1ZSk7CisgIGZhY3RvcnktPm1lc3NhZ2VfZmFjdG9yeSA9IG1lc3NhZ2VfZmFjdG9yeTsKKworICBmYWN0b3J5LT5wb29sID0gcG9vbDsKKyAgUHlfSU5DUkVGKHBvb2wpOworCisgIGZhY3RvcnktPmNsYXNzZXNfYnlfZGVzY3JpcHRvciA9IG5ldyBQeU1lc3NhZ2VGYWN0b3J5OjpDbGFzc2VzQnlNZXNzYWdlTWFwKCk7CisKKyAgcmV0dXJuIGZhY3Rvcnk7Cit9CisKK1B5T2JqZWN0KiBOZXcoUHlUeXBlT2JqZWN0KiB0eXBlLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykgeworICBzdGF0aWMgY29uc3QgY2hhcioga3dsaXN0W10gPSB7InBvb2wiLCBudWxscHRyfTsKKyAgUHlPYmplY3QqIHBvb2wgPSBudWxscHRyOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcioqPihrd2xpc3QpLCAmcG9vbCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBTY29wZWRQeU9iamVjdFB0ciBvd25lZF9wb29sOworICBpZiAocG9vbCA9PSBudWxscHRyIHx8IHBvb2wgPT0gUHlfTm9uZSkgeworICAgIG93bmVkX3Bvb2wucmVzZXQoUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKAorICAgICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oJlB5RGVzY3JpcHRvclBvb2xfVHlwZSksIG51bGxwdHIpKTsKKyAgICBpZiAob3duZWRfcG9vbCA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcG9vbCA9IG93bmVkX3Bvb2wuZ2V0KCk7CisgIH0gZWxzZSB7CisgICAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2socG9vbCwgJlB5RGVzY3JpcHRvclBvb2xfVHlwZSkpIHsKKyAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJFeHBlY3RlZCBhIERlc2NyaXB0b3JQb29sLCBnb3QgJXMiLAorICAgICAgICAgICAgICAgICAgIHBvb2wtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigKKyAgICAgIE5ld01lc3NhZ2VGYWN0b3J5KHR5cGUsIHJlaW50ZXJwcmV0X2Nhc3Q8UHlEZXNjcmlwdG9yUG9vbCo+KHBvb2wpKSk7Cit9CisKK3N0YXRpYyB2b2lkIERlYWxsb2MoUHlPYmplY3QqIHBzZWxmKSB7CisgIFB5TWVzc2FnZUZhY3RvcnkqIHNlbGYgPSByZWludGVycHJldF9jYXN0PFB5TWVzc2FnZUZhY3RvcnkqPihwc2VsZik7CisKKyAgdHlwZWRlZiBQeU1lc3NhZ2VGYWN0b3J5OjpDbGFzc2VzQnlNZXNzYWdlTWFwOjppdGVyYXRvciBpdGVyYXRvcjsKKyAgZm9yIChpdGVyYXRvciBpdCA9IHNlbGYtPmNsYXNzZXNfYnlfZGVzY3JpcHRvci0+YmVnaW4oKTsKKyAgICAgICBpdCAhPSBzZWxmLT5jbGFzc2VzX2J5X2Rlc2NyaXB0b3ItPmVuZCgpOyArK2l0KSB7CisgICAgUHlfQ0xFQVIoaXQtPnNlY29uZCk7CisgIH0KKyAgZGVsZXRlIHNlbGYtPmNsYXNzZXNfYnlfZGVzY3JpcHRvcjsKKyAgZGVsZXRlIHNlbGYtPm1lc3NhZ2VfZmFjdG9yeTsKKyAgUHlfQ0xFQVIoc2VsZi0+cG9vbCk7CisgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUocHNlbGYpOworfQorCitzdGF0aWMgaW50IEdjVHJhdmVyc2UoUHlPYmplY3QqIHBzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQqIGFyZykgeworICBQeU1lc3NhZ2VGYWN0b3J5KiBzZWxmID0gcmVpbnRlcnByZXRfY2FzdDxQeU1lc3NhZ2VGYWN0b3J5Kj4ocHNlbGYpOworICBQeV9WSVNJVChzZWxmLT5wb29sKTsKKyAgZm9yIChjb25zdCBhdXRvJiBkZXNjX2FuZF9jbGFzcyA6ICpzZWxmLT5jbGFzc2VzX2J5X2Rlc2NyaXB0b3IpIHsKKyAgICBQeV9WSVNJVChkZXNjX2FuZF9jbGFzcy5zZWNvbmQpOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEdjQ2xlYXIoUHlPYmplY3QqIHBzZWxmKSB7CisgIFB5TWVzc2FnZUZhY3RvcnkqIHNlbGYgPSByZWludGVycHJldF9jYXN0PFB5TWVzc2FnZUZhY3RvcnkqPihwc2VsZik7CisgIC8vIEhlcmUgaXQncyBpbXBvcnRhbnQgdG8gbm90IGNsZWFyIHNlbGYtPnBvb2wsIHNvIHRoYXQgdGhlIEMrKyBEZXNjcmlwdG9yUG9vbAorICAvLyBpcyBzdGlsbCBhbGl2ZSB3aGVuIHNlbGYtPm1lc3NhZ2VfZmFjdG9yeSBpcyBkZXN0cnVjdGVkLgorICBmb3IgKGF1dG8mIGRlc2NfYW5kX2NsYXNzIDogKnNlbGYtPmNsYXNzZXNfYnlfZGVzY3JpcHRvcikgeworICAgIFB5X0NMRUFSKGRlc2NfYW5kX2NsYXNzLnNlY29uZCk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworLy8gQWRkIGEgbWVzc2FnZSBjbGFzcyB0byBvdXIgZGF0YWJhc2UuCitpbnQgUmVnaXN0ZXJNZXNzYWdlQ2xhc3MoUHlNZXNzYWdlRmFjdG9yeSogc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ01lc3NhZ2VDbGFzcyogbWVzc2FnZV9jbGFzcykgeworICBQeV9JTkNSRUYobWVzc2FnZV9jbGFzcyk7CisgIHR5cGVkZWYgUHlNZXNzYWdlRmFjdG9yeTo6Q2xhc3Nlc0J5TWVzc2FnZU1hcDo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gcmV0ID0gc2VsZi0+Y2xhc3Nlc19ieV9kZXNjcmlwdG9yLT5pbnNlcnQoCisgICAgICBzdGQ6Om1ha2VfcGFpcihtZXNzYWdlX2Rlc2NyaXB0b3IsIG1lc3NhZ2VfY2xhc3MpKTsKKyAgaWYgKCFyZXQuc2Vjb25kKSB7CisgICAgLy8gVXBkYXRlIGNhc2U6IERFQ1JFRiB0aGUgcHJldmlvdXMgdmFsdWUuCisgICAgUHlfREVDUkVGKHJldC5maXJzdC0+c2Vjb25kKTsKKyAgICByZXQuZmlyc3QtPnNlY29uZCA9IG1lc3NhZ2VfY2xhc3M7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK0NNZXNzYWdlQ2xhc3MqIEdldE9yQ3JlYXRlTWVzc2FnZUNsYXNzKFB5TWVzc2FnZUZhY3RvcnkqIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIC8vIFRoaXMgaXMgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYXMgTWVzc2FnZUZhY3RvcnkuR2V0UHJvdG90eXBlKCkuCisKKyAgLy8gRG8gbm90IGNyZWF0ZSBhIE1lc3NhZ2VDbGFzcyB0aGF0IGFscmVhZHkgZXhpc3RzLgorICBzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3QgRGVzY3JpcHRvciosIENNZXNzYWdlQ2xhc3MqPjo6aXRlcmF0b3IgaXQgPQorICAgICAgc2VsZi0+Y2xhc3Nlc19ieV9kZXNjcmlwdG9yLT5maW5kKGRlc2NyaXB0b3IpOworICBpZiAoaXQgIT0gc2VsZi0+Y2xhc3Nlc19ieV9kZXNjcmlwdG9yLT5lbmQoKSkgeworICAgIFB5X0lOQ1JFRihpdC0+c2Vjb25kKTsKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgfQorICBTY29wZWRQeU9iamVjdFB0ciBweV9kZXNjcmlwdG9yKAorICAgICAgUHlNZXNzYWdlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKSk7CisgIGlmIChweV9kZXNjcmlwdG9yID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICAvLyBDcmVhdGUgYSBuZXcgbWVzc2FnZSBjbGFzcy4KKyAgU2NvcGVkUHlPYmplY3RQdHIgYXJncyhQeV9CdWlsZFZhbHVlKAorICAgICAgInMoKXtzT3NPc099IiwgZGVzY3JpcHRvci0+bmFtZSgpLmNfc3RyKCksCisgICAgICAiREVTQ1JJUFRPUiIsIHB5X2Rlc2NyaXB0b3IuZ2V0KCksCisgICAgICAiX19tb2R1bGVfXyIsIFB5X05vbmUsCisgICAgICAibWVzc2FnZV9mYWN0b3J5Iiwgc2VsZikpOworICBpZiAoYXJncyA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgU2NvcGVkUHlPYmplY3RQdHIgbWVzc2FnZV9jbGFzcyhQeU9iamVjdF9DYWxsT2JqZWN0KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KENNZXNzYWdlQ2xhc3NfVHlwZSksIGFyZ3MuZ2V0KCkpKTsKKyAgaWYgKG1lc3NhZ2VfY2xhc3MgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIC8vIENyZWF0ZSBtZXNzYWdlcyBjbGFzcyBmb3IgdGhlIG1lc3NhZ2VzIHVzZWQgYnkgdGhlIGZpZWxkcywgYW5kIHJlZ2lzdGVycworICAvLyBhbGwgZXh0ZW5zaW9ucyBmb3IgdGhlc2UgbWVzc2FnZXMgZHVyaW5nIHRoZSByZWN1cnNpb24uCisgIGZvciAoaW50IGZpZWxkX2lkeCA9IDA7IGZpZWxkX2lkeCA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGZpZWxkX2lkeCsrKSB7CisgICAgY29uc3QgRGVzY3JpcHRvciogc3ViX2Rlc2NyaXB0b3IgPQorICAgICAgICBkZXNjcmlwdG9yLT5maWVsZChmaWVsZF9pZHgpLT5tZXNzYWdlX3R5cGUoKTsKKyAgICAvLyBJdCBpcyBudWxsIGlmIHRoZSBmaWVsZCB0eXBlIGlzIG5vdCBhIG1lc3NhZ2UuCisgICAgaWYgKHN1Yl9kZXNjcmlwdG9yICE9IG51bGxwdHIpIHsKKyAgICAgIENNZXNzYWdlQ2xhc3MqIHJlc3VsdCA9IEdldE9yQ3JlYXRlTWVzc2FnZUNsYXNzKHNlbGYsIHN1Yl9kZXNjcmlwdG9yKTsKKyAgICAgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKyAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIH0KKyAgfQorCisgIC8vIFJlZ2lzdGVyIGV4dGVuc2lvbnMgZGVmaW5lZCBpbiB0aGlzIG1lc3NhZ2UuCisgIGZvciAoaW50IGV4dF9pZHggPSAwIDsgZXh0X2lkeCA8IGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9jb3VudCgpIDsgZXh0X2lkeCsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24gPSBkZXNjcmlwdG9yLT5leHRlbnNpb24oZXh0X2lkeCk7CisgICAgU2NvcGVkUHlPYmplY3RQdHIgcHlfZXh0ZW5kZWRfY2xhc3MoCisgICAgICAgIEdldE9yQ3JlYXRlTWVzc2FnZUNsYXNzKHNlbGYsIGV4dGVuc2lvbi0+Y29udGFpbmluZ190eXBlKCkpCisgICAgICAgICAgICAtPkFzUHlPYmplY3QoKSk7CisgICAgaWYgKHB5X2V4dGVuZGVkX2NsYXNzID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBTY29wZWRQeU9iamVjdFB0ciBweV9leHRlbnNpb24oUHlGaWVsZERlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoZXh0ZW5zaW9uKSk7CisgICAgaWYgKHB5X2V4dGVuc2lvbiA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgU2NvcGVkUHlPYmplY3RQdHIgcmVzdWx0KGNtZXNzYWdlOjpSZWdpc3RlckV4dGVuc2lvbigKKyAgICAgICAgcHlfZXh0ZW5kZWRfY2xhc3MuZ2V0KCksIHB5X2V4dGVuc2lvbi5nZXQoKSkpOworICAgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICB9CisgIHJldHVybiByZWludGVycHJldF9jYXN0PENNZXNzYWdlQ2xhc3MqPihtZXNzYWdlX2NsYXNzLnJlbGVhc2UoKSk7Cit9CisKKy8vIFJldHJpZXZlIHRoZSBtZXNzYWdlIGNsYXNzIGFkZGVkIHRvIG91ciBkYXRhYmFzZS4KK0NNZXNzYWdlQ2xhc3MqIEdldE1lc3NhZ2VDbGFzcyhQeU1lc3NhZ2VGYWN0b3J5KiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfZGVzY3JpcHRvcikgeworICB0eXBlZGVmIFB5TWVzc2FnZUZhY3Rvcnk6OkNsYXNzZXNCeU1lc3NhZ2VNYXA6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICBpdGVyYXRvciByZXQgPSBzZWxmLT5jbGFzc2VzX2J5X2Rlc2NyaXB0b3ItPmZpbmQobWVzc2FnZV9kZXNjcmlwdG9yKTsKKyAgaWYgKHJldCA9PSBzZWxmLT5jbGFzc2VzX2J5X2Rlc2NyaXB0b3ItPmVuZCgpKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIk5vIG1lc3NhZ2UgY2xhc3MgcmVnaXN0ZXJlZCBmb3IgJyVzJyIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJldC0+c2Vjb25kOworICB9Cit9CisKK3N0YXRpYyBQeU1ldGhvZERlZiBNZXRob2RzW10gPSB7CisgICAge251bGxwdHJ9LAorfTsKKworc3RhdGljIFB5T2JqZWN0KiBHZXRQb29sKFB5TWVzc2FnZUZhY3RvcnkqIHNlbGYsIHZvaWQqIGNsb3N1cmUpIHsKKyAgUHlfSU5DUkVGKHNlbGYtPnBvb2wpOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYtPnBvb2wpOworfQorCitzdGF0aWMgUHlHZXRTZXREZWYgR2V0dGVyc1tdID0geworICAgIHsicG9vbCIsIChnZXR0ZXIpR2V0UG9vbCwgbnVsbHB0ciwgIkRlc2NyaXB0b3JQb29sIn0sCisgICAge251bGxwdHJ9LAorfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lc3NhZ2VfZmFjdG9yeQorCitQeVR5cGVPYmplY3QgUHlNZXNzYWdlRmFjdG9yeV9UeXBlID0geworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApIEZVTExfTU9EVUxFX05BTUUKKyAgICAiLk1lc3NhZ2VGYWN0b3J5IiwgICAgICAgICAvLyB0cF9uYW1lCisgICAgc2l6ZW9mKFB5TWVzc2FnZUZhY3RvcnkpLCAgLy8gdHBfYmFzaWNzaXplCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKKyAgICBtZXNzYWdlX2ZhY3Rvcnk6OkRlYWxsb2MsICAvLyB0cF9kZWFsbG9jCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDgwMDAwCisgICAgbnVsbHB0ciwgIC8vIHRwX3ByaW50CisjZWxzZQorICAgIDAsICAvLyB0cF92ZWN0b3JjYWxsX29mZnNldAorI2VuZGlmCisgICAgbnVsbHB0ciwgIC8vIHRwX2dldGF0dHIKKyAgICBudWxscHRyLCAgLy8gdHBfc2V0YXR0cgorICAgIG51bGxwdHIsICAvLyB0cF9jb21wYXJlCisgICAgbnVsbHB0ciwgIC8vIHRwX3JlcHIKKyAgICBudWxscHRyLCAgLy8gdHBfYXNfbnVtYmVyCisgICAgbnVsbHB0ciwgIC8vIHRwX2FzX3NlcXVlbmNlCisgICAgbnVsbHB0ciwgIC8vIHRwX2FzX21hcHBpbmcKKyAgICBudWxscHRyLCAgLy8gdHBfaGFzaAorICAgIG51bGxwdHIsICAvLyB0cF9jYWxsCisgICAgbnVsbHB0ciwgIC8vIHRwX3N0cgorICAgIG51bGxwdHIsICAvLyB0cF9nZXRhdHRybworICAgIG51bGxwdHIsICAvLyB0cF9zZXRhdHRybworICAgIG51bGxwdHIsICAvLyB0cF9hc19idWZmZXIKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAgLy8gdHBfZmxhZ3MKKyAgICAiQSBzdGF0aWMgTWVzc2FnZSBGYWN0b3J5IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZG9jCisgICAgbWVzc2FnZV9mYWN0b3J5OjpHY1RyYXZlcnNlLCAgLy8gdHBfdHJhdmVyc2UKKyAgICBtZXNzYWdlX2ZhY3Rvcnk6OkdjQ2xlYXIsICAgICAvLyB0cF9jbGVhcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JpY2hjb21wYXJlCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfd2Vha2xpc3RvZmZzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcm5leHQKKyAgICBtZXNzYWdlX2ZhY3Rvcnk6Ok1ldGhvZHMsICAgICAvLyB0cF9tZXRob2RzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbWVtYmVycworICAgIG1lc3NhZ2VfZmFjdG9yeTo6R2V0dGVycywgICAgIC8vIHRwX2dldHNldAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Jhc2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVzY3JfZ2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVzY3Jfc2V0CisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGljdG9mZnNldAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2luaXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hbGxvYworICAgIG1lc3NhZ2VfZmFjdG9yeTo6TmV3LCAgICAgICAgIC8vIHRwX25ldworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgIC8vIHRwX2ZyZWUKK307CisKK2Jvb2wgSW5pdE1lc3NhZ2VGYWN0b3J5KCkgeworICBpZiAoUHlUeXBlX1JlYWR5KCZQeU1lc3NhZ2VGYWN0b3J5X1R5cGUpIDwgMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZV9mYWN0b3J5LmggYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2VfZmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmU0MjUKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2VfZmFjdG9yeS5oCkBAIC0wLDAgKzEsMTA0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9NRVNTQUdFX0ZBQ1RPUllfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX01FU1NBR0VfRkFDVE9SWV9IX18KKworI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCisjaW5jbHVkZSA8UHl0aG9uLmg+CisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfcG9vbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CitjbGFzcyBNZXNzYWdlRmFjdG9yeTsKKworbmFtZXNwYWNlIHB5dGhvbiB7CisKKy8vIFRoZSAobWV0YSkgdHlwZSBvZiBhbGwgTWVzc2FnZXMgY2xhc3Nlcy4KK3N0cnVjdCBDTWVzc2FnZUNsYXNzOworCitzdHJ1Y3QgUHlNZXNzYWdlRmFjdG9yeSB7CisgIFB5T2JqZWN0X0hFQUQKKworICAvLyBEeW5hbWljTWVzc2FnZUZhY3RvcnkgdXNlZCB0byBjcmVhdGUgQysrIGluc3RhbmNlcyBvZiBtZXNzYWdlcy4KKyAgLy8gVGhpcyBvYmplY3QgY2FjaGUgdGhlIGRlc2NyaXB0b3JzIHRoYXQgd2VyZSB1c2VkLCBzbyB0aGUgRGVzY3JpcHRvclBvb2wKKyAgLy8gbmVlZHMgdG8gZ2V0IHJpZCBvZiBpdCBiZWZvcmUgaXQgY2FuIGRlbGV0ZSBpdHNlbGYuCisgIC8vCisgIC8vIE5vdGU6IEEgQysrIE1lc3NhZ2VGYWN0b3J5IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBQeU1lc3NhZ2VGYWN0b3J5LgorICAvLyBUaGUgQysrIG9uZSBjcmVhdGVzIG1lc3NhZ2VzLCB3aGVuIHRoZSBQeXRob24gb25lIGNyZWF0ZXMgY2xhc3Nlcy4KKyAgTWVzc2FnZUZhY3RvcnkqIG1lc3NhZ2VfZmFjdG9yeTsKKworICAvLyBPd25lZCByZWZlcmVuY2UgdG8gYSBQeXRob24gRGVzY3JpcHRvclBvb2wuCisgIC8vIFRoaXMgcmVmZXJlbmNlIG11c3Qgc3RheSB1bnRpbCB0aGUgbWVzc2FnZV9mYWN0b3J5IGlzIGRlc3RydWN0ZWQuCisgIFB5RGVzY3JpcHRvclBvb2wqIHBvb2w7CisKKyAgLy8gTWFrZSBvdXIgb3duIG1hcHBpbmcgdG8gcmV0cmlldmUgUHl0aG9uIGNsYXNzZXMgZnJvbSBDKysgZGVzY3JpcHRvcnMuCisgIC8vCisgIC8vIERlc2NyaXB0b3IgcG9pbnRlcnMgc3RvcmVkIGhlcmUgYXJlIG93bmVkIGJ5IHRoZSBEZXNjcmlwdG9yUG9vbCBhYm92ZS4KKyAgLy8gUHl0aG9uIHJlZmVyZW5jZXMgdG8gY2xhc3NlcyBhcmUgb3duZWQgYnkgdGhpcyBQeURlc2NyaXB0b3JQb29sLgorICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxjb25zdCBEZXNjcmlwdG9yKiwgQ01lc3NhZ2VDbGFzcyo+CisgICAgICBDbGFzc2VzQnlNZXNzYWdlTWFwOworICBDbGFzc2VzQnlNZXNzYWdlTWFwKiBjbGFzc2VzX2J5X2Rlc2NyaXB0b3I7Cit9OworCitleHRlcm4gUHlUeXBlT2JqZWN0IFB5TWVzc2FnZUZhY3RvcnlfVHlwZTsKKworbmFtZXNwYWNlIG1lc3NhZ2VfZmFjdG9yeSB7CisKKy8vIENyZWF0ZXMgYSBuZXcgTWVzc2FnZUZhY3RvcnkgaW5zdGFuY2UuCitQeU1lc3NhZ2VGYWN0b3J5KiBOZXdNZXNzYWdlRmFjdG9yeShQeVR5cGVPYmplY3QqIHR5cGUsIFB5RGVzY3JpcHRvclBvb2wqIHBvb2wpOworCisvLyBSZWdpc3RlcnMgYSBuZXcgUHl0aG9uIGNsYXNzIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSBkZXNjcmlwdG9yLgorLy8gT24gZXJyb3IsIHJldHVybnMgLTEgd2l0aCBhIFB5dGhvbiBleGNlcHRpb24gc2V0LgoraW50IFJlZ2lzdGVyTWVzc2FnZUNsYXNzKFB5TWVzc2FnZUZhY3RvcnkqIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV9kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIENNZXNzYWdlQ2xhc3MqIG1lc3NhZ2VfY2xhc3MpOworLy8gUmV0cmlldmVzIHRoZSBQeXRob24gY2xhc3MgcmVnaXN0ZXJlZCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGRlc2NyaXB0b3IsIG9yCisvLyBmYWlsIHdpdGggYSBUeXBlRXJyb3IuIFJldHVybnMgYSAqYm9ycm93ZWQqIHJlZmVyZW5jZS4KK0NNZXNzYWdlQ2xhc3MqIEdldE1lc3NhZ2VDbGFzcyhQeU1lc3NhZ2VGYWN0b3J5KiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfZGVzY3JpcHRvcik7CisvLyBSZXRyaWV2ZXMgdGhlIFB5dGhvbiBjbGFzcyByZWdpc3RlcmVkIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgZGVzY3JpcHRvci4KKy8vIFRoZSBjbGFzcyBpcyBjcmVhdGVkIGlmIG5vdCBkb25lIHlldC4gUmV0dXJucyBhICpuZXcqIHJlZmVyZW5jZS4KK0NNZXNzYWdlQ2xhc3MqIEdldE9yQ3JlYXRlTWVzc2FnZUNsYXNzKFB5TWVzc2FnZUZhY3RvcnkqIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX2Rlc2NyaXB0b3IpOworfSAgLy8gbmFtZXNwYWNlIG1lc3NhZ2VfZmFjdG9yeQorCisvLyBJbml0aWFsaXplIG9iamVjdHMgdXNlZCBieSB0aGlzIG1vZHVsZS4KKy8vIE9uIGVycm9yLCByZXR1cm5zIGZhbHNlIHdpdGggYSBQeXRob24gZXhjZXB0aW9uIHNldC4KK2Jvb2wgSW5pdE1lc3NhZ2VGYWN0b3J5KCk7CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX01FU1NBR0VfRkFDVE9SWV9IX18KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZV9tb2R1bGUuY2MgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2VfbW9kdWxlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkM2MxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2VfbW9kdWxlLmNjCkBAIC0wLDAgKzEsMTM0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCisjaW5jbHVkZSA8UHl0aG9uLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9wb29sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZV9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Byb3RvX2FwaS5oPgorCituYW1lc3BhY2UgeworCisvLyBDKysgQVBJLiAgQ2xpZW50cyBnZXQgYXQgdGhpcyB2aWEgcHJvdG9fYXBpLmgKK3N0cnVjdCBBcGlJbXBsZW1lbnRhdGlvbiA6IGdvb2dsZTo6cHJvdG9idWY6OnB5dGhvbjo6UHlQcm90b19BUEkgeworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBHZXRNZXNzYWdlUG9pbnRlcihQeU9iamVjdCogbXNnKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGdvb2dsZTo6cHJvdG9idWY6OnB5dGhvbjo6UHlNZXNzYWdlX0dldE1lc3NhZ2VQb2ludGVyKG1zZyk7CisgIH0KKyAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogR2V0TXV0YWJsZU1lc3NhZ2VQb2ludGVyKFB5T2JqZWN0KiBtc2cpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ29vZ2xlOjpwcm90b2J1Zjo6cHl0aG9uOjpQeU1lc3NhZ2VfR2V0TXV0YWJsZU1lc3NhZ2VQb2ludGVyKG1zZyk7CisgIH0KKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogTWVzc2FnZURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKAorICAgICAgUHlPYmplY3QqIGRlc2MpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ29vZ2xlOjpwcm90b2J1Zjo6cHl0aG9uOjpQeU1lc3NhZ2VEZXNjcmlwdG9yX0FzRGVzY3JpcHRvcihkZXNjKTsKKyAgfQorICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRW51bURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKAorICAgICAgUHlPYmplY3QqIGVudW1fZGVzYykgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBnb29nbGU6OnByb3RvYnVmOjpweXRob246OlB5RW51bURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKGVudW1fZGVzYyk7CisgIH0KKworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbCogR2V0RGVmYXVsdERlc2NyaXB0b3JQb29sKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBnb29nbGU6OnByb3RvYnVmOjpweXRob246OkdldERlZmF1bHREZXNjcmlwdG9yUG9vbCgpLT5wb29sOworICB9CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3RvcnkqIEdldERlZmF1bHRNZXNzYWdlRmFjdG9yeSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ29vZ2xlOjpwcm90b2J1Zjo6cHl0aG9uOjpHZXREZWZhdWx0RGVzY3JpcHRvclBvb2woKQorICAgICAgICAtPnB5X21lc3NhZ2VfZmFjdG9yeS0+bWVzc2FnZV9mYWN0b3J5OworICB9CisgIFB5T2JqZWN0KiBOZXdNZXNzYWdlKGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBweV9tZXNzYWdlX2ZhY3RvcnkpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ29vZ2xlOjpwcm90b2J1Zjo6cHl0aG9uOjpQeU1lc3NhZ2VfTmV3KGRlc2NyaXB0b3IsIHB5X21lc3NhZ2VfZmFjdG9yeSk7CisgIH0KKyAgUHlPYmplY3QqIE5ld01lc3NhZ2VPd25lZEV4dGVybmFsbHkoCisgICAgICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtc2csIFB5T2JqZWN0KiBweV9tZXNzYWdlX2ZhY3RvcnkpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ29vZ2xlOjpwcm90b2J1Zjo6cHl0aG9uOjpQeU1lc3NhZ2VfTmV3TWVzc2FnZU93bmVkRXh0ZXJuYWxseSgKKyAgICAgICAgbXNnLCBweV9tZXNzYWdlX2ZhY3RvcnkpOworICB9CisgIFB5T2JqZWN0KiBEZXNjcmlwdG9yUG9vbF9Gcm9tUG9vbCgKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sKiBwb29sKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGdvb2dsZTo6cHJvdG9idWY6OnB5dGhvbjo6UHlEZXNjcmlwdG9yUG9vbF9Gcm9tUG9vbChwb29sKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK3N0YXRpYyBjb25zdCBjaGFyIG1vZHVsZV9kb2NzdHJpbmdbXSA9CisgICAgInB5dGhvbi1wcm90bzIgaXMgYSBtb2R1bGUgdGhhdCBjYW4gYmUgdXNlZCB0byBlbmhhbmNlIHByb3RvMiBQeXRob24gQVBJXG4iCisgICAgInBlcmZvcm1hbmNlLlxuIgorICAgICJcbiIKKyAgICAiSXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBwcm90b2NvbCBidWZmZXJzIEMrKyByZWZsZWN0aW9uIEFQSSB0aGF0XG4iCisgICAgImltcGxlbWVudHMgdGhlIGJhc2ljIHByb3RvY29sIGJ1ZmZlciBmdW5jdGlvbnMuIjsKKworc3RhdGljIFB5TWV0aG9kRGVmIE1vZHVsZU1ldGhvZHNbXSA9IHsKKyAgICB7IlNldEFsbG93T3ZlcnNpemVQcm90b3MiLAorICAgICAoUHlDRnVuY3Rpb24pZ29vZ2xlOjpwcm90b2J1Zjo6cHl0aG9uOjpjbWVzc2FnZTo6U2V0QWxsb3dPdmVyc2l6ZVByb3RvcywgTUVUSF9PLAorICAgICAiRW5hYmxlL2Rpc2FibGUgb3ZlcnNpemUgcHJvdG8gcGFyc2luZy4ifSwKKyAgICAvLyBETyBOT1QgVVNFOiBGb3IgbWlncmF0aW9uIGFuZCB0ZXN0aW5nIG9ubHkuCisgICAge251bGxwdHIsIG51bGxwdHJ9fTsKKworc3RhdGljIHN0cnVjdCBQeU1vZHVsZURlZiBfbW9kdWxlID0ge1B5TW9kdWxlRGVmX0hFQURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX21lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9kb2NzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlTWV0aG9kcywgLyogbV9tZXRob2RzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cn07CisKK1B5TU9ESU5JVF9GVU5DIFB5SW5pdF9fbWVzc2FnZSgpIHsKKyAgUHlPYmplY3QqIG07CisgIG0gPSBQeU1vZHVsZV9DcmVhdGUoJl9tb2R1bGUpOworICBpZiAobSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBpZiAoIWdvb2dsZTo6cHJvdG9idWY6OnB5dGhvbjo6SW5pdFByb3RvMk1lc3NhZ2VNb2R1bGUobSkpIHsKKyAgICBQeV9ERUNSRUYobSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBBZGRzIHRoZSBDKysgQVBJCisgIGlmIChQeU9iamVjdCogYXBpID0gUHlDYXBzdWxlX05ldygKKyAgICAgICAgICBuZXcgQXBpSW1wbGVtZW50YXRpb24oKSwgZ29vZ2xlOjpwcm90b2J1Zjo6cHl0aG9uOjpQeVByb3RvQVBJQ2Fwc3VsZU5hbWUoKSwKKyAgICAgICAgICBbXShQeU9iamVjdCogbykgeworICAgICAgICAgICAgZGVsZXRlIChBcGlJbXBsZW1lbnRhdGlvbiopUHlDYXBzdWxlX0dldFBvaW50ZXIoCisgICAgICAgICAgICAgICAgbywgZ29vZ2xlOjpwcm90b2J1Zjo6cHl0aG9uOjpQeVByb3RvQVBJQ2Fwc3VsZU5hbWUoKSk7CisgICAgICAgICAgfSkpIHsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInByb3RvX0FQSSIsIGFwaSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICByZXR1cm4gbTsKK30KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHJvdG8yX2FwaV90ZXN0LnByb3RvIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9wcm90bzJfYXBpX3Rlc3QucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkNzhlOAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHJvdG8yX2FwaV90ZXN0LnByb3RvCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jcHAvcHJvdG8xX2FwaV90ZXN0LnByb3RvIjsKKworbWVzc2FnZSBUZXN0TmVzdGVkUHJvdG8xQVBJTWVzc2FnZSB7CisgIG9wdGlvbmFsIGludDMyIGEgPSAxOworICBvcHRpb25hbCBUZXN0TWVzc2FnZS5OZXN0ZWRNZXNzYWdlIGIgPSAyOworfQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob24ucHJvdG8gYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbi5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTUwZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob24ucHJvdG8KQEAgLTAsMCArMSw2OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogdGliZWxsQGdvb2dsZS5jb20gKEpvaGFuIFRpYmVsbCkKKy8vCisvLyBUaGVzZSBtZXNzYWdlIGRlZmluaXRpb25zIGFyZSB1c2VkIHRvIGV4ZXJjaXNlcyBrbm93biBjb3JuZXIgY2FzZXMKKy8vIGluIHRoZSBDKysgaW1wbGVtZW50YXRpb24gb2YgdGhlIFB5dGhvbiBBUEkuCisKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWw7CisKKy8vIFByb3RvcyBvcHRpbWl6ZWQgZm9yIFNQRUVEIHVzZSBhIHN0cmljdCBzdXBlcnNldCBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUKKy8vIG9mIGVxdWl2YWxlbnQgb25lcyBvcHRpbWl6ZWQgZm9yIENPREVfU0laRSwgc28gd2Ugc2hvdWxkIG9wdGltaXplIGFsbCBvdXIKKy8vIHRlc3RzIGZvciBzcGVlZCB1bmxlc3MgZXhwbGljaXRseSB0ZXN0aW5nIGNvZGUgc2l6ZSBvcHRpbWl6YXRpb24uCitvcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7CisKK21lc3NhZ2UgVGVzdEFsbFR5cGVzIHsKKyAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKKyAgICBvcHRpb25hbCBpbnQzMiBiYiA9IDE7CisgICAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2UgY2MgPSAyOworICB9CisKKyAgcmVwZWF0ZWQgTmVzdGVkTWVzc2FnZSByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSA9IDE7CisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgPSAyOworICBvcHRpb25hbCBpbnQzMiBvcHRpb25hbF9pbnQzMiA9IDM7Cit9CisKK21lc3NhZ2UgRm9yZWlnbk1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiBjID0gMTsKKyAgcmVwZWF0ZWQgaW50MzIgZCA9IDI7Cit9CisKK21lc3NhZ2UgVGVzdEFsbEV4dGVuc2lvbnMgeyAgLy8gZXh0ZW5zaW9uIGJlZ2luCisgIGV4dGVuc2lvbnMgMSB0byBtYXg7Cit9ICAvLyBleHRlbnNpb24gZW5kCisKK2V4dGVuZCBUZXN0QWxsRXh0ZW5zaW9ucyB7ICAvLyBleHRlbnNpb24gYmVnaW4KKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uID0gMTsKKyAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uID0gMjsKK30gIC8vIGV4dGVuc2lvbiBlbmQKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lci5jYyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjYzZjgyCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9yZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyLmNjCkBAIC0wLDAgKzEsNTkxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBhbnVyYWFnQGdvb2dsZS5jb20gKEFudXJhYWcgQWdyYXdhbCkKKy8vIEF1dGhvcjogdGliZWxsQGdvb2dsZS5jb20gKEpvaGFuIFRpYmVsbCkKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9yZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9wb29sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZV9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3Njb3BlZF9weW9iamVjdF9wdHIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHB5dGhvbiB7CisKK25hbWVzcGFjZSByZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsZW4oKQorCitzdGF0aWMgUHlfc3NpemVfdCBMZW5ndGgoUHlPYmplY3QqIHBzZWxmKSB7CisgIFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqPihwc2VsZik7CisKKyAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPnBhcmVudC0+bWVzc2FnZTsKKyAgcmV0dXJuIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+RmllbGRTaXplKCptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGFkZCgpCisKK1B5T2JqZWN0KiBBZGQoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLAorICAgICAgICAgICAgICBQeU9iamVjdCoga3dhcmdzKSB7CisgIGlmIChjbWVzc2FnZTo6QXNzdXJlV3JpdGFibGUoc2VsZi0+cGFyZW50KSA9PSAtMSkgcmV0dXJuIG51bGxwdHI7CisgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5wYXJlbnQtPm1lc3NhZ2U7CisKKyAgTWVzc2FnZSogc3ViX21lc3NhZ2UgPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkFkZE1lc3NhZ2UoCisgICAgICBtZXNzYWdlLCBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciwKKyAgICAgIHNlbGYtPmNoaWxkX21lc3NhZ2VfY2xhc3MtPnB5X21lc3NhZ2VfZmFjdG9yeS0+bWVzc2FnZV9mYWN0b3J5KTsKKyAgQ01lc3NhZ2UqIGNtc2cgPSBzZWxmLT5wYXJlbnQtPkJ1aWxkU3ViTWVzc2FnZUZyb21Qb2ludGVyKAorICAgICAgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsIHN1Yl9tZXNzYWdlLCBzZWxmLT5jaGlsZF9tZXNzYWdlX2NsYXNzKTsKKworICBpZiAoY21lc3NhZ2U6OkluaXRBdHRyaWJ1dGVzKGNtc2csIGFyZ3MsIGt3YXJncykgPCAwKSB7CisgICAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5SZW1vdmVMYXN0KG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKKyAgICBQeV9ERUNSRUYoY21zZyk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICByZXR1cm4gY21zZy0+QXNQeU9iamVjdCgpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEFkZE1ldGhvZChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpIHsKKyAgcmV0dXJuIEFkZChyZWludGVycHJldF9jYXN0PFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKj4oc2VsZiksIGFyZ3MsIGt3YXJncyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYXBwZW5kKCkKKworc3RhdGljIFB5T2JqZWN0KiBBZGRNZXNzYWdlKFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogdmFsdWUpIHsKKyAgY21lc3NhZ2U6OkFzc3VyZVdyaXRhYmxlKHNlbGYtPnBhcmVudCk7CisgIFB5T2JqZWN0KiBweV9jbXNnOworICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+cGFyZW50LT5tZXNzYWdlOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBweV9jbXNnID0gQWRkKHNlbGYsIG51bGxwdHIsIG51bGxwdHIpOworICBpZiAocHlfY21zZyA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKKyAgQ01lc3NhZ2UqIGNtc2cgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4ocHlfY21zZyk7CisgIGlmIChTY29wZWRQeU9iamVjdFB0cihjbWVzc2FnZTo6TWVyZ2VGcm9tKGNtc2csIHZhbHVlKSkgPT0gbnVsbHB0cikgeworICAgIHJlZmxlY3Rpb24tPlJlbW92ZUxhc3QobWVzc2FnZSwgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IpOworICAgIFB5X0RFQ1JFRihjbXNnKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gcHlfY21zZzsKK30KKworc3RhdGljIFB5T2JqZWN0KiBBcHBlbmRNZXRob2QoUHlPYmplY3QqIHBzZWxmLCBQeU9iamVjdCogdmFsdWUpIHsKKyAgUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcio+KHBzZWxmKTsKKyAgU2NvcGVkUHlPYmplY3RQdHIgcHlfY21zZyhBZGRNZXNzYWdlKHNlbGYsIHZhbHVlKSk7CisgIGlmIChweV9jbXNnID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5X1JFVFVSTl9OT05FOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGluc2VydCgpCitzdGF0aWMgUHlPYmplY3QqIEluc2VydChQeU9iamVjdCogcHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqPihwc2VsZik7CisKKyAgUHlfc3NpemVfdCBpbmRleDsKKyAgUHlPYmplY3QqIHZhbHVlOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5PIiwgJmluZGV4LCAmdmFsdWUpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBTY29wZWRQeU9iamVjdFB0ciBweV9jbXNnKEFkZE1lc3NhZ2Uoc2VsZiwgdmFsdWUpKTsKKyAgaWYgKHB5X2Ntc2cgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gU3dhcCB0aGUgZWxlbWVudCB0byByaWdodCBwb3NpdGlvbi4KKyAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPnBhcmVudC0+bWVzc2FnZTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0gc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3I7CisgIFB5X3NzaXplX3QgbGVuZ3RoID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKSAtIDE7CisgIFB5X3NzaXplX3QgZW5kX2luZGV4ID0gaW5kZXg7CisgIGlmIChlbmRfaW5kZXggPCAwKSBlbmRfaW5kZXggKz0gbGVuZ3RoOworICBpZiAoZW5kX2luZGV4IDwgMCkgZW5kX2luZGV4ID0gMDsKKyAgZm9yIChQeV9zc2l6ZV90IGkgPSBsZW5ndGg7IGkgPiBlbmRfaW5kZXg7IGktLSkgeworICAgIHJlZmxlY3Rpb24tPlN3YXBFbGVtZW50cyhtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpLCBpIC0gMSk7CisgIH0KKworICBQeV9SRVRVUk5fTk9ORTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBleHRlbmQoKQorCitQeU9iamVjdCogRXh0ZW5kKFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogdmFsdWUpIHsKKyAgY21lc3NhZ2U6OkFzc3VyZVdyaXRhYmxlKHNlbGYtPnBhcmVudCk7CisgIFNjb3BlZFB5T2JqZWN0UHRyIGl0ZXIoUHlPYmplY3RfR2V0SXRlcih2YWx1ZSkpOworICBpZiAoaXRlciA9PSBudWxscHRyKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlZhbHVlIG11c3QgYmUgaXRlcmFibGUiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBTY29wZWRQeU9iamVjdFB0ciBuZXh0OworICB3aGlsZSAoKG5leHQucmVzZXQoUHlJdGVyX05leHQoaXRlci5nZXQoKSkpKSAhPSBudWxscHRyKSB7CisgICAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2sobmV4dC5nZXQoKSwgQ01lc3NhZ2VfVHlwZSkpIHsKKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJOb3QgYSBjbWVzc2FnZSIpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIFNjb3BlZFB5T2JqZWN0UHRyIG5ld19tZXNzYWdlKEFkZChzZWxmLCBudWxscHRyLCBudWxscHRyKSk7CisgICAgaWYgKG5ld19tZXNzYWdlID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBDTWVzc2FnZSogbmV3X2NtZXNzYWdlID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KG5ld19tZXNzYWdlLmdldCgpKTsKKyAgICBpZiAoU2NvcGVkUHlPYmplY3RQdHIoY21lc3NhZ2U6Ok1lcmdlRnJvbShuZXdfY21lc3NhZ2UsIG5leHQuZ2V0KCkpKSA9PQorICAgICAgICBudWxscHRyKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgIH0KKyAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBFeHRlbmRNZXRob2QoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiB2YWx1ZSkgeworICByZXR1cm4gRXh0ZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqPihzZWxmKSwgdmFsdWUpOworfQorCitQeU9iamVjdCogTWVyZ2VGcm9tKFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogb3RoZXIpIHsKKyAgcmV0dXJuIEV4dGVuZChzZWxmLCBvdGhlcik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogTWVyZ2VGcm9tTWV0aG9kKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogb3RoZXIpIHsKKyAgcmV0dXJuIE1lcmdlRnJvbShyZWludGVycHJldF9jYXN0PFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKj4oc2VsZiksIG90aGVyKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayB0aGUgYm91bmRzLgorc3RhdGljIFB5T2JqZWN0KiBHZXRJdGVtKFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLCBQeV9zc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuZ3RoID0gLTEpIHsKKyAgaWYgKGxlbmd0aCA9PSAtMSkgeworICAgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5wYXJlbnQtPm1lc3NhZ2U7CisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgICBsZW5ndGggPSByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKKyAgfQorICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbmRleEVycm9yLCAibGlzdCBpbmRleCAoJXpkKSBvdXQgb2YgcmFuZ2UiLCBpbmRleCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPnBhcmVudC0+bWVzc2FnZTsKKyAgTWVzc2FnZSogc3ViX21lc3NhZ2UgPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UoCisgICAgICBtZXNzYWdlLCBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOworICByZXR1cm4gc2VsZi0+cGFyZW50CisgICAgICAtPkJ1aWxkU3ViTWVzc2FnZUZyb21Qb2ludGVyKHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yLCBzdWJfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Y2hpbGRfbWVzc2FnZV9jbGFzcykKKyAgICAgIC0+QXNQeU9iamVjdCgpOworfQorCitQeU9iamVjdCogU3Vic2NyaXB0KFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogaXRlbSkgeworICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+cGFyZW50LT5tZXNzYWdlOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBQeV9zc2l6ZV90IGxlbmd0aCA9CisgICAgICByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKKworICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgIFB5X3NzaXplX3QgaW5kZXg7CisgICAgaW5kZXggPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgaWYgKGluZGV4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHJldHVybiBudWxscHRyOworICAgIGlmIChpbmRleCA8IDApIGluZGV4ICs9IGxlbmd0aDsKKyAgICByZXR1cm4gR2V0SXRlbShzZWxmLCBpbmRleCwgbGVuZ3RoKTsKKyAgfSBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgUHlfc3NpemVfdCBmcm9tLCB0bywgc3RlcCwgc2xpY2VsZW5ndGgsIGN1ciwgaTsKKyAgICBQeU9iamVjdCogcmVzdWx0OworCisgICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KGl0ZW0sIGxlbmd0aCwgJmZyb20sICZ0bywgJnN0ZXAsICZzbGljZWxlbmd0aCkgPT0KKyAgICAgICAgLTEpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGlmIChzbGljZWxlbmd0aCA8PSAwKSB7CisgICAgICByZXR1cm4gUHlMaXN0X05ldygwKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gUHlMaXN0X05ldyhzbGljZWxlbmd0aCk7CisgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgIGZvciAoY3VyID0gZnJvbSwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICBQeUxpc3RfU0VUX0lURU0ocmVzdWx0LCBpLCBHZXRJdGVtKHNlbGYsIGN1ciwgbGVuZ3RoKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9IGVsc2UgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorfQorCitzdGF0aWMgUHlPYmplY3QqIFN1YnNjcmlwdE1ldGhvZChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIHNsaWNlKSB7CisgIHJldHVybiBTdWJzY3JpcHQocmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcio+KHNlbGYpLCBzbGljZSk7Cit9CisKK2ludCBBc3NpZ25TdWJzY3JpcHQoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBzbGljZSwKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHZhbHVlKSB7CisgIGlmICh2YWx1ZSAhPSBudWxscHRyKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImRvZXMgbm90IHN1cHBvcnQgYXNzaWdubWVudCIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiBjbWVzc2FnZTo6RGVsZXRlUmVwZWF0ZWRGaWVsZChzZWxmLT5wYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciwgc2xpY2UpOworfQorCitzdGF0aWMgaW50IEFzc2lnblN1YnNjcmlwdE1ldGhvZChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIHNsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHZhbHVlKSB7CisgIHJldHVybiBBc3NpZ25TdWJzY3JpcHQocmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcio+KHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogUmVtb3ZlKFB5T2JqZWN0KiBwc2VsZiwgUHlPYmplY3QqIHZhbHVlKSB7CisgIFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqPihwc2VsZik7CisgIFB5X3NzaXplX3QgbGVuID0gTGVuZ3RoKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKSk7CisKKyAgZm9yIChQeV9zc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBTY29wZWRQeU9iamVjdFB0ciBpdGVtKEdldEl0ZW0oc2VsZiwgaSwgbGVuKSk7CisgICAgaWYgKGl0ZW0gPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGludCByZXN1bHQgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbS5nZXQoKSwgdmFsdWUsIFB5X0VRKTsKKyAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChyZXN1bHQpIHsKKyAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIHB5X2luZGV4KFB5TG9uZ19Gcm9tU3NpemVfdChpKSk7CisgICAgICBpZiAoQXNzaWduU3Vic2NyaXB0KHNlbGYsIHB5X2luZGV4LmdldCgpLCBudWxscHRyKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CisgIH0KKyAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJdGVtIHRvIGRlbGV0ZSBub3QgaW4gbGlzdCIpOworICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RhdGljIFB5T2JqZWN0KiBSaWNoQ29tcGFyZShQeU9iamVjdCogcHNlbGYsIFB5T2JqZWN0KiBvdGhlciwgaW50IG9waWQpIHsKKyAgUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcio+KHBzZWxmKTsKKworICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhvdGhlciwgJlJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyX1R5cGUpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkNhbiBvbmx5IGNvbXBhcmUgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcyAiCisgICAgICAgICAgICAgICAgICAgICJhZ2FpbnN0IG90aGVyIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZHMuIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKG9waWQgPT0gUHlfRVEgfHwgb3BpZCA9PSBQeV9ORSkgeworICAgIC8vIFRPRE8oYW51cmFhZyk6IERvbid0IG1ha2UgbmV3IGxpc3RzIGp1c3QgZm9yIHRoaXMuLi4KKyAgICBTY29wZWRQeU9iamVjdFB0ciBmdWxsX3NsaWNlKFB5U2xpY2VfTmV3KG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKTsKKyAgICBpZiAoZnVsbF9zbGljZSA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgU2NvcGVkUHlPYmplY3RQdHIgbGlzdChTdWJzY3JpcHQoc2VsZiwgZnVsbF9zbGljZS5nZXQoKSkpOworICAgIGlmIChsaXN0ID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBTY29wZWRQeU9iamVjdFB0ciBvdGhlcl9saXN0KAorICAgICAgICBTdWJzY3JpcHQocmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcio+KG90aGVyKSwKKyAgICAgICAgICAgICAgICAgIGZ1bGxfc2xpY2UuZ2V0KCkpKTsKKyAgICBpZiAob3RoZXJfbGlzdCA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlKGxpc3QuZ2V0KCksIG90aGVyX2xpc3QuZ2V0KCksIG9waWQpOworICB9IGVsc2UgeworICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICB9Cit9CisKK3N0YXRpYyBQeU9iamVjdCogVG9TdHIoUHlPYmplY3QqIHBzZWxmKSB7CisgIFNjb3BlZFB5T2JqZWN0UHRyIGZ1bGxfc2xpY2UoUHlTbGljZV9OZXcobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpOworICBpZiAoZnVsbF9zbGljZSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgU2NvcGVkUHlPYmplY3RQdHIgbGlzdChTdWJzY3JpcHQoCisgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKj4ocHNlbGYpLCBmdWxsX3NsaWNlLmdldCgpKSk7CisgIGlmIChsaXN0ID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gUHlPYmplY3RfUmVwcihsaXN0LmdldCgpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzb3J0KCkKKworc3RhdGljIHZvaWQgUmVvcmRlckF0dGFjaGVkKFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBjaGlsZF9saXN0KSB7CisgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5wYXJlbnQtPm1lc3NhZ2U7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yOworICBjb25zdCBQeV9zc2l6ZV90IGxlbmd0aCA9IExlbmd0aChyZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZikpOworCisgIC8vIFdlIG5lZWQgdG8gcmVhcnJhbmdlIHRoaW5ncyB0byBtYXRjaCBweXRob24ncyBzb3J0IG9yZGVyLgorICBmb3IgKFB5X3NzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgIHJlZmxlY3Rpb24tPlVuc2FmZUFyZW5hUmVsZWFzZUxhc3QobWVzc2FnZSwgZGVzY3JpcHRvcik7CisgIH0KKyAgZm9yIChQeV9zc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBNZXNzYWdlKiBjaGlsZF9tZXNzYWdlID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KFB5TGlzdF9HRVRfSVRFTShjaGlsZF9saXN0LCBpKSktPm1lc3NhZ2U7CisgICAgcmVmbGVjdGlvbi0+VW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWRNZXNzYWdlKG1lc3NhZ2UsIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX21lc3NhZ2UpOworICB9Cit9CisKKy8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsOyByZXR1cm5zIC0xIGFuZCBzZXRzIGFuIGV4Y2VwdGlvbiBpZgorLy8gdW5zdWNjZXNzZnVsLgorc3RhdGljIGludCBTb3J0UHl0aG9uTWVzc2FnZXMoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIGt3ZHMpIHsKKyAgU2NvcGVkUHlPYmplY3RQdHIgY2hpbGRfbGlzdCgKKyAgICAgIFB5U2VxdWVuY2VfTGlzdChyZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZikpKTsKKyAgaWYgKGNoaWxkX2xpc3QgPT0gbnVsbHB0cikgeworICAgIHJldHVybiAtMTsKKyAgfQorICBTY29wZWRQeU9iamVjdFB0ciBtKFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY2hpbGRfbGlzdC5nZXQoKSwgInNvcnQiKSk7CisgIGlmIChtID09IG51bGxwdHIpIHJldHVybiAtMTsKKyAgaWYgKFNjb3BlZFB5T2JqZWN0UHRyKFB5T2JqZWN0X0NhbGwobS5nZXQoKSwgYXJncywga3dkcykpID09IG51bGxwdHIpCisgICAgcmV0dXJuIC0xOworICBSZW9yZGVyQXR0YWNoZWQoc2VsZiwgY2hpbGRfbGlzdC5nZXQoKSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgUHlPYmplY3QqIFNvcnQoUHlPYmplY3QqIHBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3ZHMpIHsKKyAgUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcio+KHBzZWxmKTsKKworICAvLyBTdXBwb3J0IHRoZSBvbGQgc29ydF9mdW5jdGlvbiBhcmd1bWVudCBmb3IgYmFja3dhcmRzCisgIC8vIGNvbXBhdGliaWxpdHkuCisgIGlmIChrd2RzICE9IG51bGxwdHIpIHsKKyAgICBQeU9iamVjdCogc29ydF9mdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoa3dkcywgInNvcnRfZnVuY3Rpb24iKTsKKyAgICBpZiAoc29ydF9mdW5jICE9IG51bGxwdHIpIHsKKyAgICAgIC8vIE11c3Qgc2V0IGJlZm9yZSBkZWxldGluZyBhcyBzb3J0X2Z1bmMgaXMgYSBib3Jyb3dlZCByZWZlcmVuY2UKKyAgICAgIC8vIGFuZCBrd2RzIG1pZ2h0IGJlIHRoZSBvbmx5IHRoaW5nIGtlZXBpbmcgaXQgYWxpdmUuCisgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhrd2RzLCAiY21wIiwgc29ydF9mdW5jKTsKKyAgICAgIFB5RGljdF9EZWxJdGVtU3RyaW5nKGt3ZHMsICJzb3J0X2Z1bmN0aW9uIik7CisgICAgfQorICB9CisKKyAgaWYgKFNvcnRQeXRob25NZXNzYWdlcyhzZWxmLCBhcmdzLCBrd2RzKSA8IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeV9SRVRVUk5fTk9ORTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZXZlcnNlKCkKKworLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWw7IHJldHVybnMgLTEgYW5kIHNldHMgYW4gZXhjZXB0aW9uIGlmCisvLyB1bnN1Y2Nlc3NmdWwuCitzdGF0aWMgaW50IFJldmVyc2VQeXRob25NZXNzYWdlcyhSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogc2VsZikgeworICBTY29wZWRQeU9iamVjdFB0ciBjaGlsZF9saXN0KAorICAgICAgUHlTZXF1ZW5jZV9MaXN0KHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKSkpOworICBpZiAoY2hpbGRfbGlzdCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChTY29wZWRQeU9iamVjdFB0cigKKyAgICAgICAgICBQeU9iamVjdF9DYWxsTWV0aG9kKGNoaWxkX2xpc3QuZ2V0KCksICJyZXZlcnNlIiwgbnVsbHB0cikpID09IG51bGxwdHIpCisgICAgcmV0dXJuIC0xOworICBSZW9yZGVyQXR0YWNoZWQoc2VsZiwgY2hpbGRfbGlzdC5nZXQoKSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgUHlPYmplY3QqIFJldmVyc2UoUHlPYmplY3QqIHBzZWxmKSB7CisgIFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqPihwc2VsZik7CisKKyAgaWYgKFJldmVyc2VQeXRob25NZXNzYWdlcyhzZWxmKSA8IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeV9SRVRVUk5fTk9ORTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBQeU9iamVjdCogSXRlbShQeU9iamVjdCogcHNlbGYsIFB5X3NzaXplX3QgaW5kZXgpIHsKKyAgUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcio+KHBzZWxmKTsKKyAgcmV0dXJuIEdldEl0ZW0oc2VsZiwgaW5kZXgpOworfQorCitzdGF0aWMgUHlPYmplY3QqIFBvcChQeU9iamVjdCogcHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqPihwc2VsZik7CisKKyAgUHlfc3NpemVfdCBpbmRleCA9IC0xOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuIiwgJmluZGV4KSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFB5X3NzaXplX3QgbGVuZ3RoID0gTGVuZ3RoKHBzZWxmKTsKKyAgaWYgKGluZGV4IDwgMCkgaW5kZXggKz0gbGVuZ3RoOworICBQeU9iamVjdCogaXRlbSA9IEdldEl0ZW0oc2VsZiwgaW5kZXgsIGxlbmd0aCk7CisgIGlmIChpdGVtID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBTY29wZWRQeU9iamVjdFB0ciBweV9pbmRleChQeUxvbmdfRnJvbVNzaXplX3QoaW5kZXgpKTsKKyAgaWYgKEFzc2lnblN1YnNjcmlwdChzZWxmLCBweV9pbmRleC5nZXQoKSwgbnVsbHB0cikgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIGl0ZW07Cit9CisKK1B5T2JqZWN0KiBEZWVwQ29weShQeU9iamVjdCogcHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqPihwc2VsZiktPkRlZXBDb3B5KCk7Cit9CisKKy8vIFRoZSBwcml2YXRlIGNvbnN0cnVjdG9yIG9mIFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyIG9iamVjdHMuCitSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogTmV3Q29udGFpbmVyKAorICAgIENNZXNzYWdlKiBwYXJlbnQsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsCisgICAgQ01lc3NhZ2VDbGFzcyogY2hpbGRfbWVzc2FnZV9jbGFzcykgeworICBpZiAoIUNoZWNrRmllbGRCZWxvbmdzVG9NZXNzYWdlKHBhcmVudF9maWVsZF9kZXNjcmlwdG9yLCBwYXJlbnQtPm1lc3NhZ2UpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogc2VsZiA9CisgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKj4oCisgICAgICAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYygmUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXJfVHlwZSwgMCkpOworICBpZiAoc2VsZiA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBQeV9JTkNSRUYocGFyZW50KTsKKyAgc2VsZi0+cGFyZW50ID0gcGFyZW50OworICBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciA9IHBhcmVudF9maWVsZF9kZXNjcmlwdG9yOworICBQeV9JTkNSRUYoY2hpbGRfbWVzc2FnZV9jbGFzcyk7CisgIHNlbGYtPmNoaWxkX21lc3NhZ2VfY2xhc3MgPSBjaGlsZF9tZXNzYWdlX2NsYXNzOworICByZXR1cm4gc2VsZjsKK30KKworc3RhdGljIHZvaWQgRGVhbGxvYyhQeU9iamVjdCogcHNlbGYpIHsKKyAgUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcio+KHBzZWxmKTsKKyAgc2VsZi0+UmVtb3ZlRnJvbVBhcmVudENhY2hlKCk7CisgIFB5X0NMRUFSKHNlbGYtPmNoaWxkX21lc3NhZ2VfY2xhc3MpOworICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHBzZWxmKTsKK30KKworc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIFNxTWV0aG9kcyA9IHsKKyAgICBMZW5ndGgsICAvKiBzcV9sZW5ndGggKi8KKyAgICBudWxscHRyLCAvKiBzcV9jb25jYXQgKi8KKyAgICBudWxscHRyLCAvKiBzcV9yZXBlYXQgKi8KKyAgICBJdGVtICAgICAvKiBzcV9pdGVtICovCit9OworCitzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBNcE1ldGhvZHMgPSB7CisgICAgTGVuZ3RoLCAgICAgICAgICAgICAgICAvKiBtcF9sZW5ndGggKi8KKyAgICBTdWJzY3JpcHRNZXRob2QsICAgICAgIC8qIG1wX3N1YnNjcmlwdCAqLworICAgIEFzc2lnblN1YnNjcmlwdE1ldGhvZCwgLyogbXBfYXNzX3N1YnNjcmlwdCAqLworfTsKKworc3RhdGljIFB5TWV0aG9kRGVmIE1ldGhvZHNbXSA9IHsKKyAgICB7Il9fZGVlcGNvcHlfXyIsIERlZXBDb3B5LCBNRVRIX1ZBUkFSR1MsICJNYWtlcyBhIGRlZXAgY29weSBvZiB0aGUgY2xhc3MuIn0sCisgICAgeyJhZGQiLCByZWludGVycHJldF9jYXN0PFB5Q0Z1bmN0aW9uPihBZGRNZXRob2QpLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCAiQWRkcyBhbiBvYmplY3QgdG8gdGhlIHJlcGVhdGVkIGNvbnRhaW5lci4ifSwKKyAgICB7ImFwcGVuZCIsIEFwcGVuZE1ldGhvZCwgTUVUSF9PLAorICAgICAiQXBwZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIGVuZCBvZiB0aGUgcmVwZWF0ZWQgY29udGFpbmVyLiJ9LAorICAgIHsiaW5zZXJ0IiwgSW5zZXJ0LCBNRVRIX1ZBUkFSR1MsCisgICAgICJJbnNlcnRzIGEgbWVzc2FnZSBiZWZvcmUgdGhlIHNwZWNpZmllZCBpbmRleC4ifSwKKyAgICB7ImV4dGVuZCIsIEV4dGVuZE1ldGhvZCwgTUVUSF9PLCAiQWRkcyBvYmplY3RzIHRvIHRoZSByZXBlYXRlZCBjb250YWluZXIuIn0sCisgICAgeyJwb3AiLCBQb3AsIE1FVEhfVkFSQVJHUywKKyAgICAgIlJlbW92ZXMgYW4gb2JqZWN0IGZyb20gdGhlIHJlcGVhdGVkIGNvbnRhaW5lciBhbmQgcmV0dXJucyBpdC4ifSwKKyAgICB7InJlbW92ZSIsIFJlbW92ZSwgTUVUSF9PLAorICAgICAiUmVtb3ZlcyBhbiBvYmplY3QgZnJvbSB0aGUgcmVwZWF0ZWQgY29udGFpbmVyLiJ9LAorICAgIHsic29ydCIsIHJlaW50ZXJwcmV0X2Nhc3Q8UHlDRnVuY3Rpb24+KFNvcnQpLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAiU29ydHMgdGhlIHJlcGVhdGVkIGNvbnRhaW5lci4ifSwKKyAgICB7InJldmVyc2UiLCByZWludGVycHJldF9jYXN0PFB5Q0Z1bmN0aW9uPihSZXZlcnNlKSwgTUVUSF9OT0FSR1MsCisgICAgICJSZXZlcnNlcyBlbGVtZW50cyBvcmRlciBvZiB0aGUgcmVwZWF0ZWQgY29udGFpbmVyLiJ9LAorICAgIHsiTWVyZ2VGcm9tIiwgTWVyZ2VGcm9tTWV0aG9kLCBNRVRIX08sCisgICAgICJBZGRzIG9iamVjdHMgdG8gdGhlIHJlcGVhdGVkIGNvbnRhaW5lci4ifSwKKyAgICB7bnVsbHB0ciwgbnVsbHB0cn19OworCit9ICAvLyBuYW1lc3BhY2UgcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lcgorCitQeVR5cGVPYmplY3QgUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXJfVHlwZSA9IHsKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKSBGVUxMX01PRFVMRV9OQU1FCisgICAgIi5SZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciIsICAgICAgICAgIC8vIHRwX25hbWUKKyAgICBzaXplb2YoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIpLCAgICAgLy8gdHBfYmFzaWNzaXplCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVtc2l6ZQorICAgIHJlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXI6OkRlYWxsb2MsICAvLyAgdHBfZGVhbGxvYworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwODAwMDAKKyAgICAwLCAgLy8gIHRwX3ZlY3RvcmNhbGxfb2Zmc2V0CisjZWxzZQorICAgIG51bGxwdHIsICAvLyAgdHBfcHJpbnQKKyNlbmRpZgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9zZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY29tcGFyZQorICAgIHJlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXI6OlRvU3RyLCAgICAgICAgLy8gIHRwX3JlcHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19udW1iZXIKKyAgICAmcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lcjo6U3FNZXRob2RzLCAgIC8vICB0cF9hc19zZXF1ZW5jZQorICAgICZyZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyOjpNcE1ldGhvZHMsICAgLy8gIHRwX2FzX21hcHBpbmcKKyAgICBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQsICAgICAgICAgICAgICAgIC8vICB0cF9oYXNoCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY2FsbAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3N0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cm8KKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19idWZmZXIKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9mbGFncworICAgICJBIFJlcGVhdGVkIHNjYWxhciBjb250YWluZXIiLCAgICAgICAgICAgICAgLy8gIHRwX2RvYworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3RyYXZlcnNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY2xlYXIKKyAgICByZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyOjpSaWNoQ29tcGFyZSwgIC8vICB0cF9yaWNoY29tcGFyZQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3dlYWtsaXN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2l0ZXJuZXh0CisgICAgcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lcjo6TWV0aG9kcywgICAgICAvLyAgdHBfbWV0aG9kcworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX21lbWJlcnMKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9iYXNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGljdAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX2dldAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX3NldAorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3RvZmZzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pbml0Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lci5oIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9yZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhNmUxNwotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lci5oCkBAIC0wLDAgKzEsMTA5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBhbnVyYWFnQGdvb2dsZS5jb20gKEFudXJhYWcgQWdyYXdhbCkKKy8vIEF1dGhvcjogdGliZWxsQGdvb2dsZS5jb20gKEpvaGFuIFRpYmVsbCkKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9SRVBFQVRFRF9DT01QT1NJVEVfQ09OVEFJTkVSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9SRVBFQVRFRF9DT01QT1NJVEVfQ09OVEFJTkVSX0hfXworCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgRmllbGREZXNjcmlwdG9yOworY2xhc3MgTWVzc2FnZTsKKworbmFtZXNwYWNlIHB5dGhvbiB7CisKK3N0cnVjdCBDTWVzc2FnZUNsYXNzOworCisvLyBBIFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyIGFsd2F5cyBoYXMgYSBwYXJlbnQgbWVzc2FnZS4KKy8vIFRoZSBwYXJlbnQgbWVzc2FnZSBhbHNvIGNhY2hlcyByZWZlcmVuY2UgdG8gaXRlbXMgb2YgdGhlIGNvbnRhaW5lci4KK3R5cGVkZWYgc3RydWN0IFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyIDogcHVibGljIENvbnRhaW5lckJhc2UgeworICAvLyBUaGUgdHlwZSB1c2VkIHRvIGNyZWF0ZSBuZXcgY2hpbGQgbWVzc2FnZXMuCisgIENNZXNzYWdlQ2xhc3MqIGNoaWxkX21lc3NhZ2VfY2xhc3M7Cit9IFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyOworCitleHRlcm4gUHlUeXBlT2JqZWN0IFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyX1R5cGU7CisKK25hbWVzcGFjZSByZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyIHsKKworLy8gQnVpbGRzIGEgUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIgb2JqZWN0LCBmcm9tIGEgcGFyZW50IG1lc3NhZ2UgYW5kIGEKKy8vIGZpZWxkIGRlc2NyaXB0b3IuCitSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogTmV3Q29udGFpbmVyKAorICAgIENNZXNzYWdlKiBwYXJlbnQsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBwYXJlbnRfZmllbGRfZGVzY3JpcHRvciwKKyAgICBDTWVzc2FnZUNsYXNzICpjaGlsZF9tZXNzYWdlX2NsYXNzKTsKKworLy8gQXBwZW5kcyBhIG5ldyBDTWVzc2FnZSB0byB0aGUgY29udGFpbmVyIGFuZCByZXR1cm5zIGl0LiAgVGhlCisvLyBDTWVzc2FnZSBpcyBpbml0aWFsaXplZCB1c2luZyB0aGUgY29udGVudCBvZiBrd2FyZ3MuCisvLworLy8gUmV0dXJucyBhIG5ldyByZWZlcmVuY2UgaWYgc3VjY2Vzc2Z1bDsgcmV0dXJucyBOVUxMIGFuZCBzZXRzIGFuCisvLyBleGNlcHRpb24gaWYgdW5zdWNjZXNzZnVsLgorUHlPYmplY3QqIEFkZChSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogc2VsZiwKKyAgICAgICAgICAgICAgUHlPYmplY3QqIGFyZ3MsCisgICAgICAgICAgICAgIFB5T2JqZWN0KiBrd2FyZ3MpOworCisvLyBBcHBlbmRzIGFsbCB0aGUgQ01lc3NhZ2VzIGluIHRoZSBpbnB1dCBpdGVyYXRvciB0byB0aGUgY29udGFpbmVyLgorLy8KKy8vIFJldHVybnMgTm9uZSBpZiBzdWNjZXNzZnVsOyByZXR1cm5zIE5VTEwgYW5kIHNldHMgYW4gZXhjZXB0aW9uIGlmCisvLyB1bnN1Y2Nlc3NmdWwuCitQeU9iamVjdCogRXh0ZW5kKFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogdmFsdWUpOworCisvLyBBcHBlbmRzIGEgbmV3IG1lc3NhZ2UgdG8gdGhlIGNvbnRhaW5lciBmb3IgZWFjaCBtZXNzYWdlIGluIHRoZQorLy8gaW5wdXQgaXRlcmF0b3IsIG1lcmdpbmcgZWFjaCBkYXRhIGVsZW1lbnQgaW4uIEVxdWl2YWxlbnQgdG8gZXh0ZW5kLgorLy8KKy8vIFJldHVybnMgTm9uZSBpZiBzdWNjZXNzZnVsOyByZXR1cm5zIE5VTEwgYW5kIHNldHMgYW4gZXhjZXB0aW9uIGlmCisvLyB1bnN1Y2Nlc3NmdWwuCitQeU9iamVjdCogTWVyZ2VGcm9tKFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogb3RoZXIpOworCisvLyBBY2Nlc3NlcyBtZXNzYWdlcyBpbiB0aGUgY29udGFpbmVyLgorLy8KKy8vIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBtZXNzYWdlIGZvciBhbiBpbnRlZ2VyIHBhcmFtZXRlci4KKy8vIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlIHRvIGEgbGlzdCBvZiBtZXNzYWdlcyBmb3IgYSBzbGljZS4KK1B5T2JqZWN0KiBTdWJzY3JpcHQoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBzbGljZSk7CisKKy8vIERlbGV0ZXMgaXRlbXMgZnJvbSB0aGUgY29udGFpbmVyIChjYW5ub3QgYmUgdXNlZCBmb3IgYXNzaWdubWVudCkuCisvLworLy8gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCitpbnQgQXNzaWduU3Vic2NyaXB0KFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLAorICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogc2xpY2UsCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiB2YWx1ZSk7Cit9ICAvLyBuYW1lc3BhY2UgcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lcgorfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfUkVQRUFURURfQ09NUE9TSVRFX0NPTlRBSU5FUl9IX18KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfc2NhbGFyX2NvbnRhaW5lci5jYyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfc2NhbGFyX2NvbnRhaW5lci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGE4ZGYyCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9yZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyLmNjCkBAIC0wLDAgKzEsNzc0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBhbnVyYWFnQGdvb2dsZS5jb20gKEFudXJhYWcgQWdyYXdhbCkKKy8vIEF1dGhvcjogdGliZWxsQGdvb2dsZS5jb20gKEpvaGFuIFRpYmVsbCkKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9yZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyLmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9wb29sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvc2NvcGVkX3B5b2JqZWN0X3B0ci5oPgorCisjZGVmaW5lIFB5U3RyaW5nX0FzU3RyaW5nKG9iKSBcCisgIChQeVVuaWNvZGVfQ2hlY2sob2IpID8gUHlVbmljb2RlX0FzVVRGOChvYikgOiBQeUJ5dGVzX0FzU3RyaW5nKG9iKSkKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHB5dGhvbiB7CisKK25hbWVzcGFjZSByZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyIHsKKworc3RhdGljIGludCBJbnRlcm5hbEFzc2lnblJlcGVhdGVkRmllbGQoUmVwZWF0ZWRTY2FsYXJDb250YWluZXIqIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogbGlzdCkgeworICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+cGFyZW50LT5tZXNzYWdlOworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkNsZWFyRmllbGQobWVzc2FnZSwgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IpOworICBmb3IgKFB5X3NzaXplX3QgaSA9IDA7IGkgPCBQeUxpc3RfR0VUX1NJWkUobGlzdCk7ICsraSkgeworICAgIFB5T2JqZWN0KiB2YWx1ZSA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKKyAgICBpZiAoU2NvcGVkUHlPYmplY3RQdHIoQXBwZW5kKHNlbGYsIHZhbHVlKSkgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIFB5X3NzaXplX3QgTGVuKFB5T2JqZWN0KiBwc2VsZikgeworICBSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogc2VsZiA9CisgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKj4ocHNlbGYpOworICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+cGFyZW50LT5tZXNzYWdlOworICByZXR1cm4gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5GaWVsZFNpemUoKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBpbnQgQXNzaWduSXRlbShQeU9iamVjdCogcHNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIFB5T2JqZWN0KiBhcmcpIHsKKyAgUmVwZWF0ZWRTY2FsYXJDb250YWluZXIqIHNlbGYgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZFNjYWxhckNvbnRhaW5lcio+KHBzZWxmKTsKKworICBjbWVzc2FnZTo6QXNzdXJlV3JpdGFibGUoc2VsZi0+cGFyZW50KTsKKyAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPnBhcmVudC0+bWVzc2FnZTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0gc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3I7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgaW50IGZpZWxkX3NpemUgPSByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICBpZiAoaW5kZXggPCAwKSB7CisgICAgaW5kZXggPSBmaWVsZF9zaXplICsgaW5kZXg7CisgIH0KKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBmaWVsZF9zaXplKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0luZGV4RXJyb3IsICJsaXN0IGFzc2lnbm1lbnQgaW5kZXggKCVkKSBvdXQgb2YgcmFuZ2UiLAorICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGluZGV4KSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKGFyZyA9PSBudWxscHRyKSB7CisgICAgU2NvcGVkUHlPYmplY3RQdHIgcHlfaW5kZXgoUHlMb25nX0Zyb21Mb25nKGluZGV4KSk7CisgICAgcmV0dXJuIGNtZXNzYWdlOjpEZWxldGVSZXBlYXRlZEZpZWxkKHNlbGYtPnBhcmVudCwgZmllbGRfZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlfaW5kZXguZ2V0KCkpOworICB9CisKKyAgaWYgKFB5U2VxdWVuY2VfQ2hlY2soYXJnKSAmJiAhKFB5Qnl0ZXNfQ2hlY2soYXJnKSB8fCBQeVVuaWNvZGVfQ2hlY2soYXJnKSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVmFsdWUgbXVzdCBiZSBzY2FsYXIiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBzd2l0Y2ggKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9JTlQzMihhcmcsIHZhbHVlLCAtMSk7CisgICAgICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEludDMyKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4LCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UNjQoYXJnLCB2YWx1ZSwgLTEpOworICAgICAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRJbnQ2NChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9VSU5UMzIoYXJnLCB2YWx1ZSwgLTEpOworICAgICAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfVUlOVDY0KGFyZywgdmFsdWUsIC0xKTsKKyAgICAgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4LCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfRkxPQVQoYXJnLCB2YWx1ZSwgLTEpOworICAgICAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRGbG9hdChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRTogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9ET1VCTEUoYXJnLCB2YWx1ZSwgLTEpOworICAgICAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWREb3VibGUobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0JPT0woYXJnLCB2YWx1ZSwgLTEpOworICAgICAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRCb29sKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4LCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICBpZiAoIUNoZWNrQW5kU2V0U3RyaW5nKGFyZywgbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgcmVmbGVjdGlvbiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9JTlQzMihhcmcsIHZhbHVlLCAtMSk7CisgICAgICBpZiAocmVmbGVjdGlvbi0+U3VwcG9ydHNVbmtub3duRW51bVZhbHVlcygpKSB7CisgICAgICAgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRW51bVZhbHVlKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yID0gZmllbGRfZGVzY3JpcHRvci0+ZW51bV90eXBlKCk7CisgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUgPQorICAgICAgICAgICAgZW51bV9kZXNjcmlwdG9yLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7CisgICAgICAgIGlmIChlbnVtX3ZhbHVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1fdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIHMoUHlPYmplY3RfU3RyKGFyZykpOworICAgICAgICAgIGlmIChzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiVW5rbm93biBlbnVtIHZhbHVlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcocy5nZXQoKSkpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICJBZGRpbmcgdmFsdWUgdG8gYSBmaWVsZCBvZiB1bmtub3duIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpOworICAgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgUHlPYmplY3QqIEl0ZW0oUHlPYmplY3QqIHBzZWxmLCBQeV9zc2l6ZV90IGluZGV4KSB7CisgIFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBzZWxmID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRTY2FsYXJDb250YWluZXIqPihwc2VsZik7CisKKyAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPnBhcmVudC0+bWVzc2FnZTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0gc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3I7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgaW50IGZpZWxkX3NpemUgPSByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICBpZiAoaW5kZXggPCAwKSB7CisgICAgaW5kZXggPSBmaWVsZF9zaXplICsgaW5kZXg7CisgIH0KKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBmaWVsZF9zaXplKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0luZGV4RXJyb3IsICJsaXN0IGluZGV4ICglemQpIG91dCBvZiByYW5nZSIsIGluZGV4KTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5T2JqZWN0KiByZXN1bHQgPSBudWxscHRyOworICBzd2l0Y2ggKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjogeworICAgICAgaW50MzJfdCB2YWx1ZSA9CisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMigqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOworICAgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21Mb25nKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDogeworICAgICAgaW50NjRfdCB2YWx1ZSA9CisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOworICAgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7CisgICAgICB1aW50MzJfdCB2YWx1ZSA9CisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4KTsKKyAgICAgIHJlc3VsdCA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDogeworICAgICAgdWludDY0X3QgdmFsdWUgPQorICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7CisgICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CisgICAgICBmbG9hdCB2YWx1ZSA9CisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRGbG9hdCgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOworICAgICAgcmVzdWx0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKKyAgICAgIGRvdWJsZSB2YWx1ZSA9CisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWREb3VibGUoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4KTsKKyAgICAgIHJlc3VsdCA9IFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogeworICAgICAgYm9vbCB2YWx1ZSA9CisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRCb29sKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7CisgICAgICByZXN1bHQgPSBQeUJvb2xfRnJvbUxvbmcodmFsdWUgPyAxIDogMCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogeworICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9CisgICAgICAgICAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRSZXBlYXRlZEVudW0oKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21Mb25nKGVudW1fdmFsdWUtPm51bWJlcigpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKKyAgICAgIHN0ZDo6c3RyaW5nIHNjcmF0Y2g7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKKyAgICAgICAgICAqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgsICZzY3JhdGNoKTsKKyAgICAgIHJlc3VsdCA9IFRvU3RyaW5nT2JqZWN0KGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICJHZXR0aW5nIHZhbHVlIGZyb20gYSByZXBlYXRlZCBmaWVsZCBvZiB1bmtub3duIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFB5T2JqZWN0KiBTdWJzY3JpcHQoUHlPYmplY3QqIHBzZWxmLCBQeU9iamVjdCogc2xpY2UpIHsKKyAgUHlfc3NpemVfdCBmcm9tOworICBQeV9zc2l6ZV90IHRvOworICBQeV9zc2l6ZV90IHN0ZXA7CisgIFB5X3NzaXplX3QgbGVuZ3RoOworICBQeV9zc2l6ZV90IHNsaWNlbGVuZ3RoOworICBib29sIHJldHVybl9saXN0ID0gZmFsc2U7CisgIGlmIChQeUxvbmdfQ2hlY2soc2xpY2UpKSB7CisgICAgZnJvbSA9IHRvID0gUHlMb25nX0FzTG9uZyhzbGljZSk7CisgIH0gZWxzZSBpZiAoUHlJbmRleF9DaGVjayhzbGljZSkpIHsKKyAgICBmcm9tID0gdG8gPSBQeU51bWJlcl9Bc1NzaXplX3Qoc2xpY2UsIFB5RXhjX1ZhbHVlRXJyb3IpOworICAgIGlmIChmcm9tID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgfSBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKHNsaWNlKSkgeworICAgIGxlbmd0aCA9IExlbihwc2VsZik7CisgICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KHNsaWNlLCBsZW5ndGgsICZmcm9tLCAmdG8sICZzdGVwLCAmc2xpY2VsZW5ndGgpID09CisgICAgICAgIC0xKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuX2xpc3QgPSB0cnVlOworICB9IGVsc2UgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgaWYgKCFyZXR1cm5fbGlzdCkgeworICAgIHJldHVybiBJdGVtKHBzZWxmLCBmcm9tKTsKKyAgfQorCisgIFB5T2JqZWN0KiBsaXN0ID0gUHlMaXN0X05ldygwKTsKKyAgaWYgKGxpc3QgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChmcm9tIDw9IHRvKSB7CisgICAgaWYgKHN0ZXAgPCAwKSB7CisgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisgICAgZm9yIChQeV9zc2l6ZV90IGluZGV4ID0gZnJvbTsgaW5kZXggPCB0bzsgaW5kZXggKz0gc3RlcCkgeworICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBTY29wZWRQeU9iamVjdFB0ciBzKEl0ZW0ocHNlbGYsIGluZGV4KSk7CisgICAgICBQeUxpc3RfQXBwZW5kKGxpc3QsIHMuZ2V0KCkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoc3RlcCA+IDApIHsKKyAgICAgIHJldHVybiBsaXN0OworICAgIH0KKyAgICBmb3IgKFB5X3NzaXplX3QgaW5kZXggPSBmcm9tOyBpbmRleCA+IHRvOyBpbmRleCArPSBzdGVwKSB7CisgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIHMoSXRlbShwc2VsZiwgaW5kZXgpKTsKKyAgICAgIFB5TGlzdF9BcHBlbmQobGlzdCwgcy5nZXQoKSk7CisgICAgfQorICB9CisgIHJldHVybiBsaXN0OworfQorCitQeU9iamVjdCogQXBwZW5kKFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogaXRlbSkgeworICBjbWVzc2FnZTo6QXNzdXJlV3JpdGFibGUoc2VsZi0+cGFyZW50KTsKKyAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPnBhcmVudC0+bWVzc2FnZTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0gc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3I7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgc3dpdGNoIChmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UMzIoaXRlbSwgdmFsdWUsIG51bGxwdHIpOworICAgICAgcmVmbGVjdGlvbi0+QWRkSW50MzIobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDY0KGl0ZW0sIHZhbHVlLCBudWxscHRyKTsKKyAgICAgIHJlZmxlY3Rpb24tPkFkZEludDY0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfVUlOVDMyKGl0ZW0sIHZhbHVlLCBudWxscHRyKTsKKyAgICAgIHJlZmxlY3Rpb24tPkFkZFVJbnQzMihtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX1VJTlQ2NChpdGVtLCB2YWx1ZSwgbnVsbHB0cik7CisgICAgICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0ZMT0FUKGl0ZW0sIHZhbHVlLCBudWxscHRyKTsKKyAgICAgIHJlZmxlY3Rpb24tPkFkZEZsb2F0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfRE9VQkxFKGl0ZW0sIHZhbHVlLCBudWxscHRyKTsKKyAgICAgIHJlZmxlY3Rpb24tPkFkZERvdWJsZShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9CT09MKGl0ZW0sIHZhbHVlLCBudWxscHRyKTsKKyAgICAgIHJlZmxlY3Rpb24tPkFkZEJvb2wobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgaWYgKCFDaGVja0FuZFNldFN0cmluZyhpdGVtLCBtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCByZWZsZWN0aW9uLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9JTlQzMihpdGVtLCB2YWx1ZSwgbnVsbHB0cik7CisgICAgICBpZiAocmVmbGVjdGlvbi0+U3VwcG9ydHNVbmtub3duRW51bVZhbHVlcygpKSB7CisgICAgICAgIHJlZmxlY3Rpb24tPkFkZEVudW1WYWx1ZShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yID0gZmllbGRfZGVzY3JpcHRvci0+ZW51bV90eXBlKCk7CisgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUgPQorICAgICAgICAgICAgZW51bV9kZXNjcmlwdG9yLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7CisgICAgICAgIGlmIChlbnVtX3ZhbHVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICByZWZsZWN0aW9uLT5BZGRFbnVtKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGVudW1fdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIHMoUHlPYmplY3RfU3RyKGl0ZW0pKTsKKyAgICAgICAgICBpZiAocyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIlVua25vd24gZW51bSB2YWx1ZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKHMuZ2V0KCkpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICJBZGRpbmcgdmFsdWUgdG8gYSBmaWVsZCBvZiB1bmtub3duIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBBcHBlbmRNZXRob2QoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBpdGVtKSB7CisgIHJldHVybiBBcHBlbmQocmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZFNjYWxhckNvbnRhaW5lcio+KHNlbGYpLCBpdGVtKTsKK30KKworc3RhdGljIGludCBBc3NTdWJzY3JpcHQoUHlPYmplY3QqIHBzZWxmLCBQeU9iamVjdCogc2xpY2UsIFB5T2JqZWN0KiB2YWx1ZSkgeworICBSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogc2VsZiA9CisgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKj4ocHNlbGYpOworCisgIFB5X3NzaXplX3QgZnJvbTsKKyAgUHlfc3NpemVfdCB0bzsKKyAgUHlfc3NpemVfdCBzdGVwOworICBQeV9zc2l6ZV90IGxlbmd0aDsKKyAgUHlfc3NpemVfdCBzbGljZWxlbmd0aDsKKyAgYm9vbCBjcmVhdGVfbGlzdCA9IGZhbHNlOworCisgIGNtZXNzYWdlOjpBc3N1cmVXcml0YWJsZShzZWxmLT5wYXJlbnQpOworICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+cGFyZW50LT5tZXNzYWdlOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPSBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvcjsKKworICBpZiAoUHlMb25nX0NoZWNrKHNsaWNlKSkgeworICAgIGZyb20gPSB0byA9IFB5TG9uZ19Bc0xvbmcoc2xpY2UpOworICB9IGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soc2xpY2UpKSB7CisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgICBsZW5ndGggPSByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeChzbGljZSwgbGVuZ3RoLCAmZnJvbSwgJnRvLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA9PQorICAgICAgICAtMSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjcmVhdGVfbGlzdCA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxpc3QgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHZhbHVlID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gY21lc3NhZ2U6OkRlbGV0ZVJlcGVhdGVkRmllbGQoc2VsZi0+cGFyZW50LCBmaWVsZF9kZXNjcmlwdG9yLCBzbGljZSk7CisgIH0KKworICBpZiAoIWNyZWF0ZV9saXN0KSB7CisgICAgcmV0dXJuIEFzc2lnbkl0ZW0ocHNlbGYsIGZyb20sIHZhbHVlKTsKKyAgfQorCisgIFNjb3BlZFB5T2JqZWN0UHRyIGZ1bGxfc2xpY2UoUHlTbGljZV9OZXcobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpOworICBpZiAoZnVsbF9zbGljZSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIFNjb3BlZFB5T2JqZWN0UHRyIG5ld19saXN0KFN1YnNjcmlwdChwc2VsZiwgZnVsbF9zbGljZS5nZXQoKSkpOworICBpZiAobmV3X2xpc3QgPT0gbnVsbHB0cikgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoUHlTZXF1ZW5jZV9TZXRTbGljZShuZXdfbGlzdC5nZXQoKSwgZnJvbSwgdG8sIHZhbHVlKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4gSW50ZXJuYWxBc3NpZ25SZXBlYXRlZEZpZWxkKHNlbGYsIG5ld19saXN0LmdldCgpKTsKK30KKworUHlPYmplY3QqIEV4dGVuZChSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIHZhbHVlKSB7CisgIGNtZXNzYWdlOjpBc3N1cmVXcml0YWJsZShzZWxmLT5wYXJlbnQpOworCisgIC8vIFRPRE8ocHR1Y2tlcik6IERlcHJlY2F0ZSB0aGlzIGJlaGF2aW9yLiBiLzE4NDEzODYyCisgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7CisgICAgUHlfUkVUVVJOX05PTkU7CisgIH0KKyAgaWYgKChQeV9UWVBFKHZhbHVlKS0+dHBfYXNfc2VxdWVuY2UgPT0gbnVsbHB0cikgJiYgUHlPYmplY3RfTm90KHZhbHVlKSkgeworICAgIFB5X1JFVFVSTl9OT05FOworICB9CisKKyAgU2NvcGVkUHlPYmplY3RQdHIgaXRlcihQeU9iamVjdF9HZXRJdGVyKHZhbHVlKSk7CisgIGlmIChpdGVyID09IG51bGxwdHIpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVmFsdWUgbXVzdCBiZSBpdGVyYWJsZSIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFNjb3BlZFB5T2JqZWN0UHRyIG5leHQ7CisgIHdoaWxlICgobmV4dC5yZXNldChQeUl0ZXJfTmV4dChpdGVyLmdldCgpKSkpICE9IG51bGxwdHIpIHsKKyAgICBpZiAoU2NvcGVkUHlPYmplY3RQdHIoQXBwZW5kKHNlbGYsIG5leHQuZ2V0KCkpKSA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgIH0KKyAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBJbnNlcnQoUHlPYmplY3QqIHBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogc2VsZiA9CisgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKj4ocHNlbGYpOworCisgIFB5X3NzaXplX3QgaW5kZXg7CisgIFB5T2JqZWN0KiB2YWx1ZTsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsTyIsICZpbmRleCwgJnZhbHVlKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFNjb3BlZFB5T2JqZWN0UHRyIGZ1bGxfc2xpY2UoUHlTbGljZV9OZXcobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpOworICBTY29wZWRQeU9iamVjdFB0ciBuZXdfbGlzdChTdWJzY3JpcHQocHNlbGYsIGZ1bGxfc2xpY2UuZ2V0KCkpKTsKKyAgaWYgKFB5TGlzdF9JbnNlcnQobmV3X2xpc3QuZ2V0KCksIGluZGV4LCB2YWx1ZSkgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaW50IHJldCA9IEludGVybmFsQXNzaWduUmVwZWF0ZWRGaWVsZChzZWxmLCBuZXdfbGlzdC5nZXQoKSk7CisgIGlmIChyZXQgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogUmVtb3ZlKFB5T2JqZWN0KiBwc2VsZiwgUHlPYmplY3QqIHZhbHVlKSB7CisgIFB5X3NzaXplX3QgbWF0Y2hfaW5kZXggPSAtMTsKKyAgZm9yIChQeV9zc2l6ZV90IGkgPSAwOyBpIDwgTGVuKHBzZWxmKTsgKytpKSB7CisgICAgU2NvcGVkUHlPYmplY3RQdHIgZWxlbShJdGVtKHBzZWxmLCBpKSk7CisgICAgaWYgKFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChlbGVtLmdldCgpLCB2YWx1ZSwgUHlfRVEpKSB7CisgICAgICBtYXRjaF9pbmRleCA9IGk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKG1hdGNoX2luZGV4ID09IC0xKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJyZW1vdmUoeCk6IHggbm90IGluIGNvbnRhaW5lciIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChBc3NpZ25JdGVtKHBzZWxmLCBtYXRjaF9pbmRleCwgbnVsbHB0cikgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogRXh0ZW5kTWV0aG9kKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogdmFsdWUpIHsKKyAgcmV0dXJuIEV4dGVuZChyZWludGVycHJldF9jYXN0PFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKj4oc2VsZiksIHZhbHVlKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBSaWNoQ29tcGFyZShQeU9iamVjdCogcHNlbGYsIFB5T2JqZWN0KiBvdGhlciwgaW50IG9waWQpIHsKKyAgaWYgKG9waWQgIT0gUHlfRVEgJiYgb3BpZCAhPSBQeV9ORSkgeworICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICB9CisKKyAgLy8gQ29weSB0aGUgY29udGVudHMgb2YgdGhpcyByZXBlYXRlZCBzY2FsYXIgY29udGFpbmVyLCBhbmQgb3RoZXIgaWYgaXQgaXMKKyAgLy8gYWxzbyBhIHJlcGVhdGVkIHNjYWxhciBjb250YWluZXIsIGludG8gUHl0aG9uIGxpc3RzIHNvIHdlIGNhbiBkZWxlZ2F0ZQorICAvLyB0byB0aGUgbGlzdCdzIGNvbXBhcmUgbWV0aG9kLgorCisgIFNjb3BlZFB5T2JqZWN0UHRyIGZ1bGxfc2xpY2UoUHlTbGljZV9OZXcobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpOworICBpZiAoZnVsbF9zbGljZSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBTY29wZWRQeU9iamVjdFB0ciBvdGhlcl9saXN0X2RlbGV0ZXI7CisgIGlmIChQeU9iamVjdF9UeXBlQ2hlY2sob3RoZXIsICZSZXBlYXRlZFNjYWxhckNvbnRhaW5lcl9UeXBlKSkgeworICAgIG90aGVyX2xpc3RfZGVsZXRlci5yZXNldChTdWJzY3JpcHQob3RoZXIsIGZ1bGxfc2xpY2UuZ2V0KCkpKTsKKyAgICBvdGhlciA9IG90aGVyX2xpc3RfZGVsZXRlci5nZXQoKTsKKyAgfQorCisgIFNjb3BlZFB5T2JqZWN0UHRyIGxpc3QoU3Vic2NyaXB0KHBzZWxmLCBmdWxsX3NsaWNlLmdldCgpKSk7CisgIGlmIChsaXN0ID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gUHlPYmplY3RfUmljaENvbXBhcmUobGlzdC5nZXQoKSwgb3RoZXIsIG9waWQpOworfQorCitQeU9iamVjdCogUmVkdWNlKFB5T2JqZWN0KiB1bnVzZWRfc2VsZiwgUHlPYmplY3QqIHVudXNlZF9vdGhlcikgeworICBQeUVycl9Gb3JtYXQoUGlja2xlRXJyb3JfY2xhc3MsCisgICAgICAgICAgICAgICAiY2FuJ3QgcGlja2xlIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGRzLCBjb252ZXJ0IHRvIGxpc3QgZmlyc3QiKTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogU29ydChQeU9iamVjdCogcHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dkcykgeworICAvLyBTdXBwb3J0IHRoZSBvbGQgc29ydF9mdW5jdGlvbiBhcmd1bWVudCBmb3IgYmFja3dhcmRzCisgIC8vIGNvbXBhdGliaWxpdHkuCisgIGlmIChrd2RzICE9IG51bGxwdHIpIHsKKyAgICBQeU9iamVjdCogc29ydF9mdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoa3dkcywgInNvcnRfZnVuY3Rpb24iKTsKKyAgICBpZiAoc29ydF9mdW5jICE9IG51bGxwdHIpIHsKKyAgICAgIC8vIE11c3Qgc2V0IGJlZm9yZSBkZWxldGluZyBhcyBzb3J0X2Z1bmMgaXMgYSBib3Jyb3dlZCByZWZlcmVuY2UKKyAgICAgIC8vIGFuZCBrd2RzIG1pZ2h0IGJlIHRoZSBvbmx5IHRoaW5nIGtlZXBpbmcgaXQgYWxpdmUuCisgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoa3dkcywgImNtcCIsIHNvcnRfZnVuYykgPT0gLTEpIHJldHVybiBudWxscHRyOworICAgICAgaWYgKFB5RGljdF9EZWxJdGVtU3RyaW5nKGt3ZHMsICJzb3J0X2Z1bmN0aW9uIikgPT0gLTEpIHJldHVybiBudWxscHRyOworICAgIH0KKyAgfQorCisgIFNjb3BlZFB5T2JqZWN0UHRyIGZ1bGxfc2xpY2UoUHlTbGljZV9OZXcobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpOworICBpZiAoZnVsbF9zbGljZSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgU2NvcGVkUHlPYmplY3RQdHIgbGlzdChTdWJzY3JpcHQocHNlbGYsIGZ1bGxfc2xpY2UuZ2V0KCkpKTsKKyAgaWYgKGxpc3QgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFNjb3BlZFB5T2JqZWN0UHRyIG0oUHlPYmplY3RfR2V0QXR0clN0cmluZyhsaXN0LmdldCgpLCAic29ydCIpKTsKKyAgaWYgKG0gPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFNjb3BlZFB5T2JqZWN0UHRyIHJlcyhQeU9iamVjdF9DYWxsKG0uZ2V0KCksIGFyZ3MsIGt3ZHMpKTsKKyAgaWYgKHJlcyA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaW50IHJldCA9IEludGVybmFsQXNzaWduUmVwZWF0ZWRGaWVsZCgKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRTY2FsYXJDb250YWluZXIqPihwc2VsZiksIGxpc3QuZ2V0KCkpOworICBpZiAocmV0IDwgMCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqIFJldmVyc2UoUHlPYmplY3QqIHBzZWxmKSB7CisgIFNjb3BlZFB5T2JqZWN0UHRyIGZ1bGxfc2xpY2UoUHlTbGljZV9OZXcobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpOworICBpZiAoZnVsbF9zbGljZSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgU2NvcGVkUHlPYmplY3RQdHIgbGlzdChTdWJzY3JpcHQocHNlbGYsIGZ1bGxfc2xpY2UuZ2V0KCkpKTsKKyAgaWYgKGxpc3QgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFNjb3BlZFB5T2JqZWN0UHRyIHJlcyhQeU9iamVjdF9DYWxsTWV0aG9kKGxpc3QuZ2V0KCksICJyZXZlcnNlIiwgbnVsbHB0cikpOworICBpZiAocmVzID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpbnQgcmV0ID0gSW50ZXJuYWxBc3NpZ25SZXBlYXRlZEZpZWxkKAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZFNjYWxhckNvbnRhaW5lcio+KHBzZWxmKSwgbGlzdC5nZXQoKSk7CisgIGlmIChyZXQgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogUG9wKFB5T2JqZWN0KiBwc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgUHlfc3NpemVfdCBpbmRleCA9IC0xOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuIiwgJmluZGV4KSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFB5T2JqZWN0KiBpdGVtID0gSXRlbShwc2VsZiwgaW5kZXgpOworICBpZiAoaXRlbSA9PSBudWxscHRyKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0luZGV4RXJyb3IsICJsaXN0IGluZGV4ICglemQpIG91dCBvZiByYW5nZSIsIGluZGV4KTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoQXNzaWduSXRlbShwc2VsZiwgaW5kZXgsIG51bGxwdHIpIDwgMCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBpdGVtOworfQorCitzdGF0aWMgUHlPYmplY3QqIFRvU3RyKFB5T2JqZWN0KiBwc2VsZikgeworICBTY29wZWRQeU9iamVjdFB0ciBmdWxsX3NsaWNlKFB5U2xpY2VfTmV3KG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKTsKKyAgaWYgKGZ1bGxfc2xpY2UgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFNjb3BlZFB5T2JqZWN0UHRyIGxpc3QoU3Vic2NyaXB0KHBzZWxmLCBmdWxsX3NsaWNlLmdldCgpKSk7CisgIGlmIChsaXN0ID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gUHlPYmplY3RfUmVwcihsaXN0LmdldCgpKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBNZXJnZUZyb20oUHlPYmplY3QqIHBzZWxmLCBQeU9iamVjdCogYXJnKSB7CisgIHJldHVybiBFeHRlbmQocmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZFNjYWxhckNvbnRhaW5lcio+KHBzZWxmKSwgYXJnKTsKK30KKworLy8gVGhlIHByaXZhdGUgY29uc3RydWN0b3Igb2YgUmVwZWF0ZWRTY2FsYXJDb250YWluZXIgb2JqZWN0cy4KK1JlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBOZXdDb250YWluZXIoCisgICAgQ01lc3NhZ2UqIHBhcmVudCwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBwYXJlbnRfZmllbGRfZGVzY3JpcHRvcikgeworICBpZiAoIUNoZWNrRmllbGRCZWxvbmdzVG9NZXNzYWdlKHBhcmVudF9maWVsZF9kZXNjcmlwdG9yLCBwYXJlbnQtPm1lc3NhZ2UpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogc2VsZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRTY2FsYXJDb250YWluZXIqPigKKyAgICAgIFB5VHlwZV9HZW5lcmljQWxsb2MoJlJlcGVhdGVkU2NhbGFyQ29udGFpbmVyX1R5cGUsIDApKTsKKyAgaWYgKHNlbGYgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgUHlfSU5DUkVGKHBhcmVudCk7CisgIHNlbGYtPnBhcmVudCA9IHBhcmVudDsKKyAgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IgPSBwYXJlbnRfZmllbGRfZGVzY3JpcHRvcjsKKworICByZXR1cm4gc2VsZjsKK30KKworUHlPYmplY3QqIERlZXBDb3B5KFB5T2JqZWN0KiBwc2VsZiwgUHlPYmplY3QqIGFyZykgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZFNjYWxhckNvbnRhaW5lcio+KHBzZWxmKS0+RGVlcENvcHkoKTsKK30KKworc3RhdGljIHZvaWQgRGVhbGxvYyhQeU9iamVjdCogcHNlbGYpIHsKKyAgcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZFNjYWxhckNvbnRhaW5lcio+KHBzZWxmKS0+UmVtb3ZlRnJvbVBhcmVudENhY2hlKCk7CisgIFB5X1RZUEUocHNlbGYpLT50cF9mcmVlKHBzZWxmKTsKK30KKworc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIFNxTWV0aG9kcyA9IHsKKyAgICBMZW4sICAgICAgIC8qIHNxX2xlbmd0aCAqLworICAgIG51bGxwdHIsICAgLyogc3FfY29uY2F0ICovCisgICAgbnVsbHB0ciwgICAvKiBzcV9yZXBlYXQgKi8KKyAgICBJdGVtLCAgICAgIC8qIHNxX2l0ZW0gKi8KKyAgICBudWxscHRyLCAgIC8qIHNxX3NsaWNlICovCisgICAgQXNzaWduSXRlbSAvKiBzcV9hc3NfaXRlbSAqLworfTsKKworc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgTXBNZXRob2RzID0geworICAgIExlbiwgICAgICAgICAgLyogbXBfbGVuZ3RoICovCisgICAgU3Vic2NyaXB0LCAgICAvKiBtcF9zdWJzY3JpcHQgKi8KKyAgICBBc3NTdWJzY3JpcHQsIC8qIG1wX2Fzc19zdWJzY3JpcHQgKi8KK307CisKK3N0YXRpYyBQeU1ldGhvZERlZiBNZXRob2RzW10gPSB7CisgICAgeyJfX2RlZXBjb3B5X18iLCBEZWVwQ29weSwgTUVUSF9WQVJBUkdTLCAiTWFrZXMgYSBkZWVwIGNvcHkgb2YgdGhlIGNsYXNzLiJ9LAorICAgIHsiX19yZWR1Y2VfXyIsIFJlZHVjZSwgTUVUSF9OT0FSR1MsCisgICAgICJPdXRwdXRzIHBpY2tsYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVwZWF0ZWQgZmllbGQuIn0sCisgICAgeyJhcHBlbmQiLCBBcHBlbmRNZXRob2QsIE1FVEhfTywKKyAgICAgIkFwcGVuZHMgYW4gb2JqZWN0IHRvIHRoZSByZXBlYXRlZCBjb250YWluZXIuIn0sCisgICAgeyJleHRlbmQiLCBFeHRlbmRNZXRob2QsIE1FVEhfTywKKyAgICAgIkFwcGVuZHMgb2JqZWN0cyB0byB0aGUgcmVwZWF0ZWQgY29udGFpbmVyLiJ9LAorICAgIHsiaW5zZXJ0IiwgSW5zZXJ0LCBNRVRIX1ZBUkFSR1MsCisgICAgICJJbnNlcnRzIGFuIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoZSBjb250YWluZXIuIn0sCisgICAgeyJwb3AiLCBQb3AsIE1FVEhfVkFSQVJHUywKKyAgICAgIlJlbW92ZXMgYW4gb2JqZWN0IGZyb20gdGhlIHJlcGVhdGVkIGNvbnRhaW5lciBhbmQgcmV0dXJucyBpdC4ifSwKKyAgICB7InJlbW92ZSIsIFJlbW92ZSwgTUVUSF9PLAorICAgICAiUmVtb3ZlcyBhbiBvYmplY3QgZnJvbSB0aGUgcmVwZWF0ZWQgY29udGFpbmVyLiJ9LAorICAgIHsic29ydCIsIHJlaW50ZXJwcmV0X2Nhc3Q8UHlDRnVuY3Rpb24+KFNvcnQpLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAiU29ydHMgdGhlIHJlcGVhdGVkIGNvbnRhaW5lci4ifSwKKyAgICB7InJldmVyc2UiLCByZWludGVycHJldF9jYXN0PFB5Q0Z1bmN0aW9uPihSZXZlcnNlKSwgTUVUSF9OT0FSR1MsCisgICAgICJSZXZlcnNlcyBlbGVtZW50cyBvcmRlciBvZiB0aGUgcmVwZWF0ZWQgY29udGFpbmVyLiJ9LAorICAgIHsiTWVyZ2VGcm9tIiwgc3RhdGljX2Nhc3Q8UHlDRnVuY3Rpb24+KE1lcmdlRnJvbSksIE1FVEhfTywKKyAgICAgIk1lcmdlcyBhIHJlcGVhdGVkIGNvbnRhaW5lciBpbnRvIHRoZSBjdXJyZW50IGNvbnRhaW5lci4ifSwKKyAgICB7bnVsbHB0ciwgbnVsbHB0cn19OworCit9ICAvLyBuYW1lc3BhY2UgcmVwZWF0ZWRfc2NhbGFyX2NvbnRhaW5lcgorCitQeVR5cGVPYmplY3QgUmVwZWF0ZWRTY2FsYXJDb250YWluZXJfVHlwZSA9IHsKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKSBGVUxMX01PRFVMRV9OQU1FCisgICAgIi5SZXBlYXRlZFNjYWxhckNvbnRhaW5lciIsICAgICAgICAgICAgICAvLyB0cF9uYW1lCisgICAgc2l6ZW9mKFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKSwgICAgICAgICAvLyB0cF9iYXNpY3NpemUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVtc2l6ZQorICAgIHJlcGVhdGVkX3NjYWxhcl9jb250YWluZXI6OkRlYWxsb2MsICAgICAgLy8gIHRwX2RlYWxsb2MKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDgwMDAwCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfdmVjdG9yY2FsbF9vZmZzZXQKKyNlbHNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcHJpbnQKKyNlbmRpZgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9zZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY29tcGFyZQorICAgIHJlcGVhdGVkX3NjYWxhcl9jb250YWluZXI6OlRvU3RyLCAgICAgICAgLy8gIHRwX3JlcHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19udW1iZXIKKyAgICAmcmVwZWF0ZWRfc2NhbGFyX2NvbnRhaW5lcjo6U3FNZXRob2RzLCAgIC8vICB0cF9hc19zZXF1ZW5jZQorICAgICZyZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyOjpNcE1ldGhvZHMsICAgLy8gIHRwX2FzX21hcHBpbmcKKyAgICBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQsICAgICAgICAgICAgIC8vICB0cF9oYXNoCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY2FsbAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3N0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cm8KKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19idWZmZXIKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9mbGFncworICAgICJBIFJlcGVhdGVkIHNjYWxhciBjb250YWluZXIiLCAgICAgICAgICAgLy8gIHRwX2RvYworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3RyYXZlcnNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY2xlYXIKKyAgICByZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyOjpSaWNoQ29tcGFyZSwgIC8vICB0cF9yaWNoY29tcGFyZQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3dlYWtsaXN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2l0ZXJuZXh0CisgICAgcmVwZWF0ZWRfc2NhbGFyX2NvbnRhaW5lcjo6TWV0aG9kcywgICAgICAvLyAgdHBfbWV0aG9kcworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX21lbWJlcnMKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9iYXNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGljdAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX2dldAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX3NldAorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3RvZmZzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pbml0Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfc2NhbGFyX2NvbnRhaW5lci5oIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9yZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0MjNhYgotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfc2NhbGFyX2NvbnRhaW5lci5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGFudXJhYWdAZ29vZ2xlLmNvbSAoQW51cmFhZyBBZ3Jhd2FsKQorLy8gQXV0aG9yOiB0aWJlbGxAZ29vZ2xlLmNvbSAoSm9oYW4gVGliZWxsKQorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX1JFUEVBVEVEX1NDQUxBUl9DT05UQUlORVJfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX1JFUEVBVEVEX1NDQUxBUl9DT05UQUlORVJfSF9fCisKKyNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgorI2luY2x1ZGUgPFB5dGhvbi5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgcHl0aG9uIHsKKwordHlwZWRlZiBzdHJ1Y3QgUmVwZWF0ZWRTY2FsYXJDb250YWluZXIgOiBwdWJsaWMgQ29udGFpbmVyQmFzZSB7Cit9IFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyOworCitleHRlcm4gUHlUeXBlT2JqZWN0IFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyX1R5cGU7CisKK25hbWVzcGFjZSByZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyIHsKKworLy8gQnVpbGRzIGEgUmVwZWF0ZWRTY2FsYXJDb250YWluZXIgb2JqZWN0LCBmcm9tIGEgcGFyZW50IG1lc3NhZ2UgYW5kIGEKKy8vIGZpZWxkIGRlc2NyaXB0b3IuCitleHRlcm4gUmVwZWF0ZWRTY2FsYXJDb250YWluZXIqIE5ld0NvbnRhaW5lcigKKyAgICBDTWVzc2FnZSogcGFyZW50LCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKKworLy8gQXBwZW5kcyB0aGUgc2NhbGFyICdpdGVtJyB0byB0aGUgZW5kIG9mIHRoZSBjb250YWluZXIgJ3NlbGYnLgorLy8KKy8vIFJldHVybnMgTm9uZSBpZiBzdWNjZXNzZnVsOyByZXR1cm5zIE5VTEwgYW5kIHNldHMgYW4gZXhjZXB0aW9uIGlmCisvLyB1bnN1Y2Nlc3NmdWwuCitQeU9iamVjdCogQXBwZW5kKFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogaXRlbSk7CisKKy8vIEFwcGVuZHMgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgaW5wdXQgaXRlcmF0b3IgdG8gdGhlIGNvbnRhaW5lci4KKy8vCisvLyBSZXR1cm5zIE5vbmUgaWYgc3VjY2Vzc2Z1bDsgcmV0dXJucyBOVUxMIGFuZCBzZXRzIGFuIGV4Y2VwdGlvbiBpZgorLy8gdW5zdWNjZXNzZnVsLgorUHlPYmplY3QqIEV4dGVuZChSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIHZhbHVlKTsKKworfSAgLy8gbmFtZXNwYWNlIHJlcGVhdGVkX3NjYWxhcl9jb250YWluZXIKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX1JFUEVBVEVEX1NDQUxBUl9DT05UQUlORVJfSF9fCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3NhZmVfbnVtZXJpY3MuaCBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvc2FmZV9udW1lcmljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYWU2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3NhZmVfbnVtZXJpY3MuaApAQCAtMCwwICsxLDE2NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfU0FGRV9OVU1FUklDU19IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfU0FGRV9OVU1FUklDU19IX18KKy8vIENvcGllZCBmcm9tIGNocm9taXVtIHdpdGggb25seSBjaGFuZ2VzIHRvIHRoZSBuYW1lc3BhY2UuCisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHB5dGhvbiB7CisKK3RlbXBsYXRlIDxib29sIFNhbWVTaXplLCBib29sIERlc3RMYXJnZXIsCisgICAgICAgICAgYm9vbCBEZXN0SXNTaWduZWQsIGJvb2wgU291cmNlSXNTaWduZWQ+CitzdHJ1Y3QgSXNWYWxpZE51bWVyaWNDYXN0SW1wbDsKKworI2RlZmluZSBCQVNFX05VTUVSSUNfQ0FTVF9DQVNFX1NQRUNJQUxJWkFUSU9OKEEsIEIsIEMsIEQsIENvZGUpIFwKK3RlbXBsYXRlIDw+IHN0cnVjdCBJc1ZhbGlkTnVtZXJpY0Nhc3RJbXBsPEEsIEIsIEMsIEQ+IHsgXAorICB0ZW1wbGF0ZSA8Y2xhc3MgU291cmNlLCBjbGFzcyBEZXN0Qm91bmRzPiBzdGF0aWMgaW5saW5lIGJvb2wgVGVzdCggXAorICAgICAgU291cmNlIHNvdXJjZSwgRGVzdEJvdW5kcyBtaW4sIERlc3RCb3VuZHMgbWF4KSB7IFwKKyAgICByZXR1cm4gQ29kZTsgXAorICB9IFwKK30KKworI2RlZmluZSBCQVNFX05VTUVSSUNfQ0FTVF9DQVNFX1NBTUVfU0laRShEZXN0U2lnbmVkLCBTb3VyY2VTaWduZWQsIENvZGUpIFwKKyAgQkFTRV9OVU1FUklDX0NBU1RfQ0FTRV9TUEVDSUFMSVpBVElPTiggXAorICAgICAgdHJ1ZSwgdHJ1ZSwgRGVzdFNpZ25lZCwgU291cmNlU2lnbmVkLCBDb2RlKTsgXAorICBCQVNFX05VTUVSSUNfQ0FTVF9DQVNFX1NQRUNJQUxJWkFUSU9OKCBcCisgICAgICB0cnVlLCBmYWxzZSwgRGVzdFNpZ25lZCwgU291cmNlU2lnbmVkLCBDb2RlKQorCisjZGVmaW5lIEJBU0VfTlVNRVJJQ19DQVNUX0NBU0VfU09VUkNFX0xBUkdFUihEZXN0U2lnbmVkLCBTb3VyY2VTaWduZWQsIENvZGUpIFwKKyAgQkFTRV9OVU1FUklDX0NBU1RfQ0FTRV9TUEVDSUFMSVpBVElPTiggXAorICAgICAgZmFsc2UsIGZhbHNlLCBEZXN0U2lnbmVkLCBTb3VyY2VTaWduZWQsIENvZGUpOyBcCisKKyNkZWZpbmUgQkFTRV9OVU1FUklDX0NBU1RfQ0FTRV9ERVNUX0xBUkdFUihEZXN0U2lnbmVkLCBTb3VyY2VTaWduZWQsIENvZGUpIFwKKyAgQkFTRV9OVU1FUklDX0NBU1RfQ0FTRV9TUEVDSUFMSVpBVElPTiggXAorICAgICAgZmFsc2UsIHRydWUsIERlc3RTaWduZWQsIFNvdXJjZVNpZ25lZCwgQ29kZSk7IFwKKworLy8gVGhlIHRocmVlIHRvcCBsZXZlbCBjYXNlcyBhcmU6CisvLyAtIFNhbWUgc2l6ZQorLy8gLSBTb3VyY2UgbGFyZ2VyCisvLyAtIERlc3QgbGFyZ2VyCisvLyBBbmQgZm9yIGVhY2ggb2YgdGhvc2UgdGhyZWUgY2FzZXMsIHdlIGhhbmRsZSB0aGUgNCBkaWZmZXJlbnQgcG9zc2liaWxpdGllcworLy8gb2Ygc2lnbmVkIGFuZCB1bnNpZ25lZC4gVGhpcyBnaXZlcyAxMiBjYXNlcyB0byBoYW5kbGUsIHdoaWNoIHdlIGVudW1lcmF0ZQorLy8gYmVsb3cuCisvLworLy8gVGhlIGxhc3QgYXJndW1lbnQgaW4gZWFjaCBvZiB0aGUgbWFjcm9zIGlzIHRoZSBhY3R1YWwgY29tcGFyaXNvbiBjb2RlLiBJdAorLy8gaGFzIHRocmVlIGFyZ3VtZW50cyBhdmFpbGFibGUsIHNvdXJjZSAodGhlIHZhbHVlKSwgYW5kIG1pbi9tYXggd2hpY2ggYXJlCisvLyB0aGUgcmFuZ2VzIG9mIHRoZSBkZXN0aW5hdGlvbi4KKworCisvLyBUaGVzZSBhcmUgdGhlIGNhc2VzIHdoZXJlIGJvdGggdHlwZXMgaGF2ZSB0aGUgc2FtZSBzaXplLgorCisvLyBCb3RoIHNpZ25lZC4KK0JBU0VfTlVNRVJJQ19DQVNUX0NBU0VfU0FNRV9TSVpFKHRydWUsIHRydWUsIHRydWUpOworLy8gQm90aCB1bnNpZ25lZC4KK0JBU0VfTlVNRVJJQ19DQVNUX0NBU0VfU0FNRV9TSVpFKGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisvLyBEZXN0IHVuc2lnbmVkLCBTb3VyY2Ugc2lnbmVkLgorQkFTRV9OVU1FUklDX0NBU1RfQ0FTRV9TQU1FX1NJWkUoZmFsc2UsIHRydWUsIHNvdXJjZSA+PSAwKTsKKy8vIERlc3Qgc2lnbmVkLCBTb3VyY2UgdW5zaWduZWQuCisvLyBUaGlzIGNhc3QgaXMgT0sgYmVjYXVzZSBEZXN0J3MgbWF4IG11c3QgYmUgbGVzcyB0aGFuIFNvdXJjZSdzLgorQkFTRV9OVU1FUklDX0NBU1RfQ0FTRV9TQU1FX1NJWkUodHJ1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPD0gc3RhdGljX2Nhc3Q8U291cmNlPihtYXgpKTsKKworCisvLyBUaGVzZSBhcmUgdGhlIGNhc2VzIHdoZXJlIFNvdXJjZSBpcyBsYXJnZXIuCisKKy8vIEJvdGggdW5zaWduZWQuCitCQVNFX05VTUVSSUNfQ0FTVF9DQVNFX1NPVVJDRV9MQVJHRVIoZmFsc2UsIGZhbHNlLCBzb3VyY2UgPD0gbWF4KTsKKy8vIEJvdGggc2lnbmVkLgorQkFTRV9OVU1FUklDX0NBU1RfQ0FTRV9TT1VSQ0VfTEFSR0VSKHRydWUsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID49IG1pbiAmJiBzb3VyY2UgPD0gbWF4KTsKKy8vIERlc3QgaXMgdW5zaWduZWQsIFNvdXJjZSBpcyBzaWduZWQuCitCQVNFX05VTUVSSUNfQ0FTVF9DQVNFX1NPVVJDRV9MQVJHRVIoZmFsc2UsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID49IDAgJiYgc291cmNlIDw9IG1heCk7CisvLyBEZXN0IGlzIHNpZ25lZCwgU291cmNlIGlzIHVuc2lnbmVkLgorLy8gVGhpcyBjYXN0IGlzIE9LIGJlY2F1c2UgRGVzdCdzIG1heCBtdXN0IGJlIGxlc3MgdGhhbiBTb3VyY2Uncy4KK0JBU0VfTlVNRVJJQ19DQVNUX0NBU0VfU09VUkNFX0xBUkdFUih0cnVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPD0gc3RhdGljX2Nhc3Q8U291cmNlPihtYXgpKTsKKworCisvLyBUaGVzZSBhcmUgdGhlIGNhc2VzIHdoZXJlIERlc3QgaXMgbGFyZ2VyLgorCisvLyBCb3RoIHVuc2lnbmVkLgorQkFTRV9OVU1FUklDX0NBU1RfQ0FTRV9ERVNUX0xBUkdFUihmYWxzZSwgZmFsc2UsIHRydWUpOworLy8gQm90aCBzaWduZWQuCitCQVNFX05VTUVSSUNfQ0FTVF9DQVNFX0RFU1RfTEFSR0VSKHRydWUsIHRydWUsIHRydWUpOworLy8gRGVzdCBpcyB1bnNpZ25lZCwgU291cmNlIGlzIHNpZ25lZC4KK0JBU0VfTlVNRVJJQ19DQVNUX0NBU0VfREVTVF9MQVJHRVIoZmFsc2UsIHRydWUsIHNvdXJjZSA+PSAwKTsKKy8vIERlc3QgaXMgc2lnbmVkLCBTb3VyY2UgaXMgdW5zaWduZWQuCitCQVNFX05VTUVSSUNfQ0FTVF9DQVNFX0RFU1RfTEFSR0VSKHRydWUsIGZhbHNlLCB0cnVlKTsKKworI3VuZGVmIEJBU0VfTlVNRVJJQ19DQVNUX0NBU0VfU1BFQ0lBTElaQVRJT04KKyN1bmRlZiBCQVNFX05VTUVSSUNfQ0FTVF9DQVNFX1NBTUVfU0laRQorI3VuZGVmIEJBU0VfTlVNRVJJQ19DQVNUX0NBU0VfU09VUkNFX0xBUkdFUgorI3VuZGVmIEJBU0VfTlVNRVJJQ19DQVNUX0NBU0VfREVTVF9MQVJHRVIKKworCisvLyBUaGUgbWFpbiB0ZXN0IGZvciB3aGV0aGVyIHRoZSBjb252ZXJzaW9uIHdpbGwgdW5kZXIgb3Igb3ZlcmZsb3cuCit0ZW1wbGF0ZSA8Y2xhc3MgRGVzdCwgY2xhc3MgU291cmNlPgoraW5saW5lIGJvb2wgSXNWYWxpZE51bWVyaWNDYXN0KFNvdXJjZSBzb3VyY2UpIHsKKyAgdHlwZWRlZiBzdGQ6Om51bWVyaWNfbGltaXRzPFNvdXJjZT4gU291cmNlTGltaXRzOworICB0eXBlZGVmIHN0ZDo6bnVtZXJpY19saW1pdHM8RGVzdD4gRGVzdExpbWl0czsKKyAgc3RhdGljX2Fzc2VydChTb3VyY2VMaW1pdHM6OmlzX3NwZWNpYWxpemVkLCAiYXJndW1lbnQgbXVzdCBiZSBudW1lcmljIik7CisgIHN0YXRpY19hc3NlcnQoU291cmNlTGltaXRzOjppc19pbnRlZ2VyLCAiYXJndW1lbnQgbXVzdCBiZSBpbnRlZ3JhbCIpOworICBzdGF0aWNfYXNzZXJ0KERlc3RMaW1pdHM6OmlzX3NwZWNpYWxpemVkLCAicmVzdWx0IG11c3QgYmUgbnVtZXJpYyIpOworICBzdGF0aWNfYXNzZXJ0KERlc3RMaW1pdHM6OmlzX2ludGVnZXIsICJyZXN1bHQgbXVzdCBiZSBpbnRlZ3JhbCIpOworCisgIHJldHVybiBJc1ZhbGlkTnVtZXJpY0Nhc3RJbXBsPAorICAgICAgc2l6ZW9mKERlc3QpID09IHNpemVvZihTb3VyY2UpLAorICAgICAgKHNpemVvZihEZXN0KSA+IHNpemVvZihTb3VyY2UpKSwKKyAgICAgIERlc3RMaW1pdHM6OmlzX3NpZ25lZCwKKyAgICAgIFNvdXJjZUxpbWl0czo6aXNfc2lnbmVkPjo6VGVzdCgKKyAgICAgICAgICBzb3VyY2UsCisgICAgICAgICAgRGVzdExpbWl0czo6bWluKCksCisgICAgICAgICAgRGVzdExpbWl0czo6bWF4KCkpOworfQorCisvLyBjaGVja2VkX251bWVyaWNfY2FzdDw+IGlzIGFuYWxvZ291cyB0byBzdGF0aWNfY2FzdDw+IGZvciBudW1lcmljIHR5cGVzLAorLy8gZXhjZXB0IHRoYXQgaXQgQ0hFQ0tzIHRoYXQgdGhlIHNwZWNpZmllZCBudW1lcmljIGNvbnZlcnNpb24gd2lsbCBub3QKKy8vIG92ZXJmbG93IG9yIHVuZGVyZmxvdy4gRmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzIGFyZSBub3QgY3VycmVudGx5IGFsbG93ZWQKKy8vICh0aGlzIGlzIHN0YXRpY19hc3NlcnRlZCksIHRob3VnaCB0aGlzIGNvdWxkIGJlIHN1cHBvcnRlZCBpZiBuZWNlc3NhcnkuCit0ZW1wbGF0ZSA8Y2xhc3MgRGVzdCwgY2xhc3MgU291cmNlPgoraW5saW5lIERlc3QgY2hlY2tlZF9udW1lcmljX2Nhc3QoU291cmNlIHNvdXJjZSkgeworICBHT09HTEVfQ0hFQ0soSXNWYWxpZE51bWVyaWNDYXN0PERlc3Q+KHNvdXJjZSkpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVzdD4oc291cmNlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfU0FGRV9OVU1FUklDU19IX18KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvc2NvcGVkX3B5b2JqZWN0X3B0ci5oIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9zY29wZWRfcHlvYmplY3RfcHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzZmE5NAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvc2NvcGVkX3B5b2JqZWN0X3B0ci5oCkBAIC0wLDAgKzEsMTAxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiB0aWJlbGxAZ29vZ2xlLmNvbSAoSm9oYW4gVGliZWxsKQorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX1NDT1BFRF9QWU9CSkVDVF9QVFJfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX1NDT1BFRF9QWU9CSkVDVF9QVFJfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKyNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgorI2luY2x1ZGUgPFB5dGhvbi5oPgorbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHB5dGhvbiB7CisKKy8vIE93bnMgYSBweXRob24gb2JqZWN0IGFuZCBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb24gZGVzdHJ1Y3Rpb24uCisvLyBUaGlzIGNsYXNzIGlzIG5vdCB0aHJlYWRzYWZlLgordGVtcGxhdGUgPHR5cGVuYW1lIFB5T2JqZWN0U3RydWN0PgorY2xhc3MgU2NvcGVkUHl0aG9uUHRyIHsKKyBwdWJsaWM6CisgIC8vIFRha2VzIHRoZSBvd25lcnNoaXAgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gU2NvcGVkUHl0aG9uUHRyLgorICAvLyBUaGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBzcGVjaWZpZWQgcHlfb2JqZWN0IGlzIG5vdCBpbmNyZW1lbnRlZC4KKyAgZXhwbGljaXQgU2NvcGVkUHl0aG9uUHRyKFB5T2JqZWN0U3RydWN0KiBweV9vYmplY3QgPSBudWxscHRyKQorICAgICAgOiBwdHJfKHB5X29iamVjdCkge30KKworICAvLyBJZiBhIFB5T2JqZWN0IGlzIG93bmVkLCBkZWNyZW1lbnQgaXRzIHJlZmVyZW5jZSBjb3VudC4KKyAgflNjb3BlZFB5dGhvblB0cigpIHsgUHlfWERFQ1JFRihwdHJfKTsgfQorCisgIC8vIERlbGV0ZXMgdGhlIGN1cnJlbnQgb3duZWQgb2JqZWN0LCBpZiBhbnkuCisgIC8vIFRoZW4gdGFrZXMgb3duZXJzaGlwIG9mIGEgbmV3IG9iamVjdCB3aXRob3V0IGluY3JlbWVudGluZyB0aGUgcmVmZXJlbmNlCisgIC8vIGNvdW50LgorICAvLyBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggYSByZWZlcmVuY2UgdGhhdCB5b3Ugb3duLgorICAvLyAgIHRoaXMtPnJlc2V0KHRoaXMtPmdldCgpKSBpcyB3cm9uZyEKKyAgLy8gICB0aGlzLT5yZXNldCh0aGlzLT5yZWxlYXNlKCkpIGlzIE9LLgorICBQeU9iamVjdFN0cnVjdCogcmVzZXQoUHlPYmplY3RTdHJ1Y3QqIHAgPSBudWxscHRyKSB7CisgICAgUHlfWERFQ1JFRihwdHJfKTsKKyAgICBwdHJfID0gcDsKKyAgICByZXR1cm4gcHRyXzsKKyAgfQorCisgIC8vIFJlbGVhc2VzIG93bmVyc2hpcCBvZiB0aGUgb2JqZWN0IHdpdGhvdXQgZGVjcmVtZW50aW5nIHRoZSByZWZlcmVuY2UgY291bnQuCisgIC8vIFRoZSBjYWxsZXIgbm93IG93bnMgdGhlIHJldHVybmVkIHJlZmVyZW5jZS4KKyAgUHlPYmplY3RTdHJ1Y3QqIHJlbGVhc2UoKSB7CisgICAgUHlPYmplY3QqIHAgPSBwdHJfOworICAgIHB0cl8gPSBudWxscHRyOworICAgIHJldHVybiBwOworICB9CisKKyAgUHlPYmplY3RTdHJ1Y3QqIGdldCgpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KKworICBQeU9iamVjdCogYXNfcHlvYmplY3QoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4ocHRyXyk7IH0KKworICAvLyBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LgorICAvLyBTaG91bGQgbm90IGJlIGNhbGxlZCB3aGVuIG5vIG9iamVjdCBpcyBoZWxkLgorICB2b2lkIGluYygpIGNvbnN0IHsgUHlfSU5DUkVGKHB0cl8pOyB9CisKKyAgLy8gVHJ1ZSB3aGVuIGEgU2NvcGVkUHlPYmplY3RQdHIgYW5kIGEgcmF3IHBvaW50ZXIgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0LgorICAvLyBDb21wYXJpc29uIG9wZXJhdG9ycyBhcmUgbm9uIHJlZmxleGl2ZS4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFB5T2JqZWN0U3RydWN0KiBwKSBjb25zdCB7IHJldHVybiBwdHJfID09IHA7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFB5T2JqZWN0U3RydWN0KiBwKSBjb25zdCB7IHJldHVybiBwdHJfICE9IHA7IH0KKworIHByaXZhdGU6CisgIFB5T2JqZWN0U3RydWN0KiBwdHJfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTY29wZWRQeXRob25QdHIpOworfTsKKwordHlwZWRlZiBTY29wZWRQeXRob25QdHI8UHlPYmplY3Q+IFNjb3BlZFB5T2JqZWN0UHRyOworCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfU0NPUEVEX1BZT0JKRUNUX1BUUl9IX18KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvdW5rbm93bl9maWVsZF9zZXQuY2MgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3Vua25vd25fZmllbGRfc2V0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjliYmMKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3Vua25vd25fZmllbGRfc2V0LmNjCkBAIC0wLDAgKzEsMzU1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC91bmtub3duX2ZpZWxkX3NldC5oPgorCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvc2NvcGVkX3B5b2JqZWN0X3B0ci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgcHl0aG9uIHsKKworbmFtZXNwYWNlIHVua25vd25fZmllbGRfc2V0IHsKKworc3RhdGljIFB5X3NzaXplX3QgTGVuKFB5T2JqZWN0KiBwc2VsZikgeworICBQeVVua25vd25GaWVsZFNldCogc2VsZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlVbmtub3duRmllbGRTZXQqPihwc2VsZik7CisgIGlmIChzZWxmLT5maWVsZHMgPT0gbnVsbHB0cikgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiVW5rbm93bkZpZWxkU2V0IGRvZXMgbm90IGV4aXN0LiAiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIHNlbGYtPmZpZWxkcy0+ZmllbGRfY291bnQoKTsKK30KKworUHlPYmplY3QqIE5ld1B5VW5rbm93bkZpZWxkKFB5VW5rbm93bkZpZWxkU2V0KiBwYXJlbnQsIFB5X3NzaXplX3QgaW5kZXgpOworCitzdGF0aWMgUHlPYmplY3QqIEl0ZW0oUHlPYmplY3QqIHBzZWxmLCBQeV9zc2l6ZV90IGluZGV4KSB7CisgIFB5VW5rbm93bkZpZWxkU2V0KiBzZWxmID0gcmVpbnRlcnByZXRfY2FzdDxQeVVua25vd25GaWVsZFNldCo+KHBzZWxmKTsKKyAgaWYgKHNlbGYtPmZpZWxkcyA9PSBudWxscHRyKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJVbmtub3duRmllbGRTZXQgZG9lcyBub3QgZXhpc3QuICIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFB5X3NzaXplX3QgdG90YWxfc2l6ZSA9IHNlbGYtPmZpZWxkcy0+ZmllbGRfY291bnQoKTsKKyAgaWYgKGluZGV4IDwgMCkgeworICAgIGluZGV4ID0gdG90YWxfc2l6ZSArIGluZGV4OworICB9CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdG90YWxfc2l6ZSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggKCV6ZCkgb3V0IG9mIHJhbmdlIiwgaW5kZXgpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiB1bmtub3duX2ZpZWxkX3NldDo6TmV3UHlVbmtub3duRmllbGQoc2VsZiwgaW5kZXgpOworfQorCitQeU9iamVjdCogTmV3KFB5VHlwZU9iamVjdCogdHlwZSwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpIHsKKyAgaWYgKGFyZ3MgPT0gbnVsbHB0ciB8fCBQeVR1cGxlX1NpemUoYXJncykgIT0gMSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJNdXN0IHByb3ZpZGUgYSBtZXNzYWdlIHRvIGNyZWF0ZSBVbmtub3duRmllbGRTZXQiKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5T2JqZWN0KiBjX21lc3NhZ2U7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyIsICZjX21lc3NhZ2UpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIk11c3QgcHJvdmlkZSBhIG1lc3NhZ2UgdG8gY3JlYXRlIFVua25vd25GaWVsZFNldCIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2soY19tZXNzYWdlLCBDTWVzc2FnZV9UeXBlKSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJQYXJhbWV0ZXIgdG8gVW5rbm93bkZpZWxkU2V0KCkgbXVzdCBiZSBhIG1lc3NhZ2UgIgorICAgICAgICAgICAgICAgICAiZ290ICVzLiIsCisgICAgICAgICAgICAgICAgIFB5X1RZUEUoY19tZXNzYWdlKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBQeVVua25vd25GaWVsZFNldCogc2VsZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlVbmtub3duRmllbGRTZXQqPigKKyAgICAgIFB5VHlwZV9HZW5lcmljQWxsb2MoJlB5VW5rbm93bkZpZWxkU2V0X1R5cGUsIDApKTsKKyAgaWYgKHNlbGYgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gVG9wIFVua25vd25GaWVsZFNldCBzaG91bGQgc2V0IHBhcmVudCBudWxscHRyLgorICBzZWxmLT5wYXJlbnQgPSBudWxscHRyOworCisgIC8vIENvcHkgY19tZXNzYWdlJ3MgVW5rbm93bkZpZWxkU2V0LgorICBNZXNzYWdlKiBtZXNzYWdlID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGNfbWVzc2FnZSktPm1lc3NhZ2U7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIHNlbGYtPmZpZWxkcyA9IG5ldyBnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQ7CisgIHNlbGYtPmZpZWxkcy0+TWVyZ2VGcm9tKHJlZmxlY3Rpb24tPkdldFVua25vd25GaWVsZHMoKm1lc3NhZ2UpKTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKTsKK30KKworUHlPYmplY3QqIE5ld1B5VW5rbm93bkZpZWxkKFB5VW5rbm93bkZpZWxkU2V0KiBwYXJlbnQsIFB5X3NzaXplX3QgaW5kZXgpIHsKKyAgUHlVbmtub3duRmllbGQqIHNlbGYgPSByZWludGVycHJldF9jYXN0PFB5VW5rbm93bkZpZWxkKj4oCisgICAgICBQeVR5cGVfR2VuZXJpY0FsbG9jKCZQeVVua25vd25GaWVsZF9UeXBlLCAwKSk7CisgIGlmIChzZWxmID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5X0lOQ1JFRihwYXJlbnQpOworICBzZWxmLT5wYXJlbnQgPSBwYXJlbnQ7CisgIHNlbGYtPmluZGV4ID0gaW5kZXg7CisKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKTsKK30KKworc3RhdGljIHZvaWQgRGVhbGxvYyhQeU9iamVjdCogcHNlbGYpIHsKKyAgUHlVbmtub3duRmllbGRTZXQqIHNlbGYgPSByZWludGVycHJldF9jYXN0PFB5VW5rbm93bkZpZWxkU2V0Kj4ocHNlbGYpOworICBpZiAoc2VsZi0+cGFyZW50ID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgc2VsZi0+ZmllbGRzOworICB9IGVsc2UgeworICAgIFB5X0NMRUFSKHNlbGYtPnBhcmVudCk7CisgIH0KKyAgYXV0byogcHlfdHlwZSA9IFB5X1RZUEUocHNlbGYpOworICBzZWxmLT5+UHlVbmtub3duRmllbGRTZXQoKTsKKyAgcHlfdHlwZS0+dHBfZnJlZShwc2VsZik7Cit9CisKK3N0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBTcU1ldGhvZHMgPSB7CisgICAgTGVuLCAgICAgLyogc3FfbGVuZ3RoICovCisgICAgbnVsbHB0ciwgLyogc3FfY29uY2F0ICovCisgICAgbnVsbHB0ciwgLyogc3FfcmVwZWF0ICovCisgICAgSXRlbSwgICAgLyogc3FfaXRlbSAqLworICAgIG51bGxwdHIsIC8qIHNxX3NsaWNlICovCisgICAgbnVsbHB0ciwgLyogc3FfYXNzX2l0ZW0gKi8KK307CisKK30gIC8vIG5hbWVzcGFjZSB1bmtub3duX2ZpZWxkX3NldAorCitQeVR5cGVPYmplY3QgUHlVbmtub3duRmllbGRTZXRfVHlwZSA9IHsKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKSBGVUxMX01PRFVMRV9OQU1FCisgICAgIi5QeVVua25vd25GaWVsZFNldCIsICAgICAgICAvLyB0cF9uYW1lCisgICAgc2l6ZW9mKFB5VW5rbm93bkZpZWxkU2V0KSwgICAvLyB0cF9iYXNpY3NpemUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVtc2l6ZQorICAgIHVua25vd25fZmllbGRfc2V0OjpEZWFsbG9jLCAgLy8gIHRwX2RlYWxsb2MKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwODAwMDAKKyAgICBudWxscHRyLCAgLy8gdHBfcHJpbnQKKyNlbHNlCisgICAgMCwgIC8vIHRwX3ZlY3RvcmNhbGxfb2Zmc2V0CisjZW5kaWYKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NvbXBhcmUKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9yZXByCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfbnVtYmVyCisgICAgJnVua25vd25fZmllbGRfc2V0OjpTcU1ldGhvZHMsICAvLyAgdHBfYXNfc2VxdWVuY2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19tYXBwaW5nCisgICAgUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkLCAgICAvLyAgdHBfaGFzaAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NhbGwKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9zdHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3NldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfYnVmZmVyCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAvLyAgdHBfZmxhZ3MKKyAgICAidW5rbm93biBmaWVsZCBzZXQiLCAgICAgICAgICAgIC8vICB0cF9kb2MKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF90cmF2ZXJzZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NsZWFyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcmljaGNvbXBhcmUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF93ZWFrbGlzdG9mZnNldAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2l0ZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVybmV4dAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX21ldGhvZHMKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9tZW1iZXJzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0c2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYmFzZQorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3QKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9nZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9zZXQKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kaWN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaW5pdAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2FsbG9jCisgICAgdW5rbm93bl9maWVsZF9zZXQ6Ok5ldywgICAgICAgICAvLyAgdHBfbmV3Cit9OworCituYW1lc3BhY2UgdW5rbm93bl9maWVsZCB7CitzdGF0aWMgUHlPYmplY3QqIFB5VW5rbm93bkZpZWxkU2V0X0Zyb21Vbmtub3duRmllbGRTZXQoCisgICAgUHlVbmtub3duRmllbGRTZXQqIHBhcmVudCwgY29uc3QgVW5rbm93bkZpZWxkU2V0JiBmaWVsZHMpIHsKKyAgUHlVbmtub3duRmllbGRTZXQqIHNlbGYgPSByZWludGVycHJldF9jYXN0PFB5VW5rbm93bkZpZWxkU2V0Kj4oCisgICAgICBQeVR5cGVfR2VuZXJpY0FsbG9jKCZQeVVua25vd25GaWVsZFNldF9UeXBlLCAwKSk7CisgIGlmIChzZWxmID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5X0lOQ1JFRihwYXJlbnQpOworICBzZWxmLT5wYXJlbnQgPSBwYXJlbnQ7CisgIHNlbGYtPmZpZWxkcyA9IGNvbnN0X2Nhc3Q8VW5rbm93bkZpZWxkU2V0Kj4oJmZpZWxkcyk7CisKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKTsKK30KKworY29uc3QgVW5rbm93bkZpZWxkKiBHZXRVbmtub3duRmllbGQoUHlVbmtub3duRmllbGQqIHNlbGYpIHsKKyAgY29uc3QgVW5rbm93bkZpZWxkU2V0KiBmaWVsZHMgPSBzZWxmLT5wYXJlbnQtPmZpZWxkczsKKyAgaWYgKGZpZWxkcyA9PSBudWxscHRyKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJVbmtub3duRmllbGQgZG9lcyBub3QgZXhpc3QuICIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFB5X3NzaXplX3QgdG90YWxfc2l6ZSA9IGZpZWxkcy0+ZmllbGRfY291bnQoKTsKKyAgaWYgKHNlbGYtPmluZGV4ID49IHRvdGFsX3NpemUpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIlVua25vd25GaWVsZCBkb2VzIG5vdCBleGlzdC4gIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuICZmaWVsZHMtPmZpZWxkKHNlbGYtPmluZGV4KTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXRGaWVsZE51bWJlcihQeVVua25vd25GaWVsZCogc2VsZiwgdm9pZCogY2xvc3VyZSkgeworICBjb25zdCBVbmtub3duRmllbGQqIHVua25vd25fZmllbGQgPSBHZXRVbmtub3duRmllbGQoc2VsZik7CisgIGlmICh1bmtub3duX2ZpZWxkID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHVua25vd25fZmllbGQtPm51bWJlcigpKTsKK30KKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOworc3RhdGljIFB5T2JqZWN0KiBHZXRXaXJlVHlwZShQeVVua25vd25GaWVsZCogc2VsZiwgdm9pZCogY2xvc3VyZSkgeworICBjb25zdCBVbmtub3duRmllbGQqIHVua25vd25fZmllbGQgPSBHZXRVbmtub3duRmllbGQoc2VsZik7CisgIGlmICh1bmtub3duX2ZpZWxkID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIEFzc2lnbiBhIGRlZmF1bHQgdmFsdWUgdG8gc3VwcHJlc3MgbWF5LXVuaW5pdGlhbGl6ZWQgd2FybmluZ3MgKGVycm9ycworICAvLyB3aGVuIGJ1aWx0IGluIHNvbWUgcGxhY2VzKS4KKyAgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIHdpcmVfdHlwZSA9IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQ7CisgIHN3aXRjaCAodW5rbm93bl9maWVsZC0+dHlwZSgpKSB7CisgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5UOgorICAgICAgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVEMzI6CisgICAgICB3aXJlX3R5cGUgPSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVENjQ6CisgICAgICB3aXJlX3R5cGUgPSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQ6CisgICAgICB3aXJlX3R5cGUgPSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOgorICAgICAgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh3aXJlX3R5cGUpOworfQorCitzdGF0aWMgUHlPYmplY3QqIEdldERhdGEoUHlVbmtub3duRmllbGQqIHNlbGYsIHZvaWQqIGNsb3N1cmUpIHsKKyAgY29uc3QgVW5rbm93bkZpZWxkKiBmaWVsZCA9IEdldFVua25vd25GaWVsZChzZWxmKTsKKyAgaWYgKGZpZWxkID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeU9iamVjdCogZGF0YSA9IG51bGxwdHI7CisgIHN3aXRjaCAoZmllbGQtPnR5cGUoKSkgeworICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVDoKKyAgICAgIGRhdGEgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoZmllbGQtPnZhcmludCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVEMzI6CisgICAgICBkYXRhID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoZmllbGQtPmZpeGVkMzIoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0OgorICAgICAgZGF0YSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyhmaWVsZC0+Zml4ZWQ2NCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQ6CisgICAgICBkYXRhID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShmaWVsZC0+bGVuZ3RoX2RlbGltaXRlZCgpLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5HZXRMZW5ndGhEZWxpbWl0ZWRTaXplKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6CisgICAgICBkYXRhID0KKyAgICAgICAgICBQeVVua25vd25GaWVsZFNldF9Gcm9tVW5rbm93bkZpZWxkU2V0KHNlbGYtPnBhcmVudCwgZmllbGQtPmdyb3VwKCkpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIERlYWxsb2MoUHlPYmplY3QqIHBzZWxmKSB7CisgIFB5VW5rbm93bkZpZWxkKiBzZWxmID0gcmVpbnRlcnByZXRfY2FzdDxQeVVua25vd25GaWVsZCo+KHBzZWxmKTsKKyAgUHlfQ0xFQVIoc2VsZi0+cGFyZW50KTsKK30KKworc3RhdGljIFB5R2V0U2V0RGVmIEdldHRlcnNbXSA9IHsKKyAgICB7ImZpZWxkX251bWJlciIsIChnZXR0ZXIpR2V0RmllbGROdW1iZXIsIG51bGxwdHJ9LAorICAgIHsid2lyZV90eXBlIiwgKGdldHRlcilHZXRXaXJlVHlwZSwgbnVsbHB0cn0sCisgICAgeyJkYXRhIiwgKGdldHRlcilHZXREYXRhLCBudWxscHRyfSwKKyAgICB7bnVsbHB0cn0sCit9OworCit9ICAvLyBuYW1lc3BhY2UgdW5rbm93bl9maWVsZAorCitQeVR5cGVPYmplY3QgUHlVbmtub3duRmllbGRfVHlwZSA9IHsKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKSBGVUxMX01PRFVMRV9OQU1FCisgICAgIi5QeVVua25vd25GaWVsZCIsICAgICAgIC8vIHRwX25hbWUKKyAgICBzaXplb2YoUHlVbmtub3duRmllbGQpLCAgLy8gIHRwX2Jhc2ljc2l6ZQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlbXNpemUKKyAgICB1bmtub3duX2ZpZWxkOjpEZWFsbG9jLCAgLy8gIHRwX2RlYWxsb2MKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwODAwMDAKKyAgICBudWxscHRyLCAgLy8gdHBfcHJpbnQKKyNlbHNlCisgICAgMCwgIC8vIHRwX3ZlY3RvcmNhbGxfb2Zmc2V0CisjZW5kaWYKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9zZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NvbXBhcmUKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcmVwcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19udW1iZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfc2VxdWVuY2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfbWFwcGluZworICAgIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwgIC8vICB0cF9oYXNoCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NhbGwKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc3RyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3NldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2FzX2J1ZmZlcgorICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgIC8vICB0cF9mbGFncworICAgICJ1bmtub3duIGZpZWxkIiwgICAgICAgICAgICAgIC8vICB0cF9kb2MKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfdHJhdmVyc2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY2xlYXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcmljaGNvbXBhcmUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfd2Vha2xpc3RvZmZzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVybmV4dAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9tZXRob2RzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX21lbWJlcnMKKyAgICB1bmtub3duX2ZpZWxkOjpHZXR0ZXJzLCAgICAgICAvLyAgdHBfZ2V0c2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Jhc2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGljdAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9nZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGVzY3Jfc2V0CisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3RvZmZzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaW5pdAorfTsKKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3Vua25vd25fZmllbGRfc2V0LmggYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3Vua25vd25fZmllbGRfc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhNzY0ZAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvdW5rbm93bl9maWVsZF9zZXQuaApAQCAtMCwwICsxLDc4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9VTktOT1dOX0ZJRUxEX1NFVF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfVU5LTk9XTl9GSUVMRF9TRVRfSF9fCisKKyNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgorI2luY2x1ZGUgPFB5dGhvbi5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgVW5rbm93bkZpZWxkOworY2xhc3MgVW5rbm93bkZpZWxkU2V0OworCituYW1lc3BhY2UgcHl0aG9uIHsKK3N0cnVjdCBDTWVzc2FnZTsKKworc3RydWN0IFB5VW5rbm93bkZpZWxkU2V0IHsKKyAgUHlPYmplY3RfSEVBRDsKKyAgLy8gSWYgcGFyZW50IGlzIG51bGxwdHIsIGl0IGlzIGEgdG9wIFVua25vd25GaWVsZFNldC4KKyAgUHlVbmtub3duRmllbGRTZXQqIHBhcmVudDsKKworICAvLyBUb3AgVW5rbm93bkZpZWxkU2V0IG93bnMgZmllbGRzIHBvaW50ZXIuIFN1YiBVbmtub3duRmllbGRTZXQKKyAgLy8gZG9lcyBub3Qgb3duIGZpZWxkcyBwb2ludGVyLgorICBVbmtub3duRmllbGRTZXQqIGZpZWxkczsKK307CisKK3N0cnVjdCBQeVVua25vd25GaWVsZCB7CisgIFB5T2JqZWN0X0hFQUQ7CisgIC8vIEV2ZXJ5IFB5dGhvbiBQeVVua25vd25GaWVsZCBob2xkcyBhIHJlZmVyZW5jZSB0byBpdHMgcGFyZW50CisgIC8vIFB5VW5rbm93bkZpZWxkU2V0IGluIG9yZGVyIHRvIGtlZXAgaXQgYWxpdmUuCisgIFB5VW5rbm93bkZpZWxkU2V0KiBwYXJlbnQ7CisKKyAgLy8gVGhlIFVua25vd25GaWVsZCBpbmRleCBpbiBVbmtub3duRmllbGRTZXQuCisgIFB5X3NzaXplX3QgaW5kZXg7Cit9OworCitleHRlcm4gUHlUeXBlT2JqZWN0IFB5VW5rbm93bkZpZWxkU2V0X1R5cGU7CitleHRlcm4gUHlUeXBlT2JqZWN0IFB5VW5rbm93bkZpZWxkX1R5cGU7CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX1VOS05PV05fRklFTERfU0VUX0hfXwpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC91bmtub3duX2ZpZWxkcy5jYyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvdW5rbm93bl9maWVsZHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkNjNiMgotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvdW5rbm93bl9maWVsZHMuY2MKQEAgLTAsMCArMSwzNjMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3Vua25vd25fZmllbGRzLmg+CisKKyNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgorI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3Njb3BlZF9weW9iamVjdF9wdHIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgcHl0aG9uIHsKKworbmFtZXNwYWNlIHVua25vd25fZmllbGRzIHsKKworc3RhdGljIFB5X3NzaXplX3QgTGVuKFB5T2JqZWN0KiBwc2VsZikgeworICBQeVVua25vd25GaWVsZHMqIHNlbGYgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeVVua25vd25GaWVsZHMqPihwc2VsZik7CisgIGlmIChzZWxmLT5maWVsZHMgPT0gbnVsbHB0cikgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAiVW5rbm93bkZpZWxkcyBkb2VzIG5vdCBleGlzdC4gIgorICAgICAgICAgICAgICAgICAiVGhlIHBhcmVudCBtZXNzYWdlIG1pZ2h0IGJlIGNsZWFyZWQuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiBzZWxmLT5maWVsZHMtPmZpZWxkX2NvdW50KCk7Cit9CisKK3ZvaWQgQ2xlYXIoUHlVbmtub3duRmllbGRzKiBzZWxmKSB7CisgIGZvciAoc3RkOjpzZXQ8UHlVbmtub3duRmllbGRzKj46Oml0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgc2VsZi0+c3ViX3Vua25vd25fZmllbGRzLmJlZ2luKCk7CisgICAgICAgaXQgIT0gc2VsZi0+c3ViX3Vua25vd25fZmllbGRzLmVuZCgpOyBpdCsrKSB7CisgICAgQ2xlYXIoKml0KTsKKyAgfQorICBzZWxmLT5maWVsZHMgPSBudWxscHRyOworICBzZWxmLT5zdWJfdW5rbm93bl9maWVsZHMuY2xlYXIoKTsKK30KKworUHlPYmplY3QqIE5ld1B5VW5rbm93bkZpZWxkUmVmKFB5VW5rbm93bkZpZWxkcyogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgaW5kZXgpOworCitzdGF0aWMgUHlPYmplY3QqIEl0ZW0oUHlPYmplY3QqIHBzZWxmLCBQeV9zc2l6ZV90IGluZGV4KSB7CisgIFB5VW5rbm93bkZpZWxkcyogc2VsZiA9CisgICAgICByZWludGVycHJldF9jYXN0PFB5VW5rbm93bkZpZWxkcyo+KHBzZWxmKTsKKyAgaWYgKHNlbGYtPmZpZWxkcyA9PSBudWxscHRyKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICJVbmtub3duRmllbGRzIGRvZXMgbm90IGV4aXN0LiAiCisgICAgICAgICAgICAgICAgICJUaGUgcGFyZW50IG1lc3NhZ2UgbWlnaHQgYmUgY2xlYXJlZC4iKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeV9zc2l6ZV90IHRvdGFsX3NpemUgPSBzZWxmLT5maWVsZHMtPmZpZWxkX2NvdW50KCk7CisgIGlmIChpbmRleCA8IDApIHsKKyAgICBpbmRleCA9IHRvdGFsX3NpemUgKyBpbmRleDsKKyAgfQorICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRvdGFsX3NpemUpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgImluZGV4ICglemQpIG91dCBvZiByYW5nZSIsCisgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHJldHVybiB1bmtub3duX2ZpZWxkczo6TmV3UHlVbmtub3duRmllbGRSZWYoc2VsZiwgaW5kZXgpOworfQorCitQeU9iamVjdCogTmV3UHlVbmtub3duRmllbGRzKENNZXNzYWdlKiBjX21lc3NhZ2UpIHsKKyAgUHlVbmtub3duRmllbGRzKiBzZWxmID0gcmVpbnRlcnByZXRfY2FzdDxQeVVua25vd25GaWVsZHMqPigKKyAgICAgIFB5VHlwZV9HZW5lcmljQWxsb2MoJlB5VW5rbm93bkZpZWxkc19UeXBlLCAwKSk7CisgIGlmIChzZWxmID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICAvLyBDYWxsICJwbGFjZW1lbnQgbmV3IiB0byBpbml0aWFsaXplIFB5VW5rbm93bkZpZWxkcy4KKyAgbmV3IChzZWxmKSBQeVVua25vd25GaWVsZHM7CisKKyAgUHlfSU5DUkVGKGNfbWVzc2FnZSk7CisgIHNlbGYtPnBhcmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihjX21lc3NhZ2UpOworICBNZXNzYWdlKiBtZXNzYWdlID0gY19tZXNzYWdlLT5tZXNzYWdlOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBzZWxmLT5maWVsZHMgPSAmcmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcygqbWVzc2FnZSk7CisKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKTsKK30KKworUHlPYmplY3QqIE5ld1B5VW5rbm93bkZpZWxkUmVmKFB5VW5rbm93bkZpZWxkcyogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgaW5kZXgpIHsKKyAgUHlVbmtub3duRmllbGRSZWYqIHNlbGYgPSByZWludGVycHJldF9jYXN0PFB5VW5rbm93bkZpZWxkUmVmKj4oCisgICAgICBQeVR5cGVfR2VuZXJpY0FsbG9jKCZQeVVua25vd25GaWVsZFJlZl9UeXBlLCAwKSk7CisgIGlmIChzZWxmID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFB5X0lOQ1JFRihwYXJlbnQpOworICBzZWxmLT5wYXJlbnQgPSBwYXJlbnQ7CisgIHNlbGYtPmluZGV4ID0gaW5kZXg7CisKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKTsKK30KKworc3RhdGljIHZvaWQgRGVhbGxvYyhQeU9iamVjdCogcHNlbGYpIHsKKyAgUHlVbmtub3duRmllbGRzKiBzZWxmID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlVbmtub3duRmllbGRzKj4ocHNlbGYpOworICBpZiAoUHlPYmplY3RfVHlwZUNoZWNrKHNlbGYtPnBhcmVudCwgJlB5VW5rbm93bkZpZWxkc19UeXBlKSkgeworICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlVbmtub3duRmllbGRzKj4oCisgICAgICAgIHNlbGYtPnBhcmVudCktPnN1Yl91bmtub3duX2ZpZWxkcy5lcmFzZShzZWxmKTsKKyAgfSBlbHNlIHsKKyAgICByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4oc2VsZi0+cGFyZW50KS0+dW5rbm93bl9maWVsZF9zZXQgPSBudWxscHRyOworICB9CisgIFB5X0NMRUFSKHNlbGYtPnBhcmVudCk7CisgIGF1dG8qIHB5X3R5cGUgPSBQeV9UWVBFKHBzZWxmKTsKKyAgc2VsZi0+flB5VW5rbm93bkZpZWxkcygpOworICBweV90eXBlLT50cF9mcmVlKHBzZWxmKTsKK30KKworc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIFNxTWV0aG9kcyA9IHsKKyAgICBMZW4sICAgICAvKiBzcV9sZW5ndGggKi8KKyAgICBudWxscHRyLCAvKiBzcV9jb25jYXQgKi8KKyAgICBudWxscHRyLCAvKiBzcV9yZXBlYXQgKi8KKyAgICBJdGVtLCAgICAvKiBzcV9pdGVtICovCisgICAgbnVsbHB0ciwgLyogc3Ffc2xpY2UgKi8KKyAgICBudWxscHRyLCAvKiBzcV9hc3NfaXRlbSAqLworfTsKKworfSAgLy8gbmFtZXNwYWNlIHVua25vd25fZmllbGRzCisKK1B5VHlwZU9iamVjdCBQeVVua25vd25GaWVsZHNfVHlwZSA9IHsKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKSBGVUxMX01PRFVMRV9OQU1FCisgICAgIi5QeVVua25vd25GaWVsZHMiLCAgICAgICAvLyB0cF9uYW1lCisgICAgc2l6ZW9mKFB5VW5rbm93bkZpZWxkcyksICAvLyB0cF9iYXNpY3NpemUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVtc2l6ZQorICAgIHVua25vd25fZmllbGRzOjpEZWFsbG9jLCAgLy8gIHRwX2RlYWxsb2MKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwODAwMDAKKyAgICBudWxscHRyLCAgLy8gdHBfcHJpbnQKKyNlbHNlCisgICAgMCwgIC8vIHRwX3ZlY3RvcmNhbGxfb2Zmc2V0CisjZW5kaWYKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9zZXRhdHRyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NvbXBhcmUKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcmVwcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19udW1iZXIKKyAgICAmdW5rbm93bl9maWVsZHM6OlNxTWV0aG9kcywgICAvLyAgdHBfYXNfc2VxdWVuY2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfbWFwcGluZworICAgIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwgIC8vICB0cF9oYXNoCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NhbGwKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc3RyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3NldGF0dHJvCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2FzX2J1ZmZlcgorICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgIC8vICB0cF9mbGFncworICAgICJ1bmtub3duIGZpZWxkIHNldCIsICAgICAgICAgIC8vICB0cF9kb2MKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfdHJhdmVyc2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY2xlYXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcmljaGNvbXBhcmUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfd2Vha2xpc3RvZmZzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlcgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVybmV4dAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9tZXRob2RzCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX21lbWJlcnMKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0c2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Jhc2UKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGljdAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9nZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGVzY3Jfc2V0CisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3RvZmZzZXQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaW5pdAorfTsKKworbmFtZXNwYWNlIHVua25vd25fZmllbGQgeworc3RhdGljIFB5T2JqZWN0KiBQeVVua25vd25GaWVsZHNfRnJvbVVua25vd25GaWVsZFNldCgKKyAgICBQeVVua25vd25GaWVsZHMqIHBhcmVudCwgY29uc3QgVW5rbm93bkZpZWxkU2V0JiBmaWVsZHMpIHsKKyAgUHlVbmtub3duRmllbGRzKiBzZWxmID0gcmVpbnRlcnByZXRfY2FzdDxQeVVua25vd25GaWVsZHMqPigKKyAgICAgIFB5VHlwZV9HZW5lcmljQWxsb2MoJlB5VW5rbm93bkZpZWxkc19UeXBlLCAwKSk7CisgIGlmIChzZWxmID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICAvLyBDYWxsICJwbGFjZW1lbnQgbmV3IiB0byBpbml0aWFsaXplIFB5VW5rbm93bkZpZWxkcy4KKyAgbmV3IChzZWxmKSBQeVVua25vd25GaWVsZHM7CisKKyAgUHlfSU5DUkVGKHBhcmVudCk7CisgIHNlbGYtPnBhcmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihwYXJlbnQpOworICBzZWxmLT5maWVsZHMgPSAmZmllbGRzOworICBwYXJlbnQtPnN1Yl91bmtub3duX2ZpZWxkcy5lbXBsYWNlKHNlbGYpOworCisgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZik7Cit9CisKK2NvbnN0IFVua25vd25GaWVsZCogR2V0VW5rbm93bkZpZWxkKFB5VW5rbm93bkZpZWxkUmVmKiBzZWxmKSB7CisgIGNvbnN0IFVua25vd25GaWVsZFNldCogZmllbGRzID0gc2VsZi0+cGFyZW50LT5maWVsZHM7CisgIGlmIChmaWVsZHMgPT0gbnVsbHB0cikgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAiVW5rbm93bkZpZWxkIGRvZXMgbm90IGV4aXN0LiAiCisgICAgICAgICAgICAgICAgICJUaGUgcGFyZW50IG1lc3NhZ2UgbWlnaHQgYmUgY2xlYXJlZC4iKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBQeV9zc2l6ZV90IHRvdGFsX3NpemUgPSBmaWVsZHMtPmZpZWxkX2NvdW50KCk7CisgIGlmIChzZWxmLT5pbmRleCA+PSB0b3RhbF9zaXplKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICJVbmtub3duRmllbGQgZG9lcyBub3QgZXhpc3QuICIKKyAgICAgICAgICAgICAgICAgIlRoZSBwYXJlbnQgbWVzc2FnZSBtaWdodCBiZSBjbGVhcmVkLiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiAmZmllbGRzLT5maWVsZChzZWxmLT5pbmRleCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogR2V0RmllbGROdW1iZXIoUHlVbmtub3duRmllbGRSZWYqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgY29uc3QgVW5rbm93bkZpZWxkKiB1bmtub3duX2ZpZWxkID0gR2V0VW5rbm93bkZpZWxkKHNlbGYpOworICBpZiAodW5rbm93bl9maWVsZCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh1bmtub3duX2ZpZWxkLT5udW1iZXIoKSk7Cit9CisKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTsKK3N0YXRpYyBQeU9iamVjdCogR2V0V2lyZVR5cGUoUHlVbmtub3duRmllbGRSZWYqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKKyAgY29uc3QgVW5rbm93bkZpZWxkKiB1bmtub3duX2ZpZWxkID0gR2V0VW5rbm93bkZpZWxkKHNlbGYpOworICBpZiAodW5rbm93bl9maWVsZCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBBc3NpZ24gYSBkZWZhdWx0IHZhbHVlIHRvIHN1cHByZXNzIG1heS11bmluaXRpYWxpemVkIHdhcm5pbmdzIChlcnJvcnMKKyAgLy8gd2hlbiBidWlsdCBpbiBzb21lIHBsYWNlcykuCisgIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSB3aXJlX3R5cGUgPSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UOworICBzd2l0Y2ggKHVua25vd25fZmllbGQtPnR5cGUoKSkgeworICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVDoKKyAgICAgIHdpcmVfdHlwZSA9IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyOgorICAgICAgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0OgorICAgICAgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOgorICAgICAgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9HUk9VUDoKKyAgICAgIHdpcmVfdHlwZSA9IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9TVEFSVF9HUk9VUDsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcod2lyZV90eXBlKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBHZXREYXRhKFB5VW5rbm93bkZpZWxkUmVmKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIGNvbnN0IFVua25vd25GaWVsZCogZmllbGQgPSBHZXRVbmtub3duRmllbGQoc2VsZik7CisgIGlmIChmaWVsZCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgUHlPYmplY3QqIGRhdGEgPSBudWxscHRyOworICBzd2l0Y2ggKGZpZWxkLT50eXBlKCkpIHsKKyAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQ6CisgICAgICBkYXRhID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKGZpZWxkLT52YXJpbnQoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyOgorICAgICAgZGF0YSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKGZpZWxkLT5maXhlZDMyKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQ2NDoKKyAgICAgIGRhdGEgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoZmllbGQtPmZpeGVkNjQoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOgorICAgICAgZGF0YSA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoZmllbGQtPmxlbmd0aF9kZWxpbWl0ZWQoKS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+R2V0TGVuZ3RoRGVsaW1pdGVkU2l6ZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOgorICAgICAgZGF0YSA9IFB5VW5rbm93bkZpZWxkc19Gcm9tVW5rbm93bkZpZWxkU2V0KAorICAgICAgICAgIHNlbGYtPnBhcmVudCwgZmllbGQtPmdyb3VwKCkpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIERlYWxsb2MoUHlPYmplY3QqIHBzZWxmKSB7CisgIFB5VW5rbm93bkZpZWxkUmVmKiBzZWxmID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlVbmtub3duRmllbGRSZWYqPihwc2VsZik7CisgIFB5X0NMRUFSKHNlbGYtPnBhcmVudCk7Cit9CisKK3N0YXRpYyBQeUdldFNldERlZiBHZXR0ZXJzW10gPSB7CisgICAgeyJmaWVsZF9udW1iZXIiLCAoZ2V0dGVyKUdldEZpZWxkTnVtYmVyLCBudWxscHRyfSwKKyAgICB7IndpcmVfdHlwZSIsIChnZXR0ZXIpR2V0V2lyZVR5cGUsIG51bGxwdHJ9LAorICAgIHsiZGF0YSIsIChnZXR0ZXIpR2V0RGF0YSwgbnVsbHB0cn0sCisgICAge251bGxwdHJ9LAorfTsKKworfSAgLy8gbmFtZXNwYWNlIHVua25vd25fZmllbGQKKworUHlUeXBlT2JqZWN0IFB5VW5rbm93bkZpZWxkUmVmX1R5cGUgPSB7CisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkgRlVMTF9NT0RVTEVfTkFNRQorICAgICIuUHlVbmtub3duRmllbGRSZWYiLCAgICAgICAvLyB0cF9uYW1lCisgICAgc2l6ZW9mKFB5VW5rbm93bkZpZWxkUmVmKSwgIC8vICB0cF9iYXNpY3NpemUKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2l0ZW1zaXplCisgICAgdW5rbm93bl9maWVsZDo6RGVhbGxvYywgICAgIC8vICB0cF9kZWFsbG9jCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDgwMDAwCisgICAgbnVsbHB0ciwgIC8vIHRwX3ByaW50CisjZWxzZQorICAgIDAsICAvLyB0cF92ZWN0b3JjYWxsX29mZnNldAorI2VuZGlmCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9jb21wYXJlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3JlcHIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfbnVtYmVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2FzX3NlcXVlbmNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2FzX21hcHBpbmcKKyAgICBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQsICAvLyAgdHBfaGFzaAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9jYWxsCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3N0cgorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9zZXRhdHRybworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19idWZmZXIKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAvLyAgdHBfZmxhZ3MKKyAgICAidW5rbm93biBmaWVsZCIsICAgICAgICAgICAgICAvLyAgdHBfZG9jCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3RyYXZlcnNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NsZWFyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3JpY2hjb21wYXJlCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3dlYWtsaXN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2l0ZXIKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlcm5leHQKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfbWV0aG9kcworICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9tZW1iZXJzCisgICAgdW5rbm93bl9maWVsZDo6R2V0dGVycywgICAgICAgLy8gIHRwX2dldHNldAorICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9iYXNlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3QKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGVzY3JfZ2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX3NldAorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kaWN0b2Zmc2V0CisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2luaXQKK307CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC91bmtub3duX2ZpZWxkcy5oIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC91bmtub3duX2ZpZWxkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YjBiMzUKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3Vua25vd25fZmllbGRzLmgKQEAgLTAsMCArMSw5MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfVU5LTk9XTl9GSUVMRFNfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX1VOS05PV05fRklFTERTX0hfXworCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIFVua25vd25GaWVsZDsKK2NsYXNzIFVua25vd25GaWVsZFNldDsKKworbmFtZXNwYWNlIHB5dGhvbiB7CitzdHJ1Y3QgQ01lc3NhZ2U7CisKK3R5cGVkZWYgc3RydWN0IFB5VW5rbm93bkZpZWxkcyB7CisgIFB5T2JqZWN0X0hFQUQ7CisgIC8vIFN0cm9uZyBwb2ludGVyIHRvIHRoZSBwYXJlbnQgQ01lc3NhZ2Ugb3IgUHlVbmtub3duRmllbGRzLgorICAvLyBUaGUgdG9wIFB5VW5rbm93bkZpZWxkcyBob2xkcyBhIHJlZmVyZW5jZSB0byBpdHMgcGFyZW50IENNZXNzYWdlCisgIC8vIG9iamVjdCBiZWZvcmUgcmVsZWFzZS4KKyAgLy8gU3ViIFB5VW5rbm93bkZpZWxkcyBob2xkcyByZWZlcmVuY2UgdG8gcGFyZW50IFB5VW5rbm93bkZpZWxkcy4KKyAgUHlPYmplY3QqIHBhcmVudDsKKworICAvLyBQb2ludGVyIHRvIHRoZSBDKysgVW5rbm93bkZpZWxkU2V0LgorICAvLyBQeVVua25vd25GaWVsZHMgZG9lcyBub3Qgb3duIHRoaXMgcG9pbnRlci4KKyAgY29uc3QgVW5rbm93bkZpZWxkU2V0KiBmaWVsZHM7CisKKyAgLy8gV2VhayByZWZlcmVuY2VzIHRvIGNoaWxkIHVua25vd24gZmllbGRzLgorICBzdGQ6OnNldDxQeVVua25vd25GaWVsZHMqPiBzdWJfdW5rbm93bl9maWVsZHM7Cit9IFB5VW5rbm93bkZpZWxkczsKKwordHlwZWRlZiBzdHJ1Y3QgUHlVbmtub3duRmllbGRSZWYgeworICBQeU9iamVjdF9IRUFEOworICAvLyBFdmVyeSBQeXRob24gUHlVbmtub3duRmllbGRSZWYgaG9sZHMgYSByZWZlcmVuY2UgdG8gaXRzIHBhcmVudAorICAvLyBQeVVua25vd25GaWVsZHMgaW4gb3JkZXIgdG8ga2VlcCBpdCBhbGl2ZS4KKyAgUHlVbmtub3duRmllbGRzKiBwYXJlbnQ7CisKKyAgLy8gVGhlIFVua25vd25GaWVsZCBpbmRleCBpbiBVbmtub3duRmllbGRzLgorICBQeV9zc2l6ZV90IGluZGV4OworfSBVa25vd25GaWVsZFJlZjsKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBQeVVua25vd25GaWVsZHNfVHlwZTsKK2V4dGVybiBQeVR5cGVPYmplY3QgUHlVbmtub3duRmllbGRSZWZfVHlwZTsKKworbmFtZXNwYWNlIHVua25vd25fZmllbGRzIHsKKworLy8gQnVpbGRzIGFuIFB5VW5rbm93bkZpZWxkcyBmb3IgYSBzcGVjaWZpYyBtZXNzYWdlLgorUHlPYmplY3QqIE5ld1B5VW5rbm93bkZpZWxkcyhDTWVzc2FnZSAqcGFyZW50KTsKK3ZvaWQgQ2xlYXIoUHlVbmtub3duRmllbGRzKiBzZWxmKTsKKworfSAgLy8gbmFtZXNwYWNlIHVua25vd25fZmllbGRzCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9VTktOT1dOX0ZJRUxEU19IX18KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHl0aG9uX3Byb3RvYnVmLmggYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5dGhvbl9wcm90b2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmY2YwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5dGhvbl9wcm90b2J1Zi5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHFyY3pha0Bnb29nbGUuY29tIChNYXJjaW4gS293YWxjenlrKQorLy8KKy8vIFRoaXMgbW9kdWxlIGV4cG9zZXMgdGhlIEMgcHJvdG8gaW5zaWRlIHRoZSBnaXZlbiBQeXRob24gcHJvdG8sIGluCisvLyBjYXNlIHRoZSBQeXRob24gcHJvdG8gaXMgaW1wbGVtZW50ZWQgd2l0aCBhIEMgcHJvdG8uCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9QWVRIT05fUFJPVE9CVUZfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fUFlUSE9OX1BST1RPQlVGX0hfXworCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitjbGFzcyBNZXNzYWdlOworCituYW1lc3BhY2UgcHl0aG9uIHsKKworLy8gUmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBDIHByb3RvIGluc2lkZSB0aGUgZ2l2ZW4gUHl0aG9uIHByb3RvLAorLy8gb3IgTlVMTCB3aGVuIHRoaXMgaXMgbm90IGEgUHl0aG9uIHByb3RvIGltcGxlbWVudGVkIHdpdGggYSBDIHByb3RvLgorY29uc3QgTWVzc2FnZSogR2V0Q1Byb3RvSW5zaWRlUHlQcm90byhQeU9iamVjdCogbXNnKTsKK01lc3NhZ2UqIE11dGFibGVDUHJvdG9JbnNpZGVQeVByb3RvKFB5T2JqZWN0KiBtc2cpOworCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX1BZVEhPTl9QUk9UT0JVRl9IX18KZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbi5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWUxODg1Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLnB5CkBAIC0wLDAgKzEsOTUgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBUaGlzIGNvZGUgaXMgbWVhbnQgdG8gd29yayBvbiBQeXRob24gMi40IGFuZCBhYm92ZSBvbmx5LgorCisiIiJDb250YWlucyBhIG1ldGFjbGFzcyBhbmQgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIHRvIGNyZWF0ZQorcHJvdG9jb2wgbWVzc2FnZSBjbGFzc2VzIGZyb20gRGVzY3JpcHRvciBvYmplY3RzIGF0IHJ1bnRpbWUuCisKK1JlY2FsbCB0aGF0IGEgbWV0YWNsYXNzIGlzIHRoZSAidHlwZSIgb2YgYSBjbGFzcy4KKyhBIGNsYXNzIGlzIHRvIGEgbWV0YWNsYXNzIHdoYXQgYW4gaW5zdGFuY2UgaXMgdG8gYSBjbGFzcy4pCisKK0luIHRoaXMgY2FzZSwgd2UgdXNlIHRoZSBHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlIG1ldGFjbGFzcwordG8gaW5qZWN0IGFsbCB0aGUgdXNlZnVsIGZ1bmN0aW9uYWxpdHkgaW50byB0aGUgY2xhc3Nlcworb3V0cHV0IGJ5IHRoZSBwcm90b2NvbCBjb21waWxlciBhdCBjb21waWxlLXRpbWUuCisKK1RoZSB1cHNob3Qgb2YgYWxsIHRoaXMgaXMgdGhhdCB0aGUgcmVhbCBpbXBsZW1lbnRhdGlvbgorZGV0YWlscyBmb3IgQUxMIHB1cmUtUHl0aG9uIHByb3RvY29sIGJ1ZmZlcnMgYXJlICpoZXJlIGluCit0aGlzIGZpbGUqLgorIiIiCisKK19fYXV0aG9yX18gPSAncm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbiknCisKKworZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2VfZmFjdG9yeQorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHN5bWJvbF9kYXRhYmFzZQorCisjIFRoZSB0eXBlIG9mIGFsbCBNZXNzYWdlIGNsYXNzZXMuCisjIFBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UsIGJ1dCBub3JtYWxseSBvbmx5IHVzZWQgYnkgbWVzc2FnZSBmYWN0b3JpZXMuCitHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlID0gbWVzc2FnZV9mYWN0b3J5Ll9HRU5FUkFURURfUFJPVE9DT0xfTUVTU0FHRV9UWVBFCisKK01FU1NBR0VfQ0xBU1NfQ0FDSEUgPSB7fQorCisKKyMgRGVwcmVjYXRlZC4gUGxlYXNlIE5FVkVSIHVzZSByZWZsZWN0aW9uLlBhcnNlTWVzc2FnZSgpLgorZGVmIFBhcnNlTWVzc2FnZShkZXNjcmlwdG9yLCBieXRlX3N0cik6CisgICIiIkdlbmVyYXRlIGEgbmV3IE1lc3NhZ2UgaW5zdGFuY2UgZnJvbSB0aGlzIERlc2NyaXB0b3IgYW5kIGEgYnl0ZSBzdHJpbmcuCisKKyAgREVQUkVDQVRFRDogUGFyc2VNZXNzYWdlIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBpdCBpcyB1c2luZyBNYWtlQ2xhc3MoKS4KKyAgUGxlYXNlIHVzZSBNZXNzYWdlRmFjdG9yeS5HZXRQcm90b3R5cGUoKSBpbnN0ZWFkLgorCisgIEFyZ3M6CisgICAgZGVzY3JpcHRvcjogUHJvdG9idWYgRGVzY3JpcHRvciBvYmplY3QKKyAgICBieXRlX3N0cjogU2VyaWFsaXplZCBwcm90b2NvbCBidWZmZXIgYnl0ZSBzdHJpbmcKKworICBSZXR1cm5zOgorICAgIE5ld2x5IGNyZWF0ZWQgcHJvdG9idWYgTWVzc2FnZSBvYmplY3QuCisgICIiIgorICByZXN1bHRfY2xhc3MgPSBNYWtlQ2xhc3MoZGVzY3JpcHRvcikKKyAgbmV3X21zZyA9IHJlc3VsdF9jbGFzcygpCisgIG5ld19tc2cuUGFyc2VGcm9tU3RyaW5nKGJ5dGVfc3RyKQorICByZXR1cm4gbmV3X21zZworCisKKyMgRGVwcmVjYXRlZC4gUGxlYXNlIE5FVkVSIHVzZSByZWZsZWN0aW9uLk1ha2VDbGFzcygpLgorZGVmIE1ha2VDbGFzcyhkZXNjcmlwdG9yKToKKyAgIiIiQ29uc3RydWN0IGEgY2xhc3Mgb2JqZWN0IGZvciBhIHByb3RvYnVmIGRlc2NyaWJlZCBieSBkZXNjcmlwdG9yLgorCisgIERFUFJFQ0FURUQ6IHVzZSBNZXNzYWdlRmFjdG9yeS5HZXRQcm90b3R5cGUoKSBpbnN0ZWFkLgorCisgIEFyZ3M6CisgICAgZGVzY3JpcHRvcjogQSBkZXNjcmlwdG9yLkRlc2NyaXB0b3Igb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHByb3RvYnVmLgorICBSZXR1cm5zOgorICAgIFRoZSBNZXNzYWdlIGNsYXNzIG9iamVjdCBkZXNjcmliZWQgYnkgdGhlIGRlc2NyaXB0b3IuCisgICIiIgorICAjIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGxlYWRzIHRvIGR1cGxpY2F0ZSBtZXNzYWdlIGNsYXNzZXMsIHdoaWNoIHdvbid0IHBsYXkKKyAgIyB3ZWxsIHdpdGggZXh0ZW5zaW9ucy4gTWVzc2FnZSBmYWN0b3J5IGluZm8gaXMgYWxzbyBtaXNzaW5nLgorICAjIFJlZGlyZWN0IHRvIG1lc3NhZ2VfZmFjdG9yeS4KKyAgcmV0dXJuIHN5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkuR2V0UHJvdG90eXBlKGRlc2NyaXB0b3IpCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyNTI0NgotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZS5weQpAQCAtMCwwICsxLDIyOCBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJERVBSRUNBVEVEOiAgRGVjbGFyZXMgdGhlIFJQQyBzZXJ2aWNlIGludGVyZmFjZXMuCisKK1RoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBhYnN0cmFjdCBpbnRlcmZhY2VzIHVuZGVybHlpbmcgcHJvdG8yIFJQQworc2VydmljZXMuICBUaGVzZSBhcmUgaW50ZW5kZWQgdG8gYmUgaW5kZXBlbmRlbnQgb2YgYW55IHBhcnRpY3VsYXIgUlBDCitpbXBsZW1lbnRhdGlvbiwgc28gdGhhdCBwcm90bzIgc2VydmljZXMgY2FuIGJlIHVzZWQgb24gdG9wIG9mIGEgdmFyaWV0eQorb2YgaW1wbGVtZW50YXRpb25zLiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDIuMy4wLCBSUEMgaW1wbGVtZW50YXRpb25zIHNob3VsZAorbm90IHRyeSB0byBidWlsZCBvbiB0aGVzZSwgYnV0IHNob3VsZCBpbnN0ZWFkIHByb3ZpZGUgY29kZSBnZW5lcmF0b3IgcGx1Z2lucword2hpY2ggZ2VuZXJhdGUgY29kZSBzcGVjaWZpYyB0byB0aGUgcGFydGljdWxhciBSUEMgaW1wbGVtZW50YXRpb24uICBUaGlzIHdheQordGhlIGdlbmVyYXRlZCBjb2RlIGNhbiBiZSBtb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgaW1wbGVtZW50YXRpb24gaW4gdXNlCithbmQgY2FuIGF2b2lkIHVubmVjZXNzYXJ5IGxheWVycyBvZiBpbmRpcmVjdGlvbi4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3BldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdiknCisKKworY2xhc3MgUnBjRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICIiIkV4Y2VwdGlvbiByYWlzZWQgb24gZmFpbGVkIGJsb2NraW5nIFJQQyBtZXRob2QgY2FsbC4iIiIKKyAgcGFzcworCisKK2NsYXNzIFNlcnZpY2Uob2JqZWN0KToKKworICAiIiJBYnN0cmFjdCBiYXNlIGludGVyZmFjZSBmb3IgcHJvdG9jb2wtYnVmZmVyLWJhc2VkIFJQQyBzZXJ2aWNlcy4KKworICBTZXJ2aWNlcyB0aGVtc2VsdmVzIGFyZSBhYnN0cmFjdCBjbGFzc2VzIChpbXBsZW1lbnRlZCBlaXRoZXIgYnkgc2VydmVycyBvciBhcworICBzdHVicyksIGJ1dCB0aGV5IHN1YmNsYXNzIHRoaXMgYmFzZSBpbnRlcmZhY2UuIFRoZSBtZXRob2RzIG9mIHRoaXMKKyAgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHRvIGNhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIHNlcnZpY2Ugd2l0aG91dCBrbm93aW5nCisgIGl0cyBleGFjdCB0eXBlIGF0IGNvbXBpbGUgdGltZSAoYW5hbG9nb3VzIHRvIHRoZSBNZXNzYWdlIGludGVyZmFjZSkuCisgICIiIgorCisgIGRlZiBHZXREZXNjcmlwdG9yKCk6CisgICAgIiIiUmV0cmlldmVzIHRoaXMgc2VydmljZSdzIGRlc2NyaXB0b3IuIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBDYWxsTWV0aG9kKHNlbGYsIG1ldGhvZF9kZXNjcmlwdG9yLCBycGNfY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgcmVxdWVzdCwgZG9uZSk6CisgICAgIiIiQ2FsbHMgYSBtZXRob2Qgb2YgdGhlIHNlcnZpY2Ugc3BlY2lmaWVkIGJ5IG1ldGhvZF9kZXNjcmlwdG9yLgorCisgICAgSWYgImRvbmUiIGlzIE5vbmUgdGhlbiB0aGUgY2FsbCBpcyBibG9ja2luZyBhbmQgdGhlIHJlc3BvbnNlCisgICAgbWVzc2FnZSB3aWxsIGJlIHJldHVybmVkIGRpcmVjdGx5LiAgT3RoZXJ3aXNlIHRoZSBjYWxsIGlzIGFzeW5jaHJvbm91cworICAgIGFuZCAiZG9uZSIgd2lsbCBsYXRlciBiZSBjYWxsZWQgd2l0aCB0aGUgcmVzcG9uc2UgdmFsdWUuCisKKyAgICBJbiB0aGUgYmxvY2tpbmcgY2FzZSwgUnBjRXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIG9uIGVycm9yLgorCisgICAgUHJlY29uZGl0aW9uczoKKworICAgICogbWV0aG9kX2Rlc2NyaXB0b3Iuc2VydmljZSA9PSBHZXREZXNjcmlwdG9yCisgICAgKiByZXF1ZXN0IGlzIG9mIHRoZSBleGFjdCBzYW1lIGNsYXNzZXMgYXMgcmV0dXJuZWQgYnkKKyAgICAgIEdldFJlcXVlc3RDbGFzcyhtZXRob2QpLgorICAgICogQWZ0ZXIgdGhlIGNhbGwgaGFzIHN0YXJ0ZWQsIHRoZSByZXF1ZXN0IG11c3Qgbm90IGJlIG1vZGlmaWVkLgorICAgICogInJwY19jb250cm9sbGVyIiBpcyBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGUgUlBDIGltcGxlbWVudGF0aW9uIGJlaW5nCisgICAgICB1c2VkIGJ5IHRoaXMgU2VydmljZS4gIEZvciBzdHVicywgdGhlICJjb3JyZWN0IHR5cGUiIGRlcGVuZHMgb24gdGhlCisgICAgICBScGNDaGFubmVsIHdoaWNoIHRoZSBzdHViIGlzIHVzaW5nLgorCisgICAgUG9zdGNvbmRpdGlvbnM6CisKKyAgICAqICJkb25lIiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBtZXRob2QgaXMgY29tcGxldGUuICBUaGlzIG1heSBiZQorICAgICAgYmVmb3JlIENhbGxNZXRob2QoKSByZXR1cm5zIG9yIGl0IG1heSBiZSBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCisgICAgKiBJZiB0aGUgUlBDIGZhaWxlZCwgdGhlIHJlc3BvbnNlIHZhbHVlIHBhc3NlZCB0byAiZG9uZSIgd2lsbCBiZSBOb25lLgorICAgICAgRnVydGhlciBkZXRhaWxzIGFib3V0IHRoZSBmYWlsdXJlIGNhbiBiZSBmb3VuZCBieSBxdWVyeWluZyB0aGUKKyAgICAgIFJwY0NvbnRyb2xsZXIuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBHZXRSZXF1ZXN0Q2xhc3Moc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IpOgorICAgICIiIlJldHVybnMgdGhlIGNsYXNzIG9mIHRoZSByZXF1ZXN0IG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgbWV0aG9kLgorCisgICAgQ2FsbE1ldGhvZCgpIHJlcXVpcmVzIHRoYXQgdGhlIHJlcXVlc3QgaXMgb2YgYSBwYXJ0aWN1bGFyIHN1YmNsYXNzIG9mCisgICAgTWVzc2FnZS4gR2V0UmVxdWVzdENsYXNzKCkgZ2V0cyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGlzIHJlcXVpcmVkCisgICAgdHlwZS4KKworICAgIEV4YW1wbGU6CisgICAgICBtZXRob2QgPSBzZXJ2aWNlLkdldERlc2NyaXB0b3IoKS5GaW5kTWV0aG9kQnlOYW1lKCJGb28iKQorICAgICAgcmVxdWVzdCA9IHN0dWIuR2V0UmVxdWVzdENsYXNzKG1ldGhvZCkoKQorICAgICAgcmVxdWVzdC5QYXJzZUZyb21TdHJpbmcoaW5wdXQpCisgICAgICBzZXJ2aWNlLkNhbGxNZXRob2QobWV0aG9kLCByZXF1ZXN0LCBjYWxsYmFjaykKKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIEdldFJlc3BvbnNlQ2xhc3Moc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IpOgorICAgICIiIlJldHVybnMgdGhlIGNsYXNzIG9mIHRoZSByZXNwb25zZSBtZXNzYWdlIGZvciB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KKworICAgIFRoaXMgbWV0aG9kIGlzbid0IHJlYWxseSBuZWVkZWQsIGFzIHRoZSBScGNDaGFubmVsJ3MgQ2FsbE1ldGhvZCBjb25zdHJ1Y3RzCisgICAgdGhlIHJlc3BvbnNlIHByb3RvY29sIG1lc3NhZ2UuIEl0J3MgcHJvdmlkZWQgYW55d2F5IGluIGNhc2UgaXQgaXMgdXNlZnVsCisgICAgZm9yIHRoZSBjYWxsZXIgdG8ga25vdyB0aGUgcmVzcG9uc2UgdHlwZSBpbiBhZHZhbmNlLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCitjbGFzcyBScGNDb250cm9sbGVyKG9iamVjdCk6CisKKyAgIiIiQW4gUnBjQ29udHJvbGxlciBtZWRpYXRlcyBhIHNpbmdsZSBtZXRob2QgY2FsbC4KKworICBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoZSBjb250cm9sbGVyIGlzIHRvIHByb3ZpZGUgYSB3YXkgdG8gbWFuaXB1bGF0ZQorICBzZXR0aW5ncyBzcGVjaWZpYyB0byB0aGUgUlBDIGltcGxlbWVudGF0aW9uIGFuZCB0byBmaW5kIG91dCBhYm91dCBSUEMtbGV2ZWwKKyAgZXJyb3JzLiBUaGUgbWV0aG9kcyBwcm92aWRlZCBieSB0aGUgUnBjQ29udHJvbGxlciBpbnRlcmZhY2UgYXJlIGludGVuZGVkCisgIHRvIGJlIGEgImxlYXN0IGNvbW1vbiBkZW5vbWluYXRvciIgc2V0IG9mIGZlYXR1cmVzIHdoaWNoIHdlIGV4cGVjdCBhbGwKKyAgaW1wbGVtZW50YXRpb25zIHRvIHN1cHBvcnQuICBTcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgbWF5IHByb3ZpZGUgbW9yZQorICBhZHZhbmNlZCBmZWF0dXJlcyAoZS5nLiBkZWFkbGluZSBwcm9wYWdhdGlvbikuCisgICIiIgorCisgICMgQ2xpZW50LXNpZGUgbWV0aG9kcyBiZWxvdworCisgIGRlZiBSZXNldChzZWxmKToKKyAgICAiIiJSZXNldHMgdGhlIFJwY0NvbnRyb2xsZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUuCisKKyAgICBBZnRlciB0aGUgUnBjQ29udHJvbGxlciBoYXMgYmVlbiByZXNldCwgaXQgbWF5IGJlIHJldXNlZCBpbgorICAgIGEgbmV3IGNhbGwuIE11c3Qgbm90IGJlIGNhbGxlZCB3aGlsZSBhbiBSUEMgaXMgaW4gcHJvZ3Jlc3MuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBGYWlsZWQoc2VsZik6CisgICAgIiIiUmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsIGZhaWxlZC4KKworICAgIEFmdGVyIGEgY2FsbCBoYXMgZmluaXNoZWQsIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbCBmYWlsZWQuICBUaGUgcG9zc2libGUKKyAgICByZWFzb25zIGZvciBmYWlsdXJlIGRlcGVuZCBvbiB0aGUgUlBDIGltcGxlbWVudGF0aW9uLiAgRmFpbGVkKCkgbXVzdCBub3QKKyAgICBiZSBjYWxsZWQgYmVmb3JlIGEgY2FsbCBoYXMgZmluaXNoZWQuICBJZiBGYWlsZWQoKSByZXR1cm5zIHRydWUsIHRoZQorICAgIGNvbnRlbnRzIG9mIHRoZSByZXNwb25zZSBtZXNzYWdlIGFyZSB1bmRlZmluZWQuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBFcnJvclRleHQoc2VsZik6CisgICAgIiIiSWYgRmFpbGVkIGlzIHRydWUsIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBTdGFydENhbmNlbChzZWxmKToKKyAgICAiIiJJbml0aWF0ZSBjYW5jZWxsYXRpb24uCisKKyAgICBBZHZpc2VzIHRoZSBSUEMgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciBkZXNpcmVzIHRoYXQgdGhlIFJQQyBjYWxsIGJlCisgICAgY2FuY2VsZWQuICBUaGUgUlBDIHN5c3RlbSBtYXkgY2FuY2VsIGl0IGltbWVkaWF0ZWx5LCBtYXkgd2FpdCBhd2hpbGUgYW5kCisgICAgdGhlbiBjYW5jZWwgaXQsIG9yIG1heSBub3QgZXZlbiBjYW5jZWwgdGhlIGNhbGwgYXQgYWxsLiAgSWYgdGhlIGNhbGwgaXMKKyAgICBjYW5jZWxlZCwgdGhlICJkb25lIiBjYWxsYmFjayB3aWxsIHN0aWxsIGJlIGNhbGxlZCBhbmQgdGhlIFJwY0NvbnRyb2xsZXIKKyAgICB3aWxsIGluZGljYXRlIHRoYXQgdGhlIGNhbGwgZmFpbGVkIGF0IHRoYXQgdGltZS4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgIyBTZXJ2ZXItc2lkZSBtZXRob2RzIGJlbG93CisKKyAgZGVmIFNldEZhaWxlZChzZWxmLCByZWFzb24pOgorICAgICIiIlNldHMgYSBmYWlsdXJlIHJlYXNvbi4KKworICAgIENhdXNlcyBGYWlsZWQoKSB0byByZXR1cm4gdHJ1ZSBvbiB0aGUgY2xpZW50IHNpZGUuICAicmVhc29uIiB3aWxsIGJlCisgICAgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG1lc3NhZ2UgcmV0dXJuZWQgYnkgRXJyb3JUZXh0KCkuICBJZiB5b3UgZmluZAorICAgIHlvdSBuZWVkIHRvIHJldHVybiBtYWNoaW5lLXJlYWRhYmxlIGluZm9ybWF0aW9uIGFib3V0IGZhaWx1cmVzLCB5b3UKKyAgICBzaG91bGQgaW5jb3Jwb3JhdGUgaXQgaW50byB5b3VyIHJlc3BvbnNlIHByb3RvY29sIGJ1ZmZlciBhbmQgc2hvdWxkCisgICAgTk9UIGNhbGwgU2V0RmFpbGVkKCkuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBJc0NhbmNlbGVkKHNlbGYpOgorICAgICIiIkNoZWNrcyBpZiB0aGUgY2xpZW50IGNhbmNlbGxlZCB0aGUgUlBDLgorCisgICAgSWYgdHJ1ZSwgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCBjYW5jZWxlZCB0aGUgUlBDLCBzbyB0aGUgc2VydmVyIG1heQorICAgIGFzIHdlbGwgZ2l2ZSB1cCBvbiByZXBseWluZyB0byBpdC4gIFRoZSBzZXJ2ZXIgc2hvdWxkIHN0aWxsIGNhbGwgdGhlCisgICAgZmluYWwgImRvbmUiIGNhbGxiYWNrLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgTm90aWZ5T25DYW5jZWwoc2VsZiwgY2FsbGJhY2spOgorICAgICIiIlNldHMgYSBjYWxsYmFjayB0byBpbnZva2Ugb24gY2FuY2VsLgorCisgICAgQXNrcyB0aGF0IHRoZSBnaXZlbiBjYWxsYmFjayBiZSBjYWxsZWQgd2hlbiB0aGUgUlBDIGlzIGNhbmNlbGVkLiAgVGhlCisgICAgY2FsbGJhY2sgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGV4YWN0bHkgb25jZS4gIElmIHRoZSBSUEMgY29tcGxldGVzIHdpdGhvdXQKKyAgICBiZWluZyBjYW5jZWxlZCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGNvbXBsZXRpb24uICBJZiB0aGUgUlBDCisgICAgaGFzIGFscmVhZHkgYmVlbiBjYW5jZWxlZCB3aGVuIE5vdGlmeU9uQ2FuY2VsKCkgaXMgY2FsbGVkLCB0aGUgY2FsbGJhY2sKKyAgICB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseS4KKworICAgIE5vdGlmeU9uQ2FuY2VsKCkgbXVzdCBiZSBjYWxsZWQgbm8gbW9yZSB0aGFuIG9uY2UgcGVyIHJlcXVlc3QuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKK2NsYXNzIFJwY0NoYW5uZWwob2JqZWN0KToKKworICAiIiJBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGFuIFJQQyBjaGFubmVsLgorCisgIEFuIFJwY0NoYW5uZWwgcmVwcmVzZW50cyBhIGNvbW11bmljYXRpb24gbGluZSB0byBhIHNlcnZpY2Ugd2hpY2ggY2FuIGJlIHVzZWQKKyAgdG8gY2FsbCB0aGF0IHNlcnZpY2UncyBtZXRob2RzLiAgVGhlIHNlcnZpY2UgbWF5IGJlIHJ1bm5pbmcgb24gYW5vdGhlcgorICBtYWNoaW5lLiBOb3JtYWxseSwgeW91IHNob3VsZCBub3QgdXNlIGFuIFJwY0NoYW5uZWwgZGlyZWN0bHksIGJ1dCBpbnN0ZWFkCisgIGNvbnN0cnVjdCBhIHN0dWIge0BsaW5rIFNlcnZpY2V9IHdyYXBwaW5nIGl0LiAgRXhhbXBsZToKKworICBFeGFtcGxlOgorICAgIFJwY0NoYW5uZWwgY2hhbm5lbCA9IHJwY0ltcGwuQ2hhbm5lbCgicmVtb3RlaG9zdC5leGFtcGxlLmNvbToxMjM0IikKKyAgICBScGNDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBycGNJbXBsLkNvbnRyb2xsZXIoKQorICAgIE15U2VydmljZSBzZXJ2aWNlID0gTXlTZXJ2aWNlX1N0dWIoY2hhbm5lbCkKKyAgICBzZXJ2aWNlLk15TWV0aG9kKGNvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrKQorICAiIiIKKworICBkZWYgQ2FsbE1ldGhvZChzZWxmLCBtZXRob2RfZGVzY3JpcHRvciwgcnBjX2NvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgIHJlcXVlc3QsIHJlc3BvbnNlX2NsYXNzLCBkb25lKToKKyAgICAiIiJDYWxscyB0aGUgbWV0aG9kIGlkZW50aWZpZWQgYnkgdGhlIGRlc2NyaXB0b3IuCisKKyAgICBDYWxsIHRoZSBnaXZlbiBtZXRob2Qgb2YgdGhlIHJlbW90ZSBzZXJ2aWNlLiAgVGhlIHNpZ25hdHVyZSBvZiB0aGlzCisgICAgcHJvY2VkdXJlIGxvb2tzIHRoZSBzYW1lIGFzIFNlcnZpY2UuQ2FsbE1ldGhvZCgpLCBidXQgdGhlIHJlcXVpcmVtZW50cworICAgIGFyZSBsZXNzIHN0cmljdCBpbiBvbmUgaW1wb3J0YW50IHdheTogIHRoZSByZXF1ZXN0IG9iamVjdCBkb2Vzbid0IGhhdmUgdG8KKyAgICBiZSBvZiBhbnkgc3BlY2lmaWMgY2xhc3MgYXMgbG9uZyBhcyBpdHMgZGVzY3JpcHRvciBpcyBtZXRob2QuaW5wdXRfdHlwZS4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2VfcmVmbGVjdGlvbi5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZV9yZWZsZWN0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MmFiNzEKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2VfcmVmbGVjdGlvbi5weQpAQCAtMCwwICsxLDI5NSBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJDb250YWlucyBtZXRhY2xhc3NlcyB1c2VkIHRvIGNyZWF0ZSBwcm90b2NvbCBzZXJ2aWNlIGFuZCBzZXJ2aWNlIHN0dWIKK2NsYXNzZXMgZnJvbSBTZXJ2aWNlRGVzY3JpcHRvciBvYmplY3RzIGF0IHJ1bnRpbWUuCisKK1RoZSBHZW5lcmF0ZWRTZXJ2aWNlVHlwZSBhbmQgR2VuZXJhdGVkU2VydmljZVN0dWJUeXBlIG1ldGFjbGFzc2VzIGFyZSB1c2VkIHRvCitpbmplY3QgYWxsIHVzZWZ1bCBmdW5jdGlvbmFsaXR5IGludG8gdGhlIGNsYXNzZXMgb3V0cHV0IGJ5IHRoZSBwcm90b2NvbAorY29tcGlsZXIgYXQgY29tcGlsZS10aW1lLgorIiIiCisKK19fYXV0aG9yX18gPSAncGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KScKKworCitjbGFzcyBHZW5lcmF0ZWRTZXJ2aWNlVHlwZSh0eXBlKToKKworICAiIiJNZXRhY2xhc3MgZm9yIHNlcnZpY2UgY2xhc3NlcyBjcmVhdGVkIGF0IHJ1bnRpbWUgZnJvbSBTZXJ2aWNlRGVzY3JpcHRvcnMuCisKKyAgSW1wbGVtZW50YXRpb25zIGZvciBhbGwgbWV0aG9kcyBkZXNjcmliZWQgaW4gdGhlIFNlcnZpY2UgY2xhc3MgYXJlIGFkZGVkIGhlcmUKKyAgYnkgdGhpcyBjbGFzcy4gV2UgYWxzbyBjcmVhdGUgcHJvcGVydGllcyB0byBhbGxvdyBnZXR0aW5nL3NldHRpbmcgYWxsIGZpZWxkcworICBpbiB0aGUgcHJvdG9jb2wgbWVzc2FnZS4KKworICBUaGUgcHJvdG9jb2wgY29tcGlsZXIgY3VycmVudGx5IHVzZXMgdGhpcyBtZXRhY2xhc3MgdG8gY3JlYXRlIHByb3RvY29sIHNlcnZpY2UKKyAgY2xhc3NlcyBhdCBydW50aW1lLiBDbGllbnRzIGNhbiBhbHNvIG1hbnVhbGx5IGNyZWF0ZSB0aGVpciBvd24gY2xhc3NlcyBhdAorICBydW50aW1lLCBhcyBpbiB0aGlzIGV4YW1wbGU6OgorCisgICAgbXlkZXNjcmlwdG9yID0gU2VydmljZURlc2NyaXB0b3IoLi4uLi4pCisgICAgY2xhc3MgTXlQcm90b1NlcnZpY2Uoc2VydmljZS5TZXJ2aWNlKToKKyAgICAgIF9fbWV0YWNsYXNzX18gPSBHZW5lcmF0ZWRTZXJ2aWNlVHlwZQorICAgICAgREVTQ1JJUFRPUiA9IG15ZGVzY3JpcHRvcgorICAgIG15c2VydmljZV9pbnN0YW5jZSA9IE15UHJvdG9TZXJ2aWNlKCkKKyAgICAjIC4uLgorICAiIiIKKworICBfREVTQ1JJUFRPUl9LRVkgPSAnREVTQ1JJUFRPUicKKworICBkZWYgX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdGlvbmFyeSk6CisgICAgIiIiQ3JlYXRlcyBhIG1lc3NhZ2Ugc2VydmljZSBjbGFzcy4KKworICAgIEFyZ3M6CisgICAgICBuYW1lOiBOYW1lIG9mIHRoZSBjbGFzcyAoaWdub3JlZCwgYnV0IHJlcXVpcmVkIGJ5IHRoZSBtZXRhY2xhc3MKKyAgICAgICAgcHJvdG9jb2wpLgorICAgICAgYmFzZXM6IEJhc2UgY2xhc3NlcyBvZiB0aGUgY2xhc3MgYmVpbmcgY29uc3RydWN0ZWQuCisgICAgICBkaWN0aW9uYXJ5OiBUaGUgY2xhc3MgZGljdGlvbmFyeSBvZiB0aGUgY2xhc3MgYmVpbmcgY29uc3RydWN0ZWQuCisgICAgICAgIGRpY3Rpb25hcnlbX0RFU0NSSVBUT1JfS0VZXSBtdXN0IGNvbnRhaW4gYSBTZXJ2aWNlRGVzY3JpcHRvciBvYmplY3QKKyAgICAgICAgZGVzY3JpYmluZyB0aGlzIHByb3RvY29sIHNlcnZpY2UgdHlwZS4KKyAgICAiIiIKKyAgICAjIERvbid0IGRvIGFueXRoaW5nIGlmIHRoaXMgY2xhc3MgZG9lc24ndCBoYXZlIGEgZGVzY3JpcHRvci4gVGhpcyBoYXBwZW5zCisgICAgIyB3aGVuIGEgc2VydmljZSBjbGFzcyBpcyBzdWJjbGFzc2VkLgorICAgIGlmIEdlbmVyYXRlZFNlcnZpY2VUeXBlLl9ERVNDUklQVE9SX0tFWSBub3QgaW4gZGljdGlvbmFyeToKKyAgICAgIHJldHVybgorCisgICAgZGVzY3JpcHRvciA9IGRpY3Rpb25hcnlbR2VuZXJhdGVkU2VydmljZVR5cGUuX0RFU0NSSVBUT1JfS0VZXQorICAgIHNlcnZpY2VfYnVpbGRlciA9IF9TZXJ2aWNlQnVpbGRlcihkZXNjcmlwdG9yKQorICAgIHNlcnZpY2VfYnVpbGRlci5CdWlsZFNlcnZpY2UoY2xzKQorICAgIGNscy5ERVNDUklQVE9SID0gZGVzY3JpcHRvcgorCisKK2NsYXNzIEdlbmVyYXRlZFNlcnZpY2VTdHViVHlwZShHZW5lcmF0ZWRTZXJ2aWNlVHlwZSk6CisKKyAgIiIiTWV0YWNsYXNzIGZvciBzZXJ2aWNlIHN0dWJzIGNyZWF0ZWQgYXQgcnVudGltZSBmcm9tIFNlcnZpY2VEZXNjcmlwdG9ycy4KKworICBUaGlzIGNsYXNzIGhhcyBzaW1pbGFyIHJlc3BvbnNpYmlsaXRpZXMgYXMgR2VuZXJhdGVkU2VydmljZVR5cGUsIGV4Y2VwdCB0aGF0CisgIGl0IGNyZWF0ZXMgdGhlIHNlcnZpY2Ugc3R1YiBjbGFzc2VzLgorICAiIiIKKworICBfREVTQ1JJUFRPUl9LRVkgPSAnREVTQ1JJUFRPUicKKworICBkZWYgX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdGlvbmFyeSk6CisgICAgIiIiQ3JlYXRlcyBhIG1lc3NhZ2Ugc2VydmljZSBzdHViIGNsYXNzLgorCisgICAgQXJnczoKKyAgICAgIG5hbWU6IE5hbWUgb2YgdGhlIGNsYXNzIChpZ25vcmVkLCBoZXJlKS4KKyAgICAgIGJhc2VzOiBCYXNlIGNsYXNzZXMgb2YgdGhlIGNsYXNzIGJlaW5nIGNvbnN0cnVjdGVkLgorICAgICAgZGljdGlvbmFyeTogVGhlIGNsYXNzIGRpY3Rpb25hcnkgb2YgdGhlIGNsYXNzIGJlaW5nIGNvbnN0cnVjdGVkLgorICAgICAgICBkaWN0aW9uYXJ5W19ERVNDUklQVE9SX0tFWV0gbXVzdCBjb250YWluIGEgU2VydmljZURlc2NyaXB0b3Igb2JqZWN0CisgICAgICAgIGRlc2NyaWJpbmcgdGhpcyBwcm90b2NvbCBzZXJ2aWNlIHR5cGUuCisgICAgIiIiCisgICAgc3VwZXIoR2VuZXJhdGVkU2VydmljZVN0dWJUeXBlLCBjbHMpLl9faW5pdF9fKG5hbWUsIGJhc2VzLCBkaWN0aW9uYXJ5KQorICAgICMgRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhpcyBjbGFzcyBkb2Vzbid0IGhhdmUgYSBkZXNjcmlwdG9yLiBUaGlzIGhhcHBlbnMKKyAgICAjIHdoZW4gYSBzZXJ2aWNlIHN0dWIgaXMgc3ViY2xhc3NlZC4KKyAgICBpZiBHZW5lcmF0ZWRTZXJ2aWNlU3R1YlR5cGUuX0RFU0NSSVBUT1JfS0VZIG5vdCBpbiBkaWN0aW9uYXJ5OgorICAgICAgcmV0dXJuCisKKyAgICBkZXNjcmlwdG9yID0gZGljdGlvbmFyeVtHZW5lcmF0ZWRTZXJ2aWNlU3R1YlR5cGUuX0RFU0NSSVBUT1JfS0VZXQorICAgIHNlcnZpY2Vfc3R1Yl9idWlsZGVyID0gX1NlcnZpY2VTdHViQnVpbGRlcihkZXNjcmlwdG9yKQorICAgIHNlcnZpY2Vfc3R1Yl9idWlsZGVyLkJ1aWxkU2VydmljZVN0dWIoY2xzKQorCisKK2NsYXNzIF9TZXJ2aWNlQnVpbGRlcihvYmplY3QpOgorCisgICIiIlRoaXMgY2xhc3MgY29uc3RydWN0cyBhIHByb3RvY29sIHNlcnZpY2UgY2xhc3MgdXNpbmcgYSBzZXJ2aWNlIGRlc2NyaXB0b3IuCisKKyAgR2l2ZW4gYSBzZXJ2aWNlIGRlc2NyaXB0b3IsIHRoaXMgY2xhc3MgY29uc3RydWN0cyBhIGNsYXNzIHRoYXQgcmVwcmVzZW50cworICB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgZGVzY3JpcHRvci4gT25lIHNlcnZpY2UgYnVpbGRlciBpbnN0YW5jZSBjb25zdHJ1Y3RzCisgIGV4YWN0bHkgb25lIHNlcnZpY2UgY2xhc3MuIFRoYXQgbWVhbnMgYWxsIGluc3RhbmNlcyBvZiB0aGF0IGNsYXNzIHNoYXJlIHRoZQorICBzYW1lIGJ1aWxkZXIuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2aWNlX2Rlc2NyaXB0b3IpOgorICAgICIiIkluaXRpYWxpemVzIGFuIGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlIGNsYXNzIGJ1aWxkZXIuCisKKyAgICBBcmdzOgorICAgICAgc2VydmljZV9kZXNjcmlwdG9yOiBTZXJ2aWNlRGVzY3JpcHRvciB0byB1c2Ugd2hlbiBjb25zdHJ1Y3RpbmcgdGhlCisgICAgICAgIHNlcnZpY2UgY2xhc3MuCisgICAgIiIiCisgICAgc2VsZi5kZXNjcmlwdG9yID0gc2VydmljZV9kZXNjcmlwdG9yCisKKyAgZGVmIEJ1aWxkU2VydmljZShidWlsZGVyLCBjbHMpOgorICAgICIiIkNvbnN0cnVjdHMgdGhlIHNlcnZpY2UgY2xhc3MuCisKKyAgICBBcmdzOgorICAgICAgY2xzOiBUaGUgY2xhc3MgdGhhdCB3aWxsIGJlIGNvbnN0cnVjdGVkLgorICAgICIiIgorCisgICAgIyBDYWxsTWV0aG9kIG5lZWRzIHRvIG9wZXJhdGUgd2l0aCBhbiBpbnN0YW5jZSBvZiB0aGUgU2VydmljZSBjbGFzcy4gVGhpcworICAgICMgaW50ZXJuYWwgd3JhcHBlciBmdW5jdGlvbiBleGlzdHMgb25seSB0byBiZSBhYmxlIHRvIHBhc3MgdGhlIHNlcnZpY2UKKyAgICAjIGluc3RhbmNlIHRvIHRoZSBtZXRob2QgdGhhdCBkb2VzIHRoZSByZWFsIENhbGxNZXRob2Qgd29yay4KKyAgICAjIE1ha2luZyBzdXJlIHRvIHVzZSBleGFjdCBhcmd1bWVudCBuYW1lcyBmcm9tIHRoZSBhYnN0cmFjdCBpbnRlcmZhY2UgaW4KKyAgICAjIHNlcnZpY2UucHkgdG8gbWF0Y2ggdGhlIHR5cGUgc2lnbmF0dXJlCisgICAgZGVmIF9XcmFwQ2FsbE1ldGhvZChzZWxmLCBtZXRob2RfZGVzY3JpcHRvciwgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGRvbmUpOgorICAgICAgcmV0dXJuIGJ1aWxkZXIuX0NhbGxNZXRob2Qoc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IsIHJwY19jb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwgZG9uZSkKKworICAgIGRlZiBfV3JhcEdldFJlcXVlc3RDbGFzcyhzZWxmLCBtZXRob2RfZGVzY3JpcHRvcik6CisgICAgICByZXR1cm4gYnVpbGRlci5fR2V0UmVxdWVzdENsYXNzKG1ldGhvZF9kZXNjcmlwdG9yKQorCisgICAgZGVmIF9XcmFwR2V0UmVzcG9uc2VDbGFzcyhzZWxmLCBtZXRob2RfZGVzY3JpcHRvcik6CisgICAgICByZXR1cm4gYnVpbGRlci5fR2V0UmVzcG9uc2VDbGFzcyhtZXRob2RfZGVzY3JpcHRvcikKKworICAgIGJ1aWxkZXIuY2xzID0gY2xzCisgICAgY2xzLkNhbGxNZXRob2QgPSBfV3JhcENhbGxNZXRob2QKKyAgICBjbHMuR2V0RGVzY3JpcHRvciA9IHN0YXRpY21ldGhvZChsYW1iZGE6IGJ1aWxkZXIuZGVzY3JpcHRvcikKKyAgICBjbHMuR2V0RGVzY3JpcHRvci5fX2RvY19fID0gJ1JldHVybnMgdGhlIHNlcnZpY2UgZGVzY3JpcHRvci4nCisgICAgY2xzLkdldFJlcXVlc3RDbGFzcyA9IF9XcmFwR2V0UmVxdWVzdENsYXNzCisgICAgY2xzLkdldFJlc3BvbnNlQ2xhc3MgPSBfV3JhcEdldFJlc3BvbnNlQ2xhc3MKKyAgICBmb3IgbWV0aG9kIGluIGJ1aWxkZXIuZGVzY3JpcHRvci5tZXRob2RzOgorICAgICAgc2V0YXR0cihjbHMsIG1ldGhvZC5uYW1lLCBidWlsZGVyLl9HZW5lcmF0ZU5vbkltcGxlbWVudGVkTWV0aG9kKG1ldGhvZCkpCisKKyAgZGVmIF9DYWxsTWV0aG9kKHNlbGYsIHNydmMsIG1ldGhvZF9kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrKToKKyAgICAiIiJDYWxscyB0aGUgbWV0aG9kIGRlc2NyaWJlZCBieSBhIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yLgorCisgICAgQXJnczoKKyAgICAgIHNydmM6IEluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlIGZvciB3aGljaCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICBtZXRob2RfZGVzY3JpcHRvcjogRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudCB0aGUgbWV0aG9kIHRvIGNhbGwuCisgICAgICBycGNfY29udHJvbGxlcjogUlBDIGNvbnRyb2xsZXIgdG8gdXNlIGZvciB0aGlzIG1ldGhvZCdzIGV4ZWN1dGlvbi4KKyAgICAgIHJlcXVlc3Q6IFJlcXVlc3QgcHJvdG9jb2wgbWVzc2FnZS4KKyAgICAgIGNhbGxiYWNrOiBBIGNhbGxiYWNrIHRvIGludm9rZSBhZnRlciB0aGUgbWV0aG9kIGhhcyBjb21wbGV0ZWQuCisgICAgIiIiCisgICAgaWYgbWV0aG9kX2Rlc2NyaXB0b3IuY29udGFpbmluZ19zZXJ2aWNlICE9IHNlbGYuZGVzY3JpcHRvcjoKKyAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAnQ2FsbE1ldGhvZCgpIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yIGZvciB3cm9uZyBzZXJ2aWNlIHR5cGUuJykKKyAgICBtZXRob2QgPSBnZXRhdHRyKHNydmMsIG1ldGhvZF9kZXNjcmlwdG9yLm5hbWUpCisgICAgcmV0dXJuIG1ldGhvZChycGNfY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spCisKKyAgZGVmIF9HZXRSZXF1ZXN0Q2xhc3Moc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IpOgorICAgICIiIlJldHVybnMgdGhlIGNsYXNzIG9mIHRoZSByZXF1ZXN0IHByb3RvY29sIG1lc3NhZ2UuCisKKyAgICBBcmdzOgorICAgICAgbWV0aG9kX2Rlc2NyaXB0b3I6IERlc2NyaXB0b3Igb2YgdGhlIG1ldGhvZCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZQorICAgICAgICByZXF1ZXN0IHByb3RvY29sIG1lc3NhZ2UgY2xhc3MuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIGlucHV0IHByb3RvY29sIG1lc3NhZ2Ugb2YgdGhlIHNwZWNpZmllZAorICAgICAgbWV0aG9kLgorICAgICIiIgorICAgIGlmIG1ldGhvZF9kZXNjcmlwdG9yLmNvbnRhaW5pbmdfc2VydmljZSAhPSBzZWxmLmRlc2NyaXB0b3I6CisgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgJ0dldFJlcXVlc3RDbGFzcygpIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yIGZvciB3cm9uZyBzZXJ2aWNlIHR5cGUuJykKKyAgICByZXR1cm4gbWV0aG9kX2Rlc2NyaXB0b3IuaW5wdXRfdHlwZS5fY29uY3JldGVfY2xhc3MKKworICBkZWYgX0dldFJlc3BvbnNlQ2xhc3Moc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IpOgorICAgICIiIlJldHVybnMgdGhlIGNsYXNzIG9mIHRoZSByZXNwb25zZSBwcm90b2NvbCBtZXNzYWdlLgorCisgICAgQXJnczoKKyAgICAgIG1ldGhvZF9kZXNjcmlwdG9yOiBEZXNjcmlwdG9yIG9mIHRoZSBtZXRob2QgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUKKyAgICAgICAgcmVzcG9uc2UgcHJvdG9jb2wgbWVzc2FnZSBjbGFzcy4KKworICAgIFJldHVybnM6CisgICAgICBBIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgb3V0cHV0IHByb3RvY29sIG1lc3NhZ2Ugb2YgdGhlIHNwZWNpZmllZAorICAgICAgbWV0aG9kLgorICAgICIiIgorICAgIGlmIG1ldGhvZF9kZXNjcmlwdG9yLmNvbnRhaW5pbmdfc2VydmljZSAhPSBzZWxmLmRlc2NyaXB0b3I6CisgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgJ0dldFJlc3BvbnNlQ2xhc3MoKSBnaXZlbiBtZXRob2QgZGVzY3JpcHRvciBmb3Igd3Jvbmcgc2VydmljZSB0eXBlLicpCisgICAgcmV0dXJuIG1ldGhvZF9kZXNjcmlwdG9yLm91dHB1dF90eXBlLl9jb25jcmV0ZV9jbGFzcworCisgIGRlZiBfR2VuZXJhdGVOb25JbXBsZW1lbnRlZE1ldGhvZChzZWxmLCBtZXRob2QpOgorICAgICIiIkdlbmVyYXRlcyBhbmQgcmV0dXJucyBhIG1ldGhvZCB0aGF0IGNhbiBiZSBzZXQgZm9yIGEgc2VydmljZSBtZXRob2RzLgorCisgICAgQXJnczoKKyAgICAgIG1ldGhvZDogRGVzY3JpcHRvciBvZiB0aGUgc2VydmljZSBtZXRob2QgZm9yIHdoaWNoIGEgbWV0aG9kIGlzIHRvIGJlCisgICAgICAgIGdlbmVyYXRlZC4KKworICAgIFJldHVybnM6CisgICAgICBBIG1ldGhvZCB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VydmljZSBjbGFzcy4KKyAgICAiIiIKKyAgICByZXR1cm4gbGFtYmRhIGluc3QsIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjazogKAorICAgICAgICBzZWxmLl9Ob25JbXBsZW1lbnRlZE1ldGhvZChtZXRob2QubmFtZSwgcnBjX2NvbnRyb2xsZXIsIGNhbGxiYWNrKSkKKworICBkZWYgX05vbkltcGxlbWVudGVkTWV0aG9kKHNlbGYsIG1ldGhvZF9uYW1lLCBycGNfY29udHJvbGxlciwgY2FsbGJhY2spOgorICAgICIiIlRoZSBib2R5IG9mIGFsbCBtZXRob2RzIGluIHRoZSBnZW5lcmF0ZWQgc2VydmljZSBjbGFzcy4KKworICAgIEFyZ3M6CisgICAgICBtZXRob2RfbmFtZTogTmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIGV4ZWN1dGVkLgorICAgICAgcnBjX2NvbnRyb2xsZXI6IFJQQyBjb250cm9sbGVyIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIG1ldGhvZC4KKyAgICAgIGNhbGxiYWNrOiBBIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSBtZXRob2QgZmluaXNoZXMuCisgICAgIiIiCisgICAgcnBjX2NvbnRyb2xsZXIuU2V0RmFpbGVkKCdNZXRob2QgJXMgbm90IGltcGxlbWVudGVkLicgJSBtZXRob2RfbmFtZSkKKyAgICBjYWxsYmFjayhOb25lKQorCisKK2NsYXNzIF9TZXJ2aWNlU3R1YkJ1aWxkZXIob2JqZWN0KToKKworICAiIiJDb25zdHJ1Y3RzIGEgcHJvdG9jb2wgc2VydmljZSBzdHViIGNsYXNzIHVzaW5nIGEgc2VydmljZSBkZXNjcmlwdG9yLgorCisgIEdpdmVuIGEgc2VydmljZSBkZXNjcmlwdG9yLCB0aGlzIGNsYXNzIGNvbnN0cnVjdHMgYSBzdWl0YWJsZSBzdHViIGNsYXNzLgorICBBIHN0dWIgaXMganVzdCBhIHR5cGUtc2FmZSB3cmFwcGVyIGFyb3VuZCBhbiBScGNDaGFubmVsIHdoaWNoIGVtdWxhdGVzIGEKKyAgbG9jYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UuCisKKyAgT25lIHNlcnZpY2Ugc3R1YiBidWlsZGVyIGluc3RhbmNlIGNvbnN0cnVjdHMgZXhhY3RseSBvbmUgY2xhc3MuIEl0IG1lYW5zIGFsbAorICBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBzaGFyZSB0aGUgc2FtZSBzZXJ2aWNlIHN0dWIgYnVpbGRlci4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZpY2VfZGVzY3JpcHRvcik6CisgICAgIiIiSW5pdGlhbGl6ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2Ugc3R1YiBjbGFzcyBidWlsZGVyLgorCisgICAgQXJnczoKKyAgICAgIHNlcnZpY2VfZGVzY3JpcHRvcjogU2VydmljZURlc2NyaXB0b3IgdG8gdXNlIHdoZW4gY29uc3RydWN0aW5nIHRoZQorICAgICAgICBzdHViIGNsYXNzLgorICAgICIiIgorICAgIHNlbGYuZGVzY3JpcHRvciA9IHNlcnZpY2VfZGVzY3JpcHRvcgorCisgIGRlZiBCdWlsZFNlcnZpY2VTdHViKHNlbGYsIGNscyk6CisgICAgIiIiQ29uc3RydWN0cyB0aGUgc3R1YiBjbGFzcy4KKworICAgIEFyZ3M6CisgICAgICBjbHM6IFRoZSBjbGFzcyB0aGF0IHdpbGwgYmUgY29uc3RydWN0ZWQuCisgICAgIiIiCisKKyAgICBkZWYgX1NlcnZpY2VTdHViSW5pdChzdHViLCBycGNfY2hhbm5lbCk6CisgICAgICBzdHViLnJwY19jaGFubmVsID0gcnBjX2NoYW5uZWwKKyAgICBzZWxmLmNscyA9IGNscworICAgIGNscy5fX2luaXRfXyA9IF9TZXJ2aWNlU3R1YkluaXQKKyAgICBmb3IgbWV0aG9kIGluIHNlbGYuZGVzY3JpcHRvci5tZXRob2RzOgorICAgICAgc2V0YXR0cihjbHMsIG1ldGhvZC5uYW1lLCBzZWxmLl9HZW5lcmF0ZVN0dWJNZXRob2QobWV0aG9kKSkKKworICBkZWYgX0dlbmVyYXRlU3R1Yk1ldGhvZChzZWxmLCBtZXRob2QpOgorICAgIHJldHVybiAobGFtYmRhIGluc3QsIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjaz1Ob25lOgorICAgICAgICBzZWxmLl9TdHViTWV0aG9kKGluc3QsIG1ldGhvZCwgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrKSkKKworICBkZWYgX1N0dWJNZXRob2Qoc2VsZiwgc3R1YiwgbWV0aG9kX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICBycGNfY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spOgorICAgICIiIlRoZSBib2R5IG9mIGFsbCBzZXJ2aWNlIG1ldGhvZHMgaW4gdGhlIGdlbmVyYXRlZCBzdHViIGNsYXNzLgorCisgICAgQXJnczoKKyAgICAgIHN0dWI6IFN0dWIgaW5zdGFuY2UuCisgICAgICBtZXRob2RfZGVzY3JpcHRvcjogRGVzY3JpcHRvciBvZiB0aGUgaW52b2tlZCBtZXRob2QuCisgICAgICBycGNfY29udHJvbGxlcjogUnBjIGNvbnRyb2xsZXIgdG8gZXhlY3V0ZSB0aGUgbWV0aG9kLgorICAgICAgcmVxdWVzdDogUmVxdWVzdCBwcm90b2NvbCBtZXNzYWdlLgorICAgICAgY2FsbGJhY2s6IEEgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIHRoZSBtZXRob2QgZmluaXNoZXMuCisgICAgUmV0dXJuczoKKyAgICAgIFJlc3BvbnNlIG1lc3NhZ2UgKGluIGNhc2Ugb2YgYmxvY2tpbmcgY2FsbCkuCisgICAgIiIiCisgICAgcmV0dXJuIHN0dWIucnBjX2NoYW5uZWwuQ2FsbE1ldGhvZCgKKyAgICAgICAgbWV0aG9kX2Rlc2NyaXB0b3IsIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LAorICAgICAgICBtZXRob2RfZGVzY3JpcHRvci5vdXRwdXRfdHlwZS5fY29uY3JldGVfY2xhc3MsIGNhbGxiYWNrKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dF9wYjIucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0X3BiMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmNkOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dF9wYjIucHkKQEAgLTAsMCArMSw3MSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMgR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKyMgc291cmNlOiBnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucHJvdG8KKyIiIkdlbmVyYXRlZCBwcm90b2NvbCBidWZmZXIgY29kZS4iIiIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yIGFzIF9kZXNjcmlwdG9yCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZSBhcyBfbWVzc2FnZQorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHJlZmxlY3Rpb24gYXMgX3JlZmxlY3Rpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzeW1ib2xfZGF0YWJhc2UgYXMgX3N5bWJvbF9kYXRhYmFzZQorIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW1wb3J0cykKKworX3N5bV9kYiA9IF9zeW1ib2xfZGF0YWJhc2UuRGVmYXVsdCgpCisKKworCisKK0RFU0NSSVBUT1IgPSBfZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcigKKyAgbmFtZT0nZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvJywKKyAgcGFja2FnZT0nZ29vZ2xlLnByb3RvYnVmJywKKyAgc3ludGF4PSdwcm90bzMnLAorICBzZXJpYWxpemVkX29wdGlvbnM9YidcblwwMjNjb20uZ29vZ2xlLnByb3RvYnVmQlwwMjJTb3VyY2VDb250ZXh0UHJvdG9QXDAwMVo2Z29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vc291cmNlY29udGV4dHBiXDI0MlwwMDJcMDAzR1BCXDI1MlwwMDJcMDM2R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzJywKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgc2VyaWFsaXplZF9wYj1iJ1xuJGdvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90b1x4MTJceDBmZ29vZ2xlLnByb3RvYnVmXCJcIlxuXHJTb3VyY2VDb250ZXh0XHgxMlx4MTFcblx0ZmlsZV9uYW1lXHgxOFx4MDEgXHgwMShcdEJceDhhXHgwMVxuXHgxM1x4NjNvbS5nb29nbGUucHJvdG9idWZCXHgxMlNvdXJjZUNvbnRleHRQcm90b1BceDAxWjZnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9zb3VyY2Vjb250ZXh0cGJceGEyXHgwMlx4MDNHUEJceGFhXHgwMlx4MWVHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiXHgwNnByb3RvMycKKykKKworCisKKworX1NPVVJDRUNPTlRFWFQgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdTb3VyY2VDb250ZXh0JywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dCcsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZmlsZV9uYW1lJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dC5maWxlX25hbWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMycsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9NTcsCisgIHNlcmlhbGl6ZWRfZW5kPTkxLAorKQorCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnU291cmNlQ29udGV4dCddID0gX1NPVVJDRUNPTlRFWFQKK19zeW1fZGIuUmVnaXN0ZXJGaWxlRGVzY3JpcHRvcihERVNDUklQVE9SKQorCitTb3VyY2VDb250ZXh0ID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnU291cmNlQ29udGV4dCcsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX1NPVVJDRUNPTlRFWFQsCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuc291cmNlX2NvbnRleHRfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dCkKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKFNvdXJjZUNvbnRleHQpCisKKworREVTQ1JJUFRPUi5fb3B0aW9ucyA9IE5vbmUKKyMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1vZHVsZV9zY29wZSkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc3RydWN0X3BiMi5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc3RydWN0X3BiMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmM4ZmFjCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zdHJ1Y3RfcGIyLnB5CkBAIC0wLDAgKzEsMjg3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorIyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8KKyIiIkdlbmVyYXRlZCBwcm90b2NvbCBidWZmZXIgY29kZS4iIiIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbnVtX3R5cGVfd3JhcHBlcgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IgYXMgX2Rlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlIGFzIF9tZXNzYWdlCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgcmVmbGVjdGlvbiBhcyBfcmVmbGVjdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHN5bWJvbF9kYXRhYmFzZSBhcyBfc3ltYm9sX2RhdGFiYXNlCisjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQorCitfc3ltX2RiID0gX3N5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkKKworCisKKworREVTQ1JJUFRPUiA9IF9kZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKAorICBuYW1lPSdnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvJywKKyAgcGFja2FnZT0nZ29vZ2xlLnByb3RvYnVmJywKKyAgc3ludGF4PSdwcm90bzMnLAorICBzZXJpYWxpemVkX29wdGlvbnM9YidcblwwMjNjb20uZ29vZ2xlLnByb3RvYnVmQlwwMTNTdHJ1Y3RQcm90b1BcMDAxWi9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9zdHJ1Y3RwYlwzNzBcMDAxXDAwMVwyNDJcMDAyXDAwM0dQQlwyNTJcMDAyXDAzNkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcycsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIHNlcmlhbGl6ZWRfcGI9Yidcblx4MWNnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvXHgxMlx4MGZnb29nbGUucHJvdG9idWZcIlx4ODRceDAxXG5ceDA2U3RydWN0XHgxMlx4MzNcblx4MDZceDY2aWVsZHNceDE4XHgwMSBceDAzKFx4MGJceDMyIy5nb29nbGUucHJvdG9idWYuU3RydWN0LkZpZWxkc0VudHJ5XHgxYVx4NDVcblx4MGJceDQ2aWVsZHNFbnRyeVx4MTJceDBiXG5ceDAza2V5XHgxOFx4MDEgXHgwMShcdFx4MTIlXG5ceDA1dmFsdWVceDE4XHgwMiBceDAxKFx4MGJceDMyXHgxNi5nb29nbGUucHJvdG9idWYuVmFsdWU6XHgwMlx4MzhceDAxXCJceGVhXHgwMVxuXHgwNVZhbHVlXHgxMlx4MzBcblxubnVsbF92YWx1ZVx4MThceDAxIFx4MDEoXHgwZVx4MzJceDFhLmdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWVIXHgwMFx4MTJceDE2XG5ceDBjbnVtYmVyX3ZhbHVlXHgxOFx4MDIgXHgwMShceDAxSFx4MDBceDEyXHgxNlxuXHgwY3N0cmluZ192YWx1ZVx4MThceDAzIFx4MDEoXHRIXHgwMFx4MTJceDE0XG5cbmJvb2xfdmFsdWVceDE4XHgwNCBceDAxKFx4MDhIXHgwMFx4MTIvXG5ceDBjc3RydWN0X3ZhbHVlXHgxOFx4MDUgXHgwMShceDBiXHgzMlx4MTcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEhceDAwXHgxMlx4MzBcblxubGlzdF92YWx1ZVx4MThceDA2IFx4MDEoXHgwYlx4MzJceDFhLmdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWVIXHgwMFx4NDJceDA2XG5ceDA0a2luZFwiM1xuXHRMaXN0VmFsdWVceDEyJlxuXHgwNnZhbHVlc1x4MThceDAxIFx4MDMoXHgwYlx4MzJceDE2Lmdvb2dsZS5wcm90b2J1Zi5WYWx1ZSpceDFiXG5cdE51bGxWYWx1ZVx4MTJceDBlXG5cbk5VTExfVkFMVUVceDEwXHgwMFx4NDJceDdmXG5ceDEzXHg2M29tLmdvb2dsZS5wcm90b2J1ZkJceDBiU3RydWN0UHJvdG9QXHgwMVovZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vc3RydWN0cGJceGY4XHgwMVx4MDFceGEyXHgwMlx4MDNHUEJceGFhXHgwMlx4MWVHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiXHgwNnByb3RvMycKKykKKworX05VTExWQUxVRSA9IF9kZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAorICBuYW1lPSdOdWxsVmFsdWUnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIHZhbHVlcz1bCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J05VTExfVkFMVUUnLCBpbmRleD0wLCBudW1iZXI9MCwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgc2VyaWFsaXplZF9zdGFydD00NzQsCisgIHNlcmlhbGl6ZWRfZW5kPTUwMSwKKykKK19zeW1fZGIuUmVnaXN0ZXJFbnVtRGVzY3JpcHRvcihfTlVMTFZBTFVFKQorCitOdWxsVmFsdWUgPSBlbnVtX3R5cGVfd3JhcHBlci5FbnVtVHlwZVdyYXBwZXIoX05VTExWQUxVRSkKK05VTExfVkFMVUUgPSAwCisKKworCitfU1RSVUNUX0ZJRUxEU0VOVFJZID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nRmllbGRzRW50cnknLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QuRmllbGRzRW50cnknLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2tleScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlN0cnVjdC5GaWVsZHNFbnRyeS5rZXknLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd2YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlN0cnVjdC5GaWVsZHNFbnRyeS52YWx1ZScsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Yic4XDAwMScsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8zJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0xMTMsCisgIHNlcmlhbGl6ZWRfZW5kPTE4MiwKKykKKworX1NUUlVDVCA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J1N0cnVjdCcsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCcsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZmllbGRzJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU3RydWN0LmZpZWxkcycsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtfU1RSVUNUX0ZJRUxEU0VOVFJZLCBdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8zJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD01MCwKKyAgc2VyaWFsaXplZF9lbmQ9MTgyLAorKQorCisKK19WQUxVRSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J1ZhbHVlJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVmFsdWUnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J251bGxfdmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5WYWx1ZS5udWxsX3ZhbHVlJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTE0LCBjcHBfdHlwZT04LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J251bWJlcl92YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlZhbHVlLm51bWJlcl92YWx1ZScsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xLCBjcHBfdHlwZT01LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9ZmxvYXQoMCksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdzdHJpbmdfdmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5WYWx1ZS5zdHJpbmdfdmFsdWUnLCBpbmRleD0yLAorICAgICAgbnVtYmVyPTMsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdib29sX3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVmFsdWUuYm9vbF92YWx1ZScsIGluZGV4PTMsCisgICAgICBudW1iZXI9NCwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdzdHJ1Y3RfdmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5WYWx1ZS5zdHJ1Y3RfdmFsdWUnLCBpbmRleD00LAorICAgICAgbnVtYmVyPTUsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2xpc3RfdmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5WYWx1ZS5saXN0X3ZhbHVlJywgaW5kZXg9NSwKKyAgICAgIG51bWJlcj02LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMycsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgICAgX2Rlc2NyaXB0b3IuT25lb2ZEZXNjcmlwdG9yKAorICAgICAgbmFtZT0na2luZCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlZhbHVlLmtpbmQnLAorICAgICAgaW5kZXg9MCwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICAgIGZpZWxkcz1bXSksCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MTg1LAorICBzZXJpYWxpemVkX2VuZD00MTksCispCisKKworX0xJU1RWQUxVRSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0xpc3RWYWx1ZScsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndmFsdWVzJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlLnZhbHVlcycsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8zJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD00MjEsCisgIHNlcmlhbGl6ZWRfZW5kPTQ3MiwKKykKKworX1NUUlVDVF9GSUVMRFNFTlRSWS5maWVsZHNfYnlfbmFtZVsndmFsdWUnXS5tZXNzYWdlX3R5cGUgPSBfVkFMVUUKK19TVFJVQ1RfRklFTERTRU5UUlkuY29udGFpbmluZ190eXBlID0gX1NUUlVDVAorX1NUUlVDVC5maWVsZHNfYnlfbmFtZVsnZmllbGRzJ10ubWVzc2FnZV90eXBlID0gX1NUUlVDVF9GSUVMRFNFTlRSWQorX1ZBTFVFLmZpZWxkc19ieV9uYW1lWydudWxsX3ZhbHVlJ10uZW51bV90eXBlID0gX05VTExWQUxVRQorX1ZBTFVFLmZpZWxkc19ieV9uYW1lWydzdHJ1Y3RfdmFsdWUnXS5tZXNzYWdlX3R5cGUgPSBfU1RSVUNUCitfVkFMVUUuZmllbGRzX2J5X25hbWVbJ2xpc3RfdmFsdWUnXS5tZXNzYWdlX3R5cGUgPSBfTElTVFZBTFVFCitfVkFMVUUub25lb2ZzX2J5X25hbWVbJ2tpbmQnXS5maWVsZHMuYXBwZW5kKAorICBfVkFMVUUuZmllbGRzX2J5X25hbWVbJ251bGxfdmFsdWUnXSkKK19WQUxVRS5maWVsZHNfYnlfbmFtZVsnbnVsbF92YWx1ZSddLmNvbnRhaW5pbmdfb25lb2YgPSBfVkFMVUUub25lb2ZzX2J5X25hbWVbJ2tpbmQnXQorX1ZBTFVFLm9uZW9mc19ieV9uYW1lWydraW5kJ10uZmllbGRzLmFwcGVuZCgKKyAgX1ZBTFVFLmZpZWxkc19ieV9uYW1lWydudW1iZXJfdmFsdWUnXSkKK19WQUxVRS5maWVsZHNfYnlfbmFtZVsnbnVtYmVyX3ZhbHVlJ10uY29udGFpbmluZ19vbmVvZiA9IF9WQUxVRS5vbmVvZnNfYnlfbmFtZVsna2luZCddCitfVkFMVUUub25lb2ZzX2J5X25hbWVbJ2tpbmQnXS5maWVsZHMuYXBwZW5kKAorICBfVkFMVUUuZmllbGRzX2J5X25hbWVbJ3N0cmluZ192YWx1ZSddKQorX1ZBTFVFLmZpZWxkc19ieV9uYW1lWydzdHJpbmdfdmFsdWUnXS5jb250YWluaW5nX29uZW9mID0gX1ZBTFVFLm9uZW9mc19ieV9uYW1lWydraW5kJ10KK19WQUxVRS5vbmVvZnNfYnlfbmFtZVsna2luZCddLmZpZWxkcy5hcHBlbmQoCisgIF9WQUxVRS5maWVsZHNfYnlfbmFtZVsnYm9vbF92YWx1ZSddKQorX1ZBTFVFLmZpZWxkc19ieV9uYW1lWydib29sX3ZhbHVlJ10uY29udGFpbmluZ19vbmVvZiA9IF9WQUxVRS5vbmVvZnNfYnlfbmFtZVsna2luZCddCitfVkFMVUUub25lb2ZzX2J5X25hbWVbJ2tpbmQnXS5maWVsZHMuYXBwZW5kKAorICBfVkFMVUUuZmllbGRzX2J5X25hbWVbJ3N0cnVjdF92YWx1ZSddKQorX1ZBTFVFLmZpZWxkc19ieV9uYW1lWydzdHJ1Y3RfdmFsdWUnXS5jb250YWluaW5nX29uZW9mID0gX1ZBTFVFLm9uZW9mc19ieV9uYW1lWydraW5kJ10KK19WQUxVRS5vbmVvZnNfYnlfbmFtZVsna2luZCddLmZpZWxkcy5hcHBlbmQoCisgIF9WQUxVRS5maWVsZHNfYnlfbmFtZVsnbGlzdF92YWx1ZSddKQorX1ZBTFVFLmZpZWxkc19ieV9uYW1lWydsaXN0X3ZhbHVlJ10uY29udGFpbmluZ19vbmVvZiA9IF9WQUxVRS5vbmVvZnNfYnlfbmFtZVsna2luZCddCitfTElTVFZBTFVFLmZpZWxkc19ieV9uYW1lWyd2YWx1ZXMnXS5tZXNzYWdlX3R5cGUgPSBfVkFMVUUKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydTdHJ1Y3QnXSA9IF9TVFJVQ1QKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydWYWx1ZSddID0gX1ZBTFVFCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnTGlzdFZhbHVlJ10gPSBfTElTVFZBTFVFCitERVNDUklQVE9SLmVudW1fdHlwZXNfYnlfbmFtZVsnTnVsbFZhbHVlJ10gPSBfTlVMTFZBTFVFCitfc3ltX2RiLlJlZ2lzdGVyRmlsZURlc2NyaXB0b3IoREVTQ1JJUFRPUikKKworU3RydWN0ID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnU3RydWN0JywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworCisgICdGaWVsZHNFbnRyeScgOiBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdGaWVsZHNFbnRyeScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgICAnREVTQ1JJUFRPUicgOiBfU1RSVUNUX0ZJRUxEU0VOVFJZLAorICAgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuc3RydWN0X3BiMicKKyAgICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuU3RydWN0LkZpZWxkc0VudHJ5KQorICAgIH0pCisgICwKKyAgJ0RFU0NSSVBUT1InIDogX1NUUlVDVCwKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5zdHJ1Y3RfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuU3RydWN0KQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoU3RydWN0KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoU3RydWN0LkZpZWxkc0VudHJ5KQorCitWYWx1ZSA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ1ZhbHVlJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfVkFMVUUsCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYuc3RydWN0X3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlZhbHVlKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoVmFsdWUpCisKK0xpc3RWYWx1ZSA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0xpc3RWYWx1ZScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX0xJU1RWQUxVRSwKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi5zdHJ1Y3RfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoTGlzdFZhbHVlKQorCisKK0RFU0NSSVBUT1IuX29wdGlvbnMgPSBOb25lCitfU1RSVUNUX0ZJRUxEU0VOVFJZLl9vcHRpb25zID0gTm9uZQorIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobW9kdWxlX3Njb3BlKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zeW1ib2xfZGF0YWJhc2UucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3N5bWJvbF9kYXRhYmFzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGNmOGNmCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zeW1ib2xfZGF0YWJhc2UucHkKQEAgLTAsMCArMSwxOTQgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiQSBkYXRhYmFzZSBvZiBQeXRob24gcHJvdG9jb2wgYnVmZmVyIGdlbmVyYXRlZCBzeW1ib2xzLgorCitTeW1ib2xEYXRhYmFzZSBpcyB0aGUgTWVzc2FnZUZhY3RvcnkgZm9yIG1lc3NhZ2VzIGdlbmVyYXRlZCBhdCBjb21waWxlIHRpbWUsCithbmQgbWFrZXMgaXQgZWFzeSB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiBhIHJlZ2lzdGVyZWQgdHlwZSwgZ2l2ZW4gb25seSB0aGUKK3R5cGUncyBwcm90b2NvbCBidWZmZXIgc3ltYm9sIG5hbWUuCisKK0V4YW1wbGUgdXNhZ2U6OgorCisgIGRiID0gc3ltYm9sX2RhdGFiYXNlLlN5bWJvbERhdGFiYXNlKCkKKworICAjIFJlZ2lzdGVyIHN5bWJvbHMgb2YgaW50ZXJlc3QsIGZyb20gb25lIG9yIG11bHRpcGxlIGZpbGVzLgorICBkYi5SZWdpc3RlckZpbGVEZXNjcmlwdG9yKG15X3Byb3RvX3BiMi5ERVNDUklQVE9SKQorICBkYi5SZWdpc3Rlck1lc3NhZ2UobXlfcHJvdG9fcGIyLk15TWVzc2FnZSkKKyAgZGIuUmVnaXN0ZXJFbnVtRGVzY3JpcHRvcihteV9wcm90b19wYjIuTXlFbnVtLkRFU0NSSVBUT1IpCisKKyAgIyBUaGUgZGF0YWJhc2UgY2FuIGJlIHVzZWQgYXMgYSBNZXNzYWdlRmFjdG9yeSwgdG8gZ2VuZXJhdGUgdHlwZXMgYmFzZWQgb24KKyAgIyB0aGVpciBuYW1lOgorICB0eXBlcyA9IGRiLkdldE1lc3NhZ2VzKFsnbXlfcHJvdG8ucHJvdG8nXSkKKyAgbXlfbWVzc2FnZV9pbnN0YW5jZSA9IHR5cGVzWydNeU1lc3NhZ2UnXSgpCisKKyAgIyBUaGUgZGF0YWJhc2UncyB1bmRlcmx5aW5nIGRlc2NyaXB0b3IgcG9vbCBjYW4gYmUgcXVlcmllZCwgc28gaXQncyBub3QKKyAgIyBuZWNlc3NhcnkgdG8ga25vdyBhIHR5cGUncyBmaWxlbmFtZSB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIGl0OgorICBmaWxlbmFtZSA9IGRiLnBvb2wuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCdNeU1lc3NhZ2UnKQorICBteV9tZXNzYWdlX2luc3RhbmNlID0gZGIuR2V0TWVzc2FnZXMoW2ZpbGVuYW1lXSlbJ015TWVzc2FnZSddKCkKKworICAjIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBhbHNvIHByb3ZpZGVkIGRpcmVjdGx5IHZpYSBhIGNvbnZlbmllbmNlIG1ldGhvZDoKKyAgbXlfbWVzc2FnZV9pbnN0YW5jZSA9IGRiLkdldFN5bWJvbCgnTXlNZXNzYWdlJykoKQorIiIiCisKKworZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGFwaV9pbXBsZW1lbnRhdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2VfZmFjdG9yeQorCisKK2NsYXNzIFN5bWJvbERhdGFiYXNlKG1lc3NhZ2VfZmFjdG9yeS5NZXNzYWdlRmFjdG9yeSk6CisgICIiIkEgZGF0YWJhc2Ugb2YgUHl0aG9uIGdlbmVyYXRlZCBzeW1ib2xzLiIiIgorCisgIGRlZiBSZWdpc3Rlck1lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CisgICAgIiIiUmVnaXN0ZXJzIHRoZSBnaXZlbiBtZXNzYWdlIHR5cGUgaW4gdGhlIGxvY2FsIGRhdGFiYXNlLgorCisgICAgQ2FsbHMgdG8gR2V0U3ltYm9sKCkgYW5kIEdldE1lc3NhZ2VzKCkgd2lsbCByZXR1cm4gbWVzc2FnZXMgcmVnaXN0ZXJlZCBoZXJlLgorCisgICAgQXJnczoKKyAgICAgIG1lc3NhZ2U6IEEgOmNsYXNzOmBnb29nbGUucHJvdG9idWYubWVzc2FnZS5NZXNzYWdlYCBzdWJjbGFzcyAob3IKKyAgICAgICAgaW5zdGFuY2UpOyBpdHMgZGVzY3JpcHRvciB3aWxsIGJlIHJlZ2lzdGVyZWQuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIHByb3ZpZGVkIG1lc3NhZ2UuCisgICAgIiIiCisKKyAgICBkZXNjID0gbWVzc2FnZS5ERVNDUklQVE9SCisgICAgc2VsZi5fY2xhc3Nlc1tkZXNjXSA9IG1lc3NhZ2UKKyAgICBzZWxmLlJlZ2lzdGVyTWVzc2FnZURlc2NyaXB0b3IoZGVzYykKKyAgICByZXR1cm4gbWVzc2FnZQorCisgIGRlZiBSZWdpc3Rlck1lc3NhZ2VEZXNjcmlwdG9yKHNlbGYsIG1lc3NhZ2VfZGVzY3JpcHRvcik6CisgICAgIiIiUmVnaXN0ZXJzIHRoZSBnaXZlbiBtZXNzYWdlIGRlc2NyaXB0b3IgaW4gdGhlIGxvY2FsIGRhdGFiYXNlLgorCisgICAgQXJnczoKKyAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvciAoRGVzY3JpcHRvcik6IHRoZSBtZXNzYWdlIGRlc2NyaXB0b3IgdG8gYWRkLgorICAgICIiIgorICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ3B5dGhvbic6CisgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICBzZWxmLnBvb2wuX0FkZERlc2NyaXB0b3IobWVzc2FnZV9kZXNjcmlwdG9yKQorCisgIGRlZiBSZWdpc3RlckVudW1EZXNjcmlwdG9yKHNlbGYsIGVudW1fZGVzY3JpcHRvcik6CisgICAgIiIiUmVnaXN0ZXJzIHRoZSBnaXZlbiBlbnVtIGRlc2NyaXB0b3IgaW4gdGhlIGxvY2FsIGRhdGFiYXNlLgorCisgICAgQXJnczoKKyAgICAgIGVudW1fZGVzY3JpcHRvciAoRW51bURlc2NyaXB0b3IpOiBUaGUgZW51bSBkZXNjcmlwdG9yIHRvIHJlZ2lzdGVyLgorCisgICAgUmV0dXJuczoKKyAgICAgIEVudW1EZXNjcmlwdG9yOiBUaGUgcHJvdmlkZWQgZGVzY3JpcHRvci4KKyAgICAiIiIKKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdweXRob24nOgorICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgc2VsZi5wb29sLl9BZGRFbnVtRGVzY3JpcHRvcihlbnVtX2Rlc2NyaXB0b3IpCisgICAgcmV0dXJuIGVudW1fZGVzY3JpcHRvcgorCisgIGRlZiBSZWdpc3RlclNlcnZpY2VEZXNjcmlwdG9yKHNlbGYsIHNlcnZpY2VfZGVzY3JpcHRvcik6CisgICAgIiIiUmVnaXN0ZXJzIHRoZSBnaXZlbiBzZXJ2aWNlIGRlc2NyaXB0b3IgaW4gdGhlIGxvY2FsIGRhdGFiYXNlLgorCisgICAgQXJnczoKKyAgICAgIHNlcnZpY2VfZGVzY3JpcHRvciAoU2VydmljZURlc2NyaXB0b3IpOiB0aGUgc2VydmljZSBkZXNjcmlwdG9yIHRvCisgICAgICAgIHJlZ2lzdGVyLgorICAgICIiIgorICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ3B5dGhvbic6CisgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICBzZWxmLnBvb2wuX0FkZFNlcnZpY2VEZXNjcmlwdG9yKHNlcnZpY2VfZGVzY3JpcHRvcikKKworICBkZWYgUmVnaXN0ZXJGaWxlRGVzY3JpcHRvcihzZWxmLCBmaWxlX2Rlc2NyaXB0b3IpOgorICAgICIiIlJlZ2lzdGVycyB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yIGluIHRoZSBsb2NhbCBkYXRhYmFzZS4KKworICAgIEFyZ3M6CisgICAgICBmaWxlX2Rlc2NyaXB0b3IgKEZpbGVEZXNjcmlwdG9yKTogVGhlIGZpbGUgZGVzY3JpcHRvciB0byByZWdpc3Rlci4KKyAgICAiIiIKKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdweXRob24nOgorICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgc2VsZi5wb29sLl9JbnRlcm5hbEFkZEZpbGVEZXNjcmlwdG9yKGZpbGVfZGVzY3JpcHRvcikKKworICBkZWYgR2V0U3ltYm9sKHNlbGYsIHN5bWJvbCk6CisgICAgIiIiVHJpZXMgdG8gZmluZCBhIHN5bWJvbCBpbiB0aGUgbG9jYWwgZGF0YWJhc2UuCisKKyAgICBDdXJyZW50bHksIHRoaXMgbWV0aG9kIG9ubHkgcmV0dXJucyBtZXNzYWdlLk1lc3NhZ2UgaW5zdGFuY2VzLCBob3dldmVyLCBpZgorICAgIG1heSBiZSBleHRlbmRlZCBpbiBmdXR1cmUgdG8gc3VwcG9ydCBvdGhlciBzeW1ib2wgdHlwZXMuCisKKyAgICBBcmdzOgorICAgICAgc3ltYm9sIChzdHIpOiBhIHByb3RvY29sIGJ1ZmZlciBzeW1ib2wuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBQeXRob24gY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgc3ltYm9sLgorCisgICAgUmFpc2VzOgorICAgICAgS2V5RXJyb3I6IGlmIHRoZSBzeW1ib2wgY291bGQgbm90IGJlIGZvdW5kLgorICAgICIiIgorCisgICAgcmV0dXJuIHNlbGYuX2NsYXNzZXNbc2VsZi5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShzeW1ib2wpXQorCisgIGRlZiBHZXRNZXNzYWdlcyhzZWxmLCBmaWxlcyk6CisgICAgIyBUT0RPKGFtYXVyeWZhKTogRml4IHRoZSBkaWZmZXJlbmNlcyB3aXRoIE1lc3NhZ2VGYWN0b3J5LgorICAgICIiIkdldHMgYWxsIHJlZ2lzdGVyZWQgbWVzc2FnZXMgZnJvbSBhIHNwZWNpZmllZCBmaWxlLgorCisgICAgT25seSBtZXNzYWdlcyBhbHJlYWR5IGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQgd2lsbCBiZSByZXR1cm5lZDsgKHRoaXMgaXMgdGhlCisgICAgY2FzZSBmb3IgaW1wb3J0ZWQgX3BiMiBtb2R1bGVzKQorICAgIEJ1dCB1bmxpa2UgTWVzc2FnZUZhY3RvcnksIHRoaXMgdmVyc2lvbiBhbHNvIHJldHVybnMgYWxyZWFkeSBkZWZpbmVkIG5lc3RlZAorICAgIG1lc3NhZ2VzLCBidXQgZG9lcyBub3QgcmVnaXN0ZXIgYW55IG1lc3NhZ2UgZXh0ZW5zaW9ucy4KKworICAgIEFyZ3M6CisgICAgICBmaWxlcyAobGlzdFtzdHJdKTogVGhlIGZpbGUgbmFtZXMgdG8gZXh0cmFjdCBtZXNzYWdlcyBmcm9tLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgZGljdGlvbmFyeSBtYXBwaW5nIHByb3RvIG5hbWVzIHRvIHRoZSBtZXNzYWdlIGNsYXNzZXMuCisKKyAgICBSYWlzZXM6CisgICAgICBLZXlFcnJvcjogaWYgYSBmaWxlIGNvdWxkIG5vdCBiZSBmb3VuZC4KKyAgICAiIiIKKworICAgIGRlZiBfR2V0QWxsTWVzc2FnZXMoZGVzYyk6CisgICAgICAiIiJXYWxrIGEgbWVzc2FnZSBEZXNjcmlwdG9yIGFuZCByZWN1cnNpdmVseSB5aWVsZHMgYWxsIG1lc3NhZ2UgbmFtZXMuIiIiCisgICAgICB5aWVsZCBkZXNjCisgICAgICBmb3IgbXNnX2Rlc2MgaW4gZGVzYy5uZXN0ZWRfdHlwZXM6CisgICAgICAgIGZvciBuZXN0ZWRfZGVzYyBpbiBfR2V0QWxsTWVzc2FnZXMobXNnX2Rlc2MpOgorICAgICAgICAgIHlpZWxkIG5lc3RlZF9kZXNjCisKKyAgICByZXN1bHQgPSB7fQorICAgIGZvciBmaWxlX25hbWUgaW4gZmlsZXM6CisgICAgICBmaWxlX2Rlc2MgPSBzZWxmLnBvb2wuRmluZEZpbGVCeU5hbWUoZmlsZV9uYW1lKQorICAgICAgZm9yIG1zZ19kZXNjIGluIGZpbGVfZGVzYy5tZXNzYWdlX3R5cGVzX2J5X25hbWUudmFsdWVzKCk6CisgICAgICAgIGZvciBkZXNjIGluIF9HZXRBbGxNZXNzYWdlcyhtc2dfZGVzYyk6CisgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0W2Rlc2MuZnVsbF9uYW1lXSA9IHNlbGYuX2NsYXNzZXNbZGVzY10KKyAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAjIFRoaXMgZGVzY3JpcHRvciBoYXMgbm8gcmVnaXN0ZXJlZCBjbGFzcywgc2tpcCBpdC4KKyAgICAgICAgICAgIHBhc3MKKyAgICByZXR1cm4gcmVzdWx0CisKKworX0RFRkFVTFQgPSBTeW1ib2xEYXRhYmFzZShwb29sPWRlc2NyaXB0b3JfcG9vbC5EZWZhdWx0KCkpCisKKworZGVmIERlZmF1bHQoKToKKyAgIiIiUmV0dXJucyB0aGUgZGVmYXVsdCBTeW1ib2xEYXRhYmFzZS4iIiIKKyAgcmV0dXJuIF9ERUZBVUxUCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3RleHRfZW5jb2RpbmcucHkgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3RleHRfZW5jb2RpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU5Y2YxMQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdGV4dF9lbmNvZGluZy5weQpAQCAtMCwwICsxLDExMCBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJFbmNvZGluZyByZWxhdGVkIHV0aWxpdGllcy4iIiIKK2ltcG9ydCByZQorCitfY2VzY2FwZV9jaHJfdG9fc3ltYm9sX21hcCA9IHt9CitfY2VzY2FwZV9jaHJfdG9fc3ltYm9sX21hcFs5XSA9IHInXHQnICAjIG9wdGlvbmFsIGVzY2FwZQorX2Nlc2NhcGVfY2hyX3RvX3N5bWJvbF9tYXBbMTBdID0gcidcbicgICMgb3B0aW9uYWwgZXNjYXBlCitfY2VzY2FwZV9jaHJfdG9fc3ltYm9sX21hcFsxM10gPSByJ1xyJyAgIyBvcHRpb25hbCBlc2NhcGUKK19jZXNjYXBlX2Nocl90b19zeW1ib2xfbWFwWzM0XSA9IHInXCInICAjIG5lY2Vzc2FyeSBlc2NhcGUKK19jZXNjYXBlX2Nocl90b19zeW1ib2xfbWFwWzM5XSA9IHIiXCciICAjIG9wdGlvbmFsIGVzY2FwZQorX2Nlc2NhcGVfY2hyX3RvX3N5bWJvbF9tYXBbOTJdID0gcidcXCcgICMgbmVjZXNzYXJ5IGVzY2FwZQorCisjIExvb2t1cCB0YWJsZSBmb3IgdW5pY29kZQorX2Nlc2NhcGVfdW5pY29kZV90b19zdHIgPSBbY2hyKGkpIGZvciBpIGluIHJhbmdlKDAsIDI1NildCitmb3IgYnl0ZSwgc3RyaW5nIGluIF9jZXNjYXBlX2Nocl90b19zeW1ib2xfbWFwLml0ZW1zKCk6CisgIF9jZXNjYXBlX3VuaWNvZGVfdG9fc3RyW2J5dGVdID0gc3RyaW5nCisKKyMgTG9va3VwIHRhYmxlIGZvciBub24tdXRmOCwgd2l0aCBuZWNlc3NhcnkgZXNjYXBlcyBhdCAobyA+PSAxMjcgb3IgbyA8IDMyKQorX2Nlc2NhcGVfYnl0ZV90b19zdHIgPSAoW3InXCUwM28nICUgaSBmb3IgaSBpbiByYW5nZSgwLCAzMildICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtjaHIoaSkgZm9yIGkgaW4gcmFuZ2UoMzIsIDEyNyldICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtyJ1wlMDNvJyAlIGkgZm9yIGkgaW4gcmFuZ2UoMTI3LCAyNTYpXSkKK2ZvciBieXRlLCBzdHJpbmcgaW4gX2Nlc2NhcGVfY2hyX3RvX3N5bWJvbF9tYXAuaXRlbXMoKToKKyAgX2Nlc2NhcGVfYnl0ZV90b19zdHJbYnl0ZV0gPSBzdHJpbmcKK2RlbCBieXRlLCBzdHJpbmcKKworCitkZWYgQ0VzY2FwZSh0ZXh0LCBhc191dGY4KToKKyAgIyB0eXBlOiAoLi4uKSAtPiBzdHIKKyAgIiIiRXNjYXBlIGEgYnl0ZXMgc3RyaW5nIGZvciB1c2UgaW4gYW4gdGV4dCBwcm90b2NvbCBidWZmZXIuCisKKyAgQXJnczoKKyAgICB0ZXh0OiBBIGJ5dGUgc3RyaW5nIHRvIGJlIGVzY2FwZWQuCisgICAgYXNfdXRmODogU3BlY2lmaWVzIGlmIHJlc3VsdCBtYXkgY29udGFpbiBub24tQVNDSUkgY2hhcmFjdGVycy4KKyAgICAgICAgSW4gUHl0aG9uIDMgdGhpcyBhbGxvd3MgdW5lc2NhcGVkIG5vbi1BU0NJSSBVbmljb2RlIGNoYXJhY3RlcnMuCisgICAgICAgIEluIFB5dGhvbiAyIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB2YWxpZCBVVEYtOCByYXRoZXIgdGhhbiBvbmx5IEFTQ0lJLgorICBSZXR1cm5zOgorICAgIEVzY2FwZWQgc3RyaW5nIChzdHIpLgorICAiIiIKKyAgIyBQeXRob24ncyB0ZXh0LmVuY29kZSgpICdzdHJpbmdfZXNjYXBlJyBvciAndW5pY29kZV9lc2NhcGUnIGNvZGVjcyBkbyBub3QKKyAgIyBzYXRpc2Z5IG91ciBuZWVkczsgdGhleSBlbmNvZGVzIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgdXNpbmcgdHdvLWRpZ2l0IGhleAorICAjIGVzY2FwZXMgd2hlcmVhcyBvdXIgQysrIHVuZXNjYXBpbmcgZnVuY3Rpb24gYWxsb3dzIGhleCBlc2NhcGVzIHRvIGJlIGFueQorICAjIGxlbmd0aC4gIFNvLCAiXDAwMTEiLmVuY29kZSgnc3RyaW5nX2VzY2FwZScpIGVuZHMgdXAgYmVpbmcgIlxceDAxMSIsIHdoaWNoCisgICMgd2lsbCBiZSBkZWNvZGVkIGluIEMrKyBhcyBhIHNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5nIHdpdGggY2hhciBjb2RlIDB4MTEuCisgIHRleHRfaXNfdW5pY29kZSA9IGlzaW5zdGFuY2UodGV4dCwgc3RyKQorICBpZiBhc191dGY4IGFuZCB0ZXh0X2lzX3VuaWNvZGU6CisgICAgIyBXZSdyZSBhbHJlYWR5IHVuaWNvZGUsIG5vIHByb2Nlc3NpbmcgYmV5b25kIGNvbnRyb2wgY2hhciBlc2NhcGVzLgorICAgIHJldHVybiB0ZXh0LnRyYW5zbGF0ZShfY2VzY2FwZV9jaHJfdG9fc3ltYm9sX21hcCkKKyAgb3JkXyA9IG9yZCBpZiB0ZXh0X2lzX3VuaWNvZGUgZWxzZSBsYW1iZGEgeDogeCAgIyBieXRlcyBpdGVyYXRlIGFzIGludHMuCisgIGlmIGFzX3V0Zjg6CisgICAgcmV0dXJuICcnLmpvaW4oX2Nlc2NhcGVfdW5pY29kZV90b19zdHJbb3JkXyhjKV0gZm9yIGMgaW4gdGV4dCkKKyAgcmV0dXJuICcnLmpvaW4oX2Nlc2NhcGVfYnl0ZV90b19zdHJbb3JkXyhjKV0gZm9yIGMgaW4gdGV4dCkKKworCitfQ1VORVNDQVBFX0hFWCA9IHJlLmNvbXBpbGUocicoXFwrKXgoWzAtOWEtZkEtRl0pKD8hWzAtOWEtZkEtRl0pJykKKworCitkZWYgQ1VuZXNjYXBlKHRleHQpOgorICAjIHR5cGU6IChzdHIpIC0+IGJ5dGVzCisgICIiIlVuZXNjYXBlIGEgdGV4dCBzdHJpbmcgd2l0aCBDLXN0eWxlIGVzY2FwZSBzZXF1ZW5jZXMgdG8gVVRGLTggYnl0ZXMuCisKKyAgQXJnczoKKyAgICB0ZXh0OiBUaGUgZGF0YSB0byBwYXJzZSBpbiBhIHN0ci4KKyAgUmV0dXJuczoKKyAgICBBIGJ5dGUgc3RyaW5nLgorICAiIiIKKworICBkZWYgUmVwbGFjZUhleChtKToKKyAgICAjIE9ubHkgcmVwbGFjZSB0aGUgbWF0Y2ggaWYgdGhlIG51bWJlciBvZiBsZWFkaW5nIGJhY2sgc2xhc2hlcyBpcyBvZGQuIGkuZS4KKyAgICAjIHRoZSBzbGFzaCBpdHNlbGYgaXMgbm90IGVzY2FwZWQuCisgICAgaWYgbGVuKG0uZ3JvdXAoMSkpICYgMToKKyAgICAgIHJldHVybiBtLmdyb3VwKDEpICsgJ3gwJyArIG0uZ3JvdXAoMikKKyAgICByZXR1cm4gbS5ncm91cCgwKQorCisgICMgVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSAnc3RyaW5nX2VzY2FwZScgZW5jb2RpbmcgZG9lc24ndAorICAjIGFsbG93IHNpbmdsZS1kaWdpdCBoZXggZXNjYXBlcyAobGlrZSAnXHhmJykuCisgIHJlc3VsdCA9IF9DVU5FU0NBUEVfSEVYLnN1YihSZXBsYWNlSGV4LCB0ZXh0KQorCisgIHJldHVybiAocmVzdWx0LmVuY29kZSgndXRmLTgnKSAgIyBNYWtlIGl0IGJ5dGVzIHRvIGFsbG93IGRlY29kZS4KKyAgICAgICAgICAuZGVjb2RlKCd1bmljb2RlX2VzY2FwZScpCisgICAgICAgICAgIyBNYWtlIGl0IGJ5dGVzIGFnYWluIHRvIHJldHVybiB0aGUgcHJvcGVyIHR5cGUuCisgICAgICAgICAgLmVuY29kZSgncmF3X3VuaWNvZGVfZXNjYXBlJykpCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LnB5IGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmQ4YmNmCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5weQpAQCAtMCwwICsxLDE4NDIgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiQ29udGFpbnMgcm91dGluZXMgZm9yIHByaW50aW5nIHByb3RvY29sIG1lc3NhZ2VzIGluIHRleHQgZm9ybWF0LgorCitTaW1wbGUgdXNhZ2UgZXhhbXBsZTo6CisKKyAgIyBDcmVhdGUgYSBwcm90byBvYmplY3QgYW5kIHNlcmlhbGl6ZSBpdCB0byBhIHRleHQgcHJvdG8gc3RyaW5nLgorICBtZXNzYWdlID0gbXlfcHJvdG9fcGIyLk15TWVzc2FnZShmb289J2JhcicpCisgIHRleHRfcHJvdG8gPSB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSkKKworICAjIFBhcnNlIGEgdGV4dCBwcm90byBzdHJpbmcuCisgIG1lc3NhZ2UgPSB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0X3Byb3RvLCBteV9wcm90b19wYjIuTXlNZXNzYWdlKCkpCisiIiIKKworX19hdXRob3JfXyA9ICdrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKScKKworIyBUT0RPKGIvMTI5OTg5MzE0KSBJbXBvcnQgdGhyZWFkIGNvbnRlbnRpb24gbGVhZHMgdG8gdGVzdCBmYWlsdXJlcy4KK2ltcG9ydCBlbmNvZGluZ3MucmF3X3VuaWNvZGVfZXNjYXBlICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0CitpbXBvcnQgZW5jb2RpbmdzLnVuaWNvZGVfZXNjYXBlICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0CitpbXBvcnQgaW8KK2ltcG9ydCBtYXRoCitpbXBvcnQgcmUKKworZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGRlY29kZXIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB0eXBlX2NoZWNrZXJzCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHRleHRfZW5jb2RpbmcKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bmtub3duX2ZpZWxkcworCisjIHB5bGludDogZGlzYWJsZT1nLWltcG9ydC1ub3QtYXQtdG9wCitfX2FsbF9fID0gWydNZXNzYWdlVG9TdHJpbmcnLCAnUGFyc2UnLCAnUHJpbnRNZXNzYWdlJywgJ1ByaW50RmllbGQnLAorICAgICAgICAgICAnUHJpbnRGaWVsZFZhbHVlJywgJ01lcmdlJywgJ01lc3NhZ2VUb0J5dGVzJ10KKworX0lOVEVHRVJfQ0hFQ0tFUlMgPSAodHlwZV9jaGVja2Vycy5VaW50MzJWYWx1ZUNoZWNrZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGVfY2hlY2tlcnMuSW50MzJWYWx1ZUNoZWNrZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGVfY2hlY2tlcnMuVWludDY0VmFsdWVDaGVja2VyKCksCisgICAgICAgICAgICAgICAgICAgICB0eXBlX2NoZWNrZXJzLkludDY0VmFsdWVDaGVja2VyKCkpCitfRkxPQVRfSU5GSU5JVFkgPSByZS5jb21waWxlKCctP2luZig/OmluaXR5KT9mPyQnLCByZS5JR05PUkVDQVNFKQorX0ZMT0FUX05BTiA9IHJlLmNvbXBpbGUoJ25hbmY/JCcsIHJlLklHTk9SRUNBU0UpCitfUVVPVEVTID0gZnJvemVuc2V0KCgiJyIsICciJykpCitfQU5ZX0ZVTExfVFlQRV9OQU1FID0gJ2dvb2dsZS5wcm90b2J1Zi5BbnknCisKKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgIiIiVG9wLWxldmVsIG1vZHVsZSBlcnJvciBmb3IgdGV4dF9mb3JtYXQuIiIiCisKKworY2xhc3MgUGFyc2VFcnJvcihFcnJvcik6CisgICIiIlRocm93biBpbiBjYXNlIG9mIHRleHQgcGFyc2luZyBvciB0b2tlbml6aW5nIGVycm9yLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUsIGxpbmU9Tm9uZSwgY29sdW1uPU5vbmUpOgorICAgIGlmIG1lc3NhZ2UgaXMgbm90IE5vbmUgYW5kIGxpbmUgaXMgbm90IE5vbmU6CisgICAgICBsb2MgPSBzdHIobGluZSkKKyAgICAgIGlmIGNvbHVtbiBpcyBub3QgTm9uZToKKyAgICAgICAgbG9jICs9ICc6ezB9Jy5mb3JtYXQoY29sdW1uKQorICAgICAgbWVzc2FnZSA9ICd7MH0gOiB7MX0nLmZvcm1hdChsb2MsIG1lc3NhZ2UpCisgICAgaWYgbWVzc2FnZSBpcyBub3QgTm9uZToKKyAgICAgIHN1cGVyKFBhcnNlRXJyb3IsIHNlbGYpLl9faW5pdF9fKG1lc3NhZ2UpCisgICAgZWxzZToKKyAgICAgIHN1cGVyKFBhcnNlRXJyb3IsIHNlbGYpLl9faW5pdF9fKCkKKyAgICBzZWxmLl9saW5lID0gbGluZQorICAgIHNlbGYuX2NvbHVtbiA9IGNvbHVtbgorCisgIGRlZiBHZXRMaW5lKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9saW5lCisKKyAgZGVmIEdldENvbHVtbihzZWxmKToKKyAgICByZXR1cm4gc2VsZi5fY29sdW1uCisKKworY2xhc3MgVGV4dFdyaXRlcihvYmplY3QpOgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBhc191dGY4KToKKyAgICBzZWxmLl93cml0ZXIgPSBpby5TdHJpbmdJTygpCisKKyAgZGVmIHdyaXRlKHNlbGYsIHZhbCk6CisgICAgcmV0dXJuIHNlbGYuX3dyaXRlci53cml0ZSh2YWwpCisKKyAgZGVmIGNsb3NlKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl93cml0ZXIuY2xvc2UoKQorCisgIGRlZiBnZXR2YWx1ZShzZWxmKToKKyAgICByZXR1cm4gc2VsZi5fd3JpdGVyLmdldHZhbHVlKCkKKworCitkZWYgTWVzc2FnZVRvU3RyaW5nKAorICAgIG1lc3NhZ2UsCisgICAgYXNfdXRmOD1GYWxzZSwKKyAgICBhc19vbmVfbGluZT1GYWxzZSwKKyAgICB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlcz1GYWxzZSwKKyAgICBwb2ludHlfYnJhY2tldHM9RmFsc2UsCisgICAgdXNlX2luZGV4X29yZGVyPUZhbHNlLAorICAgIGZsb2F0X2Zvcm1hdD1Ob25lLAorICAgIGRvdWJsZV9mb3JtYXQ9Tm9uZSwKKyAgICB1c2VfZmllbGRfbnVtYmVyPUZhbHNlLAorICAgIGRlc2NyaXB0b3JfcG9vbD1Ob25lLAorICAgIGluZGVudD0wLAorICAgIG1lc3NhZ2VfZm9ybWF0dGVyPU5vbmUsCisgICAgcHJpbnRfdW5rbm93bl9maWVsZHM9RmFsc2UsCisgICAgZm9yY2VfY29sb249RmFsc2UpOgorICAjIHR5cGU6ICguLi4pIC0+IHN0cgorICAiIiJDb252ZXJ0IHByb3RvYnVmIG1lc3NhZ2UgdG8gdGV4dCBmb3JtYXQuCisKKyAgRG91YmxlIHZhbHVlcyBjYW4gYmUgZm9ybWF0dGVkIGNvbXBhY3RseSB3aXRoIDE1IGRpZ2l0cyBvZgorICBwcmVjaXNpb24gKHdoaWNoIGlzIHRoZSBtb3N0IHRoYXQgSUVFRSA3NTQgImRvdWJsZSIgY2FuIGd1YXJhbnRlZSkKKyAgdXNpbmcgZG91YmxlX2Zvcm1hdD0nLjE1ZycuIFRvIGVuc3VyZSB0aGF0IGNvbnZlcnRpbmcgdG8gdGV4dCBhbmQgYmFjayB0byBhCisgIHByb3RvIHdpbGwgcmVzdWx0IGluIGFuIGlkZW50aWNhbCB2YWx1ZSwgZG91YmxlX2Zvcm1hdD0nLjE3Zycgc2hvdWxkIGJlIHVzZWQuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlOiBUaGUgcHJvdG9jb2wgYnVmZmVycyBtZXNzYWdlLgorICAgIGFzX3V0Zjg6IFJldHVybiB1bmVzY2FwZWQgVW5pY29kZSBmb3Igbm9uLUFTQ0lJIGNoYXJhY3RlcnMuCisgICAgYXNfb25lX2xpbmU6IERvbid0IGludHJvZHVjZSBuZXdsaW5lcyBiZXR3ZWVuIGZpZWxkcy4KKyAgICB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlczogVXNlIHNob3J0IHJlcGVhdGVkIGZvcm1hdCBmb3IgcHJpbWl0aXZlcy4KKyAgICBwb2ludHlfYnJhY2tldHM6IElmIFRydWUsIHVzZSBhbmdsZSBicmFja2V0cyBpbnN0ZWFkIG9mIGN1cmx5IGJyYWNlcyBmb3IKKyAgICAgIG5lc3RpbmcuCisgICAgdXNlX2luZGV4X29yZGVyOiBJZiBUcnVlLCBmaWVsZHMgb2YgYSBwcm90byBtZXNzYWdlIHdpbGwgYmUgcHJpbnRlZCB1c2luZworICAgICAgdGhlIG9yZGVyIGRlZmluZWQgaW4gc291cmNlIGNvZGUgaW5zdGVhZCBvZiB0aGUgZmllbGQgbnVtYmVyLCBleHRlbnNpb25zCisgICAgICB3aWxsIGJlIHByaW50ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZSBhbmQgdGhlaXIgcmVsYXRpdmUgb3JkZXIgaXMKKyAgICAgIGRldGVybWluZWQgYnkgdGhlIGV4dGVuc2lvbiBudW1iZXIuIEJ5IGRlZmF1bHQsIHVzZSB0aGUgZmllbGQgbnVtYmVyCisgICAgICBvcmRlci4KKyAgICBmbG9hdF9mb3JtYXQgKHN0cik6IElmIHNldCwgdXNlIHRoaXMgdG8gc3BlY2lmeSBmbG9hdCBmaWVsZCBmb3JtYXR0aW5nCisgICAgICAocGVyIHRoZSAiRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZSIpOyBvdGhlcndpc2UsIHNob3J0ZXN0IGZsb2F0CisgICAgICB0aGF0IGhhcyBzYW1lIHZhbHVlIGluIHdpcmUgd2lsbCBiZSBwcmludGVkLiBBbHNvIGFmZmVjdCBkb3VibGUgZmllbGQKKyAgICAgIGlmIGRvdWJsZV9mb3JtYXQgaXMgbm90IHNldCBidXQgZmxvYXRfZm9ybWF0IGlzIHNldC4KKyAgICBkb3VibGVfZm9ybWF0IChzdHIpOiBJZiBzZXQsIHVzZSB0aGlzIHRvIHNwZWNpZnkgZG91YmxlIGZpZWxkIGZvcm1hdHRpbmcKKyAgICAgIChwZXIgdGhlICJGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlIik7IGlmIGl0IGlzIG5vdCBzZXQgYnV0CisgICAgICBmbG9hdF9mb3JtYXQgaXMgc2V0LCB1c2UgZmxvYXRfZm9ybWF0LiBPdGhlcndpc2UsIHVzZSBgYHN0cigpYGAKKyAgICB1c2VfZmllbGRfbnVtYmVyOiBJZiBUcnVlLCBwcmludCBmaWVsZCBudW1iZXJzIGluc3RlYWQgb2YgbmFtZXMuCisgICAgZGVzY3JpcHRvcl9wb29sIChEZXNjcmlwdG9yUG9vbCk6IERlc2NyaXB0b3IgcG9vbCB1c2VkIHRvIHJlc29sdmUgQW55IHR5cGVzLgorICAgIGluZGVudCAoaW50KTogVGhlIGluaXRpYWwgaW5kZW50IGxldmVsLCBpbiB0ZXJtcyBvZiBzcGFjZXMsIGZvciBwcmV0dHkKKyAgICAgIHByaW50LgorICAgIG1lc3NhZ2VfZm9ybWF0dGVyIChmdW5jdGlvbihtZXNzYWdlLCBpbmRlbnQsIGFzX29uZV9saW5lKSAtPiB1bmljb2RlfE5vbmUpOgorICAgICAgQ3VzdG9tIGZvcm1hdHRlciBmb3Igc2VsZWN0ZWQgc3ViLW1lc3NhZ2VzICh1c3VhbGx5IGJhc2VkIG9uIG1lc3NhZ2UKKyAgICAgIHR5cGUpLiBVc2UgdG8gcHJldHR5IHByaW50IHBhcnRzIG9mIHRoZSBwcm90b2J1ZiBmb3IgZWFzaWVyIGRpZmZpbmcuCisgICAgcHJpbnRfdW5rbm93bl9maWVsZHM6IElmIFRydWUsIHVua25vd24gZmllbGRzIHdpbGwgYmUgcHJpbnRlZC4KKyAgICBmb3JjZV9jb2xvbjogSWYgc2V0LCBhIGNvbG9uIHdpbGwgYmUgYWRkZWQgYWZ0ZXIgdGhlIGZpZWxkIG5hbWUgZXZlbiBpZiB0aGUKKyAgICAgIGZpZWxkIGlzIGEgcHJvdG8gbWVzc2FnZS4KKworICBSZXR1cm5zOgorICAgIHN0cjogQSBzdHJpbmcgb2YgdGhlIHRleHQgZm9ybWF0dGVkIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlLgorICAiIiIKKyAgb3V0ID0gVGV4dFdyaXRlcihhc191dGY4KQorICBwcmludGVyID0gX1ByaW50ZXIoCisgICAgICBvdXQsCisgICAgICBpbmRlbnQsCisgICAgICBhc191dGY4LAorICAgICAgYXNfb25lX2xpbmUsCisgICAgICB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlcywKKyAgICAgIHBvaW50eV9icmFja2V0cywKKyAgICAgIHVzZV9pbmRleF9vcmRlciwKKyAgICAgIGZsb2F0X2Zvcm1hdCwKKyAgICAgIGRvdWJsZV9mb3JtYXQsCisgICAgICB1c2VfZmllbGRfbnVtYmVyLAorICAgICAgZGVzY3JpcHRvcl9wb29sLAorICAgICAgbWVzc2FnZV9mb3JtYXR0ZXIsCisgICAgICBwcmludF91bmtub3duX2ZpZWxkcz1wcmludF91bmtub3duX2ZpZWxkcywKKyAgICAgIGZvcmNlX2NvbG9uPWZvcmNlX2NvbG9uKQorICBwcmludGVyLlByaW50TWVzc2FnZShtZXNzYWdlKQorICByZXN1bHQgPSBvdXQuZ2V0dmFsdWUoKQorICBvdXQuY2xvc2UoKQorICBpZiBhc19vbmVfbGluZToKKyAgICByZXR1cm4gcmVzdWx0LnJzdHJpcCgpCisgIHJldHVybiByZXN1bHQKKworCitkZWYgTWVzc2FnZVRvQnl0ZXMobWVzc2FnZSwgKiprd2FyZ3MpOgorICAjIHR5cGU6ICguLi4pIC0+IGJ5dGVzCisgICIiIkNvbnZlcnQgcHJvdG9idWYgbWVzc2FnZSB0byBlbmNvZGVkIHRleHQgZm9ybWF0LiAgU2VlIE1lc3NhZ2VUb1N0cmluZy4iIiIKKyAgdGV4dCA9IE1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCAqKmt3YXJncykKKyAgaWYgaXNpbnN0YW5jZSh0ZXh0LCBieXRlcyk6CisgICAgcmV0dXJuIHRleHQKKyAgY29kZWMgPSAndXRmLTgnIGlmIGt3YXJncy5nZXQoJ2FzX3V0ZjgnKSBlbHNlICdhc2NpaScKKyAgcmV0dXJuIHRleHQuZW5jb2RlKGNvZGVjKQorCisKK2RlZiBfSXNNYXBFbnRyeShmaWVsZCk6CisgIHJldHVybiAoZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0UgYW5kCisgICAgICAgICAgZmllbGQubWVzc2FnZV90eXBlLmhhc19vcHRpb25zIGFuZAorICAgICAgICAgIGZpZWxkLm1lc3NhZ2VfdHlwZS5HZXRPcHRpb25zKCkubWFwX2VudHJ5KQorCisKK2RlZiBQcmludE1lc3NhZ2UobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgb3V0LAorICAgICAgICAgICAgICAgICBpbmRlbnQ9MCwKKyAgICAgICAgICAgICAgICAgYXNfdXRmOD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgYXNfb25lX2xpbmU9RmFsc2UsCisgICAgICAgICAgICAgICAgIHVzZV9zaG9ydF9yZXBlYXRlZF9wcmltaXRpdmVzPUZhbHNlLAorICAgICAgICAgICAgICAgICBwb2ludHlfYnJhY2tldHM9RmFsc2UsCisgICAgICAgICAgICAgICAgIHVzZV9pbmRleF9vcmRlcj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgZmxvYXRfZm9ybWF0PU5vbmUsCisgICAgICAgICAgICAgICAgIGRvdWJsZV9mb3JtYXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgdXNlX2ZpZWxkX251bWJlcj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wb29sPU5vbmUsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2VfZm9ybWF0dGVyPU5vbmUsCisgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZmllbGRzPUZhbHNlLAorICAgICAgICAgICAgICAgICBmb3JjZV9jb2xvbj1GYWxzZSk6CisgICIiIkNvbnZlcnQgdGhlIG1lc3NhZ2UgdG8gdGV4dCBmb3JtYXQgYW5kIHdyaXRlIGl0IHRvIHRoZSBvdXQgc3RyZWFtLgorCisgIEFyZ3M6CisgICAgbWVzc2FnZTogVGhlIE1lc3NhZ2Ugb2JqZWN0IHRvIGNvbnZlcnQgdG8gdGV4dCBmb3JtYXQuCisgICAgb3V0OiBBIGZpbGUgaGFuZGxlIHRvIHdyaXRlIHRoZSBtZXNzYWdlIHRvLgorICAgIGluZGVudDogVGhlIGluaXRpYWwgaW5kZW50IGxldmVsIGZvciBwcmV0dHkgcHJpbnQuCisgICAgYXNfdXRmODogUmV0dXJuIHVuZXNjYXBlZCBVbmljb2RlIGZvciBub24tQVNDSUkgY2hhcmFjdGVycy4KKyAgICBhc19vbmVfbGluZTogRG9uJ3QgaW50cm9kdWNlIG5ld2xpbmVzIGJldHdlZW4gZmllbGRzLgorICAgIHVzZV9zaG9ydF9yZXBlYXRlZF9wcmltaXRpdmVzOiBVc2Ugc2hvcnQgcmVwZWF0ZWQgZm9ybWF0IGZvciBwcmltaXRpdmVzLgorICAgIHBvaW50eV9icmFja2V0czogSWYgVHJ1ZSwgdXNlIGFuZ2xlIGJyYWNrZXRzIGluc3RlYWQgb2YgY3VybHkgYnJhY2VzIGZvcgorICAgICAgbmVzdGluZy4KKyAgICB1c2VfaW5kZXhfb3JkZXI6IElmIFRydWUsIHByaW50IGZpZWxkcyBvZiBhIHByb3RvIG1lc3NhZ2UgdXNpbmcgdGhlIG9yZGVyCisgICAgICBkZWZpbmVkIGluIHNvdXJjZSBjb2RlIGluc3RlYWQgb2YgdGhlIGZpZWxkIG51bWJlci4gQnkgZGVmYXVsdCwgdXNlIHRoZQorICAgICAgZmllbGQgbnVtYmVyIG9yZGVyLgorICAgIGZsb2F0X2Zvcm1hdDogSWYgc2V0LCB1c2UgdGhpcyB0byBzcGVjaWZ5IGZsb2F0IGZpZWxkIGZvcm1hdHRpbmcKKyAgICAgIChwZXIgdGhlICJGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlIik7IG90aGVyd2lzZSwgc2hvcnRlc3QKKyAgICAgIGZsb2F0IHRoYXQgaGFzIHNhbWUgdmFsdWUgaW4gd2lyZSB3aWxsIGJlIHByaW50ZWQuIEFsc28gYWZmZWN0IGRvdWJsZQorICAgICAgZmllbGQgaWYgZG91YmxlX2Zvcm1hdCBpcyBub3Qgc2V0IGJ1dCBmbG9hdF9mb3JtYXQgaXMgc2V0LgorICAgIGRvdWJsZV9mb3JtYXQ6IElmIHNldCwgdXNlIHRoaXMgdG8gc3BlY2lmeSBkb3VibGUgZmllbGQgZm9ybWF0dGluZworICAgICAgKHBlciB0aGUgIkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UiKTsgaWYgaXQgaXMgbm90IHNldCBidXQKKyAgICAgIGZsb2F0X2Zvcm1hdCBpcyBzZXQsIHVzZSBmbG9hdF9mb3JtYXQuIE90aGVyd2lzZSwgc3RyKCkgaXMgdXNlZC4KKyAgICB1c2VfZmllbGRfbnVtYmVyOiBJZiBUcnVlLCBwcmludCBmaWVsZCBudW1iZXJzIGluc3RlYWQgb2YgbmFtZXMuCisgICAgZGVzY3JpcHRvcl9wb29sOiBBIERlc2NyaXB0b3JQb29sIHVzZWQgdG8gcmVzb2x2ZSBBbnkgdHlwZXMuCisgICAgbWVzc2FnZV9mb3JtYXR0ZXI6IEEgZnVuY3Rpb24obWVzc2FnZSwgaW5kZW50LCBhc19vbmVfbGluZSk6IHVuaWNvZGV8Tm9uZQorICAgICAgdG8gY3VzdG9tIGZvcm1hdCBzZWxlY3RlZCBzdWItbWVzc2FnZXMgKHVzdWFsbHkgYmFzZWQgb24gbWVzc2FnZSB0eXBlKS4KKyAgICAgIFVzZSB0byBwcmV0dHkgcHJpbnQgcGFydHMgb2YgdGhlIHByb3RvYnVmIGZvciBlYXNpZXIgZGlmZmluZy4KKyAgICBwcmludF91bmtub3duX2ZpZWxkczogSWYgVHJ1ZSwgdW5rbm93biBmaWVsZHMgd2lsbCBiZSBwcmludGVkLgorICAgIGZvcmNlX2NvbG9uOiBJZiBzZXQsIGEgY29sb24gd2lsbCBiZSBhZGRlZCBhZnRlciB0aGUgZmllbGQgbmFtZSBldmVuIGlmCisgICAgICB0aGUgZmllbGQgaXMgYSBwcm90byBtZXNzYWdlLgorICAiIiIKKyAgcHJpbnRlciA9IF9QcmludGVyKAorICAgICAgb3V0PW91dCwgaW5kZW50PWluZGVudCwgYXNfdXRmOD1hc191dGY4LAorICAgICAgYXNfb25lX2xpbmU9YXNfb25lX2xpbmUsCisgICAgICB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlcz11c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlcywKKyAgICAgIHBvaW50eV9icmFja2V0cz1wb2ludHlfYnJhY2tldHMsCisgICAgICB1c2VfaW5kZXhfb3JkZXI9dXNlX2luZGV4X29yZGVyLAorICAgICAgZmxvYXRfZm9ybWF0PWZsb2F0X2Zvcm1hdCwKKyAgICAgIGRvdWJsZV9mb3JtYXQ9ZG91YmxlX2Zvcm1hdCwKKyAgICAgIHVzZV9maWVsZF9udW1iZXI9dXNlX2ZpZWxkX251bWJlciwKKyAgICAgIGRlc2NyaXB0b3JfcG9vbD1kZXNjcmlwdG9yX3Bvb2wsCisgICAgICBtZXNzYWdlX2Zvcm1hdHRlcj1tZXNzYWdlX2Zvcm1hdHRlciwKKyAgICAgIHByaW50X3Vua25vd25fZmllbGRzPXByaW50X3Vua25vd25fZmllbGRzLAorICAgICAgZm9yY2VfY29sb249Zm9yY2VfY29sb24pCisgIHByaW50ZXIuUHJpbnRNZXNzYWdlKG1lc3NhZ2UpCisKKworZGVmIFByaW50RmllbGQoZmllbGQsCisgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgIG91dCwKKyAgICAgICAgICAgICAgIGluZGVudD0wLAorICAgICAgICAgICAgICAgYXNfdXRmOD1GYWxzZSwKKyAgICAgICAgICAgICAgIGFzX29uZV9saW5lPUZhbHNlLAorICAgICAgICAgICAgICAgdXNlX3Nob3J0X3JlcGVhdGVkX3ByaW1pdGl2ZXM9RmFsc2UsCisgICAgICAgICAgICAgICBwb2ludHlfYnJhY2tldHM9RmFsc2UsCisgICAgICAgICAgICAgICB1c2VfaW5kZXhfb3JkZXI9RmFsc2UsCisgICAgICAgICAgICAgICBmbG9hdF9mb3JtYXQ9Tm9uZSwKKyAgICAgICAgICAgICAgIGRvdWJsZV9mb3JtYXQ9Tm9uZSwKKyAgICAgICAgICAgICAgIG1lc3NhZ2VfZm9ybWF0dGVyPU5vbmUsCisgICAgICAgICAgICAgICBwcmludF91bmtub3duX2ZpZWxkcz1GYWxzZSwKKyAgICAgICAgICAgICAgIGZvcmNlX2NvbG9uPUZhbHNlKToKKyAgIiIiUHJpbnQgYSBzaW5nbGUgZmllbGQgbmFtZS92YWx1ZSBwYWlyLiIiIgorICBwcmludGVyID0gX1ByaW50ZXIob3V0LCBpbmRlbnQsIGFzX3V0ZjgsIGFzX29uZV9saW5lLAorICAgICAgICAgICAgICAgICAgICAgdXNlX3Nob3J0X3JlcGVhdGVkX3ByaW1pdGl2ZXMsIHBvaW50eV9icmFja2V0cywKKyAgICAgICAgICAgICAgICAgICAgIHVzZV9pbmRleF9vcmRlciwgZmxvYXRfZm9ybWF0LCBkb3VibGVfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9mb3JtYXR0ZXI9bWVzc2FnZV9mb3JtYXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2ZpZWxkcz1wcmludF91bmtub3duX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgIGZvcmNlX2NvbG9uPWZvcmNlX2NvbG9uKQorICBwcmludGVyLlByaW50RmllbGQoZmllbGQsIHZhbHVlKQorCisKK2RlZiBQcmludEZpZWxkVmFsdWUoZmllbGQsCisgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICBvdXQsCisgICAgICAgICAgICAgICAgICAgIGluZGVudD0wLAorICAgICAgICAgICAgICAgICAgICBhc191dGY4PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICBhc19vbmVfbGluZT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgdXNlX3Nob3J0X3JlcGVhdGVkX3ByaW1pdGl2ZXM9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgIHBvaW50eV9icmFja2V0cz1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgdXNlX2luZGV4X29yZGVyPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmbG9hdF9mb3JtYXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlX2Zvcm1hdD1Ob25lLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2Zvcm1hdHRlcj1Ob25lLAorICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2ZpZWxkcz1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZm9yY2VfY29sb249RmFsc2UpOgorICAiIiJQcmludCBhIHNpbmdsZSBmaWVsZCB2YWx1ZSAobm90IGluY2x1ZGluZyBuYW1lKS4iIiIKKyAgcHJpbnRlciA9IF9QcmludGVyKG91dCwgaW5kZW50LCBhc191dGY4LCBhc19vbmVfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgIHVzZV9zaG9ydF9yZXBlYXRlZF9wcmltaXRpdmVzLCBwb2ludHlfYnJhY2tldHMsCisgICAgICAgICAgICAgICAgICAgICB1c2VfaW5kZXhfb3JkZXIsIGZsb2F0X2Zvcm1hdCwgZG91YmxlX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfZm9ybWF0dGVyPW1lc3NhZ2VfZm9ybWF0dGVyLAorICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9maWVsZHM9cHJpbnRfdW5rbm93bl9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICBmb3JjZV9jb2xvbj1mb3JjZV9jb2xvbikKKyAgcHJpbnRlci5QcmludEZpZWxkVmFsdWUoZmllbGQsIHZhbHVlKQorCisKK2RlZiBfQnVpbGRNZXNzYWdlRnJvbVR5cGVOYW1lKHR5cGVfbmFtZSwgZGVzY3JpcHRvcl9wb29sKToKKyAgIiIiUmV0dXJucyBhIHByb3RvYnVmIG1lc3NhZ2UgaW5zdGFuY2UuCisKKyAgQXJnczoKKyAgICB0eXBlX25hbWU6IEZ1bGx5LXF1YWxpZmllZCBwcm90b2J1ZiAgbWVzc2FnZSB0eXBlIG5hbWUgc3RyaW5nLgorICAgIGRlc2NyaXB0b3JfcG9vbDogRGVzY3JpcHRvclBvb2wgaW5zdGFuY2UuCisKKyAgUmV0dXJuczoKKyAgICBBIE1lc3NhZ2UgaW5zdGFuY2Ugb2YgdHlwZSBtYXRjaGluZyB0eXBlX25hbWUsIG9yIE5vbmUgaWYgdGhlIGEgRGVzY3JpcHRvcgorICAgIHdhc24ndCBmb3VuZCBtYXRjaGluZyB0eXBlX25hbWUuCisgICIiIgorICAjIHB5bGludDogZGlzYWJsZT1nLWltcG9ydC1ub3QtYXQtdG9wCisgIGlmIGRlc2NyaXB0b3JfcG9vbCBpcyBOb25lOgorICAgIGZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3Bvb2wgYXMgcG9vbF9tb2QKKyAgICBkZXNjcmlwdG9yX3Bvb2wgPSBwb29sX21vZC5EZWZhdWx0KCkKKyAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHN5bWJvbF9kYXRhYmFzZQorICBkYXRhYmFzZSA9IHN5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkKKyAgdHJ5OgorICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JfcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUodHlwZV9uYW1lKQorICBleGNlcHQgS2V5RXJyb3I6CisgICAgcmV0dXJuIE5vbmUKKyAgbWVzc2FnZV90eXBlID0gZGF0YWJhc2UuR2V0UHJvdG90eXBlKG1lc3NhZ2VfZGVzY3JpcHRvcikKKyAgcmV0dXJuIG1lc3NhZ2VfdHlwZSgpCisKKworIyBUaGVzZSB2YWx1ZXMgbXVzdCBtYXRjaCBXaXJlVHlwZSBlbnVtIGluIGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oLgorV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCA9IDIKK1dJUkVUWVBFX1NUQVJUX0dST1VQID0gMworCisKK2NsYXNzIF9QcmludGVyKG9iamVjdCk6CisgICIiIlRleHQgZm9ybWF0IHByaW50ZXIgZm9yIHByb3RvY29sIG1lc3NhZ2UuIiIiCisKKyAgZGVmIF9faW5pdF9fKAorICAgICAgc2VsZiwKKyAgICAgIG91dCwKKyAgICAgIGluZGVudD0wLAorICAgICAgYXNfdXRmOD1GYWxzZSwKKyAgICAgIGFzX29uZV9saW5lPUZhbHNlLAorICAgICAgdXNlX3Nob3J0X3JlcGVhdGVkX3ByaW1pdGl2ZXM9RmFsc2UsCisgICAgICBwb2ludHlfYnJhY2tldHM9RmFsc2UsCisgICAgICB1c2VfaW5kZXhfb3JkZXI9RmFsc2UsCisgICAgICBmbG9hdF9mb3JtYXQ9Tm9uZSwKKyAgICAgIGRvdWJsZV9mb3JtYXQ9Tm9uZSwKKyAgICAgIHVzZV9maWVsZF9udW1iZXI9RmFsc2UsCisgICAgICBkZXNjcmlwdG9yX3Bvb2w9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfZm9ybWF0dGVyPU5vbmUsCisgICAgICBwcmludF91bmtub3duX2ZpZWxkcz1GYWxzZSwKKyAgICAgIGZvcmNlX2NvbG9uPUZhbHNlKToKKyAgICAiIiJJbml0aWFsaXplIHRoZSBQcmludGVyLgorCisgICAgRG91YmxlIHZhbHVlcyBjYW4gYmUgZm9ybWF0dGVkIGNvbXBhY3RseSB3aXRoIDE1IGRpZ2l0cyBvZiBwcmVjaXNpb24KKyAgICAod2hpY2ggaXMgdGhlIG1vc3QgdGhhdCBJRUVFIDc1NCAiZG91YmxlIiBjYW4gZ3VhcmFudGVlKSB1c2luZworICAgIGRvdWJsZV9mb3JtYXQ9Jy4xNWcnLiBUbyBlbnN1cmUgdGhhdCBjb252ZXJ0aW5nIHRvIHRleHQgYW5kIGJhY2sgdG8gYSBwcm90bworICAgIHdpbGwgcmVzdWx0IGluIGFuIGlkZW50aWNhbCB2YWx1ZSwgZG91YmxlX2Zvcm1hdD0nLjE3Zycgc2hvdWxkIGJlIHVzZWQuCisKKyAgICBBcmdzOgorICAgICAgb3V0OiBUbyByZWNvcmQgdGhlIHRleHQgZm9ybWF0IHJlc3VsdC4KKyAgICAgIGluZGVudDogVGhlIGluaXRpYWwgaW5kZW50IGxldmVsIGZvciBwcmV0dHkgcHJpbnQuCisgICAgICBhc191dGY4OiBSZXR1cm4gdW5lc2NhcGVkIFVuaWNvZGUgZm9yIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgorICAgICAgYXNfb25lX2xpbmU6IERvbid0IGludHJvZHVjZSBuZXdsaW5lcyBiZXR3ZWVuIGZpZWxkcy4KKyAgICAgIHVzZV9zaG9ydF9yZXBlYXRlZF9wcmltaXRpdmVzOiBVc2Ugc2hvcnQgcmVwZWF0ZWQgZm9ybWF0IGZvciBwcmltaXRpdmVzLgorICAgICAgcG9pbnR5X2JyYWNrZXRzOiBJZiBUcnVlLCB1c2UgYW5nbGUgYnJhY2tldHMgaW5zdGVhZCBvZiBjdXJseSBicmFjZXMgZm9yCisgICAgICAgIG5lc3RpbmcuCisgICAgICB1c2VfaW5kZXhfb3JkZXI6IElmIFRydWUsIHByaW50IGZpZWxkcyBvZiBhIHByb3RvIG1lc3NhZ2UgdXNpbmcgdGhlIG9yZGVyCisgICAgICAgIGRlZmluZWQgaW4gc291cmNlIGNvZGUgaW5zdGVhZCBvZiB0aGUgZmllbGQgbnVtYmVyLiBCeSBkZWZhdWx0LCB1c2UgdGhlCisgICAgICAgIGZpZWxkIG51bWJlciBvcmRlci4KKyAgICAgIGZsb2F0X2Zvcm1hdDogSWYgc2V0LCB1c2UgdGhpcyB0byBzcGVjaWZ5IGZsb2F0IGZpZWxkIGZvcm1hdHRpbmcKKyAgICAgICAgKHBlciB0aGUgIkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UiKTsgb3RoZXJ3aXNlLCBzaG9ydGVzdAorICAgICAgICBmbG9hdCB0aGF0IGhhcyBzYW1lIHZhbHVlIGluIHdpcmUgd2lsbCBiZSBwcmludGVkLiBBbHNvIGFmZmVjdCBkb3VibGUKKyAgICAgICAgZmllbGQgaWYgZG91YmxlX2Zvcm1hdCBpcyBub3Qgc2V0IGJ1dCBmbG9hdF9mb3JtYXQgaXMgc2V0LgorICAgICAgZG91YmxlX2Zvcm1hdDogSWYgc2V0LCB1c2UgdGhpcyB0byBzcGVjaWZ5IGRvdWJsZSBmaWVsZCBmb3JtYXR0aW5nCisgICAgICAgIChwZXIgdGhlICJGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlIik7IGlmIGl0IGlzIG5vdCBzZXQgYnV0CisgICAgICAgIGZsb2F0X2Zvcm1hdCBpcyBzZXQsIHVzZSBmbG9hdF9mb3JtYXQuIE90aGVyd2lzZSwgc3RyKCkgaXMgdXNlZC4KKyAgICAgIHVzZV9maWVsZF9udW1iZXI6IElmIFRydWUsIHByaW50IGZpZWxkIG51bWJlcnMgaW5zdGVhZCBvZiBuYW1lcy4KKyAgICAgIGRlc2NyaXB0b3JfcG9vbDogQSBEZXNjcmlwdG9yUG9vbCB1c2VkIHRvIHJlc29sdmUgQW55IHR5cGVzLgorICAgICAgbWVzc2FnZV9mb3JtYXR0ZXI6IEEgZnVuY3Rpb24obWVzc2FnZSwgaW5kZW50LCBhc19vbmVfbGluZSk6IHVuaWNvZGV8Tm9uZQorICAgICAgICB0byBjdXN0b20gZm9ybWF0IHNlbGVjdGVkIHN1Yi1tZXNzYWdlcyAodXN1YWxseSBiYXNlZCBvbiBtZXNzYWdlIHR5cGUpLgorICAgICAgICBVc2UgdG8gcHJldHR5IHByaW50IHBhcnRzIG9mIHRoZSBwcm90b2J1ZiBmb3IgZWFzaWVyIGRpZmZpbmcuCisgICAgICBwcmludF91bmtub3duX2ZpZWxkczogSWYgVHJ1ZSwgdW5rbm93biBmaWVsZHMgd2lsbCBiZSBwcmludGVkLgorICAgICAgZm9yY2VfY29sb246IElmIHNldCwgYSBjb2xvbiB3aWxsIGJlIGFkZGVkIGFmdGVyIHRoZSBmaWVsZCBuYW1lIGV2ZW4gaWYKKyAgICAgICAgdGhlIGZpZWxkIGlzIGEgcHJvdG8gbWVzc2FnZS4KKyAgICAiIiIKKyAgICBzZWxmLm91dCA9IG91dAorICAgIHNlbGYuaW5kZW50ID0gaW5kZW50CisgICAgc2VsZi5hc191dGY4ID0gYXNfdXRmOAorICAgIHNlbGYuYXNfb25lX2xpbmUgPSBhc19vbmVfbGluZQorICAgIHNlbGYudXNlX3Nob3J0X3JlcGVhdGVkX3ByaW1pdGl2ZXMgPSB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlcworICAgIHNlbGYucG9pbnR5X2JyYWNrZXRzID0gcG9pbnR5X2JyYWNrZXRzCisgICAgc2VsZi51c2VfaW5kZXhfb3JkZXIgPSB1c2VfaW5kZXhfb3JkZXIKKyAgICBzZWxmLmZsb2F0X2Zvcm1hdCA9IGZsb2F0X2Zvcm1hdAorICAgIGlmIGRvdWJsZV9mb3JtYXQgaXMgbm90IE5vbmU6CisgICAgICBzZWxmLmRvdWJsZV9mb3JtYXQgPSBkb3VibGVfZm9ybWF0CisgICAgZWxzZToKKyAgICAgIHNlbGYuZG91YmxlX2Zvcm1hdCA9IGZsb2F0X2Zvcm1hdAorICAgIHNlbGYudXNlX2ZpZWxkX251bWJlciA9IHVzZV9maWVsZF9udW1iZXIKKyAgICBzZWxmLmRlc2NyaXB0b3JfcG9vbCA9IGRlc2NyaXB0b3JfcG9vbAorICAgIHNlbGYubWVzc2FnZV9mb3JtYXR0ZXIgPSBtZXNzYWdlX2Zvcm1hdHRlcgorICAgIHNlbGYucHJpbnRfdW5rbm93bl9maWVsZHMgPSBwcmludF91bmtub3duX2ZpZWxkcworICAgIHNlbGYuZm9yY2VfY29sb24gPSBmb3JjZV9jb2xvbgorCisgIGRlZiBfVHJ5UHJpbnRBc0FueU1lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CisgICAgIiIiU2VyaWFsaXplcyBpZiBtZXNzYWdlIGlzIGEgZ29vZ2xlLnByb3RvYnVmLkFueSBmaWVsZC4iIiIKKyAgICBpZiAnLycgbm90IGluIG1lc3NhZ2UudHlwZV91cmw6CisgICAgICByZXR1cm4gRmFsc2UKKyAgICBwYWNrZWRfbWVzc2FnZSA9IF9CdWlsZE1lc3NhZ2VGcm9tVHlwZU5hbWUobWVzc2FnZS5UeXBlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc2NyaXB0b3JfcG9vbCkKKyAgICBpZiBwYWNrZWRfbWVzc2FnZToKKyAgICAgIHBhY2tlZF9tZXNzYWdlLk1lcmdlRnJvbVN0cmluZyhtZXNzYWdlLnZhbHVlKQorICAgICAgY29sb24gPSAnOicgaWYgc2VsZi5mb3JjZV9jb2xvbiBlbHNlICcnCisgICAgICBzZWxmLm91dC53cml0ZSgnJXNbJXNdJXMgJyAlIChzZWxmLmluZGVudCAqICcgJywgbWVzc2FnZS50eXBlX3VybCwgY29sb24pKQorICAgICAgc2VsZi5fUHJpbnRNZXNzYWdlRmllbGRWYWx1ZShwYWNrZWRfbWVzc2FnZSkKKyAgICAgIHNlbGYub3V0LndyaXRlKCcgJyBpZiBzZWxmLmFzX29uZV9saW5lIGVsc2UgJ1xuJykKKyAgICAgIHJldHVybiBUcnVlCisgICAgZWxzZToKKyAgICAgIHJldHVybiBGYWxzZQorCisgIGRlZiBfVHJ5Q3VzdG9tRm9ybWF0TWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICBmb3JtYXR0ZWQgPSBzZWxmLm1lc3NhZ2VfZm9ybWF0dGVyKG1lc3NhZ2UsIHNlbGYuaW5kZW50LCBzZWxmLmFzX29uZV9saW5lKQorICAgIGlmIGZvcm1hdHRlZCBpcyBOb25lOgorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBvdXQgPSBzZWxmLm91dAorICAgIG91dC53cml0ZSgnICcgKiBzZWxmLmluZGVudCkKKyAgICBvdXQud3JpdGUoZm9ybWF0dGVkKQorICAgIG91dC53cml0ZSgnICcgaWYgc2VsZi5hc19vbmVfbGluZSBlbHNlICdcbicpCisgICAgcmV0dXJuIFRydWUKKworICBkZWYgUHJpbnRNZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICIiIkNvbnZlcnQgcHJvdG9idWYgbWVzc2FnZSB0byB0ZXh0IGZvcm1hdC4KKworICAgIEFyZ3M6CisgICAgICBtZXNzYWdlOiBUaGUgcHJvdG9jb2wgYnVmZmVycyBtZXNzYWdlLgorICAgICIiIgorICAgIGlmIHNlbGYubWVzc2FnZV9mb3JtYXR0ZXIgYW5kIHNlbGYuX1RyeUN1c3RvbUZvcm1hdE1lc3NhZ2UobWVzc2FnZSk6CisgICAgICByZXR1cm4KKyAgICBpZiAobWVzc2FnZS5ERVNDUklQVE9SLmZ1bGxfbmFtZSA9PSBfQU5ZX0ZVTExfVFlQRV9OQU1FIGFuZAorICAgICAgICBzZWxmLl9UcnlQcmludEFzQW55TWVzc2FnZShtZXNzYWdlKSk6CisgICAgICByZXR1cm4KKyAgICBmaWVsZHMgPSBtZXNzYWdlLkxpc3RGaWVsZHMoKQorICAgIGlmIHNlbGYudXNlX2luZGV4X29yZGVyOgorICAgICAgZmllbGRzLnNvcnQoCisgICAgICAgICAga2V5PWxhbWJkYSB4OiB4WzBdLm51bWJlciBpZiB4WzBdLmlzX2V4dGVuc2lvbiBlbHNlIHhbMF0uaW5kZXgpCisgICAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBmaWVsZHM6CisgICAgICBpZiBfSXNNYXBFbnRyeShmaWVsZCk6CisgICAgICAgIGZvciBrZXkgaW4gc29ydGVkKHZhbHVlKToKKyAgICAgICAgICAjIFRoaXMgaXMgc2xvdyBmb3IgbWFwcyB3aXRoIHN1Ym1lc3NhZ2UgZW50cmllcyBiZWNhdXNlIGl0IGNvcGllcyB0aGUKKyAgICAgICAgICAjIGVudGlyZSB0cmVlLiAgVW5mb3J0dW5hdGVseSB0aGlzIHdvdWxkIHRha2Ugc2lnbmlmaWNhbnQgcmVmYWN0b3JpbmcKKyAgICAgICAgICAjIG9mIHRoaXMgZmlsZSB0byB3b3JrIGFyb3VuZC4KKyAgICAgICAgICAjCisgICAgICAgICAgIyBUT0RPKGhhYmVybWFuKTogcmVmYWN0b3IgYW5kIG9wdGltaXplIGlmIHRoaXMgYmVjb21lcyBhbiBpc3N1ZS4KKyAgICAgICAgICBlbnRyeV9zdWJtc2cgPSB2YWx1ZS5HZXRFbnRyeUNsYXNzKCkoa2V5PWtleSwgdmFsdWU9dmFsdWVba2V5XSkKKyAgICAgICAgICBzZWxmLlByaW50RmllbGQoZmllbGQsIGVudHJ5X3N1Ym1zZykKKyAgICAgIGVsaWYgZmllbGQubGFiZWwgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICAgIGlmIChzZWxmLnVzZV9zaG9ydF9yZXBlYXRlZF9wcmltaXRpdmVzCisgICAgICAgICAgICBhbmQgZmllbGQuY3BwX3R5cGUgIT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFCisgICAgICAgICAgICBhbmQgZmllbGQuY3BwX3R5cGUgIT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9TVFJJTkcpOgorICAgICAgICAgIHNlbGYuX1ByaW50U2hvcnRSZXBlYXRlZFByaW1pdGl2ZXNWYWx1ZShmaWVsZCwgdmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgICBzZWxmLlByaW50RmllbGQoZmllbGQsIGVsZW1lbnQpCisgICAgICBlbHNlOgorICAgICAgICBzZWxmLlByaW50RmllbGQoZmllbGQsIHZhbHVlKQorCisgICAgaWYgc2VsZi5wcmludF91bmtub3duX2ZpZWxkczoKKyAgICAgIHNlbGYuX1ByaW50VW5rbm93bkZpZWxkcyh1bmtub3duX2ZpZWxkcy5Vbmtub3duRmllbGRTZXQobWVzc2FnZSkpCisKKyAgZGVmIF9QcmludFVua25vd25GaWVsZHMoc2VsZiwgdW5rbm93bl9maWVsZF9zZXQpOgorICAgICIiIlByaW50IHVua25vd24gZmllbGRzLiIiIgorICAgIG91dCA9IHNlbGYub3V0CisgICAgZm9yIGZpZWxkIGluIHVua25vd25fZmllbGRfc2V0OgorICAgICAgb3V0LndyaXRlKCcgJyAqIHNlbGYuaW5kZW50KQorICAgICAgb3V0LndyaXRlKHN0cihmaWVsZC5maWVsZF9udW1iZXIpKQorICAgICAgaWYgZmllbGQud2lyZV90eXBlID09IFdJUkVUWVBFX1NUQVJUX0dST1VQOgorICAgICAgICBpZiBzZWxmLmFzX29uZV9saW5lOgorICAgICAgICAgIG91dC53cml0ZSgnIHsgJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBvdXQud3JpdGUoJyB7XG4nKQorICAgICAgICAgIHNlbGYuaW5kZW50ICs9IDIKKworICAgICAgICBzZWxmLl9QcmludFVua25vd25GaWVsZHMoZmllbGQuZGF0YSkKKworICAgICAgICBpZiBzZWxmLmFzX29uZV9saW5lOgorICAgICAgICAgIG91dC53cml0ZSgnfSAnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIHNlbGYuaW5kZW50IC09IDIKKyAgICAgICAgICBvdXQud3JpdGUoJyAnICogc2VsZi5pbmRlbnQgKyAnfVxuJykKKyAgICAgIGVsaWYgZmllbGQud2lyZV90eXBlID09IFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6CisgICAgICAgIHRyeToKKyAgICAgICAgICAjIElmIHRoaXMgZmllbGQgaXMgcGFyc2VhYmxlIGFzIGEgTWVzc2FnZSwgaXQgaXMgcHJvYmFibHkKKyAgICAgICAgICAjIGFuIGVtYmVkZGVkIG1lc3NhZ2UuCisgICAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgICAgIChlbWJlZGRlZF91bmtub3duX21lc3NhZ2UsIHBvcykgPSBkZWNvZGVyLl9EZWNvZGVVbmtub3duRmllbGRTZXQoCisgICAgICAgICAgICAgIG1lbW9yeXZpZXcoZmllbGQuZGF0YSksIDAsIGxlbihmaWVsZC5kYXRhKSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjogICAgIyBweWxpbnQ6IGRpc2FibGU9YnJvYWQtZXhjZXB0CisgICAgICAgICAgcG9zID0gMAorCisgICAgICAgIGlmIHBvcyA9PSBsZW4oZmllbGQuZGF0YSk6CisgICAgICAgICAgaWYgc2VsZi5hc19vbmVfbGluZToKKyAgICAgICAgICAgIG91dC53cml0ZSgnIHsgJykKKyAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3V0LndyaXRlKCcge1xuJykKKyAgICAgICAgICAgIHNlbGYuaW5kZW50ICs9IDIKKworICAgICAgICAgIHNlbGYuX1ByaW50VW5rbm93bkZpZWxkcyhlbWJlZGRlZF91bmtub3duX21lc3NhZ2UpCisKKyAgICAgICAgICBpZiBzZWxmLmFzX29uZV9saW5lOgorICAgICAgICAgICAgb3V0LndyaXRlKCd9ICcpCisgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaW5kZW50IC09IDIKKyAgICAgICAgICAgIG91dC53cml0ZSgnICcgKiBzZWxmLmluZGVudCArICd9XG4nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICMgQSBzdHJpbmcgb3IgYnl0ZXMgZmllbGQuIHNlbGYuYXNfdXRmOCBtYXkgbm90IHdvcmsuCisgICAgICAgICAgb3V0LndyaXRlKCc6IFwiJykKKyAgICAgICAgICBvdXQud3JpdGUodGV4dF9lbmNvZGluZy5DRXNjYXBlKGZpZWxkLmRhdGEsIEZhbHNlKSkKKyAgICAgICAgICBvdXQud3JpdGUoJ1wiICcgaWYgc2VsZi5hc19vbmVfbGluZSBlbHNlICdcIlxuJykKKyAgICAgIGVsc2U6CisgICAgICAgICMgdmFyaW50LCBmaXhlZDMyLCBmaXhlZDY0CisgICAgICAgIG91dC53cml0ZSgnOiAnKQorICAgICAgICBvdXQud3JpdGUoc3RyKGZpZWxkLmRhdGEpKQorICAgICAgICBvdXQud3JpdGUoJyAnIGlmIHNlbGYuYXNfb25lX2xpbmUgZWxzZSAnXG4nKQorCisgIGRlZiBfUHJpbnRGaWVsZE5hbWUoc2VsZiwgZmllbGQpOgorICAgICIiIlByaW50IGZpZWxkIG5hbWUuIiIiCisgICAgb3V0ID0gc2VsZi5vdXQKKyAgICBvdXQud3JpdGUoJyAnICogc2VsZi5pbmRlbnQpCisgICAgaWYgc2VsZi51c2VfZmllbGRfbnVtYmVyOgorICAgICAgb3V0LndyaXRlKHN0cihmaWVsZC5udW1iZXIpKQorICAgIGVsc2U6CisgICAgICBpZiBmaWVsZC5pc19leHRlbnNpb246CisgICAgICAgIG91dC53cml0ZSgnWycpCisgICAgICAgIGlmIChmaWVsZC5jb250YWluaW5nX3R5cGUuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IGFuZAorICAgICAgICAgICAgZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0UgYW5kCisgICAgICAgICAgICBmaWVsZC5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9PUFRJT05BTCk6CisgICAgICAgICAgb3V0LndyaXRlKGZpZWxkLm1lc3NhZ2VfdHlwZS5mdWxsX25hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgb3V0LndyaXRlKGZpZWxkLmZ1bGxfbmFtZSkKKyAgICAgICAgb3V0LndyaXRlKCddJykKKyAgICAgIGVsaWYgZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQOgorICAgICAgICAjIEZvciBncm91cHMsIHVzZSB0aGUgY2FwaXRhbGl6ZWQgbmFtZS4KKyAgICAgICAgb3V0LndyaXRlKGZpZWxkLm1lc3NhZ2VfdHlwZS5uYW1lKQorICAgICAgZWxzZToKKyAgICAgICAgICBvdXQud3JpdGUoZmllbGQubmFtZSkKKworICAgIGlmIChzZWxmLmZvcmNlX2NvbG9uIG9yCisgICAgICAgIGZpZWxkLmNwcF90eXBlICE9IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRSk6CisgICAgICAjIFRoZSBjb2xvbiBpcyBvcHRpb25hbCBpbiB0aGlzIGNhc2UsIGJ1dCBvdXIgY3Jvc3MtbGFuZ3VhZ2UgZ29sZGVuIGZpbGVzCisgICAgICAjIGRvbid0IGluY2x1ZGUgaXQuIEhlcmUsIHRoZSBjb2xvbiBpcyBvbmx5IGluY2x1ZGVkIGlmIGZvcmNlX2NvbG9uIGlzCisgICAgICAjIHNldCB0byBUcnVlCisgICAgICBvdXQud3JpdGUoJzonKQorCisgIGRlZiBQcmludEZpZWxkKHNlbGYsIGZpZWxkLCB2YWx1ZSk6CisgICAgIiIiUHJpbnQgYSBzaW5nbGUgZmllbGQgbmFtZS92YWx1ZSBwYWlyLiIiIgorICAgIHNlbGYuX1ByaW50RmllbGROYW1lKGZpZWxkKQorICAgIHNlbGYub3V0LndyaXRlKCcgJykKKyAgICBzZWxmLlByaW50RmllbGRWYWx1ZShmaWVsZCwgdmFsdWUpCisgICAgc2VsZi5vdXQud3JpdGUoJyAnIGlmIHNlbGYuYXNfb25lX2xpbmUgZWxzZSAnXG4nKQorCisgIGRlZiBfUHJpbnRTaG9ydFJlcGVhdGVkUHJpbWl0aXZlc1ZhbHVlKHNlbGYsIGZpZWxkLCB2YWx1ZSk6CisgICAgIiIiIlByaW50cyBzaG9ydCByZXBlYXRlZCBwcmltaXRpdmVzIHZhbHVlLiIiIgorICAgICMgTm90ZTogdGhpcyBpcyBjYWxsZWQgb25seSB3aGVuIHZhbHVlIGhhcyBhdCBsZWFzdCBvbmUgZWxlbWVudC4KKyAgICBzZWxmLl9QcmludEZpZWxkTmFtZShmaWVsZCkKKyAgICBzZWxmLm91dC53cml0ZSgnIFsnKQorICAgIGZvciBpIGluIHJhbmdlKGxlbih2YWx1ZSkgLSAxKToKKyAgICAgIHNlbGYuUHJpbnRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZVtpXSkKKyAgICAgIHNlbGYub3V0LndyaXRlKCcsICcpCisgICAgc2VsZi5QcmludEZpZWxkVmFsdWUoZmllbGQsIHZhbHVlWy0xXSkKKyAgICBzZWxmLm91dC53cml0ZSgnXScpCisgICAgc2VsZi5vdXQud3JpdGUoJyAnIGlmIHNlbGYuYXNfb25lX2xpbmUgZWxzZSAnXG4nKQorCisgIGRlZiBfUHJpbnRNZXNzYWdlRmllbGRWYWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgaWYgc2VsZi5wb2ludHlfYnJhY2tldHM6CisgICAgICBvcGVuYiA9ICc8JworICAgICAgY2xvc2ViID0gJz4nCisgICAgZWxzZToKKyAgICAgIG9wZW5iID0gJ3snCisgICAgICBjbG9zZWIgPSAnfScKKworICAgIGlmIHNlbGYuYXNfb25lX2xpbmU6CisgICAgICBzZWxmLm91dC53cml0ZSgnJXMgJyAlIG9wZW5iKQorICAgICAgc2VsZi5QcmludE1lc3NhZ2UodmFsdWUpCisgICAgICBzZWxmLm91dC53cml0ZShjbG9zZWIpCisgICAgZWxzZToKKyAgICAgIHNlbGYub3V0LndyaXRlKCclc1xuJyAlIG9wZW5iKQorICAgICAgc2VsZi5pbmRlbnQgKz0gMgorICAgICAgc2VsZi5QcmludE1lc3NhZ2UodmFsdWUpCisgICAgICBzZWxmLmluZGVudCAtPSAyCisgICAgICBzZWxmLm91dC53cml0ZSgnICcgKiBzZWxmLmluZGVudCArIGNsb3NlYikKKworICBkZWYgUHJpbnRGaWVsZFZhbHVlKHNlbGYsIGZpZWxkLCB2YWx1ZSk6CisgICAgIiIiUHJpbnQgYSBzaW5nbGUgZmllbGQgdmFsdWUgKG5vdCBpbmNsdWRpbmcgbmFtZSkuCisKKyAgICBGb3IgcmVwZWF0ZWQgZmllbGRzLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGEgc2luZ2xlIGVsZW1lbnQuCisKKyAgICBBcmdzOgorICAgICAgZmllbGQ6IFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWVsZCB0byBiZSBwcmludGVkLgorICAgICAgdmFsdWU6IFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuCisgICAgIiIiCisgICAgb3V0ID0gc2VsZi5vdXQKKyAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgICBzZWxmLl9QcmludE1lc3NhZ2VGaWVsZFZhbHVlKHZhbHVlKQorICAgIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9FTlVNOgorICAgICAgZW51bV92YWx1ZSA9IGZpZWxkLmVudW1fdHlwZS52YWx1ZXNfYnlfbnVtYmVyLmdldCh2YWx1ZSwgTm9uZSkKKyAgICAgIGlmIGVudW1fdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgIG91dC53cml0ZShlbnVtX3ZhbHVlLm5hbWUpCisgICAgICBlbHNlOgorICAgICAgICBvdXQud3JpdGUoc3RyKHZhbHVlKSkKKyAgICBlbGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfU1RSSU5HOgorICAgICAgb3V0LndyaXRlKCdcIicpCisgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHIpIGFuZCBub3Qgc2VsZi5hc191dGY4OgorICAgICAgICBvdXRfdmFsdWUgPSB2YWx1ZS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgIGVsc2U6CisgICAgICAgIG91dF92YWx1ZSA9IHZhbHVlCisgICAgICBpZiBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVM6CisgICAgICAgICMgV2UgYWx3YXlzIG5lZWQgdG8gZXNjYXBlIGFsbCBiaW5hcnkgZGF0YSBpbiBUWVBFX0JZVEVTIGZpZWxkcy4KKyAgICAgICAgb3V0X2FzX3V0ZjggPSBGYWxzZQorICAgICAgZWxzZToKKyAgICAgICAgb3V0X2FzX3V0ZjggPSBzZWxmLmFzX3V0ZjgKKyAgICAgIG91dC53cml0ZSh0ZXh0X2VuY29kaW5nLkNFc2NhcGUob3V0X3ZhbHVlLCBvdXRfYXNfdXRmOCkpCisgICAgICBvdXQud3JpdGUoJ1wiJykKKyAgICBlbGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfQk9PTDoKKyAgICAgIGlmIHZhbHVlOgorICAgICAgICBvdXQud3JpdGUoJ3RydWUnKQorICAgICAgZWxzZToKKyAgICAgICAgb3V0LndyaXRlKCdmYWxzZScpCisgICAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0ZMT0FUOgorICAgICAgaWYgc2VsZi5mbG9hdF9mb3JtYXQgaXMgbm90IE5vbmU6CisgICAgICAgIG91dC53cml0ZSgnezE6ezB9fScuZm9ybWF0KHNlbGYuZmxvYXRfZm9ybWF0LCB2YWx1ZSkpCisgICAgICBlbHNlOgorICAgICAgICBpZiBtYXRoLmlzbmFuKHZhbHVlKToKKyAgICAgICAgICBvdXQud3JpdGUoc3RyKHZhbHVlKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBvdXQud3JpdGUoc3RyKHR5cGVfY2hlY2tlcnMuVG9TaG9ydGVzdEZsb2F0KHZhbHVlKSkpCisgICAgZWxpZiAoZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9ET1VCTEUgYW5kCisgICAgICAgICAgc2VsZi5kb3VibGVfZm9ybWF0IGlzIG5vdCBOb25lKToKKyAgICAgIG91dC53cml0ZSgnezE6ezB9fScuZm9ybWF0KHNlbGYuZG91YmxlX2Zvcm1hdCwgdmFsdWUpKQorICAgIGVsc2U6CisgICAgICBvdXQud3JpdGUoc3RyKHZhbHVlKSkKKworCitkZWYgUGFyc2UodGV4dCwKKyAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uPUZhbHNlLAorICAgICAgICAgIGFsbG93X2ZpZWxkX251bWJlcj1GYWxzZSwKKyAgICAgICAgICBkZXNjcmlwdG9yX3Bvb2w9Tm9uZSwKKyAgICAgICAgICBhbGxvd191bmtub3duX2ZpZWxkPUZhbHNlKToKKyAgIiIiUGFyc2VzIGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhIHByb3RvY29sIG1lc3NhZ2UgaW50byBhIG1lc3NhZ2UuCisKKyAgTk9URTogZm9yIGhpc3RvcmljYWwgcmVhc29ucyB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNsZWFyIHRoZSBpbnB1dAorICBtZXNzYWdlLiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHdoYXQgdGhlIGJpbmFyeSBtc2cuUGFyc2VGcm9tKC4uLikgZG9lcy4KKyAgSWYgdGV4dCBjb250YWlucyBhIGZpZWxkIGFscmVhZHkgc2V0IGluIG1lc3NhZ2UsIHRoZSB2YWx1ZSBpcyBhcHBlbmRlZCBpZiB0aGUKKyAgZmllbGQgaXMgcmVwZWF0ZWQuIE90aGVyd2lzZSwgYW4gZXJyb3IgaXMgcmFpc2VkLgorCisgIEV4YW1wbGU6OgorCisgICAgYSA9IE15UHJvdG8oKQorICAgIGEucmVwZWF0ZWRfZmllbGQuYXBwZW5kKCd0ZXN0JykKKyAgICBiID0gTXlQcm90bygpCisKKyAgICAjIFJlcGVhdGVkIGZpZWxkcyBhcmUgY29tYmluZWQKKyAgICB0ZXh0X2Zvcm1hdC5QYXJzZShyZXByKGEpLCBiKQorICAgIHRleHRfZm9ybWF0LlBhcnNlKHJlcHIoYSksIGIpICMgcmVwZWF0ZWRfZmllbGQgY29udGFpbnMgWyJ0ZXN0IiwgInRlc3QiXQorCisgICAgIyBOb24tcmVwZWF0ZWQgZmllbGRzIGNhbm5vdCBiZSBvdmVyd3JpdHRlbgorICAgIGEuc2luZ3VsYXJfZmllbGQgPSAxCisgICAgYi5zaW5ndWxhcl9maWVsZCA9IDIKKyAgICB0ZXh0X2Zvcm1hdC5QYXJzZShyZXByKGEpLCBiKSAjIFBhcnNlRXJyb3IKKworICAgICMgQmluYXJ5IHZlcnNpb246CisgICAgYi5QYXJzZUZyb21TdHJpbmcoYS5TZXJpYWxpemVUb1N0cmluZygpKSAjIHJlcGVhdGVkX2ZpZWxkIGlzIG5vdyAidGVzdCIKKworICBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsZWFyaW5nIHRoZSBtZXNzYWdlIGFzIG5lZWRlZC4KKworICBBcmdzOgorICAgIHRleHQgKHN0cik6IE1lc3NhZ2UgdGV4dCByZXByZXNlbnRhdGlvbi4KKyAgICBtZXNzYWdlIChNZXNzYWdlKTogQSBwcm90b2NvbCBidWZmZXIgbWVzc2FnZSB0byBtZXJnZSBpbnRvLgorICAgIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uOiBpZiBUcnVlLCBza2lwIG92ZXIgbWlzc2luZyBleHRlbnNpb25zIGFuZCBrZWVwCisgICAgICBwYXJzaW5nCisgICAgYWxsb3dfZmllbGRfbnVtYmVyOiBpZiBUcnVlLCBib3RoIGZpZWxkIG51bWJlciBhbmQgZmllbGQgbmFtZSBhcmUgYWxsb3dlZC4KKyAgICBkZXNjcmlwdG9yX3Bvb2wgKERlc2NyaXB0b3JQb29sKTogRGVzY3JpcHRvciBwb29sIHVzZWQgdG8gcmVzb2x2ZSBBbnkgdHlwZXMuCisgICAgYWxsb3dfdW5rbm93bl9maWVsZDogaWYgVHJ1ZSwgc2tpcCBvdmVyIHVua25vd24gZmllbGQgYW5kIGtlZXAKKyAgICAgIHBhcnNpbmcuIEF2b2lkIHRvIHVzZSB0aGlzIG9wdGlvbiBpZiBwb3NzaWJsZS4gSXQgbWF5IGhpZGUgc29tZQorICAgICAgZXJyb3JzIChlLmcuIHNwZWxsaW5nIGVycm9yIG9uIGZpZWxkIG5hbWUpCisKKyAgUmV0dXJuczoKKyAgICBNZXNzYWdlOiBUaGUgc2FtZSBtZXNzYWdlIHBhc3NlZCBhcyBhcmd1bWVudC4KKworICBSYWlzZXM6CisgICAgUGFyc2VFcnJvcjogT24gdGV4dCBwYXJzaW5nIHByb2JsZW1zLgorICAiIiIKKyAgcmV0dXJuIFBhcnNlTGluZXModGV4dC5zcGxpdChiJ1xuJyBpZiBpc2luc3RhbmNlKHRleHQsIGJ5dGVzKSBlbHNlIHUnXG4nKSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dfdW5rbm93bl9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgIGFsbG93X2ZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wb29sPWRlc2NyaXB0b3JfcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dfdW5rbm93bl9maWVsZD1hbGxvd191bmtub3duX2ZpZWxkKQorCisKK2RlZiBNZXJnZSh0ZXh0LAorICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgYWxsb3dfdW5rbm93bl9leHRlbnNpb249RmFsc2UsCisgICAgICAgICAgYWxsb3dfZmllbGRfbnVtYmVyPUZhbHNlLAorICAgICAgICAgIGRlc2NyaXB0b3JfcG9vbD1Ob25lLAorICAgICAgICAgIGFsbG93X3Vua25vd25fZmllbGQ9RmFsc2UpOgorICAiIiJQYXJzZXMgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIGEgcHJvdG9jb2wgbWVzc2FnZSBpbnRvIGEgbWVzc2FnZS4KKworICBMaWtlIFBhcnNlKCksIGJ1dCBhbGxvd3MgcmVwZWF0ZWQgdmFsdWVzIGZvciBhIG5vbi1yZXBlYXRlZCBmaWVsZCwgYW5kIHVzZXMKKyAgdGhlIGxhc3Qgb25lLiBUaGlzIG1lYW5zIGFueSBub24tcmVwZWF0ZWQsIHRvcC1sZXZlbCBmaWVsZHMgc3BlY2lmaWVkIGluIHRleHQKKyAgcmVwbGFjZSB0aG9zZSBpbiB0aGUgbWVzc2FnZS4KKworICBBcmdzOgorICAgIHRleHQgKHN0cik6IE1lc3NhZ2UgdGV4dCByZXByZXNlbnRhdGlvbi4KKyAgICBtZXNzYWdlIChNZXNzYWdlKTogQSBwcm90b2NvbCBidWZmZXIgbWVzc2FnZSB0byBtZXJnZSBpbnRvLgorICAgIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uOiBpZiBUcnVlLCBza2lwIG92ZXIgbWlzc2luZyBleHRlbnNpb25zIGFuZCBrZWVwCisgICAgICBwYXJzaW5nCisgICAgYWxsb3dfZmllbGRfbnVtYmVyOiBpZiBUcnVlLCBib3RoIGZpZWxkIG51bWJlciBhbmQgZmllbGQgbmFtZSBhcmUgYWxsb3dlZC4KKyAgICBkZXNjcmlwdG9yX3Bvb2wgKERlc2NyaXB0b3JQb29sKTogRGVzY3JpcHRvciBwb29sIHVzZWQgdG8gcmVzb2x2ZSBBbnkgdHlwZXMuCisgICAgYWxsb3dfdW5rbm93bl9maWVsZDogaWYgVHJ1ZSwgc2tpcCBvdmVyIHVua25vd24gZmllbGQgYW5kIGtlZXAKKyAgICAgIHBhcnNpbmcuIEF2b2lkIHRvIHVzZSB0aGlzIG9wdGlvbiBpZiBwb3NzaWJsZS4gSXQgbWF5IGhpZGUgc29tZQorICAgICAgZXJyb3JzIChlLmcuIHNwZWxsaW5nIGVycm9yIG9uIGZpZWxkIG5hbWUpCisKKyAgUmV0dXJuczoKKyAgICBNZXNzYWdlOiBUaGUgc2FtZSBtZXNzYWdlIHBhc3NlZCBhcyBhcmd1bWVudC4KKworICBSYWlzZXM6CisgICAgUGFyc2VFcnJvcjogT24gdGV4dCBwYXJzaW5nIHByb2JsZW1zLgorICAiIiIKKyAgcmV0dXJuIE1lcmdlTGluZXMoCisgICAgICB0ZXh0LnNwbGl0KGInXG4nIGlmIGlzaW5zdGFuY2UodGV4dCwgYnl0ZXMpIGVsc2UgdSdcbicpLAorICAgICAgbWVzc2FnZSwKKyAgICAgIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uLAorICAgICAgYWxsb3dfZmllbGRfbnVtYmVyLAorICAgICAgZGVzY3JpcHRvcl9wb29sPWRlc2NyaXB0b3JfcG9vbCwKKyAgICAgIGFsbG93X3Vua25vd25fZmllbGQ9YWxsb3dfdW5rbm93bl9maWVsZCkKKworCitkZWYgUGFyc2VMaW5lcyhsaW5lcywKKyAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICBhbGxvd191bmtub3duX2V4dGVuc2lvbj1GYWxzZSwKKyAgICAgICAgICAgICAgIGFsbG93X2ZpZWxkX251bWJlcj1GYWxzZSwKKyAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcG9vbD1Ob25lLAorICAgICAgICAgICAgICAgYWxsb3dfdW5rbm93bl9maWVsZD1GYWxzZSk6CisgICIiIlBhcnNlcyBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgYSBwcm90b2NvbCBtZXNzYWdlIGludG8gYSBtZXNzYWdlLgorCisgIFNlZSBQYXJzZSgpIGZvciBjYXZlYXRzLgorCisgIEFyZ3M6CisgICAgbGluZXM6IEFuIGl0ZXJhYmxlIG9mIGxpbmVzIG9mIGEgbWVzc2FnZSdzIHRleHQgcmVwcmVzZW50YXRpb24uCisgICAgbWVzc2FnZTogQSBwcm90b2NvbCBidWZmZXIgbWVzc2FnZSB0byBtZXJnZSBpbnRvLgorICAgIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uOiBpZiBUcnVlLCBza2lwIG92ZXIgbWlzc2luZyBleHRlbnNpb25zIGFuZCBrZWVwCisgICAgICBwYXJzaW5nCisgICAgYWxsb3dfZmllbGRfbnVtYmVyOiBpZiBUcnVlLCBib3RoIGZpZWxkIG51bWJlciBhbmQgZmllbGQgbmFtZSBhcmUgYWxsb3dlZC4KKyAgICBkZXNjcmlwdG9yX3Bvb2w6IEEgRGVzY3JpcHRvclBvb2wgdXNlZCB0byByZXNvbHZlIEFueSB0eXBlcy4KKyAgICBhbGxvd191bmtub3duX2ZpZWxkOiBpZiBUcnVlLCBza2lwIG92ZXIgdW5rbm93biBmaWVsZCBhbmQga2VlcAorICAgICAgcGFyc2luZy4gQXZvaWQgdG8gdXNlIHRoaXMgb3B0aW9uIGlmIHBvc3NpYmxlLiBJdCBtYXkgaGlkZSBzb21lCisgICAgICBlcnJvcnMgKGUuZy4gc3BlbGxpbmcgZXJyb3Igb24gZmllbGQgbmFtZSkKKworICBSZXR1cm5zOgorICAgIFRoZSBzYW1lIG1lc3NhZ2UgcGFzc2VkIGFzIGFyZ3VtZW50LgorCisgIFJhaXNlczoKKyAgICBQYXJzZUVycm9yOiBPbiB0ZXh0IHBhcnNpbmcgcHJvYmxlbXMuCisgICIiIgorICBwYXJzZXIgPSBfUGFyc2VyKGFsbG93X3Vua25vd25fZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgIGFsbG93X2ZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3Bvb2w9ZGVzY3JpcHRvcl9wb29sLAorICAgICAgICAgICAgICAgICAgIGFsbG93X3Vua25vd25fZmllbGQ9YWxsb3dfdW5rbm93bl9maWVsZCkKKyAgcmV0dXJuIHBhcnNlci5QYXJzZUxpbmVzKGxpbmVzLCBtZXNzYWdlKQorCisKK2RlZiBNZXJnZUxpbmVzKGxpbmVzLAorICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uPUZhbHNlLAorICAgICAgICAgICAgICAgYWxsb3dfZmllbGRfbnVtYmVyPUZhbHNlLAorICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wb29sPU5vbmUsCisgICAgICAgICAgICAgICBhbGxvd191bmtub3duX2ZpZWxkPUZhbHNlKToKKyAgIiIiUGFyc2VzIGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhIHByb3RvY29sIG1lc3NhZ2UgaW50byBhIG1lc3NhZ2UuCisKKyAgU2VlIE1lcmdlKCkgZm9yIG1vcmUgZGV0YWlscy4KKworICBBcmdzOgorICAgIGxpbmVzOiBBbiBpdGVyYWJsZSBvZiBsaW5lcyBvZiBhIG1lc3NhZ2UncyB0ZXh0IHJlcHJlc2VudGF0aW9uLgorICAgIG1lc3NhZ2U6IEEgcHJvdG9jb2wgYnVmZmVyIG1lc3NhZ2UgdG8gbWVyZ2UgaW50by4KKyAgICBhbGxvd191bmtub3duX2V4dGVuc2lvbjogaWYgVHJ1ZSwgc2tpcCBvdmVyIG1pc3NpbmcgZXh0ZW5zaW9ucyBhbmQga2VlcAorICAgICAgcGFyc2luZworICAgIGFsbG93X2ZpZWxkX251bWJlcjogaWYgVHJ1ZSwgYm90aCBmaWVsZCBudW1iZXIgYW5kIGZpZWxkIG5hbWUgYXJlIGFsbG93ZWQuCisgICAgZGVzY3JpcHRvcl9wb29sOiBBIERlc2NyaXB0b3JQb29sIHVzZWQgdG8gcmVzb2x2ZSBBbnkgdHlwZXMuCisgICAgYWxsb3dfdW5rbm93bl9maWVsZDogaWYgVHJ1ZSwgc2tpcCBvdmVyIHVua25vd24gZmllbGQgYW5kIGtlZXAKKyAgICAgIHBhcnNpbmcuIEF2b2lkIHRvIHVzZSB0aGlzIG9wdGlvbiBpZiBwb3NzaWJsZS4gSXQgbWF5IGhpZGUgc29tZQorICAgICAgZXJyb3JzIChlLmcuIHNwZWxsaW5nIGVycm9yIG9uIGZpZWxkIG5hbWUpCisKKyAgUmV0dXJuczoKKyAgICBUaGUgc2FtZSBtZXNzYWdlIHBhc3NlZCBhcyBhcmd1bWVudC4KKworICBSYWlzZXM6CisgICAgUGFyc2VFcnJvcjogT24gdGV4dCBwYXJzaW5nIHByb2JsZW1zLgorICAiIiIKKyAgcGFyc2VyID0gX1BhcnNlcihhbGxvd191bmtub3duX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhbGxvd19maWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wb29sPWRlc2NyaXB0b3JfcG9vbCwKKyAgICAgICAgICAgICAgICAgICBhbGxvd191bmtub3duX2ZpZWxkPWFsbG93X3Vua25vd25fZmllbGQpCisgIHJldHVybiBwYXJzZXIuTWVyZ2VMaW5lcyhsaW5lcywgbWVzc2FnZSkKKworCitjbGFzcyBfUGFyc2VyKG9iamVjdCk6CisgICIiIlRleHQgZm9ybWF0IHBhcnNlciBmb3IgcHJvdG9jb2wgbWVzc2FnZS4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uPUZhbHNlLAorICAgICAgICAgICAgICAgYWxsb3dfZmllbGRfbnVtYmVyPUZhbHNlLAorICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wb29sPU5vbmUsCisgICAgICAgICAgICAgICBhbGxvd191bmtub3duX2ZpZWxkPUZhbHNlKToKKyAgICBzZWxmLmFsbG93X3Vua25vd25fZXh0ZW5zaW9uID0gYWxsb3dfdW5rbm93bl9leHRlbnNpb24KKyAgICBzZWxmLmFsbG93X2ZpZWxkX251bWJlciA9IGFsbG93X2ZpZWxkX251bWJlcgorICAgIHNlbGYuZGVzY3JpcHRvcl9wb29sID0gZGVzY3JpcHRvcl9wb29sCisgICAgc2VsZi5hbGxvd191bmtub3duX2ZpZWxkID0gYWxsb3dfdW5rbm93bl9maWVsZAorCisgIGRlZiBQYXJzZUxpbmVzKHNlbGYsIGxpbmVzLCBtZXNzYWdlKToKKyAgICAiIiJQYXJzZXMgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIGEgcHJvdG9jb2wgbWVzc2FnZSBpbnRvIGEgbWVzc2FnZS4iIiIKKyAgICBzZWxmLl9hbGxvd19tdWx0aXBsZV9zY2FsYXJzID0gRmFsc2UKKyAgICBzZWxmLl9QYXJzZU9yTWVyZ2UobGluZXMsIG1lc3NhZ2UpCisgICAgcmV0dXJuIG1lc3NhZ2UKKworICBkZWYgTWVyZ2VMaW5lcyhzZWxmLCBsaW5lcywgbWVzc2FnZSk6CisgICAgIiIiTWVyZ2VzIGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhIHByb3RvY29sIG1lc3NhZ2UgaW50byBhIG1lc3NhZ2UuIiIiCisgICAgc2VsZi5fYWxsb3dfbXVsdGlwbGVfc2NhbGFycyA9IFRydWUKKyAgICBzZWxmLl9QYXJzZU9yTWVyZ2UobGluZXMsIG1lc3NhZ2UpCisgICAgcmV0dXJuIG1lc3NhZ2UKKworICBkZWYgX1BhcnNlT3JNZXJnZShzZWxmLCBsaW5lcywgbWVzc2FnZSk6CisgICAgIiIiQ29udmVydHMgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIGEgcHJvdG9jb2wgbWVzc2FnZSBpbnRvIGEgbWVzc2FnZS4KKworICAgIEFyZ3M6CisgICAgICBsaW5lczogTGluZXMgb2YgYSBtZXNzYWdlJ3MgdGV4dCByZXByZXNlbnRhdGlvbi4KKyAgICAgIG1lc3NhZ2U6IEEgcHJvdG9jb2wgYnVmZmVyIG1lc3NhZ2UgdG8gbWVyZ2UgaW50by4KKworICAgIFJhaXNlczoKKyAgICAgIFBhcnNlRXJyb3I6IE9uIHRleHQgcGFyc2luZyBwcm9ibGVtcy4KKyAgICAiIiIKKyAgICAjIFRva2VuaXplIGV4cGVjdHMgbmF0aXZlIHN0ciBsaW5lcy4KKyAgICBzdHJfbGluZXMgPSAoCisgICAgICAgIGxpbmUgaWYgaXNpbnN0YW5jZShsaW5lLCBzdHIpIGVsc2UgbGluZS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXMpCisgICAgdG9rZW5pemVyID0gVG9rZW5pemVyKHN0cl9saW5lcykKKyAgICB3aGlsZSBub3QgdG9rZW5pemVyLkF0RW5kKCk6CisgICAgICBzZWxmLl9NZXJnZUZpZWxkKHRva2VuaXplciwgbWVzc2FnZSkKKworICBkZWYgX01lcmdlRmllbGQoc2VsZiwgdG9rZW5pemVyLCBtZXNzYWdlKToKKyAgICAiIiJNZXJnZXMgYSBzaW5nbGUgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZCBpbnRvIGEgbWVzc2FnZS4KKworICAgIEFyZ3M6CisgICAgICB0b2tlbml6ZXI6IEEgdG9rZW5pemVyIHRvIHBhcnNlIHRoZSBmaWVsZCBuYW1lIGFuZCB2YWx1ZXMuCisgICAgICBtZXNzYWdlOiBBIHByb3RvY29sIG1lc3NhZ2UgdG8gcmVjb3JkIHRoZSBkYXRhLgorCisgICAgUmFpc2VzOgorICAgICAgUGFyc2VFcnJvcjogSW4gY2FzZSBvZiB0ZXh0IHBhcnNpbmcgcHJvYmxlbXMuCisgICAgIiIiCisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID0gbWVzc2FnZS5ERVNDUklQVE9SCisgICAgaWYgKG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUgPT0gX0FOWV9GVUxMX1RZUEVfTkFNRSBhbmQKKyAgICAgICAgdG9rZW5pemVyLlRyeUNvbnN1bWUoJ1snKSk6CisgICAgICB0eXBlX3VybF9wcmVmaXgsIHBhY2tlZF90eXBlX25hbWUgPSBzZWxmLl9Db25zdW1lQW55VHlwZVVybCh0b2tlbml6ZXIpCisgICAgICB0b2tlbml6ZXIuQ29uc3VtZSgnXScpCisgICAgICB0b2tlbml6ZXIuVHJ5Q29uc3VtZSgnOicpCisgICAgICBpZiB0b2tlbml6ZXIuVHJ5Q29uc3VtZSgnPCcpOgorICAgICAgICBleHBhbmRlZF9hbnlfZW5kX3Rva2VuID0gJz4nCisgICAgICBlbHNlOgorICAgICAgICB0b2tlbml6ZXIuQ29uc3VtZSgneycpCisgICAgICAgIGV4cGFuZGVkX2FueV9lbmRfdG9rZW4gPSAnfScKKyAgICAgIGV4cGFuZGVkX2FueV9zdWJfbWVzc2FnZSA9IF9CdWlsZE1lc3NhZ2VGcm9tVHlwZU5hbWUocGFja2VkX3R5cGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXNjcmlwdG9yX3Bvb2wpCisgICAgICAjIERpcmVjdCBjb21wYXJpc29uIHdpdGggTm9uZSBpcyB1c2VkIGluc3RlYWQgb2YgaW1wbGljaXQgYm9vbCBjb252ZXJzaW9uCisgICAgICAjIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlcyB3aXRoIGZhbHN5IGluaXRpYWwgdmFsdWVzLCBlLmcuIGZvcgorICAgICAgIyBnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlLgorICAgICAgaWYgZXhwYW5kZWRfYW55X3N1Yl9tZXNzYWdlIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ1R5cGUgJXMgbm90IGZvdW5kIGluIGRlc2NyaXB0b3IgcG9vbCcgJQorICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tlZF90eXBlX25hbWUpCisgICAgICB3aGlsZSBub3QgdG9rZW5pemVyLlRyeUNvbnN1bWUoZXhwYW5kZWRfYW55X2VuZF90b2tlbik6CisgICAgICAgIGlmIHRva2VuaXplci5BdEVuZCgpOgorICAgICAgICAgIHJhaXNlIHRva2VuaXplci5QYXJzZUVycm9yUHJldmlvdXNUb2tlbignRXhwZWN0ZWQgIiVzIi4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cGFuZGVkX2FueV9lbmRfdG9rZW4sKSkKKyAgICAgICAgc2VsZi5fTWVyZ2VGaWVsZCh0b2tlbml6ZXIsIGV4cGFuZGVkX2FueV9zdWJfbWVzc2FnZSkKKyAgICAgIGRldGVybWluaXN0aWMgPSBGYWxzZQorCisgICAgICBtZXNzYWdlLlBhY2soZXhwYW5kZWRfYW55X3N1Yl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgIHR5cGVfdXJsX3ByZWZpeD10eXBlX3VybF9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5pc3RpYz1kZXRlcm1pbmlzdGljKQorICAgICAgcmV0dXJuCisKKyAgICBpZiB0b2tlbml6ZXIuVHJ5Q29uc3VtZSgnWycpOgorICAgICAgbmFtZSA9IFt0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIoKV0KKyAgICAgIHdoaWxlIHRva2VuaXplci5UcnlDb25zdW1lKCcuJyk6CisgICAgICAgIG5hbWUuYXBwZW5kKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllcigpKQorICAgICAgbmFtZSA9ICcuJy5qb2luKG5hbWUpCisKKyAgICAgIGlmIG5vdCBtZXNzYWdlX2Rlc2NyaXB0b3IuaXNfZXh0ZW5kYWJsZToKKyAgICAgICAgcmFpc2UgdG9rZW5pemVyLlBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKAorICAgICAgICAgICAgJ01lc3NhZ2UgdHlwZSAiJXMiIGRvZXMgbm90IGhhdmUgZXh0ZW5zaW9ucy4nICUKKyAgICAgICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUpCisgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICBmaWVsZCA9IG1lc3NhZ2UuRXh0ZW5zaW9ucy5fRmluZEV4dGVuc2lvbkJ5TmFtZShuYW1lKQorICAgICAgIyBweWxpbnQ6IGVuYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisKKworICAgICAgaWYgbm90IGZpZWxkOgorICAgICAgICBpZiBzZWxmLmFsbG93X3Vua25vd25fZXh0ZW5zaW9uOgorICAgICAgICAgIGZpZWxkID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgIHJhaXNlIHRva2VuaXplci5QYXJzZUVycm9yUHJldmlvdXNUb2tlbigKKyAgICAgICAgICAgICAgJ0V4dGVuc2lvbiAiJXMiIG5vdCByZWdpc3RlcmVkLiAnCisgICAgICAgICAgICAgICdEaWQgeW91IGltcG9ydCB0aGUgX3BiMiBtb2R1bGUgd2hpY2ggZGVmaW5lcyBpdD8gJworICAgICAgICAgICAgICAnSWYgeW91IGFyZSB0cnlpbmcgdG8gcGxhY2UgdGhlIGV4dGVuc2lvbiBpbiB0aGUgTWVzc2FnZVNldCAnCisgICAgICAgICAgICAgICdmaWVsZCBvZiBhbm90aGVyIG1lc3NhZ2UgdGhhdCBpcyBpbiBhbiBBbnkgb3IgTWVzc2FnZVNldCBmaWVsZCwgJworICAgICAgICAgICAgICAndGhhdCBtZXNzYWdlXCdzIF9wYjIgbW9kdWxlIG11c3QgYmUgaW1wb3J0ZWQgYXMgd2VsbCcgJSBuYW1lKQorICAgICAgZWxpZiBtZXNzYWdlX2Rlc2NyaXB0b3IgIT0gZmllbGQuY29udGFpbmluZ190eXBlOgorICAgICAgICByYWlzZSB0b2tlbml6ZXIuUGFyc2VFcnJvclByZXZpb3VzVG9rZW4oCisgICAgICAgICAgICAnRXh0ZW5zaW9uICIlcyIgZG9lcyBub3QgZXh0ZW5kIG1lc3NhZ2UgdHlwZSAiJXMiLicgJQorICAgICAgICAgICAgKG5hbWUsIG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUpKQorCisgICAgICB0b2tlbml6ZXIuQ29uc3VtZSgnXScpCisKKyAgICBlbHNlOgorICAgICAgbmFtZSA9IHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllck9yTnVtYmVyKCkKKyAgICAgIGlmIHNlbGYuYWxsb3dfZmllbGRfbnVtYmVyIGFuZCBuYW1lLmlzZGlnaXQoKToKKyAgICAgICAgbnVtYmVyID0gUGFyc2VJbnRlZ2VyKG5hbWUsIFRydWUsIFRydWUpCisgICAgICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9udW1iZXIuZ2V0KG51bWJlciwgTm9uZSkKKyAgICAgICAgaWYgbm90IGZpZWxkIGFuZCBtZXNzYWdlX2Rlc2NyaXB0b3IuaXNfZXh0ZW5kYWJsZToKKyAgICAgICAgICBmaWVsZCA9IG1lc3NhZ2UuRXh0ZW5zaW9ucy5fRmluZEV4dGVuc2lvbkJ5TnVtYmVyKG51bWJlcikKKyAgICAgIGVsc2U6CisgICAgICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lLmdldChuYW1lLCBOb25lKQorCisgICAgICAgICMgR3JvdXAgbmFtZXMgYXJlIGV4cGVjdGVkIHRvIGJlIGNhcGl0YWxpemVkIGFzIHRoZXkgYXBwZWFyIGluIHRoZQorICAgICAgICAjIC5wcm90byBmaWxlLCB3aGljaCBhY3R1YWxseSBtYXRjaGVzIHRoZWlyIHR5cGUgbmFtZXMsIG5vdCB0aGVpciBmaWVsZAorICAgICAgICAjIG5hbWVzLgorICAgICAgICBpZiBub3QgZmllbGQ6CisgICAgICAgICAgZmllbGQgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzX2J5X25hbWUuZ2V0KG5hbWUubG93ZXIoKSwgTm9uZSkKKyAgICAgICAgICBpZiBmaWVsZCBhbmQgZmllbGQudHlwZSAhPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQOgorICAgICAgICAgICAgZmllbGQgPSBOb25lCisKKyAgICAgICAgaWYgKGZpZWxkIGFuZCBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVAgYW5kCisgICAgICAgICAgICBmaWVsZC5tZXNzYWdlX3R5cGUubmFtZSAhPSBuYW1lKToKKyAgICAgICAgICBmaWVsZCA9IE5vbmUKKworICAgICAgaWYgbm90IGZpZWxkIGFuZCBub3Qgc2VsZi5hbGxvd191bmtub3duX2ZpZWxkOgorICAgICAgICByYWlzZSB0b2tlbml6ZXIuUGFyc2VFcnJvclByZXZpb3VzVG9rZW4oCisgICAgICAgICAgICAnTWVzc2FnZSB0eXBlICIlcyIgaGFzIG5vIGZpZWxkIG5hbWVkICIlcyIuJyAlCisgICAgICAgICAgICAobWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSwgbmFtZSkpCisKKyAgICBpZiBmaWVsZDoKKyAgICAgIGlmIG5vdCBzZWxmLl9hbGxvd19tdWx0aXBsZV9zY2FsYXJzIGFuZCBmaWVsZC5jb250YWluaW5nX29uZW9mOgorICAgICAgICAjIENoZWNrIGlmIHRoZXJlJ3MgYSBkaWZmZXJlbnQgZmllbGQgc2V0IGluIHRoaXMgb25lb2YuCisgICAgICAgICMgTm90ZSB0aGF0IHdlIGlnbm9yZSB0aGUgY2FzZSBpZiB0aGUgc2FtZSBmaWVsZCB3YXMgc2V0IGJlZm9yZSwgYW5kIHdlCisgICAgICAgICMgYXBwbHkgX2FsbG93X211bHRpcGxlX3NjYWxhcnMgdG8gbm9uLXNjYWxhciBmaWVsZHMgYXMgd2VsbC4KKyAgICAgICAgd2hpY2hfb25lb2YgPSBtZXNzYWdlLldoaWNoT25lb2YoZmllbGQuY29udGFpbmluZ19vbmVvZi5uYW1lKQorICAgICAgICBpZiB3aGljaF9vbmVvZiBpcyBub3QgTm9uZSBhbmQgd2hpY2hfb25lb2YgIT0gZmllbGQubmFtZToKKyAgICAgICAgICByYWlzZSB0b2tlbml6ZXIuUGFyc2VFcnJvclByZXZpb3VzVG9rZW4oCisgICAgICAgICAgICAgICdGaWVsZCAiJXMiIGlzIHNwZWNpZmllZCBhbG9uZyB3aXRoIGZpZWxkICIlcyIsIGFub3RoZXIgbWVtYmVyICcKKyAgICAgICAgICAgICAgJ29mIG9uZW9mICIlcyIgZm9yIG1lc3NhZ2UgdHlwZSAiJXMiLicgJQorICAgICAgICAgICAgICAoZmllbGQubmFtZSwgd2hpY2hfb25lb2YsIGZpZWxkLmNvbnRhaW5pbmdfb25lb2YubmFtZSwKKyAgICAgICAgICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUpKQorCisgICAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgICAgIHRva2VuaXplci5UcnlDb25zdW1lKCc6JykKKyAgICAgICAgbWVyZ2VyID0gc2VsZi5fTWVyZ2VNZXNzYWdlRmllbGQKKyAgICAgIGVsc2U6CisgICAgICAgIHRva2VuaXplci5Db25zdW1lKCc6JykKKyAgICAgICAgbWVyZ2VyID0gc2VsZi5fTWVyZ2VTY2FsYXJGaWVsZAorCisgICAgICBpZiAoZmllbGQubGFiZWwgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQgYW5kCisgICAgICAgICAgdG9rZW5pemVyLlRyeUNvbnN1bWUoJ1snKSk6CisgICAgICAgICMgU2hvcnQgcmVwZWF0ZWQgZm9ybWF0LCBlLmcuICJmb286IFsxLCAyLCAzXSIKKyAgICAgICAgaWYgbm90IHRva2VuaXplci5UcnlDb25zdW1lKCddJyk6CisgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIG1lcmdlcih0b2tlbml6ZXIsIG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgICAgaWYgdG9rZW5pemVyLlRyeUNvbnN1bWUoJ10nKToKKyAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRva2VuaXplci5Db25zdW1lKCcsJykKKworICAgICAgZWxzZToKKyAgICAgICAgbWVyZ2VyKHRva2VuaXplciwgbWVzc2FnZSwgZmllbGQpCisKKyAgICBlbHNlOiAgIyBQcm90byBmaWVsZCBpcyB1bmtub3duLgorICAgICAgYXNzZXJ0IChzZWxmLmFsbG93X3Vua25vd25fZXh0ZW5zaW9uIG9yIHNlbGYuYWxsb3dfdW5rbm93bl9maWVsZCkKKyAgICAgIF9Ta2lwRmllbGRDb250ZW50cyh0b2tlbml6ZXIpCisKKyAgICAjIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIGZpZWxkcyBtYXkgb3B0aW9uYWxseSBiZSBzZXBhcmF0ZWQgYnkgY29tbWFzIG9yCisgICAgIyBzZW1pY29sb25zLgorICAgIGlmIG5vdCB0b2tlbml6ZXIuVHJ5Q29uc3VtZSgnLCcpOgorICAgICAgdG9rZW5pemVyLlRyeUNvbnN1bWUoJzsnKQorCisKKyAgZGVmIF9Db25zdW1lQW55VHlwZVVybChzZWxmLCB0b2tlbml6ZXIpOgorICAgICIiIkNvbnN1bWVzIGEgZ29vZ2xlLnByb3RvYnVmLkFueSB0eXBlIFVSTCBhbmQgcmV0dXJucyB0aGUgdHlwZSBuYW1lLiIiIgorICAgICMgQ29uc3VtZSAidHlwZS5nb29nbGVhcGlzLmNvbS8iLgorICAgIHByZWZpeCA9IFt0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIoKV0KKyAgICB0b2tlbml6ZXIuQ29uc3VtZSgnLicpCisgICAgcHJlZml4LmFwcGVuZCh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIoKSkKKyAgICB0b2tlbml6ZXIuQ29uc3VtZSgnLicpCisgICAgcHJlZml4LmFwcGVuZCh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIoKSkKKyAgICB0b2tlbml6ZXIuQ29uc3VtZSgnLycpCisgICAgIyBDb25zdW1lIHRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSBuYW1lLgorICAgIG5hbWUgPSBbdG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyKCldCisgICAgd2hpbGUgdG9rZW5pemVyLlRyeUNvbnN1bWUoJy4nKToKKyAgICAgIG5hbWUuYXBwZW5kKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllcigpKQorICAgIHJldHVybiAnLicuam9pbihwcmVmaXgpLCAnLicuam9pbihuYW1lKQorCisgIGRlZiBfTWVyZ2VNZXNzYWdlRmllbGQoc2VsZiwgdG9rZW5pemVyLCBtZXNzYWdlLCBmaWVsZCk6CisgICAgIiIiTWVyZ2VzIGEgc2luZ2xlIHNjYWxhciBmaWVsZCBpbnRvIGEgbWVzc2FnZS4KKworICAgIEFyZ3M6CisgICAgICB0b2tlbml6ZXI6IEEgdG9rZW5pemVyIHRvIHBhcnNlIHRoZSBmaWVsZCB2YWx1ZS4KKyAgICAgIG1lc3NhZ2U6IFRoZSBtZXNzYWdlIG9mIHdoaWNoIGZpZWxkIGlzIGEgbWVtYmVyLgorICAgICAgZmllbGQ6IFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWVsZCB0byBiZSBtZXJnZWQuCisKKyAgICBSYWlzZXM6CisgICAgICBQYXJzZUVycm9yOiBJbiBjYXNlIG9mIHRleHQgcGFyc2luZyBwcm9ibGVtcy4KKyAgICAiIiIKKyAgICBpc19tYXBfZW50cnkgPSBfSXNNYXBFbnRyeShmaWVsZCkKKworICAgIGlmIHRva2VuaXplci5UcnlDb25zdW1lKCc8Jyk6CisgICAgICBlbmRfdG9rZW4gPSAnPicKKyAgICBlbHNlOgorICAgICAgdG9rZW5pemVyLkNvbnN1bWUoJ3snKQorICAgICAgZW5kX3Rva2VuID0gJ30nCisKKyAgICBpZiBmaWVsZC5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgIGlmIGZpZWxkLmlzX2V4dGVuc2lvbjoKKyAgICAgICAgc3ViX21lc3NhZ2UgPSBtZXNzYWdlLkV4dGVuc2lvbnNbZmllbGRdLmFkZCgpCisgICAgICBlbGlmIGlzX21hcF9lbnRyeToKKyAgICAgICAgc3ViX21lc3NhZ2UgPSBnZXRhdHRyKG1lc3NhZ2UsIGZpZWxkLm5hbWUpLkdldEVudHJ5Q2xhc3MoKSgpCisgICAgICBlbHNlOgorICAgICAgICBzdWJfbWVzc2FnZSA9IGdldGF0dHIobWVzc2FnZSwgZmllbGQubmFtZSkuYWRkKCkKKyAgICBlbHNlOgorICAgICAgaWYgZmllbGQuaXNfZXh0ZW5zaW9uOgorICAgICAgICBpZiAobm90IHNlbGYuX2FsbG93X211bHRpcGxlX3NjYWxhcnMgYW5kCisgICAgICAgICAgICBtZXNzYWdlLkhhc0V4dGVuc2lvbihmaWVsZCkpOgorICAgICAgICAgIHJhaXNlIHRva2VuaXplci5QYXJzZUVycm9yUHJldmlvdXNUb2tlbigKKyAgICAgICAgICAgICAgJ01lc3NhZ2UgdHlwZSAiJXMiIHNob3VsZCBub3QgaGF2ZSBtdWx0aXBsZSAiJXMiIGV4dGVuc2lvbnMuJyAlCisgICAgICAgICAgICAgIChtZXNzYWdlLkRFU0NSSVBUT1IuZnVsbF9uYW1lLCBmaWVsZC5mdWxsX25hbWUpKQorICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2UuRXh0ZW5zaW9uc1tmaWVsZF0KKyAgICAgIGVsc2U6CisgICAgICAgICMgQWxzbyBhcHBseSBfYWxsb3dfbXVsdGlwbGVfc2NhbGFycyB0byBtZXNzYWdlIGZpZWxkLgorICAgICAgICAjIFRPRE8oamllbHVvKTogQ2hhbmdlIHRvIF9hbGxvd19zaW5ndWxhcl9vdmVyd3JpdGVzLgorICAgICAgICBpZiAobm90IHNlbGYuX2FsbG93X211bHRpcGxlX3NjYWxhcnMgYW5kCisgICAgICAgICAgICBtZXNzYWdlLkhhc0ZpZWxkKGZpZWxkLm5hbWUpKToKKyAgICAgICAgICByYWlzZSB0b2tlbml6ZXIuUGFyc2VFcnJvclByZXZpb3VzVG9rZW4oCisgICAgICAgICAgICAgICdNZXNzYWdlIHR5cGUgIiVzIiBzaG91bGQgbm90IGhhdmUgbXVsdGlwbGUgIiVzIiBmaWVsZHMuJyAlCisgICAgICAgICAgICAgIChtZXNzYWdlLkRFU0NSSVBUT1IuZnVsbF9uYW1lLCBmaWVsZC5uYW1lKSkKKyAgICAgICAgc3ViX21lc3NhZ2UgPSBnZXRhdHRyKG1lc3NhZ2UsIGZpZWxkLm5hbWUpCisgICAgICBzdWJfbWVzc2FnZS5TZXRJblBhcmVudCgpCisKKyAgICB3aGlsZSBub3QgdG9rZW5pemVyLlRyeUNvbnN1bWUoZW5kX3Rva2VuKToKKyAgICAgIGlmIHRva2VuaXplci5BdEVuZCgpOgorICAgICAgICByYWlzZSB0b2tlbml6ZXIuUGFyc2VFcnJvclByZXZpb3VzVG9rZW4oJ0V4cGVjdGVkICIlcyIuJyAlIChlbmRfdG9rZW4sKSkKKyAgICAgIHNlbGYuX01lcmdlRmllbGQodG9rZW5pemVyLCBzdWJfbWVzc2FnZSkKKworICAgIGlmIGlzX21hcF9lbnRyeToKKyAgICAgIHZhbHVlX2NwcHR5cGUgPSBmaWVsZC5tZXNzYWdlX3R5cGUuZmllbGRzX2J5X25hbWVbJ3ZhbHVlJ10uY3BwX3R5cGUKKyAgICAgIGlmIHZhbHVlX2NwcHR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgorICAgICAgICB2YWx1ZSA9IGdldGF0dHIobWVzc2FnZSwgZmllbGQubmFtZSlbc3ViX21lc3NhZ2Uua2V5XQorICAgICAgICB2YWx1ZS5Db3B5RnJvbShzdWJfbWVzc2FnZS52YWx1ZSkKKyAgICAgIGVsc2U6CisgICAgICAgIGdldGF0dHIobWVzc2FnZSwgZmllbGQubmFtZSlbc3ViX21lc3NhZ2Uua2V5XSA9IHN1Yl9tZXNzYWdlLnZhbHVlCisKKyAgQHN0YXRpY21ldGhvZAorICBkZWYgX0lzUHJvdG8zU3ludGF4KG1lc3NhZ2UpOgorICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9IG1lc3NhZ2UuREVTQ1JJUFRPUgorICAgIHJldHVybiAoaGFzYXR0cihtZXNzYWdlX2Rlc2NyaXB0b3IsICdzeW50YXgnKSBhbmQKKyAgICAgICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci5zeW50YXggPT0gJ3Byb3RvMycpCisKKyAgZGVmIF9NZXJnZVNjYWxhckZpZWxkKHNlbGYsIHRva2VuaXplciwgbWVzc2FnZSwgZmllbGQpOgorICAgICIiIk1lcmdlcyBhIHNpbmdsZSBzY2FsYXIgZmllbGQgaW50byBhIG1lc3NhZ2UuCisKKyAgICBBcmdzOgorICAgICAgdG9rZW5pemVyOiBBIHRva2VuaXplciB0byBwYXJzZSB0aGUgZmllbGQgdmFsdWUuCisgICAgICBtZXNzYWdlOiBBIHByb3RvY29sIG1lc3NhZ2UgdG8gcmVjb3JkIHRoZSBkYXRhLgorICAgICAgZmllbGQ6IFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWVsZCB0byBiZSBtZXJnZWQuCisKKyAgICBSYWlzZXM6CisgICAgICBQYXJzZUVycm9yOiBJbiBjYXNlIG9mIHRleHQgcGFyc2luZyBwcm9ibGVtcy4KKyAgICAgIFJ1bnRpbWVFcnJvcjogT24gcnVudGltZSBlcnJvcnMuCisgICAgIiIiCisgICAgXyA9IHNlbGYuYWxsb3dfdW5rbm93bl9leHRlbnNpb24KKyAgICB2YWx1ZSA9IE5vbmUKKworICAgIGlmIGZpZWxkLnR5cGUgaW4gKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQzMik6CisgICAgICB2YWx1ZSA9IF9Db25zdW1lSW50MzIodG9rZW5pemVyKQorICAgIGVsaWYgZmllbGQudHlwZSBpbiAoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQ2NCk6CisgICAgICB2YWx1ZSA9IF9Db25zdW1lSW50NjQodG9rZW5pemVyKQorICAgIGVsaWYgZmllbGQudHlwZSBpbiAoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVEMzIpOgorICAgICAgdmFsdWUgPSBfQ29uc3VtZVVpbnQzMih0b2tlbml6ZXIpCisgICAgZWxpZiBmaWVsZC50eXBlIGluIChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQ2NCk6CisgICAgICB2YWx1ZSA9IF9Db25zdW1lVWludDY0KHRva2VuaXplcikKKyAgICBlbGlmIGZpZWxkLnR5cGUgaW4gKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRkxPQVQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0RPVUJMRSk6CisgICAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lRmxvYXQoKQorICAgIGVsaWYgZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0JPT0w6CisgICAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lQm9vbCgpCisgICAgZWxpZiBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfU1RSSU5HOgorICAgICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZVN0cmluZygpCisgICAgZWxpZiBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVM6CisgICAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lQnl0ZVN0cmluZygpCisgICAgZWxpZiBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTToKKyAgICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVFbnVtKGZpZWxkKQorICAgIGVsc2U6CisgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ1Vua25vd24gZmllbGQgdHlwZSAlZCcgJSBmaWVsZC50eXBlKQorCisgICAgaWYgZmllbGQubGFiZWwgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICBpZiBmaWVsZC5pc19leHRlbnNpb246CisgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uc1tmaWVsZF0uYXBwZW5kKHZhbHVlKQorICAgICAgZWxzZToKKyAgICAgICAgZ2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lKS5hcHBlbmQodmFsdWUpCisgICAgZWxzZToKKyAgICAgIGlmIGZpZWxkLmlzX2V4dGVuc2lvbjoKKyAgICAgICAgaWYgKG5vdCBzZWxmLl9hbGxvd19tdWx0aXBsZV9zY2FsYXJzIGFuZAorICAgICAgICAgICAgbm90IHNlbGYuX0lzUHJvdG8zU3ludGF4KG1lc3NhZ2UpIGFuZAorICAgICAgICAgICAgbWVzc2FnZS5IYXNFeHRlbnNpb24oZmllbGQpKToKKyAgICAgICAgICByYWlzZSB0b2tlbml6ZXIuUGFyc2VFcnJvclByZXZpb3VzVG9rZW4oCisgICAgICAgICAgICAgICdNZXNzYWdlIHR5cGUgIiVzIiBzaG91bGQgbm90IGhhdmUgbXVsdGlwbGUgIiVzIiBleHRlbnNpb25zLicgJQorICAgICAgICAgICAgICAobWVzc2FnZS5ERVNDUklQVE9SLmZ1bGxfbmFtZSwgZmllbGQuZnVsbF9uYW1lKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvbnNbZmllbGRdID0gdmFsdWUKKyAgICAgIGVsc2U6CisgICAgICAgIGR1cGxpY2F0ZV9lcnJvciA9IEZhbHNlCisgICAgICAgIGlmIG5vdCBzZWxmLl9hbGxvd19tdWx0aXBsZV9zY2FsYXJzOgorICAgICAgICAgIGlmIHNlbGYuX0lzUHJvdG8zU3ludGF4KG1lc3NhZ2UpOgorICAgICAgICAgICAgIyBQcm90bzMgZG9lc24ndCByZXByZXNlbnQgcHJlc2VuY2Ugc28gd2UgdHJ5IGJlc3QgZWZmb3J0IHRvIGNoZWNrCisgICAgICAgICAgICAjIG11bHRpcGxlIHNjYWxhcnMgYnkgY29tcGFyZSB0byBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgICAgIGR1cGxpY2F0ZV9lcnJvciA9IGJvb2woZ2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lKSkKKyAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgZHVwbGljYXRlX2Vycm9yID0gbWVzc2FnZS5IYXNGaWVsZChmaWVsZC5uYW1lKQorCisgICAgICAgIGlmIGR1cGxpY2F0ZV9lcnJvcjoKKyAgICAgICAgICByYWlzZSB0b2tlbml6ZXIuUGFyc2VFcnJvclByZXZpb3VzVG9rZW4oCisgICAgICAgICAgICAgICdNZXNzYWdlIHR5cGUgIiVzIiBzaG91bGQgbm90IGhhdmUgbXVsdGlwbGUgIiVzIiBmaWVsZHMuJyAlCisgICAgICAgICAgICAgIChtZXNzYWdlLkRFU0NSSVBUT1IuZnVsbF9uYW1lLCBmaWVsZC5uYW1lKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBzZXRhdHRyKG1lc3NhZ2UsIGZpZWxkLm5hbWUsIHZhbHVlKQorCisKK2RlZiBfU2tpcEZpZWxkQ29udGVudHModG9rZW5pemVyKToKKyAgIiIiU2tpcHMgb3ZlciBjb250ZW50cyAodmFsdWUgb3IgbWVzc2FnZSkgb2YgYSBmaWVsZC4KKworICBBcmdzOgorICAgIHRva2VuaXplcjogQSB0b2tlbml6ZXIgdG8gcGFyc2UgdGhlIGZpZWxkIG5hbWUgYW5kIHZhbHVlcy4KKyAgIiIiCisgICMgVHJ5IHRvIGd1ZXNzIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQuCisgICMgSWYgdGhpcyBmaWVsZCBpcyBub3QgYSBtZXNzYWdlLCB0aGVyZSBzaG91bGQgYmUgYSAiOiIgYmV0d2VlbiB0aGUKKyAgIyBmaWVsZCBuYW1lIGFuZCB0aGUgZmllbGQgdmFsdWUgYW5kIGFsc28gdGhlIGZpZWxkIHZhbHVlIHNob3VsZCBub3QKKyAgIyBzdGFydCB3aXRoICJ7IiBvciAiPCIgd2hpY2ggaW5kaWNhdGVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtZXNzYWdlIGJvZHkuCisgICMgSWYgdGhlcmUgaXMgbm8gIjoiIG9yIHRoZXJlIGlzIGEgInsiIG9yICI8IiBhZnRlciAiOiIsIHRoaXMgZmllbGQgaGFzCisgICMgdG8gYmUgYSBtZXNzYWdlIG9yIHRoZSBpbnB1dCBpcyBpbGwtZm9ybWVkLgorICBpZiB0b2tlbml6ZXIuVHJ5Q29uc3VtZSgKKyAgICAgICc6JykgYW5kIG5vdCB0b2tlbml6ZXIuTG9va2luZ0F0KCd7JykgYW5kIG5vdCB0b2tlbml6ZXIuTG9va2luZ0F0KCc8Jyk6CisgICAgaWYgdG9rZW5pemVyLkxvb2tpbmdBdCgnWycpOgorICAgICAgX1NraXBSZXBlYXRlZEZpZWxkVmFsdWUodG9rZW5pemVyKQorICAgIGVsc2U6CisgICAgICBfU2tpcEZpZWxkVmFsdWUodG9rZW5pemVyKQorICBlbHNlOgorICAgIF9Ta2lwRmllbGRNZXNzYWdlKHRva2VuaXplcikKKworCitkZWYgX1NraXBGaWVsZCh0b2tlbml6ZXIpOgorICAiIiJTa2lwcyBvdmVyIGEgY29tcGxldGUgZmllbGQgKG5hbWUgYW5kIHZhbHVlL21lc3NhZ2UpLgorCisgIEFyZ3M6CisgICAgdG9rZW5pemVyOiBBIHRva2VuaXplciB0byBwYXJzZSB0aGUgZmllbGQgbmFtZSBhbmQgdmFsdWVzLgorICAiIiIKKyAgaWYgdG9rZW5pemVyLlRyeUNvbnN1bWUoJ1snKToKKyAgICAjIENvbnN1bWUgZXh0ZW5zaW9uIG5hbWUuCisgICAgdG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyKCkKKyAgICB3aGlsZSB0b2tlbml6ZXIuVHJ5Q29uc3VtZSgnLicpOgorICAgICAgdG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyKCkKKyAgICB0b2tlbml6ZXIuQ29uc3VtZSgnXScpCisgIGVsc2U6CisgICAgdG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyT3JOdW1iZXIoKQorCisgIF9Ta2lwRmllbGRDb250ZW50cyh0b2tlbml6ZXIpCisKKyAgIyBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBmaWVsZHMgbWF5IG9wdGlvbmFsbHkgYmUgc2VwYXJhdGVkIGJ5IGNvbW1hcyBvcgorICAjIHNlbWljb2xvbnMuCisgIGlmIG5vdCB0b2tlbml6ZXIuVHJ5Q29uc3VtZSgnLCcpOgorICAgIHRva2VuaXplci5UcnlDb25zdW1lKCc7JykKKworCitkZWYgX1NraXBGaWVsZE1lc3NhZ2UodG9rZW5pemVyKToKKyAgIiIiU2tpcHMgb3ZlciBhIGZpZWxkIG1lc3NhZ2UuCisKKyAgQXJnczoKKyAgICB0b2tlbml6ZXI6IEEgdG9rZW5pemVyIHRvIHBhcnNlIHRoZSBmaWVsZCBuYW1lIGFuZCB2YWx1ZXMuCisgICIiIgorCisgIGlmIHRva2VuaXplci5UcnlDb25zdW1lKCc8Jyk6CisgICAgZGVsaW1pdGVyID0gJz4nCisgIGVsc2U6CisgICAgdG9rZW5pemVyLkNvbnN1bWUoJ3snKQorICAgIGRlbGltaXRlciA9ICd9JworCisgIHdoaWxlIG5vdCB0b2tlbml6ZXIuTG9va2luZ0F0KCc+JykgYW5kIG5vdCB0b2tlbml6ZXIuTG9va2luZ0F0KCd9Jyk6CisgICAgX1NraXBGaWVsZCh0b2tlbml6ZXIpCisKKyAgdG9rZW5pemVyLkNvbnN1bWUoZGVsaW1pdGVyKQorCisKK2RlZiBfU2tpcEZpZWxkVmFsdWUodG9rZW5pemVyKToKKyAgIiIiU2tpcHMgb3ZlciBhIGZpZWxkIHZhbHVlLgorCisgIEFyZ3M6CisgICAgdG9rZW5pemVyOiBBIHRva2VuaXplciB0byBwYXJzZSB0aGUgZmllbGQgbmFtZSBhbmQgdmFsdWVzLgorCisgIFJhaXNlczoKKyAgICBQYXJzZUVycm9yOiBJbiBjYXNlIGFuIGludmFsaWQgZmllbGQgdmFsdWUgaXMgZm91bmQuCisgICIiIgorICAjIFN0cmluZy9ieXRlcyB0b2tlbnMgY2FuIGNvbWUgaW4gbXVsdGlwbGUgYWRqYWNlbnQgc3RyaW5nIGxpdGVyYWxzLgorICAjIElmIHdlIGNhbiBjb25zdW1lIG9uZSwgY29uc3VtZSBhcyBtYW55IGFzIHdlIGNhbi4KKyAgaWYgdG9rZW5pemVyLlRyeUNvbnN1bWVCeXRlU3RyaW5nKCk6CisgICAgd2hpbGUgdG9rZW5pemVyLlRyeUNvbnN1bWVCeXRlU3RyaW5nKCk6CisgICAgICBwYXNzCisgICAgcmV0dXJuCisKKyAgaWYgKG5vdCB0b2tlbml6ZXIuVHJ5Q29uc3VtZUlkZW50aWZpZXIoKSBhbmQKKyAgICAgIG5vdCBfVHJ5Q29uc3VtZUludDY0KHRva2VuaXplcikgYW5kIG5vdCBfVHJ5Q29uc3VtZVVpbnQ2NCh0b2tlbml6ZXIpIGFuZAorICAgICAgbm90IHRva2VuaXplci5UcnlDb25zdW1lRmxvYXQoKSk6CisgICAgcmFpc2UgUGFyc2VFcnJvcignSW52YWxpZCBmaWVsZCB2YWx1ZTogJyArIHRva2VuaXplci50b2tlbikKKworCitkZWYgX1NraXBSZXBlYXRlZEZpZWxkVmFsdWUodG9rZW5pemVyKToKKyAgIiIiU2tpcHMgb3ZlciBhIHJlcGVhdGVkIGZpZWxkIHZhbHVlLgorCisgIEFyZ3M6CisgICAgdG9rZW5pemVyOiBBIHRva2VuaXplciB0byBwYXJzZSB0aGUgZmllbGQgdmFsdWUuCisgICIiIgorICB0b2tlbml6ZXIuQ29uc3VtZSgnWycpCisgIGlmIG5vdCB0b2tlbml6ZXIuTG9va2luZ0F0KCddJyk6CisgICAgX1NraXBGaWVsZFZhbHVlKHRva2VuaXplcikKKyAgICB3aGlsZSB0b2tlbml6ZXIuVHJ5Q29uc3VtZSgnLCcpOgorICAgICAgX1NraXBGaWVsZFZhbHVlKHRva2VuaXplcikKKyAgdG9rZW5pemVyLkNvbnN1bWUoJ10nKQorCisKK2NsYXNzIFRva2VuaXplcihvYmplY3QpOgorICAiIiJQcm90b2NvbCBidWZmZXIgdGV4dCByZXByZXNlbnRhdGlvbiB0b2tlbml6ZXIuCisKKyAgVGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBsb3dlciBsZXZlbCBzdHJpbmcgcGFyc2luZyBieSBzcGxpdHRpbmcgaXQgaW50bworICBtZWFuaW5nZnVsIHRva2Vucy4KKworICBJdCB3YXMgZGlyZWN0bHkgcG9ydGVkIGZyb20gdGhlIEphdmEgcHJvdG9jb2wgYnVmZmVyIEFQSS4KKyAgIiIiCisKKyAgX1dISVRFU1BBQ0UgPSByZS5jb21waWxlKHInXHMrJykKKyAgX0NPTU1FTlQgPSByZS5jb21waWxlKHInKFxzKiMuKiQpJywgcmUuTVVMVElMSU5FKQorICBfV0hJVEVTUEFDRV9PUl9DT01NRU5UID0gcmUuY29tcGlsZShyJyhcc3woIy4qJCkpKycsIHJlLk1VTFRJTElORSkKKyAgX1RPS0VOID0gcmUuY29tcGlsZSgnfCcuam9pbihbCisgICAgICByJ1thLXpBLVpfXVswLTlhLXpBLVpfKy1dKicsICAjIGFuIGlkZW50aWZpZXIKKyAgICAgIHInKFswLTkrLV18KFwuWzAtOV0pKVswLTlhLXpBLVpfListXSonLCAgIyBhIG51bWJlcgorICBdICsgWyAgIyBxdW90ZWQgc3RyIGZvciBlYWNoIHF1b3RlIG1hcmsKKyAgICAgICMgQXZvaWQgYmFja3RyYWNraW5nISBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvODQ0MjY3CisgICAgICByJ3txdH1bXntxdH1cblxcXSooKFxcLikrW157cXR9XG5cXF0qKSooe3F0fXxcXD8kKScuZm9ybWF0KHF0PW1hcmspCisgICAgICBmb3IgbWFyayBpbiBfUVVPVEVTCisgIF0pKQorCisgIF9JREVOVElGSUVSID0gcmUuY29tcGlsZShyJ1teXGRcV11cdyonKQorICBfSURFTlRJRklFUl9PUl9OVU1CRVIgPSByZS5jb21waWxlKHInXHcrJykKKworICBkZWYgX19pbml0X18oc2VsZiwgbGluZXMsIHNraXBfY29tbWVudHM9VHJ1ZSk6CisgICAgc2VsZi5fcG9zaXRpb24gPSAwCisgICAgc2VsZi5fbGluZSA9IC0xCisgICAgc2VsZi5fY29sdW1uID0gMAorICAgIHNlbGYuX3Rva2VuX3N0YXJ0ID0gTm9uZQorICAgIHNlbGYudG9rZW4gPSAnJworICAgIHNlbGYuX2xpbmVzID0gaXRlcihsaW5lcykKKyAgICBzZWxmLl9jdXJyZW50X2xpbmUgPSAnJworICAgIHNlbGYuX3ByZXZpb3VzX2xpbmUgPSAwCisgICAgc2VsZi5fcHJldmlvdXNfY29sdW1uID0gMAorICAgIHNlbGYuX21vcmVfbGluZXMgPSBUcnVlCisgICAgc2VsZi5fc2tpcF9jb21tZW50cyA9IHNraXBfY29tbWVudHMKKyAgICBzZWxmLl93aGl0ZXNwYWNlX3BhdHRlcm4gPSAoc2tpcF9jb21tZW50cyBhbmQgc2VsZi5fV0hJVEVTUEFDRV9PUl9DT01NRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYuX1dISVRFU1BBQ0UpCisgICAgc2VsZi5fU2tpcFdoaXRlc3BhY2UoKQorICAgIHNlbGYuTmV4dFRva2VuKCkKKworICBkZWYgTG9va2luZ0F0KHNlbGYsIHRva2VuKToKKyAgICByZXR1cm4gc2VsZi50b2tlbiA9PSB0b2tlbgorCisgIGRlZiBBdEVuZChzZWxmKToKKyAgICAiIiJDaGVja3MgdGhlIGVuZCBvZiB0aGUgdGV4dCB3YXMgcmVhY2hlZC4KKworICAgIFJldHVybnM6CisgICAgICBUcnVlIGlmZiB0aGUgZW5kIHdhcyByZWFjaGVkLgorICAgICIiIgorICAgIHJldHVybiBub3Qgc2VsZi50b2tlbgorCisgIGRlZiBfUG9wTGluZShzZWxmKToKKyAgICB3aGlsZSBsZW4oc2VsZi5fY3VycmVudF9saW5lKSA8PSBzZWxmLl9jb2x1bW46CisgICAgICB0cnk6CisgICAgICAgIHNlbGYuX2N1cnJlbnRfbGluZSA9IG5leHQoc2VsZi5fbGluZXMpCisgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgc2VsZi5fY3VycmVudF9saW5lID0gJycKKyAgICAgICAgc2VsZi5fbW9yZV9saW5lcyA9IEZhbHNlCisgICAgICAgIHJldHVybgorICAgICAgZWxzZToKKyAgICAgICAgc2VsZi5fbGluZSArPSAxCisgICAgICAgIHNlbGYuX2NvbHVtbiA9IDAKKworICBkZWYgX1NraXBXaGl0ZXNwYWNlKHNlbGYpOgorICAgIHdoaWxlIFRydWU6CisgICAgICBzZWxmLl9Qb3BMaW5lKCkKKyAgICAgIG1hdGNoID0gc2VsZi5fd2hpdGVzcGFjZV9wYXR0ZXJuLm1hdGNoKHNlbGYuX2N1cnJlbnRfbGluZSwgc2VsZi5fY29sdW1uKQorICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICBicmVhaworICAgICAgbGVuZ3RoID0gbGVuKG1hdGNoLmdyb3VwKDApKQorICAgICAgc2VsZi5fY29sdW1uICs9IGxlbmd0aAorCisgIGRlZiBUcnlDb25zdW1lKHNlbGYsIHRva2VuKToKKyAgICAiIiJUcmllcyB0byBjb25zdW1lIGEgZ2l2ZW4gcGllY2Ugb2YgdGV4dC4KKworICAgIEFyZ3M6CisgICAgICB0b2tlbjogVGV4dCB0byBjb25zdW1lLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRydWUgaWZmIHRoZSB0ZXh0IHdhcyBjb25zdW1lZC4KKyAgICAiIiIKKyAgICBpZiBzZWxmLnRva2VuID09IHRva2VuOgorICAgICAgc2VsZi5OZXh0VG9rZW4oKQorICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworICBkZWYgQ29uc3VtZShzZWxmLCB0b2tlbik6CisgICAgIiIiQ29uc3VtZXMgYSBwaWVjZSBvZiB0ZXh0LgorCisgICAgQXJnczoKKyAgICAgIHRva2VuOiBUZXh0IHRvIGNvbnN1bWUuCisKKyAgICBSYWlzZXM6CisgICAgICBQYXJzZUVycm9yOiBJZiB0aGUgdGV4dCBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgICAiIiIKKyAgICBpZiBub3Qgc2VsZi5UcnlDb25zdW1lKHRva2VuKToKKyAgICAgIHJhaXNlIHNlbGYuUGFyc2VFcnJvcignRXhwZWN0ZWQgIiVzIi4nICUgdG9rZW4pCisKKyAgZGVmIENvbnN1bWVDb21tZW50KHNlbGYpOgorICAgIHJlc3VsdCA9IHNlbGYudG9rZW4KKyAgICBpZiBub3Qgc2VsZi5fQ09NTUVOVC5tYXRjaChyZXN1bHQpOgorICAgICAgcmFpc2Ugc2VsZi5QYXJzZUVycm9yKCdFeHBlY3RlZCBjb21tZW50LicpCisgICAgc2VsZi5OZXh0VG9rZW4oKQorICAgIHJldHVybiByZXN1bHQKKworICBkZWYgQ29uc3VtZUNvbW1lbnRPclRyYWlsaW5nQ29tbWVudChzZWxmKToKKyAgICAiIiJDb25zdW1lcyBhIGNvbW1lbnQsIHJldHVybnMgYSAyLXR1cGxlICh0cmFpbGluZyBib29sLCBjb21tZW50IHN0cikuIiIiCisKKyAgICAjIFRva2VuaXplciBpbml0aWFsaXplcyBfcHJldmlvdXNfbGluZSBhbmQgX3ByZXZpb3VzX2NvbHVtbiB0byAwLiBBcyB0aGUKKyAgICAjIHRva2VuaXplciBzdGFydHMsIGl0IGxvb2tzIGxpa2UgdGhlcmUgaXMgYSBwcmV2aW91cyB0b2tlbiBvbiB0aGUgbGluZS4KKyAgICBqdXN0X3N0YXJ0ZWQgPSBzZWxmLl9saW5lID09IDAgYW5kIHNlbGYuX2NvbHVtbiA9PSAwCisKKyAgICBiZWZvcmVfcGFyc2luZyA9IHNlbGYuX3ByZXZpb3VzX2xpbmUKKyAgICBjb21tZW50ID0gc2VsZi5Db25zdW1lQ29tbWVudCgpCisKKyAgICAjIEEgdHJhaWxpbmcgY29tbWVudCBpcyBhIGNvbW1lbnQgb24gdGhlIHNhbWUgbGluZSB0aGFuIHRoZSBwcmV2aW91cyB0b2tlbi4KKyAgICB0cmFpbGluZyA9IChzZWxmLl9wcmV2aW91c19saW5lID09IGJlZm9yZV9wYXJzaW5nCisgICAgICAgICAgICAgICAgYW5kIG5vdCBqdXN0X3N0YXJ0ZWQpCisKKyAgICByZXR1cm4gdHJhaWxpbmcsIGNvbW1lbnQKKworICBkZWYgVHJ5Q29uc3VtZUlkZW50aWZpZXIoc2VsZik6CisgICAgdHJ5OgorICAgICAgc2VsZi5Db25zdW1lSWRlbnRpZmllcigpCisgICAgICByZXR1cm4gVHJ1ZQorICAgIGV4Y2VwdCBQYXJzZUVycm9yOgorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIENvbnN1bWVJZGVudGlmaWVyKHNlbGYpOgorICAgICIiIkNvbnN1bWVzIHByb3RvY29sIG1lc3NhZ2UgZmllbGQgaWRlbnRpZmllci4KKworICAgIFJldHVybnM6CisgICAgICBJZGVudGlmaWVyIHN0cmluZy4KKworICAgIFJhaXNlczoKKyAgICAgIFBhcnNlRXJyb3I6IElmIGFuIGlkZW50aWZpZXIgY291bGRuJ3QgYmUgY29uc3VtZWQuCisgICAgIiIiCisgICAgcmVzdWx0ID0gc2VsZi50b2tlbgorICAgIGlmIG5vdCBzZWxmLl9JREVOVElGSUVSLm1hdGNoKHJlc3VsdCk6CisgICAgICByYWlzZSBzZWxmLlBhcnNlRXJyb3IoJ0V4cGVjdGVkIGlkZW50aWZpZXIuJykKKyAgICBzZWxmLk5leHRUb2tlbigpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBUcnlDb25zdW1lSWRlbnRpZmllck9yTnVtYmVyKHNlbGYpOgorICAgIHRyeToKKyAgICAgIHNlbGYuQ29uc3VtZUlkZW50aWZpZXJPck51bWJlcigpCisgICAgICByZXR1cm4gVHJ1ZQorICAgIGV4Y2VwdCBQYXJzZUVycm9yOgorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIENvbnN1bWVJZGVudGlmaWVyT3JOdW1iZXIoc2VsZik6CisgICAgIiIiQ29uc3VtZXMgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZCBpZGVudGlmaWVyLgorCisgICAgUmV0dXJuczoKKyAgICAgIElkZW50aWZpZXIgc3RyaW5nLgorCisgICAgUmFpc2VzOgorICAgICAgUGFyc2VFcnJvcjogSWYgYW4gaWRlbnRpZmllciBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgICAiIiIKKyAgICByZXN1bHQgPSBzZWxmLnRva2VuCisgICAgaWYgbm90IHNlbGYuX0lERU5USUZJRVJfT1JfTlVNQkVSLm1hdGNoKHJlc3VsdCk6CisgICAgICByYWlzZSBzZWxmLlBhcnNlRXJyb3IoJ0V4cGVjdGVkIGlkZW50aWZpZXIgb3IgbnVtYmVyLCBnb3QgJXMuJyAlIHJlc3VsdCkKKyAgICBzZWxmLk5leHRUb2tlbigpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBUcnlDb25zdW1lSW50ZWdlcihzZWxmKToKKyAgICB0cnk6CisgICAgICBzZWxmLkNvbnN1bWVJbnRlZ2VyKCkKKyAgICAgIHJldHVybiBUcnVlCisgICAgZXhjZXB0IFBhcnNlRXJyb3I6CisgICAgICByZXR1cm4gRmFsc2UKKworICBkZWYgQ29uc3VtZUludGVnZXIoc2VsZik6CisgICAgIiIiQ29uc3VtZXMgYW4gaW50ZWdlciBudW1iZXIuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGludGVnZXIgcGFyc2VkLgorCisgICAgUmFpc2VzOgorICAgICAgUGFyc2VFcnJvcjogSWYgYW4gaW50ZWdlciBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICByZXN1bHQgPSBfUGFyc2VBYnN0cmFjdEludGVnZXIoc2VsZi50b2tlbikKKyAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgorICAgICAgcmFpc2Ugc2VsZi5QYXJzZUVycm9yKHN0cihlKSkKKyAgICBzZWxmLk5leHRUb2tlbigpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBUcnlDb25zdW1lRmxvYXQoc2VsZik6CisgICAgdHJ5OgorICAgICAgc2VsZi5Db25zdW1lRmxvYXQoKQorICAgICAgcmV0dXJuIFRydWUKKyAgICBleGNlcHQgUGFyc2VFcnJvcjoKKyAgICAgIHJldHVybiBGYWxzZQorCisgIGRlZiBDb25zdW1lRmxvYXQoc2VsZik6CisgICAgIiIiQ29uc3VtZXMgYW4gZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBudW1iZXIgcGFyc2VkLgorCisgICAgUmFpc2VzOgorICAgICAgUGFyc2VFcnJvcjogSWYgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgY291bGRuJ3QgYmUgY29uc3VtZWQuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgcmVzdWx0ID0gUGFyc2VGbG9hdChzZWxmLnRva2VuKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CisgICAgICByYWlzZSBzZWxmLlBhcnNlRXJyb3Ioc3RyKGUpKQorICAgIHNlbGYuTmV4dFRva2VuKCkKKyAgICByZXR1cm4gcmVzdWx0CisKKyAgZGVmIENvbnN1bWVCb29sKHNlbGYpOgorICAgICIiIkNvbnN1bWVzIGEgYm9vbGVhbiB2YWx1ZS4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgYm9vbCBwYXJzZWQuCisKKyAgICBSYWlzZXM6CisgICAgICBQYXJzZUVycm9yOiBJZiBhIGJvb2xlYW4gdmFsdWUgY291bGRuJ3QgYmUgY29uc3VtZWQuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgcmVzdWx0ID0gUGFyc2VCb29sKHNlbGYudG9rZW4pCisgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKKyAgICAgIHJhaXNlIHNlbGYuUGFyc2VFcnJvcihzdHIoZSkpCisgICAgc2VsZi5OZXh0VG9rZW4oKQorICAgIHJldHVybiByZXN1bHQKKworICBkZWYgVHJ5Q29uc3VtZUJ5dGVTdHJpbmcoc2VsZik6CisgICAgdHJ5OgorICAgICAgc2VsZi5Db25zdW1lQnl0ZVN0cmluZygpCisgICAgICByZXR1cm4gVHJ1ZQorICAgIGV4Y2VwdCBQYXJzZUVycm9yOgorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIENvbnN1bWVTdHJpbmcoc2VsZik6CisgICAgIiIiQ29uc3VtZXMgYSBzdHJpbmcgdmFsdWUuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIHN0cmluZyBwYXJzZWQuCisKKyAgICBSYWlzZXM6CisgICAgICBQYXJzZUVycm9yOiBJZiBhIHN0cmluZyB2YWx1ZSBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgICAiIiIKKyAgICB0aGVfYnl0ZXMgPSBzZWxmLkNvbnN1bWVCeXRlU3RyaW5nKCkKKyAgICB0cnk6CisgICAgICByZXR1cm4gc3RyKHRoZV9ieXRlcywgJ3V0Zi04JykKKyAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yIGFzIGU6CisgICAgICByYWlzZSBzZWxmLl9TdHJpbmdQYXJzZUVycm9yKGUpCisKKyAgZGVmIENvbnN1bWVCeXRlU3RyaW5nKHNlbGYpOgorICAgICIiIkNvbnN1bWVzIGEgYnl0ZSBhcnJheSB2YWx1ZS4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgYXJyYXkgcGFyc2VkIChhcyBhIHN0cmluZykuCisKKyAgICBSYWlzZXM6CisgICAgICBQYXJzZUVycm9yOiBJZiBhIGJ5dGUgYXJyYXkgdmFsdWUgY291bGRuJ3QgYmUgY29uc3VtZWQuCisgICAgIiIiCisgICAgdGhlX2xpc3QgPSBbc2VsZi5fQ29uc3VtZVNpbmdsZUJ5dGVTdHJpbmcoKV0KKyAgICB3aGlsZSBzZWxmLnRva2VuIGFuZCBzZWxmLnRva2VuWzBdIGluIF9RVU9URVM6CisgICAgICB0aGVfbGlzdC5hcHBlbmQoc2VsZi5fQ29uc3VtZVNpbmdsZUJ5dGVTdHJpbmcoKSkKKyAgICByZXR1cm4gYicnLmpvaW4odGhlX2xpc3QpCisKKyAgZGVmIF9Db25zdW1lU2luZ2xlQnl0ZVN0cmluZyhzZWxmKToKKyAgICAiIiJDb25zdW1lIG9uZSB0b2tlbiBvZiBhIHN0cmluZyBsaXRlcmFsLgorCisgICAgU3RyaW5nIGxpdGVyYWxzICh3aGV0aGVyIGJ5dGVzIG9yIHRleHQpIGNhbiBjb21lIGluIG11bHRpcGxlIGFkamFjZW50CisgICAgdG9rZW5zIHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5IGNvbmNhdGVuYXRlZCwgbGlrZSBpbiBDIG9yIFB5dGhvbi4gIFRoaXMKKyAgICBtZXRob2Qgb25seSBjb25zdW1lcyBvbmUgdG9rZW4uCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIHRva2VuIHBhcnNlZC4KKyAgICBSYWlzZXM6CisgICAgICBQYXJzZUVycm9yOiBXaGVuIHRoZSB3cm9uZyBmb3JtYXQgZGF0YSBpcyBmb3VuZC4KKyAgICAiIiIKKyAgICB0ZXh0ID0gc2VsZi50b2tlbgorICAgIGlmIGxlbih0ZXh0KSA8IDEgb3IgdGV4dFswXSBub3QgaW4gX1FVT1RFUzoKKyAgICAgIHJhaXNlIHNlbGYuUGFyc2VFcnJvcignRXhwZWN0ZWQgc3RyaW5nIGJ1dCBmb3VuZDogJXInICUgKHRleHQsKSkKKworICAgIGlmIGxlbih0ZXh0KSA8IDIgb3IgdGV4dFstMV0gIT0gdGV4dFswXToKKyAgICAgIHJhaXNlIHNlbGYuUGFyc2VFcnJvcignU3RyaW5nIG1pc3NpbmcgZW5kaW5nIHF1b3RlOiAlcicgJSAodGV4dCwpKQorCisgICAgdHJ5OgorICAgICAgcmVzdWx0ID0gdGV4dF9lbmNvZGluZy5DVW5lc2NhcGUodGV4dFsxOi0xXSkKKyAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgorICAgICAgcmFpc2Ugc2VsZi5QYXJzZUVycm9yKHN0cihlKSkKKyAgICBzZWxmLk5leHRUb2tlbigpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBDb25zdW1lRW51bShzZWxmLCBmaWVsZCk6CisgICAgdHJ5OgorICAgICAgcmVzdWx0ID0gUGFyc2VFbnVtKGZpZWxkLCBzZWxmLnRva2VuKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CisgICAgICByYWlzZSBzZWxmLlBhcnNlRXJyb3Ioc3RyKGUpKQorICAgIHNlbGYuTmV4dFRva2VuKCkKKyAgICByZXR1cm4gcmVzdWx0CisKKyAgZGVmIFBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKHNlbGYsIG1lc3NhZ2UpOgorICAgICIiIkNyZWF0ZXMgYW5kICpyZXR1cm5zKiBhIFBhcnNlRXJyb3IgZm9yIHRoZSBwcmV2aW91c2x5IHJlYWQgdG9rZW4uCisKKyAgICBBcmdzOgorICAgICAgbWVzc2FnZTogQSBtZXNzYWdlIHRvIHNldCBmb3IgdGhlIGV4Y2VwdGlvbi4KKworICAgIFJldHVybnM6CisgICAgICBBIFBhcnNlRXJyb3IgaW5zdGFuY2UuCisgICAgIiIiCisgICAgcmV0dXJuIFBhcnNlRXJyb3IobWVzc2FnZSwgc2VsZi5fcHJldmlvdXNfbGluZSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHJldmlvdXNfY29sdW1uICsgMSkKKworICBkZWYgUGFyc2VFcnJvcihzZWxmLCBtZXNzYWdlKToKKyAgICAiIiJDcmVhdGVzIGFuZCAqcmV0dXJucyogYSBQYXJzZUVycm9yIGZvciB0aGUgY3VycmVudCB0b2tlbi4iIiIKKyAgICByZXR1cm4gUGFyc2VFcnJvcignXCcnICsgc2VsZi5fY3VycmVudF9saW5lICsgJ1wnOiAnICsgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9saW5lICsgMSwgc2VsZi5fY29sdW1uICsgMSkKKworICBkZWYgX1N0cmluZ1BhcnNlRXJyb3Ioc2VsZiwgZSk6CisgICAgcmV0dXJuIHNlbGYuUGFyc2VFcnJvcignQ291bGRuXCd0IHBhcnNlIHN0cmluZzogJyArIHN0cihlKSkKKworICBkZWYgTmV4dFRva2VuKHNlbGYpOgorICAgICIiIlJlYWRzIHRoZSBuZXh0IG1lYW5pbmdmdWwgdG9rZW4uIiIiCisgICAgc2VsZi5fcHJldmlvdXNfbGluZSA9IHNlbGYuX2xpbmUKKyAgICBzZWxmLl9wcmV2aW91c19jb2x1bW4gPSBzZWxmLl9jb2x1bW4KKworICAgIHNlbGYuX2NvbHVtbiArPSBsZW4oc2VsZi50b2tlbikKKyAgICBzZWxmLl9Ta2lwV2hpdGVzcGFjZSgpCisKKyAgICBpZiBub3Qgc2VsZi5fbW9yZV9saW5lczoKKyAgICAgIHNlbGYudG9rZW4gPSAnJworICAgICAgcmV0dXJuCisKKyAgICBtYXRjaCA9IHNlbGYuX1RPS0VOLm1hdGNoKHNlbGYuX2N1cnJlbnRfbGluZSwgc2VsZi5fY29sdW1uKQorICAgIGlmIG5vdCBtYXRjaCBhbmQgbm90IHNlbGYuX3NraXBfY29tbWVudHM6CisgICAgICBtYXRjaCA9IHNlbGYuX0NPTU1FTlQubWF0Y2goc2VsZi5fY3VycmVudF9saW5lLCBzZWxmLl9jb2x1bW4pCisgICAgaWYgbWF0Y2g6CisgICAgICB0b2tlbiA9IG1hdGNoLmdyb3VwKDApCisgICAgICBzZWxmLnRva2VuID0gdG9rZW4KKyAgICBlbHNlOgorICAgICAgc2VsZi50b2tlbiA9IHNlbGYuX2N1cnJlbnRfbGluZVtzZWxmLl9jb2x1bW5dCisKKyMgQWxpYXNlZCBzbyBpdCBjYW4gc3RpbGwgYmUgYWNjZXNzZWQgYnkgY3VycmVudCB2aXNpYmlsaXR5IHZpb2xhdG9ycy4KKyMgVE9ETyhkYmFybmV0dCk6IE1pZ3JhdGUgdmlvbGF0b3JzIHRvIHRleHRmb3JtYXRfdG9rZW5pemVyLgorX1Rva2VuaXplciA9IFRva2VuaXplciAgIyBweWxpbnQ6IGRpc2FibGU9aW52YWxpZC1uYW1lCisKKworZGVmIF9Db25zdW1lSW50MzIodG9rZW5pemVyKToKKyAgIiIiQ29uc3VtZXMgYSBzaWduZWQgMzJiaXQgaW50ZWdlciBudW1iZXIgZnJvbSB0b2tlbml6ZXIuCisKKyAgQXJnczoKKyAgICB0b2tlbml6ZXI6IEEgdG9rZW5pemVyIHVzZWQgdG8gcGFyc2UgdGhlIG51bWJlci4KKworICBSZXR1cm5zOgorICAgIFRoZSBpbnRlZ2VyIHBhcnNlZC4KKworICBSYWlzZXM6CisgICAgUGFyc2VFcnJvcjogSWYgYSBzaWduZWQgMzJiaXQgaW50ZWdlciBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgIiIiCisgIHJldHVybiBfQ29uc3VtZUludGVnZXIodG9rZW5pemVyLCBpc19zaWduZWQ9VHJ1ZSwgaXNfbG9uZz1GYWxzZSkKKworCitkZWYgX0NvbnN1bWVVaW50MzIodG9rZW5pemVyKToKKyAgIiIiQ29uc3VtZXMgYW4gdW5zaWduZWQgMzJiaXQgaW50ZWdlciBudW1iZXIgZnJvbSB0b2tlbml6ZXIuCisKKyAgQXJnczoKKyAgICB0b2tlbml6ZXI6IEEgdG9rZW5pemVyIHVzZWQgdG8gcGFyc2UgdGhlIG51bWJlci4KKworICBSZXR1cm5zOgorICAgIFRoZSBpbnRlZ2VyIHBhcnNlZC4KKworICBSYWlzZXM6CisgICAgUGFyc2VFcnJvcjogSWYgYW4gdW5zaWduZWQgMzJiaXQgaW50ZWdlciBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgIiIiCisgIHJldHVybiBfQ29uc3VtZUludGVnZXIodG9rZW5pemVyLCBpc19zaWduZWQ9RmFsc2UsIGlzX2xvbmc9RmFsc2UpCisKKworZGVmIF9UcnlDb25zdW1lSW50NjQodG9rZW5pemVyKToKKyAgdHJ5OgorICAgIF9Db25zdW1lSW50NjQodG9rZW5pemVyKQorICAgIHJldHVybiBUcnVlCisgIGV4Y2VwdCBQYXJzZUVycm9yOgorICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBfQ29uc3VtZUludDY0KHRva2VuaXplcik6CisgICIiIkNvbnN1bWVzIGEgc2lnbmVkIDMyYml0IGludGVnZXIgbnVtYmVyIGZyb20gdG9rZW5pemVyLgorCisgIEFyZ3M6CisgICAgdG9rZW5pemVyOiBBIHRva2VuaXplciB1c2VkIHRvIHBhcnNlIHRoZSBudW1iZXIuCisKKyAgUmV0dXJuczoKKyAgICBUaGUgaW50ZWdlciBwYXJzZWQuCisKKyAgUmFpc2VzOgorICAgIFBhcnNlRXJyb3I6IElmIGEgc2lnbmVkIDMyYml0IGludGVnZXIgY291bGRuJ3QgYmUgY29uc3VtZWQuCisgICIiIgorICByZXR1cm4gX0NvbnN1bWVJbnRlZ2VyKHRva2VuaXplciwgaXNfc2lnbmVkPVRydWUsIGlzX2xvbmc9VHJ1ZSkKKworCitkZWYgX1RyeUNvbnN1bWVVaW50NjQodG9rZW5pemVyKToKKyAgdHJ5OgorICAgIF9Db25zdW1lVWludDY0KHRva2VuaXplcikKKyAgICByZXR1cm4gVHJ1ZQorICBleGNlcHQgUGFyc2VFcnJvcjoKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgX0NvbnN1bWVVaW50NjQodG9rZW5pemVyKToKKyAgIiIiQ29uc3VtZXMgYW4gdW5zaWduZWQgNjRiaXQgaW50ZWdlciBudW1iZXIgZnJvbSB0b2tlbml6ZXIuCisKKyAgQXJnczoKKyAgICB0b2tlbml6ZXI6IEEgdG9rZW5pemVyIHVzZWQgdG8gcGFyc2UgdGhlIG51bWJlci4KKworICBSZXR1cm5zOgorICAgIFRoZSBpbnRlZ2VyIHBhcnNlZC4KKworICBSYWlzZXM6CisgICAgUGFyc2VFcnJvcjogSWYgYW4gdW5zaWduZWQgNjRiaXQgaW50ZWdlciBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgIiIiCisgIHJldHVybiBfQ29uc3VtZUludGVnZXIodG9rZW5pemVyLCBpc19zaWduZWQ9RmFsc2UsIGlzX2xvbmc9VHJ1ZSkKKworCitkZWYgX0NvbnN1bWVJbnRlZ2VyKHRva2VuaXplciwgaXNfc2lnbmVkPUZhbHNlLCBpc19sb25nPUZhbHNlKToKKyAgIiIiQ29uc3VtZXMgYW4gaW50ZWdlciBudW1iZXIgZnJvbSB0b2tlbml6ZXIuCisKKyAgQXJnczoKKyAgICB0b2tlbml6ZXI6IEEgdG9rZW5pemVyIHVzZWQgdG8gcGFyc2UgdGhlIG51bWJlci4KKyAgICBpc19zaWduZWQ6IFRydWUgaWYgYSBzaWduZWQgaW50ZWdlciBtdXN0IGJlIHBhcnNlZC4KKyAgICBpc19sb25nOiBUcnVlIGlmIGEgbG9uZyBpbnRlZ2VyIG11c3QgYmUgcGFyc2VkLgorCisgIFJldHVybnM6CisgICAgVGhlIGludGVnZXIgcGFyc2VkLgorCisgIFJhaXNlczoKKyAgICBQYXJzZUVycm9yOiBJZiBhbiBpbnRlZ2VyIHdpdGggZ2l2ZW4gY2hhcmFjdGVyaXN0aWNzIGNvdWxkbid0IGJlIGNvbnN1bWVkLgorICAiIiIKKyAgdHJ5OgorICAgIHJlc3VsdCA9IFBhcnNlSW50ZWdlcih0b2tlbml6ZXIudG9rZW4sIGlzX3NpZ25lZD1pc19zaWduZWQsIGlzX2xvbmc9aXNfbG9uZykKKyAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKKyAgICByYWlzZSB0b2tlbml6ZXIuUGFyc2VFcnJvcihzdHIoZSkpCisgIHRva2VuaXplci5OZXh0VG9rZW4oKQorICByZXR1cm4gcmVzdWx0CisKKworZGVmIFBhcnNlSW50ZWdlcih0ZXh0LCBpc19zaWduZWQ9RmFsc2UsIGlzX2xvbmc9RmFsc2UpOgorICAiIiJQYXJzZXMgYW4gaW50ZWdlci4KKworICBBcmdzOgorICAgIHRleHQ6IFRoZSB0ZXh0IHRvIHBhcnNlLgorICAgIGlzX3NpZ25lZDogVHJ1ZSBpZiBhIHNpZ25lZCBpbnRlZ2VyIG11c3QgYmUgcGFyc2VkLgorICAgIGlzX2xvbmc6IFRydWUgaWYgYSBsb25nIGludGVnZXIgbXVzdCBiZSBwYXJzZWQuCisKKyAgUmV0dXJuczoKKyAgICBUaGUgaW50ZWdlciB2YWx1ZS4KKworICBSYWlzZXM6CisgICAgVmFsdWVFcnJvcjogVGhyb3duIElmZiB0aGUgdGV4dCBpcyBub3QgYSB2YWxpZCBpbnRlZ2VyLgorICAiIiIKKyAgIyBEbyB0aGUgYWN0dWFsIHBhcnNpbmcuIEV4Y2VwdGlvbiBoYW5kbGluZyBpcyBwcm9wYWdhdGVkIHRvIGNhbGxlci4KKyAgcmVzdWx0ID0gX1BhcnNlQWJzdHJhY3RJbnRlZ2VyKHRleHQpCisKKyAgIyBDaGVjayBpZiB0aGUgaW50ZWdlciBpcyBzYW5lLiBFeGNlcHRpb25zIGhhbmRsZWQgYnkgY2FsbGVycy4KKyAgY2hlY2tlciA9IF9JTlRFR0VSX0NIRUNLRVJTWzIgKiBpbnQoaXNfbG9uZykgKyBpbnQoaXNfc2lnbmVkKV0KKyAgY2hlY2tlci5DaGVja1ZhbHVlKHJlc3VsdCkKKyAgcmV0dXJuIHJlc3VsdAorCisKK2RlZiBfUGFyc2VBYnN0cmFjdEludGVnZXIodGV4dCk6CisgICIiIlBhcnNlcyBhbiBpbnRlZ2VyIHdpdGhvdXQgY2hlY2tpbmcgc2l6ZS9zaWduZWRuZXNzLgorCisgIEFyZ3M6CisgICAgdGV4dDogVGhlIHRleHQgdG8gcGFyc2UuCisKKyAgUmV0dXJuczoKKyAgICBUaGUgaW50ZWdlciB2YWx1ZS4KKworICBSYWlzZXM6CisgICAgVmFsdWVFcnJvcjogVGhyb3duIElmZiB0aGUgdGV4dCBpcyBub3QgYSB2YWxpZCBpbnRlZ2VyLgorICAiIiIKKyAgIyBEbyB0aGUgYWN0dWFsIHBhcnNpbmcuIEV4Y2VwdGlvbiBoYW5kbGluZyBpcyBwcm9wYWdhdGVkIHRvIGNhbGxlci4KKyAgb3JpZ190ZXh0ID0gdGV4dAorICBjX29jdGFsX21hdGNoID0gcmUubWF0Y2gocicoLT8pMChcZCspJCcsIHRleHQpCisgIGlmIGNfb2N0YWxfbWF0Y2g6CisgICAgIyBQeXRob24gMyBubyBsb25nZXIgc3VwcG9ydHMgMDc1NSBvY3RhbCBzeW50YXggd2l0aG91dCB0aGUgJ28nLCBzbworICAgICMgd2UgYWx3YXlzIHVzZSB0aGUgJzBvJyBwcmVmaXggZm9yIG11bHRpLWRpZ2l0IG51bWJlcnMgc3RhcnRpbmcgd2l0aCAwLgorICAgIHRleHQgPSBjX29jdGFsX21hdGNoLmdyb3VwKDEpICsgJzBvJyArIGNfb2N0YWxfbWF0Y2guZ3JvdXAoMikKKyAgdHJ5OgorICAgIHJldHVybiBpbnQodGV4dCwgMCkKKyAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgcmFpc2UgVmFsdWVFcnJvcignQ291bGRuXCd0IHBhcnNlIGludGVnZXI6ICVzJyAlIG9yaWdfdGV4dCkKKworCitkZWYgUGFyc2VGbG9hdCh0ZXh0KToKKyAgIiIiUGFyc2UgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuCisKKyAgQXJnczoKKyAgICB0ZXh0OiBUZXh0IHRvIHBhcnNlLgorCisgIFJldHVybnM6CisgICAgVGhlIG51bWJlciBwYXJzZWQuCisKKyAgUmFpc2VzOgorICAgIFZhbHVlRXJyb3I6IElmIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGNvdWxkbid0IGJlIHBhcnNlZC4KKyAgIiIiCisgIHRyeToKKyAgICAjIEFzc3VtZSBQeXRob24gY29tcGF0aWJsZSBzeW50YXguCisgICAgcmV0dXJuIGZsb2F0KHRleHQpCisgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICMgQ2hlY2sgYWx0ZXJuYXRpdmUgc3BlbGxpbmdzLgorICAgIGlmIF9GTE9BVF9JTkZJTklUWS5tYXRjaCh0ZXh0KToKKyAgICAgIGlmIHRleHRbMF0gPT0gJy0nOgorICAgICAgICByZXR1cm4gZmxvYXQoJy1pbmYnKQorICAgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGZsb2F0KCdpbmYnKQorICAgIGVsaWYgX0ZMT0FUX05BTi5tYXRjaCh0ZXh0KToKKyAgICAgIHJldHVybiBmbG9hdCgnbmFuJykKKyAgICBlbHNlOgorICAgICAgIyBhc3N1bWUgJzEuMGYnIGZvcm1hdAorICAgICAgdHJ5OgorICAgICAgICByZXR1cm4gZmxvYXQodGV4dC5yc3RyaXAoJ2YnKSkKKyAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdDb3VsZG5cJ3QgcGFyc2UgZmxvYXQ6ICVzJyAlIHRleHQpCisKKworZGVmIFBhcnNlQm9vbCh0ZXh0KToKKyAgIiIiUGFyc2UgYSBib29sZWFuIHZhbHVlLgorCisgIEFyZ3M6CisgICAgdGV4dDogVGV4dCB0byBwYXJzZS4KKworICBSZXR1cm5zOgorICAgIEJvb2xlYW4gdmFsdWVzIHBhcnNlZAorCisgIFJhaXNlczoKKyAgICBWYWx1ZUVycm9yOiBJZiB0ZXh0IGlzIG5vdCBhIHZhbGlkIGJvb2xlYW4uCisgICIiIgorICBpZiB0ZXh0IGluICgndHJ1ZScsICd0JywgJzEnLCAnVHJ1ZScpOgorICAgIHJldHVybiBUcnVlCisgIGVsaWYgdGV4dCBpbiAoJ2ZhbHNlJywgJ2YnLCAnMCcsICdGYWxzZScpOgorICAgIHJldHVybiBGYWxzZQorICBlbHNlOgorICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0V4cGVjdGVkICJ0cnVlIiBvciAiZmFsc2UiLicpCisKKworZGVmIFBhcnNlRW51bShmaWVsZCwgdmFsdWUpOgorICAiIiJQYXJzZSBhbiBlbnVtIHZhbHVlLgorCisgIFRoZSB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkIGJ5IGEgbnVtYmVyICh0aGUgZW51bSB2YWx1ZSksIG9yIGJ5CisgIGEgc3RyaW5nIGxpdGVyYWwgKHRoZSBlbnVtIG5hbWUpLgorCisgIEFyZ3M6CisgICAgZmllbGQ6IEVudW0gZmllbGQgZGVzY3JpcHRvci4KKyAgICB2YWx1ZTogU3RyaW5nIHZhbHVlLgorCisgIFJldHVybnM6CisgICAgRW51bSB2YWx1ZSBudW1iZXIuCisKKyAgUmFpc2VzOgorICAgIFZhbHVlRXJyb3I6IElmIHRoZSBlbnVtIHZhbHVlIGNvdWxkIG5vdCBiZSBwYXJzZWQuCisgICIiIgorICBlbnVtX2Rlc2NyaXB0b3IgPSBmaWVsZC5lbnVtX3R5cGUKKyAgdHJ5OgorICAgIG51bWJlciA9IGludCh2YWx1ZSwgMCkKKyAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgIyBJZGVudGlmaWVyLgorICAgIGVudW1fdmFsdWUgPSBlbnVtX2Rlc2NyaXB0b3IudmFsdWVzX2J5X25hbWUuZ2V0KHZhbHVlLCBOb25lKQorICAgIGlmIGVudW1fdmFsdWUgaXMgTm9uZToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0VudW0gdHlwZSAiJXMiIGhhcyBubyB2YWx1ZSBuYW1lZCAlcy4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgKGVudW1fZGVzY3JpcHRvci5mdWxsX25hbWUsIHZhbHVlKSkKKyAgZWxzZToKKyAgICAjIE51bWVyaWMgdmFsdWUuCisgICAgaWYgaGFzYXR0cihmaWVsZC5maWxlLCAnc3ludGF4Jyk6CisgICAgICAjIEF0dHJpYnV0ZSBpcyBjaGVja2VkIGZvciBjb21wYXRpYmlsaXR5LgorICAgICAgaWYgZmllbGQuZmlsZS5zeW50YXggPT0gJ3Byb3RvMyc6CisgICAgICAgICMgUHJvdG8zIGFjY2VwdCBudW1lcmljIHVua25vd24gZW51bXMuCisgICAgICAgIHJldHVybiBudW1iZXIKKyAgICBlbnVtX3ZhbHVlID0gZW51bV9kZXNjcmlwdG9yLnZhbHVlc19ieV9udW1iZXIuZ2V0KG51bWJlciwgTm9uZSkKKyAgICBpZiBlbnVtX3ZhbHVlIGlzIE5vbmU6CisgICAgICByYWlzZSBWYWx1ZUVycm9yKCdFbnVtIHR5cGUgIiVzIiBoYXMgbm8gdmFsdWUgd2l0aCBudW1iZXIgJWQuJyAlCisgICAgICAgICAgICAgICAgICAgICAgIChlbnVtX2Rlc2NyaXB0b3IuZnVsbF9uYW1lLCBudW1iZXIpKQorICByZXR1cm4gZW51bV92YWx1ZS5udW1iZXIKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wX3BiMi5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wX3BiMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmIyMmQyCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXBfcGIyLnB5CkBAIC0wLDAgKzEsNzggQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisjIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bworIiIiR2VuZXJhdGVkIHByb3RvY29sIGJ1ZmZlciBjb2RlLiIiIgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IgYXMgX2Rlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlIGFzIF9tZXNzYWdlCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgcmVmbGVjdGlvbiBhcyBfcmVmbGVjdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHN5bWJvbF9kYXRhYmFzZSBhcyBfc3ltYm9sX2RhdGFiYXNlCisjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQorCitfc3ltX2RiID0gX3N5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkKKworCisKKworREVTQ1JJUFRPUiA9IF9kZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKAorICBuYW1lPSdnb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvJywKKyAgcGFja2FnZT0nZ29vZ2xlLnByb3RvYnVmJywKKyAgc3ludGF4PSdwcm90bzMnLAorICBzZXJpYWxpemVkX29wdGlvbnM9YidcblwwMjNjb20uZ29vZ2xlLnByb3RvYnVmQlwwMTZUaW1lc3RhbXBQcm90b1BcMDAxWjJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi90aW1lc3RhbXBwYlwzNzBcMDAxXDAwMVwyNDJcMDAyXDAwM0dQQlwyNTJcMDAyXDAzNkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcycsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIHNlcmlhbGl6ZWRfcGI9Yidcblx4MWZnb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvXHgxMlx4MGZnb29nbGUucHJvdG9idWZcIitcblx0VGltZXN0YW1wXHgxMlx4MGZcblx4MDdzZWNvbmRzXHgxOFx4MDEgXHgwMShceDAzXHgxMlxyXG5ceDA1bmFub3NceDE4XHgwMiBceDAxKFx4MDVceDQyXHg4NVx4MDFcblx4MTNceDYzb20uZ29vZ2xlLnByb3RvYnVmQlx4MGVUaW1lc3RhbXBQcm90b1BceDAxWjJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi90aW1lc3RhbXBwYlx4ZjhceDAxXHgwMVx4YTJceDAyXHgwM0dQQlx4YWFceDAyXHgxZUdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2JceDA2cHJvdG8zJworKQorCisKKworCitfVElNRVNUQU1QID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nVGltZXN0YW1wJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVGltZXN0YW1wJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdzZWNvbmRzJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVGltZXN0YW1wLnNlY29uZHMnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9MywgY3BwX3R5cGU9MiwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSduYW5vcycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcC5uYW5vcycsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8zJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD01MiwKKyAgc2VyaWFsaXplZF9lbmQ9OTUsCispCisKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydUaW1lc3RhbXAnXSA9IF9USU1FU1RBTVAKK19zeW1fZGIuUmVnaXN0ZXJGaWxlRGVzY3JpcHRvcihERVNDUklQVE9SKQorCitUaW1lc3RhbXAgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdUaW1lc3RhbXAnLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICdERVNDUklQVE9SJyA6IF9USU1FU1RBTVAsCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYudGltZXN0YW1wX3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCkKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKFRpbWVzdGFtcCkKKworCitERVNDUklQVE9SLl9vcHRpb25zID0gTm9uZQorIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobW9kdWxlX3Njb3BlKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi90eXBlX3BiMi5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdHlwZV9wYjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjMWExZQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdHlwZV9wYjIucHkKQEAgLTAsMCArMSw1NzMgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisjIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8KKyIiIkdlbmVyYXRlZCBwcm90b2NvbCBidWZmZXIgY29kZS4iIiIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbnVtX3R5cGVfd3JhcHBlcgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IgYXMgX2Rlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlIGFzIF9tZXNzYWdlCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgcmVmbGVjdGlvbiBhcyBfcmVmbGVjdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHN5bWJvbF9kYXRhYmFzZSBhcyBfc3ltYm9sX2RhdGFiYXNlCisjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQorCitfc3ltX2RiID0gX3N5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkKKworCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgYW55X3BiMiBhcyBnb29nbGVfZG90X3Byb3RvYnVmX2RvdF9hbnlfX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHNvdXJjZV9jb250ZXh0X3BiMiBhcyBnb29nbGVfZG90X3Byb3RvYnVmX2RvdF9zb3VyY2VfX2NvbnRleHRfX3BiMgorCisKK0RFU0NSSVBUT1IgPSBfZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcigKKyAgbmFtZT0nZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8nLAorICBwYWNrYWdlPSdnb29nbGUucHJvdG9idWYnLAorICBzeW50YXg9J3Byb3RvMycsCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1iJ1xuXDAyM2NvbS5nb29nbGUucHJvdG9idWZCXHRUeXBlUHJvdG9QXDAwMVotZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vdHlwZXBiXDM3MFwwMDFcMDAxXDI0MlwwMDJcMDAzR1BCXDI1MlwwMDJcMDM2R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzJywKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgc2VyaWFsaXplZF9wYj1iJ1xuXHgxYWdvb2dsZS9wcm90b2J1Zi90eXBlLnByb3RvXHgxMlx4MGZnb29nbGUucHJvdG9idWZceDFhXHgxOWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG9ceDFhJGdvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90b1wiXHhkN1x4MDFcblx4MDRUeXBlXHgxMlx4MGNcblx4MDRuYW1lXHgxOFx4MDEgXHgwMShcdFx4MTImXG5ceDA2XHg2NmllbGRzXHgxOFx4MDIgXHgwMyhceDBiXHgzMlx4MTYuZ29vZ2xlLnByb3RvYnVmLkZpZWxkXHgxMlx4MGVcblx4MDZvbmVvZnNceDE4XHgwMyBceDAzKFx0XHgxMihcblx4MDdvcHRpb25zXHgxOFx4MDQgXHgwMyhceDBiXHgzMlx4MTcuZ29vZ2xlLnByb3RvYnVmLk9wdGlvblx4MTJceDM2XG5ceDBlc291cmNlX2NvbnRleHRceDE4XHgwNSBceDAxKFx4MGJceDMyXHgxZS5nb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dFx4MTJcJ1xuXHgwNnN5bnRheFx4MThceDA2IFx4MDEoXHgwZVx4MzJceDE3Lmdvb2dsZS5wcm90b2J1Zi5TeW50YXhcIlx4ZDVceDA1XG5ceDA1XHg0NmllbGRceDEyKVxuXHgwNGtpbmRceDE4XHgwMSBceDAxKFx4MGVceDMyXHgxYi5nb29nbGUucHJvdG9idWYuRmllbGQuS2luZFx4MTJceDM3XG5ceDBiXHg2M1x4NjFyZGluYWxpdHlceDE4XHgwMiBceDAxKFx4MGVceDMyXCIuZ29vZ2xlLnByb3RvYnVmLkZpZWxkLkNhcmRpbmFsaXR5XHgxMlx4MGVcblx4MDZudW1iZXJceDE4XHgwMyBceDAxKFx4MDVceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwNCBceDAxKFx0XHgxMlx4MTBcblx4MDh0eXBlX3VybFx4MThceDA2IFx4MDEoXHRceDEyXHgxM1xuXHgwYm9uZW9mX2luZGV4XHgxOFx4MDcgXHgwMShceDA1XHgxMlx4MGVcblx4MDZwYWNrZWRceDE4XHgwOCBceDAxKFx4MDhceDEyKFxuXHgwN29wdGlvbnNceDE4XHQgXHgwMyhceDBiXHgzMlx4MTcuZ29vZ2xlLnByb3RvYnVmLk9wdGlvblx4MTJceDExXG5cdGpzb25fbmFtZVx4MThcbiBceDAxKFx0XHgxMlx4MTVcblxyZGVmYXVsdF92YWx1ZVx4MThceDBiIFx4MDEoXHRcIlx4YzhceDAyXG5ceDA0S2luZFx4MTJceDEwXG5ceDBjVFlQRV9VTktOT1dOXHgxMFx4MDBceDEyXHgwZlxuXHgwYlRZUEVfRE9VQkxFXHgxMFx4MDFceDEyXHgwZVxuXG5UWVBFX0ZMT0FUXHgxMFx4MDJceDEyXHgwZVxuXG5UWVBFX0lOVDY0XHgxMFx4MDNceDEyXHgwZlxuXHgwYlRZUEVfVUlOVDY0XHgxMFx4MDRceDEyXHgwZVxuXG5UWVBFX0lOVDMyXHgxMFx4MDVceDEyXHgxMFxuXHgwY1RZUEVfRklYRUQ2NFx4MTBceDA2XHgxMlx4MTBcblx4MGNUWVBFX0ZJWEVEMzJceDEwXHgwN1x4MTJcclxuXHRUWVBFX0JPT0xceDEwXHgwOFx4MTJceDBmXG5ceDBiVFlQRV9TVFJJTkdceDEwXHRceDEyXHgwZVxuXG5UWVBFX0dST1VQXHgxMFxuXHgxMlx4MTBcblx4MGNUWVBFX01FU1NBR0VceDEwXHgwYlx4MTJceDBlXG5cblRZUEVfQllURVNceDEwXHgwY1x4MTJceDBmXG5ceDBiVFlQRV9VSU5UMzJceDEwXHJceDEyXHJcblx0VFlQRV9FTlVNXHgxMFx4MGVceDEyXHgxMVxuXHJUWVBFX1NGSVhFRDMyXHgxMFx4MGZceDEyXHgxMVxuXHJUWVBFX1NGSVhFRDY0XHgxMFx4MTBceDEyXHgwZlxuXHgwYlRZUEVfU0lOVDMyXHgxMFx4MTFceDEyXHgwZlxuXHgwYlRZUEVfU0lOVDY0XHgxMFx4MTJcInRcblx4MGJceDQzXHg2MXJkaW5hbGl0eVx4MTJceDE3XG5ceDEzXHg0M1x4NDFSRElOQUxJVFlfVU5LTk9XTlx4MTBceDAwXHgxMlx4MThcblx4MTRceDQzXHg0MVJESU5BTElUWV9PUFRJT05BTFx4MTBceDAxXHgxMlx4MThcblx4MTRceDQzXHg0MVJESU5BTElUWV9SRVFVSVJFRFx4MTBceDAyXHgxMlx4MThcblx4MTRceDQzXHg0MVJESU5BTElUWV9SRVBFQVRFRFx4MTBceDAzXCJceGNlXHgwMVxuXHgwNFx4NDVudW1ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMi1cblx0ZW51bXZhbHVlXHgxOFx4MDIgXHgwMyhceDBiXHgzMlx4MWEuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZVx4MTIoXG5ceDA3b3B0aW9uc1x4MThceDAzIFx4MDMoXHgwYlx4MzJceDE3Lmdvb2dsZS5wcm90b2J1Zi5PcHRpb25ceDEyXHgzNlxuXHgwZXNvdXJjZV9jb250ZXh0XHgxOFx4MDQgXHgwMShceDBiXHgzMlx4MWUuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHRceDEyXCdcblx4MDZzeW50YXhceDE4XHgwNSBceDAxKFx4MGVceDMyXHgxNy5nb29nbGUucHJvdG9idWYuU3ludGF4XCJTXG5cdEVudW1WYWx1ZVx4MTJceDBjXG5ceDA0bmFtZVx4MThceDAxIFx4MDEoXHRceDEyXHgwZVxuXHgwNm51bWJlclx4MThceDAyIFx4MDEoXHgwNVx4MTIoXG5ceDA3b3B0aW9uc1x4MThceDAzIFx4MDMoXHgwYlx4MzJceDE3Lmdvb2dsZS5wcm90b2J1Zi5PcHRpb25cIjtcblx4MDZPcHRpb25ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMiNcblx4MDV2YWx1ZVx4MThceDAyIFx4MDEoXHgwYlx4MzJceDE0Lmdvb2dsZS5wcm90b2J1Zi5BbnkqLlxuXHgwNlN5bnRheFx4MTJceDExXG5cclNZTlRBWF9QUk9UTzJceDEwXHgwMFx4MTJceDExXG5cclNZTlRBWF9QUk9UTzNceDEwXHgwMVx4NDJ7XG5ceDEzXHg2M29tLmdvb2dsZS5wcm90b2J1ZkJcdFR5cGVQcm90b1BceDAxWi1nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi90eXBlcGJceGY4XHgwMVx4MDFceGEyXHgwMlx4MDNHUEJceGFhXHgwMlx4MWVHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiXHgwNnByb3RvMycKKyAgLAorICBkZXBlbmRlbmNpZXM9W2dvb2dsZV9kb3RfcHJvdG9idWZfZG90X2FueV9fcGIyLkRFU0NSSVBUT1IsZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3Rfc291cmNlX19jb250ZXh0X19wYjIuREVTQ1JJUFRPUixdKQorCitfU1lOVEFYID0gX2Rlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IoCisgIG5hbWU9J1N5bnRheCcsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlN5bnRheCcsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgdmFsdWVzPVsKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nU1lOVEFYX1BST1RPMicsIGluZGV4PTAsIG51bWJlcj0wLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nU1lOVEFYX1BST1RPMycsIGluZGV4PTEsIG51bWJlcj0xLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBzZXJpYWxpemVkX3N0YXJ0PTE0MTMsCisgIHNlcmlhbGl6ZWRfZW5kPTE0NTksCispCitfc3ltX2RiLlJlZ2lzdGVyRW51bURlc2NyaXB0b3IoX1NZTlRBWCkKKworU3ludGF4ID0gZW51bV90eXBlX3dyYXBwZXIuRW51bVR5cGVXcmFwcGVyKF9TWU5UQVgpCitTWU5UQVhfUFJPVE8yID0gMAorU1lOVEFYX1BST1RPMyA9IDEKKworCitfRklFTERfS0lORCA9IF9kZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAorICBuYW1lPSdLaW5kJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGQuS2luZCcsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgdmFsdWVzPVsKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9VTktOT1dOJywgaW5kZXg9MCwgbnVtYmVyPTAsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX0RPVUJMRScsIGluZGV4PTEsIG51bWJlcj0xLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9GTE9BVCcsIGluZGV4PTIsIG51bWJlcj0yLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9JTlQ2NCcsIGluZGV4PTMsIG51bWJlcj0zLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9VSU5UNjQnLCBpbmRleD00LCBudW1iZXI9NCwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfSU5UMzInLCBpbmRleD01LCBudW1iZXI9NSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfRklYRUQ2NCcsIGluZGV4PTYsIG51bWJlcj02LAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9GSVhFRDMyJywgaW5kZXg9NywgbnVtYmVyPTcsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX0JPT0wnLCBpbmRleD04LCBudW1iZXI9OCwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfU1RSSU5HJywgaW5kZXg9OSwgbnVtYmVyPTksCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX0dST1VQJywgaW5kZXg9MTAsIG51bWJlcj0xMCwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfTUVTU0FHRScsIGluZGV4PTExLCBudW1iZXI9MTEsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX0JZVEVTJywgaW5kZXg9MTIsIG51bWJlcj0xMiwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfVUlOVDMyJywgaW5kZXg9MTMsIG51bWJlcj0xMywKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfRU5VTScsIGluZGV4PTE0LCBudW1iZXI9MTQsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX1NGSVhFRDMyJywgaW5kZXg9MTUsIG51bWJlcj0xNSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfU0ZJWEVENjQnLCBpbmRleD0xNiwgbnVtYmVyPTE2LAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9TSU5UMzInLCBpbmRleD0xNywgbnVtYmVyPTE3LAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9TSU5UNjQnLCBpbmRleD0xOCwgbnVtYmVyPTE4LAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBzZXJpYWxpemVkX3N0YXJ0PTYxMCwKKyAgc2VyaWFsaXplZF9lbmQ9OTM4LAorKQorX3N5bV9kYi5SZWdpc3RlckVudW1EZXNjcmlwdG9yKF9GSUVMRF9LSU5EKQorCitfRklFTERfQ0FSRElOQUxJVFkgPSBfZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcigKKyAgbmFtZT0nQ2FyZGluYWxpdHknLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZC5DYXJkaW5hbGl0eScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgdmFsdWVzPVsKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nQ0FSRElOQUxJVFlfVU5LTk9XTicsIGluZGV4PTAsIG51bWJlcj0wLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nQ0FSRElOQUxJVFlfT1BUSU9OQUwnLCBpbmRleD0xLCBudW1iZXI9MSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lLAorICAgICAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J0NBUkRJTkFMSVRZX1JFUVVJUkVEJywgaW5kZXg9MiwgbnVtYmVyPTIsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSwKKyAgICAgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdDQVJESU5BTElUWV9SRVBFQVRFRCcsIGluZGV4PTMsIG51bWJlcj0zLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUsCisgICAgICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBzZXJpYWxpemVkX3N0YXJ0PTk0MCwKKyAgc2VyaWFsaXplZF9lbmQ9MTA1NiwKKykKK19zeW1fZGIuUmVnaXN0ZXJFbnVtRGVzY3JpcHRvcihfRklFTERfQ0FSRElOQUxJVFkpCisKKworX1RZUEUgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdUeXBlJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVHlwZScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlR5cGUubmFtZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLmRlY29kZSgndXRmLTgnKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2ZpZWxkcycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlR5cGUuZmllbGRzJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nb25lb2ZzJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVHlwZS5vbmVvZnMnLCBpbmRleD0yLAorICAgICAgbnVtYmVyPTMsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nb3B0aW9ucycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlR5cGUub3B0aW9ucycsIGluZGV4PTMsCisgICAgICBudW1iZXI9NCwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3NvdXJjZV9jb250ZXh0JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVHlwZS5zb3VyY2VfY29udGV4dCcsIGluZGV4PTQsCisgICAgICBudW1iZXI9NSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nc3ludGF4JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVHlwZS5zeW50YXgnLCBpbmRleD01LAorICAgICAgbnVtYmVyPTYsIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzMnLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTExMywKKyAgc2VyaWFsaXplZF9lbmQ9MzI4LAorKQorCisKK19GSUVMRCA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0ZpZWxkJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGQnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2tpbmQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZC5raW5kJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTE0LCBjcHBfdHlwZT04LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2NhcmRpbmFsaXR5JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGQuY2FyZGluYWxpdHknLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbnVtYmVyJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGQubnVtYmVyJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj0zLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkLm5hbWUnLCBpbmRleD0zLAorICAgICAgbnVtYmVyPTQsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd0eXBlX3VybCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkLnR5cGVfdXJsJywgaW5kZXg9NCwKKyAgICAgIG51bWJlcj02LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nb25lb2ZfaW5kZXgnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZC5vbmVvZl9pbmRleCcsIGluZGV4PTUsCisgICAgICBudW1iZXI9NywgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3BhY2tlZCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkLnBhY2tlZCcsIGluZGV4PTYsCisgICAgICBudW1iZXI9OCwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdvcHRpb25zJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGQub3B0aW9ucycsIGluZGV4PTcsCisgICAgICBudW1iZXI9OSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2pzb25fbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkLmpzb25fbmFtZScsIGluZGV4PTgsCisgICAgICBudW1iZXI9MTAsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdkZWZhdWx0X3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGQuZGVmYXVsdF92YWx1ZScsIGluZGV4PTksCisgICAgICBudW1iZXI9MTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgICAgX0ZJRUxEX0tJTkQsCisgICAgX0ZJRUxEX0NBUkRJTkFMSVRZLAorICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzMnLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTMzMSwKKyAgc2VyaWFsaXplZF9lbmQ9MTA1NiwKKykKKworCitfRU5VTSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0VudW0nLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSduYW1lJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bS5uYW1lJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZW51bXZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bS5lbnVtdmFsdWUnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdvcHRpb25zJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bS5vcHRpb25zJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj0zLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nc291cmNlX2NvbnRleHQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtLnNvdXJjZV9jb250ZXh0JywgaW5kZXg9MywKKyAgICAgIG51bWJlcj00LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdzeW50YXgnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtLnN5bnRheCcsIGluZGV4PTQsCisgICAgICBudW1iZXI9NSwgdHlwZT0xNCwgY3BwX3R5cGU9OCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMycsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MTA1OSwKKyAgc2VyaWFsaXplZF9lbmQ9MTI2NSwKKykKKworCitfRU5VTVZBTFVFID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nRW51bVZhbHVlJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bVZhbHVlJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSduYW1lJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bVZhbHVlLm5hbWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdudW1iZXInLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWUubnVtYmVyJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nb3B0aW9ucycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZS5vcHRpb25zJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj0zLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzMnLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTEyNjcsCisgIHNlcmlhbGl6ZWRfZW5kPTEzNTAsCispCisKKworX09QVElPTiA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J09wdGlvbicsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk9wdGlvbicsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk9wdGlvbi5uYW1lJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1iIiIuZGVjb2RlKCd1dGYtOCcpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5PcHRpb24udmFsdWUnLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8zJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0xMzUyLAorICBzZXJpYWxpemVkX2VuZD0xNDExLAorKQorCitfVFlQRS5maWVsZHNfYnlfbmFtZVsnZmllbGRzJ10ubWVzc2FnZV90eXBlID0gX0ZJRUxECitfVFlQRS5maWVsZHNfYnlfbmFtZVsnb3B0aW9ucyddLm1lc3NhZ2VfdHlwZSA9IF9PUFRJT04KK19UWVBFLmZpZWxkc19ieV9uYW1lWydzb3VyY2VfY29udGV4dCddLm1lc3NhZ2VfdHlwZSA9IGdvb2dsZV9kb3RfcHJvdG9idWZfZG90X3NvdXJjZV9fY29udGV4dF9fcGIyLl9TT1VSQ0VDT05URVhUCitfVFlQRS5maWVsZHNfYnlfbmFtZVsnc3ludGF4J10uZW51bV90eXBlID0gX1NZTlRBWAorX0ZJRUxELmZpZWxkc19ieV9uYW1lWydraW5kJ10uZW51bV90eXBlID0gX0ZJRUxEX0tJTkQKK19GSUVMRC5maWVsZHNfYnlfbmFtZVsnY2FyZGluYWxpdHknXS5lbnVtX3R5cGUgPSBfRklFTERfQ0FSRElOQUxJVFkKK19GSUVMRC5maWVsZHNfYnlfbmFtZVsnb3B0aW9ucyddLm1lc3NhZ2VfdHlwZSA9IF9PUFRJT04KK19GSUVMRF9LSU5ELmNvbnRhaW5pbmdfdHlwZSA9IF9GSUVMRAorX0ZJRUxEX0NBUkRJTkFMSVRZLmNvbnRhaW5pbmdfdHlwZSA9IF9GSUVMRAorX0VOVU0uZmllbGRzX2J5X25hbWVbJ2VudW12YWx1ZSddLm1lc3NhZ2VfdHlwZSA9IF9FTlVNVkFMVUUKK19FTlVNLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX09QVElPTgorX0VOVU0uZmllbGRzX2J5X25hbWVbJ3NvdXJjZV9jb250ZXh0J10ubWVzc2FnZV90eXBlID0gZ29vZ2xlX2RvdF9wcm90b2J1Zl9kb3Rfc291cmNlX19jb250ZXh0X19wYjIuX1NPVVJDRUNPTlRFWFQKK19FTlVNLmZpZWxkc19ieV9uYW1lWydzeW50YXgnXS5lbnVtX3R5cGUgPSBfU1lOVEFYCitfRU5VTVZBTFVFLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX09QVElPTgorX09QVElPTi5maWVsZHNfYnlfbmFtZVsndmFsdWUnXS5tZXNzYWdlX3R5cGUgPSBnb29nbGVfZG90X3Byb3RvYnVmX2RvdF9hbnlfX3BiMi5fQU5ZCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnVHlwZSddID0gX1RZUEUKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydGaWVsZCddID0gX0ZJRUxECitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnRW51bSddID0gX0VOVU0KK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydFbnVtVmFsdWUnXSA9IF9FTlVNVkFMVUUKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydPcHRpb24nXSA9IF9PUFRJT04KK0RFU0NSSVBUT1IuZW51bV90eXBlc19ieV9uYW1lWydTeW50YXgnXSA9IF9TWU5UQVgKK19zeW1fZGIuUmVnaXN0ZXJGaWxlRGVzY3JpcHRvcihERVNDUklQVE9SKQorCitUeXBlID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnVHlwZScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX1RZUEUsCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYudHlwZV9wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5UeXBlKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoVHlwZSkKKworRmllbGQgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdGaWVsZCcsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX0ZJRUxELAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLnR5cGVfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmllbGQpCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShGaWVsZCkKKworRW51bSA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0VudW0nLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICdERVNDUklQVE9SJyA6IF9FTlVNLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLnR5cGVfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRW51bSkKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKEVudW0pCisKK0VudW1WYWx1ZSA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0VudW1WYWx1ZScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX0VOVU1WQUxVRSwKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi50eXBlX3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZSkKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKEVudW1WYWx1ZSkKKworT3B0aW9uID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnT3B0aW9uJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfT1BUSU9OLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLnR5cGVfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuT3B0aW9uKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoT3B0aW9uKQorCisKK0RFU0NSSVBUT1IuX29wdGlvbnMgPSBOb25lCisjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtb2R1bGVfc2NvcGUpCmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRzLnB5IGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmQ4Mjg2Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkcy5weQpAQCAtMCwwICsxLDEyMCBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJDb250YWlucyBVbmtub3duIEZpZWxkcyBBUElzLgorCitTaW1wbGUgdXNhZ2UgZXhhbXBsZToKKyAgdW5rbm93bl9maWVsZF9zZXQgPSBVbmtub3duRmllbGRTZXQobWVzc2FnZSkKKyAgZm9yIHVua25vd25fZmllbGQgaW4gdW5rbm93bl9maWVsZF9zZXQ6CisgICAgd2lyZV90eXBlID0gdW5rbm93bl9maWVsZC53aXJlX3R5cGUKKyAgICBmaWVsZF9udW1iZXIgPSB1bmtub3duX2ZpZWxkLmZpZWxkX251bWJlcgorICAgIGRhdGEgPSB1bmtub3duX2ZpZWxkLmRhdGEKKyIiIgorCisKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBhcGlfaW1wbGVtZW50YXRpb24KKworaWYgYXBpX2ltcGxlbWVudGF0aW9uLl9jX21vZHVsZSBpcyBub3QgTm9uZTogICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgVW5rbm93bkZpZWxkU2V0ID0gYXBpX2ltcGxlbWVudGF0aW9uLl9jX21vZHVsZS5Vbmtub3duRmllbGRTZXQgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKK2Vsc2U6CisgIGZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBkZWNvZGVyICAjIHB5bGludDogZGlzYWJsZT1nLWltcG9ydC1ub3QtYXQtdG9wCisgIGZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB3aXJlX2Zvcm1hdCAgIyBweWxpbnQ6IGRpc2FibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAorCisgIGNsYXNzIFVua25vd25GaWVsZDoKKyAgICAiIiJBIHBhcnNlZCB1bmtub3duIGZpZWxkLiIiIgorCisgICAgIyBEaXNhbGxvd3MgYXNzaWdubWVudCB0byBvdGhlciBhdHRyaWJ1dGVzLgorICAgIF9fc2xvdHNfXyA9IFsnX2ZpZWxkX251bWJlcicsICdfd2lyZV90eXBlJywgJ19kYXRhJ10KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSwgZGF0YSk6CisgICAgICBzZWxmLl9maWVsZF9udW1iZXIgPSBmaWVsZF9udW1iZXIKKyAgICAgIHNlbGYuX3dpcmVfdHlwZSA9IHdpcmVfdHlwZQorICAgICAgc2VsZi5fZGF0YSA9IGRhdGEKKyAgICAgIHJldHVybgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGZpZWxkX251bWJlcihzZWxmKToKKyAgICAgIHJldHVybiBzZWxmLl9maWVsZF9udW1iZXIKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB3aXJlX3R5cGUoc2VsZik6CisgICAgICByZXR1cm4gc2VsZi5fd2lyZV90eXBlCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZGF0YShzZWxmKToKKyAgICAgIHJldHVybiBzZWxmLl9kYXRhCisKKyAgY2xhc3MgVW5rbm93bkZpZWxkU2V0OgorICAgICIiIlVua25vd25GaWVsZCBjb250YWluZXIuIiIiCisKKyAgICAjIERpc2FsbG93cyBhc3NpZ25tZW50IHRvIG90aGVyIGF0dHJpYnV0ZXMuCisgICAgX19zbG90c19fID0gWydfdmFsdWVzJ10KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2cpOgorCisgICAgICBkZWYgSW50ZXJuYWxBZGQoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUsIGRhdGEpOgorICAgICAgICB1bmtub3duX2ZpZWxkID0gVW5rbm93bkZpZWxkKGZpZWxkX251bWJlciwgd2lyZV90eXBlLCBkYXRhKQorICAgICAgICBzZWxmLl92YWx1ZXMuYXBwZW5kKHVua25vd25fZmllbGQpCisKKyAgICAgIHNlbGYuX3ZhbHVlcyA9IFtdCisgICAgICBtc2dfZGVzID0gbXNnLkRFU0NSSVBUT1IKKyAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgIHVua25vd25fZmllbGRzID0gbXNnLl91bmtub3duX2ZpZWxkcworICAgICAgaWYgKG1zZ19kZXMuaGFzX29wdGlvbnMgYW5kCisgICAgICAgICAgbXNnX2Rlcy5HZXRPcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQpOgorICAgICAgICBsb2NhbF9kZWNvZGVyID0gZGVjb2Rlci5Vbmtub3duTWVzc2FnZVNldEl0ZW1EZWNvZGVyKCkKKyAgICAgICAgZm9yIF8sIGJ1ZmZlciBpbiB1bmtub3duX2ZpZWxkczoKKyAgICAgICAgICAoZmllbGRfbnVtYmVyLCBkYXRhKSA9IGxvY2FsX2RlY29kZXIobWVtb3J5dmlldyhidWZmZXIpKQorICAgICAgICAgIEludGVybmFsQWRkKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgZGF0YSkKKyAgICAgIGVsc2U6CisgICAgICAgIGZvciB0YWdfYnl0ZXMsIGJ1ZmZlciBpbiB1bmtub3duX2ZpZWxkczoKKyAgICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgICAgKHRhZywgXykgPSBkZWNvZGVyLl9EZWNvZGVWYXJpbnQodGFnX2J5dGVzLCAwKQorICAgICAgICAgIGZpZWxkX251bWJlciwgd2lyZV90eXBlID0gd2lyZV9mb3JtYXQuVW5wYWNrVGFnKHRhZykKKyAgICAgICAgICBpZiBmaWVsZF9udW1iZXIgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignRmllbGQgbnVtYmVyIDAgaXMgaWxsZWdhbC4nKQorICAgICAgICAgIChkYXRhLCBfKSA9IGRlY29kZXIuX0RlY29kZVVua25vd25GaWVsZCgKKyAgICAgICAgICAgICAgbWVtb3J5dmlldyhidWZmZXIpLCAwLCB3aXJlX3R5cGUpCisgICAgICAgICAgSW50ZXJuYWxBZGQoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUsIGRhdGEpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgc2l6ZSA9IGxlbihzZWxmLl92YWx1ZXMpCisgICAgICBpZiBpbmRleCA8IDA6CisgICAgICAgIGluZGV4ICs9IHNpemUKKyAgICAgIGlmIGluZGV4IDwgMCBvciBpbmRleCA+PSBzaXplOgorICAgICAgICByYWlzZSBJbmRleEVycm9yKCdpbmRleCAlZCBvdXQgb2YgcmFuZ2UnLmluZGV4KQorCisgICAgICByZXR1cm4gc2VsZi5fdmFsdWVzW2luZGV4XQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICByZXR1cm4gbGVuKHNlbGYuX3ZhbHVlcykKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgIHJldHVybiBpdGVyKHNlbGYuX3ZhbHVlcykKZGlmZiAtLWdpdCBhL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdXRpbC9fX2luaXRfXy5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdXRpbC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi91dGlsL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzX3BiMi5weSBiL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnNfcGIyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNWUyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzX3BiMi5weQpAQCAtMCwwICsxLDM5MSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMgR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKyMgc291cmNlOiBnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8KKyIiIkdlbmVyYXRlZCBwcm90b2NvbCBidWZmZXIgY29kZS4iIiIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yIGFzIF9kZXNjcmlwdG9yCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZSBhcyBfbWVzc2FnZQorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHJlZmxlY3Rpb24gYXMgX3JlZmxlY3Rpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzeW1ib2xfZGF0YWJhc2UgYXMgX3N5bWJvbF9kYXRhYmFzZQorIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW1wb3J0cykKKworX3N5bV9kYiA9IF9zeW1ib2xfZGF0YWJhc2UuRGVmYXVsdCgpCisKKworCisKK0RFU0NSSVBUT1IgPSBfZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcigKKyAgbmFtZT0nZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvJywKKyAgcGFja2FnZT0nZ29vZ2xlLnByb3RvYnVmJywKKyAgc3ludGF4PSdwcm90bzMnLAorICBzZXJpYWxpemVkX29wdGlvbnM9YidcblwwMjNjb20uZ29vZ2xlLnByb3RvYnVmQlxyV3JhcHBlcnNQcm90b1BcMDAxWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi93cmFwcGVyc3BiXDM3MFwwMDFcMDAxXDI0MlwwMDJcMDAzR1BCXDI1MlwwMDJcMDM2R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzJywKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgc2VyaWFsaXplZF9wYj1iJ1xuXHgxZWdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90b1x4MTJceDBmZ29vZ2xlLnByb3RvYnVmXCJceDFjXG5ceDBiXHg0NG91YmxlVmFsdWVceDEyXHJcblx4MDV2YWx1ZVx4MThceDAxIFx4MDEoXHgwMVwiXHgxYlxuXG5GbG9hdFZhbHVlXHgxMlxyXG5ceDA1dmFsdWVceDE4XHgwMSBceDAxKFx4MDJcIlx4MWJcblxuSW50NjRWYWx1ZVx4MTJcclxuXHgwNXZhbHVlXHgxOFx4MDEgXHgwMShceDAzXCJceDFjXG5ceDBiVUludDY0VmFsdWVceDEyXHJcblx4MDV2YWx1ZVx4MThceDAxIFx4MDEoXHgwNFwiXHgxYlxuXG5JbnQzMlZhbHVlXHgxMlxyXG5ceDA1dmFsdWVceDE4XHgwMSBceDAxKFx4MDVcIlx4MWNcblx4MGJVSW50MzJWYWx1ZVx4MTJcclxuXHgwNXZhbHVlXHgxOFx4MDEgXHgwMShcclwiXHgxYVxuXHRCb29sVmFsdWVceDEyXHJcblx4MDV2YWx1ZVx4MThceDAxIFx4MDEoXHgwOFwiXHgxY1xuXHgwYlN0cmluZ1ZhbHVlXHgxMlxyXG5ceDA1dmFsdWVceDE4XHgwMSBceDAxKFx0XCJceDFiXG5cbkJ5dGVzVmFsdWVceDEyXHJcblx4MDV2YWx1ZVx4MThceDAxIFx4MDEoXHgwY1x4NDJceDgzXHgwMVxuXHgxM1x4NjNvbS5nb29nbGUucHJvdG9idWZCXHJXcmFwcGVyc1Byb3RvUFx4MDFaMWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3dyYXBwZXJzcGJceGY4XHgwMVx4MDFceGEyXHgwMlx4MDNHUEJceGFhXHgwMlx4MWVHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiXHgwNnByb3RvMycKKykKKworCisKKworX0RPVUJMRVZBTFVFID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nRG91YmxlVmFsdWUnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZS52YWx1ZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT0xLCBjcHBfdHlwZT01LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9ZmxvYXQoMCksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMycsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9NTEsCisgIHNlcmlhbGl6ZWRfZW5kPTc5LAorKQorCisKK19GTE9BVFZBTFVFID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nRmxvYXRWYWx1ZScsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZsb2F0VmFsdWUnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZS52YWx1ZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT0yLCBjcHBfdHlwZT02LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9ZmxvYXQoMCksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMycsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9ODEsCisgIHNlcmlhbGl6ZWRfZW5kPTEwOCwKKykKKworCitfSU5UNjRWQUxVRSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0ludDY0VmFsdWUnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd2YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUudmFsdWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9MywgY3BwX3R5cGU9MiwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMycsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MTEwLAorICBzZXJpYWxpemVkX2VuZD0xMzcsCispCisKKworX1VJTlQ2NFZBTFVFID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nVUludDY0VmFsdWUnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZS52YWx1ZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT00LCBjcHBfdHlwZT00LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsIGZpbGU9REVTQ1JJUFRPUiwgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9vcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIHN5bnRheD0ncHJvdG8zJywKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgb25lb2ZzPVsKKyAgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0xMzksCisgIHNlcmlhbGl6ZWRfZW5kPTE2NywKKykKKworCitfSU5UMzJWQUxVRSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0ludDMyVmFsdWUnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSwKKyAgZmllbGRzPVsKKyAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd2YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUudmFsdWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMycsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MTY5LAorICBzZXJpYWxpemVkX2VuZD0xOTYsCispCisKKworX1VJTlQzMlZBTFVFID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nVUludDMyVmFsdWUnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZS52YWx1ZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT0xMywgY3BwX3R5cGU9MywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMycsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MTk4LAorICBzZXJpYWxpemVkX2VuZD0yMjYsCispCisKKworX0JPT0xWQUxVRSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0Jvb2xWYWx1ZScsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUudmFsdWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzMnLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTIyOCwKKyAgc2VyaWFsaXplZF9lbmQ9MjU0LAorKQorCisKK19TVFJJTkdWQUxVRSA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J1N0cmluZ1ZhbHVlJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LAorICBmaWVsZHM9WworICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUudmFsdWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWIiIi5kZWNvZGUoJ3V0Zi04JyksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLCBmaWxlPURFU0NSSVBUT1IsICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBzeW50YXg9J3Byb3RvMycsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIG9uZW9mcz1bCisgIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MjU2LAorICBzZXJpYWxpemVkX2VuZD0yODQsCispCisKKworX0JZVEVTVkFMVUUgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdCeXRlc1ZhbHVlJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksCisgIGZpZWxkcz1bCisgICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlLnZhbHVlJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTEyLCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9YiIiLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwgZmlsZT1ERVNDUklQVE9SLCAgY3JlYXRlX2tleT1fZGVzY3JpcHRvci5faW50ZXJuYWxfY3JlYXRlX2tleSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBzZXJpYWxpemVkX29wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgc3ludGF4PSdwcm90bzMnLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBvbmVvZnM9WworICBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTI4NiwKKyAgc2VyaWFsaXplZF9lbmQ9MzEzLAorKQorCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnRG91YmxlVmFsdWUnXSA9IF9ET1VCTEVWQUxVRQorREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ0Zsb2F0VmFsdWUnXSA9IF9GTE9BVFZBTFVFCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnSW50NjRWYWx1ZSddID0gX0lOVDY0VkFMVUUKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydVSW50NjRWYWx1ZSddID0gX1VJTlQ2NFZBTFVFCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnSW50MzJWYWx1ZSddID0gX0lOVDMyVkFMVUUKK0RFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydVSW50MzJWYWx1ZSddID0gX1VJTlQzMlZBTFVFCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnQm9vbFZhbHVlJ10gPSBfQk9PTFZBTFVFCitERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnU3RyaW5nVmFsdWUnXSA9IF9TVFJJTkdWQUxVRQorREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ0J5dGVzVmFsdWUnXSA9IF9CWVRFU1ZBTFVFCitfc3ltX2RiLlJlZ2lzdGVyRmlsZURlc2NyaXB0b3IoREVTQ1JJUFRPUikKKworRG91YmxlVmFsdWUgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdEb3VibGVWYWx1ZScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX0RPVUJMRVZBTFVFLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLndyYXBwZXJzX3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoRG91YmxlVmFsdWUpCisKK0Zsb2F0VmFsdWUgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdGbG9hdFZhbHVlJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfRkxPQVRWQUxVRSwKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi53cmFwcGVyc19wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GbG9hdFZhbHVlKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoRmxvYXRWYWx1ZSkKKworSW50NjRWYWx1ZSA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0ludDY0VmFsdWUnLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICdERVNDUklQVE9SJyA6IF9JTlQ2NFZBTFVFLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLndyYXBwZXJzX3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUpCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShJbnQ2NFZhbHVlKQorCitVSW50NjRWYWx1ZSA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ1VJbnQ2NFZhbHVlJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfVUlOVDY0VkFMVUUsCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYud3JhcHBlcnNfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUpCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShVSW50NjRWYWx1ZSkKKworSW50MzJWYWx1ZSA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0ludDMyVmFsdWUnLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCB7CisgICdERVNDUklQVE9SJyA6IF9JTlQzMlZBTFVFLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLndyYXBwZXJzX3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUpCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShJbnQzMlZhbHVlKQorCitVSW50MzJWYWx1ZSA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ1VJbnQzMlZhbHVlJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfVUlOVDMyVkFMVUUsCisgICdfX21vZHVsZV9fJyA6ICdnb29nbGUucHJvdG9idWYud3JhcHBlcnNfcGIyJworICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUpCisgIH0pCitfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShVSW50MzJWYWx1ZSkKKworQm9vbFZhbHVlID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnQm9vbFZhbHVlJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfQk9PTFZBTFVFLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLndyYXBwZXJzX3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZSkKKyAgfSkKK19zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKEJvb2xWYWx1ZSkKKworU3RyaW5nVmFsdWUgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdTdHJpbmdWYWx1ZScsIChfbWVzc2FnZS5NZXNzYWdlLCksIHsKKyAgJ0RFU0NSSVBUT1InIDogX1NUUklOR1ZBTFVFLAorICAnX19tb2R1bGVfXycgOiAnZ29vZ2xlLnByb3RvYnVmLndyYXBwZXJzX3BiMicKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoU3RyaW5nVmFsdWUpCisKK0J5dGVzVmFsdWUgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdCeXRlc1ZhbHVlJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgeworICAnREVTQ1JJUFRPUicgOiBfQllURVNWQUxVRSwKKyAgJ19fbW9kdWxlX18nIDogJ2dvb2dsZS5wcm90b2J1Zi53cmFwcGVyc19wYjInCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlKQorICB9KQorX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoQnl0ZXNWYWx1ZSkKKworCitERVNDUklQVE9SLl9vcHRpb25zID0gTm9uZQorIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobW9kdWxlX3Njb3BlKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL21veC5weSBiL3B5dGhvbi9tb3gucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWRkOGFjNwotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9tb3gucHkKQEAgLTAsMCArMSwxNDAxIEBACisjIS91c3IvYmluL3B5dGhvbjIuNAorIworIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGZpbGUgaXMgdXNlZCBmb3IgdGVzdGluZy4gIFRoZSBvcmlnaW5hbCBpcyBhdDoKKyMgICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHltb3gvCisKKyIiIk1veCwgYW4gb2JqZWN0LW1vY2tpbmcgZnJhbWV3b3JrIGZvciBQeXRob24uCisKK01veCB3b3JrcyBpbiB0aGUgcmVjb3JkLXJlcGxheS12ZXJpZnkgcGFyYWRpZ20uICBXaGVuIHlvdSBmaXJzdCBjcmVhdGUKK2EgbW9jayBvYmplY3QsIGl0IGlzIGluIHJlY29yZCBtb2RlLiAgWW91IHRoZW4gcHJvZ3JhbW1hdGljYWxseSBzZXQKK3RoZSBleHBlY3RlZCBiZWhhdmlvciBvZiB0aGUgbW9jayBvYmplY3QgKHdoYXQgbWV0aG9kcyBhcmUgdG8gYmUKK2NhbGxlZCBvbiBpdCwgd2l0aCB3aGF0IHBhcmFtZXRlcnMsIHdoYXQgdGhleSBzaG91bGQgcmV0dXJuLCBhbmQgaW4KK3doYXQgb3JkZXIpLgorCitPbmNlIHlvdSBoYXZlIHNldCB1cCB0aGUgZXhwZWN0ZWQgbW9jayBiZWhhdmlvciwgeW91IHB1dCBpdCBpbiByZXBsYXkKK21vZGUuICBOb3cgdGhlIG1vY2sgcmVzcG9uZHMgdG8gbWV0aG9kIGNhbGxzIGp1c3QgYXMgeW91IHRvbGQgaXQgdG8uCitJZiBhbiB1bmV4cGVjdGVkIG1ldGhvZCAob3IgYW4gZXhwZWN0ZWQgbWV0aG9kIHdpdGggdW5leHBlY3RlZAorcGFyYW1ldGVycykgaXMgY2FsbGVkLCB0aGVuIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZC4KKworT25jZSB5b3UgYXJlIGRvbmUgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbW9jaywgeW91IG5lZWQgdG8gdmVyaWZ5IHRoYXQKK2FsbCB0aGUgZXhwZWN0ZWQgaW50ZXJhY3Rpb25zIG9jY3VycmVkLiAgKE1heWJlIHlvdXIgY29kZSBleGl0ZWQKK3ByZW1hdHVyZWx5IHdpdGhvdXQgY2FsbGluZyBzb21lIGNsZWFudXAgbWV0aG9kISkgIFRoZSB2ZXJpZnkgcGhhc2UKK2Vuc3VyZXMgdGhhdCBldmVyeSBleHBlY3RlZCBtZXRob2Qgd2FzIGNhbGxlZDsgb3RoZXJ3aXNlLCBhbiBleGNlcHRpb24KK3dpbGwgYmUgcmFpc2VkLgorCitTdWdnZXN0ZWQgdXNhZ2UgLyB3b3JrZmxvdzoKKworICAjIENyZWF0ZSBNb3ggZmFjdG9yeQorICBteV9tb3ggPSBNb3goKQorCisgICMgQ3JlYXRlIGEgbW9jayBkYXRhIGFjY2VzcyBvYmplY3QKKyAgbW9ja19kYW8gPSBteV9tb3guQ3JlYXRlTW9jayhEQU9DbGFzcykKKworICAjIFNldCB1cCBleHBlY3RlZCBiZWhhdmlvcgorICBtb2NrX2Rhby5SZXRyaWV2ZVBlcnNvbldpdGhJZGVudGlmaWVyKCcxJykuQW5kUmV0dXJuKHBlcnNvbikKKyAgbW9ja19kYW8uRGVsZXRlUGVyc29uKHBlcnNvbikKKworICAjIFB1dCBtb2NrcyBpbiByZXBsYXkgbW9kZQorICBteV9tb3guUmVwbGF5QWxsKCkKKworICAjIEluamVjdCBtb2NrIG9iamVjdCBhbmQgcnVuIHRlc3QKKyAgY29udHJvbGxlci5TZXREYW8obW9ja19kYW8pCisgIGNvbnRyb2xsZXIuRGVsZXRlUGVyc29uQnlJZCgnMScpCisKKyAgIyBWZXJpZnkgYWxsIG1ldGhvZHMgd2VyZSBjYWxsZWQgYXMgZXhwZWN0ZWQKKyAgbXlfbW94LlZlcmlmeUFsbCgpCisiIiIKKworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2ltcG9ydCByZQoraW1wb3J0IHR5cGVzCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IHN0dWJvdXQKKworY2xhc3MgRXJyb3IoQXNzZXJ0aW9uRXJyb3IpOgorICAiIiJCYXNlIGV4Y2VwdGlvbiBmb3IgdGhpcyBtb2R1bGUuIiIiCisKKyAgcGFzcworCisKK2NsYXNzIEV4cGVjdGVkTWV0aG9kQ2FsbHNFcnJvcihFcnJvcik6CisgICIiIlJhaXNlZCB3aGVuIFZlcmlmeSgpIGlzIGNhbGxlZCBiZWZvcmUgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZXhwZWN0ZWRfbWV0aG9kcyk6CisgICAgIiIiSW5pdCBleGNlcHRpb24uCisKKyAgICBBcmdzOgorICAgICAgIyBleHBlY3RlZF9tZXRob2RzOiBBIHNlcXVlbmNlIG9mIE1vY2tNZXRob2Qgb2JqZWN0cyB0aGF0IHNob3VsZCBoYXZlIGJlZW4KKyAgICAgICMgICBjYWxsZWQuCisgICAgICBleHBlY3RlZF9tZXRob2RzOiBbTW9ja01ldGhvZF0KKworICAgIFJhaXNlczoKKyAgICAgIFZhbHVlRXJyb3I6IGlmIGV4cGVjdGVkX21ldGhvZHMgY29udGFpbnMgbm8gbWV0aG9kcy4KKyAgICAiIiIKKworICAgIGlmIG5vdCBleHBlY3RlZF9tZXRob2RzOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZXhwZWN0ZWQgbWV0aG9kIikKKyAgICBFcnJvci5fX2luaXRfXyhzZWxmKQorICAgIHNlbGYuX2V4cGVjdGVkX21ldGhvZHMgPSBleHBlY3RlZF9tZXRob2RzCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgY2FsbHMgPSAiXG4iLmpvaW4oWyIlM2QuICAlcyIgJSAoaSwgbSkKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIGksIG0gaW4gZW51bWVyYXRlKHNlbGYuX2V4cGVjdGVkX21ldGhvZHMpXSkKKyAgICByZXR1cm4gIlZlcmlmeTogRXhwZWN0ZWQgbWV0aG9kcyBuZXZlciBjYWxsZWQ6XG4lcyIgJSAoY2FsbHMsKQorCisKK2NsYXNzIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3IoRXJyb3IpOgorICAiIiJSYWlzZWQgd2hlbiBhbiB1bmV4cGVjdGVkIG1ldGhvZCBpcyBjYWxsZWQuCisKKyAgVGhpcyBjYW4gb2NjdXIgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHdpdGggaW5jb3JyZWN0IHBhcmFtZXRlcnMsIG9yIG91dCBvZiB0aGUKKyAgc3BlY2lmaWVkIG9yZGVyLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgdW5leHBlY3RlZF9tZXRob2QsIGV4cGVjdGVkKToKKyAgICAiIiJJbml0IGV4Y2VwdGlvbi4KKworICAgIEFyZ3M6CisgICAgICAjIHVuZXhwZWN0ZWRfbWV0aG9kOiBNb2NrTWV0aG9kIHRoYXQgd2FzIGNhbGxlZCBidXQgd2FzIG5vdCBhdCB0aGUgaGVhZCBvZgorICAgICAgIyAgIHRoZSBleHBlY3RlZF9tZXRob2QgcXVldWUuCisgICAgICAjIGV4cGVjdGVkOiBNb2NrTWV0aG9kIG9yIFVub3JkZXJlZEdyb3VwIHRoZSBtZXRob2Qgc2hvdWxkIGhhdmUKKyAgICAgICMgICBiZWVuIGluLgorICAgICAgdW5leHBlY3RlZF9tZXRob2Q6IE1vY2tNZXRob2QKKyAgICAgIGV4cGVjdGVkOiBNb2NrTWV0aG9kIG9yIFVub3JkZXJlZEdyb3VwCisgICAgIiIiCisKKyAgICBFcnJvci5fX2luaXRfXyhzZWxmKQorICAgIHNlbGYuX3VuZXhwZWN0ZWRfbWV0aG9kID0gdW5leHBlY3RlZF9tZXRob2QKKyAgICBzZWxmLl9leHBlY3RlZCA9IGV4cGVjdGVkCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgcmV0dXJuICJVbmV4cGVjdGVkIG1ldGhvZCBjYWxsOiAlcy4gIEV4cGVjdGluZzogJXMiICUgXAorICAgICAgKHNlbGYuX3VuZXhwZWN0ZWRfbWV0aG9kLCBzZWxmLl9leHBlY3RlZCkKKworCitjbGFzcyBVbmtub3duTWV0aG9kQ2FsbEVycm9yKEVycm9yKToKKyAgIiIiUmFpc2VkIGlmIGFuIHVua25vd24gbWV0aG9kIGlzIHJlcXVlc3RlZCBvZiB0aGUgbW9jayBvYmplY3QuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHVua25vd25fbWV0aG9kX25hbWUpOgorICAgICIiIkluaXQgZXhjZXB0aW9uLgorCisgICAgQXJnczoKKyAgICAgICMgdW5rbm93bl9tZXRob2RfbmFtZTogTWV0aG9kIGNhbGwgdGhhdCBpcyBub3QgcGFydCBvZiB0aGUgbW9ja2VkIGNsYXNzJ3MKKyAgICAgICMgICBwdWJsaWMgaW50ZXJmYWNlLgorICAgICAgdW5rbm93bl9tZXRob2RfbmFtZTogc3RyCisgICAgIiIiCisKKyAgICBFcnJvci5fX2luaXRfXyhzZWxmKQorICAgIHNlbGYuX3Vua25vd25fbWV0aG9kX25hbWUgPSB1bmtub3duX21ldGhvZF9uYW1lCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgcmV0dXJuICJNZXRob2QgY2FsbGVkIGlzIG5vdCBhIG1lbWJlciBvZiB0aGUgb2JqZWN0OiAlcyIgJSBcCisgICAgICBzZWxmLl91bmtub3duX21ldGhvZF9uYW1lCisKKworY2xhc3MgTW94KG9iamVjdCk6CisgICIiIk1veDogYSBmYWN0b3J5IGZvciBjcmVhdGluZyBtb2NrIG9iamVjdHMuIiIiCisKKyAgIyBBIGxpc3Qgb2YgdHlwZXMgdGhhdCBzaG91bGQgYmUgc3R1YmJlZCBvdXQgd2l0aCBNb2NrT2JqZWN0cyAoYXMKKyAgIyBvcHBvc2VkIHRvIE1vY2tBbnl0aGluZ3MpLgorICBfVVNFX01PQ0tfT0JKRUNUID0gW3R5cGVzLkNsYXNzVHlwZSwgdHlwZXMuSW5zdGFuY2VUeXBlLCB0eXBlcy5Nb2R1bGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVzLk9iamVjdFR5cGUsIHR5cGVzLlR5cGVUeXBlXQorCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAiIiJJbml0aWFsaXplIGEgbmV3IE1veC4iIiIKKworICAgIHNlbGYuX21vY2tfb2JqZWN0cyA9IFtdCisgICAgc2VsZi5zdHVicyA9IHN0dWJvdXQuU3R1Yk91dEZvclRlc3RpbmcoKQorCisgIGRlZiBDcmVhdGVNb2NrKHNlbGYsIGNsYXNzX3RvX21vY2spOgorICAgICIiIkNyZWF0ZSBhIG5ldyBtb2NrIG9iamVjdC4KKworICAgIEFyZ3M6CisgICAgICAjIGNsYXNzX3RvX21vY2s6IHRoZSBjbGFzcyB0byBiZSBtb2NrZWQKKyAgICAgIGNsYXNzX3RvX21vY2s6IGNsYXNzCisKKyAgICBSZXR1cm5zOgorICAgICAgTW9ja09iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIHRoZSBjbGFzc190b19tb2NrIHdvdWxkIGJlLgorICAgICIiIgorCisgICAgbmV3X21vY2sgPSBNb2NrT2JqZWN0KGNsYXNzX3RvX21vY2spCisgICAgc2VsZi5fbW9ja19vYmplY3RzLmFwcGVuZChuZXdfbW9jaykKKyAgICByZXR1cm4gbmV3X21vY2sKKworICBkZWYgQ3JlYXRlTW9ja0FueXRoaW5nKHNlbGYpOgorICAgICIiIkNyZWF0ZSBhIG1vY2sgdGhhdCB3aWxsIGFjY2VwdCBhbnkgbWV0aG9kIGNhbGxzLgorCisgICAgVGhpcyBkb2VzIG5vdCBlbmZvcmNlIGFuIGludGVyZmFjZS4KKyAgICAiIiIKKworICAgIG5ld19tb2NrID0gTW9ja0FueXRoaW5nKCkKKyAgICBzZWxmLl9tb2NrX29iamVjdHMuYXBwZW5kKG5ld19tb2NrKQorICAgIHJldHVybiBuZXdfbW9jaworCisgIGRlZiBSZXBsYXlBbGwoc2VsZik6CisgICAgIiIiU2V0IGFsbCBtb2NrIG9iamVjdHMgdG8gcmVwbGF5IG1vZGUuIiIiCisKKyAgICBmb3IgbW9ja19vYmogaW4gc2VsZi5fbW9ja19vYmplY3RzOgorICAgICAgbW9ja19vYmouX1JlcGxheSgpCisKKworICBkZWYgVmVyaWZ5QWxsKHNlbGYpOgorICAgICIiIkNhbGwgdmVyaWZ5IG9uIGFsbCBtb2NrIG9iamVjdHMgY3JlYXRlZC4iIiIKKworICAgIGZvciBtb2NrX29iaiBpbiBzZWxmLl9tb2NrX29iamVjdHM6CisgICAgICBtb2NrX29iai5fVmVyaWZ5KCkKKworICBkZWYgUmVzZXRBbGwoc2VsZik6CisgICAgIiIiQ2FsbCByZXNldCBvbiBhbGwgbW9jayBvYmplY3RzLiAgVGhpcyBkb2VzIG5vdCB1bnNldCBzdHVicy4iIiIKKworICAgIGZvciBtb2NrX29iaiBpbiBzZWxmLl9tb2NrX29iamVjdHM6CisgICAgICBtb2NrX29iai5fUmVzZXQoKQorCisgIGRlZiBTdHViT3V0V2l0aE1vY2soc2VsZiwgb2JqLCBhdHRyX25hbWUsIHVzZV9tb2NrX2FueXRoaW5nPUZhbHNlKToKKyAgICAiIiJSZXBsYWNlIGEgbWV0aG9kLCBhdHRyaWJ1dGUsIGV0Yy4gd2l0aCBhIE1vY2suCisKKyAgICBUaGlzIHdpbGwgcmVwbGFjZSBhIGNsYXNzIG9yIG1vZHVsZSB3aXRoIGEgTW9ja09iamVjdCwgYW5kIGV2ZXJ5dGhpbmcgZWxzZQorICAgIChtZXRob2QsIGZ1bmN0aW9uLCBldGMpIHdpdGggYSBNb2NrQW55dGhpbmcuICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHRvCisgICAgYWx3YXlzIHVzZSBhIE1vY2tBbnl0aGluZyBieSBzZXR0aW5nIHVzZV9tb2NrX2FueXRoaW5nIHRvIFRydWUuCisKKyAgICBBcmdzOgorICAgICAgb2JqOiBBIFB5dGhvbiBvYmplY3QgKGNsYXNzLCBtb2R1bGUsIGluc3RhbmNlLCBjYWxsYWJsZSkuCisgICAgICBhdHRyX25hbWU6IHN0ci4gIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gcmVwbGFjZSB3aXRoIGEgbW9jay4KKyAgICAgIHVzZV9tb2NrX2FueXRoaW5nOiBib29sLiBUcnVlIGlmIGEgTW9ja0FueXRoaW5nIHNob3VsZCBiZSB1c2VkIHJlZ2FyZGxlc3MKKyAgICAgICAgb2YgdGhlIHR5cGUgb2YgYXR0cmlidXRlLgorICAgICIiIgorCisgICAgYXR0cl90b19yZXBsYWNlID0gZ2V0YXR0cihvYmosIGF0dHJfbmFtZSkKKyAgICBpZiB0eXBlKGF0dHJfdG9fcmVwbGFjZSkgaW4gc2VsZi5fVVNFX01PQ0tfT0JKRUNUIGFuZCBub3QgdXNlX21vY2tfYW55dGhpbmc6CisgICAgICBzdHViID0gc2VsZi5DcmVhdGVNb2NrKGF0dHJfdG9fcmVwbGFjZSkKKyAgICBlbHNlOgorICAgICAgc3R1YiA9IHNlbGYuQ3JlYXRlTW9ja0FueXRoaW5nKCkKKworICAgIHNlbGYuc3R1YnMuU2V0KG9iaiwgYXR0cl9uYW1lLCBzdHViKQorCisgIGRlZiBVbnNldFN0dWJzKHNlbGYpOgorICAgICIiIlJlc3RvcmUgc3R1YnMgdG8gdGhlaXIgb3JpZ2luYWwgc3RhdGUuIiIiCisKKyAgICBzZWxmLnN0dWJzLlVuc2V0QWxsKCkKKworZGVmIFJlcGxheSgqYXJncyk6CisgICIiIlB1dCBtb2NrcyBpbnRvIFJlcGxheSBtb2RlLgorCisgIEFyZ3M6CisgICAgIyBhcmdzIGlzIGFueSBudW1iZXIgb2YgbW9ja3MgdG8gcHV0IGludG8gcmVwbGF5IG1vZGUuCisgICIiIgorCisgIGZvciBtb2NrIGluIGFyZ3M6CisgICAgbW9jay5fUmVwbGF5KCkKKworCitkZWYgVmVyaWZ5KCphcmdzKToKKyAgIiIiVmVyaWZ5IG1vY2tzLgorCisgIEFyZ3M6CisgICAgIyBhcmdzIGlzIGFueSBudW1iZXIgb2YgbW9ja3MgdG8gYmUgdmVyaWZpZWQuCisgICIiIgorCisgIGZvciBtb2NrIGluIGFyZ3M6CisgICAgbW9jay5fVmVyaWZ5KCkKKworCitkZWYgUmVzZXQoKmFyZ3MpOgorICAiIiJSZXNldCBtb2Nrcy4KKworICBBcmdzOgorICAgICMgYXJncyBpcyBhbnkgbnVtYmVyIG9mIG1vY2tzIHRvIGJlIHJlc2V0LgorICAiIiIKKworICBmb3IgbW9jayBpbiBhcmdzOgorICAgIG1vY2suX1Jlc2V0KCkKKworCitjbGFzcyBNb2NrQW55dGhpbmc6CisgICIiIkEgbW9jayB0aGF0IGNhbiBiZSB1c2VkIHRvIG1vY2sgYW55dGhpbmcuCisKKyAgVGhpcyBpcyBoZWxwZnVsIGZvciBtb2NraW5nIGNsYXNzZXMgdGhhdCBkbyBub3QgcHJvdmlkZSBhIHB1YmxpYyBpbnRlcmZhY2UuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAiIiIgIiIiCisgICAgc2VsZi5fUmVzZXQoKQorCisgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBtZXRob2RfbmFtZSk6CisgICAgIiIiSW50ZXJjZXB0IG1ldGhvZCBjYWxscyBvbiB0aGlzIG9iamVjdC4KKworICAgICBBIG5ldyBNb2NrTWV0aG9kIGlzIHJldHVybmVkIHRoYXQgaXMgYXdhcmUgb2YgdGhlIE1vY2tBbnl0aGluZydzCisgICAgIHN0YXRlIChyZWNvcmQgb3IgcmVwbGF5KS4gIFRoZSBjYWxsIHdpbGwgYmUgcmVjb3JkZWQgb3IgcmVwbGF5ZWQKKyAgICAgYnkgdGhlIE1vY2tNZXRob2QncyBfX2NhbGxfXy4KKworICAgIEFyZ3M6CisgICAgICAjIG1ldGhvZCBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIGNhbGxlZC4KKyAgICAgIG1ldGhvZF9uYW1lOiBzdHIKKworICAgIFJldHVybnM6CisgICAgICBBIG5ldyBNb2NrTWV0aG9kIGF3YXJlIG9mIE1vY2tBbnl0aGluZydzIHN0YXRlIChyZWNvcmQgb3IgcmVwbGF5KS4KKyAgICAiIiIKKworICAgIHJldHVybiBzZWxmLl9DcmVhdGVNb2NrTWV0aG9kKG1ldGhvZF9uYW1lKQorCisgIGRlZiBfQ3JlYXRlTW9ja01ldGhvZChzZWxmLCBtZXRob2RfbmFtZSk6CisgICAgIiIiQ3JlYXRlIGEgbmV3IG1vY2sgbWV0aG9kIGNhbGwgYW5kIHJldHVybiBpdC4KKworICAgIEFyZ3M6CisgICAgICAjIG1ldGhvZCBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIGNhbGxlZC4KKyAgICAgIG1ldGhvZF9uYW1lOiBzdHIKKworICAgIFJldHVybnM6CisgICAgICBBIG5ldyBNb2NrTWV0aG9kIGF3YXJlIG9mIE1vY2tBbnl0aGluZydzIHN0YXRlIChyZWNvcmQgb3IgcmVwbGF5KS4KKyAgICAiIiIKKworICAgIHJldHVybiBNb2NrTWV0aG9kKG1ldGhvZF9uYW1lLCBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZXBsYXlfbW9kZSkKKworICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgIiIiUmV0dXJuIDEgZm9yIG5vbnplcm8gc28gdGhlIG1vY2sgY2FuIGJlIHVzZWQgYXMgYSBjb25kaXRpb25hbC4iIiIKKworICAgIHJldHVybiAxCisKKyAgZGVmIF9fZXFfXyhzZWxmLCByaHMpOgorICAgICIiIlByb3ZpZGUgY3VzdG9tIGxvZ2ljIHRvIGNvbXBhcmUgb2JqZWN0cy4iIiIKKworICAgIHJldHVybiAoaXNpbnN0YW5jZShyaHMsIE1vY2tBbnl0aGluZykgYW5kCisgICAgICAgICAgICBzZWxmLl9yZXBsYXlfbW9kZSA9PSByaHMuX3JlcGxheV9tb2RlIGFuZAorICAgICAgICAgICAgc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUgPT0gcmhzLl9leHBlY3RlZF9jYWxsc19xdWV1ZSkKKworICBkZWYgX19uZV9fKHNlbGYsIHJocyk6CisgICAgIiIiUHJvdmlkZSBjdXN0b20gbG9naWMgdG8gY29tcGFyZSBvYmplY3RzLiIiIgorCisgICAgcmV0dXJuIG5vdCBzZWxmID09IHJocworCisgIGRlZiBfUmVwbGF5KHNlbGYpOgorICAgICIiIlN0YXJ0IHJlcGxheWluZyBleHBlY3RlZCBtZXRob2QgY2FsbHMuIiIiCisKKyAgICBzZWxmLl9yZXBsYXlfbW9kZSA9IFRydWUKKworICBkZWYgX1ZlcmlmeShzZWxmKToKKyAgICAiIiJWZXJpZnkgdGhhdCBhbGwgb2YgdGhlIGV4cGVjdGVkIGNhbGxzIGhhdmUgYmVlbiBtYWRlLgorCisgICAgUmFpc2VzOgorICAgICAgRXhwZWN0ZWRNZXRob2RDYWxsc0Vycm9yOiBpZiB0aGVyZSBhcmUgc3RpbGwgbW9yZSBtZXRob2QgY2FsbHMgaW4gdGhlCisgICAgICAgIGV4cGVjdGVkIHF1ZXVlLgorICAgICIiIgorCisgICAgIyBJZiB0aGUgbGlzdCBvZiBleHBlY3RlZCBjYWxscyBpcyBub3QgZW1wdHksIHJhaXNlIGFuIGV4Y2VwdGlvbgorICAgIGlmIHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlOgorICAgICAgIyBUaGUgbGFzdCBNdWx0aXBsZVRpbWVzR3JvdXAgaXMgbm90IHBvcHBlZCBmcm9tIHRoZSBxdWV1ZS4KKyAgICAgIGlmIChsZW4oc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUpID09IDEgYW5kCisgICAgICAgICAgaXNpbnN0YW5jZShzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZVswXSwgTXVsdGlwbGVUaW1lc0dyb3VwKSBhbmQKKyAgICAgICAgICBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZVswXS5Jc1NhdGlzZmllZCgpKToKKyAgICAgICAgcGFzcworICAgICAgZWxzZToKKyAgICAgICAgcmFpc2UgRXhwZWN0ZWRNZXRob2RDYWxsc0Vycm9yKHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlKQorCisgIGRlZiBfUmVzZXQoc2VsZik6CisgICAgIiIiUmVzZXQgdGhlIHN0YXRlIG9mIHRoaXMgbW9jayB0byByZWNvcmQgbW9kZSB3aXRoIGFuIGVtcHR5IHF1ZXVlLiIiIgorCisgICAgIyBNYWludGFpbiBhIGxpc3Qgb2YgbWV0aG9kIGNhbGxzIHdlIGFyZSBleHBlY3RpbmcKKyAgICBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZSA9IGRlcXVlKCkKKworICAgICMgTWFrZSBzdXJlIHdlIGFyZSBpbiBzZXR1cCBtb2RlLCBub3QgcmVwbGF5IG1vZGUKKyAgICBzZWxmLl9yZXBsYXlfbW9kZSA9IEZhbHNlCisKKworY2xhc3MgTW9ja09iamVjdChNb2NrQW55dGhpbmcsIG9iamVjdCk6CisgICIiIkEgbW9jayBvYmplY3QgdGhhdCBzaW11bGF0ZXMgdGhlIHB1YmxpYy9wcm90ZWN0ZWQgaW50ZXJmYWNlIG9mIGEgY2xhc3MuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGNsYXNzX3RvX21vY2spOgorICAgICIiIkluaXRpYWxpemUgYSBtb2NrIG9iamVjdC4KKworICAgIFRoaXMgZGV0ZXJtaW5lcyB0aGUgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBvZiB0aGUgY2xhc3MgYW5kIHN0b3JlcyB0aGVtLgorCisgICAgQXJnczoKKyAgICAgICMgY2xhc3NfdG9fbW9jazogY2xhc3MgdG8gYmUgbW9ja2VkCisgICAgICBjbGFzc190b19tb2NrOiBjbGFzcworICAgICIiIgorCisgICAgIyBUaGlzIGlzIHVzZWQgdG8gaGFjayBhcm91bmQgdGhlIG1peGluL2luaGVyaXRhbmNlIG9mIE1vY2tBbnl0aGluZywgd2hpY2gKKyAgICAjIGlzIG5vdCBhIHByb3BlciBvYmplY3QgKGl0IGNhbiBiZSBhbnl0aGluZy4gOi0pCisgICAgTW9ja0FueXRoaW5nLl9fZGljdF9fWydfX2luaXRfXyddKHNlbGYpCisKKyAgICAjIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBwdWJsaWMgYW5kIHNwZWNpYWwgbWV0aG9kcyB3ZSBzaG91bGQgbW9jay4KKyAgICBzZWxmLl9rbm93bl9tZXRob2RzID0gc2V0KCkKKyAgICBzZWxmLl9rbm93bl92YXJzID0gc2V0KCkKKyAgICBzZWxmLl9jbGFzc190b19tb2NrID0gY2xhc3NfdG9fbW9jaworICAgIGZvciBtZXRob2QgaW4gZGlyKGNsYXNzX3RvX21vY2spOgorICAgICAgaWYgY2FsbGFibGUoZ2V0YXR0cihjbGFzc190b19tb2NrLCBtZXRob2QpKToKKyAgICAgICAgc2VsZi5fa25vd25fbWV0aG9kcy5hZGQobWV0aG9kKQorICAgICAgZWxzZToKKyAgICAgICAgc2VsZi5fa25vd25fdmFycy5hZGQobWV0aG9kKQorCisgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAiIiJJbnRlcmNlcHQgYXR0cmlidXRlIHJlcXVlc3Qgb24gdGhpcyBvYmplY3QuCisKKyAgICBJZiB0aGUgYXR0cmlidXRlIGlzIGEgcHVibGljIGNsYXNzIHZhcmlhYmxlLCBpdCB3aWxsIGJlIHJldHVybmVkIGFuZCBub3QKKyAgICByZWNvcmRlZCBhcyBhIGNhbGwuCisKKyAgICBJZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBhIHZhcmlhYmxlLCBpdCBpcyBoYW5kbGVkIGxpa2UgYSBtZXRob2QKKyAgICBjYWxsLiBUaGUgbWV0aG9kIG5hbWUgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBzZXQgb2YgbW9ja2FibGUKKyAgICBtZXRob2RzLCBhbmQgYSBuZXcgTW9ja01ldGhvZCBpcyByZXR1cm5lZCB0aGF0IGlzIGF3YXJlIG9mIHRoZQorICAgIE1vY2tPYmplY3QncyBzdGF0ZSAocmVjb3JkIG9yIHJlcGxheSkuICBUaGUgY2FsbCB3aWxsIGJlIHJlY29yZGVkCisgICAgb3IgcmVwbGF5ZWQgYnkgdGhlIE1vY2tNZXRob2QncyBfX2NhbGxfXy4KKworICAgIEFyZ3M6CisgICAgICAjIG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgYmVpbmcgcmVxdWVzdGVkLgorICAgICAgbmFtZTogc3RyCisKKyAgICBSZXR1cm5zOgorICAgICAgRWl0aGVyIGEgY2xhc3MgdmFyaWFibGUgb3IgYSBuZXcgTW9ja01ldGhvZCB0aGF0IGlzIGF3YXJlIG9mIHRoZSBzdGF0ZQorICAgICAgb2YgdGhlIG1vY2sgKHJlY29yZCBvciByZXBsYXkpLgorCisgICAgUmFpc2VzOgorICAgICAgVW5rbm93bk1ldGhvZENhbGxFcnJvciBpZiB0aGUgTW9ja09iamVjdCBkb2VzIG5vdCBtb2NrIHRoZSByZXF1ZXN0ZWQKKyAgICAgICAgICBtZXRob2QuCisgICAgIiIiCisKKyAgICBpZiBuYW1lIGluIHNlbGYuX2tub3duX3ZhcnM6CisgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9jbGFzc190b19tb2NrLCBuYW1lKQorCisgICAgaWYgbmFtZSBpbiBzZWxmLl9rbm93bl9tZXRob2RzOgorICAgICAgcmV0dXJuIHNlbGYuX0NyZWF0ZU1vY2tNZXRob2QobmFtZSkKKworICAgIHJhaXNlIFVua25vd25NZXRob2RDYWxsRXJyb3IobmFtZSkKKworICBkZWYgX19lcV9fKHNlbGYsIHJocyk6CisgICAgIiIiUHJvdmlkZSBjdXN0b20gbG9naWMgdG8gY29tcGFyZSBvYmplY3RzLiIiIgorCisgICAgcmV0dXJuIChpc2luc3RhbmNlKHJocywgTW9ja09iamVjdCkgYW5kCisgICAgICAgICAgICBzZWxmLl9jbGFzc190b19tb2NrID09IHJocy5fY2xhc3NfdG9fbW9jayBhbmQKKyAgICAgICAgICAgIHNlbGYuX3JlcGxheV9tb2RlID09IHJocy5fcmVwbGF5X21vZGUgYW5kCisgICAgICAgICAgICBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZSA9PSByaHMuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlKQorCisgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAiIiJQcm92aWRlIGN1c3RvbSBsb2dpYyBmb3IgbW9ja2luZyBjbGFzc2VzIHRoYXQgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQuCisKKyAgICBBcmdzOgorICAgICAga2V5OiBLZXkgdG8gc2V0IHRoZSB2YWx1ZSBmb3IuCisgICAgICB2YWx1ZTogVmFsdWUgdG8gc2V0LgorCisgICAgUmV0dXJuczoKKyAgICAgIEV4cGVjdGVkIHJldHVybiB2YWx1ZSBpbiByZXBsYXkgbW9kZS4gIEEgTW9ja01ldGhvZCBvYmplY3QgZm9yIHRoZQorICAgICAgX19zZXRpdGVtX18gbWV0aG9kIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgaWYgbm90IGluIHJlcGxheSBtb2RlLgorCisgICAgUmFpc2VzOgorICAgICAgVHlwZUVycm9yIGlmIHRoZSB1bmRlcmx5aW5nIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50LgorICAgICAgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvciBpZiB0aGUgb2JqZWN0IGRvZXMgbm90IGV4cGVjdCB0aGUgY2FsbCB0bworICAgICAgICBfX3NldGl0ZW1fXy4KKworICAgICIiIgorICAgIHNldGl0ZW0gPSBzZWxmLl9jbGFzc190b19tb2NrLl9fZGljdF9fLmdldCgnX19zZXRpdGVtX18nLCBOb25lKQorCisgICAgIyBWZXJpZnkgdGhlIGNsYXNzIHN1cHBvcnRzIGl0ZW0gYXNzaWdubWVudC4KKyAgICBpZiBzZXRpdGVtIGlzIE5vbmU6CisgICAgICByYWlzZSBUeXBlRXJyb3IoJ29iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudCcpCisKKyAgICAjIElmIHdlIGFyZSBpbiByZXBsYXkgbW9kZSB0aGVuIHNpbXBseSBjYWxsIHRoZSBtb2NrIF9fc2V0aXRlbV9fIG1ldGhvZC4KKyAgICBpZiBzZWxmLl9yZXBsYXlfbW9kZToKKyAgICAgIHJldHVybiBNb2NrTWV0aG9kKCdfX3NldGl0ZW1fXycsIHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVwbGF5X21vZGUpKGtleSwgdmFsdWUpCisKKworICAgICMgT3RoZXJ3aXNlLCBjcmVhdGUgYSBtb2NrIG1ldGhvZCBfX3NldGl0ZW1fXy4KKyAgICByZXR1cm4gc2VsZi5fQ3JlYXRlTW9ja01ldGhvZCgnX19zZXRpdGVtX18nKShrZXksIHZhbHVlKQorCisgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICIiIlByb3ZpZGUgY3VzdG9tIGxvZ2ljIGZvciBtb2NraW5nIGNsYXNzZXMgdGhhdCBhcmUgc3Vic2NyaXB0YWJsZS4KKworICAgIEFyZ3M6CisgICAgICBrZXk6IEtleSB0byByZXR1cm4gdGhlIHZhbHVlIGZvci4KKworICAgIFJldHVybnM6CisgICAgICBFeHBlY3RlZCByZXR1cm4gdmFsdWUgaW4gcmVwbGF5IG1vZGUuICBBIE1vY2tNZXRob2Qgb2JqZWN0IGZvciB0aGUKKyAgICAgIF9fZ2V0aXRlbV9fIG1ldGhvZCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGlmIG5vdCBpbiByZXBsYXkgbW9kZS4KKworICAgIFJhaXNlczoKKyAgICAgIFR5cGVFcnJvciBpZiB0aGUgdW5kZXJseWluZyBjbGFzcyBpcyBub3Qgc3Vic2NyaXB0YWJsZS4KKyAgICAgIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3IgaWYgdGhlIG9iamVjdCBkb2VzIG5vdCBleHBlY3QgdGhlIGNhbGwgdG8KKyAgICAgICAgX19zZXRpdGVtX18uCisKKyAgICAiIiIKKyAgICBnZXRpdGVtID0gc2VsZi5fY2xhc3NfdG9fbW9jay5fX2RpY3RfXy5nZXQoJ19fZ2V0aXRlbV9fJywgTm9uZSkKKworICAgICMgVmVyaWZ5IHRoZSBjbGFzcyBzdXBwb3J0cyBpdGVtIGFzc2lnbm1lbnQuCisgICAgaWYgZ2V0aXRlbSBpcyBOb25lOgorICAgICAgcmFpc2UgVHlwZUVycm9yKCd1bnN1YnNjcmlwdGFibGUgb2JqZWN0JykKKworICAgICMgSWYgd2UgYXJlIGluIHJlcGxheSBtb2RlIHRoZW4gc2ltcGx5IGNhbGwgdGhlIG1vY2sgX19nZXRpdGVtX18gbWV0aG9kLgorICAgIGlmIHNlbGYuX3JlcGxheV9tb2RlOgorICAgICAgcmV0dXJuIE1vY2tNZXRob2QoJ19fZ2V0aXRlbV9fJywgc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZXBsYXlfbW9kZSkoa2V5KQorCisKKyAgICAjIE90aGVyd2lzZSwgY3JlYXRlIGEgbW9jayBtZXRob2QgX19nZXRpdGVtX18uCisgICAgcmV0dXJuIHNlbGYuX0NyZWF0ZU1vY2tNZXRob2QoJ19fZ2V0aXRlbV9fJykoa2V5KQorCisgIGRlZiBfX2NhbGxfXyhzZWxmLCAqcGFyYW1zLCAqKm5hbWVkX3BhcmFtcyk6CisgICAgIiIiUHJvdmlkZSBjdXN0b20gbG9naWMgZm9yIG1vY2tpbmcgY2xhc3NlcyB0aGF0IGFyZSBjYWxsYWJsZS4iIiIKKworICAgICMgVmVyaWZ5IHRoZSBjbGFzcyB3ZSBhcmUgbW9ja2luZyBpcyBjYWxsYWJsZQorICAgIGNhbGxhYmxlID0gc2VsZi5fY2xhc3NfdG9fbW9jay5fX2RpY3RfXy5nZXQoJ19fY2FsbF9fJywgTm9uZSkKKyAgICBpZiBjYWxsYWJsZSBpcyBOb25lOgorICAgICAgcmFpc2UgVHlwZUVycm9yKCdOb3QgY2FsbGFibGUnKQorCisgICAgIyBCZWNhdXNlIHRoZSBjYWxsIGlzIGhhcHBlbmluZyBkaXJlY3RseSBvbiB0aGlzIG9iamVjdCBpbnN0ZWFkIG9mIGEgbWV0aG9kLAorICAgICMgdGhlIGNhbGwgb24gdGhlIG1vY2sgbWV0aG9kIGlzIG1hZGUgcmlnaHQgaGVyZQorICAgIG1vY2tfbWV0aG9kID0gc2VsZi5fQ3JlYXRlTW9ja01ldGhvZCgnX19jYWxsX18nKQorICAgIHJldHVybiBtb2NrX21ldGhvZCgqcGFyYW1zLCAqKm5hbWVkX3BhcmFtcykKKworICBAcHJvcGVydHkKKyAgZGVmIF9fY2xhc3NfXyhzZWxmKToKKyAgICAiIiJSZXR1cm4gdGhlIGNsYXNzIHRoYXQgaXMgYmVpbmcgbW9ja2VkLiIiIgorCisgICAgcmV0dXJuIHNlbGYuX2NsYXNzX3RvX21vY2sKKworCitjbGFzcyBNb2NrTWV0aG9kKG9iamVjdCk6CisgICIiIkNhbGxhYmxlIG1vY2sgbWV0aG9kLgorCisgIEEgTW9ja01ldGhvZCBzaG91bGQgYWN0IGV4YWN0bHkgbGlrZSB0aGUgbWV0aG9kIGl0IG1vY2tzLCBhY2NlcHRpbmcgcGFyYW1ldGVycworICBhbmQgcmV0dXJuaW5nIGEgdmFsdWUsIG9yIHRocm93aW5nIGFuIGV4Y2VwdGlvbiAoYXMgc3BlY2lmaWVkKS4gIFdoZW4gdGhpcworICBtZXRob2QgaXMgY2FsbGVkLCBpdCBjYW4gb3B0aW9uYWxseSB2ZXJpZnkgd2hldGhlciB0aGUgY2FsbGVkIG1ldGhvZCAobmFtZSBhbmQKKyAgc2lnbmF0dXJlKSBtYXRjaGVzIHRoZSBleHBlY3RlZCBtZXRob2QuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2RfbmFtZSwgY2FsbF9xdWV1ZSwgcmVwbGF5X21vZGUpOgorICAgICIiIkNvbnN0cnVjdCBhIG5ldyBtb2NrIG1ldGhvZC4KKworICAgIEFyZ3M6CisgICAgICAjIG1ldGhvZF9uYW1lOiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCisgICAgICAjIGNhbGxfcXVldWU6IGRlcXVlIG9mIGNhbGxzLCB2ZXJpZnkgdGhpcyBjYWxsIGFnYWluc3QgdGhlIGhlYWQsIG9yIGFkZAorICAgICAgIyAgICAgdGhpcyBjYWxsIHRvIHRoZSBxdWV1ZS4KKyAgICAgICMgcmVwbGF5X21vZGU6IEZhbHNlIGlmIHdlIGFyZSByZWNvcmRpbmcsIFRydWUgaWYgd2UgYXJlIHZlcmlmeWluZyBjYWxscworICAgICAgIyAgICAgYWdhaW5zdCB0aGUgY2FsbCBxdWV1ZS4KKyAgICAgIG1ldGhvZF9uYW1lOiBzdHIKKyAgICAgIGNhbGxfcXVldWU6IGxpc3Qgb3IgZGVxdWUKKyAgICAgIHJlcGxheV9tb2RlOiBib29sCisgICAgIiIiCisKKyAgICBzZWxmLl9uYW1lID0gbWV0aG9kX25hbWUKKyAgICBzZWxmLl9jYWxsX3F1ZXVlID0gY2FsbF9xdWV1ZQorICAgIGlmIG5vdCBpc2luc3RhbmNlKGNhbGxfcXVldWUsIGRlcXVlKToKKyAgICAgIHNlbGYuX2NhbGxfcXVldWUgPSBkZXF1ZShzZWxmLl9jYWxsX3F1ZXVlKQorICAgIHNlbGYuX3JlcGxheV9tb2RlID0gcmVwbGF5X21vZGUKKworICAgIHNlbGYuX3BhcmFtcyA9IE5vbmUKKyAgICBzZWxmLl9uYW1lZF9wYXJhbXMgPSBOb25lCisgICAgc2VsZi5fcmV0dXJuX3ZhbHVlID0gTm9uZQorICAgIHNlbGYuX2V4Y2VwdGlvbiA9IE5vbmUKKyAgICBzZWxmLl9zaWRlX2VmZmVjdHMgPSBOb25lCisKKyAgZGVmIF9fY2FsbF9fKHNlbGYsICpwYXJhbXMsICoqbmFtZWRfcGFyYW1zKToKKyAgICAiIiJMb2cgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgcmV0dXJuIHZhbHVlLgorCisgICAgSWYgdGhlIE1vY2soQW55dGhpbmcvT2JqZWN0KSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWxsIGlzIGluIHJlY29yZCBtb2RlLAorICAgIHRoaXMgTW9ja01ldGhvZCB3aWxsIGJlIHB1c2hlZCBvbnRvIHRoZSBleHBlY3RlZCBjYWxsIHF1ZXVlLiAgSWYgdGhlIG1vY2sKKyAgICBpcyBpbiByZXBsYXkgbW9kZSwgdGhpcyB3aWxsIHBvcCBhIE1vY2tNZXRob2Qgb2ZmIHRoZSB0b3Agb2YgdGhlIHF1ZXVlIGFuZAorICAgIHZlcmlmeSB0aGlzIGNhbGwgaXMgZXF1YWwgdG8gdGhlIGV4cGVjdGVkIGNhbGwuCisKKyAgICBSYWlzZXM6CisgICAgICBVbmV4cGVjdGVkTWV0aG9kQ2FsbCBpZiB0aGlzIGNhbGwgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggYW4gZXhwZWN0ZWQgbWV0aG9kCisgICAgICAgIGNhbGwgYW5kIGl0IGRvZXMgbm90LgorICAgICIiIgorCisgICAgc2VsZi5fcGFyYW1zID0gcGFyYW1zCisgICAgc2VsZi5fbmFtZWRfcGFyYW1zID0gbmFtZWRfcGFyYW1zCisKKyAgICBpZiBub3Qgc2VsZi5fcmVwbGF5X21vZGU6CisgICAgICBzZWxmLl9jYWxsX3F1ZXVlLmFwcGVuZChzZWxmKQorICAgICAgcmV0dXJuIHNlbGYKKworICAgIGV4cGVjdGVkX21ldGhvZCA9IHNlbGYuX1ZlcmlmeU1ldGhvZENhbGwoKQorCisgICAgaWYgZXhwZWN0ZWRfbWV0aG9kLl9zaWRlX2VmZmVjdHM6CisgICAgICBleHBlY3RlZF9tZXRob2QuX3NpZGVfZWZmZWN0cygqcGFyYW1zLCAqKm5hbWVkX3BhcmFtcykKKworICAgIGlmIGV4cGVjdGVkX21ldGhvZC5fZXhjZXB0aW9uOgorICAgICAgcmFpc2UgZXhwZWN0ZWRfbWV0aG9kLl9leGNlcHRpb24KKworICAgIHJldHVybiBleHBlY3RlZF9tZXRob2QuX3JldHVybl92YWx1ZQorCisgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAiIiJSYWlzZSBhbiBBdHRyaWJ1dGVFcnJvciB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlLiIiIgorCisgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoJ01vY2tNZXRob2QgaGFzIG5vIGF0dHJpYnV0ZSAiJXMiLiAnCisgICAgICAgICdEaWQgeW91IHJlbWVtYmVyIHRvIHB1dCB5b3VyIG1vY2tzIGluIHJlcGxheSBtb2RlPycgJSBuYW1lKQorCisgIGRlZiBfUG9wTmV4dE1ldGhvZChzZWxmKToKKyAgICAiIiJQb3AgdGhlIG5leHQgbWV0aG9kIGZyb20gb3VyIGNhbGwgcXVldWUuIiIiCisgICAgdHJ5OgorICAgICAgcmV0dXJuIHNlbGYuX2NhbGxfcXVldWUucG9wbGVmdCgpCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICByYWlzZSBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yKHNlbGYsIE5vbmUpCisKKyAgZGVmIF9WZXJpZnlNZXRob2RDYWxsKHNlbGYpOgorICAgICIiIlZlcmlmeSB0aGUgY2FsbGVkIG1ldGhvZCBpcyBleHBlY3RlZC4KKworICAgIFRoaXMgY2FuIGJlIGFuIG9yZGVyZWQgbWV0aG9kLCBvciBwYXJ0IG9mIGFuIHVub3JkZXJlZCBzZXQuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGV4cGVjdGVkIG1vY2sgbWV0aG9kLgorCisgICAgUmFpc2VzOgorICAgICAgVW5leHBlY3RlZE1ldGhvZENhbGwgaWYgdGhlIG1ldGhvZCBjYWxsZWQgd2FzIG5vdCBleHBlY3RlZC4KKyAgICAiIiIKKworICAgIGV4cGVjdGVkID0gc2VsZi5fUG9wTmV4dE1ldGhvZCgpCisKKyAgICAjIExvb3AgaGVyZSwgYmVjYXVzZSB3ZSBtaWdodCBoYXZlIGEgTWV0aG9kR3JvdXAgZm9sbG93ZWQgYnkgYW5vdGhlcgorICAgICMgZ3JvdXAuCisgICAgd2hpbGUgaXNpbnN0YW5jZShleHBlY3RlZCwgTWV0aG9kR3JvdXApOgorICAgICAgZXhwZWN0ZWQsIG1ldGhvZCA9IGV4cGVjdGVkLk1ldGhvZENhbGxlZChzZWxmKQorICAgICAgaWYgbWV0aG9kIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gbWV0aG9kCisKKyAgICAjIFRoaXMgaXMgYSBtb2NrIG1ldGhvZCwgc28ganVzdCBjaGVjayBlcXVhbGl0eS4KKyAgICBpZiBleHBlY3RlZCAhPSBzZWxmOgorICAgICAgcmFpc2UgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvcihzZWxmLCBleHBlY3RlZCkKKworICAgIHJldHVybiBleHBlY3RlZAorCisgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgIHBhcmFtcyA9ICcsICcuam9pbigKKyAgICAgICAgW3JlcHIocCkgZm9yIHAgaW4gc2VsZi5fcGFyYW1zIG9yIFtdXSArCisgICAgICAgIFsnJXM9JXInICUgeCBmb3IgeCBpbiBzb3J0ZWQoKHNlbGYuX25hbWVkX3BhcmFtcyBvciB7fSkuaXRlbXMoKSldKQorICAgIGRlc2MgPSAiJXMoJXMpIC0+ICVyIiAlIChzZWxmLl9uYW1lLCBwYXJhbXMsIHNlbGYuX3JldHVybl92YWx1ZSkKKyAgICByZXR1cm4gZGVzYworCisgIGRlZiBfX2VxX18oc2VsZiwgcmhzKToKKyAgICAiIiJUZXN0IHdoZXRoZXIgdGhpcyBNb2NrTWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYW5vdGhlciBNb2NrTWV0aG9kLgorCisgICAgQXJnczoKKyAgICAgICMgcmhzOiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSB0ZXN0CisgICAgICByaHM6IE1vY2tNZXRob2QKKyAgICAiIiIKKworICAgIHJldHVybiAoaXNpbnN0YW5jZShyaHMsIE1vY2tNZXRob2QpIGFuZAorICAgICAgICAgICAgc2VsZi5fbmFtZSA9PSByaHMuX25hbWUgYW5kCisgICAgICAgICAgICBzZWxmLl9wYXJhbXMgPT0gcmhzLl9wYXJhbXMgYW5kCisgICAgICAgICAgICBzZWxmLl9uYW1lZF9wYXJhbXMgPT0gcmhzLl9uYW1lZF9wYXJhbXMpCisKKyAgZGVmIF9fbmVfXyhzZWxmLCByaHMpOgorICAgICIiIlRlc3Qgd2hldGhlciB0aGlzIE1vY2tNZXRob2QgaXMgbm90IGVxdWl2YWxlbnQgdG8gYW5vdGhlciBNb2NrTWV0aG9kLgorCisgICAgQXJnczoKKyAgICAgICMgcmhzOiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSB0ZXN0CisgICAgICByaHM6IE1vY2tNZXRob2QKKyAgICAiIiIKKworICAgIHJldHVybiBub3Qgc2VsZiA9PSByaHMKKworICBkZWYgR2V0UG9zc2libGVHcm91cChzZWxmKToKKyAgICAiIiJSZXR1cm5zIGEgcG9zc2libGUgZ3JvdXAgZnJvbSB0aGUgZW5kIG9mIHRoZSBjYWxsIHF1ZXVlIG9yIE5vbmUgaWYgbm8KKyAgICBvdGhlciBtZXRob2RzIGFyZSBvbiB0aGUgc3RhY2suCisgICAgIiIiCisKKyAgICAjIFJlbW92ZSB0aGlzIG1ldGhvZCBmcm9tIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZSBzbyB3ZSBjYW4gYWRkIGl0IHRvIGEgZ3JvdXAuCisgICAgdGhpc19tZXRob2QgPSBzZWxmLl9jYWxsX3F1ZXVlLnBvcCgpCisgICAgYXNzZXJ0IHRoaXNfbWV0aG9kID09IHNlbGYKKworICAgICMgRGV0ZXJtaW5lIGlmIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZSBpcyBhIGdyb3VwLCBvciBqdXN0IGEgcmVndWxhciBvcmRlcmVkCisgICAgIyBtb2NrIG1ldGhvZC4KKyAgICBncm91cCA9IE5vbmUKKyAgICB0cnk6CisgICAgICBncm91cCA9IHNlbGYuX2NhbGxfcXVldWVbLTFdCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICBwYXNzCisKKyAgICByZXR1cm4gZ3JvdXAKKworICBkZWYgX0NoZWNrQW5kQ3JlYXRlTmV3R3JvdXAoc2VsZiwgZ3JvdXBfbmFtZSwgZ3JvdXBfY2xhc3MpOgorICAgICIiIkNoZWNrcyBpZiB0aGUgbGFzdCBtZXRob2QgKGEgcG9zc2libGUgZ3JvdXApIGlzIGFuIGluc3RhbmNlIG9mIG91cgorICAgIGdyb3VwX2NsYXNzLiBBZGRzIHRoZSBjdXJyZW50IG1ldGhvZCB0byB0aGlzIGdyb3VwIG9yIGNyZWF0ZXMgYSBuZXcgb25lLgorCisgICAgQXJnczoKKworICAgICAgZ3JvdXBfbmFtZTogdGhlIG5hbWUgb2YgdGhlIGdyb3VwLgorICAgICAgZ3JvdXBfY2xhc3M6IHRoZSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZSBvZiB0aGlzIG5ldyBncm91cAorICAgICIiIgorICAgIGdyb3VwID0gc2VsZi5HZXRQb3NzaWJsZUdyb3VwKCkKKworICAgICMgSWYgdGhpcyBpcyBhIGdyb3VwLCBhbmQgaXQgaXMgdGhlIGNvcnJlY3QgZ3JvdXAsIGFkZCB0aGUgbWV0aG9kLgorICAgIGlmIGlzaW5zdGFuY2UoZ3JvdXAsIGdyb3VwX2NsYXNzKSBhbmQgZ3JvdXAuZ3JvdXBfbmFtZSgpID09IGdyb3VwX25hbWU6CisgICAgICBncm91cC5BZGRNZXRob2Qoc2VsZikKKyAgICAgIHJldHVybiBzZWxmCisKKyAgICAjIENyZWF0ZSBhIG5ldyBncm91cCBhbmQgYWRkIHRoZSBtZXRob2QuCisgICAgbmV3X2dyb3VwID0gZ3JvdXBfY2xhc3MoZ3JvdXBfbmFtZSkKKyAgICBuZXdfZ3JvdXAuQWRkTWV0aG9kKHNlbGYpCisgICAgc2VsZi5fY2FsbF9xdWV1ZS5hcHBlbmQobmV3X2dyb3VwKQorICAgIHJldHVybiBzZWxmCisKKyAgZGVmIEluQW55T3JkZXIoc2VsZiwgZ3JvdXBfbmFtZT0iZGVmYXVsdCIpOgorICAgICIiIk1vdmUgdGhpcyBtZXRob2QgaW50byBhIGdyb3VwIG9mIHVub3JkZXJlZCBjYWxscy4KKworICAgIEEgZ3JvdXAgb2YgdW5vcmRlcmVkIGNhbGxzIG11c3QgYmUgZGVmaW5lZCB0b2dldGhlciwgYW5kIG11c3QgYmUgZXhlY3V0ZWQKKyAgICBpbiBmdWxsIGJlZm9yZSB0aGUgbmV4dCBleHBlY3RlZCBtZXRob2QgY2FuIGJlIGNhbGxlZC4gIFRoZXJlIGNhbiBiZQorICAgIG11bHRpcGxlIGdyb3VwcyB0aGF0IGFyZSBleHBlY3RlZCBzZXJpYWxseSwgaWYgdGhleSBhcmUgZ2l2ZW4KKyAgICBkaWZmZXJlbnQgZ3JvdXAgbmFtZXMuICBUaGUgc2FtZSBncm91cCBuYW1lIGNhbiBiZSByZXVzZWQgaWYgdGhlcmUgaXMgYQorICAgIHN0YW5kYXJkIG1ldGhvZCBjYWxsLCBvciBhIGdyb3VwIHdpdGggYSBkaWZmZXJlbnQgbmFtZSwgc3BsaWNlZCBiZXR3ZWVuCisgICAgdXNhZ2VzLgorCisgICAgQXJnczoKKyAgICAgIGdyb3VwX25hbWU6IHRoZSBuYW1lIG9mIHRoZSB1bm9yZGVyZWQgZ3JvdXAuCisKKyAgICBSZXR1cm5zOgorICAgICAgc2VsZgorICAgICIiIgorICAgIHJldHVybiBzZWxmLl9DaGVja0FuZENyZWF0ZU5ld0dyb3VwKGdyb3VwX25hbWUsIFVub3JkZXJlZEdyb3VwKQorCisgIGRlZiBNdWx0aXBsZVRpbWVzKHNlbGYsIGdyb3VwX25hbWU9ImRlZmF1bHQiKToKKyAgICAiIiJNb3ZlIHRoaXMgbWV0aG9kIGludG8gZ3JvdXAgb2YgY2FsbHMgd2hpY2ggbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KKworICAgIEEgZ3JvdXAgb2YgcmVwZWF0aW5nIGNhbGxzIG11c3QgYmUgZGVmaW5lZCB0b2dldGhlciwgYW5kIG11c3QgYmUgZXhlY3V0ZWQgaW4KKyAgICBmdWxsIGJlZm9yZSB0aGUgbmV4dCBleHBlY3RlZCBtZXRob2QgY2FuIGJlIGNhbGxlZC4KKworICAgIEFyZ3M6CisgICAgICBncm91cF9uYW1lOiB0aGUgbmFtZSBvZiB0aGUgdW5vcmRlcmVkIGdyb3VwLgorCisgICAgUmV0dXJuczoKKyAgICAgIHNlbGYKKyAgICAiIiIKKyAgICByZXR1cm4gc2VsZi5fQ2hlY2tBbmRDcmVhdGVOZXdHcm91cChncm91cF9uYW1lLCBNdWx0aXBsZVRpbWVzR3JvdXApCisKKyAgZGVmIEFuZFJldHVybihzZWxmLCByZXR1cm5fdmFsdWUpOgorICAgICIiIlNldCB0aGUgdmFsdWUgdG8gcmV0dXJuIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorCisgICAgQXJnczoKKyAgICAgICMgcmV0dXJuX3ZhbHVlIGNhbiBiZSBhbnl0aGluZy4KKyAgICAiIiIKKworICAgIHNlbGYuX3JldHVybl92YWx1ZSA9IHJldHVybl92YWx1ZQorICAgIHJldHVybiByZXR1cm5fdmFsdWUKKworICBkZWYgQW5kUmFpc2Uoc2VsZiwgZXhjZXB0aW9uKToKKyAgICAiIiJTZXQgdGhlIGV4Y2VwdGlvbiB0byByYWlzZSB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKworICAgIEFyZ3M6CisgICAgICAjIGV4Y2VwdGlvbjogdGhlIGV4Y2VwdGlvbiB0byByYWlzZSB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgIGV4Y2VwdGlvbjogRXhjZXB0aW9uCisgICAgIiIiCisKKyAgICBzZWxmLl9leGNlcHRpb24gPSBleGNlcHRpb24KKworICBkZWYgV2l0aFNpZGVFZmZlY3RzKHNlbGYsIHNpZGVfZWZmZWN0cyk6CisgICAgIiIiU2V0IHRoZSBzaWRlIGVmZmVjdHMgdGhhdCBhcmUgc2ltdWxhdGVkIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorCisgICAgQXJnczoKKyAgICAgIHNpZGVfZWZmZWN0czogQSBjYWxsYWJsZSB3aGljaCBtb2RpZmllcyB0aGUgcGFyYW1ldGVycyBvciBvdGhlciByZWxldmFudAorICAgICAgICBzdGF0ZSB3aGljaCBhIGdpdmVuIHRlc3QgY2FzZSBkZXBlbmRzIG9uLgorCisgICAgUmV0dXJuczoKKyAgICAgIFNlbGYgZm9yIGNoYWluaW5nIHdpdGggQW5kUmV0dXJuIGFuZCBBbmRSYWlzZS4KKyAgICAiIiIKKyAgICBzZWxmLl9zaWRlX2VmZmVjdHMgPSBzaWRlX2VmZmVjdHMKKyAgICByZXR1cm4gc2VsZgorCitjbGFzcyBDb21wYXJhdG9yOgorICAiIiJCYXNlIGNsYXNzIGZvciBhbGwgTW94IGNvbXBhcmF0b3JzLgorCisgIEEgQ29tcGFyYXRvciBjYW4gYmUgdXNlZCBhcyBhIHBhcmFtZXRlciB0byBhIG1vY2tlZCBtZXRob2Qgd2hlbiB0aGUgZXhhY3QKKyAgdmFsdWUgaXMgbm90IGtub3duLiAgRm9yIGV4YW1wbGUsIHRoZSBjb2RlIHlvdSBhcmUgdGVzdGluZyBtaWdodCBidWlsZCB1cCBhCisgIGxvbmcgU1FMIHN0cmluZyB0aGF0IGlzIHBhc3NlZCB0byB5b3VyIG1vY2sgREFPLiBZb3UncmUgb25seSBpbnRlcmVzdGVkIHRoYXQKKyAgdGhlIElOIGNsYXVzZSBjb250YWlucyB0aGUgcHJvcGVyIHByaW1hcnkga2V5cywgc28geW91IGNhbiBzZXQgeW91ciBtb2NrCisgIHVwIGFzIGZvbGxvd3M6CisKKyAgbW9ja19kYW8uUnVuUXVlcnkoU3RyQ29udGFpbnMoJ0lOICgxLCAyLCA0LCA1KScpKS5BbmRSZXR1cm4obW9ja19yZXN1bHQpCisKKyAgTm93IHdoYXRldmVyIHF1ZXJ5IGlzIHBhc3NlZCBpbiBtdXN0IGNvbnRhaW4gdGhlIHN0cmluZyAnSU4gKDEsIDIsIDQsIDUpJy4KKworICBBIENvbXBhcmF0b3IgbWF5IHJlcGxhY2Ugb25lIG9yIG1vcmUgcGFyYW1ldGVycywgZm9yIGV4YW1wbGU6CisgICMgcmV0dXJuIGF0IG1vc3QgMTAgcm93cworICBtb2NrX2Rhby5SdW5RdWVyeShTdHJDb250YWlucygnU0VMRUNUJyksIDEwKQorCisgIG9yCisKKyAgIyBSZXR1cm4gc29tZSBub24tZGV0ZXJtaW5pc3RpYyBudW1iZXIgb2Ygcm93cworICBtb2NrX2Rhby5SdW5RdWVyeShTdHJDb250YWlucygnU0VMRUNUJyksIElzQShpbnQpKQorICAiIiIKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiU3BlY2lhbCBlcXVhbHMgbWV0aG9kIHRoYXQgYWxsIGNvbXBhcmF0b3JzIG11c3QgaW1wbGVtZW50LgorCisgICAgQXJnczoKKyAgICAgIHJoczogYW55IHB5dGhvbiBvYmplY3QKKyAgICAiIiIKKworICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ21ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuJykKKworICBkZWYgX19lcV9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIHNlbGYuZXF1YWxzKHJocykKKworICBkZWYgX19uZV9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIG5vdCBzZWxmLmVxdWFscyhyaHMpCisKKworY2xhc3MgSXNBKENvbXBhcmF0b3IpOgorICAiIiJUaGlzIGNsYXNzIHdyYXBzIGEgYmFzaWMgUHl0aG9uIHR5cGUgb3IgY2xhc3MuICBJdCBpcyB1c2VkIHRvIHZlcmlmeQorICB0aGF0IGEgcGFyYW1ldGVyIGlzIG9mIHRoZSBnaXZlbiB0eXBlIG9yIGNsYXNzLgorCisgIEV4YW1wbGU6CisgIG1vY2tfZGFvLkNvbm5lY3QoSXNBKERiQ29ubmVjdEluZm8pKQorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgY2xhc3NfbmFtZSk6CisgICAgIiIiSW5pdGlhbGl6ZSBJc0EKKworICAgIEFyZ3M6CisgICAgICBjbGFzc19uYW1lOiBiYXNpYyBweXRob24gdHlwZSBvciBhIGNsYXNzCisgICAgIiIiCisKKyAgICBzZWxmLl9jbGFzc19uYW1lID0gY2xhc3NfbmFtZQorCisgIGRlZiBlcXVhbHMoc2VsZiwgcmhzKToKKyAgICAiIiJDaGVjayB0byBzZWUgaWYgdGhlIFJIUyBpcyBhbiBpbnN0YW5jZSBvZiBjbGFzc19uYW1lLgorCisgICAgQXJnczoKKyAgICAgICMgcmhzOiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSB0ZXN0CisgICAgICByaHM6IG9iamVjdAorCisgICAgUmV0dXJuczoKKyAgICAgIGJvb2wKKyAgICAiIiIKKworICAgIHRyeToKKyAgICAgIHJldHVybiBpc2luc3RhbmNlKHJocywgc2VsZi5fY2xhc3NfbmFtZSkKKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgIyBDaGVjayByYXcgdHlwZXMgaWYgdGhlcmUgd2FzIGEgdHlwZSBlcnJvci4gIFRoaXMgaXMgaGVscGZ1bCBmb3IKKyAgICAgICMgdGhpbmdzIGxpa2UgY1N0cmluZ0lPLlN0cmluZ0lPLgorICAgICAgcmV0dXJuIHR5cGUocmhzKSA9PSB0eXBlKHNlbGYuX2NsYXNzX25hbWUpCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIHJldHVybiBzdHIoc2VsZi5fY2xhc3NfbmFtZSkKKworY2xhc3MgSXNBbG1vc3QoQ29tcGFyYXRvcik6CisgICIiIkNvbXBhcmlzb24gY2xhc3MgdXNlZCB0byBjaGVjayB3aGV0aGVyIGEgcGFyYW1ldGVyIGlzIG5lYXJseSBlcXVhbAorICB0byBhIGdpdmVuIHZhbHVlLiAgR2VuZXJhbGx5IHVzZWZ1bCBmb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4KKworICBFeGFtcGxlIG1vY2tfZGFvLlNldFRpbWVvdXQoKElzQWxtb3N0KDMuOSkpKQorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZmxvYXRfdmFsdWUsIHBsYWNlcz03KToKKyAgICAiIiJJbml0aWFsaXplIElzQWxtb3N0LgorCisgICAgQXJnczoKKyAgICAgIGZsb2F0X3ZhbHVlOiBUaGUgdmFsdWUgZm9yIG1ha2luZyB0aGUgY29tcGFyaXNvbi4KKyAgICAgIHBsYWNlczogVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byByb3VuZCB0by4KKyAgICAiIiIKKworICAgIHNlbGYuX2Zsb2F0X3ZhbHVlID0gZmxvYXRfdmFsdWUKKyAgICBzZWxmLl9wbGFjZXMgPSBwbGFjZXMKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiQ2hlY2sgdG8gc2VlIGlmIFJIUyBpcyBhbG1vc3QgZXF1YWwgdG8gZmxvYXRfdmFsdWUKKworICAgIEFyZ3M6CisgICAgICByaHM6IHRoZSB2YWx1ZSB0byBjb21wYXJlIHRvIGZsb2F0X3ZhbHVlCisKKyAgICBSZXR1cm5zOgorICAgICAgYm9vbAorICAgICIiIgorCisgICAgdHJ5OgorICAgICAgcmV0dXJuIHJvdW5kKHJocy1zZWxmLl9mbG9hdF92YWx1ZSwgc2VsZi5fcGxhY2VzKSA9PSAwCisgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICMgVGhpcyBpcyBwcm9iYWJseSBiZWNhdXNlIGVpdGhlciBmbG9hdF92YWx1ZSBvciByaHMgaXMgbm90IGEgbnVtYmVyLgorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIHJldHVybiBzdHIoc2VsZi5fZmxvYXRfdmFsdWUpCisKK2NsYXNzIFN0ckNvbnRhaW5zKENvbXBhcmF0b3IpOgorICAiIiJDb21wYXJpc29uIGNsYXNzIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhIHN1YnN0cmluZyBleGlzdHMgaW4gYQorICBzdHJpbmcgcGFyYW1ldGVyLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGluIG1vY2tpbmcgYSBkYXRhYmFzZSB3aXRoIFNRTAorICBwYXNzZWQgaW4gYXMgYSBzdHJpbmcgcGFyYW1ldGVyLCBmb3IgZXhhbXBsZS4KKworICBFeGFtcGxlOgorICBtb2NrX2Rhby5SdW5RdWVyeShTdHJDb250YWlucygnSU4gKDEsIDIsIDQsIDUpJykpLkFuZFJldHVybihtb2NrX3Jlc3VsdCkKKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHNlYXJjaF9zdHJpbmcpOgorICAgICIiIkluaXRpYWxpemUuCisKKyAgICBBcmdzOgorICAgICAgIyBzZWFyY2hfc3RyaW5nOiB0aGUgc3RyaW5nIHlvdSBhcmUgc2VhcmNoaW5nIGZvcgorICAgICAgc2VhcmNoX3N0cmluZzogc3RyCisgICAgIiIiCisKKyAgICBzZWxmLl9zZWFyY2hfc3RyaW5nID0gc2VhcmNoX3N0cmluZworCisgIGRlZiBlcXVhbHMoc2VsZiwgcmhzKToKKyAgICAiIiJDaGVjayB0byBzZWUgaWYgdGhlIHNlYXJjaF9zdHJpbmcgaXMgY29udGFpbmVkIGluIHRoZSByaHMgc3RyaW5nLgorCisgICAgQXJnczoKKyAgICAgICMgcmhzOiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSB0ZXN0CisgICAgICByaHM6IG9iamVjdAorCisgICAgUmV0dXJuczoKKyAgICAgIGJvb2wKKyAgICAiIiIKKworICAgIHRyeToKKyAgICAgIHJldHVybiByaHMuZmluZChzZWxmLl9zZWFyY2hfc3RyaW5nKSA+IC0xCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgIHJldHVybiBGYWxzZQorCisgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICByZXR1cm4gJzxzdHIgY29udGFpbmluZyBcJyVzXCc+JyAlIHNlbGYuX3NlYXJjaF9zdHJpbmcKKworCitjbGFzcyBSZWdleChDb21wYXJhdG9yKToKKyAgIiIiQ2hlY2tzIGlmIGEgc3RyaW5nIG1hdGNoZXMgYSByZWd1bGFyIGV4cHJlc3Npb24uCisKKyAgVGhpcyB1c2VzIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHRvIGRldGVybWluZSBlcXVhbGl0eS4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdHRlcm4sIGZsYWdzPTApOgorICAgICIiIkluaXRpYWxpemUuCisKKyAgICBBcmdzOgorICAgICAgIyBwYXR0ZXJuIGlzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvcgorICAgICAgcGF0dGVybjogc3RyCisgICAgICAjIGZsYWdzIHBhc3NlZCB0byByZS5jb21waWxlIGZ1bmN0aW9uIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQKKyAgICAgIGZsYWdzOiBpbnQKKyAgICAiIiIKKworICAgIHNlbGYucmVnZXggPSByZS5jb21waWxlKHBhdHRlcm4sIGZsYWdzPWZsYWdzKQorCisgIGRlZiBlcXVhbHMoc2VsZiwgcmhzKToKKyAgICAiIiJDaGVjayB0byBzZWUgaWYgcmhzIG1hdGNoZXMgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCisKKyAgICBSZXR1cm5zOgorICAgICAgYm9vbAorICAgICIiIgorCisgICAgcmV0dXJuIHNlbGYucmVnZXguc2VhcmNoKHJocykgaXMgbm90IE5vbmUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcyA9ICc8cmVndWxhciBleHByZXNzaW9uIFwnJXNcJycgJSBzZWxmLnJlZ2V4LnBhdHRlcm4KKyAgICBpZiBzZWxmLnJlZ2V4LmZsYWdzOgorICAgICAgcyArPSAnLCBmbGFncz0lZCcgJSBzZWxmLnJlZ2V4LmZsYWdzCisgICAgcyArPSAnPicKKyAgICByZXR1cm4gcworCisKK2NsYXNzIEluKENvbXBhcmF0b3IpOgorICAiIiJDaGVja3Mgd2hldGhlciBhbiBpdGVtIChvciBrZXkpIGlzIGluIGEgbGlzdCAob3IgZGljdCkgcGFyYW1ldGVyLgorCisgIEV4YW1wbGU6CisgIG1vY2tfZGFvLkdldFVzZXJzSW5mbyhJbignZXhwZWN0ZWRVc2VyTmFtZScpKS5BbmRSZXR1cm4obW9ja19yZXN1bHQpCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXkpOgorICAgICIiIkluaXRpYWxpemUuCisKKyAgICBBcmdzOgorICAgICAgIyBrZXkgaXMgYW55IHRoaW5nIHRoYXQgY291bGQgYmUgaW4gYSBsaXN0IG9yIGEga2V5IGluIGEgZGljdAorICAgICIiIgorCisgICAgc2VsZi5fa2V5ID0ga2V5CisKKyAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgorICAgICIiIkNoZWNrIHRvIHNlZSB3aGV0aGVyIGtleSBpcyBpbiByaHMuCisKKyAgICBBcmdzOgorICAgICAgcmhzOiBkaWN0CisKKyAgICBSZXR1cm5zOgorICAgICAgYm9vbAorICAgICIiIgorCisgICAgcmV0dXJuIHNlbGYuX2tleSBpbiByaHMKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuICc8c2VxdWVuY2Ugb3IgbWFwIGNvbnRhaW5pbmcgXCclc1wnPicgJSBzZWxmLl9rZXkKKworCitjbGFzcyBDb250YWluc0tleVZhbHVlKENvbXBhcmF0b3IpOgorICAiIiJDaGVja3Mgd2hldGhlciBhIGtleS92YWx1ZSBwYWlyIGlzIGluIGEgZGljdCBwYXJhbWV0ZXIuCisKKyAgRXhhbXBsZToKKyAgbW9ja19kYW8uVXBkYXRlVXNlcnMoQ29udGFpbnNLZXlWYWx1ZSgnc3RldmVwbScsIHN0ZXZlcG1fdXNlcl9pbmZvKSkKKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICIiIkluaXRpYWxpemUuCisKKyAgICBBcmdzOgorICAgICAgIyBrZXk6IGEga2V5IGluIGEgZGljdAorICAgICAgIyB2YWx1ZTogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUKKyAgICAiIiIKKworICAgIHNlbGYuX2tleSA9IGtleQorICAgIHNlbGYuX3ZhbHVlID0gdmFsdWUKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4ga2V5L3ZhbHVlIHBhaXIgaXMgaW4gdGhlIHJocyBkaWN0LgorCisgICAgUmV0dXJuczoKKyAgICAgIGJvb2wKKyAgICAiIiIKKworICAgIHRyeToKKyAgICAgIHJldHVybiByaHNbc2VsZi5fa2V5XSA9PSBzZWxmLl92YWx1ZQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICByZXR1cm4gRmFsc2UKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuICc8bWFwIGNvbnRhaW5pbmcgdGhlIGVudHJ5IFwnJXM6ICVzXCc+JyAlIChzZWxmLl9rZXksIHNlbGYuX3ZhbHVlKQorCisKK2NsYXNzIFNhbWVFbGVtZW50c0FzKENvbXBhcmF0b3IpOgorICAiIiJDaGVja3Mgd2hldGhlciBpdGVyYWJsZXMgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cyAoaWdub3Jpbmcgb3JkZXIpLgorCisgIEV4YW1wbGU6CisgIG1vY2tfZGFvLlByb2Nlc3NVc2VycyhTYW1lRWxlbWVudHNBcygnc3RldmVwbScsICdzYWxvbWFraScpKQorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZXhwZWN0ZWRfc2VxKToKKyAgICAiIiJJbml0aWFsaXplLgorCisgICAgQXJnczoKKyAgICAgIGV4cGVjdGVkX3NlcTogYSBzZXF1ZW5jZQorICAgICIiIgorCisgICAgc2VsZi5fZXhwZWN0ZWRfc2VxID0gZXhwZWN0ZWRfc2VxCisKKyAgZGVmIGVxdWFscyhzZWxmLCBhY3R1YWxfc2VxKToKKyAgICAiIiJDaGVjayB0byBzZWUgd2hldGhlciBhY3R1YWxfc2VxIGhhcyBzYW1lIGVsZW1lbnRzIGFzIGV4cGVjdGVkX3NlcS4KKworICAgIEFyZ3M6CisgICAgICBhY3R1YWxfc2VxOiBzZXF1ZW5jZQorCisgICAgUmV0dXJuczoKKyAgICAgIGJvb2wKKyAgICAiIiIKKworICAgIHRyeToKKyAgICAgIGV4cGVjdGVkID0gZGljdChbKGVsZW1lbnQsIE5vbmUpIGZvciBlbGVtZW50IGluIHNlbGYuX2V4cGVjdGVkX3NlcV0pCisgICAgICBhY3R1YWwgPSBkaWN0KFsoZWxlbWVudCwgTm9uZSkgZm9yIGVsZW1lbnQgaW4gYWN0dWFsX3NlcV0pCisgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICMgRmFsbCBiYWNrIHRvIHNsb3dlciBsaXN0LWNvbXBhcmUgaWYgYW55IG9mIHRoZSBvYmplY3RzIGFyZSB1bmhhc2hhYmxlLgorICAgICAgZXhwZWN0ZWQgPSBsaXN0KHNlbGYuX2V4cGVjdGVkX3NlcSkKKyAgICAgIGFjdHVhbCA9IGxpc3QoYWN0dWFsX3NlcSkKKyAgICAgIGV4cGVjdGVkLnNvcnQoKQorICAgICAgYWN0dWFsLnNvcnQoKQorICAgIHJldHVybiBleHBlY3RlZCA9PSBhY3R1YWwKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuICc8c2VxdWVuY2Ugd2l0aCBzYW1lIGVsZW1lbnRzIGFzIFwnJXNcJz4nICUgc2VsZi5fZXhwZWN0ZWRfc2VxCisKKworY2xhc3MgQW5kKENvbXBhcmF0b3IpOgorICAiIiJFdmFsdWF0ZXMgb25lIG9yIG1vcmUgQ29tcGFyYXRvcnMgb24gUkhTIGFuZCByZXR1cm5zIGFuIEFORCBvZiB0aGUgcmVzdWx0cy4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAiIiJJbml0aWFsaXplLgorCisgICAgQXJnczoKKyAgICAgICphcmdzOiBPbmUgb3IgbW9yZSBDb21wYXJhdG9yCisgICAgIiIiCisKKyAgICBzZWxmLl9jb21wYXJhdG9ycyA9IGFyZ3MKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiQ2hlY2tzIHdoZXRoZXIgYWxsIENvbXBhcmF0b3JzIGFyZSBlcXVhbCB0byByaHMuCisKKyAgICBBcmdzOgorICAgICAgIyByaHM6IGNhbiBiZSBhbnl0aGluZworCisgICAgUmV0dXJuczoKKyAgICAgIGJvb2wKKyAgICAiIiIKKworICAgIGZvciBjb21wYXJhdG9yIGluIHNlbGYuX2NvbXBhcmF0b3JzOgorICAgICAgaWYgbm90IGNvbXBhcmF0b3IuZXF1YWxzKHJocyk6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgcmV0dXJuIFRydWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuICc8QU5EICVzPicgJSBzdHIoc2VsZi5fY29tcGFyYXRvcnMpCisKKworY2xhc3MgT3IoQ29tcGFyYXRvcik6CisgICIiIkV2YWx1YXRlcyBvbmUgb3IgbW9yZSBDb21wYXJhdG9ycyBvbiBSSFMgYW5kIHJldHVybnMgYW4gT1Igb2YgdGhlIHJlc3VsdHMuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgIiIiSW5pdGlhbGl6ZS4KKworICAgIEFyZ3M6CisgICAgICAqYXJnczogT25lIG9yIG1vcmUgTW94IGNvbXBhcmF0b3JzCisgICAgIiIiCisKKyAgICBzZWxmLl9jb21wYXJhdG9ycyA9IGFyZ3MKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiQ2hlY2tzIHdoZXRoZXIgYW55IENvbXBhcmF0b3IgaXMgZXF1YWwgdG8gcmhzLgorCisgICAgQXJnczoKKyAgICAgICMgcmhzOiBjYW4gYmUgYW55dGhpbmcKKworICAgIFJldHVybnM6CisgICAgICBib29sCisgICAgIiIiCisKKyAgICBmb3IgY29tcGFyYXRvciBpbiBzZWxmLl9jb21wYXJhdG9yczoKKyAgICAgIGlmIGNvbXBhcmF0b3IuZXF1YWxzKHJocyk6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICByZXR1cm4gRmFsc2UKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuICc8T1IgJXM+JyAlIHN0cihzZWxmLl9jb21wYXJhdG9ycykKKworCitjbGFzcyBGdW5jKENvbXBhcmF0b3IpOgorICAiIiJDYWxsIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgdmVyaWZ5IHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluIGlzIGNvcnJlY3QuCisKKyAgWW91IG1heSBuZWVkIHRoZSBhYmlsaXR5IHRvIHBlcmZvcm0gbW9yZSBhZHZhbmNlZCBvcGVyYXRpb25zIG9uIHRoZSBwYXJhbWV0ZXIKKyAgaW4gb3JkZXIgdG8gdmFsaWRhdGUgaXQuICBZb3UgY2FuIHVzZSB0aGlzIHRvIGhhdmUgYSBjYWxsYWJsZSB2YWxpZGF0ZSBhbnkKKyAgcGFyYW1ldGVyLiBUaGUgY2FsbGFibGUgc2hvdWxkIHJldHVybiBlaXRoZXIgVHJ1ZSBvciBGYWxzZS4KKworCisgIEV4YW1wbGU6CisKKyAgZGVmIG15UGFyYW1WYWxpZGF0b3IocGFyYW0pOgorICAgICMgQWR2YW5jZWQgbG9naWMgaGVyZQorICAgIHJldHVybiBUcnVlCisKKyAgbW9ja19kYW8uRG9Tb21ldGhpbmcoRnVuYyhteVBhcmFtVmFsaWRhdG9yKSwgdHJ1ZSkKKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMpOgorICAgICIiIkluaXRpYWxpemUuCisKKyAgICBBcmdzOgorICAgICAgZnVuYzogY2FsbGFibGUgdGhhdCB0YWtlcyBvbmUgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgYm9vbAorICAgICIiIgorCisgICAgc2VsZi5fZnVuYyA9IGZ1bmMKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiVGVzdCB3aGV0aGVyIHJocyBwYXNzZXMgdGhlIGZ1bmN0aW9uIHRlc3QuCisKKyAgICByaHMgaXMgcGFzc2VkIGludG8gZnVuYy4KKworICAgIEFyZ3M6CisgICAgICByaHM6IGFueSBweXRob24gb2JqZWN0CisKKyAgICBSZXR1cm5zOgorICAgICAgdGhlIHJlc3VsdCBvZiBmdW5jKHJocykKKyAgICAiIiIKKworICAgIHJldHVybiBzZWxmLl9mdW5jKHJocykKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuIHN0cihzZWxmLl9mdW5jKQorCisKK2NsYXNzIElnbm9yZUFyZyhDb21wYXJhdG9yKToKKyAgIiIiSWdub3JlIGFuIGFyZ3VtZW50LgorCisgIFRoaXMgY2FuIGJlIHVzZWQgd2hlbiB3ZSBkb24ndCBjYXJlIGFib3V0IGFuIGFyZ3VtZW50IG9mIGEgbWV0aG9kIGNhbGwuCisKKyAgRXhhbXBsZToKKyAgIyBDaGVjayBpZiBDYXN0TWFnaWMgaXMgY2FsbGVkIHdpdGggMyBhcyBmaXJzdCBhcmcgYW5kICdkaXNhcHBlYXInIGFzIHRoaXJkLgorICBteW1vY2suQ2FzdE1hZ2ljKDMsIElnbm9yZUFyZygpLCAnZGlzYXBwZWFyJykKKyAgIiIiCisKKyAgZGVmIGVxdWFscyhzZWxmLCB1bnVzZWRfcmhzKToKKyAgICAiIiJJZ25vcmVzIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBUcnVlLgorCisgICAgQXJnczoKKyAgICAgIHVudXNlZF9yaHM6IGFueSBweXRob24gb2JqZWN0CisKKyAgICBSZXR1cm5zOgorICAgICAgYWx3YXlzIHJldHVybnMgVHJ1ZQorICAgICIiIgorCisgICAgcmV0dXJuIFRydWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuICc8SWdub3JlQXJnPicKKworCitjbGFzcyBNZXRob2RHcm91cChvYmplY3QpOgorICAiIiJCYXNlIGNsYXNzIGNvbnRhaW5pbmcgY29tbW9uIGJlaGF2aW91ciBmb3IgTWV0aG9kR3JvdXBzLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBncm91cF9uYW1lKToKKyAgICBzZWxmLl9ncm91cF9uYW1lID0gZ3JvdXBfbmFtZQorCisgIGRlZiBncm91cF9uYW1lKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9ncm91cF9uYW1lCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgcmV0dXJuICc8JXMgIiVzIj4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLl9ncm91cF9uYW1lKQorCisgIGRlZiBBZGRNZXRob2Qoc2VsZiwgbW9ja19tZXRob2QpOgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgTWV0aG9kQ2FsbGVkKHNlbGYsIG1vY2tfbWV0aG9kKToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIElzU2F0aXNmaWVkKHNlbGYpOgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworY2xhc3MgVW5vcmRlcmVkR3JvdXAoTWV0aG9kR3JvdXApOgorICAiIiJVbm9yZGVyZWRHcm91cCBob2xkcyBhIHNldCBvZiBtZXRob2QgY2FsbHMgdGhhdCBtYXkgb2NjdXIgaW4gYW55IG9yZGVyLgorCisgIFRoaXMgY29uc3RydWN0IGlzIGhlbHBmdWwgZm9yIG5vbi1kZXRlcm1pbmlzdGljIGV2ZW50cywgc3VjaCBhcyBpdGVyYXRpbmcKKyAgb3ZlciB0aGUga2V5cyBvZiBhIGRpY3QuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBncm91cF9uYW1lKToKKyAgICBzdXBlcihVbm9yZGVyZWRHcm91cCwgc2VsZikuX19pbml0X18oZ3JvdXBfbmFtZSkKKyAgICBzZWxmLl9tZXRob2RzID0gW10KKworICBkZWYgQWRkTWV0aG9kKHNlbGYsIG1vY2tfbWV0aG9kKToKKyAgICAiIiJBZGQgYSBtZXRob2QgdG8gdGhpcyBncm91cC4KKworICAgIEFyZ3M6CisgICAgICBtb2NrX21ldGhvZDogQSBtb2NrIG1ldGhvZCB0byBiZSBhZGRlZCB0byB0aGlzIGdyb3VwLgorICAgICIiIgorCisgICAgc2VsZi5fbWV0aG9kcy5hcHBlbmQobW9ja19tZXRob2QpCisKKyAgZGVmIE1ldGhvZENhbGxlZChzZWxmLCBtb2NrX21ldGhvZCk6CisgICAgIiIiUmVtb3ZlIGEgbWV0aG9kIGNhbGwgZnJvbSB0aGUgZ3JvdXAuCisKKyAgICBJZiB0aGUgbWV0aG9kIGlzIG5vdCBpbiB0aGUgc2V0LCBhbiBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yIHdpbGwgYmUKKyAgICByYWlzZWQuCisKKyAgICBBcmdzOgorICAgICAgbW9ja19tZXRob2Q6IGEgbW9jayBtZXRob2QgdGhhdCBzaG91bGQgYmUgZXF1YWwgdG8gYSBtZXRob2QgaW4gdGhlIGdyb3VwLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBtb2NrIG1ldGhvZCBmcm9tIHRoZSBncm91cAorCisgICAgUmFpc2VzOgorICAgICAgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvciBpZiB0aGUgbW9ja19tZXRob2Qgd2FzIG5vdCBpbiB0aGUgZ3JvdXAuCisgICAgIiIiCisKKyAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBleGlzdHMsIGFuZCBpZiBzbywgcmVtb3ZlIGl0IGZyb20gdGhlIHNldAorICAgICMgYW5kIHJldHVybiBpdC4KKyAgICBmb3IgbWV0aG9kIGluIHNlbGYuX21ldGhvZHM6CisgICAgICBpZiBtZXRob2QgPT0gbW9ja19tZXRob2Q6CisgICAgICAgICMgUmVtb3ZlIHRoZSBjYWxsZWQgbW9ja19tZXRob2QgaW5zdGVhZCBvZiB0aGUgbWV0aG9kIGluIHRoZSBncm91cC4KKyAgICAgICAgIyBUaGUgY2FsbGVkIG1ldGhvZCB3aWxsIG1hdGNoIGFueSBjb21wYXJhdG9ycyB3aGVuIGVxdWFsaXR5IGlzIGNoZWNrZWQKKyAgICAgICAgIyBkdXJpbmcgcmVtb3ZhbC4gIFRoZSBtZXRob2QgaW4gdGhlIGdyb3VwIGNvdWxkIHBhc3MgYSBjb21wYXJhdG9yIHRvCisgICAgICAgICMgYW5vdGhlciBjb21wYXJhdG9yIGR1cmluZyB0aGUgZXF1YWxpdHkgY2hlY2suCisgICAgICAgIHNlbGYuX21ldGhvZHMucmVtb3ZlKG1vY2tfbWV0aG9kKQorCisgICAgICAgICMgSWYgdGhpcyBncm91cCBpcyBub3QgZW1wdHksIHB1dCBpdCBiYWNrIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KKyAgICAgICAgaWYgbm90IHNlbGYuSXNTYXRpc2ZpZWQoKToKKyAgICAgICAgICBtb2NrX21ldGhvZC5fY2FsbF9xdWV1ZS5hcHBlbmRsZWZ0KHNlbGYpCisKKyAgICAgICAgcmV0dXJuIHNlbGYsIG1ldGhvZAorCisgICAgcmFpc2UgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvcihtb2NrX21ldGhvZCwgc2VsZikKKworICBkZWYgSXNTYXRpc2ZpZWQoc2VsZik6CisgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlcmUgYXJlIG5vdCBhbnkgbWV0aG9kcyBpbiB0aGlzIGdyb3VwLiIiIgorCisgICAgcmV0dXJuIGxlbihzZWxmLl9tZXRob2RzKSA9PSAwCisKKworY2xhc3MgTXVsdGlwbGVUaW1lc0dyb3VwKE1ldGhvZEdyb3VwKToKKyAgIiIiTXVsdGlwbGVUaW1lc0dyb3VwIGhvbGRzIG1ldGhvZHMgdGhhdCBtYXkgYmUgY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMuCisKKyAgTm90ZTogRWFjaCBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZS4KKworICBUaGlzIGlzIGhlbHBmdWwsIGlmIHlvdSBkb24ndCBrbm93IG9yIGNhcmUgaG93IG1hbnkgdGltZXMgYSBtZXRob2QgaXMgY2FsbGVkLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZ3JvdXBfbmFtZSk6CisgICAgc3VwZXIoTXVsdGlwbGVUaW1lc0dyb3VwLCBzZWxmKS5fX2luaXRfXyhncm91cF9uYW1lKQorICAgIHNlbGYuX21ldGhvZHMgPSBzZXQoKQorICAgIHNlbGYuX21ldGhvZHNfY2FsbGVkID0gc2V0KCkKKworICBkZWYgQWRkTWV0aG9kKHNlbGYsIG1vY2tfbWV0aG9kKToKKyAgICAiIiJBZGQgYSBtZXRob2QgdG8gdGhpcyBncm91cC4KKworICAgIEFyZ3M6CisgICAgICBtb2NrX21ldGhvZDogQSBtb2NrIG1ldGhvZCB0byBiZSBhZGRlZCB0byB0aGlzIGdyb3VwLgorICAgICIiIgorCisgICAgc2VsZi5fbWV0aG9kcy5hZGQobW9ja19tZXRob2QpCisKKyAgZGVmIE1ldGhvZENhbGxlZChzZWxmLCBtb2NrX21ldGhvZCk6CisgICAgIiIiUmVtb3ZlIGEgbWV0aG9kIGNhbGwgZnJvbSB0aGUgZ3JvdXAuCisKKyAgICBJZiB0aGUgbWV0aG9kIGlzIG5vdCBpbiB0aGUgc2V0LCBhbiBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yIHdpbGwgYmUKKyAgICByYWlzZWQuCisKKyAgICBBcmdzOgorICAgICAgbW9ja19tZXRob2Q6IGEgbW9jayBtZXRob2QgdGhhdCBzaG91bGQgYmUgZXF1YWwgdG8gYSBtZXRob2QgaW4gdGhlIGdyb3VwLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBtb2NrIG1ldGhvZCBmcm9tIHRoZSBncm91cAorCisgICAgUmFpc2VzOgorICAgICAgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvciBpZiB0aGUgbW9ja19tZXRob2Qgd2FzIG5vdCBpbiB0aGUgZ3JvdXAuCisgICAgIiIiCisKKyAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBleGlzdHMsIGFuZCBpZiBzbyBhZGQgaXQgdG8gdGhlIHNldCBvZgorICAgICMgY2FsbGVkIG1ldGhvZHMuCisKKyAgICBmb3IgbWV0aG9kIGluIHNlbGYuX21ldGhvZHM6CisgICAgICBpZiBtZXRob2QgPT0gbW9ja19tZXRob2Q6CisgICAgICAgIHNlbGYuX21ldGhvZHNfY2FsbGVkLmFkZChtb2NrX21ldGhvZCkKKyAgICAgICAgIyBBbHdheXMgcHV0IHRoaXMgZ3JvdXAgYmFjayBvbiB0b3Agb2YgdGhlIHF1ZXVlLCBiZWNhdXNlIHdlIGRvbid0IGtub3cKKyAgICAgICAgIyB3aGVuIHdlIGFyZSBkb25lLgorICAgICAgICBtb2NrX21ldGhvZC5fY2FsbF9xdWV1ZS5hcHBlbmRsZWZ0KHNlbGYpCisgICAgICAgIHJldHVybiBzZWxmLCBtZXRob2QKKworICAgIGlmIHNlbGYuSXNTYXRpc2ZpZWQoKToKKyAgICAgIG5leHRfbWV0aG9kID0gbW9ja19tZXRob2QuX1BvcE5leHRNZXRob2QoKTsKKyAgICAgIHJldHVybiBuZXh0X21ldGhvZCwgTm9uZQorICAgIGVsc2U6CisgICAgICByYWlzZSBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yKG1vY2tfbWV0aG9kLCBzZWxmKQorCisgIGRlZiBJc1NhdGlzZmllZChzZWxmKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBhbGwgbWV0aG9kcyBpbiB0aGlzIGdyb3VwIGFyZSBjYWxsZWQgYXQgbGVhc3Qgb25jZS4iIiIKKyAgICAjIE5PVEUocHN5Y2hvKTogV2UgY2FuJ3QgdXNlIHRoZSBzaW1wbGUgc2V0IGRpZmZlcmVuY2UgaGVyZSBiZWNhdXNlIHdlIHdhbnQKKyAgICAjIHRvIG1hdGNoIGRpZmZlcmVudCBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lIGUuZy4gSXNBKHN0cikKKyAgICAjIGFuZCBzb21lIHN0cmluZy4gVGhpcyBzb2x1dGlvbiBpcyBPKG5eMikgYnV0IG4gc2hvdWxkIGJlIHNtYWxsLgorICAgIHRtcCA9IHNlbGYuX21ldGhvZHMuY29weSgpCisgICAgZm9yIGNhbGxlZCBpbiBzZWxmLl9tZXRob2RzX2NhbGxlZDoKKyAgICAgIGZvciBleHBlY3RlZCBpbiB0bXA6CisgICAgICAgIGlmIGNhbGxlZCA9PSBleHBlY3RlZDoKKyAgICAgICAgICB0bXAucmVtb3ZlKGV4cGVjdGVkKQorICAgICAgICAgIGlmIG5vdCB0bXA6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgIGJyZWFrCisgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgTW94TWV0YVRlc3RCYXNlKHR5cGUpOgorICAiIiJNZXRhY2xhc3MgdG8gYWRkIG1veCBjbGVhbnVwIGFuZCB2ZXJpZmljYXRpb24gdG8gZXZlcnkgdGVzdC4KKworICBBcyB0aGUgbW94IHVuaXQgdGVzdGluZyBjbGFzcyBpcyBiZWluZyBjb25zdHJ1Y3RlZCAoTW94VGVzdEJhc2Ugb3IgYQorICBzdWJjbGFzcyksIHRoaXMgbWV0YWNsYXNzIHdpbGwgbW9kaWZ5IGFsbCB0ZXN0IGZ1bmN0aW9ucyB0byBjYWxsIHRoZQorICBDbGVhblVwTW94IG1ldGhvZCBvZiB0aGUgdGVzdCBjbGFzcyBhZnRlciB0aGV5IGZpbmlzaC4gVGhpcyBtZWFucyB0aGF0CisgIHVuc3R1YmJpbmcgYW5kIHZlcmlmeWluZyB3aWxsIGhhcHBlbiBmb3IgZXZlcnkgdGVzdCB3aXRoIG5vIGFkZGl0aW9uYWwgY29kZSwKKyAgYW5kIGFueSBmYWlsdXJlcyB3aWxsIHJlc3VsdCBpbiB0ZXN0IGZhaWx1cmVzIGFzIG9wcG9zZWQgdG8gZXJyb3JzLgorICAiIiIKKworICBkZWYgX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywgZCk6CisgICAgdHlwZS5fX2luaXRfXyhjbHMsIG5hbWUsIGJhc2VzLCBkKQorCisgICAgIyBhbHNvIGdldCBhbGwgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgYmFzZSBjbGFzc2VzIHRvIGFjY291bnQKKyAgICAjIGZvciBhIGNhc2Ugd2hlbiB0ZXN0IGNsYXNzIGlzIG5vdCB0aGUgaW1tZWRpYXRlIGNoaWxkIG9mIE1veFRlc3RCYXNlCisgICAgZm9yIGJhc2UgaW4gYmFzZXM6CisgICAgICBmb3IgYXR0cl9uYW1lIGluIGRpcihiYXNlKToKKyAgICAgICAgZFthdHRyX25hbWVdID0gZ2V0YXR0cihiYXNlLCBhdHRyX25hbWUpCisKKyAgICBmb3IgZnVuY19uYW1lLCBmdW5jIGluIGQuaXRlbXMoKToKKyAgICAgIGlmIGZ1bmNfbmFtZS5zdGFydHN3aXRoKCd0ZXN0JykgYW5kIGNhbGxhYmxlKGZ1bmMpOgorICAgICAgICBzZXRhdHRyKGNscywgZnVuY19uYW1lLCBNb3hNZXRhVGVzdEJhc2UuQ2xlYW5VcFRlc3QoY2xzLCBmdW5jKSkKKworICBAc3RhdGljbWV0aG9kCisgIGRlZiBDbGVhblVwVGVzdChjbHMsIGZ1bmMpOgorICAgICIiIkFkZHMgTW94IGNsZWFudXAgY29kZSB0byBhbnkgTW94VGVzdEJhc2UgbWV0aG9kLgorCisgICAgQWx3YXlzIHVuc2V0cyBzdHVicyBhZnRlciBhIHRlc3QuIFdpbGwgdmVyaWZ5IGFsbCBtb2NrcyBmb3IgdGVzdHMgdGhhdAorICAgIG90aGVyd2lzZSBwYXNzLgorCisgICAgQXJnczoKKyAgICAgIGNsczogTW94VGVzdEJhc2Ugb3Igc3ViY2xhc3M7IHRoZSBjbGFzcyB3aG9zZSB0ZXN0IG1ldGhvZCB3ZSBhcmUgYWx0ZXJpbmcuCisgICAgICBmdW5jOiBtZXRob2Q7IHRoZSBtZXRob2Qgb2YgdGhlIE1veFRlc3RCYXNlIHRlc3QgY2xhc3Mgd2Ugd2lzaCB0byBhbHRlci4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgbW9kaWZpZWQgbWV0aG9kLgorICAgICIiIgorICAgIGRlZiBuZXdfbWV0aG9kKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICBtb3hfb2JqID0gZ2V0YXR0cihzZWxmLCAnbW94JywgTm9uZSkKKyAgICAgIGNsZWFudXBfbW94ID0gRmFsc2UKKyAgICAgIGlmIG1veF9vYmogYW5kIGlzaW5zdGFuY2UobW94X29iaiwgTW94KToKKyAgICAgICAgY2xlYW51cF9tb3ggPSBUcnVlCisgICAgICB0cnk6CisgICAgICAgIGZ1bmMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgZmluYWxseToKKyAgICAgICAgaWYgY2xlYW51cF9tb3g6CisgICAgICAgICAgbW94X29iai5VbnNldFN0dWJzKCkKKyAgICAgIGlmIGNsZWFudXBfbW94OgorICAgICAgICBtb3hfb2JqLlZlcmlmeUFsbCgpCisgICAgbmV3X21ldGhvZC5fX25hbWVfXyA9IGZ1bmMuX19uYW1lX18KKyAgICBuZXdfbWV0aG9kLl9fZG9jX18gPSBmdW5jLl9fZG9jX18KKyAgICBuZXdfbWV0aG9kLl9fbW9kdWxlX18gPSBmdW5jLl9fbW9kdWxlX18KKyAgICByZXR1cm4gbmV3X21ldGhvZAorCisKK2NsYXNzIE1veFRlc3RCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgIiIiQ29udmVuaWVuY2UgdGVzdCBjbGFzcyB0byBtYWtlIHN0dWJiaW5nIGVhc2llci4KKworICBTZXRzIHVwIGEgIm1veCIgYXR0cmlidXRlIHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIE1veCAtIGFueSBtb3ggdGVzdHMgd2lsbAorICB3YW50IHRoaXMuIEFsc28gYXV0b21hdGljYWxseSB1bnNldHMgYW55IHN0dWJzIGFuZCB2ZXJpZmllcyB0aGF0IGFsbCBtb2NrCisgIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggdGVzdCwgZWxpbWluYXRpbmcgYm9pbGVycGxhdGUKKyAgY29kZS4KKyAgIiIiCisKKyAgX19tZXRhY2xhc3NfXyA9IE1veE1ldGFUZXN0QmFzZQorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLm1veCA9IE1veCgpCmRpZmYgLS1naXQgYS9weXRob24vcmVsZWFzZS5zaCBiL3B5dGhvbi9yZWxlYXNlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg3ZmNmOGMKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vcmVsZWFzZS5zaApAQCAtMCwwICsxLDEzNyBAQAorIyEvYmluL2Jhc2gKKworc2V0IC1leAorCitmdW5jdGlvbiBnZXRfc291cmNlX3ZlcnNpb24oKSB7CisgIGdyZXAgIl9fdmVyc2lvbl9fID0gJy4qJyIgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9fX2luaXRfXy5weSB8IHNlZCAtciAicy9fX3ZlcnNpb25fXyA9ICcoLiopJy9cMS8iCit9CisKK2Z1bmN0aW9uIHJ1bl9pbnN0YWxsX3Rlc3QoKSB7CisgIGxvY2FsIFZFUlNJT049JDEKKyAgbG9jYWwgUFlUSE9OPSQyCisgIGxvY2FsIFBZUEk9JDMKKworICB2aXJ0dWFsZW52IC1wIGB3aGljaCAkUFlUSE9OYCB0ZXN0LXZlbnYKKworICAjIEludGVudGlvbmFsbHkgcHV0IGEgYnJva2VuIHByb3RvYyBpbiB0aGUgcGF0aCB0byBtYWtlIHN1cmUgaW5zdGFsbGF0aW9uCisgICMgZG9lc24ndCByZXF1aXJlIHByb3RvYyBpbnN0YWxsZWQuCisgIHRvdWNoIHRlc3QtdmVudi9iaW4vcHJvdG9jCisgIGNobW9kICt4IHRlc3QtdmVudi9iaW4vcHJvdG9jCisKKyAgc291cmNlIHRlc3QtdmVudi9iaW4vYWN0aXZhdGUKKyAgKHBpcCBpbnN0YWxsIC1pICR7UFlQSX0gcHJvdG9idWY9PSR7VkVSU0lPTn0gLS1uby1jYWNoZS1kaXIpIHx8IChyZXRyeV9waXBfaW5zdGFsbCAke1BZUEl9ICR7VkVSU0lPTn0pCisgIGRlYWN0aXZhdGUKKyAgcm0gLWZyIHRlc3QtdmVudgorfQorCitmdW5jdGlvbiByZXRyeV9waXBfaW5zdGFsbCgpIHsKKyAgbG9jYWwgUFlQST0kMQorICBsb2NhbCBWRVJTSU9OPSQyCisgIAorICByZWFkIC1wICJwaXAgaW5zdGFsbCBmYWlsZWQsIHBvc3NpYmx5IGR1ZSB0byBkZWxheSBiZXR3ZWVuIHVwbG9hZCBhbmQgYXZhaWxhYmlsaXR5IG9uIHBpcC4gUmV0cnk/IFt5L25dIiAtcgorICBlY2hvCisgIGlmIFtbICEgJFJFUExZID1+IF5bWXldJCBdXTsgdGhlbgorICAgIGV4aXQgMQorICBmaQorCisgIChwaXAgaW5zdGFsbCAtaSAke1BZUEl9IHByb3RvYnVmPT0ke1ZFUlNJT059IC0tbm8tY2FjaGUtZGlyKSB8fCAocmV0cnlfcGlwX2luc3RhbGwgJHtQWVBJfSAke1ZFUlNJT059KQorfQorCisKK1sgJCMgLWx0IDEgXSAmJiB7CisgIGVjaG8gIlVzYWdlOiAkMCBWRVJTSU9OIFsiCisgIGVjaG8gIiIKKyAgZWNobyAiRXhhbXBsZXM6IgorICBlY2hvICIgIFRlc3QgMy4zLjAgcmVsZWFzZSB1c2luZyB2ZXJzaW9uIG51bWJlciAzLjMuMC5kZXYxOiIKKyAgZWNobyAiICAgICQwIDMuMC4wIGRldjEiCisgIGVjaG8gIiAgQWN0dWFsbHkgcmVsZWFzZSAzLjMuMCB0byBQeVBJOiIKKyAgZWNobyAiICAgICQwIDMuMy4wIgorICBleGl0IDEKK30KK1ZFUlNJT049JDEKK0RFVj0kMgorCisjIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gYSBwcm90b2J1ZiBzb3VyY2UgdHJlZS4KK1sgLWYgInB5dGhvbi9nb29nbGUvcHJvdG9idWYvX19pbml0X18ucHkiIF0gfHwgeworICBlY2hvICJUaGlzIHNjcmlwdCBtdXN0IGJlIHJhbiB1bmRlciByb290IG9mIHByb3RvYnVmIHNvdXJjZSB0cmVlLiIKKyAgZXhpdCAxCit9CisKKyMgTWFrZSBzdXJlIGFsbCBmaWxlcyBhcmUgd29ybGQtcmVhZGFibGUuCitmaW5kIHB5dGhvbiAtdHlwZSBkIC1leGVjIGNobW9kIGErcixhK3gge30gKworZmluZCBweXRob24gLXR5cGUgZiAtZXhlYyBjaG1vZCBhK3Ige30gKwordW1hc2sgMDAyMgorCisjIENoZWNrIHRoYXQgdGhlIHN1cHBsaWVkIHZlcnNpb24gbnVtYmVyIG1hdGNoZXMgd2hhdCdzIGluc2lkZSB0aGUgc291cmNlIGNvZGUuCitTT1VSQ0VfVkVSU0lPTj1gZ2V0X3NvdXJjZV92ZXJzaW9uYAorCitbICIke1ZFUlNJT059IiA9PSAiJHtTT1VSQ0VfVkVSU0lPTn0iIC1vICIke1ZFUlNJT059LiR7REVWfSIgPT0gIiR7U09VUkNFX1ZFUlNJT059IiBdIHx8IHsKKyAgZWNobyAiVmVyc2lvbiBudW1iZXIgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgJHtWRVJTSU9OfSBkb2Vzbid0IG1hdGNoIgorICBlY2hvICJ0aGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGluIHRoZSBzb3VyY2UgY29kZTogJHtTT1VSQ0VfVkVSU0lPTn0iCisgIGV4aXQgMQorfQorCitURVNUSU5HX09OTFk9MQorVEVTVElOR19WRVJTSU9OPSR7VkVSU0lPTn0uJHtERVZ9CitpZiBbIC16ICIke0RFVn0iIF07IHRoZW4KKyAgcmVhZCAtcCAiWW91IGFyZSByZWxlYXNpbmcgJHtWRVJTSU9OfSB0byBQeVBJLiBBcmUgeW91IHN1cmU/IFt5L25dIiAtcgorICBlY2hvCisgIGlmIFtbICEgJFJFUExZID1+IF5bWXldJCBdXTsgdGhlbgorICAgIGV4aXQgMQorICBmaQorICBURVNUSU5HX09OTFk9MAorICBURVNUSU5HX1ZFUlNJT049JHtWRVJTSU9OfQorZWxzZQorICAjIFVzZSBkZXYgdmVyc2lvbiBudW1iZXIgZm9yIHRlc3RpbmcuCisgIHNlZCAtaSAtciAicy9fX3ZlcnNpb25fXyA9ICcuKicvX192ZXJzaW9uX18gPSAnJHtWRVJTSU9OfS4ke0RFVn0nLyIgcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9fX2luaXRfXy5weQorZmkKKworIyBDb3B5IExJQ0VOU0UKK2NwIExJQ0VOU0UgcHl0aG9uL0xJQ0VOU0UKKworY2QgcHl0aG9uCisKKyMgUnVuIHRlc3RzIGxvY2FsbHkuCitweXRob24zIHNldHVwLnB5IGJ1aWxkCitweXRob24zIHNldHVwLnB5IHRlc3QKKworIyBEZXBsb3kgc291cmNlIHBhY2thZ2UgdG8gdGVzdGluZyBQeVBJCitweXRob24zIHNldHVwLnB5IHNkaXN0Cit0d2luZSB1cGxvYWQgLS1za2lwLWV4aXN0aW5nIC1yIHRlc3RweXBpIC11IHByb3RvYnVmLXdoZWVsLXRlc3QgZGlzdC8qCisKKyMgU2xlZXAgdG8gYWxsb3cgdGltZSBmb3IgZGlzdHJpYnV0aW9uIHRvIGJlIGF2YWlsYWJsZSBvbiBwaXAuCitzbGVlcCA1bQorCisjIFRlc3QgbG9jYWxseS4KK3J1bl9pbnN0YWxsX3Rlc3QgJHtURVNUSU5HX1ZFUlNJT059IHB5dGhvbjMgaHR0cHM6Ly90ZXN0LnB5cGkub3JnL3NpbXBsZQorCisjIERlcGxveSBlZ2cvd2hlZWwgcGFja2FnZXMgdG8gdGVzdGluZyBQeVBJIGFuZCB0ZXN0IGFnYWluLgorcHl0aG9uMyBzZXR1cC5weSBjbGVhbiBidWlsZCBiZGlzdF93aGVlbAordHdpbmUgdXBsb2FkIC0tc2tpcC1leGlzdGluZyAtciB0ZXN0cHlwaSAtdSBwcm90b2J1Zi13aGVlbC10ZXN0IGRpc3QvKgorc2xlZXAgNW0KK3J1bl9pbnN0YWxsX3Rlc3QgJHtURVNUSU5HX1ZFUlNJT059IHB5dGhvbjMgaHR0cHM6Ly90ZXN0LnB5cGkub3JnL3NpbXBsZQorCitlY2hvICJBbGwgaW5zdGFsbCB0ZXN0cyBoYXZlIHBhc3NlZCB1c2luZyB0ZXN0aW5nIFB5UEkuIgorCitpZiBbICRURVNUSU5HX09OTFkgLWVxIDAgXTsgdGhlbgorICByZWFkIC1wICJQdWJsaXNoIHRvIFB5UEk/IFt5L25dIiAtcgorICBlY2hvCisgIGlmIFtbICEgJFJFUExZID1+IF5bWXldJCBdXTsgdGhlbgorICAgIGV4aXQgMQorICBmaQorICBlY2hvICJQdWJsaXNoaW5nIHRvIFB5UEkuLi4iCisgICMgQmUgc3VyZSB0byBydW4gYnVpbGQgYmVmb3JlIHNkaXN0LCBiZWNhdXNlIG90aGVyd2lzZSBzZGlzdCB3aWxsIG5vdCBpbmNsdWRlCisgICMgd2VsbC1rbm93biB0eXBlcy4KKyAgcHl0aG9uMyBzZXR1cC5weSBjbGVhbiBidWlsZCBzZGlzdAorICB0d2luZSB1cGxvYWQgLS1za2lwLWV4aXN0aW5nIC11IHByb3RvYnVmLXBhY2thZ2VzIGRpc3QvKgorICAjIEJlIHN1cmUgdG8gcnVuIGNsZWFuIGJlZm9yZSBiZGlzdF94eHgsIGJlY2F1c2Ugb3RoZXJ3aXNlIGJkaXN0X3h4eCB3aWxsCisgICMgaW5jbHVkZSBmaWxlcyB5b3UgbWF5IG5vdCB3YW50IGluIHRoZSBwYWNrYWdlLiBFLmcuLCBpZiB5b3UgaGF2ZSBidWlsdAorICAjIGFuZCB0ZXN0ZWQgd2l0aCAtLWNwcF9pbXBsZW1lbmF0aW9uLCBiZGlzdF94eHggd2lsbCBpbmNsdWRlIHRoZSBfbWVzc2FnZS5zbworICAjIGZpbGUgZXZlbiB3aGVuIHlvdSBubyBsb25nZXIgcGFzcyB0aGUgLS1jcHBfaW1wbGVtZW5hdGlvbiBmbGFnLiBTZWU6CisgICMgICBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2lzc3Vlcy8zMDQyCisgIHB5dGhvbjMgc2V0dXAucHkgY2xlYW4gYnVpbGQgYmRpc3Rfd2hlZWwKKyAgdHdpbmUgdXBsb2FkIC0tc2tpcC1leGlzdGluZyAtdSBwcm90b2J1Zi1wYWNrYWdlcyBkaXN0LyoKK2Vsc2UKKyAgIyBTZXQgdGhlIHZlcnNpb24gbnVtYmVyIGJhY2sgKGkuZS4sIHJlbW92ZSBkZXYgc3VmZml4KS4KKyAgc2VkIC1pIC1yICJzL19fdmVyc2lvbl9fID0gJy4qJy9fX3ZlcnNpb25fXyA9ICcke1ZFUlNJT059Jy8iIGdvb2dsZS9wcm90b2J1Zi9fX2luaXRfXy5weQorZmkKZGlmZiAtLWdpdCBhL3B5dGhvbi9zZXR1cC5jZmcgYi9weXRob24vc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOWFjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMiBAQAorW2JkaXN0X3doZWVsXQordW5pdmVyc2FsID0gMQpkaWZmIC0tZ2l0IGEvcHl0aG9uL3NldHVwLnB5IGIvcHl0aG9uL3NldHVwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNiYjlhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vc2V0dXAucHkKQEAgLTAsMCArMSwzNTggQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyMKKyMgU2VlIFJFQURNRSBmb3IgdXNhZ2UgaW5zdHJ1Y3Rpb25zLgorCisjIHB5bGludDpkaXNhYmxlPW1pc3NpbmctbW9kdWxlLWRvY3N0cmluZworIyBweWxpbnQ6ZGlzYWJsZT1nLWJhZC1pbXBvcnQtb3JkZXIKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCB1dGlsCitpbXBvcnQgZm5tYXRjaAoraW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHBrZ19yZXNvdXJjZXMKK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzeXNjb25maWcKKworIyBweWxpbnQ6ZGlzYWJsZT1nLWltcG9ydGluZy1tZW1iZXIKKyMgcHlsaW50OmRpc2FibGU9Zy1tdWx0aXBsZS1pbXBvcnQKKworIyBXZSBtdXN0IHVzZSBzZXR1cHRvb2xzLCBub3QgZGlzdHV0aWxzLCBiZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHRoZQorIyBuYW1lc3BhY2VfcGFja2FnZXMgb3B0aW9uIGZvciB0aGUgImdvb2dsZSIgcGFja2FnZS4KK2Zyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbiwgZmluZF9wYWNrYWdlcworCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0IGFzIF9idWlsZF9leHQKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfcHkgaW1wb3J0IGJ1aWxkX3B5IGFzIF9idWlsZF9weQorZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5jbGVhbiBpbXBvcnQgY2xlYW4gYXMgX2NsZWFuCitmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgZmluZF9leGVjdXRhYmxlCisKKyMgRmluZCB0aGUgUHJvdG9jb2wgQ29tcGlsZXIuCitpZiAnUFJPVE9DJyBpbiBvcy5lbnZpcm9uIGFuZCBvcy5wYXRoLmV4aXN0cyhvcy5lbnZpcm9uWydQUk9UT0MnXSk6CisgIHByb3RvYyA9IG9zLmVudmlyb25bJ1BST1RPQyddCitlbGlmIG9zLnBhdGguZXhpc3RzKCcuLi9zcmMvcHJvdG9jJyk6CisgIHByb3RvYyA9ICcuLi9zcmMvcHJvdG9jJworZWxpZiBvcy5wYXRoLmV4aXN0cygnLi4vc3JjL3Byb3RvYy5leGUnKToKKyAgcHJvdG9jID0gJy4uL3NyYy9wcm90b2MuZXhlJworZWxpZiBvcy5wYXRoLmV4aXN0cygnLi4vdnNwcm9qZWN0cy9EZWJ1Zy9wcm90b2MuZXhlJyk6CisgIHByb3RvYyA9ICcuLi92c3Byb2plY3RzL0RlYnVnL3Byb3RvYy5leGUnCitlbGlmIG9zLnBhdGguZXhpc3RzKCcuLi92c3Byb2plY3RzL1JlbGVhc2UvcHJvdG9jLmV4ZScpOgorICBwcm90b2MgPSAnLi4vdnNwcm9qZWN0cy9SZWxlYXNlL3Byb3RvYy5leGUnCitlbHNlOgorICBwcm90b2MgPSBmaW5kX2V4ZWN1dGFibGUoJ3Byb3RvYycpCisKKworZGVmIEdldFZlcnNpb24oKToKKyAgIiIiUmVhZHMgYW5kIHJldHVybnMgdGhlIHZlcnNpb24gZnJvbSBnb29nbGUvcHJvdG9idWYvX19pbml0X18ucHkuCisKKyAgRG8gbm90IGltcG9ydCBnb29nbGUucHJvdG9idWYuX19pbml0X18gZGlyZWN0bHksIGJlY2F1c2UgYW4gaW5zdGFsbGVkCisgIHByb3RvYnVmIGxpYnJhcnkgbWF5IGJlIGxvYWRlZCBpbnN0ZWFkLgorCisgIFJldHVybnM6CisgICAgICBUaGUgdmVyc2lvbi4KKyAgIiIiCisKKyAgd2l0aCBvcGVuKG9zLnBhdGguam9pbignZ29vZ2xlJywgJ3Byb3RvYnVmJywgJ19faW5pdF9fLnB5JykpIGFzIHZlcnNpb25fZmlsZToKKyAgICBleGVjKHZlcnNpb25fZmlsZS5yZWFkKCksIGdsb2JhbHMoKSkgICMgcHlsaW50OmRpc2FibGU9ZXhlYy11c2VkCisgICAgcmV0dXJuIF9fdmVyc2lvbl9fICAjIHB5bGludDpkaXNhYmxlPXVuZGVmaW5lZC12YXJpYWJsZQorCisKK2RlZiBHZW5Qcm90byhzb3VyY2UsIHJlcXVpcmU9VHJ1ZSk6CisgICIiIkdlbmVyYXRlcyBhIF9wYjIucHkgZnJvbSB0aGUgZ2l2ZW4gLnByb3RvIGZpbGUuCisKKyAgRG9lcyBub3RoaW5nIGlmIHRoZSBvdXRwdXQgYWxyZWFkeSBleGlzdHMgYW5kIGlzIG5ld2VyIHRoYW4gdGhlIGlucHV0LgorCisgIEFyZ3M6CisgICAgICBzb3VyY2U6IHRoZSAucHJvdG8gZmlsZSBwYXRoLgorICAgICAgcmVxdWlyZTogaWYgVHJ1ZSwgZXhpdCBpbW1lZGlhdGVseSB3aGVuIGEgcGF0aCBpcyBub3QgZm91bmQuCisgICIiIgorCisgIGlmIG5vdCByZXF1aXJlIGFuZCBub3Qgb3MucGF0aC5leGlzdHMoc291cmNlKToKKyAgICByZXR1cm4KKworICBvdXRwdXQgPSBzb3VyY2UucmVwbGFjZSgnLnByb3RvJywgJ19wYjIucHknKS5yZXBsYWNlKCcuLi9zcmMvJywgJycpCisKKyAgaWYgKG5vdCBvcy5wYXRoLmV4aXN0cyhvdXRwdXQpIG9yCisgICAgICAob3MucGF0aC5leGlzdHMoc291cmNlKSBhbmQKKyAgICAgICBvcy5wYXRoLmdldG10aW1lKHNvdXJjZSkgPiBvcy5wYXRoLmdldG10aW1lKG91dHB1dCkpKToKKyAgICBwcmludCgnR2VuZXJhdGluZyAlcy4uLicgJSBvdXRwdXQpCisKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc291cmNlKToKKyAgICAgIHN5cy5zdGRlcnIud3JpdGUoIkNhbid0IGZpbmQgcmVxdWlyZWQgZmlsZTogJXNcbiIgJSBzb3VyY2UpCisgICAgICBzeXMuZXhpdCgtMSkKKworICAgIGlmIHByb3RvYyBpcyBOb25lOgorICAgICAgc3lzLnN0ZGVyci53cml0ZSgKKyAgICAgICAgICAncHJvdG9jIGlzIG5vdCBpbnN0YWxsZWQgbm9yIGZvdW5kIGluIC4uL3NyYy4gIFBsZWFzZSBjb21waWxlIGl0ICcKKyAgICAgICAgICAnb3IgaW5zdGFsbCB0aGUgYmluYXJ5IHBhY2thZ2UuXG4nKQorICAgICAgc3lzLmV4aXQoLTEpCisKKyAgICBwcm90b2NfY29tbWFuZCA9IFtwcm90b2MsICctSS4uL3NyYycsICctSS4nLCAnLS1weXRob25fb3V0PS4nLCBzb3VyY2VdCisgICAgaWYgc3VicHJvY2Vzcy5jYWxsKHByb3RvY19jb21tYW5kKSAhPSAwOgorICAgICAgc3lzLmV4aXQoLTEpCisKKworZGVmIEdlbmVyYXRlVW5pdHRlc3RQcm90b3MoKToKKyAgIiIiR2VuZXJhdGVzIHByb3RvYnVmIGNvZGUgZm9yIHVuaXR0ZXN0cy4iIiIKKyAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wcm90bycsIEZhbHNlKQorICBHZW5Qcm90bygnLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF9tZXNzYWdlc19wcm90bzMucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF9tZXNzYWdlc19wcm90bzIucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvJywgRmFsc2UpCisgIEdlblByb3RvKCcuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wcm90bycsIEZhbHNlKQorICBHZW5Qcm90bygnLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnByb3RvJywgRmFsc2UpCisgIEdlblByb3RvKCcuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnByb3RvJywgRmFsc2UpCisgIEdlblByb3RvKCcuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9hbnlfdGVzdC5wcm90bycsIEZhbHNlKQorICBHZW5Qcm90bygnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0MS5wcm90bycsIEZhbHNlKQorICBHZW5Qcm90bygnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0Mi5wcm90bycsIEZhbHNlKQorICBHZW5Qcm90bygnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDEucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9mYWN0b3J5X3Rlc3QyLnByb3RvJywgRmFsc2UpCisgIEdlblByb3RvKCdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmlsZV9vcHRpb25zX3Rlc3QucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9pbXBvcnRfdGVzdF9wYWNrYWdlL2ltcG9ydF9wdWJsaWMucHJvdG8nLAorICAgICAgICAgICBGYWxzZSkKKyAgR2VuUHJvdG8oCisgICAgICAnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ltcG9ydF90ZXN0X3BhY2thZ2UvaW1wb3J0X3B1YmxpY19uZXN0ZWQucHJvdG8nLAorICAgICAgRmFsc2UpCisgIEdlblByb3RvKCdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvaW1wb3J0X3Rlc3RfcGFja2FnZS9pbm5lci5wcm90bycsIEZhbHNlKQorICBHZW5Qcm90bygnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ltcG9ydF90ZXN0X3BhY2thZ2Uvb3V0ZXIucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9taXNzaW5nX2VudW1fdmFsdWVzLnByb3RvJywgRmFsc2UpCisgIEdlblByb3RvKCdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9zZXRfZXh0ZW5zaW9ucy5wcm90bycsIEZhbHNlKQorICBHZW5Qcm90bygnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfZXh0ZW5zaW9ucy5wcm90bycsIEZhbHNlKQorICBHZW5Qcm90bygnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfZXh0ZW5zaW9uc19keW5hbWljLnByb3RvJywgRmFsc2UpCisgIEdlblByb3RvKCdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9tZXNzYWdlcy5wcm90bycsIEZhbHNlKQorICBHZW5Qcm90bygnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL25vX3BhY2thZ2UucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9wYWNrZWRfZmllbGRfdGVzdC5wcm90bycsIEZhbHNlKQorICBHZW5Qcm90bygnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvJywgRmFsc2UpCisgIEdlblByb3RvKCdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF9wcm90bzNfb3B0aW9uYWwucHJvdG8nLCBGYWxzZSkKKyAgR2VuUHJvdG8oJ2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob24ucHJvdG8nLCBGYWxzZSkKKworCitjbGFzcyBDbGVhbkNtZChfY2xlYW4pOgorICAiIiJDdXN0b20gY2xlYW4gY29tbWFuZCBmb3IgYnVpbGRpbmcgdGhlIHByb3RvYnVmIGV4dGVuc2lvbi4iIiIKKworICBkZWYgcnVuKHNlbGYpOgorICAgICMgRGVsZXRlIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgY29kZSB0cmVlLgorICAgIGZvciAoZGlycGF0aCwgdW51c2VkX2Rpcm5hbWVzLCBmaWxlbmFtZXMpIGluIG9zLndhbGsoJy4nKToKKyAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGZpbGVuYW1lKQorICAgICAgICBpZiAoZmlsZXBhdGguZW5kc3dpdGgoJ19wYjIucHknKSBvciBmaWxlcGF0aC5lbmRzd2l0aCgnLnB5YycpIG9yCisgICAgICAgICAgICBmaWxlcGF0aC5lbmRzd2l0aCgnLnNvJykgb3IgZmlsZXBhdGguZW5kc3dpdGgoJy5vJykpOgorICAgICAgICAgIG9zLnJlbW92ZShmaWxlcGF0aCkKKyAgICAjIF9jbGVhbiBpcyBhbiBvbGQtc3R5bGUgY2xhc3MsIHNvIHN1cGVyKCkgZG9lc24ndCB3b3JrLgorICAgIF9jbGVhbi5ydW4oc2VsZikKKworCitjbGFzcyBCdWlsZFB5Q21kKF9idWlsZF9weSk6CisgICIiIkN1c3RvbSBidWlsZF9weSBjb21tYW5kIGZvciBidWlsZGluZyB0aGUgcHJvdG9idWYgcnVudGltZS4iIiIKKworICBkZWYgcnVuKHNlbGYpOgorICAgICMgR2VuZXJhdGUgbmVjZXNzYXJ5IC5wcm90byBmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCisgICAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bycpCisgICAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvJykKKyAgICBHZW5Qcm90bygnLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8nKQorICAgIEdlblByb3RvKCcuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90bycpCisgICAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8nKQorICAgIEdlblByb3RvKCcuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvJykKKyAgICBHZW5Qcm90bygnLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvJykKKyAgICBHZW5Qcm90bygnLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90bycpCisgICAgR2VuUHJvdG8oJy4uL3NyYy9nb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvJykKKyAgICBHZW5Qcm90bygnLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8nKQorICAgIEdlblByb3RvKCcuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8nKQorICAgIEdlblByb3RvKCcuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvJykKKyAgICBHZW5lcmF0ZVVuaXR0ZXN0UHJvdG9zKCkKKworICAgICMgX2J1aWxkX3B5IGlzIGFuIG9sZC1zdHlsZSBjbGFzcywgc28gc3VwZXIoKSBkb2Vzbid0IHdvcmsuCisgICAgX2J1aWxkX3B5LnJ1bihzZWxmKQorCisgIGRlZiBmaW5kX3BhY2thZ2VfbW9kdWxlcyhzZWxmLCBwYWNrYWdlLCBwYWNrYWdlX2Rpcik6CisgICAgZXhjbHVkZSA9ICgKKyAgICAgICAgJyp0ZXN0KicsCisgICAgICAgICdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvKl9wYjIucHknLAorICAgICAgICAnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL19wYXJhbWV0ZXJpemVkLnB5JywKKyAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fcGIyLnB5JywKKyAgICApCisgICAgbW9kdWxlcyA9IF9idWlsZF9weS5maW5kX3BhY2thZ2VfbW9kdWxlcyhzZWxmLCBwYWNrYWdlLCBwYWNrYWdlX2RpcikKKyAgICByZXR1cm4gWyhwa2csIG1vZCwgZmlsKSBmb3IgKHBrZywgbW9kLCBmaWwpIGluIG1vZHVsZXMKKyAgICAgICAgICAgIGlmIG5vdCBhbnkoZm5tYXRjaC5mbm1hdGNoY2FzZShmaWwsIHBhdD1wYXQpIGZvciBwYXQgaW4gZXhjbHVkZSldCisKKworY2xhc3MgQnVpbGRFeHRDbWQoX2J1aWxkX2V4dCk6CisgICIiIkNvbW1hbmQgY2xhc3MgZm9yIGJ1aWxkaW5nIHRoZSBwcm90b2J1ZiBQeXRob24gZXh0ZW5zaW9uLiIiIgorCisgIGRlZiBnZXRfZXh0X2ZpbGVuYW1lKHNlbGYsIGV4dF9uYW1lKToKKyAgICAjIHNpbmNlIHB5dGhvbjMuNSwgcHl0aG9uIGV4dGVuc2lvbnMnIHNoYXJlZCBsaWJyYXJpZXMgdXNlIGEgc3VmZml4IHRoYXQKKyAgICAjIGNvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBvZiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0VYVF9TVUZGSVgnKSBhbmQKKyAgICAjIGNvbnRhaW5zIGluZm8gYWJvdXQgdGhlIGFyY2hpdGVjdHVyZSB0aGUgbGlicmFyeSB0YXJnZXRzLiAgRS5nLiBvbiB4NjQKKyAgICAjIGxpbnV4IHRoZSBzdWZmaXggaXMgIi5jcHl0aG9uLVhZWi14ODZfNjQtbGludXgtZ251LnNvIiBXaGVuCisgICAgIyBjcm9zc2NvbXBpbGluZyBweXRob24gd2hlZWxzLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gb3ZlcnJpZGUgdGhpcworICAgICMgc3VmZml4IHNvIHRoYXQgdGhlIHJlc3VsdGluZyBmaWxlIG5hbWUgbWF0Y2hlcyB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZQorICAgICMgYW5kIHdlIGVuZCB1cCB3aXRoIGEgd2VsbC1mb3JtZWQgd2hlZWwuCisgICAgZmlsZW5hbWUgPSBfYnVpbGRfZXh0LmdldF9leHRfZmlsZW5hbWUoc2VsZiwgZXh0X25hbWUpCisgICAgb3JpZ19leHRfc3VmZml4ID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdFWFRfU1VGRklYJykKKyAgICBuZXdfZXh0X3N1ZmZpeCA9IG9zLmdldGVudignUFJPVE9DT0xfQlVGRkVSU19PVkVSUklERV9FWFRfU1VGRklYJykKKyAgICBpZiBuZXdfZXh0X3N1ZmZpeCBhbmQgZmlsZW5hbWUuZW5kc3dpdGgob3JpZ19leHRfc3VmZml4KToKKyAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi1sZW4ob3JpZ19leHRfc3VmZml4KV0gKyBuZXdfZXh0X3N1ZmZpeAorICAgIHJldHVybiBmaWxlbmFtZQorCisKK2NsYXNzIFRlc3RDb25mb3JtYW5jZUNtZChfYnVpbGRfcHkpOgorICB0YXJnZXQgPSAndGVzdF9weXRob24nCisKKyAgZGVmIHJ1bihzZWxmKToKKyAgICAjIFB5dGhvbiAyLjYgZG9kZ2VzIHRoZXNlIGV4dHJhIGZhaWx1cmVzLgorICAgIG9zLmVudmlyb25bJ0NPTkZPUk1BTkNFX1BZVEhPTl9FWFRSQV9GQUlMVVJFUyddID0gKAorICAgICAgICAnLS1mYWlsdXJlX2xpc3QgZmFpbHVyZV9saXN0X3B5dGhvbi1wb3N0MjYudHh0JykKKyAgICBjbWQgPSAnY2QgLi4vY29uZm9ybWFuY2UgJiYgbWFrZSAlcycgJSAoVGVzdENvbmZvcm1hbmNlQ21kLnRhcmdldCkKKyAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoY21kLCBzaGVsbD1UcnVlKQorCisKK2RlZiBHZXRPcHRpb25Gcm9tQXJndihvcHRpb25fc3RyKToKKyAgaWYgb3B0aW9uX3N0ciBpbiBzeXMuYXJndjoKKyAgICBzeXMuYXJndi5yZW1vdmUob3B0aW9uX3N0cikKKyAgICByZXR1cm4gVHJ1ZQorICByZXR1cm4gRmFsc2UKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBleHRfbW9kdWxlX2xpc3QgPSBbXQorICB3YXJuaW5nc19hc19lcnJvcnMgPSAnLS13YXJuaW5nc19hc19lcnJvcnMnCisgIGlmIEdldE9wdGlvbkZyb21Bcmd2KCctLWNwcF9pbXBsZW1lbnRhdGlvbicpOgorICAgICMgTGluayBsaWJwcm90b2J1Zi5hIGFuZCBsaWJwcm90b2J1Zi1saXRlLmEgc3RhdGljYWxseSB3aXRoIHRoZQorICAgICMgZXh0ZW5zaW9uLiBOb3RlIHRoYXQgdGhvc2UgbGlicmFyaWVzIGhhdmUgdG8gYmUgY29tcGlsZWQgd2l0aAorICAgICMgLWZQSUMgZm9yIHRoaXMgdG8gd29yay4KKyAgICBjb21waWxlX3N0YXRpY19leHQgPSBHZXRPcHRpb25Gcm9tQXJndignLS1jb21waWxlX3N0YXRpY19leHRlbnNpb24nKQorICAgIGxpYnJhcmllcyA9IFsncHJvdG9idWYnXQorICAgIGV4dHJhX29iamVjdHMgPSBOb25lCisgICAgaWYgY29tcGlsZV9zdGF0aWNfZXh0OgorICAgICAgbGlicmFyaWVzID0gTm9uZQorICAgICAgZXh0cmFfb2JqZWN0cyA9IFsnLi4vc3JjLy5saWJzL2xpYnByb3RvYnVmLmEnLAorICAgICAgICAgICAgICAgICAgICAgICAnLi4vc3JjLy5saWJzL2xpYnByb3RvYnVmLWxpdGUuYSddCisgICAgVGVzdENvbmZvcm1hbmNlQ21kLnRhcmdldCA9ICd0ZXN0X3B5dGhvbl9jcHAnCisKKyAgICBleHRyYV9jb21waWxlX2FyZ3MgPSBbXQorCisgICAgbWVzc2FnZV9leHRyYV9saW5rX2FyZ3MgPSBOb25lCisgICAgYXBpX2ltcGxlbWVudGF0aW9uX2xpbmtfYXJncyA9IE5vbmUKKyAgICBpZiAnZGFyd2luJyBpbiBzeXMucGxhdGZvcm06CisgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgICAgIG1lc3NhZ2VfaW5pdF9zeW1ib2wgPSAnaW5pdF9tZXNzYWdlJworICAgICAgICBhcGlfaW1wbGVtZW50YXRpb25faW5pdF9zeW1ib2wgPSAnaW5pdF9hcGlfaW1wbGVtZW50YXRpb24nCisgICAgICBlbHNlOgorICAgICAgICBtZXNzYWdlX2luaXRfc3ltYm9sID0gJ1B5SW5pdF9fbWVzc2FnZScKKyAgICAgICAgYXBpX2ltcGxlbWVudGF0aW9uX2luaXRfc3ltYm9sID0gJ1B5SW5pdF9fYXBpX2ltcGxlbWVudGF0aW9uJworICAgICAgbWVzc2FnZV9leHRyYV9saW5rX2FyZ3MgPSBbCisgICAgICAgICAgJy1XbCwtZXhwb3J0ZWRfc3ltYm9sLF8lcycgJSBtZXNzYWdlX2luaXRfc3ltYm9sCisgICAgICBdCisgICAgICBhcGlfaW1wbGVtZW50YXRpb25fbGlua19hcmdzID0gWworICAgICAgICAgICctV2wsLWV4cG9ydGVkX3N5bWJvbCxfJXMnICUgYXBpX2ltcGxlbWVudGF0aW9uX2luaXRfc3ltYm9sCisgICAgICBdCisKKyAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJzoKKyAgICAgIGV4dHJhX2NvbXBpbGVfYXJncy5hcHBlbmQoJy1Xbm8td3JpdGUtc3RyaW5ncycpCisgICAgICBleHRyYV9jb21waWxlX2FyZ3MuYXBwZW5kKCctV25vLWludmFsaWQtb2Zmc2V0b2YnKQorICAgICAgZXh0cmFfY29tcGlsZV9hcmdzLmFwcGVuZCgnLVduby1zaWduLWNvbXBhcmUnKQorICAgICAgZXh0cmFfY29tcGlsZV9hcmdzLmFwcGVuZCgnLVduby11bnVzZWQtdmFyaWFibGUnKQorICAgICAgZXh0cmFfY29tcGlsZV9hcmdzLmFwcGVuZCgnLXN0ZD1jKysxMScpCisKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICBleHRyYV9jb21waWxlX2FyZ3MuYXBwZW5kKCctV25vLXNob3J0ZW4tNjQtdG8tMzInKQorICAgICAgZXh0cmFfY29tcGlsZV9hcmdzLmFwcGVuZCgnLVduby1kZXByZWNhdGVkLXJlZ2lzdGVyJykKKworICAgICMgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGNvZGVfcmVsZWFzZV9ub3Rlcy94Y29kZV8xMF9yZWxlYXNlX25vdGVzCisgICAgIyBDKysgcHJvamVjdHMgbXVzdCBub3cgbWlncmF0ZSB0byBsaWJjKysgYW5kIGFyZSByZWNvbW1lbmRlZCB0byBzZXQgYQorICAgICMgZGVwbG95bWVudCB0YXJnZXQgb2YgbWFjT1MgMTAuOSBvciBsYXRlciwgb3IgaU9TIDcgb3IgbGF0ZXIuCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgbWFjX3RhcmdldCA9IHN0cihzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcpKQorICAgICAgaWYgbWFjX3RhcmdldCBhbmQgKHBrZ19yZXNvdXJjZXMucGFyc2VfdmVyc2lvbihtYWNfdGFyZ2V0KSA8CisgICAgICAgICAgICAgICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5wYXJzZV92ZXJzaW9uKCcxMC45LjAnKSk6CisgICAgICAgIG9zLmVudmlyb25bJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCddID0gJzEwLjknCisgICAgICAgIG9zLmVudmlyb25bJ19QWVRIT05fSE9TVF9QTEFURk9STSddID0gcmUuc3ViKAorICAgICAgICAgICAgcidtYWNvc3gtWzAtOV0rXC5bMC05XSstKC4rKScsIHInbWFjb3N4LTEwLjktXDEnLAorICAgICAgICAgICAgdXRpbC5nZXRfcGxhdGZvcm0oKSkKKworICAgICMgaHR0cHM6Ly9naXRodWIuY29tL1RoZWFuby9UaGVhbm8vaXNzdWVzLzQ5MjYKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgIGV4dHJhX2NvbXBpbGVfYXJncy5hcHBlbmQoJy1EX2h5cG90PWh5cG90JykKKworICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3RwYXZpb3QvcHl0aG9ub2NjLWNvcmUvaXNzdWVzLzQ4CisgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMicgYW5kICAnNjQgYml0JyBpbiBzeXMudmVyc2lvbjoKKyAgICAgIGV4dHJhX2NvbXBpbGVfYXJncy5hcHBlbmQoJy1ETVNfV0lONjQnKQorCisgICAgIyBNU1ZTIGRlZmF1bHQgaXMgZHltYW5pYworICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgZXh0cmFfY29tcGlsZV9hcmdzLmFwcGVuZCgnL01UJykKKworICAgIGlmICdjbGFuZycgaW4gb3MucG9wZW4oJyRDQyAtLXZlcnNpb24gMj4gL2Rldi9udWxsJykucmVhZCgpOgorICAgICAgZXh0cmFfY29tcGlsZV9hcmdzLmFwcGVuZCgnLVduby1zaG9ydGVuLTY0LXRvLTMyJykKKworICAgIGlmIHdhcm5pbmdzX2FzX2Vycm9ycyBpbiBzeXMuYXJndjoKKyAgICAgIGV4dHJhX2NvbXBpbGVfYXJncy5hcHBlbmQoJy1XZXJyb3InKQorICAgICAgc3lzLmFyZ3YucmVtb3ZlKHdhcm5pbmdzX2FzX2Vycm9ycykKKworICAgICMgQysrIGltcGxlbWVudGF0aW9uIGV4dGVuc2lvbgorICAgIGV4dF9tb2R1bGVfbGlzdC5leHRlbmQoWworICAgICAgICBFeHRlbnNpb24oCisgICAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5ZXh0Ll9tZXNzYWdlJywKKyAgICAgICAgICAgIGdsb2IuZ2xvYignZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0LyouY2MnKSwKKyAgICAgICAgICAgIGluY2x1ZGVfZGlycz1bJy4nLCAnLi4vc3JjJ10sCisgICAgICAgICAgICBsaWJyYXJpZXM9bGlicmFyaWVzLAorICAgICAgICAgICAgZXh0cmFfb2JqZWN0cz1leHRyYV9vYmplY3RzLAorICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPW1lc3NhZ2VfZXh0cmFfbGlua19hcmdzLAorICAgICAgICAgICAgbGlicmFyeV9kaXJzPVsnLi4vc3JjLy5saWJzJ10sCisgICAgICAgICAgICBleHRyYV9jb21waWxlX2FyZ3M9ZXh0cmFfY29tcGlsZV9hcmdzLAorICAgICAgICApLAorICAgICAgICBFeHRlbnNpb24oCisgICAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLl9hcGlfaW1wbGVtZW50YXRpb24nLAorICAgICAgICAgICAgZ2xvYi5nbG9iKCdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYXBpX2ltcGxlbWVudGF0aW9uLmNjJyksCisgICAgICAgICAgICBleHRyYV9jb21waWxlX2FyZ3M9KGV4dHJhX2NvbXBpbGVfYXJncyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnLURQWVRIT05fUFJPVE8yX0NQUF9JTVBMX1YyJ10pLAorICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPWFwaV9pbXBsZW1lbnRhdGlvbl9saW5rX2FyZ3MsCisgICAgICAgICksCisgICAgXSkKKyAgICBvcy5lbnZpcm9uWydQUk9UT0NPTF9CVUZGRVJTX1BZVEhPTl9JTVBMRU1FTlRBVElPTiddID0gJ2NwcCcKKworICAjIEtlZXAgdGhpcyBsaXN0IG9mIGRlcGVuZGVuY2llcyBpbiBzeW5jIHdpdGggdG94LmluaS4KKyAgaW5zdGFsbF9yZXF1aXJlcyA9IFtdCisKKyAgc2V0dXAoCisgICAgICBuYW1lPSdwcm90b2J1ZicsCisgICAgICB2ZXJzaW9uPUdldFZlcnNpb24oKSwKKyAgICAgIGRlc2NyaXB0aW9uPSdQcm90b2NvbCBCdWZmZXJzJywKKyAgICAgIGRvd25sb2FkX3VybD0naHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9yZWxlYXNlcycsCisgICAgICBsb25nX2Rlc2NyaXB0aW9uPSJQcm90b2NvbCBCdWZmZXJzIGFyZSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdCIsCisgICAgICB1cmw9J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvJywKKyAgICAgIG1haW50YWluZXI9J3Byb3RvYnVmQGdvb2dsZWdyb3Vwcy5jb20nLAorICAgICAgbWFpbnRhaW5lcl9lbWFpbD0ncHJvdG9idWZAZ29vZ2xlZ3JvdXBzLmNvbScsCisgICAgICBsaWNlbnNlPSdCU0QtMy1DbGF1c2UnLAorICAgICAgY2xhc3NpZmllcnM9WworICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24nLAorICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMycsCisgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjcnLAorICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy44JywKKyAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuOScsCisgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjEwJywKKyAgICAgIF0sCisgICAgICBuYW1lc3BhY2VfcGFja2FnZXM9Wydnb29nbGUnXSwKKyAgICAgIHBhY2thZ2VzPWZpbmRfcGFja2FnZXMoCisgICAgICAgICAgZXhjbHVkZT1bCisgICAgICAgICAgICAgICdpbXBvcnRfdGVzdF9wYWNrYWdlJywKKyAgICAgICAgICAgICAgJ3Byb3RvYnVmX2Rpc3R1dGlscycsCisgICAgICAgICAgXSwpLAorICAgICAgdGVzdF9zdWl0ZT0nZ29vZ2xlLnByb3RvYnVmLmludGVybmFsJywKKyAgICAgIGNtZGNsYXNzPXsKKyAgICAgICAgICAnY2xlYW4nOiBDbGVhbkNtZCwKKyAgICAgICAgICAnYnVpbGRfcHknOiBCdWlsZFB5Q21kLAorICAgICAgICAgICdidWlsZF9leHQnOiBCdWlsZEV4dENtZCwKKyAgICAgICAgICAndGVzdF9jb25mb3JtYW5jZSc6IFRlc3RDb25mb3JtYW5jZUNtZCwKKyAgICAgIH0sCisgICAgICBpbnN0YWxsX3JlcXVpcmVzPWluc3RhbGxfcmVxdWlyZXMsCisgICAgICBleHRfbW9kdWxlcz1leHRfbW9kdWxlX2xpc3QsCisgICAgICBweXRob25fcmVxdWlyZXM9Jz49My43JywKKyAgKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL3N0dWJvdXQucHkgYi9weXRob24vc3R1Ym91dC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYTM5MTA0Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL3N0dWJvdXQucHkKQEAgLTAsMCArMSwxNDMgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMi40CisjCisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgZmlsZSBpcyB1c2VkIGZvciB0ZXN0aW5nLiAgVGhlIG9yaWdpbmFsIGlzIGF0OgorIyAgIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9weW1veC8KKworaW1wb3J0IGluc3BlY3QKKworCitjbGFzcyBTdHViT3V0Rm9yVGVzdGluZzoKKyAgIiIiU2FtcGxlIFVzYWdlOgorICAgICBZb3Ugd2FudCBvcy5wYXRoLmV4aXN0cygpIHRvIGFsd2F5cyByZXR1cm4gdHJ1ZSBkdXJpbmcgdGVzdGluZy4KKworICAgICBzdHVicyA9IFN0dWJPdXRGb3JUZXN0aW5nKCkKKyAgICAgc3R1YnMuU2V0KG9zLnBhdGgsICdleGlzdHMnLCBsYW1iZGEgeDogMSkKKyAgICAgICAuLi4KKyAgICAgc3R1YnMuVW5zZXRBbGwoKQorCisgICAgIFRoZSBhYm92ZSBjaGFuZ2VzIG9zLnBhdGguZXhpc3RzIGludG8gYSBsYW1iZGEgdGhhdCByZXR1cm5zIDEuICBPbmNlCisgICAgIHRoZSAuLi4gcGFydCBvZiB0aGUgY29kZSBmaW5pc2hlcywgdGhlIFVuc2V0QWxsKCkgbG9va3MgdXAgdGhlIG9sZCB2YWx1ZQorICAgICBvZiBvcy5wYXRoLmV4aXN0cyBhbmQgcmVzdG9yZXMgaXQuCisKKyAgIiIiCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBzZWxmLmNhY2hlID0gW10KKyAgICBzZWxmLnN0dWJzID0gW10KKworICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICBzZWxmLlNtYXJ0VW5zZXRBbGwoKQorICAgIHNlbGYuVW5zZXRBbGwoKQorCisgIGRlZiBTbWFydFNldChzZWxmLCBvYmosIGF0dHJfbmFtZSwgbmV3X2F0dHIpOgorICAgICIiIlJlcGxhY2Ugb2JqLmF0dHJfbmFtZSB3aXRoIG5ld19hdHRyLiBUaGlzIG1ldGhvZCBpcyBzbWFydCBhbmQgd29ya3MKKyAgICAgICBhdCB0aGUgbW9kdWxlLCBjbGFzcywgYW5kIGluc3RhbmNlIGxldmVsIHdoaWxlIHByZXNlcnZpbmcgcHJvcGVyCisgICAgICAgaW5oZXJpdGFuY2UuIEl0IHdpbGwgbm90IHN0dWIgb3V0IEMgdHlwZXMgaG93ZXZlciB1bmxlc3MgdGhhdCBoYXMgYmVlbgorICAgICAgIGV4cGxpY2l0bHkgYWxsb3dlZCBieSB0aGUgdHlwZS4KKworICAgICAgIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHRoZSBjYXNlIHdoZXJlIGF0dHJfbmFtZSBpcyBhIHN0YXRpY21ldGhvZCBvciBhCisgICAgICAgY2xhc3NtZXRob2Qgb2Ygb2JqLgorCisgICAgICAgTm90ZXM6CisgICAgICAtIElmIG9iaiBpcyBhbiBpbnN0YW5jZSwgdGhlbiBpdCBpcyBpdHMgY2xhc3MgdGhhdCB3aWxsIGFjdHVhbGx5IGJlCisgICAgICAgIHN0dWJiZWQuIE5vdGUgdGhhdCB0aGUgbWV0aG9kIFNldCgpIGRvZXMgbm90IGRvIHRoYXQ6IGlmIG9iaiBpcworICAgICAgICBhbiBpbnN0YW5jZSwgaXQgKGFuZCBub3QgaXRzIGNsYXNzKSB3aWxsIGJlIHN0dWJiZWQuCisgICAgICAtIFRoZSBzdHViYmluZyBpcyB1c2luZyB0aGUgYnVpbHRpbiBnZXRhdHRyIGFuZCBzZXRhdHRyLiBTbywgdGhlIF9fZ2V0X18KKyAgICAgICAgYW5kIF9fc2V0X18gd2lsbCBiZSBjYWxsZWQgd2hlbiBzdHViYmluZyAoVE9ETzogQSBiZXR0ZXIgaWRlYSB3b3VsZAorICAgICAgICBwcm9iYWJseSBiZSB0byBtYW5pcHVsYXRlIG9iai5fX2RpY3RfXyBpbnN0ZWFkIG9mIGdldGF0dHIoKSBhbmQKKyAgICAgICAgc2V0YXR0cigpKS4KKworICAgICAgIFJhaXNlcyBBdHRyaWJ1dGVFcnJvciBpZiB0aGUgYXR0cmlidXRlIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAiIiIKKyAgICBpZiAoaW5zcGVjdC5pc21vZHVsZShvYmopIG9yCisgICAgICAgIChub3QgaW5zcGVjdC5pc2NsYXNzKG9iaikgYW5kIG9iai5fX2RpY3RfXy5oYXNfa2V5KGF0dHJfbmFtZSkpKToKKyAgICAgIG9yaWdfb2JqID0gb2JqCisgICAgICBvcmlnX2F0dHIgPSBnZXRhdHRyKG9iaiwgYXR0cl9uYW1lKQorCisgICAgZWxzZToKKyAgICAgIGlmIG5vdCBpbnNwZWN0LmlzY2xhc3Mob2JqKToKKyAgICAgICAgbXJvID0gbGlzdChpbnNwZWN0LmdldG1ybyhvYmouX19jbGFzc19fKSkKKyAgICAgIGVsc2U6CisgICAgICAgIG1ybyA9IGxpc3QoaW5zcGVjdC5nZXRtcm8ob2JqKSkKKworICAgICAgbXJvLnJldmVyc2UoKQorCisgICAgICBvcmlnX2F0dHIgPSBOb25lCisKKyAgICAgIGZvciBjbHMgaW4gbXJvOgorICAgICAgICB0cnk6CisgICAgICAgICAgb3JpZ19vYmogPSBjbHMKKyAgICAgICAgICBvcmlnX2F0dHIgPSBnZXRhdHRyKG9iaiwgYXR0cl9uYW1lKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgY29udGludWUKKworICAgIGlmIG9yaWdfYXR0ciBpcyBOb25lOgorICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIkF0dHJpYnV0ZSBub3QgZm91bmQuIikKKworICAgICMgQ2FsbGluZyBnZXRhdHRyKCkgb24gYSBzdGF0aWNtZXRob2QgdHJhbnNmb3JtcyBpdCB0byBhICdub3JtYWwnIGZ1bmN0aW9uLgorICAgICMgV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB3ZSBwdXQgaXQgYmFjayBhcyBhIHN0YXRpY21ldGhvZC4KKyAgICBvbGRfYXR0cmlidXRlID0gb2JqLl9fZGljdF9fLmdldChhdHRyX25hbWUpCisgICAgaWYgb2xkX2F0dHJpYnV0ZSBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShvbGRfYXR0cmlidXRlLCBzdGF0aWNtZXRob2QpOgorICAgICAgb3JpZ19hdHRyID0gc3RhdGljbWV0aG9kKG9yaWdfYXR0cikKKworICAgIHNlbGYuc3R1YnMuYXBwZW5kKChvcmlnX29iaiwgYXR0cl9uYW1lLCBvcmlnX2F0dHIpKQorICAgIHNldGF0dHIob3JpZ19vYmosIGF0dHJfbmFtZSwgbmV3X2F0dHIpCisKKyAgZGVmIFNtYXJ0VW5zZXRBbGwoc2VsZik6CisgICAgIiIiUmV2ZXJzZXMgYWxsIHRoZSBTbWFydFNldCgpIGNhbGxzLCByZXN0b3JpbmcgdGhpbmdzIHRvIHRoZWlyIG9yaWdpbmFsCisgICAgZGVmaW5pdGlvbi4gIEl0cyBva2F5IHRvIGNhbGwgU21hcnRVbnNldEFsbCgpIHJlcGVhdGVkbHksIGFzIGxhdGVyIGNhbGxzCisgICAgaGF2ZSBubyBlZmZlY3QgaWYgbm8gU21hcnRTZXQoKSBjYWxscyBoYXZlIGJlZW4gbWFkZS4KKworICAgICIiIgorICAgIHNlbGYuc3R1YnMucmV2ZXJzZSgpCisKKyAgICBmb3IgYXJncyBpbiBzZWxmLnN0dWJzOgorICAgICAgc2V0YXR0cigqYXJncykKKworICAgIHNlbGYuc3R1YnMgPSBbXQorCisgIGRlZiBTZXQoc2VsZiwgcGFyZW50LCBjaGlsZF9uYW1lLCBuZXdfY2hpbGQpOgorICAgICIiIlJlcGxhY2UgY2hpbGRfbmFtZSdzIG9sZCBkZWZpbml0aW9uIHdpdGggbmV3X2NoaWxkLCBpbiB0aGUgY29udGV4dAorICAgIG9mIHRoZSBnaXZlbiBwYXJlbnQuICBUaGUgcGFyZW50IGNvdWxkIGJlIGEgbW9kdWxlIHdoZW4gdGhlIGNoaWxkIGlzIGEKKyAgICBmdW5jdGlvbiBhdCBtb2R1bGUgc2NvcGUuICBPciB0aGUgcGFyZW50IGNvdWxkIGJlIGEgY2xhc3Mgd2hlbiBhIGNsYXNzJworICAgIG1ldGhvZCBpcyBiZWluZyByZXBsYWNlZC4gIFRoZSBuYW1lZCBjaGlsZCBpcyBzZXQgdG8gbmV3X2NoaWxkLCB3aGlsZQorICAgIHRoZSBwcmlvciBkZWZpbml0aW9uIGlzIHNhdmVkIGF3YXkgZm9yIGxhdGVyLCB3aGVuIFVuc2V0QWxsKCkgaXMgY2FsbGVkLgorCisgICAgVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIGNhc2Ugd2hlcmUgY2hpbGRfbmFtZSBpcyBhIHN0YXRpY21ldGhvZCBvciBhCisgICAgY2xhc3NtZXRob2Qgb2YgcGFyZW50LgorICAgICIiIgorICAgIG9sZF9jaGlsZCA9IGdldGF0dHIocGFyZW50LCBjaGlsZF9uYW1lKQorCisgICAgb2xkX2F0dHJpYnV0ZSA9IHBhcmVudC5fX2RpY3RfXy5nZXQoY2hpbGRfbmFtZSkKKyAgICBpZiBvbGRfYXR0cmlidXRlIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKG9sZF9hdHRyaWJ1dGUsIHN0YXRpY21ldGhvZCk6CisgICAgICBvbGRfY2hpbGQgPSBzdGF0aWNtZXRob2Qob2xkX2NoaWxkKQorCisgICAgc2VsZi5jYWNoZS5hcHBlbmQoKHBhcmVudCwgb2xkX2NoaWxkLCBjaGlsZF9uYW1lKSkKKyAgICBzZXRhdHRyKHBhcmVudCwgY2hpbGRfbmFtZSwgbmV3X2NoaWxkKQorCisgIGRlZiBVbnNldEFsbChzZWxmKToKKyAgICAiIiJSZXZlcnNlcyBhbGwgdGhlIFNldCgpIGNhbGxzLCByZXN0b3JpbmcgdGhpbmdzIHRvIHRoZWlyIG9yaWdpbmFsCisgICAgZGVmaW5pdGlvbi4gIEl0cyBva2F5IHRvIGNhbGwgVW5zZXRBbGwoKSByZXBlYXRlZGx5LCBhcyBsYXRlciBjYWxscyBoYXZlCisgICAgbm8gZWZmZWN0IGlmIG5vIFNldCgpIGNhbGxzIGhhdmUgYmVlbiBtYWRlLgorCisgICAgIiIiCisgICAgIyBVbmRvIGNhbGxzIHRvIFNldCgpIGluIHJldmVyc2Ugb3JkZXIsIGluIGNhc2UgU2V0KCkgd2FzIGNhbGxlZCBvbiB0aGUKKyAgICAjIHNhbWUgYXJndW1lbnRzIHJlcGVhdGVkbHkgKHdhbnQgdGhlIG9yaWdpbmFsIGNhbGwgdG8gYmUgbGFzdCBvbmUgdW5kb25lKQorICAgIHNlbGYuY2FjaGUucmV2ZXJzZSgpCisKKyAgICBmb3IgKHBhcmVudCwgb2xkX2NoaWxkLCBjaGlsZF9uYW1lKSBpbiBzZWxmLmNhY2hlOgorICAgICAgc2V0YXR0cihwYXJlbnQsIGNoaWxkX25hbWUsIG9sZF9jaGlsZCkKKyAgICBzZWxmLmNhY2hlID0gW10KZGlmZiAtLWdpdCBhL3B5dGhvbi90b3guaW5pIGIvcHl0aG9uL3RveC5pbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyM2E0YQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi90b3guaW5pCkBAIC0wLDAgKzEsMjEgQEAKK1t0b3hdCitlbnZsaXN0ID0KKyAgICBweXszNywzOCwzOSwzMTB9LXtjcHAscHl0aG9ufQorCitbdGVzdGVudl0KK3VzZWRldmVsb3A9dHJ1ZQorcGFzc2VudiA9CisgICAgQ0MgS09LT1JPX0JVSUxEX0lEIEtPS09ST19CVUlMRF9OVU1CRVIKK3NldGVudiA9CisgICAgY3BwOiBMRF9MSUJSQVJZX1BBVEg9e3RveGluaWRpcn0vLi4vc3JjLy5saWJzCisgICAgY3BwOiBEWUxEX0xJQlJBUllfUEFUSD17dG94aW5pZGlyfS8uLi9zcmMvLmxpYnMKKyAgICBjcHA6IFBST1RPQ09MX0JVRkZFUlNfUFlUSE9OX0lNUExFTUVOVEFUSU9OPWNwcAorICAgIHB5dGhvbjogUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT049cHl0aG9uCitjb21tYW5kcyA9CisgICAgcHl0aG9uIHNldHVwLnB5IC1xIGJ1aWxkX3B5CisgICAgcHl0aG9uOiBweXRob24gc2V0dXAucHkgLXEgYnVpbGQKKyAgICBweXszNywzOCwzOSwzMTB9LWNwcDogcHl0aG9uIHNldHVwLnB5IC1xIGJ1aWxkIC0tY3BwX2ltcGxlbWVudGF0aW9uIC0td2FybmluZ3NfYXNfZXJyb3JzIC0tY29tcGlsZV9zdGF0aWNfZXh0ZW5zaW9uCisgICAgcHl0aG9uOiBweXRob24gc2V0dXAucHkgLXEgdGVzdCAtcQorICAgIGNwcDogcHl0aG9uIHNldHVwLnB5IC1xIHRlc3QgLXEgLS1jcHBfaW1wbGVtZW50YXRpb24KKyAgICBweXRob246IHB5dGhvbiBzZXR1cC5weSAtcSB0ZXN0X2NvbmZvcm1hbmNlCisgICAgY3BwOiBweXRob24gc2V0dXAucHkgLXEgdGVzdF9jb25mb3JtYW5jZSAtLWNwcF9pbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvcmVhZG1lLnR4dCBiL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdmMDkxZgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWRtZS50eHQKQEAgLTAsMCArMSwxMiBAQAorUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CitDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgoraHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KK1RoaXMgcGFja2FnZSBjb250YWlucyBhIHByZWNvbXBpbGVkIGJpbmFyeSB2ZXJzaW9uIG9mIHRoZSBwcm90b2NvbCBidWZmZXIKK2NvbXBpbGVyIChwcm90b2MpLiBUaGlzIGJpbmFyeSBpcyBpbnRlbmRlZCBmb3IgdXNlcnMgd2hvIHdhbnQgdG8gdXNlIFByb3RvY29sCitCdWZmZXJzIGluIGxhbmd1YWdlcyBvdGhlciB0aGFuIEMrKyBidXQgZG8gbm90IHdhbnQgdG8gY29tcGlsZSBwcm90b2MKK3RoZW1zZWx2ZXMuIFRvIGluc3RhbGwsIHNpbXBseSBwbGFjZSB0aGlzIGJpbmFyeSBzb21ld2hlcmUgaW4geW91ciBQQVRILgorSWYgeW91IGludGVuZCB0byB1c2UgdGhlIGluY2x1ZGVkIHdlbGwga25vd24gdHlwZXMgdGhlbiBkb24ndCBmb3JnZXQgdG8KK2NvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSAnaW5jbHVkZScgZGlyZWN0b3J5IHNvbWV3aGVyZSBhcyB3ZWxsLCBmb3IgZXhhbXBsZQoraW50byAnL3Vzci9sb2NhbC9pbmNsdWRlLycuCitQbGVhc2UgcmVmZXIgdG8gb3VyIG9mZmljaWFsIGdpdGh1YiBzaXRlIGZvciBtb3JlIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnM6CisgIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYKZGlmZiAtLWdpdCBhL3NyYy9NYWtlZmlsZS5hbSBiL3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTYxMmRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOTE4IEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworaWYgSEFWRV9aTElCCitHWkNIRUNLUFJPR1JBTVMgPSB6Y2d6aXAgemNndW56aXAKK0daSEVBREVSUyA9IGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oCitHWlRFU1RTID0gZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtX3VuaXR0ZXN0LnNoCitaTElCX0RFRiA9IC1ESEFWRV9aTElCPTEKK2Vsc2UKK0daQ0hFQ0tQUk9HUkFNUyA9CitHWkhFQURFUlMgPQorR1pURVNUUyA9CitaTElCX0RFRiA9CitlbmRpZgorCitpZiBIQVZFX1BUSFJFQUQKK1BUSFJFQURfREVGID0gLURIQVZFX1BUSFJFQUQ9MQorZWxzZQorUFRIUkVBRF9ERUYgPQorZW5kaWYKKworUFJPVE9CVUZfVkVSU0lPTiA9IDMyOjk6MAorCitpZiBHQ0MKKyMgVHVybiBvbiBhbGwgd2FybmluZ3MgZXhjZXB0IGZvciBzaWduIGNvbXBhcmlzb24gKHdlIGlnbm9yZSBzaWduIGNvbXBhcmlzb24KKyMgaW4gR29vZ2xlIHNvIG91ciBjb2RlIGJhc2UgaGF2ZSB0b25zIG9mIHN1Y2ggd2FybmluZ3MpLgorTk9fT1BUX0NYWEZMQUdTID0gJChQVEhSRUFEX0NGTEFHUykgJChQVEhSRUFEX0RFRikgJChaTElCX0RFRikgLVdhbGwgLVduby1zaWduLWNvbXBhcmUKK2Vsc2UKK05PX09QVF9DWFhGTEFHUyA9ICQoUFRIUkVBRF9DRkxBR1MpICQoUFRIUkVBRF9ERUYpICQoWkxJQl9ERUYpCitlbmRpZgorCitBTV9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKSAkKFBST1RPQlVGX09QVF9GTEFHKQorCitBTV9MREZMQUdTID0gJChQVEhSRUFEX0NGTEFHUykgJHtMSUJMT0dfTElCU30KKworIyBJZiBJIHNheSAiZGlzdF9pbmNsdWRlX0RBVEEiLCBhdXRvbWFrZSBjb21wbGFpbnMgdGhhdCAkKGluY2x1ZGVkaXIpIGlzIG5vdAorIyBhICJsZWdpdGltYXRlIiBkaXJlY3RvcnkgZm9yIERBVEEuICBTY3JldyB5b3UsIGF1dG9tYWtlLgorcHJvdG9kaXIgPSAkKGluY2x1ZGVkaXIpCisKKyMgSWYgeW91IGFyZSBhZGRpbmcgbmV3IGZpbGVzIGhlcmUsIGFsc28gcmVtZW1iZXIgdG8gY2hhbmdlIHRoZSBidWlsZCBmaWxlcyBmb3IKKyMgYWxsIG90aGVyIGxhbmd1YWdlcywgLy9wcm90b2MtYXJ0aWZhY3RzL2J1aWxkLXppcC5zaCBhbmQgcnVuCisjIC8vdXBkYXRlX2ZpbGVfbGlzdC5zaCBmb3IgYmF6ZWwuCitub2Jhc2VfZGlzdF9wcm90b19EQVRBID0gICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYW55LnByb3RvICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90byAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8gXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90byAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8gICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8gICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bworCisjIE5vdCBzdXJlIHdoeSB0aGVzZSBkb24ndCBnZXQgY2xlYW5lZCBhdXRvbWF0aWNhbGx5LgorY2xlYW4tbG9jYWw6CisJcm0gLWYgKi5sb1QKKworQ0xFQU5GSUxFUyA9ICQocHJvdG9jX291dHB1dHMpIHVuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbiBcCisgICAgICAgICAgICAgdGVzdHppcC5qYXIgdGVzdHppcC5saXN0IHRlc3R6aXAucHJvdG8gdGVzdHppcC56aXAgXAorICAgICAgICAgICAgIG5vX3dhcm5pbmdfdGVzdC5jYworCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9ICAgXAorICBNYWtlZmlsZS5pbgorCitub2Jhc2VfaW5jbHVkZV9IRUFERVJTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FueS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYW55LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hcGkucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYXJlbmFfaW1wbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hel9zYW1wbGVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmggICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2ZpbGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZ2VuZXJhdG9yLmggICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmggICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL25hbWVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50LmggICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yLmggICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9uYW1lcy5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX29wdGlvbnMuaCAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmggICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEva290bGluX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lcy5oICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZ2VuZXJhdG9yLmggICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmggICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9waHAvcGhwX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vZ2VuZXJhdG9yLmggICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weWlfZ2VuZXJhdG9yLmggICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdG9yLmggICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2VuZGlhbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZXhwbGljaXRseV9jb25zdHJ1Y3RlZC5oICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaW5sLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZmllbGRfYWNjZXNzX2xpc3RlbmVyLmggICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3JlZmxlY3Rpb24uaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9iYXNlcy5oICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaCAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9kZWNsLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2ltcGwuaCAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaGFzX2JpdHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pbXBsaWNpdF93ZWFrX21lc3NhZ2UuaCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lubGluZWRfc3RyaW5nX2ZpZWxkLmggICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICQoR1pIRUFERVJTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby9zdHJ0b2QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaCAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmggICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfZW50cnkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9lbnRyeV9saXRlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfaW5sLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9saXRlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX3R5cGVfaGFuZGxlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWV0YWRhdGEuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YV9saXRlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3BhcnNlX2NvbnRleHQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcG9ydC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX2ludGVybmFsLmggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9wdHJfZmllbGQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hY3Jvcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tdXRleC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmggICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wb3J0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdHlwZS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZGVsaW1pdGVkX21lc3NhZ2VfdXRpbC5oICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmggICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyLmggICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL3RpbWVfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucGIuaAorCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJwcm90b2J1Zi1saXRlLmxhIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYQorCitsaWJwcm90b2J1Zl9saXRlX2xhX0xJQkFERCA9ICQoUFRIUkVBRF9MSUJTKSAkKExJQkFUT01JQ19MSUJTKQorbGlicHJvdG9idWZfbGl0ZV9sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyAkKFBST1RPQlVGX1ZFUlNJT04pIC1leHBvcnQtZHluYW1pYyAtbm8tdW5kZWZpbmVkCitpZiBIQVZFX0xEX1ZFUlNJT05fU0NSSVBUCitsaWJwcm90b2J1Zl9saXRlX2xhX0xERkxBR1MgKz0gLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JChzcmNkaXIpL2xpYnByb3RvYnVmLWxpdGUubWFwCitFWFRSQV9saWJwcm90b2J1Zl9saXRlX2xhX0RFUEVOREVOQ0lFUyA9IGxpYnByb3RvYnVmLWxpdGUubWFwCitlbmRpZgorbGlicHJvdG9idWZfbGl0ZV9sYV9TT1VSQ0VTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYW55X2xpdGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYXJlbmEuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYXJlbmF6X3NhbXBsZXIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fdXRpbC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlLmNjICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5jYyAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW1wbGljaXRfd2Vha19tZXNzYWdlLmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW5saW5lZF9zdHJpbmdfZmllbGQuY2MgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vaW9fd2luMzIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vc3RydG9kLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuY2MgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcGFyc2VfY29udGV4dC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfcHRyX2ZpZWxkLmNjICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3RyaW5nX21lbWJlcl9yb2JiZXIuaCAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvbWF0aHV0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzX21hY3Jvcy5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3IuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3IuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2UuY2MgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmNjICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmggICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5jYworCitsaWJwcm90b2J1Zl9sYV9MSUJBREQgPSAkKFBUSFJFQURfTElCUykgJChMSUJBVE9NSUNfTElCUykKK2xpYnByb3RvYnVmX2xhX0xERkxBR1MgPSAtdmVyc2lvbi1pbmZvICQoUFJPVE9CVUZfVkVSU0lPTikgLWV4cG9ydC1keW5hbWljIC1uby11bmRlZmluZWQKK2lmIEhBVkVfTERfVkVSU0lPTl9TQ1JJUFQKK2xpYnByb3RvYnVmX2xhX0xERkxBR1MgKz0gLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JChzcmNkaXIpL2xpYnByb3RvYnVmLm1hcAorRVhUUkFfbGlicHJvdG9idWZfbGFfREVQRU5ERU5DSUVTID0gbGlicHJvdG9idWYubWFwCitlbmRpZgorbGlicHJvdG9idWZfbGFfU09VUkNFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAkKGxpYnByb3RvYnVmX2xpdGVfbGFfU09VUkNFUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYW55LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYW55LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYXBpLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZW1wdHkucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF9oZWF2eS5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfYmFzZXMuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9mdWxsLmNjICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc2VydmljZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3RydWN0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdHlwZS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9kZWxpbWl0ZWRfbWVzc2FnZV91dGlsLmNjICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9jb25zdGFudHMuaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kYXRhcGllY2UuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kYXRhcGllY2UuaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5jYyAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5oICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9lcnJvcl9saXN0ZW5lci5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9lcnJvcl9saXN0ZW5lci5oICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9leHBlY3Rpbmdfb2JqZWN0d3JpdGVyLmggICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9maWVsZF9tYXNrX3V0aWxpdHkuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9maWVsZF9tYXNrX3V0aWxpdHkuaCAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX2VzY2FwaW5nLmNjICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX2VzY2FwaW5nLmggICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlci5jYyAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlci5oICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuaCAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9sb2NhdGlvbl90cmFja2VyLmggICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9tb2NrX2Vycm9yX2xpc3RlbmVyLmggICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3RfbG9jYXRpb25fdHJhY2tlci5oICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfc291cmNlLmggICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfd3JpdGVyLmNjICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfd3JpdGVyLmggICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b193cml0ZXIuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b193cml0ZXIuaCAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2UuY2MgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2UuaCAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuY2MgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuaCAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9zdHJ1Y3R1cmVkX29iamVjdHdyaXRlci5oICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm8uY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm8uaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuaCAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucGIuY2MKKworbm9kaXN0X2xpYnByb3RvYnVmX2xhX1NPVVJDRVMgPSAkKG5vZGlzdF9saWJwcm90b2J1Zl9saXRlX2xhX1NPVVJDRVMpCisKK2xpYnByb3RvY19sYV9MSUJBREQgPSAkKFBUSFJFQURfTElCUykgbGlicHJvdG9idWYubGEKK2xpYnByb3RvY19sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyAkKFBST1RPQlVGX1ZFUlNJT04pIC1leHBvcnQtZHluYW1pYyAtbm8tdW5kZWZpbmVkCitpZiBIQVZFX0xEX1ZFUlNJT05fU0NSSVBUCitsaWJwcm90b2NfbGFfTERGTEFHUyArPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD0kKHNyY2RpcikvbGlicHJvdG9jLm1hcAorRVhUUkFfbGlicHJvdG9jX2xhX0RFUEVOREVOQ0lFUyA9IGxpYnByb3RvYy5tYXAKK2VuZGlmCitsaWJwcm90b2NfbGFfU09VUkNFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmNjICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZW51bS5jYyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZW51bS5oICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZW51bV9maWVsZC5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZW51bV9maWVsZC5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZXh0ZW5zaW9uLmNjICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZXh0ZW5zaW9uLmggICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmllbGQuY2MgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmllbGQuaCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmlsZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZ2VuZXJhdG9yLmNjICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvaGVscGVycy5jYyAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWFwX2ZpZWxkLmNjICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWFwX2ZpZWxkLmggICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZS5jYyAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZS5oICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9maWVsZC5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9maWVsZC5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9sYXlvdXRfaGVscGVyLmggICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvb3B0aW9ucy5oICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFkZGluZ19vcHRpbWl6ZXIuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFkZGluZ19vcHRpbWl6ZXIuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yLmNjICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yLmggICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJpbWl0aXZlX2ZpZWxkLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJpbWl0aXZlX2ZpZWxkLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvc2VydmljZS5jYyAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvc2VydmljZS5oICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvc3RyaW5nX2ZpZWxkLmNjICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvc3RyaW5nX2ZpZWxkLmggICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50LmNjICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW0uY2MgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW0uaCAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW1fZmllbGQuY2MgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW1fZmllbGQuaCAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuY2MgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuaCAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5jYyAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5jYyAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5oICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2UuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2UuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2VfZmllbGQuY2MgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2VfZmllbGQuaCAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3ByaW1pdGl2ZV9maWVsZC5jYyAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3ByaW1pdGl2ZV9maWVsZC5oICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlZmxlY3Rpb25fY2xhc3MuY2MgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlZmxlY3Rpb25fY2xhc3MuaCAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuY2MgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9lbnVtX2ZpZWxkLmggXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9tZXNzYWdlX2ZpZWxkLmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfbWVzc2FnZV9maWVsZC5oIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfcHJpbWl0aXZlX2ZpZWxkLmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfcHJpbWl0aXZlX2ZpZWxkLmggXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9zb3VyY2VfZ2VuZXJhdG9yX2Jhc2UuY2MgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9zb3VyY2VfZ2VuZXJhdG9yX2Jhc2UuaCBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3dyYXBwZXJfZmllbGQuY2MgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3dyYXBwZXJfZmllbGQuaCAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2NvbnRleHQuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2NvbnRleHQuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50LmNjICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50LmggICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW0uY2MgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW0uaCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGQuY2MgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGQuaCAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGRfbGl0ZS5jYyAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGRfbGl0ZS5oICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fbGl0ZS5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fbGl0ZS5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbi5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbi5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbl9saXRlLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbl9saXRlLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmNjICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmggICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpbGUuY2MgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpbGUuaCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvcl9mYWN0b3J5LmNjICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvcl9mYWN0b3J5LmggICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2tvdGxpbl9nZW5lcmF0b3IuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZC5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZC5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZF9saXRlLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZF9saXRlLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2UuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2UuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlci5jYyAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlci5oICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlcl9saXRlLmNjICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlcl9saXRlLmggICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfZmllbGQuY2MgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfZmllbGQuaCAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfZmllbGRfbGl0ZS5jYyAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfZmllbGRfbGl0ZS5oICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfbGl0ZS5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfbGl0ZS5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL25hbWVfcmVzb2x2ZXIuY2MgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL25hbWVfcmVzb2x2ZXIuaCAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL29wdGlvbnMuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3ByaW1pdGl2ZV9maWVsZC5jYyAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3ByaW1pdGl2ZV9maWVsZC5oICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3ByaW1pdGl2ZV9maWVsZF9saXRlLmNjICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3ByaW1pdGl2ZV9maWVsZF9saXRlLmggICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3NlcnZpY2UuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3NlcnZpY2UuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3NoYXJlZF9jb2RlX2dlbmVyYXRvci5jYyAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3NoYXJlZF9jb2RlX2dlbmVyYXRvci5oICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3N0cmluZ19maWVsZC5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3N0cmluZ19maWVsZC5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3N0cmluZ19maWVsZF9saXRlLmNjICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3N0cmluZ19maWVsZF9saXRlLmggICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bS5jYyAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bS5oICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5jYyBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5oICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZXh0ZW5zaW9uLmNjICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZXh0ZW5zaW9uLmggICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmllbGQuY2MgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmllbGQuaCAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmlsZS5jYyAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmlsZS5oICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZ2VuZXJhdG9yLmNjICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5jYyAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWFwX2ZpZWxkLmNjICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWFwX2ZpZWxkLmggICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZS5jYyAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZS5oICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5jYyBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5oIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19uc29iamVjdF9tZXRob2RzLmggXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX29uZW9mLmNjICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX29uZW9mLmggICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX3ByaW1pdGl2ZV9maWVsZC5jYyBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfcHJpbWl0aXZlX2ZpZWxkLmggXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGhwL3BocF9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2hlbHBlcnMuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2hlbHBlcnMuaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5aV9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc2NjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oCisKK2Jpbl9QUk9HUkFNUyA9IHByb3RvYworcHJvdG9jX0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYQorcHJvdG9jX1NPVVJDRVMgPSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbWFpbi5jYworCisjIFRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3Byb3RvY19pbnB1dHMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90byAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2xhcmdlX2VudW1fdmFsdWUucHJvdG8gICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucHJvdG8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucHJvdG8gICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90byAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucHJvdG8gICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8gICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wcm90byAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnByb3RvICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucHJvdG8gIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucHJvdG8gICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnByb3RvICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucHJvdG8gICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnByb3RvICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8gICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wcm90byAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucHJvdG8gICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wcm90byAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnByb3RvICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnByb3RvICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wcm90byAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucHJvdG8gICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wcm90byAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucHJvdG8gICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wcm90byAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnByb3RvIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wcm90byAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wcm90byAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnByb3RvICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnByb3RvICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnByb3RvICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnByb3RvIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucHJvdG8gICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnByb3RvICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wcm90bworCitFWFRSQV9ESVNUID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICQocHJvdG9jX2lucHV0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFJFQURNRS5tZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYWNrYWdlX2luZm8uaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX2NvZGUucHJvdG8gICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX2NvZGVfcGIucmIgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX2NvZGVfcHJvdG8yLnByb3RvIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfY29kZV9wcm90bzJfaW1wb3J0LnByb3RvIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfY29kZV9wcm90bzJfcGIucmIgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9wa2dfZXhwbGljaXQucHJvdG8gXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9wa2dfZXhwbGljaXRfbGVnYWN5LnByb3RvIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfcGtnX2V4cGxpY2l0X2xlZ2FjeV9wYi5yYiBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX3BrZ19leHBsaWNpdF9wYi5yYiBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX3BrZ19pbXBsaWNpdC5wcm90byBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX3BrZ19pbXBsaWNpdF9wYi5yYiBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfb3V0cHV0X3VuaXR0ZXN0LnNoICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaCAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby9wYWNrYWdlX2luZm8uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9wYWNrYWdlX2luZm8uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0X21lc3NhZ2VzX3Byb3RvMi5wcm90byAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0X21lc3NhZ2VzX3Byb3RvMy5wcm90byAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9iYWRfdXRmOF9zdHJpbmcgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9tYXBzICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9vbmVvZl9pbXBsZW1lbnRlZCAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9wcm90bzMgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fcGFja2VkX2ZpZWxkc19tZXNzYWdlICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9tYXBfdGVzdF9kYXRhLnR4dCAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dCAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX29uZW9mX2ltcGxlbWVudGVkLnR4dCBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX3BvaW50eS50eHQgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9wb2ludHlfb25lb2YudHh0IFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhX3BvaW50eS50eHQgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9wYWNrYWdlX2luZm8uaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsaWJwcm90b2J1Zi1saXRlLm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsaWJwcm90b2J1Zi5tYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsaWJwcm90b2MubWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzb2xhcmlzL2xpYnN0ZGMrKy5sYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworcHJvdG9jX2xpdGVfb3V0cHV0cyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuaCAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmggICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5oCisKK3Byb3RvY19vdXRwdXRzID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgJChwcm90b2NfbGl0ZV9vdXRwdXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5oICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuY2MgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuaCAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucGIuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucGIuaCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmggICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuaCAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5oICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuaCAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuaCAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLmggICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuY2MgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuaCAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuaCAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmggICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuaCAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmggICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuaCAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5oICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5jYyAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5oICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuY2MgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuaCAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5oICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmggICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmggICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5oICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuY2MgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuaCAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYyAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5oICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuaCAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYyAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5oICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmggIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5jYyAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5oICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYyAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5oICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmggICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnBiLmNjICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnBiLmggICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmggICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmggIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucGIuY2MgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucGIuaCAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmggICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5jYyAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5oCisKK2lmIFVTRV9FWFRFUk5BTF9QUk9UT0MKKwordW5pdHRlc3RfcHJvdG9fbWlkZGxlbWFuOiAkKHByb3RvY19pbnB1dHMpCisJJChQUk9UT0MpIC1JJChzcmNkaXIpIC0tY3BwX291dD0uICReCisJdG91Y2ggdW5pdHRlc3RfcHJvdG9fbWlkZGxlbWFuCisKK2Vsc2UKKworIyBXZSBoYXZlIHRvIGNkIHRvICQoc3JjZGlyKSBiZWZvcmUgZXhlY3V0aW5nIHByb3RvYyBiZWNhdXNlICQocHJvdG9jX2lucHV0cykgaXMKKyMgcmVsYXRpdmUgdG8gc3JjZGlyLCB3aGljaCBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGVuCisjIGJ1aWxkaW5nIG91dC1vZi10cmVlLgordW5pdHRlc3RfcHJvdG9fbWlkZGxlbWFuOiBwcm90b2MkKEVYRUVYVCkgJChwcm90b2NfaW5wdXRzKQorCW9sZHB3ZD1gcHdkYCAmJiAoIGNkICQoc3JjZGlyKSAmJiAkJG9sZHB3ZC9wcm90b2MkKEVYRUVYVCkgLUkuIC0tY3BwX291dD0kJG9sZHB3ZCAkKHByb3RvY19pbnB1dHMpIC0tZXhwZXJpbWVudGFsX2FsbG93X3Byb3RvM19vcHRpb25hbCApCisJdG91Y2ggdW5pdHRlc3RfcHJvdG9fbWlkZGxlbWFuCisKK2VuZGlmCisKKyQocHJvdG9jX291dHB1dHMpOiB1bml0dGVzdF9wcm90b19taWRkbGVtYW4KKworQ09NTU9OX1RFU1RfU09VUkNFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAkKENPTU1PTl9MSVRFX1RFU1RfU09VUkNFUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3RfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3RfdXRpbC5pbmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmluYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsMi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmgKKworR09PR0xFVEVTVF9CVUlMRF9ESVI9Li4vdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0CitHT09HTEVNT0NLX0JVSUxEX0RJUj0uLi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2sKK0dPT0dMRVRFU1RfU1JDX0RJUj0kKHNyY2RpcikvLi4vdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0CitHT09HTEVNT0NLX1NSQ19ESVI9JChzcmNkaXIpLy4uL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jaworY2hlY2tfUFJPR1JBTVMgPSBwcm90b2MgcHJvdG9idWYtdGVzdCBwcm90b2J1Zi1sYXp5LWRlc2NyaXB0b3ItdGVzdCBcCisgICAgICAgICAgICAgICAgIHByb3RvYnVmLWxpdGUtdGVzdCB0ZXN0X3BsdWdpbiBwcm90b2J1Zi1saXRlLWFyZW5hLXRlc3QgXAorICAgICAgICAgICAgICAgICBuby13YXJuaW5nLXRlc3QgJChHWkNIRUNLUFJPR1JBTVMpCitwcm90b2J1Zl90ZXN0X0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVURVNUX0JVSUxEX0RJUikvbGliL2xpYmd0ZXN0LmxhICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVNT0NLX0JVSUxEX0RJUikvbGliL2xpYmdtb2NrLmxhICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVNT0NLX0JVSUxEX0RJUikvbGliL2xpYmdtb2NrX21haW4ubGEKK3Byb3RvYnVmX3Rlc3RfQ1BQRkxBR1MgPSAtSSQoR09PR0xFVEVTVF9TUkNfRElSKS9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtSSQoR09PR0xFTU9DS19TUkNfRElSKS9pbmNsdWRlCisjIERpc2FibGUgb3B0aW1pemF0aW9uIGZvciB0ZXN0cyB1bmxlc3MgdGhlIHVzZXIgZXhwbGljaXRseSBhc2tlZCBmb3IgaXQsCisjIHNpbmNlIHRlc3RfdXRpbC5jYyB0YWtlcyBmb3JldmVyIHRvIGNvbXBpbGUgd2l0aCBvcHRpbWl6YXRpb24gKHdpdGggR0NDKS4KKyMgU2VlIGNvbmZpZ3VyZS5hYyBmb3IgbW9yZSBpbmZvLgorcHJvdG9idWZfdGVzdF9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKQorcHJvdG9idWZfdGVzdF9TT1VSQ0VTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAkKENPTU1PTl9URVNUX1NPVVJDRVMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYXJlbmFfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmdfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYXJlbmF6X3NhbXBsZXJfdGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvYW5ub3RhdGlvbl90ZXN0X3V0aWwuY2MgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvYW5ub3RhdGlvbl90ZXN0X3V0aWwuaCAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5jYyAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2Jvb3RzdHJhcF91bml0dGVzdC5jYyAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2Vfc2l6ZV91bml0dGVzdC5jYyAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21ldGFkYXRhX3Rlc3QuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21vdmVfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3BsdWdpbl91bml0dGVzdC5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmluYyAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9ib290c3RyYXBfdW5pdHRlc3QuY2MgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9nZW5lcmF0b3JfdW5pdHRlc3QuY2MgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudF91bml0dGVzdC5jYyAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wbHVnaW5fdW5pdHRlc3QuY2MgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuY2MgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3BsdWdpbl91bml0dGVzdC5jYyAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5jYyAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYyAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlX3Rlc3QuY2MgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW5saW5lZF9zdHJpbmdfZmllbGRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vaW9fd2luMzJfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX3Rlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuaW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5pbmMgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbm9fZmllbGRfcHJlc2VuY2VfdGVzdC5jYyAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuaW5jICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5jYyAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4X3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzX3Rlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3JfdGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZV90ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9kZWxpbWl0ZWRfbWVzc2FnZV91dGlsX3Rlc3QuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yX3Rlc3QuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWxfdGVzdC5jYyAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0LmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXJfdGVzdC5jYyAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuY2MgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuY2MgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5jYyBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mb190ZXN0X2hlbHBlci5jYyAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbF90ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QuY2MgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL3RpbWVfdXRpbF90ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0LmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi93ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5pbmMKKworbm9kaXN0X3Byb3RvYnVmX3Rlc3RfU09VUkNFUyA9ICQocHJvdG9jX291dHB1dHMpCiskKGFtX3Byb3RvYnVmX3Rlc3RfT0JKRUNUUyk6IHVuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbgorCisjIFJ1biBjcHBfdW5pdHRlc3QgYWdhaW4gd2l0aCBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTIGRlZmluZWQuCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgbGlicHJvdG9jLmxhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVURVNUX0JVSUxEX0RJUikvbGliL2xpYmd0ZXN0LmxhICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVNT0NLX0JVSUxEX0RJUikvbGliL2xpYmdtb2NrLmxhICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVNT0NLX0JVSUxEX0RJUikvbGliL2xpYmdtb2NrX21haW4ubGEKK3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTID0gLUkkKEdPT0dMRU1PQ0tfU1JDX0RJUikvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1JJChHT09HTEVURVNUX1NSQ19ESVIpL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKK3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTID0gJChOT19PUFRfQ1hYRkxBR1MpCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9TT1VSQ0VTID0gICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICBcCisgICQoQ09NTU9OX1RFU1RfU09VUkNFUykKK25vZGlzdF9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9TT1VSQ0VTID0gJChwcm90b2Nfb3V0cHV0cykKKyQoYW1fcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfT0JKRUNUUyk6IHVuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbgorCitDT01NT05fTElURV9URVNUX1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3RfdXRpbF9pbXBsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmgKKworIyBCdWlsZCBsaXRlX3VuaXR0ZXN0IHNlcGFyYXRlbHksIHNpbmNlIGl0IGRvZXNuJ3QgdXNlIGd0ZXN0LiBJdCBjYW4ndAorIyBkZXBlbmQgb24gZ3Rlc3QgYmVjYXVzZSBvdXIgaW50ZXJuYWwgdmVyc2lvbiBvZiBndGVzdCBkZXBlbmQgb24gcHJvdG8KKyMgZnVsbCBydW50aW1lIGFuZCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGlzIHRlc3QgYnVpbGRzIHdpdGhvdXQgZnVsbAorIyBydW50aW1lLgorcHJvdG9idWZfbGl0ZV90ZXN0X0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLWxpdGUubGEgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICQoR09PR0xFVEVTVF9CVUlMRF9ESVIpL2xpYi9saWJndGVzdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEdPT0dMRU1PQ0tfQlVJTERfRElSKS9saWIvbGliZ21vY2subGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVNT0NLX0JVSUxEX0RJUikvbGliL2xpYmdtb2NrX21haW4ubGEKK3Byb3RvYnVmX2xpdGVfdGVzdF9DUFBGTEFHUz0gLUkkKEdPT0dMRU1PQ0tfU1JDX0RJUikvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1JJChHT09HTEVURVNUX1NSQ19ESVIpL2luY2x1ZGUKK3Byb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKQorcHJvdG9idWZfbGl0ZV90ZXN0X1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgJChDT01NT05fTElURV9URVNUX1NPVVJDRVMpCitub2Rpc3RfcHJvdG9idWZfbGl0ZV90ZXN0X1NPVVJDRVMgPSAkKHByb3RvY19saXRlX291dHB1dHMpCiskKGFtX3Byb3RvYnVmX2xpdGVfdGVzdF9PQkpFQ1RTKTogdW5pdHRlc3RfcHJvdG9fbWlkZGxlbWFuCisKKyMgbGl0ZV9hcmVuYV91bml0dGVzdCBkZXBlbmRzIG9uIGd0ZXN0IGJlY2F1c2UgdGVib3JpbmdAIGZvdW5kIHRoYXQgd2l0aG91dAorIyBndGVzdCB3aGVuIGJ1aWxkaW5nIHRoZSB0ZXN0IGludGVybmFsbHkgb3VyIG1lbW9yeSBzYW5pdGl6ZXIgZG9lc24ndCBkZXRlY3QKKyMgbWVtb3J5IGxlYWtzIChkb24ndCBrbm93IHdoeSkuCitwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfTERBREQgPSAkKFBUSFJFQURfTElCUykgbGlicHJvdG9idWYtbGl0ZS5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVURVNUX0JVSUxEX0RJUikvbGliL2xpYmd0ZXN0LmxhICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVNT0NLX0JVSUxEX0RJUikvbGliL2xpYmdtb2NrLmxhICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVNT0NLX0JVSUxEX0RJUikvbGliL2xpYmdtb2NrX21haW4ubGEKK3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DUFBGTEFHUyA9IC1JJChHT09HTEVNT0NLX1NSQ19ESVIpL2luY2x1ZGUgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1JJChHT09HTEVURVNUX1NSQ19ESVIpL2luY2x1ZGUKK3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKQorcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X1NPVVJDRVMgPSAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9saXRlX2FyZW5hX3VuaXR0ZXN0LmNjIFwKKyAgJChDT01NT05fTElURV9URVNUX1NPVVJDRVMpCitub2Rpc3RfcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X1NPVVJDRVMgPSAkKHByb3RvY19saXRlX291dHB1dHMpCiskKGFtX3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9PQkpFQ1RTKTogdW5pdHRlc3RfcHJvdG9fbWlkZGxlbWFuCisKKyMgVGVzdCBwbHVnaW4gYmluYXJ5LgordGVzdF9wbHVnaW5fTERBREQgPSAkKFBUSFJFQURfTElCUykgbGlicHJvdG9idWYubGEgbGlicHJvdG9jLmxhIFwKKyAgICAgICAgICAgICAgICAgICAgJChHT09HTEVURVNUX0JVSUxEX0RJUikvbGliL2xpYmd0ZXN0LmxhCit0ZXN0X3BsdWdpbl9DUFBGTEFHUyA9IC1JJChHT09HTEVURVNUX1NSQ19ESVIpL2luY2x1ZGUKK3Rlc3RfcGx1Z2luX1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oCisKK2lmIEhBVkVfWkxJQgoremNnemlwX0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhCit6Y2d6aXBfU09VUkNFUyA9IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3ppcC5jYworCit6Y2d1bnppcF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYQoremNndW56aXBfU09VUkNFUyA9IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3VuemlwLmNjCitlbmRpZgorCisjIFRoaXMgdGVzdCB0YXJnZXQgaXMgdG8gZW5zdXJlIGFsbCBvdXIgcHVibGljIGhlYWRlciBmaWxlcyBhbmQgZ2VuZXJhdGVkCisjIGNvZGUgaXMgZnJlZSBmcm9tIHdhcm5pbmdzLiBXZSBoYXZlIHRvIGJlIG1vcmUgcGVkYW50aWMgYWJvdXQgdGhlc2UKKyMgZmlsZXMgYmVjYXVzZSB0aGV5IGFyZSBjb21waWxlZCBieSB1c2VycyB3aXRoIGRpZmZlcmVudCBjb21waWxlciBmbGFncy4KK25vX3dhcm5pbmdfdGVzdC5jYzoKKwllY2hvICIvLyBHZW5lcmF0ZWQgZnJvbSBNYWtlZmlsZS5hbSIgPiBub193YXJuaW5nX3Rlc3QuY2MKKwlmb3IgRklMRSBpbiAkKG5vYmFzZV9pbmNsdWRlX0hFQURFUlMpOyBkbyBcCisJCWNhc2UgJCRGSUxFIGluICouaW5jKSBjb250aW51ZTs7IGVzYWM7IFwKKwkJZWNobyAiI2luY2x1ZGUgPCQke0ZJTEV9PiIgPj4gbm9fd2FybmluZ190ZXN0LmNjOyBcCisJZG9uZQorCWVjaG8gImludCBtYWluKGludCwgY2hhcioqKSB7IHJldHVybiAwOyB9IiA+PiBub193YXJuaW5nX3Rlc3QuY2MKKworbm9fd2FybmluZ190ZXN0X0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYQorbm9fd2FybmluZ190ZXN0X0NYWEZMQUdTID0gJChQVEhSRUFEX0NGTEFHUykgJChQVEhSRUFEX0RFRikgJChaTElCX0RFRikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLVdhbGwgLVdleHRyYSAtV2Vycm9yIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorbm9kaXN0X25vX3dhcm5pbmdfdGVzdF9TT1VSQ0VTID0gbm9fd2FybmluZ190ZXN0LmNjICQocHJvdG9jX291dHB1dHMpCisKK1RFU1RTID0gcHJvdG9idWYtdGVzdCBwcm90b2J1Zi1sYXp5LWRlc2NyaXB0b3ItdGVzdCBwcm90b2J1Zi1saXRlLXRlc3QgXAorICAgICAgICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX291dHB1dF91bml0dGVzdC5zaCAkKEdaVEVTVFMpICAgICBcCisgICAgICAgIHByb3RvYnVmLWxpdGUtYXJlbmEtdGVzdCBuby13YXJuaW5nLXRlc3QKZGlmZiAtLWdpdCBhL3NyYy9NYWtlZmlsZS5pbiBiL3NyYy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGIxNDI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsOTUyMiBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xNi41IGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LTIwMjEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworCisKKworVlBBVEggPSBAc3JjZGlyQAorYW1fX2lzX2dudV9tYWtlID0geyBcCisgIGlmIHRlc3QgLXogJyQoTUFLRUxFVkVMKSc7IHRoZW4gXAorICAgIGZhbHNlOyBcCisgIGVsaWYgdGVzdCAtbiAnJChNQUtFX0hPU1QpJzsgdGhlbiBcCisgICAgdHJ1ZTsgXAorICBlbGlmIHRlc3QgLW4gJyQoTUFLRV9WRVJTSU9OKScgJiYgdGVzdCAtbiAnJChDVVJESVIpJzsgdGhlbiBcCisgICAgdHJ1ZTsgXAorICBlbHNlIFwKKyAgICBmYWxzZTsgXAorICBmaTsgXAorfQorYW1fX21ha2VfcnVubmluZ193aXRoX29wdGlvbiA9IFwKKyAgY2FzZSAkJHt0YXJnZXRfb3B0aW9uLX0gaW4gXAorICAgICAgPykgOzsgXAorICAgICAgKikgZWNobyAiYW1fX21ha2VfcnVubmluZ193aXRoX29wdGlvbjogaW50ZXJuYWwgZXJyb3I6IGludmFsaWQiIFwKKyAgICAgICAgICAgICAgInRhcmdldCBvcHRpb24gJyQke3RhcmdldF9vcHRpb24tfScgc3BlY2lmaWVkIiA+JjI7IFwKKyAgICAgICAgIGV4aXQgMTs7IFwKKyAgZXNhYzsgXAorICBoYXNfb3B0PW5vOyBcCisgIHNhbmVfbWFrZWZsYWdzPSQkTUFLRUZMQUdTOyBcCisgIGlmICQoYW1fX2lzX2dudV9tYWtlKTsgdGhlbiBcCisgICAgc2FuZV9tYWtlZmxhZ3M9JCRNRkxBR1M7IFwKKyAgZWxzZSBcCisgICAgY2FzZSAkJE1BS0VGTEFHUyBpbiBcCisgICAgICAqXFxbXCBcCV0qKSBcCisgICAgICAgIGJzPVxcOyBcCisgICAgICAgIHNhbmVfbWFrZWZsYWdzPWBwcmludGYgJyVzXG4nICIkJE1BS0VGTEFHUyIgXAorICAgICAgICAgIHwgc2VkICJzLyQkYnMkJGJzWyQkYnMgJCRicwldKi8vZyJgOzsgXAorICAgIGVzYWM7IFwKKyAgZmk7IFwKKyAgc2tpcF9uZXh0PW5vOyBcCisgIHN0cmlwX3RyYWlsb3B0ICgpIFwKKyAgeyBcCisgICAgZmxnPWBwcmludGYgJyVzXG4nICIkJGZsZyIgfCBzZWQgInMvJCQxLiokJC8vImA7IFwKKyAgfTsgXAorICBmb3IgZmxnIGluICQkc2FuZV9tYWtlZmxhZ3M7IGRvIFwKKyAgICB0ZXN0ICQkc2tpcF9uZXh0ID0geWVzICYmIHsgc2tpcF9uZXh0PW5vOyBjb250aW51ZTsgfTsgXAorICAgIGNhc2UgJCRmbGcgaW4gXAorICAgICAgKj0qfC0tKikgY29udGludWU7OyBcCisgICAgICAgIC0qSSkgc3RyaXBfdHJhaWxvcHQgJ0knOyBza2lwX25leHQ9eWVzOzsgXAorICAgICAgLSpJPyopIHN0cmlwX3RyYWlsb3B0ICdJJzs7IFwKKyAgICAgICAgLSpPKSBzdHJpcF90cmFpbG9wdCAnTyc7IHNraXBfbmV4dD15ZXM7OyBcCisgICAgICAtKk8/Kikgc3RyaXBfdHJhaWxvcHQgJ08nOzsgXAorICAgICAgICAtKmwpIHN0cmlwX3RyYWlsb3B0ICdsJzsgc2tpcF9uZXh0PXllczs7IFwKKyAgICAgIC0qbD8qKSBzdHJpcF90cmFpbG9wdCAnbCc7OyBcCisgICAgICAtW2RFRG1dKSBza2lwX25leHQ9eWVzOzsgXAorICAgICAgLVtKVF0pIHNraXBfbmV4dD15ZXM7OyBcCisgICAgZXNhYzsgXAorICAgIGNhc2UgJCRmbGcgaW4gXAorICAgICAgKiQkdGFyZ2V0X29wdGlvbiopIGhhc19vcHQ9eWVzOyBicmVhazs7IFwKKyAgICBlc2FjOyBcCisgIGRvbmU7IFwKKyAgdGVzdCAkJGhhc19vcHQgPSB5ZXMKK2FtX19tYWtlX2RyeXJ1biA9ICh0YXJnZXRfb3B0aW9uPW47ICQoYW1fX21ha2VfcnVubmluZ193aXRoX29wdGlvbikpCithbV9fbWFrZV9rZWVwZ29pbmcgPSAodGFyZ2V0X29wdGlvbj1rOyAkKGFtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb24pKQorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAordGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAorQEhBVkVfTERfVkVSU0lPTl9TQ1JJUFRfVFJVRUBhbV9fYXBwZW5kXzEgPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD0kKHNyY2RpcikvbGlicHJvdG9idWYtbGl0ZS5tYXAKK0BIQVZFX0xEX1ZFUlNJT05fU0NSSVBUX1RSVUVAYW1fX2FwcGVuZF8yID0gLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JChzcmNkaXIpL2xpYnByb3RvYnVmLm1hcAorQEhBVkVfTERfVkVSU0lPTl9TQ1JJUFRfVFJVRUBhbV9fYXBwZW5kXzMgPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD0kKHNyY2RpcikvbGlicHJvdG9jLm1hcAorYmluX1BST0dSQU1TID0gcHJvdG9jJChFWEVFWFQpCitjaGVja19QUk9HUkFNUyA9IHByb3RvYyQoRVhFRVhUKSBwcm90b2J1Zi10ZXN0JChFWEVFWFQpIFwKKwlwcm90b2J1Zi1sYXp5LWRlc2NyaXB0b3ItdGVzdCQoRVhFRVhUKSBcCisJcHJvdG9idWYtbGl0ZS10ZXN0JChFWEVFWFQpIHRlc3RfcGx1Z2luJChFWEVFWFQpIFwKKwlwcm90b2J1Zi1saXRlLWFyZW5hLXRlc3QkKEVYRUVYVCkgbm8td2FybmluZy10ZXN0JChFWEVFWFQpIFwKKwkkKGFtX19FWEVFWFRfMSkKK1RFU1RTID0gcHJvdG9idWYtdGVzdCQoRVhFRVhUKSBwcm90b2J1Zi1sYXp5LWRlc2NyaXB0b3ItdGVzdCQoRVhFRVhUKSBcCisJcHJvdG9idWYtbGl0ZS10ZXN0JChFWEVFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX291dHB1dF91bml0dGVzdC5zaCBcCisJJChhbV9fRVhFRVhUXzIpIHByb3RvYnVmLWxpdGUtYXJlbmEtdGVzdCQoRVhFRVhUKSBcCisJbm8td2FybmluZy10ZXN0JChFWEVFWFQpCitzdWJkaXIgPSBzcmMKK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL200L2FjX3N5c3RlbV9leHRlbnNpb25zLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2FjeF9jaGVja19zdW5jYy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jeHhfY29tcGlsZV9zdGRjeHgubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfcHJvZ19jY19mb3JfYnVpbGQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfcHJvZ19jeHhfZm9yX2J1aWxkLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X3B0aHJlYWQubTQgJCh0b3Bfc3JjZGlyKS9tNC9saWJ0b29sLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0b3B0aW9ucy5tNCAkKHRvcF9zcmNkaXIpL200L2x0c3VnYXIubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHR2ZXJzaW9uLm00ICQodG9wX3NyY2RpcikvbTQvbHR+b2Jzb2xldGUubTQgXAorCSQodG9wX3NyY2RpcikvbTQvc3RsX2hhc2gubTQgJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChub2Jhc2VfZGlzdF9wcm90b19EQVRBKSBcCisJJChhbV9fbm9iYXNlX2luY2x1ZGVfSEVBREVSU19ESVNUKSAkKGFtX19ESVNUX0NPTU1PTikKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChiaW5kaXIpIiAiJChERVNURElSKSQobGliZGlyKSIgXAorCSIkKERFU1RESVIpJChwcm90b2RpcikiICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSIKK0BIQVZFX1pMSUJfVFJVRUBhbV9fRVhFRVhUXzEgPSB6Y2d6aXAkKEVYRUVYVCkgemNndW56aXAkKEVYRUVYVCkKK1BST0dSQU1TID0gJChiaW5fUFJPR1JBTVMpCithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsX21heCA9IDQwCithbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAorICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCithbV9fbm9iYXNlX3N0cmlwID0gXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKK2FtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKyAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKKyAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAorICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKKyAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKKyAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCithbV9fYmFzZV9saXN0ID0gXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCithbV9fdW5pbnN0YWxsX2ZpbGVzX2Zyb21fZGlyID0geyBcCisgIHRlc3QgLXogIiQkZmlsZXMiIFwKKyAgICB8fCB7IHRlc3QgISAtZCAiJCRkaXIiICYmIHRlc3QgISAtZiAiJCRkaXIiICYmIHRlc3QgISAtciAiJCRkaXIiOyB9IFwKKyAgICB8fCB7IGVjaG8gIiAoIGNkICckJGRpcicgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisgICAgICAgICAkKGFtX19jZCkgIiQkZGlyIiAmJiBybSAtZiAkJGZpbGVzOyB9OyBcCisgIH0KK0xUTElCUkFSSUVTID0gJChsaWJfTFRMSUJSQVJJRVMpCithbV9fREVQRU5ERU5DSUVTXzEgPQorbGlicHJvdG9idWZfbGl0ZV9sYV9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKQorYW1fX2RpcnN0YW1wID0gJChhbV9fbGVhZGluZ19kb3QpZGlyc3RhbXAKK2FtX2xpYnByb3RvYnVmX2xpdGVfbGFfT0JKRUNUUyA9IGdvb2dsZS9wcm90b2J1Zi9hbnlfbGl0ZS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmxvIGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2FyZW5hel9zYW1wbGVyLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3V0aWwubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGUubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvaW1wbGljaXRfd2Vha19tZXNzYWdlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvaW5saW5lZF9zdHJpbmdfZmllbGQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0ubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMi5sbyBnb29nbGUvcHJvdG9idWYvaW8vc3RydG9kLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvbWFwLmxvIGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9wYXJzZV9jb250ZXh0LmxvIFwKKwlnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9wdHJfZmllbGQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4LmxvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3IubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwubG8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWUubG8gXAorCWdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmxvCitsaWJwcm90b2J1Zl9saXRlX2xhX09CSkVDVFMgPSAkKGFtX2xpYnByb3RvYnVmX2xpdGVfbGFfT0JKRUNUUykKK0FNX1ZfbHQgPSAkKGFtX192X2x0X0BBTV9WQCkKK2FtX192X2x0XyA9ICQoYW1fX3ZfbHRfQEFNX0RFRkFVTFRfVkApCithbV9fdl9sdF8wID0gLS1zaWxlbnQKK2FtX192X2x0XzEgPSAKK2xpYnByb3RvYnVmX2xpdGVfbGFfTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DWFggXAorCSQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDWFhMRCkgXAorCSQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpICQobGlicHJvdG9idWZfbGl0ZV9sYV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorbGlicHJvdG9idWZfbGFfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpIFwKKwkkKGFtX19ERVBFTkRFTkNJRVNfMSkKK2FtX19vYmplY3RzXzEgPSBnb29nbGUvcHJvdG9idWYvYW55X2xpdGUubG8gZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9hcmVuYXpfc2FtcGxlci5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV91dGlsLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2ltcGxpY2l0X3dlYWtfbWVzc2FnZS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2lubGluZWRfc3RyaW5nX2ZpZWxkLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vaW9fd2luMzIubG8gZ29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0ubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL21hcC5sbyBnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvcGFyc2VfY29udGV4dC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfcHRyX2ZpZWxkLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2UubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmxvIGdvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5sbworYW1fbGlicHJvdG9idWZfbGFfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfMSkgZ29vZ2xlL3Byb3RvYnVmL2FueS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5sbyBnb29nbGUvcHJvdG9idWYvYXBpLnBiLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmxvIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmxvIGdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wYi5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaGVhdnkubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnBiLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfYmFzZXMubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9mdWxsLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0ubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmxvIGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQubG8gZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5sbyBnb29nbGUvcHJvdG9idWYvc2VydmljZS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnBiLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvc3RydWN0LnBiLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmxvIGdvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucGIubG8gXAorCWdvb2dsZS9wcm90b2J1Zi90eXBlLnBiLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWwubG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX2NvbXBhcmF0b3IubG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGF0YXBpZWNlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZXJyb3JfbGlzdGVuZXIubG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2ZpZWxkX21hc2tfdXRpbGl0eS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9lc2NhcGluZy5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXIubG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlci5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3dyaXRlci5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9fd3JpdGVyLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2UubG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlci5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmxvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWwubG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIubG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL3RpbWVfdXRpbC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQubG8gZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnBiLmxvCitub2Rpc3RfbGlicHJvdG9idWZfbGFfT0JKRUNUUyA9CitsaWJwcm90b2J1Zl9sYV9PQkpFQ1RTID0gJChhbV9saWJwcm90b2J1Zl9sYV9PQkpFQ1RTKSBcCisJJChub2Rpc3RfbGlicHJvdG9idWZfbGFfT0JKRUNUUykKK2xpYnByb3RvYnVmX2xhX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q1hYIFwKKwkkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ1hYTEQpIFwKKwkkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAkKGxpYnByb3RvYnVmX2xhX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitsaWJwcm90b2NfbGFfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpIGxpYnByb3RvYnVmLmxhCithbV9saWJwcm90b2NfbGFfT0JKRUNUUyA9IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZW51bS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9lbnVtX2ZpZWxkLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2V4dGVuc2lvbi5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9maWVsZC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9maWxlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2dlbmVyYXRvci5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21hcF9maWVsZC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2VfZmllbGQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFkZGluZ19vcHRpbWl6ZXIubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3ByaW1pdGl2ZV9maWVsZC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9zZXJ2aWNlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3N0cmluZ19maWVsZC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZG9jX2NvbW1lbnQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW0ubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW1fZmllbGQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfaGVscGVycy5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWFwX2ZpZWxkLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlX2ZpZWxkLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9wcmltaXRpdmVfZmllbGQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlZmxlY3Rpb25fY2xhc3MubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX21lc3NhZ2VfZmllbGQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX3ByaW1pdGl2ZV9maWVsZC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfc291cmNlX2dlbmVyYXRvcl9iYXNlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF93cmFwcGVyX2ZpZWxkLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9jb250ZXh0LmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bV9maWVsZC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bV9maWVsZF9saXRlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtX2xpdGUubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbi5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZXh0ZW5zaW9uX2xpdGUubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9maWxlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3IubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvcl9mYWN0b3J5LmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9oZWxwZXJzLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9rb3RsaW5fZ2VuZXJhdG9yLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tYXBfZmllbGQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZF9saXRlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2J1aWxkZXIubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlcl9saXRlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2ZpZWxkLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2ZpZWxkX2xpdGUubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfbGl0ZS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZV9yZXNvbHZlci5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJpbWl0aXZlX2ZpZWxkLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcmltaXRpdmVfZmllbGRfbGl0ZS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc2VydmljZS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc2hhcmVkX2NvZGVfZ2VuZXJhdG9yLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zdHJpbmdfZmllbGQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3N0cmluZ19maWVsZF9saXRlLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW0ubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19leHRlbnNpb24ubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmllbGQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmlsZS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19nZW5lcmF0b3IubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tYXBfZmllbGQubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZS5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlX2ZpZWxkLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX29uZW9mLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX3ByaW1pdGl2ZV9maWVsZC5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BocC9waHBfZ2VuZXJhdG9yLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2dlbmVyYXRvci5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9oZWxwZXJzLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5aV9nZW5lcmF0b3IubG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdG9yLmxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5sbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIubG8KK2xpYnByb3RvY19sYV9PQkpFQ1RTID0gJChhbV9saWJwcm90b2NfbGFfT0JKRUNUUykKK2xpYnByb3RvY19sYV9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENYWExEKSAkKEFNX0NYWEZMQUdTKSBcCisJJChDWFhGTEFHUykgJChsaWJwcm90b2NfbGFfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorYW1fX29iamVjdHNfMiA9IGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGUucGIuJChPQkpFWFQpCithbV9fb2JqZWN0c18zID0gJChhbV9fb2JqZWN0c18yKSBcCisJZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1hbnlfdGVzdC5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbm9fd2FybmluZ190ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ub193YXJuaW5nX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfdW5pdHRlc3QucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9hcmVuYS5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1hbnlzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWJvb2tzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWUucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWZpZWxkX21hc2sucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtbWFwcy5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1vbmVvZnMucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtcHJvdG8zLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LXN0cnVjdC5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3Qtd3JhcHBlcnMucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9ub193YXJuaW5nX3Rlc3QtanNvbl9mb3JtYXQucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9ub193YXJuaW5nX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbm9fd2FybmluZ190ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuJChPQkpFWFQpCitub2Rpc3Rfbm9fd2FybmluZ190ZXN0X09CSkVDVFMgPSAgXAorCW5vX3dhcm5pbmdfdGVzdC1ub193YXJuaW5nX3Rlc3QuJChPQkpFWFQpICQoYW1fX29iamVjdHNfMykKK25vX3dhcm5pbmdfdGVzdF9PQkpFQ1RTID0gJChub2Rpc3Rfbm9fd2FybmluZ190ZXN0X09CSkVDVFMpCitub193YXJuaW5nX3Rlc3RfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpIGxpYnByb3RvYnVmLmxhIFwKKwlsaWJwcm90b2MubGEKK25vX3dhcm5pbmdfdGVzdF9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNYWCBcCisJJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENYWExEKSBcCisJJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpICQoQU1fTERGTEFHUykgXAorCSQoTERGTEFHUykgLW8gJEAKK2FtX19vYmplY3RzXzQgPSBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYXJlbmFfdGVzdF91dGlsLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWxfbGl0ZS4kKE9CSkVYVCkKK2FtX19vYmplY3RzXzUgPSAkKGFtX19vYmplY3RzXzQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtcmVmbGVjdGlvbl90ZXN0ZXIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmlsZS4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWdvb2dsZXRlc3QuJChPQkpFWFQpCithbV9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9PQkpFQ1RTID0gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdC4kKE9CSkVYVCkgXAorCSQoYW1fX29iamVjdHNfNSkKK2FtX19vYmplY3RzXzYgPSBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuJChPQkpFWFQpCithbV9fb2JqZWN0c183ID0gJChhbV9fb2JqZWN0c182KSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueV90ZXN0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXQucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzMucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYW55cy5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWJvb2tzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpZWxkX21hc2sucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtb25lb2ZzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtcHJvdG8zLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtd3JhcHBlcnMucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1qc29uX2Zvcm1hdC5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuJChPQkpFWFQpCitub2Rpc3RfcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfNykKK3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X09CSkVDVFMgPSAgXAorCSQoYW1fcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfT0JKRUNUUykgXAorCSQobm9kaXN0X3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X09CSkVDVFMpCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorCWxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYSBcCisJJChHT09HTEVURVNUX0JVSUxEX0RJUikvbGliL2xpYmd0ZXN0LmxhIFwKKwkkKEdPT0dMRU1PQ0tfQlVJTERfRElSKS9saWIvbGliZ21vY2subGEgXAorCSQoR09PR0xFTU9DS19CVUlMRF9ESVIpL2xpYi9saWJnbW9ja19tYWluLmxhCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNYWCBcCisJJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENYWExEKSBcCisJJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgXAorCSQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorYW1fX29iamVjdHNfOCA9IGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtYXJlbmFfdGVzdF91dGlsLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXRlc3RfdXRpbF9saXRlLiQoT0JKRVhUKQorYW1fcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X09CSkVDVFMgPSBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWxpdGVfYXJlbmFfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwkkKGFtX19vYmplY3RzXzgpCithbV9fb2JqZWN0c185ID0gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi4kKE9CSkVYVCkKK25vZGlzdF9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfOSkKK3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9PQkpFQ1RTID0gIFwKKwkkKGFtX3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9PQkpFQ1RTKSBcCisJJChub2Rpc3RfcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X09CSkVDVFMpCitwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpIFwKKwlsaWJwcm90b2J1Zi1saXRlLmxhICQoR09PR0xFVEVTVF9CVUlMRF9ESVIpL2xpYi9saWJndGVzdC5sYSBcCisJJChHT09HTEVNT0NLX0JVSUxEX0RJUikvbGliL2xpYmdtb2NrLmxhIFwKKwkkKEdPT0dMRU1PQ0tfQlVJTERfRElSKS9saWIvbGliZ21vY2tfbWFpbi5sYQorcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q1hYIFwKKwkkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ1hYTEQpIFwKKwkkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgJChBTV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorYW1fX29iamVjdHNfMTAgPSAgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtYXJlbmFfdGVzdF91dGlsLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LXRlc3RfdXRpbF9saXRlLiQoT0JKRVhUKQorYW1fcHJvdG9idWZfbGl0ZV90ZXN0X09CSkVDVFMgPSAgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC4kKE9CSkVYVCkgXAorCSQoYW1fX29iamVjdHNfMTApCithbV9fb2JqZWN0c18xMSA9IGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuJChPQkpFWFQpCitub2Rpc3RfcHJvdG9idWZfbGl0ZV90ZXN0X09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzExKQorcHJvdG9idWZfbGl0ZV90ZXN0X09CSkVDVFMgPSAkKGFtX3Byb3RvYnVmX2xpdGVfdGVzdF9PQkpFQ1RTKSBcCisJJChub2Rpc3RfcHJvdG9idWZfbGl0ZV90ZXN0X09CSkVDVFMpCitwcm90b2J1Zl9saXRlX3Rlc3RfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpIFwKKwlsaWJwcm90b2J1Zi1saXRlLmxhICQoR09PR0xFVEVTVF9CVUlMRF9ESVIpL2xpYi9saWJndGVzdC5sYSBcCisJJChHT09HTEVNT0NLX0JVSUxEX0RJUikvbGliL2xpYmdtb2NrLmxhIFwKKwkkKEdPT0dMRU1PQ0tfQlVJTERfRElSKS9saWIvbGliZ21vY2tfbWFpbi5sYQorcHJvdG9idWZfbGl0ZV90ZXN0X0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q1hYIFwKKwkkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ1hYTEQpIFwKKwkkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgJChBTV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorYW1fX29iamVjdHNfMTIgPSAgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFyZW5hX3Rlc3RfdXRpbC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbF9saXRlLiQoT0JKRVhUKQorYW1fX29iamVjdHNfMTMgPSAkKGFtX19vYmplY3RzXzEyKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl90ZXN0ZXIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWwuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl90ZXN0LWZpbGUuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl90ZXN0LWdvb2dsZXRlc3QuJChPQkpFWFQpCithbV9wcm90b2J1Zl90ZXN0X09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzEzKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYV91bml0dGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFyZW5hc3RyaW5nX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYXJlbmF6X3NhbXBsZXJfdGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWFubm90YXRpb25fdGVzdF91dGlsLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Byb3RvYnVmX3Rlc3QtY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC1ib290c3RyYXBfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9zaXplX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1ldGFkYXRhX3Rlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtbW92ZV91bml0dGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2Jvb3RzdHJhcF91bml0dGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvcHJvdG9idWZfdGVzdC1jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Byb3RvYnVmX3Rlc3QtaW1wb3J0ZXJfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcm90b2J1Zl90ZXN0LWRvY19jb21tZW50X3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1tb2NrX2NvZGVfZ2VuZXJhdG9yLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvcHJvdG9idWZfdGVzdC1vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1wYXJzZXJfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcHJvdG9idWZfdGVzdC1ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZXh0ZW5zaW9uX3NldF91bml0dGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGVfdGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWlubGluZWRfc3RyaW5nX2ZpZWxkX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtaW9fd2luMzJfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vcHJvdG9idWZfdGVzdC1wcmludGVyX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF9maWVsZF90ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX3Rlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3Qtbm9fZmllbGRfcHJlc2VuY2VfdGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1wcm90bzNfbGl0ZV91bml0dGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtYnl0ZXN0cmVhbV91bml0dGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LWludDEyOF91bml0dGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c190ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzb3JfdGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0cmluZ3BpZWNlX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RydXRpbF91bml0dGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXRlbXBsYXRlX3V0aWxfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC10aW1lX3Rlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC10ZXh0X2Zvcm1hdF91bml0dGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1kZWxpbWl0ZWRfbWVzc2FnZV91dGlsX3Rlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWZpZWxkX2NvbXBhcmF0b3JfdGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtZmllbGRfbWFza191dGlsX3Rlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LWpzb25fb2JqZWN0d3JpdGVyX3Rlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LWpzb25fc3RyZWFtX3BhcnNlcl90ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2VfdGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyX3Rlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LXR5cGVfaW5mb190ZXN0X2hlbHBlci4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl91dGlsX3Rlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LXRpbWVfdXRpbF90ZXN0LiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC10eXBlX3Jlc29sdmVyX3V0aWxfdGVzdC4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXdlbGxfa25vd25fdHlwZXNfdW5pdHRlc3QuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC13aXJlX2Zvcm1hdF91bml0dGVzdC4kKE9CSkVYVCkKK2FtX19vYmplY3RzXzE0ID0gIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi4kKE9CSkVYVCkKK2FtX19vYmplY3RzXzE1ID0gJChhbV9fb2JqZWN0c18xNCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFueV90ZXN0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfdW5pdHRlc3QucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdC5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X21zZXQucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1hbnlzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1ib29rcy5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1tYXBzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1vbmVvZnMucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LXByb3RvMy5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtc3RydWN0LnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIuJChPQkpFWFQpIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LXdyYXBwZXJzLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1qc29uX2Zvcm1hdC5wYi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLiQoT0JKRVhUKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLiQoT0JKRVhUKQorbm9kaXN0X3Byb3RvYnVmX3Rlc3RfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfMTUpCitwcm90b2J1Zl90ZXN0X09CSkVDVFMgPSAkKGFtX3Byb3RvYnVmX3Rlc3RfT0JKRUNUUykgXAorCSQobm9kaXN0X3Byb3RvYnVmX3Rlc3RfT0JKRUNUUykKK3Byb3RvYnVmX3Rlc3RfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpIGxpYnByb3RvYnVmLmxhIFwKKwlsaWJwcm90b2MubGEgJChHT09HTEVURVNUX0JVSUxEX0RJUikvbGliL2xpYmd0ZXN0LmxhIFwKKwkkKEdPT0dMRU1PQ0tfQlVJTERfRElSKS9saWIvbGliZ21vY2subGEgXAorCSQoR09PR0xFTU9DS19CVUlMRF9ESVIpL2xpYi9saWJnbW9ja19tYWluLmxhCitwcm90b2J1Zl90ZXN0X0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q1hYIFwKKwkkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ1hYTEQpIFwKKwkkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSBcCisJLW8gJEAKK2FtX3Byb3RvY19PQkpFQ1RTID0gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uJChPQkpFWFQpCitwcm90b2NfT0JKRUNUUyA9ICQoYW1fcHJvdG9jX09CSkVDVFMpCitwcm90b2NfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpIGxpYnByb3RvYnVmLmxhIFwKKwlsaWJwcm90b2MubGEKK2FtX3Rlc3RfcGx1Z2luX09CSkVDVFMgPSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4tbW9ja19jb2RlX2dlbmVyYXRvci4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi4kKE9CSkVYVCkgXAorCWdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Rlc3RfcGx1Z2luLWZpbGUuJChPQkpFWFQpCit0ZXN0X3BsdWdpbl9PQkpFQ1RTID0gJChhbV90ZXN0X3BsdWdpbl9PQkpFQ1RTKQordGVzdF9wbHVnaW5fREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpIGxpYnByb3RvYnVmLmxhIFwKKwlsaWJwcm90b2MubGEgJChHT09HTEVURVNUX0JVSUxEX0RJUikvbGliL2xpYmd0ZXN0LmxhCithbV9femNndW56aXBfU09VUkNFU19ESVNUID0gZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNndW56aXAuY2MKK0BIQVZFX1pMSUJfVFJVRUBhbV96Y2d1bnppcF9PQkpFQ1RTID0gIFwKK0BIQVZFX1pMSUJfVFJVRUAJZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNndW56aXAuJChPQkpFWFQpCit6Y2d1bnppcF9PQkpFQ1RTID0gJChhbV96Y2d1bnppcF9PQkpFQ1RTKQorQEhBVkVfWkxJQl9UUlVFQHpjZ3VuemlwX0RFUEVOREVOQ0lFUyA9ICQoYW1fX0RFUEVOREVOQ0lFU18xKSBcCitASEFWRV9aTElCX1RSVUVACWxpYnByb3RvYnVmLmxhCithbV9femNnemlwX1NPVVJDRVNfRElTVCA9IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3ppcC5jYworQEhBVkVfWkxJQl9UUlVFQGFtX3pjZ3ppcF9PQkpFQ1RTID0gIFwKK0BIQVZFX1pMSUJfVFJVRUAJZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNnemlwLiQoT0JKRVhUKQoremNnemlwX09CSkVDVFMgPSAkKGFtX3pjZ3ppcF9PQkpFQ1RTKQorQEhBVkVfWkxJQl9UUlVFQHpjZ3ppcF9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorQEhBVkVfWkxJQl9UUlVFQAlsaWJwcm90b2J1Zi5sYQorQU1fVl9QID0gJChhbV9fdl9QX0BBTV9WQCkKK2FtX192X1BfID0gJChhbV9fdl9QX0BBTV9ERUZBVUxUX1ZAKQorYW1fX3ZfUF8wID0gZmFsc2UKK2FtX192X1BfMSA9IDoKK0FNX1ZfR0VOID0gJChhbV9fdl9HRU5fQEFNX1ZAKQorYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOX0BBTV9ERUZBVUxUX1ZAKQorYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAgICIgJEA7CithbV9fdl9HRU5fMSA9IAorQU1fVl9hdCA9ICQoYW1fX3ZfYXRfQEFNX1ZAKQorYW1fX3ZfYXRfID0gJChhbV9fdl9hdF9AQU1fREVGQVVMVF9WQCkKK2FtX192X2F0XzAgPSBACithbV9fdl9hdF8xID0gCitERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKQorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX21heWJlX3JlbWFrZV9kZXBmaWxlcyA9IGRlcGZpbGVzCithbV9fZGVwZmlsZXNfcmVtYWRlID0gLi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW5vX3dhcm5pbmdfdGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9hbnkuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2FueS5wYi5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvYW55X2xpdGUuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2FwaS5wYi5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvYXJlbmEuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2FyZW5hc3RyaW5nLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9hcmVuYXpfc2FtcGxlci5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZGVzY3JpcHRvci5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZGVzY3JpcHRvci5wYi5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZGVzY3JpcHRvcl9kYXRhYmFzZS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZHVyYXRpb24ucGIuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2R5bmFtaWNfbWVzc2FnZS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZW1wdHkucGIuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2V4dGVuc2lvbl9zZXQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2V4dGVuc2lvbl9zZXRfaGVhdnkuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2ZpZWxkX21hc2sucGIuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2dlbmVyYXRlZF9lbnVtX3V0aWwuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2dlbmVyYXRlZF9tZXNzYWdlX2Jhc2VzLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2Z1bGwuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvaW1wbGljaXRfd2Vha19tZXNzYWdlLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9pbmxpbmVkX3N0cmluZ19maWVsZC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbWFwLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9tYXBfZmllbGQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL21lc3NhZ2UuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL21lc3NhZ2VfbGl0ZS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWFueV90ZXN0LnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9saXRlLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcGFyc2VfY29udGV4dC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYW55X3Rlc3QucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF91bml0dGVzdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsX2xpdGUuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbGl0ZV9hcmVuYV91bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdGVzdF91dGlsX2xpdGUuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFueV90ZXN0LnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYXN0cmluZ191bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFyZW5hel9zYW1wbGVyX3Rlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl91bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRyb3BfdW5rbm93bl9maWVsZHNfdGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlX3Rlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9maWVsZF90ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX3Rlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfdW5pdHRlc3QucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtbm9fZmllbGRfcHJlc2VuY2VfdGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfbGl0ZV91bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl90ZXN0ZXIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWwuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWxfbGl0ZS5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3JlZmxlY3Rpb25fb3BzLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9yZXBlYXRlZF9maWVsZC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcmVwZWF0ZWRfcHRyX2ZpZWxkLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9zZXJ2aWNlLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9zb3VyY2VfY29udGV4dC5wYi5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvc3RydWN0LnBiLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS90ZXh0X2Zvcm1hdC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvdGltZXN0YW1wLnBiLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS90eXBlLnBiLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS91bmtub3duX2ZpZWxkX3NldC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvd2lyZV9mb3JtYXQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3dpcmVfZm9ybWF0X2xpdGUuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3dyYXBwZXJzLnBiLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9jb2RlX2dlbmVyYXRvci5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvY29tbWFuZF9saW5lX2ludGVyZmFjZS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvaW1wb3J0ZXIuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL21haW4uUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcGFyc2VyLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wbHVnaW4uUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3BsdWdpbi5wYi5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbm5vdGF0aW9uX3Rlc3RfdXRpbC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcHJvdG9idWZfdGVzdC1pbXBvcnRlcl91bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3IuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wYXJzZXJfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvc3VicHJvY2Vzcy5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvdGVzdF9wbHVnaW4tbW9ja19jb2RlX2dlbmVyYXRvci5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS90ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS96aXBfd3JpdGVyLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvZW51bS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL2VudW1fZmllbGQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9leHRlbnNpb24uUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9maWVsZC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL2ZpbGUuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9nZW5lcmF0b3IuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9oZWxwZXJzLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvbWFwX2ZpZWxkLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvbWVzc2FnZS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL21lc3NhZ2VfZmllbGQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3BhZGRpbmdfb3B0aW1pemVyLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJpbWl0aXZlX2ZpZWxkLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYm9vdHN0cmFwX3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2Vfc2l6ZV91bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXRhZGF0YV90ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1vdmVfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvc2VydmljZS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3N0cmluZ19maWVsZC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9kb2NfY29tbWVudC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9lbnVtLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX2VudW1fZmllbGQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfZmllbGRfYmFzZS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9nZW5lcmF0b3IuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfaGVscGVycy5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9tYXBfZmllbGQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfbWVzc2FnZS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9tZXNzYWdlX2ZpZWxkLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX3ByaW1pdGl2ZV9maWVsZC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9yZWZsZWN0aW9uX2NsYXNzLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfcmVwZWF0ZWRfbWVzc2FnZV9maWVsZC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9yZXBlYXRlZF9wcmltaXRpdmVfZmllbGQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfc291cmNlX2dlbmVyYXRvcl9iYXNlLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX3dyYXBwZXJfZmllbGQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNzaGFycF9ib290c3RyYXBfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2NvbnRleHQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvZG9jX2NvbW1lbnQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvZW51bS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9lbnVtX2ZpZWxkLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2VudW1fZmllbGRfbGl0ZS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9lbnVtX2xpdGUuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvZXh0ZW5zaW9uLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2V4dGVuc2lvbl9saXRlLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2ZpZWxkLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2ZpbGUuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvZ2VuZXJhdG9yLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2dlbmVyYXRvcl9mYWN0b3J5LlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2hlbHBlcnMuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikva290bGluX2dlbmVyYXRvci5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tYXBfZmllbGQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvbWFwX2ZpZWxkX2xpdGUuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvbWVzc2FnZS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tZXNzYWdlX2J1aWxkZXIuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvbWVzc2FnZV9idWlsZGVyX2xpdGUuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvbWVzc2FnZV9maWVsZC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tZXNzYWdlX2ZpZWxkX2xpdGUuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvbWVzc2FnZV9saXRlLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL25hbWVfcmVzb2x2ZXIuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvcHJpbWl0aXZlX2ZpZWxkLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3ByaW1pdGl2ZV9maWVsZF9saXRlLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZG9jX2NvbW1lbnRfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3NlcnZpY2UuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvc2hhcmVkX2NvZGVfZ2VuZXJhdG9yLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3N0cmluZ19maWVsZC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9zdHJpbmdfZmllbGRfbGl0ZS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9vYmplY3RpdmVjX2VudW0uUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19lbnVtX2ZpZWxkLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfZXh0ZW5zaW9uLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfZmllbGQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19maWxlLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfZ2VuZXJhdG9yLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfaGVscGVycy5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9vYmplY3RpdmVjX21hcF9maWVsZC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9vYmplY3RpdmVjX21lc3NhZ2UuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19tZXNzYWdlX2ZpZWxkLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfb25lb2YuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19wcmltaXRpdmVfZmllbGQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9waHAvJChERVBESVIpL3BocF9nZW5lcmF0b3IuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLyQoREVQRElSKS9nZW5lcmF0b3IuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLyQoREVQRElSKS9oZWxwZXJzLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vJChERVBESVIpL3B5aV9nZW5lcmF0b3IuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvJChERVBESVIpL3J1YnlfZ2VuZXJhdG9yLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9jb2RlZF9zdHJlYW0uUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL2d6aXBfc3RyZWFtLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9pb193aW4zMi5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJpbnRlci5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jb2RlZF9zdHJlYW1fdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC1pb193aW4zMl91bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByaW50ZXJfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC10b2tlbml6ZXJfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3N0cnRvZC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvdG9rZW5pemVyLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS96ZXJvX2NvcHlfc3RyZWFtLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9ieXRlc3RyZWFtLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9jb21tb24uUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL2ludDEyOC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1ieXRlc3RyZWFtX3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29tbW9uX3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW50MTI4X3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzX3Rlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdGF0dXNvcl90ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncGllY2VfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJpbmdwcmludGZfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRpbWVfdGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9zdGF0dXMuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3N0YXR1c29yLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9zdHJpbmdwaWVjZS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvc3RyaW5ncHJpbnRmLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9zdHJ1Y3R1cmFsbHlfdmFsaWQuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3N0cnV0aWwuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3N1YnN0aXR1dGUuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3RpbWUuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmlsZS5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWdvb2dsZXRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpbGUuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWdvb2dsZXRlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS90ZXN0X3BsdWdpbi1maWxlLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvemNndW56aXAuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS96Y2d6aXAuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9kZWxpbWl0ZWRfbWVzc2FnZV91dGlsLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL2ZpZWxkX2NvbXBhcmF0b3IuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvZmllbGRfbWFza191dGlsLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL2pzb25fdXRpbC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9tZXNzYWdlX2RpZmZlcmVuY2VyLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0LnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVsaW1pdGVkX21lc3NhZ2VfdXRpbF90ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1maWVsZF9jb21wYXJhdG9yX3Rlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2tfdXRpbF90ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX2Zvcm1hdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX3V0aWxfdGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGltZV91dGlsX3Rlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXR5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvdGltZV91dGlsLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3R5cGVfcmVzb2x2ZXJfdXRpbC5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9kYXRhcGllY2UuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXIuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvZXJyb3JfbGlzdGVuZXIuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvZmllbGRfbWFza191dGlsaXR5LlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL2pzb25fZXNjYXBpbmcuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvanNvbl9vYmplY3R3cml0ZXIuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvanNvbl9zdHJlYW1fcGFyc2VyLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL29iamVjdF93cml0ZXIuUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9fd3JpdGVyLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXJfdGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl9vYmplY3R3cml0ZXJfdGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0LlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdHlwZV9pbmZvX3Rlc3RfaGVscGVyLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlLlBsbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlci5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS90eXBlX2luZm8uUGxvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvdXRpbGl0eS5QbG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtYW55cy5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1ib29rcy5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1maWVsZF9tYXNrLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW1hcHMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3Qtb25lb2ZzLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXByb3RvMy5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1zdHJ1Y3QucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXdyYXBwZXJzLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYW55cy5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWJvb2tzLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpZWxkX21hc2sucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBzLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtb25lb2ZzLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtcHJvdG8zLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtd3JhcHBlcnMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFueXMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWJvb2tzLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2sucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcHMucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW9uZW9mcy5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zLnBiLlBvIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1Y3QucGIuUG8gXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5QbyBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtd3JhcHBlcnMucGIuUG8KK2FtX19tdiA9IG12IC1mCitDWFhDT01QSUxFID0gJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykKK0xUQ1hYQ09NUElMRSA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DWFggJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgXAorCSQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAorCSQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpCitBTV9WX0NYWCA9ICQoYW1fX3ZfQ1hYX0BBTV9WQCkKK2FtX192X0NYWF8gPSAkKGFtX192X0NYWF9AQU1fREVGQVVMVF9WQCkKK2FtX192X0NYWF8wID0gQGVjaG8gIiAgQ1hYICAgICAiICRAOworYW1fX3ZfQ1hYXzEgPSAKK0NYWExEID0gJChDWFgpCitDWFhMSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNYWCAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENYWExEKSAkKEFNX0NYWEZMQUdTKSBcCisJJChDWFhGTEFHUykgJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACitBTV9WX0NYWExEID0gJChhbV9fdl9DWFhMRF9AQU1fVkApCithbV9fdl9DWFhMRF8gPSAkKGFtX192X0NYWExEX0BBTV9ERUZBVUxUX1ZAKQorYW1fX3ZfQ1hYTERfMCA9IEBlY2hvICIgIENYWExEICAgIiAkQDsKK2FtX192X0NYWExEXzEgPSAKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpIFwKKwkkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIFwKKwkkKEFNX0NGTEFHUykgJChDRkxBR1MpCitBTV9WX0NDID0gJChhbV9fdl9DQ19AQU1fVkApCithbV9fdl9DQ18gPSAkKGFtX192X0NDX0BBTV9ERUZBVUxUX1ZAKQorYW1fX3ZfQ0NfMCA9IEBlY2hvICIgIENDICAgICAgIiAkQDsKK2FtX192X0NDXzEgPSAKK0NDTEQgPSAkKENDKQorTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAorCSQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorQU1fVl9DQ0xEID0gJChhbV9fdl9DQ0xEX0BBTV9WQCkKK2FtX192X0NDTERfID0gJChhbV9fdl9DQ0xEX0BBTV9ERUZBVUxUX1ZAKQorYW1fX3ZfQ0NMRF8wID0gQGVjaG8gIiAgQ0NMRCAgICAiICRAOworYW1fX3ZfQ0NMRF8xID0gCitTT1VSQ0VTID0gJChsaWJwcm90b2J1Zl9saXRlX2xhX1NPVVJDRVMpICQobGlicHJvdG9idWZfbGFfU09VUkNFUykgXAorCSQobm9kaXN0X2xpYnByb3RvYnVmX2xhX1NPVVJDRVMpICQobGlicHJvdG9jX2xhX1NPVVJDRVMpIFwKKwkkKG5vZGlzdF9ub193YXJuaW5nX3Rlc3RfU09VUkNFUykgXAorCSQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfU09VUkNFUykgXAorCSQobm9kaXN0X3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X1NPVVJDRVMpIFwKKwkkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9TT1VSQ0VTKSBcCisJJChub2Rpc3RfcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X1NPVVJDRVMpIFwKKwkkKHByb3RvYnVmX2xpdGVfdGVzdF9TT1VSQ0VTKSBcCisJJChub2Rpc3RfcHJvdG9idWZfbGl0ZV90ZXN0X1NPVVJDRVMpICQocHJvdG9idWZfdGVzdF9TT1VSQ0VTKSBcCisJJChub2Rpc3RfcHJvdG9idWZfdGVzdF9TT1VSQ0VTKSAkKHByb3RvY19TT1VSQ0VTKSBcCisJJCh0ZXN0X3BsdWdpbl9TT1VSQ0VTKSAkKHpjZ3VuemlwX1NPVVJDRVMpICQoemNnemlwX1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGxpYnByb3RvYnVmX2xpdGVfbGFfU09VUkNFUykgXAorCSQobGlicHJvdG9idWZfbGFfU09VUkNFUykgJChsaWJwcm90b2NfbGFfU09VUkNFUykgXAorCSQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfU09VUkNFUykgXAorCSQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X1NPVVJDRVMpIFwKKwkkKHByb3RvYnVmX2xpdGVfdGVzdF9TT1VSQ0VTKSAkKHByb3RvYnVmX3Rlc3RfU09VUkNFUykgXAorCSQocHJvdG9jX1NPVVJDRVMpICQodGVzdF9wbHVnaW5fU09VUkNFUykgXAorCSQoYW1fX3pjZ3VuemlwX1NPVVJDRVNfRElTVCkgJChhbV9femNnemlwX1NPVVJDRVNfRElTVCkKK2FtX19jYW5fcnVuX2luc3RhbGxpbmZvID0gXAorICBjYXNlICQkQU1fVVBEQVRFX0lORk9fRElSIGluIFwKKyAgICBufG5vfE5PKSBmYWxzZTs7IFwKKyAgICAqKSAoaW5zdGFsbC1pbmZvIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOzsgXAorICBlc2FjCitEQVRBID0gJChub2Jhc2VfZGlzdF9wcm90b19EQVRBKQorYW1fX25vYmFzZV9pbmNsdWRlX0hFQURFUlNfRElTVCA9IGdvb2dsZS9wcm90b2J1Zi9hbnkuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5oIGdvb2dsZS9wcm90b2J1Zi9hcGkucGIuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmggZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX2ltcGwuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmggZ29vZ2xlL3Byb3RvYnVmL2FyZW5hel9zYW1wbGVyLmggXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9maWxlLmggXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZ2VuZXJhdG9yLmggXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvaGVscGVycy5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL25hbWVzLmggXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50LmggXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9uYW1lcy5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9vcHRpb25zLmggXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3IuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEva290bGluX2dlbmVyYXRvci5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lcy5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2dlbmVyYXRvci5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnMuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGhwL3BocF9nZW5lcmF0b3IuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmggXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vZ2VuZXJhdG9yLmggXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHlpX2dlbmVyYXRvci5oIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3IuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaCBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oIFwKKwlnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oIFwKKwlnb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucGIuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oIGdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wYi5oIFwKKwlnb29nbGUvcHJvdG9idWYvZW5kaWFuLmggXAorCWdvb2dsZS9wcm90b2J1Zi9leHBsaWNpdGx5X2NvbnN0cnVjdGVkLmggXAorCWdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmggXAorCWdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2lubC5oIFwKKwlnb29nbGUvcHJvdG9idWYvZmllbGRfYWNjZXNzX2xpc3RlbmVyLmggXAorCWdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnBiLmggXAorCWdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV9yZWZsZWN0aW9uLmggXAorCWdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV91dGlsLmggXAorCWdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9iYXNlcy5oIFwKKwlnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oIFwKKwlnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9kZWNsLmggXAorCWdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2ltcGwuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2hhc19iaXRzLmggXAorCWdvb2dsZS9wcm90b2J1Zi9pbXBsaWNpdF93ZWFrX21lc3NhZ2UuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2lubGluZWRfc3RyaW5nX2ZpZWxkLmggXAorCWdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmggZ29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyLmggXAorCWdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmggZ29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5oIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmggXAorCWdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmggXAorCWdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmggXAorCWdvb2dsZS9wcm90b2J1Zi9tYXAuaCBnb29nbGUvcHJvdG9idWYvbWFwX2VudHJ5LmggXAorCWdvb2dsZS9wcm90b2J1Zi9tYXBfZW50cnlfbGl0ZS5oIGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9pbmwuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9saXRlLmggXAorCWdvb2dsZS9wcm90b2J1Zi9tYXBfdHlwZV9oYW5kbGVyLmggZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oIGdvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YS5oIFwKKwlnb29nbGUvcHJvdG9idWYvbWV0YWRhdGFfbGl0ZS5oIFwKKwlnb29nbGUvcHJvdG9idWYvcGFyc2VfY29udGV4dC5oIGdvb2dsZS9wcm90b2J1Zi9wb3J0LmggXAorCWdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmMgZ29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jIFwKKwlnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbi5oIFwKKwlnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9pbnRlcm5hbC5oIFwKKwlnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmggXAorCWdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9wdHJfZmllbGQuaCBnb29nbGUvcHJvdG9idWYvc2VydmljZS5oIFwKKwlnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucGIuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5oIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmggXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYWxsYmFjay5oIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmggZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaCBnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFjcm9zLmggXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXBfdXRpbC5oIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tdXRleC5oIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmggXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9wb3J0LmggZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmggXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmggXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsLmggXAorCWdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oIGdvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucGIuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuaCBnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZGVsaW1pdGVkX21lc3NhZ2VfdXRpbC5oIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmggXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbC5oIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWwuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlci5oIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWwuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlci5oIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuaCBcCisJZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmggXAorCWdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmggXAorCWdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wYi5oCitIRUFERVJTID0gJChub2Jhc2VfaW5jbHVkZV9IRUFERVJTKQorYW1fX3RhZ2dlZF9maWxlcyA9ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKFRBR1NfRklMRVMpICQoTElTUCkKKyMgUmVhZCBhIGxpc3Qgb2YgbmV3bGluZS1zZXBhcmF0ZWQgc3RyaW5ncyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwKKyMgYW5kIHByaW50IGVhY2ggb2YgdGhlbSBvbmNlLCB3aXRob3V0IGR1cGxpY2F0ZXMuICBJbnB1dCBvcmRlciBpcworIyAqbm90KiBwcmVzZXJ2ZWQuCithbV9fdW5pcXVpZnlfaW5wdXQgPSAkKEFXSykgJ1wKKyAgQkVHSU4geyBub25lbXB0eSA9IDA7IH0gXAorICB7IGl0ZW1zWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGl0ZW1zKSBwcmludCBpOyB9OyB9IFwKKycKKyMgTWFrZSBzdXJlIHRoZSBsaXN0IG9mIHNvdXJjZXMgaXMgdW5pcXVlLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSwKKyMgZS5nLiwgdGhlIHNhbWUgc291cmNlIGZpbGUgbWlnaHQgYmUgc2hhcmVkIGFtb25nIF9TT1VSQ0VTIHZhcmlhYmxlcworIyBmb3IgZGlmZmVyZW50IHByb2dyYW1zL2xpYnJhcmllcy4KK2FtX19kZWZpbmVfdW5pcV90YWdnZWRfZmlsZXMgPSBcCisgIGxpc3Q9JyQoYW1fX3RhZ2dlZF9maWxlcyknOyBcCisgIHVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisgIGRvbmUgfCAkKGFtX191bmlxdWlmeV9pbnB1dClgCithbV9fdHR5X2NvbG9yc19kdW1teSA9IFwKKyAgbWduPSByZWQ9IGdybj0gbGduPSBibHU9IGJyZz0gc3RkPTsgXAorICBhbV9fY29sb3JfdGVzdHM9bm8KK2FtX190dHlfY29sb3JzID0geyBcCisgICQoYW1fX3R0eV9jb2xvcnNfZHVtbXkpOyBcCisgIGlmIHRlc3QgIlgkKEFNX0NPTE9SX1RFU1RTKSIgPSBYbm87IHRoZW4gXAorICAgIGFtX19jb2xvcl90ZXN0cz1ubzsgXAorICBlbGlmIHRlc3QgIlgkKEFNX0NPTE9SX1RFU1RTKSIgPSBYYWx3YXlzOyB0aGVuIFwKKyAgICBhbV9fY29sb3JfdGVzdHM9eWVzOyBcCisgIGVsaWYgdGVzdCAiWCQkVEVSTSIgIT0gWGR1bWIgJiYgeyB0ZXN0IC10IDE7IH0gMj4vZGV2L251bGw7IHRoZW4gXAorICAgIGFtX19jb2xvcl90ZXN0cz15ZXM7IFwKKyAgZmk7IFwKKyAgaWYgdGVzdCAkJGFtX19jb2xvcl90ZXN0cyA9IHllczsgdGhlbiBcCisgICAgcmVkPScbWzA7MzFtJzsgXAorICAgIGdybj0nG1swOzMybSc7IFwKKyAgICBsZ249JxtbMTszMm0nOyBcCisgICAgYmx1PScbWzE7MzRtJzsgXAorICAgIG1nbj0nG1swOzM1bSc7IFwKKyAgICBicmc9JxtbMW0nOyBcCisgICAgc3RkPScbW20nOyBcCisgIGZpOyBcCit9CithbV9fcmVjaGVja19yeCA9IF5bIAldKjpyZWNoZWNrOlsgCV0qCithbV9fZ2xvYmFsX3Rlc3RfcmVzdWx0X3J4ID0gXlsgCV0qOmdsb2JhbC10ZXN0LXJlc3VsdDpbIAldKgorYW1fX2NvcHlfaW5fZ2xvYmFsX2xvZ19yeCA9IF5bIAldKjpjb3B5LWluLWdsb2JhbC1sb2c6WyAJXSoKKyMgQSBjb21tYW5kIHRoYXQsIGdpdmVuIGEgbmV3bGluZS1zZXBhcmF0ZWQgbGlzdCBvZiB0ZXN0IG5hbWVzIG9uIHRoZQorIyBzdGFuZGFyZCBpbnB1dCwgcHJpbnQgdGhlIG5hbWUgb2YgdGhlIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJlLXJ1bgorIyB1cG9uICJtYWtlIHJlY2hlY2siLgorYW1fX2xpc3RfcmVjaGVja190ZXN0cyA9ICQoQVdLKSAneyBcCisgIHJlY2hlY2sgPSAxOyBcCisgIHdoaWxlICgocmMgPSAoZ2V0bGluZSBsaW5lIDwgKCQkMCAiLnRycyIpKSkgIT0gMCkgXAorICAgIHsgXAorICAgICAgaWYgKHJjIDwgMCkgXAorICAgICAgICB7IFwKKyAgICAgICAgICBpZiAoKGdldGxpbmUgbGluZTIgPCAoJCQwICIubG9nIikpIDwgMCkgXAorCSAgICByZWNoZWNrID0gMDsgXAorICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgIH0gXAorICAgICAgZWxzZSBpZiAobGluZSB+IC8kKGFtX19yZWNoZWNrX3J4KVtuTl1bT29dLykgXAorICAgICAgICB7IFwKKyAgICAgICAgICByZWNoZWNrID0gMDsgXAorICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgIH0gXAorICAgICAgZWxzZSBpZiAobGluZSB+IC8kKGFtX19yZWNoZWNrX3J4KVt5WV1bZUVdW3NTXS8pIFwKKyAgICAgICAgeyBcCisgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgfSBcCisgICAgfTsgXAorICBpZiAocmVjaGVjaykgXAorICAgIHByaW50ICQkMDsgXAorICBjbG9zZSAoJCQwICIudHJzIik7IFwKKyAgY2xvc2UgKCQkMCAiLmxvZyIpOyBcCit9JworIyBBIGNvbW1hbmQgdGhhdCwgZ2l2ZW4gYSBuZXdsaW5lLXNlcGFyYXRlZCBsaXN0IG9mIHRlc3QgbmFtZXMgb24gdGhlCisjIHN0YW5kYXJkIGlucHV0LCBjcmVhdGUgdGhlIGdsb2JhbCBsb2cgZnJvbSB0aGVpciAudHJzIGFuZCAubG9nIGZpbGVzLgorYW1fX2NyZWF0ZV9nbG9iYWxfbG9nID0gJChBV0spICcgXAorZnVuY3Rpb24gZmF0YWwobXNnKSBcCit7IFwKKyAgcHJpbnQgImZhdGFsOiBtYWtpbmcgJEA6ICIgbXNnIHwgImNhdCA+JjIiOyBcCisgIGV4aXQgMTsgXAorfSBcCitmdW5jdGlvbiByc3Rfc2VjdGlvbihoZWFkZXIpIFwKK3sgXAorICBwcmludCBoZWFkZXI7IFwKKyAgbGVuID0gbGVuZ3RoKGhlYWRlcik7IFwKKyAgZm9yIChpID0gMTsgaSA8PSBsZW47IGkgPSBpICsgMSkgXAorICAgIHByaW50ZiAiPSI7IFwKKyAgcHJpbnRmICJcblxuIjsgXAorfSBcCit7IFwKKyAgY29weV9pbl9nbG9iYWxfbG9nID0gMTsgXAorICBnbG9iYWxfdGVzdF9yZXN1bHQgPSAiUlVOIjsgXAorICB3aGlsZSAoKHJjID0gKGdldGxpbmUgbGluZSA8ICgkJDAgIi50cnMiKSkpICE9IDApIFwKKyAgICB7IFwKKyAgICAgIGlmIChyYyA8IDApIFwKKyAgICAgICAgIGZhdGFsKCJmYWlsZWQgdG8gcmVhZCBmcm9tICIgJCQwICIudHJzIik7IFwKKyAgICAgIGlmIChsaW5lIH4gLyQoYW1fX2dsb2JhbF90ZXN0X3Jlc3VsdF9yeCkvKSBcCisgICAgICAgIHsgXAorICAgICAgICAgIHN1YigiJChhbV9fZ2xvYmFsX3Rlc3RfcmVzdWx0X3J4KSIsICIiLCBsaW5lKTsgXAorICAgICAgICAgIHN1YigiWyAJXSokJCIsICIiLCBsaW5lKTsgXAorICAgICAgICAgIGdsb2JhbF90ZXN0X3Jlc3VsdCA9IGxpbmU7IFwKKyAgICAgICAgfSBcCisgICAgICBlbHNlIGlmIChsaW5lIH4gLyQoYW1fX2NvcHlfaW5fZ2xvYmFsX2xvZ19yeClbbk5dW29PXS8pIFwKKyAgICAgICAgY29weV9pbl9nbG9iYWxfbG9nID0gMDsgXAorICAgIH07IFwKKyAgaWYgKGNvcHlfaW5fZ2xvYmFsX2xvZykgXAorICAgIHsgXAorICAgICAgcnN0X3NlY3Rpb24oZ2xvYmFsX3Rlc3RfcmVzdWx0ICI6ICIgJCQwKTsgXAorICAgICAgd2hpbGUgKChyYyA9IChnZXRsaW5lIGxpbmUgPCAoJCQwICIubG9nIikpKSAhPSAwKSBcCisgICAgICB7IFwKKyAgICAgICAgaWYgKHJjIDwgMCkgXAorICAgICAgICAgIGZhdGFsKCJmYWlsZWQgdG8gcmVhZCBmcm9tICIgJCQwICIubG9nIik7IFwKKyAgICAgICAgcHJpbnQgbGluZTsgXAorICAgICAgfTsgXAorICAgICAgcHJpbnRmICJcbiI7IFwKKyAgICB9OyBcCisgIGNsb3NlICgkJDAgIi50cnMiKTsgXAorICBjbG9zZSAoJCQwICIubG9nIik7IFwKK30nCisjIFJlc3RydWN0dXJlZCBUZXh0IHRpdGxlLgorYW1fX3JzdF90aXRsZSA9IHsgc2VkICdzLy4qLyAgICYgICAvO2g7cy8uLz0vZztwO3g7cy8gKiQkLy87cDtnJyAmJiBlY2hvOyB9CisjIFNvbGFyaXMgMTAgJ21ha2UnLCBhbmQgc2V2ZXJhbCBvdGhlciB0cmFkaXRpb25hbCAnbWFrZScgaW1wbGVtZW50YXRpb25zLAorIyBwYXNzICItZSIgdG8gJChTSEVMTCksIGFuZCBQT1NJWCAyMDA4IGV2ZW4gcmVxdWlyZXMgdGhpcy4gIFdvcmsgYXJvdW5kIGl0CisjIGJ5IGRpc2FibGluZyAtZSAodXNpbmcgdGhlIFhTSSBleHRlbnNpb24gInNldCArZSIpIGlmIGl0J3Mgc2V0LgorYW1fX3NoX2Vfc2V0dXAgPSBjYXNlICQkLSBpbiAqZSopIHNldCArZTs7IGVzYWMKKyMgRGVmYXVsdCBmbGFncyBwYXNzZWQgdG8gdGVzdCBkcml2ZXJzLgorYW1fX2NvbW1vbl9kcml2ZXJfZmxhZ3MgPSBcCisgIC0tY29sb3ItdGVzdHMgIiQkYW1fX2NvbG9yX3Rlc3RzIiBcCisgIC0tZW5hYmxlLWhhcmQtZXJyb3JzICIkJGFtX19lbmFibGVfaGFyZF9lcnJvcnMiIFwKKyAgLS1leHBlY3QtZmFpbHVyZSAiJCRhbV9fZXhwZWN0X2ZhaWx1cmUiCisjIFRvIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgY29tbWFuZCBydW5uaW5nIHRoZSB0ZXN0LiAgQ3JlYXRlcyB0aGUKKyMgZGlyZWN0b3J5IGZvciB0aGUgbG9nIGlmIG5lZWRlZC4gIFN0b3JlcyBpbiAkZGlyIHRoZSBkaXJlY3RvcnkKKyMgY29udGFpbmluZyAkZiwgaW4gJHRzdCB0aGUgdGVzdCwgaW4gJGxvZyB0aGUgbG9nLiAgRXhlY3V0ZXMgdGhlCisjIGRldmVsb3Blci0gZGVmaW5lZCB0ZXN0IHNldHVwIEFNX1RFU1RTX0VOVklST05NRU5UIChpZiBhbnkpLCBhbmQKKyMgcGFzc2VzIFRFU1RTX0VOVklST05NRU5ULiAgU2V0IHVwIG9wdGlvbnMgZm9yIHRoZSB3cmFwcGVyIHRoYXQKKyMgd2lsbCBydW4gdGhlIHRlc3Qgc2NyaXB0cyAob3IgdGhlaXIgYXNzb2NpYXRlZCBMT0dfQ09NUElMRVIsIGlmCisjIHRoeSBoYXZlIG9uZSkuCithbV9fY2hlY2tfcHJlID0gXAorJChhbV9fc2hfZV9zZXR1cCk7CQkJCQlcCiskKGFtX192cGF0aF9hZGpfc2V0dXApICQoYW1fX3ZwYXRoX2FkaikJCQlcCiskKGFtX190dHlfY29sb3JzKTsJCQkJCVwKK3NyY2Rpcj0kKHNyY2Rpcik7IGV4cG9ydCBzcmNkaXI7CQkJXAorY2FzZSAiJEAiIGluCQkJCQkJXAorICAqLyopIGFtX19vZGlyPWBlY2hvICIuLyRAIiB8IHNlZCAnc3wvW14vXSokJHx8J2A7OwlcCisgICAgKikgYW1fX29kaXI9Ljs7IAkJCQkJXAorZXNhYzsJCQkJCQkJXAordGVzdCAieCQkYW1fX29kaXIiID0geCIuIiB8fCB0ZXN0IC1kICIkJGFtX19vZGlyIiAJXAorICB8fCAkKE1LRElSX1ApICIkJGFtX19vZGlyIiB8fCBleGl0ICQkPzsJCVwKK2lmIHRlc3QgLWYgIi4vJCRmIjsgdGhlbiBkaXI9Li87CQkJXAorZWxpZiB0ZXN0IC1mICIkJGYiOyB0aGVuIGRpcj07CQkJCVwKK2Vsc2UgZGlyPSIkKHNyY2RpcikvIjsgZmk7CQkJCVwKK3RzdD0kJGRpciQkZjsgbG9nPSckQCc7IAkJCQlcCitpZiB0ZXN0IC1uICckKERJU0FCTEVfSEFSRF9FUlJPUlMpJzsgdGhlbgkJXAorICBhbV9fZW5hYmxlX2hhcmRfZXJyb3JzPW5vOyAJCQkJXAorZWxzZQkJCQkJCQlcCisgIGFtX19lbmFibGVfaGFyZF9lcnJvcnM9eWVzOyAJCQkJXAorZmk7IAkJCQkJCQlcCitjYXNlICIgJChYRkFJTF9URVNUUykgIiBpbgkJCQlcCisgICpbXCBcCV0kJGZbXCBcCV0qIHwgKltcIFwJXSQkZGlyJCRmW1wgXAldKikgXAorICAgIGFtX19leHBlY3RfZmFpbHVyZT15ZXM7OwkJCQlcCisgICopCQkJCQkJCVwKKyAgICBhbV9fZXhwZWN0X2ZhaWx1cmU9bm87OwkJCQlcCitlc2FjOyAJCQkJCQkJXAorJChBTV9URVNUU19FTlZJUk9OTUVOVCkgJChURVNUU19FTlZJUk9OTUVOVCkKKyMgQSBzaGVsbCBjb21tYW5kIHRvIGdldCB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIHNjcmlwdHMgd2l0aCBhbnkgcmVnaXN0ZXJlZAorIyBleHRlbnNpb24gcmVtb3ZlZCAoaS5lLiwgZXF1aXZhbGVudGx5LCB0aGUgbmFtZXMgb2YgdGhlIHRlc3QgbG9ncywgd2l0aAorIyB0aGUgJy5sb2cnIGV4dGVuc2lvbiByZW1vdmVkKS4gIFRoZSByZXN1bHQgaXMgc2F2ZWQgaW4gdGhlIHNoZWxsIHZhcmlhYmxlCisjICckYmFzZXMnLiAgVGhpcyBob25vcnMgcnVudGltZSBvdmVycmlkaW5nIG9mIFRFU1RTIGFuZCBURVNUX0xPR1MuICBTYWRseSwKKyMgd2UgY2Fubm90IHVzZSBzb21ldGhpbmcgc2ltcGxlciwgaW52b2x2aW5nIGUuZy4sICIkKFRFU1RfTE9HUzoubG9nPSkiLAorIyBzaW5jZSB0aGF0IG1pZ2h0IGNhdXNlIHByb2JsZW0gd2l0aCBWUEFUSCByZXdyaXRlcyBmb3Igc3VmZml4LWxlc3MgdGVzdHMuCisjIFNlZSBhbHNvICd0ZXN0LWhhcm5lc3MtdnBhdGgtcmV3cml0ZS5zaCcgYW5kICd0ZXN0LXRycy1iYXNpYy5zaCcuCithbV9fc2V0X1RFU1RTX2Jhc2VzID0gXAorICBiYXNlcz0nJChURVNUX0xPR1MpJzsgXAorICBiYXNlcz1gZm9yIGkgaW4gJCRiYXNlczsgZG8gZWNobyAkJGk7IGRvbmUgfCBzZWQgJ3MvXC5sb2ckJC8vJ2A7IFwKKyAgYmFzZXM9YGVjaG8gJCRiYXNlc2AKK0FNX1RFU1RTVUlURV9TVU1NQVJZX0hFQURFUiA9ICcgZm9yICQoUEFDS0FHRV9TVFJJTkcpJworUkVDSEVDS19MT0dTID0gJChURVNUX0xPR1MpCitBTV9SRUNVUlNJVkVfVEFSR0VUUyA9IGNoZWNrIHJlY2hlY2sKK0BIQVZFX1pMSUJfVFJVRUBhbV9fRVhFRVhUXzIgPSAgXAorQEhBVkVfWkxJQl9UUlVFQAlnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW1fdW5pdHRlc3Quc2gKK1RFU1RfU1VJVEVfTE9HID0gdGVzdC1zdWl0ZS5sb2cKK1RFU1RfRVhURU5TSU9OUyA9IEBFWEVFWFRAIC50ZXN0CitMT0dfRFJJVkVSID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS90ZXN0LWRyaXZlcgorTE9HX0NPTVBJTEUgPSAkKExPR19DT01QSUxFUikgJChBTV9MT0dfRkxBR1MpICQoTE9HX0ZMQUdTKQorYW1fX3NldF9iID0gXAorICBjYXNlICckQCcgaW4gXAorICAgICovKikgXAorICAgICAgY2FzZSAnJConIGluIFwKKyAgICAgICAgKi8qKSBiPSckKic7OyBcCisgICAgICAgICAgKikgYj1gZWNobyAnJEAnIHwgc2VkICdzL1wubG9nJCQvLydgOyBcCisgICAgICAgZXNhYzs7IFwKKyAgICAqKSBcCisgICAgICBiPSckKic7OyBcCisgIGVzYWMKK2FtX190ZXN0X2xvZ3MxID0gJChURVNUUzo9LmxvZykKK2FtX190ZXN0X2xvZ3MyID0gJChhbV9fdGVzdF9sb2dzMTpARVhFRVhUQC5sb2c9LmxvZykKK1RFU1RfTE9HUyA9ICQoYW1fX3Rlc3RfbG9nczI6LnRlc3QubG9nPS5sb2cpCitURVNUX0xPR19EUklWRVIgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL3Rlc3QtZHJpdmVyCitURVNUX0xPR19DT01QSUxFID0gJChURVNUX0xPR19DT01QSUxFUikgJChBTV9URVNUX0xPR19GTEFHUykgXAorCSQoVEVTVF9MT0dfRkxBR1MpCithbV9fRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3Bfc3JjZGlyKS9kZXBjb21wIFwKKwkkKHRvcF9zcmNkaXIpL3Rlc3QtZHJpdmVyIFJFQURNRS5tZAorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNVEFSID0gQEFNVEFSQAorQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQlVJTERfRVhFRVhUID0gQEJVSUxEX0VYRUVYVEAKK0JVSUxEX09CSkVYVCA9IEBCVUlMRF9PQkpFWFRACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NGTEFHU19GT1JfQlVJTEQgPSBAQ0ZMQUdTX0ZPUl9CVUlMREAKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NQUEZMQUdTX0ZPUl9CVUlMRCA9IEBDUFBGTEFHU19GT1JfQlVJTERACitDUFBfRk9SX0JVSUxEID0gQENQUF9GT1JfQlVJTERACitDU0NPUEUgPSBAQ1NDT1BFQAorQ1RBR1MgPSBAQ1RBR1NACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWENQUEZMQUdTX0ZPUl9CVUlMRCA9IEBDWFhDUFBGTEFHU19GT1JfQlVJTERACitDWFhDUFBfRk9SX0JVSUxEID0gQENYWENQUF9GT1JfQlVJTERACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NYWEZMQUdTX0ZPUl9CVUlMRCA9IEBDWFhGTEFHU19GT1JfQlVJTERACitDWFhfRk9SX0JVSUxEID0gQENYWF9GT1JfQlVJTERACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RJU1RfTEFORyA9IEBESVNUX0xBTkdACitETExUT09MID0gQERMTFRPT0xACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVRBR1MgPSBARVRBR1NACitFWEVFWFQgPSBARVhFRVhUQAorRkdSRVAgPSBARkdSRVBACitGSUxFQ01EID0gQEZJTEVDTURACitHUkVQID0gQEdSRVBACitIQVZFX0NYWDExID0gQEhBVkVfQ1hYMTFACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0lTQUlORk8gPSBASVNBSU5GT0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTERGTEFHU19GT1JfQlVJTEQgPSBATERGTEFHU19GT1JfQlVJTERACitMSUJBVE9NSUNfTElCUyA9IEBMSUJBVE9NSUNfTElCU0AKK0xJQkxPR19MSUJTID0gQExJQkxPR19MSUJTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK0xUX1NZU19MSUJSQVJZX1BBVEggPSBATFRfU1lTX0xJQlJBUllfUEFUSEAKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNQU5JRkVTVF9UT09MID0gQE1BTklGRVNUX1RPT0xACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpDID0gQE9CSkNACitPQkpDREVQTU9ERSA9IEBPQkpDREVQTU9ERUAKK09CSkNGTEFHUyA9IEBPQkpDRkxBR1NACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BPV19MSUIgPSBAUE9XX0xJQkAKK1BST1RPQlVGX09QVF9GTEFHID0gQFBST1RPQlVGX09QVF9GTEFHQAorUFJPVE9DID0gQFBST1RPQ0AKK1BUSFJFQURfQ0MgPSBAUFRIUkVBRF9DQ0AKK1BUSFJFQURfQ0ZMQUdTID0gQFBUSFJFQURfQ0ZMQUdTQAorUFRIUkVBRF9MSUJTID0gQFBUSFJFQURfTElCU0AKK1JBTkxJQiA9IEBSQU5MSUJACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQVIgPSBAYWNfY3RfQVJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NDX0ZPUl9CVUlMRCA9IEBhY19jdF9DQ19GT1JfQlVJTERACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfQ1hYX0ZPUl9CVUlMRCA9IEBhY19jdF9DWFhfRk9SX0JVSUxEQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYWNfY3RfT0JKQyA9IEBhY19jdF9PQkpDQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitheF9wdGhyZWFkX2NvbmZpZyA9IEBheF9wdGhyZWFkX2NvbmZpZ0AKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitydW5zdGF0ZWRpciA9IEBydW5zdGF0ZWRpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N1YmRpcnMgPSBAc3ViZGlyc0AKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldCA9IEB0YXJnZXRACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordGFyZ2V0X2NwdSA9IEB0YXJnZXRfY3B1QAordGFyZ2V0X29zID0gQHRhcmdldF9vc0AKK3RhcmdldF92ZW5kb3IgPSBAdGFyZ2V0X3ZlbmRvckAKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitASEFWRV9aTElCX0ZBTFNFQEdaQ0hFQ0tQUk9HUkFNUyA9IAorQEhBVkVfWkxJQl9UUlVFQEdaQ0hFQ0tQUk9HUkFNUyA9IHpjZ3ppcCB6Y2d1bnppcAorQEhBVkVfWkxJQl9GQUxTRUBHWkhFQURFUlMgPSAKK0BIQVZFX1pMSUJfVFJVRUBHWkhFQURFUlMgPSBnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaAorQEhBVkVfWkxJQl9GQUxTRUBHWlRFU1RTID0gCitASEFWRV9aTElCX1RSVUVAR1pURVNUUyA9IGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaAorQEhBVkVfWkxJQl9GQUxTRUBaTElCX0RFRiA9IAorQEhBVkVfWkxJQl9UUlVFQFpMSUJfREVGID0gLURIQVZFX1pMSUI9MQorQEhBVkVfUFRIUkVBRF9GQUxTRUBQVEhSRUFEX0RFRiA9IAorQEhBVkVfUFRIUkVBRF9UUlVFQFBUSFJFQURfREVGID0gLURIQVZFX1BUSFJFQUQ9MQorUFJPVE9CVUZfVkVSU0lPTiA9IDMyOjk6MAorQEdDQ19GQUxTRUBOT19PUFRfQ1hYRkxBR1MgPSAkKFBUSFJFQURfQ0ZMQUdTKSAkKFBUSFJFQURfREVGKSAkKFpMSUJfREVGKQorCisjIFR1cm4gb24gYWxsIHdhcm5pbmdzIGV4Y2VwdCBmb3Igc2lnbiBjb21wYXJpc29uICh3ZSBpZ25vcmUgc2lnbiBjb21wYXJpc29uCisjIGluIEdvb2dsZSBzbyBvdXIgY29kZSBiYXNlIGhhdmUgdG9ucyBvZiBzdWNoIHdhcm5pbmdzKS4KK0BHQ0NfVFJVRUBOT19PUFRfQ1hYRkxBR1MgPSAkKFBUSFJFQURfQ0ZMQUdTKSAkKFBUSFJFQURfREVGKSAkKFpMSUJfREVGKSAtV2FsbCAtV25vLXNpZ24tY29tcGFyZQorQU1fQ1hYRkxBR1MgPSAkKE5PX09QVF9DWFhGTEFHUykgJChQUk9UT0JVRl9PUFRfRkxBRykKK0FNX0xERkxBR1MgPSAkKFBUSFJFQURfQ0ZMQUdTKSAke0xJQkxPR19MSUJTfQorCisjIElmIEkgc2F5ICJkaXN0X2luY2x1ZGVfREFUQSIsIGF1dG9tYWtlIGNvbXBsYWlucyB0aGF0ICQoaW5jbHVkZWRpcikgaXMgbm90CisjIGEgImxlZ2l0aW1hdGUiIGRpcmVjdG9yeSBmb3IgREFUQS4gIFNjcmV3IHlvdSwgYXV0b21ha2UuCitwcm90b2RpciA9ICQoaW5jbHVkZWRpcikKKworIyBJZiB5b3UgYXJlIGFkZGluZyBuZXcgZmlsZXMgaGVyZSwgYWxzbyByZW1lbWJlciB0byBjaGFuZ2UgdGhlIGJ1aWxkIGZpbGVzIGZvcgorIyBhbGwgb3RoZXIgbGFuZ3VhZ2VzLCAvL3Byb3RvYy1hcnRpZmFjdHMvYnVpbGQtemlwLnNoIGFuZCBydW4KKyMgLy91cGRhdGVfZmlsZV9saXN0LnNoIGZvciBiYXplbC4KK25vYmFzZV9kaXN0X3Byb3RvX0RBVEEgPSBcCisgIGdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8gICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYXBpLnByb3RvICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90byBcCisgIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8gICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucHJvdG8gIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8gICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdHlwZS5wcm90byAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvCisKK0NMRUFORklMRVMgPSAkKHByb3RvY19vdXRwdXRzKSB1bml0dGVzdF9wcm90b19taWRkbGVtYW4gXAorICAgICAgICAgICAgIHRlc3R6aXAuamFyIHRlc3R6aXAubGlzdCB0ZXN0emlwLnByb3RvIHRlc3R6aXAuemlwIFwKKyAgICAgICAgICAgICBub193YXJuaW5nX3Rlc3QuY2MKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBcCisgIE1ha2VmaWxlLmluCisKK25vYmFzZV9pbmNsdWRlX0hFQURFUlMgPSBcCisgIGdvb2dsZS9wcm90b2J1Zi9hbnkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYXBpLnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX2ltcGwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hcmVuYXpfc2FtcGxlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9maWxlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2dlbmVyYXRvci5oICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvaGVscGVycy5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9uYW1lcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9kb2NfY29tbWVudC5oICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5oICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbmFtZXMuaCAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9vcHRpb25zLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZ2VuZXJhdG9yLmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2tvdGxpbl9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2dlbmVyYXRvci5oICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5oICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGhwL3BocF9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2dlbmVyYXRvci5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHlpX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmggICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvci5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZW1wdHkucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9lbmRpYW4uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2V4cGxpY2l0bHlfY29uc3RydWN0ZWQuaCAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2lubC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX2FjY2Vzc19saXN0ZW5lci5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV9yZWZsZWN0aW9uLmggICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfYmFzZXMuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmggICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfZGVjbC5oICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9pbXBsLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmggICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2hhc19iaXRzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW1wbGljaXRfd2Vha19tZXNzYWdlLmggICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pbmxpbmVkX3N0cmluZ19maWVsZC5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAkKEdaSEVBREVSUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vc3RydG9kLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmggICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX2VudHJ5LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfZW50cnlfbGl0ZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX2lubC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfbGl0ZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF90eXBlX2hhbmRsZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21ldGFkYXRhLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWV0YWRhdGFfbGl0ZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9wYXJzZV9jb250ZXh0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3BvcnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9pbnRlcm5hbC5oICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfcHRyX2ZpZWxkLmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3RydWN0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NhbGxiYWNrLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYWNyb3MuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvbXV0ZXguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BsYXRmb3JtX21hY3Jvcy5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvcG9ydC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWwuaCAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvci5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlci5oICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsLmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnBiLmgKKworbGliX0xUTElCUkFSSUVTID0gbGlicHJvdG9idWYtbGl0ZS5sYSBsaWJwcm90b2J1Zi5sYSBsaWJwcm90b2MubGEKK2xpYnByb3RvYnVmX2xpdGVfbGFfTElCQUREID0gJChQVEhSRUFEX0xJQlMpICQoTElCQVRPTUlDX0xJQlMpCitsaWJwcm90b2J1Zl9saXRlX2xhX0xERkxBR1MgPSAtdmVyc2lvbi1pbmZvICQoUFJPVE9CVUZfVkVSU0lPTikgXAorCS1leHBvcnQtZHluYW1pYyAtbm8tdW5kZWZpbmVkICQoYW1fX2FwcGVuZF8xKQorQEhBVkVfTERfVkVSU0lPTl9TQ1JJUFRfVFJVRUBFWFRSQV9saWJwcm90b2J1Zl9saXRlX2xhX0RFUEVOREVOQ0lFUyA9IGxpYnByb3RvYnVmLWxpdGUubWFwCitsaWJwcm90b2J1Zl9saXRlX2xhX1NPVVJDRVMgPSBcCisgIGdvb2dsZS9wcm90b2J1Zi9hbnlfbGl0ZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hcmVuYXpfc2FtcGxlci5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV91dGlsLmNjICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGUuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmNjICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pbXBsaWNpdF93ZWFrX21lc3NhZ2UuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pbmxpbmVkX3N0cmluZ19maWVsZC5jYyAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uY2MgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby9zdHJ0b2QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmNjICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5jYyAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXAuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9wYXJzZV9jb250ZXh0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9wdHJfZmllbGQuY2MgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHJpbmdfbWVtYmVyX3JvYmJlci5oICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmNjICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjguY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRodXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNfbWFjcm9zLmggICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvci5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuY2MgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWQuY2MgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmNjCisKK2xpYnByb3RvYnVmX2xhX0xJQkFERCA9ICQoUFRIUkVBRF9MSUJTKSAkKExJQkFUT01JQ19MSUJTKQorbGlicHJvdG9idWZfbGFfTERGTEFHUyA9IC12ZXJzaW9uLWluZm8gJChQUk9UT0JVRl9WRVJTSU9OKSBcCisJLWV4cG9ydC1keW5hbWljIC1uby11bmRlZmluZWQgJChhbV9fYXBwZW5kXzIpCitASEFWRV9MRF9WRVJTSU9OX1NDUklQVF9UUlVFQEVYVFJBX2xpYnByb3RvYnVmX2xhX0RFUEVOREVOQ0lFUyA9IGxpYnByb3RvYnVmLm1hcAorbGlicHJvdG9idWZfbGFfU09VUkNFUyA9IFwKKyAgJChsaWJwcm90b2J1Zl9saXRlX2xhX1NPVVJDRVMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FueS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FwaS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmNjICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaGVhdnkuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX2Jhc2VzLmNjICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfZnVsbC5jYyAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZGVsaW1pdGVkX21lc3NhZ2VfdXRpbC5jYyAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvci5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsLmNjICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvY29uc3RhbnRzLmggICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGF0YXBpZWNlLmNjICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGF0YXBpZWNlLmggICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXIuY2MgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXIuaCAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZXJyb3JfbGlzdGVuZXIuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZXJyb3JfbGlzdGVuZXIuaCAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZXhwZWN0aW5nX29iamVjdHdyaXRlci5oICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZmllbGRfbWFza191dGlsaXR5LmNjICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZmllbGRfbWFza191dGlsaXR5LmggICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9lc2NhcGluZy5jYyAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9lc2NhcGluZy5oICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXIuY2MgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXIuaCAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyLmNjICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyLmggICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvbG9jYXRpb25fdHJhY2tlci5oICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvbW9ja19lcnJvcl9saXN0ZW5lci5oICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X2xvY2F0aW9uX3RyYWNrZXIuaCAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3NvdXJjZS5oICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3dyaXRlci5jYyAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3dyaXRlci5oICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9fd3JpdGVyLmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9fd3JpdGVyLmggICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlLmNjICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlLmggICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyLmNjICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyLmggICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvc3RydWN0dXJlZF9vYmplY3R3cml0ZXIuaCAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvLmNjICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvLmggICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmggICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdXRpbGl0eS5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdXRpbGl0eS5oICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlci5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsLmNjICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnBiLmNjCisKK25vZGlzdF9saWJwcm90b2J1Zl9sYV9TT1VSQ0VTID0gJChub2Rpc3RfbGlicHJvdG9idWZfbGl0ZV9sYV9TT1VSQ0VTKQorbGlicHJvdG9jX2xhX0xJQkFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYQorbGlicHJvdG9jX2xhX0xERkxBR1MgPSAtdmVyc2lvbi1pbmZvICQoUFJPVE9CVUZfVkVSU0lPTikgXAorCS1leHBvcnQtZHluYW1pYyAtbm8tdW5kZWZpbmVkICQoYW1fX2FwcGVuZF8zKQorQEhBVkVfTERfVkVSU0lPTl9TQ1JJUFRfVFJVRUBFWFRSQV9saWJwcm90b2NfbGFfREVQRU5ERU5DSUVTID0gbGlicHJvdG9jLm1hcAorbGlicHJvdG9jX2xhX1NPVVJDRVMgPSBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmNjICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZW51bS5jYyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZW51bS5oICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZW51bV9maWVsZC5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZW51bV9maWVsZC5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZXh0ZW5zaW9uLmNjICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZXh0ZW5zaW9uLmggICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmllbGQuY2MgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmllbGQuaCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmlsZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZ2VuZXJhdG9yLmNjICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvaGVscGVycy5jYyAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWFwX2ZpZWxkLmNjICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWFwX2ZpZWxkLmggICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZS5jYyAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZS5oICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9maWVsZC5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9maWVsZC5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9sYXlvdXRfaGVscGVyLmggICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvb3B0aW9ucy5oICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFkZGluZ19vcHRpbWl6ZXIuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFkZGluZ19vcHRpbWl6ZXIuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yLmNjICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yLmggICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJpbWl0aXZlX2ZpZWxkLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJpbWl0aXZlX2ZpZWxkLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvc2VydmljZS5jYyAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvc2VydmljZS5oICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvc3RyaW5nX2ZpZWxkLmNjICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvc3RyaW5nX2ZpZWxkLmggICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50LmNjICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW0uY2MgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW0uaCAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW1fZmllbGQuY2MgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW1fZmllbGQuaCAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuY2MgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuaCAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5jYyAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5jYyAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5oICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2UuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2UuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2VfZmllbGQuY2MgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2VfZmllbGQuaCAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3ByaW1pdGl2ZV9maWVsZC5jYyAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3ByaW1pdGl2ZV9maWVsZC5oICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlZmxlY3Rpb25fY2xhc3MuY2MgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlZmxlY3Rpb25fY2xhc3MuaCAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuY2MgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9lbnVtX2ZpZWxkLmggXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9tZXNzYWdlX2ZpZWxkLmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfbWVzc2FnZV9maWVsZC5oIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfcHJpbWl0aXZlX2ZpZWxkLmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfcHJpbWl0aXZlX2ZpZWxkLmggXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9zb3VyY2VfZ2VuZXJhdG9yX2Jhc2UuY2MgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9zb3VyY2VfZ2VuZXJhdG9yX2Jhc2UuaCBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3dyYXBwZXJfZmllbGQuY2MgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3dyYXBwZXJfZmllbGQuaCAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2NvbnRleHQuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2NvbnRleHQuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50LmNjICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50LmggICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW0uY2MgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW0uaCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGQuY2MgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGQuaCAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGRfbGl0ZS5jYyAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGRfbGl0ZS5oICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fbGl0ZS5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fbGl0ZS5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbi5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbi5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbl9saXRlLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbl9saXRlLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmNjICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmggICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpbGUuY2MgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpbGUuaCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvcl9mYWN0b3J5LmNjICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvcl9mYWN0b3J5LmggICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2tvdGxpbl9nZW5lcmF0b3IuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZC5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZC5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZF9saXRlLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZF9saXRlLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2UuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2UuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlci5jYyAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlci5oICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlcl9saXRlLmNjICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlcl9saXRlLmggICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfZmllbGQuY2MgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfZmllbGQuaCAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfZmllbGRfbGl0ZS5jYyAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfZmllbGRfbGl0ZS5oICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfbGl0ZS5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfbGl0ZS5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL25hbWVfcmVzb2x2ZXIuY2MgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL25hbWVfcmVzb2x2ZXIuaCAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL29wdGlvbnMuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3ByaW1pdGl2ZV9maWVsZC5jYyAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3ByaW1pdGl2ZV9maWVsZC5oICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3ByaW1pdGl2ZV9maWVsZF9saXRlLmNjICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3ByaW1pdGl2ZV9maWVsZF9saXRlLmggICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3NlcnZpY2UuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3NlcnZpY2UuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3NoYXJlZF9jb2RlX2dlbmVyYXRvci5jYyAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3NoYXJlZF9jb2RlX2dlbmVyYXRvci5oICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3N0cmluZ19maWVsZC5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3N0cmluZ19maWVsZC5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3N0cmluZ19maWVsZF9saXRlLmNjICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3N0cmluZ19maWVsZF9saXRlLmggICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bS5jYyAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bS5oICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5jYyBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5oICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZXh0ZW5zaW9uLmNjICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZXh0ZW5zaW9uLmggICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmllbGQuY2MgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmllbGQuaCAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmlsZS5jYyAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmlsZS5oICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZ2VuZXJhdG9yLmNjICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5jYyAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWFwX2ZpZWxkLmNjICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWFwX2ZpZWxkLmggICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZS5jYyAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZS5oICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5jYyBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5oIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19uc29iamVjdF9tZXRob2RzLmggXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX29uZW9mLmNjICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX29uZW9mLmggICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX3ByaW1pdGl2ZV9maWVsZC5jYyBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfcHJpbWl0aXZlX2ZpZWxkLmggXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGhwL3BocF9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2hlbHBlcnMuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2hlbHBlcnMuaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5aV9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc2NjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oCisKK3Byb3RvY19MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYSBsaWJwcm90b2MubGEKK3Byb3RvY19TT1VSQ0VTID0gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uY2MKKworIyBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorcHJvdG9jX2lucHV0cyA9IFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90byAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2xhcmdlX2VudW1fdmFsdWUucHJvdG8gICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucHJvdG8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucHJvdG8gICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90byAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucHJvdG8gICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8gICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wcm90byAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnByb3RvICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucHJvdG8gIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucHJvdG8gICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnByb3RvICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucHJvdG8gICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnByb3RvICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8gICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wcm90byAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucHJvdG8gICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wcm90byAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnByb3RvICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnByb3RvICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wcm90byAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucHJvdG8gICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wcm90byAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucHJvdG8gICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wcm90byAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnByb3RvIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wcm90byAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wcm90byAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnByb3RvICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnByb3RvICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnByb3RvICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnByb3RvIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucHJvdG8gICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnByb3RvICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wcm90bworCitFWFRSQV9ESVNUID0gXAorICAkKHByb3RvY19pbnB1dHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBSRUFETUUubWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFja2FnZV9pbmZvLmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9jb2RlLnByb3RvICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9jb2RlX3BiLnJiICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9jb2RlX3Byb3RvMi5wcm90byBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX2NvZGVfcHJvdG8yX2ltcG9ydC5wcm90byBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX2NvZGVfcHJvdG8yX3BiLnJiIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfcGtnX2V4cGxpY2l0LnByb3RvIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfcGtnX2V4cGxpY2l0X2xlZ2FjeS5wcm90byBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX3BrZ19leHBsaWNpdF9sZWdhY3lfcGIucmIgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9wa2dfZXhwbGljaXRfcGIucmIgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9wa2dfaW1wbGljaXQucHJvdG8gXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9wa2dfaW1wbGljaXRfcGIucmIgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX291dHB1dF91bml0dGVzdC5zaCAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW1fdW5pdHRlc3Quc2ggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vcGFja2FnZV9pbmZvLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcGFja2FnZV9pbmZvLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF9tZXNzYWdlc19wcm90bzIucHJvdG8gICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF9tZXNzYWdlc19wcm90bzMucHJvdG8gICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvYmFkX3V0Zjhfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2VfbWFwcyAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2Vfb25lb2ZfaW1wbGVtZW50ZWQgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2VfcHJvdG8zICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZSAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvbWFwX3Rlc3RfZGF0YS50eHQgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9vbmVvZl9pbXBsZW1lbnRlZC50eHQgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9wb2ludHkudHh0IFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfcG9pbnR5X29uZW9mLnR4dCBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGEudHh0IFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YV9wb2ludHkudHh0IFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcGFja2FnZV9pbmZvLmggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGlicHJvdG9idWYtbGl0ZS5tYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGlicHJvdG9idWYubWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGlicHJvdG9jLm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc29sYXJpcy9saWJzdGRjKysubGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKK3Byb3RvY19saXRlX291dHB1dHMgPSBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5oICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmgKKworcHJvdG9jX291dHB1dHMgPSBcCisgICQocHJvdG9jX2xpdGVfb3V0cHV0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuaCAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmggICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuaCAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmggICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLmNjICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLmggICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmNjICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmggICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5oICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmggICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmNjICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmggICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5oICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuaCAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmNjICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmggICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuaCAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucGIuY2MgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucGIuaCAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYyBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5oICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuaCAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucGIuY2MgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucGIuaCAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYyAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5oICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYyAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5oICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5jYyAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5oICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYyBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5oICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmggICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuaAorCitDT01NT05fVEVTVF9TT1VSQ0VTID0gXAorICAkKENPTU1PTl9MSVRFX1RFU1RfU09VUkNFUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3RfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3RfdXRpbC5pbmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmluYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsMi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmgKKworR09PR0xFVEVTVF9CVUlMRF9ESVIgPSAuLi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QKK0dPT0dMRU1PQ0tfQlVJTERfRElSID0gLi4vdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrCitHT09HTEVURVNUX1NSQ19ESVIgPSAkKHNyY2RpcikvLi4vdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0CitHT09HTEVNT0NLX1NSQ19ESVIgPSAkKHNyY2RpcikvLi4vdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrCitwcm90b2J1Zl90ZXN0X0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVURVNUX0JVSUxEX0RJUikvbGliL2xpYmd0ZXN0LmxhICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVNT0NLX0JVSUxEX0RJUikvbGliL2xpYmdtb2NrLmxhICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVNT0NLX0JVSUxEX0RJUikvbGliL2xpYmdtb2NrX21haW4ubGEKKworcHJvdG9idWZfdGVzdF9DUFBGTEFHUyA9IC1JJChHT09HTEVURVNUX1NSQ19ESVIpL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC1JJChHT09HTEVNT0NLX1NSQ19ESVIpL2luY2x1ZGUKKworIyBEaXNhYmxlIG9wdGltaXphdGlvbiBmb3IgdGVzdHMgdW5sZXNzIHRoZSB1c2VyIGV4cGxpY2l0bHkgYXNrZWQgZm9yIGl0LAorIyBzaW5jZSB0ZXN0X3V0aWwuY2MgdGFrZXMgZm9yZXZlciB0byBjb21waWxlIHdpdGggb3B0aW1pemF0aW9uICh3aXRoIEdDQykuCisjIFNlZSBjb25maWd1cmUuYWMgZm9yIG1vcmUgaW5mby4KK3Byb3RvYnVmX3Rlc3RfQ1hYRkxBR1MgPSAkKE5PX09QVF9DWFhGTEFHUykKK3Byb3RvYnVmX3Rlc3RfU09VUkNFUyA9IFwKKyAgJChDT01NT05fVEVTVF9TT1VSQ0VTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hel9zYW1wbGVyX3Rlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2Fubm90YXRpb25fdGVzdF91dGlsLmNjICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2Fubm90YXRpb25fdGVzdF91dGlsLmggICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ib290c3RyYXBfdW5pdHRlc3QuY2MgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlX3NpemVfdW5pdHRlc3QuY2MgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXRhZGF0YV90ZXN0LmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tb3ZlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wbHVnaW5fdW5pdHRlc3QuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5pbmMgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcGx1Z2luX3VuaXR0ZXN0LmNjICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzX3VuaXR0ZXN0LmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9wbHVnaW5fdW5pdHRlc3QuY2MgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3JfdW5pdHRlc3QuY2MgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Ryb3BfdW5rbm93bl9maWVsZHNfdGVzdC5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0LmNjICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lubGluZWRfc3RyaW5nX2ZpZWxkX3VuaXR0ZXN0LmNjICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF90ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0LmluYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuaW5jICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL25vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuY2MgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3ByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19saXRlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19saXRlX3VuaXR0ZXN0LmluYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW1fdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c190ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yX3Rlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYyAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYyAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWVfdGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZGVsaW1pdGVkX21lc3NhZ2VfdXRpbF90ZXN0LmNjICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvcl90ZXN0LmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsX3Rlc3QuY2MgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXJfdGVzdC5jYyBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyX3Rlc3QuY2MgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlcl90ZXN0LmNjICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0LmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyX3Rlc3QuY2MgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuY2MgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWxfdGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LmNjICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWxfdGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWxfdGVzdC5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfdW5pdHRlc3QuaW5jCisKK25vZGlzdF9wcm90b2J1Zl90ZXN0X1NPVVJDRVMgPSAkKHByb3RvY19vdXRwdXRzKQorCisjIFJ1biBjcHBfdW5pdHRlc3QgYWdhaW4gd2l0aCBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTIGRlZmluZWQuCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgbGlicHJvdG9jLmxhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVURVNUX0JVSUxEX0RJUikvbGliL2xpYmd0ZXN0LmxhICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVNT0NLX0JVSUxEX0RJUikvbGliL2xpYmdtb2NrLmxhICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVNT0NLX0JVSUxEX0RJUikvbGliL2xpYmdtb2NrX21haW4ubGEKKworcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MgPSAtSSQoR09PR0xFTU9DS19TUkNfRElSKS9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUkkKEdPT0dMRVRFU1RfU1JDX0RJUikvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKQorcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfU09VUkNFUyA9IFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgJChDT01NT05fVEVTVF9TT1VSQ0VTKQorCitub2Rpc3RfcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfU09VUkNFUyA9ICQocHJvdG9jX291dHB1dHMpCitDT01NT05fTElURV9URVNUX1NPVVJDRVMgPSBcCisgIGdvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0X3V0aWxfaW1wbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5oCisKKworIyBCdWlsZCBsaXRlX3VuaXR0ZXN0IHNlcGFyYXRlbHksIHNpbmNlIGl0IGRvZXNuJ3QgdXNlIGd0ZXN0LiBJdCBjYW4ndAorIyBkZXBlbmQgb24gZ3Rlc3QgYmVjYXVzZSBvdXIgaW50ZXJuYWwgdmVyc2lvbiBvZiBndGVzdCBkZXBlbmQgb24gcHJvdG8KKyMgZnVsbCBydW50aW1lIGFuZCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGlzIHRlc3QgYnVpbGRzIHdpdGhvdXQgZnVsbAorIyBydW50aW1lLgorcHJvdG9idWZfbGl0ZV90ZXN0X0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLWxpdGUubGEgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICQoR09PR0xFVEVTVF9CVUlMRF9ESVIpL2xpYi9saWJndGVzdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEdPT0dMRU1PQ0tfQlVJTERfRElSKS9saWIvbGliZ21vY2subGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJChHT09HTEVNT0NLX0JVSUxEX0RJUikvbGliL2xpYmdtb2NrX21haW4ubGEKKworcHJvdG9idWZfbGl0ZV90ZXN0X0NQUEZMQUdTID0gLUkkKEdPT0dMRU1PQ0tfU1JDX0RJUikvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1JJChHT09HTEVURVNUX1NSQ19ESVIpL2luY2x1ZGUKKworcHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTID0gJChOT19PUFRfQ1hYRkxBR1MpCitwcm90b2J1Zl9saXRlX3Rlc3RfU09VUkNFUyA9IFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2xpdGVfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAkKENPTU1PTl9MSVRFX1RFU1RfU09VUkNFUykKKworbm9kaXN0X3Byb3RvYnVmX2xpdGVfdGVzdF9TT1VSQ0VTID0gJChwcm90b2NfbGl0ZV9vdXRwdXRzKQorCisjIGxpdGVfYXJlbmFfdW5pdHRlc3QgZGVwZW5kcyBvbiBndGVzdCBiZWNhdXNlIHRlYm9yaW5nQCBmb3VuZCB0aGF0IHdpdGhvdXQKKyMgZ3Rlc3Qgd2hlbiBidWlsZGluZyB0aGUgdGVzdCBpbnRlcm5hbGx5IG91ciBtZW1vcnkgc2FuaXRpemVyIGRvZXNuJ3QgZGV0ZWN0CisjIG1lbW9yeSBsZWFrcyAoZG9uJ3Qga25vdyB3aHkpLgorcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLWxpdGUubGEgXAorICAgICAgICAgICAgICAgICAgICAgICQoR09PR0xFVEVTVF9CVUlMRF9ESVIpL2xpYi9saWJndGVzdC5sYSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICQoR09PR0xFTU9DS19CVUlMRF9ESVIpL2xpYi9saWJnbW9jay5sYSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICQoR09PR0xFTU9DS19CVUlMRF9ESVIpL2xpYi9saWJnbW9ja19tYWluLmxhCisKK3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DUFBGTEFHUyA9IC1JJChHT09HTEVNT0NLX1NSQ19ESVIpL2luY2x1ZGUgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1JJChHT09HTEVURVNUX1NSQ19ESVIpL2luY2x1ZGUKKworcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NYWEZMQUdTID0gJChOT19PUFRfQ1hYRkxBR1MpCitwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfU09VUkNFUyA9IFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2xpdGVfYXJlbmFfdW5pdHRlc3QuY2MgXAorICAkKENPTU1PTl9MSVRFX1RFU1RfU09VUkNFUykKKworbm9kaXN0X3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9TT1VSQ0VTID0gJChwcm90b2NfbGl0ZV9vdXRwdXRzKQorCisjIFRlc3QgcGx1Z2luIGJpbmFyeS4KK3Rlc3RfcGx1Z2luX0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYSBcCisgICAgICAgICAgICAgICAgICAgICQoR09PR0xFVEVTVF9CVUlMRF9ESVIpL2xpYi9saWJndGVzdC5sYQorCit0ZXN0X3BsdWdpbl9DUFBGTEFHUyA9IC1JJChHT09HTEVURVNUX1NSQ19ESVIpL2luY2x1ZGUKK3Rlc3RfcGx1Z2luX1NPVVJDRVMgPSBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYyAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaAorCitASEFWRV9aTElCX1RSVUVAemNnemlwX0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhCitASEFWRV9aTElCX1RSVUVAemNnemlwX1NPVVJDRVMgPSBnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuY2MKK0BIQVZFX1pMSUJfVFJVRUB6Y2d1bnppcF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYQorQEhBVkVfWkxJQl9UUlVFQHpjZ3VuemlwX1NPVVJDRVMgPSBnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYworbm9fd2FybmluZ190ZXN0X0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYQorbm9fd2FybmluZ190ZXN0X0NYWEZMQUdTID0gJChQVEhSRUFEX0NGTEFHUykgJChQVEhSRUFEX0RFRikgJChaTElCX0RFRikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLVdhbGwgLVdleHRyYSAtV2Vycm9yIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorCitub2Rpc3Rfbm9fd2FybmluZ190ZXN0X1NPVVJDRVMgPSBub193YXJuaW5nX3Rlc3QuY2MgJChwcm90b2Nfb3V0cHV0cykKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmNjIC5sbyAubG9nIC5vIC5vYmogLnRlc3QgLnRlc3QkKEVYRUVYVCkgLnRycworJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgc3JjL01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251IHNyYy9NYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX21heWJlX3JlbWFrZV9kZXBmaWxlcyknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX21heWJlX3JlbWFrZV9kZXBmaWxlcyk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgoraW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoYmluZGlyKSIgfHwgbGlzdD07IFwKKwlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChiaW5kaXIpJyI7IFwKKwkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKGJpbmRpcikiIHx8IGV4aXQgMTsgXAorCWZpOyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKwlzZWQgJ3MvJChFWEVFWFQpJCQvLycgfCBcCisJd2hpbGUgcmVhZCBwIHAxOyBkbyBpZiB0ZXN0IC1mICQkcCBcCisJIHx8IHRlc3QgLWYgJCRwMSBcCisJICA7IHRoZW4gZWNobyAiJCRwIjsgZWNobyAiJCRwIjsgZWxzZSA6OyBmaTsgXAorCWRvbmUgfCBcCisJc2VkIC1lICdwO3MsLiovLCw7bjtoJyBcCisJICAgIC1lICdzfC4qfC58JyBcCisJICAgIC1lICdwO3g7cywuKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLycgfCBcCisJc2VkICdOO047TjtzLFxuLCAsZycgfCBcCisJJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIjsgZGlyc1siLiJdID0gMSB9IFwKKwkgIHsgZD0kJDM7IGlmIChkaXJzW2RdICE9IDEpIHsgcHJpbnQgImQiLCBkOyBkaXJzW2RdID0gMSB9IFwKKwkgICAgaWYgKCQkMiA9PSAkJDQpIGZpbGVzW2RdID0gZmlsZXNbZF0gIiAiICQkMTsgXAorCSAgICBlbHNlIHsgcHJpbnQgImYiLCAkJDMgIi8iICQkNCwgJCQxOyB9IH0gXAorCSAgRU5EIHsgZm9yIChkIGluIGZpbGVzKSBwcmludCAiZiIsIGQsIGZpbGVzW2RdIH0nIHwgXAorCXdoaWxlIHJlYWQgdHlwZSBkaXIgZmlsZXM7IGRvIFwKKwkgICAgaWYgdGVzdCAiJCRkaXIiID0gLjsgdGhlbiBkaXI9OyBlbHNlIGRpcj0vJCRkaXI7IGZpOyBcCisJICAgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkZmlsZXMgJyQoREVTVERJUikkKGJpbmRpcikkJGRpciciOyBcCisJICAgICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICIkKERFU1RESVIpJChiaW5kaXIpJCRkaXIiIHx8IGV4aXQgJCQ/OyBcCisJICAgIH0gXAorCTsgZG9uZQorCit1bmluc3RhbGwtYmluUFJPR1JBTVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJChiaW5kaXIpIiB8fCBsaXN0PTsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBcCisJICBzZWQgLWUgJ2g7cyxeLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKScgXAorCSAgICAgIC1lICdzLyQkLyQoRVhFRVhUKS8nIFwKKwlgOyBcCisJdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgKCBjZCAnJChERVNURElSKSQoYmluZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJY2QgIiQoREVTVERJUikkKGJpbmRpcikiICYmIHJtIC1mICQkZmlsZXMKKworY2xlYW4tYmluUFJPR1JBTVM6CisJQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKKwl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAorCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdAorCitjbGVhbi1jaGVja1BST0dSQU1TOgorCUBsaXN0PSckKGNoZWNrX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKKwl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAorCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdAorCitpbnN0YWxsLWxpYkxUTElCUkFSSUVTOiAkKGxpYl9MVExJQlJBUklFUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgdGVzdCAtbiAiJChsaWJkaXIpIiB8fCBsaXN0PTsgXAorCWxpc3QyPTsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCisJICAgIGxpc3QyPSIkJGxpc3QyICQkcCI7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwlkb25lOyBcCisJdGVzdCAteiAiJCRsaXN0MiIgfHwgeyBcCisJICBlY2hvICIgJChNS0RJUl9QKSAnJChERVNURElSKSQobGliZGlyKSciOyBcCisJICAkKE1LRElSX1ApICIkKERFU1RESVIpJChsaWJkaXIpIiB8fCBleGl0IDE7IFwKKwkgIGVjaG8gIiAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRsaXN0MiAnJChERVNURElSKSQobGliZGlyKSciOyBcCisJICAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRsaXN0MiAiJChERVNURElSKSQobGliZGlyKSI7IFwKKwl9CisKK3VuaW5zdGFsbC1saWJMVExJQlJBUklFUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyB0ZXN0IC1uICIkKGxpYmRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICAkKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAnJChERVNURElSKSQobGliZGlyKS8kJGYnIjsgXAorCSAgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgIiQoREVTVERJUikkKGxpYmRpcikvJCRmIjsgXAorCWRvbmUKKworY2xlYW4tbGliTFRMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChsaWJfTFRMSUJSQVJJRVMpCisJQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IFwKKwlsb2NzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRwOyBkb25lIHwgXAorCSAgICAgIHNlZCAnc3xeW14vXSokJHwufDsgc3wvW14vXSokJHx8OyBzfCQkfC9zb19sb2NhdGlvbnN8JyB8IFwKKwkgICAgICBzb3J0IC11YDsgXAorCXRlc3QgLXogIiQkbG9jcyIgfHwgeyBcCisJICBlY2hvIHJtIC1mICQke2xvY3N9OyBcCisJICBybSAtZiAkJHtsb2NzfTsgXAorCX0KK2dvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgZ29vZ2xlL3Byb3RvYnVmCisJQDogPiBnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpCisJQDogPiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2FueV9saXRlLmxvOiBnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmxvOiBnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmxvOiBnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2FyZW5hel9zYW1wbGVyLmxvOiBnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQubG86IGdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fdXRpbC5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZS5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9pbXBsaWNpdF93ZWFrX21lc3NhZ2UubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9pbmxpbmVkX3N0cmluZ19maWVsZC5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2lvLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBnb29nbGUvcHJvdG9idWYvaW8KKwlAOiA+IGdvb2dsZS9wcm90b2J1Zi9pby8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikKKwlAOiA+IGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9pby8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvaW8vaW9fd2luMzIubG86IGdvb2dsZS9wcm90b2J1Zi9pby8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvaW8vc3RydG9kLmxvOiBnb29nbGUvcHJvdG9idWYvaW8vJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0ubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL21hcC5sbzogZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUubG86IGdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcGFyc2VfY29udGV4dC5sbzogZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5sbzogZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9wdHJfZmllbGQubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzCisJQDogPiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpCisJQDogPiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW0ubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24ubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjgubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvci5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWUubG86IGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5sbzogZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKKworbGlicHJvdG9idWYtbGl0ZS5sYTogJChsaWJwcm90b2J1Zl9saXRlX2xhX09CSkVDVFMpICQobGlicHJvdG9idWZfbGl0ZV9sYV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfbGlicHJvdG9idWZfbGl0ZV9sYV9ERVBFTkRFTkNJRVMpIAorCSQoQU1fVl9DWFhMRCkkKGxpYnByb3RvYnVmX2xpdGVfbGFfTElOSykgLXJwYXRoICQobGliZGlyKSAkKGxpYnByb3RvYnVmX2xpdGVfbGFfT0JKRUNUUykgJChsaWJwcm90b2J1Zl9saXRlX2xhX0xJQkFERCkgJChMSUJTKQorZ29vZ2xlL3Byb3RvYnVmL2FueS5sbzogZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9hbnkucGIubG86IGdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvYXBpLnBiLmxvOiBnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIKKwlAOiA+IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikKKwlAOiA+IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmxvOiBnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIubG86IGdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmxvOiBnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5sbzogZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wYi5sbzogZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2hlYXZ5LmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wYi5sbzogZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9iYXNlcy5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24ubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2Z1bGwubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5sbzogZ29vZ2xlL3Byb3RvYnVmL2lvLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmxvOiBnb29nbGUvcHJvdG9idWYvaW8vJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5sbzogZ29vZ2xlL3Byb3RvYnVmL2lvLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQubG86IGdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5sbzogZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5sbzogZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmxvOiBnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnBiLmxvOiBnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5sbzogZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQubG86IGdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnBiLmxvOiBnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIubG86IGdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQubG86IGdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgZ29vZ2xlL3Byb3RvYnVmL3V0aWwKKwlAOiA+IGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikKKwlAOiA+IGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWwubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsCisJQDogPiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpCisJQDogPiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kYXRhcGllY2UubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2Vycm9yX2xpc3RlbmVyLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZmllbGRfbWFza191dGlsaXR5LmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9lc2NhcGluZy5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3dyaXRlci5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvX3dyaXRlci5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZS5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlci5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mby5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3V0aWxpdHkubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWwubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmxvOiBnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnBiLmxvOiBnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCitsaWJwcm90b2J1Zi5sYTogJChsaWJwcm90b2J1Zl9sYV9PQkpFQ1RTKSAkKGxpYnByb3RvYnVmX2xhX0RFUEVOREVOQ0lFUykgJChFWFRSQV9saWJwcm90b2J1Zl9sYV9ERVBFTkRFTkNJRVMpIAorCSQoQU1fVl9DWFhMRCkkKGxpYnByb3RvYnVmX2xhX0xJTkspIC1ycGF0aCAkKGxpYmRpcikgJChsaWJwcm90b2J1Zl9sYV9PQkpFQ1RTKSAkKGxpYnByb3RvYnVmX2xhX0xJQkFERCkgJChMSUJTKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcAorCUA6ID4gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKQorCUA6ID4gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2VudW0ubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9lbnVtX2ZpZWxkLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZXh0ZW5zaW9uLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmllbGQubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9maWxlLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZ2VuZXJhdG9yLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvaGVscGVycy5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21hcF9maWVsZC5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2UubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlX2ZpZWxkLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFkZGluZ19vcHRpbWl6ZXIubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wYXJzZV9mdW5jdGlvbl9nZW5lcmF0b3IubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcmltaXRpdmVfZmllbGQubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9zZXJ2aWNlLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvc3RyaW5nX2ZpZWxkLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAKKwlAOiA+IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikKKwlAOiA+IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZG9jX2NvbW1lbnQubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZW51bS5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWFwX2ZpZWxkLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2UubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZV9maWVsZC5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9wcmltaXRpdmVfZmllbGQubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVmbGVjdGlvbl9jbGFzcy5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9lbnVtX2ZpZWxkLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX21lc3NhZ2VfZmllbGQubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfcHJpbWl0aXZlX2ZpZWxkLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3NvdXJjZV9nZW5lcmF0b3JfYmFzZS5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF93cmFwcGVyX2ZpZWxkLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YQorCUA6ID4gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKQorCUA6ID4gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvY29udGV4dC5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50LmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bS5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGQubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtX2ZpZWxkX2xpdGUubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtX2xpdGUubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9leHRlbnNpb24ubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9leHRlbnNpb25fbGl0ZS5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZmlsZS5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvci5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvcl9mYWN0b3J5LmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvaGVscGVycy5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2tvdGxpbl9nZW5lcmF0b3IubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tYXBfZmllbGQubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tYXBfZmllbGRfbGl0ZS5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2UubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2J1aWxkZXIubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2J1aWxkZXJfbGl0ZS5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfZmllbGQubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2ZpZWxkX2xpdGUubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2xpdGUubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lX3Jlc29sdmVyLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJpbWl0aXZlX2ZpZWxkLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJpbWl0aXZlX2ZpZWxkX2xpdGUubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zZXJ2aWNlLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc2hhcmVkX2NvZGVfZ2VuZXJhdG9yLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc3RyaW5nX2ZpZWxkLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc3RyaW5nX2ZpZWxkX2xpdGUubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMKKwlAOiA+IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikKKwlAOiA+IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bS5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZXh0ZW5zaW9uLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmlsZS5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZ2VuZXJhdG9yLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tYXBfZmllbGQubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2UubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2VfZmllbGQubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX29uZW9mLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19wcmltaXRpdmVfZmllbGQubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGhwLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGhwCisJQDogPiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGhwLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BocC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9waHAvJChERVBESVIpCisJQDogPiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGhwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9waHAvcGhwX2dlbmVyYXRvci5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGhwLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BocC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uCisJQDogPiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vJChERVBESVIpCisJQDogPiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vZ2VuZXJhdG9yLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vaGVscGVycy5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5aV9nZW5lcmF0b3IubG86ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5CisJQDogPiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvJChERVBESVIpCisJQDogPiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvci5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmxvOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5sbzogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCitsaWJwcm90b2MubGE6ICQobGlicHJvdG9jX2xhX09CSkVDVFMpICQobGlicHJvdG9jX2xhX0RFUEVOREVOQ0lFUykgJChFWFRSQV9saWJwcm90b2NfbGFfREVQRU5ERU5DSUVTKSAKKwkkKEFNX1ZfQ1hYTEQpJChsaWJwcm90b2NfbGFfTElOSykgLXJwYXRoICQobGliZGlyKSAkKGxpYnByb3RvY19sYV9PQkpFQ1RTKSAkKGxpYnByb3RvY19sYV9MSUJBREQpICQoTElCUykKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGUucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LWFueV90ZXN0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ub193YXJuaW5nX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbm9fd2FybmluZ190ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfdW5pdHRlc3QucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9hcmVuYS5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YQorCUA6ID4gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKQorCUA6ID4gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWFueXMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWJvb2tzLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWZpZWxkX21hc2sucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LW1hcHMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LW9uZW9mcy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtcHJvdG8zLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1zdHJ1Y3QucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3Qtd3JhcHBlcnMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbm9fd2FybmluZ190ZXN0LWpzb25fZm9ybWF0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbm9fd2FybmluZ190ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCituby13YXJuaW5nLXRlc3QkKEVYRUVYVCk6ICQobm9fd2FybmluZ190ZXN0X09CSkVDVFMpICQobm9fd2FybmluZ190ZXN0X0RFUEVOREVOQ0lFUykgJChFWFRSQV9ub193YXJuaW5nX3Rlc3RfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgbm8td2FybmluZy10ZXN0JChFWEVFWFQpCisJJChBTV9WX0NYWExEKSQobm9fd2FybmluZ190ZXN0X0xJTkspICQobm9fd2FybmluZ190ZXN0X09CSkVDVFMpICQobm9fd2FybmluZ190ZXN0X0xEQUREKSAkKExJQlMpCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYXJlbmFfdGVzdF91dGlsLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWxfbGl0ZS4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcKKwlAOiA+IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikKKwlAOiA+IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpbGUuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZ29vZ2xldGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYW55X3Rlc3QucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXQucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYW55cy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1ib29rcy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWVsZF9tYXNrLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcHMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtb25lb2ZzLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXByb3RvMy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1zdHJ1Y3QucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXdyYXBwZXJzLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKKworcHJvdG9idWYtbGF6eS1kZXNjcmlwdG9yLXRlc3QkKEVYRUVYVCk6ICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfT0JKRUNUUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgcHJvdG9idWYtbGF6eS1kZXNjcmlwdG9yLXRlc3QkKEVYRUVYVCkKKwkkKEFNX1ZfQ1hYTEQpJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9MSU5LKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X09CSkVDVFMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfTERBREQpICQoTElCUykKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbGl0ZV9hcmVuYV91bml0dGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtYXJlbmFfdGVzdF91dGlsLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXRlc3RfdXRpbF9saXRlLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKKworcHJvdG9idWYtbGl0ZS1hcmVuYS10ZXN0JChFWEVFWFQpOiAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9PQkpFQ1RTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9ERVBFTkRFTkNJRVMpICQoRVhUUkFfcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHByb3RvYnVmLWxpdGUtYXJlbmEtdGVzdCQoRVhFRVhUKQorCSQoQU1fVl9DWFhMRCkkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9MSU5LKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9PQkpFQ1RTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9MREFERCkgJChMSUJTKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1saXRlX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1hcmVuYV90ZXN0X3V0aWwuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9saXRlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCitwcm90b2J1Zi1saXRlLXRlc3QkKEVYRUVYVCk6ICQocHJvdG9idWZfbGl0ZV90ZXN0X09CSkVDVFMpICQocHJvdG9idWZfbGl0ZV90ZXN0X0RFUEVOREVOQ0lFUykgJChFWFRSQV9wcm90b2J1Zl9saXRlX3Rlc3RfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgcHJvdG9idWYtbGl0ZS10ZXN0JChFWEVFWFQpCisJJChBTV9WX0NYWExEKSQocHJvdG9idWZfbGl0ZV90ZXN0X0xJTkspICQocHJvdG9idWZfbGl0ZV90ZXN0X09CSkVDVFMpICQocHJvdG9idWZfbGl0ZV90ZXN0X0xEQUREKSAkKExJQlMpCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYV90ZXN0X3V0aWwuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWxfbGl0ZS4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fdGVzdGVyLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfdGVzdC1maWxlLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX3Rlc3QtZ29vZ2xldGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFyZW5hX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYXJlbmFzdHJpbmdfdW5pdHRlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYXpfc2FtcGxlcl90ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Byb3RvYnVmX3Rlc3QtYW5ub3RhdGlvbl90ZXN0X3V0aWwuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LWJvb3RzdHJhcF91bml0dGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2Vfc2l6ZV91bml0dGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1ldGFkYXRhX3Rlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC1tb3ZlX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvcHJvdG9idWZfdGVzdC1jc2hhcnBfYm9vdHN0cmFwX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Byb3RvYnVmX3Rlc3QtaW1wb3J0ZXJfdW5pdHRlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcm90b2J1Zl90ZXN0LWRvY19jb21tZW50X3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3IuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9wcm90b2J1Zl90ZXN0LW9iamVjdGl2ZWNfaGVscGVyc191bml0dGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1wYXJzZXJfdW5pdHRlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9wcm90b2J1Zl90ZXN0LXJ1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZXh0ZW5zaW9uX3NldF91bml0dGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGVfdGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWlubGluZWRfc3RyaW5nX2ZpZWxkX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtaW9fd2luMzJfdW5pdHRlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9pby8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvaW8vcHJvdG9idWZfdGVzdC1wcmludGVyX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF9maWVsZF90ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX3Rlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3Qtbm9fZmllbGRfcHJlc2VuY2VfdGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfdW5pdHRlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1wcm90bzNfbGl0ZV91bml0dGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtYnl0ZXN0cmVhbV91bml0dGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LWludDEyOF91bml0dGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c190ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzb3JfdGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0cmluZ3BpZWNlX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RydXRpbF91bml0dGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXRlbXBsYXRlX3V0aWxfdW5pdHRlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC10aW1lX3Rlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC10ZXh0X2Zvcm1hdF91bml0dGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1kZWxpbWl0ZWRfbWVzc2FnZV91dGlsX3Rlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9jb21wYXJhdG9yX3Rlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrX3V0aWxfdGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1qc29uX29iamVjdHdyaXRlcl90ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2VfdGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtdHlwZV9pbmZvX3Rlc3RfaGVscGVyLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl91dGlsX3Rlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtdGltZV91dGlsX3Rlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC10eXBlX3Jlc29sdmVyX3V0aWxfdGVzdC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC13ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0LiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3Qtd2lyZV9mb3JtYXRfdW5pdHRlc3QuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFueV90ZXN0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9hcmVuYS5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtYW55cy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWJvb2tzLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2sucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1tYXBzLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtb25lb2ZzLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtcHJvdG8zLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtc3RydWN0LnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtd3JhcHBlcnMucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1qc29uX2Zvcm1hdC5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi91dGlsLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCitwcm90b2J1Zi10ZXN0JChFWEVFWFQpOiAkKHByb3RvYnVmX3Rlc3RfT0JKRUNUUykgJChwcm90b2J1Zl90ZXN0X0RFUEVOREVOQ0lFUykgJChFWFRSQV9wcm90b2J1Zl90ZXN0X0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHByb3RvYnVmLXRlc3QkKEVYRUVYVCkKKwkkKEFNX1ZfQ1hYTEQpJChwcm90b2J1Zl90ZXN0X0xJTkspICQocHJvdG9idWZfdGVzdF9PQkpFQ1RTKSAkKHByb3RvYnVmX3Rlc3RfTERBREQpICQoTElCUykKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCitwcm90b2MkKEVYRUVYVCk6ICQocHJvdG9jX09CSkVDVFMpICQocHJvdG9jX0RFUEVOREVOQ0lFUykgJChFWFRSQV9wcm90b2NfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgcHJvdG9jJChFWEVFWFQpCisJJChBTV9WX0NYWExEKSQoQ1hYTElOSykgJChwcm90b2NfT0JKRUNUUykgJChwcm90b2NfTERBREQpICQoTElCUykKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLiQoT0JKRVhUKTogIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvdGVzdF9wbHVnaW4tZmlsZS4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisKK3Rlc3RfcGx1Z2luJChFWEVFWFQpOiAkKHRlc3RfcGx1Z2luX09CSkVDVFMpICQodGVzdF9wbHVnaW5fREVQRU5ERU5DSUVTKSAkKEVYVFJBX3Rlc3RfcGx1Z2luX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHRlc3RfcGx1Z2luJChFWEVFWFQpCisJJChBTV9WX0NYWExEKSQoQ1hYTElOSykgJCh0ZXN0X3BsdWdpbl9PQkpFQ1RTKSAkKHRlc3RfcGx1Z2luX0xEQUREKSAkKExJQlMpCitnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC4kKE9CSkVYVCk6ICBcCisJZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChhbV9fZGlyc3RhbXApIFwKKwlnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisKK3pjZ3VuemlwJChFWEVFWFQpOiAkKHpjZ3VuemlwX09CSkVDVFMpICQoemNndW56aXBfREVQRU5ERU5DSUVTKSAkKEVYVFJBX3pjZ3VuemlwX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHpjZ3VuemlwJChFWEVFWFQpCisJJChBTV9WX0NYWExEKSQoQ1hYTElOSykgJCh6Y2d1bnppcF9PQkpFQ1RTKSAkKHpjZ3VuemlwX0xEQUREKSAkKExJQlMpCitnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuJChPQkpFWFQpOiAgXAorCWdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoYW1fX2RpcnN0YW1wKSBcCisJZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCit6Y2d6aXAkKEVYRUVYVCk6ICQoemNnemlwX09CSkVDVFMpICQoemNnemlwX0RFUEVOREVOQ0lFUykgJChFWFRSQV96Y2d6aXBfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgemNnemlwJChFWEVFWFQpCisJJChBTV9WX0NYWExEKSQoQ1hYTElOSykgJCh6Y2d6aXBfT0JKRUNUUykgJCh6Y2d6aXBfTERBREQpICQoTElCUykKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi4kKE9CSkVYVCkKKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyouJChPQkpFWFQpCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8qLmxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8qLiQoT0JKRVhUKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvKi5sbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyouJChPQkpFWFQpCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvKi5sbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyouJChPQkpFWFQpCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvKi5sbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8qLiQoT0JKRVhUKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8qLmxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyouJChPQkpFWFQpCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyoubG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BocC8qLiQoT0JKRVhUKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGhwLyoubG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8qLiQoT0JKRVhUKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLyoubG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvKi4kKE9CSkVYVCkKKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvKi5sbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vKi4kKE9CSkVYVCkKKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2lvLyoubG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyouJChPQkpFWFQpCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8qLmxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyouJChPQkpFWFQpCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyouJChPQkpFWFQpCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyoubG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvKi4kKE9CSkVYVCkKKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvKi5sbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8qLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW5vX3dhcm5pbmdfdGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9hbnkuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2FueS5wYi5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvYW55X2xpdGUuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2FwaS5wYi5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvYXJlbmEuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2FyZW5hc3RyaW5nLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9hcmVuYXpfc2FtcGxlci5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZGVzY3JpcHRvci5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZGVzY3JpcHRvci5wYi5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZGVzY3JpcHRvcl9kYXRhYmFzZS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZHVyYXRpb24ucGIuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2R5bmFtaWNfbWVzc2FnZS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZW1wdHkucGIuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2V4dGVuc2lvbl9zZXQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2V4dGVuc2lvbl9zZXRfaGVhdnkuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2ZpZWxkX21hc2sucGIuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2dlbmVyYXRlZF9lbnVtX3V0aWwuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2dlbmVyYXRlZF9tZXNzYWdlX2Jhc2VzLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2Z1bGwuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvaW1wbGljaXRfd2Vha19tZXNzYWdlLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9pbmxpbmVkX3N0cmluZ19maWVsZC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbWFwLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9tYXBfZmllbGQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL21lc3NhZ2UuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL21lc3NhZ2VfbGl0ZS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWFueV90ZXN0LnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9saXRlLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcGFyc2VfY29udGV4dC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYW55X3Rlc3QucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF91bml0dGVzdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsX2xpdGUuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbGl0ZV9hcmVuYV91bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdGVzdF91dGlsX2xpdGUuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFueV90ZXN0LnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYXN0cmluZ191bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFyZW5hel9zYW1wbGVyX3Rlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl91bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRyb3BfdW5rbm93bl9maWVsZHNfdGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlX3Rlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9maWVsZF90ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX3Rlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfdW5pdHRlc3QucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtbm9fZmllbGRfcHJlc2VuY2VfdGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfbGl0ZV91bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl90ZXN0ZXIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWwuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWxfbGl0ZS5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3JlZmxlY3Rpb25fb3BzLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9yZXBlYXRlZF9maWVsZC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcmVwZWF0ZWRfcHRyX2ZpZWxkLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9zZXJ2aWNlLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9zb3VyY2VfY29udGV4dC5wYi5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvc3RydWN0LnBiLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS90ZXh0X2Zvcm1hdC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvdGltZXN0YW1wLnBiLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS90eXBlLnBiLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS91bmtub3duX2ZpZWxkX3NldC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvd2lyZV9mb3JtYXQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3dpcmVfZm9ybWF0X2xpdGUuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3dyYXBwZXJzLnBiLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9jb2RlX2dlbmVyYXRvci5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvY29tbWFuZF9saW5lX2ludGVyZmFjZS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvaW1wb3J0ZXIuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL21haW4uUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcGFyc2VyLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wbHVnaW4uUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3BsdWdpbi5wYi5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbm5vdGF0aW9uX3Rlc3RfdXRpbC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcHJvdG9idWZfdGVzdC1pbXBvcnRlcl91bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3IuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wYXJzZXJfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvc3VicHJvY2Vzcy5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvdGVzdF9wbHVnaW4tbW9ja19jb2RlX2dlbmVyYXRvci5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS90ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS96aXBfd3JpdGVyLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvZW51bS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL2VudW1fZmllbGQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9leHRlbnNpb24uUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9maWVsZC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL2ZpbGUuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9nZW5lcmF0b3IuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9oZWxwZXJzLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvbWFwX2ZpZWxkLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvbWVzc2FnZS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL21lc3NhZ2VfZmllbGQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3BhZGRpbmdfb3B0aW1pemVyLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJpbWl0aXZlX2ZpZWxkLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYm9vdHN0cmFwX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2Vfc2l6ZV91bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXRhZGF0YV90ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1vdmVfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvc2VydmljZS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3N0cmluZ19maWVsZC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9kb2NfY29tbWVudC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9lbnVtLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX2VudW1fZmllbGQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfZmllbGRfYmFzZS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9nZW5lcmF0b3IuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfaGVscGVycy5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9tYXBfZmllbGQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfbWVzc2FnZS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9tZXNzYWdlX2ZpZWxkLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX3ByaW1pdGl2ZV9maWVsZC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9yZWZsZWN0aW9uX2NsYXNzLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfcmVwZWF0ZWRfbWVzc2FnZV9maWVsZC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9yZXBlYXRlZF9wcmltaXRpdmVfZmllbGQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfc291cmNlX2dlbmVyYXRvcl9iYXNlLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX3dyYXBwZXJfZmllbGQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNzaGFycF9ib290c3RyYXBfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2NvbnRleHQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvZG9jX2NvbW1lbnQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvZW51bS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9lbnVtX2ZpZWxkLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2VudW1fZmllbGRfbGl0ZS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9lbnVtX2xpdGUuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvZXh0ZW5zaW9uLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2V4dGVuc2lvbl9saXRlLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2ZpZWxkLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2ZpbGUuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvZ2VuZXJhdG9yLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2dlbmVyYXRvcl9mYWN0b3J5LlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2hlbHBlcnMuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikva290bGluX2dlbmVyYXRvci5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tYXBfZmllbGQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvbWFwX2ZpZWxkX2xpdGUuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvbWVzc2FnZS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tZXNzYWdlX2J1aWxkZXIuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvbWVzc2FnZV9idWlsZGVyX2xpdGUuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvbWVzc2FnZV9maWVsZC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tZXNzYWdlX2ZpZWxkX2xpdGUuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvbWVzc2FnZV9saXRlLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL25hbWVfcmVzb2x2ZXIuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvcHJpbWl0aXZlX2ZpZWxkLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3ByaW1pdGl2ZV9maWVsZF9saXRlLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZG9jX2NvbW1lbnRfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3NlcnZpY2UuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvc2hhcmVkX2NvZGVfZ2VuZXJhdG9yLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3N0cmluZ19maWVsZC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9zdHJpbmdfZmllbGRfbGl0ZS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9vYmplY3RpdmVjX2VudW0uUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19lbnVtX2ZpZWxkLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfZXh0ZW5zaW9uLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfZmllbGQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19maWxlLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfZ2VuZXJhdG9yLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfaGVscGVycy5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9vYmplY3RpdmVjX21hcF9maWVsZC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9vYmplY3RpdmVjX21lc3NhZ2UuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19tZXNzYWdlX2ZpZWxkLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfb25lb2YuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19wcmltaXRpdmVfZmllbGQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9waHAvJChERVBESVIpL3BocF9nZW5lcmF0b3IuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLyQoREVQRElSKS9nZW5lcmF0b3IuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLyQoREVQRElSKS9oZWxwZXJzLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vJChERVBESVIpL3B5aV9nZW5lcmF0b3IuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvJChERVBESVIpL3J1YnlfZ2VuZXJhdG9yLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9jb2RlZF9zdHJlYW0uUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL2d6aXBfc3RyZWFtLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9pb193aW4zMi5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJpbnRlci5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jb2RlZF9zdHJlYW1fdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC1pb193aW4zMl91bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByaW50ZXJfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC10b2tlbml6ZXJfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3N0cnRvZC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvdG9rZW5pemVyLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS96ZXJvX2NvcHlfc3RyZWFtLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9ieXRlc3RyZWFtLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9jb21tb24uUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL2ludDEyOC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1ieXRlc3RyZWFtX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29tbW9uX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW50MTI4X3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzX3Rlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdGF0dXNvcl90ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncGllY2VfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJpbmdwcmludGZfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRpbWVfdGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9zdGF0dXMuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3N0YXR1c29yLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9zdHJpbmdwaWVjZS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvc3RyaW5ncHJpbnRmLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9zdHJ1Y3R1cmFsbHlfdmFsaWQuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3N0cnV0aWwuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3N1YnN0aXR1dGUuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3RpbWUuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmlsZS5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWdvb2dsZXRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpbGUuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWdvb2dsZXRlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS90ZXN0X3BsdWdpbi1maWxlLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvemNndW56aXAuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS96Y2d6aXAuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9kZWxpbWl0ZWRfbWVzc2FnZV91dGlsLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL2ZpZWxkX2NvbXBhcmF0b3IuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvZmllbGRfbWFza191dGlsLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL2pzb25fdXRpbC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9tZXNzYWdlX2RpZmZlcmVuY2VyLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0LnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVsaW1pdGVkX21lc3NhZ2VfdXRpbF90ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1maWVsZF9jb21wYXJhdG9yX3Rlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2tfdXRpbF90ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX2Zvcm1hdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX3V0aWxfdGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGltZV91dGlsX3Rlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXR5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvdGltZV91dGlsLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3R5cGVfcmVzb2x2ZXJfdXRpbC5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9kYXRhcGllY2UuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXIuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvZXJyb3JfbGlzdGVuZXIuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvZmllbGRfbWFza191dGlsaXR5LlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL2pzb25fZXNjYXBpbmcuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvanNvbl9vYmplY3R3cml0ZXIuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvanNvbl9zdHJlYW1fcGFyc2VyLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL29iamVjdF93cml0ZXIuUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9fd3JpdGVyLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXJfdGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl9vYmplY3R3cml0ZXJfdGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0LlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdHlwZV9pbmZvX3Rlc3RfaGVscGVyLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlLlBsb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlci5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS90eXBlX2luZm8uUGxvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvdXRpbGl0eS5QbG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtYW55cy5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1ib29rcy5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1maWVsZF9tYXNrLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW1hcHMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3Qtb25lb2ZzLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXByb3RvMy5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1zdHJ1Y3QucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXdyYXBwZXJzLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYW55cy5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWJvb2tzLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpZWxkX21hc2sucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBzLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtb25lb2ZzLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtcHJvdG8zLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtd3JhcHBlcnMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFueXMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWJvb2tzLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2sucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcHMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW9uZW9mcy5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zLnBiLlBvQGFtX19xdW90ZUAgIyBhbS0taW5jbHVkZS1tYXJrZXIKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1Y3QucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5Qb0BhbV9fcXVvdGVAICMgYW0tLWluY2x1ZGUtbWFya2VyCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtd3JhcHBlcnMucGIuUG9AYW1fX3F1b3RlQCAjIGFtLS1pbmNsdWRlLW1hcmtlcgorCiskKGFtX19kZXBmaWxlc19yZW1hZGUpOgorCUAkKE1LRElSX1ApICQoQEQpCisJQGVjaG8gJyMgZHVtbXknID4kQC10ICYmICQoYW1fX212KSAkQC10ICRACisKK2FtLS1kZXBmaWxlczogJChhbV9fZGVwZmlsZXNfcmVtYWRlKQorCisuY2MubzoKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKWRlcGJhc2U9YGVjaG8gJEAgfCBzZWQgJ3N8W14vXSokJHwkKERFUERJUikvJnw7c3xcLm8kJHx8J2A7XAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQ1hYQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQkZGVwYmFzZS5UcG8gLWMgLW8gJEAgJDwgJiZcCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChhbV9fbXYpICQkZGVwYmFzZS5UcG8gJCRkZXBiYXNlLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYQ09NUElMRSkgLWMgLW8gJEAgJDwKKworLmNjLm9iajoKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKWRlcGJhc2U9YGVjaG8gJEAgfCBzZWQgJ3N8W14vXSokJHwkKERFUERJUikvJnw7c3xcLm9iaiQkfHwnYDtcCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChDWFhDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJCRkZXBiYXNlLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgICYmXAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoYW1fX212KSAkJGRlcGJhc2UuVHBvICQkZGVwYmFzZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWENPTVBJTEUpIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLmNjLmxvOgorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpZGVwYmFzZT1gZWNobyAkQCB8IHNlZCAnc3xbXi9dKiQkfCQoREVQRElSKS8mfDtzfFwubG8kJHx8J2A7XAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoTFRDWFhDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJCRkZXBiYXNlLlRwbyAtYyAtbyAkQCAkPCAmJlwKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKGFtX19tdikgJCRkZXBiYXNlLlRwbyAkJGRlcGJhc2UuUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKExUQ1hYQ09NUElMRSkgLWMgLW8gJEAgJDwKKworbm9fd2FybmluZ190ZXN0LW5vX3dhcm5pbmdfdGVzdC5vOiBub193YXJuaW5nX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBub193YXJuaW5nX3Rlc3Qtbm9fd2FybmluZ190ZXN0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1ub193YXJuaW5nX3Rlc3QuVHBvIC1jIC1vIG5vX3dhcm5pbmdfdGVzdC1ub193YXJuaW5nX3Rlc3QubyBgdGVzdCAtZiAnbm9fd2FybmluZ190ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bub193YXJuaW5nX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9ub193YXJuaW5nX3Rlc3Qtbm9fd2FybmluZ190ZXN0LlRwbyAkKERFUERJUikvbm9fd2FybmluZ190ZXN0LW5vX3dhcm5pbmdfdGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nbm9fd2FybmluZ190ZXN0LmNjJyBvYmplY3Q9J25vX3dhcm5pbmdfdGVzdC1ub193YXJuaW5nX3Rlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG5vX3dhcm5pbmdfdGVzdC1ub193YXJuaW5nX3Rlc3QubyBgdGVzdCAtZiAnbm9fd2FybmluZ190ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bub193YXJuaW5nX3Rlc3QuY2MKKworbm9fd2FybmluZ190ZXN0LW5vX3dhcm5pbmdfdGVzdC5vYmo6IG5vX3dhcm5pbmdfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIG5vX3dhcm5pbmdfdGVzdC1ub193YXJuaW5nX3Rlc3Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9ub193YXJuaW5nX3Rlc3Qtbm9fd2FybmluZ190ZXN0LlRwbyAtYyAtbyBub193YXJuaW5nX3Rlc3Qtbm9fd2FybmluZ190ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnbm9fd2FybmluZ190ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ25vX3dhcm5pbmdfdGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvbm9fd2FybmluZ190ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbm9fd2FybmluZ190ZXN0LW5vX3dhcm5pbmdfdGVzdC5UcG8gJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1ub193YXJuaW5nX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J25vX3dhcm5pbmdfdGVzdC5jYycgb2JqZWN0PSdub193YXJuaW5nX3Rlc3Qtbm9fd2FybmluZ190ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIG5vX3dhcm5pbmdfdGVzdC1ub193YXJuaW5nX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdub193YXJuaW5nX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbm9fd2FybmluZ190ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ub193YXJuaW5nX3Rlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vOiBnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYworCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9saXRlLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9saXRlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9saXRlLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9saXRlLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1hbnlfdGVzdC5wYi5vOiBnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LWFueV90ZXN0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtYW55X3Rlc3QucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtYW55X3Rlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWFueV90ZXN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1hbnlfdGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtYW55X3Rlc3QucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtYW55X3Rlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1hbnlfdGVzdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtYW55X3Rlc3QucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWFueV90ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LWFueV90ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1hbnlfdGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtYW55X3Rlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LWFueV90ZXN0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtYW55X3Rlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ub193YXJuaW5nX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbm9fd2FybmluZ190ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL25vX3dhcm5pbmdfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL25vX3dhcm5pbmdfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ub193YXJuaW5nX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL25vX3dhcm5pbmdfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL25vX3dhcm5pbmdfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL25vX3dhcm5pbmdfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ub193YXJuaW5nX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ub193YXJuaW5nX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ub193YXJuaW5nX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLm86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ub193YXJuaW5nX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ub193YXJuaW5nX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ub193YXJuaW5nX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL25vX3dhcm5pbmdfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbm9fd2FybmluZ190ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ub193YXJuaW5nX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL25vX3dhcm5pbmdfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbm9fd2FybmluZ190ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL25vX3dhcm5pbmdfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfdW5pdHRlc3QucGIubzogZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LW1hcF91bml0dGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tYXBfdW5pdHRlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW1hcF91bml0dGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LW1hcF91bml0dGVzdC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYworCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LW1hcF91bml0dGVzdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LW1hcF91bml0dGVzdC5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LW1hcF91bml0dGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tYXBfdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfdW5pdHRlc3QucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC1tYXBfdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdC5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3QucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3QucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3QucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYworCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnQucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnQucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYworCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnQucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X21zZXQucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X21zZXQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X21zZXQucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X21zZXQucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X21zZXQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYworCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5jYworCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzMucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5jYworCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5jYworCitnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWFueXMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1hbnlzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1hbnlzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtYW55cy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9hbnlzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9hbnlzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWFueXMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtYW55cy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtYW55cy5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWFueXMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtYW55cy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtYW55cy5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1hbnlzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtYW55cy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1hbnlzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWFueXMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWFueXMucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWFueXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9hbnlzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWJvb2tzLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWJvb2tzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1ib29rcy5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWJvb2tzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1ib29rcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1ib29rcy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWJvb2tzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtYm9va3MucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1ib29rcy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWJvb2tzLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWJvb2tzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtYm9va3MucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtYm9va3MucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtYm9va3MucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1ib29rcy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtYm9va3MucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWUucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWZpZWxkX21hc2sucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1maWVsZF9tYXNrLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1maWVsZF9tYXNrLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtZmllbGRfbWFzay5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWZpZWxkX21hc2sucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtZmllbGRfbWFzay5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtZmllbGRfbWFzay5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWZpZWxkX21hc2sucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtZmllbGRfbWFzay5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtZmllbGRfbWFzay5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1maWVsZF9tYXNrLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtZmllbGRfbWFzay5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1maWVsZF9tYXNrLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWZpZWxkX21hc2sucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWZpZWxkX21hc2sucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LWZpZWxkX21hc2sucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LW1hcHMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1tYXBzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tYXBzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtbWFwcy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW1hcHMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwcy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtbWFwcy5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LW1hcHMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtbWFwcy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtbWFwcy5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tYXBzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtbWFwcy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tYXBzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW1hcHMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LW1hcHMucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LW1hcHMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LW9uZW9mcy5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9vbmVvZnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3Qtb25lb2ZzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1vbmVvZnMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1vbmVvZnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9vbmVvZnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3Qtb25lb2ZzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW9uZW9mcy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1vbmVvZnMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1vbmVvZnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9vbmVvZnMucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LW9uZW9mcy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1vbmVvZnMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3Qtb25lb2ZzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3Qtb25lb2ZzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW9uZW9mcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1vbmVvZnMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3Qtb25lb2ZzLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1vbmVvZnMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9vbmVvZnMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9vbmVvZnMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LXByb3RvMy5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtcHJvdG8zLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1wcm90bzMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1wcm90bzMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtcHJvdG8zLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXByb3RvMy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1wcm90bzMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1wcm90bzMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LXByb3RvMy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1wcm90bzMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtcHJvdG8zLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtcHJvdG8zLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXByb3RvMy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1wcm90bzMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtcHJvdG8zLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1wcm90bzMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LXN0cnVjdC5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3Qtc3RydWN0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1zdHJ1Y3QucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1zdHJ1Y3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3Qtc3RydWN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXN0cnVjdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1zdHJ1Y3QucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1zdHJ1Y3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LXN0cnVjdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1zdHJ1Y3QucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3Qtc3RydWN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3Qtc3RydWN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXN0cnVjdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1zdHJ1Y3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3Qtc3RydWN0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC1zdHJ1Y3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS90aW1lc3RhbXBfZHVyYXRpb24ucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS90aW1lc3RhbXBfZHVyYXRpb24ucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS90aW1lc3RhbXBfZHVyYXRpb24ucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS90aW1lc3RhbXBfZHVyYXRpb24ucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS90aW1lc3RhbXBfZHVyYXRpb24ucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LXdyYXBwZXJzLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LXdyYXBwZXJzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC13cmFwcGVycy5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LXdyYXBwZXJzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS93cmFwcGVycy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC13cmFwcGVycy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC13cmFwcGVycy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LXdyYXBwZXJzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3Qtd3JhcHBlcnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC13cmFwcGVycy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbm9fd2FybmluZ190ZXN0LXdyYXBwZXJzLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXdyYXBwZXJzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3Qtd3JhcHBlcnMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS93cmFwcGVycy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS93cmFwcGVycy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3Qtd3JhcHBlcnMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3Qtd3JhcHBlcnMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL25vX3dhcm5pbmdfdGVzdC13cmFwcGVycy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ub193YXJuaW5nX3Rlc3Qtd3JhcHBlcnMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS93cmFwcGVycy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS93cmFwcGVycy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbm9fd2FybmluZ190ZXN0LWpzb25fZm9ybWF0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbm9fd2FybmluZ190ZXN0LWpzb25fZm9ybWF0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbm9fd2FybmluZ190ZXN0LWpzb25fZm9ybWF0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbm9fd2FybmluZ190ZXN0LWpzb25fZm9ybWF0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9ub193YXJuaW5nX3Rlc3QtanNvbl9mb3JtYXQucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbm9fd2FybmluZ190ZXN0LWpzb25fZm9ybWF0LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWpzb25fZm9ybWF0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9ub193YXJuaW5nX3Rlc3QtanNvbl9mb3JtYXQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtanNvbl9mb3JtYXQucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtanNvbl9mb3JtYXQucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobm9fd2FybmluZ190ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9ub193YXJuaW5nX3Rlc3QtanNvbl9mb3JtYXQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbm9fd2FybmluZ190ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9ub193YXJuaW5nX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbm9fd2FybmluZ190ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9ub193YXJuaW5nX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9ub193YXJuaW5nX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL25vX3dhcm5pbmdfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbm9fd2FybmluZ190ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL25vX3dhcm5pbmdfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9ub193YXJuaW5nX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9ub193YXJuaW5nX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbm9fd2FybmluZ190ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9ub193YXJuaW5nX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChub193YXJuaW5nX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9ub193YXJuaW5nX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9ub193YXJuaW5nX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbm9fd2FybmluZ190ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG5vX3dhcm5pbmdfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbm9fd2FybmluZ190ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hcmVuYV90ZXN0X3V0aWwubzogZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hcmVuYV90ZXN0X3V0aWwubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm9iajogZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hcmVuYV90ZXN0X3V0aWwuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hcmVuYV90ZXN0X3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLm86IGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbF9saXRlLm86IGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbF9saXRlLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWxfbGl0ZS5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbF9saXRlLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbF9saXRlLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbF9saXRlLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbF9saXRlLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWxfbGl0ZS5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsX2xpdGUub2JqOiBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWxfbGl0ZS5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWxfbGl0ZS5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbF9saXRlLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbF9saXRlLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbF9saXRlLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbF9saXRlLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbF9saXRlLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5vOiBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtcmVmbGVjdGlvbl90ZXN0ZXIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fdGVzdGVyLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtcmVmbGVjdGlvbl90ZXN0ZXIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fdGVzdGVyLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXJlZmxlY3Rpb25fdGVzdGVyLm9iajogZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fdGVzdGVyLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtcmVmbGVjdGlvbl90ZXN0ZXIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtcmVmbGVjdGlvbl90ZXN0ZXIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fdGVzdGVyLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsLm86IGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbC5vYmo6IGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF91dGlsLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfdXRpbC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmlsZS5vOiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWxlLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpbGUuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpbGUubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpbGUuVHBvIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWxlLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpbGUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmlsZS5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCisKK2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpbGUub2JqOiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWxlLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmlsZS5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmlsZS5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpbGUuVHBvIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWxlLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpbGUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWxlLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWdvb2dsZXRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZ29vZ2xldGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZ29vZ2xldGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWdvb2dsZXRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZ29vZ2xldGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWdvb2dsZXRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWdvb2dsZXRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZ29vZ2xldGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZ29vZ2xldGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIubzogZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueV90ZXN0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueV90ZXN0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hbnlfdGVzdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueV90ZXN0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueV90ZXN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueV90ZXN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueV90ZXN0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hbnlfdGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYW55X3Rlc3QucGIub2JqOiBnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hbnlfdGVzdC5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hbnlfdGVzdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueV90ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueV90ZXN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueV90ZXN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueV90ZXN0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueV90ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5jYworCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIubzogZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIub2JqOiBnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfdW5pdHRlc3QucGIubzogZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF91bml0dGVzdC5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF91bml0dGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF91bml0dGVzdC5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfdW5pdHRlc3QucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF91bml0dGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcF91bml0dGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXQucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXQucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXQucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueXMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYW55cy5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hbnlzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hbnlzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hbnlzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYW55cy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hbnlzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueXMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hbnlzLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYW55cy5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueXMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9hbnlzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hbnlzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYW55cy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hbnlzLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYW55cy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1ib29rcy5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYm9va3MucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYm9va3MucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWJvb2tzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWJvb2tzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYm9va3MucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWJvb2tzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWJvb2tzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1ib29rcy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1ib29rcy5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWJvb2tzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1ib29rcy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWJvb2tzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYm9va3MucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWJvb2tzLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYm9va3MucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWUucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWVsZF9tYXNrLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpZWxkX21hc2sucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmllbGRfbWFzay5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmllbGRfbWFzay5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmllbGRfbWFzay5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpZWxkX21hc2sucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmllbGRfbWFzay5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWVsZF9tYXNrLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmllbGRfbWFzay5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpZWxkX21hc2sucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWVsZF9tYXNrLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWVsZF9tYXNrLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmllbGRfbWFzay5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpZWxkX21hc2sucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZmllbGRfbWFzay5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWZpZWxkX21hc2sucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwcy5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcHMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcHMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcHMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcHMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwcy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcHMucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBzLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwcy5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwcy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcHMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1hcHMucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW9uZW9mcy5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9vbmVvZnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW9uZW9mcy5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1vbmVvZnMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW9uZW9mcy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9vbmVvZnMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW9uZW9mcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW9uZW9mcy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW9uZW9mcy5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1vbmVvZnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9vbmVvZnMucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtb25lb2ZzLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1vbmVvZnMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1vbmVvZnMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW9uZW9mcy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9vbmVvZnMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW9uZW9mcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW9uZW9mcy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW9uZW9mcy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW9uZW9mcy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9vbmVvZnMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1wcm90bzMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1wcm90bzMucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtcHJvdG8zLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1wcm90bzMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1wcm90bzMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1wcm90bzMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1wcm90bzMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtcHJvdG8zLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXByb3RvMy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtcHJvdG8zLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtcHJvdG8zLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1wcm90bzMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1wcm90bzMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1wcm90bzMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1wcm90bzMucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1wcm90bzMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXN0cnVjdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXN0cnVjdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1zdHJ1Y3QucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXN0cnVjdC5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXN0cnVjdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS90aW1lc3RhbXBfZHVyYXRpb24ucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS90aW1lc3RhbXBfZHVyYXRpb24ucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS90aW1lc3RhbXBfZHVyYXRpb24ucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS90aW1lc3RhbXBfZHVyYXRpb24ucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS90aW1lc3RhbXBfZHVyYXRpb24ucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC13cmFwcGVycy5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS93cmFwcGVycy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtd3JhcHBlcnMucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtd3JhcHBlcnMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXdyYXBwZXJzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS93cmFwcGVycy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXdyYXBwZXJzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtd3JhcHBlcnMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXdyYXBwZXJzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXdyYXBwZXJzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS93cmFwcGVycy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC13cmFwcGVycy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC13cmFwcGVycy5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXdyYXBwZXJzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC13cmFwcGVycy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS93cmFwcGVycy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXdyYXBwZXJzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtd3JhcHBlcnMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXdyYXBwZXJzLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtd3JhcHBlcnMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS93cmFwcGVycy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS93cmFwcGVycy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtanNvbl9mb3JtYXQucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1qc29uX2Zvcm1hdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1qc29uX2Zvcm1hdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1qc29uX2Zvcm1hdC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1qc29uX2Zvcm1hdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtanNvbl9mb3JtYXQucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtanNvbl9mb3JtYXQucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1qc29uX2Zvcm1hdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtanNvbl9mb3JtYXQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1qc29uX2Zvcm1hdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1qc29uX2Zvcm1hdC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1saXRlX2FyZW5hX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9saXRlX2FyZW5hX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbGl0ZV9hcmVuYV91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWxpdGVfYXJlbmFfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbGl0ZV9hcmVuYV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbGl0ZV9hcmVuYV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2xpdGVfYXJlbmFfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWxpdGVfYXJlbmFfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWxpdGVfYXJlbmFfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9saXRlX2FyZW5hX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbGl0ZV9hcmVuYV91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbGl0ZV9hcmVuYV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbGl0ZV9hcmVuYV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2xpdGVfYXJlbmFfdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1saXRlX2FyZW5hX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2xpdGVfYXJlbmFfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1saXRlX2FyZW5hX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1saXRlX2FyZW5hX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWxpdGVfYXJlbmFfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbGl0ZV9hcmVuYV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbGl0ZV9hcmVuYV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2xpdGVfYXJlbmFfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWxpdGVfYXJlbmFfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWxpdGVfYXJlbmFfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9saXRlX2FyZW5hX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbGl0ZV9hcmVuYV91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1saXRlX2FyZW5hX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2xpdGVfYXJlbmFfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2xpdGVfYXJlbmFfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9saXRlX2FyZW5hX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm86IGdvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1hcmVuYV90ZXN0X3V0aWwubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1hcmVuYV90ZXN0X3V0aWwuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1hcmVuYV90ZXN0X3V0aWwubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1hcmVuYV90ZXN0X3V0aWwub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1hcmVuYV90ZXN0X3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vOiBnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwub2JqOiBnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC10ZXN0X3V0aWxfbGl0ZS5vOiBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC10ZXN0X3V0aWxfbGl0ZS5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXRlc3RfdXRpbF9saXRlLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXRlc3RfdXRpbF9saXRlLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC10ZXN0X3V0aWxfbGl0ZS5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdGVzdF91dGlsX2xpdGUuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXRlc3RfdXRpbF9saXRlLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC10ZXN0X3V0aWxfbGl0ZS5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXRlc3RfdXRpbF9saXRlLm9iajogZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdGVzdF91dGlsX2xpdGUub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXRlc3RfdXRpbF9saXRlLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXRlc3RfdXRpbF9saXRlLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC10ZXN0X3V0aWxfbGl0ZS5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdGVzdF91dGlsX2xpdGUuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXRlc3RfdXRpbF9saXRlLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXRlc3RfdXRpbF9saXRlLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIubzogZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LWxpdGVfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2xpdGVfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1saXRlX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1saXRlX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2xpdGVfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1saXRlX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1saXRlX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LWxpdGVfdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LWxpdGVfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LWxpdGVfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbGl0ZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2xpdGVfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1saXRlX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LWxpdGVfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2xpdGVfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1hcmVuYV90ZXN0X3V0aWwubzogZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1hcmVuYV90ZXN0X3V0aWwubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC1hcmVuYV90ZXN0X3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1hcmVuYV90ZXN0X3V0aWwubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm9iajogZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC1hcmVuYV90ZXN0X3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1hcmVuYV90ZXN0X3V0aWwub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLm86IGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LXRlc3RfdXRpbF9saXRlLm86IGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LXRlc3RfdXRpbF9saXRlLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXRlc3RfdXRpbF9saXRlLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC10ZXN0X3V0aWxfbGl0ZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LXRlc3RfdXRpbF9saXRlLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUub2JqOiBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC10ZXN0X3V0aWxfbGl0ZS5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXRlc3RfdXRpbF9saXRlLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC10ZXN0X3V0aWxfbGl0ZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdGVzdF91dGlsX2xpdGUub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vOiBnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9saXRlLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9saXRlLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl9saXRlX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9saXRlLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfbGl0ZV90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX2xpdGVfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5vOiBnb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYV90ZXN0X3V0aWwuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYV90ZXN0X3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYV90ZXN0X3V0aWwubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYV90ZXN0X3V0aWwub2JqOiBnb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYV90ZXN0X3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYV90ZXN0X3V0aWwuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYV90ZXN0X3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdGVzdF91dGlsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwubzogZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLm9iajogZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfbGl0ZV90ZXN0X3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsX2xpdGUubzogZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsX2xpdGUubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsX2xpdGUuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbF9saXRlLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsX2xpdGUuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWxfbGl0ZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbF9saXRlLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWxfbGl0ZS5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWxfbGl0ZS5vYmo6IGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbF9saXRlLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsX2xpdGUuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbF9saXRlLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsX2xpdGUuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWxfbGl0ZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbF9saXRlLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbF9saXRlLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fdGVzdGVyLm86IGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fdGVzdGVyLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fdGVzdGVyLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fdGVzdGVyLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl90ZXN0ZXIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl90ZXN0ZXIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fdGVzdGVyLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl90ZXN0ZXIub2JqOiBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fdGVzdGVyLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fdGVzdGVyLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl90ZXN0ZXIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1yZWZsZWN0aW9uX3Rlc3Rlci5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWwubzogZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWwuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsLm9iajogZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXRlc3RfdXRpbC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfdGVzdC1maWxlLm86IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl90ZXN0LWZpbGUubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1maWxlLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl90ZXN0LWZpbGUubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZmlsZS5UcG8gZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZmlsZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl90ZXN0LWZpbGUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX3Rlc3QtZmlsZS5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCisKK2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX3Rlc3QtZmlsZS5vYmo6IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl90ZXN0LWZpbGUub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpbGUuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX3Rlc3QtZmlsZS5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZmlsZS5UcG8gZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZmlsZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl90ZXN0LWZpbGUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfdGVzdC1maWxlLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX3Rlc3QtZ29vZ2xldGVzdC5vOiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ29vZ2xldGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWdvb2dsZXRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWdvb2dsZXRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl90ZXN0LWdvb2dsZXRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl90ZXN0LWdvb2dsZXRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9wcm90b2J1Zl90ZXN0LWdvb2dsZXRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWdvb2dsZXRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWdvb2dsZXRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvcHJvdG9idWZfdGVzdC1nb29nbGV0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Byb3RvYnVmX3Rlc3QtZ29vZ2xldGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC5vOiBnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFueV90ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFueV90ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFueV90ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvYW55X3Rlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFueV90ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvYW55X3Rlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFyZW5hX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFyZW5hX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvYXJlbmFfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9hcmVuYV91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYV91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9hcmVuYV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFyZW5hX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFyZW5hX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYXJlbmFfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFyZW5hX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFyZW5hX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFyZW5hc3RyaW5nX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZ191bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFyZW5hc3RyaW5nX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFyZW5hc3RyaW5nX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYXN0cmluZ191bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmdfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZ191bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFyZW5hc3RyaW5nX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYXJlbmFzdHJpbmdfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZ191bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYXN0cmluZ191bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYXJlbmFzdHJpbmdfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmdfdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYXJlbmFzdHJpbmdfdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmdfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYXN0cmluZ191bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFyZW5hc3RyaW5nX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYXN0cmluZ191bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZ191bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmdfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZ191bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFyZW5hc3RyaW5nX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYXJlbmFzdHJpbmdfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZ191bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYXN0cmluZ191bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYXN0cmluZ191bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZ191bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmdfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZ191bml0dGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYXpfc2FtcGxlcl90ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9hcmVuYXpfc2FtcGxlcl90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYXJlbmF6X3NhbXBsZXJfdGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYXpfc2FtcGxlcl90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYXpfc2FtcGxlcl90ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYXpfc2FtcGxlcl90ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvYXJlbmF6X3NhbXBsZXJfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFyZW5hel9zYW1wbGVyX3Rlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYXpfc2FtcGxlcl90ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvYXJlbmF6X3NhbXBsZXJfdGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYXpfc2FtcGxlcl90ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYXpfc2FtcGxlcl90ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYXpfc2FtcGxlcl90ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvYXJlbmF6X3NhbXBsZXJfdGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYXpfc2FtcGxlcl90ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2FyZW5hel9zYW1wbGVyX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYXpfc2FtcGxlcl90ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYXJlbmF6X3NhbXBsZXJfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYXJlbmF6X3NhbXBsZXJfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYXpfc2FtcGxlcl90ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9hcmVuYXpfc2FtcGxlcl90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvYXJlbmF6X3NhbXBsZXJfdGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFyZW5hel9zYW1wbGVyX3Rlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYXpfc2FtcGxlcl90ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvYXJlbmF6X3NhbXBsZXJfdGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hcmVuYXpfc2FtcGxlcl90ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFyZW5hel9zYW1wbGVyX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvYXJlbmF6X3NhbXBsZXJfdGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvYXJlbmF6X3NhbXBsZXJfdGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hel9zYW1wbGVyX3Rlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Byb3RvYnVmX3Rlc3QtYW5ub3RhdGlvbl90ZXN0X3V0aWwubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2Fubm90YXRpb25fdGVzdF91dGlsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Byb3RvYnVmX3Rlc3QtYW5ub3RhdGlvbl90ZXN0X3V0aWwubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYW5ub3RhdGlvbl90ZXN0X3V0aWwuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWFubm90YXRpb25fdGVzdF91dGlsLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9hbm5vdGF0aW9uX3Rlc3RfdXRpbC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2Fubm90YXRpb25fdGVzdF91dGlsLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYW5ub3RhdGlvbl90ZXN0X3V0aWwuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbm5vdGF0aW9uX3Rlc3RfdXRpbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2Fubm90YXRpb25fdGVzdF91dGlsLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWFubm90YXRpb25fdGVzdF91dGlsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1hbm5vdGF0aW9uX3Rlc3RfdXRpbC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvYW5ub3RhdGlvbl90ZXN0X3V0aWwuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9hbm5vdGF0aW9uX3Rlc3RfdXRpbC5jYworCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1hbm5vdGF0aW9uX3Rlc3RfdXRpbC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9hbm5vdGF0aW9uX3Rlc3RfdXRpbC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWFubm90YXRpb25fdGVzdF91dGlsLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYW5ub3RhdGlvbl90ZXN0X3V0aWwuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWFubm90YXRpb25fdGVzdF91dGlsLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2Fubm90YXRpb25fdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9hbm5vdGF0aW9uX3Rlc3RfdXRpbC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2Fubm90YXRpb25fdGVzdF91dGlsLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYW5ub3RhdGlvbl90ZXN0X3V0aWwuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbm5vdGF0aW9uX3Rlc3RfdXRpbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2Fubm90YXRpb25fdGVzdF91dGlsLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWFubm90YXRpb25fdGVzdF91dGlsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWFubm90YXRpb25fdGVzdF91dGlsLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2Fubm90YXRpb25fdGVzdF91dGlsLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9hbm5vdGF0aW9uX3Rlc3RfdXRpbC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2Fubm90YXRpb25fdGVzdF91dGlsLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Byb3RvYnVmX3Rlc3QtY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtYm9vdHN0cmFwX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvYm9vdHN0cmFwX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LWJvb3RzdHJhcF91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYm9vdHN0cmFwX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtYm9vdHN0cmFwX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvYm9vdHN0cmFwX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2Jvb3RzdHJhcF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1ib290c3RyYXBfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYm9vdHN0cmFwX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2Jvb3RzdHJhcF91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtYm9vdHN0cmFwX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtYm9vdHN0cmFwX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvYm9vdHN0cmFwX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2Jvb3RzdHJhcF91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtYm9vdHN0cmFwX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ib290c3RyYXBfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtYm9vdHN0cmFwX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWJvb3RzdHJhcF91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LWJvb3RzdHJhcF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvYm9vdHN0cmFwX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvYm9vdHN0cmFwX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2Jvb3RzdHJhcF91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1ib290c3RyYXBfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYm9vdHN0cmFwX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2Jvb3RzdHJhcF91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtYm9vdHN0cmFwX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC1ib290c3RyYXBfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2Jvb3RzdHJhcF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2Jvb3RzdHJhcF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ib290c3RyYXBfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2Vfc2l6ZV91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2Vfc2l6ZV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC1tZXNzYWdlX3NpemVfdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2Vfc2l6ZV91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2Vfc2l6ZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2Vfc2l6ZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlX3NpemVfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9zaXplX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2Vfc2l6ZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlX3NpemVfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2Vfc2l6ZV91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2Vfc2l6ZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2Vfc2l6ZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlX3NpemVfdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2Vfc2l6ZV91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9zaXplX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2Vfc2l6ZV91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX3NpemVfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC1tZXNzYWdlX3NpemVfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2Vfc2l6ZV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2Vfc2l6ZV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlX3NpemVfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9zaXplX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2Vfc2l6ZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlX3NpemVfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2Vfc2l6ZV91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9zaXplX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlX3NpemVfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlX3NpemVfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9zaXplX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC1tZXRhZGF0YV90ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWV0YWRhdGFfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC1tZXRhZGF0YV90ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXRhZGF0YV90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtbWV0YWRhdGFfdGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21ldGFkYXRhX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWV0YWRhdGFfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXRhZGF0YV90ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1ldGFkYXRhX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWV0YWRhdGFfdGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtbWV0YWRhdGFfdGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1ldGFkYXRhX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXRhZGF0YV90ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21ldGFkYXRhX3Rlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1ldGFkYXRhX3Rlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21ldGFkYXRhX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtbWV0YWRhdGFfdGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXRhZGF0YV90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtbWV0YWRhdGFfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWV0YWRhdGFfdGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21ldGFkYXRhX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWV0YWRhdGFfdGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXRhZGF0YV90ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1ldGFkYXRhX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWV0YWRhdGFfdGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtbWV0YWRhdGFfdGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtbWV0YWRhdGFfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWV0YWRhdGFfdGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21ldGFkYXRhX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWV0YWRhdGFfdGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtbW92ZV91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21vdmVfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtbW92ZV91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbW92ZV91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1vdmVfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tb3ZlX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21vdmVfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbW92ZV91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tb3ZlX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21vdmVfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1vdmVfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC1tb3ZlX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbW92ZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tb3ZlX3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC1tb3ZlX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tb3ZlX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1vdmVfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbW92ZV91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1vdmVfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21vdmVfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tb3ZlX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21vdmVfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbW92ZV91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tb3ZlX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21vdmVfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1vdmVfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LW1vdmVfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21vdmVfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tb3ZlX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21vdmVfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3BsdWdpbl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3BsdWdpbl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wbHVnaW5fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wbHVnaW5fdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3BsdWdpbl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wbHVnaW5fdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGx1Z2luX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3BsdWdpbl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3BsdWdpbl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wbHVnaW5fdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wbHVnaW5fdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wbHVnaW5fdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wbHVnaW5fdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGx1Z2luX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC11bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC11bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2Jvb3RzdHJhcF91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9ib290c3RyYXBfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2Jvb3RzdHJhcF91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2Jvb3RzdHJhcF91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9wcm90b2J1Zl90ZXN0LWNzaGFycF9ib290c3RyYXBfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9ib290c3RyYXBfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2Jvb3RzdHJhcF91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jc2hhcnBfYm9vdHN0cmFwX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9ib290c3RyYXBfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9wcm90b2J1Zl90ZXN0LWNzaGFycF9ib290c3RyYXBfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvcHJvdG9idWZfdGVzdC1jc2hhcnBfYm9vdHN0cmFwX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2Jvb3RzdHJhcF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvcHJvdG9idWZfdGVzdC1jc2hhcnBfYm9vdHN0cmFwX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9wcm90b2J1Zl90ZXN0LWNzaGFycF9ib290c3RyYXBfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2Jvb3RzdHJhcF91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9wcm90b2J1Zl90ZXN0LWNzaGFycF9ib290c3RyYXBfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9ib290c3RyYXBfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9ib290c3RyYXBfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2Jvb3RzdHJhcF91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jc2hhcnBfYm9vdHN0cmFwX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9ib290c3RyYXBfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9wcm90b2J1Zl90ZXN0LWNzaGFycF9ib290c3RyYXBfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9wcm90b2J1Zl90ZXN0LWNzaGFycF9ib290c3RyYXBfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9ib290c3RyYXBfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9ib290c3RyYXBfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9wcm90b2J1Zl90ZXN0LWNzaGFycF9nZW5lcmF0b3JfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9wcm90b2J1Zl90ZXN0LWNzaGFycF9nZW5lcmF0b3JfdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNzaGFycF9nZW5lcmF0b3JfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvcHJvdG9idWZfdGVzdC1jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNzaGFycF9nZW5lcmF0b3JfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvcHJvdG9idWZfdGVzdC1jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9nZW5lcmF0b3JfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvcHJvdG9idWZfdGVzdC1jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNzaGFycF9nZW5lcmF0b3JfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvcHJvdG9idWZfdGVzdC1jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNzaGFycF9nZW5lcmF0b3JfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvcHJvdG9idWZfdGVzdC1jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvcHJvdG9idWZfdGVzdC1jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWltcG9ydGVyX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LWltcG9ydGVyX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWltcG9ydGVyX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1pbXBvcnRlcl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWltcG9ydGVyX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW1wb3J0ZXJfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1pbXBvcnRlcl91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Byb3RvYnVmX3Rlc3QtaW1wb3J0ZXJfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Byb3RvYnVmX3Rlc3QtaW1wb3J0ZXJfdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1pbXBvcnRlcl91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWltcG9ydGVyX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1pbXBvcnRlcl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWltcG9ydGVyX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW1wb3J0ZXJfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1pbXBvcnRlcl91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1pbXBvcnRlcl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcm90b2J1Zl90ZXN0LWRvY19jb21tZW50X3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50X3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJvdG9idWZfdGVzdC1kb2NfY29tbWVudF91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRvY19jb21tZW50X3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcm90b2J1Zl90ZXN0LWRvY19jb21tZW50X3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50X3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZG9jX2NvbW1lbnRfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRvY19jb21tZW50X3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudF91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcm90b2J1Zl90ZXN0LWRvY19jb21tZW50X3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcm90b2J1Zl90ZXN0LWRvY19jb21tZW50X3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50X3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudF91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcm90b2J1Zl90ZXN0LWRvY19jb21tZW50X3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcm90b2J1Zl90ZXN0LWRvY19jb21tZW50X3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kb2NfY29tbWVudF91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJvdG9idWZfdGVzdC1kb2NfY29tbWVudF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50X3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50X3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudF91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZG9jX2NvbW1lbnRfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRvY19jb21tZW50X3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudF91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcm90b2J1Zl90ZXN0LWRvY19jb21tZW50X3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3Byb3RvYnVmX3Rlc3QtZG9jX2NvbW1lbnRfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcGx1Z2luX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3BsdWdpbl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcGx1Z2luX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcGx1Z2luX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wbHVnaW5fdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3BsdWdpbl91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3BsdWdpbl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcGx1Z2luX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3BsdWdpbl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcGx1Z2luX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcGx1Z2luX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcGx1Z2luX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3BsdWdpbl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcGx1Z2luX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3IubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1tb2NrX2NvZGVfZ2VuZXJhdG9yLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3IuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3IubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbW9ja19jb2RlX2dlbmVyYXRvci5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3IuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3IubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3IubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3Iub2JqOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3Iub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tb2NrX2NvZGVfZ2VuZXJhdG9yLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1tb2NrX2NvZGVfZ2VuZXJhdG9yLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbW9ja19jb2RlX2dlbmVyYXRvci5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3IuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3Iub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Byb3RvYnVmX3Rlc3QtbW9ja19jb2RlX2dlbmVyYXRvci5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9wcm90b2J1Zl90ZXN0LW9iamVjdGl2ZWNfaGVscGVyc191bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9wcm90b2J1Zl90ZXN0LW9iamVjdGl2ZWNfaGVscGVyc191bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW9iamVjdGl2ZWNfaGVscGVyc191bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvcHJvdG9idWZfdGVzdC1vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW9iamVjdGl2ZWNfaGVscGVyc191bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtb2JqZWN0aXZlY19oZWxwZXJzX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvcHJvdG9idWZfdGVzdC1vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL3Byb3RvYnVmX3Rlc3Qtb2JqZWN0aXZlY19oZWxwZXJzX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVyc191bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzX3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL3Byb3RvYnVmX3Rlc3Qtb2JqZWN0aXZlY19oZWxwZXJzX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvcHJvdG9idWZfdGVzdC1vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW9iamVjdGl2ZWNfaGVscGVyc191bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvcHJvdG9idWZfdGVzdC1vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW9iamVjdGl2ZWNfaGVscGVyc191bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtb2JqZWN0aXZlY19oZWxwZXJzX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvcHJvdG9idWZfdGVzdC1vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvcHJvdG9idWZfdGVzdC1vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Byb3RvYnVmX3Rlc3QtcGFyc2VyX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXJfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1wYXJzZXJfdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcGFyc2VyX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1wYXJzZXJfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1wYXJzZXJfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXJfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1wYXJzZXJfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wYXJzZXJfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXJfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHJvdG9idWZfdGVzdC1wYXJzZXJfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Byb3RvYnVmX3Rlc3QtcGFyc2VyX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9wbHVnaW5fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9wbHVnaW5fdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcGx1Z2luX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcGx1Z2luX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9wbHVnaW5fdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcGx1Z2luX3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3BsdWdpbl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3Byb3RvYnVmX3Rlc3QtcGx1Z2luX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9wbHVnaW5fdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9wbHVnaW5fdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcGx1Z2luX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcGx1Z2luX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcGx1Z2luX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcGx1Z2luX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3BsdWdpbl91bml0dGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9wcm90b2J1Zl90ZXN0LXJ1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcHJvdG9idWZfdGVzdC1ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5LyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJ1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9wcm90b2J1Zl90ZXN0LXJ1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcnVieV9nZW5lcmF0b3JfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5LyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJ1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9wcm90b2J1Zl90ZXN0LXJ1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9wcm90b2J1Zl90ZXN0LXJ1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9wcm90b2J1Zl90ZXN0LXJ1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3JfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9wcm90b2J1Zl90ZXN0LXJ1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcHJvdG9idWZfdGVzdC1ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcnVieV9nZW5lcmF0b3JfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5LyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJ1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9wcm90b2J1Zl90ZXN0LXJ1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3Byb3RvYnVmX3Rlc3QtcnVieV9nZW5lcmF0b3JfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3JfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1kZXNjcmlwdG9yX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRlc2NyaXB0b3JfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1kcm9wX3Vua25vd25fZmllbGRzX3Rlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2Ryb3BfdW5rbm93bl9maWVsZHNfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRyb3BfdW5rbm93bl9maWVsZHNfdGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kcm9wX3Vua25vd25fZmllbGRzX3Rlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRyb3BfdW5rbm93bl9maWVsZHNfdGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRyb3BfdW5rbm93bl9maWVsZHNfdGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZHJvcF91bmtub3duX2ZpZWxkc190ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9kcm9wX3Vua25vd25fZmllbGRzX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9kcm9wX3Vua25vd25fZmllbGRzX3Rlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZHJvcF91bmtub3duX2ZpZWxkc190ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2Ryb3BfdW5rbm93bl9maWVsZHNfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRyb3BfdW5rbm93bl9maWVsZHNfdGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRyb3BfdW5rbm93bl9maWVsZHNfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZHJvcF91bmtub3duX2ZpZWxkc190ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2Ryb3BfdW5rbm93bl9maWVsZHNfdGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWRyb3BfdW5rbm93bl9maWVsZHNfdGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1kcm9wX3Vua25vd25fZmllbGRzX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9kcm9wX3Vua25vd25fZmllbGRzX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9kcm9wX3Vua25vd25fZmllbGRzX3Rlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1keW5hbWljX21lc3NhZ2VfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1keW5hbWljX21lc3NhZ2VfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1leHRlbnNpb25fc2V0X3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZXh0ZW5zaW9uX3NldF91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1leHRlbnNpb25fc2V0X3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1leHRlbnNpb25fc2V0X3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZXh0ZW5zaW9uX3NldF91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZXh0ZW5zaW9uX3NldF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF91bml0dGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlX3Rlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlX3Rlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlX3Rlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGVfdGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlX3Rlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGVfdGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGVfdGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGVfdGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGVfdGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGVfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlX3Rlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGVfdGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlX3Rlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGVfdGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGVfdGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWlubGluZWRfc3RyaW5nX2ZpZWxkX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWlubGluZWRfc3RyaW5nX2ZpZWxkX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWlubGluZWRfc3RyaW5nX2ZpZWxkX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW5saW5lZF9zdHJpbmdfZmllbGRfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWlubGluZWRfc3RyaW5nX2ZpZWxkX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW5saW5lZF9zdHJpbmdfZmllbGRfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtaW5saW5lZF9zdHJpbmdfZmllbGRfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2lubGluZWRfc3RyaW5nX2ZpZWxkX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW5saW5lZF9zdHJpbmdfZmllbGRfdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtaW5saW5lZF9zdHJpbmdfZmllbGRfdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvaW5saW5lZF9zdHJpbmdfZmllbGRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWlubGluZWRfc3RyaW5nX2ZpZWxkX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvaW5saW5lZF9zdHJpbmdfZmllbGRfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWlubGluZWRfc3RyaW5nX2ZpZWxkX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW5saW5lZF9zdHJpbmdfZmllbGRfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvaW5saW5lZF9zdHJpbmdfZmllbGRfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvaW8vcHJvdG9idWZfdGVzdC1jb2RlZF9zdHJlYW1fdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jb2RlZF9zdHJlYW1fdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1fdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1fdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LWNvZGVkX3N0cmVhbV91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvaW8vcHJvdG9idWZfdGVzdC1jb2RlZF9zdHJlYW1fdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1fdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1fdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtaW9fd2luMzJfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtaW9fd2luMzJfdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW9fd2luMzJfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LWlvX3dpbjMyX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW9fd2luMzJfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC1pb193aW4zMl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LWlvX3dpbjMyX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvaW8vcHJvdG9idWZfdGVzdC1pb193aW4zMl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vaW9fd2luMzJfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMl91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvaW8vcHJvdG9idWZfdGVzdC1pb193aW4zMl91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LWlvX3dpbjMyX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW9fd2luMzJfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LWlvX3dpbjMyX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW9fd2luMzJfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC1pb193aW4zMl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LWlvX3dpbjMyX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LWlvX3dpbjMyX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LXByaW50ZXJfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvaW8vcHJvdG9idWZfdGVzdC1wcmludGVyX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByaW50ZXJfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LXByaW50ZXJfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJpbnRlcl91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByaW50ZXJfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LXByaW50ZXJfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LXByaW50ZXJfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LXByaW50ZXJfdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LXByaW50ZXJfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcmludGVyX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvaW8vcHJvdG9idWZfdGVzdC1wcmludGVyX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJpbnRlcl91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByaW50ZXJfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LXByaW50ZXJfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtcHJpbnRlcl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvaW8vcHJvdG9idWZfdGVzdC10b2tlbml6ZXJfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC10b2tlbml6ZXJfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXJfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXJfdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LXRva2VuaXplcl91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvaW8vcHJvdG9idWZfdGVzdC10b2tlbml6ZXJfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXJfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXJfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LXplcm9fY29weV9zdHJlYW1fdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXplcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9pby9wcm90b2J1Zl90ZXN0LXplcm9fY29weV9zdHJlYW1fdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2lvL3Byb3RvYnVmX3Rlc3QtemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvaW8vcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF9maWVsZF90ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF9maWVsZF90ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9maWVsZF90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfZmllbGRfdGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9maWVsZF90ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2ZpZWxkX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfdGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfZmllbGRfdGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX2ZpZWxkX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF90ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX3Rlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX2ZpZWxkX3Rlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfZmllbGRfdGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9maWVsZF90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfZmllbGRfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfdGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfdGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9maWVsZF90ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2ZpZWxkX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfdGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfZmllbGRfdGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfZmllbGRfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfdGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfdGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfdGVzdC5vOiBnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfdGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF90ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX3Rlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF90ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF90ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX3Rlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF90ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX3Rlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tZXNzYWdlX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW5vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QubzogZ29vZ2xlL3Byb3RvYnVmL25vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1ub19maWVsZF9wcmVzZW5jZV90ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW5vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW5vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL25vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9ub19maWVsZF9wcmVzZW5jZV90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtbm9fZmllbGRfcHJlc2VuY2VfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW5vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9ub19maWVsZF9wcmVzZW5jZV90ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW5vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW5vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL25vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9ub19maWVsZF9wcmVzZW5jZV90ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW5vX2ZpZWxkX3ByZXNlbmNlX3Rlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvbm9fZmllbGRfcHJlc2VuY2VfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW5vX2ZpZWxkX3ByZXNlbmNlX3Rlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1ub19maWVsZF9wcmVzZW5jZV90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1ub19maWVsZF9wcmVzZW5jZV90ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL25vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL25vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9ub19maWVsZF9wcmVzZW5jZV90ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtbm9fZmllbGRfcHJlc2VuY2VfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW5vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9ub19maWVsZF9wcmVzZW5jZV90ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW5vX2ZpZWxkX3ByZXNlbmNlX3Rlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3Qtbm9fZmllbGRfcHJlc2VuY2VfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9ub19maWVsZF9wcmVzZW5jZV90ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9ub19maWVsZF9wcmVzZW5jZV90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvbm9fZmllbGRfcHJlc2VuY2VfdGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1wcmVzZXJ2ZV91bmtub3duX2VudW1fdGVzdC5vOiBnb29nbGUvcHJvdG9idWYvcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1wcmVzZXJ2ZV91bmtub3duX2VudW1fdGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcmVzZXJ2ZV91bmtub3duX2VudW1fdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3ByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcmVzZXJ2ZV91bmtub3duX2VudW1fdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9wcmVzZXJ2ZV91bmtub3duX2VudW1fdGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3ByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3ByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcmVzZXJ2ZV91bmtub3duX2VudW1fdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3ByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcmVzZXJ2ZV91bmtub3duX2VudW1fdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3ByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXByb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXByb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXByb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXByb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXByb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXByb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXByb3RvM19hcmVuYV91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByb3RvM19hcmVuYV91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXByb3RvM19hcmVuYV91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV91bml0dGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1wcm90bzNfbGl0ZV91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1wcm90bzNfbGl0ZV91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfbGl0ZV91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2xpdGVfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19saXRlX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfbGl0ZV91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByb3RvM19saXRlX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2xpdGVfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXByb3RvM19saXRlX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfbGl0ZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19saXRlX3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXByb3RvM19saXRlX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19saXRlX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2xpdGVfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfbGl0ZV91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2xpdGVfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19saXRlX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfbGl0ZV91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByb3RvM19saXRlX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2xpdGVfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2xpdGVfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19saXRlX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1yZWZsZWN0aW9uX29wc191bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1yZWZsZWN0aW9uX29wc191bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1yZWZsZWN0aW9uX29wc191bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1yZWZsZWN0aW9uX29wc191bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtYnl0ZXN0cmVhbV91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbV91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LWJ5dGVzdHJlYW1fdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYnl0ZXN0cmVhbV91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtYnl0ZXN0cmVhbV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW1fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1ieXRlc3RyZWFtX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYnl0ZXN0cmVhbV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW1fdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtYnl0ZXN0cmVhbV91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtYnl0ZXN0cmVhbV91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW1fdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtYnl0ZXN0cmVhbV91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtYnl0ZXN0cmVhbV91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWJ5dGVzdHJlYW1fdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LWJ5dGVzdHJlYW1fdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbV91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbV91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW1fdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1ieXRlc3RyZWFtX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYnl0ZXN0cmVhbV91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW1fdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtYnl0ZXN0cmVhbV91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1ieXRlc3RyZWFtX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW1fdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW1fdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtY29tbW9uX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtY29tbW9uX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jb21tb25fdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jb21tb25fdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtY29tbW9uX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1jb21tb25fdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1jb21tb25fdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtY29tbW9uX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29tbW9uX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1jb21tb25fdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jb21tb25fdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jb21tb25fdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtY29tbW9uX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LWNvbW1vbl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1pbnQxMjhfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LWludDEyOF91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1pbnQxMjhfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LWludDEyOF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4X3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4X3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW50MTI4X3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW50MTI4X3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4X3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LWludDEyOF91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtaW50MTI4X3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjhfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjhfdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtaW50MTI4X3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LWludDEyOF91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWludDEyOF91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtaW50MTI4X3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4X3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4X3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW50MTI4X3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW50MTI4X3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4X3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LWludDEyOF91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1pbnQxMjhfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4X3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjhfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjhfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzX3Rlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c190ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzX3Rlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzX3Rlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c190ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNfdGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c190ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzX3Rlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdGF0dXNfdGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c190ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c190ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdGF0dXNfdGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNfdGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdGF0dXNfdGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c190ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzX3Rlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c190ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c190ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNfdGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c190ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzX3Rlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdGF0dXNfdGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c190ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c190ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c190ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c190ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNfdGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c190ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c29yX3Rlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdGF0dXNvcl90ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0YXR1c29yX3Rlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c29yX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvcl90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzb3JfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0YXR1c29yX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvcl90ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c29yX3Rlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c29yX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvcl90ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c29yX3Rlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3JfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c29yX3Rlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdGF0dXNvcl90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdGF0dXNvcl90ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvcl90ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzb3JfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0YXR1c29yX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvcl90ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0YXR1c29yX3Rlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzb3JfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvcl90ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvcl90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3JfdGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJpbmdwaWVjZV91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJpbmdwaWVjZV91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJpbmdwaWVjZV91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncGllY2VfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJpbmdwaWVjZV91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cmluZ3BpZWNlX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncGllY2VfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0cmluZ3BpZWNlX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZV91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlX3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0cmluZ3BpZWNlX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncGllY2VfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJpbmdwaWVjZV91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncGllY2VfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJpbmdwaWVjZV91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cmluZ3BpZWNlX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncGllY2VfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncGllY2VfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncHJpbnRmX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJpbmdwcmludGZfdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJpbmdwcmludGZfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJpbmdwcmludGZfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJpbmdwcmludGZfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJpbmdwcmludGZfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cmluZ3ByaW50Zl91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJpbmdwcmludGZfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RyaW5ncHJpbnRmX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RydXRpbF91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cnV0aWxfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RydXRpbF91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3Qtc3RydXRpbF91bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cnV0aWxfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC1zdHJ1dGlsX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXN0cnV0aWxfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXRlbXBsYXRlX3V0aWxfdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlbXBsYXRlX3V0aWxfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXRlbXBsYXRlX3V0aWxfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC10ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXRpbWVfdGVzdC5vOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZV90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtdGltZV90ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRpbWVfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtdGltZV90ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC10aW1lX3Rlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC10aW1lX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtdGltZV90ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC10aW1lX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWVfdGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWVfdGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC10aW1lX3Rlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZV90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtdGltZV90ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGltZV90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvc3R1YnMvcHJvdG9idWZfdGVzdC10aW1lX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZV90ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lX3Rlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC10aW1lX3Rlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC10aW1lX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Byb3RvYnVmX3Rlc3QtdGltZV90ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wcm90b2J1Zl90ZXN0LXRpbWVfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWVfdGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWVfdGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC10ZXh0X2Zvcm1hdF91bml0dGVzdC5vOiBnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC10ZXh0X2Zvcm1hdF91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXh0X2Zvcm1hdF91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdGV4dF9mb3JtYXRfdW5pdHRlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXh0X2Zvcm1hdF91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdGV4dF9mb3JtYXRfdW5pdHRlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdGV4dF9mb3JtYXRfdW5pdHRlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXh0X2Zvcm1hdF91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdGV4dF9mb3JtYXRfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXh0X2Zvcm1hdF91bml0dGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRleHRfZm9ybWF0X3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdGV4dF9mb3JtYXRfdW5pdHRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdGV4dF9mb3JtYXRfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtZGVsaW1pdGVkX21lc3NhZ2VfdXRpbF90ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtZGVsaW1pdGVkX21lc3NhZ2VfdXRpbF90ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVsaW1pdGVkX21lc3NhZ2VfdXRpbF90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWRlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9kZWxpbWl0ZWRfbWVzc2FnZV91dGlsX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVsaW1pdGVkX21lc3NhZ2VfdXRpbF90ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWxpbWl0ZWRfbWVzc2FnZV91dGlsX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWRlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1kZWxpbWl0ZWRfbWVzc2FnZV91dGlsX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZGVsaW1pdGVkX21lc3NhZ2VfdXRpbF90ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9kZWxpbWl0ZWRfbWVzc2FnZV91dGlsX3Rlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1kZWxpbWl0ZWRfbWVzc2FnZV91dGlsX3Rlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvdXRpbC9kZWxpbWl0ZWRfbWVzc2FnZV91dGlsX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWRlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVsaW1pdGVkX21lc3NhZ2VfdXRpbF90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWRlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9kZWxpbWl0ZWRfbWVzc2FnZV91dGlsX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVsaW1pdGVkX21lc3NhZ2VfdXRpbF90ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWxpbWl0ZWRfbWVzc2FnZV91dGlsX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWRlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWRlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9kZWxpbWl0ZWRfbWVzc2FnZV91dGlsX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWZpZWxkX2NvbXBhcmF0b3JfdGVzdC5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWZpZWxkX2NvbXBhcmF0b3JfdGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX2NvbXBhcmF0b3JfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9jb21wYXJhdG9yX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvcl90ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX2NvbXBhcmF0b3JfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZmllbGRfY29tcGFyYXRvcl90ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9jb21wYXJhdG9yX3Rlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtZmllbGRfY29tcGFyYXRvcl90ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX2NvbXBhcmF0b3JfdGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvcl90ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtZmllbGRfY29tcGFyYXRvcl90ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvcl90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9jb21wYXJhdG9yX3Rlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX2NvbXBhcmF0b3JfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9jb21wYXJhdG9yX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvcl90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yX3Rlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX2NvbXBhcmF0b3JfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZmllbGRfY29tcGFyYXRvcl90ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9jb21wYXJhdG9yX3Rlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9jb21wYXJhdG9yX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvcl90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yX3Rlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrX3V0aWxfdGVzdC5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWxfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtZmllbGRfbWFza191dGlsX3Rlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrX3V0aWxfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrX3V0aWxfdGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWxfdGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2tfdXRpbF90ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrX3V0aWxfdGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrX3V0aWxfdGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrX3V0aWxfdGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWxfdGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsX3Rlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrX3V0aWxfdGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbF90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrX3V0aWxfdGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZmllbGRfbWFza191dGlsX3Rlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtZmllbGRfbWFza191dGlsX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWxfdGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWxfdGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsX3Rlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2tfdXRpbF90ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrX3V0aWxfdGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrX3V0aWxfdGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2tfdXRpbF90ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbF90ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXJfdGVzdC5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXJfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXJfdGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXJfdGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXJfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXJfdGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXJfdGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LWpzb25fb2JqZWN0d3JpdGVyX3Rlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXJfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtanNvbl9vYmplY3R3cml0ZXJfdGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fb2JqZWN0d3JpdGVyX3Rlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtanNvbl9vYmplY3R3cml0ZXJfdGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlcl90ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlcl90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX29iamVjdHdyaXRlcl90ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX29iamVjdHdyaXRlcl90ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlcl90ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtanNvbl9vYmplY3R3cml0ZXJfdGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1qc29uX29iamVjdHdyaXRlcl90ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyX3Rlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1qc29uX29iamVjdHdyaXRlcl90ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXJfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtanNvbl9vYmplY3R3cml0ZXJfdGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl9vYmplY3R3cml0ZXJfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1qc29uX29iamVjdHdyaXRlcl90ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXJfdGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlcl90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlcl90ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX29iamVjdHdyaXRlcl90ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX29iamVjdHdyaXRlcl90ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlcl90ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtanNvbl9vYmplY3R3cml0ZXJfdGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LWpzb25fb2JqZWN0d3JpdGVyX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlcl90ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyX3Rlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fc3RyZWFtX3BhcnNlcl90ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlcl90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fc3RyZWFtX3BhcnNlcl90ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LWpzb25fc3RyZWFtX3BhcnNlcl90ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlcl90ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2VfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2VfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2VfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2VfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2VfdGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyX3Rlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC1wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyX3Rlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LXByb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyX3Rlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC10eXBlX2luZm9fdGVzdF9oZWxwZXIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9idWZfdGVzdC10eXBlX2luZm9fdGVzdF9oZWxwZXIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10eXBlX2luZm9fdGVzdF9oZWxwZXIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtdHlwZV9pbmZvX3Rlc3RfaGVscGVyLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mb190ZXN0X2hlbHBlci5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10eXBlX2luZm9fdGVzdF9oZWxwZXIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXR5cGVfaW5mb190ZXN0X2hlbHBlci5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtdHlwZV9pbmZvX3Rlc3RfaGVscGVyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LXR5cGVfaW5mb190ZXN0X2hlbHBlci5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mb190ZXN0X2hlbHBlci5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b2J1Zl90ZXN0LXR5cGVfaW5mb190ZXN0X2hlbHBlci5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mb190ZXN0X2hlbHBlci5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtdHlwZV9pbmZvX3Rlc3RfaGVscGVyLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10eXBlX2luZm9fdGVzdF9oZWxwZXIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtdHlwZV9pbmZvX3Rlc3RfaGVscGVyLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mb190ZXN0X2hlbHBlci5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10eXBlX2luZm9fdGVzdF9oZWxwZXIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXR5cGVfaW5mb190ZXN0X2hlbHBlci5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtdHlwZV9pbmZvX3Rlc3RfaGVscGVyLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvYnVmX3Rlc3QtdHlwZV9pbmZvX3Rlc3RfaGVscGVyLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mb190ZXN0X2hlbHBlci5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl91dGlsX3Rlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWpzb25fdXRpbF90ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl91dGlsX3Rlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl91dGlsX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbF90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX3V0aWxfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl91dGlsX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbF90ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl91dGlsX3Rlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl91dGlsX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbF90ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl91dGlsX3Rlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWxfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl91dGlsX3Rlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fdXRpbF90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWpzb25fdXRpbF90ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbF90ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX3V0aWxfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl91dGlsX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbF90ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl91dGlsX3Rlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1qc29uX3V0aWxfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbF90ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbF90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWxfdGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC10aW1lX3V0aWxfdGVzdC5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWxfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtdGltZV91dGlsX3Rlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10aW1lX3V0aWxfdGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC10aW1lX3V0aWxfdGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWxfdGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRpbWVfdXRpbF90ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10aW1lX3V0aWxfdGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC10aW1lX3V0aWxfdGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC10aW1lX3V0aWxfdGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWxfdGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsX3Rlc3QuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC10aW1lX3V0aWxfdGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL3RpbWVfdXRpbF90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC10aW1lX3V0aWxfdGVzdC5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGltZV91dGlsX3Rlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtdGltZV91dGlsX3Rlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWxfdGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWxfdGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsX3Rlc3QuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRpbWVfdXRpbF90ZXN0LlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10aW1lX3V0aWxfdGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsX3Rlc3QuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC10aW1lX3V0aWxfdGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LXRpbWVfdXRpbF90ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL3RpbWVfdXRpbF90ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LXR5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0Lm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10eXBlX3Jlc29sdmVyX3V0aWxfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0LmNjCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3Qub2JqOiBnb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWxfdGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3Qub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXR5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LXR5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10eXBlX3Jlc29sdmVyX3V0aWxfdGVzdC5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC10eXBlX3Jlc29sdmVyX3V0aWxfdGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWxfdGVzdC5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC13ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0Lm86IGdvb2dsZS9wcm90b2J1Zi93ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3Qtd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC13ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0LlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC13ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi93ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXdlbGxfa25vd25fdHlwZXNfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC13ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC13ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC13ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi93ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0LmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC13ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0Lm9iajogZ29vZ2xlL3Byb3RvYnVmL3dlbGxfa25vd25fdHlwZXNfdW5pdHRlc3QuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC13ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3Qtd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi93ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi93ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0LmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXdlbGxfa25vd25fdHlwZXNfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC13ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC13ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXdlbGxfa25vd25fdHlwZXNfdW5pdHRlc3Qub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3dlbGxfa25vd25fdHlwZXNfdW5pdHRlc3QuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3Qtd2lyZV9mb3JtYXRfdW5pdHRlc3QubzogZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3Qtd2lyZV9mb3JtYXRfdW5pdHRlc3QubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtd2lyZV9mb3JtYXRfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0Lm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtd2lyZV9mb3JtYXRfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC13aXJlX2Zvcm1hdF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC13aXJlX2Zvcm1hdF91bml0dGVzdC5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfdW5pdHRlc3QuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC13aXJlX2Zvcm1hdF91bml0dGVzdC5vYmo6IGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0Lm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtd2lyZV9mb3JtYXRfdW5pdHRlc3QuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtd2lyZV9mb3JtYXRfdW5pdHRlc3QuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC13aXJlX2Zvcm1hdF91bml0dGVzdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0Lm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIub2JqOiBnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC5wYi5vOiBnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFueV90ZXN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3QucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFueV90ZXN0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LWFueV90ZXN0LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3QucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbnlfdGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFueV90ZXN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3QucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLm86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXRlc3RfYmFkX2lkZW50aWZpZXJzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIubzogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIub2JqOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Byb3RvYnVmX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJvdG9idWZfdGVzdC10ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcm90b2J1Zl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfdW5pdHRlc3QucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF91bml0dGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF91bml0dGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfdW5pdHRlc3QucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF91bml0dGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0LnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF91bml0dGVzdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfdW5pdHRlc3QucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfdW5pdHRlc3QucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LW1hcF91bml0dGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF91bml0dGVzdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF91bml0dGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC1tYXBfdW5pdHRlc3QucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0LnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdC5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2FyZW5hLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtcHR5LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnQucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X21zZXQucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X21zZXQucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X21zZXQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzMucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzMucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIubzogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19saXRlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5vOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvcHJvdG9idWZfdGVzdC11bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1hbnlzLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWFueXMucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbnlzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWFueXMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYW55cy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYW55cy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWFueXMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtYW55cy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9hbnlzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9hbnlzLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtYW55cy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWFueXMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFueXMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtYW55cy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYW55cy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYW55cy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWFueXMucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1hbnlzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9hbnlzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9hbnlzLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtYm9va3MucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWJvb2tzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYm9va3MucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtYm9va3MucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1ib29rcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYm9va3MucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtYm9va3MucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtYm9va3MucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtYm9va3MucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtYm9va3MucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWJvb2tzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWJvb2tzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1ib29rcy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYm9va3MucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtYm9va3MucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1ib29rcy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWUucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWUucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWUucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRlZmF1bHRfdmFsdWVfdGVzdC5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZmllbGRfbWFzay5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZmllbGRfbWFzay5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2sucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2sucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2sucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2sucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2sucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2sucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2sucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1maWVsZF9tYXNrLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtZmllbGRfbWFzay5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LW1hcHMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtbWFwcy5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcHMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtbWFwcy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtbWFwcy5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1tYXBzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1tYXBzLnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtbWFwcy5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwcy5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1tYXBzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBzLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBzLnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtbWFwcy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LW1hcHMucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1vbmVvZnMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1vbmVvZnMucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1vbmVvZnMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtb25lb2ZzLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1vbmVvZnMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW9uZW9mcy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtb25lb2ZzLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LW9uZW9mcy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9vbmVvZnMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LW9uZW9mcy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtb25lb2ZzLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1vbmVvZnMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtb25lb2ZzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1vbmVvZnMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW9uZW9mcy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtb25lb2ZzLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtb25lb2ZzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtcHJvdG8zLnBiLm86IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtcHJvdG8zLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LXByb3RvMy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LXByb3RvMy5wYi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1wcm90bzMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG8zLnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1wcm90bzMucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LXByb3RvMy5wYi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LXByb3RvMy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zLnBiLlRwbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LXByb3RvMy5wYi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LXByb3RvMy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LXN0cnVjdC5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LXN0cnVjdC5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cnVjdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1zdHJ1Y3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cnVjdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RydWN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1zdHJ1Y3QucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtc3RydWN0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtc3RydWN0LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1zdHJ1Y3QucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cnVjdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1zdHJ1Y3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cnVjdC5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RydWN0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1zdHJ1Y3QucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC1zdHJ1Y3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS90aW1lc3RhbXBfZHVyYXRpb24ucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3QtdGltZXN0YW1wX2R1cmF0aW9uLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtd3JhcHBlcnMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LXdyYXBwZXJzLnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtd3JhcHBlcnMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtd3JhcHBlcnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC13cmFwcGVycy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtd3JhcHBlcnMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtd3JhcHBlcnMucGIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtd3JhcHBlcnMucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtd3JhcHBlcnMucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS93cmFwcGVycy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtd3JhcHBlcnMucGIub2JqIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXdyYXBwZXJzLnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90b2J1Zl90ZXN0LXdyYXBwZXJzLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC13cmFwcGVycy5wYi5UcG8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtd3JhcHBlcnMucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvYnVmX3Rlc3Qtd3JhcHBlcnMucGIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYQGFtX19ub2RlcEApJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvcHJvdG9idWZfdGVzdC13cmFwcGVycy5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS93cmFwcGVycy5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0LnBiLm86IGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1qc29uX2Zvcm1hdC5wYi5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl9mb3JtYXQucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnBiLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0LnBiLm9iajogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX2Zvcm1hdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1qc29uX2Zvcm1hdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnBiLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl9mb3JtYXQucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0LnBiLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl9mb3JtYXQucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIubzogZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5vYmo6IGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJvdG9idWZfdGVzdF9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX2Zvcm1hdF9wcm90bzMucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5vOiBnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5jYworCitnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIub2JqOiBnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQocHJvdG9idWZfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcm90b2J1Zl90ZXN0X0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLm9iaiAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdXRpbC9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuVHBvIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnBiLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChwcm90b2J1Zl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi91dGlsL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5jYyc7IGZpYAorCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4tbW9ja19jb2RlX2dlbmVyYXRvci5vOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfcGx1Z2luX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLW1vY2tfY29kZV9nZW5lcmF0b3IubyAtTUQgLU1QIC1NRiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Rlc3RfcGx1Z2luLW1vY2tfY29kZV9nZW5lcmF0b3IuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS90ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Rlc3RfcGx1Z2luLW1vY2tfY29kZV9nZW5lcmF0b3IuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9wbHVnaW5fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYworCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4tbW9ja19jb2RlX2dlbmVyYXRvci5vYmo6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX0NYWCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9wbHVnaW5fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1NVCBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4tbW9ja19jb2RlX2dlbmVyYXRvci5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS90ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4tbW9ja19jb2RlX2dlbmVyYXRvci5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyc7IGZpYAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS90ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Rlc3RfcGx1Z2luLW1vY2tfY29kZV9nZW5lcmF0b3IuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWClzb3VyY2U9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjJyBvYmplY3Q9J2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi1tb2NrX2NvZGVfZ2VuZXJhdG9yLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X3BsdWdpbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLW1vY2tfY29kZV9nZW5lcmF0b3Iub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MnOyBmaWAKKworZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLm86IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfcGx1Z2luX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLm8gLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS90ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9wbHVnaW5fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi5vIGB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYworCitnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4tdGVzdF9wbHVnaW4ub2JqOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfQ1hYKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X3BsdWdpbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLU1UIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS90ZXN0X3BsdWdpbi10ZXN0X3BsdWdpbi5UcG8gLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjJzsgZmlgCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLlRwbyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFgpc291cmNlPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MnIG9iamVjdD0nZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X3BsdWdpbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLm9iaiBgaWYgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjJzsgZmlgCisKK2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Rlc3RfcGx1Z2luLWZpbGUubzogZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfcGx1Z2luX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvdGVzdF9wbHVnaW4tZmlsZS5vIC1NRCAtTVAgLU1GIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS90ZXN0X3BsdWdpbi1maWxlLlRwbyAtYyAtbyBnb29nbGUvcHJvdG9idWYvdGVzdGluZy90ZXN0X3BsdWdpbi1maWxlLm8gYHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS90ZXN0X3BsdWdpbi1maWxlLlRwbyBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvdGVzdF9wbHVnaW4tZmlsZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdGVzdGluZy90ZXN0X3BsdWdpbi1maWxlLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQU1fVl9DWFhAYW1fX25vZGVwQCkkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQodGVzdF9wbHVnaW5fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Rlc3RfcGx1Z2luLWZpbGUubyBgdGVzdCAtZiAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYworCitnb29nbGUvcHJvdG9idWYvdGVzdGluZy90ZXN0X3BsdWdpbi1maWxlLm9iajogZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYworQGFtX19mYXN0ZGVwQ1hYX1RSVUVACSQoQU1fVl9DWFgpJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3RfcGx1Z2luX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAtTVQgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvdGVzdF9wbHVnaW4tZmlsZS5vYmogLU1EIC1NUCAtTUYgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3Rlc3RfcGx1Z2luLWZpbGUuVHBvIC1jIC1vIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3Rlc3RfcGx1Z2luLWZpbGUub2JqIGBpZiB0ZXN0IC1mICdnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MnOyBmaWAKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS90ZXN0X3BsdWdpbi1maWxlLlRwbyBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvdGVzdF9wbHVnaW4tZmlsZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKEFNX1ZfQ1hYKXNvdXJjZT0nZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYycgb2JqZWN0PSdnb29nbGUvcHJvdG9idWYvdGVzdGluZy90ZXN0X3BsdWdpbi1maWxlLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChBTV9WX0NYWEBhbV9fbm9kZXBAKSQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0X3BsdWdpbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgLWMgLW8gZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvdGVzdF9wbHVnaW4tZmlsZS5vYmogYGlmIHRlc3QgLWYgJ2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyc7IGZpYAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCS1ybSAtcmYgZ29vZ2xlL3Byb3RvYnVmLy5saWJzIGdvb2dsZS9wcm90b2J1Zi9fbGlicworCS1ybSAtcmYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLy5saWJzIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9fbGlicworCS1ybSAtcmYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8ubGlicyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL19saWJzCisJLXJtIC1yZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLy5saWJzIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvX2xpYnMKKwktcm0gLXJmIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLy5saWJzIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL19saWJzCisJLXJtIC1yZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8ubGlicyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9fbGlicworCS1ybSAtcmYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BocC8ubGlicyBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGhwL19saWJzCisJLXJtIC1yZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLy5saWJzIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vX2xpYnMKKwktcm0gLXJmIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5Ly5saWJzIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L19saWJzCisJLXJtIC1yZiBnb29nbGUvcHJvdG9idWYvaW8vLmxpYnMgZ29vZ2xlL3Byb3RvYnVmL2lvL19saWJzCisJLXJtIC1yZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvLmxpYnMgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL19saWJzCisJLXJtIC1yZiBnb29nbGUvcHJvdG9idWYvdXRpbC8ubGlicyBnb29nbGUvcHJvdG9idWYvdXRpbC9fbGlicworCS1ybSAtcmYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvLmxpYnMgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvX2xpYnMKK2luc3RhbGwtbm9iYXNlX2Rpc3RfcHJvdG9EQVRBOiAkKG5vYmFzZV9kaXN0X3Byb3RvX0RBVEEpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJQGxpc3Q9JyQobm9iYXNlX2Rpc3RfcHJvdG9fREFUQSknOyB0ZXN0IC1uICIkKHByb3RvZGlyKSIgfHwgbGlzdD07IFwKKwlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChwcm90b2RpciknIjsgXAorCSAgJChNS0RJUl9QKSAiJChERVNURElSKSQocHJvdG9kaXIpIiB8fCBleGl0IDE7IFwKKwlmaTsgXAorCSQoYW1fX25vYmFzZV9saXN0KSB8IHdoaWxlIHJlYWQgZGlyIGZpbGVzOyBkbyBcCisJICB4ZmlsZXM9OyBmb3IgZmlsZSBpbiAkJGZpbGVzOyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkZmlsZSI7IHRoZW4geGZpbGVzPSIkJHhmaWxlcyAkJGZpbGUiOyBcCisJICAgIGVsc2UgeGZpbGVzPSIkJHhmaWxlcyAkKHNyY2RpcikvJCRmaWxlIjsgZmk7IGRvbmU7IFwKKwkgIHRlc3QgLXogIiQkeGZpbGVzIiB8fCB7IFwKKwkgICAgdGVzdCAieCQkZGlyIiA9IHguIHx8IHsgXAorCSAgICAgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChwcm90b2RpcikvJCRkaXInIjsgXAorCSAgICAgICQoTUtESVJfUCkgIiQoREVTVERJUikkKHByb3RvZGlyKS8kJGRpciI7IH07IFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJHhmaWxlcyAnJChERVNURElSKSQocHJvdG9kaXIpLyQkZGlyJyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQkeGZpbGVzICIkKERFU1RESVIpJChwcm90b2RpcikvJCRkaXIiIHx8IGV4aXQgJCQ/OyB9OyBcCisJZG9uZQorCit1bmluc3RhbGwtbm9iYXNlX2Rpc3RfcHJvdG9EQVRBOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQobm9iYXNlX2Rpc3RfcHJvdG9fREFUQSknOyB0ZXN0IC1uICIkKHByb3RvZGlyKSIgfHwgbGlzdD07IFwKKwkkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBmaWxlcz1gJChhbV9fbm9iYXNlX3N0cmlwKWA7IFwKKwlkaXI9JyQoREVTVERJUikkKHByb3RvZGlyKSc7ICQoYW1fX3VuaW5zdGFsbF9maWxlc19mcm9tX2RpcikKK2luc3RhbGwtbm9iYXNlX2luY2x1ZGVIRUFERVJTOiAkKG5vYmFzZV9pbmNsdWRlX0hFQURFUlMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJQGxpc3Q9JyQobm9iYXNlX2luY2x1ZGVfSEVBREVSUyknOyB0ZXN0IC1uICIkKGluY2x1ZGVkaXIpIiB8fCBsaXN0PTsgXAorCWlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAorCSAgZWNobyAiICQoTUtESVJfUCkgJyQoREVTVERJUikkKGluY2x1ZGVkaXIpJyI7IFwKKwkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKGluY2x1ZGVkaXIpIiB8fCBleGl0IDE7IFwKKwlmaTsgXAorCSQoYW1fX25vYmFzZV9saXN0KSB8IHdoaWxlIHJlYWQgZGlyIGZpbGVzOyBkbyBcCisJICB4ZmlsZXM9OyBmb3IgZmlsZSBpbiAkJGZpbGVzOyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkZmlsZSI7IHRoZW4geGZpbGVzPSIkJHhmaWxlcyAkJGZpbGUiOyBcCisJICAgIGVsc2UgeGZpbGVzPSIkJHhmaWxlcyAkKHNyY2RpcikvJCRmaWxlIjsgZmk7IGRvbmU7IFwKKwkgIHRlc3QgLXogIiQkeGZpbGVzIiB8fCB7IFwKKwkgICAgdGVzdCAieCQkZGlyIiA9IHguIHx8IHsgXAorCSAgICAgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChpbmNsdWRlZGlyKS8kJGRpciciOyBcCisJICAgICAgJChNS0RJUl9QKSAiJChERVNURElSKSQoaW5jbHVkZWRpcikvJCRkaXIiOyB9OyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfSEVBREVSKSAkJHhmaWxlcyAnJChERVNURElSKSQoaW5jbHVkZWRpcikvJCRkaXInIjsgXAorCSAgICAkKElOU1RBTExfSEVBREVSKSAkJHhmaWxlcyAiJChERVNURElSKSQoaW5jbHVkZWRpcikvJCRkaXIiIHx8IGV4aXQgJCQ/OyB9OyBcCisJZG9uZQorCit1bmluc3RhbGwtbm9iYXNlX2luY2x1ZGVIRUFERVJTOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQobm9iYXNlX2luY2x1ZGVfSEVBREVSUyknOyB0ZXN0IC1uICIkKGluY2x1ZGVkaXIpIiB8fCBsaXN0PTsgXAorCSQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IGZpbGVzPWAkKGFtX19ub2Jhc2Vfc3RyaXApYDsgXAorCWRpcj0nJChERVNURElSKSQoaW5jbHVkZWRpciknOyAkKGFtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIpCisKK0lEOiAkKGFtX190YWdnZWRfZmlsZXMpCisJJChhbV9fZGVmaW5lX3VuaXFfdGFnZ2VkX2ZpbGVzKTsgbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiB0YWdzLWFtCitUQUdTOiB0YWdzCisKK3RhZ3MtYW06ICQoVEFHU19ERVBFTkRFTkNJRVMpICQoYW1fX3RhZ2dlZF9maWxlcykKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwkkKGFtX19kZWZpbmVfdW5pcV90YWdnZWRfZmlsZXMpOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBjdGFncy1hbQorCitDVEFHUzogY3RhZ3MKK2N0YWdzLWFtOiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKGFtX190YWdnZWRfZmlsZXMpCisJJChhbV9fZGVmaW5lX3VuaXFfdGFnZ2VkX2ZpbGVzKTsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKK2NzY29wZWxpc3Q6IGNzY29wZWxpc3QtYW0KKworY3Njb3BlbGlzdC1hbTogJChhbV9fdGFnZ2VkX2ZpbGVzKQorCWxpc3Q9JyQoYW1fX3RhZ2dlZF9maWxlcyknOyBcCisJY2FzZSAiJChzcmNkaXIpIiBpbiBcCisJICBbXFwvXSogfCA/OltcXC9dKikgc2Rpcj0iJChzcmNkaXIpIiA7OyBcCisJICAqKSBzZGlyPSQoc3ViZGlyKS8kKHNyY2RpcikgOzsgXAorCWVzYWM7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gXAorCSAgICBlY2hvICIkKHN1YmRpcikvJCRpIjsgXAorCSAgZWxzZSBcCisJICAgIGVjaG8gIiQkc2Rpci8kJGkiOyBcCisJICBmaTsgXAorCWRvbmUgPj4gJCh0b3BfYnVpbGRkaXIpL2NzY29wZS5maWxlcworCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCisjIFJlY292ZXIgZnJvbSBkZWxldGVkICcudHJzJyBmaWxlOyB0aGlzIHNob3VsZCBlbnN1cmUgdGhhdAorIyAicm0gLWYgZm9vLmxvZzsgbWFrZSBmb28udHJzIiByZS1ydW4gJ2Zvby50ZXN0JywgYW5kIHJlLWNyZWF0ZQorIyBib3RoICdmb28ubG9nJyBhbmQgJ2Zvby50cnMnLiAgQnJlYWsgdGhlIHJlY2lwZSBpbiB0d28gc3Vic2hlbGxzCisjIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggIm1ha2UgLW4iLgorLmxvZy50cnM6CisJcm0gLWYgJDwgJEAKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkPAorCisjIExlYWRpbmcgJ2FtLS1mbm9yZCcgaXMgdGhlcmUgdG8gZW5zdXJlIHRoZSBsaXN0IG9mIHRhcmdldHMgZG9lcyBub3QKKyMgZXhwYW5kIHRvIGVtcHR5LCBhcyBjb3VsZCBoYXBwZW4gZS5nLiB3aXRoIG1ha2UgY2hlY2sgVEVTVFM9JycuCithbS0tZm5vcmQgJChURVNUX0xPR1MpICQoVEVTVF9MT0dTOi5sb2c9LnRycyk6ICQoYW1fX2ZvcmNlX3JlY2hlY2spCithbS0tZm9yY2UtcmVjaGVjazoKKwlAOgorCiskKFRFU1RfU1VJVEVfTE9HKTogJChURVNUX0xPR1MpCisJQCQoYW1fX3NldF9URVNUU19iYXNlcyk7IFwKKwlhbV9fZl9vayAoKSB7IHRlc3QgLWYgIiQkMSIgJiYgdGVzdCAtciAiJCQxIjsgfTsgXAorCXJlZG9fYmFzZXM9YGZvciBpIGluICQkYmFzZXM7IGRvIFwKKwkgICAgICAgICAgICAgIGFtX19mX29rICQkaS50cnMgJiYgYW1fX2Zfb2sgJCRpLmxvZyB8fCBlY2hvICQkaTsgXAorCSAgICAgICAgICAgIGRvbmVgOyBcCisJaWYgdGVzdCAtbiAiJCRyZWRvX2Jhc2VzIjsgdGhlbiBcCisJICByZWRvX2xvZ3M9YGZvciBpIGluICQkcmVkb19iYXNlczsgZG8gZWNobyAkJGkubG9nOyBkb25lYDsgXAorCSAgcmVkb19yZXN1bHRzPWBmb3IgaSBpbiAkJHJlZG9fYmFzZXM7IGRvIGVjaG8gJCRpLnRyczsgZG9uZWA7IFwKKwkgIGlmICQoYW1fX21ha2VfZHJ5cnVuKTsgdGhlbiA6OyBlbHNlIFwKKwkgICAgcm0gLWYgJCRyZWRvX2xvZ3MgJiYgcm0gLWYgJCRyZWRvX3Jlc3VsdHMgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWZpOyBcCisJaWYgdGVzdCAtbiAiJCRhbV9fcmVtYWtpbmdfbG9ncyI7IHRoZW4gXAorCSAgZWNobyAiZmF0YWw6IG1ha2luZyAkKFRFU1RfU1VJVEVfTE9HKTogcG9zc2libGUgaW5maW5pdGUiIFwKKwkgICAgICAgInJlY3Vyc2lvbiBkZXRlY3RlZCIgPiYyOyBcCisJZWxpZiB0ZXN0IC1uICIkJHJlZG9fbG9ncyI7IHRoZW4gXAorCSAgYW1fX3JlbWFraW5nX2xvZ3M9eWVzICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkcmVkb19sb2dzOyBcCisJZmk7IFwKKwlpZiAkKGFtX19tYWtlX2RyeXJ1bik7IHRoZW4gOjsgZWxzZSBcCisJICBzdD0wOyAgXAorCSAgZXJybXNnPSJmYXRhbDogbWFraW5nICQoVEVTVF9TVUlURV9MT0cpOiBmYWlsZWQgdG8gY3JlYXRlIjsgXAorCSAgZm9yIGkgaW4gJCRyZWRvX2Jhc2VzOyBkbyBcCisJICAgIHRlc3QgLWYgJCRpLnRycyAmJiB0ZXN0IC1yICQkaS50cnMgXAorCSAgICAgIHx8IHsgZWNobyAiJCRlcnJtc2cgJCRpLnRycyIgPiYyOyBzdD0xOyB9OyBcCisJICAgIHRlc3QgLWYgJCRpLmxvZyAmJiB0ZXN0IC1yICQkaS5sb2cgXAorCSAgICAgIHx8IHsgZWNobyAiJCRlcnJtc2cgJCRpLmxvZyIgPiYyOyBzdD0xOyB9OyBcCisJICBkb25lOyBcCisJICB0ZXN0ICQkc3QgLWVxIDAgfHwgZXhpdCAxOyBcCisJZmkKKwlAJChhbV9fc2hfZV9zZXR1cCk7ICQoYW1fX3R0eV9jb2xvcnMpOyAkKGFtX19zZXRfVEVTVFNfYmFzZXMpOyBcCisJd3M9J1sgCV0nOyBcCisJcmVzdWx0cz1gZm9yIGIgaW4gJCRiYXNlczsgZG8gZWNobyAkJGIudHJzOyBkb25lYDsgXAorCXRlc3QgLW4gIiQkcmVzdWx0cyIgfHwgcmVzdWx0cz0vZGV2L251bGw7IFwKKwlhbGw9YCAgZ3JlcCAiXiQkd3MqOnRlc3QtcmVzdWx0OiIgICAgICAgICAgICQkcmVzdWx0cyB8IHdjIC1sYDsgXAorCXBhc3M9YCBncmVwICJeJCR3cyo6dGVzdC1yZXN1bHQ6JCR3cypQQVNTIiAgJCRyZXN1bHRzIHwgd2MgLWxgOyBcCisJZmFpbD1gIGdyZXAgIl4kJHdzKjp0ZXN0LXJlc3VsdDokJHdzKkZBSUwiICAkJHJlc3VsdHMgfCB3YyAtbGA7IFwKKwlza2lwPWAgZ3JlcCAiXiQkd3MqOnRlc3QtcmVzdWx0OiQkd3MqU0tJUCIgICQkcmVzdWx0cyB8IHdjIC1sYDsgXAorCXhmYWlsPWBncmVwICJeJCR3cyo6dGVzdC1yZXN1bHQ6JCR3cypYRkFJTCIgJCRyZXN1bHRzIHwgd2MgLWxgOyBcCisJeHBhc3M9YGdyZXAgIl4kJHdzKjp0ZXN0LXJlc3VsdDokJHdzKlhQQVNTIiAkJHJlc3VsdHMgfCB3YyAtbGA7IFwKKwllcnJvcj1gZ3JlcCAiXiQkd3MqOnRlc3QtcmVzdWx0OiQkd3MqRVJST1IiICQkcmVzdWx0cyB8IHdjIC1sYDsgXAorCWlmIHRlc3QgYGV4cHIgJCRmYWlsICsgJCR4cGFzcyArICQkZXJyb3JgIC1lcSAwOyB0aGVuIFwKKwkgIHN1Y2Nlc3M9dHJ1ZTsgXAorCWVsc2UgXAorCSAgc3VjY2Vzcz1mYWxzZTsgXAorCWZpOyBcCisJYnI9Jz09PT09PT09PT09PT09PT09PT0nOyBicj0kJGJyJCRiciQkYnIkJGJyOyBcCisJcmVzdWx0X2NvdW50ICgpIFwKKwl7IFwKKwkgICAgaWYgdGVzdCB4IiQkMSIgPSB4Ii0tbWF5YmUtY29sb3IiOyB0aGVuIFwKKwkgICAgICBtYXliZV9jb2xvcml6ZT15ZXM7IFwKKwkgICAgZWxpZiB0ZXN0IHgiJCQxIiA9IHgiLS1uby1jb2xvciI7IHRoZW4gXAorCSAgICAgIG1heWJlX2NvbG9yaXplPW5vOyBcCisJICAgIGVsc2UgXAorCSAgICAgIGVjaG8gIiRAOiBpbnZhbGlkICdyZXN1bHRfY291bnQnIHVzYWdlIiA+JjI7IGV4aXQgNDsgXAorCSAgICBmaTsgXAorCSAgICBzaGlmdDsgXAorCSAgICBkZXNjPSQkMSBjb3VudD0kJDI7IFwKKwkgICAgaWYgdGVzdCAkJG1heWJlX2NvbG9yaXplID0geWVzICYmIHRlc3QgJCRjb3VudCAtZ3QgMDsgdGhlbiBcCisJICAgICAgY29sb3Jfc3RhcnQ9JCQzIGNvbG9yX2VuZD0kJHN0ZDsgXAorCSAgICBlbHNlIFwKKwkgICAgICBjb2xvcl9zdGFydD0gY29sb3JfZW5kPTsgXAorCSAgICBmaTsgXAorCSAgICBlY2hvICIkJHtjb2xvcl9zdGFydH0jICQkZGVzYyAkJGNvdW50JCR7Y29sb3JfZW5kfSI7IFwKKwl9OyBcCisJY3JlYXRlX3Rlc3RzdWl0ZV9yZXBvcnQgKCkgXAorCXsgXAorCSAgcmVzdWx0X2NvdW50ICQkMSAiVE9UQUw6IiAkJGFsbCAgICIkJGJyZyI7IFwKKwkgIHJlc3VsdF9jb3VudCAkJDEgIlBBU1M6ICIgJCRwYXNzICAiJCRncm4iOyBcCisJICByZXN1bHRfY291bnQgJCQxICJTS0lQOiAiICQkc2tpcCAgIiQkYmx1IjsgXAorCSAgcmVzdWx0X2NvdW50ICQkMSAiWEZBSUw6IiAkJHhmYWlsICIkJGxnbiI7IFwKKwkgIHJlc3VsdF9jb3VudCAkJDEgIkZBSUw6ICIgJCRmYWlsICAiJCRyZWQiOyBcCisJICByZXN1bHRfY291bnQgJCQxICJYUEFTUzoiICQkeHBhc3MgIiQkcmVkIjsgXAorCSAgcmVzdWx0X2NvdW50ICQkMSAiRVJST1I6IiAkJGVycm9yICIkJG1nbiI7IFwKKwl9OyBcCisJewkJCQkJCQkJXAorCSAgZWNobyAiJChQQUNLQUdFX1NUUklORyk6ICQoc3ViZGlyKS8kKFRFU1RfU1VJVEVfTE9HKSIgfAlcCisJICAgICQoYW1fX3JzdF90aXRsZSk7CQkJCQkJXAorCSAgY3JlYXRlX3Rlc3RzdWl0ZV9yZXBvcnQgLS1uby1jb2xvcjsJCQkJXAorCSAgZWNobzsJCQkJCQkJCVwKKwkgIGVjaG8gIi4uIGNvbnRlbnRzOjogOmRlcHRoOiAyIjsJCQkJXAorCSAgZWNobzsJCQkJCQkJCVwKKwkgIGZvciBiIGluICQkYmFzZXM7IGRvIGVjaG8gJCRiOyBkb25lCQkJCVwKKwkgICAgfCAkKGFtX19jcmVhdGVfZ2xvYmFsX2xvZyk7CQkJCQlcCisJfSA+JChURVNUX1NVSVRFX0xPRykudG1wIHx8IGV4aXQgMTsJCQkJXAorCW12ICQoVEVTVF9TVUlURV9MT0cpLnRtcCAkKFRFU1RfU1VJVEVfTE9HKTsJCQlcCisJaWYgJCRzdWNjZXNzOyB0aGVuCQkJCQkJXAorCSAgY29sPSIkJGdybiI7CQkJCQkJCVwKKwkgZWxzZQkJCQkJCQkJXAorCSAgY29sPSIkJHJlZCI7CQkJCQkJCVwKKwkgIHRlc3QgeCIkJFZFUkJPU0UiID0geCB8fCBjYXQgJChURVNUX1NVSVRFX0xPRyk7CQlcCisJZmk7CQkJCQkJCQlcCisJZWNobyAiJCR7Y29sfSQkYnIkJHtzdGR9IjsgCQkJCQlcCisJZWNobyAiJCR7Y29sfVRlc3RzdWl0ZSBzdW1tYXJ5IiQoQU1fVEVTVFNVSVRFX1NVTU1BUllfSEVBREVSKSIkJHtzdGR9IjsJXAorCWVjaG8gIiQke2NvbH0kJGJyJCR7c3RkfSI7IAkJCQkJXAorCWNyZWF0ZV90ZXN0c3VpdGVfcmVwb3J0IC0tbWF5YmUtY29sb3I7CQkJCVwKKwllY2hvICIkJGNvbCQkYnIkJHN0ZCI7CQkJCQkJXAorCWlmICQkc3VjY2VzczsgdGhlbiA6OyBlbHNlCQkJCQlcCisJICBlY2hvICIkJHtjb2x9U2VlICQoc3ViZGlyKS8kKFRFU1RfU1VJVEVfTE9HKSQke3N0ZH0iOwkJXAorCSAgaWYgdGVzdCAtbiAiJChQQUNLQUdFX0JVR1JFUE9SVCkiOyB0aGVuCQkJXAorCSAgICBlY2hvICIkJHtjb2x9UGxlYXNlIHJlcG9ydCB0byAkKFBBQ0tBR0VfQlVHUkVQT1JUKSQke3N0ZH0iOwlcCisJICBmaTsJCQkJCQkJCVwKKwkgIGVjaG8gIiQkY29sJCRiciQkc3RkIjsJCQkJCVwKKwlmaTsJCQkJCQkJCVwKKwkkJHN1Y2Nlc3MgfHwgZXhpdCAxCisKK2NoZWNrLVRFU1RTOiAkKGNoZWNrX1BST0dSQU1TKQorCUBsaXN0PSckKFJFQ0hFQ0tfTE9HUyknOyAgICAgICAgICAgdGVzdCAteiAiJCRsaXN0IiB8fCBybSAtZiAkJGxpc3QKKwlAbGlzdD0nJChSRUNIRUNLX0xPR1M6LmxvZz0udHJzKSc7IHRlc3QgLXogIiQkbGlzdCIgfHwgcm0gLWYgJCRsaXN0CisJQHRlc3QgLXogIiQoVEVTVF9TVUlURV9MT0cpIiB8fCBybSAtZiAkKFRFU1RfU1VJVEVfTE9HKQorCUBzZXQgK2U7ICQoYW1fX3NldF9URVNUU19iYXNlcyk7IFwKKwlsb2dfbGlzdD1gZm9yIGkgaW4gJCRiYXNlczsgZG8gZWNobyAkJGkubG9nOyBkb25lYDsgXAorCXRyc19saXN0PWBmb3IgaSBpbiAkJGJhc2VzOyBkbyBlY2hvICQkaS50cnM7IGRvbmVgOyBcCisJbG9nX2xpc3Q9YGVjaG8gJCRsb2dfbGlzdGA7IHRyc19saXN0PWBlY2hvICQkdHJzX2xpc3RgOyBcCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJChURVNUX1NVSVRFX0xPRykgVEVTVF9MT0dTPSIkJGxvZ19saXN0IjsgXAorCWV4aXQgJCQ/OworcmVjaGVjazogYWxsICQoY2hlY2tfUFJPR1JBTVMpCisJQHRlc3QgLXogIiQoVEVTVF9TVUlURV9MT0cpIiB8fCBybSAtZiAkKFRFU1RfU1VJVEVfTE9HKQorCUBzZXQgK2U7ICQoYW1fX3NldF9URVNUU19iYXNlcyk7IFwKKwliYXNlcz1gZm9yIGkgaW4gJCRiYXNlczsgZG8gZWNobyAkJGk7IGRvbmUgXAorCSAgICAgICAgIHwgJChhbV9fbGlzdF9yZWNoZWNrX3Rlc3RzKWAgfHwgZXhpdCAxOyBcCisJbG9nX2xpc3Q9YGZvciBpIGluICQkYmFzZXM7IGRvIGVjaG8gJCRpLmxvZzsgZG9uZWA7IFwKKwlsb2dfbGlzdD1gZWNobyAkJGxvZ19saXN0YDsgXAorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQoVEVTVF9TVUlURV9MT0cpIFwKKwkgICAgICAgIGFtX19mb3JjZV9yZWNoZWNrPWFtLS1mb3JjZS1yZWNoZWNrIFwKKwkgICAgICAgIFRFU1RfTE9HUz0iJCRsb2dfbGlzdCI7IFwKKwlleGl0ICQkPworcHJvdG9idWYtdGVzdC5sb2c6IHByb3RvYnVmLXRlc3QkKEVYRUVYVCkKKwlAcD0ncHJvdG9idWYtdGVzdCQoRVhFRVhUKSc7IFwKKwliPSdwcm90b2J1Zi10ZXN0JzsgXAorCSQoYW1fX2NoZWNrX3ByZSkgJChMT0dfRFJJVkVSKSAtLXRlc3QtbmFtZSAiJCRmIiBcCisJLS1sb2ctZmlsZSAkJGIubG9nIC0tdHJzLWZpbGUgJCRiLnRycyBcCisJJChhbV9fY29tbW9uX2RyaXZlcl9mbGFncykgJChBTV9MT0dfRFJJVkVSX0ZMQUdTKSAkKExPR19EUklWRVJfRkxBR1MpIC0tICQoTE9HX0NPTVBJTEUpIFwKKwkiJCR0c3QiICQoQU1fVEVTVFNfRkRfUkVESVJFQ1QpCitwcm90b2J1Zi1sYXp5LWRlc2NyaXB0b3ItdGVzdC5sb2c6IHByb3RvYnVmLWxhenktZGVzY3JpcHRvci10ZXN0JChFWEVFWFQpCisJQHA9J3Byb3RvYnVmLWxhenktZGVzY3JpcHRvci10ZXN0JChFWEVFWFQpJzsgXAorCWI9J3Byb3RvYnVmLWxhenktZGVzY3JpcHRvci10ZXN0JzsgXAorCSQoYW1fX2NoZWNrX3ByZSkgJChMT0dfRFJJVkVSKSAtLXRlc3QtbmFtZSAiJCRmIiBcCisJLS1sb2ctZmlsZSAkJGIubG9nIC0tdHJzLWZpbGUgJCRiLnRycyBcCisJJChhbV9fY29tbW9uX2RyaXZlcl9mbGFncykgJChBTV9MT0dfRFJJVkVSX0ZMQUdTKSAkKExPR19EUklWRVJfRkxBR1MpIC0tICQoTE9HX0NPTVBJTEUpIFwKKwkiJCR0c3QiICQoQU1fVEVTVFNfRkRfUkVESVJFQ1QpCitwcm90b2J1Zi1saXRlLXRlc3QubG9nOiBwcm90b2J1Zi1saXRlLXRlc3QkKEVYRUVYVCkKKwlAcD0ncHJvdG9idWYtbGl0ZS10ZXN0JChFWEVFWFQpJzsgXAorCWI9J3Byb3RvYnVmLWxpdGUtdGVzdCc7IFwKKwkkKGFtX19jaGVja19wcmUpICQoTE9HX0RSSVZFUikgLS10ZXN0LW5hbWUgIiQkZiIgXAorCS0tbG9nLWZpbGUgJCRiLmxvZyAtLXRycy1maWxlICQkYi50cnMgXAorCSQoYW1fX2NvbW1vbl9kcml2ZXJfZmxhZ3MpICQoQU1fTE9HX0RSSVZFUl9GTEFHUykgJChMT0dfRFJJVkVSX0ZMQUdTKSAtLSAkKExPR19DT01QSUxFKSBcCisJIiQkdHN0IiAkKEFNX1RFU1RTX0ZEX1JFRElSRUNUKQorZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2gubG9nOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX291dHB1dF91bml0dGVzdC5zaAorCUBwPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX291dHB1dF91bml0dGVzdC5zaCc7IFwKKwliPSdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX291dHB1dF91bml0dGVzdC5zaCc7IFwKKwkkKGFtX19jaGVja19wcmUpICQoTE9HX0RSSVZFUikgLS10ZXN0LW5hbWUgIiQkZiIgXAorCS0tbG9nLWZpbGUgJCRiLmxvZyAtLXRycy1maWxlICQkYi50cnMgXAorCSQoYW1fX2NvbW1vbl9kcml2ZXJfZmxhZ3MpICQoQU1fTE9HX0RSSVZFUl9GTEFHUykgJChMT0dfRFJJVkVSX0ZMQUdTKSAtLSAkKExPR19DT01QSUxFKSBcCisJIiQkdHN0IiAkKEFNX1RFU1RTX0ZEX1JFRElSRUNUKQorZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtX3VuaXR0ZXN0LnNoLmxvZzogZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtX3VuaXR0ZXN0LnNoCisJQHA9J2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaCc7IFwKKwliPSdnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW1fdW5pdHRlc3Quc2gnOyBcCisJJChhbV9fY2hlY2tfcHJlKSAkKExPR19EUklWRVIpIC0tdGVzdC1uYW1lICIkJGYiIFwKKwktLWxvZy1maWxlICQkYi5sb2cgLS10cnMtZmlsZSAkJGIudHJzIFwKKwkkKGFtX19jb21tb25fZHJpdmVyX2ZsYWdzKSAkKEFNX0xPR19EUklWRVJfRkxBR1MpICQoTE9HX0RSSVZFUl9GTEFHUykgLS0gJChMT0dfQ09NUElMRSkgXAorCSIkJHRzdCIgJChBTV9URVNUU19GRF9SRURJUkVDVCkKK3Byb3RvYnVmLWxpdGUtYXJlbmEtdGVzdC5sb2c6IHByb3RvYnVmLWxpdGUtYXJlbmEtdGVzdCQoRVhFRVhUKQorCUBwPSdwcm90b2J1Zi1saXRlLWFyZW5hLXRlc3QkKEVYRUVYVCknOyBcCisJYj0ncHJvdG9idWYtbGl0ZS1hcmVuYS10ZXN0JzsgXAorCSQoYW1fX2NoZWNrX3ByZSkgJChMT0dfRFJJVkVSKSAtLXRlc3QtbmFtZSAiJCRmIiBcCisJLS1sb2ctZmlsZSAkJGIubG9nIC0tdHJzLWZpbGUgJCRiLnRycyBcCisJJChhbV9fY29tbW9uX2RyaXZlcl9mbGFncykgJChBTV9MT0dfRFJJVkVSX0ZMQUdTKSAkKExPR19EUklWRVJfRkxBR1MpIC0tICQoTE9HX0NPTVBJTEUpIFwKKwkiJCR0c3QiICQoQU1fVEVTVFNfRkRfUkVESVJFQ1QpCituby13YXJuaW5nLXRlc3QubG9nOiBuby13YXJuaW5nLXRlc3QkKEVYRUVYVCkKKwlAcD0nbm8td2FybmluZy10ZXN0JChFWEVFWFQpJzsgXAorCWI9J25vLXdhcm5pbmctdGVzdCc7IFwKKwkkKGFtX19jaGVja19wcmUpICQoTE9HX0RSSVZFUikgLS10ZXN0LW5hbWUgIiQkZiIgXAorCS0tbG9nLWZpbGUgJCRiLmxvZyAtLXRycy1maWxlICQkYi50cnMgXAorCSQoYW1fX2NvbW1vbl9kcml2ZXJfZmxhZ3MpICQoQU1fTE9HX0RSSVZFUl9GTEFHUykgJChMT0dfRFJJVkVSX0ZMQUdTKSAtLSAkKExPR19DT01QSUxFKSBcCisJIiQkdHN0IiAkKEFNX1RFU1RTX0ZEX1JFRElSRUNUKQorLnRlc3QubG9nOgorCUBwPSckPCc7IFwKKwkkKGFtX19zZXRfYik7IFwKKwkkKGFtX19jaGVja19wcmUpICQoVEVTVF9MT0dfRFJJVkVSKSAtLXRlc3QtbmFtZSAiJCRmIiBcCisJLS1sb2ctZmlsZSAkJGIubG9nIC0tdHJzLWZpbGUgJCRiLnRycyBcCisJJChhbV9fY29tbW9uX2RyaXZlcl9mbGFncykgJChBTV9URVNUX0xPR19EUklWRVJfRkxBR1MpICQoVEVTVF9MT0dfRFJJVkVSX0ZMQUdTKSAtLSAkKFRFU1RfTE9HX0NPTVBJTEUpIFwKKwkiJCR0c3QiICQoQU1fVEVTVFNfRkRfUkVESVJFQ1QpCitAYW1fX0VYRUVYVF9UUlVFQC50ZXN0JChFWEVFWFQpLmxvZzoKK0BhbV9fRVhFRVhUX1RSVUVACUBwPSckPCc7IFwKK0BhbV9fRVhFRVhUX1RSVUVACSQoYW1fX3NldF9iKTsgXAorQGFtX19FWEVFWFRfVFJVRUAJJChhbV9fY2hlY2tfcHJlKSAkKFRFU1RfTE9HX0RSSVZFUikgLS10ZXN0LW5hbWUgIiQkZiIgXAorQGFtX19FWEVFWFRfVFJVRUAJLS1sb2ctZmlsZSAkJGIubG9nIC0tdHJzLWZpbGUgJCRiLnRycyBcCitAYW1fX0VYRUVYVF9UUlVFQAkkKGFtX19jb21tb25fZHJpdmVyX2ZsYWdzKSAkKEFNX1RFU1RfTE9HX0RSSVZFUl9GTEFHUykgJChURVNUX0xPR19EUklWRVJfRkxBR1MpIC0tICQoVEVTVF9MT0dfQ09NUElMRSkgXAorQGFtX19FWEVFWFRfVFJVRUAJIiQkdHN0IiAkKEFNX1RFU1RTX0ZEX1JFRElSRUNUKQorZGlzdGRpcjogJChCVUlMVF9TT1VSQ0VTKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3RkaXItYW0KKworZGlzdGRpci1hbTogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJChjaGVja19QUk9HUkFNUykKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1URVNUUworY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoTFRMSUJSQVJJRVMpICQoREFUQSkgJChIRUFERVJTKQoraW5zdGFsbC1iaW5QUk9HUkFNUzogaW5zdGFsbC1saWJMVExJQlJBUklFUworCitpbnN0YWxsLWNoZWNrUFJPR1JBTVM6IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKKworaW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQoYmluZGlyKSIgIiQoREVTVERJUikkKGxpYmRpcikiICIkKERFU1RESVIpJChwcm90b2RpcikiICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgICAgICBpbnN0YWxsOyBcCisJZWxzZSBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKKwlmaQorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChURVNUX0xPR1MpIiB8fCBybSAtZiAkKFRFU1RfTE9HUykKKwktdGVzdCAteiAiJChURVNUX0xPR1M6LmxvZz0udHJzKSIgfHwgcm0gLWYgJChURVNUX0xPR1M6LmxvZz0udHJzKQorCS10ZXN0IC16ICIkKFRFU1RfU1VJVEVfTE9HKSIgfHwgcm0gLWYgJChURVNUX1NVSVRFX0xPRykKKworY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BocC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9waHAvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5LyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKGFtX19kaXJzdGFtcCkKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisJLXRlc3QgLXogIiQoTUFJTlRBSU5FUkNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1iaW5QUk9HUkFNUyBjbGVhbi1jaGVja1BST0dSQU1TIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLWxpYnRvb2wgY2xlYW4tbG9jYWwgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwkJLXJtIC1mIC4vJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1ub193YXJuaW5nX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9hbnkuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvYW55LnBiLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2FueV9saXRlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2FwaS5wYi5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9hcmVuYS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9hcmVuYXN0cmluZy5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9hcmVuYXpfc2FtcGxlci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9kZXNjcmlwdG9yLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2Rlc2NyaXB0b3IucGIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZGVzY3JpcHRvcl9kYXRhYmFzZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9kdXJhdGlvbi5wYi5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9keW5hbWljX21lc3NhZ2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZW1wdHkucGIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZXh0ZW5zaW9uX3NldC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9leHRlbnNpb25fc2V0X2hlYXZ5LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2ZpZWxkX21hc2sucGIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZ2VuZXJhdGVkX2VudW1fdXRpbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9nZW5lcmF0ZWRfbWVzc2FnZV9iYXNlcy5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfZnVsbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9pbXBsaWNpdF93ZWFrX21lc3NhZ2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvaW5saW5lZF9zdHJpbmdfZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbWFwLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL21hcF9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9tZXNzYWdlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL21lc3NhZ2VfbGl0ZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtYW55X3Rlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tYXBfdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wYXJzZV9jb250ZXh0LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueV90ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtcmVmbGVjdGlvbl90ZXN0ZXIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWxfbGl0ZS5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWxpdGVfYXJlbmFfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXRlc3RfdXRpbF9saXRlLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9saXRlLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC1saXRlX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC10ZXN0X3V0aWxfbGl0ZS5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFueV90ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYV90ZXN0X3V0aWwuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFyZW5hX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYXN0cmluZ191bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYXJlbmF6X3NhbXBsZXJfdGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2ZpZWxkX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF90ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW5vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfbGl0ZV91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fdGVzdGVyLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWxfbGl0ZS5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGV4dF9mb3JtYXRfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXdlbGxfa25vd25fdHlwZXNfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcmVmbGVjdGlvbl9vcHMuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcmVwZWF0ZWRfZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcmVwZWF0ZWRfcHRyX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3NlcnZpY2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvc291cmNlX2NvbnRleHQucGIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvc3RydWN0LnBiLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3RleHRfZm9ybWF0LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3RpbWVzdGFtcC5wYi5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS90eXBlLnBiLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Vua25vd25fZmllbGRfc2V0LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3dpcmVfZm9ybWF0LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3dpcmVfZm9ybWF0X2xpdGUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvd3JhcHBlcnMucGIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvY29kZV9nZW5lcmF0b3IuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvY29tbWFuZF9saW5lX2ludGVyZmFjZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9pbXBvcnRlci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9tYWluLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcGFyc2VyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3BsdWdpbi5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wbHVnaW4ucGIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbm5vdGF0aW9uX3Rlc3RfdXRpbC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW1wb3J0ZXJfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3IuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3N1YnByb2Nlc3MuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvdGVzdF9wbHVnaW4tbW9ja19jb2RlX2dlbmVyYXRvci5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvemlwX3dyaXRlci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvZW51bS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvZW51bV9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvZXh0ZW5zaW9uLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvZmlsZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvZ2VuZXJhdG9yLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9oZWxwZXJzLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9tYXBfZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL21lc3NhZ2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL21lc3NhZ2VfZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3BhZGRpbmdfb3B0aW1pemVyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wYXJzZV9mdW5jdGlvbl9nZW5lcmF0b3IuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3ByaW1pdGl2ZV9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYm9vdHN0cmFwX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9zaXplX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWV0YWRhdGFfdGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1vdmVfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3NlcnZpY2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3N0cmluZ19maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX2RvY19jb21tZW50LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfZW51bS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX2VudW1fZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9maWVsZF9iYXNlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfZ2VuZXJhdG9yLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfaGVscGVycy5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX21hcF9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX21lc3NhZ2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9tZXNzYWdlX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfcHJpbWl0aXZlX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfcmVmbGVjdGlvbl9jbGFzcy5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9yZXBlYXRlZF9tZXNzYWdlX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfcmVwZWF0ZWRfcHJpbWl0aXZlX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfc291cmNlX2dlbmVyYXRvcl9iYXNlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfd3JhcHBlcl9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jc2hhcnBfYm9vdHN0cmFwX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvY29udGV4dC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2RvY19jb21tZW50LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvZW51bS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2VudW1fZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9lbnVtX2ZpZWxkX2xpdGUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9lbnVtX2xpdGUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9leHRlbnNpb24uUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9leHRlbnNpb25fbGl0ZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvZmlsZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2dlbmVyYXRvci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2dlbmVyYXRvcl9mYWN0b3J5LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvaGVscGVycy5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2tvdGxpbl9nZW5lcmF0b3IuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tYXBfZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tYXBfZmllbGRfbGl0ZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL21lc3NhZ2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tZXNzYWdlX2J1aWxkZXIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tZXNzYWdlX2J1aWxkZXJfbGl0ZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL21lc3NhZ2VfZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tZXNzYWdlX2ZpZWxkX2xpdGUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tZXNzYWdlX2xpdGUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9uYW1lX3Jlc29sdmVyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvcHJpbWl0aXZlX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvcHJpbWl0aXZlX2ZpZWxkX2xpdGUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRvY19jb21tZW50X3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvc2VydmljZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3NoYXJlZF9jb2RlX2dlbmVyYXRvci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3N0cmluZ19maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3N0cmluZ19maWVsZF9saXRlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19lbnVtLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19lbnVtX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19leHRlbnNpb24uUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9vYmplY3RpdmVjX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19maWxlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19nZW5lcmF0b3IuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9vYmplY3RpdmVjX2hlbHBlcnMuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9vYmplY3RpdmVjX21hcF9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfbWVzc2FnZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfb25lb2YuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9vYmplY3RpdmVjX3ByaW1pdGl2ZV9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtb2JqZWN0aXZlY19oZWxwZXJzX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9waHAvJChERVBESVIpL3BocF9nZW5lcmF0b3IuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vJChERVBESVIpL2dlbmVyYXRvci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKERFUERJUikvaGVscGVycy5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKERFUERJUikvcHlpX2dlbmVyYXRvci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcnVieV9nZW5lcmF0b3JfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvJChERVBESVIpL3J1YnlfZ2VuZXJhdG9yLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL2NvZGVkX3N0cmVhbS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9nemlwX3N0cmVhbS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9pb193aW4zMi5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9wcmludGVyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC1pb193aW4zMl91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJpbnRlcl91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvc3RydG9kLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Rva2VuaXplci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS96ZXJvX2NvcHlfc3RyZWFtLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3plcm9fY29weV9zdHJlYW1faW1wbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9ieXRlc3RyZWFtLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL2NvbW1vbi5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9pbnQxMjguUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1ieXRlc3RyZWFtX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jb21tb25fdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWludDEyOF91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0YXR1c29yX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cmluZ3BpZWNlX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJpbmdwcmludGZfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RydXRpbF91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGltZV90ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvc3RhdHVzLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3N0YXR1c29yLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3N0cmluZ3BpZWNlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3N0cmluZ3ByaW50Zi5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9zdHJ1Y3R1cmFsbHlfdmFsaWQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvc3RydXRpbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9zdWJzdGl0dXRlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3RpbWUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWxlLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpbGUuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ29vZ2xldGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvdGVzdF9wbHVnaW4tZmlsZS5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvemNndW56aXAuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3pjZ3ppcC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvZGVsaW1pdGVkX21lc3NhZ2VfdXRpbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL2ZpZWxkX2NvbXBhcmF0b3IuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9maWVsZF9tYXNrX3V0aWwuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9qc29uX3V0aWwuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9tZXNzYWdlX2RpZmZlcmVuY2VyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWpzb25fZm9ybWF0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtanNvbl9mb3JtYXQucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWxpbWl0ZWRfbWVzc2FnZV91dGlsX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZmllbGRfY29tcGFyYXRvcl90ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2tfdXRpbF90ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX3V0aWxfdGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGltZV91dGlsX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3RpbWVfdXRpbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3R5cGVfcmVzb2x2ZXJfdXRpbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL2RhdGFwaWVjZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvZXJyb3JfbGlzdGVuZXIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9maWVsZF9tYXNrX3V0aWxpdHkuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9qc29uX2VzY2FwaW5nLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvanNvbl9vYmplY3R3cml0ZXIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9qc29uX3N0cmVhbV9wYXJzZXIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9vYmplY3Rfd3JpdGVyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9fd3JpdGVyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fb2JqZWN0d3JpdGVyX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdHlwZV9pbmZvX3Rlc3RfaGVscGVyLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS90eXBlX2luZm8uUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS91dGlsaXR5LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWFueXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1ib29rcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1maWVsZF9tYXNrLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW9uZW9mcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXByb3RvMy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXN0cnVjdC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXdyYXBwZXJzLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hbnlzLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1ib29rcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWVsZF9tYXNrLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBzLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1vbmVvZnMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXByb3RvMy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXdyYXBwZXJzLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFueXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYm9va3MucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZmllbGRfbWFzay5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBzLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW9uZW9mcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RydWN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC13cmFwcGVycy5wYi5QbworCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2h0bWwtYW06CisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW5vYmFzZV9kaXN0X3Byb3RvREFUQSBcCisJaW5zdGFsbC1ub2Jhc2VfaW5jbHVkZUhFQURFUlMKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1saWJMVExJQlJBUklFUworCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwkJLXJtIC1mIC4vJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1ub193YXJuaW5nX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9hbnkuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvYW55LnBiLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2FueV9saXRlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2FwaS5wYi5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9hcmVuYS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9hcmVuYXN0cmluZy5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9hcmVuYXpfc2FtcGxlci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9kZXNjcmlwdG9yLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2Rlc2NyaXB0b3IucGIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZGVzY3JpcHRvcl9kYXRhYmFzZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9kdXJhdGlvbi5wYi5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9keW5hbWljX21lc3NhZ2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZW1wdHkucGIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZXh0ZW5zaW9uX3NldC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9leHRlbnNpb25fc2V0X2hlYXZ5LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2ZpZWxkX21hc2sucGIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZ2VuZXJhdGVkX2VudW1fdXRpbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9nZW5lcmF0ZWRfbWVzc2FnZV9iYXNlcy5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfZnVsbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9pbXBsaWNpdF93ZWFrX21lc3NhZ2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvaW5saW5lZF9zdHJpbmdfZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbWFwLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL21hcF9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9tZXNzYWdlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL21lc3NhZ2VfbGl0ZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtYW55X3Rlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwX3Byb3RvMl91bml0dGVzdC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1tYXBfdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmEucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wYXJzZV9jb250ZXh0LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWFueV90ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWFwX3VuaXR0ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtcmVmbGVjdGlvbl90ZXN0ZXIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWwuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10ZXN0X3V0aWxfbGl0ZS5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfYXJlbmEucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9lbXB0eS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnQucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfbXNldC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC11bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtYXJlbmFfdGVzdF91dGlsLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LWxpdGVfYXJlbmFfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3QtbWFwX2xpdGVfdGVzdF91dGlsLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LW1hcF9saXRlX3VuaXR0ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXRlc3RfdXRpbF9saXRlLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdC11bml0dGVzdF9saXRlLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LWFyZW5hX3Rlc3RfdXRpbC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC1saXRlX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfbGl0ZV90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC1tYXBfbGl0ZV91bml0dGVzdC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC10ZXN0X3V0aWxfbGl0ZS5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX2xpdGVfdGVzdC11bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl9saXRlX3Rlc3QtdW5pdHRlc3RfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYW55X3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFueV90ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYV90ZXN0X3V0aWwuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFyZW5hX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hcmVuYXN0cmluZ191bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYXJlbmF6X3NhbXBsZXJfdGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVzY3JpcHRvcl91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWV4dGVuc2lvbl9zZXRfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWdlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZV90ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2ZpZWxkX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9saXRlX3Rlc3RfdXRpbC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWFwX2xpdGVfdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF9wcm90bzJfdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1hcF90ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBfdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW5vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG8zX2FyZW5hX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzNfbGl0ZV91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXJlZmxlY3Rpb25fdGVzdGVyLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1yZXBlYXRlZF9maWVsZF91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVzdF91dGlsLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X3V0aWxfbGl0ZS5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGV4dF9mb3JtYXRfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9hcmVuYS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfZW1wdHkucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvMy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcHJvdG9idWZfdGVzdC11bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0X3Byb3RvM19vcHRpb25hbC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXdlbGxfa25vd25fdHlwZXNfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXdpcmVfZm9ybWF0X3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcmVmbGVjdGlvbl9vcHMuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcmVwZWF0ZWRfZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvcmVwZWF0ZWRfcHRyX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3NlcnZpY2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvc291cmNlX2NvbnRleHQucGIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvc3RydWN0LnBiLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3RleHRfZm9ybWF0LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3RpbWVzdGFtcC5wYi5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmLyQoREVQRElSKS90eXBlLnBiLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3Vua25vd25fZmllbGRfc2V0LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3dpcmVfZm9ybWF0LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvJChERVBESVIpL3dpcmVfZm9ybWF0X2xpdGUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi8kKERFUERJUikvd3JhcHBlcnMucGIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvY29kZV9nZW5lcmF0b3IuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvY29tbWFuZF9saW5lX2ludGVyZmFjZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9pbXBvcnRlci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9tYWluLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcGFyc2VyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3BsdWdpbi5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wbHVnaW4ucGIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvcHJvdG9idWZfdGVzdC1hbm5vdGF0aW9uX3Rlc3RfdXRpbC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtaW1wb3J0ZXJfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1vY2tfY29kZV9nZW5lcmF0b3IuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBhcnNlcl91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3N1YnByb2Nlc3MuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvdGVzdF9wbHVnaW4tbW9ja19jb2RlX2dlbmVyYXRvci5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvJChERVBESVIpL3Rlc3RfcGx1Z2luLXRlc3RfcGx1Z2luLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci8kKERFUERJUikvemlwX3dyaXRlci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvZW51bS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvZW51bV9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvZXh0ZW5zaW9uLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvZmlsZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvZ2VuZXJhdG9yLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9oZWxwZXJzLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9tYXBfZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL21lc3NhZ2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL21lc3NhZ2VfZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3BhZGRpbmdfb3B0aW1pemVyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wYXJzZV9mdW5jdGlvbl9nZW5lcmF0b3IuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3ByaW1pdGl2ZV9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXVuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYm9vdHN0cmFwX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWVzc2FnZV9zaXplX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtbWV0YWRhdGFfdGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1vdmVfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC8kKERFUERJUikvcHJvdG9idWZfdGVzdC10ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXVuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3NlcnZpY2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvJChERVBESVIpL3N0cmluZ19maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX2RvY19jb21tZW50LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfZW51bS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX2VudW1fZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9maWVsZF9iYXNlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfZ2VuZXJhdG9yLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfaGVscGVycy5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX21hcF9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX21lc3NhZ2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9tZXNzYWdlX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfcHJpbWl0aXZlX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfcmVmbGVjdGlvbl9jbGFzcy5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL2NzaGFycF9yZXBlYXRlZF9tZXNzYWdlX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfcmVwZWF0ZWRfcHJpbWl0aXZlX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfc291cmNlX2dlbmVyYXRvcl9iYXNlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwLyQoREVQRElSKS9jc2hhcnBfd3JhcHBlcl9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jc2hhcnBfYm9vdHN0cmFwX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvY29udGV4dC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2RvY19jb21tZW50LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvZW51bS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2VudW1fZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9lbnVtX2ZpZWxkX2xpdGUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9lbnVtX2xpdGUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9leHRlbnNpb24uUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9leHRlbnNpb25fbGl0ZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvZmlsZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2dlbmVyYXRvci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2dlbmVyYXRvcl9mYWN0b3J5LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvaGVscGVycy5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL2tvdGxpbl9nZW5lcmF0b3IuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tYXBfZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tYXBfZmllbGRfbGl0ZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL21lc3NhZ2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tZXNzYWdlX2J1aWxkZXIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tZXNzYWdlX2J1aWxkZXJfbGl0ZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL21lc3NhZ2VfZmllbGQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tZXNzYWdlX2ZpZWxkX2xpdGUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9tZXNzYWdlX2xpdGUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9uYW1lX3Jlc29sdmVyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvcHJpbWl0aXZlX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvcHJpbWl0aXZlX2ZpZWxkX2xpdGUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWRvY19jb21tZW50X3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXBsdWdpbl91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS8kKERFUERJUikvc2VydmljZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3NoYXJlZF9jb2RlX2dlbmVyYXRvci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3N0cmluZ19maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvJChERVBESVIpL3N0cmluZ19maWVsZF9saXRlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19lbnVtLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19lbnVtX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19leHRlbnNpb24uUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9vYmplY3RpdmVjX2ZpZWxkLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19maWxlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy8kKERFUERJUikvb2JqZWN0aXZlY19nZW5lcmF0b3IuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9vYmplY3RpdmVjX2hlbHBlcnMuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9vYmplY3RpdmVjX21hcF9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfbWVzc2FnZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL29iamVjdGl2ZWNfb25lb2YuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjLyQoREVQRElSKS9vYmplY3RpdmVjX3ByaW1pdGl2ZV9maWVsZC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtb2JqZWN0aXZlY19oZWxwZXJzX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9waHAvJChERVBESVIpL3BocF9nZW5lcmF0b3IuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vJChERVBESVIpL2dlbmVyYXRvci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKERFUERJUikvaGVscGVycy5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wbHVnaW5fdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi8kKERFUERJUikvcHlpX2dlbmVyYXRvci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcnVieV9nZW5lcmF0b3JfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvJChERVBESVIpL3J1YnlfZ2VuZXJhdG9yLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL2NvZGVkX3N0cmVhbS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9nemlwX3N0cmVhbS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9pb193aW4zMi5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS9wcmludGVyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtY29kZWRfc3RyZWFtX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC1pb193aW4zMl91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJpbnRlcl91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdG9rZW5pemVyX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvcHJvdG9idWZfdGVzdC16ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9pby8kKERFUERJUikvc3RydG9kLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3Rva2VuaXplci5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS96ZXJvX2NvcHlfc3RyZWFtLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvaW8vJChERVBESVIpL3plcm9fY29weV9zdHJlYW1faW1wbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL2lvLyQoREVQRElSKS96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9ieXRlc3RyZWFtLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL2NvbW1vbi5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9pbnQxMjguUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1ieXRlc3RyZWFtX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1jb21tb25fdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWludDEyOF91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RhdHVzX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0YXR1c29yX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cmluZ3BpZWNlX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvcHJvdG9idWZfdGVzdC1zdHJpbmdwcmludGZfdW5pdHRlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXN0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RydXRpbF91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGVtcGxhdGVfdXRpbF91bml0dGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGltZV90ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvc3RhdHVzLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3N0YXR1c29yLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3N0cmluZ3BpZWNlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3N0cmluZ3ByaW50Zi5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9zdHJ1Y3R1cmFsbHlfdmFsaWQuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi9zdHVicy8kKERFUERJUikvc3RydXRpbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzLyQoREVQRElSKS9zdWJzdGl0dXRlLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvc3R1YnMvJChERVBESVIpL3RpbWUuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWxlLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1nb29nbGV0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpbGUuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZ29vZ2xldGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvdGVzdF9wbHVnaW4tZmlsZS5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdGVzdGluZy8kKERFUERJUikvemNndW56aXAuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvJChERVBESVIpL3pjZ3ppcC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvZGVsaW1pdGVkX21lc3NhZ2VfdXRpbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL2ZpZWxkX2NvbXBhcmF0b3IuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9maWVsZF9tYXNrX3V0aWwuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9qc29uX3V0aWwuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9tZXNzYWdlX2RpZmZlcmVuY2VyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWpzb25fZm9ybWF0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtanNvbl9mb3JtYXRfcHJvdG8zLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtanNvbl9mb3JtYXQucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWxpbWl0ZWRfbWVzc2FnZV91dGlsX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZmllbGRfY29tcGFyYXRvcl90ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWZpZWxkX21hc2tfdXRpbF90ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fZm9ybWF0X3Byb3RvMy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1qc29uX3V0aWxfdGVzdC5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW1lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdGltZV91dGlsX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3RpbWVfdXRpbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvJChERVBESVIpL3R5cGVfcmVzb2x2ZXJfdXRpbC5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL2RhdGFwaWVjZS5QbG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvZXJyb3JfbGlzdGVuZXIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9maWVsZF9tYXNrX3V0aWxpdHkuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9qc29uX2VzY2FwaW5nLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvanNvbl9vYmplY3R3cml0ZXIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9qc29uX3N0cmVhbV9wYXJzZXIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9vYmplY3Rfd3JpdGVyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9fd3JpdGVyLlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0LlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWpzb25fb2JqZWN0d3JpdGVyX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyX3Rlc3QuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtdHlwZV9pbmZvX3Rlc3RfaGVscGVyLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2UuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS90eXBlX2luZm8uUGxvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsLyQoREVQRElSKS91dGlsaXR5LlBsbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWFueXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1ib29rcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LWRlZmF1bHRfdmFsdWUucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL25vX3dhcm5pbmdfdGVzdC1maWVsZF9tYXNrLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9ub193YXJuaW5nX3Rlc3QtbWFwcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LW9uZW9mcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXByb3RvMy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXN0cnVjdC5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvbm9fd2FybmluZ190ZXN0LXdyYXBwZXJzLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1hbnlzLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1ib29rcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3QtZGVmYXVsdF92YWx1ZV90ZXN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1maWVsZF9tYXNrLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1tYXBzLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC1vbmVvZnMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXByb3RvMy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3Qtc3RydWN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdC10aW1lc3RhbXBfZHVyYXRpb24ucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0LXdyYXBwZXJzLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LWFueXMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtYm9va3MucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZGVmYXVsdF92YWx1ZS5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1kZWZhdWx0X3ZhbHVlX3Rlc3QucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3QtZmllbGRfbWFzay5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1tYXBzLnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LW9uZW9mcy5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC1wcm90bzMucGIuUG8KKwktcm0gLWYgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvJChERVBESVIpL3Byb3RvYnVmX3Rlc3Qtc3RydWN0LnBiLlBvCisJLXJtIC1mIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhLyQoREVQRElSKS9wcm90b2J1Zl90ZXN0LXRpbWVzdGFtcF9kdXJhdGlvbi5wYi5QbworCS1ybSAtZiBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS8kKERFUERJUikvcHJvdG9idWZfdGVzdC13cmFwcGVycy5wYi5QbworCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMgdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTIFwKKwl1bmluc3RhbGwtbm9iYXNlX2Rpc3RfcHJvdG9EQVRBIFwKKwl1bmluc3RhbGwtbm9iYXNlX2luY2x1ZGVIRUFERVJTCisKKy5NQUtFOiBjaGVjay1hbSBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBUQUdTIGFsbCBhbGwtYW0gYW0tLWRlcGZpbGVzIGNoZWNrIGNoZWNrLVRFU1RTIFwKKwljaGVjay1hbSBjbGVhbiBjbGVhbi1iaW5QUk9HUkFNUyBjbGVhbi1jaGVja1BST0dSQU1TIFwKKwljbGVhbi1nZW5lcmljIGNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLWxpYnRvb2wgY2xlYW4tbG9jYWwgXAorCWNzY29wZWxpc3QtYW0gY3RhZ3MgY3RhZ3MtYW0gZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIFwKKwlkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBcCisJZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgXAorCWluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIFwKKwlpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBcCisJaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLW1hbiBcCisJaW5zdGFsbC1ub2Jhc2VfZGlzdF9wcm90b0RBVEEgaW5zdGFsbC1ub2Jhc2VfaW5jbHVkZUhFQURFUlMgXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgXAorCXBkZiBwZGYtYW0gcHMgcHMtYW0gcmVjaGVjayB0YWdzIHRhZ3MtYW0gdW5pbnN0YWxsIFwKKwl1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWJpblBST0dSQU1TIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUyBcCisJdW5pbnN0YWxsLW5vYmFzZV9kaXN0X3Byb3RvREFUQSBcCisJdW5pbnN0YWxsLW5vYmFzZV9pbmNsdWRlSEVBREVSUworCisuUFJFQ0lPVVM6IE1ha2VmaWxlCisKKworIyBOb3Qgc3VyZSB3aHkgdGhlc2UgZG9uJ3QgZ2V0IGNsZWFuZWQgYXV0b21hdGljYWxseS4KK2NsZWFuLWxvY2FsOgorCXJtIC1mICoubG9UCisKK0BVU0VfRVhURVJOQUxfUFJPVE9DX1RSVUVAdW5pdHRlc3RfcHJvdG9fbWlkZGxlbWFuOiAkKHByb3RvY19pbnB1dHMpCitAVVNFX0VYVEVSTkFMX1BST1RPQ19UUlVFQAkkKFBST1RPQykgLUkkKHNyY2RpcikgLS1jcHBfb3V0PS4gJF4KK0BVU0VfRVhURVJOQUxfUFJPVE9DX1RSVUVACXRvdWNoIHVuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbgorCisjIFdlIGhhdmUgdG8gY2QgdG8gJChzcmNkaXIpIGJlZm9yZSBleGVjdXRpbmcgcHJvdG9jIGJlY2F1c2UgJChwcm90b2NfaW5wdXRzKSBpcworIyByZWxhdGl2ZSB0byBzcmNkaXIsIHdoaWNoIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoZW4KKyMgYnVpbGRpbmcgb3V0LW9mLXRyZWUuCitAVVNFX0VYVEVSTkFMX1BST1RPQ19GQUxTRUB1bml0dGVzdF9wcm90b19taWRkbGVtYW46IHByb3RvYyQoRVhFRVhUKSAkKHByb3RvY19pbnB1dHMpCitAVVNFX0VYVEVSTkFMX1BST1RPQ19GQUxTRUAJb2xkcHdkPWBwd2RgICYmICggY2QgJChzcmNkaXIpICYmICQkb2xkcHdkL3Byb3RvYyQoRVhFRVhUKSAtSS4gLS1jcHBfb3V0PSQkb2xkcHdkICQocHJvdG9jX2lucHV0cykgLS1leHBlcmltZW50YWxfYWxsb3dfcHJvdG8zX29wdGlvbmFsICkKK0BVU0VfRVhURVJOQUxfUFJPVE9DX0ZBTFNFQAl0b3VjaCB1bml0dGVzdF9wcm90b19taWRkbGVtYW4KKworJChwcm90b2Nfb3V0cHV0cyk6IHVuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbgorJChhbV9wcm90b2J1Zl90ZXN0X09CSkVDVFMpOiB1bml0dGVzdF9wcm90b19taWRkbGVtYW4KKyQoYW1fcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfT0JKRUNUUyk6IHVuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbgorJChhbV9wcm90b2J1Zl9saXRlX3Rlc3RfT0JKRUNUUyk6IHVuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbgorJChhbV9wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfT0JKRUNUUyk6IHVuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbgorCisjIFRoaXMgdGVzdCB0YXJnZXQgaXMgdG8gZW5zdXJlIGFsbCBvdXIgcHVibGljIGhlYWRlciBmaWxlcyBhbmQgZ2VuZXJhdGVkCisjIGNvZGUgaXMgZnJlZSBmcm9tIHdhcm5pbmdzLiBXZSBoYXZlIHRvIGJlIG1vcmUgcGVkYW50aWMgYWJvdXQgdGhlc2UKKyMgZmlsZXMgYmVjYXVzZSB0aGV5IGFyZSBjb21waWxlZCBieSB1c2VycyB3aXRoIGRpZmZlcmVudCBjb21waWxlciBmbGFncy4KK25vX3dhcm5pbmdfdGVzdC5jYzoKKwllY2hvICIvLyBHZW5lcmF0ZWQgZnJvbSBNYWtlZmlsZS5hbSIgPiBub193YXJuaW5nX3Rlc3QuY2MKKwlmb3IgRklMRSBpbiAkKG5vYmFzZV9pbmNsdWRlX0hFQURFUlMpOyBkbyBcCisJCWNhc2UgJCRGSUxFIGluICouaW5jKSBjb250aW51ZTs7IGVzYWM7IFwKKwkJZWNobyAiI2luY2x1ZGUgPCQke0ZJTEV9PiIgPj4gbm9fd2FybmluZ190ZXN0LmNjOyBcCisJZG9uZQorCWVjaG8gImludCBtYWluKGludCwgY2hhcioqKSB7IHJldHVybiAwOyB9IiA+PiBub193YXJuaW5nX3Rlc3QuY2MKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvc3JjL1JFQURNRS5tZCBiL3NyYy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y4NDNkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SRUFETUUubWQKQEAgLTAsMCArMSwyMzQgQEAKK1Byb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisKK2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisKK0MrKyBJbnN0YWxsYXRpb24gLSBVbml4CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyBidWlsZCBwcm90b2J1ZiBmcm9tIHNvdXJjZSwgdGhlIGZvbGxvd2luZyB0b29scyBhcmUgbmVlZGVkOgorCisgICogYXV0b2NvbmYKKyAgKiBhdXRvbWFrZQorICAqIGxpYnRvb2wKKyAgKiBtYWtlCisgICogZysrCisgICogdW56aXAKKworT24gVWJ1bnR1L0RlYmlhbiwgeW91IGNhbiBpbnN0YWxsIHRoZW0gd2l0aDoKKworICAgIHN1ZG8gYXB0LWdldCBpbnN0YWxsIGF1dG9jb25mIGF1dG9tYWtlIGxpYnRvb2wgY3VybCBtYWtlIGcrKyB1bnppcAorCitPbiBvdGhlciBwbGF0Zm9ybXMsIHBsZWFzZSB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgcGFja2FnZSBtYW5hZ2luZyB0b29sIHRvCitpbnN0YWxsIHRoZW0gYmVmb3JlIHByb2NlZWRpbmcuCisKK1RvIGdldCB0aGUgc291cmNlLCBkb3dubG9hZCBvbmUgb2YgdGhlIHJlbGVhc2UgLnRhci5neiBvciAuemlwIHBhY2thZ2VzIGluIHRoZQorcmVsZWFzZSBwYWdlOgorCisgICAgaHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9yZWxlYXNlcy9sYXRlc3QKKworRm9yIGV4YW1wbGU6IGlmIHlvdSBvbmx5IG5lZWQgQysrLCBkb3dubG9hZCBgcHJvdG9idWYtY3BwLVtWRVJTSU9OXS50YXIuZ3pgOyBpZgoreW91IG5lZWQgQysrIGFuZCBKYXZhLCBkb3dubG9hZCBgcHJvdG9idWYtamF2YS1bVkVSU0lPTl0udGFyLmd6YCAoZXZlcnkgcGFja2FnZQorY29udGFpbnMgQysrIHNvdXJjZSBhbHJlYWR5KTsgaWYgeW91IG5lZWQgQysrIGFuZCBtdWx0aXBsZSBvdGhlciBsYW5ndWFnZXMsCitkb3dubG9hZCBgcHJvdG9idWYtYWxsLVtWRVJTSU9OXS50YXIuZ3pgLgorCitZb3UgY2FuIGFsc28gZ2V0IHRoZSBzb3VyY2UgYnkgImdpdCBjbG9uZSIgb3VyIGdpdCByZXBvc2l0b3J5LiBNYWtlIHN1cmUgeW91CitoYXZlIGFsc28gY2xvbmVkIHRoZSBzdWJtb2R1bGVzIGFuZCBnZW5lcmF0ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgKHNraXAgdGhpcworaWYgeW91IGFyZSB1c2luZyBhIHJlbGVhc2UgLnRhci5neiBvciAuemlwIHBhY2thZ2UpOgorCisgICAgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYuZ2l0CisgICAgY2QgcHJvdG9idWYKKyAgICBnaXQgc3VibW9kdWxlIHVwZGF0ZSAtLWluaXQgLS1yZWN1cnNpdmUKKyAgICAuL2F1dG9nZW4uc2gKKworVG8gYnVpbGQgYW5kIGluc3RhbGwgdGhlIEMrKyBQcm90b2NvbCBCdWZmZXIgcnVudGltZSBhbmQgdGhlIFByb3RvY29sCitCdWZmZXIgY29tcGlsZXIgKHByb3RvYykgZXhlY3V0ZSB0aGUgZm9sbG93aW5nOgorCisKKyAgICAgLi9jb25maWd1cmUKKyAgICAgbWFrZSAtaiQobnByb2MpICMgJChucHJvYykgZW5zdXJlcyBpdCB1c2VzIGFsbCBjb3JlcyBmb3IgY29tcGlsYXRpb24KKyAgICAgbWFrZSBjaGVjaworICAgICBzdWRvIG1ha2UgaW5zdGFsbAorICAgICBzdWRvIGxkY29uZmlnICMgcmVmcmVzaCBzaGFyZWQgbGlicmFyeSBjYWNoZS4KKworSWYgIm1ha2UgY2hlY2siIGZhaWxzLCB5b3UgY2FuIHN0aWxsIGluc3RhbGwsIGJ1dCBpdCBpcyBsaWtlbHkgdGhhdAorc29tZSBmZWF0dXJlcyBvZiB0aGlzIGxpYnJhcnkgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgb24geW91ciBzeXN0ZW0uCitQcm9jZWVkIGF0IHlvdXIgb3duIHJpc2suCisKK0ZvciBhZHZhbmNlZCB1c2FnZSBpbmZvcm1hdGlvbiBvbiBjb25maWd1cmUgYW5kIG1ha2UsIHBsZWFzZSByZWZlciB0byB0aGUKK2F1dG9jb25mIGRvY3VtZW50YXRpb246CisKKyAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYvbWFudWFsL2F1dG9jb25mLmh0bWwjUnVubmluZy1jb25maWd1cmUtU2NyaXB0cworCisqKkhpbnQgb24gaW5zdGFsbCBsb2NhdGlvbioqCisKK0J5IGRlZmF1bHQsIHRoZSBwYWNrYWdlIHdpbGwgYmUgaW5zdGFsbGVkIHRvIC91c3IvbG9jYWwuICBIb3dldmVyLAorb24gbWFueSBwbGF0Zm9ybXMsIC91c3IvbG9jYWwvbGliIGlzIG5vdCBwYXJ0IG9mIExEX0xJQlJBUllfUEFUSC4KK1lvdSBjYW4gYWRkIGl0LCBidXQgaXQgbWF5IGJlIGVhc2llciB0byBqdXN0IGluc3RhbGwgdG8gL3VzcgoraW5zdGVhZC4gIFRvIGRvIHRoaXMsIGludm9rZSBjb25maWd1cmUgYXMgZm9sbG93czoKKworICAgIC4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKKworSWYgeW91IGFscmVhZHkgYnVpbHQgdGhlIHBhY2thZ2Ugd2l0aCBhIGRpZmZlcmVudCBwcmVmaXgsIG1ha2Ugc3VyZQordG8gcnVuICJtYWtlIGNsZWFuIiBiZWZvcmUgYnVpbGRpbmcgYWdhaW4uCisKKyoqQ29tcGlsaW5nIGRlcGVuZGVudCBwYWNrYWdlcyoqCisKK1RvIGNvbXBpbGUgYSBwYWNrYWdlIHRoYXQgdXNlcyBQcm90b2NvbCBCdWZmZXJzLCB5b3UgbmVlZCB0byBwYXNzCit2YXJpb3VzIGZsYWdzIHRvIHlvdXIgY29tcGlsZXIgYW5kIGxpbmtlci4gIEFzIG9mIHZlcnNpb24gMi4yLjAsCitQcm90b2NvbCBCdWZmZXJzIGludGVncmF0ZXMgd2l0aCBwa2ctY29uZmlnIHRvIG1hbmFnZSB0aGlzLiAgSWYgeW91CitoYXZlIHBrZy1jb25maWcgaW5zdGFsbGVkLCB0aGVuIHlvdSBjYW4gaW52b2tlIGl0IHRvIGdldCBhIGxpc3Qgb2YKK2ZsYWdzIGxpa2Ugc286CisKKworICAgIHBrZy1jb25maWcgLS1jZmxhZ3MgcHJvdG9idWYgICAgICAgICAjIHByaW50IGNvbXBpbGVyIGZsYWdzCisgICAgcGtnLWNvbmZpZyAtLWxpYnMgcHJvdG9idWYgICAgICAgICAgICMgcHJpbnQgbGlua2VyIGZsYWdzCisgICAgcGtnLWNvbmZpZyAtLWNmbGFncyAtLWxpYnMgcHJvdG9idWYgICMgcHJpbnQgYm90aAorCisKK0ZvciBleGFtcGxlOgorCisgICAgYysrIG15X3Byb2dyYW0uY2MgbXlfcHJvdG8ucGIuY2MgYHBrZy1jb25maWcgLS1jZmxhZ3MgLS1saWJzIHByb3RvYnVmYAorCitOb3RlIHRoYXQgcGFja2FnZXMgd3JpdHRlbiBwcmlvciB0byB0aGUgMi4yLjAgcmVsZWFzZSBvZiBQcm90b2NvbAorQnVmZmVycyBtYXkgbm90IHlldCBpbnRlZ3JhdGUgd2l0aCBwa2ctY29uZmlnIHRvIGdldCBmbGFncywgYW5kIG1heQorbm90IHBhc3MgdGhlIGNvcnJlY3Qgc2V0IG9mIGZsYWdzIHRvIGNvcnJlY3RseSBsaW5rIGFnYWluc3QKK2xpYnByb3RvYnVmLiAgSWYgdGhlIHBhY2thZ2UgaW4gcXVlc3Rpb24gdXNlcyBhdXRvY29uZiwgeW91IGNhbgorb2Z0ZW4gZml4IHRoZSBwcm9ibGVtIGJ5IGludm9raW5nIGl0cyBjb25maWd1cmUgc2NyaXB0IGxpa2U6CisKKworICAgIGNvbmZpZ3VyZSBDWFhGTEFHUz0iJChwa2ctY29uZmlnIC0tY2ZsYWdzIHByb3RvYnVmKSIgXAorICAgICAgICAgICAgICBMSUJTPSIkKHBrZy1jb25maWcgLS1saWJzIHByb3RvYnVmKSIKKworVGhpcyB3aWxsIGZvcmNlIGl0IHRvIHVzZSB0aGUgY29ycmVjdCBmbGFncy4KKworSWYgeW91IGFyZSB3cml0aW5nIGFuIGF1dG9jb25mLWJhc2VkIHBhY2thZ2UgdGhhdCB1c2VzIFByb3RvY29sCitCdWZmZXJzLCB5b3Ugc2hvdWxkIHByb2JhYmx5IHVzZSB0aGUgUEtHX0NIRUNLX01PRFVMRVMgbWFjcm8gaW4geW91cgorY29uZmlndXJlIHNjcmlwdCBsaWtlOgorCisgICAgUEtHX0NIRUNLX01PRFVMRVMoW3Byb3RvYnVmXSwgW3Byb3RvYnVmXSkKKworU2VlIHRoZSBwa2ctY29uZmlnIG1hbiBwYWdlIGZvciBtb3JlIGluZm8uCisKK0lmIHlvdSBvbmx5IHdhbnQgcHJvdG9idWYtbGl0ZSwgc3Vic3RpdHV0ZSAicHJvdG9idWYtbGl0ZSIgaW4gcGxhY2UKK29mICJwcm90b2J1ZiIgaW4gdGhlc2UgZXhhbXBsZXMuCisKKyoqTm90ZSBmb3IgTWFjIHVzZXJzKioKKworRm9yIGEgTWFjIHN5c3RlbSwgVW5peCB0b29scyBhcmUgbm90IGF2YWlsYWJsZSBieSBkZWZhdWx0LiBZb3Ugd2lsbCBmaXJzdCBuZWVkCit0byBpbnN0YWxsIFhjb2RlIGZyb20gdGhlIE1hYyBBcHBTdG9yZSBhbmQgdGhlbiBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kIGZyb20KK2EgdGVybWluYWw6CisKKyAgICBzdWRvIHhjb2RlLXNlbGVjdCAtLWluc3RhbGwKKworVG8gaW5zdGFsbCBVbml4IHRvb2xzLCB5b3UgY2FuIGluc3RhbGwgInBvcnQiIGZvbGxvd2luZyB0aGUgaW5zdHJ1Y3Rpb25zIGF0CitodHRwczovL3d3dy5tYWNwb3J0cy5vcmcgLiBUaGlzIHdpbGwgcmVzaWRlIGluIC9vcHQvbG9jYWwvYmluL3BvcnQgZm9yIG1vc3QKK01hYyBpbnN0YWxsYXRpb25zLgorCisgICAgc3VkbyAvb3B0L2xvY2FsL2Jpbi9wb3J0IGluc3RhbGwgYXV0b2NvbmYgYXV0b21ha2UgbGlidG9vbAorCitBbHRlcm5hdGl2ZSBmb3IgSG9tZWJyZXcgdXNlcnM6CisKKyAgICBicmV3IGluc3RhbGwgYXV0b2NvbmYgYXV0b21ha2UgbGlidG9vbAorCitUaGVuIGZvbGxvdyB0aGUgVW5peCBpbnN0cnVjdGlvbnMgYWJvdmUuCisKKyoqTm90ZSBmb3IgY3Jvc3MtY29tcGlsaW5nKioKKworVGhlIG1ha2VmaWxlcyBub3JtYWxseSBpbnZva2UgdGhlIHByb3RvYyBleGVjdXRhYmxlIHRoYXQgdGhleSBqdXN0CitidWlsdCBpbiBvcmRlciB0byBidWlsZCB0ZXN0cy4gIFdoZW4gY3Jvc3MtY29tcGlsaW5nLCB0aGUgcHJvdG9jCitleGVjdXRhYmxlIG1heSBub3QgYmUgZXhlY3V0YWJsZSBvbiB0aGUgaG9zdCBtYWNoaW5lLiAgSW4gdGhpcyBjYXNlLAoreW91IG11c3QgYnVpbGQgYSBjb3B5IG9mIHByb3RvYyBmb3IgdGhlIGhvc3QgbWFjaGluZSBmaXJzdCwgdGhlbiB1c2UKK3RoZSAtLXdpdGgtcHJvdG9jIG9wdGlvbiB0byB0ZWxsIGNvbmZpZ3VyZSB0byB1c2UgaXQgaW5zdGVhZC4gIEZvcgorZXhhbXBsZToKKworICAgIC4vY29uZmlndXJlIC0td2l0aC1wcm90b2M9cHJvdG9jCisKK1RoaXMgd2lsbCB1c2UgdGhlIGluc3RhbGxlZCBwcm90b2MgKGZvdW5kIGluIHlvdXIgJFBBVEgpIGluc3RlYWQgb2YKK3RyeWluZyB0byBleGVjdXRlIHRoZSBvbmUgYnVpbHQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLiAgWW91IGNhbgorYWxzbyB1c2UgYW4gZXhlY3V0YWJsZSB0aGF0IGhhc24ndCBiZWVuIGluc3RhbGxlZC4gIEZvciBleGFtcGxlLCBpZgoreW91IGJ1aWx0IHRoZSBwcm90b2J1ZiBwYWNrYWdlIGZvciB5b3VyIGhvc3QgbWFjaGluZSBpbiAuLi9ob3N0LAoreW91IG1pZ2h0IGRvOgorCisgICAgLi9jb25maWd1cmUgLS13aXRoLXByb3RvYz0uLi9ob3N0L3NyYy9wcm90b2MKKworRWl0aGVyIHdheSwgeW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIHByb3RvYyBleGVjdXRhYmxlIHlvdSB1c2UKK2hhcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHRoZSBwcm90b2J1ZiBzb3VyY2UgY29kZSB5b3UgYXJlIHRyeWluZyB0bwordXNlIGl0IHdpdGguCisKKyoqTm90ZSBmb3IgU29sYXJpcyB1c2VycyoqCisKK1NvbGFyaXMgMTAgeDg2IGhhcyBhIGJ1ZyB0aGF0IHdpbGwgbWFrZSBsaW5raW5nIGZhaWwsIGNvbXBsYWluaW5nCithYm91dCBsaWJzdGRjKysubGEgYmVpbmcgaW52YWxpZC4gIFdlIGhhdmUgaW5jbHVkZWQgYSB3b3JrLWFyb3VuZAoraW4gdGhpcyBwYWNrYWdlLiAgVG8gdXNlIHRoZSB3b3JrLWFyb3VuZCwgcnVuIGNvbmZpZ3VyZSBhcyBmb2xsb3dzOgorCisgICAgLi9jb25maWd1cmUgTERGTEFHUz0tTCRQV0Qvc3JjL3NvbGFyaXMKKworU2VlIHNyYy9zb2xhcmlzL2xpYnN0ZGMrKy5sYSBmb3IgbW9yZSBpbmZvIG9uIHRoaXMgYnVnLgorCisqKk5vdGUgZm9yIEhQIEMrKyBUcnU2NCB1c2VycyoqCisKK1RvIGNvbXBpbGUgaW52b2tlIGNvbmZpZ3VyZSBhcyBmb2xsb3dzOgorCisgICAgLi9jb25maWd1cmUgQ1hYRkxBR1M9Ii1PIC1zdGQgYW5zaSAtaWVlZSAtRF9fVVNFX1NURF9JT1NUUkVBTSIKKworQWxzbywgeW91IHdpbGwgbmVlZCB0byB1c2UgZ21ha2UgaW5zdGVhZCBvZiBtYWtlLgorCisqKk5vdGUgZm9yIEFJWCB1c2VycyoqCisKK0NvbXBpbGUgdXNpbmcgdGhlIElCTSB4bEMgQysrIGNvbXBpbGVyIGFzIGZvbGxvd3M6CisKKyAgICAuL2NvbmZpZ3VyZSBDWFg9eGxDCisKK0Fsc28sIHlvdSB3aWxsIG5lZWQgdG8gdXNlIEdOVSBgbWFrZWAgKGBnbWFrZWApIGluc3RlYWQgb2YgQUlYIGBtYWtlYC4KKworQysrIEluc3RhbGxhdGlvbiAtIFdpbmRvd3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBvbmx5IG5lZWQgdGhlIHByb3RvYyBiaW5hcnksIHlvdSBjYW4gZG93bmxvYWQgaXQgZnJvbSB0aGUgcmVsZWFzZQorcGFnZToKKworICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvcmVsZWFzZXMvbGF0ZXN0CisKK0luIHRoZSBkb3dubG9hZHMgc2VjdGlvbiwgZG93bmxvYWQgdGhlIHppcCBmaWxlIHByb3RvYy0kVkVSU0lPTi13aW4zMi56aXAuCitJdCBjb250YWlucyB0aGUgcHJvdG9jIGJpbmFyeSBhcyB3ZWxsIGFzIHB1YmxpYyBwcm90byBmaWxlcyBvZiBwcm90b2J1ZgorbGlicmFyeS4KKworUHJvdG9idWYgYW5kIGl0cyBkZXBlbmRlbmNpZXMgY2FuIGJlIGluc3RhbGxlZCBkaXJlY3RseSBieSB1c2luZyBgdmNwa2dgOgorCisgICAgPnZjcGtnIGluc3RhbGwgcHJvdG9idWYgcHJvdG9idWY6eDY0LXdpbmRvd3MKKworSWYgemxpYiBzdXBwb3J0IGlzIGRlc2lyZWQsIHlvdSdsbCBhbHNvIG5lZWQgdG8gaW5zdGFsbCB0aGUgemxpYiBmZWF0dXJlOgorCisgICAgPnZjcGtnIGluc3RhbGwgcHJvdG9idWZbemxpYl0gcHJvdG9idWZbemxpYl06eDY0LXdpbmRvd3MKKworU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvdmNwa2cgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK1RvIGJ1aWxkIGZyb20gc291cmNlIHVzaW5nIE1pY3Jvc29mdCBWaXN1YWwgQysrLCBzZWUgW2NtYWtlL1JFQURNRS5tZF0oLi4vY21ha2UvUkVBRE1FLm1kKS4KKworVG8gYnVpbGQgZnJvbSBzb3VyY2UgdXNpbmcgQ3lnd2luIG9yIE1pbkdXLCBmb2xsb3cgdGhlIFVuaXggaW5zdGFsbGF0aW9uCitpbnN0cnVjdGlvbnMsIGFib3ZlLgorCitCaW5hcnkgQ29tcGF0aWJpbGl0eSBXYXJuaW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0R1ZSB0byB0aGUgbmF0dXJlIG9mIEMrKywgaXQgaXMgdW5saWtlbHkgdGhhdCBhbnkgdHdvIHZlcnNpb25zIG9mIHRoZQorUHJvdG9jb2wgQnVmZmVycyBDKysgcnVudGltZSBsaWJyYXJpZXMgd2lsbCBoYXZlIGNvbXBhdGlibGUgQUJJcy4KK1RoYXQgaXMsIGlmIHlvdSBsaW5rZWQgYW4gZXhlY3V0YWJsZSBhZ2FpbnN0IGFuIG9sZGVyIHZlcnNpb24gb2YKK2xpYnByb3RvYnVmLCBpdCBpcyB1bmxpa2VseSB0byB3b3JrIHdpdGggYSBuZXdlciB2ZXJzaW9uIHdpdGhvdXQKK3JlLWNvbXBpbGluZy4gIFRoaXMgcHJvYmxlbSwgd2hlbiBpdCBvY2N1cnMsIHdpbGwgbm9ybWFsbHkgYmUgZGV0ZWN0ZWQKK2ltbWVkaWF0ZWx5IG9uIHN0YXJ0dXAgb2YgeW91ciBhcHAuICBTdGlsbCwgeW91IG1heSB3YW50IHRvIGNvbnNpZGVyCit1c2luZyBzdGF0aWMgbGlua2FnZS4gIFlvdSBjYW4gY29uZmlndXJlIHRoaXMgcGFja2FnZSB0byBpbnN0YWxsCitzdGF0aWMgbGlicmFyaWVzIG9ubHkgdXNpbmc6CisKKyAgICAuL2NvbmZpZ3VyZSAtLWRpc2FibGUtc2hhcmVkCisKK1VzYWdlCistLS0tLQorCitUaGUgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBmb3IgUHJvdG9jb2wgQnVmZmVycyBpcyBhdmFpbGFibGUgdmlhIHRoZQord2ViIGF0OgorCitodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FueS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDZmYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkuY2MKQEAgLTAsMCArMSw4MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYW55Lmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2Jvb2wgQW55TWV0YWRhdGE6OlBhY2tGcm9tKEFyZW5hKiBhcmVuYSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICByZXR1cm4gUGFja0Zyb20oYXJlbmEsIG1lc3NhZ2UsIGtUeXBlR29vZ2xlQXBpc0NvbVByZWZpeCk7Cit9CisKK2Jvb2wgQW55TWV0YWRhdGE6OlBhY2tGcm9tKEFyZW5hKiBhcmVuYSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIHR5cGVfdXJsX3ByZWZpeCkgeworICB0eXBlX3VybF8tPlNldCgKKyAgICAgIEdldFR5cGVVcmwobWVzc2FnZS5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpLCB0eXBlX3VybF9wcmVmaXgpLCBhcmVuYSk7CisgIHJldHVybiBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKHZhbHVlXy0+TXV0YWJsZShhcmVuYSkpOworfQorCitib29sIEFueU1ldGFkYXRhOjpVbnBhY2tUbyhNZXNzYWdlKiBtZXNzYWdlKSBjb25zdCB7CisgIGlmICghSW50ZXJuYWxJcyhtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gbWVzc2FnZS0+UGFyc2VGcm9tU3RyaW5nKHZhbHVlXy0+R2V0KCkpOworfQorCitib29sIEdldEFueUZpZWxkRGVzY3JpcHRvcnMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqKiB0eXBlX3VybF9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqKiB2YWx1ZV9maWVsZCkgeworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisgIGlmIChkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSAhPSBrQW55RnVsbFR5cGVOYW1lKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgICp0eXBlX3VybF9maWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TnVtYmVyKDEpOworICAqdmFsdWVfZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU51bWJlcigyKTsKKyAgcmV0dXJuICgqdHlwZV91cmxfZmllbGQgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICgqdHlwZV91cmxfZmllbGQpLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAmJgorICAgICAgICAgICp2YWx1ZV9maWVsZCAhPSBudWxscHRyICYmCisgICAgICAgICAgKCp2YWx1ZV9maWVsZCktPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvYW55LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlYTJiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvYW55LmgKQEAgLTAsMCArMSwxNTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9BTllfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BTllfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitjbGFzcyBGaWVsZERlc2NyaXB0b3I7CitjbGFzcyBNZXNzYWdlOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitleHRlcm4gY29uc3QgY2hhciBrQW55RnVsbFR5cGVOYW1lW107ICAgICAgICAgIC8vICJnb29nbGUucHJvdG9idWYuQW55Ii4KK2V4dGVybiBjb25zdCBjaGFyIGtUeXBlR29vZ2xlQXBpc0NvbVByZWZpeFtdOyAgLy8gInR5cGUuZ29vZ2xlYXBpcy5jb20vIi4KK2V4dGVybiBjb25zdCBjaGFyIGtUeXBlR29vZ2xlUHJvZENvbVByZWZpeFtdOyAgLy8gInR5cGUuZ29vZ2xlcHJvZC5jb20vIi4KKworc3RkOjpzdHJpbmcgR2V0VHlwZVVybChTdHJpbmdQaWVjZSBtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIHR5cGVfdXJsX3ByZWZpeCk7CisKKy8vIEhlbHBlciBjbGFzcyB1c2VkIHRvIGltcGxlbWVudCBnb29nbGU6OnByb3RvYnVmOjpBbnkuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgQW55TWV0YWRhdGEgeworICB0eXBlZGVmIEFyZW5hU3RyaW5nUHRyIFVybFR5cGU7CisgIHR5cGVkZWYgQXJlbmFTdHJpbmdQdHIgVmFsdWVUeXBlOworIHB1YmxpYzoKKyAgLy8gQW55TWV0YWRhdGEgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgInR5cGVfdXJsIiBhbmQgInZhbHVlIi4KKyAgY29uc3RleHByIEFueU1ldGFkYXRhKFVybFR5cGUqIHR5cGVfdXJsLCBWYWx1ZVR5cGUqIHZhbHVlKQorICAgICAgOiB0eXBlX3VybF8odHlwZV91cmwpLCB2YWx1ZV8odmFsdWUpIHt9CisKKyAgLy8gUGFja3MgYSBtZXNzYWdlIHVzaW5nIHRoZSBkZWZhdWx0IHR5cGUgVVJMIHByZWZpeDogInR5cGUuZ29vZ2xlYXBpcy5jb20iLgorICAvLyBUaGUgcmVzdWx0ZWQgdHlwZSBVUkwgd2lsbCBiZSAidHlwZS5nb29nbGVhcGlzLmNvbS88bWVzc2FnZV9mdWxsX25hbWU+Ii4KKyAgLy8gUmV0dXJucyBmYWxzZSBpZiBzZXJpYWxpemluZyB0aGUgbWVzc2FnZSBmYWlsZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBib29sIFBhY2tGcm9tKEFyZW5hKiBhcmVuYSwgY29uc3QgVCYgbWVzc2FnZSkgeworICAgIHJldHVybiBJbnRlcm5hbFBhY2tGcm9tKGFyZW5hLCBtZXNzYWdlLCBrVHlwZUdvb2dsZUFwaXNDb21QcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDo6RnVsbE1lc3NhZ2VOYW1lKCkpOworICB9CisKKyAgYm9vbCBQYWNrRnJvbShBcmVuYSogYXJlbmEsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworCisgIC8vIFBhY2tzIGEgbWVzc2FnZSB1c2luZyB0aGUgZ2l2ZW4gdHlwZSBVUkwgcHJlZml4LiBUaGUgdHlwZSBVUkwgd2lsbCBiZQorICAvLyBjb25zdHJ1Y3RlZCBieSBjb25jYXRlbmF0aW5nIHRoZSBtZXNzYWdlIHR5cGUncyBmdWxsIG5hbWUgdG8gdGhlIHByZWZpeAorICAvLyB3aXRoIGFuIG9wdGlvbmFsICIvIiBzZXBhcmF0b3IgaWYgdGhlIHByZWZpeCBkb2Vzbid0IGFscmVhZHkgZW5kIHdpdGggIi8iLgorICAvLyBGb3IgZXhhbXBsZSwgYm90aCBQYWNrRnJvbShtZXNzYWdlLCAidHlwZS5nb29nbGVhcGlzLmNvbSIpIGFuZAorICAvLyBQYWNrRnJvbShtZXNzYWdlLCAidHlwZS5nb29nbGVhcGlzLmNvbS8iKSB5aWVsZCB0aGUgc2FtZSByZXN1bHQgdHlwZQorICAvLyBVUkw6ICJ0eXBlLmdvb2dsZWFwaXMuY29tLzxtZXNzYWdlX2Z1bGxfbmFtZT4iLgorICAvLyBSZXR1cm5zIGZhbHNlIGlmIHNlcmlhbGl6aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGJvb2wgUGFja0Zyb20oQXJlbmEqIGFyZW5hLCBjb25zdCBUJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIHR5cGVfdXJsX3ByZWZpeCkgeworICAgIHJldHVybiBJbnRlcm5hbFBhY2tGcm9tKGFyZW5hLCBtZXNzYWdlLCB0eXBlX3VybF9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDo6RnVsbE1lc3NhZ2VOYW1lKCkpOworICB9CisKKyAgYm9vbCBQYWNrRnJvbShBcmVuYSogYXJlbmEsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgdHlwZV91cmxfcHJlZml4KTsKKworICAvLyBVbnBhY2tzIHRoZSBwYXlsb2FkIGludG8gdGhlIGdpdmVuIG1lc3NhZ2UuIFJldHVybnMgZmFsc2UgaWYgdGhlIG1lc3NhZ2UncworICAvLyB0eXBlIGRvZXNuJ3QgbWF0Y2ggdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZSB0eXBlIFVSTCAoaS5lLiwgdGhlIGZ1bGwKKyAgLy8gbmFtZSBhZnRlciB0aGUgbGFzdCAiLyIgb2YgdGhlIHR5cGUgVVJMIGRvZXNuJ3QgbWF0Y2ggdGhlIG1lc3NhZ2UncyBhY3R1YWwKKyAgLy8gZnVsbCBuYW1lKSBvciBwYXJzaW5nIHRoZSBwYXlsb2FkIGhhcyBmYWlsZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBib29sIFVucGFja1RvKFQqIG1lc3NhZ2UpIGNvbnN0IHsKKyAgICByZXR1cm4gSW50ZXJuYWxVbnBhY2tUbyhUOjpGdWxsTWVzc2FnZU5hbWUoKSwgbWVzc2FnZSk7CisgIH0KKworICBib29sIFVucGFja1RvKE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0OworCisgIC8vIENoZWNrcyB3aGV0aGVyIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUgdHlwZSBVUkwgbWF0Y2hlcyB0aGUgZ2l2ZW4gdHlwZS4KKyAgLy8gQSB0eXBlIGlzIGNvbnNpZGVyZWQgbWF0Y2hpbmcgaWYgaXRzIGZ1bGwgbmFtZSBtYXRjaGVzIHRoZSBmdWxsIG5hbWUgYWZ0ZXIKKyAgLy8gdGhlIGxhc3QgIi8iIGluIHRoZSB0eXBlIFVSTC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGJvb2wgSXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEludGVybmFsSXMoVDo6RnVsbE1lc3NhZ2VOYW1lKCkpOworICB9CisKKyBwcml2YXRlOgorICBib29sIEludGVybmFsUGFja0Zyb20oQXJlbmEqIGFyZW5hLCBjb25zdCBNZXNzYWdlTGl0ZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIHR5cGVfdXJsX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIHR5cGVfbmFtZSk7CisgIGJvb2wgSW50ZXJuYWxVbnBhY2tUbyhTdHJpbmdQaWVjZSB0eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSkgY29uc3Q7CisgIGJvb2wgSW50ZXJuYWxJcyhTdHJpbmdQaWVjZSB0eXBlX25hbWUpIGNvbnN0OworCisgIFVybFR5cGUqIHR5cGVfdXJsXzsKKyAgVmFsdWVUeXBlKiB2YWx1ZV87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFueU1ldGFkYXRhKTsKK307CisKKy8vIEdldCB0aGUgcHJvdG8gdHlwZSBuYW1lIGZyb20gQW55Ojp0eXBlX3VybCB2YWx1ZS4gRm9yIGV4YW1wbGUsIHBhc3NpbmcKKy8vICJ0eXBlLmdvb2dsZWFwaXMuY29tL3JwYy5RdWVyeU9yaWdpbiIgd2lsbCByZXR1cm4gInJwYy5RdWVyeU9yaWdpbiIgaW4KKy8vICpmdWxsX3R5cGVfbmFtZS4gUmV0dXJucyBmYWxzZSBpZiB0aGUgdHlwZV91cmwgZG9lcyBub3QgaGF2ZSBhICIvIgorLy8gaW4gdGhlIHR5cGUgdXJsIHNlcGFyYXRpbmcgdGhlIGZ1bGwgdHlwZSBuYW1lLgorLy8KKy8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHB1YmxpY2x5IGFzIGEgc3RhdGljIG1ldGhvZCBvbiB0aGUKKy8vIGdlbmVyYXRlZCBtZXNzYWdlIHR5cGU6IGdvb2dsZTo6cHJvdG9idWY6OkFueTo6UGFyc2VBbnlUeXBlVXJsKCkKK2Jvb2wgUGFyc2VBbnlUeXBlVXJsKFN0cmluZ1BpZWNlIHR5cGVfdXJsLCBzdGQ6OnN0cmluZyogZnVsbF90eXBlX25hbWUpOworCisvLyBHZXQgdGhlIHByb3RvIHR5cGUgbmFtZSBhbmQgcHJlZml4IGZyb20gQW55Ojp0eXBlX3VybCB2YWx1ZS4gRm9yIGV4YW1wbGUsCisvLyBwYXNzaW5nICJ0eXBlLmdvb2dsZWFwaXMuY29tL3JwYy5RdWVyeU9yaWdpbiIgd2lsbCByZXR1cm4KKy8vICJ0eXBlLmdvb2dsZWFwaXMuY29tLyIgaW4gKnVybF9wcmVmaXggYW5kICJycGMuUXVlcnlPcmlnaW4iIGluCisvLyAqZnVsbF90eXBlX25hbWUuIFJldHVybnMgZmFsc2UgaWYgdGhlIHR5cGVfdXJsIGRvZXMgbm90IGhhdmUgYSAiLyIgaW4gdGhlCisvLyB0eXBlIHVybCBzZXBhcmF0aW5nIHRoZSBmdWxsIHR5cGUgbmFtZS4KK2Jvb2wgUGFyc2VBbnlUeXBlVXJsKFN0cmluZ1BpZWNlIHR5cGVfdXJsLCBzdGQ6OnN0cmluZyogdXJsX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBmdWxsX3R5cGVfbmFtZSk7CisKKy8vIFNlZSBpZiBtZXNzYWdlIGlzIG9mIHR5cGUgZ29vZ2xlLnByb3RvYnVmLkFueSwgaWYgc28sIHJldHVybiB0aGUgZGVzY3JpcHRvcnMKKy8vIGZvciAidHlwZV91cmwiIGFuZCAidmFsdWUiIGZpZWxkcy4KK2Jvb2wgR2V0QW55RmllbGREZXNjcmlwdG9ycyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioqIHR5cGVfdXJsX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioqIHZhbHVlX2ZpZWxkKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQU5ZX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucGIuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDJmOWViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucGIuY2MKQEAgLTAsMCArMSwzNjggQEAKKy8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisvLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hbnkucGIuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK1BST1RPQlVGX1BSQUdNQV9JTklUX1NFRworCituYW1lc3BhY2UgX3BiID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ7CituYW1lc3BhY2UgX3BiaSA9IF9wYjo6aW50ZXJuYWw7CisKKyNpZiBkZWZpbmVkKF9fbGx2bV9fKQorICAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorICAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bmluaXRpYWxpemVkIgorI2VuZGlmICAvLyBfX2xsdm1fXworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK1BST1RPQlVGX0NPTlNURVhQUiBBbnk6OkFueSgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8udHlwZV91cmxfKSoveyY6Ol9wYmk6OmZpeGVkX2FkZHJlc3NfZW1wdHlfc3RyaW5nLCA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fX0KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy52YWx1ZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9hbnlfbWV0YWRhdGFfKSoveyZfaW1wbF8udHlwZV91cmxfLCAmX2ltcGxfLnZhbHVlX319IHt9CitzdHJ1Y3QgQW55RGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBBbnlEZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+QW55RGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBBbnkgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgQW55RGVmYXVsdFR5cGVJbnRlcm5hbCBfQW55X2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitzdGF0aWMgOjpfcGI6Ok1ldGFkYXRhIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZhbnlfMmVwcm90b1sxXTsKK3N0YXRpYyBjb25zdGV4cHIgOjpfcGI6OkVudW1EZXNjcmlwdG9yIGNvbnN0KiogZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmYW55XzJlcHJvdG8gPSBudWxscHRyOworc3RhdGljIGNvbnN0ZXhwciA6Ol9wYjo6U2VydmljZURlc2NyaXB0b3IgY29uc3QqKiBmaWxlX2xldmVsX3NlcnZpY2VfZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZhbnlfMmVwcm90byA9IG51bGxwdHI7CisKK2NvbnN0IHVpbnQzMl90IFRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmYW55XzJlcHJvdG86Om9mZnNldHNbXSBQUk9UT0JVRl9TRUNUSU9OX1ZBUklBQkxFKHByb3RvZGVzY19jb2xkKSA9IHsKKyAgfjB1LCAgLy8gbm8gX2hhc19iaXRzXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSwgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBbnksIF9pbXBsXy50eXBlX3VybF8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSwgX2ltcGxfLnZhbHVlXyksCit9Oworc3RhdGljIGNvbnN0IDo6X3BiaTo6TWlncmF0aW9uU2NoZW1hIHNjaGVtYXNbXSBQUk9UT0JVRl9TRUNUSU9OX1ZBUklBQkxFKHByb3RvZGVzY19jb2xkKSA9IHsKKyAgeyAwLCAtMSwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QW55KX0sCit9OworCitzdGF0aWMgY29uc3QgOjpfcGI6Ok1lc3NhZ2UqIGNvbnN0IGZpbGVfZGVmYXVsdF9pbnN0YW5jZXNbXSA9IHsKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfQW55X2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKK307CisKK2NvbnN0IGNoYXIgZGVzY3JpcHRvcl90YWJsZV9wcm90b2RlZl9nb29nbGVfMmZwcm90b2J1Zl8yZmFueV8yZXByb3RvW10gUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRShwcm90b2Rlc2NfY29sZCkgPQorICAiXG5cMDMxZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90b1wwMjJcMDE3Z29vZ2xlLnByb3QiCisgICJvYnVmXCImXG5cMDAzQW55XDAyMlwwMjBcblwwMTB0eXBlX3VybFwwMzBcMDAxIFwwMDEoXHRcMDIyXHJcblwwMDV2YWx1ZVwwMzBcMDAyIgorICAiIFwwMDEoXDAxNEJ2XG5cMDIzY29tLmdvb2dsZS5wcm90b2J1ZkJcMDEwQW55UHJvdG9QXDAwMVoiCisgICIsZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vIgorICAiYW55cGJcMjQyXDAwMlwwMDNHUEJcMjUyXDAwMlwwMzZHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVCIKKyAgInlwZXNiXDAwNnByb3RvMyIKKyAgOworc3RhdGljIDo6X3BiaTo6b25jZV9mbGFnIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZhbnlfMmVwcm90b19vbmNlOworY29uc3QgOjpfcGJpOjpEZXNjcmlwdG9yVGFibGUgZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmFueV8yZXByb3RvID0geworICAgIGZhbHNlLCBmYWxzZSwgMjEyLCBkZXNjcmlwdG9yX3RhYmxlX3Byb3RvZGVmX2dvb2dsZV8yZnByb3RvYnVmXzJmYW55XzJlcHJvdG8sCisgICAgImdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8iLAorICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmYW55XzJlcHJvdG9fb25jZSwgbnVsbHB0ciwgMCwgMSwKKyAgICBzY2hlbWFzLCBmaWxlX2RlZmF1bHRfaW5zdGFuY2VzLCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmFueV8yZXByb3RvOjpvZmZzZXRzLAorICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZhbnlfMmVwcm90bywgZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmYW55XzJlcHJvdG8sCisgICAgZmlsZV9sZXZlbF9zZXJ2aWNlX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmYW55XzJlcHJvdG8sCit9OworUFJPVE9CVUZfQVRUUklCVVRFX1dFQUsgY29uc3QgOjpfcGJpOjpEZXNjcmlwdG9yVGFibGUqIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZhbnlfMmVwcm90b19nZXR0ZXIoKSB7CisgIHJldHVybiAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmFueV8yZXByb3RvOworfQorCisvLyBGb3JjZSBydW5uaW5nIEFkZERlc2NyaXB0b3JzKCkgYXQgZHluYW1pYyBpbml0aWFsaXphdGlvbiB0aW1lLgorUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkyIHN0YXRpYyA6Ol9wYmk6OkFkZERlc2NyaXB0b3JzUnVubmVyIGR5bmFtaWNfaW5pdF9kdW1teV9nb29nbGVfMmZwcm90b2J1Zl8yZmFueV8yZXByb3RvKCZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmYW55XzJlcHJvdG8pOworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitib29sIEFueTo6R2V0QW55RmllbGREZXNjcmlwdG9ycygKKyAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgbWVzc2FnZSwKKyAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yKiogdHlwZV91cmxfZmllbGQsCisgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvcioqIHZhbHVlX2ZpZWxkKSB7CisgIHJldHVybiA6Ol9wYmk6OkdldEFueUZpZWxkRGVzY3JpcHRvcnMoCisgICAgICBtZXNzYWdlLCB0eXBlX3VybF9maWVsZCwgdmFsdWVfZmllbGQpOworfQorYm9vbCBBbnk6OlBhcnNlQW55VHlwZVVybCgKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Q29uc3RTdHJpbmdQYXJhbSB0eXBlX3VybCwKKyAgICBzdGQ6OnN0cmluZyogZnVsbF90eXBlX25hbWUpIHsKKyAgcmV0dXJuIDo6X3BiaTo6UGFyc2VBbnlUeXBlVXJsKHR5cGVfdXJsLCBmdWxsX3R5cGVfbmFtZSk7Cit9CisKK2NsYXNzIEFueTo6X0ludGVybmFsIHsKKyBwdWJsaWM6Cit9OworCitBbnk6OkFueSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5BbnkpCit9CitBbnk6OkFueShjb25zdCBBbnkmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIEFueSogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy50eXBlX3VybF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy52YWx1ZV8pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2FueV9tZXRhZGF0YV8pKi97Jl9pbXBsXy50eXBlX3VybF8sICZfaW1wbF8udmFsdWVffX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX2ltcGxfLnR5cGVfdXJsXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy50eXBlX3VybF8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmICghZnJvbS5faW50ZXJuYWxfdHlwZV91cmwoKS5lbXB0eSgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy50eXBlX3VybF8uU2V0KGZyb20uX2ludGVybmFsX3R5cGVfdXJsKCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICBfaW1wbF8udmFsdWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLnZhbHVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF92YWx1ZSgpLmVtcHR5KCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLnZhbHVlXy5TZXQoZnJvbS5faW50ZXJuYWxfdmFsdWUoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5BbnkpCit9CisKK2lubGluZSB2b2lkIEFueTo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8udHlwZV91cmxfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8udmFsdWVfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9hbnlfbWV0YWRhdGFfKSoveyZfaW1wbF8udHlwZV91cmxfLCAmX2ltcGxfLnZhbHVlX30KKyAgfTsKKyAgX2ltcGxfLnR5cGVfdXJsXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy50eXBlX3VybF8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIF9pbXBsXy52YWx1ZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8udmFsdWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworfQorCitBbnk6On5BbnkoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5BbnkpCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBBbnk6OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy50eXBlX3VybF8uRGVzdHJveSgpOworICBfaW1wbF8udmFsdWVfLkRlc3Ryb3koKTsKKyAgX2ltcGxfLl9hbnlfbWV0YWRhdGFfLn5BbnlNZXRhZGF0YSgpOworfQorCit2b2lkIEFueTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgQW55OjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5BbnkpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy50eXBlX3VybF8uQ2xlYXJUb0VtcHR5KCk7CisgIF9pbXBsXy52YWx1ZV8uQ2xlYXJUb0VtcHR5KCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogQW55OjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIHN0cmluZyB0eXBlX3VybCA9IDE7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxMCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX3R5cGVfdXJsKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgIENIS18oOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5BbnkudHlwZV91cmwiKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gYnl0ZXMgdmFsdWUgPSAyOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTgpKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV92YWx1ZSgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBBbnk6Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkFueSkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyBzdHJpbmcgdHlwZV91cmwgPSAxOworICBpZiAoIXRoaXMtPl9pbnRlcm5hbF90eXBlX3VybCgpLmVtcHR5KCkpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKAorICAgICAgdGhpcy0+X2ludGVybmFsX3R5cGVfdXJsKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF90eXBlX3VybCgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuQW55LnR5cGVfdXJsIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgMSwgdGhpcy0+X2ludGVybmFsX3R5cGVfdXJsKCksIHRhcmdldCk7CisgIH0KKworICAvLyBieXRlcyB2YWx1ZSA9IDI7CisgIGlmICghdGhpcy0+X2ludGVybmFsX3ZhbHVlKCkuZW1wdHkoKSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVCeXRlc01heWJlQWxpYXNlZCgKKyAgICAgICAgMiwgdGhpcy0+X2ludGVybmFsX3ZhbHVlKCksIHRhcmdldCk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuQW55KQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgQW55OjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkFueSkKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHN0cmluZyB0eXBlX3VybCA9IDE7CisgIGlmICghdGhpcy0+X2ludGVybmFsX3R5cGVfdXJsKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICB0aGlzLT5faW50ZXJuYWxfdHlwZV91cmwoKSk7CisgIH0KKworICAvLyBieXRlcyB2YWx1ZSA9IDI7CisgIGlmICghdGhpcy0+X2ludGVybmFsX3ZhbHVlKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpCeXRlc1NpemUoCisgICAgICAgIHRoaXMtPl9pbnRlcm5hbF92YWx1ZSgpKTsKKyAgfQorCisgIHJldHVybiBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCAmX2ltcGxfLl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhIEFueTo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIEFueTo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpBbnk6OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH0KKworCit2b2lkIEFueTo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PEFueSo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgQW55Jj4oZnJvbV9tc2cpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuQW55KQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF90eXBlX3VybCgpLmVtcHR5KCkpIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF90eXBlX3VybChmcm9tLl9pbnRlcm5hbF90eXBlX3VybCgpKTsKKyAgfQorICBpZiAoIWZyb20uX2ludGVybmFsX3ZhbHVlKCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X3ZhbHVlKGZyb20uX2ludGVybmFsX3ZhbHVlKCkpOworICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIEFueTo6Q29weUZyb20oY29uc3QgQW55JiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5BbnkpCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBBbnk6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEFueTo6SW50ZXJuYWxTd2FwKEFueSogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBhdXRvKiBsaHNfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgYXV0byogcmhzX2FyZW5hID0gb3RoZXItPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLnR5cGVfdXJsXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8udHlwZV91cmxfLCByaHNfYXJlbmEKKyAgKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy52YWx1ZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLnZhbHVlXywgcmhzX2FyZW5hCisgICk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBBbnk6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmYW55XzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmFueV8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmYW55XzJlcHJvdG9bMF0pOworfQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QW55KgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSA+KEFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSA+KGFyZW5hKTsKK30KK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQorI2lmIGRlZmluZWQoX19sbHZtX18pCisgICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZiAgLy8gX19sbHZtX18KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODJlOWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucGIuaApAQCAtMCwwICsxLDM4NCBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90bworCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZmFueV8yZXByb3RvCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZmFueV8yZXByb3RvCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKyNpZiBQUk9UT0JVRl9WRVJTSU9OIDwgMzAyMTAwMAorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiBQbGVhc2UgdXBkYXRlCisjZXJyb3IgeW91ciBoZWFkZXJzLgorI2VuZGlmCisjaWYgMzAyMTAwOSA8IFBST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTgorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIG9sZGVyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCisjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gUGxlYXNlCisjZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21ldGFkYXRhX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorI2RlZmluZSBQUk9UT0JVRl9JTlRFUk5BTF9FWFBPUlRfZ29vZ2xlXzJmcHJvdG9idWZfMmZhbnlfMmVwcm90byBQUk9UT0JVRl9FWFBPUlQKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCituYW1lc3BhY2UgaW50ZXJuYWwgeworY2xhc3MgQW55TWV0YWRhdGE7Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IHVzZSB0aGVzZSBtZW1iZXJzLgorc3RydWN0IFBST1RPQlVGX0VYUE9SVCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmFueV8yZXByb3RvIHsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG9mZnNldHNbXTsKK307CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RGVzY3JpcHRvclRhYmxlIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZhbnlfMmVwcm90bzsKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCitjbGFzcyBBbnk7CitzdHJ1Y3QgQW55RGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gQW55RGVmYXVsdFR5cGVJbnRlcm5hbCBfQW55X2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QW55PihBcmVuYSopOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBBbnkgZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuQW55KSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgQW55KCkgOiBBbnkobnVsbHB0cikge30KKyAgfkFueSgpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgQW55KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgQW55KGNvbnN0IEFueSYgZnJvbSk7CisgIEFueShBbnkmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogQW55KCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgQW55JiBvcGVyYXRvcj0oY29uc3QgQW55JiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBBbnkmIG9wZXJhdG9yPShBbnkmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgQW55JiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgQW55KiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEFueSo+KAorICAgICAgICAgICAgICAgJl9BbnlfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAwOworCisgIC8vIGltcGxlbWVudHMgQW55IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgYm9vbCBQYWNrRnJvbShjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgbWVzc2FnZSkgeworICAgIEdPT0dMRV9EQ0hFQ0tfTkUoJm1lc3NhZ2UsIHRoaXMpOworICAgIHJldHVybiBfaW1wbF8uX2FueV9tZXRhZGF0YV8uUGFja0Zyb20oR2V0QXJlbmEoKSwgbWVzc2FnZSk7CisgIH0KKyAgYm9vbCBQYWNrRnJvbShjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Q29uc3RTdHJpbmdQYXJhbSB0eXBlX3VybF9wcmVmaXgpIHsKKyAgICBHT09HTEVfRENIRUNLX05FKCZtZXNzYWdlLCB0aGlzKTsKKyAgICByZXR1cm4gX2ltcGxfLl9hbnlfbWV0YWRhdGFfLlBhY2tGcm9tKEdldEFyZW5hKCksIG1lc3NhZ2UsIHR5cGVfdXJsX3ByZWZpeCk7CisgIH0KKyAgYm9vbCBVbnBhY2tUbyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSogbWVzc2FnZSkgY29uc3QgeworICAgIHJldHVybiBfaW1wbF8uX2FueV9tZXRhZGF0YV8uVW5wYWNrVG8obWVzc2FnZSk7CisgIH0KKyAgc3RhdGljIGJvb2wgR2V0QW55RmllbGREZXNjcmlwdG9ycygKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvcioqIHR5cGVfdXJsX2ZpZWxkLAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvcioqIHZhbHVlX2ZpZWxkKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGNsYXNzID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfY29udmVydGlibGU8VCwgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmPjo6dmFsdWU+Ojp0eXBlPgorICBib29sIFBhY2tGcm9tKGNvbnN0IFQmIG1lc3NhZ2UpIHsKKyAgICByZXR1cm4gX2ltcGxfLl9hbnlfbWV0YWRhdGFfLlBhY2tGcm9tPFQ+KEdldEFyZW5hKCksIG1lc3NhZ2UpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBjbGFzcyA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2NvbnZlcnRpYmxlPFQsIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJj46OnZhbHVlPjo6dHlwZT4KKyAgYm9vbCBQYWNrRnJvbShjb25zdCBUJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpDb25zdFN0cmluZ1BhcmFtIHR5cGVfdXJsX3ByZWZpeCkgeworICAgIHJldHVybiBfaW1wbF8uX2FueV9tZXRhZGF0YV8uUGFja0Zyb208VD4oR2V0QXJlbmEoKSwgbWVzc2FnZSwgdHlwZV91cmxfcHJlZml4KTt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBjbGFzcyA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2NvbnZlcnRpYmxlPFQsIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJj46OnZhbHVlPjo6dHlwZT4KKyAgYm9vbCBVbnBhY2tUbyhUKiBtZXNzYWdlKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbXBsXy5fYW55X21ldGFkYXRhXy5VbnBhY2tUbzxUPihtZXNzYWdlKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIElzKCkgY29uc3QgeworICAgIHJldHVybiBfaW1wbF8uX2FueV9tZXRhZGF0YV8uSXM8VD4oKTsKKyAgfQorICBzdGF0aWMgYm9vbCBQYXJzZUFueVR5cGVVcmwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkNvbnN0U3RyaW5nUGFyYW0gdHlwZV91cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZnVsbF90eXBlX25hbWUpOworICBmcmllbmQgdm9pZCBzd2FwKEFueSYgYSwgQW55JiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKEFueSogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICBHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICAjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdlbmVyaWNTd2FwKHRoaXMsIG90aGVyKTsKKyAgICB9CisgIH0KKyAgdm9pZCBVbnNhZmVBcmVuYVN3YXAoQW55KiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBBbnkqIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8QW55PihhcmVuYSk7CisgIH0KKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlGcm9tOworICB2b2lkIENvcHlGcm9tKGNvbnN0IEFueSYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBBbnkmIGZyb20pIHsKKyAgICBBbnk6Ok1lcmdlSW1wbCgqdGhpcywgZnJvbSk7CisgIH0KKyAgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgTWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZyk7CisgIHB1YmxpYzoKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IGZpbmFsOworICB2b2lkIEludGVybmFsU3dhcChBbnkqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuQW55IjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEFueSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXzsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDsKKworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga1R5cGVVcmxGaWVsZE51bWJlciA9IDEsCisgICAga1ZhbHVlRmllbGROdW1iZXIgPSAyLAorICB9OworICAvLyBzdHJpbmcgdHlwZV91cmwgPSAxOworICB2b2lkIGNsZWFyX3R5cGVfdXJsKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlX3VybCgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X3R5cGVfdXJsKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfdHlwZV91cmwoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX3R5cGVfdXJsKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF90eXBlX3VybChzdGQ6OnN0cmluZyogdHlwZV91cmwpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX3R5cGVfdXJsKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF90eXBlX3VybChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfdHlwZV91cmwoKTsKKyAgcHVibGljOgorCisgIC8vIGJ5dGVzIHZhbHVlID0gMjsKKyAgdm9pZCBjbGVhcl92YWx1ZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF92YWx1ZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX3ZhbHVlKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV92YWx1ZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfdmFsdWUoc3RkOjpzdHJpbmcqIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF92YWx1ZSgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfdmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX3ZhbHVlKCk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkFueSkKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciB0eXBlX3VybF87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciB2YWx1ZV87CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhIF9hbnlfbWV0YWRhdGFfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmYW55XzJlcHJvdG87Cit9OworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIF9fR05VQ19fCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1Xc3RyaWN0LWFsaWFzaW5nIgorI2VuZGlmICAvLyBfX0dOVUNfXworLy8gQW55CisKKy8vIHN0cmluZyB0eXBlX3VybCA9IDE7CitpbmxpbmUgdm9pZCBBbnk6OmNsZWFyX3R5cGVfdXJsKCkgeworICBfaW1wbF8udHlwZV91cmxfLkNsZWFyVG9FbXB0eSgpOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBBbnk6OnR5cGVfdXJsKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5BbnkudHlwZV91cmwpCisgIHJldHVybiBfaW50ZXJuYWxfdHlwZV91cmwoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCwgdHlwZW5hbWUuLi4gQXJnVD4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCit2b2lkIEFueTo6c2V0X3R5cGVfdXJsKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgCisgX2ltcGxfLnR5cGVfdXJsXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkFueS50eXBlX3VybCkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogQW55OjptdXRhYmxlX3R5cGVfdXJsKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV90eXBlX3VybCgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuQW55LnR5cGVfdXJsKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEFueTo6X2ludGVybmFsX3R5cGVfdXJsKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnR5cGVfdXJsXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIEFueTo6X2ludGVybmFsX3NldF90eXBlX3VybChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy50eXBlX3VybF8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEFueTo6X2ludGVybmFsX211dGFibGVfdHlwZV91cmwoKSB7CisgIAorICByZXR1cm4gX2ltcGxfLnR5cGVfdXJsXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogQW55OjpyZWxlYXNlX3R5cGVfdXJsKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuQW55LnR5cGVfdXJsKQorICByZXR1cm4gX2ltcGxfLnR5cGVfdXJsXy5SZWxlYXNlKCk7Cit9CitpbmxpbmUgdm9pZCBBbnk6OnNldF9hbGxvY2F0ZWRfdHlwZV91cmwoc3RkOjpzdHJpbmcqIHR5cGVfdXJsKSB7CisgIGlmICh0eXBlX3VybCAhPSBudWxscHRyKSB7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgIH0KKyAgX2ltcGxfLnR5cGVfdXJsXy5TZXRBbGxvY2F0ZWQodHlwZV91cmwsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8udHlwZV91cmxfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLnR5cGVfdXJsXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkFueS50eXBlX3VybCkKK30KKworLy8gYnl0ZXMgdmFsdWUgPSAyOworaW5saW5lIHZvaWQgQW55OjpjbGVhcl92YWx1ZSgpIHsKKyAgX2ltcGxfLnZhbHVlXy5DbGVhclRvRW1wdHkoKTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgQW55Ojp2YWx1ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuQW55LnZhbHVlKQorICByZXR1cm4gX2ludGVybmFsX3ZhbHVlKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBBbnk6OnNldF92YWx1ZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIAorIF9pbXBsXy52YWx1ZV8uU2V0Qnl0ZXMoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkFueS52YWx1ZSkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogQW55OjptdXRhYmxlX3ZhbHVlKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV92YWx1ZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuQW55LnZhbHVlKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEFueTo6X2ludGVybmFsX3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnZhbHVlXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIEFueTo6X2ludGVybmFsX3NldF92YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy52YWx1ZV8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEFueTo6X2ludGVybmFsX211dGFibGVfdmFsdWUoKSB7CisgIAorICByZXR1cm4gX2ltcGxfLnZhbHVlXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogQW55OjpyZWxlYXNlX3ZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuQW55LnZhbHVlKQorICByZXR1cm4gX2ltcGxfLnZhbHVlXy5SZWxlYXNlKCk7Cit9CitpbmxpbmUgdm9pZCBBbnk6OnNldF9hbGxvY2F0ZWRfdmFsdWUoc3RkOjpzdHJpbmcqIHZhbHVlKSB7CisgIGlmICh2YWx1ZSAhPSBudWxscHRyKSB7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgIH0KKyAgX2ltcGxfLnZhbHVlXy5TZXRBbGxvY2F0ZWQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8udmFsdWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLnZhbHVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkFueS52YWx1ZSkKK30KKworI2lmZGVmIF9fR05VQ19fCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYgIC8vIF9fR05VQ19fCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCisKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2dvb2dsZV8yZnByb3RvYnVmXzJmYW55XzJlcHJvdG8KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvYW55LnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjMjA0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvYW55LnByb3RvCkBAIC0wLDAgKzEsMTU4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOworCitvcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMiOworb3B0aW9uIGdvX3BhY2thZ2UgPSAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vYW55cGIiOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJBbnlQcm90byI7CitvcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7CitvcHRpb24gb2JqY19jbGFzc19wcmVmaXggPSAiR1BCIjsKKworLy8gYEFueWAgY29udGFpbnMgYW4gYXJiaXRyYXJ5IHNlcmlhbGl6ZWQgcHJvdG9jb2wgYnVmZmVyIG1lc3NhZ2UgYWxvbmcgd2l0aCBhCisvLyBVUkwgdGhhdCBkZXNjcmliZXMgdGhlIHR5cGUgb2YgdGhlIHNlcmlhbGl6ZWQgbWVzc2FnZS4KKy8vCisvLyBQcm90b2J1ZiBsaWJyYXJ5IHByb3ZpZGVzIHN1cHBvcnQgdG8gcGFjay91bnBhY2sgQW55IHZhbHVlcyBpbiB0aGUgZm9ybQorLy8gb2YgdXRpbGl0eSBmdW5jdGlvbnMgb3IgYWRkaXRpb25hbCBnZW5lcmF0ZWQgbWV0aG9kcyBvZiB0aGUgQW55IHR5cGUuCisvLworLy8gRXhhbXBsZSAxOiBQYWNrIGFuZCB1bnBhY2sgYSBtZXNzYWdlIGluIEMrKy4KKy8vCisvLyAgICAgRm9vIGZvbyA9IC4uLjsKKy8vICAgICBBbnkgYW55OworLy8gICAgIGFueS5QYWNrRnJvbShmb28pOworLy8gICAgIC4uLgorLy8gICAgIGlmIChhbnkuVW5wYWNrVG8oJmZvbykpIHsKKy8vICAgICAgIC4uLgorLy8gICAgIH0KKy8vCisvLyBFeGFtcGxlIDI6IFBhY2sgYW5kIHVucGFjayBhIG1lc3NhZ2UgaW4gSmF2YS4KKy8vCisvLyAgICAgRm9vIGZvbyA9IC4uLjsKKy8vICAgICBBbnkgYW55ID0gQW55LnBhY2soZm9vKTsKKy8vICAgICAuLi4KKy8vICAgICBpZiAoYW55LmlzKEZvby5jbGFzcykpIHsKKy8vICAgICAgIGZvbyA9IGFueS51bnBhY2soRm9vLmNsYXNzKTsKKy8vICAgICB9CisvLworLy8gRXhhbXBsZSAzOiBQYWNrIGFuZCB1bnBhY2sgYSBtZXNzYWdlIGluIFB5dGhvbi4KKy8vCisvLyAgICAgZm9vID0gRm9vKC4uLikKKy8vICAgICBhbnkgPSBBbnkoKQorLy8gICAgIGFueS5QYWNrKGZvbykKKy8vICAgICAuLi4KKy8vICAgICBpZiBhbnkuSXMoRm9vLkRFU0NSSVBUT1IpOgorLy8gICAgICAgYW55LlVucGFjayhmb28pCisvLyAgICAgICAuLi4KKy8vCisvLyBFeGFtcGxlIDQ6IFBhY2sgYW5kIHVucGFjayBhIG1lc3NhZ2UgaW4gR28KKy8vCisvLyAgICAgIGZvbyA6PSAmcGIuRm9vey4uLn0KKy8vICAgICAgYW55LCBlcnIgOj0gYW55cGIuTmV3KGZvbykKKy8vICAgICAgaWYgZXJyICE9IG5pbCB7CisvLyAgICAgICAgLi4uCisvLyAgICAgIH0KKy8vICAgICAgLi4uCisvLyAgICAgIGZvbyA6PSAmcGIuRm9ve30KKy8vICAgICAgaWYgZXJyIDo9IGFueS5Vbm1hcnNoYWxUbyhmb28pOyBlcnIgIT0gbmlsIHsKKy8vICAgICAgICAuLi4KKy8vICAgICAgfQorLy8KKy8vIFRoZSBwYWNrIG1ldGhvZHMgcHJvdmlkZWQgYnkgcHJvdG9idWYgbGlicmFyeSB3aWxsIGJ5IGRlZmF1bHQgdXNlCisvLyAndHlwZS5nb29nbGVhcGlzLmNvbS9mdWxsLnR5cGUubmFtZScgYXMgdGhlIHR5cGUgVVJMIGFuZCB0aGUgdW5wYWNrCisvLyBtZXRob2RzIG9ubHkgdXNlIHRoZSBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lIGFmdGVyIHRoZSBsYXN0ICcvJworLy8gaW4gdGhlIHR5cGUgVVJMLCBmb3IgZXhhbXBsZSAiZm9vLmJhci5jb20veC95LnoiIHdpbGwgeWllbGQgdHlwZQorLy8gbmFtZSAieS56Ii4KKy8vCisvLworLy8gSlNPTgorLy8KKy8vIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGFuIGBBbnlgIHZhbHVlIHVzZXMgdGhlIHJlZ3VsYXIKKy8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZXNlcmlhbGl6ZWQsIGVtYmVkZGVkIG1lc3NhZ2UsIHdpdGggYW4KKy8vIGFkZGl0aW9uYWwgZmllbGQgYEB0eXBlYCB3aGljaCBjb250YWlucyB0aGUgdHlwZSBVUkwuIEV4YW1wbGU6CisvLworLy8gICAgIHBhY2thZ2UgZ29vZ2xlLnByb2ZpbGU7CisvLyAgICAgbWVzc2FnZSBQZXJzb24geworLy8gICAgICAgc3RyaW5nIGZpcnN0X25hbWUgPSAxOworLy8gICAgICAgc3RyaW5nIGxhc3RfbmFtZSA9IDI7CisvLyAgICAgfQorLy8KKy8vICAgICB7CisvLyAgICAgICAiQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvZmlsZS5QZXJzb24iLAorLy8gICAgICAgImZpcnN0TmFtZSI6IDxzdHJpbmc+LAorLy8gICAgICAgImxhc3ROYW1lIjogPHN0cmluZz4KKy8vICAgICB9CisvLworLy8gSWYgdGhlIGVtYmVkZGVkIG1lc3NhZ2UgdHlwZSBpcyB3ZWxsLWtub3duIGFuZCBoYXMgYSBjdXN0b20gSlNPTgorLy8gcmVwcmVzZW50YXRpb24sIHRoYXQgcmVwcmVzZW50YXRpb24gd2lsbCBiZSBlbWJlZGRlZCBhZGRpbmcgYSBmaWVsZAorLy8gYHZhbHVlYCB3aGljaCBob2xkcyB0aGUgY3VzdG9tIEpTT04gaW4gYWRkaXRpb24gdG8gdGhlIGBAdHlwZWAKKy8vIGZpZWxkLiBFeGFtcGxlIChmb3IgbWVzc2FnZSBbZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uXVtdKToKKy8vCisvLyAgICAgeworLy8gICAgICAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIiwKKy8vICAgICAgICJ2YWx1ZSI6ICIxLjIxMnMiCisvLyAgICAgfQorLy8KK21lc3NhZ2UgQW55IHsKKyAgLy8gQSBVUkwvcmVzb3VyY2UgbmFtZSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgdGhlIHNlcmlhbGl6ZWQKKyAgLy8gcHJvdG9jb2wgYnVmZmVyIG1lc3NhZ2UuIFRoaXMgc3RyaW5nIG11c3QgY29udGFpbiBhdCBsZWFzdAorICAvLyBvbmUgIi8iIGNoYXJhY3Rlci4gVGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgVVJMJ3MgcGF0aCBtdXN0IHJlcHJlc2VudAorICAvLyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUgKGFzIGluCisgIC8vIGBwYXRoL2dvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbmApLiBUaGUgbmFtZSBzaG91bGQgYmUgaW4gYSBjYW5vbmljYWwgZm9ybQorICAvLyAoZS5nLiwgbGVhZGluZyAiLiIgaXMgbm90IGFjY2VwdGVkKS4KKyAgLy8KKyAgLy8gSW4gcHJhY3RpY2UsIHRlYW1zIHVzdWFsbHkgcHJlY29tcGlsZSBpbnRvIHRoZSBiaW5hcnkgYWxsIHR5cGVzIHRoYXQgdGhleQorICAvLyBleHBlY3QgaXQgdG8gdXNlIGluIHRoZSBjb250ZXh0IG9mIEFueS4gSG93ZXZlciwgZm9yIFVSTHMgd2hpY2ggdXNlIHRoZQorICAvLyBzY2hlbWUgYGh0dHBgLCBgaHR0cHNgLCBvciBubyBzY2hlbWUsIG9uZSBjYW4gb3B0aW9uYWxseSBzZXQgdXAgYSB0eXBlCisgIC8vIHNlcnZlciB0aGF0IG1hcHMgdHlwZSBVUkxzIHRvIG1lc3NhZ2UgZGVmaW5pdGlvbnMgYXMgZm9sbG93czoKKyAgLy8KKyAgLy8gKiBJZiBubyBzY2hlbWUgaXMgcHJvdmlkZWQsIGBodHRwc2AgaXMgYXNzdW1lZC4KKyAgLy8gKiBBbiBIVFRQIEdFVCBvbiB0aGUgVVJMIG11c3QgeWllbGQgYSBbZ29vZ2xlLnByb3RvYnVmLlR5cGVdW10KKyAgLy8gICB2YWx1ZSBpbiBiaW5hcnkgZm9ybWF0LCBvciBwcm9kdWNlIGFuIGVycm9yLgorICAvLyAqIEFwcGxpY2F0aW9ucyBhcmUgYWxsb3dlZCB0byBjYWNoZSBsb29rdXAgcmVzdWx0cyBiYXNlZCBvbiB0aGUKKyAgLy8gICBVUkwsIG9yIGhhdmUgdGhlbSBwcmVjb21waWxlZCBpbnRvIGEgYmluYXJ5IHRvIGF2b2lkIGFueQorICAvLyAgIGxvb2t1cC4gVGhlcmVmb3JlLCBiaW5hcnkgY29tcGF0aWJpbGl0eSBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQKKyAgLy8gICBvbiBjaGFuZ2VzIHRvIHR5cGVzLiAoVXNlIHZlcnNpb25lZCB0eXBlIG5hbWVzIHRvIG1hbmFnZQorICAvLyAgIGJyZWFraW5nIGNoYW5nZXMuKQorICAvLworICAvLyBOb3RlOiB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIG9mZmljaWFsCisgIC8vIHByb3RvYnVmIHJlbGVhc2UsIGFuZCBpdCBpcyBub3QgdXNlZCBmb3IgdHlwZSBVUkxzIGJlZ2lubmluZyB3aXRoCisgIC8vIHR5cGUuZ29vZ2xlYXBpcy5jb20uCisgIC8vCisgIC8vIFNjaGVtZXMgb3RoZXIgdGhhbiBgaHR0cGAsIGBodHRwc2AgKG9yIHRoZSBlbXB0eSBzY2hlbWUpIG1pZ2h0IGJlCisgIC8vIHVzZWQgd2l0aCBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBzZW1hbnRpY3MuCisgIC8vCisgIHN0cmluZyB0eXBlX3VybCA9IDE7CisKKyAgLy8gTXVzdCBiZSBhIHZhbGlkIHNlcmlhbGl6ZWQgcHJvdG9jb2wgYnVmZmVyIG9mIHRoZSBhYm92ZSBzcGVjaWZpZWQgdHlwZS4KKyAgYnl0ZXMgdmFsdWUgPSAyOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnlfbGl0ZS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvYW55X2xpdGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4M2EzMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvYW55X2xpdGUuY2MKQEAgLTAsMCArMSw5NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hbnkuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitzdGQ6OnN0cmluZyBHZXRUeXBlVXJsKFN0cmluZ1BpZWNlIG1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgdHlwZV91cmxfcHJlZml4KSB7CisgIGlmICghdHlwZV91cmxfcHJlZml4LmVtcHR5KCkgJiYKKyAgICAgIHR5cGVfdXJsX3ByZWZpeFt0eXBlX3VybF9wcmVmaXguc2l6ZSgpIC0gMV0gPT0gJy8nKSB7CisgICAgcmV0dXJuIFN0ckNhdCh0eXBlX3VybF9wcmVmaXgsIG1lc3NhZ2VfbmFtZSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFN0ckNhdCh0eXBlX3VybF9wcmVmaXgsICIvIiwgbWVzc2FnZV9uYW1lKTsKKyAgfQorfQorCitjb25zdCBjaGFyIGtBbnlGdWxsVHlwZU5hbWVbXSA9ICJnb29nbGUucHJvdG9idWYuQW55IjsKK2NvbnN0IGNoYXIga1R5cGVHb29nbGVBcGlzQ29tUHJlZml4W10gPSAidHlwZS5nb29nbGVhcGlzLmNvbS8iOworY29uc3QgY2hhciBrVHlwZUdvb2dsZVByb2RDb21QcmVmaXhbXSA9ICJ0eXBlLmdvb2dsZXByb2QuY29tLyI7CisKK2Jvb2wgQW55TWV0YWRhdGE6OkludGVybmFsUGFja0Zyb20oQXJlbmEqIGFyZW5hLCBjb25zdCBNZXNzYWdlTGl0ZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgdHlwZV91cmxfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSB0eXBlX25hbWUpIHsKKyAgdHlwZV91cmxfLT5TZXQoR2V0VHlwZVVybCh0eXBlX25hbWUsIHR5cGVfdXJsX3ByZWZpeCksIGFyZW5hKTsKKyAgcmV0dXJuIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcodmFsdWVfLT5NdXRhYmxlKGFyZW5hKSk7Cit9CisKK2Jvb2wgQW55TWV0YWRhdGE6OkludGVybmFsVW5wYWNrVG8oU3RyaW5nUGllY2UgdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSkgY29uc3QgeworICBpZiAoIUludGVybmFsSXModHlwZV9uYW1lKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gbWVzc2FnZS0+UGFyc2VGcm9tU3RyaW5nKHZhbHVlXy0+R2V0KCkpOworfQorCitib29sIEFueU1ldGFkYXRhOjpJbnRlcm5hbElzKFN0cmluZ1BpZWNlIHR5cGVfbmFtZSkgY29uc3QgeworICBTdHJpbmdQaWVjZSB0eXBlX3VybCA9IHR5cGVfdXJsXy0+R2V0KCk7CisgIHJldHVybiB0eXBlX3VybC5zaXplKCkgPj0gdHlwZV9uYW1lLnNpemUoKSArIDEgJiYKKyAgICAgICAgIHR5cGVfdXJsW3R5cGVfdXJsLnNpemUoKSAtIHR5cGVfbmFtZS5zaXplKCkgLSAxXSA9PSAnLycgJiYKKyAgICAgICAgIEhhc1N1ZmZpeFN0cmluZyh0eXBlX3VybCwgdHlwZV9uYW1lKTsKK30KKworYm9vbCBQYXJzZUFueVR5cGVVcmwoU3RyaW5nUGllY2UgdHlwZV91cmwsIHN0ZDo6c3RyaW5nKiB1cmxfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGZ1bGxfdHlwZV9uYW1lKSB7CisgIHNpemVfdCBwb3MgPSB0eXBlX3VybC5maW5kX2xhc3Rfb2YoJy8nKTsKKyAgaWYgKHBvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcyB8fCBwb3MgKyAxID09IHR5cGVfdXJsLnNpemUoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAodXJsX3ByZWZpeCkgeworICAgICp1cmxfcHJlZml4ID0gc3RkOjpzdHJpbmcodHlwZV91cmwuc3Vic3RyKDAsIHBvcyArIDEpKTsKKyAgfQorICAqZnVsbF90eXBlX25hbWUgPSBzdGQ6OnN0cmluZyh0eXBlX3VybC5zdWJzdHIocG9zICsgMSkpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZUFueVR5cGVVcmwoU3RyaW5nUGllY2UgdHlwZV91cmwsIHN0ZDo6c3RyaW5nKiBmdWxsX3R5cGVfbmFtZSkgeworICByZXR1cm4gUGFyc2VBbnlUeXBlVXJsKHR5cGVfdXJsLCBudWxscHRyLCBmdWxsX3R5cGVfbmFtZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODJhZmIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5jYwpAQCAtMCwwICsxLDE5NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgeworCitURVNUKEFueU1ldGFkYXRhVGVzdCwgQ29uc3RJbml0KSB7CisgIFBST1RPQlVGX0NPTlNUSU5JVCBzdGF0aWMgaW50ZXJuYWw6OkFueU1ldGFkYXRhIG1ldGFkYXRhKG51bGxwdHIsIG51bGxwdHIpOworICAodm9pZCltZXRhZGF0YTsKK30KKworVEVTVChBbnlUZXN0LCBUZXN0UGFja0FuZFVucGFjaykgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFueSBzdWJtZXNzYWdlOworICBzdWJtZXNzYWdlLnNldF9pbnQzMl92YWx1ZSgxMjM0NSk7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QW55IG1lc3NhZ2U7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UubXV0YWJsZV9hbnlfdmFsdWUoKS0+UGFja0Zyb20oc3VibWVzc2FnZSkpOworCisgIHN0ZDo6c3RyaW5nIGRhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19hbnlfdmFsdWUoKSk7CisgIHN1Ym1lc3NhZ2UuQ2xlYXIoKTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS5hbnlfdmFsdWUoKS5VbnBhY2tUbygmc3VibWVzc2FnZSkpOworICBFWFBFQ1RfRVEoMTIzNDUsIHN1Ym1lc3NhZ2UuaW50MzJfdmFsdWUoKSk7Cit9CisKK1RFU1QoQW55VGVzdCwgVGVzdFBhY2tGcm9tU2VyaWFsaXphdGlvbkV4Y2VlZHNTaXplTGltaXQpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbnkgc3VibWVzc2FnZTsKKyAgc3VibWVzc2FnZS5tdXRhYmxlX3RleHQoKS0+cmVzaXplKElOVF9NQVgsICdhJyk7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QW55IG1lc3NhZ2U7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm11dGFibGVfYW55X3ZhbHVlKCktPlBhY2tGcm9tKHN1Ym1lc3NhZ2UpKTsKK30KKworVEVTVChBbnlUZXN0LCBUZXN0VW5wYWNrV2l0aFR5cGVNaXNtYXRjaCkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFueSBwYXlsb2FkOworICBwYXlsb2FkLnNldF9pbnQzMl92YWx1ZSgxMyk7CisgIGdvb2dsZTo6cHJvdG9idWY6OkFueSBhbnk7CisgIGFueS5QYWNrRnJvbShwYXlsb2FkKTsKKworICAvLyBBdHRlbXB0IHRvIHVucGFjayBpbnRvIHRoZSB3cm9uZyB0eXBlLgorICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIGRlc3Q7CisgIEVYUEVDVF9GQUxTRShhbnkuVW5wYWNrVG8oJmRlc3QpKTsKK30KKworVEVTVChBbnlUZXN0LCBUZXN0UGFja0FuZFVucGFja0FueSkgeworICAvLyBXZSBjYW4gcGFjayBhIEFueSBtZXNzYWdlIGluc2lkZSBhbm90aGVyIEFueSBtZXNzYWdlLgorICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFueSBzdWJtZXNzYWdlOworICBzdWJtZXNzYWdlLnNldF9pbnQzMl92YWx1ZSgxMjM0NSk7CisgIGdvb2dsZTo6cHJvdG9idWY6OkFueSBhbnk7CisgIGFueS5QYWNrRnJvbShzdWJtZXNzYWdlKTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbnkgbWVzc2FnZTsKKyAgbWVzc2FnZS5tdXRhYmxlX2FueV92YWx1ZSgpLT5QYWNrRnJvbShhbnkpOworCisgIHN0ZDo6c3RyaW5nIGRhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19hbnlfdmFsdWUoKSk7CisgIGFueS5DbGVhcigpOworICBzdWJtZXNzYWdlLkNsZWFyKCk7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UuYW55X3ZhbHVlKCkuVW5wYWNrVG8oJmFueSkpOworICBBU1NFUlRfVFJVRShhbnkuVW5wYWNrVG8oJnN1Ym1lc3NhZ2UpKTsKKyAgRVhQRUNUX0VRKDEyMzQ1LCBzdWJtZXNzYWdlLmludDMyX3ZhbHVlKCkpOworfQorCitURVNUKEFueVRlc3QsIFRlc3RQYWNrV2l0aEN1c3RvbVR5cGVVcmwpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbnkgc3VibWVzc2FnZTsKKyAgc3VibWVzc2FnZS5zZXRfaW50MzJfdmFsdWUoMTIzNDUpOworICBnb29nbGU6OnByb3RvYnVmOjpBbnkgYW55OworICAvLyBQYWNrIHdpdGggYSBjdXN0b20gdHlwZSBVUkwgcHJlZml4LgorICBhbnkuUGFja0Zyb20oc3VibWVzc2FnZSwgInR5cGUubXlzZXJ2aWNlLmNvbSIpOworICBFWFBFQ1RfRVEoInR5cGUubXlzZXJ2aWNlLmNvbS9wcm90b2J1Zl91bml0dGVzdC5UZXN0QW55IiwgYW55LnR5cGVfdXJsKCkpOworICAvLyBQYWNrIHdpdGggYSBjdXN0b20gdHlwZSBVUkwgcHJlZml4IGVuZGluZyB3aXRoICcvJy4KKyAgYW55LlBhY2tGcm9tKHN1Ym1lc3NhZ2UsICJ0eXBlLm15c2VydmljZS5jb20vIik7CisgIEVYUEVDVF9FUSgidHlwZS5teXNlcnZpY2UuY29tL3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbnkiLCBhbnkudHlwZV91cmwoKSk7CisgIC8vIFBhY2sgd2l0aCBhbiBlbXB0eSB0eXBlIFVSTCBwcmVmaXguCisgIGFueS5QYWNrRnJvbShzdWJtZXNzYWdlLCAiIik7CisgIEVYUEVDVF9FUSgiL3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbnkiLCBhbnkudHlwZV91cmwoKSk7CisKKyAgLy8gVGVzdCB1bnBhY2tpbmcgdGhlIHR5cGUuCisgIHN1Ym1lc3NhZ2UuQ2xlYXIoKTsKKyAgRVhQRUNUX1RSVUUoYW55LlVucGFja1RvKCZzdWJtZXNzYWdlKSk7CisgIEVYUEVDVF9FUSgxMjM0NSwgc3VibWVzc2FnZS5pbnQzMl92YWx1ZSgpKTsKK30KKworVEVTVChBbnlUZXN0LCBUZXN0SXMpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbnkgc3VibWVzc2FnZTsKKyAgc3VibWVzc2FnZS5zZXRfaW50MzJfdmFsdWUoMTIzNDUpOworICBnb29nbGU6OnByb3RvYnVmOjpBbnkgYW55OworICBhbnkuUGFja0Zyb20oc3VibWVzc2FnZSk7CisgIEFTU0VSVF9UUlVFKGFueS5QYXJzZUZyb21TdHJpbmcoYW55LlNlcmlhbGl6ZUFzU3RyaW5nKCkpKTsKKyAgRVhQRUNUX1RSVUUoYW55LklzPHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QW55PigpKTsKKyAgRVhQRUNUX0ZBTFNFKGFueS5Jczxnb29nbGU6OnByb3RvYnVmOjpBbnk+KCkpOworCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QW55IG1lc3NhZ2U7CisgIG1lc3NhZ2UubXV0YWJsZV9hbnlfdmFsdWUoKS0+UGFja0Zyb20oYW55KTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmFueV92YWx1ZSgpLklzPHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QW55PigpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5hbnlfdmFsdWUoKS5Jczxnb29nbGU6OnByb3RvYnVmOjpBbnk+KCkpOworCisgIGFueS5zZXRfdHlwZV91cmwoIi9wcm90b2J1Zl91bml0dGVzdC5UZXN0QW55Iik7CisgIEVYUEVDVF9UUlVFKGFueS5Jczxwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFueT4oKSk7CisgIC8vIFRoZSB0eXBlIFVSTCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lICIvIi4KKyAgYW55LnNldF90eXBlX3VybCgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFueSIpOworICBFWFBFQ1RfRkFMU0UoYW55LklzPHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QW55PigpKTsKKyAgLy8gVGhlIHR5cGUgbmFtZSBhZnRlciB0aGUgc2xhc2ggbXVzdCBiZSBmdWxseSBxdWFsaWZpZWQuCisgIGFueS5zZXRfdHlwZV91cmwoIi9UZXN0QW55Iik7CisgIEVYUEVDVF9GQUxTRShhbnkuSXM8cHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbnk+KCkpOworfQorCitURVNUKEFueVRlc3QsIE1vdmVDb25zdHJ1Y3RvcikgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFueSBwYXlsb2FkOworICBwYXlsb2FkLnNldF9pbnQzMl92YWx1ZSgxMjM0NSk7CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6QW55IHNyYzsKKyAgc3JjLlBhY2tGcm9tKHBheWxvYWQpOworCisgIGNvbnN0IGNoYXIqIHR5cGVfdXJsID0gc3JjLnR5cGVfdXJsKCkuZGF0YSgpOworCisgIGdvb2dsZTo6cHJvdG9idWY6OkFueSBkc3Qoc3RkOjptb3ZlKHNyYykpOworICBFWFBFQ1RfRVEodHlwZV91cmwsIGRzdC50eXBlX3VybCgpLmRhdGEoKSk7CisgIHBheWxvYWQuQ2xlYXIoKTsKKyAgQVNTRVJUX1RSVUUoZHN0LlVucGFja1RvKCZwYXlsb2FkKSk7CisgIEVYUEVDVF9FUSgxMjM0NSwgcGF5bG9hZC5pbnQzMl92YWx1ZSgpKTsKK30KKworVEVTVChBbnlUZXN0LCBNb3ZlQXNzaWdubWVudCkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFueSBwYXlsb2FkOworICBwYXlsb2FkLnNldF9pbnQzMl92YWx1ZSgxMjM0NSk7CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6QW55IHNyYzsKKyAgc3JjLlBhY2tGcm9tKHBheWxvYWQpOworCisgIGNvbnN0IGNoYXIqIHR5cGVfdXJsID0gc3JjLnR5cGVfdXJsKCkuZGF0YSgpOworCisgIGdvb2dsZTo6cHJvdG9idWY6OkFueSBkc3Q7CisgIGRzdCA9IHN0ZDo6bW92ZShzcmMpOworICBFWFBFQ1RfRVEodHlwZV91cmwsIGRzdC50eXBlX3VybCgpLmRhdGEoKSk7CisgIHBheWxvYWQuQ2xlYXIoKTsKKyAgQVNTRVJUX1RSVUUoZHN0LlVucGFja1RvKCZwYXlsb2FkKSk7CisgIEVYUEVDVF9FUSgxMjM0NSwgcGF5bG9hZC5pbnQzMl92YWx1ZSgpKTsKK30KKworI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCisjaWZuZGVmIE5ERUJVRworVEVTVChBbnlUZXN0LCBQYWNrU2VsZkRlYXRoKSB7CisgIGdvb2dsZTo6cHJvdG9idWY6OkFueSBhbnk7CisgIEVYUEVDVF9ERUFUSChhbnkuUGFja0Zyb20oYW55KSwgIiZtZXNzYWdlIik7CisgIEVYUEVDVF9ERUFUSChhbnkuUGFja0Zyb20oYW55LCAiIiksICImbWVzc2FnZSIpOworfQorI2VuZGlmICAvLyAhTkRFQlVHCisjZW5kaWYgIC8vIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCisKKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NjAzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnByb3RvCkBAIC0wLDAgKzEsNDQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIjsKKworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIlRlc3RBbnlQcm90byI7CisKK21lc3NhZ2UgVGVzdEFueSB7CisgIGludDMyIGludDMyX3ZhbHVlID0gMTsKKyAgZ29vZ2xlLnByb3RvYnVmLkFueSBhbnlfdmFsdWUgPSAyOworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuQW55IHJlcGVhdGVkX2FueV92YWx1ZSA9IDM7CisgIHN0cmluZyB0ZXh0ID0gNDsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvYXBpLnBiLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcGkucGIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiNjA0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvYXBpLnBiLmNjCkBAIC0wLDAgKzEsMTMwOSBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90bworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FwaS5wYi5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworUFJPVE9CVUZfUFJBR01BX0lOSVRfU0VHCisKK25hbWVzcGFjZSBfcGIgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDsKK25hbWVzcGFjZSBfcGJpID0gX3BiOjppbnRlcm5hbDsKKworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK1BST1RPQlVGX0NPTlNURVhQUiBBcGk6OkFwaSgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8ubWV0aG9kc18pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5taXhpbnNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5uYW1lXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8udmVyc2lvbl8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnNvdXJjZV9jb250ZXh0XykqL251bGxwdHIKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5zeW50YXhfKSovMAorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX0ge30KK3N0cnVjdCBBcGlEZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIEFwaURlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5BcGlEZWZhdWx0VHlwZUludGVybmFsKCkge30KKyAgdW5pb24geworICAgIEFwaSBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBBcGlEZWZhdWx0VHlwZUludGVybmFsIF9BcGlfZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9DT05TVEVYUFIgTWV0aG9kOjpNZXRob2QoCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5uYW1lXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8ucmVxdWVzdF90eXBlX3VybF8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnJlc3BvbnNlX3R5cGVfdXJsXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8ucmVxdWVzdF9zdHJlYW1pbmdfKSovZmFsc2UKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5yZXNwb25zZV9zdHJlYW1pbmdfKSovZmFsc2UKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5zeW50YXhfKSovMAorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX0ge30KK3N0cnVjdCBNZXRob2REZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIE1ldGhvZERlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5NZXRob2REZWZhdWx0VHlwZUludGVybmFsKCkge30KKyAgdW5pb24geworICAgIE1ldGhvZCBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBNZXRob2REZWZhdWx0VHlwZUludGVybmFsIF9NZXRob2RfZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9DT05TVEVYUFIgTWl4aW46Ok1peGluKAorICAgIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZCk6IF9pbXBsX3sKKyAgICAvKmRlY2x0eXBlKF9pbXBsXy5uYW1lXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8ucm9vdF8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX0ge30KK3N0cnVjdCBNaXhpbkRlZmF1bHRUeXBlSW50ZXJuYWwgeworICBQUk9UT0JVRl9DT05TVEVYUFIgTWl4aW5EZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+TWl4aW5EZWZhdWx0VHlwZUludGVybmFsKCkge30KKyAgdW5pb24geworICAgIE1peGluIF9pbnN0YW5jZTsKKyAgfTsKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIE1peGluRGVmYXVsdFR5cGVJbnRlcm5hbCBfTWl4aW5fZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK3N0YXRpYyA6Ol9wYjo6TWV0YWRhdGEgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvWzNdOworc3RhdGljIGNvbnN0ZXhwciA6Ol9wYjo6RW51bURlc2NyaXB0b3IgY29uc3QqKiBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZhcGlfMmVwcm90byA9IG51bGxwdHI7CitzdGF0aWMgY29uc3RleHByIDo6X3BiOjpTZXJ2aWNlRGVzY3JpcHRvciBjb25zdCoqIGZpbGVfbGV2ZWxfc2VydmljZV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvID0gbnVsbHB0cjsKKworY29uc3QgdWludDMyX3QgVGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZhcGlfMmVwcm90bzo6b2Zmc2V0c1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0geworICB+MHUsICAvLyBubyBfaGFzX2JpdHNfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXBpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgfjB1LCAgLy8gbm8gX2V4dGVuc2lvbnNfCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFwaSwgX2ltcGxfLm5hbWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcGksIF9pbXBsXy5tZXRob2RzXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXBpLCBfaW1wbF8ub3B0aW9uc18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFwaSwgX2ltcGxfLnZlcnNpb25fKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcGksIF9pbXBsXy5zb3VyY2VfY29udGV4dF8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFwaSwgX2ltcGxfLm1peGluc18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFwaSwgX2ltcGxfLnN5bnRheF8pLAorICB+MHUsICAvLyBubyBfaGFzX2JpdHNfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgfjB1LCAgLy8gbm8gX2V4dGVuc2lvbnNfCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZCwgX2ltcGxfLm5hbWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2QsIF9pbXBsXy5yZXF1ZXN0X3R5cGVfdXJsXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kLCBfaW1wbF8ucmVxdWVzdF9zdHJlYW1pbmdfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2QsIF9pbXBsXy5yZXNwb25zZV90eXBlX3VybF8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZCwgX2ltcGxfLnJlc3BvbnNlX3N0cmVhbWluZ18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZCwgX2ltcGxfLm9wdGlvbnNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2QsIF9pbXBsXy5zeW50YXhfKSwKKyAgfjB1LCAgLy8gbm8gX2hhc19iaXRzXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1peGluLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgfjB1LCAgLy8gbm8gX2V4dGVuc2lvbnNfCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1peGluLCBfaW1wbF8ubmFtZV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1peGluLCBfaW1wbF8ucm9vdF8pLAorfTsKK3N0YXRpYyBjb25zdCA6Ol9wYmk6Ok1pZ3JhdGlvblNjaGVtYSBzY2hlbWFzW10gUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRShwcm90b2Rlc2NfY29sZCkgPSB7CisgIHsgMCwgLTEsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFwaSl9LAorICB7IDEzLCAtMSwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kKX0sCisgIHsgMjYsIC0xLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNaXhpbil9LAorfTsKKworc3RhdGljIGNvbnN0IDo6X3BiOjpNZXNzYWdlKiBjb25zdCBmaWxlX2RlZmF1bHRfaW5zdGFuY2VzW10gPSB7CisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X0FwaV9kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X01ldGhvZF9kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X01peGluX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKK307CisKK2NvbnN0IGNoYXIgZGVzY3JpcHRvcl90YWJsZV9wcm90b2RlZl9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvW10gUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRShwcm90b2Rlc2NfY29sZCkgPQorICAiXG5cMDMxZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90b1wwMjJcMDE3Z29vZ2xlLnByb3QiCisgICJvYnVmXDAzMiRnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucHJvIgorICAidG9cMDMyXDAzMmdvb2dsZS9wcm90b2J1Zi90eXBlLnByb3RvXCJcMjAxXDAwMlxuXDAwM0FwaVwwMjJcMDE0IgorICAiXG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyKFxuXDAwN21ldGhvZHNcMDMwXDAwMiBcMDAzKFwwMTMyXDAyNy5nb29nbGUucCIKKyAgInJvdG9idWYuTWV0aG9kXDAyMihcblwwMDdvcHRpb25zXDAzMFwwMDMgXDAwMyhcMDEzMlwwMjcuZ29vZ2xlIgorICAiLnByb3RvYnVmLk9wdGlvblwwMjJcMDE3XG5cMDA3dmVyc2lvblwwMzBcMDA0IFwwMDEoXHRcMDIyNlxuXDAxNnNvdSIKKyAgInJjZV9jb250ZXh0XDAzMFwwMDUgXDAwMShcMDEzMlwwMzYuZ29vZ2xlLnByb3RvYnVmLlNvdXIiCisgICJjZUNvbnRleHRcMDIyJlxuXDAwNm1peGluc1wwMzBcMDA2IFwwMDMoXDAxMzJcMDI2Lmdvb2dsZS5wcm90byIKKyAgImJ1Zi5NaXhpblwwMjJcJ1xuXDAwNnN5bnRheFwwMzBcMDA3IFwwMDEoXDAxNjJcMDI3Lmdvb2dsZS5wcm90byIKKyAgImJ1Zi5TeW50YXhcIlwzMjVcMDAxXG5cMDA2TWV0aG9kXDAyMlwwMTRcblwwMDRuYW1lXDAzMFwwMDEgXDAwMShcdFwwMjJcMDMwXG5cMDIwciIKKyAgImVxdWVzdF90eXBlX3VybFwwMzBcMDAyIFwwMDEoXHRcMDIyXDAzMVxuXDAyMXJlcXVlc3Rfc3RyZWFtaSIKKyAgIm5nXDAzMFwwMDMgXDAwMShcMDEwXDAyMlwwMzFcblwwMjFyZXNwb25zZV90eXBlX3VybFwwMzBcMDA0IFwwMDEoXHRcMDIyXDAzMlxuXDAyMnIiCisgICJlc3BvbnNlX3N0cmVhbWluZ1wwMzBcMDA1IFwwMDEoXDAxMFwwMjIoXG5cMDA3b3B0aW9uc1wwMzBcMDA2IFwwMDMoXDAxMyIKKyAgIjJcMDI3Lmdvb2dsZS5wcm90b2J1Zi5PcHRpb25cMDIyXCdcblwwMDZzeW50YXhcMDMwXDAwNyBcMDAxKCIKKyAgIlwwMTYyXDAyNy5nb29nbGUucHJvdG9idWYuU3ludGF4XCIjXG5cMDA1TWl4aW5cMDIyXDAxNFxuXDAwNG4iCisgICJhbWVcMDMwXDAwMSBcMDAxKFx0XDAyMlwwMTRcblwwMDRyb290XDAzMFwwMDIgXDAwMShcdEJ2XG5cMDIzY29tLmdvb2dsZS5wciIKKyAgIm90b2J1ZkJcMDEwQXBpUHJvdG9QXDAwMVosZ29vZ2xlLmdvbGFuZy5vcmcvcHIiCisgICJvdG9idWYvdHlwZXMva25vd24vYXBpcGJcMjQyXDAwMlwwMDNHUEJcMjUyXDAwMlwwMzZHb29nbGUuIgorICAiUHJvdG9idWYuV2VsbEtub3duVHlwZXNiXDAwNnByb3RvMyIKKyAgOworc3RhdGljIGNvbnN0IDo6X3BiaTo6RGVzY3JpcHRvclRhYmxlKiBjb25zdCBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmYXBpXzJlcHJvdG9fZGVwc1syXSA9IHsKKyAgJjo6ZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnNvdXJjZV81ZmNvbnRleHRfMmVwcm90bywKKyAgJjo6ZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90bywKK307CitzdGF0aWMgOjpfcGJpOjpvbmNlX2ZsYWcgZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvX29uY2U7Citjb25zdCA6Ol9wYmk6OkRlc2NyaXB0b3JUYWJsZSBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmYXBpXzJlcHJvdG8gPSB7CisgICAgZmFsc2UsIGZhbHNlLCA3NTEsIGRlc2NyaXB0b3JfdGFibGVfcHJvdG9kZWZfZ29vZ2xlXzJmcHJvdG9idWZfMmZhcGlfMmVwcm90bywKKyAgICAiZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90byIsCisgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZhcGlfMmVwcm90b19vbmNlLCBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmYXBpXzJlcHJvdG9fZGVwcywgMiwgMywKKyAgICBzY2hlbWFzLCBmaWxlX2RlZmF1bHRfaW5zdGFuY2VzLCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvOjpvZmZzZXRzLAorICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZhcGlfMmVwcm90bywgZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmYXBpXzJlcHJvdG8sCisgICAgZmlsZV9sZXZlbF9zZXJ2aWNlX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmYXBpXzJlcHJvdG8sCit9OworUFJPVE9CVUZfQVRUUklCVVRFX1dFQUsgY29uc3QgOjpfcGJpOjpEZXNjcmlwdG9yVGFibGUqIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZhcGlfMmVwcm90b19nZXR0ZXIoKSB7CisgIHJldHVybiAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvOworfQorCisvLyBGb3JjZSBydW5uaW5nIEFkZERlc2NyaXB0b3JzKCkgYXQgZHluYW1pYyBpbml0aWFsaXphdGlvbiB0aW1lLgorUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkyIHN0YXRpYyA6Ol9wYmk6OkFkZERlc2NyaXB0b3JzUnVubmVyIGR5bmFtaWNfaW5pdF9kdW1teV9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvKCZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmYXBpXzJlcHJvdG8pOworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBBcGk6Ol9JbnRlcm5hbCB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQmIHNvdXJjZV9jb250ZXh0KGNvbnN0IEFwaSogbXNnKTsKK307CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0JgorQXBpOjpfSW50ZXJuYWw6OnNvdXJjZV9jb250ZXh0KGNvbnN0IEFwaSogbXNnKSB7CisgIHJldHVybiAqbXNnLT5faW1wbF8uc291cmNlX2NvbnRleHRfOworfQordm9pZCBBcGk6OmNsZWFyX29wdGlvbnMoKSB7CisgIF9pbXBsXy5vcHRpb25zXy5DbGVhcigpOworfQordm9pZCBBcGk6OmNsZWFyX3NvdXJjZV9jb250ZXh0KCkgeworICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0ciAmJiBfaW1wbF8uc291cmNlX2NvbnRleHRfICE9IG51bGxwdHIpIHsKKyAgICBkZWxldGUgX2ltcGxfLnNvdXJjZV9jb250ZXh0XzsKKyAgfQorICBfaW1wbF8uc291cmNlX2NvbnRleHRfID0gbnVsbHB0cjsKK30KK0FwaTo6QXBpKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkFwaSkKK30KK0FwaTo6QXBpKGNvbnN0IEFwaSYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgQXBpKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLm1ldGhvZHNfKXtmcm9tLl9pbXBsXy5tZXRob2RzX30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXyl7ZnJvbS5faW1wbF8ub3B0aW9uc199CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubWl4aW5zXyl7ZnJvbS5faW1wbF8ubWl4aW5zX30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnZlcnNpb25fKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uc291cmNlX2NvbnRleHRfKXtudWxscHRyfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnN5bnRheF8pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX2ltcGxfLm5hbWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoIWZyb20uX2ludGVybmFsX25hbWUoKS5lbXB0eSgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5uYW1lXy5TZXQoZnJvbS5faW50ZXJuYWxfbmFtZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgX2ltcGxfLnZlcnNpb25fLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLnZlcnNpb25fLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoIWZyb20uX2ludGVybmFsX3ZlcnNpb24oKS5lbXB0eSgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy52ZXJzaW9uXy5TZXQoZnJvbS5faW50ZXJuYWxfdmVyc2lvbigpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19zb3VyY2VfY29udGV4dCgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5zb3VyY2VfY29udGV4dF8gPSBuZXcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQoKmZyb20uX2ltcGxfLnNvdXJjZV9jb250ZXh0Xyk7CisgIH0KKyAgX3RoaXMtPl9pbXBsXy5zeW50YXhfID0gZnJvbS5faW1wbF8uc3ludGF4XzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkFwaSkKK30KKworaW5saW5lIHZvaWQgQXBpOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5tZXRob2RzXyl7YXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ub3B0aW9uc18pe2FyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm1peGluc18pe2FyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm5hbWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8udmVyc2lvbl8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zb3VyY2VfY29udGV4dF8pe251bGxwdHJ9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uc3ludGF4Xyl7MH0KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICB9OworICBfaW1wbF8ubmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIF9pbXBsXy52ZXJzaW9uXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy52ZXJzaW9uXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKK30KKworQXBpOjp+QXBpKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuQXBpKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgQXBpOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8ubWV0aG9kc18uflJlcGVhdGVkUHRyRmllbGQoKTsKKyAgX2ltcGxfLm9wdGlvbnNfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5taXhpbnNfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5uYW1lXy5EZXN0cm95KCk7CisgIF9pbXBsXy52ZXJzaW9uXy5EZXN0cm95KCk7CisgIGlmICh0aGlzICE9IGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSkgZGVsZXRlIF9pbXBsXy5zb3VyY2VfY29udGV4dF87Cit9CisKK3ZvaWQgQXBpOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIF9pbXBsXy5fY2FjaGVkX3NpemVfLlNldChzaXplKTsKK30KKwordm9pZCBBcGk6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkFwaSkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLm1ldGhvZHNfLkNsZWFyKCk7CisgIF9pbXBsXy5vcHRpb25zXy5DbGVhcigpOworICBfaW1wbF8ubWl4aW5zXy5DbGVhcigpOworICBfaW1wbF8ubmFtZV8uQ2xlYXJUb0VtcHR5KCk7CisgIF9pbXBsXy52ZXJzaW9uXy5DbGVhclRvRW1wdHkoKTsKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIgJiYgX2ltcGxfLnNvdXJjZV9jb250ZXh0XyAhPSBudWxscHRyKSB7CisgICAgZGVsZXRlIF9pbXBsXy5zb3VyY2VfY29udGV4dF87CisgIH0KKyAgX2ltcGxfLnNvdXJjZV9jb250ZXh0XyA9IG51bGxwdHI7CisgIF9pbXBsXy5zeW50YXhfID0gMDsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5DbGVhcjw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworfQorCitjb25zdCBjaGFyKiBBcGk6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gc3RyaW5nIG5hbWUgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTApKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgIENIS18oOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5BcGkubmFtZSIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZCBtZXRob2RzID0gMjsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDE4KSkgeworICAgICAgICAgIHB0ciAtPSAxOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX2FkZF9tZXRob2RzKCksIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzwxOD4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PcHRpb24gb3B0aW9ucyA9IDM7CisgICAgICBjYXNlIDM6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAyNikpIHsKKyAgICAgICAgICBwdHIgLT0gMTsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9hZGRfb3B0aW9ucygpLCBwdHIpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8MjY+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHN0cmluZyB2ZXJzaW9uID0gNDsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDM0KSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfdmVyc2lvbigpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICBDSEtfKDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuQXBpLnZlcnNpb24iKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb250ZXh0IHNvdXJjZV9jb250ZXh0ID0gNTsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDQyKSkgeworICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9tdXRhYmxlX3NvdXJjZV9jb250ZXh0KCksIHB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWl4aW4gbWl4aW5zID0gNjsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDUwKSkgeworICAgICAgICAgIHB0ciAtPSAxOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX2FkZF9taXhpbnMoKSwgcHRyKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDUwPihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyAuZ29vZ2xlLnByb3RvYnVmLlN5bnRheCBzeW50YXggPSA3OworICAgICAgY2FzZSA3OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNTYpKSB7CisgICAgICAgICAgdWludDY0X3QgdmFsID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgIF9pbnRlcm5hbF9zZXRfc3ludGF4KHN0YXRpY19jYXN0PDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTeW50YXg+KHZhbCkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIEFwaTo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuQXBpKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKCF0aGlzLT5faW50ZXJuYWxfbmFtZSgpLmVtcHR5KCkpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKAorICAgICAgdGhpcy0+X2ludGVybmFsX25hbWUoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX25hbWUoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkFwaS5uYW1lIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgMSwgdGhpcy0+X2ludGVybmFsX25hbWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWV0aG9kIG1ldGhvZHMgPSAyOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfbWV0aG9kc19zaXplKCkpOyBpIDwgbjsgaSsrKSB7CisgICAgY29uc3QgYXV0byYgcmVwZmllbGQgPSB0aGlzLT5faW50ZXJuYWxfbWV0aG9kcyhpKTsKKyAgICB0YXJnZXQgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoMiwgcmVwZmllbGQsIHJlcGZpZWxkLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PcHRpb24gb3B0aW9ucyA9IDM7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9vcHRpb25zX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9vcHRpb25zKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSgzLCByZXBmaWVsZCwgcmVwZmllbGQuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICAvLyBzdHJpbmcgdmVyc2lvbiA9IDQ7CisgIGlmICghdGhpcy0+X2ludGVybmFsX3ZlcnNpb24oKS5lbXB0eSgpKSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZygKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF92ZXJzaW9uKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF92ZXJzaW9uKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5BcGkudmVyc2lvbiIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDQsIHRoaXMtPl9pbnRlcm5hbF92ZXJzaW9uKCksIHRhcmdldCk7CisgIH0KKworICAvLyAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQgc291cmNlX2NvbnRleHQgPSA1OworICBpZiAodGhpcy0+X2ludGVybmFsX2hhc19zb3VyY2VfY29udGV4dCgpKSB7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg1LCBfSW50ZXJuYWw6OnNvdXJjZV9jb250ZXh0KHRoaXMpLAorICAgICAgICBfSW50ZXJuYWw6OnNvdXJjZV9jb250ZXh0KHRoaXMpLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NaXhpbiBtaXhpbnMgPSA2OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfbWl4aW5zX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9taXhpbnMoaSk7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICAgIEludGVybmFsV3JpdGVNZXNzYWdlKDYsIHJlcGZpZWxkLCByZXBmaWVsZC5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIC5nb29nbGUucHJvdG9idWYuU3ludGF4IHN5bnRheCA9IDc7CisgIGlmICh0aGlzLT5faW50ZXJuYWxfc3ludGF4KCkgIT0gMCkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAorICAgICAgNywgdGhpcy0+X2ludGVybmFsX3N5bnRheCgpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkFwaSkKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IEFwaTo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5BcGkpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZCBtZXRob2RzID0gMjsKKyAgdG90YWxfc2l6ZSArPSAxVUwgKiB0aGlzLT5faW50ZXJuYWxfbWV0aG9kc19zaXplKCk7CisgIGZvciAoY29uc3QgYXV0byYgbXNnIDogdGhpcy0+X2ltcGxfLm1ldGhvZHNfKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUobXNnKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT3B0aW9uIG9wdGlvbnMgPSAzOworICB0b3RhbF9zaXplICs9IDFVTCAqIHRoaXMtPl9pbnRlcm5hbF9vcHRpb25zX3NpemUoKTsKKyAgZm9yIChjb25zdCBhdXRvJiBtc2cgOiB0aGlzLT5faW1wbF8ub3B0aW9uc18pIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZShtc2cpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NaXhpbiBtaXhpbnMgPSA2OworICB0b3RhbF9zaXplICs9IDFVTCAqIHRoaXMtPl9pbnRlcm5hbF9taXhpbnNfc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy5taXhpbnNfKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUobXNnKTsKKyAgfQorCisgIC8vIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKCF0aGlzLT5faW50ZXJuYWxfbmFtZSgpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgdGhpcy0+X2ludGVybmFsX25hbWUoKSk7CisgIH0KKworICAvLyBzdHJpbmcgdmVyc2lvbiA9IDQ7CisgIGlmICghdGhpcy0+X2ludGVybmFsX3ZlcnNpb24oKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgIHRoaXMtPl9pbnRlcm5hbF92ZXJzaW9uKCkpOworICB9CisKKyAgLy8gLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb250ZXh0IHNvdXJjZV9jb250ZXh0ID0gNTsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9oYXNfc291cmNlX2NvbnRleHQoKSkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZSgKKyAgICAgICAgKl9pbXBsXy5zb3VyY2VfY29udGV4dF8pOworICB9CisKKyAgLy8gLmdvb2dsZS5wcm90b2J1Zi5TeW50YXggc3ludGF4ID0gNzsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9zeW50YXgoKSAhPSAwKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPl9pbnRlcm5hbF9zeW50YXgoKSk7CisgIH0KKworICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBBcGk6Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBBcGk6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqQXBpOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBBcGk6Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxBcGkqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IEFwaSY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkFwaSkKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF90aGlzLT5faW1wbF8ubWV0aG9kc18uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLm1ldGhvZHNfKTsKKyAgX3RoaXMtPl9pbXBsXy5vcHRpb25zXy5NZXJnZUZyb20oZnJvbS5faW1wbF8ub3B0aW9uc18pOworICBfdGhpcy0+X2ltcGxfLm1peGluc18uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLm1peGluc18pOworICBpZiAoIWZyb20uX2ludGVybmFsX25hbWUoKS5lbXB0eSgpKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfbmFtZShmcm9tLl9pbnRlcm5hbF9uYW1lKCkpOworICB9CisgIGlmICghZnJvbS5faW50ZXJuYWxfdmVyc2lvbigpLmVtcHR5KCkpIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF92ZXJzaW9uKGZyb20uX2ludGVybmFsX3ZlcnNpb24oKSk7CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19zb3VyY2VfY29udGV4dCgpKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9tdXRhYmxlX3NvdXJjZV9jb250ZXh0KCktPjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0OjpNZXJnZUZyb20oCisgICAgICAgIGZyb20uX2ludGVybmFsX3NvdXJjZV9jb250ZXh0KCkpOworICB9CisgIGlmIChmcm9tLl9pbnRlcm5hbF9zeW50YXgoKSAhPSAwKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfc3ludGF4KGZyb20uX2ludGVybmFsX3N5bnRheCgpKTsKKyAgfQorICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBBcGk6OkNvcHlGcm9tKGNvbnN0IEFwaSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuQXBpKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgQXBpOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBcGk6OkludGVybmFsU3dhcChBcGkqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgYXV0byogbGhzX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGF1dG8qIHJoc19hcmVuYSA9IG90aGVyLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX2ltcGxfLm1ldGhvZHNfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5tZXRob2RzXyk7CisgIF9pbXBsXy5vcHRpb25zXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8ub3B0aW9uc18pOworICBfaW1wbF8ubWl4aW5zXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8ubWl4aW5zXyk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8ubmFtZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLm5hbWVfLCByaHNfYXJlbmEKKyAgKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy52ZXJzaW9uXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8udmVyc2lvbl8sIHJoc19hcmVuYQorICApOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Om1lbXN3YXA8CisgICAgICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoQXBpLCBfaW1wbF8uc3ludGF4XykKKyAgICAgICsgc2l6ZW9mKEFwaTo6X2ltcGxfLnN5bnRheF8pCisgICAgICAtIFBST1RPQlVGX0ZJRUxEX09GRlNFVChBcGksIF9pbXBsXy5zb3VyY2VfY29udGV4dF8pPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLnNvdXJjZV9jb250ZXh0XyksCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm90aGVyLT5faW1wbF8uc291cmNlX2NvbnRleHRfKSk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBBcGk6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmYXBpXzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmYXBpXzJlcHJvdG9bMF0pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIE1ldGhvZDo6X0ludGVybmFsIHsKKyBwdWJsaWM6Cit9OworCit2b2lkIE1ldGhvZDo6Y2xlYXJfb3B0aW9ucygpIHsKKyAgX2ltcGxfLm9wdGlvbnNfLkNsZWFyKCk7Cit9CitNZXRob2Q6Ok1ldGhvZCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NZXRob2QpCit9CitNZXRob2Q6Ok1ldGhvZChjb25zdCBNZXRob2QmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIE1ldGhvZCogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXyl7ZnJvbS5faW1wbF8ub3B0aW9uc199CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubmFtZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5yZXF1ZXN0X3R5cGVfdXJsXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnJlc3BvbnNlX3R5cGVfdXJsXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnJlcXVlc3Rfc3RyZWFtaW5nXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnJlc3BvbnNlX3N0cmVhbWluZ18pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zeW50YXhfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF9uYW1lKCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW1wbF8ubmFtZV8uU2V0KGZyb20uX2ludGVybmFsX25hbWUoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIF9pbXBsXy5yZXF1ZXN0X3R5cGVfdXJsXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5yZXF1ZXN0X3R5cGVfdXJsXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF9yZXF1ZXN0X3R5cGVfdXJsKCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW1wbF8ucmVxdWVzdF90eXBlX3VybF8uU2V0KGZyb20uX2ludGVybmFsX3JlcXVlc3RfdHlwZV91cmwoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIF9pbXBsXy5yZXNwb25zZV90eXBlX3VybF8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ucmVzcG9uc2VfdHlwZV91cmxfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoIWZyb20uX2ludGVybmFsX3Jlc3BvbnNlX3R5cGVfdXJsKCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW1wbF8ucmVzcG9uc2VfdHlwZV91cmxfLlNldChmcm9tLl9pbnRlcm5hbF9yZXNwb25zZV90eXBlX3VybCgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgOjptZW1jcHkoJl9pbXBsXy5yZXF1ZXN0X3N0cmVhbWluZ18sICZmcm9tLl9pbXBsXy5yZXF1ZXN0X3N0cmVhbWluZ18sCisgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLnN5bnRheF8pIC0KKyAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLnJlcXVlc3Rfc3RyZWFtaW5nXykpICsgc2l6ZW9mKF9pbXBsXy5zeW50YXhfKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NZXRob2QpCit9CisKK2lubGluZSB2b2lkIE1ldGhvZDo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8ub3B0aW9uc18pe2FyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm5hbWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucmVxdWVzdF90eXBlX3VybF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5yZXNwb25zZV90eXBlX3VybF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5yZXF1ZXN0X3N0cmVhbWluZ18pe2ZhbHNlfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnJlc3BvbnNlX3N0cmVhbWluZ18pe2ZhbHNlfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnN5bnRheF8pezB9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgfTsKKyAgX2ltcGxfLm5hbWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBfaW1wbF8ucmVxdWVzdF90eXBlX3VybF8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ucmVxdWVzdF90eXBlX3VybF8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIF9pbXBsXy5yZXNwb25zZV90eXBlX3VybF8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ucmVzcG9uc2VfdHlwZV91cmxfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworfQorCitNZXRob2Q6On5NZXRob2QoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NZXRob2QpCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBNZXRob2Q6OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy5vcHRpb25zXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworICBfaW1wbF8ubmFtZV8uRGVzdHJveSgpOworICBfaW1wbF8ucmVxdWVzdF90eXBlX3VybF8uRGVzdHJveSgpOworICBfaW1wbF8ucmVzcG9uc2VfdHlwZV91cmxfLkRlc3Ryb3koKTsKK30KKwordm9pZCBNZXRob2Q6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIE1ldGhvZDo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuTWV0aG9kKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfaW1wbF8ub3B0aW9uc18uQ2xlYXIoKTsKKyAgX2ltcGxfLm5hbWVfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8ucmVxdWVzdF90eXBlX3VybF8uQ2xlYXJUb0VtcHR5KCk7CisgIF9pbXBsXy5yZXNwb25zZV90eXBlX3VybF8uQ2xlYXJUb0VtcHR5KCk7CisgIDo6bWVtc2V0KCZfaW1wbF8ucmVxdWVzdF9zdHJlYW1pbmdfLCAwLCBzdGF0aWNfY2FzdDxzaXplX3Q+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5zeW50YXhfKSAtCisgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLnJlcXVlc3Rfc3RyZWFtaW5nXykpICsgc2l6ZW9mKF9pbXBsXy5zeW50YXhfKSk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogTWV0aG9kOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIHN0cmluZyBuYW1lID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDEwKSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICBDSEtfKDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuTWV0aG9kLm5hbWUiKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gc3RyaW5nIHJlcXVlc3RfdHlwZV91cmwgPSAyOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTgpKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9yZXF1ZXN0X3R5cGVfdXJsKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgIENIS18oOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5NZXRob2QucmVxdWVzdF90eXBlX3VybCIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBib29sIHJlcXVlc3Rfc3RyZWFtaW5nID0gMzsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDI0KSkgeworICAgICAgICAgIF9pbXBsXy5yZXF1ZXN0X3N0cmVhbWluZ18gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gc3RyaW5nIHJlc3BvbnNlX3R5cGVfdXJsID0gNDsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDM0KSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfcmVzcG9uc2VfdHlwZV91cmwoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgQ0hLXyg6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLk1ldGhvZC5yZXNwb25zZV90eXBlX3VybCIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBib29sIHJlc3BvbnNlX3N0cmVhbWluZyA9IDU7CisgICAgICBjYXNlIDU6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA0MCkpIHsKKyAgICAgICAgICBfaW1wbF8ucmVzcG9uc2Vfc3RyZWFtaW5nXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk9wdGlvbiBvcHRpb25zID0gNjsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDUwKSkgeworICAgICAgICAgIHB0ciAtPSAxOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX2FkZF9vcHRpb25zKCksIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzw1MD4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gLmdvb2dsZS5wcm90b2J1Zi5TeW50YXggc3ludGF4ID0gNzsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDU2KSkgeworICAgICAgICAgIHVpbnQ2NF90IHZhbCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICBfaW50ZXJuYWxfc2V0X3N5bnRheChzdGF0aWNfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3ludGF4Pih2YWwpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBNZXRob2Q6Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZCkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyBzdHJpbmcgbmFtZSA9IDE7CisgIGlmICghdGhpcy0+X2ludGVybmFsX25hbWUoKS5lbXB0eSgpKSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZygKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2QubmFtZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDEsIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCksIHRhcmdldCk7CisgIH0KKworICAvLyBzdHJpbmcgcmVxdWVzdF90eXBlX3VybCA9IDI7CisgIGlmICghdGhpcy0+X2ludGVybmFsX3JlcXVlc3RfdHlwZV91cmwoKS5lbXB0eSgpKSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZygKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9yZXF1ZXN0X3R5cGVfdXJsKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9yZXF1ZXN0X3R5cGVfdXJsKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2QucmVxdWVzdF90eXBlX3VybCIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDIsIHRoaXMtPl9pbnRlcm5hbF9yZXF1ZXN0X3R5cGVfdXJsKCksIHRhcmdldCk7CisgIH0KKworICAvLyBib29sIHJlcXVlc3Rfc3RyZWFtaW5nID0gMzsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9yZXF1ZXN0X3N0cmVhbWluZygpICE9IDApIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgzLCB0aGlzLT5faW50ZXJuYWxfcmVxdWVzdF9zdHJlYW1pbmcoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHN0cmluZyByZXNwb25zZV90eXBlX3VybCA9IDQ7CisgIGlmICghdGhpcy0+X2ludGVybmFsX3Jlc3BvbnNlX3R5cGVfdXJsKCkuZW1wdHkoKSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICB0aGlzLT5faW50ZXJuYWxfcmVzcG9uc2VfdHlwZV91cmwoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX3Jlc3BvbnNlX3R5cGVfdXJsKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2QucmVzcG9uc2VfdHlwZV91cmwiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICA0LCB0aGlzLT5faW50ZXJuYWxfcmVzcG9uc2VfdHlwZV91cmwoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIGJvb2wgcmVzcG9uc2Vfc3RyZWFtaW5nID0gNTsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9yZXNwb25zZV9zdHJlYW1pbmcoKSAhPSAwKSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoNSwgdGhpcy0+X2ludGVybmFsX3Jlc3BvbnNlX3N0cmVhbWluZygpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PcHRpb24gb3B0aW9ucyA9IDY7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9vcHRpb25zX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9vcHRpb25zKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg2LCByZXBmaWVsZCwgcmVwZmllbGQuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICAvLyAuZ29vZ2xlLnByb3RvYnVmLlN5bnRheCBzeW50YXggPSA3OworICBpZiAodGhpcy0+X2ludGVybmFsX3N5bnRheCgpICE9IDApIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKKyAgICAgIDcsIHRoaXMtPl9pbnRlcm5hbF9zeW50YXgoKSwgdGFyZ2V0KTsKKyAgfQorCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSkgeworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdDo6SW50ZXJuYWxTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5NZXRob2QpCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBNZXRob2Q6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuTWV0aG9kKQorICBzaXplX3QgdG90YWxfc2l6ZSA9IDA7CisKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PcHRpb24gb3B0aW9ucyA9IDY7CisgIHRvdGFsX3NpemUgKz0gMVVMICogdGhpcy0+X2ludGVybmFsX29wdGlvbnNfc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy5vcHRpb25zXykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKG1zZyk7CisgIH0KKworICAvLyBzdHJpbmcgbmFtZSA9IDE7CisgIGlmICghdGhpcy0+X2ludGVybmFsX25hbWUoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkpOworICB9CisKKyAgLy8gc3RyaW5nIHJlcXVlc3RfdHlwZV91cmwgPSAyOworICBpZiAoIXRoaXMtPl9pbnRlcm5hbF9yZXF1ZXN0X3R5cGVfdXJsKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICB0aGlzLT5faW50ZXJuYWxfcmVxdWVzdF90eXBlX3VybCgpKTsKKyAgfQorCisgIC8vIHN0cmluZyByZXNwb25zZV90eXBlX3VybCA9IDQ7CisgIGlmICghdGhpcy0+X2ludGVybmFsX3Jlc3BvbnNlX3R5cGVfdXJsKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICB0aGlzLT5faW50ZXJuYWxfcmVzcG9uc2VfdHlwZV91cmwoKSk7CisgIH0KKworICAvLyBib29sIHJlcXVlc3Rfc3RyZWFtaW5nID0gMzsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9yZXF1ZXN0X3N0cmVhbWluZygpICE9IDApIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICB9CisKKyAgLy8gYm9vbCByZXNwb25zZV9zdHJlYW1pbmcgPSA1OworICBpZiAodGhpcy0+X2ludGVybmFsX3Jlc3BvbnNlX3N0cmVhbWluZygpICE9IDApIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICB9CisKKyAgLy8gLmdvb2dsZS5wcm90b2J1Zi5TeW50YXggc3ludGF4ID0gNzsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9zeW50YXgoKSAhPSAwKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPl9pbnRlcm5hbF9zeW50YXgoKSk7CisgIH0KKworICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBNZXRob2Q6Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBNZXRob2Q6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqTWV0aG9kOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBNZXRob2Q6Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxNZXRob2QqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IE1ldGhvZCY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZCkKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF90aGlzLT5faW1wbF8ub3B0aW9uc18uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLm9wdGlvbnNfKTsKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF9uYW1lKCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X25hbWUoZnJvbS5faW50ZXJuYWxfbmFtZSgpKTsKKyAgfQorICBpZiAoIWZyb20uX2ludGVybmFsX3JlcXVlc3RfdHlwZV91cmwoKS5lbXB0eSgpKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfcmVxdWVzdF90eXBlX3VybChmcm9tLl9pbnRlcm5hbF9yZXF1ZXN0X3R5cGVfdXJsKCkpOworICB9CisgIGlmICghZnJvbS5faW50ZXJuYWxfcmVzcG9uc2VfdHlwZV91cmwoKS5lbXB0eSgpKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfcmVzcG9uc2VfdHlwZV91cmwoZnJvbS5faW50ZXJuYWxfcmVzcG9uc2VfdHlwZV91cmwoKSk7CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX3JlcXVlc3Rfc3RyZWFtaW5nKCkgIT0gMCkgeworICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X3JlcXVlc3Rfc3RyZWFtaW5nKGZyb20uX2ludGVybmFsX3JlcXVlc3Rfc3RyZWFtaW5nKCkpOworICB9CisgIGlmIChmcm9tLl9pbnRlcm5hbF9yZXNwb25zZV9zdHJlYW1pbmcoKSAhPSAwKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfcmVzcG9uc2Vfc3RyZWFtaW5nKGZyb20uX2ludGVybmFsX3Jlc3BvbnNlX3N0cmVhbWluZygpKTsKKyAgfQorICBpZiAoZnJvbS5faW50ZXJuYWxfc3ludGF4KCkgIT0gMCkgeworICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X3N5bnRheChmcm9tLl9pbnRlcm5hbF9zeW50YXgoKSk7CisgIH0KKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgTWV0aG9kOjpDb3B5RnJvbShjb25zdCBNZXRob2QmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZCkKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIE1ldGhvZDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWV0aG9kOjpJbnRlcm5hbFN3YXAoTWV0aG9kKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIGF1dG8qIGxoc19hcmVuYSA9IEdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBhdXRvKiByaHNfYXJlbmEgPSBvdGhlci0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5vcHRpb25zXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8ub3B0aW9uc18pOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLm5hbWVfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5uYW1lXywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8ucmVxdWVzdF90eXBlX3VybF8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLnJlcXVlc3RfdHlwZV91cmxfLCByaHNfYXJlbmEKKyAgKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5yZXNwb25zZV90eXBlX3VybF8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLnJlc3BvbnNlX3R5cGVfdXJsXywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6bWVtc3dhcDwKKyAgICAgIFBST1RPQlVGX0ZJRUxEX09GRlNFVChNZXRob2QsIF9pbXBsXy5zeW50YXhfKQorICAgICAgKyBzaXplb2YoTWV0aG9kOjpfaW1wbF8uc3ludGF4XykKKyAgICAgIC0gUFJPVE9CVUZfRklFTERfT0ZGU0VUKE1ldGhvZCwgX2ltcGxfLnJlcXVlc3Rfc3RyZWFtaW5nXyk+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8ucmVxdWVzdF9zdHJlYW1pbmdfKSwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmb3RoZXItPl9pbXBsXy5yZXF1ZXN0X3N0cmVhbWluZ18pKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIE1ldGhvZDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZhcGlfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmYXBpXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZhcGlfMmVwcm90b1sxXSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgTWl4aW46Ol9JbnRlcm5hbCB7CisgcHVibGljOgorfTsKKworTWl4aW46Ok1peGluKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk1peGluKQorfQorTWl4aW46Ok1peGluKGNvbnN0IE1peGluJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBNaXhpbiogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnJvb3RfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF9uYW1lKCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW1wbF8ubmFtZV8uU2V0KGZyb20uX2ludGVybmFsX25hbWUoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIF9pbXBsXy5yb290Xy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5yb290Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF9yb290KCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW1wbF8ucm9vdF8uU2V0KGZyb20uX2ludGVybmFsX3Jvb3QoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NaXhpbikKK30KKworaW5saW5lIHZvaWQgTWl4aW46OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLm5hbWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucm9vdF8pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICB9OworICBfaW1wbF8ubmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIF9pbXBsXy5yb290Xy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5yb290Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKK30KKworTWl4aW46On5NaXhpbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk1peGluKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgTWl4aW46OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy5uYW1lXy5EZXN0cm95KCk7CisgIF9pbXBsXy5yb290Xy5EZXN0cm95KCk7Cit9CisKK3ZvaWQgTWl4aW46OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIE1peGluOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NaXhpbikKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLm5hbWVfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8ucm9vdF8uQ2xlYXJUb0VtcHR5KCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogTWl4aW46Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gc3RyaW5nIG5hbWUgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTApKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgIENIS18oOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5NaXhpbi5uYW1lIikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHN0cmluZyByb290ID0gMjsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDE4KSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfcm9vdCgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICBDSEtfKDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuTWl4aW4ucm9vdCIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBNaXhpbjo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuTWl4aW4pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gc3RyaW5nIG5hbWUgPSAxOworICBpZiAoIXRoaXMtPl9pbnRlcm5hbF9uYW1lKCkuZW1wdHkoKSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICB0aGlzLT5faW50ZXJuYWxfbmFtZSgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pih0aGlzLT5faW50ZXJuYWxfbmFtZSgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuTWl4aW4ubmFtZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDEsIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCksIHRhcmdldCk7CisgIH0KKworICAvLyBzdHJpbmcgcm9vdCA9IDI7CisgIGlmICghdGhpcy0+X2ludGVybmFsX3Jvb3QoKS5lbXB0eSgpKSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZygKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9yb290KCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9yb290KCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5NaXhpbi5yb290Iik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgMiwgdGhpcy0+X2ludGVybmFsX3Jvb3QoKSwgdGFyZ2V0KTsKKyAgfQorCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSkgeworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdDo6SW50ZXJuYWxTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5NaXhpbikKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IE1peGluOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1peGluKQorICBzaXplX3QgdG90YWxfc2l6ZSA9IDA7CisKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gc3RyaW5nIG5hbWUgPSAxOworICBpZiAoIXRoaXMtPl9pbnRlcm5hbF9uYW1lKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICB0aGlzLT5faW50ZXJuYWxfbmFtZSgpKTsKKyAgfQorCisgIC8vIHN0cmluZyByb290ID0gMjsKKyAgaWYgKCF0aGlzLT5faW50ZXJuYWxfcm9vdCgpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgdGhpcy0+X2ludGVybmFsX3Jvb3QoKSk7CisgIH0KKworICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBNaXhpbjo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIE1peGluOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKk1peGluOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBNaXhpbjo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PE1peGluKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBNaXhpbiY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1peGluKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF9uYW1lKCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X25hbWUoZnJvbS5faW50ZXJuYWxfbmFtZSgpKTsKKyAgfQorICBpZiAoIWZyb20uX2ludGVybmFsX3Jvb3QoKS5lbXB0eSgpKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfcm9vdChmcm9tLl9pbnRlcm5hbF9yb290KCkpOworICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIE1peGluOjpDb3B5RnJvbShjb25zdCBNaXhpbiYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuTWl4aW4pCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBNaXhpbjo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWl4aW46OkludGVybmFsU3dhcChNaXhpbiogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBhdXRvKiBsaHNfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgYXV0byogcmhzX2FyZW5hID0gb3RoZXItPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLm5hbWVfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5uYW1lXywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8ucm9vdF8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLnJvb3RfLCByaHNfYXJlbmEKKyAgKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIE1peGluOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZhcGlfMmVwcm90b19vbmNlLAorICAgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvWzJdKTsKK30KKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFwaSoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcGkgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcGkgPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2QqCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWl4aW4qCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWl4aW4gPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNaXhpbiA+KGFyZW5hKTsKK30KK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvYXBpLnBiLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNzQ2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wYi5oCkBAIC0wLDAgKzEsMTQzNyBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90bworCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKyNpZiBQUk9UT0JVRl9WRVJTSU9OIDwgMzAyMTAwMAorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiBQbGVhc2UgdXBkYXRlCisjZXJyb3IgeW91ciBoZWFkZXJzLgorI2VuZGlmCisjaWYgMzAyMTAwOSA8IFBST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTgorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIG9sZGVyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCisjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gUGxlYXNlCisjZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21ldGFkYXRhX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdHlwZS5wYi5oPgorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisjZGVmaW5lIFBST1RPQlVGX0lOVEVSTkFMX0VYUE9SVF9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvIFBST1RPQlVGX0VYUE9SVAorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBBbnlNZXRhZGF0YTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCisKKy8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCAtLSBkbyBub3QgdXNlIHRoZXNlIG1lbWJlcnMuCitzdHJ1Y3QgUFJPVE9CVUZfRVhQT1JUIFRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmYXBpXzJlcHJvdG8geworICBzdGF0aWMgY29uc3QgdWludDMyX3Qgb2Zmc2V0c1tdOworfTsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEZXNjcmlwdG9yVGFibGUgZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvOworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK2NsYXNzIEFwaTsKK3N0cnVjdCBBcGlEZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBBcGlEZWZhdWx0VHlwZUludGVybmFsIF9BcGlfZGVmYXVsdF9pbnN0YW5jZV87CitjbGFzcyBNZXRob2Q7CitzdHJ1Y3QgTWV0aG9kRGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gTWV0aG9kRGVmYXVsdFR5cGVJbnRlcm5hbCBfTWV0aG9kX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgTWl4aW47CitzdHJ1Y3QgTWl4aW5EZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBNaXhpbkRlZmF1bHRUeXBlSW50ZXJuYWwgX01peGluX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFwaSogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXBpPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZCogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1peGluKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNaXhpbj4oQXJlbmEqKTsKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgQXBpIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkFwaSkgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIEFwaSgpIDogQXBpKG51bGxwdHIpIHt9CisgIH5BcGkoKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIEFwaSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIEFwaShjb25zdCBBcGkmIGZyb20pOworICBBcGkoQXBpJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IEFwaSgpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIEFwaSYgb3BlcmF0b3I9KGNvbnN0IEFwaSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgQXBpJiBvcGVyYXRvcj0oQXBpJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IEFwaSYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gKmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IEFwaSogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBcGkqPigKKyAgICAgICAgICAgICAgICZfQXBpX2RlZmF1bHRfaW5zdGFuY2VfKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9CisgICAgMDsKKworICBmcmllbmQgdm9pZCBzd2FwKEFwaSYgYSwgQXBpJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKEFwaSogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICBHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICAjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdlbmVyaWNTd2FwKHRoaXMsIG90aGVyKTsKKyAgICB9CisgIH0KKyAgdm9pZCBVbnNhZmVBcmVuYVN3YXAoQXBpKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBBcGkqIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8QXBpPihhcmVuYSk7CisgIH0KKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlGcm9tOworICB2b2lkIENvcHlGcm9tKGNvbnN0IEFwaSYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBBcGkmIGZyb20pIHsKKyAgICBBcGk6Ok1lcmdlSW1wbCgqdGhpcywgZnJvbSk7CisgIH0KKyAgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgTWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZyk7CisgIHB1YmxpYzoKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IGZpbmFsOworICB2b2lkIEludGVybmFsU3dhcChBcGkqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuQXBpIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEFwaSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXzsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDsKKworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga01ldGhvZHNGaWVsZE51bWJlciA9IDIsCisgICAga09wdGlvbnNGaWVsZE51bWJlciA9IDMsCisgICAga01peGluc0ZpZWxkTnVtYmVyID0gNiwKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrVmVyc2lvbkZpZWxkTnVtYmVyID0gNCwKKyAgICBrU291cmNlQ29udGV4dEZpZWxkTnVtYmVyID0gNSwKKyAgICBrU3ludGF4RmllbGROdW1iZXIgPSA3LAorICB9OworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZCBtZXRob2RzID0gMjsKKyAgaW50IG1ldGhvZHNfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX21ldGhvZHNfc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfbWV0aG9kcygpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kKiBtdXRhYmxlX21ldGhvZHMoaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2QgPioKKyAgICAgIG11dGFibGVfbWV0aG9kcygpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kJiBfaW50ZXJuYWxfbWV0aG9kcyhpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kKiBfaW50ZXJuYWxfYWRkX21ldGhvZHMoKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kJiBtZXRob2RzKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2QqIGFkZF9tZXRob2RzKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kID4mCisgICAgICBtZXRob2RzKCkgY29uc3Q7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PcHRpb24gb3B0aW9ucyA9IDM7CisgIGludCBvcHRpb25zX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9vcHRpb25zX3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX29wdGlvbnMoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogbXV0YWJsZV9vcHRpb25zKGludCBpbmRleCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uID4qCisgICAgICBtdXRhYmxlX29wdGlvbnMoKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiYgX2ludGVybmFsX29wdGlvbnMoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogX2ludGVybmFsX2FkZF9vcHRpb25zKCk7CisgIHB1YmxpYzoKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiYgb3B0aW9ucyhpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uKiBhZGRfb3B0aW9ucygpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiA+JgorICAgICAgb3B0aW9ucygpIGNvbnN0OworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWl4aW4gbWl4aW5zID0gNjsKKyAgaW50IG1peGluc19zaXplKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGludCBfaW50ZXJuYWxfbWl4aW5zX3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX21peGlucygpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWl4aW4qIG11dGFibGVfbWl4aW5zKGludCBpbmRleCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWl4aW4gPioKKyAgICAgIG11dGFibGVfbWl4aW5zKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNaXhpbiYgX2ludGVybmFsX21peGlucyhpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWl4aW4qIF9pbnRlcm5hbF9hZGRfbWl4aW5zKCk7CisgIHB1YmxpYzoKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1peGluJiBtaXhpbnMoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1peGluKiBhZGRfbWl4aW5zKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWl4aW4gPiYKKyAgICAgIG1peGlucygpIGNvbnN0OworCisgIC8vIHN0cmluZyBuYW1lID0gMTsKKyAgdm9pZCBjbGVhcl9uYW1lKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX25hbWUoc3RkOjpzdHJpbmcqIG5hbWUpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX25hbWUoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgcHVibGljOgorCisgIC8vIHN0cmluZyB2ZXJzaW9uID0gNDsKKyAgdm9pZCBjbGVhcl92ZXJzaW9uKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2ZXJzaW9uKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfdmVyc2lvbihBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX3ZlcnNpb24oKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX3ZlcnNpb24oKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX3ZlcnNpb24oc3RkOjpzdHJpbmcqIHZlcnNpb24pOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX3ZlcnNpb24oKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X3ZlcnNpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX3ZlcnNpb24oKTsKKyAgcHVibGljOgorCisgIC8vIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dCBzb3VyY2VfY29udGV4dCA9IDU7CisgIGJvb2wgaGFzX3NvdXJjZV9jb250ZXh0KCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19zb3VyY2VfY29udGV4dCgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfc291cmNlX2NvbnRleHQoKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQmIHNvdXJjZV9jb250ZXh0KCkgY29uc3Q7CisgIFBST1RPQlVGX05PRElTQ0FSRCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogcmVsZWFzZV9zb3VyY2VfY29udGV4dCgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogbXV0YWJsZV9zb3VyY2VfY29udGV4dCgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfc291cmNlX2NvbnRleHQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIHNvdXJjZV9jb250ZXh0KTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQmIF9pbnRlcm5hbF9zb3VyY2VfY29udGV4dCgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogX2ludGVybmFsX211dGFibGVfc291cmNlX2NvbnRleHQoKTsKKyAgcHVibGljOgorICB2b2lkIHVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkX3NvdXJjZV9jb250ZXh0KAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIHNvdXJjZV9jb250ZXh0KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIHVuc2FmZV9hcmVuYV9yZWxlYXNlX3NvdXJjZV9jb250ZXh0KCk7CisKKyAgLy8gLmdvb2dsZS5wcm90b2J1Zi5TeW50YXggc3ludGF4ID0gNzsKKyAgdm9pZCBjbGVhcl9zeW50YXgoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheCBzeW50YXgoKSBjb25zdDsKKyAgdm9pZCBzZXRfc3ludGF4KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTeW50YXggdmFsdWUpOworICBwcml2YXRlOgorICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3ludGF4IF9pbnRlcm5hbF9zeW50YXgoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X3N5bnRheCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3ludGF4IHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuQXBpKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZCA+IG1ldGhvZHNfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uID4gb3B0aW9uc187CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNaXhpbiA+IG1peGluc187CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHZlcnNpb25fOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0KiBzb3VyY2VfY29udGV4dF87CisgICAgaW50IHN5bnRheF87CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIE1ldGhvZCBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5NZXRob2QpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBNZXRob2QoKSA6IE1ldGhvZChudWxscHRyKSB7fQorICB+TWV0aG9kKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBNZXRob2QoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBNZXRob2QoY29uc3QgTWV0aG9kJiBmcm9tKTsKKyAgTWV0aG9kKE1ldGhvZCYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBNZXRob2QoKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBNZXRob2QmIG9wZXJhdG9yPShjb25zdCBNZXRob2QmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIE1ldGhvZCYgb3BlcmF0b3I9KE1ldGhvZCYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBNZXRob2QmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBNZXRob2QqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWV0aG9kKj4oCisgICAgICAgICAgICAgICAmX01ldGhvZF9kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDE7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChNZXRob2QmIGEsIE1ldGhvZCYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChNZXRob2QqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKE1ldGhvZCogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgTWV0aG9kKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPE1ldGhvZD4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBNZXRob2QmIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgTWV0aG9kJiBmcm9tKSB7CisgICAgTWV0aG9kOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoTWV0aG9kKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLk1ldGhvZCI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBNZXRob2QoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtPcHRpb25zRmllbGROdW1iZXIgPSA2LAorICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtSZXF1ZXN0VHlwZVVybEZpZWxkTnVtYmVyID0gMiwKKyAgICBrUmVzcG9uc2VUeXBlVXJsRmllbGROdW1iZXIgPSA0LAorICAgIGtSZXF1ZXN0U3RyZWFtaW5nRmllbGROdW1iZXIgPSAzLAorICAgIGtSZXNwb25zZVN0cmVhbWluZ0ZpZWxkTnVtYmVyID0gNSwKKyAgICBrU3ludGF4RmllbGROdW1iZXIgPSA3LAorICB9OworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk9wdGlvbiBvcHRpb25zID0gNjsKKyAgaW50IG9wdGlvbnNfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX29wdGlvbnNfc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfb3B0aW9ucygpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uKiBtdXRhYmxlX29wdGlvbnMoaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24gPioKKyAgICAgIG11dGFibGVfb3B0aW9ucygpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uJiBfaW50ZXJuYWxfb3B0aW9ucyhpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uKiBfaW50ZXJuYWxfYWRkX29wdGlvbnMoKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uJiBvcHRpb25zKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24qIGFkZF9vcHRpb25zKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uID4mCisgICAgICBvcHRpb25zKCkgY29uc3Q7CisKKyAgLy8gc3RyaW5nIG5hbWUgPSAxOworICB2b2lkIGNsZWFyX25hbWUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF9uYW1lKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZShzdGQ6OnN0cmluZyogbmFtZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfbmFtZSgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICBwdWJsaWM6CisKKyAgLy8gc3RyaW5nIHJlcXVlc3RfdHlwZV91cmwgPSAyOworICB2b2lkIGNsZWFyX3JlcXVlc3RfdHlwZV91cmwoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHJlcXVlc3RfdHlwZV91cmwoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF9yZXF1ZXN0X3R5cGVfdXJsKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfcmVxdWVzdF90eXBlX3VybCgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2VfcmVxdWVzdF90eXBlX3VybCgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfcmVxdWVzdF90eXBlX3VybChzdGQ6OnN0cmluZyogcmVxdWVzdF90eXBlX3VybCk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfcmVxdWVzdF90eXBlX3VybCgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfcmVxdWVzdF90eXBlX3VybChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfcmVxdWVzdF90eXBlX3VybCgpOworICBwdWJsaWM6CisKKyAgLy8gc3RyaW5nIHJlc3BvbnNlX3R5cGVfdXJsID0gNDsKKyAgdm9pZCBjbGVhcl9yZXNwb25zZV90eXBlX3VybCgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgcmVzcG9uc2VfdHlwZV91cmwoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF9yZXNwb25zZV90eXBlX3VybChBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX3Jlc3BvbnNlX3R5cGVfdXJsKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9yZXNwb25zZV90eXBlX3VybCgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfcmVzcG9uc2VfdHlwZV91cmwoc3RkOjpzdHJpbmcqIHJlc3BvbnNlX3R5cGVfdXJsKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9yZXNwb25zZV90eXBlX3VybCgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfcmVzcG9uc2VfdHlwZV91cmwoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX3Jlc3BvbnNlX3R5cGVfdXJsKCk7CisgIHB1YmxpYzoKKworICAvLyBib29sIHJlcXVlc3Rfc3RyZWFtaW5nID0gMzsKKyAgdm9pZCBjbGVhcl9yZXF1ZXN0X3N0cmVhbWluZygpOworICBib29sIHJlcXVlc3Rfc3RyZWFtaW5nKCkgY29uc3Q7CisgIHZvaWQgc2V0X3JlcXVlc3Rfc3RyZWFtaW5nKGJvb2wgdmFsdWUpOworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9yZXF1ZXN0X3N0cmVhbWluZygpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfcmVxdWVzdF9zdHJlYW1pbmcoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBib29sIHJlc3BvbnNlX3N0cmVhbWluZyA9IDU7CisgIHZvaWQgY2xlYXJfcmVzcG9uc2Vfc3RyZWFtaW5nKCk7CisgIGJvb2wgcmVzcG9uc2Vfc3RyZWFtaW5nKCkgY29uc3Q7CisgIHZvaWQgc2V0X3Jlc3BvbnNlX3N0cmVhbWluZyhib29sIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfcmVzcG9uc2Vfc3RyZWFtaW5nKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9yZXNwb25zZV9zdHJlYW1pbmcoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyAuZ29vZ2xlLnByb3RvYnVmLlN5bnRheCBzeW50YXggPSA3OworICB2b2lkIGNsZWFyX3N5bnRheCgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3ludGF4IHN5bnRheCgpIGNvbnN0OworICB2b2lkIHNldF9zeW50YXgoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTeW50YXggX2ludGVybmFsX3N5bnRheCgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfc3ludGF4KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTeW50YXggdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2QpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uID4gb3B0aW9uc187CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHJlcXVlc3RfdHlwZV91cmxfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgcmVzcG9uc2VfdHlwZV91cmxfOworICAgIGJvb2wgcmVxdWVzdF9zdHJlYW1pbmdfOworICAgIGJvb2wgcmVzcG9uc2Vfc3RyZWFtaW5nXzsKKyAgICBpbnQgc3ludGF4XzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmYXBpXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTWl4aW4gZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuTWl4aW4pICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBNaXhpbigpIDogTWl4aW4obnVsbHB0cikge30KKyAgfk1peGluKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBNaXhpbig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIE1peGluKGNvbnN0IE1peGluJiBmcm9tKTsKKyAgTWl4aW4oTWl4aW4mJiBmcm9tKSBub2V4Y2VwdAorICAgIDogTWl4aW4oKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBNaXhpbiYgb3BlcmF0b3I9KGNvbnN0IE1peGluJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBNaXhpbiYgb3BlcmF0b3I9KE1peGluJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IE1peGluJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgTWl4aW4qIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWl4aW4qPigKKyAgICAgICAgICAgICAgICZfTWl4aW5fZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAyOworCisgIGZyaWVuZCB2b2lkIHN3YXAoTWl4aW4mIGEsIE1peGluJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKE1peGluKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChNaXhpbiogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgTWl4aW4qIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8TWl4aW4+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgTWl4aW4mIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgTWl4aW4mIGZyb20pIHsKKyAgICBNaXhpbjo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKE1peGluKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLk1peGluIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IE1peGluKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrUm9vdEZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgLy8gc3RyaW5nIG5hbWUgPSAxOworICB2b2lkIGNsZWFyX25hbWUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF9uYW1lKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZShzdGQ6OnN0cmluZyogbmFtZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfbmFtZSgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICBwdWJsaWM6CisKKyAgLy8gc3RyaW5nIHJvb3QgPSAyOworICB2b2lkIGNsZWFyX3Jvb3QoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHJvb3QoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF9yb290KEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfcm9vdCgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2Vfcm9vdCgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfcm9vdChzdGQ6OnN0cmluZyogcm9vdCk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfcm9vdCgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfcm9vdChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfcm9vdCgpOworICBwdWJsaWM6CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5NaXhpbikKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHJvb3RfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZhcGlfMmVwcm90bzsKK307CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzdHJpY3QtYWxpYXNpbmciCisjZW5kaWYgIC8vIF9fR05VQ19fCisvLyBBcGkKKworLy8gc3RyaW5nIG5hbWUgPSAxOworaW5saW5lIHZvaWQgQXBpOjpjbGVhcl9uYW1lKCkgeworICBfaW1wbF8ubmFtZV8uQ2xlYXJUb0VtcHR5KCk7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEFwaTo6bmFtZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuQXBpLm5hbWUpCisgIHJldHVybiBfaW50ZXJuYWxfbmFtZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgQXBpOjpzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIAorIF9pbXBsXy5uYW1lXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkFwaS5uYW1lKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBBcGk6Om11dGFibGVfbmFtZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuQXBpLm5hbWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgQXBpOjpfaW50ZXJuYWxfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIEFwaTo6X2ludGVybmFsX3NldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAKKyAgX2ltcGxfLm5hbWVfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBBcGk6Ol9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKSB7CisgIAorICByZXR1cm4gX2ltcGxfLm5hbWVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBBcGk6OnJlbGVhc2VfbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkFwaS5uYW1lKQorICByZXR1cm4gX2ltcGxfLm5hbWVfLlJlbGVhc2UoKTsKK30KK2lubGluZSB2b2lkIEFwaTo6c2V0X2FsbG9jYXRlZF9uYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lICE9IG51bGxwdHIpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBfaW1wbF8ubmFtZV8uU2V0QWxsb2NhdGVkKG5hbWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ubmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5BcGkubmFtZSkKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2QgbWV0aG9kcyA9IDI7CitpbmxpbmUgaW50IEFwaTo6X2ludGVybmFsX21ldGhvZHNfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5tZXRob2RzXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IEFwaTo6bWV0aG9kc19zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX21ldGhvZHNfc2l6ZSgpOworfQoraW5saW5lIHZvaWQgQXBpOjpjbGVhcl9tZXRob2RzKCkgeworICBfaW1wbF8ubWV0aG9kc18uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kKiBBcGk6Om11dGFibGVfbWV0aG9kcyhpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkFwaS5tZXRob2RzKQorICByZXR1cm4gX2ltcGxfLm1ldGhvZHNfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kID4qCitBcGk6Om11dGFibGVfbWV0aG9kcygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuQXBpLm1ldGhvZHMpCisgIHJldHVybiAmX2ltcGxfLm1ldGhvZHNfOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2QmIEFwaTo6X2ludGVybmFsX21ldGhvZHMoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubWV0aG9kc18uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kJiBBcGk6Om1ldGhvZHMoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkFwaS5tZXRob2RzKQorICByZXR1cm4gX2ludGVybmFsX21ldGhvZHMoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2QqIEFwaTo6X2ludGVybmFsX2FkZF9tZXRob2RzKCkgeworICByZXR1cm4gX2ltcGxfLm1ldGhvZHNfLkFkZCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2QqIEFwaTo6YWRkX21ldGhvZHMoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2QqIF9hZGQgPSBfaW50ZXJuYWxfYWRkX21ldGhvZHMoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuQXBpLm1ldGhvZHMpCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kID4mCitBcGk6Om1ldGhvZHMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5BcGkubWV0aG9kcykKKyAgcmV0dXJuIF9pbXBsXy5tZXRob2RzXzsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PcHRpb24gb3B0aW9ucyA9IDM7CitpbmxpbmUgaW50IEFwaTo6X2ludGVybmFsX29wdGlvbnNfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IEFwaTo6b3B0aW9uc19zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX29wdGlvbnNfc2l6ZSgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24qIEFwaTo6bXV0YWJsZV9vcHRpb25zKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuQXBpLm9wdGlvbnMpCisgIHJldHVybiBfaW1wbF8ub3B0aW9uc18uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24gPioKK0FwaTo6bXV0YWJsZV9vcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5BcGkub3B0aW9ucykKKyAgcmV0dXJuICZfaW1wbF8ub3B0aW9uc187Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiYgQXBpOjpfaW50ZXJuYWxfb3B0aW9ucyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24mIEFwaTo6b3B0aW9ucyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuQXBpLm9wdGlvbnMpCisgIHJldHVybiBfaW50ZXJuYWxfb3B0aW9ucyhpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogQXBpOjpfaW50ZXJuYWxfYWRkX29wdGlvbnMoKSB7CisgIHJldHVybiBfaW1wbF8ub3B0aW9uc18uQWRkKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogQXBpOjphZGRfb3B0aW9ucygpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogX2FkZCA9IF9pbnRlcm5hbF9hZGRfb3B0aW9ucygpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5BcGkub3B0aW9ucykKKyAgcmV0dXJuIF9hZGQ7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24gPiYKK0FwaTo6b3B0aW9ucygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkFwaS5vcHRpb25zKQorICByZXR1cm4gX2ltcGxfLm9wdGlvbnNfOworfQorCisvLyBzdHJpbmcgdmVyc2lvbiA9IDQ7CitpbmxpbmUgdm9pZCBBcGk6OmNsZWFyX3ZlcnNpb24oKSB7CisgIF9pbXBsXy52ZXJzaW9uXy5DbGVhclRvRW1wdHkoKTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgQXBpOjp2ZXJzaW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5BcGkudmVyc2lvbikKKyAgcmV0dXJuIF9pbnRlcm5hbF92ZXJzaW9uKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBBcGk6OnNldF92ZXJzaW9uKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgCisgX2ltcGxfLnZlcnNpb25fLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuQXBpLnZlcnNpb24pCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEFwaTo6bXV0YWJsZV92ZXJzaW9uKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV92ZXJzaW9uKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5BcGkudmVyc2lvbikKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBBcGk6Ol9pbnRlcm5hbF92ZXJzaW9uKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnZlcnNpb25fLkdldCgpOworfQoraW5saW5lIHZvaWQgQXBpOjpfaW50ZXJuYWxfc2V0X3ZlcnNpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIAorICBfaW1wbF8udmVyc2lvbl8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEFwaTo6X2ludGVybmFsX211dGFibGVfdmVyc2lvbigpIHsKKyAgCisgIHJldHVybiBfaW1wbF8udmVyc2lvbl8uTXV0YWJsZShHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEFwaTo6cmVsZWFzZV92ZXJzaW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuQXBpLnZlcnNpb24pCisgIHJldHVybiBfaW1wbF8udmVyc2lvbl8uUmVsZWFzZSgpOworfQoraW5saW5lIHZvaWQgQXBpOjpzZXRfYWxsb2NhdGVkX3ZlcnNpb24oc3RkOjpzdHJpbmcqIHZlcnNpb24pIHsKKyAgaWYgKHZlcnNpb24gIT0gbnVsbHB0cikgeworICAgIAorICB9IGVsc2UgeworICAgIAorICB9CisgIF9pbXBsXy52ZXJzaW9uXy5TZXRBbGxvY2F0ZWQodmVyc2lvbiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy52ZXJzaW9uXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy52ZXJzaW9uXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkFwaS52ZXJzaW9uKQorfQorCisvLyAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQgc291cmNlX2NvbnRleHQgPSA1OworaW5saW5lIGJvb2wgQXBpOjpfaW50ZXJuYWxfaGFzX3NvdXJjZV9jb250ZXh0KCkgY29uc3QgeworICByZXR1cm4gdGhpcyAhPSBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgJiYgX2ltcGxfLnNvdXJjZV9jb250ZXh0XyAhPSBudWxscHRyOworfQoraW5saW5lIGJvb2wgQXBpOjpoYXNfc291cmNlX2NvbnRleHQoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX3NvdXJjZV9jb250ZXh0KCk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQmIEFwaTo6X2ludGVybmFsX3NvdXJjZV9jb250ZXh0KCkgY29uc3QgeworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogcCA9IF9pbXBsXy5zb3VyY2VfY29udGV4dF87CisgIHJldHVybiBwICE9IG51bGxwdHIgPyAqcCA6IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQmPigKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfU291cmNlQ29udGV4dF9kZWZhdWx0X2luc3RhbmNlXyk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQmIEFwaTo6c291cmNlX2NvbnRleHQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkFwaS5zb3VyY2VfY29udGV4dCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9zb3VyY2VfY29udGV4dCgpOworfQoraW5saW5lIHZvaWQgQXBpOjp1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF9zb3VyY2VfY29udGV4dCgKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogc291cmNlX2NvbnRleHQpIHsKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPihfaW1wbF8uc291cmNlX2NvbnRleHRfKTsKKyAgfQorICBfaW1wbF8uc291cmNlX2NvbnRleHRfID0gc291cmNlX2NvbnRleHQ7CisgIGlmIChzb3VyY2VfY29udGV4dCkgeworICAgIAorICB9IGVsc2UgeworICAgIAorICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuQXBpLnNvdXJjZV9jb250ZXh0KQorfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0KiBBcGk6OnJlbGVhc2Vfc291cmNlX2NvbnRleHQoKSB7CisgIAorICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogdGVtcCA9IF9pbXBsXy5zb3VyY2VfY29udGV4dF87CisgIF9pbXBsXy5zb3VyY2VfY29udGV4dF8gPSBudWxscHRyOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICBhdXRvKiBvbGQgPSAgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPih0ZW1wKTsKKyAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikgeyBkZWxldGUgb2xkOyB9CisjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSAhPSBudWxscHRyKSB7CisgICAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICB9CisjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgcmV0dXJuIHRlbXA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIEFwaTo6dW5zYWZlX2FyZW5hX3JlbGVhc2Vfc291cmNlX2NvbnRleHQoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5BcGkuc291cmNlX2NvbnRleHQpCisgIAorICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogdGVtcCA9IF9pbXBsXy5zb3VyY2VfY29udGV4dF87CisgIF9pbXBsXy5zb3VyY2VfY29udGV4dF8gPSBudWxscHRyOworICByZXR1cm4gdGVtcDsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogQXBpOjpfaW50ZXJuYWxfbXV0YWJsZV9zb3VyY2VfY29udGV4dCgpIHsKKyAgCisgIGlmIChfaW1wbF8uc291cmNlX2NvbnRleHRfID09IG51bGxwdHIpIHsKKyAgICBhdXRvKiBwID0gQ3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0PihHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICAgX2ltcGxfLnNvdXJjZV9jb250ZXh0XyA9IHA7CisgIH0KKyAgcmV0dXJuIF9pbXBsXy5zb3VyY2VfY29udGV4dF87Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIEFwaTo6bXV0YWJsZV9zb3VyY2VfY29udGV4dCgpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIF9tc2cgPSBfaW50ZXJuYWxfbXV0YWJsZV9zb3VyY2VfY29udGV4dCgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuQXBpLnNvdXJjZV9jb250ZXh0KQorICByZXR1cm4gX21zZzsKK30KK2lubGluZSB2b2lkIEFwaTo6c2V0X2FsbG9jYXRlZF9zb3VyY2VfY29udGV4dCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogc291cmNlX2NvbnRleHQpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBtZXNzYWdlX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGlmIChtZXNzYWdlX2FyZW5hID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VMaXRlKj4oX2ltcGxfLnNvdXJjZV9jb250ZXh0Xyk7CisgIH0KKyAgaWYgKHNvdXJjZV9jb250ZXh0KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBzdWJtZXNzYWdlX2FyZW5hID0KKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEdldE93bmluZ0FyZW5hKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VMaXRlKj4oc291cmNlX2NvbnRleHQpKTsKKyAgICBpZiAobWVzc2FnZV9hcmVuYSAhPSBzdWJtZXNzYWdlX2FyZW5hKSB7CisgICAgICBzb3VyY2VfY29udGV4dCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2V0T3duZWRNZXNzYWdlKAorICAgICAgICAgIG1lc3NhZ2VfYXJlbmEsIHNvdXJjZV9jb250ZXh0LCBzdWJtZXNzYWdlX2FyZW5hKTsKKyAgICB9CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgIH0KKyAgX2ltcGxfLnNvdXJjZV9jb250ZXh0XyA9IHNvdXJjZV9jb250ZXh0OworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuQXBpLnNvdXJjZV9jb250ZXh0KQorfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk1peGluIG1peGlucyA9IDY7CitpbmxpbmUgaW50IEFwaTo6X2ludGVybmFsX21peGluc19zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm1peGluc18uc2l6ZSgpOworfQoraW5saW5lIGludCBBcGk6Om1peGluc19zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX21peGluc19zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBBcGk6OmNsZWFyX21peGlucygpIHsKKyAgX2ltcGxfLm1peGluc18uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWl4aW4qIEFwaTo6bXV0YWJsZV9taXhpbnMoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5BcGkubWl4aW5zKQorICByZXR1cm4gX2ltcGxfLm1peGluc18uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNaXhpbiA+KgorQXBpOjptdXRhYmxlX21peGlucygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuQXBpLm1peGlucykKKyAgcmV0dXJuICZfaW1wbF8ubWl4aW5zXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWl4aW4mIEFwaTo6X2ludGVybmFsX21peGlucyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5taXhpbnNfLkdldChpbmRleCk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1peGluJiBBcGk6Om1peGlucyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuQXBpLm1peGlucykKKyAgcmV0dXJuIF9pbnRlcm5hbF9taXhpbnMoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNaXhpbiogQXBpOjpfaW50ZXJuYWxfYWRkX21peGlucygpIHsKKyAgcmV0dXJuIF9pbXBsXy5taXhpbnNfLkFkZCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNaXhpbiogQXBpOjphZGRfbWl4aW5zKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWl4aW4qIF9hZGQgPSBfaW50ZXJuYWxfYWRkX21peGlucygpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5BcGkubWl4aW5zKQorICByZXR1cm4gX2FkZDsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1peGluID4mCitBcGk6Om1peGlucygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkFwaS5taXhpbnMpCisgIHJldHVybiBfaW1wbF8ubWl4aW5zXzsKK30KKworLy8gLmdvb2dsZS5wcm90b2J1Zi5TeW50YXggc3ludGF4ID0gNzsKK2lubGluZSB2b2lkIEFwaTo6Y2xlYXJfc3ludGF4KCkgeworICBfaW1wbF8uc3ludGF4XyA9IDA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheCBBcGk6Ol9pbnRlcm5hbF9zeW50YXgoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheCA+KF9pbXBsXy5zeW50YXhfKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3ludGF4IEFwaTo6c3ludGF4KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5BcGkuc3ludGF4KQorICByZXR1cm4gX2ludGVybmFsX3N5bnRheCgpOworfQoraW5saW5lIHZvaWQgQXBpOjpfaW50ZXJuYWxfc2V0X3N5bnRheCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3ludGF4IHZhbHVlKSB7CisgIAorICBfaW1wbF8uc3ludGF4XyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgQXBpOjpzZXRfc3ludGF4KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTeW50YXggdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9zeW50YXgodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5BcGkuc3ludGF4KQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE1ldGhvZAorCisvLyBzdHJpbmcgbmFtZSA9IDE7CitpbmxpbmUgdm9pZCBNZXRob2Q6OmNsZWFyX25hbWUoKSB7CisgIF9pbXBsXy5uYW1lXy5DbGVhclRvRW1wdHkoKTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgTWV0aG9kOjpuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2QubmFtZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9uYW1lKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBNZXRob2Q6OnNldF9uYW1lKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgCisgX2ltcGxfLm5hbWVfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWV0aG9kLm5hbWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIE1ldGhvZDo6bXV0YWJsZV9uYW1lKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2QubmFtZSkKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBNZXRob2Q6Ol9pbnRlcm5hbF9uYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm5hbWVfLkdldCgpOworfQoraW5saW5lIHZvaWQgTWV0aG9kOjpfaW50ZXJuYWxfc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIAorICBfaW1wbF8ubmFtZV8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIE1ldGhvZDo6X2ludGVybmFsX211dGFibGVfbmFtZSgpIHsKKyAgCisgIHJldHVybiBfaW1wbF8ubmFtZV8uTXV0YWJsZShHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIE1ldGhvZDo6cmVsZWFzZV9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuTWV0aG9kLm5hbWUpCisgIHJldHVybiBfaW1wbF8ubmFtZV8uUmVsZWFzZSgpOworfQoraW5saW5lIHZvaWQgTWV0aG9kOjpzZXRfYWxsb2NhdGVkX25hbWUoc3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWUgIT0gbnVsbHB0cikgeworICAgIAorICB9IGVsc2UgeworICAgIAorICB9CisgIF9pbXBsXy5uYW1lXy5TZXRBbGxvY2F0ZWQobmFtZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5uYW1lXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZC5uYW1lKQorfQorCisvLyBzdHJpbmcgcmVxdWVzdF90eXBlX3VybCA9IDI7CitpbmxpbmUgdm9pZCBNZXRob2Q6OmNsZWFyX3JlcXVlc3RfdHlwZV91cmwoKSB7CisgIF9pbXBsXy5yZXF1ZXN0X3R5cGVfdXJsXy5DbGVhclRvRW1wdHkoKTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgTWV0aG9kOjpyZXF1ZXN0X3R5cGVfdXJsKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2QucmVxdWVzdF90eXBlX3VybCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9yZXF1ZXN0X3R5cGVfdXJsKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBNZXRob2Q6OnNldF9yZXF1ZXN0X3R5cGVfdXJsKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgCisgX2ltcGxfLnJlcXVlc3RfdHlwZV91cmxfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWV0aG9kLnJlcXVlc3RfdHlwZV91cmwpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIE1ldGhvZDo6bXV0YWJsZV9yZXF1ZXN0X3R5cGVfdXJsKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9yZXF1ZXN0X3R5cGVfdXJsKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2QucmVxdWVzdF90eXBlX3VybCkKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBNZXRob2Q6Ol9pbnRlcm5hbF9yZXF1ZXN0X3R5cGVfdXJsKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnJlcXVlc3RfdHlwZV91cmxfLkdldCgpOworfQoraW5saW5lIHZvaWQgTWV0aG9kOjpfaW50ZXJuYWxfc2V0X3JlcXVlc3RfdHlwZV91cmwoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIAorICBfaW1wbF8ucmVxdWVzdF90eXBlX3VybF8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIE1ldGhvZDo6X2ludGVybmFsX211dGFibGVfcmVxdWVzdF90eXBlX3VybCgpIHsKKyAgCisgIHJldHVybiBfaW1wbF8ucmVxdWVzdF90eXBlX3VybF8uTXV0YWJsZShHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIE1ldGhvZDo6cmVsZWFzZV9yZXF1ZXN0X3R5cGVfdXJsKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuTWV0aG9kLnJlcXVlc3RfdHlwZV91cmwpCisgIHJldHVybiBfaW1wbF8ucmVxdWVzdF90eXBlX3VybF8uUmVsZWFzZSgpOworfQoraW5saW5lIHZvaWQgTWV0aG9kOjpzZXRfYWxsb2NhdGVkX3JlcXVlc3RfdHlwZV91cmwoc3RkOjpzdHJpbmcqIHJlcXVlc3RfdHlwZV91cmwpIHsKKyAgaWYgKHJlcXVlc3RfdHlwZV91cmwgIT0gbnVsbHB0cikgeworICAgIAorICB9IGVsc2UgeworICAgIAorICB9CisgIF9pbXBsXy5yZXF1ZXN0X3R5cGVfdXJsXy5TZXRBbGxvY2F0ZWQocmVxdWVzdF90eXBlX3VybCwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5yZXF1ZXN0X3R5cGVfdXJsXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5yZXF1ZXN0X3R5cGVfdXJsXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZC5yZXF1ZXN0X3R5cGVfdXJsKQorfQorCisvLyBib29sIHJlcXVlc3Rfc3RyZWFtaW5nID0gMzsKK2lubGluZSB2b2lkIE1ldGhvZDo6Y2xlYXJfcmVxdWVzdF9zdHJlYW1pbmcoKSB7CisgIF9pbXBsXy5yZXF1ZXN0X3N0cmVhbWluZ18gPSBmYWxzZTsKK30KK2lubGluZSBib29sIE1ldGhvZDo6X2ludGVybmFsX3JlcXVlc3Rfc3RyZWFtaW5nKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnJlcXVlc3Rfc3RyZWFtaW5nXzsKK30KK2lubGluZSBib29sIE1ldGhvZDo6cmVxdWVzdF9zdHJlYW1pbmcoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZC5yZXF1ZXN0X3N0cmVhbWluZykKKyAgcmV0dXJuIF9pbnRlcm5hbF9yZXF1ZXN0X3N0cmVhbWluZygpOworfQoraW5saW5lIHZvaWQgTWV0aG9kOjpfaW50ZXJuYWxfc2V0X3JlcXVlc3Rfc3RyZWFtaW5nKGJvb2wgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5yZXF1ZXN0X3N0cmVhbWluZ18gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIE1ldGhvZDo6c2V0X3JlcXVlc3Rfc3RyZWFtaW5nKGJvb2wgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9yZXF1ZXN0X3N0cmVhbWluZyh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZC5yZXF1ZXN0X3N0cmVhbWluZykKK30KKworLy8gc3RyaW5nIHJlc3BvbnNlX3R5cGVfdXJsID0gNDsKK2lubGluZSB2b2lkIE1ldGhvZDo6Y2xlYXJfcmVzcG9uc2VfdHlwZV91cmwoKSB7CisgIF9pbXBsXy5yZXNwb25zZV90eXBlX3VybF8uQ2xlYXJUb0VtcHR5KCk7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIE1ldGhvZDo6cmVzcG9uc2VfdHlwZV91cmwoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZC5yZXNwb25zZV90eXBlX3VybCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9yZXNwb25zZV90eXBlX3VybCgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgTWV0aG9kOjpzZXRfcmVzcG9uc2VfdHlwZV91cmwoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyAKKyBfaW1wbF8ucmVzcG9uc2VfdHlwZV91cmxfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWV0aG9kLnJlc3BvbnNlX3R5cGVfdXJsKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBNZXRob2Q6Om11dGFibGVfcmVzcG9uc2VfdHlwZV91cmwoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX3Jlc3BvbnNlX3R5cGVfdXJsKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2QucmVzcG9uc2VfdHlwZV91cmwpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgTWV0aG9kOjpfaW50ZXJuYWxfcmVzcG9uc2VfdHlwZV91cmwoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ucmVzcG9uc2VfdHlwZV91cmxfLkdldCgpOworfQoraW5saW5lIHZvaWQgTWV0aG9kOjpfaW50ZXJuYWxfc2V0X3Jlc3BvbnNlX3R5cGVfdXJsKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAKKyAgX2ltcGxfLnJlc3BvbnNlX3R5cGVfdXJsXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogTWV0aG9kOjpfaW50ZXJuYWxfbXV0YWJsZV9yZXNwb25zZV90eXBlX3VybCgpIHsKKyAgCisgIHJldHVybiBfaW1wbF8ucmVzcG9uc2VfdHlwZV91cmxfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBNZXRob2Q6OnJlbGVhc2VfcmVzcG9uc2VfdHlwZV91cmwoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2QucmVzcG9uc2VfdHlwZV91cmwpCisgIHJldHVybiBfaW1wbF8ucmVzcG9uc2VfdHlwZV91cmxfLlJlbGVhc2UoKTsKK30KK2lubGluZSB2b2lkIE1ldGhvZDo6c2V0X2FsbG9jYXRlZF9yZXNwb25zZV90eXBlX3VybChzdGQ6OnN0cmluZyogcmVzcG9uc2VfdHlwZV91cmwpIHsKKyAgaWYgKHJlc3BvbnNlX3R5cGVfdXJsICE9IG51bGxwdHIpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBfaW1wbF8ucmVzcG9uc2VfdHlwZV91cmxfLlNldEFsbG9jYXRlZChyZXNwb25zZV90eXBlX3VybCwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5yZXNwb25zZV90eXBlX3VybF8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ucmVzcG9uc2VfdHlwZV91cmxfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuTWV0aG9kLnJlc3BvbnNlX3R5cGVfdXJsKQorfQorCisvLyBib29sIHJlc3BvbnNlX3N0cmVhbWluZyA9IDU7CitpbmxpbmUgdm9pZCBNZXRob2Q6OmNsZWFyX3Jlc3BvbnNlX3N0cmVhbWluZygpIHsKKyAgX2ltcGxfLnJlc3BvbnNlX3N0cmVhbWluZ18gPSBmYWxzZTsKK30KK2lubGluZSBib29sIE1ldGhvZDo6X2ludGVybmFsX3Jlc3BvbnNlX3N0cmVhbWluZygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5yZXNwb25zZV9zdHJlYW1pbmdfOworfQoraW5saW5lIGJvb2wgTWV0aG9kOjpyZXNwb25zZV9zdHJlYW1pbmcoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZC5yZXNwb25zZV9zdHJlYW1pbmcpCisgIHJldHVybiBfaW50ZXJuYWxfcmVzcG9uc2Vfc3RyZWFtaW5nKCk7Cit9CitpbmxpbmUgdm9pZCBNZXRob2Q6Ol9pbnRlcm5hbF9zZXRfcmVzcG9uc2Vfc3RyZWFtaW5nKGJvb2wgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5yZXNwb25zZV9zdHJlYW1pbmdfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBNZXRob2Q6OnNldF9yZXNwb25zZV9zdHJlYW1pbmcoYm9vbCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X3Jlc3BvbnNlX3N0cmVhbWluZyh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZC5yZXNwb25zZV9zdHJlYW1pbmcpCit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT3B0aW9uIG9wdGlvbnMgPSA2OworaW5saW5lIGludCBNZXRob2Q6Ol9pbnRlcm5hbF9vcHRpb25zX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ub3B0aW9uc18uc2l6ZSgpOworfQoraW5saW5lIGludCBNZXRob2Q6Om9wdGlvbnNfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9vcHRpb25zX3NpemUoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uKiBNZXRob2Q6Om11dGFibGVfb3B0aW9ucyhpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZC5vcHRpb25zKQorICByZXR1cm4gX2ltcGxfLm9wdGlvbnNfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uID4qCitNZXRob2Q6Om11dGFibGVfb3B0aW9ucygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuTWV0aG9kLm9wdGlvbnMpCisgIHJldHVybiAmX2ltcGxfLm9wdGlvbnNfOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24mIE1ldGhvZDo6X2ludGVybmFsX29wdGlvbnMoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ub3B0aW9uc18uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uJiBNZXRob2Q6Om9wdGlvbnMoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZC5vcHRpb25zKQorICByZXR1cm4gX2ludGVybmFsX29wdGlvbnMoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24qIE1ldGhvZDo6X2ludGVybmFsX2FkZF9vcHRpb25zKCkgeworICByZXR1cm4gX2ltcGxfLm9wdGlvbnNfLkFkZCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24qIE1ldGhvZDo6YWRkX29wdGlvbnMoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24qIF9hZGQgPSBfaW50ZXJuYWxfYWRkX29wdGlvbnMoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuTWV0aG9kLm9wdGlvbnMpCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uID4mCitNZXRob2Q6Om9wdGlvbnMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2Qub3B0aW9ucykKKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXzsKK30KKworLy8gLmdvb2dsZS5wcm90b2J1Zi5TeW50YXggc3ludGF4ID0gNzsKK2lubGluZSB2b2lkIE1ldGhvZDo6Y2xlYXJfc3ludGF4KCkgeworICBfaW1wbF8uc3ludGF4XyA9IDA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheCBNZXRob2Q6Ol9pbnRlcm5hbF9zeW50YXgoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheCA+KF9pbXBsXy5zeW50YXhfKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3ludGF4IE1ldGhvZDo6c3ludGF4KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2Quc3ludGF4KQorICByZXR1cm4gX2ludGVybmFsX3N5bnRheCgpOworfQoraW5saW5lIHZvaWQgTWV0aG9kOjpfaW50ZXJuYWxfc2V0X3N5bnRheCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3ludGF4IHZhbHVlKSB7CisgIAorICBfaW1wbF8uc3ludGF4XyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgTWV0aG9kOjpzZXRfc3ludGF4KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTeW50YXggdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9zeW50YXgodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2Quc3ludGF4KQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE1peGluCisKKy8vIHN0cmluZyBuYW1lID0gMTsKK2lubGluZSB2b2lkIE1peGluOjpjbGVhcl9uYW1lKCkgeworICBfaW1wbF8ubmFtZV8uQ2xlYXJUb0VtcHR5KCk7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIE1peGluOjpuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NaXhpbi5uYW1lKQorICByZXR1cm4gX2ludGVybmFsX25hbWUoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCwgdHlwZW5hbWUuLi4gQXJnVD4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCit2b2lkIE1peGluOjpzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIAorIF9pbXBsXy5uYW1lXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1peGluLm5hbWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIE1peGluOjptdXRhYmxlX25hbWUoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLk1peGluLm5hbWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgTWl4aW46Ol9pbnRlcm5hbF9uYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm5hbWVfLkdldCgpOworfQoraW5saW5lIHZvaWQgTWl4aW46Ol9pbnRlcm5hbF9zZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5uYW1lXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogTWl4aW46Ol9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKSB7CisgIAorICByZXR1cm4gX2ltcGxfLm5hbWVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBNaXhpbjo6cmVsZWFzZV9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuTWl4aW4ubmFtZSkKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5SZWxlYXNlKCk7Cit9CitpbmxpbmUgdm9pZCBNaXhpbjo6c2V0X2FsbG9jYXRlZF9uYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lICE9IG51bGxwdHIpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBfaW1wbF8ubmFtZV8uU2V0QWxsb2NhdGVkKG5hbWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ubmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5NaXhpbi5uYW1lKQorfQorCisvLyBzdHJpbmcgcm9vdCA9IDI7CitpbmxpbmUgdm9pZCBNaXhpbjo6Y2xlYXJfcm9vdCgpIHsKKyAgX2ltcGxfLnJvb3RfLkNsZWFyVG9FbXB0eSgpOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBNaXhpbjo6cm9vdCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWl4aW4ucm9vdCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9yb290KCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBNaXhpbjo6c2V0X3Jvb3QoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyAKKyBfaW1wbF8ucm9vdF8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NaXhpbi5yb290KQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBNaXhpbjo6bXV0YWJsZV9yb290KCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9yb290KCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NaXhpbi5yb290KQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIE1peGluOjpfaW50ZXJuYWxfcm9vdCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5yb290Xy5HZXQoKTsKK30KK2lubGluZSB2b2lkIE1peGluOjpfaW50ZXJuYWxfc2V0X3Jvb3QoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIAorICBfaW1wbF8ucm9vdF8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIE1peGluOjpfaW50ZXJuYWxfbXV0YWJsZV9yb290KCkgeworICAKKyAgcmV0dXJuIF9pbXBsXy5yb290Xy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogTWl4aW46OnJlbGVhc2Vfcm9vdCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLk1peGluLnJvb3QpCisgIHJldHVybiBfaW1wbF8ucm9vdF8uUmVsZWFzZSgpOworfQoraW5saW5lIHZvaWQgTWl4aW46OnNldF9hbGxvY2F0ZWRfcm9vdChzdGQ6OnN0cmluZyogcm9vdCkgeworICBpZiAocm9vdCAhPSBudWxscHRyKSB7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgIH0KKyAgX2ltcGxfLnJvb3RfLlNldEFsbG9jYXRlZChyb290LCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnJvb3RfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLnJvb3RfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuTWl4aW4ucm9vdCkKK30KKworI2lmZGVmIF9fR05VQ19fCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYgIC8vIF9fR05VQ19fCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX0dPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZmFwaV8yZXByb3RvCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvYXBpLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNTk4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90bwpAQCAtMCwwICsxLDIwOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucHJvdG8iOworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdHlwZS5wcm90byI7CisKK29wdGlvbiBjc2hhcnBfbmFtZXNwYWNlID0gIkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcyI7CitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkFwaVByb3RvIjsKK29wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKK29wdGlvbiBvYmpjX2NsYXNzX3ByZWZpeCA9ICJHUEIiOworb3B0aW9uIGdvX3BhY2thZ2UgPSAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vYXBpcGIiOworCisvLyBBcGkgaXMgYSBsaWdodC13ZWlnaHQgZGVzY3JpcHRvciBmb3IgYW4gQVBJIEludGVyZmFjZS4KKy8vCisvLyBJbnRlcmZhY2VzIGFyZSBhbHNvIGRlc2NyaWJlZCBhcyAicHJvdG9jb2wgYnVmZmVyIHNlcnZpY2VzIiBpbiBzb21lIGNvbnRleHRzLAorLy8gc3VjaCBhcyBieSB0aGUgInNlcnZpY2UiIGtleXdvcmQgaW4gYSAucHJvdG8gZmlsZSwgYnV0IHRoZXkgYXJlIGRpZmZlcmVudAorLy8gZnJvbSBBUEkgU2VydmljZXMsIHdoaWNoIHJlcHJlc2VudCBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGFuIGludGVyZmFjZQorLy8gYXMgb3Bwb3NlZCB0byBzaW1wbHkgYSBkZXNjcmlwdGlvbiBvZiBtZXRob2RzIGFuZCBiaW5kaW5ncy4gVGhleSBhcmUgYWxzbworLy8gc29tZXRpbWVzIHNpbXBseSByZWZlcnJlZCB0byBhcyAiQVBJcyIgaW4gb3RoZXIgY29udGV4dHMsIHN1Y2ggYXMgdGhlIG5hbWUgb2YKKy8vIHRoaXMgbWVzc2FnZSBpdHNlbGYuIFNlZSBodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vYXBpcy9kZXNpZ24vZ2xvc3NhcnkgZm9yCisvLyBkZXRhaWxlZCB0ZXJtaW5vbG9neS4KK21lc3NhZ2UgQXBpIHsKKyAgLy8gVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgaW50ZXJmYWNlLCBpbmNsdWRpbmcgcGFja2FnZSBuYW1lCisgIC8vIGZvbGxvd2VkIGJ5IHRoZSBpbnRlcmZhY2UncyBzaW1wbGUgbmFtZS4KKyAgc3RyaW5nIG5hbWUgPSAxOworCisgIC8vIFRoZSBtZXRob2RzIG9mIHRoaXMgaW50ZXJmYWNlLCBpbiB1bnNwZWNpZmllZCBvcmRlci4KKyAgcmVwZWF0ZWQgTWV0aG9kIG1ldGhvZHMgPSAyOworCisgIC8vIEFueSBtZXRhZGF0YSBhdHRhY2hlZCB0byB0aGUgaW50ZXJmYWNlLgorICByZXBlYXRlZCBPcHRpb24gb3B0aW9ucyA9IDM7CisKKyAgLy8gQSB2ZXJzaW9uIHN0cmluZyBmb3IgdGhpcyBpbnRlcmZhY2UuIElmIHNwZWNpZmllZCwgbXVzdCBoYXZlIHRoZSBmb3JtCisgIC8vIGBtYWpvci12ZXJzaW9uLm1pbm9yLXZlcnNpb25gLCBhcyBpbiBgMS4xMGAuIElmIHRoZSBtaW5vciB2ZXJzaW9uIGlzCisgIC8vIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHplcm8uIElmIHRoZSBlbnRpcmUgdmVyc2lvbiBmaWVsZCBpcyBlbXB0eSwgdGhlCisgIC8vIG1ham9yIHZlcnNpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSBwYWNrYWdlIG5hbWUsIGFzIG91dGxpbmVkIGJlbG93LiBJZiB0aGUKKyAgLy8gZmllbGQgaXMgbm90IGVtcHR5LCB0aGUgdmVyc2lvbiBpbiB0aGUgcGFja2FnZSBuYW1lIHdpbGwgYmUgdmVyaWZpZWQgdG8gYmUKKyAgLy8gY29uc2lzdGVudCB3aXRoIHdoYXQgaXMgcHJvdmlkZWQgaGVyZS4KKyAgLy8KKyAgLy8gVGhlIHZlcnNpb25pbmcgc2NoZW1hIHVzZXMgW3NlbWFudGljCisgIC8vIHZlcnNpb25pbmddKGh0dHA6Ly9zZW12ZXIub3JnKSB3aGVyZSB0aGUgbWFqb3IgdmVyc2lvbiBudW1iZXIKKyAgLy8gaW5kaWNhdGVzIGEgYnJlYWtpbmcgY2hhbmdlIGFuZCB0aGUgbWlub3IgdmVyc2lvbiBhbiBhZGRpdGl2ZSwKKyAgLy8gbm9uLWJyZWFraW5nIGNoYW5nZS4gQm90aCB2ZXJzaW9uIG51bWJlcnMgYXJlIHNpZ25hbHMgdG8gdXNlcnMKKyAgLy8gd2hhdCB0byBleHBlY3QgZnJvbSBkaWZmZXJlbnQgdmVyc2lvbnMsIGFuZCBzaG91bGQgYmUgY2FyZWZ1bGx5CisgIC8vIGNob3NlbiBiYXNlZCBvbiB0aGUgcHJvZHVjdCBwbGFuLgorICAvLworICAvLyBUaGUgbWFqb3IgdmVyc2lvbiBpcyBhbHNvIHJlZmxlY3RlZCBpbiB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZQorICAvLyBpbnRlcmZhY2UsIHdoaWNoIG11c3QgZW5kIGluIGB2PG1ham9yLXZlcnNpb24+YCwgYXMgaW4KKyAgLy8gYGdvb2dsZS5mZWF0dXJlLnYxYC4gRm9yIG1ham9yIHZlcnNpb25zIDAgYW5kIDEsIHRoZSBzdWZmaXggY2FuCisgIC8vIGJlIG9taXR0ZWQuIFplcm8gbWFqb3IgdmVyc2lvbnMgbXVzdCBvbmx5IGJlIHVzZWQgZm9yCisgIC8vIGV4cGVyaW1lbnRhbCwgbm9uLUdBIGludGVyZmFjZXMuCisgIC8vCisgIC8vCisgIHN0cmluZyB2ZXJzaW9uID0gNDsKKworICAvLyBTb3VyY2UgY29udGV4dCBmb3IgdGhlIHByb3RvY29sIGJ1ZmZlciBzZXJ2aWNlIHJlcHJlc2VudGVkIGJ5IHRoaXMKKyAgLy8gbWVzc2FnZS4KKyAgU291cmNlQ29udGV4dCBzb3VyY2VfY29udGV4dCA9IDU7CisKKyAgLy8gSW5jbHVkZWQgaW50ZXJmYWNlcy4gU2VlIFtNaXhpbl1bXS4KKyAgcmVwZWF0ZWQgTWl4aW4gbWl4aW5zID0gNjsKKworICAvLyBUaGUgc291cmNlIHN5bnRheCBvZiB0aGUgc2VydmljZS4KKyAgU3ludGF4IHN5bnRheCA9IDc7Cit9CisKKy8vIE1ldGhvZCByZXByZXNlbnRzIGEgbWV0aG9kIG9mIGFuIEFQSSBpbnRlcmZhY2UuCittZXNzYWdlIE1ldGhvZCB7CisgIC8vIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGlzIG1ldGhvZC4KKyAgc3RyaW5nIG5hbWUgPSAxOworCisgIC8vIEEgVVJMIG9mIHRoZSBpbnB1dCBtZXNzYWdlIHR5cGUuCisgIHN0cmluZyByZXF1ZXN0X3R5cGVfdXJsID0gMjsKKworICAvLyBJZiB0cnVlLCB0aGUgcmVxdWVzdCBpcyBzdHJlYW1lZC4KKyAgYm9vbCByZXF1ZXN0X3N0cmVhbWluZyA9IDM7CisKKyAgLy8gVGhlIFVSTCBvZiB0aGUgb3V0cHV0IG1lc3NhZ2UgdHlwZS4KKyAgc3RyaW5nIHJlc3BvbnNlX3R5cGVfdXJsID0gNDsKKworICAvLyBJZiB0cnVlLCB0aGUgcmVzcG9uc2UgaXMgc3RyZWFtZWQuCisgIGJvb2wgcmVzcG9uc2Vfc3RyZWFtaW5nID0gNTsKKworICAvLyBBbnkgbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhlIG1ldGhvZC4KKyAgcmVwZWF0ZWQgT3B0aW9uIG9wdGlvbnMgPSA2OworCisgIC8vIFRoZSBzb3VyY2Ugc3ludGF4IG9mIHRoaXMgbWV0aG9kLgorICBTeW50YXggc3ludGF4ID0gNzsKK30KKworLy8gRGVjbGFyZXMgYW4gQVBJIEludGVyZmFjZSB0byBiZSBpbmNsdWRlZCBpbiB0aGlzIGludGVyZmFjZS4gVGhlIGluY2x1ZGluZworLy8gaW50ZXJmYWNlIG11c3QgcmVkZWNsYXJlIGFsbCB0aGUgbWV0aG9kcyBmcm9tIHRoZSBpbmNsdWRlZCBpbnRlcmZhY2UsIGJ1dAorLy8gZG9jdW1lbnRhdGlvbiBhbmQgb3B0aW9ucyBhcmUgaW5oZXJpdGVkIGFzIGZvbGxvd3M6CisvLworLy8gLSBJZiBhZnRlciBjb21tZW50IGFuZCB3aGl0ZXNwYWNlIHN0cmlwcGluZywgdGhlIGRvY3VtZW50YXRpb24KKy8vICAgc3RyaW5nIG9mIHRoZSByZWRlY2xhcmVkIG1ldGhvZCBpcyBlbXB0eSwgaXQgd2lsbCBiZSBpbmhlcml0ZWQKKy8vICAgZnJvbSB0aGUgb3JpZ2luYWwgbWV0aG9kLgorLy8KKy8vIC0gRWFjaCBhbm5vdGF0aW9uIGJlbG9uZ2luZyB0byB0aGUgc2VydmljZSBjb25maWcgKGh0dHAsCisvLyAgIHZpc2liaWxpdHkpIHdoaWNoIGlzIG5vdCBzZXQgaW4gdGhlIHJlZGVjbGFyZWQgbWV0aG9kIHdpbGwgYmUKKy8vICAgaW5oZXJpdGVkLgorLy8KKy8vIC0gSWYgYW4gaHR0cCBhbm5vdGF0aW9uIGlzIGluaGVyaXRlZCwgdGhlIHBhdGggcGF0dGVybiB3aWxsIGJlCisvLyAgIG1vZGlmaWVkIGFzIGZvbGxvd3MuIEFueSB2ZXJzaW9uIHByZWZpeCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZQorLy8gICB2ZXJzaW9uIG9mIHRoZSBpbmNsdWRpbmcgaW50ZXJmYWNlIHBsdXMgdGhlIFtyb290XVtdIHBhdGggaWYKKy8vICAgc3BlY2lmaWVkLgorLy8KKy8vIEV4YW1wbGUgb2YgYSBzaW1wbGUgbWl4aW46CisvLworLy8gICAgIHBhY2thZ2UgZ29vZ2xlLmFjbC52MTsKKy8vICAgICBzZXJ2aWNlIEFjY2Vzc0NvbnRyb2wgeworLy8gICAgICAgLy8gR2V0IHRoZSB1bmRlcmx5aW5nIEFDTCBvYmplY3QuCisvLyAgICAgICBycGMgR2V0QWNsKEdldEFjbFJlcXVlc3QpIHJldHVybnMgKEFjbCkgeworLy8gICAgICAgICBvcHRpb24gKGdvb2dsZS5hcGkuaHR0cCkuZ2V0ID0gIi92MS97cmVzb3VyY2U9Kip9OmdldEFjbCI7CisvLyAgICAgICB9CisvLyAgICAgfQorLy8KKy8vICAgICBwYWNrYWdlIGdvb2dsZS5zdG9yYWdlLnYyOworLy8gICAgIHNlcnZpY2UgU3RvcmFnZSB7CisvLyAgICAgICBycGMgR2V0QWNsKEdldEFjbFJlcXVlc3QpIHJldHVybnMgKEFjbCk7CisvLworLy8gICAgICAgLy8gR2V0IGEgZGF0YSByZWNvcmQuCisvLyAgICAgICBycGMgR2V0RGF0YShHZXREYXRhUmVxdWVzdCkgcmV0dXJucyAoRGF0YSkgeworLy8gICAgICAgICBvcHRpb24gKGdvb2dsZS5hcGkuaHR0cCkuZ2V0ID0gIi92Mi97cmVzb3VyY2U9Kip9IjsKKy8vICAgICAgIH0KKy8vICAgICB9CisvLworLy8gRXhhbXBsZSBvZiBhIG1peGluIGNvbmZpZ3VyYXRpb246CisvLworLy8gICAgIGFwaXM6CisvLyAgICAgLSBuYW1lOiBnb29nbGUuc3RvcmFnZS52Mi5TdG9yYWdlCisvLyAgICAgICBtaXhpbnM6CisvLyAgICAgICAtIG5hbWU6IGdvb2dsZS5hY2wudjEuQWNjZXNzQ29udHJvbAorLy8KKy8vIFRoZSBtaXhpbiBjb25zdHJ1Y3QgaW1wbGllcyB0aGF0IGFsbCBtZXRob2RzIGluIGBBY2Nlc3NDb250cm9sYCBhcmUKKy8vIGFsc28gZGVjbGFyZWQgd2l0aCBzYW1lIG5hbWUgYW5kIHJlcXVlc3QvcmVzcG9uc2UgdHlwZXMgaW4KKy8vIGBTdG9yYWdlYC4gQSBkb2N1bWVudGF0aW9uIGdlbmVyYXRvciBvciBhbm5vdGF0aW9uIHByb2Nlc3NvciB3aWxsCisvLyBzZWUgdGhlIGVmZmVjdGl2ZSBgU3RvcmFnZS5HZXRBY2xgIG1ldGhvZCBhZnRlciBpbmhlcml0aW5nCisvLyBkb2N1bWVudGF0aW9uIGFuZCBhbm5vdGF0aW9ucyBhcyBmb2xsb3dzOgorLy8KKy8vICAgICBzZXJ2aWNlIFN0b3JhZ2UgeworLy8gICAgICAgLy8gR2V0IHRoZSB1bmRlcmx5aW5nIEFDTCBvYmplY3QuCisvLyAgICAgICBycGMgR2V0QWNsKEdldEFjbFJlcXVlc3QpIHJldHVybnMgKEFjbCkgeworLy8gICAgICAgICBvcHRpb24gKGdvb2dsZS5hcGkuaHR0cCkuZ2V0ID0gIi92Mi97cmVzb3VyY2U9Kip9OmdldEFjbCI7CisvLyAgICAgICB9CisvLyAgICAgICAuLi4KKy8vICAgICB9CisvLworLy8gTm90ZSBob3cgdGhlIHZlcnNpb24gaW4gdGhlIHBhdGggcGF0dGVybiBjaGFuZ2VkIGZyb20gYHYxYCB0byBgdjJgLgorLy8KKy8vIElmIHRoZSBgcm9vdGAgZmllbGQgaW4gdGhlIG1peGluIGlzIHNwZWNpZmllZCwgaXQgc2hvdWxkIGJlIGEKKy8vIHJlbGF0aXZlIHBhdGggdW5kZXIgd2hpY2ggaW5oZXJpdGVkIEhUVFAgcGF0aHMgYXJlIHBsYWNlZC4gRXhhbXBsZToKKy8vCisvLyAgICAgYXBpczoKKy8vICAgICAtIG5hbWU6IGdvb2dsZS5zdG9yYWdlLnYyLlN0b3JhZ2UKKy8vICAgICAgIG1peGluczoKKy8vICAgICAgIC0gbmFtZTogZ29vZ2xlLmFjbC52MS5BY2Nlc3NDb250cm9sCisvLyAgICAgICAgIHJvb3Q6IGFjbHMKKy8vCisvLyBUaGlzIGltcGxpZXMgdGhlIGZvbGxvd2luZyBpbmhlcml0ZWQgSFRUUCBhbm5vdGF0aW9uOgorLy8KKy8vICAgICBzZXJ2aWNlIFN0b3JhZ2UgeworLy8gICAgICAgLy8gR2V0IHRoZSB1bmRlcmx5aW5nIEFDTCBvYmplY3QuCisvLyAgICAgICBycGMgR2V0QWNsKEdldEFjbFJlcXVlc3QpIHJldHVybnMgKEFjbCkgeworLy8gICAgICAgICBvcHRpb24gKGdvb2dsZS5hcGkuaHR0cCkuZ2V0ID0gIi92Mi9hY2xzL3tyZXNvdXJjZT0qKn06Z2V0QWNsIjsKKy8vICAgICAgIH0KKy8vICAgICAgIC4uLgorLy8gICAgIH0KK21lc3NhZ2UgTWl4aW4geworICAvLyBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGludGVyZmFjZSB3aGljaCBpcyBpbmNsdWRlZC4KKyAgc3RyaW5nIG5hbWUgPSAxOworCisgIC8vIElmIG5vbi1lbXB0eSBzcGVjaWZpZXMgYSBwYXRoIHVuZGVyIHdoaWNoIGluaGVyaXRlZCBIVFRQIHBhdGhzCisgIC8vIGFyZSByb290ZWQuCisgIHN0cmluZyByb290ID0gMjsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmEuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYTUwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmNjCkBAIC0wLDAgKzEsNTM3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHR5cGVpbmZvPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmF6X3NhbXBsZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL211dGV4Lmg+CisjaWZkZWYgQUREUkVTU19TQU5JVElaRVIKKyNpbmNsdWRlIDxzYW5pdGl6ZXIvYXNhbl9pbnRlcmZhY2UuaD4KKyNlbmRpZiAgLy8gQUREUkVTU19TQU5JVElaRVIKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3N0YXRpYyBTZXJpYWxBcmVuYTo6TWVtb3J5IEFsbG9jYXRlTWVtb3J5KGNvbnN0IEFsbG9jYXRpb25Qb2xpY3kqIHBvbGljeV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGFzdF9zaXplLCBzaXplX3QgbWluX2J5dGVzKSB7CisgIEFsbG9jYXRpb25Qb2xpY3kgcG9saWN5OyAgLy8gZGVmYXVsdCBwb2xpY3kKKyAgaWYgKHBvbGljeV9wdHIpIHBvbGljeSA9ICpwb2xpY3lfcHRyOworICBzaXplX3Qgc2l6ZTsKKyAgaWYgKGxhc3Rfc2l6ZSAhPSAwKSB7CisgICAgLy8gRG91YmxlIHRoZSBjdXJyZW50IGJsb2NrIHNpemUsIHVwIHRvIGEgbGltaXQuCisgICAgYXV0byBtYXhfc2l6ZSA9IHBvbGljeS5tYXhfYmxvY2tfc2l6ZTsKKyAgICBzaXplID0gc3RkOjptaW4oMiAqIGxhc3Rfc2l6ZSwgbWF4X3NpemUpOworICB9IGVsc2UgeworICAgIHNpemUgPSBwb2xpY3kuc3RhcnRfYmxvY2tfc2l6ZTsKKyAgfQorICAvLyBWZXJpZnkgdGhhdCBtaW5fYnl0ZXMgKyBrQmxvY2tIZWFkZXJTaXplIHdvbid0IG92ZXJmbG93LgorICBHT09HTEVfQ0hFQ0tfTEUobWluX2J5dGVzLAorICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC0gU2VyaWFsQXJlbmE6OmtCbG9ja0hlYWRlclNpemUpOworICBzaXplID0gc3RkOjptYXgoc2l6ZSwgU2VyaWFsQXJlbmE6OmtCbG9ja0hlYWRlclNpemUgKyBtaW5fYnl0ZXMpOworCisgIHZvaWQqIG1lbTsKKyAgaWYgKHBvbGljeS5ibG9ja19hbGxvYyA9PSBudWxscHRyKSB7CisgICAgbWVtID0gOjpvcGVyYXRvciBuZXcoc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgbWVtID0gcG9saWN5LmJsb2NrX2FsbG9jKHNpemUpOworICB9CisgIHJldHVybiB7bWVtLCBzaXplfTsKK30KKworY2xhc3MgR2V0RGVhbGxvY2F0b3IgeworIHB1YmxpYzoKKyAgR2V0RGVhbGxvY2F0b3IoY29uc3QgQWxsb2NhdGlvblBvbGljeSogcG9saWN5LCBzaXplX3QqIHNwYWNlX2FsbG9jYXRlZCkKKyAgICAgIDogZGVhbGxvY18ocG9saWN5ID8gcG9saWN5LT5ibG9ja19kZWFsbG9jIDogbnVsbHB0ciksCisgICAgICAgIHNwYWNlX2FsbG9jYXRlZF8oc3BhY2VfYWxsb2NhdGVkKSB7fQorCisgIHZvaWQgb3BlcmF0b3IoKShTZXJpYWxBcmVuYTo6TWVtb3J5IG1lbSkgY29uc3QgeworI2lmZGVmIEFERFJFU1NfU0FOSVRJWkVSCisgICAgLy8gVGhpcyBtZW1vcnkgd2FzIHByb3ZpZGVkIGJ5IHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRvciBhcyB1bnBvaXNvbmVkLAorICAgIC8vIHNvIHJldHVybiBpdCBpbiBhbiB1bnBvaXNvbmVkIHN0YXRlLgorICAgIEFTQU5fVU5QT0lTT05fTUVNT1JZX1JFR0lPTihtZW0ucHRyLCBtZW0uc2l6ZSk7CisjZW5kaWYgIC8vIEFERFJFU1NfU0FOSVRJWkVSCisgICAgaWYgKGRlYWxsb2NfKSB7CisgICAgICBkZWFsbG9jXyhtZW0ucHRyLCBtZW0uc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGludGVybmFsOjpTaXplZERlbGV0ZShtZW0ucHRyLCBtZW0uc2l6ZSk7CisgICAgfQorICAgICpzcGFjZV9hbGxvY2F0ZWRfICs9IG1lbS5zaXplOworICB9CisKKyBwcml2YXRlOgorICB2b2lkICgqZGVhbGxvY18pKHZvaWQqLCBzaXplX3QpOworICBzaXplX3QqIHNwYWNlX2FsbG9jYXRlZF87Cit9OworCitTZXJpYWxBcmVuYTo6U2VyaWFsQXJlbmEoQmxvY2sqIGIsIHZvaWQqIG93bmVyLCBUaHJlYWRTYWZlQXJlbmFTdGF0cyogc3RhdHMpCisgICAgOiBzcGFjZV9hbGxvY2F0ZWRfKGItPnNpemUpIHsKKyAgb3duZXJfID0gb3duZXI7CisgIGhlYWRfID0gYjsKKyAgcHRyXyA9IGItPlBvaW50ZXIoa0Jsb2NrSGVhZGVyU2l6ZSArIFRocmVhZFNhZmVBcmVuYTo6a1NlcmlhbEFyZW5hU2l6ZSk7CisgIGxpbWl0XyA9IGItPlBvaW50ZXIoYi0+c2l6ZSAmIHN0YXRpY19jYXN0PHNpemVfdD4oLTgpKTsKKyAgYXJlbmFfc3RhdHNfID0gc3RhdHM7Cit9CisKK1NlcmlhbEFyZW5hKiBTZXJpYWxBcmVuYTo6TmV3KE1lbW9yeSBtZW0sIHZvaWQqIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkU2FmZUFyZW5hU3RhdHMqIHN0YXRzKSB7CisgIEdPT0dMRV9EQ0hFQ0tfTEUoa0Jsb2NrSGVhZGVyU2l6ZSArIFRocmVhZFNhZmVBcmVuYTo6a1NlcmlhbEFyZW5hU2l6ZSwgbWVtLnNpemUpOworICBUaHJlYWRTYWZlQXJlbmFTdGF0czo6UmVjb3JkQWxsb2NhdGVTdGF0cygKKyAgICAgIHN0YXRzLCAvKnJlcXVlc3RlZD0qL21lbS5zaXplLCAvKmFsbG9jYXRlZD0qL21lbS5zaXplLCAvKndhc3RlZD0qLzApOworICBhdXRvIGIgPSBuZXcgKG1lbS5wdHIpIEJsb2Nre251bGxwdHIsIG1lbS5zaXplfTsKKyAgcmV0dXJuIG5ldyAoYi0+UG9pbnRlcihrQmxvY2tIZWFkZXJTaXplKSkgU2VyaWFsQXJlbmEoYiwgb3duZXIsIHN0YXRzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlYWxsb2NhdG9yPgorU2VyaWFsQXJlbmE6Ok1lbW9yeSBTZXJpYWxBcmVuYTo6RnJlZShEZWFsbG9jYXRvciBkZWFsbG9jYXRvcikgeworICBCbG9jayogYiA9IGhlYWRfOworICBNZW1vcnkgbWVtID0ge2IsIGItPnNpemV9OworICB3aGlsZSAoYi0+bmV4dCkgeworICAgIGIgPSBiLT5uZXh0OyAgLy8gV2UgbXVzdCBmaXJzdCBhZHZhbmNlIGJlZm9yZSBkZWxldGluZyB0aGlzIGJsb2NrCisgICAgZGVhbGxvY2F0b3IobWVtKTsKKyAgICBtZW0gPSB7YiwgYi0+c2l6ZX07CisgIH0KKyAgcmV0dXJuIG1lbTsKK30KKworUFJPVE9CVUZfTk9JTkxJTkUKK3N0ZDo6cGFpcjx2b2lkKiwgU2VyaWFsQXJlbmE6OkNsZWFudXBOb2RlKj4KK1NlcmlhbEFyZW5hOjpBbGxvY2F0ZUFsaWduZWRXaXRoQ2xlYW51cEZhbGxiYWNrKAorICAgIHNpemVfdCBuLCBjb25zdCBBbGxvY2F0aW9uUG9saWN5KiBwb2xpY3kpIHsKKyAgQWxsb2NhdGVOZXdCbG9jayhuICsga0NsZWFudXBTaXplLCBwb2xpY3kpOworICByZXR1cm4gQWxsb2NhdGVGcm9tRXhpc3RpbmdXaXRoQ2xlYW51cEZhbGxiYWNrKG4pOworfQorCitQUk9UT0JVRl9OT0lOTElORQordm9pZCogU2VyaWFsQXJlbmE6OkFsbG9jYXRlQWxpZ25lZEZhbGxiYWNrKHNpemVfdCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFsbG9jYXRpb25Qb2xpY3kqIHBvbGljeSkgeworICBBbGxvY2F0ZU5ld0Jsb2NrKG4sIHBvbGljeSk7CisgIHJldHVybiBBbGxvY2F0ZUZyb21FeGlzdGluZyhuKTsKK30KKwordm9pZCBTZXJpYWxBcmVuYTo6QWxsb2NhdGVOZXdCbG9jayhzaXplX3QgbiwgY29uc3QgQWxsb2NhdGlvblBvbGljeSogcG9saWN5KSB7CisgIC8vIFN5bmMgbGltaXQgdG8gYmxvY2sKKyAgaGVhZF8tPnN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDxDbGVhbnVwTm9kZSo+KGxpbWl0Xyk7CisKKyAgLy8gUmVjb3JkIGhvdyBtdWNoIHVzZWQgaW4gdGhpcyBibG9jay4KKyAgc2l6ZV90IHVzZWQgPSBwdHJfIC0gaGVhZF8tPlBvaW50ZXIoa0Jsb2NrSGVhZGVyU2l6ZSk7CisgIHNpemVfdCB3YXN0ZWQgPSBoZWFkXy0+c2l6ZSAtIHVzZWQ7CisgIHNwYWNlX3VzZWRfICs9IHVzZWQ7CisKKyAgLy8gVE9ETyhzYmVuemEpOiBFdmFsdWF0ZSBpZiBwdXNoaW5nIHVudXNlZCBzcGFjZSBpbnRvIHRoZSBjYWNoZWQgYmxvY2tzIGlzIGEKKyAgLy8gd2luLiBJbiBwcmVsaW1pbmFyeSB0ZXN0aW5nIHNob3dlZCBpbmNyZWFzZWQgbWVtb3J5IHNhdmluZ3MgYXMgZXhwZWN0ZWQsCisgIC8vIGJ1dCB3aXRoIGEgQ1BVIHJlZ3Jlc3Npb24uIFRoZSByZWdyZXNzaW9uIG1pZ2h0IGhhdmUgYmVlbiBhbiBhcnRpZmFjdCBvZgorICAvLyB0aGUgbWljcm9iZW5jaG1hcmsuCisKKyAgYXV0byBtZW0gPSBBbGxvY2F0ZU1lbW9yeShwb2xpY3ksIGhlYWRfLT5zaXplLCBuKTsKKyAgLy8gV2UgZG9uJ3Qgd2FudCB0byBlbWl0IGFuIGV4cGVuc2l2ZSBSTVcgaW5zdHJ1Y3Rpb24gdGhhdCByZXF1aXJlcworICAvLyBleGNsdXNpdmUgYWNjZXNzIHRvIGEgY2FjaGVsaW5lLiBIZW5jZSB3ZSB3cml0ZSBpdCBpbiB0ZXJtcyBvZiBhCisgIC8vIHJlZ3VsYXIgYWRkLgorICBhdXRvIHJlbGF4ZWQgPSBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkOworICBzcGFjZV9hbGxvY2F0ZWRfLnN0b3JlKHNwYWNlX2FsbG9jYXRlZF8ubG9hZChyZWxheGVkKSArIG1lbS5zaXplLCByZWxheGVkKTsKKyAgVGhyZWFkU2FmZUFyZW5hU3RhdHM6OlJlY29yZEFsbG9jYXRlU3RhdHMoYXJlbmFfc3RhdHNfLCAvKnJlcXVlc3RlZD0qL24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWxsb2NhdGVkPSovbWVtLnNpemUsIHdhc3RlZCk7CisgIGhlYWRfID0gbmV3IChtZW0ucHRyKSBCbG9ja3toZWFkXywgbWVtLnNpemV9OworICBwdHJfID0gaGVhZF8tPlBvaW50ZXIoa0Jsb2NrSGVhZGVyU2l6ZSk7CisgIGxpbWl0XyA9IGhlYWRfLT5Qb2ludGVyKGhlYWRfLT5zaXplKTsKKworI2lmZGVmIEFERFJFU1NfU0FOSVRJWkVSCisgIEFTQU5fUE9JU09OX01FTU9SWV9SRUdJT04ocHRyXywgbGltaXRfIC0gcHRyXyk7CisjZW5kaWYgIC8vIEFERFJFU1NfU0FOSVRJWkVSCit9CisKK3VpbnQ2NF90IFNlcmlhbEFyZW5hOjpTcGFjZVVzZWQoKSBjb25zdCB7CisgIHVpbnQ2NF90IHNwYWNlX3VzZWQgPSBwdHJfIC0gaGVhZF8tPlBvaW50ZXIoa0Jsb2NrSGVhZGVyU2l6ZSk7CisgIHNwYWNlX3VzZWQgKz0gc3BhY2VfdXNlZF87CisgIC8vIFJlbW92ZSB0aGUgb3ZlcmhlYWQgb2YgdGhlIFNlcmlhbEFyZW5hIGl0c2VsZi4KKyAgc3BhY2VfdXNlZCAtPSBUaHJlYWRTYWZlQXJlbmE6OmtTZXJpYWxBcmVuYVNpemU7CisgIHJldHVybiBzcGFjZV91c2VkOworfQorCit2b2lkIFNlcmlhbEFyZW5hOjpDbGVhbnVwTGlzdCgpIHsKKyAgQmxvY2sqIGIgPSBoZWFkXzsKKyAgYi0+c3RhcnQgPSByZWludGVycHJldF9jYXN0PENsZWFudXBOb2RlKj4obGltaXRfKTsKKyAgZG8geworICAgIGF1dG8qIGxpbWl0ID0gcmVpbnRlcnByZXRfY2FzdDxDbGVhbnVwTm9kZSo+KAorICAgICAgICBiLT5Qb2ludGVyKGItPnNpemUgJiBzdGF0aWNfY2FzdDxzaXplX3Q+KC04KSkpOworICAgIGF1dG8gaXQgPSBiLT5zdGFydDsKKyAgICBhdXRvIG51bSA9IGxpbWl0IC0gaXQ7CisgICAgaWYgKG51bSA+IDApIHsKKyAgICAgIGZvciAoOyBpdCA8IGxpbWl0OyBpdCsrKSB7CisgICAgICAgIGl0LT5jbGVhbnVwKGl0LT5lbGVtKTsKKyAgICAgIH0KKyAgICB9CisgICAgYiA9IGItPm5leHQ7CisgIH0gd2hpbGUgKGIpOworfQorCisKK1RocmVhZFNhZmVBcmVuYTo6Q2FjaGVBbGlnbmVkTGlmZWN5Y2xlSWRHZW5lcmF0b3IKKyAgICBUaHJlYWRTYWZlQXJlbmE6OmxpZmVjeWNsZV9pZF9nZW5lcmF0b3JfOworI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRExPQ0FMKQorVGhyZWFkU2FmZUFyZW5hOjpUaHJlYWRDYWNoZSYgVGhyZWFkU2FmZUFyZW5hOjp0aHJlYWRfY2FjaGUoKSB7CisgIHN0YXRpYyBpbnRlcm5hbDo6VGhyZWFkTG9jYWxTdG9yYWdlPFRocmVhZENhY2hlPiogdGhyZWFkX2NhY2hlXyA9CisgICAgICBuZXcgaW50ZXJuYWw6OlRocmVhZExvY2FsU3RvcmFnZTxUaHJlYWRDYWNoZT4oKTsKKyAgcmV0dXJuICp0aHJlYWRfY2FjaGVfLT5HZXQoKTsKK30KKyNlbGlmIGRlZmluZWQoUFJPVE9CVUZfVVNFX0RMTFMpCitUaHJlYWRTYWZlQXJlbmE6OlRocmVhZENhY2hlJiBUaHJlYWRTYWZlQXJlbmE6OnRocmVhZF9jYWNoZSgpIHsKKyAgc3RhdGljIFBST1RPQlVGX1RIUkVBRF9MT0NBTCBUaHJlYWRDYWNoZSB0aHJlYWRfY2FjaGVfID0geworICAgICAgMCwgc3RhdGljX2Nhc3Q8TGlmZWN5Y2xlSWRBdG9taWM+KC0xKSwgbnVsbHB0cn07CisgIHJldHVybiB0aHJlYWRfY2FjaGVfOworfQorI2Vsc2UKK1BST1RPQlVGX1RIUkVBRF9MT0NBTCBUaHJlYWRTYWZlQXJlbmE6OlRocmVhZENhY2hlCisgICAgVGhyZWFkU2FmZUFyZW5hOjp0aHJlYWRfY2FjaGVfID0gezAsIHN0YXRpY19jYXN0PExpZmVjeWNsZUlkQXRvbWljPigtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHJ9OworI2VuZGlmCisKK3ZvaWQgVGhyZWFkU2FmZUFyZW5hOjpJbml0aWFsaXplRnJvbSh2b2lkKiBtZW0sIHNpemVfdCBzaXplKSB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KG1lbSkgJiA3LCAwdSk7CisgIEdPT0dMRV9EQ0hFQ0soIUFsbG9jUG9saWN5KCkpOyAgLy8gUmVzZXQgc2hvdWxkIGNhbGwgSW5pdGlhbGl6ZVdpdGhQb2xpY3kgaW5zdGVhZC4KKyAgSW5pdCgpOworCisgIC8vIElnbm9yZSBpbml0aWFsIGJsb2NrIGlmIGl0IGlzIHRvbyBzbWFsbC4KKyAgaWYgKG1lbSAhPSBudWxscHRyICYmIHNpemUgPj0ga0Jsb2NrSGVhZGVyU2l6ZSArIGtTZXJpYWxBcmVuYVNpemUpIHsKKyAgICBhbGxvY19wb2xpY3lfLnNldF9pc191c2VyX293bmVkX2luaXRpYWxfYmxvY2sodHJ1ZSk7CisgICAgU2V0SW5pdGlhbEJsb2NrKG1lbSwgc2l6ZSk7CisgIH0KK30KKwordm9pZCBUaHJlYWRTYWZlQXJlbmE6OkluaXRpYWxpemVXaXRoUG9saWN5KHZvaWQqIG1lbSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGlvblBvbGljeSBwb2xpY3kpIHsKKyNpZm5kZWYgTkRFQlVHCisgIGNvbnN0IHVpbnQ2NF90IG9sZF9hbGxvY19wb2xpY3kgPSBhbGxvY19wb2xpY3lfLmdldF9yYXcoKTsKKyAgLy8gSWYgdGhlcmUgd2FzIGEgcG9saWN5IChlLmcuLCBpbiBSZXNldCgpKSwgbWFrZSBzdXJlIGZsYWdzIHdlcmUgcHJlc2VydmVkLgorI2RlZmluZSBHT09HTEVfRENIRUNLX1BPTElDWV9GTEFHU18oKSBcCisgIGlmIChvbGRfYWxsb2NfcG9saWN5ID4gMykgICAgXAorICAgIEdPT0dMRV9DSEVDS19FUShvbGRfYWxsb2NfcG9saWN5ICYgMywgYWxsb2NfcG9saWN5Xy5nZXRfcmF3KCkgJiAzKQorI2Vsc2UKKyNkZWZpbmUgR09PR0xFX0RDSEVDS19QT0xJQ1lfRkxBR1NfKCkKKyNlbmRpZiAgLy8gTkRFQlVHCisKKyAgaWYgKHBvbGljeS5Jc0RlZmF1bHQoKSkgeworICAgIC8vIExlZ2FjeSBjb2RlIGRvZXNuJ3QgdXNlIHRoZSBBUEkgYWJvdmUsIGJ1dCBwcm92aWRlcyB0aGUgaW5pdGlhbCBibG9jaworICAgIC8vIHRocm91Z2ggQXJlbmFPcHRpb25zLiBJIHN1c3BlY3QgbW9zdCBkbyBub3QgdG91Y2ggdGhlIGFsbG9jYXRpb24KKyAgICAvLyBwb2xpY3kgcGFyYW1ldGVycy4KKyAgICBJbml0aWFsaXplRnJvbShtZW0sIHNpemUpOworICAgIEdPT0dMRV9EQ0hFQ0tfUE9MSUNZX0ZMQUdTXygpOworICAgIHJldHVybjsKKyAgfQorICBHT09HTEVfRENIRUNLX0VRKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihtZW0pICYgNywgMHUpOworICBJbml0KCk7CisKKyAgLy8gSWdub3JlIGluaXRpYWwgYmxvY2sgaWYgaXQgaXMgdG9vIHNtYWxsLiBXZSBpbmNsdWRlIGFuIG9wdGlvbmFsCisgIC8vIEFsbG9jYXRpb25Qb2xpY3kgaW4gdGhpcyBjaGVjaywgc28gdGhhdCB0aGlzIGNhbiBiZSBhbGxvY2F0ZWQgb24gdGhlCisgIC8vIGZpcnN0IGJsb2NrLgorICBjb25zdGV4cHIgc2l6ZV90IGtBUFNpemUgPSBpbnRlcm5hbDo6QWxpZ25VcFRvOChzaXplb2YoQWxsb2NhdGlvblBvbGljeSkpOworICBjb25zdGV4cHIgc2l6ZV90IGtNaW5pbXVtU2l6ZSA9IGtCbG9ja0hlYWRlclNpemUgKyBrU2VyaWFsQXJlbmFTaXplICsga0FQU2l6ZTsKKworICAvLyBUaGUgdmFsdWUgZm9yIGFsbG9jX3BvbGljeV8gc3RvcmVzIHdoZXRoZXIgb3Igbm90IGFsbG9jYXRpb25zIHNob3VsZCBiZQorICAvLyByZWNvcmRlZC4KKyAgYWxsb2NfcG9saWN5Xy5zZXRfc2hvdWxkX3JlY29yZF9hbGxvY3MoCisgICAgICBwb2xpY3kubWV0cmljc19jb2xsZWN0b3IgIT0gbnVsbHB0ciAmJgorICAgICAgcG9saWN5Lm1ldHJpY3NfY29sbGVjdG9yLT5SZWNvcmRBbGxvY3MoKSk7CisgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGluaXRpYWwgYmxvY2sgdG8gc3RvcmUgdGhlIEFsbG9jYXRpb25Qb2xpY3kuCisgIGlmIChtZW0gIT0gbnVsbHB0ciAmJiBzaXplID49IGtNaW5pbXVtU2l6ZSkgeworICAgIGFsbG9jX3BvbGljeV8uc2V0X2lzX3VzZXJfb3duZWRfaW5pdGlhbF9ibG9jayh0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBhdXRvIHRtcCA9IEFsbG9jYXRlTWVtb3J5KCZwb2xpY3ksIDAsIGtNaW5pbXVtU2l6ZSk7CisgICAgbWVtID0gdG1wLnB0cjsKKyAgICBzaXplID0gdG1wLnNpemU7CisgIH0KKyAgU2V0SW5pdGlhbEJsb2NrKG1lbSwgc2l6ZSk7CisKKyAgYXV0byBzYSA9IHRocmVhZHNfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIC8vIFdlIGVuc3VyZWQgZW5vdWdoIHNwYWNlIHNvIHRoaXMgY2Fubm90IGZhaWwuCisgIHZvaWQqIHA7CisgIGlmICghc2EgfHwgIXNhLT5NYXliZUFsbG9jYXRlQWxpZ25lZChrQVBTaXplLCAmcCkpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiTWF5YmVBbGxvY2F0ZUFsaWduZWQgY2Fubm90IGZhaWwgaGVyZS4iOworICAgIHJldHVybjsKKyAgfQorICBuZXcgKHApIEFsbG9jYXRpb25Qb2xpY3l7cG9saWN5fTsKKyAgLy8gTG93IGJpdHMgc3RvcmUgZmxhZ3MsIHNvIHRoZXkgbXVzdG4ndCBiZSBvdmVyd3JpdHRlbi4KKyAgR09PR0xFX0RDSEVDS19FUSgwLCByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocCkgJiAzKTsKKyAgYWxsb2NfcG9saWN5Xy5zZXRfcG9saWN5KHJlaW50ZXJwcmV0X2Nhc3Q8QWxsb2NhdGlvblBvbGljeSo+KHApKTsKKyAgR09PR0xFX0RDSEVDS19QT0xJQ1lfRkxBR1NfKCk7CisKKyN1bmRlZiBHT09HTEVfRENIRUNLX1BPTElDWV9GTEFHU18KK30KKwordm9pZCBUaHJlYWRTYWZlQXJlbmE6OkluaXQoKSB7CisjaWZuZGVmIE5ERUJVRworICBjb25zdCBib29sIHdhc19tZXNzYWdlX293bmVkID0gSXNNZXNzYWdlT3duZWQoKTsKKyNlbmRpZiAgLy8gTkRFQlVHCisgIFRocmVhZENhY2hlJiB0YyA9IHRocmVhZF9jYWNoZSgpOworICBhdXRvIGlkID0gdGMubmV4dF9saWZlY3ljbGVfaWQ7CisgIC8vIFdlIGluY3JlbWVudCBsaWZlY3ljbGVfaWQncyBieSBtdWx0aXBsZXMgb2YgdHdvIHNvIHdlIGNhbiB1c2UgYml0IDAgYXMKKyAgLy8gYSB0YWcuCisgIGNvbnN0ZXhwciB1aW50NjRfdCBrRGVsdGEgPSAyOworICBjb25zdGV4cHIgdWludDY0X3Qga0luYyA9IFRocmVhZENhY2hlOjprUGVyVGhyZWFkSWRzICoga0RlbHRhOworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSgoaWQgJiAoa0luYyAtIDEpKSA9PSAwKSkgeworICAgIGNvbnN0ZXhwciBhdXRvIHJlbGF4ZWQgPSBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkOworICAgIC8vIE9uIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgdWludDY0X3QgYXRvbWljcyB3ZSBjYW4gY2VydGFpbmx5IG5vdAorICAgIC8vIGFmZm9yZCB0byBpbmNyZW1lbnQgYnkgbGFyZ2UgaW50ZXJ2YWxzIGFuZCBleHBlY3QgdW5pcXVlbmVzcyBkdWUgdG8KKyAgICAvLyB3cmFwcGluZywgaGVuY2Ugd2Ugb25seSBhZGQgYnkgMS4KKyAgICBpZCA9IGxpZmVjeWNsZV9pZF9nZW5lcmF0b3JfLmlkLmZldGNoX2FkZCgxLCByZWxheGVkKSAqIGtJbmM7CisgIH0KKyAgdGMubmV4dF9saWZlY3ljbGVfaWQgPSBpZCArIGtEZWx0YTsKKyAgLy8gTWVzc2FnZSBvd25lcnNoaXAgaXMgc3RvcmVkIGluIHRhZ19hbmRfaWRfLCBhbmQgaXMgc2V0IGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgLy8gVGhpcyBmbGFnIGJpdCBtdXN0IGJlIHByZXNlcnZlZCwgZXZlbiBhY3Jvc3MgY2FsbHMgdG8gUmVzZXQoKS4KKyAgdGFnX2FuZF9pZF8gPSBpZCB8ICh0YWdfYW5kX2lkXyAmIGtNZXNzYWdlT3duZWRBcmVuYSk7CisgIGhpbnRfLnN0b3JlKG51bGxwdHIsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICB0aHJlYWRzXy5zdG9yZShudWxscHRyLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyNpZm5kZWYgTkRFQlVHCisgIEdPT0dMRV9DSEVDS19FUSh3YXNfbWVzc2FnZV9vd25lZCwgSXNNZXNzYWdlT3duZWQoKSk7CisjZW5kaWYgIC8vIE5ERUJVRworICBhcmVuYV9zdGF0c18gPSBTYW1wbGUoKTsKK30KKwordm9pZCBUaHJlYWRTYWZlQXJlbmE6OlNldEluaXRpYWxCbG9jayh2b2lkKiBtZW0sIHNpemVfdCBzaXplKSB7CisgIFNlcmlhbEFyZW5hKiBzZXJpYWwgPSBTZXJpYWxBcmVuYTo6TmV3KHttZW0sIHNpemV9LCAmdGhyZWFkX2NhY2hlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZW5hX3N0YXRzXy5NdXRhYmxlU3RhdHMoKSk7CisgIHNlcmlhbC0+c2V0X25leHQoTlVMTCk7CisgIHRocmVhZHNfLnN0b3JlKHNlcmlhbCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIENhY2hlU2VyaWFsQXJlbmEoc2VyaWFsKTsKK30KKworVGhyZWFkU2FmZUFyZW5hOjp+VGhyZWFkU2FmZUFyZW5hKCkgeworICAvLyBIYXZlIHRvIGRvIHRoaXMgaW4gYSBmaXJzdCBwYXNzLCBiZWNhdXNlIHNvbWUgb2YgdGhlIGRlc3RydWN0b3JzIG1pZ2h0CisgIC8vIHJlZmVyIHRvIG1lbW9yeSBpbiBvdGhlciBibG9ja3MuCisgIENsZWFudXBMaXN0KCk7CisKKyAgc2l6ZV90IHNwYWNlX2FsbG9jYXRlZCA9IDA7CisgIGF1dG8gbWVtID0gRnJlZSgmc3BhY2VfYWxsb2NhdGVkKTsKKworICAvLyBQb2xpY3kgaXMgYWJvdXQgdG8gZ2V0IGRlbGV0ZWQuCisgIGF1dG8qIHAgPSBhbGxvY19wb2xpY3lfLmdldCgpOworICBBcmVuYU1ldHJpY3NDb2xsZWN0b3IqIGNvbGxlY3RvciA9IHAgPyBwLT5tZXRyaWNzX2NvbGxlY3RvciA6IG51bGxwdHI7CisKKyAgaWYgKGFsbG9jX3BvbGljeV8uaXNfdXNlcl9vd25lZF9pbml0aWFsX2Jsb2NrKCkpIHsKKyNpZmRlZiBBRERSRVNTX1NBTklUSVpFUgorICAgIC8vIFVucG9pc29uIHRoZSBpbml0aWFsIGJsb2NrLCBub3cgdGhhdCBpdCdzIGdvaW5nIGJhY2sgdG8gdGhlIHVzZXIuCisgICAgQVNBTl9VTlBPSVNPTl9NRU1PUllfUkVHSU9OKG1lbS5wdHIsIG1lbS5zaXplKTsKKyNlbmRpZiAgLy8gQUREUkVTU19TQU5JVElaRVIKKyAgICBzcGFjZV9hbGxvY2F0ZWQgKz0gbWVtLnNpemU7CisgIH0gZWxzZSB7CisgICAgR2V0RGVhbGxvY2F0b3IoYWxsb2NfcG9saWN5Xy5nZXQoKSwgJnNwYWNlX2FsbG9jYXRlZCkobWVtKTsKKyAgfQorCisgIGlmIChjb2xsZWN0b3IpIGNvbGxlY3Rvci0+T25EZXN0cm95KHNwYWNlX2FsbG9jYXRlZCk7Cit9CisKK1NlcmlhbEFyZW5hOjpNZW1vcnkgVGhyZWFkU2FmZUFyZW5hOjpGcmVlKHNpemVfdCogc3BhY2VfYWxsb2NhdGVkKSB7CisgIFNlcmlhbEFyZW5hOjpNZW1vcnkgbWVtID0ge251bGxwdHIsIDB9OworICBhdXRvIGRlYWxsb2NhdG9yID0gR2V0RGVhbGxvY2F0b3IoYWxsb2NfcG9saWN5Xy5nZXQoKSwgc3BhY2VfYWxsb2NhdGVkKTsKKyAgUGVyU2VyaWFsQXJlbmEoW2RlYWxsb2NhdG9yLCAmbWVtXShTZXJpYWxBcmVuYSogYSkgeworICAgIGlmIChtZW0ucHRyKSBkZWFsbG9jYXRvcihtZW0pOworICAgIG1lbSA9IGEtPkZyZWUoZGVhbGxvY2F0b3IpOworICB9KTsKKyAgcmV0dXJuIG1lbTsKK30KKwordWludDY0X3QgVGhyZWFkU2FmZUFyZW5hOjpSZXNldCgpIHsKKyAgLy8gSGF2ZSB0byBkbyB0aGlzIGluIGEgZmlyc3QgcGFzcywgYmVjYXVzZSBzb21lIG9mIHRoZSBkZXN0cnVjdG9ycyBtaWdodAorICAvLyByZWZlciB0byBtZW1vcnkgaW4gb3RoZXIgYmxvY2tzLgorICBDbGVhbnVwTGlzdCgpOworCisgIC8vIERpc2NhcmQgYWxsIGJsb2NrcyBleGNlcHQgdGhlIHNwZWNpYWwgYmxvY2sgKGlmIHByZXNlbnQpLgorICBzaXplX3Qgc3BhY2VfYWxsb2NhdGVkID0gMDsKKyAgYXV0byBtZW0gPSBGcmVlKCZzcGFjZV9hbGxvY2F0ZWQpOworICBhcmVuYV9zdGF0c18uUmVjb3JkUmVzZXQoKTsKKworICBBbGxvY2F0aW9uUG9saWN5KiBwb2xpY3kgPSBhbGxvY19wb2xpY3lfLmdldCgpOworICBpZiAocG9saWN5KSB7CisgICAgYXV0byBzYXZlZF9wb2xpY3kgPSAqcG9saWN5OworICAgIGlmIChhbGxvY19wb2xpY3lfLmlzX3VzZXJfb3duZWRfaW5pdGlhbF9ibG9jaygpKSB7CisgICAgICBzcGFjZV9hbGxvY2F0ZWQgKz0gbWVtLnNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdldERlYWxsb2NhdG9yKGFsbG9jX3BvbGljeV8uZ2V0KCksICZzcGFjZV9hbGxvY2F0ZWQpKG1lbSk7CisgICAgICBtZW0ucHRyID0gbnVsbHB0cjsKKyAgICAgIG1lbS5zaXplID0gMDsKKyAgICB9CisgICAgQXJlbmFNZXRyaWNzQ29sbGVjdG9yKiBjb2xsZWN0b3IgPSBzYXZlZF9wb2xpY3kubWV0cmljc19jb2xsZWN0b3I7CisgICAgaWYgKGNvbGxlY3RvcikgY29sbGVjdG9yLT5PblJlc2V0KHNwYWNlX2FsbG9jYXRlZCk7CisgICAgSW5pdGlhbGl6ZVdpdGhQb2xpY3kobWVtLnB0ciwgbWVtLnNpemUsIHNhdmVkX3BvbGljeSk7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDSyghYWxsb2NfcG9saWN5Xy5zaG91bGRfcmVjb3JkX2FsbG9jcygpKTsKKyAgICAvLyBOdWxscHRyIHBvbGljeQorICAgIGlmIChhbGxvY19wb2xpY3lfLmlzX3VzZXJfb3duZWRfaW5pdGlhbF9ibG9jaygpKSB7CisgICAgICBzcGFjZV9hbGxvY2F0ZWQgKz0gbWVtLnNpemU7CisgICAgICBJbml0aWFsaXplRnJvbShtZW0ucHRyLCBtZW0uc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdldERlYWxsb2NhdG9yKGFsbG9jX3BvbGljeV8uZ2V0KCksICZzcGFjZV9hbGxvY2F0ZWQpKG1lbSk7CisgICAgICBJbml0KCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHNwYWNlX2FsbG9jYXRlZDsKK30KKworc3RkOjpwYWlyPHZvaWQqLCBTZXJpYWxBcmVuYTo6Q2xlYW51cE5vZGUqPgorVGhyZWFkU2FmZUFyZW5hOjpBbGxvY2F0ZUFsaWduZWRXaXRoQ2xlYW51cChzaXplX3QgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp0eXBlX2luZm8qIHR5cGUpIHsKKyAgU2VyaWFsQXJlbmEqIGFyZW5hOworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKCFhbGxvY19wb2xpY3lfLnNob3VsZF9yZWNvcmRfYWxsb2NzKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTZXJpYWxBcmVuYUZhc3QoJmFyZW5hKSkpIHsKKyAgICByZXR1cm4gYXJlbmEtPkFsbG9jYXRlQWxpZ25lZFdpdGhDbGVhbnVwKG4sIGFsbG9jX3BvbGljeV8uZ2V0KCkpOworICB9IGVsc2UgeworICAgIHJldHVybiBBbGxvY2F0ZUFsaWduZWRXaXRoQ2xlYW51cEZhbGxiYWNrKG4sIHR5cGUpOworICB9Cit9CisKK3ZvaWQgVGhyZWFkU2FmZUFyZW5hOjpBZGRDbGVhbnVwKHZvaWQqIGVsZW0sIHZvaWQgKCpjbGVhbnVwKSh2b2lkKikpIHsKKyAgU2VyaWFsQXJlbmEqIGFyZW5hOworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghR2V0U2VyaWFsQXJlbmFGYXN0KCZhcmVuYSkpKSB7CisgICAgYXJlbmEgPSBHZXRTZXJpYWxBcmVuYUZhbGxiYWNrKCZ0aHJlYWRfY2FjaGUoKSk7CisgIH0KKyAgYXJlbmEtPkFkZENsZWFudXAoZWxlbSwgY2xlYW51cCwgQWxsb2NQb2xpY3koKSk7Cit9CisKK1BST1RPQlVGX05PSU5MSU5FCit2b2lkKiBUaHJlYWRTYWZlQXJlbmE6OkFsbG9jYXRlQWxpZ25lZEZhbGxiYWNrKHNpemVfdCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnR5cGVfaW5mbyogdHlwZSkgeworICBpZiAoYWxsb2NfcG9saWN5Xy5zaG91bGRfcmVjb3JkX2FsbG9jcygpKSB7CisgICAgYWxsb2NfcG9saWN5Xy5SZWNvcmRBbGxvYyh0eXBlLCBuKTsKKyAgICBTZXJpYWxBcmVuYSogYXJlbmE7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShHZXRTZXJpYWxBcmVuYUZhc3QoJmFyZW5hKSkpIHsKKyAgICAgIHJldHVybiBhcmVuYS0+QWxsb2NhdGVBbGlnbmVkKG4sIGFsbG9jX3BvbGljeV8uZ2V0KCkpOworICAgIH0KKyAgfQorICByZXR1cm4gR2V0U2VyaWFsQXJlbmFGYWxsYmFjaygmdGhyZWFkX2NhY2hlKCkpCisgICAgICAtPkFsbG9jYXRlQWxpZ25lZChuLCBhbGxvY19wb2xpY3lfLmdldCgpKTsKK30KKworUFJPVE9CVUZfTk9JTkxJTkUKK3N0ZDo6cGFpcjx2b2lkKiwgU2VyaWFsQXJlbmE6OkNsZWFudXBOb2RlKj4KK1RocmVhZFNhZmVBcmVuYTo6QWxsb2NhdGVBbGlnbmVkV2l0aENsZWFudXBGYWxsYmFjaygKKyAgICBzaXplX3QgbiwgY29uc3Qgc3RkOjp0eXBlX2luZm8qIHR5cGUpIHsKKyAgaWYgKGFsbG9jX3BvbGljeV8uc2hvdWxkX3JlY29yZF9hbGxvY3MoKSkgeworICAgIGFsbG9jX3BvbGljeV8uUmVjb3JkQWxsb2ModHlwZSwgbik7CisgICAgU2VyaWFsQXJlbmEqIGFyZW5hOworICAgIGlmIChHZXRTZXJpYWxBcmVuYUZhc3QoJmFyZW5hKSkgeworICAgICAgcmV0dXJuIGFyZW5hLT5BbGxvY2F0ZUFsaWduZWRXaXRoQ2xlYW51cChuLCBhbGxvY19wb2xpY3lfLmdldCgpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEdldFNlcmlhbEFyZW5hRmFsbGJhY2soJnRocmVhZF9jYWNoZSgpKQorICAgICAgLT5BbGxvY2F0ZUFsaWduZWRXaXRoQ2xlYW51cChuLCBhbGxvY19wb2xpY3lfLmdldCgpKTsKK30KKwordWludDY0X3QgVGhyZWFkU2FmZUFyZW5hOjpTcGFjZUFsbG9jYXRlZCgpIGNvbnN0IHsKKyAgU2VyaWFsQXJlbmEqIHNlcmlhbCA9IHRocmVhZHNfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgIHVpbnQ2NF90IHJlcyA9IDA7CisgIGZvciAoOyBzZXJpYWw7IHNlcmlhbCA9IHNlcmlhbC0+bmV4dCgpKSB7CisgICAgcmVzICs9IHNlcmlhbC0+U3BhY2VBbGxvY2F0ZWQoKTsKKyAgfQorICByZXR1cm4gcmVzOworfQorCit1aW50NjRfdCBUaHJlYWRTYWZlQXJlbmE6OlNwYWNlVXNlZCgpIGNvbnN0IHsKKyAgU2VyaWFsQXJlbmEqIHNlcmlhbCA9IHRocmVhZHNfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgIHVpbnQ2NF90IHNwYWNlX3VzZWQgPSAwOworICBmb3IgKDsgc2VyaWFsOyBzZXJpYWwgPSBzZXJpYWwtPm5leHQoKSkgeworICAgIHNwYWNlX3VzZWQgKz0gc2VyaWFsLT5TcGFjZVVzZWQoKTsKKyAgfQorICByZXR1cm4gc3BhY2VfdXNlZCAtIChhbGxvY19wb2xpY3lfLmdldCgpID8gc2l6ZW9mKEFsbG9jYXRpb25Qb2xpY3kpIDogMCk7Cit9CisKK3ZvaWQgVGhyZWFkU2FmZUFyZW5hOjpDbGVhbnVwTGlzdCgpIHsKKyAgUGVyU2VyaWFsQXJlbmEoW10oU2VyaWFsQXJlbmEqIGEpIHsgYS0+Q2xlYW51cExpc3QoKTsgfSk7Cit9CisKK1BST1RPQlVGX05PSU5MSU5FCitTZXJpYWxBcmVuYSogVGhyZWFkU2FmZUFyZW5hOjpHZXRTZXJpYWxBcmVuYUZhbGxiYWNrKHZvaWQqIG1lKSB7CisgIC8vIExvb2sgZm9yIHRoaXMgU2VyaWFsQXJlbmEgaW4gb3VyIGxpbmtlZCBsaXN0LgorICBTZXJpYWxBcmVuYSogc2VyaWFsID0gdGhyZWFkc18ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgZm9yICg7IHNlcmlhbDsgc2VyaWFsID0gc2VyaWFsLT5uZXh0KCkpIHsKKyAgICBpZiAoc2VyaWFsLT5vd25lcigpID09IG1lKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoIXNlcmlhbCkgeworICAgIC8vIFRoaXMgdGhyZWFkIGRvZXNuJ3QgaGF2ZSBhbnkgU2VyaWFsQXJlbmEsIHdoaWNoIGFsc28gbWVhbnMgaXQgZG9lc24ndAorICAgIC8vIGhhdmUgYW55IGJsb2NrcyB5ZXQuICBTbyB3ZSdsbCBhbGxvY2F0ZSBpdHMgZmlyc3QgYmxvY2sgbm93LgorICAgIHNlcmlhbCA9IFNlcmlhbEFyZW5hOjpOZXcoCisgICAgICAgIEFsbG9jYXRlTWVtb3J5KGFsbG9jX3BvbGljeV8uZ2V0KCksIDAsIGtTZXJpYWxBcmVuYVNpemUpLCBtZSwKKyAgICAgICAgYXJlbmFfc3RhdHNfLk11dGFibGVTdGF0cygpKTsKKworICAgIFNlcmlhbEFyZW5hKiBoZWFkID0gdGhyZWFkc18ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBkbyB7CisgICAgICBzZXJpYWwtPnNldF9uZXh0KGhlYWQpOworICAgIH0gd2hpbGUgKCF0aHJlYWRzXy5jb21wYXJlX2V4Y2hhbmdlX3dlYWsoCisgICAgICAgIGhlYWQsIHNlcmlhbCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpOworICB9CisKKyAgQ2FjaGVTZXJpYWxBcmVuYShzZXJpYWwpOworICByZXR1cm4gc2VyaWFsOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworUFJPVE9CVUZfRlVOQ19BTElHTigzMikKK3ZvaWQqIEFyZW5hOjpBbGxvY2F0ZUFsaWduZWROb0hvb2soc2l6ZV90IG4pIHsKKyAgcmV0dXJuIGltcGxfLkFsbG9jYXRlQWxpZ25lZChuLCBudWxscHRyKTsKK30KKworUFJPVE9CVUZfRlVOQ19BTElHTigzMikKK3ZvaWQqIEFyZW5hOjpBbGxvY2F0ZUFsaWduZWRXaXRoSG9vayhzaXplX3QgbiwgY29uc3Qgc3RkOjp0eXBlX2luZm8qIHR5cGUpIHsKKyAgcmV0dXJuIGltcGxfLkFsbG9jYXRlQWxpZ25lZChuLCB0eXBlKTsKK30KKworUFJPVE9CVUZfRlVOQ19BTElHTigzMikKK3ZvaWQqIEFyZW5hOjpBbGxvY2F0ZUFsaWduZWRXaXRoSG9va0ZvckFycmF5KHNpemVfdCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp0eXBlX2luZm8qIHR5cGUpIHsKKyAgcmV0dXJuIGltcGxfLkFsbG9jYXRlQWxpZ25lZDxpbnRlcm5hbDo6QWxsb2NhdGlvbkNsaWVudDo6a0FycmF5PihuLCB0eXBlKTsKK30KKworUFJPVE9CVUZfRlVOQ19BTElHTigzMikKK3N0ZDo6cGFpcjx2b2lkKiwgaW50ZXJuYWw6OlNlcmlhbEFyZW5hOjpDbGVhbnVwTm9kZSo+CitBcmVuYTo6QWxsb2NhdGVBbGlnbmVkV2l0aENsZWFudXAoc2l6ZV90IG4sIGNvbnN0IHN0ZDo6dHlwZV9pbmZvKiB0eXBlKSB7CisgIHJldHVybiBpbXBsXy5BbGxvY2F0ZUFsaWduZWRXaXRoQ2xlYW51cChuLCB0eXBlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1ZjE2YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmEuaApAQCAtMCwwICsxLDg1MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuIEFyZW5hIGFsbG9jYXRvciBmb3IgYmV0dGVyIGFsbG9jYXRpb24gcGVyZm9ybWFuY2UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0FSRU5BX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJFTkFfSF9fCisKKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9MSUJDUFBfU1REX1ZFUikgJiYgIV9IQVNfRVhDRVBUSU9OUworLy8gV29yayBhcm91bmQgYnVncyBpbiBNU1ZDIDx0eXBlaW5mbz4gaGVhZGVyIHdoZW4gX0hBU19FWENFUFRJT05TPTAuCisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2luY2x1ZGUgPHR5cGVpbmZvPgorbmFtZXNwYWNlIHN0ZCB7Cit1c2luZyB0eXBlX2luZm8gPSA6OnR5cGVfaW5mbzsKK30KKyNlbHNlCisjaW5jbHVkZSA8dHlwZWluZm8+CisjZW5kaWYKKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnQuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKKyNpZmRlZiBTV0lHCisjZXJyb3IgIllvdSBjYW5ub3QgU1dJRyBwcm90byBoZWFkZXJzIgorI2VuZGlmCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworc3RydWN0IEFyZW5hT3B0aW9uczsgIC8vIGRlZmluZWQgYmVsb3cKK2NsYXNzIEFyZW5hOyAgICAvLyBkZWZpbmVkIGJlbG93CitjbGFzcyBNZXNzYWdlOyAgLy8gZGVmaW5lZCBpbiBtZXNzYWdlLmgKK2NsYXNzIE1lc3NhZ2VMaXRlOwordGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVD4KK2NsYXNzIE1hcDsKKworbmFtZXNwYWNlIGFyZW5hX21ldHJpY3MgeworCit2b2lkIEVuYWJsZUFyZW5hTWV0cmljcyhBcmVuYU9wdGlvbnMqIG9wdGlvbnMpOworCit9ICAvLyBuYW1lc3BhY2UgYXJlbmFfbWV0cmljcworCituYW1lc3BhY2UgVGVzdFV0aWwgeworY2xhc3MgUmVmbGVjdGlvblRlc3RlcjsgIC8vIGRlZmluZWQgaW4gdGVzdF91dGlsLmgKK30gIC8vIG5hbWVzcGFjZSBUZXN0VXRpbAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitzdHJ1Y3QgQXJlbmFUZXN0UGVlcjsgICAgICAgIC8vIGRlZmluZWQgaW4gYXJlbmFfdGVzdF91dGlsLmgKK2NsYXNzIEludGVybmFsTWV0YWRhdGE7ICAgICAgLy8gZGVmaW5lZCBpbiBtZXRhZGF0YV9saXRlLmgKK2NsYXNzIExhenlGaWVsZDsgICAgICAgICAgICAgLy8gZGVmaW5lZCBpbiBsYXp5X2ZpZWxkLmgKK2NsYXNzIEVwc0NvcHlJbnB1dFN0cmVhbTsgICAgLy8gZGVmaW5lZCBpbiBwYXJzZV9jb250ZXh0LmgKK2NsYXNzIFJlcGVhdGVkUHRyRmllbGRCYXNlOyAgLy8gZGVmaW5lZCBpbiByZXBlYXRlZF9wdHJfZmllbGQuaAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2NsYXNzIEdlbmVyaWNUeXBlSGFuZGxlcjsgIC8vIGRlZmluZWQgaW4gcmVwZWF0ZWRfZmllbGQuaAorCitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCogQWxpZ25Ubyh2b2lkKiBwdHIsIHNpemVfdCBhbGlnbikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oCisgICAgICAocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHB0cikgKyBhbGlnbiAtIDEpICYgKH5hbGlnbiArIDEpKTsKK30KKworLy8gVGVtcGxhdGVkIGNsZWFudXAgbWV0aG9kcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBhcmVuYV9kZXN0cnVjdF9vYmplY3Qodm9pZCogb2JqZWN0KSB7CisgIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KG9iamVjdCktPn5UKCk7Cit9CisKK3RlbXBsYXRlIDxib29sIGRlc3RydWN0b3Jfc2tpcHBhYmxlLCB0eXBlbmFtZSBUPgorc3RydWN0IE9iamVjdERlc3RydWN0b3IgeworICBjb25zdGV4cHIgc3RhdGljIHZvaWQgKCpkZXN0cnVjdG9yKSh2b2lkKikgPSAmYXJlbmFfZGVzdHJ1Y3Rfb2JqZWN0PFQ+OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgT2JqZWN0RGVzdHJ1Y3Rvcjx0cnVlLCBUPiB7CisgIGNvbnN0ZXhwciBzdGF0aWMgdm9pZCAoKmRlc3RydWN0b3IpKHZvaWQqKSA9IG51bGxwdHI7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgYXJlbmFfZGVsZXRlX29iamVjdCh2b2lkKiBvYmplY3QpIHsKKyAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KG9iamVjdCk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gQXJlbmFPcHRpb25zIHByb3ZpZGVzIG9wdGlvbmFsIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byBhcmVuYSBjb25zdHJ1Y3Rpb24KKy8vIHRoYXQgY29udHJvbCBpdHMgYmxvY2stYWxsb2NhdGlvbiBiZWhhdmlvci4KK3N0cnVjdCBBcmVuYU9wdGlvbnMgeworICAvLyBUaGlzIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIGZpcnN0IGJsb2NrIHJlcXVlc3RlZCBmcm9tIHRoZSBzeXN0ZW0gbWFsbG9jLgorICAvLyBTdWJzZXF1ZW50IGJsb2NrIHNpemVzIHdpbGwgaW5jcmVhc2UgaW4gYSBnZW9tZXRyaWMgc2VyaWVzIHVwIHRvIGEgbWF4aW11bS4KKyAgc2l6ZV90IHN0YXJ0X2Jsb2NrX3NpemU7CisKKyAgLy8gVGhpcyBkZWZpbmVzIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgcmVxdWVzdGVkIGZyb20gc3lzdGVtIG1hbGxvYyAodW5sZXNzIGFuCisgIC8vIGluZGl2aWR1YWwgYXJlbmEgYWxsb2NhdGlvbiByZXF1ZXN0IG9jY3VycyB3aXRoIGEgc2l6ZSBsYXJnZXIgdGhhbiB0aGlzCisgIC8vIG1heGltdW0pLiBSZXF1ZXN0ZWQgYmxvY2sgc2l6ZXMgaW5jcmVhc2UgdXAgdG8gdGhpcyB2YWx1ZSwgdGhlbiByZW1haW4KKyAgLy8gaGVyZS4KKyAgc2l6ZV90IG1heF9ibG9ja19zaXplOworCisgIC8vIEFuIGluaXRpYWwgYmxvY2sgb2YgbWVtb3J5IGZvciB0aGUgYXJlbmEgdG8gdXNlLCBvciBOVUxMIGZvciBub25lLiBJZgorICAvLyBwcm92aWRlZCwgdGhlIGJsb2NrIG11c3QgbGl2ZSBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSBhcmVuYSBpdHNlbGYuIFRoZQorICAvLyBjcmVhdG9yIG9mIHRoZSBBcmVuYSByZXRhaW5zIG93bmVyc2hpcCBvZiB0aGUgYmxvY2sgYWZ0ZXIgdGhlIEFyZW5hIGlzCisgIC8vIGRlc3Ryb3llZC4KKyAgY2hhciogaW5pdGlhbF9ibG9jazsKKworICAvLyBUaGUgc2l6ZSBvZiB0aGUgaW5pdGlhbCBibG9jaywgaWYgcHJvdmlkZWQuCisgIHNpemVfdCBpbml0aWFsX2Jsb2NrX3NpemU7CisKKyAgLy8gQSBmdW5jdGlvbiBwb2ludGVyIHRvIGFuIGFsbG9jIG1ldGhvZCB0aGF0IHJldHVybnMgbWVtb3J5IGJsb2NrcyBvZiBzaXplCisgIC8vIHJlcXVlc3RlZC4gQnkgZGVmYXVsdCwgaXQgY29udGFpbnMgYSBwdHIgdG8gdGhlIG1hbGxvYyBmdW5jdGlvbi4KKyAgLy8KKyAgLy8gTk9URTogYmxvY2tfYWxsb2MgYW5kIGRlYWxsb2MgZnVuY3Rpb25zIGFyZSBleHBlY3RlZCB0byBiZWhhdmUgbGlrZQorICAvLyBtYWxsb2MgYW5kIGZyZWUsIGluY2x1ZGluZyBBc2FuIHBvaXNvbmluZy4KKyAgdm9pZCogKCpibG9ja19hbGxvYykoc2l6ZV90KTsKKyAgLy8gQSBmdW5jdGlvbiBwb2ludGVyIHRvIGEgZGVhbGxvYyBtZXRob2QgdGhhdCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGJsb2NrcworICAvLyBmcm9tIHRoZSBhcmVuYS4gQnkgZGVmYXVsdCwgaXQgY29udGFpbnMgYSBwdHIgdG8gYSB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQKKyAgLy8gY2FsbHMgZnJlZS4KKyAgdm9pZCAoKmJsb2NrX2RlYWxsb2MpKHZvaWQqLCBzaXplX3QpOworCisgIEFyZW5hT3B0aW9ucygpCisgICAgICA6IHN0YXJ0X2Jsb2NrX3NpemUoaW50ZXJuYWw6OkFsbG9jYXRpb25Qb2xpY3k6OmtEZWZhdWx0U3RhcnRCbG9ja1NpemUpLAorICAgICAgICBtYXhfYmxvY2tfc2l6ZShpbnRlcm5hbDo6QWxsb2NhdGlvblBvbGljeTo6a0RlZmF1bHRNYXhCbG9ja1NpemUpLAorICAgICAgICBpbml0aWFsX2Jsb2NrKE5VTEwpLAorICAgICAgICBpbml0aWFsX2Jsb2NrX3NpemUoMCksCisgICAgICAgIGJsb2NrX2FsbG9jKG51bGxwdHIpLAorICAgICAgICBibG9ja19kZWFsbG9jKG51bGxwdHIpLAorICAgICAgICBtYWtlX21ldHJpY3NfY29sbGVjdG9yKG51bGxwdHIpIHt9CisKKyBwcml2YXRlOgorICAvLyBJZiBtYWtlX21ldHJpY3NfY29sbGVjdG9yIGlzIG5vdCBudWxscHRyLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBBcmVuYSBpbml0CisgIC8vIHRpbWUuIEl0IG1heSByZXR1cm4gYSBwb2ludGVyIHRvIGEgY29sbGVjdG9yIGluc3RhbmNlIHRoYXQgd2lsbCBiZSBub3RpZmllZAorICAvLyBvZiBpbnRlcmVzdGluZyBldmVudHMgcmVsYXRlZCB0byB0aGUgYXJlbmEuCisgIGludGVybmFsOjpBcmVuYU1ldHJpY3NDb2xsZWN0b3IqICgqbWFrZV9tZXRyaWNzX2NvbGxlY3RvcikoKTsKKworICBpbnRlcm5hbDo6QXJlbmFNZXRyaWNzQ29sbGVjdG9yKiBNZXRyaWNzQ29sbGVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX21ldHJpY3NfY29sbGVjdG9yID8gKCptYWtlX21ldHJpY3NfY29sbGVjdG9yKSgpIDogbnVsbHB0cjsKKyAgfQorCisgIGludGVybmFsOjpBbGxvY2F0aW9uUG9saWN5IEFsbG9jYXRpb25Qb2xpY3koKSBjb25zdCB7CisgICAgaW50ZXJuYWw6OkFsbG9jYXRpb25Qb2xpY3kgcmVzOworICAgIHJlcy5zdGFydF9ibG9ja19zaXplID0gc3RhcnRfYmxvY2tfc2l6ZTsKKyAgICByZXMubWF4X2Jsb2NrX3NpemUgPSBtYXhfYmxvY2tfc2l6ZTsKKyAgICByZXMuYmxvY2tfYWxsb2MgPSBibG9ja19hbGxvYzsKKyAgICByZXMuYmxvY2tfZGVhbGxvYyA9IGJsb2NrX2RlYWxsb2M7CisgICAgcmVzLm1ldHJpY3NfY29sbGVjdG9yID0gTWV0cmljc0NvbGxlY3RvcigpOworICAgIHJldHVybiByZXM7CisgIH0KKworICBmcmllbmQgdm9pZCBhcmVuYV9tZXRyaWNzOjpFbmFibGVBcmVuYU1ldHJpY3MoQXJlbmFPcHRpb25zKik7CisKKyAgZnJpZW5kIGNsYXNzIEFyZW5hOworICBmcmllbmQgY2xhc3MgQXJlbmFPcHRpb25zVGVzdEZyaWVuZDsKK307CisKKy8vIFN1cHBvcnQgZm9yIG5vbi1SVFRJIGVudmlyb25tZW50cy4gKFRoZSBtZXRyaWNzIGhvb2tzIEFQSSB1c2VzIHR5cGUKKy8vIGluZm9ybWF0aW9uLikKKyNpZiBQUk9UT0JVRl9SVFRJCisjZGVmaW5lIFJUVElfVFlQRV9JRCh0eXBlKSAoJnR5cGVpZCh0eXBlKSkKKyNlbHNlCisjZGVmaW5lIFJUVElfVFlQRV9JRCh0eXBlKSAoTlVMTCkKKyNlbmRpZgorCisvLyBBcmVuYSBhbGxvY2F0b3IuIEFyZW5hIGFsbG9jYXRpb24gcmVwbGFjZXMgb3JkaW5hcnkgKGhlYXAtYmFzZWQpIGFsbG9jYXRpb24KKy8vIHdpdGggbmV3L2RlbGV0ZSwgYW5kIGltcHJvdmVzIHBlcmZvcm1hbmNlIGJ5IGFnZ3JlZ2F0aW5nIGFsbG9jYXRpb25zIGludG8KKy8vIGxhcmdlciBibG9ja3MgYW5kIGZyZWVpbmcgYWxsb2NhdGlvbnMgYWxsIGF0IG9uY2UuIFByb3RvY29sIG1lc3NhZ2VzIGFyZQorLy8gYWxsb2NhdGVkIG9uIGFuIGFyZW5hIGJ5IHVzaW5nIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFQ+KEFyZW5hKiksIGJlbG93LCBhbmQKKy8vIGFyZSBhdXRvbWF0aWNhbGx5IGZyZWVkIHdoZW4gdGhlIGFyZW5hIGlzIGRlc3Ryb3llZC4KKy8vCisvLyBUaGlzIGlzIGEgdGhyZWFkLXNhZmUgaW1wbGVtZW50YXRpb246IG11bHRpcGxlIHRocmVhZHMgbWF5IGFsbG9jYXRlIGZyb20gdGhlCisvLyBhcmVuYSBjb25jdXJyZW50bHkuIERlc3RydWN0aW9uIGlzIG5vdCB0aHJlYWQtc2FmZSBhbmQgdGhlIGRlc3RydWN0aW5nCisvLyB0aHJlYWQgbXVzdCBzeW5jaHJvbml6ZSB3aXRoIHVzZXJzIG9mIHRoZSBhcmVuYSBmaXJzdC4KKy8vCisvLyBBbiBhcmVuYSBwcm92aWRlcyB0d28gYWxsb2NhdGlvbiBpbnRlcmZhY2VzOiBDcmVhdGVNZXNzYWdlPFQ+LCB3aGljaCB3b3JrcworLy8gZm9yIGFyZW5hLWVuYWJsZWQgcHJvdG8yIG1lc3NhZ2UgdHlwZXMgYXMgd2VsbCBhcyBvdGhlciB0eXBlcyB0aGF0IHNhdGlzZnkKKy8vIHRoZSBhcHByb3ByaWF0ZSBwcm90b2NvbCAoZGVzY3JpYmVkIGJlbG93KSwgYW5kIENyZWF0ZTxUPiwgd2hpY2ggd29ya3MgZm9yCisvLyBhbnkgYXJiaXRyYXJ5IHR5cGUgVC4gQ3JlYXRlTWVzc2FnZTxUPiBpcyBiZXR0ZXIgd2hlbiB0aGUgdHlwZSBUIHN1cHBvcnRzIGl0LAorLy8gYmVjYXVzZSB0aGlzIGludGVyZmFjZSAoaSkgcGFzc2VzIHRoZSBhcmVuYSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIG9iamVjdCBzbworLy8gdGhhdCBpdHMgc3ViLW9iamVjdHMgYW5kIGludGVybmFsIGFsbG9jYXRpb25zIGNhbiB1c2UgdGhlIGFyZW5hIHRvbywgYW5kIChpaSkKKy8vIGVsaWRlcyB0aGUgb2JqZWN0J3MgZGVzdHJ1Y3RvciBjYWxsIHdoZW4gcG9zc2libGUuIENyZWF0ZTxUPiBkb2VzIG5vdCBwbGFjZQorLy8gYW55IHNwZWNpYWwgcmVxdWlyZW1lbnRzIG9uIHRoZSB0eXBlIFQsIGFuZCB3aWxsIGludm9rZSB0aGUgb2JqZWN0J3MKKy8vIGRlc3RydWN0b3Igd2hlbiB0aGUgYXJlbmEgaXMgZGVzdHJveWVkLgorLy8KKy8vIFRoZSBhcmVuYSBtZXNzYWdlIGFsbG9jYXRpb24gcHJvdG9jb2wsIHJlcXVpcmVkIGJ5CisvLyBDcmVhdGVNZXNzYWdlPFQ+KEFyZW5hKiBhcmVuYSwgQXJncyYmLi4uIGFyZ3MpLCBpcyBhcyBmb2xsb3dzOgorLy8KKy8vIC0gVGhlIHR5cGUgVCBtdXN0IGhhdmUgKGF0IGxlYXN0KSB0d28gY29uc3RydWN0b3JzOiBhIGNvbnN0cnVjdG9yIGNhbGxhYmxlCisvLyAgIHdpdGggYGFyZ3NgICh3aXRob3V0IGBhcmVuYWApLCBjYWxsZWQgd2hlbiBhIFQgaXMgYWxsb2NhdGVkIG9uIHRoZSBoZWFwOworLy8gICBhbmQgYSBjb25zdHJ1Y3RvciBjYWxsYWJsZSB3aXRoIGBBcmVuYSogYXJlbmEsIEFyZ3MmJi4uLiBhcmdzYCwgY2FsbGVkIHdoZW4KKy8vICAgYSBUIGlzIGFsbG9jYXRlZCBvbiBhbiBhcmVuYS4gSWYgdGhlIHNlY29uZCBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgd2l0aCBhCisvLyAgIE5VTEwgYXJlbmEgcG9pbnRlciwgaXQgbXVzdCBiZSBlcXVpdmFsZW50IHRvIGludm9raW5nIHRoZSBmaXJzdAorLy8gICAoYGFyZ3NgLW9ubHkpIGNvbnN0cnVjdG9yLgorLy8KKy8vIC0gVGhlIHR5cGUgVCBtdXN0IGhhdmUgYSBwYXJ0aWN1bGFyIHR5cGUgdHJhaXQ6IGEgbmVzdGVkIHR5cGUKKy8vICAgfEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlX3wuIFRoaXMgaXMgdXN1YWxseSBhIHR5cGVkZWYgdG8gfHZvaWR8LiBJZiBubworLy8gICBzdWNoIHR5cGUgdHJhaXQgZXhpc3RzLCB0aGVuIHRoZSBpbnN0YW50aWF0aW9uIENyZWF0ZU1lc3NhZ2U8VD4gd2lsbCBmYWlsCisvLyAgIHRvIGNvbXBpbGUuCisvLworLy8gLSBUaGUgdHlwZSBUICptYXkqIGhhdmUgdGhlIHR5cGUgdHJhaXQgfERlc3RydWN0b3JTa2lwcGFibGVffC4gSWYgdGhpcyB0eXBlCisvLyAgIHRyYWl0IGlzIHByZXNlbnQgaW4gdGhlIHR5cGUsIHRoZW4gaXRzIGRlc3RydWN0b3Igd2lsbCBub3QgYmUgY2FsbGVkIGlmIGFuZAorLy8gICBvbmx5IGlmIGl0IHdhcyBwYXNzZWQgYSBub24tTlVMTCBhcmVuYSBwb2ludGVyLiBJZiB0aGlzIHR5cGUgdHJhaXQgaXMgbm90CisvLyAgIHByZXNlbnQgb24gdGhlIHR5cGUsIHRoZW4gaXRzIGRlc3RydWN0b3IgaXMgYWx3YXlzIGNhbGxlZCB3aGVuIHRoZQorLy8gICBjb250YWluaW5nIGFyZW5hIGlzIGRlc3Ryb3llZC4KKy8vCisvLyBUaGlzIHByb3RvY29sIGlzIGltcGxlbWVudGVkIGJ5IGFsbCBhcmVuYS1lbmFibGVkIHByb3RvMiBtZXNzYWdlIGNsYXNzZXMgYXMKKy8vIHdlbGwgYXMgcHJvdG9idWYgY29udGFpbmVyIHR5cGVzIGxpa2UgUmVwZWF0ZWRQdHJGaWVsZCBhbmQgTWFwLiBUaGUgcHJvdG9jb2wKKy8vIGlzIGludGVybmFsIHRvIHByb3RvYnVmIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzdGFibGUuIE5vbi1wcm90byB0eXBlcworLy8gc2hvdWxkIG5vdCByZWx5IG9uIHRoaXMgcHJvdG9jb2wuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgUFJPVE9CVUZfQUxJR05BUyg4KSBBcmVuYSBmaW5hbCB7CisgcHVibGljOgorICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggc2Vuc2libGUgZGVmYXVsdCBvcHRpb25zLCB0dW5lZCBmb3IgYXZlcmFnZQorICAvLyB1c2UtY2FzZXMuCisgIGlubGluZSBBcmVuYSgpIDogaW1wbF8oKSB7fQorCisgIC8vIENvbnN0cnVjdCBhbiBhcmVuYSB3aXRoIGRlZmF1bHQgb3B0aW9ucywgZXhjZXB0IGZvciB0aGUgc3VwcGxpZWQKKyAgLy8gaW5pdGlhbCBibG9jay4gSXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gdXNlIHRoaXMgY29uc3RydWN0b3IKKyAgLy8gaW5zdGVhZCBvZiBwYXNzaW5nIEFyZW5hT3B0aW9ucyBpZiB0aGUgb25seSBjb25maWd1cmF0aW9uIG5lZWRlZAorICAvLyBieSB0aGUgY2FsbGVyIGlzIHN1cHBseWluZyBhbiBpbml0aWFsIGJsb2NrLgorICBpbmxpbmUgQXJlbmEoY2hhciogaW5pdGlhbF9ibG9jaywgc2l6ZV90IGluaXRpYWxfYmxvY2tfc2l6ZSkKKyAgICAgIDogaW1wbF8oaW5pdGlhbF9ibG9jaywgaW5pdGlhbF9ibG9ja19zaXplKSB7fQorCisgIC8vIEFyZW5hIGNvbnN0cnVjdG9yIHRha2luZyBjdXN0b20gb3B0aW9ucy4gU2VlIEFyZW5hT3B0aW9ucyBhYm92ZSBmb3IKKyAgLy8gZGVzY3JpcHRpb25zIG9mIHRoZSBvcHRpb25zIGF2YWlsYWJsZS4KKyAgZXhwbGljaXQgQXJlbmEoY29uc3QgQXJlbmFPcHRpb25zJiBvcHRpb25zKQorICAgICAgOiBpbXBsXyhvcHRpb25zLmluaXRpYWxfYmxvY2ssIG9wdGlvbnMuaW5pdGlhbF9ibG9ja19zaXplLAorICAgICAgICAgICAgICBvcHRpb25zLkFsbG9jYXRpb25Qb2xpY3koKSkge30KKworICAvLyBCbG9jayBvdmVyaGVhZC4gIFVzZSB0aGlzIGFzIGEgZ3VpZGUgZm9yIGhvdyBtdWNoIHRvIG92ZXItYWxsb2NhdGUgdGhlCisgIC8vIGluaXRpYWwgYmxvY2sgaWYgeW91IHdhbnQgYW4gYWxsb2NhdGlvbiBvZiBzaXplIE4gdG8gZml0IGluc2lkZSBpdC4KKyAgLy8KKyAgLy8gV0FSTklORzogaWYgeW91IGFsbG9jYXRlIG11bHRpcGxlIG9iamVjdHMsIGl0IGlzIGRpZmZpY3VsdCB0byBndWFyYW50ZWUKKyAgLy8gdGhhdCBhIHNlcmllcyBvZiBhbGxvY2F0aW9ucyB3aWxsIGZpdCBpbiB0aGUgaW5pdGlhbCBibG9jaywgZXNwZWNpYWxseSBpZgorICAvLyBBcmVuYSBjaGFuZ2VzIGl0cyBhbGlnbm1lbnQgZ3VhcmFudGVlcyBpbiB0aGUgZnV0dXJlIQorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCbG9ja092ZXJoZWFkID0KKyAgICAgIGludGVybmFsOjpUaHJlYWRTYWZlQXJlbmE6OmtCbG9ja0hlYWRlclNpemUgKworICAgICAgaW50ZXJuYWw6OlRocmVhZFNhZmVBcmVuYTo6a1NlcmlhbEFyZW5hU2l6ZTsKKworICBpbmxpbmUgfkFyZW5hKCkge30KKworICAvLyBUT0RPKHByb3RvYnVmLXRlYW0pOiBGaXggY2FsbGVycyB0byB1c2UgY29uc3RydWN0b3IgYW5kIGRlbGV0ZSB0aGlzIG1ldGhvZC4KKyAgdm9pZCBJbml0KGNvbnN0IEFyZW5hT3B0aW9ucyYpIHt9CisKKyAgLy8gQVBJIHRvIGNyZWF0ZSBwcm90bzIgbWVzc2FnZSBvYmplY3RzIG9uIHRoZSBhcmVuYS4gSWYgdGhlIGFyZW5hIHBhc3NlZCBpbgorICAvLyBpcyBOVUxMLCB0aGVuIGEgaGVhcCBhbGxvY2F0ZWQgb2JqZWN0IGlzIHJldHVybmVkLiBUeXBlIFQgbXVzdCBiZSBhIG1lc3NhZ2UKKyAgLy8gZGVmaW5lZCBpbiBhIC5wcm90byBmaWxlIHdpdGggY2NfZW5hYmxlX2FyZW5hcyBzZXQgdG8gdHJ1ZSwgb3RoZXJ3aXNlIGEKKyAgLy8gY29tcGlsYXRpb24gZXJyb3Igd2lsbCBvY2N1ci4KKyAgLy8KKyAgLy8gUmVwZWF0ZWRGaWVsZCBhbmQgUmVwZWF0ZWRQdHJGaWVsZCBtYXkgYWxzbyBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkgb24gYW4KKyAgLy8gYXJlbmEgd2l0aCB0aGlzIG1ldGhvZC4KKyAgLy8KKyAgLy8gVGhpcyBmdW5jdGlvbiBhbHNvIGFjY2VwdHMgYW55IHR5cGUgVCB0aGF0IHNhdGlzZmllcyB0aGUgYXJlbmEgbWVzc2FnZQorICAvLyBhbGxvY2F0aW9uIHByb3RvY29sLCBkb2N1bWVudGVkIGFib3ZlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSBzdGF0aWMgVCogQ3JlYXRlTWVzc2FnZShBcmVuYSogYXJlbmEsIEFyZ3MmJi4uLiBhcmdzKSB7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgSW50ZXJuYWxIZWxwZXI8VD46OmlzX2FyZW5hX2NvbnN0cnVjdGFibGU6OnZhbHVlLAorICAgICAgICAiQ3JlYXRlTWVzc2FnZSBjYW4gb25seSBjb25zdHJ1Y3QgdHlwZXMgdGhhdCBhcmUgQXJlbmFDb25zdHJ1Y3RhYmxlIik7CisgICAgLy8gV2UgbXVzdCBkZWxlZ2F0ZSB0byBDcmVhdGVNYXliZU1lc3NhZ2UoKSBhbmQgTk9UIENyZWF0ZU1lc3NhZ2VJbnRlcm5hbCgpCisgICAgLy8gYmVjYXVzZSBwcm90b2J1ZiBnZW5lcmF0ZWQgY2xhc3NlcyBzcGVjaWFsaXplIENyZWF0ZU1heWJlTWVzc2FnZSgpIGFuZCB3ZQorICAgIC8vIG5lZWQgdG8gdXNlIHRoYXQgc3BlY2lhbGl6YXRpb24gZm9yIGNvZGUgc2l6ZSByZWFzb25zLgorICAgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPFQ+KGFyZW5hLCBzdGF0aWNfY2FzdDxBcmdzJiY+KGFyZ3MpLi4uKTsKKyAgfQorCisgIC8vIEFQSSB0byBjcmVhdGUgYW55IG9iamVjdHMgb24gdGhlIGFyZW5hLiBOb3RlIHRoYXQgb25seSB0aGUgb2JqZWN0IHdpbGwKKyAgLy8gYmUgY3JlYXRlZCBvbiB0aGUgYXJlbmE7IHRoZSB1bmRlcmx5aW5nIHB0cnMgKGluIGNhc2Ugb2YgYSBwcm90bzIgbWVzc2FnZSkKKyAgLy8gd2lsbCBiZSBzdGlsbCBoZWFwIGFsbG9jYXRlZC4gUHJvdG8gbWVzc2FnZXMgc2hvdWxkIHVzdWFsbHkgYmUgYWxsb2NhdGVkCisgIC8vIHdpdGggQ3JlYXRlTWVzc2FnZTxUPigpIGluc3RlYWQuCisgIC8vCisgIC8vIE5vdGUgdGhhdCBldmVuIGlmIFQgc2F0aXNmaWVzIHRoZSBhcmVuYSBtZXNzYWdlIGNvbnN0cnVjdGlvbiBwcm90b2NvbAorICAvLyAoSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfIHRyYWl0IGFuZCBvcHRpb25hbCBEZXN0cnVjdG9yU2tpcHBhYmxlXworICAvLyB0cmFpdCksIGFzIGRlc2NyaWJlZCBhYm92ZSwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBmb2xsb3cgdGhlIHByb3RvY29sOworICAvLyBpbnN0ZWFkLCBpdCB0cmVhdHMgVCBhcyBhIGJsYWNrLWJveCB0eXBlLCBqdXN0IGFzIGlmIGl0IGRpZCBub3QgaGF2ZSB0aGVzZQorICAvLyB0cmFpdHMuIFNwZWNpZmljYWxseSwgVCdzIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyB3aWxsIGFsd2F5cyBiZSBvbmx5IHRob3NlCisgIC8vIHBhc3NlZCB0byBDcmVhdGU8VD4oKSAtLSBubyBhZGRpdGlvbmFsIGFyZW5hIHBvaW50ZXIgaXMgaW1wbGljaXRseSBhZGRlZC4KKyAgLy8gRnVydGhlcm1vcmUsIHRoZSBkZXN0cnVjdG9yIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBhdCBhcmVuYSBkZXN0cnVjdGlvbiB0aW1lCisgIC8vICh1bmxlc3MgdGhlIGRlc3RydWN0b3IgaXMgdHJpdmlhbCkuIEhlbmNlLCBmcm9tIFQncyBwb2ludCBvZiB2aWV3LCBpdCBpcyBhcworICAvLyBpZiB0aGUgb2JqZWN0IHdlcmUgYWxsb2NhdGVkIG9uIHRoZSBoZWFwIChleGNlcHQgdGhhdCB0aGUgdW5kZXJseWluZyBtZW1vcnkKKyAgLy8gaXMgb2J0YWluZWQgZnJvbSB0aGUgYXJlbmEpLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgVCogQ3JlYXRlKEFyZW5hKiBhcmVuYSwgQXJncyYmLi4uIGFyZ3MpIHsKKyAgICByZXR1cm4gQ3JlYXRlSW50ZXJuYWw8VD4oYXJlbmEsIHN0ZDo6aXNfY29udmVydGlibGU8VCosIE1lc3NhZ2VMaXRlKj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXJncyYmPihhcmdzKS4uLik7CisgIH0KKworICAvLyBBbGxvY2F0ZXMgbWVtb3J5IHdpdGggdGhlIHNwZWNpZmljIHNpemUgYW5kIGFsaWdubWVudC4KKyAgdm9pZCogQWxsb2NhdGVBbGlnbmVkKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24gPSA4KSB7CisgICAgaWYgKGFsaWduIDw9IDgpIHsKKyAgICAgIHJldHVybiBBbGxvY2F0ZUFsaWduZWROb0hvb2soaW50ZXJuYWw6OkFsaWduVXBUbzgoc2l6ZSkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSBhcmUgd2FzdGluZyBzcGFjZSBieSBvdmVyIGFsbG9jYXRpbmcgYWxpZ24gLSA4IGJ5dGVzLiBDb21wYXJlZAorICAgICAgLy8gdG8gYSBkZWRpY2F0ZWQgZnVuY3Rpb24gdGhhdCB0YWtlcyBjdXJyZW50IGFsaWdubWVudCBpbiBjb25zaWRlcmF0aW9uLgorICAgICAgLy8gU3VjaCBhIHNjaGVtZSB3b3VsZCBvbmx5IHdhc3RlIChhbGlnbiAtIDgpLzIgYnl0ZXMgb24gYXZlcmFnZSwgYnV0CisgICAgICAvLyByZXF1aXJlcyBhIGRlZGljYXRlZCBmdW5jdGlvbiBpbiB0aGUgb3V0bGluZSBhcmVuYSBhbGxvY2F0aW9uCisgICAgICAvLyBmdW5jdGlvbnMuIFBvc3NpYmx5IHJlLWV2YWx1YXRlIHRyYWRlb2ZmcyBsYXRlci4KKyAgICAgIHJldHVybiBpbnRlcm5hbDo6QWxpZ25UbyhBbGxvY2F0ZUFsaWduZWROb0hvb2soc2l6ZSArIGFsaWduIC0gOCksIGFsaWduKTsKKyAgICB9CisgIH0KKworICAvLyBDcmVhdGUgYW4gYXJyYXkgb2Ygb2JqZWN0IHR5cGUgVCBvbiB0aGUgYXJlbmEgKndpdGhvdXQqIGludm9raW5nIHRoZQorICAvLyBjb25zdHJ1Y3RvciBvZiBULiBJZiBgYXJlbmFgIGlzIG51bGwsIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgZnJlZWQKKyAgLy8gd2l0aCBgZGVsZXRlW10geDtgIChvciBgOjpvcGVyYXRvciBkZWxldGVbXSh4KTtgKS4KKyAgLy8gVG8gZW5zdXJlIHNhZmUgdXNlcywgdGhpcyBmdW5jdGlvbiBjaGVja3MgYXQgY29tcGlsZSB0aW1lCisgIC8vICh3aGVuIGNvbXBpbGVkIGFzIEMrKzExKSB0aGF0IFQgaXMgdHJpdmlhbGx5IGRlZmF1bHQtY29uc3RydWN0aWJsZSBhbmQKKyAgLy8gdHJpdmlhbGx5IGRlc3RydWN0aWJsZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIFQqIENyZWF0ZUFycmF5KEFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9lbGVtZW50cykgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJDcmVhdGVBcnJheSByZXF1aXJlcyBhIHRyaXZpYWxseSBjb25zdHJ1Y3RpYmxlIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZTxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiQ3JlYXRlQXJyYXkgcmVxdWlyZXMgYSB0cml2aWFsbHkgZGVzdHJ1Y3RpYmxlIHR5cGUiKTsKKyAgICBHT09HTEVfQ0hFQ0tfTEUobnVtX2VsZW1lbnRzLCBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC8gc2l6ZW9mKFQpKQorICAgICAgICA8PCAiUmVxdWVzdGVkIHNpemUgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIHNpemVfdC4iOworICAgIGlmIChhcmVuYSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KDo6b3BlcmF0b3IgbmV3W10obnVtX2VsZW1lbnRzICogc2l6ZW9mKFQpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBhcmVuYS0+Q3JlYXRlSW50ZXJuYWxSYXdBcnJheTxUPihudW1fZWxlbWVudHMpOworICAgIH0KKyAgfQorCisgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIHJvdXRpbmVzIGFyZSBmb3IgbW9uaXRvcmluZy4gVGhleSB3aWxsIGFwcHJveGltYXRlIHRoZQorICAvLyB0b3RhbCBzdW0gYWxsb2NhdGVkIGFuZCB1c2VkIG1lbW9yeSwgYnV0IHRoZSBleGFjdCB2YWx1ZSBpcyBhbgorICAvLyBpbXBsZW1lbnRhdGlvbiBkZWFsLiBGb3IgaW5zdGFuY2UgYWxsb2NhdGVkIHNwYWNlIGRlcGVuZHMgb24gZ3Jvd3RoCisgIC8vIHBvbGljaWVzLiBEbyBub3QgdXNlIHRoZXNlIGluIHVuaXQgdGVzdHMuCisgIC8vIFJldHVybnMgdGhlIHRvdGFsIHNwYWNlIGFsbG9jYXRlZCBieSB0aGUgYXJlbmEsIHdoaWNoIGlzIHRoZSBzdW0gb2YgdGhlCisgIC8vIHNpemVzIG9mIHRoZSB1bmRlcmx5aW5nIGJsb2Nrcy4KKyAgdWludDY0X3QgU3BhY2VBbGxvY2F0ZWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy5TcGFjZUFsbG9jYXRlZCgpOyB9CisgIC8vIFJldHVybnMgdGhlIHRvdGFsIHNwYWNlIHVzZWQgYnkgdGhlIGFyZW5hLiBTaW1pbGFyIHRvIFNwYWNlQWxsb2NhdGVkIGJ1dAorICAvLyBkb2VzIG5vdCBpbmNsdWRlIGZyZWUgc3BhY2UgYW5kIGJsb2NrIG92ZXJoZWFkLiBUaGUgdG90YWwgc3BhY2UgcmV0dXJuZWQKKyAgLy8gbWF5IG5vdCBpbmNsdWRlIHNwYWNlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcyBleGVjdXRpbmcgY29uY3VycmVudGx5IHdpdGgKKyAgLy8gdGhlIGNhbGwgdG8gdGhpcyBtZXRob2QuCisgIHVpbnQ2NF90IFNwYWNlVXNlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLlNwYWNlVXNlZCgpOyB9CisKKyAgLy8gRnJlZXMgYWxsIHN0b3JhZ2UgYWxsb2NhdGVkIGJ5IHRoaXMgYXJlbmEgYWZ0ZXIgY2FsbGluZyBkZXN0cnVjdG9ycworICAvLyByZWdpc3RlcmVkIHdpdGggT3duRGVzdHJ1Y3RvcigpIGFuZCBmcmVlaW5nIG9iamVjdHMgcmVnaXN0ZXJlZCB3aXRoIE93bigpLgorICAvLyBBbnkgb2JqZWN0cyBhbGxvY2F0ZWQgb24gdGhpcyBhcmVuYSBhcmUgdW51c2FibGUgYWZ0ZXIgdGhpcyBjYWxsLiBJdCBhbHNvCisgIC8vIHJldHVybnMgdGhlIHRvdGFsIHNwYWNlIHVzZWQgYnkgdGhlIGFyZW5hIHdoaWNoIGlzIHRoZSBzdW1zIG9mIHRoZSBzaXplcworICAvLyBvZiB0aGUgYWxsb2NhdGVkIGJsb2Nrcy4gVGhpcyBtZXRob2QgaXMgbm90IHRocmVhZC1zYWZlLgorICB1aW50NjRfdCBSZXNldCgpIHsgcmV0dXJuIGltcGxfLlJlc2V0KCk7IH0KKworICAvLyBBZGRzIHxvYmplY3R8IHRvIGEgbGlzdCBvZiBoZWFwLWFsbG9jYXRlZCBvYmplY3RzIHRvIGJlIGZyZWVkIHdpdGggfGRlbGV0ZXwKKyAgLy8gd2hlbiB0aGUgYXJlbmEgaXMgZGVzdHJveWVkIG9yIHJlc2V0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIE93bihUKiBvYmplY3QpIHsKKyAgICBPd25JbnRlcm5hbChvYmplY3QsIHN0ZDo6aXNfY29udmVydGlibGU8VCosIE1lc3NhZ2VMaXRlKj4oKSk7CisgIH0KKworICAvLyBBZGRzIHxvYmplY3R8IHRvIGEgbGlzdCBvZiBvYmplY3RzIHdob3NlIGRlc3RydWN0b3JzIHdpbGwgYmUgbWFudWFsbHkKKyAgLy8gY2FsbGVkIHdoZW4gdGhlIGFyZW5hIGlzIGRlc3Ryb3llZCBvciByZXNldC4gVGhpcyBkaWZmZXJzIGZyb20gT3duKCkgaW4KKyAgLy8gdGhhdCBpdCBkb2VzIG5vdCBmcmVlIHRoZSB1bmRlcmx5aW5nIG1lbW9yeSB3aXRoIHxkZWxldGV8OyBoZW5jZSwgaXQgaXMKKyAgLy8gbm9ybWFsbHkgb25seSB1c2VkIGZvciBvYmplY3RzIHRoYXQgYXJlIHBsYWNlbWVudC1uZXdlZCBpbnRvCisgIC8vIGFyZW5hLWFsbG9jYXRlZCBtZW1vcnkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgT3duRGVzdHJ1Y3RvcihUKiBvYmplY3QpIHsKKyAgICBpZiAob2JqZWN0ICE9IE5VTEwpIHsKKyAgICAgIGltcGxfLkFkZENsZWFudXAob2JqZWN0LCAmaW50ZXJuYWw6OmFyZW5hX2Rlc3RydWN0X29iamVjdDxUPik7CisgICAgfQorICB9CisKKyAgLy8gQWRkcyBhIGN1c3RvbSBtZW1iZXIgZnVuY3Rpb24gb24gYW4gb2JqZWN0IHRvIHRoZSBsaXN0IG9mIGRlc3RydWN0b3JzIHRoYXQKKyAgLy8gd2lsbCBiZSBtYW51YWxseSBjYWxsZWQgd2hlbiB0aGUgYXJlbmEgaXMgZGVzdHJveWVkIG9yIHJlc2V0LiBUaGlzIGRpZmZlcnMKKyAgLy8gZnJvbSBPd25EZXN0cnVjdG9yKCkgaW4gdGhhdCBhbnkgbWVtYmVyIGZ1bmN0aW9uIG1heSBiZSBzcGVjaWZpZWQsIG5vdCBvbmx5CisgIC8vIHRoZSBjbGFzcyBkZXN0cnVjdG9yLgorICBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgT3duQ3VzdG9tRGVzdHJ1Y3Rvcih2b2lkKiBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkZXN0cnVjdCkodm9pZCopKSB7CisgICAgaW1wbF8uQWRkQ2xlYW51cChvYmplY3QsIGRlc3RydWN0KTsKKyAgfQorCisgIC8vIFJldHJpZXZlcyB0aGUgYXJlbmEgYXNzb2NpYXRlZCB3aXRoIHx2YWx1ZXwgaWYgfHZhbHVlfCBpcyBhbiBhcmVuYS1jYXBhYmxlCisgIC8vIG1lc3NhZ2UsIG9yIE5VTEwgb3RoZXJ3aXNlLiBJZiBwb3NzaWJsZSwgdGhlIGNhbGwgcmVzb2x2ZXMgYXQgY29tcGlsZSB0aW1lLgorICAvLyBOb3RlIHRoYXQgd2UgY2FuIG9mdGVuIGRldmlydHVhbGl6ZSBjYWxscyB0byBgdmFsdWUtPkdldEFyZW5hKClgIHNvIHVzdWFsbHkKKyAgLy8gY2FsbGluZyB0aGlzIG1ldGhvZCBpcyB1bm5lY2Vzc2FyeS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgc3RhdGljIEFyZW5hKiBHZXRBcmVuYShjb25zdCBUKiB2YWx1ZSkgeworICAgIHJldHVybiBHZXRBcmVuYUludGVybmFsKHZhbHVlKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBjbGFzcyBJbnRlcm5hbEhlbHBlciB7CisgICBwcml2YXRlOgorICAgIC8vIFByb3ZpZGVzIGFjY2VzcyB0byBwcm90ZWN0ZWQgR2V0T3duaW5nQXJlbmEgdG8gZ2VuZXJhdGVkIG1lc3NhZ2VzLgorICAgIHN0YXRpYyBBcmVuYSogR2V0T3duaW5nQXJlbmEoY29uc3QgVCogcCkgeyByZXR1cm4gcC0+R2V0T3duaW5nQXJlbmEoKTsgfQorCisgICAgc3RhdGljIHZvaWQgSW50ZXJuYWxTd2FwKFQqIGEsIFQqIGIpIHsgYS0+SW50ZXJuYWxTd2FwKGIpOyB9CisKKyAgICBzdGF0aWMgQXJlbmEqIEdldEFyZW5hRm9yQWxsb2NhdGlvbkludGVybmFsKAorICAgICAgICBjb25zdCBUKiBwLCBzdGQ6OnRydWVfdHlwZSAvKmlzX2Rlcml2ZWRfZnJvbTxNZXNzYWdlTGl0ZT4qLykgeworICAgICAgcmV0dXJuIHAtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICAgIH0KKworICAgIHN0YXRpYyBBcmVuYSogR2V0QXJlbmFGb3JBbGxvY2F0aW9uSW50ZXJuYWwoCisgICAgICAgIGNvbnN0IFQqIHAsIHN0ZDo6ZmFsc2VfdHlwZSAvKmlzX2Rlcml2ZWRfZnJvbTxNZXNzYWdlTGl0ZT4qLykgeworICAgICAgcmV0dXJuIEdldEFyZW5hRm9yQWxsb2NhdGlvbkZvck5vbk1lc3NhZ2UoCisgICAgICAgICAgcCwgdHlwZW5hbWUgaXNfYXJlbmFfY29uc3RydWN0YWJsZTo6dHlwZSgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJlbmEqIEdldEFyZW5hRm9yQWxsb2NhdGlvbkZvck5vbk1lc3NhZ2UoCisgICAgICAgIGNvbnN0IFQqIHAsIHN0ZDo6dHJ1ZV90eXBlIC8qaXNfYXJlbmFfY29uc3RydWN0aWJsZSovKSB7CisgICAgICByZXR1cm4gcC0+R2V0QXJlbmEoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJlbmEqIEdldEFyZW5hRm9yQWxsb2NhdGlvbkZvck5vbk1lc3NhZ2UoCisgICAgICAgIGNvbnN0IFQqIHAsIHN0ZDo6ZmFsc2VfdHlwZSAvKmlzX2FyZW5hX2NvbnN0cnVjdGlibGUqLykgeworICAgICAgcmV0dXJuIEdldEFyZW5hRm9yQWxsb2NhdGlvbkZvck5vbk1lc3NhZ2VOb25BcmVuYUNvbnN0cnVjdGlibGUoCisgICAgICAgICAgcCwgdHlwZW5hbWUgaGFzX2dldF9hcmVuYTo6dHlwZSgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJlbmEqIEdldEFyZW5hRm9yQWxsb2NhdGlvbkZvck5vbk1lc3NhZ2VOb25BcmVuYUNvbnN0cnVjdGlibGUoCisgICAgICAgIGNvbnN0IFQqIHAsIHN0ZDo6dHJ1ZV90eXBlIC8qaGFzX2dldF9hcmVuYSovKSB7CisgICAgICByZXR1cm4gcC0+R2V0QXJlbmEoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJlbmEqIEdldEFyZW5hRm9yQWxsb2NhdGlvbkZvck5vbk1lc3NhZ2VOb25BcmVuYUNvbnN0cnVjdGlibGUoCisgICAgICAgIGNvbnN0IFQqIC8qIHAgKi8sIHN0ZDo6ZmFsc2VfdHlwZSAvKmhhc19nZXRfYXJlbmEqLykgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgICAgc3RhdGljIGNoYXIgRGVzdHJ1Y3RvclNraXBwYWJsZShjb25zdCB0eXBlbmFtZSBVOjpEZXN0cnVjdG9yU2tpcHBhYmxlXyopOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICAgIHN0YXRpYyBkb3VibGUgRGVzdHJ1Y3RvclNraXBwYWJsZSguLi4pOworCisgICAgdHlwZWRlZiBzdGQ6OmludGVncmFsX2NvbnN0YW50PAorICAgICAgICBib29sLCBzaXplb2YoRGVzdHJ1Y3RvclNraXBwYWJsZTxUPihzdGF0aWNfY2FzdDxjb25zdCBUKj4oMCkpKSA9PQorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFyKSB8fAorICAgICAgICAgICAgICAgICAgc3RkOjppc190cml2aWFsbHlfZGVzdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZT4KKyAgICAgICAgaXNfZGVzdHJ1Y3Rvcl9za2lwcGFibGU7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgICBzdGF0aWMgY2hhciBBcmVuYUNvbnN0cnVjdGFibGUoCisgICAgICAgIGNvbnN0IHR5cGVuYW1lIFU6OkludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXyopOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICAgIHN0YXRpYyBkb3VibGUgQXJlbmFDb25zdHJ1Y3RhYmxlKC4uLik7CisKKyAgICB0eXBlZGVmIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgc2l6ZW9mKEFyZW5hQ29uc3RydWN0YWJsZTxUPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IFQqPigwKSkpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2hhcik+CisgICAgICAgIGlzX2FyZW5hX2NvbnN0cnVjdGFibGU7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVSwKKyAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8QXJlbmEqLCBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8Y29uc3QgVT4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5HZXRBcmVuYSgpKT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgaW50Pjo6dHlwZSA9IDA+CisgICAgc3RhdGljIGNoYXIgSGFzR2V0QXJlbmEoZGVjbHR5cGUoJlU6OkdldEFyZW5hKSk7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgICAgc3RhdGljIGRvdWJsZSBIYXNHZXRBcmVuYSguLi4pOworCisgICAgdHlwZWRlZiBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIHNpemVvZihIYXNHZXRBcmVuYTxUPihudWxscHRyKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFyKT4KKyAgICAgICAgaGFzX2dldF9hcmVuYTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgorICAgIHN0YXRpYyBUKiBDb25zdHJ1Y3Qodm9pZCogcHRyLCBBcmdzJiYuLi4gYXJncykgeworICAgICAgcmV0dXJuIG5ldyAocHRyKSBUKHN0YXRpY19jYXN0PEFyZ3MmJj4oYXJncykuLi4pOworICAgIH0KKworICAgIHN0YXRpYyBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSBUKiBOZXcoKSB7CisgICAgICByZXR1cm4gbmV3IFQobnVsbHB0cik7CisgICAgfQorCisgICAgc3RhdGljIEFyZW5hKiBHZXRBcmVuYShjb25zdCBUKiBwKSB7IHJldHVybiBwLT5HZXRBcmVuYSgpOyB9CisKKyAgICBmcmllbmQgY2xhc3MgQXJlbmE7CisgICAgZnJpZW5kIGNsYXNzIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOworICB9OworCisgIC8vIFByb3ZpZGVzIGFjY2VzcyB0byBwcm90ZWN0ZWQgR2V0T3duaW5nQXJlbmEgdG8gZ2VuZXJhdGVkIG1lc3NhZ2VzLiAgRm9yCisgIC8vIGludGVybmFsIHVzZSBvbmx5LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIEFyZW5hKiBJbnRlcm5hbEdldE93bmluZ0FyZW5hKGNvbnN0IFQqIHApIHsKKyAgICByZXR1cm4gSW50ZXJuYWxIZWxwZXI8VD46OkdldE93bmluZ0FyZW5hKHApOworICB9CisKKyAgLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHByb3RlY3RlZCBHZXRBcmVuYUZvckFsbG9jYXRpb24gdG8gZ2VuZXJhdGVkIG1lc3NhZ2VzLgorICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgQXJlbmEqIEludGVybmFsR2V0QXJlbmFGb3JBbGxvY2F0aW9uKGNvbnN0IFQqIHApIHsKKyAgICByZXR1cm4gSW50ZXJuYWxIZWxwZXI8VD46OkdldEFyZW5hRm9yQWxsb2NhdGlvbkludGVybmFsKAorICAgICAgICBwLCBzdGQ6OmlzX2NvbnZlcnRpYmxlPFQqLCBNZXNzYWdlTGl0ZSo+KCkpOworICB9CisKKyAgLy8gQ3JlYXRlcyBtZXNzYWdlLW93bmVkIGFyZW5hLiAgRm9yIGludGVybmFsIHVzZSBvbmx5LgorICBzdGF0aWMgQXJlbmEqIEludGVybmFsQ3JlYXRlTWVzc2FnZU93bmVkQXJlbmEoKSB7CisgICAgcmV0dXJuIG5ldyBBcmVuYShpbnRlcm5hbDo6TWVzc2FnZU93bmVke30pOworICB9CisKKyAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhpcyBhcmVuYSBpcyBtZXNzYWdlLW93bmVkLiAgRm9yIGludGVybmFsIHVzZSBvbmx5LgorICBib29sIEludGVybmFsSXNNZXNzYWdlT3duZWRBcmVuYSgpIHsgcmV0dXJuIElzTWVzc2FnZU93bmVkKCk7IH0KKworICAvLyBIZWxwZXIgdHlwZXRyYWl0cyB0aGF0IGluZGljYXRlcyBzdXBwb3J0IGZvciBhcmVuYXMgaW4gYSB0eXBlIFQgYXQgY29tcGlsZQorICAvLyB0aW1lLiBUaGlzIGlzIHB1YmxpYyBvbmx5IHRvIGFsbG93IGNvbnN0cnVjdGlvbiBvZiBoaWdoZXItbGV2ZWwgdGVtcGxhdGVkCisgIC8vIHV0aWxpdGllcy4KKyAgLy8KKyAgLy8gaXNfYXJlbmFfY29uc3RydWN0YWJsZTxUPjo6dmFsdWUgaXMgdHJ1ZSBpZiB0aGUgbWVzc2FnZSB0eXBlIFQgaGFzIGFyZW5hCisgIC8vIHN1cHBvcnQgZW5hYmxlZCwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgLy8KKyAgLy8gaXNfZGVzdHJ1Y3Rvcl9za2lwcGFibGU8VD46OnZhbHVlIGlzIHRydWUgaWYgdGhlIG1lc3NhZ2UgdHlwZSBUIGhhcyB0b2xkCisgIC8vIHRoZSBhcmVuYSB0aGF0IGl0IGlzIHNhZmUgdG8gc2tpcCB0aGUgZGVzdHJ1Y3RvciwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgLy8KKyAgLy8gVGhpcyBpcyBpbnNpZGUgQXJlbmEgYmVjYXVzZSBvbmx5IEFyZW5hIGhhcyB0aGUgZnJpZW5kIHJlbGF0aW9uc2hpcHMKKyAgLy8gbmVjZXNzYXJ5IHRvIHNlZSB0aGUgdW5kZXJseWluZyBnZW5lcmF0ZWQgY29kZSB0cmFpdHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgaXNfYXJlbmFfY29uc3RydWN0YWJsZSA6IEludGVybmFsSGVscGVyPFQ+Ojppc19hcmVuYV9jb25zdHJ1Y3RhYmxlIHt9OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RydWN0IGlzX2Rlc3RydWN0b3Jfc2tpcHBhYmxlIDogSW50ZXJuYWxIZWxwZXI8VD46OmlzX2Rlc3RydWN0b3Jfc2tpcHBhYmxlIHsKKyAgfTsKKworIHByaXZhdGU6CisgIGludGVybmFsOjpUaHJlYWRTYWZlQXJlbmEgaW1wbF87CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBoYXNfZ2V0X2FyZW5hIDogSW50ZXJuYWxIZWxwZXI8VD46Omhhc19nZXRfYXJlbmEge307CisKKyAgLy8gQ29uc3RydWN0b3Igc29sZWx5IHVzZWQgYnkgbWVzc2FnZS1vd25lZCBhcmVuYS4KKyAgaW5saW5lIEFyZW5hKGludGVybmFsOjpNZXNzYWdlT3duZWQpIDogaW1wbF8oaW50ZXJuYWw6Ok1lc3NhZ2VPd25lZHt9KSB7fQorCisgIC8vIENoZWNrcyB3aGV0aGVyIHRoaXMgYXJlbmEgaXMgbWVzc2FnZS1vd25lZC4KKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSBib29sIElzTWVzc2FnZU93bmVkKCkgY29uc3QgeworICAgIHJldHVybiBpbXBsXy5Jc01lc3NhZ2VPd25lZCgpOworICB9CisKKyAgdm9pZCBSZXR1cm5BcnJheU1lbW9yeSh2b2lkKiBwLCBzaXplX3Qgc2l6ZSkgeworICAgIGltcGxfLlJldHVybkFycmF5TWVtb3J5KHAsIHNpemUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIFQqIENyZWF0ZU1lc3NhZ2VJbnRlcm5hbChBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzJiYuLi4gYXJncykgeworICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgIEludGVybmFsSGVscGVyPFQ+Ojppc19hcmVuYV9jb25zdHJ1Y3RhYmxlOjp2YWx1ZSwKKyAgICAgICAgIkNyZWF0ZU1lc3NhZ2UgY2FuIG9ubHkgY29uc3RydWN0IHR5cGVzIHRoYXQgYXJlIEFyZW5hQ29uc3RydWN0YWJsZSIpOworICAgIGlmIChhcmVuYSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gbmV3IFQobnVsbHB0ciwgc3RhdGljX2Nhc3Q8QXJncyYmPihhcmdzKS4uLik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBhcmVuYS0+RG9DcmVhdGVNZXNzYWdlPFQ+KHN0YXRpY19jYXN0PEFyZ3MmJj4oYXJncykuLi4pOworICAgIH0KKyAgfQorCisgIC8vIFRoaXMgc3BlY2lhbGl6YXRpb24gZm9yIG5vIGFyZ3VtZW50cyBpcyBuZWNlc3NhcnksIGJlY2F1c2UgaXRzIGJlaGF2aW9yIGlzCisgIC8vIHNsaWdodGx5IGRpZmZlcmVudC4gIFdoZW4gdGhlIGFyZW5hIHBvaW50ZXIgaXMgbnVsbHB0ciwgaXQgY2FsbHMgVCgpCisgIC8vIGluc3RlYWQgb2YgVChudWxscHRyKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIFQqIENyZWF0ZU1lc3NhZ2VJbnRlcm5hbChBcmVuYSogYXJlbmEpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBJbnRlcm5hbEhlbHBlcjxUPjo6aXNfYXJlbmFfY29uc3RydWN0YWJsZTo6dmFsdWUsCisgICAgICAgICJDcmVhdGVNZXNzYWdlIGNhbiBvbmx5IGNvbnN0cnVjdCB0eXBlcyB0aGF0IGFyZSBBcmVuYUNvbnN0cnVjdGFibGUiKTsKKyAgICBpZiAoYXJlbmEgPT0gTlVMTCkgeworICAgICAgLy8gR2VuZXJhdGVkIGFyZW5hIGNvbnN0cnVjdG9yIFQoQXJlbmEqKSBpcyBwcm90ZWN0ZWQuIENhbGwgdmlhCisgICAgICAvLyBJbnRlcm5hbEhlbHBlci4KKyAgICAgIHJldHVybiBJbnRlcm5hbEhlbHBlcjxUPjo6TmV3KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBhcmVuYS0+RG9DcmVhdGVNZXNzYWdlPFQ+KCk7CisgICAgfQorICB9CisKKyAgLy8gQWxsb2NhdGUgYW5kIGFsc28gb3B0aW9uYWxseSBjYWxsIGNvbGxlY3RvciB3aXRoIHRoZSBhbGxvY2F0ZWQgdHlwZSBpbmZvCisgIC8vIHdoZW4gYWxsb2NhdGlvbiByZWNvcmRpbmcgaXMgZW5hYmxlZC4KKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSB2b2lkKiBBbGxvY2F0ZUludGVybmFsKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZGVzdHJ1Y3Rvcikodm9pZCopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp0eXBlX2luZm8qIHR5cGUpIHsKKyAgICAvLyBNb25pdG9yIGFsbG9jYXRpb24gaWYgbmVlZGVkLgorICAgIGlmIChkZXN0cnVjdG9yID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBBbGxvY2F0ZUFsaWduZWRXaXRoSG9vayhzaXplLCBhbGlnbiwgdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChhbGlnbiA8PSA4KSB7CisgICAgICAgIGF1dG8gcmVzID0gQWxsb2NhdGVBbGlnbmVkV2l0aENsZWFudXAoaW50ZXJuYWw6OkFsaWduVXBUbzgoc2l6ZSksIHR5cGUpOworICAgICAgICByZXMuc2Vjb25kLT5lbGVtID0gcmVzLmZpcnN0OworICAgICAgICByZXMuc2Vjb25kLT5jbGVhbnVwID0gZGVzdHJ1Y3RvcjsKKyAgICAgICAgcmV0dXJuIHJlcy5maXJzdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGF1dG8gcmVzID0gQWxsb2NhdGVBbGlnbmVkV2l0aENsZWFudXAoc2l6ZSArIGFsaWduIC0gOCwgdHlwZSk7CisgICAgICAgIGF1dG8gcHRyID0gaW50ZXJuYWw6OkFsaWduVG8ocmVzLmZpcnN0LCBhbGlnbik7CisgICAgICAgIHJlcy5zZWNvbmQtPmVsZW0gPSBwdHI7CisgICAgICAgIHJlcy5zZWNvbmQtPmNsZWFudXAgPSBkZXN0cnVjdG9yOworICAgICAgICByZXR1cm4gcHRyOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENyZWF0ZU1lc3NhZ2U8VD4gcmVxdWlyZXMgdGhhdCBUIHN1cHBvcnRzIGFyZW5hcywgYnV0IHRoaXMgcHJpdmF0ZSBtZXRob2QKKyAgLy8gd29ya3Mgd2hldGhlciBvciBub3QgVCBzdXBwb3J0cyBhcmVuYXMuIFRoZXNlIGFyZSBub3QgZXhwb3NlZCB0byB1c2VyIGNvZGUKKyAgLy8gYXMgaXQgY2FuIGNhdXNlIGNvbmZ1c2luZyBBUEkgdXNhZ2VzLCBhbmQgZW5kIHVwIGhhdmluZyBkb3VibGUgZnJlZSBpbgorICAvLyB1c2VyIGNvZGUuIFRoZXNlIGFyZSB1c2VkIG9ubHkgaW50ZXJuYWxseSBmcm9tIExhenlGaWVsZCBhbmQgUmVwZWF0ZWQKKyAgLy8gZmllbGRzLCBzaW5jZSB0aGV5IGFyZSBkZXNpZ25lZCB0byB3b3JrIGluIGFsbCBtb2RlIGNvbWJpbmF0aW9ucy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1zZywgdHlwZW5hbWUuLi4gQXJncz4KKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSBzdGF0aWMgTXNnKiBEb0NyZWF0ZU1heWJlTWVzc2FnZShBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0cnVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncyYmLi4uIGFyZ3MpIHsKKyAgICByZXR1cm4gQ3JlYXRlTWVzc2FnZUludGVybmFsPE1zZz4oYXJlbmEsIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSBzdGF0aWMgVCogRG9DcmVhdGVNYXliZU1lc3NhZ2UoQXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZhbHNlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MmJi4uLiBhcmdzKSB7CisgICAgcmV0dXJuIENyZWF0ZTxUPihhcmVuYSwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHN0YXRpYyBUKiBDcmVhdGVNYXliZU1lc3NhZ2UoQXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncyYmLi4uIGFyZ3MpIHsKKyAgICByZXR1cm4gRG9DcmVhdGVNYXliZU1lc3NhZ2U8VD4oYXJlbmEsIGlzX2FyZW5hX2NvbnN0cnVjdGFibGU8VD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgfQorCisgIC8vIEp1c3QgYWxsb2NhdGUgdGhlIHJlcXVpcmVkIHNpemUgZm9yIHRoZSBnaXZlbiB0eXBlIGFzc3VtaW5nIHRoZQorICAvLyB0eXBlIGhhcyBhIHRyaXZpYWwgY29uc3RydWN0b3IuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIFQqIENyZWF0ZUludGVybmFsUmF3QXJyYXkoc2l6ZV90IG51bV9lbGVtZW50cykgeworICAgIEdPT0dMRV9DSEVDS19MRShudW1fZWxlbWVudHMsIHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkgLyBzaXplb2YoVCkpCisgICAgICAgIDw8ICJSZXF1ZXN0ZWQgc2l6ZSBpcyB0b28gbGFyZ2UgdG8gZml0IGludG8gc2l6ZV90LiI7CisgICAgLy8gV2UgY291bnQgb24gY29tcGlsZXIgdG8gcmVhbGl6ZSB0aGF0IGlmIHNpemVvZihUKSBpcyBhIG11bHRpcGxlIG9mCisgICAgLy8gOCBBbGlnblVwVG8gY2FuIGJlIGVsaWRlZC4KKyAgICBjb25zdCBzaXplX3QgbiA9IHNpemVvZihUKSAqIG51bV9lbGVtZW50czsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KAorICAgICAgICBBbGxvY2F0ZUFsaWduZWRXaXRoSG9va0ZvckFycmF5KG4sIGFsaWdub2YoVCksIFJUVElfVFlQRV9JRChUKSkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgVCogRG9DcmVhdGVNZXNzYWdlKEFyZ3MmJi4uLiBhcmdzKSB7CisgICAgcmV0dXJuIEludGVybmFsSGVscGVyPFQ+OjpDb25zdHJ1Y3QoCisgICAgICAgIEFsbG9jYXRlSW50ZXJuYWwoc2l6ZW9mKFQpLCBhbGlnbm9mKFQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpPYmplY3REZXN0cnVjdG9yPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbEhlbHBlcjxUPjo6aXNfZGVzdHJ1Y3Rvcl9za2lwcGFibGU6OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUPjo6ZGVzdHJ1Y3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSVFRJX1RZUEVfSUQoVCkpLAorICAgICAgICB0aGlzLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICB9CisKKyAgLy8gQ3JlYXRlSW5BcmVuYVN0b3JhZ2UgaXMgdXNlZCB0byBpbXBsZW1lbnQgbWFwIGZpZWxkLiBXaXRob3V0IGl0LAorICAvLyBNYXAgbmVlZCB0byBjYWxsIGdlbmVyYXRlZCBtZXNzYWdlJ3MgcHJvdGVjdGVkIGFyZW5hIGNvbnN0cnVjdG9yLAorICAvLyB3aGljaCBuZWVkcyB0byBkZWNsYXJlIE1hcCBhcyBmcmllbmQgb2YgZ2VuZXJhdGVkIG1lc3NhZ2UuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBzdGF0aWMgdm9pZCBDcmVhdGVJbkFyZW5hU3RvcmFnZShUKiBwdHIsIEFyZW5hKiBhcmVuYSwgQXJncyYmLi4uIGFyZ3MpIHsKKyAgICBDcmVhdGVJbkFyZW5hU3RvcmFnZUludGVybmFsKHB0ciwgYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpc19hcmVuYV9jb25zdHJ1Y3RhYmxlPFQ+Ojp0eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICAgIGlmIChhcmVuYSAhPSBudWxscHRyKSB7CisgICAgICBSZWdpc3RlckRlc3RydWN0b3JJbnRlcm5hbCgKKyAgICAgICAgICBwdHIsIGFyZW5hLAorICAgICAgICAgIHR5cGVuYW1lIEludGVybmFsSGVscGVyPFQ+Ojppc19kZXN0cnVjdG9yX3NraXBwYWJsZTo6dHlwZSgpKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgc3RhdGljIHZvaWQgQ3JlYXRlSW5BcmVuYVN0b3JhZ2VJbnRlcm5hbChUKiBwdHIsIEFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRydWVfdHlwZSwgQXJncyYmLi4uIGFyZ3MpIHsKKyAgICBJbnRlcm5hbEhlbHBlcjxUPjo6Q29uc3RydWN0KHB0ciwgYXJlbmEsIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CisgIHN0YXRpYyB2b2lkIENyZWF0ZUluQXJlbmFTdG9yYWdlSW50ZXJuYWwoVCogcHRyLCBBcmVuYSogLyogYXJlbmEgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmYWxzZV90eXBlLCBBcmdzJiYuLi4gYXJncykgeworICAgIG5ldyAocHRyKSBUKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJEZXN0cnVjdG9ySW50ZXJuYWwoVCogLyogcHRyICovLCBBcmVuYSogLyogYXJlbmEgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dHJ1ZV90eXBlKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJEZXN0cnVjdG9ySW50ZXJuYWwoVCogcHRyLCBBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZmFsc2VfdHlwZSkgeworICAgIGFyZW5hLT5Pd25EZXN0cnVjdG9yKHB0cik7CisgIH0KKworICAvLyBUaGVzZSBpbXBsZW1lbnQgQ3JlYXRlKCkuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGhhcyB0eXBlICd0cnVlX3R5cGUnIGlmIFQgaXMKKyAgLy8gYSBzdWJ0eXBlIG9mIE1lc3NhZ2UgYW5kICdmYWxzZV90eXBlJyBvdGhlcndpc2UuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHN0YXRpYyBUKiBDcmVhdGVJbnRlcm5hbChBcmVuYSogYXJlbmEsIHN0ZDo6dHJ1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzJiYuLi4gYXJncykgeworICAgIGlmIChhcmVuYSA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gbmV3IFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICB9IGVsc2UgeworICAgICAgYXV0byBkZXN0cnVjdG9yID0KKyAgICAgICAgICBpbnRlcm5hbDo6T2JqZWN0RGVzdHJ1Y3RvcjxzdGQ6OmlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGU8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQ+OjpkZXN0cnVjdG9yOworICAgICAgVCogcmVzdWx0ID0KKyAgICAgICAgICBuZXcgKGFyZW5hLT5BbGxvY2F0ZUludGVybmFsKHNpemVvZihUKSwgYWxpZ25vZihUKSwgZGVzdHJ1Y3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUVElfVFlQRV9JRChUKSkpCisgICAgICAgICAgVChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CisgIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgc3RhdGljIFQqIENyZWF0ZUludGVybmFsKEFyZW5hKiBhcmVuYSwgc3RkOjpmYWxzZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzJiYuLi4gYXJncykgeworICAgIGlmIChhcmVuYSA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gbmV3IFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICB9IGVsc2UgeworICAgICAgYXV0byBkZXN0cnVjdG9yID0KKyAgICAgICAgICBpbnRlcm5hbDo6T2JqZWN0RGVzdHJ1Y3RvcjxzdGQ6OmlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGU8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQ+OjpkZXN0cnVjdG9yOworICAgICAgcmV0dXJuIG5ldyAoYXJlbmEtPkFsbG9jYXRlSW50ZXJuYWwoc2l6ZW9mKFQpLCBhbGlnbm9mKFQpLCBkZXN0cnVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRUSV9UWVBFX0lEKFQpKSkKKyAgICAgICAgICBUKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgfQorICB9CisKKyAgLy8gVGhlc2UgaW1wbGVtZW50IE93bigpLCB3aGljaCByZWdpc3RlcnMgYW4gb2JqZWN0IGZvciBkZWxldGlvbiAoZGVzdHJ1Y3RvcgorICAvLyBjYWxsIGFuZCBvcGVyYXRvciBkZWxldGUoKSkuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGhhcyB0eXBlICd0cnVlX3R5cGUnIGlmIFQKKyAgLy8gaXMgYSBzdWJ0eXBlIG9mIE1lc3NhZ2UgYW5kICdmYWxzZV90eXBlJyBvdGhlcndpc2UuIENvbGxhcHNpbmcKKyAgLy8gYWxsIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zIHRvIG9uZSBmb3IgZ2VuZXJpYyBNZXNzYWdlIHJlZHVjZXMgY29kZSBzaXplLAorICAvLyB1c2luZyB0aGUgdmlydHVhbCBkZXN0cnVjdG9yIGluc3RlYWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgT3duSW50ZXJuYWwoVCogb2JqZWN0LCBzdGQ6OnRydWVfdHlwZSkgeworICAgIGlmIChvYmplY3QgIT0gTlVMTCkgeworICAgICAgaW1wbF8uQWRkQ2xlYW51cChvYmplY3QsICZpbnRlcm5hbDo6YXJlbmFfZGVsZXRlX29iamVjdDxNZXNzYWdlTGl0ZT4pOworICAgIH0KKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIE93bkludGVybmFsKFQqIG9iamVjdCwgc3RkOjpmYWxzZV90eXBlKSB7CisgICAgaWYgKG9iamVjdCAhPSBOVUxMKSB7CisgICAgICBpbXBsXy5BZGRDbGVhbnVwKG9iamVjdCwgJmludGVybmFsOjphcmVuYV9kZWxldGVfb2JqZWN0PFQ+KTsKKyAgICB9CisgIH0KKworICAvLyBJbXBsZW1lbnRhdGlvbiBmb3IgR2V0QXJlbmEoKS4gT25seSBtZXNzYWdlIG9iamVjdHMgd2l0aAorICAvLyBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV8gdGFncyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGFuIGFyZW5hLCBhbmQgc3VjaAorICAvLyBvYmplY3RzIG11c3QgaW1wbGVtZW50IGEgR2V0QXJlbmEoKSBtZXRob2QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19hcmVuYV9jb25zdHJ1Y3RhYmxlPFQ+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+CisgIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgc3RhdGljIEFyZW5hKiBHZXRBcmVuYUludGVybmFsKGNvbnN0IFQqIHZhbHVlKSB7CisgICAgcmV0dXJuIEludGVybmFsSGVscGVyPFQ+OjpHZXRBcmVuYSh2YWx1ZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsCisgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhaXNfYXJlbmFfY29uc3RydWN0YWJsZTxUPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfZ2V0X2FyZW5hPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludD46OnR5cGUgPSAwPgorICBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHN0YXRpYyBBcmVuYSogR2V0QXJlbmFJbnRlcm5hbChjb25zdCBUKiB2YWx1ZSkgeworICAgIHJldHVybiB2YWx1ZS0+R2V0QXJlbmEoKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFpc19hcmVuYV9jb25zdHJ1Y3RhYmxlPFQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNfZ2V0X2FyZW5hPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludD46OnR5cGUgPSAwPgorICBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHN0YXRpYyBBcmVuYSogR2V0QXJlbmFJbnRlcm5hbChjb25zdCBUKiB2YWx1ZSkgeworICAgICh2b2lkKXZhbHVlOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgc3RhdGljIEFyZW5hKiBHZXRPd25pbmdBcmVuYShjb25zdCBUKiB2YWx1ZSkgeworICAgIHJldHVybiBHZXRPd25pbmdBcmVuYUludGVybmFsKAorICAgICAgICB2YWx1ZSwgc3RkOjppc19jb252ZXJ0aWJsZTxUKiwgTWVzc2FnZUxpdGUqPigpKTsKKyAgfQorCisgIC8vIEltcGxlbWVudGF0aW9uIGZvciBHZXRPd25pbmdBcmVuYSgpLiBBbGwgYW5kIG9ubHkgbWVzc2FnZSBvYmplY3RzIGhhdmUKKyAgLy8gR2V0T3duaW5nQXJlbmEoKSBtZXRob2QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHN0YXRpYyBBcmVuYSogR2V0T3duaW5nQXJlbmFJbnRlcm5hbCgKKyAgICAgIGNvbnN0IFQqIHZhbHVlLCBzdGQ6OnRydWVfdHlwZSkgeworICAgIHJldHVybiBJbnRlcm5hbEhlbHBlcjxUPjo6R2V0T3duaW5nQXJlbmEodmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHN0YXRpYyBBcmVuYSogR2V0T3duaW5nQXJlbmFJbnRlcm5hbCgKKyAgICAgIGNvbnN0IFQqIC8qIHZhbHVlICovLCBzdGQ6OmZhbHNlX3R5cGUpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHZvaWQqIEFsbG9jYXRlQWxpZ25lZFdpdGhIb29rRm9yQXJyYXkoc2l6ZV90IG4sIHNpemVfdCBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnR5cGVfaW5mbyogdHlwZSkgeworICAgIGlmIChhbGlnbiA8PSA4KSB7CisgICAgICByZXR1cm4gQWxsb2NhdGVBbGlnbmVkV2l0aEhvb2tGb3JBcnJheShpbnRlcm5hbDo6QWxpZ25VcFRvOChuKSwgdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdlIGFyZSB3YXN0aW5nIHNwYWNlIGJ5IG92ZXIgYWxsb2NhdGluZyBhbGlnbiAtIDggYnl0ZXMuIENvbXBhcmVkCisgICAgICAvLyB0byBhIGRlZGljYXRlZCBmdW5jdGlvbiB0aGF0IHRha2VzIGN1cnJlbnQgYWxpZ25tZW50IGluIGNvbnNpZGVyYXRpb24uCisgICAgICAvLyBTdWNoIGEgc2NoZW1lIHdvdWxkIG9ubHkgd2FzdGUgKGFsaWduIC0gOCkvMiBieXRlcyBvbiBhdmVyYWdlLCBidXQKKyAgICAgIC8vIHJlcXVpcmVzIGEgZGVkaWNhdGVkIGZ1bmN0aW9uIGluIHRoZSBvdXRsaW5lIGFyZW5hIGFsbG9jYXRpb24KKyAgICAgIC8vIGZ1bmN0aW9ucy4gUG9zc2libHkgcmUtZXZhbHVhdGUgdHJhZGVvZmZzIGxhdGVyLgorICAgICAgcmV0dXJuIGludGVybmFsOjpBbGlnblRvKAorICAgICAgICAgIEFsbG9jYXRlQWxpZ25lZFdpdGhIb29rRm9yQXJyYXkobiArIGFsaWduIC0gOCwgdHlwZSksIGFsaWduKTsKKyAgICB9CisgIH0KKworICB2b2lkKiBBbGxvY2F0ZUFsaWduZWRXaXRoSG9vayhzaXplX3Qgbiwgc2l6ZV90IGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnR5cGVfaW5mbyogdHlwZSkgeworICAgIGlmIChhbGlnbiA8PSA4KSB7CisgICAgICByZXR1cm4gQWxsb2NhdGVBbGlnbmVkV2l0aEhvb2soaW50ZXJuYWw6OkFsaWduVXBUbzgobiksIHR5cGUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSBhcmUgd2FzdGluZyBzcGFjZSBieSBvdmVyIGFsbG9jYXRpbmcgYWxpZ24gLSA4IGJ5dGVzLiBDb21wYXJlZAorICAgICAgLy8gdG8gYSBkZWRpY2F0ZWQgZnVuY3Rpb24gdGhhdCB0YWtlcyBjdXJyZW50IGFsaWdubWVudCBpbiBjb25zaWRlcmF0aW9uLgorICAgICAgLy8gU3VjaCBhIHNjaGVtZSB3b3VsZCBvbmx5IHdhc3RlIChhbGlnbiAtIDgpLzIgYnl0ZXMgb24gYXZlcmFnZSwgYnV0CisgICAgICAvLyByZXF1aXJlcyBhIGRlZGljYXRlZCBmdW5jdGlvbiBpbiB0aGUgb3V0bGluZSBhcmVuYSBhbGxvY2F0aW9uCisgICAgICAvLyBmdW5jdGlvbnMuIFBvc3NpYmx5IHJlLWV2YWx1YXRlIHRyYWRlb2ZmcyBsYXRlci4KKyAgICAgIHJldHVybiBpbnRlcm5hbDo6QWxpZ25UbyhBbGxvY2F0ZUFsaWduZWRXaXRoSG9vayhuICsgYWxpZ24gLSA4LCB0eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbik7CisgICAgfQorICB9CisKKyAgdm9pZCogQWxsb2NhdGVBbGlnbmVkTm9Ib29rKHNpemVfdCBuKTsKKyAgdm9pZCogQWxsb2NhdGVBbGlnbmVkV2l0aEhvb2soc2l6ZV90IG4sIGNvbnN0IHN0ZDo6dHlwZV9pbmZvKiB0eXBlKTsKKyAgdm9pZCogQWxsb2NhdGVBbGlnbmVkV2l0aEhvb2tGb3JBcnJheShzaXplX3QgbiwgY29uc3Qgc3RkOjp0eXBlX2luZm8qIHR5cGUpOworICBzdGQ6OnBhaXI8dm9pZCosIGludGVybmFsOjpTZXJpYWxBcmVuYTo6Q2xlYW51cE5vZGUqPgorICBBbGxvY2F0ZUFsaWduZWRXaXRoQ2xlYW51cChzaXplX3QgbiwgY29uc3Qgc3RkOjp0eXBlX2luZm8qIHR5cGUpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkdlbmVyaWNUeXBlSGFuZGxlcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhOyAgLy8gRm9yIHVzZXJfYXJlbmEoKS4KKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpMYXp5RmllbGQ7ICAgICAgICAvLyBGb3IgQ3JlYXRlTWF5YmVNZXNzYWdlLgorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkVwc0NvcHlJbnB1dFN0cmVhbTsgIC8vIEZvciBwYXJzZXIgcGVyZm9ybWFuY2UKKyAgZnJpZW5kIGNsYXNzIE1lc3NhZ2VMaXRlOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBUPgorICBmcmllbmQgY2xhc3MgTWFwOworICB0ZW1wbGF0ZSA8dHlwZW5hbWU+CisgIGZyaWVuZCBjbGFzcyBSZXBlYXRlZEZpZWxkOyAgICAgICAgICAgICAgICAgICAvLyBGb3IgUmV0dXJuQXJyYXlNZW1vcnkKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpSZXBlYXRlZFB0ckZpZWxkQmFzZTsgIC8vIEZvciBSZXR1cm5BcnJheU1lbW9yeQorICBmcmllbmQgc3RydWN0IGludGVybmFsOjpBcmVuYVRlc3RQZWVyOworfTsKKworLy8gRGVmaW5lZCBhYm92ZSBmb3Igc3VwcG9ydGluZyBlbnZpcm9ubWVudHMgd2l0aG91dCBSVFRJLgorI3VuZGVmIFJUVElfVFlQRV9JRAorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQVJFTkFfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX2ltcGwuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NzI3NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX2ltcGwuaApAQCAtMCwwICsxLDY4NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuIEFyZW5hIGFsbG9jYXRvciBmb3IgYmV0dGVyIGFsbG9jYXRpb24gcGVyZm9ybWFuY2UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0FSRU5BX0lNUExfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkVOQV9JTVBMX0hfXworCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx0eXBlaW5mbz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wb3J0Lmg+CisKKyNpZmRlZiBBRERSRVNTX1NBTklUSVpFUgorI2luY2x1ZGUgPHNhbml0aXplci9hc2FuX2ludGVyZmFjZS5oPgorI2VuZGlmICAvLyBBRERSRVNTX1NBTklUSVpFUgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hel9zYW1wbGVyLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRvIHByZXZlbnQgc2hhcmluZyBjYWNoZSBsaW5lcyBiZXR3ZWVuIHRocmVhZHMKKyNpZmRlZiBfX2NwcF9hbGlnbmVkX25ldworZW51bSB7IGtDYWNoZUFsaWdubWVudCA9IDY0IH07CisjZWxzZQorZW51bSB7IGtDYWNoZUFsaWdubWVudCA9IGFsaWdub2YobWF4X2FsaWduX3QpIH07ICAvLyBkbyB0aGUgYmVzdCB3ZSBjYW4KKyNlbmRpZgorCitpbmxpbmUgY29uc3RleHByIHNpemVfdCBBbGlnblVwVG84KHNpemVfdCBuKSB7CisgIC8vIEFsaWduIG4gdG8gbmV4dCBtdWx0aXBsZSBvZiA4IChmcm9tIEhhY2tlcidzIERlbGlnaHQsIENoYXB0ZXIgMy4pCisgIHJldHVybiAobiArIDcpICYgc3RhdGljX2Nhc3Q8c2l6ZV90PigtOCk7Cit9CisKK3VzaW5nIExpZmVjeWNsZUlkQXRvbWljID0gdWludDY0X3Q7CisKKy8vIE1ldHJpY3NDb2xsZWN0b3IgY29sbGVjdHMgc3RhdHMgZm9yIGEgcGFydGljdWxhciBhcmVuYS4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBBcmVuYU1ldHJpY3NDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgQXJlbmFNZXRyaWNzQ29sbGVjdG9yKGJvb2wgcmVjb3JkX2FsbG9jcykgOiByZWNvcmRfYWxsb2NzXyhyZWNvcmRfYWxsb2NzKSB7fQorCisgIC8vIEludm9rZWQgd2hlbiB0aGUgYXJlbmEgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLiBUaGlzIG1ldGhvZCB3aWxsCisgIC8vIHR5cGljYWxseSBmaW5hbGl6ZSBhbnkgbWV0cmljIGNvbGxlY3Rpb24gYW5kIGRlbGV0ZSB0aGUgY29sbGVjdG9yLgorICAvLyBzcGFjZV9hbGxvY2F0ZWQgaXMgdGhlIHNwYWNlIHVzZWQgYnkgdGhlIGFyZW5hLgorICB2aXJ0dWFsIHZvaWQgT25EZXN0cm95KHVpbnQ2NF90IHNwYWNlX2FsbG9jYXRlZCkgPSAwOworCisgIC8vIE9uUmVzZXQoKSBpcyBjYWxsZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBhcmVuYSBpcyByZXNldC4KKyAgLy8gc3BhY2VfYWxsb2NhdGVkIGlzIHRoZSBzcGFjZSB1c2VkIGJ5IHRoZSBhcmVuYSBqdXN0IGJlZm9yZSB0aGUgcmVzZXQuCisgIHZpcnR1YWwgdm9pZCBPblJlc2V0KHVpbnQ2NF90IHNwYWNlX2FsbG9jYXRlZCkgPSAwOworCisgIC8vIE9uQWxsb2MgaXMgY2FsbGVkIHdoZW4gYW4gYWxsb2NhdGlvbiBoYXBwZW5zLgorICAvLyB0eXBlX2luZm8gaXMgcHJvbWlzZWQgdG8gYmUgc3RhdGljIC0gaXRzIGxpZmV0aW1lIGV4dGVuZHMgdG8KKyAgLy8gbWF0Y2ggcHJvZ3JhbSdzIGxpZmV0aW1lIChJdCBpcyBnaXZlbiBieSB0eXBlaWQgb3BlcmF0b3IpLgorICAvLyBOb3RlOiB0eXBlaWQodm9pZCkgd2lsbCBiZSBwYXNzZWQgYXMgYWxsb2NhdGVkX3R5cGUgZXZlcnkgdGltZSB3ZQorICAvLyBpbnRlbnRpb25hbGx5IHdhbnQgdG8gYXZvaWQgbW9uaXRvcmluZyBhbiBhbGxvY2F0aW9uLiAoaS5lLiBpbnRlcm5hbAorICAvLyBhbGxvY2F0aW9ucyBmb3IgbWFuYWdpbmcgdGhlIGFyZW5hKQorICB2aXJ0dWFsIHZvaWQgT25BbGxvYyhjb25zdCBzdGQ6OnR5cGVfaW5mbyogYWxsb2NhdGVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGFsbG9jX3NpemUpID0gMDsKKworICAvLyBEb2VzIE9uQWxsb2MoKSBuZWVkIHRvIGJlIGNhbGxlZD8gIElmIGZhbHNlLCBtZXRyaWMgY29sbGVjdGlvbiBvdmVyaGVhZAorICAvLyB3aWxsIGJlIHJlZHVjZWQgc2luY2Ugd2Ugd2lsbCBub3QgZG8gZXh0cmEgd29yayBwZXIgYWxsb2NhdGlvbi4KKyAgYm9vbCBSZWNvcmRBbGxvY3MoKSB7IHJldHVybiByZWNvcmRfYWxsb2NzXzsgfQorCisgcHJvdGVjdGVkOgorICAvLyBUaGlzIGNsYXNzIGlzIGRlc3RydWN0ZWQgYnkgdGhlIGNhbGwgdG8gT25EZXN0cm95KCkuCisgIH5BcmVuYU1ldHJpY3NDb2xsZWN0b3IoKSA9IGRlZmF1bHQ7CisgIGNvbnN0IGJvb2wgcmVjb3JkX2FsbG9jc187Cit9OworCitzdHJ1Y3QgQWxsb2NhdGlvblBvbGljeSB7CisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtEZWZhdWx0U3RhcnRCbG9ja1NpemUgPSAyNTY7CisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtEZWZhdWx0TWF4QmxvY2tTaXplID0gODE5MjsKKworICBzaXplX3Qgc3RhcnRfYmxvY2tfc2l6ZSA9IGtEZWZhdWx0U3RhcnRCbG9ja1NpemU7CisgIHNpemVfdCBtYXhfYmxvY2tfc2l6ZSA9IGtEZWZhdWx0TWF4QmxvY2tTaXplOworICB2b2lkKiAoKmJsb2NrX2FsbG9jKShzaXplX3QpID0gbnVsbHB0cjsKKyAgdm9pZCAoKmJsb2NrX2RlYWxsb2MpKHZvaWQqLCBzaXplX3QpID0gbnVsbHB0cjsKKyAgQXJlbmFNZXRyaWNzQ29sbGVjdG9yKiBtZXRyaWNzX2NvbGxlY3RvciA9IG51bGxwdHI7CisKKyAgYm9vbCBJc0RlZmF1bHQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXJ0X2Jsb2NrX3NpemUgPT0ga0RlZmF1bHRNYXhCbG9ja1NpemUgJiYKKyAgICAgICAgICAgbWF4X2Jsb2NrX3NpemUgPT0ga0RlZmF1bHRNYXhCbG9ja1NpemUgJiYgYmxvY2tfYWxsb2MgPT0gbnVsbHB0ciAmJgorICAgICAgICAgICBibG9ja19kZWFsbG9jID09IG51bGxwdHIgJiYgbWV0cmljc19jb2xsZWN0b3IgPT0gbnVsbHB0cjsKKyAgfQorfTsKKworLy8gVGFnZ2VkIHBvaW50ZXIgdG8gYW4gQWxsb2NhdGlvblBvbGljeS4KK2NsYXNzIFRhZ2dlZEFsbG9jYXRpb25Qb2xpY3lQdHIgeworIHB1YmxpYzoKKyAgY29uc3RleHByIFRhZ2dlZEFsbG9jYXRpb25Qb2xpY3lQdHIoKSA6IHBvbGljeV8oMCkge30KKworICBleHBsaWNpdCBUYWdnZWRBbGxvY2F0aW9uUG9saWN5UHRyKEFsbG9jYXRpb25Qb2xpY3kqIHBvbGljeSkKKyAgICAgIDogcG9saWN5XyhyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocG9saWN5KSkge30KKworICB2b2lkIHNldF9wb2xpY3koQWxsb2NhdGlvblBvbGljeSogcG9saWN5KSB7CisgICAgYXV0byBiaXRzID0gcG9saWN5XyAmIGtUYWdzTWFzazsKKyAgICBwb2xpY3lfID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHBvbGljeSkgfCBiaXRzOworICB9CisKKyAgQWxsb2NhdGlvblBvbGljeSogZ2V0KCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEFsbG9jYXRpb25Qb2xpY3kqPihwb2xpY3lfICYga1B0ck1hc2spOworICB9CisgIGNvbnN0IEFsbG9jYXRpb25Qb2xpY3kqIGdldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBbGxvY2F0aW9uUG9saWN5Kj4ocG9saWN5XyAmIGtQdHJNYXNrKTsKKyAgfQorCisgIEFsbG9jYXRpb25Qb2xpY3kmIG9wZXJhdG9yKigpIHsgcmV0dXJuICpnZXQoKTsgfQorICBjb25zdCBBbGxvY2F0aW9uUG9saWN5JiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqZ2V0KCk7IH0KKworICBBbGxvY2F0aW9uUG9saWN5KiBvcGVyYXRvci0+KCkgeyByZXR1cm4gZ2V0KCk7IH0KKyAgY29uc3QgQWxsb2NhdGlvblBvbGljeSogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisKKyAgYm9vbCBpc191c2VyX293bmVkX2luaXRpYWxfYmxvY2soKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KGdldF9tYXNrPGtVc2VyT3duZWRJbml0aWFsQmxvY2s+KCkpOworICB9CisgIHZvaWQgc2V0X2lzX3VzZXJfb3duZWRfaW5pdGlhbF9ibG9jayhib29sIHYpIHsKKyAgICBzZXRfbWFzazxrVXNlck93bmVkSW5pdGlhbEJsb2NrPih2KTsKKyAgfQorCisgIGJvb2wgc2hvdWxkX3JlY29yZF9hbGxvY3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KGdldF9tYXNrPGtSZWNvcmRBbGxvY3M+KCkpOworICB9CisgIHZvaWQgc2V0X3Nob3VsZF9yZWNvcmRfYWxsb2NzKGJvb2wgdikgeyBzZXRfbWFzazxrUmVjb3JkQWxsb2NzPih2KTsgfQorCisgIHVpbnRwdHJfdCBnZXRfcmF3KCkgY29uc3QgeyByZXR1cm4gcG9saWN5XzsgfQorCisgIGlubGluZSB2b2lkIFJlY29yZEFsbG9jKGNvbnN0IHN0ZDo6dHlwZV9pbmZvKiBhbGxvY2F0ZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG4pIGNvbnN0IHsKKyAgICBnZXQoKS0+bWV0cmljc19jb2xsZWN0b3ItPk9uQWxsb2MoYWxsb2NhdGVkX3R5cGUsIG4pOworICB9CisKKyBwcml2YXRlOgorICBlbnVtIDogdWludHB0cl90IHsKKyAgICBrVXNlck93bmVkSW5pdGlhbEJsb2NrID0gMSwKKyAgICBrUmVjb3JkQWxsb2NzID0gMiwKKyAgfTsKKworICBzdGF0aWMgY29uc3RleHByIHVpbnRwdHJfdCBrVGFnc01hc2sgPSA3OworICBzdGF0aWMgY29uc3RleHByIHVpbnRwdHJfdCBrUHRyTWFzayA9IH5rVGFnc01hc2s7CisKKyAgdGVtcGxhdGUgPHVpbnRwdHJfdCBrTWFzaz4KKyAgdWludHB0cl90IGdldF9tYXNrKCkgY29uc3QgeworICAgIHJldHVybiBwb2xpY3lfICYga01hc2s7CisgIH0KKyAgdGVtcGxhdGUgPHVpbnRwdHJfdCBrTWFzaz4KKyAgdm9pZCBzZXRfbWFzayhib29sIHYpIHsKKyAgICBpZiAodikgeworICAgICAgcG9saWN5XyB8PSBrTWFzazsKKyAgICB9IGVsc2UgeworICAgICAgcG9saWN5XyAmPSB+a01hc2s7CisgICAgfQorICB9CisgIHVpbnRwdHJfdCBwb2xpY3lfOworfTsKKworZW51bSBjbGFzcyBBbGxvY2F0aW9uQ2xpZW50IHsga0RlZmF1bHQsIGtBcnJheSB9OworCisvLyBBIHNpbXBsZSBhcmVuYSBhbGxvY2F0b3IuIENhbGxzIHRvIGFsbG9jYXRlIGZ1bmN0aW9ucyBtdXN0IGJlIHByb3Blcmx5CisvLyBzZXJpYWxpemVkIGJ5IHRoZSBjYWxsZXIsIGhlbmNlIHRoaXMgY2xhc3MgY2Fubm90IGJlIHVzZWQgYXMgYSBnZW5lcmFsCisvLyBwdXJwb3NlIGFsbG9jYXRvciBpbiBhIG11bHRpLXRocmVhZGVkIHByb2dyYW0uIEl0IHNlcnZlcyBhcyBhIGJ1aWxkaW5nIGJsb2NrCisvLyBmb3IgVGhyZWFkU2FmZUFyZW5hLCB3aGljaCBwcm92aWRlcyBhIHRocmVhZC1zYWZlIGFyZW5hIGFsbG9jYXRvci4KKy8vCisvLyBUaGlzIGNsYXNzIG1hbmFnZXMKKy8vIDEpIEFyZW5hIGJ1bXAgYWxsb2NhdGlvbiArIG93bmluZyBtZW1vcnkgYmxvY2tzLgorLy8gMikgTWFpbnRhaW5pbmcgYSBjbGVhbnVwIGxpc3QuCisvLyBJdCBkZWxhZ2V0ZXMgdGhlIGFjdHVhbCBtZW1vcnkgYWxsb2NhdGlvbiBiYWNrIHRvIFRocmVhZFNhZmVBcmVuYSwgd2hpY2gKKy8vIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBvbiBibG9jayBncm93dGggcG9saWN5IGFuZCBiYWNraW5nIG1lbW9yeSBhbGxvY2F0aW9uCisvLyB1c2VkLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFNlcmlhbEFyZW5hIHsKKyBwdWJsaWM6CisgIHN0cnVjdCBNZW1vcnkgeworICAgIHZvaWQqIHB0cjsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgfTsKKworICAvLyBOb2RlIGNvbnRhaW5zIHRoZSBwdHIgb2YgdGhlIG9iamVjdCB0byBiZSBjbGVhbmVkIHVwIGFuZCB0aGUgYXNzb2NpYXRlZAorICAvLyBjbGVhbnVwIGZ1bmN0aW9uIHB0ci4KKyAgc3RydWN0IENsZWFudXBOb2RlIHsKKyAgICB2b2lkKiBlbGVtOyAgICAgICAgICAgICAgLy8gUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIGJlIGNsZWFuZWQgdXAuCisgICAgdm9pZCAoKmNsZWFudXApKHZvaWQqKTsgIC8vIEZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIGRlc3RydWN0b3Igb3IgZGVsZXRlci4KKyAgfTsKKworICB2b2lkIENsZWFudXBMaXN0KCk7CisgIHVpbnQ2NF90IFNwYWNlQWxsb2NhdGVkKCkgY29uc3QgeworICAgIHJldHVybiBzcGFjZV9hbGxvY2F0ZWRfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIH0KKyAgdWludDY0X3QgU3BhY2VVc2VkKCkgY29uc3Q7CisKKyAgYm9vbCBIYXNTcGFjZShzaXplX3QgbikgY29uc3QgeworICAgIHJldHVybiBuIDw9IHN0YXRpY19jYXN0PHNpemVfdD4obGltaXRfIC0gcHRyXyk7CisgIH0KKworICAvLyBTZWUgY29tbWVudHMgb24gYGNhY2hlZF9ibG9ja3NfYCBtZW1iZXIgZm9yIGRldGFpbHMuCisgIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCogVHJ5QWxsb2NhdGVGcm9tQ2FjaGVkQmxvY2soc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShzaXplIDwgMTYpKSByZXR1cm4gbnVsbHB0cjsKKyAgICAvLyBXZSByb3VuZCB1cCB0byB0aGUgbmV4dCBsYXJnZXIgYmxvY2sgaW4gY2FzZSB0aGUgbWVtb3J5IGRvZXNuJ3QgbWF0Y2gKKyAgICAvLyB0aGUgcGF0dGVybiB3ZSBhcmUgbG9va2luZyBmb3IuCisgICAgY29uc3Qgc2l6ZV90IGluZGV4ID0gQml0czo6TG9nMkZsb29yTm9uWmVybzY0KHNpemUgLSAxKSAtIDM7CisKKyAgICBpZiAoaW5kZXggPj0gY2FjaGVkX2Jsb2NrX2xlbmd0aF8pIHJldHVybiBudWxscHRyOworICAgIGF1dG8mIGNhY2hlZF9oZWFkID0gY2FjaGVkX2Jsb2Nrc19baW5kZXhdOworICAgIGlmIChjYWNoZWRfaGVhZCA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKKworICAgIHZvaWQqIHJldCA9IGNhY2hlZF9oZWFkOworI2lmZGVmIEFERFJFU1NfU0FOSVRJWkVSCisgICAgQVNBTl9VTlBPSVNPTl9NRU1PUllfUkVHSU9OKHJldCwgc2l6ZSk7CisjZW5kaWYgIC8vIEFERFJFU1NfU0FOSVRJWkVSCisgICAgY2FjaGVkX2hlYWQgPSBjYWNoZWRfaGVhZC0+bmV4dDsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgLy8gSW4ga0FycmF5IG1vZGUgd2UgbG9vayB0aHJvdWdoIGNhY2hlZCBibG9ja3MuCisgIC8vIFdlIGRvIG5vdCBkbyB0aGlzIGJ5IGRlZmF1bHQgYmVjYXVzZSBtb3N0IG5vbi1hcnJheSBhbGxvY2F0aW9ucyB3aWxsIG5vdAorICAvLyBoYXZlIHRoZSByaWdodCBzaXplIGFuZCB3aWxsIGZhaWwgdG8gZmluZCBhbiBhcHByb3ByaWF0ZSBjYWNoZWQgYmxvY2suCisgIC8vCisgIC8vIFRPRE8oc2JlbnphKTogRXZhbHVhdGUgaWYgd2Ugc2hvdWxkIHVzZSBjYWNoZWQgYmxvY2tzIGZvciBtZXNzYWdlIHR5cGVzIG9mCisgIC8vIHRoZSByaWdodCBzaXplLiBXZSBjYW4gc3RhdGljYWxseSBrbm93IGlmIHRoZSBhbGxvY2F0aW9uIHNpemUgY2FuIGJlbmVmaXQKKyAgLy8gZnJvbSBpdC4KKyAgdGVtcGxhdGUgPEFsbG9jYXRpb25DbGllbnQgYWxsb2NfY2xpZW50ID0gQWxsb2NhdGlvbkNsaWVudDo6a0RlZmF1bHQ+CisgIHZvaWQqIEFsbG9jYXRlQWxpZ25lZChzaXplX3QgbiwgY29uc3QgQWxsb2NhdGlvblBvbGljeSogcG9saWN5KSB7CisgICAgR09PR0xFX0RDSEVDS19FUShpbnRlcm5hbDo6QWxpZ25VcFRvOChuKSwgbik7ICAvLyBNdXN0IGJlIGFscmVhZHkgYWxpZ25lZC4KKyAgICBHT09HTEVfRENIRUNLX0dFKGxpbWl0XywgcHRyXyk7CisKKyAgICBpZiAoYWxsb2NfY2xpZW50ID09IEFsbG9jYXRpb25DbGllbnQ6OmtBcnJheSkgeworICAgICAgaWYgKHZvaWQqIHJlcyA9IFRyeUFsbG9jYXRlRnJvbUNhY2hlZEJsb2NrKG4pKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoIUhhc1NwYWNlKG4pKSkgeworICAgICAgcmV0dXJuIEFsbG9jYXRlQWxpZ25lZEZhbGxiYWNrKG4sIHBvbGljeSk7CisgICAgfQorICAgIHJldHVybiBBbGxvY2F0ZUZyb21FeGlzdGluZyhuKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdm9pZCogQWxsb2NhdGVGcm9tRXhpc3Rpbmcoc2l6ZV90IG4pIHsKKyAgICB2b2lkKiByZXQgPSBwdHJfOworICAgIHB0cl8gKz0gbjsKKyNpZmRlZiBBRERSRVNTX1NBTklUSVpFUgorICAgIEFTQU5fVU5QT0lTT05fTUVNT1JZX1JFR0lPTihyZXQsIG4pOworI2VuZGlmICAvLyBBRERSRVNTX1NBTklUSVpFUgorICAgIHJldHVybiByZXQ7CisgIH0KKworICAvLyBTZWUgY29tbWVudHMgb24gYGNhY2hlZF9ibG9ja3NfYCBtZW1iZXIgZm9yIGRldGFpbHMuCisgIHZvaWQgUmV0dXJuQXJyYXlNZW1vcnkodm9pZCogcCwgc2l6ZV90IHNpemUpIHsKKyAgICAvLyBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgZm9yIDMyLWJpdCBwbGF0Zm9ybXMuCisgICAgLy8gSW4gNjQtYml0IHBsYXRmb3JtcyB0aGUgbWluaW11bSBhbGxvY2F0aW9uIHNpemUgZnJvbSBSZXBlYXRlZCpGaWVsZCB3aWxsCisgICAgLy8gYmUgMTYgZ3VhcmFudGVlZC4KKyAgICBpZiAoc2l6ZW9mKHZvaWQqKSA8IDgpIHsKKyAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKHNpemUgPCAxNikpIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgR09PR0xFX0RDSEVDSyhzaXplID49IDE2KTsKKyAgICB9CisKKyAgICAvLyBXZSByb3VuZCBkb3duIHRvIHRoZSBuZXh0IHNtYWxsZXIgYmxvY2sgaW4gY2FzZSB0aGUgbWVtb3J5IGRvZXNuJ3QgbWF0Y2gKKyAgICAvLyB0aGUgcGF0dGVybiB3ZSBhcmUgbG9va2luZyBmb3IuIGVnLCBzb21lb25lIG1pZ2h0IGhhdmUgY2FsbGVkIFJlc2VydmUoKQorICAgIC8vIG9uIHRoZSByZXBlYXRlZCBmaWVsZC4KKyAgICBjb25zdCBzaXplX3QgaW5kZXggPSBCaXRzOjpMb2cyRmxvb3JOb25aZXJvNjQoc2l6ZSkgLSA0OworCisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoaW5kZXggPj0gY2FjaGVkX2Jsb2NrX2xlbmd0aF8pKSB7CisgICAgICAvLyBXZSBjYW4ndCBwdXQgdGhpcyBvYmplY3Qgb24gdGhlIGZyZWVsaXN0IHNvIG1ha2UgdGhpcyBvYmplY3QgdGhlCisgICAgICAvLyBmcmVlbGlzdC4gSXQgaXMgZ3VhcmFudGVlZCBpdCBpcyBsYXJnZXIgdGhhbiB0aGUgb25lIHdlIGhhdmUsIGFuZAorICAgICAgLy8gbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYW5vdGhlciBhbGxvY2F0aW9uIG9mIGBzaXplYC4KKyAgICAgIENhY2hlZEJsb2NrKiogbmV3X2xpc3QgPSBzdGF0aWNfY2FzdDxDYWNoZWRCbG9jayoqPihwKTsKKyAgICAgIHNpemVfdCBuZXdfc2l6ZSA9IHNpemUgLyBzaXplb2YoQ2FjaGVkQmxvY2sqKTsKKworICAgICAgc3RkOjpjb3B5KGNhY2hlZF9ibG9ja3NfLCBjYWNoZWRfYmxvY2tzXyArIGNhY2hlZF9ibG9ja19sZW5ndGhfLAorICAgICAgICAgICAgICAgIG5ld19saXN0KTsKKyAgICAgIHN0ZDo6ZmlsbChuZXdfbGlzdCArIGNhY2hlZF9ibG9ja19sZW5ndGhfLCBuZXdfbGlzdCArIG5ld19zaXplLCBudWxscHRyKTsKKyAgICAgIGNhY2hlZF9ibG9ja3NfID0gbmV3X2xpc3Q7CisgICAgICAvLyBNYWtlIHRoZSBzaXplIGZpdCBpbiB1aW50OF90LiBUaGlzIGlzIHRoZSBwb3dlciBvZiB0d28sIHNvIHdlIGRvbid0CisgICAgICAvLyBuZWVkIGFueXRoaW5nIGxhcmdlci4KKyAgICAgIGNhY2hlZF9ibG9ja19sZW5ndGhfID0KKyAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzdGQ6Om1pbihzaXplX3R7NjR9LCBuZXdfc2l6ZSkpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byYgY2FjaGVkX2hlYWQgPSBjYWNoZWRfYmxvY2tzX1tpbmRleF07CisgICAgYXV0byogbmV3X25vZGUgPSBzdGF0aWNfY2FzdDxDYWNoZWRCbG9jayo+KHApOworICAgIG5ld19ub2RlLT5uZXh0ID0gY2FjaGVkX2hlYWQ7CisgICAgY2FjaGVkX2hlYWQgPSBuZXdfbm9kZTsKKyNpZmRlZiBBRERSRVNTX1NBTklUSVpFUgorICAgIEFTQU5fUE9JU09OX01FTU9SWV9SRUdJT04ocCwgc2l6ZSk7CisjZW5kaWYgIC8vIEFERFJFU1NfU0FOSVRJWkVSCisgIH0KKworIHB1YmxpYzoKKyAgLy8gQWxsb2NhdGUgc3BhY2UgaWYgdGhlIGN1cnJlbnQgcmVnaW9uIHByb3ZpZGVzIGVub3VnaCBzcGFjZS4KKyAgYm9vbCBNYXliZUFsbG9jYXRlQWxpZ25lZChzaXplX3Qgbiwgdm9pZCoqIG91dCkgeworICAgIEdPT0dMRV9EQ0hFQ0tfRVEoaW50ZXJuYWw6OkFsaWduVXBUbzgobiksIG4pOyAgLy8gTXVzdCBiZSBhbHJlYWR5IGFsaWduZWQuCisgICAgR09PR0xFX0RDSEVDS19HRShsaW1pdF8sIHB0cl8pOworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCFIYXNTcGFjZShuKSkpIHJldHVybiBmYWxzZTsKKyAgICAqb3V0ID0gQWxsb2NhdGVGcm9tRXhpc3Rpbmcobik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzdGQ6OnBhaXI8dm9pZCosIENsZWFudXBOb2RlKj4gQWxsb2NhdGVBbGlnbmVkV2l0aENsZWFudXAoCisgICAgICBzaXplX3QgbiwgY29uc3QgQWxsb2NhdGlvblBvbGljeSogcG9saWN5KSB7CisgICAgR09PR0xFX0RDSEVDS19FUShpbnRlcm5hbDo6QWxpZ25VcFRvOChuKSwgbik7ICAvLyBNdXN0IGJlIGFscmVhZHkgYWxpZ25lZC4KKyAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghSGFzU3BhY2UobiArIGtDbGVhbnVwU2l6ZSkpKSB7CisgICAgICByZXR1cm4gQWxsb2NhdGVBbGlnbmVkV2l0aENsZWFudXBGYWxsYmFjayhuLCBwb2xpY3kpOworICAgIH0KKyAgICByZXR1cm4gQWxsb2NhdGVGcm9tRXhpc3RpbmdXaXRoQ2xlYW51cEZhbGxiYWNrKG4pOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnBhaXI8dm9pZCosIENsZWFudXBOb2RlKj4gQWxsb2NhdGVGcm9tRXhpc3RpbmdXaXRoQ2xlYW51cEZhbGxiYWNrKAorICAgICAgc2l6ZV90IG4pIHsKKyAgICB2b2lkKiByZXQgPSBwdHJfOworICAgIHB0cl8gKz0gbjsKKyAgICBsaW1pdF8gLT0ga0NsZWFudXBTaXplOworI2lmZGVmIEFERFJFU1NfU0FOSVRJWkVSCisgICAgQVNBTl9VTlBPSVNPTl9NRU1PUllfUkVHSU9OKHJldCwgbik7CisgICAgQVNBTl9VTlBPSVNPTl9NRU1PUllfUkVHSU9OKGxpbWl0Xywga0NsZWFudXBTaXplKTsKKyNlbmRpZiAgLy8gQUREUkVTU19TQU5JVElaRVIKKyAgICByZXR1cm4gQ3JlYXRlUGFpcihyZXQsIHJlaW50ZXJwcmV0X2Nhc3Q8Q2xlYW51cE5vZGUqPihsaW1pdF8pKTsKKyAgfQorCisgcHVibGljOgorICB2b2lkIEFkZENsZWFudXAodm9pZCogZWxlbSwgdm9pZCAoKmNsZWFudXApKHZvaWQqKSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEFsbG9jYXRpb25Qb2xpY3kqIHBvbGljeSkgeworICAgIGF1dG8gcmVzID0gQWxsb2NhdGVBbGlnbmVkV2l0aENsZWFudXAoMCwgcG9saWN5KTsKKyAgICByZXMuc2Vjb25kLT5lbGVtID0gZWxlbTsKKyAgICByZXMuc2Vjb25kLT5jbGVhbnVwID0gY2xlYW51cDsKKyAgfQorCisgIHZvaWQqIG93bmVyKCkgY29uc3QgeyByZXR1cm4gb3duZXJfOyB9CisgIFNlcmlhbEFyZW5hKiBuZXh0KCkgY29uc3QgeyByZXR1cm4gbmV4dF87IH0KKyAgdm9pZCBzZXRfbmV4dChTZXJpYWxBcmVuYSogbmV4dCkgeyBuZXh0XyA9IG5leHQ7IH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBUaHJlYWRTYWZlQXJlbmE7CisgIGZyaWVuZCBjbGFzcyBBcmVuYUJlbmNobWFyazsKKworICAvLyBDcmVhdGVzIGEgbmV3IFNlcmlhbEFyZW5hIGluc2lkZSBtZW0gdXNpbmcgdGhlIHJlbWFpbmluZyBtZW1vcnkgYXMgZm9yCisgIC8vIGZ1dHVyZSBhbGxvY2F0aW9ucy4KKyAgc3RhdGljIFNlcmlhbEFyZW5hKiBOZXcoU2VyaWFsQXJlbmE6Ok1lbW9yeSBtZW0sIHZvaWQqIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRTYWZlQXJlbmFTdGF0cyogc3RhdHMpOworICAvLyBGcmVlIFNlcmlhbEFyZW5hIHJldHVybmluZyB0aGUgbWVtb3J5IHBhc3NlZCBpbiB0byBOZXcKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERlYWxsb2NhdG9yPgorICBNZW1vcnkgRnJlZShEZWFsbG9jYXRvciBkZWFsbG9jYXRvcik7CisKKyAgLy8gQmxvY2tzIGFyZSB2YXJpYWJsZSBsZW5ndGggbWFsbG9jLWVkIG9iamVjdHMuICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZQorICAvLyBkZXNjcmliZXMgdGhlIGNvbW1vbiBoZWFkZXIgZm9yIGFsbCBibG9ja3MuCisgIHN0cnVjdCBCbG9jayB7CisgICAgQmxvY2soQmxvY2sqIG5leHQsIHNpemVfdCBzaXplKSA6IG5leHQobmV4dCksIHNpemUoc2l6ZSksIHN0YXJ0KG51bGxwdHIpIHt9CisKKyAgICBjaGFyKiBQb2ludGVyKHNpemVfdCBuKSB7CisgICAgICBHT09HTEVfRENIRUNLKG4gPD0gc2l6ZSk7CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4odGhpcykgKyBuOworICAgIH0KKworICAgIEJsb2NrKiBjb25zdCBuZXh0OworICAgIGNvbnN0IHNpemVfdCBzaXplOworICAgIENsZWFudXBOb2RlKiBzdGFydDsKKyAgICAvLyBkYXRhIGZvbGxvd3MKKyAgfTsKKworICB2b2lkKiBvd25lcl87ICAgICAgICAgICAgLy8gJlRocmVhZENhY2hlIG9mIHRoaXMgdGhyZWFkOworICBCbG9jayogaGVhZF87ICAgICAgICAgICAgLy8gSGVhZCBvZiBsaW5rZWQgbGlzdCBvZiBibG9ja3MuCisgIFNlcmlhbEFyZW5hKiBuZXh0XzsgICAgICAvLyBOZXh0IFNlcmlhbEFyZW5hIGluIHRoaXMgbGlua2VkIGxpc3QuCisgIHNpemVfdCBzcGFjZV91c2VkXyA9IDA7ICAvLyBOZWNlc3NhcnkgZm9yIG1ldHJpY3MuCisgIHN0ZDo6YXRvbWljPHNpemVfdD4gc3BhY2VfYWxsb2NhdGVkXzsKKworICAvLyBOZXh0IHBvaW50ZXIgdG8gYWxsb2NhdGUgZnJvbS4gIEFsd2F5cyA4LWJ5dGUgYWxpZ25lZC4gIFBvaW50cyBpbnNpZGUKKyAgLy8gaGVhZF8gKGFuZCBoZWFkXy0+cG9zIHdpbGwgYWx3YXlzIGJlIG5vbi1jYW5vbmljYWwpLiAgV2Uga2VlcCB0aGVzZQorICAvLyBoZXJlIHRvIHJlZHVjZSBpbmRpcmVjdGlvbi4KKyAgY2hhciogcHRyXzsKKyAgLy8gTGltaXRpbmcgYWRkcmVzcyB1cCB0byB3aGljaCBtZW1vcnkgY2FuIGJlIGFsbG9jYXRlZCBmcm9tIHRoZSBoZWFkIGJsb2NrLgorICBjaGFyKiBsaW1pdF87CisgIC8vIEZvciBob2xkaW5nIHNhbXBsaW5nIGluZm9ybWF0aW9uLiAgVGhlIHBvaW50ZXIgaXMgb3duZWQgYnkgdGhlCisgIC8vIFRocmVhZFNhZmVBcmVuYSB0aGF0IGhvbGRzIHRoaXMgc2VyaWFsIGFyZW5hLgorICBUaHJlYWRTYWZlQXJlbmFTdGF0cyogYXJlbmFfc3RhdHNfOworCisgIC8vIFJlcGVhdGVkKkZpZWxkIGFuZCBBcmVuYSBwbGF5IHRvZ2V0aGVyIHRvIHJlZHVjZSBtZW1vcnkgY29uc3VtcHRpb24gYnkKKyAgLy8gcmV1c2luZyBibG9ja3MuIEN1cnJlbnRseSwgbmF0dXJhbCBncm93dGggb2YgdGhlIHJlcGVhdGVkIGZpZWxkIHR5cGVzIG1ha2VzCisgIC8vIHRoZW0gYWxsb2NhdGUgYmxvY2tzIG9mIHNpemUgYDggKyAyXk4sIE4+PTNgLgorICAvLyBXaGVuIHRoZSByZXBlYXRlZCBmaWVsZCBncm93cyByZXR1cm5zIHRoZSBwcmV2aW91cyBibG9jayBhbmQgd2UgcHV0IGl0IGluCisgIC8vIHRoaXMgZnJlZSBsaXN0LgorICAvLyBgY2FjaGVkX2Jsb2Nrc19baV1gIHBvaW50cyB0byB0aGUgZnJlZSBsaXN0IGZvciBibG9ja3Mgb2Ygc2l6ZSBgOCsyXihpKzMpYC4KKyAgLy8gVGhlIGFycmF5IG9mIGZyZWVsaXN0cyBpcyBncm93biB3aGVuIG5lZWRlZCBpbiBgUmV0dXJuQXJyYXlNZW1vcnkoKWAuCisgIHN0cnVjdCBDYWNoZWRCbG9jayB7CisgICAgLy8gU2ltcGxlIGxpbmtlZCBsaXN0LgorICAgIENhY2hlZEJsb2NrKiBuZXh0OworICB9OworICB1aW50OF90IGNhY2hlZF9ibG9ja19sZW5ndGhfID0gMDsKKyAgQ2FjaGVkQmxvY2sqKiBjYWNoZWRfYmxvY2tzXyA9IG51bGxwdHI7CisKKyAgLy8gQ29uc3RydWN0b3IgaXMgcHJpdmF0ZSBhcyBvbmx5IE5ldygpIHNob3VsZCBiZSB1c2VkLgorICBpbmxpbmUgU2VyaWFsQXJlbmEoQmxvY2sqIGIsIHZvaWQqIG93bmVyLCBUaHJlYWRTYWZlQXJlbmFTdGF0cyogc3RhdHMpOworICB2b2lkKiBBbGxvY2F0ZUFsaWduZWRGYWxsYmFjayhzaXplX3QgbiwgY29uc3QgQWxsb2NhdGlvblBvbGljeSogcG9saWN5KTsKKyAgc3RkOjpwYWlyPHZvaWQqLCBDbGVhbnVwTm9kZSo+IEFsbG9jYXRlQWxpZ25lZFdpdGhDbGVhbnVwRmFsbGJhY2soCisgICAgICBzaXplX3QgbiwgY29uc3QgQWxsb2NhdGlvblBvbGljeSogcG9saWN5KTsKKyAgdm9pZCBBbGxvY2F0ZU5ld0Jsb2NrKHNpemVfdCBuLCBjb25zdCBBbGxvY2F0aW9uUG9saWN5KiBwb2xpY3kpOworCisgIHN0ZDo6cGFpcjx2b2lkKiwgQ2xlYW51cE5vZGUqPiBDcmVhdGVQYWlyKHZvaWQqIHB0ciwgQ2xlYW51cE5vZGUqIG5vZGUpIHsKKyAgICByZXR1cm4ge3B0ciwgbm9kZX07CisgIH0KKworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0Jsb2NrSGVhZGVyU2l6ZSA9IEFsaWduVXBUbzgoc2l6ZW9mKEJsb2NrKSk7CisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtDbGVhbnVwU2l6ZSA9IEFsaWduVXBUbzgoc2l6ZW9mKENsZWFudXBOb2RlKSk7Cit9OworCisvLyBUYWcgdHlwZSB1c2VkIHRvIGludm9rZSB0aGUgY29uc3RydWN0b3Igb2YgbWVzc2FnZS1vd25lZCBhcmVuYS4KKy8vIE9ubHkgbWVzc2FnZS1vd25lZCBhcmVuYXMgdXNlIHRoaXMgY29uc3RydWN0b3IgZm9yIGNyZWF0aW9uLgorLy8gU3VjaCBjb25zdHJ1Y3RvcnMgYXJlIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgdGhlIGxpYnJhcnkuCitzdHJ1Y3QgTWVzc2FnZU93bmVkIHsKKyAgZXhwbGljaXQgTWVzc2FnZU93bmVkKCkgPSBkZWZhdWx0OworfTsKKworLy8gVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgY29yZSBBcmVuYSBtZW1vcnkgYWxsb2NhdGlvbiBsaWJyYXJ5LiBEaWZmZXJlbnQKKy8vIGltcGxlbWVudGF0aW9ucyBvbmx5IG5lZWQgdG8gaW1wbGVtZW50IHRoZSBwdWJsaWMgaW50ZXJmYWNlIGJlbG93LgorLy8gQXJlbmEgaXMgbm90IGEgdGVtcGxhdGUgdHlwZSBhcyB0aGF0IHdvdWxkIG9ubHkgYmUgdXNlZnVsIGlmIGFsbCBwcm90b3MKKy8vIGluIHR1cm4gd291bGQgYmUgdGVtcGxhdGVzLCB3aGljaCB3aWxsL2Nhbm5vdCBoYXBwZW4uIEhvd2V2ZXIgc2VwYXJhdGluZworLy8gdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHBhcnQgZnJvbSB0aGUgY3J1ZnQgb2YgdGhlIEFQSSB1c2VycyBleHBlY3Qgd2UgY2FuCisvLyB1c2UgI2lmZGVmIHRoZSBzZWxlY3QgdGhlIGJlc3QgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gaGFyZHdhcmUgLyBPUy4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBUaHJlYWRTYWZlQXJlbmEgeworIHB1YmxpYzoKKyAgVGhyZWFkU2FmZUFyZW5hKCkgeyBJbml0KCk7IH0KKworICAvLyBDb25zdHJ1Y3RvciBzb2xlbHkgdXNlZCBieSBtZXNzYWdlLW93bmVkIGFyZW5hLgorICBUaHJlYWRTYWZlQXJlbmEoaW50ZXJuYWw6Ok1lc3NhZ2VPd25lZCkgOiB0YWdfYW5kX2lkXyhrTWVzc2FnZU93bmVkQXJlbmEpIHsKKyAgICBJbml0KCk7CisgIH0KKworICBUaHJlYWRTYWZlQXJlbmEoY2hhciogbWVtLCBzaXplX3Qgc2l6ZSkgeyBJbml0aWFsaXplRnJvbShtZW0sIHNpemUpOyB9CisKKyAgZXhwbGljaXQgVGhyZWFkU2FmZUFyZW5hKHZvaWQqIG1lbSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxvY2F0aW9uUG9saWN5JiBwb2xpY3kpIHsKKyAgICBJbml0aWFsaXplV2l0aFBvbGljeShtZW0sIHNpemUsIHBvbGljeSk7CisgIH0KKworICAvLyBEZXN0cnVjdG9yIGRlbGV0ZXMgYWxsIG93bmVkIGhlYXAgYWxsb2NhdGVkIG9iamVjdHMsIGFuZCBkZXN0cnVjdHMgb2JqZWN0cworICAvLyB0aGF0IGhhdmUgbm9uLXRyaXZpYWwgZGVzdHJ1Y3RvcnMsIGV4Y2VwdCBmb3IgcHJvdG8yIG1lc3NhZ2Ugb2JqZWN0cyB3aG9zZQorICAvLyBkZXN0cnVjdG9ycyBjYW4gYmUgc2tpcHBlZC4gQWxzbywgZnJlZXMgYWxsIGJsb2NrcyBleGNlcHQgdGhlIGluaXRpYWwgYmxvY2sKKyAgLy8gaWYgaXQgd2FzIHBhc3NlZCBpbi4KKyAgflRocmVhZFNhZmVBcmVuYSgpOworCisgIHVpbnQ2NF90IFJlc2V0KCk7CisKKyAgdWludDY0X3QgU3BhY2VBbGxvY2F0ZWQoKSBjb25zdDsKKyAgdWludDY0X3QgU3BhY2VVc2VkKCkgY29uc3Q7CisKKyAgdGVtcGxhdGUgPEFsbG9jYXRpb25DbGllbnQgYWxsb2NfY2xpZW50ID0gQWxsb2NhdGlvbkNsaWVudDo6a0RlZmF1bHQ+CisgIHZvaWQqIEFsbG9jYXRlQWxpZ25lZChzaXplX3QgbiwgY29uc3Qgc3RkOjp0eXBlX2luZm8qIHR5cGUpIHsKKyAgICBTZXJpYWxBcmVuYSogYXJlbmE7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRSghYWxsb2NfcG9saWN5Xy5zaG91bGRfcmVjb3JkX2FsbG9jcygpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTZXJpYWxBcmVuYUZhc3QoJmFyZW5hKSkpIHsKKyAgICAgIHJldHVybiBhcmVuYS0+QWxsb2NhdGVBbGlnbmVkPGFsbG9jX2NsaWVudD4obiwgQWxsb2NQb2xpY3koKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBBbGxvY2F0ZUFsaWduZWRGYWxsYmFjayhuLCB0eXBlKTsKKyAgICB9CisgIH0KKworICB2b2lkIFJldHVybkFycmF5TWVtb3J5KHZvaWQqIHAsIHNpemVfdCBzaXplKSB7CisgICAgU2VyaWFsQXJlbmEqIGFyZW5hOworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoR2V0U2VyaWFsQXJlbmFGYXN0KCZhcmVuYSkpKSB7CisgICAgICBhcmVuYS0+UmV0dXJuQXJyYXlNZW1vcnkocCwgc2l6ZSk7CisgICAgfQorICB9CisKKyAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgbiBieXRlcyBpZiB0aGUgY29tbW9uIGhhcHB5IGNhc2UgaXMgdHJ1ZSBhbmQKKyAgLy8gcmV0dXJucyB0cnVlLiBPdGhlcndpc2UgZG9lcyBub3RoaW5nIGFuZCByZXR1cm5zIGZhbHNlLiBUaGlzIHN0cmFuZ2UKKyAgLy8gc2VtYW50aWNzIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyBjYWxsZXJzIHRvIHByb2dyYW0gZnVuY3Rpb25zIHRoYXQgb25seQorICAvLyBoYXZlIGZhbGxiYWNrIGZ1bmN0aW9uIGNhbGxzIGluIHRhaWwgcG9zaXRpb24uIFRoaXMgc3Vic3RhbnRpYWxseSBpbXByb3ZlcworICAvLyBjb2RlIGZvciB0aGUgaGFwcHkgcGF0aC4KKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBib29sIE1heWJlQWxsb2NhdGVBbGlnbmVkKHNpemVfdCBuLCB2b2lkKiogb3V0KSB7CisgICAgU2VyaWFsQXJlbmEqIGFyZW5hOworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoIWFsbG9jX3BvbGljeV8uc2hvdWxkX3JlY29yZF9hbGxvY3MoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2VyaWFsQXJlbmFGcm9tVGhyZWFkQ2FjaGUoJmFyZW5hKSkpIHsKKyAgICAgIHJldHVybiBhcmVuYS0+TWF5YmVBbGxvY2F0ZUFsaWduZWQobiwgb3V0KTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjpwYWlyPHZvaWQqLCBTZXJpYWxBcmVuYTo6Q2xlYW51cE5vZGUqPiBBbGxvY2F0ZUFsaWduZWRXaXRoQ2xlYW51cCgKKyAgICAgIHNpemVfdCBuLCBjb25zdCBzdGQ6OnR5cGVfaW5mbyogdHlwZSk7CisKKyAgLy8gQWRkIG9iamVjdCBwb2ludGVyIGFuZCBjbGVhbnVwIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIGxpc3QuCisgIHZvaWQgQWRkQ2xlYW51cCh2b2lkKiBlbGVtLCB2b2lkICgqY2xlYW51cCkodm9pZCopKTsKKworICAvLyBDaGVja3Mgd2hldGhlciB0aGlzIGFyZW5hIGlzIG1lc3NhZ2Utb3duZWQuCisgIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgYm9vbCBJc01lc3NhZ2VPd25lZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gdGFnX2FuZF9pZF8gJiBrTWVzc2FnZU93bmVkQXJlbmE7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFVuaXF1ZSBmb3IgZWFjaCBhcmVuYS4gQ2hhbmdlcyBvbiBSZXNldCgpLgorICB1aW50NjRfdCB0YWdfYW5kX2lkXyA9IDA7CisgIC8vIFRoZSBMU0Igb2YgdGFnX2FuZF9pZF8gaW5kaWNhdGVzIGlmIHRoZSBhcmVuYSBpcyBtZXNzYWdlLW93bmVkLgorICBlbnVtIDogdWludDY0X3QgeyBrTWVzc2FnZU93bmVkQXJlbmEgPSAxIH07CisKKyAgVGFnZ2VkQWxsb2NhdGlvblBvbGljeVB0ciBhbGxvY19wb2xpY3lfOyAgLy8gVGFnZ2VkIHBvaW50ZXIgdG8gQWxsb2NQb2xpY3kuCisKKyAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGU8U2VyaWFsQXJlbmE+e30sCisgICAgICAgICAgICAgICAgIlNlcmlhbEFyZW5hIG5lZWRzIHRvIGJlIHRyaXZpYWxseSBkZXN0cnVjdGlibGUuIik7CisgIC8vIFBvaW50ZXIgdG8gYSBsaW5rZWQgbGlzdCBvZiBTZXJpYWxBcmVuYS4KKyAgc3RkOjphdG9taWM8U2VyaWFsQXJlbmEqPiB0aHJlYWRzXzsKKyAgc3RkOjphdG9taWM8U2VyaWFsQXJlbmEqPiBoaW50XzsgIC8vIEZhc3QgdGhyZWFkLWxvY2FsIGJsb2NrIGFjY2VzcworCisgIGNvbnN0IEFsbG9jYXRpb25Qb2xpY3kqIEFsbG9jUG9saWN5KCkgY29uc3QgeyByZXR1cm4gYWxsb2NfcG9saWN5Xy5nZXQoKTsgfQorICB2b2lkIEluaXRpYWxpemVGcm9tKHZvaWQqIG1lbSwgc2l6ZV90IHNpemUpOworICB2b2lkIEluaXRpYWxpemVXaXRoUG9saWN5KHZvaWQqIG1lbSwgc2l6ZV90IHNpemUsIEFsbG9jYXRpb25Qb2xpY3kgcG9saWN5KTsKKyAgdm9pZCogQWxsb2NhdGVBbGlnbmVkRmFsbGJhY2soc2l6ZV90IG4sIGNvbnN0IHN0ZDo6dHlwZV9pbmZvKiB0eXBlKTsKKyAgc3RkOjpwYWlyPHZvaWQqLCBTZXJpYWxBcmVuYTo6Q2xlYW51cE5vZGUqPgorICBBbGxvY2F0ZUFsaWduZWRXaXRoQ2xlYW51cEZhbGxiYWNrKHNpemVfdCBuLCBjb25zdCBzdGQ6OnR5cGVfaW5mbyogdHlwZSk7CisKKyAgdm9pZCBJbml0KCk7CisgIHZvaWQgU2V0SW5pdGlhbEJsb2NrKHZvaWQqIG1lbSwgc2l6ZV90IHNpemUpOworCisgIC8vIERlbGV0ZSBvciBEZXN0cnVjdCBhbGwgb2JqZWN0cyBvd25lZCBieSB0aGUgYXJlbmEuCisgIHZvaWQgQ2xlYW51cExpc3QoKTsKKworICBpbmxpbmUgdWludDY0X3QgTGlmZUN5Y2xlSWQoKSBjb25zdCB7CisgICAgcmV0dXJuIHRhZ19hbmRfaWRfICYgfmtNZXNzYWdlT3duZWRBcmVuYTsKKyAgfQorCisgIGlubGluZSB2b2lkIENhY2hlU2VyaWFsQXJlbmEoU2VyaWFsQXJlbmEqIHNlcmlhbCkgeworICAgIHRocmVhZF9jYWNoZSgpLmxhc3Rfc2VyaWFsX2FyZW5hID0gc2VyaWFsOworICAgIHRocmVhZF9jYWNoZSgpLmxhc3RfbGlmZWN5Y2xlX2lkX3NlZW4gPSB0YWdfYW5kX2lkXzsKKyAgICAvLyBUT0RPKGhhYmVybWFuKTogZXZhbHVhdGUgd2hldGhlciB3ZSB3b3VsZCBnYWluIGVmZmljaWVuY3kgYnkgZ2V0dGluZyByaWQKKyAgICAvLyBvZiBoaW50Xy4gIEl0J3MgdGhlIG9ubHkgd3JpdGUgd2UgZG8gdG8gVGhyZWFkU2FmZUFyZW5hIGluIHRoZSBhbGxvY2F0aW9uCisgICAgLy8gcGF0aCwgd2hpY2ggd2lsbCBkaXJ0eSB0aGUgY2FjaGUgbGluZS4KKworICAgIGhpbnRfLnN0b3JlKHNlcmlhbCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgIH0KKworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIGJvb2wgR2V0U2VyaWFsQXJlbmFGYXN0KFNlcmlhbEFyZW5hKiogYXJlbmEpIHsKKyAgICBpZiAoR2V0U2VyaWFsQXJlbmFGcm9tVGhyZWFkQ2FjaGUoYXJlbmEpKSByZXR1cm4gdHJ1ZTsKKworICAgIC8vIENoZWNrIHdoZXRoZXIgd2Ugb3duIHRoZSBsYXN0IGFjY2Vzc2VkIFNlcmlhbEFyZW5hIG9uIHRoaXMgYXJlbmEuICBUaGlzCisgICAgLy8gZmFzdCBwYXRoIG9wdGltaXplcyB0aGUgY2FzZSB3aGVyZSBhIHNpbmdsZSB0aHJlYWQgdXNlcyBtdWx0aXBsZSBhcmVuYXMuCisgICAgVGhyZWFkQ2FjaGUqIHRjID0gJnRocmVhZF9jYWNoZSgpOworICAgIFNlcmlhbEFyZW5hKiBzZXJpYWwgPSBoaW50Xy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc2VyaWFsICE9IG51bGxwdHIgJiYgc2VyaWFsLT5vd25lcigpID09IHRjKSkgeworICAgICAgKmFyZW5hID0gc2VyaWFsOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgYm9vbCBHZXRTZXJpYWxBcmVuYUZyb21UaHJlYWRDYWNoZSgKKyAgICAgIFNlcmlhbEFyZW5hKiogYXJlbmEpIHsKKyAgICAvLyBJZiB0aGlzIHRocmVhZCBhbHJlYWR5IG93bnMgYSBibG9jayBpbiB0aGlzIGFyZW5hIHRoZW4gdHJ5IHRvIHVzZSB0aGF0LgorICAgIC8vIFRoaXMgZmFzdCBwYXRoIG9wdGltaXplcyB0aGUgY2FzZSB3aGVyZSBtdWx0aXBsZSB0aHJlYWRzIGFsbG9jYXRlIGZyb20KKyAgICAvLyB0aGUgc2FtZSBhcmVuYS4KKyAgICBUaHJlYWRDYWNoZSogdGMgPSAmdGhyZWFkX2NhY2hlKCk7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRSh0Yy0+bGFzdF9saWZlY3ljbGVfaWRfc2VlbiA9PSB0YWdfYW5kX2lkXykpIHsKKyAgICAgICphcmVuYSA9IHRjLT5sYXN0X3NlcmlhbF9hcmVuYTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgU2VyaWFsQXJlbmEqIEdldFNlcmlhbEFyZW5hRmFsbGJhY2sodm9pZCogbWUpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdG9yPgorICB2b2lkIFBlclNlcmlhbEFyZW5hKEZ1bmN0b3IgZm4pIHsKKyAgICAvLyBCeSBvbWl0dGluZyBhbiBBY3F1aXJlIGJhcnJpZXIgd2UgZW5zdXJlIHRoYXQgYW55IHVzZXIgY29kZSB0aGF0IGRvZXNuJ3QKKyAgICAvLyBwcm9wZXJseSBzeW5jaHJvbml6ZSBSZXNldCgpIG9yIHRoZSBkZXN0cnVjdG9yIHdpbGwgdGhyb3cgYSBUU0FOIHdhcm5pbmcuCisgICAgU2VyaWFsQXJlbmEqIHNlcmlhbCA9IHRocmVhZHNfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisKKyAgICBmb3IgKDsgc2VyaWFsOyBzZXJpYWwgPSBzZXJpYWwtPm5leHQoKSkgZm4oc2VyaWFsKTsKKyAgfQorCisgIC8vIFJlbGVhc2VzIGFsbCBtZW1vcnkgZXhjZXB0IHRoZSBmaXJzdCBibG9jayB3aGljaCBpdCByZXR1cm5zLiBUaGUgZmlyc3QKKyAgLy8gYmxvY2sgbWlnaHQgYmUgb3duZWQgYnkgdGhlIHVzZXIgYW5kIHRodXMgbmVlZCBzb21lIGV4dHJhIGNoZWNrcyBiZWZvcmUKKyAgLy8gZGVsZXRpbmcuCisgIFNlcmlhbEFyZW5hOjpNZW1vcnkgRnJlZShzaXplX3QqIHNwYWNlX2FsbG9jYXRlZCk7CisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MzI0KQorI2VuZGlmCisgIHN0cnVjdCBhbGlnbmFzKGtDYWNoZUFsaWdubWVudCkgVGhyZWFkQ2FjaGUgeworI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRExPQ0FMKQorICAgIC8vIElmIHdlIGFyZSB1c2luZyB0aGUgVGhyZWFkTG9jYWxTdG9yYWdlIGNsYXNzIHRvIHN0b3JlIHRoZSBUaHJlYWRDYWNoZSwKKyAgICAvLyB0aGVuIHRoZSBUaHJlYWRDYWNoZSdzIGRlZmF1bHQgY29uc3RydWN0b3IgaGFzIHRvIGJlIHJlc3BvbnNpYmxlIGZvcgorICAgIC8vIGluaXRpYWxpemluZyBpdC4KKyAgICBUaHJlYWRDYWNoZSgpCisgICAgICAgIDogbmV4dF9saWZlY3ljbGVfaWQoMCksCisgICAgICAgICAgbGFzdF9saWZlY3ljbGVfaWRfc2VlbigtMSksCisgICAgICAgICAgbGFzdF9zZXJpYWxfYXJlbmEobnVsbHB0cikge30KKyNlbmRpZgorCisgICAgLy8gTnVtYmVyIG9mIHBlci10aHJlYWQgbGlmZWN5Y2xlIElEcyB0byByZXNlcnZlLiBNdXN0IGJlIHBvd2VyIG9mIHR3by4KKyAgICAvLyBUbyByZWR1Y2UgY29udGVudGlvbiBvbiBhIGdsb2JhbCBhdG9taWMsIGVhY2ggdGhyZWFkIHJlc2VydmVzIGEgYmF0Y2ggb2YKKyAgICAvLyBJRHMuICBUaGUgZm9sbG93aW5nIG51bWJlciBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIGEgc3RyZXNzIHRlc3Qgd2l0aAorICAgIC8vIH42NTAwIHRocmVhZHMgYWxsIGZyZXF1ZW50bHkgYWxsb2NhdGluZyBhIG5ldyBhcmVuYS4KKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrUGVyVGhyZWFkSWRzID0gMjU2OworICAgIC8vIE5leHQgbGlmZWN5Y2xlIElEIGF2YWlsYWJsZSB0byB0aGlzIHRocmVhZC4gV2UgbmVlZCB0byByZXNlcnZlIGEgbmV3CisgICAgLy8gYmF0Y2gsIGlmIGBuZXh0X2xpZmVjeWNsZV9pZCAmIChrUGVyVGhyZWFkSWRzIC0gMSkgPT0gMGAuCisgICAgdWludDY0X3QgbmV4dF9saWZlY3ljbGVfaWQ7CisgICAgLy8gVGhlIFRocmVhZENhY2hlIGlzIGNvbnNpZGVyZWQgdmFsaWQgYXMgbG9uZyBhcyB0aGlzIG1hdGNoZXMgdGhlCisgICAgLy8gbGlmZWN5Y2xlX2lkIG9mIHRoZSBhcmVuYSBiZWluZyB1c2VkLgorICAgIHVpbnQ2NF90IGxhc3RfbGlmZWN5Y2xlX2lkX3NlZW47CisgICAgU2VyaWFsQXJlbmEqIGxhc3Rfc2VyaWFsX2FyZW5hOworICB9OworCisgIC8vIExpZmVjeWNsZV9pZCBjYW4gYmUgaGlnaGx5IGNvbnRlbmRlZCB2YXJpYWJsZSBpbiBhIHNpdHVhdGlvbiBvZiBsb3RzIG9mCisgIC8vIGFyZW5hIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhhdCBvdGhlciBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3Qgc2hhcmluZyB0aGUKKyAgLy8gY2FjaGVsaW5lLgorI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQzMjQpCisjZW5kaWYKKyAgc3RydWN0IGFsaWduYXMoa0NhY2hlQWxpZ25tZW50KSBDYWNoZUFsaWduZWRMaWZlY3ljbGVJZEdlbmVyYXRvciB7CisgICAgc3RkOjphdG9taWM8TGlmZWN5Y2xlSWRBdG9taWM+IGlkOworICB9OworICBzdGF0aWMgQ2FjaGVBbGlnbmVkTGlmZWN5Y2xlSWRHZW5lcmF0b3IgbGlmZWN5Y2xlX2lkX2dlbmVyYXRvcl87CisjaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFETE9DQUwpCisgIC8vIGlPUyBkb2VzIG5vdCBzdXBwb3J0IF9fdGhyZWFkIGtleXdvcmQgc28gd2UgdXNlIGEgY3VzdG9tIHRocmVhZCBsb2NhbAorICAvLyBzdG9yYWdlIGNsYXNzIHdlIGltcGxlbWVudGVkLgorICBzdGF0aWMgVGhyZWFkQ2FjaGUmIHRocmVhZF9jYWNoZSgpOworI2VsaWYgZGVmaW5lZChQUk9UT0JVRl9VU0VfRExMUykKKyAgLy8gVGhyZWFkIGxvY2FsIHZhcmlhYmxlcyBjYW5ub3QgYmUgZXhwb3NlZCB0aHJvdWdoIERMTCBpbnRlcmZhY2UgYnV0IHdlIGNhbgorICAvLyB3cmFwIHRoZW0gaW4gc3RhdGljIGZ1bmN0aW9ucy4KKyAgc3RhdGljIFRocmVhZENhY2hlJiB0aHJlYWRfY2FjaGUoKTsKKyNlbHNlCisgIHN0YXRpYyBQUk9UT0JVRl9USFJFQURfTE9DQUwgVGhyZWFkQ2FjaGUgdGhyZWFkX2NhY2hlXzsKKyAgc3RhdGljIFRocmVhZENhY2hlJiB0aHJlYWRfY2FjaGUoKSB7IHJldHVybiB0aHJlYWRfY2FjaGVfOyB9CisjZW5kaWYKKworICBUaHJlYWRTYWZlQXJlbmFTdGF0c0hhbmRsZSBhcmVuYV9zdGF0c187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRocmVhZFNhZmVBcmVuYSk7CisgIC8vIEFsbCBwcm90b3MgaGF2ZSBwb2ludGVycyBiYWNrIHRvIHRoZSBhcmVuYSBoZW5jZSBBcmVuYSBtdXN0IGhhdmUKKyAgLy8gcG9pbnRlciBzdGFiaWxpdHkuCisgIFRocmVhZFNhZmVBcmVuYShUaHJlYWRTYWZlQXJlbmEmJikgPSBkZWxldGU7CisgIFRocmVhZFNhZmVBcmVuYSYgb3BlcmF0b3I9KFRocmVhZFNhZmVBcmVuYSYmKSA9IGRlbGV0ZTsKKworIHB1YmxpYzoKKyAgLy8ga0Jsb2NrSGVhZGVyU2l6ZSBpcyBzaXplb2YoQmxvY2spLCBhbGlnbmVkIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDgKKyAgLy8gdG8gcHJvdGVjdCB0aGUgaW52YXJpYW50IHRoYXQgcG9zIGlzIGFsd2F5cyBhdCBhIG11bHRpcGxlIG9mIDguCisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtCbG9ja0hlYWRlclNpemUgPSBTZXJpYWxBcmVuYTo6a0Jsb2NrSGVhZGVyU2l6ZTsKKyAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga1NlcmlhbEFyZW5hU2l6ZSA9CisgICAgICAoc2l6ZW9mKFNlcmlhbEFyZW5hKSArIDcpICYgc3RhdGljX2Nhc3Q8c2l6ZV90PigtOCk7CisgIHN0YXRpY19hc3NlcnQoa0Jsb2NrSGVhZGVyU2l6ZSAlIDggPT0gMCwKKyAgICAgICAgICAgICAgICAia0Jsb2NrSGVhZGVyU2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4iKTsKKyAgc3RhdGljX2Fzc2VydChrU2VyaWFsQXJlbmFTaXplICUgOCA9PSAwLAorICAgICAgICAgICAgICAgICJrU2VyaWFsQXJlbmFTaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQVJFTkFfSU1QTF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiNTA3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmNjCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKworI2RlZmluZSBFWFBFQ1RfRVEgR09PR0xFX0NIRUNLX0VRCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK05vSGVhcENoZWNrZXI6On5Ob0hlYXBDaGVja2VyKCkgeworICBjYXB0dXJlX2FsbG9jLlVuaG9vaygpOworICBFWFBFQ1RfRVEoMCwgY2FwdHVyZV9hbGxvYy5hbGxvY19jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDAsIGNhcHR1cmVfYWxsb2MuZnJlZV9jb3VudCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDJkNGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5oCkBAIC0wLDAgKzEsMTMyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQVJFTkFfVEVTVF9VVElMX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJFTkFfVEVTVF9VVElMX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIHVzZV9hcmVuYT4KK3ZvaWQgVGVzdFBhcnNlQ29ycnVwdGVkU3RyaW5nKGNvbnN0IFQmIG1lc3NhZ2UpIHsKKyAgaW50IHN1Y2Nlc3NfY291bnQgPSAwOworICBzdGQ6OnN0cmluZyBzOworICB7CisgICAgLy8gTWFwIG9yZGVyIGlzIG5vdCBkZXRlcm1pbmlzdGljLiBUbyBtYWtlIHRoZSB0ZXN0IGRldGVybWluaXN0aWMgd2Ugd2FudAorICAgIC8vIHRvIHNlcmlhbGl6ZSB0aGUgcHJvdG8gZGV0ZXJtaW5pc3RpY2FsbHkuCisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXQoJnMpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXQoJm91dHB1dCk7CisgICAgb3V0LlNldFNlcmlhbGl6YXRpb25EZXRlcm1pbmlzdGljKHRydWUpOworICAgIG1lc3NhZ2UuU2VyaWFsaXplUGFydGlhbFRvQ29kZWRTdHJlYW0oJm91dCk7CisgIH0KKyAgY29uc3QgaW50IGtNYXhJdGVycyA9IDkwMDsKKyAgY29uc3QgaW50IHN0cmlkZSA9IHMuc2l6ZSgpIDw9IGtNYXhJdGVycyA/IDEgOiBzLnNpemUoKSAvIGtNYXhJdGVyczsKKyAgY29uc3QgaW50IHN0YXJ0ID0gc3RyaWRlID09IDEgfHwgdXNlX2FyZW5hID8gMCA6IChzdHJpZGUgKyAxKSAvIDI7CisgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IHMuc2l6ZSgpOyBpICs9IHN0cmlkZSkgeworICAgIGZvciAoaW50IGMgPSAxICsgKGkgJSAxNyk7IGMgPCAyNTY7IGMgKz0gMiAqIGMgKyAoaSAmIDMpKSB7CisgICAgICBzW2ldIF49IGM7CisgICAgICBBcmVuYSBhcmVuYTsKKyAgICAgIFQqIG1lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUPih1c2VfYXJlbmEgPyAmYXJlbmEgOiBudWxscHRyKTsKKyAgICAgIGlmIChtZXNzYWdlLT5QYXJzZUZyb21TdHJpbmcocykpIHsKKyAgICAgICAgKytzdWNjZXNzX2NvdW50OworICAgICAgfQorICAgICAgaWYgKCF1c2VfYXJlbmEpIHsKKyAgICAgICAgZGVsZXRlIG1lc3NhZ2U7CisgICAgICB9CisgICAgICBzW2ldIF49IGM7ICAvLyBSZXN0b3JlIHMgdG8gaXRzIG9yaWdpbmFsIHN0YXRlLgorICAgIH0KKyAgfQorICAvLyBUaGlzIG5leHQgbGluZSBpcyBhIGxvdyBiYXIuICBCdXQgZ2V0dGluZyB0aHJvdWdoIHRoZSB0ZXN0IHdpdGhvdXQgY3Jhc2hpbmcKKyAgLy8gZHVlIHRvIHVzZS1hZnRlci1mcmVlIG9yIG90aGVyIGJ1Z3MgaXMgYSBiaWcgcGFydCBvZiB3aGF0IHdlJ3JlIGNoZWNraW5nLgorICBHT09HTEVfQ0hFQ0tfR1Qoc3VjY2Vzc19jb3VudCwgMCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3N0cnVjdCBBcmVuYVRlc3RQZWVyIHsKKyAgc3RhdGljIHZvaWQgUmV0dXJuQXJyYXlNZW1vcnkoQXJlbmEqIGFyZW5hLCB2b2lkKiBwLCBzaXplX3Qgc2l6ZSkgeworICAgIGFyZW5hLT5SZXR1cm5BcnJheU1lbW9yeShwLCBzaXplKTsKKyAgfQorfTsKKworY2xhc3MgTm9IZWFwQ2hlY2tlciB7CisgcHVibGljOgorICBOb0hlYXBDaGVja2VyKCkgeyBjYXB0dXJlX2FsbG9jLkhvb2soKTsgfQorICB+Tm9IZWFwQ2hlY2tlcigpOworCisgcHJpdmF0ZToKKyAgY2xhc3MgTmV3RGVsZXRlQ2FwdHVyZSB7CisgICBwdWJsaWM6CisgICAgLy8gVE9ETyh4aWFvZmVuZyk6IEltcGxlbWVudCB0aGlzIGZvciBvcGVuc291cmNlIHByb3RvYnVmLgorICAgIHZvaWQgSG9vaygpIHt9CisgICAgdm9pZCBVbmhvb2soKSB7fQorICAgIGludCBhbGxvY19jb3VudCgpIHsgcmV0dXJuIDA7IH0KKyAgICBpbnQgZnJlZV9jb3VudCgpIHsgcmV0dXJuIDA7IH0KKyAgfSBjYXB0dXJlX2FsbG9jOworfTsKKworLy8gT3ducyB0aGUgaW50ZXJuYWwgVCBvbmx5IGlmIGl0J3Mgbm90IG93bmVkIGJ5IGFuIGFyZW5hLgorLy8gVCBuZWVkcyB0byBiZSBhcmVuYSBjb25zdHJ1Y3RpYmxlIGFuZCBkZXN0cnVjdG9yIHNraXBwYWJsZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQXJlbmFIb2xkZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQXJlbmFIb2xkZXIoQXJlbmEqIGFyZW5hKQorICAgICAgOiBmaWVsZF8oQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VD4oYXJlbmEpKSwKKyAgICAgICAgb3duZWRfYnlfYXJlbmFfKGFyZW5hICE9IG51bGxwdHIpIHsKKyAgICBHT09HTEVfRENIRUNLKGdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjppc19hcmVuYV9jb25zdHJ1Y3RhYmxlPFQ+Ojp2YWx1ZSk7CisgICAgR09PR0xFX0RDSEVDSyhnb29nbGU6OnByb3RvYnVmOjpBcmVuYTo6aXNfZGVzdHJ1Y3Rvcl9za2lwcGFibGU8VD46OnZhbHVlKTsKKyAgfQorCisgIH5BcmVuYUhvbGRlcigpIHsKKyAgICBpZiAoIW93bmVkX2J5X2FyZW5hXykgeworICAgICAgZGVsZXRlIGZpZWxkXzsKKyAgICB9CisgIH0KKworICBUKiBnZXQoKSB7IHJldHVybiBmaWVsZF87IH0KKyAgVCogb3BlcmF0b3ItPigpIHsgcmV0dXJuIGZpZWxkXzsgfQorICBUJiBvcGVyYXRvciooKSB7IHJldHVybiAqZmllbGRfOyB9CisKKyBwcml2YXRlOgorICBUKiBmaWVsZF87CisgIGJvb2wgb3duZWRfYnlfYXJlbmFfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQVJFTkFfVEVTVF9VVElMX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYV91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzOWI0YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxNjM0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHR5cGVpbmZvPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wYi5oPgorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorCisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK3VzaW5nIHByb3RvMl9hcmVuYV91bml0dGVzdDo6QXJlbmFNZXNzYWdlOwordXNpbmcgcHJvdG9idWZfdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOwordXNpbmcgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOwordXNpbmcgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczsKK3VzaW5nIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlOwordXNpbmcgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RPbmVvZjI7CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgTm90aWZpZXIgeworIHB1YmxpYzoKKyAgTm90aWZpZXIoKSA6IGNvdW50XygwKSB7fQorICB2b2lkIE5vdGlmeSgpIHsgY291bnRfKys7IH0KKyAgaW50IEdldENvdW50KCkgeyByZXR1cm4gY291bnRfOyB9CisKKyBwcml2YXRlOgorICBpbnQgY291bnRfOworfTsKKworY2xhc3MgU2ltcGxlRGF0YVR5cGUgeworIHB1YmxpYzoKKyAgU2ltcGxlRGF0YVR5cGUoKSA6IG5vdGlmaWVyXyhOVUxMKSB7fQorICB2b2lkIFNldE5vdGlmaWVyKE5vdGlmaWVyKiBub3RpZmllcikgeyBub3RpZmllcl8gPSBub3RpZmllcjsgfQorICB2aXJ0dWFsIH5TaW1wbGVEYXRhVHlwZSgpIHsKKyAgICBpZiAobm90aWZpZXJfICE9IE5VTEwpIHsKKyAgICAgIG5vdGlmaWVyXy0+Tm90aWZ5KCk7CisgICAgfQorICB9OworCisgcHJpdmF0ZToKKyAgTm90aWZpZXIqIG5vdGlmaWVyXzsKK307CisKKy8vIEEgc2ltcGxlIGNsYXNzIHRoYXQgZG9lcyBub3QgYWxsb3cgY29weWluZyBhbmQgc28gY2Fubm90IGJlIHVzZWQgYXMgYQorLy8gcGFyYW1ldGVyIHR5cGUgd2l0aG91dCAiY29uc3QgJiIuCitjbGFzcyBQbGVhc2VEb250Q29weU1lIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFBsZWFzZURvbnRDb3B5TWUoaW50IHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KKworICBpbnQgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworIHByaXZhdGU6CisgIGludCB2YWx1ZV87CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQbGVhc2VEb250Q29weU1lKTsKK307CisKKy8vIEEgY2xhc3MgdGhhdCB0YWtlcyBmb3VyIGRpZmZlcmVudCB0eXBlcyBhcyBjb25zdHJ1Y3RvciBhcmd1bWVudHMuCitjbGFzcyBNdXN0QmVDb25zdHJ1Y3RlZFdpdGhPbmVUaHJvdWdoRm91ciB7CisgcHVibGljOgorICBNdXN0QmVDb25zdHJ1Y3RlZFdpdGhPbmVUaHJvdWdoRm91cihpbnQgb25lLCBjb25zdCBjaGFyKiB0d28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxlYXNlRG9udENvcHlNZSogZm91cikKKyAgICAgIDogb25lXyhvbmUpLCB0d29fKHR3byksIHRocmVlXyh0aHJlZSksIGZvdXJfKGZvdXIpIHt9CisKKyAgaW50IG9uZV87CisgIGNvbnN0IGNoYXIqIGNvbnN0IHR3b187CisgIHN0ZDo6c3RyaW5nIHRocmVlXzsKKyAgY29uc3QgUGxlYXNlRG9udENvcHlNZSogZm91cl87CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXVzdEJlQ29uc3RydWN0ZWRXaXRoT25lVGhyb3VnaEZvdXIpOworfTsKKworLy8gQSBjbGFzcyB0aGF0IHRha2VzIGVpZ2h0IGRpZmZlcmVudCB0eXBlcyBhcyBjb25zdHJ1Y3RvciBhcmd1bWVudHMuCitjbGFzcyBNdXN0QmVDb25zdHJ1Y3RlZFdpdGhPbmVUaHJvdWdoRWlnaHQgeworIHB1YmxpYzoKKyAgTXVzdEJlQ29uc3RydWN0ZWRXaXRoT25lVGhyb3VnaEVpZ2h0KGludCBvbmUsIGNvbnN0IGNoYXIqIHR3bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsZWFzZURvbnRDb3B5TWUqIGZvdXIsIGludCBmaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2l4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNldmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVpZ2h0KQorICAgICAgOiBvbmVfKG9uZSksCisgICAgICAgIHR3b18odHdvKSwKKyAgICAgICAgdGhyZWVfKHRocmVlKSwKKyAgICAgICAgZm91cl8oZm91ciksCisgICAgICAgIGZpdmVfKGZpdmUpLAorICAgICAgICBzaXhfKHNpeCksCisgICAgICAgIHNldmVuXyhzZXZlbiksCisgICAgICAgIGVpZ2h0XyhlaWdodCkge30KKworICBpbnQgb25lXzsKKyAgY29uc3QgY2hhciogY29uc3QgdHdvXzsKKyAgc3RkOjpzdHJpbmcgdGhyZWVfOworICBjb25zdCBQbGVhc2VEb250Q29weU1lKiBmb3VyXzsKKyAgaW50IGZpdmVfOworICBjb25zdCBjaGFyKiBjb25zdCBzaXhfOworICBzdGQ6OnN0cmluZyBzZXZlbl87CisgIHN0ZDo6c3RyaW5nIGVpZ2h0XzsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNdXN0QmVDb25zdHJ1Y3RlZFdpdGhPbmVUaHJvdWdoRWlnaHQpOworfTsKKworVEVTVChBcmVuYVRlc3QsIEFyZW5hQ29uc3RydWN0YWJsZSkgeworICBFWFBFQ1RfVFJVRShBcmVuYTo6aXNfYXJlbmFfY29uc3RydWN0YWJsZTxUZXN0QWxsVHlwZXM+Ojp0eXBlOjp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKEFyZW5hOjppc19hcmVuYV9jb25zdHJ1Y3RhYmxlPGNvbnN0IFRlc3RBbGxUeXBlcz46OnR5cGU6OnZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKEFyZW5hOjppc19hcmVuYV9jb25zdHJ1Y3RhYmxlPEFyZW5hPjo6dHlwZTo6dmFsdWUpOworfQorCitURVNUKEFyZW5hVGVzdCwgRGVzdHJ1Y3RvclNraXBwYWJsZSkgeworICBFWFBFQ1RfVFJVRShBcmVuYTo6aXNfZGVzdHJ1Y3Rvcl9za2lwcGFibGU8VGVzdEFsbFR5cGVzPjo6dHlwZTo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShBcmVuYTo6aXNfZGVzdHJ1Y3Rvcl9za2lwcGFibGU8Y29uc3QgVGVzdEFsbFR5cGVzPjo6dHlwZTo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoQXJlbmE6OmlzX2Rlc3RydWN0b3Jfc2tpcHBhYmxlPEFyZW5hPjo6dHlwZTo6dmFsdWUpOworfQorCitURVNUKEFyZW5hVGVzdCwgQmFzaWNDcmVhdGUpIHsKKyAgQXJlbmEgYXJlbmE7CisgIEVYUEVDVF9UUlVFKEFyZW5hOjpDcmVhdGU8aW50MzJfdD4oJmFyZW5hKSAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoQXJlbmE6OkNyZWF0ZTxpbnQ2NF90PigmYXJlbmEpICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShBcmVuYTo6Q3JlYXRlPGZsb2F0PigmYXJlbmEpICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShBcmVuYTo6Q3JlYXRlPGRvdWJsZT4oJmFyZW5hKSAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoQXJlbmE6OkNyZWF0ZTxzdGQ6OnN0cmluZz4oJmFyZW5hKSAhPSBOVUxMKTsKKyAgYXJlbmEuT3duKG5ldyBpbnQzMl90KTsKKyAgYXJlbmEuT3duKG5ldyBpbnQ2NF90KTsKKyAgYXJlbmEuT3duKG5ldyBmbG9hdCk7CisgIGFyZW5hLk93bihuZXcgZG91YmxlKTsKKyAgYXJlbmEuT3duKG5ldyBzdGQ6OnN0cmluZyk7CisgIGFyZW5hLk93bjxpbnQ+KE5VTEwpOworICBOb3RpZmllciBub3RpZmllcjsKKyAgU2ltcGxlRGF0YVR5cGUqIGRhdGEgPSBBcmVuYTo6Q3JlYXRlPFNpbXBsZURhdGFUeXBlPigmYXJlbmEpOworICBkYXRhLT5TZXROb3RpZmllcigmbm90aWZpZXIpOworICBkYXRhID0gbmV3IFNpbXBsZURhdGFUeXBlOworICBkYXRhLT5TZXROb3RpZmllcigmbm90aWZpZXIpOworICBhcmVuYS5Pd24oZGF0YSk7CisgIGFyZW5hLlJlc2V0KCk7CisgIEVYUEVDVF9FUSgyLCBub3RpZmllci5HZXRDb3VudCgpKTsKK30KKworVEVTVChBcmVuYVRlc3QsIENyZWF0ZUFuZENvbnN0Q29weSkgeworICBBcmVuYSBhcmVuYTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcygiZm9vIik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nKiBzX2NvcHkgPSBBcmVuYTo6Q3JlYXRlPHN0ZDo6c3RyaW5nPigmYXJlbmEsIHMpOworICBFWFBFQ1RfVFJVRShzX2NvcHkgIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgiZm9vIiwgcyk7CisgIEVYUEVDVF9FUSgiZm9vIiwgKnNfY29weSk7Cit9CisKK1RFU1QoQXJlbmFUZXN0LCBDcmVhdGVBbmROb25Db25zdENvcHkpIHsKKyAgQXJlbmEgYXJlbmE7CisgIHN0ZDo6c3RyaW5nIHMoImZvbyIpOworICBjb25zdCBzdGQ6OnN0cmluZyogc19jb3B5ID0gQXJlbmE6OkNyZWF0ZTxzdGQ6OnN0cmluZz4oJmFyZW5hLCBzKTsKKyAgRVhQRUNUX1RSVUUoc19jb3B5ICE9IE5VTEwpOworICBFWFBFQ1RfRVEoImZvbyIsIHMpOworICBFWFBFQ1RfRVEoImZvbyIsICpzX2NvcHkpOworfQorCitURVNUKEFyZW5hVGVzdCwgQ3JlYXRlQW5kTW92ZSkgeworICBBcmVuYSBhcmVuYTsKKyAgc3RkOjpzdHJpbmcgcygiZm9vIik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nKiBzX21vdmUgPSBBcmVuYTo6Q3JlYXRlPHN0ZDo6c3RyaW5nPigmYXJlbmEsIHN0ZDo6bW92ZShzKSk7CisgIEVYUEVDVF9UUlVFKHNfbW92ZSAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUocy5lbXB0eSgpKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoImZvbyIsICpzX21vdmUpOworfQorCitURVNUKEFyZW5hVGVzdCwgQ3JlYXRlV2l0aEZvdXJDb25zdHJ1Y3RvckFyZ3VtZW50cykgeworICBBcmVuYSBhcmVuYTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgdGhyZWUoIjMiKTsKKyAgY29uc3QgUGxlYXNlRG9udENvcHlNZSBmb3VyKDQpOworICBjb25zdCBNdXN0QmVDb25zdHJ1Y3RlZFdpdGhPbmVUaHJvdWdoRm91ciogbmV3X29iamVjdCA9CisgICAgICBBcmVuYTo6Q3JlYXRlPE11c3RCZUNvbnN0cnVjdGVkV2l0aE9uZVRocm91Z2hGb3VyPigmYXJlbmEsIDEsICIyIiwgdGhyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm91cik7CisgIEVYUEVDVF9UUlVFKG5ld19vYmplY3QgIT0gTlVMTCk7CisgIEFTU0VSVF9FUSgxLCBuZXdfb2JqZWN0LT5vbmVfKTsKKyAgQVNTRVJUX1NUUkVRKCIyIiwgbmV3X29iamVjdC0+dHdvXyk7CisgIEFTU0VSVF9FUSgiMyIsIG5ld19vYmplY3QtPnRocmVlXyk7CisgIEFTU0VSVF9FUSg0LCBuZXdfb2JqZWN0LT5mb3VyXy0+dmFsdWUoKSk7Cit9CisKK1RFU1QoQXJlbmFUZXN0LCBDcmVhdGVXaXRoRWlnaHRDb25zdHJ1Y3RvckFyZ3VtZW50cykgeworICBBcmVuYSBhcmVuYTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgdGhyZWUoIjMiKTsKKyAgY29uc3QgUGxlYXNlRG9udENvcHlNZSBmb3VyKDQpOworICBjb25zdCBzdGQ6OnN0cmluZyBzZXZlbigiNyIpOworICBjb25zdCBzdGQ6OnN0cmluZyBlaWdodCgiOCIpOworICBjb25zdCBNdXN0QmVDb25zdHJ1Y3RlZFdpdGhPbmVUaHJvdWdoRWlnaHQqIG5ld19vYmplY3QgPQorICAgICAgQXJlbmE6OkNyZWF0ZTxNdXN0QmVDb25zdHJ1Y3RlZFdpdGhPbmVUaHJvdWdoRWlnaHQ+KAorICAgICAgICAgICZhcmVuYSwgMSwgIjIiLCB0aHJlZSwgJmZvdXIsIDUsICI2Iiwgc2V2ZW4sIGVpZ2h0KTsKKyAgRVhQRUNUX1RSVUUobmV3X29iamVjdCAhPSBOVUxMKTsKKyAgQVNTRVJUX0VRKDEsIG5ld19vYmplY3QtPm9uZV8pOworICBBU1NFUlRfU1RSRVEoIjIiLCBuZXdfb2JqZWN0LT50d29fKTsKKyAgQVNTRVJUX0VRKCIzIiwgbmV3X29iamVjdC0+dGhyZWVfKTsKKyAgQVNTRVJUX0VRKDQsIG5ld19vYmplY3QtPmZvdXJfLT52YWx1ZSgpKTsKKyAgQVNTRVJUX0VRKDUsIG5ld19vYmplY3QtPmZpdmVfKTsKKyAgQVNTRVJUX1NUUkVRKCI2IiwgbmV3X29iamVjdC0+c2l4Xyk7CisgIEFTU0VSVF9FUSgiNyIsIG5ld19vYmplY3QtPnNldmVuXyk7CisgIEFTU0VSVF9FUSgiOCIsIG5ld19vYmplY3QtPmVpZ2h0Xyk7Cit9CisKK2NsYXNzIFBsZWFzZU1vdmVNZSB7CisgcHVibGljOgorICBleHBsaWNpdCBQbGVhc2VNb3ZlTWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KKyAgUGxlYXNlTW92ZU1lKFBsZWFzZU1vdmVNZSYmKSA9IGRlZmF1bHQ7CisgIFBsZWFzZU1vdmVNZShjb25zdCBQbGVhc2VNb3ZlTWUmKSA9IGRlbGV0ZTsKKworICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIHZhbHVlXzsKK307CisKK1RFU1QoQXJlbmFUZXN0LCBDcmVhdGVXaXRoTW92ZUFyZ3VtZW50cykgeworICBBcmVuYSBhcmVuYTsKKyAgUGxlYXNlTW92ZU1lIG9uZSgiMSIpOworICBjb25zdCBQbGVhc2VNb3ZlTWUqIG5ld19vYmplY3QgPQorICAgICAgQXJlbmE6OkNyZWF0ZTxQbGVhc2VNb3ZlTWU+KCZhcmVuYSwgc3RkOjptb3ZlKG9uZSkpOworICBFWFBFQ1RfVFJVRShuZXdfb2JqZWN0KTsKKyAgQVNTRVJUX0VRKCIxIiwgbmV3X29iamVjdC0+dmFsdWUoKSk7Cit9CisKK1RFU1QoQXJlbmFUZXN0LCBJbml0aWFsQmxvY2tUb29TbWFsbCkgeworICAvLyBDb25zdHJ1Y3QgYSBzbWFsbCBibG9ja3Mgb2YgbWVtb3J5IHRvIGJlIHVzZWQgYnkgdGhlIGFyZW5hIGFsbG9jYXRvcjsgdGhlbiwKKyAgLy8gYWxsb2NhdGUgYW4gb2JqZWN0IHdoaWNoIHdpbGwgbm90IGZpdCBpbiB0aGUgaW5pdGlhbCBibG9jay4KKyAgZm9yIChpbnQgc2l6ZSA9IDA7IHNpemUgPD0gQXJlbmE6OmtCbG9ja092ZXJoZWFkICsgMzI7IHNpemUrKykgeworICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGFyZW5hX2Jsb2NrKHNpemUpOworICAgIEFyZW5hT3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuaW5pdGlhbF9ibG9jayA9IGFyZW5hX2Jsb2NrLmRhdGEoKTsKKyAgICBvcHRpb25zLmluaXRpYWxfYmxvY2tfc2l6ZSA9IGFyZW5hX2Jsb2NrLnNpemUoKTsKKworICAgIC8vIFRyeSBzb21ldGltZXMgd2l0aCBub24tZGVmYXVsdCBibG9jayBzaXplcyBzbyB0aGF0IHdlIGV4ZXJjaXNlIHBhdGhzCisgICAgLy8gd2l0aCBhbmQgd2l0aG91dCBBcmVuYUltcGw6Ok9wdGlvbnMuCisgICAgaWYgKChzaXplICUgMikgIT0gMCkgeworICAgICAgb3B0aW9ucy5zdGFydF9ibG9ja19zaXplICs9IDg7CisgICAgfQorCisgICAgQXJlbmEgYXJlbmEob3B0aW9ucyk7CisKKyAgICBjaGFyKiBwID0gQXJlbmE6OkNyZWF0ZUFycmF5PGNoYXI+KCZhcmVuYSwgOTYpOworICAgIHVpbnRwdHJfdCBhbGxvY2F0aW9uID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHApOworCisgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGFyZW5hIGFsbG9jYXRvciBkaWQgbm90IHJldHVybiBtZW1vcnkgcG9pbnRpbmcgaW50byB0aGUKKyAgICAvLyBpbml0aWFsIGJsb2NrIG9mIG1lbW9yeS4KKyAgICB1aW50cHRyX3QgYXJlbmFfc3RhcnQgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oYXJlbmFfYmxvY2suZGF0YSgpKTsKKyAgICB1aW50cHRyX3QgYXJlbmFfZW5kID0gYXJlbmFfc3RhcnQgKyBhcmVuYV9ibG9jay5zaXplKCk7CisgICAgRVhQRUNUX0ZBTFNFKGFsbG9jYXRpb24gPj0gYXJlbmFfc3RhcnQgJiYgYWxsb2NhdGlvbiA8IGFyZW5hX2VuZCk7CisKKyAgICAvLyBXcml0ZSB0byB0aGUgbWVtb3J5IHdlIGFsbG9jYXRlZDsgdGhpcyBzaG91bGQgKGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0bykKKyAgICAvLyB0cmlnZ2VyIGEgY2hlY2sgZm9yIGhlYXAgY29ycnVwdGlvbiBpZiB0aGUgb2JqZWN0IHdhcyBhbGxvY2F0ZWQgZnJvbSB0aGUKKyAgICAvLyBpbml0aWFsbHktcHJvdmlkZWQgYmxvY2suCisgICAgbWVtc2V0KHAsICdcMCcsIDk2KTsKKyAgfQorfQorCitURVNUKEFyZW5hVGVzdCwgUGFyc2luZykgeworICBUZXN0QWxsVHlwZXMgb3JpZ2luYWw7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm9yaWdpbmFsKTsKKworICAvLyBUZXN0IG1lbW9yeSBsZWFrLgorICBBcmVuYSBhcmVuYTsKKyAgVGVzdEFsbFR5cGVzKiBhcmVuYV9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEpOworICBhcmVuYV9tZXNzYWdlLT5QYXJzZUZyb21TdHJpbmcob3JpZ2luYWwuU2VyaWFsaXplQXNTdHJpbmcoKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoKmFyZW5hX21lc3NhZ2UpOworCisgIC8vIFRlc3QgdGhhdCBzdHJpbmcgZmllbGRzIGhhdmUgbnVsIHRlcm1pbmF0b3IgYnl0ZXMgKGVhcmxpZXIgYnVnKS4KKyAgRVhQRUNUX0VRKHN0cmxlbihvcmlnaW5hbC5vcHRpb25hbF9zdHJpbmcoKS5jX3N0cigpKSwKKyAgICAgICAgICAgIHN0cmxlbihhcmVuYV9tZXNzYWdlLT5vcHRpb25hbF9zdHJpbmcoKS5jX3N0cigpKSk7Cit9CisKK1RFU1QoQXJlbmFUZXN0LCBVbmtub3duRmllbGRzKSB7CisgIFRlc3RBbGxUeXBlcyBvcmlnaW5hbDsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmb3JpZ2luYWwpOworCisgIC8vIFRlc3QgYmFzaWMgcGFyc2luZyBpbnRvIChwb3B1bGF0aW5nKSBhbmQgcmVhZGluZyBvdXQgb2YgdW5rbm93biBmaWVsZHMgb24KKyAgLy8gYW4gYXJlbmEuCisgIEFyZW5hIGFyZW5hOworICBUZXN0RW1wdHlNZXNzYWdlKiBhcmVuYV9tZXNzYWdlID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RFbXB0eU1lc3NhZ2U+KCZhcmVuYSk7CisgIGFyZW5hX21lc3NhZ2UtPlBhcnNlRnJvbVN0cmluZyhvcmlnaW5hbC5TZXJpYWxpemVBc1N0cmluZygpKTsKKworICBUZXN0QWxsVHlwZXMgY29waWVkOworICBjb3BpZWQuUGFyc2VGcm9tU3RyaW5nKGFyZW5hX21lc3NhZ2UtPlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KGNvcGllZCk7CisKKyAgLy8gRXhlcmNpc2UgVUZTIG1hbnVhbCBtYW5pcHVsYXRpb24gKHNldHRlcnMpLgorICBhcmVuYV9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEVtcHR5TWVzc2FnZT4oJmFyZW5hKTsKKyAgYXJlbmFfbWVzc2FnZS0+bXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoCisgICAgICBUZXN0QWxsVHlwZXM6OmtPcHRpb25hbEludDMyRmllbGROdW1iZXIsIDQyKTsKKyAgY29waWVkLkNsZWFyKCk7CisgIGNvcGllZC5QYXJzZUZyb21TdHJpbmcoYXJlbmFfbWVzc2FnZS0+U2VyaWFsaXplQXNTdHJpbmcoKSk7CisgIEVYUEVDVF9UUlVFKGNvcGllZC5oYXNfb3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSg0MiwgY29waWVkLm9wdGlvbmFsX2ludDMyKCkpOworCisgIC8vIEV4ZXJjaXNlIFVGUyBzd2FwIHBhdGguCisgIFRlc3RFbXB0eU1lc3NhZ2UqIGFyZW5hX21lc3NhZ2VfMiA9CisgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0RW1wdHlNZXNzYWdlPigmYXJlbmEpOworICBhcmVuYV9tZXNzYWdlXzItPlN3YXAoYXJlbmFfbWVzc2FnZSk7CisgIGNvcGllZC5DbGVhcigpOworICBjb3BpZWQuUGFyc2VGcm9tU3RyaW5nKGFyZW5hX21lc3NhZ2VfMi0+U2VyaWFsaXplQXNTdHJpbmcoKSk7CisgIEVYUEVDVF9UUlVFKGNvcGllZC5oYXNfb3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSg0MiwgY29waWVkLm9wdGlvbmFsX2ludDMyKCkpOworCisgIC8vIFRlc3QgZmllbGQgbWFuaXB1bGF0aW9uLgorICBUZXN0RW1wdHlNZXNzYWdlKiBhcmVuYV9tZXNzYWdlXzMgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEVtcHR5TWVzc2FnZT4oJmFyZW5hKTsKKyAgYXJlbmFfbWVzc2FnZV8zLT5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgxMDAwLCA0Mik7CisgIGFyZW5hX21lc3NhZ2VfMy0+bXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRGaXhlZDMyKDEwMDEsIDQyKTsKKyAgYXJlbmFfbWVzc2FnZV8zLT5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZEZpeGVkNjQoMTAwMiwgNDIpOworICBhcmVuYV9tZXNzYWdlXzMtPm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkTGVuZ3RoRGVsaW1pdGVkKDEwMDMpOworICBhcmVuYV9tZXNzYWdlXzMtPm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+RGVsZXRlU3VicmFuZ2UoMCwgMik7CisgIGFyZW5hX21lc3NhZ2VfMy0+bXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5EZWxldGVCeU51bWJlcigxMDAyKTsKKyAgYXJlbmFfbWVzc2FnZV8zLT5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkRlbGV0ZUJ5TnVtYmVyKDEwMDMpOworICBFWFBFQ1RfVFJVRShhcmVuYV9tZXNzYWdlXzMtPnVua25vd25fZmllbGRzKCkuZW1wdHkoKSk7Cit9CisKK1RFU1QoQXJlbmFUZXN0LCBTd2FwKSB7CisgIEFyZW5hIGFyZW5hMTsKKyAgQXJlbmEgYXJlbmEyOworICBUZXN0QWxsVHlwZXMqIGFyZW5hMV9tZXNzYWdlOworICBUZXN0QWxsVHlwZXMqIGFyZW5hMl9tZXNzYWdlOworCisgIC8vIENhc2UgMTogU3dhcCgpLCBubyBVRlMgb24gZWl0aGVyIG1lc3NhZ2UsIGJvdGggbWVzc2FnZXMgb24gZGlmZmVyZW50CisgIC8vIGFyZW5hcy4gQXJlbmEgcG9pbnRlcnMgc2hvdWxkIHJlbWFpbiB0aGUgc2FtZSBhZnRlciBzd2FwLgorICBhcmVuYTFfbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hMSk7CisgIGFyZW5hMl9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEyKTsKKyAgYXJlbmExX21lc3NhZ2UtPlN3YXAoYXJlbmEyX21lc3NhZ2UpOworICBFWFBFQ1RfRVEoJmFyZW5hMSwgYXJlbmExX21lc3NhZ2UtPkdldEFyZW5hKCkpOworICBFWFBFQ1RfRVEoJmFyZW5hMiwgYXJlbmEyX21lc3NhZ2UtPkdldEFyZW5hKCkpOworCisgIC8vIENhc2UgMjogU3dhcCgpLCBVRlMgb24gb25lIG1lc3NhZ2UsIGJvdGggbWVzc2FnZXMgb24gZGlmZmVyZW50IGFyZW5hcy4KKyAgYXJlbmExX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYTEpOworICBhcmVuYTJfbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hMik7CisgIGFyZW5hMV9tZXNzYWdlLT5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgxLCA0Mik7CisgIGFyZW5hMV9tZXNzYWdlLT5Td2FwKGFyZW5hMl9tZXNzYWdlKTsKKyAgRVhQRUNUX0VRKCZhcmVuYTEsIGFyZW5hMV9tZXNzYWdlLT5HZXRBcmVuYSgpKTsKKyAgRVhQRUNUX0VRKCZhcmVuYTIsIGFyZW5hMl9tZXNzYWdlLT5HZXRBcmVuYSgpKTsKKyAgRVhQRUNUX0VRKDAsIGFyZW5hMV9tZXNzYWdlLT51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwgYXJlbmEyX21lc3NhZ2UtPnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSg0MiwgYXJlbmEyX21lc3NhZ2UtPnVua25vd25fZmllbGRzKCkuZmllbGQoMCkudmFyaW50KCkpOworCisgIC8vIENhc2UgMzogU3dhcCgpLCBVRlMgb24gYm90aCBtZXNzYWdlcywgYm90aCBtZXNzYWdlcyBvbiBkaWZmZXJlbnQgYXJlbmFzLgorICBhcmVuYTFfbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hMSk7CisgIGFyZW5hMl9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEyKTsKKyAgYXJlbmExX21lc3NhZ2UtPm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEsIDQyKTsKKyAgYXJlbmEyX21lc3NhZ2UtPm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDIsIDg0KTsKKyAgYXJlbmExX21lc3NhZ2UtPlN3YXAoYXJlbmEyX21lc3NhZ2UpOworICBFWFBFQ1RfRVEoJmFyZW5hMSwgYXJlbmExX21lc3NhZ2UtPkdldEFyZW5hKCkpOworICBFWFBFQ1RfRVEoJmFyZW5hMiwgYXJlbmEyX21lc3NhZ2UtPkdldEFyZW5hKCkpOworICBFWFBFQ1RfRVEoMSwgYXJlbmExX21lc3NhZ2UtPnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLCBhcmVuYTJfbWVzc2FnZS0+dW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDg0LCBhcmVuYTFfbWVzc2FnZS0+dW5rbm93bl9maWVsZHMoKS5maWVsZCgwKS52YXJpbnQoKSk7CisgIEVYUEVDVF9FUSg0MiwgYXJlbmEyX21lc3NhZ2UtPnVua25vd25fZmllbGRzKCkuZmllbGQoMCkudmFyaW50KCkpOworfQorCitURVNUKEFyZW5hVGVzdCwgUmVmbGVjdGlvblN3YXBGaWVsZHMpIHsKKyAgQXJlbmEgYXJlbmExOworICBBcmVuYSBhcmVuYTI7CisgIFRlc3RBbGxUeXBlcyogYXJlbmExX21lc3NhZ2U7CisgIFRlc3RBbGxUeXBlcyogYXJlbmEyX21lc3NhZ2U7CisKKyAgLy8gQ2FzZSAxOiBtZXNzYWdlcyBvbiBkaWZmZXJlbnQgYXJlbmFzLCBvbmx5IG9uZSBtZXNzYWdlIGlzIHNldC4KKyAgYXJlbmExX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYTEpOworICBhcmVuYTJfbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hMik7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoYXJlbmExX21lc3NhZ2UpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gYXJlbmExX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKCphcmVuYTFfbWVzc2FnZSwgJmZpZWxkcyk7CisgIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMoYXJlbmExX21lc3NhZ2UsIGFyZW5hMl9tZXNzYWdlLCBmaWVsZHMpOworICBFWFBFQ1RfRVEoJmFyZW5hMSwgYXJlbmExX21lc3NhZ2UtPkdldEFyZW5hKCkpOworICBFWFBFQ1RfRVEoJmFyZW5hMiwgYXJlbmEyX21lc3NhZ2UtPkdldEFyZW5hKCkpOworICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisgIGFyZW5hMV9tZXNzYWdlLT5TZXJpYWxpemVUb1N0cmluZygmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKDAsIG91dHB1dC5zaXplKCkpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KCphcmVuYTJfbWVzc2FnZSk7CisgIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMoYXJlbmExX21lc3NhZ2UsIGFyZW5hMl9tZXNzYWdlLCBmaWVsZHMpOworICBhcmVuYTJfbWVzc2FnZS0+U2VyaWFsaXplVG9TdHJpbmcoJm91dHB1dCk7CisgIEVYUEVDVF9FUSgwLCBvdXRwdXQuc2l6ZSgpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldCgqYXJlbmExX21lc3NhZ2UpOworCisgIC8vIENhc2UgMjogbWVzc2FnZXMgb24gZGlmZmVyZW50IGFyZW5hcywgYm90aCBtZXNzYWdlcyBhcmUgc2V0LgorICBhcmVuYTFfbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hMSk7CisgIGFyZW5hMl9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEyKTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcyhhcmVuYTFfbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoYXJlbmEyX21lc3NhZ2UpOworICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKGFyZW5hMV9tZXNzYWdlLCBhcmVuYTJfbWVzc2FnZSwgZmllbGRzKTsKKyAgRVhQRUNUX0VRKCZhcmVuYTEsIGFyZW5hMV9tZXNzYWdlLT5HZXRBcmVuYSgpKTsKKyAgRVhQRUNUX0VRKCZhcmVuYTIsIGFyZW5hMl9tZXNzYWdlLT5HZXRBcmVuYSgpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldCgqYXJlbmExX21lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KCphcmVuYTJfbWVzc2FnZSk7CisKKyAgLy8gQ2FzZSAzOiBtZXNzYWdlcyBvbiBkaWZmZXJlbnQgYXJlbmFzIHdpdGggZGlmZmVyZW50IGxpZmV0aW1lcy4KKyAgYXJlbmExX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYTEpOworICB7CisgICAgQXJlbmEgYXJlbmEzOworICAgIFRlc3RBbGxUeXBlcyogYXJlbmEzX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYTMpOworICAgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoYXJlbmEzX21lc3NhZ2UpOworICAgIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMoYXJlbmExX21lc3NhZ2UsIGFyZW5hM19tZXNzYWdlLCBmaWVsZHMpOworICB9CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoKmFyZW5hMV9tZXNzYWdlKTsKKworICAvLyBDYXNlIDQ6IG9uZSBtZXNzYWdlIG9uIGFyZW5hLCB0aGUgb3RoZXIgb24gaGVhcC4KKyAgYXJlbmExX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYTEpOworICBUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcyhhcmVuYTFfbWVzc2FnZSk7CisgIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMoYXJlbmExX21lc3NhZ2UsICZtZXNzYWdlLCBmaWVsZHMpOworICBFWFBFQ1RfRVEoJmFyZW5hMSwgYXJlbmExX21lc3NhZ2UtPkdldEFyZW5hKCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgbWVzc2FnZS5HZXRBcmVuYSgpKTsKKyAgYXJlbmExX21lc3NhZ2UtPlNlcmlhbGl6ZVRvU3RyaW5nKCZvdXRwdXQpOworICBFWFBFQ1RfRVEoMCwgb3V0cHV0LnNpemUoKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoQXJlbmFUZXN0LCBTZXRBbGxvY2F0ZWRNZXNzYWdlKSB7CisgIEFyZW5hIGFyZW5hOworICBUZXN0QWxsVHlwZXMqIGFyZW5hX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogbmVzdGVkID0gbmV3IFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZTsKKyAgbmVzdGVkLT5zZXRfYmIoMTE4KTsKKyAgYXJlbmFfbWVzc2FnZS0+c2V0X2FsbG9jYXRlZF9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZShuZXN0ZWQpOworICBFWFBFQ1RfRVEoMTE4LCBhcmVuYV9tZXNzYWdlLT5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworfQorCitURVNUKEFyZW5hVGVzdCwgUmVsZWFzZU1lc3NhZ2UpIHsKKyAgQXJlbmEgYXJlbmE7CisgIFRlc3RBbGxUeXBlcyogYXJlbmFfbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hKTsKKyAgYXJlbmFfbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMTE4KTsKKyAgc3RkOjp1bmlxdWVfcHRyPFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZT4gbmVzdGVkKAorICAgICAgYXJlbmFfbWVzc2FnZS0+cmVsZWFzZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKDExOCwgbmVzdGVkLT5iYigpKTsKKworICBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIHJlbGVhc2VkX251bGwgPQorICAgICAgYXJlbmFfbWVzc2FnZS0+cmVsZWFzZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworICBFWFBFQ1RfRVEoTlVMTCwgcmVsZWFzZWRfbnVsbCk7Cit9CisKK1RFU1QoQXJlbmFUZXN0LCBTZXRBbGxvY2F0ZWRTdHJpbmcpIHsKKyAgQXJlbmEgYXJlbmE7CisgIFRlc3RBbGxUeXBlcyogYXJlbmFfbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hKTsKKyAgc3RkOjpzdHJpbmcqIGFsbG9jYXRlZF9zdHIgPSBuZXcgc3RkOjpzdHJpbmcoImhlbGxvIik7CisgIGFyZW5hX21lc3NhZ2UtPnNldF9hbGxvY2F0ZWRfb3B0aW9uYWxfc3RyaW5nKGFsbG9jYXRlZF9zdHIpOworICBFWFBFQ1RfRVEoImhlbGxvIiwgYXJlbmFfbWVzc2FnZS0+b3B0aW9uYWxfc3RyaW5nKCkpOworfQorCitURVNUKEFyZW5hVGVzdCwgUmVsZWFzZVN0cmluZykgeworICBBcmVuYSBhcmVuYTsKKyAgVGVzdEFsbFR5cGVzKiBhcmVuYV9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEpOworICBhcmVuYV9tZXNzYWdlLT5zZXRfb3B0aW9uYWxfc3RyaW5nKCJoZWxsbyIpOworICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IHJlbGVhc2VkX3N0cigKKyAgICAgIGFyZW5hX21lc3NhZ2UtPnJlbGVhc2Vfb3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoImhlbGxvIiwgKnJlbGVhc2VkX3N0cik7CisKKyAgLy8gVGVzdCBkZWZhdWx0IHZhbHVlLgorfQorCisKK1RFU1QoQXJlbmFUZXN0LCBTd2FwQmV0d2VlbkFyZW5hc1dpdGhBbGxGaWVsZHNTZXQpIHsKKyAgQXJlbmEgYXJlbmExOworICBUZXN0QWxsVHlwZXMqIGFyZW5hMV9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmExKTsKKyAgeworICAgIEFyZW5hIGFyZW5hMjsKKyAgICBUZXN0QWxsVHlwZXMqIGFyZW5hMl9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEyKTsKKyAgICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKGFyZW5hMl9tZXNzYWdlKTsKKyAgICBhcmVuYTJfbWVzc2FnZS0+U3dhcChhcmVuYTFfbWVzc2FnZSk7CisgICAgc3RkOjpzdHJpbmcgb3V0cHV0OworICAgIGFyZW5hMl9tZXNzYWdlLT5TZXJpYWxpemVUb1N0cmluZygmb3V0cHV0KTsKKyAgICBFWFBFQ1RfRVEoMCwgb3V0cHV0LnNpemUoKSk7CisgIH0KKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldCgqYXJlbmExX21lc3NhZ2UpOworfQorCitURVNUKEFyZW5hVGVzdCwgU3dhcEJldHdlZW5BcmVuYUFuZE5vbkFyZW5hV2l0aEFsbEZpZWxkc1NldCkgeworICBUZXN0QWxsVHlwZXMgbm9uX2FyZW5hX21lc3NhZ2U7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm5vbl9hcmVuYV9tZXNzYWdlKTsKKyAgeworICAgIEFyZW5hIGFyZW5hMjsKKyAgICBUZXN0QWxsVHlwZXMqIGFyZW5hMl9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEyKTsKKyAgICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKGFyZW5hMl9tZXNzYWdlKTsKKyAgICBhcmVuYTJfbWVzc2FnZS0+U3dhcCgmbm9uX2FyZW5hX21lc3NhZ2UpOworICAgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoKmFyZW5hMl9tZXNzYWdlKTsKKyAgICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG5vbl9hcmVuYV9tZXNzYWdlKTsKKyAgfQorfQorCitURVNUKEFyZW5hVGVzdCwgVW5zYWZlQXJlbmFTd2FwKSB7CisgIEFyZW5hIHNoYXJlZF9hcmVuYTsKKyAgVGVzdEFsbFR5cGVzKiBtZXNzYWdlMSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJnNoYXJlZF9hcmVuYSk7CisgIFRlc3RBbGxUeXBlcyogbWVzc2FnZTIgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZzaGFyZWRfYXJlbmEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKG1lc3NhZ2UxKTsKKyAgbWVzc2FnZTEtPlVuc2FmZUFyZW5hU3dhcChtZXNzYWdlMik7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoKm1lc3NhZ2UyKTsKK30KKworVEVTVChBcmVuYVRlc3QsIEdldE93bmluZ0FyZW5hKSB7CisgIEFyZW5hIGFyZW5hOworICBhdXRvKiBtMSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hKTsKKyAgRVhQRUNUX0VRKEFyZW5hOjpJbnRlcm5hbEdldE93bmluZ0FyZW5hKG0xKSwgJmFyZW5hKTsKKyAgRVhQRUNUX0VRKCZhcmVuYSwgQXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEoCisgICAgICAgICAgICAgICAgICAgICAgICBtMS0+bXV0YWJsZV9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoKSkpOworICBFWFBFQ1RfRVEoJmFyZW5hLAorICAgICAgICAgICAgQXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEobTEtPm11dGFibGVfcmVwZWF0ZWRfaW50MzIoKSkpOworfQorCitURVNUKEFyZW5hVGVzdCwgU3dhcEJldHdlZW5BcmVuYXNVc2luZ1JlZmxlY3Rpb24pIHsKKyAgQXJlbmEgYXJlbmExOworICBUZXN0QWxsVHlwZXMqIGFyZW5hMV9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmExKTsKKyAgeworICAgIEFyZW5hIGFyZW5hMjsKKyAgICBUZXN0QWxsVHlwZXMqIGFyZW5hMl9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEyKTsKKyAgICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKGFyZW5hMl9tZXNzYWdlKTsKKyAgICBjb25zdCBSZWZsZWN0aW9uKiByID0gYXJlbmEyX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgICByLT5Td2FwKGFyZW5hMV9tZXNzYWdlLCBhcmVuYTJfbWVzc2FnZSk7CisgICAgc3RkOjpzdHJpbmcgb3V0cHV0OworICAgIGFyZW5hMl9tZXNzYWdlLT5TZXJpYWxpemVUb1N0cmluZygmb3V0cHV0KTsKKyAgICBFWFBFQ1RfRVEoMCwgb3V0cHV0LnNpemUoKSk7CisgIH0KKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldCgqYXJlbmExX21lc3NhZ2UpOworfQorCitURVNUKEFyZW5hVGVzdCwgU3dhcEJldHdlZW5BcmVuYUFuZE5vbkFyZW5hVXNpbmdSZWZsZWN0aW9uKSB7CisgIFRlc3RBbGxUeXBlcyBub25fYXJlbmFfbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbm9uX2FyZW5hX21lc3NhZ2UpOworICB7CisgICAgQXJlbmEgYXJlbmEyOworICAgIFRlc3RBbGxUeXBlcyogYXJlbmEyX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYTIpOworICAgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoYXJlbmEyX21lc3NhZ2UpOworICAgIGNvbnN0IFJlZmxlY3Rpb24qIHIgPSBhcmVuYTJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICAgIHItPlN3YXAoJm5vbl9hcmVuYV9tZXNzYWdlLCBhcmVuYTJfbWVzc2FnZSk7CisgICAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldCgqYXJlbmEyX21lc3NhZ2UpOworICAgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobm9uX2FyZW5hX21lc3NhZ2UpOworICB9Cit9CisKK1RFU1QoQXJlbmFUZXN0LCBSZWxlYXNlRnJvbUFyZW5hTWVzc2FnZU1ha2VzQ29weSkgeworICBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIG5lc3RlZF9tc2cgPSBOVUxMOworICBzdGQ6OnN0cmluZyogbmVzdGVkX3N0cmluZyA9IE5VTEw7CisgIHsKKyAgICBBcmVuYSBhcmVuYTsKKyAgICBUZXN0QWxsVHlwZXMqIGFyZW5hX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgICAgYXJlbmFfbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoNDIpOworICAgICphcmVuYV9tZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX3N0cmluZygpID0gIkhlbGxvIjsKKyAgICBuZXN0ZWRfbXNnID0gYXJlbmFfbWVzc2FnZS0+cmVsZWFzZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworICAgIG5lc3RlZF9zdHJpbmcgPSBhcmVuYV9tZXNzYWdlLT5yZWxlYXNlX29wdGlvbmFsX3N0cmluZygpOworICB9CisgIEVYUEVDVF9FUSg0MiwgbmVzdGVkX21zZy0+YmIoKSk7CisgIEVYUEVDVF9FUSgiSGVsbG8iLCAqbmVzdGVkX3N0cmluZyk7CisgIGRlbGV0ZSBuZXN0ZWRfbXNnOworICBkZWxldGUgbmVzdGVkX3N0cmluZzsKK30KKworI2lmIFBST1RPQlVGX1JUVEkKK1RFU1QoQXJlbmFUZXN0LCBSZWxlYXNlRnJvbUFyZW5hTWVzc2FnZVVzaW5nUmVmbGVjdGlvbk1ha2VzQ29weSkgeworICBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIG5lc3RlZF9tc2cgPSBOVUxMOworICAvLyBOb3RlOiBubyBzdHJpbmc6IHJlZmxlY3Rpb24gQVBJIG9ubHkgc3VwcG9ydHMgcmVsZWFzaW5nIHN1Ym1lc3NhZ2VzLgorICB7CisgICAgQXJlbmEgYXJlbmE7CisgICAgVGVzdEFsbFR5cGVzKiBhcmVuYV9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEpOworICAgIGFyZW5hX21lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDQyKTsKKyAgICBjb25zdCBSZWZsZWN0aW9uKiByID0gYXJlbmFfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZiA9IGFyZW5hX21lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKAorICAgICAgICAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKTsKKyAgICBuZXN0ZWRfbXNnID0gc3RhdGljX2Nhc3Q8VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKj4oCisgICAgICAgIHItPlJlbGVhc2VNZXNzYWdlKGFyZW5hX21lc3NhZ2UsIGYpKTsKKyAgfQorICBFWFBFQ1RfRVEoNDIsIG5lc3RlZF9tc2ctPmJiKCkpOworICBkZWxldGUgbmVzdGVkX21zZzsKK30KKyNlbmRpZiAgLy8gUFJPVE9CVUZfUlRUSQorCitURVNUKEFyZW5hVGVzdCwgU2V0QWxsb2NhdGVkQWNyb3NzQXJlbmFzKSB7CisgIEFyZW5hIGFyZW5hMTsKKyAgVGVzdEFsbFR5cGVzKiBhcmVuYTFfbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hMSk7CisgIFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogaGVhcF9zdWJtZXNzYWdlID0KKyAgICAgIG5ldyBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UoKTsKKyAgaGVhcF9zdWJtZXNzYWdlLT5zZXRfYmIoNDIpOworICBhcmVuYTFfbWVzc2FnZS0+c2V0X2FsbG9jYXRlZF9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZShoZWFwX3N1Ym1lc3NhZ2UpOworICAvLyBTaG91bGQga2VlcCBzYW1lIG9iamVjdCBhbmQgYWRkIHRvIGFyZW5hJ3MgT3duKCktbGlzdC4KKyAgRVhQRUNUX0VRKGhlYXBfc3VibWVzc2FnZSwgYXJlbmExX21lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIHsKKyAgICBBcmVuYSBhcmVuYTI7CisgICAgVGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKiBhcmVuYTJfc3VibWVzc2FnZSA9CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZT4oJmFyZW5hMik7CisgICAgYXJlbmEyX3N1Ym1lc3NhZ2UtPnNldF9iYig0Mik7CisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKyAgICBFWFBFQ1RfREVCVUdfREVBVEgoYXJlbmExX21lc3NhZ2UtPnNldF9hbGxvY2F0ZWRfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVuYTJfc3VibWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICJzdWJtZXNzYWdlX2FyZW5hIik7CisjZW5kaWYKKyAgICBFWFBFQ1RfTkUoYXJlbmEyX3N1Ym1lc3NhZ2UsCisgICAgICAgICAgICAgIGFyZW5hMV9tZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICB9CisKKyAgVGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKiBhcmVuYTFfc3VibWVzc2FnZSA9CisgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U+KCZhcmVuYTEpOworICBhcmVuYTFfc3VibWVzc2FnZS0+c2V0X2JiKDQyKTsKKyAgVGVzdEFsbFR5cGVzKiBoZWFwX21lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzOworI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCisgIEVYUEVDVF9ERUJVR19ERUFUSCgKKyAgICAgIGhlYXBfbWVzc2FnZS0+c2V0X2FsbG9jYXRlZF9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZShhcmVuYTFfc3VibWVzc2FnZSksCisgICAgICAic3VibWVzc2FnZV9hcmVuYSIpOworI2VuZGlmCisgIEVYUEVDVF9ORShhcmVuYTFfc3VibWVzc2FnZSwgaGVhcF9tZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBkZWxldGUgaGVhcF9tZXNzYWdlOworfQorCitURVNUKEFyZW5hVGVzdCwgVW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWRBY3Jvc3NBcmVuYXMpIHsKKyAgQXJlbmEgYXJlbmExOworICBUZXN0QWxsVHlwZXMqIGFyZW5hMV9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmExKTsKKyAgeworICAgIEFyZW5hIGFyZW5hMjsKKyAgICBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIGFyZW5hMl9zdWJtZXNzYWdlID0KKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlPigmYXJlbmEyKTsKKyAgICBhcmVuYTJfc3VibWVzc2FnZS0+c2V0X2JiKDQyKTsKKyAgICBhcmVuYTFfbWVzc2FnZS0+dW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoCisgICAgICAgIGFyZW5hMl9zdWJtZXNzYWdlKTsKKyAgICBFWFBFQ1RfRVEoYXJlbmEyX3N1Ym1lc3NhZ2UsCisgICAgICAgICAgICAgIGFyZW5hMV9tZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICAgIEVYUEVDVF9FUShhcmVuYTJfc3VibWVzc2FnZSwKKyAgICAgICAgICAgICAgYXJlbmExX21lc3NhZ2UtPnVuc2FmZV9hcmVuYV9yZWxlYXNlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICB9CisKKyAgVGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKiBhcmVuYTFfc3VibWVzc2FnZSA9CisgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U+KCZhcmVuYTEpOworICBhcmVuYTFfc3VibWVzc2FnZS0+c2V0X2JiKDQyKTsKKyAgVGVzdEFsbFR5cGVzKiBoZWFwX21lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzOworICBoZWFwX21lc3NhZ2UtPnVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKAorICAgICAgYXJlbmExX3N1Ym1lc3NhZ2UpOworICBFWFBFQ1RfRVEoYXJlbmExX3N1Ym1lc3NhZ2UsIGhlYXBfbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKGFyZW5hMV9zdWJtZXNzYWdlLAorICAgICAgICAgICAgaGVhcF9tZXNzYWdlLT51bnNhZmVfYXJlbmFfcmVsZWFzZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgZGVsZXRlIGhlYXBfbWVzc2FnZTsKK30KKworVEVTVChBcmVuYVRlc3QsIFNldEFsbG9jYXRlZEFjcm9zc0FyZW5hc1dpdGhSZWZsZWN0aW9uKSB7CisgIC8vIFNhbWUgYXMgYWJvdmUsIHdpdGggcmVmbGVjdGlvbi4KKyAgQXJlbmEgYXJlbmExOworICBUZXN0QWxsVHlwZXMqIGFyZW5hMV9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmExKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogciA9IGFyZW5hMV9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGQgPSBhcmVuYTFfbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1zZ19maWVsZCA9CisgICAgICBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIik7CisgIFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogaGVhcF9zdWJtZXNzYWdlID0KKyAgICAgIG5ldyBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UoKTsKKyAgaGVhcF9zdWJtZXNzYWdlLT5zZXRfYmIoNDIpOworICByLT5TZXRBbGxvY2F0ZWRNZXNzYWdlKGFyZW5hMV9tZXNzYWdlLCBoZWFwX3N1Ym1lc3NhZ2UsIG1zZ19maWVsZCk7CisgIC8vIFNob3VsZCBrZWVwIHNhbWUgb2JqZWN0IGFuZCBhZGQgdG8gYXJlbmEncyBPd24oKS1saXN0LgorICBFWFBFQ1RfRVEoaGVhcF9zdWJtZXNzYWdlLCBhcmVuYTFfbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgeworICAgIEFyZW5hIGFyZW5hMjsKKyAgICBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIGFyZW5hMl9zdWJtZXNzYWdlID0KKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlPigmYXJlbmEyKTsKKyAgICBhcmVuYTJfc3VibWVzc2FnZS0+c2V0X2JiKDQyKTsKKyNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorICAgIEVYUEVDVF9ERUJVR19ERUFUSCgKKyAgICAgICAgci0+U2V0QWxsb2NhdGVkTWVzc2FnZShhcmVuYTFfbWVzc2FnZSwgYXJlbmEyX3N1Ym1lc3NhZ2UsIG1zZ19maWVsZCksCisgICAgICAgICJHZXRPd25pbmdBcmVuYSIpOworI2VuZGlmCisgICAgRVhQRUNUX05FKGFyZW5hMl9zdWJtZXNzYWdlLAorICAgICAgICAgICAgICBhcmVuYTFfbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgfQorCisgIFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogYXJlbmExX3N1Ym1lc3NhZ2UgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlPigmYXJlbmExKTsKKyAgYXJlbmExX3N1Ym1lc3NhZ2UtPnNldF9iYig0Mik7CisgIFRlc3RBbGxUeXBlcyogaGVhcF9tZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlczsKKyNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorICBFWFBFQ1RfREVCVUdfREVBVEgoCisgICAgICByLT5TZXRBbGxvY2F0ZWRNZXNzYWdlKGhlYXBfbWVzc2FnZSwgYXJlbmExX3N1Ym1lc3NhZ2UsIG1zZ19maWVsZCksCisgICAgICAiR2V0T3duaW5nQXJlbmEiKTsKKyNlbmRpZgorICBFWFBFQ1RfTkUoYXJlbmExX3N1Ym1lc3NhZ2UsIGhlYXBfbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgZGVsZXRlIGhlYXBfbWVzc2FnZTsKK30KKworVEVTVChBcmVuYVRlc3QsIFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkQWNyb3NzQXJlbmFzV2l0aFJlZmxlY3Rpb24pIHsKKyAgLy8gU2FtZSBhcyBhYm92ZSwgd2l0aCByZWZsZWN0aW9uLgorICBBcmVuYSBhcmVuYTE7CisgIFRlc3RBbGxUeXBlcyogYXJlbmExX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYTEpOworICBjb25zdCBSZWZsZWN0aW9uKiByID0gYXJlbmExX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZCA9IGFyZW5hMV9tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbXNnX2ZpZWxkID0KKyAgICAgIGQtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKTsKKyAgeworICAgIEFyZW5hIGFyZW5hMjsKKyAgICBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIGFyZW5hMl9zdWJtZXNzYWdlID0KKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlPigmYXJlbmEyKTsKKyAgICBhcmVuYTJfc3VibWVzc2FnZS0+c2V0X2JiKDQyKTsKKyAgICByLT5VbnNhZmVBcmVuYVNldEFsbG9jYXRlZE1lc3NhZ2UoYXJlbmExX21lc3NhZ2UsIGFyZW5hMl9zdWJtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfZmllbGQpOworICAgIEVYUEVDVF9FUShhcmVuYTJfc3VibWVzc2FnZSwKKyAgICAgICAgICAgICAgYXJlbmExX21lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgICAgRVhQRUNUX0VRKGFyZW5hMl9zdWJtZXNzYWdlLAorICAgICAgICAgICAgICBhcmVuYTFfbWVzc2FnZS0+dW5zYWZlX2FyZW5hX3JlbGVhc2Vfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIH0KKworICBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIGFyZW5hMV9zdWJtZXNzYWdlID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZT4oJmFyZW5hMSk7CisgIGFyZW5hMV9zdWJtZXNzYWdlLT5zZXRfYmIoNDIpOworICBUZXN0QWxsVHlwZXMqIGhlYXBfbWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXM7CisgIHItPlVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZShoZWFwX21lc3NhZ2UsIGFyZW5hMV9zdWJtZXNzYWdlLCBtc2dfZmllbGQpOworICBFWFBFQ1RfRVEoYXJlbmExX3N1Ym1lc3NhZ2UsIGhlYXBfbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKGFyZW5hMV9zdWJtZXNzYWdlLAorICAgICAgICAgICAgaGVhcF9tZXNzYWdlLT51bnNhZmVfYXJlbmFfcmVsZWFzZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgZGVsZXRlIGhlYXBfbWVzc2FnZTsKK30KKworVEVTVChBcmVuYVRlc3QsIEFkZEFsbG9jYXRlZFdpdGhSZWZsZWN0aW9uKSB7CisgIEFyZW5hIGFyZW5hMTsKKyAgQXJlbmFNZXNzYWdlKiBhcmVuYTFfbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPEFyZW5hTWVzc2FnZT4oJmFyZW5hMSk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHIgPSBhcmVuYTFfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBjb25zdCBEZXNjcmlwdG9yKiBkID0gYXJlbmExX21lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKyAgLy8gTWVzc2FnZSB3aXRoIGNjX2VuYWJsZV9hcmVuYXMgPSB0cnVlOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkID0gZC0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpOworICByLT5BZGRNZXNzYWdlKGFyZW5hMV9tZXNzYWdlLCBmZCk7CisgIHItPkFkZE1lc3NhZ2UoYXJlbmExX21lc3NhZ2UsIGZkKTsKKyAgci0+QWRkTWVzc2FnZShhcmVuYTFfbWVzc2FnZSwgZmQpOworICBFWFBFQ1RfRVEoMywgci0+RmllbGRTaXplKCphcmVuYTFfbWVzc2FnZSwgZmQpKTsKK30KKworVEVTVChBcmVuYVRlc3QsIFJlcGVhdGVkUHRyRmllbGRBZGRDbGVhcmVkVGVzdCkgeworI2lmbmRlZiBQUk9UT0JVRl9GVVRVUkVfQlJFQUtJTkdfQ0hBTkdFUworICB7CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxUZXN0QWxsVHlwZXM+IHJlcGVhdGVkX2ZpZWxkOworICAgIEVYUEVDVF9UUlVFKHJlcGVhdGVkX2ZpZWxkLmVtcHR5KCkpOworICAgIEVYUEVDVF9FUSgwLCByZXBlYXRlZF9maWVsZC5zaXplKCkpOworICAgIC8vIE93bmVyc2hpcCBpcyBwYXNzZWQgdG8gcmVwZWF0ZWRfZmllbGQuCisgICAgVGVzdEFsbFR5cGVzKiBjbGVhcmVkID0gbmV3IFRlc3RBbGxUeXBlcygpOworICAgIHJlcGVhdGVkX2ZpZWxkLkFkZENsZWFyZWQoY2xlYXJlZCk7CisgICAgRVhQRUNUX1RSVUUocmVwZWF0ZWRfZmllbGQuZW1wdHkoKSk7CisgICAgRVhQRUNUX0VRKDAsIHJlcGVhdGVkX2ZpZWxkLnNpemUoKSk7CisgIH0KKyNlbmRpZiAgLy8gIVBST1RPQlVGX0ZVVFVSRV9CUkVBS0lOR19DSEFOR0VTCisgIHsKKyAgICBSZXBlYXRlZFB0ckZpZWxkPFRlc3RBbGxUeXBlcz4gcmVwZWF0ZWRfZmllbGQ7CisgICAgRVhQRUNUX1RSVUUocmVwZWF0ZWRfZmllbGQuZW1wdHkoKSk7CisgICAgRVhQRUNUX0VRKDAsIHJlcGVhdGVkX2ZpZWxkLnNpemUoKSk7CisgICAgLy8gT3duZXJzaGlwIGlzIHBhc3NlZCB0byByZXBlYXRlZF9maWVsZC4KKyAgICBUZXN0QWxsVHlwZXMqIGNsZWFyZWQgPSBuZXcgVGVzdEFsbFR5cGVzKCk7CisgICAgcmVwZWF0ZWRfZmllbGQuQWRkQWxsb2NhdGVkKGNsZWFyZWQpOworICAgIEVYUEVDVF9GQUxTRShyZXBlYXRlZF9maWVsZC5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRVEoMSwgcmVwZWF0ZWRfZmllbGQuc2l6ZSgpKTsKKyAgfQorfQorCitURVNUKEFyZW5hVGVzdCwgQWRkQWxsb2NhdGVkVG9SZXBlYXRlZEZpZWxkKSB7CisgIC8vIEhlYXAtPmFyZW5hIGNhc2UuCisgIEFyZW5hIGFyZW5hMTsKKyAgVGVzdEFsbFR5cGVzKiBhcmVuYTFfbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hMSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogaGVhcF9zdWJtZXNzYWdlID0KKyAgICAgICAgbmV3IFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSgpOworICAgIGhlYXBfc3VibWVzc2FnZS0+c2V0X2JiKDQyKTsKKyAgICBhcmVuYTFfbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5BZGRBbGxvY2F0ZWQoCisgICAgICAgIGhlYXBfc3VibWVzc2FnZSk7CisgICAgLy8gU2hvdWxkIG5vdCBjb3B5IG9iamVjdCAtLSB3aWxsIHVzZSBhcmVuYV8tPk93bigpLgorICAgIEVYUEVDVF9FUShoZWFwX3N1Ym1lc3NhZ2UsICZhcmVuYTFfbWVzc2FnZS0+cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoaSkpOworICAgIEVYUEVDVF9FUSg0MiwgYXJlbmExX21lc3NhZ2UtPnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKGkpLmJiKCkpOworICB9CisKKyAgLy8gQXJlbmExLT5BcmVuYTIgY2FzZS4KKyAgYXJlbmExX21lc3NhZ2UtPkNsZWFyKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIEFyZW5hIGFyZW5hMjsKKyAgICBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIGFyZW5hMl9zdWJtZXNzYWdlID0KKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlPigmYXJlbmEyKTsKKyAgICBhcmVuYTJfc3VibWVzc2FnZS0+c2V0X2JiKDQyKTsKKyNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorICAgIEVYUEVDVF9ERUJVR19ERUFUSCgKKyAgICAgICAgYXJlbmExX21lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+QWRkQWxsb2NhdGVkKAorICAgICAgICAgICAgYXJlbmEyX3N1Ym1lc3NhZ2UpLAorICAgICAgICAidmFsdWVfYXJlbmEiKTsKKyNlbmRpZgorICAgIC8vIFNob3VsZCBub3QgcmVjZWl2ZSBvYmplY3QuCisgICAgRVhQRUNUX1RSVUUoYXJlbmExX21lc3NhZ2UtPnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCkuZW1wdHkoKSk7CisgIH0KKworICAvLyBBcmVuYS0+aGVhcCBjYXNlLgorICBUZXN0QWxsVHlwZXMqIGhlYXBfbWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIEFyZW5hIGFyZW5hMjsKKyAgICBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIGFyZW5hMl9zdWJtZXNzYWdlID0KKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlPigmYXJlbmEyKTsKKyAgICBhcmVuYTJfc3VibWVzc2FnZS0+c2V0X2JiKDQyKTsKKyNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorICAgIEVYUEVDVF9ERUJVR19ERUFUSCgKKyAgICAgICAgaGVhcF9tZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPkFkZEFsbG9jYXRlZCgKKyAgICAgICAgICAgIGFyZW5hMl9zdWJtZXNzYWdlKSwKKyAgICAgICAgInZhbHVlX2FyZW5hIik7CisjZW5kaWYKKyAgICAvLyBTaG91bGQgbm90IHJlY2VpdmUgb2JqZWN0LgorICAgIEVYUEVDVF9UUlVFKGhlYXBfbWVzc2FnZS0+cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS5lbXB0eSgpKTsKKyAgfQorICBkZWxldGUgaGVhcF9tZXNzYWdlOworCisgIC8vIEhlYXAtPmFyZW5hIGNhc2UgZm9yIHN0cmluZ3MgKHdoaWNoIGFyZSBub3QgYXJlbmEtYWxsb2NhdGVkKS4KKyAgYXJlbmExX21lc3NhZ2UtPkNsZWFyKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIHN0ZDo6c3RyaW5nKiBzID0gbmV3IHN0ZDo6c3RyaW5nKCJUZXN0Iik7CisgICAgYXJlbmExX21lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfc3RyaW5nKCktPkFkZEFsbG9jYXRlZChzKTsKKyAgICAvLyBTaG91bGQgbm90IGNvcHkuCisgICAgRVhQRUNUX0VRKHMsICZhcmVuYTFfbWVzc2FnZS0+cmVwZWF0ZWRfc3RyaW5nKGkpKTsKKyAgICBFWFBFQ1RfRVEoIlRlc3QiLCBhcmVuYTFfbWVzc2FnZS0+cmVwZWF0ZWRfc3RyaW5nKGkpKTsKKyAgfQorfQorCitURVNUKEFyZW5hVGVzdCwgVW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWRUb1JlcGVhdGVkRmllbGQpIHsKKyAgLy8gSGVhcC0+YXJlbmEgY2FzZS4KKyAgQXJlbmEgYXJlbmExOworICBUZXN0QWxsVHlwZXMqIGFyZW5hMV9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmExKTsKKyAgeworICAgIGF1dG8qIGhlYXBfc3VibWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U7CisgICAgYXJlbmExX21lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+VW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQoCisgICAgICAgIGhlYXBfc3VibWVzc2FnZSk7CisgICAgLy8gU2hvdWxkIG5vdCBjb3B5IG9iamVjdC4KKyAgICBFWFBFQ1RfRVEoaGVhcF9zdWJtZXNzYWdlLCAmYXJlbmExX21lc3NhZ2UtPnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApKTsKKyAgICBFWFBFQ1RfRVEoaGVhcF9zdWJtZXNzYWdlLCBhcmVuYTFfbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+VW5zYWZlQXJlbmFSZWxlYXNlTGFzdCgpKTsKKyAgICBkZWxldGUgaGVhcF9zdWJtZXNzYWdlOworICB9CisKKyAgLy8gQXJlbmExLT5BcmVuYTIgY2FzZS4KKyAgYXJlbmExX21lc3NhZ2UtPkNsZWFyKCk7CisgIHsKKyAgICBBcmVuYSBhcmVuYTI7CisgICAgVGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKiBhcmVuYTJfc3VibWVzc2FnZSA9CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZT4oJmFyZW5hMik7CisgICAgYXJlbmEyX3N1Ym1lc3NhZ2UtPnNldF9iYig0Mik7CisgICAgYXJlbmExX21lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+VW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQoCisgICAgICAgIGFyZW5hMl9zdWJtZXNzYWdlKTsKKyAgICAvLyBTaG91bGQgb3duIG9iamVjdC4KKyAgICBFWFBFQ1RfRVEoYXJlbmEyX3N1Ym1lc3NhZ2UsICZhcmVuYTFfbWVzc2FnZS0+cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkpOworICAgIEVYUEVDVF9FUShhcmVuYTJfc3VibWVzc2FnZSwKKyAgICAgICAgICAgICAgYXJlbmExX21lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgLT5VbnNhZmVBcmVuYVJlbGVhc2VMYXN0KCkpOworICB9CisKKyAgLy8gQXJlbmEtPmhlYXAgY2FzZS4KKyAgVGVzdEFsbFR5cGVzKiBoZWFwX21lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzOworICB7CisgICAgQXJlbmEgYXJlbmEyOworICAgIFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogYXJlbmEyX3N1Ym1lc3NhZ2UgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U+KCZhcmVuYTIpOworICAgIGFyZW5hMl9zdWJtZXNzYWdlLT5zZXRfYmIoNDIpOworICAgIGhlYXBfbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5VbnNhZmVBcmVuYUFkZEFsbG9jYXRlZCgKKyAgICAgICAgYXJlbmEyX3N1Ym1lc3NhZ2UpOworICAgIC8vIFNob3VsZCBvd24gb2JqZWN0LgorICAgIEVYUEVDVF9FUShhcmVuYTJfc3VibWVzc2FnZSwgJmhlYXBfbWVzc2FnZS0+cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkpOworICAgIEVYUEVDVF9FUShhcmVuYTJfc3VibWVzc2FnZSwgaGVhcF9tZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlVuc2FmZUFyZW5hUmVsZWFzZUxhc3QoKSk7CisgIH0KKyAgZGVsZXRlIGhlYXBfbWVzc2FnZTsKKworICAvLyBIZWFwLT5hcmVuYSBjYXNlIGZvciBzdHJpbmdzICh3aGljaCBhcmUgbm90IGFyZW5hLWFsbG9jYXRlZCkuCisgIGFyZW5hMV9tZXNzYWdlLT5DbGVhcigpOworICB7CisgICAgc3RkOjpzdHJpbmcqIHMgPSBuZXcgc3RkOjpzdHJpbmcoIlRlc3QiKTsKKyAgICBhcmVuYTFfbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9zdHJpbmcoKS0+VW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQocyk7CisgICAgLy8gU2hvdWxkIG5vdCBjb3B5LgorICAgIEVYUEVDVF9FUShzLCAmYXJlbmExX21lc3NhZ2UtPnJlcGVhdGVkX3N0cmluZygwKSk7CisgICAgRVhQRUNUX0VRKCJUZXN0IiwgYXJlbmExX21lc3NhZ2UtPnJlcGVhdGVkX3N0cmluZygwKSk7CisgICAgZGVsZXRlIGFyZW5hMV9tZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX3N0cmluZygpLT5VbnNhZmVBcmVuYVJlbGVhc2VMYXN0KCk7CisgIH0KK30KKworVEVTVChBcmVuYVRlc3QsIEFkZEFsbG9jYXRlZFRvUmVwZWF0ZWRGaWVsZFZpYVJlZmxlY3Rpb24pIHsKKyAgLy8gSGVhcC0+YXJlbmEgY2FzZS4KKyAgQXJlbmEgYXJlbmExOworICBUZXN0QWxsVHlwZXMqIGFyZW5hMV9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmExKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogciA9IGFyZW5hMV9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGQgPSBhcmVuYTFfbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkID0gZC0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIGhlYXBfc3VibWVzc2FnZSA9CisgICAgICAgIG5ldyBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U7CisgICAgaGVhcF9zdWJtZXNzYWdlLT5zZXRfYmIoNDIpOworICAgIHItPkFkZEFsbG9jYXRlZE1lc3NhZ2UoYXJlbmExX21lc3NhZ2UsIGZkLCBoZWFwX3N1Ym1lc3NhZ2UpOworICAgIC8vIFNob3VsZCBub3QgY29weSBvYmplY3QgLS0gd2lsbCB1c2UgYXJlbmFfLT5Pd24oKS4KKyAgICBFWFBFQ1RfRVEoaGVhcF9zdWJtZXNzYWdlLCAmYXJlbmExX21lc3NhZ2UtPnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKGkpKTsKKyAgICBFWFBFQ1RfRVEoNDIsIGFyZW5hMV9tZXNzYWdlLT5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZShpKS5iYigpKTsKKyAgfQorCisgIC8vIEFyZW5hMS0+QXJlbmEyIGNhc2UuCisgIGFyZW5hMV9tZXNzYWdlLT5DbGVhcigpOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBBcmVuYSBhcmVuYTI7CisgICAgVGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKiBhcmVuYTJfc3VibWVzc2FnZSA9CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZT4oJmFyZW5hMik7CisgICAgYXJlbmEyX3N1Ym1lc3NhZ2UtPnNldF9iYig0Mik7CisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKyAgICBFWFBFQ1RfREVCVUdfREVBVEgoCisgICAgICAgIHItPkFkZEFsbG9jYXRlZE1lc3NhZ2UoYXJlbmExX21lc3NhZ2UsIGZkLCBhcmVuYTJfc3VibWVzc2FnZSksCisgICAgICAgICJ2YWx1ZV9hcmVuYSIpOworI2VuZGlmCisgICAgLy8gU2hvdWxkIG5vdCByZWNlaXZlIG9iamVjdC4KKyAgICBFWFBFQ1RfVFJVRShhcmVuYTFfbWVzc2FnZS0+cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS5lbXB0eSgpKTsKKyAgfQorCisgIC8vIEFyZW5hLT5oZWFwIGNhc2UuCisgIFRlc3RBbGxUeXBlcyogaGVhcF9tZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgQXJlbmEgYXJlbmEyOworICAgIFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogYXJlbmEyX3N1Ym1lc3NhZ2UgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U+KCZhcmVuYTIpOworICAgIGFyZW5hMl9zdWJtZXNzYWdlLT5zZXRfYmIoNDIpOworI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCisgICAgRVhQRUNUX0RFQlVHX0RFQVRIKAorICAgICAgICByLT5BZGRBbGxvY2F0ZWRNZXNzYWdlKGhlYXBfbWVzc2FnZSwgZmQsIGFyZW5hMl9zdWJtZXNzYWdlKSwKKyAgICAgICAgInZhbHVlX2FyZW5hIik7CisjZW5kaWYKKyAgICAvLyBTaG91bGQgbm90IHJlY2VpdmUgb2JqZWN0LgorICAgIEVYUEVDVF9UUlVFKGhlYXBfbWVzc2FnZS0+cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS5lbXB0eSgpKTsKKyAgfQorICBkZWxldGUgaGVhcF9tZXNzYWdlOworfQorCitURVNUKEFyZW5hVGVzdCwgUmVsZWFzZUxhc3RSZXBlYXRlZEZpZWxkKSB7CisgIC8vIFJlbGVhc2UgZnJvbSBhcmVuYS1hbGxvY2F0ZWQgcmVwZWF0ZWQgZmllbGQgYW5kIGVuc3VyZSB0aGF0IHJldHVybmVkIG9iamVjdAorICAvLyBpcyBoZWFwLWFsbG9jYXRlZC4KKyAgQXJlbmEgYXJlbmE7CisgIFRlc3RBbGxUeXBlcyogYXJlbmFfbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgVGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKiBuZXN0ZWQgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U+KCZhcmVuYSk7CisgICAgbmVzdGVkLT5zZXRfYmIoNDIpOworICAgIGFyZW5hX21lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+QWRkQWxsb2NhdGVkKG5lc3RlZCk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBjb25zdCBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIG9yaWdfc3VibWVzc2FnZSA9CisgICAgICAgICZhcmVuYV9tZXNzYWdlLT5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgxMCAtIDEgLSBpKTsgIC8vIGxhc3QgZWxlbWVudAorICAgIFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogcmVsZWFzZWQgPQorICAgICAgICBhcmVuYV9tZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPlJlbGVhc2VMYXN0KCk7CisgICAgRVhQRUNUX05FKHJlbGVhc2VkLCBvcmlnX3N1Ym1lc3NhZ2UpOworICAgIEVYUEVDVF9FUSg0MiwgcmVsZWFzZWQtPmJiKCkpOworICAgIGRlbGV0ZSByZWxlYXNlZDsKKyAgfQorCisgIC8vIFRlc3QgVW5zYWZlQXJlbmFSZWxlYXNlTGFzdCgpLgorICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIG5lc3RlZCA9CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZT4oJmFyZW5hKTsKKyAgICBuZXN0ZWQtPnNldF9iYig0Mik7CisgICAgYXJlbmFfbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5BZGRBbGxvY2F0ZWQobmVzdGVkKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIGNvbnN0IFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogb3JpZ19zdWJtZXNzYWdlID0KKyAgICAgICAgJmFyZW5hX21lc3NhZ2UtPnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDEwIC0gMSAtIGkpOyAgLy8gbGFzdCBlbGVtZW50CisgICAgVGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKiByZWxlYXNlZCA9CisgICAgICAgIGFyZW5hX21lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKQorICAgICAgICAgICAgLT5VbnNhZmVBcmVuYVJlbGVhc2VMYXN0KCk7CisgICAgRVhQRUNUX0VRKHJlbGVhc2VkLCBvcmlnX3N1Ym1lc3NhZ2UpOworICAgIEVYUEVDVF9FUSg0MiwgcmVsZWFzZWQtPmJiKCkpOworICAgIC8vIG5vIGRlbGV0ZSAtLSB8cmVsZWFzZWR8IGlzIG9uIHRoZSBhcmVuYS4KKyAgfQorCisgIC8vIFRlc3Qgc3RyaW5nIGNhc2UgYXMgd2VsbC4gUmVsZWFzZUxhc3QoKSBpbiB0aGlzIGNhc2UgbXVzdCBjb3B5IHRoZQorICAvLyBzdHJpbmcsIGV2ZW4gdGhvdWdoIGl0IHdhcyBvcmlnaW5hbGx5IGhlYXAtYWxsb2NhdGVkIGFuZCBpdHMgcG9pbnRlcgorICAvLyB3YXMgc2ltcGx5IGFwcGVuZGVkIHRvIHRoZSByZXBlYXRlZCBmaWVsZCdzIGludGVybmFsIHZlY3RvciwgYmVjYXVzZSB0aGUKKyAgLy8gc3RyaW5nIHdhcyBwbGFjZWQgb24gdGhlIGFyZW5hJ3MgZGVzdHJ1Y3RvciBsaXN0IGFuZCBjYW5ub3QgYmUgcmVtb3ZlZAorICAvLyBmcm9tIHRoYXQgbGlzdCAoc28gdGhlIGFyZW5hIHBlcm1hbmVudGx5IG93bnMgdGhlIG9yaWdpbmFsIGluc3RhbmNlKS4KKyAgYXJlbmFfbWVzc2FnZS0+Q2xlYXIoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgc3RkOjpzdHJpbmcqIHMgPSBuZXcgc3RkOjpzdHJpbmcoIlRlc3QiKTsKKyAgICBhcmVuYV9tZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX3N0cmluZygpLT5BZGRBbGxvY2F0ZWQocyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcqIG9yaWdfZWxlbWVudCA9CisgICAgICAgICZhcmVuYV9tZXNzYWdlLT5yZXBlYXRlZF9zdHJpbmcoMTAgLSAxIC0gaSk7CisgICAgc3RkOjpzdHJpbmcqIHJlbGVhc2VkID0KKyAgICAgICAgYXJlbmFfbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9zdHJpbmcoKS0+UmVsZWFzZUxhc3QoKTsKKyAgICBFWFBFQ1RfTkUocmVsZWFzZWQsIG9yaWdfZWxlbWVudCk7CisgICAgRVhQRUNUX0VRKCJUZXN0IiwgKnJlbGVhc2VkKTsKKyAgICBkZWxldGUgcmVsZWFzZWQ7CisgIH0KK30KKworVEVTVChBcmVuYVRlc3QsIFVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkKSB7CisgIEFyZW5hIGFyZW5hOworICBUZXN0QWxsVHlwZXMqIG1lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIHN0ZDo6c3RyaW5nKiBhcmVuYV9zdHJpbmcgPSBBcmVuYTo6Q3JlYXRlPHN0ZDo6c3RyaW5nPigmYXJlbmEpOworICAgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfc3RyaW5nKCktPlVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkKGFyZW5hX3N0cmluZyk7CisgICAgRVhQRUNUX0VRKGFyZW5hX3N0cmluZywgbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9zdHJpbmcoaSkpOworICB9Cit9CisKK1RFU1QoQXJlbmFUZXN0LCBPbmVvZk1lcmdlKSB7CisgIEFyZW5hIGFyZW5hOworICBUZXN0QWxsVHlwZXMqIG1lc3NhZ2UwID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEpOworICBUZXN0QWxsVHlwZXMqIG1lc3NhZ2UxID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEpOworCisgIG1lc3NhZ2UwLT5zZXRfb25lb2Zfc3RyaW5nKCJ4Iik7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UwLT5oYXNfb25lb2Zfc3RyaW5nKCkpOworICBtZXNzYWdlMS0+c2V0X29uZW9mX3N0cmluZygieSIpOworICBBU1NFUlRfVFJVRShtZXNzYWdlMS0+aGFzX29uZW9mX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJ4IiwgbWVzc2FnZTAtPm9uZW9mX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJ5IiwgbWVzc2FnZTEtPm9uZW9mX3N0cmluZygpKTsKKyAgbWVzc2FnZTAtPk1lcmdlRnJvbSgqbWVzc2FnZTEpOworICBFWFBFQ1RfRVEoInkiLCBtZXNzYWdlMC0+b25lb2Zfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoInkiLCBtZXNzYWdlMS0+b25lb2Zfc3RyaW5nKCkpOworfQorCitURVNUKEFyZW5hVGVzdCwgQXJlbmFPbmVvZlJlZmxlY3Rpb24pIHsKKyAgQXJlbmEgYXJlbmE7CisgIFRlc3RBbGxUeXBlcyogbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzYyA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbCA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHN0cmluZ19maWVsZCA9IGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgib25lb2Zfc3RyaW5nIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbXNnX2ZpZWxkID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgib25lb2ZfbmVzdGVkX21lc3NhZ2UiKTsKKyAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZiA9IGRlc2MtPkZpbmRPbmVvZkJ5TmFtZSgib25lb2ZfZmllbGQiKTsKKworICByZWZsLT5TZXRTdHJpbmcobWVzc2FnZSwgc3RyaW5nX2ZpZWxkLCAiVGVzdCB2YWx1ZSIpOworICBFWFBFQ1RfVFJVRShyZWZsLT5IYXNPbmVvZigqbWVzc2FnZSwgb25lb2YpKTsKKyAgcmVmbC0+Q2xlYXJPbmVvZihtZXNzYWdlLCBvbmVvZik7CisgIEVYUEVDVF9GQUxTRShyZWZsLT5IYXNPbmVvZigqbWVzc2FnZSwgb25lb2YpKTsKKworICBNZXNzYWdlKiBzdWJtc2cgPSByZWZsLT5NdXRhYmxlTWVzc2FnZShtZXNzYWdlLCBtc2dfZmllbGQpOworICBFWFBFQ1RfVFJVRShyZWZsLT5IYXNPbmVvZigqbWVzc2FnZSwgb25lb2YpKTsKKyAgcmVmbC0+Q2xlYXJPbmVvZihtZXNzYWdlLCBvbmVvZik7CisgIEVYUEVDVF9GQUxTRShyZWZsLT5IYXNPbmVvZigqbWVzc2FnZSwgb25lb2YpKTsKKyAgcmVmbC0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgbXNnX2ZpZWxkKTsKKyAgRVhQRUNUX1RSVUUocmVmbC0+SGFzT25lb2YoKm1lc3NhZ2UsIG9uZW9mKSk7CisgIHN1Ym1zZyA9IHJlZmwtPlJlbGVhc2VNZXNzYWdlKG1lc3NhZ2UsIG1zZ19maWVsZCk7CisgIEVYUEVDVF9GQUxTRShyZWZsLT5IYXNPbmVvZigqbWVzc2FnZSwgb25lb2YpKTsKKyAgRVhQRUNUX1RSVUUoc3VibXNnLT5HZXRBcmVuYSgpID09IE5VTEwpOworICBkZWxldGUgc3VibXNnOworfQorCit2b2lkIFRlc3RTd2FwUmVwZWF0ZWRGaWVsZChBcmVuYSogYXJlbmExLCBBcmVuYSogYXJlbmEyKSB7CisgIC8vIFRlc3QgInNhZmUiIChjb3B5aW5nKSBzZW1hbnRpY3MgZm9yIGRpcmVjdCBTd2FwKCkgb24gUmVwZWF0ZWRQdHJGaWVsZAorICAvLyBiZXR3ZWVuIGFyZW5hcy4KKyAgUmVwZWF0ZWRQdHJGaWVsZDxUZXN0QWxsVHlwZXM+IGZpZWxkMShhcmVuYTEpOworICBSZXBlYXRlZFB0ckZpZWxkPFRlc3RBbGxUeXBlcz4gZmllbGQyKGFyZW5hMik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIFRlc3RBbGxUeXBlcyogdCA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oYXJlbmExKTsKKyAgICB0LT5zZXRfb3B0aW9uYWxfc3RyaW5nKCJmaWVsZDEiKTsKKyAgICB0LT5zZXRfb3B0aW9uYWxfaW50MzIoaSk7CisgICAgaWYgKGFyZW5hMSAhPSBOVUxMKSB7CisgICAgICBmaWVsZDEuVW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQodCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpZWxkMS5BZGRBbGxvY2F0ZWQodCk7CisgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgVGVzdEFsbFR5cGVzKiB0ID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPihhcmVuYTIpOworICAgIHQtPnNldF9vcHRpb25hbF9zdHJpbmcoImZpZWxkMiIpOworICAgIHQtPnNldF9vcHRpb25hbF9pbnQzMihpKTsKKyAgICBpZiAoYXJlbmEyICE9IE5VTEwpIHsKKyAgICAgIGZpZWxkMi5VbnNhZmVBcmVuYUFkZEFsbG9jYXRlZCh0KTsKKyAgICB9IGVsc2UgeworICAgICAgZmllbGQyLkFkZEFsbG9jYXRlZCh0KTsKKyAgICB9CisgIH0KKyAgZmllbGQxLlN3YXAoJmZpZWxkMik7CisgIEVYUEVDVF9FUSg1LCBmaWVsZDEuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEwLCBmaWVsZDIuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUoc3RkOjpzdHJpbmcoImZpZWxkMSIpID09IGZpZWxkMi5HZXQoMCkub3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfVFJVRShzdGQ6OnN0cmluZygiZmllbGQyIikgPT0gZmllbGQxLkdldCgwKS5vcHRpb25hbF9zdHJpbmcoKSk7CisgIC8vIEVuc3VyZSB0aGF0IGZpZWxkcyByZXRhaW5lZCB0aGVpciBvcmlnaW5hbCBvcmRlcjoKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZDEuc2l6ZSgpOyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoaSwgZmllbGQxLkdldChpKS5vcHRpb25hbF9pbnQzMigpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkMi5zaXplKCk7IGkrKykgeworICAgIEVYUEVDVF9FUShpLCBmaWVsZDIuR2V0KGkpLm9wdGlvbmFsX2ludDMyKCkpOworICB9Cit9CisKK1RFU1QoQXJlbmFUZXN0LCBTd2FwUmVwZWF0ZWRGaWVsZCkgeworICBBcmVuYSBhcmVuYTsKKyAgVGVzdFN3YXBSZXBlYXRlZEZpZWxkKCZhcmVuYSwgJmFyZW5hKTsKK30KKworVEVTVChBcmVuYVRlc3QsIFN3YXBSZXBlYXRlZEZpZWxkV2l0aERpZmZlcmVudEFyZW5hcykgeworICBBcmVuYSBhcmVuYTE7CisgIEFyZW5hIGFyZW5hMjsKKyAgVGVzdFN3YXBSZXBlYXRlZEZpZWxkKCZhcmVuYTEsICZhcmVuYTIpOworfQorCitURVNUKEFyZW5hVGVzdCwgU3dhcFJlcGVhdGVkRmllbGRXaXRoTm9BcmVuYU9uUmlnaHRIYW5kU2lkZSkgeworICBBcmVuYSBhcmVuYTsKKyAgVGVzdFN3YXBSZXBlYXRlZEZpZWxkKCZhcmVuYSwgTlVMTCk7Cit9CisKK1RFU1QoQXJlbmFUZXN0LCBTd2FwUmVwZWF0ZWRGaWVsZFdpdGhOb0FyZW5hT25MZWZ0SGFuZFNpZGUpIHsKKyAgQXJlbmEgYXJlbmE7CisgIFRlc3RTd2FwUmVwZWF0ZWRGaWVsZChOVUxMLCAmYXJlbmEpOworfQorCitURVNUKEFyZW5hVGVzdCwgRXh0ZW5zaW9uc09uQXJlbmEpIHsKKyAgQXJlbmEgYXJlbmE7CisgIC8vIEVuc3VyZSBubyBsZWFrcy4KKyAgVGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2VfZXh0ID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmEpOworICBtZXNzYWdlX2V4dC0+U2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24sIDQyKTsKKyAgbWVzc2FnZV9leHQtPlNldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygidGVzdCIpKTsKKyAgbWVzc2FnZV9leHQKKyAgICAgIC0+TXV0YWJsZUV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgLT5zZXRfYmIoNDIpOworfQorCitURVNUKEFyZW5hVGVzdCwgUmVwZWF0ZWRGaWVsZE9uQXJlbmEpIHsKKyAgLy8gUHJlYWxsb2NhdGUgYW4gaW5pdGlhbCBhcmVuYSBibG9jayB0byBhdm9pZCBtYWxsb2NzIGR1cmluZyBob29rZWQgcmVnaW9uLgorICBzdGQ6OnZlY3RvcjxjaGFyPiBhcmVuYV9ibG9jaygxMDI0ICogMTAyNCk7CisgIEFyZW5hIGFyZW5hKGFyZW5hX2Jsb2NrLmRhdGEoKSwgYXJlbmFfYmxvY2suc2l6ZSgpKTsKKworICB7CisgICAgaW50ZXJuYWw6Ok5vSGVhcENoZWNrZXIgbm9faGVhcDsKKworICAgIC8vIEZpbGwgc29tZSByZXBlYXRlZCBmaWVsZHMgb24gdGhlIGFyZW5hIHRvIHRlc3QgZm9yIGxlYWtzLiBBbHNvIHZlcmlmeSBubworICAgIC8vIG1lbW9yeSBhbGxvY2F0aW9ucy4KKyAgICBSZXBlYXRlZEZpZWxkPGludDMyX3Q+IHJlcGVhdGVkX2ludDMyKCZhcmVuYSk7CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxUZXN0QWxsVHlwZXM+IHJlcGVhdGVkX21lc3NhZ2UoJmFyZW5hKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgICByZXBlYXRlZF9pbnQzMi5BZGQoNDIpOworICAgICAgcmVwZWF0ZWRfbWVzc2FnZS5BZGQoKS0+c2V0X29wdGlvbmFsX2ludDMyKDQyKTsKKyAgICAgIEVYUEVDVF9FUSgmYXJlbmEsIHJlcGVhdGVkX21lc3NhZ2UuR2V0KDApLkdldEFyZW5hKCkpOworICAgICAgY29uc3QgVGVzdEFsbFR5cGVzKiBtc2dfaW5fcmVwZWF0ZWRfZmllbGQgPSAmcmVwZWF0ZWRfbWVzc2FnZS5HZXQoMCk7CisgICAgICBUZXN0QWxsVHlwZXMqIG1zZyA9IHJlcGVhdGVkX21lc3NhZ2UuVW5zYWZlQXJlbmFSZWxlYXNlTGFzdCgpOworICAgICAgRVhQRUNUX0VRKG1zZ19pbl9yZXBlYXRlZF9maWVsZCwgbXNnKTsKKyAgICB9CisKKyAgICAvLyBVbnNhZmVBcmVuYUV4dHJhY3RTdWJyYW5nZSAoaSkgc2hvdWxkIG5vdCBsZWFrIGFuZCAoaWkpIHNob3VsZCByZXR1cm4KKyAgICAvLyBvbi1hcmVuYSBwb2ludGVycy4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgIHJlcGVhdGVkX21lc3NhZ2UuQWRkKCktPnNldF9vcHRpb25hbF9pbnQzMig0Mik7CisgICAgfQorICAgIFRlc3RBbGxUeXBlcyogZXh0cmFjdGVkX21lc3NhZ2VzWzVdOworICAgIHJlcGVhdGVkX21lc3NhZ2UuVW5zYWZlQXJlbmFFeHRyYWN0U3VicmFuZ2UoMCwgNSwgZXh0cmFjdGVkX21lc3NhZ2VzKTsKKyAgICBFWFBFQ1RfRVEoJmFyZW5hLCByZXBlYXRlZF9tZXNzYWdlLkdldCgwKS5HZXRBcmVuYSgpKTsKKyAgICBFWFBFQ1RfRVEoNSwgcmVwZWF0ZWRfbWVzc2FnZS5zaXplKCkpOworICB9CisKKyAgLy8gTm93LCBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUgTm9IZWFwQ2hlY2tlciwgdGVzdCBFeHRyYWN0U3VicmFuZ2UncyBjb3B5aW5nCisgIC8vIHNlbWFudGljcy4KKyAgeworICAgIFJlcGVhdGVkUHRyRmllbGQ8VGVzdEFsbFR5cGVzPiByZXBlYXRlZF9tZXNzYWdlKCZhcmVuYSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgcmVwZWF0ZWRfbWVzc2FnZS5BZGQoKS0+c2V0X29wdGlvbmFsX2ludDMyKDQyKTsKKyAgICB9CisKKyAgICBUZXN0QWxsVHlwZXMqIGV4dHJhY3RlZF9tZXNzYWdlc1s1XTsKKyAgICAvLyBFeHRyYWN0U3VicmFuZ2Ugc2hvdWxkIGNvcHkgdG8gdGhlIGhlYXAuCisgICAgcmVwZWF0ZWRfbWVzc2FnZS5FeHRyYWN0U3VicmFuZ2UoMCwgNSwgZXh0cmFjdGVkX21lc3NhZ2VzKTsKKyAgICBFWFBFQ1RfRVEoTlVMTCwgZXh0cmFjdGVkX21lc3NhZ2VzWzBdLT5HZXRBcmVuYSgpKTsKKyAgICAvLyBXZSBuZWVkIHRvIGZyZWUgdGhlIGhlYXAtYWxsb2NhdGVkIG1lc3NhZ2VzIHRvIHByZXZlbnQgYSBsZWFrLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICBkZWxldGUgZXh0cmFjdGVkX21lc3NhZ2VzW2ldOworICAgICAgZXh0cmFjdGVkX21lc3NhZ2VzW2ldID0gTlVMTDsKKyAgICB9CisgIH0KKworICAvLyBOb3cgY2hlY2sgdGhhdCB3ZSBjYW4gY3JlYXRlIFJlcGVhdGVkRmllbGRzL1JlcGVhdGVkUHRyRmllbGRzIHRoZW1zZWx2ZXMgb24KKyAgLy8gdGhlIGFyZW5hLiBUaGV5IGhhdmUgdGhlIG5lY2Vzc2FyeSB0eXBlIHRyYWl0cyBzbyB0aGF0IHRoZXkgY2FuIGJlaGF2ZSBsaWtlCisgIC8vIG1lc3NhZ2VzIGluIHRoaXMgd2F5LiBUaGlzIGlzIHVzZWZ1bCBmb3IgaGlnaGVyLWxldmVsIGdlbmVyaWMgdGVtcGxhdGVkCisgIC8vIGNvZGUgdGhhdCBtYXkgYWxsb2NhdGUgbWVzc2FnZXMgb3IgcmVwZWF0ZWQgZmllbGRzIG9mIG1lc3NhZ2VzIG9uIGFuIGFyZW5hLgorICB7CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxUZXN0QWxsVHlwZXM+KiByZXBlYXRlZF9wdHJfb25fYXJlbmEgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZFB0ckZpZWxkPFRlc3RBbGxUeXBlcz4gPigmYXJlbmEpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgLy8gQWRkIHNvbWUgZWxlbWVudHMgYW5kIGxldCB0aGUgbGVhay1jaGVja2VyIGVuc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgaXMKKyAgICAgIC8vIGZyZWVkLgorICAgICAgcmVwZWF0ZWRfcHRyX29uX2FyZW5hLT5BZGQoKTsKKyAgICB9CisKKyAgICBSZXBlYXRlZEZpZWxkPGludD4qIHJlcGVhdGVkX2ludF9vbl9hcmVuYSA9CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkRmllbGQ8aW50PiA+KCZhcmVuYSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgcmVwZWF0ZWRfaW50X29uX2FyZW5hLT5BZGQoaSk7CisgICAgfQorCisgIH0KKworICBhcmVuYS5SZXNldCgpOworfQorCisKKyNpZiBQUk9UT0JVRl9SVFRJCitURVNUKEFyZW5hVGVzdCwgTXV0YWJsZU1lc3NhZ2VSZWZsZWN0aW9uKSB7CisgIEFyZW5hIGFyZW5hOworICBUZXN0QWxsVHlwZXMqIG1lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHIgPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGQgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIik7CisgIFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogc3VibWVzc2FnZSA9CisgICAgICBzdGF0aWNfY2FzdDxUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqPigKKyAgICAgICAgICByLT5NdXRhYmxlTWVzc2FnZShtZXNzYWdlLCBmaWVsZCkpOworICBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIHN1Ym1lc3NhZ2VfZXhwZWN0ZWQgPQorICAgICAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworCisgIEVYUEVDVF9FUShzdWJtZXNzYWdlX2V4cGVjdGVkLCBzdWJtZXNzYWdlKTsKKyAgRVhQRUNUX0VRKCZhcmVuYSwgc3VibWVzc2FnZS0+R2V0QXJlbmEoKSk7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBvbmVvZl9maWVsZCA9CisgICAgICBkLT5GaW5kRmllbGRCeU5hbWUoIm9uZW9mX25lc3RlZF9tZXNzYWdlIik7CisgIHN1Ym1lc3NhZ2UgPSBzdGF0aWNfY2FzdDxUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqPigKKyAgICAgIHItPk11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIG9uZW9mX2ZpZWxkKSk7CisgIHN1Ym1lc3NhZ2VfZXhwZWN0ZWQgPSBtZXNzYWdlLT5tdXRhYmxlX29uZW9mX25lc3RlZF9tZXNzYWdlKCk7CisKKyAgRVhQRUNUX0VRKHN1Ym1lc3NhZ2VfZXhwZWN0ZWQsIHN1Ym1lc3NhZ2UpOworICBFWFBFQ1RfRVEoJmFyZW5hLCBzdWJtZXNzYWdlLT5HZXRBcmVuYSgpKTsKK30KKyNlbmRpZiAgLy8gUFJPVE9CVUZfUlRUSQorCisKK3ZvaWQgRmlsbEFyZW5hQXdhcmVGaWVsZHMoVGVzdEFsbFR5cGVzKiBtZXNzYWdlKSB7CisgIHN0ZDo6c3RyaW5nIHRlc3Rfc3RyaW5nID0gImhlbGxvIHdvcmxkIjsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ludDMyKDQyKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3N0cmluZyh0ZXN0X3N0cmluZyk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9ieXRlcyh0ZXN0X3N0cmluZyk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDQyKTsKKworICBtZXNzYWdlLT5zZXRfb25lb2ZfdWludDMyKDQyKTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9vbmVvZl9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoNDIpOworICBtZXNzYWdlLT5zZXRfb25lb2Zfc3RyaW5nKHRlc3Rfc3RyaW5nKTsKKyAgbWVzc2FnZS0+c2V0X29uZW9mX2J5dGVzKHRlc3Rfc3RyaW5nKTsKKworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50MzIoNDIpOworICAvLyBObyByZXBlYXRlZCBzdHJpbmc6IG5vdCB5ZXQgYXJlbmEtYXdhcmUuCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoNDIpOworICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX2xhenlfbWVzc2FnZSgpLT5zZXRfYmIoNDIpOworfQorCisvLyBUZXN0OiBubyBhbGxvY2F0aW9ucyBvY2N1ciBvbiBoZWFwIHdoaWxlIHRvdWNoaW5nIGFsbCBzdXBwb3J0ZWQgZmllbGQgdHlwZXMuCitURVNUKEFyZW5hVGVzdCwgTm9IZWFwQWxsb2NhdGlvbnNUZXN0KSB7CisgIC8vIEFsbG9jYXRlIGEgbGFyZ2UgaW5pdGlhbCBibG9jayB0byBhdm9pZCBtYWxsb2NzIGR1cmluZyBob29rZWQgdGVzdC4KKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gYXJlbmFfYmxvY2soMTI4ICogMTAyNCk7CisgIEFyZW5hT3B0aW9ucyBvcHRpb25zOworICBvcHRpb25zLmluaXRpYWxfYmxvY2sgPSAmYXJlbmFfYmxvY2tbMF07CisgIG9wdGlvbnMuaW5pdGlhbF9ibG9ja19zaXplID0gYXJlbmFfYmxvY2suc2l6ZSgpOworICBBcmVuYSBhcmVuYShvcHRpb25zKTsKKworICB7CisKKyAgICBUZXN0QWxsVHlwZXMqIG1lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgICAgRmlsbEFyZW5hQXdhcmVGaWVsZHMobWVzc2FnZSk7CisgIH0KKworICBhcmVuYS5SZXNldCgpOworfQorCitURVNUKEFyZW5hVGVzdCwgUGFyc2VDb3JydXB0ZWRTdHJpbmcpIHsKKyAgVGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICBUZXN0UGFyc2VDb3JydXB0ZWRTdHJpbmc8VGVzdEFsbFR5cGVzLCB0cnVlPihtZXNzYWdlKTsKKyAgVGVzdFBhcnNlQ29ycnVwdGVkU3RyaW5nPFRlc3RBbGxUeXBlcywgZmFsc2U+KG1lc3NhZ2UpOworfQorCisjaWYgUFJPVE9CVUZfUlRUSQorLy8gVGVzdCBjb25zdHJ1Y3Rpb24gb24gYW4gYXJlbmEgdmlhIGdlbmVyaWMgTWVzc2FnZUxpdGUgaW50ZXJmYWNlLiBXZSBzaG91bGQgYmUKKy8vIGFibGUgdG8gc3VjY2Vzc2Z1bGx5IGRlc2VyaWFsaXplIG9uIHRoZSBhcmVuYSB3aXRob3V0IGluY3VycmluZyBoZWFwCisvLyBhbGxvY2F0aW9ucywgaS5lLiwgZXZlcnl0aGluZyBzaG91bGQgc3RpbGwgYmUgYXJlbmEtYWxsb2NhdGlvbi1hd2FyZS4KK1RFU1QoQXJlbmFUZXN0LCBNZXNzYWdlTGl0ZU9uQXJlbmEpIHsKKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gYXJlbmFfYmxvY2soMTI4ICogMTAyNCk7CisgIEFyZW5hT3B0aW9ucyBvcHRpb25zOworICBvcHRpb25zLmluaXRpYWxfYmxvY2sgPSAmYXJlbmFfYmxvY2tbMF07CisgIG9wdGlvbnMuaW5pdGlhbF9ibG9ja19zaXplID0gYXJlbmFfYmxvY2suc2l6ZSgpOworICBBcmVuYSBhcmVuYShvcHRpb25zKTsKKyAgY29uc3QgTWVzc2FnZUxpdGUqIHByb3RvdHlwZSA9ICZUZXN0QWxsVHlwZXM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKworICBUZXN0QWxsVHlwZXMgaW5pdGlhbF9tZXNzYWdlOworICBGaWxsQXJlbmFBd2FyZUZpZWxkcygmaW5pdGlhbF9tZXNzYWdlKTsKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgaW5pdGlhbF9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKTsKKworICB7CisKKyAgICBNZXNzYWdlTGl0ZSogZ2VuZXJpY19tZXNzYWdlID0gcHJvdG90eXBlLT5OZXcoJmFyZW5hKTsKKyAgICBFWFBFQ1RfVFJVRShnZW5lcmljX21lc3NhZ2UgIT0gTlVMTCk7CisgICAgRVhQRUNUX0VRKCZhcmVuYSwgZ2VuZXJpY19tZXNzYWdlLT5HZXRBcmVuYSgpKTsKKyAgICBFWFBFQ1RfVFJVRShnZW5lcmljX21lc3NhZ2UtPlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7CisgICAgVGVzdEFsbFR5cGVzKiBkZXNlcmlhbGl6ZWQgPSBzdGF0aWNfY2FzdDxUZXN0QWxsVHlwZXMqPihnZW5lcmljX21lc3NhZ2UpOworICAgIEVYUEVDVF9FUSg0MiwgZGVzZXJpYWxpemVkLT5vcHRpb25hbF9pbnQzMigpKTsKKyAgfQorCisgIGFyZW5hLlJlc2V0KCk7Cit9CisjZW5kaWYgIC8vIFBST1RPQlVGX1JUVEkKKworLy8gUmVwZWF0ZWRGaWVsZCBzaG91bGQgc3VwcG9ydCBub24tUE9EIHR5cGVzLCBhbmQgaW52b2tlIGNvbnN0cnVjdG9ycyBhbmQKKy8vIGRlc3RydWN0b3JzIGFwcHJvcHJpYXRlbHksIGJlY2F1c2UgaXQncyB1c2VkIHRoaXMgd2F5IGJ5IGxvdHMgb2Ygb3RoZXIgY29kZQorLy8gKGV2ZW4gaWYgdGhpcyB3YXMgbm90IGl0cyBvcmlnaW5hbCBpbnRlbnQpLgorVEVTVChBcmVuYVRlc3QsIFJlcGVhdGVkRmllbGRXaXRoTm9uUE9EVHlwZSkgeworICB7CisgICAgUmVwZWF0ZWRGaWVsZDxzdGQ6OnN0cmluZz4gZmllbGRfb25faGVhcDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgICAqZmllbGRfb25faGVhcC5BZGQoKSA9ICJ0ZXN0IHN0cmluZyBsb25nIGVub3VnaCB0byBleGNlZWQgaW5saW5lIGJ1ZmZlciI7CisgICAgfQorICB9CisgIHsKKyAgICBBcmVuYSBhcmVuYTsKKyAgICBSZXBlYXRlZEZpZWxkPHN0ZDo6c3RyaW5nPiBmaWVsZF9vbl9hcmVuYSgmYXJlbmEpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKyAgICAgICpmaWVsZF9vbl9hcmVuYS5BZGQoKSA9ICJ0ZXN0IHN0cmluZyBsb25nIGVub3VnaCB0byBleGNlZWQgaW5saW5lIGJ1ZmZlciI7CisgICAgfQorICB9Cit9CisKKy8vIEFsaWduIG4gdG8gbmV4dCBtdWx0aXBsZSBvZiA4Cit1aW50NjRfdCBBbGlnbjgodWludDY0X3QgbikgeyByZXR1cm4gKG4gKyA3KSAmIC04OyB9CisKK1RFU1QoQXJlbmFUZXN0LCBTcGFjZUFsbG9jYXRlZF9hbmRfVXNlZCkgeworICBBcmVuYSBhcmVuYV8xOworICBFWFBFQ1RfRVEoMCwgYXJlbmFfMS5TcGFjZUFsbG9jYXRlZCgpKTsKKyAgRVhQRUNUX0VRKDAsIGFyZW5hXzEuU3BhY2VVc2VkKCkpOworICBFWFBFQ1RfRVEoMCwgYXJlbmFfMS5SZXNldCgpKTsKKyAgQXJlbmE6OkNyZWF0ZUFycmF5PGNoYXI+KCZhcmVuYV8xLCAzMjApOworICAvLyBBcmVuYSB3aWxsIGFsbG9jYXRlIHNsaWdodGx5IG1vcmUgdGhhbiAzMjAgZm9yIHRoZSBibG9jayBoZWFkZXJzLgorICBFWFBFQ1RfTEUoMzIwLCBhcmVuYV8xLlNwYWNlQWxsb2NhdGVkKCkpOworICBFWFBFQ1RfRVEoQWxpZ244KDMyMCksIGFyZW5hXzEuU3BhY2VVc2VkKCkpOworICBFWFBFQ1RfTEUoMzIwLCBhcmVuYV8xLlJlc2V0KCkpOworCisgIC8vIFRlc3Qgd2l0aCBpbml0aWFsIGJsb2NrLgorICBzdGQ6OnZlY3RvcjxjaGFyPiBhcmVuYV9ibG9jaygxMDI0KTsKKyAgQXJlbmFPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMuc3RhcnRfYmxvY2tfc2l6ZSA9IDI1NjsKKyAgb3B0aW9ucy5tYXhfYmxvY2tfc2l6ZSA9IDgxOTI7CisgIG9wdGlvbnMuaW5pdGlhbF9ibG9jayA9ICZhcmVuYV9ibG9ja1swXTsKKyAgb3B0aW9ucy5pbml0aWFsX2Jsb2NrX3NpemUgPSBhcmVuYV9ibG9jay5zaXplKCk7CisgIEFyZW5hIGFyZW5hXzIob3B0aW9ucyk7CisgIEVYUEVDVF9FUSgxMDI0LCBhcmVuYV8yLlNwYWNlQWxsb2NhdGVkKCkpOworICBFWFBFQ1RfRVEoMCwgYXJlbmFfMi5TcGFjZVVzZWQoKSk7CisgIEVYUEVDVF9FUSgxMDI0LCBhcmVuYV8yLlJlc2V0KCkpOworICBBcmVuYTo6Q3JlYXRlQXJyYXk8Y2hhcj4oJmFyZW5hXzIsIDU1KTsKKyAgRVhQRUNUX0VRKDEwMjQsIGFyZW5hXzIuU3BhY2VBbGxvY2F0ZWQoKSk7CisgIEVYUEVDVF9FUShBbGlnbjgoNTUpLCBhcmVuYV8yLlNwYWNlVXNlZCgpKTsKKyAgRVhQRUNUX0VRKDEwMjQsIGFyZW5hXzIuUmVzZXQoKSk7Cit9CisKK1RFU1QoQXJlbmFUZXN0LCBCbG9ja1NpemVEb3VibGluZykgeworICBBcmVuYSBhcmVuYTsKKyAgRVhQRUNUX0VRKDAsIGFyZW5hLlNwYWNlVXNlZCgpKTsKKyAgRVhQRUNUX0VRKDAsIGFyZW5hLlNwYWNlQWxsb2NhdGVkKCkpOworCisgIC8vIEFsbG9jYXRlIHNvbWV0aGluZyB0byBnZXQgaW5pdGlhbCBibG9jayBzaXplLgorICBBcmVuYTo6Q3JlYXRlQXJyYXk8Y2hhcj4oJmFyZW5hLCAxKTsKKyAgYXV0byBmaXJzdF9ibG9ja19zaXplID0gYXJlbmEuU3BhY2VBbGxvY2F0ZWQoKTsKKworICAvLyBLZWVwIGFsbG9jYXRpbmcgdW50aWwgc3BhY2UgdXNlZCBpbmNyZWFzZXMuCisgIHdoaWxlIChhcmVuYS5TcGFjZUFsbG9jYXRlZCgpID09IGZpcnN0X2Jsb2NrX3NpemUpIHsKKyAgICBBcmVuYTo6Q3JlYXRlQXJyYXk8Y2hhcj4oJmFyZW5hLCAxKTsKKyAgfQorICBBU1NFUlRfR1QoYXJlbmEuU3BhY2VBbGxvY2F0ZWQoKSwgZmlyc3RfYmxvY2tfc2l6ZSk7CisgIGF1dG8gc2Vjb25kX2Jsb2NrX3NpemUgPSAoYXJlbmEuU3BhY2VBbGxvY2F0ZWQoKSAtIGZpcnN0X2Jsb2NrX3NpemUpOworCisgIEVYUEVDVF9FUShzZWNvbmRfYmxvY2tfc2l6ZSwgMipmaXJzdF9ibG9ja19zaXplKTsKK30KKworVEVTVChBcmVuYVRlc3QsIEFsaWdubWVudCkgeworICBBcmVuYSBhcmVuYTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDA7IGkrKykgeworICAgIHZvaWQqIHAgPSBBcmVuYTo6Q3JlYXRlQXJyYXk8Y2hhcj4oJmFyZW5hLCBpKTsKKyAgICBHT09HTEVfQ0hFQ0tfRVEocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHApICUgOCwgMCkgPDwgaSA8PCAiOiAiIDw8IHA7CisgIH0KK30KKworVEVTVChBcmVuYVRlc3QsIEJsb2NrU2l6ZVNtYWxsZXJUaGFuQWxsb2NhdGlvbikgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8PSA4OyArK2kpIHsKKyAgICBBcmVuYU9wdGlvbnMgb3B0OworICAgIG9wdC5zdGFydF9ibG9ja19zaXplID0gb3B0Lm1heF9ibG9ja19zaXplID0gaTsKKyAgICBBcmVuYSBhcmVuYShvcHQpOworCisgICAgKkFyZW5hOjpDcmVhdGU8aW50NjRfdD4oJmFyZW5hKSA9IDQyOworICAgIEVYUEVDVF9HRShhcmVuYS5TcGFjZUFsbG9jYXRlZCgpLCA4KTsKKyAgICBFWFBFQ1RfRVEoOCwgYXJlbmEuU3BhY2VVc2VkKCkpOworCisgICAgKkFyZW5hOjpDcmVhdGU8aW50NjRfdD4oJmFyZW5hKSA9IDQyOworICAgIEVYUEVDVF9HRShhcmVuYS5TcGFjZUFsbG9jYXRlZCgpLCAxNik7CisgICAgRVhQRUNUX0VRKDE2LCBhcmVuYS5TcGFjZVVzZWQoKSk7CisgIH0KK30KKworVEVTVChBcmVuYVRlc3QsIEdldEFyZW5hU2hvdWxkUmV0dXJuVGhlQXJlbmFGb3JBcmVuYUFsbG9jYXRlZE1lc3NhZ2VzKSB7CisgIEFyZW5hIGFyZW5hOworICBBcmVuYU1lc3NhZ2UqIG1lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxBcmVuYU1lc3NhZ2U+KCZhcmVuYSk7CisgIGNvbnN0IEFyZW5hTWVzc2FnZSogY29uc3RfcG9pbnRlcl90b19tZXNzYWdlID0gbWVzc2FnZTsKKyAgRVhQRUNUX0VRKCZhcmVuYSwgQXJlbmE6OkdldEFyZW5hKG1lc3NhZ2UpKTsKKyAgRVhQRUNUX0VRKCZhcmVuYSwgQXJlbmE6OkdldEFyZW5hKGNvbnN0X3BvaW50ZXJfdG9fbWVzc2FnZSkpOworCisgIC8vIFRlc3QgdGhhdCB0aGUgTWVzc2FnZSogLyBNZXNzYWdlTGl0ZSogc3BlY2lhbGl6YXRpb24gU0ZJTkFFIHdvcmtzLgorICBjb25zdCBNZXNzYWdlKiBjb25zdF9wb2ludGVyX3RvX21lc3NhZ2VfdHlwZSA9IG1lc3NhZ2U7CisgIEVYUEVDVF9FUSgmYXJlbmEsIEFyZW5hOjpHZXRBcmVuYShjb25zdF9wb2ludGVyX3RvX21lc3NhZ2VfdHlwZSkpOworICBjb25zdCBNZXNzYWdlTGl0ZSogY29uc3RfcG9pbnRlcl90b19tZXNzYWdlX2xpdGVfdHlwZSA9IG1lc3NhZ2U7CisgIEVYUEVDVF9FUSgmYXJlbmEsIEFyZW5hOjpHZXRBcmVuYShjb25zdF9wb2ludGVyX3RvX21lc3NhZ2VfbGl0ZV90eXBlKSk7Cit9CisKK1RFU1QoQXJlbmFUZXN0LCBHZXRBcmVuYVNob3VsZFJldHVybk51bGxGb3JOb25BcmVuYUFsbG9jYXRlZE1lc3NhZ2VzKSB7CisgIEFyZW5hTWVzc2FnZSBtZXNzYWdlOworICBjb25zdCBBcmVuYU1lc3NhZ2UqIGNvbnN0X3BvaW50ZXJfdG9fbWVzc2FnZSA9ICZtZXNzYWdlOworICBFWFBFQ1RfRVEoTlVMTCwgQXJlbmE6OkdldEFyZW5hKCZtZXNzYWdlKSk7CisgIEVYUEVDVF9FUShOVUxMLCBBcmVuYTo6R2V0QXJlbmEoY29uc3RfcG9pbnRlcl90b19tZXNzYWdlKSk7Cit9CisKK1RFU1QoQXJlbmFUZXN0LCBHZXRBcmVuYVNob3VsZFJldHVybk51bGxGb3JOb25BcmVuYUNvbXBhdGlibGVUeXBlcykgeworICAvLyBUZXN0IHRoYXQgR2V0QXJlbmEgcmV0dXJucyBudWxscHRyIGZvciB0eXBlcyB0aGF0IGhhdmUgYSBHZXRBcmVuYSBtZXRob2QKKyAgLy8gdGhhdCBkb2Vzbid0IHJldHVybiBBcmVuYSouCisgIHN0cnVjdCB7CisgICAgaW50IEdldEFyZW5hKCkgY29uc3QgeyByZXR1cm4gMDsgfQorICB9IGhhc19nZXRfYXJlbmFfbWV0aG9kX3dyb25nX3JldHVybl90eXBlOworICBFWFBFQ1RfRVEobnVsbHB0ciwgQXJlbmE6OkdldEFyZW5hKCZoYXNfZ2V0X2FyZW5hX21ldGhvZF93cm9uZ19yZXR1cm5fdHlwZSkpOworCisgIC8vIFRlc3QgdGhhdCBHZXRBcmVuYSByZXR1cm5zIG51bGxwdHIgZm9yIHR5cGVzIHRoYXQgaGF2ZSBhIEdldEFyZW5hIGFsaWFzLgorICBzdHJ1Y3QgeworICAgIHVzaW5nIEdldEFyZW5hID0gQXJlbmEqOworICAgIEdldEFyZW5hIHVudXNlZDsKKyAgfSBoYXNfZ2V0X2FyZW5hX2FsaWFzOworICBFWFBFQ1RfRVEobnVsbHB0ciwgQXJlbmE6OkdldEFyZW5hKCZoYXNfZ2V0X2FyZW5hX2FsaWFzKSk7CisKKyAgLy8gVGVzdCB0aGF0IEdldEFyZW5hIHJldHVybnMgbnVsbHB0ciBmb3IgdHlwZXMgdGhhdCBoYXZlIGEgR2V0QXJlbmEgZGF0YQorICAvLyBtZW1iZXIuCisgIHN0cnVjdCB7CisgICAgQXJlbmEgR2V0QXJlbmE7CisgIH0gaGFzX2dldF9hcmVuYV9kYXRhX21lbWJlcjsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIEFyZW5hOjpHZXRBcmVuYSgmaGFzX2dldF9hcmVuYV9kYXRhX21lbWJlcikpOworfQorCitURVNUKEFyZW5hVGVzdCwgQWRkQ2xlYW51cCkgeworICBBcmVuYSBhcmVuYTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgIGFyZW5hLk93bihuZXcgaW50KTsKKyAgfQorfQorCitURVNUKEFyZW5hVGVzdCwgU3BhY2VSZXVzZUZvckFycmF5c1NpemVDaGVja3MpIHsKKyAgLy8gTGltaXQgdG8gMTw8MjAgdG8gYXZvaWQgdXNpbmcgdG9vIG11Y2ggbWVtb3J5IG9uIHRoZSB0ZXN0LgorICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyArK2kpIHsKKyAgICBTQ09QRURfVFJBQ0UoaSk7CisgICAgQXJlbmEgYXJlbmE7CisgICAgc3RkOjp2ZWN0b3I8dm9pZCo+IHBvaW50ZXJzOworCisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSAxNiA8PCBpOworCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgKytqKSB7CisgICAgICBwb2ludGVycy5wdXNoX2JhY2soQXJlbmE6OkNyZWF0ZUFycmF5PGNoYXI+KCZhcmVuYSwgc2l6ZSkpOworICAgIH0KKworICAgIGZvciAodm9pZCogcCA6IHBvaW50ZXJzKSB7CisgICAgICBpbnRlcm5hbDo6QXJlbmFUZXN0UGVlcjo6UmV0dXJuQXJyYXlNZW1vcnkoJmFyZW5hLCBwLCBzaXplKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx2b2lkKj4gc2Vjb25kX3BvaW50ZXJzOworICAgIGZvciAoaW50IGogPSA5OyBqICE9IDA7IC0taikgeworICAgICAgc2Vjb25kX3BvaW50ZXJzLnB1c2hfYmFjayhBcmVuYTo6Q3JlYXRlQXJyYXk8Y2hhcj4oJmFyZW5hLCBzaXplKSk7CisgICAgfQorCisgICAgLy8gVGhlIGFyZW5hIHdpbGwgZ2l2ZSB1cyBiYWNrIHRoZSBwb2ludGVycyB3ZSByZXR1cm5lZCwgZXhjZXB0IHRoZSBmaXJzdAorICAgIC8vIG9uZS4gVGhhdCBvbmUgYmVjb21lcyBwYXJ0IG9mIHRoZSBmcmVlbGlzdCBkYXRhIHN0cnVjdHVyZS4KKyAgICBBU1NFUlRfVEhBVChzZWNvbmRfcG9pbnRlcnMsCisgICAgICAgICAgICAgICAgdGVzdGluZzo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dm9pZCo+KHBvaW50ZXJzLmJlZ2luKCkgKyAxLCBwb2ludGVycy5lbmQoKSkpKTsKKyAgfQorfQorCitURVNUKEFyZW5hVGVzdCwgU3BhY2VSZXVzZVBvaXNvbnNBbmRVbnBvaXNvbnNNZW1vcnkpIHsKKyNpZmRlZiBBRERSRVNTX1NBTklUSVpFUgorICBjaGFyIGJ1ZlsxMDI0XXt9OworICB7CisgICAgQXJlbmEgYXJlbmEoYnVmLCBzaXplb2YoYnVmKSk7CisgICAgc3RkOjp2ZWN0b3I8dm9pZCo+IHBvaW50ZXJzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICAgIHBvaW50ZXJzLnB1c2hfYmFjayhBcmVuYTo6Q3JlYXRlQXJyYXk8Y2hhcj4oJmFyZW5hLCAxNikpOworICAgIH0KKyAgICBmb3IgKHZvaWQqIHAgOiBwb2ludGVycykgeworICAgICAgaW50ZXJuYWw6OkFyZW5hVGVzdFBlZXI6OlJldHVybkFycmF5TWVtb3J5KCZhcmVuYSwgcCwgMTYpOworICAgICAgLy8gVGhlIGZpcnN0IG9uZSBpcyBub3QgcG9pc29uZWQgYmVjYXVzZSBpdCBiZWNvbWVzIHRoZSBmcmVlbGlzdC4KKyAgICAgIGlmIChwICE9IHBvaW50ZXJzWzBdKSBFWFBFQ1RfVFJVRShfX2FzYW5fYWRkcmVzc19pc19wb2lzb25lZChwKSk7CisgICAgfQorCisgICAgYm9vbCBmb3VuZF9wb2lzb24gPSBmYWxzZTsKKyAgICBmb3IgKGNoYXImIGMgOiBidWYpIHsKKyAgICAgIGlmIChfX2FzYW5fYWRkcmVzc19pc19wb2lzb25lZCgmYykpIHsKKyAgICAgICAgZm91bmRfcG9pc29uID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIEVYUEVDVF9UUlVFKGZvdW5kX3BvaXNvbik7CisgIH0KKworICAvLyBTaG91bGQgbm90IGJlIHBvaXNvbmVkIGFmdGVyIGRlc3RydWN0aW9uLgorICBmb3IgKGNoYXImIGMgOiBidWYpIHsKKyAgICBBU1NFUlRfRkFMU0UoX19hc2FuX2FkZHJlc3NfaXNfcG9pc29uZWQoJmMpKTsKKyAgfQorCisjZWxzZSAgIC8vIEFERFJFU1NfU0FOSVRJWkVSCisgIEdURVNUX1NLSVAoKTsKKyNlbmRpZiAgLy8gQUREUkVTU19TQU5JVElaRVIKK30KKworbmFtZXNwYWNlIHsKK3VpbnQzMl90IGhvb2tzX251bV9pbml0ID0gMDsKK3VpbnQzMl90IGhvb2tzX251bV9hbGxvY2F0aW9ucyA9IDA7Cit1aW50MzJfdCBob29rc19udW1fcmVzZXQgPSAwOwordWludDMyX3QgaG9va3NfbnVtX2Rlc3RydWN0ID0gMDsKKwordm9pZCBDbGVhckhvb2tDb3VudHMoKSB7CisgIGhvb2tzX251bV9pbml0ID0gMDsKKyAgaG9va3NfbnVtX2FsbG9jYXRpb25zID0gMDsKKyAgaG9va3NfbnVtX3Jlc2V0ID0gMDsKKyAgaG9va3NfbnVtX2Rlc3RydWN0ID0gMDsKK30KK30gIC8vIG5hbWVzcGFjZQorCisvLyBBIGhlbHBlciB1dGlsaXR5IGNsYXNzIHRoYXQgaGFuZGxlcyBhcmVuYSBjYWxsYmFja3MuCitjbGFzcyBBcmVuYU9wdGlvbnNUZXN0RnJpZW5kIGZpbmFsIDogcHVibGljIGludGVybmFsOjpBcmVuYU1ldHJpY3NDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgc3RhdGljIGludGVybmFsOjpBcmVuYU1ldHJpY3NDb2xsZWN0b3IqIE5ld1dpdGhBbGxvY3MoKSB7CisgICAgcmV0dXJuIG5ldyBBcmVuYU9wdGlvbnNUZXN0RnJpZW5kKHRydWUpOworICB9CisKKyAgc3RhdGljIGludGVybmFsOjpBcmVuYU1ldHJpY3NDb2xsZWN0b3IqIE5ld1dpdGhvdXRBbGxvY3MoKSB7CisgICAgcmV0dXJuIG5ldyBBcmVuYU9wdGlvbnNUZXN0RnJpZW5kKGZhbHNlKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIEVuYWJsZShBcmVuYU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgICBDbGVhckhvb2tDb3VudHMoKTsKKyAgICBvcHRpb25zLT5tYWtlX21ldHJpY3NfY29sbGVjdG9yID0gJkFyZW5hT3B0aW9uc1Rlc3RGcmllbmQ6Ok5ld1dpdGhBbGxvY3M7CisgIH0KKworICBzdGF0aWMgdm9pZCBFbmFibGVXaXRob3V0QWxsb2NzKEFyZW5hT3B0aW9ucyogb3B0aW9ucykgeworICAgIENsZWFySG9va0NvdW50cygpOworICAgIG9wdGlvbnMtPm1ha2VfbWV0cmljc19jb2xsZWN0b3IgPSAmQXJlbmFPcHRpb25zVGVzdEZyaWVuZDo6TmV3V2l0aG91dEFsbG9jczsKKyAgfQorCisgIGV4cGxpY2l0IEFyZW5hT3B0aW9uc1Rlc3RGcmllbmQoYm9vbCByZWNvcmRfYWxsb2NzKQorICAgICAgOiBBcmVuYU1ldHJpY3NDb2xsZWN0b3IocmVjb3JkX2FsbG9jcykgeworICAgICsraG9va3NfbnVtX2luaXQ7CisgIH0KKyAgdm9pZCBPbkRlc3Ryb3kodWludDY0X3Qgc3BhY2VfYWxsb2NhdGVkKSBvdmVycmlkZSB7CisgICAgKytob29rc19udW1fZGVzdHJ1Y3Q7CisgICAgZGVsZXRlIHRoaXM7CisgIH0KKyAgdm9pZCBPblJlc2V0KHVpbnQ2NF90IHNwYWNlX2FsbG9jYXRlZCkgb3ZlcnJpZGUgeyArK2hvb2tzX251bV9yZXNldDsgfQorICB2b2lkIE9uQWxsb2MoY29uc3Qgc3RkOjp0eXBlX2luZm8qIGFsbG9jYXRlZF90eXBlLAorICAgICAgICAgICAgICAgdWludDY0X3QgYWxsb2Nfc2l6ZSkgb3ZlcnJpZGUgeworICAgICsraG9va3NfbnVtX2FsbG9jYXRpb25zOworICB9Cit9OworCisvLyBUZXN0IHRoZSBob29rcyBhcmUgY29ycmVjdGx5IGNhbGxlZC4KK1RFU1QoQXJlbmFUZXN0LCBBcmVuYUhvb2tzU2FuaXR5KSB7CisgIEFyZW5hT3B0aW9ucyBvcHRpb25zOworICBBcmVuYU9wdGlvbnNUZXN0RnJpZW5kOjpFbmFibGUoJm9wdGlvbnMpOworCisgIC8vIFNjb3BlIGZvciBkZWZpbmluZyB0aGUgYXJlbmEKKyAgeworICAgIEFyZW5hIGFyZW5hKG9wdGlvbnMpOworICAgIEVYUEVDVF9FUSgxLCBob29rc19udW1faW5pdCk7CisgICAgRVhQRUNUX0VRKDAsIGhvb2tzX251bV9hbGxvY2F0aW9ucyk7CisgICAgQXJlbmE6OkNyZWF0ZTx1aW50NjRfdD4oJmFyZW5hKTsKKyAgICBpZiAoc3RkOjppc190cml2aWFsbHlfZGVzdHJ1Y3RpYmxlPHVpbnQ2NF90Pjo6dmFsdWUpIHsKKyAgICAgIEVYUEVDVF9FUSgxLCBob29rc19udW1fYWxsb2NhdGlvbnMpOworICAgIH0gZWxzZSB7CisgICAgICBFWFBFQ1RfRVEoMiwgaG9va3NfbnVtX2FsbG9jYXRpb25zKTsKKyAgICB9CisgICAgYXJlbmEuUmVzZXQoKTsKKyAgICBhcmVuYS5SZXNldCgpOworICAgIEVYUEVDVF9FUSgyLCBob29rc19udW1fcmVzZXQpOworICB9CisgIEVYUEVDVF9FUSgyLCBob29rc19udW1fcmVzZXQpOworICBFWFBFQ1RfRVEoMSwgaG9va3NfbnVtX2Rlc3RydWN0KTsKK30KKworLy8gVGVzdCB0aGF0IGFsbG9jYXRpb24gaG9va3MgYXJlIG5vdCBjYWxsZWQgd2hlbiB3ZSBkb24ndCBuZWVkIHRoZW0uCitURVNUKEFyZW5hVGVzdCwgQXJlbmFIb29rc1doZW5BbGxvY2F0aW9uc05vdE5lZWRlZCkgeworICBBcmVuYU9wdGlvbnMgb3B0aW9uczsKKyAgQXJlbmFPcHRpb25zVGVzdEZyaWVuZDo6RW5hYmxlV2l0aG91dEFsbG9jcygmb3B0aW9ucyk7CisKKyAgQXJlbmEgYXJlbmEob3B0aW9ucyk7CisgIEVYUEVDVF9FUSgwLCBob29rc19udW1fYWxsb2NhdGlvbnMpOworICBBcmVuYTo6Q3JlYXRlPHVpbnQ2NF90PigmYXJlbmEpOworICBFWFBFQ1RfRVEoMCwgaG9va3NfbnVtX2FsbG9jYXRpb25zKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMGM5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmNjCkBAIC0wLDAgKzEsMjY3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oPgorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL211dGV4Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BhcnNlX2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisvLyBjbGFuZy1mb3JtYXQgb24KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworbmFtZXNwYWNlICB7CisKKy8vIFRhZ2dlZFN0cmluZ1B0cjo6RmxhZ3MgdXNlcyB0aGUgbG93ZXIgMiBiaXRzIGFzIHRhZ3MuCisvLyBFbmZvcmNlIHRoYXQgYWxsb2NhdGVkIGRhdGEgYWxpZ25zIHRvIGF0IGxlYXN0IDQgYnl0ZXMsIGFuZCB0aGF0CisvLyB0aGUgYWxpZ25tZW50IG9mIHRoZSBnbG9iYWwgY29uc3Qgc3RyaW5nIHZhbHVlIGRvZXMgYXMgd2VsbC4KKy8vIFRoZSBhbGlnbm1lbnQgZ3VhcmFudGVlZCBieSBgbmV3IHN0ZDo6c3RyaW5nYCBkZXBlbmRzIG9uIGJvdGg6CisvLyAtIG5ldyBhbGlnbiA9IF9fU1REQ1BQX0RFRkFVTFRfTkVXX0FMSUdOTUVOVF9fIC8gbWF4X2FsaWduX3QKKy8vIC0gYWxpZ25vZihzdGQ6OnN0cmluZykKKyNpZmRlZiBfX1NURENQUF9ERUZBVUxUX05FV19BTElHTk1FTlRfXworY29uc3RleHByIHNpemVfdCBrTmV3QWxpZ24gPSBfX1NURENQUF9ERUZBVUxUX05FV19BTElHTk1FTlRfXzsKKyNlbGlmIChfX0dOVUNfXyAqIDEwMDAwICsgX19HTlVDX01JTk9SX18gKiAxMDAgKyBfX0dOVUNfUEFUQ0hMRVZFTF9fKSA8IDQwOTAwCitjb25zdGV4cHIgc2l6ZV90IGtOZXdBbGlnbiA9IGFsaWdub2YoOjptYXhfYWxpZ25fdCk7CisjZWxzZQorY29uc3RleHByIHNpemVfdCBrTmV3QWxpZ24gPSBhbGlnbm9mKHN0ZDo6bWF4X2FsaWduX3QpOworI2VuZGlmCitjb25zdGV4cHIgc2l6ZV90IGtTdHJpbmdBbGlnbiA9IGFsaWdub2Yoc3RkOjpzdHJpbmcpOworCitzdGF0aWNfYXNzZXJ0KChrU3RyaW5nQWxpZ24gPiBrTmV3QWxpZ24gPyBrU3RyaW5nQWxpZ24gOiBrTmV3QWxpZ24pID49IDQsICIiKTsKK3N0YXRpY19hc3NlcnQoYWxpZ25vZihFeHBsaWNpdGx5Q29uc3RydWN0ZWRBcmVuYVN0cmluZykgPj0gNCwgIiIpOworCit9ICAvLyBuYW1lc3BhY2UKKworY29uc3Qgc3RkOjpzdHJpbmcmIExhenlTdHJpbmc6OkluaXQoKSBjb25zdCB7CisgIHN0YXRpYyBXcmFwcGVkTXV0ZXggbXV7R09PR0xFX1BST1RPQlVGX0xJTktFUl9JTklUSUFMSVpFRH07CisgIG11LkxvY2soKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcqIHJlcyA9IGluaXRlZF8ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgaWYgKHJlcyA9PSBudWxscHRyKSB7CisgICAgYXV0byBpbml0X3ZhbHVlID0gaW5pdF92YWx1ZV87CisgICAgcmVzID0gOjpuZXcgKHN0YXRpY19jYXN0PHZvaWQqPihzdHJpbmdfYnVmXykpCisgICAgICAgIHN0ZDo6c3RyaW5nKGluaXRfdmFsdWUucHRyLCBpbml0X3ZhbHVlLnNpemUpOworICAgIGluaXRlZF8uc3RvcmUocmVzLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgfQorICBtdS5VbmxvY2soKTsKKyAgcmV0dXJuICpyZXM7Cit9CisKK25hbWVzcGFjZSB7CisKKworI2lmIGRlZmluZWQoTkRFQlVHKSB8fCAhR09PR0xFX1BST1RPQlVGX0lOVEVSTkFMX0RPTkFURV9TVEVBTAorCitjbGFzcyBTY29wZWRDaGVja1B0ckludmFyaWFudHMgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgU2NvcGVkQ2hlY2tQdHJJbnZhcmlhbnRzKGNvbnN0IFRhZ2dlZFN0cmluZ1B0ciopIHt9Cit9OworCisjZW5kaWYgIC8vIE5ERUJVRyB8fCAhR09PR0xFX1BST1RPQlVGX0lOVEVSTkFMX0RPTkFURV9TVEVBTAorCisvLyBDcmVhdGVzIGEgaGVhcCBhbGxvY2F0ZWQgc3RkOjpzdHJpbmcgdmFsdWUuCitpbmxpbmUgVGFnZ2VkU3RyaW5nUHRyIENyZWF0ZVN0cmluZyhDb25zdFN0cmluZ1BhcmFtIHZhbHVlKSB7CisgIFRhZ2dlZFN0cmluZ1B0ciByZXM7CisgIHJlcy5TZXRBbGxvY2F0ZWQobmV3IHN0ZDo6c3RyaW5nKHZhbHVlLmRhdGEoKSwgdmFsdWUubGVuZ3RoKCkpKTsKKyAgcmV0dXJuIHJlczsKK30KKworI2lmICFHT09HTEVfUFJPVE9CVUZfSU5URVJOQUxfRE9OQVRFX1NURUFMCisKKy8vIENyZWF0ZXMgYW4gYXJlbmEgYWxsb2NhdGVkIHN0ZDo6c3RyaW5nIHZhbHVlLgorVGFnZ2VkU3RyaW5nUHRyIENyZWF0ZUFyZW5hU3RyaW5nKEFyZW5hJiBhcmVuYSwgQ29uc3RTdHJpbmdQYXJhbSBzKSB7CisgIFRhZ2dlZFN0cmluZ1B0ciByZXM7CisgIHJlcy5TZXRNdXRhYmxlQXJlbmEoQXJlbmE6OkNyZWF0ZTxzdGQ6OnN0cmluZz4oJmFyZW5hLCBzLmRhdGEoKSwgcy5sZW5ndGgoKSkpOworICByZXR1cm4gcmVzOworfQorCisjZW5kaWYgIC8vICFHT09HTEVfUFJPVE9CVUZfSU5URVJOQUxfRE9OQVRFX1NURUFMCisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIEFyZW5hU3RyaW5nUHRyOjpTZXQoQ29uc3RTdHJpbmdQYXJhbSB2YWx1ZSwgQXJlbmEqIGFyZW5hKSB7CisgIFNjb3BlZENoZWNrUHRySW52YXJpYW50cyBjaGVjaygmdGFnZ2VkX3B0cl8pOworICBpZiAoSXNEZWZhdWx0KCkpIHsKKyAgICAvLyBJZiB3ZSdyZSBub3Qgb24gYW4gYXJlbmEsIHNraXAgc3RyYWlnaHQgdG8gYSB0cnVlIHN0cmluZyB0byBhdm9pZAorICAgIC8vIHBvc3NpYmxlIGNvcHkgY29zdCBsYXRlci4KKyAgICB0YWdnZWRfcHRyXyA9IGFyZW5hICE9IG51bGxwdHIgPyBDcmVhdGVBcmVuYVN0cmluZygqYXJlbmEsIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENyZWF0ZVN0cmluZyh2YWx1ZSk7CisgIH0gZWxzZSB7CisgICAgVW5zYWZlTXV0YWJsZVBvaW50ZXIoKS0+YXNzaWduKHZhbHVlLmRhdGEoKSwgdmFsdWUubGVuZ3RoKCkpOworICB9Cit9CisKK3ZvaWQgQXJlbmFTdHJpbmdQdHI6OlNldChzdGQ6OnN0cmluZyYmIHZhbHVlLCBBcmVuYSogYXJlbmEpIHsKKyAgU2NvcGVkQ2hlY2tQdHJJbnZhcmlhbnRzIGNoZWNrKCZ0YWdnZWRfcHRyXyk7CisgIGlmIChJc0RlZmF1bHQoKSkgeworICAgIE5ld1N0cmluZyhhcmVuYSwgc3RkOjptb3ZlKHZhbHVlKSk7CisgIH0gZWxzZSBpZiAoSXNGaXhlZFNpemVBcmVuYSgpKSB7CisgICAgc3RkOjpzdHJpbmcqIGN1cnJlbnQgPSB0YWdnZWRfcHRyXy5HZXQoKTsKKyAgICBhdXRvKiBzID0gbmV3IChjdXJyZW50KSBzdGQ6OnN0cmluZyhzdGQ6Om1vdmUodmFsdWUpKTsKKyAgICBhcmVuYS0+T3duRGVzdHJ1Y3RvcihzKTsKKyAgICB0YWdnZWRfcHRyXy5TZXRNdXRhYmxlQXJlbmEocyk7CisgIH0gZWxzZSAvKiAhSXNGaXhlZFNpemVBcmVuYSgpICovIHsKKyAgICAqVW5zYWZlTXV0YWJsZVBvaW50ZXIoKSA9IHN0ZDo6bW92ZSh2YWx1ZSk7CisgIH0KK30KKworc3RkOjpzdHJpbmcqIEFyZW5hU3RyaW5nUHRyOjpNdXRhYmxlKEFyZW5hKiBhcmVuYSkgeworICBTY29wZWRDaGVja1B0ckludmFyaWFudHMgY2hlY2soJnRhZ2dlZF9wdHJfKTsKKyAgaWYgKHRhZ2dlZF9wdHJfLklzTXV0YWJsZSgpKSB7CisgICAgcmV0dXJuIHRhZ2dlZF9wdHJfLkdldCgpOworICB9IGVsc2UgeworICAgIHJldHVybiBNdXRhYmxlU2xvdyhhcmVuYSk7CisgIH0KK30KKworc3RkOjpzdHJpbmcqIEFyZW5hU3RyaW5nUHRyOjpNdXRhYmxlKGNvbnN0IExhenlTdHJpbmcmIGRlZmF1bHRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJlbmEqIGFyZW5hKSB7CisgIFNjb3BlZENoZWNrUHRySW52YXJpYW50cyBjaGVjaygmdGFnZ2VkX3B0cl8pOworICBpZiAodGFnZ2VkX3B0cl8uSXNNdXRhYmxlKCkpIHsKKyAgICByZXR1cm4gdGFnZ2VkX3B0cl8uR2V0KCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE11dGFibGVTbG93KGFyZW5hLCBkZWZhdWx0X3ZhbHVlKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyogQXJlbmFTdHJpbmdQdHI6Ok11dGFibGVOb0NvcHkoQXJlbmEqIGFyZW5hKSB7CisgIFNjb3BlZENoZWNrUHRySW52YXJpYW50cyBjaGVjaygmdGFnZ2VkX3B0cl8pOworICBpZiAodGFnZ2VkX3B0cl8uSXNNdXRhYmxlKCkpIHsKKyAgICByZXR1cm4gdGFnZ2VkX3B0cl8uR2V0KCk7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDSyhJc0RlZmF1bHQoKSk7CisgICAgLy8gQWxsb2NhdGUgZW1wdHkuIFRoZSBjb250ZW50cyBhcmUgbm90IHJlbGV2YW50LgorICAgIHJldHVybiBOZXdTdHJpbmcoYXJlbmEpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBMYXp5Pgorc3RkOjpzdHJpbmcqIEFyZW5hU3RyaW5nUHRyOjpNdXRhYmxlU2xvdyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGF6eSYuLi4gbGF6eV9kZWZhdWx0KSB7CisgIEdPT0dMRV9EQ0hFQ0soSXNEZWZhdWx0KCkpOworCisgIC8vIEZvciBlbXB0eSBkZWZhdWx0cywgdGhpcyBlbmRzIHVwIGNhbGxpbmcgdGhlIGRlZmF1bHQgY29uc3RydWN0b3Igd2hpY2ggaXMKKyAgLy8gbW9yZSBlZmZpY2llbnQgdGhhbiBhIGNvcHkgY29uc3RydWN0aW9uIGZyb20KKyAgLy8gR2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkuCisgIHJldHVybiBOZXdTdHJpbmcoYXJlbmEsIGxhenlfZGVmYXVsdC5nZXQoKS4uLik7Cit9CisKK3N0ZDo6c3RyaW5nKiBBcmVuYVN0cmluZ1B0cjo6UmVsZWFzZSgpIHsKKyAgU2NvcGVkQ2hlY2tQdHJJbnZhcmlhbnRzIGNoZWNrKCZ0YWdnZWRfcHRyXyk7CisgIGlmIChJc0RlZmF1bHQoKSkgcmV0dXJuIG51bGxwdHI7CisKKyAgc3RkOjpzdHJpbmcqIHJlbGVhc2VkID0gdGFnZ2VkX3B0cl8uR2V0KCk7CisgIGlmICh0YWdnZWRfcHRyXy5Jc0FyZW5hKCkpIHsKKyAgICByZWxlYXNlZCA9IHRhZ2dlZF9wdHJfLklzTXV0YWJsZSgpID8gbmV3IHN0ZDo6c3RyaW5nKHN0ZDo6bW92ZSgqcmVsZWFzZWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgc3RkOjpzdHJpbmcoKnJlbGVhc2VkKTsKKyAgfQorICBJbml0RGVmYXVsdCgpOworICByZXR1cm4gcmVsZWFzZWQ7Cit9CisKK3ZvaWQgQXJlbmFTdHJpbmdQdHI6OlNldEFsbG9jYXRlZChzdGQ6OnN0cmluZyogdmFsdWUsIEFyZW5hKiBhcmVuYSkgeworICBTY29wZWRDaGVja1B0ckludmFyaWFudHMgY2hlY2soJnRhZ2dlZF9wdHJfKTsKKyAgLy8gUmVsZWFzZSB3aGF0IHdlIGhhdmUgZmlyc3QuCisgIERlc3Ryb3koKTsKKworICBpZiAodmFsdWUgPT0gbnVsbHB0cikgeworICAgIEluaXREZWZhdWx0KCk7CisgIH0gZWxzZSB7CisjaWZuZGVmIE5ERUJVRworICAgIC8vIE9uIGRlYnVnIGJ1aWxkcywgY29weSB0aGUgc3RyaW5nIHNvIHRoZSBhZGRyZXNzIGRpZmZlcnMuICBkZWxldGUgd2lsbAorICAgIC8vIGZhaWwgaWYgdmFsdWUgd2FzIGEgc3RhY2stYWxsb2NhdGVkIHRlbXBvcmFyeS9ldGMuLCB3aGljaCB3b3VsZCBoYXZlCisgICAgLy8gZmFpbGVkIHdoZW4gYXJlbmEgcmFuIGl0cyBjbGVhbnVwIGxpc3QuCisgICAgc3RkOjpzdHJpbmcqIG5ld192YWx1ZSA9IG5ldyBzdGQ6OnN0cmluZyhzdGQ6Om1vdmUoKnZhbHVlKSk7CisgICAgZGVsZXRlIHZhbHVlOworICAgIHZhbHVlID0gbmV3X3ZhbHVlOworI2VuZGlmICAvLyAhTkRFQlVHCisgICAgSW5pdEFsbG9jYXRlZCh2YWx1ZSwgYXJlbmEpOworICB9Cit9CisKK3ZvaWQgQXJlbmFTdHJpbmdQdHI6OkRlc3Ryb3koKSB7CisgIGRlbGV0ZSB0YWdnZWRfcHRyXy5HZXRJZkFsbG9jYXRlZCgpOworfQorCit2b2lkIEFyZW5hU3RyaW5nUHRyOjpDbGVhclRvRW1wdHkoKSB7CisgIFNjb3BlZENoZWNrUHRySW52YXJpYW50cyBjaGVjaygmdGFnZ2VkX3B0cl8pOworICBpZiAoSXNEZWZhdWx0KCkpIHsKKyAgICAvLyBBbHJlYWR5IHNldCB0byBkZWZhdWx0IC0tIGRvIG5vdGhpbmcuCisgIH0gZWxzZSB7CisgICAgLy8gVW5jb25kaXRpb25hbGx5IG1hc2sgYXdheSB0aGUgdGFnLgorICAgIC8vCisgICAgLy8gVXBkYXRlQXJlbmFTdHJpbmcgdXNlcyBhc3NpZ24gd2hlbiBjYXBhY2l0eSBpcyBsYXJnZXIgdGhhbiB0aGUgbmV3CisgICAgLy8gdmFsdWUsIHdoaWNoIGlzIHRyaXZpYWxseSB0cnVlIGluIHRoZSBkb25hdGVkIHN0cmluZyBjYXNlLgorICAgIC8vIGNvbnN0X2Nhc3Q8c3RkOjpzdHJpbmcqPihQdHJWYWx1ZTxzdGQ6OnN0cmluZz4oKSktPmNsZWFyKCk7CisgICAgdGFnZ2VkX3B0cl8uR2V0KCktPmNsZWFyKCk7CisgIH0KK30KKwordm9pZCBBcmVuYVN0cmluZ1B0cjo6Q2xlYXJUb0RlZmF1bHQoY29uc3QgTGF6eVN0cmluZyYgZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSB7CisgIFNjb3BlZENoZWNrUHRySW52YXJpYW50cyBjaGVjaygmdGFnZ2VkX3B0cl8pOworICAodm9pZClhcmVuYTsKKyAgaWYgKElzRGVmYXVsdCgpKSB7CisgICAgLy8gQWxyZWFkeSBzZXQgdG8gZGVmYXVsdCAtLSBkbyBub3RoaW5nLgorICB9IGVsc2UgeworICAgIFVuc2FmZU11dGFibGVQb2ludGVyKCktPmFzc2lnbihkZWZhdWx0X3ZhbHVlLmdldCgpKTsKKyAgfQorfQorCitjb25zdCBjaGFyKiBFcHNDb3B5SW5wdXRTdHJlYW06OlJlYWRBcmVuYVN0cmluZyhjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmVuYVN0cmluZ1B0ciogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZW5hKiBhcmVuYSkgeworICBTY29wZWRDaGVja1B0ckludmFyaWFudHMgY2hlY2soJnMtPnRhZ2dlZF9wdHJfKTsKKyAgR09PR0xFX0RDSEVDSyhhcmVuYSAhPSBudWxscHRyKTsKKworICBpbnQgc2l6ZSA9IFJlYWRTaXplKCZwdHIpOworICBpZiAoIXB0cikgcmV0dXJuIG51bGxwdHI7CisKKyAgYXV0byogc3RyID0gcy0+TmV3U3RyaW5nKGFyZW5hKTsKKyAgcHRyID0gUmVhZFN0cmluZyhwdHIsIHNpemUsIHN0cik7CisgIEdPT0dMRV9QUk9UT0JVRl9QQVJTRVJfQVNTRVJUKHB0cik7CisgIHJldHVybiBwdHI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjODM5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaApAQCAtMCwwICsxLDQ4MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0FSRU5BU1RSSU5HX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJFTkFTVFJJTkdfSF9fCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHBsaWNpdGx5X2NvbnN0cnVjdGVkLmg+CisKKy8vIG11c3QgYmUgbGFzdDoKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCisjaWZkZWYgU1dJRworI2Vycm9yICJZb3UgY2Fubm90IFNXSUcgcHJvdG8gaGVhZGVycyIKKyNlbmRpZgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBFcHNDb3B5SW5wdXRTdHJlYW07CisKK2NsYXNzIFN3YXBGaWVsZEhlbHBlcjsKKworLy8gRGVjbGFyZWQgaW4gbWVzc2FnZV9saXRlLmgKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gRXhwbGljaXRseUNvbnN0cnVjdGVkQXJlbmFTdHJpbmcKKyAgICBmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZzsKKworLy8gTGF6eSBzdHJpbmcgaW5zdGFuY2UgdG8gc3VwcG9ydCBzdHJpbmcgZmllbGRzIHdpdGggbm9uLWVtcHR5IGRlZmF1bHQuCisvLyBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgb24gdGhlIGZpcnN0IGNhbGwgdG8gLmdldCgpLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIExhenlTdHJpbmcgeworIHB1YmxpYzoKKyAgLy8gV2UgZXhwbGljaXRseSBtYWtlIExhenlTdHJpbmcgYW4gYWdncmVnYXRlIHNvIHRoYXQgTVNWQyBjYW4gZG8gY29uc3RhbnQKKyAgLy8gaW5pdGlhbGl6YXRpb24gb24gaXQgd2l0aG91dCBtYXJraW5nIGl0IGBjb25zdGV4cHJgLgorICAvLyBXZSBkbyBub3Qgd2FudCB0byB1c2UgYGNvbnN0ZXhwcmAgYmVjYXVzZSBpdCBtYWtlcyBpdCBoYXJkZXIgdG8gaGF2ZSBleHRlcm4KKyAgLy8gc3RvcmFnZSBmb3IgaXQgYW5kIGNhdXNlcyBsaWJyYXJ5IGJsb2F0LgorICBzdHJ1Y3QgSW5pdFZhbHVlIHsKKyAgICBjb25zdCBjaGFyKiBwdHI7CisgICAgc2l6ZV90IHNpemU7CisgIH07CisgIC8vIFdlIGtlZXAgYSB1bmlvbiBvZiB0aGUgaW5pdGlhbGl6YXRpb24gdmFsdWUgYW5kIHRoZSBzdGQ6OnN0cmluZyB0byBzYXZlIG9uCisgIC8vIHNwYWNlLiBXZSBkb24ndCBuZWVkIHRoZSBzdHJpbmcgYXJyYXkgYWZ0ZXIgSW5pdCgpIGlzIGRvbmUuCisgIHVuaW9uIHsKKyAgICBtdXRhYmxlIEluaXRWYWx1ZSBpbml0X3ZhbHVlXzsKKyAgICBhbGlnbmFzKHN0ZDo6c3RyaW5nKSBtdXRhYmxlIGNoYXIgc3RyaW5nX2J1Zl9bc2l6ZW9mKHN0ZDo6c3RyaW5nKV07CisgIH07CisgIG11dGFibGUgc3RkOjphdG9taWM8Y29uc3Qgc3RkOjpzdHJpbmcqPiBpbml0ZWRfOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXQoKSBjb25zdCB7CisgICAgLy8gVGhpcyBjaGVjayBnZW5lcmF0ZXMgbGVzcyBjb2RlIHRoYW4gYSBjYWxsLW9uY2UgaW52b2NhdGlvbi4KKyAgICBhdXRvKiByZXMgPSBpbml0ZWRfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UocmVzID09IG51bGxwdHIpKSByZXR1cm4gSW5pdCgpOworICAgIHJldHVybiAqcmVzOworICB9CisKKyBwcml2YXRlOgorICAvLyBJbml0aWFsaXplIHRoZSBzdHJpbmcgaW4gYHN0cmluZ19idWZfYCwgdXBkYXRlIGBpbml0ZWRfYCBhbmQgcmV0dXJuIGl0LgorICAvLyBXZSByZXR1cm4gaXQgaGVyZSB0byBhdm9pZCBoYXZpbmcgdG8gcmVhZCBpdCBhZ2FpbiBpbiB0aGUgaW5saW5lZCBjb2RlLgorICBjb25zdCBzdGQ6OnN0cmluZyYgSW5pdCgpIGNvbnN0OworfTsKKworY2xhc3MgVGFnZ2VkU3RyaW5nUHRyIHsKKyBwdWJsaWM6CisgIC8vIEJpdCBmbGFncyBxdWFsaWZ5aW5nIHN0cmluZyBwcm9wZXJ0aWVzLiBXZSBjYW4gdXNlIDIgYml0cyBhcworICAvLyBwdHJfIGlzIGd1YXJhbnRlZWQgYW5kIGVuZm9yY2VkIHRvIGJlIGFsaWduZWQgb24gNCBieXRlIGJvdW5kYXJpZXMuCisgIGVudW0gRmxhZ3MgeworICAgIGtBcmVuYUJpdCA9IDB4MSwgICAgICAvLyBwdHIgaXMgYXJlbmEgYWxsb2NhdGVkCisgICAga011dGFibGVCaXQgPSAweDIsICAgIC8vIHB0ciBjb250ZW50cyBhcmUgZnVsbHkgbXV0YWJsZQorICAgIGtNYXNrID0gMHgzICAgICAgICAgICAvLyBCaXQgbWFzaworICB9OworCisgIC8vIENvbXBvc2VkIGxvZ2ljYWwgdHlwZXMKKyAgZW51bSBUeXBlIHsKKyAgICAvLyBEZWZhdWx0IHN0cmluZ3MgYXJlIGltbXV0YWJsZSBhbmQgbmV2ZXIgb3duZWQuCisgICAga0RlZmF1bHQgPSAwLAorCisgICAgLy8gQWxsb2NhdGVkIHN0cmluZ3MgYXJlIG11dGFibGUgYW5kIChhcyB0aGUgbmFtZSBpbXBsaWVzKSBvd25lZC4KKyAgICAvLyBBIGhlYXAgYWxsb2NhdGVkIHN0cmluZyBtdXN0IGJlIGRlbGV0ZWQuCisgICAga0FsbG9jYXRlZCA9IGtNdXRhYmxlQml0LAorCisgICAgLy8gTXV0YWJsZSBhcmVuYSBzdHJpbmdzIGFyZSBzdHJpbmdzIHdoZXJlIHRoZSBzdHJpbmcgaW5zdGFuY2UgaXMgb3duZWQKKyAgICAvLyBieSB0aGUgYXJlbmEsIGJ1dCB0aGUgc3RyaW5nIGNvbnRlbnRzIGl0c2VsZiBhcmUgb3duZWQgYnkgdGhlIHN0cmluZworICAgIC8vIGluc3RhbmNlLiBNdXRhYmxlIGFyZW5hIHN0cmluZyBpbnN0YW5jZXMgbmVlZCB0byBiZSBkZXN0cm95ZWQgd2hpY2ggaXMKKyAgICAvLyB0eXBpY2FsbHkgZG9uZSB0aHJvdWdoIGEgY2xlYW51cCBhY3Rpb24gYWRkZWQgdG8gdGhlIGFyZW5hIG93bmluZyBpdC4KKyAgICBrTXV0YWJsZUFyZW5hID0ga0FyZW5hQml0IHwga011dGFibGVCaXQsCisKKyAgICAvLyBGaXhlZCBzaXplIGFyZW5hIHN0cmluZ3MgYXJlIHN0cmluZ3Mgd2hlcmUgYm90aCB0aGUgc3RyaW5nIGluc3RhbmNlIGFuZAorICAgIC8vIHRoZSBzdHJpbmcgY29udGVudHMgYXJlIGZ1bGx5IG93bmVkIGJ5IHRoZSBhcmVuYS4gRml4ZWQgc2l6ZSBhcmVuYQorICAgIC8vIHN0cmluZ3MgYXJlIGEgcGxhdGZvcm0gYW5kIGMrKyBsaWJyYXJ5IHNwZWNpZmljIGN1c3RvbWl6YXRpb24uIEZpeGVkCisgICAgLy8gc2l6ZSBhcmVuYSBzdHJpbmdzIGFyZSBpbW11dGFibGUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBjdXN0b20gaW50ZXJuYWwKKyAgICAvLyB1cGRhdGVzIHRvIHRoZSBjb250ZW50IHRoYXQgZml0IGluc2lkZSB0aGUgZXhpc3RpbmcgY2FwYWNpdHkuCisgICAgLy8gRml4ZWQgc2l6ZSBhcmVuYSBzdHJpbmdzIG11c3QgbmV2ZXIgYmUgZGVsZXRlZCBvciBkZXN0cm95ZWQuCisgICAga0ZpeGVkU2l6ZUFyZW5hID0ga0FyZW5hQml0LAorICB9OworCisgIFRhZ2dlZFN0cmluZ1B0cigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgY29uc3RleHByIFRhZ2dlZFN0cmluZ1B0cihFeHBsaWNpdGx5Q29uc3RydWN0ZWRBcmVuYVN0cmluZyogcHRyKQorICAgICAgOiBwdHJfKHB0cikge30KKworICAvLyBTZXRzIHRoZSB2YWx1ZSB0byBgcGAsIHRhZ2dpbmcgdGhlIHZhbHVlIGFzIGJlaW5nIGEgJ2RlZmF1bHQnIHZhbHVlLgorICAvLyBTZWUgZG9jdW1lbnRhdGlvbiBmb3Iga0RlZmF1bHQgZm9yIG1vcmUgaW5mby4KKyAgaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nKiBTZXREZWZhdWx0KGNvbnN0IHN0ZDo6c3RyaW5nKiBwKSB7CisgICAgcmV0dXJuIFRhZ0FzKGtEZWZhdWx0LCBjb25zdF9jYXN0PHN0ZDo6c3RyaW5nKj4ocCkpOworICB9CisKKyAgLy8gU2V0cyB0aGUgdmFsdWUgdG8gYHBgLCB0YWdnaW5nIHRoZSB2YWx1ZSBhcyBhIGhlYXAgYWxsb2NhdGVkIHZhbHVlLgorICAvLyBBbGxvY2F0ZWQgc3RyaW5ncyBhcmUgbXV0YWJsZSBhbmQgKGFzIHRoZSBuYW1lIGltcGxpZXMpIG93bmVkLgorICAvLyBgcGAgbXVzdCBub3QgYmUgbnVsbAorICBpbmxpbmUgc3RkOjpzdHJpbmcqIFNldEFsbG9jYXRlZChzdGQ6OnN0cmluZyogcCkgeworICAgIHJldHVybiBUYWdBcyhrQWxsb2NhdGVkLCBwKTsKKyAgfQorCisgIC8vIFNldHMgdGhlIHZhbHVlIHRvIGBwYCwgdGFnZ2luZyB0aGUgdmFsdWUgYXMgYSBmaXhlZCBzaXplIGFyZW5hIHN0cmluZy4KKyAgLy8gU2VlIGRvY3VtZW50YXRpb24gZm9yIGtGaXhlZFNpemVBcmVuYSBmb3IgbW9yZSBpbmZvLgorICAvLyBgcGAgbXVzdCBub3QgYmUgbnVsbAorICBpbmxpbmUgc3RkOjpzdHJpbmcqIFNldEZpeGVkU2l6ZUFyZW5hKHN0ZDo6c3RyaW5nKiBwKSB7CisgICAgcmV0dXJuIFRhZ0FzKGtGaXhlZFNpemVBcmVuYSwgcCk7CisgIH0KKworICAvLyBTZXRzIHRoZSB2YWx1ZSB0byBgcGAsIHRhZ2dpbmcgdGhlIHZhbHVlIGFzIGEgbXV0YWJsZSBhcmVuYSBzdHJpbmcuCisgIC8vIFNlZSBkb2N1bWVudGF0aW9uIGZvciBrTXV0YWJsZUFyZW5hIGZvciBtb3JlIGluZm8uCisgIC8vIGBwYCBtdXN0IG5vdCBiZSBudWxsCisgIGlubGluZSBzdGQ6OnN0cmluZyogU2V0TXV0YWJsZUFyZW5hKHN0ZDo6c3RyaW5nKiBwKSB7CisgICAgcmV0dXJuIFRhZ0FzKGtNdXRhYmxlQXJlbmEsIHApOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBzdHJpbmcgYXJlIGZ1bGx5IG11dGFibGUuCisgIGlubGluZSBib29sIElzTXV0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGFzX2ludCgpICYga011dGFibGVCaXQ7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgc3RyaW5nIGlzIGFuIGltbXV0YWJsZSBkZWZhdWx0IHZhbHVlLgorICBpbmxpbmUgYm9vbCBJc0RlZmF1bHQoKSBjb25zdCB7IHJldHVybiAoYXNfaW50KCkgJiBrTWFzaykgPT0ga0RlZmF1bHQ7IH0KKworICAvLyBJZiB0aGUgY3VycmVudCBzdHJpbmcgaXMgYSBoZWFwLWFsbG9jYXRlZCBtdXRhYmxlIHZhbHVlLCByZXR1cm5zIGEgcG9pbnRlcgorICAvLyB0byBpdC4gIFJldHVybnMgbnVsbHB0ciBvdGhlcndpc2UuCisgIGlubGluZSBzdGQ6OnN0cmluZyAqR2V0SWZBbGxvY2F0ZWQoKSBjb25zdCB7CisgICAgYXV0byBhbGxvY2F0ZWQgPSBhc19pbnQoKSBeIGtBbGxvY2F0ZWQ7CisgICAgaWYgKGFsbG9jYXRlZCAmIGtNYXNrKSByZXR1cm4gbnVsbHB0cjsKKworICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnN0cmluZyo+KGFsbG9jYXRlZCk7CisgICAgUFJPVE9CVUZfQVNTVU1FKHB0ciAhPSBudWxscHRyKTsKKyAgICByZXR1cm4gcHRyOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHN0cmluZyBpcyBhbiBhcmVuYSBhbGxvY2F0ZWQgdmFsdWUuCisgIC8vIFRoaXMgbWVhbnMgaXQncyBlaXRoZXIgYSBtdXRhYmxlIG9yIGZpeGVkIHNpemUgYXJlbmEgc3RyaW5nLgorICBpbmxpbmUgYm9vbCBJc0FyZW5hKCkgY29uc3QgeyByZXR1cm4gYXNfaW50KCkgJiBrQXJlbmFCaXQ7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgc3RyaW5nIGlzIGEgZml4ZWQgc2l6ZSBhcmVuYSBhbGxvY2F0ZWQgdmFsdWUuCisgIGlubGluZSBib29sIElzRml4ZWRTaXplQXJlbmEoKSBjb25zdCB7CisgICAgcmV0dXJuIChhc19pbnQoKSAmIGtNYXNrKSA9PSBrRml4ZWRTaXplQXJlbmE7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBjb250YWluZWQgc3RyaW5nIHBvaW50ZXIuCisgIGlubGluZSBzdGQ6OnN0cmluZyogR2V0KCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHN0ZDo6c3RyaW5nKj4oYXNfaW50KCkgJiB+a01hc2spOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjb250YWluZWQgcG9pbnRlciBpcyBudWxsLCBpbmRpY2F0aW5nIHNvbWUgZXJyb3IuCisgIC8vIFRoZSBOdWxsIHZhbHVlIGlzIG9ubHkgdXNlZCBkdXJpbmcgcGFyc2luZyBmb3IgdGVtcG9yYXJ5IHZhbHVlcy4KKyAgLy8gQSBwZXJzaXN0ZWQgQXJlbmFTdHJpbmdQdHIgdmFsdWUgaXMgbmV2ZXIgbnVsbC4KKyAgaW5saW5lIGJvb2wgSXNOdWxsKCkgeyByZXR1cm4gcHRyXyA9PSBudWxscHRyOyB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0X2FsaWduZWQoY29uc3Qgdm9pZCogcCkgeworICAgIEdPT0dMRV9EQ0hFQ0tfRVEocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHApICYga01hc2ssIDBVTCk7CisgIH0KKworICBpbmxpbmUgc3RkOjpzdHJpbmcqIFRhZ0FzKFR5cGUgdHlwZSwgc3RkOjpzdHJpbmcqIHApIHsKKyAgICBHT09HTEVfRENIRUNLKHAgIT0gbnVsbHB0cik7CisgICAgYXNzZXJ0X2FsaWduZWQocCk7CisgICAgcHRyXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihwKSB8IHR5cGUpOworICAgIHJldHVybiBwOworICB9CisKKyAgdWludHB0cl90IGFzX2ludCgpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihwdHJfKTsgfQorICB2b2lkKiBwdHJfOworfTsKKworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3RyaXZpYWw8VGFnZ2VkU3RyaW5nUHRyPjo6dmFsdWUsCisgICAgICAgICAgICAgICJUYWdnZWRTdHJpbmdQdHIgbXVzdCBiZSB0cml2aWFsIik7CisKKy8vIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIGEgcG9pbnRlciB0byBhIHN0ZDo6c3RyaW5nIHdpdGggb3Igd2l0aG91dCBhcmVuYQorLy8gb3duZWQgY29udGVudHMsIHRhZ2dlZCBieSB0aGUgYm90dG9tIGJpdHMgb2YgdGhlIHN0cmluZyBwb2ludGVyLiBJdCBpcyBhCisvLyBoaWdoLWxldmVsIHdyYXBwZXIgdGhhdCBhbG1vc3QgZGlyZWN0bHkgY29ycmVzcG9uZHMgdG8gdGhlIGludGVyZmFjZSByZXF1aXJlZAorLy8gYnkgc3RyaW5nIGZpZWxkcyBpbiBnZW5lcmF0ZWQgY29kZS4gSXQgcmVwbGFjZXMgdGhlIG9sZCBzdGQ6OnN0cmluZyogcG9pbnRlcgorLy8gaW4gc3VjaCBjYXNlcy4KKy8vCisvLyBUaGUgc3RyaW5nIHBvaW50ZXIgaXMgdGFnZ2VkIHRvIGJlIGVpdGhlciBhIGRlZmF1bHQsIGV4dGVybmFsbHkgb3duZWQgdmFsdWUsCisvLyBhIG11dGFibGUgaGVhcCBhbGxvY2F0ZWQgdmFsdWUsIG9yIGFuIGFyZW5hIGFsbG9jYXRlZCB2YWx1ZS4gVGhlIG9iamVjdCB1c2VzCisvLyBhIHNpbmdsZSBnbG9iYWwgaW5zdGFuY2Ugb2YgYW4gZW1wdHkgc3RyaW5nIHRoYXQgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbAorLy8gZGVmYXVsdCB2YWx1ZS4gRmllbGRzIHRoYXQgaGF2ZSBlbXB0eSBkZWZhdWx0IHZhbHVlcyBkaXJlY3RseSB1c2UgdGhpcyBnbG9iYWwKKy8vIGRlZmF1bHQuIEZpZWxkcyB0aGF0IGhhdmUgbm9uIGVtcHR5IGRlZmF1bHQgdmFsdWVzIGFyZSBzdXBwb3J0ZWQgdGhyb3VnaAorLy8gbGF6aWx5IGluaXRpYWxpemVkIGRlZmF1bHQgdmFsdWVzIG1hbmFnZWQgYnkgdGhlIExhenlTdHJpbmcgY2xhc3MuCisvLworLy8gR2VuZXJhdGVkIGNvZGUgYW5kIHJlZmxlY3Rpb24gY29kZSBib3RoIGVuc3VyZSB0aGF0IHB0cl8gaXMgbmV2ZXIgbnVsbC4KKy8vIEJlY2F1c2UgQXJlbmFTdHJpbmdQdHIgaXMgdXNlZCBpbiBvbmVvZiB1bmlvbnMsIGl0cyBjb25zdHJ1Y3RvciBpcyBhIE5PUCBhbmQKKy8vIHRoZSBmaWVsZCBpcyBhbHdheXMgbWFudWFsbHkgaW5pdGlhbGl6ZWQgdmlhIG1ldGhvZCBjYWxscy4KKy8vCisvLyBTZWUgVGFnZ2VkU3RyaW5nUHRyIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlcyBvZiBzdHJpbmcgdmFsdWVzCisvLyBiZWluZyBoZWxkLCBhbmQgdGhlIG11dGFibGUgYW5kIG93bmVyc2hpcCBpbnZhcmlhbnRzIGZvciBlYWNoIHR5cGUuCitzdHJ1Y3QgUFJPVE9CVUZfRVhQT1JUIEFyZW5hU3RyaW5nUHRyIHsKKyAgQXJlbmFTdHJpbmdQdHIoKSA9IGRlZmF1bHQ7CisgIGNvbnN0ZXhwciBBcmVuYVN0cmluZ1B0cihFeHBsaWNpdGx5Q29uc3RydWN0ZWRBcmVuYVN0cmluZyogZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW5pdGlhbGl6ZWQpCisgICAgICA6IHRhZ2dlZF9wdHJfKGRlZmF1bHRfdmFsdWUpIHt9CisKKyAgLy8gQ2FsbGVkIGZyb20gZ2VuZXJhdGVkIGNvZGUgLyByZWZsZWN0aW9uIHJ1bnRpbWUgb25seS4gUmVzZXRzIHZhbHVlIHRvIHBvaW50CisgIC8vIHRvIGEgZGVmYXVsdCBzdHJpbmcgcG9pbnRlciwgd2l0aCB0aGUgc2VtYW50aWNzIHRoYXQgdGhpcyBBcmVuYVN0cmluZ1B0cgorICAvLyBkb2VzIG5vdCBvd24gdGhlIHBvaW50ZWQtdG8gbWVtb3J5LiBEaXNyZWdhcmRzIGluaXRpYWwgdmFsdWUgb2YgcHRyXyAoc28KKyAgLy8gdGhpcyBpcyB0aGUgKk9OTFkqIHNhZmUgbWV0aG9kIHRvIGNhbGwgYWZ0ZXIgY29uc3RydWN0aW9uIG9yIHdoZW4KKyAgLy8gcmVpbml0aWFsaXppbmcgYWZ0ZXIgYmVjb21pbmcgdGhlIGFjdGl2ZSBmaWVsZCBpbiBhIG9uZW9mIHVuaW9uKS4KKyAgaW5saW5lIHZvaWQgSW5pdERlZmF1bHQoKTsKKworICAvLyBTaW1pbGFyIHRvIGBJbml0RGVmYXVsdGAgZXhjZXB0IHRoYXQgaXQgYWxsb3dzIHRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlCisgIC8vIGluaXRpYWxpemVkIHRvIGFuIGV4dGVybmFsbHkgb3duZWQgc3RyaW5nLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJvbQorICAvLyBwYXJzaW5nIGNvZGUuIGBzdHJgIG11c3Qgbm90IGJlIG51bGwgYW5kIG91dGxpdmUgdGhpcyBpbnN0YW5jZS4KKyAgaW5saW5lIHZvaWQgSW5pdEV4dGVybmFsKGNvbnN0IHN0ZDo6c3RyaW5nKiBzdHIpOworCisgIC8vIENhbGxlZCBmcm9tIGdlbmVyYXRlZCBjb2RlIC8gcmVmbGVjdGlvbiBydW50aW1lIG9ubHkuIFJlc2V0cyB0aGUgdmFsdWUgb2YKKyAgLy8gdGhpcyBpbnN0YW5jZXMgdG8gdGhlIGhlYXAgYWxsb2NhdGVkIHZhbHVlIGluIGBzdHJgLiBgc3RyYCBtdXN0IG5vdCBiZQorICAvLyBudWxsLiBJbnZva2VzIGBhcmVuYS0+T3duKHN0cilgIHRvIHRyYW5zZmVyIG93bmVyc2hpcCBpbnRvIHRoZSBhcmVuYSBpZgorICAvLyBgYXJlbmFgIGlzIG5vdCBudWxsLCBlbHNlLCBgc3RyYCB3aWxsIGJlIG93bmVkIGJ5IEFyZW5hU3RyaW5nUHRyLiBUaGlzCisgIC8vIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIEFyZW5hU3RyaW5nUHRyIG9yIG9uIGFuCisgIC8vIGluc3RhbmNlIGtub3duIHRvIG5vdCBjYXJyeSBhbnkgaGVhcCBhbGxvY2F0ZWQgdmFsdWUuCisgIGlubGluZSB2b2lkIEluaXRBbGxvY2F0ZWQoc3RkOjpzdHJpbmcqIHN0ciwgQXJlbmEqIGFyZW5hKTsKKworICB2b2lkIFNldChDb25zdFN0cmluZ1BhcmFtIHZhbHVlLCBBcmVuYSogYXJlbmEpOworICB2b2lkIFNldChzdGQ6OnN0cmluZyYmIHZhbHVlLCBBcmVuYSogYXJlbmEpOworICB2b2lkIFNldChjb25zdCBjaGFyKiBzLCBBcmVuYSogYXJlbmEpOworICB2b2lkIFNldChjb25zdCBjaGFyKiBzLCBzaXplX3QgbiwgQXJlbmEqIGFyZW5hKTsKKworICB2b2lkIFNldEJ5dGVzKENvbnN0U3RyaW5nUGFyYW0gdmFsdWUsIEFyZW5hKiBhcmVuYSk7CisgIHZvaWQgU2V0Qnl0ZXMoc3RkOjpzdHJpbmcmJiB2YWx1ZSwgQXJlbmEqIGFyZW5hKTsKKyAgdm9pZCBTZXRCeXRlcyhjb25zdCBjaGFyKiBzLCBBcmVuYSogYXJlbmEpOworICB2b2lkIFNldEJ5dGVzKGNvbnN0IHZvaWQqIHAsIHNpemVfdCBuLCBBcmVuYSogYXJlbmEpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZWZXcmFwcGVkVHlwZT4KKyAgdm9pZCBTZXQoc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxSZWZXcmFwcGVkVHlwZT4gY29uc3Rfc3RyaW5nX3JlZiwKKyAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIHsKKyAgICBTZXQoY29uc3Rfc3RyaW5nX3JlZi5nZXQoKSwgYXJlbmEpOworICB9CisKKyAgLy8gUmV0dXJucyBhIG11dGFibGUgc3RkOjpzdHJpbmcgcmVmZXJlbmNlLgorICAvLyBUaGUgdmVyc2lvbiBhY2NlcHRpbmcgYSBgTGF6eVN0cmluZ2AgdmFsdWUgaXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgdG8KKyAgLy8gaW5pdGlhbGl6ZSBtdXRhYmxlIGNvcGllcyBmb3IgZmllbGRzIHdpdGggYSBub24tZW1wdHkgZGVmYXVsdCB3aGVyZSB0aGUKKyAgLy8gZGVmYXVsdCB2YWx1ZSBpcyBsYXppbHkgaW5pdGlhbGl6ZWQuCisgIHN0ZDo6c3RyaW5nKiBNdXRhYmxlKEFyZW5hKiBhcmVuYSk7CisgIHN0ZDo6c3RyaW5nKiBNdXRhYmxlKGNvbnN0IExhenlTdHJpbmcmIGRlZmF1bHRfdmFsdWUsIEFyZW5hKiBhcmVuYSk7CisKKyAgLy8gR2V0cyBhIG11dGFibGUgcG9pbnRlciB3aXRoIHVuc3BlY2lmaWVkIGNvbnRlbnRzLgorICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBNdXRhYmxlKCksIGV4Y2VwdCBpdCBpcyBvcHRpbWl6ZWQgZm9yIHRoZQorICAvLyBjYXNlIHdoZXJlIHRoZSBjYWxsZXIgaXMgbm90IGludGVyZXN0ZWQgaW4gdGhlIGN1cnJlbnQgY29udGVudHMuIEZvcgorICAvLyBleGFtcGxlLCBpZiB0aGUgY3VycmVudCBmaWVsZCBpcyBub3QgbXV0YWJsZSwgaXQgd2lsbCByZS1pbml0aWFsaXplIHRoZQorICAvLyB2YWx1ZSB3aXRoIGFuIGVtcHR5IHN0cmluZyByYXRoZXIgdGhhbiBhIChub24tZW1wdHkpIGRlZmF1bHQgdmFsdWUuCisgIC8vIExpa2V3aXNlLCBpZiB0aGUgY3VycmVudCB2YWx1ZSBpcyBhIGZpeGVkIHNpemUgYXJlbmEgc3RyaW5nIHdpdGggY29udGVudHMsCisgIC8vIGl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW50byBhbiBlbXB0eSBtdXRhYmxlIGFyZW5hIHN0cmluZy4KKyAgc3RkOjpzdHJpbmcqIE11dGFibGVOb0NvcHkoQXJlbmEqIGFyZW5hKTsKKworICAvLyBCYXNpYyBhY2Nlc3NvcnMuCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgY29uc3Qgc3RkOjpzdHJpbmcmIEdldCgpIGNvbnN0IHsKKyAgICAvLyBVbmNvbmRpdGlvbmFsbHkgbWFzayBhd2F5IHRoZSB0YWcuCisgICAgcmV0dXJuICp0YWdnZWRfcHRyXy5HZXQoKTsKKyAgfQorCisgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdG9yZWQgY29udGVudHMgZm9yIHRoaXMgaW5zdGFuY2UuCisgIC8vIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCBkZWJ1Z2dpbmcgYW5kIHRyYWNraW5nIHB1cnBvc2VzIG9ubHkuCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgY29uc3Qgc3RkOjpzdHJpbmcqIFVuc2FmZUdldFBvaW50ZXIoKSBjb25zdAorICAgICAgUFJPVE9CVUZfUkVUVVJOU19OT05OVUxMIHsKKyAgICByZXR1cm4gdGFnZ2VkX3B0cl8uR2V0KCk7CisgIH0KKworICAvLyBSZWxlYXNlIHJldHVybnMgYSBzdGQ6OnN0cmluZyogaW5zdGFuY2UgdGhhdCBpcyBoZWFwLWFsbG9jYXRlZCBhbmQgaXMgbm90CisgIC8vIE93bigpJ2QgYnkgYW55IGFyZW5hLiBJZiB0aGUgZmllbGQgaXMgbm90IHNldCwgdGhpcyByZXR1cm5zIG51bGxwdHIuIFRoZQorICAvLyBjYWxsZXIgcmV0YWlucyBvd25lcnNoaXAuIENsZWFycyB0aGlzIGZpZWxkIGJhY2sgdG8gdGhlIGRlZmF1bHQgc3RhdGUuCisgIC8vIFVzZWQgdG8gaW1wbGVtZW50IHJlbGVhc2VfPGZpZWxkPigpIG1ldGhvZHMgb24gZ2VuZXJhdGVkIGNsYXNzZXMuCisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogUmVsZWFzZSgpOworCisgIC8vIFRha2VzIGEgc3RkOjpzdHJpbmcgdGhhdCBpcyBoZWFwLWFsbG9jYXRlZCwgYW5kIHRha2VzIG93bmVyc2hpcC4gVGhlCisgIC8vIHN0ZDo6c3RyaW5nJ3MgZGVzdHJ1Y3RvciBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGFyZW5hLiBVc2VkIHRvIGltcGxlbWVudAorICAvLyBzZXRfYWxsb2NhdGVkXzxmaWVsZD4gaW4gZ2VuZXJhdGVkIGNsYXNzZXMuCisgIHZvaWQgU2V0QWxsb2NhdGVkKHN0ZDo6c3RyaW5nKiB2YWx1ZSwgQXJlbmEqIGFyZW5hKTsKKworICAvLyBGcmVlcyBzdG9yYWdlIChpZiBub3Qgb24gYW4gYXJlbmEpLgorICB2b2lkIERlc3Ryb3koKTsKKworICAvLyBDbGVhcnMgY29udGVudCwgYnV0IGtlZXBzIGFsbG9jYXRlZCBzdGQ6OnN0cmluZywgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mCisgIC8vIGhlYXAgb3BlcmF0aW9ucy4gQWZ0ZXIgdGhpcyByZXR1cm5zLCB0aGUgY29udGVudCAoYXMgc2VlbiBieSB0aGUgdXNlcikgd2lsbAorICAvLyBhbHdheXMgYmUgdGhlIGVtcHR5IHN0ZDo6c3RyaW5nLiBBc3N1bWVzIHRoYXQgfGRlZmF1bHRfdmFsdWV8IGlzIGFuIGVtcHR5CisgIC8vIHN0ZDo6c3RyaW5nLgorICB2b2lkIENsZWFyVG9FbXB0eSgpOworCisgIC8vIENsZWFycyBjb250ZW50LCBhc3N1bWluZyB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIGlzIG5vdCB0aGUgZW1wdHkKKyAgLy8gc3RyaW5nIGRlZmF1bHQuCisgIHZvaWQgQ2xlYXJOb25EZWZhdWx0VG9FbXB0eSgpOworCisgIC8vIENsZWFycyBjb250ZW50LCBidXQga2VlcHMgYWxsb2NhdGVkIHN0ZDo6c3RyaW5nIGlmIGFyZW5hICE9IG51bGxwdHIsIHRvCisgIC8vIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBoZWFwIG9wZXJhdGlvbnMuIEFmdGVyIHRoaXMgcmV0dXJucywgdGhlIGNvbnRlbnQKKyAgLy8gKGFzIHNlZW4gYnkgdGhlIHVzZXIpIHdpbGwgYWx3YXlzIGJlIGVxdWFsIHRvIHxkZWZhdWx0X3ZhbHVlfC4KKyAgdm9pZCBDbGVhclRvRGVmYXVsdChjb25zdCBMYXp5U3RyaW5nJiBkZWZhdWx0X3ZhbHVlLCA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSk7CisKKyAgLy8gU3dhcHMgaW50ZXJuYWwgcG9pbnRlcnMuIEFyZW5hLXNhZmV0eSBzZW1hbnRpY3M6IHRoaXMgaXMgZ3VhcmRlZCBieSB0aGUKKyAgLy8gbG9naWMgaW4gU3dhcCgpL1Vuc2FmZUFyZW5hU3dhcCgpIGF0IHRoZSBtZXNzYWdlIGxldmVsLCBzbyB0aGlzIG1ldGhvZCBpcworICAvLyAndW5zYWZlJyBpZiBjYWxsZWQgZGlyZWN0bHkuCisgIGlubGluZSBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB2b2lkIEludGVybmFsU3dhcChBcmVuYVN0cmluZ1B0ciogcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJlbmEqIHJoc19hcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZW5hU3RyaW5nUHRyKiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmVuYSogbGhzX2FyZW5hKTsKKworICAvLyBJbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGF0IHBhcnNlIHRpbWUgdG8gZGlyZWN0bHkgc2V0IGEgZG9uYXRlZCBzdHJpbmcKKyAgLy8gdmFsdWUuCisgIHZvaWQgVW5zYWZlU2V0VGFnZ2VkUG9pbnRlcihUYWdnZWRTdHJpbmdQdHIgdmFsdWUpIHsgdGFnZ2VkX3B0cl8gPSB2YWx1ZTsgfQorICAvLyBHZW5lcmF0ZWQgY29kZSBvbmx5ISBBbiBvcHRpbWl6YXRpb24sIGluIGNlcnRhaW4gY2FzZXMgdGhlIGdlbmVyYXRlZAorICAvLyBjb2RlIGlzIGNlcnRhaW4gd2UgY2FuIG9idGFpbiBhIHN0ZDo6c3RyaW5nIHdpdGggbm8gZGVmYXVsdCBjaGVja3MgYW5kCisgIC8vIHRhZyB0ZXN0cy4KKyAgc3RkOjpzdHJpbmcqIFVuc2FmZU11dGFibGVQb2ludGVyKCkgUFJPVE9CVUZfUkVUVVJOU19OT05OVUxMOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGluc3RhbmNlcyBob2xkcyBhbiBpbW11dGFibGUgZGVmYXVsdCB2YWx1ZS4KKyAgaW5saW5lIGJvb2wgSXNEZWZhdWx0KCkgY29uc3QgeyByZXR1cm4gdGFnZ2VkX3B0cl8uSXNEZWZhdWx0KCk7IH0KKworIHByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgorICBpbmxpbmUgc3RkOjpzdHJpbmcqIE5ld1N0cmluZyhBcmVuYSogYXJlbmEsIEFyZ3MmJi4uLiBhcmdzKSB7CisgICAgaWYgKGFyZW5hID09IG51bGxwdHIpIHsKKyAgICAgIGF1dG8qIHMgPSBuZXcgc3RkOjpzdHJpbmcoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICAgIHJldHVybiB0YWdnZWRfcHRyXy5TZXRBbGxvY2F0ZWQocyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGF1dG8qIHMgPSBBcmVuYTo6Q3JlYXRlPHN0ZDo6c3RyaW5nPihhcmVuYSwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICAgIHJldHVybiB0YWdnZWRfcHRyXy5TZXRNdXRhYmxlQXJlbmEocyk7CisgICAgfQorICB9CisKKyAgVGFnZ2VkU3RyaW5nUHRyIHRhZ2dlZF9wdHJfOworCisgIGJvb2wgSXNGaXhlZFNpemVBcmVuYSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8gU3dhcHMgdGFnZ2VkIHBvaW50ZXIgd2l0aG91dCBkZWJ1ZyBoYXJkZW5pbmcuIFRoaXMgaXMgdG8gYWxsb3cgcHl0aG9uCisgIC8vIHByb3RvYnVmIHRvIG1haW50YWluIHBvaW50ZXIgc3RhYmlsaXR5IGV2ZW4gaW4gREVCVUcgYnVpbGRzLgorICBpbmxpbmUgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdm9pZCBVbnNhZmVTaGFsbG93U3dhcCgKKyAgICAgIEFyZW5hU3RyaW5nUHRyKiByaHMsIEFyZW5hU3RyaW5nUHRyKiBsaHMpIHsKKyAgICBzdGQ6OnN3YXAobGhzLT50YWdnZWRfcHRyXywgcmhzLT50YWdnZWRfcHRyXyk7CisgIH0KKworICBmcmllbmQgY2xhc3MgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6U3dhcEZpZWxkSGVscGVyOworICBmcmllbmQgY2xhc3MgVGNQYXJzZXI7CisKKyAgLy8gU2xvdyBwYXRocy4KKworICAvLyBNdXRhYmxlU2xvdyByZXF1aXJlcyB0aGF0ICFJc1N0cmluZygpIHx8IElzRGVmYXVsdAorICAvLyBWYXJpYWRpYyB0byBzdXBwb3J0IDAgYXJncyBmb3IgZW1wdHkgZGVmYXVsdCBhbmQgMSBhcmcgZm9yIExhenlTdHJpbmcuCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBMYXp5PgorICBzdGQ6OnN0cmluZyogTXV0YWJsZVNsb3coOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsIGNvbnN0IExhenkmLi4uIGxhenlfZGVmYXVsdCk7CisKKyAgZnJpZW5kIGNsYXNzIEVwc0NvcHlJbnB1dFN0cmVhbTsKK307CisKK2lubGluZSB2b2lkIEFyZW5hU3RyaW5nUHRyOjpJbml0RGVmYXVsdCgpIHsKKyAgdGFnZ2VkX3B0cl8gPSBUYWdnZWRTdHJpbmdQdHIoJmZpeGVkX2FkZHJlc3NfZW1wdHlfc3RyaW5nKTsKK30KKworaW5saW5lIHZvaWQgQXJlbmFTdHJpbmdQdHI6OkluaXRFeHRlcm5hbChjb25zdCBzdGQ6OnN0cmluZyogc3RyKSB7CisgIHRhZ2dlZF9wdHJfLlNldERlZmF1bHQoc3RyKTsKK30KKworaW5saW5lIHZvaWQgQXJlbmFTdHJpbmdQdHI6OkluaXRBbGxvY2F0ZWQoc3RkOjpzdHJpbmcqIHN0ciwgQXJlbmEqIGFyZW5hKSB7CisgIGlmIChhcmVuYSAhPSBudWxscHRyKSB7CisgICAgdGFnZ2VkX3B0cl8uU2V0TXV0YWJsZUFyZW5hKHN0cik7CisgICAgYXJlbmEtPk93bihzdHIpOworICB9IGVsc2UgeworICAgIHRhZ2dlZF9wdHJfLlNldEFsbG9jYXRlZChzdHIpOworICB9Cit9CisKK2lubGluZSB2b2lkIEFyZW5hU3RyaW5nUHRyOjpTZXQoY29uc3QgY2hhciogcywgQXJlbmEqIGFyZW5hKSB7CisgIFNldChDb25zdFN0cmluZ1BhcmFte3N9LCBhcmVuYSk7Cit9CisKK2lubGluZSB2b2lkIEFyZW5hU3RyaW5nUHRyOjpTZXQoY29uc3QgY2hhciogcywgc2l6ZV90IG4sIEFyZW5hKiBhcmVuYSkgeworICBTZXQoQ29uc3RTdHJpbmdQYXJhbXtzLCBufSwgYXJlbmEpOworfQorCitpbmxpbmUgdm9pZCBBcmVuYVN0cmluZ1B0cjo6U2V0Qnl0ZXMoQ29uc3RTdHJpbmdQYXJhbSB2YWx1ZSwgQXJlbmEqIGFyZW5hKSB7CisgIFNldCh2YWx1ZSwgYXJlbmEpOworfQorCitpbmxpbmUgdm9pZCBBcmVuYVN0cmluZ1B0cjo6U2V0Qnl0ZXMoc3RkOjpzdHJpbmcmJiB2YWx1ZSwgQXJlbmEqIGFyZW5hKSB7CisgIFNldChzdGQ6Om1vdmUodmFsdWUpLCBhcmVuYSk7Cit9CisKK2lubGluZSB2b2lkIEFyZW5hU3RyaW5nUHRyOjpTZXRCeXRlcyhjb25zdCBjaGFyKiBzLCBBcmVuYSogYXJlbmEpIHsKKyAgU2V0KHMsIGFyZW5hKTsKK30KKworaW5saW5lIHZvaWQgQXJlbmFTdHJpbmdQdHI6OlNldEJ5dGVzKGNvbnN0IHZvaWQqIHAsIHNpemVfdCBuLCBBcmVuYSogYXJlbmEpIHsKKyAgU2V0KENvbnN0U3RyaW5nUGFyYW17c3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHApLCBufSwgYXJlbmEpOworfQorCisvLyBNYWtlIHN1cmUgcmhzX2FyZW5hIGFsbG9jYXRlZCByaHMsIGFuZCBsaHNfYXJlbmEgYWxsb2NhdGVkIGxocy4KK2lubGluZSBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHZvaWQgQXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCggIC8vCisgICAgQXJlbmFTdHJpbmdQdHIqIHJocywgQXJlbmEqIHJoc19hcmVuYSwgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgIEFyZW5hU3RyaW5nUHRyKiBsaHMsIEFyZW5hKiBsaHNfYXJlbmEpIHsKKyAgLy8gU2lsZW5jZSB1bnVzZWQgdmFyaWFibGUgd2FybmluZ3MgaW4gcmVsZWFzZSBidWlsZGxzLgorICAodm9pZClyaHNfYXJlbmE7CisgICh2b2lkKWxoc19hcmVuYTsKKyAgc3RkOjpzd2FwKGxocy0+dGFnZ2VkX3B0cl8sIHJocy0+dGFnZ2VkX3B0cl8pOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICBhdXRvIGZvcmNlX3JlYWxsb2MgPSBbXShBcmVuYVN0cmluZ1B0ciogcCwgQXJlbmEqIGFyZW5hKSB7CisgICAgaWYgKHAtPklzRGVmYXVsdCgpKSByZXR1cm47CisgICAgc3RkOjpzdHJpbmcqIG9sZF92YWx1ZSA9IHAtPnRhZ2dlZF9wdHJfLkdldCgpOworICAgIHN0ZDo6c3RyaW5nKiBuZXdfdmFsdWUgPQorICAgICAgICBwLT5Jc0ZpeGVkU2l6ZUFyZW5hKCkKKyAgICAgICAgICAgID8gQXJlbmE6OkNyZWF0ZTxzdGQ6OnN0cmluZz4oYXJlbmEsICpvbGRfdmFsdWUpCisgICAgICAgICAgICA6IEFyZW5hOjpDcmVhdGU8c3RkOjpzdHJpbmc+KGFyZW5hLCBzdGQ6Om1vdmUoKm9sZF92YWx1ZSkpOworICAgIGlmIChhcmVuYSA9PSBudWxscHRyKSB7CisgICAgICBkZWxldGUgb2xkX3ZhbHVlOworICAgICAgcC0+dGFnZ2VkX3B0cl8uU2V0QWxsb2NhdGVkKG5ld192YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHAtPnRhZ2dlZF9wdHJfLlNldE11dGFibGVBcmVuYShuZXdfdmFsdWUpOworICAgIH0KKyAgfTsKKyAgLy8gQmVjYXVzZSwgYXQgdGhpcyBwb2ludCwgdGFnZ2VkX3B0cl8gaGFzIGJlZW4gc3dhcHBlZCwgYXJlbmEgc2hvdWxkIGFsc28gYmUKKyAgLy8gc3dhcHBlZC4KKyAgZm9yY2VfcmVhbGxvYyhsaHMsIHJoc19hcmVuYSk7CisgIGZvcmNlX3JlYWxsb2MocmhzLCBsaHNfYXJlbmEpOworI2VuZGlmICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKK30KKworaW5saW5lIHZvaWQgQXJlbmFTdHJpbmdQdHI6OkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKSB7CisgIC8vIFVuY29uZGl0aW9uYWxseSBtYXNrIGF3YXkgdGhlIHRhZy4KKyAgdGFnZ2VkX3B0cl8uR2V0KCktPmNsZWFyKCk7Cit9CisKK2lubGluZSBzdGQ6OnN0cmluZyogQXJlbmFTdHJpbmdQdHI6OlVuc2FmZU11dGFibGVQb2ludGVyKCkgeworICBHT09HTEVfRENIRUNLKHRhZ2dlZF9wdHJfLklzTXV0YWJsZSgpKTsKKyAgR09PR0xFX0RDSEVDSyh0YWdnZWRfcHRyXy5HZXQoKSAhPSBudWxscHRyKTsKKyAgcmV0dXJuIHRhZ2dlZF9wdHJfLkdldCgpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0FSRU5BU1RSSU5HX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZ191bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmdfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1ZWE5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmdfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxNTQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKwordXNpbmcgaW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOworCitjb25zdCBpbnRlcm5hbDo6TGF6eVN0cmluZyBub25lbXB0eV9kZWZhdWx0e3t7ImRlZmF1bHQiLCA3fX0sIHtudWxscHRyfX07Citjb25zdCBzdGQ6OnN0cmluZyogZW1wdHlfZGVmYXVsdCA9ICZpbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcoKTsKKworY2xhc3MgU2luZ2xlQXJlbmEgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxib29sPiB7CisgcHVibGljOgorICBzdGQ6OnVuaXF1ZV9wdHI8QXJlbmE+IEdldEFyZW5hKCkgeworICAgIGlmICh0aGlzLT5HZXRQYXJhbSgpKSByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEFyZW5hPihuZXcgQXJlbmEoKSk7CisgIH0KK307CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChBcmVuYVN0cmluZywgU2luZ2xlQXJlbmEsIHRlc3Rpbmc6OkJvb2woKSk7CisKK1RFU1RfUChTaW5nbGVBcmVuYSwgR2V0U2V0KSB7CisgIGF1dG8gYXJlbmEgPSBHZXRBcmVuYSgpOworICBBcmVuYVN0cmluZ1B0ciBmaWVsZDsKKyAgZmllbGQuSW5pdERlZmF1bHQoKTsKKyAgRVhQRUNUX0VRKCIiLCBmaWVsZC5HZXQoKSk7CisgIGZpZWxkLlNldCgiVGVzdCBzaG9ydCIsIGFyZW5hLmdldCgpKTsKKyAgRVhQRUNUX0VRKCJUZXN0IHNob3J0IiwgZmllbGQuR2V0KCkpOworICBmaWVsZC5TZXQoIlRlc3QgbG9uZyBsb25nIGxvbmcgbG9uZyB2YWx1ZSIsIGFyZW5hLmdldCgpKTsKKyAgRVhQRUNUX0VRKCJUZXN0IGxvbmcgbG9uZyBsb25nIGxvbmcgdmFsdWUiLCBmaWVsZC5HZXQoKSk7CisgIGZpZWxkLlNldCgiIiwgYXJlbmEuZ2V0KCkpOworICBmaWVsZC5EZXN0cm95KCk7Cit9CisKK1RFU1RfUChTaW5nbGVBcmVuYSwgTXV0YWJsZUFjY2Vzc29yKSB7CisgIGF1dG8gYXJlbmEgPSBHZXRBcmVuYSgpOworICBBcmVuYVN0cmluZ1B0ciBmaWVsZDsKKyAgZmllbGQuSW5pdERlZmF1bHQoKTsKKworICBzdGQ6OnN0cmluZyogbXV0ID0gZmllbGQuTXV0YWJsZShhcmVuYS5nZXQoKSk7CisgIEVYUEVDVF9FUShtdXQsIGZpZWxkLk11dGFibGUoYXJlbmEuZ2V0KCkpKTsKKyAgRVhQRUNUX0VRKG11dCwgJmZpZWxkLkdldCgpKTsKKyAgRVhQRUNUX05FKGVtcHR5X2RlZmF1bHQsIG11dCk7CisgIEVYUEVDVF9FUSgiIiwgKm11dCk7CisgICptdXQgPSAiVGVzdCBsb25nIGxvbmcgbG9uZyBsb25nIHZhbHVlIjsgIC8vIGVuc3VyZSBzdHJpbmcgYWxsb2NhdGVzIHN0b3JhZ2UKKyAgRVhQRUNUX0VRKCJUZXN0IGxvbmcgbG9uZyBsb25nIGxvbmcgdmFsdWUiLCBmaWVsZC5HZXQoKSk7CisgIGZpZWxkLkRlc3Ryb3koKTsKK30KKworVEVTVF9QKFNpbmdsZUFyZW5hLCBOdWxsRGVmYXVsdCkgeworICBhdXRvIGFyZW5hID0gR2V0QXJlbmEoKTsKKworICBBcmVuYVN0cmluZ1B0ciBmaWVsZDsKKyAgZmllbGQuSW5pdERlZmF1bHQoKTsKKyAgc3RkOjpzdHJpbmcqIG11dCA9IGZpZWxkLk11dGFibGUobm9uZW1wdHlfZGVmYXVsdCwgYXJlbmEuZ2V0KCkpOworICBFWFBFQ1RfRVEobXV0LCBmaWVsZC5NdXRhYmxlKG5vbmVtcHR5X2RlZmF1bHQsIGFyZW5hLmdldCgpKSk7CisgIEVYUEVDVF9FUShtdXQsICZmaWVsZC5HZXQoKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBtdXQpOworICBFWFBFQ1RfRVEoImRlZmF1bHQiLCAqbXV0KTsKKyAgKm11dCA9ICJUZXN0IGxvbmcgbG9uZyBsb25nIGxvbmcgdmFsdWUiOyAgLy8gZW5zdXJlIHN0cmluZyBhbGxvY2F0ZXMgc3RvcmFnZQorICBFWFBFQ1RfRVEoIlRlc3QgbG9uZyBsb25nIGxvbmcgbG9uZyB2YWx1ZSIsIGZpZWxkLkdldCgpKTsKKyAgZmllbGQuRGVzdHJveSgpOworfQorCitjbGFzcyBEdWFsQXJlbmEgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnR1cGxlPGJvb2wsIGJvb2w+PiB7CisgcHVibGljOgorICBzdGQ6OnVuaXF1ZV9wdHI8QXJlbmE+IEdldExoc0FyZW5hKCkgeworICAgIGlmIChzdGQ6OmdldDwwPih0aGlzLT5HZXRQYXJhbSgpKSkgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxBcmVuYT4obmV3IEFyZW5hKCkpOworICB9CisgIHN0ZDo6dW5pcXVlX3B0cjxBcmVuYT4gR2V0UmhzQXJlbmEoKSB7CisgICAgaWYgKHN0ZDo6Z2V0PDE+KHRoaXMtPkdldFBhcmFtKCkpKSByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEFyZW5hPihuZXcgQXJlbmEoKSk7CisgIH0KK307CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChBcmVuYVN0cmluZywgRHVhbEFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OkNvbWJpbmUodGVzdGluZzo6Qm9vbCgpLCB0ZXN0aW5nOjpCb29sKCkpKTsKKworVEVTVF9QKER1YWxBcmVuYSwgU3dhcCkgeworICBhdXRvIGxoc19hcmVuYSA9IEdldExoc0FyZW5hKCk7CisgIEFyZW5hU3RyaW5nUHRyIGxoczsKKyAgbGhzLkluaXREZWZhdWx0KCk7CisgIEFyZW5hU3RyaW5nUHRyIHJoczsKKyAgcmhzLkluaXREZWZhdWx0KCk7CisKKyAgeworICAgIGF1dG8gcmhzX2FyZW5hID0gR2V0UmhzQXJlbmEoKTsKKyAgICBsaHMuU2V0KCJsaHMgdmFsdWUgdGhhdCBoYXMgc29tZSBoZWZ0IiwgbGhzX2FyZW5hLmdldCgpKTsKKyAgICByaHMuU2V0KCJyaHMgdmFsdWUgdGhhdCBoYXMgc29tZSBoZWZ0IiwgcmhzX2FyZW5hLmdldCgpKTsKKyAgICBBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKCZsaHMsIGxoc19hcmVuYS5nZXQoKSwgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmhzLCByaHNfYXJlbmEuZ2V0KCkpOworICAgIEVYUEVDVF9FUSgicmhzIHZhbHVlIHRoYXQgaGFzIHNvbWUgaGVmdCIsIGxocy5HZXQoKSk7CisgICAgRVhQRUNUX0VRKCJsaHMgdmFsdWUgdGhhdCBoYXMgc29tZSBoZWZ0IiwgcmhzLkdldCgpKTsKKyAgICBsaHMuRGVzdHJveSgpOworICB9CisgIEVYUEVDVF9FUSgibGhzIHZhbHVlIHRoYXQgaGFzIHNvbWUgaGVmdCIsIHJocy5HZXQoKSk7CisgIHJocy5EZXN0cm95KCk7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hel9zYW1wbGVyLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYXpfc2FtcGxlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWFjNjkzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYXpfc2FtcGxlci5jYwpAQCAtMCwwICsxLDE3NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmF6X3NhbXBsZXIuaD4KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGxpbWl0cz4KKworCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworVGhyZWFkU2FmZUFyZW5helNhbXBsZXImIEdsb2JhbFRocmVhZFNhZmVBcmVuYXpTYW1wbGVyKCkgeworICBzdGF0aWMgYXV0byogc2FtcGxlciA9IG5ldyBUaHJlYWRTYWZlQXJlbmF6U2FtcGxlcigpOworICByZXR1cm4gKnNhbXBsZXI7Cit9CisKK3ZvaWQgVW5zYW1wbGVTbG93KFRocmVhZFNhZmVBcmVuYVN0YXRzKiBpbmZvKSB7CisgIEdsb2JhbFRocmVhZFNhZmVBcmVuYXpTYW1wbGVyKCkuVW5yZWdpc3RlcihpbmZvKTsKK30KKworI2lmIGRlZmluZWQoUFJPVE9CVUZfQVJFTkFaX1NBTVBMRSkKK25hbWVzcGFjZSB7CisKK1BST1RPQlVGX0NPTlNUSU5JVCBzdGQ6OmF0b21pYzxib29sPiBnX2FyZW5hel9lbmFibGVke3RydWV9OworUFJPVE9CVUZfQ09OU1RJTklUIHN0ZDo6YXRvbWljPGludDMyX3Q+IGdfYXJlbmF6X3NhbXBsZV9wYXJhbWV0ZXJ7MSA8PCAxMH07CitQUk9UT0JVRl9USFJFQURfTE9DQUwgYWJzbDo6cHJvZmlsaW5nX2ludGVybmFsOjpFeHBvbmVudGlhbEJpYXNlZAorICAgIGdfZXhwb25lbnRpYWxfYmlhc2VkX2dlbmVyYXRvcjsKKworfSAgLy8gbmFtZXNwYWNlCisKK1BST1RPQlVGX1RIUkVBRF9MT0NBTCBpbnQ2NF90IGdsb2JhbF9uZXh0X3NhbXBsZSA9IDFMTCA8PCAxMDsKKworVGhyZWFkU2FmZUFyZW5hU3RhdHM6OlRocmVhZFNhZmVBcmVuYVN0YXRzKCkgeyBQcmVwYXJlRm9yU2FtcGxpbmcoKTsgfQorVGhyZWFkU2FmZUFyZW5hU3RhdHM6On5UaHJlYWRTYWZlQXJlbmFTdGF0cygpID0gZGVmYXVsdDsKKwordm9pZCBUaHJlYWRTYWZlQXJlbmFTdGF0czo6UHJlcGFyZUZvclNhbXBsaW5nKCkgeworICBudW1fYWxsb2NhdGlvbnMuc3RvcmUoMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIG51bV9yZXNldHMuc3RvcmUoMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIGJ5dGVzX3JlcXVlc3RlZC5zdG9yZSgwLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgYnl0ZXNfYWxsb2NhdGVkLnN0b3JlKDAsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICBieXRlc193YXN0ZWQuc3RvcmUoMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIG1heF9ieXRlc19hbGxvY2F0ZWQuc3RvcmUoMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIHRocmVhZF9pZHMuc3RvcmUoMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIC8vIFRoZSBpbmxpbmVyIG1ha2VzIGhhcmRjb2RlZCBza2lwX2NvdW50IGRpZmZpY3VsdCAoZXNwZWNpYWxseSB3aGVuIGNvbWJpbmVkCisgIC8vIHdpdGggTFRPKS4gIFdlIHVzZSB0aGUgYWJpbGl0eSB0byBleGNsdWRlIHN0YWNrcyBieSByZWdleCB3aGVuIGVuY29kaW5nCisgIC8vIGluc3RlYWQuCisgIGRlcHRoID0gYWJzbDo6R2V0U3RhY2tUcmFjZShzdGFjaywga01heFN0YWNrRGVwdGgsIC8qIHNraXBfY291bnQ9ICovIDApOworfQorCit2b2lkIFJlY29yZFJlc2V0U2xvdyhUaHJlYWRTYWZlQXJlbmFTdGF0cyogaW5mbykgeworICBjb25zdCBzaXplX3QgbWF4X2J5dGVzID0KKyAgICAgIGluZm8tPm1heF9ieXRlc19hbGxvY2F0ZWQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgY29uc3Qgc2l6ZV90IGFsbG9jYXRlZF9ieXRlcyA9CisgICAgICBpbmZvLT5ieXRlc19hbGxvY2F0ZWQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgaWYgKG1heF9ieXRlcyA8IGFsbG9jYXRlZF9ieXRlcykgeworICAgIGluZm8tPm1heF9ieXRlc19hbGxvY2F0ZWQuc3RvcmUoYWxsb2NhdGVkX2J5dGVzKTsKKyAgfQorICBpbmZvLT5ieXRlc19yZXF1ZXN0ZWQuc3RvcmUoMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIGluZm8tPmJ5dGVzX2FsbG9jYXRlZC5zdG9yZSgwLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgaW5mby0+Ynl0ZXNfd2FzdGVkLmZldGNoX2FkZCgwLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgaW5mby0+bnVtX2FsbG9jYXRpb25zLmZldGNoX2FkZCgwLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgaW5mby0+bnVtX3Jlc2V0cy5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Cit9CisKK3ZvaWQgUmVjb3JkQWxsb2NhdGVTbG93KFRocmVhZFNhZmVBcmVuYVN0YXRzKiBpbmZvLCBzaXplX3QgcmVxdWVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFsbG9jYXRlZCwgc2l6ZV90IHdhc3RlZCkgeworICBpbmZvLT5ieXRlc19yZXF1ZXN0ZWQuZmV0Y2hfYWRkKHJlcXVlc3RlZCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIGluZm8tPmJ5dGVzX2FsbG9jYXRlZC5mZXRjaF9hZGQoYWxsb2NhdGVkLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgaW5mby0+Ynl0ZXNfd2FzdGVkLmZldGNoX2FkZCh3YXN0ZWQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICBpbmZvLT5udW1fYWxsb2NhdGlvbnMuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICBjb25zdCB1aW50NjRfdCB0aWQgPSAoMVVMTCA8PCAoR2V0Q2FjaGVkVElEKCkgJSA2MykpOworICBjb25zdCB1aW50NjRfdCB0aHJlYWRfaWRzID0gaW5mby0+dGhyZWFkX2lkcy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICBpZiAoISh0aHJlYWRfaWRzICYgdGlkKSkgeworICAgIGluZm8tPnRocmVhZF9pZHMuc3RvcmUodGhyZWFkX2lkcyB8IHRpZCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIH0KK30KKworVGhyZWFkU2FmZUFyZW5hU3RhdHMqIFNhbXBsZVNsb3coaW50NjRfdCogbmV4dF9zYW1wbGUpIHsKKyAgYm9vbCBmaXJzdCA9ICpuZXh0X3NhbXBsZSA8IDA7CisgICpuZXh0X3NhbXBsZSA9IGdfZXhwb25lbnRpYWxfYmlhc2VkX2dlbmVyYXRvci5HZXRTdHJpZGUoCisgICAgICBnX2FyZW5hel9zYW1wbGVfcGFyYW1ldGVyLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpOworICAvLyBTbWFsbCB2YWx1ZXMgb2YgaW50ZXJ2YWwgYXJlIGVxdWl2YWxlbnQgdG8ganVzdCBzYW1wbGluZyBuZXh0IHRpbWUuCisgIEFCU0xfQVNTRVJUKCpuZXh0X3NhbXBsZSA+PSAxKTsKKworICAvLyBnX2FyZW5hel9lbmFibGVkIGNhbiBiZSBkeW5hbWljYWxseSBmbGlwcGVkLCB3ZSBuZWVkIHRvIHNldCBhIHRocmVzaG9sZCBsb3cKKyAgLy8gZW5vdWdoIHRoYXQgd2Ugd2lsbCBzdGFydCBzYW1wbGluZyBpbiBhIHJlYXNvbmFibGUgdGltZSwgc28gd2UganVzdCB1c2UgdGhlCisgIC8vIGRlZmF1bHQgc2FtcGxpbmcgcmF0ZS4KKyAgaWYgKCFnX2FyZW5hel9lbmFibGVkLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpIHJldHVybiBudWxscHRyOworICAvLyBXZSB3aWxsIG9ubHkgYmUgbmVnYXRpdmUgb24gb3VyIGZpcnN0IGNvdW50LCBzbyB3ZSBzaG91bGQganVzdCByZXRyeSBpbgorICAvLyB0aGF0IGNhc2UuCisgIGlmIChmaXJzdCkgeworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoLS0qbmV4dF9zYW1wbGUgPiAwKSkgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIFNhbXBsZVNsb3cobmV4dF9zYW1wbGUpOworICB9CisKKyAgcmV0dXJuIEdsb2JhbFRocmVhZFNhZmVBcmVuYXpTYW1wbGVyKCkuUmVnaXN0ZXIoKTsKK30KKwordm9pZCBTZXRUaHJlYWRTYWZlQXJlbmF6RW5hYmxlZChib29sIGVuYWJsZWQpIHsKKyAgZ19hcmVuYXpfZW5hYmxlZC5zdG9yZShlbmFibGVkLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKK30KKwordm9pZCBTZXRUaHJlYWRTYWZlQXJlbmF6U2FtcGxlUGFyYW1ldGVyKGludDMyX3QgcmF0ZSkgeworICBpZiAocmF0ZSA+IDApIHsKKyAgICBnX2FyZW5hel9zYW1wbGVfcGFyYW1ldGVyLnN0b3JlKHJhdGUsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworICB9IGVsc2UgeworICAgIEFCU0xfUkFXX0xPRyhFUlJPUiwgIkludmFsaWQgdGhyZWFkIHNhZmUgYXJlbmF6IHNhbXBsZSByYXRlOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihyYXRlKSk7ICAvLyBOT0xJTlQocnVudGltZS9pbnQpCisgIH0KK30KKwordm9pZCBTZXRUaHJlYWRTYWZlQXJlbmF6TWF4U2FtcGxlcyhpbnQzMl90IG1heCkgeworICBpZiAobWF4ID4gMCkgeworICAgIEdsb2JhbFRocmVhZFNhZmVBcmVuYXpTYW1wbGVyKCkuU2V0TWF4U2FtcGxlcyhtYXgpOworICB9IGVsc2UgeworICAgIEFCU0xfUkFXX0xPRyhFUlJPUiwgIkludmFsaWQgdGhyZWFkIHNhZmUgYXJlbmF6IG1heCBzYW1wbGVzOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihtYXgpKTsgIC8vIE5PTElOVChydW50aW1lL2ludCkKKyAgfQorfQorCit2b2lkIFNldFRocmVhZFNhZmVBcmVuYXpHbG9iYWxOZXh0U2FtcGxlKGludDY0X3QgbmV4dF9zYW1wbGUpIHsKKyAgaWYgKG5leHRfc2FtcGxlID49IDApIHsKKyAgICBnbG9iYWxfbmV4dF9zYW1wbGUgPSBuZXh0X3NhbXBsZTsKKyAgfSBlbHNlIHsKKyAgICBBQlNMX1JBV19MT0coRVJST1IsICJJbnZhbGlkIHRocmVhZCBzYWZlIGFyZW5heiBuZXh0IHNhbXBsZTogJWxsZCIsCisgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obmV4dF9zYW1wbGUpKTsgIC8vIE5PTElOVChydW50aW1lL2ludCkKKyAgfQorfQorCisjZWxzZQorVGhyZWFkU2FmZUFyZW5hU3RhdHMqIFNhbXBsZVNsb3coaW50NjRfdCogbmV4dF9zYW1wbGUpIHsKKyAgKm5leHRfc2FtcGxlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCk7CisgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIFNldFRocmVhZFNhZmVBcmVuYXpFbmFibGVkKGJvb2wgZW5hYmxlZCkge30KK3ZvaWQgU2V0VGhyZWFkU2FmZUFyZW5helNhbXBsZVBhcmFtZXRlcihpbnQzMl90IHJhdGUpIHt9Cit2b2lkIFNldFRocmVhZFNhZmVBcmVuYXpNYXhTYW1wbGVzKGludDMyX3QgbWF4KSB7fQordm9pZCBTZXRUaHJlYWRTYWZlQXJlbmF6R2xvYmFsTmV4dFNhbXBsZShpbnQ2NF90IG5leHRfc2FtcGxlKSB7fQorI2VuZGlmICAvLyBkZWZpbmVkKFBST1RPQlVGX0FSRU5BWl9TQU1QTEUpCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hel9zYW1wbGVyLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hel9zYW1wbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA0YjBjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmF6X3NhbXBsZXIuaApAQCAtMCwwICsxLDIwNyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NSQ19HT09HTEVfUFJPVE9CVUZfQVJFTkFaX1NBTVBMRVJfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TUkNfR09PR0xFX1BST1RPQlVGX0FSRU5BWl9TQU1QTEVSX0hfXworCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIGRlZmluZWQoUFJPVE9CVUZfQVJFTkFaX1NBTVBMRSkKK3N0cnVjdCBUaHJlYWRTYWZlQXJlbmFTdGF0czsKK3ZvaWQgUmVjb3JkUmVzZXRTbG93KFRocmVhZFNhZmVBcmVuYVN0YXRzKiBpbmZvKTsKK3ZvaWQgUmVjb3JkQWxsb2NhdGVTbG93KFRocmVhZFNhZmVBcmVuYVN0YXRzKiBpbmZvLCBzaXplX3QgcmVxdWVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFsbG9jYXRlZCwgc2l6ZV90IHdhc3RlZCk7CisvLyBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBzYW1wbGVkIHRocmVhZCBzYWZlIGFyZW5hLiAgQWxsIG11dGF0aW9ucyB0byB0aGlzCisvLyAqbXVzdCogYmUgbWFkZSB0aHJvdWdoIGBSZWNvcmQqYCBmdW5jdGlvbnMgYmVsb3cuICBBbGwgcmVhZHMgZnJvbSB0aGlzICptdXN0KgorLy8gb25seSBvY2N1ciBpbiB0aGUgY2FsbGJhY2sgdG8gYFRocmVhZFNhZmVBcmVuYXpTYW1wbGVyOjpJdGVyYXRlYC4KK3N0cnVjdCBUaHJlYWRTYWZlQXJlbmFTdGF0cworICAgIDogcHVibGljIGFic2w6OnByb2ZpbGluZ19pbnRlcm5hbDo6U2FtcGxlPFRocmVhZFNhZmVBcmVuYVN0YXRzPiB7CisgIC8vIENvbnN0cnVjdHMgdGhlIG9iamVjdCBidXQgZG9lcyBub3QgZmlsbCBpbiBhbnkgZmllbGRzLgorICBUaHJlYWRTYWZlQXJlbmFTdGF0cygpOworICB+VGhyZWFkU2FmZUFyZW5hU3RhdHMoKTsKKworICAvLyBQdXRzIHRoZSBvYmplY3QgaW50byBhIGNsZWFuIHN0YXRlLCBmaWxscyBpbiB0aGUgbG9naWNhbGx5IGBjb25zdGAgbWVtYmVycywKKyAgLy8gYmxvY2tpbmcgZm9yIGFueSByZWFkZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBzYW1wbGluZyB0aGUgb2JqZWN0LgorICB2b2lkIFByZXBhcmVGb3JTYW1wbGluZygpIEFCU0xfRVhDTFVTSVZFX0xPQ0tTX1JFUVVJUkVEKGluaXRfbXUpOworCisgIC8vIFRoZXNlIGZpZWxkcyBhcmUgbXV0YXRlZCBieSB0aGUgdmFyaW91cyBSZWNvcmQqIEFQSXMgYW5kIG5lZWQgdG8gYmUKKyAgLy8gdGhyZWFkLXNhZmUuCisgIHN0ZDo6YXRvbWljPGludD4gbnVtX2FsbG9jYXRpb25zOworICBzdGQ6OmF0b21pYzxpbnQ+IG51bV9yZXNldHM7CisgIHN0ZDo6YXRvbWljPHNpemVfdD4gYnl0ZXNfcmVxdWVzdGVkOworICBzdGQ6OmF0b21pYzxzaXplX3Q+IGJ5dGVzX2FsbG9jYXRlZDsKKyAgc3RkOjphdG9taWM8c2l6ZV90PiBieXRlc193YXN0ZWQ7CisgIC8vIFJlY29yZHMgdGhlIGxhcmdlc3Qgc2l6ZSBhbiBhcmVuYSBldmVyIGhhZC4gIE1haW50YWluZWQgYWNyb3NzIHJlc2V0cy4KKyAgc3RkOjphdG9taWM8c2l6ZV90PiBtYXhfYnl0ZXNfYWxsb2NhdGVkOworICAvLyBCaXQgaSB3aGVuIHNldCB0byAxIGluZGljYXRlcyB0aGF0IGEgdGhyZWFkIHdpdGggdGlkICUgNjMgPSBpIGFjY2Vzc2VkIHRoZQorICAvLyB1bmRlcmx5aW5nIGFyZW5hLiAgVGhlIGZpZWxkIGlzIG1haW50YWluZWQgYWNyb3NzIHJlc2V0cy4KKyAgc3RkOjphdG9taWM8dWludDY0X3Q+IHRocmVhZF9pZHM7CisKKyAgLy8gQWxsIG9mIHRoZSBmaWVsZHMgYmVsb3cgYXJlIHNldCBieSBgUHJlcGFyZUZvclNhbXBsaW5nYCwgdGhleSBtdXN0IG5vdAorICAvLyBiZSBtdXRhdGVkIGluIGBSZWNvcmQqYCBmdW5jdGlvbnMuICBUaGV5IGFyZSBsb2dpY2FsbHkgYGNvbnN0YCBpbiB0aGF0CisgIC8vIHNlbnNlLiBUaGVzZSBhcmUgZ3VhcmRlZCBieSBpbml0X211LCBidXQgdGhhdCBpcyBub3QgZXh0ZXJuYWxpemVkIHRvCisgIC8vIGNsaWVudHMsIHdobyBjYW4gb25seSByZWFkIHRoZW0gZHVyaW5nCisgIC8vIGBUaHJlYWRTYWZlQXJlbmF6U2FtcGxlcjo6SXRlcmF0ZWAgd2hpY2ggd2lsbCBob2xkIHRoZSBsb2NrLgorICBzdGF0aWMgY29uc3RleHByIGludCBrTWF4U3RhY2tEZXB0aCA9IDY0OworICBpbnQzMl90IGRlcHRoOworICB2b2lkKiBzdGFja1trTWF4U3RhY2tEZXB0aF07CisgIHN0YXRpYyB2b2lkIFJlY29yZEFsbG9jYXRlU3RhdHMoVGhyZWFkU2FmZUFyZW5hU3RhdHMqIGluZm8sIHNpemVfdCByZXF1ZXN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFsbG9jYXRlZCwgc2l6ZV90IHdhc3RlZCkgeworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoaW5mbyA9PSBudWxscHRyKSkgcmV0dXJuOworICAgIFJlY29yZEFsbG9jYXRlU2xvdyhpbmZvLCByZXF1ZXN0ZWQsIGFsbG9jYXRlZCwgd2FzdGVkKTsKKyAgfQorfTsKKworVGhyZWFkU2FmZUFyZW5hU3RhdHMqIFNhbXBsZVNsb3coaW50NjRfdCogbmV4dF9zYW1wbGUpOwordm9pZCBVbnNhbXBsZVNsb3coVGhyZWFkU2FmZUFyZW5hU3RhdHMqIGluZm8pOworCitjbGFzcyBUaHJlYWRTYWZlQXJlbmFTdGF0c0hhbmRsZSB7CisgcHVibGljOgorICBleHBsaWNpdCBUaHJlYWRTYWZlQXJlbmFTdGF0c0hhbmRsZSgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgVGhyZWFkU2FmZUFyZW5hU3RhdHNIYW5kbGUoVGhyZWFkU2FmZUFyZW5hU3RhdHMqIGluZm8pCisgICAgICA6IGluZm9fKGluZm8pIHt9CisKKyAgflRocmVhZFNhZmVBcmVuYVN0YXRzSGFuZGxlKCkgeworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoaW5mb18gPT0gbnVsbHB0cikpIHJldHVybjsKKyAgICBVbnNhbXBsZVNsb3coaW5mb18pOworICB9CisKKyAgVGhyZWFkU2FmZUFyZW5hU3RhdHNIYW5kbGUoVGhyZWFkU2FmZUFyZW5hU3RhdHNIYW5kbGUmJiBvdGhlcikgbm9leGNlcHQKKyAgICAgIDogaW5mb18oYWJzbDo6ZXhjaGFuZ2Uob3RoZXIuaW5mb18sIG51bGxwdHIpKSB7fQorCisgIFRocmVhZFNhZmVBcmVuYVN0YXRzSGFuZGxlJiBvcGVyYXRvcj0oCisgICAgICBUaHJlYWRTYWZlQXJlbmFTdGF0c0hhbmRsZSYmIG90aGVyKSBub2V4Y2VwdCB7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoaW5mb18gIT0gbnVsbHB0cikpIHsKKyAgICAgIFVuc2FtcGxlU2xvdyhpbmZvXyk7CisgICAgfQorICAgIGluZm9fID0gYWJzbDo6ZXhjaGFuZ2Uob3RoZXIuaW5mb18sIG51bGxwdHIpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgUmVjb3JkUmVzZXQoKSB7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShpbmZvXyA9PSBudWxscHRyKSkgcmV0dXJuOworICAgIFJlY29yZFJlc2V0U2xvdyhpbmZvXyk7CisgIH0KKworICBUaHJlYWRTYWZlQXJlbmFTdGF0cyogTXV0YWJsZVN0YXRzKCkgeyByZXR1cm4gaW5mb187IH0KKworICBmcmllbmQgdm9pZCBzd2FwKFRocmVhZFNhZmVBcmVuYVN0YXRzSGFuZGxlJiBsaHMsCisgICAgICAgICAgICAgICAgICAgVGhyZWFkU2FmZUFyZW5hU3RhdHNIYW5kbGUmIHJocykgeworICAgIHN0ZDo6c3dhcChsaHMuaW5mb18sIHJocy5pbmZvXyk7CisgIH0KKworICBmcmllbmQgY2xhc3MgVGhyZWFkU2FmZUFyZW5hU3RhdHNIYW5kbGVQZWVyOworCisgcHJpdmF0ZToKKyAgVGhyZWFkU2FmZUFyZW5hU3RhdHMqIGluZm9fID0gbnVsbHB0cjsKK307CisKK3VzaW5nIFRocmVhZFNhZmVBcmVuYXpTYW1wbGVyID0KKyAgICA6OmFic2w6OnByb2ZpbGluZ19pbnRlcm5hbDo6U2FtcGxlUmVjb3JkZXI8VGhyZWFkU2FmZUFyZW5hU3RhdHM+OworCitleHRlcm4gUFJPVE9CVUZfVEhSRUFEX0xPQ0FMIGludDY0X3QgZ2xvYmFsX25leHRfc2FtcGxlOworCisvLyBSZXR1cm5zIGFuIFJBSUkgc2FtcGxpbmcgaGFuZGxlIHRoYXQgbWFuYWdlcyByZWdpc3RyYXRpb24gYW5kIHVucmVnaXN0YXRpb24KKy8vIHdpdGggdGhlIGdsb2JhbCBzYW1wbGVyLgoraW5saW5lIFRocmVhZFNhZmVBcmVuYVN0YXRzSGFuZGxlIFNhbXBsZSgpIHsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRSgtLWdsb2JhbF9uZXh0X3NhbXBsZSA+IDApKSB7CisgICAgcmV0dXJuIFRocmVhZFNhZmVBcmVuYVN0YXRzSGFuZGxlKG51bGxwdHIpOworICB9CisgIHJldHVybiBUaHJlYWRTYWZlQXJlbmFTdGF0c0hhbmRsZShTYW1wbGVTbG93KCZnbG9iYWxfbmV4dF9zYW1wbGUpKTsKK30KKworI2Vsc2UKK3N0cnVjdCBUaHJlYWRTYWZlQXJlbmFTdGF0cyB7CisgIHN0YXRpYyB2b2lkIFJlY29yZEFsbG9jYXRlU3RhdHMoVGhyZWFkU2FmZUFyZW5hU3RhdHMqLCBzaXplX3QgLypyZXF1ZXN0ZWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgLyphbGxvY2F0ZWQqLywgc2l6ZV90IC8qd2FzdGVkKi8pIHt9Cit9OworCitUaHJlYWRTYWZlQXJlbmFTdGF0cyogU2FtcGxlU2xvdyhpbnQ2NF90KiBuZXh0X3NhbXBsZSk7Cit2b2lkIFVuc2FtcGxlU2xvdyhUaHJlYWRTYWZlQXJlbmFTdGF0cyogaW5mbyk7CisKK2NsYXNzIFRocmVhZFNhZmVBcmVuYVN0YXRzSGFuZGxlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFRocmVhZFNhZmVBcmVuYVN0YXRzSGFuZGxlKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBUaHJlYWRTYWZlQXJlbmFTdGF0c0hhbmRsZShUaHJlYWRTYWZlQXJlbmFTdGF0cyopIHt9CisKKyAgdm9pZCBSZWNvcmRSZXNldCgpIHt9CisKKyAgVGhyZWFkU2FmZUFyZW5hU3RhdHMqIE11dGFibGVTdGF0cygpIHsgcmV0dXJuIG51bGxwdHI7IH0KKworICBmcmllbmQgdm9pZCBzd2FwKFRocmVhZFNhZmVBcmVuYVN0YXRzSGFuZGxlJiwgVGhyZWFkU2FmZUFyZW5hU3RhdHNIYW5kbGUmKSB7fQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFRocmVhZFNhZmVBcmVuYVN0YXRzSGFuZGxlUGVlcjsKK307CisKK2NsYXNzIFRocmVhZFNhZmVBcmVuYXpTYW1wbGVyIHsKKyBwdWJsaWM6CisgIHZvaWQgVW5yZWdpc3RlcihUaHJlYWRTYWZlQXJlbmFTdGF0cyopIHt9CisgIHZvaWQgU2V0TWF4U2FtcGxlcyhpbnQzMl90KSB7fQorfTsKKworLy8gUmV0dXJucyBhbiBSQUlJIHNhbXBsaW5nIGhhbmRsZSB0aGF0IG1hbmFnZXMgcmVnaXN0cmF0aW9uIGFuZCB1bnJlZ2lzdGF0aW9uCisvLyB3aXRoIHRoZSBnbG9iYWwgc2FtcGxlci4KK2lubGluZSBUaHJlYWRTYWZlQXJlbmFTdGF0c0hhbmRsZSBTYW1wbGUoKSB7CisgIHJldHVybiBUaHJlYWRTYWZlQXJlbmFTdGF0c0hhbmRsZShudWxscHRyKTsKK30KKyNlbmRpZiAgLy8gZGVmaW5lZChQUk9UT0JVRl9BUkVOQVpfU0FNUExFKQorCisvLyBSZXR1cm5zIGEgZ2xvYmFsIFNhbXBsZXIuCitUaHJlYWRTYWZlQXJlbmF6U2FtcGxlciYgR2xvYmFsVGhyZWFkU2FmZUFyZW5helNhbXBsZXIoKTsKKworLy8gRW5hYmxlcyBvciBkaXNhYmxlcyBzYW1wbGluZyBmb3IgdGhyZWFkIHNhZmUgYXJlbmFzLgordm9pZCBTZXRUaHJlYWRTYWZlQXJlbmF6RW5hYmxlZChib29sIGVuYWJsZWQpOworCisvLyBTZXRzIHRoZSByYXRlIGF0IHdoaWNoIHRocmVhZCBzYWZlIGFyZW5hIHdpbGwgYmUgc2FtcGxlZC4KK3ZvaWQgU2V0VGhyZWFkU2FmZUFyZW5helNhbXBsZVBhcmFtZXRlcihpbnQzMl90IHJhdGUpOworCisvLyBTZXRzIGEgc29mdCBtYXggZm9yIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0aGF0IHdpbGwgYmUga2VwdC4KK3ZvaWQgU2V0VGhyZWFkU2FmZUFyZW5hek1heFNhbXBsZXMoaW50MzJfdCBtYXgpOworCisvLyBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIGZvciB3aGVuIGFyZW5hcyBzaG91bGQgYmUgbmV4dCBzYW1wbGVkLgordm9pZCBTZXRUaHJlYWRTYWZlQXJlbmF6R2xvYmFsTmV4dFNhbXBsZShpbnQ2NF90IG5leHRfc2FtcGxlKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NSQ19QUk9UT0JVRl9BUkVOQVpfU0FNUExFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmF6X3NhbXBsZXJfdGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmF6X3NhbXBsZXJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmZlYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYXpfc2FtcGxlcl90ZXN0LmNjCkBAIC0wLDAgKzEsMzgyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYXpfc2FtcGxlci5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHJhbmRvbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0FSRU5BWl9TQU1QTEUpCitjbGFzcyBUaHJlYWRTYWZlQXJlbmFTdGF0c0hhbmRsZVBlZXIgeworIHB1YmxpYzoKKyAgc3RhdGljIGJvb2wgSXNTYW1wbGVkKGNvbnN0IFRocmVhZFNhZmVBcmVuYVN0YXRzSGFuZGxlJiBoKSB7CisgICAgcmV0dXJuIGguaW5mb18gIT0gbnVsbHB0cjsKKyAgfQorCisgIHN0YXRpYyBUaHJlYWRTYWZlQXJlbmFTdGF0cyogR2V0SW5mbyhUaHJlYWRTYWZlQXJlbmFTdGF0c0hhbmRsZSogaCkgeworICAgIHJldHVybiBoLT5pbmZvXzsKKyAgfQorfTsKK3N0ZDo6dmVjdG9yPHNpemVfdD4gR2V0Qnl0ZXNBbGxvY2F0ZWQoVGhyZWFkU2FmZUFyZW5helNhbXBsZXIqIHMpIHsKKyAgc3RkOjp2ZWN0b3I8c2l6ZV90PiByZXM7CisgIHMtPkl0ZXJhdGUoWyZdKGNvbnN0IFRocmVhZFNhZmVBcmVuYVN0YXRzJiBpbmZvKSB7CisgICAgcmVzLnB1c2hfYmFjayhpbmZvLmJ5dGVzX2FsbG9jYXRlZC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpKTsKKyAgfSk7CisgIHJldHVybiByZXM7Cit9CisKK1RocmVhZFNhZmVBcmVuYVN0YXRzKiBSZWdpc3RlcihUaHJlYWRTYWZlQXJlbmF6U2FtcGxlciogcywgc2l6ZV90IHNpemUpIHsKKyAgYXV0byogaW5mbyA9IHMtPlJlZ2lzdGVyKCk7CisgIGFzc2VydChpbmZvICE9IG51bGxwdHIpOworICBpbmZvLT5ieXRlc19hbGxvY2F0ZWQuc3RvcmUoc2l6ZSk7CisgIHJldHVybiBpbmZvOworfQorCisjZW5kaWYgIC8vIGRlZmluZWQoUFJPVE9CVUZfQVJFTkFaX1NBTVBMRSkKKworbmFtZXNwYWNlIHsKKworI2lmIGRlZmluZWQoUFJPVE9CVUZfQVJFTkFaX1NBTVBMRSkKKworVEVTVChUaHJlYWRTYWZlQXJlbmFTdGF0c1Rlc3QsIFByZXBhcmVGb3JTYW1wbGluZykgeworICBUaHJlYWRTYWZlQXJlbmFTdGF0cyBpbmZvOworICBNdXRleExvY2sgbCgmaW5mby5pbml0X211KTsKKyAgaW5mby5QcmVwYXJlRm9yU2FtcGxpbmcoKTsKKworICBFWFBFQ1RfRVEoaW5mby5udW1fYWxsb2NhdGlvbnMubG9hZCgpLCAwKTsKKyAgRVhQRUNUX0VRKGluZm8ubnVtX3Jlc2V0cy5sb2FkKCksIDApOworICBFWFBFQ1RfRVEoaW5mby5ieXRlc19yZXF1ZXN0ZWQubG9hZCgpLCAwKTsKKyAgRVhQRUNUX0VRKGluZm8uYnl0ZXNfYWxsb2NhdGVkLmxvYWQoKSwgMCk7CisgIEVYUEVDVF9FUShpbmZvLmJ5dGVzX3dhc3RlZC5sb2FkKCksIDApOworICBFWFBFQ1RfRVEoaW5mby5tYXhfYnl0ZXNfYWxsb2NhdGVkLmxvYWQoKSwgMCk7CisKKyAgaW5mby5udW1fYWxsb2NhdGlvbnMuc3RvcmUoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIGluZm8ubnVtX3Jlc2V0cy5zdG9yZSgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgaW5mby5ieXRlc19yZXF1ZXN0ZWQuc3RvcmUoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIGluZm8uYnl0ZXNfYWxsb2NhdGVkLnN0b3JlKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICBpbmZvLmJ5dGVzX3dhc3RlZC5zdG9yZSgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgaW5mby5tYXhfYnl0ZXNfYWxsb2NhdGVkLnN0b3JlKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworCisgIGluZm8uUHJlcGFyZUZvclNhbXBsaW5nKCk7CisgIEVYUEVDVF9FUShpbmZvLm51bV9hbGxvY2F0aW9ucy5sb2FkKCksIDApOworICBFWFBFQ1RfRVEoaW5mby5udW1fcmVzZXRzLmxvYWQoKSwgMCk7CisgIEVYUEVDVF9FUShpbmZvLmJ5dGVzX3JlcXVlc3RlZC5sb2FkKCksIDApOworICBFWFBFQ1RfRVEoaW5mby5ieXRlc19hbGxvY2F0ZWQubG9hZCgpLCAwKTsKKyAgRVhQRUNUX0VRKGluZm8uYnl0ZXNfd2FzdGVkLmxvYWQoKSwgMCk7CisgIEVYUEVDVF9FUShpbmZvLm1heF9ieXRlc19hbGxvY2F0ZWQubG9hZCgpLCAwKTsKK30KKworVEVTVChUaHJlYWRTYWZlQXJlbmFTdGF0c1Rlc3QsIFJlY29yZEFsbG9jYXRlU2xvdykgeworICBUaHJlYWRTYWZlQXJlbmFTdGF0cyBpbmZvOworICBNdXRleExvY2sgbCgmaW5mby5pbml0X211KTsKKyAgaW5mby5QcmVwYXJlRm9yU2FtcGxpbmcoKTsKKyAgUmVjb3JkQWxsb2NhdGVTbG93KCZpbmZvLCAvKnJlcXVlc3RlZD0qLzEwMCwgLyphbGxvY2F0ZWQ9Ki8xMjgsIC8qd2FzdGVkPSovMCk7CisgIEVYUEVDVF9FUShpbmZvLm51bV9hbGxvY2F0aW9ucy5sb2FkKCksIDEpOworICBFWFBFQ1RfRVEoaW5mby5udW1fcmVzZXRzLmxvYWQoKSwgMCk7CisgIEVYUEVDVF9FUShpbmZvLmJ5dGVzX3JlcXVlc3RlZC5sb2FkKCksIDEwMCk7CisgIEVYUEVDVF9FUShpbmZvLmJ5dGVzX2FsbG9jYXRlZC5sb2FkKCksIDEyOCk7CisgIEVYUEVDVF9FUShpbmZvLmJ5dGVzX3dhc3RlZC5sb2FkKCksIDApOworICBFWFBFQ1RfRVEoaW5mby5tYXhfYnl0ZXNfYWxsb2NhdGVkLmxvYWQoKSwgMCk7CisgIFJlY29yZEFsbG9jYXRlU2xvdygmaW5mbywgLypyZXF1ZXN0ZWQ9Ki8xMDAsIC8qYWxsb2NhdGVkPSovMjU2LAorICAgICAgICAgICAgICAgICAgICAgLyp3YXN0ZWQ9Ki8yOCk7CisgIEVYUEVDVF9FUShpbmZvLm51bV9hbGxvY2F0aW9ucy5sb2FkKCksIDIpOworICBFWFBFQ1RfRVEoaW5mby5udW1fcmVzZXRzLmxvYWQoKSwgMCk7CisgIEVYUEVDVF9FUShpbmZvLmJ5dGVzX3JlcXVlc3RlZC5sb2FkKCksIDIwMCk7CisgIEVYUEVDVF9FUShpbmZvLmJ5dGVzX2FsbG9jYXRlZC5sb2FkKCksIDM4NCk7CisgIEVYUEVDVF9FUShpbmZvLmJ5dGVzX3dhc3RlZC5sb2FkKCksIDI4KTsKKyAgRVhQRUNUX0VRKGluZm8ubWF4X2J5dGVzX2FsbG9jYXRlZC5sb2FkKCksIDApOworfQorCitURVNUKFRocmVhZFNhZmVBcmVuYVN0YXRzVGVzdCwgUmVjb3JkUmVzZXRTbG93KSB7CisgIFRocmVhZFNhZmVBcmVuYVN0YXRzIGluZm87CisgIE11dGV4TG9jayBsKCZpbmZvLmluaXRfbXUpOworICBpbmZvLlByZXBhcmVGb3JTYW1wbGluZygpOworICBFWFBFQ1RfRVEoaW5mby5udW1fcmVzZXRzLmxvYWQoKSwgMCk7CisgIEVYUEVDVF9FUShpbmZvLmJ5dGVzX2FsbG9jYXRlZC5sb2FkKCksIDApOworICBSZWNvcmRBbGxvY2F0ZVNsb3coJmluZm8sIC8qcmVxdWVzdGVkPSovMTAwLCAvKmFsbG9jYXRlZD0qLzEyOCwgLyp3YXN0ZWQ9Ki8wKTsKKyAgRVhQRUNUX0VRKGluZm8ubnVtX3Jlc2V0cy5sb2FkKCksIDApOworICBFWFBFQ1RfRVEoaW5mby5ieXRlc19hbGxvY2F0ZWQubG9hZCgpLCAxMjgpOworICBSZWNvcmRSZXNldFNsb3coJmluZm8pOworICBFWFBFQ1RfRVEoaW5mby5udW1fcmVzZXRzLmxvYWQoKSwgMSk7CisgIEVYUEVDVF9FUShpbmZvLmJ5dGVzX2FsbG9jYXRlZC5sb2FkKCksIDApOworfQorCitURVNUKFRocmVhZFNhZmVBcmVuYXpTYW1wbGVyVGVzdCwgU21hbGxTYW1wbGVQYXJhbWV0ZXIpIHsKKyAgU2V0VGhyZWFkU2FmZUFyZW5hekVuYWJsZWQodHJ1ZSk7CisgIFNldFRocmVhZFNhZmVBcmVuYXpTYW1wbGVQYXJhbWV0ZXIoMTAwKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkgeworICAgIGludDY0X3QgbmV4dF9zYW1wbGUgPSAwOworICAgIFRocmVhZFNhZmVBcmVuYVN0YXRzKiBzYW1wbGUgPSBTYW1wbGVTbG93KCZuZXh0X3NhbXBsZSk7CisgICAgRVhQRUNUX0dUKG5leHRfc2FtcGxlLCAwKTsKKyAgICBFWFBFQ1RfTkUoc2FtcGxlLCBudWxscHRyKTsKKyAgICBVbnNhbXBsZVNsb3coc2FtcGxlKTsKKyAgfQorfQorCitURVNUKFRocmVhZFNhZmVBcmVuYXpTYW1wbGVyVGVzdCwgTGFyZ2VTYW1wbGVQYXJhbWV0ZXIpIHsKKyAgU2V0VGhyZWFkU2FmZUFyZW5hekVuYWJsZWQodHJ1ZSk7CisgIFNldFRocmVhZFNhZmVBcmVuYXpTYW1wbGVQYXJhbWV0ZXIoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKSB7CisgICAgaW50NjRfdCBuZXh0X3NhbXBsZSA9IDA7CisgICAgVGhyZWFkU2FmZUFyZW5hU3RhdHMqIHNhbXBsZSA9IFNhbXBsZVNsb3coJm5leHRfc2FtcGxlKTsKKyAgICBFWFBFQ1RfR1QobmV4dF9zYW1wbGUsIDApOworICAgIEVYUEVDVF9ORShzYW1wbGUsIG51bGxwdHIpOworICAgIFVuc2FtcGxlU2xvdyhzYW1wbGUpOworICB9Cit9CisKK1RFU1QoVGhyZWFkU2FmZUFyZW5helNhbXBsZXJUZXN0LCBTYW1wbGUpIHsKKyAgU2V0VGhyZWFkU2FmZUFyZW5hekVuYWJsZWQodHJ1ZSk7CisgIFNldFRocmVhZFNhZmVBcmVuYXpTYW1wbGVQYXJhbWV0ZXIoMTAwKTsKKyAgU2V0VGhyZWFkU2FmZUFyZW5hekdsb2JhbE5leHRTYW1wbGUoMCk7CisgIGludDY0X3QgbnVtX3NhbXBsZWQgPSAwOworICBpbnQ2NF90IHRvdGFsID0gMDsKKyAgZG91YmxlIHNhbXBsZV9yYXRlID0gMC4wOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwMDA7ICsraSkgeworICAgIFRocmVhZFNhZmVBcmVuYVN0YXRzSGFuZGxlIGggPSBTYW1wbGUoKTsKKyAgICArK3RvdGFsOworICAgIGlmIChUaHJlYWRTYWZlQXJlbmFTdGF0c0hhbmRsZVBlZXI6OklzU2FtcGxlZChoKSkgeworICAgICAgKytudW1fc2FtcGxlZDsKKyAgICB9CisgICAgc2FtcGxlX3JhdGUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KG51bV9zYW1wbGVkKSAvIHRvdGFsOworICAgIGlmICgwLjAwNSA8IHNhbXBsZV9yYXRlICYmIHNhbXBsZV9yYXRlIDwgMC4wMTUpIGJyZWFrOworICB9CisgIEVYUEVDVF9ORUFSKHNhbXBsZV9yYXRlLCAwLjAxLCAwLjAwNSk7Cit9CisKK1RFU1QoVGhyZWFkU2FmZUFyZW5helNhbXBsZXJUZXN0LCBIYW5kbGUpIHsKKyAgYXV0byYgc2FtcGxlciA9IEdsb2JhbFRocmVhZFNhZmVBcmVuYXpTYW1wbGVyKCk7CisgIFRocmVhZFNhZmVBcmVuYVN0YXRzSGFuZGxlIGgoc2FtcGxlci5SZWdpc3RlcigpKTsKKyAgYXV0byogaW5mbyA9IFRocmVhZFNhZmVBcmVuYVN0YXRzSGFuZGxlUGVlcjo6R2V0SW5mbygmaCk7CisgIGluZm8tPmJ5dGVzX2FsbG9jYXRlZC5zdG9yZSgweDEyMzQ1Njc4LCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKworICBib29sIGZvdW5kID0gZmFsc2U7CisgIHNhbXBsZXIuSXRlcmF0ZShbJl0oY29uc3QgVGhyZWFkU2FmZUFyZW5hU3RhdHMmIGgpIHsKKyAgICBpZiAoJmggPT0gaW5mbykgeworICAgICAgRVhQRUNUX0VRKGguYnl0ZXNfYWxsb2NhdGVkLmxvYWQoKSwgMHgxMjM0NTY3OCk7CisgICAgICBmb3VuZCA9IHRydWU7CisgICAgfQorICB9KTsKKyAgRVhQRUNUX1RSVUUoZm91bmQpOworCisgIGggPSBUaHJlYWRTYWZlQXJlbmFTdGF0c0hhbmRsZSgpOworICBmb3VuZCA9IGZhbHNlOworICBzYW1wbGVyLkl0ZXJhdGUoWyZdKGNvbnN0IFRocmVhZFNhZmVBcmVuYVN0YXRzJiBoKSB7CisgICAgaWYgKCZoID09IGluZm8pIHsKKyAgICAgIC8vIHRoaXMgd2lsbCBvbmx5IGhhcHBlbiBpZiBzb21lIG90aGVyIHRocmVhZCBoYXMgcmVzdXJyZWN0ZWQgdGhlIGluZm8KKyAgICAgIC8vIHRoZSBvbGQgaGFuZGxlIHdhcyB1c2luZy4KKyAgICAgIGlmIChoLmJ5dGVzX2FsbG9jYXRlZC5sb2FkKCkgPT0gMHgxMjM0NTY3OCkgeworICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICB9CisgICAgfQorICB9KTsKKyAgRVhQRUNUX0ZBTFNFKGZvdW5kKTsKK30KKworVEVTVChUaHJlYWRTYWZlQXJlbmF6U2FtcGxlclRlc3QsIFJlZ2lzdHJhdGlvbikgeworICBUaHJlYWRTYWZlQXJlbmF6U2FtcGxlciBzYW1wbGVyOworICBhdXRvKiBpbmZvMSA9IFJlZ2lzdGVyKCZzYW1wbGVyLCAxKTsKKyAgRVhQRUNUX1RIQVQoR2V0Qnl0ZXNBbGxvY2F0ZWQoJnNhbXBsZXIpLCBVbm9yZGVyZWRFbGVtZW50c0FyZSgxKSk7CisKKyAgYXV0byogaW5mbzIgPSBSZWdpc3Rlcigmc2FtcGxlciwgMik7CisgIEVYUEVDVF9USEFUKEdldEJ5dGVzQWxsb2NhdGVkKCZzYW1wbGVyKSwgVW5vcmRlcmVkRWxlbWVudHNBcmUoMSwgMikpOworICBpbmZvMS0+Ynl0ZXNfYWxsb2NhdGVkLnN0b3JlKDMpOworICBFWFBFQ1RfVEhBVChHZXRCeXRlc0FsbG9jYXRlZCgmc2FtcGxlciksIFVub3JkZXJlZEVsZW1lbnRzQXJlKDMsIDIpKTsKKworICBzYW1wbGVyLlVucmVnaXN0ZXIoaW5mbzEpOworICBzYW1wbGVyLlVucmVnaXN0ZXIoaW5mbzIpOworfQorCitURVNUKFRocmVhZFNhZmVBcmVuYXpTYW1wbGVyVGVzdCwgVW5yZWdpc3RyYXRpb24pIHsKKyAgVGhyZWFkU2FmZUFyZW5helNhbXBsZXIgc2FtcGxlcjsKKyAgc3RkOjp2ZWN0b3I8VGhyZWFkU2FmZUFyZW5hU3RhdHMqPiBpbmZvczsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICBpbmZvcy5wdXNoX2JhY2soUmVnaXN0ZXIoJnNhbXBsZXIsIGkpKTsKKyAgfQorICBFWFBFQ1RfVEhBVChHZXRCeXRlc0FsbG9jYXRlZCgmc2FtcGxlciksIFVub3JkZXJlZEVsZW1lbnRzQXJlKDAsIDEsIDIpKTsKKworICBzYW1wbGVyLlVucmVnaXN0ZXIoaW5mb3NbMV0pOworICBFWFBFQ1RfVEhBVChHZXRCeXRlc0FsbG9jYXRlZCgmc2FtcGxlciksIFVub3JkZXJlZEVsZW1lbnRzQXJlKDAsIDIpKTsKKworICBpbmZvcy5wdXNoX2JhY2soUmVnaXN0ZXIoJnNhbXBsZXIsIDMpKTsKKyAgaW5mb3MucHVzaF9iYWNrKFJlZ2lzdGVyKCZzYW1wbGVyLCA0KSk7CisgIEVYUEVDVF9USEFUKEdldEJ5dGVzQWxsb2NhdGVkKCZzYW1wbGVyKSwgVW5vcmRlcmVkRWxlbWVudHNBcmUoMCwgMiwgMywgNCkpOworICBzYW1wbGVyLlVucmVnaXN0ZXIoaW5mb3NbM10pOworICBFWFBFQ1RfVEhBVChHZXRCeXRlc0FsbG9jYXRlZCgmc2FtcGxlciksIFVub3JkZXJlZEVsZW1lbnRzQXJlKDAsIDIsIDQpKTsKKworICBzYW1wbGVyLlVucmVnaXN0ZXIoaW5mb3NbMF0pOworICBzYW1wbGVyLlVucmVnaXN0ZXIoaW5mb3NbMl0pOworICBzYW1wbGVyLlVucmVnaXN0ZXIoaW5mb3NbNF0pOworICBFWFBFQ1RfVEhBVChHZXRCeXRlc0FsbG9jYXRlZCgmc2FtcGxlciksIElzRW1wdHkoKSk7Cit9CisKK1RFU1QoVGhyZWFkU2FmZUFyZW5helNhbXBsZXJUZXN0LCBNdWx0aVRocmVhZGVkKSB7CisgIFRocmVhZFNhZmVBcmVuYXpTYW1wbGVyIHNhbXBsZXI7CisgIGFic2w6Ok5vdGlmaWNhdGlvbiBzdG9wOworICBUaHJlYWRQb29sIHBvb2woMTApOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIHBvb2wuU2NoZWR1bGUoWyZzYW1wbGVyLCAmc3RvcF0oKSB7CisgICAgICBzdGQ6OnJhbmRvbV9kZXZpY2UgcmQ7CisgICAgICBzdGQ6Om10MTk5MzcgZ2VuKHJkKCkpOworCisgICAgICBzdGQ6OnZlY3RvcjxUaHJlYWRTYWZlQXJlbmFTdGF0cyo+IGluZm96OworICAgICAgd2hpbGUgKCFzdG9wLkhhc0JlZW5Ob3RpZmllZCgpKSB7CisgICAgICAgIGlmIChpbmZvei5lbXB0eSgpKSB7CisgICAgICAgICAgaW5mb3oucHVzaF9iYWNrKHNhbXBsZXIuUmVnaXN0ZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjw+KDAsIDEpKGdlbikpIHsKKyAgICAgICAgICBjYXNlIDA6IHsKKyAgICAgICAgICAgIGluZm96LnB1c2hfYmFjayhzYW1wbGVyLlJlZ2lzdGVyKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgMTogeworICAgICAgICAgICAgc2l6ZV90IHAgPQorICAgICAgICAgICAgICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPD4oMCwgaW5mb3ouc2l6ZSgpIC0gMSkoZ2VuKTsKKyAgICAgICAgICAgIFRocmVhZFNhZmVBcmVuYVN0YXRzKiBpbmZvID0gaW5mb3pbcF07CisgICAgICAgICAgICBpbmZveltwXSA9IGluZm96LmJhY2soKTsKKyAgICAgICAgICAgIGluZm96LnBvcF9iYWNrKCk7CisgICAgICAgICAgICBzYW1wbGVyLlVucmVnaXN0ZXIoaW5mbyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKyAgfQorICAvLyBUaGUgdGhyZWFkcyB3aWxsIGhhbW1lciBhd2F5LiAgR2l2ZSBpdCBhIGxpdHRsZSBiaXQgb2YgdGltZSBmb3IgdHNhbiB0bworICAvLyBzcG90IGVycm9ycy4KKyAgYWJzbDo6U2xlZXBGb3IoYWJzbDo6U2Vjb25kcygzKSk7CisgIHN0b3AuTm90aWZ5KCk7Cit9CisKK1RFU1QoVGhyZWFkU2FmZUFyZW5helNhbXBsZXJUZXN0LCBDYWxsYmFjaykgeworICBUaHJlYWRTYWZlQXJlbmF6U2FtcGxlciBzYW1wbGVyOworCisgIGF1dG8qIGluZm8xID0gUmVnaXN0ZXIoJnNhbXBsZXIsIDEpOworICBhdXRvKiBpbmZvMiA9IFJlZ2lzdGVyKCZzYW1wbGVyLCAyKTsKKworICBzdGF0aWMgY29uc3QgVGhyZWFkU2FmZUFyZW5hU3RhdHMqIGV4cGVjdGVkOworCisgIGF1dG8gY2FsbGJhY2sgPSBbXShjb25zdCBUaHJlYWRTYWZlQXJlbmFTdGF0cyYgaW5mbykgeworICAgIC8vIFdlIGNhbid0IHVzZSBgaW5mb2Agb3V0c2lkZSBvZiB0aGlzIGNhbGxiYWNrIGJlY2F1c2UgdGhlIG9iamVjdCB3aWxsIGJlCisgICAgLy8gZGlzcG9zZWQgYXMgc29vbiBhcyB3ZSByZXR1cm4gZnJvbSBoZXJlLgorICAgIEVYUEVDVF9FUSgmaW5mbywgZXhwZWN0ZWQpOworICB9OworCisgIC8vIFNldCB0aGUgY2FsbGJhY2suCisgIEVYUEVDVF9FUShzYW1wbGVyLlNldERpc3Bvc2VDYWxsYmFjayhjYWxsYmFjayksIG51bGxwdHIpOworICBleHBlY3RlZCA9IGluZm8xOworICBzYW1wbGVyLlVucmVnaXN0ZXIoaW5mbzEpOworCisgIC8vIFVuc2V0IHRoZSBjYWxsYmFjay4KKyAgRVhQRUNUX0VRKGNhbGxiYWNrLCBzYW1wbGVyLlNldERpc3Bvc2VDYWxsYmFjayhudWxscHRyKSk7CisgIGV4cGVjdGVkID0gbnVsbHB0cjsgIC8vIG5vIG1vcmUgY2FsbHMuCisgIHNhbXBsZXIuVW5yZWdpc3RlcihpbmZvMik7Cit9CisKK2NsYXNzIFRocmVhZFNhZmVBcmVuYXpTYW1wbGVyVGVzdFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworIHByb3RlY3RlZDoKKyAgdm9pZCBSdW4oKSBvdmVycmlkZSB7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6QXJlbmFTYWZlVW5pcXVlUHRyPAorICAgICAgICBwcm90b2J1Zl90ZXN0X21lc3NhZ2VzOjpwcm90bzI6OlRlc3RBbGxUeXBlc1Byb3RvMj4KKyAgICAgICAgbWVzc2FnZSA9IGdvb2dsZTo6cHJvdG9idWY6Ok1ha2VBcmVuYVNhZmVVbmlxdWU8CisgICAgICAgICAgICBwcm90b2J1Zl90ZXN0X21lc3NhZ2VzOjpwcm90bzI6OlRlc3RBbGxUeXBlc1Byb3RvMj4oYXJlbmFfKTsKKyAgICBHT09HTEVfQ0hFQ0sobWVzc2FnZSAhPSBudWxscHRyKTsKKyAgICAvLyBTaWduYWwgdGhhdCBhIG1lc3NhZ2Ugb24gdGhlIGFyZW5hIGhhcyBiZWVuIGNyZWF0ZWQuICBUaGlzIHNob3VsZCBjcmVhdGUKKyAgICAvLyBhIFNlcmlhbEFyZW5hIGZvciB0aGlzIHRocmVhZC4KKyAgICBpZiAoYmFycmllcl8tPkJsb2NrKCkpIHsKKyAgICAgIGRlbGV0ZSBiYXJyaWVyXzsKKyAgICB9CisgIH0KKworIHB1YmxpYzoKKyAgVGhyZWFkU2FmZUFyZW5helNhbXBsZXJUZXN0VGhyZWFkKGNvbnN0IHRocmVhZDo6T3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNsOjpCYXJyaWVyKiBiYXJyaWVyKQorICAgICAgOiBUaHJlYWQob3B0aW9ucywgbmFtZSksIGFyZW5hXyhhcmVuYSksIGJhcnJpZXJfKGJhcnJpZXIpIHt9CisKKyBwcml2YXRlOgorICBnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmFfOworICBhYnNsOjpCYXJyaWVyKiBiYXJyaWVyXzsKK307CisKK1RFU1QoVGhyZWFkU2FmZUFyZW5helNhbXBsZXJUZXN0LCBNdWx0aVRocmVhZCkgeworICBTZXRUaHJlYWRTYWZlQXJlbmF6RW5hYmxlZCh0cnVlKTsKKyAgLy8gU2V0dGluZyAxIGFzIHRoZSBwYXJhbWV0ZXIgdmFsdWUgbWVhbnMgb25lIGluIGV2ZXJ5IHR3byBhcmVuYXMgd291bGQgYmUKKyAgLy8gc2FtcGxlZCwgb24gYXZlcmFnZS4KKyAgU2V0VGhyZWFkU2FmZUFyZW5helNhbXBsZVBhcmFtZXRlcigxKTsKKyAgU2V0VGhyZWFkU2FmZUFyZW5hekdsb2JhbE5leHRTYW1wbGUoMCk7CisgIGF1dG8mIHNhbXBsZXIgPSBHbG9iYWxUaHJlYWRTYWZlQXJlbmF6U2FtcGxlcigpOworICBpbnQgY291bnQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBjb25zdCBpbnQga051bVRocmVhZHMgPSAxMDsKKyAgICBhYnNsOjpCYXJyaWVyKiBiYXJyaWVyID0gbmV3IGFic2w6OkJhcnJpZXIoa051bVRocmVhZHMgKyAxKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpBcmVuYSBhcmVuYTsKKyAgICB0aHJlYWQ6Ok9wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLnNldF9qb2luYWJsZSh0cnVlKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGhyZWFkU2FmZUFyZW5helNhbXBsZXJUZXN0VGhyZWFkPj4gdGhyZWFkczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1UaHJlYWRzOyBpKyspIHsKKyAgICAgIGF1dG8gdCA9IHN0ZDo6bWFrZV91bmlxdWU8VGhyZWFkU2FmZUFyZW5helNhbXBsZXJUZXN0VGhyZWFkPigKKyAgICAgICAgICBvcHRpb25zLCBTdHJDYXQoInRocmVhZCIsIGkpLCAmYXJlbmEsIGJhcnJpZXIpOworICAgICAgdC0+U3RhcnQoKTsKKyAgICAgIHRocmVhZHMucHVzaF9iYWNrKHN0ZDo6bW92ZSh0KSk7CisgICAgfQorICAgIC8vIFdhaXQgdGlsbCBlYWNoIHRocmVhZCBoYXMgY3JlYXRlZCBhIG1lc3NhZ2Ugb24gdGhlIGFyZW5hLgorICAgIGlmIChiYXJyaWVyLT5CbG9jaygpKSB7CisgICAgICBkZWxldGUgYmFycmllcjsKKyAgICB9CisgICAgc2FtcGxlci5JdGVyYXRlKFsmXShjb25zdCBUaHJlYWRTYWZlQXJlbmFTdGF0cyYgaCkgeyArK2NvdW50OyB9KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1UaHJlYWRzOyBpKyspIHsKKyAgICAgIHRocmVhZHNbaV0tPkpvaW4oKTsKKyAgICB9CisgIH0KKyAgRVhQRUNUX0dUKGNvdW50LCAwKTsKK30KKyNlbmRpZiAgLy8gZGVmaW5lZChQUk9UT0JVRl9BUkVOQVpfU0FNUExFKQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2Fubm90YXRpb25fdGVzdF91dGlsLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9hbm5vdGF0aW9uX3Rlc3RfdXRpbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDgxNWM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9hbm5vdGF0aW9uX3Rlc3RfdXRpbC5jYwpAQCAtMCwwICsxLDE2NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvYW5ub3RhdGlvbl90ZXN0X3V0aWwuaD4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGFubm90YXRpb25fdGVzdF91dGlsIHsKK25hbWVzcGFjZSB7CisKKy8vIEEgQ29kZUdlbmVyYXRvciB0aGF0IGNhcHR1cmVzIHRoZSBGaWxlRGVzY3JpcHRvciBpdCdzIHBhc3NlZCBhcyBhCisvLyBGaWxlRGVzY3JpcHRvclByb3RvLgorY2xhc3MgRGVzY3JpcHRvckNhcHR1cmluZ0dlbmVyYXRvciA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIC8vIERvZXMgbm90IG93biBmaWxlOyBmaWxlIG11c3Qgb3V0bGl2ZSB0aGUgR2VuZXJhdG9yLgorICBleHBsaWNpdCBEZXNjcmlwdG9yQ2FwdHVyaW5nR2VuZXJhdG9yKEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUpCisgICAgICA6IGZpbGVfKGZpbGUpIHt9CisKKyAgYm9vbCBHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LCBzdGQ6OnN0cmluZyogZXJyb3IpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBmaWxlLT5Db3B5VG8oZmlsZV8pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyBwcml2YXRlOgorICBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlXzsKK307Cit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBBZGRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEpIHsKKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OlNldENvbnRlbnRzKFRlc3RUZW1wRGlyKCkgKyAiLyIgKyBmaWxlbmFtZSwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpOworfQorCitib29sIFJ1blByb3RvQ29tcGlsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwbHVnaW5fc3BlY2lmaWNfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZUludGVyZmFjZSogY2xpLCBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlKSB7CisgIGNsaS0+U2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUodHJ1ZSk7CisKKyAgRGVzY3JpcHRvckNhcHR1cmluZ0dlbmVyYXRvciBjYXB0dXJpbmdfZ2VuZXJhdG9yKGZpbGUpOworICBjbGktPlJlZ2lzdGVyR2VuZXJhdG9yKCItLWNhcHR1cmVfb3V0IiwgJmNhcHR1cmluZ19nZW5lcmF0b3IsICIiKTsKKworICBzdGQ6OnN0cmluZyBwcm90b19wYXRoID0gIi1JIiArIFRlc3RUZW1wRGlyKCk7CisgIHN0ZDo6c3RyaW5nIGNhcHR1cmVfb3V0ID0gIi0tY2FwdHVyZV9vdXQ9IiArIFRlc3RUZW1wRGlyKCk7CisKKyAgY29uc3QgY2hhciogYXJndltdID0geyJwcm90b2MiLCBwcm90b19wYXRoLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5fc3BlY2lmaWNfYXJncy5jX3N0cigpLCBjYXB0dXJlX291dC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUuY19zdHIoKX07CisKKyAgcmV0dXJuIGNsaS0+UnVuKDUsIGFyZ3YpID09IDA7Cit9CisKK2Jvb2wgRGVjb2RlTWV0YWRhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIEdlbmVyYXRlZENvZGVJbmZvKiBpbmZvKSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpHZXRDb250ZW50cyhwYXRoLCAmZGF0YSwgdHJ1ZSkpOworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICByZXR1cm4gaW5mby0+UGFyc2VGcm9tWmVyb0NvcHlTdHJlYW0oJmlucHV0KTsKK30KKwordm9pZCBGaW5kQW5ub3RhdGlvbnNPblBhdGgoCisgICAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm8mIGluZm8sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfZmlsZSwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBwYXRoLAorICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKj4qIGFubm90YXRpb25zKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5mby5hbm5vdGF0aW9uX3NpemUoKTsgKytpKSB7CisgICAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGFubm90YXRpb24gPSAmaW5mby5hbm5vdGF0aW9uKGkpOworICAgIGlmIChhbm5vdGF0aW9uLT5zb3VyY2VfZmlsZSgpICE9IHNvdXJjZV9maWxlIHx8CisgICAgICAgIGFubm90YXRpb24tPnBhdGhfc2l6ZSgpICE9IHBhdGguc2l6ZSgpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IG5vZGUgPSAwOworICAgIGZvciAoOyBub2RlIDwgcGF0aC5zaXplKCk7ICsrbm9kZSkgeworICAgICAgaWYgKGFubm90YXRpb24tPnBhdGgobm9kZSkgIT0gcGF0aFtub2RlXSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG5vZGUgPT0gcGF0aC5zaXplKCkpIHsKKyAgICAgIGFubm90YXRpb25zLT5wdXNoX2JhY2soYW5ub3RhdGlvbik7CisgICAgfQorICB9Cit9CisKK2NvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKiBGaW5kQW5ub3RhdGlvbk9uUGF0aCgKKyAgICBjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbyYgaW5mbywgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV9maWxlLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHBhdGgpIHsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qPiBhbm5vdGF0aW9uczsKKyAgRmluZEFubm90YXRpb25zT25QYXRoKGluZm8sIHNvdXJjZV9maWxlLCBwYXRoLCAmYW5ub3RhdGlvbnMpOworICBpZiAoYW5ub3RhdGlvbnMuZW1wdHkoKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBhbm5vdGF0aW9uc1swXTsKK30KKworYm9vbCBBdExlYXN0T25lQW5ub3RhdGlvbk1hdGNoZXNTdWJzdHJpbmcoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfY29udGVudCwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbzo6QW5ub3RhdGlvbio+JiBhbm5vdGF0aW9ucywKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfdGV4dCkgeworICBmb3IgKHN0ZDo6dmVjdG9yPGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgIGkgPSBhbm5vdGF0aW9ucy5iZWdpbigpLAorICAgICAgICAgICBlID0gYW5ub3RhdGlvbnMuZW5kKCk7CisgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICBjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbzo6QW5ub3RhdGlvbiogYW5ub3RhdGlvbiA9ICppOworICAgIHVpbnQzMl90IGJlZ2luID0gYW5ub3RhdGlvbi0+YmVnaW4oKTsKKyAgICB1aW50MzJfdCBlbmQgPSBhbm5vdGF0aW9uLT5lbmQoKTsKKyAgICBpZiAoZW5kIDwgYmVnaW4gfHwgZW5kID4gZmlsZV9jb250ZW50LnNpemUoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoZmlsZV9jb250ZW50LnN1YnN0cihiZWdpbiwgZW5kIC0gYmVnaW4pID09IGV4cGVjdGVkX3RleHQpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQW5ub3RhdGlvbk1hdGNoZXNTdWJzdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGFubm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZF90ZXh0KSB7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKj4gYW5ub3RhdGlvbnM7CisgIGFubm90YXRpb25zLnB1c2hfYmFjayhhbm5vdGF0aW9uKTsKKyAgcmV0dXJuIEF0TGVhc3RPbmVBbm5vdGF0aW9uTWF0Y2hlc1N1YnN0cmluZyhmaWxlX2NvbnRlbnQsIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3RleHQpOworfQorfSAgLy8gbmFtZXNwYWNlIGFubm90YXRpb25fdGVzdF91dGlsCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9hbm5vdGF0aW9uX3Rlc3RfdXRpbC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9hbm5vdGF0aW9uX3Rlc3RfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YzZkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2Fubm90YXRpb25fdGVzdF91dGlsLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9BTk5PVEFUSU9OX1RFU1RfVVRJTF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0FOTk9UQVRJT05fVEVTVF9VVElMX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworLy8gVXRpbGl0aWVzIHRoYXQgYXNzaXN0IGluIHdyaXRpbmcgdGVzdHMgZm9yIGdlbmVyYXRvciBhbm5vdGF0aW9ucy4KKy8vIFNlZSBqYXZhL2ludGVybmFsL2Fubm90YXRpb25fdW5pdHRlc3QuY2MgZm9yIGFuIGV4YW1wbGUuCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGFubm90YXRpb25fdGVzdF91dGlsIHsKKworLy8gU3RydWN0IHRoYXQgY29udGFpbnMgdGhlIGZpbGUgZ2VuZXJhdGVkIGZyb20gYSAucHJvdG8gZmlsZSBhbmQgaXRzCisvLyBHZW5lcmF0ZWRDb2RlSW5mby4gRm9yIGV4YW1wbGUsIHRoZSBKYXZhIGdlbmVyYXRvciB3aWxsIGZpbGwgdGhpcyBzdHJ1Y3QKKy8vIChmb3Igc29tZSAnZm9vLnByb3RvJykgd2l0aDoKKy8vICAgZmlsZV9wYXRoID0gIkZvby5qYXZhIgorLy8gICBmaWxlX2NvbnRlbnQgPSBjb250ZW50IG9mIEZvby5qYXZhCisvLyAgIGZpbGVfaW5mbyA9IHBhcnNlZCBjb250ZW50IG9mIEZvby5qYXZhLnBiLm1ldGEKK3N0cnVjdCBFeHBlY3RlZE91dHB1dCB7CisgIHN0ZDo6c3RyaW5nIGZpbGVfcGF0aDsKKyAgc3RkOjpzdHJpbmcgZmlsZV9jb250ZW50OworICBHZW5lcmF0ZWRDb2RlSW5mbyBmaWxlX2luZm87CisgIGV4cGxpY2l0IEV4cGVjdGVkT3V0cHV0KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX3BhdGgpCisgICAgICA6IGZpbGVfcGF0aChmaWxlX3BhdGgpIHt9Cit9OworCisvLyBDcmVhdGVzIGEgZmlsZSB3aXRoIG5hbWUgYGZpbGVuYW1lYCBhbmQgY29udGVudCBgZGF0YWAgaW4gdGVtcCB0ZXN0CisvLyBkaXJlY3RvcnkuCit2b2lkIEFkZEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZGF0YSk7CisKKy8vIFJ1bnMgcHJvdG8gY29tcGlsZXIuIENhcHR1cmVzIHByb3RvIGZpbGUgc3RydWN0dXJlIGluIEZpbGVEZXNjcmlwdG9yUHJvdG8uCisvLyBGaWxlcyB3aWxsIGJlIGdlbmVyYXRlZCBpbiBUZXN0VGVtcERpcigpIGZvbGRlci4gQ2FsbGVycyBvZiB0aGlzCisvLyBmdW5jdGlvbiBtdXN0IHJlYWQgZ2VuZXJhdGVkIGZpbGVzIHRoZW1zZWx2ZXMuCisvLworLy8gZmlsZW5hbWU6IHNvdXJjZSAucHJvdG8gZmlsZSB1c2VkIHRvIGdlbmVyYXRlIGNvZGUuCisvLyBwbHVnaW5fc3BlY2lmaWNfYXJnczogY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBzcGVjaWZpYyB0byBjdXJyZW50IGdlbmVyYXRvci4KKy8vICAgICBGb3IgSmF2YSwgdGhpcyB2YWx1ZSBtaWdodCBiZSAiLS1qYXZhX291dD1hbm5vdGF0ZV9jb2RlOnRlc3RfdGVtcF9kaXIiCisvLyBjbGk6IGluc3RhbmNlIG9mIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgdG8gcnVuIGdlbmVyYXRvci4gU2VlIEphdmEncworLy8gICAgIGFubm90YXRpb25fdW5pdHRlc3QuY2MgZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRvIGluaXRpYWxpemUgaXQuCisvLyBmaWxlOiBvdXRwdXQgcGFyYW1ldGVyLCB3aWxsIGJlIHNldCB0byB0aGUgZGVzY3JpcHRvciBvZiB0aGUgcHJvdG8gZmlsZQorLy8gICAgIHNwZWNpZmllZCBpbiBmaWxlbmFtZS4KK2Jvb2wgUnVuUHJvdG9Db21waWxlcihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbl9zcGVjaWZpY19hcmdzLAorICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lSW50ZXJmYWNlKiBjbGksIEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUpOworCitib29sIERlY29kZU1ldGFkYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBHZW5lcmF0ZWRDb2RlSW5mbyogaW5mbyk7CisKKy8vIEZpbmRzIGFsbCBvZiB0aGUgQW5ub3RhdGlvbnMgZm9yIGEgZ2l2ZW4gc291cmNlIGZpbGUgYW5kIHBhdGguCisvLyBTZWUgTG9jYXRpb24ucGF0aCBpbiBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvbWFpbi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8gZm9yCisvLyBleHBsYW5hdGlvbiBvZiB3aGF0IHBhdGggdmVjdG9yIGlzLgordm9pZCBGaW5kQW5ub3RhdGlvbnNPblBhdGgoCisgICAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm8mIGluZm8sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfZmlsZSwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBwYXRoLAorICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKj4qIGFubm90YXRpb25zKTsKKworLy8gRmluZHMgdGhlIEFubm90YXRpb24gZm9yIGEgZ2l2ZW4gc291cmNlIGZpbGUgYW5kIHBhdGggKG9yIHJldHVybnMgbnVsbCBpZiBpdAorLy8gY291bGRuJ3QpLiBJZiB0aGVyZSBhcmUgc2V2ZXJhbCBhbm5vdGF0aW9ucyBmb3IgZ2l2ZW4gcGF0aCwgcmV0dXJucyB0aGUgZmlyc3QKKy8vIG9uZS4gU2VlIExvY2F0aW9uLnBhdGggaW4KKy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvYmxvYi9tYWluL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byBmb3IgZXhwbGFuYXRpb24gb2Ygd2hhdCBwYXRoCisvLyB2ZWN0b3IgaXMuCitjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbzo6QW5ub3RhdGlvbiogRmluZEFubm90YXRpb25PblBhdGgoCisgICAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm8mIGluZm8sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfZmlsZSwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBwYXRoKTsKKworLy8gUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgcHJvdmlkZWQgYW5ub3RhdGlvbnMgY292ZXJzIGEgZ2l2ZW4KKy8vIHN1YnN0cmluZyBpbiBmaWxlX2NvbnRlbnQuCitib29sIEF0TGVhc3RPbmVBbm5vdGF0aW9uTWF0Y2hlc1N1YnN0cmluZygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9jb250ZW50LAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKj4mIGFubm90YXRpb25zLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZF90ZXh0KTsKKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBhbm5vdGF0aW9uIGNvdmVycyBhIGdpdmVuIHN1YnN0cmluZyBpbgorLy8gZmlsZV9jb250ZW50LgorYm9vbCBBbm5vdGF0aW9uTWF0Y2hlc1N1YnN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9jb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbzo6QW5ub3RhdGlvbiogYW5ub3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkX3RleHQpOworCit9ICAvLyBuYW1lc3BhY2UgYW5ub3RhdGlvbl90ZXN0X3V0aWwKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0FOTk9UQVRJT05fVEVTVF9VVElMX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5ZDQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwxMzcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworQ29kZUdlbmVyYXRvcjo6fkNvZGVHZW5lcmF0b3IoKSB7fQorCitib29sIENvZGVHZW5lcmF0b3I6OkdlbmVyYXRlQWxsKGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4mIGZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yKSBjb25zdCB7CisgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMganVzdCB0byBjYWxsIHRoZSBwZXIgZmlsZSBtZXRob2QsIGFuZCBwcmVmaXggYW55CisgIC8vIGVycm9yIHN0cmluZyB3aXRoIHRoZSBmaWxlIHRvIHByb3ZpZGUgY29udGV4dC4KKyAgYm9vbCBzdWNjZWVkZWQgPSB0cnVlOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBmaWxlc1tpXTsKKyAgICBzdWNjZWVkZWQgPSBHZW5lcmF0ZShmaWxlLCBwYXJhbWV0ZXIsIGdlbmVyYXRvcl9jb250ZXh0LCBlcnJvcik7CisgICAgaWYgKCFzdWNjZWVkZWQgJiYgZXJyb3IgJiYgZXJyb3ItPmVtcHR5KCkpIHsKKyAgICAgICplcnJvciA9CisgICAgICAgICAgIkNvZGUgZ2VuZXJhdG9yIHJldHVybmVkIGZhbHNlIGJ1dCBwcm92aWRlZCBubyBlcnJvciAiCisgICAgICAgICAgImRlc2NyaXB0aW9uLiI7CisgICAgfQorICAgIGlmIChlcnJvciAmJiAhZXJyb3ItPmVtcHR5KCkpIHsKKyAgICAgICplcnJvciA9IGZpbGUtPm5hbWUoKSArICI6ICIgKyAqZXJyb3I7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFzdWNjZWVkZWQpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc3VjY2VlZGVkOworfQorCitHZW5lcmF0b3JDb250ZXh0Ojp+R2VuZXJhdG9yQ29udGV4dCgpIHt9CisKK2lvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogR2VuZXJhdG9yQ29udGV4dDo6T3BlbkZvckFwcGVuZCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2lvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogR2VuZXJhdG9yQ29udGV4dDo6T3BlbkZvckluc2VydCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnNlcnRpb25fcG9pbnQpIHsKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlRoaXMgR2VuZXJhdG9yQ29udGV4dCBkb2VzIG5vdCBzdXBwb3J0IGluc2VydGlvbi4iOworICByZXR1cm4gbnVsbHB0cjsgIC8vIG1ha2UgY29tcGlsZXIgaGFwcHkKK30KKworaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBHZW5lcmF0b3JDb250ZXh0OjpPcGVuRm9ySW5zZXJ0V2l0aEdlbmVyYXRlZENvZGVJbmZvKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGluc2VydGlvbl9wb2ludCwKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpHZW5lcmF0ZWRDb2RlSW5mbyYgLyppbmZvKi8pIHsKKyAgcmV0dXJuIE9wZW5Gb3JJbnNlcnQoZmlsZW5hbWUsIGluc2VydGlvbl9wb2ludCk7Cit9CisKK3ZvaWQgR2VuZXJhdG9yQ29udGV4dDo6TGlzdFBhcnNlZEZpbGVzKAorICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4qIG91dHB1dCkgeworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVGhpcyBHZW5lcmF0b3JDb250ZXh0IGRvZXMgbm90IHN1cHBvcnQgTGlzdFBhcnNlZEZpbGVzIjsKK30KKwordm9pZCBHZW5lcmF0b3JDb250ZXh0OjpHZXRDb21waWxlclZlcnNpb24oVmVyc2lvbiogdmVyc2lvbikgY29uc3QgeworICB2ZXJzaW9uLT5zZXRfbWFqb3IoR09PR0xFX1BST1RPQlVGX1ZFUlNJT04gLyAxMDAwMDAwKTsKKyAgdmVyc2lvbi0+c2V0X21pbm9yKEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OIC8gMTAwMCAlIDEwMDApOworICB2ZXJzaW9uLT5zZXRfcGF0Y2goR09PR0xFX1BST1RPQlVGX1ZFUlNJT04gJSAxMDAwKTsKKyAgdmVyc2lvbi0+c2V0X3N1ZmZpeChHT09HTEVfUFJPVE9CVUZfVkVSU0lPTl9TVUZGSVgpOworfQorCisvLyBQYXJzZXMgYSBzZXQgb2YgY29tbWEtZGVsaW1pdGVkIG5hbWUvdmFsdWUgcGFpcnMuCit2b2lkIFBhcnNlR2VuZXJhdG9yUGFyYW1ldGVyKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0LAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ID4qIG91dHB1dCkgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGFydHMgPSBTcGxpdCh0ZXh0LCAiLCIsIHRydWUpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMuc2l6ZSgpOyBpKyspIHsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGVxdWFsc19wb3MgPSBwYXJ0c1tpXS5maW5kX2ZpcnN0X29mKCc9Jyk7CisgICAgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFsdWU7CisgICAgaWYgKGVxdWFsc19wb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHZhbHVlLmZpcnN0ID0gcGFydHNbaV07CisgICAgICB2YWx1ZS5zZWNvbmQgPSAiIjsKKyAgICB9IGVsc2UgeworICAgICAgdmFsdWUuZmlyc3QgPSBwYXJ0c1tpXS5zdWJzdHIoMCwgZXF1YWxzX3Bvcyk7CisgICAgICB2YWx1ZS5zZWNvbmQgPSBwYXJ0c1tpXS5zdWJzdHIoZXF1YWxzX3BvcyArIDEpOworICAgIH0KKyAgICBvdXRwdXQtPnB1c2hfYmFjayh2YWx1ZSk7CisgIH0KK30KKworLy8gU3RyaXBzICIucHJvdG8iIG9yICIucHJvdG9kZXZlbCIgZnJvbSB0aGUgZW5kIG9mIGEgZmlsZW5hbWUuCitzdGQ6OnN0cmluZyBTdHJpcFByb3RvKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgeworICBpZiAoSGFzU3VmZml4U3RyaW5nKGZpbGVuYW1lLCAiLnByb3RvZGV2ZWwiKSkgeworICAgIHJldHVybiBTdHJpcFN1ZmZpeFN0cmluZyhmaWxlbmFtZSwgIi5wcm90b2RldmVsIik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFN0cmlwU3VmZml4U3RyaW5nKGZpbGVuYW1lLCAiLnByb3RvIik7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzBiMTE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMjA3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gRGVmaW5lcyB0aGUgYWJzdHJhY3QgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGVhY2ggb2YgdGhlIGxhbmd1YWdlLXNwZWNpZmljCisvLyBjb2RlIGdlbmVyYXRvcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NPREVfR0VORVJBVE9SX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ09ERV9HRU5FUkFUT1JfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCituYW1lc3BhY2UgaW8geworY2xhc3MgWmVyb0NvcHlPdXRwdXRTdHJlYW07Cit9CitjbGFzcyBGaWxlRGVzY3JpcHRvcjsKK2NsYXNzIEdlbmVyYXRlZENvZGVJbmZvOworCituYW1lc3BhY2UgY29tcGlsZXIgeworY2xhc3MgQWNjZXNzSW5mb01hcDsKKworY2xhc3MgVmVyc2lvbjsKKworLy8gRGVmaW5lZCBpbiB0aGlzIGZpbGUuCitjbGFzcyBDb2RlR2VuZXJhdG9yOworY2xhc3MgR2VuZXJhdG9yQ29udGV4dDsKKworLy8gVGhlIGFic3RyYWN0IGludGVyZmFjZSB0byBhIGNsYXNzIHdoaWNoIGdlbmVyYXRlcyBjb2RlIGltcGxlbWVudGluZyBhCisvLyBwYXJ0aWN1bGFyIHByb3RvIGZpbGUgaW4gYSBwYXJ0aWN1bGFyIGxhbmd1YWdlLiAgQSBudW1iZXIgb2YgdGhlc2UgbWF5CisvLyBiZSByZWdpc3RlcmVkIHdpdGggQ29tbWFuZExpbmVJbnRlcmZhY2UgdG8gc3VwcG9ydCB2YXJpb3VzIGxhbmd1YWdlcy4KK2NsYXNzIFBST1RPQ19FWFBPUlQgQ29kZUdlbmVyYXRvciB7CisgcHVibGljOgorICBpbmxpbmUgQ29kZUdlbmVyYXRvcigpIHt9CisgIHZpcnR1YWwgfkNvZGVHZW5lcmF0b3IoKTsKKworICAvLyBHZW5lcmF0ZXMgY29kZSBmb3IgdGhlIGdpdmVuIHByb3RvIGZpbGUsIGdlbmVyYXRpbmcgb25lIG9yIG1vcmUgZmlsZXMgaW4KKyAgLy8gdGhlIGdpdmVuIG91dHB1dCBkaXJlY3RvcnkuCisgIC8vCisgIC8vIEEgcGFyYW1ldGVyIHRvIGJlIHBhc3NlZCB0byB0aGUgZ2VuZXJhdG9yIGNhbiBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQKKyAgLy8gbGluZS4gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHBhc3MgZ2VuZXJhdG9yIHNwZWNpZmljIHBhcmFtZXRlcnMuCisgIC8vIEl0IGlzIGVtcHR5IGlmIG5vIHBhcmFtZXRlciB3YXMgZ2l2ZW4uIFBhcnNlR2VuZXJhdG9yUGFyYW1ldGVyIChiZWxvdyksCisgIC8vIGNhbiBiZSB1c2VkIHRvIGFjY2VwdCBtdWx0aXBsZSBwYXJhbWV0ZXJzIHdpdGhpbiB0aGUgc2luZ2xlIHBhcmFtZXRlcgorICAvLyBjb21tYW5kIGxpbmUgZmxhZy4KKyAgLy8KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwuICBPdGhlcndpc2UsIHNldHMgKmVycm9yIHRvIGEgZGVzY3JpcHRpb24gb2YKKyAgLy8gdGhlIHByb2JsZW0gKGUuZy4gImludmFsaWQgcGFyYW1ldGVyIikgYW5kIHJldHVybnMgZmFsc2UuCisgIHZpcnR1YWwgYm9vbCBHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcikgY29uc3QgPSAwOworCisgIC8vIEdlbmVyYXRlcyBjb2RlIGZvciBhbGwgZ2l2ZW4gcHJvdG8gZmlsZXMuCisgIC8vCisgIC8vIFdBUk5JTkc6IFRoZSBjYW5vbmljYWwgY29kZSBnZW5lcmF0b3IgZGVzaWduIHByb2R1Y2VzIG9uZSBvciB0d28gb3V0cHV0CisgIC8vIGZpbGVzIHBlciBpbnB1dCAucHJvdG8gZmlsZSwgYW5kIHdlIGRvIG5vdCB3aXNoIHRvIGVuY291cmFnZSBhbHRlcm5hdGUKKyAgLy8gZGVzaWducy4KKyAgLy8KKyAgLy8gQSBwYXJhbWV0ZXIgaXMgZ2l2ZW4gYXMgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGFzIGluIHxHZW5lcmF0ZSgpfAorICAvLyBhYm92ZS4KKyAgLy8KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwuICBPdGhlcndpc2UsIHNldHMgKmVycm9yIHRvIGEgZGVzY3JpcHRpb24gb2YKKyAgLy8gdGhlIHByb2JsZW0gKGUuZy4gImludmFsaWQgcGFyYW1ldGVyIikgYW5kIHJldHVybnMgZmFsc2UuCisgIHZpcnR1YWwgYm9vbCBHZW5lcmF0ZUFsbChjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBmaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcikgY29uc3Q7CisKKyAgLy8gVGhpcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHBsdWdpbi5wcm90by4gU2VlIHRoYXQgZmlsZSBmb3IKKyAgLy8gZG9jdW1lbnRhdGlvbiBvbiBlYWNoIHZhbHVlLgorICBlbnVtIEZlYXR1cmUgeworICAgIEZFQVRVUkVfUFJPVE8zX09QVElPTkFMID0gMSwKKyAgfTsKKworICAvLyBJbXBsZW1lbnQgdGhpcyB0byBpbmRpY2F0ZSB3aGF0IGZlYXR1cmVzIHRoaXMgY29kZSBnZW5lcmF0b3Igc3VwcG9ydHMuCisgIC8vCisgIC8vIFRoaXMgbXVzdCBiZSBhIGJpdHdpc2UgT1Igb2YgdmFsdWVzIGZyb20gdGhlIEZlYXR1cmUgZW51bSBhYm92ZSAob3IgemVybykuCisgIHZpcnR1YWwgdWludDY0X3QgR2V0U3VwcG9ydGVkRmVhdHVyZXMoKSBjb25zdCB7IHJldHVybiAwOyB9CisKKyAgLy8gVGhpcyBpcyBubyBsb25nZXIgdXNlZCwgYnV0IHRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgb3BlbnNvdXJjZSBwcm90b2J1ZgorICAvLyBsaWJyYXJ5LCBzbyBpdCBoYXMgdG8gcmVtYWluIHRvIGtlZXAgdnRhYmxlcyB0aGUgc2FtZSBmb3IgdGhlIGN1cnJlbnQKKyAgLy8gdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gV2hlbiBwcm90b2J1ZnMgZG9lcyBhIGFwaSBicmVha2luZyBjaGFuZ2UsIHRoZQorICAvLyBtZXRob2QgY2FuIGJlIHJlbW92ZWQuCisgIHZpcnR1YWwgYm9vbCBIYXNHZW5lcmF0ZUFsbCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb2RlR2VuZXJhdG9yKTsKK307CisKKy8vIENvZGVHZW5lcmF0b3JzIGdlbmVyYXRlIG9uZSBvciBtb3JlIGZpbGVzIGluIGEgZ2l2ZW4gZGlyZWN0b3J5LiAgVGhpcworLy8gYWJzdHJhY3QgaW50ZXJmYWNlIHJlcHJlc2VudHMgdGhlIGRpcmVjdG9yeSB0byB3aGljaCB0aGUgQ29kZUdlbmVyYXRvciBpcworLy8gdG8gd3JpdGUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBHZW5lcmF0b3IKKy8vIHJ1bnMuCitjbGFzcyBQUk9UT0NfRVhQT1JUIEdlbmVyYXRvckNvbnRleHQgeworIHB1YmxpYzoKKyAgaW5saW5lIEdlbmVyYXRvckNvbnRleHQoKSB7CisgIH0KKyAgdmlydHVhbCB+R2VuZXJhdG9yQ29udGV4dCgpOworCisgIC8vIE9wZW5zIHRoZSBnaXZlbiBmaWxlLCB0cnVuY2F0aW5nIGl0IGlmIGl0IGV4aXN0cywgYW5kIHJldHVybnMgYQorICAvLyBaZXJvQ29weU91dHB1dFN0cmVhbSB0aGF0IHdyaXRlcyB0byB0aGUgZmlsZS4gIFRoZSBjYWxsZXIgdGFrZXMgb3duZXJzaGlwCisgIC8vIG9mIHRoZSByZXR1cm5lZCBvYmplY3QuICBUaGlzIG1ldGhvZCBuZXZlciBmYWlscyAoYSBkdW1teSBzdHJlYW0gd2lsbCBiZQorICAvLyByZXR1cm5lZCBpbnN0ZWFkKS4KKyAgLy8KKyAgLy8gVGhlIGZpbGVuYW1lIGdpdmVuIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgIC8vIEUuZy4gdGhlIEMrKyBnZW5lcmF0b3IsIHdoZW4gZ2VuZXJhdGluZyBjb2RlIGZvciAiZm9vL2Jhci5wcm90byIsIHdpbGwKKyAgLy8gZ2VuZXJhdGUgdGhlIGZpbGVzICJmb28vYmFyLnBiLmgiIGFuZCAiZm9vL2Jhci5wYi5jYyI7IG5vdGUgdGhhdAorICAvLyAiZm9vLyIgaXMgaW5jbHVkZWQgaW4gdGhlc2UgZmlsZW5hbWVzLiAgVGhlIGZpbGVuYW1lIGlzIG5vdCBhbGxvd2VkIHRvCisgIC8vIGNvbnRhaW4gIi4iIG9yICIuLiIgY29tcG9uZW50cy4KKyAgdmlydHVhbCBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSA9IDA7CisKKyAgLy8gU2ltaWxhciB0byBPcGVuKCkgYnV0IHRoZSBvdXRwdXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZmlsZSBpZiBleGlzdHMKKyAgdmlydHVhbCBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIE9wZW5Gb3JBcHBlbmQoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKKworICAvLyBDcmVhdGVzIGEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gd2hpY2ggd2lsbCBpbnNlcnQgY29kZSBpbnRvIHRoZSBnaXZlbiBmaWxlCisgIC8vIGF0IHRoZSBnaXZlbiBpbnNlcnRpb24gcG9pbnQuICBTZWUgcGx1Z2luLnByb3RvIChwbHVnaW4ucGIuaCkgZm9yIG1vcmUKKyAgLy8gaW5mb3JtYXRpb24gb24gaW5zZXJ0aW9uIHBvaW50cy4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgIC8vIGFzc2VydC1mYWlscyAtLSBpdCBleGlzdHMgb25seSBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkuCisgIC8vCisgIC8vIFdBUk5JTkc6ICBUaGlzIGZlYXR1cmUgaXMgY3VycmVudGx5IEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisgIHZpcnR1YWwgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBPcGVuRm9ySW5zZXJ0KAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgaW5zZXJ0aW9uX3BvaW50KTsKKworICAvLyBTaW1pbGFyIHRvIE9wZW5Gb3JJbnNlcnQsIGJ1dCBpZiBgaW5mb2AgaXMgbm9uLWVtcHR5LCB3aWxsIG9wZW4gKG9yIGNyZWF0ZSkKKyAgLy8gZmlsZW5hbWUucGIubWV0YSBhbmQgaW5zZXJ0IGluZm8gYXQgdGhlIGFwcHJvcHJpYXRlIHBsYWNlIHdpdGggdGhlCisgIC8vIG5lY2Vzc2FyeSBzaGlmdHMuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlnbm9yZXMgYGluZm9gLgorICAvLworICAvLyBXQVJOSU5HOiAgVGhpcyBmZWF0dXJlIHdpbGwgYmUgUkVNT1ZFRCBpbiB0aGUgbmVhciBmdXR1cmUuCisgIHZpcnR1YWwgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBPcGVuRm9ySW5zZXJ0V2l0aEdlbmVyYXRlZENvZGVJbmZvKAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgaW5zZXJ0aW9uX3BvaW50LAorICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6R2VuZXJhdGVkQ29kZUluZm8mIGluZm8pOworCisgIC8vIFJldHVybnMgYSB2ZWN0b3Igb2YgRmlsZURlc2NyaXB0b3JzIGZvciBhbGwgdGhlIGZpbGVzIGJlaW5nIGNvbXBpbGVkCisgIC8vIGluIHRoaXMgcnVuLiAgVXNlZnVsIGZvciBsYW5ndWFnZXMsIHN1Y2ggYXMgR28sIHRoYXQgdHJlYXQgZmlsZXMKKyAgLy8gZGlmZmVyZW50bHkgd2hlbiBjb21waWxlZCBhcyBhIHNldCByYXRoZXIgdGhhbiBpbmRpdmlkdWFsbHkuCisgIHZpcnR1YWwgdm9pZCBMaXN0UGFyc2VkRmlsZXMoc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiogb3V0cHV0KTsKKworICAvLyBSZXRyaWV2ZXMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwcm90b2NvbCBjb21waWxlciBhc3NvY2lhdGVkIHdpdGgKKyAgLy8gdGhpcyBHZW5lcmF0b3JDb250ZXh0LgorICB2aXJ0dWFsIHZvaWQgR2V0Q29tcGlsZXJWZXJzaW9uKFZlcnNpb24qIHZlcnNpb24pIGNvbnN0OworCisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoR2VuZXJhdG9yQ29udGV4dCk7Cit9OworCisvLyBUaGUgdHlwZSBHZW5lcmF0b3JDb250ZXh0IHdhcyBvbmNlIGNhbGxlZCBPdXRwdXREaXJlY3RvcnkuIFRoaXMgdHlwZWRlZgorLy8gcHJvdmlkZXMgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KK3R5cGVkZWYgR2VuZXJhdG9yQ29udGV4dCBPdXRwdXREaXJlY3Rvcnk7CisKKy8vIFNldmVyYWwgY29kZSBnZW5lcmF0b3JzIHRyZWF0IHRoZSBwYXJhbWV0ZXIgYXJndW1lbnQgYXMgaG9sZGluZyBhCisvLyBsaXN0IG9mIG9wdGlvbnMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHBhcnNlcworLy8gYSBzZXQgb2YgY29tbWEtZGVsaW1pdGVkIG5hbWUvdmFsdWUgcGFpcnM6IGUuZy4sCisvLyAgICJmb289YmFyLGJheixtb289Y29yZ2UiCisvLyBwYXJzZXMgdG8gdGhlIHBhaXJzOgorLy8gICAoImZvbyIsICJiYXIiKSwgKCJiYXoiLCAiIiksICgibW9vIiwgImNvcmdlIikKK1BST1RPQ19FWFBPUlQgdm9pZCBQYXJzZUdlbmVyYXRvclBhcmFtZXRlcigKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYsIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ID4qKTsKKworLy8gU3RyaXBzICIucHJvdG8iIG9yICIucHJvdG9kZXZlbCIgZnJvbSB0aGUgZW5kIG9mIGEgZmlsZW5hbWUuCitQUk9UT0NfRVhQT1JUIHN0ZDo6c3RyaW5nIFN0cmlwUHJvdG8oY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ09ERV9HRU5FUkFUT1JfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU5YTJjNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDI2MjIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIG1ham9yCisjdW5kZWYgbWFqb3IKKyNlbmRpZgorI2lmZGVmIG1pbm9yCisjdW5kZWYgbWlub3IKKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpZm5kZWYgX01TQ19WRVIKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gIC8vIEZvciBQQVRIX01BWAorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaWYgZGVmaW5lZChfX0FQUExFX18pCisjaW5jbHVkZSA8bWFjaC1vL2R5bGQuaD4KKyNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pCisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXBfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCisjaWZuZGVmIE9fQklOQVJZCisjaWZkZWYgX09fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZIF9PX0JJTkFSWQorI2Vsc2UKKyNkZWZpbmUgT19CSU5BUlkgMCAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgcGxhdGZvcm0gZG9lc24ndCBuZWVkIGl0LgorI2VuZGlmCisjZW5kaWYKKworbmFtZXNwYWNlIHsKKyNpZiBkZWZpbmVkKF9XSU4zMikKKy8vIERPIE5PVCBpbmNsdWRlIDxpby5oPiwgaW5zdGVhZCBjcmVhdGUgZnVuY3Rpb25zIGluIGlvX3dpbjMyLntoLGNjfSBhbmQgaW1wb3J0CisvLyB0aGVtIGxpa2Ugd2UgZG8gYmVsb3cuCit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbzo6d2luMzI6OmFjY2VzczsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6Y2xvc2U7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbzo6d2luMzI6Om1rZGlyOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjpvcGVuOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjpzZXRtb2RlOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjp3cml0ZTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhcioga0RlZmF1bHREaXJlY3REZXBlbmRlbmNpZXNWaW9sYXRpb25Nc2cgPQorICAgICJGaWxlIGlzIGltcG9ydGVkIGJ1dCBub3QgZGVjbGFyZWQgaW4gLS1kaXJlY3RfZGVwZW5kZW5jaWVzOiAlcyI7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGV4dCBsb29rcyBsaWtlIGEgV2luZG93cy1zdHlsZSBhYnNvbHV0ZSBwYXRoLCBzdGFydGluZworLy8gd2l0aCBhIGRyaXZlIGxldHRlci4gIEV4YW1wbGU6ICAiQzpcZm9vIi4gIFRPRE8oa2VudG9uKTogIFNoYXJlIHRoaXMgd2l0aAorLy8gY29weSBpbiBpbXBvcnRlci5jYz8KK3N0YXRpYyBib29sIElzV2luZG93c0Fic29sdXRlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCkgeworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisgIHJldHVybiB0ZXh0LnNpemUoKSA+PSAzICYmIHRleHRbMV0gPT0gJzonICYmIGlzYWxwaGEodGV4dFswXSkgJiYKKyAgICAgICAgICh0ZXh0WzJdID09ICcvJyB8fCB0ZXh0WzJdID09ICdcXCcpICYmIHRleHQuZmluZF9sYXN0X29mKCc6JykgPT0gMTsKKyNlbHNlCisgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCit2b2lkIFNldEZkVG9UZXh0TW9kZShpbnQgZmQpIHsKKyNpZmRlZiBfV0lOMzIKKyAgaWYgKHNldG1vZGUoZmQsIF9PX1RFWFQpID09IC0xKSB7CisgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBJIHRoaW5rLgorICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgInNldG1vZGUoIiA8PCBmZCA8PCAiLCBfT19URVhUKTogIiA8PCBzdHJlcnJvcihlcnJubyk7CisgIH0KKyNlbmRpZgorICAvLyAoVGV4dCBhbmQgYmluYXJ5IGFyZSB0aGUgc2FtZSBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMuKQorfQorCit2b2lkIFNldEZkVG9CaW5hcnlNb2RlKGludCBmZCkgeworI2lmZGVmIF9XSU4zMgorICBpZiAoc2V0bW9kZShmZCwgX09fQklOQVJZKSA9PSAtMSkgeworICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgSSB0aGluay4KKyAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJzZXRtb2RlKCIgPDwgZmQgPDwgIiwgX09fQklOQVJZKTogIiA8PCBzdHJlcnJvcihlcnJubyk7CisgIH0KKyNlbmRpZgorICAvLyAoVGV4dCBhbmQgYmluYXJ5IGFyZSB0aGUgc2FtZSBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMuKQorfQorCit2b2lkIEFkZFRyYWlsaW5nU2xhc2goc3RkOjpzdHJpbmcqIHBhdGgpIHsKKyAgaWYgKCFwYXRoLT5lbXB0eSgpICYmIHBhdGgtPmF0KHBhdGgtPnNpemUoKSAtIDEpICE9ICcvJykgeworICAgIHBhdGgtPnB1c2hfYmFjaygnLycpOworICB9Cit9CisKK2Jvb2wgVmVyaWZ5RGlyZWN0b3J5RXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgIGlmIChwYXRoLmVtcHR5KCkpIHJldHVybiB0cnVlOworCisgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBGX09LKSA9PSAtMSkgeworICAgIHN0ZDo6Y2VyciA8PCBwYXRoIDw8ICI6ICIgPDwgc3RyZXJyb3IoZXJybm8pIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKworLy8gVHJ5IHRvIGNyZWF0ZSB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgZ2l2ZW4gZmlsZSwgY3JlYXRpbmcgdGhlIHBhcmVudCdzCisvLyBwYXJlbnQgaWYgbmVjZXNzYXJ5LCBhbmQgc28gb24uICBUaGUgZnVsbCBmaWxlIG5hbWUgaXMgYWN0dWFsbHkKKy8vIChwcmVmaXggKyBmaWxlbmFtZSksIGJ1dCB3ZSBhc3N1bWUgfHByZWZpeHwgYWxyZWFkeSBleGlzdHMgYW5kIG9ubHkgY3JlYXRlCisvLyBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gfGZpbGVuYW1lfC4KK2Jvb2wgVHJ5Q3JlYXRlUGFyZW50RGlyZWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKKyAgLy8gUmVjdXJzaXZlbHkgY3JlYXRlIHBhcmVudCBkaXJlY3RvcmllcyB0byB0aGUgb3V0cHV0IGZpbGUuCisgIC8vIE9uIFdpbmRvd3MsIGJvdGggJy8nIGFuZCAnXCcgYXJlIHZhbGlkIHBhdGggc2VwYXJhdG9ycy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhcnRzID0KKyAgICAgIFNwbGl0KGZpbGVuYW1lLCAiL1xcIiwgdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIHBhdGhfc29fZmFyID0gcHJlZml4OworICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLnNpemUoKSAtIDE7IGkrKykgeworICAgIHBhdGhfc29fZmFyICs9IHBhcnRzW2ldOworICAgIGlmIChta2RpcihwYXRoX3NvX2Zhci5jX3N0cigpLCAwNzc3KSAhPSAwKSB7CisgICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCBmaWxlbmFtZSA8PCAiOiB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgICAgICA8PCBwYXRoX3NvX2ZhciA8PCAiOiAiIDw8IHN0cmVycm9yKGVycm5vKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcGF0aF9zb19mYXIgKz0gJy8nOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEdldCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGlzIHByb3RvYyBiaW5hcnkuCitib29sIEdldFByb3RvY0Fic29sdXRlUGF0aChzdGQ6OnN0cmluZyogcGF0aCkgeworI2lmZGVmIF9XSU4zMgorICBjaGFyIGJ1ZmZlcltNQVhfUEFUSF07CisgIGludCBsZW4gPSBHZXRNb2R1bGVGaWxlTmFtZUEobnVsbHB0ciwgYnVmZmVyLCBNQVhfUEFUSCk7CisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgY2hhciBidWZmZXJbUEFUSF9NQVhdOworICBpbnQgbGVuID0gMDsKKworICBjaGFyIGRpcnR5YnVmZmVyW1BBVEhfTUFYXTsKKyAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihkaXJ0eWJ1ZmZlcik7CisgIGlmIChfTlNHZXRFeGVjdXRhYmxlUGF0aChkaXJ0eWJ1ZmZlciwgJnNpemUpID09IDApIHsKKyAgICByZWFscGF0aChkaXJ0eWJ1ZmZlciwgYnVmZmVyKTsKKyAgICBsZW4gPSBzdHJsZW4oYnVmZmVyKTsKKyAgfQorI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyAgY2hhciBidWZmZXJbUEFUSF9NQVhdOworICBzaXplX3QgbGVuID0gUEFUSF9NQVg7CisgIGludCBtaWJbNF0gPSB7Q1RMX0tFUk4sIEtFUk5fUFJPQywgS0VSTl9QUk9DX1BBVEhOQU1FLCAtMX07CisgIGlmIChzeXNjdGwobWliLCA0LCAmYnVmZmVyLCAmbGVuLCBudWxscHRyLCAwKSAhPSAwKSB7CisgICAgbGVuID0gMDsKKyAgfQorI2Vsc2UKKyAgY2hhciBidWZmZXJbUEFUSF9NQVhdOworICBpbnQgbGVuID0gcmVhZGxpbmsoIi9wcm9jL3NlbGYvZXhlIiwgYnVmZmVyLCBQQVRIX01BWCk7CisjZW5kaWYKKyAgaWYgKGxlbiA+IDApIHsKKyAgICBwYXRoLT5hc3NpZ24oYnVmZmVyLCBsZW4pOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvLyBXaGV0aGVyIGEgcGF0aCBpcyB3aGVyZSBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byBhbmQgb3RoZXIgd2VsbC1rbm93bgorLy8gdHlwZSBwcm90b3MgYXJlIGluc3RhbGxlZC4KK2Jvb2wgSXNJbnN0YWxsZWRQcm90b1BhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKKyAgLy8gQ2hlY2tpbmcgdGhlIGRlc2NyaXB0b3IucHJvdG8gZmlsZSBzaG91bGQgYmUgZ29vZCBlbm91Z2guCisgIHN0ZDo6c3RyaW5nIGZpbGVfcGF0aCA9IHBhdGggKyAiL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKKyAgcmV0dXJuIGFjY2VzcyhmaWxlX3BhdGguY19zdHIoKSwgRl9PSykgIT0gLTE7Cit9CisKKy8vIEFkZCB0aGUgcGF0aHMgd2hlcmUgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8gYW5kIG90aGVyIHdlbGwta25vd24KKy8vIHR5cGUgcHJvdG9zIGFyZSBpbnN0YWxsZWQuCit2b2lkIEFkZERlZmF1bHRQcm90b1BhdGhzKAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiogcGF0aHMpIHsKKyAgLy8gVE9ETyh4aWFvZmVuZyk6IFRoZSBjb2RlIGN1cnJlbnRseSBvbmx5IGNoZWNrcyByZWxhdGl2ZSBwYXRocyBvZiB3aGVyZQorICAvLyB0aGUgcHJvdG9jIGJpbmFyeSBpcyBpbnN0YWxsZWQuIFdlIHByb2JhYmx5IHNob3VsZCBtYWtlIGl0IGhhbmRsZSBtb3JlCisgIC8vIGNhc2VzIHRoYW4gdGhhdC4KKyAgc3RkOjpzdHJpbmcgcGF0aDsKKyAgaWYgKCFHZXRQcm90b2NBYnNvbHV0ZVBhdGgoJnBhdGgpKSB7CisgICAgcmV0dXJuOworICB9CisgIC8vIFN0cmlwIHRoZSBiaW5hcnkgbmFtZS4KKyAgc2l6ZV90IHBvcyA9IHBhdGguZmluZF9sYXN0X29mKCIvXFwiKTsKKyAgaWYgKHBvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcyB8fCBwb3MgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBwYXRoID0gcGF0aC5zdWJzdHIoMCwgcG9zKTsKKyAgLy8gQ2hlY2sgdGhlIGJpbmFyeSdzIGRpcmVjdG9yeS4KKyAgaWYgKElzSW5zdGFsbGVkUHJvdG9QYXRoKHBhdGgpKSB7CisgICAgcGF0aHMtPnB1c2hfYmFjayhzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPigiIiwgcGF0aCkpOworICAgIHJldHVybjsKKyAgfQorICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBpbmNsdWRlIHN1YmRpcmVjdG9yeS4KKyAgaWYgKElzSW5zdGFsbGVkUHJvdG9QYXRoKHBhdGggKyAiL2luY2x1ZGUiKSkgeworICAgIHBhdGhzLT5wdXNoX2JhY2soCisgICAgICAgIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KCIiLCBwYXRoICsgIi9pbmNsdWRlIikpOworICAgIHJldHVybjsKKyAgfQorICAvLyBDaGVjayBpZiB0aGUgdXBwZXIgbGV2ZWwgZGlyZWN0b3J5IGhhcyBhbiAiaW5jbHVkZSIgc3ViZGlyZWN0b3J5LgorICBwb3MgPSBwYXRoLmZpbmRfbGFzdF9vZigiL1xcIik7CisgIGlmIChwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwgcG9zID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgcGF0aCA9IHBhdGguc3Vic3RyKDAsIHBvcyk7CisgIGlmIChJc0luc3RhbGxlZFByb3RvUGF0aChwYXRoICsgIi9pbmNsdWRlIikpIHsKKyAgICBwYXRocy0+cHVzaF9iYWNrKAorICAgICAgICBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPigiIiwgcGF0aCArICIvaW5jbHVkZSIpKTsKKyAgICByZXR1cm47CisgIH0KK30KKworc3RkOjpzdHJpbmcgUGx1Z2luTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGx1Z2luX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRpcmVjdGl2ZSkgeworICAvLyBBc3N1bWluZyB0aGUgZGlyZWN0aXZlIHN0YXJ0cyB3aXRoICItLSIgYW5kIGVuZHMgd2l0aCAiX291dCIgb3IgIl9vcHQiLAorICAvLyBzdHJpcCB0aGUgIi0tIiBhbmQgIl9vdXQvX29wdCIgYW5kIGFkZCB0aGUgcGx1Z2luIHByZWZpeC4KKyAgcmV0dXJuIHBsdWdpbl9wcmVmaXggKyAiZ2VuLSIgKyBkaXJlY3RpdmUuc3Vic3RyKDIsIGRpcmVjdGl2ZS5zaXplKCkgLSA2KTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIEEgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IgdGhhdCBwcmludHMgZXJyb3JzIHRvIHN0ZGVyci4KK2NsYXNzIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpFcnJvclByaW50ZXIKKyAgICA6IHB1YmxpYyBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciwKKyAgICAgIHB1YmxpYyBpbzo6RXJyb3JDb2xsZWN0b3IsCisgICAgICBwdWJsaWMgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIEVycm9yUHJpbnRlcihFcnJvckZvcm1hdCBmb3JtYXQsIERpc2tTb3VyY2VUcmVlKiB0cmVlID0gbnVsbHB0cikKKyAgICAgIDogZm9ybWF0Xyhmb3JtYXQpLAorICAgICAgICB0cmVlXyh0cmVlKSwKKyAgICAgICAgZm91bmRfZXJyb3JzXyhmYWxzZSksCisgICAgICAgIGZvdW5kX3dhcm5pbmdzXyhmYWxzZSkge30KKyAgfkVycm9yUHJpbnRlcigpIG92ZXJyaWRlIHt9CisKKyAgLy8gaW1wbGVtZW50cyBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBBZGRFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSBvdmVycmlkZSB7CisgICAgZm91bmRfZXJyb3JzXyA9IHRydWU7CisgICAgQWRkRXJyb3JPcldhcm5pbmcoZmlsZW5hbWUsIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSwgImVycm9yIiwgc3RkOjpjZXJyKTsKKyAgfQorCisgIHZvaWQgQWRkV2FybmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIG92ZXJyaWRlIHsKKyAgICBmb3VuZF93YXJuaW5nc18gPSB0cnVlOworICAgIEFkZEVycm9yT3JXYXJuaW5nKGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UsICJ3YXJuaW5nIiwgc3RkOjpjbG9nKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgaW86OkVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSBvdmVycmlkZSB7CisgICAgQWRkRXJyb3IoImlucHV0IiwgbGluZSwgY29sdW1uLCBtZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgQWRkV2FybmluZyhpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIG92ZXJyaWRlIHsKKyAgICBBZGRFcnJvck9yV2FybmluZygiaW5wdXQiLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UsICJ3YXJuaW5nIiwgc3RkOjpjbG9nKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLCBFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSBvdmVycmlkZSB7CisgICAgQWRkRXJyb3JPcldhcm5pbmcoZmlsZW5hbWUsIC0xLCAtMSwgbWVzc2FnZSwgImVycm9yIiwgc3RkOjpjZXJyKTsKKyAgfQorCisgIHZvaWQgQWRkV2FybmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLCBFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIG92ZXJyaWRlIHsKKyAgICBBZGRFcnJvck9yV2FybmluZyhmaWxlbmFtZSwgLTEsIC0xLCBtZXNzYWdlLCAid2FybmluZyIsIHN0ZDo6Y2xvZyk7CisgIH0KKworICBib29sIEZvdW5kRXJyb3JzKCkgY29uc3QgeyByZXR1cm4gZm91bmRfZXJyb3JzXzsgfQorCisgIGJvb2wgRm91bmRXYXJuaW5ncygpIGNvbnN0IHsgcmV0dXJuIGZvdW5kX3dhcm5pbmdzXzsgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBBZGRFcnJvck9yV2FybmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLCBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCkgeworICAgIC8vIFByaW50IGZ1bGwgcGF0aCB3aGVuIHJ1bm5pbmcgdW5kZXIgTVNWUworICAgIHN0ZDo6c3RyaW5nIGRmaWxlOworICAgIGlmIChmb3JtYXRfID09IENvbW1hbmRMaW5lSW50ZXJmYWNlOjpFUlJPUl9GT1JNQVRfTVNWUyAmJgorICAgICAgICB0cmVlXyAhPSBudWxscHRyICYmIHRyZWVfLT5WaXJ0dWFsRmlsZVRvRGlza0ZpbGUoZmlsZW5hbWUsICZkZmlsZSkpIHsKKyAgICAgIG91dCA8PCBkZmlsZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGZpbGVuYW1lOworICAgIH0KKworICAgIC8vIFVzZXJzIHR5cGljYWxseSBleHBlY3QgMS1iYXNlZCBsaW5lL2NvbHVtbiBudW1iZXJzLCBzbyB3ZSBhZGQgMQorICAgIC8vIHRvIGVhY2ggaGVyZS4KKyAgICBpZiAobGluZSAhPSAtMSkgeworICAgICAgLy8gQWxsb3cgZm9yIGJvdGggR0NDLSBhbmQgVmlzdWFsLVN0dWRpby1jb21wYXRpYmxlIG91dHB1dC4KKyAgICAgIHN3aXRjaCAoZm9ybWF0XykgeworICAgICAgICBjYXNlIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpFUlJPUl9GT1JNQVRfR0NDOgorICAgICAgICAgIG91dCA8PCAiOiIgPDwgKGxpbmUgKyAxKSA8PCAiOiIgPDwgKGNvbHVtbiArIDEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpFUlJPUl9GT1JNQVRfTVNWUzoKKyAgICAgICAgICBvdXQgPDwgIigiIDw8IChsaW5lICsgMSkgPDwgIikgOiAiIDw8IHR5cGUKKyAgICAgICAgICAgICAgPDwgIiBpbiBjb2x1bW49IiA8PCAoY29sdW1uICsgMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHR5cGUgPT0gIndhcm5pbmciKSB7CisgICAgICBvdXQgPDwgIjogd2FybmluZzogIiA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICI6ICIgPDwgbWVzc2FnZSA8PCBzdGQ6OmVuZGw7CisgICAgfQorICB9CisKKyAgY29uc3QgRXJyb3JGb3JtYXQgZm9ybWF0XzsKKyAgRGlza1NvdXJjZVRyZWUqIHRyZWVfOworICBib29sIGZvdW5kX2Vycm9yc187CisgIGJvb2wgZm91bmRfd2FybmluZ3NfOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBIEdlbmVyYXRvckNvbnRleHQgaW1wbGVtZW50YXRpb24gdGhhdCBidWZmZXJzIGZpbGVzIGluIG1lbW9yeSwgdGhlbiBkdW1wcworLy8gdGhlbSBhbGwgdG8gZGlzayBvbiBkZW1hbmQuCitjbGFzcyBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGwgOiBwdWJsaWMgR2VuZXJhdG9yQ29udGV4dCB7CisgcHVibGljOgorICBHZW5lcmF0b3JDb250ZXh0SW1wbChjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMpOworCisgIC8vIFdyaXRlIGFsbCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHRvIGRpc2sgYXQgdGhlIGdpdmVuIG91dHB1dCBsb2NhdGlvbiwKKyAgLy8gd2hpY2ggbXVzdCBlbmQgaW4gYSAnLycuCisgIGJvb2wgV3JpdGVBbGxUb0Rpc2soY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCk7CisKKyAgLy8gV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZGlyZWN0b3J5IHRvIGEgWklQLWZvcm1hdCBhcmNoaXZlIHdpdGggdGhlCisgIC8vIGdpdmVuIG5hbWUuCisgIGJvb2wgV3JpdGVBbGxUb1ppcChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOworCisgIC8vIEFkZCBhIGJvaWxlcnBsYXRlIE1FVEEtSU5GL01BTklGRVNULk1GIGZpbGUgYXMgcmVxdWlyZWQgYnkgdGhlIEphdmEgSkFSCisgIC8vIGZvcm1hdCwgdW5sZXNzIG9uZSBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uCisgIHZvaWQgQWRkSmFyTWFuaWZlc3QoKTsKKworICAvLyBHZXQgbmFtZSBvZiBhbGwgb3V0cHV0IGZpbGVzLgorICB2b2lkIEdldE91dHB1dEZpbGVuYW1lcyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dHB1dF9maWxlbmFtZXMpOworCisgIC8vIGltcGxlbWVudHMgR2VuZXJhdG9yQ29udGV4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSBvdmVycmlkZTsKKyAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBPcGVuRm9yQXBwZW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgb3ZlcnJpZGU7CisgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3BlbkZvckluc2VydCgKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGluc2VydGlvbl9wb2ludCkgb3ZlcnJpZGU7CisgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3BlbkZvckluc2VydFdpdGhHZW5lcmF0ZWRDb2RlSW5mbygKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGluc2VydGlvbl9wb2ludCwKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvJiBpbmZvKSBvdmVycmlkZTsKKyAgdm9pZCBMaXN0UGFyc2VkRmlsZXMoc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiogb3V0cHV0KSBvdmVycmlkZSB7CisgICAgKm91dHB1dCA9IHBhcnNlZF9maWxlc187CisgIH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBNZW1vcnlPdXRwdXRTdHJlYW07CisKKyAgLy8gVGhlIGZpbGVzXyBmaWVsZCBtYXBzIGZyb20gcGF0aCBrZXlzIHRvIGZpbGUgY29udGVudCB2YWx1ZXMuIEl0J3MgYSBtYXAKKyAgLy8gaW5zdGVhZCBvZiBhbiB1bm9yZGVyZWRfbWFwIHNvIHRoYXQgZmlsZXMgYXJlIHdyaXR0ZW4gaW4gb3JkZXIgKGdvb2Qgd2hlbgorICAvLyB3cml0aW5nIHppcHMpLgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGZpbGVzXzsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzXzsKKyAgYm9vbCBoYWRfZXJyb3JfOworfTsKKworY2xhc3MgQ29tbWFuZExpbmVJbnRlcmZhY2U6Ok1lbW9yeU91dHB1dFN0cmVhbQorICAgIDogcHVibGljIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSB7CisgcHVibGljOgorICBNZW1vcnlPdXRwdXRTdHJlYW0oR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgYm9vbCBhcHBlbmRfbW9kZSk7CisgIE1lbW9yeU91dHB1dFN0cmVhbShHZW5lcmF0b3JDb250ZXh0SW1wbCogZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluc2VydGlvbl9wb2ludCk7CisgIE1lbW9yeU91dHB1dFN0cmVhbShHZW5lcmF0b3JDb250ZXh0SW1wbCogZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluc2VydGlvbl9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvJiBpbmZvKTsKKyAgfk1lbW9yeU91dHB1dFN0cmVhbSgpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGlubmVyXy0+TmV4dChkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIEJhY2tVcChpbnQgY291bnQpIG92ZXJyaWRlIHsgaW5uZXJfLT5CYWNrVXAoY291bnQpOyB9CisgIGludDY0X3QgQnl0ZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gaW5uZXJfLT5CeXRlQ291bnQoKTsgfQorCisgcHJpdmF0ZToKKyAgLy8gQ2hlY2tzIHRvIHNlZSBpZiAiZmlsZW5hbWVfLnBiLm1ldGEiIGV4aXN0cyBpbiBkaXJlY3RvcnlfOyBpZiBzbywgZml4ZXMgdGhlCisgIC8vIG9mZnNldHMgaW4gdGhhdCBHZW5lcmF0ZWRDb2RlSW5mbyByZWNvcmQgdG8gcmVmbGVjdCBieXRlcyBpbnNlcnRlZCBpbgorICAvLyBmaWxlbmFtZV8gYXQgb3JpZ2luYWwgb2Zmc2V0IGluc2VydGlvbl9vZmZzZXQgd2l0aCBsZW5ndGggaW5zZXJ0aW9uX2xlbmd0aC4KKyAgLy8gQWxzbyBhZGRzIGluIHRoZSBkYXRhIGZyb20gaW5mb190b19pbnNlcnRfIHdpdGggdXBkYXRlZCBvZmZzZXRzIGdvdmVybmVkIGJ5CisgIC8vIGluc2VydGlvbl9vZmZzZXQgYW5kIGluZGVudF9sZW5ndGguIFdlIGFzc3VtZSB0aGF0IGluc2VydGlvbnMgd2lsbCBub3QKKyAgLy8gb2NjdXIgd2l0aGluIGFueSBnaXZlbiBhbm5vdGF0ZWQgc3BhbiBvZiB0ZXh0LiBpbnNlcnRpb25fY29udGVudCBtdXN0IGVuZAorICAvLyB3aXRoIGFuIGVuZGxpbmUuCisgIHZvaWQgVXBkYXRlTWV0YWRhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIGluc2VydGlvbl9jb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbnNlcnRpb25fb2Zmc2V0LCBzaXplX3QgaW5zZXJ0aW9uX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5kZW50X2xlbmd0aCk7CisKKyAgLy8gSW5zZXJ0cyBpbmZvX3RvX2luc2VydF8gaW50byB0YXJnZXRfaW5mbywgYXNzdW1pbmcgdGhhdCB0aGUgcmVsZXZhbnQKKyAgLy8gaW5zZXJ0aW9uIHdhcyBtYWRlIGF0IGluc2VydGlvbl9vZmZzZXQgaW4gZmlsZV9jb250ZW50IHdpdGggdGhlIGdpdmVuCisgIC8vIGluZGVudF9sZW5ndGguIGluc2VydGlvbl9jb250ZW50IG11c3QgZW5kIHdpdGggYW4gZW5kbGluZS4KKyAgdm9pZCBJbnNlcnRTaGlmdGVkSW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgaW5zZXJ0aW9uX2NvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluc2VydGlvbl9vZmZzZXQsIHNpemVfdCBpbmRlbnRfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvJiB0YXJnZXRfaW5mbyk7CisKKyAgLy8gV2hlcmUgdG8gaW5zZXJ0IHRoZSBzdHJpbmcgd2hlbiBpdCdzIGRvbmUuCisgIEdlbmVyYXRvckNvbnRleHRJbXBsKiBkaXJlY3RvcnlfOworICBzdGQ6OnN0cmluZyBmaWxlbmFtZV87CisgIHN0ZDo6c3RyaW5nIGluc2VydGlvbl9wb2ludF87CisKKyAgLy8gVGhlIHN0cmluZyB3ZSdyZSBidWlsZGluZy4KKyAgc3RkOjpzdHJpbmcgZGF0YV87CisKKyAgLy8gV2hldGhlciB3ZSBzaG91bGQgYXBwZW5kIHRoZSBvdXRwdXQgc3RyZWFtIHRvIHRoZSBleGlzdGluZyBmaWxlLgorICBib29sIGFwcGVuZF9tb2RlXzsKKworICAvLyBTdHJpbmdPdXRwdXRTdHJlYW0gd3JpdGluZyB0byBkYXRhXy4KKyAgc3RkOjp1bmlxdWVfcHRyPGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0+IGlubmVyXzsKKworICAvLyBUaGUgR2VuZXJhdGVkQ29kZUluZm8gdG8gaW5zZXJ0IGF0IHRoZSBpbnNlcnRpb24gcG9pbnQuCisgIGdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvIGluZm9fdG9faW5zZXJ0XzsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdlbmVyYXRvckNvbnRleHRJbXBsOjpHZW5lcmF0b3JDb250ZXh0SW1wbCgKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMpCisgICAgOiBwYXJzZWRfZmlsZXNfKHBhcnNlZF9maWxlcyksIGhhZF9lcnJvcl8oZmFsc2UpIHt9CisKK2Jvb2wgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdlbmVyYXRvckNvbnRleHRJbXBsOjpXcml0ZUFsbFRvRGlzaygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4KSB7CisgIGlmIChoYWRfZXJyb3JfKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFWZXJpZnlEaXJlY3RvcnlFeGlzdHMocHJlZml4KSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IGZpbGVzXykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZWxhdGl2ZV9maWxlbmFtZSA9IHBhaXIuZmlyc3Q7CisgICAgY29uc3QgY2hhciogZGF0YSA9IHBhaXIuc2Vjb25kLmRhdGEoKTsKKyAgICBpbnQgc2l6ZSA9IHBhaXIuc2Vjb25kLnNpemUoKTsKKworICAgIGlmICghVHJ5Q3JlYXRlUGFyZW50RGlyZWN0b3J5KHByZWZpeCwgcmVsYXRpdmVfZmlsZW5hbWUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gcHJlZml4ICsgcmVsYXRpdmVfZmlsZW5hbWU7CisKKyAgICAvLyBDcmVhdGUgdGhlIG91dHB1dCBmaWxlLgorICAgIGludCBmaWxlX2Rlc2NyaXB0b3I7CisgICAgZG8geworICAgICAgZmlsZV9kZXNjcmlwdG9yID0KKyAgICAgICAgICBvcGVuKGZpbGVuYW1lLmNfc3RyKCksIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0JJTkFSWSwgMDY2Nik7CisgICAgfSB3aGlsZSAoZmlsZV9kZXNjcmlwdG9yIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgICBpZiAoZmlsZV9kZXNjcmlwdG9yIDwgMCkgeworICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICBzdGQ6OmNlcnIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCBzdHJlcnJvcihlcnJvcik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gV3JpdGUgdGhlIGZpbGUuCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICBpbnQgd3JpdGVfcmVzdWx0OworICAgICAgZG8geworICAgICAgICB3cml0ZV9yZXN1bHQgPSB3cml0ZShmaWxlX2Rlc2NyaXB0b3IsIGRhdGEsIHNpemUpOworICAgICAgfSB3aGlsZSAod3JpdGVfcmVzdWx0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgICAgIGlmICh3cml0ZV9yZXN1bHQgPD0gMCkgeworICAgICAgICAvLyBXcml0ZSBlcnJvci4KKworICAgICAgICAvLyBGSVhNRShrZW50b24pOiAgQWNjb3JkaW5nIHRvIHRoZSBtYW4gcGFnZSwgaWYgd3JpdGUoKSByZXR1cm5zIHplcm8sCisgICAgICAgIC8vICAgdGhlcmUgd2FzIG5vIGVycm9yOyB3cml0ZSgpIHNpbXBseSBkaWQgbm90IHdyaXRlIGFueXRoaW5nLiAgSXQncworICAgICAgICAvLyAgIHVuY2xlYXIgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoaXMgbWlnaHQgaGFwcGVuLCBidXQgcHJlc3VtYWJseQorICAgICAgICAvLyAgIGVycm5vIHdvbid0IGJlIHNldCBpbiB0aGlzIGNhc2UuICBJIGFtIGNvbmZ1c2VkIGFzIHRvIGhvdyBzdWNoIGFuCisgICAgICAgIC8vICAgZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQuICBGb3Igbm93IEknbSB0cmVhdGluZyBpdCBhcyBhbiBlcnJvciwKKyAgICAgICAgLy8gICBzaW5jZSByZXRyeWluZyBzZWVtcyBsaWtlIGl0IGNvdWxkIGxlYWQgdG8gYW4gaW5maW5pdGUgbG9vcC4gIEkKKyAgICAgICAgLy8gICBzdXNwZWN0IHRoaXMgbmV2ZXIgYWN0dWFsbHkgaGFwcGVucyBhbnl3YXkuCisKKyAgICAgICAgaWYgKHdyaXRlX3Jlc3VsdCA8IDApIHsKKyAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgZmlsZW5hbWUgPDwgIjogd3JpdGU6ICIgPDwgc3RyZXJyb3IoZXJyb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0ZDo6Y2VyciA8PCBmaWxlbmFtZSA8PCAiOiB3cml0ZSgpIHJldHVybmVkIHplcm8/IiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBkYXRhICs9IHdyaXRlX3Jlc3VsdDsKKyAgICAgIHNpemUgLT0gd3JpdGVfcmVzdWx0OworICAgIH0KKworICAgIGlmIChjbG9zZShmaWxlX2Rlc2NyaXB0b3IpICE9IDApIHsKKyAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgc3RkOjpjZXJyIDw8IGZpbGVuYW1lIDw8ICI6IGNsb3NlOiAiIDw8IHN0cmVycm9yKGVycm9yKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGw6OldyaXRlQWxsVG9aaXAoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7CisgIGlmIChoYWRfZXJyb3JfKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQ3JlYXRlIHRoZSBvdXRwdXQgZmlsZS4KKyAgaW50IGZpbGVfZGVzY3JpcHRvcjsKKyAgZG8geworICAgIGZpbGVfZGVzY3JpcHRvciA9CisgICAgICAgIG9wZW4oZmlsZW5hbWUuY19zdHIoKSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQklOQVJZLCAwNjY2KTsKKyAgfSB3aGlsZSAoZmlsZV9kZXNjcmlwdG9yIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgaWYgKGZpbGVfZGVzY3JpcHRvciA8IDApIHsKKyAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICBzdGQ6OmNlcnIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCBzdHJlcnJvcihlcnJvcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQ3JlYXRlIHRoZSBaaXBXcml0ZXIKKyAgaW86OkZpbGVPdXRwdXRTdHJlYW0gc3RyZWFtKGZpbGVfZGVzY3JpcHRvcik7CisgIFppcFdyaXRlciB6aXBfd3JpdGVyKCZzdHJlYW0pOworCisgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IGZpbGVzXykgeworICAgIHppcF93cml0ZXIuV3JpdGUocGFpci5maXJzdCwgcGFpci5zZWNvbmQpOworICB9CisKKyAgemlwX3dyaXRlci5Xcml0ZURpcmVjdG9yeSgpOworCisgIGlmIChzdHJlYW0uR2V0RXJybm8oKSAhPSAwKSB7CisgICAgc3RkOjpjZXJyIDw8IGZpbGVuYW1lIDw8ICI6ICIgPDwgc3RyZXJyb3Ioc3RyZWFtLkdldEVycm5vKCkpIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIXN0cmVhbS5DbG9zZSgpKSB7CisgICAgc3RkOjpjZXJyIDw8IGZpbGVuYW1lIDw8ICI6ICIgPDwgc3RyZXJyb3Ioc3RyZWFtLkdldEVycm5vKCkpIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGw6OkFkZEphck1hbmlmZXN0KCkgeworICBhdXRvIHBhaXIgPSBmaWxlc18uaW5zZXJ0KHsiTUVUQS1JTkYvTUFOSUZFU1QuTUYiLCAiIn0pOworICBpZiAocGFpci5zZWNvbmQpIHsKKyAgICBwYWlyLmZpcnN0LT5zZWNvbmQgPQorICAgICAgICAiTWFuaWZlc3QtVmVyc2lvbjogMS4wXG4iCisgICAgICAgICJDcmVhdGVkLUJ5OiAxLjYuMCAocHJvdG9jKVxuIgorICAgICAgICAiXG4iOworICB9Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdlbmVyYXRvckNvbnRleHRJbXBsOjpHZXRPdXRwdXRGaWxlbmFtZXMoCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRwdXRfZmlsZW5hbWVzKSB7CisgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IGZpbGVzXykgeworICAgIG91dHB1dF9maWxlbmFtZXMtPnB1c2hfYmFjayhwYWlyLmZpcnN0KTsKKyAgfQorfQorCitpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0b3JDb250ZXh0SW1wbDo6T3BlbigKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKKyAgcmV0dXJuIG5ldyBNZW1vcnlPdXRwdXRTdHJlYW0odGhpcywgZmlsZW5hbWUsIGZhbHNlKTsKK30KKworaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKgorQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdlbmVyYXRvckNvbnRleHRJbXBsOjpPcGVuRm9yQXBwZW5kKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgeworICByZXR1cm4gbmV3IE1lbW9yeU91dHB1dFN0cmVhbSh0aGlzLCBmaWxlbmFtZSwgdHJ1ZSk7Cit9CisKK2lvOjpaZXJvQ29weU91dHB1dFN0cmVhbSoKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0b3JDb250ZXh0SW1wbDo6T3BlbkZvckluc2VydCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnNlcnRpb25fcG9pbnQpIHsKKyAgcmV0dXJuIG5ldyBNZW1vcnlPdXRwdXRTdHJlYW0odGhpcywgZmlsZW5hbWUsIGluc2VydGlvbl9wb2ludCk7Cit9CisKK2lvOjpaZXJvQ29weU91dHB1dFN0cmVhbSoKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0b3JDb250ZXh0SW1wbDo6T3BlbkZvckluc2VydFdpdGhHZW5lcmF0ZWRDb2RlSW5mbygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnNlcnRpb25fcG9pbnQsCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6R2VuZXJhdGVkQ29kZUluZm8mIGluZm8pIHsKKyAgcmV0dXJuIG5ldyBNZW1vcnlPdXRwdXRTdHJlYW0odGhpcywgZmlsZW5hbWUsIGluc2VydGlvbl9wb2ludCwgaW5mbyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29tbWFuZExpbmVJbnRlcmZhY2U6Ok1lbW9yeU91dHB1dFN0cmVhbTo6TWVtb3J5T3V0cHV0U3RyZWFtKAorICAgIEdlbmVyYXRvckNvbnRleHRJbXBsKiBkaXJlY3RvcnksIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICBib29sIGFwcGVuZF9tb2RlKQorICAgIDogZGlyZWN0b3J5XyhkaXJlY3RvcnkpLAorICAgICAgZmlsZW5hbWVfKGZpbGVuYW1lKSwKKyAgICAgIGFwcGVuZF9tb2RlXyhhcHBlbmRfbW9kZSksCisgICAgICBpbm5lcl8obmV3IGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0oJmRhdGFfKSkge30KKworQ29tbWFuZExpbmVJbnRlcmZhY2U6Ok1lbW9yeU91dHB1dFN0cmVhbTo6TWVtb3J5T3V0cHV0U3RyZWFtKAorICAgIEdlbmVyYXRvckNvbnRleHRJbXBsKiBkaXJlY3RvcnksIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5zZXJ0aW9uX3BvaW50KQorICAgIDogZGlyZWN0b3J5XyhkaXJlY3RvcnkpLAorICAgICAgZmlsZW5hbWVfKGZpbGVuYW1lKSwKKyAgICAgIGluc2VydGlvbl9wb2ludF8oaW5zZXJ0aW9uX3BvaW50KSwKKyAgICAgIGlubmVyXyhuZXcgaW86OlN0cmluZ091dHB1dFN0cmVhbSgmZGF0YV8pKSB7fQorCitDb21tYW5kTGluZUludGVyZmFjZTo6TWVtb3J5T3V0cHV0U3RyZWFtOjpNZW1vcnlPdXRwdXRTdHJlYW0oCisgICAgR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnNlcnRpb25fcG9pbnQsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvJiBpbmZvKQorICAgIDogZGlyZWN0b3J5XyhkaXJlY3RvcnkpLAorICAgICAgZmlsZW5hbWVfKGZpbGVuYW1lKSwKKyAgICAgIGluc2VydGlvbl9wb2ludF8oaW5zZXJ0aW9uX3BvaW50KSwKKyAgICAgIGlubmVyXyhuZXcgaW86OlN0cmluZ091dHB1dFN0cmVhbSgmZGF0YV8pKSwKKyAgICAgIGluZm9fdG9faW5zZXJ0XyhpbmZvKSB7fQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpNZW1vcnlPdXRwdXRTdHJlYW06Okluc2VydFNoaWZ0ZWRJbmZvKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnNlcnRpb25fY29udGVudCwgc2l6ZV90IGluc2VydGlvbl9vZmZzZXQsCisgICAgc2l6ZV90IGluZGVudF9sZW5ndGgsIGdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvJiB0YXJnZXRfaW5mbykgeworICAvLyBLZWVwIHRyYWNrIG9mIGhvdyBtdWNoIGV4dHJhIGRhdGEgd2FzIGFkZGVkIGZvciBpbmRlbnRzIGJlZm9yZSB0aGUKKyAgLy8gY3VycmVudCBhbm5vdGF0aW9uIGJlaW5nIGluc2VydGVkLiBgcG9zYCBhbmQgYHNvdXJjZV9hbm5vdGF0aW9uLmJlZ2luKClgCisgIC8vIGFyZSBvZmZzZXRzIGluIGBpbnNlcnRpb25fY29udGVudGAuIGBpbnNlcnRpb25fb2Zmc2V0YCBpcyB1cGRhdGVkIHNvIHRoYXQKKyAgLy8gaXQgY2FuIGJlIGFkZGVkIHRvIGFuIGFubm90YXRpb24ncyBgYmVnaW5gIGZpZWxkIHRvIHJlZmxlY3QgdGhhdAorICAvLyBhbm5vdGF0aW9uJ3MgdXBkYXRlZCBsb2NhdGlvbiBhZnRlciBgaW5zZXJ0aW9uX2NvbnRlbnRgIHdhcyBpbnNlcnRlZCBpbnRvCisgIC8vIHRoZSB0YXJnZXQgZmlsZS4KKyAgc2l6ZV90IHBvcyA9IDA7CisgIGluc2VydGlvbl9vZmZzZXQgKz0gaW5kZW50X2xlbmd0aDsKKyAgZm9yIChjb25zdCBhdXRvJiBzb3VyY2VfYW5ub3RhdGlvbiA6IGluZm9fdG9faW5zZXJ0Xy5hbm5vdGF0aW9uKCkpIHsKKyAgICBHZW5lcmF0ZWRDb2RlSW5mbzo6QW5ub3RhdGlvbiogYW5ub3RhdGlvbiA9IHRhcmdldF9pbmZvLmFkZF9hbm5vdGF0aW9uKCk7CisgICAgaW50IGlubmVyX2luZGVudCA9IDA7CisgICAgLy8gaW5zZXJ0aW9uX2NvbnRlbnQgaXMgZ3VhcmFudGVlZCB0byBlbmQgaW4gYW4gZW5kbGluZS4gVGhpcyBsYXN0IGVuZGxpbmUKKyAgICAvLyBoYXMgbm8gZWZmZWN0IG9uIGluZGVudGF0aW9uLgorICAgIGZvciAoOyBwb3MgPCBzb3VyY2VfYW5ub3RhdGlvbi5lbmQoKSAmJiBwb3MgPCBpbnNlcnRpb25fY29udGVudC5zaXplKCkgLSAxOworICAgICAgICAgKytwb3MpIHsKKyAgICAgIGlmIChpbnNlcnRpb25fY29udGVudFtwb3NdID09ICdcbicpIHsKKyAgICAgICAgaWYgKHBvcyA+PSBzb3VyY2VfYW5ub3RhdGlvbi5iZWdpbigpKSB7CisgICAgICAgICAgLy8gVGhlIGJlZ2lubmluZyBvZiB0aGUgYW5ub3RhdGlvbiBpcyBhdCBpbnNlcnRpb25fb2Zmc2V0LCBidXQgdGhlIGVuZAorICAgICAgICAgIC8vIGNhbiBzdGlsbCBtb3ZlIGZ1cnRoZXIgaW4gdGhlIHRhcmdldCBmaWxlLgorICAgICAgICAgIGlubmVyX2luZGVudCArPSBpbmRlbnRfbGVuZ3RoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluc2VydGlvbl9vZmZzZXQgKz0gaW5kZW50X2xlbmd0aDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAqYW5ub3RhdGlvbiA9IHNvdXJjZV9hbm5vdGF0aW9uOworICAgIGFubm90YXRpb24tPnNldF9iZWdpbihhbm5vdGF0aW9uLT5iZWdpbigpICsgaW5zZXJ0aW9uX29mZnNldCk7CisgICAgaW5zZXJ0aW9uX29mZnNldCArPSBpbm5lcl9pbmRlbnQ7CisgICAgYW5ub3RhdGlvbi0+c2V0X2VuZChhbm5vdGF0aW9uLT5lbmQoKSArIGluc2VydGlvbl9vZmZzZXQpOworICB9Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2U6Ok1lbW9yeU91dHB1dFN0cmVhbTo6VXBkYXRlTWV0YWRhdGEoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluc2VydGlvbl9jb250ZW50LCBzaXplX3QgaW5zZXJ0aW9uX29mZnNldCwKKyAgICBzaXplX3QgaW5zZXJ0aW9uX2xlbmd0aCwgc2l6ZV90IGluZGVudF9sZW5ndGgpIHsKKyAgYXV0byBpdCA9IGRpcmVjdG9yeV8tPmZpbGVzXy5maW5kKGZpbGVuYW1lXyArICIucGIubWV0YSIpOworICBpZiAoaXQgPT0gZGlyZWN0b3J5Xy0+ZmlsZXNfLmVuZCgpICYmIGluZm9fdG9faW5zZXJ0Xy5hbm5vdGF0aW9uKCkuZW1wdHkoKSkgeworICAgIC8vIE5vIG1ldGFkYXRhIHdhcyByZWNvcmRlZCBmb3IgdGhpcyBmaWxlLgorICAgIHJldHVybjsKKyAgfQorICBHZW5lcmF0ZWRDb2RlSW5mbyBtZXRhZGF0YTsKKyAgYm9vbCBpc190ZXh0X2Zvcm1hdCA9IGZhbHNlOworICBzdGQ6OnN0cmluZyogZW5jb2RlZF9kYXRhID0gbnVsbHB0cjsKKyAgaWYgKGl0ICE9IGRpcmVjdG9yeV8tPmZpbGVzXy5lbmQoKSkgeworICAgIGVuY29kZWRfZGF0YSA9ICZpdC0+c2Vjb25kOworICAgIC8vIFRyeSB0byBkZWNvZGUgYSBHZW5lcmF0ZWRDb2RlSW5mbyBwcm90byBmcm9tIHRoZSAucGIubWV0YSBmaWxlLiBJdCBtYXkgYmUKKyAgICAvLyBpbiB3aXJlIG9yIHRleHQgZm9ybWF0LiBLZWVwIHRoZSBzYW1lIGZvcm1hdCB3aGVuIHRoZSBkYXRhIGlzIHdyaXR0ZW4gb3V0CisgICAgLy8gbGF0ZXIuCisgICAgaWYgKCFtZXRhZGF0YS5QYXJzZUZyb21TdHJpbmcoKmVuY29kZWRfZGF0YSkpIHsKKyAgICAgIGlmICghVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKCplbmNvZGVkX2RhdGEsICZtZXRhZGF0YSkpIHsKKyAgICAgICAgLy8gVGhlIG1ldGFkYXRhIGlzIGludmFsaWQuCisgICAgICAgIHN0ZDo6Y2VycgorICAgICAgICAgICAgPDwgZmlsZW5hbWVfCisgICAgICAgICAgICA8PCAiLnBiLm1ldGE6IENvdWxkIG5vdCBwYXJzZSBtZXRhZGF0YSBhcyB3aXJlIG9yIHRleHQgZm9ybWF0LiIKKyAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLy8gR2VuZXJhdG9ycyB0aGF0IHVzZSB0aGUgcHVibGljIHBsdWdpbiBpbnRlcmZhY2UgZW1pdCB0ZXh0LWZvcm1hdAorICAgICAgLy8gbWV0YWRhdGEgKGJlY2F1c2UgaW4gdGhlIHB1YmxpYyBwbHVnaW4gcHJvdG9jb2wsIGZpbGUgY29udGVudCBtdXN0IGJlCisgICAgICAvLyBVVEY4LWVuY29kZWQgc3RyaW5ncykuCisgICAgICBpc190ZXh0X2Zvcm1hdCA9IHRydWU7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIENyZWF0ZSBhIG5ldyBmaWxlIHRvIHN0b3JlIHRoZSBuZXcgbWV0YWRhdGEgaW4gaW5mb190b19pbnNlcnRfLgorICAgIGVuY29kZWRfZGF0YSA9CisgICAgICAgICZkaXJlY3RvcnlfLT5maWxlc18uaW5zZXJ0KHtmaWxlbmFtZV8gKyAiLnBiLm1ldGEiLCAiIn0pLmZpcnN0LT5zZWNvbmQ7CisgIH0KKyAgR2VuZXJhdGVkQ29kZUluZm8gbmV3X21ldGFkYXRhOworICBib29sIGNyb3NzZWRfb2Zmc2V0ID0gZmFsc2U7CisgIHNpemVfdCB0b19hZGQgPSAwOworICBmb3IgKGNvbnN0IGF1dG8mIHNvdXJjZV9hbm5vdGF0aW9uIDogbWV0YWRhdGEuYW5ub3RhdGlvbigpKSB7CisgICAgLy8gVGhlIGZpcnN0IHRpbWUgYW4gYW5ub3RhdGlvbiBhdCBvciBhZnRlciB0aGUgaW5zZXJ0aW9uIHBvaW50IGlzIGZvdW5kLAorICAgIC8vIGluc2VydCB0aGUgbmV3IG1ldGFkYXRhIGZyb20gaW5mb190b19pbnNlcnRfLiBTaGlmdCBhbGwgYW5ub3RhdGlvbnMKKyAgICAvLyBhZnRlciB0aGUgbmV3IG1ldGFkYXRhIGJ5IHRoZSBsZW5ndGggb2YgdGhlIHRleHQgdGhhdCB3YXMgaW5zZXJ0ZWQKKyAgICAvLyAoaW5jbHVkaW5nIGFueSBhZGRpdGlvbmFsIGluZGVudCBsZW5ndGgpLgorICAgIGlmIChzb3VyY2VfYW5ub3RhdGlvbi5iZWdpbigpID49IGluc2VydGlvbl9vZmZzZXQgJiYgIWNyb3NzZWRfb2Zmc2V0KSB7CisgICAgICBjcm9zc2VkX29mZnNldCA9IHRydWU7CisgICAgICBJbnNlcnRTaGlmdGVkSW5mbyhpbnNlcnRpb25fY29udGVudCwgaW5zZXJ0aW9uX29mZnNldCwgaW5kZW50X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19tZXRhZGF0YSk7CisgICAgICB0b19hZGQgKz0gaW5zZXJ0aW9uX2xlbmd0aDsKKyAgICB9CisgICAgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGFubm90YXRpb24gPSBuZXdfbWV0YWRhdGEuYWRkX2Fubm90YXRpb24oKTsKKyAgICAqYW5ub3RhdGlvbiA9IHNvdXJjZV9hbm5vdGF0aW9uOworICAgIGFubm90YXRpb24tPnNldF9iZWdpbihhbm5vdGF0aW9uLT5iZWdpbigpICsgdG9fYWRkKTsKKyAgICBhbm5vdGF0aW9uLT5zZXRfZW5kKGFubm90YXRpb24tPmVuZCgpICsgdG9fYWRkKTsKKyAgfQorICAvLyBJZiB0aGVyZSB3ZXJlIG5ldmVyIGFueSBhbm5vdGF0aW9ucyBhdCBvciBhZnRlciB0aGUgaW5zZXJ0aW9uIHBvaW50LAorICAvLyBtYWtlIHN1cmUgdG8gc3RpbGwgaW5zZXJ0IHRoZSBuZXcgbWV0YWRhdGEgZnJvbSBpbmZvX3RvX2luc2VydF8uCisgIGlmICghY3Jvc3NlZF9vZmZzZXQpIHsKKyAgICBJbnNlcnRTaGlmdGVkSW5mbyhpbnNlcnRpb25fY29udGVudCwgaW5zZXJ0aW9uX29mZnNldCwgaW5kZW50X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICBuZXdfbWV0YWRhdGEpOworICB9CisgIGlmIChpc190ZXh0X2Zvcm1hdCkgeworICAgIFRleHRGb3JtYXQ6OlByaW50VG9TdHJpbmcobmV3X21ldGFkYXRhLCBlbmNvZGVkX2RhdGEpOworICB9IGVsc2UgeworICAgIG5ld19tZXRhZGF0YS5TZXJpYWxpemVUb1N0cmluZyhlbmNvZGVkX2RhdGEpOworICB9Cit9CisKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpNZW1vcnlPdXRwdXRTdHJlYW06On5NZW1vcnlPdXRwdXRTdHJlYW0oKSB7CisgIC8vIE1ha2Ugc3VyZSBhbGwgZGF0YSBoYXMgYmVlbiB3cml0dGVuLgorICBpbm5lcl8ucmVzZXQoKTsKKworICAvLyBJbnNlcnQgaW50byB0aGUgZGlyZWN0b3J5LgorICBhdXRvIHBhaXIgPSBkaXJlY3RvcnlfLT5maWxlc18uaW5zZXJ0KHtmaWxlbmFtZV8sICIifSk7CisgIGF1dG8gaXQgPSBwYWlyLmZpcnN0OworICBib29sIGFscmVhZHlfcHJlc2VudCA9ICFwYWlyLnNlY29uZDsKKworICBpZiAoaW5zZXJ0aW9uX3BvaW50Xy5lbXB0eSgpKSB7CisgICAgLy8gVGhpcyB3YXMganVzdCBhIHJlZ3VsYXIgT3BlbigpLgorICAgIGlmIChhbHJlYWR5X3ByZXNlbnQpIHsKKyAgICAgIGlmIChhcHBlbmRfbW9kZV8pIHsKKyAgICAgICAgaXQtPnNlY29uZC5hcHBlbmQoZGF0YV8pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8IGZpbGVuYW1lXyA8PCAiOiBUcmllZCB0byB3cml0ZSB0aGUgc2FtZSBmaWxlIHR3aWNlLiIKKyAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgZGlyZWN0b3J5Xy0+aGFkX2Vycm9yXyA9IHRydWU7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaXQtPnNlY29uZC5zd2FwKGRhdGFfKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGlzIHdhcyBhbiBPcGVuRm9ySW5zZXJ0KCkuCisKKyAgICAvLyBJZiB0aGUgZGF0YSBkb2Vzbid0IGVuZCB3aXRoIGEgY2xlYW4gbGluZSBicmVhaywgYWRkIG9uZS4KKyAgICBpZiAoIWRhdGFfLmVtcHR5KCkgJiYgZGF0YV9bZGF0YV8uc2l6ZSgpIC0gMV0gIT0gJ1xuJykgeworICAgICAgZGF0YV8ucHVzaF9iYWNrKCdcbicpOworICAgIH0KKworICAgIC8vIEZpbmQgdGhlIGZpbGUgd2UgYXJlIGdvaW5nIHRvIGluc2VydCBpbnRvLgorICAgIGlmICghYWxyZWFkeV9wcmVzZW50KSB7CisgICAgICBzdGQ6OmNlcnIgPDwgZmlsZW5hbWVfCisgICAgICAgICAgICAgICAgPDwgIjogVHJpZWQgdG8gaW5zZXJ0IGludG8gZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QuIgorICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGRpcmVjdG9yeV8tPmhhZF9lcnJvcl8gPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyogdGFyZ2V0ID0gJml0LT5zZWNvbmQ7CisKKyAgICAvLyBGaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQuCisgICAgc3RkOjpzdHJpbmcgbWFnaWNfc3RyaW5nID0KKyAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KCQwKSIsIGluc2VydGlvbl9wb2ludF8pOworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gdGFyZ2V0LT5maW5kKG1hZ2ljX3N0cmluZyk7CisKKyAgICBpZiAocG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgZmlsZW5hbWVfIDw8ICI6IGluc2VydGlvbiBwb2ludCBcIiIgPDwgaW5zZXJ0aW9uX3BvaW50XworICAgICAgICAgICAgICAgIDw8ICJcIiBub3QgZm91bmQuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBkaXJlY3RvcnlfLT5oYWRfZXJyb3JfID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKHBvcyA+IDMpICYmICh0YXJnZXQtPnN1YnN0cihwb3MgLSAzLCAyKSA9PSAiLyoiKSkgeworICAgICAgLy8gU3VwcG9ydCBmb3IgaW5saW5lICIvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoKSAqLyIKKyAgICAgIHBvcyA9IHBvcyAtIDM7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFNlZWsgYmFja3dhcmRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUsIHdoaWNoIGlzIHdoZXJlIHdlIHdpbGwKKyAgICAgIC8vIGluc2VydCB0aGUgZGF0YS4gIE5vdGUgdGhhdCB0aGlzIGhhcyB0aGUgZWZmZWN0IG9mIHB1c2hpbmcgdGhlCisgICAgICAvLyBpbnNlcnRpb24gcG9pbnQgZG93biwgc28gdGhlIGRhdGEgaXMgaW5zZXJ0ZWQgYmVmb3JlIGl0LiAgVGhpcyBpcworICAgICAgLy8gaW50ZW50aW9uYWwgYmVjYXVzZSBpdCBtZWFucyB0aGF0IG11bHRpcGxlIGluc2VydGlvbnMgYXQgdGhlIHNhbWUgcG9pbnQKKyAgICAgIC8vIHdpbGwgZW5kIHVwIGluIHRoZSBleHBlY3RlZCBvcmRlciBpbiB0aGUgZmluYWwgb3V0cHV0LgorICAgICAgcG9zID0gdGFyZ2V0LT5maW5kX2xhc3Rfb2YoJ1xuJywgcG9zKTsKKyAgICAgIGlmIChwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgLy8gSW5zZXJ0aW9uIHBvaW50IGlzIG9uIHRoZSBmaXJzdCBsaW5lLgorICAgICAgICBwb3MgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQWR2YW5jZSB0byBjaGFyYWN0ZXIgYWZ0ZXIgJ1xuJy4KKyAgICAgICAgKytwb3M7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRXh0cmFjdCBpbmRlbnQuCisgICAgc3RkOjpzdHJpbmcgaW5kZW50XygqdGFyZ2V0LCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiLCBwb3MpIC0gcG9zKTsKKworICAgIGlmIChpbmRlbnRfLmVtcHR5KCkpIHsKKyAgICAgIC8vIE5vIGluZGVudC4gIFRoaXMgbWFrZXMgdGhpbmdzIGVhc2llci4KKyAgICAgIHRhcmdldC0+aW5zZXJ0KHBvcywgZGF0YV8pOworICAgICAgVXBkYXRlTWV0YWRhdGEoZGF0YV8sIHBvcywgZGF0YV8uc2l6ZSgpLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQ2FsY3VsYXRlIGhvdyBtdWNoIHNwYWNlIHdlIG5lZWQuCisgICAgICBpbnQgaW5kZW50X3NpemUgPSAwOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhXy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoZGF0YV9baV0gPT0gJ1xuJykgaW5kZW50X3NpemUgKz0gaW5kZW50Xy5zaXplKCk7CisgICAgICB9CisKKyAgICAgIC8vIE1ha2UgYSBob2xlIGZvciBpdC4KKyAgICAgIHRhcmdldC0+aW5zZXJ0KHBvcywgZGF0YV8uc2l6ZSgpICsgaW5kZW50X3NpemUsICdcMCcpOworCisgICAgICAvLyBOb3cgY29weSBpbiB0aGUgZGF0YS4KKyAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZGF0YV9wb3MgPSAwOworICAgICAgY2hhciogdGFyZ2V0X3B0ciA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6c3RyaW5nX2FzX2FycmF5KHRhcmdldCkgKyBwb3M7CisgICAgICB3aGlsZSAoZGF0YV9wb3MgPCBkYXRhXy5zaXplKCkpIHsKKyAgICAgICAgLy8gQ29weSBpbmRlbnQuCisgICAgICAgIG1lbWNweSh0YXJnZXRfcHRyLCBpbmRlbnRfLmRhdGEoKSwgaW5kZW50Xy5zaXplKCkpOworICAgICAgICB0YXJnZXRfcHRyICs9IGluZGVudF8uc2l6ZSgpOworCisgICAgICAgIC8vIENvcHkgbGluZSBmcm9tIGRhdGFfLgorICAgICAgICAvLyBXZSBhbHJlYWR5IGd1YXJhbnRlZWQgdGhhdCBkYXRhXyBlbmRzIHdpdGggYSBuZXdsaW5lIChhYm92ZSksIHNvIHRoaXMKKyAgICAgICAgLy8gc2VhcmNoIGNhbid0IGZhaWwuCisgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGluZV9sZW5ndGggPQorICAgICAgICAgICAgZGF0YV8uZmluZF9maXJzdF9vZignXG4nLCBkYXRhX3BvcykgKyAxIC0gZGF0YV9wb3M7CisgICAgICAgIG1lbWNweSh0YXJnZXRfcHRyLCBkYXRhXy5kYXRhKCkgKyBkYXRhX3BvcywgbGluZV9sZW5ndGgpOworICAgICAgICB0YXJnZXRfcHRyICs9IGxpbmVfbGVuZ3RoOworICAgICAgICBkYXRhX3BvcyArPSBsaW5lX2xlbmd0aDsKKyAgICAgIH0KKyAgICAgIFVwZGF0ZU1ldGFkYXRhKGRhdGFfLCBwb3MsIGRhdGFfLnNpemUoKSArIGluZGVudF9zaXplLCBpbmRlbnRfLnNpemUoKSk7CisKKyAgICAgIEdPT0dMRV9DSEVDS19FUSh0YXJnZXRfcHRyLAorICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpzdHJpbmdfYXNfYXJyYXkodGFyZ2V0KSArIHBvcyArIGRhdGFfLnNpemUoKSArIGluZGVudF9zaXplKTsKKyAgICB9CisgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCitjb25zdCBjaGFyKiBjb25zdCBDb21tYW5kTGluZUludGVyZmFjZTo6a1BhdGhTZXBhcmF0b3IgPSAiOyI7CisjZWxzZQorY29uc3QgY2hhciogY29uc3QgQ29tbWFuZExpbmVJbnRlcmZhY2U6OmtQYXRoU2VwYXJhdG9yID0gIjoiOworI2VuZGlmCisKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpDb21tYW5kTGluZUludGVyZmFjZSgpCisgICAgOiBkaXJlY3RfZGVwZW5kZW5jaWVzX3Zpb2xhdGlvbl9tc2dfKAorICAgICAgICAgIGtEZWZhdWx0RGlyZWN0RGVwZW5kZW5jaWVzVmlvbGF0aW9uTXNnKSB7fQorCitDb21tYW5kTGluZUludGVyZmFjZTo6fkNvbW1hbmRMaW5lSW50ZXJmYWNlKCkge30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZTo6UmVnaXN0ZXJHZW5lcmF0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBoZWxwX3RleHQpIHsKKyAgR2VuZXJhdG9ySW5mbyBpbmZvOworICBpbmZvLmZsYWdfbmFtZSA9IGZsYWdfbmFtZTsKKyAgaW5mby5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7CisgIGluZm8uaGVscF90ZXh0ID0gaGVscF90ZXh0OworICBnZW5lcmF0b3JzX2J5X2ZsYWdfbmFtZV9bZmxhZ19uYW1lXSA9IGluZm87Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2U6OlJlZ2lzdGVyR2VuZXJhdG9yKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fZmxhZ19uYW1lLAorICAgIENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvciwgY29uc3Qgc3RkOjpzdHJpbmcmIGhlbHBfdGV4dCkgeworICBHZW5lcmF0b3JJbmZvIGluZm87CisgIGluZm8uZmxhZ19uYW1lID0gZmxhZ19uYW1lOworICBpbmZvLm9wdGlvbl9mbGFnX25hbWUgPSBvcHRpb25fZmxhZ19uYW1lOworICBpbmZvLmdlbmVyYXRvciA9IGdlbmVyYXRvcjsKKyAgaW5mby5oZWxwX3RleHQgPSBoZWxwX3RleHQ7CisgIGdlbmVyYXRvcnNfYnlfZmxhZ19uYW1lX1tmbGFnX25hbWVdID0gaW5mbzsKKyAgZ2VuZXJhdG9yc19ieV9vcHRpb25fbmFtZV9bb3B0aW9uX2ZsYWdfbmFtZV0gPSBpbmZvOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpBbGxvd1BsdWdpbnMoY29uc3Qgc3RkOjpzdHJpbmcmIGV4ZV9uYW1lX3ByZWZpeCkgeworICBwbHVnaW5fcHJlZml4XyA9IGV4ZV9uYW1lX3ByZWZpeDsKK30KKworbmFtZXNwYWNlIHsKKworYm9vbCBDb250YWluc1Byb3RvM09wdGlvbmFsKGNvbnN0IERlc2NyaXB0b3IqIGRlc2MpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoZGVzYy0+ZmllbGQoaSktPmhhc19vcHRpb25hbF9rZXl3b3JkKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2MtPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGlmIChDb250YWluc1Byb3RvM09wdGlvbmFsKGRlc2MtPm5lc3RlZF90eXBlKGkpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDb250YWluc1Byb3RvM09wdGlvbmFsKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIGlmIChmaWxlLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgaWYgKENvbnRhaW5zUHJvdG8zT3B0aW9uYWwoZmlsZS0+bWVzc2FnZV90eXBlKGkpKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHsKK3N0ZDo6dW5pcXVlX3B0cjxTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U+CitQb3B1bGF0ZVNpbmdsZVNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZShjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRvcl9zZXRfbmFtZSk7Cit9CisKK2ludCBDb21tYW5kTGluZUludGVyZmFjZTo6UnVuKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pIHsKKyAgQ2xlYXIoKTsKKyAgc3dpdGNoIChQYXJzZUFyZ3VtZW50cyhhcmdjLCBhcmd2KSkgeworICAgIGNhc2UgUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfRVhJVDoKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgUEFSU0VfQVJHVU1FTlRfRkFJTDoKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfQ09OVElOVUU6CisgICAgICBicmVhazsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gcGFyc2VkX2ZpbGVzOworICBzdGQ6OnVuaXF1ZV9wdHI8RGlza1NvdXJjZVRyZWU+IGRpc2tfc291cmNlX3RyZWU7CisgIHN0ZDo6dW5pcXVlX3B0cjxFcnJvclByaW50ZXI+IGVycm9yX2NvbGxlY3RvcjsKKyAgc3RkOjp1bmlxdWVfcHRyPERlc2NyaXB0b3JQb29sPiBkZXNjcmlwdG9yX3Bvb2w7CisKKyAgLy8gVGhlIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZXMgaGVyZSBhcmUgdGhlIGNvbnN0aXR1ZW50cyBvZiB0aGUKKyAgLy8gTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlIGRlc2NyaXB0b3Jfc2V0X2luX2RhdGFiYXNlLCBzbyB0aGlzIHZlY3RvciBpcyBmb3IKKyAgLy8gbWFuYWdpbmcgdGhlaXIgbGlmZXRpbWVzLiBJdHMgc2NvcGUgc2hvdWxkIG1hdGNoIGRlc2NyaXB0b3Jfc2V0X2luX2RhdGFiYXNlCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U+PgorICAgICAgZGF0YWJhc2VzX3Blcl9kZXNjcmlwdG9yX3NldDsKKyAgc3RkOjp1bmlxdWVfcHRyPE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZT4gZGVzY3JpcHRvcl9zZXRfaW5fZGF0YWJhc2U7CisKKyAgc3RkOjp1bmlxdWVfcHRyPFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U+IHNvdXJjZV90cmVlX2RhdGFiYXNlOworCisgIC8vIEFueSAtLWRlc2NyaXB0b3Jfc2V0X2luIEZpbGVEZXNjcmlwdG9yU2V0IG9iamVjdHMgd2lsbCBiZSB1c2VkIGFzIGEKKyAgLy8gZmFsbGJhY2sgdG8gaW5wdXRfZmlsZXMgb24gY29tbWFuZCBsaW5lLCBzbyBjcmVhdGUgdGhhdCBkYiBmaXJzdC4KKyAgaWYgKCFkZXNjcmlwdG9yX3NldF9pbl9uYW1lc18uZW1wdHkoKSkgeworICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgOiBkZXNjcmlwdG9yX3NldF9pbl9uYW1lc18pIHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U+IGRhdGFiYXNlX2Zvcl9kZXNjcmlwdG9yX3NldCA9CisgICAgICAgICAgUG9wdWxhdGVTaW5nbGVTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UobmFtZSk7CisgICAgICBpZiAoIWRhdGFiYXNlX2Zvcl9kZXNjcmlwdG9yX3NldCkgeworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgfQorICAgICAgZGF0YWJhc2VzX3Blcl9kZXNjcmlwdG9yX3NldC5wdXNoX2JhY2soCisgICAgICAgICAgc3RkOjptb3ZlKGRhdGFiYXNlX2Zvcl9kZXNjcmlwdG9yX3NldCkpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPERlc2NyaXB0b3JEYXRhYmFzZSo+IHJhd19kYXRhYmFzZXNfcGVyX2Rlc2NyaXB0b3Jfc2V0OworICAgIHJhd19kYXRhYmFzZXNfcGVyX2Rlc2NyaXB0b3Jfc2V0LnJlc2VydmUoCisgICAgICAgIGRhdGFiYXNlc19wZXJfZGVzY3JpcHRvcl9zZXQuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U+JiBkYiA6CisgICAgICAgICBkYXRhYmFzZXNfcGVyX2Rlc2NyaXB0b3Jfc2V0KSB7CisgICAgICByYXdfZGF0YWJhc2VzX3Blcl9kZXNjcmlwdG9yX3NldC5wdXNoX2JhY2soZGIuZ2V0KCkpOworICAgIH0KKyAgICBkZXNjcmlwdG9yX3NldF9pbl9kYXRhYmFzZS5yZXNldCgKKyAgICAgICAgbmV3IE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZShyYXdfZGF0YWJhc2VzX3Blcl9kZXNjcmlwdG9yX3NldCkpOworICB9CisKKyAgaWYgKHByb3RvX3BhdGhfLmVtcHR5KCkpIHsKKyAgICAvLyBJZiB0aGVyZSBhcmUgbm8gLS1wcm90b19wYXRoIGZsYWdzLCB0aGVuIGp1c3QgbG9vayBpbiB0aGUgc3BlY2lmaWVkCisgICAgLy8gLS1kZXNjcmlwdG9yX3NldF9pbiBmaWxlcy4gIEJ1dCBmaXJzdCwgdmVyaWZ5IHRoYXQgdGhlIGlucHV0IGZpbGVzIGFyZQorICAgIC8vIHRoZXJlLgorICAgIGlmICghVmVyaWZ5SW5wdXRGaWxlc0luRGVzY3JpcHRvcnMoZGVzY3JpcHRvcl9zZXRfaW5fZGF0YWJhc2UuZ2V0KCkpKSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBlcnJvcl9jb2xsZWN0b3IucmVzZXQobmV3IEVycm9yUHJpbnRlcihlcnJvcl9mb3JtYXRfKSk7CisgICAgZGVzY3JpcHRvcl9wb29sLnJlc2V0KG5ldyBEZXNjcmlwdG9yUG9vbChkZXNjcmlwdG9yX3NldF9pbl9kYXRhYmFzZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvbGxlY3Rvci5nZXQoKSkpOworICB9IGVsc2UgeworICAgIGRpc2tfc291cmNlX3RyZWUucmVzZXQobmV3IERpc2tTb3VyY2VUcmVlKCkpOworICAgIGlmICghSW5pdGlhbGl6ZURpc2tTb3VyY2VUcmVlKGRpc2tfc291cmNlX3RyZWUuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9zZXRfaW5fZGF0YWJhc2UuZ2V0KCkpKSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBlcnJvcl9jb2xsZWN0b3IucmVzZXQoCisgICAgICAgIG5ldyBFcnJvclByaW50ZXIoZXJyb3JfZm9ybWF0XywgZGlza19zb3VyY2VfdHJlZS5nZXQoKSkpOworCisgICAgc291cmNlX3RyZWVfZGF0YWJhc2UucmVzZXQobmV3IFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UoCisgICAgICAgIGRpc2tfc291cmNlX3RyZWUuZ2V0KCksIGRlc2NyaXB0b3Jfc2V0X2luX2RhdGFiYXNlLmdldCgpKSk7CisgICAgc291cmNlX3RyZWVfZGF0YWJhc2UtPlJlY29yZEVycm9yc1RvKGVycm9yX2NvbGxlY3Rvci5nZXQoKSk7CisKKyAgICBkZXNjcmlwdG9yX3Bvb2wucmVzZXQobmV3IERlc2NyaXB0b3JQb29sKAorICAgICAgICBzb3VyY2VfdHJlZV9kYXRhYmFzZS5nZXQoKSwKKyAgICAgICAgc291cmNlX3RyZWVfZGF0YWJhc2UtPkdldFZhbGlkYXRpb25FcnJvckNvbGxlY3RvcigpKSk7CisgIH0KKworICBkZXNjcmlwdG9yX3Bvb2wtPkVuZm9yY2VXZWFrRGVwZW5kZW5jaWVzKHRydWUpOworICBpZiAoIVBhcnNlSW5wdXRGaWxlcyhkZXNjcmlwdG9yX3Bvb2wuZ2V0KCksIGRpc2tfc291cmNlX3RyZWUuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICZwYXJzZWRfZmlsZXMpKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworCisgIC8vIFdlIGNvbnN0cnVjdCBhIHNlcGFyYXRlIEdlbmVyYXRvckNvbnRleHQgZm9yIGVhY2ggb3V0cHV0IGxvY2F0aW9uLiAgTm90ZQorICAvLyB0aGF0IHR3byBjb2RlIGdlbmVyYXRvcnMgbWF5IG91dHB1dCB0byB0aGUgc2FtZSBsb2NhdGlvbiwgaW4gd2hpY2ggY2FzZQorICAvLyB0aGV5IHNob3VsZCBzaGFyZSBhIHNpbmdsZSBHZW5lcmF0b3JDb250ZXh0IHNvIHRoYXQgT3BlbkZvckluc2VydCgpIHdvcmtzLgorICBHZW5lcmF0b3JDb250ZXh0TWFwIG91dHB1dF9kaXJlY3RvcmllczsKKworICAvLyBHZW5lcmF0ZSBvdXRwdXQuCisgIGlmIChtb2RlXyA9PSBNT0RFX0NPTVBJTEUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dF9kaXJlY3RpdmVzXy5zaXplKCk7IGkrKykgeworICAgICAgc3RkOjpzdHJpbmcgb3V0cHV0X2xvY2F0aW9uID0gb3V0cHV0X2RpcmVjdGl2ZXNfW2ldLm91dHB1dF9sb2NhdGlvbjsKKyAgICAgIGlmICghSGFzU3VmZml4U3RyaW5nKG91dHB1dF9sb2NhdGlvbiwgIi56aXAiKSAmJgorICAgICAgICAgICFIYXNTdWZmaXhTdHJpbmcob3V0cHV0X2xvY2F0aW9uLCAiLmphciIpICYmCisgICAgICAgICAgIUhhc1N1ZmZpeFN0cmluZyhvdXRwdXRfbG9jYXRpb24sICIuc3JjamFyIikpIHsKKyAgICAgICAgQWRkVHJhaWxpbmdTbGFzaCgmb3V0cHV0X2xvY2F0aW9uKTsKKyAgICAgIH0KKworICAgICAgYXV0byYgZ2VuZXJhdG9yID0gb3V0cHV0X2RpcmVjdG9yaWVzW291dHB1dF9sb2NhdGlvbl07CisKKyAgICAgIGlmICghZ2VuZXJhdG9yKSB7CisgICAgICAgIC8vIEZpcnN0IHRpbWUgd2UndmUgc2VlbiB0aGlzIG91dHB1dCBsb2NhdGlvbi4KKyAgICAgICAgZ2VuZXJhdG9yLnJlc2V0KG5ldyBHZW5lcmF0b3JDb250ZXh0SW1wbChwYXJzZWRfZmlsZXMpKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFHZW5lcmF0ZU91dHB1dChwYXJzZWRfZmlsZXMsIG91dHB1dF9kaXJlY3RpdmVzX1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmdldCgpKSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBXcml0ZSBhbGwgb3V0cHV0IHRvIGRpc2suCisgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG91dHB1dF9kaXJlY3RvcmllcykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NhdGlvbiA9IHBhaXIuZmlyc3Q7CisgICAgR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeSA9IHBhaXIuc2Vjb25kLmdldCgpOworICAgIGlmIChIYXNTdWZmaXhTdHJpbmcobG9jYXRpb24sICIvIikpIHsKKyAgICAgIGlmICghZGlyZWN0b3J5LT5Xcml0ZUFsbFRvRGlzayhsb2NhdGlvbikpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChIYXNTdWZmaXhTdHJpbmcobG9jYXRpb24sICIuamFyIikpIHsKKyAgICAgICAgZGlyZWN0b3J5LT5BZGRKYXJNYW5pZmVzdCgpOworICAgICAgfQorCisgICAgICBpZiAoIWRpcmVjdG9yeS0+V3JpdGVBbGxUb1ppcChsb2NhdGlvbikpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKCFkZXBlbmRlbmN5X291dF9uYW1lXy5lbXB0eSgpKSB7CisgICAgR09PR0xFX0RDSEVDSyhkaXNrX3NvdXJjZV90cmVlLmdldCgpKTsKKyAgICBpZiAoIUdlbmVyYXRlRGVwZW5kZW5jeU1hbmlmZXN0RmlsZShwYXJzZWRfZmlsZXMsIG91dHB1dF9kaXJlY3RvcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNrX3NvdXJjZV90cmVlLmdldCgpKSkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgaWYgKCFkZXNjcmlwdG9yX3NldF9vdXRfbmFtZV8uZW1wdHkoKSkgeworICAgIGlmICghV3JpdGVEZXNjcmlwdG9yU2V0KHBhcnNlZF9maWxlcykpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIGlmIChtb2RlXyA9PSBNT0RFX0VOQ09ERSB8fCBtb2RlXyA9PSBNT0RFX0RFQ09ERSkgeworICAgIGlmIChjb2RlY190eXBlXy5lbXB0eSgpKSB7CisgICAgICAvLyBIQUNLOiAgRGVmaW5lIGFuIEVtcHR5TWVzc2FnZSB0eXBlIHRvIHVzZSBmb3IgZGVjb2RpbmcuCisgICAgICBEZXNjcmlwdG9yUG9vbCBwb29sOworICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgICAgZmlsZS5zZXRfbmFtZSgiZW1wdHlfbWVzc2FnZS5wcm90byIpOworICAgICAgZmlsZS5hZGRfbWVzc2FnZV90eXBlKCktPnNldF9uYW1lKCJFbXB0eU1lc3NhZ2UiKTsKKyAgICAgIEdPT0dMRV9DSEVDSyhwb29sLkJ1aWxkRmlsZShmaWxlKSAhPSBudWxscHRyKTsKKyAgICAgIGNvZGVjX3R5cGVfID0gIkVtcHR5TWVzc2FnZSI7CisgICAgICBpZiAoIUVuY29kZU9yRGVjb2RlKCZwb29sKSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFFbmNvZGVPckRlY29kZShkZXNjcmlwdG9yX3Bvb2wuZ2V0KCkpKSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChlcnJvcl9jb2xsZWN0b3ItPkZvdW5kRXJyb3JzKCkgfHwKKyAgICAgIChmYXRhbF93YXJuaW5nc18gJiYgZXJyb3JfY29sbGVjdG9yLT5Gb3VuZFdhcm5pbmdzKCkpKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAobW9kZV8gPT0gTU9ERV9QUklOVCkgeworICAgIHN3aXRjaCAocHJpbnRfbW9kZV8pIHsKKyAgICAgIGNhc2UgUFJJTlRfRlJFRV9GSUVMRFM6CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VkX2ZpbGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZkID0gcGFyc2VkX2ZpbGVzW2ldOworICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmQtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2opIHsKKyAgICAgICAgICAgIFByaW50RnJlZUZpZWxkTnVtYmVycyhmZC0+bWVzc2FnZV90eXBlKGopKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBSSU5UX05PTkU6CisgICAgICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJJZiB0aGUgY29kZSByZWFjaGVzIGhlcmUsIGl0IHVzdWFsbHkgbWVhbnMgYSBidWcgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICJmbGFnIHBhcnNpbmcgaW4gdGhlIENvbW1hbmRMaW5lSW50ZXJmYWNlLiI7CisgICAgICAgIHJldHVybiAxOworCisgICAgICAgIC8vIERvIG5vdCBhZGQgYSBkZWZhdWx0IGNhc2UuCisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkluaXRpYWxpemVEaXNrU291cmNlVHJlZSgKKyAgICBEaXNrU291cmNlVHJlZSogc291cmNlX3RyZWUsIERlc2NyaXB0b3JEYXRhYmFzZSogZmFsbGJhY2tfZGF0YWJhc2UpIHsKKyAgQWRkRGVmYXVsdFByb3RvUGF0aHMoJnByb3RvX3BhdGhfKTsKKworICAvLyBTZXQgdXAgdGhlIHNvdXJjZSB0cmVlLgorICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvX3BhdGhfLnNpemUoKTsgaSsrKSB7CisgICAgc291cmNlX3RyZWUtPk1hcFBhdGgocHJvdG9fcGF0aF9baV0uZmlyc3QsIHByb3RvX3BhdGhfW2ldLnNlY29uZCk7CisgIH0KKworICAvLyBNYXAgaW5wdXQgZmlsZXMgdG8gdmlydHVhbCBwYXRocyBpZiBwb3NzaWJsZS4KKyAgaWYgKCFNYWtlSW5wdXRzQmVQcm90b1BhdGhSZWxhdGl2ZShzb3VyY2VfdHJlZSwgZmFsbGJhY2tfZGF0YWJhc2UpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK25hbWVzcGFjZSB7CitzdGQ6OnVuaXF1ZV9wdHI8U2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlPgorUG9wdWxhdGVTaW5nbGVTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0b3Jfc2V0X25hbWUpIHsKKyAgaW50IGZkOworICBkbyB7CisgICAgZmQgPSBvcGVuKGRlc2NyaXB0b3Jfc2V0X25hbWUuY19zdHIoKSwgT19SRE9OTFkgfCBPX0JJTkFSWSk7CisgIH0gd2hpbGUgKGZkIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisgIGlmIChmZCA8IDApIHsKKyAgICBzdGQ6OmNlcnIgPDwgZGVzY3JpcHRvcl9zZXRfbmFtZSA8PCAiOiAiIDw8IHN0cmVycm9yKEVOT0VOVCkgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgRmlsZURlc2NyaXB0b3JTZXQgZmlsZV9kZXNjcmlwdG9yX3NldDsKKyAgYm9vbCBwYXJzZWQgPSBmaWxlX2Rlc2NyaXB0b3Jfc2V0LlBhcnNlRnJvbUZpbGVEZXNjcmlwdG9yKGZkKTsKKyAgaWYgKGNsb3NlKGZkKSAhPSAwKSB7CisgICAgc3RkOjpjZXJyIDw8IGRlc2NyaXB0b3Jfc2V0X25hbWUgPDwgIjogY2xvc2U6ICIgPDwgc3RyZXJyb3IoZXJybm8pCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGlmICghcGFyc2VkKSB7CisgICAgc3RkOjpjZXJyIDw8IGRlc2NyaXB0b3Jfc2V0X25hbWUgPDwgIjogVW5hYmxlIHRvIHBhcnNlLiIgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZT4gZGF0YWJhc2V7CisgICAgICBuZXcgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlKCl9OworCisgIGZvciAoaW50IGogPSAwOyBqIDwgZmlsZV9kZXNjcmlwdG9yX3NldC5maWxlX3NpemUoKTsgaisrKSB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBwcmV2aW91c2x5X2FkZGVkX2ZpbGVfZGVzY3JpcHRvcl9wcm90bzsKKyAgICBpZiAoZGF0YWJhc2UtPkZpbmRGaWxlQnlOYW1lKGZpbGVfZGVzY3JpcHRvcl9zZXQuZmlsZShqKS5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlvdXNseV9hZGRlZF9maWxlX2Rlc2NyaXB0b3JfcHJvdG8pKSB7CisgICAgICAvLyBhbHJlYWR5IHByZXNlbnQgLSBza2lwCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFkYXRhYmFzZS0+QWRkKGZpbGVfZGVzY3JpcHRvcl9zZXQuZmlsZShqKSkpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgfQorICByZXR1cm4gZGF0YWJhc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisKK2Jvb2wgQ29tbWFuZExpbmVJbnRlcmZhY2U6OlZlcmlmeUlucHV0RmlsZXNJbkRlc2NyaXB0b3JzKAorICAgIERlc2NyaXB0b3JEYXRhYmFzZSogZGF0YWJhc2UpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBpbnB1dF9maWxlIDogaW5wdXRfZmlsZXNfKSB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX2Rlc2NyaXB0b3I7CisgICAgaWYgKCFkYXRhYmFzZS0+RmluZEZpbGVCeU5hbWUoaW5wdXRfZmlsZSwgJmZpbGVfZGVzY3JpcHRvcikpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiQ291bGQgbm90IGZpbmQgZmlsZSBpbiBkZXNjcmlwdG9yIGRhdGFiYXNlOiAiIDw8IGlucHV0X2ZpbGUKKyAgICAgICAgICAgICAgICA8PCAiOiAiIDw8IHN0cmVycm9yKEVOT0VOVCkgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEVuZm9yY2UgLS1kaXNhbGxvd19zZXJ2aWNlcy4KKyAgICBpZiAoZGlzYWxsb3dfc2VydmljZXNfICYmIGZpbGVfZGVzY3JpcHRvci5zZXJ2aWNlX3NpemUoKSA+IDApIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCBmaWxlX2Rlc2NyaXB0b3IubmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIjogVGhpcyBmaWxlIGNvbnRhaW5zIHNlcnZpY2VzLCBidXQgIgorICAgICAgICAgICAgICAgICAgICItLWRpc2FsbG93X3NlcnZpY2VzIHdhcyB1c2VkLiIKKyAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29tbWFuZExpbmVJbnRlcmZhY2U6OlBhcnNlSW5wdXRGaWxlcygKKyAgICBEZXNjcmlwdG9yUG9vbCogZGVzY3JpcHRvcl9wb29sLCBEaXNrU291cmNlVHJlZSogc291cmNlX3RyZWUsCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiogcGFyc2VkX2ZpbGVzKSB7CisKKyAgaWYgKCFwcm90b19wYXRoXy5lbXB0eSgpKSB7CisgICAgLy8gVHJhY2sgdW51c2VkIGltcG9ydHMgaW4gYWxsIHNvdXJjZSBmaWxlcyB0aGF0IHdlcmUgbG9hZGVkIGZyb20gdGhlCisgICAgLy8gZmlsZXN5c3RlbS4gV2UgZG8gbm90IHRyYWNrIHVudXNlZCBpbXBvcnRzIGZvciBmaWxlcyBsb2FkZWQgZnJvbQorICAgIC8vIGRlc2NyaXB0b3Igc2V0cyBhcyB0aGV5IG1heSBiZSBwcm9ncmFtbWF0aWNhbGx5IGdlbmVyYXRlZCBpbiB3aGljaCBjYXNlCisgICAgLy8gZXhlcnRpbmcgdGhpcyBsZXZlbCBvZiByaWdvciBpcyBsZXNzIGRlc2lyYWJsZS4gV2UncmUgYWxzbyBtYWtpbmcgdGhlCisgICAgLy8gYXNzdW1wdGlvbiB0aGF0IHRoZSBpbml0aWFsIHBhcnNlIG9mIHRoZSBwcm90byBmcm9tIHRoZSBmaWxlc3lzdGVtCisgICAgLy8gd2FzIHJpZ29yb3VzIGluIGNoZWNraW5nIHVudXNlZCBpbXBvcnRzIGFuZCB0aGF0IHRoZSBkZXNjcmlwdG9yIHNldAorICAgIC8vIGJlaW5nIHBhcnNlZCB3YXMgcHJvZHVjZWQgdGhlbiBhbmQgdGhhdCBpdCB3YXMgc3Vic2VxdWVudCBtdXRhdGlvbnMKKyAgICAvLyBvZiB0aGF0IGRlc2NyaXB0b3Igc2V0IHRoYXQgbGVmdCB1bnVzZWQgaW1wb3J0cy4KKyAgICAvLworICAgIC8vIE5vdGUgdGhhdCByZWx5aW5nIG9uIHByb3RvX3BhdGggZXhjbHVzaXZlbHkgaXMgbGltaXRlZCBpbiB0aGF0IHdlIG1heQorICAgIC8vIGJlIGxvYWRpbmcgZGVzY3JpcHRvcnMgZnJvbSBib3RoIHRoZSBmaWxlc3lzdGVtIGFuZCBkZXNjcmlwdG9yIHNldHMKKyAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGludm9jYXRpb24uIEF0IGxlYXN0IGZvciBpbnZvY2F0aW9ucyB0aGF0IGFyZQorICAgIC8vIGV4Y2x1c2l2ZWx5IHJlYWRpbmcgZnJvbSBkZXNjcmlwdG9yIHNldHMsIHdlIGNhbiBlbGltaW5hdGUgdGhpcyBmYWlsdXJlCisgICAgLy8gY29uZGl0aW9uLgorICAgIGZvciAoY29uc3QgYXV0byYgaW5wdXRfZmlsZSA6IGlucHV0X2ZpbGVzXykgeworICAgICAgZGVzY3JpcHRvcl9wb29sLT5BZGRVbnVzZWRJbXBvcnRUcmFja0ZpbGUoaW5wdXRfZmlsZSk7CisgICAgfQorICB9CisKKyAgYm9vbCByZXN1bHQgPSB0cnVlOworICAvLyBQYXJzZSBlYWNoIGZpbGUuCisgIGZvciAoY29uc3QgYXV0byYgaW5wdXRfZmlsZSA6IGlucHV0X2ZpbGVzXykgeworICAgIC8vIEltcG9ydCB0aGUgZmlsZS4KKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogcGFyc2VkX2ZpbGUgPQorICAgICAgICBkZXNjcmlwdG9yX3Bvb2wtPkZpbmRGaWxlQnlOYW1lKGlucHV0X2ZpbGUpOworICAgIGlmIChwYXJzZWRfZmlsZSA9PSBudWxscHRyKSB7CisgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwYXJzZWRfZmlsZXMtPnB1c2hfYmFjayhwYXJzZWRfZmlsZSk7CisKKyAgICAvLyBFbmZvcmNlIC0tZGlzYWxsb3dfc2VydmljZXMuCisgICAgaWYgKGRpc2FsbG93X3NlcnZpY2VzXyAmJiBwYXJzZWRfZmlsZS0+c2VydmljZV9jb3VudCgpID4gMCkgeworICAgICAgc3RkOjpjZXJyIDw8IHBhcnNlZF9maWxlLT5uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiOiBUaGlzIGZpbGUgY29udGFpbnMgc2VydmljZXMsIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgIi0tZGlzYWxsb3dfc2VydmljZXMgd2FzIHVzZWQuIgorICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICAvLyBFbmZvcmNlIC0tZGlyZWN0X2RlcGVuZGVuY2llcworICAgIGlmIChkaXJlY3RfZGVwZW5kZW5jaWVzX2V4cGxpY2l0bHlfc2V0XykgeworICAgICAgYm9vbCBpbmRpcmVjdF9pbXBvcnRzID0gZmFsc2U7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlZF9maWxlLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgICAgICBpZiAoZGlyZWN0X2RlcGVuZGVuY2llc18uZmluZChwYXJzZWRfZmlsZS0+ZGVwZW5kZW5jeShpKS0+bmFtZSgpKSA9PQorICAgICAgICAgICAgZGlyZWN0X2RlcGVuZGVuY2llc18uZW5kKCkpIHsKKyAgICAgICAgICBpbmRpcmVjdF9pbXBvcnRzID0gdHJ1ZTsKKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgcGFyc2VkX2ZpbGUtPm5hbWUoKSA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgIDw8IFN0cmluZ1JlcGxhY2UoZGlyZWN0X2RlcGVuZGVuY2llc192aW9sYXRpb25fbXNnXywgIiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRfZmlsZS0+ZGVwZW5kZW5jeShpKS0+bmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogcmVwbGFjZV9hbGwgKi8pCisgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGluZGlyZWN0X2ltcG9ydHMpIHsKKyAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBkZXNjcmlwdG9yX3Bvb2wtPkNsZWFyVW51c2VkSW1wb3J0VHJhY2tGaWxlcygpOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpDbGVhcigpIHsKKyAgLy8gQ2xlYXIgYWxsIG1lbWJlcnMgdGhhdCBhcmUgc2V0IGJ5IFJ1bigpLiAgTm90ZSB0aGF0IHdlIG11c3Qgbm90IGNsZWFyCisgIC8vIG1lbWJlcnMgd2hpY2ggYXJlIHNldCBieSBvdGhlciBtZXRob2RzIGJlZm9yZSBSdW4oKSBpcyBjYWxsZWQuCisgIGV4ZWN1dGFibGVfbmFtZV8uY2xlYXIoKTsKKyAgcHJvdG9fcGF0aF8uY2xlYXIoKTsKKyAgaW5wdXRfZmlsZXNfLmNsZWFyKCk7CisgIGRpcmVjdF9kZXBlbmRlbmNpZXNfLmNsZWFyKCk7CisgIGRpcmVjdF9kZXBlbmRlbmNpZXNfdmlvbGF0aW9uX21zZ18gPSBrRGVmYXVsdERpcmVjdERlcGVuZGVuY2llc1Zpb2xhdGlvbk1zZzsKKyAgb3V0cHV0X2RpcmVjdGl2ZXNfLmNsZWFyKCk7CisgIGNvZGVjX3R5cGVfLmNsZWFyKCk7CisgIGRlc2NyaXB0b3Jfc2V0X2luX25hbWVzXy5jbGVhcigpOworICBkZXNjcmlwdG9yX3NldF9vdXRfbmFtZV8uY2xlYXIoKTsKKyAgZGVwZW5kZW5jeV9vdXRfbmFtZV8uY2xlYXIoKTsKKworCisgIG1vZGVfID0gTU9ERV9DT01QSUxFOworICBwcmludF9tb2RlXyA9IFBSSU5UX05PTkU7CisgIGltcG9ydHNfaW5fZGVzY3JpcHRvcl9zZXRfID0gZmFsc2U7CisgIHNvdXJjZV9pbmZvX2luX2Rlc2NyaXB0b3Jfc2V0XyA9IGZhbHNlOworICBkaXNhbGxvd19zZXJ2aWNlc18gPSBmYWxzZTsKKyAgZGlyZWN0X2RlcGVuZGVuY2llc19leHBsaWNpdGx5X3NldF8gPSBmYWxzZTsKKyAgZGV0ZXJtaW5pc3RpY19vdXRwdXRfID0gZmFsc2U7Cit9CisKK2Jvb2wgQ29tbWFuZExpbmVJbnRlcmZhY2U6Ok1ha2VQcm90b1Byb3RvUGF0aFJlbGF0aXZlKAorICAgIERpc2tTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSwgc3RkOjpzdHJpbmcqIHByb3RvLAorICAgIERlc2NyaXB0b3JEYXRhYmFzZSogZmFsbGJhY2tfZGF0YWJhc2UpIHsKKyAgLy8gSWYgaXQncyBpbiB0aGUgZmFsbGJhY2sgZGIsIGRvbid0IHJlcG9ydCBub24tZXhpc3RlbnQgZmlsZSBlcnJvcnMuCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmFsbGJhY2tfZmlsZTsKKyAgYm9vbCBpbl9mYWxsYmFja19kYXRhYmFzZSA9CisgICAgICBmYWxsYmFja19kYXRhYmFzZSAhPSBudWxscHRyICYmCisgICAgICBmYWxsYmFja19kYXRhYmFzZS0+RmluZEZpbGVCeU5hbWUoKnByb3RvLCAmZmFsbGJhY2tfZmlsZSk7CisKKyAgLy8gSWYgdGhlIGlucHV0IGZpbGUgcGF0aCBpcyBub3QgYSBwaHlzaWNhbCBmaWxlIHBhdGgsIGl0IG11c3QgYmUgYSB2aXJ0dWFsCisgIC8vIHBhdGguCisgIGlmIChhY2Nlc3MocHJvdG8tPmNfc3RyKCksIEZfT0spIDwgMCkgeworICAgIHN0ZDo6c3RyaW5nIGRpc2tfZmlsZTsKKyAgICBpZiAoc291cmNlX3RyZWUtPlZpcnR1YWxGaWxlVG9EaXNrRmlsZSgqcHJvdG8sICZkaXNrX2ZpbGUpIHx8CisgICAgICAgIGluX2ZhbGxiYWNrX2RhdGFiYXNlKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgc3RkOjpjZXJyIDw8ICJDb3VsZCBub3QgbWFrZSBwcm90byBwYXRoIHJlbGF0aXZlOiAiIDw8ICpwcm90byA8PCAiOiAiCisgICAgICAgICAgICAgICAgPDwgc3RyZXJyb3IoRU5PRU5UKSA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgc3RkOjpzdHJpbmcgdmlydHVhbF9maWxlLCBzaGFkb3dpbmdfZGlza19maWxlOworICBzd2l0Y2ggKHNvdXJjZV90cmVlLT5EaXNrRmlsZVRvVmlydHVhbEZpbGUoKnByb3RvLCAmdmlydHVhbF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKSB7CisgICAgY2FzZSBEaXNrU291cmNlVHJlZTo6U1VDQ0VTUzoKKyAgICAgICpwcm90byA9IHZpcnR1YWxfZmlsZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRGlza1NvdXJjZVRyZWU6OlNIQURPV0VEOgorICAgICAgc3RkOjpjZXJyIDw8ICpwcm90byA8PCAiOiBJbnB1dCBpcyBzaGFkb3dlZCBpbiB0aGUgLS1wcm90b19wYXRoIGJ5IFwiIgorICAgICAgICAgICAgICAgIDw8IHNoYWRvd2luZ19kaXNrX2ZpbGUKKyAgICAgICAgICAgICAgICA8PCAiXCIuICBFaXRoZXIgdXNlIHRoZSBsYXR0ZXIgZmlsZSBhcyB5b3VyIGlucHV0IG9yIHJlb3JkZXIgIgorICAgICAgICAgICAgICAgICAgICJ0aGUgLS1wcm90b19wYXRoIHNvIHRoYXQgdGhlIGZvcm1lciBmaWxlJ3MgbG9jYXRpb24gIgorICAgICAgICAgICAgICAgICAgICJjb21lcyBmaXJzdC4iCisgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgRGlza1NvdXJjZVRyZWU6OkNBTk5PVF9PUEVOOiB7CisgICAgICBpZiAoaW5fZmFsbGJhY2tfZGF0YWJhc2UpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9zdHIgPSBzb3VyY2VfdHJlZS0+R2V0TGFzdEVycm9yTWVzc2FnZSgpLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN0cmVycm9yKGVycm5vKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc291cmNlX3RyZWUtPkdldExhc3RFcnJvck1lc3NhZ2UoKTsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiQ291bGQgbm90IG1hcCB0byB2aXJ0dWFsIGZpbGU6ICIgPDwgKnByb3RvIDw8ICI6ICIKKyAgICAgICAgICAgICAgICA8PCBlcnJvcl9zdHIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjYXNlIERpc2tTb3VyY2VUcmVlOjpOT19NQVBQSU5HOiB7CisgICAgICAvLyBUcnkgdG8gaW50ZXJwcmV0IHRoZSBwYXRoIGFzIGEgdmlydHVhbCBwYXRoLgorICAgICAgc3RkOjpzdHJpbmcgZGlza19maWxlOworICAgICAgaWYgKHNvdXJjZV90cmVlLT5WaXJ0dWFsRmlsZVRvRGlza0ZpbGUoKnByb3RvLCAmZGlza19maWxlKSB8fAorICAgICAgICAgIGluX2ZhbGxiYWNrX2RhdGFiYXNlKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIGlucHV0IGZpbGUgcGF0aCBjYW4ndCBiZSBtYXBwZWQgdG8gYW55IC0tcHJvdG9fcGF0aCBhbmQgaXQgYWxzbworICAgICAgICAvLyBjYW4ndCBiZSBpbnRlcnByZXRlZCBhcyBhIHZpcnR1YWwgcGF0aC4KKyAgICAgICAgc3RkOjpjZXJyCisgICAgICAgICAgICA8PCAqcHJvdG8KKyAgICAgICAgICAgIDw8ICI6IEZpbGUgZG9lcyBub3QgcmVzaWRlIHdpdGhpbiBhbnkgcGF0aCAiCisgICAgICAgICAgICAgICAic3BlY2lmaWVkIHVzaW5nIC0tcHJvdG9fcGF0aCAob3IgLUkpLiAgWW91IG11c3Qgc3BlY2lmeSBhICIKKyAgICAgICAgICAgICAgICItLXByb3RvX3BhdGggd2hpY2ggZW5jb21wYXNzZXMgdGhpcyBmaWxlLiAgTm90ZSB0aGF0IHRoZSAiCisgICAgICAgICAgICAgICAicHJvdG9fcGF0aCBtdXN0IGJlIGFuIGV4YWN0IHByZWZpeCBvZiB0aGUgLnByb3RvIGZpbGUgIgorICAgICAgICAgICAgICAgIm5hbWVzIC0tIHByb3RvYyBpcyB0b28gZHVtYiB0byBmaWd1cmUgb3V0IHdoZW4gdHdvIHBhdGhzICIKKyAgICAgICAgICAgICAgICIoZS5nLiBhYnNvbHV0ZSBhbmQgcmVsYXRpdmUpIGFyZSBlcXVpdmFsZW50IChpdCdzIGhhcmRlciAiCisgICAgICAgICAgICAgICAidGhhbiB5b3UgdGhpbmspLiIKKyAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6TWFrZUlucHV0c0JlUHJvdG9QYXRoUmVsYXRpdmUoCisgICAgRGlza1NvdXJjZVRyZWUqIHNvdXJjZV90cmVlLCBEZXNjcmlwdG9yRGF0YWJhc2UqIGZhbGxiYWNrX2RhdGFiYXNlKSB7CisgIGZvciAoYXV0byYgaW5wdXRfZmlsZSA6IGlucHV0X2ZpbGVzXykgeworICAgIGlmICghTWFrZVByb3RvUHJvdG9QYXRoUmVsYXRpdmUoc291cmNlX3RyZWUsICZpbnB1dF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tfZGF0YWJhc2UpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6RXhwYW5kQXJndW1lbnRGaWxlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGFyZ3VtZW50cykgeworICAvLyBUaGUgYXJndW1lbnQgZmlsZSBpcyBzZWFyY2hlZCBpbiB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb25seS4gV2UgZG9uJ3QKKyAgLy8gdXNlIHRoZSBwcm90byBpbXBvcnQgcGF0aCBoZXJlLgorICBzdGQ6Omlmc3RyZWFtIGZpbGVfc3RyZWFtKGZpbGUuY19zdHIoKSk7CisgIGlmICghZmlsZV9zdHJlYW0uaXNfb3BlbigpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50OworICAvLyBXZSBkb24ndCBzdXBwb3J0IGFueSBraW5kIG9mIHNoZWxsIGV4cGFuc2lvbiByaWdodCBub3cuCisgIHdoaWxlIChzdGQ6OmdldGxpbmUoZmlsZV9zdHJlYW0sIGFyZ3VtZW50KSkgeworICAgIGFyZ3VtZW50cy0+cHVzaF9iYWNrKGFyZ3VtZW50KTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworQ29tbWFuZExpbmVJbnRlcmZhY2U6OlBhcnNlQXJndW1lbnRTdGF0dXMgQ29tbWFuZExpbmVJbnRlcmZhY2U6OlBhcnNlQXJndW1lbnRzKAorICAgIGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pIHsKKyAgZXhlY3V0YWJsZV9uYW1lXyA9IGFyZ3ZbMF07CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3VtZW50czsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyArK2kpIHsKKyAgICBpZiAoYXJndltpXVswXSA9PSAnQCcpIHsKKyAgICAgIGlmICghRXhwYW5kQXJndW1lbnRGaWxlKGFyZ3ZbaV0gKyAxLCAmYXJndW1lbnRzKSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkZhaWxlZCB0byBvcGVuIGFyZ3VtZW50IGZpbGU6ICIgPDwgKGFyZ3ZbaV0gKyAxKQorICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBhcmd1bWVudHMucHVzaF9iYWNrKGFyZ3ZbaV0pOworICB9CisKKyAgLy8gaWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwgc2hvdyBoZWxwCisgIGlmIChhcmd1bWVudHMuZW1wdHkoKSkgeworICAgIFByaW50SGVscFRleHQoKTsKKyAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfRVhJVDsgIC8vIEV4aXQgd2l0aG91dCBydW5uaW5nIGNvbXBpbGVyLgorICB9CisKKyAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBhcmd1bWVudHMgYW5kIHBhcnNlIHRoZW0uCisgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLnNpemUoKTsgKytpKSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZSwgdmFsdWU7CisKKyAgICBpZiAoUGFyc2VBcmd1bWVudChhcmd1bWVudHNbaV0uY19zdHIoKSwgJm5hbWUsICZ2YWx1ZSkpIHsKKyAgICAgIC8vIFJldHVybmVkIHRydWUgPT4gVXNlIHRoZSBuZXh0IGFyZ3VtZW50IGFzIHRoZSBmbGFnIHZhbHVlLgorICAgICAgaWYgKGkgKyAxID09IGFyZ3VtZW50cy5zaXplKCkgfHwgYXJndW1lbnRzW2kgKyAxXVswXSA9PSAnLScpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJNaXNzaW5nIHZhbHVlIGZvciBmbGFnOiAiIDw8IG5hbWUgPDwgc3RkOjplbmRsOworICAgICAgICBpZiAobmFtZSA9PSAiLS1kZWNvZGUiKSB7CisgICAgICAgICAgc3RkOjpjZXJyIDw8ICJUbyBkZWNvZGUgYW4gdW5rbm93biBtZXNzYWdlLCB1c2UgLS1kZWNvZGVfcmF3LiIKKyAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKytpOworICAgICAgICB2YWx1ZSA9IGFyZ3VtZW50c1tpXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBQYXJzZUFyZ3VtZW50U3RhdHVzIHN0YXR1cyA9IEludGVycHJldEFyZ3VtZW50KG5hbWUsIHZhbHVlKTsKKyAgICBpZiAoc3RhdHVzICE9IFBBUlNFX0FSR1VNRU5UX0RPTkVfQU5EX0NPTlRJTlVFKSByZXR1cm4gc3RhdHVzOworICB9CisKKyAgLy8gTWFrZSBzdXJlIGVhY2ggcGx1Z2luIG9wdGlvbiBoYXMgYSBtYXRjaGluZyBwbHVnaW4gb3V0cHV0LgorICBib29sIGZvdW5kVW5rbm93blBsdWdpbk9wdGlvbiA9IGZhbHNlOworICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGkgPQorICAgICAgICAgICBwbHVnaW5fcGFyYW1ldGVyc18uYmVnaW4oKTsKKyAgICAgICBpICE9IHBsdWdpbl9wYXJhbWV0ZXJzXy5lbmQoKTsgKytpKSB7CisgICAgaWYgKHBsdWdpbnNfLmZpbmQoaS0+Zmlyc3QpICE9IHBsdWdpbnNfLmVuZCgpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgYm9vbCBmb3VuZEltcGxpY2l0UGx1Z2luID0gZmFsc2U7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxPdXRwdXREaXJlY3RpdmU+Ojpjb25zdF9pdGVyYXRvciBqID0KKyAgICAgICAgICAgICBvdXRwdXRfZGlyZWN0aXZlc18uYmVnaW4oKTsKKyAgICAgICAgIGogIT0gb3V0cHV0X2RpcmVjdGl2ZXNfLmVuZCgpOyArK2opIHsKKyAgICAgIGlmIChqLT5nZW5lcmF0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBzdGQ6OnN0cmluZyBwbHVnaW5fbmFtZSA9IFBsdWdpbk5hbWUocGx1Z2luX3ByZWZpeF8sIGotPm5hbWUpOworICAgICAgICBpZiAocGx1Z2luX25hbWUgPT0gaS0+Zmlyc3QpIHsKKyAgICAgICAgICBmb3VuZEltcGxpY2l0UGx1Z2luID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZvdW5kSW1wbGljaXRQbHVnaW4pIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiVW5rbm93biBmbGFnOiAiCisgICAgICAgICAgICAgICAgLy8gc3RyaXAgcHJlZml4ICsgImdlbi0iIGFuZCBhZGQgYmFjayAiX29wdCIKKyAgICAgICAgICAgICAgICA8PCAiLS0iICsgaS0+Zmlyc3Quc3Vic3RyKHBsdWdpbl9wcmVmaXhfLnNpemUoKSArIDQpICsgIl9vcHQiCisgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgZm91bmRVbmtub3duUGx1Z2luT3B0aW9uID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgaWYgKGZvdW5kVW5rbm93blBsdWdpbk9wdGlvbikgeworICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICB9CisKKyAgLy8gVGhlIC0tcHJvdG9fcGF0aCAmIC0tZGVzY3JpcHRvcl9zZXRfaW4gZmxhZ3MgYm90aCBzcGVjaWZ5IHBsYWNlcyB0byBsb29rCisgIC8vIGZvciBwcm90byBmaWxlcy4gSWYgbmVpdGhlciB3ZXJlIGdpdmVuLCB1c2UgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgIGlmIChwcm90b19wYXRoXy5lbXB0eSgpICYmIGRlc2NyaXB0b3Jfc2V0X2luX25hbWVzXy5lbXB0eSgpKSB7CisgICAgLy8gRG9uJ3QgdXNlIG1ha2VfcGFpciBhcyB0aGUgb2xkL2RlZmF1bHQgc3RhbmRhcmQgbGlicmFyeSBvbiBTb2xhcmlzCisgICAgLy8gZG9lc24ndCBzdXBwb3J0IGl0IHdpdGhvdXQgZXhwbGljaXQgdGVtcGxhdGUgcGFyYW1ldGVycywgd2hpY2ggYXJlCisgICAgLy8gaW5jb21wYXRpYmxlIHdpdGggQysrMHgncyBtYWtlX3BhaXIuCisgICAgcHJvdG9fcGF0aF8ucHVzaF9iYWNrKHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KCIiLCAiLiIpKTsKKyAgfQorCisgIC8vIENoZWNrIGVycm9yIGNhc2VzIHRoYXQgc3BhbiBtdWx0aXBsZSBmbGFnIHZhbHVlcy4KKyAgYm9vbCBtaXNzaW5nX3Byb3RvX2RlZmluaXRpb25zID0gZmFsc2U7CisgIHN3aXRjaCAobW9kZV8pIHsKKyAgICBjYXNlIE1PREVfQ09NUElMRToKKyAgICAgIG1pc3NpbmdfcHJvdG9fZGVmaW5pdGlvbnMgPSBpbnB1dF9maWxlc18uZW1wdHkoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9ERUNPREU6CisgICAgICAvLyBIYW5kbGUgLS1kZWNvZGVfcmF3IHNlcGFyYXRlbHksIHNpbmNlIGl0IHJlcXVpcmVzIHRoYXQgbm8gcHJvdG8KKyAgICAgIC8vIGRlZmluaXRpb25zIGFyZSBzcGVjaWZpZWQuCisgICAgICBpZiAoY29kZWNfdHlwZV8uZW1wdHkoKSkgeworICAgICAgICBpZiAoIWlucHV0X2ZpbGVzXy5lbXB0eSgpIHx8ICFkZXNjcmlwdG9yX3NldF9pbl9uYW1lc18uZW1wdHkoKSkgeworICAgICAgICAgIHN0ZDo6Y2VycgorICAgICAgICAgICAgICA8PCAiV2hlbiB1c2luZyAtLWRlY29kZV9yYXcsIG5vIGlucHV0IGZpbGVzIHNob3VsZCBiZSBnaXZlbi4iCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICAgICAgfQorICAgICAgICBtaXNzaW5nX3Byb3RvX2RlZmluaXRpb25zID0gZmFsc2U7CisgICAgICAgIGJyZWFrOyAgLy8gb25seSBmb3IgLS1kZWNvZGVfcmF3CisgICAgICB9CisgICAgICAvLyAtLWRlY29kZSAobm90IHJhdykgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgdGhlIHJlc3Qgb2YgdGhlIG1vZGVzLgorICAgICAgUFJPVE9CVUZfRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisgICAgY2FzZSBNT0RFX0VOQ09ERToKKyAgICBjYXNlIE1PREVfUFJJTlQ6CisgICAgICBtaXNzaW5nX3Byb3RvX2RlZmluaXRpb25zID0KKyAgICAgICAgICBpbnB1dF9maWxlc18uZW1wdHkoKSAmJiBkZXNjcmlwdG9yX3NldF9pbl9uYW1lc18uZW1wdHkoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5leHBlY3RlZCBtb2RlOiAiIDw8IG1vZGVfOworICB9CisgIGlmIChtaXNzaW5nX3Byb3RvX2RlZmluaXRpb25zKSB7CisgICAgc3RkOjpjZXJyIDw8ICJNaXNzaW5nIGlucHV0IGZpbGUuIiA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgIH0KKyAgaWYgKG1vZGVfID09IE1PREVfQ09NUElMRSAmJiBvdXRwdXRfZGlyZWN0aXZlc18uZW1wdHkoKSAmJgorICAgICAgZGVzY3JpcHRvcl9zZXRfb3V0X25hbWVfLmVtcHR5KCkpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIk1pc3Npbmcgb3V0cHV0IGRpcmVjdGl2ZXMuIiA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgIH0KKyAgaWYgKG1vZGVfICE9IE1PREVfQ09NUElMRSAmJiAhZGVwZW5kZW5jeV9vdXRfbmFtZV8uZW1wdHkoKSkgeworICAgIHN0ZDo6Y2VyciA8PCAiQ2FuIG9ubHkgdXNlIC0tZGVwZW5kZW5jeV9vdXQ9RklMRSB3aGVuIGdlbmVyYXRpbmcgY29kZS4iCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgfQorICBpZiAobW9kZV8gIT0gTU9ERV9FTkNPREUgJiYgZGV0ZXJtaW5pc3RpY19vdXRwdXRfKSB7CisgICAgc3RkOjpjZXJyIDw8ICJDYW4gb25seSB1c2UgLS1kZXRlcm1pbmlzdGljX291dHB1dCB3aXRoIC0tZW5jb2RlLiIKKyAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICB9CisgIGlmICghZGVwZW5kZW5jeV9vdXRfbmFtZV8uZW1wdHkoKSAmJiBpbnB1dF9maWxlc18uc2l6ZSgpID4gMSkgeworICAgIHN0ZDo6Y2VycgorICAgICAgICA8PCAiQ2FuIG9ubHkgcHJvY2VzcyBvbmUgaW5wdXQgZmlsZSB3aGVuIHVzaW5nIC0tZGVwZW5kZW5jeV9vdXQ9RklMRS4iCisgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgfQorICBpZiAoaW1wb3J0c19pbl9kZXNjcmlwdG9yX3NldF8gJiYgZGVzY3JpcHRvcl9zZXRfb3V0X25hbWVfLmVtcHR5KCkpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIi0taW5jbHVkZV9pbXBvcnRzIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBjb21iaW5lZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgIi0tZGVzY3JpcHRvcl9zZXRfb3V0LiIKKyAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICB9CisgIGlmIChzb3VyY2VfaW5mb19pbl9kZXNjcmlwdG9yX3NldF8gJiYgZGVzY3JpcHRvcl9zZXRfb3V0X25hbWVfLmVtcHR5KCkpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIi0taW5jbHVkZV9zb3VyY2VfaW5mbyBvbmx5IG1ha2VzIHNlbnNlIHdoZW4gY29tYmluZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICItLWRlc2NyaXB0b3Jfc2V0X291dC4iCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCisgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9ET05FX0FORF9DT05USU5VRTsKK30KKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6UGFyc2VBcmd1bWVudChjb25zdCBjaGFyKiBhcmcsIHN0ZDo6c3RyaW5nKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogdmFsdWUpIHsKKyAgYm9vbCBwYXJzZWRfdmFsdWUgPSBmYWxzZTsKKworICBpZiAoYXJnWzBdICE9ICctJykgeworICAgIC8vIE5vdCBhIGZsYWcuCisgICAgbmFtZS0+Y2xlYXIoKTsKKyAgICBwYXJzZWRfdmFsdWUgPSB0cnVlOworICAgICp2YWx1ZSA9IGFyZzsKKyAgfSBlbHNlIGlmIChhcmdbMV0gPT0gJy0nKSB7CisgICAgLy8gVHdvIGRhc2hlczogIE11bHRpLWNoYXJhY3RlciBuYW1lLCB3aXRoICc9JyBzZXBhcmF0aW5nIG5hbWUgYW5kCisgICAgLy8gICB2YWx1ZS4KKyAgICBjb25zdCBjaGFyKiBlcXVhbHNfcG9zID0gc3RyY2hyKGFyZywgJz0nKTsKKyAgICBpZiAoZXF1YWxzX3BvcyAhPSBudWxscHRyKSB7CisgICAgICAqbmFtZSA9IHN0ZDo6c3RyaW5nKGFyZywgZXF1YWxzX3BvcyAtIGFyZyk7CisgICAgICAqdmFsdWUgPSBlcXVhbHNfcG9zICsgMTsKKyAgICAgIHBhcnNlZF92YWx1ZSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICpuYW1lID0gYXJnOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBPbmUgZGFzaDogIE9uZS1jaGFyYWN0ZXIgbmFtZSwgYWxsIHN1YnNlcXVlbnQgY2hhcmFjdGVycyBhcmUgdGhlCisgICAgLy8gICB2YWx1ZS4KKyAgICBpZiAoYXJnWzFdID09ICdcMCcpIHsKKyAgICAgIC8vIGFyZyBpcyBqdXN0ICItIi4gIFdlIHRyZWF0IHRoaXMgYXMgYW4gaW5wdXQgZmlsZSwgZXhjZXB0IHRoYXQgYXQKKyAgICAgIC8vIHByZXNlbnQgdGhpcyB3aWxsIGp1c3QgbGVhZCB0byBhICJmaWxlIG5vdCBmb3VuZCIgZXJyb3IuCisgICAgICBuYW1lLT5jbGVhcigpOworICAgICAgKnZhbHVlID0gYXJnOworICAgICAgcGFyc2VkX3ZhbHVlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgKm5hbWUgPSBzdGQ6OnN0cmluZyhhcmcsIDIpOworICAgICAgKnZhbHVlID0gYXJnICsgMjsKKyAgICAgIHBhcnNlZF92YWx1ZSA9ICF2YWx1ZS0+ZW1wdHkoKTsKKyAgICB9CisgIH0KKworICAvLyBOZWVkIHRvIHJldHVybiB0cnVlIGlmZiB0aGUgbmV4dCBhcmcgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGlzCisgIC8vIG9uZSwgZmFsc2Ugb3RoZXJ3aXNlLgorCisgIGlmIChwYXJzZWRfdmFsdWUpIHsKKyAgICAvLyBXZSBhbHJlYWR5IHBhcnNlZCBhIHZhbHVlIGZvciB0aGlzIGZsYWcuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCpuYW1lID09ICItaCIgfHwgKm5hbWUgPT0gIi0taGVscCIgfHwgKm5hbWUgPT0gIi0tZGlzYWxsb3dfc2VydmljZXMiIHx8CisgICAgICAqbmFtZSA9PSAiLS1pbmNsdWRlX2ltcG9ydHMiIHx8ICpuYW1lID09ICItLWluY2x1ZGVfc291cmNlX2luZm8iIHx8CisgICAgICAqbmFtZSA9PSAiLS12ZXJzaW9uIiB8fCAqbmFtZSA9PSAiLS1kZWNvZGVfcmF3IiB8fAorICAgICAgKm5hbWUgPT0gIi0tcHJpbnRfZnJlZV9maWVsZF9udW1iZXJzIiB8fAorICAgICAgKm5hbWUgPT0gIi0tZXhwZXJpbWVudGFsX2FsbG93X3Byb3RvM19vcHRpb25hbCIgfHwKKyAgICAgICpuYW1lID09ICItLWRldGVybWluaXN0aWNfb3V0cHV0IiB8fCAqbmFtZSA9PSAiLS1mYXRhbF93YXJuaW5ncyIpIHsKKyAgICAvLyBIQUNLOiAgVGhlc2UgYXJlIHRoZSBvbmx5IGZsYWdzIHRoYXQgZG9uJ3QgdGFrZSBhIHZhbHVlLgorICAgIC8vICAgVGhleSBwcm9iYWJseSBzaG91bGQgbm90IGJlIGhhcmQtY29kZWQgbGlrZSB0aGlzIGJ1dCBmb3Igbm93IGl0J3MKKyAgICAvLyAgIG5vdCB3b3J0aCBkb2luZyBiZXR0ZXIuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gTmV4dCBhcmd1bWVudCBpcyB0aGUgZmxhZyB2YWx1ZS4KKyAgcmV0dXJuIHRydWU7Cit9CisKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpQYXJzZUFyZ3VtZW50U3RhdHVzCitDb21tYW5kTGluZUludGVyZmFjZTo6SW50ZXJwcmV0QXJndW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAvLyBOb3QgYSBmbGFnLiAgSnVzdCBhIGZpbGVuYW1lLgorICAgIGlmICh2YWx1ZS5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIKKyAgICAgICAgICA8PCAiWW91IHNlZW0gdG8gaGF2ZSBwYXNzZWQgYW4gZW1wdHkgc3RyaW5nIGFzIG9uZSBvZiB0aGUgIgorICAgICAgICAgICAgICJhcmd1bWVudHMgdG8gIgorICAgICAgICAgIDw8IGV4ZWN1dGFibGVfbmFtZV8KKyAgICAgICAgICA8PCAiLiAgVGhpcyBpcyBhY3R1YWxseSAiCisgICAgICAgICAgICAgInNvcnQgb2YgaGFyZCB0byBkby4gIENvbmdyYXRzLiAgVW5mb3J0dW5hdGVseSBpdCBpcyBub3QgdmFsaWQgIgorICAgICAgICAgICAgICJpbnB1dCBzbyB0aGUgcHJvZ3JhbSBpcyBnb2luZyB0byBkaWUgbm93LiIKKyAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICB9CisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyAgICAvLyBPbiBXaW5kb3dzLCB0aGUgc2hlbGwgKHR5cGljYWxseSBjbWQuZXhlKSBkb2VzIG5vdCBleHBhbmQgd2lsZGNhcmRzIGluCisgICAgLy8gZmlsZSBuYW1lcyAoZS5nLiBmb29cKi5wcm90byksIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KKyAgICBzd2l0Y2ggKGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6RXhwYW5kV2lsZGNhcmRzKAorICAgICAgICB2YWx1ZSwgW3RoaXNdKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgICAgICAgdGhpcy0+aW5wdXRfZmlsZXNfLnB1c2hfYmFjayhwYXRoKTsKKyAgICAgICAgfSkpIHsKKyAgICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjpFeHBhbmRXaWxkY2FyZHNSZXN1bHQ6OmtTdWNjZXNzOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjpFeHBhbmRXaWxkY2FyZHNSZXN1bHQ6OgorICAgICAgICAgIGtFcnJvck5vTWF0Y2hpbmdGaWxlOgorICAgICAgICAvLyBQYXRoIGRvZXMgbm90IGV4aXN0LCBpcyBub3QgYSBmaWxlLCBvciBpdCdzIGxvbmdlciB0aGFuIE1BWF9QQVRIIGFuZAorICAgICAgICAvLyBsb25nIHBhdGggaGFuZGxpbmcgaXMgZGlzYWJsZWQuCisgICAgICAgIHN0ZDo6Y2VyciA8PCAiSW52YWxpZCBmaWxlIG5hbWUgcGF0dGVybiBvciBtaXNzaW5nIGlucHV0IGZpbGUgXCIiCisgICAgICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAiXCIiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgICBkZWZhdWx0OgorICAgICAgICBzdGQ6OmNlcnIgPDwgIkNhbm5vdCBjb252ZXJ0IHBhdGggXCIiIDw8IHZhbHVlCisgICAgICAgICAgICAgICAgICA8PCAiXCIgdG8gb3IgZnJvbSBXaW5kb3dzIHN0eWxlIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgIH0KKyNlbHNlICAgLy8gbm90IF9XSU4zMgorICAgIC8vIE9uIG90aGVyIHBsYXRmb3JtcyB0aGFuIFdpbmRvd3MgKGUuZy4gTGludXgsIE1hYyBPUykgdGhlIHNoZWxsICh0eXBpY2FsbHkKKyAgICAvLyBCYXNoKSBleHBhbmRzIHdpbGRjYXJkcy4KKyAgICBpbnB1dF9maWxlc18ucHVzaF9iYWNrKHZhbHVlKTsKKyNlbmRpZiAgLy8gX1dJTjMyCisKKyAgfSBlbHNlIGlmIChuYW1lID09ICItSSIgfHwgbmFtZSA9PSAiLS1wcm90b19wYXRoIikgeworICAgIC8vIEphdmEncyAtY2xhc3NwYXRoIChhbmQgc29tZSBvdGhlciBsYW5ndWFnZXMpIGRlbGltaXRzIHBhdGggY29tcG9uZW50cworICAgIC8vIHdpdGggY29sb25zLiAgTGV0J3MgYWNjZXB0IHRoYXQgc3ludGF4IHRvbyBqdXN0IHRvIG1ha2UgdGhpbmdzIG1vcmUKKyAgICAvLyBpbnR1aXRpdmUuCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhcnRzID0gU3BsaXQoCisgICAgICAgIHZhbHVlLCBDb21tYW5kTGluZUludGVyZmFjZTo6a1BhdGhTZXBhcmF0b3IsCisgICAgICAgIHRydWUpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0cy5zaXplKCk7IGkrKykgeworICAgICAgc3RkOjpzdHJpbmcgdmlydHVhbF9wYXRoOworICAgICAgc3RkOjpzdHJpbmcgZGlza19wYXRoOworCisgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGVxdWFsc19wb3MgPSBwYXJ0c1tpXS5maW5kX2ZpcnN0X29mKCc9Jyk7CisgICAgICBpZiAoZXF1YWxzX3BvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICB2aXJ0dWFsX3BhdGggPSAiIjsKKyAgICAgICAgZGlza19wYXRoID0gcGFydHNbaV07CisgICAgICB9IGVsc2UgeworICAgICAgICB2aXJ0dWFsX3BhdGggPSBwYXJ0c1tpXS5zdWJzdHIoMCwgZXF1YWxzX3Bvcyk7CisgICAgICAgIGRpc2tfcGF0aCA9IHBhcnRzW2ldLnN1YnN0cihlcXVhbHNfcG9zICsgMSk7CisgICAgICB9CisKKyAgICAgIGlmIChkaXNrX3BhdGguZW1wdHkoKSkgeworICAgICAgICBzdGQ6OmNlcnIKKyAgICAgICAgICAgIDw8ICItLXByb3RvX3BhdGggcGFzc2VkIGVtcHR5IGRpcmVjdG9yeSBuYW1lLiAgKFVzZSBcIi5cIiBmb3IgIgorICAgICAgICAgICAgICAgImN1cnJlbnQgZGlyZWN0b3J5LikiCisgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgICAgfQorCisgICAgICAvLyBNYWtlIHN1cmUgZGlzayBwYXRoIGV4aXN0cywgd2FybiBvdGhlcndpc2UuCisgICAgICBpZiAoYWNjZXNzKGRpc2tfcGF0aC5jX3N0cigpLCBGX09LKSA8IDApIHsKKyAgICAgICAgLy8gVHJ5IHRoZSBvcmlnaW5hbCBwYXRoOyBpdCBtYXkgaGF2ZSBqdXN0IGhhcHBlbmVkIHRvIGhhdmUgYSAnPScgaW4gaXQuCisgICAgICAgIGlmIChhY2Nlc3MocGFydHNbaV0uY19zdHIoKSwgRl9PSykgPCAwKSB7CisgICAgICAgICAgc3RkOjpjZXJyIDw8IGRpc2tfcGF0aCA8PCAiOiB3YXJuaW5nOiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIgorICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmlydHVhbF9wYXRoID0gIiI7CisgICAgICAgICAgZGlza19wYXRoID0gcGFydHNbaV07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gRG9uJ3QgdXNlIG1ha2VfcGFpciBhcyB0aGUgb2xkL2RlZmF1bHQgc3RhbmRhcmQgbGlicmFyeSBvbiBTb2xhcmlzCisgICAgICAvLyBkb2Vzbid0IHN1cHBvcnQgaXQgd2l0aG91dCBleHBsaWNpdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCB3aGljaCBhcmUKKyAgICAgIC8vIGluY29tcGF0aWJsZSB3aXRoIEMrKzB4J3MgbWFrZV9wYWlyLgorICAgICAgcHJvdG9fcGF0aF8ucHVzaF9iYWNrKAorICAgICAgICAgIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KHZpcnR1YWxfcGF0aCwgZGlza19wYXRoKSk7CisgICAgfQorCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1kaXJlY3RfZGVwZW5kZW5jaWVzIikgeworICAgIGlmIChkaXJlY3RfZGVwZW5kZW5jaWVzX2V4cGxpY2l0bHlfc2V0XykgeworICAgICAgc3RkOjpjZXJyIDw8IG5hbWUKKyAgICAgICAgICAgICAgICA8PCAiIG1heSBvbmx5IGJlIHBhc3NlZCBvbmNlLiBUbyBzcGVjaWZ5IG11bHRpcGxlICIKKyAgICAgICAgICAgICAgICAgICAiZGlyZWN0IGRlcGVuZGVuY2llcywgcGFzcyB0aGVtIGFsbCBhcyBhIHNpbmdsZSAiCisgICAgICAgICAgICAgICAgICAgInBhcmFtZXRlciBzZXBhcmF0ZWQgYnkgJzonLiIKKyAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICB9CisKKyAgICBkaXJlY3RfZGVwZW5kZW5jaWVzX2V4cGxpY2l0bHlfc2V0XyA9IHRydWU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRpcmVjdCA9CisgICAgICAgIFNwbGl0KHZhbHVlLCAiOiIsIHRydWUpOworICAgIEdPT0dMRV9EQ0hFQ0soZGlyZWN0X2RlcGVuZGVuY2llc18uZW1wdHkoKSk7CisgICAgZGlyZWN0X2RlcGVuZGVuY2llc18uaW5zZXJ0KGRpcmVjdC5iZWdpbigpLCBkaXJlY3QuZW5kKCkpOworCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1kaXJlY3RfZGVwZW5kZW5jaWVzX3Zpb2xhdGlvbl9tc2ciKSB7CisgICAgZGlyZWN0X2RlcGVuZGVuY2llc192aW9sYXRpb25fbXNnXyA9IHZhbHVlOworCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1kZXNjcmlwdG9yX3NldF9pbiIpIHsKKyAgICBpZiAoIWRlc2NyaXB0b3Jfc2V0X2luX25hbWVzXy5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgbWF5IG9ubHkgYmUgcGFzc2VkIG9uY2UuIFRvIHNwZWNpZnkgbXVsdGlwbGUgIgorICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yIHNldHMsIHBhc3MgdGhlbSBhbGwgYXMgYSBzaW5nbGUgIgorICAgICAgICAgICAgICAgICAgICJwYXJhbWV0ZXIgc2VwYXJhdGVkIGJ5ICciCisgICAgICAgICAgICAgICAgPDwgQ29tbWFuZExpbmVJbnRlcmZhY2U6OmtQYXRoU2VwYXJhdG9yIDw8ICInLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgfQorICAgIGlmICh2YWx1ZS5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgbmFtZSA8PCAiIHJlcXVpcmVzIGEgbm9uLWVtcHR5IHZhbHVlLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgfQorICAgIGlmICghZGVwZW5kZW5jeV9vdXRfbmFtZV8uZW1wdHkoKSkgeworICAgICAgc3RkOjpjZXJyIDw8IG5hbWUgPDwgIiBjYW5ub3QgYmUgdXNlZCB3aXRoIC0tZGVwZW5kZW5jeV9vdXQuIgorICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgIH0KKworICAgIGRlc2NyaXB0b3Jfc2V0X2luX25hbWVzXyA9IFNwbGl0KAorICAgICAgICB2YWx1ZSwgQ29tbWFuZExpbmVJbnRlcmZhY2U6OmtQYXRoU2VwYXJhdG9yLAorICAgICAgICB0cnVlKTsKKworICB9IGVsc2UgaWYgKG5hbWUgPT0gIi1vIiB8fCBuYW1lID09ICItLWRlc2NyaXB0b3Jfc2V0X291dCIpIHsKKyAgICBpZiAoIWRlc2NyaXB0b3Jfc2V0X291dF9uYW1lXy5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgbmFtZSA8PCAiIG1heSBvbmx5IGJlIHBhc3NlZCBvbmNlLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgfQorICAgIGlmICh2YWx1ZS5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgbmFtZSA8PCAiIHJlcXVpcmVzIGEgbm9uLWVtcHR5IHZhbHVlLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgfQorICAgIGlmIChtb2RlXyAhPSBNT0RFX0NPTVBJTEUpIHsKKyAgICAgIHN0ZDo6Y2VycgorICAgICAgICAgIDw8ICJDYW5ub3QgdXNlIC0tZW5jb2RlIG9yIC0tZGVjb2RlIGFuZCBnZW5lcmF0ZSBkZXNjcmlwdG9ycyBhdCB0aGUgIgorICAgICAgICAgICAgICJzYW1lIHRpbWUuIgorICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgIH0KKyAgICBkZXNjcmlwdG9yX3NldF9vdXRfbmFtZV8gPSB2YWx1ZTsKKworICB9IGVsc2UgaWYgKG5hbWUgPT0gIi0tZGVwZW5kZW5jeV9vdXQiKSB7CisgICAgaWYgKCFkZXBlbmRlbmN5X291dF9uYW1lXy5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgbmFtZSA8PCAiIG1heSBvbmx5IGJlIHBhc3NlZCBvbmNlLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgfQorICAgIGlmICh2YWx1ZS5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgbmFtZSA8PCAiIHJlcXVpcmVzIGEgbm9uLWVtcHR5IHZhbHVlLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgfQorICAgIGlmICghZGVzY3JpcHRvcl9zZXRfaW5fbmFtZXNfLmVtcHR5KCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCBuYW1lIDw8ICIgY2Fubm90IGJlIHVzZWQgd2l0aCAtLWRlc2NyaXB0b3Jfc2V0X2luLiIKKyAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICB9CisgICAgZGVwZW5kZW5jeV9vdXRfbmFtZV8gPSB2YWx1ZTsKKworICB9IGVsc2UgaWYgKG5hbWUgPT0gIi0taW5jbHVkZV9pbXBvcnRzIikgeworICAgIGlmIChpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XykgeworICAgICAgc3RkOjpjZXJyIDw8IG5hbWUgPDwgIiBtYXkgb25seSBiZSBwYXNzZWQgb25jZS4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgIH0KKyAgICBpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XyA9IHRydWU7CisKKyAgfSBlbHNlIGlmIChuYW1lID09ICItLWluY2x1ZGVfc291cmNlX2luZm8iKSB7CisgICAgaWYgKHNvdXJjZV9pbmZvX2luX2Rlc2NyaXB0b3Jfc2V0XykgeworICAgICAgc3RkOjpjZXJyIDw8IG5hbWUgPDwgIiBtYXkgb25seSBiZSBwYXNzZWQgb25jZS4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgIH0KKyAgICBzb3VyY2VfaW5mb19pbl9kZXNjcmlwdG9yX3NldF8gPSB0cnVlOworCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLWgiIHx8IG5hbWUgPT0gIi0taGVscCIpIHsKKyAgICBQcmludEhlbHBUZXh0KCk7CisgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0RPTkVfQU5EX0VYSVQ7ICAvLyBFeGl0IHdpdGhvdXQgcnVubmluZyBjb21waWxlci4KKworICB9IGVsc2UgaWYgKG5hbWUgPT0gIi0tdmVyc2lvbiIpIHsKKyAgICBpZiAoIXZlcnNpb25faW5mb18uZW1wdHkoKSkgeworICAgICAgc3RkOjpjb3V0IDw8IHZlcnNpb25faW5mb18gPDwgc3RkOjplbmRsOworICAgIH0KKyAgICBzdGQ6OmNvdXQgPDwgImxpYnByb3RvYyAiIDw8IGludGVybmFsOjpWZXJzaW9uU3RyaW5nKFBST1RPQlVGX1ZFUlNJT04pCisgICAgICAgICAgICAgIDw8IFBST1RPQlVGX1ZFUlNJT05fU1VGRklYIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfRVhJVDsgIC8vIEV4aXQgd2l0aG91dCBydW5uaW5nIGNvbXBpbGVyLgorCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1kaXNhbGxvd19zZXJ2aWNlcyIpIHsKKyAgICBkaXNhbGxvd19zZXJ2aWNlc18gPSB0cnVlOworCisKKyAgfSBlbHNlIGlmIChuYW1lID09ICItLWV4cGVyaW1lbnRhbF9hbGxvd19wcm90bzNfb3B0aW9uYWwiKSB7CisgICAgLy8gRmxhZyBpcyBubyBsb25nZXIgb2JzZXJ2ZWQsIGJ1dCB3ZSBhbGxvdyBpdCBmb3IgYmFja3dhcmQgY29tcGF0LgorICB9IGVsc2UgaWYgKG5hbWUgPT0gIi0tZW5jb2RlIiB8fCBuYW1lID09ICItLWRlY29kZSIgfHwKKyAgICAgICAgICAgICBuYW1lID09ICItLWRlY29kZV9yYXciKSB7CisgICAgaWYgKG1vZGVfICE9IE1PREVfQ09NUElMRSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJPbmx5IG9uZSBvZiAtLWVuY29kZSBhbmQgLS1kZWNvZGUgY2FuIGJlIHNwZWNpZmllZC4iCisgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgfQorICAgIGlmICghb3V0cHV0X2RpcmVjdGl2ZXNfLmVtcHR5KCkgfHwgIWRlc2NyaXB0b3Jfc2V0X291dF9uYW1lXy5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIkNhbm5vdCB1c2UgIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgPDwgIiBhbmQgZ2VuZXJhdGUgY29kZSBvciBkZXNjcmlwdG9ycyBhdCB0aGUgc2FtZSB0aW1lLiIKKyAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICB9CisKKyAgICBtb2RlXyA9IChuYW1lID09ICItLWVuY29kZSIpID8gTU9ERV9FTkNPREUgOiBNT0RFX0RFQ09ERTsKKworICAgIGlmICh2YWx1ZS5lbXB0eSgpICYmIG5hbWUgIT0gIi0tZGVjb2RlX3JhdyIpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiVHlwZSBuYW1lIGZvciAiIDw8IG5hbWUgPDwgIiBjYW5ub3QgYmUgYmxhbmsuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBpZiAobmFtZSA9PSAiLS1kZWNvZGUiKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiVG8gZGVjb2RlIGFuIHVua25vd24gbWVzc2FnZSwgdXNlIC0tZGVjb2RlX3Jhdy4iCisgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICB9CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICB9IGVsc2UgaWYgKCF2YWx1ZS5lbXB0eSgpICYmIG5hbWUgPT0gIi0tZGVjb2RlX3JhdyIpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiLS1kZWNvZGVfcmF3IGRvZXMgbm90IHRha2UgYSBwYXJhbWV0ZXIuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICB9CisKKyAgICBjb2RlY190eXBlXyA9IHZhbHVlOworCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1kZXRlcm1pbmlzdGljX291dHB1dCIpIHsKKyAgICBkZXRlcm1pbmlzdGljX291dHB1dF8gPSB0cnVlOworCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1lcnJvcl9mb3JtYXQiKSB7CisgICAgaWYgKHZhbHVlID09ICJnY2MiKSB7CisgICAgICBlcnJvcl9mb3JtYXRfID0gRVJST1JfRk9STUFUX0dDQzsKKyAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJtc3ZzIikgeworICAgICAgZXJyb3JfZm9ybWF0XyA9IEVSUk9SX0ZPUk1BVF9NU1ZTOworICAgIH0gZWxzZSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlVua25vd24gZXJyb3IgZm9ybWF0OiAiIDw8IHZhbHVlIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgIH0KKworICB9IGVsc2UgaWYgKG5hbWUgPT0gIi0tZmF0YWxfd2FybmluZ3MiKSB7CisgICAgaWYgKGZhdGFsX3dhcm5pbmdzXykgeworICAgICAgc3RkOjpjZXJyIDw8IG5hbWUgPDwgIiBtYXkgb25seSBiZSBwYXNzZWQgb25jZS4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgIH0KKyAgICBmYXRhbF93YXJuaW5nc18gPSB0cnVlOworICB9IGVsc2UgaWYgKG5hbWUgPT0gIi0tcGx1Z2luIikgeworICAgIGlmIChwbHVnaW5fcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlRoaXMgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBwbHVnaW5zLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcGx1Z2luX25hbWU7CisgICAgc3RkOjpzdHJpbmcgcGF0aDsKKworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZXF1YWxzX3BvcyA9IHZhbHVlLmZpbmRfZmlyc3Rfb2YoJz0nKTsKKyAgICBpZiAoZXF1YWxzX3BvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgLy8gVXNlIHRoZSBiYXNlbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgc2xhc2hfcG9zID0gdmFsdWUuZmluZF9sYXN0X29mKCcvJyk7CisgICAgICBpZiAoc2xhc2hfcG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIHBsdWdpbl9uYW1lID0gdmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwbHVnaW5fbmFtZSA9IHZhbHVlLnN1YnN0cihzbGFzaF9wb3MgKyAxKTsKKyAgICAgIH0KKyAgICAgIHBhdGggPSB2YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcGx1Z2luX25hbWUgPSB2YWx1ZS5zdWJzdHIoMCwgZXF1YWxzX3Bvcyk7CisgICAgICBwYXRoID0gdmFsdWUuc3Vic3RyKGVxdWFsc19wb3MgKyAxKTsKKyAgICB9CisKKyAgICBwbHVnaW5zX1twbHVnaW5fbmFtZV0gPSBwYXRoOworCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1wcmludF9mcmVlX2ZpZWxkX251bWJlcnMiKSB7CisgICAgaWYgKG1vZGVfICE9IE1PREVfQ09NUElMRSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJDYW5ub3QgdXNlICIgPDwgbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgYW5kIHVzZSAtLWVuY29kZSwgLS1kZWNvZGUgb3IgcHJpbnQgIgorICAgICAgICAgICAgICAgIDw8ICJvdGhlciBpbmZvIGF0IHRoZSBzYW1lIHRpbWUuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRfZGlyZWN0aXZlc18uZW1wdHkoKSB8fCAhZGVzY3JpcHRvcl9zZXRfb3V0X25hbWVfLmVtcHR5KCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiQ2Fubm90IHVzZSAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGFuZCBnZW5lcmF0ZSBjb2RlIG9yIGRlc2NyaXB0b3JzIGF0IHRoZSBzYW1lIHRpbWUuIgorICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICAgIH0KKyAgICBtb2RlXyA9IE1PREVfUFJJTlQ7CisgICAgcHJpbnRfbW9kZV8gPSBQUklOVF9GUkVFX0ZJRUxEUzsKKyAgfSBlbHNlIHsKKyAgICAvLyBTb21lIG90aGVyIGZsYWcuICBMb29rIGl0IHVwIGluIHRoZSBnZW5lcmF0b3JzIGxpc3QuCisgICAgY29uc3QgR2VuZXJhdG9ySW5mbyogZ2VuZXJhdG9yX2luZm8gPQorICAgICAgICBGaW5kT3JOdWxsKGdlbmVyYXRvcnNfYnlfZmxhZ19uYW1lXywgbmFtZSk7CisgICAgaWYgKGdlbmVyYXRvcl9pbmZvID09IG51bGxwdHIgJiYKKyAgICAgICAgKHBsdWdpbl9wcmVmaXhfLmVtcHR5KCkgfHwgIUhhc1N1ZmZpeFN0cmluZyhuYW1lLCAiX291dCIpKSkgeworICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIGdlbmVyYXRvciBvcHRpb24gZmxhZy4KKyAgICAgIGdlbmVyYXRvcl9pbmZvID0gRmluZE9yTnVsbChnZW5lcmF0b3JzX2J5X29wdGlvbl9uYW1lXywgbmFtZSk7CisgICAgICBpZiAoZ2VuZXJhdG9yX2luZm8gIT0gbnVsbHB0cikgeworICAgICAgICBzdGQ6OnN0cmluZyogcGFyYW1ldGVycyA9CisgICAgICAgICAgICAmZ2VuZXJhdG9yX3BhcmFtZXRlcnNfW2dlbmVyYXRvcl9pbmZvLT5mbGFnX25hbWVdOworICAgICAgICBpZiAoIXBhcmFtZXRlcnMtPmVtcHR5KCkpIHsKKyAgICAgICAgICBwYXJhbWV0ZXJzLT5hcHBlbmQoIiwiKTsKKyAgICAgICAgfQorICAgICAgICBwYXJhbWV0ZXJzLT5hcHBlbmQodmFsdWUpOworICAgICAgfSBlbHNlIGlmIChIYXNQcmVmaXhTdHJpbmcobmFtZSwgIi0tIikgJiYgSGFzU3VmZml4U3RyaW5nKG5hbWUsICJfb3B0IikpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcqIHBhcmFtZXRlcnMgPQorICAgICAgICAgICAgJnBsdWdpbl9wYXJhbWV0ZXJzX1tQbHVnaW5OYW1lKHBsdWdpbl9wcmVmaXhfLCBuYW1lKV07CisgICAgICAgIGlmICghcGFyYW1ldGVycy0+ZW1wdHkoKSkgeworICAgICAgICAgIHBhcmFtZXRlcnMtPmFwcGVuZCgiLCIpOworICAgICAgICB9CisgICAgICAgIHBhcmFtZXRlcnMtPmFwcGVuZCh2YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIlVua25vd24gZmxhZzogIiA8PCBuYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEl0J3MgYW4gb3V0cHV0IGZsYWcuICBBZGQgaXQgdG8gdGhlIG91dHB1dCBkaXJlY3RpdmVzLgorICAgICAgaWYgKG1vZGVfICE9IE1PREVfQ09NUElMRSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkNhbm5vdCB1c2UgLS1lbmNvZGUsIC0tZGVjb2RlIG9yIHByaW50IC5wcm90byBpbmZvIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGUgY29kZSBhdCB0aGUgc2FtZSB0aW1lLiIKKyAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgICB9CisKKyAgICAgIE91dHB1dERpcmVjdGl2ZSBkaXJlY3RpdmU7CisgICAgICBkaXJlY3RpdmUubmFtZSA9IG5hbWU7CisgICAgICBpZiAoZ2VuZXJhdG9yX2luZm8gPT0gbnVsbHB0cikgeworICAgICAgICBkaXJlY3RpdmUuZ2VuZXJhdG9yID0gbnVsbHB0cjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRpcmVjdGl2ZS5nZW5lcmF0b3IgPSBnZW5lcmF0b3JfaW5mby0+Z2VuZXJhdG9yOworICAgICAgfQorCisgICAgICAvLyBTcGxpdCB2YWx1ZSBhdCAnOicgdG8gc2VwYXJhdGUgdGhlIGdlbmVyYXRvciBwYXJhbWV0ZXIgZnJvbSB0aGUKKyAgICAgIC8vIGZpbGVuYW1lLiAgSG93ZXZlciwgYXZvaWQgZG9pbmcgdGhpcyBpZiB0aGUgY29sb24gaXMgcGFydCBvZiBhIHZhbGlkCisgICAgICAvLyBXaW5kb3dzLXN0eWxlIGFic29sdXRlIHBhdGguCisgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGNvbG9uX3BvcyA9IHZhbHVlLmZpbmRfZmlyc3Rfb2YoJzonKTsKKyAgICAgIGlmIChjb2xvbl9wb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwgSXNXaW5kb3dzQWJzb2x1dGVQYXRoKHZhbHVlKSkgeworICAgICAgICBkaXJlY3RpdmUub3V0cHV0X2xvY2F0aW9uID0gdmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBkaXJlY3RpdmUucGFyYW1ldGVyID0gdmFsdWUuc3Vic3RyKDAsIGNvbG9uX3Bvcyk7CisgICAgICAgIGRpcmVjdGl2ZS5vdXRwdXRfbG9jYXRpb24gPSB2YWx1ZS5zdWJzdHIoY29sb25fcG9zICsgMSk7CisgICAgICB9CisKKyAgICAgIG91dHB1dF9kaXJlY3RpdmVzXy5wdXNoX2JhY2soZGlyZWN0aXZlKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfQ09OVElOVUU7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2U6OlByaW50SGVscFRleHQoKSB7CisgIC8vIFNvcnJ5IGZvciBpbmRlbnRhdGlvbiBoZXJlOyBsaW5lIHdyYXBwaW5nIHdvdWxkIGJlIHVnbGllci4KKyAgc3RkOjpjb3V0IDw8ICJVc2FnZTogIiA8PCBleGVjdXRhYmxlX25hbWVfIDw8ICIgW09QVElPTl0gUFJPVE9fRklMRVMiOworICBzdGQ6OmNvdXQgPDwgUiIoCitQYXJzZSBQUk9UT19GSUxFUyBhbmQgZ2VuZXJhdGUgb3V0cHV0IGJhc2VkIG9uIHRoZSBvcHRpb25zIGdpdmVuOgorICAtSVBBVEgsIC0tcHJvdG9fcGF0aD1QQVRIICAgU3BlY2lmeSB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHNlYXJjaCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydHMuICBNYXkgYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMgd2lsbCBiZSBzZWFyY2hlZCBpbiBvcmRlci4gIElmIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4sIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBub3QgZm91bmQgaW4gYW55IG9mIHRoZSB0aGVzZSBkaXJlY3RvcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSAtLWRlc2NyaXB0b3Jfc2V0X2luIGRlc2NyaXB0b3JzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQgZm9yIHJlcXVpcmVkIHByb3RvIGZpbGUuCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgICBTaG93IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgICAgIFNob3cgdGhpcyB0ZXh0IGFuZCBleGl0LgorICAtLWVuY29kZT1NRVNTQUdFX1RZUEUgICAgICAgUmVhZCBhIHRleHQtZm9ybWF0IG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlIGl0IGluIGJpbmFyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RhbmRhcmQgb3V0cHV0LiAgVGhlIG1lc3NhZ2UgdHlwZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBkZWZpbmVkIGluIFBST1RPX0ZJTEVTIG9yIHRoZWlyIGltcG9ydHMuCisgIC0tZGV0ZXJtaW5pc3RpY19vdXRwdXQgICAgICBXaGVuIHVzaW5nIC0tZW5jb2RlLCBlbnN1cmUgbWFwIGZpZWxkcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluaXN0aWNhbGx5IG9yZGVyZWQuIE5vdGUgdGhhdCB0aGlzIG9yZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgY2Fub25pY2FsLCBhbmQgY2hhbmdlcyBhY3Jvc3MgYnVpbGRzIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlcyBvZiBwcm90b2MuCisgIC0tZGVjb2RlPU1FU1NBR0VfVFlQRSAgICAgICBSZWFkIGEgYmluYXJ5IG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlIGl0IGluIHRleHQgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdGFuZGFyZCBvdXRwdXQuICBUaGUgbWVzc2FnZSB0eXBlIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGRlZmluZWQgaW4gUFJPVE9fRklMRVMgb3IgdGhlaXIgaW1wb3J0cy4KKyAgLS1kZWNvZGVfcmF3ICAgICAgICAgICAgICAgIFJlYWQgYW4gYXJiaXRyYXJ5IHByb3RvY29sIG1lc3NhZ2UgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlIHRoZSByYXcgdGFnL3ZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlycyBpbiB0ZXh0IGZvcm1hdCB0byBzdGFuZGFyZCBvdXRwdXQuICBObworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVE9fRklMRVMgc2hvdWxkIGJlIGdpdmVuIHdoZW4gdXNpbmcgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZy4KKyAgLS1kZXNjcmlwdG9yX3NldF9pbj1GSUxFUyAgIFNwZWNpZmllcyBhIGRlbGltaXRlZCBsaXN0IG9mIEZJTEVTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIGNvbnRhaW5pbmcgYSBGaWxlRGVzY3JpcHRvclNldCAoYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgYnVmZmVyIGRlZmluZWQgaW4gZGVzY3JpcHRvci5wcm90bykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgRmlsZURlc2NyaXB0b3IgZm9yIGVhY2ggb2YgdGhlIFBST1RPX0ZJTEVTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCB3aWxsIGJlIGxvYWRlZCBmcm9tIHRoZXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclNldHMuIElmIGEgRmlsZURlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcnMgbXVsdGlwbGUgdGltZXMsIHRoZSBmaXJzdCBvY2N1cnJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQuCisgIC1vRklMRSwgICAgICAgICAgICAgICAgICAgICBXcml0ZXMgYSBGaWxlRGVzY3JpcHRvclNldCAoYSBwcm90b2NvbCBidWZmZXIsCisgICAgLS1kZXNjcmlwdG9yX3NldF9vdXQ9RklMRSBkZWZpbmVkIGluIGRlc2NyaXB0b3IucHJvdG8pIGNvbnRhaW5pbmcgYWxsIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXQgZmlsZXMgdG8gRklMRS4KKyAgLS1pbmNsdWRlX2ltcG9ydHMgICAgICAgICAgIFdoZW4gdXNpbmcgLS1kZXNjcmlwdG9yX3NldF9vdXQsIGFsc28gaW5jbHVkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGRlcGVuZGVuY2llcyBvZiB0aGUgaW5wdXQgZmlsZXMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQsIHNvIHRoYXQgdGhlIHNldCBpcyBzZWxmLWNvbnRhaW5lZC4KKyAgLS1pbmNsdWRlX3NvdXJjZV9pbmZvICAgICAgIFdoZW4gdXNpbmcgLS1kZXNjcmlwdG9yX3NldF9vdXQsIGRvIG5vdCBzdHJpcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlQ29kZUluZm8gZnJvbSB0aGUgRmlsZURlc2NyaXB0b3JQcm90by4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiB2YXN0bHkgbGFyZ2VyIGRlc2NyaXB0b3JzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiBvZiBlYWNoIGRlY2wgaW4gdGhlIHNvdXJjZSBmaWxlIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWxsIGFzIHN1cnJvdW5kaW5nIGNvbW1lbnRzLgorICAtLWRlcGVuZGVuY3lfb3V0PUZJTEUgICAgICAgV3JpdGUgYSBkZXBlbmRlbmN5IG91dHB1dCBmaWxlIGluIHRoZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkIGJ5IG1ha2UuIFRoaXMgd3JpdGVzIHRoZSB0cmFuc2l0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgb2YgaW5wdXQgZmlsZSBwYXRocyB0byBGSUxFCisgIC0tZXJyb3JfZm9ybWF0PUZPUk1BVCAgICAgICBTZXQgdGhlIGZvcm1hdCBpbiB3aGljaCB0byBwcmludCBlcnJvcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVQgbWF5IGJlICdnY2MnICh0aGUgZGVmYXVsdCkgb3IgJ21zdnMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gZm9ybWF0KS4KKyAgLS1mYXRhbF93YXJuaW5ncyAgICAgICAgICAgIE1ha2Ugd2FybmluZ3MgYmUgZmF0YWwgKHNpbWlsYXIgdG8gLVdlcnIgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjYykuIFRoaXMgZmxhZyB3aWxsIG1ha2UgcHJvdG9jIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZSBpZiBhbnkgd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBnZW5lcmF0ZWQuCisgIC0tcHJpbnRfZnJlZV9maWVsZF9udW1iZXJzICBQcmludCB0aGUgZnJlZSBmaWVsZCBudW1iZXJzIG9mIHRoZSBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBpbiB0aGUgZ2l2ZW4gcHJvdG8gZmlsZXMuIEdyb3VwcyBzaGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgZmllbGQgbnVtYmVyIHNwYWNlIHdpdGggdGhlIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS4gRXh0ZW5zaW9uIHJhbmdlcyBhcmUgY291bnRlZCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXBpZWQgZmllbGRzIG51bWJlcnMuKSI7CisgIGlmICghcGx1Z2luX3ByZWZpeF8uZW1wdHkoKSkgeworICAgIHN0ZDo6Y291dCA8PCBSIigKKyAgLS1wbHVnaW49RVhFQ1VUQUJMRSAgICAgICAgIFNwZWNpZmllcyBhIHBsdWdpbiBleGVjdXRhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGx5LCBwcm90b2Mgc2VhcmNoZXMgdGhlIFBBVEggZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5zLCBidXQgeW91IG1heSBzcGVjaWZ5IGFkZGl0aW9uYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVzIG5vdCBpbiB0aGUgcGF0aCB1c2luZyB0aGlzIGZsYWcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsbHksIEVYRUNVVEFCTEUgbWF5IGJlIG9mIHRoZSBmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FPVBBVEgsIGluIHdoaWNoIGNhc2UgdGhlIGdpdmVuIHBsdWdpbiBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBtYXBwZWQgdG8gdGhlIGdpdmVuIGV4ZWN1dGFibGUgZXZlbiBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGV4ZWN1dGFibGUncyBvd24gbmFtZSBkaWZmZXJzLikiOworICB9CisKKyAgZm9yIChHZW5lcmF0b3JNYXA6Oml0ZXJhdG9yIGl0ZXIgPSBnZW5lcmF0b3JzX2J5X2ZsYWdfbmFtZV8uYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IGdlbmVyYXRvcnNfYnlfZmxhZ19uYW1lXy5lbmQoKTsgKytpdGVyKSB7CisgICAgLy8gRklYTUUoa2VudG9uKTogIElmIHRoZSB0ZXh0IGlzIGxvbmcgZW5vdWdoIGl0IHdpbGwgd3JhcCwgd2hpY2ggaXMgdWdseSwKKyAgICAvLyAgIGJ1dCBmaXhpbmcgdGhpcyBuaWNlbHkgKGUuZy4gc3BsaXR0aW5nIG9uIHNwYWNlcykgaXMgcHJvYmFibHkgbW9yZQorICAgIC8vICAgdHJvdWJsZSB0aGFuIGl0J3Mgd29ydGguCisgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbAorICAgICAgICAgICAgICA8PCAiICAiIDw8IGl0ZXItPmZpcnN0IDw8ICI9T1VUX0RJUiAiCisgICAgICAgICAgICAgIDw8IHN0ZDo6c3RyaW5nKDE5IC0gaXRlci0+Zmlyc3Quc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICcpICAvLyBTcGFjZXMgZm9yIGFsaWdubWVudC4KKyAgICAgICAgICAgICAgPDwgaXRlci0+c2Vjb25kLmhlbHBfdGV4dDsKKyAgfQorICBzdGQ6OmNvdXQgPDwgUiIoCisgIEA8ZmlsZW5hbWU+ICAgICAgICAgICAgICAgICBSZWFkIG9wdGlvbnMgYW5kIGZpbGVuYW1lcyBmcm9tIGZpbGUuIElmIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIGZpbGUgcGF0aCBpcyBzcGVjaWZpZWQsIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHNlYXJjaGVkIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAtLXByb3RvX3BhdGggb3B0aW9uIHdpbGwgbm90IGFmZmVjdCBob3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYXJndW1lbnQgZmlsZSBpcyBzZWFyY2hlZC4gQ29udGVudCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgd2lsbCBiZSBleHBhbmRlZCBpbiB0aGUgcG9zaXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8ZmlsZW5hbWU+IGFzIGluIHRoZSBhcmd1bWVudCBsaXN0LiBOb3RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHNoZWxsIGV4cGFuc2lvbiBpcyBub3QgYXBwbGllZCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgb2YgdGhlIGZpbGUgKGkuZS4sIHlvdSBjYW5ub3QgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZXMsIHdpbGRjYXJkcywgZXNjYXBlcywgY29tbWFuZHMsIGV0Yy4pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWFjaCBsaW5lIGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbiBpZiBpdCBjb250YWlucyBzcGFjZXMuKSI7CisgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cit9CisKK2Jvb2wgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkVuZm9yY2VQcm90bzNPcHRpb25hbFN1cHBvcnQoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvZGVnZW5fbmFtZSwgdWludDY0X3Qgc3VwcG9ydGVkX2ZlYXR1cmVzLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4mIHBhcnNlZF9maWxlcykgY29uc3QgeworICBib29sIHN1cHBvcnRzX3Byb3RvM19vcHRpb25hbCA9CisgICAgICBzdXBwb3J0ZWRfZmVhdHVyZXMgJiBDb2RlR2VuZXJhdG9yOjpGRUFUVVJFX1BST1RPM19PUFRJT05BTDsKKyAgaWYgKCFzdXBwb3J0c19wcm90bzNfb3B0aW9uYWwpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZmQgOiBwYXJzZWRfZmlsZXMpIHsKKyAgICAgIGlmIChDb250YWluc1Byb3RvM09wdGlvbmFsKGZkKSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgZmQtPm5hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIjogaXMgYSBwcm90bzMgZmlsZSB0aGF0IGNvbnRhaW5zIG9wdGlvbmFsIGZpZWxkcywgYnV0ICIKKyAgICAgICAgICAgICAgICAgICAgICJjb2RlIGdlbmVyYXRvciAiCisgICAgICAgICAgICAgICAgICA8PCBjb2RlZ2VuX25hbWUKKyAgICAgICAgICAgICAgICAgIDw8ICIgaGFzbid0IGJlZW4gdXBkYXRlZCB0byBzdXBwb3J0IG9wdGlvbmFsIGZpZWxkcyBpbiAiCisgICAgICAgICAgICAgICAgICAgICAicHJvdG8zLiBQbGVhc2UgYXNrIHRoZSBvd25lciBvZiB0aGlzIGNvZGUgZ2VuZXJhdG9yIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IHByb3RvMyBvcHRpb25hbC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0ZU91dHB1dCgKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMsCisgICAgY29uc3QgT3V0cHV0RGlyZWN0aXZlJiBvdXRwdXRfZGlyZWN0aXZlLAorICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0KSB7CisgIC8vIENhbGwgdGhlIGdlbmVyYXRvci4KKyAgc3RkOjpzdHJpbmcgZXJyb3I7CisgIGlmIChvdXRwdXRfZGlyZWN0aXZlLmdlbmVyYXRvciA9PSBudWxscHRyKSB7CisgICAgLy8gVGhpcyBpcyBhIHBsdWdpbi4KKyAgICBHT09HTEVfQ0hFQ0soSGFzUHJlZml4U3RyaW5nKG91dHB1dF9kaXJlY3RpdmUubmFtZSwgIi0tIikgJiYKKyAgICAgICAgICBIYXNTdWZmaXhTdHJpbmcob3V0cHV0X2RpcmVjdGl2ZS5uYW1lLCAiX291dCIpKQorICAgICAgICA8PCAiQmFkIG5hbWUgZm9yIHBsdWdpbiBnZW5lcmF0b3I6ICIgPDwgb3V0cHV0X2RpcmVjdGl2ZS5uYW1lOworCisgICAgc3RkOjpzdHJpbmcgcGx1Z2luX25hbWUgPSBQbHVnaW5OYW1lKHBsdWdpbl9wcmVmaXhfLCBvdXRwdXRfZGlyZWN0aXZlLm5hbWUpOworICAgIHN0ZDo6c3RyaW5nIHBhcmFtZXRlcnMgPSBvdXRwdXRfZGlyZWN0aXZlLnBhcmFtZXRlcjsKKyAgICBpZiAoIXBsdWdpbl9wYXJhbWV0ZXJzX1twbHVnaW5fbmFtZV0uZW1wdHkoKSkgeworICAgICAgaWYgKCFwYXJhbWV0ZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgcGFyYW1ldGVycy5hcHBlbmQoIiwiKTsKKyAgICAgIH0KKyAgICAgIHBhcmFtZXRlcnMuYXBwZW5kKHBsdWdpbl9wYXJhbWV0ZXJzX1twbHVnaW5fbmFtZV0pOworICAgIH0KKyAgICBpZiAoIUdlbmVyYXRlUGx1Z2luT3V0cHV0KHBhcnNlZF9maWxlcywgcGx1Z2luX25hbWUsIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3JfY29udGV4dCwgJmVycm9yKSkgeworICAgICAgc3RkOjpjZXJyIDw8IG91dHB1dF9kaXJlY3RpdmUubmFtZSA8PCAiOiAiIDw8IGVycm9yIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gUmVndWxhciBnZW5lcmF0b3IuCisgICAgc3RkOjpzdHJpbmcgcGFyYW1ldGVycyA9IG91dHB1dF9kaXJlY3RpdmUucGFyYW1ldGVyOworICAgIGlmICghZ2VuZXJhdG9yX3BhcmFtZXRlcnNfW291dHB1dF9kaXJlY3RpdmUubmFtZV0uZW1wdHkoKSkgeworICAgICAgaWYgKCFwYXJhbWV0ZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgcGFyYW1ldGVycy5hcHBlbmQoIiwiKTsKKyAgICAgIH0KKyAgICAgIHBhcmFtZXRlcnMuYXBwZW5kKGdlbmVyYXRvcl9wYXJhbWV0ZXJzX1tvdXRwdXRfZGlyZWN0aXZlLm5hbWVdKTsKKyAgICB9CisgICAgaWYgKCFFbmZvcmNlUHJvdG8zT3B0aW9uYWxTdXBwb3J0KAorICAgICAgICAgICAgb3V0cHV0X2RpcmVjdGl2ZS5uYW1lLAorICAgICAgICAgICAgb3V0cHV0X2RpcmVjdGl2ZS5nZW5lcmF0b3ItPkdldFN1cHBvcnRlZEZlYXR1cmVzKCksIHBhcnNlZF9maWxlcykpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW91dHB1dF9kaXJlY3RpdmUuZ2VuZXJhdG9yLT5HZW5lcmF0ZUFsbChwYXJzZWRfZmlsZXMsIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yX2NvbnRleHQsICZlcnJvcikpIHsKKyAgICAgIC8vIEdlbmVyYXRvciByZXR1cm5lZCBhbiBlcnJvci4KKyAgICAgIHN0ZDo6Y2VyciA8PCBvdXRwdXRfZGlyZWN0aXZlLm5hbWUgPDwgIjogIiA8PCBlcnJvciA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdlbmVyYXRlRGVwZW5kZW5jeU1hbmlmZXN0RmlsZSgKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMsCisgICAgY29uc3QgR2VuZXJhdG9yQ29udGV4dE1hcCYgb3V0cHV0X2RpcmVjdG9yaWVzLAorICAgIERpc2tTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSkgeworICBGaWxlRGVzY3JpcHRvclNldCBmaWxlX3NldDsKKworICBzdGQ6OnNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IGFscmVhZHlfc2VlbjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZWRfZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBHZXRUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKHBhcnNlZF9maWxlc1tpXSwgZmFsc2UsIGZhbHNlLCAmYWxyZWFkeV9zZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zZXQubXV0YWJsZV9maWxlKCkpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG91dHB1dF9maWxlbmFtZXM7CisgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG91dHB1dF9kaXJlY3RvcmllcykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NhdGlvbiA9IHBhaXIuZmlyc3Q7CisgICAgR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeSA9IHBhaXIuc2Vjb25kLmdldCgpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZWxhdGl2ZV9vdXRwdXRfZmlsZW5hbWVzOworICAgIGRpcmVjdG9yeS0+R2V0T3V0cHV0RmlsZW5hbWVzKCZyZWxhdGl2ZV9vdXRwdXRfZmlsZW5hbWVzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlbGF0aXZlX291dHB1dF9maWxlbmFtZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIHN0ZDo6c3RyaW5nIG91dHB1dF9maWxlbmFtZSA9IGxvY2F0aW9uICsgcmVsYXRpdmVfb3V0cHV0X2ZpbGVuYW1lc1tpXTsKKyAgICAgIGlmIChvdXRwdXRfZmlsZW5hbWUuY29tcGFyZSgwLCAyLCAiLi8iKSA9PSAwKSB7CisgICAgICAgIG91dHB1dF9maWxlbmFtZSA9IG91dHB1dF9maWxlbmFtZS5zdWJzdHIoMik7CisgICAgICB9CisgICAgICBvdXRwdXRfZmlsZW5hbWVzLnB1c2hfYmFjayhvdXRwdXRfZmlsZW5hbWUpOworICAgIH0KKyAgfQorCisgIGlmICghZGVzY3JpcHRvcl9zZXRfb3V0X25hbWVfLmVtcHR5KCkpIHsKKyAgICBvdXRwdXRfZmlsZW5hbWVzLnB1c2hfYmFjayhkZXNjcmlwdG9yX3NldF9vdXRfbmFtZV8pOworICB9CisKKyAgaW50IGZkOworICBkbyB7CisgICAgZmQgPSBvcGVuKGRlcGVuZGVuY3lfb3V0X25hbWVfLmNfc3RyKCksCisgICAgICAgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0JJTkFSWSwgMDY2Nik7CisgIH0gd2hpbGUgKGZkIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgaWYgKGZkIDwgMCkgeworICAgIHBlcnJvcihkZXBlbmRlbmN5X291dF9uYW1lXy5jX3N0cigpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbzo6RmlsZU91dHB1dFN0cmVhbSBvdXQoZmQpOworICBpbzo6UHJpbnRlciBwcmludGVyKCZvdXQsICckJyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXRfZmlsZW5hbWVzLnNpemUoKTsgaSsrKSB7CisgICAgcHJpbnRlci5QcmludChvdXRwdXRfZmlsZW5hbWVzW2ldLmNfc3RyKCkpOworICAgIGlmIChpID09IG91dHB1dF9maWxlbmFtZXMuc2l6ZSgpIC0gMSkgeworICAgICAgcHJpbnRlci5QcmludCgiOiIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLlByaW50KCIgXFxcbiIpOworICAgIH0KKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV9zZXQuZmlsZV9zaXplKCk7IGkrKykgeworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUgPSBmaWxlX3NldC5maWxlKGkpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2aXJ0dWFsX2ZpbGUgPSBmaWxlLm5hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBkaXNrX2ZpbGU7CisgICAgaWYgKHNvdXJjZV90cmVlICYmCisgICAgICAgIHNvdXJjZV90cmVlLT5WaXJ0dWFsRmlsZVRvRGlza0ZpbGUodmlydHVhbF9maWxlLCAmZGlza19maWxlKSkgeworICAgICAgcHJpbnRlci5QcmludCgiICRkaXNrX2ZpbGUkIiwgImRpc2tfZmlsZSIsIGRpc2tfZmlsZSk7CisgICAgICBpZiAoaSA8IGZpbGVfc2V0LmZpbGVfc2l6ZSgpIC0gMSkgcHJpbnRlci5QcmludCgiXFxcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlVuYWJsZSB0byBpZGVudGlmeSBwYXRoIGZvciBmaWxlICIgPDwgdmlydHVhbF9maWxlCisgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0ZVBsdWdpbk91dHB1dCgKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbl9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0LCBzdGQ6OnN0cmluZyogZXJyb3IpIHsKKyAgQ29kZUdlbmVyYXRvclJlcXVlc3QgcmVxdWVzdDsKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlIHJlc3BvbnNlOworICBzdGQ6OnN0cmluZyBwcm9jZXNzZWRfcGFyYW1ldGVyID0gcGFyYW1ldGVyOworCisKKyAgLy8gQnVpbGQgdGhlIHJlcXVlc3QuCisgIGlmICghcHJvY2Vzc2VkX3BhcmFtZXRlci5lbXB0eSgpKSB7CisgICAgcmVxdWVzdC5zZXRfcGFyYW1ldGVyKHByb2Nlc3NlZF9wYXJhbWV0ZXIpOworICB9CisKKworICBzdGQ6OnNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IGFscmVhZHlfc2VlbjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZWRfZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICByZXF1ZXN0LmFkZF9maWxlX3RvX2dlbmVyYXRlKHBhcnNlZF9maWxlc1tpXS0+bmFtZSgpKTsKKyAgICBHZXRUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKHBhcnNlZF9maWxlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvLyBJbmNsdWRlIGpzb25fbmFtZSBmb3IgcGx1Z2lucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvLyBJbmNsdWRlIHNvdXJjZSBjb2RlIGluZm8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxyZWFkeV9zZWVuLCByZXF1ZXN0Lm11dGFibGVfcHJvdG9fZmlsZSgpKTsKKyAgfQorCisgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpWZXJzaW9uKiB2ZXJzaW9uID0KKyAgICAgIHJlcXVlc3QubXV0YWJsZV9jb21waWxlcl92ZXJzaW9uKCk7CisgIHZlcnNpb24tPnNldF9tYWpvcihQUk9UT0JVRl9WRVJTSU9OIC8gMTAwMDAwMCk7CisgIHZlcnNpb24tPnNldF9taW5vcihQUk9UT0JVRl9WRVJTSU9OIC8gMTAwMCAlIDEwMDApOworICB2ZXJzaW9uLT5zZXRfcGF0Y2goUFJPVE9CVUZfVkVSU0lPTiAlIDEwMDApOworICB2ZXJzaW9uLT5zZXRfc3VmZml4KFBST1RPQlVGX1ZFUlNJT05fU1VGRklYKTsKKworICAvLyBJbnZva2UgdGhlIHBsdWdpbi4KKyAgU3VicHJvY2VzcyBzdWJwcm9jZXNzOworCisgIGlmIChwbHVnaW5zXy5jb3VudChwbHVnaW5fbmFtZSkgPiAwKSB7CisgICAgc3VicHJvY2Vzcy5TdGFydChwbHVnaW5zX1twbHVnaW5fbmFtZV0sIFN1YnByb2Nlc3M6OkVYQUNUX05BTUUpOworICB9IGVsc2UgeworICAgIHN1YnByb2Nlc3MuU3RhcnQocGx1Z2luX25hbWUsIFN1YnByb2Nlc3M6OlNFQVJDSF9QQVRIKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbW11bmljYXRlX2Vycm9yOworICBpZiAoIXN1YnByb2Nlc3MuQ29tbXVuaWNhdGUocmVxdWVzdCwgJnJlc3BvbnNlLCAmY29tbXVuaWNhdGVfZXJyb3IpKSB7CisgICAgKmVycm9yID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgiJDA6ICQxIiwgcGx1Z2luX25hbWUsIGNvbW11bmljYXRlX2Vycm9yKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBXcml0ZSB0aGUgZmlsZXMuICBXZSBkbyB0aGlzIGV2ZW4gaWYgdGhlcmUgd2FzIGEgZ2VuZXJhdG9yIGVycm9yIGluIG9yZGVyCisgIC8vIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBvZiBhIGNvbXBpbGVkLWluIGdlbmVyYXRvci4KKyAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gY3VycmVudF9vdXRwdXQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzcG9uc2UuZmlsZV9zaXplKCk7IGkrKykgeworICAgIGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZTo6RmlsZSYgb3V0cHV0X2ZpbGUgPSByZXNwb25zZS5maWxlKGkpOworCisgICAgaWYgKCFvdXRwdXRfZmlsZS5pbnNlcnRpb25fcG9pbnQoKS5lbXB0eSgpKSB7CisgICAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IG91dHB1dF9maWxlLm5hbWUoKTsKKyAgICAgIC8vIE9wZW4gYSBmaWxlIGZvciBpbnNlcnQuCisgICAgICAvLyBXZSByZXNldCBjdXJyZW50X291dHB1dCB0byBudWxscHRyIGZpcnN0IHNvIHRoYXQgdGhlIG9sZCBmaWxlIGlzIGNsb3NlZAorICAgICAgLy8gYmVmb3JlIHRoZSBuZXcgb25lIGlzIG9wZW5lZC4KKyAgICAgIGN1cnJlbnRfb3V0cHV0LnJlc2V0KCk7CisgICAgICBjdXJyZW50X291dHB1dC5yZXNldCgKKyAgICAgICAgICBnZW5lcmF0b3JfY29udGV4dC0+T3BlbkZvckluc2VydFdpdGhHZW5lcmF0ZWRDb2RlSW5mbygKKyAgICAgICAgICAgICAgZmlsZW5hbWUsIG91dHB1dF9maWxlLmluc2VydGlvbl9wb2ludCgpLAorICAgICAgICAgICAgICBvdXRwdXRfZmlsZS5nZW5lcmF0ZWRfY29kZV9pbmZvKCkpKTsKKyAgICB9IGVsc2UgaWYgKCFvdXRwdXRfZmlsZS5uYW1lKCkuZW1wdHkoKSkgeworICAgICAgLy8gU3RhcnRpbmcgYSBuZXcgZmlsZS4gIE9wZW4gaXQuCisgICAgICAvLyBXZSByZXNldCBjdXJyZW50X291dHB1dCB0byBudWxscHRyIGZpcnN0IHNvIHRoYXQgdGhlIG9sZCBmaWxlIGlzIGNsb3NlZAorICAgICAgLy8gYmVmb3JlIHRoZSBuZXcgb25lIGlzIG9wZW5lZC4KKyAgICAgIGN1cnJlbnRfb3V0cHV0LnJlc2V0KCk7CisgICAgICBjdXJyZW50X291dHB1dC5yZXNldChnZW5lcmF0b3JfY29udGV4dC0+T3BlbihvdXRwdXRfZmlsZS5uYW1lKCkpKTsKKyAgICB9IGVsc2UgaWYgKGN1cnJlbnRfb3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICplcnJvciA9IHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICAgIiQwOiBGaXJzdCBmaWxlIGNodW5rIHJldHVybmVkIGJ5IHBsdWdpbiBkaWQgbm90IHNwZWNpZnkgYSBmaWxlICIKKyAgICAgICAgICAibmFtZS4iLAorICAgICAgICAgIHBsdWdpbl9uYW1lKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBVc2UgQ29kZWRPdXRwdXRTdHJlYW0gZm9yIGNvbnZlbmllbmNlOyBvdGhlcndpc2Ugd2UnZCBuZWVkIHRvIHByb3ZpZGUKKyAgICAvLyBvdXIgb3duIGJ1ZmZlci1jb3B5aW5nIGxvb3AuCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIHdyaXRlcihjdXJyZW50X291dHB1dC5nZXQoKSk7CisgICAgd3JpdGVyLldyaXRlU3RyaW5nKG91dHB1dF9maWxlLmNvbnRlbnQoKSk7CisgIH0KKworICAvLyBDaGVjayBmb3IgZXJyb3JzLgorICBpZiAoIXJlc3BvbnNlLmVycm9yKCkuZW1wdHkoKSkgeworICAgIC8vIEdlbmVyYXRvciByZXR1cm5lZCBhbiBlcnJvci4KKyAgICAqZXJyb3IgPSByZXNwb25zZS5lcnJvcigpOworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmICghRW5mb3JjZVByb3RvM09wdGlvbmFsU3VwcG9ydCgKKyAgICAgICAgICAgICAgICAgcGx1Z2luX25hbWUsIHJlc3BvbnNlLnN1cHBvcnRlZF9mZWF0dXJlcygpLCBwYXJzZWRfZmlsZXMpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkVuY29kZU9yRGVjb2RlKGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKSB7CisgIC8vIExvb2sgdXAgdGhlIHR5cGUuCisgIGNvbnN0IERlc2NyaXB0b3IqIHR5cGUgPSBwb29sLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoY29kZWNfdHlwZV8pOworICBpZiAodHlwZSA9PSBudWxscHRyKSB7CisgICAgc3RkOjpjZXJyIDw8ICJUeXBlIG5vdCBkZWZpbmVkOiAiIDw8IGNvZGVjX3R5cGVfIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZHluYW1pY19mYWN0b3J5KHBvb2wpOworICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gbWVzc2FnZShkeW5hbWljX2ZhY3RvcnkuR2V0UHJvdG90eXBlKHR5cGUpLT5OZXcoKSk7CisKKyAgaWYgKG1vZGVfID09IE1PREVfRU5DT0RFKSB7CisgICAgU2V0RmRUb1RleHRNb2RlKFNURElOX0ZJTEVOTyk7CisgICAgU2V0RmRUb0JpbmFyeU1vZGUoU1RET1VUX0ZJTEVOTyk7CisgIH0gZWxzZSB7CisgICAgU2V0RmRUb0JpbmFyeU1vZGUoU1RESU5fRklMRU5PKTsKKyAgICBTZXRGZFRvVGV4dE1vZGUoU1RET1VUX0ZJTEVOTyk7CisgIH0KKworICBpbzo6RmlsZUlucHV0U3RyZWFtIGluKFNURElOX0ZJTEVOTyk7CisgIGlvOjpGaWxlT3V0cHV0U3RyZWFtIG91dChTVERPVVRfRklMRU5PKTsKKworICBpZiAobW9kZV8gPT0gTU9ERV9FTkNPREUpIHsKKyAgICAvLyBJbnB1dCBpcyB0ZXh0LgorICAgIEVycm9yUHJpbnRlciBlcnJvcl9jb2xsZWN0b3IoZXJyb3JfZm9ybWF0Xyk7CisgICAgVGV4dEZvcm1hdDo6UGFyc2VyIHBhcnNlcjsKKyAgICBwYXJzZXIuUmVjb3JkRXJyb3JzVG8oJmVycm9yX2NvbGxlY3Rvcik7CisgICAgcGFyc2VyLkFsbG93UGFydGlhbE1lc3NhZ2UodHJ1ZSk7CisKKyAgICBpZiAoIXBhcnNlci5QYXJzZSgmaW4sIG1lc3NhZ2UuZ2V0KCkpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIkZhaWxlZCB0byBwYXJzZSBpbnB1dC4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gSW5wdXQgaXMgYmluYXJ5LgorICAgIGlmICghbWVzc2FnZS0+UGFyc2VQYXJ0aWFsRnJvbVplcm9Db3B5U3RyZWFtKCZpbikpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiRmFpbGVkIHRvIHBhcnNlIGlucHV0LiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIGlmICghbWVzc2FnZS0+SXNJbml0aWFsaXplZCgpKSB7CisgICAgc3RkOjpjZXJyIDw8ICJ3YXJuaW5nOiAgSW5wdXQgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogICIKKyAgICAgICAgICAgICAgPDwgbWVzc2FnZS0+SW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCisgIGlmIChtb2RlXyA9PSBNT0RFX0VOQ09ERSkgeworICAgIC8vIE91dHB1dCBpcyBiaW5hcnkuCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dCgmb3V0KTsKKyAgICBjb2RlZF9vdXQuU2V0U2VyaWFsaXphdGlvbkRldGVybWluaXN0aWMoZGV0ZXJtaW5pc3RpY19vdXRwdXRfKTsKKyAgICBpZiAoIW1lc3NhZ2UtPlNlcmlhbGl6ZVBhcnRpYWxUb0NvZGVkU3RyZWFtKCZjb2RlZF9vdXQpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIm91dHB1dDogSS9PIGVycm9yLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBPdXRwdXQgaXMgdGV4dC4KKyAgICBpZiAoIVRleHRGb3JtYXQ6OlByaW50KCptZXNzYWdlLCAmb3V0KSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJvdXRwdXQ6IEkvTyBlcnJvci4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6V3JpdGVEZXNjcmlwdG9yU2V0KAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4mIHBhcnNlZF9maWxlcykgeworICBGaWxlRGVzY3JpcHRvclNldCBmaWxlX3NldDsKKworICBzdGQ6OnNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IGFscmVhZHlfc2VlbjsKKyAgaWYgKCFpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XykgeworICAgIC8vIFNpbmNlIHdlIGRvbid0IHdhbnQgdG8gb3V0cHV0IHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzLCBidXQgd2UgZG8gd2FudAorICAgIC8vIHRoaW5ncyB0byBiZSBpbiBkZXBlbmRlbmN5IG9yZGVyLCBhZGQgYWxsIGRlcGVuZGVuY2llcyB0aGF0IGFyZW4ndCBpbgorICAgIC8vIHBhcnNlZF9maWxlcyB0byBhbHJlYWR5X3NlZW4uICBUaGlzIHdpbGwgc2hvcnQgY2lyY3VpdCB0aGUgcmVjdXJzaW9uCisgICAgLy8gaW4gR2V0VHJhbnNpdGl2ZURlcGVuZGVuY2llcy4KKyAgICBzdGQ6OnNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IHRvX291dHB1dDsKKyAgICB0b19vdXRwdXQuaW5zZXJ0KHBhcnNlZF9maWxlcy5iZWdpbigpLCBwYXJzZWRfZmlsZXMuZW5kKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VkX2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBhcnNlZF9maWxlc1tpXTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmlsZS0+ZGVwZW5kZW5jeV9jb3VudCgpOyBqKyspIHsKKyAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlcGVuZGVuY3kgPSBmaWxlLT5kZXBlbmRlbmN5KGopOworICAgICAgICAvLyBpZiB0aGUgZGVwZW5kZW5jeSBpc24ndCBpbiBwYXJzZWQgZmlsZXMsIG1hcmsgaXQgYXMgYWxyZWFkeSBzZWVuCisgICAgICAgIGlmICh0b19vdXRwdXQuZmluZChkZXBlbmRlbmN5KSA9PSB0b19vdXRwdXQuZW5kKCkpIHsKKyAgICAgICAgICBhbHJlYWR5X3NlZW4uaW5zZXJ0KGRlcGVuZGVuY3kpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VkX2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgR2V0VHJhbnNpdGl2ZURlcGVuZGVuY2llcyhwYXJzZWRfZmlsZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLy8gSW5jbHVkZSBqc29uX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9pbmZvX2luX2Rlc2NyaXB0b3Jfc2V0XywgJmFscmVhZHlfc2VlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfc2V0Lm11dGFibGVfZmlsZSgpKTsKKyAgfQorCisgIGludCBmZDsKKyAgZG8geworICAgIGZkID0gb3BlbihkZXNjcmlwdG9yX3NldF9vdXRfbmFtZV8uY19zdHIoKSwKKyAgICAgICAgICAgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQklOQVJZLCAwNjY2KTsKKyAgfSB3aGlsZSAoZmQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICBpZiAoZmQgPCAwKSB7CisgICAgcGVycm9yKGRlc2NyaXB0b3Jfc2V0X291dF9uYW1lXy5jX3N0cigpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbzo6RmlsZU91dHB1dFN0cmVhbSBvdXQoZmQpOworCisgIHsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0KCZvdXQpOworICAgIC8vIERldGVybWluaXNtIGlzIHVzZWZ1bCBoZXJlIGJlY2F1c2UgYnVpbGQgb3V0cHV0cyBhcmUgc29tZXRpbWVzIGNoZWNrZWQKKyAgICAvLyBpbnRvIHZlcnNpb24gY29udHJvbC4KKyAgICBjb2RlZF9vdXQuU2V0U2VyaWFsaXphdGlvbkRldGVybWluaXN0aWModHJ1ZSk7CisgICAgaWYgKCFmaWxlX3NldC5TZXJpYWxpemVUb0NvZGVkU3RyZWFtKCZjb2RlZF9vdXQpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgZGVzY3JpcHRvcl9zZXRfb3V0X25hbWVfIDw8ICI6ICIgPDwgc3RyZXJyb3Iob3V0LkdldEVycm5vKCkpCisgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgb3V0LkNsb3NlKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgaWYgKCFvdXQuQ2xvc2UoKSkgeworICAgIHN0ZDo6Y2VyciA8PCBkZXNjcmlwdG9yX3NldF9vdXRfbmFtZV8gPDwgIjogIiA8PCBzdHJlcnJvcihvdXQuR2V0RXJybm8oKSkKKyAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZXRUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBib29sIGluY2x1ZGVfanNvbl9uYW1lLAorICAgIGJvb2wgaW5jbHVkZV9zb3VyY2VfY29kZV9pbmZvLAorICAgIHN0ZDo6c2V0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4qIGFscmVhZHlfc2VlbiwKKyAgICBSZXBlYXRlZFB0ckZpZWxkPEZpbGVEZXNjcmlwdG9yUHJvdG8+KiBvdXRwdXQpIHsKKyAgaWYgKCFhbHJlYWR5X3NlZW4tPmluc2VydChmaWxlKS5zZWNvbmQpIHsKKyAgICAvLyBBbHJlYWR5IHNhdyB0aGlzIGZpbGUuICBTa2lwLgorICAgIHJldHVybjsKKyAgfQorCisgIC8vIEFkZCBhbGwgZGVwZW5kZW5jaWVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgR2V0VHJhbnNpdGl2ZURlcGVuZGVuY2llcyhmaWxlLT5kZXBlbmRlbmN5KGkpLCBpbmNsdWRlX2pzb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfc291cmNlX2NvZGVfaW5mbywgYWxyZWFkeV9zZWVuLCBvdXRwdXQpOworICB9CisKKyAgLy8gQWRkIHRoaXMgZmlsZS4KKyAgRmlsZURlc2NyaXB0b3JQcm90byogbmV3X2Rlc2NyaXB0b3IgPSBvdXRwdXQtPkFkZCgpOworICBmaWxlLT5Db3B5VG8obmV3X2Rlc2NyaXB0b3IpOworICBpZiAoaW5jbHVkZV9qc29uX25hbWUpIHsKKyAgICBmaWxlLT5Db3B5SnNvbk5hbWVUbyhuZXdfZGVzY3JpcHRvcik7CisgIH0KKyAgaWYgKGluY2x1ZGVfc291cmNlX2NvZGVfaW5mbykgeworICAgIGZpbGUtPkNvcHlTb3VyY2VDb2RlSW5mb1RvKG5ld19kZXNjcmlwdG9yKTsKKyAgfQorfQorCituYW1lc3BhY2UgeworCisvLyBVdGlsaXR5IGZ1bmN0aW9uIGZvciBQcmludEZyZWVGaWVsZE51bWJlcnMuCisvLyBTdG9yZXMgb2NjdXBpZWQgcmFuZ2VzIGludG8gdGhlIHJhbmdlcyBwYXJhbWV0ZXIsIGFuZCBuZXh0IGxldmVsIG9mIHN1YgorLy8gbWVzc2FnZSB0eXBlcyBpbnRvIHRoZSBuZXN0ZWRfbWVzc2FnZXMgcGFyYW1ldGVyLiAgVGhlIEZpZWxkUmFuZ2UgaXMgbGVmdAorLy8gaW5jbHVzaXZlLCByaWdodCBleGNsdXNpdmUuIGkuZS4gW2EsIGIpLgorLy8KKy8vIE5lc3RlZCBNZXNzYWdlczoKKy8vIE5vdGUgdGhhdCBpdCBvbmx5IHN0b3JlcyB0aGUgbmVzdGVkIG1lc3NhZ2UgdHlwZSwgaWZmIHRoZSBuZXN0ZWQgdHlwZSBpcworLy8gZWl0aGVyIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBnaXZlbiBkZXNjcmlwdG9yLCBvciB0aGUgbmVzdGVkIHR5cGUgaXMgYQorLy8gZGVzY2VuZGFudCBvZiB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBhbmQgYWxsIHRoZSBub2RlcyBiZXR3ZWVuIHRoZQorLy8gbmVzdGVkIHR5cGUgYW5kIHRoZSBnaXZlbiBkZXNjcmlwdG9yIGFyZSBncm91cCB0eXBlcy4gZS5nLgorLy8KKy8vIG1lc3NhZ2UgRm9vIHsKKy8vICAgbWVzc2FnZSBCYXIgeworLy8gICAgIG1lc3NhZ2UgTmVzdGVkQmFyIHt9CisvLyAgIH0KKy8vICAgZ3JvdXAgQmF6ID0gMSB7CisvLyAgICAgZ3JvdXAgTmVzdGVkQmF6R3JvdXAgPSAyIHsKKy8vICAgICAgIG1lc3NhZ2UgUXV6IHsKKy8vICAgICAgICAgbWVzc2FnZSBOZXN0ZWRRdXoge30KKy8vICAgICAgIH0KKy8vICAgICB9CisvLyAgICAgbWVzc2FnZSBOZXN0ZWRCYXoge30KKy8vICAgfQorLy8gfQorLy8KKy8vIEluIHRoaXMgY2FzZSwgQmFyLCBRdXogYW5kIE5lc3RlZEJheiB3aWxsIGJlIGFkZGVkIGludG8gdGhlIG5lc3RlZCB0eXBlcy4KKy8vIFNpbmNlIGZyZWUgZmllbGQgbnVtYmVycyBvZiBncm91cCB0eXBlcyB3aWxsIG5vdCBiZSBwcmludGVkLCB0aGlzIG1ha2VzIHN1cmUKKy8vIHRoZSBuZXN0ZWQgbWVzc2FnZSB0eXBlcyBpbiBncm91cHMgd2lsbCBub3QgYmUgZHJvcHBlZC4gVGhlIG5lc3RlZF9tZXNzYWdlcworLy8gcGFyYW1ldGVyIHdpbGwgY29udGFpbiB0aGUgZGlyZWN0IGNoaWxkcmVuICh3aGVuIGdyb3VwcyBhcmUgaWdub3JlZCBpbiB0aGUKKy8vIHRyZWUpIG9mIHRoZSBnaXZlbiBkZXNjcmlwdG9yIGZvciB0aGUgY2FsbGVyIHRvIHRyYXZlcnNlLiBUaGUgZGVjbGFyYXRpb24KKy8vIG9yZGVyIG9mIHRoZSBuZXN0ZWQgbWVzc2FnZXMgaXMgYWxzbyBwcmVzZXJ2ZWQuCit0eXBlZGVmIHN0ZDo6cGFpcjxpbnQsIGludD4gRmllbGRSYW5nZTsKK3ZvaWQgR2F0aGVyT2NjdXBpZWRGaWVsZFJhbmdlcygKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBzdGQ6OnNldDxGaWVsZFJhbmdlPiogcmFuZ2VzLAorICAgIHN0ZDo6dmVjdG9yPGNvbnN0IERlc2NyaXB0b3IqPiogbmVzdGVkX21lc3NhZ2VzKSB7CisgIHN0ZDo6c2V0PGNvbnN0IERlc2NyaXB0b3IqPiBncm91cHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZCA9IGRlc2NyaXB0b3ItPmZpZWxkKGkpOworICAgIHJhbmdlcy0+aW5zZXJ0KEZpZWxkUmFuZ2UoZmQtPm51bWJlcigpLCBmZC0+bnVtYmVyKCkgKyAxKSk7CisgICAgaWYgKGZkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgICBncm91cHMuaW5zZXJ0KGZkLT5tZXNzYWdlX3R5cGUoKSk7CisgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7ICsraSkgeworICAgIHJhbmdlcy0+aW5zZXJ0KEZpZWxkUmFuZ2UoZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX3JhbmdlKGkpLT5zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9yYW5nZShpKS0+ZW5kKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5yZXNlcnZlZF9yYW5nZV9jb3VudCgpOyArK2kpIHsKKyAgICByYW5nZXMtPmluc2VydChGaWVsZFJhbmdlKGRlc2NyaXB0b3ItPnJlc2VydmVkX3JhbmdlKGkpLT5zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPnJlc2VydmVkX3JhbmdlKGkpLT5lbmQpKTsKKyAgfQorICAvLyBIYW5kbGUgdGhlIG5lc3RlZCBtZXNzYWdlcy9ncm91cHMgaW4gZGVjbGFyYXRpb24gb3JkZXIgdG8gbWFrZSBpdAorICAvLyBwb3N0LW9yZGVyIHN0cmljdC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBuZXN0ZWRfZGVzYyA9IGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlKGkpOworICAgIGlmIChncm91cHMuZmluZChuZXN0ZWRfZGVzYykgIT0gZ3JvdXBzLmVuZCgpKSB7CisgICAgICBHYXRoZXJPY2N1cGllZEZpZWxkUmFuZ2VzKG5lc3RlZF9kZXNjLCByYW5nZXMsIG5lc3RlZF9tZXNzYWdlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG5lc3RlZF9tZXNzYWdlcy0+cHVzaF9iYWNrKG5lc3RlZF9kZXNjKTsKKyAgICB9CisgIH0KK30KKworLy8gVXRpbGl0eSBmdW5jdGlvbiBmb3IgUHJpbnRGcmVlRmllbGROdW1iZXJzLgorLy8gQWN0dWFsbHkgcHJpbnRzIHRoZSBmb3JtYXR0ZWQgZnJlZSBmaWVsZCBudW1iZXJzIGZvciBnaXZlbiBtZXNzYWdlIG5hbWUgYW5kCisvLyBvY2N1cGllZCByYW5nZXMuCit2b2lkIEZvcm1hdEZyZWVGaWVsZE51bWJlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8RmllbGRSYW5nZT4mIHJhbmdlcykgeworICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisgIFN0cmluZ0FwcGVuZEYoJm91dHB1dCwgIiUtMzVzIGZyZWU6IiwgbmFtZS5jX3N0cigpKTsKKyAgaW50IG5leHRfZnJlZV9udW1iZXIgPSAxOworICBmb3IgKHN0ZDo6c2V0PEZpZWxkUmFuZ2U+Ojpjb25zdF9pdGVyYXRvciBpID0gcmFuZ2VzLmJlZ2luKCk7CisgICAgICAgaSAhPSByYW5nZXMuZW5kKCk7ICsraSkgeworICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIGdyb3VwcyByZS11c2UgcGFyZW50IGZpZWxkIG51bWJlcnMsIGluIHdoaWNoCisgICAgLy8gY2FzZSB3ZSBza2lwIHRoZSBGaWVsZFJhbmdlIGVudGlyZWx5LgorICAgIGlmIChuZXh0X2ZyZWVfbnVtYmVyID49IGktPnNlY29uZCkgY29udGludWU7CisKKyAgICBpZiAobmV4dF9mcmVlX251bWJlciA8IGktPmZpcnN0KSB7CisgICAgICBpZiAobmV4dF9mcmVlX251bWJlciArIDEgPT0gaS0+Zmlyc3QpIHsKKyAgICAgICAgLy8gU2luZ2xldG9uCisgICAgICAgIFN0cmluZ0FwcGVuZEYoJm91dHB1dCwgIiAlZCIsIG5leHRfZnJlZV9udW1iZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUmFuZ2UKKyAgICAgICAgU3RyaW5nQXBwZW5kRigmb3V0cHV0LCAiICVkLSVkIiwgbmV4dF9mcmVlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktPmZpcnN0IC0gMSk7CisgICAgICB9CisgICAgfQorICAgIG5leHRfZnJlZV9udW1iZXIgPSBpLT5zZWNvbmQ7CisgIH0KKyAgaWYgKG5leHRfZnJlZV9udW1iZXIgPD0gRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyKSB7CisgICAgU3RyaW5nQXBwZW5kRigmb3V0cHV0LCAiICVkLUlORiIsIG5leHRfZnJlZV9udW1iZXIpOworICB9CisgIHN0ZDo6Y291dCA8PCBvdXRwdXQgPDwgc3RkOjplbmRsOworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZTo6UHJpbnRGcmVlRmllbGROdW1iZXJzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgc3RkOjpzZXQ8RmllbGRSYW5nZT4gcmFuZ2VzOworICBzdGQ6OnZlY3Rvcjxjb25zdCBEZXNjcmlwdG9yKj4gbmVzdGVkX21lc3NhZ2VzOworICBHYXRoZXJPY2N1cGllZEZpZWxkUmFuZ2VzKGRlc2NyaXB0b3IsICZyYW5nZXMsICZuZXN0ZWRfbWVzc2FnZXMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkX21lc3NhZ2VzLnNpemUoKTsgKytpKSB7CisgICAgUHJpbnRGcmVlRmllbGROdW1iZXJzKG5lc3RlZF9tZXNzYWdlc1tpXSk7CisgIH0KKyAgRm9ybWF0RnJlZUZpZWxkTnVtYmVycyhkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSwgcmFuZ2VzKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODQyNTUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw0NjQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBJbXBsZW1lbnRzIHRoZSBQcm90b2NvbCBDb21waWxlciBmcm9udC1lbmQgc3VjaCB0aGF0IGl0IG1heSBiZSByZXVzZWQgYnkKKy8vIGN1c3RvbSBjb21waWxlcnMgd3JpdHRlbiB0byBzdXBwb3J0IG90aGVyIGxhbmd1YWdlcy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ09NTUFORF9MSU5FX0lOVEVSRkFDRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NPTU1BTkRfTElORV9JTlRFUkZBQ0VfSF9fCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIERlc2NyaXB0b3I7ICAgICAgICAgICAvLyBkZXNjcmlwdG9yLmgKK2NsYXNzIERlc2NyaXB0b3JEYXRhYmFzZTsgICAvLyBkZXNjcmlwdG9yX2RhdGFiYXNlLmgKK2NsYXNzIERlc2NyaXB0b3JQb29sOyAgICAgICAvLyBkZXNjcmlwdG9yLmgKK2NsYXNzIEZpbGVEZXNjcmlwdG9yOyAgICAgICAvLyBkZXNjcmlwdG9yLmgKK2NsYXNzIEZpbGVEZXNjcmlwdG9yU2V0OyAgICAvLyBkZXNjcmlwdG9yLmgKK2NsYXNzIEZpbGVEZXNjcmlwdG9yUHJvdG87ICAvLyBkZXNjcmlwdG9yLnBiLmgKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUmVwZWF0ZWRQdHJGaWVsZDsgICAgICAgICAgLy8gcmVwZWF0ZWRfZmllbGQuaAorY2xhc3MgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOyAgLy8gZGVzY3JpcHRvcl9kYXRhYmFzZS5oCisKK25hbWVzcGFjZSBjb21waWxlciB7CisKK2NsYXNzIENvZGVHZW5lcmF0b3I7ICAgICAvLyBjb2RlX2dlbmVyYXRvci5oCitjbGFzcyBHZW5lcmF0b3JDb250ZXh0OyAgLy8gY29kZV9nZW5lcmF0b3IuaAorY2xhc3MgRGlza1NvdXJjZVRyZWU7ICAgIC8vIGltcG9ydGVyLmgKKworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIHRvIHRoZSBwcm90b2NvbCBjb21waWxlci4KKy8vIEl0IGlzIGRlc2lnbmVkIHRvIG1ha2UgaXQgdmVyeSBlYXN5IHRvIGNyZWF0ZSBhIGN1c3RvbSBwcm90b2NvbCBjb21waWxlcgorLy8gc3VwcG9ydGluZyB0aGUgbGFuZ3VhZ2VzIG9mIHlvdXIgY2hvaWNlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8KKy8vIGNyZWF0ZSBhIGN1c3RvbSBwcm90b2NvbCBjb21waWxlciBiaW5hcnkgd2hpY2ggaW5jbHVkZXMgYm90aCB0aGUgcmVndWxhcgorLy8gQysrIHN1cHBvcnQgcGx1cyBzdXBwb3J0IGZvciB5b3VyIG93biBjdXN0b20gb3V0cHV0ICJGb28iLCB5b3Ugd291bGQKKy8vIHdyaXRlIGEgY2xhc3MgIkZvb0dlbmVyYXRvciIgd2hpY2ggaW1wbGVtZW50cyB0aGUgQ29kZUdlbmVyYXRvciBpbnRlcmZhY2UsCisvLyB0aGVuIHdyaXRlIGEgbWFpbigpIHByb2NlZHVyZSBsaWtlIHRoaXM6CisvLworLy8gICBpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisvLyAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvbW1hbmRMaW5lSW50ZXJmYWNlIGNsaTsKKy8vCisvLyAgICAgLy8gU3VwcG9ydCBnZW5lcmF0aW9uIG9mIEMrKyBzb3VyY2UgYW5kIGhlYWRlcnMuCisvLyAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OmNwcDo6Q3BwR2VuZXJhdG9yIGNwcF9nZW5lcmF0b3I7CisvLyAgICAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWNwcF9vdXQiLCAmY3BwX2dlbmVyYXRvciwKKy8vICAgICAgICJHZW5lcmF0ZSBDKysgc291cmNlIGFuZCBoZWFkZXIuIik7CisvLworLy8gICAgIC8vIFN1cHBvcnQgZ2VuZXJhdGlvbiBvZiBGb28gY29kZS4KKy8vICAgICBGb29HZW5lcmF0b3IgZm9vX2dlbmVyYXRvcjsKKy8vICAgICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tZm9vX291dCIsICZmb29fZ2VuZXJhdG9yLAorLy8gICAgICAgIkdlbmVyYXRlIEZvbyBmaWxlLiIpOworLy8KKy8vICAgICByZXR1cm4gY2xpLlJ1bihhcmdjLCBhcmd2KTsKKy8vICAgfQorLy8KKy8vIFRoZSBjb21waWxlciBpcyBpbnZva2VkIHdpdGggc3ludGF4IGxpa2U6CisvLyAgIHByb3RvYyAtLWNwcF9vdXQ9b3V0ZGlyIC0tZm9vX291dD1vdXRkaXIgLS1wcm90b19wYXRoPXNyYyBzcmMvZm9vLnByb3RvCisvLworLy8gVGhlIC5wcm90byBmaWxlIHRvIGNvbXBpbGUgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIHVzaW5nIGVpdGhlcgorLy8gaXRzIHBoeXNpY2FsIGZpbGUgcGF0aCwgb3IgYSB2aXJ0dWFsIHBhdGggcmVsYXRpdmUgdG8gYSBkaXJlY3Rvcnkgc3BlY2lmaWVkCisvLyBpbiAtLXByb3RvX3BhdGguIEZvciBleGFtcGxlLCBmb3Igc3JjL2Zvby5wcm90bywgdGhlIGZvbGxvd2luZyB0d28gcHJvdG9jCisvLyBpbnZvY2F0aW9ucyB3b3JrIHRoZSBzYW1lIHdheToKKy8vICAgMS4gcHJvdG9jIC0tcHJvdG9fcGF0aD1zcmMgc3JjL2Zvby5wcm90byAocGh5c2ljYWwgZmlsZSBwYXRoKQorLy8gICAyLiBwcm90b2MgLS1wcm90b19wYXRoPXNyYyBmb28ucHJvdG8gKHZpcnR1YWwgcGF0aCByZWxhdGl2ZSB0byBzcmMpCisvLworLy8gSWYgYSBmaWxlIHBhdGggY2FuIGJlIGludGVycHJldGVkIGJvdGggYXMgYSBwaHlzaWNhbCBmaWxlIHBhdGggYW5kIGFzIGEKKy8vIHJlbGF0aXZlIHZpcnR1YWwgcGF0aCwgdGhlIHBoeXNpY2FsIGZpbGUgcGF0aCB0YWtlcyBwcmVjZWRlbmNlLgorLy8KKy8vIEZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQtbGluZSBzeW50YXgsIGludm9rZSBpdCB3aXRoIC0taGVscC4KK2NsYXNzIFBST1RPQ19FWFBPUlQgQ29tbWFuZExpbmVJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtQYXRoU2VwYXJhdG9yOworCisgIENvbW1hbmRMaW5lSW50ZXJmYWNlKCk7CisgIH5Db21tYW5kTGluZUludGVyZmFjZSgpOworCisgIC8vIFJlZ2lzdGVyIGEgY29kZSBnZW5lcmF0b3IgZm9yIGEgbGFuZ3VhZ2UuCisgIC8vCisgIC8vIFBhcmFtZXRlcnM6CisgIC8vICogZmxhZ19uYW1lOiBUaGUgY29tbWFuZC1saW5lIGZsYWcgdXNlZCB0byBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIG9mCisgIC8vICAgdGhpcyB0eXBlLiAgVGhlIG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgJy0nLiAgSWYgdGhlIG5hbWUgaXMgbG9uZ2VyCisgIC8vICAgdGhhbiBvbmUgbGV0dGVyLCBpdCBtdXN0IHN0YXJ0IHdpdGggdHdvICctJ3MuCisgIC8vICogZ2VuZXJhdG9yOiBUaGUgQ29kZUdlbmVyYXRvciB3aGljaCB3aWxsIGJlIGNhbGxlZCB0byBnZW5lcmF0ZSBmaWxlcworICAvLyAgIG9mIHRoaXMgdHlwZS4KKyAgLy8gKiBoZWxwX3RleHQ6IFRleHQgZGVzY3JpYmluZyB0aGlzIGZsYWcgaW4gdGhlIC0taGVscCBvdXRwdXQuCisgIC8vCisgIC8vIFNvbWUgZ2VuZXJhdG9ycyBhY2NlcHQgZXh0cmEgcGFyYW1ldGVycy4gIFlvdSBjYW4gc3BlY2lmeSB0aGlzIHBhcmFtZXRlcgorICAvLyBvbiB0aGUgY29tbWFuZC1saW5lIGJ5IHBsYWNpbmcgaXQgYmVmb3JlIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBzZXBhcmF0ZWQKKyAgLy8gYnkgYSBjb2xvbjoKKyAgLy8gICBwcm90b2MgLS1mb29fb3V0PWVuYWJsZV9iYXI6b3V0ZGlyCisgIC8vIFRoZSB0ZXh0IGJlZm9yZSB0aGUgY29sb24gaXMgcGFzc2VkIHRvIENvZGVHZW5lcmF0b3I6OkdlbmVyYXRlKCkgYXMgdGhlCisgIC8vICJwYXJhbWV0ZXIiLgorICB2b2lkIFJlZ2lzdGVyR2VuZXJhdG9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX25hbWUsIENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaGVscF90ZXh0KTsKKworICAvLyBSZWdpc3RlciBhIGNvZGUgZ2VuZXJhdG9yIGZvciBhIGxhbmd1YWdlLgorICAvLyBCZXNpZGVzIGZsYWdfbmFtZSB5b3UgY2FuIHNwZWNpZnkgYW5vdGhlciBvcHRpb25fZmxhZ19uYW1lIHRoYXQgY291bGQgYmUKKyAgLy8gdXNlZCB0byBwYXNzIGV4dHJhIHBhcmFtZXRlcnMgdG8gdGhlIHJlZ2lzdGVyZWQgY29kZSBnZW5lcmF0b3IuCisgIC8vIFN1cHBvc2UgeW91IGhhdmUgcmVnaXN0ZXJlZCBhIGdlbmVyYXRvciBieSBjYWxsaW5nOgorICAvLyAgIGNvbW1hbmRfbGluZV9pbnRlcmZhY2UuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tZm9vX291dCIsICItLWZvb19vcHQiLCAuLi4pCisgIC8vIFRoZW4geW91IGNvdWxkIGludm9rZSB0aGUgY29tcGlsZXIgd2l0aCBhIGNvbW1hbmQgbGlrZToKKyAgLy8gICBwcm90b2MgLS1mb29fb3V0PWVuYWJsZV9iYXI6b3V0ZGlyIC0tZm9vX29wdD1lbmFibGVfYmF6CisgIC8vIFRoaXMgd2lsbCBwYXNzICJlbmFibGVfYmFyLGVuYWJsZV9iYXoiIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlIGdlbmVyYXRvci4KKyAgdm9pZCBSZWdpc3RlckdlbmVyYXRvcihjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fZmxhZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaGVscF90ZXh0KTsKKworICAvLyBFbmFibGVzICJwbHVnaW5zIi4gIEluIHRoaXMgbW9kZSwgaWYgYSBjb21tYW5kLWxpbmUgZmxhZyBlbmRzIHdpdGggIl9vdXQiCisgIC8vIGJ1dCBkb2VzIG5vdCBtYXRjaCBhbnkgcmVnaXN0ZXJlZCBnZW5lcmF0b3IsIHRoZSBjb21waWxlciB3aWxsIGF0dGVtcHQgdG8KKyAgLy8gZmluZCBhICJwbHVnaW4iIHRvIGltcGxlbWVudCB0aGUgZ2VuZXJhdG9yLiAgUGx1Z2lucyBhcmUganVzdCBleGVjdXRhYmxlcy4KKyAgLy8gVGhleSBzaG91bGQgbGl2ZSBzb21ld2hlcmUgaW4gdGhlIFBBVEguCisgIC8vCisgIC8vIFRoZSBjb21waWxlciBkZXRlcm1pbmVzIHRoZSBleGVjdXRhYmxlIG5hbWUgdG8gc2VhcmNoIGZvciBieSBjb25jYXRlbmF0aW5nCisgIC8vIGV4ZV9uYW1lX3ByZWZpeCB3aXRoIHRoZSB1bnJlY29nbml6ZWQgZmxhZyBuYW1lLCByZW1vdmluZyAiX291dCIuICBTbywgZm9yCisgIC8vIGV4YW1wbGUsIGlmIGV4ZV9uYW1lX3ByZWZpeCBpcyAicHJvdG9jLSIgYW5kIHlvdSBwYXNzIHRoZSBmbGFnIC0tZm9vX291dCwKKyAgLy8gdGhlIGNvbXBpbGVyIHdpbGwgdHJ5IHRvIHJ1biB0aGUgcHJvZ3JhbSAicHJvdG9jLWdlbi1mb28iLgorICAvLworICAvLyBUaGUgcGx1Z2luIHByb2dyYW0gc2hvdWxkIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHVzYWdlOgorICAvLyAgIHBsdWdpbiBbLS1vdXQ9T1VURElSXSBbLS1wYXJhbWV0ZXI9UEFSQU1FVEVSXSBQUk9UT19GSUxFUyA8IERFU0NSSVBUT1JTCisgIC8vIC0tb3V0IGluZGljYXRlcyB0aGUgb3V0cHV0IGRpcmVjdG9yeSAoYXMgcGFzc2VkIHRvIHRoZSAtLWZvb19vdXQKKyAgLy8gcGFyYW1ldGVyKTsgaWYgb21pdHRlZCwgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHNob3VsZCBiZSB1c2VkLiAgLS1wYXJhbWV0ZXIKKyAgLy8gZ2l2ZXMgdGhlIGdlbmVyYXRvciBwYXJhbWV0ZXIsIGlmIGFueSB3YXMgcHJvdmlkZWQgKHNlZSBiZWxvdykuICBUaGUKKyAgLy8gUFJPVE9fRklMRVMgbGlzdCB0aGUgLnByb3RvIGZpbGVzIHdoaWNoIHdlcmUgZ2l2ZW4gb24gdGhlIGNvbXBpbGVyCisgIC8vIGNvbW1hbmQtbGluZTsgdGhlc2UgYXJlIHRoZSBmaWxlcyBmb3Igd2hpY2ggdGhlIHBsdWdpbiBpcyBleHBlY3RlZCB0bworICAvLyBnZW5lcmF0ZSBvdXRwdXQgY29kZS4gIEZpbmFsbHksIERFU0NSSVBUT1JTIGlzIGFuIGVuY29kZWQgRmlsZURlc2NyaXB0b3JTZXQKKyAgLy8gKGFzIGRlZmluZWQgaW4gZGVzY3JpcHRvci5wcm90bykuICBUaGlzIGlzIHBpcGVkIHRvIHRoZSBwbHVnaW4ncyBzdGRpbi4KKyAgLy8gVGhlIHNldCB3aWxsIGluY2x1ZGUgZGVzY3JpcHRvcnMgZm9yIGFsbCB0aGUgZmlsZXMgbGlzdGVkIGluIFBST1RPX0ZJTEVTIGFzCisgIC8vIHdlbGwgYXMgYWxsIGZpbGVzIHRoYXQgdGhleSBpbXBvcnQuICBUaGUgcGx1Z2luIE1VU1QgTk9UIGF0dGVtcHQgdG8gcmVhZAorICAvLyB0aGUgUFJPVE9fRklMRVMgZGlyZWN0bHkgLS0gaXQgbXVzdCB1c2UgdGhlIEZpbGVEZXNjcmlwdG9yU2V0LgorICAvLworICAvLyBUaGUgcGx1Z2luIHNob3VsZCBnZW5lcmF0ZSB3aGF0ZXZlciBmaWxlcyBhcmUgbmVjZXNzYXJ5LCBhcyBjb2RlIGdlbmVyYXRvcnMKKyAgLy8gbm9ybWFsbHkgZG8uICBJdCBzaG91bGQgd3JpdGUgdGhlIG5hbWVzIG9mIGFsbCBmaWxlcyBpdCBnZW5lcmF0ZXMgdG8KKyAgLy8gc3Rkb3V0LiAgVGhlIG5hbWVzIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeSwgTk9UIGFic29sdXRlCisgIC8vIG5hbWVzIG9yIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIElmIGFueSBlcnJvcnMgb2NjdXIsIGVycm9yCisgIC8vIG1lc3NhZ2VzIHNob3VsZCBiZSB3cml0dGVuIHRvIHN0ZGVyci4gIElmIGFuIGVycm9yIGlzIGZhdGFsLCB0aGUgcGx1Z2luCisgIC8vIHNob3VsZCBleGl0IHdpdGggYSBub24temVybyBleGl0IGNvZGUuCisgIC8vCisgIC8vIFBsdWdpbnMgY2FuIGhhdmUgZ2VuZXJhdG9yIHBhcmFtZXRlcnMgc2ltaWxhciB0byBub3JtYWwgYnVpbHQtaW4KKyAgLy8gZ2VuZXJhdG9ycy4gRXh0cmEgZ2VuZXJhdG9yIHBhcmFtZXRlcnMgY2FuIGJlIHBhc3NlZCBpbiB2aWEgYSBtYXRjaGluZworICAvLyAiX29wdCIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZToKKyAgLy8gICBwcm90b2MgLS1wbHVnX291dD1lbmFibGVfYmFyOm91dGRpciAtLXBsdWdfb3B0PWVuYWJsZV9iYXoKKyAgLy8gVGhpcyB3aWxsIHBhc3MgImVuYWJsZV9iYXIsZW5hYmxlX2JheiIgYXMgdGhlIHBhcmFtZXRlciB0byB0aGUgcGx1Z2luLgorICAvLworICB2b2lkIEFsbG93UGx1Z2lucyhjb25zdCBzdGQ6OnN0cmluZyYgZXhlX25hbWVfcHJlZml4KTsKKworICAvLyBSdW4gdGhlIFByb3RvY29sIENvbXBpbGVyIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXJzLgorICAvLyBSZXR1cm5zIHRoZSBlcnJvciBjb2RlIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBieSBtYWluKCkuCisgIC8vCisgIC8vIEl0IG1heSBub3QgYmUgc2FmZSB0byBjYWxsIFJ1bigpIGluIGEgbXVsdGktdGhyZWFkZWQgZW52aXJvbm1lbnQgYmVjYXVzZQorICAvLyBpdCBjYWxscyBzdHJlcnJvcigpLiAgSSdtIG5vdCBzdXJlIHdoeSB5b3UnZCB3YW50IHRvIGRvIHRoaXMgYW55d2F5LgorICBpbnQgUnVuKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pOworCisgIC8vIERFUFJFQ0FURUQuIENhbGxpbmcgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC4gUHJvdG9jb2wgY29tcGlsZXIgbm93CisgIC8vIGFsd2F5cyB0cnkgdG8gZmluZCB0aGUgLnByb3RvIGZpbGUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisgIC8vIGZpcnN0IGFuZCBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQsIGl0IHdpbGwgdGhlbiB0cmVhdCB0aGUgaW5wdXQgcGF0aAorICAvLyBhcyBhIHZpcnR1YWwgcGF0aC4KKyAgdm9pZCBTZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZShib29sIC8qIGVuYWJsZSAqLykge30KKworICAvLyBQcm92aWRlcyBzb21lIHRleHQgd2hpY2ggd2lsbCBiZSBwcmludGVkIHdoZW4gdGhlIC0tdmVyc2lvbiBmbGFnIGlzCisgIC8vIHVzZWQuICBUaGUgdmVyc2lvbiBvZiBsaWJwcm90b2Mgd2lsbCBhbHNvIGJlIHByaW50ZWQgb24gdGhlIG5leHQgbGluZQorICAvLyBhZnRlciB0aGlzIHRleHQuCisgIHZvaWQgU2V0VmVyc2lvbkluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpIHsgdmVyc2lvbl9pbmZvXyA9IHRleHQ7IH0KKworCisgcHJpdmF0ZToKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBjbGFzcyBFcnJvclByaW50ZXI7CisgIGNsYXNzIEdlbmVyYXRvckNvbnRleHRJbXBsOworICBjbGFzcyBNZW1vcnlPdXRwdXRTdHJlYW07CisgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8R2VuZXJhdG9yQ29udGV4dEltcGw+PgorICAgICAgR2VuZXJhdG9yQ29udGV4dE1hcDsKKworICAvLyBDbGVhciBzdGF0ZSBmcm9tIHByZXZpb3VzIFJ1bigpLgorICB2b2lkIENsZWFyKCk7CisKKyAgLy8gUmVtYXBzIHRoZSBwcm90byBmaWxlIHNvIHRoYXQgaXQgaXMgcmVsYXRpdmUgdG8gb25lIG9mIHRoZSBkaXJlY3RvcmllcworICAvLyBpbiBwcm90b19wYXRoXy4gIFJldHVybnMgZmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgIGJvb2wgTWFrZVByb3RvUHJvdG9QYXRoUmVsYXRpdmUoRGlza1NvdXJjZVRyZWUqIHNvdXJjZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yRGF0YWJhc2UqIGZhbGxiYWNrX2RhdGFiYXNlKTsKKworICAvLyBSZW1hcHMgZWFjaCBmaWxlIGluIGlucHV0X2ZpbGVzXyBzbyB0aGF0IGl0IGlzIHJlbGF0aXZlIHRvIG9uZSBvZiB0aGUKKyAgLy8gZGlyZWN0b3JpZXMgaW4gcHJvdG9fcGF0aF8uICBSZXR1cm5zIGZhbHNlIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICBib29sIE1ha2VJbnB1dHNCZVByb3RvUGF0aFJlbGF0aXZlKERpc2tTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yRGF0YWJhc2UqIGZhbGxiYWNrX2RhdGFiYXNlKTsKKworICAvLyBGYWlscyBpZiB0aGVzZSBmaWxlcyB1c2UgcHJvdG8zIG9wdGlvbmFsIGFuZCB0aGUgY29kZSBnZW5lcmF0b3IgZG9lc24ndAorICAvLyBzdXBwb3J0IGl0LiBUaGlzIGlzIGEgcGVybWFuZW50IGNoZWNrLgorICBib29sIEVuZm9yY2VQcm90bzNPcHRpb25hbFN1cHBvcnQoCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29kZWdlbl9uYW1lLCB1aW50NjRfdCBzdXBwb3J0ZWRfZmVhdHVyZXMsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMpIGNvbnN0OworCisKKyAgLy8gUmV0dXJuIHN0YXR1cyBmb3IgUGFyc2VBcmd1bWVudHMoKSBhbmQgSW50ZXJwcmV0QXJndW1lbnQoKS4KKyAgZW51bSBQYXJzZUFyZ3VtZW50U3RhdHVzIHsKKyAgICBQQVJTRV9BUkdVTUVOVF9ET05FX0FORF9DT05USU5VRSwKKyAgICBQQVJTRV9BUkdVTUVOVF9ET05FX0FORF9FWElULAorICAgIFBBUlNFX0FSR1VNRU5UX0ZBSUwKKyAgfTsKKworICAvLyBQYXJzZSBhbGwgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KKyAgUGFyc2VBcmd1bWVudFN0YXR1cyBQYXJzZUFyZ3VtZW50cyhpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgYXJndltdKTsKKworICAvLyBSZWFkIGFuIGFyZ3VtZW50IGZpbGUgYW5kIGFwcGVuZCB0aGUgZmlsZSdzIGNvbnRlbnQgdG8gdGhlIGxpc3Qgb2YKKyAgLy8gYXJndW1lbnRzLiBSZXR1cm4gZmFsc2UgaWYgdGhlIGZpbGUgY2Fubm90IGJlIHJlYWQuCisgIGJvb2wgRXhwYW5kQXJndW1lbnRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGFyZ3VtZW50cyk7CisKKyAgLy8gUGFyc2VzIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50IGludG8gYSBuYW1lL3ZhbHVlIHBhaXIuICBSZXR1cm5zCisgIC8vIHRydWUgaWYgdGhlIG5leHQgYXJndW1lbnQgaW4gdGhlIGFyZ3Ygc2hvdWxkIGJlIHVzZWQgYXMgdGhlIHZhbHVlLAorICAvLyBmYWxzZSBvdGhlcndpc2UuCisgIC8vCisgIC8vIEV4YW1wbGVzOgorICAvLyAgICItSXNyYy9wcm90b3MiIC0+CisgIC8vICAgICBuYW1lID0gIi1JIiwgdmFsdWUgPSAic3JjL3Byb3RvcyIKKyAgLy8gICAiLS1jcHBfb3V0PXNyYy9mb28ucGIyLmNjIiAtPgorICAvLyAgICAgbmFtZSA9ICItLWNwcF9vdXQiLCB2YWx1ZSA9ICJzcmMvZm9vLnBiMi5jYyIKKyAgLy8gICAiZm9vLnByb3RvIiAtPgorICAvLyAgICAgbmFtZSA9ICIiLCB2YWx1ZSA9ICJmb28ucHJvdG8iCisgIGJvb2wgUGFyc2VBcmd1bWVudChjb25zdCBjaGFyKiBhcmcsIHN0ZDo6c3RyaW5nKiBuYW1lLCBzdGQ6OnN0cmluZyogdmFsdWUpOworCisgIC8vIEludGVycHJldHMgYXJndW1lbnRzIHBhcnNlZCB3aXRoIFBhcnNlQXJndW1lbnQuCisgIFBhcnNlQXJndW1lbnRTdGF0dXMgSW50ZXJwcmV0QXJndW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKworICAvLyBQcmludCB0aGUgLS1oZWxwIHRleHQgdG8gc3RkZXJyLgorICB2b2lkIFByaW50SGVscFRleHQoKTsKKworICAvLyBMb2FkcyBwcm90b19wYXRoXyBpbnRvIHRoZSBwcm92aWRlZCBzb3VyY2VfdHJlZS4KKyAgYm9vbCBJbml0aWFsaXplRGlza1NvdXJjZVRyZWUoRGlza1NvdXJjZVRyZWUqIHNvdXJjZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yRGF0YWJhc2UqIGZhbGxiYWNrX2RhdGFiYXNlKTsKKworICAvLyBWZXJpZnkgdGhhdCBhbGwgdGhlIGlucHV0IGZpbGVzIGV4aXN0IGluIHRoZSBnaXZlbiBkYXRhYmFzZS4KKyAgYm9vbCBWZXJpZnlJbnB1dEZpbGVzSW5EZXNjcmlwdG9ycyhEZXNjcmlwdG9yRGF0YWJhc2UqIGZhbGxiYWNrX2RhdGFiYXNlKTsKKworICAvLyBQYXJzZXMgaW5wdXRfZmlsZXNfIGludG8gcGFyc2VkX2ZpbGVzCisgIGJvb2wgUGFyc2VJbnB1dEZpbGVzKERlc2NyaXB0b3JQb29sKiBkZXNjcmlwdG9yX3Bvb2wsCisgICAgICAgICAgICAgICAgICAgICAgIERpc2tTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiogcGFyc2VkX2ZpbGVzKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgZ2l2ZW4gb3V0cHV0IGZpbGUgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQuCisgIHN0cnVjdCBPdXRwdXREaXJlY3RpdmU7ICAvLyBzZWUgYmVsb3cKKyAgYm9vbCBHZW5lcmF0ZU91dHB1dChjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3V0cHV0RGlyZWN0aXZlJiBvdXRwdXRfZGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0KTsKKyAgYm9vbCBHZW5lcmF0ZVBsdWdpbk91dHB1dCgKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4mIHBhcnNlZF9maWxlcywKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwbHVnaW5fbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0LCBzdGQ6OnN0cmluZyogZXJyb3IpOworCisgIC8vIEltcGxlbWVudHMgLS1lbmNvZGUgYW5kIC0tZGVjb2RlLgorICBib29sIEVuY29kZU9yRGVjb2RlKGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKTsKKworICAvLyBJbXBsZW1lbnRzIHRoZSAtLWRlc2NyaXB0b3Jfc2V0X291dCBvcHRpb24uCisgIGJvb2wgV3JpdGVEZXNjcmlwdG9yU2V0KAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzKTsKKworICAvLyBJbXBsZW1lbnRzIHRoZSAtLWRlcGVuZGVuY3lfb3V0IG9wdGlvbgorICBib29sIEdlbmVyYXRlRGVwZW5kZW5jeU1hbmlmZXN0RmlsZSgKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4mIHBhcnNlZF9maWxlcywKKyAgICAgIGNvbnN0IEdlbmVyYXRvckNvbnRleHRNYXAmIG91dHB1dF9kaXJlY3RvcmllcywKKyAgICAgIERpc2tTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSk7CisKKyAgLy8gR2V0IGFsbCB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBvZiB0aGUgZ2l2ZW4gZmlsZSAoaW5jbHVkaW5nIHRoZSBmaWxlCisgIC8vIGl0c2VsZiksIGFkZGluZyB0aGVtIHRvIHRoZSBnaXZlbiBsaXN0IG9mIEZpbGVEZXNjcmlwdG9yUHJvdG9zLiAgVGhlCisgIC8vIHByb3RvcyB3aWxsIGJlIG9yZGVyZWQgc3VjaCB0aGF0IGV2ZXJ5IGZpbGUgaXMgbGlzdGVkIGJlZm9yZSBhbnkgZmlsZSB0aGF0CisgIC8vIGRlcGVuZHMgb24gaXQsIHNvIHRoYXQgeW91IGNhbiBjYWxsIERlc2NyaXB0b3JQb29sOjpCdWlsZEZpbGUoKSBvbiB0aGVtCisgIC8vIGluIG9yZGVyLiAgQW55IGZpbGVzIGluICphbHJlYWR5X3NlZW4gd2lsbCBub3QgYmUgYWRkZWQsIGFuZCBlYWNoIGZpbGUKKyAgLy8gYWRkZWQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvICphbHJlYWR5X3NlZW4uICBJZiBpbmNsdWRlX3NvdXJjZV9jb2RlX2luZm8gaXMKKyAgLy8gdHJ1ZSB0aGVuIGluY2x1ZGUgdGhlIHNvdXJjZSBjb2RlIGluZm9ybWF0aW9uIGluIHRoZSBGaWxlRGVzY3JpcHRvclByb3Rvcy4KKyAgLy8gSWYgaW5jbHVkZV9qc29uX25hbWUgaXMgdHJ1ZSwgcG9wdWxhdGUgdGhlIGpzb25fbmFtZSBmaWVsZCBvZgorICAvLyBGaWVsZERlc2NyaXB0b3JQcm90byBmb3IgYWxsIGZpZWxkcy4KKyAgc3RhdGljIHZvaWQgR2V0VHJhbnNpdGl2ZURlcGVuZGVuY2llcygKKyAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBib29sIGluY2x1ZGVfanNvbl9uYW1lLAorICAgICAgYm9vbCBpbmNsdWRlX3NvdXJjZV9jb2RlX2luZm8sCisgICAgICBzdGQ6OnNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+KiBhbHJlYWR5X3NlZW4sCisgICAgICBSZXBlYXRlZFB0ckZpZWxkPEZpbGVEZXNjcmlwdG9yUHJvdG8+KiBvdXRwdXQpOworCisgIC8vIEltcGxlbWVudHMgdGhlIC0tcHJpbnRfZnJlZV9maWVsZF9udW1iZXJzLiBUaGlzIGZ1bmN0aW9uIHByaW50cyBmcmVlIGZpZWxkCisgIC8vIG51bWJlcnMgaW50byBzdGRvdXQgZm9yIHRoZSBtZXNzYWdlIGFuZCBpdCdzIG5lc3RlZCBtZXNzYWdlIHR5cGVzIGluCisgIC8vIHBvc3Qtb3JkZXIsIGkuZS4gbmVzdGVkIHR5cGVzIGZpcnN0LiBQcmludGVkIHJhbmdlIGFyZSBsZWZ0LXJpZ2h0CisgIC8vIGluY2x1c2l2ZSwgaS5lLiBbYSwgYl0uCisgIC8vCisgIC8vIEdyb3VwczoKKyAgLy8gRm9yIGhpc3RvcmljYWwgcmVhc29ucywgZ3JvdXBzIGFyZSBjb25zaWRlcmVkIHRvIHNoYXJlIHRoZSBzYW1lCisgIC8vIGZpZWxkIG51bWJlciBzcGFjZSB3aXRoIHRoZSBwYXJlbnQgbWVzc2FnZSwgdGh1cyBpdCB3aWxsIG5vdCBwcmludCBmcmVlCisgIC8vIGZpZWxkIG51bWJlcnMgZm9yIGdyb3Vwcy4gVGhlIGZpZWxkIG51bWJlcnMgdXNlZCBpbiB0aGUgZ3JvdXBzIGFyZQorICAvLyBleGNsdWRlZCBpbiB0aGUgZnJlZSBmaWVsZCBudW1iZXJzIG9mIHRoZSBwYXJlbnQgbWVzc2FnZS4KKyAgLy8KKyAgLy8gRXh0ZW5zaW9uIFJhbmdlczoKKyAgLy8gRXh0ZW5zaW9uIHJhbmdlcyBhcmUgY29uc2lkZXJlZCBvY3VwcGllZCBmaWVsZCBudW1iZXJzIGFuZCB0aGV5IHdpbGwgbm90IGJlCisgIC8vIGxpc3RlZCBhcyBmcmVlIG51bWJlcnMgaW4gdGhlIG91dHB1dC4KKyAgdm9pZCBQcmludEZyZWVGaWVsZE51bWJlcnMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBUaGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSBhcyBpbnZva2VkIChpLmUuIGFyZ3ZbMF0pLgorICBzdGQ6OnN0cmluZyBleGVjdXRhYmxlX25hbWVfOworCisgIC8vIFZlcnNpb24gaW5mbyBzZXQgd2l0aCBTZXRWZXJzaW9uSW5mbygpLgorICBzdGQ6OnN0cmluZyB2ZXJzaW9uX2luZm9fOworCisgIC8vIFJlZ2lzdGVyZWQgZ2VuZXJhdG9ycy4KKyAgc3RydWN0IEdlbmVyYXRvckluZm8geworICAgIHN0ZDo6c3RyaW5nIGZsYWdfbmFtZTsKKyAgICBzdGQ6OnN0cmluZyBvcHRpb25fZmxhZ19uYW1lOworICAgIENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvcjsKKyAgICBzdGQ6OnN0cmluZyBoZWxwX3RleHQ7CisgIH07CisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEdlbmVyYXRvckluZm8+IEdlbmVyYXRvck1hcDsKKyAgR2VuZXJhdG9yTWFwIGdlbmVyYXRvcnNfYnlfZmxhZ19uYW1lXzsKKyAgR2VuZXJhdG9yTWFwIGdlbmVyYXRvcnNfYnlfb3B0aW9uX25hbWVfOworICAvLyBBIG1hcCBmcm9tIGdlbmVyYXRvciBuYW1lcyB0byB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgdXNpbmcgdGhlIG9wdGlvbgorICAvLyBmbGFnLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHVzZXIgaW52b2tlcyB0aGUgY29tcGlsZXIgd2l0aDoKKyAgLy8gICBwcm90b2MgLS1mb29fb3V0PW91dHB1dGRpciAtLWZvb19vcHQ9ZW5hYmxlX2JhciAuLi4KKyAgLy8gVGhlbiB0aGVyZSB3aWxsIGJlIGFuIGVudHJ5ICgiLS1mb29fb3V0IiwgImVuYWJsZV9iYXIiKSBpbiB0aGlzIG1hcC4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBnZW5lcmF0b3JfcGFyYW1ldGVyc187CisgIC8vIFNpbWlsYXIgdG8gZ2VuZXJhdG9yX3BhcmFtZXRlcnNfLCBidXQgc3RvcmVzIHRoZSBwYXJhbWV0ZXJzIGZvciBwbHVnaW5zLgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHBsdWdpbl9wYXJhbWV0ZXJzXzsKKworICAvLyBTZWUgQWxsb3dQbHVnaW5zKCkuICBJZiB0aGlzIGlzIGVtcHR5LCBwbHVnaW5zIGFyZW4ndCBhbGxvd2VkLgorICBzdGQ6OnN0cmluZyBwbHVnaW5fcHJlZml4XzsKKworICAvLyBNYXBzIHNwZWNpZmljIHBsdWdpbiBuYW1lcyB0byBmaWxlcy4gIFdoZW4gZXhlY3V0aW5nIGEgcGx1Z2luLCB0aGlzIG1hcAorICAvLyBpcyBzZWFyY2hlZCBmaXJzdCB0byBmaW5kIHRoZSBwbHVnaW4gZXhlY3V0YWJsZS4gIElmIG5vdCBmb3VuZCBoZXJlLCB0aGUKKyAgLy8gUEFUSCAob3Igb3RoZXIgT1Mtc3BlY2lmaWMgc2VhcmNoIHN0cmF0ZWd5KSBpcyBzZWFyY2hlZC4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBwbHVnaW5zXzsKKworICAvLyBTdHVmZiBwYXJzZWQgZnJvbSBjb21tYW5kIGxpbmUuCisgIGVudW0gTW9kZSB7CisgICAgTU9ERV9DT01QSUxFLCAgLy8gTm9ybWFsIG1vZGU6ICBwYXJzZSAucHJvdG8gZmlsZXMgYW5kIGNvbXBpbGUgdGhlbS4KKyAgICBNT0RFX0VOQ09ERSwgICAvLyAtLWVuY29kZTogIHJlYWQgdGV4dCBmcm9tIHN0ZGluLCB3cml0ZSBiaW5hcnkgdG8gc3Rkb3V0LgorICAgIE1PREVfREVDT0RFLCAgIC8vIC0tZGVjb2RlOiAgcmVhZCBiaW5hcnkgZnJvbSBzdGRpbiwgd3JpdGUgdGV4dCB0byBzdGRvdXQuCisgICAgTU9ERV9QUklOVCwgICAgLy8gUHJpbnQgbW9kZTogcHJpbnQgaW5mbyBvZiB0aGUgZ2l2ZW4gLnByb3RvIGZpbGVzIGFuZCBleGl0LgorICB9OworCisgIE1vZGUgbW9kZV8gPSBNT0RFX0NPTVBJTEU7CisKKyAgZW51bSBQcmludE1vZGUgeworICAgIFBSSU5UX05PTkUsICAgICAgICAgLy8gTm90IGluIE1PREVfUFJJTlQKKyAgICBQUklOVF9GUkVFX0ZJRUxEUywgIC8vIC0tcHJpbnRfZnJlZV9maWVsZHMKKyAgfTsKKworICBQcmludE1vZGUgcHJpbnRfbW9kZV8gPSBQUklOVF9OT05FOworCisgIGVudW0gRXJyb3JGb3JtYXQgeworICAgIEVSUk9SX0ZPUk1BVF9HQ0MsICAvLyBHQ0MgZXJyb3Igb3V0cHV0IGZvcm1hdCAoZGVmYXVsdCkuCisgICAgRVJST1JfRk9STUFUX01TVlMgIC8vIFZpc3VhbCBTdHVkaW8gb3V0cHV0ICgtLWVycm9yX2Zvcm1hdD1tc3ZzKS4KKyAgfTsKKworICBFcnJvckZvcm1hdCBlcnJvcl9mb3JtYXRfID0gRVJST1JfRk9STUFUX0dDQzsKKworICAvLyBUcnVlIGlmIHdlIHNob3VsZCB0cmVhdCB3YXJuaW5ncyBhcyBlcnJvcnMgdGhhdCBmYWlsIHRoZSBjb21waWxhdGlvbi4KKyAgYm9vbCBmYXRhbF93YXJuaW5nc18gPSBmYWxzZTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiA+CisgICAgICBwcm90b19wYXRoXzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWFyY2ggcGF0aCBmb3IgcHJvdG8gZmlsZXMuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbnB1dF9maWxlc187ICAvLyBOYW1lcyBvZiB0aGUgaW5wdXQgcHJvdG8gZmlsZXMuCisKKyAgLy8gTmFtZXMgb2YgcHJvdG8gZmlsZXMgd2hpY2ggYXJlIGFsbG93ZWQgdG8gYmUgaW1wb3J0ZWQuIFVzZWQgYnkgYnVpbGQKKyAgLy8gc3lzdGVtcyB0byBlbmZvcmNlIGRlcGVuZC1vbi13aGF0LXlvdS1pbXBvcnQuCisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBkaXJlY3RfZGVwZW5kZW5jaWVzXzsKKyAgYm9vbCBkaXJlY3RfZGVwZW5kZW5jaWVzX2V4cGxpY2l0bHlfc2V0XyA9IGZhbHNlOworCisgIC8vIElmIHRoZXJlJ3MgYSB2aW9sYXRpb24gb2YgZGVwZW5kLW9uLXdoYXQteW91LWltcG9ydCwgdGhpcyBzdHJpbmcgd2lsbCBiZQorICAvLyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuICIlcyIgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB2aW9sYXRpbmcgaW1wb3J0LgorICBzdGQ6OnN0cmluZyBkaXJlY3RfZGVwZW5kZW5jaWVzX3Zpb2xhdGlvbl9tc2dfOworCisgIC8vIG91dHB1dF9kaXJlY3RpdmVzXyBsaXN0cyBhbGwgdGhlIGZpbGVzIHdlIGFyZSBzdXBwb3NlZCB0byBvdXRwdXQgYW5kIHdoYXQKKyAgLy8gZ2VuZXJhdG9yIHRvIHVzZSBmb3IgZWFjaC4KKyAgc3RydWN0IE91dHB1dERpcmVjdGl2ZSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsgICAgICAgICAgLy8gRS5nLiAiLS1mb29fb3V0IgorICAgIENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvcjsgIC8vIE5VTEwgZm9yIHBsdWdpbnMKKyAgICBzdGQ6OnN0cmluZyBwYXJhbWV0ZXI7CisgICAgc3RkOjpzdHJpbmcgb3V0cHV0X2xvY2F0aW9uOworICB9OworICBzdGQ6OnZlY3RvcjxPdXRwdXREaXJlY3RpdmU+IG91dHB1dF9kaXJlY3RpdmVzXzsKKworICAvLyBXaGVuIHVzaW5nIC0tZW5jb2RlIG9yIC0tZGVjb2RlLCB0aGlzIG5hbWVzIHRoZSB0eXBlIHdlIGFyZSBlbmNvZGluZyBvcgorICAvLyBkZWNvZGluZy4gIChFbXB0eSBzdHJpbmcgaW5kaWNhdGVzIC0tZGVjb2RlX3Jhdy4pCisgIHN0ZDo6c3RyaW5nIGNvZGVjX3R5cGVfOworCisgIC8vIElmIC0tZGVzY3JpcHRvcl9zZXRfaW4gd2FzIGdpdmVuLCB0aGVzZSBhcmUgZmlsZW5hbWVzIGNvbnRhaW5pbmcKKyAgLy8gcGFyc2VkIEZpbGVEZXNjcmlwdG9yU2V0cyB0byBiZSB1c2VkIGZvciBsb2FkaW5nIHByb3Rvcy4gIE90aGVyd2lzZSwgZW1wdHkuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZXNjcmlwdG9yX3NldF9pbl9uYW1lc187CisKKyAgLy8gSWYgLS1kZXNjcmlwdG9yX3NldF9vdXQgd2FzIGdpdmVuLCB0aGlzIGlzIHRoZSBmaWxlbmFtZSB0byB3aGljaCB0aGUKKyAgLy8gRmlsZURlc2NyaXB0b3JTZXQgc2hvdWxkIGJlIHdyaXR0ZW4uICBPdGhlcndpc2UsIGVtcHR5LgorICBzdGQ6OnN0cmluZyBkZXNjcmlwdG9yX3NldF9vdXRfbmFtZV87CisKKyAgLy8gSWYgLS1kZXBlbmRlbmN5X291dCB3YXMgZ2l2ZW4sIHRoaXMgaXMgdGhlIHBhdGggdG8gdGhlIGZpbGUgd2hlcmUgdGhlCisgIC8vIGRlcGVuZGVuY3kgZmlsZSB3aWxsIGJlIHdyaXR0ZW4uIE90aGVyd2lzZSwgZW1wdHkuCisgIHN0ZDo6c3RyaW5nIGRlcGVuZGVuY3lfb3V0X25hbWVfOworCisgIC8vIFRydWUgaWYgLS1pbmNsdWRlX2ltcG9ydHMgd2FzIGdpdmVuLCBtZWFuaW5nIHRoYXQgd2Ugc2hvdWxkCisgIC8vIHdyaXRlIGFsbCB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyB0byB0aGUgRGVzY3JpcHRvclNldC4gIE90aGVyd2lzZSwgb25seQorICAvLyB0aGUgLnByb3RvIGZpbGVzIGxpc3RlZCBvbiB0aGUgY29tbWFuZC1saW5lIGFyZSBhZGRlZC4KKyAgYm9vbCBpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XzsKKworICAvLyBUcnVlIGlmIC0taW5jbHVkZV9zb3VyY2VfaW5mbyB3YXMgZ2l2ZW4sIG1lYW5pbmcgdGhhdCB3ZSBzaG91bGQgbm90IHN0cmlwCisgIC8vIFNvdXJjZUNvZGVJbmZvIGZyb20gdGhlIERlc2NyaXB0b3JTZXQuCisgIGJvb2wgc291cmNlX2luZm9faW5fZGVzY3JpcHRvcl9zZXRfID0gZmFsc2U7CisKKyAgLy8gV2FzIHRoZSAtLWRpc2FsbG93X3NlcnZpY2VzIGZsYWcgdXNlZD8KKyAgYm9vbCBkaXNhbGxvd19zZXJ2aWNlc18gPSBmYWxzZTsKKworICAvLyBXaGVuIHVzaW5nIC0tZW5jb2RlLCB0aGlzIHdpbGwgYmUgcGFzc2VkIHRvIFNldFNlcmlhbGl6YXRpb25EZXRlcm1pbmlzdGljLgorICBib29sIGRldGVybWluaXN0aWNfb3V0cHV0XyA9IGZhbHNlOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb21tYW5kTGluZUludGVyZmFjZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DT01NQU5EX0xJTkVfSU5URVJGQUNFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ODEzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwyNzg3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorCisjaWZuZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYW55LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbDIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKworCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworI2lmIGRlZmluZWQoX1dJTjMyKQorLy8gRE8gTk9UIGluY2x1ZGUgPGlvLmg+LCBpbnN0ZWFkIGNyZWF0ZSBmdW5jdGlvbnMgaW4gaW9fd2luMzIue2gsY2N9IGFuZCBpbXBvcnQKKy8vIHRoZW0gbGlrZSB3ZSBkbyBiZWxvdy4KK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6YWNjZXNzOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjpjbG9zZTsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6ZHVwOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjpkdXAyOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjpvcGVuOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjp3cml0ZTsKKyNlbmRpZgorCisvLyBEaXNhYmxlIHRoZSB3aG9sZSB0ZXN0IHdoZW4gd2UgdXNlIHRjbWFsbG9jIGZvciAiZHJhY29uaWFuIiBoZWFwIGNoZWNrcywgaW4KKy8vIHdoaWNoIGNhc2UgdGNtYWxsb2Mgd2lsbCBwcmludCB3YXJuaW5ncyB0aGF0IGZhaWwgdGhlIHBsdWdpbiB0ZXN0cy4KKyNpZiAhR09PR0xFX1BST1RPQlVGX0hFQVBfQ0hFQ0tfRFJBQ09OSUFOCisKKworbmFtZXNwYWNlIHsKKworYm9vbCBGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgIHJldHVybiBGaWxlOjpFeGlzdHMocGF0aCk7Cit9CisKK2NsYXNzIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKKyAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworCisgIC8vIFJ1bnMgdGhlIENvbW1hbmRMaW5lSW50ZXJmYWNlIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQgbGluZS4gIFRoZQorICAvLyBjb21tYW5kIGlzIGF1dG9tYXRpY2FsbHkgc3BsaXQgb24gc3BhY2VzLCBhbmQgdGhlIHN0cmluZyAiJHRtcGRpciIKKyAgLy8gaXMgcmVwbGFjZWQgd2l0aCBUZXN0VGVtcERpcigpLgorICB2b2lkIFJ1bihjb25zdCBzdGQ6OnN0cmluZyYgY29tbWFuZCk7CisgIHZvaWQgUnVuV2l0aEFyZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3MpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIE1ldGhvZHMgdG8gc2V0IHVwIHRoZSB0ZXN0IChjYWxsZWQgYmVmb3JlIFJ1bigpKS4KKworICBjbGFzcyBOdWxsQ29kZUdlbmVyYXRvcjsKKworICAvLyBOb3JtYWxseSBwbHVnaW5zIGFyZSBhbGxvd2VkIGZvciBhbGwgdGVzdHMuICBDYWxsIHRoaXMgdG8gZXhwbGljaXRseQorICAvLyBkaXNhYmxlIHRoZW0uCisgIHZvaWQgRGlzYWxsb3dQbHVnaW5zKCkgeyBkaXNhbGxvd19wbHVnaW5zXyA9IHRydWU7IH0KKworICAvLyBDcmVhdGUgYSB0ZW1wIGZpbGUgd2l0aGluIHRlbXBfZGlyZWN0b3J5XyB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAvLyBUaGUgY29udGFpbmluZyBkaXJlY3RvcnkgaXMgYWxzbyBjcmVhdGVkIGlmIG5lY2Vzc2FyeS4KKyAgdm9pZCBDcmVhdGVUZW1wRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRzKTsKKworICAvLyBDcmVhdGUgYSBzdWJkaXJlY3Rvcnkgd2l0aGluIHRlbXBfZGlyZWN0b3J5Xy4KKyAgdm9pZCBDcmVhdGVUZW1wRGlyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworI2lmZGVmIFBST1RPQlVGX09QRU5TT1VSQ0UKKyAgLy8gQ2hhbmdlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRlbXAgZGlyZWN0b3J5LgorICB2b2lkIFN3aXRjaFRvVGVtcERpcmVjdG9yeSgpIHsKKyAgICBGaWxlOjpDaGFuZ2VXb3JraW5nRGlyZWN0b3J5KHRlbXBfZGlyZWN0b3J5Xyk7CisgIH0KKyNlbHNlICAvLyAhUFJPVE9CVUZfT1BFTlNPVVJDRQorICAvLyBUT0RPKHRlYm9yaW5nKTogRmlndXJlIG91dCBob3cgdG8gY2hhbmdlIGFuZCBnZXQgd29ya2luZyBkaXJlY3RvcnkgaW4KKyAgLy8gZ29vZ2xlMy4KKyNlbmRpZiAgLy8gIVBST1RPQlVGX09QRU5TT1VSQ0UKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBNZXRob2RzIHRvIGNoZWNrIHRoZSB0ZXN0IHJlc3VsdHMgKGNhbGxlZCBhZnRlciBSdW4oKSkuCisKKyAgLy8gQ2hlY2tzIHRoYXQgbm8gdGV4dCB3YXMgd3JpdHRlbiB0byBzdGRlcnIgZHVyaW5nIFJ1bigpLCBhbmQgUnVuKCkKKyAgLy8gcmV0dXJuZWQgMC4KKyAgdm9pZCBFeHBlY3ROb0Vycm9ycygpOworCisgIC8vIENoZWNrcyB0aGF0IFJ1bigpIHJldHVybmVkIG5vbi16ZXJvIGFuZCB0aGUgc3RkZXJyIG91dHB1dCBpcyBleGFjdGx5CisgIC8vIHRoZSB0ZXh0IGdpdmVuLiAgZXhwZWN0ZWRfdGVzdCBtYXkgY29udGFpbiByZWZlcmVuY2VzIHRvICIkdG1wZGlyIiwKKyAgLy8gd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBwYXRoLgorICB2b2lkIEV4cGVjdEVycm9yVGV4dChjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfdGV4dCk7CisKKyAgLy8gQ2hlY2tzIHRoYXQgUnVuKCkgcmV0dXJuZWQgbm9uLXplcm8gYW5kIHRoZSBzdGRlcnIgY29udGFpbnMgdGhlIGdpdmVuCisgIC8vIHN1YnN0cmluZy4KKyAgdm9pZCBFeHBlY3RFcnJvclN1YnN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfc3Vic3RyaW5nKTsKKworICAvLyBDaGVja3MgdGhhdCBSdW4oKSByZXR1cm5lZCB6ZXJvIGFuZCB0aGUgc3RkZXJyIGNvbnRhaW5zIHRoZSBnaXZlbgorICAvLyBzdWJzdHJpbmcuCisgIHZvaWQgRXhwZWN0V2FybmluZ1N1YnN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfc3Vic3RyaW5nKTsKKworICAvLyBDaGVja3MgdGhhdCB0aGUgY2FwdHVyZWQgc3Rkb3V0IGlzIHRoZSBzYW1lIGFzIHRoZSBleHBlY3RlZF90ZXh0LgorICB2b2lkIEV4cGVjdENhcHR1cmVkU3Rkb3V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZF90ZXh0KTsKKworICAvLyBDaGVja3MgdGhhdCBSdW4oKSByZXR1cm5lZCB6ZXJvIGFuZCB0aGUgc3Rkb3V0IGNvbnRhaW5zIHRoZSBnaXZlbgorICAvLyBzdWJzdHJpbmcuCisgIHZvaWQgRXhwZWN0Q2FwdHVyZWRTdGRvdXRTdWJzdHJpbmdXaXRoWmVyb1JldHVybkNvZGUoCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfc3Vic3RyaW5nKTsKKworICAvLyBDaGVja3MgdGhhdCBSdW4oKSByZXR1cm5lZCB6ZXJvIGFuZCB0aGUgc3RkZXJyIGNvbnRhaW5zIHRoZSBnaXZlbgorICAvLyBzdWJzdHJpbmcuCisgIHZvaWQgRXhwZWN0Q2FwdHVyZWRTdGRlcnJTdWJzdHJpbmdXaXRoWmVyb1JldHVybkNvZGUoCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfc3Vic3RyaW5nKTsKKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorICAvLyBSZXR1cm5zIHRydWUgaWYgRXhwZWN0RXJyb3JTdWJzdHJpbmcoZXhwZWN0ZWRfc3Vic3RyaW5nKSB3b3VsZCBwYXNzLCBidXQKKyAgLy8gZG9lcyBub3QgZmFpbCBvdGhlcndpc2UuCisgIGJvb2wgSGFzQWx0ZXJuYXRlRXJyb3JTdWJzdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkX3N1YnN0cmluZyk7CisjZW5kaWYgIC8vIF9XSU4zMiAmJiAhX19DWUdXSU5fXworCisgIC8vIENoZWNrcyB0aGF0IE1vY2tDb2RlR2VuZXJhdG9yOjpHZW5lcmF0ZSgpIHdhcyBjYWxsZWQgaW4gdGhlIGdpdmVuCisgIC8vIGNvbnRleHQgKG9yIHRoZSBnZW5lcmF0b3IgaW4gdGVzdF9wbHVnaW4uY2MsIHdoaWNoIHByb2R1Y2VzIHRoZSBzYW1lCisgIC8vIG91dHB1dCkuICBUaGF0IGlzLCB0aGlzIHRlc3RzIGlmIHRoZSBnZW5lcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gbmFtZQorICAvLyB3YXMgY2FsbGVkIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlciBhbmQgcHJvdG8gZmlsZSBhbmQgcHJvZHVjZWQgdGhlCisgIC8vIGdpdmVuIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBjaGVja2VkIGJ5IHJlYWRpbmcgdGhlIG91dHB1dCBmaWxlIGFuZAorICAvLyBjaGVja2luZyB0aGF0IGl0IGNvbnRhaW5zIHRoZSBjb250ZW50IHRoYXQgTW9ja0NvZGVHZW5lcmF0b3Igd291bGQKKyAgLy8gZ2VuZXJhdGUgZ2l2ZW4gdGhlc2UgaW5wdXRzLiAgbWVzc2FnZV9uYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaXJzdAorICAvLyBtZXNzYWdlIHRoYXQgYXBwZWFyZWQgaW4gdGhlIHByb3RvIGZpbGU7IHRoaXMgaXMganVzdCB0byBtYWtlIGV4dHJhCisgIC8vIHN1cmUgdGhhdCB0aGUgY29ycmVjdCBmaWxlIHdhcyBwYXJzZWQuCisgIHZvaWQgRXhwZWN0R2VuZXJhdGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3RvX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlX25hbWUpOworICB2b2lkIEV4cGVjdEdlbmVyYXRlZChjb25zdCBzdGQ6OnN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm90b19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X2RpcmVjdG9yeSk7CisgIHZvaWQgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKGNvbnN0IHN0ZDo6c3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFsbF9wcm90b19uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3RvX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlX25hbWUpOworICB2b2lkIEV4cGVjdEdlbmVyYXRlZFdpdGhJbnNlcnRpb25zKGNvbnN0IHN0ZDo6c3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnNlcnRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm90b19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlX25hbWUpOworICB2b2lkIENoZWNrR2VuZXJhdGVkQW5ub3RhdGlvbnMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSk7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyAgdm9pZCBFeHBlY3ROdWxsQ29kZUdlbmVyYXRvckNhbGxlZChjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyKTsKKyNlbmRpZiAgLy8gX1dJTjMyCisKKworICB2b2lkIFJlYWREZXNjcmlwdG9yU2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclNldCogZGVzY3JpcHRvcl9zZXQpOworCisgIHZvaWQgV3JpdGVEZXNjcmlwdG9yU2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JTZXQqIGRlc2NyaXB0b3Jfc2V0KTsKKworICB2b2lkIEV4cGVjdEZpbGVDb250ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudCk7CisKKyAgLy8gVGhlIGRlZmF1bHQgY29kZSBnZW5lcmF0b3JzIHN1cHBvcnQgYWxsIGZlYXR1cmVzLiBVc2UgdGhpcyB0byBjcmVhdGUgYQorICAvLyBjb2RlIGdlbmVyYXRvciB0aGF0IG9taXRzIHRoZSBnaXZlbiBmZWF0dXJlKHMpLgorICB2b2lkIENyZWF0ZUdlbmVyYXRvcldpdGhNaXNzaW5nRmVhdHVyZXMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBmZWF0dXJlcykgeworICAgIE1vY2tDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3IgPSBuZXcgTW9ja0NvZGVHZW5lcmF0b3IobmFtZSk7CisgICAgZ2VuZXJhdG9yLT5TdXBwcmVzc0ZlYXR1cmVzKGZlYXR1cmVzKTsKKyAgICBtb2NrX2dlbmVyYXRvcnNfdG9fZGVsZXRlXy5wdXNoX2JhY2soZ2VuZXJhdG9yKTsKKyAgICBjbGlfLlJlZ2lzdGVyR2VuZXJhdG9yKG5hbWUsIGdlbmVyYXRvciwgZGVzY3JpcHRpb24pOworICB9CisKKyBwcml2YXRlOgorICAvLyBUaGUgb2JqZWN0IHdlIGFyZSB0ZXN0aW5nLgorICBDb21tYW5kTGluZUludGVyZmFjZSBjbGlfOworCisgIC8vIFdhcyBEaXNhbGxvd1BsdWdpbnMoKSBjYWxsZWQ/CisgIGJvb2wgZGlzYWxsb3dfcGx1Z2luc187CisKKyAgLy8gV2UgY3JlYXRlIGEgZGlyZWN0b3J5IHdpdGhpbiBUZXN0VGVtcERpcigpIGluIG9yZGVyIHRvIGFkZCBleHRyYQorICAvLyBwcm90ZWN0aW9uIGFnYWluc3QgYWNjaWRlbnRhbGx5IGRlbGV0aW5nIHVzZXIgZmlsZXMgKHNpbmNlIHdlIHJlY3Vyc2l2ZWx5CisgIC8vIGRlbGV0ZSB0aGlzIGRpcmVjdG9yeSBkdXJpbmcgdGhlIHRlc3QpLiAgVGhpcyBpcyB0aGUgZnVsbCBwYXRoIG9mIHRoYXQKKyAgLy8gZGlyZWN0b3J5LgorICBzdGQ6OnN0cmluZyB0ZW1wX2RpcmVjdG9yeV87CisKKyAgLy8gVGhlIHJlc3VsdCBvZiBSdW4oKS4KKyAgaW50IHJldHVybl9jb2RlXzsKKworICAvLyBUaGUgY2FwdHVyZWQgc3RkZXJyIG91dHB1dC4KKyAgc3RkOjpzdHJpbmcgZXJyb3JfdGV4dF87CisKKyAgLy8gVGhlIGNhcHR1cmVkIHN0ZG91dC4KKyAgc3RkOjpzdHJpbmcgY2FwdHVyZWRfc3Rkb3V0XzsKKworICAvLyBQb2ludGVycyB3aGljaCBuZWVkIHRvIGJlIGRlbGV0ZWQgbGF0ZXIuCisgIHN0ZDo6dmVjdG9yPENvZGVHZW5lcmF0b3IqPiBtb2NrX2dlbmVyYXRvcnNfdG9fZGVsZXRlXzsKKworICBOdWxsQ29kZUdlbmVyYXRvciogbnVsbF9nZW5lcmF0b3JfOworfTsKKworY2xhc3MgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpOdWxsQ29kZUdlbmVyYXRvciA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIE51bGxDb2RlR2VuZXJhdG9yKCkgOiBjYWxsZWRfKGZhbHNlKSB7fQorICB+TnVsbENvZGVHZW5lcmF0b3IoKSBvdmVycmlkZSB7fQorCisgIG11dGFibGUgYm9vbCBjYWxsZWRfOworICBtdXRhYmxlIHN0ZDo6c3RyaW5nIHBhcmFtZXRlcl87CisKKyAgLy8gaW1wbGVtZW50cyBDb2RlR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LCBzdGQ6OnN0cmluZyogZXJyb3IpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBjYWxsZWRfID0gdHJ1ZTsKKyAgICBwYXJhbWV0ZXJfID0gcGFyYW1ldGVyOworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpTZXRVcCgpIHsKKyAgdGVtcF9kaXJlY3RvcnlfID0gVGVzdFRlbXBEaXIoKSArICIvcHJvdG8yX2NsaV90ZXN0X3RlbXAiOworCisgIC8vIElmIHRoZSB0ZW1wIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cywgaXQgbXVzdCBiZSBsZWZ0IG92ZXIgZnJvbSBhCisgIC8vIHByZXZpb3VzIHJ1bi4gIERlbGV0ZSBpdC4KKyAgaWYgKEZpbGVFeGlzdHModGVtcF9kaXJlY3RvcnlfKSkgeworICAgIEZpbGU6OkRlbGV0ZVJlY3Vyc2l2ZWx5KHRlbXBfZGlyZWN0b3J5XywgTlVMTCwgTlVMTCk7CisgIH0KKworICAvLyBDcmVhdGUgdGhlIHRlbXAgZGlyZWN0b3J5LgorICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6Q3JlYXRlRGlyKHRlbXBfZGlyZWN0b3J5XywgMDc3NykpOworCisgIC8vIFJlZ2lzdGVyIGdlbmVyYXRvcnMuCisgIENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvciA9IG5ldyBNb2NrQ29kZUdlbmVyYXRvcigidGVzdF9nZW5lcmF0b3IiKTsKKyAgbW9ja19nZW5lcmF0b3JzX3RvX2RlbGV0ZV8ucHVzaF9iYWNrKGdlbmVyYXRvcik7CisgIGNsaV8uUmVnaXN0ZXJHZW5lcmF0b3IoIi0tdGVzdF9vdXQiLCAiLS10ZXN0X29wdCIsIGdlbmVyYXRvciwgIlRlc3Qgb3V0cHV0LiIpOworICBjbGlfLlJlZ2lzdGVyR2VuZXJhdG9yKCItdCIsIGdlbmVyYXRvciwgIlRlc3Qgb3V0cHV0LiIpOworCisgIGdlbmVyYXRvciA9IG5ldyBNb2NrQ29kZUdlbmVyYXRvcigiYWx0X2dlbmVyYXRvciIpOworICBtb2NrX2dlbmVyYXRvcnNfdG9fZGVsZXRlXy5wdXNoX2JhY2soZ2VuZXJhdG9yKTsKKyAgY2xpXy5SZWdpc3RlckdlbmVyYXRvcigiLS1hbHRfb3V0IiwgZ2VuZXJhdG9yLCAiQWx0IG91dHB1dC4iKTsKKworICBnZW5lcmF0b3IgPSBudWxsX2dlbmVyYXRvcl8gPSBuZXcgTnVsbENvZGVHZW5lcmF0b3IoKTsKKyAgbW9ja19nZW5lcmF0b3JzX3RvX2RlbGV0ZV8ucHVzaF9iYWNrKGdlbmVyYXRvcik7CisgIGNsaV8uUmVnaXN0ZXJHZW5lcmF0b3IoIi0tbnVsbF9vdXQiLCBnZW5lcmF0b3IsICJOdWxsIG91dHB1dC4iKTsKKworCisgIGRpc2FsbG93X3BsdWdpbnNfID0gZmFsc2U7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpUZWFyRG93bigpIHsKKyAgLy8gRGVsZXRlIHRoZSB0ZW1wIGRpcmVjdG9yeS4KKyAgaWYgKEZpbGVFeGlzdHModGVtcF9kaXJlY3RvcnlfKSkgeworICAgIEZpbGU6OkRlbGV0ZVJlY3Vyc2l2ZWx5KHRlbXBfZGlyZWN0b3J5XywgTlVMTCwgTlVMTCk7CisgIH0KKworICAvLyBEZWxldGUgYWxsIHRoZSBNb2NrQ29kZUdlbmVyYXRvcnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9ja19nZW5lcmF0b3JzX3RvX2RlbGV0ZV8uc2l6ZSgpOyBpKyspIHsKKyAgICBkZWxldGUgbW9ja19nZW5lcmF0b3JzX3RvX2RlbGV0ZV9baV07CisgIH0KKyAgbW9ja19nZW5lcmF0b3JzX3RvX2RlbGV0ZV8uY2xlYXIoKTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OlJ1bihjb25zdCBzdGQ6OnN0cmluZyYgY29tbWFuZCkgeworICBSdW5XaXRoQXJncyhTcGxpdChjb21tYW5kLCAiICIsIHRydWUpKTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OlJ1bldpdGhBcmdzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzKSB7CisgIGlmICghZGlzYWxsb3dfcGx1Z2luc18pIHsKKyAgICBjbGlfLkFsbG93UGx1Z2lucygicHJlZml4LSIpOworICAgIHN0ZDo6c3RyaW5nIHBsdWdpbl9wYXRoOworI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9URVNUX1BMVUdJTl9QQVRICisgICAgcGx1Z2luX3BhdGggPSBHT09HTEVfUFJPVE9CVUZfVEVTVF9QTFVHSU5fUEFUSDsKKyNlbHNlCisgICAgY29uc3QgY2hhciogcG9zc2libGVfcGF0aHNbXSA9IHsKKyAgICAgICAgLy8gV2hlbiBidWlsZGluZyB3aXRoIHNoYXJlZCBsaWJyYXJpZXMsIGxpYnRvb2wgaGlkZXMgdGhlIHJlYWwKKyAgICAgICAgLy8gZXhlY3V0YWJsZQorICAgICAgICAvLyBpbiAubGlicyBhbmQgcHV0cyBhIGZha2Ugd3JhcHBlciBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIGR1ZSB0byBhbiBhcHBhcmVudCBidWcgb24gQ3lnd2luL01pbkdXLCBpZiBvbmUgcHJvZ3JhbQorICAgICAgICAvLyB3cmFwcGVkIGluIHRoaXMgd2F5IChlLmcuIHByb3RvYnVmLXRlc3RzLmV4ZSkgdHJpZXMgdG8gZXhlY3V0ZQorICAgICAgICAvLyBhbm90aGVyCisgICAgICAgIC8vIHByb2dyYW0gd3JhcHBlZCBpbiB0aGlzIHdheSAoZS5nLiB0ZXN0X3BsdWdpbi5leGUpLCB0aGUgbGF0dGVyIGZhaWxzCisgICAgICAgIC8vIHdpdGggZXJyb3IgY29kZSAxMjcgYW5kIG5vIGV4cGxhbmF0aW9uIG1lc3NhZ2UuICBQcmVzdW1hYmx5IHRoZQorICAgICAgICAvLyBwcm9ibGVtCisgICAgICAgIC8vIGlzIHRoYXQgdGhlIHdyYXBwZXIgZm9yIHByb3RvYnVmLXRlc3RzLmV4ZSBzZXQgc29tZSBlbnZpcm9ubWVudAorICAgICAgICAvLyB2YXJpYWJsZXMgdGhhdCBjb25mdXNlIHRoZSB3cmFwcGVyIGZvciB0ZXN0X3BsdWdpbi5leGUuICBMdWNraWx5LCBpdAorICAgICAgICAvLyB0dXJucyBvdXQgdGhhdCBpZiB3ZSBzaW1wbHkgaW52b2tlIHRoZSB3cmFwcGVkIHRlc3RfcGx1Z2luLmV4ZQorICAgICAgICAvLyBkaXJlY3RseSwgaXQgd29ya3MgLS0gSSBndWVzcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldCBieSB0aGUKKyAgICAgICAgLy8gcHJvdG9idWYtdGVzdHMuZXhlIHdyYXBwZXIgaGFwcGVuIHRvIGJlIGNvcnJlY3QgZm9yIGl0IHRvby4gIFNvIHdlIGRvCisgICAgICAgIC8vIHRoYXQuCisgICAgICAgICIubGlicy90ZXN0X3BsdWdpbi5leGUiLCAgLy8gV2luMzIgdy9hdXRvdG9vbCAoQ3lnd2luIC8gTWluR1cpCisgICAgICAgICJ0ZXN0X3BsdWdpbi5leGUiLCAgICAgICAgLy8gT3RoZXIgV2luMzIgKE1TVkMpCisgICAgICAgICJ0ZXN0X3BsdWdpbiIsICAgICAgICAgICAgLy8gVW5peAorICAgIH07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKHBvc3NpYmxlX3BhdGhzKTsgaSsrKSB7CisgICAgICBpZiAoYWNjZXNzKHBvc3NpYmxlX3BhdGhzW2ldLCBGX09LKSA9PSAwKSB7CisgICAgICAgIHBsdWdpbl9wYXRoID0gcG9zc2libGVfcGF0aHNbaV07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKHBsdWdpbl9wYXRoLmVtcHR5KCkpIHsKKyAgICAgIEdPT0dMRV9MT0coRVJST1IpCisgICAgICAgICAgPDwgIlBsdWdpbiBleGVjdXRhYmxlIG5vdCBmb3VuZC4gIFBsdWdpbiB0ZXN0cyBhcmUgbGlrZWx5IHRvIGZhaWwuIjsKKyAgICB9IGVsc2UgeworICAgICAgYXJncy5wdXNoX2JhY2soIi0tcGx1Z2luPXByZWZpeC1nZW4tcGx1Zz0iICsgcGx1Z2luX3BhdGgpOworICAgIH0KKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBjaGFyKltdPiBhcmd2KG5ldyBjb25zdCBjaGFyKlthcmdzLnNpemUoKV0pOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgeworICAgIGFyZ3NbaV0gPSBTdHJpbmdSZXBsYWNlKGFyZ3NbaV0sICIkdG1wZGlyIiwgdGVtcF9kaXJlY3RvcnlfLCB0cnVlKTsKKyAgICBhcmd2W2ldID0gYXJnc1tpXS5jX3N0cigpOworICB9CisKKyAgLy8gVE9ETyhqaWVsdW8pOiBDeWd3aW4gZG9lc24ndCB3b3JrIHdlbGwgaWYgd2UgdHJ5IHRvIGNhcHR1cmUgc3RkZXJyIGFuZAorICAvLyBzdGRvdXQgYXQgdGhlIHNhbWUgdGltZS4gTmVlZCB0byBmaWd1cmUgb3V0IHdoeSBhbmQgYWRkIHRoaXMgY2FwdHVyZSBiYWNrCisgIC8vIGZvciBDeWd3aW4uCisjaWYgIWRlZmluZWQoX19DWUdXSU5fXykKKyAgQ2FwdHVyZVRlc3RTdGRvdXQoKTsKKyNlbmRpZgorICBDYXB0dXJlVGVzdFN0ZGVycigpOworCisgIHJldHVybl9jb2RlXyA9IGNsaV8uUnVuKGFyZ3Muc2l6ZSgpLCBhcmd2LmdldCgpKTsKKworICBlcnJvcl90ZXh0XyA9IEdldENhcHR1cmVkVGVzdFN0ZGVycigpOworI2lmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisgIGNhcHR1cmVkX3N0ZG91dF8gPSBHZXRDYXB0dXJlZFRlc3RTdGRvdXQoKTsKKyNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpDcmVhdGVUZW1wRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMpIHsKKyAgLy8gQ3JlYXRlIHBhcmVudCBkaXJlY3RvcnksIGlmIG5lY2Vzc2FyeS4KKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBzbGFzaF9wb3MgPSBuYW1lLmZpbmRfbGFzdF9vZignLycpOworICBpZiAoc2xhc2hfcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgc3RkOjpzdHJpbmcgZGlyID0gbmFtZS5zdWJzdHIoMCwgc2xhc2hfcG9zKTsKKyAgICBpZiAoIUZpbGVFeGlzdHModGVtcF9kaXJlY3RvcnlfICsgIi8iICsgZGlyKSkgeworICAgICAgR09PR0xFX0NIRUNLX09LKEZpbGU6OlJlY3Vyc2l2ZWx5Q3JlYXRlRGlyKHRlbXBfZGlyZWN0b3J5XyArICIvIiArIGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA3NzcpKTsKKyAgICB9CisgIH0KKworICAvLyBXcml0ZSBmaWxlLgorICBzdGQ6OnN0cmluZyBmdWxsX25hbWUgPSB0ZW1wX2RpcmVjdG9yeV8gKyAiLyIgKyBuYW1lOworICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6U2V0Q29udGVudHMoCisgICAgICBmdWxsX25hbWUsIFN0cmluZ1JlcGxhY2UoY29udGVudHMsICIkdG1wZGlyIiwgdGVtcF9kaXJlY3RvcnlfLCB0cnVlKSwKKyAgICAgIHRydWUpKTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkNyZWF0ZVRlbXBEaXIoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OlJlY3Vyc2l2ZWx5Q3JlYXRlRGlyKHRlbXBfZGlyZWN0b3J5XyArICIvIiArIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA3NzcpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0Tm9FcnJvcnMoKSB7CisgIEVYUEVDVF9FUSgwLCByZXR1cm5fY29kZV8pOworICBFWFBFQ1RfRVEoIiIsIGVycm9yX3RleHRfKTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdEVycm9yVGV4dCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfdGV4dCkgeworICBFWFBFQ1RfTkUoMCwgcmV0dXJuX2NvZGVfKTsKKyAgRVhQRUNUX0VRKFN0cmluZ1JlcGxhY2UoZXhwZWN0ZWRfdGV4dCwgIiR0bXBkaXIiLCB0ZW1wX2RpcmVjdG9yeV8sIHRydWUpLAorICAgICAgICAgICAgZXJyb3JfdGV4dF8pOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0RXJyb3JTdWJzdHJpbmcoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkX3N1YnN0cmluZykgeworICBFWFBFQ1RfTkUoMCwgcmV0dXJuX2NvZGVfKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgZXhwZWN0ZWRfc3Vic3RyaW5nLCBlcnJvcl90ZXh0Xyk7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpFeHBlY3RXYXJuaW5nU3Vic3RyaW5nKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZF9zdWJzdHJpbmcpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgZXhwZWN0ZWRfc3Vic3RyaW5nLCBlcnJvcl90ZXh0Xyk7CisgIEVYUEVDVF9FUSgwLCByZXR1cm5fY29kZV8pOworfQorCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCitib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6SGFzQWx0ZXJuYXRlRXJyb3JTdWJzdHJpbmcoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkX3N1YnN0cmluZykgeworICBFWFBFQ1RfTkUoMCwgcmV0dXJuX2NvZGVfKTsKKyAgcmV0dXJuIGVycm9yX3RleHRfLmZpbmQoZXhwZWN0ZWRfc3Vic3RyaW5nKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKK30KKyNlbmRpZiAgLy8gX1dJTjMyICYmICFfX0NZR1dJTl9fCisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpFeHBlY3RHZW5lcmF0ZWQoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm90b19uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZV9uYW1lKSB7CisgIE1vY2tDb2RlR2VuZXJhdG9yOjpFeHBlY3RHZW5lcmF0ZWQoZ2VuZXJhdG9yX25hbWUsIHBhcmFtZXRlciwgIiIsIHByb3RvX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9uYW1lLCBwcm90b19uYW1lLCB0ZW1wX2RpcmVjdG9yeV8pOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0R2VuZXJhdGVkKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlciwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvdG9fbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2VfbmFtZSwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X2RpcmVjdG9yeSkgeworICBNb2NrQ29kZUdlbmVyYXRvcjo6RXhwZWN0R2VuZXJhdGVkKGdlbmVyYXRvcl9uYW1lLCBwYXJhbWV0ZXIsICIiLCBwcm90b19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbmFtZSwgcHJvdG9fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2RpcmVjdG9yeV8gKyAiLyIgKyBvdXRwdXRfZGlyZWN0b3J5KTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2VuZXJhdG9yX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhbGxfcHJvdG9fbmFtZXMsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3RvX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlX25hbWUpIHsKKyAgTW9ja0NvZGVHZW5lcmF0b3I6OkV4cGVjdEdlbmVyYXRlZChnZW5lcmF0b3JfbmFtZSwgIiIsICIiLCBwcm90b19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbmFtZSwgYWxsX3Byb3RvX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfZGlyZWN0b3J5Xyk7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpFeHBlY3RHZW5lcmF0ZWRXaXRoSW5zZXJ0aW9ucygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2VuZXJhdG9yX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluc2VydGlvbnMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm90b19uYW1lLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlX25hbWUpIHsKKyAgTW9ja0NvZGVHZW5lcmF0b3I6OkV4cGVjdEdlbmVyYXRlZChnZW5lcmF0b3JfbmFtZSwgcGFyYW1ldGVyLCBpbnNlcnRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvX25hbWUsIG1lc3NhZ2VfbmFtZSwgcHJvdG9fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2RpcmVjdG9yeV8pOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6Q2hlY2tHZW5lcmF0ZWRBbm5vdGF0aW9ucygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUpIHsKKyAgTW9ja0NvZGVHZW5lcmF0b3I6OkNoZWNrR2VuZXJhdGVkQW5ub3RhdGlvbnMobmFtZSwgZmlsZSwgdGVtcF9kaXJlY3RvcnlfKTsKK30KKworI2lmIGRlZmluZWQoX1dJTjMyKQordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdE51bGxDb2RlR2VuZXJhdG9yQ2FsbGVkKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIpIHsKKyAgRVhQRUNUX1RSVUUobnVsbF9nZW5lcmF0b3JfLT5jYWxsZWRfKTsKKyAgRVhQRUNUX0VRKHBhcmFtZXRlciwgbnVsbF9nZW5lcmF0b3JfLT5wYXJhbWV0ZXJfKTsKK30KKyNlbmRpZiAgLy8gX1dJTjMyCisKKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OlJlYWREZXNjcmlwdG9yU2V0KAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgRmlsZURlc2NyaXB0b3JTZXQqIGRlc2NyaXB0b3Jfc2V0KSB7CisgIHN0ZDo6c3RyaW5nIHBhdGggPSB0ZW1wX2RpcmVjdG9yeV8gKyAiLyIgKyBmaWxlbmFtZTsKKyAgc3RkOjpzdHJpbmcgZmlsZV9jb250ZW50czsKKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkdldENvbnRlbnRzKHBhdGgsICZmaWxlX2NvbnRlbnRzLCB0cnVlKSk7CisKKyAgaWYgKCFkZXNjcmlwdG9yX3NldC0+UGFyc2VGcm9tU3RyaW5nKGZpbGVfY29udGVudHMpKSB7CisgICAgRkFJTCgpIDw8ICJDb3VsZCBub3QgcGFyc2UgZmlsZSBjb250ZW50czogIiA8PCBwYXRoOworICB9Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpXcml0ZURlc2NyaXB0b3JTZXQoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBGaWxlRGVzY3JpcHRvclNldCogZGVzY3JpcHRvcl9zZXQpIHsKKyAgc3RkOjpzdHJpbmcgYmluYXJ5X3Byb3RvOworICBHT09HTEVfQ0hFQ0soZGVzY3JpcHRvcl9zZXQtPlNlcmlhbGl6ZVRvU3RyaW5nKCZiaW5hcnlfcHJvdG8pKTsKKyAgQ3JlYXRlVGVtcEZpbGUoZmlsZW5hbWUsIGJpbmFyeV9wcm90byk7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpFeHBlY3RDYXB0dXJlZFN0ZG91dCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfdGV4dCkgeworICBFWFBFQ1RfRVEoZXhwZWN0ZWRfdGV4dCwgY2FwdHVyZWRfc3Rkb3V0Xyk7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpFeHBlY3RDYXB0dXJlZFN0ZG91dFN1YnN0cmluZ1dpdGhaZXJvUmV0dXJuQ29kZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfc3Vic3RyaW5nKSB7CisgIEVYUEVDVF9FUSgwLCByZXR1cm5fY29kZV8pOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCBleHBlY3RlZF9zdWJzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZWRfc3Rkb3V0Xyk7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpFeHBlY3RDYXB0dXJlZFN0ZGVyclN1YnN0cmluZ1dpdGhaZXJvUmV0dXJuQ29kZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfc3Vic3RyaW5nKSB7CisgIEVYUEVDVF9FUSgwLCByZXR1cm5fY29kZV8pOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCBleHBlY3RlZF9zdWJzdHJpbmcsIGVycm9yX3RleHRfKTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdEZpbGVDb250ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudCkgeworICBzdGQ6OnN0cmluZyBwYXRoID0gdGVtcF9kaXJlY3RvcnlfICsgIi8iICsgZmlsZW5hbWU7CisgIHN0ZDo6c3RyaW5nIGZpbGVfY29udGVudHM7CisgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpHZXRDb250ZW50cyhwYXRoLCAmZmlsZV9jb250ZW50cywgdHJ1ZSkpOworCisgIEVYUEVDVF9FUShTdHJpbmdSZXBsYWNlKGNvbnRlbnQsICIkdG1wZGlyIiwgdGVtcF9kaXJlY3RvcnlfLCB0cnVlKSwKKyAgICAgICAgICAgIGZpbGVfY29udGVudHMpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEJhc2ljT3V0cHV0KSB7CisgIC8vIFRlc3QgdGhhdCB0aGUgY29tbW9uIGNhc2Ugd29ya3MuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEJhc2ljT3V0cHV0X0Rlc2NyaXB0b3JTZXRJbikgeworICAvLyBUZXN0IHRoYXQgdGhlIGNvbW1vbiBjYXNlIHdvcmtzLgorICBGaWxlRGVzY3JpcHRvclNldCBmaWxlX2Rlc2NyaXB0b3Jfc2V0OworICBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCk7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+c2V0X25hbWUoImZvby5wcm90byIpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkZvbyIpOworCisgIFdyaXRlRGVzY3JpcHRvclNldCgiZm9vLmJpbiIsICZmaWxlX2Rlc2NyaXB0b3Jfc2V0KTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1kZXNjcmlwdG9yX3NldF9pbj0kdG1wZGlyL2Zvby5iaW4gZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBCYXNpY1BsdWdpbikgeworICAvLyBUZXN0IHRoYXQgYmFzaWMgcGx1Z2lucyB3b3JrLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X3BsdWdpbiIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBCYXNpY1BsdWdpbl9EZXNjcmlwdG9yU2V0SW4pIHsKKyAgLy8gVGVzdCB0aGF0IGJhc2ljIHBsdWdpbnMgd29yay4KKworICBGaWxlRGVzY3JpcHRvclNldCBmaWxlX2Rlc2NyaXB0b3Jfc2V0OworICBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCk7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+c2V0X25hbWUoImZvby5wcm90byIpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkZvbyIpOworCisgIFdyaXRlRGVzY3JpcHRvclNldCgiZm9vLmJpbiIsICZmaWxlX2Rlc2NyaXB0b3Jfc2V0KTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9JHRtcGRpciAiCisgICAgICAiLS1kZXNjcmlwdG9yX3NldF9pbj0kdG1wZGlyL2Zvby5iaW4gZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X3BsdWdpbiIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBHZW5lcmF0b3JBbmRQbHVnaW4pIHsKKyAgLy8gSW52b2tlIGEgZ2VuZXJhdG9yIGFuZCBhIHBsdWdpbiBhdCB0aGUgc2FtZSB0aW1lLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAtLXBsdWdfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X3BsdWdpbiIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBHZW5lcmF0b3JBbmRQbHVnaW5fRGVzY3JpcHRvclNldEluKSB7CisgIC8vIEludm9rZSBhIGdlbmVyYXRvciBhbmQgYSBwbHVnaW4gYXQgdGhlIHNhbWUgdGltZS4KKworICBGaWxlRGVzY3JpcHRvclNldCBmaWxlX2Rlc2NyaXB0b3Jfc2V0OworICBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCk7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+c2V0X25hbWUoImZvby5wcm90byIpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkZvbyIpOworCisgIFdyaXRlRGVzY3JpcHRvclNldCgiZm9vLmJpbiIsICZmaWxlX2Rlc2NyaXB0b3Jfc2V0KTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAtLXBsdWdfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tZGVzY3JpcHRvcl9zZXRfaW49JHRtcGRpci9mb28uYmluIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X3BsdWdpbiIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBNdWx0aXBsZUlucHV0cykgeworICAvLyBUZXN0IHBhcnNpbmcgbXVsdGlwbGUgaW5wdXQgZmlsZXMuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJhciB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgLS1wbHVnX291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8gYmFyLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X2dlbmVyYXRvciIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb28ucHJvdG8iLCAiRm9vIik7CisgIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygidGVzdF9nZW5lcmF0b3IiLCAiZm9vLnByb3RvLGJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFyLnByb3RvIiwgIkJhciIpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfcGx1Z2luIiwgImZvby5wcm90byxiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvby5wcm90byIsICJGb28iKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X3BsdWdpbiIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXIucHJvdG8iLCAiQmFyIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE11bHRpcGxlSW5wdXRzX0Rlc2NyaXB0b3JTZXRJbikgeworICAvLyBUZXN0IHBhcnNpbmcgbXVsdGlwbGUgaW5wdXQgZmlsZXMuCisgIEZpbGVEZXNjcmlwdG9yU2V0IGZpbGVfZGVzY3JpcHRvcl9zZXQ7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byogZmlsZV9kZXNjcmlwdG9yX3Byb3RvID0gZmlsZV9kZXNjcmlwdG9yX3NldC5hZGRfZmlsZSgpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5hZGRfbWVzc2FnZV90eXBlKCktPnNldF9uYW1lKCJGb28iKTsKKworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCk7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+c2V0X25hbWUoImJhci5wcm90byIpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkJhciIpOworCisgIFdyaXRlRGVzY3JpcHRvclNldCgiZm9vLmJpbiIsICZmaWxlX2Rlc2NyaXB0b3Jfc2V0KTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAtLXBsdWdfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tZGVzY3JpcHRvcl9zZXRfaW49JHRtcGRpci9mb28uYmluIGZvby5wcm90byBiYXIucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfZ2VuZXJhdG9yIiwgImZvby5wcm90byxiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvby5wcm90byIsICJGb28iKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X2dlbmVyYXRvciIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXIucHJvdG8iLCAiQmFyIik7CisgIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygidGVzdF9wbHVnaW4iLCAiZm9vLnByb3RvLGJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vLnByb3RvIiwgIkZvbyIpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfcGx1Z2luIiwgImZvby5wcm90byxiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhci5wcm90byIsICJCYXIiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTXVsdGlwbGVJbnB1dHNfVW51c2VkSW1wb3J0X0Rlc2NyaXB0b3JTZXRJbikgeworICAvLyBUZXN0IHVudXNlZCBpbXBvcnQgd2FybmluZyBpcyBub3QgcmFpc2VkIHdoZW4gZGVzY3JpcHRvcl9zZXRfaW4gaXMgY2FsbGVkCisgIC8vIGFuZCBjdXN0b20gb3B0aW9ucyBhcmUgaW4gdW5rbm93biBmaWVsZCBpbnN0ZWFkIG9mIHVuaW50ZXJwcmV0ZWRfb3B0aW9ucy4KKyAgRmlsZURlc2NyaXB0b3JTZXQgZmlsZV9kZXNjcmlwdG9yX3NldDsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcl9maWxlID0KKyAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOworICBkZXNjcmlwdG9yX2ZpbGUtPkNvcHlUbyhmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCkpOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8mIGFueV9wcm90byA9ICpmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCk7CisgIGdvb2dsZTo6cHJvdG9idWY6OkFueTo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmYW55X3Byb3RvKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogY3VzdG9tX2ZpbGUgPQorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkFnZ3JlZ2F0ZU1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOworICBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCk7CisgIGN1c3RvbV9maWxlLT5Db3B5VG8oZmlsZV9kZXNjcmlwdG9yX3Byb3RvKTsKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5zZXRfbmFtZSgiY3VzdG9tX29wdGlvbnMucHJvdG8iKTsKKyAgLy8gQWRkIGEgY3VzdG9tIG1lc3NhZ2Ugb3B0aW9uLgorICBGaWVsZERlc2NyaXB0b3JQcm90byogZXh0ZW5zaW9uX29wdGlvbiA9CisgICAgICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9leHRlbnNpb24oKTsKKyAgZXh0ZW5zaW9uX29wdGlvbi0+c2V0X25hbWUoInVua25vd25fb3B0aW9uIik7CisgIGV4dGVuc2lvbl9vcHRpb24tPnNldF9leHRlbmRlZSgiLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyIpOworICBleHRlbnNpb25fb3B0aW9uLT5zZXRfbnVtYmVyKDExMTEpOworICBleHRlbnNpb25fb3B0aW9uLT5zZXRfbGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMKTsKKyAgZXh0ZW5zaW9uX29wdGlvbi0+c2V0X3R5cGUoRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UNjQpOworCisgIGZpbGVfZGVzY3JpcHRvcl9wcm90byA9IGZpbGVfZGVzY3JpcHRvcl9zZXQuYWRkX2ZpbGUoKTsKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5zZXRfbmFtZSgiaW1wb3J0X2N1c3RvbV91bmtub3duX29wdGlvbnMucHJvdG8iKTsKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5hZGRfZGVwZW5kZW5jeSgiY3VzdG9tX29wdGlvbnMucHJvdG8iKTsKKyAgLy8gQWRkIGN1c3RvbSBtZXNzYWdlIG9wdGlvbiB0byB1bmtub3duIGZpZWxkLiBUaGlzIGN1c3RvbSBvcHRpb24gaXMKKyAgLy8gbm90IGtub3duIGluIGdlbmVyYXRlZCBwb29sLCB0aHVzIG9wdGlvbiB3aWxsIGJlIGluIHVua25vd24gZmllbGRzLgorICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkJhciIpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPm11dGFibGVfbWVzc2FnZV90eXBlKDApCisgICAgICAtPm11dGFibGVfb3B0aW9ucygpCisgICAgICAtPm11dGFibGVfdW5rbm93bl9maWVsZHMoKQorICAgICAgLT5BZGRWYXJpbnQoMTExMSwgMjIyMik7CisKKyAgV3JpdGVEZXNjcmlwdG9yU2V0KCJmb28uYmluIiwgJmZpbGVfZGVzY3JpcHRvcl9zZXQpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyIC0tcGx1Z19vdXQ9JHRtcGRpciAiCisgICAgICAiLS1kZXNjcmlwdG9yX3NldF9pbj0kdG1wZGlyL2Zvby5iaW4gIgorICAgICAgImltcG9ydF9jdXN0b21fdW5rbm93bl9vcHRpb25zLnByb3RvIik7CisKKyAgLy8gVE9ETyhqaWVsdW8pOiBGaXggdGhpcyB0ZXN0LiBUaGlzIHRlc3QgY2FzZSBvbmx5IGhhcHBlbnMgd2hlbgorICAvLyBDb21tYW5kTGluZUludGVyZmFjZTo6UnVuKCkgaXMgdXNlZCBpbnN0ZWFkIG9mIGludm9rZSBwcm90b2MgY29tYmluZWQKKyAgLy8gd2l0aCBkZXNjcmlwdG9yX3NldF9pbiwgYW5kIHNhbWUgY3VzdG9tIG9wdGlvbnMgYXJlIGRlZmluZWQgaW4gYm90aAorICAvLyBnZW5lcmF0ZWQgcG9vbCBhbmQgZGVzY3JpcHRvcl9zZXRfaW4uIFRoZXJlJ3Mgbm8gc3VjaCB1YWdlcyBmb3Igbm93IGJ1dAorICAvLyBzdGlsbCBuZWVkIHRvIGJlIGZpeGVkLgorICAvKgorICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCk7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+c2V0X25hbWUoImltcG9ydF9jdXN0b21fZXh0ZW5zaW9uX29wdGlvbnMucHJvdG8iKTsKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5hZGRfZGVwZW5kZW5jeSgiY3VzdG9tX29wdGlvbnMucHJvdG8iKTsKKyAgLy8gQWRkIGN1c3RvbSBtZXNzYWdlIG9wdGlvbiB0byB1bmtub3duIGZpZWxkLiBUaGlzIGN1c3RvbSBvcHRpb24gaXMKKyAgLy8gYWxzbyBkZWZpbmVkIGluIGdlbmVyYXRlZCBwb29sLCB0aHVzIG9wdGlvbiB3aWxsIGJlIGluIGV4dGVuc2lvbnMuCisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+YWRkX21lc3NhZ2VfdHlwZSgpLT5zZXRfbmFtZSgiRm9vIik7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+bXV0YWJsZV9tZXNzYWdlX3R5cGUoMCkKKyAgICAgIC0+bXV0YWJsZV9vcHRpb25zKCkKKyAgICAgIC0+bXV0YWJsZV91bmtub3duX2ZpZWxkcygpCisgICAgICAtPkFkZFZhcmludChwcm90b2J1Zl91bml0dGVzdDo6bWVzc2FnZV9vcHQxLm51bWJlcigpLCAyMjIyKTsKKworICBXcml0ZURlc2NyaXB0b3JTZXQoImZvby5iaW4iLCAmZmlsZV9kZXNjcmlwdG9yX3NldCk7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgLS1wbHVnX291dD0kdG1wZGlyICIKKyAgICAgICItLWRlc2NyaXB0b3Jfc2V0X2luPSR0bXBkaXIvZm9vLmJpbiBpbXBvcnRfY3VzdG9tX3Vua25vd25fb3B0aW9ucy5wcm90byAiCisgICAgICAiaW1wb3J0X2N1c3RvbV9leHRlbnNpb25fb3B0aW9ucy5wcm90byIpOworICAqLworCisgIEV4cGVjdE5vRXJyb3JzKCk7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE11bHRpcGxlSW5wdXRzV2l0aEltcG9ydCkgeworICAvLyBUZXN0IHBhcnNpbmcgbXVsdGlwbGUgaW5wdXQgZmlsZXMgd2l0aCBhbiBpbXBvcnQgb2YgYSBzZXBhcmF0ZSBmaWxlLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAiaW1wb3J0IFwiYmF6LnByb3RvXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIEJheiBhID0gMTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmF6LnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJheiB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgLS1wbHVnX291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8gYmFyLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X2dlbmVyYXRvciIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb28ucHJvdG8iLCAiRm9vIik7CisgIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygidGVzdF9nZW5lcmF0b3IiLCAiZm9vLnByb3RvLGJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFyLnByb3RvIiwgIkJhciIpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfcGx1Z2luIiwgImZvby5wcm90byxiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvby5wcm90byIsICJGb28iKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X3BsdWdpbiIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXIucHJvdG8iLCAiQmFyIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE11bHRpcGxlSW5wdXRzV2l0aEltcG9ydF9EZXNjcmlwdG9yU2V0SW4pIHsKKyAgLy8gVGVzdCBwYXJzaW5nIG11bHRpcGxlIGlucHV0IGZpbGVzIHdpdGggYW4gaW1wb3J0IG9mIGEgc2VwYXJhdGUgZmlsZS4KKyAgRmlsZURlc2NyaXB0b3JTZXQgZmlsZV9kZXNjcmlwdG9yX3NldDsKKworICBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCk7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+c2V0X25hbWUoImZvby5wcm90byIpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkZvbyIpOworCisgIGZpbGVfZGVzY3JpcHRvcl9wcm90byA9IGZpbGVfZGVzY3JpcHRvcl9zZXQuYWRkX2ZpbGUoKTsKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5zZXRfbmFtZSgiYmFyLnByb3RvIik7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+YWRkX2RlcGVuZGVuY3koImJhei5wcm90byIpOworICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UgPSBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9tZXNzYWdlX3R5cGUoKTsKKyAgbWVzc2FnZS0+c2V0X25hbWUoIkJhciIpOworICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQgPSBtZXNzYWdlLT5hZGRfZmllbGQoKTsKKyAgZmllbGQtPnNldF90eXBlX25hbWUoIkJheiIpOworICBmaWVsZC0+c2V0X25hbWUoImEiKTsKKyAgZmllbGQtPnNldF9udW1iZXIoMSk7CisKKyAgV3JpdGVEZXNjcmlwdG9yU2V0KCJmb29fYW5kX2Jhci5iaW4iLCAmZmlsZV9kZXNjcmlwdG9yX3NldCk7CisKKyAgZmlsZV9kZXNjcmlwdG9yX3NldC5jbGVhcl9maWxlKCk7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90byA9IGZpbGVfZGVzY3JpcHRvcl9zZXQuYWRkX2ZpbGUoKTsKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5zZXRfbmFtZSgiYmF6LnByb3RvIik7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+YWRkX21lc3NhZ2VfdHlwZSgpLT5zZXRfbmFtZSgiQmF6Iik7CisKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvID0gZmlsZV9kZXNjcmlwdG9yX3NldC5hZGRfZmlsZSgpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPnNldF9uYW1lKCJiYXQucHJvdG8iKTsKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5hZGRfZGVwZW5kZW5jeSgiYmF6LnByb3RvIik7CisgIG1lc3NhZ2UgPSBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9tZXNzYWdlX3R5cGUoKTsKKyAgbWVzc2FnZS0+c2V0X25hbWUoIkJhdCIpOworICBmaWVsZCA9IG1lc3NhZ2UtPmFkZF9maWVsZCgpOworICBmaWVsZC0+c2V0X3R5cGVfbmFtZSgiQmF6Iik7CisgIGZpZWxkLT5zZXRfbmFtZSgiYSIpOworICBmaWVsZC0+c2V0X251bWJlcigxKTsKKworICBXcml0ZURlc2NyaXB0b3JTZXQoImJhel9hbmRfYmF0LmJpbiIsICZmaWxlX2Rlc2NyaXB0b3Jfc2V0KTsKKyAgUnVuKHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kJHRtcGRpciAtLXBsdWdfb3V0PSQkdG1wZGlyICIKKyAgICAgICItLWRlc2NyaXB0b3Jfc2V0X2luPSQwIGZvby5wcm90byBiYXIucHJvdG8iLAorICAgICAgc3RkOjpzdHJpbmcoIiR0bXBkaXIvZm9vX2FuZF9iYXIuYmluIikgKworICAgICAgICAgIENvbW1hbmRMaW5lSW50ZXJmYWNlOjprUGF0aFNlcGFyYXRvciArICIkdG1wZGlyL2Jhel9hbmRfYmF0LmJpbiIpKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfZ2VuZXJhdG9yIiwgImZvby5wcm90byxiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvby5wcm90byIsICJGb28iKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X2dlbmVyYXRvciIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXIucHJvdG8iLCAiQmFyIik7CisgIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygidGVzdF9wbHVnaW4iLCAiZm9vLnByb3RvLGJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vLnByb3RvIiwgIkZvbyIpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfcGx1Z2luIiwgImZvby5wcm90byxiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhci5wcm90byIsICJCYXIiKTsKKworICBSdW4oc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSQkdG1wZGlyIC0tcGx1Z19vdXQ9JCR0bXBkaXIgIgorICAgICAgIi0tZGVzY3JpcHRvcl9zZXRfaW49JDAgYmF6LnByb3RvIGJhdC5wcm90byIsCisgICAgICBzdGQ6OnN0cmluZygiJHRtcGRpci9mb29fYW5kX2Jhci5iaW4iKSArCisgICAgICAgICAgQ29tbWFuZExpbmVJbnRlcmZhY2U6OmtQYXRoU2VwYXJhdG9yICsgIiR0bXBkaXIvYmF6X2FuZF9iYXQuYmluIikpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygidGVzdF9nZW5lcmF0b3IiLCAiYmF6LnByb3RvLGJhdC5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmF6LnByb3RvIiwgIkJheiIpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfZ2VuZXJhdG9yIiwgImJhei5wcm90byxiYXQucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhdC5wcm90byIsICJCYXQiKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X3BsdWdpbiIsICJiYXoucHJvdG8sYmF0LnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXoucHJvdG8iLCAiQmF6Iik7CisgIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygidGVzdF9wbHVnaW4iLCAiYmF6LnByb3RvLGJhdC5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmF0LnByb3RvIiwgIkJhdCIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LAorICAgICAgIE11bHRpcGxlSW5wdXRzV2l0aEltcG9ydF9EZXNjcmlwdG9yU2V0SW5fRHVwbGljYXRlRmlsZURlc2NyaXB0b3IpIHsKKyAgLy8gVGVzdCBwYXJzaW5nIG11bHRpcGxlIGlucHV0IGZpbGVzIHdpdGggYW4gaW1wb3J0IG9mIGEgc2VwYXJhdGUgZmlsZS4KKyAgRmlsZURlc2NyaXB0b3JTZXQgZmlsZV9kZXNjcmlwdG9yX3NldDsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb19maWxlX2Rlc2NyaXB0b3JfcHJvdG87CisgIGZvb19maWxlX2Rlc2NyaXB0b3JfcHJvdG8uc2V0X25hbWUoImZvby5wcm90byIpOworICBmb29fZmlsZV9kZXNjcmlwdG9yX3Byb3RvLmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkZvbyIpOworCisgIGZpbGVfZGVzY3JpcHRvcl9zZXQuYWRkX2ZpbGUoKS0+Q29weUZyb20oZm9vX2ZpbGVfZGVzY3JpcHRvcl9wcm90byk7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byogZmlsZV9kZXNjcmlwdG9yX3Byb3RvID0gZmlsZV9kZXNjcmlwdG9yX3NldC5hZGRfZmlsZSgpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPnNldF9uYW1lKCJiYXIucHJvdG8iKTsKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5hZGRfZGVwZW5kZW5jeSgiYmF6LnByb3RvIik7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+YWRkX2RlcGVuZGVuY3koImZvby5wcm90byIpOworICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UgPSBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9tZXNzYWdlX3R5cGUoKTsKKyAgbWVzc2FnZS0+c2V0X25hbWUoIkJhciIpOworICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQgPSBtZXNzYWdlLT5hZGRfZmllbGQoKTsKKyAgZmllbGQtPnNldF90eXBlX25hbWUoIkJheiIpOworICBmaWVsZC0+c2V0X25hbWUoImEiKTsKKyAgZmllbGQtPnNldF9udW1iZXIoMSk7CisgIGZpZWxkID0gbWVzc2FnZS0+YWRkX2ZpZWxkKCk7CisgIGZpZWxkLT5zZXRfdHlwZV9uYW1lKCJGb28iKTsKKyAgZmllbGQtPnNldF9uYW1lKCJmIik7CisgIGZpZWxkLT5zZXRfbnVtYmVyKDIpOworICBXcml0ZURlc2NyaXB0b3JTZXQoImZvb19hbmRfYmFyLmJpbiIsICZmaWxlX2Rlc2NyaXB0b3Jfc2V0KTsKKworICBmaWxlX2Rlc2NyaXB0b3Jfc2V0LmNsZWFyX2ZpbGUoKTsKKyAgZmlsZV9kZXNjcmlwdG9yX3NldC5hZGRfZmlsZSgpLT5Db3B5RnJvbShmb29fZmlsZV9kZXNjcmlwdG9yX3Byb3RvKTsKKworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCk7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+c2V0X25hbWUoImJhei5wcm90byIpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9kZXBlbmRlbmN5KCJmb28ucHJvdG8iKTsKKyAgbWVzc2FnZSA9IGZpbGVfZGVzY3JpcHRvcl9wcm90by0+YWRkX21lc3NhZ2VfdHlwZSgpOworICBtZXNzYWdlLT5zZXRfbmFtZSgiQmF6Iik7CisgIGZpZWxkID0gbWVzc2FnZS0+YWRkX2ZpZWxkKCk7CisgIGZpZWxkLT5zZXRfdHlwZV9uYW1lKCJGb28iKTsKKyAgZmllbGQtPnNldF9uYW1lKCJmIik7CisgIGZpZWxkLT5zZXRfbnVtYmVyKDEpOworICBXcml0ZURlc2NyaXB0b3JTZXQoImZvb19hbmRfYmF6LmJpbiIsICZmaWxlX2Rlc2NyaXB0b3Jfc2V0KTsKKworICBSdW4oc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSQkdG1wZGlyIC0tcGx1Z19vdXQ9JCR0bXBkaXIgIgorICAgICAgIi0tZGVzY3JpcHRvcl9zZXRfaW49JDAgYmFyLnByb3RvIiwKKyAgICAgIHN0ZDo6c3RyaW5nKCIkdG1wZGlyL2Zvb19hbmRfYmFyLmJpbiIpICsKKyAgICAgICAgICBDb21tYW5kTGluZUludGVyZmFjZTo6a1BhdGhTZXBhcmF0b3IgKyAiJHRtcGRpci9mb29fYW5kX2Jhei5iaW4iKSk7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiYmFyLnByb3RvIiwgIkJhciIpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfcGx1Z2luIiwgIiIsICJiYXIucHJvdG8iLCAiQmFyIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsCisgICAgICAgTXVsdGlwbGVJbnB1dHNXaXRoSW1wb3J0X0Rlc2NyaXB0b3JTZXRJbl9NaXNzaW5nSW1wb3J0KSB7CisgIC8vIFRlc3QgcGFyc2luZyBtdWx0aXBsZSBpbnB1dCBmaWxlcyB3aXRoIGFuIGltcG9ydCBvZiBhIHNlcGFyYXRlIGZpbGUuCisgIEZpbGVEZXNjcmlwdG9yU2V0IGZpbGVfZGVzY3JpcHRvcl9zZXQ7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byogZmlsZV9kZXNjcmlwdG9yX3Byb3RvID0gZmlsZV9kZXNjcmlwdG9yX3NldC5hZGRfZmlsZSgpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5hZGRfbWVzc2FnZV90eXBlKCktPnNldF9uYW1lKCJGb28iKTsKKworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCk7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+c2V0X25hbWUoImJhci5wcm90byIpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9kZXBlbmRlbmN5KCJiYXoucHJvdG8iKTsKKyAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlID0gZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5hZGRfbWVzc2FnZV90eXBlKCk7CisgIG1lc3NhZ2UtPnNldF9uYW1lKCJCYXIiKTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkID0gbWVzc2FnZS0+YWRkX2ZpZWxkKCk7CisgIGZpZWxkLT5zZXRfdHlwZV9uYW1lKCJCYXoiKTsKKyAgZmllbGQtPnNldF9uYW1lKCJhIik7CisgIGZpZWxkLT5zZXRfbnVtYmVyKDEpOworCisgIFdyaXRlRGVzY3JpcHRvclNldCgiZm9vX2FuZF9iYXIuYmluIiwgJmZpbGVfZGVzY3JpcHRvcl9zZXQpOworCisgIGZpbGVfZGVzY3JpcHRvcl9zZXQuY2xlYXJfZmlsZSgpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCk7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+c2V0X25hbWUoImJhei5wcm90byIpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkJheiIpOworCisgIFdyaXRlRGVzY3JpcHRvclNldCgiYmF6LmJpbiIsICZmaWxlX2Rlc2NyaXB0b3Jfc2V0KTsKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgLS1wbHVnX291dD0kdG1wZGlyICIKKyAgICAgICItLWRlc2NyaXB0b3Jfc2V0X2luPSR0bXBkaXIvZm9vX2FuZF9iYXIuYmluICIKKyAgICAgICJmb28ucHJvdG8gYmFyLnByb3RvIik7CisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKAorICAgICAgImJhci5wcm90bzogSW1wb3J0IFwiYmF6LnByb3RvXCIgd2FzIG5vdCBmb3VuZCBvciBoYWQgZXJyb3JzLiIpOworICBFeHBlY3RFcnJvclN1YnN0cmluZygiYmFyLnByb3RvOiBcIkJhelwiIGlzIG5vdCBkZWZpbmVkLiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LAorICAgICAgIElucHV0c09ubHlGcm9tRGVzY3JpcHRvclNldEluX1VudXNlZEltcG9ydElzTm90UmVwb3J0ZWQpIHsKKyAgRmlsZURlc2NyaXB0b3JTZXQgZmlsZV9kZXNjcmlwdG9yX3NldDsKKworICBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCk7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+c2V0X25hbWUoInVudXNlZC5wcm90byIpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIlVudXNlZCIpOworCisgIGZpbGVfZGVzY3JpcHRvcl9wcm90byA9IGZpbGVfZGVzY3JpcHRvcl9zZXQuYWRkX2ZpbGUoKTsKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5zZXRfbmFtZSgiYmFyLnByb3RvIik7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+YWRkX2RlcGVuZGVuY3koInVudXNlZC5wcm90byIpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkJhciIpOworCisgIFdyaXRlRGVzY3JpcHRvclNldCgidW51c2VkX2FuZF9iYXIuYmluIiwgJmZpbGVfZGVzY3JpcHRvcl9zZXQpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyIC0tcGx1Z19vdXQ9JHRtcGRpciAiCisgICAgICAiLS1kZXNjcmlwdG9yX3NldF9pbj0kdG1wZGlyL3VudXNlZF9hbmRfYmFyLmJpbiB1bnVzZWQucHJvdG8gYmFyLnByb3RvIik7CisgIEV4cGVjdE5vRXJyb3JzKCk7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsCisgICAgICAgSW5wdXRzRnJvbURlc2NyaXB0b3JTZXRJbkFuZEZpbGVTeXN0ZW1fVW51c2VkSW1wb3J0SXNSZXBvcnRlZCkgeworICBGaWxlRGVzY3JpcHRvclNldCBmaWxlX2Rlc2NyaXB0b3Jfc2V0OworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGVfZGVzY3JpcHRvcl9wcm90byA9IGZpbGVfZGVzY3JpcHRvcl9zZXQuYWRkX2ZpbGUoKTsKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5zZXRfbmFtZSgidW51c2VkLnByb3RvIik7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+YWRkX21lc3NhZ2VfdHlwZSgpLT5zZXRfbmFtZSgiVW51c2VkIik7CisKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvID0gZmlsZV9kZXNjcmlwdG9yX3NldC5hZGRfZmlsZSgpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPnNldF9uYW1lKCJiYXIucHJvdG8iKTsKKyAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5hZGRfZGVwZW5kZW5jeSgidW51c2VkLnByb3RvIik7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+YWRkX21lc3NhZ2VfdHlwZSgpLT5zZXRfbmFtZSgiQmFyIik7CisKKyAgV3JpdGVEZXNjcmlwdG9yU2V0KCJ1bnVzZWRfYW5kX2Jhci5iaW4iLCAmZmlsZV9kZXNjcmlwdG9yX3NldCk7CisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAiaW1wb3J0IFwiYmFyLnByb3RvXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIEJhciBiYXIgPSAxO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgLS1wbHVnX291dD0kdG1wZGlyICIKKyAgICAgICItLWRlc2NyaXB0b3Jfc2V0X2luPSR0bXBkaXIvdW51c2VkX2FuZF9iYXIuYmluICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciB1bnVzZWQucHJvdG8gYmFyLnByb3RvIGZvby5wcm90byIpOworICAvLyBSZXBvcnRpbmcgdW51c2VkIGltcG9ydHMgaGVyZSBpcyB1bmZhaXIsIHNpbmNlIGl0J3MgdW5hY3Rpb25hYmxlLiBOb3RpY2UKKyAgLy8gdGhlIGxhY2sgb2YgYSBsaW5lIG51bWJlci4KKyAgLy8gVE9ETyhiLzE0NDg1MzA2MSk6IElmIHRoZSBmaWxlIHdpdGggdW51c2VkIGltcG9ydCBpcyBmcm9tIHRoZSBkZXNjcmlwdG9yCisgIC8vIHNldCBhbmQgbm90IGZyb20gdGhlIGZpbGUgc3lzdGVtLCBzdXBwcmVzcyB0aGUgd2FybmluZy4KKyAgRXhwZWN0V2FybmluZ1N1YnN0cmluZygiYmFyLnByb3RvOiB3YXJuaW5nOiBJbXBvcnQgdW51c2VkLnByb3RvIGlzIHVudXNlZC4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwKKyAgICAgICBPbmx5UmVwb3J0c1VudXNlZEltcG9ydHNGb3JGaWxlc0JlaW5nR2VuZXJhdGVkKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJ1bnVzZWQucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgVW51c2VkIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAiaW1wb3J0IFwidW51c2VkLnByb3RvXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJhciB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgImltcG9ydCBcImJhci5wcm90b1wiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICAgICAgICAgICAgICAiICBvcHRpb25hbCBCYXIgYmFyID0gMTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUmVwb3J0c1RyYW5zaXRpdmVNaXNpbmdJbXBvcnRzX0xlYWZGaXJzdCkgeworICBDcmVhdGVUZW1wRmlsZSgidW51c2VkLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIFVudXNlZCB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgImltcG9ydCBcInVudXNlZC5wcm90b1wiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBCYXIge31cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgb3B0aW9uYWwgQmFyIGJhciA9IDE7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyLnByb3RvIGZvby5wcm90byIpOworICBFeHBlY3RXYXJuaW5nU3Vic3RyaW5nKAorICAgICAgImJhci5wcm90bzoyOjE6IHdhcm5pbmc6IEltcG9ydCB1bnVzZWQucHJvdG8gaXMgdW51c2VkLiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBSZXBvcnRzVHJhbnNpdGl2ZU1pc2luZ0ltcG9ydHNfTGVhZkxhc3QpIHsKKyAgQ3JlYXRlVGVtcEZpbGUoInVudXNlZC5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBVbnVzZWQge31cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJpbXBvcnQgXCJ1bnVzZWQucHJvdG9cIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgQmFyIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAiaW1wb3J0IFwiYmFyLnByb3RvXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIEJhciBiYXIgPSAxO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byBiYXIucHJvdG8iKTsKKyAgRXhwZWN0V2FybmluZ1N1YnN0cmluZygKKyAgICAgICJiYXIucHJvdG86MjoxOiB3YXJuaW5nOiBJbXBvcnQgdW51c2VkLnByb3RvIGlzIHVudXNlZC4iKTsKK30KK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIENyZWF0ZURpcmVjdG9yeSkgeworICAvLyBUZXN0IHRoYXQgd2hlbiB3ZSBvdXRwdXQgdG8gYSBzdWItZGlyZWN0b3J5LCBpdCBpcyBjcmVhdGVkLgorCisgIENyZWF0ZVRlbXBGaWxlKCJiYXIvYmF6L2Zvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIpOworICBDcmVhdGVUZW1wRGlyKCJvdXQiKTsKKyAgQ3JlYXRlVGVtcERpcigicGx1Z291dCIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyL291dCAtLXBsdWdfb3V0PSR0bXBkaXIvcGx1Z291dCAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyL2Jhei9mb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJiYXIvYmF6L2Zvby5wcm90byIsICJGb28iLCAib3V0Iik7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9wbHVnaW4iLCAiIiwgImJhci9iYXovZm9vLnByb3RvIiwgIkZvbyIsICJwbHVnb3V0Iik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvclBhcmFtZXRlcnMpIHsKKyAgLy8gVGVzdCB0aGF0IGdlbmVyYXRvciBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0bHkgcGFyc2VkIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PVRlc3RQYXJhbWV0ZXI6JHRtcGRpciAiCisgICAgICAiLS1wbHVnX291dD1UZXN0UGx1Z2luUGFyYW1ldGVyOiR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiVGVzdFBhcmFtZXRlciIsICJmb28ucHJvdG8iLCAiRm9vIik7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9wbHVnaW4iLCAiVGVzdFBsdWdpblBhcmFtZXRlciIsICJmb28ucHJvdG8iLCAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEV4dHJhR2VuZXJhdG9yUGFyYW1ldGVycykgeworICAvLyBUZXN0IHRoYXQgZ2VuZXJhdG9yIHBhcmFtZXRlcnMgc3BlY2lmaWVkIHdpdGggdGhlIG9wdGlvbiBmbGFnIGFyZQorICAvLyBjb3JyZWN0bHkgcGFzc2VkIHRvIHRoZSBjb2RlIGdlbmVyYXRvci4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIC8vIENyZWF0ZSB0aGUgImEiIGFuZCAiYiIgc3ViLWRpcmVjdG9yaWVzLgorICBDcmVhdGVUZW1wRGlyKCJhIik7CisgIENyZWF0ZVRlbXBEaXIoImIiKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyICIKKyAgICAgICItLXRlc3Rfb3B0PWZvbzEgIgorICAgICAgIi0tdGVzdF9vdXQ9YmFyOiR0bXBkaXIvYSAiCisgICAgICAiLS10ZXN0X29wdD1mb28yICIKKyAgICAgICItLXRlc3Rfb3V0PWJhejokdG1wZGlyL2IgIgorICAgICAgIi0tdGVzdF9vcHQ9Zm9vMyAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICJiYXIsZm9vMSxmb28yLGZvbzMiLCAiZm9vLnByb3RvIiwgIkZvbyIsCisgICAgICAgICAgICAgICAgICAiYSIpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgImJheixmb28xLGZvbzIsZm9vMyIsICJmb28ucHJvdG8iLCAiRm9vIiwKKyAgICAgICAgICAgICAgICAgICJiIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEV4dHJhUGx1Z2luUGFyYW1ldGVycykgeworICAvLyBUZXN0IHRoYXQgZ2VuZXJhdG9yIHBhcmFtZXRlcnMgc3BlY2lmaWVkIHdpdGggdGhlIG9wdGlvbiBmbGFnIGFyZQorICAvLyBjb3JyZWN0bHkgcGFzc2VkIHRvIHRoZSBjb2RlIGdlbmVyYXRvci4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIC8vIENyZWF0ZSB0aGUgImEiIGFuZCAiYiIgc3ViLWRpcmVjdG9yaWVzLgorICBDcmVhdGVUZW1wRGlyKCJhIik7CisgIENyZWF0ZVRlbXBEaXIoImIiKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyICIKKyAgICAgICItLXBsdWdfb3B0PWZvbzEgIgorICAgICAgIi0tcGx1Z19vdXQ9YmFyOiR0bXBkaXIvYSAiCisgICAgICAiLS1wbHVnX29wdD1mb28yICIKKyAgICAgICItLXBsdWdfb3V0PWJhejokdG1wZGlyL2IgIgorICAgICAgIi0tcGx1Z19vcHQ9Zm9vMyAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X3BsdWdpbiIsICJiYXIsZm9vMSxmb28yLGZvbzMiLCAiZm9vLnByb3RvIiwgIkZvbyIsICJhIik7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9wbHVnaW4iLCAiYmF6LGZvbzEsZm9vMixmb28zIiwgImZvby5wcm90byIsICJGb28iLCAiYiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBVbnJlY29nbml6ZWRFeHRyYVBhcmFtZXRlcnMpIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wbHVnX291dD1UZXN0UGFyYW1ldGVyOiR0bXBkaXIgIgorICAgICAgIi0tdW5rbm93bl9wbHVnX2Ffb3B0PUZvbyAiCisgICAgICAiLS11bmtub3duX3BsdWdfYl9vcHQ9QmFyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygiVW5rbm93biBmbGFnOiAtLXVua25vd25fcGx1Z19hX29wdCIpOworICBFeHBlY3RFcnJvclN1YnN0cmluZygiVW5rbm93biBmbGFnOiAtLXVua25vd25fcGx1Z19iX29wdCIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBFeHRyYVBsdWdpblBhcmFtZXRlcnNGb3JPdXRQYXJhbWV0ZXJzKSB7CisgIC8vIFRoaXMgZG9lc24ndCByZWx5IG9uIHRoZSBwbHVnaW4gaGF2aW5nIGJlZW4gcmVnaXN0ZXJlZCBhbmQgaW5zdGVhZCB0aGF0CisgIC8vIHRoZSBleGlzdGVuY2Ugb2YgLS1bbmFtZV1fb3V0IGlzIGVub3VnaCB0byBtYWtlIHRoZSAtLVtuYW1lXV9vcHQgdmFsaWQuCisgIC8vIEhvd2V2ZXIsIHJ1bm5pbmcgb3V0IG9mIHByb2Nlc3MgcGx1Z2lucyBmb3VuZCB2aWEgdGhlIHNlYXJjaCBwYXRoIChpLmUuIC0KKyAgLy8gbm90IHByZSByZWdpc3RlcmVkIHdpdGggLS1wbHVnaW4pIGlzbid0IHN1cHBvcnQgaW4gdGhpcyB0ZXN0IHN1aXRlLCBzbyB3ZQorICAvLyBsaXN0IHRoZSBvcHRpb25zIHByZS9wb3N0IHRoZSBfb3V0IGRpcmVjdGl2ZSwgYW5kIHRoZW4gaW5jbHVkZSBfb3B0IHRoYXQKKyAgLy8gd2lsbCBiZSB1bmtub3duLCBhbmQgY29uZmlybSB0aGUgZmFpbHVyZSBvdXRwdXQgaXMgYWJvdXQgdGhlIGV4cGVjdGVkCisgIC8vIHVua25vd24gZGlyZWN0aXZlLCB3aGljaCBtZWFucyB0aGUgb3RoZXIgd2VyZSBhY2NlcHRlZC4KKyAgLy8gTk9URTogVW5yZWNvZ25pemVkRXh0cmFQYXJhbWV0ZXJzIGNvbmZpcm1zIHRoYXQgaWYgdHdvIHVua25vd24gX29wdAorICAvLyBkaXJlY3RpdmVzIGFwcGVhciwgdGhleSBib3RoIGFyZSByZXBvcnRlZC4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXBsdWdfb3V0PVRlc3RQYXJhbWV0ZXI6JHRtcGRpciAiCisgICAgICAiLS14eXpfb3B0PWZvbz1iYXIgLS14eXpfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tYWJjX291dD0kdG1wZGlyIC0tYWJjX29wdD1mb289YmFyICIKKyAgICAgICItLXVua25vd25fcGx1Z19vcHQ9Rm9vICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclRleHQoIlVua25vd24gZmxhZzogLS11bmtub3duX3BsdWdfb3B0XG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgSW5zZXJ0KSB7CisgIC8vIFRlc3QgcnVubmluZyBhIGdlbmVyYXRvciB0aGF0IGluc2VydHMgY29kZSBpbnRvIGFub3RoZXIncyBvdXRwdXQuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgIgorICAgICAgIi0tdGVzdF9vdXQ9VGVzdFBhcmFtZXRlcjokdG1wZGlyICIKKyAgICAgICItLXBsdWdfb3V0PVRlc3RQbHVnaW5QYXJhbWV0ZXI6JHRtcGRpciAiCisgICAgICAiLS10ZXN0X291dD1pbnNlcnQ9dGVzdF9nZW5lcmF0b3IsdGVzdF9wbHVnaW46JHRtcGRpciAiCisgICAgICAiLS1wbHVnX291dD1pbnNlcnQ9dGVzdF9nZW5lcmF0b3IsdGVzdF9wbHVnaW46JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aEluc2VydGlvbnMoInRlc3RfZ2VuZXJhdG9yIiwgIlRlc3RQYXJhbWV0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF9nZW5lcmF0b3IsdGVzdF9wbHVnaW4iLCAiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvbyIpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoSW5zZXJ0aW9ucygidGVzdF9wbHVnaW4iLCAiVGVzdFBsdWdpblBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X2dlbmVyYXRvcix0ZXN0X3BsdWdpbiIsICJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEluc2VydFdpdGhBbm5vdGF0aW9uRml4dXApIHsKKyAgLy8gQ2hlY2sgdGhhdCBhbm5vdGF0aW9uIHNwYW5zIGFyZSB1cGRhdGVkIGFmdGVyIGluc2VydGlvbnMuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBNb2NrQ29kZUdlbmVyYXRvcl9Bbm5vdGF0ZSB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAiCisgICAgICAiLS10ZXN0X291dD1UZXN0UGFyYW1ldGVyOiR0bXBkaXIgIgorICAgICAgIi0tcGx1Z19vdXQ9VGVzdFBsdWdpblBhcmFtZXRlcjokdG1wZGlyICIKKyAgICAgICItLXRlc3Rfb3V0PWluc2VydF9lbmRsaW5lcz10ZXN0X2dlbmVyYXRvcix0ZXN0X3BsdWdpbjokdG1wZGlyICIKKyAgICAgICItLXBsdWdfb3V0PWluc2VydF9lbmRsaW5lcz10ZXN0X2dlbmVyYXRvcix0ZXN0X3BsdWdpbjokdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBDaGVja0dlbmVyYXRlZEFubm90YXRpb25zKCJ0ZXN0X2dlbmVyYXRvciIsICJmb28ucHJvdG8iKTsKKyAgQ2hlY2tHZW5lcmF0ZWRBbm5vdGF0aW9ucygidGVzdF9wbHVnaW4iLCAiZm9vLnByb3RvIik7Cit9CisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV2luZG93c091dHB1dFBhdGgpIHsKKyAgLy8gVGVzdCB0aGF0IHRoZSBvdXRwdXQgcGF0aCBjYW4gYmUgYSBXaW5kb3dzLXN0eWxlIHBhdGguCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsICJzeW50YXggPSBcInByb3RvMlwiO1xuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLW51bGxfb3V0PUM6XFwgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdE51bGxDb2RlR2VuZXJhdG9yQ2FsbGVkKCIiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV2luZG93c091dHB1dFBhdGhBbmRQYXJhbWV0ZXIpIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGNhbiBoYXZlIGEgd2luZG93cy1zdHlsZSBvdXRwdXQgcGF0aCBhbmQgYSBwYXJhbWV0ZXIuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsICJzeW50YXggPSBcInByb3RvMlwiO1xuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLW51bGxfb3V0PWJhcjpDOlxcICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3ROdWxsQ29kZUdlbmVyYXRvckNhbGxlZCgiYmFyIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFRyYWlsaW5nQmFja3NsYXNoKSB7CisgIC8vIFRlc3QgdGhhdCB0aGUgZGlyZWN0b3JpZXMgY2FuIGVuZCBpbiBiYWNrc2xhc2hlcy4gIFNvbWUgdXNlcnMgY2xhaW0gdGhpcworICAvLyBkb2Vzbid0IHdvcmsgb24gdGhlaXIgc3lzdGVtLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpclxcICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpclxcIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV2luMzJFcnJvck1lc3NhZ2UpIHsKKyAgRVhQRUNUX0VRKCJUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC5cclxuIiwKKyAgICAgICAgICAgIFN1YnByb2Nlc3M6OldpbjMyRXJyb3JNZXNzYWdlKEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKSk7Cit9CisKKyNlbmRpZiAgLy8gZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGF0aExvb2t1cCkgeworICAvLyBUZXN0IHRoYXQgc3BlY2lmeWluZyBtdWx0aXBsZSBkaXJlY3RvcmllcyBpbiB0aGUgcHJvdG8gc2VhcmNoIHBhdGggd29ya3MuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImIvYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJhciB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJhL2Zvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAiaW1wb3J0IFwiYmFyLnByb3RvXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIEJhciBhID0gMTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYi9mb28ucHJvdG8iLCAidGhpcyBzaG91bGQgbm90IGJlIHBhcnNlZFxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyL2EgLS1wcm90b19wYXRoPSR0bXBkaXIvYiBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIENvbG9uRGVsaW1pdGVkUGF0aCkgeworICAvLyBTYW1lIGFzIFBhdGhMb29rdXAsIGJ1dCB3ZSBwcm92aWRlIHRoZSBwcm90b19wYXRoIGluIGEgc2luZ2xlIGZsYWcuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImIvYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJhciB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJhL2Zvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAiaW1wb3J0IFwiYmFyLnByb3RvXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIEJhciBhID0gMTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYi9mb28ucHJvdG8iLCAidGhpcyBzaG91bGQgbm90IGJlIHBhcnNlZFxuIik7CisKKyAgUnVuKHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kJHRtcGRpciAtLXByb3RvX3BhdGg9JDAgZm9vLnByb3RvIiwKKyAgICAgIHN0ZDo6c3RyaW5nKCIkdG1wZGlyL2EiKSArIENvbW1hbmRMaW5lSW50ZXJmYWNlOjprUGF0aFNlcGFyYXRvciArCisgICAgICAgICAgIiR0bXBkaXIvYiIpKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE5vblJvb3RNYXBwaW5nKSB7CisgIC8vIFRlc3Qgc2V0dGluZyB1cCBhIHNlYXJjaCBwYXRoIG1hcHBpbmcgYSBkaXJlY3RvcnkgdG8gYSBub24tcm9vdCBsb2NhdGlvbi4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD1iYXI9JHRtcGRpciBiYXIvZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiYmFyL2Zvby5wcm90byIsICJGb28iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGF0aFdpdGhFcXVhbHNTaWduKSB7CisgIC8vIFRlc3Qgc2V0dGluZyB1cCBhIHNlYXJjaCBwYXRoIHdoaWNoIGhhcHBlbnMgdG8gaGF2ZSAnPScgaW4gaXQuCisKKyAgQ3JlYXRlVGVtcERpcigid2l0aD1zaWduIik7CisgIENyZWF0ZVRlbXBGaWxlKCJ3aXRoPXNpZ24vZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyL3dpdGg9c2lnbiBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE11bHRpcGxlR2VuZXJhdG9ycykgeworICAvLyBUZXN0IHRoYXQgd2UgY2FuIGhhdmUgbXVsdGlwbGUgZ2VuZXJhdG9ycyBhbmQgdXNlIGJvdGggaW4gb25lIGludm9jYXRpb24sCisgIC8vIGVhY2ggd2l0aCBhIGRpZmZlcmVudCBvdXRwdXQgZGlyZWN0b3J5LgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKyAgLy8gQ3JlYXRlIHRoZSAiYSIgYW5kICJiIiBzdWItZGlyZWN0b3JpZXMuCisgIENyZWF0ZVRlbXBEaXIoImEiKTsKKyAgQ3JlYXRlVGVtcERpcigiYiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgIgorICAgICAgIi0tdGVzdF9vdXQ9JHRtcGRpci9hICIKKyAgICAgICItLWFsdF9vdXQ9JHRtcGRpci9iICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIiwgImEiKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJhbHRfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIiwgImIiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgRGlzYWxsb3dTZXJ2aWNlc05vU2VydmljZXMpIHsKKyAgLy8gVGVzdCB0aGF0IC0tZGlzYWxsb3dfc2VydmljZXMgZG9lc24ndCBjYXVzZSBhIHByb2JsZW0gd2hlbiB0aGVyZSBhcmUgbm8KKyAgLy8gc2VydmljZXMuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1kaXNhbGxvd19zZXJ2aWNlcyAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgRGlzYWxsb3dTZXJ2aWNlc0hhc1NlcnZpY2UpIHsKKyAgLy8gVGVzdCB0aGF0IC0tZGlzYWxsb3dfc2VydmljZXMgcHJvZHVjZXMgYW4gZXJyb3Igd2hlbiB0aGVyZSBhcmUgc2VydmljZXMuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIKKyAgICAgICAgICAgICAgICAgInNlcnZpY2UgQmFyIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGlzYWxsb3dfc2VydmljZXMgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygiZm9vLnByb3RvOiBUaGlzIGZpbGUgY29udGFpbnMgc2VydmljZXMiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgQWxsb3dTZXJ2aWNlc0hhc1NlcnZpY2UpIHsKKyAgLy8gVGVzdCB0aGF0IHNlcnZpY2VzIHdvcmsgZmluZSBhcyBsb25nIGFzIC0tZGlzYWxsb3dfc2VydmljZXMgaXMgbm90IHVzZWQuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIKKyAgICAgICAgICAgICAgICAgInNlcnZpY2UgQmFyIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIERpcmVjdERlcGVuZGVuY2llc19NaXNzaW5nX0VtcHR5TGlzdCkgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHsgb3B0aW9uYWwgQmFyIGJhciA9IDE7IH0iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBCYXIgeyBvcHRpb25hbCBzdHJpbmcgdGV4dCA9IDE7IH0iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAtLXByb3RvX3BhdGg9JHRtcGRpciAiCisgICAgICAiLS1kaXJlY3RfZGVwZW5kZW5jaWVzPSBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclRleHQoCisgICAgICAiZm9vLnByb3RvOiBGaWxlIGlzIGltcG9ydGVkIGJ1dCBub3QgZGVjbGFyZWQgaW4gLS1kaXJlY3RfZGVwZW5kZW5jaWVzOiAiCisgICAgICAiYmFyLnByb3RvXG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgRGlyZWN0RGVwZW5kZW5jaWVzX01pc3NpbmcpIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAiaW1wb3J0IFwiYmFyLnByb3RvXCI7XG4iCisgICAgICAgICAgICAgICAgICJpbXBvcnQgXCJibGEucHJvdG9cIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHsgb3B0aW9uYWwgQmFyIGJhciA9IDE7IG9wdGlvbmFsIEJsYSBibGEgPSAyOyB9Iik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgQmFyIHsgb3B0aW9uYWwgc3RyaW5nIHRleHQgPSAxOyB9Iik7CisgIENyZWF0ZVRlbXBGaWxlKCJibGEucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgQmxhIHsgb3B0aW9uYWwgaW50NjQgbnVtYmVyID0gMTsgfSIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyIC0tcHJvdG9fcGF0aD0kdG1wZGlyICIKKyAgICAgICItLWRpcmVjdF9kZXBlbmRlbmNpZXM9YmxhLnByb3RvIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgKKyAgICAgICJmb28ucHJvdG86IEZpbGUgaXMgaW1wb3J0ZWQgYnV0IG5vdCBkZWNsYXJlZCBpbiAtLWRpcmVjdF9kZXBlbmRlbmNpZXM6ICIKKyAgICAgICJiYXIucHJvdG9cbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBEaXJlY3REZXBlbmRlbmNpZXNfTm9WaW9sYXRpb24pIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAiaW1wb3J0IFwiYmFyLnByb3RvXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7IG9wdGlvbmFsIEJhciBiYXIgPSAxOyB9Iik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgQmFyIHsgb3B0aW9uYWwgc3RyaW5nIHRleHQgPSAxOyB9Iik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgLS1wcm90b19wYXRoPSR0bXBkaXIgIgorICAgICAgIi0tZGlyZWN0X2RlcGVuZGVuY2llcz1iYXIucHJvdG8gZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgRGlyZWN0RGVwZW5kZW5jaWVzX05vVmlvbGF0aW9uX011bHRpSW1wb3J0cykgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIKKyAgICAgICAgICAgICAgICAgImltcG9ydCBcImJsYS5wcm90b1wiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28geyBvcHRpb25hbCBCYXIgYmFyID0gMTsgb3B0aW9uYWwgQmxhIGJsYSA9IDI7IH0iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBCYXIgeyBvcHRpb25hbCBzdHJpbmcgdGV4dCA9IDE7IH0iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJsYS5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBCbGEgeyBvcHRpb25hbCBpbnQ2NCBudW1iZXIgPSAxOyB9Iik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgLS1wcm90b19wYXRoPSR0bXBkaXIgIgorICAgICAgIi0tZGlyZWN0X2RlcGVuZGVuY2llcz1iYXIucHJvdG86YmxhLnByb3RvIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIERpcmVjdERlcGVuZGVuY2llc19Qcm92aWRlZE11bHRpcGxlVGltZXMpIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsICJzeW50YXggPSBcInByb3RvMlwiO1xuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgLS1wcm90b19wYXRoPSR0bXBkaXIgIgorICAgICAgIi0tZGlyZWN0X2RlcGVuZGVuY2llcz1iYXIucHJvdG8gLS1kaXJlY3RfZGVwZW5kZW5jaWVzPWJsYS5wcm90byAiCisgICAgICAiZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KAorICAgICAgIi0tZGlyZWN0X2RlcGVuZGVuY2llcyBtYXkgb25seSBiZSBwYXNzZWQgb25jZS4gVG8gc3BlY2lmeSBtdWx0aXBsZSAiCisgICAgICAiZGlyZWN0IGRlcGVuZGVuY2llcywgcGFzcyB0aGVtIGFsbCBhcyBhIHNpbmdsZSBwYXJhbWV0ZXIgc2VwYXJhdGVkIGJ5ICIKKyAgICAgICInOicuXG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgRGlyZWN0RGVwZW5kZW5jaWVzX0N1c3RvbUVycm9yTWVzc2FnZSkgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHsgb3B0aW9uYWwgQmFyIGJhciA9IDE7IH0iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBCYXIgeyBvcHRpb25hbCBzdHJpbmcgdGV4dCA9IDE7IH0iKTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29tbWFuZHM7CisgIGNvbW1hbmRzLnB1c2hfYmFjaygicHJvdG9jb2xfY29tcGlsZXIiKTsKKyAgY29tbWFuZHMucHVzaF9iYWNrKCItLXRlc3Rfb3V0PSR0bXBkaXIiKTsKKyAgY29tbWFuZHMucHVzaF9iYWNrKCItLXByb3RvX3BhdGg9JHRtcGRpciIpOworICBjb21tYW5kcy5wdXNoX2JhY2soIi0tZGlyZWN0X2RlcGVuZGVuY2llcz0iKTsKKyAgY29tbWFuZHMucHVzaF9iYWNrKCItLWRpcmVjdF9kZXBlbmRlbmNpZXNfdmlvbGF0aW9uX21zZz1CbGEgXCIlc1wiIEJsYSIpOworICBjb21tYW5kcy5wdXNoX2JhY2soImZvby5wcm90byIpOworICBSdW5XaXRoQXJncyhjb21tYW5kcyk7CisKKyAgRXhwZWN0RXJyb3JUZXh0KCJmb28ucHJvdG86IEJsYSBcImJhci5wcm90b1wiIEJsYVxuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEN3ZFJlbGF0aXZlSW5wdXRzKSB7CisgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gYWNjZXB0IHdvcmtpbmctZGlyZWN0b3J5LXJlbGF0aXZlIGlucHV0IGZpbGVzLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgJHRtcGRpci9mb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFdyaXRlRGVzY3JpcHRvclNldCkgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBCYXIge1xuIgorICAgICAgICAgICAgICAgICAiICBvcHRpb25hbCBGb28gZm9vID0gMTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1kZXNjcmlwdG9yX3NldF9vdXQ9JHRtcGRpci9kZXNjcmlwdG9yX3NldCAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKworICBGaWxlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldDsKKyAgUmVhZERlc2NyaXB0b3JTZXQoImRlc2NyaXB0b3Jfc2V0IiwgJmRlc2NyaXB0b3Jfc2V0KTsKKyAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgIEVYUEVDVF9FUSgxLCBkZXNjcmlwdG9yX3NldC5maWxlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5uYW1lKCkpOworICAvLyBEZXNjcmlwdG9yIHNldCBzaG91bGQgbm90IGhhdmUgc291cmNlIGNvZGUgaW5mby4KKyAgRVhQRUNUX0ZBTFNFKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkuaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7CisgIC8vIERlc2NyaXB0b3Igc2V0IHNob3VsZCBoYXZlIGpzb25fbmFtZS4KKyAgRVhQRUNUX0VRKCJCYXIiLCBkZXNjcmlwdG9yX3NldC5maWxlKDApLm1lc3NhZ2VfdHlwZSgwKS5uYW1lKCkpOworICBFWFBFQ1RfRVEoImZvbyIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubWVzc2FnZV90eXBlKDApLmZpZWxkKDApLm5hbWUoKSk7CisgIEVYUEVDVF9UUlVFKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubWVzc2FnZV90eXBlKDApLmZpZWxkKDApLmhhc19qc29uX25hbWUoKSk7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFdyaXRlRGVzY3JpcHRvclNldFdpdGhEdXBsaWNhdGVzKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAiaW1wb3J0IFwiZm9vLnByb3RvXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIEZvbyBmb28gPSAxO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXoucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBCYXoge1xuIgorICAgICAgICAgICAgICAgICAiICBvcHRpb25hbCBGb28gZm9vID0gMTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1kZXNjcmlwdG9yX3NldF9vdXQ9JHRtcGRpci9kZXNjcmlwdG9yX3NldCAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyLnByb3RvIGZvby5wcm90byBiYXIucHJvdG8gYmF6LnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKworICBGaWxlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldDsKKyAgUmVhZERlc2NyaXB0b3JTZXQoImRlc2NyaXB0b3Jfc2V0IiwgJmRlc2NyaXB0b3Jfc2V0KTsKKyAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgIEVYUEVDVF9FUSgzLCBkZXNjcmlwdG9yX3NldC5maWxlX3NpemUoKSk7CisgIC8vIGZvbyBzaG91bGQgY29tZSBmaXJzdCBzaW5jZSB0aGUgb3V0cHV0IGlzIGluIGRlcGVuZGVuY3kgb3JkZXIuCisgIC8vIHNpbmNlIGJhciBhbmQgYmF6IGFyZSB1bm9yZGVyZWQsIHRoZXkgc2hvdWxkIGJlIGluIGNvbW1hbmQgbGluZSBvcmRlci4KKyAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBkZXNjcmlwdG9yX3NldC5maWxlKDApLm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgxKS5uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhei5wcm90byIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMikubmFtZSgpKTsKKyAgLy8gRGVzY3JpcHRvciBzZXQgc2hvdWxkIG5vdCBoYXZlIHNvdXJjZSBjb2RlIGluZm8uCisgIEVYUEVDVF9GQUxTRShkZXNjcmlwdG9yX3NldC5maWxlKDApLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOworICAvLyBEZXNjcmlwdG9yIHNldCBzaG91bGQgaGF2ZSBqc29uX25hbWUuCisgIEVYUEVDVF9FUSgiQmFyIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgxKS5tZXNzYWdlX3R5cGUoMCkubmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBkZXNjcmlwdG9yX3NldC5maWxlKDEpLm1lc3NhZ2VfdHlwZSgwKS5maWVsZCgwKS5uYW1lKCkpOworICBFWFBFQ1RfVFJVRShkZXNjcmlwdG9yX3NldC5maWxlKDEpLm1lc3NhZ2VfdHlwZSgwKS5maWVsZCgwKS5oYXNfanNvbl9uYW1lKCkpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXcml0ZURlc2NyaXB0b3JTZXRXaXRoU291cmNlSW5mbykgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBCYXIge1xuIgorICAgICAgICAgICAgICAgICAiICBvcHRpb25hbCBGb28gZm9vID0gMTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1kZXNjcmlwdG9yX3NldF9vdXQ9JHRtcGRpci9kZXNjcmlwdG9yX3NldCAiCisgICAgICAiLS1pbmNsdWRlX3NvdXJjZV9pbmZvIC0tcHJvdG9fcGF0aD0kdG1wZGlyIGJhci5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisKKyAgRmlsZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQ7CisgIFJlYWREZXNjcmlwdG9yU2V0KCJkZXNjcmlwdG9yX3NldCIsICZkZXNjcmlwdG9yX3NldCk7CisgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICBFWFBFQ1RfRVEoMSwgZGVzY3JpcHRvcl9zZXQuZmlsZV9zaXplKCkpOworICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubmFtZSgpKTsKKyAgLy8gU291cmNlIGNvZGUgaW5mbyBpbmNsdWRlZC4KKyAgRVhQRUNUX1RSVUUoZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV3JpdGVUcmFuc2l0aXZlRGVzY3JpcHRvclNldCkgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBCYXIge1xuIgorICAgICAgICAgICAgICAgICAiICBvcHRpb25hbCBGb28gZm9vID0gMTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1kZXNjcmlwdG9yX3NldF9vdXQ9JHRtcGRpci9kZXNjcmlwdG9yX3NldCAiCisgICAgICAiLS1pbmNsdWRlX2ltcG9ydHMgLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKworICBGaWxlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldDsKKyAgUmVhZERlc2NyaXB0b3JTZXQoImRlc2NyaXB0b3Jfc2V0IiwgJmRlc2NyaXB0b3Jfc2V0KTsKKyAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgIEVYUEVDVF9FUSgyLCBkZXNjcmlwdG9yX3NldC5maWxlX3NpemUoKSk7CisgIGlmIChkZXNjcmlwdG9yX3NldC5maWxlKDApLm5hbWUoKSA9PSAiYmFyLnByb3RvIikgeworICAgIHN0ZDo6c3dhcChkZXNjcmlwdG9yX3NldC5tdXRhYmxlX2ZpbGUoKS0+bXV0YWJsZV9kYXRhKClbMF0sCisgICAgICAgICAgICAgIGRlc2NyaXB0b3Jfc2V0Lm11dGFibGVfZmlsZSgpLT5tdXRhYmxlX2RhdGEoKVsxXSk7CisgIH0KKyAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBkZXNjcmlwdG9yX3NldC5maWxlKDApLm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgxKS5uYW1lKCkpOworICAvLyBEZXNjcmlwdG9yIHNldCBzaG91bGQgbm90IGhhdmUgc291cmNlIGNvZGUgaW5mby4KKyAgRVhQRUNUX0ZBTFNFKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkuaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7CisgIEVYUEVDVF9GQUxTRShkZXNjcmlwdG9yX3NldC5maWxlKDEpLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXcml0ZVRyYW5zaXRpdmVEZXNjcmlwdG9yU2V0V2l0aFNvdXJjZUluZm8pIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJpbXBvcnQgXCJmb28ucHJvdG9cIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgQmFyIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgb3B0aW9uYWwgRm9vIGZvbyA9IDE7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGVzY3JpcHRvcl9zZXRfb3V0PSR0bXBkaXIvZGVzY3JpcHRvcl9zZXQgIgorICAgICAgIi0taW5jbHVkZV9pbXBvcnRzIC0taW5jbHVkZV9zb3VyY2VfaW5mbyAtLXByb3RvX3BhdGg9JHRtcGRpciBiYXIucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworCisgIEZpbGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0OworICBSZWFkRGVzY3JpcHRvclNldCgiZGVzY3JpcHRvcl9zZXQiLCAmZGVzY3JpcHRvcl9zZXQpOworICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgRVhQRUNUX0VRKDIsIGRlc2NyaXB0b3Jfc2V0LmZpbGVfc2l6ZSgpKTsKKyAgaWYgKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubmFtZSgpID09ICJiYXIucHJvdG8iKSB7CisgICAgc3RkOjpzd2FwKGRlc2NyaXB0b3Jfc2V0Lm11dGFibGVfZmlsZSgpLT5tdXRhYmxlX2RhdGEoKVswXSwKKyAgICAgICAgICAgICAgZGVzY3JpcHRvcl9zZXQubXV0YWJsZV9maWxlKCktPm11dGFibGVfZGF0YSgpWzFdKTsKKyAgfQorICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBkZXNjcmlwdG9yX3NldC5maWxlKDEpLm5hbWUoKSk7CisgIC8vIFNvdXJjZSBjb2RlIGluZm8gaW5jbHVkZWQuCisgIEVYUEVDVF9UUlVFKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkuaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7CisgIEVYUEVDVF9UUlVFKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMSkuaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7Cit9CisKKyNpZmRlZiBfV0lOMzIKKy8vIFRPRE8odGVib3JpbmcpOiBGaWd1cmUgb3V0IGhvdyB0byB3cml0ZSB0ZXN0IG9uIHdpbmRvd3MuCisjZWxzZQorVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV3JpdGVEZXBlbmRlbmN5TWFuaWZlc3RGaWxlR2l2ZW5Ud29JbnB1dHMpIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJpbXBvcnQgXCJmb28ucHJvdG9cIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgQmFyIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgb3B0aW9uYWwgRm9vIGZvbyA9IDE7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGVwZW5kZW5jeV9vdXQ9JHRtcGRpci9tYW5pZmVzdCAiCisgICAgICAiLS10ZXN0X291dD0kdG1wZGlyIC0tcHJvdG9fcGF0aD0kdG1wZGlyIGJhci5wcm90byBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclRleHQoCisgICAgICAiQ2FuIG9ubHkgcHJvY2VzcyBvbmUgaW5wdXQgZmlsZSB3aGVuIHVzaW5nIC0tZGVwZW5kZW5jeV9vdXQ9RklMRS5cbiIpOworfQorCisjaWZkZWYgUFJPVE9CVUZfT1BFTlNPVVJDRQorVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV3JpdGVEZXBlbmRlbmN5TWFuaWZlc3RGaWxlKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAiaW1wb3J0IFwiZm9vLnByb3RvXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIEZvbyBmb28gPSAxO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisKKyAgc3RkOjpzdHJpbmcgY3VycmVudF93b3JraW5nX2RpcmVjdG9yeSA9IGdldGN3ZChudWxscHRyLCAwKTsKKyAgU3dpdGNoVG9UZW1wRGlyZWN0b3J5KCk7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLWRlcGVuZGVuY3lfb3V0PW1hbmlmZXN0IC0tdGVzdF9vdXQ9LiAiCisgICAgICAiYmFyLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKworICBFeHBlY3RGaWxlQ29udGVudCgibWFuaWZlc3QiLAorICAgICAgICAgICAgICAgICAgICAiYmFyLnByb3RvLk1vY2tDb2RlR2VuZXJhdG9yLnRlc3RfZ2VuZXJhdG9yOiAiCisgICAgICAgICAgICAgICAgICAgICJmb28ucHJvdG9cXFxuIGJhci5wcm90byIpOworCisgIEZpbGU6OkNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoY3VycmVudF93b3JraW5nX2RpcmVjdG9yeSk7Cit9CisjZWxzZSAgLy8gIVBST1RPQlVGX09QRU5TT1VSQ0UKKy8vIFRPRE8odGVib3JpbmcpOiBGaWd1cmUgb3V0IGhvdyB0byBjaGFuZ2UgYW5kIGdldCB3b3JraW5nIGRpcmVjdG9yeSBpbgorLy8gZ29vZ2xlMy4KKyNlbmRpZiAgLy8gIVBST1RPQlVGX09QRU5TT1VSQ0UKKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV3JpdGVEZXBlbmRlbmN5TWFuaWZlc3RGaWxlRm9yQWJzb2x1dGVQYXRoKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAiaW1wb3J0IFwiZm9vLnByb3RvXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIEZvbyBmb28gPSAxO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLWRlcGVuZGVuY3lfb3V0PSR0bXBkaXIvbWFuaWZlc3QgIgorICAgICAgIi0tdGVzdF9vdXQ9JHRtcGRpciAtLXByb3RvX3BhdGg9JHRtcGRpciBiYXIucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworCisgIEV4cGVjdEZpbGVDb250ZW50KCJtYW5pZmVzdCIsCisgICAgICAgICAgICAgICAgICAgICIkdG1wZGlyL2Jhci5wcm90by5Nb2NrQ29kZUdlbmVyYXRvci50ZXN0X2dlbmVyYXRvcjogIgorICAgICAgICAgICAgICAgICAgICAiJHRtcGRpci9mb28ucHJvdG9cXFxuICR0bXBkaXIvYmFyLnByb3RvIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsCisgICAgICAgV3JpdGVEZXBlbmRlbmN5TWFuaWZlc3RGaWxlV2l0aERlc2NyaXB0b3JTZXRPdXQpIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJpbXBvcnQgXCJmb28ucHJvdG9cIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgQmFyIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgb3B0aW9uYWwgRm9vIGZvbyA9IDE7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGVwZW5kZW5jeV9vdXQ9JHRtcGRpci9tYW5pZmVzdCAiCisgICAgICAiLS1kZXNjcmlwdG9yX3NldF9vdXQ9JHRtcGRpci9iYXIucGIgLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKworICBFeHBlY3RGaWxlQ29udGVudCgibWFuaWZlc3QiLAorICAgICAgICAgICAgICAgICAgICAiJHRtcGRpci9iYXIucGI6ICIKKyAgICAgICAgICAgICAgICAgICAgIiR0bXBkaXIvZm9vLnByb3RvXFxcbiAkdG1wZGlyL2Jhci5wcm90byIpOworfQorI2VuZGlmICAvLyAhX1dJTjMyCisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFRlc3RBcmd1bWVudEZpbGUpIHsKKyAgLy8gVGVzdCBwYXJzaW5nIG11bHRpcGxlIGlucHV0IGZpbGVzIHVzaW5nIGFuIGFyZ3VtZW50IGZpbGUuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJhciB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJhcmd1bWVudHMudHh0IiwKKyAgICAgICAgICAgICAgICAgIi0tdGVzdF9vdXQ9JHRtcGRpclxuIgorICAgICAgICAgICAgICAgICAiLS1wbHVnX291dD0kdG1wZGlyXG4iCisgICAgICAgICAgICAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpclxuIgorICAgICAgICAgICAgICAgICAiLS1kaXJlY3RfZGVwZW5kZW5jaWVzX3Zpb2xhdGlvbl9tc2c9JXMgaXMgbm90IGltcG9ydGVkXG4iCisgICAgICAgICAgICAgICAgICJmb28ucHJvdG9cbiIKKyAgICAgICAgICAgICAgICAgImJhci5wcm90byIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgQCR0bXBkaXIvYXJndW1lbnRzLnR4dCIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygidGVzdF9nZW5lcmF0b3IiLCAiZm9vLnByb3RvLGJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vLnByb3RvIiwgIkZvbyIpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfZ2VuZXJhdG9yIiwgImZvby5wcm90byxiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhci5wcm90byIsICJCYXIiKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X3BsdWdpbiIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb28ucHJvdG8iLCAiRm9vIik7CisgIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygidGVzdF9wbHVnaW4iLCAiZm9vLnByb3RvLGJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFyLnByb3RvIiwgIkJhciIpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGFyc2VFcnJvcnMpIHsKKyAgLy8gVGVzdCB0aGF0IHBhcnNlIGVycm9ycyBhcmUgcmVwb3J0ZWQuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAiYmFkc3ludGF4XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KAorICAgICAgImZvby5wcm90bzoyOjE6IEV4cGVjdGVkIHRvcC1sZXZlbCBzdGF0ZW1lbnQgKGUuZy4gXCJtZXNzYWdlXCIpLlxuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFBhcnNlRXJyb3JzX0Rlc2NyaXB0b3JTZXRJbikgeworICAvLyBUZXN0IHRoYXQgcGFyc2UgZXJyb3JzIGFyZSByZXBvcnRlZC4KKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5iaW4iLCAibm90IGEgRmlsZURlc2NyaXB0b3JTZXQiKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1kZXNjcmlwdG9yX3NldF9pbj0kdG1wZGlyL2Zvby5iaW4gZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KCIkdG1wZGlyL2Zvby5iaW46IFVuYWJsZSB0byBwYXJzZS5cbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQYXJzZUVycm9yc011bHRpcGxlRmlsZXMpIHsKKyAgLy8gVGVzdCB0aGF0IHBhcnNlIGVycm9ycyBhcmUgcmVwb3J0ZWQgZnJvbSBtdWx0aXBsZSBmaWxlcy4KKworICAvLyBXZSBzZXQgdXAgZmlsZXMgc3VjaCB0aGF0IGZvby5wcm90byBhY3R1YWxseSBkZXBlbmRzIG9uIGJhci5wcm90byBpbgorICAvLyB0d28gd2F5czogIERpcmVjdGx5IGFuZCB0aHJvdWdoIGJhei5wcm90by4gIGJhci5wcm90bydzIGVycm9ycyBzaG91bGQKKyAgLy8gb25seSBiZSByZXBvcnRlZCBvbmNlLgorICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJiYWRzeW50YXhcbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmF6LnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIpOworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIKKyAgICAgICAgICAgICAgICAgImltcG9ydCBcImJhei5wcm90b1wiO1xuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgKKyAgICAgICJiYXIucHJvdG86MjoxOiBFeHBlY3RlZCB0b3AtbGV2ZWwgc3RhdGVtZW50IChlLmcuIFwibWVzc2FnZVwiKS5cbiIKKyAgICAgICJiYXoucHJvdG86MjoxOiBJbXBvcnQgXCJiYXIucHJvdG9cIiB3YXMgbm90IGZvdW5kIG9yIGhhZCBlcnJvcnMuXG4iCisgICAgICAiZm9vLnByb3RvOjI6MTogSW1wb3J0IFwiYmFyLnByb3RvXCIgd2FzIG5vdCBmb3VuZCBvciBoYWQgZXJyb3JzLlxuIgorICAgICAgImZvby5wcm90bzozOjE6IEltcG9ydCBcImJhei5wcm90b1wiIHdhcyBub3QgZm91bmQgb3IgaGFkIGVycm9ycy5cbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBSZWN1cnNpdmVJbXBvcnRGYWlscykgeworICAvLyBDcmVhdGUgYSBwcm90byBmaWxlIHRoYXQgaW1wb3J0cyBpdHNlbGYuCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKAorICAgICAgImZvby5wcm90bzoyOjE6IEZpbGUgcmVjdXJzaXZlbHkgaW1wb3J0cyBpdHNlbGY6ICIKKyAgICAgICJmb28ucHJvdG8gLT4gZm9vLnByb3RvXG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgSW5wdXROb3RGb3VuZEVycm9yKSB7CisgIC8vIFRlc3Qgd2hhdCBoYXBwZW5zIGlmIHRoZSBpbnB1dCBmaWxlIGlzIG5vdCBmb3VuZC4KKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KAorICAgICAgIkNvdWxkIG5vdCBtYWtlIHByb3RvIHBhdGggcmVsYXRpdmU6IGZvby5wcm90bzogTm8gc3VjaCBmaWxlIG9yICIKKyAgICAgICJkaXJlY3RvcnlcbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBJbnB1dE5vdEZvdW5kRXJyb3JfRGVzY3JpcHRvclNldEluKSB7CisgIC8vIFRlc3Qgd2hhdCBoYXBwZW5zIGlmIHRoZSBpbnB1dCBmaWxlIGlzIG5vdCBmb3VuZC4KKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1kZXNjcmlwdG9yX3NldF9pbj0kdG1wZGlyL2Zvby5iaW4gZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KCIkdG1wZGlyL2Zvby5iaW46IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBDd2RSZWxhdGl2ZUlucHV0Tm90Rm91bmRFcnJvcikgeworICAvLyBUZXN0IHdoYXQgaGFwcGVucyB3aGVuIGEgd29ya2luZy1kaXJlY3RvcnktcmVsYXRpdmUgaW5wdXQgZmlsZSBpcyBub3QKKyAgLy8gZm91bmQuCisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyICR0bXBkaXIvZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KAorICAgICAgIkNvdWxkIG5vdCBtYWtlIHByb3RvIHBhdGggcmVsYXRpdmU6ICR0bXBkaXIvZm9vLnByb3RvOiBObyBzdWNoIGZpbGUgb3IgIgorICAgICAgImRpcmVjdG9yeVxuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEN3ZFJlbGF0aXZlSW5wdXROb3RNYXBwZWRFcnJvcikgeworICAvLyBUZXN0IHdoYXQgaGFwcGVucyB3aGVuIGEgd29ya2luZy1kaXJlY3RvcnktcmVsYXRpdmUgaW5wdXQgZmlsZSBpcyBub3QKKyAgLy8gbWFwcGVkIHRvIGEgdmlydHVhbCBwYXRoLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICAvLyBDcmVhdGUgYSBkaXJlY3RvcnkgY2FsbGVkICJiYXIiIHNvIHRoYXQgd2UgY2FuIHBvaW50IC0tcHJvdG9fcGF0aCBhdCBpdC4KKyAgQ3JlYXRlVGVtcEZpbGUoImJhci9kdW1teSIsICIiKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIvYmFyICR0bXBkaXIvZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KAorICAgICAgIiR0bXBkaXIvZm9vLnByb3RvOiBGaWxlIGRvZXMgbm90IHJlc2lkZSB3aXRoaW4gYW55IHBhdGggIgorICAgICAgInNwZWNpZmllZCB1c2luZyAtLXByb3RvX3BhdGggKG9yIC1JKS4gIFlvdSBtdXN0IHNwZWNpZnkgYSAiCisgICAgICAiLS1wcm90b19wYXRoIHdoaWNoIGVuY29tcGFzc2VzIHRoaXMgZmlsZS4gIE5vdGUgdGhhdCB0aGUgIgorICAgICAgInByb3RvX3BhdGggbXVzdCBiZSBhbiBleGFjdCBwcmVmaXggb2YgdGhlIC5wcm90byBmaWxlICIKKyAgICAgICJuYW1lcyAtLSBwcm90b2MgaXMgdG9vIGR1bWIgdG8gZmlndXJlIG91dCB3aGVuIHR3byBwYXRocyAiCisgICAgICAiKGUuZy4gYWJzb2x1dGUgYW5kIHJlbGF0aXZlKSBhcmUgZXF1aXZhbGVudCAoaXQncyBoYXJkZXIgIgorICAgICAgInRoYW4geW91IHRoaW5rKS5cbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBDd2RSZWxhdGl2ZUlucHV0Tm90Rm91bmRBbmROb3RNYXBwZWRFcnJvcikgeworICAvLyBDaGVjayB3aGF0IGhhcHBlbnMgaWYgdGhlIGlucHV0IGZpbGUgaXMgbm90IGZvdW5kICphbmQqIGlzIG5vdCBtYXBwZWQKKyAgLy8gaW4gdGhlIHByb3RvX3BhdGguCisKKyAgLy8gQ3JlYXRlIGEgZGlyZWN0b3J5IGNhbGxlZCAiYmFyIiBzbyB0aGF0IHdlIGNhbiBwb2ludCAtLXByb3RvX3BhdGggYXQgaXQuCisgIENyZWF0ZVRlbXBGaWxlKCJiYXIvZHVtbXkiLCAiIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyL2JhciAkdG1wZGlyL2Zvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgKKyAgICAgICJDb3VsZCBub3QgbWFrZSBwcm90byBwYXRoIHJlbGF0aXZlOiAkdG1wZGlyL2Zvby5wcm90bzogTm8gc3VjaCBmaWxlIG9yICIKKyAgICAgICJkaXJlY3RvcnlcbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBDd2RSZWxhdGl2ZUlucHV0U2hhZG93ZWRFcnJvcikgeworICAvLyBUZXN0IHdoYXQgaGFwcGVucyB3aGVuIGEgd29ya2luZy1kaXJlY3RvcnktcmVsYXRpdmUgaW5wdXQgZmlsZSBpcyBzaGFkb3dlZAorICAvLyBieSBhbm90aGVyIGZpbGUgaW4gdGhlIHZpcnR1YWwgcGF0aC4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vL2Zvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmFyL2Zvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBCYXIge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpci9mb28gLS1wcm90b19wYXRoPSR0bXBkaXIvYmFyICIKKyAgICAgICIkdG1wZGlyL2Jhci9mb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclRleHQoCisgICAgICAiJHRtcGRpci9iYXIvZm9vLnByb3RvOiBJbnB1dCBpcyBzaGFkb3dlZCBpbiB0aGUgLS1wcm90b19wYXRoICIKKyAgICAgICJieSBcIiR0bXBkaXIvZm9vL2Zvby5wcm90b1wiLiAgRWl0aGVyIHVzZSB0aGUgbGF0dGVyICIKKyAgICAgICJmaWxlIGFzIHlvdXIgaW5wdXQgb3IgcmVvcmRlciB0aGUgLS1wcm90b19wYXRoIHNvIHRoYXQgdGhlICIKKyAgICAgICJmb3JtZXIgZmlsZSdzIGxvY2F0aW9uIGNvbWVzIGZpcnN0LlxuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFByb3RvUGF0aE5vdEZvdW5kRXJyb3IpIHsKKyAgLy8gVGVzdCB3aGF0IGhhcHBlbnMgaWYgdGhlIGlucHV0IGZpbGUgaXMgbm90IGZvdW5kLgorCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpci9mb28gZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KAorICAgICAgIiR0bXBkaXIvZm9vOiB3YXJuaW5nOiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuXG4iCisgICAgICAiQ291bGQgbm90IG1ha2UgcHJvdG8gcGF0aCByZWxhdGl2ZTogZm9vLnByb3RvOiBObyBzdWNoIGZpbGUgb3IgIgorICAgICAgImRpcmVjdG9yeVxuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFByb3RvUGF0aEFuZERlc2NyaXB0b3JTZXRJbikgeworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgLS1kZXNjcmlwdG9yX3NldF9pbj0kdG1wZGlyL2Zvby5iaW4gZm9vLnByb3RvIik7CisgIEV4cGVjdEVycm9yVGV4dCgiJHRtcGRpci9mb28uYmluOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1kZXNjcmlwdG9yX3NldF9pbj0kdG1wZGlyL2Zvby5iaW4gLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisgIEV4cGVjdEVycm9yVGV4dCgiJHRtcGRpci9mb28uYmluOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUHJvdG9QYXRoQW5kRGVzY3JpcHRvclNldEluX0NvbXBpbGVGaWxlcykgeworICAvLyBUZXN0IHdoYXQgaGFwcGVucyBpZiBhIHByb3RvIGlzIGluIGEgLS1kZXNjcmlwdG9yX3NldF9pbiBhbmQgYWxzbyBleGlzdHMKKyAgLy8gb24gZGlzay4KKyAgRmlsZURlc2NyaXB0b3JTZXQgZmlsZV9kZXNjcmlwdG9yX3NldDsKKworICAvLyBOT1RFOiBUaGlzIGZpbGUgZGVzYyBTSE9VTEQgYmUgZGlmZmVyZW50IGZyb20gdGhlIG9uZSBjcmVhdGVkIGFzIGEgdGVtcAorICAvLyAgICAgICB0byBtYWtlIGl0IGVhc2llciB0byB0ZXN0IHRoYXQgdGhlIGZpbGUgd2FzIG91dHB1dCBpbnN0ZWFkIG9mIHRoZQorICAvLyAgICAgICBjb250ZW50cyBvZiB0aGUgLS1kZXNjcmlwdG9yX3NldF9pbiBmaWxlLgorICBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCk7CisgIGZpbGVfZGVzY3JpcHRvcl9wcm90by0+c2V0X25hbWUoImZvby5wcm90byIpOworICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkZvbyIpOworCisgIFdyaXRlRGVzY3JpcHRvclNldCgiZm9vLmJpbiIsICZmaWxlX2Rlc2NyaXB0b3Jfc2V0KTsKKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvb0JhciB7IHJlcXVpcmVkIHN0cmluZyBmb29fbWVzc2FnZSA9IDE7IH1cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1kZXNjcmlwdG9yX3NldF9vdXQ9JHRtcGRpci9kZXNjcmlwdG9yX3NldCAiCisgICAgICAiLS1kZXNjcmlwdG9yX3NldF9pbj0kdG1wZGlyL2Zvby5iaW4gIgorICAgICAgIi0taW5jbHVkZV9zb3VyY2VfaW5mbyAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKworICBGaWxlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldDsKKyAgUmVhZERlc2NyaXB0b3JTZXQoImRlc2NyaXB0b3Jfc2V0IiwgJmRlc2NyaXB0b3Jfc2V0KTsKKworICBFWFBFQ1RfRVEoMSwgZGVzY3JpcHRvcl9zZXQuZmlsZV9zaXplKCkpOworICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubmFtZSgpKTsKKyAgLy8gRGVzY3JpcHRvciBzZXQgU0hPVUxEIGhhdmUgc291cmNlIGNvZGUgaW5mby4KKyAgRVhQRUNUX1RSVUUoZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKKworICBFWFBFQ1RfRVEoIkZvb0JhciIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubWVzc2FnZV90eXBlKDApLm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vX21lc3NhZ2UiLAorICAgICAgICAgICAgZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMCkubmFtZSgpKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUHJvdG9QYXRoQW5kRGVwZW5kZW5jeU91dCkgeworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1kZXBlbmRlbmN5X291dD0kdG1wZGlyL21hbmlmZXN0ICIKKyAgICAgICItLWRlc2NyaXB0b3Jfc2V0X2luPSR0bXBkaXIvZm9vLmJpbiBmb28ucHJvdG8iKTsKKyAgRXhwZWN0RXJyb3JUZXh0KAorICAgICAgIi0tZGVzY3JpcHRvcl9zZXRfaW4gY2Fubm90IGJlIHVzZWQgd2l0aCAtLWRlcGVuZGVuY3lfb3V0LlxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tZGVzY3JpcHRvcl9zZXRfaW49JHRtcGRpci9mb28uYmluICIKKyAgICAgICItLWRlcGVuZGVuY3lfb3V0PSR0bXBkaXIvbWFuaWZlc3QgZm9vLnByb3RvIik7CisgIEV4cGVjdEVycm9yVGV4dCgKKyAgICAgICItLWRlcGVuZGVuY3lfb3V0IGNhbm5vdCBiZSB1c2VkIHdpdGggLS1kZXNjcmlwdG9yX3NldF9pbi5cbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBNaXNzaW5nSW5wdXRFcnJvcikgeworICAvLyBUZXN0IHRoYXQgd2UgZ2V0IGFuIGVycm9yIGlmIG5vIGlucHV0cyBhcmUgZ2l2ZW4uCisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KCJNaXNzaW5nIGlucHV0IGZpbGUuXG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTWlzc2luZ091dHB1dEVycm9yKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgiTWlzc2luZyBvdXRwdXQgZGlyZWN0aXZlcy5cbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBPdXRwdXRXcml0ZUVycm9yKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBzdGQ6OnN0cmluZyBvdXRwdXRfZmlsZSA9CisgICAgICBNb2NrQ29kZUdlbmVyYXRvcjo6R2V0T3V0cHV0RmlsZU5hbWUoInRlc3RfZ2VuZXJhdG9yIiwgImZvby5wcm90byIpOworCisgIC8vIENyZWF0ZSBhIGRpcmVjdG9yeSBibG9ja2luZyBvdXIgb3V0cHV0IGxvY2F0aW9uLgorICBDcmVhdGVUZW1wRGlyKG91dHB1dF9maWxlKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgLy8gTW9ja0NvZGVHZW5lcmF0b3Igbm8gbG9uZ2VyIGRldGVjdHMgYW4gZXJyb3IgYmVjYXVzZSB3ZSBhY3R1YWxseSB3cml0ZSB0bworICAvLyBhbiBpbi1tZW1vcnkgbG9jYXRpb24gZmlyc3QsIHRoZW4gZHVtcCB0byBkaXNrIGF0IHRoZSBlbmQuICBUaGlzIGlzIG5vCisgIC8vIGJpZyBkZWFsLgorICAvLyAgIEV4cGVjdEVycm9yU3Vic3RyaW5nKCJNb2NrQ29kZUdlbmVyYXRvciBkZXRlY3RlZCB3cml0ZSBlcnJvci4iKTsKKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorICAvLyBXaW5kb3dzIHdpdGggTVNWQ1JULmRsbCBwcm9kdWNlcyBFUEVSTSBpbnN0ZWFkIG9mIEVJU0RJUi4KKyAgaWYgKEhhc0FsdGVybmF0ZUVycm9yU3Vic3RyaW5nKG91dHB1dF9maWxlICsgIjogUGVybWlzc2lvbiBkZW5pZWQiKSkgeworICAgIHJldHVybjsKKyAgfQorI2VuZGlmCisKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcob3V0cHV0X2ZpbGUgKyAiOiBJcyBhIGRpcmVjdG9yeSIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQbHVnaW5PdXRwdXRXcml0ZUVycm9yKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBzdGQ6OnN0cmluZyBvdXRwdXRfZmlsZSA9CisgICAgICBNb2NrQ29kZUdlbmVyYXRvcjo6R2V0T3V0cHV0RmlsZU5hbWUoInRlc3RfcGx1Z2luIiwgImZvby5wcm90byIpOworCisgIC8vIENyZWF0ZSBhIGRpcmVjdG9yeSBibG9ja2luZyBvdXIgb3V0cHV0IGxvY2F0aW9uLgorICBDcmVhdGVUZW1wRGlyKG91dHB1dF9maWxlKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyAgLy8gV2luZG93cyB3aXRoIE1TVkNSVC5kbGwgcHJvZHVjZXMgRVBFUk0gaW5zdGVhZCBvZiBFSVNESVIuCisgIGlmIChIYXNBbHRlcm5hdGVFcnJvclN1YnN0cmluZyhvdXRwdXRfZmlsZSArICI6IFBlcm1pc3Npb24gZGVuaWVkIikpIHsKKyAgICByZXR1cm47CisgIH0KKyNlbmRpZgorCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKG91dHB1dF9maWxlICsgIjogSXMgYSBkaXJlY3RvcnkiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgT3V0cHV0RGlyZWN0b3J5Tm90Rm91bmRFcnJvcikgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIvbm9zdWNoZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygibm9zdWNoZGlyLzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQbHVnaW5PdXRwdXREaXJlY3RvcnlOb3RGb3VuZEVycm9yKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9JHRtcGRpci9ub3N1Y2hkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKCJub3N1Y2hkaXIvOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Iik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE91dHB1dERpcmVjdG9yeUlzRmlsZUVycm9yKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpci9mb28ucHJvdG8gIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisgIC8vIFdpbmRvd3Mgd2l0aCBNU1ZDUlQuZGxsIHByb2R1Y2VzIEVJTlZBTCBpbnN0ZWFkIG9mIEVOT1RESVIuCisgIGlmIChIYXNBbHRlcm5hdGVFcnJvclN1YnN0cmluZygiZm9vLnByb3RvLzogSW52YWxpZCBhcmd1bWVudCIpKSB7CisgICAgcmV0dXJuOworICB9CisjZW5kaWYKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygiZm9vLnByb3RvLzogTm90IGEgZGlyZWN0b3J5Iik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvckVycm9yKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgTW9ja0NvZGVHZW5lcmF0b3JfRXJyb3Ige31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygKKyAgICAgICItLXRlc3Rfb3V0OiBmb28ucHJvdG86IFNhdyBtZXNzYWdlIHR5cGUgTW9ja0NvZGVHZW5lcmF0b3JfRXJyb3IuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvclBsdWdpbkVycm9yKSB7CisgIC8vIFRlc3QgYSBnZW5lcmF0b3IgcGx1Z2luIHRoYXQgcmV0dXJucyBhbiBlcnJvci4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIE1vY2tDb2RlR2VuZXJhdG9yX0Vycm9yIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9VGVzdFBhcmFtZXRlcjokdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygKKyAgICAgICItLXBsdWdfb3V0OiBmb28ucHJvdG86IFNhdyBtZXNzYWdlIHR5cGUgTW9ja0NvZGVHZW5lcmF0b3JfRXJyb3IuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvclBsdWdpbkZhaWwpIHsKKyAgLy8gVGVzdCBhIGdlbmVyYXRvciBwbHVnaW4gdGhhdCBleGl0cyB3aXRoIGFuIGVycm9yIGNvZGUuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBNb2NrQ29kZUdlbmVyYXRvcl9FeGl0IHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9VGVzdFBhcmFtZXRlcjokdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9FeGl0LiIpOworICBFeHBlY3RFcnJvclN1YnN0cmluZygKKyAgICAgICItLXBsdWdfb3V0OiBwcmVmaXgtZ2VuLXBsdWc6IFBsdWdpbiBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAxMjMuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvclBsdWdpbkNyYXNoKSB7CisgIC8vIFRlc3QgYSBnZW5lcmF0b3IgcGx1Z2luIHRoYXQgY3Jhc2hlcy4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIE1vY2tDb2RlR2VuZXJhdG9yX0Fib3J0IHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9VGVzdFBhcmFtZXRlcjokdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9BYm9ydC4iKTsKKworI2lmZGVmIF9XSU4zMgorICAvLyBXaW5kb3dzIGRvZXNuJ3QgaGF2ZSBzaWduYWxzLiAgSXQgbG9va3MgbGlrZSBhYm9ydCgpaW5nIGNhdXNlcyB0aGUgcHJvY2VzcworICAvLyB0byBleGl0IHdpdGggc3RhdHVzIGNvZGUgMywgYnV0IGxldCdzIG5vdCBkZXBlbmQgb24gdGhlIGV4YWN0IG51bWJlciBoZXJlLgorICBFeHBlY3RFcnJvclN1YnN0cmluZygKKyAgICAgICItLXBsdWdfb3V0OiBwcmVmaXgtZ2VuLXBsdWc6IFBsdWdpbiBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSIpOworI2Vsc2UKKyAgLy8gRG9uJ3QgZGVwZW5kIG9uIHRoZSBleGFjdCBzaWduYWwgbnVtYmVyLgorICBFeHBlY3RFcnJvclN1YnN0cmluZygiLS1wbHVnX291dDogcHJlZml4LWdlbi1wbHVnOiBQbHVnaW4ga2lsbGVkIGJ5IHNpZ25hbCIpOworI2VuZGlmCit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFBsdWdpblJlY2VpdmVzU291cmNlQ29kZUluZm8pIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBNb2NrQ29kZUdlbmVyYXRvcl9IYXNTb3VyY2VDb2RlSW5mbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXBsdWdfb3V0PSR0bXBkaXIgLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoCisgICAgICAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9IYXNTb3VyY2VDb2RlSW5mbzogMS4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGx1Z2luUmVjZWl2ZXNKc29uTmFtZSkgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIE1vY2tDb2RlR2VuZXJhdG9yX0hhc0pzb25OYW1lIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgb3B0aW9uYWwgaW50MzIgdmFsdWUgPSAxO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXBsdWdfb3V0PSR0bXBkaXIgLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoIlNhdyBqc29uX25hbWU6IDEiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGx1Z2luUmVjZWl2ZXNDb21waWxlclZlcnNpb24pIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBNb2NrQ29kZUdlbmVyYXRvcl9TaG93VmVyc2lvbk51bWJlciB7XG4iCisgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIGludDMyIHZhbHVlID0gMTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wbHVnX291dD0kdG1wZGlyIC0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKFN0cmluZ1ByaW50ZigiU2F3IGNvbXBpbGVyX3ZlcnNpb246ICVkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR09PR0xFX1BST1RPQlVGX1ZFUlNJT05fU1VGRklYKSk7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvclBsdWdpbk5vdEZvdW5kKSB7CisgIC8vIFRlc3Qgd2hhdCBoYXBwZW5zIGlmIHRoZSBwbHVnaW4gaXNuJ3QgZm91bmQuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImVycm9yLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLWJhZHBsdWdfb3V0PVRlc3RQYXJhbWV0ZXI6JHRtcGRpciAiCisgICAgICAiLS1wbHVnaW49cHJlZml4LWdlbi1iYWRwbHVnPW5vX3N1Y2hfZmlsZSAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZXJyb3IucHJvdG8iKTsKKworI2lmZGVmIF9XSU4zMgorICBFeHBlY3RFcnJvclN1YnN0cmluZygiLS1iYWRwbHVnX291dDogcHJlZml4LWdlbi1iYWRwbHVnOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgU3VicHJvY2Vzczo6V2luMzJFcnJvck1lc3NhZ2UoRVJST1JfRklMRV9OT1RfRk9VTkQpKTsKKyNlbHNlCisgIC8vIEVycm9yIHdyaXR0ZW4gdG8gc3Rkb3V0IGJ5IGNoaWxkIHByb2Nlc3MgYWZ0ZXIgZXhlYygpIGZhaWxzLgorICBFeHBlY3RFcnJvclN1YnN0cmluZygibm9fc3VjaF9maWxlOiBwcm9ncmFtIG5vdCBmb3VuZCBvciBpcyBub3QgZXhlY3V0YWJsZSIpOworCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKAorICAgICAgIlBsZWFzZSBzcGVjaWZ5IGEgcHJvZ3JhbSB1c2luZyBhYnNvbHV0ZSBwYXRoIG9yIG1ha2Ugc3VyZSAiCisgICAgICAidGhlIHByb2dyYW0gaXMgYXZhaWxhYmxlIGluIHlvdXIgUEFUSCBzeXN0ZW0gdmFyaWFibGUiKTsKKworICAvLyBFcnJvciB3cml0dGVuIGJ5IHBhcmVudCBwcm9jZXNzIHdoZW4gY2hpbGQgZmFpbHMuCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKAorICAgICAgIi0tYmFkcGx1Z19vdXQ6IHByZWZpeC1nZW4tYmFkcGx1ZzogUGx1Z2luIGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDEuIik7CisjZW5kaWYKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgR2VuZXJhdG9yUGx1Z2luTm90QWxsb3dlZCkgeworICAvLyBUZXN0IHdoYXQgaGFwcGVucyBpZiBwbHVnaW5zIGFyZW4ndCBhbGxvd2VkLgorCisgIENyZWF0ZVRlbXBGaWxlKCJlcnJvci5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIERpc2FsbG93UGx1Z2lucygpOworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9VGVzdFBhcmFtZXRlcjokdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBlcnJvci5wcm90byIpOworCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKCJVbmtub3duIGZsYWc6IC0tcGx1Z19vdXQiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgSGVscFRleHQpIHsKKyAgUnVuKCJ0ZXN0X2V4ZWNfbmFtZSAtLWhlbHAiKTsKKworICBFeHBlY3RDYXB0dXJlZFN0ZG91dFN1YnN0cmluZ1dpdGhaZXJvUmV0dXJuQ29kZSgiVXNhZ2U6IHRlc3RfZXhlY19uYW1lICIpOworICBFeHBlY3RDYXB0dXJlZFN0ZG91dFN1YnN0cmluZ1dpdGhaZXJvUmV0dXJuQ29kZSgiLS10ZXN0X291dD1PVVRfRElSIik7CisgIEV4cGVjdENhcHR1cmVkU3Rkb3V0U3Vic3RyaW5nV2l0aFplcm9SZXR1cm5Db2RlKCJUZXN0IG91dHB1dC4iKTsKKyAgRXhwZWN0Q2FwdHVyZWRTdGRvdXRTdWJzdHJpbmdXaXRoWmVyb1JldHVybkNvZGUoIi0tYWx0X291dD1PVVRfRElSIik7CisgIEV4cGVjdENhcHR1cmVkU3Rkb3V0U3Vic3RyaW5nV2l0aFplcm9SZXR1cm5Db2RlKCJBbHQgb3V0cHV0LiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBHY2NGb3JtYXRFcnJvcnMpIHsKKyAgLy8gVGVzdCAtLWVycm9yX2Zvcm1hdD1nY2MgKHdoaWNoIGlzIHRoZSBkZWZhdWx0LCBidXQgd2Ugd2FudCB0byB2ZXJpZnkKKyAgLy8gdGhhdCBpdCBjYW4gYmUgc2V0IGV4cGxpY2l0bHkpLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgImJhZHN5bnRheFxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIC0tZXJyb3JfZm9ybWF0PWdjYyBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclRleHQoCisgICAgICAiZm9vLnByb3RvOjI6MTogRXhwZWN0ZWQgdG9wLWxldmVsIHN0YXRlbWVudCAoZS5nLiBcIm1lc3NhZ2VcIikuXG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTXN2c0Zvcm1hdEVycm9ycykgeworICAvLyBUZXN0IC0tZXJyb3JfZm9ybWF0PW1zdnMKKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJiYWRzeW50YXhcbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciAtLWVycm9yX2Zvcm1hdD1tc3ZzIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgKKyAgICAgICIkdG1wZGlyL2Zvby5wcm90bygyKSA6IGVycm9yIGluIGNvbHVtbj0xOiBFeHBlY3RlZCB0b3AtbGV2ZWwgc3RhdGVtZW50ICIKKyAgICAgICIoZS5nLiBcIm1lc3NhZ2VcIikuXG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgSW52YWxpZEVycm9yRm9ybWF0KSB7CisgIC8vIFRlc3QgaW52YWxpZCAtLWVycm9yX2Zvcm1hdAorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgImJhZHN5bnRheFxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIC0tZXJyb3JfZm9ybWF0PWludmFsaWQgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KCJVbmtub3duIGVycm9yIGZvcm1hdDogaW52YWxpZFxuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFdhcm5pbmdzKSB7CisgIC8vIFRlc3QgLS1mYXRhbF93YXJuaW5ncy4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisgIEV4cGVjdENhcHR1cmVkU3RkZXJyU3Vic3RyaW5nV2l0aFplcm9SZXR1cm5Db2RlKAorICAgICAgImZvby5wcm90bzoyOjE6IHdhcm5pbmc6IEltcG9ydCBiYXIucHJvdG8gaXMgdW51c2VkLiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyIC0tZmF0YWxfd2FybmluZ3MgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworICBFeHBlY3RFcnJvclN1YnN0cmluZygiZm9vLnByb3RvOjI6MTogd2FybmluZzogSW1wb3J0IGJhci5wcm90byBpcyB1bnVzZWQuIik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZsYWcgcGFyc2luZyB0ZXN0cworCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQYXJzZVNpbmdsZUNoYXJhY3RlckZsYWcpIHsKKyAgLy8gVGVzdCB0aGF0IGEgc2luZ2xlLWNoYXJhY3RlciBmbGFnIHdvcmtzLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC10JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQYXJzZVNwYWNlRGVsaW1pdGVkVmFsdWUpIHsKKyAgLy8gVGVzdCB0aGF0IHNlcGFyYXRpbmcgdGhlIGZsYWcgdmFsdWUgd2l0aCBhIHNwYWNlIHdvcmtzLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQgJHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQYXJzZVNpbmdsZUNoYXJhY3RlclNwYWNlRGVsaW1pdGVkVmFsdWUpIHsKKyAgLy8gVGVzdCB0aGF0IHNlcGFyYXRpbmcgdGhlIGZsYWcgdmFsdWUgd2l0aCBhIHNwYWNlIHdvcmtzIGZvcgorICAvLyBzaW5nbGUtY2hhcmFjdGVyIGZsYWdzLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC10ICR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTWlzc2luZ1ZhbHVlRXJyb3IpIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGdldCBhbiBlcnJvciBpZiBhIGZsYWcgaXMgbWlzc2luZyBpdHMgdmFsdWUuCisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0IC0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgiTWlzc2luZyB2YWx1ZSBmb3IgZmxhZzogLS10ZXN0X291dFxuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE1pc3NpbmdWYWx1ZUF0RW5kRXJyb3IpIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGdldCBhbiBlcnJvciBpZiB0aGUgbGFzdCBhcmd1bWVudCBpcyBhIGZsYWcgcmVxdWlyaW5nIGEKKyAgLy8gdmFsdWUuCisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0Iik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KCJNaXNzaW5nIHZhbHVlIGZvciBmbGFnOiAtLXRlc3Rfb3V0XG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUHJvdG8zT3B0aW9uYWxEaXNhbGxvd2VkTm9Db2RlZ2VuU3VwcG9ydCkgeworICBDcmVhdGVUZW1wRmlsZSgiZ29vZ2xlL2Zvby5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvM1wiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICAgICAgICAgICAgICAiICBvcHRpb25hbCBpbnQzMiBpID0gMTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIENyZWF0ZUdlbmVyYXRvcldpdGhNaXNzaW5nRmVhdHVyZXMoIi0tbm9fcHJvdG8zX29wdGlvbmFsX291dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvZXNuJ3Qgc3VwcG9ydCBwcm90bzMgb3B0aW9uYWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5lcmF0b3I6OkZFQVRVUkVfUFJPVE8zX09QVElPTkFMKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZXhwZXJpbWVudGFsX2FsbG93X3Byb3RvM19vcHRpb25hbCAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZ29vZ2xlL2Zvby5wcm90byAtLW5vX3Byb3RvM19vcHRpb25hbF9vdXQ9JHRtcGRpciIpOworCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKAorICAgICAgImNvZGUgZ2VuZXJhdG9yIC0tbm9fcHJvdG8zX29wdGlvbmFsX291dCBoYXNuJ3QgYmVlbiB1cGRhdGVkIHRvIHN1cHBvcnQgIgorICAgICAgIm9wdGlvbmFsIGZpZWxkcyBpbiBwcm90bzMiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUHJvdG8zT3B0aW9uYWxBbGxvd1dpdGhGbGFnKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJnb29nbGUvZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8zXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIGludDMyIGkgPSAxO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLWV4cGVyaW1lbnRhbF9hbGxvd19wcm90bzNfb3B0aW9uYWwgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGdvb2dsZS9mb28ucHJvdG8gLS10ZXN0X291dD0kdG1wZGlyIik7CisgIEV4cGVjdE5vRXJyb3JzKCk7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFByaW50RnJlZUZpZWxkTnVtYmVycykgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJwYWNrYWdlIGZvbztcbiIKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgb3B0aW9uYWwgaW50MzIgYSA9IDI7XG4iCisgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIHN0cmluZyBiID0gNDtcbiIKKyAgICAgICAgICAgICAgICAgIiAgb3B0aW9uYWwgc3RyaW5nIGMgPSA1O1xuIgorICAgICAgICAgICAgICAgICAiICBvcHRpb25hbCBpbnQ2NCBkID0gODtcbiIKKyAgICAgICAgICAgICAgICAgIiAgb3B0aW9uYWwgZG91YmxlIGUgPSAxMDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIGludDMyIGEgPSAyO1xuIgorICAgICAgICAgICAgICAgICAiICBleHRlbnNpb25zIDQgdG8gNTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgb3B0aW9uYWwgaW50NjQgZCA9IDg7XG4iCisgICAgICAgICAgICAgICAgICIgIGV4dGVuc2lvbnMgMTA7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhei5wcm90byIsCisgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAibWVzc2FnZSBCYXoge1xuIgorICAgICAgICAgICAgICAgICAiICBvcHRpb25hbCBpbnQzMiBhID0gMjtcbiIKKyAgICAgICAgICAgICAgICAgIiAgb3B0aW9uYWwgaW50NjQgZCA9IDg7XG4iCisgICAgICAgICAgICAgICAgICIgIGV4dGVuc2lvbnMgMTUgdG8gbWF4O1xuIiAgLy8gdW5vcmRlcmVkLgorICAgICAgICAgICAgICAgICAiICBleHRlbnNpb25zIDEzO1xuIgorICAgICAgICAgICAgICAgICAiICBleHRlbnNpb25zIDEwIHRvIDEyO1xuIgorICAgICAgICAgICAgICAgICAiICBleHRlbnNpb25zIDU7XG4iCisgICAgICAgICAgICAgICAgICIgIGV4dGVuc2lvbnMgNDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBDcmVhdGVUZW1wRmlsZSgKKyAgICAgICJxdXoucHJvdG8iLAorICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAibWVzc2FnZSBRdXoge1xuIgorICAgICAgIiAgbWVzc2FnZSBGb28ge31cbiIgIC8vIG5lc3RlZCBtZXNzYWdlCisgICAgICAiICBvcHRpb25hbCBpbnQzMiBhID0gMjtcbiIKKyAgICAgICIgIG9wdGlvbmFsIGdyb3VwIEMgPSA0IHtcbiIKKyAgICAgICIgICAgb3B0aW9uYWwgaW50MzIgZCA9IDU7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICBleHRlbnNpb25zIDggdG8gMTA7XG4iCisgICAgICAiICBvcHRpb25hbCBncm91cCBFID0gMTEge1xuIgorICAgICAgIiAgICBvcHRpb25hbCBpbnQzMiBmID0gOTtcbiIgICAgLy8gZXhwbGljaXRseSByZXVzZSBleHRlbnNpb24gcmFuZ2UgOC0xMAorICAgICAgIiAgICBvcHRpb25hbCBncm91cCBHID0gMTUge1xuIiAgLy8gbmVzdGVkIGdyb3VwCisgICAgICAiICAgICAgbWVzc2FnZSBGb28ge31cbiIgICAgICAgICAvLyBuZXN0ZWQgbWVzc2FnZSBpbnNpZGUgbmVzdGVkIGdyb3VwCisgICAgICAiICAgIH1cbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcHJpbnRfZnJlZV9maWVsZF9udW1iZXJzIC0tcHJvdG9fcGF0aD0kdG1wZGlyICIKKyAgICAgICJmb28ucHJvdG8gYmFyLnByb3RvIGJhei5wcm90byBxdXoucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworCisgIC8vIFRPRE8oamllbHVvKTogQ3lnd2luIGRvZXNuJ3Qgd29yayB3ZWxsIGlmIHdlIHRyeSB0byBjYXB0dXJlIHN0ZGVyciBhbmQKKyAgLy8gc3Rkb3V0IGF0IHRoZSBzYW1lIHRpbWUuIE5lZWQgdG8gZmlndXJlIG91dCB3aHkgYW5kIGFkZCB0aGlzIHRlc3QgYmFjaworICAvLyBmb3IgQ3lnd2luLgorI2lmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisgIEV4cGVjdENhcHR1cmVkU3Rkb3V0KAorICAgICAgImZvby5Gb28gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWU6IDEgMyA2LTcgOSAxMS1JTkZcbiIKKyAgICAgICJCYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlOiAxIDMgNi03IDkgMTEtSU5GXG4iCisgICAgICAiQmF6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZTogMSAzIDYtNyA5IDE0XG4iCisgICAgICAiUXV6LkZvbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZTogMS1JTkZcbiIKKyAgICAgICJRdXouRS5HLkZvbyAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlOiAxLUlORlxuIgorICAgICAgIlF1eiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWU6IDEgMyA2LTcgMTItMTQgMTYtSU5GXG4iKTsKKyNlbmRpZgorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFRlc3QgZm9yIC0tZW5jb2RlIGFuZCAtLWRlY29kZS4gIE5vdGUgdGhhdCBpdCB3b3VsZCBiZSBlYXNpZXIgdG8gZG8gdGhpcworLy8gdGVzdCBhcyBhIHNoZWxsIHNjcmlwdCwgYnV0IHdlJ2QgbGlrZSB0byBiZSBhYmxlIHRvIHJ1biB0aGUgdGVzdCBvbgorLy8gcGxhdGZvcm1zIHRoYXQgZG9uJ3QgaGF2ZSBhIEJvdXJuZS1jb21wYXRpYmxlIHNoZWxsIGF2YWlsYWJsZSAoZXNwZWNpYWxseQorLy8gV2luZG93cy9NU1ZDKS4KKworZW51bSBFbmNvZGVEZWNvZGVUZXN0TW9kZSB7IFBST1RPX1BBVEgsIERFU0NSSVBUT1JfU0VUX0lOIH07CisKK2NsYXNzIEVuY29kZURlY29kZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxFbmNvZGVEZWNvZGVUZXN0TW9kZT4geworIHByb3RlY3RlZDoKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBXcml0ZVVuaXR0ZXN0UHJvdG9EZXNjcmlwdG9yU2V0KCk7CisgICAgZHVwZWRfc3RkaW5fID0gZHVwKFNURElOX0ZJTEVOTyk7CisgIH0KKworICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGR1cDIoZHVwZWRfc3RkaW5fLCBTVERJTl9GSUxFTk8pOworICAgIGNsb3NlKGR1cGVkX3N0ZGluXyk7CisgIH0KKworICB2b2lkIFJlZGlyZWN0U3RkaW5Gcm9tVGV4dChjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQpIHsKKyAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IFRlc3RUZW1wRGlyKCkgKyAiL3Rlc3Rfc3RkaW4iOworICAgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpTZXRDb250ZW50cyhmaWxlbmFtZSwgaW5wdXQsIHRydWUpKTsKKyAgICBHT09HTEVfQ0hFQ0soUmVkaXJlY3RTdGRpbkZyb21GaWxlKGZpbGVuYW1lKSk7CisgIH0KKworICBib29sIFJlZGlyZWN0U3RkaW5Gcm9tRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKKyAgICBpbnQgZmQgPSBvcGVuKGZpbGVuYW1lLmNfc3RyKCksIE9fUkRPTkxZKTsKKyAgICBpZiAoZmQgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgZHVwMihmZCwgU1RESU5fRklMRU5PKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBSZW1vdmUgJ1xyJyBjaGFyYWN0ZXJzIGZyb20gdGV4dC4KKyAgc3RkOjpzdHJpbmcgU3RyaXBDUihjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCkgeworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5zaXplKCk7IGkrKykgeworICAgICAgaWYgKHRleHRbaV0gIT0gJ1xyJykgeworICAgICAgICByZXN1bHQucHVzaF9iYWNrKHRleHRbaV0pOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBlbnVtIFR5cGUgeyBURVhULCBCSU5BUlkgfTsKKyAgZW51bSBSZXR1cm5Db2RlIHsgU1VDQ0VTUywgRVJST1IgfTsKKworICBib29sIFJ1bihjb25zdCBzdGQ6OnN0cmluZyYgY29tbWFuZCwgYm9vbCBzcGVjaWZ5X3Byb3RvX2ZpbGVzID0gdHJ1ZSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzOworICAgIGFyZ3MucHVzaF9iYWNrKCJwcm90b2MiKTsKKyAgICBmb3IgKFN0cmluZ1BpZWNlIHNwbGl0X3BpZWNlIDoKKyAgICAgICAgIFNwbGl0KGNvbW1hbmQsICIgIiwgdHJ1ZSkpIHsKKyAgICAgIGFyZ3MucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKHNwbGl0X3BpZWNlKSk7CisgICAgfQorICAgIGlmIChzcGVjaWZ5X3Byb3RvX2ZpbGVzKSB7CisgICAgICBzd2l0Y2ggKEdldFBhcmFtKCkpIHsKKyAgICAgICAgY2FzZSBQUk9UT19QQVRIOgorICAgICAgICAgIGFyZ3MucHVzaF9iYWNrKCItLXByb3RvX3BhdGg9IiArIFRlc3RVdGlsOjpUZXN0U291cmNlRGlyKCkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERFU0NSSVBUT1JfU0VUX0lOOgorICAgICAgICAgIGFyZ3MucHVzaF9iYWNrKFN0ckNhdCgiLS1kZXNjcmlwdG9yX3NldF9pbj0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wcm90b19kZXNjcmlwdG9yX3NldF9maWxlbmFtZV8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBBRERfRkFJTFVSRSgpIDw8ICJ1bmV4cGVjdGVkIEVuY29kZURlY29kZVRlc3RNb2RlOiAiIDw8IEdldFBhcmFtKCk7CisgICAgICB9CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IGNoYXIqW10+IGFyZ3YobmV3IGNvbnN0IGNoYXIqW2FyZ3Muc2l6ZSgpXSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CisgICAgICBhcmd2W2ldID0gYXJnc1tpXS5jX3N0cigpOworICAgIH0KKworICAgIENvbW1hbmRMaW5lSW50ZXJmYWNlIGNsaTsKKworICAgIENhcHR1cmVUZXN0U3Rkb3V0KCk7CisgICAgQ2FwdHVyZVRlc3RTdGRlcnIoKTsKKworICAgIGludCByZXN1bHQgPSBjbGkuUnVuKGFyZ3Muc2l6ZSgpLCBhcmd2LmdldCgpKTsKKworICAgIGNhcHR1cmVkX3N0ZG91dF8gPSBHZXRDYXB0dXJlZFRlc3RTdGRvdXQoKTsKKyAgICBjYXB0dXJlZF9zdGRlcnJfID0gR2V0Q2FwdHVyZWRUZXN0U3RkZXJyKCk7CisKKyAgICByZXR1cm4gcmVzdWx0ID09IDA7CisgIH0KKworICB2b2lkIEV4cGVjdFN0ZG91dE1hdGNoZXNCaW5hcnlGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgeworICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkX291dHB1dDsKKyAgICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6R2V0Q29udGVudHMoZmlsZW5hbWUsICZleHBlY3RlZF9vdXRwdXQsIHRydWUpKTsKKworICAgIC8vIERvbid0IHVzZSBFWFBFQ1RfRVEgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHByaW50IHJhdyBiaW5hcnkgZGF0YSB0bworICAgIC8vIHN0ZG91dCBvbiBmYWlsdXJlLgorICAgIEVYUEVDVF9UUlVFKGNhcHR1cmVkX3N0ZG91dF8gPT0gZXhwZWN0ZWRfb3V0cHV0KTsKKyAgfQorCisgIHZvaWQgRXhwZWN0U3Rkb3V0TWF0Y2hlc1RleHRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgeworICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkX291dHB1dDsKKyAgICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6R2V0Q29udGVudHMoZmlsZW5hbWUsICZleHBlY3RlZF9vdXRwdXQsIHRydWUpKTsKKworICAgIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0KGV4cGVjdGVkX291dHB1dCk7CisgIH0KKworICB2b2lkIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0KGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZF90ZXh0KSB7CisgICAgRVhQRUNUX0VRKFN0cmlwQ1IoZXhwZWN0ZWRfdGV4dCksIFN0cmlwQ1IoY2FwdHVyZWRfc3Rkb3V0XykpOworICB9CisKKyAgdm9pZCBFeHBlY3RTdGRlcnJNYXRjaGVzVGV4dChjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfdGV4dCkgeworICAgIEVYUEVDVF9FUShTdHJpcENSKGV4cGVjdGVkX3RleHQpLCBTdHJpcENSKGNhcHR1cmVkX3N0ZGVycl8pKTsKKyAgfQorCisgIHZvaWQgRXhwZWN0U3RkZXJyQ29udGFpbnNUZXh0KGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZF90ZXh0KSB7CisgICAgRVhQRUNUX05FKFN0cmlwQ1IoY2FwdHVyZWRfc3RkZXJyXykuZmluZChTdHJpcENSKGV4cGVjdGVkX3RleHQpKSwKKyAgICAgICAgICAgICAgc3RkOjpzdHJpbmc6Om5wb3MpOworICB9CisKKyBwcml2YXRlOgorICB2b2lkIFdyaXRlVW5pdHRlc3RQcm90b0Rlc2NyaXB0b3JTZXQoKSB7CisgICAgdW5pdHRlc3RfcHJvdG9fZGVzY3JpcHRvcl9zZXRfZmlsZW5hbWVfID0KKyAgICAgICAgVGVzdFRlbXBEaXIoKSArICIvdW5pdHRlc3RfcHJvdG9fZGVzY3JpcHRvcl9zZXQuYmluIjsKKyAgICBGaWxlRGVzY3JpcHRvclNldCBmaWxlX2Rlc2NyaXB0b3Jfc2V0OworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgdGVzdF9hbGxfdHlwZXM7CisgICAgdGVzdF9hbGxfdHlwZXMuZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbyhmaWxlX2Rlc2NyaXB0b3Jfc2V0LmFkZF9maWxlKCkpOworCisgICAgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlIGltcG9ydF9tZXNzYWdlOworICAgIGltcG9ydF9tZXNzYWdlLmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oZmlsZV9kZXNjcmlwdG9yX3NldC5hZGRfZmlsZSgpKTsKKworICAgIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydDo6UHVibGljSW1wb3J0TWVzc2FnZSBwdWJsaWNfaW1wb3J0X21lc3NhZ2U7CisgICAgcHVibGljX2ltcG9ydF9tZXNzYWdlLmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oCisgICAgICAgIGZpbGVfZGVzY3JpcHRvcl9zZXQuYWRkX2ZpbGUoKSk7CisgICAgR09PR0xFX0RDSEVDSyhmaWxlX2Rlc2NyaXB0b3Jfc2V0LklzSW5pdGlhbGl6ZWQoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBiaW5hcnlfcHJvdG87CisgICAgR09PR0xFX0NIRUNLKGZpbGVfZGVzY3JpcHRvcl9zZXQuU2VyaWFsaXplVG9TdHJpbmcoJmJpbmFyeV9wcm90bykpOworICAgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpTZXRDb250ZW50cyh1bml0dGVzdF9wcm90b19kZXNjcmlwdG9yX3NldF9maWxlbmFtZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5X3Byb3RvLCB0cnVlKSk7CisgIH0KKworICBpbnQgZHVwZWRfc3RkaW5fOworICBzdGQ6OnN0cmluZyBjYXB0dXJlZF9zdGRvdXRfOworICBzdGQ6OnN0cmluZyBjYXB0dXJlZF9zdGRlcnJfOworICBzdGQ6OnN0cmluZyB1bml0dGVzdF9wcm90b19kZXNjcmlwdG9yX3NldF9maWxlbmFtZV87Cit9OworCitURVNUX1AoRW5jb2RlRGVjb2RlVGVzdCwgRW5jb2RlKSB7CisgIFJlZGlyZWN0U3RkaW5Gcm9tRmlsZShUZXN0VXRpbDo6R2V0VGVzdERhdGFQYXRoKAorICAgICAgIm5ldC9wcm90bzIvaW50ZXJuYWwvIgorICAgICAgInRlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfb25lb2ZfaW1wbGVtZW50ZWQudHh0IikpOworICBzdGQ6OnN0cmluZyBhcmdzOworICBpZiAoR2V0UGFyYW0oKSAhPSBERVNDUklQVE9SX1NFVF9JTikgeworICAgIGFyZ3MuYXBwZW5kKAorICAgICAgICBUZXN0VXRpbDo6TWF5YmVUcmFuc2xhdGVQYXRoKCJuZXQvcHJvdG8yL2ludGVybmFsL3VuaXR0ZXN0LnByb3RvIikpOworICB9CisgIEVYUEVDVF9UUlVFKFJ1bihhcmdzICsgIiAtLWVuY29kZT1wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMiKSk7CisgIEV4cGVjdFN0ZG91dE1hdGNoZXNCaW5hcnlGaWxlKFRlc3RVdGlsOjpHZXRUZXN0RGF0YVBhdGgoCisgICAgICAibmV0L3Byb3RvMi9pbnRlcm5hbC90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9vbmVvZl9pbXBsZW1lbnRlZCIpKTsKKyAgRXhwZWN0U3RkZXJyTWF0Y2hlc1RleHQoIiIpOworfQorCitURVNUX1AoRW5jb2RlRGVjb2RlVGVzdCwgRGVjb2RlKSB7CisgIFJlZGlyZWN0U3RkaW5Gcm9tRmlsZShUZXN0VXRpbDo6R2V0VGVzdERhdGFQYXRoKAorICAgICAgIm5ldC9wcm90bzIvaW50ZXJuYWwvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2Vfb25lb2ZfaW1wbGVtZW50ZWQiKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgUnVuKFRlc3RVdGlsOjpNYXliZVRyYW5zbGF0ZVBhdGgoIm5ldC9wcm90bzIvaW50ZXJuYWwvdW5pdHRlc3QucHJvdG8iKSArCisgICAgICAgICAgIiAtLWRlY29kZT1wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMiKSk7CisgIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0RmlsZShUZXN0VXRpbDo6R2V0VGVzdERhdGFQYXRoKAorICAgICAgIm5ldC9wcm90bzIvaW50ZXJuYWwvIgorICAgICAgInRlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfb25lb2ZfaW1wbGVtZW50ZWQudHh0IikpOworICBFeHBlY3RTdGRlcnJNYXRjaGVzVGV4dCgiIik7Cit9CisKK1RFU1RfUChFbmNvZGVEZWNvZGVUZXN0LCBQYXJ0aWFsKSB7CisgIFJlZGlyZWN0U3RkaW5Gcm9tVGV4dCgiIik7CisgIEVYUEVDVF9UUlVFKAorICAgICAgUnVuKFRlc3RVdGlsOjpNYXliZVRyYW5zbGF0ZVBhdGgoIm5ldC9wcm90bzIvaW50ZXJuYWwvdW5pdHRlc3QucHJvdG8iKSArCisgICAgICAgICAgIiAtLWVuY29kZT1wcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQiKSk7CisgIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0KCIiKTsKKyAgRXhwZWN0U3RkZXJyTWF0Y2hlc1RleHQoCisgICAgICAid2FybmluZzogIElucHV0IG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICBhLCBiLCBjXG4iKTsKK30KKworVEVTVF9QKEVuY29kZURlY29kZVRlc3QsIERlY29kZVJhdykgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX2ludDMyKDEyMyk7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3N0cmluZygiZm9vIik7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIFJlZGlyZWN0U3RkaW5Gcm9tVGV4dChkYXRhKTsKKyAgRVhQRUNUX1RSVUUoUnVuKCItLWRlY29kZV9yYXciLCAvKnNwZWNpZnlfcHJvdG9fZmlsZXM9Ki9mYWxzZSkpOworICBFeHBlY3RTdGRvdXRNYXRjaGVzVGV4dCgKKyAgICAgICIxOiAxMjNcbiIKKyAgICAgICIxNDogXCJmb29cIlxuIik7CisgIEV4cGVjdFN0ZGVyck1hdGNoZXNUZXh0KCIiKTsKK30KKworVEVTVF9QKEVuY29kZURlY29kZVRlc3QsIFVua25vd25UeXBlKSB7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIFJ1bihUZXN0VXRpbDo6TWF5YmVUcmFuc2xhdGVQYXRoKCJuZXQvcHJvdG8yL2ludGVybmFsL3VuaXR0ZXN0LnByb3RvIikgKworICAgICAgICAgICIgLS1lbmNvZGU9Tm9TdWNoVHlwZSIpKTsKKyAgRXhwZWN0U3Rkb3V0TWF0Y2hlc1RleHQoIiIpOworICBFeHBlY3RTdGRlcnJNYXRjaGVzVGV4dCgiVHlwZSBub3QgZGVmaW5lZDogTm9TdWNoVHlwZVxuIik7Cit9CisKK1RFU1RfUChFbmNvZGVEZWNvZGVUZXN0LCBQcm90b1BhcnNlRXJyb3IpIHsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgUnVuKCJuZXQvcHJvdG8yL2ludGVybmFsL25vX3N1Y2hfZmlsZS5wcm90byAiCisgICAgICAgICAgIi0tZW5jb2RlPU5vU3VjaFR5cGUiKSk7CisgIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0KCIiKTsKKyAgRXhwZWN0U3RkZXJyQ29udGFpbnNUZXh0KAorICAgICAgIm5ldC9wcm90bzIvaW50ZXJuYWwvbm9fc3VjaF9maWxlLnByb3RvOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XG4iKTsKK30KKworVEVTVF9QKEVuY29kZURlY29kZVRlc3QsIEVuY29kZURldGVybWluaXN0aWNPdXRwdXQpIHsKKyAgUmVkaXJlY3RTdGRpbkZyb21GaWxlKFRlc3RVdGlsOjpHZXRUZXN0RGF0YVBhdGgoCisgICAgICAibmV0L3Byb3RvMi9pbnRlcm5hbC8iCisgICAgICAidGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9vbmVvZl9pbXBsZW1lbnRlZC50eHQiKSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3M7CisgIGlmIChHZXRQYXJhbSgpICE9IERFU0NSSVBUT1JfU0VUX0lOKSB7CisgICAgYXJncy5hcHBlbmQoCisgICAgICAgIFRlc3RVdGlsOjpNYXliZVRyYW5zbGF0ZVBhdGgoIm5ldC9wcm90bzIvaW50ZXJuYWwvdW5pdHRlc3QucHJvdG8iKSk7CisgIH0KKyAgRVhQRUNUX1RSVUUoUnVuKAorICAgICAgYXJncyArICIgLS1lbmNvZGU9cHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIC0tZGV0ZXJtaW5pc3RpY19vdXRwdXQiKSk7CisgIEV4cGVjdFN0ZG91dE1hdGNoZXNCaW5hcnlGaWxlKFRlc3RVdGlsOjpHZXRUZXN0RGF0YVBhdGgoCisgICAgICAibmV0L3Byb3RvMi9pbnRlcm5hbC90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9vbmVvZl9pbXBsZW1lbnRlZCIpKTsKKyAgRXhwZWN0U3RkZXJyTWF0Y2hlc1RleHQoIiIpOworfQorCitURVNUX1AoRW5jb2RlRGVjb2RlVGVzdCwgRGVjb2RlRGV0ZXJtaW5pc3RpY091dHB1dCkgeworICBSZWRpcmVjdFN0ZGluRnJvbUZpbGUoVGVzdFV0aWw6OkdldFRlc3REYXRhUGF0aCgKKyAgICAgICJuZXQvcHJvdG8yL2ludGVybmFsL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlX29uZW9mX2ltcGxlbWVudGVkIikpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBSdW4oVGVzdFV0aWw6Ok1heWJlVHJhbnNsYXRlUGF0aCgibmV0L3Byb3RvMi9pbnRlcm5hbC91bml0dGVzdC5wcm90byIpICsKKyAgICAgICAgICAiIC0tZGVjb2RlPXByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyAtLWRldGVybWluaXN0aWNfb3V0cHV0IikpOworICBFeHBlY3RTdGRlcnJNYXRjaGVzVGV4dCgKKyAgICAgICJDYW4gb25seSB1c2UgLS1kZXRlcm1pbmlzdGljX291dHB1dCB3aXRoIC0tZW5jb2RlLlxuIik7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChGaWxlRGVzY3JpcHRvclNldFNvdXJjZSwgRW5jb2RlRGVjb2RlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoUFJPVE9fUEFUSCwgREVTQ1JJUFRPUl9TRVRfSU4pKTsKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworI2VuZGlmICAvLyAhR09PR0xFX1BST1RPQlVGX0hFQVBfQ0hFQ0tfRFJBQ09OSUFOCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ib290c3RyYXBfdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9ib290c3RyYXBfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxOWU2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2Jvb3RzdHJhcF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDE5NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgdGVzdCBpbnN1cmVzIHRoYXQgbmV0L3Byb3RvMi9wcm90by9kZXNjcmlwdG9yLnBiLntoLGNjfSBtYXRjaCBleGFjdGx5CisvLyB3aGF0IHdvdWxkIGJlIGdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgY29tcGlsZXIuICBUaGVzZSBmaWxlcyBhcmUgbm90CisvLyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBhdCBidWlsZCB0aW1lIGJlY2F1c2UgdGhleSBhcmUgY29tcGlsZWQgaW50byB0aGUKKy8vIHByb3RvY29sIGNvbXBpbGVyIGl0c2VsZi4gIFNvLCBpZiB0aGV5IHdlcmUgYXV0by1nZW5lcmF0ZWQsIHlvdSdkIGhhdmUgYQorLy8gY2hpY2tlbi1hbmQtZWdnIHByb2JsZW0uCisvLworLy8gSWYgdGhpcyB0ZXN0IGZhaWxzLCBydW4gdGhlIHNjcmlwdAorLy8gImdlbmVyYXRlX2Rlc2NyaXB0b3JfcHJvdG8uc2giIGFuZCBhZGQKKy8vIGRlc2NyaXB0b3IucGIue2gsY2N9IHRvIHlvdXIgY2hhbmdlbGlzdC4KKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsMi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb2NrRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgTW9ja0Vycm9yQ29sbGVjdG9yKCkge30KKyAgfk1vY2tFcnJvckNvbGxlY3RvcigpIG92ZXJyaWRlIHt9CisKKyAgc3RkOjpzdHJpbmcgdGV4dF87CisKKyAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBBZGRFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSBvdmVycmlkZSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmdGV4dF8sICIkMDokMTokMjogJDNcbiIsIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgfQorfTsKKworY2xhc3MgTW9ja0dlbmVyYXRvckNvbnRleHQgOiBwdWJsaWMgR2VuZXJhdG9yQ29udGV4dCB7CisgcHVibGljOgorICB2b2lkIEV4cGVjdEZpbGVNYXRjaGVzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2aXJ0dWFsX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbF9maWxlbmFtZSkgeworICAgIGF1dG8gaXQgPSBmaWxlc18uZmluZCh2aXJ0dWFsX2ZpbGVuYW1lKTsKKyAgICBBU1NFUlRfVFJVRShpdCAhPSBmaWxlc18uZW5kKCkpCisgICAgICAgIDw8ICJHZW5lcmF0b3IgZmFpbGVkIHRvIGdlbmVyYXRlIGZpbGU6ICIgPDwgdmlydHVhbF9maWxlbmFtZTsKKworICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkX2NvbnRlbnRzID0gKml0LT5zZWNvbmQ7CisgICAgc3RkOjpzdHJpbmcgYWN0dWFsX2NvbnRlbnRzOworICAgIEdPT0dMRV9DSEVDS19PSygKKyAgICAgICAgRmlsZTo6R2V0Q29udGVudHMoVGVzdFV0aWw6OlRlc3RTb3VyY2VEaXIoKSArICIvIiArIHBoeXNpY2FsX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0dWFsX2NvbnRlbnRzLCB0cnVlKSkKKyAgICAgICAgPDwgcGh5c2ljYWxfZmlsZW5hbWU7CisgICAgQ2xlYW5TdHJpbmdMaW5lRW5kaW5ncygmYWN0dWFsX2NvbnRlbnRzLCBmYWxzZSk7CisKKyNpZmRlZiBXUklURV9GSUxFUyAgLy8gRGVmaW5lIHRvIGRlYnVnIG1pc21hdGNoZWQgZmlsZXMuCisgICAgR09PR0xFX0NIRUNLX09LKEZpbGU6OlNldENvbnRlbnRzKCIvdG1wL2V4cGVjdGVkLmNjIiwgZXhwZWN0ZWRfY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpOworICAgIEdPT0dMRV9DSEVDS19PSygKKyAgICAgICAgRmlsZTo6U2V0Q29udGVudHMoIi90bXAvYWN0dWFsLmNjIiwgYWN0dWFsX2NvbnRlbnRzLCB0cnVlKSk7CisjZW5kaWYKKworICAgIEFTU0VSVF9FUShleHBlY3RlZF9jb250ZW50cywgYWN0dWFsX2NvbnRlbnRzKQorICAgICAgICA8PCBwaHlzaWNhbF9maWxlbmFtZQorICAgICAgICA8PCAiIG5lZWRzIHRvIGJlIHJlZ2VuZXJhdGVkLiAgUGxlYXNlIHJ1biAiCisgICAgICAgICAgICJnZW5lcmF0ZV9kZXNjcmlwdG9yX3Byb3RvLnNoLiAiCisgICAgICAgICAgICJUaGVuIGFkZCB0aGlzIGZpbGUgdG8geW91ciBDTC4iOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBHZW5lcmF0b3JDb250ZXh0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBPcGVuKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgb3ZlcnJpZGUgeworICAgIGF1dG8mIG1hcF9zbG90ID0gZmlsZXNfW2ZpbGVuYW1lXTsKKyAgICBtYXBfc2xvdC5yZXNldChuZXcgc3RkOjpzdHJpbmcpOworICAgIHJldHVybiBuZXcgaW86OlN0cmluZ091dHB1dFN0cmVhbShtYXBfc2xvdC5nZXQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+PiBmaWxlc187Cit9OworCitjb25zdCBjaGFyIGtEZXNjcmlwdG9yUGFyYW1ldGVyW10gPSAiZGxsZXhwb3J0X2RlY2w9UFJPVE9CVUZfRVhQT1JUIjsKK2NvbnN0IGNoYXIga1BsdWdpblBhcmFtZXRlcltdID0gImRsbGV4cG9ydF9kZWNsPVBST1RPQ19FWFBPUlQiOworCisKK2NvbnN0IGNoYXIqIHRlc3RfcHJvdG9zW11bMl0gPSB7CisgICAgeyJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvciIsIGtEZXNjcmlwdG9yUGFyYW1ldGVyfSwKKyAgICB7Imdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4iLCBrUGx1Z2luUGFyYW1ldGVyfSwKK307CisKK1RFU1QoQm9vdHN0cmFwVGVzdCwgR2VuZXJhdGVkRmlsZXNNYXRjaCkgeworICAvLyBXZSBuZWVkIGEgbWFwcGluZyBmcm9tIHRoZSBhY3R1YWwgZmlsZSB0byB2aXJ0dWFsIGFuZCBhY3R1YWwgcGF0aAorICAvLyBvZiB0aGUgZGF0YSB0byBjb21wYXJlIHRvLgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZwYXRoX21hcDsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBycGF0aF9tYXA7CisgIHJwYXRoX21hcFsidGhpcmRfcGFydHkvcHJvdG9idWYvdGVzdF9tZXNzYWdlc19wcm90bzIiXSA9CisgICAgICAibmV0L3Byb3RvMi96X2dlbmVyYXRlZF9leGFtcGxlL3Rlc3RfbWVzc2FnZXNfcHJvdG8yIjsKKyAgcnBhdGhfbWFwWyJ0aGlyZF9wYXJ0eS9wcm90b2J1Zi90ZXN0X21lc3NhZ2VzX3Byb3RvMyJdID0KKyAgICAgICJuZXQvcHJvdG8yL3pfZ2VuZXJhdGVkX2V4YW1wbGUvdGVzdF9tZXNzYWdlc19wcm90bzMiOworICBycGF0aF9tYXBbIm5ldC9wcm90bzIvaW50ZXJuYWwvcHJvdG8yX3dlYWsiXSA9CisgICAgICAibmV0L3Byb3RvMi96X2dlbmVyYXRlZF9leGFtcGxlL3Byb3RvMl93ZWFrIjsKKworICBEaXNrU291cmNlVHJlZSBzb3VyY2VfdHJlZTsKKyAgc291cmNlX3RyZWUuTWFwUGF0aCgiIiwgVGVzdFV0aWw6OlRlc3RTb3VyY2VEaXIoKSk7CisKKyAgZm9yIChhdXRvIGZpbGVfcGFyYW1ldGVyIDogdGVzdF9wcm90b3MpIHsKKyAgICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICAgIEltcG9ydGVyIGltcG9ydGVyKCZzb3VyY2VfdHJlZSwgJmVycm9yX2NvbGxlY3Rvcik7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPQorICAgICAgICBpbXBvcnRlci5JbXBvcnQoZmlsZV9wYXJhbWV0ZXJbMF0gKyBzdGQ6OnN0cmluZygiLnByb3RvIikpOworICAgIEFTU0VSVF9UUlVFKGZpbGUgIT0gbnVsbHB0cikKKyAgICAgICAgPDwgIkNhbid0IGltcG9ydCBmaWxlICIgPDwgZmlsZV9wYXJhbWV0ZXJbMF0gKyBzdGQ6OnN0cmluZygiLnByb3RvIikKKyAgICAgICAgPDwgIlxuIjsKKyAgICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7CisgICAgQ3BwR2VuZXJhdG9yIGdlbmVyYXRvcjsKKyAgICBNb2NrR2VuZXJhdG9yQ29udGV4dCBjb250ZXh0OworI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9SVU5USU1FX0lOQ0xVREVfQkFTRQorICAgIGdlbmVyYXRvci5zZXRfb3BlbnNvdXJjZV9ydW50aW1lKHRydWUpOworICAgIGdlbmVyYXRvci5zZXRfcnVudGltZV9pbmNsdWRlX2Jhc2UoR09PR0xFX1BST1RPQlVGX1JVTlRJTUVfSU5DTFVERV9CQVNFKTsKKyNlbmRpZgorICAgIHN0ZDo6c3RyaW5nIGVycm9yOworICAgIEFTU0VSVF9UUlVFKGdlbmVyYXRvci5HZW5lcmF0ZShmaWxlLCBmaWxlX3BhcmFtZXRlclsxXSwgJmNvbnRleHQsICZlcnJvcikpOworCisgICAgc3RkOjpzdHJpbmcgdnBhdGggPQorICAgICAgICBGaW5kV2l0aERlZmF1bHQodnBhdGhfbWFwLCBmaWxlX3BhcmFtZXRlclswXSwgZmlsZV9wYXJhbWV0ZXJbMF0pOworICAgIHN0ZDo6c3RyaW5nIHJwYXRoID0KKyAgICAgICAgRmluZFdpdGhEZWZhdWx0KHJwYXRoX21hcCwgZmlsZV9wYXJhbWV0ZXJbMF0sIGZpbGVfcGFyYW1ldGVyWzBdKTsKKyAgICBjb250ZXh0LkV4cGVjdEZpbGVNYXRjaGVzKHZwYXRoICsgIi5wYi5jYyIsIHJwYXRoICsgIi5wYi5jYyIpOworICAgIGNvbnRleHQuRXhwZWN0RmlsZU1hdGNoZXModnBhdGggKyAiLnBiLmgiLCBycGF0aCArICIucGIuaCIpOworICB9Cit9CisKKy8vIHRlc3QgR2VuZXJhdGUgaW4gY3BwX2dlbmVyYXRvci5jYworVEVTVChCb290c3RyYXBUZXN0LCBPcHRpb25Ob3RFeGlzdCkgeworICBjcHA6OkNwcEdlbmVyYXRvciBnZW5lcmF0b3I7CisgIERlc2NyaXB0b3JQb29sIHBvb2w7CisgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0ID0gbnVsbHB0cjsKKyAgc3RkOjpzdHJpbmcgcGFyYW1ldGVyID0gImFhYSI7CisgIHN0ZDo6c3RyaW5nIGVycm9yOworICBBU1NFUlRfRkFMU0UoZ2VuZXJhdG9yLkdlbmVyYXRlKAorICAgICAgcG9vbC5GaW5kRmlsZUJ5TmFtZSgiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iKSwgcGFyYW1ldGVyLAorICAgICAgZ2VuZXJhdG9yX2NvbnRleHQsICZlcnJvcikpOworICBFWFBFQ1RfRVEoZXJyb3IsICJVbmtub3duIGdlbmVyYXRvciBvcHRpb246ICIgKyBwYXJhbWV0ZXIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzE2YWIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0NQUF9HRU5FUkFUT1JfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9DUFBfR0VORVJBVE9SX0hfCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2dlbmVyYXRvci5oPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfQ1BQX0dFTkVSQVRPUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZW51bS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2VudW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyNDM2OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2VudW0uY2MKQEAgLTAsMCArMSw0MzggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZW51bS5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbmFtZXMuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCituYW1lc3BhY2UgeworLy8gVGhlIEdPT0dMRV9BUlJBWVNJWkUgY29uc3RhbnQgaXMgdGhlIG1heCBlbnVtIHZhbHVlIHBsdXMgMS4gSWYgdGhlIG1heCBlbnVtIHZhbHVlCisvLyBpcyBraW50MzJtYXgsIEdPT0dMRV9BUlJBWVNJWkUgd2lsbCBvdmVyZmxvdy4gSW4gc3VjaCBjYXNlcyB3ZSBzaG91bGQgb21pdCB0aGUKKy8vIGdlbmVyYXRpb24gb2YgdGhlIEdPT0dMRV9BUlJBWVNJWkUgY29uc3RhbnQuCitib29sIFNob3VsZEdlbmVyYXRlQXJyYXlTaXplKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIGludDMyX3QgbWF4X3ZhbHVlID0gZGVzY3JpcHRvci0+dmFsdWUoMCktPm51bWJlcigpOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPnZhbHVlX2NvdW50KCk7IGkrKykgeworICAgIGlmIChkZXNjcmlwdG9yLT52YWx1ZShpKS0+bnVtYmVyKCkgPiBtYXhfdmFsdWUpIHsKKyAgICAgIG1heF92YWx1ZSA9IGRlc2NyaXB0b3ItPnZhbHVlKGkpLT5udW1iZXIoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG1heF92YWx1ZSAhPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKTsKK30KKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBudW1lcmljIGVudW0gdmFsdWVzLiBUaGlzIGlzIGxlc3MgdGhhbgorLy8gZGVzY3JpcHRvci0+dmFsdWVfY291bnQoKSB3aGVuIHRoZXJlIGFyZSBhbGlhc2VkIHZhbHVlcy4KK2ludCBDb3VudFVuaXF1ZVZhbHVlcyhjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBzdGQ6OnNldDxpbnQ+IHZhbHVlczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT52YWx1ZV9jb3VudCgpOyArK2kpIHsKKyAgICB2YWx1ZXMuaW5zZXJ0KGRlc2NyaXB0b3ItPnZhbHVlKGkpLT5udW1iZXIoKSk7CisgIH0KKyAgcmV0dXJuIHZhbHVlcy5zaXplKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitFbnVtR2VuZXJhdG9yOjpFbnVtR2VuZXJhdG9yKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCisgICAgICBjbGFzc25hbWVfKENsYXNzTmFtZShkZXNjcmlwdG9yLCBmYWxzZSkpLAorICAgICAgb3B0aW9uc18ob3B0aW9ucyksCisgICAgICBnZW5lcmF0ZV9hcnJheV9zaXplXyhTaG91bGRHZW5lcmF0ZUFycmF5U2l6ZShkZXNjcmlwdG9yKSksCisgICAgICB2YXJpYWJsZXNfKHZhcnMpIHsKKyAgdmFyaWFibGVzX1siY2xhc3NuYW1lIl0gPSBjbGFzc25hbWVfOworICB2YXJpYWJsZXNfWyJjbGFzc3R5cGUiXSA9IFF1YWxpZmllZENsYXNzTmFtZShkZXNjcmlwdG9yXywgb3B0aW9ucyk7CisgIHZhcmlhYmxlc19bInNob3J0X25hbWUiXSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7CisgIHZhcmlhYmxlc19bIm5lc3RlZF9uYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOworICB2YXJpYWJsZXNfWyJyZXNvbHZlZF9uYW1lIl0gPSBSZXNvbHZlS2V5d29yZChkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgdmFyaWFibGVzX1sicHJlZml4Il0gPQorICAgICAgKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSA9PSBudWxscHRyKSA/ICIiIDogY2xhc3NuYW1lXyArICJfIjsKK30KKworRW51bUdlbmVyYXRvcjo6fkVudW1HZW5lcmF0b3IoKSB7fQorCit2b2lkIEVudW1HZW5lcmF0b3I6OkdlbmVyYXRlRGVmaW5pdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoImVudW0gJHsxJCRjbGFzc25hbWUkJH0kIDogaW50IHtcbiIsIGRlc2NyaXB0b3JfKTsKKyAgZm9ybWF0LkluZGVudCgpOworCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIG1pbl92YWx1ZSA9IGRlc2NyaXB0b3JfLT52YWx1ZSgwKTsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogbWF4X3ZhbHVlID0gZGVzY3JpcHRvcl8tPnZhbHVlKDApOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCk7IGkrKykgeworICAgIGF1dG8gZm9ybWF0X3ZhbHVlID0gZm9ybWF0OworICAgIGZvcm1hdF92YWx1ZS5TZXQoIm5hbWUiLCBFbnVtVmFsdWVOYW1lKGRlc2NyaXB0b3JfLT52YWx1ZShpKSkpOworICAgIC8vIEluIEMrKywgYW4gdmFsdWUgb2YgLTIxNDc0ODM2NDggZ2V0cyBpbnRlcnByZXRlZCBhcyB0aGUgbmVnYXRpdmUgb2YKKyAgICAvLyAyMTQ3NDgzNjQ4LCBhbmQgc2luY2UgMjE0NzQ4MzY0OCBjYW4ndCBmaXQgaW4gYW4gaW50ZWdlciwgdGhpcyBwcm9kdWNlcyBhCisgICAgLy8gY29tcGlsZXIgd2FybmluZy4gIFRoaXMgd29ya3MgYXJvdW5kIHRoYXQgaXNzdWUuCisgICAgZm9ybWF0X3ZhbHVlLlNldCgibnVtYmVyIiwgSW50MzJUb1N0cmluZyhkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm51bWJlcigpKSk7CisgICAgZm9ybWF0X3ZhbHVlLlNldCgiZGVwcmVjYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRlZEF0dHJpYnV0ZShvcHRpb25zXywgZGVzY3JpcHRvcl8tPnZhbHVlKGkpKSk7CisKKyAgICBpZiAoaSA+IDApIGZvcm1hdF92YWx1ZSgiLFxuIik7CisgICAgZm9ybWF0X3ZhbHVlKCIkezEkJHByZWZpeCQkbmFtZSQkfSQgJGRlcHJlY2F0aW9uJD0gJG51bWJlciQiLAorICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXy0+dmFsdWUoaSkpOworCisgICAgaWYgKGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bnVtYmVyKCkgPCBtaW5fdmFsdWUtPm51bWJlcigpKSB7CisgICAgICBtaW5fdmFsdWUgPSBkZXNjcmlwdG9yXy0+dmFsdWUoaSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm51bWJlcigpID4gbWF4X3ZhbHVlLT5udW1iZXIoKSkgeworICAgICAgbWF4X3ZhbHVlID0gZGVzY3JpcHRvcl8tPnZhbHVlKGkpOworICAgIH0KKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+ZmlsZSgpLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMykgeworICAgIC8vIEZvciBuZXcgZW51bSBzZW1hbnRpY3M6IGdlbmVyYXRlIG1pbiBhbmQgbWF4IHNlbnRpbmVsIHZhbHVlcyBlcXVhbCB0bworICAgIC8vIElOVDMyX01JTiBhbmQgSU5UMzJfTUFYCisgICAgaWYgKGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpID4gMCkgZm9ybWF0KCIsXG4iKTsKKyAgICBmb3JtYXQoCisgICAgICAgICIkY2xhc3NuYW1lJF8kcHJlZml4JElOVF9NSU5fU0VOVElORUxfRE9fTk9UX1VTRV8gPSAiCisgICAgICAgICJzdGQ6Om51bWVyaWNfbGltaXRzPCRpbnQzMiQ+OjptaW4oKSxcbiIKKyAgICAgICAgIiRjbGFzc25hbWUkXyRwcmVmaXgkSU5UX01BWF9TRU5USU5FTF9ET19OT1RfVVNFXyA9ICIKKyAgICAgICAgInN0ZDo6bnVtZXJpY19saW1pdHM8JGludDMyJD46Om1heCgpIik7CisgIH0KKworICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoIlxufTtcbiIpOworCisgIGZvcm1hdCgKKyAgICAgICIkZGxsZXhwb3J0X2RlY2wgJGJvb2wgJGNsYXNzbmFtZSRfSXNWYWxpZChpbnQgdmFsdWUpO1xuIgorICAgICAgImNvbnN0ZXhwciAkY2xhc3NuYW1lJCAkezEkJHByZWZpeCQkc2hvcnRfbmFtZSRfTUlOJH0kID0gIgorICAgICAgIiRwcmVmaXgkJDIkO1xuIgorICAgICAgImNvbnN0ZXhwciAkY2xhc3NuYW1lJCAkezEkJHByZWZpeCQkc2hvcnRfbmFtZSRfTUFYJH0kID0gIgorICAgICAgIiRwcmVmaXgkJDMkO1xuIiwKKyAgICAgIGRlc2NyaXB0b3JfLCBFbnVtVmFsdWVOYW1lKG1pbl92YWx1ZSksIEVudW1WYWx1ZU5hbWUobWF4X3ZhbHVlKSk7CisKKyAgaWYgKGdlbmVyYXRlX2FycmF5X3NpemVfKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiY29uc3RleHByIGludCAkezEkJHByZWZpeCQkc2hvcnRfbmFtZSRfQVJSQVlTSVpFJH0kID0gIgorICAgICAgICAiJHByZWZpeCQkc2hvcnRfbmFtZSRfTUFYICsgMTtcblxuIiwKKyAgICAgICAgZGVzY3JpcHRvcl8pOworICB9CisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgIiRkbGxleHBvcnRfZGVjbCAkY29uc3QgOjokcHJvdG9fbnMkOjpFbnVtRGVzY3JpcHRvciogIgorICAgICAgICAiJGNsYXNzbmFtZSRfZGVzY3JpcHRvcigpO1xuIik7CisgIH0KKworICAvLyBUaGUgX05hbWUgYW5kIF9QYXJzZSBmdW5jdGlvbnMuIFRoZSBsaXRlIGltcGxlbWVudGF0aW9uIGlzIHRhYmxlLWJhc2VkLCBzbworICAvLyB3ZSBtYWtlIHN1cmUgdG8ga2VlcCB0aGUgdGFibGVzIGhpZGRlbiBpbiB0aGUgLmNjIGZpbGUuCisgIGlmICghSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KCJjb25zdCBzdGQ6OnN0cmluZyYgJGNsYXNzbmFtZSRfTmFtZSgkY2xhc3NuYW1lJCB2YWx1ZSk7XG4iKTsKKyAgfQorICAvLyBUaGUgX05hbWUoKSBmdW5jdGlvbiBhY2NlcHRzIHRoZSBlbnVtIHR5cGUgaXRzZWxmIGJ1dCBhbHNvIGFueSBpbnRlZ3JhbAorICAvLyB0eXBlLgorICBmb3JtYXQoCisgICAgICAidGVtcGxhdGU8dHlwZW5hbWUgVD5cbiIKKyAgICAgICJpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmICRjbGFzc25hbWUkX05hbWUoVCBlbnVtX3RfdmFsdWUpIHtcbiIKKyAgICAgICIgIHN0YXRpY19hc3NlcnQoOjpzdGQ6OmlzX3NhbWU8VCwgJGNsYXNzbmFtZSQ+Ojp2YWx1ZSB8fFxuIgorICAgICAgIiAgICA6OnN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLFxuIgorICAgICAgIiAgICBcIkluY29ycmVjdCB0eXBlIHBhc3NlZCB0byBmdW5jdGlvbiAkY2xhc3NuYW1lJF9OYW1lLlwiKTtcbiIpOworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiICByZXR1cm4gOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6TmFtZU9mRW51bShcbiIKKyAgICAgICAgIiAgICAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yKCksIGVudW1fdF92YWx1ZSk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoCisgICAgICAgICIgIHJldHVybiAkY2xhc3NuYW1lJF9OYW1lKHN0YXRpY19jYXN0PCRjbGFzc25hbWUkPihlbnVtX3RfdmFsdWUpKTtcbiIpOworICB9CisgIGZvcm1hdCgifVxuIik7CisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgImlubGluZSBib29sICRjbGFzc25hbWUkX1BhcnNlKFxuIgorICAgICAgICAiICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpDb25zdFN0cmluZ1BhcmFtIG5hbWUsICRjbGFzc25hbWUkKiAiCisgICAgICAgICJ2YWx1ZSkgIgorICAgICAgICAie1xuIgorICAgICAgICAiICByZXR1cm4gOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6UGFyc2VOYW1lZEVudW08JGNsYXNzbmFtZSQ+KFxuIgorICAgICAgICAiICAgICRjbGFzc25hbWUkX2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpO1xuIgorICAgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KAorICAgICAgICAiYm9vbCAkY2xhc3NuYW1lJF9QYXJzZShcbiIKKyAgICAgICAgIiAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Q29uc3RTdHJpbmdQYXJhbSBuYW1lLCAkY2xhc3NuYW1lJCogIgorICAgICAgICAidmFsdWUpO1xuIik7CisgIH0KK30KKwordm9pZCBFbnVtR2VuZXJhdG9yOjpHZW5lcmF0ZUdldEVudW1EZXNjcmlwdG9yU3BlY2lhbGl6YXRpb25zKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgKKyAgICAgICJ0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNfcHJvdG9fZW51bTwgJGNsYXNzdHlwZSQ+IDogOjpzdGQ6OnRydWVfdHlwZSAiCisgICAgICAie307XG4iKTsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgInRlbXBsYXRlIDw+XG4iCisgICAgICAgICJpbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCAkY2xhc3N0eXBlJD4oKSB7XG4iCisgICAgICAgICIgIHJldHVybiAkY2xhc3N0eXBlJF9kZXNjcmlwdG9yKCk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQorfQorCit2b2lkIEVudW1HZW5lcmF0b3I6OkdlbmVyYXRlU3ltYm9sSW1wb3J0cyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoInR5cGVkZWYgJGNsYXNzbmFtZSQgJHJlc29sdmVkX25hbWUkO1xuIik7CisKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKTsgaisrKSB7CisgICAgc3RkOjpzdHJpbmcgZGVwcmVjYXRlZF9hdHRyID0KKyAgICAgICAgRGVwcmVjYXRlZEF0dHJpYnV0ZShvcHRpb25zXywgZGVzY3JpcHRvcl8tPnZhbHVlKGopKTsKKyAgICBmb3JtYXQoCisgICAgICAgICIkMSRzdGF0aWMgY29uc3RleHByICRyZXNvbHZlZF9uYW1lJCAkezIkJDMkJH0kID1cbiIKKyAgICAgICAgIiAgJGNsYXNzbmFtZSRfJDMkO1xuIiwKKyAgICAgICAgZGVwcmVjYXRlZF9hdHRyLCBkZXNjcmlwdG9yXy0+dmFsdWUoaiksCisgICAgICAgIEVudW1WYWx1ZU5hbWUoZGVzY3JpcHRvcl8tPnZhbHVlKGopKSk7CisgIH0KKworICBmb3JtYXQoCisgICAgICAic3RhdGljIGlubGluZSBib29sICRuZXN0ZWRfbmFtZSRfSXNWYWxpZChpbnQgdmFsdWUpIHtcbiIKKyAgICAgICIgIHJldHVybiAkY2xhc3NuYW1lJF9Jc1ZhbGlkKHZhbHVlKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAic3RhdGljIGNvbnN0ZXhwciAkcmVzb2x2ZWRfbmFtZSQgJHsxJCRuZXN0ZWRfbmFtZSRfTUlOJH0kID1cbiIKKyAgICAgICIgICRjbGFzc25hbWUkXyRuZXN0ZWRfbmFtZSRfTUlOO1xuIgorICAgICAgInN0YXRpYyBjb25zdGV4cHIgJHJlc29sdmVkX25hbWUkICR7MSQkbmVzdGVkX25hbWUkX01BWCR9JCA9XG4iCisgICAgICAiICAkY2xhc3NuYW1lJF8kbmVzdGVkX25hbWUkX01BWDtcbiIsCisgICAgICBkZXNjcmlwdG9yXyk7CisgIGlmIChnZW5lcmF0ZV9hcnJheV9zaXplXykgeworICAgIGZvcm1hdCgKKyAgICAgICAgInN0YXRpYyBjb25zdGV4cHIgaW50ICR7MSQkbmVzdGVkX25hbWUkX0FSUkFZU0laRSR9JCA9XG4iCisgICAgICAgICIgICRjbGFzc25hbWUkXyRuZXN0ZWRfbmFtZSRfQVJSQVlTSVpFO1xuIiwKKyAgICAgICAgZGVzY3JpcHRvcl8pOworICB9CisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgInN0YXRpYyBpbmxpbmUgY29uc3QgOjokcHJvdG9fbnMkOjpFbnVtRGVzY3JpcHRvcipcbiIKKyAgICAgICAgIiRuZXN0ZWRfbmFtZSRfZGVzY3JpcHRvcigpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRjbGFzc25hbWUkX2Rlc2NyaXB0b3IoKTtcbiIKKyAgICAgICAgIn1cbiIpOworICB9CisKKyAgZm9ybWF0KAorICAgICAgInRlbXBsYXRlPHR5cGVuYW1lIFQ+XG4iCisgICAgICAic3RhdGljIGlubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgJG5lc3RlZF9uYW1lJF9OYW1lKFQgZW51bV90X3ZhbHVlKSB7XG4iCisgICAgICAiICBzdGF0aWNfYXNzZXJ0KDo6c3RkOjppc19zYW1lPFQsICRyZXNvbHZlZF9uYW1lJD46OnZhbHVlIHx8XG4iCisgICAgICAiICAgIDo6c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsXG4iCisgICAgICAiICAgIFwiSW5jb3JyZWN0IHR5cGUgcGFzc2VkIHRvIGZ1bmN0aW9uICRuZXN0ZWRfbmFtZSRfTmFtZS5cIik7XG4iCisgICAgICAiICByZXR1cm4gJGNsYXNzbmFtZSRfTmFtZShlbnVtX3RfdmFsdWUpO1xuIgorICAgICAgIn1cbiIpOworICBmb3JtYXQoCisgICAgICAic3RhdGljIGlubGluZSBib29sICIKKyAgICAgICIkbmVzdGVkX25hbWUkX1BhcnNlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpDb25zdFN0cmluZ1BhcmFtIG5hbWUsXG4iCisgICAgICAiICAgICRyZXNvbHZlZF9uYW1lJCogdmFsdWUpIHtcbiIKKyAgICAgICIgIHJldHVybiAkY2xhc3NuYW1lJF9QYXJzZShuYW1lLCB2YWx1ZSk7XG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgRW51bUdlbmVyYXRvcjo6R2VuZXJhdGVNZXRob2RzKGludCBpZHgsIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJjb25zdCA6OiRwcm90b19ucyQ6OkVudW1EZXNjcmlwdG9yKiAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yKCkge1xuIgorICAgICAgICAiICA6OiRwcm90b19ucyQ6OmludGVybmFsOjpBc3NpZ25EZXNjcmlwdG9ycygmJGRlc2NfdGFibGUkKTtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnMkWyQxJF07XG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICBpZHgpOworICB9CisKKyAgZm9ybWF0KAorICAgICAgImJvb2wgJGNsYXNzbmFtZSRfSXNWYWxpZChpbnQgdmFsdWUpIHtcbiIKKyAgICAgICIgIHN3aXRjaCAodmFsdWUpIHtcbiIpOworCisgIC8vIE11bHRpcGxlIHZhbHVlcyBtYXkgaGF2ZSB0aGUgc2FtZSBudW1iZXIuICBNYWtlIHN1cmUgd2Ugb25seSBjb3ZlcgorICAvLyBlYWNoIG51bWJlciBvbmNlIGJ5IGZpcnN0IGNvbnN0cnVjdGluZyBhIHNldCBjb250YWluaW5nIGFsbCB2YWxpZAorICAvLyBudW1iZXJzLCB0aGVuIHByaW50aW5nIGEgY2FzZSBzdGF0ZW1lbnQgZm9yIGVhY2ggZWxlbWVudC4KKworICBzdGQ6OnNldDxpbnQ+IG51bWJlcnM7CisgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCk7IGorKykgeworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlID0gZGVzY3JpcHRvcl8tPnZhbHVlKGopOworICAgIG51bWJlcnMuaW5zZXJ0KHZhbHVlLT5udW1iZXIoKSk7CisgIH0KKworICBmb3IgKHN0ZDo6c2V0PGludD46Oml0ZXJhdG9yIGl0ZXIgPSBudW1iZXJzLmJlZ2luKCk7IGl0ZXIgIT0gbnVtYmVycy5lbmQoKTsKKyAgICAgICArK2l0ZXIpIHsKKyAgICBmb3JtYXQoIiAgICBjYXNlICQxJDpcbiIsIEludDMyVG9TdHJpbmcoKml0ZXIpKTsKKyAgfQorCisgIGZvcm1hdCgKKyAgICAgICIgICAgICByZXR1cm4gdHJ1ZTtcbiIKKyAgICAgICIgICAgZGVmYXVsdDpcbiIKKyAgICAgICIgICAgICByZXR1cm4gZmFsc2U7XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIik7CisKKyAgaWYgKCFIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAvLyBJbiBsaXRlIG1vZGUgKHdoZXJlIGRlc2NyaXB0b3JzIGFyZSB1bmF2YWlsYWJsZSksIHdlIGdlbmVyYXRlIHNlcGFyYXRlCisgICAgLy8gdGFibGVzIGZvciBtYXBwaW5nIGJldHdlZW4gZW51bSBuYW1lcyBhbmQgbnVtYmVycy4gVGhlIF9lbnRyaWVzIHRhYmxlCisgICAgLy8gY29udGFpbnMgdGhlIGJ1bGsgb2YgdGhlIGRhdGEgYW5kIGlzIHNvcnRlZCBieSBuYW1lLCB3aGlsZQorICAgIC8vIF9lbnRyaWVzX2J5X251bWJlciBpcyBzb3J0ZWQgYnkgbnVtYmVyIGFuZCBqdXN0IGNvbnRhaW5zIHBvaW50ZXJzIGludG8KKyAgICAvLyBfZW50cmllcy4gVGhlIHR3byB0YWJsZXMgYWxsb3cgbWFwcGluZyBmcm9tIG5hbWUgdG8gbnVtYmVyIGFuZCBudW1iZXIgdG8KKyAgICAvLyBuYW1lLCBib3RoIGluIHRpbWUgbG9nYXJpdGhtaWMgaW4gdGhlIG51bWJlciBvZiBlbnVtIGVudHJpZXMuIFRoaXMgY291bGQKKyAgICAvLyBwcm9iYWJseSBiZSBtYWRlIGZhc3RlciwgYnV0IGZvciBub3cgdGhlIHRhYmxlcyBhcmUgaW50ZW5kZWQgdG8gYmUgc2ltcGxlCisgICAgLy8gYW5kIGNvbXBhY3QuCisgICAgLy8KKyAgICAvLyBFbnVtcyB3aXRoIGFsbG93X2FsaWFzID0gdHJ1ZSBzdXBwb3J0IG11bHRpcGxlIGVudHJpZXMgd2l0aCB0aGUgc2FtZQorICAgIC8vIG51bWVyaWNhbCB2YWx1ZS4gSW4gY2FzZXMgd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIG5hbWVzIGZvciB0aGUgc2FtZQorICAgIC8vIG51bWJlciwgd2UgdHJlYXQgdGhlIGZpcnN0IG5hbWUgYXBwZWFyaW5nIGluIHRoZSAucHJvdG8gZmlsZSBhcyB0aGUKKyAgICAvLyBjYW5vbmljYWwgb25lLgorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG5hbWVfdG9fbnVtYmVyOworICAgIHN0ZDo6bWFwPGludCwgc3RkOjpzdHJpbmc+IG51bWJlcl90b19jYW5vbmljYWxfbmFtZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlID0gZGVzY3JpcHRvcl8tPnZhbHVlKGkpOworICAgICAgbmFtZV90b19udW1iZXIuZW1wbGFjZSh2YWx1ZS0+bmFtZSgpLCB2YWx1ZS0+bnVtYmVyKCkpOworICAgICAgLy8gVGhlIHNhbWUgbnVtYmVyIG1heSBhcHBlYXIgd2l0aCBtdWx0aXBsZSBuYW1lcywgc28gd2UgdXNlIGVtcGxhY2UoKSB0bworICAgICAgLy8gbGV0IHRoZSBmaXJzdCBuYW1lIHdpbi4KKyAgICAgIG51bWJlcl90b19jYW5vbmljYWxfbmFtZS5lbXBsYWNlKHZhbHVlLT5udW1iZXIoKSwgdmFsdWUtPm5hbWUoKSk7CisgICAgfQorCisgICAgZm9ybWF0KAorICAgICAgICAic3RhdGljIDo6JHByb3RvX25zJDo6aW50ZXJuYWw6OkV4cGxpY2l0bHlDb25zdHJ1Y3RlZDxzdGQ6OnN0cmluZz4gIgorICAgICAgICAiJGNsYXNzbmFtZSRfc3RyaW5nc1skMSRdID0ge307XG5cbiIsCisgICAgICAgIENvdW50VW5pcXVlVmFsdWVzKGRlc2NyaXB0b3JfKSk7CisKKyAgICAvLyBXZSBjb25jYXRlbmF0ZSBhbGwgdGhlIG5hbWVzIGZvciBhIGdpdmVuIGVudW0gaW50byBvbmUgYmlnIHN0cmluZworICAgIC8vIGxpdGVyYWwuIElmIGluc3RlYWQgd2Ugc3RvcmUgYW4gYXJyYXkgb2Ygc3RyaW5nIGxpdGVyYWxzLCB0aGUgbGlua2VyCisgICAgLy8gc2VlbXMgdG8gcHV0IGFsbCBlbnVtIHN0cmluZ3MgZm9yIGEgZ2l2ZW4gLnByb3RvIGZpbGUgaW4gdGhlIHNhbWUKKyAgICAvLyBzZWN0aW9uLCB3aGljaCBoaW5kZXJzIGl0cyBhYmlsaXR5IHRvIHN0cmlwIG91dCB1bnVzZWQgc3RyaW5ncy4KKyAgICBmb3JtYXQoInN0YXRpYyBjb25zdCBjaGFyICRjbGFzc25hbWUkX25hbWVzW10gPSIpOworICAgIGZvciAoY29uc3QgYXV0byYgcCA6IG5hbWVfdG9fbnVtYmVyKSB7CisgICAgICBmb3JtYXQoIlxuICBcIiQxJFwiIiwgcC5maXJzdCk7CisgICAgfQorICAgIGZvcm1hdCgiO1xuXG4iKTsKKworICAgIGZvcm1hdCgKKyAgICAgICAgInN0YXRpYyBjb25zdCA6OiRwcm90b19ucyQ6OmludGVybmFsOjpFbnVtRW50cnkgJGNsYXNzbmFtZSRfZW50cmllc1tdICIKKyAgICAgICAgIj0ge1xuIik7CisgICAgaW50IGkgPSAwOworICAgIHN0ZDo6bWFwPGludCwgaW50PiBudW1iZXJfdG9faW5kZXg7CisgICAgaW50IGRhdGFfaW5kZXggPSAwOworICAgIGZvciAoY29uc3QgYXV0byYgcCA6IG5hbWVfdG9fbnVtYmVyKSB7CisgICAgICBmb3JtYXQoIiAgeyB7JGNsYXNzbmFtZSRfbmFtZXMgKyAkMSQsICQyJH0sICQzJCB9LFxuIiwgZGF0YV9pbmRleCwKKyAgICAgICAgICAgICBwLmZpcnN0LnNpemUoKSwgcC5zZWNvbmQpOworICAgICAgaWYgKG51bWJlcl90b19jYW5vbmljYWxfbmFtZVtwLnNlY29uZF0gPT0gcC5maXJzdCkgeworICAgICAgICBudW1iZXJfdG9faW5kZXguZW1wbGFjZShwLnNlY29uZCwgaSk7CisgICAgICB9CisgICAgICArK2k7CisgICAgICBkYXRhX2luZGV4ICs9IHAuZmlyc3Quc2l6ZSgpOworICAgIH0KKworICAgIGZvcm1hdCgKKyAgICAgICAgIn07XG4iCisgICAgICAgICJcbiIKKyAgICAgICAgInN0YXRpYyBjb25zdCBpbnQgJGNsYXNzbmFtZSRfZW50cmllc19ieV9udW1iZXJbXSA9IHtcbiIpOworICAgIGZvciAoY29uc3QgYXV0byYgcCA6IG51bWJlcl90b19pbmRleCkgeworICAgICAgZm9ybWF0KCIgICQxJCwgLy8gJDIkIC0+ICQzJFxuIiwgcC5zZWNvbmQsIHAuZmlyc3QsCisgICAgICAgICAgICAgbnVtYmVyX3RvX2Nhbm9uaWNhbF9uYW1lW3AuZmlyc3RdKTsKKyAgICB9CisgICAgZm9ybWF0KAorICAgICAgICAifTtcbiIKKyAgICAgICAgIlxuIik7CisKKyAgICBmb3JtYXQoCisgICAgICAgICJjb25zdCBzdGQ6OnN0cmluZyYgJGNsYXNzbmFtZSRfTmFtZShcbiIKKyAgICAgICAgIiAgICAkY2xhc3NuYW1lJCB2YWx1ZSkge1xuIgorICAgICAgICAiICBzdGF0aWMgY29uc3QgYm9vbCBkdW1teSA9XG4iCisgICAgICAgICIgICAgICA6OiRwcm90b19ucyQ6OmludGVybmFsOjpJbml0aWFsaXplRW51bVN0cmluZ3MoXG4iCisgICAgICAgICIgICAgICAgICAgJGNsYXNzbmFtZSRfZW50cmllcyxcbiIKKyAgICAgICAgIiAgICAgICAgICAkY2xhc3NuYW1lJF9lbnRyaWVzX2J5X251bWJlcixcbiIKKyAgICAgICAgIiAgICAgICAgICAkMSQsICRjbGFzc25hbWUkX3N0cmluZ3MpO1xuIgorICAgICAgICAiICAodm9pZCkgZHVtbXk7XG4iCisgICAgICAgICIgIGludCBpZHggPSA6OiRwcm90b19ucyQ6OmludGVybmFsOjpMb29rVXBFbnVtTmFtZShcbiIKKyAgICAgICAgIiAgICAgICRjbGFzc25hbWUkX2VudHJpZXMsXG4iCisgICAgICAgICIgICAgICAkY2xhc3NuYW1lJF9lbnRyaWVzX2J5X251bWJlcixcbiIKKyAgICAgICAgIiAgICAgICQxJCwgdmFsdWUpO1xuIgorICAgICAgICAiICByZXR1cm4gaWR4ID09IC0xID8gOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcoKSA6XG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAkY2xhc3NuYW1lJF9zdHJpbmdzW2lkeF0uZ2V0KCk7XG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICBDb3VudFVuaXF1ZVZhbHVlcyhkZXNjcmlwdG9yXykpOworICAgIGZvcm1hdCgKKyAgICAgICAgImJvb2wgJGNsYXNzbmFtZSRfUGFyc2UoXG4iCisgICAgICAgICIgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkNvbnN0U3RyaW5nUGFyYW0gbmFtZSwgJGNsYXNzbmFtZSQqICIKKyAgICAgICAgInZhbHVlKSAiCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIGludCBpbnRfdmFsdWU7XG4iCisgICAgICAgICIgIGJvb2wgc3VjY2VzcyA9IDo6JHByb3RvX25zJDo6aW50ZXJuYWw6Okxvb2tVcEVudW1WYWx1ZShcbiIKKyAgICAgICAgIiAgICAgICRjbGFzc25hbWUkX2VudHJpZXMsICQxJCwgbmFtZSwgJmludF92YWx1ZSk7XG4iCisgICAgICAgICIgIGlmIChzdWNjZXNzKSB7XG4iCisgICAgICAgICIgICAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8JGNsYXNzbmFtZSQ+KGludF92YWx1ZSk7XG4iCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIiAgcmV0dXJuIHN1Y2Nlc3M7XG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKSk7CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpICE9IG51bGxwdHIpIHsKKyAgICBzdGQ6OnN0cmluZyBwYXJlbnQgPSBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpLCBmYWxzZSk7CisgICAgLy8gQmVmb3JlIEMrKzE3LCB3ZSBtdXN0IGRlZmluZSB0aGUgc3RhdGljIGNvbnN0YW50cyB3aGljaCB3ZXJlCisgICAgLy8gZGVjbGFyZWQgaW4gdGhlIGhlYWRlciwgdG8gZ2l2ZSB0aGUgbGlua2VyIGEgcGxhY2UgdG8gcHV0IHRoZW0uCisgICAgLy8gQnV0IE1TVkMrKyBwcmUtMjAxNSBhbmQgcG9zdC0yMDE3ICh2ZXJzaW9uIDE1LjUrKSBpbnNpc3RzIHRoYXQgd2Ugbm90LgorICAgIGZvcm1hdCgKKyAgICAgICAgIiNpZiAoX19jcGx1c3BsdXMgPCAyMDE3MDMpICYmICIKKyAgICAgICAgIighZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDE5MDAgJiYgX01TQ19WRVIgPCAxOTEyKSlcbiIpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKTsgaSsrKSB7CisgICAgICBmb3JtYXQoImNvbnN0ZXhwciAkY2xhc3NuYW1lJCAkMSQ6OiQyJDtcbiIsIHBhcmVudCwKKyAgICAgICAgICAgICBFbnVtVmFsdWVOYW1lKGRlc2NyaXB0b3JfLT52YWx1ZShpKSkpOworICAgIH0KKyAgICBmb3JtYXQoCisgICAgICAgICJjb25zdGV4cHIgJGNsYXNzbmFtZSQgJDEkOjokbmVzdGVkX25hbWUkX01JTjtcbiIKKyAgICAgICAgImNvbnN0ZXhwciAkY2xhc3NuYW1lJCAkMSQ6OiRuZXN0ZWRfbmFtZSRfTUFYO1xuIiwKKyAgICAgICAgcGFyZW50KTsKKyAgICBpZiAoZ2VuZXJhdGVfYXJyYXlfc2l6ZV8pIHsKKyAgICAgIGZvcm1hdCgiY29uc3RleHByIGludCAkMSQ6OiRuZXN0ZWRfbmFtZSRfQVJSQVlTSVpFO1xuIiwgcGFyZW50KTsKKyAgICB9CisKKyAgICBmb3JtYXQoCisgICAgICAgICIjZW5kaWYgIC8vIChfX2NwbHVzcGx1cyA8IDIwMTcwMykgJiYgIgorICAgICAgICAiKCFkZWZpbmVkKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPj0gMTkwMCAmJiBfTVNDX1ZFUiA8IDE5MTIpKVxuIik7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2VudW0uaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2VudW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTBkNGZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZW51bS5oCkBAIC0wLDAgKzEsMTA2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9FTlVNX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0VOVU1fSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9vcHRpb25zLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CitjbGFzcyBQcmludGVyOyAgLy8gcHJpbnRlci5oCit9Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBFbnVtR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIC8vIFNlZSBnZW5lcmF0b3IuY2MgZm9yIHRoZSBtZWFuaW5nIG9mIGRsbGV4cG9ydF9kZWNsLgorICBFbnVtR2VuZXJhdG9yKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHZhcnMsCisgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisgIH5FbnVtR2VuZXJhdG9yKCk7CisKKyAgLy8gR2VuZXJhdGUgaGVhZGVyIGNvZGUgZGVmaW5pbmcgdGhlIGVudW0uICBUaGlzIGNvZGUgc2hvdWxkIGJlIHBsYWNlZAorICAvLyB3aXRoaW4gdGhlIGVudW0ncyBwYWNrYWdlIG5hbWVzcGFjZSwgYnV0IE5PVCB3aXRoaW4gYW55IGNsYXNzLCBldmVuIGZvcgorICAvLyBuZXN0ZWQgZW51bXMuCisgIHZvaWQgR2VuZXJhdGVEZWZpbml0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBzcGVjaWFsaXphdGlvbiBvZiBHZXRFbnVtRGVzY3JpcHRvcjxNeUVudW0+KCkuCisgIC8vIFByZWNvbmRpdGlvbjogaW4gOjpnb29nbGU6OnByb3RvYnVmIG5hbWVzcGFjZS4KKyAgdm9pZCBHZW5lcmF0ZUdldEVudW1EZXNjcmlwdG9yU3BlY2lhbGl6YXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBGb3IgZW51bXMgbmVzdGVkIHdpdGhpbiBhIG1lc3NhZ2UsIGdlbmVyYXRlIGNvZGUgdG8gaW1wb3J0IGFsbCB0aGUgZW51bSdzCisgIC8vIHN5bWJvbHMgKGUuZy4gdGhlIGVudW0gdHlwZSBuYW1lLCBhbGwgaXRzIHZhbHVlcywgZXRjLikgaW50byB0aGUgY2xhc3MncworICAvLyBuYW1lc3BhY2UuICBUaGlzIHNob3VsZCBiZSBwbGFjZWQgaW5zaWRlIHRoZSBjbGFzcyBkZWZpbml0aW9uIGluIHRoZQorICAvLyBoZWFkZXIuCisgIHZvaWQgR2VuZXJhdGVTeW1ib2xJbXBvcnRzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworICAvLyBTb3VyY2UgZmlsZSBzdHVmZi4KKworICAvLyBHZW5lcmF0ZSBub24taW5saW5lIG1ldGhvZHMgcmVsYXRlZCB0byB0aGUgZW51bSwgc3VjaCBhcyBJc1ZhbGlkVmFsdWUoKS4KKyAgLy8gR29lcyBpbiB0aGUgLmNjIGZpbGUuIEVudW1EZXNjcmlwdG9ycyBhcmUgc3RvcmVkIGluIGFuIGFycmF5LCBpZHggaXMKKyAgLy8gdGhlIGluZGV4IGluIHRoaXMgYXJyYXkgdGhhdCBjb3JyZXNwb25kcyB3aXRoIHRoaXMgZW51bS4KKyAgdm9pZCBHZW5lcmF0ZU1ldGhvZHMoaW50IGlkeCwgaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgcHJpdmF0ZToKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBjb25zdCBzdGQ6OnN0cmluZyBjbGFzc25hbWVfOworICBjb25zdCBPcHRpb25zJiBvcHRpb25zXzsKKyAgLy8gd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgKl9BUlJBWVNJWkUgY29uc3RhbnQuCisgIGNvbnN0IGJvb2wgZ2VuZXJhdGVfYXJyYXlfc2l6ZV87CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJpYWJsZXNfOworCisgIGZyaWVuZCBjbGFzcyBGaWxlR2VuZXJhdG9yOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRW51bUdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRU5VTV9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2VudW1fZmllbGQuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9lbnVtX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZmI2OTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9lbnVtX2ZpZWxkLmNjCkBAIC0wLDAgKzEsNDUxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2VudW1fZmllbGQuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworbmFtZXNwYWNlIHsKKwordm9pZCBTZXRFbnVtVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhkZXNjcmlwdG9yLCB2YXJpYWJsZXMsIG9wdGlvbnMpOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBkZWZhdWx0X3ZhbHVlID0gZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV9lbnVtKCk7CisgICgqdmFyaWFibGVzKVsidHlwZSJdID0gUXVhbGlmaWVkQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPmVudW1fdHlwZSgpLCBvcHRpb25zKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBJbnQzMlRvU3RyaW5nKGRlZmF1bHRfdmFsdWUtPm51bWJlcigpKTsKKyAgKCp2YXJpYWJsZXMpWyJmdWxsX25hbWUiXSA9IGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpOworICAoKnZhcmlhYmxlcylbImNhY2hlZF9ieXRlX3NpemVfbmFtZSJdID0gTWFrZVZhcmludENhY2hlZFNpemVOYW1lKGRlc2NyaXB0b3IpOworICBib29sIGNvbGQgPSBTaG91bGRTcGxpdChkZXNjcmlwdG9yLCBvcHRpb25zKTsKKyAgKCp2YXJpYWJsZXMpWyJjYWNoZWRfYnl0ZV9zaXplX2ZpZWxkIl0gPQorICAgICAgTWFrZVZhcmludENhY2hlZFNpemVGaWVsZE5hbWUoZGVzY3JpcHRvciwgY29sZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0VudW1GaWVsZEdlbmVyYXRvcjo6RW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgICAgOiBGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBvcHRpb25zKSB7CisgIFNldEVudW1WYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18sIG9wdGlvbnMpOworfQorCitFbnVtRmllbGRHZW5lcmF0b3I6On5FbnVtRmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoImludCAkbmFtZSRfO1xuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJCR0eXBlJCAkezEkJG5hbWUkJH0kKCkgY29uc3Q7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkICR7MSRzZXRfJG5hbWUkJH0kKCR0eXBlJCB2YWx1ZSk7XG4iCisgICAgICAicHJpdmF0ZTpcbiIKKyAgICAgICIkdHlwZSQgJHsxJF9pbnRlcm5hbF8kbmFtZSQkfSQoKSBjb25zdDtcbiIKKyAgICAgICJ2b2lkICR7MSRfaW50ZXJuYWxfc2V0XyRuYW1lJCR9JCgkdHlwZSQgdmFsdWUpO1xuIgorICAgICAgInB1YmxpYzpcbiIsCisgICAgICBkZXNjcmlwdG9yXyk7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgImlubGluZSAkdHlwZSQgJGNsYXNzbmFtZSQ6Ol9pbnRlcm5hbF8kbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAiICByZXR1cm4gc3RhdGljX2Nhc3Q8ICR0eXBlJCA+KCRmaWVsZCQpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgJHR5cGUkICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAiJGFubm90YXRlX2dldCQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgcmV0dXJuIF9pbnRlcm5hbF8kbmFtZSQoKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6Ol9pbnRlcm5hbF9zZXRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIik7CisgIGlmICghSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKGRlc2NyaXB0b3JfKSkgeworICAgIGZvcm1hdCgiICBhc3NlcnQoJHR5cGUkX0lzVmFsaWQodmFsdWUpKTtcbiIpOworICB9CisgIGZvcm1hdCgKKyAgICAgICIgICRzZXRfaGFzYml0JFxuIgorICAgICAgIiAgJGZpZWxkJCA9IHZhbHVlO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICIkbWF5YmVfcHJlcGFyZV9zcGxpdF9tZXNzYWdlJCIKKyAgICAgICIgIF9pbnRlcm5hbF9zZXRfJG5hbWUkKHZhbHVlKTtcbiIKKyAgICAgICIkYW5ub3RhdGVfc2V0JCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIiRmaWVsZCQgPSAkZGVmYXVsdCQ7XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCJfdGhpcy0+X2ludGVybmFsX3NldF8kbmFtZSQoZnJvbS5faW50ZXJuYWxfJG5hbWUkKCkpO1xuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoInN3YXAoJGZpZWxkJCwgb3RoZXItPiRmaWVsZCQpO1xuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCJfdGhpcy0+JGZpZWxkJCA9IGZyb20uJGZpZWxkJDtcbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgKKyAgICAgICJ0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7XG4iCisgICAgICAidGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheShcbiIKKyAgICAgICIgICRudW1iZXIkLCB0aGlzLT5faW50ZXJuYWxfJG5hbWUkKCksIHRhcmdldCk7XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgInRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCArXG4iCisgICAgICAiICA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5faW50ZXJuYWxfJG5hbWUkKCkpO1xuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNvbnN0ZXhwckFnZ3JlZ2F0ZUluaXRpYWxpemVyKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgiLypkZWNsdHlwZSgkZmllbGQkKSovJGRlZmF1bHQkIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUFnZ3JlZ2F0ZUluaXRpYWxpemVyKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChTaG91bGRTcGxpdChkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KCJkZWNsdHlwZShJbXBsXzo6U3BsaXQ6OiRuYW1lJF8peyRkZWZhdWx0JH0iKTsKKyAgICByZXR1cm47CisgIH0KKyAgZm9ybWF0KCJkZWNsdHlwZSgkZmllbGQkKXskZGVmYXVsdCR9Iik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNvcHlBZ2dyZWdhdGVJbml0aWFsaXplcigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoImRlY2x0eXBlKCRmaWVsZCQpe30iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcjo6RW51bU9uZW9mRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogRW51bUZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IsIG9wdGlvbnMpIHsKKyAgU2V0Q29tbW9uT25lb2ZGaWVsZFZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7Cit9CisKK0VudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjp+RW51bU9uZW9mRmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgImlubGluZSAkdHlwZSQgJGNsYXNzbmFtZSQ6Ol9pbnRlcm5hbF8kbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAiICBpZiAoX2ludGVybmFsX2hhc18kbmFtZSQoKSkge1xuIgorICAgICAgIiAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ICR0eXBlJCA+KCRmaWVsZCQpO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgcmV0dXJuIHN0YXRpY19jYXN0PCAkdHlwZSQgPigkZGVmYXVsdCQpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgJHR5cGUkICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAiJGFubm90YXRlX2dldCQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgcmV0dXJuIF9pbnRlcm5hbF8kbmFtZSQoKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6Ol9pbnRlcm5hbF9zZXRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIik7CisgIGlmICghSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKGRlc2NyaXB0b3JfKSkgeworICAgIGZvcm1hdCgiICBhc3NlcnQoJHR5cGUkX0lzVmFsaWQodmFsdWUpKTtcbiIpOworICB9CisgIGZvcm1hdCgKKyAgICAgICIgIGlmICghX2ludGVybmFsX2hhc18kbmFtZSQoKSkge1xuIgorICAgICAgIiAgICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAgICIgICAgc2V0X2hhc18kbmFtZSQoKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgICRmaWVsZCQgPSB2YWx1ZTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAiICBfaW50ZXJuYWxfc2V0XyRuYW1lJCh2YWx1ZSk7XG4iCisgICAgICAiJGFubm90YXRlX3NldCQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIn1cbiIpOworfQorCit2b2lkIEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIiRmaWVsZCQgPSAkZGVmYXVsdCQ7XG4iKTsKK30KKwordm9pZCBFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gRG9uJ3QgcHJpbnQgYW55IHN3YXBwaW5nIGNvZGUuIFN3YXBwaW5nIHRoZSB1bmlvbiB3aWxsIHN3YXAgdGhpcyBmaWVsZC4KK30KKwordm9pZCBFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCIkbnMkOjpfJGNsYXNzbmFtZSRfZGVmYXVsdF9pbnN0YW5jZV8uJGZpZWxkJCA9ICRkZWZhdWx0JDtcbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgICAgOiBGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBvcHRpb25zKSB7CisgIFNldEVudW1WYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18sIG9wdGlvbnMpOworfQorCitSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQcml2YXRlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIjo6JHByb3RvX25zJDo6UmVwZWF0ZWRGaWVsZDxpbnQ+ICRuYW1lJF87XG4iKTsKKyAgaWYgKGRlc2NyaXB0b3JfLT5pc19wYWNrZWQoKSAmJgorICAgICAgSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoIm11dGFibGUgc3RkOjphdG9taWM8aW50PiAkY2FjaGVkX2J5dGVfc2l6ZV9uYW1lJDtcbiIpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgInByaXZhdGU6XG4iCisgICAgICAiJHR5cGUkICR7MSRfaW50ZXJuYWxfJG5hbWUkJH0kKGludCBpbmRleCkgY29uc3Q7XG4iCisgICAgICAidm9pZCAkezEkX2ludGVybmFsX2FkZF8kbmFtZSQkfSQoJHR5cGUkIHZhbHVlKTtcbiIKKyAgICAgICI6OiRwcm90b19ucyQ6OlJlcGVhdGVkRmllbGQ8aW50PiogIgorICAgICAgIiR7MSRfaW50ZXJuYWxfbXV0YWJsZV8kbmFtZSQkfSQoKTtcbiIKKyAgICAgICJwdWJsaWM6XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciQkdHlwZSQgJHsxJCRuYW1lJCR9JChpbnQgaW5kZXgpIGNvbnN0O1xuIgorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCAkezEkc2V0XyRuYW1lJCR9JChpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSk7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkICR7MSRhZGRfJG5hbWUkJH0kKCR0eXBlJCB2YWx1ZSk7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciRjb25zdCA6OiRwcm90b19ucyQ6OlJlcGVhdGVkRmllbGQ8aW50PiYgIgorICAgICAgIiR7MSQkbmFtZSQkfSQoKSBjb25zdDtcbiIKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJDo6JHByb3RvX25zJDo6UmVwZWF0ZWRGaWVsZDxpbnQ+KiAiCisgICAgICAiJHsxJG11dGFibGVfJG5hbWUkJH0kKCk7XG4iLAorICAgICAgZGVzY3JpcHRvcl8pOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgImlubGluZSAkdHlwZSQgJGNsYXNzbmFtZSQ6Ol9pbnRlcm5hbF8kbmFtZSQoaW50IGluZGV4KSBjb25zdCB7XG4iCisgICAgICAiICByZXR1cm4gc3RhdGljX2Nhc3Q8ICR0eXBlJCA+KCRmaWVsZCQuR2V0KGluZGV4KSk7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSAkdHlwZSQgJGNsYXNzbmFtZSQ6OiRuYW1lJChpbnQgaW5kZXgpIGNvbnN0IHtcbiIKKyAgICAgICIkYW5ub3RhdGVfZ2V0JCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gX2ludGVybmFsXyRuYW1lJChpbmRleCk7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iKTsKKyAgaWYgKCFIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoZGVzY3JpcHRvcl8pKSB7CisgICAgZm9ybWF0KCIgIGFzc2VydCgkdHlwZSRfSXNWYWxpZCh2YWx1ZSkpO1xuIik7CisgIH0KKyAgZm9ybWF0KAorICAgICAgIiAgJGZpZWxkJC5TZXQoaW5kZXgsIHZhbHVlKTtcbiIKKyAgICAgICIkYW5ub3RhdGVfc2V0JCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpfaW50ZXJuYWxfYWRkXyRuYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIpOworICBpZiAoIUhhc1ByZXNlcnZpbmdVbmtub3duRW51bVNlbWFudGljcyhkZXNjcmlwdG9yXykpIHsKKyAgICBmb3JtYXQoIiAgYXNzZXJ0KCR0eXBlJF9Jc1ZhbGlkKHZhbHVlKSk7XG4iKTsKKyAgfQorICBmb3JtYXQoCisgICAgICAiICAkZmllbGQkLkFkZCh2YWx1ZSk7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjphZGRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICAgIiAgX2ludGVybmFsX2FkZF8kbmFtZSQodmFsdWUpO1xuIgorICAgICAgIiRhbm5vdGF0ZV9hZGQkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDokZnVsbF9uYW1lJClcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIGNvbnN0IDo6JHByb3RvX25zJDo6UmVwZWF0ZWRGaWVsZDxpbnQ+JlxuIgorICAgICAgIiRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAiJGFubm90YXRlX2xpc3QkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gJGZpZWxkJDtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIDo6JHByb3RvX25zJDo6UmVwZWF0ZWRGaWVsZDxpbnQ+KlxuIgorICAgICAgIiRjbGFzc25hbWUkOjpfaW50ZXJuYWxfbXV0YWJsZV8kbmFtZSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gJiRmaWVsZCQ7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSA6OiRwcm90b19ucyQ6OlJlcGVhdGVkRmllbGQ8aW50PipcbiIKKyAgICAgICIkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoKSB7XG4iCisgICAgICAiJGFubm90YXRlX211dGFibGVfbGlzdCQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgcmV0dXJuIF9pbnRlcm5hbF9tdXRhYmxlXyRuYW1lJCgpO1xuIgorICAgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNsZWFyaW5nQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIiRmaWVsZCQuQ2xlYXIoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgiX3RoaXMtPiRmaWVsZCQuTWVyZ2VGcm9tKGZyb20uJGZpZWxkJCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTd2FwcGluZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCIkZmllbGQkLkludGVybmFsU3dhcCgmb3RoZXItPiRmaWVsZCQpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIE5vdCBuZWVkZWQgZm9yIHJlcGVhdGVkIGZpZWxkcy4KK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVEZXN0cnVjdG9yQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIiRmaWVsZCQuflJlcGVhdGVkRmllbGQoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgaWYgKGRlc2NyaXB0b3JfLT5pc19wYWNrZWQoKSkgeworICAgIC8vIFdyaXRlIHRoZSB0YWcgYW5kIHRoZSBzaXplLgorICAgIGZvcm1hdCgKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgaW50IGJ5dGVfc2l6ZSA9ICIKKyAgICAgICAgIiRjYWNoZWRfYnl0ZV9zaXplX2ZpZWxkJC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpO1xuIgorICAgICAgICAiICBpZiAoYnl0ZV9zaXplID4gMCkge1xuIgorICAgICAgICAiICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVFbnVtUGFja2VkKFxuIgorICAgICAgICAiICAgICAgICAkbnVtYmVyJCwgJGZpZWxkJCwgYnl0ZV9zaXplLCB0YXJnZXQpO1xuIgorICAgICAgICAiICB9XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJmb3IgKGludCBpID0gMCwgbiA9IHRoaXMtPl9pbnRlcm5hbF8kbmFtZSRfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7XG4iCisgICAgICAgICIgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTtcbiIKKyAgICAgICAgIiAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheShcbiIKKyAgICAgICAgIiAgICAgICRudW1iZXIkLCB0aGlzLT5faW50ZXJuYWxfJG5hbWUkKGkpLCB0YXJnZXQpO1xuIgorICAgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoCisgICAgICAie1xuIgorICAgICAgIiAgc2l6ZV90IGRhdGFfc2l6ZSA9IDA7XG4iCisgICAgICAiICB1bnNpZ25lZCBpbnQgY291bnQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCAiCisgICAgICAiaW50Pih0aGlzLT5faW50ZXJuYWxfJG5hbWUkX3NpemUoKSk7Iik7CisgIGZvcm1hdC5JbmRlbnQoKTsKKyAgZm9ybWF0KAorICAgICAgImZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuIgorICAgICAgIiAgZGF0YV9zaXplICs9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKFxuIgorICAgICAgIiAgICB0aGlzLT5faW50ZXJuYWxfJG5hbWUkKHN0YXRpY19jYXN0PGludD4oaSkpKTtcbiIKKyAgICAgICJ9XG4iKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiaWYgKGRhdGFfc2l6ZSA+IDApIHtcbiIKKyAgICAgICAgIiAgdG90YWxfc2l6ZSArPSAkdGFnX3NpemUkICtcbiIKKyAgICAgICAgIiAgICAiCisgICAgICAgICI6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoc3RhdGljX2Nhc3Q8JGludDMyJD4oZGF0YV9zaXplKSk7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJpbnQgY2FjaGVkX3NpemUgPSA6Ol9wYmk6OlRvQ2FjaGVkU2l6ZShkYXRhX3NpemUpO1xuIgorICAgICAgICAiJGNhY2hlZF9ieXRlX3NpemVfZmllbGQkLnN0b3JlKGNhY2hlZF9zaXplLFxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTtcbiIKKyAgICAgICAgInRvdGFsX3NpemUgKz0gZGF0YV9zaXplO1xuIik7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KCJ0b3RhbF9zaXplICs9ICgkdGFnX3NpemUkVUwgKiBjb3VudCkgKyBkYXRhX3NpemU7XG4iKTsKKyAgfQorICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNvbnN0ZXhwckFnZ3JlZ2F0ZUluaXRpYWxpemVyKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgiLypkZWNsdHlwZSgkZmllbGQkKSove30iKTsKKyAgaWYgKGRlc2NyaXB0b3JfLT5pc19wYWNrZWQoKSAmJgorICAgICAgSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoIlxuLCAvKmRlY2x0eXBlKCRjYWNoZWRfYnl0ZV9zaXplX2ZpZWxkJCkqL3swfSIpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQWdncmVnYXRlSW5pdGlhbGl6ZXIoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCJkZWNsdHlwZSgkZmllbGQkKXthcmVuYX0iKTsKKyAgaWYgKGRlc2NyaXB0b3JfLT5pc19wYWNrZWQoKSAmJgorICAgICAgSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAvLyBzdGQ6OmF0b21pYyBoYXMgbm8gY29weSBjb25zdHJ1Y3Rvciwgd2hpY2ggcHJldmVudHMgZXhwbGljaXQgYWdncmVnYXRlCisgICAgLy8gaW5pdGlhbGl6YXRpb24gcHJlLUMrKzE3LgorICAgIGZvcm1hdCgiXG4sIC8qZGVjbHR5cGUoJGNhY2hlZF9ieXRlX3NpemVfZmllbGQkKSovezB9Iik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDb3B5QWdncmVnYXRlSW5pdGlhbGl6ZXIoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCJkZWNsdHlwZSgkZmllbGQkKXtmcm9tLiRmaWVsZCR9Iik7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkgJiYKKyAgICAgIEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgLy8gc3RkOjphdG9taWMgaGFzIG5vIGNvcHkgY29uc3RydWN0b3IuCisgICAgZm9ybWF0KCJcbiwgLypkZWNsdHlwZSgkY2FjaGVkX2J5dGVfc2l6ZV9maWVsZCQpKi97MH0iKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZW51bV9maWVsZC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZW51bV9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYmFlODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9lbnVtX2ZpZWxkLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0VOVU1fRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRU5VTV9GSUVMRF9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworY2xhc3MgRW51bUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICB+RW51bUZpZWxkR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlIHt9CisgIHZvaWQgR2VuZXJhdGVDb3B5Q29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDb25zdGV4cHJBZ2dyZWdhdGVJbml0aWFsaXplcigKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUFnZ3JlZ2F0ZUluaXRpYWxpemVyKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUNvcHlBZ2dyZWdhdGVJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRW51bUZpZWxkR2VuZXJhdG9yKTsKK307CisKK2NsYXNzIEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yIDogcHVibGljIEVudW1GaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICB+RW51bU9uZW9mRmllbGRHZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRW51bU9uZW9mRmllbGRHZW5lcmF0b3IpOworfTsKKworY2xhc3MgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKyAgflJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ29weUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogIC8qcHJpbnRlciovKSBjb25zdCBvdmVycmlkZSB7CisgICAgR09PR0xFX0NIRUNLKCFTaG91bGRTcGxpdChkZXNjcmlwdG9yXywgb3B0aW9uc18pKTsKKyAgfQorICB2b2lkIEdlbmVyYXRlRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0ZXhwckFnZ3JlZ2F0ZUluaXRpYWxpemVyKAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQWdncmVnYXRlSW5pdGlhbGl6ZXIoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ29weUFnZ3JlZ2F0ZUluaXRpYWxpemVyKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRU5VTV9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2V4dGVuc2lvbi5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2V4dGVuc2lvbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTBlZDllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZXh0ZW5zaW9uLmNjCkBAIC0wLDAgKzEsMTkzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2V4dGVuc2lvbi5oPgorCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworRXh0ZW5zaW9uR2VuZXJhdG9yOjpFeHRlbnNpb25HZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG9wdGlvbnNfKG9wdGlvbnMpLCBzY2NfYW5hbHl6ZXJfKHNjY19hbmFseXplcikgeworICAvLyBDb25zdHJ1Y3QgdHlwZV90cmFpdHNfLgorICBpZiAoZGVzY3JpcHRvcl8tPmlzX3JlcGVhdGVkKCkpIHsKKyAgICB0eXBlX3RyYWl0c18gPSAiUmVwZWF0ZWQiOworICB9CisKKyAgc3dpdGNoIChkZXNjcmlwdG9yXy0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKCJFbnVtVHlwZVRyYWl0czwgIik7CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZW51bV90eXBlKCksIHRydWUpKTsKKyAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoIiwgIik7CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZW51bV90eXBlKCksIHRydWUpKTsKKyAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoIl9Jc1ZhbGlkPiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgdHlwZV90cmFpdHNfLmFwcGVuZCgiU3RyaW5nVHlwZVRyYWl0cyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoIk1lc3NhZ2VUeXBlVHJhaXRzPCAiKTsKKyAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSwgdHJ1ZSkpOworICAgICAgdHlwZV90cmFpdHNfLmFwcGVuZCgiID4iKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKCJQcmltaXRpdmVUeXBlVHJhaXRzPCAiKTsKKyAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoUHJpbWl0aXZlVHlwZU5hbWUob3B0aW9uc18sIGRlc2NyaXB0b3JfLT5jcHBfdHlwZSgpKSk7CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKCIgPiIpOworICAgICAgYnJlYWs7CisgIH0KKyAgU2V0Q29tbW9uVmFycyhvcHRpb25zLCAmdmFyaWFibGVzXyk7CisgIFNldENvbW1vbk1lc3NhZ2VEYXRhVmFyaWFibGVzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSwgJnZhcmlhYmxlc18pOworICB2YXJpYWJsZXNfWyJleHRlbmRlZSJdID0KKyAgICAgIFF1YWxpZmllZENsYXNzTmFtZShkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCksIG9wdGlvbnNfKTsKKyAgdmFyaWFibGVzX1sidHlwZV90cmFpdHMiXSA9IHR5cGVfdHJhaXRzXzsKKyAgc3RkOjpzdHJpbmcgbmFtZSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7CisgIHZhcmlhYmxlc19bIm5hbWUiXSA9IFJlc29sdmVLZXl3b3JkKG5hbWUpOworICB2YXJpYWJsZXNfWyJjb25zdGFudF9uYW1lIl0gPSBGaWVsZENvbnN0YW50TmFtZShkZXNjcmlwdG9yXyk7CisgIHZhcmlhYmxlc19bImZpZWxkX3R5cGUiXSA9CisgICAgICBTdHJDYXQoc3RhdGljX2Nhc3Q8aW50PihkZXNjcmlwdG9yXy0+dHlwZSgpKSk7CisgIHZhcmlhYmxlc19bInBhY2tlZCJdID0gZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpID8gInRydWUiIDogImZhbHNlIjsKKworICBzdGQ6OnN0cmluZyBzY29wZSA9CisgICAgICBJc1Njb3BlZCgpID8gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSwgZmFsc2UpICsgIjo6IiA6ICIiOworICB2YXJpYWJsZXNfWyJzY29wZSJdID0gc2NvcGU7CisgIHZhcmlhYmxlc19bInNjb3BlZF9uYW1lIl0gPSBFeHRlbnNpb25OYW1lKGRlc2NyaXB0b3JfKTsKKyAgdmFyaWFibGVzX1sibnVtYmVyIl0gPSBTdHJDYXQoZGVzY3JpcHRvcl8tPm51bWJlcigpKTsKKworICBib29sIGFkZF92ZXJpZnlfZm4gPQorICAgICAgLy8gT25seSB2ZXJpZnkgbXNncy4KKyAgICAgIGRlc2NyaXB0b3JfLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFICYmCisgICAgICAvLyBPcHRpb25zIHNheSB0byB2ZXJpZnkuCisgICAgICBTaG91bGRWZXJpZnkoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpLCBvcHRpb25zXywgc2NjX2FuYWx5emVyXykgJiYKKyAgICAgIFNob3VsZFZlcmlmeShkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCksIG9wdGlvbnNfLCBzY2NfYW5hbHl6ZXJfKTsKKworICB2YXJpYWJsZXNfWyJ2ZXJpZnlfZm4iXSA9CisgICAgICBhZGRfdmVyaWZ5X2ZuCisgICAgICAgICAgPyBTdHJDYXQoIiYiLCBGaWVsZE1lc3NhZ2VUeXBlTmFtZShkZXNjcmlwdG9yXywgb3B0aW9uc18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICI6OkludGVybmFsVmVyaWZ5IikKKyAgICAgICAgICA6ICJudWxscHRyIjsKK30KKworRXh0ZW5zaW9uR2VuZXJhdG9yOjp+RXh0ZW5zaW9uR2VuZXJhdG9yKCkge30KKworYm9vbCBFeHRlbnNpb25HZW5lcmF0b3I6OklzU2NvcGVkKCkgY29uc3QgeworICByZXR1cm4gZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9zY29wZSgpICE9IG51bGxwdHI7Cit9CisKK3ZvaWQgRXh0ZW5zaW9uR2VuZXJhdG9yOjpHZW5lcmF0ZURlY2xhcmF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisKKyAgLy8gSWYgdGhpcyBpcyBhIGNsYXNzIG1lbWJlciwgaXQgbmVlZHMgdG8gYmUgZGVjbGFyZWQgInN0YXRpYyIuICBPdGhlcndpc2UsCisgIC8vIGl0IG5lZWRzIHRvIGJlICJleHRlcm4iLiAgSW4gdGhlIGxhdHRlciBjYXNlLCBpdCBhbHNvIG5lZWRzIHRoZSBETEwKKyAgLy8gZXhwb3J0L2ltcG9ydCBzcGVjaWZpZXIuCisgIHN0ZDo6c3RyaW5nIHF1YWxpZmllcjsKKyAgaWYgKCFJc1Njb3BlZCgpKSB7CisgICAgcXVhbGlmaWVyID0gImV4dGVybiI7CisgICAgaWYgKCFvcHRpb25zXy5kbGxleHBvcnRfZGVjbC5lbXB0eSgpKSB7CisgICAgICBxdWFsaWZpZXIgPSBvcHRpb25zXy5kbGxleHBvcnRfZGVjbCArICIgIiArIHF1YWxpZmllcjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcXVhbGlmaWVyID0gInN0YXRpYyI7CisgIH0KKworICBmb3JtYXQoCisgICAgICAic3RhdGljIGNvbnN0IGludCAkY29uc3RhbnRfbmFtZSQgPSAkbnVtYmVyJDtcbiIKKyAgICAgICIkMSQgOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwgJGV4dGVuZGVlJCxcbiIKKyAgICAgICIgICAgOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6JHR5cGVfdHJhaXRzJCwgJGZpZWxkX3R5cGUkLCAkcGFja2VkJCA+XG4iCisgICAgICAiICAkezIkJG5hbWUkJH0kO1xuIiwKKyAgICAgIHF1YWxpZmllciwgZGVzY3JpcHRvcl8pOworfQorCit2b2lkIEV4dGVuc2lvbkdlbmVyYXRvcjo6R2VuZXJhdGVEZWZpbml0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIElmIHdlIGFyZSBidWlsZGluZyBmb3IgbGl0ZSB3aXRoIGltcGxpY2l0IHdlYWsgZmllbGRzLCB3ZSB3YW50IHRvIHNraXAgb3ZlcgorICAvLyBhbnkgY3VzdG9tIG9wdGlvbnMgKGkuZS4gZXh0ZW5zaW9ucyBvZiBtZXNzYWdlcyBmcm9tIGRlc2NyaXB0b3IucHJvdG8pLgorICAvLyBUaGlzIHByZXZlbnRzIHRoZSBjcmVhdGlvbiBvZiBhbnkgdW5uZWNlc3NhcnkgbGlua2VyIHJlZmVyZW5jZXMgdG8gdGhlCisgIC8vIGRlc2NyaXB0b3IgbWVzc2FnZXMuCisgIGlmIChvcHRpb25zXy5saXRlX2ltcGxpY2l0X3dlYWtfZmllbGRzICYmCisgICAgICBkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCktPmZpbGUoKS0+bmFtZSgpID09CisgICAgICAgICAgIm5ldC9wcm90bzIvcHJvdG8vZGVzY3JpcHRvci5wcm90byIpIHsKKyAgICByZXR1cm47CisgIH0KKworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBzdGQ6OnN0cmluZyBkZWZhdWx0X3N0cjsKKyAgLy8gSWYgdGhpcyBpcyBhIGNsYXNzIG1lbWJlciwgaXQgbmVlZHMgdG8gYmUgZGVjbGFyZWQgaW4gaXRzIGNsYXNzIHNjb3BlLgorICBpZiAoZGVzY3JpcHRvcl8tPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORykgeworICAgIC8vIFdlIG5lZWQgdG8gZGVjbGFyZSBhIGdsb2JhbCBzdHJpbmcgd2hpY2ggd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgIC8vIFdlIGNhbm5vdCBkZWNsYXJlIGl0IGF0IGNsYXNzIHNjb3BlIGJlY2F1c2UgdGhhdCB3b3VsZCByZXF1aXJlIGV4cG9zaW5nCisgICAgLy8gaXQgaW4gdGhlIGhlYWRlciB3aGljaCB3b3VsZCBiZSBhbm5veWluZyBmb3Igb3RoZXIgcmVhc29ucy4gIFNvIHdlCisgICAgLy8gcmVwbGFjZSA6OiB3aXRoIF8gaW4gdGhlIG5hbWUgYW5kIGRlY2xhcmUgaXQgYXMgYSBnbG9iYWwuCisgICAgZGVmYXVsdF9zdHIgPQorICAgICAgICBTdHJpbmdSZXBsYWNlKHZhcmlhYmxlc19bInNjb3BlZF9uYW1lIl0sICI6OiIsICJfIiwgdHJ1ZSkgKyAiX2RlZmF1bHQiOworICAgIGZvcm1hdCgiY29uc3Qgc3RkOjpzdHJpbmcgJDEkKCQyJCk7XG4iLCBkZWZhdWx0X3N0ciwKKyAgICAgICAgICAgRGVmYXVsdFZhbHVlKG9wdGlvbnNfLCBkZXNjcmlwdG9yXykpOworICB9IGVsc2UgaWYgKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSkgeworICAgIC8vIFdlIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSBmb3IgZXh0ZW5zaW9ucyBhdCByZWdpc3RyYXRpb24KKyAgICAvLyB0aW1lLgorICAgIGRlZmF1bHRfc3RyID0KKyAgICAgICAgRmllbGRNZXNzYWdlVHlwZU5hbWUoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSArICI6OmRlZmF1bHRfaW5zdGFuY2UoKSI7CisgIH0gZWxzZSB7CisgICAgZGVmYXVsdF9zdHIgPSBEZWZhdWx0VmFsdWUob3B0aW9uc18sIGRlc2NyaXB0b3JfKTsKKyAgfQorCisgIC8vIExpa2V3aXNlLCBjbGFzcyBtZW1iZXJzIG5lZWQgdG8gZGVjbGFyZSB0aGUgZmllbGQgY29uc3RhbnQgdmFyaWFibGUuCisgIGlmIChJc1Njb3BlZCgpKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPj0gMTkwMCAmJiBfTVNDX1ZFUiA8IDE5MTIpXG4iCisgICAgICAgICJjb25zdCBpbnQgJHNjb3BlJCRjb25zdGFudF9uYW1lJDtcbiIKKyAgICAgICAgIiNlbmRpZlxuIik7CisgIH0KKworICBmb3JtYXQoCisgICAgICAiUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkyICIKKyAgICAgICI6OiRwcm90b19ucyQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAkZXh0ZW5kZWUkLFxuIgorICAgICAgIiAgICA6OiRwcm90b19ucyQ6OmludGVybmFsOjokdHlwZV90cmFpdHMkLCAkZmllbGRfdHlwZSQsICRwYWNrZWQkPlxuIgorICAgICAgIiAgJHNjb3BlZF9uYW1lJCgkY29uc3RhbnRfbmFtZSQsICQxJCwgJHZlcmlmeV9mbiQpO1xuIiwKKyAgICAgIGRlZmF1bHRfc3RyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2V4dGVuc2lvbi5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZXh0ZW5zaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyOTMxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2V4dGVuc2lvbi5oCkBAIC0wLDAgKzEsOTUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0VYVEVOU0lPTl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9FWFRFTlNJT05fSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvb3B0aW9ucy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CitjbGFzcyBGaWVsZERlc2NyaXB0b3I7ICAvLyBkZXNjcmlwdG9yLmgKK25hbWVzcGFjZSBpbyB7CitjbGFzcyBQcmludGVyOyAgLy8gcHJpbnRlci5oCit9Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBNZXNzYWdlU0NDQW5hbHl6ZXI7CisKKy8vIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBleHRlbnNpb24sIHdoaWNoIG1heSBiZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHNvbWUKKy8vIG1lc3NhZ2Ugb3IgbWF5IGJlIGF0IGZpbGUgc2NvcGUuICBUaGlzIGlzIG11Y2ggc2ltcGxlciB0aGFuIEZpZWxkR2VuZXJhdG9yCisvLyBzaW5jZSBleHRlbnNpb25zIGFyZSBqdXN0IHNpbXBsZSBpZGVudGlmaWVycyB3aXRoIGludGVyZXN0aW5nIHR5cGVzLgorY2xhc3MgRXh0ZW5zaW9uR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIC8vIFNlZSBnZW5lcmF0b3IuY2MgZm9yIHRoZSBtZWFuaW5nIG9mIGRsbGV4cG9ydF9kZWNsLgorICBleHBsaWNpdCBFeHRlbnNpb25HZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKTsKKyAgfkV4dGVuc2lvbkdlbmVyYXRvcigpOworCisgIC8vIEhlYWRlciBzdHVmZi4KKyAgdm9pZCBHZW5lcmF0ZURlY2xhcmF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworICAvLyBTb3VyY2UgZmlsZSBzdHVmZi4KKyAgdm9pZCBHZW5lcmF0ZURlZmluaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIGJvb2wgSXNTY29wZWQoKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIHN0ZDo6c3RyaW5nIHR5cGVfdHJhaXRzXzsKKyAgT3B0aW9ucyBvcHRpb25zXzsKKyAgTWVzc2FnZVNDQ0FuYWx5emVyKiBzY2NfYW5hbHl6ZXJfOworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyaWFibGVzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRXh0ZW5zaW9uR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9NRVNTQUdFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmllbGQuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9maWVsZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGQyMDg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmllbGQuY2MKQEAgLTAsMCArMSw0MjEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmllbGQuaD4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3ByaW1pdGl2ZV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvc3RyaW5nX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2VudW1fZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21hcF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgTWF5U2V0QW5ub3RhdGlvblZhcmlhYmxlKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBhbm5vdGF0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBzdWJzdGl0dXRlX3RlbXBsYXRlX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIHByZXBhcmVkX3RlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX2luZGV4LCBTdHJpbmdQaWVjZSBhY2Nlc3NfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcykgeworICBpZiAob3B0aW9ucy5maWVsZF9saXN0ZW5lcl9vcHRpb25zLmZvcmJpZGRlbl9maWVsZF9saXN0ZW5lcl9ldmVudHMuY291bnQoCisgICAgICAgICAgc3RkOjpzdHJpbmcoYW5ub3RhdGlvbl9uYW1lKSkpCisgICAgcmV0dXJuOworICAoKnZhcmlhYmxlcylbU3RyQ2F0KCJhbm5vdGF0ZV8iLCBhbm5vdGF0aW9uX25hbWUpXSA9IHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICBTdHJDYXQoc3Vic3RpdHV0ZV90ZW1wbGF0ZV9wcmVmaXgsIHByZXBhcmVkX3RlbXBsYXRlLCAiKTtcbiIpLAorICAgICAgZmllbGRfaW5kZXgsIGFjY2Vzc190eXBlKTsKK30KKworc3RkOjpzdHJpbmcgR2VuZXJhdGVUZW1wbGF0ZUZvck9uZW9mU3RyaW5nKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBwcm90b19ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBmaWVsZF9tZW1iZXIpIHsKKyAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpjcHA6OkZpZWxkTmFtZShkZXNjcmlwdG9yKTsKKyAgc3RkOjpzdHJpbmcgZmllbGRfcG9pbnRlciA9CisgICAgICBkZXNjcmlwdG9yLT5vcHRpb25zKCkuY3R5cGUoKSA9PSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnM6OlNUUklORworICAgICAgICAgID8gIiQwLlVuc2FmZUdldFBvaW50ZXIoKSIKKyAgICAgICAgICA6ICIkMCI7CisKKyAgaWYgKGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKSkgeworICAgIHJldHVybiBzdHJpbmdzOjpTdWJzdGl0dXRlKFN0ckNhdCgiX2ludGVybmFsX2hhc18iLCBmaWVsZF9uYW1lLCAiKCkgPyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9wb2ludGVyLCAiOiBudWxscHRyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbWVtYmVyKTsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yLT5vcHRpb25zKCkuY3R5cGUoKSA9PSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnM6OlNUUklOR19QSUVDRSkgeworICAgIHJldHVybiBzdHJpbmdzOjpTdWJzdGl0dXRlKFN0ckNhdCgiX2ludGVybmFsX2hhc18iLCBmaWVsZF9uYW1lLCAiKCkgPyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9wb2ludGVyLCAiOiBudWxscHRyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbWVtYmVyKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGRlZmF1bHRfdmFsdWVfcG9pbnRlciA9CisgICAgICBkZXNjcmlwdG9yLT5vcHRpb25zKCkuY3R5cGUoKSA9PSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnM6OlNUUklORworICAgICAgICAgID8gIiYkMS5nZXQoKSIKKyAgICAgICAgICA6ICImJDEiOworICByZXR1cm4gc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgIFN0ckNhdCgiX2ludGVybmFsX2hhc18iLCBmaWVsZF9uYW1lLCAiKCkgPyAiLCBmaWVsZF9wb2ludGVyLCAiIDogIiwKKyAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlX3BvaW50ZXIpLAorICAgICAgZmllbGRfbWVtYmVyLCBNYWtlRGVmYXVsdEZpZWxkTmFtZShkZXNjcmlwdG9yKSk7Cit9CisKK3N0ZDo6c3RyaW5nIEdlbmVyYXRlVGVtcGxhdGVGb3JTaW5nbGVTdHJpbmcoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBmaWVsZF9tZW1iZXIpIHsKKyAgaWYgKGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKSkgeworICAgIHJldHVybiBTdHJDYXQoIiYiLCBmaWVsZF9tZW1iZXIpOworICB9CisKKyAgaWYgKGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5jdHlwZSgpID09IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uczo6U1RSSU5HKSB7CisgICAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICIkMC5Jc0RlZmF1bHQoKSA/ICYkMS5nZXQoKSA6ICQwLlVuc2FmZUdldFBvaW50ZXIoKSIsIGZpZWxkX21lbWJlciwKKyAgICAgICAgTWFrZURlZmF1bHRGaWVsZE5hbWUoZGVzY3JpcHRvcikpOworICB9CisKKyAgcmV0dXJuIFN0ckNhdCgiJiIsIGZpZWxkX21lbWJlcik7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIEFkZEFjY2Vzc29yQW5ub3RhdGlvbnMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzKSB7CisgIC8vIENhbiBiZSBleHBhbmRlZCB0byBpbmNsdWRlIG1vcmUgc3BlY2lmaWMgY2FsbHMsIGZvciBleGFtcGxlLCBmb3IgYXJlbmEgb3IKKyAgLy8gY2xlYXIgY2FsbHMuCisgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga0FjY2Vzc29yc0Fubm90YXRpb25zW10gPSB7CisgICAgICAiYW5ub3RhdGVfYWRkIiwgICAgICJhbm5vdGF0ZV9nZXQiLCAgICAgICAgICJhbm5vdGF0ZV9oYXMiLAorICAgICAgImFubm90YXRlX2xpc3QiLCAgICAiYW5ub3RhdGVfbXV0YWJsZSIsICAgICAiYW5ub3RhdGVfbXV0YWJsZV9saXN0IiwKKyAgICAgICJhbm5vdGF0ZV9yZWxlYXNlIiwgImFubm90YXRlX3NldCIsICAgICAgICAgImFubm90YXRlX3NpemUiLAorICAgICAgImFubm90YXRlX2NsZWFyIiwgICAiYW5ub3RhdGVfYWRkX211dGFibGUiLAorICB9OworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEdPT0dMRV9BUlJBWVNJWkUoa0FjY2Vzc29yc0Fubm90YXRpb25zKTsgKytpKSB7CisgICAgKCp2YXJpYWJsZXMpW2tBY2Nlc3NvcnNBbm5vdGF0aW9uc1tpXV0gPSAiIjsKKyAgfQorICBpZiAob3B0aW9ucy5hbm5vdGF0ZV9hY2Nlc3NvcikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShrQWNjZXNzb3JzQW5ub3RhdGlvbnMpOyArK2kpIHsKKyAgICAgICgqdmFyaWFibGVzKVtrQWNjZXNzb3JzQW5ub3RhdGlvbnNbaV1dID0gU3RyQ2F0KAorICAgICAgICAgICIgICIsIEZpZWxkTmFtZShkZXNjcmlwdG9yKSwgIl9BY2Nlc3NlZE5vU3RyaXAgPSB0cnVlO1xuIik7CisgICAgfQorICB9CisgIGlmICghb3B0aW9ucy5maWVsZF9saXN0ZW5lcl9vcHRpb25zLmluamVjdF9maWVsZF9saXN0ZW5lcl9ldmVudHMpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGRlc2NyaXB0b3ItPmZpbGUoKS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpID09CisgICAgICBnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uczo6TElURV9SVU5USU1FKSB7CisgICAgcmV0dXJuOworICB9CisgIHN0ZDo6c3RyaW5nIGZpZWxkX21lbWJlciA9ICgqdmFyaWFibGVzKVsiZmllbGQiXTsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9tZW1iZXIgPQorICAgICAgZGVzY3JpcHRvci0+cmVhbF9jb250YWluaW5nX29uZW9mKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHByb3RvX25zID0gKCp2YXJpYWJsZXMpWyJwcm90b19ucyJdOworICBjb25zdCBzdGQ6OnN0cmluZyBzdWJzdGl0dXRlX3RlbXBsYXRlX3ByZWZpeCA9CisgICAgICBTdHJDYXQoIiAgIiwgKCp2YXJpYWJsZXMpWyJ0cmFja2VyIl0sICIuJDE8JDA+KHRoaXMsICIpOworICBzdGQ6OnN0cmluZyBwcmVwYXJlZF90ZW1wbGF0ZTsKKworICAvLyBGbGF0IHRlbXBsYXRlIGlzIG5lZWRlZCBpZiB0aGUgcHJlcGFyZWQgb25lIGlzIGludHJvc3BlY3RpbmcgdGhlIHZhbHVlcworICAvLyBpbnNpZGUgdGhlIHJldHVybmVkIHZhbHVlcywgZm9yIGV4YW1wbGUsIGZvciByZXBlYXRlZCBmaWVsZHMgYW5kIG1hcHMuCisgIHN0ZDo6c3RyaW5nIHByZXBhcmVkX2ZsYXRfdGVtcGxhdGU7CisgIHN0ZDo6c3RyaW5nIHByZXBhcmVkX2FkZF90ZW1wbGF0ZTsKKyAgLy8gVE9ETyhiLzE5MDYxNDY3OCk6IFN1cHBvcnQgZmllbGRzIHdpdGggdHlwZSBNZXNzYWdlIG9yIE1hcC4KKyAgaWYgKGRlc2NyaXB0b3ItPmlzX3JlcGVhdGVkKCkgJiYgIWRlc2NyaXB0b3ItPmlzX21hcCgpKSB7CisgICAgaWYgKGRlc2NyaXB0b3ItPnR5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSAmJgorICAgICAgICBkZXNjcmlwdG9yLT50eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgICBwcmVwYXJlZF90ZW1wbGF0ZSA9IHN0cmluZ3M6OlN1YnN0aXR1dGUoIiYkMC5HZXQoaW5kZXgpIiwgZmllbGRfbWVtYmVyKTsKKyAgICAgIHByZXBhcmVkX2FkZF90ZW1wbGF0ZSA9CisgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiJiQwLkdldCgkMC5zaXplKCkgLSAxKSIsIGZpZWxkX21lbWJlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByZXBhcmVkX3RlbXBsYXRlID0gIm51bGxwdHIiOworICAgICAgcHJlcGFyZWRfYWRkX3RlbXBsYXRlID0gIm51bGxwdHIiOworICAgIH0KKyAgfSBlbHNlIGlmIChkZXNjcmlwdG9yLT5pc19tYXAoKSkgeworICAgIHByZXBhcmVkX3RlbXBsYXRlID0gIm51bGxwdHIiOworICB9IGVsc2UgaWYgKGRlc2NyaXB0b3ItPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSAmJgorICAgICAgICAgICAgICFJc0V4cGxpY2l0TGF6eShkZXNjcmlwdG9yKSkgeworICAgIHByZXBhcmVkX3RlbXBsYXRlID0gIm51bGxwdHIiOworICB9IGVsc2UgaWYgKGRlc2NyaXB0b3ItPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORykgeworICAgIGlmIChvbmVvZl9tZW1iZXIpIHsKKyAgICAgIHByZXBhcmVkX3RlbXBsYXRlID0gR2VuZXJhdGVUZW1wbGF0ZUZvck9uZW9mU3RyaW5nKAorICAgICAgICAgIGRlc2NyaXB0b3IsICgqdmFyaWFibGVzKVsicHJvdG9fbnMiXSwgZmllbGRfbWVtYmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJlcGFyZWRfdGVtcGxhdGUgPQorICAgICAgICAgIEdlbmVyYXRlVGVtcGxhdGVGb3JTaW5nbGVTdHJpbmcoZGVzY3JpcHRvciwgZmllbGRfbWVtYmVyKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcHJlcGFyZWRfdGVtcGxhdGUgPSBTdHJDYXQoIiYiLCBmaWVsZF9tZW1iZXIpOworICB9CisgIGlmIChkZXNjcmlwdG9yLT5pc19yZXBlYXRlZCgpICYmICFkZXNjcmlwdG9yLT5pc19tYXAoKSAmJgorICAgICAgZGVzY3JpcHRvci0+dHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFICYmCisgICAgICBkZXNjcmlwdG9yLT50eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgcHJlcGFyZWRfZmxhdF90ZW1wbGF0ZSA9IFN0ckNhdCgiJiIsIGZpZWxkX21lbWJlcik7CisgIH0gZWxzZSB7CisgICAgcHJlcGFyZWRfZmxhdF90ZW1wbGF0ZSA9IHByZXBhcmVkX3RlbXBsYXRlOworICB9CisKKyAgTWF5U2V0QW5ub3RhdGlvblZhcmlhYmxlKG9wdGlvbnMsICJnZXQiLCBzdWJzdGl0dXRlX3RlbXBsYXRlX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkX3RlbXBsYXRlLCBkZXNjcmlwdG9yLT5pbmRleCgpLCAiT25HZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzKTsKKyAgTWF5U2V0QW5ub3RhdGlvblZhcmlhYmxlKG9wdGlvbnMsICJzZXQiLCBzdWJzdGl0dXRlX3RlbXBsYXRlX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkX3RlbXBsYXRlLCBkZXNjcmlwdG9yLT5pbmRleCgpLCAiT25TZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzKTsKKyAgTWF5U2V0QW5ub3RhdGlvblZhcmlhYmxlKG9wdGlvbnMsICJoYXMiLCBzdWJzdGl0dXRlX3RlbXBsYXRlX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkX3RlbXBsYXRlLCBkZXNjcmlwdG9yLT5pbmRleCgpLCAiT25IYXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzKTsKKyAgTWF5U2V0QW5ub3RhdGlvblZhcmlhYmxlKG9wdGlvbnMsICJtdXRhYmxlIiwgc3Vic3RpdHV0ZV90ZW1wbGF0ZV9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZF90ZW1wbGF0ZSwgZGVzY3JpcHRvci0+aW5kZXgoKSwgIk9uTXV0YWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMpOworICBNYXlTZXRBbm5vdGF0aW9uVmFyaWFibGUob3B0aW9ucywgInJlbGVhc2UiLCBzdWJzdGl0dXRlX3RlbXBsYXRlX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkX3RlbXBsYXRlLCBkZXNjcmlwdG9yLT5pbmRleCgpLCAiT25SZWxlYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyk7CisgIE1heVNldEFubm90YXRpb25WYXJpYWJsZShvcHRpb25zLCAiY2xlYXIiLCBzdWJzdGl0dXRlX3RlbXBsYXRlX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkX2ZsYXRfdGVtcGxhdGUsIGRlc2NyaXB0b3ItPmluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25DbGVhciIsIHZhcmlhYmxlcyk7CisgIE1heVNldEFubm90YXRpb25WYXJpYWJsZShvcHRpb25zLCAic2l6ZSIsIHN1YnN0aXR1dGVfdGVtcGxhdGVfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRfZmxhdF90ZW1wbGF0ZSwgZGVzY3JpcHRvci0+aW5kZXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJPblNpemUiLCB2YXJpYWJsZXMpOworICBNYXlTZXRBbm5vdGF0aW9uVmFyaWFibGUob3B0aW9ucywgImxpc3QiLCBzdWJzdGl0dXRlX3RlbXBsYXRlX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkX2ZsYXRfdGVtcGxhdGUsIGRlc2NyaXB0b3ItPmluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25MaXN0IiwgdmFyaWFibGVzKTsKKyAgTWF5U2V0QW5ub3RhdGlvblZhcmlhYmxlKG9wdGlvbnMsICJtdXRhYmxlX2xpc3QiLCBzdWJzdGl0dXRlX3RlbXBsYXRlX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkX2ZsYXRfdGVtcGxhdGUsIGRlc2NyaXB0b3ItPmluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25NdXRhYmxlTGlzdCIsIHZhcmlhYmxlcyk7CisgIE1heVNldEFubm90YXRpb25WYXJpYWJsZShvcHRpb25zLCAiYWRkIiwgc3Vic3RpdHV0ZV90ZW1wbGF0ZV9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZF9hZGRfdGVtcGxhdGUsIGRlc2NyaXB0b3ItPmluZGV4KCksICJPbkFkZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMpOworICBNYXlTZXRBbm5vdGF0aW9uVmFyaWFibGUob3B0aW9ucywgImFkZF9tdXRhYmxlIiwgc3Vic3RpdHV0ZV90ZW1wbGF0ZV9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZF9hZGRfdGVtcGxhdGUsIGRlc2NyaXB0b3ItPmluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25BZGRNdXRhYmxlIiwgdmFyaWFibGVzKTsKK30KKwordm9pZCBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBTZXRDb21tb25WYXJzKG9wdGlvbnMsIHZhcmlhYmxlcyk7CisgIFNldENvbW1vbk1lc3NhZ2VEYXRhVmFyaWFibGVzKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpLCB2YXJpYWJsZXMpOworCisgICgqdmFyaWFibGVzKVsibnMiXSA9IE5hbWVzcGFjZShkZXNjcmlwdG9yLCBvcHRpb25zKTsKKyAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gPSBGaWVsZE5hbWUoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsiaW5kZXgiXSA9IFN0ckNhdChkZXNjcmlwdG9yLT5pbmRleCgpKTsKKyAgKCp2YXJpYWJsZXMpWyJudW1iZXIiXSA9IFN0ckNhdChkZXNjcmlwdG9yLT5udW1iZXIoKSk7CisgICgqdmFyaWFibGVzKVsiY2xhc3NuYW1lIl0gPSBDbGFzc05hbWUoRmllbGRTY29wZShkZXNjcmlwdG9yKSwgZmFsc2UpOworICAoKnZhcmlhYmxlcylbImRlY2xhcmVkX3R5cGUiXSA9IERlY2xhcmVkVHlwZU1ldGhvZE5hbWUoZGVzY3JpcHRvci0+dHlwZSgpKTsKKyAgYm9vbCBzcGxpdCA9IFNob3VsZFNwbGl0KGRlc2NyaXB0b3IsIG9wdGlvbnMpOworICAoKnZhcmlhYmxlcylbImZpZWxkIl0gPSBGaWVsZE1lbWJlck5hbWUoZGVzY3JpcHRvciwgc3BsaXQpOworCisgICgqdmFyaWFibGVzKVsidGFnX3NpemUiXSA9IFN0ckNhdCgKKyAgICAgIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZGVzY3JpcHRvci0+bnVtYmVyKCksIGRlc2NyaXB0b3ItPnR5cGUoKSkpOworICAoKnZhcmlhYmxlcylbImRlcHJlY2F0ZWRfYXR0ciJdID0gRGVwcmVjYXRlZEF0dHJpYnV0ZShvcHRpb25zLCBkZXNjcmlwdG9yKTsKKworICAoKnZhcmlhYmxlcylbInNldF9oYXNiaXQiXSA9ICIiOworICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc2JpdCJdID0gIiI7CisgICgqdmFyaWFibGVzKVsibWF5YmVfcHJlcGFyZV9zcGxpdF9tZXNzYWdlIl0gPQorICAgICAgc3BsaXQgPyAiICBQcmVwYXJlU3BsaXRNZXNzYWdlRm9yV3JpdGUoKTtcbiIgOiAiIjsKKworICBBZGRBY2Nlc3NvckFubm90YXRpb25zKGRlc2NyaXB0b3IsIG9wdGlvbnMsIHZhcmlhYmxlcyk7CisKKyAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSBwbGFjZWhvbGRlcnMgdG8gcGljayBvdXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kcyBvZgorICAvLyBpZGVudGlmaWVycyBmb3IgYW5ub3RhdGlvbnMgKHdoZW4gZG9pbmcgc28gd2l0aCBleGlzdGluZyB2YXJpYWJsZXMgd291bGQKKyAgLy8gYmUgYW1iaWd1b3VzIG9yIGltcG9zc2libGUpLiBUaGV5IHNob3VsZCBuZXZlciBiZSBzZXQgdG8gYW55dGhpbmcgYnV0IHRoZQorICAvLyBlbXB0eSBzdHJpbmcuCisgICgqdmFyaWFibGVzKVsieyJdID0gIiI7CisgICgqdmFyaWFibGVzKVsifSJdID0gIiI7Cit9CisKK3ZvaWQgRmllbGRHZW5lcmF0b3I6OlNldEhhc0JpdEluZGV4KGludDMyX3QgaGFzX2JpdF9pbmRleCkgeworICBpZiAoIUhhc0hhc2JpdChkZXNjcmlwdG9yXykpIHsKKyAgICBHT09HTEVfQ0hFQ0tfRVEoaGFzX2JpdF9pbmRleCwgLTEpOworICAgIHJldHVybjsKKyAgfQorICB2YXJpYWJsZXNfWyJzZXRfaGFzYml0Il0gPSBTdHJDYXQoCisgICAgICB2YXJpYWJsZXNfWyJoYXNfYml0cyJdLCAiWyIsIGhhc19iaXRfaW5kZXggLyAzMiwgIl0gfD0gMHgiLAorICAgICAgc3RyaW5nczo6SGV4KDF1IDw8IChoYXNfYml0X2luZGV4ICUgMzIpLCBzdHJpbmdzOjpaRVJPX1BBRF84KSwgInU7Iik7CisgIHZhcmlhYmxlc19bImNsZWFyX2hhc2JpdCJdID0gU3RyQ2F0KAorICAgICAgdmFyaWFibGVzX1siaGFzX2JpdHMiXSwgIlsiLCBoYXNfYml0X2luZGV4IC8gMzIsICJdICY9IH4weCIsCisgICAgICBzdHJpbmdzOjpIZXgoMXUgPDwgKGhhc19iaXRfaW5kZXggJSAzMiksIHN0cmluZ3M6OlpFUk9fUEFEXzgpLCAidTsiKTsKK30KKwordm9pZCBGaWVsZEdlbmVyYXRvcjo6U2V0SW5saW5lZFN0cmluZ0luZGV4KGludDMyX3QgaW5saW5lZF9zdHJpbmdfaW5kZXgpIHsKKyAgaWYgKCFJc1N0cmluZ0lubGluZWQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIEdPT0dMRV9DSEVDS19FUShpbmxpbmVkX3N0cmluZ19pbmRleCwgLTEpOworICAgIHJldHVybjsKKyAgfQorICAvLyBUaGUgZmlyc3QgYml0IGlzIHRoZSB0cmFja2luZyBiaXQgZm9yIG9uIGRlbWFuZCByZWdpc3RlcmluZyBBcmVuYUR0b3IuCisgIEdPT0dMRV9DSEVDS19HVChpbmxpbmVkX3N0cmluZ19pbmRleCwgMCkKKyAgICAgIDw8ICJfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8ncyBiaXQgMCBpcyByZXNlcnZlZCBmb3IgYXJlbmEgZHRvciB0cmFja2luZyI7CisgIHZhcmlhYmxlc19bImlubGluZWRfc3RyaW5nX2RvbmF0ZWQiXSA9IFN0ckNhdCgKKyAgICAgICIoIiwgdmFyaWFibGVzX1siaW5saW5lZF9zdHJpbmdfZG9uYXRlZF9hcnJheSJdLCAiWyIsCisgICAgICBpbmxpbmVkX3N0cmluZ19pbmRleCAvIDMyLCAiXSAmIDB4IiwKKyAgICAgIHN0cmluZ3M6OkhleCgxdSA8PCAoaW5saW5lZF9zdHJpbmdfaW5kZXggJSAzMiksIHN0cmluZ3M6OlpFUk9fUEFEXzgpLAorICAgICAgInUpICE9IDA7Iik7CisgIHZhcmlhYmxlc19bImRvbmF0aW5nX3N0YXRlc193b3JkIl0gPQorICAgICAgU3RyQ2F0KHZhcmlhYmxlc19bImlubGluZWRfc3RyaW5nX2RvbmF0ZWRfYXJyYXkiXSwgIlsiLAorICAgICAgICAgICAgICAgICAgIGlubGluZWRfc3RyaW5nX2luZGV4IC8gMzIsICJdIik7CisgIHZhcmlhYmxlc19bIm1hc2tfZm9yX3VuZG9uYXRlIl0gPSBTdHJDYXQoCisgICAgICAifjB4Iiwgc3RyaW5nczo6SGV4KDF1IDw8IChpbmxpbmVkX3N0cmluZ19pbmRleCAlIDMyKSwgc3RyaW5nczo6WkVST19QQURfOCksCisgICAgICAidSIpOworfQorCit2b2lkIEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUFnZ3JlZ2F0ZUluaXRpYWxpemVyKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChTaG91bGRTcGxpdChkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KCJkZWNsdHlwZShJbXBsXzo6U3BsaXQ6OiRuYW1lJF8pe2FyZW5hfSIpOworICAgIHJldHVybjsKKyAgfQorICBmb3JtYXQoImRlY2x0eXBlKCRmaWVsZCQpe2FyZW5hfSIpOworfQorCit2b2lkIEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNvbnN0ZXhwckFnZ3JlZ2F0ZUluaXRpYWxpemVyKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgiLypkZWNsdHlwZSgkZmllbGQkKSove30iKTsKK30KKwordm9pZCBGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDb3B5QWdncmVnYXRlSW5pdGlhbGl6ZXIoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCJkZWNsdHlwZSgkZmllbGQkKXtmcm9tLiRmaWVsZCR9Iik7Cit9CisKK3ZvaWQgRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoU2hvdWxkU3BsaXQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIC8vIFRoZXJlIGlzIG5vIGNvcHkgY29uc3RydWN0b3IgZm9yIHRoZSBgU3BsaXRgIHN0cnVjdCwgc28gd2UgbmVlZCB0byBjb3B5CisgICAgLy8gdGhlIHZhbHVlIGhlcmUuCisgICAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgICBmb3JtYXQoIiRmaWVsZCQgPSBmcm9tLiRmaWVsZCQ7XG4iKTsKKyAgfQorfQorCit2b2lkIFNldENvbW1vbk9uZW9mRmllbGRWYXJpYWJsZXMoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcykgeworICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBkZXNjcmlwdG9yLT5jb250YWluaW5nX29uZW9mKCktPm5hbWUoKSArICJfLiI7CisgICgqdmFyaWFibGVzKVsib25lb2ZfbmFtZSJdID0gZGVzY3JpcHRvci0+Y29udGFpbmluZ19vbmVvZigpLT5uYW1lKCk7Cit9CisKK0ZpZWxkR2VuZXJhdG9yOjp+RmllbGRHZW5lcmF0b3IoKSB7fQorCitGaWVsZEdlbmVyYXRvck1hcDo6RmllbGRHZW5lcmF0b3JNYXAoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIGZpZWxkX2dlbmVyYXRvcnNfKGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCkpIHsKKyAgLy8gQ29uc3RydWN0IGFsbCB0aGUgRmllbGRHZW5lcmF0b3JzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkX2dlbmVyYXRvcnNfW2ldLnJlc2V0KAorICAgICAgICBNYWtlR2VuZXJhdG9yKGRlc2NyaXB0b3ItPmZpZWxkKGkpLCBvcHRpb25zLCBzY2NfYW5hbHl6ZXIpKTsKKyAgfQorfQorCitGaWVsZEdlbmVyYXRvciogRmllbGRHZW5lcmF0b3JNYXA6Ok1ha2VHb29nbGVJbnRlcm5hbEdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKSB7CisKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0ZpZWxkR2VuZXJhdG9yKiBGaWVsZEdlbmVyYXRvck1hcDo6TWFrZUdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKSB7CisgIEZpZWxkR2VuZXJhdG9yKiBnZW5lcmF0b3IgPQorICAgICAgTWFrZUdvb2dsZUludGVybmFsR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zLCBzY2NfYW5hbHl6ZXIpOworICBpZiAoZ2VuZXJhdG9yKSB7CisgICAgcmV0dXJuIGdlbmVyYXRvcjsKKyAgfQorCisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgIGlmIChmaWVsZC0+aXNfbWFwKCkpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IE1hcEZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zLCBzY2NfYW5hbHl6ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2NfYW5hbHl6ZXIpOworICAgICAgICB9CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7CisgICAgfQorICB9IGVsc2UgaWYgKGZpZWxkLT5yZWFsX2NvbnRhaW5pbmdfb25lb2YoKSkgeworICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMsIHNjY19hbmFseXplcik7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgICByZXR1cm4gbmV3IEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zLCBzY2NfYW5hbHl6ZXIpOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0ZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zKTsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICAgIHJldHVybiBuZXcgRW51bUZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMpOworICAgIH0KKyAgfQorfQorCitGaWVsZEdlbmVyYXRvck1hcDo6fkZpZWxkR2VuZXJhdG9yTWFwKCkge30KKworY29uc3QgRmllbGRHZW5lcmF0b3ImIEZpZWxkR2VuZXJhdG9yTWFwOjpnZXQoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBHT09HTEVfQ0hFQ0tfRVEoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLCBkZXNjcmlwdG9yXyk7CisgIHJldHVybiAqZmllbGRfZ2VuZXJhdG9yc19bZmllbGQtPmluZGV4KCldOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmllbGQuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyYTUxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2ZpZWxkLmgKQEAgLTAsMCArMSwyNzAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0ZJRUxEX0hfXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9vcHRpb25zLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CitjbGFzcyBQcmludGVyOyAgLy8gcHJpbnRlci5oCit9Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCisvLyBIZWxwZXIgZnVuY3Rpb246IHNldCB2YXJpYWJsZXMgaW4gdGhlIG1hcCB0aGF0IGFyZSB0aGUgc2FtZSBmb3IgYWxsCisvLyBmaWVsZCBjb2RlIGdlbmVyYXRvcnMuCisvLyBbJ25hbWUnLCAnaW5kZXgnLCAnbnVtYmVyJywgJ2NsYXNzbmFtZScsICdkZWNsYXJlZF90eXBlJywgJ3RhZ19zaXplJywKKy8vICdkZXByZWNhdGlvbiddLgordm9pZCBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKK3ZvaWQgU2V0Q29tbW9uT25lb2ZGaWVsZFZhcmlhYmxlcygKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzKTsKKworY2xhc3MgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwgb3B0aW9uc18ob3B0aW9ucykge30KKyAgdmlydHVhbCB+RmllbGRHZW5lcmF0b3IoKTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IGZpbmFse307CisgIC8vIEdlbmVyYXRlIGxpbmVzIG9mIGNvZGUgZGVjbGFyaW5nIG1lbWJlcnMgZmllbGRzIG9mIHRoZSBtZXNzYWdlIGNsYXNzCisgIC8vIG5lZWRlZCB0byByZXByZXNlbnQgdGhpcyBmaWVsZC4gIFRoZXNlIGFyZSBwbGFjZWQgaW5zaWRlIHRoZSBtZXNzYWdlCisgIC8vIGNsYXNzLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworCisgIC8vIEdlbmVyYXRlIHN0YXRpYyBkZWZhdWx0IHZhcmlhYmxlIGZvciB0aGlzIGZpZWxkLiBUaGVzZSBhcmUgcGxhY2VkIGluc2lkZQorICAvLyB0aGUgbWVzc2FnZSBjbGFzcy4gTW9zdCBmaWVsZCB0eXBlcyBkb24ndCBuZWVkIHRoaXMsIHNvIHRoZSBkZWZhdWx0CisgIC8vIGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTdGF0aWNNZW1iZXJzKGlvOjpQcmludGVyKiAvKnByaW50ZXIqLykgY29uc3Qge30KKworICAvLyBHZW5lcmF0ZSBwcm90b3R5cGVzIGZvciBhbGwgb2YgdGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoaXMKKyAgLy8gZmllbGQuICBUaGVzZSBhcmUgcGxhY2VkIGluc2lkZSB0aGUgY2xhc3MgZGVmaW5pdGlvbi4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICAvLyBHZW5lcmF0ZSBpbmxpbmUgZGVmaW5pdGlvbnMgb2YgYWNjZXNzb3IgZnVuY3Rpb25zIGZvciB0aGlzIGZpZWxkLgorICAvLyBUaGVzZSBhcmUgcGxhY2VkIGluc2lkZSB0aGUgaGVhZGVyIGFmdGVyIGFsbCBjbGFzcyBkZWZpbml0aW9ucy4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucygKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisKKyAgLy8gR2VuZXJhdGUgZGVmaW5pdGlvbnMgb2YgYWNjZXNzb3JzIHRoYXQgYXJlbid0IGlubGluZWQuICBUaGVzZSBhcmUKKyAgLy8gcGxhY2VkIHNvbWV3aGVyZSBpbiB0aGUgLmNjIGZpbGUuCisgIC8vIE1vc3QgZmllbGQgdHlwZXMgZG9uJ3QgbmVlZCB0aGlzLCBzbyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eS4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTm9uSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucygKKyAgICAgIGlvOjpQcmludGVyKiAvKnByaW50ZXIqLykgY29uc3Qge30KKworICAvLyBHZW5lcmF0ZSBkZWNsYXJhdGlvbnMgb2YgYWNjZXNzb3JzIHRoYXQgYXJlIGZvciBpbnRlcm5hbCBwdXJwb3NlcyBvbmx5LgorICAvLyBNb3N0IGZpZWxkIHR5cGVzIGRvbid0IG5lZWQgdGhpcywgc28gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZW1wdHkuCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUludGVybmFsQWNjZXNzb3JEZWZpbml0aW9ucygKKyAgICAgIGlvOjpQcmludGVyKiAvKnByaW50ZXIqLykgY29uc3Qge30KKworICAvLyBHZW5lcmF0ZSBkZWZpbml0aW9ucyBvZiBhY2Nlc3NvcnMgdGhhdCBhcmUgZm9yIGludGVybmFsIHB1cnBvc2VzIG9ubHkuCisgIC8vIE1vc3QgZmllbGQgdHlwZXMgZG9uJ3QgbmVlZCB0aGlzLCBzbyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eS4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlSW50ZXJuYWxBY2Nlc3NvckRlY2xhcmF0aW9ucygKKyAgICAgIGlvOjpQcmludGVyKiAvKnByaW50ZXIqLykgY29uc3Qge30KKworICAvLyBHZW5lcmF0ZSBsaW5lcyBvZiBjb2RlIChzdGF0ZW1lbnRzLCBub3QgZGVjbGFyYXRpb25zKSB3aGljaCBjbGVhciB0aGUKKyAgLy8gZmllbGQuICBUaGlzIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBjbGVhcl8kbmFtZSQoKSBtZXRob2QKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisKKyAgLy8gR2VuZXJhdGUgbGluZXMgb2YgY29kZSAoc3RhdGVtZW50cywgbm90IGRlY2xhcmF0aW9ucykgd2hpY2ggY2xlYXIgdGhlCisgIC8vIGZpZWxkIGFzIHBhcnQgb2YgdGhlIENsZWFyKCkgbWV0aG9kIGZvciB0aGUgd2hvbGUgbWVzc2FnZS4gIEZvciBtZXNzYWdlCisgIC8vIHR5cGVzIHdoaWNoIGhhdmUgZmllbGQgcHJlc2VuY2UgYml0cywgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVDbGVhcgorICAvLyB3aWxsIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoZSBwcmVzZW5jZSBiaXRzLgorICAvLworICAvLyBTaW5jZSBtb3N0IGZpZWxkIHR5cGVzIGNhbiByZS11c2UgR2VuZXJhdGVDbGVhcmluZ0NvZGUsIHRoaXMgbWV0aG9kIGlzCisgIC8vIG5vdCBwdXJlIHZpcnR1YWwuCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lc3NhZ2VDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgICBHZW5lcmF0ZUNsZWFyaW5nQ29kZShwcmludGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGxpbmVzIG9mIGNvZGUgKHN0YXRlbWVudHMsIG5vdCBkZWNsYXJhdGlvbnMpIHdoaWNoIG1lcmdlcyB0aGUKKyAgLy8gY29udGVudHMgb2YgdGhlIGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgbWVzc2FnZSB0byB0aGUgdGFyZ2V0IG1lc3NhZ2UsCisgIC8vIHdoaWNoIGlzIHN0b3JlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgdmFyaWFibGUgImZyb20iLgorICAvLyBUaGlzIGlzIHVzZWQgdG8gZmlsbCBpbiB0aGUgTWVyZ2VGcm9tIG1ldGhvZCBmb3IgdGhlIHdob2xlIG1lc3NhZ2UuCisgIC8vIERldGFpbHMgb2YgdGhpcyB1c2FnZSBjYW4gYmUgZm91bmQgaW4gbWVzc2FnZS5jYyB1bmRlciB0aGUKKyAgLy8gR2VuZXJhdGVNZXJnZUZyb20gbWV0aG9kLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworCisgIC8vIEdlbmVyYXRlcyBhIGNvcHkgY29uc3RydWN0b3IKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQ29weUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyAgLy8gR2VuZXJhdGUgbGluZXMgb2YgY29kZSAoc3RhdGVtZW50cywgbm90IGRlY2xhcmF0aW9ucykgd2hpY2ggc3dhcHMKKyAgLy8gdGhpcyBmaWVsZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgb2YgYW5vdGhlciBtZXNzYWdlLCB3aGljaAorICAvLyBpcyBzdG9yZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIHZhcmlhYmxlICJvdGhlciIuIFRoaXMgaXMgdXNlZCB0bworICAvLyBkZWZpbmUgdGhlIFN3YXAgbWV0aG9kLiBEZXRhaWxzIG9mIHVzYWdlIGNhbiBiZSBmb3VuZCBpbgorICAvLyBtZXNzYWdlLmNjIHVuZGVyIHRoZSBHZW5lcmF0ZVN3YXAgbWV0aG9kLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICAvLyBHZW5lcmF0ZSBpbml0aWFsaXphdGlvbiBjb2RlIGZvciBwcml2YXRlIG1lbWJlcnMgZGVjbGFyZWQgYnkKKyAgLy8gR2VuZXJhdGVQcml2YXRlTWVtYmVycygpLiBUaGVzZSBnbyBpbnRvIHRoZSBtZXNzYWdlIGNsYXNzJ3MgU2hhcmVkQ3RvcigpCisgIC8vIG1ldGhvZCwgaW52b2tlZCBieSBlYWNoIG9mIHRoZSBnZW5lcmF0ZWQgY29uc3RydWN0b3JzLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICAvLyBHZW5lcmF0ZSBpbml0aWFsaXphdGlvbiBjb2RlIGZvciBwcml2YXRlIG1lbWJlcnMgaW4gdGhlIGNvbGQgc3RydWN0LgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVDcmVhdGVTcGxpdE1lc3NhZ2VDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7fQorCisgIC8vIEdlbmVyYXRlIGFueSBjb2RlIHRoYXQgbmVlZHMgdG8gZ28gaW4gdGhlIGNsYXNzJ3MgU2hhcmVkRHRvcigpIG1ldGhvZCwKKyAgLy8gaW52b2tlZCBieSB0aGUgZGVzdHJ1Y3Rvci4KKyAgLy8gTW9zdCBmaWVsZCB0eXBlcyBkb24ndCBuZWVkIHRoaXMsIHNvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogLypwcmludGVyKi8pIGNvbnN0IHt9CisKKyAgLy8gR2VuZXJhdGUgYSBtYW51YWwgZGVzdHJ1Y3RvciBpbnZvY2F0aW9uIGZvciB1c2Ugd2hlbiB0aGUgbWVzc2FnZSBpcyBvbiBhbgorICAvLyBhcmVuYS4gVGhlIGNvZGUgdGhhdCB0aGlzIG1ldGhvZCBnZW5lcmF0ZXMgd2lsbCBiZSBleGVjdXRlZCBpbnNpZGUgYQorICAvLyBzaGFyZWQtZm9yLXRoZS13aG9sZS1tZXNzYWdlLWNsYXNzIG1ldGhvZCByZWdpc3RlcmVkIHdpdGgKKyAgLy8gT3duRGVzdHJ1Y3RvcigpLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVBcmVuYURlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgICAgR09PR0xFX0NIRUNLKE5lZWRzQXJlbmFEZXN0cnVjdG9yKCkgPT0gQXJlbmFEdG9yTmVlZHM6OmtOb25lKQorICAgICAgICA8PCBkZXNjcmlwdG9yXy0+Y3BwX3R5cGVfbmFtZSgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgaW5pdGlhbGl6YXRpb24gY29kZSBmb3IgcHJpdmF0ZSBtZW1iZXJzIGRlY2xhcmVkIGJ5CisgIC8vIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoKS4gVGhlc2UgZ28gaW50byB0aGUgU2hhcmVkQ3RvcidzCisgIC8vIGFnZ3JlZ2F0ZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgX2ltcGxfIHN0cnVjdCBhbmQgbXVzdCBmb2xsb3cgdGhlIHN5bnRheAorICAvLyAoZS5nLiBgZGVjbHR5cGUoJGZpZWxkJCl7JGRlZmF1bHQkfWApLiBEb2VzIG5vdCBpbmNsdWRlIGA6YCBvciBgLGAKKyAgLy8gc2VwYXJhdG9ycy4gIERlZmF1bHQgdmFsdWVzIHNob3VsZCBiZSBzcGVjaWZpZWQgaGVyZSB3aGVuIHBvc3NpYmxlLgorICAvLworICAvLyBOb3RlOiBXZSB1c2UgYGRlY2x0eXBlKCRmaWVsZCQpYCBmb3IgYm90aCBleHBsaWNpdCBjb25zdHJ1Y3Rpb24gYW5kIHRoZQorICAvLyBmYWN0IHRoYXQgaXQncyBzZWxmLWRvY3VtZW50aW5nLiAgUHJlLUMrKzE3LCBjb3B5IGVsaXNpb24gaXNuJ3QgZ3VhcmFudGVlZAorICAvLyBpbiBhZ2dyZWdhdGUgaW5pdGlhbGl6YXRpb24gc28gYSB2YWxpZCBjb3B5L21vdmUgY29uc3RydWN0b3IgbXVzdCBleGlzdAorICAvLyAoZXZlbiB0aG91Z2ggaXQncyBub3QgdXNlZCkuICBCZWNhdXNlIG9mIHRoaXMsIHdlIG5lZWQgdG8gY29tbWVudCBvdXQgdGhlCisgIC8vIGRlY2x0eXBlIGFuZCBmYWxsYmFjayB0byBpbXBsaWNpdCBjb25zdHJ1Y3Rpb24uCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUFnZ3JlZ2F0ZUluaXRpYWxpemVyKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworICAvLyBHZW5lcmF0ZSBjb25zdGluaXQgaW5pdGlhbGl6YXRpb24gY29kZSBmb3IgcHJpdmF0ZSBtZW1iZXJzIGRlY2xhcmVkIGJ5CisgIC8vIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoKS4gVGhlc2UgZ28gaW50byB0aGUgY29uc3RleHByIGNvbnN0cnVjdG9yJ3MKKyAgLy8gYWdncmVnYXRlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBfaW1wbF8gc3RydWN0IGFuZCBtdXN0IGZvbGxvdyB0aGUgc3ludGF4CisgIC8vIChlLmcuIGAvKmRlY2x0eXBlKCRmaWVsZCQpKi97fWAsIHNlZSBhYm92ZSkuIERvZXMgbm90CisgIC8vIGluY2x1ZGUgYDpgIG9yIGAsYCBzZXBhcmF0b3JzLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVDb25zdGV4cHJBZ2dyZWdhdGVJbml0aWFsaXplcigKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworICAvLyBHZW5lcmF0ZSBjb3B5IGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHByaXZhdGUgbWVtYmVycyBkZWNsYXJlZCBieQorICAvLyBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKCkuIFRoZXNlIGdvIGludG8gdGhlIGNvcHkgY29uc3RydWN0b3IncworICAvLyBhZ2dyZWdhdGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIF9pbXBsXyBzdHJ1Y3QgYW5kIG11c3QgZm9sbG93IHRoZSBzeW50YXgKKyAgLy8gKGUuZy4gYGRlY2x0eXBlKCRmaWVsZCQpe2Zyb20uJGZpZWxkJH1gLCBzZWUgYWJvdmUpLiBEb2VzIG5vdAorICAvLyBpbmNsdWRlIGA6YCBvciBgLGAgc2VwYXJhdG9ycy4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQ29weUFnZ3JlZ2F0ZUluaXRpYWxpemVyKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworICAvLyBHZW5lcmF0ZSBsaW5lcyB0byBzZXJpYWxpemUgdGhpcyBmaWVsZCBkaXJlY3RseSB0byB0aGUgYXJyYXkgInRhcmdldCIsCisgIC8vIHdoaWNoIGFyZSBwbGFjZWQgd2l0aGluIHRoZSBtZXNzYWdlJ3MgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgpCisgIC8vIG1ldGhvZC4gVGhpcyBtdXN0IGFsc28gYWR2YW5jZSAidGFyZ2V0IiBwYXN0IHRoZSB3cml0dGVuIGJ5dGVzLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICAvLyBHZW5lcmF0ZSBsaW5lcyB0byBjb21wdXRlIHRoZSBzZXJpYWxpemVkIHNpemUgb2YgdGhpcyBmaWVsZCwgd2hpY2gKKyAgLy8gYXJlIHBsYWNlZCBpbiB0aGUgbWVzc2FnZSdzIEJ5dGVTaXplKCkgbWV0aG9kLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworCisgIC8vIEdlbmVyYXRlcyBsaW5lcyB0byBjYWxsIElzSW5pdGlhbGl6ZWQoKSBmb3IgZWxpZ2libGUgbWVzc2FnZSBmaWVsZHMuIE5vbgorICAvLyBtZXNzYWdlIGZpZWxkcyB3b24ndCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHt9CisKKyAgdmlydHVhbCBib29sIElzSW5saW5lZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgdmlydHVhbCBBcmVuYUR0b3JOZWVkcyBOZWVkc0FyZW5hRGVzdHJ1Y3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQXJlbmFEdG9yTmVlZHM6OmtOb25lOworICB9CisKKyAgdm9pZCBTZXRIYXNCaXRJbmRleChpbnQzMl90IGhhc19iaXRfaW5kZXgpOworICB2b2lkIFNldElubGluZWRTdHJpbmdJbmRleChpbnQzMl90IGlubGluZWRfc3RyaW5nX2luZGV4KTsKKworIHByb3RlY3RlZDoKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgY29uc3QgT3B0aW9ucyYgb3B0aW9uc187CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyaWFibGVzXzsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWVsZEdlbmVyYXRvcik7Cit9OworCisvLyBDb252ZW5pZW5jZSBjbGFzcyB3aGljaCBjb25zdHJ1Y3RzIEZpZWxkR2VuZXJhdG9ycyBmb3IgYSBEZXNjcmlwdG9yLgorY2xhc3MgRmllbGRHZW5lcmF0b3JNYXAgeworIHB1YmxpYzoKKyAgRmllbGRHZW5lcmF0b3JNYXAoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNDQ0FuYWx5emVyKiBzY2NfYW5hbHl6ZXIpOworICB+RmllbGRHZW5lcmF0b3JNYXAoKTsKKworICBjb25zdCBGaWVsZEdlbmVyYXRvciYgZ2V0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIHZvaWQgU2V0SGFzQml0SW5kaWNlcyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBoYXNfYml0X2luZGljZXNfKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzX1tpXS0+U2V0SGFzQml0SW5kZXgoaGFzX2JpdF9pbmRpY2VzX1tpXSk7CisgICAgfQorICB9CisKKyAgdm9pZCBTZXRJbmxpbmVkU3RyaW5nSW5kaWNlcyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpbmxpbmVkX3N0cmluZ19pbmRpY2VzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzX1tpXS0+U2V0SW5saW5lZFN0cmluZ0luZGV4KGlubGluZWRfc3RyaW5nX2luZGljZXNbaV0pOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxGaWVsZEdlbmVyYXRvcj4+IGZpZWxkX2dlbmVyYXRvcnNfOworCisgIHN0YXRpYyBGaWVsZEdlbmVyYXRvciogTWFrZUdvb2dsZUludGVybmFsR2VuZXJhdG9yKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKTsKKyAgc3RhdGljIEZpZWxkR2VuZXJhdG9yKiBNYWtlR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNDQ0FuYWx5emVyKiBzY2NfYW5hbHl6ZXIpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWVsZEdlbmVyYXRvck1hcCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9maWxlLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmlsZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzhlMGFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmlsZS5jYwpAQCAtMCwwICsxLDEzODIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmlsZS5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zY2MuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9lbnVtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9leHRlbnNpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9zZXJ2aWNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKworLy8gTXVzdCBiZSBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworbmFtZXNwYWNlIHsKKworLy8gV2hlbiB3ZSBmb3J3YXJkLWRlY2xhcmUgdGhpbmdzLCB3ZSB3YW50IHRvIGNyZWF0ZSBhIHNvcnRlZCBvcmRlciBzbyBvdXIKKy8vIG91dHB1dCBpcyBkZXRlcm1pbmlzdGljIGFuZCBtaW5pbWl6ZXMgbmFtZXNwYWNlIGNoYW5nZXMuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0ZDo6c3RyaW5nIEdldFNvcnRLZXkoY29uc3QgVCYgdmFsKSB7CisgIHJldHVybiB2YWwuZnVsbF9uYW1lKCk7Cit9CisKK3RlbXBsYXRlIDw+CitzdGQ6OnN0cmluZyBHZXRTb3J0S2V5PEZpbGVEZXNjcmlwdG9yPihjb25zdCBGaWxlRGVzY3JpcHRvciYgdmFsKSB7CisgIHJldHVybiB2YWwubmFtZSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgQ29tcGFyZVNvcnRLZXlzKGNvbnN0IFQqIGEsIGNvbnN0IFQqIGIpIHsKKyAgcmV0dXJuIEdldFNvcnRLZXkoKmEpIDwgR2V0U29ydEtleSgqYik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RkOjp2ZWN0b3I8Y29uc3QgVCo+IFNvcnRlZChjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8Y29uc3QgVCo+JiB2YWxzKSB7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IFQqPiBzb3J0ZWQodmFscy5iZWdpbigpLCB2YWxzLmVuZCgpKTsKKyAgc3RkOjpzb3J0KHNvcnRlZC5iZWdpbigpLCBzb3J0ZWQuZW5kKCksIENvbXBhcmVTb3J0S2V5czxUPik7CisgIHJldHVybiBzb3J0ZWQ7Cit9CisKKy8vIFRPRE8oYi8yMDMxMDEwNzgpOiByZW1vdmUgcHJhZ21hcyB0aGF0IHN1cHByZXNzZXMgdW5pbml0aWFsaXplZCB3YXJuaW5ncyB3aGVuCisvLyBjbGFuZyBidWcgaXMgZml4ZWQuCitpbmxpbmUgdm9pZCBNdXRlV3VuaW5pdGlhbGl6ZWQoRm9ybWF0dGVyJiBmb3JtYXQpIHsKKyAgZm9ybWF0KAorICAgICAgIiNpZiBkZWZpbmVkKF9fbGx2bV9fKVxuIgorICAgICAgIiAgI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2hcbiIKKyAgICAgICIgICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVd1bmluaXRpYWxpemVkXCJcbiIKKyAgICAgICIjZW5kaWYgIC8vIF9fbGx2bV9fXG4iKTsKK30KKworaW5saW5lIHZvaWQgVW5tdXRlV3VuaW5pdGlhbGl6ZWQoRm9ybWF0dGVyJiBmb3JtYXQpIHsKKyAgZm9ybWF0KAorICAgICAgIiNpZiBkZWZpbmVkKF9fbGx2bV9fKVxuIgorICAgICAgIiAgI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcFxuIgorICAgICAgIiNlbmRpZiAgLy8gX19sbHZtX19cbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworRmlsZUdlbmVyYXRvcjo6RmlsZUdlbmVyYXRvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKKyAgICA6IGZpbGVfKGZpbGUpLCBvcHRpb25zXyhvcHRpb25zKSwgc2NjX2FuYWx5emVyXyhvcHRpb25zKSB7CisgIC8vIFRoZXNlIHZhcmlhYmxlcyBhcmUgdGhlIHNhbWUgb24gYSBmaWxlIGxldmVsCisgIFNldENvbW1vblZhcnMob3B0aW9ucywgJnZhcmlhYmxlc18pOworICB2YXJpYWJsZXNfWyJkbGxleHBvcnRfZGVjbCJdID0gb3B0aW9ucy5kbGxleHBvcnRfZGVjbDsKKyAgdmFyaWFibGVzX1sidGFibGVuYW1lIl0gPSBVbmlxdWVOYW1lKCJUYWJsZVN0cnVjdCIsIGZpbGVfLCBvcHRpb25zXyk7CisgIHZhcmlhYmxlc19bImZpbGVfbGV2ZWxfbWV0YWRhdGEiXSA9CisgICAgICBVbmlxdWVOYW1lKCJmaWxlX2xldmVsX21ldGFkYXRhIiwgZmlsZV8sIG9wdGlvbnNfKTsKKyAgdmFyaWFibGVzX1siZGVzY190YWJsZSJdID0gRGVzY3JpcHRvclRhYmxlTmFtZShmaWxlXywgb3B0aW9uc18pOworICB2YXJpYWJsZXNfWyJmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnMiXSA9CisgICAgICBVbmlxdWVOYW1lKCJmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnMiLCBmaWxlXywgb3B0aW9uc18pOworICB2YXJpYWJsZXNfWyJmaWxlX2xldmVsX3NlcnZpY2VfZGVzY3JpcHRvcnMiXSA9CisgICAgICBVbmlxdWVOYW1lKCJmaWxlX2xldmVsX3NlcnZpY2VfZGVzY3JpcHRvcnMiLCBmaWxlXywgb3B0aW9uc18pOworICB2YXJpYWJsZXNfWyJmaWxlbmFtZSJdID0gZmlsZV8tPm5hbWUoKTsKKyAgdmFyaWFibGVzX1sicGFja2FnZV9ucyJdID0gTmFtZXNwYWNlKGZpbGVfLCBvcHRpb25zKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBEZXNjcmlwdG9yKj4gbXNncyA9IEZsYXR0ZW5NZXNzYWdlc0luRmlsZShmaWxlKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLnNpemUoKTsgaSsrKSB7CisgICAgLy8gRGVsZXRlZCBpbiBkZXN0cnVjdG9yCisgICAgTWVzc2FnZUdlbmVyYXRvciogbXNnX2dlbiA9CisgICAgICAgIG5ldyBNZXNzYWdlR2VuZXJhdG9yKG1zZ3NbaV0sIHZhcmlhYmxlc18sIGksIG9wdGlvbnMsICZzY2NfYW5hbHl6ZXJfKTsKKyAgICBtZXNzYWdlX2dlbmVyYXRvcnNfLmVtcGxhY2VfYmFjayhtc2dfZ2VuKTsKKyAgICBtc2dfZ2VuLT5BZGRHZW5lcmF0b3JzKCZlbnVtX2dlbmVyYXRvcnNfLCAmZXh0ZW5zaW9uX2dlbmVyYXRvcnNfKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGVudW1fZ2VuZXJhdG9yc18uZW1wbGFjZV9iYWNrKAorICAgICAgICBuZXcgRW51bUdlbmVyYXRvcihmaWxlLT5lbnVtX3R5cGUoaSksIHZhcmlhYmxlc18sIG9wdGlvbnMpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+c2VydmljZV9jb3VudCgpOyBpKyspIHsKKyAgICBzZXJ2aWNlX2dlbmVyYXRvcnNfLmVtcGxhY2VfYmFjaygKKyAgICAgICAgbmV3IFNlcnZpY2VHZW5lcmF0b3IoZmlsZS0+c2VydmljZShpKSwgdmFyaWFibGVzXywgb3B0aW9ucykpOworICB9CisgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8sIG9wdGlvbnNfKSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZV9nZW5lcmF0b3JzXy5zaXplKCk7IGkrKykgeworICAgICAgc2VydmljZV9nZW5lcmF0b3JzX1tpXS0+aW5kZXhfaW5fbWV0YWRhdGFfID0gaTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfLmVtcGxhY2VfYmFjaygKKyAgICAgICAgbmV3IEV4dGVuc2lvbkdlbmVyYXRvcihmaWxlLT5leHRlbnNpb24oaSksIG9wdGlvbnMsICZzY2NfYW5hbHl6ZXJfKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT53ZWFrX2RlcGVuZGVuY3lfY291bnQoKTsgKytpKSB7CisgICAgd2Vha19kZXBzXy5pbnNlcnQoZmlsZS0+d2Vha19kZXBlbmRlbmN5KGkpKTsKKyAgfQorfQorCitGaWxlR2VuZXJhdG9yOjp+RmlsZUdlbmVyYXRvcigpID0gZGVmYXVsdDsKKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZU1hY3JvVW5kZWZzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIC8vIE9ubHkgZG8gdGhpcyBmb3IgcHJvdG9idWYncyBvd24gdHlwZXMuIFRoZXJlIGFyZSBzb21lIGdvb2dsZTMgcHJvdG9zIHVzaW5nCisgIC8vIG1hY3JvcyBhcyBmaWVsZCBuYW1lcyBhbmQgdGhlIGdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzIGFmdGVyIHRoZSBtYWNybworICAvLyBleHBhbnNpb24uIFVuZGVmaW5nIHRoZXNlIG1hY3JvcyBhY3R1YWxseSBicmVha3Mgc3VjaCBjb2RlLgorICBpZiAoZmlsZV8tPm5hbWUoKSAhPSAibmV0L3Byb3RvMi9jb21waWxlci9wcm90by9wbHVnaW4ucHJvdG8iICYmCisgICAgICBmaWxlXy0+bmFtZSgpICE9ICJnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvIikgeworICAgIHJldHVybjsKKyAgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZXNfdG9fdW5kZWY7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgTGlzdEFsbEZpZWxkcyhmaWxlXywgJmZpZWxkcyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgPSBmaWVsZHNbaV0tPm5hbWUoKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga01hY3JvTmFtZXNbXSA9IHsibWFqb3IiLCAibWlub3IifTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IEdPT0dMRV9BUlJBWVNJWkUoa01hY3JvTmFtZXMpOyArK2opIHsKKyAgICAgIGlmIChuYW1lID09IGtNYWNyb05hbWVzW2pdKSB7CisgICAgICAgIG5hbWVzX3RvX3VuZGVmLnB1c2hfYmFjayhuYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNfdG9fdW5kZWYuc2l6ZSgpOyArK2kpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICIjaWZkZWYgJDEkXG4iCisgICAgICAgICIjdW5kZWYgJDEkXG4iCisgICAgICAgICIjZW5kaWZcbiIsCisgICAgICAgIG5hbWVzX3RvX3VuZGVmW2ldKTsKKyAgfQorfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisKKyAgLy8gcG9ydF9kZWYuaW5jIG11c3QgYmUgaW5jbHVkZWQgYWZ0ZXIgYWxsIG90aGVyIGluY2x1ZGVzLgorICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9wdWJsaWMvcG9ydF9kZWYuaW5jIiwgcHJpbnRlcik7CisgIGZvcm1hdCgiI2RlZmluZSAkMSQkIGRsbGV4cG9ydF9kZWNsJFxuIiwgRmlsZURsbEV4cG9ydChmaWxlXywgb3B0aW9uc18pKTsKKyAgR2VuZXJhdGVNYWNyb1VuZGVmcyhwcmludGVyKTsKKworICAvLyBGb3IgQW55IHN1cHBvcnQgd2l0aCBsaXRlIHByb3Rvcywgd2UgbmVlZCB0byBmcmllbmQgQW55TWV0YWRhdGEsIHNvIHdlCisgIC8vIGZvcndhcmQtZGVjbGFyZSBpdCBoZXJlLgorICBmb3JtYXQoCisgICAgICAiUFJPVE9CVUZfTkFNRVNQQUNFX09QRU5cbiIKKyAgICAgICJuYW1lc3BhY2UgaW50ZXJuYWwge1xuIgorICAgICAgImNsYXNzIEFueU1ldGFkYXRhO1xuIgorICAgICAgIn0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbFxuIgorICAgICAgIlBST1RPQlVGX05BTUVTUEFDRV9DTE9TRVxuIik7CisKKyAgR2VuZXJhdGVHbG9iYWxTdGF0ZUZ1bmN0aW9uRGVjbGFyYXRpb25zKHByaW50ZXIpOworCisgIEdlbmVyYXRlRm9yd2FyZERlY2xhcmF0aW9ucyhwcmludGVyKTsKKworICB7CisgICAgTmFtZXNwYWNlT3BlbmVyIG5zKE5hbWVzcGFjZShmaWxlXywgb3B0aW9uc18pLCBmb3JtYXQpOworCisgICAgZm9ybWF0KCJcbiIpOworCisgICAgR2VuZXJhdGVFbnVtRGVmaW5pdGlvbnMocHJpbnRlcik7CisKKyAgICBmb3JtYXQoa1RoaWNrU2VwYXJhdG9yKTsKKyAgICBmb3JtYXQoIlxuIik7CisKKyAgICBHZW5lcmF0ZU1lc3NhZ2VEZWZpbml0aW9ucyhwcmludGVyKTsKKworICAgIGZvcm1hdCgiXG4iKTsKKyAgICBmb3JtYXQoa1RoaWNrU2VwYXJhdG9yKTsKKyAgICBmb3JtYXQoIlxuIik7CisKKyAgICBHZW5lcmF0ZVNlcnZpY2VEZWZpbml0aW9ucyhwcmludGVyKTsKKworICAgIEdlbmVyYXRlRXh0ZW5zaW9uSWRlbnRpZmllcnMocHJpbnRlcik7CisKKyAgICBmb3JtYXQoIlxuIik7CisgICAgZm9ybWF0KGtUaGlja1NlcGFyYXRvcik7CisgICAgZm9ybWF0KCJcbiIpOworCisgICAgR2VuZXJhdGVJbmxpbmVGdW5jdGlvbkRlZmluaXRpb25zKHByaW50ZXIpOworCisgICAgZm9ybWF0KAorICAgICAgICAiXG4iCisgICAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKVxuIgorICAgICAgICAiXG4iKTsKKyAgfQorCisgIC8vIFdlIG5lZWQgdG8gc3BlY2lhbGl6ZSBzb21lIHRlbXBsYXRlcyBpbiB0aGUgOjpnb29nbGU6OnByb3RvYnVmIG5hbWVzcGFjZToKKyAgR2VuZXJhdGVQcm90bzJOYW1lc3BhY2VFbnVtU3BlY2lhbGl6YXRpb25zKHByaW50ZXIpOworCisgIGZvcm1hdCgKKyAgICAgICJcbiIKKyAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKVxuIgorICAgICAgIlxuIik7CisgIEluY2x1ZGVGaWxlKCJuZXQvcHJvdG8yL3B1YmxpYy9wb3J0X3VuZGVmLmluYyIsIHByaW50ZXIpOworfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlUHJvdG9IZWFkZXIoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluZm9fcGF0aCkgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoIW9wdGlvbnNfLnByb3RvX2gpIHsKKyAgICByZXR1cm47CisgIH0KKworICBHZW5lcmF0ZVRvcEhlYWRlckd1YXJkKHByaW50ZXIsIGZhbHNlKTsKKworICBpZiAoIW9wdGlvbnNfLm9wZW5zb3VyY2VfcnVudGltZSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgIiNpZmRlZiBTV0lHXG4iCisgICAgICAgICIjZXJyb3IgXCJEbyBub3QgU1dJRy13cmFwIHByb3RvYnVmcy5cIlxuIgorICAgICAgICAiI2VuZGlmICAvLyBTV0lHXG4iCisgICAgICAgICJcbiIpOworICB9CisKKyAgaWYgKElzQm9vdHN0cmFwUHJvdG8ob3B0aW9uc18sIGZpbGVfKSkgeworICAgIGZvcm1hdCgiLy8gSVdZVSBwcmFnbWE6IHByaXZhdGUsIGluY2x1ZGUgXCIkMSQucHJvdG8uaFwiXG5cbiIsCisgICAgICAgICAgIFN0cmlwUHJvdG8oZmlsZV8tPm5hbWUoKSkpOworICB9CisKKyAgR2VuZXJhdGVMaWJyYXJ5SW5jbHVkZXMocHJpbnRlcik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+cHVibGljX2RlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlcCA9IGZpbGVfLT5wdWJsaWNfZGVwZW5kZW5jeShpKTsKKyAgICBmb3JtYXQoIiNpbmNsdWRlIFwiJDEkLnByb3RvLmhcIlxuIiwgU3RyaXBQcm90byhkZXAtPm5hbWUoKSkpOworICB9CisKKyAgZm9ybWF0KCIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpXG4iKTsKKworICBHZW5lcmF0ZU1ldGFkYXRhUHJhZ21hKHByaW50ZXIsIGluZm9fcGF0aCk7CisKKyAgR2VuZXJhdGVIZWFkZXIocHJpbnRlcik7CisKKyAgR2VuZXJhdGVCb3R0b21IZWFkZXJHdWFyZChwcmludGVyLCBmYWxzZSk7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVQQkhlYWRlcihpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5mb19wYXRoKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIEdlbmVyYXRlVG9wSGVhZGVyR3VhcmQocHJpbnRlciwgdHJ1ZSk7CisKKyAgaWYgKG9wdGlvbnNfLnByb3RvX2gpIHsKKyAgICBzdGQ6OnN0cmluZyB0YXJnZXRfYmFzZW5hbWUgPSBTdHJpcFByb3RvKGZpbGVfLT5uYW1lKCkpOworICAgIGlmICghb3B0aW9uc18ub3BlbnNvdXJjZV9ydW50aW1lKSB7CisgICAgICBHZXRCb290c3RyYXBCYXNlbmFtZShvcHRpb25zXywgdGFyZ2V0X2Jhc2VuYW1lLCAmdGFyZ2V0X2Jhc2VuYW1lKTsKKyAgICB9CisgICAgZm9ybWF0KCIjaW5jbHVkZSBcIiQxJC5wcm90by5oXCIgIC8vIElXWVUgcHJhZ21hOiBleHBvcnRcbiIsCisgICAgICAgICAgIHRhcmdldF9iYXNlbmFtZSk7CisgIH0gZWxzZSB7CisgICAgR2VuZXJhdGVMaWJyYXJ5SW5jbHVkZXMocHJpbnRlcik7CisgIH0KKworICBpZiAob3B0aW9uc18udHJhbnNpdGl2ZV9wYl9oKSB7CisgICAgR2VuZXJhdGVEZXBlbmRlbmN5SW5jbHVkZXMocHJpbnRlcik7CisgIH0KKworICAvLyBUaGlzIGlzIHVuZm9ydHVuYXRlbHkgbmVjZXNzYXJ5IGZvciBzb21lIHBsdWdpbnMuIEkgZG9uJ3Qgc2VlIHdoeSB3ZQorICAvLyBuZWVkIHR3byBvZiB0aGUgc2FtZSBpbnNlcnRpb24gcG9pbnRzLgorICAvLyBUT0RPKGdlcmJlbnMpIHJlbW92ZSB0aGlzLgorICBmb3JtYXQoIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcylcbiIpOworCisgIEdlbmVyYXRlTWV0YWRhdGFQcmFnbWEocHJpbnRlciwgaW5mb19wYXRoKTsKKworICBpZiAoIW9wdGlvbnNfLnByb3RvX2gpIHsKKyAgICBHZW5lcmF0ZUhlYWRlcihwcmludGVyKTsKKyAgfSBlbHNlIHsKKyAgICB7CisgICAgICBOYW1lc3BhY2VPcGVuZXIgbnMoTmFtZXNwYWNlKGZpbGVfLCBvcHRpb25zXyksIGZvcm1hdCk7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgIlxuIgorICAgICAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKVxuIik7CisgICAgfQorICAgIGZvcm1hdCgKKyAgICAgICAgIlxuIgorICAgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSlcbiIKKyAgICAgICAgIlxuIik7CisgIH0KKworICBHZW5lcmF0ZUJvdHRvbUhlYWRlckd1YXJkKHByaW50ZXIsIHRydWUpOworfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkRvSW5jbHVkZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGdvb2dsZTNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvX2V4cG9ydCwgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gIm5ldC9wcm90bzIvIjsKKyAgR09PR0xFX0NIRUNLKGdvb2dsZTNfbmFtZS5maW5kKHByZWZpeCkgPT0gMCkgPDwgZ29vZ2xlM19uYW1lOworCisgIGlmIChvcHRpb25zXy5vcGVuc291cmNlX3J1bnRpbWUpIHsKKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gZ29vZ2xlM19uYW1lLnN1YnN0cihwcmVmaXguc2l6ZSgpKTsKKworICAgIHBhdGggPSBTdHJpbmdSZXBsYWNlKHBhdGgsICJpbnRlcm5hbC8iLCAiIiwgZmFsc2UpOworICAgIHBhdGggPSBTdHJpbmdSZXBsYWNlKHBhdGgsICJwcm90by8iLCAiIiwgZmFsc2UpOworICAgIHBhdGggPSBTdHJpbmdSZXBsYWNlKHBhdGgsICJwdWJsaWMvIiwgIiIsIGZhbHNlKTsKKyAgICBpZiAob3B0aW9uc18ucnVudGltZV9pbmNsdWRlX2Jhc2UuZW1wdHkoKSkgeworICAgICAgZm9ybWF0KCIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmLyQxJD4iLCBwYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9ybWF0KCIjaW5jbHVkZSBcIiQxJGdvb2dsZS9wcm90b2J1Zi8kMiRcIiIsCisgICAgICAgICAgICAgb3B0aW9uc18ucnVudGltZV9pbmNsdWRlX2Jhc2UsIHBhdGgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gZ29vZ2xlM19uYW1lOworICAgIC8vIFRoZSBib290c3RyYXBwZWQgcHJvdG8gZ2VuZXJhdGVkIGNvZGUgbmVlZHMgdG8gdXNlIHRoZQorICAgIC8vIHRoaXJkX3BhcnR5L3Byb3RvYnVmIGhlYWRlciBwYXRocyB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXMuCisgICAgaWYgKG9wdGlvbnNfLmJvb3RzdHJhcCkgeworICAgICAgcGF0aCA9IFN0cmluZ1JlcGxhY2UoZ29vZ2xlM19uYW1lLCAibmV0L3Byb3RvMi9wdWJsaWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXJkX3BhcnR5L3Byb3RvYnVmIiwgZmFsc2UpOworICAgIH0KKyAgICBmb3JtYXQoIiNpbmNsdWRlIFwiJDEkXCIiLCBwYXRoKTsKKyAgfQorCisgIGlmIChkb19leHBvcnQpIHsKKyAgICBmb3JtYXQoIiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydCIpOworICB9CisKKyAgZm9ybWF0KCJcbiIpOworfQorCitzdGQ6OnN0cmluZyBGaWxlR2VuZXJhdG9yOjpDcmVhdGVIZWFkZXJJbmNsdWRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgYm9vbCB1c2Vfc3lzdGVtX2luY2x1ZGUgPSBmYWxzZTsKKyAgc3RkOjpzdHJpbmcgbmFtZSA9IGJhc2VuYW1lOworCisgIGlmIChvcHRpb25zXy5vcGVuc291cmNlX3J1bnRpbWUpIHsKKyAgICBpZiAoSXNXZWxsS25vd25NZXNzYWdlKGZpbGUpKSB7CisgICAgICBpZiAob3B0aW9uc18ucnVudGltZV9pbmNsdWRlX2Jhc2UuZW1wdHkoKSkgeworICAgICAgICB1c2Vfc3lzdGVtX2luY2x1ZGUgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmFtZSA9IG9wdGlvbnNfLnJ1bnRpbWVfaW5jbHVkZV9iYXNlICsgYmFzZW5hbWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RkOjpzdHJpbmcgbGVmdCA9ICJcIiI7CisgIHN0ZDo6c3RyaW5nIHJpZ2h0ID0gIlwiIjsKKyAgaWYgKHVzZV9zeXN0ZW1faW5jbHVkZSkgeworICAgIGxlZnQgPSAiPCI7CisgICAgcmlnaHQgPSAiPiI7CisgIH0KKyAgcmV0dXJuIGxlZnQgKyBuYW1lICsgcmlnaHQ7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVTb3VyY2VJbmNsdWRlcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBzdGQ6OnN0cmluZyB0YXJnZXRfYmFzZW5hbWUgPSBTdHJpcFByb3RvKGZpbGVfLT5uYW1lKCkpOworICBpZiAoIW9wdGlvbnNfLm9wZW5zb3VyY2VfcnVudGltZSkgeworICAgIEdldEJvb3RzdHJhcEJhc2VuYW1lKG9wdGlvbnNfLCB0YXJnZXRfYmFzZW5hbWUsICZ0YXJnZXRfYmFzZW5hbWUpOworICB9CisgIHRhcmdldF9iYXNlbmFtZSArPSBvcHRpb25zXy5wcm90b19oID8gIi5wcm90by5oIiA6ICIucGIuaCI7CisgIGZvcm1hdCgKKyAgICAgICIvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIVxuIgorICAgICAgIi8vIHNvdXJjZTogJGZpbGVuYW1lJFxuIgorICAgICAgIlxuIgorICAgICAgIiNpbmNsdWRlICQxJFxuIgorICAgICAgIlxuIgorICAgICAgIiNpbmNsdWRlIDxhbGdvcml0aG0+XG4iICAvLyBmb3Igc3dhcCgpCisgICAgICAiXG4iLAorICAgICAgQ3JlYXRlSGVhZGVySW5jbHVkZSh0YXJnZXRfYmFzZW5hbWUsIGZpbGVfKSk7CisKKyAgSW5jbHVkZUZpbGUoIm5ldC9wcm90bzIvaW8vcHVibGljL2NvZGVkX3N0cmVhbS5oIiwgcHJpbnRlcik7CisgIC8vIFRPRE8oZ2VyYmVucykgVGhpcyBpcyB0byBpbmNsdWRlIHBhcnNlX2NvbnRleHQuaCwgd2UgbmVlZCBhIGJldHRlciB3YXkKKyAgSW5jbHVkZUZpbGUoIm5ldC9wcm90bzIvcHVibGljL2V4dGVuc2lvbl9zZXQuaCIsIHByaW50ZXIpOworICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9wdWJsaWMvd2lyZV9mb3JtYXRfbGl0ZS5oIiwgcHJpbnRlcik7CisKKyAgLy8gVW5rbm93biBmaWVsZHMgaW1wbGVtZW50YXRpb24gaW4gbGl0ZSBtb2RlIHVzZXMgU3RyaW5nT3V0cHV0U3RyZWFtCisgIGlmICghVXNlVW5rbm93bkZpZWxkU2V0KGZpbGVfLCBvcHRpb25zXykgJiYgIW1lc3NhZ2VfZ2VuZXJhdG9yc18uZW1wdHkoKSkgeworICAgIEluY2x1ZGVGaWxlKCJuZXQvcHJvdG8yL2lvL3B1YmxpYy96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oIiwgcHJpbnRlcik7CisgIH0KKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8sIG9wdGlvbnNfKSkgeworICAgIEluY2x1ZGVGaWxlKCJuZXQvcHJvdG8yL3B1YmxpYy9kZXNjcmlwdG9yLmgiLCBwcmludGVyKTsKKyAgICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9wdWJsaWMvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oIiwgcHJpbnRlcik7CisgICAgSW5jbHVkZUZpbGUoIm5ldC9wcm90bzIvcHVibGljL3JlZmxlY3Rpb25fb3BzLmgiLCBwcmludGVyKTsKKyAgICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9wdWJsaWMvd2lyZV9mb3JtYXQuaCIsIHByaW50ZXIpOworICB9CisKKyAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZmlsZV8sIG9wdGlvbnNfKSAmJgorICAgICAgb3B0aW9uc18udGN0YWJsZV9tb2RlICE9IE9wdGlvbnM6OmtUQ1RhYmxlTmV2ZXIpIHsKKyAgICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9wdWJsaWMvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9pbXBsLmgiLCBwcmludGVyKTsKKyAgfQorCisgIGlmIChvcHRpb25zXy5wcm90b19oKSB7CisgICAgLy8gVXNlIHRoZSBzbWFsbGVyIC5wcm90by5oIGZpbGVzLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVwID0gZmlsZV8tPmRlcGVuZGVuY3koaSk7CisgICAgICAvLyBEbyBub3QgaW1wb3J0IHdlYWsgZGVwcy4KKyAgICAgIGlmICghb3B0aW9uc18ub3BlbnNvdXJjZV9ydW50aW1lICYmIElzRGVwV2VhayhkZXApKSBjb250aW51ZTsKKyAgICAgIHN0ZDo6c3RyaW5nIGJhc2VuYW1lID0gU3RyaXBQcm90byhkZXAtPm5hbWUoKSk7CisgICAgICBpZiAoSXNCb290c3RyYXBQcm90byhvcHRpb25zXywgZmlsZV8pKSB7CisgICAgICAgIEdldEJvb3RzdHJhcEJhc2VuYW1lKG9wdGlvbnNfLCBiYXNlbmFtZSwgJmJhc2VuYW1lKTsKKyAgICAgIH0KKyAgICAgIGZvcm1hdCgiI2luY2x1ZGUgXCIkMSQucHJvdG8uaFwiXG4iLCBiYXNlbmFtZSk7CisgICAgfQorICB9CisgIGlmIChIYXNDb3JkRmllbGRzKGZpbGVfLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICIjaW5jbHVkZSBcInRoaXJkX3BhcnR5L2Fic2wvc3RyaW5ncy9pbnRlcm5hbC9zdHJpbmdfY29uc3RhbnQuaFwiXG4iKTsKKyAgfQorCisgIGZvcm1hdCgiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKVxuIik7CisgIEluY2x1ZGVGaWxlKCJuZXQvcHJvdG8yL3B1YmxpYy9wb3J0X2RlZi5pbmMiLCBwcmludGVyKTsKK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZVNvdXJjZVByZWx1ZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKworICAvLyBGb3IgTVNWQyBidWlsZHMsIHdlIHVzZSAjcHJhZ21hIGluaXRfc2VnIHRvIG1vdmUgdGhlIGluaXRpYWxpemF0aW9uIG9mIG91cgorICAvLyBsaWJyYXJpZXMgdG8gaGFwcGVuIGJlZm9yZSB0aGUgdXNlciBjb2RlLgorICAvLyBUaGlzIHdvcmtzYXJvdW5kIHRoZSBmYWN0IHRoYXQgTVNWQyBkb2VzIG5vdCBkbyBjb25zdGFudCBpbml0aWFsaXplcnMgd2hlbgorICAvLyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQuCisgIGZvcm1hdCgiXG5QUk9UT0JVRl9QUkFHTUFfSU5JVF9TRUdcbiIpOworCisgIC8vIEdlbmVyYXRlIGNvbnZlbmllbmNlIGFsaWFzZXMuCisgIGZvcm1hdCgKKyAgICAgICJcbiIKKyAgICAgICJuYW1lc3BhY2UgX3BiID0gOjokMSQ7XG4iCisgICAgICAibmFtZXNwYWNlIF9wYmkgPSBfcGI6OmludGVybmFsO1xuIiwKKyAgICAgIFByb3RvYnVmTmFtZXNwYWNlKG9wdGlvbnNfKSk7CisgIGlmIChIYXNHZW5lcmF0ZWRNZXRob2RzKGZpbGVfLCBvcHRpb25zXykgJiYKKyAgICAgIG9wdGlvbnNfLnRjdGFibGVfbW9kZSAhPSBPcHRpb25zOjprVENUYWJsZU5ldmVyKSB7CisgICAgZm9ybWF0KCJuYW1lc3BhY2UgX2ZsID0gX3BiaTo6ZmllbGRfbGF5b3V0O1xuIik7CisgIH0KKyAgZm9ybWF0KCJcbiIpOworfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlU291cmNlRGVmYXVsdEluc3RhbmNlKGludCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIE1lc3NhZ2VHZW5lcmF0b3IqIGdlbmVyYXRvciA9IG1lc3NhZ2VfZ2VuZXJhdG9yc19baWR4XS5nZXQoKTsKKyAgLy8gR2VuZXJhdGUgdGhlIHNwbGl0IGluc3RhbmNlIGZpcnN0IGJlY2F1c2UgaXQncyBuZWVkZWQgaW4gdGhlIGNvbnN0ZXhwcgorICAvLyBjb25zdHJ1Y3Rvci4KKyAgaWYgKFNob3VsZFNwbGl0KGdlbmVyYXRvci0+ZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIC8vIFVzZSBhIHVuaW9uIHRvIGRpc2FibGUgdGhlIGRlc3RydWN0b3Igb2YgdGhlIF9pbnN0YW5jZSBtZW1iZXIuCisgICAgLy8gV2UgY2FuIGNvbnN0YW50IGluaXRpYWxpemUsIGJ1dCB0aGUgb2JqZWN0IHdpbGwgc3RpbGwgaGF2ZSBhIG5vbi10cml2aWFsCisgICAgLy8gZGVzdHJ1Y3RvciB0aGF0IHdlIG5lZWQgdG8gZWxpZGUuCisgICAgZm9ybWF0KAorICAgICAgICAic3RydWN0ICQxJCB7XG4iCisgICAgICAgICIgIFBST1RPQlVGX0NPTlNURVhQUiAkMSQoKVxuIgorICAgICAgICAiICAgICAgOiBfaW5zdGFuY2V7IiwKKyAgICAgICAgRGVmYXVsdEluc3RhbmNlVHlwZShnZW5lcmF0b3ItPmRlc2NyaXB0b3JfLCBvcHRpb25zXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnNwbGl0PSovdHJ1ZSkpOworICAgIGdlbmVyYXRvci0+R2VuZXJhdGVJbml0RGVmYXVsdFNwbGl0SW5zdGFuY2UocHJpbnRlcik7CisgICAgZm9ybWF0KAorICAgICAgICAifSB7fVxuIgorICAgICAgICAiICB+JDEkKCkge31cbiIKKyAgICAgICAgIiAgdW5pb24ge1xuIgorICAgICAgICAiICAgICQyJCBfaW5zdGFuY2U7XG4iCisgICAgICAgICIgIH07XG4iCisgICAgICAgICJ9O1xuIiwKKyAgICAgICAgRGVmYXVsdEluc3RhbmNlVHlwZShnZW5lcmF0b3ItPmRlc2NyaXB0b3JfLCBvcHRpb25zXywgLypzcGxpdD0qL3RydWUpLAorICAgICAgICBTdHJDYXQoZ2VuZXJhdG9yLT5jbGFzc25hbWVfLCAiOjpJbXBsXzo6U3BsaXQiKSk7CisgICAgLy8gTk9fREVTVFJPWSBpcyBub3QgbmVjZXNzYXJ5IGZvciBjb3JyZWN0bmVzcy4gVGhlIGVtcHR5IGRlc3RydWN0b3IgaXMKKyAgICAvLyBlbm91Z2guIEhvd2V2ZXIsIHRoZSBlbXB0eSBkZXN0cnVjdG9yIGZhaWxzIHRvIGJlIGVsaWRlZCBpbiBzb21lCisgICAgLy8gY29uZmlndXJhdGlvbnMgKGxpa2Ugbm9uLW9wdCBvciB3aXRoIGNlcnRhaW4gc2FuaXRpemVycykuIE5PX0RFU1RST1kgaXMKKyAgICAvLyB0aGVyZSBqdXN0IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYW5kIGJpbmFyeSBzaXplIGluIHRoZXNlIGJ1aWxkcy4KKyAgICBmb3JtYXQoCisgICAgICAgICJQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgIgorICAgICAgICAiUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxICQxJCAkMiQ7XG4iLAorICAgICAgICBEZWZhdWx0SW5zdGFuY2VUeXBlKGdlbmVyYXRvci0+ZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCAvKnNwbGl0PSovdHJ1ZSksCisgICAgICAgIERlZmF1bHRJbnN0YW5jZU5hbWUoZ2VuZXJhdG9yLT5kZXNjcmlwdG9yXywgb3B0aW9uc18sIC8qc3BsaXQ9Ki90cnVlKSk7CisgIH0KKworICBnZW5lcmF0b3ItPkdlbmVyYXRlQ29uc3RleHByQ29uc3RydWN0b3IocHJpbnRlcik7CisgIGZvcm1hdCgKKyAgICAgICJzdHJ1Y3QgJDEkIHtcbiIKKyAgICAgICIgIFBST1RPQlVGX0NPTlNURVhQUiAkMSQoKVxuIgorICAgICAgIiAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fVxuIgorICAgICAgIiAgfiQxJCgpIHt9XG4iCisgICAgICAiICB1bmlvbiB7XG4iCisgICAgICAiICAgICQyJCBfaW5zdGFuY2U7XG4iCisgICAgICAiICB9O1xuIgorICAgICAgIn07XG4iLAorICAgICAgRGVmYXVsdEluc3RhbmNlVHlwZShnZW5lcmF0b3ItPmRlc2NyaXB0b3JfLCBvcHRpb25zXyksCisgICAgICBnZW5lcmF0b3ItPmNsYXNzbmFtZV8pOworICBmb3JtYXQoCisgICAgICAiUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUICIKKyAgICAgICJQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgJDEkICQyJDtcbiIsCisgICAgICBEZWZhdWx0SW5zdGFuY2VUeXBlKGdlbmVyYXRvci0+ZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSwKKyAgICAgIERlZmF1bHRJbnN0YW5jZU5hbWUoZ2VuZXJhdG9yLT5kZXNjcmlwdG9yXywgb3B0aW9uc18pKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGdlbmVyYXRvci0+ZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBnZW5lcmF0b3ItPmRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBpZiAoSXNTdHJpbmdJbmxpbmVkKGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgIC8vIEZvcmNlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgaW5saW5lZCBzdHJpbmcgaW4gdGhlIGRlZmF1bHQgaW5zdGFuY2UuCisgICAgICBmb3JtYXQoCisgICAgICAgICAgIlBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMiBzdGQ6OnRydWVfdHlwZSAiCisgICAgICAgICAgIiQxJDo6SW1wbF86Ol9pbml0X2lubGluZV8kMiRfID0gIgorICAgICAgICAgICIoJDMkLl9pbnN0YW5jZS4kNCQuSW5pdCgpLCBzdGQ6OnRydWVfdHlwZXt9KTtcbiIsCisgICAgICAgICAgQ2xhc3NOYW1lKGdlbmVyYXRvci0+ZGVzY3JpcHRvcl8pLCBGaWVsZE5hbWUoZmllbGQpLAorICAgICAgICAgIERlZmF1bHRJbnN0YW5jZU5hbWUoZ2VuZXJhdG9yLT5kZXNjcmlwdG9yXywgb3B0aW9uc18pLAorICAgICAgICAgIEZpZWxkTWVtYmVyTmFtZShmaWVsZCwgU2hvdWxkU3BsaXQoZmllbGQsIG9wdGlvbnNfKSkpOworICAgIH0KKyAgfQorCisgIGlmIChvcHRpb25zXy5saXRlX2ltcGxpY2l0X3dlYWtfZmllbGRzKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiUFJPVE9CVUZfQ09OU1RJTklUIGNvbnN0IHZvaWQqICQxJCA9XG4iCisgICAgICAgICIgICAgJiQyJDtcbiIsCisgICAgICAgIERlZmF1bHRJbnN0YW5jZVB0cihnZW5lcmF0b3ItPmRlc2NyaXB0b3JfLCBvcHRpb25zXyksCisgICAgICAgIERlZmF1bHRJbnN0YW5jZU5hbWUoZ2VuZXJhdG9yLT5kZXNjcmlwdG9yXywgb3B0aW9uc18pKTsKKyAgfQorfQorCisvLyBBIGxpc3Qgb2YgdGhpbmdzIGRlZmluZWQgaW4gb25lIC5wYi5jYyBmaWxlIHRoYXQgd2UgbmVlZCB0byByZWZlcmVuY2UgZnJvbQorLy8gYW5vdGhlciAucGIuY2MgZmlsZS4KK3N0cnVjdCBGaWxlR2VuZXJhdG9yOjpDcm9zc0ZpbGVSZWZlcmVuY2VzIHsKKyAgLy8gUG9wdWxhdGVkIGlmIHdlIGFyZSByZWZlcmVuY2luZyBmcm9tIG1lc3NhZ2VzIG9yIGZpbGVzLgorICBzdGQ6OnVub3JkZXJlZF9zZXQ8Y29uc3QgRGVzY3JpcHRvcio+IHdlYWtfZGVmYXVsdF9pbnN0YW5jZXM7CisKKyAgLy8gT25seSBpZiB3ZSBhcmUgcmVmZXJlbmNpbmcgZnJvbSBmaWxlcy4KKyAgc3RkOjp1bm9yZGVyZWRfc2V0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gc3Ryb25nX3JlZmxlY3Rpb25fZmlsZXM7CisgIHN0ZDo6dW5vcmRlcmVkX3NldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IHdlYWtfcmVmbGVjdGlvbl9maWxlczsKK307CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2V0Q3Jvc3NGaWxlUmVmZXJlbmNlc0ZvckZpZWxkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc0ZpbGVSZWZlcmVuY2VzKiByZWZzKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIG1zZyA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKKyAgaWYgKG1zZyA9PSBudWxscHRyKSByZXR1cm47CisKKyAgaWYgKElzSW1wbGljaXRXZWFrRmllbGQoZmllbGQsIG9wdGlvbnNfLCAmc2NjX2FuYWx5emVyXykgfHwKKyAgICAgIElzV2VhayhmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgcmVmcy0+d2Vha19kZWZhdWx0X2luc3RhbmNlcy5pbnNlcnQobXNnKTsKKyAgfQorfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdldENyb3NzRmlsZVJlZmVyZW5jZXNGb3JGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc0ZpbGVSZWZlcmVuY2VzKiByZWZzKSB7CisgIEZvckVhY2hGaWVsZChmaWxlLCBbdGhpcywgcmVmc10oY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAgIEdldENyb3NzRmlsZVJlZmVyZW5jZXNGb3JGaWVsZChmaWVsZCwgcmVmcyk7CisgIH0pOworCisgIGlmICghSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZSwgb3B0aW9uc18pKSByZXR1cm47CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXAgPSBmaWxlLT5kZXBlbmRlbmN5KGkpOworICAgIGlmIChJc0RlcFdlYWsoZGVwKSkgeworICAgICAgcmVmcy0+d2Vha19yZWZsZWN0aW9uX2ZpbGVzLmluc2VydChkZXApOworICAgIH0gZWxzZSB7CisgICAgICByZWZzLT5zdHJvbmdfcmVmbGVjdGlvbl9maWxlcy5pbnNlcnQoZGVwKTsKKyAgICB9CisgIH0KK30KKworLy8gR2VuZXJhdGVzIHJlZmVyZW5jZXMgdG8gdmFyaWFibGVzIGRlZmluZWQgaW4gb3RoZXIgZmlsZXMuCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJuYWxGb3J3YXJkRGVjbGFyYXRpb25zKAorICAgIGNvbnN0IENyb3NzRmlsZVJlZmVyZW5jZXMmIHJlZnMsIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisKKyAgeworICAgIE5hbWVzcGFjZU9wZW5lciBucyhmb3JtYXQpOworICAgIGZvciAoYXV0byBpbnN0YW5jZSA6IFNvcnRlZChyZWZzLndlYWtfZGVmYXVsdF9pbnN0YW5jZXMpKSB7CisgICAgICBucy5DaGFuZ2VUbyhOYW1lc3BhY2UoaW5zdGFuY2UsIG9wdGlvbnNfKSk7CisgICAgICBpZiAob3B0aW9uc18ubGl0ZV9pbXBsaWNpdF93ZWFrX2ZpZWxkcykgeworICAgICAgICBmb3JtYXQoCisgICAgICAgICAgICAiUFJPVE9CVUZfQ09OU1RJTklUIF9fYXR0cmlidXRlX18oKHdlYWspKSBjb25zdCB2b2lkKiAkMSQgPVxuIgorICAgICAgICAgICAgIiAgICAmOjpfcGJpOjppbXBsaWNpdF93ZWFrX21lc3NhZ2VfZGVmYXVsdF9pbnN0YW5jZTtcbiIsCisgICAgICAgICAgICBEZWZhdWx0SW5zdGFuY2VQdHIoaW5zdGFuY2UsIG9wdGlvbnNfKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXQoImV4dGVybiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgJDEkICQyJDtcbiIsCisgICAgICAgICAgICAgICBEZWZhdWx0SW5zdGFuY2VUeXBlKGluc3RhbmNlLCBvcHRpb25zXyksCisgICAgICAgICAgICAgICBEZWZhdWx0SW5zdGFuY2VOYW1lKGluc3RhbmNlLCBvcHRpb25zXykpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoYXV0byBmaWxlIDogU29ydGVkKHJlZnMud2Vha19yZWZsZWN0aW9uX2ZpbGVzKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgImV4dGVybiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgY29uc3QgOjpfcGJpOjpEZXNjcmlwdG9yVGFibGUgJDEkO1xuIiwKKyAgICAgICAgRGVzY3JpcHRvclRhYmxlTmFtZShmaWxlLCBvcHRpb25zXykpOworICB9Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVTb3VyY2VGb3JNZXNzYWdlKGludCBpZHgsIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIEdlbmVyYXRlU291cmNlSW5jbHVkZXMocHJpbnRlcik7CisgIEdlbmVyYXRlU291cmNlUHJlbHVkZShwcmludGVyKTsKKworICBpZiAoSXNBbnlNZXNzYWdlKGZpbGVfLCBvcHRpb25zXykpIE11dGVXdW5pbml0aWFsaXplZChmb3JtYXQpOworCisgIENyb3NzRmlsZVJlZmVyZW5jZXMgcmVmczsKKyAgRm9yRWFjaEZpZWxkKG1lc3NhZ2VfZ2VuZXJhdG9yc19baWR4XS0+ZGVzY3JpcHRvcl8sCisgICAgICAgICAgICAgICBbdGhpcywgJnJlZnNdKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgICAgICAgICAgICAgICAgR2V0Q3Jvc3NGaWxlUmVmZXJlbmNlc0ZvckZpZWxkKGZpZWxkLCAmcmVmcyk7CisgICAgICAgICAgICAgICB9KTsKKyAgR2VuZXJhdGVJbnRlcm5hbEZvcndhcmREZWNsYXJhdGlvbnMocmVmcywgcHJpbnRlcik7CisKKyAgeyAgLy8gcGFja2FnZSBuYW1lc3BhY2UKKyAgICBOYW1lc3BhY2VPcGVuZXIgbnMoTmFtZXNwYWNlKGZpbGVfLCBvcHRpb25zXyksIGZvcm1hdCk7CisKKyAgICAvLyBEZWZpbmUgZGVmYXVsdCBpbnN0YW5jZXMKKyAgICBHZW5lcmF0ZVNvdXJjZURlZmF1bHRJbnN0YW5jZShpZHgsIHByaW50ZXIpOworCisgICAgLy8gR2VuZXJhdGUgY2xhc3Nlcy4KKyAgICBmb3JtYXQoIlxuIik7CisgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpZHhdLT5HZW5lcmF0ZUNsYXNzTWV0aG9kcyhwcmludGVyKTsKKworICAgIGZvcm1hdCgKKyAgICAgICAgIlxuIgorICAgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSlcbiIpOworICB9ICAvLyBlbmQgcGFja2FnZSBuYW1lc3BhY2UKKworICB7CisgICAgTmFtZXNwYWNlT3BlbmVyIHByb3RvX25zKFByb3RvYnVmTmFtZXNwYWNlKG9wdGlvbnNfKSwgZm9ybWF0KTsKKyAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2lkeF0tPkdlbmVyYXRlU291cmNlSW5Qcm90bzJOYW1lc3BhY2UocHJpbnRlcik7CisgIH0KKworICBpZiAoSXNBbnlNZXNzYWdlKGZpbGVfLCBvcHRpb25zXykpIFVubXV0ZVd1bmluaXRpYWxpemVkKGZvcm1hdCk7CisKKyAgZm9ybWF0KAorICAgICAgIlxuIgorICAgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpXG4iKTsKK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZVNvdXJjZUZvckV4dGVuc2lvbihpbnQgaWR4LCBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBHZW5lcmF0ZVNvdXJjZUluY2x1ZGVzKHByaW50ZXIpOworICBHZW5lcmF0ZVNvdXJjZVByZWx1ZGUocHJpbnRlcik7CisgIE5hbWVzcGFjZU9wZW5lciBucyhOYW1lc3BhY2UoZmlsZV8sIG9wdGlvbnNfKSwgZm9ybWF0KTsKKyAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2lkeF0tPkdlbmVyYXRlRGVmaW5pdGlvbihwcmludGVyKTsKK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZUdsb2JhbFNvdXJjZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBHZW5lcmF0ZVNvdXJjZUluY2x1ZGVzKHByaW50ZXIpOworICBHZW5lcmF0ZVNvdXJjZVByZWx1ZGUocHJpbnRlcik7CisKKyAgeworICAgIC8vIERlZmluZSB0aGUgY29kZSB0byBpbml0aWFsaXplIHJlZmxlY3Rpb24uIFRoaXMgY29kZSB1c2VzIGEgZ2xvYmFsCisgICAgLy8gY29uc3RydWN0b3IgdG8gcmVnaXN0ZXIgcmVmbGVjdGlvbiBkYXRhIHdpdGggdGhlIHJ1bnRpbWUgcHJlLW1haW4uCisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBvcHRpb25zXykpIHsKKyAgICAgIEdlbmVyYXRlUmVmbGVjdGlvbkluaXRpYWxpemF0aW9uQ29kZShwcmludGVyKTsKKyAgICB9CisgIH0KKworICBOYW1lc3BhY2VPcGVuZXIgbnMoTmFtZXNwYWNlKGZpbGVfLCBvcHRpb25zXyksIGZvcm1hdCk7CisKKyAgLy8gR2VuZXJhdGUgZW51bXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV9nZW5lcmF0b3JzXy5zaXplKCk7IGkrKykgeworICAgIGVudW1fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlTWV0aG9kcyhpLCBwcmludGVyKTsKKyAgfQorfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlU291cmNlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIEdlbmVyYXRlU291cmNlSW5jbHVkZXMocHJpbnRlcik7CisgIEdlbmVyYXRlU291cmNlUHJlbHVkZShwcmludGVyKTsKKyAgQ3Jvc3NGaWxlUmVmZXJlbmNlcyByZWZzOworICBHZXRDcm9zc0ZpbGVSZWZlcmVuY2VzRm9yRmlsZShmaWxlXywgJnJlZnMpOworICBHZW5lcmF0ZUludGVybmFsRm9yd2FyZERlY2xhcmF0aW9ucyhyZWZzLCBwcmludGVyKTsKKworICBpZiAoSXNBbnlNZXNzYWdlKGZpbGVfLCBvcHRpb25zXykpIE11dGVXdW5pbml0aWFsaXplZChmb3JtYXQpOworCisgIHsKKyAgICBOYW1lc3BhY2VPcGVuZXIgbnMoTmFtZXNwYWNlKGZpbGVfLCBvcHRpb25zXyksIGZvcm1hdCk7CisKKyAgICAvLyBEZWZpbmUgZGVmYXVsdCBpbnN0YW5jZXMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfZ2VuZXJhdG9yc18uc2l6ZSgpOyBpKyspIHsKKyAgICAgIEdlbmVyYXRlU291cmNlRGVmYXVsdEluc3RhbmNlKGksIHByaW50ZXIpOworICAgIH0KKyAgfQorCisgIHsKKyAgICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8sIG9wdGlvbnNfKSkgeworICAgICAgLy8gRGVmaW5lIHRoZSBjb2RlIHRvIGluaXRpYWxpemUgcmVmbGVjdGlvbi4gVGhpcyBjb2RlIHVzZXMgYSBnbG9iYWwKKyAgICAgIC8vIGNvbnN0cnVjdG9yIHRvIHJlZ2lzdGVyIHJlZmxlY3Rpb24gZGF0YSB3aXRoIHRoZSBydW50aW1lIHByZS1tYWluLgorICAgICAgR2VuZXJhdGVSZWZsZWN0aW9uSW5pdGlhbGl6YXRpb25Db2RlKHByaW50ZXIpOworICAgIH0KKyAgfQorCisgIHsKKyAgICBOYW1lc3BhY2VPcGVuZXIgbnMoTmFtZXNwYWNlKGZpbGVfLCBvcHRpb25zXyksIGZvcm1hdCk7CisKKyAgICAvLyBBY3R1YWxseSBpbXBsZW1lbnQgdGhlIHByb3RvcworCisgICAgLy8gR2VuZXJhdGUgZW51bXMuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtX2dlbmVyYXRvcnNfLnNpemUoKTsgaSsrKSB7CisgICAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZU1ldGhvZHMoaSwgcHJpbnRlcik7CisgICAgfQorCisgICAgLy8gR2VuZXJhdGUgY2xhc3Nlcy4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfZ2VuZXJhdG9yc18uc2l6ZSgpOyBpKyspIHsKKyAgICAgIGZvcm1hdCgiXG4iKTsKKyAgICAgIGZvcm1hdChrVGhpY2tTZXBhcmF0b3IpOworICAgICAgZm9ybWF0KCJcbiIpOworICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVDbGFzc01ldGhvZHMocHJpbnRlcik7CisgICAgfQorCisgICAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlXywgb3B0aW9uc18pKSB7CisgICAgICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcy4KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZV9nZW5lcmF0b3JzXy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaSA9PSAwKSBmb3JtYXQoIlxuIik7CisgICAgICAgIGZvcm1hdChrVGhpY2tTZXBhcmF0b3IpOworICAgICAgICBmb3JtYXQoIlxuIik7CisgICAgICAgIHNlcnZpY2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlSW1wbGVtZW50YXRpb24ocHJpbnRlcik7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRGVmaW5lIGV4dGVuc2lvbnMuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25fZ2VuZXJhdG9yc18uc2l6ZSgpOyBpKyspIHsKKyAgICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWZpbml0aW9uKHByaW50ZXIpOworICAgIH0KKworICAgIGZvcm1hdCgKKyAgICAgICAgIlxuIgorICAgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSlcbiIpOworICB9CisKKyAgeworICAgIE5hbWVzcGFjZU9wZW5lciBwcm90b19ucyhQcm90b2J1Zk5hbWVzcGFjZShvcHRpb25zXyksIGZvcm1hdCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX2dlbmVyYXRvcnNfLnNpemUoKTsgaSsrKSB7CisgICAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZVNvdXJjZUluUHJvdG8yTmFtZXNwYWNlKHByaW50ZXIpOworICAgIH0KKyAgfQorCisgIGZvcm1hdCgKKyAgICAgICJcbiIKKyAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKVxuIik7CisKKyAgaWYgKElzQW55TWVzc2FnZShmaWxlXywgb3B0aW9uc18pKSBVbm11dGVXdW5pbml0aWFsaXplZChmb3JtYXQpOworCisgIEluY2x1ZGVGaWxlKCJuZXQvcHJvdG8yL3B1YmxpYy9wb3J0X3VuZGVmLmluYyIsIHByaW50ZXIpOworfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlUmVmbGVjdGlvbkluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworCisgIGlmICghbWVzc2FnZV9nZW5lcmF0b3JzXy5lbXB0eSgpKSB7CisgICAgZm9ybWF0KCJzdGF0aWMgOjpfcGI6Ok1ldGFkYXRhICRmaWxlX2xldmVsX21ldGFkYXRhJFskMSRdO1xuIiwKKyAgICAgICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzXy5zaXplKCkpOworICB9CisgIGlmICghZW51bV9nZW5lcmF0b3JzXy5lbXB0eSgpKSB7CisgICAgZm9ybWF0KAorICAgICAgICAic3RhdGljIGNvbnN0IDo6X3BiOjpFbnVtRGVzY3JpcHRvciogIgorICAgICAgICAiJGZpbGVfbGV2ZWxfZW51bV9kZXNjcmlwdG9ycyRbJDEkXTtcbiIsCisgICAgICAgIGVudW1fZ2VuZXJhdG9yc18uc2l6ZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJzdGF0aWMgIgorICAgICAgICAiY29uc3RleHByIDo6X3BiOjpFbnVtRGVzY3JpcHRvciBjb25zdCoqICIKKyAgICAgICAgIiRmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnMkID0gbnVsbHB0cjtcbiIpOworICB9CisgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8sIG9wdGlvbnNfKSAmJiBmaWxlXy0+c2VydmljZV9jb3VudCgpID4gMCkgeworICAgIGZvcm1hdCgKKyAgICAgICAgInN0YXRpYyAiCisgICAgICAgICJjb25zdCA6Ol9wYjo6U2VydmljZURlc2NyaXB0b3IqICIKKyAgICAgICAgIiRmaWxlX2xldmVsX3NlcnZpY2VfZGVzY3JpcHRvcnMkWyQxJF07XG4iLAorICAgICAgICBmaWxlXy0+c2VydmljZV9jb3VudCgpKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJzdGF0aWMgIgorICAgICAgICAiY29uc3RleHByIDo6X3BiOjpTZXJ2aWNlRGVzY3JpcHRvciBjb25zdCoqICIKKyAgICAgICAgIiRmaWxlX2xldmVsX3NlcnZpY2VfZGVzY3JpcHRvcnMkID0gbnVsbHB0cjtcbiIpOworICB9CisKKyAgaWYgKCFtZXNzYWdlX2dlbmVyYXRvcnNfLmVtcHR5KCkpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJcbiIKKyAgICAgICAgImNvbnN0ICR1aW50MzIkICR0YWJsZW5hbWUkOjpvZmZzZXRzW10gIgorICAgICAgICAiUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRShwcm90b2Rlc2NfY29sZCkgPSB7XG4iKTsKKyAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiA+IHBhaXJzOworICAgIHBhaXJzLnJlc2VydmUobWVzc2FnZV9nZW5lcmF0b3JzXy5zaXplKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV9nZW5lcmF0b3JzXy5zaXplKCk7IGkrKykgeworICAgICAgcGFpcnMucHVzaF9iYWNrKG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlT2Zmc2V0cyhwcmludGVyKSk7CisgICAgfQorICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgZm9ybWF0KAorICAgICAgICAifTtcbiIKKyAgICAgICAgInN0YXRpYyBjb25zdCA6Ol9wYmk6Ok1pZ3JhdGlvblNjaGVtYSBzY2hlbWFzW10gIgorICAgICAgICAiUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRShwcm90b2Rlc2NfY29sZCkgPSB7XG4iKTsKKyAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgeworICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfZ2VuZXJhdG9yc18uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVTY2hlbWEocHJpbnRlciwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyc1tpXS5zZWNvbmQpOworICAgICAgICBvZmZzZXQgKz0gcGFpcnNbaV0uZmlyc3Q7CisgICAgICB9CisgICAgfQorICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgZm9ybWF0KAorICAgICAgICAifTtcbiIKKyAgICAgICAgIlxuc3RhdGljIGNvbnN0IDo6X3BiOjpNZXNzYWdlKiBjb25zdCBmaWxlX2RlZmF1bHRfaW5zdGFuY2VzW10gPSB7XG4iKTsKKyAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX2dlbmVyYXRvcnNfLnNpemUoKTsgaSsrKSB7CisgICAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+ZGVzY3JpcHRvcl87CisgICAgICBmb3JtYXQoIiYkMSQ6Ol8kMiRfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLFxuIiwKKyAgICAgICAgICAgICBOYW1lc3BhY2UoZGVzY3JpcHRvciwgb3B0aW9uc18pLCAgLy8gMQorICAgICAgICAgICAgIENsYXNzTmFtZShkZXNjcmlwdG9yKSk7ICAgICAgICAgICAvLyAyCisgICAgfQorICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgZm9ybWF0KAorICAgICAgICAifTtcbiIKKyAgICAgICAgIlxuIik7CisgIH0gZWxzZSB7CisgICAgLy8gd2Ugc3RpbGwgbmVlZCB0aGVzZSBzeW1ib2xzIHRvIGV4aXN0CisgICAgZm9ybWF0KAorICAgICAgICAvLyBNU1ZDIGRvZXNuJ3QgbGlrZSBlbXB0eSBhcnJheXMsIHNvIHdlIGFkZCBhIGR1bW15LgorICAgICAgICAiY29uc3QgJHVpbnQzMiQgJHRhYmxlbmFtZSQ6Om9mZnNldHNbMV0gPSB7fTtcbiIKKyAgICAgICAgInN0YXRpYyBjb25zdGV4cHIgOjpfcGJpOjpNaWdyYXRpb25TY2hlbWEqIHNjaGVtYXMgPSBudWxscHRyO1xuIgorICAgICAgICAic3RhdGljIGNvbnN0ZXhwciA6Ol9wYjo6TWVzc2FnZSogY29uc3QqICIKKyAgICAgICAgImZpbGVfZGVmYXVsdF9pbnN0YW5jZXMgPSBudWxscHRyO1xuIgorICAgICAgICAiXG4iKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIEVtYmVkIHRoZSBkZXNjcmlwdG9yLiAgV2Ugc2ltcGx5IHNlcmlhbGl6ZSB0aGUgZW50aXJlCisgIC8vIEZpbGVEZXNjcmlwdG9yUHJvdG8vIGFuZCBlbWJlZCBpdCBhcyBhIHN0cmluZyBsaXRlcmFsLCB3aGljaCBpcyBwYXJzZWQgYW5kCisgIC8vIGJ1aWx0IGludG8gcmVhbCBkZXNjcmlwdG9ycyBhdCBpbml0aWFsaXphdGlvbiB0aW1lLgorICBjb25zdCBzdGQ6OnN0cmluZyBwcm90b2RlZl9uYW1lID0KKyAgICAgIFVuaXF1ZU5hbWUoImRlc2NyaXB0b3JfdGFibGVfcHJvdG9kZWYiLCBmaWxlXywgb3B0aW9uc18pOworICBmb3JtYXQoImNvbnN0IGNoYXIgJDEkW10gUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRShwcm90b2Rlc2NfY29sZCkgPVxuIiwKKyAgICAgICAgIHByb3RvZGVmX25hbWUpOworICBmb3JtYXQuSW5kZW50KCk7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgZmlsZV8tPkNvcHlUbygmZmlsZV9wcm90byk7CisgIHN0ZDo6c3RyaW5nIGZpbGVfZGF0YTsKKyAgZmlsZV9wcm90by5TZXJpYWxpemVUb1N0cmluZygmZmlsZV9kYXRhKTsKKworICB7CisgICAgaWYgKGZpbGVfZGF0YS5zaXplKCkgPiA2NTUzNSkgeworICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgTVNWQzogIkVycm9yIEMxMDkxOiBjb21waWxlciBsaW1pdDogc3RyaW5nIGV4Y2VlZHMKKyAgICAgIC8vIDY1NTM1IGJ5dGVzIGluIGxlbmd0aCIuIERlY2xhcmUgYSBzdGF0aWMgYXJyYXkgb2YgY2hhcnMgcmF0aGVyIHRoYW4KKyAgICAgIC8vIHVzZSBhIHN0cmluZyBsaXRlcmFsLiBPbmx5IHdyaXRlIDI1IGJ5dGVzIHBlciBsaW5lLgorICAgICAgc3RhdGljIGNvbnN0IGludCBrQnl0ZXNQZXJMaW5lID0gMjU7CisgICAgICBmb3JtYXQoInsgIik7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfZGF0YS5zaXplKCk7KSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwga0J5dGVzUGVyTGluZSAmJiBpIDwgZmlsZV9kYXRhLnNpemUoKTsgKytpLCArK2opIHsKKyAgICAgICAgICBmb3JtYXQoIickMSQnLCAiLCBDRXNjYXBlKGZpbGVfZGF0YS5zdWJzdHIoaSwgMSkpKTsKKyAgICAgICAgfQorICAgICAgICBmb3JtYXQoIlxuIik7CisgICAgICB9CisgICAgICBmb3JtYXQoIidcXDAnIH0iKTsgIC8vIG51bGwtdGVybWluYXRlCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE9ubHkgd3JpdGUgNDAgYnl0ZXMgcGVyIGxpbmUuCisgICAgICBzdGF0aWMgY29uc3QgaW50IGtCeXRlc1BlckxpbmUgPSA0MDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV9kYXRhLnNpemUoKTsgaSArPSBrQnl0ZXNQZXJMaW5lKSB7CisgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICJcIiQxJFwiXG4iLAorICAgICAgICAgICAgRXNjYXBlVHJpZ3JhcGhzKENFc2NhcGUoZmlsZV9kYXRhLnN1YnN0cihpLCBrQnl0ZXNQZXJMaW5lKSkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9ybWF0KCI7XG4iKTsKKyAgfQorICBmb3JtYXQuT3V0ZGVudCgpOworCisgIENyb3NzRmlsZVJlZmVyZW5jZXMgcmVmczsKKyAgR2V0Q3Jvc3NGaWxlUmVmZXJlbmNlc0ZvckZpbGUoZmlsZV8sICZyZWZzKTsKKyAgaW50IG51bV9kZXBzID0KKyAgICAgIHJlZnMuc3Ryb25nX3JlZmxlY3Rpb25fZmlsZXMuc2l6ZSgpICsgcmVmcy53ZWFrX3JlZmxlY3Rpb25fZmlsZXMuc2l6ZSgpOworCisgIC8vIEJ1aWxkIGFycmF5IG9mIERlc2NyaXB0b3JUYWJsZSBkZXBzLgorICBpZiAobnVtX2RlcHMgPiAwKSB7CisgICAgZm9ybWF0KAorICAgICAgICAic3RhdGljIGNvbnN0IDo6X3BiaTo6RGVzY3JpcHRvclRhYmxlKiBjb25zdCAiCisgICAgICAgICIkZGVzY190YWJsZSRfZGVwc1skMSRdID0ge1xuIiwKKyAgICAgICAgbnVtX2RlcHMpOworCisgICAgZm9yIChhdXRvIGRlcCA6IFNvcnRlZChyZWZzLnN0cm9uZ19yZWZsZWN0aW9uX2ZpbGVzKSkgeworICAgICAgZm9ybWF0KCIgICY6OiQxJCxcbiIsIERlc2NyaXB0b3JUYWJsZU5hbWUoZGVwLCBvcHRpb25zXykpOworICAgIH0KKyAgICBmb3IgKGF1dG8gZGVwIDogU29ydGVkKHJlZnMud2Vha19yZWZsZWN0aW9uX2ZpbGVzKSkgeworICAgICAgZm9ybWF0KCIgICY6OiQxJCxcbiIsIERlc2NyaXB0b3JUYWJsZU5hbWUoZGVwLCBvcHRpb25zXykpOworICAgIH0KKworICAgIGZvcm1hdCgifTtcbiIpOworICB9CisKKyAgLy8gVGhlIERlc2NyaXB0b3JUYWJsZSBpdHNlbGYuCisgIC8vIFNob3VsZCBiZSAiYm9vbCBlYWdlciA9IE5lZWRzRWFnZXJEZXNjcmlwdG9yQXNzaWdubWVudChmaWxlXywgb3B0aW9uc18pOyIKKyAgLy8gaG93ZXZlciB0aGlzIG1pZ2h0IGNhdXNlIGEgdHNhbiBmYWlsdXJlIGluIHN1cGVycm9vdCBiLzE0ODM4Mjg3OSwKKyAgLy8gc28gZGlzYWJsZSBmb3Igbm93LgorICBib29sIGVhZ2VyID0gZmFsc2U7CisgIGZvcm1hdCgKKyAgICAgICJzdGF0aWMgOjpfcGJpOjpvbmNlX2ZsYWcgJGRlc2NfdGFibGUkX29uY2U7XG4iCisgICAgICAiY29uc3QgOjpfcGJpOjpEZXNjcmlwdG9yVGFibGUgJGRlc2NfdGFibGUkID0ge1xuIgorICAgICAgIiAgICBmYWxzZSwgJDEkLCAkMiQsICQzJCxcbiIKKyAgICAgICIgICAgXCIkZmlsZW5hbWUkXCIsXG4iCisgICAgICAiICAgICYkZGVzY190YWJsZSRfb25jZSwgJDQkLCAkNSQsICQ2JCxcbiIKKyAgICAgICIgICAgc2NoZW1hcywgZmlsZV9kZWZhdWx0X2luc3RhbmNlcywgJHRhYmxlbmFtZSQ6Om9mZnNldHMsXG4iCisgICAgICAiICAgICQ3JCwgJGZpbGVfbGV2ZWxfZW51bV9kZXNjcmlwdG9ycyQsXG4iCisgICAgICAiICAgICRmaWxlX2xldmVsX3NlcnZpY2VfZGVzY3JpcHRvcnMkLFxuIgorICAgICAgIn07XG4iCisgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGV4aXN0cyB0byBiZSBtYXJrZWQgYXMgd2Vhay4KKyAgICAgIC8vIEl0IGNhbiBzaWduaWZpY2FudGx5IHNwZWVkIHVwIGNvbXBpbGF0aW9uIGJ5IGJyZWFraW5nIHVwIExMVk0ncyBTQ0MgaW4KKyAgICAgIC8vIHRoZSAucGIuY2MgdHJhbnNsYXRpb24gdW5pdHMuIExhcmdlIHRyYW5zbGF0aW9uIHVuaXRzIHNlZSBhIHJlZHVjdGlvbgorICAgICAgLy8gb2YgbW9yZSB0aGFuIDM1JSBvZiB3YWxsdGltZSBmb3Igb3B0aW1pemVkIGJ1aWxkcy4KKyAgICAgIC8vIFdpdGhvdXQgdGhlIHdlYWsgYXR0cmlidXRlIGFsbCB0aGUgbWVzc2FnZXMgaW4gdGhlIGZpbGUsIGluY2x1ZGluZyBhbGwKKyAgICAgIC8vIHRoZSB2dGFibGVzIGFuZCBldmVyeXRoaW5nIHRoZXkgdXNlIGJlY29tZSBwYXJ0IG9mIHRoZSBzYW1lIFNDQyB0aHJvdWdoCisgICAgICAvLyBhIGN5Y2xlIGxpa2U6CisgICAgICAvLyBHZXRNZXRhZGF0YSAtPiBkZXNjcmlwdG9yIHRhYmxlIC0+IGRlZmF1bHQgaW5zdGFuY2VzIC0+CisgICAgICAvLyAgIHZ0YWJsZXMgLT4gR2V0TWV0YWRhdGEKKyAgICAgIC8vIEJ5IGFkZGluZyBhIHdlYWsgZnVuY3Rpb24gaGVyZSB3ZSBicmVhayB0aGUgY29ubmVjdGlvbiBmcm9tIHRoZQorICAgICAgLy8gaW5kaXZpZHVhbCB2dGFibGVzIGJhY2sgaW50byB0aGUgZGVzY3JpcHRvciB0YWJsZS4KKyAgICAgICJQUk9UT0JVRl9BVFRSSUJVVEVfV0VBSyBjb25zdCA6Ol9wYmk6OkRlc2NyaXB0b3JUYWJsZSogIgorICAgICAgIiRkZXNjX3RhYmxlJF9nZXR0ZXIoKSB7XG4iCisgICAgICAiICByZXR1cm4gJiRkZXNjX3RhYmxlJDtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgZWFnZXIgPyAidHJ1ZSIgOiAiZmFsc2UiLCBmaWxlX2RhdGEuc2l6ZSgpLCBwcm90b2RlZl9uYW1lLAorICAgICAgbnVtX2RlcHMgPT0gMCA/ICJudWxscHRyIiA6IHZhcmlhYmxlc19bImRlc2NfdGFibGUiXSArICJfZGVwcyIsIG51bV9kZXBzLAorICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzXy5zaXplKCksCisgICAgICBtZXNzYWdlX2dlbmVyYXRvcnNfLmVtcHR5KCkgPyAibnVsbHB0ciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHZhcmlhYmxlc19bImZpbGVfbGV2ZWxfbWV0YWRhdGEiXSk7CisKKyAgLy8gRm9yIGRlc2NyaXB0b3IucHJvdG8gd2Ugd2FudCB0byBhdm9pZCBkb2luZyBhbnkgZHluYW1pYyBpbml0aWFsaXphdGlvbiwKKyAgLy8gYmVjYXVzZSBpbiBzb21lIHNpdHVhdGlvbnMgdGhhdCB3b3VsZCBvdGhlcndpc2UgcHVsbCBpbiBhIGxvdCBvZgorICAvLyB1bm5lY2Vzc2FyeSBjb2RlIHRoYXQgY2FuJ3QgYmUgc3RyaXBwZWQgYnkgLS1nYy1zZWN0aW9ucy4gRGVzY3JpcHRvcgorICAvLyBpbml0aWFsaXphdGlvbiB3aWxsIHN0aWxsIGJlIHBlcmZvcm1lZCBsYXppbHkgd2hlbiBpdCdzIG5lZWRlZC4KKyAgaWYgKGZpbGVfLT5uYW1lKCkgIT0gIm5ldC9wcm90bzIvcHJvdG8vZGVzY3JpcHRvci5wcm90byIpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICIvLyBGb3JjZSBydW5uaW5nIEFkZERlc2NyaXB0b3JzKCkgYXQgZHluYW1pYyBpbml0aWFsaXphdGlvbiB0aW1lLlxuIgorICAgICAgICAiUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkyICIKKyAgICAgICAgInN0YXRpYyA6Ol9wYmk6OkFkZERlc2NyaXB0b3JzUnVubmVyICQxJCgmJGRlc2NfdGFibGUkKTtcbiIsCisgICAgICAgIFVuaXF1ZU5hbWUoImR5bmFtaWNfaW5pdF9kdW1teSIsIGZpbGVfLCBvcHRpb25zXykpOworICB9Cit9CisKK2NsYXNzIEZpbGVHZW5lcmF0b3I6OkZvcndhcmREZWNsYXJhdGlvbnMgeworIHB1YmxpYzoKKyAgdm9pZCBBZGRNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3IqIGQpIHsgY2xhc3Nlc19bQ2xhc3NOYW1lKGQpXSA9IGQ7IH0KKyAgdm9pZCBBZGRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkKSB7IGVudW1zX1tDbGFzc05hbWUoZCldID0gZDsgfQorICB2b2lkIEFkZFNwbGl0KGNvbnN0IERlc2NyaXB0b3IqIGQpIHsgc3BsaXRzX1tDbGFzc05hbWUoZCldID0gZDsgfQorCisgIHZvaWQgUHJpbnQoY29uc3QgRm9ybWF0dGVyJiBmb3JtYXQsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHAgOiBlbnVtc18pIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbnVtbmFtZSA9IHAuZmlyc3Q7CisgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjID0gcC5zZWNvbmQ7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgImVudW0gJHsxJCQyJCR9JCA6IGludDtcbiIKKyAgICAgICAgICAiYm9vbCAkMiRfSXNWYWxpZChpbnQgdmFsdWUpO1xuIiwKKyAgICAgICAgICBlbnVtX2Rlc2MsIGVudW1uYW1lKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBwIDogY2xhc3Nlc18pIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjbGFzc25hbWUgPSBwLmZpcnN0OworICAgICAgY29uc3QgRGVzY3JpcHRvciogY2xhc3NfZGVzYyA9IHAuc2Vjb25kOworICAgICAgZm9ybWF0KAorICAgICAgICAgICJjbGFzcyAkezEkJDIkJH0kO1xuIgorICAgICAgICAgICJzdHJ1Y3QgJDMkO1xuIgorICAgICAgICAgICIkZGxsZXhwb3J0X2RlY2wgJGV4dGVybiAkMyQgJDQkO1xuIiwKKyAgICAgICAgICBjbGFzc19kZXNjLCBjbGFzc25hbWUsIERlZmF1bHRJbnN0YW5jZVR5cGUoY2xhc3NfZGVzYywgb3B0aW9ucyksCisgICAgICAgICAgRGVmYXVsdEluc3RhbmNlTmFtZShjbGFzc19kZXNjLCBvcHRpb25zKSk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgcCA6IHNwbGl0c18pIHsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3IqIGNsYXNzX2Rlc2MgPSBwLnNlY29uZDsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAic3RydWN0ICQxJDtcbiIKKyAgICAgICAgICAiJGRsbGV4cG9ydF9kZWNsICRleHRlcm4gJDEkICQyJDtcbiIsCisgICAgICAgICAgRGVmYXVsdEluc3RhbmNlVHlwZShjbGFzc19kZXNjLCBvcHRpb25zLCAvKnNwbGl0PSovdHJ1ZSksCisgICAgICAgICAgRGVmYXVsdEluc3RhbmNlTmFtZShjbGFzc19kZXNjLCBvcHRpb25zLCAvKnNwbGl0PSovdHJ1ZSkpOworICAgIH0KKyAgfQorCisgIHZvaWQgUHJpbnRUb3BMZXZlbERlY2woY29uc3QgRm9ybWF0dGVyJiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgY29uc3QgeworICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IGNsYXNzZXNfKSB7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgInRlbXBsYXRlPD4gJGRsbGV4cG9ydF9kZWNsICQiCisgICAgICAgICAgIiQxJCogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwkMSQ+KEFyZW5hKik7XG4iLAorICAgICAgICAgIFF1YWxpZmllZENsYXNzTmFtZShwYWlyLnNlY29uZCwgb3B0aW9ucykpOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGNvbnN0IERlc2NyaXB0b3IqPiBjbGFzc2VzXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGNvbnN0IEVudW1EZXNjcmlwdG9yKj4gZW51bXNfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgY29uc3QgRGVzY3JpcHRvcio+IHNwbGl0c187Cit9OworCitzdGF0aWMgdm9pZCBQdWJsaWNJbXBvcnRERlMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+KiBmZF9zZXQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmZC0+cHVibGljX2RlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlcCA9IGZkLT5wdWJsaWNfZGVwZW5kZW5jeShpKTsKKyAgICBpZiAoZmRfc2V0LT5pbnNlcnQoZGVwKS5zZWNvbmQpIFB1YmxpY0ltcG9ydERGUyhkZXAsIGZkX3NldCk7CisgIH0KK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+IGNsYXNzZXM7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEVudW1EZXNjcmlwdG9yKj4gZW51bXM7CisKKyAgRmxhdHRlbk1lc3NhZ2VzSW5GaWxlKGZpbGVfLCAmY2xhc3Nlcyk7ICAvLyBBbGwgbWVzc2FnZXMgbmVlZCBmb3J3YXJkIGRlY2xzLgorCisgIGlmIChvcHRpb25zXy5wcm90b19oKSB7ICAvLyBwcm90by5oIG5lZWRzIGV4dHJhIGZvcndhcmQgZGVjbGFyYXRpb25zLgorICAgIC8vIEFsbCBjbGFzc2VzIC8gZW51bXMgcmVmZXJyZWQgdG8gYXMgZmllbGQgbWVtYmVycworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgICBMaXN0QWxsRmllbGRzKGZpbGVfLCAmZmllbGRzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgeworICAgICAgY2xhc3Nlcy5wdXNoX2JhY2soZmllbGRzW2ldLT5jb250YWluaW5nX3R5cGUoKSk7CisgICAgICBjbGFzc2VzLnB1c2hfYmFjayhmaWVsZHNbaV0tPm1lc3NhZ2VfdHlwZSgpKTsKKyAgICAgIGVudW1zLnB1c2hfYmFjayhmaWVsZHNbaV0tPmVudW1fdHlwZSgpKTsKKyAgICB9CisgICAgTGlzdEFsbFR5cGVzRm9yU2VydmljZXMoZmlsZV8sICZjbGFzc2VzKTsKKyAgfQorCisgIC8vIENhbGN1bGF0ZSB0aGUgc2V0IG9mIGZpbGVzIHdob3NlIGRlZmluaXRpb25zIHdlIGdldCB0aHJvdWdoIGluY2x1ZGUuCisgIC8vIE5vIG5lZWQgdG8gZm9yd2FyZCBkZWNsYXJlIHR5cGVzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlc2UuCisgIHN0ZDo6dW5vcmRlcmVkX3NldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IHB1YmxpY19zZXQ7CisgIFB1YmxpY0ltcG9ydERGUyhmaWxlXywgJnB1YmxpY19zZXQpOworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBGb3J3YXJkRGVjbGFyYXRpb25zPiBkZWNsczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLnNpemUoKTsgaSsrKSB7CisgICAgY29uc3QgRGVzY3JpcHRvciogZCA9IGNsYXNzZXNbaV07CisgICAgaWYgKGQgJiYgIXB1YmxpY19zZXQuY291bnQoZC0+ZmlsZSgpKSkKKyAgICAgIGRlY2xzW05hbWVzcGFjZShkLCBvcHRpb25zXyldLkFkZE1lc3NhZ2UoZCk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtcy5zaXplKCk7IGkrKykgeworICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkID0gZW51bXNbaV07CisgICAgaWYgKGQgJiYgIXB1YmxpY19zZXQuY291bnQoZC0+ZmlsZSgpKSkKKyAgICAgIGRlY2xzW05hbWVzcGFjZShkLCBvcHRpb25zXyldLkFkZEVudW0oZCk7CisgIH0KKyAgZm9yIChjb25zdCBhdXRvJiBtZyA6IG1lc3NhZ2VfZ2VuZXJhdG9yc18pIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkID0gbWctPmRlc2NyaXB0b3JfOworICAgIGlmICgoZCAhPSBudWxscHRyKSAmJiAocHVibGljX3NldC5jb3VudChkLT5maWxlKCkpID09IDB1KSAmJgorICAgICAgICBTaG91bGRTcGxpdChtZy0+ZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkKKyAgICAgIGRlY2xzW05hbWVzcGFjZShkLCBvcHRpb25zXyldLkFkZFNwbGl0KGQpOworICB9CisKKyAgeworICAgIE5hbWVzcGFjZU9wZW5lciBucyhmb3JtYXQpOworICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IGRlY2xzKSB7CisgICAgICBucy5DaGFuZ2VUbyhwYWlyLmZpcnN0KTsKKyAgICAgIHBhaXIuc2Vjb25kLlByaW50KGZvcm1hdCwgb3B0aW9uc18pOworICAgIH0KKyAgfQorICBmb3JtYXQoIlBST1RPQlVGX05BTUVTUEFDRV9PUEVOXG4iKTsKKyAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogZGVjbHMpIHsKKyAgICBwYWlyLnNlY29uZC5QcmludFRvcExldmVsRGVjbChmb3JtYXQsIG9wdGlvbnNfKTsKKyAgfQorICBmb3JtYXQoIlBST1RPQlVGX05BTUVTUEFDRV9DTE9TRVxuIik7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVUb3BIZWFkZXJHdWFyZChpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCBwYl9oKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIC8vIEdlbmVyYXRlIHRvcCBvZiBoZWFkZXIuCisgIGZvcm1hdCgKKyAgICAgICIvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIVxuIgorICAgICAgIi8vIHNvdXJjZTogJGZpbGVuYW1lJFxuIgorICAgICAgIlxuIgorICAgICAgIiNpZm5kZWYgJDEkXG4iCisgICAgICAiI2RlZmluZSAkMSRcbiIKKyAgICAgICJcbiIKKyAgICAgICIjaW5jbHVkZSA8bGltaXRzPlxuIgorICAgICAgIiNpbmNsdWRlIDxzdHJpbmc+XG4iLAorICAgICAgSW5jbHVkZUd1YXJkKGZpbGVfLCBwYl9oLCBvcHRpb25zXykpOworICBpZiAoIW9wdGlvbnNfLm9wZW5zb3VyY2VfcnVudGltZSAmJiAhZW51bV9nZW5lcmF0b3JzXy5lbXB0eSgpKSB7CisgICAgLy8gQWRkIGhlYWRlciB0byBwcm92aWRlIHN0ZDo6aXNfaW50ZWdyYWwgZm9yIHNhZmUgRW51bV9OYW1lKCkgZnVuY3Rpb24uCisgICAgZm9ybWF0KCIjaW5jbHVkZSA8dHlwZV90cmFpdHM+XG4iKTsKKyAgfQorICBmb3JtYXQoIlxuIik7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVCb3R0b21IZWFkZXJHdWFyZChpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCBwYl9oKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgiI2VuZGlmICAvLyAkR09PR0xFX1BST1RPQlVGJF9JTkNMVURFRF8kMSRcbiIsCisgICAgICAgICBJbmNsdWRlR3VhcmQoZmlsZV8sIHBiX2gsIG9wdGlvbnNfKSk7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVMaWJyYXJ5SW5jbHVkZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgaWYgKFVzaW5nSW1wbGljaXRXZWFrRmllbGRzKGZpbGVfLCBvcHRpb25zXykpIHsKKyAgICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9wdWJsaWMvaW1wbGljaXRfd2Vha19tZXNzYWdlLmgiLCBwcmludGVyKTsKKyAgfQorICBpZiAoSGFzV2Vha0ZpZWxkcyhmaWxlXywgb3B0aW9uc18pKSB7CisgICAgR09PR0xFX0NIRUNLKCFvcHRpb25zXy5vcGVuc291cmNlX3J1bnRpbWUpOworICAgIEluY2x1ZGVGaWxlKCJuZXQvcHJvdG8yL3B1YmxpYy93ZWFrX2ZpZWxkX21hcC5oIiwgcHJpbnRlcik7CisgIH0KKyAgaWYgKEhhc0xhenlGaWVsZHMoZmlsZV8sIG9wdGlvbnNfLCAmc2NjX2FuYWx5emVyXykpIHsKKyAgICBHT09HTEVfQ0hFQ0soIW9wdGlvbnNfLm9wZW5zb3VyY2VfcnVudGltZSk7CisgICAgSW5jbHVkZUZpbGUoIm5ldC9wcm90bzIvcHVibGljL2xhenlfZmllbGQuaCIsIHByaW50ZXIpOworICB9CisgIGlmIChTaG91bGRWZXJpZnkoZmlsZV8sIG9wdGlvbnNfLCAmc2NjX2FuYWx5emVyXykpIHsKKyAgICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9wdWJsaWMvd2lyZV9mb3JtYXRfdmVyaWZ5LmgiLCBwcmludGVyKTsKKyAgfQorCisgIGlmIChvcHRpb25zXy5vcGVuc291cmNlX3J1bnRpbWUpIHsKKyAgICAvLyBWZXJpZnkgdGhlIHByb3RvYnVmIGxpYnJhcnkgaGVhZGVyIHZlcnNpb24gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2MKKyAgICAvLyB2ZXJzaW9uIGJlZm9yZSBnb2luZyBhbnkgZnVydGhlci4KKyAgICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9wdWJsaWMvcG9ydF9kZWYuaW5jIiwgcHJpbnRlcik7CisgICAgZm9ybWF0KAorICAgICAgICAiI2lmIFBST1RPQlVGX1ZFUlNJT04gPCAkMSRcbiIKKyAgICAgICAgIiNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzXG4iCisgICAgICAgICIjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gUGxlYXNlIHVwZGF0ZVxuIgorICAgICAgICAiI2Vycm9yIHlvdXIgaGVhZGVycy5cbiIKKyAgICAgICAgIiNlbmRpZlxuIgorICAgICAgICAiI2lmICQyJCA8IFBST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTlxuIgorICAgICAgICAiI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIG9sZGVyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoICIKKyAgICAgICAgImlzXG4iCisgICAgICAgICIjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gUGxlYXNlXG4iCisgICAgICAgICIjZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLlxuIgorICAgICAgICAiI2VuZGlmXG4iCisgICAgICAgICJcbiIsCisgICAgICAgIFBST1RPQlVGX01JTl9IRUFERVJfVkVSU0lPTl9GT1JfUFJPVE9DLCAgLy8gMQorICAgICAgICBQUk9UT0JVRl9WRVJTSU9OKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIDIKKyAgICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9wdWJsaWMvcG9ydF91bmRlZi5pbmMiLCBwcmludGVyKTsKKyAgfQorCisgIC8vIE9LLCBpdCdzIG5vdyBzYWZlIHRvICNpbmNsdWRlIG90aGVyIGZpbGVzLgorICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9pby9wdWJsaWMvY29kZWRfc3RyZWFtLmgiLCBwcmludGVyKTsKKyAgSW5jbHVkZUZpbGUoIm5ldC9wcm90bzIvcHVibGljL2FyZW5hLmgiLCBwcmludGVyKTsKKyAgSW5jbHVkZUZpbGUoIm5ldC9wcm90bzIvcHVibGljL2FyZW5hc3RyaW5nLmgiLCBwcmludGVyKTsKKyAgaWYgKChvcHRpb25zXy5mb3JjZV9pbmxpbmVfc3RyaW5nIHx8IG9wdGlvbnNfLnByb2ZpbGVfZHJpdmVuX2lubGluZV9zdHJpbmcpICYmCisgICAgICAhb3B0aW9uc18ub3BlbnNvdXJjZV9ydW50aW1lKSB7CisgICAgSW5jbHVkZUZpbGUoIm5ldC9wcm90bzIvcHVibGljL2lubGluZWRfc3RyaW5nX2ZpZWxkLmgiLCBwcmludGVyKTsKKyAgfQorICBpZiAoSGFzU2ltcGxlQmFzZUNsYXNzZXMoZmlsZV8sIG9wdGlvbnNfKSkgeworICAgIEluY2x1ZGVGaWxlKCJuZXQvcHJvdG8yL3B1YmxpYy9nZW5lcmF0ZWRfbWVzc2FnZV9iYXNlcy5oIiwgcHJpbnRlcik7CisgIH0KKyAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZmlsZV8sIG9wdGlvbnNfKSAmJgorICAgICAgb3B0aW9uc18udGN0YWJsZV9tb2RlICE9IE9wdGlvbnM6OmtUQ1RhYmxlTmV2ZXIpIHsKKyAgICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9wdWJsaWMvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9kZWNsLmgiLCBwcmludGVyKTsKKyAgfQorICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9wdWJsaWMvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oIiwgcHJpbnRlcik7CisgIEluY2x1ZGVGaWxlKCJuZXQvcHJvdG8yL3B1YmxpYy9tZXRhZGF0YV9saXRlLmgiLCBwcmludGVyKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8sIG9wdGlvbnNfKSkgeworICAgIEluY2x1ZGVGaWxlKCJuZXQvcHJvdG8yL3B1YmxpYy9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmgiLCBwcmludGVyKTsKKyAgfQorCisgIGlmICghbWVzc2FnZV9nZW5lcmF0b3JzXy5lbXB0eSgpKSB7CisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBvcHRpb25zXykpIHsKKyAgICAgIEluY2x1ZGVGaWxlKCJuZXQvcHJvdG8yL3B1YmxpYy9tZXNzYWdlLmgiLCBwcmludGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgSW5jbHVkZUZpbGUoIm5ldC9wcm90bzIvcHVibGljL21lc3NhZ2VfbGl0ZS5oIiwgcHJpbnRlcik7CisgICAgfQorICB9CisgIGlmIChvcHRpb25zXy5vcGVuc291cmNlX3J1bnRpbWUpIHsKKyAgICAvLyBPcGVuLXNvdXJjZSByZWxpZXMgb24gdW5jb25kaXRpb25hbCBpbmNsdWRlcyBvZiB0aGVzZS4KKyAgICBJbmNsdWRlRmlsZUFuZEV4cG9ydCgibmV0L3Byb3RvMi9wdWJsaWMvcmVwZWF0ZWRfZmllbGQuaCIsIHByaW50ZXIpOworICAgIEluY2x1ZGVGaWxlQW5kRXhwb3J0KCJuZXQvcHJvdG8yL3B1YmxpYy9leHRlbnNpb25fc2V0LmgiLCBwcmludGVyKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBHb29nbGUzIGluY2x1ZGVzIHRoZXNlIGZpbGVzIG9ubHkgd2hlbiB0aGV5IGFyZSBuZWNlc3NhcnkuCisgICAgaWYgKEhhc0V4dGVuc2lvbnNPckV4dGVuZGFibGVNZXNzYWdlKGZpbGVfKSkgeworICAgICAgSW5jbHVkZUZpbGVBbmRFeHBvcnQoIm5ldC9wcm90bzIvcHVibGljL2V4dGVuc2lvbl9zZXQuaCIsIHByaW50ZXIpOworICAgIH0KKyAgICBpZiAoSGFzUmVwZWF0ZWRGaWVsZHMoZmlsZV8pKSB7CisgICAgICBJbmNsdWRlRmlsZUFuZEV4cG9ydCgibmV0L3Byb3RvMi9wdWJsaWMvcmVwZWF0ZWRfZmllbGQuaCIsIHByaW50ZXIpOworICAgIH0KKyAgICBpZiAoSGFzU3RyaW5nUGllY2VGaWVsZHMoZmlsZV8sIG9wdGlvbnNfKSkgeworICAgICAgSW5jbHVkZUZpbGUoIm5ldC9wcm90bzIvcHVibGljL3N0cmluZ19waWVjZV9maWVsZF9zdXBwb3J0LmgiLCBwcmludGVyKTsKKyAgICB9CisgICAgaWYgKEhhc0NvcmRGaWVsZHMoZmlsZV8sIG9wdGlvbnNfKSkgeworICAgICAgZm9ybWF0KCIjaW5jbHVkZSBcInRoaXJkX3BhcnR5L2Fic2wvc3RyaW5ncy9jb3JkLmhcIlxuIik7CisgICAgfQorICB9CisgIGlmIChIYXNNYXBGaWVsZHMoZmlsZV8pKSB7CisgICAgSW5jbHVkZUZpbGVBbmRFeHBvcnQoIm5ldC9wcm90bzIvcHVibGljL21hcC5oIiwgcHJpbnRlcik7CisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBvcHRpb25zXykpIHsKKyAgICAgIEluY2x1ZGVGaWxlKCJuZXQvcHJvdG8yL3B1YmxpYy9tYXBfZW50cnkuaCIsIHByaW50ZXIpOworICAgICAgSW5jbHVkZUZpbGUoIm5ldC9wcm90bzIvcHVibGljL21hcF9maWVsZF9pbmwuaCIsIHByaW50ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9wdWJsaWMvbWFwX2VudHJ5X2xpdGUuaCIsIHByaW50ZXIpOworICAgICAgSW5jbHVkZUZpbGUoIm5ldC9wcm90bzIvcHVibGljL21hcF9maWVsZF9saXRlLmgiLCBwcmludGVyKTsKKyAgICB9CisgIH0KKworICBpZiAoSGFzRW51bURlZmluaXRpb25zKGZpbGVfKSkgeworICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWxlXywgb3B0aW9uc18pKSB7CisgICAgICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9wdWJsaWMvZ2VuZXJhdGVkX2VudW1fcmVmbGVjdGlvbi5oIiwgcHJpbnRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIEluY2x1ZGVGaWxlKCJuZXQvcHJvdG8yL3B1YmxpYy9nZW5lcmF0ZWRfZW51bV91dGlsLmgiLCBwcmludGVyKTsKKyAgICB9CisgIH0KKworICBpZiAoSGFzR2VuZXJpY1NlcnZpY2VzKGZpbGVfLCBvcHRpb25zXykpIHsKKyAgICBJbmNsdWRlRmlsZSgibmV0L3Byb3RvMi9wdWJsaWMvc2VydmljZS5oIiwgcHJpbnRlcik7CisgIH0KKworICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGZpbGVfLCBvcHRpb25zXykgJiYgIW1lc3NhZ2VfZ2VuZXJhdG9yc18uZW1wdHkoKSkgeworICAgIEluY2x1ZGVGaWxlKCJuZXQvcHJvdG8yL3B1YmxpYy91bmtub3duX2ZpZWxkX3NldC5oIiwgcHJpbnRlcik7CisgIH0KK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZU1ldGFkYXRhUHJhZ21hKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbmZvX3BhdGgpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgaWYgKCFpbmZvX3BhdGguZW1wdHkoKSAmJiAhb3B0aW9uc18uYW5ub3RhdGlvbl9wcmFnbWFfbmFtZS5lbXB0eSgpICYmCisgICAgICAhb3B0aW9uc18uYW5ub3RhdGlvbl9ndWFyZF9uYW1lLmVtcHR5KCkpIHsKKyAgICBmb3JtYXQuU2V0KCJndWFyZCIsIG9wdGlvbnNfLmFubm90YXRpb25fZ3VhcmRfbmFtZSk7CisgICAgZm9ybWF0LlNldCgicHJhZ21hIiwgb3B0aW9uc18uYW5ub3RhdGlvbl9wcmFnbWFfbmFtZSk7CisgICAgZm9ybWF0LlNldCgiaW5mb19wYXRoIiwgaW5mb19wYXRoKTsKKyAgICBmb3JtYXQoCisgICAgICAgICIjaWZkZWYgJGd1YXJkJFxuIgorICAgICAgICAiI3ByYWdtYSAkcHJhZ21hJCBcIiRpbmZvX3BhdGgkXCJcbiIKKyAgICAgICAgIiNlbmRpZiAgLy8gJGd1YXJkJFxuIik7CisgIH0KK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZURlcGVuZGVuY3lJbmNsdWRlcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIHN0ZDo6c3RyaW5nIGJhc2VuYW1lID0gU3RyaXBQcm90byhmaWxlXy0+ZGVwZW5kZW5jeShpKS0+bmFtZSgpKTsKKworICAgIC8vIERvIG5vdCBpbXBvcnQgd2VhayBkZXBzLgorICAgIGlmIChJc0RlcFdlYWsoZmlsZV8tPmRlcGVuZGVuY3koaSkpKSBjb250aW51ZTsKKworICAgIGlmIChJc0Jvb3RzdHJhcFByb3RvKG9wdGlvbnNfLCBmaWxlXykpIHsKKyAgICAgIEdldEJvb3RzdHJhcEJhc2VuYW1lKG9wdGlvbnNfLCBiYXNlbmFtZSwgJmJhc2VuYW1lKTsKKyAgICB9CisKKyAgICBmb3JtYXQoIiNpbmNsdWRlICQxJFxuIiwKKyAgICAgICAgICAgQ3JlYXRlSGVhZGVySW5jbHVkZShiYXNlbmFtZSArICIucGIuaCIsIGZpbGVfLT5kZXBlbmRlbmN5KGkpKSk7CisgIH0KK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZUdsb2JhbFN0YXRlRnVuY3Rpb25EZWNsYXJhdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgLy8gRm9yd2FyZC1kZWNsYXJlIHRoZSBEZXNjcmlwdG9yVGFibGUgYmVjYXVzZSB0aGlzIGlzIHJlZmVyZW5jZWQgYnkgLnBiLmNjCisgIC8vIGZpbGVzIGRlcGVuZGluZyBvbiB0aGlzIGZpbGUuCisgIC8vCisgIC8vIFRoZSBUYWJsZVN0cnVjdCBpcyBhbHNvIG91dHB1dHRlZCBpbiB3ZWFrX21lc3NhZ2VfZmllbGQuY2MsIGJlY2F1c2UgdGhlCisgIC8vIHdlYWsgZmllbGRzIG11c3QgcmVmZXIgdG8gdGFibGUgc3RydWN0IGJ1dCBjYW5ub3QgaW5jbHVkZSB0aGUgaGVhZGVyLgorICAvLyBBbHNvIGl0IGFubm90YXRlcyBleHRyYSB3ZWFrIGF0dHJpYnV0ZXMuCisgIC8vIFRPRE8oZ2VyYmVucykgbWFrZSBzdXJlIHRoaXMgc2l0dWF0aW9uIGlzIGhhbmRsZWQgYmV0dGVyLgorICBmb3JtYXQoCisgICAgICAiXG4iCisgICAgICAiLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIC0tIGRvIG5vdCB1c2UgdGhlc2UgbWVtYmVycy5cbiIKKyAgICAgICJzdHJ1Y3QgJGRsbGV4cG9ydF9kZWNsICQkdGFibGVuYW1lJCB7XG4iCisgICAgICAiICBzdGF0aWMgY29uc3QgJHVpbnQzMiQgb2Zmc2V0c1tdO1xuIgorICAgICAgIn07XG4iKTsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICIkZGxsZXhwb3J0X2RlY2wgJGV4dGVybiBjb25zdCA6OiRwcm90b19ucyQ6OmludGVybmFsOjpEZXNjcmlwdG9yVGFibGUgIgorICAgICAgICAiJGRlc2NfdGFibGUkO1xuIik7CisgIH0KK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZU1lc3NhZ2VEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICAvLyBHZW5lcmF0ZSBjbGFzcyBkZWZpbml0aW9ucy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX2dlbmVyYXRvcnNfLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKGkgPiAwKSB7CisgICAgICBmb3JtYXQoIlxuIik7CisgICAgICBmb3JtYXQoa1RoaW5TZXBhcmF0b3IpOworICAgICAgZm9ybWF0KCJcbiIpOworICAgIH0KKyAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUNsYXNzRGVmaW5pdGlvbihwcmludGVyKTsKKyAgfQorfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlRW51bURlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIEdlbmVyYXRlIGVudW0gZGVmaW5pdGlvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV9nZW5lcmF0b3JzXy5zaXplKCk7IGkrKykgeworICAgIGVudW1fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVmaW5pdGlvbihwcmludGVyKTsKKyAgfQorfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlU2VydmljZURlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8sIG9wdGlvbnNfKSkgeworICAgIC8vIEdlbmVyYXRlIHNlcnZpY2UgZGVmaW5pdGlvbnMuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlX2dlbmVyYXRvcnNfLnNpemUoKTsgaSsrKSB7CisgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgZm9ybWF0KCJcbiIpOworICAgICAgICBmb3JtYXQoa1RoaW5TZXBhcmF0b3IpOworICAgICAgICBmb3JtYXQoIlxuIik7CisgICAgICB9CisgICAgICBzZXJ2aWNlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlY2xhcmF0aW9ucyhwcmludGVyKTsKKyAgICB9CisKKyAgICBmb3JtYXQoIlxuIik7CisgICAgZm9ybWF0KGtUaGlja1NlcGFyYXRvcik7CisgICAgZm9ybWF0KCJcbiIpOworICB9Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVFeHRlbnNpb25JZGVudGlmaWVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBEZWNsYXJlIGV4dGVuc2lvbiBpZGVudGlmaWVycy4gVGhlc2UgYXJlIGluIGdsb2JhbCBzY29wZSBhbmQgc28gb25seQorICAvLyB0aGUgZ2xvYmFsIHNjb3BlIGV4dGVuc2lvbnMuCisgIGZvciAoYXV0byYgZXh0ZW5zaW9uX2dlbmVyYXRvciA6IGV4dGVuc2lvbl9nZW5lcmF0b3JzXykgeworICAgIGlmIChleHRlbnNpb25fZ2VuZXJhdG9yLT5Jc1Njb3BlZCgpKSBjb250aW51ZTsKKyAgICBleHRlbnNpb25fZ2VuZXJhdG9yLT5HZW5lcmF0ZURlY2xhcmF0aW9uKHByaW50ZXIpOworICB9Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVJbmxpbmVGdW5jdGlvbkRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIC8vIFRPRE8oZ2VyYmVucykgcmVtb3ZlIHByYWdtYXMgd2hlbiBnY2MgaXMgbm8gbG9uZ2VyIHVzZWQuIEN1cnJlbnQgdmVyc2lvbgorICAvLyBvZiBnY2MgZmlyZXMgYSBib2d1cyBlcnJvciB3aGVuIGNvbXBpbGVkIHdpdGggc3RyaWN0LWFsaWFzaW5nLgorICBmb3JtYXQoCisgICAgICAiI2lmZGVmIF9fR05VQ19fXG4iCisgICAgICAiICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2hcbiIKKyAgICAgICIgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCBcIi1Xc3RyaWN0LWFsaWFzaW5nXCJcbiIKKyAgICAgICIjZW5kaWYgIC8vIF9fR05VQ19fXG4iKTsKKyAgLy8gR2VuZXJhdGUgY2xhc3MgaW5saW5lIG1ldGhvZHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV9nZW5lcmF0b3JzXy5zaXplKCk7IGkrKykgeworICAgIGlmIChpID4gMCkgeworICAgICAgZm9ybWF0KGtUaGluU2VwYXJhdG9yKTsKKyAgICAgIGZvcm1hdCgiXG4iKTsKKyAgICB9CisgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVJbmxpbmVNZXRob2RzKHByaW50ZXIpOworICB9CisgIGZvcm1hdCgKKyAgICAgICIjaWZkZWYgX19HTlVDX19cbiIKKyAgICAgICIgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wXG4iCisgICAgICAiI2VuZGlmICAvLyBfX0dOVUNfX1xuIik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX2dlbmVyYXRvcnNfLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKGkgPiAwKSB7CisgICAgICBmb3JtYXQoa1RoaW5TZXBhcmF0b3IpOworICAgICAgZm9ybWF0KCJcbiIpOworICAgIH0KKyAgfQorfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlUHJvdG8yTmFtZXNwYWNlRW51bVNwZWNpYWxpemF0aW9ucygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICAvLyBFbWl0IEdldEVudW1EZXNjcmlwdG9yIHNwZWNpYWxpemF0aW9ucyBpbnRvIGdvb2dsZTo6cHJvdG9idWYgbmFtZXNwYWNlOgorICBpZiAoSGFzRW51bURlZmluaXRpb25zKGZpbGVfKSkgeworICAgIGZvcm1hdCgiXG4iKTsKKyAgICB7CisgICAgICBOYW1lc3BhY2VPcGVuZXIgcHJvdG9fbnMoUHJvdG9idWZOYW1lc3BhY2Uob3B0aW9uc18pLCBmb3JtYXQpOworICAgICAgZm9ybWF0KCJcbiIpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtX2dlbmVyYXRvcnNfLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGVudW1fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlR2V0RW51bURlc2NyaXB0b3JTcGVjaWFsaXphdGlvbnMocHJpbnRlcik7CisgICAgICB9CisgICAgICBmb3JtYXQoIlxuIik7CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9maWxlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwNTM2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2ZpbGUuaApAQCAtMCwwICsxLDIwOSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRklMRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9GSUxFX0hfXworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3NjYy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvb3B0aW9ucy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CitjbGFzcyBGaWxlRGVzY3JpcHRvcjsgIC8vIGRlc2NyaXB0b3IuaAorbmFtZXNwYWNlIGlvIHsKK2NsYXNzIFByaW50ZXI7ICAvLyBwcmludGVyLmgKK30KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK2NsYXNzIEVudW1HZW5lcmF0b3I7ICAgICAgIC8vIGVudW0uaAorY2xhc3MgTWVzc2FnZUdlbmVyYXRvcjsgICAgLy8gbWVzc2FnZS5oCitjbGFzcyBTZXJ2aWNlR2VuZXJhdG9yOyAgICAvLyBzZXJ2aWNlLmgKK2NsYXNzIEV4dGVuc2lvbkdlbmVyYXRvcjsgIC8vIGV4dGVuc2lvbi5oCisKK2NsYXNzIEZpbGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgLy8gU2VlIGdlbmVyYXRvci5jYyBmb3IgdGhlIG1lYW5pbmcgb2YgZGxsZXhwb3J0X2RlY2wuCisgIEZpbGVHZW5lcmF0b3IoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICB+RmlsZUdlbmVyYXRvcigpOworCisgIC8vIFNoYXJlZCBjb2RlIGJldHdlZW4gdGhlIHR3byBoZWFkZXIgZ2VuZXJhdG9ycyBiZWxvdy4KKyAgdm9pZCBHZW5lcmF0ZUhlYWRlcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gaW5mb19wYXRoLCBpZiBub24tZW1wdHksIHNob3VsZCBiZSB0aGUgcGF0aCAocmVsYXRpdmUgdG8gcHJpbnRlcidzCisgIC8vIG91dHB1dCkgdG8gdGhlIG1ldGFkYXRhIGZpbGUgZGVzY3JpYmluZyB0aGlzIHByb3RvIGhlYWRlci4KKyAgdm9pZCBHZW5lcmF0ZVByb3RvSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBzdGQ6OnN0cmluZyYgaW5mb19wYXRoKTsKKyAgLy8gaW5mb19wYXRoLCBpZiBub24tZW1wdHksIHNob3VsZCBiZSB0aGUgcGF0aCAocmVsYXRpdmUgdG8gcHJpbnRlcidzCisgIC8vIG91dHB1dCkgdG8gdGhlIG1ldGFkYXRhIGZpbGUgZGVzY3JpYmluZyB0aGlzIFBCIGhlYWRlci4KKyAgdm9pZCBHZW5lcmF0ZVBCSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBzdGQ6OnN0cmluZyYgaW5mb19wYXRoKTsKKyAgdm9pZCBHZW5lcmF0ZVNvdXJjZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBtZW1iZXIgZnVuY3Rpb25zIGFyZSB1c2VkIHdoZW4gdGhlIGxpdGVfaW1wbGljaXRfd2Vha19maWVsZHMKKyAgLy8gb3B0aW9uIGlzIHNldC4gSW4gdGhpcyBtb2RlIHRoZSBjb2RlIGlzIG9yZ2FuaXplZCBhIGJpdCBkaWZmZXJlbnRseSB0bworICAvLyBwcm9tb3RlIGJldHRlciBsaW5rZXIgc3RyaXBwaW5nIG9mIHVudXNlZCBjb2RlLiBJbiBwYXJ0aWN1bGFyLCB3ZSBnZW5lcmF0ZQorICAvLyBvbmUgLmNjIGZpbGUgcGVyIG1lc3NhZ2UsIG9uZSAuY2MgZmlsZSBwZXIgZXh0ZW5zaW9uLCBhbmQgYSBtYWluIHBiLmNjIGZpbGUKKyAgLy8gY29udGFpbmluZyBldmVyeXRoaW5nIGVsc2UuCisKKyAgaW50IE51bU1lc3NhZ2VzKCkgY29uc3QgeyByZXR1cm4gbWVzc2FnZV9nZW5lcmF0b3JzXy5zaXplKCk7IH0KKyAgaW50IE51bUV4dGVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBleHRlbnNpb25fZ2VuZXJhdG9yc18uc2l6ZSgpOyB9CisgIC8vIEdlbmVyYXRlcyB0aGUgc291cmNlIGZpbGUgZm9yIG9uZSBtZXNzYWdlLgorICB2b2lkIEdlbmVyYXRlU291cmNlRm9yTWVzc2FnZShpbnQgaWR4LCBpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIC8vIEdlbmVyYXRlcyB0aGUgc291cmNlIGZpbGUgZm9yIG9uZSBleHRlbnNpb24uCisgIHZvaWQgR2VuZXJhdGVTb3VyY2VGb3JFeHRlbnNpb24oaW50IGlkeCwgaW86OlByaW50ZXIqIHByaW50ZXIpOworICAvLyBHZW5lcmF0ZXMgYSBzb3VyY2UgZmlsZSBjb250YWluaW5nIGV2ZXJ5dGhpbmcgZXhjZXB0IG1lc3NhZ2VzIGFuZAorICAvLyBleHRlbnNpb25zLgorICB2b2lkIEdlbmVyYXRlR2xvYmFsU291cmNlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworIHByaXZhdGU6CisgIC8vIEludGVybmFsIHR5cGUgdXNlZCBieSBHZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbnMgKGRlZmluZWQgaW4gZmlsZS5jYykuCisgIGNsYXNzIEZvcndhcmREZWNsYXJhdGlvbnM7CisgIHN0cnVjdCBDcm9zc0ZpbGVSZWZlcmVuY2VzOworCisgIHZvaWQgSW5jbHVkZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGdvb2dsZTNfbmFtZSwgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgICBEb0luY2x1ZGVGaWxlKGdvb2dsZTNfbmFtZSwgZmFsc2UsIHByaW50ZXIpOworICB9CisgIHZvaWQgSW5jbHVkZUZpbGVBbmRFeHBvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIGdvb2dsZTNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAgIERvSW5jbHVkZUZpbGUoZ29vZ2xlM19uYW1lLCB0cnVlLCBwcmludGVyKTsKKyAgfQorICB2b2lkIERvSW5jbHVkZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGdvb2dsZTNfbmFtZSwgYm9vbCBkb19leHBvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgc3RkOjpzdHJpbmcgQ3JlYXRlSGVhZGVySW5jbHVkZShjb25zdCBzdGQ6OnN0cmluZyYgYmFzZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworICB2b2lkIEdldENyb3NzRmlsZVJlZmVyZW5jZXNGb3JGaWVsZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc0ZpbGVSZWZlcmVuY2VzKiByZWZzKTsKKyAgdm9pZCBHZXRDcm9zc0ZpbGVSZWZlcmVuY2VzRm9yRmlsZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc0ZpbGVSZWZlcmVuY2VzKiByZWZzKTsKKyAgdm9pZCBHZW5lcmF0ZUludGVybmFsRm9yd2FyZERlY2xhcmF0aW9ucyhjb25zdCBDcm9zc0ZpbGVSZWZlcmVuY2VzJiByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVNvdXJjZUluY2x1ZGVzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVNvdXJjZVByZWx1ZGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlU291cmNlRGVmYXVsdEluc3RhbmNlKGludCBpZHgsIGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICB2b2lkIEdlbmVyYXRlSW5pdEZvclNDQyhjb25zdCBTQ0MqIHNjYywgY29uc3QgQ3Jvc3NGaWxlUmVmZXJlbmNlcyYgcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlUmVmbGVjdGlvbkluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gRm9yIG90aGVyIGltcG9ydHMsIGdlbmVyYXRlcyB0aGVpciBmb3J3YXJkLWRlY2xhcmF0aW9ucy4KKyAgdm9pZCBHZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlcyB0b3Agb3IgYm90dG9tIG9mIGEgaGVhZGVyIGZpbGUuCisgIHZvaWQgR2VuZXJhdGVUb3BIZWFkZXJHdWFyZChpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCBwYl9oKTsKKyAgdm9pZCBHZW5lcmF0ZUJvdHRvbUhlYWRlckd1YXJkKGlvOjpQcmludGVyKiBwcmludGVyLCBib29sIHBiX2gpOworCisgIC8vIEdlbmVyYXRlcyAjaW5jbHVkZSBkaXJlY3RpdmVzLgorICB2b2lkIEdlbmVyYXRlTGlicmFyeUluY2x1ZGVzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZURlcGVuZGVuY3lJbmNsdWRlcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgYSBwcmFnbWEgdG8gcHVsbCBpbiBtZXRhZGF0YSB1c2luZyB0aGUgZ2l2ZW4gaW5mb19wYXRoIChpZgorICAvLyBub24tZW1wdHkpLiBpbmZvX3BhdGggc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHByaW50ZXIncyBvdXRwdXQuCisgIHZvaWQgR2VuZXJhdGVNZXRhZGF0YVByYWdtYShpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbmZvX3BhdGgpOworCisgIC8vIEdlbmVyYXRlcyBhIGNvdXBsZSBvZiBkaWZmZXJlbnQgcGllY2VzIGJlZm9yZSBkZWZpbml0aW9uczoKKyAgdm9pZCBHZW5lcmF0ZUdsb2JhbFN0YXRlRnVuY3Rpb25EZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlcyB0eXBlcyBmb3IgY2xhc3Nlcy4KKyAgdm9pZCBHZW5lcmF0ZU1lc3NhZ2VEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgdm9pZCBHZW5lcmF0ZUVudW1EZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGVzIGdlbmVyaWMgc2VydmljZSBkZWZpbml0aW9ucy4KKyAgdm9pZCBHZW5lcmF0ZVNlcnZpY2VEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGVzIGV4dGVuc2lvbiBpZGVudGlmaWVycy4KKyAgdm9pZCBHZW5lcmF0ZUV4dGVuc2lvbklkZW50aWZpZXJzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZXMgaW5saW5lIGZ1bmN0aW9uIGRlZmluaXRpb25zLgorICB2b2lkIEdlbmVyYXRlSW5saW5lRnVuY3Rpb25EZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgdm9pZCBHZW5lcmF0ZVByb3RvMk5hbWVzcGFjZUVudW1TcGVjaWFsaXphdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIFNvbWV0aW1lcyB0aGUgbmFtZXMgd2UgdXNlIGluIGEgLnByb3RvIGZpbGUgaGFwcGVuIHRvIGJlIGRlZmluZWQgYXMKKyAgLy8gbWFjcm9zIG9uIHNvbWUgcGxhdGZvcm1zIChlLmcuLCBtYWNyby9taW5vciB1c2VkIGluIHBsdWdpbi5wcm90byBhcmUKKyAgLy8gZGVmaW5lZCBhcyBtYWNyb3MgaW4gc3lzL3R5cGVzLmggb24gRnJlZUJTRCBhbmQgYSBmZXcgb3RoZXIgcGxhdGZvcm1zKS4KKyAgLy8gVG8gbWFrZSB0aGUgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZSBvbiB0aGVzZSBwbGF0Zm9ybXMsIHdlIGVpdGhlciBoYXZlIHRvCisgIC8vIHVuZGVmIHRoZSBtYWNybyBmb3IgdGhlc2UgZmV3IHBsYXRmb3Jtcywgb3IgcmVuYW1lIHRoZSBmaWVsZCBuYW1lIGZvciBhbGwKKyAgLy8gcGxhdGZvcm1zLiBTaW5jZSB0aGVzZSBuYW1lcyBhcmUgcGFydCBvZiBwcm90b2J1ZiBwdWJsaWMgQVBJLCByZW5hbWluZyBpcworICAvLyBnZW5lcmFsbHkgYSBicmVha2luZyBjaGFuZ2Ugc28gd2UgcHJlZmVyIHRoZSAjdW5kZWYgYXBwcm9hY2guCisgIHZvaWQgR2VuZXJhdGVNYWNyb1VuZGVmcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgYm9vbCBJc0RlcFdlYWsoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlcCkgY29uc3QgeworICAgIGlmICh3ZWFrX2RlcHNfLmNvdW50KGRlcCkgIT0gMCkgeworICAgICAgR09PR0xFX0NIRUNLKCFvcHRpb25zXy5vcGVuc291cmNlX3J1bnRpbWUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6c2V0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gd2Vha19kZXBzXzsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisgIGNvbnN0IE9wdGlvbnMgb3B0aW9uc187CisKKyAgTWVzc2FnZVNDQ0FuYWx5emVyIHNjY19hbmFseXplcl87CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJpYWJsZXNfOworCisgIC8vIENvbnRhaW5zIHRoZSBwb3N0LW9yZGVyIHdhbGsgb2YgYWxsIHRoZSBtZXNzYWdlcyAoYW5kIGNoaWxkIG1lc3NhZ2VzKSBpbgorICAvLyB0aGlzIGZpbGUuIElmIHlvdSBuZWVkIGEgcHJlLW9yZGVyIHdhbGsganVzdCByZXZlcnNlIGl0ZXJhdGUuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlR2VuZXJhdG9yPj4gbWVzc2FnZV9nZW5lcmF0b3JzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEVudW1HZW5lcmF0b3I+PiBlbnVtX2dlbmVyYXRvcnNfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U2VydmljZUdlbmVyYXRvcj4+IHNlcnZpY2VfZ2VuZXJhdG9yc187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxFeHRlbnNpb25HZW5lcmF0b3I+PiBleHRlbnNpb25fZ2VuZXJhdG9yc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpbGVHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0ZJTEVfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9nZW5lcmF0b3IuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNhMmJjZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI3OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9nZW5lcmF0b3IuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK0NwcEdlbmVyYXRvcjo6Q3BwR2VuZXJhdG9yKCkge30KK0NwcEdlbmVyYXRvcjo6fkNwcEdlbmVyYXRvcigpIHt9CisKK25hbWVzcGFjZSB7CitzdGQ6OnN0cmluZyBOdW1iZXJlZENjRmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VuYW1lLCBpbnQgbnVtYmVyKSB7CisgIHJldHVybiBTdHJDYXQoYmFzZW5hbWUsICIub3V0LyIsIG51bWJlciwgIi5jYyIpOworfQorfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgQ3BwR2VuZXJhdG9yOjpHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcikgY29uc3QgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiA+IG9wdGlvbnM7CisgIFBhcnNlR2VuZXJhdG9yUGFyYW1ldGVyKHBhcmFtZXRlciwgJm9wdGlvbnMpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIHBhcnNlIGdlbmVyYXRvciBvcHRpb25zCisKKyAgLy8gSWYgdGhlIGRsbGV4cG9ydF9kZWNsIG9wdGlvbiBpcyBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyLCB3ZSBuZWVkIHRvIHdyaXRlCisgIC8vIGl0IGluIGZyb250IG9mIGV2ZXJ5IHN5bWJvbCB0aGF0IHNob3VsZCBiZSBleHBvcnRlZCBpZiB0aGlzIC5wcm90byBpcworICAvLyBjb21waWxlZCBpbnRvIGEgV2luZG93cyBETEwuICBFLmcuLCBpZiB0aGUgdXNlciBpbnZva2VzIHRoZSBwcm90b2NvbAorICAvLyBjb21waWxlciBhczoKKyAgLy8gICBwcm90b2MgLS1jcHBfb3V0PWRsbGV4cG9ydF9kZWNsPUZPT19FWFBPUlQ6b3V0ZGlyIGZvby5wcm90bworICAvLyB0aGVuIHdlJ2xsIGRlZmluZSBjbGFzc2VzIGxpa2UgdGhpczoKKyAgLy8gICBjbGFzcyBGT09fRVhQT1JUIEZvbyB7CisgIC8vICAgICAuLi4KKyAgLy8gICB9CisgIC8vIEZPT19FWFBPUlQgaXMgYSBtYWNybyB3aGljaCBzaG91bGQgZXhwYW5kIHRvIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBvcgorICAvLyBfX2RlY2xzcGVjKGRsbGltcG9ydCkgZGVwZW5kaW5nIG9uIHdoYXQgaXMgYmVpbmcgY29tcGlsZWQuCisgIC8vCisgIC8vIElmIHRoZSBwcm90b19oIG9wdGlvbiBpcyBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyLCB3ZSB3aWxsIGdlbmVyYXRlIGFsbAorICAvLyBjbGFzc2VzIGFuZCBlbnVtcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGZvcndhcmQtZGVjbGFyZWQgZnJvbSBmaWxlcyB0aGF0CisgIC8vIG5lZWQgdGhlbSBmcm9tIGltcG9ydHMuCisgIC8vCisgIC8vIElmIHRoZSBsaXRlIG9wdGlvbiBpcyBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyLCB3ZSB3aWxsIGdlbmVyYXRlIHRoZQorICAvLyBjdXJyZW50IGZpbGVzIGFuZCBhbGwgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgdXNpbmcgdGhlIExJVEUgcnVudGltZS4KKyAgT3B0aW9ucyBmaWxlX29wdGlvbnM7CisKKyAgZmlsZV9vcHRpb25zLm9wZW5zb3VyY2VfcnVudGltZSA9IG9wZW5zb3VyY2VfcnVudGltZV87CisgIGZpbGVfb3B0aW9ucy5ydW50aW1lX2luY2x1ZGVfYmFzZSA9IHJ1bnRpbWVfaW5jbHVkZV9iYXNlXzsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG9wdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAiZGxsZXhwb3J0X2RlY2wiKSB7CisgICAgICBmaWxlX29wdGlvbnMuZGxsZXhwb3J0X2RlY2wgPSBvcHRpb25zW2ldLnNlY29uZDsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gInNhZmVfYm91bmRhcnlfY2hlY2siKSB7CisgICAgICBmaWxlX29wdGlvbnMuc2FmZV9ib3VuZGFyeV9jaGVjayA9IHRydWU7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJhbm5vdGF0ZV9oZWFkZXJzIikgeworICAgICAgZmlsZV9vcHRpb25zLmFubm90YXRlX2hlYWRlcnMgPSB0cnVlOworICAgIH0gZWxzZSBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAiYW5ub3RhdGlvbl9wcmFnbWFfbmFtZSIpIHsKKyAgICAgIGZpbGVfb3B0aW9ucy5hbm5vdGF0aW9uX3ByYWdtYV9uYW1lID0gb3B0aW9uc1tpXS5zZWNvbmQ7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJhbm5vdGF0aW9uX2d1YXJkX25hbWUiKSB7CisgICAgICBmaWxlX29wdGlvbnMuYW5ub3RhdGlvbl9ndWFyZF9uYW1lID0gb3B0aW9uc1tpXS5zZWNvbmQ7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJzcGVlZCIpIHsKKyAgICAgIGZpbGVfb3B0aW9ucy5lbmZvcmNlX21vZGUgPSBFbmZvcmNlT3B0aW1pemVNb2RlOjprU3BlZWQ7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJjb2RlX3NpemUiKSB7CisgICAgICBmaWxlX29wdGlvbnMuZW5mb3JjZV9tb2RlID0gRW5mb3JjZU9wdGltaXplTW9kZTo6a0NvZGVTaXplOworICAgIH0gZWxzZSBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAibGl0ZSIpIHsKKyAgICAgIGZpbGVfb3B0aW9ucy5lbmZvcmNlX21vZGUgPSBFbmZvcmNlT3B0aW1pemVNb2RlOjprTGl0ZVJ1bnRpbWU7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJsaXRlX2ltcGxpY2l0X3dlYWtfZmllbGRzIikgeworICAgICAgZmlsZV9vcHRpb25zLmVuZm9yY2VfbW9kZSA9IEVuZm9yY2VPcHRpbWl6ZU1vZGU6OmtMaXRlUnVudGltZTsKKyAgICAgIGZpbGVfb3B0aW9ucy5saXRlX2ltcGxpY2l0X3dlYWtfZmllbGRzID0gdHJ1ZTsKKyAgICAgIGlmICghb3B0aW9uc1tpXS5zZWNvbmQuZW1wdHkoKSkgeworICAgICAgICBmaWxlX29wdGlvbnMubnVtX2NjX2ZpbGVzID0KKyAgICAgICAgICAgIHN0cnRvMzIob3B0aW9uc1tpXS5zZWNvbmQuY19zdHIoKSwgbnVsbHB0ciwgMTApOworICAgICAgfQorICAgIH0gZWxzZSBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAicHJvdG9faCIpIHsKKyAgICAgIGZpbGVfb3B0aW9ucy5wcm90b19oID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImFubm90YXRlX2FjY2Vzc29yIikgeworICAgICAgZmlsZV9vcHRpb25zLmFubm90YXRlX2FjY2Vzc29yID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImluamVjdF9maWVsZF9saXN0ZW5lcl9ldmVudHMiKSB7CisgICAgICBmaWxlX29wdGlvbnMuZmllbGRfbGlzdGVuZXJfb3B0aW9ucy5pbmplY3RfZmllbGRfbGlzdGVuZXJfZXZlbnRzID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImZvcmJpZGRlbl9maWVsZF9saXN0ZW5lcl9ldmVudHMiKSB7CisgICAgICBzdGQ6OnNpemVfdCBwb3MgPSAwOworICAgICAgZG8geworICAgICAgICBzdGQ6OnNpemVfdCBuZXh0X3BvcyA9IG9wdGlvbnNbaV0uc2Vjb25kLmZpbmRfZmlyc3Rfb2YoIisiLCBwb3MpOworICAgICAgICBpZiAobmV4dF9wb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICBuZXh0X3BvcyA9IG9wdGlvbnNbaV0uc2Vjb25kLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmV4dF9wb3MgPiBwb3MpCisgICAgICAgICAgZmlsZV9vcHRpb25zLmZpZWxkX2xpc3RlbmVyX29wdGlvbnMuZm9yYmlkZGVuX2ZpZWxkX2xpc3RlbmVyX2V2ZW50cworICAgICAgICAgICAgICAuaW5zZXJ0KG9wdGlvbnNbaV0uc2Vjb25kLnN1YnN0cihwb3MsIG5leHRfcG9zIC0gcG9zKSk7CisgICAgICAgIHBvcyA9IG5leHRfcG9zICsgMTsKKyAgICAgIH0gd2hpbGUgKHBvcyA8IG9wdGlvbnNbaV0uc2Vjb25kLnNpemUoKSk7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJ2ZXJpZmllZF9sYXp5IikgeworICAgICAgZmlsZV9vcHRpb25zLnVudmVyaWZpZWRfbGF6eSA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAidW52ZXJpZmllZF9sYXp5X21lc3NhZ2Vfc2V0cyIpIHsKKyAgICAgIGZpbGVfb3B0aW9ucy51bnZlcmlmaWVkX2xhenlfbWVzc2FnZV9zZXRzID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gIm1lc3NhZ2Vfb3duZWRfYXJlbmFfdHJpYWwiKSB7CisgICAgICBmaWxlX29wdGlvbnMubWVzc2FnZV9vd25lZF9hcmVuYV90cmlhbCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJmb3JjZV9lYWdlcmx5X3ZlcmlmaWVkX2xhenkiKSB7CisgICAgICBmaWxlX29wdGlvbnMuZm9yY2VfZWFnZXJseV92ZXJpZmllZF9sYXp5ID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImV4cGVyaW1lbnRhbF90YWlsX2NhbGxfdGFibGVfbW9kZSIpIHsKKyAgICAgIGlmIChvcHRpb25zW2ldLnNlY29uZCA9PSAibmV2ZXIiKSB7CisgICAgICAgIGZpbGVfb3B0aW9ucy50Y3RhYmxlX21vZGUgPSBPcHRpb25zOjprVENUYWJsZU5ldmVyOworICAgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLnNlY29uZCA9PSAiZ3VhcmRlZCIpIHsKKyAgICAgICAgZmlsZV9vcHRpb25zLnRjdGFibGVfbW9kZSA9IE9wdGlvbnM6OmtUQ1RhYmxlR3VhcmRlZDsKKyAgICAgIH0gZWxzZSBpZiAob3B0aW9uc1tpXS5zZWNvbmQgPT0gImFsd2F5cyIpIHsKKyAgICAgICAgZmlsZV9vcHRpb25zLnRjdGFibGVfbW9kZSA9IE9wdGlvbnM6OmtUQ1RhYmxlQWx3YXlzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKmVycm9yID0gIlVua25vd24gdmFsdWUgZm9yIGV4cGVyaW1lbnRhbF90YWlsX2NhbGxfdGFibGVfbW9kZTogIiArCisgICAgICAgICAgICAgICAgIG9wdGlvbnNbaV0uc2Vjb25kOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICplcnJvciA9ICJVbmtub3duIGdlbmVyYXRvciBvcHRpb246ICIgKyBvcHRpb25zW2ldLmZpcnN0OworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vIFRoZSBzYWZlX2JvdW5kYXJ5X2NoZWNrIG9wdGlvbiBjb250cm9scyBiZWhhdmlvciBmb3IgR29vZ2xlLWludGVybmFsCisgIC8vIHByb3RvYnVmIEFQSXMuCisgIGlmIChmaWxlX29wdGlvbnMuc2FmZV9ib3VuZGFyeV9jaGVjayAmJiBmaWxlX29wdGlvbnMub3BlbnNvdXJjZV9ydW50aW1lKSB7CisgICAgKmVycm9yID0KKyAgICAgICAgIlRoZSBzYWZlX2JvdW5kYXJ5X2NoZWNrIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG91dHNpZGUgb2YgR29vZ2xlLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgIHN0ZDo6c3RyaW5nIGJhc2VuYW1lID0gU3RyaXBQcm90byhmaWxlLT5uYW1lKCkpOworCisgIGlmIChNYXliZUJvb3RzdHJhcChmaWxlX29wdGlvbnMsIGdlbmVyYXRvcl9jb250ZXh0LCBmaWxlX29wdGlvbnMuYm9vdHN0cmFwLAorICAgICAgICAgICAgICAgICAgICAgJmJhc2VuYW1lKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgRmlsZUdlbmVyYXRvciBmaWxlX2dlbmVyYXRvcihmaWxlLCBmaWxlX29wdGlvbnMpOworCisgIC8vIEdlbmVyYXRlIGhlYWRlcihzKS4KKyAgaWYgKGZpbGVfb3B0aW9ucy5wcm90b19oKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgICBnZW5lcmF0b3JfY29udGV4dC0+T3BlbihiYXNlbmFtZSArICIucHJvdG8uaCIpKTsKKyAgICBHZW5lcmF0ZWRDb2RlSW5mbyBhbm5vdGF0aW9uczsKKyAgICBpbzo6QW5ub3RhdGlvblByb3RvQ29sbGVjdG9yPEdlbmVyYXRlZENvZGVJbmZvPiBhbm5vdGF0aW9uX2NvbGxlY3RvcigKKyAgICAgICAgJmFubm90YXRpb25zKTsKKyAgICBzdGQ6OnN0cmluZyBpbmZvX3BhdGggPSBiYXNlbmFtZSArICIucHJvdG8uaC5tZXRhIjsKKyAgICBpbzo6UHJpbnRlciBwcmludGVyKAorICAgICAgICBvdXRwdXQuZ2V0KCksICckJywKKyAgICAgICAgZmlsZV9vcHRpb25zLmFubm90YXRlX2hlYWRlcnMgPyAmYW5ub3RhdGlvbl9jb2xsZWN0b3IgOiBudWxscHRyKTsKKyAgICBmaWxlX2dlbmVyYXRvci5HZW5lcmF0ZVByb3RvSGVhZGVyKAorICAgICAgICAmcHJpbnRlciwgZmlsZV9vcHRpb25zLmFubm90YXRlX2hlYWRlcnMgPyBpbmZvX3BhdGggOiAiIik7CisgICAgaWYgKGZpbGVfb3B0aW9ucy5hbm5vdGF0ZV9oZWFkZXJzKSB7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBpbmZvX291dHB1dCgKKyAgICAgICAgICBnZW5lcmF0b3JfY29udGV4dC0+T3BlbihpbmZvX3BhdGgpKTsKKyAgICAgIGFubm90YXRpb25zLlNlcmlhbGl6ZVRvWmVyb0NvcHlTdHJlYW0oaW5mb19vdXRwdXQuZ2V0KCkpOworICAgIH0KKyAgfQorCisgIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICAgIGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKGJhc2VuYW1lICsgIi5wYi5oIikpOworICAgIEdlbmVyYXRlZENvZGVJbmZvIGFubm90YXRpb25zOworICAgIGlvOjpBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGFubm90YXRpb25fY29sbGVjdG9yKAorICAgICAgICAmYW5ub3RhdGlvbnMpOworICAgIHN0ZDo6c3RyaW5nIGluZm9fcGF0aCA9IGJhc2VuYW1lICsgIi5wYi5oLm1ldGEiOworICAgIGlvOjpQcmludGVyIHByaW50ZXIoCisgICAgICAgIG91dHB1dC5nZXQoKSwgJyQnLAorICAgICAgICBmaWxlX29wdGlvbnMuYW5ub3RhdGVfaGVhZGVycyA/ICZhbm5vdGF0aW9uX2NvbGxlY3RvciA6IG51bGxwdHIpOworICAgIGZpbGVfZ2VuZXJhdG9yLkdlbmVyYXRlUEJIZWFkZXIoCisgICAgICAgICZwcmludGVyLCBmaWxlX29wdGlvbnMuYW5ub3RhdGVfaGVhZGVycyA/IGluZm9fcGF0aCA6ICIiKTsKKyAgICBpZiAoZmlsZV9vcHRpb25zLmFubm90YXRlX2hlYWRlcnMpIHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IGluZm9fb3V0cHV0KAorICAgICAgICAgIGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKGluZm9fcGF0aCkpOworICAgICAgYW5ub3RhdGlvbnMuU2VyaWFsaXplVG9aZXJvQ29weVN0cmVhbShpbmZvX291dHB1dC5nZXQoKSk7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgY2MgZmlsZShzKS4KKyAgaWYgKFVzaW5nSW1wbGljaXRXZWFrRmllbGRzKGZpbGUsIGZpbGVfb3B0aW9ucykpIHsKKyAgICB7CisgICAgICAvLyBUaGlzIGlzIHRoZSBnbG9iYWwgLmNjIGZpbGUsIGNvbnRhaW5pbmcKKyAgICAgIC8vIGVudW0vc2VydmljZXMvdGFibGVzL3JlZmxlY3Rpb24KKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgICAgICBnZW5lcmF0b3JfY29udGV4dC0+T3BlbihiYXNlbmFtZSArICIucGIuY2MiKSk7CisgICAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKKyAgICAgIGZpbGVfZ2VuZXJhdG9yLkdlbmVyYXRlR2xvYmFsU291cmNlKCZwcmludGVyKTsKKyAgICB9CisKKyAgICBpbnQgbnVtX2NjX2ZpbGVzID0KKyAgICAgICAgZmlsZV9nZW5lcmF0b3IuTnVtTWVzc2FnZXMoKSArIGZpbGVfZ2VuZXJhdG9yLk51bUV4dGVuc2lvbnMoKTsKKworICAgIC8vIElmIHdlJ3JlIHVzaW5nIGltcGxpY2l0IHdlYWsgZmllbGRzIHRoZW4gd2UgYWxsb3cgdGhlIHVzZXIgdG8KKyAgICAvLyBvcHRpb25hbGx5IHNwZWNpZnkgaG93IG1hbnkgZmlsZXMgdG8gZ2VuZXJhdGUsIG5vdCBjb3VudGluZyB0aGUgZ2xvYmFsCisgICAgLy8gcGIuY2MgZmlsZS4gSWYgd2UgaGF2ZSBtb3JlIGZpbGVzIHRoYW4gbWVzc2FnZXMsIHRoZW4gc29tZSBmaWxlcyB3aWxsCisgICAgLy8gYmUgZ2VuZXJhdGVkIGFzIGVtcHR5IHBsYWNlaG9sZGVycy4KKyAgICBpZiAoZmlsZV9vcHRpb25zLm51bV9jY19maWxlcyA+IDApIHsKKyAgICAgIEdPT0dMRV9DSEVDS19MRShudW1fY2NfZmlsZXMsIGZpbGVfb3B0aW9ucy5udW1fY2NfZmlsZXMpCisgICAgICAgICAgPDwgIlRoZXJlIG11c3QgYmUgYXQgbGVhc3QgYXMgbWFueSBudW1iZXJlZCAuY2MgZmlsZXMgYXMgbWVzc2FnZXMgIgorICAgICAgICAgICAgICJhbmQgZXh0ZW5zaW9ucy4iOworICAgICAgbnVtX2NjX2ZpbGVzID0gZmlsZV9vcHRpb25zLm51bV9jY19maWxlczsKKyAgICB9CisgICAgaW50IGNjX2ZpbGVfbnVtYmVyID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfZ2VuZXJhdG9yLk51bU1lc3NhZ2VzKCk7IGkrKykgeworICAgICAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKAorICAgICAgICAgIE51bWJlcmVkQ2NGaWxlTmFtZShiYXNlbmFtZSwgY2NfZmlsZV9udW1iZXIrKykpKTsKKyAgICAgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcpOworICAgICAgZmlsZV9nZW5lcmF0b3IuR2VuZXJhdGVTb3VyY2VGb3JNZXNzYWdlKGksICZwcmludGVyKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlX2dlbmVyYXRvci5OdW1FeHRlbnNpb25zKCk7IGkrKykgeworICAgICAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKAorICAgICAgICAgIE51bWJlcmVkQ2NGaWxlTmFtZShiYXNlbmFtZSwgY2NfZmlsZV9udW1iZXIrKykpKTsKKyAgICAgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcpOworICAgICAgZmlsZV9nZW5lcmF0b3IuR2VuZXJhdGVTb3VyY2VGb3JFeHRlbnNpb24oaSwgJnByaW50ZXIpOworICAgIH0KKyAgICAvLyBDcmVhdGUgZW1wdHkgcGxhY2Vob2xkZXIgZmlsZXMgaWYgbmVjZXNzYXJ5IHRvIG1hdGNoIHRoZSBleHBlY3RlZCBudW1iZXIKKyAgICAvLyBvZiBmaWxlcy4KKyAgICBmb3IgKDsgY2NfZmlsZV9udW1iZXIgPCBudW1fY2NfZmlsZXM7ICsrY2NfZmlsZV9udW1iZXIpIHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dChnZW5lcmF0b3JfY29udGV4dC0+T3BlbigKKyAgICAgICAgICBOdW1iZXJlZENjRmlsZU5hbWUoYmFzZW5hbWUsIGNjX2ZpbGVfbnVtYmVyKSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICAgIGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKGJhc2VuYW1lICsgIi5wYi5jYyIpKTsKKyAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKKyAgICBmaWxlX2dlbmVyYXRvci5HZW5lcmF0ZVNvdXJjZSgmcHJpbnRlcik7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2dlbmVyYXRvci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzNzRiOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTA3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gR2VuZXJhdGVzIEMrKyBjb2RlIGZvciBhIGdpdmVuIC5wcm90byBmaWxlLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfR0VORVJBVE9SX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0dFTkVSQVRPUl9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworLy8gQ29kZUdlbmVyYXRvciBpbXBsZW1lbnRhdGlvbiB3aGljaCBnZW5lcmF0ZXMgYSBDKysgc291cmNlIGZpbGUgYW5kCisvLyBoZWFkZXIuICBJZiB5b3UgY3JlYXRlIHlvdXIgb3duIHByb3RvY29sIGNvbXBpbGVyIGJpbmFyeSBhbmQgeW91IHdhbnQKKy8vIGl0IHRvIHN1cHBvcnQgQysrIG91dHB1dCwgeW91IGNhbiBkbyBzbyBieSByZWdpc3RlcmluZyBhbiBpbnN0YW5jZSBvZiB0aGlzCisvLyBDb2RlR2VuZXJhdG9yIHdpdGggdGhlIENvbW1hbmRMaW5lSW50ZXJmYWNlIGluIHlvdXIgbWFpbigpIGZ1bmN0aW9uLgorY2xhc3MgUFJPVE9DX0VYUE9SVCBDcHBHZW5lcmF0b3IgOiBwdWJsaWMgQ29kZUdlbmVyYXRvciB7CisgcHVibGljOgorICBDcHBHZW5lcmF0b3IoKTsKKyAgfkNwcEdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIGVudW0gY2xhc3MgUnVudGltZSB7CisgICAga0dvb2dsZTMsICAgICAvLyBVc2UgdGhlIGludGVybmFsIGdvb2dsZTMgcnVudGltZS4KKyAgICBrT3BlbnNvdXJjZSwgIC8vIFVzZSB0aGUgb3Blbi1zb3VyY2UgcnVudGltZS4KKworICAgIC8vIFVzZSB0aGUgb3Blbi1zb3VyY2UgcnVudGltZSB3aXRoIGdvb2dsZTMgI2luY2x1ZGUgcGF0aHMuICBXZSBtYWtlIHRoZXNlCisgICAgLy8gYWJzb2x1dGUgdG8gYXZvaWQgYW1iaWd1aXR5LCBzbyB0aGUgcnVudGltZSB3aWxsIGJlICNpbmNsdWRlZCBsaWtlOgorICAgIC8vICAgI2luY2x1ZGUgInRoaXJkX3BhcnR5L3Byb3RvYnVmLy4uLi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oIgorICAgIGtPcGVuc291cmNlR29vZ2xlMworICB9OworCisgIHZvaWQgc2V0X29wZW5zb3VyY2VfcnVudGltZShib29sIG9wZW5zb3VyY2UpIHsKKyAgICBvcGVuc291cmNlX3J1bnRpbWVfID0gb3BlbnNvdXJjZTsKKyAgfQorCisgIC8vIElmIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcsIGdlbmVyYXRlZCBjb2RlIHdpbGwgZG86CisgIC8vICAgI2luY2x1ZGUgIjxCQVNFPi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oIgorICAvLyBpbnN0ZWFkIG9mOgorICAvLyAgICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorICAvLyBUaGlzIGhhcyBubyBlZmZlY3QgaWYgb3BlbnNvdXJjZV9ydW50aW1lID0gZmFsc2UuCisgIHZvaWQgc2V0X3J1bnRpbWVfaW5jbHVkZV9iYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlKSB7CisgICAgcnVudGltZV9pbmNsdWRlX2Jhc2VfID0gYmFzZTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgQ29kZUdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yKSBjb25zdCBvdmVycmlkZTsKKworICB1aW50NjRfdCBHZXRTdXBwb3J0ZWRGZWF0dXJlcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAvLyBXZSBkb24ndCBmdWxseSBzdXBwb3J0IHRoaXMgeWV0LCBidXQgdGhpcyBpcyBuZWVkZWQgdG8gdW5ibG9jayB0aGUgdGVzdHMsCisgICAgLy8gYW5kIHdlIHdpbGwgaGF2ZSBmdWxsIHN1cHBvcnQgYmVmb3JlIHRoZSBleHBlcmltZW50YWwgZmxhZyBpcyByZW1vdmVkLgorICAgIHJldHVybiBGRUFUVVJFX1BST1RPM19PUFRJT05BTDsKKyAgfQorCisgcHJpdmF0ZToKKyAgYm9vbCBvcGVuc291cmNlX3J1bnRpbWVfID0gdHJ1ZTsKKyAgc3RkOjpzdHJpbmcgcnVudGltZV9pbmNsdWRlX2Jhc2VfOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ3BwR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9HRU5FUkFUT1JfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvaGVscGVycy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjdjNWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvaGVscGVycy5jYwpAQCAtMCwwICsxLDE1OTkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvaGVscGVycy5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL25hbWVzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9vcHRpb25zLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc2NjLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgorCisvLyBNdXN0IGJlIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3QgY2hhciBrQW55TWVzc2FnZU5hbWVbXSA9ICJBbnkiOworc3RhdGljIGNvbnN0IGNoYXIga0FueVByb3RvRmlsZVtdID0gImdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8iOworCitzdGQ6OnN0cmluZyBEb3RzVG9Db2xvbnMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgcmV0dXJuIFN0cmluZ1JlcGxhY2UobmFtZSwgIi4iLCAiOjoiLCB0cnVlKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtLZXl3b3JkTGlzdFtdID0geyAgLy8KKyAgICAiTlVMTCIsCisgICAgImFsaWduYXMiLAorICAgICJhbGlnbm9mIiwKKyAgICAiYW5kIiwKKyAgICAiYW5kX2VxIiwKKyAgICAiYXNtIiwKKyAgICAiYXV0byIsCisgICAgImJpdGFuZCIsCisgICAgImJpdG9yIiwKKyAgICAiYm9vbCIsCisgICAgImJyZWFrIiwKKyAgICAiY2FzZSIsCisgICAgImNhdGNoIiwKKyAgICAiY2hhciIsCisgICAgImNsYXNzIiwKKyAgICAiY29tcGwiLAorICAgICJjb25zdCIsCisgICAgImNvbnN0ZXhwciIsCisgICAgImNvbnN0X2Nhc3QiLAorICAgICJjb250aW51ZSIsCisgICAgImRlY2x0eXBlIiwKKyAgICAiZGVmYXVsdCIsCisgICAgImRlbGV0ZSIsCisgICAgImRvIiwKKyAgICAiZG91YmxlIiwKKyAgICAiZHluYW1pY19jYXN0IiwKKyAgICAiZWxzZSIsCisgICAgImVudW0iLAorICAgICJleHBsaWNpdCIsCisgICAgImV4cG9ydCIsCisgICAgImV4dGVybiIsCisgICAgImZhbHNlIiwKKyAgICAiZmxvYXQiLAorICAgICJmb3IiLAorICAgICJmcmllbmQiLAorICAgICJnb3RvIiwKKyAgICAiaWYiLAorICAgICJpbmxpbmUiLAorICAgICJpbnQiLAorICAgICJsb25nIiwKKyAgICAibXV0YWJsZSIsCisgICAgIm5hbWVzcGFjZSIsCisgICAgIm5ldyIsCisgICAgIm5vZXhjZXB0IiwKKyAgICAibm90IiwKKyAgICAibm90X2VxIiwKKyAgICAibnVsbHB0ciIsCisgICAgIm9wZXJhdG9yIiwKKyAgICAib3IiLAorICAgICJvcl9lcSIsCisgICAgInByaXZhdGUiLAorICAgICJwcm90ZWN0ZWQiLAorICAgICJwdWJsaWMiLAorICAgICJyZWdpc3RlciIsCisgICAgInJlaW50ZXJwcmV0X2Nhc3QiLAorICAgICJyZXR1cm4iLAorICAgICJzaG9ydCIsCisgICAgInNpZ25lZCIsCisgICAgInNpemVvZiIsCisgICAgInN0YXRpYyIsCisgICAgInN0YXRpY19hc3NlcnQiLAorICAgICJzdGF0aWNfY2FzdCIsCisgICAgInN0cnVjdCIsCisgICAgInN3aXRjaCIsCisgICAgInRlbXBsYXRlIiwKKyAgICAidGhpcyIsCisgICAgInRocmVhZF9sb2NhbCIsCisgICAgInRocm93IiwKKyAgICAidHJ1ZSIsCisgICAgInRyeSIsCisgICAgInR5cGVkZWYiLAorICAgICJ0eXBlaWQiLAorICAgICJ0eXBlbmFtZSIsCisgICAgInVuaW9uIiwKKyAgICAidW5zaWduZWQiLAorICAgICJ1c2luZyIsCisgICAgInZpcnR1YWwiLAorICAgICJ2b2lkIiwKKyAgICAidm9sYXRpbGUiLAorICAgICJ3Y2hhcl90IiwKKyAgICAid2hpbGUiLAorICAgICJ4b3IiLAorICAgICJ4b3JfZXEifTsKKworc3RhdGljIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4qIE1ha2VLZXl3b3Jkc01hcCgpIHsKKyAgYXV0byogcmVzdWx0ID0gbmV3IHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4oKTsKKyAgZm9yIChjb25zdCBhdXRvIGtleXdvcmQgOiBrS2V5d29yZExpc3QpIHsKKyAgICByZXN1bHQtPmVtcGxhY2Uoa2V5d29yZCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4mIGtLZXl3b3JkcyA9ICpNYWtlS2V5d29yZHNNYXAoKTsKKworc3RkOjpzdHJpbmcgSW50VHlwZU5hbWUoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUpIHsKKyAgcmV0dXJuIHR5cGUgKyAiX3QiOworfQorCit2b2lkIFNldEludFZhcihjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKKyAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcykgeworICAoKnZhcmlhYmxlcylbdHlwZV0gPSBJbnRUeXBlTmFtZShvcHRpb25zLCB0eXBlKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtZXNzYWdlIGNhbiBwb3RlbnRpYWxseSBhbGxvY2F0ZSBtZW1vcnkgZm9yIGl0cyBmaWVsZC4KKy8vIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgbWVzc2FnZS1vd25lZCBhcmVuYSB3aWxsIGJlIHVzZWZ1bC4KK2Jvb2wgQWxsb2NFeHBlY3RlZChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gRGVzY3JpYmVzIGRpZmZlcmVudCBhcHByb2FjaGVzIHRvIGRldGVjdCBub24tY2Fub25pY2FsIGludDMyIGVuY29kaW5nLiBPbmx5CisvLyBrTmV2ZXIgb3Iga0Fsd2F5cyBpcyBlbGlnaWJsZSBmb3IgKnNpbXBsZSogdmVyaWZpY2F0aW9uIG1ldGhvZHMuCitlbnVtIGNsYXNzIFZlcmlmeUludDMyVHlwZSB7CisgIGtDdXN0b20sICAvLyBPbmx5IGNoZWNrIGlmIGZpZWxkIG51bWJlciBtYXRjaGVzLgorICBrTmV2ZXIsICAgLy8gRG8gbm90IGNoZWNrLgorICBrQWx3YXlzLCAgLy8gQWx3YXlzIGNoZWNrLgorfTsKKworaW5saW5lIFZlcmlmeVNpbXBsZVR5cGUgVmVyaWZ5SW50MzJUeXBlVG9WZXJpZnlDdXN0b20oVmVyaWZ5SW50MzJUeXBlIHQpIHsKKyAgc3RhdGljIFZlcmlmeVNpbXBsZVR5cGUga0N1c3RvbVR5cGVzW10gPSB7CisgICAgICBWZXJpZnlTaW1wbGVUeXBlOjprQ3VzdG9tLCBWZXJpZnlTaW1wbGVUeXBlOjprQ3VzdG9tSW50MzJOZXZlciwKKyAgICAgIFZlcmlmeVNpbXBsZVR5cGU6OmtDdXN0b21JbnQzMkFsd2F5c307CisgIHJldHVybiBrQ3VzdG9tVHlwZXNbc3RhdGljX2Nhc3Q8aW50MzJfdD4odCkgLQorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFZlcmlmeUludDMyVHlwZTo6a0N1c3RvbSldOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworYm9vbCBJc0xhenkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKSB7CisgIHJldHVybiBJc0xhemlseVZlcmlmaWVkTGF6eShmaWVsZCwgb3B0aW9ucykgfHwKKyAgICAgICAgIElzRWFnZXJseVZlcmlmaWVkTGF6eShmaWVsZCwgb3B0aW9ucywgc2NjX2FuYWx5emVyKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmICJmaWVsZCIgaXMgYSBtZXNzYWdlIGZpZWxkIHRoYXQgaXMgYmFja2VkIGJ5IExhenlGaWVsZCBwZXIKKy8vIHByb2ZpbGUgKGdvL3BkbGF6eSkuCitpbmxpbmUgYm9vbCBJc0VhZ2VybHlWZXJpZmllZExhenlCeVByb2ZpbGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJc0VhZ2VybHlWZXJpZmllZExhenkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJc0xhemlseVZlcmlmaWVkTGF6eShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTZXRDb21tb25WYXJzKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzKSB7CisgICgqdmFyaWFibGVzKVsicHJvdG9fbnMiXSA9IFByb3RvYnVmTmFtZXNwYWNlKG9wdGlvbnMpOworCisgIC8vIFdhcm5pbmc6IHRoZXJlIGlzIHNvbWUgY2xldmVyIG5hbWluZy9zcGxpdHRpbmcgaGVyZSB0byBhdm9pZCBleHRyYWN0IHNjcmlwdAorICAvLyByZXdyaXRlcy4gIFRoZSBuYW1lcyBvZiB0aGVzZSB2YXJpYWJsZXMgbXVzdCBub3QgYmUgdGhpbmdzIHRoYXQgdGhlIGV4dHJhY3QKKyAgLy8gc2NyaXB0IHdpbGwgcmV3cml0ZS4gIFRoYXQncyB3aHkgd2UgdXNlICJDSEsiIChmb3IgZXhhbXBsZSkgaW5zdGVhZCBvZgorICAvLyAiR09PR0xFX0NIRUNLIi4KKyAgaWYgKG9wdGlvbnMub3BlbnNvdXJjZV9ydW50aW1lKSB7CisgICAgKCp2YXJpYWJsZXMpWyJHT09HTEVfUFJPVE9CVUYiXSA9ICJHT09HTEVfUFJPVE9CVUYiOworICAgICgqdmFyaWFibGVzKVsiQ0hLIl0gPSAiR09PR0xFX0NIRUNLIjsKKyAgICAoKnZhcmlhYmxlcylbIkRDSEsiXSA9ICJHT09HTEVfRENIRUNLIjsKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGVzZSB2YWx1ZXMgYXJlIHRoaW5ncyB0aGUgZXh0cmFjdCBzY3JpcHQgd291bGQgcmV3cml0ZSBpZiB3ZSBkaWQgbm90CisgICAgLy8gc3BsaXQgdGhlbS4gIEl0IG1pZ2h0IG5vdCBzdHJpY3RseSBtYXR0ZXIgc2luY2Ugd2UgZG9uJ3QgZ2VuZXJhdGUgZ29vZ2xlMworICAgIC8vIGNvZGUgaW4gb3Blbi1zb3VyY2UuICBCdXQgaXQncyBnb29kIHRvIHByZXZlbnQgc3VycHJpc2luZyB0aGluZ3MgZnJvbQorICAgIC8vIGhhcHBlbmluZy4KKyAgICAoKnZhcmlhYmxlcylbIkdPT0dMRV9QUk9UT0JVRiJdID0KKyAgICAgICAgIkdPT0dMRTMiCisgICAgICAgICJfUFJPVE9CVUYiOworICAgICgqdmFyaWFibGVzKVsiQ0hLIl0gPQorICAgICAgICAiQ0giCisgICAgICAgICJFQ0siOworICAgICgqdmFyaWFibGVzKVsiRENISyJdID0KKyAgICAgICAgIkRDSCIKKyAgICAgICAgIkVDSyI7CisgIH0KKworICBTZXRJbnRWYXIob3B0aW9ucywgImludDgiLCB2YXJpYWJsZXMpOworICBTZXRJbnRWYXIob3B0aW9ucywgInVpbnQ4IiwgdmFyaWFibGVzKTsKKyAgU2V0SW50VmFyKG9wdGlvbnMsICJ1aW50MzIiLCB2YXJpYWJsZXMpOworICBTZXRJbnRWYXIob3B0aW9ucywgInVpbnQ2NCIsIHZhcmlhYmxlcyk7CisgIFNldEludFZhcihvcHRpb25zLCAiaW50MzIiLCB2YXJpYWJsZXMpOworICBTZXRJbnRWYXIob3B0aW9ucywgImludDY0IiwgdmFyaWFibGVzKTsKKyAgKCp2YXJpYWJsZXMpWyJzdHJpbmciXSA9ICJzdGQ6OnN0cmluZyI7Cit9CisKK3ZvaWQgU2V0Q29tbW9uTWVzc2FnZURhdGFWYXJpYWJsZXMoCisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgc3RkOjpzdHJpbmcgcHJlZml4ID0gSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcikgPyAiIiA6ICJfaW1wbF8uIjsKKyAgKCp2YXJpYWJsZXMpWyJhbnlfbWV0YWRhdGEiXSA9IHByZWZpeCArICJfYW55X21ldGFkYXRhXyI7CisgICgqdmFyaWFibGVzKVsiY2FjaGVkX3NpemUiXSA9IHByZWZpeCArICJfY2FjaGVkX3NpemVfIjsKKyAgKCp2YXJpYWJsZXMpWyJleHRlbnNpb25zIl0gPSBwcmVmaXggKyAiX2V4dGVuc2lvbnNfIjsKKyAgKCp2YXJpYWJsZXMpWyJoYXNfYml0cyJdID0gcHJlZml4ICsgIl9oYXNfYml0c18iOworICAoKnZhcmlhYmxlcylbImlubGluZWRfc3RyaW5nX2RvbmF0ZWRfYXJyYXkiXSA9CisgICAgICBwcmVmaXggKyAiX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfIjsKKyAgKCp2YXJpYWJsZXMpWyJvbmVvZl9jYXNlIl0gPSBwcmVmaXggKyAiX29uZW9mX2Nhc2VfIjsKKyAgKCp2YXJpYWJsZXMpWyJ0cmFja2VyIl0gPSAiSW1wbF86Ol90cmFja2VyXyI7CisgICgqdmFyaWFibGVzKVsid2Vha19maWVsZF9tYXAiXSA9IHByZWZpeCArICJfd2Vha19maWVsZF9tYXBfIjsKKyAgKCp2YXJpYWJsZXMpWyJzcGxpdCJdID0gcHJlZml4ICsgIl9zcGxpdF8iOworICAoKnZhcmlhYmxlcylbImNhY2hlZF9zcGxpdF9wdHIiXSA9ICJjYWNoZWRfc3BsaXRfcHRyIjsKK30KKwordm9pZCBTZXRVbmtub3duRmllbGRzVmFyaWFibGUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgc3RkOjpzdHJpbmcgcHJvdG9fbnMgPSBQcm90b2J1Zk5hbWVzcGFjZShvcHRpb25zKTsKKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfdHlwZTsKKyAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yLT5maWxlKCksIG9wdGlvbnMpKSB7CisgICAgdW5rbm93bl9maWVsZHNfdHlwZSA9ICI6OiIgKyBwcm90b19ucyArICI6OlVua25vd25GaWVsZFNldCI7CisgICAgKCp2YXJpYWJsZXMpWyJ1bmtub3duX2ZpZWxkcyJdID0KKyAgICAgICAgIl9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8IiArIHVua25vd25fZmllbGRzX3R5cGUgKyAiPigiICsKKyAgICAgICAgdW5rbm93bl9maWVsZHNfdHlwZSArICI6OmRlZmF1bHRfaW5zdGFuY2UpIjsKKyAgfSBlbHNlIHsKKyAgICB1bmtub3duX2ZpZWxkc190eXBlID0KKyAgICAgICAgUHJpbWl0aXZlVHlwZU5hbWUob3B0aW9ucywgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORyk7CisgICAgKCp2YXJpYWJsZXMpWyJ1bmtub3duX2ZpZWxkcyJdID0gIl9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9maWVsZHNfdHlwZSArICI+KDo6IiArIHByb3RvX25zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcpIjsKKyAgfQorICAoKnZhcmlhYmxlcylbInVua25vd25fZmllbGRzX3R5cGUiXSA9IHVua25vd25fZmllbGRzX3R5cGU7CisgICgqdmFyaWFibGVzKVsiaGF2ZV91bmtub3duX2ZpZWxkcyJdID0KKyAgICAgICJfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSI7CisgICgqdmFyaWFibGVzKVsibXV0YWJsZV91bmtub3duX2ZpZWxkcyJdID0KKyAgICAgICJfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8IiArIHVua25vd25fZmllbGRzX3R5cGUgKworICAgICAgIj4oKSI7Cit9CisKK3N0ZDo6c3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNhcF9uZXh0X2xldHRlcikgeworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIC8vIE5vdGU6ICBJIGRpc3RydXN0IGN0eXBlLmggZHVlIHRvIGxvY2FsZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoJ2EnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICd6JykgeworICAgICAgaWYgKGNhcF9uZXh0X2xldHRlcikgeworICAgICAgICByZXN1bHQgKz0gaW5wdXRbaV0gKyAoJ0EnIC0gJ2EnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSBpbnB1dFtpXTsKKyAgICAgIH0KKyAgICAgIGNhcF9uZXh0X2xldHRlciA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAoJ0EnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICdaJykgeworICAgICAgLy8gQ2FwaXRhbCBsZXR0ZXJzIGFyZSBsZWZ0IGFzLWlzLgorICAgICAgcmVzdWx0ICs9IGlucHV0W2ldOworICAgICAgY2FwX25leHRfbGV0dGVyID0gZmFsc2U7CisgICAgfSBlbHNlIGlmICgnMCcgPD0gaW5wdXRbaV0gJiYgaW5wdXRbaV0gPD0gJzknKSB7CisgICAgICByZXN1bHQgKz0gaW5wdXRbaV07CisgICAgICBjYXBfbmV4dF9sZXR0ZXIgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBjYXBfbmV4dF9sZXR0ZXIgPSB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitjb25zdCBjaGFyIGtUaGlja1NlcGFyYXRvcltdID0KKyAgICAiLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKK2NvbnN0IGNoYXIga1RoaW5TZXBhcmF0b3JbXSA9CisgICAgIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisKK2Jvb2wgQ2FuSW5pdGlhbGl6ZUJ5WmVyb2luZyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSB8fCBmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHJldHVybiBmYWxzZTsKKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKSA9PSAwOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2ludDMyKCkgPT0gMDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCgpID09IDA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3VpbnQzMigpID09IDA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpID09IDA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfZmxvYXQoKSA9PSAwOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9kb3VibGUoKSA9PSAwOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfYm9vbCgpID09IGZhbHNlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50ID0gZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCk7CisgIHN0ZDo6c3RyaW5nIHJlczsKKyAgaWYgKHBhcmVudCkgcmVzICs9IENsYXNzTmFtZShwYXJlbnQpICsgIl8iOworICByZXMgKz0gZGVzY3JpcHRvci0+bmFtZSgpOworICBpZiAoSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcikpIHJlcyArPSAiX0RvTm90VXNlIjsKKyAgcmV0dXJuIFJlc29sdmVLZXl3b3JkKHJlcyk7Cit9CisKK3N0ZDo6c3RyaW5nIENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yKSB7CisgIGlmIChlbnVtX2Rlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gUmVzb2x2ZUtleXdvcmQoZW51bV9kZXNjcmlwdG9yLT5uYW1lKCkpOworICB9IGVsc2UgeworICAgIHJldHVybiBDbGFzc05hbWUoZW51bV9kZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSkgKyAiXyIgKworICAgICAgICAgICBlbnVtX2Rlc2NyaXB0b3ItPm5hbWUoKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBRdWFsaWZpZWRDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gUXVhbGlmaWVkRmlsZUxldmVsU3ltYm9sKGQtPmZpbGUoKSwgQ2xhc3NOYW1lKGQpLCBvcHRpb25zKTsKK30KKworc3RkOjpzdHJpbmcgUXVhbGlmaWVkQ2xhc3NOYW1lKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIFF1YWxpZmllZEZpbGVMZXZlbFN5bWJvbChkLT5maWxlKCksIENsYXNzTmFtZShkKSwgb3B0aW9ucyk7Cit9CisKK3N0ZDo6c3RyaW5nIFF1YWxpZmllZENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkKSB7CisgIHJldHVybiBRdWFsaWZpZWRDbGFzc05hbWUoZCwgT3B0aW9ucygpKTsKK30KKworc3RkOjpzdHJpbmcgUXVhbGlmaWVkQ2xhc3NOYW1lKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkKSB7CisgIHJldHVybiBRdWFsaWZpZWRDbGFzc05hbWUoZCwgT3B0aW9ucygpKTsKK30KKworc3RkOjpzdHJpbmcgRXh0ZW5zaW9uTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGQpIHsKKyAgaWYgKGNvbnN0IERlc2NyaXB0b3IqIHNjb3BlID0gZC0+ZXh0ZW5zaW9uX3Njb3BlKCkpCisgICAgcmV0dXJuIFN0ckNhdChDbGFzc05hbWUoc2NvcGUpLCAiOjoiLCBSZXNvbHZlS2V5d29yZChkLT5uYW1lKCkpKTsKKyAgcmV0dXJuIFJlc29sdmVLZXl3b3JkKGQtPm5hbWUoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIFF1YWxpZmllZEV4dGVuc2lvbk5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIEdPT0dMRV9EQ0hFQ0soZC0+aXNfZXh0ZW5zaW9uKCkpOworICByZXR1cm4gUXVhbGlmaWVkRmlsZUxldmVsU3ltYm9sKGQtPmZpbGUoKSwgRXh0ZW5zaW9uTmFtZShkKSwgb3B0aW9ucyk7Cit9CisKK3N0ZDo6c3RyaW5nIFF1YWxpZmllZEV4dGVuc2lvbk5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkKSB7CisgIHJldHVybiBRdWFsaWZpZWRFeHRlbnNpb25OYW1lKGQsIE9wdGlvbnMoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIE5hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSkgeworICBpZiAocGFja2FnZS5lbXB0eSgpKSByZXR1cm4gIiI7CisgIHJldHVybiAiOjoiICsgRG90c1RvQ29sb25zKHBhY2thZ2UpOworfQorCitzdGQ6OnN0cmluZyBOYW1lc3BhY2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGQsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgc3RkOjpzdHJpbmcgcmV0ID0gTmFtZXNwYWNlKGQtPnBhY2thZ2UoKSk7CisgIGlmIChJc1dlbGxLbm93bk1lc3NhZ2UoZCkgJiYgb3B0aW9ucy5vcGVuc291cmNlX3J1bnRpbWUpIHsKKyAgICAvLyBXcml0dGVuIHdpdGggc3RyaW5nIGNvbmNhdGVuYXRpb24gdG8gcHJldmVudCByZXdyaXRpbmcgb2YKKyAgICAvLyA6Omdvb2dsZTo6cHJvdG9idWYuCisgICAgcmV0ID0gU3RyaW5nUmVwbGFjZShyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAiOjpnb29nbGU6OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwcm90b2J1ZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQiLCBmYWxzZSk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RkOjpzdHJpbmcgTmFtZXNwYWNlKGNvbnN0IERlc2NyaXB0b3IqIGQsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIE5hbWVzcGFjZShkLT5maWxlKCksIG9wdGlvbnMpOworfQorCitzdGQ6OnN0cmluZyBOYW1lc3BhY2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHJldHVybiBOYW1lc3BhY2UoZC0+ZmlsZSgpLCBvcHRpb25zKTsKK30KKworc3RkOjpzdHJpbmcgTmFtZXNwYWNlKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHJldHVybiBOYW1lc3BhY2UoZC0+ZmlsZSgpLCBvcHRpb25zKTsKK30KKworc3RkOjpzdHJpbmcgRGVmYXVsdEluc3RhbmNlVHlwZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiAvKm9wdGlvbnMqLywgYm9vbCBzcGxpdCkgeworICByZXR1cm4gQ2xhc3NOYW1lKGRlc2NyaXB0b3IpICsgKHNwbGl0ID8gIl9fSW1wbF9TcGxpdCIgOiAiIikgKworICAgICAgICAgIkRlZmF1bHRUeXBlSW50ZXJuYWwiOworfQorCitzdGQ6OnN0cmluZyBEZWZhdWx0SW5zdGFuY2VOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIC8qb3B0aW9ucyovLCBib29sIHNwbGl0KSB7CisgIHJldHVybiAiXyIgKyBDbGFzc05hbWUoZGVzY3JpcHRvciwgZmFsc2UpICsgKHNwbGl0ID8gIl9fSW1wbF9TcGxpdCIgOiAiIikgKworICAgICAgICAgIl9kZWZhdWx0X2luc3RhbmNlXyI7Cit9CisKK3N0ZDo6c3RyaW5nIERlZmF1bHRJbnN0YW5jZVB0cihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGJvb2wgc3BsaXQpIHsKKyAgcmV0dXJuIERlZmF1bHRJbnN0YW5jZU5hbWUoZGVzY3JpcHRvciwgb3B0aW9ucywgc3BsaXQpICsgInB0cl8iOworfQorCitzdGQ6OnN0cmluZyBRdWFsaWZpZWREZWZhdWx0SW5zdGFuY2VOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGJvb2wgc3BsaXQpIHsKKyAgcmV0dXJuIFF1YWxpZmllZEZpbGVMZXZlbFN5bWJvbCgKKyAgICAgIGRlc2NyaXB0b3ItPmZpbGUoKSwgRGVmYXVsdEluc3RhbmNlTmFtZShkZXNjcmlwdG9yLCBvcHRpb25zLCBzcGxpdCksCisgICAgICBvcHRpb25zKTsKK30KKworc3RkOjpzdHJpbmcgUXVhbGlmaWVkRGVmYXVsdEluc3RhbmNlUHRyKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgYm9vbCBzcGxpdCkgeworICByZXR1cm4gUXVhbGlmaWVkRGVmYXVsdEluc3RhbmNlTmFtZShkZXNjcmlwdG9yLCBvcHRpb25zLCBzcGxpdCkgKyAicHRyXyI7Cit9CisKK3N0ZDo6c3RyaW5nIERlc2NyaXB0b3JUYWJsZU5hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIFVuaXF1ZU5hbWUoImRlc2NyaXB0b3JfdGFibGUiLCBmaWxlLCBvcHRpb25zKTsKK30KKworc3RkOjpzdHJpbmcgRmlsZURsbEV4cG9ydChjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gVW5pcXVlTmFtZSgiUFJPVE9CVUZfSU5URVJOQUxfRVhQT1JUIiwgZmlsZSwgb3B0aW9ucyk7Cit9CisKK3N0ZDo6c3RyaW5nIFN1cGVyQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGlmICghSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvci0+ZmlsZSgpLCBvcHRpb25zKSkgeworICAgIHJldHVybiAiOjoiICsgUHJvdG9idWZOYW1lc3BhY2Uob3B0aW9ucykgKyAiOjpNZXNzYWdlTGl0ZSI7CisgIH0KKyAgYXV0byBzaW1wbGVfYmFzZSA9IFNpbXBsZUJhc2VDbGFzcyhkZXNjcmlwdG9yLCBvcHRpb25zKTsKKyAgaWYgKHNpbXBsZV9iYXNlLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gIjo6IiArIFByb3RvYnVmTmFtZXNwYWNlKG9wdGlvbnMpICsgIjo6TWVzc2FnZSI7CisgIH0KKyAgcmV0dXJuICI6OiIgKyBQcm90b2J1Zk5hbWVzcGFjZShvcHRpb25zKSArICI6OmludGVybmFsOjoiICsgc2ltcGxlX2Jhc2U7Cit9CisKK3N0ZDo6c3RyaW5nIFJlc29sdmVLZXl3b3JkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIGlmIChrS2V5d29yZHMuY291bnQobmFtZSkgPiAwKSB7CisgICAgcmV0dXJuIG5hbWUgKyAiXyI7CisgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0ZDo6c3RyaW5nIEZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IGZpZWxkLT5uYW1lKCk7CisgIExvd2VyU3RyaW5nKCZyZXN1bHQpOworICBpZiAoa0tleXdvcmRzLmNvdW50KHJlc3VsdCkgPiAwKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiXyIpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0ZDo6c3RyaW5nIEZpZWxkTWVtYmVyTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBib29sIHNwbGl0KSB7CisgIFN0cmluZ1BpZWNlIHByZWZpeCA9CisgICAgICBJc01hcEVudHJ5TWVzc2FnZShmaWVsZC0+Y29udGFpbmluZ190eXBlKCkpID8gIiIgOiAiX2ltcGxfLiI7CisgIFN0cmluZ1BpZWNlIHNwbGl0X3ByZWZpeCA9IHNwbGl0ID8gIl9zcGxpdF8tPiIgOiAiIjsKKyAgaWYgKGZpZWxkLT5yZWFsX2NvbnRhaW5pbmdfb25lb2YoKSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIFN0ckNhdChwcmVmaXgsIHNwbGl0X3ByZWZpeCwgRmllbGROYW1lKGZpZWxkKSwgIl8iKTsKKyAgfQorICAvLyBPbmVvZiBmaWVsZHMgYXJlIG5ldmVyIHNwbGl0LgorICBHT09HTEVfQ0hFQ0soIXNwbGl0KTsKKyAgcmV0dXJuIFN0ckNhdChwcmVmaXgsIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCktPm5hbWUoKSwgIl8uIiwKKyAgICAgICAgICAgICAgICAgICAgICBGaWVsZE5hbWUoZmllbGQpLCAiXyIpOworfQorCitzdGQ6OnN0cmluZyBPbmVvZkNhc2VDb25zdGFudE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBHT09HTEVfRENIRUNLKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpOworICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShmaWVsZC0+bmFtZSgpLCB0cnVlKTsKKyAgcmV0dXJuICJrIiArIGZpZWxkX25hbWU7Cit9CisKK3N0ZDo6c3RyaW5nIFF1YWxpZmllZE9uZW9mQ2FzZUNvbnN0YW50TmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIEdPT0dMRV9EQ0hFQ0soZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHF1YWxpZmljYXRpb24gPQorICAgICAgUXVhbGlmaWVkQ2xhc3NOYW1lKGZpZWxkLT5jb250YWluaW5nX3R5cGUoKSk7CisgIHJldHVybiBTdHJDYXQocXVhbGlmaWNhdGlvbiwgIjo6IiwgT25lb2ZDYXNlQ29uc3RhbnROYW1lKGZpZWxkKSk7Cit9CisKK3N0ZDo6c3RyaW5nIEVudW1WYWx1ZU5hbWUoY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSkgeworICBzdGQ6OnN0cmluZyByZXN1bHQgPSBlbnVtX3ZhbHVlLT5uYW1lKCk7CisgIGlmIChrS2V5d29yZHMuY291bnQocmVzdWx0KSA+IDApIHsKKyAgICByZXN1bHQuYXBwZW5kKCJfIik7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IEVzdGltYXRlQWxpZ25tZW50U2l6ZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGlmIChmaWVsZCA9PSBudWxscHRyKSByZXR1cm4gMDsKKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSByZXR1cm4gODsKKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuIDQ7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgcmV0dXJuIDg7CisgIH0KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiAtMTsgIC8vIE1ha2UgY29tcGlsZXIgaGFwcHkuCit9CisKK3N0ZDo6c3RyaW5nIEZpZWxkQ29uc3RhbnROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJrIiArIGZpZWxkX25hbWUgKyAiRmllbGROdW1iZXIiOworCisgIGlmICghZmllbGQtPmlzX2V4dGVuc2lvbigpICYmCisgICAgICBmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgKKyAgICAgICAgICBmaWVsZC0+Y2FtZWxjYXNlX25hbWUoKSkgIT0gZmllbGQpIHsKKyAgICAvLyBUaGlzIGZpZWxkJ3MgY2FtZWxjYXNlIG5hbWUgaXMgbm90IHVuaXF1ZS4gIEFzIGEgaGFjaywgYWRkIHRoZSBmaWVsZAorICAgIC8vIG51bWJlciB0byB0aGUgY29uc3RhbnQgbmFtZS4gIFRoaXMgbWFrZXMgdGhlIGNvbnN0YW50IHJhdGhlciB1c2VsZXNzLAorICAgIC8vIGJ1dCB3aGF0IGNhbiB3ZSBkbz8KKyAgICByZXN1bHQgKz0gIl8iICsgU3RyQ2F0KGZpZWxkLT5udW1iZXIoKSk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGQ6OnN0cmluZyBGaWVsZE1lc3NhZ2VUeXBlTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICAvLyBOb3RlOiAgVGhlIEdvb2dsZS1pbnRlcm5hbCB2ZXJzaW9uIG9mIFByb3RvY29sIEJ1ZmZlcnMgdXNlcyB0aGlzIGZ1bmN0aW9uCisgIC8vICAgYXMgYSBob29rIHBvaW50IGZvciBoYWNrcyB0byBzdXBwb3J0IGxlZ2FjeSBjb2RlLgorICByZXR1cm4gUXVhbGlmaWVkQ2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgb3B0aW9ucyk7Cit9CisKK3N0ZDo6c3RyaW5nIFN0cmlwUHJvdG8oY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7CisgIC8qCisgICAqIFRPRE8oZ2l0aHViL2dlb3JndGhlZ3JlYXQpIHJlbW92ZSB0aGlzIHByb3h5IG1ldGhvZAorICAgKiBvbmNlIEdvb2dsZSdzIGludGVybmFsIGNvZGViYXNlIHdpbGwgYmVjb21lIHJlYWR5CisgICAqLworICByZXR1cm4gY29tcGlsZXI6OlN0cmlwUHJvdG8oZmlsZW5hbWUpOworfQorCitjb25zdCBjaGFyKiBQcmltaXRpdmVUeXBlTmFtZShGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgIHJldHVybiAiaW50MzJfdCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICByZXR1cm4gImludDY0X3QiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiAidWludDMyX3QiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiAidWludDY0X3QiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiAiZmxvYXQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdGQ6OnN0cmluZyI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgICAgLy8gQ3BwVHlwZXMgYXJlIGFkZGVkLgorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBudWxscHRyOworfQorCitzdGQ6OnN0cmluZyBQcmltaXRpdmVUeXBlTmFtZShjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6CisgICAgICByZXR1cm4gSW50VHlwZU5hbWUob3B0aW9ucywgImludDMyIik7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICByZXR1cm4gSW50VHlwZU5hbWUob3B0aW9ucywgImludDY0Iik7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuIEludFR5cGVOYW1lKG9wdGlvbnMsICJ1aW50MzIiKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gSW50VHlwZU5hbWUob3B0aW9ucywgInVpbnQ2NCIpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiAiZmxvYXQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdGQ6OnN0cmluZyI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiAiIjsKKworICAgICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKKyAgICAgIC8vIENwcFR5cGVzIGFyZSBhZGRlZC4KKyAgfQorCisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gIiI7Cit9CisKK2NvbnN0IGNoYXIqIERlY2xhcmVkVHlwZU1ldGhvZE5hbWUoRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzI6CisgICAgICByZXR1cm4gIkludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiAiSW50NjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiAiVUludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gIlVJbnQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgICAgcmV0dXJuICJTSW50MzIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NDoKKyAgICAgIHJldHVybiAiU0ludDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyOgorICAgICAgcmV0dXJuICJGaXhlZDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0OgorICAgICAgcmV0dXJuICJGaXhlZDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjoKKyAgICAgIHJldHVybiAiU0ZpeGVkMzIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OgorICAgICAgcmV0dXJuICJTRml4ZWQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQ6CisgICAgICByZXR1cm4gIkZsb2F0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIkRvdWJsZSI7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJCb29sIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOgorICAgICAgcmV0dXJuICJFbnVtIjsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzoKKyAgICAgIHJldHVybiAiQnl0ZXMiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOgorICAgICAgcmV0dXJuICJHcm91cCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiAiTWVzc2FnZSI7CisKKyAgICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgICAvLyB0eXBlcyBhcmUgYWRkZWQuCisgIH0KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiAiIjsKK30KKworc3RkOjpzdHJpbmcgSW50MzJUb1N0cmluZyhpbnQgbnVtYmVyKSB7CisgIGlmIChudW1iZXIgPT0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKCkpIHsKKyAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIHNwZWNpYWwtY2FzZWQsIHNlZSBleHBsYW5hdGlvbiBoZXJlOgorICAgIC8vIGh0dHBzOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUyNjYxCisgICAgcmV0dXJuIFN0ckNhdChudW1iZXIgKyAxLCAiIC0gMSIpOworICB9IGVsc2UgeworICAgIHJldHVybiBTdHJDYXQobnVtYmVyKTsKKyAgfQorfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgSW50NjRUb1N0cmluZyhpbnQ2NF90IG51bWJlcikgeworICBpZiAobnVtYmVyID09IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpKSB7CisgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBzcGVjaWFsLWNhc2VkLCBzZWUgZXhwbGFuYXRpb24gaGVyZToKKyAgICAvLyBodHRwczovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MjY2MQorICAgIHJldHVybiBTdHJDYXQoImludDY0X3R7IiwgbnVtYmVyICsgMSwgIn0gLSAxIik7CisgIH0KKyAgcmV0dXJuIFN0ckNhdCgiaW50NjRfdHsiLCBudW1iZXIsICJ9Iik7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBVSW50NjRUb1N0cmluZyh1aW50NjRfdCBudW1iZXIpIHsKKyAgcmV0dXJuIFN0ckNhdCgidWludDY0X3R7IiwgbnVtYmVyLCAidX0iKTsKK30KKworc3RkOjpzdHJpbmcgRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIERlZmF1bHRWYWx1ZShPcHRpb25zKCksIGZpZWxkKTsKK30KKworc3RkOjpzdHJpbmcgRGVmYXVsdFZhbHVlKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgcmV0dXJuIEludDMyVG9TdHJpbmcoZmllbGQtPmRlZmF1bHRfdmFsdWVfaW50MzIoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuIFN0ckNhdChmaWVsZC0+ZGVmYXVsdF92YWx1ZV91aW50MzIoKSkgKyAidSI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICByZXR1cm4gSW50NjRUb1N0cmluZyhmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCgpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gVUludDY0VG9TdHJpbmcoZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDY0KCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRTogeworICAgICAgZG91YmxlIHZhbHVlID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfZG91YmxlKCk7CisgICAgICBpZiAodmFsdWUgPT0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7CisgICAgICAgIHJldHVybiAic3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpIjsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gLXN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgeworICAgICAgICByZXR1cm4gIi1zdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkiOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSB2YWx1ZSkgeworICAgICAgICByZXR1cm4gInN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCkiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFNpbXBsZUR0b2EodmFsdWUpOworICAgICAgfQorICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDogeworICAgICAgZmxvYXQgdmFsdWUgPSBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9mbG9hdCgpOworICAgICAgaWYgKHZhbHVlID09IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKSB7CisgICAgICAgIHJldHVybiAic3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkiOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkpIHsKKyAgICAgICAgcmV0dXJuICItc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkiOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSB2YWx1ZSkgeworICAgICAgICByZXR1cm4gInN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpxdWlldF9OYU4oKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBmbG9hdF92YWx1ZSA9IFNpbXBsZUZ0b2EodmFsdWUpOworICAgICAgICAvLyBJZiBmbG9hdGluZyBwb2ludCB2YWx1ZSBjb250YWlucyBhIHBlcmlvZCAoLikgb3IgYW4gZXhwb25lbnQKKyAgICAgICAgLy8gKGVpdGhlciBFIG9yIGUpLCB0aGVuIGFwcGVuZCBzdWZmaXggJ2YnIHRvIG1ha2UgaXQgYSBmbG9hdAorICAgICAgICAvLyBsaXRlcmFsLgorICAgICAgICBpZiAoZmxvYXRfdmFsdWUuZmluZF9maXJzdF9vZigiLmVFIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICBmbG9hdF92YWx1ZS5wdXNoX2JhY2soJ2YnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmxvYXRfdmFsdWU7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfYm9vbCgpID8gInRydWUiIDogImZhbHNlIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgLy8gTGF6eTogIEdlbmVyYXRlIGEgc3RhdGljX2Nhc3QgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgaGVscGVyIGZ1bmN0aW9uCisgICAgICAvLyAgIHRoYXQgY29uc3RydWN0cyB0aGUgZnVsbCBuYW1lIG9mIGFuIGVudW0gdmFsdWUuCisgICAgICByZXR1cm4gc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICAgICAic3RhdGljX2Nhc3Q8ICQwID4oJDEpIiwgQ2xhc3NOYW1lKGZpZWxkLT5lbnVtX3R5cGUoKSwgdHJ1ZSksCisgICAgICAgICAgSW50MzJUb1N0cmluZyhmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtKCktPm51bWJlcigpKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJcIiIgKworICAgICAgICAgICAgIEVzY2FwZVRyaWdyYXBocyhDRXNjYXBlKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKSkgKworICAgICAgICAgICAgICJcIiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiAiKiIgKyBGaWVsZE1lc3NhZ2VUeXBlTmFtZShmaWVsZCwgb3B0aW9ucykgKworICAgICAgICAgICAgICI6OmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSI7CisgIH0KKyAgLy8gQ2FuJ3QgYWN0dWFsbHkgZ2V0IGhlcmU7IG1ha2UgY29tcGlsZXIgaGFwcHkuICAoV2UgY291bGQgYWRkIGEgZGVmYXVsdAorICAvLyBjYXNlIGFib3ZlIGJ1dCB0aGVuIHdlIHdvdWxkbid0IGdldCB0aGUgbmljZSBjb21waWxlciB3YXJuaW5nIHdoZW4gYQorICAvLyBuZXcgdHlwZSBpcyBhZGRlZC4pCisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gIiI7Cit9CisKKy8vIENvbnZlcnQgYSBmaWxlIG5hbWUgaW50byBhIHZhbGlkIGlkZW50aWZpZXIuCitzdGQ6OnN0cmluZyBGaWxlbmFtZUlkZW50aWZpZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlbmFtZS5zaXplKCk7IGkrKykgeworICAgIGlmIChhc2NpaV9pc2FsbnVtKGZpbGVuYW1lW2ldKSkgeworICAgICAgcmVzdWx0LnB1c2hfYmFjayhmaWxlbmFtZVtpXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5vdCBhbHBoYW51bWVyaWMuICBUbyBhdm9pZCBhbnkgcG9zc2liaWxpdHkgb2YgbmFtZSBjb25mbGljdHMgd2UKKyAgICAgIC8vIHVzZSB0aGUgaGV4IGNvZGUgZm9yIHRoZSBjaGFyYWN0ZXIuCisgICAgICBTdHJBcHBlbmQoJnJlc3VsdCwgIl8iLAorICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3M6OkhleChzdGF0aWNfY2FzdDx1aW50OF90PihmaWxlbmFtZVtpXSkpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgVW5pcXVlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHJldHVybiBuYW1lICsgIl8iICsgRmlsZW5hbWVJZGVudGlmaWVyKGZpbGVuYW1lKTsKK30KKworLy8gUmV0dXJuIHRoZSBxdWFsaWZpZWQgQysrIG5hbWUgZm9yIGEgZmlsZSBsZXZlbCBzeW1ib2wuCitzdGQ6OnN0cmluZyBRdWFsaWZpZWRGaWxlTGV2ZWxTeW1ib2woY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBpZiAoZmlsZS0+cGFja2FnZSgpLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gU3RyQ2F0KCI6OiIsIG5hbWUpOworICB9CisgIHJldHVybiBTdHJDYXQoTmFtZXNwYWNlKGZpbGUsIG9wdGlvbnMpLCAiOjoiLCBuYW1lKTsKK30KKworLy8gRXNjYXBlIEMrKyB0cmlncmFwaHMgYnkgZXNjYXBpbmcgcXVlc3Rpb24gbWFya3MgdG8gXD8KK3N0ZDo6c3RyaW5nIEVzY2FwZVRyaWdyYXBocyhjb25zdCBzdGQ6OnN0cmluZyYgdG9fZXNjYXBlKSB7CisgIHJldHVybiBTdHJpbmdSZXBsYWNlKHRvX2VzY2FwZSwgIj8iLCAiXFw/IiwgdHJ1ZSk7Cit9CisKKy8vIEVzY2FwZWQgZnVuY3Rpb24gbmFtZSB0byBlbGltaW5hdGUgbmFtaW5nIGNvbmZsaWN0Lgorc3RkOjpzdHJpbmcgU2FmZUZ1bmN0aW9uTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4KSB7CisgIC8vIERvIG5vdCB1c2UgRmllbGROYW1lKCkgc2luY2UgaXQgd2lsbCBlc2NhcGUga2V5d29yZHMuCisgIHN0ZDo6c3RyaW5nIG5hbWUgPSBmaWVsZC0+bmFtZSgpOworICBMb3dlclN0cmluZygmbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX25hbWUgPSBwcmVmaXggKyBuYW1lOworICBpZiAoZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKGZ1bmN0aW9uX25hbWUpKSB7CisgICAgLy8gU2luZ2xlIHVuZGVyc2NvcmUgd2lsbCBhbHNvIG1ha2UgaXQgY29uZmxpY3Rpbmcgd2l0aCB0aGUgcHJpdmF0ZSBkYXRhCisgICAgLy8gbWVtYmVyLiBXZSB1c2UgZG91YmxlIHVuZGVyc2NvcmUgdG8gZXNjYXBlIGZ1bmN0aW9uIG5hbWVzLgorICAgIGZ1bmN0aW9uX25hbWUuYXBwZW5kKCJfXyIpOworICB9IGVsc2UgaWYgKGtLZXl3b3Jkcy5jb3VudChuYW1lKSA+IDApIHsKKyAgICAvLyBJZiB0aGUgZmllbGQgbmFtZSBpcyBhIGtleXdvcmQsIHdlIGFwcGVuZCB0aGUgdW5kZXJzY29yZSBiYWNrIHRvIGtlZXAgaXQKKyAgICAvLyBjb25zaXN0ZW50IHdpdGggb3RoZXIgZnVuY3Rpb24gbmFtZXMuCisgICAgZnVuY3Rpb25fbmFtZS5hcHBlbmQoIl8iKTsKKyAgfQorICByZXR1cm4gZnVuY3Rpb25fbmFtZTsKK30KKworYm9vbCBJc1N0cmluZ0lubGluZWQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICAodm9pZClkZXNjcmlwdG9yOworICAodm9pZClvcHRpb25zOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIEhhc0xhenlGaWVsZHMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNDQ0FuYWx5emVyKiBzY2NfYW5hbHl6ZXIpIHsKKyAgZm9yIChpbnQgZmllbGRfaWR4ID0gMDsgZmllbGRfaWR4IDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgZmllbGRfaWR4KyspIHsKKyAgICBpZiAoSXNMYXp5KGRlc2NyaXB0b3ItPmZpZWxkKGZpZWxkX2lkeCksIG9wdGlvbnMsIHNjY19hbmFseXplcikpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBkZXNjcmlwdG9yLT5leHRlbnNpb25fY291bnQoKTsgaWR4KyspIHsKKyAgICBpZiAoSXNMYXp5KGRlc2NyaXB0b3ItPmV4dGVuc2lvbihpZHgpLCBvcHRpb25zLCBzY2NfYW5hbHl6ZXIpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgZGVzY3JpcHRvci0+bmVzdGVkX3R5cGVfY291bnQoKTsgaWR4KyspIHsKKyAgICBpZiAoSGFzTGF6eUZpZWxkcyhkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZShpZHgpLCBvcHRpb25zLCBzY2NfYW5hbHl6ZXIpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBEb2VzIHRoZSBnaXZlbiBGaWxlRGVzY3JpcHRvciB1c2UgbGF6eSBmaWVsZHM/Citib29sIEhhc0xhenlGaWVsZHMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNDQ0FuYWx5emVyKiBzY2NfYW5hbHl6ZXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcihmaWxlLT5tZXNzYWdlX3R5cGUoaSkpOworICAgIGlmIChIYXNMYXp5RmllbGRzKGRlc2NyaXB0b3IsIG9wdGlvbnMsIHNjY19hbmFseXplcikpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICBmb3IgKGludCBmaWVsZF9pZHggPSAwOyBmaWVsZF9pZHggPCBmaWxlLT5leHRlbnNpb25fY291bnQoKTsgZmllbGRfaWR4KyspIHsKKyAgICBpZiAoSXNMYXp5KGZpbGUtPmV4dGVuc2lvbihmaWVsZF9pZHgpLCBvcHRpb25zLCBzY2NfYW5hbHl6ZXIpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFNob3VsZFNwbGl0KGNvbnN0IERlc2NyaXB0b3IqLCBjb25zdCBPcHRpb25zJikgeyByZXR1cm4gZmFsc2U7IH0KK2Jvb2wgU2hvdWxkU3BsaXQoY29uc3QgRmllbGREZXNjcmlwdG9yKiwgY29uc3QgT3B0aW9ucyYpIHsgcmV0dXJuIGZhbHNlOyB9CisKK3N0YXRpYyBib29sIEhhc1JlcGVhdGVkRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoZGVzY3JpcHRvci0+ZmllbGQoaSktPmxhYmVsKCkgPT0gRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+bmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgaWYgKEhhc1JlcGVhdGVkRmllbGRzKGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlKGkpKSkgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEhhc1JlcGVhdGVkRmllbGRzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIGlmIChIYXNSZXBlYXRlZEZpZWxkcyhmaWxlLT5tZXNzYWdlX3R5cGUoaSkpKSByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIElzU3RyaW5nUGllY2VGaWVsZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcgJiYKKyAgICAgICAgIEVmZmVjdGl2ZVN0cmluZ0NUeXBlKGZpZWxkLCBvcHRpb25zKSA9PSBGaWVsZE9wdGlvbnM6OlNUUklOR19QSUVDRTsKK30KKworc3RhdGljIGJvb2wgSGFzU3RyaW5nUGllY2VGaWVsZHMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoSXNTdHJpbmdQaWVjZUZpZWxkKGRlc2NyaXB0b3ItPmZpZWxkKGkpLCBvcHRpb25zKSkgcmV0dXJuIHRydWU7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoSGFzU3RyaW5nUGllY2VGaWVsZHMoZGVzY3JpcHRvci0+bmVzdGVkX3R5cGUoaSksIG9wdGlvbnMpKSByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSGFzU3RyaW5nUGllY2VGaWVsZHMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgaWYgKEhhc1N0cmluZ1BpZWNlRmllbGRzKGZpbGUtPm1lc3NhZ2VfdHlwZShpKSwgb3B0aW9ucykpIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgSXNDb3JkRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORyAmJgorICAgICAgICAgRWZmZWN0aXZlU3RyaW5nQ1R5cGUoZmllbGQsIG9wdGlvbnMpID09IEZpZWxkT3B0aW9uczo6Q09SRDsKK30KKworc3RhdGljIGJvb2wgSGFzQ29yZEZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgaWYgKElzQ29yZEZpZWxkKGRlc2NyaXB0b3ItPmZpZWxkKGkpLCBvcHRpb25zKSkgcmV0dXJuIHRydWU7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoSGFzQ29yZEZpZWxkcyhkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZShpKSwgb3B0aW9ucykpIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBIYXNDb3JkRmllbGRzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIGlmIChIYXNDb3JkRmllbGRzKGZpbGUtPm1lc3NhZ2VfdHlwZShpKSwgb3B0aW9ucykpIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgSGFzRXh0ZW5zaW9uc09yRXh0ZW5kYWJsZU1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBpZiAoZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSByZXR1cm4gdHJ1ZTsKKyAgaWYgKGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9jb3VudCgpID4gMCkgcmV0dXJuIHRydWU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+bmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgaWYgKEhhc0V4dGVuc2lvbnNPckV4dGVuZGFibGVNZXNzYWdlKGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlKGkpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBIYXNFeHRlbnNpb25zT3JFeHRlbmRhYmxlTWVzc2FnZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICBpZiAoZmlsZS0+ZXh0ZW5zaW9uX2NvdW50KCkgPiAwKSByZXR1cm4gdHJ1ZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgaWYgKEhhc0V4dGVuc2lvbnNPckV4dGVuZGFibGVNZXNzYWdlKGZpbGUtPm1lc3NhZ2VfdHlwZShpKSkpIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgSGFzTWFwRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoZGVzY3JpcHRvci0+ZmllbGQoaSktPmlzX21hcCgpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoSGFzTWFwRmllbGRzKGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlKGkpKSkgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEhhc01hcEZpZWxkcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoSGFzTWFwRmllbGRzKGZpbGUtPm1lc3NhZ2VfdHlwZShpKSkpIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgSGFzRW51bURlZmluaXRpb25zKGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSkgeworICBpZiAobWVzc2FnZV90eXBlLT5lbnVtX3R5cGVfY291bnQoKSA+IDApIHJldHVybiB0cnVlOworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfdHlwZS0+bmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgaWYgKEhhc0VudW1EZWZpbml0aW9ucyhtZXNzYWdlX3R5cGUtPm5lc3RlZF90eXBlKGkpKSkgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEhhc0VudW1EZWZpbml0aW9ucyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICBpZiAoZmlsZS0+ZW51bV90eXBlX2NvdW50KCkgPiAwKSByZXR1cm4gdHJ1ZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgaWYgKEhhc0VudW1EZWZpbml0aW9ucyhmaWxlLT5tZXNzYWdlX3R5cGUoaSkpKSByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgU2hvdWxkVmVyaWZ5KGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICBNZXNzYWdlU0NDQW5hbHl6ZXIqIHNjY19hbmFseXplcikgeworICAodm9pZClkZXNjcmlwdG9yOworICAodm9pZClvcHRpb25zOworICAodm9pZClzY2NfYW5hbHl6ZXI7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTaG91bGRWZXJpZnkoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICBNZXNzYWdlU0NDQW5hbHl6ZXIqIHNjY19hbmFseXplcikgeworICAodm9pZClmaWxlOworICAodm9pZClvcHRpb25zOworICAodm9pZClzY2NfYW5hbHl6ZXI7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJc1V0ZjhTdHJpbmcoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICByZXR1cm4gSXNQcm90bzMoZmllbGQtPmZpbGUoKSkgJiYKKyAgICAgIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzsKK30KKworVmVyaWZ5U2ltcGxlVHlwZSBTaG91bGRWZXJpZnlTaW1wbGUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICAodm9pZClkZXNjcmlwdG9yOworICByZXR1cm4gVmVyaWZ5U2ltcGxlVHlwZTo6a0N1c3RvbTsKK30KKworYm9vbCBJc1N0cmluZ09yTWVzc2FnZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gZmFsc2U7Cit9CisKK0ZpZWxkT3B0aW9uczo6Q1R5cGUgRWZmZWN0aXZlU3RyaW5nQ1R5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBHT09HTEVfRENIRUNLKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcpOworICBpZiAob3B0aW9ucy5vcGVuc291cmNlX3J1bnRpbWUpIHsKKyAgICAvLyBPcGVuLXNvdXJjZSBwcm90b2J1ZiByZWxlYXNlIG9ubHkgc3VwcG9ydHMgU1RSSU5HIGN0eXBlLgorICAgIHJldHVybiBGaWVsZE9wdGlvbnM6OlNUUklORzsKKyAgfSBlbHNlIHsKKyAgICAvLyBHb29nbGUtaW50ZXJuYWwgc3VwcG9ydHMgYWxsIGN0eXBlcy4KKyAgICByZXR1cm4gZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpOworICB9Cit9CisKK2Jvb2wgSXNBbnlNZXNzYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5uYW1lKCkgPT0ga0FueVByb3RvRmlsZTsKK30KKworYm9vbCBJc0FueU1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gZGVzY3JpcHRvci0+bmFtZSgpID09IGtBbnlNZXNzYWdlTmFtZSAmJgorICAgICAgICAgSXNBbnlNZXNzYWdlKGRlc2NyaXB0b3ItPmZpbGUoKSwgb3B0aW9ucyk7Cit9CisKK2Jvb2wgSXNXZWxsS25vd25NZXNzYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIHN0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IHdlbGxfa25vd25fZmlsZXN7CisgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90byIsCisgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90byIsCisgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90byIsCisgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iLAorICAgICAgImdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90byIsCisgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvIiwKKyAgICAgICJnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90byIsCisgICAgICAiZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvIiwKKyAgICAgICJnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvIiwKKyAgICAgICJnb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvIiwKKyAgICAgICJnb29nbGUvcHJvdG9idWYvdHlwZS5wcm90byIsCisgICAgICAiZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvIiwKKyAgfTsKKyAgcmV0dXJuIHdlbGxfa25vd25fZmlsZXMuZmluZChmaWxlLT5uYW1lKCkpICE9IHdlbGxfa25vd25fZmlsZXMuZW5kKCk7Cit9CisKK3N0YXRpYyBib29sIEZpZWxkRW5mb3JjZVV0ZjgoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgRmlsZVV0ZjhWZXJpZmljYXRpb24oY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHJldHVybiB0cnVlOworfQorCisvLyBXaGljaCBsZXZlbCBvZiBVVEYtOCBlbmZvcmNlbWFudCBpcyBwbGFjZWQgb24gdGhpcyBmaWxlLgorVXRmOENoZWNrTW9kZSBHZXRVdGY4Q2hlY2tNb2RlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBpZiAoZmllbGQtPmZpbGUoKS0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzMgJiYKKyAgICAgIEZpZWxkRW5mb3JjZVV0ZjgoZmllbGQsIG9wdGlvbnMpKSB7CisgICAgcmV0dXJuIFV0ZjhDaGVja01vZGU6OmtTdHJpY3Q7CisgIH0gZWxzZSBpZiAoR2V0T3B0aW1pemVGb3IoZmllbGQtPmZpbGUoKSwgb3B0aW9ucykgIT0KKyAgICAgICAgICAgICAgICAgRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRSAmJgorICAgICAgICAgICAgIEZpbGVVdGY4VmVyaWZpY2F0aW9uKGZpZWxkLT5maWxlKCksIG9wdGlvbnMpKSB7CisgICAgcmV0dXJuIFV0ZjhDaGVja01vZGU6OmtWZXJpZnk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFV0ZjhDaGVja01vZGU6OmtOb25lOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEdlbmVyYXRlVXRmOENoZWNrQ29kZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGJvb2wgZm9yX3BhcnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3RyaWN0X2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZlcmlmeV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZXImIGZvcm1hdCkgeworICBzd2l0Y2ggKEdldFV0ZjhDaGVja01vZGUoZmllbGQsIG9wdGlvbnMpKSB7CisgICAgY2FzZSBVdGY4Q2hlY2tNb2RlOjprU3RyaWN0OiB7CisgICAgICBpZiAoZm9yX3BhcnNlKSB7CisgICAgICAgIGZvcm1hdCgiRE9fKCIpOworICAgICAgfQorICAgICAgZm9ybWF0KCI6OiRwcm90b19ucyQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6JDEkKFxuIiwgc3RyaWN0X2Z1bmN0aW9uKTsKKyAgICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgICAgIGZvcm1hdChwYXJhbWV0ZXJzKTsKKyAgICAgIGlmIChmb3JfcGFyc2UpIHsKKyAgICAgICAgZm9ybWF0KCI6OiRwcm90b19ucyQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UEFSU0UsXG4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdCgiOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNFUklBTElaRSxcbiIpOworICAgICAgfQorICAgICAgZm9ybWF0KCJcIiQxJFwiKSIsIGZpZWxkLT5mdWxsX25hbWUoKSk7CisgICAgICBpZiAoZm9yX3BhcnNlKSB7CisgICAgICAgIGZvcm1hdCgiKSIpOworICAgICAgfQorICAgICAgZm9ybWF0KCI7XG4iKTsKKyAgICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBVdGY4Q2hlY2tNb2RlOjprVmVyaWZ5OiB7CisgICAgICBmb3JtYXQoIjo6JHByb3RvX25zJDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OiQxJChcbiIsIHZlcmlmeV9mdW5jdGlvbik7CisgICAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgICBmb3JtYXQocGFyYW1ldGVycyk7CisgICAgICBpZiAoZm9yX3BhcnNlKSB7CisgICAgICAgIGZvcm1hdCgiOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsXG4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdCgiOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLFxuIik7CisgICAgICB9CisgICAgICBmb3JtYXQoIlwiJDEkXCIpO1xuIiwgZmllbGQtPmZ1bGxfbmFtZSgpKTsKKyAgICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBVdGY4Q2hlY2tNb2RlOjprTm9uZToKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlRm9yU3RyaW5nKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBib29sIGZvcl9wYXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZXImIGZvcm1hdCkgeworICBHZW5lcmF0ZVV0ZjhDaGVja0NvZGUoZmllbGQsIG9wdGlvbnMsIGZvcl9wYXJzZSwgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICJWZXJpZnlVdGY4U3RyaW5nIiwgIlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCk7Cit9CisKK3ZvaWQgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlRm9yQ29yZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGJvb2wgZm9yX3BhcnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybWF0dGVyJiBmb3JtYXQpIHsKKyAgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlKGZpZWxkLCBvcHRpb25zLCBmb3JfcGFyc2UsIHBhcmFtZXRlcnMsICJWZXJpZnlVdGY4Q29yZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVmVyaWZ5VVRGOENvcmROYW1lZEZpZWxkIiwgZm9ybWF0KTsKK30KKwordm9pZCBGbGF0dGVuTWVzc2FnZXNJbkZpbGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBEZXNjcmlwdG9yKj4qIHJlc3VsdCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBGb3JFYWNoTWVzc2FnZShmaWxlLT5tZXNzYWdlX3R5cGUoaSksIFsmXShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgICAgICByZXN1bHQtPnB1c2hfYmFjayhkZXNjcmlwdG9yKTsKKyAgICB9KTsKKyAgfQorfQorCitib29sIEhhc1dlYWtGaWVsZHMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGlmIChJc1dlYWsoZGVzY3JpcHRvci0+ZmllbGQoaSksIG9wdGlvbnMpKSByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSGFzV2Vha0ZpZWxkcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoSGFzV2Vha0ZpZWxkcyhmaWxlLT5tZXNzYWdlX3R5cGUoaSksIG9wdGlvbnMpKSByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVXNpbmdJbXBsaWNpdFdlYWtGaWVsZHMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIG9wdGlvbnMubGl0ZV9pbXBsaWNpdF93ZWFrX2ZpZWxkcyAmJgorICAgICAgICAgR2V0T3B0aW1pemVGb3IoZmlsZSwgb3B0aW9ucykgPT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRTsKK30KKworYm9vbCBJc0ltcGxpY2l0V2Vha0ZpZWxkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNDQ0FuYWx5emVyKiBzY2NfYW5hbHl6ZXIpIHsKKyAgcmV0dXJuIFVzaW5nSW1wbGljaXRXZWFrRmllbGRzKGZpZWxkLT5maWxlKCksIG9wdGlvbnMpICYmCisgICAgICAgICBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFICYmCisgICAgICAgICAhZmllbGQtPmlzX3JlcXVpcmVkKCkgJiYgIWZpZWxkLT5pc19tYXAoKSAmJiAhZmllbGQtPmlzX2V4dGVuc2lvbigpICYmCisgICAgICAgICAhSXNXZWxsS25vd25NZXNzYWdlKGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+ZmlsZSgpKSAmJgorICAgICAgICAgZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5maWxlKCktPm5hbWUoKSAhPQorICAgICAgICAgICAgICJuZXQvcHJvdG8yL3Byb3RvL2Rlc2NyaXB0b3IucHJvdG8iICYmCisgICAgICAgICAvLyBXZSBkbyBub3Qgc3VwcG9ydCBpbXBsaWNpdCB3ZWFrIGZpZWxkcyBiZXR3ZWVuIG1lc3NhZ2VzIGluIHRoZSBzYW1lCisgICAgICAgICAvLyBzdHJvbmdseS1jb25uZWN0ZWQgY29tcG9uZW50LgorICAgICAgICAgc2NjX2FuYWx5emVyLT5HZXRTQ0MoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpKSAhPQorICAgICAgICAgICAgIHNjY19hbmFseXplci0+R2V0U0NDKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSk7Cit9CisKK01lc3NhZ2VBbmFseXNpcyBNZXNzYWdlU0NDQW5hbHl6ZXI6OkdldFNDQ0FuYWx5c2lzKGNvbnN0IFNDQyogc2NjKSB7CisgIGlmIChhbmFseXNpc19jYWNoZV8uY291bnQoc2NjKSkgcmV0dXJuIGFuYWx5c2lzX2NhY2hlX1tzY2NdOworICBNZXNzYWdlQW5hbHlzaXMgcmVzdWx0OworICBpZiAoVXNpbmdJbXBsaWNpdFdlYWtGaWVsZHMoc2NjLT5HZXRGaWxlKCksIG9wdGlvbnNfKSkgeworICAgIHJlc3VsdC5jb250YWluc193ZWFrID0gdHJ1ZTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IHNjYy0+ZGVzY3JpcHRvcnMuc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gc2NjLT5kZXNjcmlwdG9yc1tpXTsKKyAgICBpZiAoZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgICByZXN1bHQuY29udGFpbnNfZXh0ZW5zaW9uID0gdHJ1ZTsKKyAgICB9CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBqKyspIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yLT5maWVsZChqKTsKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVxdWlyZWQoKSkgeworICAgICAgICByZXN1bHQuY29udGFpbnNfcmVxdWlyZWQgPSB0cnVlOworICAgICAgfQorICAgICAgaWYgKGZpZWxkLT5vcHRpb25zKCkud2VhaygpKSB7CisgICAgICAgIHJlc3VsdC5jb250YWluc193ZWFrID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoZmllbGQtPnR5cGUoKSkgeworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTOiB7CisgICAgICAgICAgaWYgKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSA9PSBGaWVsZE9wdGlvbnM6OkNPUkQpIHsKKyAgICAgICAgICAgIHJlc3VsdC5jb250YWluc19jb3JkID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVA6CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6IHsKKyAgICAgICAgICBjb25zdCBTQ0MqIGNoaWxkID0gYW5hbHl6ZXJfLkdldFNDQyhmaWVsZC0+bWVzc2FnZV90eXBlKCkpOworICAgICAgICAgIGlmIChjaGlsZCAhPSBzY2MpIHsKKyAgICAgICAgICAgIE1lc3NhZ2VBbmFseXNpcyBhbmFseXNpcyA9IEdldFNDQ0FuYWx5c2lzKGNoaWxkKTsKKyAgICAgICAgICAgIHJlc3VsdC5jb250YWluc19jb3JkIHw9IGFuYWx5c2lzLmNvbnRhaW5zX2NvcmQ7CisgICAgICAgICAgICByZXN1bHQuY29udGFpbnNfZXh0ZW5zaW9uIHw9IGFuYWx5c2lzLmNvbnRhaW5zX2V4dGVuc2lvbjsKKyAgICAgICAgICAgIGlmICghU2hvdWxkSWdub3JlUmVxdWlyZWRGaWVsZENoZWNrKGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgICAgICAgICAgcmVzdWx0LmNvbnRhaW5zX3JlcXVpcmVkIHw9IGFuYWx5c2lzLmNvbnRhaW5zX3JlcXVpcmVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmNvbnRhaW5zX3dlYWsgfD0gYW5hbHlzaXMuY29udGFpbnNfd2VhazsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhpcyBmaWVsZCBwb2ludHMgYmFjayBpbnRvIHRoZSBzYW1lIFNDQyBoZW5jZSB0aGUgbWVzc2FnZXMKKyAgICAgICAgICAgIC8vIGluIHRoZSBTQ0MgYXJlIHJlY3Vyc2l2ZS4gTm90ZSBpZiBTQ0MgY29udGFpbnMgbW9yZSB0aGFuIHR3bworICAgICAgICAgICAgLy8gbm9kZXMgaXQgaGFzIHRvIGJlIHJlY3Vyc2l2ZSwgaG93ZXZlciB0aGlzIHRlc3QgYWxzbyB3b3JrcyBmb3IKKyAgICAgICAgICAgIC8vIGEgc2luZ2xlIG5vZGUgdGhhdCBpcyByZWN1cnNpdmUuCisgICAgICAgICAgICByZXN1bHQuaXNfcmVjdXJzaXZlID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gV2UgZGVsaWJlcmF0ZWx5IG9ubHkgaW5zZXJ0IHRoZSByZXN1bHQgaGVyZS4gQWZ0ZXIgd2UgY29udHJhY3RlZCB0aGUgU0NDCisgIC8vIGluIHRoZSBncmFwaCwgdGhlIGdyYXBoIHNob3VsZCBiZSBhIERBRy4gSGVuY2Ugd2Ugc2hvdWxkbid0IG5lZWQgdG8gbWFyaworICAvLyBub2RlcyB2aXNpdGVkIGFzIHdlIGNhbiBuZXZlciByZXR1cm4gdG8gdGhlbS4gQnkgaW5zZXJ0aW5nIHRoZW0gaGVyZQorICAvLyB3ZSB3aWxsIGdvIGluIGFuIGluZmluaXRlIGxvb3AgaWYgdGhlIFNDQyBpcyBub3QgY29ycmVjdC4KKyAgcmV0dXJuIGFuYWx5c2lzX2NhY2hlX1tzY2NdID0gcmVzdWx0OworfQorCit2b2lkIExpc3RBbGxGaWVsZHMoY29uc3QgRGVzY3JpcHRvciogZCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogZmllbGRzKSB7CisgIC8vIENvbGxlY3Qgc3ViIG1lc3NhZ2VzCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZC0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgTGlzdEFsbEZpZWxkcyhkLT5uZXN0ZWRfdHlwZShpKSwgZmllbGRzKTsKKyAgfQorICAvLyBDb2xsZWN0IG1lc3NhZ2UgbGV2ZWwgZXh0ZW5zaW9ucy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRzLT5wdXNoX2JhY2soZC0+ZXh0ZW5zaW9uKGkpKTsKKyAgfQorICAvLyBBZGQgdHlwZXMgb2YgZmllbGRzIG5lY2Vzc2FyeQorICBmb3IgKGludCBpID0gMDsgaSA8IGQtPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkcy0+cHVzaF9iYWNrKGQtPmZpZWxkKGkpKTsKKyAgfQorfQorCit2b2lkIExpc3RBbGxGaWVsZHMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGQsCisgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIGZpZWxkcykgeworICAvLyBDb2xsZWN0IGZpbGUgbGV2ZWwgbWVzc2FnZS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgTGlzdEFsbEZpZWxkcyhkLT5tZXNzYWdlX3R5cGUoaSksIGZpZWxkcyk7CisgIH0KKyAgLy8gQ29sbGVjdCBtZXNzYWdlIGxldmVsIGV4dGVuc2lvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZC0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkcy0+cHVzaF9iYWNrKGQtPmV4dGVuc2lvbihpKSk7CisgIH0KK30KKwordm9pZCBMaXN0QWxsVHlwZXNGb3JTZXJ2aWNlcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IERlc2NyaXB0b3IqPiogdHlwZXMpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmZC0+c2VydmljZV9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2QgPSBmZC0+c2VydmljZShpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHNkLT5tZXRob2RfY291bnQoKTsgaisrKSB7CisgICAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBzZC0+bWV0aG9kKGopOworICAgICAgdHlwZXMtPnB1c2hfYmFjayhtZXRob2QtPmlucHV0X3R5cGUoKSk7CisgICAgICB0eXBlcy0+cHVzaF9iYWNrKG1ldGhvZC0+b3V0cHV0X3R5cGUoKSk7CisgICAgfQorICB9Cit9CisKK2Jvb2wgR2V0Qm9vdHN0cmFwQmFzZW5hbWUoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogYm9vdHN0cmFwX2Jhc2VuYW1lKSB7CisgIGlmIChvcHRpb25zLm9wZW5zb3VyY2VfcnVudGltZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGJvb3RzdHJhcF9tYXBwaW5neworICAgICAgeyJuZXQvcHJvdG8yL3Byb3RvL2Rlc2NyaXB0b3IiLAorICAgICAgICJ0aGlyZF9wYXJ0eS9wcm90b2J1Zi9kZXNjcmlwdG9yIn0sCisgICAgICB7Im5ldC9wcm90bzIvY29tcGlsZXIvcHJvdG8vcGx1Z2luIiwKKyAgICAgICAibmV0L3Byb3RvMi9jb21waWxlci9wcm90by9wbHVnaW4ifSwKKyAgICAgIHsibmV0L3Byb3RvMi9jb21waWxlci9wcm90by9wcm9maWxlIiwKKyAgICAgICAibmV0L3Byb3RvMi9jb21waWxlci9wcm90by9wcm9maWxlX2Jvb3RzdHJhcCJ9LAorICB9OworICBhdXRvIGl0ZXIgPSBib290c3RyYXBfbWFwcGluZy5maW5kKGJhc2VuYW1lKTsKKyAgaWYgKGl0ZXIgPT0gYm9vdHN0cmFwX21hcHBpbmcuZW5kKCkpIHsKKyAgICAqYm9vdHN0cmFwX2Jhc2VuYW1lID0gYmFzZW5hbWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgICpib290c3RyYXBfYmFzZW5hbWUgPSBpdGVyLT5zZWNvbmQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKworYm9vbCBJc0Jvb3RzdHJhcFByb3RvKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIHN0ZDo6c3RyaW5nIG15X25hbWUgPSBTdHJpcFByb3RvKGZpbGUtPm5hbWUoKSk7CisgIHJldHVybiBHZXRCb290c3RyYXBCYXNlbmFtZShvcHRpb25zLCBteV9uYW1lLCAmbXlfbmFtZSk7Cit9CisKK2Jvb2wgTWF5YmVCb290c3RyYXAoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYm9vdHN0cmFwX2ZsYWcsIHN0ZDo6c3RyaW5nKiBiYXNlbmFtZSkgeworICBzdGQ6OnN0cmluZyBib290c3RyYXBfYmFzZW5hbWU7CisgIGlmICghR2V0Qm9vdHN0cmFwQmFzZW5hbWUob3B0aW9ucywgKmJhc2VuYW1lLCAmYm9vdHN0cmFwX2Jhc2VuYW1lKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChib290c3RyYXBfZmxhZykgeworICAgIC8vIEFkanVzdCBiYXNlbmFtZSwgYnV0IGRvbid0IGFib3J0IGNvZGUgZ2VuZXJhdGlvbi4KKyAgICAqYmFzZW5hbWUgPSBib290c3RyYXBfYmFzZW5hbWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmb3J3YXJkX3RvX2Jhc2VuYW1lID0gYm9vdHN0cmFwX2Jhc2VuYW1lOworCisgICAgLy8gR2VuZXJhdGUgZm9yd2FyZGluZyBoZWFkZXJzIGFuZCBlbXB0eSAucGIuY2MuCisgICAgeworICAgICAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgICAgIGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKCpiYXNlbmFtZSArICIucGIuaCIpKTsKKyAgICAgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcsIG51bGxwdHIpOworICAgICAgcHJpbnRlci5QcmludCgKKyAgICAgICAgICAiI2lmbmRlZiBQUk9UT0JVRl9JTkNMVURFRF8kZmlsZW5hbWVfaWRlbnRpZmllciRfRk9SV0FSRF9QQl9IXG4iCisgICAgICAgICAgIiNkZWZpbmUgUFJPVE9CVUZfSU5DTFVERURfJGZpbGVuYW1lX2lkZW50aWZpZXIkX0ZPUldBUkRfUEJfSFxuIgorICAgICAgICAgICIjaW5jbHVkZSBcIiRmb3J3YXJkX3RvX2Jhc2VuYW1lJC5wYi5oXCIgIC8vIElXWVUgcHJhZ21hOiBleHBvcnRcbiIKKyAgICAgICAgICAiI2VuZGlmICAvLyBQUk9UT0JVRl9JTkNMVURFRF8kZmlsZW5hbWVfaWRlbnRpZmllciRfRk9SV0FSRF9QQl9IXG4iLAorICAgICAgICAgICJmb3J3YXJkX3RvX2Jhc2VuYW1lIiwgZm9yd2FyZF90b19iYXNlbmFtZSwgImZpbGVuYW1lX2lkZW50aWZpZXIiLAorICAgICAgICAgIEZpbGVuYW1lSWRlbnRpZmllcigqYmFzZW5hbWUpKTsKKworICAgICAgaWYgKCFvcHRpb25zLm9wZW5zb3VyY2VfcnVudGltZSkgeworICAgICAgICAvLyBIQUNLIEhBQ0sgSEFDSywgdGVjaCBkZWJ0IGZyb20gdGhlIGRlZXBzIG9mIHByb3RvMSBhbmQgU1dJRworICAgICAgICAvLyBwcm90b2NvbHR5cGUgaXMgU1dJRydlZCBhbmQgd2UgbmVlZCB0byBmb3J3YXJkCisgICAgICAgIGlmICgqYmFzZW5hbWUgPT0gIm5ldC9wcm90by9wcm90b2NvbHR5cGUiKSB7CisgICAgICAgICAgcHJpbnRlci5QcmludCgKKyAgICAgICAgICAgICAgIiNpZmRlZiBTV0lHXG4iCisgICAgICAgICAgICAgICIlaW5jbHVkZSBcIiRmb3J3YXJkX3RvX2Jhc2VuYW1lJC5wYi5oXCJcbiIKKyAgICAgICAgICAgICAgIiNlbmRpZiAgLy8gU1dJR1xuIiwKKyAgICAgICAgICAgICAgImZvcndhcmRfdG9fYmFzZW5hbWUiLCBmb3J3YXJkX3RvX2Jhc2VuYW1lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgICAgICBnZW5lcmF0b3JfY29udGV4dC0+T3BlbigqYmFzZW5hbWUgKyAiLnByb3RvLmgiKSk7CisgICAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnLCBudWxscHRyKTsKKyAgICAgIHByaW50ZXIuUHJpbnQoCisgICAgICAgICAgIiNpZm5kZWYgUFJPVE9CVUZfSU5DTFVERURfJGZpbGVuYW1lX2lkZW50aWZpZXIkX0ZPUldBUkRfUFJPVE9fSFxuIgorICAgICAgICAgICIjZGVmaW5lIFBST1RPQlVGX0lOQ0xVREVEXyRmaWxlbmFtZV9pZGVudGlmaWVyJF9GT1JXQVJEX1BST1RPX0hcbiIKKyAgICAgICAgICAiI2luY2x1ZGUgXCIkZm9yd2FyZF90b19iYXNlbmFtZSQucHJvdG8uaFwiICAvLyBJV1lVIHByYWdtYTogIgorICAgICAgICAgICJleHBvcnRcbiIKKyAgICAgICAgICAiI2VuZGlmICAvLyAiCisgICAgICAgICAgIlBST1RPQlVGX0lOQ0xVREVEXyRmaWxlbmFtZV9pZGVudGlmaWVyJF9GT1JXQVJEX1BST1RPX0hcbiIsCisgICAgICAgICAgImZvcndhcmRfdG9fYmFzZW5hbWUiLCBmb3J3YXJkX3RvX2Jhc2VuYW1lLCAiZmlsZW5hbWVfaWRlbnRpZmllciIsCisgICAgICAgICAgRmlsZW5hbWVJZGVudGlmaWVyKCpiYXNlbmFtZSkpOworICAgIH0KKworICAgIHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgICAgICBnZW5lcmF0b3JfY29udGV4dC0+T3BlbigqYmFzZW5hbWUgKyAiLnBiLmNjIikpOworICAgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJywgbnVsbHB0cik7CisgICAgICBwcmludGVyLlByaW50KCJcbiIpOworICAgIH0KKworICAgIHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgICAgICBnZW5lcmF0b3JfY29udGV4dC0+T3BlbigqYmFzZW5hbWUgKyAiLnBiLmgubWV0YSIpKTsKKyAgICB9CisKKyAgICB7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICAgICAgZ2VuZXJhdG9yX2NvbnRleHQtPk9wZW4oKmJhc2VuYW1lICsgIi5wcm90by5oLm1ldGEiKSk7CisgICAgfQorCisgICAgLy8gQWJvcnQgY29kZSBnZW5lcmF0aW9uLgorICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK3N0YXRpYyBib29sIEhhc0V4dGVuc2lvbkZyb21GaWxlKGNvbnN0IE1lc3NhZ2UmIG1zZywgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogaGFzX29wdF9jb2Rlc2l6ZV9leHRlbnNpb24pIHsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBhdXRvIHJlZmxlY3Rpb24gPSBtc2cuR2V0UmVmbGVjdGlvbigpOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1zZywgJmZpZWxkcyk7CisgIGZvciAoYXV0byBmaWVsZCA6IGZpZWxkcykgeworICAgIGNvbnN0IGF1dG8qIGZpZWxkX21zZyA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKKyAgICBpZiAoZmllbGRfbXNnID09IG51bGxwdHIpIHsKKyAgICAgIC8vIEl0IHNvIGhhcHBlbnMgdGhhdCBlbnVtcyBJc19WYWxpZCBhcmUgc3RpbGwgZ2VuZXJhdGVkIHNvIGVudW1zIHdvcmsuCisgICAgICAvLyBPbmx5IG1lc3NhZ2VzIGhhdmUgcG90ZW50aWFsIHByb2JsZW1zLgorICAgICAgY29udGludWU7CisgICAgfQorICAgIC8vIElmIHRoaXMgb3B0aW9uIGhhcyBhbiBleHRlbnNpb24gc2V0IEFORCB0aGF0IGV4dGVuc2lvbiBpcyBkZWZpbmVkIGluIHRoZQorICAgIC8vIHNhbWUgZmlsZSB3ZSBoYXZlIGJvb3RzdHJhcCBwcm9ibGVtLgorICAgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAgIGNvbnN0IGF1dG8qIG1zZ19leHRlbnNpb25fZmlsZSA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+ZmlsZSgpOworICAgICAgaWYgKG1zZ19leHRlbnNpb25fZmlsZSA9PSBmaWxlKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChoYXNfb3B0X2NvZGVzaXplX2V4dGVuc2lvbiAmJgorICAgICAgICAgIEdldE9wdGltaXplRm9yKG1zZ19leHRlbnNpb25fZmlsZSwgb3B0aW9ucykgPT0KKyAgICAgICAgICAgICAgRmlsZU9wdGlvbnM6OkNPREVfU0laRSkgeworICAgICAgICAqaGFzX29wdF9jb2Rlc2l6ZV9leHRlbnNpb24gPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgICAvLyBSZWN1cnNlIGluIHRoaXMgZmllbGQgdG8gc2VlIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiB0aGVyZQorICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZsZWN0aW9uLT5GaWVsZFNpemUobXNnLCBmaWVsZCk7IGkrKykgeworICAgICAgICBpZiAoSGFzRXh0ZW5zaW9uRnJvbUZpbGUocmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1zZywgZmllbGQsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwgb3B0aW9ucywgaGFzX29wdF9jb2Rlc2l6ZV9leHRlbnNpb24pKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKEhhc0V4dGVuc2lvbkZyb21GaWxlKHJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobXNnLCBmaWVsZCksIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywgaGFzX29wdF9jb2Rlc2l6ZV9leHRlbnNpb24pKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIEhhc0Jvb3RzdHJhcFByb2JsZW0oY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGhhc19vcHRfY29kZXNpemVfZXh0ZW5zaW9uKSB7CisgIHN0YXRpYyBhdXRvJiBjYWNoZSA9ICpuZXcgc3RkOjp1bm9yZGVyZWRfbWFwPGNvbnN0IEZpbGVEZXNjcmlwdG9yKiwgYm9vbD47CisgIGF1dG8gaXQgPSBjYWNoZS5maW5kKGZpbGUpOworICBpZiAoaXQgIT0gY2FjaGUuZW5kKCkpIHJldHVybiBpdC0+c2Vjb25kOworICAvLyBJbiBvcmRlciB0byBidWlsZCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgcmVmbGVjdGl2ZSBwYXJzZSwgaXQgbmVlZHMKKyAgLy8gdG8gcGFyc2UgdGhlIHNlcmlhbGl6ZWQgZGVzY3JpcHRvciBkZXNjcmliaW5nIGFsbCB0aGUgbWVzc2FnZXMgZGVmaW5lZCBpbgorICAvLyB0aGlzIGZpbGUuIE9idmlvdXNseSB0aGlzIHByZXNlbnRzIGEgYm9vdHN0cmFwIHByb2JsZW0gZm9yIGRlc2NyaXB0b3IKKyAgLy8gbWVzc2FnZXMuCisgIGlmIChmaWxlLT5uYW1lKCkgPT0gIm5ldC9wcm90bzIvcHJvdG8vZGVzY3JpcHRvci5wcm90byIgfHwKKyAgICAgIGZpbGUtPm5hbWUoKSA9PSAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgLy8gVW5mb3J0dW5hdGVseSB3ZSdyZSBub3QgZG9uZSB5ZXQuIFRoZSBkZXNjcmlwdG9yIG9wdGlvbiBtZXNzYWdlcyBhbGxvdworICAvLyBmb3IgZXh0ZW5zaW9ucy4gU28gd2UgbmVlZCB0byBiZSBhYmxlIHRvIHBhcnNlIHRoZXNlIGV4dGVuc2lvbnMgaW4gb3JkZXIKKyAgLy8gdG8gcGFyc2UgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgYSBmaWxlIHRoYXQgaGFzIGN1c3RvbSBvcHRpb25zLiBUaGlzIGlzIGEKKyAgLy8gcHJvYmxlbSB3aGVuIHRoZXNlIGN1c3RvbSBvcHRpb25zIGV4dGVuc2lvbnMgYXJlIGRlZmluZWQgaW4gdGhlIHNhbWUgZmlsZS4KKyAgRmlsZURlc2NyaXB0b3JQcm90byBsaW5rZWRpbl9mZF9wcm90bzsKKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wgPSBmaWxlLT5wb29sKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGZkX3Byb3RvX2Rlc2NyaXB0b3IgPQorICAgICAgcG9vbC0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKGxpbmtlZGluX2ZkX3Byb3RvLkdldFR5cGVOYW1lKCkpOworICAvLyBOb3QgYWxsIHBvb2xzIGhhdmUgZGVzY3JpcHRvci5wcm90byBpbiB0aGVtLiBJbiB0aGVzZSBjYXNlcyB0aGVyZSBmb3Igc3VyZQorICAvLyBhcmUgbm8gY3VzdG9tIG9wdGlvbnMuCisgIGlmIChmZF9wcm90b19kZXNjcmlwdG9yID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKworICAvLyBJdCdzIGVhc2llciB0byBpbnNwZWN0IGZpbGUgYXMgYSBwcm90bywgYmVjYXVzZSB3ZSBjYW4gdXNlIHJlZmxlY3Rpb24gb24KKyAgLy8gdGhlIHByb3RvIHRvIGl0ZXJhdGUgb3ZlciBhbGwgY29udGVudC4KKyAgZmlsZS0+Q29weVRvKCZsaW5rZWRpbl9mZF9wcm90byk7CisKKyAgLy8gbGlua2VkaW5fZmRfcHJvdG8gaXMgYSBnZW5lcmF0ZWQgcHJvdG8gbGlua2VkIGluIHRoZSBwcm90byBjb21waWxlci4gQXMKKyAgLy8gc3VjaCBpdCBkb2Vzbid0IGtub3cgdGhlIGV4dGVuc2lvbnMgdGhhdCBhcmUgcG90ZW50aWFsbHkgcHJlc2VudCBpbiB0aGUKKyAgLy8gZGVzY3JpcHRvciBwb29sIGNvbnN0cnVjdGVkIGZyb20gdGhlIHByb3RvcyB0aGF0IGFyZSBiZWluZyBjb21waWxlZC4gVGhlc2UKKyAgLy8gY3VzdG9tIG9wdGlvbnMgYXJlIHRoZXJlZm9yZSBpbiB0aGUgdW5rbm93biBmaWVsZHMuCisgIC8vIEJ5IGJ1aWxkaW5nIHRoZSBjb3JyZXNwb25kaW5nIEZpbGVEZXNjcmlwdG9yUHJvdG8gaW4gdGhlIHBvb2wgY29uc3RydWN0ZWQKKyAgLy8gYnkgdGhlIHByb3RvcyB0aGF0IGFyZSBiZWluZyBjb21waWxlZCwgaWUuIGZpbGUncyBwb29sLCB0aGUgdW5rbm93biBmaWVsZHMKKyAgLy8gYXJlIGNvbnZlcnRlZCB0byBleHRlbnNpb25zLgorICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZmFjdG9yeShwb29sKTsKKyAgTWVzc2FnZSogZmRfcHJvdG8gPSBmYWN0b3J5LkdldFByb3RvdHlwZShmZF9wcm90b19kZXNjcmlwdG9yKS0+TmV3KCk7CisgIGZkX3Byb3RvLT5QYXJzZUZyb21TdHJpbmcobGlua2VkaW5fZmRfcHJvdG8uU2VyaWFsaXplQXNTdHJpbmcoKSk7CisKKyAgYm9vbCYgcmVzID0gY2FjaGVbZmlsZV07CisgIHJlcyA9IEhhc0V4dGVuc2lvbkZyb21GaWxlKCpmZF9wcm90bywgZmlsZSwgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX29wdF9jb2Rlc2l6ZV9leHRlbnNpb24pOworICBkZWxldGUgZmRfcHJvdG87CisgIHJldHVybiByZXM7Cit9CisKK0ZpbGVPcHRpb25zX09wdGltaXplTW9kZSBHZXRPcHRpbWl6ZUZvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGhhc19vcHRfY29kZXNpemVfZXh0ZW5zaW9uKSB7CisgIGlmIChoYXNfb3B0X2NvZGVzaXplX2V4dGVuc2lvbikgKmhhc19vcHRfY29kZXNpemVfZXh0ZW5zaW9uID0gZmFsc2U7CisgIHN3aXRjaCAob3B0aW9ucy5lbmZvcmNlX21vZGUpIHsKKyAgICBjYXNlIEVuZm9yY2VPcHRpbWl6ZU1vZGU6OmtTcGVlZDoKKyAgICAgIHJldHVybiBGaWxlT3B0aW9uczo6U1BFRUQ7CisgICAgY2FzZSBFbmZvcmNlT3B0aW1pemVNb2RlOjprTGl0ZVJ1bnRpbWU6CisgICAgICByZXR1cm4gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRTsKKyAgICBjYXNlIEVuZm9yY2VPcHRpbWl6ZU1vZGU6OmtDb2RlU2l6ZToKKyAgICAgIGlmIChmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgPT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRSkgeworICAgICAgICByZXR1cm4gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRTsKKyAgICAgIH0KKyAgICAgIGlmIChIYXNCb290c3RyYXBQcm9ibGVtKGZpbGUsIG9wdGlvbnMsIGhhc19vcHRfY29kZXNpemVfZXh0ZW5zaW9uKSkgeworICAgICAgICByZXR1cm4gRmlsZU9wdGlvbnM6OlNQRUVEOworICAgICAgfQorICAgICAgcmV0dXJuIEZpbGVPcHRpb25zOjpDT0RFX1NJWkU7CisgICAgY2FzZSBFbmZvcmNlT3B0aW1pemVNb2RlOjprTm9FbmZvcmNlbWVudDoKKyAgICAgIGlmIChmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgPT0gRmlsZU9wdGlvbnM6OkNPREVfU0laRSkgeworICAgICAgICBpZiAoSGFzQm9vdHN0cmFwUHJvYmxlbShmaWxlLCBvcHRpb25zLCBoYXNfb3B0X2NvZGVzaXplX2V4dGVuc2lvbikpIHsKKyAgICAgICAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJQcm90byBzdGF0ZXMgb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFLCBidXQgd2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGhvbm9yIHRoYXQgYmVjYXVzZSBpdCBjb250YWlucyBjdXN0b20gb3B0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVuc2lvbnMgZGVmaW5lZCBpbiB0aGUgc2FtZSBwcm90by4iOworICAgICAgICAgIHJldHVybiBGaWxlT3B0aW9uczo6U1BFRUQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCk7CisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5rbm93biBvcHRpbWl6YXRpb24gZW5mb3JjZW1lbnQgcmVxdWVzdGVkLiI7CisgIC8vIFRoZSBwaG9ueSByZXR1cm4gYmVsb3cgc2VydmVzIHRvIHNpbGVuY2UgYSB3YXJuaW5nIGZyb20gR0NDIDguCisgIHJldHVybiBGaWxlT3B0aW9uczo6U1BFRUQ7Cit9CisKK2lubGluZSBib29sIElzTWVzc2FnZU93bmVkQXJlbmFFbGlnaWJsZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIEdldE9wdGltaXplRm9yKGRlc2MtPmZpbGUoKSwgb3B0aW9ucykgIT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRSAmJgorICAgICAgICAgIW9wdGlvbnMuYm9vdHN0cmFwICYmICFvcHRpb25zLm9wZW5zb3VyY2VfcnVudGltZSAmJgorICAgICAgICAgQWxsb2NFeHBlY3RlZChkZXNjKTsKK30KKworYm9vbCBFbmFibGVNZXNzYWdlT3duZWRBcmVuYShjb25zdCBEZXNjcmlwdG9yKiBkZXNjLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgICh2b2lkKWRlc2M7CisgICh2b2lkKW9wdGlvbnM7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBFbmFibGVNZXNzYWdlT3duZWRBcmVuYVRyaWFsKGNvbnN0IERlc2NyaXB0b3IqIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSGFzTWVzc2FnZUZpZWxkT3JFeHRlbnNpb24oY29uc3QgRGVzY3JpcHRvciogZGVzYykgeworICBpZiAoZGVzYy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSByZXR1cm4gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvKiBmIDogRmllbGRSYW5nZShkZXNjKSkgeworICAgIGlmIChmLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkY2RhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2hlbHBlcnMuaApAQCAtMCwwICsxLDEwNjQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0hFTFBFUlNfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfSEVMUEVSU19IX18KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc2NjLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9uYW1lcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvb3B0aW9ucy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworZW51bSBjbGFzcyBBcmVuYUR0b3JOZWVkcyB7IGtOb25lID0gMCwga09uRGVtYW5kID0gMSwga1JlcXVpcmVkID0gMiB9OworCitpbmxpbmUgc3RkOjpzdHJpbmcgUHJvdG9idWZOYW1lc3BhY2UoY29uc3QgT3B0aW9ucyYgLyogb3B0aW9ucyAqLykgeworICByZXR1cm4gIlBST1RPQlVGX05BTUVTUEFDRV9JRCI7Cit9CisKK2lubGluZSBzdGQ6OnN0cmluZyBNYWNyb1ByZWZpeChjb25zdCBPcHRpb25zJiAvKiBvcHRpb25zICovKSB7CisgIHJldHVybiAiR09PR0xFX1BST1RPQlVGIjsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIERlcHJlY2F0ZWRBdHRyaWJ1dGUoY29uc3QgT3B0aW9ucyYgLyogb3B0aW9ucyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZCkgeworICByZXR1cm4gZC0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKSA/ICJQUk9UT0JVRl9ERVBSRUNBVEVEICIgOiAiIjsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIERlcHJlY2F0ZWRBdHRyaWJ1dGUoY29uc3QgT3B0aW9ucyYgLyogb3B0aW9ucyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGQpIHsKKyAgcmV0dXJuIGQtPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkgPyAiUFJPVE9CVUZfREVQUkVDQVRFRF9FTlVNICIgOiAiIjsKK30KKworLy8gQ29tbW9ubHktdXNlZCBzZXBhcmF0b3IgY29tbWVudHMuICBUaGljayBpcyBhIGxpbmUgb2YgJz0nLCB0aGluIGlzIGEgbGluZQorLy8gb2YgJy0nLgorZXh0ZXJuIGNvbnN0IGNoYXIga1RoaWNrU2VwYXJhdG9yW107CitleHRlcm4gY29uc3QgY2hhciBrVGhpblNlcGFyYXRvcltdOworCit2b2lkIFNldENvbW1vblZhcnMoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJpYWJsZXMpOworCisvLyBWYXJpYWJsZXMgdG8gYWNjZXNzIG1lc3NhZ2UgZGF0YSBmcm9tIHRoZSBtZXNzYWdlIHNjb3BlLgordm9pZCBTZXRDb21tb25NZXNzYWdlRGF0YVZhcmlhYmxlcygKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcyk7CisKK3ZvaWQgU2V0VW5rbm93bkZpZWxkc1ZhcmlhYmxlKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzKTsKKworYm9vbCBHZXRCb290c3RyYXBCYXNlbmFtZShjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBib290c3RyYXBfYmFzZW5hbWUpOworYm9vbCBNYXliZUJvb3RzdHJhcChjb25zdCBPcHRpb25zJiBvcHRpb25zLCBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBib290c3RyYXBfZmxhZywgc3RkOjpzdHJpbmcqIGJhc2VuYW1lKTsKK2Jvb2wgSXNCb290c3RyYXBQcm90byhjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisKKy8vIE5hbWUgc3BhY2Ugb2YgdGhlIHByb3RvIGZpbGUuIFRoaXMgbmFtZXNwYWNlIGlzIHN1Y2ggdGhhdCB0aGUgc3RyaW5nCisvLyAiPG5hbWVzcGFjZT46OnNvbWVfbmFtZSIgaXMgdGhlIGNvcnJlY3QgZnVsbHkgcXVhbGlmaWVkIG5hbWVzcGFjZS4KKy8vIFRoaXMgbWVhbnMgaWYgdGhlIHBhY2thZ2UgaXMgZW1wdHkgdGhlIG5hbWVzcGFjZSBpcyAiIiwgYW5kIG90aGVyd2lzZQorLy8gdGhlIG5hbWVzcGFjZSBpcyAiOjpmb286OmJhcjo6Li4uOjpiYXoiIHdpdGhvdXQgdHJhaWxpbmcgc2VtaS1jb2xvbnMuCitzdGQ6OnN0cmluZyBOYW1lc3BhY2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGQsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworc3RkOjpzdHJpbmcgTmFtZXNwYWNlKGNvbnN0IERlc2NyaXB0b3IqIGQsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworc3RkOjpzdHJpbmcgTmFtZXNwYWNlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CitzdGQ6OnN0cmluZyBOYW1lc3BhY2UoY29uc3QgRW51bURlc2NyaXB0b3IqIGQsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCisvLyBSZXR1cm5zIHRydWUgaWYgaXQncyBzYWZlIHRvIHJlc2V0ICJmaWVsZCIgdG8gemVyby4KK2Jvb2wgQ2FuSW5pdGlhbGl6ZUJ5WmVyb2luZyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX2Rlc2NyaXB0b3IpOworCitzdGQ6OnN0cmluZyBRdWFsaWZpZWRDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CitzdGQ6OnN0cmluZyBRdWFsaWZpZWRDbGFzc05hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGQsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCitzdGQ6OnN0cmluZyBRdWFsaWZpZWRDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZCk7CitzdGQ6OnN0cmluZyBRdWFsaWZpZWRDbGFzc05hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGQpOworCisvLyBERVBSRUNBVEVEIGp1c3QgdXNlIENsYXNzTmFtZSBvciBRdWFsaWZpZWRDbGFzc05hbWUsIGEgYm9vbGVhbiBpcyB2ZXJ5CisvLyB1bnJlYWRhYmxlIGF0IHRoZSBjYWxsc2l0ZS4KKy8vIFJldHVybnMgdGhlIG5vbi1uZXN0ZWQgdHlwZSBuYW1lIGZvciB0aGUgZ2l2ZW4gdHlwZS4gIElmICJxdWFsaWZpZWQiIGlzCisvLyB0cnVlLCBwcmVmaXggdGhlIHR5cGUgd2l0aCB0aGUgZnVsbCBuYW1lc3BhY2UuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZDoKKy8vICAgcGFja2FnZSBmb28uYmFyOworLy8gICBtZXNzYWdlIEJheiB7IG1lc3NhZ2UgTW9vIHt9IH0KKy8vIFRoZW4gdGhlIHF1YWxpZmllZCBDbGFzc05hbWUgZm9yIE1vbyB3b3VsZCBiZToKKy8vICAgOjpmb286OmJhcjo6QmF6X01vbworLy8gV2hpbGUgdGhlIG5vbi1xdWFsaWZpZWQgdmVyc2lvbiB3b3VsZCBiZToKKy8vICAgQmF6X01vbworaW5saW5lIHN0ZDo6c3RyaW5nIENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBib29sIHF1YWxpZmllZCkgeworICByZXR1cm4gcXVhbGlmaWVkID8gUXVhbGlmaWVkQ2xhc3NOYW1lKGRlc2NyaXB0b3IsIE9wdGlvbnMoKSkKKyAgICAgICAgICAgICAgICAgICA6IENsYXNzTmFtZShkZXNjcmlwdG9yKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwgYm9vbCBxdWFsaWZpZWQpIHsKKyAgcmV0dXJuIHF1YWxpZmllZCA/IFF1YWxpZmllZENsYXNzTmFtZShkZXNjcmlwdG9yLCBPcHRpb25zKCkpCisgICAgICAgICAgICAgICAgICAgOiBDbGFzc05hbWUoZGVzY3JpcHRvcik7Cit9CisKKy8vIFJldHVybnMgdGhlIGV4dGVuc2lvbiBuYW1lIHByZWZpeGVkIHdpdGggdGhlIGNsYXNzIG5hbWUgaWYgbmVzdGVkIGJ1dCB3aXRob3V0CisvLyB0aGUgcGFja2FnZSBuYW1lLgorc3RkOjpzdHJpbmcgRXh0ZW5zaW9uTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGQpOworCitzdGQ6OnN0cmluZyBRdWFsaWZpZWRFeHRlbnNpb25OYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CitzdGQ6OnN0cmluZyBRdWFsaWZpZWRFeHRlbnNpb25OYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZCk7CisKKy8vIFR5cGUgbmFtZSBvZiBkZWZhdWx0IGluc3RhbmNlLgorc3RkOjpzdHJpbmcgRGVmYXVsdEluc3RhbmNlVHlwZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBib29sIHNwbGl0ID0gZmFsc2UpOworCisvLyBOb24tcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGRlZmF1bHRfaW5zdGFuY2Ugb2YgdGhpcyBtZXNzYWdlLgorc3RkOjpzdHJpbmcgRGVmYXVsdEluc3RhbmNlTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBib29sIHNwbGl0ID0gZmFsc2UpOworCisvLyBOb24tcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGRlZmF1bHQgaW5zdGFuY2UgcG9pbnRlci4gVGhpcyBpcyB1c2VkIG9ubHkgZm9yCisvLyBpbXBsaWNpdCB3ZWFrIGZpZWxkcywgd2hlcmUgd2UgbmVlZCBhbiBleHRyYSBpbmRpcmVjdGlvbi4KK3N0ZDo6c3RyaW5nIERlZmF1bHRJbnN0YW5jZVB0cihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGJvb2wgc3BsaXQgPSBmYWxzZSk7CisKKy8vIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBkZWZhdWx0X2luc3RhbmNlIG9mIHRoaXMgbWVzc2FnZS4KK3N0ZDo6c3RyaW5nIFF1YWxpZmllZERlZmF1bHRJbnN0YW5jZU5hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzcGxpdCA9IGZhbHNlKTsKKworLy8gRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGRlZmF1bHQgaW5zdGFuY2UgcG9pbnRlci4KK3N0ZDo6c3RyaW5nIFF1YWxpZmllZERlZmF1bHRJbnN0YW5jZVB0cihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzcGxpdCA9IGZhbHNlKTsKKworLy8gRGVzY3JpcHRvclRhYmxlIHZhcmlhYmxlIG5hbWUuCitzdGQ6OnN0cmluZyBEZXNjcmlwdG9yVGFibGVOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworLy8gV2hlbiBkZWNsYXJpbmcgc3ltYm9sIGV4dGVybnMgZnJvbSBhbm90aGVyIGZpbGUsIHRoaXMgbWFjcm8gd2lsbCBzdXBwbHkgdGhlCisvLyBkbGxleHBvcnQgbmVlZGVkIGZvciB0aGUgdGFyZ2V0IGZpbGUsIGlmIGFueS4KK3N0ZDo6c3RyaW5nIEZpbGVEbGxFeHBvcnQoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCisvLyBOYW1lIG9mIHRoZSBiYXNlIGNsYXNzOiBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIG9yIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlLgorc3RkOjpzdHJpbmcgU3VwZXJDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCisvLyBBZGRzIGFuIHVuZGVyc2NvcmUgaWYgbmVjZXNzYXJ5IHRvIHByZXZlbnQgY29uZmxpY3Rpbmcgd2l0aCBhIGtleXdvcmQuCitzdGQ6OnN0cmluZyBSZXNvbHZlS2V5d29yZChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisKKy8vIEdldCB0aGUgKHVucXVhbGlmaWVkKSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgZmllbGQgaW4gQysrIGNvZGUuCisvLyBUaGUgbmFtZSBpcyBjb2VyY2VkIHRvIGxvd2VyLWNhc2UgdG8gZW11bGF0ZSBwcm90bzEgYmVoYXZpb3IuICBQZW9wbGUKKy8vIHNob3VsZCBiZSB1c2luZyBsb3dlcmNhc2Utd2l0aC11bmRlcnNjb3JlcyBzdHlsZSBmb3IgcHJvdG8gZmllbGQgbmFtZXMKKy8vIGFueXdheSwgc28gbm9ybWFsbHkgdGhpcyBqdXN0IHJldHVybnMgZmllbGQtPm5hbWUoKS4KK3N0ZDo6c3RyaW5nIEZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworLy8gUmV0dXJucyB0aGUgKHVucXVhbGlmaWVkKSBwcml2YXRlIG1lbWJlciBuYW1lIGZvciB0aGlzIGZpZWxkIGluIEMrKyBjb2RlLgorc3RkOjpzdHJpbmcgRmllbGRNZW1iZXJOYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGJvb2wgc3BsaXQpOworCisvLyBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBjb21waWxlcidzIGFsaWdubWVudCBmb3IgdGhlIGZpZWxkLiAgVGhpcworLy8gY2FuJ3QgZ3VhcmFudGVlIHRvIGJlIGNvcnJlY3QgYmVjYXVzZSB0aGUgZ2VuZXJhdGVkIGNvZGUgY291bGQgYmUgY29tcGlsZWQgb24KKy8vIGRpZmZlcmVudCBzeXN0ZW1zIHdpdGggZGlmZmVyZW50IGFsaWdubWVudCBydWxlcy4gIFRoZSBlc3RpbWF0ZXMgYmVsb3cgYXNzdW1lCisvLyA2NC1iaXQgcG9pbnRlcnMuCitpbnQgRXN0aW1hdGVBbGlnbm1lbnRTaXplKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisvLyBHZXQgdGhlIHVucXVhbGlmaWVkIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgYSBmaWVsZCdzIGZpZWxkCisvLyBudW1iZXIgY29uc3RhbnQuCitzdGQ6OnN0cmluZyBGaWVsZENvbnN0YW50TmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworLy8gUmV0dXJucyB0aGUgc2NvcGUgd2hlcmUgdGhlIGZpZWxkIHdhcyBkZWZpbmVkIChmb3IgZXh0ZW5zaW9ucywgdGhpcyBpcworLy8gZGlmZmVyZW50IGZyb20gdGhlIG1lc3NhZ2UgdHlwZSB0byB3aGljaCB0aGUgZmllbGQgYXBwbGllcykuCitpbmxpbmUgY29uc3QgRGVzY3JpcHRvciogRmllbGRTY29wZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHJldHVybiBmaWVsZC0+aXNfZXh0ZW5zaW9uKCkgPyBmaWVsZC0+ZXh0ZW5zaW9uX3Njb3BlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZpZWxkLT5jb250YWluaW5nX3R5cGUoKTsKK30KKworLy8gUmV0dXJucyB0aGUgZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZSBmaWVsZC0+bWVzc2FnZV90eXBlKCkuICBVc3VhbGx5IHRoaXMKKy8vIGlzIGp1c3QgQ2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgdHJ1ZSk7CitzdGQ6OnN0cmluZyBGaWVsZE1lc3NhZ2VUeXBlTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKy8vIEdldCB0aGUgQysrIHR5cGUgbmFtZSBmb3IgYSBwcmltaXRpdmUgdHlwZSAoZS5nLiAiZG91YmxlIiwgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIiLCBldGMuKS4KK2NvbnN0IGNoYXIqIFByaW1pdGl2ZVR5cGVOYW1lKEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSB0eXBlKTsKK3N0ZDo6c3RyaW5nIFByaW1pdGl2ZVR5cGVOYW1lKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgdHlwZSk7CisKKy8vIEdldCB0aGUgZGVjbGFyZWQgdHlwZSBuYW1lIGluIENhbWVsQ2FzZSBmb3JtYXQsIGFzIGlzIHVzZWQgZS5nLiBmb3IgdGhlCisvLyBtZXRob2RzIG9mIFdpcmVGb3JtYXQuICBGb3IgZXhhbXBsZSwgVFlQRV9JTlQzMiBiZWNvbWVzICJJbnQzMiIuCitjb25zdCBjaGFyKiBEZWNsYXJlZFR5cGVNZXRob2ROYW1lKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKTsKKworLy8gUmV0dXJuIHRoZSBjb2RlIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBudW1iZXIgd2hlbiBjb21waWxlZC4KK3N0ZDo6c3RyaW5nIEludDMyVG9TdHJpbmcoaW50IG51bWJlcik7CisKKy8vIEdldCBjb2RlIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBmaWVsZCdzIGRlZmF1bHQgdmFsdWUuCitzdGQ6OnN0cmluZyBEZWZhdWx0VmFsdWUoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKy8vIENvbXBhdGliaWxpdHkgZnVuY3Rpb24gZm9yIGNhbGxlcnMgb3V0c2lkZSBwcm90bzIuCitzdGQ6OnN0cmluZyBEZWZhdWx0VmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKy8vIENvbnZlcnQgYSBmaWxlIG5hbWUgaW50byBhIHZhbGlkIGlkZW50aWZpZXIuCitzdGQ6OnN0cmluZyBGaWxlbmFtZUlkZW50aWZpZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKKworLy8gRm9yIGVhY2ggLnByb3RvIGZpbGUgZ2VuZXJhdGVzIGEgdW5pcXVlIG5hbWUuIFRvIHByZXZlbnQgY29sbGlzaW9ucyBvZgorLy8gc3ltYm9scyBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZQorc3RkOjpzdHJpbmcgVW5pcXVlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKK2lubGluZSBzdGQ6OnN0cmluZyBVbmlxdWVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBGaWxlRGVzY3JpcHRvciogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIFVuaXF1ZU5hbWUobmFtZSwgZC0+bmFtZSgpLCBvcHRpb25zKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyBVbmlxdWVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBEZXNjcmlwdG9yKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gVW5pcXVlTmFtZShuYW1lLCBkLT5maWxlKCksIG9wdGlvbnMpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nIFVuaXF1ZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gVW5pcXVlTmFtZShuYW1lLCBkLT5maWxlKCksIG9wdGlvbnMpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nIFVuaXF1ZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIFVuaXF1ZU5hbWUobmFtZSwgZC0+ZmlsZSgpLCBvcHRpb25zKTsKK30KKworLy8gVmVyc2lvbnMgZm9yIGNhbGwgc2l0ZXMgdGhhdCBvbmx5IHN1cHBvcnQgdGhlIGludGVybmFsIHJ1bnRpbWUgKGxpa2UgcHJvdG8xCisvLyBzdXBwb3J0KS4KK2lubGluZSBPcHRpb25zIEludGVybmFsUnVudGltZU9wdGlvbnMoKSB7CisgIE9wdGlvbnMgb3B0aW9uczsKKyAgb3B0aW9ucy5vcGVuc291cmNlX3J1bnRpbWUgPSBmYWxzZTsKKyAgcmV0dXJuIG9wdGlvbnM7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcgVW5pcXVlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgeworICByZXR1cm4gVW5pcXVlTmFtZShuYW1lLCBmaWxlbmFtZSwgSW50ZXJuYWxSdW50aW1lT3B0aW9ucygpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyBVbmlxdWVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGQpIHsKKyAgcmV0dXJuIFVuaXF1ZU5hbWUobmFtZSwgZC0+bmFtZSgpLCBJbnRlcm5hbFJ1bnRpbWVPcHRpb25zKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nIFVuaXF1ZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IERlc2NyaXB0b3IqIGQpIHsKKyAgcmV0dXJuIFVuaXF1ZU5hbWUobmFtZSwgZC0+ZmlsZSgpLCBJbnRlcm5hbFJ1bnRpbWVPcHRpb25zKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nIFVuaXF1ZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZCkgeworICByZXR1cm4gVW5pcXVlTmFtZShuYW1lLCBkLT5maWxlKCksIEludGVybmFsUnVudGltZU9wdGlvbnMoKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcgVW5pcXVlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkKSB7CisgIHJldHVybiBVbmlxdWVOYW1lKG5hbWUsIGQtPmZpbGUoKSwgSW50ZXJuYWxSdW50aW1lT3B0aW9ucygpKTsKK30KKworLy8gUmV0dXJuIHRoZSBxdWFsaWZpZWQgQysrIG5hbWUgZm9yIGEgZmlsZSBsZXZlbCBzeW1ib2wuCitzdGQ6OnN0cmluZyBRdWFsaWZpZWRGaWxlTGV2ZWxTeW1ib2woY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKy8vIEVzY2FwZSBDKysgdHJpZ3JhcGhzIGJ5IGVzY2FwaW5nIHF1ZXN0aW9uIG1hcmtzIHRvIFw/CitzdGQ6OnN0cmluZyBFc2NhcGVUcmlncmFwaHMoY29uc3Qgc3RkOjpzdHJpbmcmIHRvX2VzY2FwZSk7CisKKy8vIEVzY2FwZWQgZnVuY3Rpb24gbmFtZSB0byBlbGltaW5hdGUgbmFtaW5nIGNvbmZsaWN0Lgorc3RkOjpzdHJpbmcgU2FmZUZ1bmN0aW9uTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4KTsKKworLy8gUmV0dXJucyB0cnVlIGlmIGdlbmVyYXRlZCBtZXNzYWdlcyBoYXZlIHB1YmxpYyB1bmtub3duIGZpZWxkcyBhY2Nlc3NvcnMKK2lubGluZSBib29sIFB1YmxpY1Vua25vd25GaWVsZHNBY2Nlc3NvcnMoY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSkgeworICByZXR1cm4gbWVzc2FnZS0+ZmlsZSgpLT5zeW50YXgoKSAhPSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMzsKK30KKworLy8gUmV0dXJucyB0aGUgb3B0aW1pemUgbW9kZSBmb3IgPGZpbGU+LCByZXNwZWN0aW5nIDxvcHRpb25zLmVuZm9yY2VfbGl0ZT4uCitGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgR2V0T3B0aW1pemVGb3IoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKy8vIERldGVybWluZXMgd2hldGhlciB1bmtub3duIGZpZWxkcyB3aWxsIGJlIHN0b3JlZCBpbiBhbiBVbmtub3duRmllbGRTZXQgb3IKKy8vIGEgc3RyaW5nLgoraW5saW5lIGJvb2wgVXNlVW5rbm93bkZpZWxkU2V0KGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIEdldE9wdGltaXplRm9yKGZpbGUsIG9wdGlvbnMpICE9IEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7Cit9CisKK2lubGluZSBib29sIElzV2Vhayhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGlmIChmaWVsZC0+b3B0aW9ucygpLndlYWsoKSkgeworICAgIEdPT0dMRV9DSEVDSyghb3B0aW9ucy5vcGVuc291cmNlX3J1bnRpbWUpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJc1N0cmluZ0lubGluZWQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworLy8gRm9yIGEgc3RyaW5nIGZpZWxkLCByZXR1cm5zIHRoZSBlZmZlY3RpdmUgY3R5cGUuICBJZiB0aGUgYWN0dWFsIGN0eXBlIGlzCisvLyBub3Qgc3VwcG9ydGVkLCByZXR1cm5zIHRoZSBkZWZhdWx0IG9mIFNUUklORy4KK0ZpZWxkT3B0aW9uczo6Q1R5cGUgRWZmZWN0aXZlU3RyaW5nQ1R5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKK2lubGluZSBib29sIElzQ29yZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHJldHVybiBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HICYmCisgICAgICAgICBFZmZlY3RpdmVTdHJpbmdDVHlwZShmaWVsZCwgb3B0aW9ucykgPT0gRmllbGRPcHRpb25zOjpDT1JEOworfQorCitpbmxpbmUgYm9vbCBJc1N0cmluZyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHJldHVybiBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HICYmCisgICAgICAgICBFZmZlY3RpdmVTdHJpbmdDVHlwZShmaWVsZCwgb3B0aW9ucykgPT0gRmllbGRPcHRpb25zOjpTVFJJTkc7Cit9CisKK2lubGluZSBib29sIElzU3RyaW5nUGllY2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORyAmJgorICAgICAgICAgRWZmZWN0aXZlU3RyaW5nQ1R5cGUoZmllbGQsIG9wdGlvbnMpID09IEZpZWxkT3B0aW9uczo6U1RSSU5HX1BJRUNFOworfQorCitjbGFzcyBNZXNzYWdlU0NDQW5hbHl6ZXI7CisKKy8vIERvZXMgdGhlIGdpdmVuIEZpbGVEZXNjcmlwdG9yIHVzZSBsYXp5IGZpZWxkcz8KK2Jvb2wgSGFzTGF6eUZpZWxkcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBNZXNzYWdlU0NDQW5hbHl6ZXIqIHNjY19hbmFseXplcik7CisKKy8vIElzIHRoZSBnaXZlbiBmaWVsZCBhIHN1cHBvcnRlZCBsYXp5IGZpZWxkPworYm9vbCBJc0xhenkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKTsKKworLy8gSXMgdGhpcyBhbiBleHBsaWNpdCAobm9uLXByb2ZpbGUgZHJpdmVuKSBsYXp5IGZpZWxkLCBhcyBkZW5vdGVkIGJ5CisvLyBsYXp5L3VudmVyaWZpZWRfbGF6eSBpbiB0aGUgZGVzY3JpcHRvcj8KK2lubGluZSBib29sIElzRXhwbGljaXRMYXp5KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIGZpZWxkLT5vcHRpb25zKCkubGF6eSgpIHx8IGZpZWxkLT5vcHRpb25zKCkudW52ZXJpZmllZF9sYXp5KCk7Cit9CisKK2Jvb2wgSXNFYWdlcmx5VmVyaWZpZWRMYXp5KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU0NDQW5hbHl6ZXIqIHNjY19hbmFseXplcik7CisKK2Jvb2wgSXNMYXppbHlWZXJpZmllZExhenkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKy8vIElzIHRoZSBnaXZlbiBtZXNzYWdlIGJlaW5nIHNwbGl0IChnby9wZHNwbGl0KT8KK2Jvb2wgU2hvdWxkU3BsaXQoY29uc3QgRGVzY3JpcHRvciogZGVzYywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKy8vIElzIHRoZSBnaXZlbiBmaWVsZCBiZWluZyBzcGxpdCBvdXQ/Citib29sIFNob3VsZFNwbGl0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCitpbmxpbmUgYm9vbCBJc0ZpZWxkVXNlZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIC8qIGZpZWxkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgLyogb3B0aW9ucyAqLykgeworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmICJmaWVsZCIgaXMgc3RyaXBwZWQuCitpbmxpbmUgYm9vbCBJc0ZpZWxkU3RyaXBwZWQoY29uc3QgRmllbGREZXNjcmlwdG9yKiAvKmZpZWxkKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgLypvcHRpb25zKi8pIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBEb2VzIHRoZSBmaWxlIGNvbnRhaW4gYW55IGRlZmluaXRpb25zIHRoYXQgbmVlZCBleHRlbnNpb25fc2V0Lmg/Citib29sIEhhc0V4dGVuc2lvbnNPckV4dGVuZGFibGVNZXNzYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworLy8gRG9lcyB0aGUgZmlsZSBoYXZlIGFueSByZXBlYXRlZCBmaWVsZHMsIG5lY2Vzc2l0YXRpbmcgdGhlIGZpbGUgdG8gaW5jbHVkZQorLy8gcmVwZWF0ZWRfZmllbGQuaD8gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHJlcGVhdGVkIGV4dGVuc2lvbnMsIHNpbmNlIHRob3NlIGFyZQorLy8gYWxsIHN0b3JlZCBpbnRlcm5hbGx5IGluIGFuIEV4dGVuc2lvblNldCwgbm90IGEgc2VwYXJhdGUgUmVwZWF0ZWRGaWVsZCouCitib29sIEhhc1JlcGVhdGVkRmllbGRzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworLy8gRG9lcyB0aGUgZmlsZSBoYXZlIGFueSBzdHJpbmcvYnl0ZXMgZmllbGRzIHdpdGggY3R5cGU9U1RSSU5HX1BJRUNFPyBUaGlzCisvLyBkb2VzIG5vdCBpbmNsdWRlIGV4dGVuc2lvbnMsIHNpbmNlIGN0eXBlIGlzIGlnbm9yZWQgZm9yIGV4dGVuc2lvbnMuCitib29sIEhhc1N0cmluZ1BpZWNlRmllbGRzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworLy8gRG9lcyB0aGUgZmlsZSBoYXZlIGFueSBzdHJpbmcvYnl0ZXMgZmllbGRzIHdpdGggY3R5cGU9Q09SRD8gVGhpcyBkb2VzIG5vdAorLy8gaW5jbHVkZSBleHRlbnNpb25zLCBzaW5jZSBjdHlwZSBpcyBpZ25vcmVkIGZvciBleHRlbnNpb25zLgorYm9vbCBIYXNDb3JkRmllbGRzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworLy8gRG9lcyB0aGUgZmlsZSBoYXZlIGFueSBtYXAgZmllbGRzLCBuZWNlc3NpdGF0aW5nIHRoZSBmaWxlIHRvIGluY2x1ZGUKKy8vIG1hcF9maWVsZF9pbmwuaCBhbmQgbWFwLmguCitib29sIEhhc01hcEZpZWxkcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisKKy8vIERvZXMgdGhpcyBmaWxlIGhhdmUgYW55IGVudW0gdHlwZSBkZWZpbml0aW9ucz8KK2Jvb2wgSGFzRW51bURlZmluaXRpb25zKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworLy8gRG9lcyB0aGlzIGZpbGUgaGF2ZSBnZW5lcmF0ZWQgcGFyc2luZywgc2VyaWFsaXphdGlvbiwgYW5kIG90aGVyCisvLyBzdGFuZGFyZCBtZXRob2RzIGZvciB3aGljaCByZWZsZWN0aW9uLWJhc2VkIGZhbGxiYWNrIGltcGxlbWVudGF0aW9ucyBleGlzdD8KK2lubGluZSBib29sIEhhc0dlbmVyYXRlZE1ldGhvZHMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIEdldE9wdGltaXplRm9yKGZpbGUsIG9wdGlvbnMpICE9IEZpbGVPcHRpb25zOjpDT0RFX1NJWkU7Cit9CisKKy8vIERvIG1lc3NhZ2UgY2xhc3NlcyBpbiB0aGlzIGZpbGUgaGF2ZSBkZXNjcmlwdG9yIGFuZCByZWZsZWN0aW9uIG1ldGhvZHM/CitpbmxpbmUgYm9vbCBIYXNEZXNjcmlwdG9yTWV0aG9kcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIEdldE9wdGltaXplRm9yKGZpbGUsIG9wdGlvbnMpICE9IEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7Cit9CisKKy8vIFNob3VsZCB3ZSBnZW5lcmF0ZSBnZW5lcmljIHNlcnZpY2VzIGZvciB0aGlzIGZpbGU/CitpbmxpbmUgYm9vbCBIYXNHZW5lcmljU2VydmljZXMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gZmlsZS0+c2VydmljZV9jb3VudCgpID4gMCAmJgorICAgICAgICAgR2V0T3B0aW1pemVGb3IoZmlsZSwgb3B0aW9ucykgIT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRSAmJgorICAgICAgICAgZmlsZS0+b3B0aW9ucygpLmNjX2dlbmVyaWNfc2VydmljZXMoKTsKK30KKworaW5saW5lIGJvb2wgSXNQcm90bzJNZXNzYWdlU2V0KGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gIW9wdGlvbnMub3BlbnNvdXJjZV9ydW50aW1lICYmCisgICAgICAgICBvcHRpb25zLmVuZm9yY2VfbW9kZSAhPSBFbmZvcmNlT3B0aW1pemVNb2RlOjprTGl0ZVJ1bnRpbWUgJiYKKyAgICAgICAgICFvcHRpb25zLmxpdGVfaW1wbGljaXRfd2Vha19maWVsZHMgJiYKKyAgICAgICAgIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpICYmCisgICAgICAgICBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSA9PSAiZ29vZ2xlLnByb3RvYnVmLmJyaWRnZS5NZXNzYWdlU2V0IjsKK30KKworaW5saW5lIGJvb2wgSXNNYXBFbnRyeU1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvci0+b3B0aW9ucygpLm1hcF9lbnRyeSgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkJ3MgQ1BQVFlQRSBpcyBzdHJpbmcgb3IgbWVzc2FnZS4KK2Jvb2wgSXNTdHJpbmdPck1lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKK3N0ZDo6c3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNhcF9uZXh0X2xldHRlcik7CisKK2lubGluZSBib29sIElzUHJvdG8zKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIHJldHVybiBmaWxlLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMzsKK30KKworaW5saW5lIGJvb2wgSGFzSGFzYml0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgLy8gVGhpcyBwcmVkaWNhdGUgaW5jbHVkZXMgcHJvdG8zIG1lc3NhZ2UgZmllbGRzIG9ubHkgaWYgdGhleSBoYXZlICJvcHRpb25hbCIuCisgIC8vICAgRm9vIHN1Ym1zZzEgPSAxOyAgICAgICAgICAgLy8gSGFzSGFzYml0KCkgPT0gZmFsc2UKKyAgLy8gICBvcHRpb25hbCBGb28gc3VibXNnMiA9IDI7ICAvLyBIYXNIYXNiaXQoKSA9PSB0cnVlCisgIC8vIFRoaXMgaXMgc2xpZ2h0bHkgb2RkLCBhcyBhZGRpbmcgIm9wdGlvbmFsIiB0byBhIHNpbmd1bGFyIHByb3RvMyBmaWVsZCBkb2VzCisgIC8vIG5vdCBjaGFuZ2UgdGhlIHNlbWFudGljcyBvciBBUEkuIEhvd2V2ZXIgd2hlbmV2ZXIgYW55IGZpZWxkIGluIGEgbWVzc2FnZQorICAvLyBoYXMgYSBoYXNiaXQsIGl0IGZvcmNlcyByZWZsZWN0aW9uIHRvIGluY2x1ZGUgaGFzYml0IG9mZnNldHMgZm9yICphbGwqCisgIC8vIGZpZWxkcywgZXZlbiBpZiBhbG1vc3QgYWxsIG9mIHRoZW0gYXJlIHNldCB0byAtMSAobm8gaGFzYml0KS4gU28gdG8gYXZvaWQKKyAgLy8gY2F1c2luZyBhIHN1ZGRlbiBzaXplIHJlZ3Jlc3Npb24gZm9yIH5hbGwgcHJvdG8zIG1lc3NhZ2VzLCB3ZSBnaXZlIHByb3RvMworICAvLyBtZXNzYWdlIGZpZWxkcyBhIGhhc2JpdCBvbmx5IGlmICJvcHRpb25hbCIgaXMgcHJlc2VudC4gSWYgdGhlIHVzZXIgaXMKKyAgLy8gZXhwbGljaXRseSB3cml0aW5nICJvcHRpb25hbCIsIGl0IGlzIGxpa2VseSB0aGV5IGFyZSB3cml0aW5nIGl0IG9uCisgIC8vIHByaW1pdGl2ZSBmaWVsZHMgYWxzby4KKyAgcmV0dXJuIChmaWVsZC0+aGFzX29wdGlvbmFsX2tleXdvcmQoKSB8fCBmaWVsZC0+aXNfcmVxdWlyZWQoKSkgJiYKKyAgICAgICAgICFmaWVsZC0+b3B0aW9ucygpLndlYWsoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmICdlbnVtJyBzZW1hbnRpY3MgYXJlIHN1Y2ggdGhhdCB1bmtub3duIHZhbHVlcyBhcmUgcHJlc2VydmVkCisvLyBpbiB0aGUgZW51bSBmaWVsZCBpdHNlbGYsIHJhdGhlciB0aGFuIGdvaW5nIHRvIHRoZSBVbmtub3duRmllbGRTZXQuCitpbmxpbmUgYm9vbCBIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICByZXR1cm4gZmllbGQtPmZpbGUoKS0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzM7Cit9CisKK2lubGluZSBib29sIElzQ3Jvc3NGaWxlTWVzc2FnZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHJldHVybiBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFICYmCisgICAgICAgICBmaWVsZC0+bWVzc2FnZV90eXBlKCktPmZpbGUoKSAhPSBmaWVsZC0+ZmlsZSgpOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgTWFrZURlZmF1bHROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIFN0ckNhdCgiX2lfZ2l2ZV9wZXJtaXNzaW9uX3RvX2JyZWFrX3RoaXNfY29kZV9kZWZhdWx0XyIsCisgICAgICAgICAgICAgICAgICAgICAgRmllbGROYW1lKGZpZWxkKSwgIl8iKTsKK30KKworLy8gU2VtYW50aWNhbGx5IGRpc3RpbmN0IGZyb20gTWFrZURlZmF1bHROYW1lIGluIHRoYXQgaXQgZ2l2ZXMgdGhlIEMrKyBjb2RlCisvLyByZWZlcmVuY2luZyBhIGRlZmF1bHQgZmllbGQgZnJvbSB0aGUgbWVzc2FnZSBzY29wZSwgcmF0aGVyIHRoYW4ganVzdCB0aGUKKy8vIHZhcmlhYmxlIG5hbWUuCisvLyBGb3IgZXhhbXBsZSwgZGVjbGFyYXRpb25zIG9mIGRlZmF1bHQgdmFyaWFibGVzIHNob3VsZCBhbHdheXMgdXNlIGp1c3QKKy8vIE1ha2VEZWZhdWx0TmFtZSB0byBwcm9kdWNlIGNvZGUgbGlrZToKKy8vICAgVHlwZSBfaV9naXZlX3Blcm1pc3Npb25fdG9fYnJlYWtfdGhpc19jb2RlX2RlZmF1bHRfZmllbGRfOworLy8KKy8vIENvZGUgdGhhdCByZWZlcmVuY2VzIHRoZXNlIHNob3VsZCB1c2UgTWFrZURlZmF1bHRGaWVsZE5hbWUsIGluIGNhc2UgdGhlIGZpZWxkCisvLyBleGlzdHMgYXQgc29tZSBuZXN0ZWQgbGV2ZWwgbGlrZToKKy8vICAgaW50ZXJuYWxfY29udGFpbmVyXy5faV9naXZlX3Blcm1pc3Npb25fdG9fYnJlYWtfdGhpc19jb2RlX2RlZmF1bHRfZmllbGRfOworaW5saW5lIHN0ZDo6c3RyaW5nIE1ha2VEZWZhdWx0RmllbGROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIFN0ckNhdCgiSW1wbF86OiIsIE1ha2VEZWZhdWx0TmFtZShmaWVsZCkpOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgTWFrZVZhcmludENhY2hlZFNpemVOYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIFN0ckNhdCgiXyIsIEZpZWxkTmFtZShmaWVsZCksICJfY2FjaGVkX2J5dGVfc2l6ZV8iKTsKK30KKworLy8gU2VtYW50aWNhbGx5IGRpc3RpbmN0IGZyb20gTWFrZVZhcmludENhY2hlZFNpemVOYW1lIGluIHRoYXQgaXQgZ2l2ZXMgdGhlIEMrKworLy8gY29kZSByZWZlcmVuY2luZyB0aGUgb2JqZWN0IGZyb20gdGhlIG1lc3NhZ2Ugc2NvcGUsIHJhdGhlciB0aGFuIGp1c3QgdGhlCisvLyB2YXJpYWJsZSBuYW1lLgorLy8gRm9yIGV4YW1wbGUsIGRlY2xhcmF0aW9ucyBvZiBkZWZhdWx0IHZhcmlhYmxlcyBzaG91bGQgYWx3YXlzIHVzZSBqdXN0CisvLyBNYWtlVmFyaW50Q2FjaGVkU2l6ZU5hbWUgdG8gcHJvZHVjZSBjb2RlIGxpa2U6CisvLyAgIFR5cGUgX2ZpZWxkX2NhY2hlZF9ieXRlX3NpemVfOworLy8KKy8vIENvZGUgdGhhdCByZWZlcmVuY2VzIHRoZXNlIHZhcmlhYmxlcyBzaG91bGQgdXNlCisvLyBNYWtlVmFyaW50Q2FjaGVkU2l6ZUZpZWxkTmFtZSwgaW4gY2FzZSB0aGUgZmllbGQgZXhpc3RzIGF0IHNvbWUgbmVzdGVkIGxldmVsCisvLyBsaWtlOgorLy8gICBpbnRlcm5hbF9jb250YWluZXJfLl9maWVsZF9jYWNoZWRfYnl0ZV9zaXplXzsKK2lubGluZSBzdGQ6OnN0cmluZyBNYWtlVmFyaW50Q2FjaGVkU2l6ZUZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3BsaXQpIHsKKyAgcmV0dXJuIFN0ckNhdCgiX2ltcGxfLiIsIHNwbGl0ID8gIl9zcGxpdF8tPiIgOiAiIiwgIl8iLAorICAgICAgICAgICAgICAgICAgICAgIEZpZWxkTmFtZShmaWVsZCksICJfY2FjaGVkX2J5dGVfc2l6ZV8iKTsKK30KKworLy8gTm90ZTogQSBsb3Qgb2YgbGlicmFyaWVzIGRldGVjdCBBbnkgcHJvdG9zIGJhc2VkIG9uIERlc2NyaXB0b3I6OmZ1bGxfbmFtZSgpCisvLyB3aGlsZSB0aGUgdHdvIGZ1bmN0aW9ucyBiZWxvdyB1c2UgRmlsZURlc2NyaXB0b3I6Om5hbWUoKS4gSW4gYSBzYW5lIHdvcmxkIHRoZQorLy8gdHdvIGFwcHJvYWNoZXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQuIEJ1dCBpZiB5b3UgYXJlIGRlYWxpbmcgd2l0aCBkZXNjcmlwdG9ycworLy8gZnJvbSB1bnRydXN0ZWQgc291cmNlcywgeW91IG1pZ2h0IG5lZWQgdG8gbWF0Y2ggc2VtYW50aWNzIGFjcm9zcyBsaWJyYXJpZXMuCitib29sIElzQW55TWVzc2FnZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Citib29sIElzQW55TWVzc2FnZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworYm9vbCBJc1dlbGxLbm93bk1lc3NhZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCitpbmxpbmUgc3RkOjpzdHJpbmcgSW5jbHVkZUd1YXJkKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBib29sIHBiX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgLy8gSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSAucGIuaCBmaWxlIGFuZCB0aGUgcHJvdG9faCBvcHRpb24gaXMgZW5hYmxlZCwgdGhlbgorICAvLyB0aGUgLnBiLmggZ2V0cyBhbiBleHRyYSBzdWZmaXguCisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lX2lkZW50aWZpZXIgPSBGaWxlbmFtZUlkZW50aWZpZXIoCisgICAgICBmaWxlLT5uYW1lKCkgKyAocGJfaCAmJiBvcHRpb25zLnByb3RvX2ggPyAiLnBiLmgiIDogIiIpKTsKKworICBpZiAoSXNXZWxsS25vd25NZXNzYWdlKGZpbGUpKSB7CisgICAgLy8gRm9yIHdlbGwta25vd24gbWVzc2FnZXMgd2UgbmVlZCB0aGlyZF9wYXJ0eS9wcm90b2J1ZiBhbmQgbmV0L3Byb3RvMiB0bworICAgIC8vIGhhdmUgZGlzdGluY3QgaW5jbHVkZSBndWFyZHMsIGJlY2F1c2Ugc29tZSBzb3VyY2UgZmlsZXMgaW5jbHVkZSBib3RoIGFuZAorICAgIC8vIGJvdGggbmVlZCB0byBiZSBkZWZpbmVkICh0aGUgdGhpcmRfcGFydHkgY29waWVzIHdpbGwgYmUgaW4gdGhlCisgICAgLy8gZ29vZ2xlOjpwcm90b2J1Zl9vcGVuc291cmNlIG5hbWVzcGFjZSkuCisgICAgcmV0dXJuIE1hY3JvUHJlZml4KG9wdGlvbnMpICsgIl9JTkNMVURFRF8iICsgZmlsZW5hbWVfaWRlbnRpZmllcjsKKyAgfSBlbHNlIHsKKyAgICAvLyBJZGVhbGx5IHRoaXMgY2FzZSB3b3VsZCB1c2UgZGlzdGluY3QgaW5jbHVkZSBndWFyZHMgZm9yIG9wZW5zb3VyY2UgYW5kCisgICAgLy8gZ29vZ2xlMyBwcm90b3MgYWxzby4gIChUaGUgYmVoYXZpb3Igb2YgImZpcnN0ICNpbmNsdWRlZCB3aW5zIiBpcyBub3QKKyAgICAvLyBpZGVhbCkuICBCdXQgdW5mb3J0dW5hdGVseSBzb21lIGxlZ2FjeSBjb2RlIGluY2x1ZGVzIGJvdGggYW5kIGRlcGVuZHMgb24KKyAgICAvLyB0aGUgaWRlbnRpY2FsIGluY2x1ZGUgZ3VhcmRzIHRvIGF2b2lkIGNvbXBpbGUgZXJyb3JzLgorICAgIC8vCisgICAgLy8gV2Ugc2hvdWxkIGNsZWFuIHRoaXMgdXAgc28gdGhhdCB0aGlzIGNhc2UgY2FuIGJlIHJlbW92ZWQuCisgICAgcmV0dXJuICJHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfIiArIGZpbGVuYW1lX2lkZW50aWZpZXI7CisgIH0KK30KKworLy8gUmV0dXJucyB0aGUgT3B0aW1pemVNb2RlIGZvciB0aGlzIGZpbGUsIGZ1cnRoZXJtb3JlIGl0IHVwZGF0ZXMgYSBzdGF0dXMKKy8vIGJvb2wgaWYgaGFzX29wdF9jb2Rlc2l6ZV9leHRlbnNpb24gaXMgbm9uLW51bGwuIElmIHRoaXMgc3RhdHVzIGJvb2wgaXMgdHJ1ZQorLy8gaXQgbWVhbnMgdGhpcyBmaWxlIGNvbnRhaW5zIGFuIGV4dGVuc2lvbiB0aGF0IGl0c2VsZiBpcyBkZWZpbmVkIGFzCisvLyBvcHRpbWl6ZWRfZm9yID0gQ09ERV9TSVpFLgorRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIEdldE9wdGltaXplRm9yKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogaGFzX29wdF9jb2Rlc2l6ZV9leHRlbnNpb24pOworaW5saW5lIEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBHZXRPcHRpbWl6ZUZvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gR2V0T3B0aW1pemVGb3IoZmlsZSwgb3B0aW9ucywgbnVsbHB0cik7Cit9CitpbmxpbmUgYm9vbCBOZWVkc0VhZ2VyRGVzY3JpcHRvckFzc2lnbm1lbnQoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBib29sIGhhc19vcHRfY29kZXNpemVfZXh0ZW5zaW9uOworICBpZiAoR2V0T3B0aW1pemVGb3IoZmlsZSwgb3B0aW9ucywgJmhhc19vcHRfY29kZXNpemVfZXh0ZW5zaW9uKSA9PQorICAgICAgICAgIEZpbGVPcHRpb25zOjpDT0RFX1NJWkUgJiYKKyAgICAgIGhhc19vcHRfY29kZXNpemVfZXh0ZW5zaW9uKSB7CisgICAgLy8gSWYgdGhpcyBmaWxlZGVzY3JpcHRvciBjb250YWlucyBhbiBleHRlbnNpb24gZnJvbSBhbm90aGVyIGZpbGUgd2hpY2gKKyAgICAvLyBpcyBvcHRpbWl6ZWRfZm9yID0gQ09ERV9TSVpFLiBXZSBuZWVkIHRvIGJlIGNhcmVmdWwgaW4gdGhlIG9yZGVyaW5nIHNvCisgICAgLy8gd2UgZWFnZXJseSBidWlsZCB0aGUgZGVzY3JpcHRvcnMgaW4gdGhlIGRlcGVuZGVuY2llcyBiZWZvcmUgYnVpbGRpbmcKKyAgICAvLyB0aGUgZGVzY3JpcHRvcnMgb2YgdGhpcyBmaWxlLgorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIC8vIElmIHdlIGhhdmUgYSBnZW5lcmF0ZWQgY29kZSBiYXNlZCBwYXJzZXIgd2UgbmV2ZXIgbmVlZCBlYWdlcgorICAgIC8vIGluaXRpYWxpemF0aW9uIG9mIGRlc2NyaXB0b3JzIG9mIG91ciBkZXBzLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvLyBUaGlzIG9yZGVycyB0aGUgbWVzc2FnZXMgaW4gYSAucGIuY2MgYXMgaXQncyBvdXRwdXR0ZWQgYnkgZmlsZS5jYwordm9pZCBGbGF0dGVuTWVzc2FnZXNJbkZpbGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBEZXNjcmlwdG9yKj4qIHJlc3VsdCk7CitpbmxpbmUgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+IEZsYXR0ZW5NZXNzYWdlc0luRmlsZSgKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICBzdGQ6OnZlY3Rvcjxjb25zdCBEZXNjcmlwdG9yKj4gcmVzdWx0OworICBGbGF0dGVuTWVzc2FnZXNJbkZpbGUoZmlsZSwgJnJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGPgordm9pZCBGb3JFYWNoTWVzc2FnZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBGJiYgZnVuYykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykKKyAgICBGb3JFYWNoTWVzc2FnZShkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZShpKSwgc3RkOjpmb3J3YXJkPEYmJj4oZnVuYykpOworICBmdW5jKGRlc2NyaXB0b3IpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KK3ZvaWQgRm9yRWFjaE1lc3NhZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIEYmJiBmdW5jKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykKKyAgICBGb3JFYWNoTWVzc2FnZShkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoaSksIHN0ZDo6Zm9yd2FyZDxGJiY+KGZ1bmMpKTsKK30KKworYm9vbCBIYXNXZWFrRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2MsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworYm9vbCBIYXNXZWFrRmllbGRzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSAicmVxdWlyZWQiIHJlc3RyaWN0aW9uIGNoZWNrIHNob3VsZCBiZSBpZ25vcmVkIGZvciB0aGUKKy8vIGdpdmVuIGZpZWxkLgoraW5saW5lIHN0YXRpYyBib29sIFNob3VsZElnbm9yZVJlcXVpcmVkRmllbGRDaGVjayhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIC8vIERvIG5vdCBjaGVjayAicmVxdWlyZWQiIGZvciBsYXppbHkgdmVyaWZpZWQgbGF6eSBmaWVsZHMuCisgIHJldHVybiBJc0xhemlseVZlcmlmaWVkTGF6eShmaWVsZCwgb3B0aW9ucyk7Cit9CisKK3N0cnVjdCBNZXNzYWdlQW5hbHlzaXMgeworICBib29sIGlzX3JlY3Vyc2l2ZSA9IGZhbHNlOworICBib29sIGNvbnRhaW5zX2NvcmQgPSBmYWxzZTsKKyAgYm9vbCBjb250YWluc19leHRlbnNpb24gPSBmYWxzZTsKKyAgYm9vbCBjb250YWluc19yZXF1aXJlZCA9IGZhbHNlOworICBib29sIGNvbnRhaW5zX3dlYWsgPSBmYWxzZTsgIC8vIEltcGxpY2l0IHdlYWsgYXMgd2VsbC4KK307CisKKy8vIFRoaXMgY2xhc3MgaXMgdXNlZCBpbiBGaWxlR2VuZXJhdG9yLCB0byBlbnN1cmUgbGluZWFyIGluc3RlYWQgb2YKKy8vIHF1YWRyYXRpYyBwZXJmb3JtYW5jZSwgaWYgd2UgZG8gdGhpcyBwZXIgbWVzc2FnZSB3ZSB3b3VsZCBnZXQgTyhWKihWK0UpKS4KKy8vIExvZ2ljYWxseSB0aGlzIGlzIGp1c3Qgb25seSB1c2VkIGluIG1lc3NhZ2UuY2MsIGJ1dCBpbiB0aGUgaGVhZGVyIGZvcgorLy8gRmlsZUdlbmVyYXRvciB0byBoZWxwIHNoYXJlIGl0LgorY2xhc3MgUFJPVE9DX0VYUE9SVCBNZXNzYWdlU0NDQW5hbHl6ZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTWVzc2FnZVNDQ0FuYWx5emVyKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIDogb3B0aW9uc18ob3B0aW9ucykge30KKworICBNZXNzYWdlQW5hbHlzaXMgR2V0U0NDQW5hbHlzaXMoY29uc3QgU0NDKiBzY2MpOworCisgIGJvb2wgSGFzUmVxdWlyZWRGaWVsZHMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICAgIE1lc3NhZ2VBbmFseXNpcyByZXN1bHQgPSBHZXRTQ0NBbmFseXNpcyhHZXRTQ0MoZGVzY3JpcHRvcikpOworICAgIHJldHVybiByZXN1bHQuY29udGFpbnNfcmVxdWlyZWQgfHwgcmVzdWx0LmNvbnRhaW5zX2V4dGVuc2lvbjsKKyAgfQorICBib29sIEhhc1dlYWtGaWVsZChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgICAgTWVzc2FnZUFuYWx5c2lzIHJlc3VsdCA9IEdldFNDQ0FuYWx5c2lzKEdldFNDQyhkZXNjcmlwdG9yKSk7CisgICAgcmV0dXJuIHJlc3VsdC5jb250YWluc193ZWFrOworICB9CisgIGNvbnN0IFNDQyogR2V0U0NDKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgICByZXR1cm4gYW5hbHl6ZXJfLkdldFNDQyhkZXNjcmlwdG9yKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RydWN0IERlcHNHZW5lcmF0b3IgeworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IERlc2NyaXB0b3IqPiBvcGVyYXRvcigpKGNvbnN0IERlc2NyaXB0b3IqIGRlc2MpIGNvbnN0IHsKKyAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IERlc2NyaXB0b3IqPiBkZXBzOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgaWYgKGRlc2MtPmZpZWxkKGkpLT5tZXNzYWdlX3R5cGUoKSkgeworICAgICAgICAgIGRlcHMucHVzaF9iYWNrKGRlc2MtPmZpZWxkKGkpLT5tZXNzYWdlX3R5cGUoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBkZXBzOworICAgIH0KKyAgfTsKKyAgU0NDQW5hbHl6ZXI8RGVwc0dlbmVyYXRvcj4gYW5hbHl6ZXJfOworICBPcHRpb25zIG9wdGlvbnNfOworICBzdGQ6Om1hcDxjb25zdCBTQ0MqLCBNZXNzYWdlQW5hbHlzaXM+IGFuYWx5c2lzX2NhY2hlXzsKK307CisKK3ZvaWQgTGlzdEFsbEZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiBkLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBmaWVsZHMpOwordm9pZCBMaXN0QWxsRmllbGRzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBmaWVsZHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgRm9yRWFjaEZpZWxkKGNvbnN0IERlc2NyaXB0b3IqIGQsIFQmJiBmdW5jKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZC0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgRm9yRWFjaEZpZWxkKGQtPm5lc3RlZF90eXBlKGkpLCBzdGQ6OmZvcndhcmQ8VCYmPihmdW5jKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgZnVuYyhkLT5leHRlbnNpb24oaSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZC0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZnVuYyhkLT5maWVsZChpKSk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIEZvckVhY2hGaWVsZChjb25zdCBGaWxlRGVzY3JpcHRvciogZCwgVCYmIGZ1bmMpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgRm9yRWFjaEZpZWxkKGQtPm1lc3NhZ2VfdHlwZShpKSwgc3RkOjpmb3J3YXJkPFQmJj4oZnVuYykpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZC0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGZ1bmMoZC0+ZXh0ZW5zaW9uKGkpKTsKKyAgfQorfQorCit2b2lkIExpc3RBbGxUeXBlc0ZvclNlcnZpY2VzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+KiB0eXBlcyk7CisKKy8vIEluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZCB1c2UgaW1wbGljaXQgd2VhayBmaWVsZHMgZm9yIHRoaXMgZmlsZS4KK2Jvb2wgVXNpbmdJbXBsaWNpdFdlYWtGaWVsZHMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCisvLyBJbmRpY2F0ZXMgd2hldGhlciB0byB0cmVhdCB0aGlzIGZpZWxkIGFzIGltcGxpY2l0bHkgd2Vhay4KK2Jvb2wgSXNJbXBsaWNpdFdlYWtGaWVsZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKTsKKworaW5saW5lIGJvb2wgSGFzU2ltcGxlQmFzZUNsYXNzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2MsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgaWYgKCFIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjLT5maWxlKCksIG9wdGlvbnMpKSByZXR1cm4gZmFsc2U7CisgIGlmIChkZXNjLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSAhPSAwKSByZXR1cm4gZmFsc2U7CisgIGlmIChkZXNjLT5maWVsZF9jb3VudCgpID09IDApIHJldHVybiB0cnVlOworICAvLyBUT0RPKGpvcmcpOiBTdXBwb3J0IGFkZGl0aW9uYWwgY29tbW9uIG1lc3NhZ2UgdHlwZXMgd2l0aCBvbmx5IG9uZQorICAvLyBvciB0d28gZmllbGRzCisgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgSGFzU2ltcGxlQmFzZUNsYXNzZXMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGJvb2wgdiA9IGZhbHNlOworICBGb3JFYWNoTWVzc2FnZShmaWxlLCBbJnYsICZvcHRpb25zXShjb25zdCBEZXNjcmlwdG9yKiBkZXNjKSB7CisgICAgdiB8PSBIYXNTaW1wbGVCYXNlQ2xhc3MoZGVzYywgb3B0aW9ucyk7CisgIH0pOworICByZXR1cm4gdjsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIFNpbXBsZUJhc2VDbGFzcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGlmICghSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzYy0+ZmlsZSgpLCBvcHRpb25zKSkgcmV0dXJuICIiOworICBpZiAoZGVzYy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgIT0gMCkgcmV0dXJuICIiOworICBpZiAoZGVzYy0+ZmllbGRfY291bnQoKSA9PSAwKSB7CisgICAgcmV0dXJuICJaZXJvRmllbGRzQmFzZSI7CisgIH0KKyAgLy8gVE9ETyhqb3JnKTogU3VwcG9ydCBhZGRpdGlvbmFsIGNvbW1vbiBtZXNzYWdlIHR5cGVzIHdpdGggb25seSBvbmUKKyAgLy8gb3IgdHdvIGZpZWxkcworICByZXR1cm4gIiI7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1lc3NhZ2UgaGFzIGEgX3RyYWNrZXJfIGZpZWxkLgoraW5saW5lIGJvb2wgSGFzVHJhY2tlcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHJldHVybiBvcHRpb25zLmZpZWxkX2xpc3RlbmVyX29wdGlvbnMuaW5qZWN0X2ZpZWxkX2xpc3RlbmVyX2V2ZW50cyAmJgorICAgICAgICAgZGVzYy0+ZmlsZSgpLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0KKyAgICAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBtZXNzYWdlIG5lZWRzIGFuIEltcGxfIHN0cnVjdCBmb3IgaXQncyBkYXRhLgoraW5saW5lIGJvb2wgSGFzSW1wbERhdGEoY29uc3QgRGVzY3JpcHRvciogZGVzYywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gIUhhc1NpbXBsZUJhc2VDbGFzcyhkZXNjLCBvcHRpb25zKTsKK30KKworLy8gRm9ybWF0dGVyIGlzIGEgZnVuY3RvciBjbGFzcyB3aGljaCBhY3RzIGFzIGEgY2xvc3VyZSBhcm91bmQgcHJpbnRlciBhbmQKKy8vIHRoZSB2YXJpYWJsZSBtYXAuIEl0J3MgbXVjaCBsaWtlIHByaW50ZXItPlByaW50IGV4Y2VwdCBpdCBzdXBwb3J0cyBib3RoIG5hbWVkCisvLyB2YXJpYWJsZXMgdGhhdCBhcmUgc3Vic3RpdHV0ZWQgdXNpbmcgYSBrZXkgdmFsdWUgbWFwIGFuZCBkaXJlY3QgYXJndW1lbnRzLiBJbgorLy8gdGhlIGZvcm1hdCBzdHJpbmcgJDEkLCAkMiQsIGV0Yy4uLiBhcmUgc3Vic3RpdHV0ZWQgZm9yIHRoZSBmaXJzdCwgc2Vjb25kLCAuLi4KKy8vIGRpcmVjdCBhcmd1bWVudCByZXNwZWN0aXZlbHkgaW4gdGhlIGZvcm1hdCBjYWxsLCBpdCBhY2NlcHRzIGJvdGggc3RyaW5ncyBhbmQKKy8vIGludGVnZXJzLiBUaGUgaW1wbGVtZW50YXRpb24gdmVyaWZpZXMgYWxsIGFyZ3VtZW50cyBhcmUgdXNlZCBhbmQgYXJlICJmaXJzdCIKKy8vIHVzZWQgaW4gb3JkZXIgb2YgYXBwZWFyYW5jZSBpbiB0aGUgYXJndW1lbnQgbGlzdC4gRm9yIGV4YW1wbGUsCisvLworLy8gRm9ybWF0KCJyZXR1cm4gYXJyYXlbJDEkXTsiLCAzKSAtPiAicmV0dXJuIGFycmF5WzNdOyIKKy8vIEZvcm1hdCgiYXJyYXlbJDIkXSA9ICQxJDsiLCAiQmxhIiwgMykgLT4gRkFUQUwgZXJyb3IgKHdyb25nIG9yZGVyKQorLy8gRm9ybWF0KCJhcnJheVskMSRdID0gJDIkOyIsIDMsICJCbGEiKSAtPiAiYXJyYXlbM10gPSBCbGE7IgorLy8KKy8vIFRoZSBhcmd1bWVudHMgY2FuIGJlIHVzZWQgbW9yZSB0aGFuIG9uY2UgbGlrZQorLy8KKy8vIEZvcm1hdCgiYXJyYXlbJDEkXSA9ICQyJDsgIC8vIEluZGV4ID0gJDEkIiwgMywgIkJsYSIpIC0+CisvLyAgICAgICAgImFycmF5WzNdID0gQmxhOyAgLy8gSW5kZXggPSAzIgorLy8KKy8vIElmIHlvdSB1c2UgbW9yZSBhcmd1bWVudHMgdXNlIHRoZSBmb2xsb3dpbmcgc3R5bGUgdG8gaGVscCB0aGUgcmVhZGVyLAorLy8KKy8vIEZvcm1hdCgiaW50ICQxJCgpIHtcbiIKKy8vICAgICAgICAiICBhcnJheVskMiRdID0gJDMkO1xuIgorLy8gICAgICAgICIgIHJldHVybiAkNCQ7IgorLy8gICAgICAgICJ9XG4iLAorLy8gICAgICAgIGZ1bm5hbWUsIC8vIDEKKy8vICAgICAgICBpZHgsICAvLyAyCisvLyAgICAgICAgdmFybmFtZSwgIC8vIDMKKy8vICAgICAgICByZXR2YWwpOyAgLy8gNAorLy8KKy8vIGJ1dCBjb25zaWRlciB1c2luZyBuYW1lZCB2YXJpYWJsZXMuIE5hbWVkIHZhcmlhYmxlcyBsaWtlICRmb28kLCB3aXRoIHNvbWUKKy8vIGlkZW50aWZpZXIgZm9vLCBhcmUgbG9va2VkIHVwIGluIHRoZSBtYXAuIE9uZSBhZGRpdGlvbmFsIGZlYXR1cmUgaXMgdGhhdAorLy8gc3BhY2VzIGFyZSBhY2NlcHRlZCBiZXR3ZWVuIHRoZSAnJCcgZGVsaW1pdGVycywgJCBmb28kIHdpbGwKKy8vIHN1YnN0aXR1dGUgdG8gIiBiYXIiIGlmIGZvbyBzdGFuZHMgZm9yICJiYXIiLCBidXQgaW4gY2FzZSBpdCdzIGVtcHR5CisvLyB3aWxsIHN1YnN0aXR1dGUgdG8gIiIuIEhlbmNlLCBmb3IgZXhhbXBsZSwKKy8vCisvLyBGb3JtYXQodmFycywgIiRkbGxleHBvcnQgJHZvaWQgZnVuKCk7IikgLT4gInZvaWQgZnVuKCk7IgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2RlY2xzcGVjKGV4cG9ydCkgdm9pZCBmdW4oKTsiCisvLworLy8gd2hpY2ggaXMgY29udmVuaWVudCB0byBwcmV2ZW50IGRvdWJsZSwgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuCitjbGFzcyBQUk9UT0NfRVhQT1JUIEZvcm1hdHRlciB7CisgcHVibGljOgorICBleHBsaWNpdCBGb3JtYXR0ZXIoaW86OlByaW50ZXIqIHByaW50ZXIpIDogcHJpbnRlcl8ocHJpbnRlcikge30KKyAgRm9ybWF0dGVyKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdmFycykKKyAgICAgIDogcHJpbnRlcl8ocHJpbnRlciksIHZhcnNfKHZhcnMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgU2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IFQmIHZhbHVlKSB7CisgICAgdmFyc19ba2V5XSA9IFRvU3RyaW5nKHZhbHVlKTsKKyAgfQorCisgIHZvaWQgQWRkTWFwKGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHZhcnMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGtleXZhbCA6IHZhcnMpIHZhcnNfW2tleXZhbC5maXJzdF0gPSBrZXl2YWwuc2Vjb25kOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CisgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBmb3JtYXQsIGNvbnN0IEFyZ3MmLi4uIGFyZ3MpIGNvbnN0IHsKKyAgICBwcmludGVyXy0+Rm9ybWF0SW50ZXJuYWwoe1RvU3RyaW5nKGFyZ3MpLi4ufSwgdmFyc18sIGZvcm1hdCk7CisgIH0KKworICB2b2lkIEluZGVudCgpIGNvbnN0IHsgcHJpbnRlcl8tPkluZGVudCgpOyB9CisgIHZvaWQgT3V0ZGVudCgpIGNvbnN0IHsgcHJpbnRlcl8tPk91dGRlbnQoKTsgfQorICBpbzo6UHJpbnRlciogcHJpbnRlcigpIGNvbnN0IHsgcmV0dXJuIHByaW50ZXJfOyB9CisKKyAgY2xhc3MgUFJPVE9DX0VYUE9SVCBTY29wZWRJbmRlbnRlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgU2NvcGVkSW5kZW50ZXIoRm9ybWF0dGVyKiBmb3JtYXQpIDogZm9ybWF0Xyhmb3JtYXQpIHsKKyAgICAgIGZvcm1hdF8tPkluZGVudCgpOworICAgIH0KKyAgICB+U2NvcGVkSW5kZW50ZXIoKSB7IGZvcm1hdF8tPk91dGRlbnQoKTsgfQorCisgICBwcml2YXRlOgorICAgIEZvcm1hdHRlciogZm9ybWF0XzsKKyAgfTsKKworICBQUk9UT0JVRl9OT0RJU0NBUkQgU2NvcGVkSW5kZW50ZXIgU2NvcGVkSW5kZW50KCkgeworICAgIHJldHVybiBTY29wZWRJbmRlbnRlcih0aGlzKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KKyAgUFJPVE9CVUZfTk9ESVNDQVJEIFNjb3BlZEluZGVudGVyIFNjb3BlZEluZGVudChjb25zdCBjaGFyKiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJncyYmLi4uIGFyZ3MpIHsKKyAgICAoKnRoaXMpKGZvcm1hdCwgc3RhdGljX2Nhc3Q8QXJncyYmPihhcmdzKS4uLik7CisgICAgcmV0dXJuIFNjb3BlZEluZGVudGVyKHRoaXMpOworICB9CisKKyAgY2xhc3MgUFJPVE9DX0VYUE9SVCBTYXZlU3RhdGUgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IFNhdmVTdGF0ZShGb3JtYXR0ZXIqIGZvcm1hdCkKKyAgICAgICAgOiBmb3JtYXRfKGZvcm1hdCksIHZhcnNfKGZvcm1hdC0+dmFyc18pIHt9CisgICAgflNhdmVTdGF0ZSgpIHsgZm9ybWF0Xy0+dmFyc18uc3dhcCh2YXJzXyk7IH0KKworICAgcHJpdmF0ZToKKyAgICBGb3JtYXR0ZXIqIGZvcm1hdF87CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzXzsKKyAgfTsKKworIHByaXZhdGU6CisgIGlvOjpQcmludGVyKiBwcmludGVyXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzXzsKKworICAvLyBDb252ZW5pZW5jZSBvdmVybG9hZHMgdG8gYWNjZXB0IGRpZmZlcmVudCB0eXBlcyBhcyBhcmd1bWVudHMuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBUb1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcykgeyByZXR1cm4gczsgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSSwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2ludGVncmFsPEk+Ojp2YWx1ZT46OnR5cGU+CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBUb1N0cmluZyhJIHgpIHsKKyAgICByZXR1cm4gU3RyQ2F0KHgpOworICB9CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBUb1N0cmluZyhzdHJpbmdzOjpIZXggeCkgeyByZXR1cm4gU3RyQ2F0KHgpOyB9CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBUb1N0cmluZyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGQpIHsgcmV0dXJuIFBheWxvYWQoZCk7IH0KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKGNvbnN0IERlc2NyaXB0b3IqIGQpIHsgcmV0dXJuIFBheWxvYWQoZCk7IH0KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkKSB7IHJldHVybiBQYXlsb2FkKGQpOyB9CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBUb1N0cmluZyhjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBkKSB7CisgICAgcmV0dXJuIFBheWxvYWQoZCk7CisgIH0KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKGNvbnN0IE9uZW9mRGVzY3JpcHRvciogZCkgeyByZXR1cm4gUGF5bG9hZChkKTsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXNjcmlwdG9yPgorICBzdGF0aWMgc3RkOjpzdHJpbmcgUGF5bG9hZChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBwYXRoOworICAgIGRlc2NyaXB0b3ItPkdldExvY2F0aW9uUGF0aCgmcGF0aCk7CisgICAgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24gYW5ub3RhdGlvbjsKKyAgICBmb3IgKGludCBpbmRleCA6IHBhdGgpIHsKKyAgICAgIGFubm90YXRpb24uYWRkX3BhdGgoaW5kZXgpOworICAgIH0KKyAgICBhbm5vdGF0aW9uLnNldF9zb3VyY2VfZmlsZShkZXNjcmlwdG9yLT5maWxlKCktPm5hbWUoKSk7CisgICAgcmV0dXJuIGFubm90YXRpb24uU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIFByaW50RmllbGRDb21tZW50KGNvbnN0IEZvcm1hdHRlciYgZm9ybWF0LCBjb25zdCBUKiBmaWVsZCkgeworICAvLyBQcmludCB0aGUgZmllbGQncyAob3Igb25lb2YncykgcHJvdG8tc3ludGF4IGRlZmluaXRpb24gYXMgYSBjb21tZW50LgorICAvLyBXZSBkb24ndCB3YW50IHRvIHByaW50IGdyb3VwIGJvZGllcyBzbyB3ZSBjdXQgb2ZmIGFmdGVyIHRoZSBmaXJzdAorICAvLyBsaW5lLgorICBEZWJ1Z1N0cmluZ09wdGlvbnMgb3B0aW9uczsKKyAgb3B0aW9ucy5lbGlkZV9ncm91cF9ib2R5ID0gdHJ1ZTsKKyAgb3B0aW9ucy5lbGlkZV9vbmVvZl9ib2R5ID0gdHJ1ZTsKKyAgc3RkOjpzdHJpbmcgZGVmID0gZmllbGQtPkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMob3B0aW9ucyk7CisgIGZvcm1hdCgiLy8gJDEkXG4iLCBkZWYuc3Vic3RyKDAsIGRlZi5maW5kX2ZpcnN0X29mKCdcbicpKSk7Cit9CisKK2NsYXNzIFBST1RPQ19FWFBPUlQgTmFtZXNwYWNlT3BlbmVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE5hbWVzcGFjZU9wZW5lcihjb25zdCBGb3JtYXR0ZXImIGZvcm1hdCkKKyAgICAgIDogcHJpbnRlcl8oZm9ybWF0LnByaW50ZXIoKSkge30KKyAgTmFtZXNwYWNlT3BlbmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBGb3JtYXR0ZXImIGZvcm1hdCkKKyAgICAgIDogTmFtZXNwYWNlT3BlbmVyKGZvcm1hdCkgeworICAgIENoYW5nZVRvKG5hbWUpOworICB9CisgIH5OYW1lc3BhY2VPcGVuZXIoKSB7IENoYW5nZVRvKCIiKTsgfQorCisgIHZvaWQgQ2hhbmdlVG8oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmV3X3N0YWNrXyA9CisgICAgICAgIFNwbGl0KG5hbWUsICI6OiIsIHRydWUpOworICAgIHNpemVfdCBsZW4gPSBzdGQ6Om1pbihuYW1lX3N0YWNrXy5zaXplKCksIG5ld19zdGFja18uc2l6ZSgpKTsKKyAgICBzaXplX3QgY29tbW9uX2lkeCA9IDA7CisgICAgd2hpbGUgKGNvbW1vbl9pZHggPCBsZW4pIHsKKyAgICAgIGlmIChuYW1lX3N0YWNrX1tjb21tb25faWR4XSAhPSBuZXdfc3RhY2tfW2NvbW1vbl9pZHhdKSBicmVhazsKKyAgICAgIGNvbW1vbl9pZHgrKzsKKyAgICB9CisgICAgZm9yIChhdXRvIGl0ID0gbmFtZV9zdGFja18uY3JiZWdpbigpOworICAgICAgICAgaXQgIT0gbmFtZV9zdGFja18uY3JlbmQoKSAtIGNvbW1vbl9pZHg7ICsraXQpIHsKKyAgICAgIGlmICgqaXQgPT0gIlBST1RPQlVGX05BTUVTUEFDRV9JRCIpIHsKKyAgICAgICAgcHJpbnRlcl8tPlByaW50KCJQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0VcbiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRlcl8tPlByaW50KCJ9ICAvLyBuYW1lc3BhY2UgJG5zJFxuIiwgIm5zIiwgKml0KTsKKyAgICAgIH0KKyAgICB9CisgICAgbmFtZV9zdGFja18uc3dhcChuZXdfc3RhY2tfKTsKKyAgICBmb3IgKHNpemVfdCBpID0gY29tbW9uX2lkeDsgaSA8IG5hbWVfc3RhY2tfLnNpemUoKTsgKytpKSB7CisgICAgICBpZiAobmFtZV9zdGFja19baV0gPT0gIlBST1RPQlVGX05BTUVTUEFDRV9JRCIpIHsKKyAgICAgICAgcHJpbnRlcl8tPlByaW50KCJQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTlxuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGVyXy0+UHJpbnQoIm5hbWVzcGFjZSAkbnMkIHtcbiIsICJucyIsIG5hbWVfc3RhY2tfW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIGlvOjpQcmludGVyKiBwcmludGVyXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5hbWVfc3RhY2tfOworfTsKKworZW51bSBjbGFzcyBVdGY4Q2hlY2tNb2RlIHsKKyAga1N0cmljdCA9IDAsICAvLyBQYXJzaW5nIHdpbGwgZmFpbCBpZiBub24gVVRGLTggZGF0YSBpcyBpbiBzdHJpbmcgZmllbGRzLgorICBrVmVyaWZ5ID0gMSwgIC8vIE9ubHkgbG9nIGFuIGVycm9yIGJ1dCBwYXJzaW5nIHdpbGwgc3VjY2VlZC4KKyAga05vbmUgPSAyLCAgICAvLyBObyBVVEYtOCBjaGVjay4KK307CisKK1V0ZjhDaGVja01vZGUgR2V0VXRmOENoZWNrTW9kZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCit2b2lkIEdlbmVyYXRlVXRmOENoZWNrQ29kZUZvclN0cmluZyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgYm9vbCBmb3JfcGFyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybWF0dGVyJiBmb3JtYXQpOworCit2b2lkIEdlbmVyYXRlVXRmOENoZWNrQ29kZUZvckNvcmQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBib29sIGZvcl9wYXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlciYgZm9ybWF0KTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgRmllbGRSYW5nZUltcGwgeworICBzdHJ1Y3QgSXRlcmF0b3IgeworICAgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZzsKKyAgICB1c2luZyB2YWx1ZV90eXBlID0gY29uc3QgRmllbGREZXNjcmlwdG9yKjsKKyAgICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBpbnQ7CisKKyAgICB2YWx1ZV90eXBlIG9wZXJhdG9yKigpIHsgcmV0dXJuIGRlc2NyaXB0b3ItPmZpZWxkKGlkeCk7IH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgSXRlcmF0b3ImIGEsIGNvbnN0IEl0ZXJhdG9yJiBiKSB7CisgICAgICBHT09HTEVfRENIRUNLKGEuZGVzY3JpcHRvciA9PSBiLmRlc2NyaXB0b3IpOworICAgICAgcmV0dXJuIGEuaWR4ID09IGIuaWR4OworICAgIH0KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9yJiBhLCBjb25zdCBJdGVyYXRvciYgYikgeworICAgICAgcmV0dXJuICEoYSA9PSBiKTsKKyAgICB9CisKKyAgICBJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICAgIGlkeCsrOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGludCBpZHg7CisgICAgY29uc3QgVCogZGVzY3JpcHRvcjsKKyAgfTsKKworICBJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHswLCBkZXNjcmlwdG9yfTsgfQorICBJdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiB7ZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKSwgZGVzY3JpcHRvcn07IH0KKworICBjb25zdCBUKiBkZXNjcmlwdG9yOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitGaWVsZFJhbmdlSW1wbDxUPiBGaWVsZFJhbmdlKGNvbnN0IFQqIGRlc2MpIHsKKyAgcmV0dXJuIHtkZXNjfTsKK30KKworc3RydWN0IE9uZU9mUmFuZ2VJbXBsIHsKKyAgc3RydWN0IEl0ZXJhdG9yIHsKKyAgICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc7CisgICAgdXNpbmcgdmFsdWVfdHlwZSA9IGNvbnN0IE9uZW9mRGVzY3JpcHRvcio7CisgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gaW50OworCisgICAgdmFsdWVfdHlwZSBvcGVyYXRvciooKSB7IHJldHVybiBkZXNjcmlwdG9yLT5vbmVvZl9kZWNsKGlkeCk7IH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgSXRlcmF0b3ImIGEsIGNvbnN0IEl0ZXJhdG9yJiBiKSB7CisgICAgICBHT09HTEVfRENIRUNLKGEuZGVzY3JpcHRvciA9PSBiLmRlc2NyaXB0b3IpOworICAgICAgcmV0dXJuIGEuaWR4ID09IGIuaWR4OworICAgIH0KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9yJiBhLCBjb25zdCBJdGVyYXRvciYgYikgeworICAgICAgcmV0dXJuICEoYSA9PSBiKTsKKyAgICB9CisKKyAgICBJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICAgIGlkeCsrOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGludCBpZHg7CisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcjsKKyAgfTsKKworICBJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHswLCBkZXNjcmlwdG9yfTsgfQorICBJdGVyYXRvciBlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHtkZXNjcmlwdG9yLT5yZWFsX29uZW9mX2RlY2xfY291bnQoKSwgZGVzY3JpcHRvcn07CisgIH0KKworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yOworfTsKKworaW5saW5lIE9uZU9mUmFuZ2VJbXBsIE9uZU9mUmFuZ2UoY29uc3QgRGVzY3JpcHRvciogZGVzYykgeyByZXR1cm4ge2Rlc2N9OyB9CisKK1BST1RPQ19FWFBPUlQgc3RkOjpzdHJpbmcgU3RyaXBQcm90byhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOworCitib29sIEVuYWJsZU1lc3NhZ2VPd25lZEFyZW5hKGNvbnN0IERlc2NyaXB0b3IqIGRlc2MsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCitib29sIEVuYWJsZU1lc3NhZ2VPd25lZEFyZW5hVHJpYWwoY29uc3QgRGVzY3JpcHRvciogZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworYm9vbCBTaG91bGRWZXJpZnkoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKTsKK2Jvb2wgU2hvdWxkVmVyaWZ5KGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgTWVzc2FnZVNDQ0FuYWx5emVyKiBzY2NfYW5hbHl6ZXIpOworCisvLyBJbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgcHJlZGVmaW5lZCB2ZXJpZnkgbWV0aG9kcyBmb3IgYSBnaXZlbiBtZXNzYWdlLiBJZiBhCisvLyBtZXNzYWdlIGlzICJzaW1wbGUiIGFuZCBuZWVkcyBubyBzcGVjaWFsIHZlcmlmaWNhdGlvbiBwZXIgZmllbGQgKGUuZy4gbWVzc2FnZQorLy8gZmllbGQsIHJlcGVhdGVkIHBhY2tlZCwgVVRGOCBzdHJpbmcsIGV0Yy4pLCB3ZSBjYW4gdXNlIGVpdGhlciBWZXJpZnlTaW1wbGUgb3IKKy8vIFZlcmlmeVNpbXBsZUFsd2F5c0NoZWNrSW50MzIgbWV0aG9kcyBhcyBhbGwgdmVyaWZpY2F0aW9uIGNhbiBiZSBkb25lIGJhc2VkIG9uCisvLyB0aGUgd2lyZSB0eXBlLgorLy8KKy8vIE90aGVyd2lzZSwgd2UgbmVlZCAiY3VzdG9tIiB2ZXJpZnkgbWV0aG9kcyB0YWlsb3JlZCB0byBhIG1lc3NhZ2UgdG8gcGFzcworLy8gd2hpY2ggZmllbGQgbmVlZHMgYSBzcGVjaWFsIHZlcmlmaWNhdGlvbjsgaS5lLiBJbnRlcm5hbFZlcmlmeS4KK2VudW0gY2xhc3MgVmVyaWZ5U2ltcGxlVHlwZSB7CisgIGtTaW1wbGVJbnQzMk5ldmVyLCAgIC8vIFVzZSBWZXJpZnlTaW1wbGUKKyAga1NpbXBsZUludDMyQWx3YXlzLCAgLy8gVXNlIFZlcmlmeVNpbXBsZUFsd2F5c0NoZWNrSW50MzIKKyAga0N1c3RvbSwgICAgICAgICAgICAgLy8gVXNlIEludGVybmFsVmVyaWZ5IGFuZCBjaGVjayBvbmx5IGZvciBpbnQzMgorICBrQ3VzdG9tSW50MzJOZXZlciwgICAvLyBVc2UgSW50ZXJuYWxWZXJpZnkgYnV0IG5ldmVyIGNoZWNrIGZvciBpbnQzMgorICBrQ3VzdG9tSW50MzJBbHdheXMsICAvLyBVc2UgSW50ZXJuYWxWZXJpZnkgYW5kIGFsd2F5cyBjaGVjayBmb3IgaW50MzIKK307CisKKy8vIFJldHVybnMgVmVyaWZ5U2ltcGxlVHlwZSBpZiBtZXNzYWdlcyBjYW4gYmUgdmVyaWZpZWQgYnkgcHJlZGVmaW5lZCBtZXRob2RzLgorVmVyaWZ5U2ltcGxlVHlwZSBTaG91bGRWZXJpZnlTaW1wbGUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKK2Jvb2wgSXNVdGY4U3RyaW5nKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCitib29sIEhhc01lc3NhZ2VGaWVsZE9yRXh0ZW5zaW9uKGNvbnN0IERlc2NyaXB0b3IqIGRlc2MpOworCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfSEVMUEVSU19IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21hcF9maWVsZC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21hcF9maWVsZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTU1ZWY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWFwX2ZpZWxkLmNjCkBAIC0wLDAgKzEsMzM4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWFwX2ZpZWxkLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmg+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitib29sIElzUHJvdG8zRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yKSB7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlX2Rlc2NyaXB0b3IgPSBmaWVsZF9kZXNjcmlwdG9yLT5maWxlKCk7CisgIHJldHVybiBmaWxlX2Rlc2NyaXB0b3ItPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zOworfQorCit2b2lkIFNldE1lc3NhZ2VWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIHZhcmlhYmxlcywgb3B0aW9ucyk7CisgICgqdmFyaWFibGVzKVsidHlwZSJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLCBmYWxzZSk7CisgICgqdmFyaWFibGVzKVsiZnVsbF9uYW1lIl0gPSBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGtleSA9IGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLT5tYXBfa2V5KCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsID0gZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCktPm1hcF92YWx1ZSgpOworICAoKnZhcmlhYmxlcylbImtleV9jcHAiXSA9IFByaW1pdGl2ZVR5cGVOYW1lKG9wdGlvbnMsIGtleS0+Y3BwX3R5cGUoKSk7CisgIHN3aXRjaCAodmFsLT5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICgqdmFyaWFibGVzKVsidmFsX2NwcCJdID0gRmllbGRNZXNzYWdlVHlwZU5hbWUodmFsLCBvcHRpb25zKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICAoKnZhcmlhYmxlcylbInZhbF9jcHAiXSA9IENsYXNzTmFtZSh2YWwtPmVudW1fdHlwZSgpLCB0cnVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAoKnZhcmlhYmxlcylbInZhbF9jcHAiXSA9IFByaW1pdGl2ZVR5cGVOYW1lKG9wdGlvbnMsIHZhbC0+Y3BwX3R5cGUoKSk7CisgIH0KKyAgKCp2YXJpYWJsZXMpWyJrZXlfd2lyZV90eXBlIl0gPQorICAgICAgIlRZUEVfIiArIFRvVXBwZXIoRGVjbGFyZWRUeXBlTWV0aG9kTmFtZShrZXktPnR5cGUoKSkpOworICAoKnZhcmlhYmxlcylbInZhbF93aXJlX3R5cGUiXSA9CisgICAgICAiVFlQRV8iICsgVG9VcHBlcihEZWNsYXJlZFR5cGVNZXRob2ROYW1lKHZhbC0+dHlwZSgpKSk7CisgICgqdmFyaWFibGVzKVsibWFwX2NsYXNzbmFtZSJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLCBmYWxzZSk7CisgICgqdmFyaWFibGVzKVsibnVtYmVyIl0gPSBTdHJDYXQoZGVzY3JpcHRvci0+bnVtYmVyKCkpOworICAoKnZhcmlhYmxlcylbInRhZyJdID0gU3RyQ2F0KGludGVybmFsOjpXaXJlRm9ybWF0OjpNYWtlVGFnKGRlc2NyaXB0b3IpKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvci0+ZmlsZSgpLCBvcHRpb25zKSkgeworICAgICgqdmFyaWFibGVzKVsibGl0ZSJdID0gIiI7CisgIH0gZWxzZSB7CisgICAgKCp2YXJpYWJsZXMpWyJsaXRlIl0gPSAiTGl0ZSI7CisgIH0KK30KKworTWFwRmllbGRHZW5lcmF0b3I6Ok1hcEZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKQorICAgIDogRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgb3B0aW9ucyksCisgICAgICBoYXNfcmVxdWlyZWRfZmllbGRzXygKKyAgICAgICAgICBzY2NfYW5hbHl6ZXItPkhhc1JlcXVpcmVkRmllbGRzKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpKSkgeworICBTZXRNZXNzYWdlVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfLCBvcHRpb25zKTsKK30KKworTWFwRmllbGRHZW5lcmF0b3I6On5NYXBGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgIjo6JHByb3RvX25zJDo6aW50ZXJuYWw6Ok1hcEZpZWxkJGxpdGUkPFxuIgorICAgICAgIiAgICAkbWFwX2NsYXNzbmFtZSQsXG4iCisgICAgICAiICAgICRrZXlfY3BwJCwgJHZhbF9jcHAkLFxuIgorICAgICAgIiAgICA6OiRwcm90b19ucyQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6JGtleV93aXJlX3R5cGUkLFxuIgorICAgICAgIiAgICA6OiRwcm90b19ucyQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6JHZhbF93aXJlX3R5cGUkPiAiCisgICAgICAiJG5hbWUkXztcbiIpOworfQorCit2b2lkIE1hcEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgKKyAgICAgICJwcml2YXRlOlxuIgorICAgICAgImNvbnN0IDo6JHByb3RvX25zJDo6TWFwPCAka2V5X2NwcCQsICR2YWxfY3BwJCA+JlxuIgorICAgICAgIiAgICAkezEkX2ludGVybmFsXyRuYW1lJCR9JCgpIGNvbnN0O1xuIgorICAgICAgIjo6JHByb3RvX25zJDo6TWFwPCAka2V5X2NwcCQsICR2YWxfY3BwJCA+KlxuIgorICAgICAgIiAgICAkezEkX2ludGVybmFsX211dGFibGVfJG5hbWUkJH0kKCk7XG4iCisgICAgICAicHVibGljOlxuIgorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkY29uc3QgOjokcHJvdG9fbnMkOjpNYXA8ICRrZXlfY3BwJCwgJHZhbF9jcHAkID4mXG4iCisgICAgICAiICAgICR7MSQkbmFtZSQkfSQoKSBjb25zdDtcbiIKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJDo6JHByb3RvX25zJDo6TWFwPCAka2V5X2NwcCQsICR2YWxfY3BwJCA+KlxuIgorICAgICAgIiAgICAkezEkbXV0YWJsZV8kbmFtZSQkfSQoKTtcbiIsCisgICAgICBkZXNjcmlwdG9yXyk7Cit9CisKK3ZvaWQgTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoCisgICAgICAiaW5saW5lIGNvbnN0IDo6JHByb3RvX25zJDo6TWFwPCAka2V5X2NwcCQsICR2YWxfY3BwJCA+JlxuIgorICAgICAgIiRjbGFzc25hbWUkOjpfaW50ZXJuYWxfJG5hbWUkKCkgY29uc3Qge1xuIgorICAgICAgIiAgcmV0dXJuICRmaWVsZCQuR2V0TWFwKCk7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSBjb25zdCA6OiRwcm90b19ucyQ6Ok1hcDwgJGtleV9jcHAkLCAkdmFsX2NwcCQgPiZcbiIKKyAgICAgICIkY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgorICAgICAgIiRhbm5vdGF0ZV9nZXQkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX21hcDokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiBfaW50ZXJuYWxfJG5hbWUkKCk7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSA6OiRwcm90b19ucyQ6Ok1hcDwgJGtleV9jcHAkLCAkdmFsX2NwcCQgPipcbiIKKyAgICAgICIkY2xhc3NuYW1lJDo6X2ludGVybmFsX211dGFibGVfJG5hbWUkKCkge1xuIgorICAgICAgIiRtYXliZV9wcmVwYXJlX3NwbGl0X21lc3NhZ2UkIgorICAgICAgIiAgcmV0dXJuICRmaWVsZCQuTXV0YWJsZU1hcCgpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgOjokcHJvdG9fbnMkOjpNYXA8ICRrZXlfY3BwJCwgJHZhbF9jcHAkID4qXG4iCisgICAgICAiJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgorICAgICAgIiRhbm5vdGF0ZV9tdXRhYmxlJCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX21hcDokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiBfaW50ZXJuYWxfbXV0YWJsZV8kbmFtZSQoKTtcbiIKKyAgICAgICJ9XG4iKTsKK30KKwordm9pZCBNYXBGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCIkZmllbGQkLkNsZWFyKCk7XG4iKTsKK30KKwordm9pZCBNYXBGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIl90aGlzLT4kZmllbGQkLk1lcmdlRnJvbShmcm9tLiRmaWVsZCQpO1xuIik7Cit9CisKK3ZvaWQgTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgiJGZpZWxkJC5JbnRlcm5hbFN3YXAoJm90aGVyLT4kZmllbGQkKTtcbiIpOworfQorCit2b2lkIE1hcEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUocHJpbnRlcik7CisgIEdlbmVyYXRlTWVyZ2luZ0NvZGUocHJpbnRlcik7Cit9CisKK3N0YXRpYyB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkxvb3AoRm9ybWF0dGVyJiBmb3JtYXQsIGJvb2wgc3RyaW5nX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpbmdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGV0ZXJtaW5pc3RpYykgeworICBpZiAoaXNfZGV0ZXJtaW5pc3RpYykgeworICAgIGZvcm1hdCgKKyAgICAgICAgImZvciAoY29uc3QgYXV0byYgZW50cnkgOiAiCisgICAgICAgICI6Ol9wYmk6Ok1hcFNvcnRlciQxJDxNYXBUeXBlPihtYXBfZmllbGQpKSB7XG4iLAorICAgICAgICAoc3RyaW5nX2tleSA/ICJQdHIiIDogIkZsYXQiKSk7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KCJmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogbWFwX2ZpZWxkKSB7XG4iKTsKKyAgfQorICB7CisgICAgYXV0byBsb29wX3Njb3BlID0gZm9ybWF0LlNjb3BlZEluZGVudCgpOworICAgIGZvcm1hdCgKKyAgICAgICAgInRhcmdldCA9IFdpcmVIZWxwZXI6OkludGVybmFsU2VyaWFsaXplKCRudW1iZXIkLCAiCisgICAgICAgICJlbnRyeS5maXJzdCwgZW50cnkuc2Vjb25kLCB0YXJnZXQsIHN0cmVhbSk7XG4iKTsKKworICAgIGlmIChzdHJpbmdfa2V5IHx8IHN0cmluZ192YWx1ZSkgeworICAgICAgZm9ybWF0KCJjaGVja191dGY4KGVudHJ5KTtcbiIpOworICAgIH0KKyAgfQorICBmb3JtYXQoIn1cbiIpOworfQorCit2b2lkIE1hcEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCJpZiAoIXRoaXMtPl9pbnRlcm5hbF8kbmFtZSQoKS5lbXB0eSgpKSB7XG4iKTsKKyAgZm9ybWF0LkluZGVudCgpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGtleV9maWVsZCA9IGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKS0+bWFwX2tleSgpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHZhbHVlX2ZpZWxkID0gZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpLT5tYXBfdmFsdWUoKTsKKyAgY29uc3QgYm9vbCBzdHJpbmdfa2V5ID0ga2V5X2ZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzsKKyAgY29uc3QgYm9vbCBzdHJpbmdfdmFsdWUgPSB2YWx1ZV9maWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc7CisKKyAgZm9ybWF0KAorICAgICAgInVzaW5nIE1hcFR5cGUgPSA6Ol9wYjo6TWFwPCRrZXlfY3BwJCwgJHZhbF9jcHAkPjtcbiIKKyAgICAgICJ1c2luZyBXaXJlSGVscGVyID0gJG1hcF9jbGFzc25hbWUkOjpGdW5jcztcbiIKKyAgICAgICJjb25zdCBhdXRvJiBtYXBfZmllbGQgPSB0aGlzLT5faW50ZXJuYWxfJG5hbWUkKCk7XG4iKTsKKyAgYm9vbCB1dGY4X2NoZWNrID0gc3RyaW5nX2tleSB8fCBzdHJpbmdfdmFsdWU7CisgIGlmICh1dGY4X2NoZWNrKSB7CisgICAgZm9ybWF0KCJhdXRvIGNoZWNrX3V0ZjggPSBbXShjb25zdCBNYXBUeXBlOjp2YWx1ZV90eXBlJiBlbnRyeSkge1xuIik7CisgICAgeworICAgICAgYXV0byBjaGVja19zY29wZSA9IGZvcm1hdC5TY29wZWRJbmRlbnQoKTsKKyAgICAgIC8vIHAgbWF5IGJlIHVudXNlZCB3aGVuIEdldFV0ZjhDaGVja01vZGUgZXZhbHVhdGVzIHRvIGtOb25lLAorICAgICAgLy8gdGh1cyBkaXNhYmxpbmcgdGhlIHZhbGlkYXRpb24uCisgICAgICBmb3JtYXQoIih2b2lkKWVudHJ5O1xuIik7CisgICAgICBpZiAoc3RyaW5nX2tleSkgeworICAgICAgICBHZW5lcmF0ZVV0ZjhDaGVja0NvZGVGb3JTdHJpbmcoCisgICAgICAgICAgICBrZXlfZmllbGQsIG9wdGlvbnNfLCBmYWxzZSwKKyAgICAgICAgICAgICJlbnRyeS5maXJzdC5kYXRhKCksIHN0YXRpY19jYXN0PGludD4oZW50cnkuZmlyc3QubGVuZ3RoKCkpLFxuIiwKKyAgICAgICAgICAgIGZvcm1hdCk7CisgICAgICB9CisgICAgICBpZiAoc3RyaW5nX3ZhbHVlKSB7CisgICAgICAgIEdlbmVyYXRlVXRmOENoZWNrQ29kZUZvclN0cmluZygKKyAgICAgICAgICAgIHZhbHVlX2ZpZWxkLCBvcHRpb25zXywgZmFsc2UsCisgICAgICAgICAgICAiZW50cnkuc2Vjb25kLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihlbnRyeS5zZWNvbmQubGVuZ3RoKCkpLFxuIiwKKyAgICAgICAgICAgIGZvcm1hdCk7CisgICAgICB9CisgICAgfQorICAgIGZvcm1hdCgifTtcbiIpOworICB9CisKKyAgZm9ybWF0KAorICAgICAgIlxuIgorICAgICAgImlmIChzdHJlYW0tPklzU2VyaWFsaXphdGlvbkRldGVybWluaXN0aWMoKSAmJiAiCisgICAgICAibWFwX2ZpZWxkLnNpemUoKSA+IDEpIHtcbiIpOworICB7CisgICAgYXV0byBkZXRlcm1pbmlzdGljX3Njb3BlID0gZm9ybWF0LlNjb3BlZEluZGVudCgpOworICAgIEdlbmVyYXRlU2VyaWFsaXphdGlvbkxvb3AoZm9ybWF0LCBzdHJpbmdfa2V5LCBzdHJpbmdfdmFsdWUsIHRydWUpOworICB9CisgIGZvcm1hdCgifSBlbHNlIHtcbiIpOworICB7CisgICAgYXV0byBtYXBfb3JkZXJfc2NvcGUgPSBmb3JtYXQuU2NvcGVkSW5kZW50KCk7CisgICAgR2VuZXJhdGVTZXJpYWxpemF0aW9uTG9vcChmb3JtYXQsIHN0cmluZ19rZXksIHN0cmluZ192YWx1ZSwgZmFsc2UpOworICB9CisgIGZvcm1hdCgifVxuIik7CisgIGZvcm1hdC5PdXRkZW50KCk7CisgIGZvcm1hdCgifVxuIik7Cit9CisKK3ZvaWQgTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgInRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCAqXG4iCisgICAgICAiICAgICIKKyAgICAgICI6OiRwcm90b19ucyQ6OmludGVybmFsOjpGcm9tSW50U2l6ZSh0aGlzLT5faW50ZXJuYWxfJG5hbWUkX3NpemUoKSk7XG4iCisgICAgICAiZm9yICg6OiRwcm90b19ucyQ6Ok1hcDwgJGtleV9jcHAkLCAkdmFsX2NwcCQgPjo6Y29uc3RfaXRlcmF0b3JcbiIKKyAgICAgICIgICAgaXQgPSB0aGlzLT5faW50ZXJuYWxfJG5hbWUkKCkuYmVnaW4oKTtcbiIKKyAgICAgICIgICAgaXQgIT0gdGhpcy0+X2ludGVybmFsXyRuYW1lJCgpLmVuZCgpOyArK2l0KSB7XG4iCisgICAgICAiICB0b3RhbF9zaXplICs9ICRtYXBfY2xhc3NuYW1lJDo6RnVuY3M6OkJ5dGVTaXplTG9uZyhpdC0+Zmlyc3QsICIKKyAgICAgICJpdC0+c2Vjb25kKTtcbiIKKyAgICAgICJ9XG4iKTsKK30KKwordm9pZCBNYXBGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJc0luaXRpYWxpemVkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmICghaGFzX3JlcXVpcmVkX2ZpZWxkc18pIHJldHVybjsKKworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoCisgICAgICAiaWYgKCE6OiRwcm90b19ucyQ6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCgkZmllbGQkKSkgcmV0dXJuICIKKyAgICAgICJmYWxzZTtcbiIpOworfQorCit2b2lkIE1hcEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNvbnN0ZXhwckFnZ3JlZ2F0ZUluaXRpYWxpemVyKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoIi8qZGVjbHR5cGUoJGZpZWxkJCkqL3s6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQoKX0iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoIi8qZGVjbHR5cGUoJGZpZWxkJCkqL3t9Iik7CisgIH0KK30KKwordm9pZCBNYXBGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDb3B5QWdncmVnYXRlSW5pdGlhbGl6ZXIoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgLy8gTWFwRmllbGQgaGFzIG5vIG1vdmUgY29uc3RydWN0b3IsIHdoaWNoIHByZXZlbnRzIGV4cGxpY2l0IGFnZ3JlZ2F0ZQorICAvLyBpbml0aWFsaXphdGlvbiBwcmUtQysrMTcuCisgIGZvcm1hdCgiLypkZWNsdHlwZSgkZmllbGQkKSove30iKTsKK30KKwordm9pZCBNYXBGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVBZ2dyZWdhdGVJbml0aWFsaXplcigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoU2hvdWxkU3BsaXQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgIi8qZGVjbHR5cGUoJGNsYXNzbmFtZSQ6OlNwbGl0OjokbmFtZSRfKSovIgorICAgICAgICAiezo6X3BiaTo6QXJlbmFJbml0aWFsaXplZCgpLCBhcmVuYX0iKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gTWFwRmllbGQgaGFzIG5vIG1vdmUgY29uc3RydWN0b3IuCisgIGZvcm1hdCgiLypkZWNsdHlwZSgkZmllbGQkKSovezo6X3BiaTo6QXJlbmFJbml0aWFsaXplZCgpLCBhcmVuYX0iKTsKK30KKwordm9pZCBNYXBGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBHT09HTEVfQ0hFQ0soIUlzRmllbGRTdHJpcHBlZChkZXNjcmlwdG9yXywgb3B0aW9uc18pKTsKKworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoU2hvdWxkU3BsaXQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgiJGNhY2hlZF9zcGxpdF9wdHIkLT4kbmFtZSRfLkRlc3RydWN0KCk7XG4iKTsKKyAgICBmb3JtYXQoIiRjYWNoZWRfc3BsaXRfcHRyJC0+JG5hbWUkXy5+TWFwRmllbGQkbGl0ZSQoKTtcbiIpOworICAgIHJldHVybjsKKyAgfQorICBmb3JtYXQoIiRmaWVsZCQuRGVzdHJ1Y3QoKTtcbiIpOworICBmb3JtYXQoIiRmaWVsZCQufk1hcEZpZWxkJGxpdGUkKCk7XG4iKTsKK30KKwordm9pZCBNYXBGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVBcmVuYURlc3RydWN0b3JDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChOZWVkc0FyZW5hRGVzdHJ1Y3RvcigpID09IEFyZW5hRHRvck5lZWRzOjprTm9uZSkgeworICAgIHJldHVybjsKKyAgfQorCisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIC8vIF90aGlzIGlzIHRoZSBvYmplY3QgYmVpbmcgZGVzdHJ1Y3RlZCAod2UgYXJlIGluc2lkZSBhIHN0YXRpYyBtZXRob2QgaGVyZSkuCisgIGZvcm1hdCgiX3RoaXMtPiRmaWVsZCQuRGVzdHJ1Y3QoKTtcbiIpOworfQorCitBcmVuYUR0b3JOZWVkcyBNYXBGaWVsZEdlbmVyYXRvcjo6TmVlZHNBcmVuYURlc3RydWN0b3IoKSBjb25zdCB7CisgIHJldHVybiBIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykKKyAgICAgICAgICAgICA/IEFyZW5hRHRvck5lZWRzOjprUmVxdWlyZWQKKyAgICAgICAgICAgICA6IEFyZW5hRHRvck5lZWRzOjprTm9uZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21hcF9maWVsZC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWFwX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc4YTEyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21hcF9maWVsZC5oCkBAIC0wLDAgKzEsODMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfTUFQX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX01BUF9GSUVMRF9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2VfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBNYXBGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBNYXBGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKTsKKyAgfk1hcEZpZWxkR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlIHt9CisgIHZvaWQgR2VuZXJhdGVDb3B5Q29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJc0luaXRpYWxpemVkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0ZXhwckFnZ3JlZ2F0ZUluaXRpYWxpemVyKAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ29weUFnZ3JlZ2F0ZUluaXRpYWxpemVyKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUFnZ3JlZ2F0ZUluaXRpYWxpemVyKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZURlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUFyZW5hRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICBBcmVuYUR0b3JOZWVkcyBOZWVkc0FyZW5hRGVzdHJ1Y3RvcigpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgY29uc3QgYm9vbCBoYXNfcmVxdWlyZWRfZmllbGRzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWFwRmllbGRHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX01BUF9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2UuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MDY5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlLmNjCkBAIC0wLDAgKzEsNDQ0NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9lbnRyeV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2VudW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3BhZGRpbmdfb3B0aW1pemVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wYXJzZV9mdW5jdGlvbl9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+CisKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7Cit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7CisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtOb0hhc2JpdCA9IC0xOworCisvLyBDcmVhdGUgYW4gZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyB0bworLy8gICJmb3IgYWxsIGksIChfaGFzX2JpdHNfW2ldICYgbWFza3NbaV0pID09IG1hc2tzW2ldIgorLy8gbWFza3MgaXMgYWxsb3dlZCB0byBiZSBzaG9ydGVyIHRoYW4gX2hhc19iaXRzXywgYnV0IGF0IGxlYXN0IG9uZSBlbGVtZW50IG9mCisvLyBtYXNrcyBtdXN0IGJlIG5vbi16ZXJvLgorc3RkOjpzdHJpbmcgQ29uZGl0aW9uYWxUb0NoZWNrQml0bWFza3MoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBtYXNrcywgYm9vbCByZXR1cm5fc3VjY2VzcyA9IHRydWUsCisgICAgU3RyaW5nUGllY2UgaGFzX2JpdHNfdmFyID0gIl9pbXBsXy5faGFzX2JpdHNfIikgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGFydHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFza3Muc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAobWFza3NbaV0gPT0gMCkgY29udGludWU7CisgICAgc3RkOjpzdHJpbmcgbSA9IFN0ckNhdCgiMHgiLCBzdHJpbmdzOjpIZXgobWFza3NbaV0sIHN0cmluZ3M6OlpFUk9fUEFEXzgpKTsKKyAgICAvLyBFYWNoIHhvciBldmFsdWF0ZXMgdG8gMCBpZiB0aGUgZXhwZWN0ZWQgYml0cyBhcmUgcHJlc2VudC4KKyAgICBwYXJ0cy5wdXNoX2JhY2soCisgICAgICAgIFN0ckNhdCgiKCgiLCBoYXNfYml0c192YXIsICJbIiwgaSwgIl0gJiAiLCBtLCAiKSBeICIsIG0sICIpIikpOworICB9CisgIEdPT0dMRV9DSEVDSyghcGFydHMuZW1wdHkoKSk7CisgIC8vIElmIHdlIGhhdmUgbXVsdGlwbGUgcGFydHMsIGVhY2ggZXhwZWN0ZWQgdG8gYmUgMCwgdGhlbiBiaXR3aXNlLW9yIHRoZW0uCisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9CisgICAgICBwYXJ0cy5zaXplKCkgPT0gMQorICAgICAgICAgID8gcGFydHNbMF0KKyAgICAgICAgICA6IFN0ckNhdCgiKCIsIEpvaW4ocGFydHMsICJcbiAgICAgICB8ICIpLCAiKSIpOworICByZXR1cm4gcmVzdWx0ICsgKHJldHVybl9zdWNjZXNzID8gIiA9PSAwIiA6ICIgIT0gMCIpOworfQorCit2b2lkIFByaW50UHJlc2VuY2VDaGVjayhjb25zdCBGb3JtYXR0ZXImIGZvcm1hdCwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGhhc19iaXRfaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBpbnQqIGNhY2hlZF9oYXNfd29yZF9pbmRleCkgeworICBpZiAoIWZpZWxkLT5vcHRpb25zKCkud2VhaygpKSB7CisgICAgaW50IGhhc19iaXRfaW5kZXggPSBoYXNfYml0X2luZGljZXNbZmllbGQtPmluZGV4KCldOworICAgIGlmICgqY2FjaGVkX2hhc193b3JkX2luZGV4ICE9IChoYXNfYml0X2luZGV4IC8gMzIpKSB7CisgICAgICAqY2FjaGVkX2hhc193b3JkX2luZGV4ID0gKGhhc19iaXRfaW5kZXggLyAzMik7CisgICAgICBmb3JtYXQoImNhY2hlZF9oYXNfYml0cyA9ICRoYXNfYml0cyRbJDEkXTtcbiIsICpjYWNoZWRfaGFzX3dvcmRfaW5kZXgpOworICAgIH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtYXNrID0KKyAgICAgICAgU3RyQ2F0KHN0cmluZ3M6OkhleCgxdSA8PCAoaGFzX2JpdF9pbmRleCAlIDMyKSwgc3RyaW5nczo6WkVST19QQURfOCkpOworICAgIGZvcm1hdCgiaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4JDEkdSkge1xuIiwgbWFzayk7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KCJpZiAoaGFzXyQxJCgpKSB7XG4iLCBGaWVsZE5hbWUoZmllbGQpKTsKKyAgfQorICBmb3JtYXQuSW5kZW50KCk7Cit9CisKK3N0cnVjdCBGaWVsZE9yZGVyaW5nQnlOdW1iZXIgeworICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gYS0+bnVtYmVyKCkgPCBiLT5udW1iZXIoKTsKKyAgfQorfTsKKworLy8gU29ydCB0aGUgZmllbGRzIG9mIHRoZSBnaXZlbiBEZXNjcmlwdG9yIGJ5IG51bWJlciBpbnRvIGEgbmV3W10nZCBhcnJheQorLy8gYW5kIHJldHVybiBpdC4KK3N0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IFNvcnRGaWVsZHNCeU51bWJlcigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkcyhkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZHNbaV0gPSBkZXNjcmlwdG9yLT5maWVsZChpKTsKKyAgfQorICBzdGQ6OnNvcnQoZmllbGRzLmJlZ2luKCksIGZpZWxkcy5lbmQoKSwgRmllbGRPcmRlcmluZ0J5TnVtYmVyKCkpOworICByZXR1cm4gZmllbGRzOworfQorCisvLyBGdW5jdG9yIGZvciBzb3J0aW5nIGV4dGVuc2lvbiByYW5nZXMgYnkgdGhlaXIgInN0YXJ0IiBmaWVsZCBudW1iZXIuCitzdHJ1Y3QgRXh0ZW5zaW9uUmFuZ2VTb3J0ZXIgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIGxlZnQsCisgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmlnaHQpIGNvbnN0IHsKKyAgICByZXR1cm4gbGVmdC0+c3RhcnQgPCByaWdodC0+c3RhcnQ7CisgIH0KK307CisKK2Jvb2wgSXNQT0QoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkgfHwgZmllbGQtPmlzX2V4dGVuc2lvbigpKSByZXR1cm4gZmFsc2U7CisgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvLyBIZWxwZXIgZm9yIHRoZSBjb2RlIHRoYXQgZW1pdHMgdGhlIFNoYXJlZEN0b3IoKSBhbmQgSW50ZXJuYWxTd2FwKCkgbWV0aG9kcy4KKy8vIEFueXRoaW5nIHRoYXQgaXMgYSBQT0Qgb3IgYSAibm9ybWFsIiBtZXNzYWdlIChyZXByZXNlbnRlZCBieSBhIHBvaW50ZXIpIGNhbgorLy8gYmUgbWFuaXB1bGF0ZWQgYXMgcmF3IGJ5dGVzLgorYm9vbCBDYW5CZU1hbmlwdWxhdGVkQXNSYXdCeXRlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU0NDQW5hbHl6ZXIqIHNjY19hbmFseXplcikgeworICBib29sIHJldCA9IENhbkluaXRpYWxpemVCeVplcm9pbmcoZmllbGQpOworCisgIC8vIE5vbi1yZXBlYXRlZCwgbm9uLWxhenkgbWVzc2FnZSBmaWVsZHMgYXJlIHNpbXBseSByYXcgcG9pbnRlcnMsIHNvIHdlIGNhbgorICAvLyBzd2FwIHRoZW0gb3IgdXNlIG1lbXNldCB0byBpbml0aWFsaXplIHRoZXNlIGluIFNoYXJlZEN0b3IuIFdlIGNhbm5vdCB1c2UKKyAgLy8gdGhpcyBpbiBDbGVhciwgYXMgd2UgbmVlZCB0byBwb3RlbnRpYWxseSBkZWxldGUgdGhlIGV4aXN0aW5nIHZhbHVlLgorICByZXQgPQorICAgICAgcmV0IHx8ICghZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgIUlzTGF6eShmaWVsZCwgb3B0aW9ucywgc2NjX2FuYWx5emVyKSAmJgorICAgICAgICAgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSk7CisgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgU3RyQ29udGFpbnMoY29uc3Qgc3RkOjpzdHJpbmcmIGhheXN0YWNrLCBjb25zdCBzdGQ6OnN0cmluZyYgbmVlZGxlKSB7CisgIHJldHVybiBoYXlzdGFjay5maW5kKG5lZWRsZSkgIT0gc3RkOjpzdHJpbmc6Om5wb3M7Cit9CisKKy8vIEZpbmRzIHJ1bnMgb2YgZmllbGRzIGZvciB3aGljaCBgcHJlZGljYXRlYCBpcyB0cnVlLgorLy8gUnVuTWFwIG1hcHMgZnJvbSBmaWVsZHMgdGhhdCBzdGFydCBlYWNoIHJ1biB0byB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGF0CisvLyBydW4uICBUaGlzIGlzIG9wdGltaXplZCBmb3IgdGhlIGNvbW1vbiBjYXNlIHRoYXQgdGhlcmUgYXJlIHZlcnkgZmV3IHJ1bnMgaW4KKy8vIGEgbWVzc2FnZSBhbmQgdGhhdCBtb3N0IG9mIHRoZSBlbGlnaWJsZSBmaWVsZHMgYXBwZWFyIHRvZ2V0aGVyLgordXNpbmcgUnVuTWFwID0gc3RkOjp1bm9yZGVyZWRfbWFwPGNvbnN0IEZpZWxkRGVzY3JpcHRvciosIHNpemVfdD47CitSdW5NYXAgRmluZFJ1bnMoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGZpZWxkcywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgRmllbGREZXNjcmlwdG9yKik+JiBwcmVkaWNhdGUpIHsKKyAgUnVuTWFwIHJ1bnM7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbGFzdF9zdGFydCA9IG51bGxwdHI7CisKKyAgZm9yIChhdXRvIGZpZWxkIDogZmllbGRzKSB7CisgICAgaWYgKHByZWRpY2F0ZShmaWVsZCkpIHsKKyAgICAgIGlmIChsYXN0X3N0YXJ0ID09IG51bGxwdHIpIHsKKyAgICAgICAgbGFzdF9zdGFydCA9IGZpZWxkOworICAgICAgfQorCisgICAgICBydW5zW2xhc3Rfc3RhcnRdKys7CisgICAgfSBlbHNlIHsKKyAgICAgIGxhc3Rfc3RhcnQgPSBudWxscHRyOworICAgIH0KKyAgfQorICByZXR1cm4gcnVuczsKK30KKworLy8gRW1pdHMgYW4gaWYtc3RhdGVtZW50IHdpdGggYSBjb25kaXRpb24gdGhhdCBldmFsdWF0ZXMgdG8gdHJ1ZSBpZiB8ZmllbGR8IGlzCisvLyBjb25zaWRlcmVkIG5vbi1kZWZhdWx0ICh3aWxsIGJlIHNlbnQgb3ZlciB0aGUgd2lyZSksIGZvciBtZXNzYWdlIHR5cGVzCisvLyB3aXRob3V0IHRydWUgZmllbGQgcHJlc2VuY2UuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZgorLy8gIUhhc0hhc2JpdChmaWVsZCkuCitib29sIEVtaXRGaWVsZE5vbkRlZmF1bHRDb25kaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIEdPT0dMRV9DSEVDSyghSGFzSGFzYml0KGZpZWxkKSk7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlcik7CisgIGZvcm1hdC5TZXQoInByZWZpeCIsIHByZWZpeCk7CisgIGZvcm1hdC5TZXQoIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKKyAgLy8gTWVyZ2UgYW5kIHNlcmlhbGl6ZSBzZW1hbnRpY3M6IHByaW1pdGl2ZSBmaWVsZHMgYXJlIG1lcmdlZC9zZXJpYWxpemVkIG9ubHkKKyAgLy8gaWYgbm9uLXplcm8gKG51bWVyaWMpIG9yIG5vbi1lbXB0eSAoc3RyaW5nKS4KKyAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiAhZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgeworICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HKSB7CisgICAgICBmb3JtYXQoImlmICghJHByZWZpeCRfaW50ZXJuYWxfJG5hbWUkKCkuZW1wdHkoKSkge1xuIik7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgLy8gTWVzc2FnZSBmaWVsZHMgc3RpbGwgaGF2ZSBoYXNfJG5hbWUkKCkgbWV0aG9kcy4KKyAgICAgIGZvcm1hdCgiaWYgKCRwcmVmaXgkX2ludGVybmFsX2hhc18kbmFtZSQoKSkge1xuIik7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQpIHsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAic3RhdGljX2Fzc2VydChzaXplb2YodWludDMyX3QpID09IHNpemVvZihmbG9hdCksIFwiQ29kZSBhc3N1bWVzICIKKyAgICAgICAgICAidWludDMyX3QgYW5kIGZsb2F0IGFyZSB0aGUgc2FtZSBzaXplLlwiKTtcbiIKKyAgICAgICAgICAiZmxvYXQgdG1wXyRuYW1lJCA9ICRwcmVmaXgkX2ludGVybmFsXyRuYW1lJCgpO1xuIgorICAgICAgICAgICJ1aW50MzJfdCByYXdfJG5hbWUkO1xuIgorICAgICAgICAgICJtZW1jcHkoJnJhd18kbmFtZSQsICZ0bXBfJG5hbWUkLCBzaXplb2YodG1wXyRuYW1lJCkpO1xuIgorICAgICAgICAgICJpZiAocmF3XyRuYW1lJCAhPSAwKSB7XG4iKTsKKyAgICB9IGVsc2UgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEUpIHsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAic3RhdGljX2Fzc2VydChzaXplb2YodWludDY0X3QpID09IHNpemVvZihkb3VibGUpLCBcIkNvZGUgYXNzdW1lcyAiCisgICAgICAgICAgInVpbnQ2NF90IGFuZCBkb3VibGUgYXJlIHRoZSBzYW1lIHNpemUuXCIpO1xuIgorICAgICAgICAgICJkb3VibGUgdG1wXyRuYW1lJCA9ICRwcmVmaXgkX2ludGVybmFsXyRuYW1lJCgpO1xuIgorICAgICAgICAgICJ1aW50NjRfdCByYXdfJG5hbWUkO1xuIgorICAgICAgICAgICJtZW1jcHkoJnJhd18kbmFtZSQsICZ0bXBfJG5hbWUkLCBzaXplb2YodG1wXyRuYW1lJCkpO1xuIgorICAgICAgICAgICJpZiAocmF3XyRuYW1lJCAhPSAwKSB7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9ybWF0KCJpZiAoJHByZWZpeCRfaW50ZXJuYWxfJG5hbWUkKCkgIT0gMCkge1xuIik7CisgICAgfQorICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChmaWVsZC0+cmVhbF9jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICBmb3JtYXQoImlmIChfaW50ZXJuYWxfaGFzXyRuYW1lJCgpKSB7XG4iKTsKKyAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBEb2VzIHRoZSBnaXZlbiBmaWVsZCBoYXZlIGEgaGFzXyRuYW1lJCgpIG1ldGhvZD8KK2Jvb2wgSGFzSGFzTWV0aG9kKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgaWYgKCFJc1Byb3RvMyhmaWVsZC0+ZmlsZSgpKSkgeworICAgIC8vIEluIHByb3RvMS9wcm90bzIsIGV2ZXJ5IGZpZWxkIGhhcyBhIGhhc18kbmFtZSQoKSBtZXRob2QuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgLy8gRm9yIG1lc3NhZ2UgdHlwZXMgd2l0aG91dCB0cnVlIGZpZWxkIHByZXNlbmNlLCBvbmx5IGZpZWxkcyB3aXRoIGEgbWVzc2FnZQorICAvLyB0eXBlIG9yIGluc2lkZSBhbiBvbmUtb2YgaGF2ZSBhIGhhc18kbmFtZSQoKSBtZXRob2QuCisgIHJldHVybiBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSB8fAorICAgICAgICAgZmllbGQtPmhhc19vcHRpb25hbF9rZXl3b3JkKCkgfHwgZmllbGQtPnJlYWxfY29udGFpbmluZ19vbmVvZigpOworfQorCisvLyBDb2xsZWN0cyBtYXAgZW50cnkgbWVzc2FnZSB0eXBlIGluZm9ybWF0aW9uLgordm9pZCBDb2xsZWN0TWFwSW5mbyhjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgR09PR0xFX0NIRUNLKElzTWFwRW50cnlNZXNzYWdlKGRlc2NyaXB0b3IpKTsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdmFycyA9ICp2YXJpYWJsZXM7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5ID0gZGVzY3JpcHRvci0+bWFwX2tleSgpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHZhbCA9IGRlc2NyaXB0b3ItPm1hcF92YWx1ZSgpOworICB2YXJzWyJrZXlfY3BwIl0gPSBQcmltaXRpdmVUeXBlTmFtZShvcHRpb25zLCBrZXktPmNwcF90eXBlKCkpOworICBzd2l0Y2ggKHZhbC0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICB2YXJzWyJ2YWxfY3BwIl0gPSBGaWVsZE1lc3NhZ2VUeXBlTmFtZSh2YWwsIG9wdGlvbnMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgIHZhcnNbInZhbF9jcHAiXSA9IENsYXNzTmFtZSh2YWwtPmVudW1fdHlwZSgpLCB0cnVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB2YXJzWyJ2YWxfY3BwIl0gPSBQcmltaXRpdmVUeXBlTmFtZShvcHRpb25zLCB2YWwtPmNwcF90eXBlKCkpOworICB9CisgIHZhcnNbImtleV93aXJlX3R5cGUiXSA9CisgICAgICAiVFlQRV8iICsgVG9VcHBlcihEZWNsYXJlZFR5cGVNZXRob2ROYW1lKGtleS0+dHlwZSgpKSk7CisgIHZhcnNbInZhbF93aXJlX3R5cGUiXSA9CisgICAgICAiVFlQRV8iICsgVG9VcHBlcihEZWNsYXJlZFR5cGVNZXRob2ROYW1lKHZhbC0+dHlwZSgpKSk7Cit9CisKKy8vIERvZXMgdGhlIGdpdmVuIGZpZWxkIGhhdmUgYSBwcml2YXRlIChpbnRlcm5hbCBoZWxwZXIgb25seSkgaGFzXyRuYW1lJCgpCisvLyBtZXRob2Q/Citib29sIEhhc1ByaXZhdGVIYXNNZXRob2QoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAvLyBPbmx5IGZvciBvbmVvZnMgaW4gbWVzc2FnZSB0eXBlcyB3aXRoIG5vIGZpZWxkIHByZXNlbmNlLiBoYXNfJG5hbWUkKCksCisgIC8vIGJhc2VkIG9uIHRoZSBvbmVvZiBjYXNlLCBpcyBzdGlsbCB1c2VmdWwgaW50ZXJuYWxseSBmb3IgZ2VuZXJhdGVkIGNvZGUuCisgIHJldHVybiBJc1Byb3RvMyhmaWVsZC0+ZmlsZSgpKSAmJiBmaWVsZC0+cmVhbF9jb250YWluaW5nX29uZW9mKCk7Cit9CisKKy8vIFRPRE8oY2tlbm5lbGx5KTogIEN1bGwgdGhlc2UgZXhjbHVzaW9ucyBpZi93aGVuIHRoZXNlIHByb3RvcyBkbyBub3QgaGF2ZQorLy8gdGhlaXIgbWV0aG9kcyBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuCisKK2Jvb2wgU2hvdWxkTWFya0NsYXNzQXNGaW5hbChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8gUmV0dXJucyB0cnVlIHRvIG1ha2UgdGhlIG1lc3NhZ2Ugc2VyaWFsaXplIGluIG9yZGVyLCBkZWNpZGVkIGJ5IHRoZSBmb2xsb3dpbmcKKy8vIGZhY3RvcnMgaW4gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UuCisvLyAtLW9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpID09IHRydWUKKy8vIC0tdGhlIG1lc3NhZ2UgaXMgaW4gdGhlIGFsbG93bGlzdCAodHJ1ZSkKKy8vIC0tR09PR0xFX1BST1RPQlVGX1NIVUZGTEVfU0VSSUFMSVpFIGlzIGRlZmluZWQgKGZhbHNlKQorLy8gLS1hIHJhbmFnZSBvZiBtZXNzYWdlIG5hbWVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gc3RheSBpbiBvcmRlciAodHJ1ZSkKK2Jvb2wgU2hvdWxkU2VyaWFsaXplSW5PcmRlcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSXNDcm9zc0ZpbGVNYXBGaWVsZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGlmICghZmllbGQtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY29uc3QgRGVzY3JpcHRvciogZCA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZSA9IGQtPkZpbmRGaWVsZEJ5TnVtYmVyKDIpOworCisgIHJldHVybiBJc0Nyb3NzRmlsZU1lc3NhZ2UodmFsdWUpOworfQorCitib29sIElzQ3Jvc3NGaWxlTWF5YmVNYXAoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBpZiAoSXNDcm9zc0ZpbGVNYXBGaWVsZChmaWVsZCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBJc0Nyb3NzRmlsZU1lc3NhZ2UoZmllbGQpOworfQorCitib29sIElzUmVxdWlyZWQoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIHYpIHsKKyAgcmV0dXJuIHYuZnJvbnQoKS0+aXNfcmVxdWlyZWQoKTsKK30KKworYm9vbCBIYXNOb25TcGxpdE9wdGlvbmFsU3RyaW5nKGNvbnN0IERlc2NyaXB0b3IqIGRlc2MsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgZm9yIChjb25zdCBhdXRvKiBmaWVsZCA6IEZpZWxkUmFuZ2UoZGVzYykpIHsKKyAgICBpZiAoSXNTdHJpbmcoZmllbGQsIG9wdGlvbnMpICYmICFmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJgorICAgICAgICAhZmllbGQtPnJlYWxfY29udGFpbmluZ19vbmVvZigpICYmICFTaG91bGRTcGxpdChmaWVsZCwgb3B0aW9ucykpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIENvbGxlY3RzIG5laWdoYm9yaW5nIGZpZWxkcyBiYXNlZCBvbiBhIGdpdmVuIGNyaXRlcmlhIChlcXVpdmFsZW50IHByZWRpY2F0ZSkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZGljYXRlPgorc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4+IENvbGxlY3RGaWVsZHMoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGZpZWxkcywKKyAgICBjb25zdCBQcmVkaWNhdGUmIGVxdWl2YWxlbnQpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4+IGNodW5rczsKKyAgZm9yIChhdXRvIGZpZWxkIDogZmllbGRzKSB7CisgICAgaWYgKGNodW5rcy5lbXB0eSgpIHx8ICFlcXVpdmFsZW50KGNodW5rcy5iYWNrKCkuYmFjaygpLCBmaWVsZCkpIHsKKyAgICAgIGNodW5rcy5lbXBsYWNlX2JhY2soKTsKKyAgICB9CisgICAgY2h1bmtzLmJhY2soKS5wdXNoX2JhY2soZmllbGQpOworICB9CisgIHJldHVybiBjaHVua3M7Cit9CisKKy8vIFJldHVybnMgYSBiaXQgbWFzayBiYXNlZCBvbiBoYXNfYml0IGluZGV4IG9mICJmaWVsZHMiIHRoYXQgYXJlIHR5cGljYWxseSBvbgorLy8gdGhlIHNhbWUgY2h1bmsuIEl0IGlzIHVzZWQgaW4gYSBncm91cCBwcmVzZW5jZSBjaGVjayB3aGVyZSBfaGFzX2JpdHNfIGlzCisvLyBtYXNrZWQgdG8gdGVsbCBpZiBhbnkgdGhpbmcgaW4gImZpZWxkcyIgaXMgcHJlc2VudC4KK3VpbnQzMl90IEdlbkNodW5rTWFzayhjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGhhc19iaXRfaW5kaWNlcykgeworICBHT09HTEVfQ0hFQ0soIWZpZWxkcy5lbXB0eSgpKTsKKyAgaW50IGZpcnN0X2luZGV4X29mZnNldCA9IGhhc19iaXRfaW5kaWNlc1tmaWVsZHMuZnJvbnQoKS0+aW5kZXgoKV0gLyAzMjsKKyAgdWludDMyX3QgY2h1bmtfbWFzayA9IDA7CisgIGZvciAoYXV0byBmaWVsZCA6IGZpZWxkcykgeworICAgIC8vICJpbmRleCIgZGVmaW5lcyB3aGVyZSBpbiB0aGUgX2hhc19iaXRzXyB0aGUgZmllbGQgYXBwZWFycy4KKyAgICBpbnQgaW5kZXggPSBoYXNfYml0X2luZGljZXNbZmllbGQtPmluZGV4KCldOworICAgIEdPT0dMRV9DSEVDS19FUShmaXJzdF9pbmRleF9vZmZzZXQsIGluZGV4IC8gMzIpOworICAgIGNodW5rX21hc2sgfD0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDEpIDw8IChpbmRleCAlIDMyKTsKKyAgfQorICBHT09HTEVfQ0hFQ0tfTkUoMCwgY2h1bmtfbWFzayk7CisgIHJldHVybiBjaHVua19tYXNrOworfQorCisvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiBuLCBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLgorc3RhdGljIGludCBwb3BjbnQodWludDMyX3QgbikgeworICBpbnQgcmVzdWx0ID0gMDsKKyAgd2hpbGUgKG4gIT0gMCkgeworICAgIHJlc3VsdCArPSAobiAmIDEpOworICAgIG4gPSBuIC8gMjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBGb3IgYSBydW4gb2YgY29sZCBjaHVua3MsIG9wZW5zIGFuZCBjbG9zZXMgYW4gZXh0ZXJuYWwgaWYgc3RhdGVtZW50IHRoYXQKKy8vIGNoZWNrcyBtdWx0aXBsZSBoYXNfYml0cyB3b3JkcyB0byBza2lwIGJ1bGsgb2YgY29sZCBmaWVsZHMuCitjbGFzcyBDb2xkQ2h1bmtTa2lwcGVyIHsKKyBwdWJsaWM6CisgIENvbGRDaHVua1NraXBwZXIoCisgICAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4+JiBjaHVua3MsCisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBoYXNfYml0X2luZGljZXMsIGNvbnN0IGRvdWJsZSBjb2xkX3RocmVzaG9sZCkKKyAgICAgIDogY2h1bmtzXyhjaHVua3MpLAorICAgICAgICBoYXNfYml0X2luZGljZXNfKGhhc19iaXRfaW5kaWNlcyksCisgICAgICAgIGFjY2Vzc19pbmZvX21hcF8ob3B0aW9ucy5hY2Nlc3NfaW5mb19tYXApLAorICAgICAgICBjb2xkX3RocmVzaG9sZF8oY29sZF90aHJlc2hvbGQpIHsKKyAgICBTZXRDb21tb25WYXJzKG9wdGlvbnMsICZ2YXJpYWJsZXNfKTsKKyAgICBTZXRDb21tb25NZXNzYWdlRGF0YVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7CisgIH0KKworICAvLyBNYXkgb3BlbiBhbiBleHRlcm5hbCBpZiBjaGVjayBmb3IgYSBiYXRjaCBvZiBjb2xkIGZpZWxkcy4gImZyb20iIGlzIHRoZQorICAvLyBwcmVmaXggdG8gX2hhc19iaXRzXyB0byBhbGxvdyBNZXJnZUZyb20gdG8gdXNlICJmcm9tLl9oYXNfYml0c18iLgorICAvLyBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSAiIi4KKyAgdm9pZCBPblN0YXJ0Q2h1bmsoaW50IGNodW5rLCBpbnQgY2FjaGVkX2hhc193b3JkX2luZGV4LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnJvbSwgaW86OlByaW50ZXIqIHByaW50ZXIpOworICBib29sIE9uRW5kQ2h1bmsoaW50IGNodW5rLCBpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorICBib29sIElzQ29sZENodW5rKGludCBjaHVuayk7CisKKyAgaW50IEhhc2JpdFdvcmQoaW50IGNodW5rLCBpbnQgb2Zmc2V0KSB7CisgICAgcmV0dXJuIGhhc19iaXRfaW5kaWNlc19bY2h1bmtzX1tjaHVua11bb2Zmc2V0XS0+aW5kZXgoKV0gLyAzMjsKKyAgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+PiYgY2h1bmtzXzsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaGFzX2JpdF9pbmRpY2VzXzsKKyAgY29uc3QgQWNjZXNzSW5mb01hcCogYWNjZXNzX2luZm9fbWFwXzsKKyAgY29uc3QgZG91YmxlIGNvbGRfdGhyZXNob2xkXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJpYWJsZXNfOworICBpbnQgbGltaXRfY2h1bmtfID0gLTE7Cit9OworCisvLyBUdW5pbmcgcGFyYW1ldGVycyBmb3IgQ29sZENodW5rU2tpcHBlci4KK2NvbnN0IGRvdWJsZSBrQ29sZFJhdGlvID0gMC4wMDU7CisKK2Jvb2wgQ29sZENodW5rU2tpcHBlcjo6SXNDb2xkQ2h1bmsoaW50IGNodW5rKSB7CisgIC8vIE1hcmsgdGhpcyB2YXJpYWJsZSBhcyB1c2VkIHVudGlsIGl0IGlzIGFjdHVhbGx5IHVzZWQKKyAgKHZvaWQpY29sZF90aHJlc2hvbGRfOworICByZXR1cm4gZmFsc2U7Cit9CisKKwordm9pZCBDb2xkQ2h1bmtTa2lwcGVyOjpPblN0YXJ0Q2h1bmsoaW50IGNodW5rLCBpbnQgY2FjaGVkX2hhc193b3JkX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoIWFjY2Vzc19pbmZvX21hcF8pIHsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAoY2h1bmsgPCBsaW1pdF9jaHVua18pIHsKKyAgICAvLyBXZSBhcmUgYWxyZWFkeSBpbnNpZGUgYSBydW4gb2YgY29sZCBjaHVua3MuCisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKCFJc0NvbGRDaHVuayhjaHVuaykpIHsKKyAgICAvLyBXZSBjYW4ndCBzdGFydCBhIHJ1biBvZiBjb2xkIGNodW5rcy4KKyAgICByZXR1cm47CisgIH0KKworICAvLyBGaW5kIHRoZSBlbmQgb2YgY29uc2VjdXRpdmUgY29sZCBjaHVua3MuCisgIGxpbWl0X2NodW5rXyA9IGNodW5rOworICB3aGlsZSAobGltaXRfY2h1bmtfIDwgY2h1bmtzXy5zaXplKCkgJiYgSXNDb2xkQ2h1bmsobGltaXRfY2h1bmtfKSkgeworICAgIGxpbWl0X2NodW5rXysrOworICB9CisKKyAgaWYgKGxpbWl0X2NodW5rXyA8PSBjaHVuayArIDEpIHsKKyAgICAvLyBSZXF1aXJlIGF0IGxlYXN0IHR3byBjaHVua3MgdG8gZW1pdCBleHRlcm5hbCBoYXNfYml0IGNoZWNrcy4KKyAgICBsaW1pdF9jaHVua18gPSAtMTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBFbWl0IGhhc19iaXQgY2hlY2sgZm9yIGVhY2ggaGFzX2JpdF9kd29yZCBpbmRleC4KKyAgZm9ybWF0KCJpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSgiKTsKKyAgaW50IGZpcnN0X3dvcmQgPSBIYXNiaXRXb3JkKGNodW5rLCAwKTsKKyAgd2hpbGUgKGNodW5rIDwgbGltaXRfY2h1bmtfKSB7CisgICAgdWludDMyX3QgbWFzayA9IDA7CisgICAgaW50IHRoaXNfd29yZCA9IEhhc2JpdFdvcmQoY2h1bmssIDApOworICAgIC8vIEdlbmVyYXRlIG1hc2sgZm9yIGNodW5rcyBvbiB0aGUgc2FtZSB3b3JkLgorICAgIGZvciAoOyBjaHVuayA8IGxpbWl0X2NodW5rXyAmJiBIYXNiaXRXb3JkKGNodW5rLCAwKSA9PSB0aGlzX3dvcmQ7IGNodW5rKyspIHsKKyAgICAgIGZvciAoYXV0byBmaWVsZCA6IGNodW5rc19bY2h1bmtdKSB7CisgICAgICAgIGludCBoYXNiaXRfaW5kZXggPSBoYXNfYml0X2luZGljZXNfW2ZpZWxkLT5pbmRleCgpXTsKKyAgICAgICAgLy8gRmllbGRzIG9uIGEgY2h1bmsgbXVzdCBiZSBpbiB0aGUgc2FtZSB3b3JkLgorICAgICAgICBHT09HTEVfQ0hFQ0tfRVEodGhpc193b3JkLCBoYXNiaXRfaW5kZXggLyAzMik7CisgICAgICAgIG1hc2sgfD0gMSA8PCAoaGFzYml0X2luZGV4ICUgMzIpOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzX3dvcmQgIT0gZmlyc3Rfd29yZCkgeworICAgICAgZm9ybWF0KCIgfHxcbiAgICAiKTsKKyAgICB9CisgICAgZm9ybWF0LlNldCgibWFzayIsIHN0cmluZ3M6OkhleChtYXNrLCBzdHJpbmdzOjpaRVJPX1BBRF84KSk7CisgICAgaWYgKHRoaXNfd29yZCA9PSBjYWNoZWRfaGFzX3dvcmRfaW5kZXgpIHsKKyAgICAgIGZvcm1hdCgiKGNhY2hlZF9oYXNfYml0cyAmIDB4JG1hc2skdSkgIT0gMCIpOworICAgIH0gZWxzZSB7CisgICAgICBmb3JtYXQoIigkMSRfaW1wbF8uX2hhc19iaXRzX1skMiRdICYgMHgkbWFzayR1KSAhPSAwIiwgZnJvbSwgdGhpc193b3JkKTsKKyAgICB9CisgIH0KKyAgZm9ybWF0KCIpKSB7XG4iKTsKKyAgZm9ybWF0LkluZGVudCgpOworfQorCitib29sIENvbGRDaHVua1NraXBwZXI6Ok9uRW5kQ2h1bmsoaW50IGNodW5rLCBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoY2h1bmsgIT0gbGltaXRfY2h1bmtfIC0gMSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoIn1cbiIpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBNYXlTZXRBbm5vdGF0aW9uVmFyaWFibGUoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIGFubm90YXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIGluamVjdG9yX3RlbXBsYXRlX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIGluamVjdG9yX3RlbXBsYXRlX3N1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcykgeworICBpZiAob3B0aW9ucy5maWVsZF9saXN0ZW5lcl9vcHRpb25zLmZvcmJpZGRlbl9maWVsZF9saXN0ZW5lcl9ldmVudHMuY291bnQoCisgICAgICAgICAgc3RkOjpzdHJpbmcoYW5ub3RhdGlvbl9uYW1lKSkpCisgICAgcmV0dXJuOworICAoKnZhcmlhYmxlcylbU3RyQ2F0KCJhbm5vdGF0ZV8iLCBhbm5vdGF0aW9uX25hbWUpXSA9IHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICBTdHJDYXQoaW5qZWN0b3JfdGVtcGxhdGVfcHJlZml4LCBpbmplY3Rvcl90ZW1wbGF0ZV9zdWZmaXgpLAorICAgICAgKCp2YXJpYWJsZXMpWyJjbGFzc3R5cGUiXSk7Cit9CisKK3ZvaWQgR2VuZXJhdGVFeHRlbnNpb25Bbm5vdGF0aW9ucygKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcykgeworICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFjY2Vzc29yX2Fubm90YXRpb25zX3RvX2hvb2tzID0geworICAgICAgeyJhbm5vdGF0ZV9leHRlbnNpb25faGFzIiwgIk9uSGFzRXh0ZW5zaW9uIn0sCisgICAgICB7ImFubm90YXRlX2V4dGVuc2lvbl9jbGVhciIsICJPbkNsZWFyRXh0ZW5zaW9uIn0sCisgICAgICB7ImFubm90YXRlX2V4dGVuc2lvbl9yZXBlYXRlZF9zaXplIiwgIk9uRXh0ZW5zaW9uU2l6ZSJ9LAorICAgICAgeyJhbm5vdGF0ZV9leHRlbnNpb25fZ2V0IiwgIk9uR2V0RXh0ZW5zaW9uIn0sCisgICAgICB7ImFubm90YXRlX2V4dGVuc2lvbl9tdXRhYmxlIiwgIk9uTXV0YWJsZUV4dGVuc2lvbiJ9LAorICAgICAgeyJhbm5vdGF0ZV9leHRlbnNpb25fc2V0IiwgIk9uU2V0RXh0ZW5zaW9uIn0sCisgICAgICB7ImFubm90YXRlX2V4dGVuc2lvbl9yZWxlYXNlIiwgIk9uUmVsZWFzZUV4dGVuc2lvbiJ9LAorICAgICAgeyJhbm5vdGF0ZV9yZXBlYXRlZF9leHRlbnNpb25fZ2V0IiwgIk9uR2V0RXh0ZW5zaW9uIn0sCisgICAgICB7ImFubm90YXRlX3JlcGVhdGVkX2V4dGVuc2lvbl9tdXRhYmxlIiwgIk9uTXV0YWJsZUV4dGVuc2lvbiJ9LAorICAgICAgeyJhbm5vdGF0ZV9yZXBlYXRlZF9leHRlbnNpb25fc2V0IiwgIk9uU2V0RXh0ZW5zaW9uIn0sCisgICAgICB7ImFubm90YXRlX3JlcGVhdGVkX2V4dGVuc2lvbl9hZGQiLCAiT25BZGRFeHRlbnNpb24ifSwKKyAgICAgIHsiYW5ub3RhdGVfcmVwZWF0ZWRfZXh0ZW5zaW9uX2FkZF9tdXRhYmxlIiwgIk9uQWRkTXV0YWJsZUV4dGVuc2lvbiJ9LAorICAgICAgeyJhbm5vdGF0ZV9yZXBlYXRlZF9leHRlbnNpb25fbGlzdCIsICJPbkxpc3RFeHRlbnNpb24ifSwKKyAgICAgIHsiYW5ub3RhdGVfcmVwZWF0ZWRfZXh0ZW5zaW9uX2xpc3RfbXV0YWJsZSIsICJPbk11dGFibGVMaXN0RXh0ZW5zaW9uIn0sCisgIH07CisgIGZvciAoY29uc3QgYXV0byYgYW5ub3RhdGlvbiA6IGFjY2Vzc29yX2Fubm90YXRpb25zX3RvX2hvb2tzKSB7CisgICAgKCp2YXJpYWJsZXMpW2Fubm90YXRpb24uZmlyc3RdID0gIiI7CisgIH0KKyAgaWYgKCFIYXNUcmFja2VyKGRlc2NyaXB0b3IsIG9wdGlvbnMpKSB7CisgICAgcmV0dXJuOworICB9CisgIFN0cmluZ1BpZWNlIHRyYWNrZXIgPSAoKnZhcmlhYmxlcylbInRyYWNrZXIiXTsKKyAgU3RyaW5nUGllY2UgZXh0ZW5zaW9ucyA9ICgqdmFyaWFibGVzKVsiZXh0ZW5zaW9ucyJdOworICBmb3IgKGNvbnN0IGF1dG8mIGFubm90YXRpb24gOiBhY2Nlc3Nvcl9hbm5vdGF0aW9uc190b19ob29rcykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhbm5vdGF0aW9uX25hbWUgPSBhbm5vdGF0aW9uLmZpcnN0OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaXN0ZW5lcl9jYWxsID0gYW5ub3RhdGlvbi5zZWNvbmQ7CisgICAgaWYgKCFTdHJDb250YWlucyhhbm5vdGF0aW9uX25hbWUsICJyZXBlYXRlZCIpICYmCisgICAgICAgICFTdHJDb250YWlucyhhbm5vdGF0aW9uX25hbWUsICJzaXplIikgJiYKKyAgICAgICAgIVN0ckNvbnRhaW5zKGFubm90YXRpb25fbmFtZSwgImNsZWFyIikpIHsKKyAgICAgIC8vIFByaW1pdGl2ZSBmaWVsZHMgYWNjZXNzb3JzLgorICAgICAgLy8gIkhhcyIgaXMgaGVyZSBhcyB1c2VycyBjYWxsaW5nICJoYXMiIG9uIGEgcmVwZWF0ZWQgZmllbGQgaXMgYSBtaXN0YWtlLgorICAgICAgKCp2YXJpYWJsZXMpW2Fubm90YXRpb25fbmFtZV0gPSBTdHJDYXQoCisgICAgICAgICAgIiAgIiwgdHJhY2tlciwgIi4iLCBsaXN0ZW5lcl9jYWxsLAorICAgICAgICAgICIodGhpcywgaWQubnVtYmVyKCksIF9wcm90b19UeXBlVHJhaXRzOjpHZXRQdHIoaWQubnVtYmVyKCksICIsCisgICAgICAgICAgZXh0ZW5zaW9ucywgIiwgaWQuZGVmYXVsdF92YWx1ZV9yZWYoKSkpOyIpOworICAgIH0gZWxzZSBpZiAoU3RyQ29udGFpbnMoYW5ub3RhdGlvbl9uYW1lLCAicmVwZWF0ZWQiKSAmJgorICAgICAgICAgICAgICAgIVN0ckNvbnRhaW5zKGFubm90YXRpb25fbmFtZSwgImxpc3QiKSAmJgorICAgICAgICAgICAgICAgIVN0ckNvbnRhaW5zKGFubm90YXRpb25fbmFtZSwgInNpemUiKSkgeworICAgICAgLy8gUmVwZWF0ZWQgaW5kZXggYWNjZXNzb3JzLgorICAgICAgc3RkOjpzdHJpbmcgc3RyX2luZGV4ID0gImluZGV4IjsKKyAgICAgIGlmIChTdHJDb250YWlucyhhbm5vdGF0aW9uX25hbWUsICJhZGQiKSkgeworICAgICAgICBzdHJfaW5kZXggPSBTdHJDYXQoZXh0ZW5zaW9ucywgIi5FeHRlbnNpb25TaXplKGlkLm51bWJlcigpKSAtIDEiKTsKKyAgICAgIH0KKyAgICAgICgqdmFyaWFibGVzKVthbm5vdGF0aW9uX25hbWVdID0KKyAgICAgICAgICBTdHJDYXQoIiAgIiwgdHJhY2tlciwgIi4iLCBsaXN0ZW5lcl9jYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAiKHRoaXMsIGlkLm51bWJlcigpLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJfcHJvdG9fVHlwZVRyYWl0czo6R2V0UHRyKGlkLm51bWJlcigpLCAiLAorICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLCAiLCAiLCBzdHJfaW5kZXgsICIpKTsiKTsKKyAgICB9IGVsc2UgaWYgKFN0ckNvbnRhaW5zKGFubm90YXRpb25fbmFtZSwgImxpc3QiKSB8fAorICAgICAgICAgICAgICAgU3RyQ29udGFpbnMoYW5ub3RhdGlvbl9uYW1lLCAic2l6ZSIpKSB7CisgICAgICAvLyBSZXBlYXRlZCBmdWxsIGFjY2Vzc29ycy4KKyAgICAgICgqdmFyaWFibGVzKVthbm5vdGF0aW9uX25hbWVdID0gU3RyQ2F0KAorICAgICAgICAgICIgICIsIHRyYWNrZXIsICIuIiwgbGlzdGVuZXJfY2FsbCwKKyAgICAgICAgICAiKHRoaXMsIGlkLm51bWJlcigpLCBfcHJvdG9fVHlwZVRyYWl0czo6R2V0UmVwZWF0ZWRQdHIoaWQubnVtYmVyKCksICIsCisgICAgICAgICAgZXh0ZW5zaW9ucywgIikpOyIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBHZW5lcmljIGFjY2Vzc29ycyBzdWNoIGFzICJjbGVhciIuCisgICAgICAvLyBUT0RPKGIvMTkwNjE0Njc4KTogR2VuZXJhbGl6ZSBjbGVhciBmcm9tIGJvdGggcmVwZWF0ZWQgYW5kIG5vbiByZXBlYXRlZAorICAgICAgLy8gY2FsbHMsIGN1cnJlbnRseSB0aGVpciB1bmRlcmx5aW5nIG1lbW9yeSBpbnRlcmZhY2VzIGFyZSB2ZXJ5IGRpZmZlcmVudC4KKyAgICAgIC8vIE9yIHRoaW5rIG9mIHJlbW92aW5nIGNsZWFyIGNhbGxiYWNrIGFzIG5vIHVzYWdlcyBhcmUgbmVlZGVkIGFuZCBubworICAgICAgLy8gbWVtb3J5IGV4aXN0IGFmdGVyIGNhbGxpbmcgY2xlYXIoKS4KKyAgICB9CisgIH0KK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK01lc3NhZ2VHZW5lcmF0b3I6Ok1lc3NhZ2VHZW5lcmF0b3IoCisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiB2YXJzLCBpbnQgaW5kZXhfaW5fZmlsZV9tZXNzYWdlcywKKyAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBNZXNzYWdlU0NDQW5hbHl6ZXIqIHNjY19hbmFseXplcikKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgICAgaW5kZXhfaW5fZmlsZV9tZXNzYWdlc18oaW5kZXhfaW5fZmlsZV9tZXNzYWdlcyksCisgICAgICBjbGFzc25hbWVfKENsYXNzTmFtZShkZXNjcmlwdG9yLCBmYWxzZSkpLAorICAgICAgb3B0aW9uc18ob3B0aW9ucyksCisgICAgICBmaWVsZF9nZW5lcmF0b3JzXyhkZXNjcmlwdG9yLCBvcHRpb25zLCBzY2NfYW5hbHl6ZXIpLAorICAgICAgbWF4X2hhc19iaXRfaW5kZXhfKDApLAorICAgICAgbWF4X2lubGluZWRfc3RyaW5nX2luZGV4XygwKSwKKyAgICAgIG51bV93ZWFrX2ZpZWxkc18oMCksCisgICAgICBzY2NfYW5hbHl6ZXJfKHNjY19hbmFseXplciksCisgICAgICB2YXJpYWJsZXNfKHZhcnMpIHsKKyAgaWYgKCFtZXNzYWdlX2xheW91dF9oZWxwZXJfKSB7CisgICAgbWVzc2FnZV9sYXlvdXRfaGVscGVyXy5yZXNldChuZXcgUGFkZGluZ09wdGltaXplcigpKTsKKyAgfQorICBTZXRDb21tb25NZXNzYWdlRGF0YVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7CisKKyAgLy8gVmFyaWFibGVzIHRoYXQgYXBwbHkgdG8gdGhpcyBjbGFzcworICB2YXJpYWJsZXNfWyJjbGFzc25hbWUiXSA9IGNsYXNzbmFtZV87CisgIHZhcmlhYmxlc19bImNsYXNzdHlwZSJdID0gUXVhbGlmaWVkQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLCBvcHRpb25zKTsKKyAgdmFyaWFibGVzX1siZnVsbF9uYW1lIl0gPSBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCk7CisgIHZhcmlhYmxlc19bInN1cGVyY2xhc3MiXSA9IFN1cGVyQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLCBvcHRpb25zXyk7CisgIHZhcmlhYmxlc19bImFubm90YXRlX3NlcmlhbGl6ZSJdID0gIiI7CisgIHZhcmlhYmxlc19bImFubm90YXRlX2Rlc2VyaWFsaXplIl0gPSAiIjsKKyAgdmFyaWFibGVzX1siYW5ub3RhdGVfcmVmbGVjdGlvbiJdID0gIiI7CisgIHZhcmlhYmxlc19bImFubm90YXRlX2J5dGVzaXplIl0gPSAiIjsKKyAgdmFyaWFibGVzX1siYW5ub3RhdGVfbWVyZ2Vmcm9tIl0gPSAiIjsKKworICBpZiAoSGFzVHJhY2tlcihkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgaW5qZWN0b3JfdGVtcGxhdGUgPQorICAgICAgICBTdHJDYXQoIiAgIiwgdmFyaWFibGVzX1sidHJhY2tlciJdLCAiLiIpOworCisgICAgTWF5U2V0QW5ub3RhdGlvblZhcmlhYmxlKG9wdGlvbnMsICJzZXJpYWxpemUiLCBpbmplY3Rvcl90ZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9uU2VyaWFsaXplKHRoaXMpO1xuIiwgJnZhcmlhYmxlc18pOworICAgIE1heVNldEFubm90YXRpb25WYXJpYWJsZShvcHRpb25zLCAiZGVzZXJpYWxpemUiLCBpbmplY3Rvcl90ZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9uRGVzZXJpYWxpemUodGhpcyk7XG4iLCAmdmFyaWFibGVzXyk7CisgICAgLy8gVE9ETyhkYW5pbGFrKTogSWRlYWxseSBhbm5vdGF0ZV9yZWZsZWN0aW9uIHNob3VsZCBub3QgZXhpc3QgYW5kIHdlIG5lZWQKKyAgICAvLyB0byBhbm5vdGF0ZSBhbGwgcmVmbGVjdGl2ZSBjYWxscyBvbiBvdXIgb3duLCBob3dldmVyLCBhcyB0aGlzIGlzIGEgY2F1c2UKKyAgICAvLyBmb3Igc2lkZSBlZmZlY3RzLCBpLmUuIHJlYWRpbmcgdmFsdWVzIGR5bmFtaWNhbGx5LCB3ZSB3YW50IHRoZSB1c2VycyBrbm93CisgICAgLy8gdGhhdCBkeW5hbWljIGFjY2VzcyBjYW4gaGFwcGVuLgorICAgIE1heVNldEFubm90YXRpb25WYXJpYWJsZShvcHRpb25zLCAicmVmbGVjdGlvbiIsIGluamVjdG9yX3RlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25HZXRNZXRhZGF0YSgpO1xuIiwgJnZhcmlhYmxlc18pOworICAgIE1heVNldEFubm90YXRpb25WYXJpYWJsZShvcHRpb25zLCAiYnl0ZXNpemUiLCBpbmplY3Rvcl90ZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9uQnl0ZVNpemUodGhpcyk7XG4iLCAmdmFyaWFibGVzXyk7CisgICAgTWF5U2V0QW5ub3RhdGlvblZhcmlhYmxlKG9wdGlvbnMsICJtZXJnZWZyb20iLCBpbmplY3Rvcl90ZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9uTWVyZ2VGcm9tKF90aGlzLCAmZnJvbSk7XG4iLCAmdmFyaWFibGVzXyk7CisgIH0KKworICBHZW5lcmF0ZUV4dGVuc2lvbkFubm90YXRpb25zKGRlc2NyaXB0b3JfLCBvcHRpb25zXywgJnZhcmlhYmxlc18pOworCisgIFNldFVua25vd25GaWVsZHNWYXJpYWJsZShkZXNjcmlwdG9yXywgb3B0aW9uc18sICZ2YXJpYWJsZXNfKTsKKworICAvLyBDb21wdXRlIG9wdGltaXplZCBmaWVsZCBvcmRlciB0byBiZSB1c2VkIGZvciBsYXlvdXQgYW5kIGluaXRpYWxpemF0aW9uCisgIC8vIHB1cnBvc2VzLgorICBmb3IgKGF1dG8gZmllbGQgOiBGaWVsZFJhbmdlKGRlc2NyaXB0b3JfKSkgeworICAgIGlmIChJc0ZpZWxkU3RyaXBwZWQoZmllbGQsIG9wdGlvbnNfKSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKElzV2VhayhmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgICBudW1fd2Vha19maWVsZHNfKys7CisgICAgfSBlbHNlIGlmICghZmllbGQtPnJlYWxfY29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICBvcHRpbWl6ZWRfb3JkZXJfLnB1c2hfYmFjayhmaWVsZCk7CisgICAgfQorICB9CisKKyAgbWVzc2FnZV9sYXlvdXRfaGVscGVyXy0+T3B0aW1pemVMYXlvdXQoJm9wdGltaXplZF9vcmRlcl8sIG9wdGlvbnNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2NfYW5hbHl6ZXJfKTsKKworICAvLyBUaGlzIG1lc3NhZ2UgaGFzIGhhc2JpdHMgaWZmIG9uZSBvciBtb3JlIGZpZWxkcyBuZWVkIG9uZS4KKyAgZm9yIChhdXRvIGZpZWxkIDogb3B0aW1pemVkX29yZGVyXykgeworICAgIGlmIChIYXNIYXNiaXQoZmllbGQpKSB7CisgICAgICBpZiAoaGFzX2JpdF9pbmRpY2VzXy5lbXB0eSgpKSB7CisgICAgICAgIGhhc19iaXRfaW5kaWNlc18ucmVzaXplKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpLCBrTm9IYXNiaXQpOworICAgICAgfQorICAgICAgaGFzX2JpdF9pbmRpY2VzX1tmaWVsZC0+aW5kZXgoKV0gPSBtYXhfaGFzX2JpdF9pbmRleF8rKzsKKyAgICB9CisgICAgaWYgKElzU3RyaW5nSW5saW5lZChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgICBpZiAoaW5saW5lZF9zdHJpbmdfaW5kaWNlc18uZW1wdHkoKSkgeworICAgICAgICBpbmxpbmVkX3N0cmluZ19pbmRpY2VzXy5yZXNpemUoZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCksIGtOb0hhc2JpdCk7CisgICAgICAgIC8vIFRoZSBiaXRzZXRbMF0gaXMgZm9yIGFyZW5hIGR0b3IgdHJhY2tpbmcuIERvbmF0aW5nIHN0YXRlcyBzdGFydCBmcm9tCisgICAgICAgIC8vIGJpdHNldFsxXTsKKyAgICAgICAgbWF4X2lubGluZWRfc3RyaW5nX2luZGV4XysrOworICAgICAgfQorICAgICAgaW5saW5lZF9zdHJpbmdfaW5kaWNlc19bZmllbGQtPmluZGV4KCldID0gbWF4X2lubGluZWRfc3RyaW5nX2luZGV4XysrOworICAgIH0KKyAgfQorCisgIGlmICghaGFzX2JpdF9pbmRpY2VzXy5lbXB0eSgpKSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uU2V0SGFzQml0SW5kaWNlcyhoYXNfYml0X2luZGljZXNfKTsKKyAgfQorCisgIGlmICghaW5saW5lZF9zdHJpbmdfaW5kaWNlc18uZW1wdHkoKSkgeworICAgIGZpZWxkX2dlbmVyYXRvcnNfLlNldElubGluZWRTdHJpbmdJbmRpY2VzKGlubGluZWRfc3RyaW5nX2luZGljZXNfKTsKKyAgfQorCisgIG51bV9yZXF1aXJlZF9maWVsZHNfID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoZGVzY3JpcHRvci0+ZmllbGQoaSktPmlzX3JlcXVpcmVkKCkpIHsKKyAgICAgICsrbnVtX3JlcXVpcmVkX2ZpZWxkc187CisgICAgfQorICB9CisKKyAgcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yXy5yZXNldChuZXcgUGFyc2VGdW5jdGlvbkdlbmVyYXRvcigKKyAgICAgIGRlc2NyaXB0b3JfLCBtYXhfaGFzX2JpdF9pbmRleF8sIGhhc19iaXRfaW5kaWNlc18sCisgICAgICBpbmxpbmVkX3N0cmluZ19pbmRpY2VzXywgb3B0aW9uc18sIHNjY19hbmFseXplcl8sIHZhcmlhYmxlc18pKTsKK30KKworTWVzc2FnZUdlbmVyYXRvcjo6fk1lc3NhZ2VHZW5lcmF0b3IoKSA9IGRlZmF1bHQ7CisKK3NpemVfdCBNZXNzYWdlR2VuZXJhdG9yOjpIYXNCaXRzU2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChtYXhfaGFzX2JpdF9pbmRleF8gKyAzMSkgLyAzMjsKK30KKworc2l6ZV90IE1lc3NhZ2VHZW5lcmF0b3I6OklubGluZWRTdHJpbmdEb25hdGVkU2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChtYXhfaW5saW5lZF9zdHJpbmdfaW5kZXhfICsgMzEpIC8gMzI7Cit9CisKK2ludCBNZXNzYWdlR2VuZXJhdG9yOjpIYXNCaXRJbmRleChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHJldHVybiBoYXNfYml0X2luZGljZXNfLmVtcHR5KCkgPyBrTm9IYXNiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGhhc19iaXRfaW5kaWNlc19bZmllbGQtPmluZGV4KCldOworfQorCitpbnQgTWVzc2FnZUdlbmVyYXRvcjo6SGFzQnl0ZUluZGV4KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgaW50IGhhc2JpdCA9IEhhc0JpdEluZGV4KGZpZWxkKTsKKyAgcmV0dXJuIGhhc2JpdCA9PSBrTm9IYXNiaXQgPyBrTm9IYXNiaXQgOiBoYXNiaXQgLyA4OworfQorCitpbnQgTWVzc2FnZUdlbmVyYXRvcjo6SGFzV29yZEluZGV4KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgaW50IGhhc2JpdCA9IEhhc0JpdEluZGV4KGZpZWxkKTsKKyAgcmV0dXJuIGhhc2JpdCA9PSBrTm9IYXNiaXQgPyBrTm9IYXNiaXQgOiBoYXNiaXQgLyAzMjsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpBZGRHZW5lcmF0b3JzKAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxFbnVtR2VuZXJhdG9yPj4qIGVudW1fZ2VuZXJhdG9ycywKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RXh0ZW5zaW9uR2VuZXJhdG9yPj4qIGV4dGVuc2lvbl9nZW5lcmF0b3JzKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX2dlbmVyYXRvcnMtPmVtcGxhY2VfYmFjaygKKyAgICAgICAgbmV3IEVudW1HZW5lcmF0b3IoZGVzY3JpcHRvcl8tPmVudW1fdHlwZShpKSwgdmFyaWFibGVzXywgb3B0aW9uc18pKTsKKyAgICBlbnVtX2dlbmVyYXRvcnNfLnB1c2hfYmFjayhlbnVtX2dlbmVyYXRvcnMtPmJhY2soKS5nZXQoKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzLT5lbXBsYWNlX2JhY2sobmV3IEV4dGVuc2lvbkdlbmVyYXRvcigKKyAgICAgICAgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbihpKSwgb3B0aW9uc18sIHNjY19hbmFseXplcl8pKTsKKyAgICBleHRlbnNpb25fZ2VuZXJhdG9yc18ucHVzaF9iYWNrKGV4dGVuc2lvbl9nZW5lcmF0b3JzLT5iYWNrKCkuZ2V0KCkpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVGaWVsZEFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIC8vIG9wdGltaXplZF9maWVsZHNfIGRvZXMgbm90IGNvbnRhaW4gZmllbGRzIHdoZXJlCisgIC8vICAgIGZpZWxkLT5yZWFsX2NvbnRhaW5pbmdfb25lb2YoKQorICAvLyBzbyB3ZSBuZWVkIHRvIGl0ZXJhdGUgb3ZlciB0aG9zZSBhcyB3ZWxsLgorICAvLworICAvLyBXZSBwbGFjZSB0aGUgbm9uLW9uZW9mIGZpZWxkcyBpbiBvcHRpbWl6ZWRfb3JkZXJfLCBhcyB0aGF0IGNvbnRyb2xzIHRoZQorICAvLyBvcmRlciBvZiB0aGUgX2hhc19iaXRzXyBlbnRyaWVzIGFuZCB3ZSB3YW50IEdEQidzIHByZXR0eSBwcmludGVycyB0byBiZQorICAvLyBhYmxlIHRvIGluZmVyIHRoZXNlIGluZGljZXMgZnJvbSB0aGUga1tGSUVMRE5BTUVdRmllbGROdW1iZXIgb3JkZXIuCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IG9yZGVyZWRfZmllbGRzOworICBvcmRlcmVkX2ZpZWxkcy5yZXNlcnZlKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpKTsKKworICBvcmRlcmVkX2ZpZWxkcy5pbnNlcnQob3JkZXJlZF9maWVsZHMuYmVnaW4oKSwgb3B0aW1pemVkX29yZGVyXy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemVkX29yZGVyXy5lbmQoKSk7CisgIGZvciAoYXV0byBmaWVsZCA6IEZpZWxkUmFuZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgaWYgKCFmaWVsZC0+cmVhbF9jb250YWluaW5nX29uZW9mKCkgJiYgIWZpZWxkLT5vcHRpb25zKCkud2VhaygpICYmCisgICAgICAgICFJc0ZpZWxkU3RyaXBwZWQoZmllbGQsIG9wdGlvbnNfKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIG9yZGVyZWRfZmllbGRzLnB1c2hfYmFjayhmaWVsZCk7CisgIH0KKworICBpZiAoIW9yZGVyZWRfZmllbGRzLmVtcHR5KCkpIHsKKyAgICBmb3JtYXQoImVudW0gOiBpbnQge1xuIik7CisgICAgZm9yIChhdXRvIGZpZWxkIDogb3JkZXJlZF9maWVsZHMpIHsKKyAgICAgIEZvcm1hdHRlcjo6U2F2ZVN0YXRlIHNhdmUoJmZvcm1hdCk7CisKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgICAgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGZpZWxkLCAmdmFycywgb3B0aW9uc18pOworICAgICAgZm9ybWF0LkFkZE1hcCh2YXJzKTsKKyAgICAgIGZvcm1hdCgiICAkezEkJDIkJH0kID0gJG51bWJlciQsXG4iLCBmaWVsZCwgRmllbGRDb25zdGFudE5hbWUoZmllbGQpKTsKKyAgICB9CisgICAgZm9ybWF0KCJ9O1xuIik7CisgIH0KKyAgZm9yIChhdXRvIGZpZWxkIDogb3JkZXJlZF9maWVsZHMpIHsKKyAgICBQcmludEZpZWxkQ29tbWVudChmb3JtYXQsIGZpZWxkKTsKKworICAgIEZvcm1hdHRlcjo6U2F2ZVN0YXRlIHNhdmUoJmZvcm1hdCk7CisKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnM7CisgICAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZmllbGQsICZ2YXJzLCBvcHRpb25zXyk7CisgICAgZm9ybWF0LkFkZE1hcCh2YXJzKTsKKworICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgZm9ybWF0KCIkZGVwcmVjYXRlZF9hdHRyJGludCAkezEkJG5hbWUkX3NpemUkfSQoKSBjb25zdCQyJFxuIiwgZmllbGQsCisgICAgICAgICAgICAgIUlzRmllbGRTdHJpcHBlZChmaWVsZCwgb3B0aW9uc18pID8gIjsiIDogIiB7X19idWlsdGluX3RyYXAoKTt9Iik7CisgICAgICBpZiAoIUlzRmllbGRTdHJpcHBlZChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICJwcml2YXRlOlxuIgorICAgICAgICAgICAgImludCAkezEkX2ludGVybmFsXyRuYW1lJF9zaXplJH0kKCkgY29uc3Q7XG4iCisgICAgICAgICAgICAicHVibGljOlxuIiwKKyAgICAgICAgICAgIGZpZWxkKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKEhhc0hhc01ldGhvZChmaWVsZCkpIHsKKyAgICAgIGZvcm1hdCgiJGRlcHJlY2F0ZWRfYXR0ciRib29sICR7MSRoYXNfJG5hbWUkJH0kKCkgY29uc3QkMiRcbiIsIGZpZWxkLAorICAgICAgICAgICAgICFJc0ZpZWxkU3RyaXBwZWQoZmllbGQsIG9wdGlvbnNfKSA/ICI7IiA6ICIge19fYnVpbHRpbl90cmFwKCk7fSIpOworICAgICAgaWYgKCFJc0ZpZWxkU3RyaXBwZWQoZmllbGQsIG9wdGlvbnNfKSkgeworICAgICAgICBmb3JtYXQoCisgICAgICAgICAgICAicHJpdmF0ZTpcbiIKKyAgICAgICAgICAgICJib29sIF9pbnRlcm5hbF9oYXNfJG5hbWUkKCkgY29uc3Q7XG4iCisgICAgICAgICAgICAicHVibGljOlxuIik7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChIYXNQcml2YXRlSGFzTWV0aG9kKGZpZWxkKSkgeworICAgICAgaWYgKCFJc0ZpZWxkU3RyaXBwZWQoZmllbGQsIG9wdGlvbnNfKSkgeworICAgICAgICBmb3JtYXQoCisgICAgICAgICAgICAicHJpdmF0ZTpcbiIKKyAgICAgICAgICAgICJib29sICR7MSRfaW50ZXJuYWxfaGFzXyRuYW1lJCR9JCgpIGNvbnN0O1xuIgorICAgICAgICAgICAgInB1YmxpYzpcbiIsCisgICAgICAgICAgICBmaWVsZCk7CisgICAgICB9CisgICAgfQorICAgIGZvcm1hdCgiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkICR7MSRjbGVhcl8kbmFtZSQkfSQoKSQyJFxuIiwgZmllbGQsCisgICAgICAgICAgICFJc0ZpZWxkU3RyaXBwZWQoZmllbGQsIG9wdGlvbnNfKSA/ICI7IiA6ICJ7X19idWlsdGluX3RyYXAoKTt9Iik7CisKKyAgICAvLyBHZW5lcmF0ZSB0eXBlLXNwZWNpZmljIGFjY2Vzc29yIGRlY2xhcmF0aW9ucy4KKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMocHJpbnRlcik7CisKKyAgICBmb3JtYXQoIlxuIik7CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIC8vIEdlbmVyYXRlIGFjY2Vzc29ycyBmb3IgZXh0ZW5zaW9ucy4KKyAgICAvLyBXZSB1c2UgIl9wcm90b19UeXBlVHJhaXRzIiBhcyBhIHR5cGUgbmFtZSBiZWxvdyBiZWNhdXNlICJUeXBlVHJhaXRzIgorICAgIC8vIGNhdXNlcyBwcm9ibGVtcyBpZiB0aGUgY2xhc3MgaGFzIGEgbmVzdGVkIG1lc3NhZ2Ugb3IgZW51bSB0eXBlIHdpdGggdGhhdAorICAgIC8vIG5hbWUgYW5kICJfVHlwZVRyYWl0cyIgaXMgdGVjaG5pY2FsbHkgcmVzZXJ2ZWQgZm9yIHRoZSBDKysgbGlicmFyeSBzaW5jZQorICAgIC8vIGl0IHN0YXJ0cyB3aXRoIGFuIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgYSBjYXBpdGFsIGxldHRlci4KKyAgICAvLworICAgIC8vIEZvciBzaW1pbGFyIHJlYXNvbiwgd2UgdXNlICJfZmllbGRfdHlwZSIgYW5kICJfaXNfcGFja2VkIiBhcyBwYXJhbWV0ZXIKKyAgICAvLyBuYW1lcyBiZWxvdywgc28gdGhhdCAiZmllbGRfdHlwZSIgYW5kICJpc19wYWNrZWQiIGNhbiBiZSB1c2VkIGFzIGZpZWxkCisgICAgLy8gbmFtZXMuCisgICAgZm9ybWF0KFIiKAordGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KK2lubGluZSBib29sIEhhc0V4dGVuc2lvbigKKyAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICRjbGFzc25hbWUkLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworJGFubm90YXRlX2V4dGVuc2lvbl9oYXMkCisgIHJldHVybiAkZXh0ZW5zaW9ucyQuSGFzKGlkLm51bWJlcigpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KK2lubGluZSB2b2lkIENsZWFyRXh0ZW5zaW9uKAorICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgJGNsYXNzbmFtZSQsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisgICRleHRlbnNpb25zJC5DbGVhckV4dGVuc2lvbihpZC5udW1iZXIoKSk7CiskYW5ub3RhdGVfZXh0ZW5zaW9uX2NsZWFyJAorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgoraW5saW5lIGludCBFeHRlbnNpb25TaXplKAorICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgJGNsYXNzbmFtZSQsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CiskYW5ub3RhdGVfZXh0ZW5zaW9uX3JlcGVhdGVkX3NpemUkCisgIHJldHVybiAkZXh0ZW5zaW9ucyQuRXh0ZW5zaW9uU2l6ZShpZC5udW1iZXIoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CitpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpDb25zdFR5cGUgR2V0RXh0ZW5zaW9uKAorICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgJGNsYXNzbmFtZSQsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CiskYW5ub3RhdGVfZXh0ZW5zaW9uX2dldCQKKyAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXQoaWQubnVtYmVyKCksICRleHRlbnNpb25zJCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQuZGVmYXVsdF92YWx1ZSgpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KK2lubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oCisgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAkY2xhc3NuYW1lJCwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKyRhbm5vdGF0ZV9leHRlbnNpb25fbXV0YWJsZSQKKyAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYkZXh0ZW5zaW9ucyQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgoraW5saW5lIHZvaWQgU2V0RXh0ZW5zaW9uKAorICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgJGNsYXNzbmFtZSQsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6Q29uc3RUeXBlIHZhbHVlKSB7CisgIF9wcm90b19UeXBlVHJhaXRzOjpTZXQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCB2YWx1ZSwgJiRleHRlbnNpb25zJCk7CiskYW5ub3RhdGVfZXh0ZW5zaW9uX3NldCQKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KK2lubGluZSB2b2lkIFNldEFsbG9jYXRlZEV4dGVuc2lvbigKKyAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICRjbGFzc25hbWUkLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6Ok11dGFibGVUeXBlIHZhbHVlKSB7CisgIF9wcm90b19UeXBlVHJhaXRzOjpTZXRBbGxvY2F0ZWQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJGV4dGVuc2lvbnMkKTsKKyRhbm5vdGF0ZV9leHRlbnNpb25fc2V0JAorfQordGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KK2lubGluZSB2b2lkIFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKAorICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgJGNsYXNzbmFtZSQsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUgdmFsdWUpIHsKKyAgX3Byb3RvX1R5cGVUcmFpdHM6OlVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAmJGV4dGVuc2lvbnMkKTsKKyRhbm5vdGF0ZV9leHRlbnNpb25fc2V0JAorfQordGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KK1BST1RPQlVGX05PRElTQ0FSRCBpbmxpbmUKKyAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6Ok11dGFibGVUeXBlCisgICAgUmVsZWFzZUV4dGVuc2lvbigKKyAgICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgICAgJGNsYXNzbmFtZSQsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CiskYW5ub3RhdGVfZXh0ZW5zaW9uX3JlbGVhc2UkCisgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6UmVsZWFzZShpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJGV4dGVuc2lvbnMkKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CitpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZQorVW5zYWZlQXJlbmFSZWxlYXNlRXh0ZW5zaW9uKAorICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgJGNsYXNzbmFtZSQsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CiskYW5ub3RhdGVfZXh0ZW5zaW9uX3JlbGVhc2UkCisgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6VW5zYWZlQXJlbmFSZWxlYXNlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiRleHRlbnNpb25zJCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CitpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgR2V0RXh0ZW5zaW9uKAorICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgJGNsYXNzbmFtZSQsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgIGludCBpbmRleCkgY29uc3QgeworJGFubm90YXRlX3JlcGVhdGVkX2V4dGVuc2lvbl9nZXQkCisgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6R2V0KGlkLm51bWJlcigpLCAkZXh0ZW5zaW9ucyQsIGluZGV4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KK2lubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oCisgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAkY2xhc3NuYW1lJCwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgaW50IGluZGV4KSB7CiskYW5ub3RhdGVfcmVwZWF0ZWRfZXh0ZW5zaW9uX211dGFibGUkCisgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6TXV0YWJsZShpZC5udW1iZXIoKSwgaW5kZXgsICYkZXh0ZW5zaW9ucyQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgoraW5saW5lIHZvaWQgU2V0RXh0ZW5zaW9uKAorICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgJGNsYXNzbmFtZSQsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgIGludCBpbmRleCwgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgdmFsdWUpIHsKKyAgX3Byb3RvX1R5cGVUcmFpdHM6OlNldChpZC5udW1iZXIoKSwgaW5kZXgsIHZhbHVlLCAmJGV4dGVuc2lvbnMkKTsKKyRhbm5vdGF0ZV9yZXBlYXRlZF9leHRlbnNpb25fc2V0JAorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgoraW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6TXV0YWJsZVR5cGUgQWRkRXh0ZW5zaW9uKAorICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgJGNsYXNzbmFtZSQsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6TXV0YWJsZVR5cGUgdG9fYWRkID0KKyAgICAgIF9wcm90b19UeXBlVHJhaXRzOjpBZGQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCAmJGV4dGVuc2lvbnMkKTsKKyRhbm5vdGF0ZV9yZXBlYXRlZF9leHRlbnNpb25fYWRkX211dGFibGUkCisgIHJldHVybiB0b19hZGQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CitpbmxpbmUgdm9pZCBBZGRFeHRlbnNpb24oCisgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAkY2xhc3NuYW1lJCwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgdmFsdWUpIHsKKyAgX3Byb3RvX1R5cGVUcmFpdHM6OkFkZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICYkZXh0ZW5zaW9ucyQpOworJGFubm90YXRlX3JlcGVhdGVkX2V4dGVuc2lvbl9hZGQkCit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CitpbmxpbmUgY29uc3QgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpSZXBlYXRlZEZpZWxkVHlwZSYKK0dldFJlcGVhdGVkRXh0ZW5zaW9uKAorICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgJGNsYXNzbmFtZSQsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CiskYW5ub3RhdGVfcmVwZWF0ZWRfZXh0ZW5zaW9uX2xpc3QkCisgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6R2V0UmVwZWF0ZWQoaWQubnVtYmVyKCksICRleHRlbnNpb25zJCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CitpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpSZXBlYXRlZEZpZWxkVHlwZSoKK011dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKKyAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICRjbGFzc25hbWUkLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworJGFubm90YXRlX3JlcGVhdGVkX2V4dGVuc2lvbl9saXN0X211dGFibGUkCisgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6TXV0YWJsZVJlcGVhdGVkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lzX3BhY2tlZCwgJiRleHRlbnNpb25zJCk7Cit9CisKKykiKTsKKyAgICAvLyBHZW5lcmF0ZSBNZXNzYWdlU2V0IHNwZWNpZmljIEFQSXMgZm9yIHByb3RvMiBNZXNzYWdlU2V0LgorICAgIC8vIEZvciB0ZXN0aW5nIHB1cnBvc2VzIHdlIGRvbid0IGNoZWNrIGZvciBicmlkZ2UuTWVzc2FnZVNldCwgc28KKyAgICAvLyB3ZSBkb24ndCB1c2UgSXNQcm90bzJNZXNzYWdlU2V0CisgICAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSAmJgorICAgICAgICAhb3B0aW9uc18ub3BlbnNvdXJjZV9ydW50aW1lICYmICFvcHRpb25zXy5saXRlX2ltcGxpY2l0X3dlYWtfZmllbGRzKSB7CisgICAgICAvLyBTcGVjaWFsLWNhc2UgTWVzc2FnZVNldAorICAgICAgZm9ybWF0KCJHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX01FU1NBR0VfU0VUX0FDQ0VTU09SUygkY2xhc3NuYW1lJClcbiIpOworICAgIH0KKyAgfQorCisgIGZvciAoYXV0byBvbmVvZiA6IE9uZU9mUmFuZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgRm9ybWF0dGVyOjpTYXZlU3RhdGUgc2F2ZXIoJmZvcm1hdCk7CisgICAgZm9ybWF0LlNldCgib25lb2ZfbmFtZSIsIG9uZW9mLT5uYW1lKCkpOworICAgIGZvcm1hdC5TZXQoImNhbWVsX29uZW9mX25hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG9uZW9mLT5uYW1lKCksIHRydWUpKTsKKyAgICBmb3JtYXQoCisgICAgICAgICJ2b2lkICR7MSRjbGVhcl8kb25lb2ZfbmFtZSQkfSQoKTtcbiIKKyAgICAgICAgIiRjYW1lbF9vbmVvZl9uYW1lJENhc2UgJG9uZW9mX25hbWUkX2Nhc2UoKSBjb25zdDtcbiIsCisgICAgICAgIG9uZW9mKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlU2luZ3VsYXJGaWVsZEhhc0JpdHMoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgRm9ybWF0dGVyIGZvcm1hdCkgeworICBpZiAoSXNGaWVsZFN0cmlwcGVkKGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJpbmxpbmUgYm9vbCAkY2xhc3NuYW1lJDo6aGFzXyRuYW1lJCgpIGNvbnN0IHsgIgorICAgICAgICAiX19idWlsdGluX3RyYXAoKTsgfVxuIik7CisgICAgcmV0dXJuOworICB9CisgIGlmIChmaWVsZC0+b3B0aW9ucygpLndlYWsoKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgImlubGluZSBib29sICRjbGFzc25hbWUkOjpoYXNfJG5hbWUkKCkgY29uc3Qge1xuIgorICAgICAgICAiJGFubm90YXRlX2hhcyQiCisgICAgICAgICIgIHJldHVybiAkd2Vha19maWVsZF9tYXAkLkhhcygkbnVtYmVyJCk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKEhhc0hhc2JpdChmaWVsZCkpIHsKKyAgICBpbnQgaGFzX2JpdF9pbmRleCA9IEhhc0JpdEluZGV4KGZpZWxkKTsKKyAgICBHT09HTEVfQ0hFQ0tfTkUoaGFzX2JpdF9pbmRleCwga05vSGFzYml0KTsKKworICAgIGZvcm1hdC5TZXQoImhhc19hcnJheV9pbmRleCIsIGhhc19iaXRfaW5kZXggLyAzMik7CisgICAgZm9ybWF0LlNldCgiaGFzX21hc2siLAorICAgICAgICAgICAgICAgc3RyaW5nczo6SGV4KDF1IDw8IChoYXNfYml0X2luZGV4ICUgMzIpLCBzdHJpbmdzOjpaRVJPX1BBRF84KSk7CisgICAgZm9ybWF0KAorICAgICAgICAiaW5saW5lIGJvb2wgJGNsYXNzbmFtZSQ6Ol9pbnRlcm5hbF9oYXNfJG5hbWUkKCkgY29uc3Qge1xuIgorICAgICAgICAiICBib29sIHZhbHVlID0gIgorICAgICAgICAiKCRoYXNfYml0cyRbJGhhc19hcnJheV9pbmRleCRdICYgMHgkaGFzX21hc2skdSkgIT0gMDtcbiIpOworCisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFICYmCisgICAgICAgICFJc0xhenkoZmllbGQsIG9wdGlvbnNfLCBzY2NfYW5hbHl6ZXJfKSkgeworICAgICAgLy8gV2UgbWFpbnRhaW4gdGhlIGludmFyaWFudCB0aGF0IGZvciBhIHN1Ym1lc3NhZ2UgeCwgaGFzX3goKSByZXR1cm5pbmcKKyAgICAgIC8vIHRydWUgaW1wbGllcyB0aGF0IHhfIGlzIG5vdCBudWxsLiBCeSBnaXZpbmcgdGhpcyBpbmZvcm1hdGlvbiB0byB0aGUKKyAgICAgIC8vIGNvbXBpbGVyLCB3ZSBhbGxvdyBpdCB0byBlbGltaW5hdGUgdW5uZWNlc3NhcnkgbnVsbCBjaGVja3MgbGF0ZXIgb24uCisgICAgICBmb3JtYXQoIiAgUFJPVE9CVUZfQVNTVU1FKCF2YWx1ZSB8fCAkZmllbGQkICE9IG51bGxwdHIpO1xuIik7CisgICAgfQorCisgICAgZm9ybWF0KAorICAgICAgICAiICByZXR1cm4gdmFsdWU7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJpbmxpbmUgYm9vbCAkY2xhc3NuYW1lJDo6aGFzXyRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICAgIiRhbm5vdGF0ZV9oYXMkIgorICAgICAgICAiICByZXR1cm4gX2ludGVybmFsX2hhc18kbmFtZSQoKTtcbiIKKyAgICAgICAgIn1cbiIpOworICB9IGVsc2UgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgLy8gTWVzc2FnZSBmaWVsZHMgaGF2ZSBhIGhhc18kbmFtZSQoKSBtZXRob2QuCisgICAgaWYgKElzTGF6eShmaWVsZCwgb3B0aW9uc18sIHNjY19hbmFseXplcl8pKSB7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgImlubGluZSBib29sICRjbGFzc25hbWUkOjpfaW50ZXJuYWxfaGFzXyRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICAgICAiICByZXR1cm4gISRmaWVsZCQuSXNDbGVhcmVkKCk7XG4iCisgICAgICAgICAgIn1cbiIpOworICAgIH0gZWxzZSB7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgImlubGluZSBib29sICRjbGFzc25hbWUkOjpfaW50ZXJuYWxfaGFzXyRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICAgICAiICByZXR1cm4gdGhpcyAhPSBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgIgorICAgICAgICAgICImJiAkZmllbGQkICE9IG51bGxwdHI7XG4iCisgICAgICAgICAgIn1cbiIpOworICAgIH0KKyAgICBmb3JtYXQoCisgICAgICAgICJpbmxpbmUgYm9vbCAkY2xhc3NuYW1lJDo6aGFzXyRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICAgIiRhbm5vdGF0ZV9oYXMkIgorICAgICAgICAiICByZXR1cm4gX2ludGVybmFsX2hhc18kbmFtZSQoKTtcbiIKKyAgICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVPbmVvZkhhc0JpdHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9yIChhdXRvIG9uZW9mIDogT25lT2ZSYW5nZShkZXNjcmlwdG9yXykpIHsKKyAgICBmb3JtYXQuU2V0KCJvbmVvZl9uYW1lIiwgb25lb2YtPm5hbWUoKSk7CisgICAgZm9ybWF0LlNldCgib25lb2ZfaW5kZXgiLCBvbmVvZi0+aW5kZXgoKSk7CisgICAgZm9ybWF0LlNldCgiY2FwX29uZW9mX25hbWUiLCBUb1VwcGVyKG9uZW9mLT5uYW1lKCkpKTsKKyAgICBmb3JtYXQoCisgICAgICAgICJpbmxpbmUgYm9vbCAkY2xhc3NuYW1lJDo6aGFzXyRvbmVvZl9uYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRvbmVvZl9uYW1lJF9jYXNlKCkgIT0gJGNhcF9vbmVvZl9uYW1lJF9OT1RfU0VUO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OmNsZWFyX2hhc18kb25lb2ZfbmFtZSQoKSB7XG4iCisgICAgICAgICIgICRvbmVvZl9jYXNlJFskb25lb2ZfaW5kZXgkXSA9ICRjYXBfb25lb2ZfbmFtZSRfTk9UX1NFVDtcbiIKKyAgICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVPbmVvZk1lbWJlckhhc0JpdHMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybWF0dGVyJiBmb3JtYXQpIHsKKyAgaWYgKElzRmllbGRTdHJpcHBlZChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgaWYgKEhhc0hhc01ldGhvZChmaWVsZCkpIHsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAiaW5saW5lIGJvb2wgJGNsYXNzbmFtZSQ6Omhhc18kbmFtZSQoKSBjb25zdCB7ICIKKyAgICAgICAgICAiX19idWlsdGluX3RyYXAoKTsgfVxuIik7CisgICAgfQorICAgIGZvcm1hdCgKKyAgICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfaGFzXyRuYW1lJCgpIHsgX19idWlsdGluX3RyYXAoKTsgIgorICAgICAgICAifVxuIik7CisgICAgcmV0dXJuOworICB9CisgIC8vIFNpbmd1bGFyIGZpZWxkIGluIGEgb25lb2YKKyAgLy8gTi5CLjogV2l0aG91dCBmaWVsZCBwcmVzZW5jZSwgd2UgZG8gbm90IHVzZSBoYXMtYml0cyBvciBnZW5lcmF0ZQorICAvLyBoYXNfJG5hbWUkKCkgbWV0aG9kcywgYnV0IG9uZW9mcyBzdGlsbCBoYXZlIHNldF9oYXNfJG5hbWUkKCkuCisgIC8vIE9uZW9mcyBhbHNvIGhhdmUgaGFzXyRuYW1lJCgpIGJ1dCBvbmx5IGFzIGEgcHJpdmF0ZSBoZWxwZXIKKyAgLy8gbWV0aG9kLCBzbyB0aGF0IGdlbmVyYXRlZCBjb2RlIGlzIHNsaWdodGx5IGNsZWFuZXIgKHZzLiAgY29tcGFyaW5nCisgIC8vIF9vbmVvZl9jYXNlX1tpbmRleF0gYWdhaW5zdCBhIGNvbnN0YW50IGV2ZXJ5d2hlcmUpLgorICAvLworICAvLyBJZiBoYXNfJG5hbWUkKCkgaXMgcHJpdmF0ZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBhZGQgYW4gaW50ZXJuYWwgYWNjZXNzb3IuCisgIC8vIE9ubHkgYW5ub3RhdGUgcHVibGljIGFjY2Vzc29ycy4KKyAgaWYgKEhhc0hhc01ldGhvZChmaWVsZCkpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJpbmxpbmUgYm9vbCAkY2xhc3NuYW1lJDo6X2ludGVybmFsX2hhc18kbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAgICIgIHJldHVybiAkb25lb2ZfbmFtZSRfY2FzZSgpID09IGskZmllbGRfbmFtZSQ7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJpbmxpbmUgYm9vbCAkY2xhc3NuYW1lJDo6aGFzXyRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICAgIiRhbm5vdGF0ZV9oYXMkIgorICAgICAgICAiICByZXR1cm4gX2ludGVybmFsX2hhc18kbmFtZSQoKTtcbiIKKyAgICAgICAgIn1cbiIpOworICB9IGVsc2UgaWYgKEhhc1ByaXZhdGVIYXNNZXRob2QoZmllbGQpKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiaW5saW5lIGJvb2wgJGNsYXNzbmFtZSQ6Ol9pbnRlcm5hbF9oYXNfJG5hbWUkKCkgY29uc3Qge1xuIgorICAgICAgICAiICByZXR1cm4gJG9uZW9mX25hbWUkX2Nhc2UoKSA9PSBrJGZpZWxkX25hbWUkO1xuIgorICAgICAgICAifVxuIik7CisgIH0KKyAgLy8gc2V0X2hhc18kbmFtZSQoKSBmb3Igb25lb2YgZmllbGRzIGlzIGFsd2F5cyBwcml2YXRlOyBoZW5jZSBzaG91bGQgbm90IGJlCisgIC8vIGFubm90YXRlZC4KKyAgZm9ybWF0KAorICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfaGFzXyRuYW1lJCgpIHtcbiIKKyAgICAgICIgICRvbmVvZl9jYXNlJFskb25lb2ZfaW5kZXgkXSA9IGskZmllbGRfbmFtZSQ7XG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVGaWVsZENsZWFyKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSwgRm9ybWF0dGVyIGZvcm1hdCkgeworICBpZiAoSXNGaWVsZFN0cmlwcGVkKGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoInZvaWQgJGNsYXNzbmFtZSQ6OmNsZWFyXyRuYW1lJCgpIHsgX19idWlsdGluX3RyYXAoKTsgfVxuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2xlYXJfJG5hbWUkKCkuCisgIGlmIChpc19pbmxpbmUpIHsKKyAgICBmb3JtYXQoImlubGluZSAiKTsKKyAgfQorICBmb3JtYXQoInZvaWQgJGNsYXNzbmFtZSQ6OmNsZWFyXyRuYW1lJCgpIHtcbiIpOworCisgIGZvcm1hdC5JbmRlbnQoKTsKKworICBpZiAoZmllbGQtPnJlYWxfY29udGFpbmluZ19vbmVvZigpKSB7CisgICAgLy8gQ2xlYXIgdGhpcyBmaWVsZCBvbmx5IGlmIGl0IGlzIHRoZSBhY3RpdmUgZmllbGQgaW4gdGhpcyBvbmVvZiwKKyAgICAvLyBvdGhlcndpc2UgaWdub3JlCisgICAgZm9ybWF0KCJpZiAoX2ludGVybmFsX2hhc18kbmFtZSQoKSkge1xuIik7CisgICAgZm9ybWF0LkluZGVudCgpOworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVDbGVhcmluZ0NvZGUoZm9ybWF0LnByaW50ZXIoKSk7CisgICAgZm9ybWF0KCJjbGVhcl9oYXNfJG9uZW9mX25hbWUkKCk7XG4iKTsKKyAgICBmb3JtYXQuT3V0ZGVudCgpOworICAgIGZvcm1hdCgifVxuIik7CisgIH0gZWxzZSB7CisgICAgaWYgKFNob3VsZFNwbGl0KGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgIGZvcm1hdCgiaWYgKElzU3BsaXRNZXNzYWdlRGVmYXVsdCgpKSByZXR1cm47XG4iKTsKKyAgICB9CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUNsZWFyaW5nQ29kZShmb3JtYXQucHJpbnRlcigpKTsKKyAgICBpZiAoSGFzSGFzYml0KGZpZWxkKSkgeworICAgICAgaW50IGhhc19iaXRfaW5kZXggPSBIYXNCaXRJbmRleChmaWVsZCk7CisgICAgICBmb3JtYXQuU2V0KCJoYXNfYXJyYXlfaW5kZXgiLCBoYXNfYml0X2luZGV4IC8gMzIpOworICAgICAgZm9ybWF0LlNldCgiaGFzX21hc2siLAorICAgICAgICAgICAgICAgICBzdHJpbmdzOjpIZXgoMXUgPDwgKGhhc19iaXRfaW5kZXggJSAzMiksIHN0cmluZ3M6OlpFUk9fUEFEXzgpKTsKKyAgICAgIGZvcm1hdCgiJGhhc19iaXRzJFskaGFzX2FycmF5X2luZGV4JF0gJj0gfjB4JGhhc19tYXNrJHU7XG4iKTsKKyAgICB9CisgIH0KKyAgZm9ybWF0KCIkYW5ub3RhdGVfY2xlYXIkIik7CisgIGZvcm1hdC5PdXRkZW50KCk7CisgIGZvcm1hdCgifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVGaWVsZEFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCIvLyAkY2xhc3NuYW1lJFxuXG4iKTsKKworICBmb3IgKGF1dG8gZmllbGQgOiBGaWVsZFJhbmdlKGRlc2NyaXB0b3JfKSkgeworICAgIFByaW50RmllbGRDb21tZW50KGZvcm1hdCwgZmllbGQpOworCisgICAgaWYgKElzRmllbGRTdHJpcHBlZChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnM7CisgICAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZmllbGQsICZ2YXJzLCBvcHRpb25zXyk7CisKKyAgICBGb3JtYXR0ZXI6OlNhdmVTdGF0ZSBzYXZlcigmZm9ybWF0KTsKKyAgICBmb3JtYXQuQWRkTWFwKHZhcnMpOworCisgICAgLy8gR2VuZXJhdGUgaGFzXyRuYW1lJCgpIG9yICRuYW1lJF9zaXplKCkuCisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBpZiAoSXNGaWVsZFN0cmlwcGVkKGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgICAgZm9ybWF0KAorICAgICAgICAgICAgImlubGluZSBpbnQgJGNsYXNzbmFtZSQ6OiRuYW1lJF9zaXplKCkgY29uc3QgeyAiCisgICAgICAgICAgICAiX19idWlsdGluX3RyYXAoKTsgfVxuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXQoCisgICAgICAgICAgICAiaW5saW5lIGludCAkY2xhc3NuYW1lJDo6X2ludGVybmFsXyRuYW1lJF9zaXplKCkgY29uc3Qge1xuIgorICAgICAgICAgICAgIiAgcmV0dXJuICRmaWVsZCQkMSQuc2l6ZSgpO1xuIgorICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICJpbmxpbmUgaW50ICRjbGFzc25hbWUkOjokbmFtZSRfc2l6ZSgpIGNvbnN0IHtcbiIKKyAgICAgICAgICAgICIkYW5ub3RhdGVfc2l6ZSQiCisgICAgICAgICAgICAiICByZXR1cm4gX2ludGVybmFsXyRuYW1lJF9zaXplKCk7XG4iCisgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgIElzSW1wbGljaXRXZWFrRmllbGQoZmllbGQsIG9wdGlvbnNfLCBzY2NfYW5hbHl6ZXJfKSAmJgorICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bWVzc2FnZV90eXBlKCkKKyAgICAgICAgICAgICAgICA/ICIud2VhayIKKyAgICAgICAgICAgICAgICA6ICIiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZpZWxkLT5yZWFsX2NvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgZm9ybWF0LlNldCgiZmllbGRfbmFtZSIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSkpOworICAgICAgZm9ybWF0LlNldCgib25lb2ZfbmFtZSIsIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCktPm5hbWUoKSk7CisgICAgICBmb3JtYXQuU2V0KCJvbmVvZl9pbmRleCIsCisgICAgICAgICAgICAgICAgIFN0ckNhdChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpLT5pbmRleCgpKSk7CisgICAgICBHZW5lcmF0ZU9uZW9mTWVtYmVySGFzQml0cyhmaWVsZCwgZm9ybWF0KTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU2luZ3VsYXIgZmllbGQuCisgICAgICBHZW5lcmF0ZVNpbmd1bGFyRmllbGRIYXNCaXRzKGZpZWxkLCBmb3JtYXQpOworICAgIH0KKworICAgIGlmICghSXNDcm9zc0ZpbGVNYXliZU1hcChmaWVsZCkpIHsKKyAgICAgIEdlbmVyYXRlRmllbGRDbGVhcihmaWVsZCwgdHJ1ZSwgZm9ybWF0KTsKKyAgICB9CisKKyAgICAvLyBHZW5lcmF0ZSB0eXBlLXNwZWNpZmljIGFjY2Vzc29ycy4KKyAgICBpZiAoIUlzRmllbGRTdHJpcHBlZChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhwcmludGVyKTsKKyAgICB9CisKKyAgICBmb3JtYXQoIlxuIik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBoYXNfJG5hbWUkKCkgYW5kIGNsZWFyX2hhc18kbmFtZSQoKSBmdW5jdGlvbnMgZm9yIG9uZW9mcy4KKyAgR2VuZXJhdGVPbmVvZkhhc0JpdHMocHJpbnRlcik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVDbGFzc0RlZmluaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0LlNldCgiY2xhc3NfZmluYWwiLAorICAgICAgICAgICAgIFNob3VsZE1hcmtDbGFzc0FzRmluYWwoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSA/ICJmaW5hbCIgOiAiIik7CisKKyAgaWYgKElzTWFwRW50cnlNZXNzYWdlKGRlc2NyaXB0b3JfKSkgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgICBDb2xsZWN0TWFwSW5mbyhvcHRpb25zXywgZGVzY3JpcHRvcl8sICZ2YXJzKTsKKyAgICB2YXJzWyJsaXRlIl0gPQorICAgICAgICBIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykgPyAiIiA6ICJMaXRlIjsKKyAgICBmb3JtYXQuQWRkTWFwKHZhcnMpOworICAgIGZvcm1hdCgKKyAgICAgICAgImNsYXNzICRjbGFzc25hbWUkIDogcHVibGljICIKKyAgICAgICAgIjo6JHByb3RvX25zJDo6aW50ZXJuYWw6Ok1hcEVudHJ5JGxpdGUkPCRjbGFzc25hbWUkLCBcbiIKKyAgICAgICAgIiAgICAka2V5X2NwcCQsICR2YWxfY3BwJCxcbiIKKyAgICAgICAgIiAgICA6OiRwcm90b19ucyQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6JGtleV93aXJlX3R5cGUkLFxuIgorICAgICAgICAiICAgIDo6JHByb3RvX25zJDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjokdmFsX3dpcmVfdHlwZSQ+IHtcbiIKKyAgICAgICAgInB1YmxpYzpcbiIKKyAgICAgICAgIiAgdHlwZWRlZiA6OiRwcm90b19ucyQ6OmludGVybmFsOjpNYXBFbnRyeSRsaXRlJDwkY2xhc3NuYW1lJCwgXG4iCisgICAgICAgICIgICAgJGtleV9jcHAkLCAkdmFsX2NwcCQsXG4iCisgICAgICAgICIgICAgOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OiRrZXlfd2lyZV90eXBlJCxcbiIKKyAgICAgICAgIiAgICA6OiRwcm90b19ucyQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6JHZhbF93aXJlX3R5cGUkPiAiCisgICAgICAgICJTdXBlclR5cGU7XG4iCisgICAgICAgICIgICRjbGFzc25hbWUkKCk7XG4iCisgICAgICAgICIgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiAkY2xhc3NuYW1lJChcbiIKKyAgICAgICAgIiAgICAgIDo6JHByb3RvX25zJDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpO1xuIgorICAgICAgICAiICBleHBsaWNpdCAkY2xhc3NuYW1lJCg6OiRwcm90b19ucyQ6OkFyZW5hKiBhcmVuYSk7XG4iCisgICAgICAgICIgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0ICRjbGFzc25hbWUkJiBvdGhlcik7XG4iCisgICAgICAgICIgIHN0YXRpYyBjb25zdCAkY2xhc3NuYW1lJCogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsgcmV0dXJuICIKKyAgICAgICAgInJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgIgorICAgICAgICAiJGNsYXNzbmFtZSQqPigmXyRjbGFzc25hbWUkX2RlZmF1bHRfaW5zdGFuY2VfKTsgfVxuIik7CisgICAgYXV0byB1dGY4X2NoZWNrID0gR2V0VXRmOENoZWNrTW9kZShkZXNjcmlwdG9yXy0+ZmllbGQoMCksIG9wdGlvbnNfKTsKKyAgICBpZiAoZGVzY3JpcHRvcl8tPmZpZWxkKDApLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAmJgorICAgICAgICB1dGY4X2NoZWNrICE9IFV0ZjhDaGVja01vZGU6OmtOb25lKSB7CisgICAgICBpZiAodXRmOF9jaGVjayA9PSBVdGY4Q2hlY2tNb2RlOjprU3RyaWN0KSB7CisgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICIgIHN0YXRpYyBib29sIFZhbGlkYXRlS2V5KHN0ZDo6c3RyaW5nKiBzKSB7XG4iCisgICAgICAgICAgICAiICAgIHJldHVybiA6OiRwcm90b19ucyQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6IgorICAgICAgICAgICAgIlZlcmlmeVV0ZjhTdHJpbmcocy0+ZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHMtPnNpemUoKSksICIKKyAgICAgICAgICAgICI6OiRwcm90b19ucyQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UEFSU0UsIFwiJDEkXCIpO1xuIgorICAgICAgICAgICAgIiB9XG4iLAorICAgICAgICAgICAgZGVzY3JpcHRvcl8tPmZpZWxkKDApLT5mdWxsX25hbWUoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHT09HTEVfQ0hFQ0sodXRmOF9jaGVjayA9PSBVdGY4Q2hlY2tNb2RlOjprVmVyaWZ5KTsKKyAgICAgICAgZm9ybWF0KAorICAgICAgICAgICAgIiAgc3RhdGljIGJvb2wgVmFsaWRhdGVLZXkoc3RkOjpzdHJpbmcqIHMpIHtcbiIKKyAgICAgICAgICAgICIjaWZuZGVmIE5ERUJVR1xuIgorICAgICAgICAgICAgIiAgICA6OiRwcm90b19ucyQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZyhcbiIKKyAgICAgICAgICAgICIgICAgICAgcy0+ZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHMtPnNpemUoKSksICIKKyAgICAgICAgICAgICI6OiRwcm90b19ucyQ6OmludGVybmFsOjoiCisgICAgICAgICAgICAiV2lyZUZvcm1hdExpdGU6OlBBUlNFLCBcIiQxJFwiKTtcbiIKKyAgICAgICAgICAgICIjZWxzZVxuIgorICAgICAgICAgICAgIiAgICAodm9pZCkgcztcbiIKKyAgICAgICAgICAgICIjZW5kaWZcbiIKKyAgICAgICAgICAgICIgICAgcmV0dXJuIHRydWU7XG4iCisgICAgICAgICAgICAiIH1cbiIsCisgICAgICAgICAgICBkZXNjcmlwdG9yXy0+ZmllbGQoMCktPmZ1bGxfbmFtZSgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9ybWF0KCIgIHN0YXRpYyBib29sIFZhbGlkYXRlS2V5KHZvaWQqKSB7IHJldHVybiB0cnVlOyB9XG4iKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0b3JfLT5maWVsZCgxKS0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgJiYKKyAgICAgICAgdXRmOF9jaGVjayAhPSBVdGY4Q2hlY2tNb2RlOjprTm9uZSkgeworICAgICAgaWYgKHV0ZjhfY2hlY2sgPT0gVXRmOENoZWNrTW9kZTo6a1N0cmljdCkgeworICAgICAgICBmb3JtYXQoCisgICAgICAgICAgICAiICBzdGF0aWMgYm9vbCBWYWxpZGF0ZVZhbHVlKHN0ZDo6c3RyaW5nKiBzKSB7XG4iCisgICAgICAgICAgICAiICAgIHJldHVybiA6OiRwcm90b19ucyQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6IgorICAgICAgICAgICAgIlZlcmlmeVV0ZjhTdHJpbmcocy0+ZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHMtPnNpemUoKSksICIKKyAgICAgICAgICAgICI6OiRwcm90b19ucyQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UEFSU0UsIFwiJDEkXCIpO1xuIgorICAgICAgICAgICAgIiB9XG4iLAorICAgICAgICAgICAgZGVzY3JpcHRvcl8tPmZpZWxkKDEpLT5mdWxsX25hbWUoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHT09HTEVfQ0hFQ0sodXRmOF9jaGVjayA9PSBVdGY4Q2hlY2tNb2RlOjprVmVyaWZ5KTsKKyAgICAgICAgZm9ybWF0KAorICAgICAgICAgICAgIiAgc3RhdGljIGJvb2wgVmFsaWRhdGVWYWx1ZShzdGQ6OnN0cmluZyogcykge1xuIgorICAgICAgICAgICAgIiNpZm5kZWYgTkRFQlVHXG4iCisgICAgICAgICAgICAiICAgIDo6JHByb3RvX25zJDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKFxuIgorICAgICAgICAgICAgIiAgICAgICBzLT5kYXRhKCksIHN0YXRpY19jYXN0PGludD4ocy0+c2l6ZSgpKSwgIgorICAgICAgICAgICAgIjo6JHByb3RvX25zJDo6aW50ZXJuYWw6OiIKKyAgICAgICAgICAgICJXaXJlRm9ybWF0TGl0ZTo6UEFSU0UsIFwiJDEkXCIpO1xuIgorICAgICAgICAgICAgIiNlbHNlXG4iCisgICAgICAgICAgICAiICAgICh2b2lkKSBzO1xuIgorICAgICAgICAgICAgIiNlbmRpZlxuIgorICAgICAgICAgICAgIiAgICByZXR1cm4gdHJ1ZTtcbiIKKyAgICAgICAgICAgICIgfVxuIiwKKyAgICAgICAgICAgIGRlc2NyaXB0b3JfLT5maWVsZCgxKS0+ZnVsbF9uYW1lKCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3JtYXQoIiAgc3RhdGljIGJvb2wgVmFsaWRhdGVWYWx1ZSh2b2lkKikgeyByZXR1cm4gdHJ1ZTsgfVxuIik7CisgICAgfQorICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAiICB1c2luZyA6OiRwcm90b19ucyQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTtcbiIKKyAgICAgICAgICAiIgorICAgICAgICAgICIgIDo6JHByb3RvX25zJDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDtcbiIpOworICAgIH0KKyAgICBmb3JtYXQoCisgICAgICAgICIgIGZyaWVuZCBzdHJ1Y3QgOjokdGFibGVuYW1lJDtcbiIKKyAgICAgICAgIn07XG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBmb3JtYXQoCisgICAgICAiY2xhc3MgJGRsbGV4cG9ydF9kZWNsICQkezEkJGNsYXNzbmFtZSQkfSQkIGNsYXNzX2ZpbmFsJCA6XG4iCisgICAgICAiICAgIHB1YmxpYyAkc3VwZXJjbGFzcyQgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KCIKKyAgICAgICJjbGFzc19kZWZpbml0aW9uOiRmdWxsX25hbWUkKSAqLyB7XG4iLAorICAgICAgZGVzY3JpcHRvcl8pOworICBmb3JtYXQoIiBwdWJsaWM6XG4iKTsKKyAgZm9ybWF0LkluZGVudCgpOworCisgIGlmIChFbmFibGVNZXNzYWdlT3duZWRBcmVuYShkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiaW5saW5lICRjbGFzc25hbWUkKCkgOiAkY2xhc3NuYW1lJCgiCisgICAgICAgICI6OiRwcm90b19ucyQ6OkFyZW5hOjpJbnRlcm5hbENyZWF0ZU1lc3NhZ2VPd25lZEFyZW5hKCksIHRydWUpIHt9XG4iKTsKKyAgfSBlbHNlIGlmIChFbmFibGVNZXNzYWdlT3duZWRBcmVuYVRyaWFsKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJpbmxpbmUgJGNsYXNzbmFtZSQoKSA6ICRjbGFzc25hbWUkKEluTW9hVHJpYWwoKSA/ICIKKyAgICAgICAgIjo6JHByb3RvX25zJDo6QXJlbmE6OkludGVybmFsQ3JlYXRlTWVzc2FnZU93bmVkQXJlbmEoKSA6IG51bGxwdHIsICIKKyAgICAgICAgIkluTW9hVHJpYWwoKSkge31cbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgiaW5saW5lICRjbGFzc25hbWUkKCkgOiAkY2xhc3NuYW1lJChudWxscHRyKSB7fVxuIik7CisgIH0KKyAgaWYgKCFIYXNTaW1wbGVCYXNlQ2xhc3MoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgifiRjbGFzc25hbWUkKCkgb3ZlcnJpZGU7XG4iKTsKKyAgfQorICBmb3JtYXQoCisgICAgICAiZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSICIKKyAgICAgICIkY2xhc3NuYW1lJCg6OiRwcm90b19ucyQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTtcbiIKKyAgICAgICJcbiIKKyAgICAgICIkY2xhc3NuYW1lJChjb25zdCAkY2xhc3NuYW1lJCYgZnJvbSk7XG4iCisgICAgICAiJGNsYXNzbmFtZSQoJGNsYXNzbmFtZSQmJiBmcm9tKSBub2V4Y2VwdFxuIgorICAgICAgIiAgOiAkY2xhc3NuYW1lJCgpIHtcbiIKKyAgICAgICIgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgImlubGluZSAkY2xhc3NuYW1lJCYgb3BlcmF0b3I9KGNvbnN0ICRjbGFzc25hbWUkJiBmcm9tKSB7XG4iCisgICAgICAiICBDb3B5RnJvbShmcm9tKTtcbiIKKyAgICAgICIgIHJldHVybiAqdGhpcztcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lICRjbGFzc25hbWUkJiBvcGVyYXRvcj0oJGNsYXNzbmFtZSQmJiBmcm9tKSBub2V4Y2VwdCB7XG4iCisgICAgICAiICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzO1xuIgorICAgICAgIiAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpXG4iCisgICAgICAiI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRVxuIgorICAgICAgIiAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0clxuIgorICAgICAgIiNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRVxuIgorICAgICAgIiAgKSB7XG4iCisgICAgICAiICAgIEludGVybmFsU3dhcCgmZnJvbSk7XG4iCisgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgIiAgICBDb3B5RnJvbShmcm9tKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHJldHVybiAqdGhpcztcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKKworICBpZiAoUHVibGljVW5rbm93bkZpZWxkc0FjY2Vzc29ycyhkZXNjcmlwdG9yXykpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJpbmxpbmUgY29uc3QgJHVua25vd25fZmllbGRzX3R5cGUkJiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICR1bmtub3duX2ZpZWxkcyQ7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJpbmxpbmUgJHVua25vd25fZmllbGRzX3R5cGUkKiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkge1xuIgorICAgICAgICAiICByZXR1cm4gJG11dGFibGVfdW5rbm93bl9maWVsZHMkO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiXG4iKTsKKyAgfQorCisgIC8vIE9ubHkgZ2VuZXJhdGUgdGhpcyBtZW1iZXIgaWYgaXQncyBub3QgZGlzYWJsZWQuCisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykgJiYKKyAgICAgICFkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgInN0YXRpYyBjb25zdCA6OiRwcm90b19ucyQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7XG4iCisgICAgICAgICIgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQorCisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAvLyBUaGVzZSBzaGFkb3cgbm9uLXN0YXRpYyBtZXRob2RzIG9mIHRoZSBzYW1lIG5hbWVzIGluIE1lc3NhZ2UuICBXZQorICAgIC8vIHJlZGVmaW5lIHRoZW0gaGVyZSBiZWNhdXNlIGNhbGxzIGRpcmVjdGx5IG9uIHRoZSBnZW5lcmF0ZWQgY2xhc3MgY2FuIGJlCisgICAgLy8gc3RhdGljYWxseSBhbmFseXplZCAtLSB3ZSBrbm93IHdoYXQgZGVzY3JpcHRvciB0eXBlcyBhcmUgYmVpbmcgcmVxdWVzdGVkLgorICAgIC8vIEl0IGFsc28gYXZvaWRzIGEgdnRhYmxlIGRpc3BhdGNoLgorICAgIC8vCisgICAgLy8gV2Ugd291bGQgZXZlbnR1YWxseSBsaWtlIHRvIGVsaW1pbmF0ZSB0aGUgbWV0aG9kcyBpbiBNZXNzYWdlLCBhbmQgaGF2aW5nCisgICAgLy8gdGhpcyBzZXBhcmF0ZSBhbHNvIGxldHMgdXMgdHJhY2sgY2FsbHMgdG8gdGhlIGJhc2UgY2xhc3MgbWV0aG9kcworICAgIC8vIHNlcGFyYXRlbHkuCisgICAgZm9ybWF0KAorICAgICAgICAic3RhdGljIGNvbnN0IDo6JHByb3RvX25zJDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJzdGF0aWMgY29uc3QgOjokcHJvdG9fbnMkOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkge1xuIgorICAgICAgICAiICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjtcbiIKKyAgICAgICAgIn1cbiIpOworICB9CisKKyAgZm9ybWF0KAorICAgICAgInN0YXRpYyBjb25zdCAkY2xhc3NuYW1lJCYgZGVmYXVsdF9pbnN0YW5jZSgpIHtcbiIKKyAgICAgICIgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpO1xuIgorICAgICAgIn1cbiIpOworCisgIC8vIEdlbmVyYXRlIGVudW0gdmFsdWVzIGZvciBldmVyeSBmaWVsZCBpbiBvbmVvZnMuIE9uZSBsaXN0IGlzIGdlbmVyYXRlZCBmb3IKKyAgLy8gZWFjaCBvbmVvZiB3aXRoIGFuIGFkZGl0aW9uYWwgKl9OT1RfU0VUIHZhbHVlLgorICBmb3IgKGF1dG8gb25lb2YgOiBPbmVPZlJhbmdlKGRlc2NyaXB0b3JfKSkgeworICAgIGZvcm1hdCgiZW51bSAkMSRDYXNlIHtcbiIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2Uob25lb2YtPm5hbWUoKSwgdHJ1ZSkpOworICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgICBmb3IgKGF1dG8gZmllbGQgOiBGaWVsZFJhbmdlKG9uZW9mKSkgeworICAgICAgZm9ybWF0KCIkMSQgPSAkMiQsXG4iLCBPbmVvZkNhc2VDb25zdGFudE5hbWUoZmllbGQpLCAgLy8gMQorICAgICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMgorICAgIH0KKyAgICBmb3JtYXQoIiQxJF9OT1RfU0VUID0gMCxcbiIsIFRvVXBwZXIob25lb2YtPm5hbWUoKSkpOworICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgZm9ybWF0KAorICAgICAgICAifTtcbiIKKyAgICAgICAgIlxuIik7CisgIH0KKworICAvLyBUT0RPKGdlcmJlbnMpIG1ha2UgdGhpcyBwcml2YXRlLCB3aGlsZSBzdGlsbCBncmFudGluZyBvdGhlciBwcm90b3MgYWNjZXNzLgorICBmb3JtYXQoCisgICAgICAic3RhdGljIGlubGluZSBjb25zdCAkY2xhc3NuYW1lJCogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHtcbiIKKyAgICAgICIgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0ICRjbGFzc25hbWUkKj4oXG4iCisgICAgICAiICAgICAgICAgICAgICZfJGNsYXNzbmFtZSRfZGVmYXVsdF9pbnN0YW5jZV8pO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9XG4iCisgICAgICAiICAkMSQ7XG4iCisgICAgICAiXG4iLAorICAgICAgaW5kZXhfaW5fZmlsZV9tZXNzYWdlc18pOworCisgIGlmIChJc0FueU1lc3NhZ2UoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgIi8vIGltcGxlbWVudHMgQW55IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisgICAgICAgICJcbiIpOworICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAiYm9vbCBQYWNrRnJvbShjb25zdCA6OiRwcm90b19ucyQ6Ok1lc3NhZ2UmIG1lc3NhZ2UpIHtcbiIKKyAgICAgICAgICAiICAkRENISyRfTkUoJm1lc3NhZ2UsIHRoaXMpO1xuIgorICAgICAgICAgICIgIHJldHVybiAkYW55X21ldGFkYXRhJC5QYWNrRnJvbShHZXRBcmVuYSgpLCBtZXNzYWdlKTtcbiIKKyAgICAgICAgICAifVxuIgorICAgICAgICAgICJib29sIFBhY2tGcm9tKGNvbnN0IDo6JHByb3RvX25zJDo6TWVzc2FnZSYgbWVzc2FnZSxcbiIKKyAgICAgICAgICAiICAgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Q29uc3RTdHJpbmdQYXJhbSAiCisgICAgICAgICAgInR5cGVfdXJsX3ByZWZpeCkge1xuIgorICAgICAgICAgICIgICREQ0hLJF9ORSgmbWVzc2FnZSwgdGhpcyk7XG4iCisgICAgICAgICAgIiAgcmV0dXJuICRhbnlfbWV0YWRhdGEkLlBhY2tGcm9tKEdldEFyZW5hKCksIG1lc3NhZ2UsICIKKyAgICAgICAgICAidHlwZV91cmxfcHJlZml4KTtcbiIKKyAgICAgICAgICAifVxuIgorICAgICAgICAgICJib29sIFVucGFja1RvKDo6JHByb3RvX25zJDo6TWVzc2FnZSogbWVzc2FnZSkgY29uc3Qge1xuIgorICAgICAgICAgICIgIHJldHVybiAkYW55X21ldGFkYXRhJC5VbnBhY2tUbyhtZXNzYWdlKTtcbiIKKyAgICAgICAgICAifVxuIgorICAgICAgICAgICJzdGF0aWMgYm9vbCBHZXRBbnlGaWVsZERlc2NyaXB0b3JzKFxuIgorICAgICAgICAgICIgICAgY29uc3QgOjokcHJvdG9fbnMkOjpNZXNzYWdlJiBtZXNzYWdlLFxuIgorICAgICAgICAgICIgICAgY29uc3QgOjokcHJvdG9fbnMkOjpGaWVsZERlc2NyaXB0b3IqKiB0eXBlX3VybF9maWVsZCxcbiIKKyAgICAgICAgICAiICAgIGNvbnN0IDo6JHByb3RvX25zJDo6RmllbGREZXNjcmlwdG9yKiogdmFsdWVfZmllbGQpO1xuIgorICAgICAgICAgICJ0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgY2xhc3MgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwiCisgICAgICAgICAgIiFzdGQ6OmlzX2NvbnZlcnRpYmxlPFQsIGNvbnN0IDo6JHByb3RvX25zJDo6TWVzc2FnZSY+IgorICAgICAgICAgICI6OnZhbHVlPjo6dHlwZT5cbiIKKyAgICAgICAgICAiYm9vbCBQYWNrRnJvbShjb25zdCBUJiBtZXNzYWdlKSB7XG4iCisgICAgICAgICAgIiAgcmV0dXJuICRhbnlfbWV0YWRhdGEkLlBhY2tGcm9tPFQ+KEdldEFyZW5hKCksIG1lc3NhZ2UpO1xuIgorICAgICAgICAgICJ9XG4iCisgICAgICAgICAgInRlbXBsYXRlIDx0eXBlbmFtZSBULCBjbGFzcyA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCIKKyAgICAgICAgICAiIXN0ZDo6aXNfY29udmVydGlibGU8VCwgY29uc3QgOjokcHJvdG9fbnMkOjpNZXNzYWdlJj4iCisgICAgICAgICAgIjo6dmFsdWU+Ojp0eXBlPlxuIgorICAgICAgICAgICJib29sIFBhY2tGcm9tKGNvbnN0IFQmIG1lc3NhZ2UsXG4iCisgICAgICAgICAgIiAgICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkNvbnN0U3RyaW5nUGFyYW0gIgorICAgICAgICAgICJ0eXBlX3VybF9wcmVmaXgpIHtcbiIKKyAgICAgICAgICAiICByZXR1cm4gJGFueV9tZXRhZGF0YSQuUGFja0Zyb208VD4oR2V0QXJlbmEoKSwgbWVzc2FnZSwgIgorICAgICAgICAgICJ0eXBlX3VybF9wcmVmaXgpOyIKKyAgICAgICAgICAifVxuIgorICAgICAgICAgICJ0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgY2xhc3MgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwiCisgICAgICAgICAgIiFzdGQ6OmlzX2NvbnZlcnRpYmxlPFQsIGNvbnN0IDo6JHByb3RvX25zJDo6TWVzc2FnZSY+IgorICAgICAgICAgICI6OnZhbHVlPjo6dHlwZT5cbiIKKyAgICAgICAgICAiYm9vbCBVbnBhY2tUbyhUKiBtZXNzYWdlKSBjb25zdCB7XG4iCisgICAgICAgICAgIiAgcmV0dXJuICRhbnlfbWV0YWRhdGEkLlVucGFja1RvPFQ+KG1lc3NhZ2UpO1xuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9ybWF0KAorICAgICAgICAgICJ0ZW1wbGF0ZSA8dHlwZW5hbWUgVD5cbiIKKyAgICAgICAgICAiYm9vbCBQYWNrRnJvbShjb25zdCBUJiBtZXNzYWdlKSB7XG4iCisgICAgICAgICAgIiAgcmV0dXJuICRhbnlfbWV0YWRhdGEkLlBhY2tGcm9tKEdldEFyZW5hKCksIG1lc3NhZ2UpO1xuIgorICAgICAgICAgICJ9XG4iCisgICAgICAgICAgInRlbXBsYXRlIDx0eXBlbmFtZSBUPlxuIgorICAgICAgICAgICJib29sIFBhY2tGcm9tKGNvbnN0IFQmIG1lc3NhZ2UsXG4iCisgICAgICAgICAgIiAgICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkNvbnN0U3RyaW5nUGFyYW0gIgorICAgICAgICAgICJ0eXBlX3VybF9wcmVmaXgpIHtcbiIKKyAgICAgICAgICAiICByZXR1cm4gJGFueV9tZXRhZGF0YSQuUGFja0Zyb20oR2V0QXJlbmEoKSwgbWVzc2FnZSwgIgorICAgICAgICAgICJ0eXBlX3VybF9wcmVmaXgpO1xuIgorICAgICAgICAgICJ9XG4iCisgICAgICAgICAgInRlbXBsYXRlIDx0eXBlbmFtZSBUPlxuIgorICAgICAgICAgICJib29sIFVucGFja1RvKFQqIG1lc3NhZ2UpIGNvbnN0IHtcbiIKKyAgICAgICAgICAiICByZXR1cm4gJGFueV9tZXRhZGF0YSQuVW5wYWNrVG8obWVzc2FnZSk7XG4iCisgICAgICAgICAgIn1cbiIpOworICAgIH0KKyAgICBmb3JtYXQoCisgICAgICAgICJ0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIElzKCkgY29uc3Qge1xuIgorICAgICAgICAiICByZXR1cm4gJGFueV9tZXRhZGF0YSQuSXM8VD4oKTtcbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgInN0YXRpYyBib29sIFBhcnNlQW55VHlwZVVybCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Q29uc3RTdHJpbmdQYXJhbSAiCisgICAgICAgICJ0eXBlX3VybCxcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZnVsbF90eXBlX25hbWUpO1xuIik7CisgIH0KKworICBmb3JtYXQoCisgICAgICAiZnJpZW5kIHZvaWQgc3dhcCgkY2xhc3NuYW1lJCYgYSwgJGNsYXNzbmFtZSQmIGIpIHtcbiIKKyAgICAgICIgIGEuU3dhcCgmYik7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSB2b2lkIFN3YXAoJGNsYXNzbmFtZSQqIG90aGVyKSB7XG4iCisgICAgICAiICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuO1xuIgorICAgICAgIiNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVBcbiIKKyAgICAgICIgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiZcbiIKKyAgICAgICIgICAgICBHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7XG4gIgorICAgICAgIiNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVBcbiIKKyAgICAgICIgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7XG4iCisgICAgICAiI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQXG4iCisgICAgICAiICAgIEludGVybmFsU3dhcChvdGhlcik7XG4iCisgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgIiAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdlbmVyaWNTd2FwKHRoaXMsIG90aGVyKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iCisgICAgICAidm9pZCBVbnNhZmVBcmVuYVN3YXAoJGNsYXNzbmFtZSQqIG90aGVyKSB7XG4iCisgICAgICAiICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuO1xuIgorICAgICAgIiAgJERDSEskKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpO1xuIgorICAgICAgIiAgSW50ZXJuYWxTd2FwKG90aGVyKTtcbiIKKyAgICAgICJ9XG4iKTsKKworICBmb3JtYXQoCisgICAgICAiXG4iCisgICAgICAiLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyAgICAgICJcbiIKKyAgICAgICIkY2xhc3NuYW1lJCogTmV3KDo6JHByb3RvX25zJDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwge1xuIgorICAgICAgIiAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTwkY2xhc3NuYW1lJD4oYXJlbmEpO1xuIgorICAgICAgIn1cbiIpOworCisgIC8vIEZvciBpbnN0YW5jZXMgdGhhdCBkZXJpdmUgZnJvbSBNZXNzYWdlIChyYXRoZXIgdGhhbiBNZXNzYWdlTGl0ZSksIHNvbWUKKyAgLy8gbWV0aG9kcyBhcmUgdmlydHVhbCBhbmQgc2hvdWxkIGJlIG1hcmtlZCBhcyBmaW5hbC4KKyAgZm9ybWF0LlNldCgiZnVsbF9maW5hbCIsIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gImZpbmFsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiIpOworCisgIGlmIChIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAgIGlmICghSGFzU2ltcGxlQmFzZUNsYXNzKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHsKKyAgICAgICAgZm9ybWF0KAorICAgICAgICAgICAgLy8gVXNlIE1lc3NhZ2UncyBidWlsdC1pbiBNZXJnZUZyb20gYW5kIENvcHlGcm9tIHdoZW4gdGhlIHBhc3NlZC1pbgorICAgICAgICAgICAgLy8gYXJndW1lbnQgaXMgYSBnZW5lcmljIE1lc3NhZ2UgaW5zdGFuY2UsIGFuZCBvbmx5IGRlZmluZSB0aGUKKyAgICAgICAgICAgIC8vIGN1c3RvbSBNZXJnZUZyb20gYW5kIENvcHlGcm9tIGluc3RhbmNlcyB3aGVuIHRoZSBzb3VyY2Ugb2YgdGhlCisgICAgICAgICAgICAvLyBtZXJnZS9jb3B5IGlzIGtub3duIHRvIGJlIHRoZSBzYW1lIGNsYXNzIGFzIHRoZSBkZXN0aW5hdGlvbi4KKyAgICAgICAgICAgICJ1c2luZyAkc3VwZXJjbGFzcyQ6OkNvcHlGcm9tO1xuIgorICAgICAgICAgICAgInZvaWQgQ29weUZyb20oY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pO1xuIgorICAgICAgICAgICAgIiIKKyAgICAgICAgICAgICJ1c2luZyAkc3VwZXJjbGFzcyQ6Ok1lcmdlRnJvbTtcbiIKKyAgICAgICAgICAgICJ2b2lkIE1lcmdlRnJvbSgiCisgICAgICAgICAgICAiIGNvbnN0ICRjbGFzc25hbWUkJiBmcm9tKSB7XG4iCisgICAgICAgICAgICAiICAkY2xhc3NuYW1lJDo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTtcbiIKKyAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAicHJpdmF0ZTpcbiIKKyAgICAgICAgICAgICJzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjokcHJvdG9fbnMkOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0ICIKKyAgICAgICAgICAgICI6OiRwcm90b19ucyQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTtcbiIKKyAgICAgICAgICAgICJwdWJsaWM6XG4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICJ1c2luZyAkc3VwZXJjbGFzcyQ6OkNvcHlGcm9tO1xuIgorICAgICAgICAgICAgImlubGluZSB2b2lkIENvcHlGcm9tKGNvbnN0ICRjbGFzc25hbWUkJiBmcm9tKSB7XG4iCisgICAgICAgICAgICAiICAkc3VwZXJjbGFzcyQ6OkNvcHlJbXBsKCp0aGlzLCBmcm9tKTtcbiIKKyAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAiIgorICAgICAgICAgICAgInVzaW5nICRzdXBlcmNsYXNzJDo6TWVyZ2VGcm9tO1xuIgorICAgICAgICAgICAgInZvaWQgTWVyZ2VGcm9tKGNvbnN0ICRjbGFzc25hbWUkJiBmcm9tKSB7XG4iCisgICAgICAgICAgICAiICAkc3VwZXJjbGFzcyQ6Ok1lcmdlSW1wbCgqdGhpcywgZnJvbSk7XG4iCisgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgInB1YmxpYzpcbiIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgInZvaWQgQ2hlY2tUeXBlQW5kTWVyZ2VGcm9tKGNvbnN0IDo6JHByb3RvX25zJDo6TWVzc2FnZUxpdGUmIGZyb20pIgorICAgICAgICAgICIgIGZpbmFsO1xuIgorICAgICAgICAgICJ2b2lkIENvcHlGcm9tKGNvbnN0ICRjbGFzc25hbWUkJiBmcm9tKTtcbiIKKyAgICAgICAgICAidm9pZCBNZXJnZUZyb20oY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pO1xuIik7CisgICAgfQorCisgICAgaWYgKCFIYXNTaW1wbGVCYXNlQ2xhc3MoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgICAgZm9ybWF0KAorICAgICAgICAgICJQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7XG4iCisgICAgICAgICAgImJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsO1xuIgorICAgICAgICAgICJcbiIKKyAgICAgICAgICAic2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsO1xuIik7CisKKyAgICAgIHBhcnNlX2Z1bmN0aW9uX2dlbmVyYXRvcl8tPkdlbmVyYXRlTWV0aG9kRGVjbHMocHJpbnRlcik7CisKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAiJHVpbnQ4JCogX0ludGVybmFsU2VyaWFsaXplKFxuIgorICAgICAgICAgICIgICAgJHVpbnQ4JCogdGFyZ2V0LCA6OiRwcm90b19ucyQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pICIKKyAgICAgICAgICAiY29uc3QgZmluYWw7XG4iKTsKKyAgICB9CisgIH0KKworICBpZiAob3B0aW9uc18uZmllbGRfbGlzdGVuZXJfb3B0aW9ucy5pbmplY3RfZmllbGRfbGlzdGVuZXJfZXZlbnRzKSB7CisgICAgZm9ybWF0KCJzdGF0aWMgY29uc3RleHByIGludCBfa0ludGVybmFsRmllbGROdW1iZXIgPSAkMSQ7XG4iLAorICAgICAgICAgICBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSk7CisgIH0KKworICBpZiAoIUhhc1NpbXBsZUJhc2VDbGFzcyhkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiAiCisgICAgICAgICIkY2FjaGVkX3NpemUkLkdldCgpOyB9IgorICAgICAgICAiXG5cbnByaXZhdGU6XG4iCisgICAgICAgICJ2b2lkIFNoYXJlZEN0b3IoOjokcHJvdG9fbnMkOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7XG4iCisgICAgICAgICJ2b2lkIFNoYXJlZER0b3IoKTtcbiIKKyAgICAgICAgInZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QkIGZ1bGxfZmluYWwkO1xuIgorICAgICAgICAidm9pZCBJbnRlcm5hbFN3YXAoJGNsYXNzbmFtZSQqIG90aGVyKTtcbiIpOworICB9CisKKyAgZm9ybWF0KAorICAgICAgLy8gRnJpZW5kIEFueU1ldGFkYXRhIHNvIHRoYXQgaXQgY2FuIGNhbGwgdGhpcyBGdWxsTWVzc2FnZU5hbWUoKSBtZXRob2QuCisgICAgICAiXG5wcml2YXRlOlxuIgorICAgICAgImZyaWVuZCBjbGFzcyA6OiRwcm90b19ucyQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTtcbiIKKyAgICAgICJzdGF0aWMgJDEkIEZ1bGxNZXNzYWdlTmFtZSgpIHtcbiIKKyAgICAgICIgIHJldHVybiBcIiRmdWxsX25hbWUkXCI7XG4iCisgICAgICAifVxuIiwKKyAgICAgIG9wdGlvbnNfLm9wZW5zb3VyY2VfcnVudGltZSA/ICI6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiOjpTdHJpbmdQaWVjZSIpOworCisgIGZvcm1hdCgKKyAgICAgIC8vIFRPRE8oZ2VyYmVucykgTWFrZSB0aGlzIHByaXZhdGUhIEN1cnJlbnRseSBwZW9wbGUgYXJlIGRlcml2aW5nIGZyb20KKyAgICAgIC8vIHByb3RvcyB0byBnaXZlIGFjY2VzcyB0byB0aGlzIGNvbnN0cnVjdG9yLCBicmVha2luZyB0aGUgaW52YXJpYW50cworICAgICAgLy8gd2UgcmVseSBvbi4KKyAgICAgICJwcm90ZWN0ZWQ6XG4iCisgICAgICAiZXhwbGljaXQgJGNsYXNzbmFtZSQoOjokcHJvdG9fbnMkOjpBcmVuYSogYXJlbmEsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpO1xuIik7CisKKyAgc3dpdGNoIChOZWVkc0FyZW5hRGVzdHJ1Y3RvcigpKSB7CisgICAgY2FzZSBBcmVuYUR0b3JOZWVkczo6a09uRGVtYW5kOgorICAgICAgZm9ybWF0KAorICAgICAgICAgICJwcml2YXRlOlxuIgorICAgICAgICAgICJzdGF0aWMgdm9pZCBBcmVuYUR0b3Iodm9pZCogb2JqZWN0KTtcbiIKKyAgICAgICAgICAiaW5saW5lIHZvaWQgT25EZW1hbmRSZWdpc3RlckFyZW5hRHRvcig6OiRwcm90b19ucyQ6OkFyZW5hKiBhcmVuYSkgIgorICAgICAgICAgICJvdmVycmlkZSB7XG4iCisgICAgICAgICAgIiAgaWYgKGFyZW5hID09IG51bGxwdHIgfHwgKCRpbmxpbmVkX3N0cmluZ19kb25hdGVkX2FycmF5JFswXSAmICIKKyAgICAgICAgICAiMHgxdSkgIgorICAgICAgICAgICI9PSAiCisgICAgICAgICAgIjApIHtcbiIKKyAgICAgICAgICAiICAgcmV0dXJuO1xuIgorICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAiICAkaW5saW5lZF9zdHJpbmdfZG9uYXRlZF9hcnJheSRbMF0gJj0gMHhGRkZGRkZGRXU7XG4iCisgICAgICAgICAgIiAgYXJlbmEtPk93bkN1c3RvbURlc3RydWN0b3IodGhpcywgJiRjbGFzc25hbWUkOjpBcmVuYUR0b3IpO1xuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQXJlbmFEdG9yTmVlZHM6OmtSZXF1aXJlZDoKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAicHJpdmF0ZTpcbiIKKyAgICAgICAgICAic3RhdGljIHZvaWQgQXJlbmFEdG9yKHZvaWQqIG9iamVjdCk7XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQXJlbmFEdG9yTmVlZHM6OmtOb25lOgorICAgICAgYnJlYWs7CisgIH0KKworICBmb3JtYXQoCisgICAgICAicHVibGljOlxuIgorICAgICAgIlxuIik7CisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIGlmIChIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgICAgZm9ybWF0KAorICAgICAgICAgICJzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXztcbiIKKyAgICAgICAgICAiY29uc3QgOjokcHJvdG9fbnMkOjpNZXNzYWdlOjpDbGFzc0RhdGEqIgorICAgICAgICAgICJHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDtcbiIKKyAgICAgICAgICAiXG4iKTsKKyAgICB9CisgICAgZm9ybWF0KAorICAgICAgICAiOjokcHJvdG9fbnMkOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsO1xuIgorICAgICAgICAiXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJzdGQ6OnN0cmluZyBHZXRUeXBlTmFtZSgpIGNvbnN0IGZpbmFsO1xuIgorICAgICAgICAiXG4iKTsKKyAgfQorCisgIGlmIChTaG91bGRTcGxpdChkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KAorICAgICAgICAicHJpdmF0ZTpcbiIKKyAgICAgICAgImlubGluZSBib29sIElzU3BsaXRNZXNzYWdlRGVmYXVsdCgpIGNvbnN0IHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRzcGxpdCQgPT0gcmVpbnRlcnByZXRfY2FzdDxJbXBsXzo6U3BsaXQqPigmJDEkKTtcbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgIlBST1RPQlVGX05PSU5MSU5FIHZvaWQgUHJlcGFyZVNwbGl0TWVzc2FnZUZvcldyaXRlKCk7XG4iCisgICAgICAgICJwdWJsaWM6XG4iLAorICAgICAgICBEZWZhdWx0SW5zdGFuY2VOYW1lKGRlc2NyaXB0b3JfLCBvcHRpb25zXywgLypzcGxpdD0qL3RydWUpKTsKKyAgfQorCisgIGZvcm1hdCgKKyAgICAgICIvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorICAgICAgIlxuIik7CisKKyAgLy8gSW1wb3J0IGFsbCBuZXN0ZWQgbWVzc2FnZSBjbGFzc2VzIGludG8gdGhpcyBjbGFzcydzIHNjb3BlIHdpdGggdHlwZWRlZnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IERlc2NyaXB0b3IqIG5lc3RlZF90eXBlID0gZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpOworICAgIGlmICghSXNNYXBFbnRyeU1lc3NhZ2UobmVzdGVkX3R5cGUpKSB7CisgICAgICBmb3JtYXQuU2V0KCJuZXN0ZWRfZnVsbF9uYW1lIiwgQ2xhc3NOYW1lKG5lc3RlZF90eXBlLCBmYWxzZSkpOworICAgICAgZm9ybWF0LlNldCgibmVzdGVkX25hbWUiLCBSZXNvbHZlS2V5d29yZChuZXN0ZWRfdHlwZS0+bmFtZSgpKSk7CisgICAgICBmb3JtYXQoInR5cGVkZWYgJHsxJCRuZXN0ZWRfZnVsbF9uYW1lJCR9JCAkezEkJG5lc3RlZF9uYW1lJCR9JDtcbiIsCisgICAgICAgICAgICAgbmVzdGVkX3R5cGUpOworICAgIH0KKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKSA+IDApIHsKKyAgICBmb3JtYXQoIlxuIik7CisgIH0KKworICAvLyBJbXBvcnQgYWxsIG5lc3RlZCBlbnVtcyBhbmQgdGhlaXIgdmFsdWVzIGludG8gdGhpcyBjbGFzcydzIHNjb3BlIHdpdGgKKyAgLy8gdHlwZWRlZnMgYW5kIGNvbnN0YW50cy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGVudW1fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlU3ltYm9sSW1wb3J0cyhwcmludGVyKTsKKyAgICBmb3JtYXQoIlxuIik7CisgIH0KKworICBmb3JtYXQoCisgICAgICAiLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyAgICAgICJcbiIpOworCisgIC8vIEdlbmVyYXRlIGFjY2Vzc29yIG1ldGhvZHMgZm9yIGFsbCBmaWVsZHMuCisgIEdlbmVyYXRlRmllbGRBY2Nlc3NvckRlY2xhcmF0aW9ucyhwcmludGVyKTsKKworICAvLyBEZWNsYXJlIGV4dGVuc2lvbiBpZGVudGlmaWVycy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWNsYXJhdGlvbihwcmludGVyKTsKKyAgfQorCisKKyAgZm9ybWF0KCIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6JGZ1bGxfbmFtZSQpXG4iKTsKKworICAvLyBHZW5lcmF0ZSBwcml2YXRlIG1lbWJlcnMuCisgIGZvcm1hdC5PdXRkZW50KCk7CisgIGZvcm1hdCgiIHByaXZhdGU6XG4iKTsKKyAgZm9ybWF0LkluZGVudCgpOworICAvLyBUT0RPKHNlb25na2ltKTogUmVtb3ZlIGhhY2sgdG8gdHJhY2sgZmllbGQgYWNjZXNzIGFuZCByZW1vdmUgdGhpcyBjbGFzcy4KKyAgZm9ybWF0KCJjbGFzcyBfSW50ZXJuYWw7XG4iKTsKKworICBmb3IgKGF1dG8gZmllbGQgOiBGaWVsZFJhbmdlKGRlc2NyaXB0b3JfKSkgeworICAgIC8vIHNldF9oYXNfKioqKCkgZ2VuZXJhdGVkIGluIGFsbCBvbmVvZnMuCisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiAhZmllbGQtPm9wdGlvbnMoKS53ZWFrKCkgJiYKKyAgICAgICAgZmllbGQtPnJlYWxfY29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICBmb3JtYXQoInZvaWQgc2V0X2hhc18kMSQoKTtcbiIsIEZpZWxkTmFtZShmaWVsZCkpOworICAgIH0KKyAgfQorICBmb3JtYXQoIlxuIik7CisKKyAgLy8gR2VuZXJhdGUgb25lb2YgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisgIGZvciAoYXV0byBvbmVvZiA6IE9uZU9mUmFuZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiaW5saW5lIGJvb2wgaGFzXyQxJCgpIGNvbnN0O1xuIgorICAgICAgICAiaW5saW5lIHZvaWQgY2xlYXJfaGFzXyQxJCgpO1xuXG4iLAorICAgICAgICBvbmVvZi0+bmFtZSgpKTsKKyAgfQorCisgIGlmIChIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSAmJgorICAgICAgIWRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSAmJgorICAgICAgbnVtX3JlcXVpcmVkX2ZpZWxkc18gPiAxKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiLy8gaGVscGVyIGZvciBCeXRlU2l6ZUxvbmcoKVxuIgorICAgICAgICAic2l6ZV90IFJlcXVpcmVkRmllbGRzQnl0ZVNpemVGYWxsYmFjaygpIGNvbnN0O1xuXG4iKTsKKyAgfQorCisgIGlmIChIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIHBhcnNlX2Z1bmN0aW9uX2dlbmVyYXRvcl8tPkdlbmVyYXRlRGF0YURlY2xzKHByaW50ZXIpOworICB9CisKKyAgLy8gUHJlcGFyZSBkZWNscyBmb3IgX2NhY2hlZF9zaXplXyBhbmQgX2hhc19iaXRzXy4gIFRoZWlyIHBvc2l0aW9uIGluIHRoZQorICAvLyBvdXRwdXQgd2lsbCBiZSBkZXRlcm1pbmVkIGxhdGVyLgorCisgIGJvb2wgbmVlZF90b19lbWl0X2NhY2hlZF9zaXplID0gIUhhc1NpbXBsZUJhc2VDbGFzcyhkZXNjcmlwdG9yXywgb3B0aW9uc18pOworICBjb25zdCBzdGQ6OnN0cmluZyBjYWNoZWRfc2l6ZV9kZWNsID0KKyAgICAgICJtdXRhYmxlIDo6JHByb3RvX25zJDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXztcbiI7CisKKyAgY29uc3Qgc2l6ZV90IHNpemVvZl9oYXNfYml0cyA9IEhhc0JpdHNTaXplKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGhhc19iaXRzX2RlY2wgPQorICAgICAgc2l6ZW9mX2hhc19iaXRzID09IDAgPyAiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJDYXQoIjo6JHByb3RvX25zJDo6aW50ZXJuYWw6Okhhc0JpdHM8IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZl9oYXNfYml0cywgIj4gX2hhc19iaXRzXztcbiIpOworCisgIGZvcm1hdCgKKyAgICAgICJ0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzICIKKyAgICAgICI6OiRwcm90b19ucyQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjtcbiIKKyAgICAgICJ0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfO1xuIgorICAgICAgInR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXztcbiIpOworCisgIC8vIFRvIG1pbmltaXplIHBhZGRpbmcsIGRhdGEgbWVtYmVycyBhcmUgZGl2aWRlZCBpbnRvIHRocmVlIHNlY3Rpb25zOgorICAvLyAoMSkgbWVtYmVycyBhc3N1bWVkIHRvIGFsaWduIHRvIDggYnl0ZXMKKyAgLy8gKDIpIG1lbWJlcnMgY29ycmVzcG9uZGluZyB0byBtZXNzYWdlIGZpZWxkcywgcmUtb3JkZXJlZCB0byBvcHRpbWl6ZQorICAvLyAgICAgYWxpZ25tZW50LgorICAvLyAoMykgbWVtYmVycyBhc3N1bWVkIHRvIGFsaWduIHRvIDQgYnl0ZXMuCisKKyAgZm9ybWF0KCJzdHJ1Y3QgSW1wbF8ge1xuIik7CisgIGZvcm1hdC5JbmRlbnQoKTsKKworICAvLyBNZW1iZXJzIGFzc3VtZWQgdG8gYWxpZ24gdG8gOCBieXRlczoKKworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIGZvcm1hdCgKKyAgICAgICAgIjo6JHByb3RvX25zJDo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187XG4iCisgICAgICAgICJcbiIpOworICB9CisKKyAgaWYgKEhhc1RyYWNrZXIoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgic3RhdGljIDo6JHByb3RvX25zJDo6QWNjZXNzTGlzdGVuZXI8JDEkPiBfdHJhY2tlcl87XG4iLAorICAgICAgICAgICBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXyBmb3IgaW5saW5lZCBzdHJpbmcgdHlwZS4KKyAgLy8gVE9ETyhjb25nbGl1KTogVG8gYXZvaWQgYWZmZWN0aW5nIHRoZSBsb2NhbGl0eSBvZiBgX2hhc19iaXRzX2AsIHNob3VsZCB0aGlzCisgIC8vIGJlIGJlbG93IG9yIGFib3ZlIGBfaGFzX2JpdHNfYD8KKyAgaWYgKCFpbmxpbmVkX3N0cmluZ19pbmRpY2VzXy5lbXB0eSgpKSB7CisgICAgZm9ybWF0KCI6OiRwcm90b19ucyQ6OmludGVybmFsOjpIYXNCaXRzPCQxJD4gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfO1xuIiwKKyAgICAgICAgICAgSW5saW5lZFN0cmluZ0RvbmF0ZWRTaXplKCkpOworICB9CisKKyAgaWYgKCFoYXNfYml0X2luZGljZXNfLmVtcHR5KCkpIHsKKyAgICAvLyBfaGFzX2JpdHNfIGlzIGZyZXF1ZW50bHkgYWNjZXNzZWQsIHNvIHRvIHJlZHVjZSBjb2RlIHNpemUgYW5kIGltcHJvdmUKKyAgICAvLyBzcGVlZCwgaXQgc2hvdWxkIGJlIGNsb3NlIHRvIHRoZSBzdGFydCBvZiB0aGUgb2JqZWN0LiBQbGFjaW5nCisgICAgLy8gX2NhY2hlZF9zaXplXyB0b2dldGhlciB3aXRoIF9oYXNfYml0c18gaW1wcm92ZXMgY2FjaGUgbG9jYWxpdHkgZGVzcGl0ZQorICAgIC8vIHBvdGVudGlhbCBhbGlnbm1lbnQgcGFkZGluZy4KKyAgICBmb3JtYXQoaGFzX2JpdHNfZGVjbC5jX3N0cigpKTsKKyAgICBpZiAobmVlZF90b19lbWl0X2NhY2hlZF9zaXplKSB7CisgICAgICBmb3JtYXQoY2FjaGVkX3NpemVfZGVjbC5jX3N0cigpKTsKKyAgICAgIG5lZWRfdG9fZW1pdF9jYWNoZWRfc2l6ZSA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vIEZpZWxkIG1lbWJlcnM6CisKKyAgLy8gRW1pdCBzb21lIHByaXZhdGUgYW5kIHN0YXRpYyBtZW1iZXJzCisgIGZvciAoYXV0byBmaWVsZCA6IG9wdGltaXplZF9vcmRlcl8pIHsKKyAgICBjb25zdCBGaWVsZEdlbmVyYXRvciYgZ2VuZXJhdG9yID0gZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKTsKKyAgICBnZW5lcmF0b3IuR2VuZXJhdGVTdGF0aWNNZW1iZXJzKHByaW50ZXIpOworICAgIGlmICghU2hvdWxkU3BsaXQoZmllbGQsIG9wdGlvbnNfKSkgeworICAgICAgZ2VuZXJhdG9yLkdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMocHJpbnRlcik7CisgICAgfQorICB9CisgIGlmIChTaG91bGRTcGxpdChkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KCJzdHJ1Y3QgU3BsaXQge1xuIik7CisgICAgZm9ybWF0LkluZGVudCgpOworICAgIGZvciAoYXV0byBmaWVsZCA6IG9wdGltaXplZF9vcmRlcl8pIHsKKyAgICAgIGlmICghU2hvdWxkU3BsaXQoZmllbGQsIG9wdGlvbnNfKSkgY29udGludWU7CisgICAgICBjb25zdCBGaWVsZEdlbmVyYXRvciYgZ2VuZXJhdG9yID0gZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKTsKKyAgICAgIGdlbmVyYXRvci5HZW5lcmF0ZVByaXZhdGVNZW1iZXJzKHByaW50ZXIpOworICAgIH0KKyAgICBmb3JtYXQuT3V0ZGVudCgpOworICAgIGZvcm1hdCgKKyAgICAgICAgIiAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXztcbiIKKyAgICAgICAgIiAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfO1xuIgorICAgICAgICAifTtcbiIKKyAgICAgICAgIlNwbGl0KiBfc3BsaXRfO1xuIik7CisgIH0KKworICAvLyBGb3IgZWFjaCBvbmVvZiBnZW5lcmF0ZSBhIHVuaW9uCisgIGZvciAoYXV0byBvbmVvZiA6IE9uZU9mUmFuZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgc3RkOjpzdHJpbmcgY2FtZWxfb25lb2ZfbmFtZSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2Uob25lb2YtPm5hbWUoKSwgdHJ1ZSk7CisgICAgZm9ybWF0KCJ1bmlvbiAkMSRVbmlvbiB7XG4iLCBjYW1lbF9vbmVvZl9uYW1lKTsKKyAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgZm9ybWF0KAorICAgICAgICAvLyBleHBsaWNpdCBlbXB0eSBjb25zdHJ1Y3RvciBpcyBuZWVkZWQgd2hlbiB1bmlvbiBjb250YWlucworICAgICAgICAvLyBBcmVuYVN0cmluZ1B0ciBtZW1iZXJzIGZvciBzdHJpbmcgZmllbGRzLgorICAgICAgICAiY29uc3RleHByICQxJFVuaW9uKCkgOiBfY29uc3Rpbml0X3t9IHt9XG4iCisgICAgICAgICIgIDo6JHByb3RvX25zJDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQgX2NvbnN0aW5pdF87XG4iLAorICAgICAgICBjYW1lbF9vbmVvZl9uYW1lKTsKKyAgICBmb3IgKGF1dG8gZmllbGQgOiBGaWVsZFJhbmdlKG9uZW9mKSkgeworICAgICAgaWYgKCFJc0ZpZWxkU3RyaXBwZWQoZmllbGQsIG9wdGlvbnNfKSkgeworICAgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMocHJpbnRlcik7CisgICAgICB9CisgICAgfQorICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgZm9ybWF0KCJ9ICQxJF87XG4iLCBvbmVvZi0+bmFtZSgpKTsKKyAgICBmb3IgKGF1dG8gZmllbGQgOiBGaWVsZFJhbmdlKG9uZW9mKSkgeworICAgICAgaWYgKCFJc0ZpZWxkU3RyaXBwZWQoZmllbGQsIG9wdGlvbnNfKSkgeworICAgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlU3RhdGljTWVtYmVycyhwcmludGVyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBNZW1iZXJzIGFzc3VtZWQgdG8gYWxpZ24gdG8gNCBieXRlczoKKworICBpZiAobmVlZF90b19lbWl0X2NhY2hlZF9zaXplKSB7CisgICAgZm9ybWF0KGNhY2hlZF9zaXplX2RlY2wuY19zdHIoKSk7CisgICAgbmVlZF90b19lbWl0X2NhY2hlZF9zaXplID0gZmFsc2U7CisgIH0KKworICAvLyBHZW5lcmF0ZSBfb25lb2ZfY2FzZV8uCisgIGlmIChkZXNjcmlwdG9yXy0+cmVhbF9vbmVvZl9kZWNsX2NvdW50KCkgPiAwKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiJHVpbnQzMiQgX29uZW9mX2Nhc2VfWyQxJF07XG4iCisgICAgICAgICJcbiIsCisgICAgICAgIGRlc2NyaXB0b3JfLT5yZWFsX29uZW9mX2RlY2xfY291bnQoKSk7CisgIH0KKworICBpZiAobnVtX3dlYWtfZmllbGRzXykgeworICAgIGZvcm1hdCgiOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6V2Vha0ZpZWxkTWFwIF93ZWFrX2ZpZWxkX21hcF87XG4iKTsKKyAgfQorICAvLyBHZW5lcmF0ZSBfYW55X21ldGFkYXRhXyBmb3IgdGhlIEFueSB0eXBlLgorICBpZiAoSXNBbnlNZXNzYWdlKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoIjo6JHByb3RvX25zJDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhIF9hbnlfbWV0YWRhdGFfO1xuIik7CisgIH0KKworICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoIn07XG4iKTsKKworICAvLyBPbmx5IGNyZWF0ZSB0aGUgX2ltcGxfIGZpZWxkIGlmIGl0IGNvbnRhaW5zIGRhdGEuCisgIGlmIChIYXNJbXBsRGF0YShkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KCJ1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTtcbiIpOworICB9CisKKyAgaWYgKFNob3VsZFNwbGl0KGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJzdGF0aWMgSW1wbF86OlNwbGl0KiBDcmVhdGVTcGxpdE1lc3NhZ2UoIgorICAgICAgICAiOjokcHJvdG9fbnMkOjpBcmVuYSogYXJlbmEpO1xuIik7CisgICAgZm9ybWF0KCJmcmllbmQgc3RydWN0ICQxJDtcbiIsCisgICAgICAgICAgIERlZmF1bHRJbnN0YW5jZVR5cGUoZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCAvKnNwbGl0PSovdHJ1ZSkpOworICB9CisKKyAgLy8gVGhlIFRhYmxlU3RydWN0IHN0cnVjdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHByaXZhdGUgcGFydHMsIGluIG9yZGVyIHRvCisgIC8vIGNvbnN0cnVjdCB0aGUgb2Zmc2V0cyBvZiBhbGwgbWVtYmVycy4KKyAgZm9ybWF0KCJmcmllbmQgc3RydWN0IDo6JHRhYmxlbmFtZSQ7XG4iKTsKKworICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoIn07Iik7CisgIEdPT0dMRV9EQ0hFQ0soIW5lZWRfdG9fZW1pdF9jYWNoZWRfc2l6ZSk7Cit9ICAvLyBOT0xJTlQocmVhZGFiaWxpdHkvZm5fc2l6ZSkKKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUlubGluZU1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKElzTWFwRW50cnlNZXNzYWdlKGRlc2NyaXB0b3JfKSkgcmV0dXJuOworICBHZW5lcmF0ZUZpZWxkQWNjZXNzb3JEZWZpbml0aW9ucyhwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBvbmVvZl9jYXNlKCkgZnVuY3Rpb25zLgorICBmb3IgKGF1dG8gb25lb2YgOiBPbmVPZlJhbmdlKGRlc2NyaXB0b3JfKSkgeworICAgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgICAgZm9ybWF0LlNldCgiY2FtZWxfb25lb2ZfbmFtZSIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2Uob25lb2YtPm5hbWUoKSwgdHJ1ZSkpOworICAgIGZvcm1hdC5TZXQoIm9uZW9mX25hbWUiLCBvbmVvZi0+bmFtZSgpKTsKKyAgICBmb3JtYXQuU2V0KCJvbmVvZl9pbmRleCIsIG9uZW9mLT5pbmRleCgpKTsKKyAgICBmb3JtYXQoCisgICAgICAgICJpbmxpbmUgJGNsYXNzbmFtZSQ6OiRjYW1lbF9vbmVvZl9uYW1lJENhc2UgJGNsYXNzbmFtZSQ6OiIKKyAgICAgICAgIiR7MSQkb25lb2ZfbmFtZSRfY2FzZSR9JCgpIGNvbnN0IHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRjbGFzc25hbWUkOjokY2FtZWxfb25lb2ZfbmFtZSRDYXNlKCIKKyAgICAgICAgIiRvbmVvZl9jYXNlJFskb25lb2ZfaW5kZXgkXSk7XG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICBvbmVvZik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVNjaGVtYShpbzo6UHJpbnRlciogcHJpbnRlciwgaW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc19vZmZzZXQpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgaGFzX29mZnNldCA9ICFoYXNfYml0X2luZGljZXNfLmVtcHR5KCkgfHwgSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcl8pCisgICAgICAgICAgICAgICAgICAgPyBvZmZzZXQgKyBoYXNfb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgOiAtMTsKKyAgaW50IGlubGluZWRfc3RyaW5nX2luZGljZXNfb2Zmc2V0OworICBpZiAoaW5saW5lZF9zdHJpbmdfaW5kaWNlc18uZW1wdHkoKSkgeworICAgIGlubGluZWRfc3RyaW5nX2luZGljZXNfb2Zmc2V0ID0gLTE7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19ORShoYXNfb2Zmc2V0LCAtMSk7CisgICAgR09PR0xFX0RDSEVDSyghSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcl8pKTsKKyAgICBpbmxpbmVkX3N0cmluZ19pbmRpY2VzX29mZnNldCA9IGhhc19vZmZzZXQgKyBoYXNfYml0X2luZGljZXNfLnNpemUoKTsKKyAgfQorCisgIGZvcm1hdCgieyAkMSQsICQyJCwgJDMkLCBzaXplb2YoJGNsYXNzdHlwZSQpfSxcbiIsIG9mZnNldCwgaGFzX29mZnNldCwKKyAgICAgICAgIGlubGluZWRfc3RyaW5nX2luZGljZXNfb2Zmc2V0KTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUNsYXNzTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiJGNsYXNzbmFtZSQ6OiRjbGFzc25hbWUkKCkge31cbiIKKyAgICAgICAgIiRjbGFzc25hbWUkOjokY2xhc3NuYW1lJCg6OiRwcm90b19ucyQ6OkFyZW5hKiBhcmVuYSlcbiIKKyAgICAgICAgIiAgICA6IFN1cGVyVHlwZShhcmVuYSkge31cbiIKKyAgICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6Ok1lcmdlRnJvbShjb25zdCAkY2xhc3NuYW1lJCYgb3RoZXIpIHtcbiIKKyAgICAgICAgIiAgTWVyZ2VGcm9tSW50ZXJuYWwob3RoZXIpO1xuIgorICAgICAgICAifVxuIik7CisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgICAgaWYgKCFkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1hcF9lbnRyeSgpKSB7CisgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICI6OiRwcm90b19ucyQ6Ok1ldGFkYXRhICRjbGFzc25hbWUkOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHtcbiIKKyAgICAgICAgICAgICIkYW5ub3RhdGVfcmVmbGVjdGlvbiQiCisgICAgICAgICAgICAiICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycyhcbiIKKyAgICAgICAgICAgICIgICAgICAmJGRlc2NfdGFibGUkX2dldHRlciwgJiRkZXNjX3RhYmxlJF9vbmNlLFxuIgorICAgICAgICAgICAgIiAgICAgICRmaWxlX2xldmVsX21ldGFkYXRhJFskMSRdKTtcbiIKKyAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgaW5kZXhfaW5fZmlsZV9tZXNzYWdlc18pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9ybWF0KAorICAgICAgICAgICAgIjo6JHByb3RvX25zJDo6TWV0YWRhdGEgJGNsYXNzbmFtZSQ6OkdldE1ldGFkYXRhKCkgY29uc3Qge1xuIgorICAgICAgICAgICAgIiAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoXG4iCisgICAgICAgICAgICAiICAgICAgJiRkZXNjX3RhYmxlJF9nZXR0ZXIsICYkZGVzY190YWJsZSRfb25jZSxcbiIKKyAgICAgICAgICAgICIgICAgICAkZmlsZV9sZXZlbF9tZXRhZGF0YSRbJDEkXSk7XG4iCisgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgIGluZGV4X2luX2ZpbGVfbWVzc2FnZXNfKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKElzQW55TWVzc2FnZShkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgICAgZm9ybWF0KAorICAgICAgICAgICJib29sICRjbGFzc25hbWUkOjpHZXRBbnlGaWVsZERlc2NyaXB0b3JzKFxuIgorICAgICAgICAgICIgICAgY29uc3QgOjokcHJvdG9fbnMkOjpNZXNzYWdlJiBtZXNzYWdlLFxuIgorICAgICAgICAgICIgICAgY29uc3QgOjokcHJvdG9fbnMkOjpGaWVsZERlc2NyaXB0b3IqKiB0eXBlX3VybF9maWVsZCxcbiIKKyAgICAgICAgICAiICAgIGNvbnN0IDo6JHByb3RvX25zJDo6RmllbGREZXNjcmlwdG9yKiogdmFsdWVfZmllbGQpIHtcbiIKKyAgICAgICAgICAiICByZXR1cm4gOjpfcGJpOjpHZXRBbnlGaWVsZERlc2NyaXB0b3JzKFxuIgorICAgICAgICAgICIgICAgICBtZXNzYWdlLCB0eXBlX3VybF9maWVsZCwgdmFsdWVfZmllbGQpO1xuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICB9CisgICAgZm9ybWF0KAorICAgICAgICAiYm9vbCAkY2xhc3NuYW1lJDo6UGFyc2VBbnlUeXBlVXJsKFxuIgorICAgICAgICAiICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpDb25zdFN0cmluZ1BhcmFtIHR5cGVfdXJsLFxuIgorICAgICAgICAiICAgIHN0ZDo6c3RyaW5nKiBmdWxsX3R5cGVfbmFtZSkge1xuIgorICAgICAgICAiICByZXR1cm4gOjpfcGJpOjpQYXJzZUFueVR5cGVVcmwodHlwZV91cmwsIGZ1bGxfdHlwZV9uYW1lKTtcbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgIlxuIik7CisgIH0KKworICBmb3JtYXQoCisgICAgICAiY2xhc3MgJGNsYXNzbmFtZSQ6Ol9JbnRlcm5hbCB7XG4iCisgICAgICAiIHB1YmxpYzpcbiIpOworICBmb3JtYXQuSW5kZW50KCk7CisgIGlmICghaGFzX2JpdF9pbmRpY2VzXy5lbXB0eSgpKSB7CisgICAgZm9ybWF0KAorICAgICAgICAidXNpbmcgSGFzQml0cyA9ICIKKyAgICAgICAgImRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDwkY2xhc3NuYW1lJD4oKS4kaGFzX2JpdHMkKTtcbiIpOworICB9CisgIGZvciAoYXV0byBmaWVsZCA6IEZpZWxkUmFuZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUludGVybmFsQWNjZXNzb3JEZWNsYXJhdGlvbnMocHJpbnRlcik7CisgICAgaWYgKElzRmllbGRTdHJpcHBlZChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKEhhc0hhc2JpdChmaWVsZCkpIHsKKyAgICAgIGludCBoYXNfYml0X2luZGV4ID0gSGFzQml0SW5kZXgoZmllbGQpOworICAgICAgR09PR0xFX0NIRUNLX05FKGhhc19iaXRfaW5kZXgsIGtOb0hhc2JpdCkgPDwgZmllbGQtPmZ1bGxfbmFtZSgpOworICAgICAgZm9ybWF0KAorICAgICAgICAgICJzdGF0aWMgdm9pZCBzZXRfaGFzXyQxJChIYXNCaXRzKiBoYXNfYml0cykge1xuIgorICAgICAgICAgICIgICgqaGFzX2JpdHMpWyQyJF0gfD0gJDMkdTtcbiIKKyAgICAgICAgICAifVxuIiwKKyAgICAgICAgICBGaWVsZE5hbWUoZmllbGQpLCBoYXNfYml0X2luZGV4IC8gMzIsICgxdSA8PCAoaGFzX2JpdF9pbmRleCAlIDMyKSkpOworICAgIH0KKyAgfQorICBpZiAobnVtX3JlcXVpcmVkX2ZpZWxkc18gPiAwKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IG1hc2tzX2Zvcl9oYXNfYml0cyA9IFJlcXVpcmVkRmllbGRzQml0TWFzaygpOworICAgIGZvcm1hdCgKKyAgICAgICAgInN0YXRpYyBib29sIE1pc3NpbmdSZXF1aXJlZEZpZWxkcyhjb25zdCBIYXNCaXRzJiBoYXNfYml0cykgIgorICAgICAgICAie1xuIgorICAgICAgICAiICByZXR1cm4gJDEkO1xuIgorICAgICAgICAifVxuIiwKKyAgICAgICAgQ29uZGl0aW9uYWxUb0NoZWNrQml0bWFza3MobWFza3NfZm9yX2hhc19iaXRzLCBmYWxzZSwgImhhc19iaXRzIikpOworICB9CisKKyAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgZm9ybWF0KCJ9O1xuXG4iKTsKKyAgZm9yIChhdXRvIGZpZWxkIDogRmllbGRSYW5nZShkZXNjcmlwdG9yXykpIHsKKyAgICBpZiAoIUlzRmllbGRTdHJpcHBlZChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlSW50ZXJuYWxBY2Nlc3NvckRlZmluaXRpb25zKAorICAgICAgICAgIHByaW50ZXIpOworICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlIG5vbi1pbmxpbmUgZmllbGQgZGVmaW5pdGlvbnMuCisgIGZvciAoYXV0byBmaWVsZCA6IEZpZWxkUmFuZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgaWYgKElzRmllbGRTdHJpcHBlZChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZU5vbklubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMocHJpbnRlcik7CisgICAgaWYgKElzQ3Jvc3NGaWxlTWF5YmVNYXAoZmllbGQpKSB7CisgICAgICBGb3JtYXR0ZXI6OlNhdmVTdGF0ZSBzYXZlcigmZm9ybWF0KTsKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgICAgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGZpZWxkLCAmdmFycywgb3B0aW9uc18pOworICAgICAgaWYgKGZpZWxkLT5yZWFsX2NvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgICBTZXRDb21tb25PbmVvZkZpZWxkVmFyaWFibGVzKGZpZWxkLCAmdmFycyk7CisgICAgICB9CisgICAgICBmb3JtYXQuQWRkTWFwKHZhcnMpOworICAgICAgR2VuZXJhdGVGaWVsZENsZWFyKGZpZWxkLCBmYWxzZSwgZm9ybWF0KTsKKyAgICB9CisgIH0KKworICBHZW5lcmF0ZVN0cnVjdG9ycyhwcmludGVyKTsKKyAgZm9ybWF0KCJcbiIpOworCisgIGlmIChkZXNjcmlwdG9yXy0+cmVhbF9vbmVvZl9kZWNsX2NvdW50KCkgPiAwKSB7CisgICAgR2VuZXJhdGVPbmVvZkNsZWFyKHByaW50ZXIpOworICAgIGZvcm1hdCgiXG4iKTsKKyAgfQorCisgIGlmIChIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIEdlbmVyYXRlQ2xlYXIocHJpbnRlcik7CisgICAgZm9ybWF0KCJcbiIpOworCisgICAgaWYgKCFIYXNTaW1wbGVCYXNlQ2xhc3MoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgICAgcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yXy0+R2VuZXJhdGVNZXRob2RJbXBscyhwcmludGVyKTsKKyAgICAgIGZvcm1hdCgiXG4iKTsKKworICAgICAgcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yXy0+R2VuZXJhdGVEYXRhRGVmaW5pdGlvbnMocHJpbnRlcik7CisgICAgfQorCisgICAgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHByaW50ZXIpOworICAgIGZvcm1hdCgiXG4iKTsKKworICAgIEdlbmVyYXRlQnl0ZVNpemUocHJpbnRlcik7CisgICAgZm9ybWF0KCJcbiIpOworCisgICAgR2VuZXJhdGVNZXJnZUZyb20ocHJpbnRlcik7CisgICAgZm9ybWF0KCJcbiIpOworCisgICAgR2VuZXJhdGVDbGFzc1NwZWNpZmljTWVyZ2VJbXBsKHByaW50ZXIpOworICAgIGZvcm1hdCgiXG4iKTsKKworICAgIEdlbmVyYXRlQ29weUZyb20ocHJpbnRlcik7CisgICAgZm9ybWF0KCJcbiIpOworCisgICAgR2VuZXJhdGVJc0luaXRpYWxpemVkKHByaW50ZXIpOworICAgIGZvcm1hdCgiXG4iKTsKKyAgfQorCisgIGlmIChTaG91bGRTcGxpdChkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KAorICAgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6UHJlcGFyZVNwbGl0TWVzc2FnZUZvcldyaXRlKCkge1xuIgorICAgICAgICAiICBpZiAoSXNTcGxpdE1lc3NhZ2VEZWZhdWx0KCkpIHtcbiIKKyAgICAgICAgIiAgICAkc3BsaXQkID0gQ3JlYXRlU3BsaXRNZXNzYWdlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTtcbiIKKyAgICAgICAgIiAgfVxuIgorICAgICAgICAifVxuIik7CisgIH0KKworICBHZW5lcmF0ZVZlcmlmeShwcmludGVyKTsKKworICBHZW5lcmF0ZVN3YXAocHJpbnRlcik7CisgIGZvcm1hdCgiXG4iKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgaWYgKCFkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1hcF9lbnRyeSgpKSB7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgIjo6JHByb3RvX25zJDo6TWV0YWRhdGEgJGNsYXNzbmFtZSQ6OkdldE1ldGFkYXRhKCkgY29uc3Qge1xuIgorICAgICAgICAgICIkYW5ub3RhdGVfcmVmbGVjdGlvbiQiCisgICAgICAgICAgIiAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoXG4iCisgICAgICAgICAgIiAgICAgICYkZGVzY190YWJsZSRfZ2V0dGVyLCAmJGRlc2NfdGFibGUkX29uY2UsXG4iCisgICAgICAgICAgIiAgICAgICRmaWxlX2xldmVsX21ldGFkYXRhJFskMSRdKTtcbiIKKyAgICAgICAgICAifVxuIiwKKyAgICAgICAgICBpbmRleF9pbl9maWxlX21lc3NhZ2VzXyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAiOjokcHJvdG9fbnMkOjpNZXRhZGF0YSAkY2xhc3NuYW1lJDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7XG4iCisgICAgICAgICAgIiAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoXG4iCisgICAgICAgICAgIiAgICAgICYkZGVzY190YWJsZSRfZ2V0dGVyLCAmJGRlc2NfdGFibGUkX29uY2UsXG4iCisgICAgICAgICAgIiAgICAgICRmaWxlX2xldmVsX21ldGFkYXRhJFskMSRdKTtcbiIKKyAgICAgICAgICAifVxuIiwKKyAgICAgICAgICBpbmRleF9pbl9maWxlX21lc3NhZ2VzXyk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvcm1hdCgKKyAgICAgICAgInN0ZDo6c3RyaW5nICRjbGFzc25hbWUkOjpHZXRUeXBlTmFtZSgpIGNvbnN0IHtcbiIKKyAgICAgICAgIiAgcmV0dXJuIFwiJGZ1bGxfbmFtZSRcIjtcbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgIlxuIik7CisgIH0KKworICBpZiAoSGFzVHJhY2tlcihkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiOjokcHJvdG9fbnMkOjpBY2Nlc3NMaXN0ZW5lcjwkY2xhc3N0eXBlJD4gIgorICAgICAgICAiJDEkOjokdHJhY2tlciQoJkZ1bGxNZXNzYWdlTmFtZSk7XG4iLAorICAgICAgICBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgfQorfQorCitzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+IE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlT2Zmc2V0cygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworCisgIGlmICghaGFzX2JpdF9pbmRpY2VzXy5lbXB0eSgpIHx8IElzTWFwRW50cnlNZXNzYWdlKGRlc2NyaXB0b3JfKSkgeworICAgIGZvcm1hdCgiUFJPVE9CVUZfRklFTERfT0ZGU0VUKCRjbGFzc3R5cGUkLCAkaGFzX2JpdHMkKSxcbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgifjB1LCAgLy8gbm8gX2hhc19iaXRzX1xuIik7CisgIH0KKyAgZm9ybWF0KCJQUk9UT0JVRl9GSUVMRF9PRkZTRVQoJGNsYXNzdHlwZSQsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLFxuIik7CisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgZm9ybWF0KCJQUk9UT0JVRl9GSUVMRF9PRkZTRVQoJGNsYXNzdHlwZSQsICRleHRlbnNpb25zJCksXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoIn4wdSwgIC8vIG5vIF9leHRlbnNpb25zX1xuIik7CisgIH0KKyAgaWYgKGRlc2NyaXB0b3JfLT5yZWFsX29uZW9mX2RlY2xfY291bnQoKSA+IDApIHsKKyAgICBmb3JtYXQoIlBST1RPQlVGX0ZJRUxEX09GRlNFVCgkY2xhc3N0eXBlJCwgJG9uZW9mX2Nhc2UkWzBdKSxcbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgifjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfXG4iKTsKKyAgfQorICBpZiAobnVtX3dlYWtfZmllbGRzXyA+IDApIHsKKyAgICBmb3JtYXQoIlBST1RPQlVGX0ZJRUxEX09GRlNFVCgkY2xhc3N0eXBlJCwgJHdlYWtfZmllbGRfbWFwJCksXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoIn4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF9cbiIpOworICB9CisgIGlmICghaW5saW5lZF9zdHJpbmdfaW5kaWNlc18uZW1wdHkoKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgIlBST1RPQlVGX0ZJRUxEX09GRlNFVCgkY2xhc3N0eXBlJCwgIgorICAgICAgICAiJGlubGluZWRfc3RyaW5nX2RvbmF0ZWRfYXJyYXkkKSxcbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgifjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfXG4iKTsKKyAgfQorICBjb25zdCBpbnQga051bUdlbmVyaWNPZmZzZXRzID0gNjsgIC8vIHRoZSBudW1iZXIgb2YgZml4ZWQgb2Zmc2V0cyBhYm92ZQorICBjb25zdCBzaXplX3Qgb2Zmc2V0cyA9IGtOdW1HZW5lcmljT2Zmc2V0cyArIGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXy0+cmVhbF9vbmVvZl9kZWNsX2NvdW50KCk7CisgIHNpemVfdCBlbnRyaWVzID0gb2Zmc2V0czsKKyAgZm9yIChhdXRvIGZpZWxkIDogRmllbGRSYW5nZShkZXNjcmlwdG9yXykpIHsKKyAgICBpZiAoSXNGaWVsZFN0cmlwcGVkKGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgIGZvcm1hdCgifjB1LCAgLy8gc3RyaXBwZWRcbiIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIC8vIFRPRE8oc2JlbnphKTogV2Ugc2hvdWxkIG5vdCBoYXZlIGFuIGVudHJ5IGluIHRoZSBvZmZzZXQgdGFibGUgZm9yIGZpZWxkcworICAgIC8vIHRoYXQgZG8gbm90IHVzZSB0aGVtLgorICAgIGlmIChmaWVsZC0+b3B0aW9ucygpLndlYWsoKSB8fCBmaWVsZC0+cmVhbF9jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgIC8vIE1hcmsgdGhlIGZpZWxkIHRvIHByZXZlbnQgdW5pbnRlbnRpb25hbCBhY2Nlc3MgdGhyb3VnaCByZWZsZWN0aW9uLgorICAgICAgLy8gRG9uJ3QgdXNlIHRoZSB0b3AgYml0IGJlY2F1c2UgdGhhdCBpcyBmb3IgdW51c2VkIGZpZWxkcy4KKyAgICAgIGZvcm1hdCgiOjpfcGJpOjprSW52YWxpZEZpZWxkT2Zmc2V0VGFnIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvcm1hdCgiUFJPVE9CVUZfRklFTERfT0ZGU0VUKCRjbGFzc3R5cGUkJDEkLCAkMiQpIiwKKyAgICAgICAgICAgICBTaG91bGRTcGxpdChmaWVsZCwgb3B0aW9uc18pID8gIjo6SW1wbF86OlNwbGl0IiA6ICIiLAorICAgICAgICAgICAgIFNob3VsZFNwbGl0KGZpZWxkLCBvcHRpb25zXykKKyAgICAgICAgICAgICAgICAgPyBGaWVsZE5hbWUoZmllbGQpICsgIl8iCisgICAgICAgICAgICAgICAgIDogRmllbGRNZW1iZXJOYW1lKGZpZWxkLCAvKmNvbGQ9Ki9mYWxzZSkpOworICAgIH0KKworICAgIC8vIFNvbWUgaW5mb3JtYXRpb24gYWJvdXQgYSBmaWVsZCBpcyBpbiB0aGUgcGRwcm90byBwcm9maWxlLiBUaGUgcHJvZmlsZSBpcworICAgIC8vIG9ubHkgYXZhaWxhYmxlIGF0IGNvbXBpbGUgdGltZS4gU28gd2UgZW1iZWQgc3VjaCBpbmZvcm1hdGlvbiBpbiB0aGUKKyAgICAvLyBvZmZzZXQgb2YgdGhlIGZpZWxkLCBzbyB0aGF0IHRoZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgd2hlbgorICAgIC8vIHJlZmxlY3RpdmVseSBhY2Nlc3NpbmcgdGhlIGZpZWxkIGF0IHJ1biB0aW1lLgorICAgIC8vCisgICAgLy8gRW1iZWQgd2hldGhlciB0aGUgZmllbGQgaXMgZWFnZXJseSB2ZXJpZmllZCBsYXp5IG9yIGlubGluZWQgc3RyaW5nIHRvIHRoZQorICAgIC8vIExTQiBvZiB0aGUgb2Zmc2V0LgorICAgIGlmIChJc0VhZ2VybHlWZXJpZmllZExhenkoZmllbGQsIG9wdGlvbnNfLCBzY2NfYW5hbHl6ZXJfKSkgeworICAgICAgZm9ybWF0KCIgfCAweDF1ICAvLyBlYWdlcmx5IHZlcmlmaWVkIGxhenlcbiIpOworICAgIH0gZWxzZSBpZiAoSXNTdHJpbmdJbmxpbmVkKGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgIGZvcm1hdCgiIHwgMHgxdSAgLy8gaW5saW5lZFxuIik7CisgICAgfQorICAgIGZvcm1hdCgiLFxuIik7CisgIH0KKworICBpbnQgY291bnQgPSAwOworICBmb3IgKGF1dG8gb25lb2YgOiBPbmVPZlJhbmdlKGRlc2NyaXB0b3JfKSkgeworICAgIGZvcm1hdCgiUFJPVE9CVUZfRklFTERfT0ZGU0VUKCRjbGFzc3R5cGUkLCBfaW1wbF8uJDEkXyksXG4iLCBvbmVvZi0+bmFtZSgpKTsKKyAgICBjb3VudCsrOworICB9CisgIEdPT0dMRV9DSEVDS19FUShjb3VudCwgZGVzY3JpcHRvcl8tPnJlYWxfb25lb2ZfZGVjbF9jb3VudCgpKTsKKworICBpZiAoSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgZW50cmllcyArPSAyOworICAgIGZvcm1hdCgKKyAgICAgICAgIjAsXG4iCisgICAgICAgICIxLFxuIik7CisgIH0gZWxzZSBpZiAoIWhhc19iaXRfaW5kaWNlc18uZW1wdHkoKSkgeworICAgIGVudHJpZXMgKz0gaGFzX2JpdF9pbmRpY2VzXy5zaXplKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYXNfYml0X2luZGljZXNfLnNpemUoKTsgaSsrKSB7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyBpbmRleCA9CisgICAgICAgICAgaGFzX2JpdF9pbmRpY2VzX1tpXSA+PSAwID8gU3RyQ2F0KGhhc19iaXRfaW5kaWNlc19baV0pIDogIn4wdSI7CisgICAgICBmb3JtYXQoIiQxJCxcbiIsIGluZGV4KTsKKyAgICB9CisgIH0KKyAgaWYgKCFpbmxpbmVkX3N0cmluZ19pbmRpY2VzXy5lbXB0eSgpKSB7CisgICAgZW50cmllcyArPSBpbmxpbmVkX3N0cmluZ19pbmRpY2VzXy5zaXplKCk7CisgICAgZm9yIChpbnQgaW5saW5lZF9zdHJpbmdfaW5kZXggOiBpbmxpbmVkX3N0cmluZ19pbmRpY2VzXykgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgaW5kZXggPQorICAgICAgICAgIGlubGluZWRfc3RyaW5nX2luZGV4ID49IDAKKyAgICAgICAgICAgICAgPyBTdHJDYXQoaW5saW5lZF9zdHJpbmdfaW5kZXgsICIsICAvLyBpbmxpbmVkX3N0cmluZ19pbmRleCIpCisgICAgICAgICAgICAgIDogIn4wdSwiOworICAgICAgZm9ybWF0KCIkMSRcbiIsIGluZGV4KTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZW50cmllcywgb2Zmc2V0cyk7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTaGFyZWRDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKEhhc1NpbXBsZUJhc2VDbGFzcyhkZXNjcmlwdG9yXywgb3B0aW9uc18pKSByZXR1cm47CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisKKyAgZm9ybWF0KAorICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpTaGFyZWRDdG9yKFxuIgorICAgICAgIiAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHtcbiIKKyAgICAgICIgICh2b2lkKWFyZW5hO1xuIgorICAgICAgIiAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDtcbiIpOworCisgIGZvcm1hdC5JbmRlbnQoKTsKKyAgLy8gSW1wbF8gX2ltcGxfLgorICBmb3JtYXQoIm5ldyAoJl9pbXBsXykgSW1wbF97Iik7CisgIGZvcm1hdC5JbmRlbnQoKTsKKyAgY29uc3QgY2hhciogZmllbGRfc2VwID0gIiAiOworICBjb25zdCBhdXRvIHB1dF9zZXAgPSBbJl0geworICAgIGZvcm1hdCgiXG4kMSQgIiwgZmllbGRfc2VwKTsKKyAgICBmaWVsZF9zZXAgPSAiLCI7CisgIH07CisKKyAgLy8gTm90ZTogYW55IGZpZWxkcyB3aXRob3V0IG1vdmUvY29weSBjb25zdHJ1Y3RvcnMgY2FuJ3QgYmUgZXhwbGljaXRseQorICAvLyBhZ2dyZWdhdGUgaW5pdGlhbGl6ZWQgcHJlLUMrKzE3LgorICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIHB1dF9zZXAoKTsKKyAgICBmb3JtYXQoIi8qZGVjbHR5cGUoJGV4dGVuc2lvbnMkKSovezo6X3BiaTo6QXJlbmFJbml0aWFsaXplZCgpLCBhcmVuYX0iKTsKKyAgfQorICBpZiAoIWlubGluZWRfc3RyaW5nX2luZGljZXNfLmVtcHR5KCkpIHsKKyAgICBwdXRfc2VwKCk7CisgICAgZm9ybWF0KCJkZWNsdHlwZSgkaW5saW5lZF9zdHJpbmdfZG9uYXRlZF9hcnJheSQpe30iKTsKKyAgfQorICBib29sIG5lZWRfdG9fZW1pdF9jYWNoZWRfc2l6ZSA9ICFIYXNTaW1wbGVCYXNlQ2xhc3MoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKTsKKyAgaWYgKCFoYXNfYml0X2luZGljZXNfLmVtcHR5KCkpIHsKKyAgICBwdXRfc2VwKCk7CisgICAgZm9ybWF0KCJkZWNsdHlwZSgkaGFzX2JpdHMkKXt9Iik7CisgICAgaWYgKG5lZWRfdG9fZW1pdF9jYWNoZWRfc2l6ZSkgeworICAgICAgcHV0X3NlcCgpOworICAgICAgZm9ybWF0KCIvKmRlY2x0eXBlKCRjYWNoZWRfc2l6ZSQpKi97fSIpOworICAgICAgbmVlZF90b19lbWl0X2NhY2hlZF9zaXplID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gSW5pdGlhbGl6ZSBtZW1iZXIgdmFyaWFibGVzIHdpdGggYXJlbmEgY29uc3RydWN0b3IuCisgIGZvciAoYXV0byBmaWVsZCA6IG9wdGltaXplZF9vcmRlcl8pIHsKKyAgICBHT09HTEVfRENIRUNLKCFJc0ZpZWxkU3RyaXBwZWQoZmllbGQsIG9wdGlvbnNfKSk7CisgICAgaWYgKFNob3VsZFNwbGl0KGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwdXRfc2VwKCk7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUFnZ3JlZ2F0ZUluaXRpYWxpemVyKHByaW50ZXIpOworICB9CisgIGlmIChTaG91bGRTcGxpdChkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgcHV0X3NlcCgpOworICAgIGZvcm1hdCgiZGVjbHR5cGUoJHNwbGl0JCl7cmVpbnRlcnByZXRfY2FzdDxJbXBsXzo6U3BsaXQqPigmJDEkKX0iLAorICAgICAgICAgICBEZWZhdWx0SW5zdGFuY2VOYW1lKGRlc2NyaXB0b3JfLCBvcHRpb25zXywgLypzcGxpdD0qL3RydWUpKTsKKyAgfQorICBmb3IgKGF1dG8gb25lb2YgOiBPbmVPZlJhbmdlKGRlc2NyaXB0b3JfKSkgeworICAgIHB1dF9zZXAoKTsKKyAgICBmb3JtYXQoImRlY2x0eXBlKF9pbXBsXy4kMSRfKXt9Iiwgb25lb2YtPm5hbWUoKSk7CisgIH0KKworICBpZiAobmVlZF90b19lbWl0X2NhY2hlZF9zaXplKSB7CisgICAgcHV0X3NlcCgpOworICAgIGZvcm1hdCgiLypkZWNsdHlwZSgkY2FjaGVkX3NpemUkKSove30iKTsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+cmVhbF9vbmVvZl9kZWNsX2NvdW50KCkgIT0gMCkgeworICAgIHB1dF9zZXAoKTsKKyAgICBmb3JtYXQoIi8qZGVjbHR5cGUoJG9uZW9mX2Nhc2UkKSove30iKTsKKyAgfQorICBpZiAobnVtX3dlYWtfZmllbGRzXyA+IDApIHsKKyAgICBwdXRfc2VwKCk7CisgICAgZm9ybWF0KCJkZWNsdHlwZSgkd2Vha19maWVsZF9tYXAkKXthcmVuYX0iKTsKKyAgfQorICBpZiAoSXNBbnlNZXNzYWdlKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHsKKyAgICBwdXRfc2VwKCk7CisgICAgLy8gQW55TWV0YWRhdGEgaGFzIG5vIG1vdmUgY29uc3RydWN0b3IuCisgICAgZm9ybWF0KCIvKmRlY2x0eXBlKCRhbnlfbWV0YWRhdGEkKSoveyZfaW1wbF8udHlwZV91cmxfLCAmX2ltcGxfLnZhbHVlX30iKTsKKyAgfQorCisgIGZvcm1hdC5PdXRkZW50KCk7CisgIGZvcm1hdCgiXG59O1xuIik7CisKKyAgaWYgKCFpbmxpbmVkX3N0cmluZ19pbmRpY2VzXy5lbXB0eSgpKSB7CisgICAgLy8gRG9uYXRlIGlubGluZSBzdHJpbmcgZmllbGRzLgorICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgICAvLyBUaGUgbGFzdCBiaXQgaXMgdGhlIHRyYWNraW5nIGJpdCBmb3IgcmVnaXN0ZXJpbmcgQXJlbmFEdG9yLiBUaGUgYml0IGlzIDEKKyAgICAvLyBtZWFucyBBcmVuYUR0b3IgaXMgbm90IHJlZ2lzdGVyZWQgb24gY29uc3RydWN0aW9uLCBhbmQgb24gZGVtYW5kIHJlZ2lzdGVyCisgICAgLy8gaXMgbmVlZGVkLgorICAgIGZvcm1hdCgiaWYgKGFyZW5hICE9IG51bGxwdHIpIHtcbiIpOworICAgIGlmIChOZWVkc0FyZW5hRGVzdHJ1Y3RvcigpID09IEFyZW5hRHRvck5lZWRzOjprT25EZW1hbmQpIHsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAiICBpZiAoIWlzX21lc3NhZ2Vfb3duZWQpIHtcbiIKKyAgICAgICAgICAiICAgICRpbmxpbmVkX3N0cmluZ19kb25hdGVkX2FycmF5JFswXSA9IH4wdTtcbiIKKyAgICAgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgcmVnaXN0ZXIgQXJlbmFEdG9yIGZvciBNT0EuCisgICAgICAgICAgIiAgICAkaW5saW5lZF9zdHJpbmdfZG9uYXRlZF9hcnJheSRbMF0gPSAweEZGRkZGRkZFdTtcbiIKKyAgICAgICAgICAiICB9XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9ybWF0KCIgICRpbmxpbmVkX3N0cmluZ19kb25hdGVkX2FycmF5JFswXSA9IDB4RkZGRkZGRkV1O1xuIik7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgSW5saW5lZFN0cmluZ0RvbmF0ZWRTaXplKCk7ICsraSkgeworICAgICAgZm9ybWF0KCIgICRpbmxpbmVkX3N0cmluZ19kb25hdGVkX2FycmF5JFskMSRdID0gfjB1O1xuIiwgaSk7CisgICAgfQorICAgIGZvcm1hdCgifVxuIik7CisgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgfQorCisgIGZvciAoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA6IG9wdGltaXplZF9vcmRlcl8pIHsKKyAgICBpZiAoU2hvdWxkU3BsaXQoZmllbGQsIG9wdGlvbnNfKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUocHJpbnRlcik7CisgIH0KKworICBmb3IgKGF1dG8gb25lb2YgOiBPbmVPZlJhbmdlKGRlc2NyaXB0b3JfKSkgeworICAgIGZvcm1hdCgiY2xlYXJfaGFzXyQxJCgpO1xuIiwgb25lb2YtPm5hbWUoKSk7CisgIH0KKworICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoIn1cblxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVDcmVhdGVTcGxpdE1lc3NhZ2UoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgIiRjbGFzc25hbWUkOjpJbXBsXzo6U3BsaXQqICIKKyAgICAgICIkY2xhc3NuYW1lJDo6Q3JlYXRlU3BsaXRNZXNzYWdlKDo6JHByb3RvX25zJDo6QXJlbmEqIGFyZW5hKSB7XG4iKTsKKyAgZm9ybWF0LkluZGVudCgpOworICBjb25zdCBjaGFyKiBmaWVsZF9zZXAgPSAiICI7CisgIGNvbnN0IGF1dG8gcHV0X3NlcCA9IFsmXSB7CisgICAgZm9ybWF0KCJcbiQxJCAiLCBmaWVsZF9zZXApOworICAgIGZpZWxkX3NlcCA9ICIsIjsKKyAgfTsKKyAgZm9ybWF0KAorICAgICAgImNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKEltcGxfOjpTcGxpdCk7XG4iCisgICAgICAidm9pZCogY2h1bmsgPSAoYXJlbmEgPT0gbnVsbHB0cikgP1xuIgorICAgICAgIiAgOjpvcGVyYXRvciBuZXcoc2l6ZSkgOlxuIgorICAgICAgIiAgYXJlbmEtPkFsbG9jYXRlQWxpZ25lZChzaXplLCBhbGlnbm9mKEltcGxfOjpTcGxpdCkpO1xuIgorICAgICAgIkltcGxfOjpTcGxpdCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxJbXBsXzo6U3BsaXQqPihjaHVuayk7XG4iCisgICAgICAibmV3IChwdHIpIEltcGxfOjpTcGxpdHsiKTsKKyAgZm9ybWF0LkluZGVudCgpOworICBmb3IgKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgOiBvcHRpbWl6ZWRfb3JkZXJfKSB7CisgICAgR09PR0xFX0RDSEVDSyghSXNGaWVsZFN0cmlwcGVkKGZpZWxkLCBvcHRpb25zXykpOworICAgIGlmIChTaG91bGRTcGxpdChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgICBwdXRfc2VwKCk7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQWdncmVnYXRlSW5pdGlhbGl6ZXIocHJpbnRlcik7CisgICAgfQorICB9CisgIGZvcm1hdC5PdXRkZW50KCk7CisgIGZvcm1hdCgifTtcbiIpOworICBmb3IgKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgOiBvcHRpbWl6ZWRfb3JkZXJfKSB7CisgICAgR09PR0xFX0RDSEVDSyghSXNGaWVsZFN0cmlwcGVkKGZpZWxkLCBvcHRpb25zXykpOworICAgIGlmIChTaG91bGRTcGxpdChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQ3JlYXRlU3BsaXRNZXNzYWdlQ29kZShwcmludGVyKTsKKyAgICB9CisgIH0KKyAgZm9ybWF0KCJyZXR1cm4gcHRyO1xuIik7CisgIGZvcm1hdC5PdXRkZW50KCk7CisgIGZvcm1hdCgifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVJbml0RGVmYXVsdFNwbGl0SW5zdGFuY2UoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKCFTaG91bGRTcGxpdChkZXNjcmlwdG9yXywgb3B0aW9uc18pKSByZXR1cm47CisKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgY29uc3QgY2hhciogZmllbGRfc2VwID0gIiAiOworICBjb25zdCBhdXRvIHB1dF9zZXAgPSBbJl0geworICAgIGZvcm1hdCgiXG4kMSQgIiwgZmllbGRfc2VwKTsKKyAgICBmaWVsZF9zZXAgPSAiLCI7CisgIH07CisgIGZvciAoY29uc3QgYXV0byogZmllbGQgOiBvcHRpbWl6ZWRfb3JkZXJfKSB7CisgICAgaWYgKFNob3VsZFNwbGl0KGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgIHB1dF9zZXAoKTsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVDb25zdGV4cHJBZ2dyZWdhdGVJbml0aWFsaXplcigKKyAgICAgICAgICBwcmludGVyKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVNoYXJlZERlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChIYXNTaW1wbGVCYXNlQ2xhc3MoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgcmV0dXJuOworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworCisgIGZvcm1hdCgiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OlNoYXJlZER0b3IoKSB7XG4iKTsKKyAgZm9ybWF0LkluZGVudCgpOworICBmb3JtYXQoIiREQ0hLJChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTtcbiIpOworCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgZm9ybWF0KCIkZXh0ZW5zaW9ucyQufkV4dGVuc2lvblNldCgpO1xuIik7CisgIH0KKworICAvLyBXcml0ZSB0aGUgZGVzdHJ1Y3RvcnMgZm9yIGVhY2ggZmllbGQgZXhjZXB0IG9uZW9mIG1lbWJlcnMuCisgIC8vIG9wdGltaXplZF9vcmRlcl8gZG9lcyBub3QgY29udGFpbiBvbmVvZiBmaWVsZHMuCisgIGZvciAoYXV0byBmaWVsZCA6IG9wdGltaXplZF9vcmRlcl8pIHsKKyAgICBpZiAoU2hvdWxkU3BsaXQoZmllbGQsIG9wdGlvbnNfKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgfQorICBpZiAoU2hvdWxkU3BsaXQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgiaWYgKCFJc1NwbGl0TWVzc2FnZURlZmF1bHQoKSkge1xuIik7CisgICAgZm9ybWF0LkluZGVudCgpOworICAgIGZvcm1hdCgiYXV0byogJGNhY2hlZF9zcGxpdF9wdHIkID0gJHNwbGl0JDtcbiIpOworICAgIGZvciAoYXV0byBmaWVsZCA6IG9wdGltaXplZF9vcmRlcl8pIHsKKyAgICAgIGlmIChTaG91bGRTcGxpdChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9ybWF0KCJkZWxldGUgJGNhY2hlZF9zcGxpdF9wdHIkO1xuIik7CisgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICBmb3JtYXQoIn1cbiIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgY29kZSB0byBkZXN0cnVjdCBvbmVvZnMuIENsZWFyaW5nIHNob3VsZCBkbyB0aGUgd29yay4KKyAgZm9yIChhdXRvIG9uZW9mIDogT25lT2ZSYW5nZShkZXNjcmlwdG9yXykpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJpZiAoaGFzXyQxJCgpKSB7XG4iCisgICAgICAgICIgIGNsZWFyXyQxJCgpO1xuIgorICAgICAgICAifVxuIiwKKyAgICAgICAgb25lb2YtPm5hbWUoKSk7CisgIH0KKworICBpZiAobnVtX3dlYWtfZmllbGRzXykgeworICAgIGZvcm1hdCgiJHdlYWtfZmllbGRfbWFwJC5DbGVhckFsbCgpO1xuIik7CisgIH0KKworICBpZiAoSXNBbnlNZXNzYWdlKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoIiRhbnlfbWV0YWRhdGEkLn5BbnlNZXRhZGF0YSgpO1xuIik7CisgIH0KKworICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoCisgICAgICAifVxuIgorICAgICAgIlxuIik7Cit9CisKK0FyZW5hRHRvck5lZWRzIE1lc3NhZ2VHZW5lcmF0b3I6Ok5lZWRzQXJlbmFEZXN0cnVjdG9yKCkgY29uc3QgeworICBpZiAoSGFzU2ltcGxlQmFzZUNsYXNzKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHJldHVybiBBcmVuYUR0b3JOZWVkczo6a05vbmU7CisgIEFyZW5hRHRvck5lZWRzIG5lZWRzID0gQXJlbmFEdG9yTmVlZHM6OmtOb25lOworICBmb3IgKGNvbnN0IGF1dG8qIGZpZWxkIDogRmllbGRSYW5nZShkZXNjcmlwdG9yXykpIHsKKyAgICBpZiAoSXNGaWVsZFN0cmlwcGVkKGZpZWxkLCBvcHRpb25zXykpIGNvbnRpbnVlOworICAgIG5lZWRzID0KKyAgICAgICAgc3RkOjptYXgobmVlZHMsIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuTmVlZHNBcmVuYURlc3RydWN0b3IoKSk7CisgIH0KKyAgcmV0dXJuIG5lZWRzOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlQXJlbmFEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBHT09HTEVfQ0hFQ0soTmVlZHNBcmVuYURlc3RydWN0b3IoKSA+IEFyZW5hRHRvck5lZWRzOjprTm9uZSk7CisKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgQXJlbmFEdG9yKCkgbWV0aG9kLiBUcmFjayB3aGV0aGVyIGFueSBmaWVsZHMgYWN0dWFsbHkgcHJvZHVjZWQKKyAgLy8gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGNhbGxlZC4KKyAgZm9ybWF0KCJ2b2lkICRjbGFzc25hbWUkOjpBcmVuYUR0b3Iodm9pZCogb2JqZWN0KSB7XG4iKTsKKyAgZm9ybWF0LkluZGVudCgpOworCisgIC8vIFRoaXMgY29kZSBpcyBwbGFjZWQgaW5zaWRlIGEgc3RhdGljIG1ldGhvZCwgcmF0aGVyIHRoYW4gYW4gb3JkaW5hcnkgb25lLAorICAvLyBzaW5jZSB0aGF0IHNpbXBsaWZpZXMgQXJlbmEncyBkZXN0cnVjdG9yIGxpc3QgKG9yZGluYXJ5IGZ1bmN0aW9uIHBvaW50ZXJzCisgIC8vIHJhdGhlciB0aGFuIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycykuIF90aGlzIGlzIHRoZSBvYmplY3QgYmVpbmcKKyAgLy8gZGVzdHJ1Y3RlZC4KKyAgZm9ybWF0KCIkY2xhc3NuYW1lJCogX3RoaXMgPSByZWludGVycHJldF9jYXN0PCAkY2xhc3NuYW1lJCogPihvYmplY3QpO1xuIik7CisKKyAgLy8gUHJvY2VzcyBub24tb25lb2YgZmllbGRzIGZpcnN0LgorICBmb3IgKGF1dG8gZmllbGQgOiBvcHRpbWl6ZWRfb3JkZXJfKSB7CisgICAgaWYgKElzRmllbGRTdHJpcHBlZChmaWVsZCwgb3B0aW9uc18pIHx8IFNob3VsZFNwbGl0KGZpZWxkLCBvcHRpb25zXykpCisgICAgICBjb250aW51ZTsKKyAgICBjb25zdCBGaWVsZEdlbmVyYXRvciYgZmcgPSBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpOworICAgIGZnLkdlbmVyYXRlQXJlbmFEZXN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgfQorICBpZiAoU2hvdWxkU3BsaXQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgiaWYgKCFfdGhpcy0+SXNTcGxpdE1lc3NhZ2VEZWZhdWx0KCkpIHtcbiIpOworICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgICBmb3IgKGF1dG8gZmllbGQgOiBvcHRpbWl6ZWRfb3JkZXJfKSB7CisgICAgICBpZiAoSXNGaWVsZFN0cmlwcGVkKGZpZWxkLCBvcHRpb25zXykgfHwgIVNob3VsZFNwbGl0KGZpZWxkLCBvcHRpb25zXykpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgY29uc3QgRmllbGRHZW5lcmF0b3ImIGZnID0gZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKTsKKyAgICAgIGZnLkdlbmVyYXRlQXJlbmFEZXN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgICB9CisgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICBmb3JtYXQoIn1cbiIpOworICB9CisKKyAgLy8gUHJvY2VzcyBvbmVvZiBmaWVsZHMuCisgIGZvciAoYXV0byBvbmVvZiA6IE9uZU9mUmFuZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgZm9yIChhdXRvIGZpZWxkIDogRmllbGRSYW5nZShvbmVvZikpIHsKKyAgICAgIGlmIChJc0ZpZWxkU3RyaXBwZWQoZmllbGQsIG9wdGlvbnNfKSkgY29udGludWU7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQXJlbmFEZXN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgICB9CisgIH0KKworICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlQ29uc3RleHByQ29uc3RydWN0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKworICBpZiAoSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcl8pIHx8ICFIYXNJbXBsRGF0YShkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiUFJPVE9CVUZfQ09OU1RFWFBSICRjbGFzc25hbWUkOjokY2xhc3NuYW1lJChcbiIKKyAgICAgICAgIiAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpIHt9XG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBmb3JtYXQoCisgICAgICAiUFJPVE9CVUZfQ09OU1RFWFBSICRjbGFzc25hbWUkOjokY2xhc3NuYW1lJChcbiIKKyAgICAgICIgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKSIpOworCisgIGJvb2wgbmVlZF90b19lbWl0X2NhY2hlZF9zaXplID0gIUhhc1NpbXBsZUJhc2VDbGFzcyhkZXNjcmlwdG9yXywgb3B0aW9uc18pOworICBmb3JtYXQoIjogX2ltcGxfeyIpOworICBmb3JtYXQuSW5kZW50KCk7CisgIGNvbnN0IGNoYXIqIGZpZWxkX3NlcCA9ICIgIjsKKyAgY29uc3QgYXV0byBwdXRfc2VwID0gWyZdIHsKKyAgICBmb3JtYXQoIlxuJDEkICIsIGZpZWxkX3NlcCk7CisgICAgZmllbGRfc2VwID0gIiwiOworICB9OworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIHB1dF9zZXAoKTsKKyAgICBmb3JtYXQoIi8qZGVjbHR5cGUoJGV4dGVuc2lvbnMkKSove30iKTsKKyAgfQorICBpZiAoIWlubGluZWRfc3RyaW5nX2luZGljZXNfLmVtcHR5KCkpIHsKKyAgICBwdXRfc2VwKCk7CisgICAgZm9ybWF0KCIvKmRlY2x0eXBlKCRpbmxpbmVkX3N0cmluZ19kb25hdGVkX2FycmF5JCkqL3t9Iik7CisgIH0KKyAgaWYgKCFoYXNfYml0X2luZGljZXNfLmVtcHR5KCkpIHsKKyAgICBwdXRfc2VwKCk7CisgICAgZm9ybWF0KCIvKmRlY2x0eXBlKCRoYXNfYml0cyQpKi97fSIpOworICAgIGlmIChuZWVkX3RvX2VtaXRfY2FjaGVkX3NpemUpIHsKKyAgICAgIHB1dF9zZXAoKTsKKyAgICAgIGZvcm1hdCgiLypkZWNsdHlwZSgkY2FjaGVkX3NpemUkKSove30iKTsKKyAgICAgIG5lZWRfdG9fZW1pdF9jYWNoZWRfc2l6ZSA9IGZhbHNlOworICAgIH0KKyAgfQorICBmb3IgKGF1dG8gZmllbGQgOiBvcHRpbWl6ZWRfb3JkZXJfKSB7CisgICAgaWYgKFNob3VsZFNwbGl0KGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwdXRfc2VwKCk7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUNvbnN0ZXhwckFnZ3JlZ2F0ZUluaXRpYWxpemVyKAorICAgICAgICBwcmludGVyKTsKKyAgfQorICBpZiAoU2hvdWxkU3BsaXQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIHB1dF9zZXAoKTsKKyAgICBmb3JtYXQoIi8qZGVjbHR5cGUoJHNwbGl0JCkqLyYkMSQuX2luc3RhbmNlIiwKKyAgICAgICAgICAgRGVmYXVsdEluc3RhbmNlTmFtZShkZXNjcmlwdG9yXywgb3B0aW9uc18sIC8qc3BsaXQ9Ki90cnVlKSk7CisgIH0KKworICBmb3IgKGF1dG8gb25lb2YgOiBPbmVPZlJhbmdlKGRlc2NyaXB0b3JfKSkgeworICAgIHB1dF9zZXAoKTsKKyAgICBmb3JtYXQoIi8qZGVjbHR5cGUoX2ltcGxfLiQxJF8pKi97fSIsIG9uZW9mLT5uYW1lKCkpOworICB9CisKKyAgaWYgKG5lZWRfdG9fZW1pdF9jYWNoZWRfc2l6ZSkgeworICAgIHB1dF9zZXAoKTsKKyAgICBmb3JtYXQoIi8qZGVjbHR5cGUoJGNhY2hlZF9zaXplJCkqL3t9Iik7CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPnJlYWxfb25lb2ZfZGVjbF9jb3VudCgpICE9IDApIHsKKyAgICBwdXRfc2VwKCk7CisgICAgZm9ybWF0KCIvKmRlY2x0eXBlKCRvbmVvZl9jYXNlJCkqL3t9Iik7CisgIH0KKworICBpZiAobnVtX3dlYWtfZmllbGRzXykgeworICAgIHB1dF9zZXAoKTsKKyAgICBmb3JtYXQoIi8qZGVjbHR5cGUoJHdlYWtfZmllbGRfbWFwJCkqL3t9Iik7CisgIH0KKworICBpZiAoSXNBbnlNZXNzYWdlKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHsKKyAgICBwdXRfc2VwKCk7CisgICAgZm9ybWF0KAorICAgICAgICAiLypkZWNsdHlwZSgkYW55X21ldGFkYXRhJCkqL3smX2ltcGxfLnR5cGVfdXJsXywgIgorICAgICAgICAiJl9pbXBsXy52YWx1ZV99Iik7CisgIH0KKworICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoIn0ge31cbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yQm9keShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworCisgIGNvbnN0IFJ1bk1hcCBydW5zID0KKyAgICAgIEZpbmRSdW5zKG9wdGltaXplZF9vcmRlcl8sIFt0aGlzXShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgICAgICAgIHJldHVybiBJc1BPRChmaWVsZCkgJiYgIVNob3VsZFNwbGl0KGZpZWxkLCBvcHRpb25zXyk7CisgICAgICB9KTsKKworICBzdGQ6OnN0cmluZyBwb2RfdGVtcGxhdGUgPQorICAgICAgIjo6bWVtY3B5KCYkZmlyc3QkLCAmZnJvbS4kZmlyc3QkLFxuIgorICAgICAgIiAgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZWludGVycHJldF9jYXN0PGNoYXIqPigmJGxhc3QkKSAtXG4iCisgICAgICAiICByZWludGVycHJldF9jYXN0PGNoYXIqPigmJGZpcnN0JCkpICsgc2l6ZW9mKCRsYXN0JCkpO1xuIjsKKworICBpZiAoU2hvdWxkU3BsaXQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgiaWYgKCFmcm9tLklzU3BsaXRNZXNzYWdlRGVmYXVsdCgpKSB7XG4iKTsKKyAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgZm9ybWF0KCJfdGhpcy0+UHJlcGFyZVNwbGl0TWVzc2FnZUZvcldyaXRlKCk7XG4iKTsKKyAgICBmb3IgKGF1dG8gZmllbGQgOiBvcHRpbWl6ZWRfb3JkZXJfKSB7CisgICAgICBpZiAoU2hvdWxkU3BsaXQoZmllbGQsIG9wdGlvbnNfKSkgeworICAgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICBmb3JtYXQoIn1cbiIpOworICB9CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcHRpbWl6ZWRfb3JkZXJfLnNpemUoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG9wdGltaXplZF9vcmRlcl9baV07CisgICAgaWYgKFNob3VsZFNwbGl0KGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBjb25zdCBhdXRvIGl0ID0gcnVucy5maW5kKGZpZWxkKTsKKworICAgIC8vIFdlIG9ubHkgYXBwbHkgdGhlIG1lbXNldCB0ZWNobmlxdWUgdG8gcnVucyBvZiBtb3JlIHRoYW4gb25lIGZpZWxkLCBhcworICAgIC8vIGFzc2lnbm1lbnQgaXMgYmV0dGVyIHRoYW4gbWVtc2V0IGZvciBnZW5lcmF0ZWQgY29kZSBjbGFyaXR5LgorICAgIGlmIChpdCAhPSBydW5zLmVuZCgpICYmIGl0LT5zZWNvbmQgPiAxKSB7CisgICAgICAvLyBVc2UgYSBtZW1zZXQsIHRoZW4gc2tpcCBydW5fbGVuZ3RoIGZpZWxkcy4KKyAgICAgIGNvbnN0IHNpemVfdCBydW5fbGVuZ3RoID0gaXQtPnNlY29uZDsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpcnN0X2ZpZWxkX25hbWUgPQorICAgICAgICAgIEZpZWxkTWVtYmVyTmFtZShmaWVsZCwgLypjb2xkPSovZmFsc2UpOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGFzdF9maWVsZF9uYW1lID0KKyAgICAgICAgICBGaWVsZE1lbWJlck5hbWUob3B0aW1pemVkX29yZGVyX1tpICsgcnVuX2xlbmd0aCAtIDFdLCAvKmNvbGQ9Ki9mYWxzZSk7CisKKyAgICAgIGZvcm1hdC5TZXQoImZpcnN0IiwgZmlyc3RfZmllbGRfbmFtZSk7CisgICAgICBmb3JtYXQuU2V0KCJsYXN0IiwgbGFzdF9maWVsZF9uYW1lKTsKKworICAgICAgZm9ybWF0KHBvZF90ZW1wbGF0ZS5jX3N0cigpKTsKKworICAgICAgaSArPSBydW5fbGVuZ3RoIC0gMTsKKyAgICAgIC8vICsraSBhdCB0aGUgdG9wIG9mIHRoZSBsb29wLgorICAgIH0gZWxzZSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVN0cnVjdG9ycyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworCisgIGZvcm1hdCgKKyAgICAgICIkY2xhc3NuYW1lJDo6JGNsYXNzbmFtZSQoOjokcHJvdG9fbnMkOjpBcmVuYSogYXJlbmEsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZClcbiIKKyAgICAgICIgIDogJDEkKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7XG4iLAorICAgICAgU3VwZXJDbGFzc05hbWUoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSk7CisKKyAgaWYgKCFIYXNTaW1wbGVCYXNlQ2xhc3MoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgiICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTtcbiIpOworICAgIGlmIChOZWVkc0FyZW5hRGVzdHJ1Y3RvcigpID09IEFyZW5hRHRvck5lZWRzOjprUmVxdWlyZWQpIHsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAiICBpZiAoYXJlbmEgIT0gbnVsbHB0ciAmJiAhaXNfbWVzc2FnZV9vd25lZCkge1xuIgorICAgICAgICAgICIgICAgYXJlbmEtPk93bkN1c3RvbURlc3RydWN0b3IodGhpcywgJiRjbGFzc25hbWUkOjpBcmVuYUR0b3IpO1xuIgorICAgICAgICAgICIgIH1cbiIpOworICAgIH0KKyAgfQorICBmb3JtYXQoCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIik7CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzOworICBTZXRVbmtub3duRmllbGRzVmFyaWFibGUoZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCAmdmFycyk7CisgIGZvcm1hdC5BZGRNYXAodmFycyk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGNvcHkgY29uc3RydWN0b3IuCisgIGlmIChVc2luZ0ltcGxpY2l0V2Vha0ZpZWxkcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAvLyBJZiB3ZSBhcmUgaW4gbGl0ZSBtb2RlIGFuZCB1c2luZyBpbXBsaWNpdCB3ZWFrIGZpZWxkcywgd2UgZ2VuZXJhdGUgYQorICAgIC8vIG9uZS1saW5lciBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgZGVsZWdhdGVzIHRvIE1lcmdlRnJvbS4gVGhpcyBzYXZlcyBzb21lCisgICAgLy8gY29kZSBzaXplIGFuZCBhbHNvIGN1dHMgZG93biBvbiB0aGUgY29tcGxleGl0eSBvZiBpbXBsaWNpdCB3ZWFrIGZpZWxkcy4KKyAgICAvLyBXZSBtaWdodCBldmVudHVhbGx5IHdhbnQgdG8gZG8gdGhpcyBmb3IgYWxsIGxpdGUgcHJvdG9zLgorICAgIGZvcm1hdCgKKyAgICAgICAgIiRjbGFzc25hbWUkOjokY2xhc3NuYW1lJChjb25zdCAkY2xhc3NuYW1lJCYgZnJvbSlcbiIKKyAgICAgICAgIiAgOiAkY2xhc3NuYW1lJCgpIHtcbiIKKyAgICAgICAgIiAgTWVyZ2VGcm9tKGZyb20pO1xuIgorICAgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KAorICAgICAgICAiJGNsYXNzbmFtZSQ6OiRjbGFzc25hbWUkKGNvbnN0ICRjbGFzc25hbWUkJiBmcm9tKVxuIgorICAgICAgICAiICA6ICRzdXBlcmNsYXNzJCgpIHtcbiIpOworICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgICBmb3JtYXQoIiRjbGFzc25hbWUkKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzO1xuIik7CisKKyAgICBpZiAoSGFzSW1wbERhdGEoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgICAgY29uc3QgY2hhciogZmllbGRfc2VwID0gIiAiOworICAgICAgY29uc3QgYXV0byBwdXRfc2VwID0gWyZdIHsKKyAgICAgICAgZm9ybWF0KCJcbiQxJCAiLCBmaWVsZF9zZXApOworICAgICAgICBmaWVsZF9zZXAgPSAiLCI7CisgICAgICB9OworCisgICAgICBmb3JtYXQoIm5ldyAoJl9pbXBsXykgSW1wbF97Iik7CisgICAgICBmb3JtYXQuSW5kZW50KCk7CisKKyAgICAgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgICAgIHB1dF9zZXAoKTsKKyAgICAgICAgZm9ybWF0KCIvKmRlY2x0eXBlKCRleHRlbnNpb25zJCkqL3t9Iik7CisgICAgICB9CisgICAgICBpZiAoIWlubGluZWRfc3RyaW5nX2luZGljZXNfLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gRG8gbm90IGNvcHkgaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8sIGJlY2F1c2UgdGhpcyBpcyBub3QgYW4gYXJlbmEKKyAgICAgICAgLy8gY29uc3RydWN0b3IuCisgICAgICAgIHB1dF9zZXAoKTsKKyAgICAgICAgZm9ybWF0KCJkZWNsdHlwZSgkaW5saW5lZF9zdHJpbmdfZG9uYXRlZF9hcnJheSQpe30iKTsKKyAgICAgIH0KKyAgICAgIGJvb2wgbmVlZF90b19lbWl0X2NhY2hlZF9zaXplID0KKyAgICAgICAgICAhSGFzU2ltcGxlQmFzZUNsYXNzKGRlc2NyaXB0b3JfLCBvcHRpb25zXyk7CisgICAgICBpZiAoIWhhc19iaXRfaW5kaWNlc18uZW1wdHkoKSkgeworICAgICAgICBwdXRfc2VwKCk7CisgICAgICAgIGZvcm1hdCgiZGVjbHR5cGUoJGhhc19iaXRzJCl7ZnJvbS4kaGFzX2JpdHMkfSIpOworICAgICAgICBpZiAobmVlZF90b19lbWl0X2NhY2hlZF9zaXplKSB7CisgICAgICAgICAgcHV0X3NlcCgpOworICAgICAgICAgIGZvcm1hdCgiLypkZWNsdHlwZSgkY2FjaGVkX3NpemUkKSove30iKTsKKyAgICAgICAgICBuZWVkX3RvX2VtaXRfY2FjaGVkX3NpemUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBJbml0aWFsaXplIG1lbWJlciB2YXJpYWJsZXMgd2l0aCBhcmVuYSBjb25zdHJ1Y3Rvci4KKyAgICAgIGZvciAoYXV0byBmaWVsZCA6IG9wdGltaXplZF9vcmRlcl8pIHsKKyAgICAgICAgaWYgKFNob3VsZFNwbGl0KGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBwdXRfc2VwKCk7CisgICAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVDb3B5QWdncmVnYXRlSW5pdGlhbGl6ZXIocHJpbnRlcik7CisgICAgICB9CisgICAgICBpZiAoU2hvdWxkU3BsaXQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgICAgICBwdXRfc2VwKCk7CisgICAgICAgIGZvcm1hdCgiZGVjbHR5cGUoJHNwbGl0JCl7cmVpbnRlcnByZXRfY2FzdDxJbXBsXzo6U3BsaXQqPigmJDEkKX0iLAorICAgICAgICAgICAgICAgRGVmYXVsdEluc3RhbmNlTmFtZShkZXNjcmlwdG9yXywgb3B0aW9uc18sIC8qc3BsaXQ9Ki90cnVlKSk7CisgICAgICB9CisgICAgICBmb3IgKGF1dG8gb25lb2YgOiBPbmVPZlJhbmdlKGRlc2NyaXB0b3JfKSkgeworICAgICAgICBwdXRfc2VwKCk7CisgICAgICAgIGZvcm1hdCgiZGVjbHR5cGUoX2ltcGxfLiQxJF8pe30iLCBvbmVvZi0+bmFtZSgpKTsKKyAgICAgIH0KKworICAgICAgaWYgKG5lZWRfdG9fZW1pdF9jYWNoZWRfc2l6ZSkgeworICAgICAgICBwdXRfc2VwKCk7CisgICAgICAgIGZvcm1hdCgiLypkZWNsdHlwZSgkY2FjaGVkX3NpemUkKSove30iKTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlc2NyaXB0b3JfLT5yZWFsX29uZW9mX2RlY2xfY291bnQoKSAhPSAwKSB7CisgICAgICAgIHB1dF9zZXAoKTsKKyAgICAgICAgZm9ybWF0KCIvKmRlY2x0eXBlKCRvbmVvZl9jYXNlJCkqL3t9Iik7CisgICAgICB9CisgICAgICBpZiAobnVtX3dlYWtfZmllbGRzXyA+IDApIHsKKyAgICAgICAgcHV0X3NlcCgpOworICAgICAgICBmb3JtYXQoImRlY2x0eXBlKCR3ZWFrX2ZpZWxkX21hcCQpe2Zyb20uJHdlYWtfZmllbGRfbWFwJH0iKTsKKyAgICAgIH0KKyAgICAgIGlmIChJc0FueU1lc3NhZ2UoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgICAgICBwdXRfc2VwKCk7CisgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICIvKmRlY2x0eXBlKCRhbnlfbWV0YWRhdGEkKSoveyZfaW1wbF8udHlwZV91cmxfLCAmX2ltcGxfLnZhbHVlX30iKTsKKyAgICAgIH0KKyAgICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgICBmb3JtYXQoIn07XG5cbiIpOworICAgIH0KKworICAgIGZvcm1hdCgKKyAgICAgICAgIl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPCR1bmtub3duX2ZpZWxkc190eXBlJD4oZnJvbS5faW50ZXJuYWxfIgorICAgICAgICAibWV0YWRhdGFfKTtcbiIpOworCisgICAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAiJGV4dGVuc2lvbnMkLk1lcmdlRnJvbShpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCksICIKKyAgICAgICAgICAiZnJvbS4kZXh0ZW5zaW9ucyQpO1xuIik7CisgICAgfQorCisgICAgR2VuZXJhdGVDb3B5Q29uc3RydWN0b3JCb2R5KHByaW50ZXIpOworCisgICAgLy8gQ29weSBvbmVvZiBmaWVsZHMuIE9uZW9mIGZpZWxkIHJlcXVpcmVzIG9uZW9mIGNhc2UgY2hlY2suCisgICAgZm9yIChhdXRvIG9uZW9mIDogT25lT2ZSYW5nZShkZXNjcmlwdG9yXykpIHsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAiY2xlYXJfaGFzXyQxJCgpO1xuIgorICAgICAgICAgICJzd2l0Y2ggKGZyb20uJDEkX2Nhc2UoKSkge1xuIiwKKyAgICAgICAgICBvbmVvZi0+bmFtZSgpKTsKKyAgICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgICAgIGZvciAoYXV0byBmaWVsZCA6IEZpZWxkUmFuZ2Uob25lb2YpKSB7CisgICAgICAgIGZvcm1hdCgiY2FzZSBrJDEkOiB7XG4iLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGZpZWxkLT5uYW1lKCksIHRydWUpKTsKKyAgICAgICAgZm9ybWF0LkluZGVudCgpOworICAgICAgICBpZiAoIUlzRmllbGRTdHJpcHBlZChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZU1lcmdpbmdDb2RlKHByaW50ZXIpOworICAgICAgICB9CisgICAgICAgIGZvcm1hdCgiYnJlYWs7XG4iKTsKKyAgICAgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICAgICAgZm9ybWF0KCJ9XG4iKTsKKyAgICAgIH0KKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAiY2FzZSAkMSRfTk9UX1NFVDoge1xuIgorICAgICAgICAgICIgIGJyZWFrO1xuIgorICAgICAgICAgICJ9XG4iLAorICAgICAgICAgIFRvVXBwZXIob25lb2YtPm5hbWUoKSkpOworICAgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICAgIGZvcm1hdCgifVxuIik7CisgICAgfQorCisgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICBmb3JtYXQoCisgICAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOiRmdWxsX25hbWUkKVxuIgorICAgICAgICAifVxuIgorICAgICAgICAiXG4iKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBzaGFyZWQgY29uc3RydWN0b3IgY29kZS4KKyAgR2VuZXJhdGVTaGFyZWRDb25zdHJ1Y3RvckNvZGUocHJpbnRlcik7CisKKyAgaWYgKFNob3VsZFNwbGl0KGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHsKKyAgICBHZW5lcmF0ZUNyZWF0ZVNwbGl0TWVzc2FnZShwcmludGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBkZXN0cnVjdG9yLgorICBpZiAoIUhhc1NpbXBsZUJhc2VDbGFzcyhkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiJGNsYXNzbmFtZSQ6On4kY2xhc3NuYW1lJCgpIHtcbiIKKyAgICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6JGZ1bGxfbmFtZSQpXG4iKTsKKyAgICBmb3JtYXQoCisgICAgICAgICIgIGlmIChhdXRvICphcmVuYSA9ICIKKyAgICAgICAgIl9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8JHVua25vd25fZmllbGRzX3R5cGUkPigpKSB7XG4iCisgICAgICAgICIgICh2b2lkKWFyZW5hO1xuIik7CisgICAgaWYgKE5lZWRzQXJlbmFEZXN0cnVjdG9yKCkgPiBBcmVuYUR0b3JOZWVkczo6a05vbmUpIHsKKyAgICAgIGZvcm1hdCgiICAgIEFyZW5hRHRvcih0aGlzKTtcbiIpOworICAgIH0KKyAgICBmb3JtYXQoCisgICAgICAgICIgICAgcmV0dXJuO1xuIgorICAgICAgICAiICB9XG4iKTsKKyAgICBmb3JtYXQoCisgICAgICAgICIgIFNoYXJlZER0b3IoKTtcbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgIlxuIik7CisgIH0gZWxzZSB7CisgICAgLy8gRm9yIG1lc3NhZ2VzIHVzaW5nIHNpbXBsZSBiYXNlIGNsYXNzZXMsIGhhdmluZyBubyBkZXN0cnVjdG9yCisgICAgLy8gYWxsb3dzIG91ciB2dGFibGUgdG8gc2hhcmUgdGhlIHNhbWUgZGVzdHJ1Y3RvciBhcyBldmVyeSBvdGhlcgorICAgIC8vIG1lc3NhZ2Ugd2l0aCBhIHNpbXBsZSBiYXNlIGNsYXNzLiAgVGhpcyB3b3JrcyBvbmx5IGFzIGxvbmcgYXMKKyAgICAvLyB3ZSBoYXZlIG5vIGZpZWxkcyBuZWVkaW5nIGRlc3RydWN0aW9uLCBvZiBjb3Vyc2UuICAoTm8gc3RyaW5ncworICAgIC8vIG9yIGV4dGVuc2lvbnMpCisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgc2hhcmVkIGRlc3RydWN0b3IgY29kZS4KKyAgR2VuZXJhdGVTaGFyZWREZXN0cnVjdG9yQ29kZShwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgYXJlbmEtc3BlY2lmaWMgZGVzdHJ1Y3RvciBjb2RlLgorICBpZiAoTmVlZHNBcmVuYURlc3RydWN0b3IoKSA+IEFyZW5hRHRvck5lZWRzOjprTm9uZSkgeworICAgIEdlbmVyYXRlQXJlbmFEZXN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgfQorCisgIGlmICghSGFzU2ltcGxlQmFzZUNsYXNzKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHsKKyAgICAvLyBHZW5lcmF0ZSBTZXRDYWNoZWRTaXplLgorICAgIGZvcm1hdCgKKyAgICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHtcbiIKKyAgICAgICAgIiAgJGNhY2hlZF9zaXplJC5TZXQoc2l6ZSk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlU291cmNlSW5Qcm90bzJOYW1lc3BhY2UoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgInRlbXBsYXRlPD4gIgorICAgICAgIlBST1RPQlVGX05PSU5MSU5FICRjbGFzc3R5cGUkKlxuIgorICAgICAgIkFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8ICRjbGFzc3R5cGUkID4oQXJlbmEqIGFyZW5hKSB7XG4iCisgICAgICAiICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDwgJGNsYXNzdHlwZSQgPihhcmVuYSk7XG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVDbGVhcihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoSGFzU2ltcGxlQmFzZUNsYXNzKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHJldHVybjsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKworICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgd2Ugd2lsbCBtZW1zZXQgdG8gemVybyB3aXRob3V0IGNoZWNraW5nIHRoZWlyCisgIC8vIGhhc2JpdCB0byBzZWUgaWYgYSB6ZXJvLWluaXQgaXMgbmVjZXNzYXJ5LgorICBjb25zdCBpbnQga01heFVuY29uZGl0aW9uYWxQcmltaXRpdmVCeXRlc0NsZWFyID0gNDsKKworICBmb3JtYXQoCisgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6Q2xlYXIoKSB7XG4iCisgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6JGZ1bGxfbmFtZSQpXG4iKTsKKyAgZm9ybWF0LkluZGVudCgpOworCisgIGZvcm1hdCgKKyAgICAgIC8vIFRPRE8oandiKTogSXQgd291bGQgYmUgYmV0dGVyIHRvIGF2b2lkIGVtaXR0aW5nIHRoaXMgaWYgaXQgaXMgbm90IHVzZWQsCisgICAgICAvLyByYXRoZXIgdGhhbiBlbWl0dGluZyBhIHdvcmthcm91bmQgZm9yIHRoZSByZXN1bHRpbmcgd2FybmluZy4KKyAgICAgICIkdWludDMyJCBjYWNoZWRfaGFzX2JpdHMgPSAwO1xuIgorICAgICAgIi8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZFxuIgorICAgICAgIih2b2lkKSBjYWNoZWRfaGFzX2JpdHM7XG5cbiIpOworCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgZm9ybWF0KCIkZXh0ZW5zaW9ucyQuQ2xlYXIoKTtcbiIpOworICB9CisKKyAgLy8gQ29sbGVjdCBmaWVsZHMgaW50byBjaHVua3MuIEVhY2ggY2h1bmsgbWF5IGhhdmUgYW4gaWYoKSBjb25kaXRpb24gdGhhdAorICAvLyBjaGVja3MgYWxsIGhhc2JpdHMgaW4gdGhlIGNodW5rIGFuZCBza2lwcyBpdCBpZiBub25lIGFyZSBzZXQuCisgIGludCB6ZXJvX2luaXRfYnl0ZXMgPSAwOworICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogb3B0aW1pemVkX29yZGVyXykgeworICAgIGlmIChDYW5Jbml0aWFsaXplQnlaZXJvaW5nKGZpZWxkKSkgeworICAgICAgemVyb19pbml0X2J5dGVzICs9IEVzdGltYXRlQWxpZ25tZW50U2l6ZShmaWVsZCk7CisgICAgfQorICB9CisgIGJvb2wgbWVyZ2VfemVyb19pbml0ID0gemVyb19pbml0X2J5dGVzID4ga01heFVuY29uZGl0aW9uYWxQcmltaXRpdmVCeXRlc0NsZWFyOworICBpbnQgY2h1bmtfY291bnQgPSAwOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+PiBjaHVua3MgPSBDb2xsZWN0RmllbGRzKAorICAgICAgb3B0aW1pemVkX29yZGVyXywKKyAgICAgIFsmXShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGEsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYikgLT4gYm9vbCB7CisgICAgICAgIGNodW5rX2NvdW50Kys7CisgICAgICAgIC8vIFRoaXMgcHJlZGljYXRlIGd1YXJhbnRlZXMgdGhhdCB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHplcm8taW5pdAorICAgICAgICAvLyAobWVtc2V0KSBwZXIgY2h1bmssIGFuZCBpZiBwcmVzZW50IGl0IHdpbGwgYmUgYXQgdGhlIGJlZ2lubmluZy4KKyAgICAgICAgYm9vbCBzYW1lID0gSGFzQnl0ZUluZGV4KGEpID09IEhhc0J5dGVJbmRleChiKSAmJgorICAgICAgICAgICAgICAgICAgICBhLT5pc19yZXBlYXRlZCgpID09IGItPmlzX3JlcGVhdGVkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgU2hvdWxkU3BsaXQoYSwgb3B0aW9uc18pID09IFNob3VsZFNwbGl0KGIsIG9wdGlvbnNfKSAmJgorICAgICAgICAgICAgICAgICAgICAoQ2FuSW5pdGlhbGl6ZUJ5WmVyb2luZyhhKSA9PSBDYW5Jbml0aWFsaXplQnlaZXJvaW5nKGIpIHx8CisgICAgICAgICAgICAgICAgICAgICAoQ2FuSW5pdGlhbGl6ZUJ5WmVyb2luZyhhKSAmJgorICAgICAgICAgICAgICAgICAgICAgIChjaHVua19jb3VudCA9PSAxIHx8IG1lcmdlX3plcm9faW5pdCkpKTsKKyAgICAgICAgaWYgKCFzYW1lKSBjaHVua19jb3VudCA9IDA7CisgICAgICAgIHJldHVybiBzYW1lOworICAgICAgfSk7CisKKyAgQ29sZENodW5rU2tpcHBlciBjb2xkX3NraXBwZXIoZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCBjaHVua3MsIGhhc19iaXRfaW5kaWNlc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDb2xkUmF0aW8pOworICBpbnQgY2FjaGVkX2hhc193b3JkX2luZGV4ID0gLTE7CisKKyAgZm9yIChpbnQgY2h1bmtfaW5kZXggPSAwOyBjaHVua19pbmRleCA8IGNodW5rcy5zaXplKCk7IGNodW5rX2luZGV4KyspIHsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgY2h1bmsgPSBjaHVua3NbY2h1bmtfaW5kZXhdOworICAgIGNvbGRfc2tpcHBlci5PblN0YXJ0Q2h1bmsoY2h1bmtfaW5kZXgsIGNhY2hlZF9oYXNfd29yZF9pbmRleCwgIiIsIHByaW50ZXIpOworCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtZW1zZXRfc3RhcnQgPSBudWxscHRyOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWVtc2V0X2VuZCA9IG51bGxwdHI7CisgICAgYm9vbCBzYXdfbm9uX3plcm9faW5pdCA9IGZhbHNlOworICAgIGJvb2wgY2h1bmtfaXNfY29sZCA9ICFjaHVuay5lbXB0eSgpICYmIFNob3VsZFNwbGl0KGNodW5rLmZyb250KCksIG9wdGlvbnNfKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogY2h1bmspIHsKKyAgICAgIGlmIChDYW5Jbml0aWFsaXplQnlaZXJvaW5nKGZpZWxkKSkgeworICAgICAgICBHT09HTEVfQ0hFQ0soIXNhd19ub25femVyb19pbml0KTsKKyAgICAgICAgaWYgKCFtZW1zZXRfc3RhcnQpIG1lbXNldF9zdGFydCA9IGZpZWxkOworICAgICAgICBtZW1zZXRfZW5kID0gZmllbGQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYXdfbm9uX3plcm9faW5pdCA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gV2hldGhlciB3ZSB3cmFwIHRoaXMgY2h1bmsgaW46CisgICAgLy8gICBpZiAoY2FjaGVkX2hhc19iaXRzICYgPGNodW5rIGhhc2JpdHMpIHsgLyogY2h1bmsuICovIH0KKyAgICAvLyBXZSBjYW4gb21pdCB0aGUgaWYoKSBmb3IgY2h1bmsgc2l6ZSAxLCBvciBpZiBvdXIgZmllbGRzIGRvIG5vdCBoYXZlCisgICAgLy8gaGFzYml0cy4gSSBkb24ndCB1bmRlcnN0YW5kIHRoZSByYXRpb25hbGUgZm9yIHRoZSBsYXN0IHBhcnQgb2YgdGhlCisgICAgLy8gY29uZGl0aW9uLCBidXQgaXQgbWF0Y2hlcyB0aGUgb2xkIGxvZ2ljLgorICAgIGNvbnN0IGJvb2wgaGF2ZV9vdXRlcl9pZiA9IEhhc0JpdEluZGV4KGNodW5rLmZyb250KCkpICE9IGtOb0hhc2JpdCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLnNpemUoKSA+IDEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVtc2V0X2VuZCAhPSBjaHVuay5iYWNrKCkgfHwgbWVyZ2VfemVyb19pbml0KTsKKworICAgIGlmIChoYXZlX291dGVyX2lmKSB7CisgICAgICAvLyBFbWl0IGFuIGlmKCkgdGhhdCB3aWxsIGxldCB1cyBza2lwIHRoZSB3aG9sZSBjaHVuayBpZiBub25lIGFyZSBzZXQuCisgICAgICB1aW50MzJfdCBjaHVua19tYXNrID0gR2VuQ2h1bmtNYXNrKGNodW5rLCBoYXNfYml0X2luZGljZXNfKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGNodW5rX21hc2tfc3RyID0KKyAgICAgICAgICBTdHJDYXQoc3RyaW5nczo6SGV4KGNodW5rX21hc2ssIHN0cmluZ3M6OlpFUk9fUEFEXzgpKTsKKworICAgICAgLy8gQ2hlY2sgKHVwIHRvKSA4IGhhc19iaXRzIGF0IGEgdGltZSBpZiB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgZmllbGQgaW4KKyAgICAgIC8vIHRoaXMgY2h1bmsuICBEdWUgdG8gZmllbGQgbGF5b3V0IG9yZGVyaW5nLCB3ZSBtYXkgY2hlY2sKKyAgICAgIC8vIF9oYXNfYml0c19bbGFzdF9jaHVuayAqIDggLyAzMl0gbXVsdGlwbGUgdGltZXMuCisgICAgICBHT09HTEVfRENIRUNLX0xFKDIsIHBvcGNudChjaHVua19tYXNrKSk7CisgICAgICBHT09HTEVfRENIRUNLX0dFKDgsIHBvcGNudChjaHVua19tYXNrKSk7CisKKyAgICAgIGlmIChjYWNoZWRfaGFzX3dvcmRfaW5kZXggIT0gSGFzV29yZEluZGV4KGNodW5rLmZyb250KCkpKSB7CisgICAgICAgIGNhY2hlZF9oYXNfd29yZF9pbmRleCA9IEhhc1dvcmRJbmRleChjaHVuay5mcm9udCgpKTsKKyAgICAgICAgZm9ybWF0KCJjYWNoZWRfaGFzX2JpdHMgPSAkaGFzX2JpdHMkWyQxJF07XG4iLCBjYWNoZWRfaGFzX3dvcmRfaW5kZXgpOworICAgICAgfQorICAgICAgZm9ybWF0KCJpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgkMSR1KSB7XG4iLCBjaHVua19tYXNrX3N0cik7CisgICAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgfQorCisgICAgaWYgKGNodW5rX2lzX2NvbGQpIHsKKyAgICAgIGZvcm1hdCgiaWYgKCFJc1NwbGl0TWVzc2FnZURlZmF1bHQoKSkge1xuIik7CisgICAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgfQorCisgICAgaWYgKG1lbXNldF9zdGFydCkgeworICAgICAgaWYgKG1lbXNldF9zdGFydCA9PSBtZW1zZXRfZW5kKSB7CisgICAgICAgIC8vIEZvciBjbGFyaXR5LCBkbyBub3QgbWVtc2V0IGEgc2luZ2xlIGZpZWxkLgorICAgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQobWVtc2V0X3N0YXJ0KQorICAgICAgICAgICAgLkdlbmVyYXRlTWVzc2FnZUNsZWFyaW5nQ29kZShwcmludGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdPT0dMRV9DSEVDS19FUShjaHVua19pc19jb2xkLCBTaG91bGRTcGxpdChtZW1zZXRfc3RhcnQsIG9wdGlvbnNfKSk7CisgICAgICAgIEdPT0dMRV9DSEVDS19FUShjaHVua19pc19jb2xkLCBTaG91bGRTcGxpdChtZW1zZXRfZW5kLCBvcHRpb25zXykpOworICAgICAgICBmb3JtYXQoCisgICAgICAgICAgICAiOjptZW1zZXQoJiQxJCwgMCwgc3RhdGljX2Nhc3Q8c2l6ZV90PihcbiIKKyAgICAgICAgICAgICIgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJiQyJCkgLVxuIgorICAgICAgICAgICAgIiAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmJDEkKSkgKyBzaXplb2YoJDIkKSk7XG4iLAorICAgICAgICAgICAgRmllbGRNZW1iZXJOYW1lKG1lbXNldF9zdGFydCwgY2h1bmtfaXNfY29sZCksCisgICAgICAgICAgICBGaWVsZE1lbWJlck5hbWUobWVtc2V0X2VuZCwgY2h1bmtfaXNfY29sZCkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIENsZWFyIGFsbCBub24temVyby1pbml0aWFsaXphYmxlIGZpZWxkcyBpbiB0aGUgY2h1bmsuCisgICAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IGNodW5rKSB7CisgICAgICBpZiAoQ2FuSW5pdGlhbGl6ZUJ5WmVyb2luZyhmaWVsZCkpIGNvbnRpbnVlOworICAgICAgLy8gSXQncyBmYXN0ZXIgdG8ganVzdCBvdmVyd3JpdGUgcHJpbWl0aXZlIHR5cGVzLCBidXQgd2Ugc2hvdWxkIG9ubHkKKyAgICAgIC8vIGNsZWFyIHN0cmluZ3MgYW5kIG1lc3NhZ2VzIGlmIHRoZXkgd2VyZSBzZXQuCisgICAgICAvLworICAgICAgLy8gVE9ETyhrZW50b24pOiAgTGV0IHRoZSBDcHBGaWVsZEdlbmVyYXRvciBkZWNpZGUgdGhpcyBzb21laG93LgorICAgICAgYm9vbCBoYXZlX2VuY2xvc2luZ19pZiA9CisgICAgICAgICAgSGFzQml0SW5kZXgoZmllbGQpICE9IGtOb0hhc2JpdCAmJgorICAgICAgICAgIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSB8fAorICAgICAgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HKTsKKworICAgICAgaWYgKGhhdmVfZW5jbG9zaW5nX2lmKSB7CisgICAgICAgIFByaW50UHJlc2VuY2VDaGVjayhmb3JtYXQsIGZpZWxkLCBoYXNfYml0X2luZGljZXNfLCBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhY2hlZF9oYXNfd29yZF9pbmRleCk7CisgICAgICB9CisKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVNZXNzYWdlQ2xlYXJpbmdDb2RlKHByaW50ZXIpOworCisgICAgICBpZiAoaGF2ZV9lbmNsb3NpbmdfaWYpIHsKKyAgICAgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICAgICAgZm9ybWF0KCJ9XG4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2h1bmtfaXNfY29sZCkgeworICAgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICAgIGZvcm1hdCgifVxuIik7CisgICAgfQorCisgICAgaWYgKGhhdmVfb3V0ZXJfaWYpIHsKKyAgICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgICBmb3JtYXQoIn1cbiIpOworICAgIH0KKworICAgIGlmIChjb2xkX3NraXBwZXIuT25FbmRDaHVuayhjaHVua19pbmRleCwgcHJpbnRlcikpIHsKKyAgICAgIC8vIFJlc2V0IGhlcmUgYXMgaXQgbWF5IGhhdmUgYmVlbiB1cGRhdGVkIGluIGp1c3QgY2xvc2VkIGlmIHN0YXRlbWVudC4KKyAgICAgIGNhY2hlZF9oYXNfd29yZF9pbmRleCA9IC0xOworICAgIH0KKyAgfQorCisgIC8vIFN0ZXAgNDogVW5pb25zLgorICBmb3IgKGF1dG8gb25lb2YgOiBPbmVPZlJhbmdlKGRlc2NyaXB0b3JfKSkgeworICAgIGZvcm1hdCgiY2xlYXJfJDEkKCk7XG4iLCBvbmVvZi0+bmFtZSgpKTsKKyAgfQorCisgIGlmIChudW1fd2Vha19maWVsZHNfKSB7CisgICAgZm9ybWF0KCIkd2Vha19maWVsZF9tYXAkLkNsZWFyQWxsKCk7XG4iKTsKKyAgfQorCisgIC8vIFdlIGRvbid0IGNsZWFyIGRvbmF0ZWQgc3RhdHVzLgorCisgIGlmICghaGFzX2JpdF9pbmRpY2VzXy5lbXB0eSgpKSB7CisgICAgLy8gU3RlcCA1OiBFdmVyeXRoaW5nIGVsc2UuCisgICAgZm9ybWF0KCIkaGFzX2JpdHMkLkNsZWFyKCk7XG4iKTsKKyAgfQorCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgU2V0VW5rbm93bkZpZWxkc1ZhcmlhYmxlKGRlc2NyaXB0b3JfLCBvcHRpb25zXywgJnZhcnMpOworICBmb3JtYXQuQWRkTWFwKHZhcnMpOworICBmb3JtYXQoIl9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8JHVua25vd25fZmllbGRzX3R5cGUkPigpO1xuIik7CisKKyAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgZm9ybWF0KCJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZU9uZW9mQ2xlYXIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gR2VuZXJhdGVkIGZ1bmN0aW9uIGNsZWFycyB0aGUgYWN0aXZlIGZpZWxkIGFuZCB1bmlvbiBjYXNlIChlLmcuIGZvb19jYXNlXykuCisgIGludCBpID0gMDsKKyAgZm9yIChhdXRvIG9uZW9mIDogT25lT2ZSYW5nZShkZXNjcmlwdG9yXykpIHsKKyAgICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICAgIGZvcm1hdC5TZXQoIm9uZW9mbmFtZSIsIG9uZW9mLT5uYW1lKCkpOworCisgICAgZm9ybWF0KAorICAgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6Y2xlYXJfJG9uZW9mbmFtZSQoKSB7XG4iCisgICAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQob25lX29mX2NsZWFyX3N0YXJ0OiRmdWxsX25hbWUkKVxuIik7CisgICAgZm9ybWF0LkluZGVudCgpOworICAgIGZvcm1hdCgic3dpdGNoICgkb25lb2ZuYW1lJF9jYXNlKCkpIHtcbiIpOworICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgICBmb3IgKGF1dG8gZmllbGQgOiBGaWVsZFJhbmdlKG9uZW9mKSkgeworICAgICAgZm9ybWF0KCJjYXNlIGskMSQ6IHtcbiIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSkpOworICAgICAgZm9ybWF0LkluZGVudCgpOworICAgICAgLy8gV2UgY2xlYXIgb25seSBhbGxvY2F0ZWQgb2JqZWN0cyBpbiBvbmVvZnMKKyAgICAgIGlmICghSXNTdHJpbmdPck1lc3NhZ2UoZmllbGQpIHx8IElzRmllbGRTdHJpcHBlZChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgICAgIGZvcm1hdCgiLy8gTm8gbmVlZCB0byBjbGVhclxuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQ2xlYXJpbmdDb2RlKHByaW50ZXIpOworICAgICAgfQorICAgICAgZm9ybWF0KCJicmVhaztcbiIpOworICAgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICAgIGZvcm1hdCgifVxuIik7CisgICAgfQorICAgIGZvcm1hdCgKKyAgICAgICAgImNhc2UgJDEkX05PVF9TRVQ6IHtcbiIKKyAgICAgICAgIiAgYnJlYWs7XG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICBUb1VwcGVyKG9uZW9mLT5uYW1lKCkpKTsKKyAgICBmb3JtYXQuT3V0ZGVudCgpOworICAgIGZvcm1hdCgKKyAgICAgICAgIn1cbiIKKyAgICAgICAgIiRvbmVvZl9jYXNlJFskMSRdID0gJDIkX05PVF9TRVQ7XG4iLAorICAgICAgICBpLCBUb1VwcGVyKG9uZW9mLT5uYW1lKCkpKTsKKyAgICBmb3JtYXQuT3V0ZGVudCgpOworICAgIGZvcm1hdCgKKyAgICAgICAgIn1cbiIKKyAgICAgICAgIlxuIik7CisgICAgaSsrOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTd2FwKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChIYXNTaW1wbGVCYXNlQ2xhc3MoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgcmV0dXJuOworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworCisgIGZvcm1hdCgidm9pZCAkY2xhc3NuYW1lJDo6SW50ZXJuYWxTd2FwKCRjbGFzc25hbWUkKiBvdGhlcikge1xuIik7CisgIGZvcm1hdC5JbmRlbnQoKTsKKyAgZm9ybWF0KCJ1c2luZyBzdGQ6OnN3YXA7XG4iKTsKKworICBpZiAoSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgICAgZm9ybWF0KAorICAgICAgICAgICIkZXh0ZW5zaW9ucyQuSW50ZXJuYWxTd2FwKCZvdGhlci0+JGV4dGVuc2lvbnMkKTsiCisgICAgICAgICAgIlxuIik7CisgICAgfQorCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzOworICAgIFNldFVua25vd25GaWVsZHNWYXJpYWJsZShkZXNjcmlwdG9yXywgb3B0aW9uc18sICZ2YXJzKTsKKyAgICBmb3JtYXQuQWRkTWFwKHZhcnMpOworICAgIGlmIChIYXNOb25TcGxpdE9wdGlvbmFsU3RyaW5nKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAiYXV0byogbGhzX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7XG4iCisgICAgICAgICAgImF1dG8qIHJoc19hcmVuYSA9IG90aGVyLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKTtcbiIpOworICAgIH0KKyAgICBmb3JtYXQoIl9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7XG4iKTsKKworICAgIGlmICghaGFzX2JpdF9pbmRpY2VzXy5lbXB0eSgpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEhhc0JpdHNTaXplKCk7ICsraSkgeworICAgICAgICBmb3JtYXQoInN3YXAoJGhhc19iaXRzJFskMSRdLCBvdGhlci0+JGhhc19iaXRzJFskMSRdKTtcbiIsIGkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHBvc3NpYmxlLCB3ZSBzd2FwIHNldmVyYWwgZmllbGRzIGF0IG9uY2UsIGluY2x1ZGluZyBwYWRkaW5nLgorICAgIGNvbnN0IFJ1bk1hcCBydW5zID0KKyAgICAgICAgRmluZFJ1bnMob3B0aW1pemVkX29yZGVyXywgW3RoaXNdKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgICAgICAgICByZXR1cm4gIVNob3VsZFNwbGl0KGZpZWxkLCBvcHRpb25zXykgJiYKKyAgICAgICAgICAgICAgICAgQ2FuQmVNYW5pcHVsYXRlZEFzUmF3Qnl0ZXMoZmllbGQsIG9wdGlvbnNfLCBzY2NfYW5hbHl6ZXJfKTsKKyAgICAgICAgfSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wdGltaXplZF9vcmRlcl8uc2l6ZSgpOyArK2kpIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBvcHRpbWl6ZWRfb3JkZXJfW2ldOworICAgICAgaWYgKFNob3VsZFNwbGl0KGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjb25zdCBhdXRvIGl0ID0gcnVucy5maW5kKGZpZWxkKTsKKworICAgICAgLy8gV2Ugb25seSBhcHBseSB0aGUgbWVtc3dhcCB0ZWNobmlxdWUgdG8gcnVucyBvZiBtb3JlIHRoYW4gb25lIGZpZWxkLCBhcworICAgICAgLy8gYHN3YXAoZmllbGRfLCBvdGhlci5maWVsZF8pYCBpcyBiZXR0ZXIgdGhhbgorICAgICAgLy8gYG1lbXN3YXA8Li4uPigmZmllbGRfLCAmb3RoZXIuZmllbGRfKWAgZm9yIGdlbmVyYXRlZCBjb2RlIHJlYWRhYmlsaXR5LgorICAgICAgaWYgKGl0ICE9IHJ1bnMuZW5kKCkgJiYgaXQtPnNlY29uZCA+IDEpIHsKKyAgICAgICAgLy8gVXNlIGEgbWVtc3dhcCwgdGhlbiBza2lwIHJ1bl9sZW5ndGggZmllbGRzLgorICAgICAgICBjb25zdCBzaXplX3QgcnVuX2xlbmd0aCA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpcnN0X2ZpZWxkX25hbWUgPQorICAgICAgICAgICAgRmllbGRNZW1iZXJOYW1lKGZpZWxkLCAvKmNvbGQ9Ki9mYWxzZSk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxhc3RfZmllbGRfbmFtZSA9IEZpZWxkTWVtYmVyTmFtZSgKKyAgICAgICAgICAgIG9wdGltaXplZF9vcmRlcl9baSArIHJ1bl9sZW5ndGggLSAxXSwgLypjb2xkPSovZmFsc2UpOworCisgICAgICAgIGZvcm1hdC5TZXQoImZpcnN0IiwgZmlyc3RfZmllbGRfbmFtZSk7CisgICAgICAgIGZvcm1hdC5TZXQoImxhc3QiLCBsYXN0X2ZpZWxkX25hbWUpOworCisgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICI6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Om1lbXN3YXA8XG4iCisgICAgICAgICAgICAiICAgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCgkY2xhc3NuYW1lJCwgJGxhc3QkKVxuIgorICAgICAgICAgICAgIiAgICArIHNpemVvZigkY2xhc3NuYW1lJDo6JGxhc3QkKVxuIgorICAgICAgICAgICAgIiAgICAtIFBST1RPQlVGX0ZJRUxEX09GRlNFVCgkY2xhc3NuYW1lJCwgJGZpcnN0JCk+KFxuIgorICAgICAgICAgICAgIiAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJiRmaXJzdCQpLFxuIgorICAgICAgICAgICAgIiAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm90aGVyLT4kZmlyc3QkKSk7XG4iKTsKKworICAgICAgICBpICs9IHJ1bl9sZW5ndGggLSAxOworICAgICAgICAvLyArK2kgYXQgdGhlIHRvcCBvZiB0aGUgbG9vcC4KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVTd2FwcGluZ0NvZGUocHJpbnRlcik7CisgICAgICB9CisgICAgfQorICAgIGlmIChTaG91bGRTcGxpdChkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgICBmb3JtYXQoInN3YXAoJHNwbGl0JCwgb3RoZXItPiRzcGxpdCQpO1xuIik7CisgICAgfQorCisgICAgZm9yIChhdXRvIG9uZW9mIDogT25lT2ZSYW5nZShkZXNjcmlwdG9yXykpIHsKKyAgICAgIGZvcm1hdCgic3dhcChfaW1wbF8uJDEkXywgb3RoZXItPl9pbXBsXy4kMSRfKTtcbiIsIG9uZW9mLT5uYW1lKCkpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnJlYWxfb25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGZvcm1hdCgic3dhcCgkb25lb2ZfY2FzZSRbJDEkXSwgb3RoZXItPiRvbmVvZl9jYXNlJFskMSRdKTtcbiIsIGkpOworICAgIH0KKworICAgIGlmIChudW1fd2Vha19maWVsZHNfKSB7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgIiR3ZWFrX2ZpZWxkX21hcCQuVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+JHdlYWtfZmllbGRfbWFwJCkiCisgICAgICAgICAgIjtcbiIpOworICAgIH0KKworICAgIGlmICghaW5saW5lZF9zdHJpbmdfaW5kaWNlc18uZW1wdHkoKSkgeworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBJbmxpbmVkU3RyaW5nRG9uYXRlZFNpemUoKTsgKytpKSB7CisgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICJzd2FwKCRpbmxpbmVkX3N0cmluZ19kb25hdGVkX2FycmF5JFskMSRdLCAiCisgICAgICAgICAgICAib3RoZXItPiRpbmxpbmVkX3N0cmluZ19kb25hdGVkX2FycmF5JFskMSRdKTtcbiIsCisgICAgICAgICAgICBpKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KCJHZXRSZWZsZWN0aW9uKCktPlN3YXAodGhpcywgb3RoZXIpOyIpOworICB9CisKKyAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgZm9ybWF0KCJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdlRnJvbShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoIUhhc1NpbXBsZUJhc2VDbGFzcyhkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgICAgLy8gV2UgZG9uJ3Qgb3ZlcnJpZGUgdGhlIGdlbmVyYWxpemVkIE1lcmdlRnJvbSAoYWthIHRoYXQgd2hpY2gKKyAgICAgIC8vIHRha2VzIGluIHRoZSBNZXNzYWdlIGJhc2UgY2xhc3MgYXMgYSBwYXJhbWV0ZXIpOyBpbnN0ZWFkIHdlIGp1c3QKKyAgICAgIC8vIGxldCB0aGUgYmFzZSBNZXNzYWdlOjpNZXJnZUZyb20gdGFrZSBjYXJlIG9mIGl0LiAgVGhlIGJhc2UgTWVyZ2VGcm9tCisgICAgICAvLyBrbm93cyBob3cgdG8gcXVpY2tseSBjb25maXJtIHRoZSB0eXBlcyBleGFjdGx5IG1hdGNoLCBhbmQgaWYgc28sIHdpbGwKKyAgICAgIC8vIHVzZSBHZXRDbGFzc0RhdGEoKSB0byByZXRyaWV2ZSB0aGUgYWRkcmVzcyBvZiBNZXJnZUltcGwsIHdoaWNoIGNhbGxzCisgICAgICAvLyB0aGUgZmFzdCBNZXJnZUZyb20gb3ZlcmxvYWQuICBNb3N0IGNhbGxlcnMgYXZvaWQgYWxsIHRoaXMgYnkgcGFzc2luZworICAgICAgLy8gYSAiZnJvbSIgbWVzc2FnZSB0aGF0IGlzIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG1lc3NhZ2UgYmVpbmcgbWVyZ2VkCisgICAgICAvLyBpbnRvLCByYXRoZXIgdGhhbiBhIGdlbmVyaWMgTWVzc2FnZS4KKworICAgICAgZm9ybWF0KAorICAgICAgICAgICJjb25zdCA6OiRwcm90b19ucyQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSAiCisgICAgICAgICAgIiRjbGFzc25hbWUkOjpfY2xhc3NfZGF0YV8gPSB7XG4iCisgICAgICAgICAgIiAgICA6OiRwcm90b19ucyQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssXG4iCisgICAgICAgICAgIiAgICAkY2xhc3NuYW1lJDo6TWVyZ2VJbXBsXG4iCisgICAgICAgICAgIn07XG4iCisgICAgICAgICAgImNvbnN0IDo6JHByb3RvX25zJDo6TWVzc2FnZTo6Q2xhc3NEYXRhKiIKKyAgICAgICAgICAiJGNsYXNzbmFtZSQ6OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH1cbiIKKyAgICAgICAgICAiXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gR2VuZXJhdGUgQ2hlY2tUeXBlQW5kTWVyZ2VGcm9tKCkuCisgICAgICBmb3JtYXQoCisgICAgICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OkNoZWNrVHlwZUFuZE1lcmdlRnJvbShcbiIKKyAgICAgICAgICAiICAgIGNvbnN0IDo6JHByb3RvX25zJDo6TWVzc2FnZUxpdGUmIGZyb20pIHtcbiIKKyAgICAgICAgICAiICBNZXJnZUZyb20oKjo6X3BiaTo6RG93bkNhc3Q8Y29uc3QgJGNsYXNzbmFtZSQqPihcbiIKKyAgICAgICAgICAiICAgICAgJmZyb20pKTtcbiIKKyAgICAgICAgICAifVxuIik7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIEluIHRoZSBzaW1wbGUgY2FzZSwgd2UganVzdCBkZWZpbmUgQ2xhc3NEYXRhIHRoYXQgdmVjdG9ycyBiYWNrIHRvIHRoZQorICAgIC8vIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBDb3B5IGFuZCBNZXJnZS4KKyAgICBmb3JtYXQoCisgICAgICAgICJjb25zdCA6OiRwcm90b19ucyQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSAiCisgICAgICAgICIkY2xhc3NuYW1lJDo6X2NsYXNzX2RhdGFfID0ge1xuIgorICAgICAgICAiICAgICRzdXBlcmNsYXNzJDo6Q29weUltcGwsXG4iCisgICAgICAgICIgICAgJHN1cGVyY2xhc3MkOjpNZXJnZUltcGwsXG4iCisgICAgICAgICJ9O1xuIgorICAgICAgICAiY29uc3QgOjokcHJvdG9fbnMkOjpNZXNzYWdlOjpDbGFzc0RhdGEqIgorICAgICAgICAiJGNsYXNzbmFtZSQ6OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH1cbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiXG4iKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlQ2xhc3NTcGVjaWZpY01lcmdlSW1wbChpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoSGFzU2ltcGxlQmFzZUNsYXNzKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHJldHVybjsKKyAgLy8gR2VuZXJhdGUgdGhlIGNsYXNzLXNwZWNpZmljIE1lcmdlRnJvbSwgd2hpY2ggYXZvaWRzIHRoZSBHT09HTEVfQ0hFQ0sgYW5kIGNhc3QuCisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmICghSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgLy8gRm9yIG1lc3NhZ2VzIHRoYXQgZG9uJ3QgaW5oZXJpdCBmcm9tIE1lc3NhZ2UsIGp1c3QgaW1wbGVtZW50IE1lcmdlRnJvbQorICAgIC8vIGRpcmVjdGx5LgorICAgIGZvcm1hdCgKKyAgICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6Ok1lcmdlRnJvbShjb25zdCAkY2xhc3NuYW1lJCYgZnJvbSkge1xuIgorICAgICAgICAiICAkY2xhc3NuYW1lJCogY29uc3QgX3RoaXMgPSB0aGlzO1xuIik7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KAorICAgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6TWVyZ2VJbXBsKDo6JHByb3RvX25zJDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCAiCisgICAgICAgICI6OiRwcm90b19ucyQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7XG4iCisgICAgICAgICIgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8JGNsYXNzbmFtZSQqPigmdG9fbXNnKTtcbiIKKyAgICAgICAgIiAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0ICRjbGFzc25hbWUkJj4oZnJvbV9tc2cpO1xuIik7CisgIH0KKyAgZm9ybWF0LkluZGVudCgpOworICBmb3JtYXQoCisgICAgICAiJGFubm90YXRlX21lcmdlZnJvbSQiCisgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6IgorICAgICAgIiRmdWxsX25hbWUkKVxuIik7CisgIGZvcm1hdCgiJERDSEskX05FKCZmcm9tLCBfdGhpcyk7XG4iKTsKKworICBmb3JtYXQoCisgICAgICAiJHVpbnQzMiQgY2FjaGVkX2hhc19iaXRzID0gMDtcbiIKKyAgICAgICIodm9pZCkgY2FjaGVkX2hhc19iaXRzO1xuXG4iKTsKKworICBpZiAoU2hvdWxkU3BsaXQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgImlmICghZnJvbS5Jc1NwbGl0TWVzc2FnZURlZmF1bHQoKSkge1xuIgorICAgICAgICAiICBfdGhpcy0+UHJlcGFyZVNwbGl0TWVzc2FnZUZvcldyaXRlKCk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+PiBjaHVua3MgPSBDb2xsZWN0RmllbGRzKAorICAgICAgb3B0aW1pemVkX29yZGVyXywKKyAgICAgIFsmXShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGEsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYikgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiBIYXNCeXRlSW5kZXgoYSkgPT0gSGFzQnl0ZUluZGV4KGIpICYmCisgICAgICAgICAgICAgICBTaG91bGRTcGxpdChhLCBvcHRpb25zXykgPT0gU2hvdWxkU3BsaXQoYiwgb3B0aW9uc18pOworICAgICAgfSk7CisKKyAgQ29sZENodW5rU2tpcHBlciBjb2xkX3NraXBwZXIoZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCBjaHVua3MsIGhhc19iaXRfaW5kaWNlc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDb2xkUmF0aW8pOworCisgIC8vIGNhY2hlZF9oYXNfd29yZF9pbmRleCBtYWludGFpbnMgdGhhdDoKKyAgLy8gICBjYWNoZWRfaGFzX2JpdHMgPSBmcm9tLl9oYXNfYml0c19bY2FjaGVkX2hhc193b3JkX2luZGV4XQorICAvLyBmb3IgY2FjaGVkX2hhc193b3JkX2luZGV4ID49IDAKKyAgaW50IGNhY2hlZF9oYXNfd29yZF9pbmRleCA9IC0xOworCisgIGZvciAoaW50IGNodW5rX2luZGV4ID0gMDsgY2h1bmtfaW5kZXggPCBjaHVua3Muc2l6ZSgpOyBjaHVua19pbmRleCsrKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGNodW5rID0gY2h1bmtzW2NodW5rX2luZGV4XTsKKyAgICBib29sIGhhdmVfb3V0ZXJfaWYgPQorICAgICAgICBjaHVuay5zaXplKCkgPiAxICYmIEhhc0J5dGVJbmRleChjaHVuay5mcm9udCgpKSAhPSBrTm9IYXNiaXQ7CisgICAgY29sZF9za2lwcGVyLk9uU3RhcnRDaHVuayhjaHVua19pbmRleCwgY2FjaGVkX2hhc193b3JkX2luZGV4LCAiZnJvbS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRlcik7CisKKyAgICBpZiAoaGF2ZV9vdXRlcl9pZikgeworICAgICAgLy8gRW1pdCBhbiBpZigpIHRoYXQgd2lsbCBsZXQgdXMgc2tpcCB0aGUgd2hvbGUgY2h1bmsgaWYgbm9uZSBhcmUgc2V0LgorICAgICAgdWludDMyX3QgY2h1bmtfbWFzayA9IEdlbkNodW5rTWFzayhjaHVuaywgaGFzX2JpdF9pbmRpY2VzXyk7CisgICAgICBzdGQ6OnN0cmluZyBjaHVua19tYXNrX3N0ciA9CisgICAgICAgICAgU3RyQ2F0KHN0cmluZ3M6OkhleChjaHVua19tYXNrLCBzdHJpbmdzOjpaRVJPX1BBRF84KSk7CisKKyAgICAgIC8vIENoZWNrICh1cCB0bykgOCBoYXNfYml0cyBhdCBhIHRpbWUgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gb25lIGZpZWxkIGluCisgICAgICAvLyB0aGlzIGNodW5rLiAgRHVlIHRvIGZpZWxkIGxheW91dCBvcmRlcmluZywgd2UgbWF5IGNoZWNrCisgICAgICAvLyBfaGFzX2JpdHNfW2xhc3RfY2h1bmsgKiA4IC8gMzJdIG11bHRpcGxlIHRpbWVzLgorICAgICAgR09PR0xFX0RDSEVDS19MRSgyLCBwb3BjbnQoY2h1bmtfbWFzaykpOworICAgICAgR09PR0xFX0RDSEVDS19HRSg4LCBwb3BjbnQoY2h1bmtfbWFzaykpOworCisgICAgICBpZiAoY2FjaGVkX2hhc193b3JkX2luZGV4ICE9IEhhc1dvcmRJbmRleChjaHVuay5mcm9udCgpKSkgeworICAgICAgICBjYWNoZWRfaGFzX3dvcmRfaW5kZXggPSBIYXNXb3JkSW5kZXgoY2h1bmsuZnJvbnQoKSk7CisgICAgICAgIGZvcm1hdCgiY2FjaGVkX2hhc19iaXRzID0gZnJvbS4kaGFzX2JpdHMkWyQxJF07XG4iLAorICAgICAgICAgICAgICAgY2FjaGVkX2hhc193b3JkX2luZGV4KTsKKyAgICAgIH0KKworICAgICAgZm9ybWF0KCJpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgkMSR1KSB7XG4iLCBjaHVua19tYXNrX3N0cik7CisgICAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgfQorCisgICAgLy8gR28gYmFjayBhbmQgZW1pdCBtZXJnaW5nIGNvZGUgZm9yIGVhY2ggb2YgdGhlIGZpZWxkcyB3ZSBwcm9jZXNzZWQuCisgICAgYm9vbCBkZWZlcnJlZF9oYXNfYml0X2NoYW5nZXMgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZmllbGQgOiBjaHVuaykgeworICAgICAgY29uc3QgRmllbGRHZW5lcmF0b3ImIGdlbmVyYXRvciA9IGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCk7CisKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICBnZW5lcmF0b3IuR2VuZXJhdGVNZXJnaW5nQ29kZShwcmludGVyKTsKKyAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmlzX29wdGlvbmFsKCkgJiYgIUhhc0hhc2JpdChmaWVsZCkpIHsKKyAgICAgICAgLy8gTWVyZ2Ugc2VtYW50aWNzIHdpdGhvdXQgdHJ1ZSBmaWVsZCBwcmVzZW5jZTogcHJpbWl0aXZlIGZpZWxkcyBhcmUKKyAgICAgICAgLy8gbWVyZ2VkIG9ubHkgaWYgbm9uLXplcm8gKG51bWVyaWMpIG9yIG5vbi1lbXB0eSAoc3RyaW5nKS4KKyAgICAgICAgYm9vbCBoYXZlX2VuY2xvc2luZ19pZiA9CisgICAgICAgICAgICBFbWl0RmllbGROb25EZWZhdWx0Q29uZGl0aW9uKHByaW50ZXIsICJmcm9tLiIsIGZpZWxkKTsKKyAgICAgICAgZ2VuZXJhdG9yLkdlbmVyYXRlTWVyZ2luZ0NvZGUocHJpbnRlcik7CisgICAgICAgIGlmIChoYXZlX2VuY2xvc2luZ19pZikgeworICAgICAgICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgICAgICAgZm9ybWF0KCJ9XG4iKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChmaWVsZC0+b3B0aW9ucygpLndlYWsoKSB8fAorICAgICAgICAgICAgICAgICBjYWNoZWRfaGFzX3dvcmRfaW5kZXggIT0gSGFzV29yZEluZGV4KGZpZWxkKSkgeworICAgICAgICAvLyBDaGVjayBoYXNiaXQsIG5vdCB1c2luZyBjYWNoZWQgYml0cy4KKyAgICAgICAgR09PR0xFX0NIRUNLKEhhc0hhc2JpdChmaWVsZCkpOworICAgICAgICBmb3JtYXQoImlmIChmcm9tLl9pbnRlcm5hbF9oYXNfJDEkKCkpIHtcbiIsIEZpZWxkTmFtZShmaWVsZCkpOworICAgICAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgICAgIGdlbmVyYXRvci5HZW5lcmF0ZU1lcmdpbmdDb2RlKHByaW50ZXIpOworICAgICAgICBmb3JtYXQuT3V0ZGVudCgpOworICAgICAgICBmb3JtYXQoIn1cbiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ2hlY2sgaGFzYml0LCB1c2luZyBjYWNoZWQgYml0cy4KKyAgICAgICAgR09PR0xFX0NIRUNLKEhhc0hhc2JpdChmaWVsZCkpOworICAgICAgICBpbnQgaGFzX2JpdF9pbmRleCA9IGhhc19iaXRfaW5kaWNlc19bZmllbGQtPmluZGV4KCldOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBtYXNrID0gU3RyQ2F0KAorICAgICAgICAgICAgc3RyaW5nczo6SGV4KDF1IDw8IChoYXNfYml0X2luZGV4ICUgMzIpLCBzdHJpbmdzOjpaRVJPX1BBRF84KSk7CisgICAgICAgIGZvcm1hdCgiaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4JDEkdSkge1xuIiwgbWFzayk7CisgICAgICAgIGZvcm1hdC5JbmRlbnQoKTsKKworICAgICAgICBpZiAoaGF2ZV9vdXRlcl9pZiAmJiBJc1BPRChmaWVsZCkpIHsKKyAgICAgICAgICAvLyBEZWZlciBoYXNiaXQgbW9kaWZpY2F0aW9uIHVudGlsIHRoZSBlbmQgb2YgY2h1bmsuCisgICAgICAgICAgLy8gVGhpcyBjYW4gcmVkdWNlIHRoZSBudW1iZXIgb2YgbG9hZHMvc3RvcmVzIGJ5IHVwIHRvIDcgcGVyIDggZmllbGRzLgorICAgICAgICAgIGRlZmVycmVkX2hhc19iaXRfY2hhbmdlcyA9IHRydWU7CisgICAgICAgICAgZ2VuZXJhdG9yLkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZW5lcmF0b3IuR2VuZXJhdGVNZXJnaW5nQ29kZShwcmludGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgICAgIGZvcm1hdCgifVxuIik7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGhhdmVfb3V0ZXJfaWYpIHsKKyAgICAgIGlmIChkZWZlcnJlZF9oYXNfYml0X2NoYW5nZXMpIHsKKyAgICAgICAgLy8gRmx1c2ggdGhlIGhhcyBiaXRzIGZvciB0aGUgcHJpbWl0aXZlcyB3ZSBkZWZlcnJlZC4KKyAgICAgICAgR09PR0xFX0NIRUNLX0xFKDAsIGNhY2hlZF9oYXNfd29yZF9pbmRleCk7CisgICAgICAgIGZvcm1hdCgiX3RoaXMtPiRoYXNfYml0cyRbJDEkXSB8PSBjYWNoZWRfaGFzX2JpdHM7XG4iLAorICAgICAgICAgICAgICAgY2FjaGVkX2hhc193b3JkX2luZGV4KTsKKyAgICAgIH0KKworICAgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICAgIGZvcm1hdCgifVxuIik7CisgICAgfQorCisgICAgaWYgKGNvbGRfc2tpcHBlci5PbkVuZENodW5rKGNodW5rX2luZGV4LCBwcmludGVyKSkgeworICAgICAgLy8gUmVzZXQgaGVyZSBhcyBpdCBtYXkgaGF2ZSBiZWVuIHVwZGF0ZWQgaW4ganVzdCBjbG9zZWQgaWYgc3RhdGVtZW50LgorICAgICAgY2FjaGVkX2hhc193b3JkX2luZGV4ID0gLTE7CisgICAgfQorICB9CisKKyAgLy8gTWVyZ2Ugb25lb2YgZmllbGRzLiBPbmVvZiBmaWVsZCByZXF1aXJlcyBvbmVvZiBjYXNlIGNoZWNrLgorICBmb3IgKGF1dG8gb25lb2YgOiBPbmVPZlJhbmdlKGRlc2NyaXB0b3JfKSkgeworICAgIGZvcm1hdCgic3dpdGNoIChmcm9tLiQxJF9jYXNlKCkpIHtcbiIsIG9uZW9mLT5uYW1lKCkpOworICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgICBmb3IgKGF1dG8gZmllbGQgOiBGaWVsZFJhbmdlKG9uZW9mKSkgeworICAgICAgZm9ybWF0KCJjYXNlIGskMSQ6IHtcbiIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSkpOworICAgICAgZm9ybWF0LkluZGVudCgpOworICAgICAgaWYgKCFJc0ZpZWxkU3RyaXBwZWQoZmllbGQsIG9wdGlvbnNfKSkgeworICAgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlTWVyZ2luZ0NvZGUocHJpbnRlcik7CisgICAgICB9CisgICAgICBmb3JtYXQoImJyZWFrO1xuIik7CisgICAgICBmb3JtYXQuT3V0ZGVudCgpOworICAgICAgZm9ybWF0KCJ9XG4iKTsKKyAgICB9CisgICAgZm9ybWF0KAorICAgICAgICAiY2FzZSAkMSRfTk9UX1NFVDoge1xuIgorICAgICAgICAiICBicmVhaztcbiIKKyAgICAgICAgIn1cbiIsCisgICAgICAgIFRvVXBwZXIob25lb2YtPm5hbWUoKSkpOworICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgZm9ybWF0KCJ9XG4iKTsKKyAgfQorICBpZiAobnVtX3dlYWtfZmllbGRzXykgeworICAgIGZvcm1hdCgKKyAgICAgICAgIl90aGlzLT4kd2Vha19maWVsZF9tYXAkLk1lcmdlRnJvbShmcm9tLiR3ZWFrX2ZpZWxkX21hcCQpOyIKKyAgICAgICAgIlxuIik7CisgIH0KKworICAvLyBNZXJnaW5nIG9mIGV4dGVuc2lvbnMgYW5kIHVua25vd24gZmllbGRzIGlzIGRvbmUgbGFzdCwgdG8gbWF4aW1pemUKKyAgLy8gdGhlIG9wcG9ydHVuaXR5IGZvciB0YWlsIGNhbGxzLgorICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIGZvcm1hdCgKKyAgICAgICAgIl90aGlzLT4kZXh0ZW5zaW9ucyQuTWVyZ2VGcm9tKGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgIgorICAgICAgICAiZnJvbS4kZXh0ZW5zaW9ucyQpO1xuIik7CisgIH0KKworICBmb3JtYXQoCisgICAgICAiX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPCR1bmtub3duX2ZpZWxkc190eXBlJD4oZnJvbS5fIgorICAgICAgImludGVybmFsXyIKKyAgICAgICJtZXRhZGF0YV8pO1xuIik7CisKKyAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgZm9ybWF0KCJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUNvcHlGcm9tKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChIYXNTaW1wbGVCYXNlQ2xhc3MoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgcmV0dXJuOworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgLy8gV2UgZG9uJ3Qgb3ZlcnJpZGUgdGhlIGdlbmVyYWxpemVkIENvcHlGcm9tIChha2EgdGhhdCB3aGljaAorICAgIC8vIHRha2VzIGluIHRoZSBNZXNzYWdlIGJhc2UgY2xhc3MgYXMgYSBwYXJhbWV0ZXIpOyBpbnN0ZWFkIHdlIGp1c3QKKyAgICAvLyBsZXQgdGhlIGJhc2UgTWVzc2FnZTo6Q29weUZyb20gdGFrZSBjYXJlIG9mIGl0LiAgVGhlIGJhc2UgTWVyZ2VGcm9tCisgICAgLy8ga25vd3MgaG93IHRvIHF1aWNrbHkgY29uZmlybSB0aGUgdHlwZXMgZXhhY3RseSBtYXRjaCwgYW5kIGlmIHNvLCB3aWxsCisgICAgLy8gdXNlIEdldENsYXNzRGF0YSgpIHRvIGdldCB0aGUgYWRkcmVzcyBvZiBNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIC8vIHdoaWNoIGNhbGxzIENsZWFyKCkgYW5kIHRoZW4gTWVyZ2VGcm9tKCksIGFzIHdlbGwgYXMgbWFraW5nIHN1cmUgdGhhdAorICAgIC8vIGNsZWFyaW5nIHRoZSBkZXN0aW5hdGlvbiBtZXNzYWdlIGRvZXNuJ3QgYWx0ZXIgdGhlIHNvdXJjZSwgd2hlbiBpbiBkZWJ1ZworICAgIC8vIGJ1aWxkcy4gTW9zdCBjYWxsZXJzIGF2b2lkIHRoaXMgYnkgcGFzc2luZyBhICJmcm9tIiBtZXNzYWdlIHRoYXQgaXMgdGhlCisgICAgLy8gc2FtZSB0eXBlIGFzIHRoZSBtZXNzYWdlIGJlaW5nIG1lcmdlZCBpbnRvLCByYXRoZXIgdGhhbiBhIGdlbmVyaWMKKyAgICAvLyBNZXNzYWdlLgorICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGNsYXNzLXNwZWNpZmljIENvcHlGcm9tLgorICBmb3JtYXQoCisgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6Q29weUZyb20oY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pIHtcbiIKKyAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0OiIKKyAgICAgICIkZnVsbF9uYW1lJClcbiIpOworICBmb3JtYXQuSW5kZW50KCk7CisKKyAgZm9ybWF0KCJpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuO1xuIik7CisKKyAgaWYgKCFvcHRpb25zXy5vcGVuc291cmNlX3J1bnRpbWUgJiYgSGFzTWVzc2FnZUZpZWxkT3JFeHRlbnNpb24oZGVzY3JpcHRvcl8pKSB7CisgICAgLy8gVGhpcyBjaGVjayBpcyBkaXNhYmxlZCBpbiB0aGUgb3BlbnNvdXJjZSByZWxlYXNlIGJlY2F1c2Ugd2UncmUKKyAgICAvLyBjb25jZXJuZWQgdGhhdCBtYW55IHVzZXJzIGRvIG5vdCBkZWZpbmUgTkRFQlVHIGluIHRoZWlyIHJlbGVhc2UgYnVpbGRzLgorICAgIC8vIEl0IGlzIGFsc28gZGlzYWJsZWQgaWYgYSBtZXNzYWdlIGhhcyBuZWl0aGVyIG1lc3NhZ2UgZmllbGRzIG5vcgorICAgIC8vIGV4dGVuc2lvbnMsIGFzIGl0J3MgaW1wb3NzaWJsZSB0byBjb3B5IGZyb20gaXRzIGRlc2NlbmRhbnQuCisgICAgLy8KKyAgICAvLyBOb3RlIHRoYXQgRmFpbElmQ29weUZyb21EZXNjZW5kYW50IGlzIGltcGxlbWVudGVkIGJ5IHJlZmxlY3Rpb24gYW5kIG5vdAorICAgIC8vIGF2YWlsYWJsZSBmb3IgbGl0ZSBydW50aW1lLiBJbiB0aGF0IGNhc2UsIGNoZWNrIGlmIHRoZSBzaXplIG9mIHRoZSBzb3VyY2UKKyAgICAvLyBoYXMgY2hhbmdlZCBhZnRlciBDbGVhci4KKyAgICBmb3JtYXQoIiNpZm5kZWYgTkRFQlVHXG4iKTsKKyAgICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgICBmb3JtYXQoIkZhaWxJZkNvcHlGcm9tRGVzY2VuZGFudCgqdGhpcywgZnJvbSk7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9ybWF0KCJzaXplX3QgZnJvbV9zaXplID0gZnJvbS5CeXRlU2l6ZUxvbmcoKTtcbiIpOworICAgIH0KKyAgICBmb3JtYXQoCisgICAgICAgICIjZW5kaWZcbiIKKyAgICAgICAgIkNsZWFyKCk7XG4iKTsKKyAgICBpZiAoIUhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgICAgZm9ybWF0KAorICAgICAgICAgICIjaWZuZGVmIE5ERUJVR1xuIgorICAgICAgICAgICIkQ0hLJF9FUShmcm9tX3NpemUsIGZyb20uQnl0ZVNpemVMb25nKCkpXG4iCisgICAgICAgICAgIiAgPDwgXCJTb3VyY2Ugb2YgQ29weUZyb20gY2hhbmdlZCB3aGVuIGNsZWFyaW5nIHRhcmdldC4gIEVpdGhlciBcIlxuIgorICAgICAgICAgICIgICAgIFwic291cmNlIGlzIGEgbmVzdGVkIG1lc3NhZ2UgaW4gdGFyZ2V0IChub3QgYWxsb3dlZCksIG9yIFwiXG4iCisgICAgICAgICAgIiAgICAgXCJhbm90aGVyIHRocmVhZCBpcyBtb2RpZnlpbmcgdGhlIHNvdXJjZS5cIjtcbiIKKyAgICAgICAgICAiI2VuZGlmXG4iKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KCJDbGVhcigpO1xuIik7CisgIH0KKyAgZm9ybWF0KCJNZXJnZUZyb20oZnJvbSk7XG4iKTsKKworICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlVmVyaWZ5KGlvOjpQcmludGVyKiBwcmludGVyKSB7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVPbmVvZkZpZWxkcygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGZpZWxkcykgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBHT09HTEVfQ0hFQ0soIWZpZWxkcy5lbXB0eSgpKTsKKyAgaWYgKGZpZWxkcy5zaXplKCkgPT0gMSkgeworICAgIEdlbmVyYXRlU2VyaWFsaXplT25lRmllbGQocHJpbnRlciwgZmllbGRzWzBdLCAtMSk7CisgICAgcmV0dXJuOworICB9CisgIC8vIFdlIGhhdmUgbXVsdGlwbGUgbXV0dWFsbHkgZXhjbHVzaXZlIGNob2ljZXMuICBFbWl0IGEgc3dpdGNoIHN0YXRlbWVudC4KKyAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZiA9IGZpZWxkc1swXS0+Y29udGFpbmluZ19vbmVvZigpOworICBmb3JtYXQoInN3aXRjaCAoJDEkX2Nhc2UoKSkge1xuIiwgb25lb2YtPm5hbWUoKSk7CisgIGZvcm1hdC5JbmRlbnQoKTsKKyAgZm9yIChhdXRvIGZpZWxkIDogZmllbGRzKSB7CisgICAgZm9ybWF0KCJjYXNlIGskMSQ6IHtcbiIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSkpOworICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICAgICAgcHJpbnRlcik7CisgICAgZm9ybWF0KCJicmVhaztcbiIpOworICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgZm9ybWF0KCJ9XG4iKTsKKyAgfQorICBmb3JtYXQuT3V0ZGVudCgpOworICAvLyBEb2luZyBub3RoaW5nIGlzIGFuIG9wdGlvbi4KKyAgZm9ybWF0KAorICAgICAgIiAgZGVmYXVsdDogO1xuIgorICAgICAgIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplT25lRmllbGQoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGVkX2hhc19iaXRzX2luZGV4KSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmICghZmllbGQtPm9wdGlvbnMoKS53ZWFrKCkpIHsKKyAgICAvLyBGb3Igd2Vha2ZpZWxkcywgUHJpbnRGaWVsZENvbW1lbnQgaXMgY2FsbGVkIGR1cmluZyBpdGVyYXRpb24uCisgICAgUHJpbnRGaWVsZENvbW1lbnQoZm9ybWF0LCBmaWVsZCk7CisgIH0KKworICBib29sIGhhdmVfZW5jbG9zaW5nX2lmID0gZmFsc2U7CisgIGlmIChmaWVsZC0+b3B0aW9ucygpLndlYWsoKSkgeworICB9IGVsc2UgaWYgKEhhc0hhc2JpdChmaWVsZCkpIHsKKyAgICAvLyBBdHRlbXB0IHRvIHVzZSB0aGUgc3RhdGUgb2YgY2FjaGVkX2hhc19iaXRzLCBpZiBwb3NzaWJsZS4KKyAgICBpbnQgaGFzX2JpdF9pbmRleCA9IEhhc0JpdEluZGV4KGZpZWxkKTsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzX2luZGV4ID09IGhhc19iaXRfaW5kZXggLyAzMikgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbWFzayA9CisgICAgICAgICAgU3RyQ2F0KHN0cmluZ3M6OkhleCgxdSA8PCAoaGFzX2JpdF9pbmRleCAlIDMyKSwgc3RyaW5nczo6WkVST19QQURfOCkpOworCisgICAgICBmb3JtYXQoImlmIChjYWNoZWRfaGFzX2JpdHMgJiAweCQxJHUpIHtcbiIsIG1hc2spOworICAgIH0gZWxzZSB7CisgICAgICBmb3JtYXQoImlmIChfaW50ZXJuYWxfaGFzXyQxJCgpKSB7XG4iLCBGaWVsZE5hbWUoZmllbGQpKTsKKyAgICB9CisKKyAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgaGF2ZV9lbmNsb3NpbmdfaWYgPSB0cnVlOworICB9IGVsc2UgaWYgKGZpZWxkLT5pc19vcHRpb25hbCgpICYmICFIYXNIYXNiaXQoZmllbGQpKSB7CisgICAgaGF2ZV9lbmNsb3NpbmdfaWYgPSBFbWl0RmllbGROb25EZWZhdWx0Q29uZGl0aW9uKHByaW50ZXIsICJ0aGlzLT4iLCBmaWVsZCk7CisgIH0KKworICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShwcmludGVyKTsKKworICBpZiAoaGF2ZV9lbmNsb3NpbmdfaWYpIHsKKyAgICBmb3JtYXQuT3V0ZGVudCgpOworICAgIGZvcm1hdCgifVxuIik7CisgIH0KKyAgZm9ybWF0KCJcbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplT25lRXh0ZW5zaW9uUmFuZ2UoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByYW5nZSkgeworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnMgPSB2YXJpYWJsZXNfOworICB2YXJzWyJzdGFydCJdID0gU3RyQ2F0KHJhbmdlLT5zdGFydCk7CisgIHZhcnNbImVuZCJdID0gU3RyQ2F0KHJhbmdlLT5lbmQpOworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcnMpOworICBmb3JtYXQoIi8vIEV4dGVuc2lvbiByYW5nZSBbJHN0YXJ0JCwgJGVuZCQpXG4iKTsKKyAgZm9ybWF0KAorICAgICAgInRhcmdldCA9ICRleHRlbnNpb25zJC5fSW50ZXJuYWxTZXJpYWxpemUoXG4iCisgICAgICAiaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCAkc3RhcnQkLCAkZW5kJCwgdGFyZ2V0LCBzdHJlYW0pO1xuXG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKEhhc1NpbXBsZUJhc2VDbGFzcyhkZXNjcmlwdG9yXywgb3B0aW9uc18pKSByZXR1cm47CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICAvLyBTcGVjaWFsLWNhc2UgTWVzc2FnZVNldC4KKyAgICBmb3JtYXQoCisgICAgICAgICIkdWludDgkKiAkY2xhc3NuYW1lJDo6X0ludGVybmFsU2VyaWFsaXplKFxuIgorICAgICAgICAiICAgICR1aW50OCQqIHRhcmdldCwgOjokcHJvdG9fbnMkOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSAiCisgICAgICAgICJjb25zdCB7XG4iCisgICAgICAgICIkYW5ub3RhdGVfc2VyaWFsaXplJCIKKyAgICAgICAgIiAgdGFyZ2V0ID0gJGV4dGVuc2lvbnMkLiIKKyAgICAgICAgIkludGVybmFsU2VyaWFsaXplTWVzc2FnZVNldFdpdGhDYWNoZWRTaXplc1RvQXJyYXkoXG4iICAvLworICAgICAgICAiaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCB0YXJnZXQsIHN0cmVhbSk7XG4iKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnM7CisgICAgU2V0VW5rbm93bkZpZWxkc1ZhcmlhYmxlKGRlc2NyaXB0b3JfLCBvcHRpb25zXywgJnZhcnMpOworICAgIGZvcm1hdC5BZGRNYXAodmFycyk7CisgICAgZm9ybWF0KAorICAgICAgICAiICB0YXJnZXQgPSA6Ol9wYmk6OiIKKyAgICAgICAgIkludGVybmFsU2VyaWFsaXplVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1RvQXJyYXkoXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAkdW5rbm93bl9maWVsZHMkLCB0YXJnZXQsIHN0cmVhbSk7XG4iKTsKKyAgICBmb3JtYXQoCisgICAgICAgICIgIHJldHVybiB0YXJnZXQ7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBmb3JtYXQoCisgICAgICAiJHVpbnQ4JCogJGNsYXNzbmFtZSQ6Ol9JbnRlcm5hbFNlcmlhbGl6ZShcbiIKKyAgICAgICIgICAgJHVpbnQ4JCogdGFyZ2V0LCA6OiRwcm90b19ucyQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pICIKKyAgICAgICJjb25zdCB7XG4iCisgICAgICAiJGFubm90YXRlX3NlcmlhbGl6ZSQiKTsKKyAgZm9ybWF0LkluZGVudCgpOworCisgIGZvcm1hdCgiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDokZnVsbF9uYW1lJClcbiIpOworCisgIGlmICghU2hvdWxkU2VyaWFsaXplSW5PcmRlcihkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICBmb3JtYXQoIiNpZmRlZiBOREVCVUdcbiIpOworICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgfQorCisgIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzQm9keShwcmludGVyKTsKKworICBpZiAoIVNob3VsZFNlcmlhbGl6ZUluT3JkZXIoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgZm9ybWF0KCIjZWxzZSAgLy8gTkRFQlVHXG4iKTsKKyAgICBmb3JtYXQuSW5kZW50KCk7CisKKyAgICBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc0JvZHlTaHVmZmxlZChwcmludGVyKTsKKworICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgZm9ybWF0KCIjZW5kaWYgIC8vICFOREVCVUdcbiIpOworICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgfQorCisgIGZvcm1hdCgiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6JGZ1bGxfbmFtZSQpXG4iKTsKKworICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoCisgICAgICAiICByZXR1cm4gdGFyZ2V0O1xuIgorICAgICAgIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzQm9keSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoSGFzU2ltcGxlQmFzZUNsYXNzKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHJldHVybjsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGZpZWxkcyBpbiBhIHJvdyBmcm9tIHRoZSBzYW1lIG9uZW9mIHRoZW4gd2UKKyAgLy8gY29hbGVzY2UgdGhlbSBhbmQgZW1pdCBhIHN3aXRjaCBzdGF0ZW1lbnQuICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50CisgIC8vIGJlY2F1c2UgaXQgbGV0cyB0aGUgQysrIGNvbXBpbGVyIGtub3cgdGhpcyBpcyBhICJhdCBtb3N0IG9uZSBjYW4gaGFwcGVuIgorICAvLyBzaXR1YXRpb24uIElmIHdlIGVtaXR0ZWQgImlmIChoYXNfeCgpKSAuLi47IGlmIChoYXNfeSgpKSAuLi4iIHRoZSBDKysKKyAgLy8gY29tcGlsZXIncyBlbWl0dGVkIGNvZGUgbWlnaHQgY2hlY2sgaGFzX3koKSBldmVuIHdoZW4gaGFzX3goKSBpcyB0cnVlLgorICBjbGFzcyBMYXp5U2VyaWFsaXplckVtaXR0ZXIgeworICAgcHVibGljOgorICAgIExhenlTZXJpYWxpemVyRW1pdHRlcihNZXNzYWdlR2VuZXJhdG9yKiBtZywgaW86OlByaW50ZXIqIHByaW50ZXIpCisgICAgICAgIDogbWdfKG1nKSwKKyAgICAgICAgICBmb3JtYXRfKHByaW50ZXIpLAorICAgICAgICAgIGVhZ2VyXyhJc1Byb3RvMyhtZy0+ZGVzY3JpcHRvcl8tPmZpbGUoKSkpLAorICAgICAgICAgIGNhY2hlZF9oYXNfYml0X2luZGV4XyhrTm9IYXNiaXQpIHt9CisKKyAgICB+TGF6eVNlcmlhbGl6ZXJFbWl0dGVyKCkgeyBGbHVzaCgpOyB9CisKKyAgICAvLyBJZiBjb25kaXRpb25zIGFsbG93LCB0cnkgdG8gYWNjdW11bGF0ZSBhIHJ1biBvZiBmaWVsZHMgZnJvbSB0aGUgc2FtZQorICAgIC8vIG9uZW9mLCBhbmQgaGFuZGxlIHRoZW0gYXQgdGhlIG5leHQgRmx1c2goKS4KKyAgICB2b2lkIEVtaXQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAgICAgaWYgKGVhZ2VyXyB8fCBNdXN0Rmx1c2goZmllbGQpKSB7CisgICAgICAgIEZsdXNoKCk7CisgICAgICB9CisgICAgICBpZiAoIWZpZWxkLT5yZWFsX2NvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgICAvLyBUT0RPKGNrZW5uZWxseSk6IERlZmVyIG5vbi1vbmVvZiBmaWVsZHMgc2ltaWxhcmx5IHRvIG9uZW9mIGZpZWxkcy4KKworICAgICAgICBpZiAoIWZpZWxkLT5vcHRpb25zKCkud2VhaygpICYmICFmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiAhZWFnZXJfKSB7CisgICAgICAgICAgLy8gV2Ugc3BlY3VsYXRpdmVseSBsb2FkIHRoZSBlbnRpcmUgX2hhc19iaXRzX1tpbmRleF0gY29udGVudHMsIGV2ZW4KKyAgICAgICAgICAvLyBpZiBpdCBpcyBmb3Igb25seSBvbmUgZmllbGQuICBEZWZlcnJpbmcgbm9uLW9uZW9mIGVtaXR0aW5nIHdvdWxkCisgICAgICAgICAgLy8gYWxsb3cgdXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBnb2luZyB0byBiZSB1c2VmdWwuCisgICAgICAgICAgaW50IGhhc19iaXRfaW5kZXggPSBtZ18tPmhhc19iaXRfaW5kaWNlc19bZmllbGQtPmluZGV4KCldOworICAgICAgICAgIGlmIChjYWNoZWRfaGFzX2JpdF9pbmRleF8gIT0gaGFzX2JpdF9pbmRleCAvIDMyKSB7CisgICAgICAgICAgICAvLyBSZWxvYWQuCisgICAgICAgICAgICBpbnQgbmV3X2luZGV4ID0gaGFzX2JpdF9pbmRleCAvIDMyOworCisgICAgICAgICAgICBmb3JtYXRfKCJjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1skMSRdO1xuIiwgbmV3X2luZGV4KTsKKworICAgICAgICAgICAgY2FjaGVkX2hhc19iaXRfaW5kZXhfID0gbmV3X2luZGV4OworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1nXy0+R2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZChmb3JtYXRfLnByaW50ZXIoKSwgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRfaGFzX2JpdF9pbmRleF8pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdl8ucHVzaF9iYWNrKGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIEVtaXRJZk5vdE51bGwoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkICE9IG51bGxwdHIpIHsKKyAgICAgICAgRW1pdChmaWVsZCk7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBGbHVzaCgpIHsKKyAgICAgIGlmICghdl8uZW1wdHkoKSkgeworICAgICAgICBtZ18tPkdlbmVyYXRlU2VyaWFsaXplT25lb2ZGaWVsZHMoZm9ybWF0Xy5wcmludGVyKCksIHZfKTsKKyAgICAgICAgdl8uY2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgLy8gSWYgd2UgaGF2ZSBtdWx0aXBsZSBmaWVsZHMgaW4gdl8gdGhlbiB0aGV5IGFsbCBtdXN0IGJlIGZyb20gdGhlIHNhbWUKKyAgICAvLyBvbmVvZi4gIFdvdWxkIGFkZGluZyBmaWVsZCB0byB2XyBicmVhayB0aGF0IGludmFyaWFudD8KKyAgICBib29sIE11c3RGbHVzaChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgICAgICByZXR1cm4gIXZfLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICB2X1swXS0+Y29udGFpbmluZ19vbmVvZigpICE9IGZpZWxkLT5jb250YWluaW5nX29uZW9mKCk7CisgICAgfQorCisgICAgTWVzc2FnZUdlbmVyYXRvciogbWdfOworICAgIEZvcm1hdHRlciBmb3JtYXRfOworICAgIGNvbnN0IGJvb2wgZWFnZXJfOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IHZfOworCisgICAgLy8gY2FjaGVkX2hhc19iaXRfaW5kZXhfIG1haW50YWlucyB0aGF0OgorICAgIC8vICAgY2FjaGVkX2hhc19iaXRzID0gZnJvbS5faGFzX2JpdHNfW2NhY2hlZF9oYXNfYml0X2luZGV4X10KKyAgICAvLyBmb3IgY2FjaGVkX2hhc19iaXRfaW5kZXhfID49IDAKKyAgICBpbnQgY2FjaGVkX2hhc19iaXRfaW5kZXhfOworICB9OworCisgIGNsYXNzIExhenlFeHRlbnNpb25SYW5nZUVtaXR0ZXIgeworICAgcHVibGljOgorICAgIExhenlFeHRlbnNpb25SYW5nZUVtaXR0ZXIoTWVzc2FnZUdlbmVyYXRvciogbWcsIGlvOjpQcmludGVyKiBwcmludGVyKQorICAgICAgICA6IG1nXyhtZyksIGZvcm1hdF8ocHJpbnRlcikge30KKworICAgIHZvaWQgQWRkVG9SYW5nZShjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UpIHsKKyAgICAgIGlmICghaGFzX2N1cnJlbnRfcmFuZ2VfKSB7CisgICAgICAgIGN1cnJlbnRfY29tYmluZWRfcmFuZ2VfID0gKnJhbmdlOworICAgICAgICBoYXNfY3VycmVudF9yYW5nZV8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY3VycmVudF9jb21iaW5lZF9yYW5nZV8uc3RhcnQgPQorICAgICAgICAgICAgc3RkOjptaW4oY3VycmVudF9jb21iaW5lZF9yYW5nZV8uc3RhcnQsIHJhbmdlLT5zdGFydCk7CisgICAgICAgIGN1cnJlbnRfY29tYmluZWRfcmFuZ2VfLmVuZCA9CisgICAgICAgICAgICBzdGQ6Om1heChjdXJyZW50X2NvbWJpbmVkX3JhbmdlXy5lbmQsIHJhbmdlLT5lbmQpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgRmx1c2goKSB7CisgICAgICBpZiAoaGFzX2N1cnJlbnRfcmFuZ2VfKSB7CisgICAgICAgIG1nXy0+R2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZShmb3JtYXRfLnByaW50ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJyZW50X2NvbWJpbmVkX3JhbmdlXyk7CisgICAgICB9CisgICAgICBoYXNfY3VycmVudF9yYW5nZV8gPSBmYWxzZTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgTWVzc2FnZUdlbmVyYXRvciogbWdfOworICAgIEZvcm1hdHRlciBmb3JtYXRfOworICAgIGJvb2wgaGFzX2N1cnJlbnRfcmFuZ2VfID0gZmFsc2U7CisgICAgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UgY3VycmVudF9jb21iaW5lZF9yYW5nZV87CisgIH07CisKKyAgLy8gV2UgbmVlZCB0byB0cmFjayB0aGUgbGFyZ2VzdCB3ZWFrIGZpZWxkLCBiZWNhdXNlIHdlYWsgZmllbGRzIGFyZSBzZXJpYWxpemVkCisgIC8vIGRpZmZlcmVudGx5IHRoYW4gbm9ybWFsIGZpZWxkcy4gIFRoZSBXZWFrRmllbGRNYXA6OkZpZWxkV3JpdGVyIHdpbGwKKyAgLy8gc2VyaWFsaXplIGFsbCB3ZWFrIGZpZWxkcyB0aGF0IGFyZSBvcmRpbmFsbHkgYmV0d2VlbiB0aGUgbGFzdCBzZXJpYWxpemVkCisgIC8vIHdlYWsgZmllbGQgYW5kIHRoZSBjdXJyZW50IGZpZWxkLiAgSW4gb3JkZXIgdG8gZ3VhcmFudGVlIHRoYXQgYWxsIHdlYWsKKyAgLy8gZmllbGRzIGFyZSBzZXJpYWxpemVkLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0byBlbWl0IHRoZSBjb2RlIHRvIHNlcmlhbGl6ZQorICAvLyB0aGUgbGFyZ2VzdCB3ZWFrIGZpZWxkIHByZXNlbnQgYXQgc29tZSBwb2ludC4KKyAgY2xhc3MgTGFyZ2VzdFdlYWtGaWVsZEhvbGRlciB7CisgICBwdWJsaWM6CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBSZWxlYXNlKCkgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPSBmaWVsZF87CisgICAgICBmaWVsZF8gPSBudWxscHRyOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgdm9pZCBSZXBsYWNlSWZMYXJnZXIoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkXyA9PSBudWxscHRyIHx8IGZpZWxkXy0+bnVtYmVyKCkgPCBmaWVsZC0+bnVtYmVyKCkpIHsKKyAgICAgICAgZmllbGRfID0gZmllbGQ7CisgICAgICB9CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfID0gbnVsbHB0cjsKKyAgfTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBvcmRlcmVkX2ZpZWxkcyA9CisgICAgICBTb3J0RmllbGRzQnlOdW1iZXIoZGVzY3JpcHRvcl8pOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKj4gc29ydGVkX2V4dGVuc2lvbnM7CisgIHNvcnRlZF9leHRlbnNpb25zLnJlc2VydmUoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7ICsraSkgeworICAgIHNvcnRlZF9leHRlbnNpb25zLnB1c2hfYmFjayhkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlKGkpKTsKKyAgfQorICBzdGQ6OnNvcnQoc29ydGVkX2V4dGVuc2lvbnMuYmVnaW4oKSwgc29ydGVkX2V4dGVuc2lvbnMuZW5kKCksCisgICAgICAgICAgICBFeHRlbnNpb25SYW5nZVNvcnRlcigpKTsKKyAgaWYgKG51bV93ZWFrX2ZpZWxkc18pIHsKKyAgICBmb3JtYXQoCisgICAgICAgICI6Ol9wYmk6OldlYWtGaWVsZE1hcDo6RmllbGRXcml0ZXIgZmllbGRfd3JpdGVyKCIKKyAgICAgICAgIiR3ZWFrX2ZpZWxkX21hcCQpO1xuIik7CisgIH0KKworICBmb3JtYXQoCisgICAgICAiJHVpbnQzMiQgY2FjaGVkX2hhc19iaXRzID0gMDtcbiIKKyAgICAgICIodm9pZCkgY2FjaGVkX2hhc19iaXRzO1xuXG4iKTsKKworICAvLyBNZXJnZSB0aGUgZmllbGRzIGFuZCB0aGUgZXh0ZW5zaW9uIHJhbmdlcywgYm90aCBzb3J0ZWQgYnkgZmllbGQgbnVtYmVyLgorICB7CisgICAgTGF6eVNlcmlhbGl6ZXJFbWl0dGVyIGUodGhpcywgcHJpbnRlcik7CisgICAgTGF6eUV4dGVuc2lvblJhbmdlRW1pdHRlciByZSh0aGlzLCBwcmludGVyKTsKKyAgICBMYXJnZXN0V2Vha0ZpZWxkSG9sZGVyIGxhcmdlc3Rfd2Vha19maWVsZDsKKyAgICBpbnQgaSwgajsKKyAgICBmb3IgKGkgPSAwLCBqID0gMDsKKyAgICAgICAgIGkgPCBvcmRlcmVkX2ZpZWxkcy5zaXplKCkgfHwgaiA8IHNvcnRlZF9leHRlbnNpb25zLnNpemUoKTspIHsKKyAgICAgIGlmICgoaiA9PSBzb3J0ZWRfZXh0ZW5zaW9ucy5zaXplKCkpIHx8CisgICAgICAgICAgKGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSAmJgorICAgICAgICAgICBvcmRlcmVkX2ZpZWxkc1tpXS0+bnVtYmVyKCkgPCBzb3J0ZWRfZXh0ZW5zaW9uc1tqXS0+c3RhcnQpKSB7CisgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBvcmRlcmVkX2ZpZWxkc1tpKytdOworICAgICAgICBpZiAoSXNGaWVsZFN0cmlwcGVkKGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICByZS5GbHVzaCgpOworICAgICAgICBpZiAoZmllbGQtPm9wdGlvbnMoKS53ZWFrKCkpIHsKKyAgICAgICAgICBsYXJnZXN0X3dlYWtfZmllbGQuUmVwbGFjZUlmTGFyZ2VyKGZpZWxkKTsKKyAgICAgICAgICBQcmludEZpZWxkQ29tbWVudChmb3JtYXQsIGZpZWxkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBlLkVtaXRJZk5vdE51bGwobGFyZ2VzdF93ZWFrX2ZpZWxkLlJlbGVhc2UoKSk7CisgICAgICAgICAgZS5FbWl0KGZpZWxkKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZS5FbWl0SWZOb3ROdWxsKGxhcmdlc3Rfd2Vha19maWVsZC5SZWxlYXNlKCkpOworICAgICAgICBlLkZsdXNoKCk7CisgICAgICAgIHJlLkFkZFRvUmFuZ2Uoc29ydGVkX2V4dGVuc2lvbnNbaisrXSk7CisgICAgICB9CisgICAgfQorICAgIHJlLkZsdXNoKCk7CisgICAgZS5FbWl0SWZOb3ROdWxsKGxhcmdlc3Rfd2Vha19maWVsZC5SZWxlYXNlKCkpOworICB9CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzOworICBTZXRVbmtub3duRmllbGRzVmFyaWFibGUoZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCAmdmFycyk7CisgIGZvcm1hdC5BZGRNYXAodmFycyk7CisgIGZvcm1hdCgiaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoJGhhdmVfdW5rbm93bl9maWVsZHMkKSkge1xuIik7CisgIGZvcm1hdC5JbmRlbnQoKTsKKyAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJ0YXJnZXQgPSAiCisgICAgICAgICI6Ol9wYmk6OldpcmVGb3JtYXQ6OiIKKyAgICAgICAgIkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoXG4iCisgICAgICAgICIgICAgJHVua25vd25fZmllbGRzJCwgdGFyZ2V0LCBzdHJlYW0pO1xuIik7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KAorICAgICAgICAidGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVJhdygkdW5rbm93bl9maWVsZHMkLmRhdGEoKSxcbiIKKyAgICAgICAgIiAgICBzdGF0aWNfY2FzdDxpbnQ+KCR1bmtub3duX2ZpZWxkcyQuc2l6ZSgpKSwgdGFyZ2V0KTtcbiIpOworICB9CisgIGZvcm1hdC5PdXRkZW50KCk7CisgIGZvcm1hdCgifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNCb2R5U2h1ZmZsZWQoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBvcmRlcmVkX2ZpZWxkcyA9CisgICAgICBTb3J0RmllbGRzQnlOdW1iZXIoZGVzY3JpcHRvcl8pOworICBvcmRlcmVkX2ZpZWxkcy5lcmFzZSgKKyAgICAgIHN0ZDo6cmVtb3ZlX2lmKG9yZGVyZWRfZmllbGRzLmJlZ2luKCksIG9yZGVyZWRfZmllbGRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgW3RoaXNdKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZikgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIUlzRmllbGRVc2VkKGYsIG9wdGlvbnNfKTsKKyAgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgb3JkZXJlZF9maWVsZHMuZW5kKCkpOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKj4gc29ydGVkX2V4dGVuc2lvbnM7CisgIHNvcnRlZF9leHRlbnNpb25zLnJlc2VydmUoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7ICsraSkgeworICAgIHNvcnRlZF9leHRlbnNpb25zLnB1c2hfYmFjayhkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlKGkpKTsKKyAgfQorICBzdGQ6OnNvcnQoc29ydGVkX2V4dGVuc2lvbnMuYmVnaW4oKSwgc29ydGVkX2V4dGVuc2lvbnMuZW5kKCksCisgICAgICAgICAgICBFeHRlbnNpb25SYW5nZVNvcnRlcigpKTsKKworICBpbnQgbnVtX2ZpZWxkcyA9IG9yZGVyZWRfZmllbGRzLnNpemUoKSArIHNvcnRlZF9leHRlbnNpb25zLnNpemUoKTsKKyAgY29uc3RleHByIGludCBrTGFyZ2VQcmltZSA9IDEwMDAwMDM7CisgIEdPT0dMRV9DSEVDS19MVChudW1fZmllbGRzLCBrTGFyZ2VQcmltZSkKKyAgICAgIDw8ICJQcmltZSBvZmZzZXQgbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBmaWVsZHMgdG8gZW5zdXJlICIKKyAgICAgICAgICJ0aG9zZSBhcmUgY29wcmltZS4iOworCisgIGlmIChudW1fd2Vha19maWVsZHNfKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiOjpfcGJpOjpXZWFrRmllbGRNYXA6OkZpZWxkV3JpdGVyIGZpZWxkX3dyaXRlcigiCisgICAgICAgICIkd2Vha19maWVsZF9tYXAkKTtcbiIpOworICB9CisKKyAgZm9ybWF0KCJmb3IgKGludCBpID0gJDEkOyBpID49IDA7IGktLSApIHtcbiIsIG51bV9maWVsZHMgLSAxKTsKKworICBmb3JtYXQuSW5kZW50KCk7CisgIGZvcm1hdCgic3dpdGNoKGkpIHtcbiIpOworICBmb3JtYXQuSW5kZW50KCk7CisKKyAgaW50IGluZGV4ID0gMDsKKyAgZm9yIChjb25zdCBhdXRvKiBmIDogb3JkZXJlZF9maWVsZHMpIHsKKyAgICBmb3JtYXQoImNhc2UgJDEkOiB7XG4iLCBpbmRleCsrKTsKKyAgICBmb3JtYXQuSW5kZW50KCk7CisKKyAgICBHZW5lcmF0ZVNlcmlhbGl6ZU9uZUZpZWxkKHByaW50ZXIsIGYsIC0xKTsKKworICAgIGZvcm1hdCgiYnJlYWs7XG4iKTsKKyAgICBmb3JtYXQuT3V0ZGVudCgpOworICAgIGZvcm1hdCgifVxuIik7CisgIH0KKworICBmb3IgKGNvbnN0IGF1dG8qIHIgOiBzb3J0ZWRfZXh0ZW5zaW9ucykgeworICAgIGZvcm1hdCgiY2FzZSAkMSQ6IHtcbiIsIGluZGV4KyspOworICAgIGZvcm1hdC5JbmRlbnQoKTsKKworICAgIEdlbmVyYXRlU2VyaWFsaXplT25lRXh0ZW5zaW9uUmFuZ2UocHJpbnRlciwgcik7CisKKyAgICBmb3JtYXQoImJyZWFrO1xuIik7CisgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICBmb3JtYXQoIn1cbiIpOworICB9CisKKyAgZm9ybWF0KAorICAgICAgImRlZmF1bHQ6IHtcbiIKKyAgICAgICIgICREQ0hLJChmYWxzZSkgPDwgXCJVbmV4cGVjdGVkIGluZGV4OiBcIiA8PCBpO1xuIgorICAgICAgIn1cbiIpOworICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoIn1cbiIpOworCisgIGZvcm1hdC5PdXRkZW50KCk7CisgIGZvcm1hdCgifVxuIik7CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzOworICBTZXRVbmtub3duRmllbGRzVmFyaWFibGUoZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCAmdmFycyk7CisgIGZvcm1hdC5BZGRNYXAodmFycyk7CisgIGZvcm1hdCgiaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoJGhhdmVfdW5rbm93bl9maWVsZHMkKSkge1xuIik7CisgIGZvcm1hdC5JbmRlbnQoKTsKKyAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJ0YXJnZXQgPSAiCisgICAgICAgICI6Ol9wYmk6OldpcmVGb3JtYXQ6OiIKKyAgICAgICAgIkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoXG4iCisgICAgICAgICIgICAgJHVua25vd25fZmllbGRzJCwgdGFyZ2V0LCBzdHJlYW0pO1xuIik7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KAorICAgICAgICAidGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVJhdygkdW5rbm93bl9maWVsZHMkLmRhdGEoKSxcbiIKKyAgICAgICAgIiAgICBzdGF0aWNfY2FzdDxpbnQ+KCR1bmtub3duX2ZpZWxkcyQuc2l6ZSgpKSwgdGFyZ2V0KTtcbiIpOworICB9CisgIGZvcm1hdC5PdXRkZW50KCk7CisgIGZvcm1hdCgifVxuIik7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQzMl90PiBNZXNzYWdlR2VuZXJhdG9yOjpSZXF1aXJlZEZpZWxkc0JpdE1hc2soKSBjb25zdCB7CisgIGNvbnN0IGludCBhcnJheV9zaXplID0gSGFzQml0c1NpemUoKTsKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IG1hc2tzKGFycmF5X3NpemUsIDApOworCisgIGZvciAoYXV0byBmaWVsZCA6IEZpZWxkUmFuZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgaWYgKCFmaWVsZC0+aXNfcmVxdWlyZWQoKSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgY29uc3QgaW50IGhhc19iaXRfaW5kZXggPSBoYXNfYml0X2luZGljZXNfW2ZpZWxkLT5pbmRleCgpXTsKKyAgICBtYXNrc1toYXNfYml0X2luZGV4IC8gMzJdIHw9IHN0YXRpY19jYXN0PHVpbnQzMl90PigxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKGhhc19iaXRfaW5kZXggJSAzMik7CisgIH0KKyAgcmV0dXJuIG1hc2tzOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKEhhc1NpbXBsZUJhc2VDbGFzcyhkZXNjcmlwdG9yXywgb3B0aW9uc18pKSByZXR1cm47CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgeworICAgIC8vIFNwZWNpYWwtY2FzZSBNZXNzYWdlU2V0LgorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgICBTZXRVbmtub3duRmllbGRzVmFyaWFibGUoZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCAmdmFycyk7CisgICAgZm9ybWF0LkFkZE1hcCh2YXJzKTsKKyAgICBmb3JtYXQoCisgICAgICAgICJzaXplX3QgJGNsYXNzbmFtZSQ6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHtcbiIKKyAgICAgICAgIiRhbm5vdGF0ZV9ieXRlc2l6ZSQiCisgICAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9zZXRfYnl0ZV9zaXplX3N0YXJ0OiRmdWxsX25hbWUkKVxuIgorICAgICAgICAiICBzaXplX3QgdG90YWxfc2l6ZSA9ICRleHRlbnNpb25zJC5NZXNzYWdlU2V0Qnl0ZVNpemUoKTtcbiIKKyAgICAgICAgIiAgaWYgKCRoYXZlX3Vua25vd25fZmllbGRzJCkge1xuIgorICAgICAgICAiICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpcbiIKKyAgICAgICAgIiAgICAgICAgQ29tcHV0ZVVua25vd25NZXNzYWdlU2V0SXRlbXNTaXplKCR1bmtub3duX2ZpZWxkcyQpO1xuIgorICAgICAgICAiICB9XG4iCisgICAgICAgICIgIGludCBjYWNoZWRfc2l6ZSA9ICIKKyAgICAgICAgIjo6X3BiaTo6VG9DYWNoZWRTaXplKHRvdGFsX3NpemUpO1xuIgorICAgICAgICAiICBTZXRDYWNoZWRTaXplKGNhY2hlZF9zaXplKTtcbiIKKyAgICAgICAgIiAgcmV0dXJuIHRvdGFsX3NpemU7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAobnVtX3JlcXVpcmVkX2ZpZWxkc18gPiAxKSB7CisgICAgLy8gRW1pdCBhIGZ1bmN0aW9uIChyYXJlbHkgdXNlZCwgd2UgaG9wZSkgdGhhdCBoYW5kbGVzIHRoZSByZXF1aXJlZCBmaWVsZHMKKyAgICAvLyBieSBjaGVja2luZyBmb3IgZWFjaCBvbmUgaW5kaXZpZHVhbGx5LgorICAgIGZvcm1hdCgKKyAgICAgICAgInNpemVfdCAkY2xhc3NuYW1lJDo6UmVxdWlyZWRGaWVsZHNCeXRlU2l6ZUZhbGxiYWNrKCkgY29uc3Qge1xuIgorICAgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHJlcXVpcmVkX2ZpZWxkc19ieXRlX3NpemVfZmFsbGJhY2tfc3RhcnQ6IgorICAgICAgICAiJGZ1bGxfbmFtZSQpXG4iKTsKKyAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgZm9ybWF0KCJzaXplX3QgdG90YWxfc2l6ZSA9IDA7XG4iKTsKKyAgICBmb3IgKGF1dG8gZmllbGQgOiBvcHRpbWl6ZWRfb3JkZXJfKSB7CisgICAgICBpZiAoZmllbGQtPmlzX3JlcXVpcmVkKCkpIHsKKyAgICAgICAgZm9ybWF0KAorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgImlmIChfaW50ZXJuYWxfaGFzXyQxJCgpKSB7XG4iLAorICAgICAgICAgICAgRmllbGROYW1lKGZpZWxkKSk7CisgICAgICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgICAgICAgUHJpbnRGaWVsZENvbW1lbnQoZm9ybWF0LCBmaWVsZCk7CisgICAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVCeXRlU2l6ZShwcmludGVyKTsKKyAgICAgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICAgICAgZm9ybWF0KCJ9XG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9ybWF0KAorICAgICAgICAiXG4iCisgICAgICAgICJyZXR1cm4gdG90YWxfc2l6ZTtcbiIpOworICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgZm9ybWF0KCJ9XG4iKTsKKyAgfQorCisgIGZvcm1hdCgKKyAgICAgICJzaXplX3QgJGNsYXNzbmFtZSQ6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHtcbiIKKyAgICAgICIkYW5ub3RhdGVfYnl0ZXNpemUkIgorICAgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDokZnVsbF9uYW1lJClcbiIpOworICBmb3JtYXQuSW5kZW50KCk7CisgIGZvcm1hdCgKKyAgICAgICJzaXplX3QgdG90YWxfc2l6ZSA9IDA7XG4iCisgICAgICAiXG4iKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIGZvcm1hdCgKKyAgICAgICAgInRvdGFsX3NpemUgKz0gJGV4dGVuc2lvbnMkLkJ5dGVTaXplKCk7XG4iCisgICAgICAgICJcbiIpOworICB9CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzOworICBTZXRVbmtub3duRmllbGRzVmFyaWFibGUoZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCAmdmFycyk7CisgIGZvcm1hdC5BZGRNYXAodmFycyk7CisKKyAgLy8gSGFuZGxlIHJlcXVpcmVkIGZpZWxkcyAoaWYgYW55KS4gIFdlIGV4cGVjdCBhbGwgb2YgdGhlbSB0byBiZQorICAvLyBwcmVzZW50LCBzbyBlbWl0IG9uZSBjb25kaXRpb25hbCB0aGF0IGNoZWNrcyBmb3IgdGhhdC4gIElmIHRoZXkgYXJlIGFsbAorICAvLyBwcmVzZW50IHRoZW4gdGhlIGZhc3QgcGF0aCBleGVjdXRlczsgb3RoZXJ3aXNlIHRoZSBzbG93IHBhdGggZXhlY3V0ZXMuCisgIGlmIChudW1fcmVxdWlyZWRfZmllbGRzXyA+IDEpIHsKKyAgICAvLyBUaGUgZmFzdCBwYXRoIHdvcmtzIGlmIGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQuCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IG1hc2tzX2Zvcl9oYXNfYml0cyA9IFJlcXVpcmVkRmllbGRzQml0TWFzaygpOworICAgIGZvcm1hdCgiaWYgKCQxJCkgeyAgLy8gQWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudC5cbiIsCisgICAgICAgICAgIENvbmRpdGlvbmFsVG9DaGVja0JpdG1hc2tzKG1hc2tzX2Zvcl9oYXNfYml0cykpOworICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgICAvLyBPbmVvZiBmaWVsZHMgY2Fubm90IGJlIHJlcXVpcmVkLCBzbyBvcHRpbWl6ZWRfb3JkZXJfIGNvbnRhaW5zIGFsbCBvZiB0aGUKKyAgICAvLyBmaWVsZHMgdGhhdCB3ZSBuZWVkIHRvIHBvdGVudGlhbGx5IGVtaXQuCisgICAgZm9yIChhdXRvIGZpZWxkIDogb3B0aW1pemVkX29yZGVyXykgeworICAgICAgaWYgKCFmaWVsZC0+aXNfcmVxdWlyZWQoKSkgY29udGludWU7CisgICAgICBQcmludEZpZWxkQ29tbWVudChmb3JtYXQsIGZpZWxkKTsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVCeXRlU2l6ZShwcmludGVyKTsKKyAgICAgIGZvcm1hdCgiXG4iKTsKKyAgICB9CisgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICBmb3JtYXQoCisgICAgICAgICJ9IGVsc2Uge1xuIiAgLy8gdGhlIHNsb3cgcGF0aAorICAgICAgICAiICB0b3RhbF9zaXplICs9IFJlcXVpcmVkRmllbGRzQnl0ZVNpemVGYWxsYmFjaygpO1xuIgorICAgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgLy8gbnVtX3JlcXVpcmVkX2ZpZWxkc18gPD0gMTogbm8gbmVlZCB0byBiZSB0cmlja3kKKyAgICBmb3IgKGF1dG8gZmllbGQgOiBvcHRpbWl6ZWRfb3JkZXJfKSB7CisgICAgICBpZiAoIWZpZWxkLT5pc19yZXF1aXJlZCgpKSBjb250aW51ZTsKKyAgICAgIFByaW50RmllbGRDb21tZW50KGZvcm1hdCwgZmllbGQpOworICAgICAgZm9ybWF0KCJpZiAoX2ludGVybmFsX2hhc18kMSQoKSkge1xuIiwgRmllbGROYW1lKGZpZWxkKSk7CisgICAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQnl0ZVNpemUocHJpbnRlcik7CisgICAgICBmb3JtYXQuT3V0ZGVudCgpOworICAgICAgZm9ybWF0KCJ9XG4iKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPj4gY2h1bmtzID0gQ29sbGVjdEZpZWxkcygKKyAgICAgIG9wdGltaXplZF9vcmRlcl8sCisgICAgICBbJl0oY29uc3QgRmllbGREZXNjcmlwdG9yKiBhLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGIpIC0+IGJvb2wgeworICAgICAgICByZXR1cm4gYS0+bGFiZWwoKSA9PSBiLT5sYWJlbCgpICYmIEhhc0J5dGVJbmRleChhKSA9PSBIYXNCeXRlSW5kZXgoYikgJiYKKyAgICAgICAgICAgICAgIFNob3VsZFNwbGl0KGEsIG9wdGlvbnNfKSA9PSBTaG91bGRTcGxpdChiLCBvcHRpb25zXyk7CisgICAgICB9KTsKKworICAvLyBSZW1vdmUgY2h1bmtzIHdpdGggcmVxdWlyZWQgZmllbGRzLgorICBjaHVua3MuZXJhc2Uoc3RkOjpyZW1vdmVfaWYoY2h1bmtzLmJlZ2luKCksIGNodW5rcy5lbmQoKSwgSXNSZXF1aXJlZCksCisgICAgICAgICAgICAgICBjaHVua3MuZW5kKCkpOworCisgIENvbGRDaHVua1NraXBwZXIgY29sZF9za2lwcGVyKGRlc2NyaXB0b3JfLCBvcHRpb25zXywgY2h1bmtzLCBoYXNfYml0X2luZGljZXNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ29sZFJhdGlvKTsKKyAgaW50IGNhY2hlZF9oYXNfd29yZF9pbmRleCA9IC0xOworCisgIGZvcm1hdCgKKyAgICAgICIkdWludDMyJCBjYWNoZWRfaGFzX2JpdHMgPSAwO1xuIgorICAgICAgIi8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZFxuIgorICAgICAgIih2b2lkKSBjYWNoZWRfaGFzX2JpdHM7XG5cbiIpOworCisgIGZvciAoaW50IGNodW5rX2luZGV4ID0gMDsgY2h1bmtfaW5kZXggPCBjaHVua3Muc2l6ZSgpOyBjaHVua19pbmRleCsrKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGNodW5rID0gY2h1bmtzW2NodW5rX2luZGV4XTsKKyAgICBjb25zdCBib29sIGhhdmVfb3V0ZXJfaWYgPQorICAgICAgICBjaHVuay5zaXplKCkgPiAxICYmIEhhc1dvcmRJbmRleChjaHVua1swXSkgIT0ga05vSGFzYml0OworICAgIGNvbGRfc2tpcHBlci5PblN0YXJ0Q2h1bmsoY2h1bmtfaW5kZXgsIGNhY2hlZF9oYXNfd29yZF9pbmRleCwgIiIsIHByaW50ZXIpOworCisgICAgaWYgKGhhdmVfb3V0ZXJfaWYpIHsKKyAgICAgIC8vIEVtaXQgYW4gaWYoKSB0aGF0IHdpbGwgbGV0IHVzIHNraXAgdGhlIHdob2xlIGNodW5rIGlmIG5vbmUgYXJlIHNldC4KKyAgICAgIHVpbnQzMl90IGNodW5rX21hc2sgPSBHZW5DaHVua01hc2soY2h1bmssIGhhc19iaXRfaW5kaWNlc18pOworICAgICAgc3RkOjpzdHJpbmcgY2h1bmtfbWFza19zdHIgPQorICAgICAgICAgIFN0ckNhdChzdHJpbmdzOjpIZXgoY2h1bmtfbWFzaywgc3RyaW5nczo6WkVST19QQURfOCkpOworCisgICAgICAvLyBDaGVjayAodXAgdG8pIDggaGFzX2JpdHMgYXQgYSB0aW1lIGlmIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBmaWVsZCBpbgorICAgICAgLy8gdGhpcyBjaHVuay4gIER1ZSB0byBmaWVsZCBsYXlvdXQgb3JkZXJpbmcsIHdlIG1heSBjaGVjaworICAgICAgLy8gX2hhc19iaXRzX1tsYXN0X2NodW5rICogOCAvIDMyXSBtdWx0aXBsZSB0aW1lcy4KKyAgICAgIEdPT0dMRV9EQ0hFQ0tfTEUoMiwgcG9wY250KGNodW5rX21hc2spKTsKKyAgICAgIEdPT0dMRV9EQ0hFQ0tfR0UoOCwgcG9wY250KGNodW5rX21hc2spKTsKKworICAgICAgaWYgKGNhY2hlZF9oYXNfd29yZF9pbmRleCAhPSBIYXNXb3JkSW5kZXgoY2h1bmsuZnJvbnQoKSkpIHsKKyAgICAgICAgY2FjaGVkX2hhc193b3JkX2luZGV4ID0gSGFzV29yZEluZGV4KGNodW5rLmZyb250KCkpOworICAgICAgICBmb3JtYXQoImNhY2hlZF9oYXNfYml0cyA9ICRoYXNfYml0cyRbJDEkXTtcbiIsIGNhY2hlZF9oYXNfd29yZF9pbmRleCk7CisgICAgICB9CisgICAgICBmb3JtYXQoImlmIChjYWNoZWRfaGFzX2JpdHMgJiAweCQxJHUpIHtcbiIsIGNodW5rX21hc2tfc3RyKTsKKyAgICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgICB9CisKKyAgICAvLyBHbyBiYWNrIGFuZCBlbWl0IGNoZWNrcyBmb3IgZWFjaCBvZiB0aGUgZmllbGRzIHdlIHByb2Nlc3NlZC4KKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGNodW5rLnNpemUoKTsgaisrKSB7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gY2h1bmtbal07CisgICAgICBjb25zdCBGaWVsZEdlbmVyYXRvciYgZ2VuZXJhdG9yID0gZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKTsKKyAgICAgIGJvb2wgaGF2ZV9lbmNsb3NpbmdfaWYgPSBmYWxzZTsKKyAgICAgIGJvb2wgbmVlZF9leHRyYV9uZXdsaW5lID0gZmFsc2U7CisKKyAgICAgIFByaW50RmllbGRDb21tZW50KGZvcm1hdCwgZmllbGQpOworCisgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgLy8gTm8gcHJlc2VuY2UgY2hlY2sgaXMgcmVxdWlyZWQuCisgICAgICAgIG5lZWRfZXh0cmFfbmV3bGluZSA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKEhhc0hhc2JpdChmaWVsZCkpIHsKKyAgICAgICAgUHJpbnRQcmVzZW5jZUNoZWNrKGZvcm1hdCwgZmllbGQsIGhhc19iaXRfaW5kaWNlc18sIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FjaGVkX2hhc193b3JkX2luZGV4KTsKKyAgICAgICAgaGF2ZV9lbmNsb3NpbmdfaWYgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2l0aG91dCBmaWVsZCBwcmVzZW5jZTogZmllbGQgaXMgc2VyaWFsaXplZCBvbmx5IGlmIGl0IGhhcyBhCisgICAgICAgIC8vIG5vbi1kZWZhdWx0IHZhbHVlLgorICAgICAgICBoYXZlX2VuY2xvc2luZ19pZiA9CisgICAgICAgICAgICBFbWl0RmllbGROb25EZWZhdWx0Q29uZGl0aW9uKHByaW50ZXIsICJ0aGlzLT4iLCBmaWVsZCk7CisgICAgICB9CisKKyAgICAgIGdlbmVyYXRvci5HZW5lcmF0ZUJ5dGVTaXplKHByaW50ZXIpOworCisgICAgICBpZiAoaGF2ZV9lbmNsb3NpbmdfaWYpIHsKKyAgICAgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICAgICAgZm9ybWF0KAorICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICJcbiIpOworICAgICAgfQorICAgICAgaWYgKG5lZWRfZXh0cmFfbmV3bGluZSkgeworICAgICAgICBmb3JtYXQoIlxuIik7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGhhdmVfb3V0ZXJfaWYpIHsKKyAgICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgICBmb3JtYXQoIn1cbiIpOworICAgIH0KKworICAgIGlmIChjb2xkX3NraXBwZXIuT25FbmRDaHVuayhjaHVua19pbmRleCwgcHJpbnRlcikpIHsKKyAgICAgIC8vIFJlc2V0IGhlcmUgYXMgaXQgbWF5IGhhdmUgYmVlbiB1cGRhdGVkIGluIGp1c3QgY2xvc2VkIGlmIHN0YXRlbWVudC4KKyAgICAgIGNhY2hlZF9oYXNfd29yZF9pbmRleCA9IC0xOworICAgIH0KKyAgfQorCisgIC8vIEZpZWxkcyBpbnNpZGUgYSBvbmVvZiBkb24ndCB1c2UgX2hhc19iaXRzXyBzbyB3ZSBjb3VudCB0aGVtIGluIGEgc2VwYXJhdGUKKyAgLy8gcGFzcy4KKyAgZm9yIChhdXRvIG9uZW9mIDogT25lT2ZSYW5nZShkZXNjcmlwdG9yXykpIHsKKyAgICBmb3JtYXQoInN3aXRjaCAoJDEkX2Nhc2UoKSkge1xuIiwgb25lb2YtPm5hbWUoKSk7CisgICAgZm9ybWF0LkluZGVudCgpOworICAgIGZvciAoYXV0byBmaWVsZCA6IEZpZWxkUmFuZ2Uob25lb2YpKSB7CisgICAgICBQcmludEZpZWxkQ29tbWVudChmb3JtYXQsIGZpZWxkKTsKKyAgICAgIGZvcm1hdCgiY2FzZSBrJDEkOiB7XG4iLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGZpZWxkLT5uYW1lKCksIHRydWUpKTsKKyAgICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgICAgIGlmICghSXNGaWVsZFN0cmlwcGVkKGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUJ5dGVTaXplKHByaW50ZXIpOworICAgICAgfQorICAgICAgZm9ybWF0KCJicmVhaztcbiIpOworICAgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICAgIGZvcm1hdCgifVxuIik7CisgICAgfQorICAgIGZvcm1hdCgKKyAgICAgICAgImNhc2UgJDEkX05PVF9TRVQ6IHtcbiIKKyAgICAgICAgIiAgYnJlYWs7XG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICBUb1VwcGVyKG9uZW9mLT5uYW1lKCkpKTsKKyAgICBmb3JtYXQuT3V0ZGVudCgpOworICAgIGZvcm1hdCgifVxuIik7CisgIH0KKworICBpZiAobnVtX3dlYWtfZmllbGRzXykgeworICAgIC8vIFRhZ1NpemUgKyBNZXNzYWdlU2l6ZQorICAgIGZvcm1hdCgidG90YWxfc2l6ZSArPSAkd2Vha19maWVsZF9tYXAkLkJ5dGVTaXplTG9uZygpO1xuIik7CisgIH0KKworICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIC8vIFdlIGdvIG91dCBvZiBvdXIgd2F5IHRvIHB1dCB0aGUgY29tcHV0YXRpb24gb2YgdGhlIHVuY29tbW9uIHBhdGggb2YKKyAgICAvLyB1bmtub3duIGZpZWxkcyBpbiB0YWlsIHBvc2l0aW9uLiBUaGlzIGFsbG93cyBmb3IgYmV0dGVyIGNvZGUgZ2VuZXJhdGlvbgorICAgIC8vIG9mIHRoaXMgZnVuY3Rpb24gZm9yIHNpbXBsZSBwcm90b3MuCisgICAgZm9ybWF0KAorICAgICAgICAicmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICYkY2FjaGVkX3NpemUkKTtcbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgiaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoJGhhdmVfdW5rbm93bl9maWVsZHMkKSkge1xuIik7CisgICAgZm9ybWF0KCIgIHRvdGFsX3NpemUgKz0gJHVua25vd25fZmllbGRzJC5zaXplKCk7XG4iKTsKKyAgICBmb3JtYXQoIn1cbiIpOworCisgICAgLy8gV2UgdXBkYXRlIF9jYWNoZWRfc2l6ZV8gZXZlbiB0aG91Z2ggdGhpcyBpcyBhIGNvbnN0IG1ldGhvZC4gIEJlY2F1c2UKKyAgICAvLyBjb25zdCBtZXRob2RzIG1pZ2h0IGJlIGNhbGxlZCBjb25jdXJyZW50bHkgdGhpcyBuZWVkcyB0byBiZSBhdG9taWMKKyAgICAvLyBvcGVyYXRpb25zIG9yIHRoZSBwcm9ncmFtIGlzIHVuZGVmaW5lZC4gIEluIHByYWN0aWNlLCBzaW5jZSBhbnkKKyAgICAvLyBjb25jdXJyZW50IHdyaXRlcyB3aWxsIGJlIHdyaXRpbmcgdGhlIGV4YWN0IHNhbWUgdmFsdWUsIG5vcm1hbCB3cml0ZXMKKyAgICAvLyB3aWxsIHdvcmsgb24gYWxsIGNvbW1vbiBwcm9jZXNzb3JzLiBXZSB1c2UgYSBkZWRpY2F0ZWQgd3JhcHBlciBjbGFzcyB0bworICAgIC8vIGFic3RyYWN0IGF3YXkgdGhlIHVuZGVybHlpbmcgYXRvbWljLiBUaGlzIG1ha2VzIGl0IGVhc2llciBvbiBwbGF0Zm9ybXMKKyAgICAvLyB3aGVyZSBldmVuIHJlbGF4ZWQgbWVtb3J5IG9yZGVyIG1pZ2h0IGhhdmUgcGVyZiBpbXBhY3QgdG8gcmVwbGFjZSBpdCB3aXRoCisgICAgLy8gb3JkaW5hcnkgbG9hZHMgYW5kIHN0b3Jlcy4KKyAgICBmb3JtYXQoCisgICAgICAgICJpbnQgY2FjaGVkX3NpemUgPSA6Ol9wYmk6OlRvQ2FjaGVkU2l6ZSh0b3RhbF9zaXplKTtcbiIKKyAgICAgICAgIlNldENhY2hlZFNpemUoY2FjaGVkX3NpemUpO1xuIgorICAgICAgICAicmV0dXJuIHRvdGFsX3NpemU7XG4iKTsKKyAgfQorCisgIGZvcm1hdC5PdXRkZW50KCk7CisgIGZvcm1hdCgifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVJc0luaXRpYWxpemVkKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChIYXNTaW1wbGVCYXNlQ2xhc3MoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgcmV0dXJuOworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoImJvb2wgJGNsYXNzbmFtZSQ6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7XG4iKTsKKyAgZm9ybWF0LkluZGVudCgpOworCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiaWYgKCEkZXh0ZW5zaW9ucyQuSXNJbml0aWFsaXplZCgpKSB7XG4iCisgICAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgIn1cblxuIik7CisgIH0KKworICBpZiAobnVtX3JlcXVpcmVkX2ZpZWxkc18gPiAwKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiaWYgKF9JbnRlcm5hbDo6TWlzc2luZ1JlcXVpcmVkRmllbGRzKCRoYXNfYml0cyQpKSIKKyAgICAgICAgIiByZXR1cm4gZmFsc2U7XG4iKTsKKyAgfQorCisgIC8vIE5vdyBjaGVjayB0aGF0IGFsbCBub24tb25lb2YgZW1iZWRkZWQgbWVzc2FnZXMgYXJlIGluaXRpYWxpemVkLgorICBmb3IgKGF1dG8gZmllbGQgOiBvcHRpbWl6ZWRfb3JkZXJfKSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUlzSW5pdGlhbGl6ZWQocHJpbnRlcik7CisgIH0KKyAgaWYgKG51bV93ZWFrX2ZpZWxkc18pIHsKKyAgICAvLyBGb3IgV2VhayBmaWVsZHMuCisgICAgZm9ybWF0KCJpZiAoISR3ZWFrX2ZpZWxkX21hcCQuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7XG4iKTsKKyAgfQorICAvLyBHbyB0aHJvdWdoIHRoZSBvbmVvZiBmaWVsZHMsIGVtaXR0aW5nIGEgc3dpdGNoIGlmIGFueSBtaWdodCBoYXZlIHJlcXVpcmVkCisgIC8vIGZpZWxkcy4KKyAgZm9yIChhdXRvIG9uZW9mIDogT25lT2ZSYW5nZShkZXNjcmlwdG9yXykpIHsKKyAgICBib29sIGhhc19yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gZmllbGQgOiBGaWVsZFJhbmdlKG9uZW9mKSkgeworICAgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFICYmCisgICAgICAgICAgIVNob3VsZElnbm9yZVJlcXVpcmVkRmllbGRDaGVjayhmaWVsZCwgb3B0aW9uc18pICYmCisgICAgICAgICAgc2NjX2FuYWx5emVyXy0+SGFzUmVxdWlyZWRGaWVsZHMoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSkgeworICAgICAgICBoYXNfcmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFoYXNfcmVxdWlyZWRfZmllbGRzKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBmb3JtYXQoInN3aXRjaCAoJDEkX2Nhc2UoKSkge1xuIiwgb25lb2YtPm5hbWUoKSk7CisgICAgZm9ybWF0LkluZGVudCgpOworICAgIGZvciAoYXV0byBmaWVsZCA6IEZpZWxkUmFuZ2Uob25lb2YpKSB7CisgICAgICBmb3JtYXQoImNhc2UgayQxJDoge1xuIiwgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShmaWVsZC0+bmFtZSgpLCB0cnVlKSk7CisgICAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgICBpZiAoIUlzRmllbGRTdHJpcHBlZChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVJc0luaXRpYWxpemVkKHByaW50ZXIpOworICAgICAgfQorICAgICAgZm9ybWF0KCJicmVhaztcbiIpOworICAgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICAgIGZvcm1hdCgifVxuIik7CisgICAgfQorICAgIGZvcm1hdCgKKyAgICAgICAgImNhc2UgJDEkX05PVF9TRVQ6IHtcbiIKKyAgICAgICAgIiAgYnJlYWs7XG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICBUb1VwcGVyKG9uZW9mLT5uYW1lKCkpKTsKKyAgICBmb3JtYXQuT3V0ZGVudCgpOworICAgIGZvcm1hdCgifVxuIik7CisgIH0KKworICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoCisgICAgICAiICByZXR1cm4gdHJ1ZTtcbiIKKyAgICAgICJ9XG4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2UuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmRmY2IzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZS5oCkBAIC0wLDAgKzEsMjMyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9NRVNTQUdFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX01FU1NBR0VfSF9fCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9sYXlvdXRfaGVscGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9vcHRpb25zLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wYXJzZV9mdW5jdGlvbl9nZW5lcmF0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKK2NsYXNzIFByaW50ZXI7ICAvLyBwcmludGVyLmgKK30KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK2NsYXNzIEVudW1HZW5lcmF0b3I7ICAgICAgIC8vIGVudW0uaAorY2xhc3MgRXh0ZW5zaW9uR2VuZXJhdG9yOyAgLy8gZXh0ZW5zaW9uLmgKKworY2xhc3MgTWVzc2FnZUdlbmVyYXRvciB7CisgcHVibGljOgorICAvLyBTZWUgZ2VuZXJhdG9yLmNjIGZvciB0aGUgbWVhbmluZyBvZiBkbGxleHBvcnRfZGVjbC4KKyAgTWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgaW50IGluZGV4X2luX2ZpbGVfbWVzc2FnZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNDQ0FuYWx5emVyKiBzY2NfYW5hbHl6ZXIpOworICB+TWVzc2FnZUdlbmVyYXRvcigpOworCisgIC8vIEFwcGVuZCB0aGUgdHdvIHR5cGVzIG9mIG5lc3RlZCBnZW5lcmF0b3JzIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZlY3Rvci4KKyAgdm9pZCBBZGRHZW5lcmF0b3JzKAorICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEVudW1HZW5lcmF0b3I+PiogZW51bV9nZW5lcmF0b3JzLAorICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEV4dGVuc2lvbkdlbmVyYXRvcj4+KiBleHRlbnNpb25fZ2VuZXJhdG9ycyk7CisKKyAgLy8gR2VuZXJhdGUgZGVmaW5pdGlvbnMgZm9yIHRoaXMgY2xhc3MgYW5kIGFsbCBpdHMgbmVzdGVkIHR5cGVzLgorICB2b2lkIEdlbmVyYXRlQ2xhc3NEZWZpbml0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBkZWZpbml0aW9ucyBvZiBpbmxpbmUgbWV0aG9kcyAocGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIGhlYWRlcgorICAvLyBmaWxlKS4KKyAgdm9pZCBHZW5lcmF0ZUlubGluZU1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIFNvdXJjZSBmaWxlIHN0dWZmLgorCisgIC8vIEdlbmVyYXRlIGFsbCBub24taW5saW5lIG1ldGhvZHMgZm9yIHRoaXMgY2xhc3MuCisgIHZvaWQgR2VuZXJhdGVDbGFzc01ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIHNvdXJjZSBmaWxlIGNvZGUgdGhhdCBzaG91bGQgZ28gb3V0c2lkZSBhbnkgbmFtZXNwYWNlLgorICB2b2lkIEdlbmVyYXRlU291cmNlSW5Qcm90bzJOYW1lc3BhY2UoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgcHJpdmF0ZToKKyAgLy8gR2VuZXJhdGUgZGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucyBvZiBhY2Nlc3NvcnMgZm9yIGZpZWxkcy4KKyAgdm9pZCBHZW5lcmF0ZUZpZWxkQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlRmllbGRBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgZmllbGQgb2Zmc2V0cyBhcnJheS4gIFJldHVybnMgdGhlIGEgcGFpciBvZiB0aGUgdG90YWwgbnVtYmVyCisgIC8vIG9mIGVudHJpZXMgZ2VuZXJhdGVkIGFuZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGhhc19iaXQgZW50cnkuCisgIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gR2VuZXJhdGVPZmZzZXRzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVNjaGVtYShpbzo6UHJpbnRlciogcHJpbnRlciwgaW50IG9mZnNldCwgaW50IGhhc19vZmZzZXQpOworCisgIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3Rvci4KKyAgdm9pZCBHZW5lcmF0ZVN0cnVjdG9ycyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gVGhlIGNvbXBpbGVyIHR5cGljYWxseSBnZW5lcmF0ZXMgbXVsdGlwbGUgY29waWVzIG9mIGVhY2ggY29uc3RydWN0b3IgYW5kCisgIC8vIGRlc3RydWN0b3I6IGh0dHA6Ly9nY2MuZ251Lm9yZy9idWdzLmh0bWwjbm9uYnVnc19jeHgKKyAgLy8gUGxhY2luZyBjb21tb24gY29kZSBpbiBhIHNlcGFyYXRlIG1ldGhvZCByZWR1Y2VzIHRoZSBnZW5lcmF0ZWQgY29kZSBzaXplLgorICAvLworICAvLyBHZW5lcmF0ZSB0aGUgc2hhcmVkIGNvbnN0cnVjdG9yIGNvZGUuCisgIHZvaWQgR2VuZXJhdGVTaGFyZWRDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworICAvLyBHZW5lcmF0ZSB0aGUgc2hhcmVkIGRlc3RydWN0b3IgY29kZS4KKyAgdm9pZCBHZW5lcmF0ZVNoYXJlZERlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgLy8gR2VuZXJhdGUgdGhlIGFyZW5hLXNwZWNpZmljIGRlc3RydWN0b3IgY29kZS4KKyAgdm9pZCBHZW5lcmF0ZUFyZW5hRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIHRoZSBjb25zdGV4cHIgY29uc3RydWN0b3IgZm9yIGNvbnN0YW50IGluaXRpYWxpemF0aW9uIG9mIHRoZQorICAvLyBkZWZhdWx0IGluc3RhbmNlLgorICB2b2lkIEdlbmVyYXRlQ29uc3RleHByQ29uc3RydWN0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIHZvaWQgR2VuZXJhdGVDcmVhdGVTcGxpdE1lc3NhZ2UoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlSW5pdERlZmF1bHRTcGxpdEluc3RhbmNlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBzdGFuZGFyZCBNZXNzYWdlIG1ldGhvZHMuCisgIHZvaWQgR2VuZXJhdGVDbGVhcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVPbmVvZkNsZWFyKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVZlcmlmeShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNCb2R5KGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc0JvZHlTaHVmZmxlZChpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVNZXJnZUZyb20oaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlQ2xhc3NTcGVjaWZpY01lcmdlSW1wbChpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVDb3B5RnJvbShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVTd2FwKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEhlbHBlcnMgZm9yIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkuCisgIC8vCisgIC8vIGNhY2hlZF9oYXNfYml0X2luZGV4IG1haW50YWlucyB0aGF0OgorICAvLyAgIGNhY2hlZF9oYXNfYml0cyA9IF9oYXNfYml0c19bY2FjaGVkX2hhc19iaXRfaW5kZXhdCisgIC8vIGZvciBjYWNoZWRfaGFzX2JpdF9pbmRleCA+PSAwCisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGVkX2hhc19iaXRzX2luZGV4KTsKKyAgLy8gR2VuZXJhdGUgYSBzd2l0Y2ggc3RhdGVtZW50IHRvIHNlcmlhbGl6ZSAyKyBmaWVsZHMgZnJvbSB0aGUgc2FtZSBvbmVvZi4KKyAgLy8gT3IsIGlmIGZpZWxkcy5zaXplKCkgPT0gMSwganVzdCBjYWxsIEdlbmVyYXRlU2VyaWFsaXplT25lRmllbGQoKS4KKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZU9uZW9mRmllbGRzKAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+JiBmaWVsZHMpOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplT25lRXh0ZW5zaW9uUmFuZ2UoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlKTsKKworICAvLyBHZW5lcmF0ZXMgaGFzX2ZvbygpIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGZvciBzaW5ndWxhciBmaWVsZCBoYXMtYml0cy4KKyAgdm9pZCBHZW5lcmF0ZVNpbmd1bGFyRmllbGRIYXNCaXRzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXR0ZXIgZm9ybWF0KTsKKyAgLy8gR2VuZXJhdGVzIGhhc19mb28oKSBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBmb3Igb25lb2YgZmllbGQgaGFzLWJpdHMuCisgIHZvaWQgR2VuZXJhdGVPbmVvZkhhc0JpdHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworICAvLyBHZW5lcmF0ZXMgaGFzX2Zvb19iYXIoKSBmdW5jdGlvbnMgZm9yIG9uZW9mIG1lbWJlcnMuCisgIHZvaWQgR2VuZXJhdGVPbmVvZk1lbWJlckhhc0JpdHMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZXImIGZvcm1hdCk7CisgIC8vIEdlbmVyYXRlcyB0aGUgY2xlYXJfZm9vKCkgbWV0aG9kIGZvciBhIGZpZWxkLgorICB2b2lkIEdlbmVyYXRlRmllbGRDbGVhcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBib29sIGlzX2lubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGVyIGZvcm1hdCk7CisKKyAgLy8gR2VuZXJhdGVzIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlJ3MgY29weSBjb25zdHJ1Y3Rvci4KKyAgdm9pZCBHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvckJvZHkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIGxldmVsIHRoYXQgdGhpcyBtZXNzYWdlIG5lZWRzIEFyZW5hRHRvci4gSWYgdGhlIG1lc3NhZ2UgaGFzCisgIC8vIGEgZmllbGQgdGhhdCBpcyBub3QgYXJlbmEtZXhjbHVzaXZlLCBpdCBuZWVkcyBhbiBBcmVuYUR0b3IKKyAgLy8gKGdvL3Byb3RvLWRlc3RydWN0b3IpLgorICAvLworICAvLyAtIFJldHVybmluZyBrTm9uZSBtZWFucyB3ZSBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIEFyZW5hRHRvci4KKyAgLy8gLSBSZXR1cm5pbmcga09uRGVtYW5kIG1lYW5zIHdlIG5lZWQgdG8gZ2VuZXJhdGUgQXJlbmFEdG9yLCBidXQgZG9uJ3QgbmVlZAorICAvLyAgIHRvIHJlZ2lzdGVyIEFyZW5hRHRvciBhdCBjb25zdHJ1Y3Rpb24uIFN1Y2ggYXMgd2hlbiB0aGUgbWVzc2FnZSdzCisgIC8vICAgQXJlbmFEdG9yIGNvZGUgaXMgb25seSBmb3IgZGVzdHJ1Y3RpbmcgaW5saW5lZCBzdHJpbmcuCisgIC8vIC0gUmV0dXJuaW5nIGtSZXF1aXJlZCBtZWFucyB3ZSBtZWVkIHRvIGdlbmVyYXRlIEFyZW5hRHRvciBhbmQgcmVnaXN0ZXIgaXQKKyAgLy8gICBhdCBjb25zdHJ1Y3Rpb24uCisgIEFyZW5hRHRvck5lZWRzIE5lZWRzQXJlbmFEZXN0cnVjdG9yKCkgY29uc3Q7CisKKyAgc2l6ZV90IEhhc0JpdHNTaXplKCkgY29uc3Q7CisgIHNpemVfdCBJbmxpbmVkU3RyaW5nRG9uYXRlZFNpemUoKSBjb25zdDsKKyAgaW50IEhhc0JpdEluZGV4KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYSkgY29uc3Q7CisgIGludCBIYXNCeXRlSW5kZXgoY29uc3QgRmllbGREZXNjcmlwdG9yKiBhKSBjb25zdDsKKyAgaW50IEhhc1dvcmRJbmRleChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGEpIGNvbnN0OworICBib29sIFNhbWVIYXNCeXRlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBiKSBjb25zdDsKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IFJlcXVpcmVkRmllbGRzQml0TWFzaygpIGNvbnN0OworCisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBpbnQgaW5kZXhfaW5fZmlsZV9tZXNzYWdlc187CisgIHN0ZDo6c3RyaW5nIGNsYXNzbmFtZV87CisgIE9wdGlvbnMgb3B0aW9uc187CisgIEZpZWxkR2VuZXJhdG9yTWFwIGZpZWxkX2dlbmVyYXRvcnNfOworICAvLyBvcHRpbWl6ZWRfb3JkZXJfIGlzIHRoZSBvcmRlciB3ZSBsYXlvdXQgdGhlIG1lc3NhZ2UncyBmaWVsZHMgaW4gdGhlCisgIC8vIGNsYXNzLiBUaGlzIGlzIHJldXNlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMgaW4tb3JkZXIgZm9yIGNhY2hlCisgIC8vIGVmZmljaWVuY3kuCisgIC8vCisgIC8vIG9wdGltaXplZF9vcmRlcl8gZXhjbHVkZXMgb25lb2YgZmllbGRzIGFuZCB3ZWFrIGZpZWxkcy4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gb3B0aW1pemVkX29yZGVyXzsKKyAgc3RkOjp2ZWN0b3I8aW50PiBoYXNfYml0X2luZGljZXNfOworICBpbnQgbWF4X2hhc19iaXRfaW5kZXhfOworCisgIC8vIEEgbWFwIGZyb20gZmllbGQgaW5kZXggdG8gaW5saW5lZF9zdHJpbmcgaW5kZXguIEZvciBub24taW5saW5lZC1zdHJpbmcKKyAgLy8gZmllbGRzLCB0aGUgZWxlbWVudCBpcyAtMS4gSWYgdGhlcmUgaXMgbm8gaW5saW5lZCBzdHJpbmcgaW4gdGhlIG1lc3NhZ2UsCisgIC8vIHRoaXMgaXMgZW1wdHkuCisgIHN0ZDo6dmVjdG9yPGludD4gaW5saW5lZF9zdHJpbmdfaW5kaWNlc187CisgIC8vIFRoZSBjb3VudCBvZiBpbmxpbmVkX3N0cmluZyBmaWVsZHMgaW4gdGhlIG1lc3NhZ2UuCisgIGludCBtYXhfaW5saW5lZF9zdHJpbmdfaW5kZXhfOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEVudW1HZW5lcmF0b3IqPiBlbnVtX2dlbmVyYXRvcnNfOworICBzdGQ6OnZlY3Rvcjxjb25zdCBFeHRlbnNpb25HZW5lcmF0b3IqPiBleHRlbnNpb25fZ2VuZXJhdG9yc187CisgIGludCBudW1fcmVxdWlyZWRfZmllbGRzXzsKKyAgaW50IG51bV93ZWFrX2ZpZWxkc187CisKKyAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2VMYXlvdXRIZWxwZXI+IG1lc3NhZ2VfbGF5b3V0X2hlbHBlcl87CisgIHN0ZDo6dW5pcXVlX3B0cjxQYXJzZUZ1bmN0aW9uR2VuZXJhdG9yPiBwYXJzZV9mdW5jdGlvbl9nZW5lcmF0b3JfOworCisgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyXzsKKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcmlhYmxlc187CisKKyAgZnJpZW5kIGNsYXNzIEZpbGVHZW5lcmF0b3I7CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXNzYWdlR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9NRVNTQUdFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9maWVsZC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2VfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4N2EwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2VfZmllbGQuY2MKQEAgLTAsMCArMSw5NTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9maWVsZC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK25hbWVzcGFjZSB7CitzdGQ6OnN0cmluZyBSZWludGVycHJldENhc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbXBsaWNpdF93ZWFrX2ZpZWxkKSB7CisgIGlmIChpbXBsaWNpdF93ZWFrX2ZpZWxkKSB7CisgICAgcmV0dXJuICJyZWludGVycHJldF9jYXN0PCAiICsgdHlwZSArICIgPigiICsgZXhwcmVzc2lvbiArICIpIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZXhwcmVzc2lvbjsKKyAgfQorfQorCit2b2lkIFNldE1lc3NhZ2VWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGJvb2wgaW1wbGljaXRfd2VhaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgdmFyaWFibGVzLCBvcHRpb25zKTsKKyAgKCp2YXJpYWJsZXMpWyJ0eXBlIl0gPSBGaWVsZE1lc3NhZ2VUeXBlTmFtZShkZXNjcmlwdG9yLCBvcHRpb25zKTsKKyAgKCp2YXJpYWJsZXMpWyJjYXN0ZWRfbWVtYmVyIl0gPSBSZWludGVycHJldENhc3QoCisgICAgICAoKnZhcmlhYmxlcylbInR5cGUiXSArICIqIiwgKCp2YXJpYWJsZXMpWyJmaWVsZCJdLCBpbXBsaWNpdF93ZWFrKTsKKyAgKCp2YXJpYWJsZXMpWyJjYXN0ZWRfbWVtYmVyX2NvbnN0Il0gPQorICAgICAgUmVpbnRlcnByZXRDYXN0KCJjb25zdCAiICsgKCp2YXJpYWJsZXMpWyJ0eXBlIl0gKyAiJiIsCisgICAgICAgICAgICAgICAgICAgICAgIioiICsgKCp2YXJpYWJsZXMpWyJmaWVsZCJdLCBpbXBsaWNpdF93ZWFrKTsKKyAgKCp2YXJpYWJsZXMpWyJ0eXBlX2RlZmF1bHRfaW5zdGFuY2UiXSA9CisgICAgICBRdWFsaWZpZWREZWZhdWx0SW5zdGFuY2VOYW1lKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLCBvcHRpb25zKTsKKyAgKCp2YXJpYWJsZXMpWyJ0eXBlX2RlZmF1bHRfaW5zdGFuY2VfcHRyIl0gPSBSZWludGVycHJldENhc3QoCisgICAgICAiY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VMaXRlKiIsCisgICAgICBRdWFsaWZpZWREZWZhdWx0SW5zdGFuY2VQdHIoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCksIG9wdGlvbnMpLAorICAgICAgaW1wbGljaXRfd2Vhayk7CisgICgqdmFyaWFibGVzKVsidHlwZV9yZWZlcmVuY2VfZnVuY3Rpb24iXSA9CisgICAgICBpbXBsaWNpdF93ZWFrID8gKCIgIDo6IiArICgqdmFyaWFibGVzKVsicHJvdG9fbnMiXSArCisgICAgICAgICAgICAgICAgICAgICAgICI6OmludGVybmFsOjpTdHJvbmdSZWZlcmVuY2UocmVpbnRlcnByZXRfY2FzdDxjb25zdCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgKCp2YXJpYWJsZXMpWyJ0eXBlIl0gKyAiJj4oXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgKCp2YXJpYWJsZXMpWyJ0eXBlX2RlZmF1bHRfaW5zdGFuY2UiXSArICIpKTtcbiIpCisgICAgICAgICAgICAgICAgICAgIDogIiI7CisgIC8vIE5PVEU6IEVzY2FwZWQgaGVyZSB0byB1bmJsb2NrIHByb3RvMS0+cHJvdG8yIG1pZ3JhdGlvbi4KKyAgLy8gVE9ETyhsaXVqaXNpKTogRXh0ZW5kIHRoaXMgdG8gYXBwbHkgZm9yIG90aGVyIGNvbmZsaWN0aW5nIG1ldGhvZHMuCisgICgqdmFyaWFibGVzKVsicmVsZWFzZV9uYW1lIl0gPQorICAgICAgU2FmZUZ1bmN0aW9uTmFtZShkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSwgZGVzY3JpcHRvciwgInJlbGVhc2VfIik7CisgICgqdmFyaWFibGVzKVsiZnVsbF9uYW1lIl0gPSBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKQorICAgIDogRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgb3B0aW9ucyksCisgICAgICBpbXBsaWNpdF93ZWFrX2ZpZWxkXygKKyAgICAgICAgICBJc0ltcGxpY2l0V2Vha0ZpZWxkKGRlc2NyaXB0b3IsIG9wdGlvbnMsIHNjY19hbmFseXplcikpLAorICAgICAgaGFzX3JlcXVpcmVkX2ZpZWxkc18oCisgICAgICAgICAgc2NjX2FuYWx5emVyLT5IYXNSZXF1aXJlZEZpZWxkcyhkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKSkpIHsKKyAgU2V0TWVzc2FnZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBvcHRpb25zLCBpbXBsaWNpdF93ZWFrX2ZpZWxkXywgJnZhcmlhYmxlc18pOworfQorCitNZXNzYWdlRmllbGRHZW5lcmF0b3I6On5NZXNzYWdlRmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoaW1wbGljaXRfd2Vha19maWVsZF8pIHsKKyAgICBmb3JtYXQoIjo6JHByb3RvX25zJDo6TWVzc2FnZUxpdGUqICRuYW1lJF87XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoIiR0eXBlJCogJG5hbWUkXztcbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChJc0ZpZWxkU3RyaXBwZWQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgIiRkZXByZWNhdGVkX2F0dHIkY29uc3QgJHR5cGUkJiAkezEkJG5hbWUkJH0kKCkgY29uc3QgeyAiCisgICAgICAgICJfX2J1aWx0aW5fdHJhcCgpOyB9XG4iCisgICAgICAgICJQUk9UT0JVRl9OT0RJU0NBUkQgJGRlcHJlY2F0ZWRfYXR0ciQkdHlwZSQqICIKKyAgICAgICAgIiR7MSQkcmVsZWFzZV9uYW1lJCR9JCgpIHsgIgorICAgICAgICAiX19idWlsdGluX3RyYXAoKTsgfVxuIgorICAgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciQkdHlwZSQqICR7MSRtdXRhYmxlXyRuYW1lJCR9JCgpIHsgIgorICAgICAgICAiX19idWlsdGluX3RyYXAoKTsgfVxuIgorICAgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkICR7MSRzZXRfYWxsb2NhdGVkXyRuYW1lJCR9JCIKKyAgICAgICAgIigkdHlwZSQqICRuYW1lJCkgeyBfX2J1aWx0aW5fdHJhcCgpOyB9XG4iCisgICAgICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgIgorICAgICAgICAiJHsxJHVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkXyRuYW1lJCR9JChcbiIKKyAgICAgICAgIiAgICAkdHlwZSQqICRuYW1lJCkgeyBfX2J1aWx0aW5fdHJhcCgpOyB9XG4iCisgICAgICAgICIkZGVwcmVjYXRlZF9hdHRyJCR0eXBlJCogJHsxJHVuc2FmZV9hcmVuYV9yZWxlYXNlXyRuYW1lJCR9JCgpIHsgIgorICAgICAgICAiX19idWlsdGluX3RyYXAoKTsgfVxuIiwKKyAgICAgICAgZGVzY3JpcHRvcl8pOworICAgIHJldHVybjsKKyAgfQorICBmb3JtYXQoCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciRjb25zdCAkdHlwZSQmICR7MSQkbmFtZSQkfSQoKSBjb25zdDtcbiIKKyAgICAgICJQUk9UT0JVRl9OT0RJU0NBUkQgJGRlcHJlY2F0ZWRfYXR0ciQkdHlwZSQqICIKKyAgICAgICIkezEkJHJlbGVhc2VfbmFtZSQkfSQoKTtcbiIKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJCR0eXBlJCogJHsxJG11dGFibGVfJG5hbWUkJH0kKCk7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkICR7MSRzZXRfYWxsb2NhdGVkXyRuYW1lJCR9JCIKKyAgICAgICIoJHR5cGUkKiAkbmFtZSQpO1xuIiwKKyAgICAgIGRlc2NyaXB0b3JfKTsKKyAgaWYgKCFJc0ZpZWxkU3RyaXBwZWQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgInByaXZhdGU6XG4iCisgICAgICAgICJjb25zdCAkdHlwZSQmICR7MSRfaW50ZXJuYWxfJG5hbWUkJH0kKCkgY29uc3Q7XG4iCisgICAgICAgICIkdHlwZSQqICR7MSRfaW50ZXJuYWxfbXV0YWJsZV8kbmFtZSQkfSQoKTtcbiIKKyAgICAgICAgInB1YmxpYzpcbiIsCisgICAgICAgIGRlc2NyaXB0b3JfKTsKKyAgfQorICBmb3JtYXQoCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkICIKKyAgICAgICIkezEkdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfJG5hbWUkJH0kKFxuIgorICAgICAgIiAgICAkdHlwZSQqICRuYW1lJCk7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciQkdHlwZSQqICR7MSR1bnNhZmVfYXJlbmFfcmVsZWFzZV8kbmFtZSQkfSQoKTtcbiIsCisgICAgICBkZXNjcmlwdG9yXyk7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU5vbklubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHt9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgImlubGluZSBjb25zdCAkdHlwZSQmICRjbGFzc25hbWUkOjpfaW50ZXJuYWxfJG5hbWUkKCkgY29uc3Qge1xuIgorICAgICAgIiR0eXBlX3JlZmVyZW5jZV9mdW5jdGlvbiQiCisgICAgICAiICBjb25zdCAkdHlwZSQqIHAgPSAkY2FzdGVkX21lbWJlciQ7XG4iCisgICAgICAiICByZXR1cm4gcCAhPSBudWxscHRyID8gKnAgOiByZWludGVycHJldF9jYXN0PGNvbnN0ICR0eXBlJCY+KFxuIgorICAgICAgIiAgICAgICR0eXBlX2RlZmF1bHRfaW5zdGFuY2UkKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIGNvbnN0ICR0eXBlJCYgJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICIkYW5ub3RhdGVfZ2V0JCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gX2ludGVybmFsXyRuYW1lJCgpO1xuIgorICAgICAgIn1cbiIpOworCisgIGZvcm1hdCgKKyAgICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6dW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfJG5hbWUkKFxuIgorICAgICAgIiAgICAkdHlwZSQqICRuYW1lJCkge1xuIgorICAgICAgIiRtYXliZV9wcmVwYXJlX3NwbGl0X21lc3NhZ2UkIgorICAgICAgLy8gSWYgd2UncmUgbm90IG9uIGFuIGFyZW5hLCBmcmVlIHdoYXRldmVyIHdlIHdlcmUgaG9sZGluZyBiZWZvcmUuCisgICAgICAvLyAoSWYgd2UgYXJlIG9uIGFyZW5hLCB3ZSBjYW4ganVzdCBmb3JnZXQgdGhlIGVhcmxpZXIgcG9pbnRlci4pCisgICAgICAiICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikge1xuIgorICAgICAgIiAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDw6OiRwcm90b19ucyQ6Ok1lc3NhZ2VMaXRlKj4oJGZpZWxkJCk7XG4iCisgICAgICAiICB9XG4iKTsKKyAgaWYgKGltcGxpY2l0X3dlYWtfZmllbGRfKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiICAkZmllbGQkID0gcmVpbnRlcnByZXRfY2FzdDw6OiRwcm90b19ucyQ6Ok1lc3NhZ2VMaXRlKj4oJG5hbWUkKTtcbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgiICAkZmllbGQkID0gJG5hbWUkO1xuIik7CisgIH0KKyAgZm9ybWF0KAorICAgICAgIiAgaWYgKCRuYW1lJCkge1xuIgorICAgICAgIiAgICAkc2V0X2hhc2JpdCRcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgICRjbGVhcl9oYXNiaXQkXG4iCisgICAgICAiICB9XG4iCisgICAgICAiJGFubm90YXRlX3NldCQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWQiCisgICAgICAiOiRmdWxsX25hbWUkKVxuIgorICAgICAgIn1cbiIpOworICBmb3JtYXQoCisgICAgICAiaW5saW5lICR0eXBlJCogJGNsYXNzbmFtZSQ6OiRyZWxlYXNlX25hbWUkKCkge1xuIgorICAgICAgIiR0eXBlX3JlZmVyZW5jZV9mdW5jdGlvbiQiCisgICAgICAiJGFubm90YXRlX3JlbGVhc2UkIgorICAgICAgIiRtYXliZV9wcmVwYXJlX3NwbGl0X21lc3NhZ2UkIgorICAgICAgIiAgJGNsZWFyX2hhc2JpdCRcbiIKKyAgICAgICIgICR0eXBlJCogdGVtcCA9ICRjYXN0ZWRfbWVtYmVyJDtcbiIKKyAgICAgICIgICRmaWVsZCQgPSBudWxscHRyO1xuIgorICAgICAgIiNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0VcbiIKKyAgICAgICIgIGF1dG8qIG9sZCA9ICByZWludGVycHJldF9jYXN0PDo6JHByb3RvX25zJDo6TWVzc2FnZUxpdGUqPih0ZW1wKTtcbiIKKyAgICAgICIgIHRlbXAgPSA6OiRwcm90b19ucyQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7XG4iCisgICAgICAiICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikgeyBkZWxldGUgb2xkOyB9XG4iCisgICAgICAiI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRVxuIgorICAgICAgIiAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpICE9IG51bGxwdHIpIHtcbiIKKyAgICAgICIgICAgdGVtcCA9IDo6JHByb3RvX25zJDo6aW50ZXJuYWw6OkR1cGxpY2F0ZUlmTm9uTnVsbCh0ZW1wKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0VcbiIKKyAgICAgICIgIHJldHVybiB0ZW1wO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgJHR5cGUkKiAkY2xhc3NuYW1lJDo6dW5zYWZlX2FyZW5hX3JlbGVhc2VfJG5hbWUkKCkge1xuIgorICAgICAgIiRhbm5vdGF0ZV9yZWxlYXNlJCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOiRmdWxsX25hbWUkKVxuIgorICAgICAgIiR0eXBlX3JlZmVyZW5jZV9mdW5jdGlvbiQiCisgICAgICAiJG1heWJlX3ByZXBhcmVfc3BsaXRfbWVzc2FnZSQiCisgICAgICAiICAkY2xlYXJfaGFzYml0JFxuIgorICAgICAgIiAgJHR5cGUkKiB0ZW1wID0gJGNhc3RlZF9tZW1iZXIkO1xuIgorICAgICAgIiAgJGZpZWxkJCA9IG51bGxwdHI7XG4iCisgICAgICAiICByZXR1cm4gdGVtcDtcbiIKKyAgICAgICJ9XG4iKTsKKworICBmb3JtYXQoCisgICAgICAiaW5saW5lICR0eXBlJCogJGNsYXNzbmFtZSQ6Ol9pbnRlcm5hbF9tdXRhYmxlXyRuYW1lJCgpIHtcbiIKKyAgICAgICIkdHlwZV9yZWZlcmVuY2VfZnVuY3Rpb24kIgorICAgICAgIiAgJHNldF9oYXNiaXQkXG4iCisgICAgICAiICBpZiAoJGZpZWxkJCA9PSBudWxscHRyKSB7XG4iCisgICAgICAiICAgIGF1dG8qIHAgPSBDcmVhdGVNYXliZU1lc3NhZ2U8JHR5cGUkPihHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7XG4iKTsKKyAgaWYgKGltcGxpY2l0X3dlYWtfZmllbGRfKSB7CisgICAgZm9ybWF0KCIgICAgJGZpZWxkJCA9IHJlaW50ZXJwcmV0X2Nhc3Q8OjokcHJvdG9fbnMkOjpNZXNzYWdlTGl0ZSo+KHApO1xuIik7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KCIgICAgJGZpZWxkJCA9IHA7XG4iKTsKKyAgfQorICBmb3JtYXQoCisgICAgICAiICB9XG4iCisgICAgICAiICByZXR1cm4gJGNhc3RlZF9tZW1iZXIkO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgJHR5cGUkKiAkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoKSB7XG4iCisgICAgICAvLyBUT0RPKGIvMTIyODU2NTM5KTogYWRkIHRlc3RzIHRvIG1ha2Ugc3VyZSBhbGwgd3JpdGUgYWNjZXNzb3JzIGFyZSBhYmxlCisgICAgICAvLyB0byBwcmVwYXJlIHNwbGl0IG1lc3NhZ2UgYWxsb2NhdGlvbi4KKyAgICAgICIkbWF5YmVfcHJlcGFyZV9zcGxpdF9tZXNzYWdlJCIKKyAgICAgICIgICR0eXBlJCogX21zZyA9IF9pbnRlcm5hbF9tdXRhYmxlXyRuYW1lJCgpO1xuIgorICAgICAgIiRhbm5vdGF0ZV9tdXRhYmxlJCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgcmV0dXJuIF9tc2c7XG4iCisgICAgICAifVxuIik7CisKKyAgLy8gV2UgaGFuZGxlIHRoZSBtb3N0IGNvbW1vbiBjYXNlIGlubGluZSwgYW5kIGRlbGVnYXRlIGxlc3MgY29tbW9uIGNhc2VzIHRvCisgIC8vIHRoZSBzbG93IGZhbGxiYWNrIGZ1bmN0aW9uLgorICBmb3JtYXQoCisgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF9hbGxvY2F0ZWRfJG5hbWUkKCR0eXBlJCogJG5hbWUkKSB7XG4iCisgICAgICAiICA6OiRwcm90b19ucyQ6OkFyZW5hKiBtZXNzYWdlX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7XG4iKTsKKyAgZm9ybWF0KAorICAgICAgIiRtYXliZV9wcmVwYXJlX3NwbGl0X21lc3NhZ2UkIgorICAgICAgIiAgaWYgKG1lc3NhZ2VfYXJlbmEgPT0gbnVsbHB0cikge1xuIik7CisgIGlmIChJc0Nyb3NzRmlsZU1lc3NhZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PCA6OiRwcm90b19ucyQ6Ok1lc3NhZ2VMaXRlKj4oJGZpZWxkJCk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoIiAgICBkZWxldGUgJGZpZWxkJDtcbiIpOworICB9CisgIGZvcm1hdCgKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIGlmICgkbmFtZSQpIHtcbiIpOworICBpZiAoSXNDcm9zc0ZpbGVNZXNzYWdlKGRlc2NyaXB0b3JfKSkgeworICAgIC8vIFdlIGhhdmUgdG8gcmVhZCB0aGUgYXJlbmEgdGhyb3VnaCB0aGUgdmlydHVhbCBtZXRob2QsIGJlY2F1c2UgdGhlIHR5cGUKKyAgICAvLyBpc24ndCBkZWZpbmVkIGluIHRoaXMgZmlsZS4KKyAgICBmb3JtYXQoCisgICAgICAgICIgICAgOjokcHJvdG9fbnMkOjpBcmVuYSogc3VibWVzc2FnZV9hcmVuYSA9XG4iCisgICAgICAgICIgICAgICAgIDo6JHByb3RvX25zJDo6QXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEoXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDw6OiRwcm90b19ucyQ6Ok1lc3NhZ2VMaXRlKj4oIgorICAgICAgICAiJG5hbWUkKSk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoCisgICAgICAgICIgICAgOjokcHJvdG9fbnMkOjpBcmVuYSogc3VibWVzc2FnZV9hcmVuYSA9XG4iCisgICAgICAgICIgICAgICAgIDo6JHByb3RvX25zJDo6QXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEoIgorICAgICAgICAiJG5hbWUkKTtcbiIpOworICB9CisgIGZvcm1hdCgKKyAgICAgICIgICAgaWYgKG1lc3NhZ2VfYXJlbmEgIT0gc3VibWVzc2FnZV9hcmVuYSkge1xuIgorICAgICAgIiAgICAgICRuYW1lJCA9IDo6JHByb3RvX25zJDo6aW50ZXJuYWw6OkdldE93bmVkTWVzc2FnZShcbiIKKyAgICAgICIgICAgICAgICAgbWVzc2FnZV9hcmVuYSwgJG5hbWUkLCBzdWJtZXNzYWdlX2FyZW5hKTtcbiIKKyAgICAgICIgICAgfVxuIgorICAgICAgIiAgICAkc2V0X2hhc2JpdCRcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgICRjbGVhcl9oYXNiaXQkXG4iCisgICAgICAiICB9XG4iKTsKKyAgaWYgKGltcGxpY2l0X3dlYWtfZmllbGRfKSB7CisgICAgZm9ybWF0KCIgICRmaWVsZCQgPSByZWludGVycHJldF9jYXN0PE1lc3NhZ2VMaXRlKj4oJG5hbWUkKTtcbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgiICAkZmllbGQkID0gJG5hbWUkO1xuIik7CisgIH0KKyAgZm9ybWF0KAorICAgICAgIiRhbm5vdGF0ZV9zZXQkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVybmFsQWNjZXNzb3JEZWNsYXJhdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgaWYgKGltcGxpY2l0X3dlYWtfZmllbGRfKSB7CisgICAgZm9ybWF0KAorICAgICAgICAic3RhdGljIGNvbnN0IDo6JHByb3RvX25zJDo6TWVzc2FnZUxpdGUmICRuYW1lJCgiCisgICAgICAgICJjb25zdCAkY2xhc3NuYW1lJCogbXNnKTtcbiIKKyAgICAgICAgInN0YXRpYyA6OiRwcm90b19ucyQ6Ok1lc3NhZ2VMaXRlKiBtdXRhYmxlXyRuYW1lJCgiCisgICAgICAgICIkY2xhc3NuYW1lJCogbXNnKTtcbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgic3RhdGljIGNvbnN0ICR0eXBlJCYgJG5hbWUkKGNvbnN0ICRjbGFzc25hbWUkKiBtc2cpO1xuIik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJuYWxBY2Nlc3NvckRlZmluaXRpb25zKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIEluIHRoZW9yeSwgdGhlc2UgYWNjZXNzb3JzIGNvdWxkIGJlIGlubGluZSBpbiBfSW50ZXJuYWwuIEhvd2V2ZXIsIGluCisgIC8vIHByYWN0aWNlLCB0aGUgbGlua2VyIGlzIHRoZW4gbm90IGFibGUgdG8gdGhyb3cgdGhlbSBvdXQgbWFraW5nIGltcGxpY2l0CisgIC8vIHdlYWsgZGVwZW5kZW5jaWVzIG5vdCB3b3JrIGF0IGFsbC4KKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgaWYgKGltcGxpY2l0X3dlYWtfZmllbGRfKSB7CisgICAgLy8gVGhlc2UgcHJpdmF0ZSBhY2Nlc3NvcnMgYXJlIHVzZWQgYnkgTWVyZ2VGcm9tIGFuZAorICAgIC8vIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSwgYW5kIHRoZWlyIHB1cnBvc2UgaXMgdG8gcHJvdmlkZSBhY2Nlc3MgdG8KKyAgICAvLyB0aGUgZmllbGQgd2l0aG91dCBjcmVhdGluZyBhIHN0cm9uZyBkZXBlbmRlbmN5IG9uIHRoZSBtZXNzYWdlIHR5cGUuCisgICAgZm9ybWF0KAorICAgICAgICAiY29uc3QgOjokcHJvdG9fbnMkOjpNZXNzYWdlTGl0ZSYgJGNsYXNzbmFtZSQ6Ol9JbnRlcm5hbDo6JG5hbWUkKFxuIgorICAgICAgICAiICAgIGNvbnN0ICRjbGFzc25hbWUkKiBtc2cpIHtcbiIKKyAgICAgICAgIiAgaWYgKG1zZy0+JGZpZWxkJCAhPSBudWxscHRyKSB7XG4iCisgICAgICAgICIgICAgcmV0dXJuICptc2ctPiRmaWVsZCQ7XG4iCisgICAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAgICIgICAgcmV0dXJuICokdHlwZV9kZWZhdWx0X2luc3RhbmNlX3B0ciQ7XG4iCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIn1cbiIpOworICAgIGZvcm1hdCgKKyAgICAgICAgIjo6JHByb3RvX25zJDo6TWVzc2FnZUxpdGUqXG4iCisgICAgICAgICIkY2xhc3NuYW1lJDo6X0ludGVybmFsOjptdXRhYmxlXyRuYW1lJCgkY2xhc3NuYW1lJCogbXNnKSB7XG4iKTsKKyAgICBpZiAoSGFzSGFzYml0KGRlc2NyaXB0b3JfKSkgeworICAgICAgZm9ybWF0KCIgIG1zZy0+JHNldF9oYXNiaXQkXG4iKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0b3JfLT5yZWFsX2NvbnRhaW5pbmdfb25lb2YoKSA9PSBudWxscHRyKSB7CisgICAgICBmb3JtYXQoIiAgaWYgKG1zZy0+JGZpZWxkJCA9PSBudWxscHRyKSB7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9ybWF0KAorICAgICAgICAgICIgIGlmICghbXNnLT5faW50ZXJuYWxfaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgICAgICAgIiAgICBtc2ctPmNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgorICAgICAgICAgICIgICAgbXNnLT5zZXRfaGFzXyRuYW1lJCgpO1xuIik7CisgICAgfQorICAgIGZvcm1hdCgKKyAgICAgICAgIiAgICBtc2ctPiRmaWVsZCQgPSAkdHlwZV9kZWZhdWx0X2luc3RhbmNlX3B0ciQtPk5ldyhcbiIKKyAgICAgICAgIiAgICAgICAgbXNnLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7XG4iCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIiAgcmV0dXJuIG1zZy0+JGZpZWxkJDtcbiIKKyAgICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIC8vIFRoaXMgaW5saW5lIGFjY2Vzc29yIGRpcmVjdGx5IHJldHVybnMgbWVtYmVyIGZpZWxkIGFuZCBpcyB1c2VkIGluCisgICAgLy8gU2VyaWFsaXplIHN1Y2ggdGhhdCBBRkRPIHByb2ZpbGUgY29ycmVjdGx5IGNhcHR1cmVzIGFjY2VzcyBpbmZvcm1hdGlvbiB0bworICAgIC8vIG1lc3NhZ2UgZmllbGRzIHVuZGVyIHNlcmlhbGl6ZS4KKyAgICBmb3JtYXQoCisgICAgICAgICJjb25zdCAkdHlwZSQmXG4iCisgICAgICAgICIkY2xhc3NuYW1lJDo6X0ludGVybmFsOjokbmFtZSQoY29uc3QgJGNsYXNzbmFtZSQqIG1zZykge1xuIgorICAgICAgICAiICByZXR1cm4gKm1zZy0+JGZpZWxkJDtcbiIKKyAgICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBHT09HTEVfQ0hFQ0soIUlzRmllbGRTdHJpcHBlZChkZXNjcmlwdG9yXywgb3B0aW9uc18pKTsKKworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoIUhhc0hhc2JpdChkZXNjcmlwdG9yXykpIHsKKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGhhcy1iaXRzLCBtZXNzYWdlIHByZXNlbmNlIGlzIGluZGljYXRlZCBvbmx5IGJ5IHB0ciAhPQorICAgIC8vIG51bGxwdHIuIFRodXMgb24gY2xlYXIsIHdlIG5lZWQgdG8gZGVsZXRlIHRoZSBvYmplY3QuCisgICAgZm9ybWF0KAorICAgICAgICAiaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIgJiYgJGZpZWxkJCAhPSBudWxscHRyKSB7XG4iCisgICAgICAgICIgIGRlbGV0ZSAkZmllbGQkO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiJGZpZWxkJCA9IG51bGxwdHI7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoImlmICgkZmllbGQkICE9IG51bGxwdHIpICRmaWVsZCQtPkNsZWFyKCk7XG4iKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZXNzYWdlQ2xlYXJpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEdPT0dMRV9DSEVDSyghSXNGaWVsZFN0cmlwcGVkKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpOworCisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmICghSGFzSGFzYml0KGRlc2NyaXB0b3JfKSkgeworICAgIC8vIElmIHdlIGRvbid0IGhhdmUgaGFzLWJpdHMsIG1lc3NhZ2UgcHJlc2VuY2UgaXMgaW5kaWNhdGVkIG9ubHkgYnkgcHRyICE9CisgICAgLy8gbnVsbHB0ci4gVGh1cyBvbiBjbGVhciwgd2UgbmVlZCB0byBkZWxldGUgdGhlIG9iamVjdC4KKyAgICBmb3JtYXQoCisgICAgICAgICJpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0ciAmJiAkZmllbGQkICE9IG51bGxwdHIpIHtcbiIKKyAgICAgICAgIiAgZGVsZXRlICRmaWVsZCQ7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICIkZmllbGQkID0gbnVsbHB0cjtcbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgKKyAgICAgICAgIiREQ0hLJCgkZmllbGQkICE9IG51bGxwdHIpO1xuIgorICAgICAgICAiJGZpZWxkJC0+Q2xlYXIoKTtcbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEdPT0dMRV9DSEVDSyghSXNGaWVsZFN0cmlwcGVkKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpOworCisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChpbXBsaWNpdF93ZWFrX2ZpZWxkXykgeworICAgIGZvcm1hdCgKKyAgICAgICAgIl9JbnRlcm5hbDo6bXV0YWJsZV8kbmFtZSQoX3RoaXMpLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oXG4iCisgICAgICAgICIgICAgX0ludGVybmFsOjokbmFtZSQoJmZyb20pKTtcbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgKKyAgICAgICAgIl90aGlzLT5faW50ZXJuYWxfbXV0YWJsZV8kbmFtZSQoKS0+JHR5cGUkOjpNZXJnZUZyb20oXG4iCisgICAgICAgICIgICAgZnJvbS5faW50ZXJuYWxfJG5hbWUkKCkpO1xuIik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEdPT0dMRV9DSEVDSyghSXNGaWVsZFN0cmlwcGVkKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpOworCisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgic3dhcCgkZmllbGQkLCBvdGhlci0+JGZpZWxkJCk7XG4iKTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKCFJc0ZpZWxkU3RyaXBwZWQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSk7CisKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgaWYgKG9wdGlvbnNfLm9wZW5zb3VyY2VfcnVudGltZSkgeworICAgIC8vIFRPRE8oZ2VyYmVucykgUmVtb3ZlIHRoaXMgd2hlbiB3ZSBkb24ndCBuZWVkIHRvIGRlc3RydWN0IGRlZmF1bHQKKyAgICAvLyBpbnN0YW5jZXMuICBJbiBnb29nbGUzIGEgZGVmYXVsdCBpbnN0YW5jZSB3aWxsIG5ldmVyIGdldCBkZWxldGVkIHNvIHdlCisgICAgLy8gZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGF0IGJ1dCBpbiBvcGVuc291cmNlIHByb3RvYnVmIGRlZmF1bHQKKyAgICAvLyBpbnN0YW5jZXMgYXJlIGRlbGV0ZWQgaW4gc2h1dGRvd24gcHJvY2VzcyBhbmQgd2UgbmVlZCB0byB0YWtlIHNwZWNpYWwKKyAgICAvLyBjYXJlIHdoZW4gaGFuZGxpbmcgdGhlbS4KKyAgICBmb3JtYXQoImlmICh0aGlzICE9IGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSkgIik7CisgIH0KKyAgaWYgKFNob3VsZFNwbGl0KGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHsKKyAgICBmb3JtYXQoImRlbGV0ZSAkY2FjaGVkX3NwbGl0X3B0ciQtPiRuYW1lJF87XG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgZm9ybWF0KCJkZWxldGUgJGZpZWxkJDtcbiIpOworfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDb3B5Q29uc3RydWN0b3JDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEdPT0dMRV9DSEVDSyghSXNGaWVsZFN0cmlwcGVkKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpOworCisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgKKyAgICAgICJpZiAoZnJvbS5faW50ZXJuYWxfaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgICAiICBfdGhpcy0+JGZpZWxkJCA9IG5ldyAkdHlwZSQoKmZyb20uJGZpZWxkJCk7XG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKCFJc0ZpZWxkU3RyaXBwZWQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSk7CisKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgaWYgKGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJ0YXJnZXQgPSA6OiRwcm90b19ucyQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6XG4iCisgICAgICAgICIgIEludGVybmFsV3JpdGUkZGVjbGFyZWRfdHlwZSQoJG51bWJlciQsIF9JbnRlcm5hbDo6JG5hbWUkKHRoaXMpLFxuIgorICAgICAgICAiICAgIF9JbnRlcm5hbDo6JG5hbWUkKHRoaXMpLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pO1xuIik7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KAorICAgICAgICAidGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpO1xuIgorICAgICAgICAidGFyZ2V0ID0gOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgorICAgICAgICAiICBJbnRlcm5hbFdyaXRlJGRlY2xhcmVkX3R5cGUkKFxuIgorICAgICAgICAiICAgICRudW1iZXIkLCBfSW50ZXJuYWw6OiRuYW1lJCh0aGlzKSwgdGFyZ2V0LCBzdHJlYW0pO1xuIik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKCFJc0ZpZWxkU3RyaXBwZWQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSk7CisKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgInRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCArXG4iCisgICAgICAiICA6OiRwcm90b19ucyQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6JGRlY2xhcmVkX3R5cGUkU2l6ZShcbiIKKyAgICAgICIgICAgKiRmaWVsZCQpO1xuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKCFJc0ZpZWxkU3RyaXBwZWQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSk7CisKKyAgaWYgKCFoYXNfcmVxdWlyZWRfZmllbGRzXykgcmV0dXJuOworCisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgKKyAgICAgICJpZiAoX2ludGVybmFsX2hhc18kbmFtZSQoKSkge1xuIgorICAgICAgIiAgaWYgKCEkZmllbGQkLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ29uc3RleHByQWdncmVnYXRlSW5pdGlhbGl6ZXIoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCIvKmRlY2x0eXBlKCRmaWVsZCQpKi9udWxscHRyIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNvcHlBZ2dyZWdhdGVJbml0aWFsaXplcigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoImRlY2x0eXBlKCRmaWVsZCQpe251bGxwdHJ9Iik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUFnZ3JlZ2F0ZUluaXRpYWxpemVyKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChTaG91bGRTcGxpdChkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KCJkZWNsdHlwZShJbXBsXzo6U3BsaXQ6OiRuYW1lJF8pe251bGxwdHJ9Iik7CisgICAgcmV0dXJuOworICB9CisgIGZvcm1hdCgiZGVjbHR5cGUoJGZpZWxkJCl7bnVsbHB0cn0iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6TWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKQorICAgIDogTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IsIG9wdGlvbnMsIHNjY19hbmFseXplcikgeworICBTZXRDb21tb25PbmVvZkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfKTsKK30KKworTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6On5NZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTm9uSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoCisgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6c2V0X2FsbG9jYXRlZF8kbmFtZSQoJHR5cGUkKiAkbmFtZSQpIHtcbiIKKyAgICAgICIgIDo6JHByb3RvX25zJDo6QXJlbmEqIG1lc3NhZ2VfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTtcbiIKKyAgICAgICIgIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgorICAgICAgIiAgaWYgKCRuYW1lJCkge1xuIik7CisgIGlmIChkZXNjcmlwdG9yXy0+ZmlsZSgpICE9IGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKS0+ZmlsZSgpKSB7CisgICAgLy8gV2UgaGF2ZSB0byByZWFkIHRoZSBhcmVuYSB0aHJvdWdoIHRoZSB2aXJ0dWFsIG1ldGhvZCwgYmVjYXVzZSB0aGUgdHlwZQorICAgIC8vIGlzbid0IGRlZmluZWQgaW4gdGhpcyBmaWxlLgorICAgIGZvcm1hdCgKKyAgICAgICAgIiAgICA6OiRwcm90b19ucyQ6OkFyZW5hKiBzdWJtZXNzYWdlX2FyZW5hID1cbiIKKyAgICAgICAgIiAgICAgICAgOjokcHJvdG9fbnMkOjpBcmVuYTo6SW50ZXJuYWxHZXRPd25pbmdBcmVuYShcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PDo6JHByb3RvX25zJDo6TWVzc2FnZUxpdGUqPigiCisgICAgICAgICIkbmFtZSQpKTtcbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgKKyAgICAgICAgIiAgICA6OiRwcm90b19ucyQ6OkFyZW5hKiBzdWJtZXNzYWdlX2FyZW5hID1cbiIKKyAgICAgICAgIiAgICAgIDo6JHByb3RvX25zJDo6QXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEoJG5hbWUkKTtcbiIpOworICB9CisgIGZvcm1hdCgKKyAgICAgICIgICAgaWYgKG1lc3NhZ2VfYXJlbmEgIT0gc3VibWVzc2FnZV9hcmVuYSkge1xuIgorICAgICAgIiAgICAgICRuYW1lJCA9IDo6JHByb3RvX25zJDo6aW50ZXJuYWw6OkdldE93bmVkTWVzc2FnZShcbiIKKyAgICAgICIgICAgICAgICAgbWVzc2FnZV9hcmVuYSwgJG5hbWUkLCBzdWJtZXNzYWdlX2FyZW5hKTtcbiIKKyAgICAgICIgICAgfVxuIgorICAgICAgIiAgICBzZXRfaGFzXyRuYW1lJCgpO1xuIgorICAgICAgIiAgICAkZmllbGQkID0gJG5hbWUkO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiRhbm5vdGF0ZV9zZXQkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoCisgICAgICAiaW5saW5lICR0eXBlJCogJGNsYXNzbmFtZSQ6OiRyZWxlYXNlX25hbWUkKCkge1xuIgorICAgICAgIiRhbm5vdGF0ZV9yZWxlYXNlJCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOiRmdWxsX25hbWUkKVxuIgorICAgICAgIiR0eXBlX3JlZmVyZW5jZV9mdW5jdGlvbiQiCisgICAgICAiICBpZiAoX2ludGVybmFsX2hhc18kbmFtZSQoKSkge1xuIgorICAgICAgIiAgICBjbGVhcl9oYXNfJG9uZW9mX25hbWUkKCk7XG4iCisgICAgICAiICAgICR0eXBlJCogdGVtcCA9ICRjYXN0ZWRfbWVtYmVyJDtcbiIKKyAgICAgICIgICAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpICE9IG51bGxwdHIpIHtcbiIKKyAgICAgICIgICAgICB0ZW1wID0gOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApO1xuIgorICAgICAgIiAgICB9XG4iCisgICAgICAiICAgICRmaWVsZCQgPSBudWxscHRyO1xuIgorICAgICAgIiAgICByZXR1cm4gdGVtcDtcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgIHJldHVybiBudWxscHRyO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIpOworCisgIGZvcm1hdCgKKyAgICAgICJpbmxpbmUgY29uc3QgJHR5cGUkJiAkY2xhc3NuYW1lJDo6X2ludGVybmFsXyRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICIkdHlwZV9yZWZlcmVuY2VfZnVuY3Rpb24kIgorICAgICAgIiAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfJG5hbWUkKClcbiIKKyAgICAgICIgICAgICA/ICRjYXN0ZWRfbWVtYmVyX2NvbnN0JFxuIgorICAgICAgIiAgICAgIDogcmVpbnRlcnByZXRfY2FzdDwgJHR5cGUkJj4oJHR5cGVfZGVmYXVsdF9pbnN0YW5jZSQpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgY29uc3QgJHR5cGUkJiAkY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgorICAgICAgIiRhbm5vdGF0ZV9nZXQkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiBfaW50ZXJuYWxfJG5hbWUkKCk7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSAkdHlwZSQqICRjbGFzc25hbWUkOjp1bnNhZmVfYXJlbmFfcmVsZWFzZV8kbmFtZSQoKSB7XG4iCisgICAgICAiJGFubm90YXRlX3JlbGVhc2UkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3Vuc2FmZV9hcmVuYV9yZWxlYXNlIgorICAgICAgIjokZnVsbF9uYW1lJClcbiIKKyAgICAgICIkdHlwZV9yZWZlcmVuY2VfZnVuY3Rpb24kIgorICAgICAgIiAgaWYgKF9pbnRlcm5hbF9oYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICIgICAgY2xlYXJfaGFzXyRvbmVvZl9uYW1lJCgpO1xuIgorICAgICAgIiAgICAkdHlwZSQqIHRlbXAgPSAkY2FzdGVkX21lbWJlciQ7XG4iCisgICAgICAiICAgICRmaWVsZCQgPSBudWxscHRyO1xuIgorICAgICAgIiAgICByZXR1cm4gdGVtcDtcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgIHJldHVybiBudWxscHRyO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6dW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfJG5hbWUkIgorICAgICAgIigkdHlwZSQqICRuYW1lJCkge1xuIgorICAgICAgLy8gV2UgcmVseSBvbiB0aGUgb25lb2YgY2xlYXIgbWV0aG9kIHRvIGZyZWUgdGhlIGVhcmxpZXIgY29udGVudHMgb2YKKyAgICAgIC8vIHRoaXMgb25lb2YuIFdlIGNhbiBkaXJlY3RseSB1c2UgdGhlIHBvaW50ZXIgd2UncmUgZ2l2ZW4gdG8gc2V0IHRoZQorICAgICAgLy8gbmV3IHZhbHVlLgorICAgICAgIiAgY2xlYXJfJG9uZW9mX25hbWUkKCk7XG4iCisgICAgICAiICBpZiAoJG5hbWUkKSB7XG4iCisgICAgICAiICAgIHNldF9oYXNfJG5hbWUkKCk7XG4iKTsKKyAgaWYgKGltcGxpY2l0X3dlYWtfZmllbGRfKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiICAgICRmaWVsZCQgPSAiCisgICAgICAgICJyZWludGVycHJldF9jYXN0PDo6JHByb3RvX25zJDo6TWVzc2FnZUxpdGUqPigkbmFtZSQpO1xuIik7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KCIgICAgJGZpZWxkJCA9ICRuYW1lJDtcbiIpOworICB9CisgIGZvcm1hdCgKKyAgICAgICIgIH1cbiIKKyAgICAgICIkYW5ub3RhdGVfc2V0JCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZDoiCisgICAgICAiJGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSAkdHlwZSQqICRjbGFzc25hbWUkOjpfaW50ZXJuYWxfbXV0YWJsZV8kbmFtZSQoKSB7XG4iCisgICAgICAiJHR5cGVfcmVmZXJlbmNlX2Z1bmN0aW9uJCIKKyAgICAgICIgIGlmICghX2ludGVybmFsX2hhc18kbmFtZSQoKSkge1xuIgorICAgICAgIiAgICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAgICIgICAgc2V0X2hhc18kbmFtZSQoKTtcbiIpOworICBpZiAoaW1wbGljaXRfd2Vha19maWVsZF8pIHsKKyAgICBmb3JtYXQoCisgICAgICAgICIgICAgJGZpZWxkJCA9ICIKKyAgICAgICAgInJlaW50ZXJwcmV0X2Nhc3Q8OjokcHJvdG9fbnMkOjpNZXNzYWdlTGl0ZSo+KENyZWF0ZU1heWJlTWVzc2FnZTwgIgorICAgICAgICAiJHR5cGUkID4oR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpKTtcbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgKKyAgICAgICAgIiAgICAkZmllbGQkID0gQ3JlYXRlTWF5YmVNZXNzYWdlPCAkdHlwZSQgIgorICAgICAgICAiPihHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7XG4iKTsKKyAgfQorICBmb3JtYXQoCisgICAgICAiICB9XG4iCisgICAgICAiICByZXR1cm4gJGNhc3RlZF9tZW1iZXIkO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgJHR5cGUkKiAkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoKSB7XG4iCisgICAgICAiICAkdHlwZSQqIF9tc2cgPSBfaW50ZXJuYWxfbXV0YWJsZV8kbmFtZSQoKTtcbiIKKyAgICAgICIkYW5ub3RhdGVfbXV0YWJsZSQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiBfbXNnO1xuIgorICAgICAgIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNsZWFyaW5nQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBHT09HTEVfQ0hFQ0soIUlzRmllbGRTdHJpcHBlZChkZXNjcmlwdG9yXywgb3B0aW9uc18pKTsKKworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoCisgICAgICAiaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpIHtcbiIKKyAgICAgICIgIGRlbGV0ZSAkZmllbGQkO1xuIgorICAgICAgIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lc3NhZ2VDbGVhcmluZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgR2VuZXJhdGVDbGVhcmluZ0NvZGUocHJpbnRlcik7Cit9CisKK3ZvaWQgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU3dhcHBpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIERvbid0IHByaW50IGFueSBzd2FwcGluZyBjb2RlLiBTd2FwcGluZyB0aGUgdW5pb24gd2lsbCBzd2FwIHRoaXMgZmllbGQuCit9CisKK3ZvaWQgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRGVzdHJ1Y3RvckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gV2UgaW5oZXJpdCBmcm9tIE1lc3NhZ2VGaWVsZEdlbmVyYXRvciwgc28gd2UgbmVlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdAorICAvLyBiZWhhdmlvci4KK30KKwordm9pZCBNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gRG9uJ3QgcHJpbnQgYW55IGNvbnN0cnVjdG9yIGNvZGUuIFRoZSBmaWVsZCBpcyBpbiBhIHVuaW9uLiBXZSBhbGxvY2F0ZQorICAvLyBzcGFjZSBvbmx5IHdoZW4gdGhpcyBmaWVsZCBpcyB1c2VkLgorfQorCit2b2lkIE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKCFoYXNfcmVxdWlyZWRfZmllbGRzXykgcmV0dXJuOworCisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgKKyAgICAgICJpZiAoX2ludGVybmFsX2hhc18kbmFtZSQoKSkge1xuIgorICAgICAgIiAgaWYgKCEkZmllbGQkLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICJ9XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6UmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKQorICAgIDogRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgb3B0aW9ucyksCisgICAgICBpbXBsaWNpdF93ZWFrX2ZpZWxkXygKKyAgICAgICAgICBJc0ltcGxpY2l0V2Vha0ZpZWxkKGRlc2NyaXB0b3IsIG9wdGlvbnMsIHNjY19hbmFseXplcikpLAorICAgICAgaGFzX3JlcXVpcmVkX2ZpZWxkc18oCisgICAgICAgICAgc2NjX2FuYWx5emVyLT5IYXNSZXF1aXJlZEZpZWxkcyhkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKSkpIHsKKyAgU2V0TWVzc2FnZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBvcHRpb25zLCBpbXBsaWNpdF93ZWFrX2ZpZWxkXywgJnZhcmlhYmxlc18pOworfQorCitSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQcml2YXRlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoaW1wbGljaXRfd2Vha19maWVsZF8pIHsKKyAgICBmb3JtYXQoIjo6JHByb3RvX25zJDo6V2Vha1JlcGVhdGVkUHRyRmllbGQ8ICR0eXBlJCA+ICRuYW1lJF87XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoIjo6JHByb3RvX25zJDo6UmVwZWF0ZWRQdHJGaWVsZDwgJHR5cGUkID4gJG5hbWUkXztcbiIpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgaWYgKElzRmllbGRTdHJpcHBlZChkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciQkdHlwZSQqICR7MSRtdXRhYmxlXyRuYW1lJCR9JChpbnQgaW5kZXgpIHsgIgorICAgICAgICAiX19idWlsdGluX3RyYXAoKTsgfVxuIgorICAgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciQ6OiRwcm90b19ucyQ6OlJlcGVhdGVkUHRyRmllbGQ8ICR0eXBlJCA+KlxuIgorICAgICAgICAiICAgICR7MSRtdXRhYmxlXyRuYW1lJCR9JCgpIHsgX19idWlsdGluX3RyYXAoKTsgfVxuIgorICAgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciRjb25zdCAkdHlwZSQmICR7MSQkbmFtZSQkfSQoaW50IGluZGV4KSBjb25zdCB7ICIKKyAgICAgICAgIl9fYnVpbHRpbl90cmFwKCk7IH1cbiIKKyAgICAgICAgIiRkZXByZWNhdGVkX2F0dHIkJHR5cGUkKiAkezEkYWRkXyRuYW1lJCR9JCgpIHsgIgorICAgICAgICAiX19idWlsdGluX3RyYXAoKTsgfVxuIgorICAgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciRjb25zdCA6OiRwcm90b19ucyQ6OlJlcGVhdGVkUHRyRmllbGQ8ICR0eXBlJCA+JlxuIgorICAgICAgICAiICAgICR7MSQkbmFtZSQkfSQoKSBjb25zdCB7IF9fYnVpbHRpbl90cmFwKCk7IH1cbiIsCisgICAgICAgIGRlc2NyaXB0b3JfKTsKKyAgICByZXR1cm47CisgIH0KKyAgZm9ybWF0KAorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkJHR5cGUkKiAkezEkbXV0YWJsZV8kbmFtZSQkfSQoaW50IGluZGV4KTtcbiIKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJDo6JHByb3RvX25zJDo6UmVwZWF0ZWRQdHJGaWVsZDwgJHR5cGUkID4qXG4iCisgICAgICAiICAgICR7MSRtdXRhYmxlXyRuYW1lJCR9JCgpO1xuIiwKKyAgICAgIGRlc2NyaXB0b3JfKTsKKyAgaWYgKCFJc0ZpZWxkU3RyaXBwZWQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgInByaXZhdGU6XG4iCisgICAgICAgICJjb25zdCAkdHlwZSQmICR7MSRfaW50ZXJuYWxfJG5hbWUkJH0kKGludCBpbmRleCkgY29uc3Q7XG4iCisgICAgICAgICIkdHlwZSQqICR7MSRfaW50ZXJuYWxfYWRkXyRuYW1lJCR9JCgpO1xuIgorICAgICAgICAicHVibGljOlxuIiwKKyAgICAgICAgZGVzY3JpcHRvcl8pOworICB9CisgIGZvcm1hdCgKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJGNvbnN0ICR0eXBlJCYgJHsxJCRuYW1lJCR9JChpbnQgaW5kZXgpIGNvbnN0O1xuIgorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkJHR5cGUkKiAkezEkYWRkXyRuYW1lJCR9JCgpO1xuIgorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkY29uc3QgOjokcHJvdG9fbnMkOjpSZXBlYXRlZFB0ckZpZWxkPCAkdHlwZSQgPiZcbiIKKyAgICAgICIgICAgJHsxJCRuYW1lJCR9JCgpIGNvbnN0O1xuIiwKKyAgICAgIGRlc2NyaXB0b3JfKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdC5TZXQoIndlYWsiLCBpbXBsaWNpdF93ZWFrX2ZpZWxkXyA/ICIud2VhayIgOiAiIik7CisKKyAgZm9ybWF0KAorICAgICAgImlubGluZSAkdHlwZSQqICRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJChpbnQgaW5kZXgpIHtcbiIKKyAgICAgICIkYW5ub3RhdGVfbXV0YWJsZSQiCisgICAgICAvLyBUT0RPKGRsaik6IG1vdmUgaW5zZXJ0aW9uIHBvaW50cworICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiJHR5cGVfcmVmZXJlbmNlX2Z1bmN0aW9uJCIKKyAgICAgICIgIHJldHVybiAkZmllbGQkJHdlYWskLk11dGFibGUoaW5kZXgpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgOjokcHJvdG9fbnMkOjpSZXBlYXRlZFB0ckZpZWxkPCAkdHlwZSQgPipcbiIKKyAgICAgICIkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoKSB7XG4iCisgICAgICAiJGFubm90YXRlX211dGFibGVfbGlzdCQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIiR0eXBlX3JlZmVyZW5jZV9mdW5jdGlvbiQiCisgICAgICAiICByZXR1cm4gJiRmaWVsZCQkd2VhayQ7XG4iCisgICAgICAifVxuIik7CisKKyAgaWYgKG9wdGlvbnNfLnNhZmVfYm91bmRhcnlfY2hlY2spIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJpbmxpbmUgY29uc3QgJHR5cGUkJiAkY2xhc3NuYW1lJDo6X2ludGVybmFsXyRuYW1lJChpbnQgaW5kZXgpIGNvbnN0ICIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgcmV0dXJuICRmaWVsZCQkd2VhayQuSW50ZXJuYWxDaGVja2VkR2V0KGluZGV4LFxuIgorICAgICAgICAiICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCAkdHlwZSQmPigkdHlwZV9kZWZhdWx0X2luc3RhbmNlJCkpO1xuIgorICAgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KAorICAgICAgICAiaW5saW5lIGNvbnN0ICR0eXBlJCYgJGNsYXNzbmFtZSQ6Ol9pbnRlcm5hbF8kbmFtZSQoaW50IGluZGV4KSBjb25zdCAiCisgICAgICAgICJ7XG4iCisgICAgICAgICIkdHlwZV9yZWZlcmVuY2VfZnVuY3Rpb24kIgorICAgICAgICAiICByZXR1cm4gJGZpZWxkJCR3ZWFrJC5HZXQoaW5kZXgpO1xuIgorICAgICAgICAifVxuIik7CisgIH0KKworICBmb3JtYXQoCisgICAgICAiaW5saW5lIGNvbnN0ICR0eXBlJCYgJGNsYXNzbmFtZSQ6OiRuYW1lJChpbnQgaW5kZXgpIGNvbnN0IHtcbiIKKyAgICAgICIkYW5ub3RhdGVfZ2V0JCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gX2ludGVybmFsXyRuYW1lJChpbmRleCk7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSAkdHlwZSQqICRjbGFzc25hbWUkOjpfaW50ZXJuYWxfYWRkXyRuYW1lJCgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkZmllbGQkJHdlYWskLkFkZCgpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgJHR5cGUkKiAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJCgpIHtcbiIKKyAgICAgICIgICR0eXBlJCogX2FkZCA9IF9pbnRlcm5hbF9hZGRfJG5hbWUkKCk7XG4iCisgICAgICAiJGFubm90YXRlX2FkZF9tdXRhYmxlJCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gX2FkZDtcbiIKKyAgICAgICJ9XG4iKTsKKworICBmb3JtYXQoCisgICAgICAiaW5saW5lIGNvbnN0IDo6JHByb3RvX25zJDo6UmVwZWF0ZWRQdHJGaWVsZDwgJHR5cGUkID4mXG4iCisgICAgICAiJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICIkYW5ub3RhdGVfbGlzdCQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDokZnVsbF9uYW1lJClcbiIKKyAgICAgICIkdHlwZV9yZWZlcmVuY2VfZnVuY3Rpb24kIgorICAgICAgIiAgcmV0dXJuICRmaWVsZCQkd2VhayQ7XG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ2xlYXJpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEdPT0dMRV9DSEVDSyghSXNGaWVsZFN0cmlwcGVkKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpOworCisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgiJGZpZWxkJC5DbGVhcigpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVyZ2luZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKCFJc0ZpZWxkU3RyaXBwZWQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSk7CisKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCJfdGhpcy0+JGZpZWxkJC5NZXJnZUZyb20oZnJvbS4kZmllbGQkKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVN3YXBwaW5nQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBHT09HTEVfQ0hFQ0soIUlzRmllbGRTdHJpcHBlZChkZXNjcmlwdG9yXywgb3B0aW9uc18pKTsKKworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIiRmaWVsZCQuSW50ZXJuYWxTd2FwKCZvdGhlci0+JGZpZWxkJCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gTm90IG5lZWRlZCBmb3IgcmVwZWF0ZWQgZmllbGRzLgorfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZURlc3RydWN0b3JDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEdPT0dMRV9DSEVDSyghSXNGaWVsZFN0cmlwcGVkKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpOworCisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChpbXBsaWNpdF93ZWFrX2ZpZWxkXykgeworICAgIGZvcm1hdCgiJGZpZWxkJC5+V2Vha1JlcGVhdGVkUHRyRmllbGQoKTtcbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgiJGZpZWxkJC5+UmVwZWF0ZWRQdHJGaWVsZCgpO1xuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEdPT0dMRV9DSEVDSyghSXNGaWVsZFN0cmlwcGVkKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpOworCisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChpbXBsaWNpdF93ZWFrX2ZpZWxkXykgeworICAgIGZvcm1hdCgKKyAgICAgICAgImZvciAoYXV0byBpdCA9IHRoaXMtPiRmaWVsZCQucG9pbnRlcl9iZWdpbigpLFxuIgorICAgICAgICAiICAgICAgICAgIGVuZCA9IHRoaXMtPiRmaWVsZCQucG9pbnRlcl9lbmQoKTsgaXQgPCBlbmQ7ICsraXQpIHtcbiIpOworICAgIGlmIChkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFKSB7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgIiAgdGFyZ2V0ID0gOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgorICAgICAgICAgICIgICAgSW50ZXJuYWxXcml0ZSRkZWNsYXJlZF90eXBlJCgkbnVtYmVyJCwgIgorICAgICAgICAgICIqKml0LCAoKippdCkuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9ybWF0KAorICAgICAgICAgICIgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTtcbiIKKyAgICAgICAgICAiICB0YXJnZXQgPSA6OiRwcm90b19ucyQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6XG4iCisgICAgICAgICAgIiAgICBJbnRlcm5hbFdyaXRlJGRlY2xhcmVkX3R5cGUkKCRudW1iZXIkLCAqKml0LCB0YXJnZXQsICIKKyAgICAgICAgICAic3RyZWFtKTtcbiIpOworICAgIH0KKyAgICBmb3JtYXQoIn1cbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgKKyAgICAgICAgImZvciAodW5zaWduZWQgaSA9IDAsXG4iCisgICAgICAgICIgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfJG5hbWUkX3NpemUoKSk7IgorICAgICAgICAiIGkgPCBuOyBpKyspIHtcbiIpOworICAgIGlmIChkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFKSB7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgIiAgY29uc3QgYXV0byYgcmVwZmllbGQgPSB0aGlzLT5faW50ZXJuYWxfJG5hbWUkKGkpO1xuIgorICAgICAgICAgICIgIHRhcmdldCA9IDo6JHByb3RvX25zJDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpcbiIKKyAgICAgICAgICAiICAgICAgSW50ZXJuYWxXcml0ZSRkZWNsYXJlZF90eXBlJCgkbnVtYmVyJCwgIgorICAgICAgICAgICJyZXBmaWVsZCwgcmVwZmllbGQuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7XG4iCisgICAgICAgICAgIn1cbiIpOworICAgIH0gZWxzZSB7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgIiAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpO1xuIgorICAgICAgICAgICIgIHRhcmdldCA9IDo6JHByb3RvX25zJDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpcbiIKKyAgICAgICAgICAiICAgIEludGVybmFsV3JpdGUkZGVjbGFyZWRfdHlwZSQoJG51bWJlciQsICIKKyAgICAgICAgICAidGhpcy0+X2ludGVybmFsXyRuYW1lJChpKSwgdGFyZ2V0LCBzdHJlYW0pO1xuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCeXRlU2l6ZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBHT09HTEVfQ0hFQ0soIUlzRmllbGRTdHJpcHBlZChkZXNjcmlwdG9yXywgb3B0aW9uc18pKTsKKworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoCisgICAgICAidG90YWxfc2l6ZSArPSAkdGFnX3NpemUkVUwgKiB0aGlzLT5faW50ZXJuYWxfJG5hbWUkX3NpemUoKTtcbiIKKyAgICAgICJmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPiRmaWVsZCQpIHtcbiIKKyAgICAgICIgIHRvdGFsX3NpemUgKz1cbiIKKyAgICAgICIgICAgOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OiRkZWNsYXJlZF90eXBlJFNpemUobXNnKTtcbiIKKyAgICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJc0luaXRpYWxpemVkKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEdPT0dMRV9DSEVDSyghSXNGaWVsZFN0cmlwcGVkKGRlc2NyaXB0b3JfLCBvcHRpb25zXykpOworCisgIGlmICghaGFzX3JlcXVpcmVkX2ZpZWxkc18pIHJldHVybjsKKworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoaW1wbGljaXRfd2Vha19maWVsZF8pIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJpZiAoITo6JHByb3RvX25zJDo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkV2VhaygkZmllbGQkLndlYWspKVxuIgorICAgICAgICAiICByZXR1cm4gZmFsc2U7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJpZiAoITo6JHByb3RvX25zJDo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKCRmaWVsZCQpKVxuIgorICAgICAgICAiICByZXR1cm4gZmFsc2U7XG4iKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9maWVsZC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYzQyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlX2ZpZWxkLmgKQEAgLTAsMCArMSwxNDggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX01FU1NBR0VfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfTUVTU0FHRV9GSUVMRF9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworY2xhc3MgTWVzc2FnZUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNDQ0FuYWx5emVyKiBzY2NfYW5hbHl6ZXIpOworICB+TWVzc2FnZUZpZWxkR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTm9uSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucygKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUludGVybmFsQWNjZXNzb3JEZWNsYXJhdGlvbnMoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbnRlcm5hbEFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZU1lc3NhZ2VDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZURlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGUge30KKyAgdm9pZCBHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ29uc3RleHByQWdncmVnYXRlSW5pdGlhbGl6ZXIoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVBZ2dyZWdhdGVJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDb3B5QWdncmVnYXRlSW5pdGlhbGl6ZXIoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBjb25zdCBib29sIGltcGxpY2l0X3dlYWtfZmllbGRfOworICBjb25zdCBib29sIGhhc19yZXF1aXJlZF9maWVsZHNfOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2VGaWVsZEdlbmVyYXRvcik7Cit9OworCitjbGFzcyBNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBNZXNzYWdlRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU0NDQW5hbHl6ZXIqIHNjY19hbmFseXplcik7CisgIH5NZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZU5vbklubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vIE1lc3NhZ2VGaWVsZEdlbmVyYXRvciwgZnJvbSB3aGljaCB3ZSBpbmhlcml0LCBvdmVycmlkZXMgdGhpcyBzbyB3ZSBuZWVkIHRvCisgIC8vIG92ZXJyaWRlIGl0IGFzIHdlbGwuCisgIHZvaWQgR2VuZXJhdGVNZXNzYWdlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSXNJbml0aWFsaXplZChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IpOworfTsKKworY2xhc3MgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU0NDQW5hbHl6ZXIqIHNjY19hbmFseXplcik7CisgIH5SZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlIHt9CisgIHZvaWQgR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSXNJbml0aWFsaXplZChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBjb25zdCBib29sIGltcGxpY2l0X3dlYWtfZmllbGRfOworICBjb25zdCBib29sIGhhc19yZXF1aXJlZF9maWVsZHNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfTUVTU0FHRV9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2VfbGF5b3V0X2hlbHBlci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9sYXlvdXRfaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg4MTNhMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21lc3NhZ2VfbGF5b3V0X2hlbHBlci5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHNlb25na2ltQGdvb2dsZS5jb20gKFNlb25nIEJlb20gS2ltKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9NRVNTQUdFX0xBWU9VVF9IRUxQRVJfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfTUVTU0FHRV9MQVlPVVRfSEVMUEVSX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL29wdGlvbnMuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBNZXNzYWdlU0NDQW5hbHl6ZXI7CisKKy8vIFByb3ZpZGVzIGFuIGFic3RyYWN0IGludGVyZmFjZSB0byBvcHRpbWl6ZSBtZXNzYWdlIGxheW91dAorLy8gYnkgcmVhcnJhbmdpbmcgdGhlIGZpZWxkcyBvZiBhIG1lc3NhZ2UuCitjbGFzcyBNZXNzYWdlTGF5b3V0SGVscGVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfk1lc3NhZ2VMYXlvdXRIZWxwZXIoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBPcHRpbWl6ZUxheW91dChzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKSA9IDA7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfTUVTU0FHRV9MQVlPVVRfSEVMUEVSX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9zaXplX3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWVzc2FnZV9zaXplX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MTk4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlX3NpemVfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwyNzIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworLy8gQ2FuJ3QgdXNlIGFuIGFub255bW91cyBuYW1lc3BhY2UgaGVyZSBkdWUgdG8gYnJva2VubmVzcyBvZiBUcnU2NCBjb21waWxlci4KK25hbWVzcGFjZSBjcHBfdW5pdHRlc3QgeworCisKKyNpZiAhZGVmaW5lZChHT09HTEVfQ0hFQ0tfTUVTU0FHRV9TSVpFKQorI2RlZmluZSBHT09HTEVfQ0hFQ0tfTUVTU0FHRV9TSVpFKHQsIGV4cGVjdGVkKQorI2VuZGlmCisKKy8vIE1vY2sgc3RydWN0dXJlcyB0byBsb2NrIGRvd24gdGhlIHNpemUgb2YgbWVzc2FnZXMgaW4gYSBwbGF0Zm9ybS1pbmRlcGVuZGVudAorLy8gd2F5LiAgVGhlIGNvbW1lbnRlZCBzaXplcyBvbmx5IGFwcGx5IHdoZW4gYnVpbGQgd2l0aCBjbGFuZyB4ODZfNjQuCitzdHJ1Y3QgTW9ja01lc3NhZ2VCYXNlIHsKKyAgdmlydHVhbCB+TW9ja01lc3NhZ2VCYXNlKCkgPSBkZWZhdWx0OyAgLy8gOCBieXRlcyB2dGFibGUKKyAgdm9pZCogaW50ZXJuYWxfbWV0YWRhdGE7ICAgICAgICAgICAgICAgLy8gOCBieXRlcworfTsKK0dPT0dMRV9DSEVDS19NRVNTQUdFX1NJWkUoTW9ja01lc3NhZ2VCYXNlLCAxNik7CisKK3N0cnVjdCBNb2NrWmVyb0ZpZWxkc0Jhc2UgOiBwdWJsaWMgTW9ja01lc3NhZ2VCYXNlIHsKKyAgaW50IGNhY2hlZF9zaXplOyAgLy8gNCBieXRlcworICAvLyArIDQgYnl0ZXMgcGFkZGluZworfTsKK0dPT0dMRV9DSEVDS19NRVNTQUdFX1NJWkUoTW9ja1plcm9GaWVsZHNCYXNlLCAyNCk7CisKK3N0cnVjdCBNb2NrRXh0ZW5zaW9uU2V0IHsKKyAgdm9pZCogYXJlbmE7ICAgICAgIC8vIDggYnl0ZXMKKyAgaW50MTZfdCBjYXBhY2l0eTsgIC8vIDQgYnl0ZXMKKyAgaW50MTZfdCBzaXplOyAgICAgIC8vIDQgYnl0ZXMKKyAgdm9pZCogZGF0YTsgICAgICAgIC8vIDggYnl0ZXMKK307CitHT09HTEVfQ0hFQ0tfTUVTU0FHRV9TSVpFKE1vY2tFeHRlbnNpb25TZXQsIDI0KTsKKworc3RydWN0IE1vY2tSZXBlYXRlZFB0ckZpZWxkIHsKKyAgdm9pZCogYXJlbmE7ICAgICAgIC8vIDggYnl0ZXMKKyAgaW50IGN1cnJlbnRfc2l6ZTsgIC8vIDQgYnl0ZXMKKyAgaW50IHRvdGFsX3NpemU7ICAgIC8vIDQgYnl0ZXMKKyAgdm9pZCogZGF0YTsgICAgICAgIC8vIDggYnl0ZXMKK307CitHT09HTEVfQ0hFQ0tfTUVTU0FHRV9TSVpFKE1vY2tSZXBlYXRlZFB0ckZpZWxkLCAyNCk7CisKK3N0cnVjdCBNb2NrUmVwZWF0ZWRGaWVsZCB7CisgIGludCBjdXJyZW50X3NpemU7ICAvLyA0IGJ5dGVzCisgIGludCB0b3RhbF9zaXplOyAgICAvLyA0IGJ5dGVzCisgIHZvaWQqIGRhdGE7ICAgICAgICAvLyA4IGJ5dGVzCit9OworR09PR0xFX0NIRUNLX01FU1NBR0VfU0laRShNb2NrUmVwZWF0ZWRGaWVsZCwgMTYpOworCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBNb2NrU2l6ZXMpIHsKKyAgLy8gQ29uc2lzdGVuY3kgY2hlY2tzIC0tIGlmIHRoZXNlIGZhaWwsIHRoZSB0ZXN0cyBiZWxvdyB3aWxsIGRlZmluaXRlbHkgZmFpbC4KKyAgR09PR0xFX0NIRUNLX0VRKHNpemVvZihNZXNzYWdlTGl0ZSksIHNpemVvZihNb2NrTWVzc2FnZUJhc2UpKTsKKyAgR09PR0xFX0NIRUNLX0VRKHNpemVvZihNZXNzYWdlKSwgc2l6ZW9mKE1vY2tNZXNzYWdlQmFzZSkpOworICBHT09HTEVfQ0hFQ0tfRVEoc2l6ZW9mKGludGVybmFsOjpaZXJvRmllbGRzQmFzZSksIHNpemVvZihNb2NrWmVyb0ZpZWxkc0Jhc2UpKTsKKyAgR09PR0xFX0NIRUNLX0VRKHNpemVvZihpbnRlcm5hbDo6RXh0ZW5zaW9uU2V0KSwgc2l6ZW9mKE1vY2tFeHRlbnNpb25TZXQpKTsKKyAgR09PR0xFX0NIRUNLX0VRKHNpemVvZihSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiksIHNpemVvZihNb2NrUmVwZWF0ZWRQdHJGaWVsZCkpOworICBHT09HTEVfQ0hFQ0tfRVEoc2l6ZW9mKFJlcGVhdGVkRmllbGQ8aW50PiksIHNpemVvZihNb2NrUmVwZWF0ZWRGaWVsZCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBFbXB0eU1lc3NhZ2VTaXplKSB7CisgIEVYUEVDVF9FUShzaXplb2YocHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UpLAorICAgICAgICAgICAgc2l6ZW9mKE1vY2taZXJvRmllbGRzQmFzZSkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBSZXNlcnZlZFNpemUpIHsKKyAgRVhQRUNUX0VRKHNpemVvZihwcm90b2J1Zl91bml0dGVzdDo6VGVzdFJlc2VydmVkRmllbGRzKSwKKyAgICAgICAgICAgIHNpemVvZihNb2NrWmVyb0ZpZWxkc0Jhc2UpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgRW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnNTaXplKSB7CisgIHN0cnVjdCBNb2NrR2VuZXJhdGVkIDogcHVibGljIE1vY2tNZXNzYWdlQmFzZSB7ICAvLyAxNiBieXRlcworICAgIE1vY2tFeHRlbnNpb25TZXQgZXh0ZW5zaW9uczsgICAgICAgICAgICAgICAgICAgLy8gMjQgYnl0ZXMKKyAgICBpbnQgY2FjaGVkX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgYnl0ZXMKKyAgICAvLyArIDQgYnl0ZXMgb2YgcGFkZGluZworICB9OworICBHT09HTEVfQ0hFQ0tfTUVTU0FHRV9TSVpFKE1vY2tHZW5lcmF0ZWQsIDQ4KTsKKyAgRVhQRUNUX0VRKHNpemVvZihwcm90b2J1Zl91bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zKSwKKyAgICAgICAgICAgIHNpemVvZihNb2NrR2VuZXJhdGVkKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFJlY3Vyc2l2ZU1lc3NhZ2VTaXplKSB7CisgIHN0cnVjdCBNb2NrR2VuZXJhdGVkIDogcHVibGljIE1vY2tNZXNzYWdlQmFzZSB7ICAvLyAxNiBieXRlcworICAgIGludCBoYXNfYml0c1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNCBieXRlcworICAgIGludCBjYWNoZWRfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNCBieXRlcworICAgIHZvaWQqIGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOCBieXRlcworICAgIGludDMyX3QgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNCBieXRlcworICAgIC8vICsgNCBieXRlcyBwYWRkaW5nCisgIH07CisgIEdPT0dMRV9DSEVDS19NRVNTQUdFX1NJWkUoTW9ja0dlbmVyYXRlZCwgNDApOworICBFWFBFQ1RfRVEoc2l6ZW9mKHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UmVjdXJzaXZlTWVzc2FnZSksCisgICAgICAgICAgICBzaXplb2YoTW9ja0dlbmVyYXRlZCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBPbmVTdHJpbmdTaXplKSB7CisgIHN0cnVjdCBNb2NrR2VuZXJhdGVkIDogcHVibGljIE1vY2tNZXNzYWdlQmFzZSB7ICAvLyAxNiBieXRlcworICAgIGludCBoYXNfYml0c1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNCBieXRlcworICAgIGludCBjYWNoZWRfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNCBieXRlcworICAgIHZvaWQqIGRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOCBieXRlcworICB9OworICBHT09HTEVfQ0hFQ0tfTUVTU0FHRV9TSVpFKE1vY2tHZW5lcmF0ZWQsIDMyKTsKKyAgRVhQRUNUX0VRKHNpemVvZihwcm90b2J1Zl91bml0dGVzdDo6T25lU3RyaW5nKSwgc2l6ZW9mKE1vY2tHZW5lcmF0ZWQpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgTW9yZVN0cmluZ1NpemUpIHsKKyAgc3RydWN0IE1vY2tHZW5lcmF0ZWQgOiBwdWJsaWMgTW9ja01lc3NhZ2VCYXNlIHsgIC8vIDE2IGJ5dGVzCisgICAgaW50IGhhc19iaXRzWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgaW50IGNhY2hlZF9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgTW9ja1JlcGVhdGVkUHRyRmllbGQgZGF0YTsgICAgICAgICAgICAgICAgICAgICAvLyAyNCBieXRlcworICB9OworICBHT09HTEVfQ0hFQ0tfTUVTU0FHRV9TSVpFKE1vY2tHZW5lcmF0ZWQsIDQ4KTsKKyAgRVhQRUNUX0VRKHNpemVvZihwcm90b2J1Zl91bml0dGVzdDo6TW9yZVN0cmluZyksIHNpemVvZihNb2NrR2VuZXJhdGVkKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIEludDMyTWVzc2FnZVNpemUpIHsKKyAgc3RydWN0IE1vY2tHZW5lcmF0ZWQgOiBwdWJsaWMgTW9ja01lc3NhZ2VCYXNlIHsgIC8vIDE2IGJ5dGVzCisgICAgaW50IGhhc19iaXRzWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgaW50IGNhY2hlZF9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgaW50MzJfdCBkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgLy8gKyA0IGJ5dGVzIHBhZGRpbmcKKyAgfTsKKyAgR09PR0xFX0NIRUNLX01FU1NBR0VfU0laRShNb2NrR2VuZXJhdGVkLCAzMik7CisgIEVYUEVDVF9FUShzaXplb2YocHJvdG9idWZfdW5pdHRlc3Q6OkludDMyTWVzc2FnZSksIHNpemVvZihNb2NrR2VuZXJhdGVkKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIEludDY0TWVzc2FnZVNpemUpIHsKKyAgc3RydWN0IE1vY2tHZW5lcmF0ZWQgOiBwdWJsaWMgTW9ja01lc3NhZ2VCYXNlIHsgIC8vIDE2IGJ5dGVzCisgICAgaW50IGhhc19iaXRzWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgaW50IGNhY2hlZF9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgaW50NjRfdCBkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4IGJ5dGVzCisgIH07CisgIEdPT0dMRV9DSEVDS19NRVNTQUdFX1NJWkUoTW9ja0dlbmVyYXRlZCwgMzIpOworICBFWFBFQ1RfRVEoc2l6ZW9mKHByb3RvYnVmX3VuaXR0ZXN0OjpJbnQ2NE1lc3NhZ2UpLCBzaXplb2YoTW9ja0dlbmVyYXRlZCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBCb29sTWVzc2FnZVNpemUpIHsKKyAgc3RydWN0IE1vY2tHZW5lcmF0ZWQgOiBwdWJsaWMgTW9ja01lc3NhZ2VCYXNlIHsgIC8vIDE2IGJ5dGVzCisgICAgaW50IGhhc19iaXRzWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgaW50IGNhY2hlZF9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgYm9vbCBkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIGJ5dGUKKyAgICAvLyArIDMgYnl0ZXMgcGFkZGluZworICB9OworICBHT09HTEVfQ0hFQ0tfTUVTU0FHRV9TSVpFKE1vY2tHZW5lcmF0ZWQsIDMyKTsKKyAgRVhQRUNUX0VRKHNpemVvZihwcm90b2J1Zl91bml0dGVzdDo6Qm9vbE1lc3NhZ2UpLCBzaXplb2YoTW9ja0dlbmVyYXRlZCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBPbmVvZlNpemUpIHsKKyAgc3RydWN0IE1vY2tHZW5lcmF0ZWQgOiBwdWJsaWMgTW9ja01lc3NhZ2VCYXNlIHsgIC8vIDE2IGJ5dGVzCisgICAgdm9pZCogZm9vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4IGJ5dGVzCisgICAgaW50IGNhY2hlZF9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgdWludDMyX3Qgb25lb2ZfY2FzZVsxXTsgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgIH07CisgIEdPT0dMRV9DSEVDS19NRVNTQUdFX1NJWkUoTW9ja0dlbmVyYXRlZCwgMzIpOworICBFWFBFQ1RfRVEoc2l6ZW9mKHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0T25lb2YpLCBzaXplb2YoTW9ja0dlbmVyYXRlZCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBPbmVvZjJTaXplKSB7CisgIHN0cnVjdCBNb2NrR2VuZXJhdGVkIDogcHVibGljIE1vY2tNZXNzYWdlQmFzZSB7ICAvLyAxNiBieXRlcworICAgIGludCBoYXNfYml0c1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNCBieXRlcworICAgIGludCBjYWNoZWRfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNCBieXRlcworICAgIHZvaWQqIGJhel9zdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOCBieXRlcworICAgIGludDMyX3QgYmF6X2ludDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNCBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKyA0IGJ5dGVzIHBhZGRpbmcKKyAgICB2b2lkKiBmb287ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDggYnl0ZXMKKyAgICB2b2lkKiBiYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDggYnl0ZXMKKyAgICB1aW50MzJfdCBvbmVvZl9jYXNlWzJdOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDggYnl0ZXMKKyAgfTsKKyAgR09PR0xFX0NIRUNLX01FU1NBR0VfU0laRShNb2NrR2VuZXJhdGVkLCA2NCk7CisgIEVYUEVDVF9FUShzaXplb2YocHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RPbmVvZjIpLCBzaXplb2YoTW9ja0dlbmVyYXRlZCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBGaWVsZE9yZGVyaW5nc1NpemUpIHsKKyAgc3RydWN0IE1vY2tHZW5lcmF0ZWQgOiBwdWJsaWMgTW9ja01lc3NhZ2VCYXNlIHsgIC8vIDE2IGJ5dGVzCisgICAgaW50IGhhc19iaXRzWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgaW50IGNhY2hlZF9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgTW9ja0V4dGVuc2lvblNldCBleHRlbnNpb25zOyAgICAgICAgICAgICAgICAgICAvLyAyNCBieXRlcworICAgIHZvaWQqIG15X3N0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOCBieXRlcworICAgIHZvaWQqIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlOyAgICAgICAgICAgICAgICAgLy8gOCBieXRlcworICAgIGludDY0X3QgbXlfaW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOCBieXRlcworICAgIGZsb2F0IG15X2Zsb2F0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNCBieXRlcworICAgIC8vICsgNCBieXRlcyBvZiBwYWRkaW5nCisgIH07CisgIEdPT0dMRV9DSEVDS19NRVNTQUdFX1NJWkUoTW9ja0dlbmVyYXRlZCwgODApOworICBFWFBFQ1RfRVEoc2l6ZW9mKHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RmllbGRPcmRlcmluZ3MpLCBzaXplb2YoTW9ja0dlbmVyYXRlZCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBUZXN0TWVzc2FnZVNpemUpIHsKKyAgLy8gV2UgZXhwZWN0IHRoZSBtZXNzYWdlIHRvIGNvbnRhaW4gKG5vdCBpbiB0aGlzIG9yZGVyKToKKyAgc3RydWN0IE1vY2tHZW5lcmF0ZWQgOiBwdWJsaWMgTW9ja01lc3NhZ2VCYXNlIHsgIC8vIDE2IGJ5dGVzCisgICAgaW50IGhhc19iaXRzWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgaW50IGNhY2hlZF9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgdm9pZCogbTQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4IGJ5dGVzCisgICAgaW50NjRfdCBtMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4IGJ5dGVzCisgICAgYm9vbCBtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIGJ5dGVzCisgICAgYm9vbCBtMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyArIDIgYnl0ZXMgcGFkZGluZworICAgIGludCBtNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNCBieXRlcworICAgIGludDY0X3QgbTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOCBieXRlcworICB9OworICBHT09HTEVfQ0hFQ0tfTUVTU0FHRV9TSVpFKE1vY2tHZW5lcmF0ZWQsIDU2KTsKKyAgRVhQRUNUX0VRKHNpemVvZihwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VTaXplKSwgc2l6ZW9mKE1vY2tHZW5lcmF0ZWQpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgUGFja2VkVHlwZXNTaXplKSB7CisgIHN0cnVjdCBNb2NrR2VuZXJhdGVkIDogcHVibGljIE1vY2tNZXNzYWdlQmFzZSB7ICAvLyAxNiBieXRlcworICAgIE1vY2tSZXBlYXRlZEZpZWxkIHBhY2tlZF9pbnQzMjsgICAgICAgICAgICAgICAgLy8gMTYgYnl0ZXMKKyAgICBpbnQgcGFja2VkX2ludDMyX2NhY2hlZF9ieXRlX3NpemU7ICAgICAgICAgICAgIC8vIDQgYnl0ZXMgKyA0IGJ5dGVzIHBhZGRpbmcKKyAgICBNb2NrUmVwZWF0ZWRGaWVsZCBwYWNrZWRfaW50NjQ7ICAgICAgICAgICAgICAgIC8vIDE2IGJ5dGVzCisgICAgaW50IHBhY2tlZF9pbnQ2NF9jYWNoZWRfYnl0ZV9zaXplOyAgICAgICAgICAgICAvLyA0IGJ5dGVzICsgNCBieXRlcyBwYWRkaW5nCisgICAgTW9ja1JlcGVhdGVkRmllbGQgcGFja2VkX3VpbnQzMjsgICAgICAgICAgICAgICAvLyAxNiBieXRlcworICAgIGludCBwYWNrZWRfdWludDMyX2NhY2hlZF9ieXRlX3NpemU7ICAgICAgICAgICAgLy8gNCBieXRlcyArIDQgYnl0ZXMgcGFkZGluZworICAgIE1vY2tSZXBlYXRlZEZpZWxkIHBhY2tlZF91aW50NjQ7ICAgICAgICAgICAgICAgLy8gMTYgYnl0ZXMKKyAgICBpbnQgcGFja2VkX3VpbnQ2NF9jYWNoZWRfYnl0ZV9zaXplOyAgICAgICAgICAgIC8vIDQgYnl0ZXMgKyA0IGJ5dGVzIHBhZGRpbmcKKyAgICBNb2NrUmVwZWF0ZWRGaWVsZCBwYWNrZWRfc2ludDMyOyAgICAgICAgICAgICAgIC8vIDE2IGJ5dGVzCisgICAgaW50IHBhY2tlZF9zaW50MzJfY2FjaGVkX2J5dGVfc2l6ZTsgICAgICAgICAgICAvLyA0IGJ5dGVzICsgNCBieXRlcyBwYWRkaW5nCisgICAgTW9ja1JlcGVhdGVkRmllbGQgcGFja2VkX3NpbnQ2NDsgICAgICAgICAgICAgICAvLyAxNiBieXRlcworICAgIGludCBwYWNrZWRfc2ludDY0X2NhY2hlZF9ieXRlX3NpemU7ICAgICAgICAgICAgLy8gNCBieXRlcyArIDQgYnl0ZXMgcGFkZGluZworICAgIE1vY2tSZXBlYXRlZEZpZWxkIHBhY2tlZF9maXhlZDMyOyAgICAgICAgICAgICAgLy8gMTYgYnl0ZXMKKyAgICBNb2NrUmVwZWF0ZWRGaWVsZCBwYWNrZWRfZml4ZWQ2NDsgICAgICAgICAgICAgIC8vIDE2IGJ5dGVzCisgICAgTW9ja1JlcGVhdGVkRmllbGQgcGFja2VkX3NmaXhlZDMyOyAgICAgICAgICAgICAvLyAxNiBieXRlcworICAgIE1vY2tSZXBlYXRlZEZpZWxkIHBhY2tlZF9zZml4ZWQ2NDsgICAgICAgICAgICAgLy8gMTYgYnl0ZXMKKyAgICBNb2NrUmVwZWF0ZWRGaWVsZCBwYWNrZWRfZmxvYXQ7ICAgICAgICAgICAgICAgIC8vIDE2IGJ5dGVzCisgICAgTW9ja1JlcGVhdGVkRmllbGQgcGFja2VkX2RvdWJsZTsgICAgICAgICAgICAgICAvLyAxNiBieXRlcworICAgIE1vY2tSZXBlYXRlZEZpZWxkIHBhY2tlZF9ib29sOyAgICAgICAgICAgICAgICAgLy8gMTYgYnl0ZXMKKyAgICBNb2NrUmVwZWF0ZWRGaWVsZCBwYWNrZWRfZW51bTsgICAgICAgICAgICAgICAgIC8vIDE2IGJ5dGVzCisgICAgaW50IHBhY2tlZF9lbnVtX2NhY2hlZF9ieXRlX3NpemU7ICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgICAgaW50IGNhY2hlZF9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzCisgIH07CisgIEdPT0dMRV9DSEVDS19NRVNTQUdFX1NJWkUoTW9ja0dlbmVyYXRlZCwgMTYgKiAxNSArIDggKiA2ICsgOCk7CisgIEVYUEVDVF9FUShzaXplb2YocHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyksIHNpemVvZihNb2NrR2VuZXJhdGVkKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjcHBfdW5pdHRlc3QKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXRhZGF0YV90ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWV0YWRhdGFfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmZkMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWV0YWRhdGFfdGVzdC5jYwpAQCAtMCwwICsxLDE2MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9hbm5vdGF0aW9uX3Rlc3RfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvaGVscGVycy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK25hbWVzcGFjZSBhdHUgPSBhbm5vdGF0aW9uX3Rlc3RfdXRpbDsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ3BwTWV0YWRhdGFUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICAvLyBUcmllcyB0byBjYXB0dXJlIGEgRmlsZURlc2NyaXB0b3JQcm90bywgR2VuZXJhdGVkQ29kZUluZm8sIGFuZCBvdXRwdXQKKyAgLy8gY29kZSBmcm9tIHRoZSBwcmV2aW91c2x5IGFkZGVkIGZpbGUgd2l0aCBuYW1lIGBmaWxlbmFtZWAuIFJldHVybnMgdHJ1ZSBvbgorICAvLyBzdWNjZXNzLiBJZiBwYl9oIGlzIG5vbi1udWxsLCBleHBlY3RzIGEgLnBiLmggYW5kIGEgLnBiLmgubWV0YSAoY29waWVkIHRvCisgIC8vIHBiX2ggYW5kIHBiX2hfaW5mbyByZXNwZWNmaXZlbHkpOyBzaW1pbGFybHkgZm9yIHByb3RvX2ggYW5kIHByb3RvX2hfaW5mby4KKyAgYm9vbCBDYXB0dXJlTWV0YWRhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogcGJfaCwgR2VuZXJhdGVkQ29kZUluZm8qIHBiX2hfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHByb3RvX2gsIEdlbmVyYXRlZENvZGVJbmZvKiBwcm90b19oX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBwYl9jYykgeworICAgIENvbW1hbmRMaW5lSW50ZXJmYWNlIGNsaTsKKyAgICBDcHBHZW5lcmF0b3IgY3BwX2dlbmVyYXRvcjsKKyAgICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tY3BwX291dCIsICZjcHBfZ2VuZXJhdG9yLCAiIik7CisgICAgc3RkOjpzdHJpbmcgY3BwX291dCA9CisgICAgICAgICItLWNwcF9vdXQ9YW5ub3RhdGVfaGVhZGVycz10cnVlLCIKKyAgICAgICAgImFubm90YXRpb25fcHJhZ21hX25hbWU9cHJhZ21hX25hbWUsIgorICAgICAgICAiYW5ub3RhdGlvbl9ndWFyZF9uYW1lPWd1YXJkX25hbWU6IiArCisgICAgICAgIFRlc3RUZW1wRGlyKCk7CisKKyAgICBjb25zdCBib29sIHJlc3VsdCA9IGF0dTo6UnVuUHJvdG9Db21waWxlcihmaWxlbmFtZSwgY3BwX291dCwgJmNsaSwgZmlsZSk7CisKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBvdXRwdXRfYmFzZSA9IFRlc3RUZW1wRGlyKCkgKyAiLyIgKyBTdHJpcFByb3RvKGZpbGVuYW1lKTsKKworICAgIGlmIChwYl9jYyAhPSBudWxscHRyKSB7CisgICAgICBHT09HTEVfQ0hFQ0tfT0soCisgICAgICAgICAgRmlsZTo6R2V0Q29udGVudHMob3V0cHV0X2Jhc2UgKyAiLnBiLmNjIiwgcGJfY2MsIHRydWUpKTsKKyAgICB9CisKKyAgICBpZiAocGJfaCAhPSBudWxscHRyICYmIHBiX2hfaW5mbyAhPSBudWxscHRyKSB7CisgICAgICBHT09HTEVfQ0hFQ0tfT0soCisgICAgICAgICAgRmlsZTo6R2V0Q29udGVudHMob3V0cHV0X2Jhc2UgKyAiLnBiLmgiLCBwYl9oLCB0cnVlKSk7CisgICAgICBpZiAoIWF0dTo6RGVjb2RlTWV0YWRhdGEob3V0cHV0X2Jhc2UgKyAiLnBiLmgubWV0YSIsIHBiX2hfaW5mbykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChwcm90b19oICE9IG51bGxwdHIgJiYgcHJvdG9faF9pbmZvICE9IG51bGxwdHIpIHsKKyAgICAgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpHZXRDb250ZW50cyhvdXRwdXRfYmFzZSArICIucHJvdG8uaCIsIHByb3RvX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSk7CisgICAgICBpZiAoIWF0dTo6RGVjb2RlTWV0YWRhdGEob3V0cHV0X2Jhc2UgKyAiLnByb3RvLmgubWV0YSIsIHByb3RvX2hfaW5mbykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCitjb25zdCBjaGFyIGtTbWFsbFRlc3RGaWxlW10gPQorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJwYWNrYWdlIGZvbztcbiIKKyAgICAiZW51bSBFbnVtIHsgVkFMVUUgPSAwOyB9XG4iCisgICAgIm1lc3NhZ2UgTWVzc2FnZSB7IH1cbiI7CisKK1RFU1RfRihDcHBNZXRhZGF0YVRlc3QsIENhcHR1cmVzRW51bU5hbWVzKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgR2VuZXJhdGVkQ29kZUluZm8gaW5mbzsKKyAgc3RkOjpzdHJpbmcgcGJfaDsKKyAgYXR1OjpBZGRGaWxlKCJ0ZXN0LnByb3RvIiwga1NtYWxsVGVzdEZpbGUpOworICBFWFBFQ1RfVFJVRShDYXB0dXJlTWV0YWRhdGEoInRlc3QucHJvdG8iLCAmZmlsZSwgJnBiX2gsICZpbmZvLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cikpOworICBFWFBFQ1RfRVEoIkVudW0iLCBmaWxlLmVudW1fdHlwZSgwKS5uYW1lKCkpOworICBzdGQ6OnZlY3RvcjxpbnQ+IGVudW1fcGF0aDsKKyAgZW51bV9wYXRoLnB1c2hfYmFjayhGaWxlRGVzY3JpcHRvclByb3RvOjprRW51bVR5cGVGaWVsZE51bWJlcik7CisgIGVudW1fcGF0aC5wdXNoX2JhY2soMCk7CisgIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKiBlbnVtX2Fubm90YXRpb24gPQorICAgICAgYXR1OjpGaW5kQW5ub3RhdGlvbk9uUGF0aChpbmZvLCAidGVzdC5wcm90byIsIGVudW1fcGF0aCk7CisgIEVYUEVDVF9UUlVFKG51bGxwdHIgIT0gZW51bV9hbm5vdGF0aW9uKTsKKyAgRVhQRUNUX1RSVUUoYXR1OjpBbm5vdGF0aW9uTWF0Y2hlc1N1YnN0cmluZyhwYl9oLCBlbnVtX2Fubm90YXRpb24sICJFbnVtIikpOworfQorCitURVNUX0YoQ3BwTWV0YWRhdGFUZXN0LCBBZGRzUHJhZ21hKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgR2VuZXJhdGVkQ29kZUluZm8gaW5mbzsKKyAgc3RkOjpzdHJpbmcgcGJfaDsKKyAgYXR1OjpBZGRGaWxlKCJ0ZXN0LnByb3RvIiwga1NtYWxsVGVzdEZpbGUpOworICBFWFBFQ1RfVFJVRShDYXB0dXJlTWV0YWRhdGEoInRlc3QucHJvdG8iLCAmZmlsZSwgJnBiX2gsICZpbmZvLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cikpOworICBFWFBFQ1RfVFJVRShwYl9oLmZpbmQoIiNpZmRlZiBndWFyZF9uYW1lIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpOworICBFWFBFQ1RfVFJVRShwYl9oLmZpbmQoIiNwcmFnbWEgcHJhZ21hX25hbWUgXCJ0ZXN0LnBiLmgubWV0YVwiIikgIT0KKyAgICAgICAgICAgICAgc3RkOjpzdHJpbmc6Om5wb3MpOworfQorCitURVNUX0YoQ3BwTWV0YWRhdGFUZXN0LCBDYXB0dXJlc01lc3NhZ2VOYW1lcykgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgIEdlbmVyYXRlZENvZGVJbmZvIGluZm87CisgIHN0ZDo6c3RyaW5nIHBiX2g7CisgIGF0dTo6QWRkRmlsZSgidGVzdC5wcm90byIsIGtTbWFsbFRlc3RGaWxlKTsKKyAgRVhQRUNUX1RSVUUoQ2FwdHVyZU1ldGFkYXRhKCJ0ZXN0LnByb3RvIiwgJmZpbGUsICZwYl9oLCAmaW5mbywgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIpKTsKKyAgRVhQRUNUX0VRKCJNZXNzYWdlIiwgZmlsZS5tZXNzYWdlX3R5cGUoMCkubmFtZSgpKTsKKyAgc3RkOjp2ZWN0b3I8aW50PiBtZXNzYWdlX3BhdGg7CisgIG1lc3NhZ2VfcGF0aC5wdXNoX2JhY2soRmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXIpOworICBtZXNzYWdlX3BhdGgucHVzaF9iYWNrKDApOworICBjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbzo6QW5ub3RhdGlvbiogbWVzc2FnZV9hbm5vdGF0aW9uID0KKyAgICAgIGF0dTo6RmluZEFubm90YXRpb25PblBhdGgoaW5mbywgInRlc3QucHJvdG8iLCBtZXNzYWdlX3BhdGgpOworICBFWFBFQ1RfVFJVRShudWxscHRyICE9IG1lc3NhZ2VfYW5ub3RhdGlvbik7CisgIEVYUEVDVF9UUlVFKAorICAgICAgYXR1OjpBbm5vdGF0aW9uTWF0Y2hlc1N1YnN0cmluZyhwYl9oLCBtZXNzYWdlX2Fubm90YXRpb24sICJNZXNzYWdlIikpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tb3ZlX3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbW92ZV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjdjZDFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbW92ZV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDE2OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpZiBMQU5HX0NYWDExCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjZW5kaWYKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCisvLyBDYW4ndCB1c2UgYW4gYW5vbnltb3VzIG5hbWVzcGFjZSBoZXJlIGR1ZSB0byBicm9rZW5uZXNzIG9mIFRydTY0IGNvbXBpbGVyLgorbmFtZXNwYWNlIGNwcF91bml0dGVzdCB7CisKKy8vIE1vdmVzIGFyZSBlbmFibGVkIG9ubHkgd2hlbiBjb21waWxpbmcgd2l0aCBhIEMrKzExIGNvbXBpbGVyIG9yIG5ld2VyLgorI2lmIExBTkdfQ1hYMTEKKworVEVTVChNb3ZhYmxlTWVzc2FnZVRlc3QsIE1vdmVDb25zdHJ1Y3RvcikgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UxOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMSk7CisgIGNvbnN0IGF1dG8qIG5lc3RlZCA9ICZtZXNzYWdlMS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTIoc3RkOjptb3ZlKG1lc3NhZ2UxKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworCisgIC8vIENoZWNrIGlmIHRoZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB3YXMgYWN0dWFsbHkgbW92ZWQgKGFuZCBub3QganVzdAorICAvLyBjb3BpZWQpLgorICBFWFBFQ1RfRVEobmVzdGVkLCAmbWVzc2FnZTIub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9ORShuZXN0ZWQsICZtZXNzYWdlMS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKK30KKworVEVTVChNb3ZhYmxlTWVzc2FnZVRlc3QsIE1vdmVBc3NpZ25tZW50T3BlcmF0b3IpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOworICBjb25zdCBhdXRvKiBuZXN0ZWQgPSAmbWVzc2FnZTEub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UyOworICBtZXNzYWdlMiA9IHN0ZDo6bW92ZShtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworCisgIC8vIENoZWNrIGlmIHRoZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB3YXMgYWN0dWFsbHkgbW92ZWQgKGFuZCBub3QganVzdAorICAvLyBjb3BpZWQpLgorICBFWFBFQ1RfRVEobmVzdGVkLCAmbWVzc2FnZTIub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9ORShuZXN0ZWQsICZtZXNzYWdlMS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKK30KKworVEVTVChNb3ZhYmxlTWVzc2FnZVRlc3QsIFNlbGZNb3ZlQXNzaWdubWVudCkgeworICAvLyBUaGUgYHNlbGZgIHJlZmVyZW5jZSBpcyBuZWNlc3NhcnkgdG8gZGVmZWF0IC1Xc2VsZi1tb3ZlLgorICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UsICZzZWxmID0gbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBzdGQ6Om1vdmUoc2VsZik7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoTW92YWJsZU1lc3NhZ2VUZXN0LCBNb3ZlU2FtZUFyZW5hKSB7CisgIEFyZW5hIGFyZW5hOworCisgIGF1dG8qIG1lc3NhZ2UxX29uX2FyZW5hID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMobWVzc2FnZTFfb25fYXJlbmEpOworICBjb25zdCBhdXRvKiBuZXN0ZWQgPSAmbWVzc2FnZTFfb25fYXJlbmEtPm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCk7CisKKyAgYXV0byogbWVzc2FnZTJfb25fYXJlbmEgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8cHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcz4oJmFyZW5hKTsKKworICAvLyBNb3ZpbmcgbWVzc2FnZXMgb24gdGhlIHNhbWUgYXJlbmEgc2hvdWxkIGxlYWQgdG8gc3dhcHBlZCBwb2ludGVycy4KKyAgKm1lc3NhZ2UyX29uX2FyZW5hID0gc3RkOjptb3ZlKCptZXNzYWdlMV9vbl9hcmVuYSk7CisgIEVYUEVDVF9FUShuZXN0ZWQsICZtZXNzYWdlMl9vbl9hcmVuYS0+b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7Cit9CisKK1RFU1QoTW92YWJsZU1lc3NhZ2VUZXN0LCBNb3ZlRGlmZmVyZW50QXJlbmFzKSB7CisgIEFyZW5hIGFyZW5hMSwgYXJlbmEyOworCisgIGF1dG8qIG1lc3NhZ2UxX29uX2FyZW5hID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+KCZhcmVuYTEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKG1lc3NhZ2UxX29uX2FyZW5hKTsKKyAgY29uc3QgYXV0byogbmVzdGVkID0gJm1lc3NhZ2UxX29uX2FyZW5hLT5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworCisgIGF1dG8qIG1lc3NhZ2UyX29uX2FyZW5hID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+KCZhcmVuYTIpOworCisgIC8vIE1vdmluZyBtZXNzYWdlcyBvbiB0d28gZGlmZmVyZW50IGFyZW5hcyBzaG91bGQgbGVhZCB0byBhIGNvcHkuCisgICptZXNzYWdlMl9vbl9hcmVuYSA9IHN0ZDo6bW92ZSgqbWVzc2FnZTFfb25fYXJlbmEpOworICBFWFBFQ1RfTkUobmVzdGVkLCAmbWVzc2FnZTJfb25fYXJlbmEtPm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KCptZXNzYWdlMV9vbl9hcmVuYSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoKm1lc3NhZ2UyX29uX2FyZW5hKTsKK30KKworVEVTVChNb3ZhYmxlTWVzc2FnZVRlc3QsIE1vdmVGcm9tQXJlbmEpIHsKKyAgQXJlbmEgYXJlbmE7CisKKyAgYXV0byogbWVzc2FnZTFfb25fYXJlbmEgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8cHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcz4oJmFyZW5hKTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcyhtZXNzYWdlMV9vbl9hcmVuYSk7CisgIGNvbnN0IGF1dG8qIG5lc3RlZCA9ICZtZXNzYWdlMV9vbl9hcmVuYS0+b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UyOworCisgIC8vIE1vdmluZyBmcm9tIGEgbWVzc2FnZSBvbiB0aGUgYXJlbmEgc2hvdWxkIGxlYWQgdG8gYSBjb3B5LgorICBtZXNzYWdlMiA9IHN0ZDo6bW92ZSgqbWVzc2FnZTFfb25fYXJlbmEpOworICBFWFBFQ1RfTkUobmVzdGVkLCAmbWVzc2FnZTIub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoKm1lc3NhZ2UxX29uX2FyZW5hKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7Cit9CisKK1RFU1QoTW92YWJsZU1lc3NhZ2VUZXN0LCBNb3ZlVG9BcmVuYSkgeworICBBcmVuYSBhcmVuYTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UxOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMSk7CisgIGNvbnN0IGF1dG8qIG5lc3RlZCA9ICZtZXNzYWdlMS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworCisgIGF1dG8qIG1lc3NhZ2UyX29uX2FyZW5hID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisKKyAgLy8gTW92aW5nIHRvIGEgbWVzc2FnZSBvbiB0aGUgYXJlbmEgc2hvdWxkIGxlYWQgdG8gYSBjb3B5LgorICAqbWVzc2FnZTJfb25fYXJlbmEgPSBzdGQ6Om1vdmUobWVzc2FnZTEpOworICBFWFBFQ1RfTkUobmVzdGVkLCAmbWVzc2FnZTJfb25fYXJlbmEtPm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldCgqbWVzc2FnZTJfb25fYXJlbmEpOworfQorCitURVNUKE1vdmFibGVNZXNzYWdlVGVzdCwgTm9leGNlcHQpIHsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBzdGQ6OmlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+KCkpOworICBFWFBFQ1RfVFJVRShzdGQ6OmlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+KCkpOworfQorCisjZW5kaWYgIC8vIExBTkdfQ1hYMTEKKworfSAgLy8gbmFtZXNwYWNlIGNwcF91bml0dGVzdAorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbmFtZXMuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL25hbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwNGFjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL25hbWVzLmgKQEAgLTAsMCArMSw5NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9OQU1FU19IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9OQU1FU19IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgRGVzY3JpcHRvcjsKK2NsYXNzIEVudW1EZXNjcmlwdG9yOworY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvcjsKK2NsYXNzIEZpZWxkRGVzY3JpcHRvcjsKKworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCisvLyBSZXR1cm5zIHRoZSB1bnF1YWxpZmllZCBDKysgbmFtZS4KKy8vCisvLyBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZDoKKy8vICAgcGFja2FnZSBmb28uYmFyOworLy8gICBtZXNzYWdlIEJheiB7IG1lc3NhZ2UgTW9vIHt9IH0KKy8vIFRoZW4gdGhlIG5vbi1xdWFsaWZpZWQgdmVyc2lvbiB3b3VsZCBiZToKKy8vICAgQmF6X01vbworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX2Rlc2NyaXB0b3IpOworCisvLyBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgQysrIG5hbWUuCisvLworLy8gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYWQ6CisvLyAgIHBhY2thZ2UgZm9vLmJhcjsKKy8vICAgbWVzc2FnZSBCYXogeyBtZXNzYWdlIE1vbyB7fSB9CisvLyBUaGVuIHRoZSBxdWFsaWZpZWQgQ2xhc3NOYW1lIGZvciBNb28gd291bGQgYmU6CisvLyAgIDo6Zm9vOjpiYXI6OkJhel9Nb28KK3N0ZDo6c3RyaW5nIFF1YWxpZmllZENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkKTsKK3N0ZDo6c3RyaW5nIFF1YWxpZmllZENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZCk7CitzdGQ6OnN0cmluZyBRdWFsaWZpZWRFeHRlbnNpb25OYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZCk7CisKKy8vIEdldCB0aGUgKHVucXVhbGlmaWVkKSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgZmllbGQgaW4gQysrIGNvZGUuCisvLyBUaGUgbmFtZSBpcyBjb2VyY2VkIHRvIGxvd2VyLWNhc2UgdG8gZW11bGF0ZSBwcm90bzEgYmVoYXZpb3IuICBQZW9wbGUKKy8vIHNob3VsZCBiZSB1c2luZyBsb3dlcmNhc2Utd2l0aC11bmRlcnNjb3JlcyBzdHlsZSBmb3IgcHJvdG8gZmllbGQgbmFtZXMKKy8vIGFueXdheSwgc28gbm9ybWFsbHkgdGhpcyBqdXN0IHJldHVybnMgZmllbGQtPm5hbWUoKS4KK3N0ZDo6c3RyaW5nIEZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworLy8gUmVxdWlyZXMgdGhhdCB0aGlzIGZpZWxkIGlzIGluIGEgb25lb2YuIFJldHVybnMgdGhlICh1bnF1YWxpZmllZCkgY2FzZQorLy8gY29uc3RhbnQgZm9yIHRoaXMgZmllbGQuCitzdGQ6OnN0cmluZyBPbmVvZkNhc2VDb25zdGFudE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisvLyBSZXR1cm5zIHRoZSBxdWFmaWxpZWQgY2FzZSBjb25zdGFudCBmb3IgdGhpcyBmaWVsZC4KK3N0ZDo6c3RyaW5nIFF1YWxpZmllZE9uZW9mQ2FzZUNvbnN0YW50TmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworLy8gR2V0IHRoZSAodW5xdWFsaWZpZWQpIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBlbnVtIHZhbHVlIGluIEMrKworLy8gY29kZS4KK3N0ZDo6c3RyaW5nIEVudW1WYWx1ZU5hbWUoY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSk7CisKKy8vIFN0cmlwcyAiLnByb3RvIiBvciAiLnByb3RvZGV2ZWwiIGZyb20gdGhlIGVuZCBvZiBhIGZpbGVuYW1lLgorUFJPVE9DX0VYUE9SVCBzdGQ6OnN0cmluZyBTdHJpcFByb3RvKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSk7CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9OQU1FU19IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL29wdGlvbnMuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL29wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDkzNWU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvb3B0aW9ucy5oCkBAIC0wLDAgKzEsMTAxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiByZW5uaWVAZ29vZ2xlLmNvbSAoSmVmZnJleSBSZW5uaWUpCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9PUFRJT05TX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX09QVElPTlNfSF9fCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworY2xhc3MgQWNjZXNzSW5mb01hcDsKKworbmFtZXNwYWNlIGNwcCB7CisKK2VudW0gY2xhc3MgRW5mb3JjZU9wdGltaXplTW9kZSB7CisgIGtOb0VuZm9yY2VtZW50LCAgLy8gVXNlIHRoZSBydW50aW1lIHNwZWNpZmllZCBieSB0aGUgZmlsZSBzcGVjaWZpYyBvcHRpb25zLgorICBrU3BlZWQsICAgICAgICAgIC8vIEZ1bGwgcnVudGltZSB3aXRoIGEgZ2VuZXJhdGVkIGNvZGUgaW1wbGVtZW50YXRpb24uCisgIGtDb2RlU2l6ZSwgICAgICAgLy8gRnVsbCBydW50aW1lIHdpdGggYSByZWZsZWN0aXZlIGltcGxlbWVudGF0aW9uLgorICBrTGl0ZVJ1bnRpbWUsCit9OworCitzdHJ1Y3QgRmllbGRMaXN0ZW5lck9wdGlvbnMgeworICBib29sIGluamVjdF9maWVsZF9saXN0ZW5lcl9ldmVudHMgPSBmYWxzZTsKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGZvcmJpZGRlbl9maWVsZF9saXN0ZW5lcl9ldmVudHM7Cit9OworCisvLyBHZW5lcmF0b3Igb3B0aW9ucyAoc2VlIGdlbmVyYXRvci5jYyBmb3IgYSBkZXNjcmlwdGlvbiBvZiBlYWNoKToKK3N0cnVjdCBPcHRpb25zIHsKKyAgY29uc3QgQWNjZXNzSW5mb01hcCogYWNjZXNzX2luZm9fbWFwID0gbnVsbHB0cjsKKyAgc3RkOjpzdHJpbmcgZGxsZXhwb3J0X2RlY2w7CisgIHN0ZDo6c3RyaW5nIHJ1bnRpbWVfaW5jbHVkZV9iYXNlOworICBzdGQ6OnN0cmluZyBhbm5vdGF0aW9uX3ByYWdtYV9uYW1lOworICBzdGQ6OnN0cmluZyBhbm5vdGF0aW9uX2d1YXJkX25hbWU7CisgIEZpZWxkTGlzdGVuZXJPcHRpb25zIGZpZWxkX2xpc3RlbmVyX29wdGlvbnM7CisgIEVuZm9yY2VPcHRpbWl6ZU1vZGUgZW5mb3JjZV9tb2RlID0gRW5mb3JjZU9wdGltaXplTW9kZTo6a05vRW5mb3JjZW1lbnQ7CisgIGVudW0geworICAgIGtUQ1RhYmxlTmV2ZXIsCisgICAga1RDVGFibGVHdWFyZGVkLAorICAgIGtUQ1RhYmxlQWx3YXlzCisgIH0gdGN0YWJsZV9tb2RlID0ga1RDVGFibGVOZXZlcjsKKyAgaW50IG51bV9jY19maWxlcyA9IDA7CisgIGJvb2wgc2FmZV9ib3VuZGFyeV9jaGVjayA9IGZhbHNlOworICBib29sIHByb3RvX2ggPSBmYWxzZTsKKyAgYm9vbCB0cmFuc2l0aXZlX3BiX2ggPSB0cnVlOworICBib29sIGFubm90YXRlX2hlYWRlcnMgPSBmYWxzZTsKKyAgYm9vbCBsaXRlX2ltcGxpY2l0X3dlYWtfZmllbGRzID0gZmFsc2U7CisgIGJvb2wgYm9vdHN0cmFwID0gZmFsc2U7CisgIGJvb2wgb3BlbnNvdXJjZV9ydW50aW1lID0gZmFsc2U7CisgIGJvb2wgYW5ub3RhdGVfYWNjZXNzb3IgPSBmYWxzZTsKKyAgYm9vbCB1bnVzZWRfZmllbGRfc3RyaXBwaW5nID0gZmFsc2U7CisgIGJvb2wgdW52ZXJpZmllZF9sYXp5X21lc3NhZ2Vfc2V0cyA9IGZhbHNlOworICBib29sIHVudmVyaWZpZWRfbGF6eSA9IGZhbHNlOworICBib29sIHByb2ZpbGVfZHJpdmVuX2lubGluZV9zdHJpbmcgPSB0cnVlOworICBib29sIG1lc3NhZ2Vfb3duZWRfYXJlbmFfdHJpYWwgPSBmYWxzZTsKKyAgYm9vbCBmb3JjZV9zcGxpdCA9IGZhbHNlOworI2lmZGVmIFBST1RPQlVGX1NUQUJMRV9FWFBFUklNRU5UUworICBib29sIGZvcmNlX2VhZ2VybHlfdmVyaWZpZWRfbGF6eSA9IHRydWU7CisgIGJvb2wgZm9yY2VfaW5saW5lX3N0cmluZyA9IHRydWU7CisjZWxzZSAgIC8vIFBST1RPQlVGX1NUQUJMRV9FWFBFUklNRU5UUworICBib29sIGZvcmNlX2VhZ2VybHlfdmVyaWZpZWRfbGF6eSA9IGZhbHNlOworICBib29sIGZvcmNlX2lubGluZV9zdHJpbmcgPSBmYWxzZTsKKyNlbmRpZiAgLy8gIVBST1RPQlVGX1NUQUJMRV9FWFBFUklNRU5UUworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX09QVElPTlNfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wYWRkaW5nX29wdGltaXplci5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3BhZGRpbmdfb3B0aW1pemVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTEwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wYWRkaW5nX29wdGltaXplci5jYwpAQCAtMCwwICsxLDIyOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3BhZGRpbmdfb3B0aW1pemVyLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2hlbHBlcnMuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCituYW1lc3BhY2UgeworCisvLyBGaWVsZEdyb3VwIGlzIGp1c3QgYSBoZWxwZXIgZm9yIFBhZGRpbmdPcHRpbWl6ZXIgYmVsb3cuIEl0IGhvbGRzIGEgdmVjdG9yIG9mCisvLyBmaWVsZHMgdGhhdCBhcmUgZ3JvdXBlZCB0b2dldGhlciBiZWNhdXNlIHRoZXkgaGF2ZSBjb21wYXRpYmxlIGFsaWdubWVudCwgYW5kCisvLyBhIHByZWZlcnJlZCBsb2NhdGlvbiBpbiB0aGUgZmluYWwgZmllbGQgb3JkZXJpbmcuCitjbGFzcyBGaWVsZEdyb3VwIHsKKyBwdWJsaWM6CisgIEZpZWxkR3JvdXAoKSA6IHByZWZlcnJlZF9sb2NhdGlvbl8oMCkge30KKworICAvLyBBIGdyb3VwIHdpdGggYSBzaW5nbGUgZmllbGQuCisgIEZpZWxkR3JvdXAoZG91YmxlIHByZWZlcnJlZF9sb2NhdGlvbiwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkKKyAgICAgIDogcHJlZmVycmVkX2xvY2F0aW9uXyhwcmVmZXJyZWRfbG9jYXRpb24pLCBmaWVsZHNfKDEsIGZpZWxkKSB7fQorCisgIC8vIEFwcGVuZCB0aGUgZmllbGRzIGluICdvdGhlcicgdG8gdGhpcyBncm91cC4KKyAgdm9pZCBBcHBlbmQoY29uc3QgRmllbGRHcm91cCYgb3RoZXIpIHsKKyAgICBpZiAob3RoZXIuZmllbGRzXy5lbXB0eSgpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFByZWZlcnJlZCBsb2NhdGlvbiBpcyB0aGUgYXZlcmFnZSBhbW9uZyBhbGwgdGhlIGZpZWxkcywgc28gd2Ugd2VpZ2h0IGJ5CisgICAgLy8gdGhlIG51bWJlciBvZiBmaWVsZHMgb24gZWFjaCBGaWVsZEdyb3VwIG9iamVjdC4KKyAgICBwcmVmZXJyZWRfbG9jYXRpb25fID0gKHByZWZlcnJlZF9sb2NhdGlvbl8gKiBmaWVsZHNfLnNpemUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIucHJlZmVycmVkX2xvY2F0aW9uXyAqIG90aGVyLmZpZWxkc18uc2l6ZSgpKSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAoZmllbGRzXy5zaXplKCkgKyBvdGhlci5maWVsZHNfLnNpemUoKSk7CisgICAgZmllbGRzXy5pbnNlcnQoZmllbGRzXy5lbmQoKSwgb3RoZXIuZmllbGRzXy5iZWdpbigpLCBvdGhlci5maWVsZHNfLmVuZCgpKTsKKyAgfQorCisgIHZvaWQgU2V0UHJlZmVycmVkTG9jYXRpb24oZG91YmxlIGxvY2F0aW9uKSB7IHByZWZlcnJlZF9sb2NhdGlvbl8gPSBsb2NhdGlvbjsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgZmllbGRzKCkgY29uc3QgeyByZXR1cm4gZmllbGRzXzsgfQorCisgIC8vIEZpZWxkR3JvdXAgb2JqZWN0cyBzb3J0IGJ5IHRoZWlyIHByZWZlcnJlZCBsb2NhdGlvbi4KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRmllbGRHcm91cCYgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gcHJlZmVycmVkX2xvY2F0aW9uXyA8IG90aGVyLnByZWZlcnJlZF9sb2NhdGlvbl87CisgIH0KKworIHByaXZhdGU6CisgIC8vICJwcmVmZXJyZWRfbG9jYXRpb25fIiBpcyBhbiBlc3RpbWF0ZSBvZiB3aGVyZSB0aGlzIGdyb3VwIHNob3VsZCBnbyBpbiB0aGUKKyAgLy8gZmluYWwgbGlzdCBvZiBmaWVsZHMuICBXZSBjb21wdXRlIHRoaXMgYnkgdGFraW5nIHRoZSBhdmVyYWdlIGluZGV4IG9mIGVhY2gKKyAgLy8gZmllbGQgaW4gdGhpcyBncm91cCBpbiB0aGUgb3JpZ2luYWwgb3JkZXJpbmcgb2YgZmllbGRzLiAgVGhpcyBpcyB2ZXJ5CisgIC8vIGFwcHJveGltYXRlLCBidXQgc2hvdWxkIHB1dCB0aGlzIGdyb3VwIGNsb3NlIHRvIHdoZXJlIGl0cyBtZW1iZXIgZmllbGRzCisgIC8vIG9yaWdpbmFsbHkgd2VudC4KKyAgZG91YmxlIHByZWZlcnJlZF9sb2NhdGlvbl87CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkc187CisgIC8vIFdlIHJlbHkgb24gdGhlIGRlZmF1bHQgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9IHNvIHRoaXMgdHlwZSBjYW4gYmUKKyAgLy8gdXNlZCBpbiBhIHZlY3Rvci4KK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBSZW9yZGVyICdmaWVsZHMnIHNvIHRoYXQgaWYgdGhlIGZpZWxkcyBhcmUgb3V0cHV0IGludG8gYSBjKysgY2xhc3MgaW4gdGhlIG5ldworLy8gb3JkZXIsIGZpZWxkcyBvZiBzaW1pbGFyIGZhbWlseSAoc2VlIGJlbG93KSBhcmUgdG9nZXRoZXIgYW5kIHdpdGhpbiBlYWNoCisvLyBmYW1pbHksIGFsaWdubWVudCBwYWRkaW5nIGlzIG1pbmltaXplZC4KKy8vCisvLyBXZSB0cnkgdG8gZG8gdGhpcyB3aGlsZSBrZWVwaW5nIGVhY2ggZmllbGQgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gaXRzIGZpZWxkCisvLyBudW1iZXIgb3JkZXIgc28gdGhhdCB3ZSBkb24ndCByZWR1Y2UgY2FjaGUgbG9jYWxpdHkgbXVjaCBmb3IgZnVuY3Rpb24gdGhhdAorLy8gYWNjZXNzIGVhY2ggZmllbGQgaW4gb3JkZXIuICBPcmlnaW5hbGx5LCBPcHRpbWl6ZVBhZGRpbmcgdXNlZCBkZWNsYXJhdGlvbgorLy8gb3JkZXIgZm9yIGl0cyBkZWNpc2lvbnMsIGJ1dCBnZW5lcmF0ZWQgY29kZSBtaW51cyB0aGUgc2VyaWFsaXplci9wYXJzZXJzIHVzZXMKKy8vIHRoZSBvdXRwdXQgb2YgT3B0aW1pemVQYWRkaW5nIGFzIHdlbGwgKHN0b3JlZCBpbgorLy8gTWVzc2FnZUdlbmVyYXRvcjo6b3B0aW1pemVkX29yZGVyXykuICBTaW5jZSB0aGUgc2VyaWFsaXplcnMgdXNlIGZpZWxkIG51bWJlcgorLy8gb3JkZXIsIHdlIHVzZSB0aGF0IGFzIGEgdGllLWJyZWFrZXIuCisvLworLy8gV2UgY2xhc3NpZnkgZWFjaCBmaWVsZCBpbnRvIGEgcGFydGljdWxhciAiZmFtaWx5IiBvZiBmaWVsZHMsIHRoYXQgd2UgcGVyZm9ybQorLy8gdGhlIHNhbWUgb3BlcmF0aW9uIG9uIGluIG91ciBnZW5lcmF0ZWQgZnVuY3Rpb25zLgorLy8KKy8vIFJFUEVBVEVEIGlzIHBsYWNlZCBmaXJzdCwgYXMgdGhlIEMrKyBjb21waWxlciBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVzCisvLyB0aGVzZSBmaWVsZHMgaW4gbGF5b3V0IG9yZGVyLgorLy8KKy8vIFNUUklORyBpcyBncm91cGVkIG5leHQsIGFzIG91ciBDbGVhci9TaGFyZWRDdG9yL1NoYXJlZER0b3Igd2Fsa3MgaXQgYW5kCisvLyBjYWxscyBBcmVuYVN0cmluZ1B0cjo6RGVzdHJveSBvbiBlYWNoLgorLy8KKy8vIExBWllfTUVTU0FHRSBpcyBncm91cGVkIG5leHQsIGFzIGl0IGludGVyZmVyZXMgd2l0aCB0aGUgYWJpbGl0eSB0byBtZW1zZXQKKy8vIG5vbi1yZXBlYXRlZCBmaWVsZHMgb3RoZXJ3aXNlLgorLy8KKy8vIE1FU1NBR0UgaXMgZ3JvdXBlZCBuZXh0LCBhcyBvdXIgQ2xlYXIvU2hhcmVkRHRvciBjb2RlIHdhbGtzIGl0IGFuZCBjYWxscworLy8gZGVsZXRlIG9uIGVhY2guICBXZSBpbml0aWFsaXplIHRoZXNlIGZpZWxkcyB3aXRoIGEgTlVMTCBwb2ludGVyIChzZWUKKy8vIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUpLCB3aGljaCBhbGxvd3MgdGhlbSB0byBiZQorLy8gbWVtc2V0LgorLy8KKy8vIFpFUk9fSU5JVElBTElaQUJMRSBpcyBtZW1zZXQgaW4gQ2xlYXIvU2hhcmVkQ3RvcgorLy8KKy8vIE9USEVSIHRoZXNlIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgb25lLWJ5LW9uZS4KK3ZvaWQgUGFkZGluZ09wdGltaXplcjo6T3B0aW1pemVMYXlvdXQoCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIGZpZWxkcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICBNZXNzYWdlU0NDQW5hbHl6ZXIqIHNjY19hbmFseXplcikgeworICAvLyBUaGUgc29ydGVkIG51bWVyaWMgb3JkZXIgb2YgRmFtaWx5IGRldGVybWluZXMgdGhlIGRlY2xhcmF0aW9uIG9yZGVyIGluIHRoZQorICAvLyBtZW1vcnkgbGF5b3V0LgorICBlbnVtIEZhbWlseSB7CisgICAgUkVQRUFURUQgPSAwLAorICAgIFNUUklORyA9IDEsCisgICAgLy8gTGF5aW5nIG91dCBMQVpZX01FU1NBR0UgYmVmb3JlIE1FU1NBR0UgYWxsb3dzIGEgc2luZ2xlIG1lbXNldCB0byB6ZXJvCisgICAgLy8gTUVTU0FHRSBhbmQgWkVST19JTklUSUFMSVpBQkxFIGZpZWxkcyB0b2dldGhlci4KKyAgICBMQVpZX01FU1NBR0UgPSAyLAorICAgIE1FU1NBR0UgPSAzLAorICAgIFpFUk9fSU5JVElBTElaQUJMRSA9IDQsCisgICAgT1RIRVIgPSA1LAorICAgIGtNYXhGYW1pbHkKKyAgfTsKKworICAvLyBGaXJzdCBkaXZpZGUgZmllbGRzIGludG8gdGhvc2UgdGhhdCBhbGlnbiB0byAxIGJ5dGUsIDQgYnl0ZXMgb3IgOCBieXRlcy4KKyAgc3RkOjp2ZWN0b3I8RmllbGRHcm91cD4gYWxpZ25lZF90b18xW2tNYXhGYW1pbHldOworICBzdGQ6OnZlY3RvcjxGaWVsZEdyb3VwPiBhbGlnbmVkX3RvXzRba01heEZhbWlseV07CisgIHN0ZDo6dmVjdG9yPEZpZWxkR3JvdXA+IGFsaWduZWRfdG9fOFtrTWF4RmFtaWx5XTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMtPnNpemUoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9ICgqZmllbGRzKVtpXTsKKworICAgIEZhbWlseSBmID0gT1RIRVI7CisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBmID0gUkVQRUFURUQ7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HKSB7CisgICAgICBmID0gU1RSSU5HOworICAgIH0gZWxzZSBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIGYgPSBNRVNTQUdFOworICAgICAgaWYgKElzTGF6eShmaWVsZCwgb3B0aW9ucywgc2NjX2FuYWx5emVyKSkgeworICAgICAgICBmID0gTEFaWV9NRVNTQUdFOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoQ2FuSW5pdGlhbGl6ZUJ5WmVyb2luZyhmaWVsZCkpIHsKKyAgICAgIGYgPSBaRVJPX0lOSVRJQUxJWkFCTEU7CisgICAgfQorCisgICAgY29uc3QgaW50IGogPSBmaWVsZC0+bnVtYmVyKCk7CisgICAgc3dpdGNoIChFc3RpbWF0ZUFsaWdubWVudFNpemUoZmllbGQpKSB7CisgICAgICBjYXNlIDE6CisgICAgICAgIGFsaWduZWRfdG9fMVtmXS5wdXNoX2JhY2soRmllbGRHcm91cChqLCBmaWVsZCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgYWxpZ25lZF90b180W2ZdLnB1c2hfYmFjayhGaWVsZEdyb3VwKGosIGZpZWxkKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4OgorICAgICAgICBhbGlnbmVkX3RvXzhbZl0ucHVzaF9iYWNrKEZpZWxkR3JvdXAoaiwgZmllbGQpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5rbm93biBhbGlnbm1lbnQgc2l6ZSAiIDw8IEVzdGltYXRlQWxpZ25tZW50U2l6ZShmaWVsZCkKKyAgICAgICAgICAgICAgICAgICA8PCAiZm9yIGEgZmllbGQgIiA8PCBmaWVsZC0+ZnVsbF9uYW1lKCkgPDwgIi4iOworICAgIH0KKyAgfQorCisgIC8vIEZvciBlYWNoIGZhbWlseSwgZ3JvdXAgZmllbGRzIHRvIG9wdGltaXplIHBhZGRpbmcuCisgIGZvciAoaW50IGYgPSAwOyBmIDwga01heEZhbWlseTsgZisrKSB7CisgICAgLy8gTm93IGdyb3VwIGZpZWxkcyBhbGlnbmVkIHRvIDEgYnl0ZSBpbnRvIHNldHMgb2YgNCwgYW5kIHRyZWF0IHRob3NlIGxpa2UgYQorICAgIC8vIHNpbmdsZSBmaWVsZCBhbGlnbmVkIHRvIDQgYnl0ZXMuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGlnbmVkX3RvXzFbZl0uc2l6ZSgpOyBpICs9IDQpIHsKKyAgICAgIEZpZWxkR3JvdXAgZmllbGRfZ3JvdXA7CisgICAgICBmb3IgKGludCBqID0gaTsgaiA8IGFsaWduZWRfdG9fMVtmXS5zaXplKCkgJiYgaiA8IGkgKyA0OyArK2opIHsKKyAgICAgICAgZmllbGRfZ3JvdXAuQXBwZW5kKGFsaWduZWRfdG9fMVtmXVtqXSk7CisgICAgICB9CisgICAgICBhbGlnbmVkX3RvXzRbZl0ucHVzaF9iYWNrKGZpZWxkX2dyb3VwKTsKKyAgICB9CisgICAgLy8gU29ydCBieSBwcmVmZXJyZWQgbG9jYXRpb24gdG8ga2VlcCBmaWVsZHMgYXMgY2xvc2UgdG8gdGhlaXIgZmllbGQgbnVtYmVyCisgICAgLy8gb3JkZXIgYXMgcG9zc2libGUuICBVc2luZyBzdGFibGVfc29ydCBlbnN1cmVzIHRoYXQgdGhlIG91dHB1dCBpcworICAgIC8vIGNvbnNpc3RlbnQgYWNyb3NzIHJ1bnMuCisgICAgc3RkOjpzdGFibGVfc29ydChhbGlnbmVkX3RvXzRbZl0uYmVnaW4oKSwgYWxpZ25lZF90b180W2ZdLmVuZCgpKTsKKworICAgIC8vIE5vdyBncm91cCBmaWVsZHMgYWxpZ25lZCB0byA0IGJ5dGVzIChvciB0aGUgNC1maWVsZCBncm91cHMgY3JlYXRlZCBhYm92ZSkKKyAgICAvLyBpbnRvIHBhaXJzLCBhbmQgdHJlYXQgdGhvc2UgbGlrZSBhIHNpbmdsZSBmaWVsZCBhbGlnbmVkIHRvIDggYnl0ZXMuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGlnbmVkX3RvXzRbZl0uc2l6ZSgpOyBpICs9IDIpIHsKKyAgICAgIEZpZWxkR3JvdXAgZmllbGRfZ3JvdXA7CisgICAgICBmb3IgKGludCBqID0gaTsgaiA8IGFsaWduZWRfdG9fNFtmXS5zaXplKCkgJiYgaiA8IGkgKyAyOyArK2opIHsKKyAgICAgICAgZmllbGRfZ3JvdXAuQXBwZW5kKGFsaWduZWRfdG9fNFtmXVtqXSk7CisgICAgICB9CisgICAgICBpZiAoaSA9PSBhbGlnbmVkX3RvXzRbZl0uc2l6ZSgpIC0gMSkgeworICAgICAgICBpZiAoZiA9PSBPVEhFUikgeworICAgICAgICAgIC8vIE1vdmUgaW5jb21wbGV0ZSA0LWJ5dGUgYmxvY2sgdG8gdGhlIGJlZ2lubmluZy4gIFRoaXMgaXMgZG9uZSB0bworICAgICAgICAgIC8vIHBhaXIgd2l0aCB0aGUgKHBvc3NpYmxlKSBsZWZ0b3ZlciBibG9ja3MgZnJvbSB0aGUKKyAgICAgICAgICAvLyBaRVJPX0lOSVRJQUxJWkFCTEUgZmFtaWx5LgorICAgICAgICAgIGZpZWxkX2dyb3VwLlNldFByZWZlcnJlZExvY2F0aW9uKC0xKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBNb3ZlIGluY29tcGxldGUgNC1ieXRlIGJsb2NrIHRvIHRoZSBlbmQuCisgICAgICAgICAgZmllbGRfZ3JvdXAuU2V0UHJlZmVycmVkTG9jYXRpb24oZG91Ymxle0ZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlcn0pOworICAgICAgICB9CisgICAgICB9CisgICAgICBhbGlnbmVkX3RvXzhbZl0ucHVzaF9iYWNrKGZpZWxkX2dyb3VwKTsKKyAgICB9CisgICAgLy8gU29ydCBieSBwcmVmZXJyZWQgbG9jYXRpb24uCisgICAgc3RkOjpzdGFibGVfc29ydChhbGlnbmVkX3RvXzhbZl0uYmVnaW4oKSwgYWxpZ25lZF90b184W2ZdLmVuZCgpKTsKKyAgfQorCisgIC8vIE5vdyBwdWxsIG91dCBhbGwgdGhlIEZpZWxkRGVzY3JpcHRvcnMgaW4gb3JkZXIuCisgIGZpZWxkcy0+Y2xlYXIoKTsKKyAgZm9yIChpbnQgZiA9IDA7IGYgPCBrTWF4RmFtaWx5OyArK2YpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWduZWRfdG9fOFtmXS5zaXplKCk7ICsraSkgeworICAgICAgZmllbGRzLT5pbnNlcnQoZmllbGRzLT5lbmQoKSwgYWxpZ25lZF90b184W2ZdW2ldLmZpZWxkcygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICBhbGlnbmVkX3RvXzhbZl1baV0uZmllbGRzKCkuZW5kKCkpOworICAgIH0KKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFkZGluZ19vcHRpbWl6ZXIuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3BhZGRpbmdfb3B0aW1pemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3NmYzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3BhZGRpbmdfb3B0aW1pemVyLmgKQEAgLTAsMCArMSw2NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogc2VvbmdraW1AZ29vZ2xlLmNvbSAoU2VvbmcgQmVvbSBLaW0pCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1BBRERJTkdfT1BUSU1JWkVSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1BBRERJTkdfT1BUSU1JWkVSX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXNzYWdlX2xheW91dF9oZWxwZXIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCisvLyBSZWFycmFuZ2VzIHRoZSBmaWVsZHMgb2YgYSBtZXNzYWdlIHRvIG1pbmltaXplIHBhZGRpbmcuCisvLyBGaWVsZHMgYXJlIGdyb3VwZWQgYnkgdGhlIHR5cGUgYW5kIHRoZSBzaXplLgorLy8gRm9yIGV4YW1wbGUsIGdyb3VwaW5nIGZvdXIgYm9vbGVhbiBmaWVsZHMgYW5kIG9uZSBpbnQzMgorLy8gZmllbGQgcmVzdWx0cyBpbiB6ZXJvIHBhZGRpbmcgb3ZlcmhlYWQuIFNlZSBPcHRpbWl6ZUxheW91dCdzCisvLyBjb21tZW50IGZvciBkZXRhaWxzLgorY2xhc3MgUGFkZGluZ09wdGltaXplciA6IHB1YmxpYyBNZXNzYWdlTGF5b3V0SGVscGVyIHsKKyBwdWJsaWM6CisgIFBhZGRpbmdPcHRpbWl6ZXIoKSB7fQorICB+UGFkZGluZ09wdGltaXplcigpIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBPcHRpbWl6ZUxheW91dChzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNDQ0FuYWx5emVyKiBzY2NfYW5hbHl6ZXIpIG92ZXJyaWRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1BBRERJTkdfT1BUSU1JWkVSX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMWQ3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wYXJzZV9mdW5jdGlvbl9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwxNzI1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworbmFtZXNwYWNlIHsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOworCitzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBHZXRPcmRlcmVkRmllbGRzKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gb3JkZXJlZF9maWVsZHM7CisgIGZvciAoYXV0byBmaWVsZCA6IEZpZWxkUmFuZ2UoZGVzY3JpcHRvcikpIHsKKyAgICBpZiAoIUlzRmllbGRTdHJpcHBlZChmaWVsZCwgb3B0aW9ucykpIHsKKyAgICAgIG9yZGVyZWRfZmllbGRzLnB1c2hfYmFjayhmaWVsZCk7CisgICAgfQorICB9CisgIHN0ZDo6c29ydChvcmRlcmVkX2ZpZWxkcy5iZWdpbigpLCBvcmRlcmVkX2ZpZWxkcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBiKSB7CisgICAgICAgICAgICAgIHJldHVybiBhLT5udW1iZXIoKSA8IGItPm51bWJlcigpOworICAgICAgICAgICAgfSk7CisgIHJldHVybiBvcmRlcmVkX2ZpZWxkczsKK30KKworYm9vbCBIYXNJbnRlcm5hbEFjY2Vzc29ycyhjb25zdCBGaWVsZE9wdGlvbnM6OkNUeXBlIGN0eXBlKSB7CisgIHJldHVybiBjdHlwZSA9PSBGaWVsZE9wdGlvbnM6OlNUUklORyB8fCBjdHlwZSA9PSBGaWVsZE9wdGlvbnM6OkNPUkQ7Cit9CisKK2ludCBUYWdTaXplKHVpbnQzMl90IGZpZWxkX251bWJlcikgeworICBpZiAoZmllbGRfbnVtYmVyIDwgMTYpIHJldHVybiAxOworICBHT09HTEVfQ0hFQ0tfTFQoZmllbGRfbnVtYmVyLCAoMSA8PCAxNCkpCisgICAgICA8PCAiY29kZWQgdGFnIGZvciAiIDw8IGZpZWxkX251bWJlciA8PCAiIHRvbyBiaWcgZm9yIHVpbnQxNl90IjsKKyAgcmV0dXJuIDI7Cit9CisKK3N0ZDo6c3RyaW5nIEZpZWxkUGFyc2VGdW5jdGlvbk5hbWUoCisgICAgY29uc3QgVGFpbENhbGxUYWJsZUluZm86OkZpZWxkRW50cnlJbmZvJiBlbnRyeSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKK2Jvb2wgSXNGaWVsZEVsaWdpYmxlRm9yRmFzdFBhcnNpbmcoCisgICAgY29uc3QgVGFpbENhbGxUYWJsZUluZm86OkZpZWxkRW50cnlJbmZvJiBlbnRyeSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICBNZXNzYWdlU0NDQW5hbHl6ZXIqIHNjY19hbmFseXplcikgeworICBjb25zdCBhdXRvKiBmaWVsZCA9IGVudHJ5LmZpZWxkOworICAvLyBNYXAsIG9uZW9mLCB3ZWFrLCBhbmQgbGF6eSBmaWVsZHMgYXJlIG5vdCBoYW5kbGVkIG9uIHRoZSBmYXN0IHBhdGguCisgIGlmIChmaWVsZC0+aXNfbWFwKCkgfHwgZmllbGQtPnJlYWxfY29udGFpbmluZ19vbmVvZigpIHx8CisgICAgICBmaWVsZC0+b3B0aW9ucygpLndlYWsoKSB8fAorICAgICAgSXNJbXBsaWNpdFdlYWtGaWVsZChmaWVsZCwgb3B0aW9ucywgc2NjX2FuYWx5emVyKSB8fAorICAgICAgSXNMYXp5KGZpZWxkLCBvcHRpb25zLCBzY2NfYW5hbHl6ZXIpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gV2Ugd2lsbCBjaGVjayBmb3IgYSB2YWxpZCBhdXhpbGlhcnkgaW5kZXggcmFuZ2UgbGF0ZXIuIEhvd2V2ZXIsIHdlIG1pZ2h0CisgIC8vIHdhbnQgdG8gY2hhbmdlIHRoZSB2YWx1ZSB3ZSBjaGVjayBmb3IgaW5saW5lZCBzdHJpbmcgZmllbGRzLgorICBpbnQgYXV4X2lkeCA9IGVudHJ5LmF1eF9pZHg7CisKKyAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTToKKyAgICAgIC8vIElmIGVudW0gdmFsdWVzIGFyZSBub3QgdmFsaWRhdGVkIGF0IHBhcnNlIHRpbWUsIHRoZW4gdGhpcyBmaWVsZCBjYW4gYmUKKyAgICAgIC8vIGhhbmRsZWQgb24gdGhlIGZhc3QgcGF0aCBsaWtlIGFuIGludDMyLgorICAgICAgaWYgKEhhc1ByZXNlcnZpbmdVbmtub3duRW51bVNlbWFudGljcyhmaWVsZCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgZmllbGQtPmlzX3BhY2tlZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICAvLyBTb21lIGJ5dGVzIGZpZWxkcyBjYW4gYmUgaGFuZGxlZCBvbiBmYXN0IHBhdGguCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTOgorICAgICAgaWYgKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSAhPSBGaWVsZE9wdGlvbnM6OlNUUklORykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoSXNTdHJpbmdJbmxpbmVkKGZpZWxkLCBvcHRpb25zKSkgeworICAgICAgICBHT09HTEVfQ0hFQ0soIWZpZWxkLT5pc19yZXBlYXRlZCgpKTsKKyAgICAgICAgLy8gRm9yIGlubGluZWQgc3RyaW5ncywgdGhlIGRvbmF0aW9uIHN0YXRlIGluZGV4IGlzIHN0b3JlZCBpbiB0aGUKKyAgICAgICAgLy8gYGF1eF9pZHhgIGZpZWxkIG9mIHRoZSBmYXN0IHBhcnNpbmcgaW5mby4gV2UgbmVlZCB0byBjaGVjayB0aGUgcmFuZ2UKKyAgICAgICAgLy8gb2YgdGhhdCB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBhdXhpbGlhcnkgaW5kZXguCisgICAgICAgIGF1eF9pZHggPSBlbnRyeS5pbmxpbmVkX3N0cmluZ19pZHg7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChIYXNIYXNiaXQoZmllbGQpKSB7CisgICAgLy8gVGhlIHRhaWxjYWxsIHBhcnNlciBjYW4gb25seSB1cGRhdGUgdGhlIGZpcnN0IDMyIGhhc2JpdHMuIEZpZWxkcyB3aXRoCisgICAgLy8gaGFzLWJpdHMgYmV5b25kIHRoZSBmaXJzdCAzMiBhcmUgaGFuZGxlZCBieSBtaW5pIHBhcnNpbmcvZmFsbGJhY2suCisgICAgR09PR0xFX0NIRUNLX0dFKGVudHJ5Lmhhc2JpdF9pZHgsIDApIDw8IGZpZWxkLT5EZWJ1Z1N0cmluZygpOworICAgIGlmIChlbnRyeS5oYXNiaXRfaWR4ID49IDMyKSByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJZiB0aGUgZmllbGQgbmVlZHMgYXV4aWxpYXJ5IGRhdGEsIHRoZW4gdGhlIGF1eCBpbmRleCBpcyBuZWVkZWQuIFRoaXMKKyAgLy8gbXVzdCBmaXQgaW4gYSB1aW50OF90LgorICBpZiAoYXV4X2lkeCA+IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gVGhlIGxhcmdlc3QgdGFnIHRoYXQgY2FuIGJlIHJlYWQgYnkgdGhlIHRhaWxjYWxsIHBhcnNlciBpcyB0d28gYnl0ZXMKKyAgLy8gd2hlbiB2YXJpbnQtY29kZWQuIFRoaXMgYWxsb3dzIDE0IGJpdHMgZm9yIHRoZSBudW1lcmljIHRhZyB2YWx1ZToKKyAgLy8gICBieXRlIDAgICBieXRlIDEKKyAgLy8gICAxbm5ubnR0dCAwbm5ubm5ubgorICAvLyAgICBeXl5eXl5eICBeXl5eXl5eCisgIGlmIChmaWVsZC0+bnVtYmVyKCkgPj0gMSA8PCAxMSkgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnZlY3RvcjxUYWlsQ2FsbFRhYmxlSW5mbzo6RmFzdEZpZWxkSW5mbz4gU3BsaXRGYXN0RmllbGRzRm9yU2l6ZSgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxUYWlsQ2FsbFRhYmxlSW5mbzo6RmllbGRFbnRyeUluZm8+JiBmaWVsZF9lbnRyaWVzLAorICAgIGludCB0YWJsZV9zaXplX2xvZzIsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgTWVzc2FnZVNDQ0FuYWx5emVyKiBzY2NfYW5hbHl6ZXIpIHsKKyAgc3RkOjp2ZWN0b3I8VGFpbENhbGxUYWJsZUluZm86OkZhc3RGaWVsZEluZm8+IHJlc3VsdCgxIDw8IHRhYmxlX3NpemVfbG9nMik7CisgIGNvbnN0IHVpbnQzMl90IGlkeF9tYXNrID0gcmVzdWx0LnNpemUoKSAtIDE7CisKKyAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGZpZWxkX2VudHJpZXMpIHsKKyAgICBpZiAoIUlzRmllbGRFbGlnaWJsZUZvckZhc3RQYXJzaW5nKGVudHJ5LCBvcHRpb25zLCBzY2NfYW5hbHl6ZXIpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvKiBmaWVsZCA9IGVudHJ5LmZpZWxkOworICAgIHVpbnQzMl90IHRhZyA9IFdpcmVGb3JtYXQ6Ok1ha2VUYWcoZmllbGQpOworCisgICAgLy8gQ29uc3RydWN0IHRoZSB2YXJpbnQtY29kZWQgdGFnLiBJZiBpdCBpcyBtb3JlIHRoYW4gNyBiaXRzLCB3ZSBuZWVkIHRvCisgICAgLy8gc2hpZnQgdGhlIGhpZ2ggYml0cyBhbmQgYWRkIGEgY29udGludWUgYml0LgorICAgIGlmICh1aW50MzJfdCBoaWJpdHMgPSB0YWcgJiAweEZGRkZGRjgwKSB7CisgICAgICB0YWcgPSB0YWcgKyBoaWJpdHMgKyAxMjg7ICAvLyB0YWcgPSBsb2JpdHMgKyAyKmhpYml0cyArIDEyOAorICAgIH0KKworICAgIC8vIFRoZSBmaWVsZCBpbmRleCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsb3cgYml0cyBvZiB0aGUgZmllbGQgbnVtYmVyLCB3aGVyZQorICAgIC8vIHRoZSB0YWJsZSBzaXplIGRldGVybWluZXMgdGhlIHdpZHRoIG9mIHRoZSBtYXNrLiBUaGUgbGFyZ2VzdCB0YWJsZQorICAgIC8vIHN1cHBvcnRlZCBpcyAzMiBlbnRyaWVzLiBUaGUgcGFyc2UgbG9vcCB1c2VzIHRoZXNlIGJpdHMgZGlyZWN0bHksIHNvIHRoYXQKKyAgICAvLyB0aGUgZGlzcGF0Y2ggZG9lcyBub3QgcmVxdWlyZSBhcml0aG1ldGljOgorICAgIC8vICAgICAgICBieXRlIDAgICBieXRlIDEKKyAgICAvLyAgIHRhZzogMW5ubm50dHQgMG5ubm5ubm4KKyAgICAvLyAgICAgICAgXl5eXl4KKyAgICAvLyAgICAgICAgIGlkeCAodGFibGVfc2l6ZV9sb2cyPTUpCisgICAgLy8gVGhpcyBtZWFucyB0aGF0IGFueSBmaWVsZCBudW1iZXIgdGhhdCBkb2VzIG5vdCBmaXQgaW4gdGhlIGxvd2VyIDQgYml0cworICAgIC8vIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHRvcCBiaXQgb2YgaXRzIHRhYmxlIGluZGV4IGFzc2VydGVkLgorICAgIGNvbnN0IHVpbnQzMl90IGZhc3RfaWR4ID0gKHRhZyA+PiAzKSAmIGlkeF9tYXNrOworCisgICAgVGFpbENhbGxUYWJsZUluZm86OkZhc3RGaWVsZEluZm8mIGluZm8gPSByZXN1bHRbZmFzdF9pZHhdOworICAgIGlmIChpbmZvLmZpZWxkICE9IG51bGxwdHIpIHsKKyAgICAgIC8vIFRoaXMgZmllbGQgZW50cnkgaXMgYWxyZWFkeSBmaWxsZWQuCisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBGaWxsIGluIHRoaXMgZmllbGQncyBlbnRyeToKKyAgICBHT09HTEVfQ0hFQ0soaW5mby5mdW5jX25hbWUuZW1wdHkoKSkgPDwgaW5mby5mdW5jX25hbWU7CisgICAgaW5mby5mdW5jX25hbWUgPSBGaWVsZFBhcnNlRnVuY3Rpb25OYW1lKGVudHJ5LCBvcHRpb25zKTsKKyAgICBpbmZvLmZpZWxkID0gZmllbGQ7CisgICAgaW5mby5jb2RlZF90YWcgPSB0YWc7CisgICAgLy8gSWYgdGhpcyBmaWVsZCBkb2VzIG5vdCBoYXZlIHByZXNlbmNlLCB0aGVuIGl0IGNhbiBzZXQgYW4gb3V0LW9mLWJvdW5kcworICAgIC8vIGJpdCAodGFpbGNhbGwgcGFyc2luZyB1c2VzIGEgdWludDY0X3QgZm9yIGhhc2JpdHMsIGJ1dCBvbmx5IHN0b3JlcyAzMikuCisgICAgaW5mby5oYXNiaXRfaWR4ID0gSGFzSGFzYml0KGZpZWxkKSA/IGVudHJ5Lmhhc2JpdF9pZHggOiA2MzsKKyAgICBpZiAoSXNTdHJpbmdJbmxpbmVkKGZpZWxkLCBvcHRpb25zKSkgeworICAgICAgR09PR0xFX0NIRUNLKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSk7CisgICAgICBpbmZvLmF1eF9pZHggPSBzdGF0aWNfY2FzdDx1aW50OF90PihlbnRyeS5pbmxpbmVkX3N0cmluZ19pZHgpOworICAgIH0gZWxzZSB7CisgICAgICBpbmZvLmF1eF9pZHggPSBzdGF0aWNfY2FzdDx1aW50OF90PihlbnRyeS5hdXhfaWR4KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gRmlsdGVyIG91dCBmaWVsZHMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgYnkgbWluaSBwYXJzaW5nLgorc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gRmlsdGVyTWluaVBhcnNlZEZpZWxkcygKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgZmllbGRzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKSB7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGdlbmVyYXRlZF9mYWxsYmFja19maWVsZHM7CisKKyAgZm9yIChjb25zdCBhdXRvKiBmaWVsZCA6IGZpZWxkcykgeworICAgIGJvb2wgaGFuZGxlZCA9IGZhbHNlOworICAgIHN3aXRjaCAoZmllbGQtPnR5cGUoKSkgeworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQ6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0OgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzI6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQ6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQ6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NDoKKyAgICAgICAgLy8gVGhlc2UgYXJlIGhhbmRsZWQgYnkgTWluaVBhcnNlLCBzbyB3ZSBkb24ndCBuZWVkIGFueSBnZW5lcmF0ZWQKKyAgICAgICAgLy8gZmFsbGJhY2sgY29kZS4KKyAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOgorICAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgIUhhc1ByZXNlcnZpbmdVbmtub3duRW51bVNlbWFudGljcyhmaWVsZCkpIHsKKyAgICAgICAgICAvLyBUT0RPKGIvMjA2ODkwMTcxKTogaGFuZGxlIHBhY2tlZCByZXBlYXRlZCBjbG9zZWQgZW51bXMKKyAgICAgICAgICAvLyBOb24tcGFja2VkIHJlcGVhdGVkIGNhbiBiZSBoYW5kbGVkIHVzaW5nIHRhYmxlcywgYnV0IHdlIHN0aWxsCisgICAgICAgICAgLy8gbmVlZCB0byBnZW5lcmF0ZSBmYWxsYmFjayBjb2RlIGZvciBhbGwgcmVwZWF0ZWQgZW51bXMgaW4gb3JkZXIgdG8KKyAgICAgICAgICAvLyBoYW5kbGUgcGFja2VkIGVuY29kaW5nLiBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIGxpdGUvZnVsbCBzcGxpdAorICAgICAgICAgIC8vIHdoZW4gaGFuZGxpbmcgaW52YWxpZCBlbnVtIHZhbHVlcyBpbiBhIHBhY2tlZCBmaWVsZC4KKyAgICAgICAgICBoYW5kbGVkID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAoSXNTdHJpbmdJbmxpbmVkKGZpZWxkLCBvcHRpb25zKSkgeworICAgICAgICAgIC8vIFRPRE8oYi8xOTgyMTE4OTcpOiBzdXBwb3J0IEluaWxuZWRTdHJpbmdGaWVsZC4KKyAgICAgICAgICBoYW5kbGVkID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICAgICAgLy8gVE9ETyhiLzIxMDc2MjgxNik6IHN1cHBvcnQgcmVtYWluaW5nIGZpZWxkIHR5cGVzLgorICAgICAgICBpZiAoZmllbGQtPmlzX21hcCgpIHx8IElzV2VhayhmaWVsZCwgb3B0aW9ucykgfHwKKyAgICAgICAgICAgIElzSW1wbGljaXRXZWFrRmllbGQoZmllbGQsIG9wdGlvbnMsIHNjY19hbmFseXplcikgfHwKKyAgICAgICAgICAgIElzTGF6eShmaWVsZCwgb3B0aW9ucywgc2NjX2FuYWx5emVyKSkgeworICAgICAgICAgIGhhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaGFuZGxlZCA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFoYW5kbGVkKSBnZW5lcmF0ZWRfZmFsbGJhY2tfZmllbGRzLnB1c2hfYmFjayhmaWVsZCk7CisgIH0KKworICByZXR1cm4gZ2VuZXJhdGVkX2ZhbGxiYWNrX2ZpZWxkczsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK1RhaWxDYWxsVGFibGVJbmZvOjpUYWlsQ2FsbFRhYmxlSW5mbygKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+JiBvcmRlcmVkX2ZpZWxkcywKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBoYXNfYml0X2luZGljZXMsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaW5saW5lZF9zdHJpbmdfaW5kaWNlcywKKyAgICBNZXNzYWdlU0NDQW5hbHl6ZXIqIHNjY19hbmFseXplcikgeworICBpbnQgb25lb2ZfY291bnQgPSBkZXNjcmlwdG9yLT5yZWFsX29uZW9mX2RlY2xfY291bnQoKTsKKyAgLy8gSWYgdGhpcyBtZXNzYWdlIGhhcyBhbnkgb25lb2YgZmllbGRzLCBzdG9yZSB0aGUgY2FzZSBvZmZzZXQgaW4gdGhlIGZpcnN0CisgIC8vIGF1eGlsaWFyeSBlbnRyeS4KKyAgaWYgKG9uZW9mX2NvdW50ID4gMCkgeworICAgIEdPT0dMRV9MT0dfSUYoREZBVEFMLCBvcmRlcmVkX2ZpZWxkcy5lbXB0eSgpKQorICAgICAgICA8PCAiSW52YWxpZCBtZXNzYWdlOiAiIDw8IGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpIDw8ICIgaGFzICIKKyAgICAgICAgPDwgb25lb2ZfY291bnQgPDwgIiBvbmVvZiBkZWNsYXJhdGlvbnMsIGJ1dCBubyBmaWVsZHMiOworICAgIGF1eF9lbnRyaWVzLnB1c2hfYmFjayhTdHJDYXQoIl9mbDo6T2Zmc2V0e29mZnNldG9mKCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWUoZGVzY3JpcHRvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBfaW1wbF8uX29uZW9mX2Nhc2VfKX0iKSk7CisgIH0KKworICAvLyBJZiB0aGlzIG1lc3NhZ2UgaGFzIGFueSBpbmxpbmVkIHN0cmluZyBmaWVsZHMsIHN0b3JlIHRoZSBkb25hdGlvbiBzdGF0ZQorICAvLyBvZmZzZXQgaW4gdGhlIHNlY29uZCBhdXhpbGlhcnkgZW50cnkuCisgIGlmICghaW5saW5lZF9zdHJpbmdfaW5kaWNlcy5lbXB0eSgpKSB7CisgICAgYXV4X2VudHJpZXMucmVzaXplKDIpOyAgLy8gcGFkIGlmIG5lY2Vzc2FyeQorICAgIGF1eF9lbnRyaWVzWzFdID0KKyAgICAgICAgU3RyQ2F0KCJfZmw6Ok9mZnNldHtvZmZzZXRvZigiLCBDbGFzc05hbWUoZGVzY3JpcHRvciksCisgICAgICAgICAgICAgICAgICAgICAiLCBfaW1wbF8uX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfKX0iKTsKKyAgfQorCisgIC8vIEZpbGwgaW4gbWluaSB0YWJsZSBlbnRyaWVzLgorICBmb3IgKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgOiBvcmRlcmVkX2ZpZWxkcykgeworICAgIGZpZWxkX2VudHJpZXMucHVzaF9iYWNrKAorICAgICAgICB7ZmllbGQsIChIYXNIYXNiaXQoZmllbGQpID8gaGFzX2JpdF9pbmRpY2VzW2ZpZWxkLT5pbmRleCgpXSA6IC0xKX0pOworICAgIGF1dG8mIGVudHJ5ID0gZmllbGRfZW50cmllcy5iYWNrKCk7CisKKyAgICBpZiAoZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSB8fAorICAgICAgICBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgeworICAgICAgLy8gTWVzc2FnZS10eXBlZCBmaWVsZHMgaGF2ZSBhIEZpZWxkQXV4IHdpdGggdGhlIGRlZmF1bHQgaW5zdGFuY2UgcG9pbnRlci4KKyAgICAgIGlmIChmaWVsZC0+aXNfbWFwKCkpIHsKKyAgICAgICAgLy8gVE9ETyhiLzIwNTkwNDc3MCk6IGdlbmVyYXRlIGF1eCBlbnRyaWVzIGZvciBtYXBzCisgICAgICB9IGVsc2UgaWYgKElzV2VhayhmaWVsZCwgb3B0aW9ucykpIHsKKyAgICAgICAgLy8gRG9uJ3QgZ2VuZXJhdGUgYW55dGhpbmcgZm9yIHdlYWsgZmllbGRzLiBUaGV5IGFyZSBoYW5kbGVkIGJ5IHRoZQorICAgICAgICAvLyBnZW5lcmF0ZWQgZmFsbGJhY2suCisgICAgICB9IGVsc2UgaWYgKElzSW1wbGljaXRXZWFrRmllbGQoZmllbGQsIG9wdGlvbnMsIHNjY19hbmFseXplcikpIHsKKyAgICAgICAgLy8gSW1wbGljaXQgd2VhayBmaWVsZHMgZG9uJ3QgbmVlZCB0byBzdG9yZSBhIGRlZmF1bHQgaW5zdGFuY2UgcG9pbnRlci4KKyAgICAgIH0gZWxzZSBpZiAoSXNMYXp5KGZpZWxkLCBvcHRpb25zLCBzY2NfYW5hbHl6ZXIpKSB7CisgICAgICAgIC8vIExhenkgZmllbGRzIGFyZSBoYW5kbGVkIGJ5IHRoZSBnZW5lcmF0ZWQgZmFsbGJhY2sgZnVuY3Rpb24uCisgICAgICB9IGVsc2UgeworICAgICAgICBmaWVsZF9lbnRyaWVzLmJhY2soKS5hdXhfaWR4ID0gYXV4X2VudHJpZXMuc2l6ZSgpOworICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBmaWVsZF90eXBlID0gZmllbGQtPm1lc3NhZ2VfdHlwZSgpOworICAgICAgICBhdXhfZW50cmllcy5wdXNoX2JhY2soU3RyQ2F0KAorICAgICAgICAgICAgInJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgIiwgUXVhbGlmaWVkQ2xhc3NOYW1lKGZpZWxkX3R5cGUsIG9wdGlvbnMpLAorICAgICAgICAgICAgIio+KCYiLCBRdWFsaWZpZWREZWZhdWx0SW5zdGFuY2VOYW1lKGZpZWxkX3R5cGUsIG9wdGlvbnMpLCAiKSIpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU0gJiYKKyAgICAgICAgICAgICAgICFIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoZmllbGQpKSB7CisgICAgICAvLyBFbnVtIGZpZWxkcyB3aGljaCBwcmVzZXJ2ZSB1bmtub3duIHZhbHVlcyAocHJvdG8zIGJlaGF2aW9yKSBhcmUKKyAgICAgIC8vIGVmZmVjdGl2ZWx5IGludDMyIGZpZWxkcyB3aXRoIHJlc3BlY3QgdG8gcGFyc2luZyAtLSBpLmUuLCB0aGUgdmFsdWUKKyAgICAgIC8vIGRvZXMgbm90IG5lZWQgdG8gYmUgdmFsaWRhdGVkIGF0IHBhcnNlIHRpbWUuCisgICAgICAvLworICAgICAgLy8gRW51bSBmaWVsZHMgd2hpY2ggZG8gbm90IHByZXNlcnZlIHVua25vd24gdmFsdWVzIChwcm90bzIgYmVoYXZpb3IpIHVzZQorICAgICAgLy8gYSBGaWVsZEF1eCB0byBzdG9yZSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLiBJZiB0aGUgZW51bSB2YWx1ZXMgYXJlCisgICAgICAvLyBzZXF1ZW50aWFsIChhbmQgd2l0aGluIGEgcmFuZ2Ugd2UgY2FuIHJlcHJlc2VudCksIHRoZW4gdGhlIEZpZWxkQXV4CisgICAgICAvLyBlbnRyeSByZXByZXNlbnRzIHRoZSByYW5nZSB1c2luZyB0aGUgbWluaW11bSB2YWx1ZSAod2hpY2ggbXVzdCBmaXQgaW4KKyAgICAgIC8vIGFuIGludDE2X3QpIGFuZCBjb3VudCAoYSB1aW50MTZfdCkuIE90aGVyd2lzZSwgdGhlIGVudHJ5IGhvbGRzIGEKKyAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIGdlbmVyYXRlZCBOYW1lX0lzVmFsaWQgZnVuY3Rpb24uCisKKyAgICAgIGVudHJ5LmF1eF9pZHggPSBhdXhfZW50cmllcy5zaXplKCk7CisgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlID0gZmllbGQtPmVudW1fdHlwZSgpOworICAgICAgR09PR0xFX0NIRUNLX0dUKGVudW1fdHlwZS0+dmFsdWVfY291bnQoKSwgMCkgPDwgZW51bV90eXBlLT5EZWJ1Z1N0cmluZygpOworCisgICAgICAvLyBDaGVjayBpZiB0aGUgZW51bSB2YWx1ZXMgYXJlIGEgc2luZ2xlLCBjb250aWd1b3VzIHJhbmdlLgorICAgICAgc3RkOjp2ZWN0b3I8aW50PiBlbnVtX3ZhbHVlczsKKyAgICAgIGZvciAoaW50IGkgPSAwLCBOID0gZW51bV90eXBlLT52YWx1ZV9jb3VudCgpOyBpIDwgTjsgKytpKSB7CisgICAgICAgIGVudW1fdmFsdWVzLnB1c2hfYmFjayhlbnVtX3R5cGUtPnZhbHVlKGkpLT5udW1iZXIoKSk7CisgICAgICB9CisgICAgICBhdXRvIHZhbHVlc19iZWdpbiA9IGVudW1fdmFsdWVzLmJlZ2luKCk7CisgICAgICBhdXRvIHZhbHVlc19lbmQgPSBlbnVtX3ZhbHVlcy5lbmQoKTsKKyAgICAgIHN0ZDo6c29ydCh2YWx1ZXNfYmVnaW4sIHZhbHVlc19lbmQpOworICAgICAgZW51bV92YWx1ZXMuZXJhc2Uoc3RkOjp1bmlxdWUodmFsdWVzX2JlZ2luLCB2YWx1ZXNfZW5kKSwgdmFsdWVzX2VuZCk7CisKKyAgICAgIGlmIChlbnVtX3ZhbHVlcy5iYWNrKCkgLSBlbnVtX3ZhbHVlc1swXSA9PSBlbnVtX3ZhbHVlcy5zaXplKCkgLSAxICYmCisgICAgICAgICAgZW51bV92YWx1ZXNbMF0gPj0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWluKCkgJiYKKyAgICAgICAgICBlbnVtX3ZhbHVlc1swXSA8PSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgoKSAmJgorICAgICAgICAgIGVudW1fdmFsdWVzLnNpemUoKSA8PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KCkpIHsKKyAgICAgICAgZW50cnkuaXNfZW51bV9yYW5nZSA9IHRydWU7CisgICAgICAgIGF1eF9lbnRyaWVzLnB1c2hfYmFjaygKKyAgICAgICAgICAgIFN0ckNhdChlbnVtX3ZhbHVlc1swXSwgIiwgIiwgZW51bV92YWx1ZXMuc2l6ZSgpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbnRyeS5pc19lbnVtX3JhbmdlID0gZmFsc2U7CisgICAgICAgIGF1eF9lbnRyaWVzLnB1c2hfYmFjaygKKyAgICAgICAgICAgIFN0ckNhdChRdWFsaWZpZWRDbGFzc05hbWUoZW51bV90eXBlLCBvcHRpb25zKSwgIl9Jc1ZhbGlkIikpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoKGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyB8fAorICAgICAgICAgICAgICAgIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTKSAmJgorICAgICAgICAgICAgICAgSXNTdHJpbmdJbmxpbmVkKGZpZWxkLCBvcHRpb25zKSkgeworICAgICAgR09PR0xFX0NIRUNLKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSk7CisgICAgICAvLyBJbmxpbmVkIHN0cmluZ3MgaGF2ZSBhbiBleHRyYSBtYXJrZXIgdG8gcmVwcmVzZW50IHRoZWlyIGRvbmF0aW9uIHN0YXRlLgorICAgICAgaW50IGlkeCA9IGlubGluZWRfc3RyaW5nX2luZGljZXNbZmllbGQtPmluZGV4KCldOworICAgICAgLy8gRm9yIG1pbmkgcGFyc2luZywgdGhlIGRvbmF0aW9uIHN0YXRlIGluZGV4IGlzIHN0b3JlZCBhcyBhbiBgb2Zmc2V0YAorICAgICAgLy8gYXV4aWxpYXJ5IGVudHJ5LgorICAgICAgZW50cnkuYXV4X2lkeCA9IGF1eF9lbnRyaWVzLnNpemUoKTsKKyAgICAgIGF1eF9lbnRyaWVzLnB1c2hfYmFjayhTdHJDYXQoIl9mbDo6T2Zmc2V0eyIsIGlkeCwgIn0iKSk7CisgICAgICAvLyBGb3IgZmFzdCB0YWJsZSBwYXJzaW5nLCB0aGUgZG9uYXRpb24gc3RhdGUgaW5kZXggaXMgc3RvcmVkIGluc3RlYWQgb2YKKyAgICAgIC8vIHRoZSBhdXhfaWR4ICh0aGlzIHdpbGwgbGltaXQgdGhlIHJhbmdlIHRvIDggYml0cykuCisgICAgICBlbnRyeS5pbmxpbmVkX3N0cmluZ19pZHggPSBpZHg7CisgICAgfQorICB9CisKKyAgLy8gQ2hvb3NlIHRoZSBzbWFsbGVzdCBmYXN0IHRhYmxlIHRoYXQgY292ZXJzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWVsZHMuCisgIHRhYmxlX3NpemVfbG9nMiA9IDA7ICAvLyBmYWxsYmFjayB2YWx1ZQorICBpbnQgbnVtX2Zhc3RfZmllbGRzID0gLTE7CisgIGZvciAoaW50IHRyeV9zaXplX2xvZzIgOiB7MCwgMSwgMiwgMywgNCwgNX0pIHsKKyAgICBzaXplX3QgdHJ5X3NpemUgPSAxIDw8IHRyeV9zaXplX2xvZzI7CisgICAgYXV0byBzcGxpdF9maWVsZHMgPSBTcGxpdEZhc3RGaWVsZHNGb3JTaXplKGZpZWxkX2VudHJpZXMsIHRyeV9zaXplX2xvZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsIHNjY19hbmFseXplcik7CisgICAgR09PR0xFX0NIRUNLX0VRKHNwbGl0X2ZpZWxkcy5zaXplKCksIHRyeV9zaXplKTsKKyAgICBpbnQgdHJ5X251bV9mYXN0X2ZpZWxkcyA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvJiBpbmZvIDogc3BsaXRfZmllbGRzKSB7CisgICAgICBpZiAoaW5mby5maWVsZCAhPSBudWxscHRyKSArK3RyeV9udW1fZmFzdF9maWVsZHM7CisgICAgfQorICAgIC8vIFVzZSB0aGlzIHNpemUgaWYgKGFuZCBvbmx5IGlmKSBpdCBjb3ZlcnMgbW9yZSBmaWVsZHMuCisgICAgaWYgKHRyeV9udW1fZmFzdF9maWVsZHMgPiBudW1fZmFzdF9maWVsZHMpIHsKKyAgICAgIGZhc3RfcGF0aF9maWVsZHMgPSBzdGQ6Om1vdmUoc3BsaXRfZmllbGRzKTsKKyAgICAgIHRhYmxlX3NpemVfbG9nMiA9IHRyeV9zaXplX2xvZzI7CisgICAgICBudW1fZmFzdF9maWVsZHMgPSB0cnlfbnVtX2Zhc3RfZmllbGRzOworICAgIH0KKyAgICAvLyBUaGUgbGFyZ2VzdCB0YWJsZSB3ZSBhbGxvdyBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIGVudHJpZXMgYXMgdGhlIG1lc3NhZ2UKKyAgICAvLyBoYXMgZmllbGRzLCByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IHBvd2VyIG9mIDIgKGUuZy4sIGEgbWVzc2FnZSB3aXRoIDUKKyAgICAvLyBmaWVsZHMgY2FuIGhhdmUgYSBmYXN0IHRhYmxlIG9mIHNpemUgOCkuIEEgbGFyZ2VyIHRhYmxlICptaWdodCogY292ZXIKKyAgICAvLyBtb3JlIGZpZWxkcyBpbiBjZXJ0YWluIGNhc2VzLCBidXQgYSBsYXJnZXIgdGFibGUgaW4gdGhhdCBjYXNlIHdvdWxkIGhhdmUKKyAgICAvLyBtb3N0bHkgZW1wdHkgZW50cmllczsgc28sIHdlIGNhcCB0aGUgc2l6ZSB0byBhdm9pZCBwYXRob2xvZ2ljYWxseSBzcGFyc2UKKyAgICAvLyB0YWJsZXMuCisgICAgaWYgKHRyeV9zaXplID4gb3JkZXJlZF9maWVsZHMuc2l6ZSgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBGaWx0ZXIgb3V0IGZpZWxkcyB0aGF0IGFyZSBoYW5kbGVkIGJ5IE1pbmlQYXJzZS4gV2UgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZQorICAvLyBhIGZhbGxiYWNrIGZvciB0aGVzZSwgd2hpY2ggc2F2ZXMgY29kZSBzaXplLgorICBmYWxsYmFja19maWVsZHMgPSBGaWx0ZXJNaW5pUGFyc2VkRmllbGRzKG9yZGVyZWRfZmllbGRzLCBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjY19hbmFseXplcik7CisKKyAgLy8gSWYgdGhlcmUgYXJlIG5vIGZhbGxiYWNrIGZpZWxkcywgYW5kIGF0IG1vc3Qgb25lIGV4dGVuc2lvbiByYW5nZSwgdGhlCisgIC8vIHBhcnNlciBjYW4gdXNlIGEgZ2VuZXJpYyBmYWxsYmFjayBmdW5jdGlvbi4gT3RoZXJ3aXNlLCBhIG1lc3NhZ2Utc3BlY2lmaWMKKyAgLy8gZmFsbGJhY2sgcm91dGluZSBpcyBuZWVkZWQuCisgIHVzZV9nZW5lcmF0ZWRfZmFsbGJhY2sgPQorICAgICAgIWZhbGxiYWNrX2ZpZWxkcy5lbXB0eSgpIHx8IGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMTsKK30KKworUGFyc2VGdW5jdGlvbkdlbmVyYXRvcjo6UGFyc2VGdW5jdGlvbkdlbmVyYXRvcigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWF4X2hhc19iaXRfaW5kZXgsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaGFzX2JpdF9pbmRpY2VzLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlubGluZWRfc3RyaW5nX2luZGljZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgTWVzc2FnZVNDQ0FuYWx5emVyKiBzY2NfYW5hbHl6ZXIsCisgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdmFycykKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgICAgc2NjX2FuYWx5emVyXyhzY2NfYW5hbHl6ZXIpLAorICAgICAgb3B0aW9uc18ob3B0aW9ucyksCisgICAgICB2YXJpYWJsZXNfKHZhcnMpLAorICAgICAgaW5saW5lZF9zdHJpbmdfaW5kaWNlc18oaW5saW5lZF9zdHJpbmdfaW5kaWNlcyksCisgICAgICBvcmRlcmVkX2ZpZWxkc18oR2V0T3JkZXJlZEZpZWxkcyhkZXNjcmlwdG9yXywgb3B0aW9uc18pKSwKKyAgICAgIG51bV9oYXNiaXRzXyhtYXhfaGFzX2JpdF9pbmRleCkgeworICBpZiAoc2hvdWxkX2dlbmVyYXRlX3RjdGFibGUoKSkgeworICAgIHRjX3RhYmxlX2luZm9fLnJlc2V0KG5ldyBUYWlsQ2FsbFRhYmxlSW5mbygKKyAgICAgICAgZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCBvcmRlcmVkX2ZpZWxkc18sIGhhc19iaXRfaW5kaWNlcywKKyAgICAgICAgaW5saW5lZF9zdHJpbmdfaW5kaWNlcywgc2NjX2FuYWx5emVyKSk7CisgIH0KKyAgU2V0Q29tbW9uVmFycyhvcHRpb25zXywgJnZhcmlhYmxlc18pOworICBTZXRDb21tb25NZXNzYWdlRGF0YVZhcmlhYmxlcyhkZXNjcmlwdG9yXywgJnZhcmlhYmxlc18pOworICBTZXRVbmtub3duRmllbGRzVmFyaWFibGUoZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCAmdmFyaWFibGVzXyk7CisgIHZhcmlhYmxlc19bImNsYXNzbmFtZSJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3IsIGZhbHNlKTsKK30KKwordm9pZCBQYXJzZUZ1bmN0aW9uR2VuZXJhdG9yOjpHZW5lcmF0ZU1ldGhvZERlY2xzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChzaG91bGRfZ2VuZXJhdGVfdGN0YWJsZSgpKSB7CisgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICBpZiAoc2hvdWxkX2dlbmVyYXRlX2d1YXJkZWRfdGN0YWJsZSgpKSB7CisgICAgICBmb3JtYXQoIiNpZmRlZiBQUk9UT0JVRl9UQUlMX0NBTExfVEFCTEVfUEFSU0VSX0VOQUJMRURcbiIpOworICAgIH0KKyAgICBmb3JtYXQoCisgICAgICAgICIgcHJpdmF0ZTpcbiIKKyAgICAgICAgIiAgc3RhdGljIGNvbnN0IGNoYXIqIFRjdF9QYXJzZUZhbGxiYWNrKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpO1xuIgorICAgICAgICAiIHB1YmxpYzpcbiIpOworICAgIGlmIChzaG91bGRfZ2VuZXJhdGVfZ3VhcmRlZF90Y3RhYmxlKCkpIHsKKyAgICAgIGZvcm1hdCgiI2VuZGlmXG4iKTsKKyAgICB9CisgICAgZm9ybWF0LkluZGVudCgpOworICB9CisgIGZvcm1hdCgKKyAgICAgICJjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsICIKKyAgICAgICI6OiRwcm90b19ucyQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7XG4iKTsKK30KKwordm9pZCBQYXJzZUZ1bmN0aW9uR2VuZXJhdG9yOjpHZW5lcmF0ZU1ldGhvZEltcGxzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGJvb2wgbmVlZF9wYXJzZV9mdW5jdGlvbiA9IHRydWU7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICAvLyBTcGVjaWFsLWNhc2UgTWVzc2FnZVNldC4KKyAgICBuZWVkX3BhcnNlX2Z1bmN0aW9uID0gZmFsc2U7CisgICAgZm9ybWF0KAorICAgICAgICAiY29uc3QgY2hhciogJGNsYXNzbmFtZSQ6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0cixcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHtcbiIKKyAgICAgICAgIiRhbm5vdGF0ZV9kZXNlcmlhbGl6ZSQiKTsKKyAgICBpZiAoIW9wdGlvbnNfLnVudmVyaWZpZWRfbGF6eV9tZXNzYWdlX3NldHMgJiYKKyAgICAgICAgU2hvdWxkVmVyaWZ5KGRlc2NyaXB0b3JfLCBvcHRpb25zXywgc2NjX2FuYWx5emVyXykpIHsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAiICBjdHgtPnNldF9sYXp5X2VhZ2VyX3ZlcmlmeV9mdW5jKCYkY2xhc3NuYW1lJDo6SW50ZXJuYWxWZXJpZnkpO1xuIik7CisgICAgfQorICAgIGZvcm1hdCgKKyAgICAgICAgIiAgcmV0dXJuICRleHRlbnNpb25zJC5QYXJzZU1lc3NhZ2VTZXQocHRyLCBcbiIKKyAgICAgICAgIiAgICAgIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgJl9pbnRlcm5hbF9tZXRhZGF0YV8sIGN0eCk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQorICBpZiAoIXNob3VsZF9nZW5lcmF0ZV90Y3RhYmxlKCkpIHsKKyAgICBpZiAobmVlZF9wYXJzZV9mdW5jdGlvbikgeworICAgICAgR2VuZXJhdGVMb29waW5nUGFyc2VGdW5jdGlvbihmb3JtYXQpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHNob3VsZF9nZW5lcmF0ZV9ndWFyZGVkX3RjdGFibGUoKSkgeworICAgIGZvcm1hdCgiI2lmZGVmIFBST1RPQlVGX1RBSUxfQ0FMTF9UQUJMRV9QQVJTRVJfRU5BQkxFRFxuXG4iKTsKKyAgfQorICBpZiAobmVlZF9wYXJzZV9mdW5jdGlvbikgeworICAgIEdlbmVyYXRlVGFpbGNhbGxQYXJzZUZ1bmN0aW9uKGZvcm1hdCk7CisgIH0KKyAgaWYgKHRjX3RhYmxlX2luZm9fLT51c2VfZ2VuZXJhdGVkX2ZhbGxiYWNrKSB7CisgICAgR2VuZXJhdGVUYWlsY2FsbEZhbGxiYWNrRnVuY3Rpb24oZm9ybWF0KTsKKyAgfQorICBpZiAoc2hvdWxkX2dlbmVyYXRlX2d1YXJkZWRfdGN0YWJsZSgpKSB7CisgICAgaWYgKG5lZWRfcGFyc2VfZnVuY3Rpb24pIHsKKyAgICAgIGZvcm1hdCgiXG4jZWxzZSAgLy8gUFJPVE9CVUZfVEFJTF9DQUxMX1RBQkxFX1BBUlNFUl9FTkFCTEVEXG5cbiIpOworICAgICAgR2VuZXJhdGVMb29waW5nUGFyc2VGdW5jdGlvbihmb3JtYXQpOworICAgIH0KKyAgICBmb3JtYXQoIlxuI2VuZGlmICAvLyBQUk9UT0JVRl9UQUlMX0NBTExfVEFCTEVfUEFSU0VSX0VOQUJMRURcbiIpOworICB9Cit9CisKK2Jvb2wgUGFyc2VGdW5jdGlvbkdlbmVyYXRvcjo6c2hvdWxkX2dlbmVyYXRlX3RjdGFibGUoKSBjb25zdCB7CisgIGlmIChvcHRpb25zXy50Y3RhYmxlX21vZGUgPT0gT3B0aW9uczo6a1RDVGFibGVOZXZlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBQYXJzZUZ1bmN0aW9uR2VuZXJhdG9yOjpHZW5lcmF0ZVRhaWxjYWxsUGFyc2VGdW5jdGlvbihGb3JtYXR0ZXImIGZvcm1hdCkgeworICBHT09HTEVfQ0hFQ0soc2hvdWxkX2dlbmVyYXRlX3RjdGFibGUoKSk7CisKKyAgLy8gR2VuZXJhdGUgYW4gYF9JbnRlcm5hbFBhcnNlYCB0aGF0IHN0YXJ0cyB0aGUgdGFpbC1jYWxsaW5nIGxvb3AuCisgIGZvcm1hdCgKKyAgICAgICJjb25zdCBjaGFyKiAkY2xhc3NuYW1lJDo6X0ludGVybmFsUGFyc2UoXG4iCisgICAgICAiICAgIGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkge1xuIgorICAgICAgIiRhbm5vdGF0ZV9kZXNlcmlhbGl6ZSQiCisgICAgICAiICBwdHIgPSA6Ol9wYmk6OlRjUGFyc2VyOjpQYXJzZUxvb3AodGhpcywgcHRyLCBjdHgsICIKKyAgICAgICImX3RhYmxlXy5oZWFkZXIpO1xuIik7CisgIGZvcm1hdCgKKyAgICAgICIgIHJldHVybiBwdHI7XG4iCisgICAgICAifVxuXG4iKTsKK30KKwordm9pZCBQYXJzZUZ1bmN0aW9uR2VuZXJhdG9yOjpHZW5lcmF0ZVRhaWxjYWxsRmFsbGJhY2tGdW5jdGlvbigKKyAgICBGb3JtYXR0ZXImIGZvcm1hdCkgeworICBHT09HTEVfQ0hFQ0soc2hvdWxkX2dlbmVyYXRlX3RjdGFibGUoKSk7CisgIGZvcm1hdCgKKyAgICAgICJjb25zdCBjaGFyKiAkY2xhc3NuYW1lJDo6VGN0X1BhcnNlRmFsbGJhY2soUFJPVE9CVUZfVENfUEFSQU1fREVDTCkge1xuIgorICAgICAgIiNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgcmV0dXJuIG51bGxwdHJcbiIpOworICBmb3JtYXQuSW5kZW50KCk7CisgIGZvcm1hdCgiYXV0byogdHlwZWRfbXNnID0gc3RhdGljX2Nhc3Q8JGNsYXNzbmFtZSQqPihtc2cpO1xuIik7CisKKyAgaWYgKG51bV9oYXNiaXRzXyA+IDApIHsKKyAgICAvLyBTeW5jIGhhc2JpdHMKKyAgICBmb3JtYXQoInR5cGVkX21zZy0+X2ltcGxfLl9oYXNfYml0c19bMF0gPSBoYXNiaXRzO1xuIik7CisgIH0KKyAgZm9ybWF0KCJ1aW50MzJfdCB0YWcgPSBkYXRhLnRhZygpO1xuIik7CisKKyAgZm9ybWF0LlNldCgibXNnIiwgInR5cGVkX21zZy0+Iik7CisgIGZvcm1hdC5TZXQoInRoaXMiLCAidHlwZWRfbXNnIik7CisgIGZvcm1hdC5TZXQoImhhc19iaXRzIiwgInR5cGVkX21zZy0+X2ltcGxfLl9oYXNfYml0c18iKTsKKyAgZm9ybWF0LlNldCgibmV4dF90YWciLCAiZ290byBuZXh0X3RhZyIpOworICBHZW5lcmF0ZVBhcnNlSXRlcmF0aW9uQm9keShmb3JtYXQsIGRlc2NyaXB0b3JfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y190YWJsZV9pbmZvXy0+ZmFsbGJhY2tfZmllbGRzKTsKKworICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoCisgICAgICAibmV4dF90YWc6XG4iCisgICAgICAibWVzc2FnZV9kb25lOlxuIgorICAgICAgIiAgcmV0dXJuIHB0cjtcbiIKKyAgICAgICIjdW5kZWYgQ0hLX1xuIgorICAgICAgIn1cbiIpOworfQorCitzdHJ1Y3QgU2tpcEVudHJ5MTYgeworICB1aW50MTZfdCBza2lwbWFwOworICB1aW50MTZfdCBmaWVsZF9lbnRyeV9vZmZzZXQ7Cit9Oworc3RydWN0IFNraXBFbnRyeUJsb2NrIHsKKyAgdWludDMyX3QgZmlyc3RfZm51bTsKKyAgc3RkOjp2ZWN0b3I8U2tpcEVudHJ5MTY+IGVudHJpZXM7Cit9Oworc3RydWN0IE51bVRvRW50cnlUYWJsZSB7CisgIHVpbnQzMl90IHNraXBtYXAzMjsgIC8vIGZvciBmaWVsZHMgIzEgLSAjMzIKKyAgc3RkOjp2ZWN0b3I8U2tpcEVudHJ5QmxvY2s+IGJsb2NrczsKKyAgLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHVpbnQxNl90IHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGlzIHRhYmxlLgorICBpbnQgc2l6ZTE2KCkgY29uc3QgeworICAgIGludCBzaXplID0gMjsgIC8vIGZvciB0aGUgdGVybWluYXRpb24gZmllbGQjCisgICAgZm9yIChjb25zdCBhdXRvJiBibG9jayA6IGJsb2NrcykgeworICAgICAgLy8gMiBmb3IgdGhlIGZpZWxkIywgMSBmb3IgYSBjb3VudCBvZiBza2lwIGVudHJpZXMsIDIgZm9yIGVhY2ggZW50cnkuCisgICAgICBzaXplICs9IDMgKyBibG9jay5lbnRyaWVzLnNpemUoKSAqIDI7CisgICAgfQorICAgIHJldHVybiBzaXplOworICB9Cit9OworCitzdGF0aWMgTnVtVG9FbnRyeVRhYmxlIE1ha2VOdW1Ub0VudHJ5VGFibGUoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGZpZWxkX2Rlc2NyaXB0b3JzKTsKKwordm9pZCBQYXJzZUZ1bmN0aW9uR2VuZXJhdG9yOjpHZW5lcmF0ZURhdGFEZWNscyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoIXNob3VsZF9nZW5lcmF0ZV90Y3RhYmxlKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgaWYgKHNob3VsZF9nZW5lcmF0ZV9ndWFyZGVkX3RjdGFibGUoKSkgeworICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgZm9ybWF0KCIjaWZkZWYgUFJPVE9CVUZfVEFJTF9DQUxMX1RBQkxFX1BBUlNFUl9FTkFCTEVEXG4iKTsKKyAgICBmb3JtYXQuSW5kZW50KCk7CisgIH0KKyAgYXV0byBmaWVsZF9udW1fdG9fZW50cnlfdGFibGUgPSBNYWtlTnVtVG9FbnRyeVRhYmxlKG9yZGVyZWRfZmllbGRzXyk7CisgIGZvcm1hdCgKKyAgICAgICJzdGF0aWMgY29uc3QgOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6IgorICAgICAgIlRjUGFyc2VUYWJsZTwkMSQsICQyJCwgJDMkLCAkNCQsICQ1JD4gX3RhYmxlXztcbiIsCisgICAgICB0Y190YWJsZV9pbmZvXy0+dGFibGVfc2l6ZV9sb2cyLCBvcmRlcmVkX2ZpZWxkc18uc2l6ZSgpLAorICAgICAgdGNfdGFibGVfaW5mb18tPmF1eF9lbnRyaWVzLnNpemUoKSwgQ2FsY3VsYXRlRmllbGROYW1lc1NpemUoKSwKKyAgICAgIGZpZWxkX251bV90b19lbnRyeV90YWJsZS5zaXplMTYoKSk7CisgIGlmIChzaG91bGRfZ2VuZXJhdGVfZ3VhcmRlZF90Y3RhYmxlKCkpIHsKKyAgICBmb3JtYXQuT3V0ZGVudCgpOworICAgIGZvcm1hdCgiI2VuZGlmICAvLyBQUk9UT0JVRl9UQUlMX0NBTExfVEFCTEVfUEFSU0VSX0VOQUJMRURcbiIpOworICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgfQorfQorCit2b2lkIFBhcnNlRnVuY3Rpb25HZW5lcmF0b3I6OkdlbmVyYXRlRGF0YURlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmICghc2hvdWxkX2dlbmVyYXRlX3RjdGFibGUoKSkgeworICAgIHJldHVybjsKKyAgfQorICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoc2hvdWxkX2dlbmVyYXRlX2d1YXJkZWRfdGN0YWJsZSgpKSB7CisgICAgZm9ybWF0KCIjaWZkZWYgUFJPVE9CVUZfVEFJTF9DQUxMX1RBQkxFX1BBUlNFUl9FTkFCTEVEXG4iKTsKKyAgfQorICBHZW5lcmF0ZVRhaWxDYWxsVGFibGUoZm9ybWF0KTsKKyAgaWYgKHNob3VsZF9nZW5lcmF0ZV9ndWFyZGVkX3RjdGFibGUoKSkgeworICAgIGZvcm1hdCgiI2VuZGlmICAvLyBQUk9UT0JVRl9UQUlMX0NBTExfVEFCTEVfUEFSU0VSX0VOQUJMRURcbiIpOworICB9Cit9CisKK3ZvaWQgUGFyc2VGdW5jdGlvbkdlbmVyYXRvcjo6R2VuZXJhdGVMb29waW5nUGFyc2VGdW5jdGlvbihGb3JtYXR0ZXImIGZvcm1hdCkgeworICBmb3JtYXQoCisgICAgICAiY29uc3QgY2hhciogJGNsYXNzbmFtZSQ6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgIgorICAgICAgIjo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHtcbiIKKyAgICAgICIkYW5ub3RhdGVfZGVzZXJpYWxpemUkIgorICAgICAgIiNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlXG4iKTsKKyAgZm9ybWF0LkluZGVudCgpOworICBmb3JtYXQuU2V0KCJtc2ciLCAiIik7CisgIGZvcm1hdC5TZXQoInRoaXMiLCAidGhpcyIpOworICBpbnQgaGFzYml0c19zaXplID0gMDsKKyAgaWYgKG51bV9oYXNiaXRzXyA+IDApIHsKKyAgICBoYXNiaXRzX3NpemUgPSAobnVtX2hhc2JpdHNfICsgMzEpIC8gMzI7CisgIH0KKyAgLy8gRm9yIG5vdyBvbmx5IG9wdGltaXplIHNtYWxsIGhhc2JpdHMuCisgIGlmIChoYXNiaXRzX3NpemUgIT0gMSkgaGFzYml0c19zaXplID0gMDsKKyAgaWYgKGhhc2JpdHNfc2l6ZSkgeworICAgIGZvcm1hdCgiX0ludGVybmFsOjpIYXNCaXRzIGhhc19iaXRze307XG4iKTsKKyAgICBmb3JtYXQuU2V0KCJoYXNfYml0cyIsICJoYXNfYml0cyIpOworICB9IGVsc2UgeworICAgIGZvcm1hdC5TZXQoImhhc19iaXRzIiwgIl9pbXBsXy5faGFzX2JpdHNfIik7CisgIH0KKyAgZm9ybWF0LlNldCgibmV4dF90YWciLCAiY29udGludWUiKTsKKyAgZm9ybWF0KCJ3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkge1xuIik7CisgIGZvcm1hdC5JbmRlbnQoKTsKKworICBmb3JtYXQoCisgICAgICAidWludDMyX3QgdGFnO1xuIgorICAgICAgInB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpO1xuIik7CisgIEdlbmVyYXRlUGFyc2VJdGVyYXRpb25Cb2R5KGZvcm1hdCwgZGVzY3JpcHRvcl8sIG9yZGVyZWRfZmllbGRzXyk7CisKKyAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgZm9ybWF0KCJ9ICAvLyB3aGlsZVxuIik7CisKKyAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgZm9ybWF0KCJtZXNzYWdlX2RvbmU6XG4iKTsKKyAgaWYgKGhhc2JpdHNfc2l6ZSkgZm9ybWF0KCIgIF9pbXBsXy5faGFzX2JpdHNfLk9yKGhhc19iaXRzKTtcbiIpOworCisgIGZvcm1hdCgKKyAgICAgICIgIHJldHVybiBwdHI7XG4iCisgICAgICAiZmFpbHVyZTpcbiIKKyAgICAgICIgIHB0ciA9IG51bGxwdHI7XG4iCisgICAgICAiICBnb3RvIG1lc3NhZ2VfZG9uZTtcbiIKKyAgICAgICIjdW5kZWYgQ0hLX1xuIgorICAgICAgIn1cbiIpOworfQorCitzdGF0aWMgTnVtVG9FbnRyeVRhYmxlIE1ha2VOdW1Ub0VudHJ5VGFibGUoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGZpZWxkX2Rlc2NyaXB0b3JzKSB7CisgIE51bVRvRW50cnlUYWJsZSBudW1fdG9fZW50cnlfdGFibGU7CisgIG51bV90b19lbnRyeV90YWJsZS5za2lwbWFwMzIgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLTEpOworCisgIC8vIHNraXBfZW50cnlfYmxvY2sgaXMgdGhlIGN1cnJlbnQgYmxvY2sgb2YgU2tpcEVudHJpZXMgdGhhdCB3ZSdyZQorICAvLyBhcHBlbmRpbmcgdG8uICBjdXJfYmxvY2tfZmlyc3RfZm51bSBpcyB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdAorICAvLyBmaWVsZCByZXByZXNlbnRlZCBieSB0aGUgYmxvY2suCisgIHVpbnQxNl90IGZpZWxkX2VudHJ5X2luZGV4ID0gMDsKKyAgdWludDE2X3QgTiA9IGZpZWxkX2Rlc2NyaXB0b3JzLnNpemUoKTsKKyAgLy8gRmlyc3QsIGhhbmRsZSBmaWVsZCBudW1iZXJzIDEtMzIsIHdoaWNoIGFmZmVjdCBvbmx5IHRoZSBpbml0aWFsCisgIC8vIHNraXBtYXAzMiBhbmQgZG9uJ3QgZ2VuZXJhdGUgYWRkaXRpb25hbCBza2lwLWVudHJ5IGJsb2Nrcy4KKyAgZm9yICg7IGZpZWxkX2VudHJ5X2luZGV4ICE9IE47ICsrZmllbGRfZW50cnlfaW5kZXgpIHsKKyAgICBhdXRvKiBmaWVsZF9kZXNjcmlwdG9yID0gZmllbGRfZGVzY3JpcHRvcnNbZmllbGRfZW50cnlfaW5kZXhdOworICAgIGlmIChmaWVsZF9kZXNjcmlwdG9yLT5udW1iZXIoKSA+IDMyKSBicmVhazsKKyAgICBhdXRvIHNraXBtYXAzMl9pbmRleCA9IGZpZWxkX2Rlc2NyaXB0b3ItPm51bWJlcigpIC0gMTsKKyAgICBudW1fdG9fZW50cnlfdGFibGUuc2tpcG1hcDMyIC09IDEgPDwgc2tpcG1hcDMyX2luZGV4OworICB9CisgIC8vIElmIGFsbCB0aGUgZmllbGQgbnVtYmVycyB3ZXJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAzMiwgd2Ugd2lsbCBoYXZlCisgIC8vIG5vIGZ1cnRoZXIgZW50cmllcyB0byBwcm9jZXNzLCBhbmQgd2UgYXJlIGFscmVhZHkgZG9uZS4KKyAgaWYgKGZpZWxkX2VudHJ5X2luZGV4ID09IE4pIHJldHVybiBudW1fdG9fZW50cnlfdGFibGU7CisKKyAgU2tpcEVudHJ5QmxvY2sqIGJsb2NrID0gbnVsbHB0cjsKKyAgYm9vbCBzdGFydF9uZXdfYmxvY2sgPSB0cnVlOworICAvLyBUbyBkZXRlcm1pbmUgc3BhcnNlbmVzcywgdHJhY2sgdGhlIGZpZWxkIG51bWJlciBjb3JyZXNwb25kaW5nIHRvCisgIC8vIHRoZSBzdGFydCBvZiB0aGUgbW9zdCByZWNlbnQgc2tpcCBlbnRyeS4KKyAgdWludDMyX3QgbGFzdF9za2lwX2VudHJ5X3N0YXJ0ID0gMDsKKyAgZm9yICg7IGZpZWxkX2VudHJ5X2luZGV4ICE9IE47ICsrZmllbGRfZW50cnlfaW5kZXgpIHsKKyAgICBhdXRvKiBmaWVsZF9kZXNjcmlwdG9yID0gZmllbGRfZGVzY3JpcHRvcnNbZmllbGRfZW50cnlfaW5kZXhdOworICAgIHVpbnQzMl90IGZudW0gPSBmaWVsZF9kZXNjcmlwdG9yLT5udW1iZXIoKTsKKyAgICBHT09HTEVfQ0hFQ0tfR1QoZm51bSwgbGFzdF9za2lwX2VudHJ5X3N0YXJ0KTsKKyAgICBpZiAoc3RhcnRfbmV3X2Jsb2NrID09IGZhbHNlKSB7CisgICAgICAvLyBJZiB0aGUgbmV4dCBmaWVsZCBudW1iZXIgaXMgd2l0aGluIDE1IG9mIHRoZSBsYXN0X3NraXBfZW50cnlfc3RhcnQsIHdlCisgICAgICAvLyBjb250aW51ZSB3cml0aW5nIGp1c3QgdG8gdGhhdCBlbnRyeS4gIElmIGl0J3MgYmV0d2VlbiAxNiBhbmQgMzEgbW9yZSwKKyAgICAgIC8vIHRoZW4gd2UganVzdCBleHRlbmQgdGhlIGN1cnJlbnQgYmxvY2sgYnkgb25lLiBJZiBpdCdzIG1vcmUgdGhhbiAzMQorICAgICAgLy8gbW9yZSwgd2UgaGF2ZSB0byBhZGQgZW1wdHkgc2tpcCBlbnRyaWVzIGluIG9yZGVyIHRvIGNvbnRpbnVlIHVzaW5nIHRoZQorICAgICAgLy8gZXhpc3RpbmcgYmxvY2suICBPYnZpb3VzbHkgaXQncyBqdXN0IDMyIG1vcmUsIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0bworICAgICAgLy8gc3RhcnQgYSB3aG9sZSBuZXcgYmxvY2ssIHNpbmNlIG5ldyBibG9ja3MgbWVhbiBoYXZpbmcgdG8gd3JpdGUgb3V0CisgICAgICAvLyB0aGVpciBzdGFydGluZyBmaWVsZCBudW1iZXIsIHdoaWNoIGlzIDMyIGJpdHMsIGFzIHdlbGwgYXMgdGhlIHNpemUgb2YKKyAgICAgIC8vIHRoZSBhZGRpdGlvbmFsIGJsb2NrLCB3aGljaCBpcyAxNi4uLiB3aGlsZSBhbiBlbXB0eSBTa2lwRW50cnkxNiBvbmx5CisgICAgICAvLyBjb3N0cyAzMiBiaXRzLiAgU28gaWYgaXQgd2FzIDQ4IG1vcmUsIGl0J3MgYSBzbGlnaHQgc3BhY2Ugd2luOyB3ZSBzYXZlCisgICAgICAvLyAxNiBiaXRzLCBidXQgcHJvYmFibHkgYXQgdGhlIGNvc3Qgb2Ygc2xvd2VyIHJ1biB0aW1lLiAgV2UncmUgY2hvb3NpbmcKKyAgICAgIC8vIDk2IGZvciBub3cuCisgICAgICBpZiAoZm51bSAtIGxhc3Rfc2tpcF9lbnRyeV9zdGFydCA+IDk2KSBzdGFydF9uZXdfYmxvY2sgPSB0cnVlOworICAgIH0KKyAgICBpZiAoc3RhcnRfbmV3X2Jsb2NrKSB7CisgICAgICBudW1fdG9fZW50cnlfdGFibGUuYmxvY2tzLnB1c2hfYmFjayhTa2lwRW50cnlCbG9ja3tmbnVtfSk7CisgICAgICBibG9jayA9ICZudW1fdG9fZW50cnlfdGFibGUuYmxvY2tzLmJhY2soKTsKKyAgICAgIHN0YXJ0X25ld19ibG9jayA9IGZhbHNlOworICAgIH0KKworICAgIGF1dG8gc2tpcF9lbnRyeV9udW0gPSAoZm51bSAtIGJsb2NrLT5maXJzdF9mbnVtKSAvIDE2OworICAgIGF1dG8gc2tpcF9lbnRyeV9pbmRleCA9IChmbnVtIC0gYmxvY2stPmZpcnN0X2ZudW0pICUgMTY7CisgICAgd2hpbGUgKHNraXBfZW50cnlfbnVtID49IGJsb2NrLT5lbnRyaWVzLnNpemUoKSkKKyAgICAgIGJsb2NrLT5lbnRyaWVzLnB1c2hfYmFjayh7MHhGRkZGLCBmaWVsZF9lbnRyeV9pbmRleH0pOworICAgIGJsb2NrLT5lbnRyaWVzW3NraXBfZW50cnlfbnVtXS5za2lwbWFwIC09IDEgPDwgKHNraXBfZW50cnlfaW5kZXgpOworCisgICAgbGFzdF9za2lwX2VudHJ5X3N0YXJ0ID0gZm51bSAtIHNraXBfZW50cnlfaW5kZXg7CisgIH0KKyAgcmV0dXJuIG51bV90b19lbnRyeV90YWJsZTsKK30KKwordm9pZCBQYXJzZUZ1bmN0aW9uR2VuZXJhdG9yOjpHZW5lcmF0ZVRhaWxDYWxsVGFibGUoRm9ybWF0dGVyJiBmb3JtYXQpIHsKKyAgR09PR0xFX0NIRUNLKHNob3VsZF9nZW5lcmF0ZV90Y3RhYmxlKCkpOworICAvLyBBbGwgZW50cmllcyB3aXRob3V0IGEgZmFzdC1wYXRoIHBhcnNpbmcgZnVuY3Rpb24gbmVlZCBhIGZhbGxiYWNrLgorICBzdGQ6OnN0cmluZyBmYWxsYmFjazsKKyAgaWYgKHRjX3RhYmxlX2luZm9fLT51c2VfZ2VuZXJhdGVkX2ZhbGxiYWNrKSB7CisgICAgZmFsbGJhY2sgPSBDbGFzc05hbWUoZGVzY3JpcHRvcl8pICsgIjo6VGN0X1BhcnNlRmFsbGJhY2siOworICB9IGVsc2UgeworICAgIGZhbGxiYWNrID0gIjo6X3BiaTo6VGNQYXJzZXI6OkdlbmVyaWNGYWxsYmFjayI7CisgICAgaWYgKEdldE9wdGltaXplRm9yKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSA9PQorICAgICAgICBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FKSB7CisgICAgICBmYWxsYmFjayArPSAiTGl0ZSI7CisgICAgfQorICB9CisKKyAgLy8gRm9yIHNpbXBsaWNpdHkgYW5kIHNwZWVkLCB0aGUgdGFibGUgaXMgbm90IGNvdmVyaW5nIGFsbCBwcm90bworICAvLyBjb25maWd1cmF0aW9ucy4gVGhpcyBtb2RlbCB1c2VzIGEgZmFsbGJhY2sgdG8gY292ZXIgYWxsIHNpdHVhdGlvbnMgdGhhdAorICAvLyB0aGUgdGFibGUgY2FuJ3QgYWNjb21tb2RhdGUsIHRvZ2V0aGVyIHdpdGggdW5rbm93biBmaWVsZHMgb3IgZXh0ZW5zaW9ucy4KKyAgLy8gVGhlc2UgYXJlIG51bWJlciBvZiBmaWVsZHMgb3ZlciAzMiwgZmllbGRzIHdpdGggMyBvciBtb3JlIHRhZyBieXRlcywKKyAgLy8gbWFwcywgd2VhayBmaWVsZHMsIGxhenksIG1vcmUgdGhhbiAxIGV4dGVuc2lvbiByYW5nZS4gSW4gdGhlIGNhc2VzCisgIC8vIHRoZSB0YWJsZSBpcyBzdWZmaWNpZW50IHdlIGNhbiB1c2UgYSBnZW5lcmljIHJvdXRpbmUsIHRoYXQganVzdCBoYW5kbGVzCisgIC8vIHVua25vd24gZmllbGRzIGFuZCBwb3RlbnRpYWxseSBhbiBleHRlbnNpb24gcmFuZ2UuCisgIGF1dG8gZmllbGRfbnVtX3RvX2VudHJ5X3RhYmxlID0gTWFrZU51bVRvRW50cnlUYWJsZShvcmRlcmVkX2ZpZWxkc18pOworICBmb3JtYXQoCisgICAgICAiUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxXG4iCisgICAgICAiY29uc3QgOjpfcGJpOjpUY1BhcnNlVGFibGU8JDEkLCAkMiQsICQzJCwgJDQkLCAkNSQ+ICIKKyAgICAgICIkY2xhc3NuYW1lJDo6X3RhYmxlXyA9ICIKKyAgICAgICJ7XG4iLAorICAgICAgdGNfdGFibGVfaW5mb18tPnRhYmxlX3NpemVfbG9nMiwgb3JkZXJlZF9maWVsZHNfLnNpemUoKSwKKyAgICAgIHRjX3RhYmxlX2luZm9fLT5hdXhfZW50cmllcy5zaXplKCksIENhbGN1bGF0ZUZpZWxkTmFtZXNTaXplKCksCisgICAgICBmaWVsZF9udW1fdG9fZW50cnlfdGFibGUuc2l6ZTE2KCkpOworICB7CisgICAgYXV0byB0YWJsZV9zY29wZSA9IGZvcm1hdC5TY29wZWRJbmRlbnQoKTsKKyAgICBmb3JtYXQoIntcbiIpOworICAgIHsKKyAgICAgIGF1dG8gaGVhZGVyX3Njb3BlID0gZm9ybWF0LlNjb3BlZEluZGVudCgpOworICAgICAgaWYgKG51bV9oYXNiaXRzXyA+IDAgfHwgSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgICAgIGZvcm1hdCgiUFJPVE9CVUZfRklFTERfT0ZGU0VUKCRjbGFzc25hbWUkLCBfaW1wbF8uX2hhc19iaXRzXyksXG4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdCgiMCwgIC8vIG5vIF9oYXNfYml0c19cbiIpOworICAgICAgfQorICAgICAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA9PSAxKSB7CisgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICJQUk9UT0JVRl9GSUVMRF9PRkZTRVQoJGNsYXNzbmFtZSQsICRleHRlbnNpb25zJCksXG4iCisgICAgICAgICAgICAiJDEkLCAkMiQsICAvLyBleHRlbnNpb25fcmFuZ2Vfe2xvdyxoaWdofVxuIiwKKyAgICAgICAgICAgIGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2UoMCktPnN0YXJ0LAorICAgICAgICAgICAgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZSgwKS0+ZW5kKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdCgiMCwgMCwgMCwgIC8vIG5vIF9leHRlbnNpb25zX1xuIik7CisgICAgICB9CisgICAgICBmb3JtYXQoIiQxJCwgJDIkLCAgLy8gbWF4X2ZpZWxkX251bWJlciwgZmFzdF9pZHhfbWFza1xuIiwKKyAgICAgICAgICAgICAob3JkZXJlZF9maWVsZHNfLmVtcHR5KCkgPyAwIDogb3JkZXJlZF9maWVsZHNfLmJhY2soKS0+bnVtYmVyKCkpLAorICAgICAgICAgICAgICgoKDEgPDwgdGNfdGFibGVfaW5mb18tPnRhYmxlX3NpemVfbG9nMikgLSAxKSA8PCAzKSk7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgIm9mZnNldG9mKGRlY2x0eXBlKF90YWJsZV8pLCBmaWVsZF9sb29rdXBfdGFibGUpLFxuIgorICAgICAgICAgICIkMSQsICAvLyBza2lwbWFwXG4iLAorICAgICAgICAgIGZpZWxkX251bV90b19lbnRyeV90YWJsZS5za2lwbWFwMzIpOworICAgICAgaWYgKG9yZGVyZWRfZmllbGRzXy5lbXB0eSgpKSB7CisgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICJvZmZzZXRvZihkZWNsdHlwZShfdGFibGVfKSwgZmllbGRfbmFtZXMpLCAgLy8gbm8gZmllbGRfZW50cmllc1xuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXQoIm9mZnNldG9mKGRlY2x0eXBlKF90YWJsZV8pLCBmaWVsZF9lbnRyaWVzKSxcbiIpOworICAgICAgfQorCisgICAgICBmb3JtYXQoCisgICAgICAgICAgIiQxJCwgIC8vIG51bV9maWVsZF9lbnRyaWVzXG4iCisgICAgICAgICAgIiQyJCwgIC8vIG51bV9hdXhfZW50cmllc1xuIiwKKyAgICAgICAgICBvcmRlcmVkX2ZpZWxkc18uc2l6ZSgpLCB0Y190YWJsZV9pbmZvXy0+YXV4X2VudHJpZXMuc2l6ZSgpKTsKKyAgICAgIGlmICh0Y190YWJsZV9pbmZvXy0+YXV4X2VudHJpZXMuZW1wdHkoKSkgeworICAgICAgICBmb3JtYXQoCisgICAgICAgICAgICAib2Zmc2V0b2YoZGVjbHR5cGUoX3RhYmxlXyksIGZpZWxkX25hbWVzKSwgIC8vIG5vIGF1eF9lbnRyaWVzXG4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdCgib2Zmc2V0b2YoZGVjbHR5cGUoX3RhYmxlXyksIGF1eF9lbnRyaWVzKSxcbiIpOworICAgICAgfQorICAgICAgZm9ybWF0KAorICAgICAgICAgICImJDEkLl9pbnN0YW5jZSxcbiIKKyAgICAgICAgICAiJDIkLCAgLy8gZmFsbGJhY2tcbiIKKyAgICAgICAgICAiIiwKKyAgICAgICAgICBEZWZhdWx0SW5zdGFuY2VOYW1lKGRlc2NyaXB0b3JfLCBvcHRpb25zXyksIGZhbGxiYWNrKTsKKyAgICB9CisgICAgZm9ybWF0KCJ9LCB7e1xuIik7CisgICAgeworICAgICAgLy8gZmFzdF9lbnRyaWVzW10KKyAgICAgIGF1dG8gZmFzdF9zY29wZSA9IGZvcm1hdC5TY29wZWRJbmRlbnQoKTsKKyAgICAgIEdlbmVyYXRlRmFzdEZpZWxkRW50cmllcyhmb3JtYXQpOworICAgIH0KKyAgICBmb3JtYXQoIn19LCB7e1xuIik7CisgICAgeworICAgICAgLy8gZmllbGRfbG9va3VwX3RhYmxlW10KKyAgICAgIGF1dG8gZmllbGRfbG9va3VwX3Njb3BlID0gZm9ybWF0LlNjb3BlZEluZGVudCgpOworICAgICAgaW50IGxpbmVfZW50cmllcyA9IDA7CisgICAgICBmb3IgKGludCBpID0gMCwgTiA9IGZpZWxkX251bV90b19lbnRyeV90YWJsZS5ibG9ja3Muc2l6ZSgpOyBpIDwgTjsgKytpKSB7CisgICAgICAgIFNraXBFbnRyeUJsb2NrJiBlbnRyeV9ibG9jayA9IGZpZWxkX251bV90b19lbnRyeV90YWJsZS5ibG9ja3NbaV07CisgICAgICAgIGZvcm1hdCgiJDEkLCAkMiQsICQzJCxcbiIsIGVudHJ5X2Jsb2NrLmZpcnN0X2ZudW0gJiA2NTUzNSwKKyAgICAgICAgICAgICAgIGVudHJ5X2Jsb2NrLmZpcnN0X2ZudW0gLyA2NTUzNiwgZW50cnlfYmxvY2suZW50cmllcy5zaXplKCkpOworICAgICAgICBmb3IgKGF1dG8gc2UxNiA6IGVudHJ5X2Jsb2NrLmVudHJpZXMpIHsKKyAgICAgICAgICBpZiAobGluZV9lbnRyaWVzID09IDApIHsKKyAgICAgICAgICAgIGZvcm1hdCgiJDEkLCAkMiQsIiwgc2UxNi5za2lwbWFwLCBzZTE2LmZpZWxkX2VudHJ5X29mZnNldCk7CisgICAgICAgICAgICArK2xpbmVfZW50cmllczsKKyAgICAgICAgICB9IGVsc2UgaWYgKGxpbmVfZW50cmllcyA8IDUpIHsKKyAgICAgICAgICAgIGZvcm1hdCgiICQxJCwgJDIkLCIsIHNlMTYuc2tpcG1hcCwgc2UxNi5maWVsZF9lbnRyeV9vZmZzZXQpOworICAgICAgICAgICAgKytsaW5lX2VudHJpZXM7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcm1hdCgiICQxJCwgJDIkLFxuIiwgc2UxNi5za2lwbWFwLCBzZTE2LmZpZWxkX2VudHJ5X29mZnNldCk7CisgICAgICAgICAgICBsaW5lX2VudHJpZXMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGxpbmVfZW50cmllcykgZm9ybWF0KCJcbiIpOworICAgICAgZm9ybWF0KCI2NTUzNSwgNjU1MzVcbiIpOworICAgIH0KKyAgICBpZiAob3JkZXJlZF9maWVsZHNfLmVtcHR5KCkpIHsKKyAgICAgIEdPT0dMRV9MT0dfSUYoREZBVEFMLCAhdGNfdGFibGVfaW5mb18tPmF1eF9lbnRyaWVzLmVtcHR5KCkpCisgICAgICAgICAgPDwgIkludmFsaWQgbWVzc2FnZTogIiA8PCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkgPDwgIiBoYXMgIgorICAgICAgICAgIDw8IHRjX3RhYmxlX2luZm9fLT5hdXhfZW50cmllcy5zaXplKCkKKyAgICAgICAgICA8PCAiIGF1eGlsaWFyeSBmaWVsZCBlbnRyaWVzLCBidXQgbm8gZmllbGRzIjsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAifX0sXG4iCisgICAgICAgICAgIi8vIG5vIGZpZWxkX2VudHJpZXMsIG9yIGF1eF9lbnRyaWVzXG4iCisgICAgICAgICAgInt7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9ybWF0KCJ9fSwge3tcbiIpOworICAgICAgeworICAgICAgICAvLyBmaWVsZF9lbnRyaWVzW10KKyAgICAgICAgYXV0byBmaWVsZF9zY29wZSA9IGZvcm1hdC5TY29wZWRJbmRlbnQoKTsKKyAgICAgICAgR2VuZXJhdGVGaWVsZEVudHJpZXMoZm9ybWF0KTsKKyAgICAgIH0KKyAgICAgIGlmICh0Y190YWJsZV9pbmZvXy0+YXV4X2VudHJpZXMuZW1wdHkoKSkgeworICAgICAgICBmb3JtYXQoCisgICAgICAgICAgICAifX0sXG4iCisgICAgICAgICAgICAiLy8gbm8gYXV4X2VudHJpZXNcbiIKKyAgICAgICAgICAgICJ7e1xuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXQoIn19LCB7e1xuIik7CisgICAgICAgIHsKKyAgICAgICAgICAvLyBhdXhfZW50cmllc1tdCisgICAgICAgICAgYXV0byBhdXhfc2NvcGUgPSBmb3JtYXQuU2NvcGVkSW5kZW50KCk7CisgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyYgYXV4X2VudHJ5IDogdGNfdGFibGVfaW5mb18tPmF1eF9lbnRyaWVzKSB7CisgICAgICAgICAgICBmb3JtYXQoInskMSR9LFxuIiwgYXV4X2VudHJ5KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9ybWF0KCJ9fSwge3tcbiIpOworICAgICAgfQorICAgIH0gIC8vIG9yZGVyZWRfZmllbGRzXy5lbXB0eSgpCisgICAgeworICAgICAgLy8gZmllbGRfbmFtZXNbXQorICAgICAgYXV0byBmaWVsZF9uYW1lX3Njb3BlID0gZm9ybWF0LlNjb3BlZEluZGVudCgpOworICAgICAgR2VuZXJhdGVGaWVsZE5hbWVzKGZvcm1hdCk7CisgICAgfQorICAgIGZvcm1hdCgifX0sXG4iKTsKKyAgfQorICBmb3JtYXQoIn07XG5cbiIpOyAgLy8gX3RhYmxlXworfQorCit2b2lkIFBhcnNlRnVuY3Rpb25HZW5lcmF0b3I6OkdlbmVyYXRlRmFzdEZpZWxkRW50cmllcyhGb3JtYXR0ZXImIGZvcm1hdCkgeworICBmb3IgKGNvbnN0IGF1dG8mIGluZm8gOiB0Y190YWJsZV9pbmZvXy0+ZmFzdF9wYXRoX2ZpZWxkcykgeworICAgIGlmIChpbmZvLmZpZWxkICE9IG51bGxwdHIpIHsKKyAgICAgIFByaW50RmllbGRDb21tZW50KGZvcm1hdCwgaW5mby5maWVsZCk7CisgICAgfQorICAgIGlmIChpbmZvLmZ1bmNfbmFtZS5lbXB0eSgpKSB7CisgICAgICBmb3JtYXQoIns6Ol9wYmk6OlRjUGFyc2VyOjpNaW5pUGFyc2UsIHt9fSxcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBib29sIGNvbGQgPSBTaG91bGRTcGxpdChpbmZvLmZpZWxkLCBvcHRpb25zXyk7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgInskMSQsXG4iCisgICAgICAgICAgIiB7JDIkLCAkMyQsICQ0JCwgUFJPVE9CVUZfRklFTERfT0ZGU0VUKCRjbGFzc25hbWUkJDUkLCAkNiQpfX0sXG4iLAorICAgICAgICAgIGluZm8uZnVuY19uYW1lLCBpbmZvLmNvZGVkX3RhZywgaW5mby5oYXNiaXRfaWR4LCBpbmZvLmF1eF9pZHgsCisgICAgICAgICAgY29sZCA/ICI6OkltcGxfOjpTcGxpdCIgOiAiIiwKKyAgICAgICAgICBjb2xkID8gRmllbGROYW1lKGluZm8uZmllbGQpICsgIl8iCisgICAgICAgICAgICAgICA6IEZpZWxkTWVtYmVyTmFtZShpbmZvLmZpZWxkLCAvKmNvbGQ9Ki9mYWxzZSkpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBGb3JtYXRGaWVsZEtpbmQoRm9ybWF0dGVyJiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFpbENhbGxUYWJsZUluZm86OkZpZWxkRW50cnlJbmZvJiBlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBlbnRyeS5maWVsZDsKKyAgLy8gU3BlbGwgdGhlIGZpZWxkIGtpbmQgaW4gcHJvdG8gbGFuZ3VhZ2UgZGVjbGFyYXRpb24gb3JkZXIsIHN0YXJ0aW5nIHdpdGgKKyAgLy8gY2FyZGluYWxpdHk6CisgIGZvcm1hdCgiKDo6X2ZsOjprRmMiKTsKKyAgaWYgKEhhc0hhc2JpdChmaWVsZCkpIHsKKyAgICBmb3JtYXQoIk9wdGlvbmFsIik7CisgIH0gZWxzZSBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBmb3JtYXQoIlJlcGVhdGVkIik7CisgIH0gZWxzZSBpZiAoZmllbGQtPnJlYWxfY29udGFpbmluZ19vbmVvZigpKSB7CisgICAgZm9ybWF0KCJPbmVvZiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgiU2luZ3VsYXIiKTsKKyAgfQorCisgIC8vIFRoZSByZXN0IG9mIHRoZSB0eXBlIHVzZXMgY29udmVuaWVuY2UgYWxpYXNlczoKKyAgZm9ybWF0KCIgfCA6Ol9mbDo6ayIpOworICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgZmllbGQtPmlzX3BhY2tlZCgpKSB7CisgICAgZm9ybWF0KCJQYWNrZWQiKTsKKyAgfQorICBzd2l0Y2ggKGZpZWxkLT50eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEU6CisgICAgICBmb3JtYXQoIkRvdWJsZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQ6CisgICAgICBmb3JtYXQoIkZsb2F0Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyOgorICAgICAgZm9ybWF0KCJGaXhlZDMyIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjoKKyAgICAgIGZvcm1hdCgiU0ZpeGVkMzIiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQ6CisgICAgICBmb3JtYXQoIkZpeGVkNjQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OgorICAgICAgZm9ybWF0KCJTRml4ZWQ2NCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQk9PTDoKKyAgICAgIGZvcm1hdCgiQm9vbCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTToKKyAgICAgIGlmIChIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoZmllbGQpKSB7CisgICAgICAgIC8vIE5vIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQuCisgICAgICAgIGZvcm1hdCgiT3BlbkVudW0iKTsKKyAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNfZW51bV9yYW5nZSkgeworICAgICAgICAvLyBWYWxpZGF0aW9uIGlzIGRvbmUgYnkgcmFuZ2UgY2hlY2sgKHN0YXJ0L2xlbmd0aCBpbiBGaWVsZEF1eCkuCisgICAgICAgIGZvcm1hdCgiRW51bVJhbmdlIik7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBWYWxpZGF0aW9uIHVzZXMgdGhlIGdlbmVyYXRlZCBfSXNWYWxpZCBmdW5jdGlvbi4KKyAgICAgICAgZm9ybWF0KCJFbnVtIik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzI6CisgICAgICBmb3JtYXQoIlVJbnQzMiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgICAgZm9ybWF0KCJTSW50MzIiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyOgorICAgICAgZm9ybWF0KCJJbnQzMiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0OgorICAgICAgZm9ybWF0KCJVSW50NjQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NDoKKyAgICAgIGZvcm1hdCgiU0ludDY0Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NDoKKyAgICAgIGZvcm1hdCgiSW50NjQiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6CisgICAgICBmb3JtYXQoIkJ5dGVzIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6IHsKKyAgICAgIGF1dG8gbW9kZSA9IEdldFV0ZjhDaGVja01vZGUoZmllbGQsIG9wdGlvbnMpOworICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgVXRmOENoZWNrTW9kZTo6a1N0cmljdDoKKyAgICAgICAgICBmb3JtYXQoIlV0ZjhTdHJpbmciKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVdGY4Q2hlY2tNb2RlOjprVmVyaWZ5OgorICAgICAgICAgIGZvcm1hdCgiUmF3U3RyaW5nIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVXRmOENoZWNrTW9kZTo6a05vbmU6CisgICAgICAgICAgLy8gVHJlYXQgTElURV9SVU5USU1FIHN0cmluZ3MgYXMgYnl0ZXMuCisgICAgICAgICAgZm9ybWF0KCJCeXRlcyIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJJbnZhbGlkIFV0ZjhDaGVja01vZGUgKCIgPDwgc3RhdGljX2Nhc3Q8aW50Pihtb2RlKQorICAgICAgICAgICAgICAgICAgICAgPDwgIikgZm9yICIgPDwgZmllbGQtPkRlYnVnU3RyaW5nKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICAgIGZvcm1hdCgiTWVzc2FnZSB8IDo6X2ZsOjprUmVwR3JvdXAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6CisgICAgICBpZiAoZmllbGQtPmlzX21hcCgpKSB7CisgICAgICAgIGZvcm1hdCgiTWFwIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXQoIk1lc3NhZ2UiKTsKKyAgICAgICAgaWYgKElzTGF6eShmaWVsZCwgb3B0aW9ucywgc2NjX2FuYWx5emVyKSkgeworICAgICAgICAgIGZvcm1hdCgiIHwgOjpfZmw6OmtSZXBMYXp5Iik7CisgICAgICAgIH0gZWxzZSBpZiAoSXNJbXBsaWNpdFdlYWtGaWVsZChmaWVsZCwgb3B0aW9ucywgc2NjX2FuYWx5emVyKSkgeworICAgICAgICAgIGZvcm1hdCgiIHwgOjpfZmw6OmtSZXBJV2VhayIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIC8vIEZpbGwgaW4gZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgc3RyaW5nIGFuZCBieXRlcyBmaWVsZCByZXByZXNlbnRhdGlvbnMuCisgIGlmIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyB8fAorICAgICAgZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7CisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBmb3JtYXQoIiB8IDo6X2ZsOjprUmVwU1N0cmluZyIpOworICAgIH0gZWxzZSB7CisgICAgICBmb3JtYXQoIiB8IDo6X2ZsOjprUmVwQVN0cmluZyIpOworICAgIH0KKyAgfQorCisgIGZvcm1hdCgiKSIpOworfQorCit2b2lkIFBhcnNlRnVuY3Rpb25HZW5lcmF0b3I6OkdlbmVyYXRlRmllbGRFbnRyaWVzKEZvcm1hdHRlciYgZm9ybWF0KSB7CisgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiB0Y190YWJsZV9pbmZvXy0+ZmllbGRfZW50cmllcykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBlbnRyeS5maWVsZDsKKyAgICBQcmludEZpZWxkQ29tbWVudChmb3JtYXQsIGZpZWxkKTsKKyAgICBmb3JtYXQoInsiKTsKKyAgICBpZiAoSXNXZWFrKGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgIC8vIFdlYWsgZmllbGRzIGFyZSBoYW5kbGVkIGJ5IHRoZSBnZW5lcmF0ZWQgZmFsbGJhY2sgZnVuY3Rpb24uCisgICAgICAvLyAoVGhlc2UgYXJlIGhhbmRsZWQgYnkgbGVnYWN5IEdvb2dsZS1pbnRlcm5hbCBsb2dpYy4pCisgICAgICBmb3JtYXQoIi8qIHdlYWsgKi8gMCwgMCwgMCwgMCIpOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gZmllbGQtPnJlYWxfY29udGFpbmluZ19vbmVvZigpOworICAgICAgYm9vbCBjb2xkID0gU2hvdWxkU3BsaXQoZmllbGQsIG9wdGlvbnNfKTsKKyAgICAgIGZvcm1hdCgiUFJPVE9CVUZfRklFTERfT0ZGU0VUKCRjbGFzc25hbWUkJDEkLCAkMiQpLCAkMyQsICQ0JCxcbiAiLAorICAgICAgICAgICAgIGNvbGQgPyAiOjpJbXBsXzo6U3BsaXQiIDogIiIsCisgICAgICAgICAgICAgY29sZCA/IEZpZWxkTmFtZShmaWVsZCkgKyAiXyIKKyAgICAgICAgICAgICAgICAgIDogRmllbGRNZW1iZXJOYW1lKGZpZWxkLCAvKmNvbGQ9Ki9mYWxzZSksCisgICAgICAgICAgICAgKG9uZW9mID8gb25lb2YtPmluZGV4KCkgOiBlbnRyeS5oYXNiaXRfaWR4KSwgZW50cnkuYXV4X2lkeCk7CisgICAgICBGb3JtYXRGaWVsZEtpbmQoZm9ybWF0LCBlbnRyeSwgb3B0aW9uc18sIHNjY19hbmFseXplcl8pOworICAgIH0KKyAgICBmb3JtYXQoIn0sXG4iKTsKKyAgfQorfQorCitzdGF0aWMgY29uc3RleHByIGludCBrTWF4TmFtZUxlbmd0aCA9IDI1NTsKKworaW50IFBhcnNlRnVuY3Rpb25HZW5lcmF0b3I6OkNhbGN1bGF0ZUZpZWxkTmFtZXNTaXplKCkgY29uc3QgeworICAvLyBUaGUgZnVsbCBuYW1lIG9mIHRoZSBtZXNzYWdlIGFwcGVhcnMgZmlyc3QuCisgIGludCBzaXplID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8aW50PihkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkuc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBrTWF4TmFtZUxlbmd0aCk7CisgIGludCBsZW5ndGhzX3NpemUgPSAxOworICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogdGNfdGFibGVfaW5mb18tPmZpZWxkX2VudHJpZXMpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZW50cnkuZmllbGQ7CisgICAgR09PR0xFX0NIRUNLX0xFKGZpZWxkLT5uYW1lKCkuc2l6ZSgpLCBrTWF4TmFtZUxlbmd0aCk7CisgICAgc2l6ZSArPSBmaWVsZC0+bmFtZSgpLnNpemUoKTsKKyAgICBsZW5ndGhzX3NpemUgKz0gMTsKKyAgfQorICAvLyBhbGlnbiB0byBhbiA4LWJ5dGUgYm91bmRhcnkKKyAgbGVuZ3Roc19zaXplID0gKGxlbmd0aHNfc2l6ZSArIDcpICYgLTg7CisgIHJldHVybiBzaXplICsgbGVuZ3Roc19zaXplICsgMTsKK30KKworc3RhdGljIHZvaWQgRm9ybWF0T2N0YWwoRm9ybWF0dGVyJiBmb3JtYXQsIGludCBzaXplKSB7CisgIGludCBvY3RhbF9zaXplID0gKChzaXplID4+IDYpICYgMykgKiAxMDAgKyAgLy8KKyAgICAgICAgICAgICAgICAgICAoKHNpemUgPj4gMykgJiA3KSAqIDEwICsgICAvLworICAgICAgICAgICAgICAgICAgICgoc2l6ZSA+PiAwKSAmIDcpOworICBmb3JtYXQoIlxcJDEkIiwgb2N0YWxfc2l6ZSk7Cit9CisKK3ZvaWQgUGFyc2VGdW5jdGlvbkdlbmVyYXRvcjo6R2VuZXJhdGVGaWVsZE5hbWVzKEZvcm1hdHRlciYgZm9ybWF0KSB7CisgIC8vIEZpcnN0LCB3ZSBvdXRwdXQgdGhlIHNpemUgb2YgZWFjaCBzdHJpbmcsIGFzIGFuIHVuc2lnbmVkIGJ5dGUuIFRoZSBmaXJzdAorICAvLyBzdHJpbmcgaXMgdGhlIG1lc3NhZ2UgbmFtZS4KKyAgaW50IGNvdW50ID0gMTsKKyAgZm9ybWF0KCJcIiIpOworICBGb3JtYXRPY3RhbChmb3JtYXQsCisgICAgICAgICAgICAgIHN0ZDo6bWluKHN0YXRpY19jYXN0PGludD4oZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpLnNpemUoKSksIDI1NSkpOworICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogdGNfdGFibGVfaW5mb18tPmZpZWxkX2VudHJpZXMpIHsKKyAgICBGb3JtYXRPY3RhbChmb3JtYXQsIGVudHJ5LmZpZWxkLT5uYW1lKCkuc2l6ZSgpKTsKKyAgICArK2NvdW50OworICB9CisgIHdoaWxlIChjb3VudCAmIDcpIHsgIC8vIGFsaWduIHRvIGFuIDgtYnl0ZSBib3VuZGFyeQorICAgIGZvcm1hdCgiXFwwIik7CisgICAgKytjb3VudDsKKyAgfQorICBmb3JtYXQoIlwiXG4iKTsKKyAgLy8gVGhlIG1lc3NhZ2UgbmFtZSBpcyBzdG9yZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nCisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VfbmFtZSA9IGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKTsKKyAgaWYgKG1lc3NhZ2VfbmFtZS5zaXplKCkgPiBrTWF4TmFtZUxlbmd0aCkgeworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtOYW1lSGFsZkxlbmd0aCA9IChrTWF4TmFtZUxlbmd0aCAtIDMpIC8gMjsKKyAgICBtZXNzYWdlX25hbWUgPSBTdHJDYXQoCisgICAgICAgIG1lc3NhZ2VfbmFtZS5zdWJzdHIoMCwga05hbWVIYWxmTGVuZ3RoKSwgIi4uLiIsCisgICAgICAgIG1lc3NhZ2VfbmFtZS5zdWJzdHIobWVzc2FnZV9uYW1lLnNpemUoKSAtIGtOYW1lSGFsZkxlbmd0aCkpOworICB9CisgIGZvcm1hdCgiXCIkMSRcIlxuIiwgbWVzc2FnZV9uYW1lKTsKKyAgLy8gVGhlbiB3ZSBvdXRwdXQgdGhlIGFjdHVhbCBmaWVsZCBuYW1lcworICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogdGNfdGFibGVfaW5mb18tPmZpZWxkX2VudHJpZXMpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZW50cnkuZmllbGQ7CisgICAgZm9ybWF0KCJcIiQxJFwiXG4iLCBmaWVsZC0+bmFtZSgpKTsKKyAgfQorfQorCit2b2lkIFBhcnNlRnVuY3Rpb25HZW5lcmF0b3I6OkdlbmVyYXRlQXJlbmFTdHJpbmcoRm9ybWF0dGVyJiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBpZiAoSGFzSGFzYml0KGZpZWxkKSkgeworICAgIGZvcm1hdCgiX0ludGVybmFsOjpzZXRfaGFzXyQxJCgmJGhhc19iaXRzJCk7XG4iLCBGaWVsZE5hbWUoZmllbGQpKTsKKyAgfQorICBmb3JtYXQoCisgICAgICAiaWYgKGFyZW5hICE9IG51bGxwdHIpIHtcbiIKKyAgICAgICIgIHB0ciA9IGN0eC0+UmVhZEFyZW5hU3RyaW5nKHB0ciwgJiRtc2ckJGZpZWxkJCwgYXJlbmEiKTsKKyAgaWYgKElzU3RyaW5nSW5saW5lZChmaWVsZCwgb3B0aW9uc18pKSB7CisgICAgR09PR0xFX0RDSEVDSyghaW5saW5lZF9zdHJpbmdfaW5kaWNlc18uZW1wdHkoKSk7CisgICAgaW50IGlubGluZWRfc3RyaW5nX2luZGV4ID0gaW5saW5lZF9zdHJpbmdfaW5kaWNlc19bZmllbGQtPmluZGV4KCldOworICAgIEdPT0dMRV9EQ0hFQ0tfR1QoaW5saW5lZF9zdHJpbmdfaW5kZXgsIDApOworICAgIGZvcm1hdCgiLCAmJG1zZyQkaW5saW5lZF9zdHJpbmdfZG9uYXRlZF9hcnJheSRbMF0sICQxJCwgJHRoaXMkIiwKKyAgICAgICAgICAgaW5saW5lZF9zdHJpbmdfaW5kZXgpOworICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0soZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKSk7CisgIH0KKyAgZm9ybWF0KAorICAgICAgIik7XG4iCisgICAgICAifSBlbHNlIHtcbiIKKyAgICAgICIgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKCIKKyAgICAgICIkbXNnJCRmaWVsZCQuTXV0YWJsZU5vQ29weShudWxscHRyKSwgcHRyLCBjdHgpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJjb25zdCBzdGQ6OnN0cmluZyogc3RyID0gJiRtc2ckJGZpZWxkJC5HZXQoKTsgKHZvaWQpc3RyO1xuIik7Cit9CisKK3ZvaWQgUGFyc2VGdW5jdGlvbkdlbmVyYXRvcjo6R2VuZXJhdGVTdHJpbmdzKEZvcm1hdHRlciYgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2hlY2tfdXRmOCkgeworICBGaWVsZE9wdGlvbnM6OkNUeXBlIGN0eXBlID0gRmllbGRPcHRpb25zOjpTVFJJTkc7CisgIGlmICghb3B0aW9uc18ub3BlbnNvdXJjZV9ydW50aW1lKSB7CisgICAgLy8gT3BlbiBzb3VyY2UgZG9lc24ndCBzdXBwb3J0IG90aGVyIGN0eXBlczsKKyAgICBjdHlwZSA9IGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKTsKKyAgfQorICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpICYmICFvcHRpb25zXy5vcGVuc291cmNlX3J1bnRpbWUgJiYKKyAgICAgIEdldE9wdGltaXplRm9yKGZpZWxkLT5maWxlKCksIG9wdGlvbnNfKSAhPSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FICYmCisgICAgICAvLyBGb3Igbm93IG9ubHkgdXNlIGFyZW5hIHN0cmluZyBmb3Igc3RyaW5ncyB3aXRoIGVtcHR5IGRlZmF1bHRzLgorICAgICAgZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKSAmJgorICAgICAgIWZpZWxkLT5yZWFsX2NvbnRhaW5pbmdfb25lb2YoKSAmJiBjdHlwZSA9PSBGaWVsZE9wdGlvbnM6OlNUUklORykgeworICAgIEdlbmVyYXRlQXJlbmFTdHJpbmcoZm9ybWF0LCBmaWVsZCk7CisgIH0gZWxzZSB7CisgICAgc3RkOjpzdHJpbmcgcGFyc2VyX25hbWU7CisgICAgc3dpdGNoIChjdHlwZSkgeworICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgcGFyc2VyX25hbWUgPSAiR3JlZWR5U3RyaW5nUGFyc2VyIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6Q09SRDoKKyAgICAgICAgcGFyc2VyX25hbWUgPSAiQ29yZFBhcnNlciI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklOR19QSUVDRToKKyAgICAgICAgcGFyc2VyX25hbWUgPSAiU3RyaW5nUGllY2VQYXJzZXIiOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZm9ybWF0KAorICAgICAgICAiYXV0byBzdHIgPSAkbXNnJCQxJCQyJF8kbmFtZSQoKTtcbiIKKyAgICAgICAgInB0ciA9IDo6X3BiaTo6SW5saW5lJDMkKHN0ciwgcHRyLCBjdHgpO1xuIiwKKyAgICAgICAgSGFzSW50ZXJuYWxBY2Nlc3NvcnMoY3R5cGUpID8gIl9pbnRlcm5hbF8iIDogIiIsCisgICAgICAgIGZpZWxkLT5pc19yZXBlYXRlZCgpICYmICFmaWVsZC0+aXNfcGFja2FibGUoKSA/ICJhZGQiIDogIm11dGFibGUiLAorICAgICAgICBwYXJzZXJfbmFtZSk7CisgIH0KKyAgLy8gSXQgaXMgaW50ZW50aW9uYWxseSBwbGFjZWQgYmVmb3JlIFZlcmlmeVVURjggYmVjYXVzZSBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UKKyAgLy8gdG8gdmVyaWZ5IFVURjggd2hlbiB3ZSBhbHJlYWR5IGtub3cgcGFyc2luZyBmYWlsZWQuCisgIGZvcm1hdCgiQ0hLXyhwdHIpO1xuIik7CisgIGlmICghY2hlY2tfdXRmOCkgcmV0dXJuOyAgLy8gcmV0dXJuIGlmIHRoaXMgaXMgYSBieXRlcyBmaWVsZAorICBhdXRvIGxldmVsID0gR2V0VXRmOENoZWNrTW9kZShmaWVsZCwgb3B0aW9uc18pOworICBzd2l0Y2ggKGxldmVsKSB7CisgICAgY2FzZSBVdGY4Q2hlY2tNb2RlOjprTm9uZToKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFV0ZjhDaGVja01vZGU6OmtWZXJpZnk6CisgICAgICBmb3JtYXQoIiNpZm5kZWYgTkRFQlVHXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVXRmOENoZWNrTW9kZTo6a1N0cmljdDoKKyAgICAgIGZvcm1hdCgiQ0hLXygiKTsKKyAgICAgIGJyZWFrOworICB9CisgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWU7CisgIGZpZWxkX25hbWUgPSAibnVsbHB0ciI7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWVsZC0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICBmaWVsZF9uYW1lID0gU3RyQ2F0KCJcIiIsIGZpZWxkLT5mdWxsX25hbWUoKSwgIlwiIik7CisgIH0KKyAgZm9ybWF0KCI6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAkMSQpIiwgZmllbGRfbmFtZSk7CisgIHN3aXRjaCAobGV2ZWwpIHsKKyAgICBjYXNlIFV0ZjhDaGVja01vZGU6OmtOb25lOgorICAgICAgcmV0dXJuOworICAgIGNhc2UgVXRmOENoZWNrTW9kZTo6a1ZlcmlmeToKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAiO1xuIgorICAgICAgICAgICIjZW5kaWYgIC8vICFOREVCVUdcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVdGY4Q2hlY2tNb2RlOjprU3RyaWN0OgorICAgICAgZm9ybWF0KCIpO1xuIik7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkIFBhcnNlRnVuY3Rpb25HZW5lcmF0b3I6OkdlbmVyYXRlTGVuZ3RoRGVsaW0oRm9ybWF0dGVyJiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBpZiAoZmllbGQtPmlzX3BhY2thYmxlKCkpIHsKKyAgICBpZiAoZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAmJgorICAgICAgICAhSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKGZpZWxkKSkgeworICAgICAgc3RkOjpzdHJpbmcgZW51bV90eXBlID0gUXVhbGlmaWVkQ2xhc3NOYW1lKGZpZWxkLT5lbnVtX3R5cGUoKSwgb3B0aW9uc18pOworICAgICAgZm9ybWF0KAorICAgICAgICAgICJwdHIgPSAiCisgICAgICAgICAgIjo6JHByb3RvX25zJDo6aW50ZXJuYWw6OlBhY2tlZCQxJFBhcnNlcjwkdW5rbm93bl9maWVsZHNfdHlwZSQ+KCIKKyAgICAgICAgICAiJG1zZyRfaW50ZXJuYWxfbXV0YWJsZV8kbmFtZSQoKSwgcHRyLCBjdHgsICQyJF9Jc1ZhbGlkLCAiCisgICAgICAgICAgIiYkbXNnJF9pbnRlcm5hbF9tZXRhZGF0YV8sICQzJCk7XG4iLAorICAgICAgICAgIERlY2xhcmVkVHlwZU1ldGhvZE5hbWUoZmllbGQtPnR5cGUoKSksIGVudW1fdHlwZSwgZmllbGQtPm51bWJlcigpKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9ybWF0KAorICAgICAgICAgICJwdHIgPSA6OiRwcm90b19ucyQ6OmludGVybmFsOjpQYWNrZWQkMSRQYXJzZXIoIgorICAgICAgICAgICIkbXNnJF9pbnRlcm5hbF9tdXRhYmxlXyRuYW1lJCgpLCBwdHIsIGN0eCk7XG4iLAorICAgICAgICAgIERlY2xhcmVkVHlwZU1ldGhvZE5hbWUoZmllbGQtPnR5cGUoKSkpOworICAgIH0KKyAgICBmb3JtYXQoIkNIS18ocHRyKTtcbiIpOworICB9IGVsc2UgeworICAgIGF1dG8gZmllbGRfdHlwZSA9IGZpZWxkLT50eXBlKCk7CisgICAgc3dpdGNoIChmaWVsZF90eXBlKSB7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6CisgICAgICAgIEdlbmVyYXRlU3RyaW5ncyhmb3JtYXQsIGZpZWxkLCB0cnVlIC8qIHV0ZjggKi8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTOgorICAgICAgICBHZW5lcmF0ZVN0cmluZ3MoZm9ybWF0LCBmaWVsZCwgZmFsc2UgLyogdXRmOCAqLyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRTogeworICAgICAgICBpZiAoZmllbGQtPmlzX21hcCgpKSB7CisgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWwgPSBmaWVsZC0+bWVzc2FnZV90eXBlKCktPm1hcF92YWx1ZSgpOworICAgICAgICAgIEdPT0dMRV9DSEVDSyh2YWwpOworICAgICAgICAgIGlmICh2YWwtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAmJgorICAgICAgICAgICAgICAhSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKGZpZWxkKSkgeworICAgICAgICAgICAgZm9ybWF0KAorICAgICAgICAgICAgICAgICJhdXRvIG9iamVjdCA9ICIKKyAgICAgICAgICAgICAgICAiOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6SW5pdEVudW1QYXJzZVdyYXBwZXI8IgorICAgICAgICAgICAgICAgICIkdW5rbm93bl9maWVsZHNfdHlwZSQ+KCYkbXNnJCRmaWVsZCQsICQxJF9Jc1ZhbGlkLCAiCisgICAgICAgICAgICAgICAgIiQyJCwgJiRtc2ckX2ludGVybmFsX21ldGFkYXRhXyk7XG4iCisgICAgICAgICAgICAgICAgInB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKCZvYmplY3QsIHB0cik7XG4iLAorICAgICAgICAgICAgICAgIFF1YWxpZmllZENsYXNzTmFtZSh2YWwtPmVudW1fdHlwZSgpLCBvcHRpb25zXyksCisgICAgICAgICAgICAgICAgZmllbGQtPm51bWJlcigpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9ybWF0KCJwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZSgmJG1zZyQkZmllbGQkLCBwdHIpO1xuIik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKElzTGF6eShmaWVsZCwgb3B0aW9uc18sIHNjY19hbmFseXplcl8pKSB7CisgICAgICAgICAgYm9vbCBlYWdlcl92ZXJpZnkgPQorICAgICAgICAgICAgICBJc0VhZ2VybHlWZXJpZmllZExhenkoZmllbGQsIG9wdGlvbnNfLCBzY2NfYW5hbHl6ZXJfKTsKKyAgICAgICAgICBpZiAoU2hvdWxkVmVyaWZ5KGRlc2NyaXB0b3JfLCBvcHRpb25zXywgc2NjX2FuYWx5emVyXykpIHsKKyAgICAgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICAgICAiY3R4LT5zZXRfbGF6eV9lYWdlcl92ZXJpZnlfZnVuYygkMSQpO1xuIiwKKyAgICAgICAgICAgICAgICBlYWdlcl92ZXJpZnkKKyAgICAgICAgICAgICAgICAgICAgPyBTdHJDYXQoIiYiLCBDbGFzc05hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjo6SW50ZXJuYWxWZXJpZnkiKQorICAgICAgICAgICAgICAgICAgICA6ICJudWxscHRyIik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChmaWVsZC0+cmVhbF9jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICAgICAiaWYgKCEkbXNnJF9pbnRlcm5hbF9oYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICAgICAgICAgICAiICAkbXNnJGNsZWFyXyQxJCgpO1xuIgorICAgICAgICAgICAgICAgICIgICRtc2ckJGZpZWxkJCA9IDo6JHByb3RvX25zJDo6QXJlbmE6OkNyZWF0ZU1lc3NhZ2U8XG4iCisgICAgICAgICAgICAgICAgIiAgICAgIDo6JHByb3RvX25zJDo6aW50ZXJuYWw6OkxhenlGaWVsZD4oIgorICAgICAgICAgICAgICAgICIkbXNnJEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTtcbiIKKyAgICAgICAgICAgICAgICAiICAkbXNnJHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAiYXV0byogbGF6eV9maWVsZCA9ICRtc2ckJGZpZWxkJDtcbiIsCisgICAgICAgICAgICAgICAgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKS0+bmFtZSgpKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKEhhc0hhc2JpdChmaWVsZCkpIHsKKyAgICAgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICAgICAiX0ludGVybmFsOjpzZXRfaGFzXyRuYW1lJCgmJGhhc19iaXRzJCk7XG4iCisgICAgICAgICAgICAgICAgImF1dG8qIGxhenlfZmllbGQgPSAmJG1zZyQkZmllbGQkO1xuIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcm1hdCgiYXV0byogbGF6eV9maWVsZCA9ICYkbXNnJCRmaWVsZCQ7XG4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9ybWF0KAorICAgICAgICAgICAgICAiOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6TGF6eUZpZWxkUGFyc2VIZWxwZXI8XG4iCisgICAgICAgICAgICAgICIgIDo6JHByb3RvX25zJDo6aW50ZXJuYWw6OkxhenlGaWVsZD4gcGFyc2VfaGVscGVyKFxuIgorICAgICAgICAgICAgICAiICAgICQxJDo6ZGVmYXVsdF9pbnN0YW5jZSgpLFxuIgorICAgICAgICAgICAgICAiICAgICRtc2ckR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCksXG4iCisgICAgICAgICAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TGF6eVZlcmlmeU9wdGlvbjo6JDIkLFxuIgorICAgICAgICAgICAgICAiICAgIGxhenlfZmllbGQpO1xuIgorICAgICAgICAgICAgICAicHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoJnBhcnNlX2hlbHBlciwgcHRyKTtcbiIsCisgICAgICAgICAgICAgIEZpZWxkTWVzc2FnZVR5cGVOYW1lKGZpZWxkLCBvcHRpb25zXyksCisgICAgICAgICAgICAgIGVhZ2VyX3ZlcmlmeSA/ICJrRWFnZXIiIDogImtMYXp5Iik7CisgICAgICAgICAgaWYgKFNob3VsZFZlcmlmeShkZXNjcmlwdG9yXywgb3B0aW9uc18sIHNjY19hbmFseXplcl8pICYmCisgICAgICAgICAgICAgIGVhZ2VyX3ZlcmlmeSkgeworICAgICAgICAgICAgZm9ybWF0KCJjdHgtPnNldF9sYXp5X2VhZ2VyX3ZlcmlmeV9mdW5jKG51bGxwdHIpO1xuIik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKElzSW1wbGljaXRXZWFrRmllbGQoZmllbGQsIG9wdGlvbnNfLCBzY2NfYW5hbHl6ZXJfKSkgeworICAgICAgICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICAgICAicHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX0ludGVybmFsOjptdXRhYmxlXyRuYW1lJCgkdGhpcyQpLCAiCisgICAgICAgICAgICAgICAgInB0cik7XG4iKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9ybWF0KAorICAgICAgICAgICAgICAgICJwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZSgkbXNnJCRmaWVsZCQuQWRkV2VhaygiCisgICAgICAgICAgICAgICAgInJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgOjokcHJvdG9fbnMkOjpNZXNzYWdlTGl0ZSo+KCQxJHB0cl8pIgorICAgICAgICAgICAgICAgICIpLCBwdHIpO1xuIiwKKyAgICAgICAgICAgICAgICBRdWFsaWZpZWREZWZhdWx0SW5zdGFuY2VOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgb3B0aW9uc18pKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoSXNXZWFrKGZpZWxkLCBvcHRpb25zXykpIHsKKyAgICAgICAgICBmb3JtYXQoCisgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICIgIGF1dG8qIGRlZmF1bHRfID0gJnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVzc2FnZSY+KCQxJCk7XG4iCisgICAgICAgICAgICAgICIgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKCRtc2ckJHdlYWtfZmllbGRfbWFwJC5NdXRhYmxlTWVzc2FnZSgiCisgICAgICAgICAgICAgICIkMiQsIGRlZmF1bHRfKSwgcHRyKTtcbiIKKyAgICAgICAgICAgICAgIn1cbiIsCisgICAgICAgICAgICAgIFF1YWxpZmllZERlZmF1bHRJbnN0YW5jZU5hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCBvcHRpb25zXyksCisgICAgICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9ybWF0KAorICAgICAgICAgICAgICAicHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoJG1zZyRfaW50ZXJuYWxfJG11dGFibGVfZmllbGQkKCksICIKKyAgICAgICAgICAgICAgInB0cik7XG4iKTsKKyAgICAgICAgfQorICAgICAgICBmb3JtYXQoIkNIS18ocHRyKTtcbiIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJJbGxlZ2FsIGNvbWJpbmF0aW9uIGZvciBsZW5ndGggZGVsaW1pdGVkIHdpcmV0eXBlICIKKyAgICAgICAgICAgICAgICAgICA8PCAiIGZpbGVkIHR5cGUgaXMgIiA8PCBmaWVsZC0+dHlwZSgpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgYm9vbCBTaG91bGRSZXBlYXQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSB3aXJldHlwZSkgeworICBjb25zdGV4cHIgaW50IGtNYXhUd29CeXRlRmllbGROdW1iZXIgPSAxNiAqIDEyODsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPm51bWJlcigpIDwga01heFR3b0J5dGVGaWVsZE51bWJlciAmJgorICAgICAgICAgZGVzY3JpcHRvci0+aXNfcmVwZWF0ZWQoKSAmJgorICAgICAgICAgKCFkZXNjcmlwdG9yLT5pc19wYWNrYWJsZSgpIHx8CisgICAgICAgICAgd2lyZXR5cGUgIT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworfQorCit2b2lkIFBhcnNlRnVuY3Rpb25HZW5lcmF0b3I6OkdlbmVyYXRlRmllbGRCb2R5KAorICAgIEZvcm1hdHRlciYgZm9ybWF0LCBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgd2lyZXR5cGUsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBGb3JtYXR0ZXI6OlNhdmVTdGF0ZSBmb3JtYXR0ZXJfc3RhdGUoJmZvcm1hdCk7CisgIGZvcm1hdC5BZGRNYXAoCisgICAgICB7eyJuYW1lIiwgRmllbGROYW1lKGZpZWxkKX0sCisgICAgICAgeyJwcmltaXRpdmVfdHlwZSIsIFByaW1pdGl2ZVR5cGVOYW1lKG9wdGlvbnNfLCBmaWVsZC0+Y3BwX3R5cGUoKSl9fSk7CisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIGZvcm1hdC5BZGRNYXAoe3sicHV0X2ZpZWxkIiwgU3RyQ2F0KCJhZGRfIiwgRmllbGROYW1lKGZpZWxkKSl9LAorICAgICAgICAgICAgICAgICAgIHsibXV0YWJsZV9maWVsZCIsIFN0ckNhdCgiYWRkXyIsIEZpZWxkTmFtZShmaWVsZCkpfX0pOworICB9IGVsc2UgeworICAgIGZvcm1hdC5BZGRNYXAoCisgICAgICAgIHt7InB1dF9maWVsZCIsIFN0ckNhdCgic2V0XyIsIEZpZWxkTmFtZShmaWVsZCkpfSwKKyAgICAgICAgIHsibXV0YWJsZV9maWVsZCIsIFN0ckNhdCgibXV0YWJsZV8iLCBGaWVsZE5hbWUoZmllbGQpKX19KTsKKyAgfQorICB1aW50MzJfdCB0YWcgPSBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC0+bnVtYmVyKCksIHdpcmV0eXBlKTsKKyAgc3dpdGNoICh3aXJldHlwZSkgeworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVDogeworICAgICAgc3RkOjpzdHJpbmcgdHlwZSA9IFByaW1pdGl2ZVR5cGVOYW1lKG9wdGlvbnNfLCBmaWVsZC0+Y3BwX3R5cGUoKSk7CisgICAgICBpZiAoZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSkgeworICAgICAgICBmb3JtYXQuU2V0KCJlbnVtX3R5cGUiLAorICAgICAgICAgICAgICAgICAgIFF1YWxpZmllZENsYXNzTmFtZShmaWVsZC0+ZW51bV90eXBlKCksIG9wdGlvbnNfKSk7CisgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICIkdWludDY0JCB2YWwgPSA6OiRwcm90b19ucyQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7XG4iCisgICAgICAgICAgICAiQ0hLXyhwdHIpO1xuIik7CisgICAgICAgIGlmICghSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKGZpZWxkKSkgeworICAgICAgICAgIGZvcm1hdCgiaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRSgkZW51bV90eXBlJF9Jc1ZhbGlkKHZhbCkpKSB7XG4iKTsKKyAgICAgICAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9ybWF0KCIkbXNnJF9pbnRlcm5hbF8kcHV0X2ZpZWxkJChzdGF0aWNfY2FzdDwkZW51bV90eXBlJD4odmFsKSk7XG4iKTsKKyAgICAgICAgaWYgKCFIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoZmllbGQpKSB7CisgICAgICAgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICAgICAgICBmb3JtYXQoCisgICAgICAgICAgICAgICJ9IGVsc2Uge1xuIgorICAgICAgICAgICAgICAiICA6OiRwcm90b19ucyQ6OmludGVybmFsOjpXcml0ZVZhcmludCgiCisgICAgICAgICAgICAgICIkMSQsIHZhbCwgJG1zZyRtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpO1xuIgorICAgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICAgZmllbGQtPm51bWJlcigpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2l6ZSA9IChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIzMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI2NCI7CisgICAgICAgIHN0ZDo6c3RyaW5nIHppZ3phZzsKKyAgICAgICAgaWYgKChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzIgfHwKKyAgICAgICAgICAgICBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQpKSB7CisgICAgICAgICAgemlnemFnID0gIlppZ1phZyI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpIHx8IGZpZWxkLT5yZWFsX2NvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgICAgIGZvcm1hdCgKKyAgICAgICAgICAgICAgIiRtc2ckX2ludGVybmFsXyRwdXRfZmllbGQkKCIKKyAgICAgICAgICAgICAgIjo6JHByb3RvX25zJDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQkMSQkMiQoJnB0cikpO1xuIgorICAgICAgICAgICAgICAiQ0hLXyhwdHIpO1xuIiwKKyAgICAgICAgICAgICAgemlnemFnLCBzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoSGFzSGFzYml0KGZpZWxkKSkgeworICAgICAgICAgICAgZm9ybWF0KCJfSW50ZXJuYWw6OnNldF9oYXNfJG5hbWUkKCYkaGFzX2JpdHMkKTtcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3JtYXQoCisgICAgICAgICAgICAgICIkbXNnJCRmaWVsZCQgPSA6OiRwcm90b19ucyQ6OmludGVybmFsOjpSZWFkVmFyaW50JDEkJDIkKCZwdHIpO1xuIgorICAgICAgICAgICAgICAiQ0hLXyhwdHIpO1xuIiwKKyAgICAgICAgICAgICAgemlnemFnLCBzaXplKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzI6CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NDogeworICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpIHx8IGZpZWxkLT5yZWFsX2NvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgICBmb3JtYXQoCisgICAgICAgICAgICAiJG1zZyRfaW50ZXJuYWxfJHB1dF9maWVsZCQoIgorICAgICAgICAgICAgIjo6JHByb3RvX25zJDo6aW50ZXJuYWw6OlVuYWxpZ25lZExvYWQ8JHByaW1pdGl2ZV90eXBlJD4ocHRyKSk7XG4iCisgICAgICAgICAgICAicHRyICs9IHNpemVvZigkcHJpbWl0aXZlX3R5cGUkKTtcbiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKEhhc0hhc2JpdChmaWVsZCkpIHsKKyAgICAgICAgICBmb3JtYXQoIl9JbnRlcm5hbDo6c2V0X2hhc18kbmFtZSQoJiRoYXNfYml0cyQpO1xuIik7CisgICAgICAgIH0KKyAgICAgICAgZm9ybWF0KAorICAgICAgICAgICAgIiRtc2ckJGZpZWxkJCA9ICIKKyAgICAgICAgICAgICI6OiRwcm90b19ucyQ6OmludGVybmFsOjpVbmFsaWduZWRMb2FkPCRwcmltaXRpdmVfdHlwZSQ+KHB0cik7XG4iCisgICAgICAgICAgICAicHRyICs9IHNpemVvZigkcHJpbWl0aXZlX3R5cGUkKTtcbiIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6IHsKKyAgICAgIEdlbmVyYXRlTGVuZ3RoRGVsaW0oZm9ybWF0LCBmaWVsZCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVA6IHsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAicHRyID0gY3R4LT5QYXJzZUdyb3VwKCRtc2ckX2ludGVybmFsXyRtdXRhYmxlX2ZpZWxkJCgpLCBwdHIsICQxJCk7XG4iCisgICAgICAgICAgIkNIS18ocHRyKTtcbiIsCisgICAgICAgICAgdGFnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVA6IHsKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBoYXZlIGVuZCBncm91cCBmaWVsZFxuIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSAgLy8gc3dpdGNoICh3aXJlX3R5cGUpCit9CisKKy8vIFJldHVybnMgdGhlIHRhZyBmb3IgdGhpcyBmaWVsZCBhbmQgaW4gY2FzZSBvZiByZXBlYXRlZCBwYWNrYWJsZSBmaWVsZHMsCisvLyBzZXRzIGEgZmFsbGJhY2sgdGFnIGluIGZhbGxiYWNrX3RhZ19wdHIuCitzdGF0aWMgdWludDMyX3QgRXhwZWN0ZWRUYWcoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZmFsbGJhY2tfdGFnX3B0cikgeworICB1aW50MzJfdCBleHBlY3RlZF90YWc7CisgIGlmIChmaWVsZC0+aXNfcGFja2FibGUoKSkgeworICAgIGF1dG8gZXhwZWN0ZWRfd2lyZXR5cGUgPSBXaXJlRm9ybWF0OjpXaXJlVHlwZUZvckZpZWxkVHlwZShmaWVsZC0+dHlwZSgpKTsKKyAgICBleHBlY3RlZF90YWcgPSBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC0+bnVtYmVyKCksIGV4cGVjdGVkX3dpcmV0eXBlKTsKKyAgICBHT09HTEVfQ0hFQ0soZXhwZWN0ZWRfd2lyZXR5cGUgIT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICAgIGF1dG8gZmFsbGJhY2tfd2lyZXR5cGUgPSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDsKKyAgICB1aW50MzJfdCBmYWxsYmFja190YWcgPQorICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC0+bnVtYmVyKCksIGZhbGxiYWNrX3dpcmV0eXBlKTsKKworICAgIGlmIChmaWVsZC0+aXNfcGFja2VkKCkpIHN0ZDo6c3dhcChleHBlY3RlZF90YWcsIGZhbGxiYWNrX3RhZyk7CisgICAgKmZhbGxiYWNrX3RhZ19wdHIgPSBmYWxsYmFja190YWc7CisgIH0gZWxzZSB7CisgICAgYXV0byBleHBlY3RlZF93aXJldHlwZSA9IFdpcmVGb3JtYXQ6OldpcmVUeXBlRm9yRmllbGQoZmllbGQpOworICAgIGV4cGVjdGVkX3RhZyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLT5udW1iZXIoKSwgZXhwZWN0ZWRfd2lyZXR5cGUpOworICB9CisgIHJldHVybiBleHBlY3RlZF90YWc7Cit9CisKKy8vIFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCBieSB0aGUgZ2VuZXJhdGVkIHBhcnNlIGl0ZXJhdGlvbiwgYW5kIG11c3QgYWxyZWFkeQorLy8gYmUgZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGU6CisvLyAtIGBjb25zdCBjaGFyKiBwdHJgOiB0aGUgaW5wdXQgYnVmZmVyLgorLy8gLSBgUGFyc2VDb250ZXh0KiBjdHhgOiB0aGUgYXNzb2NpYXRlZCBjb250ZXh0IGZvciBgcHRyYC4KKy8vIC0gaW1wbGljaXQgYHRoaXNgOiBpLmUuLCB3ZSBtdXN0IGJlIGluIGEgbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24uCisvLworLy8gVGhlIG1hY3JvIGBDSEtfKHgpYCBtdXN0IGJlIGRlZmluZWQuIEl0IHNob3VsZCByZXR1cm4gYW4gZXJyb3IgY29uZGl0aW9uIGlmCisvLyB0aGUgbWFjcm8gcGFyYW1ldGVyIGlzIGZhbHNlLgorLy8KKy8vIFdoZW5ldmVyIGFuIEVORF9HUk9VUCB0YWcgd2FzIHJlYWQsIG9yIHRhZyAwIHdhcyByZWFkLCB0aGUgZ2VuZXJhdGVkIGNvZGUKKy8vIGJyYW5jaGVzIHRvIHRoZSBsYWJlbCBgbWVzc2FnZV9kb25lYC4KKy8vCisvLyBUaGVzZSBmb3JtYXR0ZXIgdmFyaWFibGVzIGFyZSB1c2VkOgorLy8gLSBgbmV4dF90YWdgOiBhIHNpbmdsZSBzdGF0ZW1lbnQgdG8gYmVnaW4gcGFyc2luZyB0aGUgbmV4dCB0YWcuCisvLworLy8gQXQgdGhlIGVuZCBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24gc2hvdWxkIHByb2NlZWQgdG8KKy8vIHBhcnNlIHRoZSBuZXh0IHRhZyBpbiB0aGUgc3RyZWFtLgordm9pZCBQYXJzZUZ1bmN0aW9uR2VuZXJhdG9yOjpHZW5lcmF0ZVBhcnNlSXRlcmF0aW9uQm9keSgKKyAgICBGb3JtYXR0ZXImIGZvcm1hdCwgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgZmllbGRzKSB7CisgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICBHZW5lcmF0ZUZpZWxkU3dpdGNoKGZvcm1hdCwgZmllbGRzKTsKKyAgICAvLyBFYWNoIGZpZWxkIGBjYXNlYCBvbmx5IGNvbnNpZGVycyBmaWVsZCBudW1iZXIuIEZpZWxkIG51bWJlcnMgdGhhdCBhcmUKKyAgICAvLyBub3QgZGVmaW5lZCBpbiB0aGUgbWVzc2FnZSwgb3IgdGFncyB3aXRoIGFuIGluY29tcGF0aWJsZSB3aXJlIHR5cGUsIGFyZQorICAgIC8vIGNvbnNpZGVyZWQgInVudXN1YWwiIGNhc2VzLiBUaGV5IHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgbG9naWMgYmVsb3cuCisgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICBmb3JtYXQoImhhbmRsZV91bnVzdWFsOlxuIik7CisgICAgZm9ybWF0LkluZGVudCgpOworICB9CisKKyAgLy8gVW51c3VhbC9leHRlbnNpb24vdW5rbm93biBjYXNlOgorICBmb3JtYXQoCisgICAgICAiaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkge1xuIgorICAgICAgIiAgQ0hLXyhwdHIpO1xuIgorICAgICAgIiAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7XG4iCisgICAgICAiICBnb3RvIG1lc3NhZ2VfZG9uZTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgaWYgKElzTWFwRW50cnlNZXNzYWdlKGRlc2NyaXB0b3IpKSB7CisgICAgZm9ybWF0KCIkbmV4dF90YWckO1xuIik7CisgIH0gZWxzZSB7CisgICAgaWYgKGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgICAgZm9ybWF0KCJpZiAoIik7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlID0KKyAgICAgICAgICAgIGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9yYW5nZShpKTsKKyAgICAgICAgaWYgKGkgPiAwKSBmb3JtYXQoIiB8fFxuICAgICIpOworCisgICAgICAgIHVpbnQzMl90IHN0YXJ0X3RhZyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgICAgICAgcmFuZ2UtPnN0YXJ0LCBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGU+KDApKTsKKyAgICAgICAgdWludDMyX3QgZW5kX3RhZyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgICAgICAgcmFuZ2UtPmVuZCwgc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6OldpcmVUeXBlPigwKSk7CisKKyAgICAgICAgaWYgKHJhbmdlLT5lbmQgPiBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIpIHsKKyAgICAgICAgICBmb3JtYXQoIigkMSR1IDw9IHRhZykiLCBzdGFydF90YWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvcm1hdCgiKCQxJHUgPD0gdGFnICYmIHRhZyA8ICQyJHUpIiwgc3RhcnRfdGFnLCBlbmRfdGFnKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9ybWF0KAorICAgICAgICAgICIpIHtcbiIKKyAgICAgICAgICAiICBwdHIgPSAkbXNnJCRleHRlbnNpb25zJC5QYXJzZUZpZWxkKHRhZywgcHRyLCAiCisgICAgICAgICAgImludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgJiRtc2ckX2ludGVybmFsX21ldGFkYXRhXywgY3R4KTtcbiIKKyAgICAgICAgICAiICBDSEtfKHB0ciAhPSBudWxscHRyKTtcbiIKKyAgICAgICAgICAiICAkbmV4dF90YWckO1xuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICB9CisgICAgZm9ybWF0KAorICAgICAgICAicHRyID0gVW5rbm93bkZpZWxkUGFyc2UoXG4iCisgICAgICAgICIgICAgdGFnLFxuIgorICAgICAgICAiICAgICRtc2ckX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPCIKKyAgICAgICAgIiR1bmtub3duX2ZpZWxkc190eXBlJD4oKSxcbiIKKyAgICAgICAgIiAgICBwdHIsIGN0eCk7XG4iCisgICAgICAgICJDSEtfKHB0ciAhPSBudWxscHRyKTtcbiIpOworICB9Cit9CisKK3ZvaWQgUGFyc2VGdW5jdGlvbkdlbmVyYXRvcjo6R2VuZXJhdGVGaWVsZFN3aXRjaCgKKyAgICBGb3JtYXR0ZXImIGZvcm1hdCwgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGZpZWxkcykgeworICBmb3JtYXQoInN3aXRjaCAodGFnID4+IDMpIHtcbiIpOworICBmb3JtYXQuSW5kZW50KCk7CisKKyAgZm9yIChjb25zdCBhdXRvKiBmaWVsZCA6IGZpZWxkcykgeworICAgIGJvb2wgY29sZCA9IFNob3VsZFNwbGl0KGZpZWxkLCBvcHRpb25zXyk7CisgICAgZm9ybWF0LlNldCgiZmllbGQiLCBGaWVsZE1lbWJlck5hbWUoZmllbGQsIGNvbGQpKTsKKyAgICBQcmludEZpZWxkQ29tbWVudChmb3JtYXQsIGZpZWxkKTsKKyAgICBmb3JtYXQoImNhc2UgJDEkOlxuIiwgZmllbGQtPm51bWJlcigpKTsKKyAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgdWludDMyX3QgZmFsbGJhY2tfdGFnID0gMDsKKyAgICB1aW50MzJfdCBleHBlY3RlZF90YWcgPSBFeHBlY3RlZFRhZyhmaWVsZCwgJmZhbGxiYWNrX3RhZyk7CisgICAgZm9ybWF0KCJpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PCR1aW50OCQ+KHRhZykgPT0gJDEkKSkge1xuIiwKKyAgICAgICAgICAgZXhwZWN0ZWRfdGFnICYgMHhGRik7CisgICAgZm9ybWF0LkluZGVudCgpOworICAgIGlmIChjb2xkKSB7CisgICAgICBmb3JtYXQoIiRtc2ckUHJlcGFyZVNwbGl0TWVzc2FnZUZvcldyaXRlKCk7XG4iKTsKKyAgICB9CisgICAgYXV0byB3aXJldHlwZSA9IFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZShleHBlY3RlZF90YWcpOworICAgIHVpbnQzMl90IHRhZyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLT5udW1iZXIoKSwgd2lyZXR5cGUpOworICAgIGludCB0YWdfc2l6ZSA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKHRhZyk7CisgICAgYm9vbCBpc19yZXBlYXQgPSBTaG91bGRSZXBlYXQoZmllbGQsIHdpcmV0eXBlKTsKKyAgICBpZiAoaXNfcmVwZWF0KSB7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgInB0ciAtPSAkMSQ7XG4iCisgICAgICAgICAgImRvIHtcbiIKKyAgICAgICAgICAiICBwdHIgKz0gJDEkO1xuIiwKKyAgICAgICAgICB0YWdfc2l6ZSk7CisgICAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgfQorICAgIEdlbmVyYXRlRmllbGRCb2R5KGZvcm1hdCwgd2lyZXR5cGUsIGZpZWxkKTsKKyAgICBpZiAoaXNfcmVwZWF0KSB7CisgICAgICBmb3JtYXQuT3V0ZGVudCgpOworICAgICAgZm9ybWF0KAorICAgICAgICAgICIgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrO1xuIgorICAgICAgICAgICJ9IHdoaWxlICg6OiRwcm90b19ucyQ6OmludGVybmFsOjpFeHBlY3RUYWc8JDEkPihwdHIpKTtcbiIsCisgICAgICAgICAgdGFnKTsKKyAgICB9CisgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICBpZiAoZmFsbGJhY2tfdGFnKSB7CisgICAgICBmb3JtYXQoIn0gZWxzZSBpZiAoc3RhdGljX2Nhc3Q8JHVpbnQ4JD4odGFnKSA9PSAkMSQpIHtcbiIsCisgICAgICAgICAgICAgZmFsbGJhY2tfdGFnICYgMHhGRik7CisgICAgICBmb3JtYXQuSW5kZW50KCk7CisgICAgICBHZW5lcmF0ZUZpZWxkQm9keShmb3JtYXQsIFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZShmYWxsYmFja190YWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQpOworICAgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICB9CisgICAgZm9ybWF0KAorICAgICAgICAifSBlbHNlXG4iCisgICAgICAgICIgIGdvdG8gaGFuZGxlX3VudXN1YWw7XG4iCisgICAgICAgICIkbmV4dF90YWckO1xuIik7CisgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgfSAgLy8gZm9yIGxvb3Agb3ZlciBvcmRlcmVkIGZpZWxkcworCisgIGZvcm1hdCgKKyAgICAgICJkZWZhdWx0OlxuIgorICAgICAgIiAgZ290byBoYW5kbGVfdW51c3VhbDtcbiIpOworICBmb3JtYXQuT3V0ZGVudCgpOworICBmb3JtYXQoIn0gIC8vIHN3aXRjaFxuIik7Cit9CisKK25hbWVzcGFjZSB7CisKK3N0ZDo6c3RyaW5nIEZpZWxkUGFyc2VGdW5jdGlvbk5hbWUoCisgICAgY29uc3QgVGFpbENhbGxUYWJsZUluZm86OkZpZWxkRW50cnlJbmZvJiBlbnRyeSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZW50cnkuZmllbGQ7CisgIHN0ZDo6c3RyaW5nIG5hbWUgPSAiOjpfcGJpOjpUY1BhcnNlcjo6RmFzdCI7CisKKyAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GTE9BVDoKKyAgICAgIG5hbWUuYXBwZW5kKCJGMzIiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEU6CisgICAgICBuYW1lLmFwcGVuZCgiRjY0Iik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0w6CisgICAgICBuYW1lLmFwcGVuZCgiVjgiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMjoKKyAgICAgIG5hbWUuYXBwZW5kKCJWMzIiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NDoKKyAgICAgIG5hbWUuYXBwZW5kKCJWNjQiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTToKKyAgICAgIGlmIChIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoZmllbGQpKSB7CisgICAgICAgIG5hbWUuYXBwZW5kKCJWMzIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgZmllbGQtPmlzX3BhY2tlZCgpKSB7CisgICAgICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiRW51bSB2YWxpZGF0aW9uIG5vdCBoYW5kbGVkOiAiIDw8IGZpZWxkLT5EZWJ1Z1N0cmluZygpOworICAgICAgICByZXR1cm4gIiI7CisgICAgICB9CisgICAgICBuYW1lLmFwcGVuZChlbnRyeS5pc19lbnVtX3JhbmdlID8gIkVyIiA6ICJFdiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzI6CisgICAgICBuYW1lLmFwcGVuZCgiWjMyIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQ6CisgICAgICBuYW1lLmFwcGVuZCgiWjY0Iik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTOgorICAgICAgbmFtZS5hcHBlbmQoIkIiKTsKKyAgICAgIGlmIChJc1N0cmluZ0lubGluZWQoZmllbGQsIG9wdGlvbnMpKSB7CisgICAgICAgIG5hbWUuYXBwZW5kKCJpIik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6CisgICAgICBzd2l0Y2ggKEdldFV0ZjhDaGVja01vZGUoZmllbGQsIG9wdGlvbnMpKSB7CisgICAgICAgIGNhc2UgVXRmOENoZWNrTW9kZTo6a05vbmU6CisgICAgICAgICAgbmFtZS5hcHBlbmQoIkIiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVdGY4Q2hlY2tNb2RlOjprVmVyaWZ5OgorICAgICAgICAgIG5hbWUuYXBwZW5kKCJTIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVXRmOENoZWNrTW9kZTo6a1N0cmljdDoKKyAgICAgICAgICBuYW1lLmFwcGVuZCgiVSIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiTW9kZSBub3QgaGFuZGxlZDogIgorICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oR2V0VXRmOENoZWNrTW9kZShmaWVsZCwgb3B0aW9ucykpOworICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgIH0KKyAgICAgIGlmIChJc1N0cmluZ0lubGluZWQoZmllbGQsIG9wdGlvbnMpKSB7CisgICAgICAgIG5hbWUuYXBwZW5kKCJpIik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6CisgICAgICBuYW1lLmFwcGVuZCgiTSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVA6CisgICAgICBuYW1lLmFwcGVuZCgiRyIpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJUeXBlIG5vdCBoYW5kbGVkOiAiIDw8IGZpZWxkLT5EZWJ1Z1N0cmluZygpOworICAgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8gVGhlIGZpZWxkIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucyBhcmUgcHJlZml4ZWQgYnkgY2FyZGluYWxpdHk6CisgIC8vICAgYFNgIGZvciBvcHRpb25hbCBvciBpbXBsaWNpdCBmaWVsZHMuCisgIC8vICAgYFJgIGZvciBub24tcGFja2VkIHJlcGVhdGVkLgorICAvLyAgIGBQYCBmb3IgcGFja2VkIHJlcGVhdGVkLgorICBuYW1lLmFwcGVuZChmaWVsZC0+aXNfcGFja2VkKCkgICAgICAgICAgICAgICA/ICJQIgorICAgICAgICAgICAgICA6IGZpZWxkLT5pc19yZXBlYXRlZCgpICAgICAgICAgICA/ICJSIgorICAgICAgICAgICAgICA6IGZpZWxkLT5yZWFsX2NvbnRhaW5pbmdfb25lb2YoKSA/ICJPIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJTIik7CisKKyAgLy8gQXBwZW5kIHRoZSB0YWcgbGVuZ3RoLiBGYXN0IHBhcnNpbmcgb25seSBoYW5kbGVzIDEtIG9yIDItYnl0ZSB0YWdzLgorICBuYW1lLmFwcGVuZChUYWdTaXplKGZpZWxkLT5udW1iZXIoKSkgPT0gMSA/ICIxIiA6ICIyIik7CisKKyAgcmV0dXJuIG5hbWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wYXJzZV9mdW5jdGlvbl9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDJhMTVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGFyc2VfZnVuY3Rpb25fZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSwxODAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfUEFSU0VfRlVOQ1RJT05fR0VORVJBVE9SX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1BBUlNFX0ZVTkNUSU9OX0dFTkVSQVRPUl9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9vcHRpb25zLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworLy8gSGVscGVyIGNsYXNzIGZvciBnZW5lcmF0aW5nIHRhaWxjYWxsIHBhcnNpbmcgZnVuY3Rpb25zLgorc3RydWN0IFRhaWxDYWxsVGFibGVJbmZvIHsKKyAgVGFpbENhbGxUYWJsZUluZm8oY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIG9yZGVyZWRfZmllbGRzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBoYXNfYml0X2luZGljZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlubGluZWRfc3RyaW5nX2luZGljZXMsCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyKTsKKworICAvLyBGaWVsZHMgcGFyc2VkIGJ5IHRoZSB0YWJsZSBmYXN0LXBhdGguCisgIHN0cnVjdCBGYXN0RmllbGRJbmZvIHsKKyAgICBzdGQ6OnN0cmluZyBmdW5jX25hbWU7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZDsKKyAgICB1aW50MTZfdCBjb2RlZF90YWc7CisgICAgdWludDhfdCBoYXNiaXRfaWR4OworICAgIHVpbnQ4X3QgYXV4X2lkeDsKKyAgfTsKKyAgc3RkOjp2ZWN0b3I8RmFzdEZpZWxkSW5mbz4gZmFzdF9wYXRoX2ZpZWxkczsKKworICAvLyBGaWVsZHMgcGFyc2VkIGJ5IG1pbmkgcGFyc2luZyByb3V0aW5lcy4KKyAgc3RydWN0IEZpZWxkRW50cnlJbmZvIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkOworICAgIGludCBoYXNiaXRfaWR4OworICAgIGludCBpbmxpbmVkX3N0cmluZ19pZHg7CisgICAgdWludDE2X3QgYXV4X2lkeDsKKyAgICAvLyBUcnVlIGZvciBlbnVtcyBlbnRpcmVseSBjb3ZlcmVkIGJ5IHRoZSBzdGFydC9sZW5ndGggZmllbGRzIG9mIEZpZWxkQXV4OgorICAgIGJvb2wgaXNfZW51bV9yYW5nZTsKKyAgfTsKKyAgc3RkOjp2ZWN0b3I8RmllbGRFbnRyeUluZm8+IGZpZWxkX2VudHJpZXM7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhdXhfZW50cmllczsKKworICAvLyBGaWVsZHMgcGFyc2VkIGJ5IGdlbmVyYXRlZCBmYWxsYmFjayBmdW5jdGlvbi4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmFsbGJhY2tfZmllbGRzOworCisgIC8vIFRhYmxlIHNpemUuCisgIGludCB0YWJsZV9zaXplX2xvZzI7CisgIC8vIE1hc2sgZm9yIGhhcy1iaXRzIG9mIHJlcXVpcmVkIGZpZWxkcy4KKyAgdWludDMyX3QgaGFzX2hhc2JpdHNfcmVxdWlyZWRfbWFzazsKKyAgLy8gVHJ1ZSBpZiBhIGdlbmVyYXRlZCBmYWxsYmFjayBmdW5jdGlvbiBpcyByZXF1aXJlZCBpbnN0ZWFkIG9mIGdlbmVyaWMuCisgIGJvb2wgdXNlX2dlbmVyYXRlZF9mYWxsYmFjazsKK307CisKKy8vIFBhcnNlRnVuY3Rpb25HZW5lcmF0b3IgZ2VuZXJhdGVzIHRoZSBfSW50ZXJuYWxQYXJzZSBmdW5jdGlvbiBmb3IgYSBtZXNzYWdlCisvLyAoYW5kIGFueSBhc3NvY2lhdGVkIHN1cHBvcnRpbmcgbWVtYmVycykuCitjbGFzcyBQYXJzZUZ1bmN0aW9uR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIFBhcnNlRnVuY3Rpb25HZW5lcmF0b3IoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1heF9oYXNfYml0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGhhc19iaXRfaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpbmxpbmVkX3N0cmluZ19pbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNDQ0FuYWx5emVyKiBzY2NfYW5hbHl6ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdmFycyk7CisKKyAgLy8gRW1pdHMgY2xhc3MtbGV2ZWwgbWV0aG9kIGRlY2xhcmF0aW9ucyB0byBgcHJpbnRlcmA6CisgIHZvaWQgR2VuZXJhdGVNZXRob2REZWNscyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gRW1pdHMgb3V0LW9mLWNsYXNzIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBkZWZpbml0aW9ucyB0byBgcHJpbnRlcmA6CisgIHZvaWQgR2VuZXJhdGVNZXRob2RJbXBscyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gRW1pdHMgY2xhc3MtbGV2ZWwgZGF0YSBtZW1iZXIgZGVjbGFyYXRpb25zIHRvIGBwcmludGVyYDoKKyAgdm9pZCBHZW5lcmF0ZURhdGFEZWNscyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gRW1pdHMgb3V0LW9mLWNsYXNzIGRhdGEgbWVtYmVyIGRlZmluaXRpb25zIHRvIGBwcmludGVyYDoKKyAgdm9pZCBHZW5lcmF0ZURhdGFEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorICAvLyBSZXR1cm5zIHRydWUgaWYgdGFpbGNhbGwgdGFibGUgY29kZSBzaG91bGQgYmUgZ2VuZXJhdGVkLgorICBib29sIHNob3VsZF9nZW5lcmF0ZV90Y3RhYmxlKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRhaWxjYWxsIHRhYmxlIGNvZGUgc2hvdWxkIGJlIGdlbmVyYXRlZCwgYnV0IGluc2lkZSBhbgorICAvLyAjaWZkZWYgZ3VhcmQuCisgIGJvb2wgc2hvdWxkX2dlbmVyYXRlX2d1YXJkZWRfdGN0YWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc2hvdWxkX2dlbmVyYXRlX3RjdGFibGUoKSAmJgorICAgICAgICAgICBvcHRpb25zXy50Y3RhYmxlX21vZGUgPT0gT3B0aW9uczo6a1RDVGFibGVHdWFyZGVkOworICB9CisKKyAgLy8gR2VuZXJhdGVzIGEgdGFpbC1jYWxsaW5nIGBfSW50ZXJuYWxQYXJzZWAgZnVuY3Rpb24uCisgIHZvaWQgR2VuZXJhdGVUYWlsY2FsbFBhcnNlRnVuY3Rpb24oRm9ybWF0dGVyJiBmb3JtYXQpOworCisgIC8vIEdlbmVyYXRlcyBhIGZhbGxiYWNrIGZ1bmN0aW9uIGZvciB0YWlsY2FsbCB0YWJsZS1iYXNlZCBwYXJzaW5nLgorICB2b2lkIEdlbmVyYXRlVGFpbGNhbGxGYWxsYmFja0Z1bmN0aW9uKEZvcm1hdHRlciYgZm9ybWF0KTsKKworICAvLyBHZW5lcmF0ZXMgYSBsb29waW5nIGBfSW50ZXJuYWxQYXJzZWAgZnVuY3Rpb24uCisgIHZvaWQgR2VuZXJhdGVMb29waW5nUGFyc2VGdW5jdGlvbihGb3JtYXR0ZXImIGZvcm1hdCk7CisKKyAgLy8gR2VuZXJhdGVzIHRoZSB0YWlsLWNhbGwgdGFibGUgZGVmaW5pdGlvbi4KKyAgdm9pZCBHZW5lcmF0ZVRhaWxDYWxsVGFibGUoRm9ybWF0dGVyJiBmb3JtYXQpOworICB2b2lkIEdlbmVyYXRlRmFzdEZpZWxkRW50cmllcyhGb3JtYXR0ZXImIGZvcm1hdCk7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEVudHJpZXMoRm9ybWF0dGVyJiBmb3JtYXQpOworICBpbnQgQ2FsY3VsYXRlRmllbGROYW1lc1NpemUoKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUZpZWxkTmFtZXMoRm9ybWF0dGVyJiBmb3JtYXQpOworCisgIC8vIEdlbmVyYXRlcyBwYXJzaW5nIGNvZGUgZm9yIGFuIGBBcmVuYVN0cmluZ2AgZmllbGQuCisgIHZvaWQgR2VuZXJhdGVBcmVuYVN0cmluZyhGb3JtYXR0ZXImIGZvcm1hdCwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyAgLy8gR2VuZXJhdGVzIHBhcnNpbmcgY29kZSBmb3IgYSBzdHJpbmctdHlwZWQgZmllbGQuCisgIHZvaWQgR2VuZXJhdGVTdHJpbmdzKEZvcm1hdHRlciYgZm9ybWF0LCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGNoZWNrX3V0ZjgpOworCisgIC8vIEdlbmVyYXRlcyBwYXJzaW5nIGNvZGUgZm9yIGEgbGVuZ3RoLWRlbGltaXRlZCBmaWVsZCAoc3RyaW5ncywgbWVzc2FnZXMsCisgIC8vIGV0Yy4pLgorICB2b2lkIEdlbmVyYXRlTGVuZ3RoRGVsaW0oRm9ybWF0dGVyJiBmb3JtYXQsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIC8vIEdlbmVyYXRlcyB0aGUgcGFyc2luZyBjb2RlIGZvciBhIGtub3duIGZpZWxkLgorICB2b2lkIEdlbmVyYXRlRmllbGRCb2R5KEZvcm1hdHRlciYgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgd2lyZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyAgLy8gR2VuZXJhdGVzIGNvZGUgdG8gcGFyc2UgdGhlIG5leHQgZmllbGQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgorICB2b2lkIEdlbmVyYXRlUGFyc2VJdGVyYXRpb25Cb2R5KAorICAgICAgRm9ybWF0dGVyJiBmb3JtYXQsIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgZmllbGRzKTsKKworICAvLyBHZW5lcmF0ZXMgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gcGFyc2UgZWFjaCBvZiBgZmllbGRzYC4KKyAgdm9pZCBHZW5lcmF0ZUZpZWxkU3dpdGNoKEZvcm1hdHRlciYgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGZpZWxkcyk7CisKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIE1lc3NhZ2VTQ0NBbmFseXplciogc2NjX2FuYWx5emVyXzsKKyAgY29uc3QgT3B0aW9ucyYgb3B0aW9uc187CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyaWFibGVzXzsKKyAgc3RkOjp1bmlxdWVfcHRyPFRhaWxDYWxsVGFibGVJbmZvPiB0Y190YWJsZV9pbmZvXzsKKyAgc3RkOjp2ZWN0b3I8aW50PiBpbmxpbmVkX3N0cmluZ19pbmRpY2VzXzsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gb3JkZXJlZF9maWVsZHNfOworICBpbnQgbnVtX2hhc2JpdHNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1BBUlNFX0ZVTkNUSU9OX0dFTkVSQVRPUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3BsdWdpbl91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3BsdWdpbl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDIzZGNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcGx1Z2luX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMjM1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIFRPRE8oa2VudG9uKTogIFNoYXJlIGNvZGUgd2l0aCB0aGUgdmVyc2lvbnMgb2YgdGhpcyB0ZXN0IGluIG90aGVyIGxhbmd1YWdlcz8KKy8vICAgSXQgc2VlbWVkIGxpa2UgcGFyYW1ldGVyaXppbmcgaXQgd291bGQgYWRkIG1vcmUgY29tcGxleGl0eSB0aGFuIGl0IGlzCisvLyAgIHdvcnRoLgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CituYW1lc3BhY2UgeworCitjbGFzcyBUZXN0R2VuZXJhdG9yIDogcHVibGljIENvZGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgVGVzdEdlbmVyYXRvcigpIHt9CisgIH5UZXN0R2VuZXJhdG9yKCkgb3ZlcnJpZGUge30KKworICBib29sIEdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsIHN0ZDo6c3RyaW5nKiBlcnJvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImluY2x1ZGVzIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAibmFtZXNwYWNlX3Njb3BlIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZ2xvYmFsX3Njb3BlIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiY2xhc3Nfc2NvcGU6Zm9vLkJhciIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImNsYXNzX3Njb3BlOmZvby5CYXIuQmF6IiwgY29udGV4dCk7CisKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuY2MiLCAiaW5jbHVkZXMiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuY2MiLCAibmFtZXNwYWNlX3Njb3BlIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmNjIiwgImdsb2JhbF9zY29wZSIsIGNvbnRleHQpOworCisgICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhbiBvcHRpb25hbCBpbnQzMjoKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5vcHRJbnQiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXQ6Zm9vLkJhci5vcHRJbnQiLCBjb250ZXh0KTsKKworICAgIC8vIENoZWNrIGZpZWxkIGFjY2Vzc29ycyBmb3IgYSByZXBlYXRlZCBpbnQzMjoKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5yZXBlYXRlZEludCIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLnJlcGVhdGVkSW50IiwgY29udGV4dCk7CisKKyAgICAvLyBDaGVjayBmaWVsZCBhY2Nlc3NvcnMgZm9yIGEgcmVxdWlyZWQgc3RyaW5nOgorICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2dldDpmb28uQmFyLnJlcXVpcmVkU3RyaW5nIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0OmZvby5CYXIucmVxdWlyZWRTdHJpbmciLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlOmZvby5CYXIucmVxdWlyZWRTdHJpbmciLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXRfYWxsb2NhdGVkOmZvby5CYXIucmVxdWlyZWRTdHJpbmciLAorICAgICAgICAgICAgICBjb250ZXh0KTsKKworICAgIC8vIENoZWNrIGZpZWxkIGFjY2Vzc29ycyBmb3IgYSByZXBlYXRlZCBzdHJpbmc6CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIucmVwZWF0ZWRTdHJpbmciLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXQ6Zm9vLkJhci5yZXBlYXRlZFN0cmluZyIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldF9jaGFyOmZvby5CYXIucmVwZWF0ZWRTdHJpbmciLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXRfcG9pbnRlcjpmb28uQmFyLnJlcGVhdGVkU3RyaW5nIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfbXV0YWJsZTpmb28uQmFyLnJlcGVhdGVkU3RyaW5nIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0X2NoYXI6Zm9vLkJhci5yZXBlYXRlZFN0cmluZyIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldF9wb2ludGVyOmZvby5CYXIucmVwZWF0ZWRTdHJpbmciLCBjb250ZXh0KTsKKworICAgIC8vIENoZWNrIGZpZWxkIGFjY2Vzc29ycyBmb3IgYW4gaW50IGluc2lkZSBvbmVvZnt9OgorICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2dldDpmb28uQmFyLm9uZU9mSW50IiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0OmZvby5CYXIub25lT2ZJbnQiLCBjb250ZXh0KTsKKworICAgIC8vIENoZWNrIGZpZWxkIGFjY2Vzc29ycyBmb3IgYSBzdHJpbmcgaW5zaWRlIG9uZW9me306CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIub25lT2ZTdHJpbmciLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXQ6Zm9vLkJhci5vbmVPZlN0cmluZyIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX211dGFibGU6Zm9vLkJhci5vbmVPZlN0cmluZyIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldF9hbGxvY2F0ZWQ6Zm9vLkJhci5vbmVPZlN0cmluZyIsIGNvbnRleHQpOworCisgICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhbiBvcHRpb25hbCBtZXNzYWdlOgorICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2dldDpmb28uQmFyLm9wdE1lc3NhZ2UiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlOmZvby5CYXIub3B0TWVzc2FnZSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldF9hbGxvY2F0ZWQ6Zm9vLkJhci5vcHRNZXNzYWdlIiwgY29udGV4dCk7CisKKyAgICAvLyBDaGVjayBmaWVsZCBhY2Nlc3NvcnMgZm9yIGEgcmVwZWF0ZWQgbWVzc2FnZToKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9hZGQ6Zm9vLkJhci5yZXBlYXRlZE1lc3NhZ2UiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5yZXBlYXRlZE1lc3NhZ2UiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9saXN0OmZvby5CYXIucmVwZWF0ZWRNZXNzYWdlIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfbXV0YWJsZTpmb28uQmFyLnJlcGVhdGVkTWVzc2FnZSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX211dGFibGVfbGlzdDpmb28uQmFyLnJlcGVhdGVkTWVzc2FnZSIsCisgICAgICAgICAgICAgIGNvbnRleHQpOworCisgICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIG1lc3NhZ2UgaW5zaWRlIG9uZW9me306CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIub25lT2ZNZXNzYWdlIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfbXV0YWJsZTpmb28uQmFyLm9uZU9mTWVzc2FnZSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5jYyIsICJmaWVsZF9zZXRfYWxsb2NhdGVkOmZvby5CYXIub25lT2ZNZXNzYWdlIiwKKyAgICAgICAgICAgICAgY29udGV4dCk7CisKKyAgICAvLyBDaGVjayBmaWVsZCBhY2Nlc3NvcnMgZm9yIGFuIG9wdGlvbmFsIGVudW06CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIub3B0RW51bSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLm9wdEVudW0iLCBjb250ZXh0KTsKKworICAgIC8vIENoZWNrIGZpZWxkIGFjY2Vzc29ycyBmb3IgYSByZXBlYXRlZCBlbnVtOgorICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2dldDpmb28uQmFyLnJlcGVhdGVkRW51bSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLnJlcGVhdGVkRW51bSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2FkZDpmb28uQmFyLnJlcGVhdGVkRW51bSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2xpc3Q6Zm9vLkJhci5yZXBlYXRlZEVudW0iLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlX2xpc3Q6Zm9vLkJhci5yZXBlYXRlZEVudW0iLCBjb250ZXh0KTsKKworICAgIC8vIENoZWNrIGZpZWxkIGFjY2Vzc29ycyBmb3IgYW4gZW51bSBpbnNpZGUgb25lb2Z7fToKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5vbmVPZkVudW0iLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXQ6Zm9vLkJhci5vbmVPZkVudW0iLCBjb250ZXh0KTsKKworICAgIC8vIENoZWNrIGZpZWxkIGFjY2Vzc29ycyBmb3IgYSByZXF1aXJlZCBjb3JkOgorICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2dldDpmb28uQmFyLnJlcXVpcmVkQ29yZCIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLnJlcXVpcmVkQ29yZCIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX211dGFibGU6Zm9vLkJhci5yZXF1aXJlZENvcmQiLCBjb250ZXh0KTsKKworICAgIC8vIENoZWNrIGZpZWxkIGFjY2Vzc29ycyBmb3IgYSByZXBlYXRlZCBjb3JkOgorICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2dldDpmb28uQmFyLnJlcGVhdGVkQ29yZCIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLnJlcGVhdGVkQ29yZCIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2FkZDpmb28uQmFyLnJlcGVhdGVkQ29yZCIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2xpc3Q6Zm9vLkJhci5yZXBlYXRlZENvcmQiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlOmZvby5CYXIucmVwZWF0ZWRDb3JkIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfbXV0YWJsZV9saXN0OmZvby5CYXIucmVwZWF0ZWRDb3JkIiwgY29udGV4dCk7CisKKyAgICAvLyBDaGVjayBmaWVsZCBhY2Nlc3NvcnMgZm9yIGEgY29yZCBpbnNpZGUgb25lb2Z7fToKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5vbmVPZkNvcmQiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXQ6Zm9vLkJhci5vbmVPZkNvcmQiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlOmZvby5CYXIub25lT2ZDb3JkIiwgY29udGV4dCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHZvaWQgVHJ5SW5zZXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluc2VydGlvbl9wb2ludCwKKyAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCkgY29uc3QgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgICAgY29udGV4dC0+T3BlbkZvckluc2VydChmaWxlbmFtZSwgaW5zZXJ0aW9uX3BvaW50KSk7CisgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisgICAgcHJpbnRlci5QcmludCgiLy8gaW5zZXJ0ZWQgJG5hbWUkXG4iLCAibmFtZSIsIGluc2VydGlvbl9wb2ludCk7CisgIH0KK307CisKKy8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IGFsbCB0aGUgZXhwZWN0ZWQgaW5zZXJ0aW9uIHBvaW50cyBleGlzdC4gIEl0IGRvZXMKKy8vIG5vdCB2ZXJpZnkgdGhhdCB0aGV5IGFyZSBjb3JyZWN0bHktcGxhY2VkOyB0aGF0IHdvdWxkIHJlcXVpcmUgYWN0dWFsbHkKKy8vIGNvbXBpbGluZyB0aGUgb3V0cHV0IHdoaWNoIGlzIGEgYml0IG1vcmUgdGhhbiBJIGNhcmUgdG8gZG8gZm9yIHRoaXMgdGVzdC4KK1RFU1QoQ3BwUGx1Z2luVGVzdCwgUGx1Z2luVGVzdCkgeworICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6U2V0Q29udGVudHMoVGVzdFRlbXBEaXIoKSArICIvdGVzdC5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBmb287XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0gVGh1ZCB7IFZBTFVFID0gMDsgfVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIG1lc3NhZ2UgQmF6IHt9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIGludDMyIG9wdEludCA9IDE7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHJlcGVhdGVkIGludDMyIHJlcGVhdGVkSW50ID0gMjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICByZXF1aXJlZCBzdHJpbmcgcmVxdWlyZWRTdHJpbmcgPSAzO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRTdHJpbmcgPSA0O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIEJheiBvcHRNZXNzYWdlID0gNjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmVwZWF0ZWQgQmF6IHJlcGVhdGVkTWVzc2FnZSA9IDc7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgb3B0aW9uYWwgVGh1ZCBvcHRFbnVtID0gODtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmVwZWF0ZWQgVGh1ZCByZXBlYXRlZEVudW0gPSA5O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHJlcXVpcmVkIHN0cmluZyByZXF1aXJlZENvcmQgPSAxMCBbXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgY3R5cGUgPSBDT1JEXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIF07XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZENvcmQgPSAxMSBbXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgY3R5cGUgPSBDT1JEXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIF07XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgb25lb2YgTW9vIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpbnQ2NCBvbmVPZkludCA9IDIwO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHN0cmluZyBvbmVPZlN0cmluZyA9IDIxO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEJheiBvbmVPZk1lc3NhZ2UgPSAyMjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBUaHVkIG9uZU9mRW51bSA9IDIzOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBzdHJpbmcgb25lT2ZDb3JkID0gMjQgW1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgY3R5cGUgPSBDT1JEXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgXTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpOworCisgIENvbW1hbmRMaW5lSW50ZXJmYWNlIGNsaTsKKyAgY2xpLlNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKHRydWUpOworCisgIENwcEdlbmVyYXRvciBjcHBfZ2VuZXJhdG9yOworICBUZXN0R2VuZXJhdG9yIHRlc3RfZ2VuZXJhdG9yOworICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tY3BwX291dCIsICZjcHBfZ2VuZXJhdG9yLCAiIik7CisgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS10ZXN0X291dCIsICZ0ZXN0X2dlbmVyYXRvciwgIiIpOworCisgIHN0ZDo6c3RyaW5nIHByb3RvX3BhdGggPSAiLUkiICsgVGVzdFRlbXBEaXIoKTsKKyAgc3RkOjpzdHJpbmcgY3BwX291dCA9ICItLWNwcF9vdXQ9IiArIFRlc3RUZW1wRGlyKCk7CisgIHN0ZDo6c3RyaW5nIHRlc3Rfb3V0ID0gIi0tdGVzdF9vdXQ9IiArIFRlc3RUZW1wRGlyKCk7CisKKyAgY29uc3QgY2hhciogYXJndltdID0geyJwcm90b2MiLCBwcm90b19wYXRoLmNfc3RyKCksIGNwcF9vdXQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb3V0LmNfc3RyKCksICJ0ZXN0LnByb3RvIn07CisKKyAgRVhQRUNUX0VRKDAsIGNsaS5SdW4oNSwgYXJndikpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcmltaXRpdmVfZmllbGQuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcmltaXRpdmVfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5MmVkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3ByaW1pdGl2ZV9maWVsZC5jYwpAQCAtMCwwICsxLDUzOSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9wcmltaXRpdmVfZmllbGQuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2hlbHBlcnMuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7CisKK25hbWVzcGFjZSB7CisKKy8vIEZvciBlbmNvZGluZ3Mgd2l0aCBmaXhlZCBzaXplcywgcmV0dXJucyB0aGF0IHNpemUgaW4gYnl0ZXMuICBPdGhlcndpc2UKKy8vIHJldHVybnMgLTEuCitpbnQgRml4ZWRTaXplKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyOgorICAgICAgcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0OgorICAgICAgcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgICAgcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NDoKKyAgICAgIHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyOgorICAgICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprRml4ZWQzMlNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NDoKKyAgICAgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0ZpeGVkNjRTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOgorICAgICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprU0ZpeGVkMzJTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OgorICAgICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprU0ZpeGVkNjRTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprRmxvYXRTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0RvdWJsZVNpemU7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprQm9vbFNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTToKKyAgICAgIHJldHVybiAtMTsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzoKKyAgICAgIHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICAgIHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOgorICAgICAgcmV0dXJuIC0xOworCisgICAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgICAgLy8gdHlwZXMgYXJlIGFkZGVkLgorICB9CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgdmFyaWFibGVzLCBvcHRpb25zKTsKKyAgKCp2YXJpYWJsZXMpWyJ0eXBlIl0gPSBQcmltaXRpdmVUeXBlTmFtZShvcHRpb25zLCBkZXNjcmlwdG9yLT5jcHBfdHlwZSgpKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBEZWZhdWx0VmFsdWUob3B0aW9ucywgZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsiY2FjaGVkX2J5dGVfc2l6ZV9uYW1lIl0gPSBNYWtlVmFyaW50Q2FjaGVkU2l6ZU5hbWUoZGVzY3JpcHRvcik7CisgIGJvb2wgY29sZCA9IFNob3VsZFNwbGl0KGRlc2NyaXB0b3IsIG9wdGlvbnMpOworICAoKnZhcmlhYmxlcylbImNhY2hlZF9ieXRlX3NpemVfZmllbGQiXSA9CisgICAgICBNYWtlVmFyaW50Q2FjaGVkU2l6ZUZpZWxkTmFtZShkZXNjcmlwdG9yLCBjb2xkKTsKKyAgKCp2YXJpYWJsZXMpWyJ0YWciXSA9IFN0ckNhdChpbnRlcm5hbDo6V2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yKSk7CisgIGludCBmaXhlZF9zaXplID0gRml4ZWRTaXplKGRlc2NyaXB0b3ItPnR5cGUoKSk7CisgIGlmIChmaXhlZF9zaXplICE9IC0xKSB7CisgICAgKCp2YXJpYWJsZXMpWyJmaXhlZF9zaXplIl0gPSBTdHJDYXQoZml4ZWRfc2l6ZSk7CisgIH0KKyAgKCp2YXJpYWJsZXMpWyJ3aXJlX2Zvcm1hdF9maWVsZF90eXBlIl0gPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX05hbWUoCisgICAgICBzdGF0aWNfY2FzdDxGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlPihkZXNjcmlwdG9yLT50eXBlKCkpKTsKKyAgKCp2YXJpYWJsZXMpWyJmdWxsX25hbWUiXSA9IGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6UHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgb3B0aW9ucykgeworICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18sIG9wdGlvbnMpOworfQorCitQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6flByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQcml2YXRlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIiR0eXBlJCAkbmFtZSRfO1xuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkJHR5cGUkICR7MSQkbmFtZSQkfSQoKSBjb25zdDtcbiIKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgJHsxJHNldF8kbmFtZSQkfSQoJHR5cGUkIHZhbHVlKTtcbiIKKyAgICAgICJwcml2YXRlOlxuIgorICAgICAgIiR0eXBlJCAkezEkX2ludGVybmFsXyRuYW1lJCR9JCgpIGNvbnN0O1xuIgorICAgICAgInZvaWQgJHsxJF9pbnRlcm5hbF9zZXRfJG5hbWUkJH0kKCR0eXBlJCB2YWx1ZSk7XG4iCisgICAgICAicHVibGljOlxuIiwKKyAgICAgIGRlc2NyaXB0b3JfKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgKKyAgICAgICJpbmxpbmUgJHR5cGUkICRjbGFzc25hbWUkOjpfaW50ZXJuYWxfJG5hbWUkKCkgY29uc3Qge1xuIgorICAgICAgIiAgcmV0dXJuICRmaWVsZCQ7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSAkdHlwZSQgJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICIkYW5ub3RhdGVfZ2V0JCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gX2ludGVybmFsXyRuYW1lJCgpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6X2ludGVybmFsX3NldF8kbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAiICAkc2V0X2hhc2JpdCRcbiIKKyAgICAgICIgICRmaWVsZCQgPSB2YWx1ZTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAiJG1heWJlX3ByZXBhcmVfc3BsaXRfbWVzc2FnZSQiCisgICAgICAiICBfaW50ZXJuYWxfc2V0XyRuYW1lJCh2YWx1ZSk7XG4iCisgICAgICAiJGFubm90YXRlX3NldCQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIn1cbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIiRmaWVsZCQgPSAkZGVmYXVsdCQ7XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIl90aGlzLT5faW50ZXJuYWxfc2V0XyRuYW1lJChmcm9tLl9pbnRlcm5hbF8kbmFtZSQoKSk7XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCJzd2FwKCRmaWVsZCQsIG90aGVyLT4kZmllbGQkKTtcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCJfdGhpcy0+JGZpZWxkJCA9IGZyb20uJGZpZWxkJDtcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgInRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTtcbiIKKyAgICAgICJ0YXJnZXQgPSAiCisgICAgICAiOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGUkZGVjbGFyZWRfdHlwZSRUb0FycmF5KCIKKyAgICAgICIkbnVtYmVyJCwgdGhpcy0+X2ludGVybmFsXyRuYW1lJCgpLCB0YXJnZXQpO1xuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgaW50IGZpeGVkX3NpemUgPSBGaXhlZFNpemUoZGVzY3JpcHRvcl8tPnR5cGUoKSk7CisgIGlmIChmaXhlZF9zaXplID09IC0xKSB7CisgICAgaWYgKGludGVybmFsOjpXaXJlRm9ybWF0OjpUYWdTaXplKGRlc2NyaXB0b3JfLT5udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl8tPnR5cGUoKSkgPT0gMSkgeworICAgICAgLy8gQWRkaW5nIG9uZSBpcyB2ZXJ5IGNvbW1vbiBhbmQgaXQgdHVybnMgb3V0IGl0IGNhbiBiZSBkb25lIGZvcgorICAgICAgLy8gZnJlZSBpbnNpZGUgb2YgV2lyZUZvcm1hdExpdGUsIHNvIHdlIGNhbiBzYXZlIGFuIGluc3RydWN0aW9uIGhlcmUuCisgICAgICBmb3JtYXQoCisgICAgICAgICAgInRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6IgorICAgICAgICAgICIkZGVjbGFyZWRfdHlwZSRTaXplUGx1c09uZSh0aGlzLT5faW50ZXJuYWxfJG5hbWUkKCkpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvcm1hdCgKKyAgICAgICAgICAidG90YWxfc2l6ZSArPSAkdGFnX3NpemUkICtcbiIKKyAgICAgICAgICAiICA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjokZGVjbGFyZWRfdHlwZSRTaXplKFxuIgorICAgICAgICAgICIgICAgdGhpcy0+X2ludGVybmFsXyRuYW1lJCgpKTtcbiIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoInRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCArICRmaXhlZF9zaXplJDtcbiIpOworICB9Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ29uc3RleHByQWdncmVnYXRlSW5pdGlhbGl6ZXIoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCIvKmRlY2x0eXBlKCRmaWVsZCQpKi8kZGVmYXVsdCQiKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVBZ2dyZWdhdGVJbml0aWFsaXplcigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoU2hvdWxkU3BsaXQoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgiZGVjbHR5cGUoSW1wbF86OlNwbGl0OjokbmFtZSRfKXskZGVmYXVsdCR9Iik7CisgICAgcmV0dXJuOworICB9CisgIGZvcm1hdCgiZGVjbHR5cGUoJGZpZWxkJCl7JGRlZmF1bHQkfSIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNvcHlBZ2dyZWdhdGVJbml0aWFsaXplcigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoImRlY2x0eXBlKCRmaWVsZCQpe30iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjpQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKKyAgICA6IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IsIG9wdGlvbnMpIHsKKyAgU2V0Q29tbW9uT25lb2ZGaWVsZFZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7Cit9CisKK1ByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6On5QcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgImlubGluZSAkdHlwZSQgJGNsYXNzbmFtZSQ6Ol9pbnRlcm5hbF8kbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAiICBpZiAoX2ludGVybmFsX2hhc18kbmFtZSQoKSkge1xuIgorICAgICAgIiAgICByZXR1cm4gJGZpZWxkJDtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHJldHVybiAkZGVmYXVsdCQ7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpfaW50ZXJuYWxfc2V0XyRuYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICIgIGlmICghX2ludGVybmFsX2hhc18kbmFtZSQoKSkge1xuIgorICAgICAgIiAgICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAgICIgICAgc2V0X2hhc18kbmFtZSQoKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgICRmaWVsZCQgPSB2YWx1ZTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lICR0eXBlJCAkY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgorICAgICAgIiRhbm5vdGF0ZV9nZXQkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiBfaW50ZXJuYWxfJG5hbWUkKCk7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICAgIiAgX2ludGVybmFsX3NldF8kbmFtZSQodmFsdWUpO1xuIgorICAgICAgIiRhbm5vdGF0ZV9zZXQkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDokZnVsbF9uYW1lJClcbiIKKyAgICAgICJ9XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNsZWFyaW5nQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIiRmaWVsZCQgPSAkZGVmYXVsdCQ7XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVN3YXBwaW5nQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBEb24ndCBwcmludCBhbnkgc3dhcHBpbmcgY29kZS4gU3dhcHBpbmcgdGhlIHVuaW9uIHdpbGwgc3dhcCB0aGlzIGZpZWxkLgorfQorCit2b2lkIFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgiJG5zJDo6XyRjbGFzc25hbWUkX2RlZmF1bHRfaW5zdGFuY2VfLiRmaWVsZCQgPSAkZGVmYXVsdCQ7XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKKyAgICA6IEZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IsIG9wdGlvbnMpIHsKKyAgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfLCBvcHRpb25zKTsKKworICBpZiAoZGVzY3JpcHRvci0+aXNfcGFja2VkKCkpIHsKKyAgICB2YXJpYWJsZXNfWyJwYWNrZWRfcmVhZGVyIl0gPSAiUmVhZFBhY2tlZFByaW1pdGl2ZSI7CisgICAgdmFyaWFibGVzX1sicmVwZWF0ZWRfcmVhZGVyIl0gPSAiUmVhZFJlcGVhdGVkUHJpbWl0aXZlTm9JbmxpbmUiOworICB9IGVsc2UgeworICAgIHZhcmlhYmxlc19bInBhY2tlZF9yZWFkZXIiXSA9ICJSZWFkUGFja2VkUHJpbWl0aXZlTm9JbmxpbmUiOworICAgIHZhcmlhYmxlc19bInJlcGVhdGVkX3JlYWRlciJdID0gIlJlYWRSZXBlYXRlZFByaW1pdGl2ZSI7CisgIH0KK30KKworUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCI6OiRwcm90b19ucyQ6OlJlcGVhdGVkRmllbGQ8ICR0eXBlJCA+ICRuYW1lJF87XG4iKTsKKyAgaWYgKGRlc2NyaXB0b3JfLT5pc19wYWNrZWQoKSAmJiBGaXhlZFNpemUoZGVzY3JpcHRvcl8tPnR5cGUoKSkgPT0gLTEgJiYKKyAgICAgIEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgZm9ybWF0KCJtdXRhYmxlIHN0ZDo6YXRvbWljPGludD4gJGNhY2hlZF9ieXRlX3NpemVfbmFtZSQ7XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgInByaXZhdGU6XG4iCisgICAgICAiJHR5cGUkICR7MSRfaW50ZXJuYWxfJG5hbWUkJH0kKGludCBpbmRleCkgY29uc3Q7XG4iCisgICAgICAiY29uc3QgOjokcHJvdG9fbnMkOjpSZXBlYXRlZEZpZWxkPCAkdHlwZSQgPiZcbiIKKyAgICAgICIgICAgJHsxJF9pbnRlcm5hbF8kbmFtZSQkfSQoKSBjb25zdDtcbiIKKyAgICAgICJ2b2lkICR7MSRfaW50ZXJuYWxfYWRkXyRuYW1lJCR9JCgkdHlwZSQgdmFsdWUpO1xuIgorICAgICAgIjo6JHByb3RvX25zJDo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4qXG4iCisgICAgICAiICAgICR7MSRfaW50ZXJuYWxfbXV0YWJsZV8kbmFtZSQkfSQoKTtcbiIKKyAgICAgICJwdWJsaWM6XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciQkdHlwZSQgJHsxJCRuYW1lJCR9JChpbnQgaW5kZXgpIGNvbnN0O1xuIgorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCAkezEkc2V0XyRuYW1lJCR9JChpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSk7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkICR7MSRhZGRfJG5hbWUkJH0kKCR0eXBlJCB2YWx1ZSk7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciRjb25zdCA6OiRwcm90b19ucyQ6OlJlcGVhdGVkRmllbGQ8ICR0eXBlJCA+JlxuIgorICAgICAgIiAgICAkezEkJG5hbWUkJH0kKCkgY29uc3Q7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciQ6OiRwcm90b19ucyQ6OlJlcGVhdGVkRmllbGQ8ICR0eXBlJCA+KlxuIgorICAgICAgIiAgICAkezEkbXV0YWJsZV8kbmFtZSQkfSQoKTtcbiIsCisgICAgICBkZXNjcmlwdG9yXyk7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgKKyAgICAgICJpbmxpbmUgJHR5cGUkICRjbGFzc25hbWUkOjpfaW50ZXJuYWxfJG5hbWUkKGludCBpbmRleCkgY29uc3Qge1xuIgorICAgICAgIiAgcmV0dXJuICRmaWVsZCQuR2V0KGluZGV4KTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lICR0eXBlJCAkY2xhc3NuYW1lJDo6JG5hbWUkKGludCBpbmRleCkgY29uc3Qge1xuIgorICAgICAgIiRhbm5vdGF0ZV9nZXQkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiBfaW50ZXJuYWxfJG5hbWUkKGluZGV4KTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICIkYW5ub3RhdGVfc2V0JCIKKyAgICAgICIgICRmaWVsZCQuU2V0KGluZGV4LCB2YWx1ZSk7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6X2ludGVybmFsX2FkZF8kbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAiICAkZmllbGQkLkFkZCh2YWx1ZSk7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjphZGRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICAgIiAgX2ludGVybmFsX2FkZF8kbmFtZSQodmFsdWUpO1xuIgorICAgICAgIiRhbm5vdGF0ZV9hZGQkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDokZnVsbF9uYW1lJClcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIGNvbnN0IDo6JHByb3RvX25zJDo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4mXG4iCisgICAgICAiJGNsYXNzbmFtZSQ6Ol9pbnRlcm5hbF8kbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAiICByZXR1cm4gJGZpZWxkJDtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIGNvbnN0IDo6JHByb3RvX25zJDo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4mXG4iCisgICAgICAiJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICIkYW5ub3RhdGVfbGlzdCQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiBfaW50ZXJuYWxfJG5hbWUkKCk7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSA6OiRwcm90b19ucyQ6OlJlcGVhdGVkRmllbGQ8ICR0eXBlJCA+KlxuIgorICAgICAgIiRjbGFzc25hbWUkOjpfaW50ZXJuYWxfbXV0YWJsZV8kbmFtZSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gJiRmaWVsZCQ7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSA6OiRwcm90b19ucyQ6OlJlcGVhdGVkRmllbGQ8ICR0eXBlJCA+KlxuIgorICAgICAgIiRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKKyAgICAgICIkYW5ub3RhdGVfbXV0YWJsZV9saXN0JCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gX2ludGVybmFsX211dGFibGVfJG5hbWUkKCk7XG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDbGVhcmluZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCIkZmllbGQkLkNsZWFyKCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgiX3RoaXMtPiRmaWVsZCQuTWVyZ2VGcm9tKGZyb20uJGZpZWxkJCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVN3YXBwaW5nQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIiRmaWVsZCQuSW50ZXJuYWxTd2FwKCZvdGhlci0+JGZpZWxkJCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZURlc3RydWN0b3JDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgiJGZpZWxkJC5+UmVwZWF0ZWRGaWVsZCgpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKKyAgICBpZiAoRml4ZWRTaXplKGRlc2NyaXB0b3JfLT50eXBlKCkpID09IC0xKSB7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgIntcbiIKKyAgICAgICAgICAiICBpbnQgYnl0ZV9zaXplID0gIgorICAgICAgICAgICIkY2FjaGVkX2J5dGVfc2l6ZV9maWVsZCQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTtcbiIKKyAgICAgICAgICAiICBpZiAoYnl0ZV9zaXplID4gMCkge1xuIgorICAgICAgICAgICIgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZSRkZWNsYXJlZF90eXBlJFBhY2tlZChcbiIKKyAgICAgICAgICAiICAgICAgICAkbnVtYmVyJCwgX2ludGVybmFsXyRuYW1lJCgpLCBieXRlX3NpemUsIHRhcmdldCk7XG4iCisgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9ybWF0KAorICAgICAgICAgICJpZiAodGhpcy0+X2ludGVybmFsXyRuYW1lJF9zaXplKCkgPiAwKSB7XG4iCisgICAgICAgICAgIiAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZUZpeGVkUGFja2VkKCRudW1iZXIkLCBfaW50ZXJuYWxfJG5hbWUkKCksICIKKyAgICAgICAgICAidGFyZ2V0KTtcbiIKKyAgICAgICAgICAifVxuIik7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvcm1hdCgKKyAgICAgICAgImZvciAoaW50IGkgPSAwLCBuID0gdGhpcy0+X2ludGVybmFsXyRuYW1lJF9zaXplKCk7IGkgPCBuOyBpKyspIHtcbiIKKyAgICAgICAgIiAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpO1xuIgorICAgICAgICAiICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjoiCisgICAgICAgICJXcml0ZSRkZWNsYXJlZF90eXBlJFRvQXJyYXkoJG51bWJlciQsIHRoaXMtPl9pbnRlcm5hbF8kbmFtZSQoaSksICIKKyAgICAgICAgInRhcmdldCk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnl0ZVNpemUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCJ7XG4iKTsKKyAgZm9ybWF0LkluZGVudCgpOworICBpbnQgZml4ZWRfc2l6ZSA9IEZpeGVkU2l6ZShkZXNjcmlwdG9yXy0+dHlwZSgpKTsKKyAgaWYgKGZpeGVkX3NpemUgPT0gLTEpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJzaXplX3QgZGF0YV9zaXplID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6XG4iCisgICAgICAgICIgICRkZWNsYXJlZF90eXBlJFNpemUodGhpcy0+JGZpZWxkJCk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJ1bnNpZ25lZCBpbnQgY291bnQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCAiCisgICAgICAgICJpbnQ+KHRoaXMtPl9pbnRlcm5hbF8kbmFtZSRfc2l6ZSgpKTtcbiIKKyAgICAgICAgInNpemVfdCBkYXRhX3NpemUgPSAkZml4ZWRfc2l6ZSRVTCAqIGNvdW50O1xuIik7CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiaWYgKGRhdGFfc2l6ZSA+IDApIHtcbiIKKyAgICAgICAgIiAgdG90YWxfc2l6ZSArPSAkdGFnX3NpemUkICtcbiIKKyAgICAgICAgIiAgICAiCisgICAgICAgICI6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoc3RhdGljX2Nhc3Q8JGludDMyJD4oZGF0YV9zaXplKSk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBpZiAoRml4ZWRTaXplKGRlc2NyaXB0b3JfLT50eXBlKCkpID09IC0xKSB7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgImludCBjYWNoZWRfc2l6ZSA9IDo6X3BiaTo6VG9DYWNoZWRTaXplKGRhdGFfc2l6ZSk7XG4iCisgICAgICAgICAgIiRjYWNoZWRfYnl0ZV9zaXplX2ZpZWxkJC5zdG9yZShjYWNoZWRfc2l6ZSxcbiIKKyAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTtcbiIpOworICAgIH0KKyAgICBmb3JtYXQoInRvdGFsX3NpemUgKz0gZGF0YV9zaXplO1xuIik7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KAorICAgICAgICAidG90YWxfc2l6ZSArPSAkdGFnX3NpemUkICpcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgIgorICAgICAgICAiOjpfcGJpOjpGcm9tSW50U2l6ZSh0aGlzLT5faW50ZXJuYWxfJG5hbWUkX3NpemUoKSk7XG4iCisgICAgICAgICJ0b3RhbF9zaXplICs9IGRhdGFfc2l6ZTtcbiIpOworICB9CisgIGZvcm1hdC5PdXRkZW50KCk7CisgIGZvcm1hdCgifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDb25zdGV4cHJBZ2dyZWdhdGVJbml0aWFsaXplcigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIi8qZGVjbHR5cGUoJGZpZWxkJCkqL3t9Iik7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkgJiYgRml4ZWRTaXplKGRlc2NyaXB0b3JfLT50eXBlKCkpID09IC0xICYmCisgICAgICBIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIGZvcm1hdCgiXG4sIC8qZGVjbHR5cGUoJGNhY2hlZF9ieXRlX3NpemVfZmllbGQkKSovezB9Iik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUFnZ3JlZ2F0ZUluaXRpYWxpemVyKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgiZGVjbHR5cGUoJGZpZWxkJCl7YXJlbmF9Iik7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkgJiYgRml4ZWRTaXplKGRlc2NyaXB0b3JfLT50eXBlKCkpID09IC0xICYmCisgICAgICBIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIC8vIHN0ZDo6YXRvbWljIGhhcyBubyBtb3ZlIGNvbnN0cnVjdG9yLCB3aGljaCBwcmV2ZW50cyBleHBsaWNpdCBhZ2dyZWdhdGUKKyAgICAvLyBpbml0aWFsaXphdGlvbiBwcmUtQysrMTcuCisgICAgZm9ybWF0KCJcbiwgLypkZWNsdHlwZSgkY2FjaGVkX2J5dGVfc2l6ZV9maWVsZCQpKi97MH0iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ29weUFnZ3JlZ2F0ZUluaXRpYWxpemVyKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCJkZWNsdHlwZSgkZmllbGQkKXtmcm9tLiRmaWVsZCR9Iik7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkgJiYgRml4ZWRTaXplKGRlc2NyaXB0b3JfLT50eXBlKCkpID09IC0xICYmCisgICAgICBIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIC8vIHN0ZDo6YXRvbWljIGhhcyBubyBtb3ZlIGNvbnN0cnVjdG9yLgorICAgIGZvcm1hdCgiXG4sIC8qZGVjbHR5cGUoJGNhY2hlZF9ieXRlX3NpemVfZmllbGQkKSovezB9Iik7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3ByaW1pdGl2ZV9maWVsZC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvcHJpbWl0aXZlX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4YTA4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3ByaW1pdGl2ZV9maWVsZC5oCkBAIC0wLDAgKzEsMTI2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9QUklNSVRJVkVfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfUFJJTUlUSVZFX0ZJRUxEX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBQcmltaXRpdmVGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICB+UHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGUge30KKyAgdm9pZCBHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0ZXhwckFnZ3JlZ2F0ZUluaXRpYWxpemVyKAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQWdncmVnYXRlSW5pdGlhbGl6ZXIoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ29weUFnZ3JlZ2F0ZUluaXRpYWxpemVyKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQcmltaXRpdmVGaWVsZEdlbmVyYXRvcik7Cit9OworCitjbGFzcyBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yIDogcHVibGljIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICB+UHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yKTsKK307CisKK2NsYXNzIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisgIH5SZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlIHt9CisgIHZvaWQgR2VuZXJhdGVDb3B5Q29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiAgLypwcmludGVyKi8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBHT09HTEVfQ0hFQ0soIVNob3VsZFNwbGl0KGRlc2NyaXB0b3JfLCBvcHRpb25zXykpOworICB9CisgIHZvaWQgR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ29uc3RleHByQWdncmVnYXRlSW5pdGlhbGl6ZXIoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVBZ2dyZWdhdGVJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDb3B5QWdncmVnYXRlSW5pdGlhbGl6ZXIoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1BSSU1JVElWRV9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3NlcnZpY2UuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9zZXJ2aWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMGQ0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9zZXJ2aWNlLmNjCkBAIC0wLDAgKzEsMzI4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3NlcnZpY2UuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2hlbHBlcnMuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCituYW1lc3BhY2UgeworCit2b2lkIEluaXRNZXRob2RWYXJpYWJsZXMoY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdHRlciogZm9ybWF0KSB7CisgIGZvcm1hdC0+U2V0KCJuYW1lIiwgbWV0aG9kLT5uYW1lKCkpOworICBmb3JtYXQtPlNldCgiaW5wdXRfdHlwZSIsIFF1YWxpZmllZENsYXNzTmFtZShtZXRob2QtPmlucHV0X3R5cGUoKSwgb3B0aW9ucykpOworICBmb3JtYXQtPlNldCgib3V0cHV0X3R5cGUiLAorICAgICAgICAgICAgICBRdWFsaWZpZWRDbGFzc05hbWUobWV0aG9kLT5vdXRwdXRfdHlwZSgpLCBvcHRpb25zKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitTZXJ2aWNlR2VuZXJhdG9yOjpTZXJ2aWNlR2VuZXJhdG9yKAorICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHZhcnMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwgdmFyc18odmFycyksIG9wdGlvbnNfKG9wdGlvbnMpIHsKKyAgdmFyc19bImNsYXNzbmFtZSJdID0gZGVzY3JpcHRvcl8tPm5hbWUoKTsKKyAgdmFyc19bImZ1bGxfbmFtZSJdID0gZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpOworfQorCitTZXJ2aWNlR2VuZXJhdG9yOjp+U2VydmljZUdlbmVyYXRvcigpIHt9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJzXyk7CisgIC8vIEZvcndhcmQtZGVjbGFyZSB0aGUgc3R1YiB0eXBlLgorICBmb3JtYXQoCisgICAgICAiY2xhc3MgJGNsYXNzbmFtZSRfU3R1YjtcbiIKKyAgICAgICJcbiIpOworCisgIEdlbmVyYXRlSW50ZXJmYWNlKHByaW50ZXIpOworICBHZW5lcmF0ZVN0dWJEZWZpbml0aW9uKHByaW50ZXIpOworfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJmYWNlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyc18pOworICBmb3JtYXQoCisgICAgICAiY2xhc3MgJGRsbGV4cG9ydF9kZWNsICQkY2xhc3NuYW1lJCA6IHB1YmxpYyA6OiRwcm90b19ucyQ6OlNlcnZpY2Uge1xuIgorICAgICAgIiBwcm90ZWN0ZWQ6XG4iCisgICAgICAiICAvLyBUaGlzIGNsYXNzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGFuIGFic3RyYWN0IGludGVyZmFjZS5cbiIKKyAgICAgICIgIGlubGluZSAkY2xhc3NuYW1lJCgpIHt9O1xuIgorICAgICAgIiBwdWJsaWM6XG4iCisgICAgICAiICB2aXJ0dWFsIH4kY2xhc3NuYW1lJCgpO1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvcm1hdCgKKyAgICAgICJcbiIKKyAgICAgICJ0eXBlZGVmICRjbGFzc25hbWUkX1N0dWIgU3R1YjtcbiIKKyAgICAgICJcbiIKKyAgICAgICJzdGF0aWMgY29uc3QgOjokcHJvdG9fbnMkOjpTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvcigpO1xuIgorICAgICAgIlxuIik7CisKKyAgR2VuZXJhdGVNZXRob2RTaWduYXR1cmVzKFZJUlRVQUwsIHByaW50ZXIpOworCisgIGZvcm1hdCgKKyAgICAgICJcbiIKKyAgICAgICIvLyBpbXBsZW1lbnRzIFNlcnZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorICAgICAgIlxuIgorICAgICAgImNvbnN0IDo6JHByb3RvX25zJDo6U2VydmljZURlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKTtcbiIKKyAgICAgICJ2b2lkIENhbGxNZXRob2QoY29uc3QgOjokcHJvdG9fbnMkOjpNZXRob2REZXNjcmlwdG9yKiBtZXRob2QsXG4iCisgICAgICAiICAgICAgICAgICAgICAgIDo6JHByb3RvX25zJDo6UnBjQ29udHJvbGxlciogY29udHJvbGxlcixcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgY29uc3QgOjokcHJvdG9fbnMkOjpNZXNzYWdlKiByZXF1ZXN0LFxuIgorICAgICAgIiAgICAgICAgICAgICAgICA6OiRwcm90b19ucyQ6Ok1lc3NhZ2UqIHJlc3BvbnNlLFxuIgorICAgICAgIiAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkNsb3N1cmUqIGRvbmUpO1xuIgorICAgICAgImNvbnN0IDo6JHByb3RvX25zJDo6TWVzc2FnZSYgR2V0UmVxdWVzdFByb3RvdHlwZShcbiIKKyAgICAgICIgIGNvbnN0IDo6JHByb3RvX25zJDo6TWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKSBjb25zdDtcbiIKKyAgICAgICJjb25zdCA6OiRwcm90b19ucyQ6Ok1lc3NhZ2UmIEdldFJlc3BvbnNlUHJvdG90eXBlKFxuIgorICAgICAgIiAgY29uc3QgOjokcHJvdG9fbnMkOjpNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpIGNvbnN0O1xuIik7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBmb3JtYXQoCisgICAgICAiXG4iCisgICAgICAiIHByaXZhdGU6XG4iCisgICAgICAiICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoJGNsYXNzbmFtZSQpO1xuIgorICAgICAgIn07XG4iCisgICAgICAiXG4iKTsKK30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZVN0dWJEZWZpbml0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyc18pOworICBmb3JtYXQoCisgICAgICAiY2xhc3MgJGRsbGV4cG9ydF9kZWNsICQkY2xhc3NuYW1lJF9TdHViIDogcHVibGljICRjbGFzc25hbWUkIHtcbiIKKyAgICAgICIgcHVibGljOlxuIik7CisKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgZm9ybWF0KAorICAgICAgIiRjbGFzc25hbWUkX1N0dWIoOjokcHJvdG9fbnMkOjpScGNDaGFubmVsKiBjaGFubmVsKTtcbiIKKyAgICAgICIkY2xhc3NuYW1lJF9TdHViKDo6JHByb3RvX25zJDo6UnBjQ2hhbm5lbCogY2hhbm5lbCxcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgIDo6JHByb3RvX25zJDo6U2VydmljZTo6Q2hhbm5lbE93bmVyc2hpcCBvd25lcnNoaXApO1xuIgorICAgICAgIn4kY2xhc3NuYW1lJF9TdHViKCk7XG4iCisgICAgICAiXG4iCisgICAgICAiaW5saW5lIDo6JHByb3RvX25zJDo6UnBjQ2hhbm5lbCogY2hhbm5lbCgpIHsgcmV0dXJuIGNoYW5uZWxfOyB9XG4iCisgICAgICAiXG4iCisgICAgICAiLy8gaW1wbGVtZW50cyAkY2xhc3NuYW1lJCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyAgICAgICJcbiIpOworCisgIEdlbmVyYXRlTWV0aG9kU2lnbmF0dXJlcyhOT05fVklSVFVBTCwgcHJpbnRlcik7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBmb3JtYXQoCisgICAgICAiIHByaXZhdGU6XG4iCisgICAgICAiICA6OiRwcm90b19ucyQ6OlJwY0NoYW5uZWwqIGNoYW5uZWxfO1xuIgorICAgICAgIiAgYm9vbCBvd25zX2NoYW5uZWxfO1xuIgorICAgICAgIiAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKCRjbGFzc25hbWUkX1N0dWIpO1xuIgorICAgICAgIn07XG4iCisgICAgICAiXG4iKTsKK30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZU1ldGhvZFNpZ25hdHVyZXMoVmlydHVhbE9yTm9uIHZpcnR1YWxfb3Jfbm9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7CisgICAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJzXyk7CisgICAgSW5pdE1ldGhvZFZhcmlhYmxlcyhtZXRob2QsIG9wdGlvbnNfLCAmZm9ybWF0KTsKKyAgICBmb3JtYXQuU2V0KCJ2aXJ0dWFsIiwgdmlydHVhbF9vcl9ub24gPT0gVklSVFVBTCA/ICJ2aXJ0dWFsICIgOiAiIik7CisgICAgZm9ybWF0KAorICAgICAgICAiJHZpcnR1YWwkdm9pZCAkbmFtZSQoOjokcHJvdG9fbnMkOjpScGNDb250cm9sbGVyKiBjb250cm9sbGVyLFxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgY29uc3QgJGlucHV0X3R5cGUkKiByZXF1ZXN0LFxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgJG91dHB1dF90eXBlJCogcmVzcG9uc2UsXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkNsb3N1cmUqIGRvbmUpO1xuIik7CisgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlSW1wbGVtZW50YXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJzXyk7CisgIGZvcm1hdCgKKyAgICAgICIkY2xhc3NuYW1lJDo6fiRjbGFzc25hbWUkKCkge31cbiIKKyAgICAgICJcbiIKKyAgICAgICJjb25zdCA6OiRwcm90b19ucyQ6OlNlcnZpY2VEZXNjcmlwdG9yKiAkY2xhc3NuYW1lJDo6ZGVzY3JpcHRvcigpIHtcbiIKKyAgICAgICIgICIKKyAgICAgICI6OiRwcm90b19ucyQ6OmludGVybmFsOjpBc3NpZ25EZXNjcmlwdG9ycygmJGRlc2NfdGFibGUkKTtcbiIKKyAgICAgICIgIHJldHVybiAkZmlsZV9sZXZlbF9zZXJ2aWNlX2Rlc2NyaXB0b3JzJFskMSRdO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIKKyAgICAgICJjb25zdCA6OiRwcm90b19ucyQ6OlNlcnZpY2VEZXNjcmlwdG9yKiAkY2xhc3NuYW1lJDo6R2V0RGVzY3JpcHRvcigpIHtcbiIKKyAgICAgICIgIHJldHVybiBkZXNjcmlwdG9yKCk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgIGluZGV4X2luX21ldGFkYXRhXyk7CisKKyAgLy8gR2VuZXJhdGUgbWV0aG9kcyBvZiB0aGUgaW50ZXJmYWNlLgorICBHZW5lcmF0ZU5vdEltcGxlbWVudGVkTWV0aG9kcyhwcmludGVyKTsKKyAgR2VuZXJhdGVDYWxsTWV0aG9kKHByaW50ZXIpOworICBHZW5lcmF0ZUdldFByb3RvdHlwZShSRVFVRVNULCBwcmludGVyKTsKKyAgR2VuZXJhdGVHZXRQcm90b3R5cGUoUkVTUE9OU0UsIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIHN0dWIgaW1wbGVtZW50YXRpb24uCisgIGZvcm1hdCgKKyAgICAgICIkY2xhc3NuYW1lJF9TdHViOjokY2xhc3NuYW1lJF9TdHViKDo6JHByb3RvX25zJDo6UnBjQ2hhbm5lbCogY2hhbm5lbClcbiIKKyAgICAgICIgIDogY2hhbm5lbF8oY2hhbm5lbCksIG93bnNfY2hhbm5lbF8oZmFsc2UpIHt9XG4iCisgICAgICAiJGNsYXNzbmFtZSRfU3R1Yjo6JGNsYXNzbmFtZSRfU3R1YihcbiIKKyAgICAgICIgICAgOjokcHJvdG9fbnMkOjpScGNDaGFubmVsKiBjaGFubmVsLFxuIgorICAgICAgIiAgICA6OiRwcm90b19ucyQ6OlNlcnZpY2U6OkNoYW5uZWxPd25lcnNoaXAgb3duZXJzaGlwKVxuIgorICAgICAgIiAgOiBjaGFubmVsXyhjaGFubmVsKSxcbiIKKyAgICAgICIgICAgb3duc19jaGFubmVsXyhvd25lcnNoaXAgPT0gIgorICAgICAgIjo6JHByb3RvX25zJDo6U2VydmljZTo6U1RVQl9PV05TX0NIQU5ORUwpICIKKyAgICAgICJ7fVxuIgorICAgICAgIiRjbGFzc25hbWUkX1N0dWI6On4kY2xhc3NuYW1lJF9TdHViKCkge1xuIgorICAgICAgIiAgaWYgKG93bnNfY2hhbm5lbF8pIGRlbGV0ZSBjaGFubmVsXztcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKKworICBHZW5lcmF0ZVN0dWJNZXRob2RzKHByaW50ZXIpOworfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlTm90SW1wbGVtZW50ZWRNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOworICAgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyc18pOworICAgIEluaXRNZXRob2RWYXJpYWJsZXMobWV0aG9kLCBvcHRpb25zXywgJmZvcm1hdCk7CisgICAgZm9ybWF0KAorICAgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6JG5hbWUkKDo6JHByb3RvX25zJDo6UnBjQ29udHJvbGxlciogY29udHJvbGxlcixcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkaW5wdXRfdHlwZSQqLFxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICRvdXRwdXRfdHlwZSQqLFxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6Q2xvc3VyZSogZG9uZSkge1xuIgorICAgICAgICAiICBjb250cm9sbGVyLT5TZXRGYWlsZWQoXCJNZXRob2QgJG5hbWUkKCkgbm90IGltcGxlbWVudGVkLlwiKTtcbiIKKyAgICAgICAgIiAgZG9uZS0+UnVuKCk7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJcbiIpOworICB9Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVDYWxsTWV0aG9kKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyc18pOworICBmb3JtYXQoCisgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6Q2FsbE1ldGhvZChjb25zdCA6OiRwcm90b19ucyQ6Ok1ldGhvZERlc2NyaXB0b3IqICIKKyAgICAgICJtZXRob2QsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OiRwcm90b19ucyQ6OlJwY0NvbnRyb2xsZXIqIGNvbnRyb2xsZXIsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OiRwcm90b19ucyQ6Ok1lc3NhZ2UqIHJlcXVlc3QsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OiRwcm90b19ucyQ6Ok1lc3NhZ2UqIHJlc3BvbnNlLFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpDbG9zdXJlKiBkb25lKSB7XG4iCisgICAgICAiICBHT09HTEVfRENIRUNLX0VRKG1ldGhvZC0+c2VydmljZSgpLCAkZmlsZV9sZXZlbF9zZXJ2aWNlX2Rlc2NyaXB0b3JzJFskMSRdKTtcbiIKKyAgICAgICIgIHN3aXRjaChtZXRob2QtPmluZGV4KCkpIHtcbiIsCisgICAgICBpbmRleF9pbl9tZXRhZGF0YV8pOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOworICAgIEZvcm1hdHRlciBmb3JtYXRfbWV0aG9kKHByaW50ZXIsIHZhcnNfKTsKKyAgICBJbml0TWV0aG9kVmFyaWFibGVzKG1ldGhvZCwgb3B0aW9uc18sICZmb3JtYXRfbWV0aG9kKTsKKworICAgIC8vIE5vdGU6ICBkb3duX2Nhc3QgZG9lcyBub3Qgd29yayBoZXJlIGJlY2F1c2UgaXQgb25seSB3b3JrcyBvbiBwb2ludGVycywKKyAgICAvLyAgIG5vdCByZWZlcmVuY2VzLgorICAgIGZvcm1hdF9tZXRob2QoCisgICAgICAgICIgICAgY2FzZSAkMSQ6XG4iCisgICAgICAgICIgICAgICAkbmFtZSQoY29udHJvbGxlcixcbiIKKyAgICAgICAgIiAgICAgICAgICAgICA6OiRwcm90b19ucyQ6OmludGVybmFsOjpEb3duQ2FzdDxjb25zdCAkaW5wdXRfdHlwZSQqPihcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgcmVxdWVzdCksXG4iCisgICAgICAgICIgICAgICAgICAgICAgOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6RG93bkNhc3Q8JG91dHB1dF90eXBlJCo+KFxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICByZXNwb25zZSksXG4iCisgICAgICAgICIgICAgICAgICAgICAgZG9uZSk7XG4iCisgICAgICAgICIgICAgICBicmVhaztcbiIsCisgICAgICAgIGkpOworICB9CisKKyAgZm9ybWF0KAorICAgICAgIiAgICBkZWZhdWx0OlxuIgorICAgICAgIiAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8IFwiQmFkIG1ldGhvZCBpbmRleDsgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLlwiO1xuIgorICAgICAgIiAgICAgIGJyZWFrO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIpOworfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlR2V0UHJvdG90eXBlKFJlcXVlc3RPclJlc3BvbnNlIHdoaWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcnNfKTsKKyAgaWYgKHdoaWNoID09IFJFUVVFU1QpIHsKKyAgICBmb3JtYXQoImNvbnN0IDo6JHByb3RvX25zJDo6TWVzc2FnZSYgJGNsYXNzbmFtZSQ6OkdldFJlcXVlc3RQcm90b3R5cGUoXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoImNvbnN0IDo6JHByb3RvX25zJDo6TWVzc2FnZSYgJGNsYXNzbmFtZSQ6OkdldFJlc3BvbnNlUHJvdG90eXBlKFxuIik7CisgIH0KKworICBmb3JtYXQoCisgICAgICAiICAgIGNvbnN0IDo6JHByb3RvX25zJDo6TWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKSBjb25zdCB7XG4iCisgICAgICAiICBHT09HTEVfRENIRUNLX0VRKG1ldGhvZC0+c2VydmljZSgpLCBkZXNjcmlwdG9yKCkpO1xuIgorICAgICAgIiAgc3dpdGNoKG1ldGhvZC0+aW5kZXgoKSkge1xuIik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7CisgICAgY29uc3QgRGVzY3JpcHRvciogdHlwZSA9CisgICAgICAgICh3aGljaCA9PSBSRVFVRVNUKSA/IG1ldGhvZC0+aW5wdXRfdHlwZSgpIDogbWV0aG9kLT5vdXRwdXRfdHlwZSgpOworCisgICAgZm9ybWF0KAorICAgICAgICAiICAgIGNhc2UgJDEkOlxuIgorICAgICAgICAiICAgICAgcmV0dXJuICQyJDo6ZGVmYXVsdF9pbnN0YW5jZSgpO1xuIiwKKyAgICAgICAgaSwgUXVhbGlmaWVkQ2xhc3NOYW1lKHR5cGUsIG9wdGlvbnNfKSk7CisgIH0KKworICBmb3JtYXQoCisgICAgICAiICAgIGRlZmF1bHQ6XG4iCisgICAgICAiICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgXCJCYWQgbWV0aG9kIGluZGV4OyB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4uXCI7XG4iCisgICAgICAiICAgICAgcmV0dXJuICo6OiRwcm90b19ucyQ6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpXG4iCisgICAgICAiICAgICAgICAgIC0+R2V0UHJvdG90eXBlKG1ldGhvZC0+JDEkX3R5cGUoKSk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgIHdoaWNoID09IFJFUVVFU1QgPyAiaW5wdXQiIDogIm91dHB1dCIpOworfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlU3R1Yk1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7CisgICAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJzXyk7CisgICAgSW5pdE1ldGhvZFZhcmlhYmxlcyhtZXRob2QsIG9wdGlvbnNfLCAmZm9ybWF0KTsKKyAgICBmb3JtYXQoCisgICAgICAgICJ2b2lkICRjbGFzc25hbWUkX1N0dWI6OiRuYW1lJCg6OiRwcm90b19ucyQ6OlJwY0NvbnRyb2xsZXIqICIKKyAgICAgICAgImNvbnRyb2xsZXIsXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkaW5wdXRfdHlwZSQqIHJlcXVlc3QsXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3V0cHV0X3R5cGUkKiByZXNwb25zZSxcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6Q2xvc3VyZSogZG9uZSkge1xuIgorICAgICAgICAiICBjaGFubmVsXy0+Q2FsbE1ldGhvZChkZXNjcmlwdG9yKCktPm1ldGhvZCgkMSQpLFxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCByZXF1ZXN0LCByZXNwb25zZSwgZG9uZSk7XG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICBpKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvc2VydmljZS5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvc2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYmQyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9zZXJ2aWNlLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1NFUlZJQ0VfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfU0VSVklDRV9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvb3B0aW9ucy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworY2xhc3MgUHJpbnRlcjsgIC8vIHByaW50ZXIuaAorfQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworY2xhc3MgU2VydmljZUdlbmVyYXRvciB7CisgcHVibGljOgorICAvLyBTZWUgZ2VuZXJhdG9yLmNjIGZvciB0aGUgbWVhbmluZyBvZiBkbGxleHBvcnRfZGVjbC4KKyAgZXhwbGljaXQgU2VydmljZUdlbmVyYXRvcihjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICB+U2VydmljZUdlbmVyYXRvcigpOworCisgIC8vIEhlYWRlciBzdHVmZi4KKworICAvLyBHZW5lcmF0ZSB0aGUgY2xhc3MgZGVmaW5pdGlvbnMgZm9yIHRoZSBzZXJ2aWNlJ3MgaW50ZXJmYWNlIGFuZCB0aGUKKyAgLy8gc3R1YiBpbXBsZW1lbnRhdGlvbi4KKyAgdm9pZCBHZW5lcmF0ZURlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gU291cmNlIGZpbGUgc3R1ZmYuCisKKyAgLy8gR2VuZXJhdGUgaW1wbGVtZW50YXRpb25zIG9mIGV2ZXJ5dGhpbmcgZGVjbGFyZWQgYnkKKyAgLy8gR2VuZXJhdGVEZWNsYXJhdGlvbnMoKS4KKyAgdm9pZCBHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworIHByaXZhdGU6CisgIGVudW0gUmVxdWVzdE9yUmVzcG9uc2UgeyBSRVFVRVNULCBSRVNQT05TRSB9OworICBlbnVtIFZpcnR1YWxPck5vbiB7IFZJUlRVQUwsIE5PTl9WSVJUVUFMIH07CisKKyAgLy8gSGVhZGVyIHN0dWZmLgorCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2aWNlIGFic3RyYWN0IGludGVyZmFjZS4KKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHN0dWIgY2xhc3MgZGVmaW5pdGlvbi4KKyAgdm9pZCBHZW5lcmF0ZVN0dWJEZWZpbml0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBQcmludHMgc2lnbmF0dXJlcyBmb3IgYWxsIG1ldGhvZHMgaW4gdGhlCisgIHZvaWQgR2VuZXJhdGVNZXRob2RTaWduYXR1cmVzKFZpcnR1YWxPck5vbiB2aXJ0dWFsX29yX25vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIFNvdXJjZSBmaWxlIHN0dWZmLgorCisgIC8vIEdlbmVyYXRlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2VydmljZSBtZXRob2RzLCB3aGljaAorICAvLyBwcm9kdWNlIGEgIm5vdCBpbXBsZW1lbnRlZCIgZXJyb3IuCisgIHZvaWQgR2VuZXJhdGVOb3RJbXBsZW1lbnRlZE1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIHRoZSBDYWxsTWV0aG9kKCkgbWV0aG9kIG9mIHRoZSBzZXJ2aWNlLgorICB2b2lkIEdlbmVyYXRlQ2FsbE1ldGhvZChpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgdGhlIEdldHtSZXF1ZXN0LFJlc3BvbnNlfVByb3RvdHlwZSgpIG1ldGhvZHMuCisgIHZvaWQgR2VuZXJhdGVHZXRQcm90b3R5cGUoUmVxdWVzdE9yUmVzcG9uc2Ugd2hpY2gsIGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgc3R1YidzIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2VydmljZSBtZXRob2RzLgorICB2b2lkIEdlbmVyYXRlU3R1Yk1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzXzsKKyAgY29uc3QgT3B0aW9ucyYgb3B0aW9uc187CisKKyAgaW50IGluZGV4X2luX21ldGFkYXRhXzsKKworICBmcmllbmQgY2xhc3MgRmlsZUdlbmVyYXRvcjsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNlcnZpY2VHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1NFUlZJQ0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9zdHJpbmdfZmllbGQuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9zdHJpbmdfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU3Yzk2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3N0cmluZ19maWVsZC5jYwpAQCAtMCwwICsxLDk1NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9zdHJpbmdfZmllbGQuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworbmFtZXNwYWNlIHsKKwordm9pZCBTZXRTdHJpbmdWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhkZXNjcmlwdG9yLCB2YXJpYWJsZXMsIG9wdGlvbnMpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGtOUyA9ICI6OiIgKyAoKnZhcmlhYmxlcylbInByb3RvX25zIl0gKyAiOjppbnRlcm5hbDo6IjsKKyAgY29uc3Qgc3RkOjpzdHJpbmcga0FyZW5hU3RyaW5nUHRyID0ga05TICsgIkFyZW5hU3RyaW5nUHRyIjsKKworICAoKnZhcmlhYmxlcylbImRlZmF1bHQiXSA9IERlZmF1bHRWYWx1ZShvcHRpb25zLCBkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X2xlbmd0aCJdID0KKyAgICAgIFN0ckNhdChkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmxlbmd0aCgpKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X3ZhcmlhYmxlX25hbWUiXSA9IE1ha2VEZWZhdWx0TmFtZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X3ZhcmlhYmxlX2ZpZWxkIl0gPSBNYWtlRGVmYXVsdEZpZWxkTmFtZShkZXNjcmlwdG9yKTsKKworICBpZiAoZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7CisgICAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X3N0cmluZyJdID0ga05TICsgIkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpIjsKKyAgICAoKnZhcmlhYmxlcylbImRlZmF1bHRfdmFsdWUiXSA9ICImIiArICgqdmFyaWFibGVzKVsiZGVmYXVsdF9zdHJpbmciXTsKKyAgICAoKnZhcmlhYmxlcylbImxhenlfdmFyaWFibGVfYXJncyJdID0gIiI7CisgIH0gZWxzZSB7CisgICAgKCp2YXJpYWJsZXMpWyJsYXp5X3ZhcmlhYmxlIl0gPQorICAgICAgICBTdHJDYXQoUXVhbGlmaWVkQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpLCBvcHRpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgICI6OiIsIE1ha2VEZWZhdWx0RmllbGROYW1lKGRlc2NyaXB0b3IpKTsKKworICAgICgqdmFyaWFibGVzKVsiZGVmYXVsdF9zdHJpbmciXSA9ICgqdmFyaWFibGVzKVsibGF6eV92YXJpYWJsZSJdICsgIi5nZXQoKSI7CisgICAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X3ZhbHVlIl0gPSAibnVsbHB0ciI7CisgICAgKCp2YXJpYWJsZXMpWyJsYXp5X3ZhcmlhYmxlX2FyZ3MiXSA9ICgqdmFyaWFibGVzKVsibGF6eV92YXJpYWJsZSJdICsgIiwgIjsKKyAgfQorCisgICgqdmFyaWFibGVzKVsicG9pbnRlcl90eXBlIl0gPQorICAgICAgZGVzY3JpcHRvci0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyA/ICJ2b2lkIiA6ICJjaGFyIjsKKyAgKCp2YXJpYWJsZXMpWyJzZXR0ZXIiXSA9CisgICAgICBkZXNjcmlwdG9yLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTID8gIlNldEJ5dGVzIiA6ICJTZXQiOworICAoKnZhcmlhYmxlcylbIm51bGxfY2hlY2siXSA9ICgqdmFyaWFibGVzKVsiRENISyJdICsgIih2YWx1ZSAhPSBudWxscHRyKTtcbiI7CisgIC8vIE5PVEU6IEVzY2FwZWQgaGVyZSB0byB1bmJsb2NrIHByb3RvMS0+cHJvdG8yIG1pZ3JhdGlvbi4KKyAgLy8gVE9ETyhsaXVqaXNpKTogRXh0ZW5kIHRoaXMgdG8gYXBwbHkgZm9yIG90aGVyIGNvbmZsaWN0aW5nIG1ldGhvZHMuCisgICgqdmFyaWFibGVzKVsicmVsZWFzZV9uYW1lIl0gPQorICAgICAgU2FmZUZ1bmN0aW9uTmFtZShkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSwgZGVzY3JpcHRvciwgInJlbGVhc2VfIik7CisgICgqdmFyaWFibGVzKVsiZnVsbF9uYW1lIl0gPSBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKTsKKworICBpZiAob3B0aW9ucy5vcGVuc291cmNlX3J1bnRpbWUpIHsKKyAgICAoKnZhcmlhYmxlcylbInN0cmluZ19waWVjZSJdID0gIjo6c3RkOjpzdHJpbmciOworICB9IGVsc2UgeworICAgICgqdmFyaWFibGVzKVsic3RyaW5nX3BpZWNlIl0gPSAiOjpTdHJpbmdQaWVjZSI7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU3RyaW5nRmllbGRHZW5lcmF0b3I6OlN0cmluZ0ZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgb3B0aW9ucyksCisgICAgICBpbmxpbmVkXyhJc1N0cmluZ0lubGluZWQoZGVzY3JpcHRvciwgb3B0aW9ucykpIHsKKyAgU2V0U3RyaW5nVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfLCBvcHRpb25zKTsKK30KKworU3RyaW5nRmllbGRHZW5lcmF0b3I6On5TdHJpbmdGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgaWYgKCFpbmxpbmVkXykgeworICAgIGZvcm1hdCgiOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgJG5hbWUkXztcbiIpOworICB9IGVsc2UgeworICAgIC8vIFNraXBzIHRoZSBhdXRvbWF0aWMgZGVzdHJ1Y3Rpb247IHJhdGhlciBjYWxscyBpdCBleHBsaWNpdGx5IGlmCisgICAgLy8gYWxsb2NhdGluZyBhcmVuYSBpcyBudWxsLiBUaGlzIGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgbWVzc2FnZS1vd25lZAorICAgIC8vIGFyZW5hIChnby9wYXRoLXRvLWFyZW5hcykgd2hlcmUgYSByb290IHByb3RvIGlzIGRlc3Ryb3llZCBidXQKKyAgICAvLyBJbmxpbmVkU3RyaW5nRmllbGQgbWF5IGhhdmUgYXJlbmEtYWxsb2NhdGVkIG1lbW9yeS4KKyAgICBmb3JtYXQoIjo6JHByb3RvX25zJDo6aW50ZXJuYWw6OklubGluZWRTdHJpbmdGaWVsZCAkbmFtZSRfO1xuIik7CisgIH0KK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTdGF0aWNNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmICghZGVzY3JpcHRvcl8tPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgInN0YXRpYyBjb25zdCA6OiRwcm90b19ucyQ6OmludGVybmFsOjpMYXp5U3RyaW5nIgorICAgICAgICAiICRkZWZhdWx0X3ZhcmlhYmxlX25hbWUkO1xuIik7CisgIH0KKyAgaWYgKGlubGluZWRfKSB7CisgICAgLy8gYF9pbml0X2lubGluZV94eHhgIGlzIHVzZWQgZm9yIGluaXRpYWxpemluZyBkZWZhdWx0IGluc3RhbmNlcy4KKyAgICBmb3JtYXQoInN0YXRpYyBzdGQ6OnRydWVfdHlwZSBfaW5pdF9pbmxpbmVfJG5hbWUkXztcbiIpOworICB9Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgLy8gSWYgd2UncmUgdXNpbmcgU3RyaW5nRmllbGRHZW5lcmF0b3IgZm9yIGEgZmllbGQgd2l0aCBhIGN0eXBlLCBpdCdzCisgIC8vIGJlY2F1c2UgdGhhdCBjdHlwZSBpc24ndCBhY3R1YWxseSBpbXBsZW1lbnRlZC4gIEluIHBhcnRpY3VsYXIsIHRoaXMgaXMKKyAgLy8gdHJ1ZSBvZiBjdHlwZT1DT1JEIGFuZCBjdHlwZT1TVFJJTkdfUElFQ0UgaW4gdGhlIG9wZW4gc291cmNlIHJlbGVhc2UuCisgIC8vIFdlIGFyZW4ndCByZWxlYXNpbmcgQ29yZCBiZWNhdXNlIGl0IGhhcyB0b28gbWFueSBHb29nbGUtc3BlY2lmaWMKKyAgLy8gZGVwZW5kZW5jaWVzIGFuZCB3ZSBhcmVuJ3QgcmVsZWFzaW5nIFN0cmluZ1BpZWNlIGJlY2F1c2UgaXQncyBoYXJkbHkKKyAgLy8gdXNlZnVsIG91dHNpZGUgb2YgR29vZ2xlIGFuZCBiZWNhdXNlIGl0IHdvdWxkIGdldCBjb25mdXNpbmcgdG8gaGF2ZQorICAvLyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIFN0cmluZ1BpZWNlIGNsYXNzIGluIGRpZmZlcmVudCBsaWJyYXJpZXMgKFBDUkUKKyAgLy8gYWxyZWFkeSBpbmNsdWRlcyBpdCBmb3IgdGhlaXIgQysrIGJpbmRpbmdzLCB3aGljaCBjYW1lIGZyb20gR29vZ2xlKS4KKyAgLy8KKyAgLy8gSW4gYW55IGNhc2UsIHdlIG1ha2UgYWxsIHRoZSBhY2Nlc3NvcnMgcHJpdmF0ZSB3aGlsZSBzdGlsbCBhY3R1YWxseQorICAvLyB1c2luZyBhIHN0cmluZyB0byByZXByZXNlbnQgdGhlIGZpZWxkIGludGVybmFsbHkuICBUaGlzIHdheSwgd2UgY2FuCisgIC8vIGd1YXJhbnRlZSB0aGF0IGlmIHdlIGRvIGV2ZXIgaW1wbGVtZW50IHRoZSBjdHlwZSwgaXQgd29uJ3QgYnJlYWsgYW55CisgIC8vIGV4aXN0aW5nIHVzZXJzIHdobyBtaWdodCBiZSAtLSBmb3Igd2hhdGV2ZXIgcmVhc29uIC0tIGFscmVhZHkgdXNpbmcgLnByb3RvCisgIC8vIGZpbGVzIHRoYXQgYXBwbGllZCB0aGUgY3R5cGUuICBUaGUgZmllbGQgY2FuIHN0aWxsIGJlIGFjY2Vzc2VkIHZpYSB0aGUKKyAgLy8gcmVmbGVjdGlvbiBpbnRlcmZhY2Ugc2luY2UgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlIGlzIGluZGVwZW5kZW50IG9mCisgIC8vIHRoZSBzdHJpbmcncyB1bmRlcmx5aW5nIHJlcHJlc2VudGF0aW9uLgorCisgIGJvb2wgdW5rbm93bl9jdHlwZSA9IGRlc2NyaXB0b3JfLT5vcHRpb25zKCkuY3R5cGUoKSAhPQorICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RpdmVTdHJpbmdDVHlwZShkZXNjcmlwdG9yXywgb3B0aW9uc18pOworCisgIGlmICh1bmtub3duX2N0eXBlKSB7CisgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICBmb3JtYXQoCisgICAgICAgICIgcHJpdmF0ZTpcbiIKKyAgICAgICAgIiAgLy8gSGlkZGVuIGR1ZSB0byB1bmtub3duIGN0eXBlIG9wdGlvbi5cbiIpOworICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgfQorCisgIGZvcm1hdCgKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJGNvbnN0IHN0ZDo6c3RyaW5nJiAkezEkJG5hbWUkJH0kKCkgY29uc3Q7XG4iCisgICAgICAidGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPlxuIgorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCAkezEkc2V0XyRuYW1lJCR9JChBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7XG4iLAorICAgICAgZGVzY3JpcHRvcl8pOworICBmb3JtYXQoCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciRzdGQ6OnN0cmluZyogJHsxJG11dGFibGVfJG5hbWUkJH0kKCk7XG4iCisgICAgICAiUFJPVE9CVUZfTk9ESVNDQVJEICRkZXByZWNhdGVkX2F0dHIkc3RkOjpzdHJpbmcqICIKKyAgICAgICIkezEkJHJlbGVhc2VfbmFtZSQkfSQoKTtcbiIKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgJHsxJHNldF9hbGxvY2F0ZWRfJG5hbWUkJH0kKHN0ZDo6c3RyaW5nKiAiCisgICAgICAiJG5hbWUkKTtcbiIsCisgICAgICBkZXNjcmlwdG9yXyk7CisgIGZvcm1hdCgKKyAgICAgICJwcml2YXRlOlxuIgorICAgICAgImNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfJG5hbWUkKCkgY29uc3Q7XG4iCisgICAgICAiaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCAiCisgICAgICAiX2ludGVybmFsX3NldF8kbmFtZSQoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTtcbiIKKyAgICAgICJzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfJG5hbWUkKCk7XG4iKTsKKyAgaWYgKGlubGluZWRfKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgYm9vbCBfaW50ZXJuYWxfJG5hbWUkX2RvbmF0ZWQoKSAiCisgICAgICAgICJjb25zdDtcbiIpOworICB9CisgIGZvcm1hdCgicHVibGljOlxuIik7CisKKyAgaWYgKHVua25vd25fY3R5cGUpIHsKKyAgICBmb3JtYXQuT3V0ZGVudCgpOworICAgIGZvcm1hdCgiIHB1YmxpYzpcbiIpOworICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgfQorfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgImlubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICIkYW5ub3RhdGVfZ2V0JCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iKTsKKyAgaWYgKCFkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiICBpZiAoJGZpZWxkJC5Jc0RlZmF1bHQoKSkgcmV0dXJuICIKKyAgICAgICAgIiRkZWZhdWx0X3ZhcmlhYmxlX2ZpZWxkJC5nZXQoKTtcbiIpOworICB9CisgIGZvcm1hdCgKKyAgICAgICIgIHJldHVybiBfaW50ZXJuYWxfJG5hbWUkKCk7XG4iCisgICAgICAifVxuIik7CisgIGlmICghaW5saW5lZF8pIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJ0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+XG4iCisgICAgICAgICJpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORVxuIgorICAgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykge1xuIgorICAgICAgICAiJG1heWJlX3ByZXBhcmVfc3BsaXRfbWVzc2FnZSQiCisgICAgICAgICIgJHNldF9oYXNiaXQkXG4iCisgICAgICAgICIgJGZpZWxkJC4kc2V0dGVyJChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIgorICAgICAgICAiIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTtcbiIKKyAgICAgICAgIiRhbm5vdGF0ZV9zZXQkIgorICAgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0KAorICAgICAgICAidGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPlxuIgorICAgICAgICAiaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkVcbiIKKyAgICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHtcbiIKKyAgICAgICAgIiRtYXliZV9wcmVwYXJlX3NwbGl0X21lc3NhZ2UkIgorICAgICAgICAiICRzZXRfaGFzYml0JFxuIgorICAgICAgICAiICRmaWVsZCQuJHNldHRlciQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCIKKyAgICAgICAgIiBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSwgX2ludGVybmFsXyRuYW1lJF9kb25hdGVkKCksICIKKyAgICAgICAgIiYkZG9uYXRpbmdfc3RhdGVzX3dvcmQkLCAkbWFza19mb3JfdW5kb25hdGUkLCB0aGlzKTtcbiIKKyAgICAgICAgIiRhbm5vdGF0ZV9zZXQkIgorICAgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgICAifVxuIgorICAgICAgICAiaW5saW5lIGJvb2wgJGNsYXNzbmFtZSQ6Ol9pbnRlcm5hbF8kbmFtZSRfZG9uYXRlZCgpIGNvbnN0IHtcbiIKKyAgICAgICAgIiAgYm9vbCB2YWx1ZSA9ICRpbmxpbmVkX3N0cmluZ19kb25hdGVkJFxuIgorICAgICAgICAiICByZXR1cm4gdmFsdWU7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQorICBmb3JtYXQoCisgICAgICAiaW5saW5lIHN0ZDo6c3RyaW5nKiAkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoKSB7XG4iCisgICAgICAiJG1heWJlX3ByZXBhcmVfc3BsaXRfbWVzc2FnZSQiCisgICAgICAiICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV8kbmFtZSQoKTtcbiIKKyAgICAgICIkYW5ub3RhdGVfbXV0YWJsZSQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiBfcztcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiAkY2xhc3NuYW1lJDo6X2ludGVybmFsXyRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICIgIHJldHVybiAkZmllbGQkLkdldCgpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6X2ludGVybmFsX3NldF8kbmFtZSQoY29uc3Qgc3RkOjpzdHJpbmcmICIKKyAgICAgICJ2YWx1ZSkge1xuIgorICAgICAgIiAgJHNldF9oYXNiaXQkXG4iKTsKKyAgaWYgKCFpbmxpbmVkXykgeworICAgIGZvcm1hdCgKKyAgICAgICAgIiAgJGZpZWxkJC5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTtcbiIKKyAgICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgKKyAgICAgICAgIiAgJGZpZWxkJC5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpLFxuIgorICAgICAgICAiICAgIF9pbnRlcm5hbF8kbmFtZSRfZG9uYXRlZCgpLCAmJGRvbmF0aW5nX3N0YXRlc193b3JkJCwgIgorICAgICAgICAiJG1hc2tfZm9yX3VuZG9uYXRlJCwgdGhpcyk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQorICBmb3JtYXQoCisgICAgICAiaW5saW5lIHN0ZDo6c3RyaW5nKiAkY2xhc3NuYW1lJDo6X2ludGVybmFsX211dGFibGVfJG5hbWUkKCkge1xuIgorICAgICAgIiAgJHNldF9oYXNiaXQkXG4iKTsKKyAgaWYgKCFpbmxpbmVkXykgeworICAgIGZvcm1hdCgKKyAgICAgICAgIiAgcmV0dXJuICRmaWVsZCQuTXV0YWJsZSgkbGF6eV92YXJpYWJsZV9hcmdzJCIKKyAgICAgICAgIkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTtcbiIKKyAgICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgKKyAgICAgICAgIiAgcmV0dXJuICRmaWVsZCQuTXV0YWJsZSgkbGF6eV92YXJpYWJsZV9hcmdzJCIKKyAgICAgICAgIkdldEFyZW5hRm9yQWxsb2NhdGlvbigpLCBfaW50ZXJuYWxfJG5hbWUkX2RvbmF0ZWQoKSwgIgorICAgICAgICAiJiRkb25hdGluZ19zdGF0ZXNfd29yZCQsICRtYXNrX2Zvcl91bmRvbmF0ZSQsIHRoaXMpO1xuIgorICAgICAgICAifVxuIik7CisgIH0KKyAgZm9ybWF0KAorICAgICAgImlubGluZSBzdGQ6OnN0cmluZyogJGNsYXNzbmFtZSQ6OiRyZWxlYXNlX25hbWUkKCkge1xuIgorICAgICAgIiRhbm5vdGF0ZV9yZWxlYXNlJCIKKyAgICAgICIkbWF5YmVfcHJlcGFyZV9zcGxpdF9tZXNzYWdlJCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOiRmdWxsX25hbWUkKVxuIik7CisKKyAgaWYgKEhhc0hhc2JpdChkZXNjcmlwdG9yXykpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICIgIGlmICghX2ludGVybmFsX2hhc18kbmFtZSQoKSkge1xuIgorICAgICAgICAiICAgIHJldHVybiBudWxscHRyO1xuIgorICAgICAgICAiICB9XG4iCisgICAgICAgICIgICRjbGVhcl9oYXNiaXQkXG4iKTsKKyAgICBpZiAoIWlubGluZWRfKSB7CisgICAgICBmb3JtYXQoIiAgYXV0byogcCA9ICRmaWVsZCQuUmVsZWFzZSgpO1xuIik7CisgICAgICBpZiAoZGVzY3JpcHRvcl8tPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKSkgeworICAgICAgICBmb3JtYXQoCisgICAgICAgICAgICAiI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkdcbiIKKyAgICAgICAgICAgICIgIGlmICgkZmllbGQkLklzRGVmYXVsdCgpKSB7XG4iCisgICAgICAgICAgICAiICAgICRmaWVsZCQuU2V0KFwiXCIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTtcbiIKKyAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICIjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklOR1xuIik7CisgICAgICB9CisgICAgICBmb3JtYXQoIiAgcmV0dXJuIHA7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9ybWF0KAorICAgICAgICAgICIgIHJldHVybiAkZmllbGQkLlJlbGVhc2UoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCksICIKKyAgICAgICAgICAiX2ludGVybmFsXyRuYW1lJF9kb25hdGVkKCkpO1xuIik7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvcm1hdCgiICByZXR1cm4gJGZpZWxkJC5SZWxlYXNlKCk7XG4iKTsKKyAgfQorCisgIGZvcm1hdCgKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF9hbGxvY2F0ZWRfJG5hbWUkKHN0ZDo6c3RyaW5nKiAkbmFtZSQpIHtcbiIKKyAgICAgICIkbWF5YmVfcHJlcGFyZV9zcGxpdF9tZXNzYWdlJCIKKyAgICAgICIgIGlmICgkbmFtZSQgIT0gbnVsbHB0cikge1xuIgorICAgICAgIiAgICAkc2V0X2hhc2JpdCRcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgICRjbGVhcl9oYXNiaXQkXG4iCisgICAgICAiICB9XG4iKTsKKyAgaWYgKCFpbmxpbmVkXykgeworICAgIGZvcm1hdCgiICAkZmllbGQkLlNldEFsbG9jYXRlZCgkbmFtZSQsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTtcbiIpOworICAgIGlmIChkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7CisgICAgICBmb3JtYXQoCisgICAgICAgICAgIiNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HXG4iCisgICAgICAgICAgIiAgaWYgKCRmaWVsZCQuSXNEZWZhdWx0KCkpIHtcbiIKKyAgICAgICAgICAiICAgICRmaWVsZCQuU2V0KFwiXCIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTtcbiIKKyAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgIiNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HXG4iKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gQ3VycmVudGx5LCBzdHJpbmcgZmllbGRzIHdpdGggZGVmYXVsdCB2YWx1ZSBjYW4ndCBiZSBpbmxpbmVkLgorICAgIGZvcm1hdCgKKyAgICAgICAgIiAgICAkZmllbGQkLlNldEFsbG9jYXRlZChudWxscHRyLCAkbmFtZSQsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpLCAiCisgICAgICAgICJfaW50ZXJuYWxfJG5hbWUkX2RvbmF0ZWQoKSwgJiRkb25hdGluZ19zdGF0ZXNfd29yZCQsICIKKyAgICAgICAgIiRtYXNrX2Zvcl91bmRvbmF0ZSQsIHRoaXMpO1xuIik7CisgIH0KKyAgZm9ybWF0KAorICAgICAgIiRhbm5vdGF0ZV9zZXQkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTm9uSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoIWRlc2NyaXB0b3JfLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmVtcHR5KCkpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJjb25zdCA6OiRwcm90b19ucyQ6OmludGVybmFsOjpMYXp5U3RyaW5nICIKKyAgICAgICAgIiRjbGFzc25hbWUkOjokZGVmYXVsdF92YXJpYWJsZV9maWVsZCQiCisgICAgICAgICJ7e3skZGVmYXVsdCQsICRkZWZhdWx0X2xlbmd0aCR9fSwge251bGxwdHJ9fTtcbiIpOworICB9Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7CisgICAgZm9ybWF0KCIkZmllbGQkLkNsZWFyVG9FbXB0eSgpO1xuIik7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDSyghaW5saW5lZF8pOworICAgIGZvcm1hdCgKKyAgICAgICAgIiRmaWVsZCQuQ2xlYXJUb0RlZmF1bHQoJGxhenlfdmFyaWFibGUkLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7XG4iKTsKKyAgfQorfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lc3NhZ2VDbGVhcmluZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgLy8gVHdvLWRpbWVuc2lvbiBzcGVjaWFsaXphdGlvbiBoZXJlOiBzdXBwb3J0aW5nIGFyZW5hcywgZmllbGQgcHJlc2VuY2UsIG9yCisgIC8vIG5vdCwgYW5kIGRlZmF1bHQgdmFsdWUgaXMgdGhlIGVtcHR5IHN0cmluZyBvciBub3QuIENvbXBsZXhpdHkgaGVyZSBlbnN1cmVzCisgIC8vIHRoZSBtaW5pbWFsIG51bWJlciBvZiBicmFuY2hlcyAvIGFtb3VudCBvZiBleHRyYW5lb3VzIGNvZGUgYXQgcnVudGltZQorICAvLyAoZ2l2ZW4gdGhhdCB0aGUgYmVsb3cgbWV0aG9kcyBhcmUgaW5saW5lZCBvbmUtbGluZXJzKSEKKworICAvLyBJZiB3ZSBoYXZlIGEgaGFzYml0LCB0aGVuIHRoZSBDbGVhcigpIG1ldGhvZCBvZiB0aGUgcHJvdG9jb2wgYnVmZmVyCisgIC8vIHdpbGwgaGF2ZSBjaGVja2VkIHRoYXQgdGhpcyBmaWVsZCBpcyBzZXQuICBJZiBzbywgd2UgY2FuIGF2b2lkIHJlZHVuZGFudAorICAvLyBjaGVja3MgYWdhaW5zdCB0aGUgZGVmYXVsdCB2YXJpYWJsZS4KKyAgY29uc3QgYm9vbCBtdXN0X2JlX3ByZXNlbnQgPSBIYXNIYXNiaXQoZGVzY3JpcHRvcl8pOworCisgIGlmIChpbmxpbmVkXyAmJiBtdXN0X2JlX3ByZXNlbnQpIHsKKyAgICAvLyBDYWxsaW5nIG11dGFibGVfJG5hbWUkKCkgZ2l2ZXMgdXMgYSBzdHJpbmcgcmVmZXJlbmNlIGFuZCBzZXRzIHRoZSBoYXMgYml0CisgICAgLy8gZm9yICRuYW1lJCAoaW4gcHJvdG8yKS4gIFdlIG1heSBnZXQgaGVyZSB3aGVuIHRoZSBzdHJpbmcgZmllbGQgaXMgaW5saW5lZAorICAgIC8vIGJ1dCB0aGUgc3RyaW5nJ3MgY29udGVudHMgaGF2ZSBub3QgYmVlbiBjaGFuZ2VkIGJ5IHRoZSB1c2VyLCBzbyB3ZSBjYW5ub3QKKyAgICAvLyBtYWtlIGFuIGFzc2VydGlvbiBhYm91dCB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBhbmQgY291bGQgbmV2ZXIgbWFrZQorICAgIC8vIGFuIGFzc2VydGlvbiBhYm91dCB0aGUgc3RyaW5nIGluc3RhbmNlLgorICAgIC8vCisgICAgLy8gRm9yIG5vbi1pbmxpbmVkIHN0cmluZ3MsIHdlIGRpc3Rpbmd1aXNoIGZyb20gbm9uLWRlZmF1bHQgYnkgY29tcGFyaW5nCisgICAgLy8gaW5zdGFuY2VzLCByYXRoZXIgdGhhbiBjb250ZW50cy4KKyAgICBmb3JtYXQoIiREQ0hLJCghJGZpZWxkJC5Jc0RlZmF1bHQoKSk7XG4iKTsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7CisgICAgaWYgKG11c3RfYmVfcHJlc2VudCkgeworICAgICAgZm9ybWF0KCIkZmllbGQkLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTtcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBmb3JtYXQoIiRmaWVsZCQuQ2xlYXJUb0VtcHR5KCk7XG4iKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gQ2xlYXIgdG8gYSBub24tZW1wdHkgZGVmYXVsdCBpcyBtb3JlIGludm9sdmVkLCBhcyB3ZSB0cnkgdG8gdXNlIHRoZQorICAgIC8vIEFyZW5hIGlmIG9uZSBpcyBwcmVzZW50IGFuZCBtYXkgbmVlZCB0byByZWFsbG9jYXRlIHRoZSBzdHJpbmcuCisgICAgZm9ybWF0KAorICAgICAgICAiJGZpZWxkJC5DbGVhclRvRGVmYXVsdCgkbGF6eV92YXJpYWJsZSQsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTtcbiAiKTsKKyAgfQorfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIC8vIFRPRE8oZ3Bpa2UpOiBpbXByb3ZlIHRoaXMKKyAgZm9ybWF0KCJfdGhpcy0+X2ludGVybmFsX3NldF8kbmFtZSQoZnJvbS5faW50ZXJuYWxfJG5hbWUkKCkpO1xuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmICghaW5saW5lZF8pIHsKKyAgICBmb3JtYXQoCisgICAgICAgICI6OiRwcm90b19ucyQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKFxuIgorICAgICAgICAiICAgICYkZmllbGQkLCBsaHNfYXJlbmEsXG4iCisgICAgICAgICIgICAgJm90aGVyLT4kZmllbGQkLCByaHNfYXJlbmFcbiIKKyAgICAgICAgIik7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoCisgICAgICAgICI6OiRwcm90b19ucyQ6OmludGVybmFsOjpJbmxpbmVkU3RyaW5nRmllbGQ6OkludGVybmFsU3dhcChcbiIKKyAgICAgICAgIiAgJiRmaWVsZCQsIGxoc19hcmVuYSwgIgorICAgICAgICAiKCRpbmxpbmVkX3N0cmluZ19kb25hdGVkX2FycmF5JFswXSAmIDB4MXUpID09IDAsIHRoaXMsXG4iCisgICAgICAgICIgICZvdGhlci0+JGZpZWxkJCwgcmhzX2FyZW5hLCAiCisgICAgICAgICIob3RoZXItPiRpbmxpbmVkX3N0cmluZ19kb25hdGVkX2FycmF5JFswXSAmIDB4MXUpID09IDAsIG90aGVyKTtcbiIpOworICB9Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChpbmxpbmVkXyAmJiBkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIEdPT0dMRV9EQ0hFQ0soIWlubGluZWRfKTsKKyAgZm9ybWF0KCIkZmllbGQkLkluaXREZWZhdWx0KCk7XG4iKTsKKyAgaWYgKElzU3RyaW5nKGRlc2NyaXB0b3JfLCBvcHRpb25zXykgJiYKKyAgICAgIGRlc2NyaXB0b3JfLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmVtcHR5KCkpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICIjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklOR1xuIgorICAgICAgICAiICAkZmllbGQkLlNldChcIlwiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7XG4iCisgICAgICAgICIjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklOR1xuIik7CisgIH0KK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDcmVhdGVTcGxpdE1lc3NhZ2VDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEdPT0dMRV9DSEVDSyhTaG91bGRTcGxpdChkZXNjcmlwdG9yXywgb3B0aW9uc18pKTsKKyAgR09PR0xFX0NIRUNLKCFpbmxpbmVkXyk7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgicHRyLT4kbmFtZSRfLkluaXREZWZhdWx0KCk7XG4iKTsKKyAgaWYgKElzU3RyaW5nKGRlc2NyaXB0b3JfLCBvcHRpb25zXykgJiYKKyAgICAgIGRlc2NyaXB0b3JfLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmVtcHR5KCkpIHsKKyAgICBmb3JtYXQoCisgICAgICAgICIjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklOR1xuIgorICAgICAgICAiICBwdHItPiRuYW1lJF8uU2V0KFwiXCIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTtcbiIKKyAgICAgICAgIiNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HXG4iKTsKKyAgfQorfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUocHJpbnRlcik7CisgIGlmIChpbmxpbmVkXykgeworICAgIGZvcm1hdCgibmV3ICgmX3RoaXMtPiRmaWVsZCQpIDo6X3BiaTo6SW5saW5lZFN0cmluZ0ZpZWxkKCk7XG4iKTsKKyAgfQorCisgIGlmIChIYXNIYXNiaXQoZGVzY3JpcHRvcl8pKSB7CisgICAgZm9ybWF0KCJpZiAoZnJvbS5faW50ZXJuYWxfaGFzXyRuYW1lJCgpKSB7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoImlmICghZnJvbS5faW50ZXJuYWxfJG5hbWUkKCkuZW1wdHkoKSkge1xuIik7CisgIH0KKworICBmb3JtYXQuSW5kZW50KCk7CisKKyAgaWYgKCFpbmxpbmVkXykgeworICAgIGZvcm1hdCgKKyAgICAgICAgIl90aGlzLT4kZmllbGQkLlNldChmcm9tLl9pbnRlcm5hbF8kbmFtZSQoKSwgXG4iCisgICAgICAgICIgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJfdGhpcy0+JGZpZWxkJC5TZXQoZnJvbS5faW50ZXJuYWxfJG5hbWUkKCksXG4iCisgICAgICAgICIgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSwgX3RoaXMtPl9pbnRlcm5hbF8kbmFtZSRfZG9uYXRlZCgpLCAiCisgICAgICAgICImX3RoaXMtPiRkb25hdGluZ19zdGF0ZXNfd29yZCQsICRtYXNrX2Zvcl91bmRvbmF0ZSQsIF90aGlzKTtcbiIpOworICB9CisKKyAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgZm9ybWF0KCJ9XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBpZiAoIWlubGluZWRfKSB7CisgICAgaWYgKFNob3VsZFNwbGl0KGRlc2NyaXB0b3JfLCBvcHRpb25zXykpIHsKKyAgICAgIGZvcm1hdCgiJGNhY2hlZF9zcGxpdF9wdHIkLT4kbmFtZSRfLkRlc3Ryb3koKTtcbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3JtYXQoIiRmaWVsZCQuRGVzdHJveSgpO1xuIik7CisgICAgcmV0dXJuOworICB9CisgIC8vIEV4cGxpY2l0bHkgY2FsbHMgfklubGluZWRTdHJpbmdGaWVsZCBhcyBpdHMgYXV0b21hdGljIGNhbGwgaXMgZGlzYWJsZWQuCisgIC8vIERlc3RydWN0b3IgaGFzIGJlZW4gaW1wbGljaXRseSBza2lwcGVkIGFzIGEgdW5pb24sIGFuZCBldmVuIHRoZQorICAvLyBtZXNzYWdlLW93bmVkIGFyZW5hIGlzIGVuYWJsZWQsIGFyZW5hIGNvdWxkIHN0aWxsIGJlIG1pc3NpbmcgZm9yCisgIC8vIEFyZW5hOjpDcmVhdGVNZXNzYWdlKG51bGxwdHIpLgorICBHT09HTEVfRENIRUNLKCFTaG91bGRTcGxpdChkZXNjcmlwdG9yXywgb3B0aW9uc18pKTsKKyAgZm9ybWF0KCIkZmllbGQkLn5JbmxpbmVkU3RyaW5nRmllbGQoKTtcbiIpOworfQorCitBcmVuYUR0b3JOZWVkcyBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6TmVlZHNBcmVuYURlc3RydWN0b3IoKSBjb25zdCB7CisgIHJldHVybiBpbmxpbmVkXyA/IEFyZW5hRHRvck5lZWRzOjprT25EZW1hbmQgOiBBcmVuYUR0b3JOZWVkczo6a05vbmU7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQXJlbmFEZXN0cnVjdG9yQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoIWlubGluZWRfKSByZXR1cm47CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIC8vIF90aGlzIGlzIHRoZSBvYmplY3QgYmVpbmcgZGVzdHJ1Y3RlZCAod2UgYXJlIGluc2lkZSBhIHN0YXRpYyBtZXRob2QgaGVyZSkuCisgIGZvcm1hdCgKKyAgICAgICJpZiAoIV90aGlzLT5faW50ZXJuYWxfJG5hbWUkX2RvbmF0ZWQoKSkge1xuIgorICAgICAgIiAgX3RoaXMtPiRmaWVsZCQufklubGluZWRTdHJpbmdGaWVsZCgpO1xuIgorICAgICAgIn1cbiIpOworfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgaWYgKGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgeworICAgIEdlbmVyYXRlVXRmOENoZWNrQ29kZUZvclN0cmluZygKKyAgICAgICAgZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCBmYWxzZSwKKyAgICAgICAgInRoaXMtPl9pbnRlcm5hbF8kbmFtZSQoKS5kYXRhKCksICIKKyAgICAgICAgInN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsXyRuYW1lJCgpLmxlbmd0aCgpKSxcbiIsCisgICAgICAgIGZvcm1hdCk7CisgIH0KKyAgZm9ybWF0KAorICAgICAgInRhcmdldCA9IHN0cmVhbS0+V3JpdGUkZGVjbGFyZWRfdHlwZSRNYXliZUFsaWFzZWQoXG4iCisgICAgICAiICAgICRudW1iZXIkLCB0aGlzLT5faW50ZXJuYWxfJG5hbWUkKCksIHRhcmdldCk7XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoCisgICAgICAidG90YWxfc2l6ZSArPSAkdGFnX3NpemUkICtcbiIKKyAgICAgICIgIDo6JHByb3RvX25zJDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjokZGVjbGFyZWRfdHlwZSRTaXplKFxuIgorICAgICAgIiAgICB0aGlzLT5faW50ZXJuYWxfJG5hbWUkKCkpO1xuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ29uc3RleHByQWdncmVnYXRlSW5pdGlhbGl6ZXIoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgaWYgKGlubGluZWRfKSB7CisgICAgZm9ybWF0KCIvKmRlY2x0eXBlKCRmaWVsZCQpKi97bnVsbHB0ciwgZmFsc2V9Iik7CisgICAgcmV0dXJuOworICB9CisgIGlmIChkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiLypkZWNsdHlwZSgkZmllbGQkKSoveyY6Ol9wYmk6OmZpeGVkX2FkZHJlc3NfZW1wdHlfc3RyaW5nLCAiCisgICAgICAgICI6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fX0iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoIi8qZGVjbHR5cGUoJGZpZWxkJCkqL3tudWxscHRyLCA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fX0iKTsKKyAgfQorfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUFnZ3JlZ2F0ZUluaXRpYWxpemVyKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGlmIChTaG91bGRTcGxpdChkZXNjcmlwdG9yXywgb3B0aW9uc18pKSB7CisgICAgR09PR0xFX0NIRUNLKCFpbmxpbmVkXyk7CisgICAgZm9ybWF0KCJkZWNsdHlwZShJbXBsXzo6U3BsaXQ6OiRuYW1lJF8pe30iKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFpbmxpbmVkXykgeworICAgIGZvcm1hdCgiZGVjbHR5cGUoJGZpZWxkJCl7fSIpOworICB9IGVsc2UgeworICAgIGZvcm1hdCgiZGVjbHR5cGUoJGZpZWxkJCkoYXJlbmEpIik7CisgIH0KK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDb3B5QWdncmVnYXRlSW5pdGlhbGl6ZXIoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCJkZWNsdHlwZSgkZmllbGQkKXt9Iik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6U3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgICAgOiBTdHJpbmdGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBvcHRpb25zKSB7CisgIFNldENvbW1vbk9uZW9mRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18pOworICB2YXJpYWJsZXNfWyJmaWVsZF9uYW1lIl0gPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3ItPm5hbWUoKSwgdHJ1ZSk7CisgIHZhcmlhYmxlc19bIm9uZW9mX2luZGV4Il0gPQorICAgICAgU3RyQ2F0KGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfb25lb2YoKS0+aW5kZXgoKSk7Cit9CisKK1N0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6On5TdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgImlubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICIkYW5ub3RhdGVfZ2V0JCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gX2ludGVybmFsXyRuYW1lJCgpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJ0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+XG4iCisgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHtcbiIKKyAgICAgICIgIGlmICghX2ludGVybmFsX2hhc18kbmFtZSQoKSkge1xuIgorICAgICAgIiAgICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAgICIgICAgc2V0X2hhc18kbmFtZSQoKTtcbiIKKyAgICAgICIgICAgJGZpZWxkJC5Jbml0RGVmYXVsdCgpO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgJGZpZWxkJC4kc2V0dGVyJCgiCisgICAgICAiIHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpO1xuIgorICAgICAgIiRhbm5vdGF0ZV9zZXQkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDokZnVsbF9uYW1lJClcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIHN0ZDo6c3RyaW5nKiAkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoKSB7XG4iCisgICAgICAiICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV8kbmFtZSQoKTtcbiIKKyAgICAgICIkYW5ub3RhdGVfbXV0YWJsZSQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiBfcztcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiAkY2xhc3NuYW1lJDo6X2ludGVybmFsXyRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICIgIGlmIChfaW50ZXJuYWxfaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgICAiICAgIHJldHVybiAkZmllbGQkLkdldCgpO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgcmV0dXJuICRkZWZhdWx0X3N0cmluZyQ7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpfaW50ZXJuYWxfc2V0XyRuYW1lJChjb25zdCBzdGQ6OnN0cmluZyYgIgorICAgICAgInZhbHVlKSB7XG4iCisgICAgICAiICBpZiAoIV9pbnRlcm5hbF9oYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICIgICAgY2xlYXJfJG9uZW9mX25hbWUkKCk7XG4iCisgICAgICAiICAgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgICAiICAgICRmaWVsZCQuSW5pdERlZmF1bHQoKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgICRmaWVsZCQuU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7XG4iCisgICAgICAifVxuIik7CisgIGZvcm1hdCgKKyAgICAgICJpbmxpbmUgc3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjpfaW50ZXJuYWxfbXV0YWJsZV8kbmFtZSQoKSB7XG4iCisgICAgICAiICBpZiAoIV9pbnRlcm5hbF9oYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICIgICAgY2xlYXJfJG9uZW9mX25hbWUkKCk7XG4iCisgICAgICAiICAgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgICAiICAgICRmaWVsZCQuSW5pdERlZmF1bHQoKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHJldHVybiAkZmllbGQkLk11dGFibGUoJGxhenlfdmFyaWFibGVfYXJncyQiCisgICAgICAiICAgICAgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgc3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjokcmVsZWFzZV9uYW1lJCgpIHtcbiIKKyAgICAgICIkYW5ub3RhdGVfcmVsZWFzZSQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIGlmIChfaW50ZXJuYWxfaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgICAiICAgIGNsZWFyX2hhc18kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAgICIgICAgcmV0dXJuICRmaWVsZCQuUmVsZWFzZSgpO1xuIgorICAgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAgICIgICAgcmV0dXJuIG51bGxwdHI7XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfYWxsb2NhdGVkXyRuYW1lJChzdGQ6OnN0cmluZyogJG5hbWUkKSB7XG4iCisgICAgICAiICBpZiAoaGFzXyRvbmVvZl9uYW1lJCgpKSB7XG4iCisgICAgICAiICAgIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgaWYgKCRuYW1lJCAhPSBudWxscHRyKSB7XG4iCisgICAgICAiICAgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgICAiICAgICRmaWVsZCQuSW5pdEFsbG9jYXRlZCgkbmFtZSQsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIkYW5ub3RhdGVfc2V0JCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOiRmdWxsX25hbWUkKVxuIgorICAgICAgIn1cbiIpOworfQorCit2b2lkIFN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ2xlYXJpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgiJGZpZWxkJC5EZXN0cm95KCk7XG4iKTsKK30KKwordm9pZCBTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lc3NhZ2VDbGVhcmluZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcmV0dXJuIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKHByaW50ZXIpOworfQorCit2b2lkIFN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU3dhcHBpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIERvbid0IHByaW50IGFueSBzd2FwcGluZyBjb2RlLiBTd2FwcGluZyB0aGUgdW5pb24gd2lsbCBzd2FwIHRoaXMgZmllbGQuCit9CisKK3ZvaWQgU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gTm90aGluZyByZXF1aXJlZCBoZXJlLgorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OlJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgb3B0aW9ucykgeworICBTZXRTdHJpbmdWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18sIG9wdGlvbnMpOworfQorCitSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjp+UmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQcml2YXRlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIjo6JHByb3RvX25zJDo6UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gJG5hbWUkXztcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgLy8gU2VlIGNvbW1lbnQgYWJvdmUgYWJvdXQgdW5rbm93biBjdHlwZXMuCisgIGJvb2wgdW5rbm93bl9jdHlwZSA9IGRlc2NyaXB0b3JfLT5vcHRpb25zKCkuY3R5cGUoKSAhPQorICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RpdmVTdHJpbmdDVHlwZShkZXNjcmlwdG9yXywgb3B0aW9uc18pOworCisgIGlmICh1bmtub3duX2N0eXBlKSB7CisgICAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgICBmb3JtYXQoCisgICAgICAgICIgcHJpdmF0ZTpcbiIKKyAgICAgICAgIiAgLy8gSGlkZGVuIGR1ZSB0byB1bmtub3duIGN0eXBlIG9wdGlvbi5cbiIpOworICAgIGZvcm1hdC5JbmRlbnQoKTsKKyAgfQorCisgIGZvcm1hdCgKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJGNvbnN0IHN0ZDo6c3RyaW5nJiAkezEkJG5hbWUkJH0kKGludCBpbmRleCkgY29uc3Q7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciRzdGQ6OnN0cmluZyogJHsxJG11dGFibGVfJG5hbWUkJH0kKGludCBpbmRleCk7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkICR7MSRzZXRfJG5hbWUkJH0kKGludCBpbmRleCwgY29uc3QgIgorICAgICAgInN0ZDo6c3RyaW5nJiB2YWx1ZSk7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkICR7MSRzZXRfJG5hbWUkJH0kKGludCBpbmRleCwgc3RkOjpzdHJpbmcmJiAiCisgICAgICAidmFsdWUpO1xuIgorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCAkezEkc2V0XyRuYW1lJCR9JChpbnQgaW5kZXgsIGNvbnN0ICIKKyAgICAgICJjaGFyKiB2YWx1ZSk7XG4iLAorICAgICAgZGVzY3JpcHRvcl8pOworICBpZiAoIW9wdGlvbnNfLm9wZW5zb3VyY2VfcnVudGltZSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCAkezEkc2V0XyRuYW1lJCR9JChpbnQgaW5kZXgsICIKKyAgICAgICAgIlN0cmluZ1BpZWNlIHZhbHVlKTtcbiIsCisgICAgICAgIGRlc2NyaXB0b3JfKTsKKyAgfQorICBmb3JtYXQoCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkICR7MSRzZXRfJG5hbWUkJH0kKCIKKyAgICAgICJpbnQgaW5kZXgsIGNvbnN0ICRwb2ludGVyX3R5cGUkKiB2YWx1ZSwgc2l6ZV90IHNpemUpO1xuIgorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkc3RkOjpzdHJpbmcqICR7MSRhZGRfJG5hbWUkJH0kKCk7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkICR7MSRhZGRfJG5hbWUkJH0kKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkICR7MSRhZGRfJG5hbWUkJH0kKHN0ZDo6c3RyaW5nJiYgdmFsdWUpO1xuIgorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCAkezEkYWRkXyRuYW1lJCR9JChjb25zdCBjaGFyKiB2YWx1ZSk7XG4iLAorICAgICAgZGVzY3JpcHRvcl8pOworICBpZiAoIW9wdGlvbnNfLm9wZW5zb3VyY2VfcnVudGltZSkgeworICAgIGZvcm1hdCgKKyAgICAgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCAkezEkYWRkXyRuYW1lJCR9JChTdHJpbmdQaWVjZSB2YWx1ZSk7XG4iLAorICAgICAgICBkZXNjcmlwdG9yXyk7CisgIH0KKyAgZm9ybWF0KAorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCAkezEkYWRkXyRuYW1lJCR9JChjb25zdCAkcG9pbnRlcl90eXBlJCogIgorICAgICAgInZhbHVlLCBzaXplX3Qgc2l6ZSkiCisgICAgICAiO1xuIgorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkY29uc3QgOjokcHJvdG9fbnMkOjpSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiYgIgorICAgICAgIiR7MSQkbmFtZSQkfSQoKSAiCisgICAgICAiY29uc3Q7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciQ6OiRwcm90b19ucyQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KiAiCisgICAgICAiJHsxJG11dGFibGVfJG5hbWUkJH0kKCkiCisgICAgICAiO1xuIgorICAgICAgInByaXZhdGU6XG4iCisgICAgICAiY29uc3Qgc3RkOjpzdHJpbmcmICR7MSRfaW50ZXJuYWxfJG5hbWUkJH0kKGludCBpbmRleCkgY29uc3Q7XG4iCisgICAgICAic3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9hZGRfJG5hbWUkKCk7XG4iCisgICAgICAicHVibGljOlxuIiwKKyAgICAgIGRlc2NyaXB0b3JfKTsKKworICBpZiAodW5rbm93bl9jdHlwZSkgeworICAgIGZvcm1hdC5PdXRkZW50KCk7CisgICAgZm9ybWF0KCIgcHVibGljOlxuIik7CisgICAgZm9ybWF0LkluZGVudCgpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgKKyAgICAgICJpbmxpbmUgc3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjphZGRfJG5hbWUkKCkge1xuIgorICAgICAgIiAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX2FkZF8kbmFtZSQoKTtcbiIKKyAgICAgICIkYW5ub3RhdGVfYWRkX211dGFibGUkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9tdXRhYmxlOiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgcmV0dXJuIF9zO1xuIgorICAgICAgIn1cbiIpOworICBpZiAob3B0aW9uc18uc2FmZV9ib3VuZGFyeV9jaGVjaykgeworICAgIGZvcm1hdCgKKyAgICAgICAgImlubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgJGNsYXNzbmFtZSQ6Ol9pbnRlcm5hbF8kbmFtZSQoaW50IGluZGV4KSAiCisgICAgICAgICJjb25zdCB7XG4iCisgICAgICAgICIgIHJldHVybiAkZmllbGQkLkludGVybmFsQ2hlY2tlZEdldChcbiIKKyAgICAgICAgIiAgICAgIGluZGV4LCA6OiRwcm90b19ucyQ6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQoCisgICAgICAgICJpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmICRjbGFzc25hbWUkOjpfaW50ZXJuYWxfJG5hbWUkKGludCBpbmRleCkgIgorICAgICAgICAiY29uc3Qge1xuIgorICAgICAgICAiICByZXR1cm4gJGZpZWxkJC5HZXQoaW5kZXgpO1xuIgorICAgICAgICAifVxuIik7CisgIH0KKyAgZm9ybWF0KAorICAgICAgImlubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgJGNsYXNzbmFtZSQ6OiRuYW1lJChpbnQgaW5kZXgpIGNvbnN0IHtcbiIKKyAgICAgICIkYW5ub3RhdGVfZ2V0JCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gX2ludGVybmFsXyRuYW1lJChpbmRleCk7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSBzdGQ6OnN0cmluZyogJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKGludCBpbmRleCkge1xuIgorICAgICAgIiRhbm5vdGF0ZV9tdXRhYmxlJCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgcmV0dXJuICRmaWVsZCQuTXV0YWJsZShpbmRleCk7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGludCBpbmRleCwgY29uc3Qgc3RkOjpzdHJpbmcmICIKKyAgICAgICJ2YWx1ZSkgIgorICAgICAgIntcbiIKKyAgICAgICIgICRmaWVsZCQuTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7XG4iCisgICAgICAiJGFubm90YXRlX3NldCQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChpbnQgaW5kZXgsIHN0ZDo6c3RyaW5nJiYgdmFsdWUpIHtcbiIKKyAgICAgICIgICRmaWVsZCQuTXV0YWJsZShpbmRleCktPmFzc2lnbihzdGQ6Om1vdmUodmFsdWUpKTtcbiIKKyAgICAgICIkYW5ub3RhdGVfc2V0JCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHtcbiIKKyAgICAgICIgICRudWxsX2NoZWNrJCIKKyAgICAgICIgICRmaWVsZCQuTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7XG4iCisgICAgICAiJGFubm90YXRlX3NldCQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIik7CisgIGlmICghb3B0aW9uc18ub3BlbnNvdXJjZV9ydW50aW1lKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiaW5saW5lIHZvaWQgIgorICAgICAgICAiJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoaW50IGluZGV4LCBTdHJpbmdQaWVjZSB2YWx1ZSkge1xuIgorICAgICAgICAiICAkZmllbGQkLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpO1xuIgorICAgICAgICAiJGFubm90YXRlX3NldCQiCisgICAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfc3RyaW5nX3BpZWNlOiRmdWxsX25hbWUkKVxuIgorICAgICAgICAifVxuIik7CisgIH0KKyAgZm9ybWF0KAorICAgICAgImlubGluZSB2b2lkICIKKyAgICAgICIkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJCIKKyAgICAgICIoaW50IGluZGV4LCBjb25zdCAkcG9pbnRlcl90eXBlJCogdmFsdWUsIHNpemVfdCBzaXplKSB7XG4iCisgICAgICAiICAkZmllbGQkLk11dGFibGUoaW5kZXgpLT5hc3NpZ24oXG4iCisgICAgICAiICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7XG4iCisgICAgICAiJGFubm90YXRlX3NldCQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSBzdGQ6OnN0cmluZyogJGNsYXNzbmFtZSQ6Ol9pbnRlcm5hbF9hZGRfJG5hbWUkKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRmaWVsZCQuQWRkKCk7XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjphZGRfJG5hbWUkKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkge1xuIgorICAgICAgIiAgJGZpZWxkJC5BZGQoKS0+YXNzaWduKHZhbHVlKTtcbiIKKyAgICAgICIkYW5ub3RhdGVfYWRkJCIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjphZGRfJG5hbWUkKHN0ZDo6c3RyaW5nJiYgdmFsdWUpIHtcbiIKKyAgICAgICIgICRmaWVsZCQuQWRkKHN0ZDo6bW92ZSh2YWx1ZSkpO1xuIgorICAgICAgIiRhbm5vdGF0ZV9hZGQkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDokZnVsbF9uYW1lJClcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OmFkZF8kbmFtZSQoY29uc3QgY2hhciogdmFsdWUpIHtcbiIKKyAgICAgICIgICRudWxsX2NoZWNrJCIKKyAgICAgICIgICRmaWVsZCQuQWRkKCktPmFzc2lnbih2YWx1ZSk7XG4iCisgICAgICAiJGFubm90YXRlX2FkZCQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX2NoYXI6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIik7CisgIGlmICghb3B0aW9uc18ub3BlbnNvdXJjZV9ydW50aW1lKSB7CisgICAgZm9ybWF0KAorICAgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OmFkZF8kbmFtZSQoU3RyaW5nUGllY2UgdmFsdWUpIHtcbiIKKyAgICAgICAgIiAgJGZpZWxkJC5BZGQoKS0+YXNzaWduKHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTtcbiIKKyAgICAgICAgIiRhbm5vdGF0ZV9hZGQkIgorICAgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX3N0cmluZ19waWVjZTokZnVsbF9uYW1lJClcbiIKKyAgICAgICAgIn1cbiIpOworICB9CisgIGZvcm1hdCgKKyAgICAgICJpbmxpbmUgdm9pZCAiCisgICAgICAiJGNsYXNzbmFtZSQ6OmFkZF8kbmFtZSQoY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkge1xuIgorICAgICAgIiAgJGZpZWxkJC5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7XG4iCisgICAgICAiJGFubm90YXRlX2FkZCQiCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX3BvaW50ZXI6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSBjb25zdCA6OiRwcm90b19ucyQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+JlxuIgorICAgICAgIiRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAiJGFubm90YXRlX2xpc3QkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gJGZpZWxkJDtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiaW5saW5lIDo6JHByb3RvX25zJDo6UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4qXG4iCisgICAgICAiJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgorICAgICAgIiRhbm5vdGF0ZV9tdXRhYmxlX2xpc3QkIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiAmJGZpZWxkJDtcbiIKKyAgICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNsZWFyaW5nQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBGb3JtYXR0ZXIgZm9ybWF0KHByaW50ZXIsIHZhcmlhYmxlc18pOworICBmb3JtYXQoIiRmaWVsZCQuQ2xlYXIoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVyZ2luZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCJfdGhpcy0+JGZpZWxkJC5NZXJnZUZyb20oZnJvbS4kZmllbGQkKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU3dhcHBpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgiJGZpZWxkJC5JbnRlcm5hbFN3YXAoJm90aGVyLT4kZmllbGQkKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRGVzdHJ1Y3RvckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KCIkZmllbGQkLn5SZXBlYXRlZFB0ckZpZWxkKCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgRm9ybWF0dGVyIGZvcm1hdChwcmludGVyLCB2YXJpYWJsZXNfKTsKKyAgZm9ybWF0KAorICAgICAgImZvciAoaW50IGkgPSAwLCBuID0gdGhpcy0+X2ludGVybmFsXyRuYW1lJF9zaXplKCk7IGkgPCBuOyBpKyspIHtcbiIKKyAgICAgICIgIGNvbnN0IGF1dG8mIHMgPSB0aGlzLT5faW50ZXJuYWxfJG5hbWUkKGkpO1xuIik7CisgIC8vIGZvcm1hdCgiZm9yIChjb25zdCBzdGQ6OnN0cmluZyYgcyA6IHRoaXMtPiRuYW1lJCgpKSB7XG4iKTsKKyAgZm9ybWF0LkluZGVudCgpOworICBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7CisgICAgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlRm9yU3RyaW5nKGRlc2NyaXB0b3JfLCBvcHRpb25zXywgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihzLmxlbmd0aCgpKSxcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCk7CisgIH0KKyAgZm9ybWF0Lk91dGRlbnQoKTsKKyAgZm9ybWF0KAorICAgICAgIiAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZSRkZWNsYXJlZF90eXBlJCgkbnVtYmVyJCwgcywgdGFyZ2V0KTtcbiIKKyAgICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ5dGVTaXplKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEZvcm1hdHRlciBmb3JtYXQocHJpbnRlciwgdmFyaWFibGVzXyk7CisgIGZvcm1hdCgKKyAgICAgICJ0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgKlxuIgorICAgICAgIiAgICA6OiRwcm90b19ucyQ6OmludGVybmFsOjpGcm9tSW50U2l6ZSgkZmllbGQkLnNpemUoKSk7XG4iCisgICAgICAiZm9yIChpbnQgaSA9IDAsIG4gPSAkZmllbGQkLnNpemUoKTsgaSA8IG47IGkrKykge1xuIgorICAgICAgIiAgdG90YWxfc2l6ZSArPSAiCisgICAgICAiOjokcHJvdG9fbnMkOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OiRkZWNsYXJlZF90eXBlJFNpemUoXG4iCisgICAgICAiICAgICRmaWVsZCQuR2V0KGkpKTtcbiIKKyAgICAgICJ9XG4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3N0cmluZ19maWVsZC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvc3RyaW5nX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1ZjE4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3N0cmluZ19maWVsZC5oCkBAIC0wLDAgKzEsMTM2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9TVFJJTkdfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfU1RSSU5HX0ZJRUxEX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBTdHJpbmdGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBTdHJpbmdGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICB+U3RyaW5nRmllbGRHZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU3RhdGljTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZU5vbklubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVzc2FnZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUNyZWF0ZVNwbGl0TWVzc2FnZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ29weUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVBcmVuYURlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDb25zdGV4cHJBZ2dyZWdhdGVJbml0aWFsaXplcigKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUFnZ3JlZ2F0ZUluaXRpYWxpemVyKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUNvcHlBZ2dyZWdhdGVJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgSXNJbmxpbmVkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gaW5saW5lZF87IH0KKyAgQXJlbmFEdG9yTmVlZHMgTmVlZHNBcmVuYURlc3RydWN0b3IoKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIGJvb2wgaW5saW5lZF87CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJpbmdGaWVsZEdlbmVyYXRvcik7Cit9OworCitjbGFzcyBTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yIDogcHVibGljIFN0cmluZ0ZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIFN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICB+U3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gU3RyaW5nRmllbGRHZW5lcmF0b3IsIGZyb20gd2hpY2ggd2UgaW5oZXJpdCwgb3ZlcnJpZGVzIHRoaXMgc28gd2UgbmVlZCB0bworICAvLyBvdmVycmlkZSBpdCBhcyB3ZWxsLgorICB2b2lkIEdlbmVyYXRlTWVzc2FnZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yKTsKK307CisKK2NsYXNzIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisgIH5SZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlIHt9CisgIHZvaWQgR2VuZXJhdGVDb3B5Q29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiAgLypwcmludGVyKi8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBHT09HTEVfQ0hFQ0soIVNob3VsZFNwbGl0KGRlc2NyaXB0b3JfLCBvcHRpb25zXykpOworICB9CisgIHZvaWQgR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1NUUklOR19GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY2YTg0MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvCkBAIC0wLDAgKzEsMTg0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIHRlc3RzIHRoYXQgdmFyaW91cyBpZGVudGlmaWVycyB3b3JrIGFzIGZpZWxkIGFuZCB0eXBlIG5hbWVzIGV2ZW4KKy8vIHRob3VnaCB0aGUgc2FtZSBpZGVudGlmaWVycyBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBDKysgY29kZSBnZW5lcmF0b3IuCisKKy8vIExJTlQ6IExFR0FDWV9OQU1FUworCitzeW50YXggPSAicHJvdG8yIjsKKworLy8gU29tZSBnZW5lcmljX3NlcnZpY2VzIG9wdGlvbihzKSBhZGRlZCBhdXRvbWF0aWNhbGx5LgorLy8gU2VlOiAgaHR0cDovL2dvL3Byb3RvMi1nZW5lcmljLXNlcnZpY2VzLWRlZmF1bHQKK29wdGlvbiBjY19nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgIC8vIGF1dG8tYWRkZWQKKworLy8gV2UgZG9uJ3QgcHV0IHRoaXMgaW4gYSBwYWNrYWdlIHdpdGhpbiBwcm90bzIgYmVjYXVzZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorLy8gdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgZG9lc24ndCBkZXBlbmQgb24gYmVpbmcgaW4gdGhlIHByb3RvMiBuYW1lc3BhY2UuCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCisvLyBUZXN0IHRoYXQgZmllbGRzIGNhbiBoYXZlIG5hbWVzIGxpa2UgImlucHV0IiBhbmQgImkiIHdoaWNoIGFyZSBhbHNvIHVzZWQKKy8vIGludGVybmFsbHkgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yIGZvciBsb2NhbCB2YXJpYWJsZXMuCittZXNzYWdlIFRlc3RDb25mbGljdGluZ1N5bWJvbE5hbWVzIHsKKyAgbWVzc2FnZSBCdWlsZERlc2NyaXB0b3JzIHt9CisgIG1lc3NhZ2UgVHlwZVRyYWl0cyB7fQorCisgIG9wdGlvbmFsIGludDMyIGlucHV0ID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgb3V0cHV0ID0gMjsKKyAgb3B0aW9uYWwgc3RyaW5nIGxlbmd0aCA9IDM7CisgIHJlcGVhdGVkIGludDMyIGkgPSA0OworICByZXBlYXRlZCBzdHJpbmcgbmV3X2VsZW1lbnQgPSA1IFtjdHlwZSA9IFNUUklOR19QSUVDRV07CisgIG9wdGlvbmFsIGludDMyIHRvdGFsX3NpemUgPSA2OworICBvcHRpb25hbCBpbnQzMiB0YWcgPSA3OworCisgIGVudW0gVGVzdEVudW0geyBGT08gPSAwOyB9CisgIG1lc3NhZ2UgRGF0YTEgeworICAgIHJlcGVhdGVkIGludDMyIGRhdGEgPSAxOworICB9CisgIG1lc3NhZ2UgRGF0YTIgeworICAgIHJlcGVhdGVkIFRlc3RFbnVtIGRhdGEgPSAxOworICB9CisgIG1lc3NhZ2UgRGF0YTMgeworICAgIHJlcGVhdGVkIHN0cmluZyBkYXRhID0gMTsKKyAgfQorICBtZXNzYWdlIERhdGE0IHsKKyAgICByZXBlYXRlZCBEYXRhNCBkYXRhID0gMTsKKyAgfQorICBtZXNzYWdlIERhdGE1IHsKKyAgICByZXBlYXRlZCBzdHJpbmcgZGF0YSA9IDEgW2N0eXBlID0gU1RSSU5HX1BJRUNFXTsKKyAgfQorICBtZXNzYWdlIERhdGE2IHsKKyAgICByZXBlYXRlZCBzdHJpbmcgZGF0YSA9IDEgW2N0eXBlID0gQ09SRF07CisgIH0KKworICBvcHRpb25hbCBpbnQzMiBzb3VyY2UgPSA4OworICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDk7CisgIG9wdGlvbmFsIGludDMyIGZpbGUgPSAxMDsKKyAgb3B0aW9uYWwgaW50MzIgZnJvbSA9IDExOworICBvcHRpb25hbCBpbnQzMiBoYW5kbGVfdW5pbnRlcnByZXRlZCA9IDEyOworICByZXBlYXRlZCBpbnQzMiBpbmRleCA9IDEzOworICBvcHRpb25hbCBpbnQzMiBjb250cm9sbGVyID0gMTQ7CisgIG9wdGlvbmFsIGludDMyIGFscmVhZHlfaGVyZSA9IDE1OworCisgIG9wdGlvbmFsIHVpbnQzMiB1aW50MzIgPSAxNjsKKyAgb3B0aW9uYWwgdWludDY0IHVpbnQ2NCA9IDE3OworICBvcHRpb25hbCBzdHJpbmcgc3RyaW5nID0gMTg7CisgIG9wdGlvbmFsIGludDMyIG1lbXNldCA9IDE5OworICBvcHRpb25hbCBpbnQzMiBpbnQzMiA9IDIwOworICBvcHRpb25hbCBpbnQ2NCBpbnQ2NCA9IDIxOworCisgIG9wdGlvbmFsIHVpbnQzMiBjYWNoZWRfc2l6ZSA9IDIyOworICBvcHRpb25hbCB1aW50MzIgZXh0ZW5zaW9ucyA9IDIzOworICBvcHRpb25hbCB1aW50MzIgYml0ID0gMjQ7CisgIG9wdGlvbmFsIHVpbnQzMiBiaXRzID0gMjU7CisgIG9wdGlvbmFsIHVpbnQzMiBvZmZzZXRzID0gMjY7CisgIG9wdGlvbmFsIHVpbnQzMiByZWZsZWN0aW9uID0gMjc7CisKKyAgbWVzc2FnZSBDb3JkIHt9CisgIG9wdGlvbmFsIHN0cmluZyBzb21lX2NvcmQgPSAyOCBbY3R5cGUgPSBDT1JEXTsKKworICBtZXNzYWdlIFN0cmluZ1BpZWNlIHt9CisgIG9wdGlvbmFsIHN0cmluZyBzb21lX3N0cmluZ19waWVjZSA9IDI5IFtjdHlwZSA9IFNUUklOR19QSUVDRV07CisKKyAgLy8gU29tZSBrZXl3b3Jkcy4KKyAgb3B0aW9uYWwgdWludDMyIGludCA9IDMwOworICBvcHRpb25hbCB1aW50MzIgZnJpZW5kID0gMzE7CisgIG9wdGlvbmFsIHVpbnQzMiBjbGFzcyA9IDM3OworICBvcHRpb25hbCB1aW50MzIgdHlwZWRlY2wgPSAzOTsKKyAgb3B0aW9uYWwgdWludDMyIGF1dG8gPSA0MDsKKworICAvLyBUaGUgZ2VuZXJhdG9yIHVzZWQgdG8gI2RlZmluZSBhIG1hY3JvIGNhbGxlZCAiRE8iIGluc2lkZSB0aGUgLmNjIGZpbGUuCisgIG1lc3NhZ2UgRE8ge30KKyAgb3B0aW9uYWwgRE8gZG8gPSAzMjsKKworICAvLyBTb21lIHRlbXBsYXRlIHBhcmFtZXRlciBuYW1lcyBmb3IgZXh0ZW5zaW9ucy4KKyAgb3B0aW9uYWwgaW50MzIgZmllbGRfdHlwZSA9IDMzOworICBvcHRpb25hbCBib29sIGlzX3BhY2tlZCA9IDM0OworCisgIC8vIHRlc3QgY29uZmxpY3RpbmcgcmVsZWFzZV8kbmFtZSQuICJsZW5ndGgiIGFuZCAiZG8iIGZpZWxkIGluIHRoaXMgbWVzc2FnZQorICAvLyBtdXN0IHJlbWFpbiBzdHJpbmcgb3IgbWVzc2FnZSBmaWVsZHMgdG8gbWFrZSB0aGUgdGVzdCB2YWxpZC4KKyAgb3B0aW9uYWwgc3RyaW5nIHJlbGVhc2VfbGVuZ3RoID0gMzU7CisgIC8vIEEgbW9yZSBleHRyZW1lIGNhc2UsIHRoZSBmaWVsZCBuYW1lICJkbyIgaGVyZSBpcyBhIGtleXdvcmQsIHdoaWNoIHdpbGwgYmUKKyAgLy8gZXNjYXBlZCB0byAiZG9fIiBhbHJlYWR5LiBUZXN0IHRoZXJlIGlzIG5vIGNvbmZsaWN0IGV2ZW4gd2l0aCBlc2NhcGVkIGZpZWxkCisgIC8vIG5hbWVzLgorICBvcHRpb25hbCBETyByZWxlYXNlX2RvID0gMzY7CisKKyAgLy8gRm9yIGNsYXNoaW5nIGxvY2FsIHZhcmlhYmxlcyBpbiBTZXJpYWxpemUgYW5kIEJ5dGVTaXplIGNhbGN1bGF0aW9uLgorICBvcHRpb25hbCBzdHJpbmcgdGFyZ2V0ID0gMzg7CisKKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsgIC8vIE5PX1BST1RPMworfQorCittZXNzYWdlIFRlc3RDb25mbGljdGluZ1N5bWJvbE5hbWVzRXh0ZW5zaW9uIHsgICAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8zCisgIGV4dGVuZCBUZXN0Q29uZmxpY3RpbmdTeW1ib2xOYW1lcyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8zCisgICAgcmVwZWF0ZWQgaW50MzIgcmVwZWF0ZWRfaW50MzJfZXh0ID0gMjA0MjM2MzggW3BhY2tlZCA9IHRydWVdOyAgLy8gTk9fUFJPVE8zCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8zCit9ICAvLyBOT19QUk9UTzMKKworbWVzc2FnZSBUZXN0Q29uZmxpY3RpbmdFbnVtTmFtZXMgeyAgLy8gTk9fUFJPVE8zCisgIGVudW0gd2hpbGUgeyAgICAgICAgICAgICAgICAgICAgICAvLyBOT19QUk9UTzMKKyAgICBkZWZhdWx0ID0gMDsgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMworICAgIGFuZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8zCisgICAgY2xhc3MgPSAyOyAgICAgICAgICAgICAgICAgICAgICAvLyBOT19QUk9UTzMKKyAgICBpbnQgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMworICAgIHR5cGVkZWYgPSA0OyAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8zCisgICAgWE9SID0gNTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT19QUk9UTzMKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMworCisgIG9wdGlvbmFsIHdoaWxlIGNvbmZsaWN0aW5nX2VudW0gPSAxOyAgLy8gTk9fUFJPVE8zCit9ICAvLyBOT19QUk9UTzMKKworZW51bSBib29sIHsgICAgICAvLyBOT19QUk9UTzMKKyAgZGVmYXVsdCA9IDA7ICAgLy8gTk9fUFJPVE8zCisgIE5PVF9FUSA9IDE7ICAgIC8vIE5PX1BST1RPMworICB2b2xhdGlsZSA9IDI7ICAvLyBOT19QUk9UTzMKKyAgcmV0dXJuID0gMzsgICAgLy8gTk9fUFJPVE8zCit9ICAvLyBOT19QUk9UTzMKKworbWVzc2FnZSBEdW1teU1lc3NhZ2Uge30KKworbWVzc2FnZSBOVUxMIHsKKyAgb3B0aW9uYWwgaW50MzIgaW50ID0gMTsKK30KKworZXh0ZW5kIFRlc3RDb25mbGljdGluZ1N5bWJvbE5hbWVzIHsgIC8vIE5PX1BST1RPMworICBvcHRpb25hbCBpbnQzMiB2b2lkID0gMzE0MjUzOyAgICAgIC8vIE5PX1BST1RPMworfSAgLy8gTk9fUFJPVE8zCisKKy8vIE1lc3NhZ2UgbmFtZXMgdGhhdCBjb3VsZCBjb25mbGljdC4KK21lc3NhZ2UgU2h1dGRvd24ge30KK21lc3NhZ2UgVGFibGVTdHJ1Y3Qge30KKworc2VydmljZSBUZXN0Q29uZmxpY3RpbmdNZXRob2ROYW1lcyB7CisgIHJwYyBDbG9zdXJlKER1bW15TWVzc2FnZSkgcmV0dXJucyAoRHVtbXlNZXNzYWdlKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjZjYTFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnByb3RvCkBAIC0wLDAgKzEsNDMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUZXN0IHRoYXQgcHJvdG8yIGNvbXBpbGVyIGNhbiBnZW5lcmF0ZSB2YWxpZCBjb2RlIHdoZW4gdGhlIGVudW0gdmFsdWUKKy8vIGlzIElOVF9NQVguIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29tcGlsZS1vbmx5IHRlc3QgYW5kIHRoaXMgcHJvdG8gaXMgbm90CisvLyByZWZlcmVuY2VkIGluIGFueSBDKysgY29kZS4KK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCittZXNzYWdlIFRlc3RMYXJnZUVudW1WYWx1ZSB7CisgIGVudW0gRW51bVdpdGhMYXJnZVZhbHVlIHsKKyAgICBWQUxVRV8xID0gMTsKKyAgICBWQUxVRV9NQVggPSAweDdmZmZmZmZmOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNzMwZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYwpAQCAtMCwwICsxLDEzMyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRvIHRlc3QgdGhlIGNvZGUgZ2VuZXJhdG9yLCB3ZSBhY3R1YWxseSB1c2UgaXQgdG8gZ2VuZXJhdGUgY29kZSBmb3IKKy8vIG5ldC9wcm90bzIvaW50ZXJuYWwvdW5pdHRlc3QucHJvdG8sIHRoZW4gdGVzdCB0aGF0LiAgVGhpcyBtZWFucyB0aGF0IHdlCisvLyBhcmUgYWN0dWFsbHkgdGVzdGluZyB0aGUgcGFyc2VyIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgc3lzdGVtIGF0IHRoZSBzYW1lCisvLyB0aW1lLCBhbmQgdGhhdCBwcm9ibGVtcyBpbiB0aGUgZ2VuZXJhdG9yIG1heSBzaG93IHVwIGFzIGNvbXBpbGUtdGltZSBlcnJvcnMKKy8vIHJhdGhlciB0aGFuIHVuaXR0ZXN0IGZhaWx1cmVzLCB3aGljaCBtYXkgYmUgc3VycHJpc2luZy4gIEhvd2V2ZXIsIHRlc3RpbmcKKy8vIHRoZSBvdXRwdXQgb2YgdGhlIEMrKyBnZW5lcmF0b3IgZGlyZWN0bHkgd291bGQgYmUgdmVyeSBoYXJkLiAgV2UgY2FuJ3QgdmVyeQorLy8gd2VsbCBqdXN0IGNoZWNrIGl0IGFnYWluc3QgZ29sZGVuIGZpbGVzIHNpbmNlIHRob3NlIGZpbGVzIHdvdWxkIGhhdmUgdG8gYmUKKy8vIHVwZGF0ZWQgZm9yIGFueSBzbWFsbCBjaGFuZ2U7IHN1Y2ggYSB0ZXN0IHdvdWxkIGJlIHZlcnkgYnJpdHRsZSBhbmQgcHJvYmFibHkKKy8vIG5vdCB2ZXJ5IGhlbHBmdWwuICBXaGF0IHdlIHJlYWxseSB3YW50IHRvIHRlc3QgaXMgdGhhdCB0aGUgY29kZSBjb21waWxlcworLy8gY29ycmVjdGx5IGFuZCBwcm9kdWNlcyB0aGUgaW50ZXJmYWNlcyB3ZSBleHBlY3QsIHdoaWNoIGlzIHdoeSB0aGlzIHRlc3QKKy8vIGlzIHdyaXR0ZW4gdGhpcyB3YXkuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KKworI2RlZmluZSBNRVNTQUdFX1RFU1RfTkFNRSBNZXNzYWdlVGVzdAorI2RlZmluZSBHRU5FUkFURURfREVTQ1JJUFRPUl9URVNUX05BTUUgR2VuZXJhdGVkRGVzY3JpcHRvclRlc3QKKyNkZWZpbmUgR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FIEdlbmVyYXRlZE1lc3NhZ2VUZXN0CisjZGVmaW5lIEdFTkVSQVRFRF9FTlVNX1RFU1RfTkFNRSBHZW5lcmF0ZWRFbnVtVGVzdAorI2RlZmluZSBHRU5FUkFURURfU0VSVklDRV9URVNUX05BTUUgR2VuZXJhdGVkU2VydmljZVRlc3QKKyNkZWZpbmUgSEVMUEVSU19URVNUX05BTUUgSGVscGVyc1Rlc3QKKyNkZWZpbmUgREVTQ1JJUFRPUl9JTklUX1RFU1RfTkFNRSBEZXNjcmlwdG9ySW5pdGlhbGl6YXRpb25UZXN0CisKKyNkZWZpbmUgVU5JVFRFU1RfUFJPVE9fUEFUSCAibmV0L3Byb3RvMi9pbnRlcm5hbC91bml0dGVzdC5wcm90byIKKyNkZWZpbmUgVU5JVFRFU1QgOjpwcm90b2J1Zl91bml0dGVzdAorI2RlZmluZSBVTklUVEVTVF9JTVBPUlQgOjpwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQKKworLy8gTXVzdCBpbmNsdWRlIGFmdGVyIHRoZSBhYm92ZSBtYWNyb3MuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworLy8gQ2FuJ3QgdXNlIGFuIGFub255bW91cyBuYW1lc3BhY2UgaGVyZSBkdWUgdG8gYnJva2VubmVzcyBvZiBUcnU2NCBjb21waWxlci4KK25hbWVzcGFjZSBjcHBfdW5pdHRlc3QgeworCituYW1lc3BhY2UgcHJvdG9idWZfdW5pdHRlc3QgPSA6OnByb3RvYnVmX3VuaXR0ZXN0OworCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgVGVzdENvbmZsaWN0aW5nU3ltYm9sTmFtZXMpIHsKKyAgLy8gdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8gc3VjY2Vzc2Z1bGx5IGNvbXBpbGVkLCB0aGVuIGl0IHdvcmtzLiAgVGhlCisgIC8vIGZvbGxvd2luZyBpcyBqdXN0IGEgdG9rZW4gdXNhZ2UgdG8gaW5zdXJlIHRoYXQgdGhlIGNvZGUgaXMsIGluIGZhY3QsCisgIC8vIGJlaW5nIGNvbXBpbGVkIGFuZCBsaW5rZWQuCisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RDb25mbGljdGluZ1N5bWJvbE5hbWVzIG1lc3NhZ2U7CisgIG1lc3NhZ2Uuc2V0X3VpbnQzMigxKTsKKyAgRVhQRUNUX0VRKDMsIG1lc3NhZ2UuQnl0ZVNpemVMb25nKCkpOworCisgIG1lc3NhZ2Uuc2V0X2ZyaWVuZF8oNSk7CisgIEVYUEVDVF9FUSg1LCBtZXNzYWdlLmZyaWVuZF8oKSk7CisKKyAgbWVzc2FnZS5zZXRfY2xhc3NfKDYpOworICBFWFBFQ1RfRVEoNiwgbWVzc2FnZS5jbGFzc18oKSk7CisKKyAgLy8gSW5zdGFudGlhdGUgZXh0ZW5zaW9uIHRlbXBsYXRlIGZ1bmN0aW9ucyB0byB0ZXN0IGNvbmZsaWN0aW5nIHRlbXBsYXRlCisgIC8vIHBhcmFtZXRlciBuYW1lcy4KKyAgdHlwZWRlZiBwcm90b2J1Zl91bml0dGVzdDo6VGVzdENvbmZsaWN0aW5nU3ltYm9sTmFtZXNFeHRlbnNpb24gRXh0ZW5zaW9uTWVzc2FnZTsKKyAgbWVzc2FnZS5BZGRFeHRlbnNpb24oRXh0ZW5zaW9uTWVzc2FnZTo6cmVwZWF0ZWRfaW50MzJfZXh0LCAxMjMpOworICBFWFBFQ1RfRVEoMTIzLCBtZXNzYWdlLkdldEV4dGVuc2lvbihFeHRlbnNpb25NZXNzYWdlOjpyZXBlYXRlZF9pbnQzMl9leHQsIDApKTsKK30KKworVEVTVChHRU5FUkFURURfTUVTU0FHRV9URVNUX05BTUUsIFRlc3RDb25mbGljdGluZ0VudW1OYW1lcykgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdENvbmZsaWN0aW5nRW51bU5hbWVzIG1lc3NhZ2U7CisgIG1lc3NhZ2Uuc2V0X2NvbmZsaWN0aW5nX2VudW0oCisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdENvbmZsaWN0aW5nRW51bU5hbWVzX3doaWxlX2FuZF8pOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5jb25mbGljdGluZ19lbnVtKCkpOworICBtZXNzYWdlLnNldF9jb25mbGljdGluZ19lbnVtKAorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RDb25mbGljdGluZ0VudW1OYW1lc193aGlsZV9YT1IpOworICBFWFBFQ1RfRVEoNSwgbWVzc2FnZS5jb25mbGljdGluZ19lbnVtKCkpOworCisgIHByb3RvYnVmX3VuaXR0ZXN0Ojpib29sXyBjb25mbGljdGluZ19lbnVtOworICBjb25mbGljdGluZ19lbnVtID0gcHJvdG9idWZfdW5pdHRlc3Q6Ok5PVF9FUTsKKyAgRVhQRUNUX0VRKDEsIGNvbmZsaWN0aW5nX2VudW0pOworICBjb25mbGljdGluZ19lbnVtID0gcHJvdG9idWZfdW5pdHRlc3Q6OnJldHVybl87CisgIEVYUEVDVF9FUSgzLCBjb25mbGljdGluZ19lbnVtKTsKK30KKworVEVTVChHRU5FUkFURURfTUVTU0FHRV9URVNUX05BTUUsIFRlc3RDb25mbGljdGluZ01lc3NhZ2VOYW1lcykgeworICBwcm90b2J1Zl91bml0dGVzdDo6TlVMTF8gbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRfaW50XygxMjMpOworICBFWFBFQ1RfRVEobWVzc2FnZS5pbnRfKCksIDEyMyk7Cit9CisKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBUZXN0Q29uZmxpY3RpbmdFeHRlbnNpb24pIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RDb25mbGljdGluZ1N5bWJvbE5hbWVzIG1lc3NhZ2U7CisgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojp2b2lkXywgMTIzKTsKKyAgRVhQRUNUX0VRKDEyMywgbWVzc2FnZS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnZvaWRfKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjcHBfdW5pdHRlc3QKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdW5pdHRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWRjNzY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdW5pdHRlc3QuaApAQCAtMCwwICsxLDUxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBoZWFkZXIgZGVjbGFyZXMgdGhlIG5hbWVzcGFjZSBnb29nbGU6OnByb3RvYnVmOjpwcm90b2J1Zl91bml0dGVzdCBpbiBvcmRlciB0byBleHBvc2UKKy8vIGFueSBwcm9ibGVtcyB3aXRoIHRoZSBnZW5lcmF0ZWQgY2xhc3MgbmFtZXMuIFdlIHVzZSB0aGlzIGhlYWRlciB0byBlbnN1cmUKKy8vIHVuaXR0ZXN0LmNjIHdpbGwgZGVjbGFyZSB0aGUgbmFtZXNwYWNlIHByaW9yIHRvIG90aGVyIGluY2x1ZGVzLCB3aGlsZSBvYmV5aW5nCisvLyBub3JtYWwgaW5jbHVkZSBvcmRlcmluZy4KKy8vCisvLyBXaGVuIGdlbmVyYXRpbmcgYSBjbGFzcyBuYW1lIG9mICJmb28uQmFyIiB3ZSBtdXN0IGVuc3VyZSB3ZSBwcmVmaXggdGhlIGNsYXNzCisvLyBuYW1lIHdpdGggIjo6IiwgaW4gY2FzZSB0aGUgbmFtZXNwYWNlIGdvb2dsZTo6cHJvdG9idWY6OmZvbyBleGlzdHMuIFdlIGludGVudGlvbmFsbHkKKy8vIHRyaWdnZXIgdGhhdCBjYXNlIGhlcmUgYnkgZGVjbGFyaW5nIGdvb2dsZTo6cHJvdG9idWY6OnByb3RvYnVmX3VuaXR0ZXN0LgorLy8KKy8vIFNlZSBDbGFzc05hbWUgaW4gaGVscGVycy5oIGZvciBtb3JlIGRldGFpbHMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9VTklUVEVTVF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9VTklUVEVTVF9IX18KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHByb3RvYnVmX3VuaXR0ZXN0IHt9Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1VOSVRURVNUX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdW5pdHRlc3QuaW5jIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdW5pdHRlc3QuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNDcxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5pbmMKQEAgLTAsMCArMSwyMjI2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVG8gdGVzdCB0aGUgY29kZSBnZW5lcmF0b3IsIHdlIGFjdHVhbGx5IHVzZSBpdCB0byBnZW5lcmF0ZSBjb2RlIGZvcgorLy8gbmV0L3Byb3RvMi9pbnRlcm5hbC91bml0dGVzdC5wcm90bywgdGhlbiB0ZXN0IHRoYXQuICBUaGlzIG1lYW5zIHRoYXQgd2UKKy8vIGFyZSBhY3R1YWxseSB0ZXN0aW5nIHRoZSBwYXJzZXIgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSBzeXN0ZW0gYXQgdGhlIHNhbWUKKy8vIHRpbWUsIGFuZCB0aGF0IHByb2JsZW1zIGluIHRoZSBnZW5lcmF0b3IgbWF5IHNob3cgdXAgYXMgY29tcGlsZS10aW1lIGVycm9ycworLy8gcmF0aGVyIHRoYW4gdW5pdHRlc3QgZmFpbHVyZXMsIHdoaWNoIG1heSBiZSBzdXJwcmlzaW5nLiAgSG93ZXZlciwgdGVzdGluZworLy8gdGhlIG91dHB1dCBvZiB0aGUgQysrIGdlbmVyYXRvciBkaXJlY3RseSB3b3VsZCBiZSB2ZXJ5IGhhcmQuICBXZSBjYW4ndCB2ZXJ5CisvLyB3ZWxsIGp1c3QgY2hlY2sgaXQgYWdhaW5zdCBnb2xkZW4gZmlsZXMgc2luY2UgdGhvc2UgZmlsZXMgd291bGQgaGF2ZSB0byBiZQorLy8gdXBkYXRlZCBmb3IgYW55IHNtYWxsIGNoYW5nZTsgc3VjaCBhIHRlc3Qgd291bGQgYmUgdmVyeSBicml0dGxlIGFuZCBwcm9iYWJseQorLy8gbm90IHZlcnkgaGVscGZ1bC4gIFdoYXQgd2UgcmVhbGx5IHdhbnQgdG8gdGVzdCBpcyB0aGF0IHRoZSBjb2RlIGNvbXBpbGVzCisvLyBjb3JyZWN0bHkgYW5kIHByb2R1Y2VzIHRoZSBpbnRlcmZhY2VzIHdlIGV4cGVjdCwgd2hpY2ggaXMgd2h5IHRoaXMgdGVzdAorLy8gaXMgd3JpdHRlbiB0aGlzIHdheS4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL3VuaXR0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpZm5kZWYgX01TQ19WRVIKKy8vIFdlIGV4Y2x1ZGUgdGhpcyBsYXJnZSBwcm90byBiZWNhdXNlIGl0J3MgdG9vIGxhcmdlIGZvcgorLy8gdmlzdWFsIHN0dWRpbyB0byBjb21waWxlIChyZXBvcnQgaW50ZXJuYWwgZXJyb3JzKS4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5oPgorI2VuZGlmCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc2NjLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsMi5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NhbGxiYWNrLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2Nhc3RzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworLy8gQ2FuJ3QgdXNlIGFuIGFub255bW91cyBuYW1lc3BhY2UgaGVyZSBkdWUgdG8gYnJva2VubmVzcyBvZiBUcnU2NCBjb21waWxlci4KK25hbWVzcGFjZSBjcHBfdW5pdHRlc3QgeworCisKK3ZvaWQgRG9Ob3RoaW5nKCkge30KKworY2xhc3MgTW9ja0Vycm9yQ29sbGVjdG9yIDogcHVibGljIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIE1vY2tFcnJvckNvbGxlY3RvcigpIHt9CisgIH5Nb2NrRXJyb3JDb2xsZWN0b3IoKSBvdmVycmlkZSB7fQorCisgIHN0ZDo6c3RyaW5nIHRleHRfOworCisgIC8vIGltcGxlbWVudHMgRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgb3ZlcnJpZGUgeworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJnRleHRfLCAiJDA6JDE6JDI6ICQzXG4iLCBmaWxlbmFtZSwgbGluZSwgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSk7CisgIH0KK307CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCisvLyBUZXN0IHRoYXQgZ2VuZXJhdGVkIGNvZGUgaGFzIHByb3BlciBkZXNjcmlwdG9yczoKKy8vIFBhcnNlIGEgZGVzY3JpcHRvciBkaXJlY3RseSAodXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkltcG9ydGVyKSBhbmQKKy8vIGNvbXBhcmUgaXQgdG8gdGhlIG9uZSB0aGF0IHdhcyBwcm9kdWNlZCBieSBnZW5lcmF0ZWQgY29kZS4KK1RFU1QoR0VORVJBVEVEX0RFU0NSSVBUT1JfVEVTVF9OQU1FLCBJZGVudGljYWxEZXNjcmlwdG9ycykgeworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZ2VuZXJhdGVkX2Rlc2NyaXB0b3IgPQorICAgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOworCisgIC8vIFNldCB1cCB0aGUgSW1wb3J0ZXIuCisgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIERpc2tTb3VyY2VUcmVlIHNvdXJjZV90cmVlOworICBzb3VyY2VfdHJlZS5NYXBQYXRoKCIiLCBUZXN0VXRpbDo6VGVzdFNvdXJjZURpcigpKTsKKyAgSW1wb3J0ZXIgaW1wb3J0ZXIoJnNvdXJjZV90cmVlLCAmZXJyb3JfY29sbGVjdG9yKTsKKworICAvLyBJbXBvcnQgKHBhcnNlKSB1bml0dGVzdC5wcm90by4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIHBhcnNlZF9kZXNjcmlwdG9yID0KKyAgICAgIGltcG9ydGVyLkltcG9ydChUZXN0VXRpbDo6TWF5YmVUcmFuc2xhdGVQYXRoKFVOSVRURVNUX1BST1RPX1BBVEgpKTsKKyAgRVhQRUNUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3IudGV4dF8pOworICBBU1NFUlRfVFJVRShwYXJzZWRfZGVzY3JpcHRvciAhPSBudWxscHRyKTsKKworICAvLyBUZXN0IHRoYXQgZGVzY3JpcHRvcnMgYXJlIGdlbmVyYXRlZCBjb3JyZWN0bHkgYnkgY29udmVydGluZyB0aGVtIHRvCisgIC8vIEZpbGVEZXNjcmlwdG9yUHJvdG9zIGFuZCBjb21wYXJpbmcuCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZ2VuZXJhdGVkX2Rlc2NyaXB0b3JfcHJvdG8sIHBhcnNlZF9kZXNjcmlwdG9yX3Byb3RvOworICBnZW5lcmF0ZWRfZGVzY3JpcHRvci0+Q29weVRvKCZnZW5lcmF0ZWRfZGVzY3JpcHRvcl9wcm90byk7CisgIHBhcnNlZF9kZXNjcmlwdG9yLT5Db3B5VG8oJnBhcnNlZF9kZXNjcmlwdG9yX3Byb3RvKTsKKworICBFWFBFQ1RfRVEocGFyc2VkX2Rlc2NyaXB0b3JfcHJvdG8uRGVidWdTdHJpbmcoKSwKKyAgICAgICAgICAgIGdlbmVyYXRlZF9kZXNjcmlwdG9yX3Byb3RvLkRlYnVnU3RyaW5nKCkpOworfQorCisjaWZuZGVmIF9NU0NfVkVSCisvLyBUZXN0IHRoYXQgZ2VuZXJhdGVkIGNvZGUgaGFzIHByb3BlciBkZXNjcmlwdG9yczoKKy8vIFRvdWNoIGEgZGVzY3JpcHRvciBnZW5lcmF0ZWQgZnJvbSBhbiBlbm9ybW91cyBtZXNzYWdlIHRvIHZhbGlkYXRlIHNwZWNpYWwKKy8vIGhhbmRsaW5nIGZvciBkZXNjcmlwdG9ycyBleGNlZWRpbmcgdGhlIEMrKyBzdGFuZGFyZCdzIHJlY29tbWVuZGVkIG1pbmltdW0KKy8vIGxpbWl0IGZvciBzdHJpbmcgbGl0ZXJhbCBzaXplCitURVNUKEdFTkVSQVRFRF9ERVNDUklQVE9SX1RFU1RfTkFNRSwgRW5vcm1vdXNEZXNjcmlwdG9yKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGdlbmVyYXRlZF9kZXNjcmlwdG9yID0KKyAgICA6OnByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RW5vcm1vdXNEZXNjcmlwdG9yOjpkZXNjcmlwdG9yKCk7CisKKyAgRVhQRUNUX1RSVUUoZ2VuZXJhdGVkX2Rlc2NyaXB0b3IgIT0gbnVsbHB0cik7Cit9CisjZW5kaWYKKworI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBEZWZhdWx0cykgeworICAvLyBDaGVjayB0aGF0IGFsbCBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IGNvcnJlY3RseSBpbiB0aGUgaW5pdGlhbCBtZXNzYWdlLgorICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UpOworCisgIC8vIE1lc3NhZ2VzIHNob3VsZCByZXR1cm4gcG9pbnRlcnMgdG8gZGVmYXVsdCBpbnN0YW5jZXMgdW50aWwgZmlyc3QgdXNlLgorICAvLyAoVGhpcyBpcyBub3QgY2hlY2tlZCBieSBFeHBlY3RDbGVhcigpIHNpbmNlIGl0IGlzIG5vdCBhY3R1YWxseSB0cnVlIGFmdGVyCisgIC8vIHRoZSBmaWVsZHMgaGF2ZSBiZWVuIHNldCBhbmQgdGhlbiBjbGVhcmVkLikKKyAgRVhQRUNUX0VRKCZVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpPcHRpb25hbEdyb3VwOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbGdyb3VwKCkpOworICBFWFBFQ1RfRVEoJlVOSVRURVNUOjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoJlVOSVRURVNUOjpGb3JlaWduTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoJlVOSVRURVNUX0lNUE9SVDo6SW1wb3J0TWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UoKSk7Cit9CisKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBGbG9hdGluZ1BvaW50RGVmYXVsdHMpIHsKKyAgY29uc3QgVU5JVFRFU1Q6OlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyYgZXh0cmVtZV9kZWZhdWx0ID0KKyAgICAgIFVOSVRURVNUOjpUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKworICBFWFBFQ1RfRVEoMC4wZiwgZXh0cmVtZV9kZWZhdWx0Lnplcm9fZmxvYXQoKSk7CisgIEVYUEVDVF9FUSgxLjBmLCBleHRyZW1lX2RlZmF1bHQub25lX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoMS41ZiwgZXh0cmVtZV9kZWZhdWx0LnNtYWxsX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoLTEuMGYsIGV4dHJlbWVfZGVmYXVsdC5uZWdhdGl2ZV9vbmVfZmxvYXQoKSk7CisgIEVYUEVDVF9FUSgtMS41ZiwgZXh0cmVtZV9kZWZhdWx0Lm5lZ2F0aXZlX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoMi4wZThmLCBleHRyZW1lX2RlZmF1bHQubGFyZ2VfZmxvYXQoKSk7CisgIEVYUEVDVF9FUSgtOGUtMjhmLCBleHRyZW1lX2RlZmF1bHQuc21hbGxfbmVnYXRpdmVfZmxvYXQoKSk7CisgIEVYUEVDVF9FUShzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCksCisgICAgICAgICAgICBleHRyZW1lX2RlZmF1bHQuaW5mX2RvdWJsZSgpKTsKKyAgRVhQRUNUX0VRKC1zdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCksCisgICAgICAgICAgICBleHRyZW1lX2RlZmF1bHQubmVnX2luZl9kb3VibGUoKSk7CisgIEVYUEVDVF9UUlVFKGV4dHJlbWVfZGVmYXVsdC5uYW5fZG91YmxlKCkgIT0gZXh0cmVtZV9kZWZhdWx0Lm5hbl9kb3VibGUoKSk7CisgIEVYUEVDVF9FUShzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSwKKyAgICAgICAgICAgIGV4dHJlbWVfZGVmYXVsdC5pbmZfZmxvYXQoKSk7CisgIEVYUEVDVF9FUSgtc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCksCisgICAgICAgICAgICBleHRyZW1lX2RlZmF1bHQubmVnX2luZl9mbG9hdCgpKTsKKyAgRVhQRUNUX1RSVUUoZXh0cmVtZV9kZWZhdWx0Lm5hbl9mbG9hdCgpICE9IGV4dHJlbWVfZGVmYXVsdC5uYW5fZmxvYXQoKSk7Cit9CisKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBUcmlncmFwaCkgeworICBjb25zdCBVTklUVEVTVDo6VGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzJiBleHRyZW1lX2RlZmF1bHQgPQorICAgICAgVU5JVFRFU1Q6OlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlczo6ZGVmYXVsdF9pbnN0YW5jZSgpOworCisgIEVYUEVDVF9FUSgiPyA/ID8/ID8/ID8/PyA/XD8vID9cPy0iLCBleHRyZW1lX2RlZmF1bHQuY3BwX3RyaWdyYXBoKCkpOworfQorCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgRXh0cmVtZVNtYWxsSW50ZWdlckRlZmF1bHQpIHsKKyAgY29uc3QgVU5JVFRFU1Q6OlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyYgZXh0cmVtZV9kZWZhdWx0ID0KKyAgICAgIFVOSVRURVNUOjpUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgRVhQRUNUX0VRKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpLAorICAgICAgICAgICAgZXh0cmVtZV9kZWZhdWx0LnJlYWxseV9zbWFsbF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpLAorICAgICAgICAgICAgZXh0cmVtZV9kZWZhdWx0LnJlYWxseV9zbWFsbF9pbnQ2NCgpKTsKK30KKworVEVTVChHRU5FUkFURURfTUVTU0FHRV9URVNUX05BTUUsIEFjY2Vzc29ycykgeworICAvLyBTZXQgZXZlcnkgZmllbGQgdG8gYSB1bmlxdWUgdmFsdWUgdGhlbiBnbyBiYWNrIGFuZCBjaGVjayBhbGwgdGhvc2UKKyAgLy8gdmFsdWVzLgorICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisKKyAgVGVzdFV0aWw6Ok1vZGlmeVJlcGVhdGVkRmllbGRzKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdFJlcGVhdGVkRmllbGRzTW9kaWZpZWQobWVzc2FnZSk7Cit9CisKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBNdXRhYmxlU3RyaW5nRGVmYXVsdCkgeworICAvLyBtdXRhYmxlX2ZvbygpIGZvciBhIHN0cmluZyBzaG91bGQgcmV0dXJuIGEgc3RyaW5nIGluaXRpYWxpemVkIHRvIGl0cworICAvLyBkZWZhdWx0IHZhbHVlLgorICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgRVhQRUNUX0VRKCJoZWxsbyIsICptZXNzYWdlLm11dGFibGVfZGVmYXVsdF9zdHJpbmcoKSk7CisKKyAgLy8gTm90ZSB0aGF0IHRoZSBmaXJzdCB0aW1lIHdlIGNhbGwgbXV0YWJsZV9mb28oKSwgd2UgZ2V0IGEgbmV3bHktYWxsb2NhdGVkCisgIC8vIHN0cmluZywgYnV0IGlmIHdlIGNsZWFyIGl0IGFuZCBjYWxsIGl0IGFnYWluLCB3ZSBnZXQgdGhlIHNhbWUgb2JqZWN0IGFnYWluLgorICAvLyBXZSBzaG91bGQgdmVyaWZ5IHRoYXQgaXQgaGFzIGl0cyBkZWZhdWx0IHZhbHVlIGluIGJvdGggY2FzZXMuCisgIG1lc3NhZ2Uuc2V0X2RlZmF1bHRfc3RyaW5nKCJibGFoIik7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKworICBFWFBFQ1RfRVEoImhlbGxvIiwgKm1lc3NhZ2UubXV0YWJsZV9kZWZhdWx0X3N0cmluZygpKTsKK30KKworVEVTVChHRU5FUkFURURfTUVTU0FHRV9URVNUX05BTUUsIFN0cmluZ0RlZmF1bHRzKSB7CisgIFVOSVRURVNUOjpUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgbWVzc2FnZTsKKyAgLy8gQ2hlY2sgaWYgJ1wwMDAnIGNhbiBiZSB1c2VkIGluIGRlZmF1bHQgc3RyaW5nIHZhbHVlLgorICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcoImhlbFwwMDBsbyIsIDYpLCBtZXNzYWdlLnN0cmluZ193aXRoX3plcm8oKSk7CisgIEVYUEVDVF9FUShzdGQ6OnN0cmluZygid29yXDAwMGxkIiwgNiksIG1lc3NhZ2UuYnl0ZXNfd2l0aF96ZXJvKCkpOworfQorCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgUmVsZWFzZVN0cmluZykgeworICAvLyBDaGVjayB0aGF0IHJlbGVhc2VfZm9vKCkgc3RhcnRzIG91dCBudWxscHRyLCBhbmQgZ2l2ZXMgdXMgYSB2YWx1ZQorICAvLyB0aGF0IHdlIGNhbiBkZWxldGUgYWZ0ZXIgaXQncyBiZWVuIHNldC4KKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIEVYUEVDVF9FUShudWxscHRyLCBtZXNzYWdlLnJlbGVhc2VfZGVmYXVsdF9zdHJpbmcoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJoZWxsbyIsIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcoKSk7CisKKyAgbWVzc2FnZS5zZXRfZGVmYXVsdF9zdHJpbmcoImJsYWgiKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9zdHJpbmcoKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gc3RyKG1lc3NhZ2UucmVsZWFzZV9kZWZhdWx0X3N0cmluZygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc3RyaW5nKCkpOworICBBU1NFUlRfVFJVRShzdHIgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9FUSgiYmxhaCIsICpzdHIpOworCisgIEVYUEVDVF9FUShudWxscHRyLCBtZXNzYWdlLnJlbGVhc2VfZGVmYXVsdF9zdHJpbmcoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJoZWxsbyIsIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcoKSk7Cit9CisKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBSZWxlYXNlTWVzc2FnZSkgeworICAvLyBDaGVjayB0aGF0IHJlbGVhc2VfZm9vKCkgc3RhcnRzIG91dCBudWxscHRyLCBhbmQgZ2l2ZXMgdXMgYSB2YWx1ZQorICAvLyB0aGF0IHdlIGNhbiBkZWxldGUgYWZ0ZXIgaXQncyBiZWVuIHNldC4KKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIEVYUEVDVF9FUShudWxscHRyLCBtZXNzYWdlLnJlbGVhc2Vfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDEpOworICBzdGQ6OnVuaXF1ZV9wdHI8VU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZT4gbmVzdCgKKyAgICAgIG1lc3NhZ2UucmVsZWFzZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBBU1NFUlRfVFJVRShuZXN0ICE9IG51bGxwdHIpOworICBFWFBFQ1RfRVEoMSwgbmVzdC0+YmIoKSk7CisKKyAgRVhQRUNUX0VRKG51bGxwdHIsIG1lc3NhZ2UucmVsZWFzZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworfQorCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgU2V0QWxsb2NhdGVkU3RyaW5nKSB7CisgIC8vIENoZWNrIHRoYXQgc2V0X2FsbG9jYXRlZF9mb28oKSB3b3JrcyBmb3Igc3RyaW5ncy4KKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcoKSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGtIZWxsbygiaGVsbG8iKTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfc3RyaW5nKGtIZWxsbyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3N0cmluZygpKTsKKworICBtZXNzYWdlLnNldF9hbGxvY2F0ZWRfb3B0aW9uYWxfc3RyaW5nKG51bGxwdHIpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoIiIsIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCkpOworCisgIG1lc3NhZ2Uuc2V0X2FsbG9jYXRlZF9vcHRpb25hbF9zdHJpbmcobmV3IHN0ZDo6c3RyaW5nKGtIZWxsbykpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcoKSk7CisgIEVYUEVDVF9FUShrSGVsbG8sIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCkpOworfQorCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgU2V0QWxsb2NhdGVkTWVzc2FnZSkgeworICAvLyBDaGVjayB0aGF0IHNldF9hbGxvY2F0ZWRfZm9vKCkgY2FuIGJlIGNhbGxlZCBpbiBhbGwgY2FzZXMuCisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisKKyAgbWVzc2FnZS5zZXRfYWxsb2NhdGVkX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKG51bGxwdHIpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgmVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxKTsKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogbmVzdCA9CisgICAgICBtZXNzYWdlLnJlbGVhc2Vfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKTsKKyAgQVNTRVJUX1RSVUUobmVzdCAhPSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworCisgIG1lc3NhZ2Uuc2V0X2FsbG9jYXRlZF9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZShuZXN0KTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuYmIoKSk7Cit9CisKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBDbGVhcikgeworICAvLyBTZXQgZXZlcnkgZmllbGQgdG8gYSB1bmlxdWUgdmFsdWUsIGNsZWFyIHRoZSBtZXNzYWdlLCB0aGVuIGNoZWNrIHRoYXQKKyAgLy8gaXQgaXMgY2xlYXJlZC4KKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICBtZXNzYWdlLkNsZWFyKCk7CisgIFRlc3RVdGlsOjpFeHBlY3RDbGVhcihtZXNzYWdlKTsKK30KKworVEVTVChHRU5FUkFURURfTUVTU0FHRV9URVNUX05BTUUsIEVtYmVkZGVkTnVsbHNJbkJ5dGVzQ2hhclN0YXIpIHsKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIGNvbnN0IGNoYXIqIHZhbHVlID0gIlwwbGFsYWxhXDBcMCI7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX2J5dGVzKHZhbHVlLCA5KTsKKyAgQVNTRVJUX0VRKDksIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVtY21wKHZhbHVlLCBtZXNzYWdlLm9wdGlvbmFsX2J5dGVzKCkuZGF0YSgpLCA5KSk7CisKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfYnl0ZXModmFsdWUsIDkpOworICBBU1NFUlRfRVEoOSwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcygwKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVtY21wKHZhbHVlLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzKDApLmRhdGEoKSwgOSkpOworfQorCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgQ2xlYXJPbmVGaWVsZCkgeworICAvLyBTZXQgZXZlcnkgZmllbGQgdG8gYSB1bmlxdWUgdmFsdWUsIHRoZW4gY2xlYXIgb25lIHZhbHVlIGFuZCBpbnN1cmUgdGhhdAorICAvLyBvbmx5IHRoYXQgb25lIHZhbHVlIGlzIGNsZWFyZWQuCisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKyAgaW50NjRfdCBvcmlnaW5hbF92YWx1ZSA9IG1lc3NhZ2Uub3B0aW9uYWxfaW50NjQoKTsKKworICAvLyBDbGVhciB0aGUgZmllbGQgYW5kIG1ha2Ugc3VyZSBpdCBzaG93cyB1cCBhcyBjbGVhcmVkLgorICBtZXNzYWdlLmNsZWFyX29wdGlvbmFsX2ludDY0KCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfaW50NjQoKSk7CisKKyAgLy8gT3RoZXIgYWRqYWNlbnQgZmllbGRzIHNob3VsZCBub3QgYmUgY2xlYXJlZC4KKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3VpbnQzMigpKTsKKworICAvLyBNYWtlIHN1cmUgaWYgd2Ugc2V0IGl0IGFnYWluLCB0aGVuIGFsbCBmaWVsZHMgYXJlIHNldC4KKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfaW50NjQob3JpZ2luYWxfdmFsdWUpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworfQorCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgU3RyaW5nQ2hhclN0YXJMZW5ndGgpIHsKKyAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIHVzZSBhIGNoYXIqLGxlbmd0aCB0byBzZXQgb25lIG9mIHRoZSBzdHJpbmcgZmllbGRzLgorICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3N0cmluZygiYWJjZGVmIiwgMyk7CisgIEVYUEVDVF9FUSgiYWJjIiwgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcoKSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIHVzZSBhIGNoYXIqLGxlbmd0aCB0byBhZGQgdG8gYSByZXBlYXRlZCBzdHJpbmcgZmllbGQuCisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiYWJjZGVmIiwgMyk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBFWFBFQ1RfRVEoImFiYyIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKDApKTsKKworICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gdXNlIGEgY2hhciosbGVuZ3RoIHRvIHNldCBhIHJlcGVhdGVkIHN0cmluZyBmaWVsZC4KKyAgbWVzc2FnZS5zZXRfcmVwZWF0ZWRfc3RyaW5nKDAsICJ3eHl6IiwgMik7CisgIEVYUEVDVF9FUSgid3giLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZygwKSk7Cit9CisKKworI2lmICFkZWZpbmVkKFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMpIHx8IGRlZmluZWQoTkRFQlVHKQorVEVTVChHRU5FUkFURURfTUVTU0FHRV9URVNUX05BTUUsIENvcHlGcm9tKSB7CisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTEsIG1lc3NhZ2UyOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UxKTsKKyAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKworICAvLyBDb3B5aW5nIGZyb20gc2VsZiBzaG91bGQgYmUgYSBuby1vcC4KKyAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZTIpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKK30KKworVEVTVChHRU5FUkFURURfTUVTU0FHRV9URVNUX05BTUUsIENvcHlBc3NpZ25tZW50T3BlcmF0b3IpIHsKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOworCisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTI7CisgIG1lc3NhZ2UyID0gbWVzc2FnZTE7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHNlbGYtYXNzaWdubWVudCBkb2VzIHNvbWV0aGluZyBzYW5lLgorICBtZXNzYWdlMi5vcGVyYXRvcj0obWVzc2FnZTIpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKK30KKyNlbmRpZiAgLy8gIVBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMgfHwgTkRFQlVHCisKKworVEVTVChHRU5FUkFURURfTUVTU0FHRV9URVNUX05BTUUsIFN3YXBXaXRoRW1wdHkpIHsKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMSwgbWVzc2FnZTI7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UxKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UyKTsKKyAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UxKTsKK30KKworVEVTVChHRU5FUkFURURfTUVTU0FHRV9URVNUX05BTUUsIFN3YXBXaXRoU2VsZikgeworICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworICBtZXNzYWdlLlN3YXAoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworfQorCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgU3dhcFdpdGhPdGhlcikgeworICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICBtZXNzYWdlMS5zZXRfb3B0aW9uYWxfaW50MzIoMTIzKTsKKyAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX3N0cmluZygiYWJjIik7CisgIG1lc3NhZ2UxLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDEpOworICBtZXNzYWdlMS5zZXRfb3B0aW9uYWxfbmVzdGVkX2VudW0oVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6Rk9PKTsKKyAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX2ludDMyKDEpOworICBtZXNzYWdlMS5hZGRfcmVwZWF0ZWRfaW50MzIoMik7CisgIG1lc3NhZ2UxLmFkZF9yZXBlYXRlZF9zdHJpbmcoImEiKTsKKyAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX3N0cmluZygiYiIpOworICBtZXNzYWdlMS5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDcpOworICBtZXNzYWdlMS5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDgpOworICBtZXNzYWdlMS5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0oVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6Rk9PKTsKKyAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBUik7CisKKyAgbWVzc2FnZTIuc2V0X29wdGlvbmFsX2ludDMyKDQ1Nik7CisgIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9zdHJpbmcoImRlZiIpOworICBtZXNzYWdlMi5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigyKTsKKyAgbWVzc2FnZTIuc2V0X29wdGlvbmFsX25lc3RlZF9lbnVtKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBUik7CisgIG1lc3NhZ2UyLmFkZF9yZXBlYXRlZF9pbnQzMigzKTsKKyAgbWVzc2FnZTIuYWRkX3JlcGVhdGVkX3N0cmluZygiYyIpOworICBtZXNzYWdlMi5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDkpOworICBtZXNzYWdlMi5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0oVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKKworICBtZXNzYWdlMS5Td2FwKCZtZXNzYWdlMik7CisKKyAgRVhQRUNUX0VRKDQ1NiwgbWVzc2FnZTEub3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSgiZGVmIiwgbWVzc2FnZTEub3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZTEub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5iYigpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZTEub3B0aW9uYWxfbmVzdGVkX2VudW0oKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlMS5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMywgbWVzc2FnZTEucmVwZWF0ZWRfaW50MzIoMCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZTEucmVwZWF0ZWRfc3RyaW5nX3NpemUoKSk7CisgIEVYUEVDVF9FUSgiYyIsIG1lc3NhZ2UxLnJlcGVhdGVkX3N0cmluZygwKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlMS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplKCkpOworICBFWFBFQ1RfRVEoOSwgbWVzc2FnZTEucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlMS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6QkFaLCBtZXNzYWdlMS5yZXBlYXRlZF9uZXN0ZWRfZW51bSgwKSk7CisKKyAgRVhQRUNUX0VRKDEyMywgbWVzc2FnZTIub3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSgiYWJjIiwgbWVzc2FnZTIub3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZTIub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5iYigpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkZPTywgbWVzc2FnZTIub3B0aW9uYWxfbmVzdGVkX2VudW0oKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlMi5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZTIucmVwZWF0ZWRfaW50MzIoMCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZTIucmVwZWF0ZWRfaW50MzIoMSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZTIucmVwZWF0ZWRfc3RyaW5nX3NpemUoKSk7CisgIEVYUEVDVF9FUSgiYSIsIG1lc3NhZ2UyLnJlcGVhdGVkX3N0cmluZygwKSk7CisgIEVYUEVDVF9FUSgiYiIsIG1lc3NhZ2UyLnJlcGVhdGVkX3N0cmluZygxKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplKCkpOworICBFWFBFQ1RfRVEoNywgbWVzc2FnZTIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7CisgIEVYUEVDVF9FUSg4LCBtZXNzYWdlMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgxKS5iYigpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UyLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpGT08sIG1lc3NhZ2UyLnJlcGVhdGVkX25lc3RlZF9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZTIucmVwZWF0ZWRfbmVzdGVkX2VudW0oMSkpOworfQorCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgQURMU3dhcCkgeworICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOworCisgIC8vIE5vdGUgdGhlIGFkZHJlc3Mgb2Ygb25lIG9mIHRoZSByZXBlYXRlZCBmaWVsZHMsIHRvIHZlcmlmeSBpdCB3YXMgc3dhcHBlZAorICAvLyByYXRoZXIgdGhhbiBjb3BpZWQuCisgIGNvbnN0IGludDMyX3QqIGFkZHIgPSAmbWVzc2FnZTEucmVwZWF0ZWRfaW50MzIoKS5HZXQoMCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgIGNvbnN0IGludDMyX3QgdmFsdWUgPSAqYWRkcjsKKyNlbmRpZgorCisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgc3dhcChtZXNzYWdlMSwgbWVzc2FnZTIpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworICBUZXN0VXRpbDo6RXhwZWN0Q2xlYXIobWVzc2FnZTEpOworCisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgIEVYUEVDVF9ORShhZGRyLCAmbWVzc2FnZTIucmVwZWF0ZWRfaW50MzIoKS5HZXQoMCkpOworICBFWFBFQ1RfRVEodmFsdWUsIG1lc3NhZ2UyLnJlcGVhdGVkX2ludDMyKCkuR2V0KDApKTsKKyNlbHNlCisgIEVYUEVDVF9FUShhZGRyLCAmbWVzc2FnZTIucmVwZWF0ZWRfaW50MzIoKS5HZXQoMCkpOworI2VuZGlmCit9CisKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBDb3B5Q29uc3RydWN0b3IpIHsKKyAgLy8gQWxsIHNldC4KKyAgeworICAgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTE7CisgICAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOworCisgICAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMihtZXNzYWdlMSk7CisgICAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7CisgIH0KKworICAvLyBOb25lIHNldC4KKyAgeworICAgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTE7CisgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtdW5uZWNlc3NhcnktY29weS1pbml0aWFsaXphdGlvbikKKyAgICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UyKG1lc3NhZ2UxKTsKKworICAgIEVYUEVDVF9GQUxTRShtZXNzYWdlMS5oYXNfb3B0aW9uYWxfc3RyaW5nKCkpOworICAgIEVYUEVDVF9GQUxTRShtZXNzYWdlMi5oYXNfb3B0aW9uYWxfc3RyaW5nKCkpOworICAgIEVYUEVDVF9FUShtZXNzYWdlMS5vcHRpb25hbF9zdHJpbmcoKSwgbWVzc2FnZTIub3B0aW9uYWxfc3RyaW5nKCkpOworCisgICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UxLmhhc19vcHRpb25hbF9ieXRlcygpKTsKKyAgICBFWFBFQ1RfRkFMU0UobWVzc2FnZTIuaGFzX29wdGlvbmFsX2J5dGVzKCkpOworICAgIEVYUEVDVF9FUShtZXNzYWdlMS5vcHRpb25hbF9ieXRlcygpLCBtZXNzYWdlMi5vcHRpb25hbF9ieXRlcygpKTsKKworICAgIEVYUEVDVF9GQUxTRShtZXNzYWdlMS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UyLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgICBFWFBFQ1RfRVEoJm1lc3NhZ2UxLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCksCisgICAgICAgICAgICAgICZtZXNzYWdlMi5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKworICAgIEVYUEVDVF9GQUxTRShtZXNzYWdlMS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkpOworICAgIEVYUEVDVF9GQUxTRShtZXNzYWdlMi5oYXNfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkpOworICAgIEVYUEVDVF9FUSgmbWVzc2FnZTEub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCksCisgICAgICAgICAgICAgICZtZXNzYWdlMi5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKSk7CisKKyAgICBFWFBFQ1RfRkFMU0UobWVzc2FnZTEuaGFzX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlKCkpOworICAgIEVYUEVDVF9GQUxTRShtZXNzYWdlMi5oYXNfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UoKSk7CisgICAgRVhQRUNUX0VRKCZtZXNzYWdlMS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSgpLAorICAgICAgICAgICAgICAmbWVzc2FnZTIub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UoKSk7CisKKyAgICBFWFBFQ1RfRkFMU0UobWVzc2FnZTEuaGFzX29wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UobWVzc2FnZTIuaGFzX29wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSgpKTsKKyAgICBFWFBFQ1RfRVEoJm1lc3NhZ2UxLm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSgpLAorICAgICAgICAgICAgICAmbWVzc2FnZTIub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkpOworCisgICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UxLmhhc19vcHRpb25hbF9sYXp5X21lc3NhZ2UoKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UyLmhhc19vcHRpb25hbF9sYXp5X21lc3NhZ2UoKSk7CisgICAgRVhQRUNUX0VRKCZtZXNzYWdlMS5vcHRpb25hbF9sYXp5X21lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgJm1lc3NhZ2UyLm9wdGlvbmFsX2xhenlfbWVzc2FnZSgpKTsKKyAgfQorfQorCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgQ29weUNvbnN0cnVjdG9yV2l0aEFyZW5hcykgeworICBBcmVuYSBhcmVuYTsKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZTEgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VU5JVFRFU1Q6OlRlc3RBbGxUeXBlcz4oJmFyZW5hKTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcyhtZXNzYWdlMSk7CisKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMl9zdGFjaygqbWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyX3N0YWNrKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8VU5JVFRFU1Q6OlRlc3RBbGxUeXBlcz4gbWVzc2FnZTJfaGVhcCgKKyAgICAgIG5ldyBVTklUVEVTVDo6VGVzdEFsbFR5cGVzKCptZXNzYWdlMSkpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KCptZXNzYWdlMl9oZWFwKTsKKworICBhcmVuYS5SZXNldCgpOworCisgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb3BpZXMgYXJlIHN0aWxsIGludGFjdC4KKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMl9zdGFjayk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoKm1lc3NhZ2UyX2hlYXApOworfQorCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBVcGNhc3RDb3B5RnJvbSkgeworICAvLyBUZXN0IHRoZSBDb3B5RnJvbSBtZXRob2QgdGhhdCB0YWtlcyBpbiB0aGUgZ2VuZXJpYyBjb25zdCBNZXNzYWdlJgorICAvLyBwYXJhbWV0ZXIuCisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTEsIG1lc3NhZ2UyOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UxKTsKKworICBjb25zdCBNZXNzYWdlKiBzb3VyY2UgPSBpbXBsaWNpdF9jYXN0PGNvbnN0IE1lc3NhZ2UqPigmbWVzc2FnZTEpOworICBtZXNzYWdlMi5Db3B5RnJvbSgqc291cmNlKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKK30KKworVEVTVChHRU5FUkFURURfTUVTU0FHRV9URVNUX05BTUUsIER5bmFtaWNNZXNzYWdlQ29weUZyb20pIHsKKyAgLy8gVGVzdCBjb3B5aW5nIGZyb20gYSBEeW5hbWljTWVzc2FnZSwgd2hpY2ggbXVzdCBmYWxsIGJhY2sgdG8gdXNpbmcKKyAgLy8gcmVmbGVjdGlvbi4KKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMjsKKworICAvLyBDb25zdHJ1Y3QgYSBuZXcgdmVyc2lvbiBvZiB0aGUgZHluYW1pYyBtZXNzYWdlIHZpYSB0aGUgZmFjdG9yeS4KKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGZhY3Rvcnk7CisgIHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlPiBtZXNzYWdlMTsKKyAgbWVzc2FnZTEucmVzZXQoZmFjdG9yeS5HZXRQcm90b3R5cGUoCisgICAgICAgICAgICAgICAgICAgICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCkpLT5OZXcoKSk7CisKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCisgICAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihtZXNzYWdlMS5nZXQoKSk7CisKKyAgbWVzc2FnZTIuQ29weUZyb20oKm1lc3NhZ2UxKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKK30KKworI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgTm9uRW1wdHlNZXJnZUZyb20pIHsKKyAgLy8gVGVzdCBtZXJnaW5nIHdpdGggYSBub24tZW1wdHkgbWVzc2FnZS4gQ29kZSBpcyBhIG1vZGlmaWVkIGZvcm0KKyAgLy8gb2YgdGhhdCBmb3VuZCBpbiBuZXQvcHJvdG8yL2ludGVybmFsL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjLgorICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMSk7CisKKyAgLy8gVGhpcyBmaWVsZCB3aWxsIHRlc3QgbWVyZ2luZyBpbnRvIGFuIGVtcHR5IHNwb3QuCisgIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9pbnQzMihtZXNzYWdlMS5vcHRpb25hbF9pbnQzMigpKTsKKyAgbWVzc2FnZTEuY2xlYXJfb3B0aW9uYWxfaW50MzIoKTsKKworICAvLyBUaGlzIHRlc3RzIG92ZXJ3cml0aW5nLgorICBtZXNzYWdlMi5zZXRfb3B0aW9uYWxfc3RyaW5nKG1lc3NhZ2UxLm9wdGlvbmFsX3N0cmluZygpKTsKKyAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX3N0cmluZygic29tZXRoaW5nIGVsc2UiKTsKKworICAvLyBUaGlzIHRlc3RzIGNvbmNhdGVuYXRpbmcuCisgIG1lc3NhZ2UyLmFkZF9yZXBlYXRlZF9pbnQzMihtZXNzYWdlMS5yZXBlYXRlZF9pbnQzMigxKSk7CisgIGludDMyX3QgaSA9IG1lc3NhZ2UxLnJlcGVhdGVkX2ludDMyKDApOworICBtZXNzYWdlMS5jbGVhcl9yZXBlYXRlZF9pbnQzMigpOworICBtZXNzYWdlMS5hZGRfcmVwZWF0ZWRfaW50MzIoaSk7CisKKyAgbWVzc2FnZTEuTWVyZ2VGcm9tKG1lc3NhZ2UyKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UxKTsKK30KKworCisvLyBUZXN0IHRoZSBnZW5lcmF0ZWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgpLAorVEVTVChHRU5FUkFURURfTUVTU0FHRV9URVNUX05BTUUsIFNlcmlhbGl6YXRpb25Ub0FycmF5KSB7CisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBzdGQ6OnN0cmluZyBkYXRhOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMSk7CisgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemVMb25nKCk7CisgIGRhdGEucmVzaXplKHNpemUpOworICB1aW50OF90KiBzdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KDo6Z29vZ2xlOjpwcm90b2J1Zjo6c3RyaW5nX2FzX2FycmF5KCZkYXRhKSk7CisgIHVpbnQ4X3QqIGVuZCA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoc3RhcnQpOworICBFWFBFQ1RfRVEoc2l6ZSwgZW5kIC0gc3RhcnQpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKworfQorCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgUGFja2VkRmllbGRzU2VyaWFsaXphdGlvblRvQXJyYXkpIHsKKyAgVU5JVFRFU1Q6OlRlc3RQYWNrZWRUeXBlcyBwYWNrZWRfbWVzc2FnZTEsIHBhY2tlZF9tZXNzYWdlMjsKKyAgc3RkOjpzdHJpbmcgcGFja2VkX2RhdGE7CisgIFRlc3RVdGlsOjpTZXRQYWNrZWRGaWVsZHMoJnBhY2tlZF9tZXNzYWdlMSk7CisgIGludCBwYWNrZWRfc2l6ZSA9IHBhY2tlZF9tZXNzYWdlMS5CeXRlU2l6ZUxvbmcoKTsKKyAgcGFja2VkX2RhdGEucmVzaXplKHBhY2tlZF9zaXplKTsKKyAgdWludDhfdCogc3RhcnQgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oOjpnb29nbGU6OnByb3RvYnVmOjpzdHJpbmdfYXNfYXJyYXkoJnBhY2tlZF9kYXRhKSk7CisgIHVpbnQ4X3QqIGVuZCA9IHBhY2tlZF9tZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHN0YXJ0KTsKKyAgRVhQRUNUX0VRKHBhY2tlZF9zaXplLCBlbmQgLSBzdGFydCk7CisgIEVYUEVDVF9UUlVFKHBhY2tlZF9tZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcocGFja2VkX2RhdGEpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChwYWNrZWRfbWVzc2FnZTIpOworfQorCisvLyBUZXN0IHRoZSBnZW5lcmF0ZWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkgYnkgZm9yY2luZyB0aGUgYnVmZmVyIHRvIHdyaXRlCisvLyBvbmUgYnl0ZSBhdCBhIHRpbWUuCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgU2VyaWFsaXphdGlvblRvU3RyZWFtKSB7CisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMSk7CisgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemVMb25nKCk7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIGRhdGEucmVzaXplKHNpemUpOworICB7CisgICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgorICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oOjpnb29nbGU6OnByb3RvYnVmOjpzdHJpbmdfYXNfYXJyYXkoJmRhdGEpLCBzaXplLCAxKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmYXJyYXlfc3RyZWFtKTsKKyAgICBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOworICAgIEVYUEVDVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICAgIEVYUEVDVF9FUShzaXplLCBvdXRwdXRfc3RyZWFtLkJ5dGVDb3VudCgpKTsKKyAgfQorICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKworfQorCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgUGFja2VkRmllbGRzU2VyaWFsaXphdGlvblRvU3RyZWFtKSB7CisgIFVOSVRURVNUOjpUZXN0UGFja2VkVHlwZXMgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBUZXN0VXRpbDo6U2V0UGFja2VkRmllbGRzKCZtZXNzYWdlMSk7CisgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemVMb25nKCk7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIGRhdGEucmVzaXplKHNpemUpOworICB7CisgICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgorICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oOjpnb29nbGU6OnByb3RvYnVmOjpzdHJpbmdfYXNfYXJyYXkoJmRhdGEpLCBzaXplLCAxKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmYXJyYXlfc3RyZWFtKTsKKyAgICBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOworICAgIEVYUEVDVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICAgIEVYUEVDVF9FUShzaXplLCBvdXRwdXRfc3RyZWFtLkJ5dGVDb3VudCgpKTsKKyAgfQorICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRmllbGRzU2V0KG1lc3NhZ2UyKTsKK30KKworCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgUmVxdWlyZWQpIHsKKyAgLy8gVGVzdCB0aGF0IElzSW5pdGlhbGl6ZWQoKSByZXR1cm5zIGZhbHNlIGlmIHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy4KKyAgVU5JVFRFU1Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisgIG1lc3NhZ2Uuc2V0X2EoMSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisgIG1lc3NhZ2Uuc2V0X2IoMik7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisgIG1lc3NhZ2Uuc2V0X2MoMyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKK30KKworVEVTVChHRU5FUkFURURfTUVTU0FHRV9URVNUX05BTUUsIFJlcXVpcmVkRm9yZWlnbikgeworICAvLyBUZXN0IHRoYXQgSXNJbml0aWFsaXplZCgpIHJldHVybnMgZmFsc2UgaWYgcmVxdWlyZWQgZmllbGRzIGluIG5lc3RlZAorICAvLyBtZXNzYWdlcyBhcmUgbWlzc2luZy4KKyAgVU5JVFRFU1Q6OlRlc3RSZXF1aXJlZEZvcmVpZ24gbWVzc2FnZTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpLT5zZXRfYSgxKTsKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2IoMik7CisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCktPnNldF9jKDMpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfbWVzc2FnZSgpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworCisgIG1lc3NhZ2UubXV0YWJsZV9yZXBlYXRlZF9tZXNzYWdlKDApLT5zZXRfYSgxKTsKKyAgbWVzc2FnZS5tdXRhYmxlX3JlcGVhdGVkX21lc3NhZ2UoMCktPnNldF9iKDIpOworICBtZXNzYWdlLm11dGFibGVfcmVwZWF0ZWRfbWVzc2FnZSgwKS0+c2V0X2MoMyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKK30KKworVEVTVChHRU5FUkFURURfTUVTU0FHRV9URVNUX05BTUUsIEZvcmVpZ25OZXN0ZWQpIHsKKyAgLy8gVGVzdCB0aGF0IFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSBjYW4gYmUgZW1iZWRkZWQgZGlyZWN0bHkgaW50bworICAvLyBhbm90aGVyIG1lc3NhZ2UuCisgIFVOSVRURVNUOjpUZXN0Rm9yZWlnbk5lc3RlZCBtZXNzYWdlOworCisgIC8vIElmIHRoaXMgY29tcGlsZXMgYW5kIHJ1bnMgd2l0aG91dCBjcmFzaGluZywgaXQgbXVzdCB3b3JrLiAgV2UgaGF2ZQorICAvLyBub3RoaW5nIG1vcmUgdG8gdGVzdC4KKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogbmVzdGVkID0KKyAgICBtZXNzYWdlLm11dGFibGVfZm9yZWlnbl9uZXN0ZWQoKTsKKyAgbmVzdGVkLT5zZXRfYmIoMSk7Cit9CisKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBSZWFsbHlMYXJnZVRhZ051bWJlcikgeworICAvLyBUZXN0IHRoYXQgcmVhbGx5IGxhcmdlIHRhZyBudW1iZXJzIGRvbid0IGJyZWFrIGFueXRoaW5nLgorICBVTklUVEVTVDo6VGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKworICAvLyBGb3IgdGhlIG1vc3QgcGFydCwgaWYgdGhpcyBjb21waWxlcyBhbmQgcnVucyB0aGVuIHdlJ3JlIHByb2JhYmx5IGdvb2QuCisgIC8vIChUaGUgbW9zdCBsaWtlbHkgY2F1c2UgZm9yIGZhaWx1cmUgd291bGQgYmUgaWYgc29tZXRoaW5nIHdlcmUgYXR0ZW1wdGluZworICAvLyB0byBhbGxvY2F0ZSBhIGxvb2t1cCB0YWJsZSBvZiBzb21lIHNvcnQgdXNpbmcgdGFnIG51bWJlcnMgYXMgdGhlIGluZGV4LikKKyAgLy8gV2UnbGwgdHJ5IHNlcmlhbGl6aW5nIGp1c3QgZm9yIGZ1bi4KKyAgbWVzc2FnZTEuc2V0X2EoMTIzNCk7CisgIG1lc3NhZ2UxLnNldF9iYig1Njc4KTsKKyAgbWVzc2FnZTEuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBFWFBFQ1RfRVEoMTIzNCwgbWVzc2FnZTIuYSgpKTsKKyAgRVhQRUNUX0VRKDU2NzgsIG1lc3NhZ2UyLmJiKCkpOworfQorCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgTXV0dWFsUmVjdXJzaW9uKSB7CisgIC8vIFRlc3QgdGhhdCBtdXR1YWxseS1yZWN1cnNpdmUgbWVzc2FnZSB0eXBlcyB3b3JrLgorICBVTklUVEVTVDo6VGVzdE11dHVhbFJlY3Vyc2lvbkEgbWVzc2FnZTsKKyAgVU5JVFRFU1Q6OlRlc3RNdXR1YWxSZWN1cnNpb25BKiBuZXN0ZWQgPSBtZXNzYWdlLm11dGFibGVfYmIoKS0+bXV0YWJsZV9hKCk7CisgIFVOSVRURVNUOjpUZXN0TXV0dWFsUmVjdXJzaW9uQSogbmVzdGVkMiA9IG5lc3RlZC0+bXV0YWJsZV9iYigpLT5tdXRhYmxlX2EoKTsKKworICAvLyBBZ2FpbiwgaWYgdGhlIGFib3ZlIGNvbXBpbGVzIGFuZCBydW5zLCB0aGF0J3MgYWxsIHdlIHJlYWxseSBoYXZlIHRvCisgIC8vIHRlc3QsIGJ1dCBqdXN0IGZvciBydW4gd2UnbGwgY2hlY2sgdGhhdCB0aGUgc3lzdGVtIGRpZG4ndCBzb21laG93IGNvbWUKKyAgLy8gdXAgd2l0aCBhIHBvaW50ZXIgbG9vcC4uLgorICBFWFBFQ1RfTkUoJm1lc3NhZ2UsIG5lc3RlZCk7CisgIEVYUEVDVF9ORSgmbWVzc2FnZSwgbmVzdGVkMik7CisgIEVYUEVDVF9ORShuZXN0ZWQsIG5lc3RlZDIpOworfQorCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgQ2FtZWxDYXNlRmllbGROYW1lcykgeworICAvLyBUaGlzIHRlc3QgaXMgbWFpbmx5IGNoZWNraW5nIHRoYXQgdGhlIGZvbGxvd2luZyBjb21waWxlcywgd2hpY2ggdmVyaWZpZXMKKyAgLy8gdGhhdCB0aGUgZmllbGQgbmFtZXMgd2VyZSBjb2VyY2VkIHRvIGxvd2VyLWNhc2UuCisgIC8vCisgIC8vIFByb3RvY29sIGJ1ZmZlcnMgc3RhbmRhcmQgc3R5bGUgaXMgdG8gdXNlIGxvd2VyY2FzZS13aXRoLXVuZGVyc2NvcmVzIGZvcgorICAvLyBmaWVsZCBuYW1lcy4gIFNvbWUgb2xkIHByb3RvMSAucHJvdG9zIHVuZm9ydHVuYXRlbHkgdXNlZCBjYW1lbC1jYXNlIGZpZWxkCisgIC8vIG5hbWVzLiAgSW4gcHJvdG8xLCB0aGVzZSBuYW1lcyB3ZXJlIGZvcmNlZCB0byBsb3dlci1jYXNlLiAgU28sIHdlIGRvIHRoZQorICAvLyBzYW1lIHRoaW5nIGluIHByb3RvMi4KKworICBVTklUVEVTVDo6VGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgbWVzc2FnZTsKKworICBtZXNzYWdlLnNldF9wcmltaXRpdmVmaWVsZCgyKTsKKyAgbWVzc2FnZS5zZXRfc3RyaW5nZmllbGQoImZvbyIpOworICBtZXNzYWdlLnNldF9lbnVtZmllbGQoVU5JVFRFU1Q6OkZPUkVJR05fRk9PKTsKKyAgbWVzc2FnZS5tdXRhYmxlX21lc3NhZ2VmaWVsZCgpLT5zZXRfYyg2KTsKKworICBtZXNzYWdlLmFkZF9yZXBlYXRlZHByaW1pdGl2ZWZpZWxkKDgpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZHN0cmluZ2ZpZWxkKCJtb28iKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRlbnVtZmllbGQoVU5JVFRFU1Q6OkZPUkVJR05fQkFSKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRtZXNzYWdlZmllbGQoKS0+c2V0X2MoMTUpOworCisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLnByaW1pdGl2ZWZpZWxkKCkpOworICBFWFBFQ1RfRVEoImZvbyIsIG1lc3NhZ2Uuc3RyaW5nZmllbGQoKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rk9SRUlHTl9GT08sIG1lc3NhZ2UuZW51bWZpZWxkKCkpOworICBFWFBFQ1RfRVEoNiwgbWVzc2FnZS5tZXNzYWdlZmllbGQoKS5jKCkpOworCisgIEVYUEVDVF9FUSg4LCBtZXNzYWdlLnJlcGVhdGVkcHJpbWl0aXZlZmllbGQoMCkpOworICBFWFBFQ1RfRVEoIm1vbyIsIG1lc3NhZ2UucmVwZWF0ZWRzdHJpbmdmaWVsZCgwKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rk9SRUlHTl9CQVIsIG1lc3NhZ2UucmVwZWF0ZWRlbnVtZmllbGQoMCkpOworICBFWFBFQ1RfRVEoMTUsIG1lc3NhZ2UucmVwZWF0ZWRtZXNzYWdlZmllbGQoMCkuYygpKTsKK30KKworI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBUZXN0T3B0aW1pemVkRm9yU2l6ZSkgeworICAvLyBXZSByZWx5IG9uIHRoZSB0ZXN0cyBpbiByZWZsZWN0aW9uX29wc191bml0dGVzdCBhbmQgd2lyZV9mb3JtYXRfdW5pdHRlc3QKKyAgLy8gdG8gcmVhbGx5IHRlc3QgdGhhdCByZWZsZWN0aW9uLWJhc2VkIG1ldGhvZHMgd29yay4gIEhlcmUgd2UgYXJlIG1vc3RseQorICAvLyBqdXN0IG1ha2luZyBzdXJlIHRoYXQgVGVzdE9wdGltaXplZEZvclNpemUgYWN0dWFsbHkgYnVpbGRzIGFuZCBzZWVtcyB0bworICAvLyBmdW5jdGlvbi4KKworICBVTklUVEVTVDo6VGVzdE9wdGltaXplZEZvclNpemUgbWVzc2FnZSwgbWVzc2FnZTI7CisgIG1lc3NhZ2Uuc2V0X2koMSk7CisgIG1lc3NhZ2UubXV0YWJsZV9tc2coKS0+c2V0X2MoMik7CisgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZTIuaSgpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UyLm1zZygpLmMoKSk7Cit9CisKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplKSB7CisgIC8vIFZlcmlmaWVzIHRoYXQgc29tZXRoaW5nIG9wdGltaXplZCBmb3Igc3BlZWQgY2FuIGNvbnRhaW4gc29tZXRoaW5nIG9wdGltaXplZAorICAvLyBmb3Igc2l6ZS4KKworICBVTklUVEVTVDo6VGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSBtZXNzYWdlLCBtZXNzYWdlMjsKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2koMSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX21lc3NhZ2UoKS0+bXV0YWJsZV9tc2coKS0+c2V0X2MoMik7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworICBBU1NFUlRfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZTIub3B0aW9uYWxfbWVzc2FnZSgpLmkoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlMi5yZXBlYXRlZF9tZXNzYWdlKDApLm1zZygpLmMoKSk7Cit9CisKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBUZXN0U3BhY2VVc2VkKSB7CisgIC8vIEFsbG9jYXRlIGV4cGxpY2l0bHkgb24gdGhlIGhlYXAgdG8gcHJldmVudCBhcmVuYSBjcmVhdGlvbi4KKyAgc3RkOjp1bmlxdWVfcHRyPFVOSVRURVNUOjpUZXN0QWxsVHlwZXM+IG1lc3NhZ2UxKAorICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFVOSVRURVNUOjpUZXN0QWxsVHlwZXM+KG51bGxwdHIpKTsKKyAgLy8gc2l6ZW9mIHByb3ZpZGVzIGEgbG93ZXIgYm91bmQgb24gU3BhY2VVc2VkTG9uZygpLgorICBFWFBFQ1RfTEUoc2l6ZW9mKFVOSVRURVNUOjpUZXN0QWxsVHlwZXMpLCBtZXNzYWdlMS0+U3BhY2VVc2VkTG9uZygpKTsKKyAgY29uc3Qgc2l6ZV90IGVtcHR5X21lc3NhZ2Vfc2l6ZSA9IG1lc3NhZ2UxLT5TcGFjZVVzZWRMb25nKCk7CisKKyAgLy8gU2V0dGluZyBwcmltaXRpdmUgdHlwZXMgc2hvdWxkbid0IGFmZmVjdCB0aGUgc3BhY2UgdXNlZC4KKyAgbWVzc2FnZTEtPnNldF9vcHRpb25hbF9pbnQzMigxMjMpOworICBtZXNzYWdlMS0+c2V0X29wdGlvbmFsX2ludDY0KDEyMzQ1KTsKKyAgbWVzc2FnZTEtPnNldF9vcHRpb25hbF91aW50MzIoMTIzKTsKKyAgbWVzc2FnZTEtPnNldF9vcHRpb25hbF91aW50NjQoMTIzNDUpOworICBFWFBFQ1RfRVEoZW1wdHlfbWVzc2FnZV9zaXplLCBtZXNzYWdlMS0+U3BhY2VVc2VkTG9uZygpKTsKKworICAvLyBPbiBzb21lIFNUTCBpbXBsZW1lbnRhdGlvbnMsIHNldHRpbmcgdGhlIHN0cmluZyB0byBhIHNtYWxsIHZhbHVlIHNob3VsZAorICAvLyBvbmx5IGluY3JlYXNlIFNwYWNlVXNlZExvbmcoKSBieSB0aGUgc2l6ZSBvZiBhIHN0cmluZyBvYmplY3QsIHRob3VnaCB0aGlzCisgIC8vIGlzIG5vdCB0cnVlIGV2ZXJ5d2hlcmUuCisgIG1lc3NhZ2UxLT5zZXRfb3B0aW9uYWxfc3RyaW5nKCJhYmMiKTsKKyAgRVhQRUNUX0xFKGVtcHR5X21lc3NhZ2Vfc2l6ZSArIG1lc3NhZ2UxLT5vcHRpb25hbF9zdHJpbmcoKS5zaXplKCksCisgICAgICAgICAgICBtZXNzYWdlMS0+U3BhY2VVc2VkTG9uZygpKTsKKworICAvLyBTZXR0aW5nIGEgc3RyaW5nIHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gdGhlIHN0cmluZyBvYmplY3QgaXRzZWxmIHNob3VsZAorICAvLyBpbmNyZWFzZSBTcGFjZVVzZWRMb25nKCksIGJlY2F1c2UgaXQgY2Fubm90IHN0b3JlIHRoZSB2YWx1ZSBpbnRlcm5hbGx5LgorICBtZXNzYWdlMS0+c2V0X29wdGlvbmFsX3N0cmluZyhzdGQ6OnN0cmluZyhzaXplb2Yoc3RkOjpzdHJpbmcpICsgMSwgJ3gnKSk7CisgIGludCBtaW5fZXhwZWN0ZWRfaW5jcmVhc2UgPSBtZXNzYWdlMS0+b3B0aW9uYWxfc3RyaW5nKCkuY2FwYWNpdHkoKTsKKyAgRVhQRUNUX0xFKGVtcHR5X21lc3NhZ2Vfc2l6ZSArIG1pbl9leHBlY3RlZF9pbmNyZWFzZSwKKyAgICAgICAgICAgIG1lc3NhZ2UxLT5TcGFjZVVzZWRMb25nKCkpOworCisgIHNpemVfdCBwcmV2aW91c19zaXplID0gbWVzc2FnZTEtPlNwYWNlVXNlZExvbmcoKTsKKyAgLy8gQWRkaW5nIGFuIG9wdGlvbmFsIG1lc3NhZ2Ugc2hvdWxkIGluY3JlYXNlIHRoZSBzaXplIGJ5IHRoZSBzaXplIG9mIHRoZQorICAvLyBuZXN0ZWQgbWVzc2FnZSB0eXBlLiBOZXN0ZWRNZXNzYWdlIGlzIHNpbXBsZSBlbm91Z2ggKDEgaW50IGZpZWxkKSB0aGF0IGl0CisgIC8vIGlzIGVxdWFsIHRvIHNpemVvZihOZXN0ZWRNZXNzYWdlKQorICBtZXNzYWdlMS0+bXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworICBBU1NFUlRfRVEoc2l6ZW9mKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UpLAorICAgICAgICAgICAgbWVzc2FnZTEtPm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuU3BhY2VVc2VkTG9uZygpKTsKKyAgRVhQRUNUX0VRKHByZXZpb3VzX3NpemUgKworICAgICAgICAgICAgc2l6ZW9mKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UpLAorICAgICAgICAgICAgbWVzc2FnZTEtPlNwYWNlVXNlZExvbmcoKSk7Cit9CisKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBUZXN0T25lb2ZTcGFjZVVzZWQpIHsKKyAgLy8gQWxsb2NhdGUgZXhwbGljaXRseSBvbiB0aGUgaGVhcCB0byBwcmV2ZW50IGFyZW5hIGNyZWF0aW9uLgorICBzdGQ6OnVuaXF1ZV9wdHI8VU5JVFRFU1Q6OlRlc3RPbmVvZjI+IG1lc3NhZ2UxKAorICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFVOSVRURVNUOjpUZXN0T25lb2YyPihudWxscHRyKSk7CisgIEVYUEVDVF9MRShzaXplb2YoVU5JVFRFU1Q6OlRlc3RPbmVvZjIpLCBtZXNzYWdlMS0+U3BhY2VVc2VkTG9uZygpKTsKKworICBjb25zdCBzaXplX3QgZW1wdHlfbWVzc2FnZV9zaXplID0gbWVzc2FnZTEtPlNwYWNlVXNlZExvbmcoKTsKKyAgLy8gU2V0dGluZyBwcmltaXRpdmUgdHlwZXMgc2hvdWxkbid0IGFmZmVjdCB0aGUgc3BhY2UgdXNlZC4KKyAgbWVzc2FnZTEtPnNldF9mb29faW50KDEyMyk7CisgIG1lc3NhZ2UxLT5zZXRfYmFyX2ludCgxMjM0NSk7CisgIEVYUEVDVF9FUShlbXB0eV9tZXNzYWdlX3NpemUsIG1lc3NhZ2UxLT5TcGFjZVVzZWRMb25nKCkpOworCisgIC8vIFNldHRpbmcgYSBzdHJpbmcgaW4gb25lb2YgdG8gYSBzbWFsbCB2YWx1ZSBzaG91bGQgb25seSBpbmNyZWFzZQorICAvLyBTcGFjZVVzZWRMb25nKCkgYnkgdGhlIHNpemUgb2YgYSBzdHJpbmcgb2JqZWN0LgorICBtZXNzYWdlMS0+c2V0X2Zvb19zdHJpbmcoImFiYyIpOworICBFWFBFQ1RfTEUoZW1wdHlfbWVzc2FnZV9zaXplICsgc2l6ZW9mKHN0ZDo6c3RyaW5nKSwgbWVzc2FnZTEtPlNwYWNlVXNlZExvbmcoKSk7CisKKyAgLy8gU2V0dGluZyBhIHN0cmluZyBpbiBvbmVvZiB0byBhIHZhbHVlIGxhcmdlciB0aGFuIHRoZSBzdHJpbmcgb2JqZWN0IGl0c2VsZgorICAvLyBzaG91bGQgaW5jcmVhc2UgU3BhY2VVc2VkTG9uZygpLCBiZWNhdXNlIGl0IGNhbm5vdCBzdG9yZSB0aGUgdmFsdWUKKyAgLy8gaW50ZXJuYWxseS4KKyAgbWVzc2FnZTEtPnNldF9mb29fc3RyaW5nKHN0ZDo6c3RyaW5nKHNpemVvZihzdGQ6OnN0cmluZykgKyAxLCAneCcpKTsKKyAgaW50IG1pbl9leHBlY3RlZF9pbmNyZWFzZSA9CisgICAgICBtZXNzYWdlMS0+Zm9vX3N0cmluZygpLmNhcGFjaXR5KCkgKyBzaXplb2Yoc3RkOjpzdHJpbmcpOworICBFWFBFQ1RfTEUoZW1wdHlfbWVzc2FnZV9zaXplICsgbWluX2V4cGVjdGVkX2luY3JlYXNlLAorICAgICAgICAgICAgbWVzc2FnZTEtPlNwYWNlVXNlZExvbmcoKSk7CisKKyAgLy8gU2V0dGluZyBhIG1lc3NhZ2UgaW4gb25lb2Ygc2hvdWxkIGRlbGV0ZSB0aGUgb3RoZXIgZmllbGRzIGFuZCBpbmNyZWFzZSB0aGUKKyAgLy8gc2l6ZSBieSB0aGUgc2l6ZSBvZiB0aGUgbmVzdGVkIG1lc3NhZ2UgdHlwZS4gTmVzdGVkTWVzc2FnZSBpcyBzaW1wbGUgZW5vdWdoCisgIC8vIHRoYXQgaXQgaXMgZXF1YWwgdG8gc2l6ZW9mKE5lc3RlZE1lc3NhZ2UpLiBJdCBtYXkgYmUgYmFja2VkIGJ5IExhenlGaWVsZCwKKyAgLy8gaW5jcmVhc2luZyBzcGFjZSB1c2VkIGJ5IExhenlGaWVsZCBhbmQgYmFja2luZyBDb3JkLgorICBtZXNzYWdlMS0+bXV0YWJsZV9mb29fbWVzc2FnZSgpOworICBBU1NFUlRfRVEoc2l6ZW9mKFVOSVRURVNUOjpUZXN0T25lb2YyOjpOZXN0ZWRNZXNzYWdlKSwKKyAgICAgICAgICAgIG1lc3NhZ2UxLT5mb29fbWVzc2FnZSgpLlNwYWNlVXNlZExvbmcoKSk7CisgIEVYUEVDVF9MRShlbXB0eV9tZXNzYWdlX3NpemUgKyBzaXplb2YoVU5JVFRFU1Q6OlRlc3RPbmVvZjI6Ok5lc3RlZE1lc3NhZ2UpLAorICAgICAgICAgICAgbWVzc2FnZTEtPlNwYWNlVXNlZExvbmcoKSk7Cit9CisKKyNlbmRpZiAgLy8gIVBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKworVEVTVChHRU5FUkFURURfTUVTU0FHRV9URVNUX05BTUUsIEZpZWxkQ29uc3RhbnRWYWx1ZXMpIHsKKyAgVU5JVFRFU1Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlOjprQmJGaWVsZE51bWJlciwgMSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjprT3B0aW9uYWxJbnQzMkZpZWxkTnVtYmVyLCAxKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OmtPcHRpb25hbGdyb3VwRmllbGROdW1iZXIsIDE2KTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OmtPcHRpb25hbE5lc3RlZE1lc3NhZ2VGaWVsZE51bWJlciwgMTgpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6a09wdGlvbmFsTmVzdGVkRW51bUZpZWxkTnVtYmVyLCAyMSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjprUmVwZWF0ZWRJbnQzMkZpZWxkTnVtYmVyLCAzMSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjprUmVwZWF0ZWRncm91cEZpZWxkTnVtYmVyLCA0Nik7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjprUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRmllbGROdW1iZXIsIDQ4KTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OmtSZXBlYXRlZE5lc3RlZEVudW1GaWVsZE51bWJlciwgNTEpOworfQorCitURVNUKEdFTkVSQVRFRF9NRVNTQUdFX1RFU1RfTkFNRSwgRXh0ZW5zaW9uQ29uc3RhbnRWYWx1ZXMpIHsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0UmVxdWlyZWQ6OmtTaW5nbGVGaWVsZE51bWJlciwgMTAwMCk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6VGVzdFJlcXVpcmVkOjprTXVsdGlGaWVsZE51bWJlciwgMTAwMSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6a09wdGlvbmFsSW50MzJFeHRlbnNpb25GaWVsZE51bWJlciwgMSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6a09wdGlvbmFsZ3JvdXBFeHRlbnNpb25GaWVsZE51bWJlciwgMTYpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OmtPcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25GaWVsZE51bWJlciwgMTgpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OmtPcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25GaWVsZE51bWJlciwgMjEpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OmtSZXBlYXRlZEludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIsIDMxKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjprUmVwZWF0ZWRncm91cEV4dGVuc2lvbkZpZWxkTnVtYmVyLCA0Nik7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6a1JlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkZpZWxkTnVtYmVyLCA0OCk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6a1JlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyLCA1MSk7Cit9CisKK1RFU1QoR0VORVJBVEVEX01FU1NBR0VfVEVTVF9OQU1FLCBQYXJzZUZyb21UcnVuY2F0ZWQpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbG9uZ19zdHJpbmcgPSBzdGQ6OnN0cmluZygxMjgsICdxJyk7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gcDsKKyAgcC5hZGRfZXh0ZW5zaW9uKCktPnNldF9uYW1lKGxvbmdfc3RyaW5nKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbXNnID0gcC5TZXJpYWxpemVBc1N0cmluZygpOworICBpbnQgc3VjY2Vzc2Z1bF9jb3VudCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IG1zZy5zaXplKCk7IGkrKykgeworICAgIGlmIChwLlBhcnNlRnJvbUFycmF5KG1zZy5jX3N0cigpLCBpKSkgeworICAgICAgKytzdWNjZXNzZnVsX2NvdW50OworICAgIH0KKyAgfQorICAvLyBXZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCBob3cgb2Z0ZW4gd2Ugc3VjY2VlZGVkLgorICAvLyBBcyBsb25nIGFzIHdlIGRpZG4ndCBjcmFzaCwgd2UncmUgaGFwcHkuCisgIEVYUEVDVF9HRShzdWNjZXNzZnVsX2NvdW50LCAxKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitURVNUKEdFTkVSQVRFRF9FTlVNX1RFU1RfTkFNRSwgRW51bVZhbHVlc0FzU3dpdGNoQ2FzZXMpIHsKKyAgLy8gVGVzdCB0aGF0IG91ciBuZXN0ZWQgZW51bSB2YWx1ZXMgY2FuIGJlIHVzZWQgYXMgc3dpdGNoIGNhc2VzLiAgVGhpcyB0ZXN0CisgIC8vIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcsIHRoZSBwcm9vZiB0aGF0IGl0IHdvcmtzIGlzIHRoYXQgaXQKKyAgLy8gY29tcGlsZXMuCisgIGludCBpID0wOworICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtIGEgPSBVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpCQVI7CisgIHN3aXRjaCAoYSkgeworICAgIGNhc2UgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6Rk9POgorICAgICAgaSA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBUjoKKyAgICAgIGkgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpCQVo6CisgICAgICBpID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6TkVHOgorICAgICAgaSA9IC0xOworICAgICAgYnJlYWs7CisgICAgLy8gbm8gZGVmYXVsdCBjYXNlOiAgV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhlIGNvbXBpbGVyIHJlY29nbml6ZXMgdGhhdAorICAgIC8vICAgYWxsIGNhc2VzIGFyZSBjb3ZlcmVkLiAgKEdDQyB3YXJucyBpZiB5b3UgZG8gbm90IGNvdmVyIGFsbCBjYXNlcyBvZgorICAgIC8vICAgYW4gZW51bSBpbiBhIHN3aXRjaC4pCisgIH0KKworICAvLyBUb2tlbiBjaGVjayBqdXN0IGZvciBmdW4uCisgIEVYUEVDVF9FUSgyLCBpKTsKK30KKworVEVTVChHRU5FUkFURURfRU5VTV9URVNUX05BTUUsIElzVmFsaWRWYWx1ZSkgeworICAvLyBUZXN0IGVudW0gSXNWYWxpZFZhbHVlLgorICBFWFBFQ1RfVFJVRShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX0lzVmFsaWQoMSkpOworICBFWFBFQ1RfVFJVRShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX0lzVmFsaWQoMikpOworICBFWFBFQ1RfVFJVRShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX0lzVmFsaWQoMykpOworCisgIEVYUEVDVF9GQUxTRShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX0lzVmFsaWQoMCkpOworICBFWFBFQ1RfRkFMU0UoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bV9Jc1ZhbGlkKDQpKTsKKworICAvLyBNYWtlIHN1cmUgaXQgYWxzbyB3b3JrcyB3aGVuIHRoZXJlIGFyZSBkdXBzLgorICBFWFBFQ1RfVFJVRShVTklUVEVTVDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfSXNWYWxpZCgxKSk7CisgIEVYUEVDVF9UUlVFKFVOSVRURVNUOjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9Jc1ZhbGlkKDIpKTsKKyAgRVhQRUNUX1RSVUUoVU5JVFRFU1Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX0lzVmFsaWQoMykpOworCisgIEVYUEVDVF9GQUxTRShVTklUVEVTVDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfSXNWYWxpZCgwKSk7CisgIEVYUEVDVF9GQUxTRShVTklUVEVTVDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfSXNWYWxpZCg0KSk7Cit9CisKK1RFU1QoR0VORVJBVEVEX0VOVU1fVEVTVF9OQU1FLCBNaW5BbmRNYXgpIHsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6Ok5FRywKKyAgICAgICAgICAgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fTUlOKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBWiwKKyAgICAgICAgICAgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fTUFYKTsKKyAgRVhQRUNUX0VRKDQsIFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fQVJSQVlTSVpFKTsKKworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OkZPUkVJR05fRk9PLCBVTklUVEVTVDo6Rm9yZWlnbkVudW1fTUlOKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpGT1JFSUdOX0JBWiwgVU5JVFRFU1Q6OkZvcmVpZ25FbnVtX01BWCk7CisgIEVYUEVDVF9FUSg3LCBVTklUVEVTVDo6Rm9yZWlnbkVudW1fQVJSQVlTSVpFKTsKKworICBFWFBFQ1RfRVEoMSwgVU5JVFRFU1Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX01JTik7CisgIEVYUEVDVF9FUSgzLCBVTklUVEVTVDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfTUFYKTsKKyAgRVhQRUNUX0VRKDQsIFVOSVRURVNUOjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9BUlJBWVNJWkUpOworCisgIEVYUEVDVF9FUShVTklUVEVTVDo6U1BBUlNFX0UsIFVOSVRURVNUOjpUZXN0U3BhcnNlRW51bV9NSU4pOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlNQQVJTRV9DLCBVTklUVEVTVDo6VGVzdFNwYXJzZUVudW1fTUFYKTsKKyAgRVhQRUNUX0VRKDEyNTg5MjM1LCBVTklUVEVTVDo6VGVzdFNwYXJzZUVudW1fQVJSQVlTSVpFKTsKKworICAvLyBNYWtlIHN1cmUgd2UgY2FuIHRha2UgdGhlIGFkZHJlc3Mgb2YgX01JTiwgX01BWCBhbmQgX0FSUkFZU0laRS4KKyAgRVhQRUNUX05FKG51bGxwdHIsICZVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX01JTik7CisgIEVYUEVDVF9ORShudWxscHRyLCAmVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bV9NQVgpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgJlVOSVRURVNUOjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fQVJSQVlTSVpFKTsKKworICBFWFBFQ1RfTkUobnVsbHB0ciwgJlVOSVRURVNUOjpGb3JlaWduRW51bV9NSU4pOworICBFWFBFQ1RfTkUobnVsbHB0ciwgJlVOSVRURVNUOjpGb3JlaWduRW51bV9NQVgpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgJlVOSVRURVNUOjpGb3JlaWduRW51bV9BUlJBWVNJWkUpOworCisgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gdXNlIF9NSU4gYW5kIF9NQVggYXMgc3dpdGNoIGNhc2VzLgorICBzd2l0Y2ggKFVOSVRURVNUOjpTUEFSU0VfQSkgeworICAgIGNhc2UgVU5JVFRFU1Q6OlRlc3RTcGFyc2VFbnVtX01JTjoKKyAgICBjYXNlIFVOSVRURVNUOjpUZXN0U3BhcnNlRW51bV9NQVg6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisKK1RFU1QoR0VORVJBVEVEX0VOVU1fVEVTVF9OQU1FLCBOYW1lKSB7CisgIC8vICJOYW1lcyIgaW4gdGhlIHByZXNlbmNlIG9mIGR1cCB2YWx1ZXMgbWFwIHRvIHRoZSBmaXJzdCBhbGlhcy4KKyAgRVhQRUNUX0VRKCJGT08xIiwgVU5JVFRFU1Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX05hbWUoVU5JVFRFU1Q6OkZPTzEpKTsKKyAgRVhQRUNUX0VRKCJGT08xIiwgVU5JVFRFU1Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX05hbWUoVU5JVFRFU1Q6OkZPTzIpKTsKKworICBFWFBFQ1RfRVEoIlNQQVJTRV9BIiwgVU5JVFRFU1Q6OlRlc3RTcGFyc2VFbnVtX05hbWUoVU5JVFRFU1Q6OlNQQVJTRV9BKSk7CisgIEVYUEVDVF9FUSgiU1BBUlNFX0IiLCBVTklUVEVTVDo6VGVzdFNwYXJzZUVudW1fTmFtZShVTklUVEVTVDo6U1BBUlNFX0IpKTsKKyAgRVhQRUNUX0VRKCJTUEFSU0VfQyIsIFVOSVRURVNUOjpUZXN0U3BhcnNlRW51bV9OYW1lKFVOSVRURVNUOjpTUEFSU0VfQykpOworICBFWFBFQ1RfRVEoIlNQQVJTRV9EIiwgVU5JVFRFU1Q6OlRlc3RTcGFyc2VFbnVtX05hbWUoVU5JVFRFU1Q6OlNQQVJTRV9EKSk7CisgIEVYUEVDVF9FUSgiU1BBUlNFX0UiLCBVTklUVEVTVDo6VGVzdFNwYXJzZUVudW1fTmFtZShVTklUVEVTVDo6U1BBUlNFX0UpKTsKKyAgRVhQRUNUX0VRKCJTUEFSU0VfRiIsIFVOSVRURVNUOjpUZXN0U3BhcnNlRW51bV9OYW1lKFVOSVRURVNUOjpTUEFSU0VfRikpOworICBFWFBFQ1RfRVEoIlNQQVJTRV9HIiwgVU5JVFRFU1Q6OlRlc3RTcGFyc2VFbnVtX05hbWUoVU5JVFRFU1Q6OlNQQVJTRV9HKSk7Cit9CisKK1RFU1QoR0VORVJBVEVEX0VOVU1fVEVTVF9OQU1FLCBQYXJzZSkgeworICBVTklUVEVTVDo6VGVzdEVudW1XaXRoRHVwVmFsdWUgZHVwX3ZhbHVlID0gVU5JVFRFU1Q6OkZPTzE7CisgIEVYUEVDVF9UUlVFKFVOSVRURVNUOjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9QYXJzZSgiRk9PMSIsICZkdXBfdmFsdWUpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpGT08xLCBkdXBfdmFsdWUpOworICBFWFBFQ1RfVFJVRShVTklUVEVTVDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfUGFyc2UoIkZPTzIiLCAmZHVwX3ZhbHVlKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rk9PMiwgZHVwX3ZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKFVOSVRURVNUOjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9QYXJzZSgiRk9PIiwgJmR1cF92YWx1ZSkpOworfQorCitURVNUKEdFTkVSQVRFRF9FTlVNX1RFU1RfTkFNRSwgR2V0RW51bURlc2NyaXB0b3IpIHsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fZGVzY3JpcHRvcigpLAorICAgICAgICAgICAgR2V0RW51bURlc2NyaXB0b3I8VU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bT4oKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rm9yZWlnbkVudW1fZGVzY3JpcHRvcigpLAorICAgICAgICAgICAgR2V0RW51bURlc2NyaXB0b3I8VU5JVFRFU1Q6OkZvcmVpZ25FbnVtPigpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9kZXNjcmlwdG9yKCksCisgICAgICAgICAgICBHZXRFbnVtRGVzY3JpcHRvcjxVTklUVEVTVDo6VGVzdEVudW1XaXRoRHVwVmFsdWU+KCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlRlc3RTcGFyc2VFbnVtX2Rlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgIEdldEVudW1EZXNjcmlwdG9yPFVOSVRURVNUOjpUZXN0U3BhcnNlRW51bT4oKSk7Cit9CisKK2VudW0gTm9uUHJvdG9FbnVtIHsKKyAga0ZvbyA9IDEsCit9OworCitURVNUKEdFTkVSQVRFRF9FTlVNX1RFU1RfTkFNRSwgSXNQcm90b0VudW1UeXBlVHJhaXQpIHsKKyAgRVhQRUNUX1RSVUUoaXNfcHJvdG9fZW51bTxVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19wcm90b19lbnVtPFVOSVRURVNUOjpGb3JlaWduRW51bT46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfcHJvdG9fZW51bTxVTklUVEVTVDo6VGVzdEVudW1XaXRoRHVwVmFsdWU+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3Byb3RvX2VudW08VU5JVFRFU1Q6OlRlc3RTcGFyc2VFbnVtPjo6dmFsdWUpOworCisgIEVYUEVDVF9GQUxTRShpc19wcm90b19lbnVtPGludD46OnZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3Byb3RvX2VudW08Tm9uUHJvdG9FbnVtPjo6dmFsdWUpOworfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKworLy8gU3VwcG9ydCBjb2RlIGZvciB0ZXN0aW5nIHNlcnZpY2VzLgorY2xhc3MgR0VORVJBVEVEX1NFUlZJQ0VfVEVTVF9OQU1FIDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgY2xhc3MgTW9ja1Rlc3RTZXJ2aWNlIDogcHVibGljIFVOSVRURVNUOjpUZXN0U2VydmljZSB7CisgICBwdWJsaWM6CisgICAgTW9ja1Rlc3RTZXJ2aWNlKCkKKyAgICAgICAgOiBjYWxsZWRfKGZhbHNlKSwKKyAgICAgICAgICBtZXRob2RfKCIiKSwKKyAgICAgICAgICBjb250cm9sbGVyXyhudWxscHRyKSwKKyAgICAgICAgICByZXF1ZXN0XyhudWxscHRyKSwKKyAgICAgICAgICByZXNwb25zZV8obnVsbHB0ciksCisgICAgICAgICAgZG9uZV8obnVsbHB0cikge30KKworICAgIH5Nb2NrVGVzdFNlcnZpY2UoKSBvdmVycmlkZSB7fQorCisgICAgdm9pZCBSZXNldCgpIHsgY2FsbGVkXyA9IGZhbHNlOyB9CisKKyAgICAvLyBpbXBsZW1lbnRzIFRlc3RTZXJ2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHZvaWQgRm9vKFJwY0NvbnRyb2xsZXIqIGNvbnRyb2xsZXIsIGNvbnN0IFVOSVRURVNUOjpGb29SZXF1ZXN0KiByZXF1ZXN0LAorICAgICAgICAgICAgIFVOSVRURVNUOjpGb29SZXNwb25zZSogcmVzcG9uc2UsIENsb3N1cmUqIGRvbmUpIG92ZXJyaWRlIHsKKyAgICAgIEFTU0VSVF9GQUxTRShjYWxsZWRfKTsKKyAgICAgIGNhbGxlZF8gPSB0cnVlOworICAgICAgbWV0aG9kXyA9ICJGb28iOworICAgICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOworICAgICAgcmVxdWVzdF8gPSByZXF1ZXN0OworICAgICAgcmVzcG9uc2VfID0gcmVzcG9uc2U7CisgICAgICBkb25lXyA9IGRvbmU7CisgICAgfQorCisgICAgdm9pZCBCYXIoUnBjQ29udHJvbGxlciogY29udHJvbGxlciwgY29uc3QgVU5JVFRFU1Q6OkJhclJlcXVlc3QqIHJlcXVlc3QsCisgICAgICAgICAgICAgVU5JVFRFU1Q6OkJhclJlc3BvbnNlKiByZXNwb25zZSwgQ2xvc3VyZSogZG9uZSkgb3ZlcnJpZGUgeworICAgICAgQVNTRVJUX0ZBTFNFKGNhbGxlZF8pOworICAgICAgY2FsbGVkXyA9IHRydWU7CisgICAgICBtZXRob2RfID0gIkJhciI7CisgICAgICBjb250cm9sbGVyXyA9IGNvbnRyb2xsZXI7CisgICAgICByZXF1ZXN0XyA9IHJlcXVlc3Q7CisgICAgICByZXNwb25zZV8gPSByZXNwb25zZTsKKyAgICAgIGRvbmVfID0gZG9uZTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGJvb2wgY2FsbGVkXzsKKyAgICBzdGQ6OnN0cmluZyBtZXRob2RfOworICAgIFJwY0NvbnRyb2xsZXIqIGNvbnRyb2xsZXJfOworICAgIGNvbnN0IE1lc3NhZ2UqIHJlcXVlc3RfOworICAgIE1lc3NhZ2UqIHJlc3BvbnNlXzsKKyAgICBDbG9zdXJlKiBkb25lXzsKKyAgfTsKKworICBjbGFzcyBNb2NrUnBjQ2hhbm5lbCA6IHB1YmxpYyBScGNDaGFubmVsIHsKKyAgIHB1YmxpYzoKKyAgICBNb2NrUnBjQ2hhbm5lbCgpCisgICAgICAgIDogY2FsbGVkXyhmYWxzZSksCisgICAgICAgICAgbWV0aG9kXyhudWxscHRyKSwKKyAgICAgICAgICBjb250cm9sbGVyXyhudWxscHRyKSwKKyAgICAgICAgICByZXF1ZXN0XyhudWxscHRyKSwKKyAgICAgICAgICByZXNwb25zZV8obnVsbHB0ciksCisgICAgICAgICAgZG9uZV8obnVsbHB0ciksCisgICAgICAgICAgZGVzdHJveWVkXyhudWxscHRyKSB7fQorCisgICAgfk1vY2tScGNDaGFubmVsKCkgb3ZlcnJpZGUgeworICAgICAgaWYgKGRlc3Ryb3llZF8gIT0gbnVsbHB0cikgKmRlc3Ryb3llZF8gPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgUmVzZXQoKSB7IGNhbGxlZF8gPSBmYWxzZTsgfQorCisgICAgLy8gaW1wbGVtZW50cyBUZXN0U2VydmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICB2b2lkIENhbGxNZXRob2QoY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLCBScGNDb250cm9sbGVyKiBjb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiByZXF1ZXN0LCBNZXNzYWdlKiByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgQ2xvc3VyZSogZG9uZSkgb3ZlcnJpZGUgeworICAgICAgQVNTRVJUX0ZBTFNFKGNhbGxlZF8pOworICAgICAgY2FsbGVkXyA9IHRydWU7CisgICAgICBtZXRob2RfID0gbWV0aG9kOworICAgICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOworICAgICAgcmVxdWVzdF8gPSByZXF1ZXN0OworICAgICAgcmVzcG9uc2VfID0gcmVzcG9uc2U7CisgICAgICBkb25lXyA9IGRvbmU7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBib29sIGNhbGxlZF87CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kXzsKKyAgICBScGNDb250cm9sbGVyKiBjb250cm9sbGVyXzsKKyAgICBjb25zdCBNZXNzYWdlKiByZXF1ZXN0XzsKKyAgICBNZXNzYWdlKiByZXNwb25zZV87CisgICAgQ2xvc3VyZSogZG9uZV87CisgICAgYm9vbCogZGVzdHJveWVkXzsKKyAgfTsKKworICBjbGFzcyBNb2NrQ29udHJvbGxlciA6IHB1YmxpYyBScGNDb250cm9sbGVyIHsKKyAgIHB1YmxpYzoKKyAgICB2b2lkIFJlc2V0KCkgb3ZlcnJpZGUgeworICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiUmVzZXQoKSBub3QgZXhwZWN0ZWQgZHVyaW5nIHRoaXMgdGVzdC4iOworICAgIH0KKyAgICBib29sIEZhaWxlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkZhaWxlZCgpIG5vdCBleHBlY3RlZCBkdXJpbmcgdGhpcyB0ZXN0LiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIEVycm9yVGV4dCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkVycm9yVGV4dCgpIG5vdCBleHBlY3RlZCBkdXJpbmcgdGhpcyB0ZXN0LiI7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIHZvaWQgU3RhcnRDYW5jZWwoKSBvdmVycmlkZSB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8ICJTdGFydENhbmNlbCgpIG5vdCBleHBlY3RlZCBkdXJpbmcgdGhpcyB0ZXN0LiI7CisgICAgfQorICAgIHZvaWQgU2V0RmFpbGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pIG92ZXJyaWRlIHsKKyAgICAgIEFERF9GQUlMVVJFKCkgPDwgIlNldEZhaWxlZCgpIG5vdCBleHBlY3RlZCBkdXJpbmcgdGhpcyB0ZXN0LiI7CisgICAgfQorICAgIGJvb2wgSXNDYW5jZWxlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIEFERF9GQUlMVVJFKCkgPDwgIklzQ2FuY2VsZWQoKSBub3QgZXhwZWN0ZWQgZHVyaW5nIHRoaXMgdGVzdC4iOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2b2lkIE5vdGlmeU9uQ2FuY2VsKENsb3N1cmUqIGNhbGxiYWNrKSBvdmVycmlkZSB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8ICJOb3RpZnlPbkNhbmNlbCgpIG5vdCBleHBlY3RlZCBkdXJpbmcgdGhpcyB0ZXN0LiI7CisgICAgfQorICB9OworCisgIEdFTkVSQVRFRF9TRVJWSUNFX1RFU1RfTkFNRSgpCisgICAgOiBkZXNjcmlwdG9yXyhVTklUVEVTVDo6VGVzdFNlcnZpY2U6OmRlc2NyaXB0b3IoKSksCisgICAgICBmb29fKGRlc2NyaXB0b3JfLT5GaW5kTWV0aG9kQnlOYW1lKCJGb28iKSksCisgICAgICBiYXJfKGRlc2NyaXB0b3JfLT5GaW5kTWV0aG9kQnlOYW1lKCJCYXIiKSksCisgICAgICBzdHViXygmbW9ja19jaGFubmVsXyksCisgICAgICBkb25lXyg6Omdvb2dsZTo6cHJvdG9idWY6Ok5ld1Blcm1hbmVudENhbGxiYWNrKCZEb05vdGhpbmcpKSB7fQorCisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgQVNTRVJUX1RSVUUoZm9vXyAhPSBudWxscHRyKTsKKyAgICBBU1NFUlRfVFJVRShiYXJfICE9IG51bGxwdHIpOworICB9CisKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBmb29fOworICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBiYXJfOworCisgIE1vY2tUZXN0U2VydmljZSBtb2NrX3NlcnZpY2VfOworICBNb2NrQ29udHJvbGxlciBtb2NrX2NvbnRyb2xsZXJfOworCisgIE1vY2tScGNDaGFubmVsIG1vY2tfY2hhbm5lbF87CisgIFVOSVRURVNUOjpUZXN0U2VydmljZTo6U3R1YiBzdHViXzsKKworICAvLyBKdXN0IHNvIHdlIGRvbid0IGhhdmUgdG8gcmUtZGVmaW5lIHRoZXNlIHdpdGggZXZlcnkgdGVzdC4KKyAgVU5JVFRFU1Q6OkZvb1JlcXVlc3QgZm9vX3JlcXVlc3RfOworICBVTklUVEVTVDo6Rm9vUmVzcG9uc2UgZm9vX3Jlc3BvbnNlXzsKKyAgVU5JVFRFU1Q6OkJhclJlcXVlc3QgYmFyX3JlcXVlc3RfOworICBVTklUVEVTVDo6QmFyUmVzcG9uc2UgYmFyX3Jlc3BvbnNlXzsKKyAgc3RkOjp1bmlxdWVfcHRyPENsb3N1cmU+IGRvbmVfOworfTsKKworVEVTVF9GKEdFTkVSQVRFRF9TRVJWSUNFX1RFU1RfTkFNRSwgR2V0RGVzY3JpcHRvcikgeworICAvLyBUZXN0IHRoYXQgR2V0RGVzY3JpcHRvcigpIHdvcmtzLgorCisgIEVYUEVDVF9FUShkZXNjcmlwdG9yXywgbW9ja19zZXJ2aWNlXy5HZXREZXNjcmlwdG9yKCkpOworfQorCitURVNUX0YoR0VORVJBVEVEX1NFUlZJQ0VfVEVTVF9OQU1FLCBHZXRDaGFubmVsKSB7CisgIEVYUEVDVF9FUSgmbW9ja19jaGFubmVsXywgc3R1Yl8uY2hhbm5lbCgpKTsKK30KKworVEVTVF9GKEdFTkVSQVRFRF9TRVJWSUNFX1RFU1RfTkFNRSwgT3duc0NoYW5uZWwpIHsKKyAgTW9ja1JwY0NoYW5uZWwqIGNoYW5uZWwgPSBuZXcgTW9ja1JwY0NoYW5uZWw7CisgIGJvb2wgZGVzdHJveWVkID0gZmFsc2U7CisgIGNoYW5uZWwtPmRlc3Ryb3llZF8gPSAmZGVzdHJveWVkOworCisgIHsKKyAgICBVTklUVEVTVDo6VGVzdFNlcnZpY2U6OlN0dWIgb3duaW5nX3N0dWIoY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZTo6U1RVQl9PV05TX0NIQU5ORUwpOworICAgIEVYUEVDVF9GQUxTRShkZXN0cm95ZWQpOworICB9CisKKyAgRVhQRUNUX1RSVUUoZGVzdHJveWVkKTsKK30KKworVEVTVF9GKEdFTkVSQVRFRF9TRVJWSUNFX1RFU1RfTkFNRSwgQ2FsbE1ldGhvZCkgeworICAvLyBUZXN0IHRoYXQgQ2FsbE1ldGhvZCgpIHdvcmtzLgorCisgIC8vIENhbGwgRm9vKCkgdmlhIENhbGxNZXRob2QoKS4KKyAgbW9ja19zZXJ2aWNlXy5DYWxsTWV0aG9kKGZvb18sICZtb2NrX2NvbnRyb2xsZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvb19yZXF1ZXN0XywgJmZvb19yZXNwb25zZV8sIGRvbmVfLmdldCgpKTsKKworICBBU1NFUlRfVFJVRShtb2NrX3NlcnZpY2VfLmNhbGxlZF8pOworCisgIEVYUEVDVF9FUSgiRm9vIiAgICAgICAgICAgICwgbW9ja19zZXJ2aWNlXy5tZXRob2RfICAgICk7CisgIEVYUEVDVF9FUSgmbW9ja19jb250cm9sbGVyXywgbW9ja19zZXJ2aWNlXy5jb250cm9sbGVyXyk7CisgIEVYUEVDVF9FUSgmZm9vX3JlcXVlc3RfICAgICwgbW9ja19zZXJ2aWNlXy5yZXF1ZXN0XyAgICk7CisgIEVYUEVDVF9FUSgmZm9vX3Jlc3BvbnNlXyAgICwgbW9ja19zZXJ2aWNlXy5yZXNwb25zZV8gICk7CisgIEVYUEVDVF9FUShkb25lXy5nZXQoKSAgICAgICwgbW9ja19zZXJ2aWNlXy5kb25lXyAgICAgICk7CisKKyAgLy8gVHJ5IGFnYWluLCBidXQgY2FsbCBCYXIoKSBpbnN0ZWFkLgorICBtb2NrX3NlcnZpY2VfLlJlc2V0KCk7CisgIG1vY2tfc2VydmljZV8uQ2FsbE1ldGhvZChiYXJfLCAmbW9ja19jb250cm9sbGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYXJfcmVxdWVzdF8sICZiYXJfcmVzcG9uc2VfLCBkb25lXy5nZXQoKSk7CisKKyAgQVNTRVJUX1RSVUUobW9ja19zZXJ2aWNlXy5jYWxsZWRfKTsKKyAgRVhQRUNUX0VRKCJCYXIiLCBtb2NrX3NlcnZpY2VfLm1ldGhvZF8pOworfQorCitURVNUX0YoR0VORVJBVEVEX1NFUlZJQ0VfVEVTVF9OQU1FLCBDYWxsTWV0aG9kVHlwZUZhaWx1cmUpIHsKKyAgLy8gVmVyaWZ5IGRlYXRoIGlmIHdlIGNhbGwgRm9vKCkgd2l0aCBCYXIncyBtZXNzYWdlIHR5cGVzLgorCisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QgIC8vIGRlYXRoIHRlc3RzIGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgeWV0CisgIEVYUEVDVF9ERUJVR19ERUFUSCgKKyAgICBtb2NrX3NlcnZpY2VfLkNhbGxNZXRob2QoZm9vXywgJm1vY2tfY29udHJvbGxlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb29fcmVxdWVzdF8sICZiYXJfcmVzcG9uc2VfLCBkb25lXy5nZXQoKSksCisgICAgImR5bmFtaWNfY2FzdCIpOworCisgIG1vY2tfc2VydmljZV8uUmVzZXQoKTsKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKAorICAgIG1vY2tfc2VydmljZV8uQ2FsbE1ldGhvZChmb29fLCAmbW9ja19jb250cm9sbGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhcl9yZXF1ZXN0XywgJmZvb19yZXNwb25zZV8sIGRvbmVfLmdldCgpKSwKKyAgICAiZHluYW1pY19jYXN0Iik7CisjZW5kaWYgIC8vIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCit9CisKK1RFU1RfRihHRU5FUkFURURfU0VSVklDRV9URVNUX05BTUUsIEdldFByb3RvdHlwZXMpIHsKKyAgLy8gVGVzdCBHZXR7UmVxdWVzdCxSZXNwb25zZX1Qcm90b3R5cGUoKSBtZXRob2RzLgorCisgIEVYUEVDVF9FUSgmVU5JVFRFU1Q6OkZvb1JlcXVlc3Q6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtb2NrX3NlcnZpY2VfLkdldFJlcXVlc3RQcm90b3R5cGUoZm9vXykpOworICBFWFBFQ1RfRVEoJlVOSVRURVNUOjpCYXJSZXF1ZXN0OjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbW9ja19zZXJ2aWNlXy5HZXRSZXF1ZXN0UHJvdG90eXBlKGJhcl8pKTsKKworICBFWFBFQ1RfRVEoJlVOSVRURVNUOjpGb29SZXNwb25zZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1vY2tfc2VydmljZV8uR2V0UmVzcG9uc2VQcm90b3R5cGUoZm9vXykpOworICBFWFBFQ1RfRVEoJlVOSVRURVNUOjpCYXJSZXNwb25zZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1vY2tfc2VydmljZV8uR2V0UmVzcG9uc2VQcm90b3R5cGUoYmFyXykpOworfQorCitURVNUX0YoR0VORVJBVEVEX1NFUlZJQ0VfVEVTVF9OQU1FLCBTdHViKSB7CisgIC8vIFRlc3QgdGhhdCB0aGUgc3R1YiBjbGFzcyB3b3Jrcy4KKworICAvLyBDYWxsIEZvbygpIHZpYSB0aGUgc3R1Yi4KKyAgc3R1Yl8uRm9vKCZtb2NrX2NvbnRyb2xsZXJfLCAmZm9vX3JlcXVlc3RfLCAmZm9vX3Jlc3BvbnNlXywgZG9uZV8uZ2V0KCkpOworCisgIEFTU0VSVF9UUlVFKG1vY2tfY2hhbm5lbF8uY2FsbGVkXyk7CisKKyAgRVhQRUNUX0VRKGZvb18gICAgICAgICAgICAgLCBtb2NrX2NoYW5uZWxfLm1ldGhvZF8gICAgKTsKKyAgRVhQRUNUX0VRKCZtb2NrX2NvbnRyb2xsZXJfLCBtb2NrX2NoYW5uZWxfLmNvbnRyb2xsZXJfKTsKKyAgRVhQRUNUX0VRKCZmb29fcmVxdWVzdF8gICAgLCBtb2NrX2NoYW5uZWxfLnJlcXVlc3RfICAgKTsKKyAgRVhQRUNUX0VRKCZmb29fcmVzcG9uc2VfICAgLCBtb2NrX2NoYW5uZWxfLnJlc3BvbnNlXyAgKTsKKyAgRVhQRUNUX0VRKGRvbmVfLmdldCgpICAgICAgLCBtb2NrX2NoYW5uZWxfLmRvbmVfICAgICAgKTsKKworICAvLyBDYWxsIEJhcigpIHZpYSB0aGUgc3R1Yi4KKyAgbW9ja19jaGFubmVsXy5SZXNldCgpOworICBzdHViXy5CYXIoJm1vY2tfY29udHJvbGxlcl8sICZiYXJfcmVxdWVzdF8sICZiYXJfcmVzcG9uc2VfLCBkb25lXy5nZXQoKSk7CisKKyAgQVNTRVJUX1RSVUUobW9ja19jaGFubmVsXy5jYWxsZWRfKTsKKyAgRVhQRUNUX0VRKGJhcl8sIG1vY2tfY2hhbm5lbF8ubWV0aG9kXyk7Cit9CisKK1RFU1RfRihHRU5FUkFURURfU0VSVklDRV9URVNUX05BTUUsIE5vdEltcGxlbWVudGVkKSB7CisgIC8vIFRlc3QgdGhhdCBmYWlsaW5nIHRvIGltcGxlbWVudCBhIG1ldGhvZCBvZiBhIHNlcnZpY2UgY2F1c2VzIGl0IHRvIGZhaWwKKyAgLy8gd2l0aCBhICJub3QgaW1wbGVtZW50ZWQiIGVycm9yIG1lc3NhZ2UuCisKKyAgLy8gQSBzZXJ2aWNlIHdoaWNoIGRvZXNuJ3QgaW1wbGVtZW50IGFueSBtZXRob2RzLgorICBjbGFzcyBVbmltcGxlbWVudGVkU2VydmljZSA6IHB1YmxpYyBVTklUVEVTVDo6VGVzdFNlcnZpY2UgeworICAgcHVibGljOgorICAgIFVuaW1wbGVtZW50ZWRTZXJ2aWNlKCkge30KKyAgfTsKKworICBVbmltcGxlbWVudGVkU2VydmljZSB1bmltcGxlbWVudGVkX3NlcnZpY2U7CisKKyAgLy8gQW5kIGEgY29udHJvbGxlciB3aGljaCBleHBlY3RzIHRvIGdldCBhICJub3QgaW1wbGVtZW50ZWQiIGVycm9yLgorICBjbGFzcyBFeHBlY3RVbmltcGxlbWVudGVkQ29udHJvbGxlciA6IHB1YmxpYyBNb2NrQ29udHJvbGxlciB7CisgICBwdWJsaWM6CisgICAgRXhwZWN0VW5pbXBsZW1lbnRlZENvbnRyb2xsZXIoKSA6IGNhbGxlZF8oZmFsc2UpIHt9CisKKyAgICB2b2lkIFNldEZhaWxlZChjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKSBvdmVycmlkZSB7CisgICAgICBFWFBFQ1RfRkFMU0UoY2FsbGVkXyk7CisgICAgICBjYWxsZWRfID0gdHJ1ZTsKKyAgICAgIEVYUEVDVF9FUSgiTWV0aG9kIEZvbygpIG5vdCBpbXBsZW1lbnRlZC4iLCByZWFzb24pOworICAgIH0KKworICAgIGJvb2wgY2FsbGVkXzsKKyAgfTsKKworICBFeHBlY3RVbmltcGxlbWVudGVkQ29udHJvbGxlciBjb250cm9sbGVyOworCisgIC8vIENhbGwgRm9vLgorICB1bmltcGxlbWVudGVkX3NlcnZpY2UuRm9vKCZjb250cm9sbGVyLCAmZm9vX3JlcXVlc3RfLCAmZm9vX3Jlc3BvbnNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lXy5nZXQoKSk7CisKKyAgRVhQRUNUX1RSVUUoY29udHJvbGxlci5jYWxsZWRfKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBPbmVvZlRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUge30KKworICB2b2lkIEV4cGVjdEVudW1DYXNlc1dvcmsoY29uc3QgVU5JVFRFU1Q6OlRlc3RPbmVvZjIgJm1lc3NhZ2UpIHsKKyAgICBzd2l0Y2ggKG1lc3NhZ2UuZm9vX2Nhc2UoKSkgeworICAgICAgY2FzZSBVTklUVEVTVDo6VGVzdE9uZW9mMjo6a0Zvb0ludDoKKyAgICAgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2ludCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVOSVRURVNUOjpUZXN0T25lb2YyOjprRm9vU3RyaW5nOgorICAgICAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVU5JVFRFU1Q6OlRlc3RPbmVvZjI6OmtGb29Db3JkOgorICAgICAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fY29yZCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVOSVRURVNUOjpUZXN0T25lb2YyOjprRm9vU3RyaW5nUGllY2U6CisgICAgICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmdfcGllY2UoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVTklUVEVTVDo6VGVzdE9uZW9mMjo6a0Zvb0J5dGVzOgorICAgICAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fYnl0ZXMoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVTklUVEVTVDo6VGVzdE9uZW9mMjo6a0Zvb0VudW06CisgICAgICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19lbnVtKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVU5JVFRFU1Q6OlRlc3RPbmVvZjI6OmtGb29NZXNzYWdlOgorICAgICAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVOSVRURVNUOjpUZXN0T25lb2YyOjprRm9vZ3JvdXA6CisgICAgICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb2dyb3VwKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVU5JVFRFU1Q6OlRlc3RPbmVvZjI6OmtGb29MYXp5TWVzc2FnZToKKyAgICAgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2xhenlfbWVzc2FnZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVOSVRURVNUOjpUZXN0T25lb2YyOjpGT09fTk9UX1NFVDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9OworCitURVNUX0YoT25lb2ZUZXN0LCBTZXR0aW5nT25lRmllbGRDbGVhcnNPdGhlcnMpIHsKKyAgVU5JVFRFU1Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKworICBtZXNzYWdlLnNldF9mb29faW50KDEyMyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19pbnQoKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZSk7CisKKyAgbWVzc2FnZS5zZXRfZm9vX3N0cmluZygiZm9vIik7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZSk7CisKKworICBtZXNzYWdlLnNldF9mb29fYnl0ZXMoIm1vbyIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fYnl0ZXMoKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZSk7CisKKyAgbWVzc2FnZS5zZXRfZm9vX2VudW0oVU5JVFRFU1Q6OlRlc3RPbmVvZjI6OkZPTyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19lbnVtKCkpOworICBUZXN0VXRpbDo6RXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UpOworCisgIG1lc3NhZ2UubXV0YWJsZV9mb29fbWVzc2FnZSgpLT5zZXRfbW9vX2ludCgyMzQpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEF0TW9zdE9uZUZpZWxkU2V0SW5PbmVvZihtZXNzYWdlKTsKKworICBtZXNzYWdlLm11dGFibGVfZm9vZ3JvdXAoKS0+c2V0X2EoMzQ1KTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vZ3JvdXAoKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZSk7CisKKworICAvLyB3ZSByZXBlYXQgdGhpcyBiZWNhdXNlIHdlIGRpZG4ndCB0ZXN0IGlmIHRoaXMgcHJvcGVybHkgY2xlYXJzIG90aGVyIGZpZWxkcworICAvLyBhdCB0aGUgYmVnaW5uaW5nLgorICBtZXNzYWdlLnNldF9mb29faW50KDEyMyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19pbnQoKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZSk7Cit9CisKK1RFU1RfRihPbmVvZlRlc3QsIEVudW1DYXNlcykgeworICBVTklUVEVTVDo6VGVzdE9uZW9mMiBtZXNzYWdlOworCisgIG1lc3NhZ2Uuc2V0X2Zvb19pbnQoMTIzKTsKKyAgRXhwZWN0RW51bUNhc2VzV29yayhtZXNzYWdlKTsKKyAgbWVzc2FnZS5zZXRfZm9vX3N0cmluZygiZm9vIik7CisgIEV4cGVjdEVudW1DYXNlc1dvcmsobWVzc2FnZSk7CisgIG1lc3NhZ2Uuc2V0X2Zvb19ieXRlcygibW9vIik7CisgIEV4cGVjdEVudW1DYXNlc1dvcmsobWVzc2FnZSk7CisgIG1lc3NhZ2Uuc2V0X2Zvb19lbnVtKFVOSVRURVNUOjpUZXN0T25lb2YyOjpGT08pOworICBFeHBlY3RFbnVtQ2FzZXNXb3JrKG1lc3NhZ2UpOworICBtZXNzYWdlLm11dGFibGVfZm9vX21lc3NhZ2UoKS0+c2V0X21vb19pbnQoMjM0KTsKKyAgRXhwZWN0RW51bUNhc2VzV29yayhtZXNzYWdlKTsKKyAgbWVzc2FnZS5tdXRhYmxlX2Zvb2dyb3VwKCktPnNldF9hKDM0NSk7CisgIEV4cGVjdEVudW1DYXNlc1dvcmsobWVzc2FnZSk7Cit9CisKK1RFU1RfRihPbmVvZlRlc3QsIFByaW1pdGl2ZVR5cGUpIHsKKyAgVU5JVFRFU1Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKyAgLy8gVW5zZXQgZmllbGQgcmV0dXJucyBkZWZhdWx0IHZhbHVlCisgIEVYUEVDVF9FUShtZXNzYWdlLmZvb19pbnQoKSwgMCk7CisKKyAgbWVzc2FnZS5zZXRfZm9vX2ludCgxMjMpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29faW50KCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5mb29faW50KCksIDEyMyk7CisgIG1lc3NhZ2UuY2xlYXJfZm9vX2ludCgpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX2ludCgpKTsKK30KKworVEVTVF9GKE9uZW9mVGVzdCwgRW51bVR5cGUpIHsKKyAgVU5JVFRFU1Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKyAgLy8gVW5zZXQgZmllbGQgcmV0dXJucyBkZWZhdWx0IHZhbHVlCisgIEVYUEVDVF9FUShtZXNzYWdlLmZvb19lbnVtKCksIDEpOworCisgIG1lc3NhZ2Uuc2V0X2Zvb19lbnVtKFVOSVRURVNUOjpUZXN0T25lb2YyOjpGT08pOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fZW51bSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX2VudW0oKSwgVU5JVFRFU1Q6OlRlc3RPbmVvZjI6OkZPTyk7CisgIG1lc3NhZ2UuY2xlYXJfZm9vX2VudW0oKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19lbnVtKCkpOworfQorCitURVNUX0YoT25lb2ZUZXN0LCBTZXRTdHJpbmcpIHsKKyAgLy8gQ2hlY2sgdGhhdCBzZXR0aW5nIGEgc3RyaW5nIGZpZWxkIGluIHZhcmlvdXMgd2F5cyB3b3JrcworICBVTklUVEVTVDo6VGVzdE9uZW9mMiBtZXNzYWdlOworCisgIC8vIFVuc2V0IGZpZWxkIHJldHVybnMgZGVmYXVsdCB2YWx1ZQorICBFWFBFQ1RfRVEobWVzc2FnZS5mb29fc3RyaW5nKCksICIiKTsKKworICBtZXNzYWdlLnNldF9mb29fc3RyaW5nKCJmb28iKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX3N0cmluZygpLCAiZm9vIik7CisgIG1lc3NhZ2UuY2xlYXJfZm9vX3N0cmluZygpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKworICBtZXNzYWdlLnNldF9mb29fc3RyaW5nKHN0ZDo6c3RyaW5nKCJiYXIiKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLmZvb19zdHJpbmcoKSwgImJhciIpOworICBtZXNzYWdlLmNsZWFyX2Zvb19zdHJpbmcoKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisKKworICBtZXNzYWdlLnNldF9mb29fc3RyaW5nKCJtb28iLCAzKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX3N0cmluZygpLCAibW9vIik7CisgIG1lc3NhZ2UuY2xlYXJfZm9vX3N0cmluZygpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKworICBtZXNzYWdlLm11dGFibGVfZm9vX3N0cmluZygpLT5hc3NpZ24oIm1vb28iKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX3N0cmluZygpLCAibW9vbyIpOworICBtZXNzYWdlLmNsZWFyX2Zvb19zdHJpbmcoKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisKKyAgbWVzc2FnZS5zZXRfZm9vX3N0cmluZygiY29yZ2UiKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX3N0cmluZygpLCAiY29yZ2UiKTsKKyAgbWVzc2FnZS5jbGVhcl9mb29fc3RyaW5nKCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOworfQorCitURVNUX0YoT25lb2ZUZXN0LCBSZWxlYXNlU3RyaW5nKSB7CisgIC8vIENoZWNrIHRoYXQgcmVsZWFzZV9mb28oKSBzdGFydHMgb3V0IG51bGxwdHIsIGFuZCBnaXZlcyB1cyBhIHZhbHVlCisgIC8vIHRoYXQgd2UgY2FuIGRlbGV0ZSBhZnRlciBpdCdzIGJlZW4gc2V0LgorICBVTklUVEVTVDo6VGVzdE9uZW9mMiBtZXNzYWdlOworCisgIEVYUEVDVF9FUShudWxscHRyLCBtZXNzYWdlLnJlbGVhc2VfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisKKyAgbWVzc2FnZS5zZXRfZm9vX3N0cmluZygiYmxhaCIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IHN0cihtZXNzYWdlLnJlbGVhc2VfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisgIEFTU0VSVF9UUlVFKHN0ciAhPSBudWxscHRyKTsKKyAgRVhQRUNUX0VRKCJibGFoIiwgKnN0cik7CisKKyAgRVhQRUNUX0VRKG51bGxwdHIsIG1lc3NhZ2UucmVsZWFzZV9mb29fc3RyaW5nKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKK30KKworVEVTVF9GKE9uZW9mVGVzdCwgU2V0QWxsb2NhdGVkU3RyaW5nKSB7CisgIC8vIENoZWNrIHRoYXQgc2V0X2FsbG9jYXRlZF9mb28oKSB3b3JrcyBmb3Igc3RyaW5ncy4KKyAgVU5JVFRFU1Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcga0hlbGxvKCJoZWxsbyIpOworICBtZXNzYWdlLnNldF9mb29fc3RyaW5nKGtIZWxsbyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisKKyAgbWVzc2FnZS5zZXRfYWxsb2NhdGVkX2Zvb19zdHJpbmcobnVsbHB0cik7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoIiIsIG1lc3NhZ2UuZm9vX3N0cmluZygpKTsKKworICBtZXNzYWdlLnNldF9hbGxvY2F0ZWRfZm9vX3N0cmluZyhuZXcgc3RkOjpzdHJpbmcoa0hlbGxvKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisgIEVYUEVDVF9FUShrSGVsbG8sIG1lc3NhZ2UuZm9vX3N0cmluZygpKTsKK30KKworVEVTVF9GKE9uZW9mVGVzdCwgQXJlbmFTZXRBbGxvY2F0ZWRTdHJpbmcpIHsKKyAgLy8gQ2hlY2sgdGhhdCBzZXRfYWxsb2NhdGVkX2ZvbygpIHdvcmtzIGZvciBzdHJpbmdzLgorICBBcmVuYSBhcmVuYTsKKyAgVU5JVFRFU1Q6OlRlc3RPbmVvZjIqIG1lc3NhZ2UgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VU5JVFRFU1Q6OlRlc3RPbmVvZjI+KCZhcmVuYSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UtPmhhc19mb29fc3RyaW5nKCkpOworICBjb25zdCBzdGQ6OnN0cmluZyBrSGVsbG8oImhlbGxvIik7CisgIG1lc3NhZ2UtPnNldF9mb29fc3RyaW5nKGtIZWxsbyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UtPmhhc19mb29fc3RyaW5nKCkpOworCisgIG1lc3NhZ2UtPnNldF9hbGxvY2F0ZWRfZm9vX3N0cmluZyhudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UtPmhhc19mb29fc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoIiIsIG1lc3NhZ2UtPmZvb19zdHJpbmcoKSk7CisKKyAgbWVzc2FnZS0+c2V0X2FsbG9jYXRlZF9mb29fc3RyaW5nKG5ldyBzdGQ6OnN0cmluZyhrSGVsbG8pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS0+aGFzX2Zvb19zdHJpbmcoKSk7CisgIEVYUEVDVF9FUShrSGVsbG8sIG1lc3NhZ2UtPmZvb19zdHJpbmcoKSk7Cit9CisKKworVEVTVF9GKE9uZW9mVGVzdCwgU2V0TWVzc2FnZSkgeworICAvLyBDaGVjayB0aGF0IHNldHRpbmcgYSBtZXNzYWdlIGZpZWxkIHdvcmtzCisgIFVOSVRURVNUOjpUZXN0T25lb2YyIG1lc3NhZ2U7CisKKyAgLy8gVW5zZXQgZmllbGQgcmV0dXJucyBkZWZhdWx0IGluc3RhbmNlCisgIEVYUEVDVF9FUSgmbWVzc2FnZS5mb29fbWVzc2FnZSgpLAorICAgICAgICAgICAgJlVOSVRURVNUOjpUZXN0T25lb2YyX05lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLmZvb19tZXNzYWdlKCkubW9vX2ludCgpLCAwKTsKKworICBtZXNzYWdlLm11dGFibGVfZm9vX21lc3NhZ2UoKS0+c2V0X21vb19pbnQoMjM0KTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLmZvb19tZXNzYWdlKCkubW9vX2ludCgpLCAyMzQpOworICBtZXNzYWdlLmNsZWFyX2Zvb19tZXNzYWdlKCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKK30KKworVEVTVF9GKE9uZW9mVGVzdCwgUmVsZWFzZU1lc3NhZ2UpIHsKKyAgLy8gQ2hlY2sgdGhhdCByZWxlYXNlX2ZvbygpIHN0YXJ0cyBvdXQgbnVsbHB0ciwgYW5kIGdpdmVzIHVzIGEgdmFsdWUKKyAgLy8gdGhhdCB3ZSBjYW4gZGVsZXRlIGFmdGVyIGl0J3MgYmVlbiBzZXQuCisgIFVOSVRURVNUOjpUZXN0T25lb2YyIG1lc3NhZ2U7CisKKyAgRVhQRUNUX0VRKG51bGxwdHIsIG1lc3NhZ2UucmVsZWFzZV9mb29fbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpOworCisgIG1lc3NhZ2UubXV0YWJsZV9mb29fbWVzc2FnZSgpLT5zZXRfbW9vX2ludCgxKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX21lc3NhZ2UoKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxVTklUVEVTVDo6VGVzdE9uZW9mMl9OZXN0ZWRNZXNzYWdlPiBtZXMoCisgICAgICBtZXNzYWdlLnJlbGVhc2VfZm9vX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKKyAgQVNTRVJUX1RSVUUobWVzICE9IG51bGxwdHIpOworICBFWFBFQ1RfRVEoMSwgbWVzLT5tb29faW50KCkpOworCisgIEVYUEVDVF9FUShudWxscHRyLCBtZXNzYWdlLnJlbGVhc2VfZm9vX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKK30KKworVEVTVF9GKE9uZW9mVGVzdCwgU2V0QWxsb2NhdGVkTWVzc2FnZSkgeworICAvLyBDaGVjayB0aGF0IHNldF9hbGxvY2F0ZWRfZm9vKCkgd29ya3MgZm9yIG1lc3NhZ2VzLgorICBVTklUVEVTVDo6VGVzdE9uZW9mMiBtZXNzYWdlOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKKworICBtZXNzYWdlLm11dGFibGVfZm9vX21lc3NhZ2UoKS0+c2V0X21vb19pbnQoMSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpOworCisgIG1lc3NhZ2Uuc2V0X2FsbG9jYXRlZF9mb29fbWVzc2FnZShudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoJm1lc3NhZ2UuZm9vX21lc3NhZ2UoKSwKKyAgICAgICAgICAgICZVTklUVEVTVDo6VGVzdE9uZW9mMl9OZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCkpOworCisgIG1lc3NhZ2UubXV0YWJsZV9mb29fbWVzc2FnZSgpLT5zZXRfbW9vX2ludCgxKTsKKyAgVU5JVFRFU1Q6OlRlc3RPbmVvZjJfTmVzdGVkTWVzc2FnZSogbWVzID0gbWVzc2FnZS5yZWxlYXNlX2Zvb19tZXNzYWdlKCk7CisgIEFTU0VSVF9UUlVFKG1lcyAhPSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpOworCisgIG1lc3NhZ2Uuc2V0X2FsbG9jYXRlZF9mb29fbWVzc2FnZShtZXMpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UuZm9vX21lc3NhZ2UoKS5tb29faW50KCkpOworfQorCisKK1RFU1RfRihPbmVvZlRlc3QsIENsZWFyKSB7CisgIFVOSVRURVNUOjpUZXN0T25lb2YyIG1lc3NhZ2U7CisKKyAgbWVzc2FnZS5zZXRfZm9vX2ludCgxKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2ludCgpKTsKKyAgbWVzc2FnZS5jbGVhcl9mb29faW50KCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29faW50KCkpOworfQorCitURVNUX0YoT25lb2ZUZXN0LCBEZWZhdWx0cykgeworICBVTklUVEVTVDo6VGVzdE9uZW9mMiBtZXNzYWdlOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29faW50KCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5mb29faW50KCksIDApOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5mb29fc3RyaW5nKCksICIiKTsKKworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fYnl0ZXMoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLmZvb19ieXRlcygpLCAiIik7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19lbnVtKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5mb29fZW51bSgpLCAxKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLmZvb19tZXNzYWdlKCkubW9vX2ludCgpLCAwKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vZ3JvdXAoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLmZvb2dyb3VwKCkuYSgpLCAwKTsKKworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19iYXJfaW50KCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5iYXJfaW50KCksIDUpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19iYXJfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5iYXJfc3RyaW5nKCksICJTVFJJTkciKTsKKworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19iYXJfYnl0ZXMoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLmJhcl9ieXRlcygpLCAiQllURVMiKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfYmFyX2VudW0oKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLmJhcl9lbnVtKCksIDIpOworfQorCitURVNUX0YoT25lb2ZUZXN0LCBTd2FwV2l0aEVtcHR5KSB7CisgIFVOSVRURVNUOjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgbWVzc2FnZTEuc2V0X2Zvb19zdHJpbmcoIkZPTyIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMS5oYXNfZm9vX3N0cmluZygpKTsKKyAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZTEuaGFzX2Zvb19zdHJpbmcoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLmhhc19mb29fc3RyaW5nKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX3N0cmluZygpLCAiRk9PIik7Cit9CisKK1RFU1RfRihPbmVvZlRlc3QsIFN3YXBXaXRoU2VsZikgeworICBVTklUVEVTVDo6VGVzdE9uZW9mMiBtZXNzYWdlOworICBtZXNzYWdlLnNldF9mb29fc3RyaW5nKCJGT08iKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKyAgbWVzc2FnZS5Td2FwKCZtZXNzYWdlKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX3N0cmluZygpLCAiRk9PIik7Cit9CisKK1RFU1RfRihPbmVvZlRlc3QsIFN3YXBCb3RoSGFzRmllbGRzKSB7CisgIFVOSVRURVNUOjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICBtZXNzYWdlMS5zZXRfZm9vX3N0cmluZygiRk9PIik7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UxLmhhc19mb29fc3RyaW5nKCkpOworICBtZXNzYWdlMi5tdXRhYmxlX2Zvb19tZXNzYWdlKCktPnNldF9tb29faW50KDEpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vX21lc3NhZ2UoKSk7CisKKyAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZTEuaGFzX2Zvb19zdHJpbmcoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlMi5oYXNfZm9vX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UxLmhhc19mb29fbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UxLmZvb19tZXNzYWdlKCkubW9vX2ludCgpLCAxKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuaGFzX2Zvb19zdHJpbmcoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fc3RyaW5nKCksICJGT08iKTsKK30KKworVEVTVF9GKE9uZW9mVGVzdCwgQ29weUNvbnN0cnVjdG9yKSB7CisgIFVOSVRURVNUOjpUZXN0T25lb2YyIG1lc3NhZ2UxOworICBtZXNzYWdlMS5zZXRfZm9vX2J5dGVzKCJGT08iKTsKKworICBVTklUVEVTVDo6VGVzdE9uZW9mMiBtZXNzYWdlMihtZXNzYWdlMSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLmhhc19mb29fYnl0ZXMoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fYnl0ZXMoKSwgIkZPTyIpOworfQorCitURVNUX0YoT25lb2ZUZXN0LCBDb3B5RnJvbSkgeworICBVTklUVEVTVDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7CisgIG1lc3NhZ2UxLnNldF9mb29fZW51bShVTklUVEVTVDo6VGVzdE9uZW9mMjo6QkFSKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTEuaGFzX2Zvb19lbnVtKCkpOworCisgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UxKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuaGFzX2Zvb19lbnVtKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2VudW0oKSwgVU5JVFRFU1Q6OlRlc3RPbmVvZjI6OkJBUik7CisKKyAgLy8gQ29weWluZyBmcm9tIHNlbGYgc2hvdWxkIGJlIGEgbm8tb3AuCisgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuaGFzX2Zvb19lbnVtKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2VudW0oKSwgVU5JVFRFU1Q6OlRlc3RPbmVvZjI6OkJBUik7Cit9CisKK1RFU1RfRihPbmVvZlRlc3QsIENvcHlBc3NpZ25tZW50T3BlcmF0b3IpIHsKKyAgVU5JVFRFU1Q6OlRlc3RPbmVvZjIgbWVzc2FnZTE7CisgIG1lc3NhZ2UxLm11dGFibGVfZm9vX21lc3NhZ2UoKS0+c2V0X21vb19pbnQoMTIzKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTEuaGFzX2Zvb19tZXNzYWdlKCkpOworCisgIFVOSVRURVNUOjpUZXN0T25lb2YyIG1lc3NhZ2UyOworICBtZXNzYWdlMiA9IG1lc3NhZ2UxOworICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX21lc3NhZ2UoKS5tb29faW50KCksIDEyMyk7CisKKyAgLy8gTWFrZSBzdXJlIHRoYXQgc2VsZi1hc3NpZ25tZW50IGRvZXMgc29tZXRoaW5nIHNhbmUuCisgIG1lc3NhZ2UyID0gKiZtZXNzYWdlMjsgIC8vIEF2b2lkIC1Xc2VsZi1hc3NpZ24uCisgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fbWVzc2FnZSgpLm1vb19pbnQoKSwgMTIzKTsKK30KKworVEVTVF9GKE9uZW9mVGVzdCwgVXBjYXN0Q29weUZyb20pIHsKKyAgLy8gVGVzdCB0aGUgQ29weUZyb20gbWV0aG9kIHRoYXQgdGFrZXMgaW4gdGhlIGdlbmVyaWMgY29uc3QgTWVzc2FnZSYKKyAgLy8gcGFyYW1ldGVyLgorICBVTklUVEVTVDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7CisgIG1lc3NhZ2UxLm11dGFibGVfZm9vZ3JvdXAoKS0+c2V0X2EoMTIzKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTEuaGFzX2Zvb2dyb3VwKCkpOworCisgIGNvbnN0IE1lc3NhZ2UqIHNvdXJjZSA9IGltcGxpY2l0X2Nhc3Q8Y29uc3QgTWVzc2FnZSo+KCZtZXNzYWdlMSk7CisgIG1lc3NhZ2UyLkNvcHlGcm9tKCpzb3VyY2UpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLmhhc19mb29ncm91cCgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb2dyb3VwKCkuYSgpLCAxMjMpOworfQorCisvLyBUZXN0IHRoZSBnZW5lcmF0ZWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgpLAorLy8gVGhpcyBpbmRpcmVjdGx5IHRlc3RzIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgpCisvLyBXZSBoYXZlIHRvIHRlc3QgZWFjaCBmaWVsZCB0eXBlIHNlcGFyYXRlbHkgYmVjYXVzZSB3ZSBjYW5ub3Qgc2V0IHRoZW0gYXQgdGhlCisvLyBzYW1lIHRpbWUKK1RFU1RfRihPbmVvZlRlc3QsIFNlcmlhbGl6YXRpb25Ub0FycmF5KSB7CisgIC8vIFByaW1pdGl2ZSB0eXBlCisgIHsKKyAgICBVTklUVEVTVDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7CitzdGQ6OnN0cmluZyBkYXRhOworbWVzc2FnZTEuc2V0X2Zvb19pbnQoMTIzKTsKK2ludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemVMb25nKCk7CitkYXRhLnJlc2l6ZShzaXplKTsKK3VpbnQ4X3QqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oOjpnb29nbGU6OnByb3RvYnVmOjpzdHJpbmdfYXNfYXJyYXkoJmRhdGEpKTsKK3VpbnQ4X3QqIGVuZCA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoc3RhcnQpOworRVhQRUNUX0VRKHNpemUsIGVuZCAtIHN0YXJ0KTsKK0VYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CitFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2ludCgpLCAxMjMpOworICB9CisKKyAgLy8gU3RyaW5nCisgIHsKKyAgICBVTklUVEVTVDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7CisgICAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgICBtZXNzYWdlMS5zZXRfZm9vX3N0cmluZygiZm9vIik7CisgICAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZUxvbmcoKTsKKyAgICBkYXRhLnJlc2l6ZShzaXplKTsKKyAgICB1aW50OF90KiBzdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KDo6Z29vZ2xlOjpwcm90b2J1Zjo6c3RyaW5nX2FzX2FycmF5KCZkYXRhKSk7CisgICAgdWludDhfdCogZW5kID0gbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShzdGFydCk7CisgICAgRVhQRUNUX0VRKHNpemUsIGVuZCAtIHN0YXJ0KTsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fc3RyaW5nKCksICJmb28iKTsKKyAgfQorCisKKyAgLy8gQnl0ZXMKKyAgeworICAgIFVOSVRURVNUOjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworICAgIG1lc3NhZ2UxLnNldF9mb29fYnl0ZXMoIm1vbyIpOworICAgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemVMb25nKCk7CisgICAgZGF0YS5yZXNpemUoc2l6ZSk7CisgICAgdWludDhfdCogc3RhcnQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPig6Omdvb2dsZTo6cHJvdG9idWY6OnN0cmluZ19hc19hcnJheSgmZGF0YSkpOworICAgIHVpbnQ4X3QqIGVuZCA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoc3RhcnQpOworICAgIEVYUEVDVF9FUShzaXplLCBlbmQgLSBzdGFydCk7CisgICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2J5dGVzKCksICJtb28iKTsKKyAgfQorCisgIC8vIEVudW0KKyAgeworICAgIFVOSVRURVNUOjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworICAgIG1lc3NhZ2UxLnNldF9mb29fZW51bShVTklUVEVTVDo6VGVzdE9uZW9mMjo6Rk9PKTsKKyAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplTG9uZygpOworICAgIGRhdGEucmVzaXplKHNpemUpOworICAgIHVpbnQ4X3QqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oOjpnb29nbGU6OnByb3RvYnVmOjpzdHJpbmdfYXNfYXJyYXkoJmRhdGEpKTsKKyAgICB1aW50OF90KiBlbmQgPSBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHN0YXJ0KTsKKyAgICBFWFBFQ1RfRVEoc2l6ZSwgZW5kIC0gc3RhcnQpOworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19lbnVtKCksIFVOSVRURVNUOjpUZXN0T25lb2YyOjpGT08pOworICB9CisKKyAgLy8gTWVzc2FnZQorICB7CisgICAgVU5JVFRFU1Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOworICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisgICAgbWVzc2FnZTEubXV0YWJsZV9mb29fbWVzc2FnZSgpLT5zZXRfbW9vX2ludCgyMzQpOworICAgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemVMb25nKCk7CisgICAgZGF0YS5yZXNpemUoc2l6ZSk7CisgICAgdWludDhfdCogc3RhcnQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPig6Omdvb2dsZTo6cHJvdG9idWY6OnN0cmluZ19hc19hcnJheSgmZGF0YSkpOworICAgIHVpbnQ4X3QqIGVuZCA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoc3RhcnQpOworICAgIEVYUEVDVF9FUShzaXplLCBlbmQgLSBzdGFydCk7CisgICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX21lc3NhZ2UoKS5tb29faW50KCksIDIzNCk7CisgIH0KKworICAvLyBHcm91cAorICB7CisgICAgVU5JVFRFU1Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOworICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisgICAgbWVzc2FnZTEubXV0YWJsZV9mb29ncm91cCgpLT5zZXRfYSgzNDUpOworICAgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemVMb25nKCk7CisgICAgZGF0YS5yZXNpemUoc2l6ZSk7CisgICAgdWludDhfdCogc3RhcnQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPig6Omdvb2dsZTo6cHJvdG9idWY6OnN0cmluZ19hc19hcnJheSgmZGF0YSkpOworICAgIHVpbnQ4X3QqIGVuZCA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoc3RhcnQpOworICAgIEVYUEVDVF9FUShzaXplLCBlbmQgLSBzdGFydCk7CisgICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vZ3JvdXAoKS5hKCksIDM0NSk7CisgIH0KKworfQorCisvLyBUZXN0IHRoZSBnZW5lcmF0ZWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkgYnkgZm9yY2luZyB0aGUgYnVmZmVyIHRvIHdyaXRlCisvLyBvbmUgYnl0ZSBhdCBhIHRpbWUuCisvLyBUaGlzIGluZGlyZWN0bHkgdGVzdHMgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKCkKKy8vIFdlIGhhdmUgdG8gdGVzdCBlYWNoIGZpZWxkIHR5cGUgc2VwYXJhdGVseSBiZWNhdXNlIHdlIGNhbm5vdCBzZXQgdGhlbSBhdCB0aGUKKy8vIHNhbWUgdGltZQorVEVTVF9GKE9uZW9mVGVzdCwgU2VyaWFsaXphdGlvblRvU3RyZWFtKSB7CisgIC8vIFByaW1pdGl2ZSB0eXBlCisgIHsKKyAgICBVTklUVEVTVDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7CitzdGQ6OnN0cmluZyBkYXRhOworbWVzc2FnZTEuc2V0X2Zvb19pbnQoMTIzKTsKK2ludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemVMb25nKCk7CitkYXRhLnJlc2l6ZShzaXplKTsKKworeworICAvLyBBbGxvdyB0aGUgb3V0cHV0IHN0cmVhbSB0byBidWZmZXIgb25seSBvbmUgYnl0ZSBhdCBhIHRpbWUuCisgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oOjpnb29nbGU6OnByb3RvYnVmOjpzdHJpbmdfYXNfYXJyYXkoJmRhdGEpLCBzaXplLCAxKTsKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7CisgIG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0X3N0cmVhbSk7CisgIEVYUEVDVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7Cit9CisKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29faW50KCksIDEyMyk7CisgIH0KKworICAvLyBTdHJpbmcKKyAgeworICAgIFVOSVRURVNUOjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworICAgIG1lc3NhZ2UxLnNldF9mb29fc3RyaW5nKCJmb28iKTsKKyAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplTG9uZygpOworICAgIGRhdGEucmVzaXplKHNpemUpOworCisgICAgeworICAgICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgorICAgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbSg6Omdvb2dsZTo6cHJvdG9idWY6OnN0cmluZ19hc19hcnJheSgmZGF0YSksIHNpemUsIDEpOworICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7CisgICAgICBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOworICAgICAgRVhQRUNUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7CisgICAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7CisgICAgfQorCisgICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX3N0cmluZygpLCAiZm9vIik7CisgIH0KKworCisgIC8vIEJ5dGVzCisgIHsKKyAgICBVTklUVEVTVDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7CisgICAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgICBtZXNzYWdlMS5zZXRfZm9vX2J5dGVzKCJtb28iKTsKKyAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplTG9uZygpOworICAgIGRhdGEucmVzaXplKHNpemUpOworCisgICAgeworICAgICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgorICAgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbSg6Omdvb2dsZTo6cHJvdG9idWY6OnN0cmluZ19hc19hcnJheSgmZGF0YSksIHNpemUsIDEpOworICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7CisgICAgICBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOworICAgICAgRVhQRUNUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7CisgICAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7CisgICAgfQorCisgICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2J5dGVzKCksICJtb28iKTsKKyAgfQorCisgIC8vIEVudW0KKyAgeworICAgIFVOSVRURVNUOjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworICAgIG1lc3NhZ2UxLnNldF9mb29fZW51bShVTklUVEVTVDo6VGVzdE9uZW9mMjo6Rk9PKTsKKyAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplTG9uZygpOworICAgIGRhdGEucmVzaXplKHNpemUpOworCisgICAgeworICAgICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgorICAgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbSg6Omdvb2dsZTo6cHJvdG9idWY6OnN0cmluZ19hc19hcnJheSgmZGF0YSksIHNpemUsIDEpOworICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7CisgICAgICBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOworICAgICAgRVhQRUNUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7CisgICAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7CisgICAgfQorCisgICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2VudW0oKSwgVU5JVFRFU1Q6OlRlc3RPbmVvZjI6OkZPTyk7CisgIH0KKworICAvLyBNZXNzYWdlCisgIHsKKyAgICBVTklUVEVTVDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7CisgICAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgICBtZXNzYWdlMS5tdXRhYmxlX2Zvb19tZXNzYWdlKCktPnNldF9tb29faW50KDIzNCk7CisgICAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZUxvbmcoKTsKKyAgICBkYXRhLnJlc2l6ZShzaXplKTsKKworICAgIHsKKyAgICAgIC8vIEFsbG93IHRoZSBvdXRwdXQgc3RyZWFtIHRvIGJ1ZmZlciBvbmx5IG9uZSBieXRlIGF0IGEgdGltZS4KKyAgICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oOjpnb29nbGU6OnByb3RvYnVmOjpzdHJpbmdfYXNfYXJyYXkoJmRhdGEpLCBzaXplLCAxKTsKKyAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZhcnJheV9zdHJlYW0pOworICAgICAgbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKKyAgICAgIEVYUEVDVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICAgICAgRVhQRUNUX0VRKHNpemUsIG91dHB1dF9zdHJlYW0uQnl0ZUNvdW50KCkpOworICAgIH0KKworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19tZXNzYWdlKCkubW9vX2ludCgpLCAyMzQpOworICB9CisKKyAgLy8gR3JvdXAKKyAgeworICAgIFVOSVRURVNUOjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworICAgIG1lc3NhZ2UxLm11dGFibGVfZm9vZ3JvdXAoKS0+c2V0X2EoMzQ1KTsKKyAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplTG9uZygpOworICAgIGRhdGEucmVzaXplKHNpemUpOworCisgICAgeworICAgICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgorICAgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbSg6Omdvb2dsZTo6cHJvdG9idWY6OnN0cmluZ19hc19hcnJheSgmZGF0YSksIHNpemUsIDEpOworICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7CisgICAgICBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOworICAgICAgRVhQRUNUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7CisgICAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7CisgICAgfQorCisgICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vZ3JvdXAoKS5hKCksIDM0NSk7CisgIH0KKworfQorCitURVNUX0YoT25lb2ZUZXN0LCBNZXJnZUZyb20pIHsKKyAgVU5JVFRFU1Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOworCisgIG1lc3NhZ2UxLnNldF9mb29faW50KDEyMyk7CisgIG1lc3NhZ2UyLk1lcmdlRnJvbShtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZTIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vX2ludCgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19pbnQoKSwgMTIzKTsKKworICBtZXNzYWdlMS5zZXRfZm9vX3N0cmluZygiZm9vIik7CisgIG1lc3NhZ2UyLk1lcmdlRnJvbShtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZTIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19zdHJpbmcoKSwgImZvbyIpOworCisKKyAgbWVzc2FnZTEuc2V0X2Zvb19ieXRlcygibW9vIik7CisgIG1lc3NhZ2UyLk1lcmdlRnJvbShtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZTIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vX2J5dGVzKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2J5dGVzKCksICJtb28iKTsKKworICBtZXNzYWdlMS5zZXRfZm9vX2VudW0oVU5JVFRFU1Q6OlRlc3RPbmVvZjI6OkZPTyk7CisgIG1lc3NhZ2UyLk1lcmdlRnJvbShtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZTIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vX2VudW0oKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fZW51bSgpLCBVTklUVEVTVDo6VGVzdE9uZW9mMjo6Rk9PKTsKKworICBtZXNzYWdlMS5tdXRhYmxlX2Zvb19tZXNzYWdlKCktPnNldF9tb29faW50KDIzNCk7CisgIG1lc3NhZ2UyLk1lcmdlRnJvbShtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZTIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fbWVzc2FnZSgpLm1vb19pbnQoKSwgMjM0KTsKKworICBtZXNzYWdlMS5tdXRhYmxlX2Zvb2dyb3VwKCktPnNldF9hKDM0NSk7CisgIG1lc3NhZ2UyLk1lcmdlRnJvbShtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZTIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vZ3JvdXAoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29ncm91cCgpLmEoKSwgMzQ1KTsKKworfQorCitURVNUKEhFTFBFUlNfVEVTVF9OQU1FLCBUZXN0U0NDKSB7CisgIFVOSVRURVNUOjpUZXN0TXV0dWFsUmVjdXJzaW9uQSBhOworICBNZXNzYWdlU0NDQW5hbHl6ZXIgc2NjX2FuYWx5emVyKChPcHRpb25zKCkpKTsKKyAgY29uc3QgU0NDKiBzY2MgPSBzY2NfYW5hbHl6ZXIuR2V0U0NDKGEuR2V0RGVzY3JpcHRvcigpKTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5hbWVzOworICBuYW1lcy5yZXNlcnZlKHNjYy0+ZGVzY3JpcHRvcnMuc2l6ZSgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2MtPmRlc2NyaXB0b3JzLnNpemUoKTsgaSsrKSB7CisgICAgbmFtZXMucHVzaF9iYWNrKHNjYy0+ZGVzY3JpcHRvcnNbaV0tPmZ1bGxfbmFtZSgpKTsKKyAgfQorICBzdGQ6OnN0cmluZyBwYWNrYWdlID0gYS5HZXREZXNjcmlwdG9yKCktPmZpbGUoKS0+cGFja2FnZSgpOworICBBU1NFUlRfRVEobmFtZXMuc2l6ZSgpLCA0KTsKKyAgc3RkOjpzb3J0KG5hbWVzLmJlZ2luKCksIG5hbWVzLmVuZCgpKTsKKyAgRVhQRUNUX0VRKG5hbWVzWzBdLCBwYWNrYWdlICsgIi5UZXN0TXV0dWFsUmVjdXJzaW9uQSIpOworICBFWFBFQ1RfRVEobmFtZXNbMV0sIHBhY2thZ2UgKyAiLlRlc3RNdXR1YWxSZWN1cnNpb25BLlN1Ykdyb3VwIik7CisgIEVYUEVDVF9FUShuYW1lc1syXSwgcGFja2FnZSArICIuVGVzdE11dHVhbFJlY3Vyc2lvbkEuU3ViTWVzc2FnZSIpOworICBFWFBFQ1RfRVEobmFtZXNbM10sIHBhY2thZ2UgKyAiLlRlc3RNdXR1YWxSZWN1cnNpb25CIik7CisKKyAgTWVzc2FnZUFuYWx5c2lzIHJlc3VsdCA9IHNjY19hbmFseXplci5HZXRTQ0NBbmFseXNpcyhzY2MpOworICBFWFBFQ1RfRVEocmVzdWx0LmlzX3JlY3Vyc2l2ZSwgdHJ1ZSk7CisgIEVYUEVDVF9FUShyZXN1bHQuY29udGFpbnNfcmVxdWlyZWQsIGZhbHNlKTsKKyAgRVhQRUNUX0VRKHJlc3VsdC5jb250YWluc19jb3JkLCB0cnVlKTsgIC8vIFRlc3RBbGxUeXBlcworICBFWFBFQ1RfRVEocmVzdWx0LmNvbnRhaW5zX2V4dGVuc2lvbiwgZmFsc2UpOyAgLy8gVGVzdEFsbFR5cGVzCit9CisKK1RFU1QoSEVMUEVSU19URVNUX05BTUUsIFRlc3RTQ0NBbmFseXNpcykgeworICB7CisgICAgVU5JVFRFU1Q6OlRlc3RSZWN1cnNpdmVNZXNzYWdlIG1zZzsKKyAgICBNZXNzYWdlU0NDQW5hbHl6ZXIgc2NjX2FuYWx5emVyKChPcHRpb25zKCkpKTsKKyAgICBjb25zdCBTQ0MqIHNjYyA9IHNjY19hbmFseXplci5HZXRTQ0MobXNnLkdldERlc2NyaXB0b3IoKSk7CisgICAgTWVzc2FnZUFuYWx5c2lzIHJlc3VsdCA9IHNjY19hbmFseXplci5HZXRTQ0NBbmFseXNpcyhzY2MpOworICAgIEVYUEVDVF9FUShyZXN1bHQuaXNfcmVjdXJzaXZlLCB0cnVlKTsKKyAgICBFWFBFQ1RfRVEocmVzdWx0LmNvbnRhaW5zX3JlcXVpcmVkLCBmYWxzZSk7CisgICAgRVhQRUNUX0VRKHJlc3VsdC5jb250YWluc19jb3JkLCBmYWxzZSk7CisgICAgRVhQRUNUX0VRKHJlc3VsdC5jb250YWluc19leHRlbnNpb24sIGZhbHNlKTsKKyAgfQorICB7CisgICAgVU5JVFRFU1Q6OlRlc3RBbGxFeHRlbnNpb25zIG1zZzsKKyAgICBNZXNzYWdlU0NDQW5hbHl6ZXIgc2NjX2FuYWx5emVyKChPcHRpb25zKCkpKTsKKyAgICBjb25zdCBTQ0MqIHNjYyA9IHNjY19hbmFseXplci5HZXRTQ0MobXNnLkdldERlc2NyaXB0b3IoKSk7CisgICAgTWVzc2FnZUFuYWx5c2lzIHJlc3VsdCA9IHNjY19hbmFseXplci5HZXRTQ0NBbmFseXNpcyhzY2MpOworICAgIEVYUEVDVF9FUShyZXN1bHQuaXNfcmVjdXJzaXZlLCBmYWxzZSk7CisgICAgRVhQRUNUX0VRKHJlc3VsdC5jb250YWluc19yZXF1aXJlZCwgZmFsc2UpOworICAgIEVYUEVDVF9FUShyZXN1bHQuY29udGFpbnNfY29yZCwgZmFsc2UpOworICAgIEVYUEVDVF9FUShyZXN1bHQuY29udGFpbnNfZXh0ZW5zaW9uLCB0cnVlKTsKKyAgfQorICB7CisgICAgVU5JVFRFU1Q6OlRlc3RSZXF1aXJlZCBtc2c7CisgICAgTWVzc2FnZVNDQ0FuYWx5emVyIHNjY19hbmFseXplcigoT3B0aW9ucygpKSk7CisgICAgY29uc3QgU0NDKiBzY2MgPSBzY2NfYW5hbHl6ZXIuR2V0U0NDKG1zZy5HZXREZXNjcmlwdG9yKCkpOworICAgIE1lc3NhZ2VBbmFseXNpcyByZXN1bHQgPSBzY2NfYW5hbHl6ZXIuR2V0U0NDQW5hbHlzaXMoc2NjKTsKKyAgICBFWFBFQ1RfRVEocmVzdWx0LmlzX3JlY3Vyc2l2ZSwgZmFsc2UpOworICAgIEVYUEVDVF9FUShyZXN1bHQuY29udGFpbnNfcmVxdWlyZWQsIHRydWUpOworICAgIEVYUEVDVF9FUShyZXN1bHQuY29udGFpbnNfY29yZCwgZmFsc2UpOworICAgIEVYUEVDVF9FUShyZXN1bHQuY29udGFpbnNfZXh0ZW5zaW9uLCBmYWxzZSk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcF91bml0dGVzdAorfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCisKK25hbWVzcGFjZSBub19nZW5lcmljX3NlcnZpY2VzX3Rlc3QgeworICAvLyBWZXJpZnkgdGhhdCBubyBjbGFzcyBjYWxsZWQgIlRlc3RTZXJ2aWNlIiB3YXMgZGVmaW5lZCBpbgorICAvLyB1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmggYnkgZGVmaW5pbmcgYSBkaWZmZXJlbnQgdHlwZSBieSB0aGUgc2FtZQorICAvLyBuYW1lLiAgSWYgc3VjaCBhIHNlcnZpY2Ugd2FzIGdlbmVyYXRlZCwgdGhpcyB3aWxsIG5vdCBjb21waWxlLgorICBzdHJ1Y3QgVGVzdFNlcnZpY2UgeworICAgIGludCBpOworICB9OworfQorCituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CituYW1lc3BhY2UgY3BwX3VuaXR0ZXN0IHsKKworVEVTVF9GKEdFTkVSQVRFRF9TRVJWSUNFX1RFU1RfTkFNRSwgTm9HZW5lcmljU2VydmljZXMpIHsKKyAgLy8gVmVyaWZ5IHRoYXQgbm9uLXNlcnZpY2VzIGluIHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8gd2VyZQorICAvLyBnZW5lcmF0ZWQuCisgIDo6cHJvdG9idWZfdW5pdHRlc3Q6Om5vX2dlbmVyaWNfc2VydmljZXNfdGVzdDo6VGVzdE1lc3NhZ2UgbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRfYSgxKTsKKyAgbWVzc2FnZS5TZXRFeHRlbnNpb24oCisgICAgICA6OnByb3RvYnVmX3VuaXR0ZXN0Ojpub19nZW5lcmljX3NlcnZpY2VzX3Rlc3Q6OnRlc3RfZXh0ZW5zaW9uLCAxMjMpOworICA6OnByb3RvYnVmX3VuaXR0ZXN0Ojpub19nZW5lcmljX3NlcnZpY2VzX3Rlc3Q6OlRlc3RFbnVtIGUgPQorICAgICAgOjpwcm90b2J1Zl91bml0dGVzdDo6bm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0OjpGT087CisgIEVYUEVDVF9FUShlLCAxKTsKKworICAvLyBWZXJpZnkgdGhhdCBhIFNlcnZpY2VEZXNjcmlwdG9yIGlzIGdlbmVyYXRlZCBmb3IgdGhlIHNlcnZpY2UgZXZlbiBpZiB0aGUKKyAgLy8gY2xhc3MgaXRzZWxmIGlzIG5vdC4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1bml0dGVzdDo6bm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0OjpUZXN0TWVzc2FnZTo6ZGVzY3JpcHRvcigpCisgICAgICAgICAgLT5maWxlKCk7CisKKyAgQVNTRVJUX0VRKDEsIGZpbGUtPnNlcnZpY2VfY291bnQoKSk7CisgIEVYUEVDVF9FUSgiVGVzdFNlcnZpY2UiLCBmaWxlLT5zZXJ2aWNlKDApLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgZmlsZS0+c2VydmljZSgwKS0+bWV0aG9kX2NvdW50KCkpOworICBFWFBFQ1RfRVEoIkZvbyIsIGZpbGUtPnNlcnZpY2UoMCktPm1ldGhvZCgwKS0+bmFtZSgpKTsKK30KKworI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFRoaXMgdGVzdCBtdXN0IHJ1biBsYXN0LiAgSXQgdmVyaWZpZXMgdGhhdCBkZXNjcmlwdG9ycyB3ZXJlIG9yIHdlcmUgbm90CisvLyBpbml0aWFsaXplZCBkZXBlbmRpbmcgb24gd2hldGhlciBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTIHdhcyBkZWZpbmVkLgorLy8gV2hlbiB0aGlzIGlzIGRlZmluZWQsIHdlIHNraXAgYWxsIHRlc3RzIHdoaWNoIGFyZSBleHBlY3RlZCB0byB0cmlnZ2VyCisvLyBkZXNjcmlwdG9yIGluaXRpYWxpemF0aW9uLiAgVGhpcyB2ZXJpZmllcyB0aGF0IGV2ZXJ5dGhpbmcgZWxzZSBzdGlsbCB3b3JrcworLy8gaWYgZGVzY3JpcHRvcnMgYXJlIG5vdCBpbml0aWFsaXplZC4KK1RFU1QoREVTQ1JJUFRPUl9JTklUX1RFU1RfTkFNRSwgSW5pdGlhbGl6ZWQpIHsKKyNpZmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisgIGJvb2wgc2hvdWxkX2hhdmVfZGVzY3JpcHRvcnMgPSBmYWxzZTsKKyNlbHNlCisgIGJvb2wgc2hvdWxkX2hhdmVfZGVzY3JpcHRvcnMgPSB0cnVlOworI2VuZGlmCisKKyAgRVhQRUNUX0VRKHNob3VsZF9oYXZlX2Rlc2NyaXB0b3JzLAorICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCktPkludGVybmFsSXNGaWxlTG9hZGVkKAorICAgICAgICAgICAgICAgIFRlc3RVdGlsOjpNYXliZVRyYW5zbGF0ZVBhdGgoVU5JVFRFU1RfUFJPVE9fUEFUSCkpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcF91bml0dGVzdAorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2Jvb3RzdHJhcF91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9ib290c3RyYXBfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRhYWNjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9ib290c3RyYXBfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxOTUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIHRlc3QgaW5zdXJlcyB0aGF0CisvLyBjc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0Rlc2NyaXB0b3IuY3MgIG1hdGNoIGV4YWN0bHkKKy8vIHdoYXQgd291bGQgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBjb21waWxlci4gIFRoZSBmaWxlIGlzIG5vdAorLy8gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYXQgYnVpbGQgdGltZS4KKy8vCisvLyBJZiB0aGlzIHRlc3QgZmFpbHMsIHJ1biB0aGUgc2NyaXB0CisvLyAiZ2VuZXJhdGVfZGVzY3JpcHRvcl9wcm90by5zaCIgYW5kIGFkZCB0aGUgY2hhbmdlZCBmaWxlcyB1bmRlcgorLy8gY3NoYXJwL3NyYy8gdG8geW91ciBjaGFuZ2VsaXN0LgorCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjc2hhcnAgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb2NrRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgTW9ja0Vycm9yQ29sbGVjdG9yKCkge30KKyAgfk1vY2tFcnJvckNvbGxlY3RvcigpIHt9CisKKyAgc3RkOjpzdHJpbmcgdGV4dF87CisKKyAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBBZGRFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmdGV4dF8sICIkMDokMTokMjogJDNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZSwgY29sdW1uLCBtZXNzYWdlKTsKKyAgfQorfTsKKworY2xhc3MgTW9ja0dlbmVyYXRvckNvbnRleHQgOiBwdWJsaWMgR2VuZXJhdG9yQ29udGV4dCB7CisgcHVibGljOgorICB2b2lkIEV4cGVjdEZpbGVNYXRjaGVzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2aXJ0dWFsX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbF9maWxlbmFtZSkgeworICAgIGF1dG8gaXQgPSBmaWxlc18uZmluZCh2aXJ0dWFsX2ZpbGVuYW1lKTsKKyAgICBBU1NFUlRfVFJVRShpdCAhPSBmaWxlc18uZW5kKCkpCisgICAgICA8PCAiR2VuZXJhdG9yIGZhaWxlZCB0byBnZW5lcmF0ZSBmaWxlOiAiIDw8IHZpcnR1YWxfZmlsZW5hbWU7CisgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfY29udGVudHMgPSAqaXQtPnNlY29uZDsKKworICAgIHN0ZDo6c3RyaW5nIGFjdHVhbF9jb250ZW50czsKKyAgICBHT09HTEVfQ0hFQ0tfT0soCisgICAgICAgIEZpbGU6OkdldENvbnRlbnRzQXNUZXh0KFRlc3RTb3VyY2VEaXIoKSArICIvIiArIHBoeXNpY2FsX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0dWFsX2NvbnRlbnRzLCB0cnVlKSkKKyAgICAgICAgPDwgIlVuYWJsZSB0byBnZXQgIiA8PCBwaHlzaWNhbF9maWxlbmFtZTsKKyAgICBFWFBFQ1RfVFJVRShhY3R1YWxfY29udGVudHMgPT0gZXhwZWN0ZWRfY29udGVudHMpCisgICAgICA8PCBwaHlzaWNhbF9maWxlbmFtZSA8PCAiIG5lZWRzIHRvIGJlIHJlZ2VuZXJhdGVkLiAgUGxlYXNlIHJ1biAiCisgICAgICAgICAiZ2VuZXJhdGVfZGVzY3JpcHRvcl9wcm90by5zaC4gVGhlbiBhZGQgdGhpcyBmaWxlICIKKyAgICAgICAgICJ0byB5b3VyIENMLiI7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIEdlbmVyYXRvckNvbnRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB2aXJ0dWFsIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3Blbihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKKyAgICBhdXRvJiBtYXBfc2xvdCA9IGZpbGVzX1tmaWxlbmFtZV07CisgICAgbWFwX3Nsb3QucmVzZXQobmV3IHN0ZDo6c3RyaW5nKTsKKyAgICByZXR1cm4gbmV3IGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0obWFwX3Nsb3QuZ2V0KCkpOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPj4gZmlsZXNfOworfTsKKworY2xhc3MgR2VuZXJhdGVBbmRUZXN0IHsKKyBwdWJsaWM6CisgIEdlbmVyYXRlQW5kVGVzdCgpIHt9CisgIHZvaWQgUnVuKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBwcm90b19maWxlLCBzdGQ6OnN0cmluZyBmaWxlMSwKKyAgICAgICAgICAgc3RkOjpzdHJpbmcgZmlsZTIpIHsKKyAgICBBU1NFUlRfVFJVRShwcm90b19maWxlICE9IE5VTEwpIDw8IFRlc3RTb3VyY2VEaXIoKTsKKyAgICBBU1NFUlRfVFJVRShnZW5lcmF0b3JfLkdlbmVyYXRlKHByb3RvX2ZpbGUsIHBhcmFtZXRlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dF8sICZlcnJvcl8pKTsKKyAgICBjb250ZXh0Xy5FeHBlY3RGaWxlTWF0Y2hlcyhmaWxlMSwgZmlsZTIpOworICB9CisgIHZvaWQgU2V0UGFyYW1ldGVyKHN0ZDo6c3RyaW5nIHBhcmFtZXRlcikgeworICAgIHBhcmFtZXRlcl8gPSBwYXJhbWV0ZXI7CisgIH0KKworIHByaXZhdGU6CisgIEdlbmVyYXRvciBnZW5lcmF0b3JfOworICBNb2NrR2VuZXJhdG9yQ29udGV4dCBjb250ZXh0XzsKKyAgc3RkOjpzdHJpbmcgZXJyb3JfOworICBzdGQ6OnN0cmluZyBwYXJhbWV0ZXJfOworfTsKKworVEVTVChDc2hhcnBCb290c3RyYXBUZXN0LCBHZW5lcmF0ZWRDc2hhcnBEZXNjcmlwdG9yTWF0Y2hlcykgeworICAvLyBTa2lwIHRoaXMgd2hvbGUgdGVzdCBpZiB0aGUgY3NoYXJwIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IChpLmUuLCBhIEMrKzExCisgIC8vIG9ubHkgZGlzdHJpYnV0aW9uKS4KKyAgc3RkOjpzdHJpbmcgZGVzY3JpcHRvcl9maWxlX25hbWUgPQorICAgICAgIi4uL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vRGVzY3JpcHRvci5jcyI7CisgIGlmICghRmlsZTo6RXhpc3RzKFRlc3RTb3VyY2VEaXIoKSArICIvIiArIGRlc2NyaXB0b3JfZmlsZV9uYW1lKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIERpc2tTb3VyY2VUcmVlIHNvdXJjZV90cmVlOworICBJbXBvcnRlciBpbXBvcnRlcigmc291cmNlX3RyZWUsICZlcnJvcl9jb2xsZWN0b3IpOworICBHZW5lcmF0ZUFuZFRlc3QgZ2VuZXJhdGVfdGVzdDsKKworICBnZW5lcmF0ZV90ZXN0LlNldFBhcmFtZXRlcigiYmFzZV9uYW1lc3BhY2U9R29vZ2xlLlByb3RvYnVmIik7CisgIHNvdXJjZV90cmVlLk1hcFBhdGgoIiIsIFRlc3RTb3VyY2VEaXIoKSk7CisgIGdlbmVyYXRlX3Rlc3QuUnVuKGltcG9ydGVyLkltcG9ydCgiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iKSwKKyAgICAgICAgICAgICAgICAgICAgIlJlZmxlY3Rpb24vRGVzY3JpcHRvci5jcyIsCisgICAgICAgICAgICAgICAgICAgICIuLi9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0Rlc2NyaXB0b3IuY3MiKTsKKyAgZ2VuZXJhdGVfdGVzdC5SdW4oaW1wb3J0ZXIuSW1wb3J0KCJnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIiksCisgICAgICAgICAgICAgICAgICAgICJXZWxsS25vd25UeXBlcy9BbnkuY3MiLAorICAgICAgICAgICAgICAgICAgICAiLi4vY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvQW55LmNzIik7CisgIGdlbmVyYXRlX3Rlc3QuUnVuKGltcG9ydGVyLkltcG9ydCgiZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90byIpLAorICAgICAgICAgICAgICAgICAgICAiV2VsbEtub3duVHlwZXMvQXBpLmNzIiwKKyAgICAgICAgICAgICAgICAgICAgIi4uL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL0FwaS5jcyIpOworICBnZW5lcmF0ZV90ZXN0LlJ1bihpbXBvcnRlci5JbXBvcnQoImdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90byIpLAorICAgICAgICAgICAgICAgICAgICAiV2VsbEtub3duVHlwZXMvRHVyYXRpb24uY3MiLAorICAgICAgICAgICAgICAgICAgICAiLi4vY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvRHVyYXRpb24uY3MiKTsKKyAgZ2VuZXJhdGVfdGVzdC5SdW4oaW1wb3J0ZXIuSW1wb3J0KCJnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8iKSwKKyAgICAgICAgICAgICAgICAgICAgIldlbGxLbm93blR5cGVzL0VtcHR5LmNzIiwKKyAgICAgICAgICAgICAgICAgICAgIi4uL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL0VtcHR5LmNzIik7CisgIGdlbmVyYXRlX3Rlc3QuUnVuKGltcG9ydGVyLkltcG9ydCgiZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8iKSwKKyAgICAgICAgICAgICAgICAgICAgIldlbGxLbm93blR5cGVzL0ZpZWxkTWFzay5jcyIsCisgICAgICAgICAgICAgICAgICAgICIuLi9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9GaWVsZE1hc2suY3MiKTsKKyAgZ2VuZXJhdGVfdGVzdC5SdW4oaW1wb3J0ZXIuSW1wb3J0KCJnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucHJvdG8iKSwKKyAgICAgICAgICAgICAgICAgICAgIldlbGxLbm93blR5cGVzL1NvdXJjZUNvbnRleHQuY3MiLAorICAgICAgICAgICAgICAgICAgICAiLi4vY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvU291cmNlQ29udGV4dC5jcyIpOworICBnZW5lcmF0ZV90ZXN0LlJ1bihpbXBvcnRlci5JbXBvcnQoImdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8iKSwKKyAgICAgICAgICAgICAgICAgICAgIldlbGxLbm93blR5cGVzL1N0cnVjdC5jcyIsCisgICAgICAgICAgICAgICAgICAgICIuLi9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9TdHJ1Y3QuY3MiKTsKKyAgZ2VuZXJhdGVfdGVzdC5SdW4oaW1wb3J0ZXIuSW1wb3J0KCJnb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvIiksCisgICAgICAgICAgICAgICAgICAgICJXZWxsS25vd25UeXBlcy9UaW1lc3RhbXAuY3MiLAorICAgICAgICAgICAgICAgICAgICAiLi4vY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvVGltZXN0YW1wLmNzIik7CisgIGdlbmVyYXRlX3Rlc3QuUnVuKGltcG9ydGVyLkltcG9ydCgiZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8iKSwKKyAgICAgICAgICAgICAgICAgICAgIldlbGxLbm93blR5cGVzL1R5cGUuY3MiLAorICAgICAgICAgICAgICAgICAgICAiLi4vY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvVHlwZS5jcyIpOworICBnZW5lcmF0ZV90ZXN0LlJ1bihpbXBvcnRlci5JbXBvcnQoImdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90byIpLAorICAgICAgICAgICAgICAgICAgICAiV2VsbEtub3duVHlwZXMvV3JhcHBlcnMuY3MiLAorICAgICAgICAgICAgICAgICAgICAiLi4vY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvV3JhcHBlcnMuY3MiKTsKKworICBnZW5lcmF0ZV90ZXN0LlNldFBhcmFtZXRlcigiIik7CisgIHNvdXJjZV90cmVlLk1hcFBhdGgoIiIsIFRlc3RTb3VyY2VEaXIoKSArICIvLi4vY29uZm9ybWFuY2UiKTsKKyAgZ2VuZXJhdGVfdGVzdC5SdW4oaW1wb3J0ZXIuSW1wb3J0KCJjb25mb3JtYW5jZS5wcm90byIpLAorICAgICAgICAgICAgICAgICAgICAiQ29uZm9ybWFuY2UuY3MiLAorICAgICAgICAgICAgICAgICAgICAiLi4vY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuQ29uZm9ybWFuY2UvQ29uZm9ybWFuY2UuY3MiKTsKKworICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit9ICAvLyBuYW1lc3BhY2UgY3NoYXJwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNWQ2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZG9jX2NvbW1lbnQuY2MKQEAgLTAsMCArMSwxMTYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9kb2NfY29tbWVudC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNzaGFycCB7CisKKy8vIEZ1bmN0aW9ucyB0byBjcmVhdGUgQyMgWE1MIGRvY3VtZW50YXRpb24gY29tbWVudHMuCisvLyBDdXJyZW50bHkgdGhpcyBvbmx5IGluY2x1ZGVzIGRvY3VtZW50YXRpb24gY29tbWVudHMgY29udGFpbmluZyB0ZXh0IHNwZWNpZmllZCBhcyBjb21tZW50cworLy8gaW4gdGhlIC5wcm90byBmaWxlOyBkb2N1bWVudGF0aW9uIGNvbW1lbnRzIGdlbmVyYXRlZCBqdXN0IGZyb20gZmllbGQvbWVzc2FnZS9lbnVtL3Byb3RvIG5hbWVzCisvLyBpcyBpbmxpbmVkIGluIHRoZSByZWxldmFudCBjb2RlLiBJZiBtb3JlIGNvbnRyb2wgaXMgcmVxdWlyZWQsIHRoYXQgY29kZSBjYW4gYmUgbW92ZWQgaGVyZS4KKwordm9pZCBXcml0ZURvY0NvbW1lbnRCb2R5SW1wbChpbzo6UHJpbnRlciogcHJpbnRlciwgU291cmNlTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICBzdGQ6OnN0cmluZyBjb21tZW50cyA9IGxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMuZW1wdHkoKSA/CisgICAgICAgIGxvY2F0aW9uLnRyYWlsaW5nX2NvbW1lbnRzIDogbG9jYXRpb24ubGVhZGluZ19jb21tZW50czsKKyAgICBpZiAoY29tbWVudHMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFhNTCBlc2NhcGluZy4uLiBubyBuZWVkIGZvciBhcG9zdHJvcGhlcyBldGMgYXMgdGhlIHdob2xlIHRleHQgaXMgZ29pbmcgdG8gYmUgYSBjaGlsZAorICAgIC8vIG5vZGUgb2YgYSBzdW1tYXJ5IGVsZW1lbnQsIG5vdCBwYXJ0IG9mIGFuIGF0dHJpYnV0ZS4KKyAgICBjb21tZW50cyA9IFN0cmluZ1JlcGxhY2UoY29tbWVudHMsICImIiwgIiZhbXA7IiwgdHJ1ZSk7CisgICAgY29tbWVudHMgPSBTdHJpbmdSZXBsYWNlKGNvbW1lbnRzLCAiPCIsICImbHQ7IiwgdHJ1ZSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzOworICAgIGxpbmVzID0gU3BsaXQoY29tbWVudHMsICJcbiIsIGZhbHNlKTsKKyAgICAvLyBUT0RPOiBXZSByZWFsbHkgc2hvdWxkIHdvcmsgb3V0IHdoaWNoIHBhcnQgdG8gcHV0IGluIHRoZSBzdW1tYXJ5IGFuZCB3aGljaCB0byBwdXQgaW4gdGhlIHJlbWFya3MuLi4KKyAgICAvLyBidXQgdGhhdCBuZWVkcyB0byBiZSBwYXJ0IG9mIGEgYmlnZ2VyIGVmZm9ydCB0byB1bmRlcnN0YW5kIHRoZSBtYXJrZG93biBiZXR0ZXIgYW55d2F5LgorICAgIHByaW50ZXItPlByaW50KCIvLy8gPHN1bW1hcnk+XG4iKTsKKyAgICBib29sIGxhc3Rfd2FzX2VtcHR5ID0gZmFsc2U7CisgICAgLy8gV2Ugc3F1YXNoIG11bHRpcGxlIGJsYW5rIGxpbmVzIGRvd24gdG8gb25lLCBhbmQgcmVtb3ZlIGFueSB0cmFpbGluZyBibGFuayBsaW5lcy4gV2UgbmVlZAorICAgIC8vIHRvIHByZXNlcnZlIHRoZSBibGFuayBsaW5lcyB0aGVtc2VsdmVzLCBhcyB0aGlzIGlzIHJlbGV2YW50IGluIHRoZSBtYXJrZG93bi4KKyAgICAvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgcmVtb3ZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhcyAqdGhhdCdzKiByZWxldmFudCBpbiBtYXJrZG93biB0b28uCisgICAgLy8gKFdlIGRvbid0IHNraXAgImp1c3Qgd2hpdGVzcGFjZSIgbGluZXMsIGVpdGhlci4pCisgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ID0gbGluZXMuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGxpbmVzLmVuZCgpOyArK2l0KSB7CisgICAgICBzdGQ6OnN0cmluZyBsaW5lID0gKml0OworICAgICAgaWYgKGxpbmUuZW1wdHkoKSkgeworICAgICAgICBsYXN0X3dhc19lbXB0eSA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobGFzdF93YXNfZW1wdHkpIHsKKyAgICAgICAgICBwcmludGVyLT5QcmludCgiLy8vXG4iKTsKKyAgICAgICAgfQorICAgICAgICBsYXN0X3dhc19lbXB0eSA9IGZhbHNlOworICAgICAgICBwcmludGVyLT5QcmludCgiLy8vJGxpbmUkXG4iLCAibGluZSIsICppdCk7CisgICAgICB9CisgICAgfQorICAgIHByaW50ZXItPlByaW50KCIvLy8gPC9zdW1tYXJ5PlxuIik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXNjcmlwdG9yVHlwZT4KK3N0YXRpYyB2b2lkIFdyaXRlRG9jQ29tbWVudEJvZHkoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IERlc2NyaXB0b3JUeXBlKiBkZXNjcmlwdG9yKSB7CisgICAgU291cmNlTG9jYXRpb24gbG9jYXRpb247CisgICAgaWYgKGRlc2NyaXB0b3ItPkdldFNvdXJjZUxvY2F0aW9uKCZsb2NhdGlvbikpIHsKKyAgICAgICAgV3JpdGVEb2NDb21tZW50Qm9keUltcGwocHJpbnRlciwgbG9jYXRpb24pOworICAgIH0KK30KKwordm9pZCBXcml0ZU1lc3NhZ2VEb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlKSB7CisgICAgV3JpdGVEb2NDb21tZW50Qm9keShwcmludGVyLCBtZXNzYWdlKTsKK30KKwordm9pZCBXcml0ZVByb3BlcnR5RG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAgIFdyaXRlRG9jQ29tbWVudEJvZHkocHJpbnRlciwgZmllbGQpOworfQorCit2b2lkIFdyaXRlRW51bURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtRGVzY3JpcHRvcikgeworICAgIFdyaXRlRG9jQ29tbWVudEJvZHkocHJpbnRlciwgZW51bURlc2NyaXB0b3IpOworfQordm9pZCBXcml0ZUVudW1WYWx1ZURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKSB7CisgICAgV3JpdGVEb2NDb21tZW50Qm9keShwcmludGVyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgV3JpdGVNZXRob2REb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpIHsKKyAgICBXcml0ZURvY0NvbW1lbnRCb2R5KHByaW50ZXIsIG1ldGhvZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjc2hhcnAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZG9jX2NvbW1lbnQuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9kb2NfY29tbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZWIwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZG9jX2NvbW1lbnQuaApAQCAtMCwwICsxLDUxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfRE9DX0NPTU1FTlRfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfRE9DX0NPTU1FTlRfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3NoYXJwIHsKKyAgICB2b2lkIFdyaXRlTWVzc2FnZURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UpOworICAgIHZvaWQgV3JpdGVQcm9wZXJ0eURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworICAgIHZvaWQgV3JpdGVFbnVtRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1EZXNjcmlwdG9yKTsKKyAgICB2b2lkIFdyaXRlRW51bVZhbHVlRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpOworICAgIHZvaWQgV3JpdGVNZXRob2REb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpOworfSAgLy8gbmFtZXNwYWNlIGNzaGFycAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9ET0NfQ09NTUVOVF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2NzljYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtLmNjCkBAIC0wLDAgKzEsOTkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZW51bS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9vcHRpb25zLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3NoYXJwIHsKKworRW51bUdlbmVyYXRvcjo6RW51bUdlbmVyYXRvcihjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgT3B0aW9ucyogb3B0aW9ucykgOgorICAgIFNvdXJjZUdlbmVyYXRvckJhc2Uob3B0aW9ucyksCisgICAgZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworfQorCitFbnVtR2VuZXJhdG9yOjp+RW51bUdlbmVyYXRvcigpIHsKK30KKwordm9pZCBFbnVtR2VuZXJhdG9yOjpHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBXcml0ZUVudW1Eb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoIiRhY2Nlc3NfbGV2ZWwkIGVudW0gJG5hbWUkIHtcbiIsCisgICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiLCBjbGFzc19hY2Nlc3NfbGV2ZWwoKSwKKyAgICAgICAgICAgICAgICAgIm5hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB1c2VkX25hbWVzOworICBzdGQ6OnNldDxpbnQ+IHVzZWRfbnVtYmVyOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIFdyaXRlRW51bVZhbHVlRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXy0+dmFsdWUoaSkpOworICAgICAgc3RkOjpzdHJpbmcgb3JpZ2luYWxfbmFtZSA9IGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bmFtZSgpOworICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9CisgICAgICAgICAgR2V0RW51bVZhbHVlTmFtZShkZXNjcmlwdG9yXy0+bmFtZSgpLCBkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm5hbWUoKSk7CisgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGFueSBkdXBsaWNhdGUgbmFtZXMgZHVlIHRvIHByZWZpeCByZW1vdmFsLgorICAgICAgd2hpbGUgKCF1c2VkX25hbWVzLmluc2VydChuYW1lKS5zZWNvbmQpIHsKKyAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB3ZSdsbCBlbmQgdXAgZ2l2aW5nIHRoaXMgd2FybmluZyBtdWx0aXBsZSB0aW1lcywgYnV0IHRoYXQncyBiZXR0ZXIgdGhhbiBub3QgYXQgYWxsLgorICAgICAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJEdXBsaWNhdGUgZW51bSB2YWx1ZSAiIDw8IG5hbWUgPDwgIiAob3JpZ2luYWxseSAiIDw8IG9yaWdpbmFsX25hbWUKKyAgICAgICAgICA8PCAiKSBpbiAiIDw8IGRlc2NyaXB0b3JfLT5uYW1lKCkgPDwgIjsgYWRkaW5nIHVuZGVyc2NvcmUgdG8gZGlzdGluZ3Vpc2giOworICAgICAgICBuYW1lICs9ICJfIjsKKyAgICAgIH0KKyAgICAgIGludCBudW1iZXIgPSBkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm51bWJlcigpOworICAgICAgaWYgKCF1c2VkX251bWJlci5pbnNlcnQobnVtYmVyKS5zZWNvbmQpIHsKKyAgICAgICAgICBwcmludGVyLT5QcmludCgiW3Bicjo6T3JpZ2luYWxOYW1lKFwiJG9yaWdpbmFsX25hbWUkXCIsIFByZWZlcnJlZEFsaWFzID0gZmFsc2UpXSAkbmFtZSQgPSAkbnVtYmVyJCxcbiIsCisgICAgICAgICAgICAgIm9yaWdpbmFsX25hbWUiLCBvcmlnaW5hbF9uYW1lLAorICAgICAgICAgICAgICJuYW1lIiwgbmFtZSwKKyAgICAgICAgICAgICAibnVtYmVyIiwgU3RyQ2F0KG51bWJlcikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmludGVyLT5QcmludCgiW3Bicjo6T3JpZ2luYWxOYW1lKFwiJG9yaWdpbmFsX25hbWUkXCIpXSAkbmFtZSQgPSAkbnVtYmVyJCxcbiIsCisgICAgICAgICAgICAgIm9yaWdpbmFsX25hbWUiLCBvcmlnaW5hbF9uYW1lLAorICAgICAgICAgICAgICJuYW1lIiwgbmFtZSwKKyAgICAgICAgICAgICAibnVtYmVyIiwgU3RyQ2F0KG51bWJlcikpOworICAgICAgfQorICB9CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICBwcmludGVyLT5QcmludCgiXG4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNzaGFycAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZW51bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDljMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZW51bS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfRU5VTV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9FTlVNX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfc291cmNlX2dlbmVyYXRvcl9iYXNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNzaGFycCB7CisKK2NsYXNzIEVudW1HZW5lcmF0b3IgOiBwdWJsaWMgU291cmNlR2VuZXJhdG9yQmFzZSB7CisgcHVibGljOgorICBFbnVtR2VuZXJhdG9yKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zKiBvcHRpb25zKTsKKyAgfkVudW1HZW5lcmF0b3IoKTsKKworICBFbnVtR2VuZXJhdG9yKGNvbnN0IEVudW1HZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKyAgRW51bUdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEVudW1HZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKworICB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworIHByaXZhdGU6CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjc2hhcnAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9FTlVNX0hfXworCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZW51bV9maWVsZC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZmI2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZW51bV9maWVsZC5jYwpAQCAtMCwwICsxLDEzNSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX29wdGlvbnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3NoYXJwIHsKKworRW51bUZpZWxkR2VuZXJhdG9yOjpFbnVtRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXNlbmNlSW5kZXgsIGNvbnN0IE9wdGlvbnMgKm9wdGlvbnMpCisgICAgOiBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBwcmVzZW5jZUluZGV4LCBvcHRpb25zKSB7Cit9CisKK0VudW1GaWVsZEdlbmVyYXRvcjo6fkVudW1GaWVsZEdlbmVyYXRvcigpIHsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJHByb3BlcnR5X25hbWUkID0gKCR0eXBlX25hbWUkKSBpbnB1dC5SZWFkRW51bSgpO1xuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkaGFzX3Byb3BlcnR5X2NoZWNrJCkge1xuIgorICAgICIgIG91dHB1dC5Xcml0ZVJhd1RhZygkdGFnX2J5dGVzJCk7XG4iCisgICAgIiAgb3V0cHV0LldyaXRlRW51bSgoaW50KSAkcHJvcGVydHlfbmFtZSQpO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgImlmICgkaGFzX3Byb3BlcnR5X2NoZWNrJCkge1xuIgorICAgICAgIiAgc2l6ZSArPSAkdGFnX3NpemUkICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgoaW50KSAkcHJvcGVydHlfbmFtZSQpO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ29kZWNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJwYjo6RmllbGRDb2RlYy5Gb3JFbnVtKCR0YWckLCB4ID0+IChpbnQpIHgsIHggPT4gKCR0eXBlX25hbWUkKSB4LCAkZGVmYXVsdF92YWx1ZSQpIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUV4dGVuc2lvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgV3JpdGVQcm9wZXJ0eURvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBBZGREZXByZWNhdGVkRmxhZyhwcmludGVyKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiJGFjY2Vzc19sZXZlbCQgc3RhdGljIHJlYWRvbmx5IHBiOjpFeHRlbnNpb248JGV4dGVuZGVkX3R5cGUkLCAkdHlwZV9uYW1lJD4gJHByb3BlcnR5X25hbWUkID1cbiIKKyAgICAiICBuZXcgcGI6OkV4dGVuc2lvbjwkZXh0ZW5kZWRfdHlwZSQsICR0eXBlX25hbWUkPigkbnVtYmVyJCwgIik7CisgIEdlbmVyYXRlQ29kZWNDb2RlKHByaW50ZXIpOworICBwcmludGVyLT5QcmludCgiKTtcbiIpOworfQorCitFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcjo6RW51bU9uZW9mRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgcHJlc2VuY2VJbmRleCwgY29uc3QgT3B0aW9ucyAqb3B0aW9ucykKKyAgOiBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IsIHByZXNlbmNlSW5kZXgsIG9wdGlvbnMpIHsKK30KKworRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6On5FbnVtT25lb2ZGaWVsZEdlbmVyYXRvcigpIHsKK30KKwordm9pZCBFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJHByb3BlcnR5X25hbWUkID0gb3RoZXIuJHByb3BlcnR5X25hbWUkO1xuIik7Cit9CisKK3ZvaWQgRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gVE9ETyhqb25za2VldCk6IFdoYXQgYWJvdXQgaWYgd2UgcmVhZCB0aGUgZGVmYXVsdCB2YWx1ZT8KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiJG9uZW9mX25hbWUkXyA9IGlucHV0LlJlYWRFbnVtKCk7XG4iCisgICAgIiRvbmVvZl9uYW1lJENhc2VfID0gJG9uZW9mX3Byb3BlcnR5X25hbWUkT25lb2ZDYXNlLiRvbmVvZl9jYXNlX25hbWUkO1xuIik7Cit9CisKK3ZvaWQgRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiaWYgKCRoYXNfcHJvcGVydHlfY2hlY2skKSB7XG4iCisgICAgIiAgb3V0cHV0LldyaXRlUmF3VGFnKCR0YWdfYnl0ZXMkKTtcbiIKKyAgICAiICBvdXRwdXQuV3JpdGVFbnVtKChpbnQpICRwcm9wZXJ0eV9uYW1lJCk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICJpZiAoJGhhc19wcm9wZXJ0eV9jaGVjayQpIHtcbiIKKyAgICAiICBzaXplICs9ICR0YWdfc2l6ZSQgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKChpbnQpICRwcm9wZXJ0eV9uYW1lJCk7XG4iCisgICAgIn1cbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3NoYXJwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW1fZmllbGQuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2YjAyMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmgKQEAgLTAsMCArMSw4MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9FTlVNX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX0VOVU1fRklFTERfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9wcmltaXRpdmVfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjc2hhcnAgeworCitjbGFzcyBFbnVtRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgRW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgIGludCBwcmVzZW5jZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyAqb3B0aW9ucyk7CisgIH5FbnVtRmllbGRHZW5lcmF0b3IoKTsKKworICBFbnVtRmllbGRHZW5lcmF0b3IoY29uc3QgRW51bUZpZWxkR2VuZXJhdG9yJikgPSBkZWxldGU7CisgIEVudW1GaWVsZEdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEVudW1GaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUNvZGVjQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVFeHRlbnNpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKK307CisKK2NsYXNzIEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yIDogcHVibGljIFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgRW51bU9uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlc2VuY2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyAqb3B0aW9ucyk7CisgIH5FbnVtT25lb2ZGaWVsZEdlbmVyYXRvcigpOworCisgIEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yKGNvbnN0IEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yJikgPSBkZWxldGU7CisgIEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgRW51bU9uZW9mRmllbGRHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNzaGFycAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX0VOVU1fRklFTERfSF9fCisKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9maWVsZF9iYXNlLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4NDdlMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9maWVsZF9iYXNlLmNjCkBAIC0wLDAgKzEsNDY0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbmFtZXMuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjc2hhcnAgeworCit2b2lkIEZpZWxkR2VuZXJhdG9yQmFzZTo6U2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzKSB7CisgIC8vIE5vdGU6IHRoaXMgd2lsbCBiZSB2YWxpZCBldmVuIHRob3VnaCB0aGUgdGFnIGVtaXR0ZWQgZm9yIHBhY2tlZCBhbmQgdW5wYWNrZWQgdmVyc2lvbnMgb2YKKyAgLy8gcmVwZWF0ZWQgZmllbGRzIHZhcmllcyBieSB3aXJlIGZvcm1hdC4gVGhlIHdpcmUgZm9ybWF0IGlzIGVuY29kZWQgaW4gdGhlIGJvdHRvbSAzIGJpdHMsIHdoaWNoCisgIC8vIG5ldmVyIGVmZmVjdHMgdGhlIHRhZyBzaXplLgorICBpbnQgdGFnX3NpemUgPSBpbnRlcm5hbDo6V2lyZUZvcm1hdDo6VGFnU2l6ZShkZXNjcmlwdG9yXy0+bnVtYmVyKCksIGRlc2NyaXB0b3JfLT50eXBlKCkpOworICBpbnQgcGFydF90YWdfc2l6ZSA9IHRhZ19zaXplOworICBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICBwYXJ0X3RhZ19zaXplIC89IDI7CisgIH0KKyAgdWludCB0YWcgPSBpbnRlcm5hbDo6V2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yXyk7CisgIHVpbnQ4X3QgdGFnX2FycmF5WzVdOworICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSh0YWcsIHRhZ19hcnJheSk7CisgIHN0ZDo6c3RyaW5nIHRhZ19ieXRlcyA9IFN0ckNhdCh0YWdfYXJyYXlbMF0pOworICBmb3IgKGludCBpID0gMTsgaSA8IHBhcnRfdGFnX3NpemU7IGkrKykgeworICAgIHRhZ19ieXRlcyArPSAiLCAiICsgU3RyQ2F0KHRhZ19hcnJheVtpXSk7CisgIH0KKworICAoKnZhcmlhYmxlcylbInRhZyJdID0gU3RyQ2F0KHRhZyk7CisgICgqdmFyaWFibGVzKVsidGFnX3NpemUiXSA9IFN0ckNhdCh0YWdfc2l6ZSk7CisgICgqdmFyaWFibGVzKVsidGFnX2J5dGVzIl0gPSB0YWdfYnl0ZXM7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUeXBlOjpUWVBFX0dST1VQKSB7CisgICAgdGFnID0gaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgICBkZXNjcmlwdG9yXy0+bnVtYmVyKCksCisgICAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSh0YWcsIHRhZ19hcnJheSk7CisgICAgdGFnX2J5dGVzID0gU3RyQ2F0KHRhZ19hcnJheVswXSk7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwYXJ0X3RhZ19zaXplOyBpKyspIHsKKyAgICAgICAgdGFnX2J5dGVzICs9ICIsICIgKyBTdHJDYXQodGFnX2FycmF5W2ldKTsKKyAgICB9CisKKyAgICB2YXJpYWJsZXNfWyJlbmRfdGFnIl0gPSBTdHJDYXQodGFnKTsKKyAgICB2YXJpYWJsZXNfWyJlbmRfdGFnX2J5dGVzIl0gPSB0YWdfYnl0ZXM7CisgIH0KKworICAoKnZhcmlhYmxlcylbImFjY2Vzc19sZXZlbCJdID0gInB1YmxpYyI7CisKKyAgKCp2YXJpYWJsZXMpWyJwcm9wZXJ0eV9uYW1lIl0gPSBwcm9wZXJ0eV9uYW1lKCk7CisgICgqdmFyaWFibGVzKVsidHlwZV9uYW1lIl0gPSB0eXBlX25hbWUoKTsKKyAgKCp2YXJpYWJsZXMpWyJleHRlbmRlZF90eXBlIl0gPSBHZXRDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gPSBuYW1lKCk7CisgICgqdmFyaWFibGVzKVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOworICAoKnZhcmlhYmxlcylbImRlZmF1bHRfdmFsdWUiXSA9IGRlZmF1bHRfdmFsdWUoKTsKKyAgKCp2YXJpYWJsZXMpWyJjYXBpdGFsaXplZF90eXBlX25hbWUiXSA9IGNhcGl0YWxpemVkX3R5cGVfbmFtZSgpOworICAoKnZhcmlhYmxlcylbIm51bWJlciJdID0gbnVtYmVyKCk7CisgIGlmIChoYXNfZGVmYXVsdF92YWx1ZSgpICYmICFTdXBwb3J0c1ByZXNlbmNlQXBpKGRlc2NyaXB0b3JfKSkgeworICAgICgqdmFyaWFibGVzKVsibmFtZV9kZWZfbWVzc2FnZSJdID0KKyAgICAgICgqdmFyaWFibGVzKVsibmFtZSJdICsgIl8gPSAiICsgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X3ZhbHVlIl07CisgIH0gZWxzZSB7CisgICAgKCp2YXJpYWJsZXMpWyJuYW1lX2RlZl9tZXNzYWdlIl0gPSAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfIjsKKyAgfQorICBpZiAoU3VwcG9ydHNQcmVzZW5jZUFwaShkZXNjcmlwdG9yXykpIHsKKyAgICAoKnZhcmlhYmxlcylbImhhc19wcm9wZXJ0eV9jaGVjayJdID0gIkhhcyIgKyAoKnZhcmlhYmxlcylbInByb3BlcnR5X25hbWUiXTsKKyAgICAoKnZhcmlhYmxlcylbIm90aGVyX2hhc19wcm9wZXJ0eV9jaGVjayJdID0gIm90aGVyLkhhcyIgKyAoKnZhcmlhYmxlcylbInByb3BlcnR5X25hbWUiXTsKKyAgICAoKnZhcmlhYmxlcylbImhhc19ub3RfcHJvcGVydHlfY2hlY2siXSA9ICIhIiArICgqdmFyaWFibGVzKVsiaGFzX3Byb3BlcnR5X2NoZWNrIl07CisgICAgKCp2YXJpYWJsZXMpWyJvdGhlcl9oYXNfbm90X3Byb3BlcnR5X2NoZWNrIl0gPSAiISIgKyAoKnZhcmlhYmxlcylbIm90aGVyX2hhc19wcm9wZXJ0eV9jaGVjayJdOworICAgIGlmIChwcmVzZW5jZUluZGV4XyAhPSAtMSkgeworICAgICAgc3RkOjpzdHJpbmcgaGFzQml0c051bWJlciA9IFN0ckNhdChwcmVzZW5jZUluZGV4XyAvIDMyKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGhhc0JpdHNNYXNrID0gU3RyQ2F0KDEgPDwgKHByZXNlbmNlSW5kZXhfICUgMzIpKTsKKyAgICAgICgqdmFyaWFibGVzKVsiaGFzX2ZpZWxkX2NoZWNrIl0gPSAiKF9oYXNCaXRzIiArIGhhc0JpdHNOdW1iZXIgKyAiICYgIiArIGhhc0JpdHNNYXNrICsgIikgIT0gMCI7CisgICAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGQiXSA9ICJfaGFzQml0cyIgKyBoYXNCaXRzTnVtYmVyICsgIiB8PSAiICsgaGFzQml0c01hc2s7CisgICAgICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZCJdID0gIl9oYXNCaXRzIiArIGhhc0JpdHNOdW1iZXIgKyAiICY9IH4iICsgaGFzQml0c01hc2s7CisgICAgfQorICB9IGVsc2UgeworICAgICgqdmFyaWFibGVzKVsiaGFzX3Byb3BlcnR5X2NoZWNrIl0gPQorICAgICAgKCp2YXJpYWJsZXMpWyJwcm9wZXJ0eV9uYW1lIl0gKyAiICE9ICIgKyAoKnZhcmlhYmxlcylbImRlZmF1bHRfdmFsdWUiXTsKKyAgICAoKnZhcmlhYmxlcylbIm90aGVyX2hhc19wcm9wZXJ0eV9jaGVjayJdID0gIm90aGVyLiIgKworICAgICAgKCp2YXJpYWJsZXMpWyJwcm9wZXJ0eV9uYW1lIl0gKyAiICE9ICIgKyAoKnZhcmlhYmxlcylbImRlZmF1bHRfdmFsdWUiXTsKKyAgfQorfQorCit2b2lkIEZpZWxkR2VuZXJhdG9yQmFzZTo6U2V0Q29tbW9uT25lb2ZGaWVsZFZhcmlhYmxlcygKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgKCp2YXJpYWJsZXMpWyJvbmVvZl9uYW1lIl0gPSBvbmVvZl9uYW1lKCk7CisgIGlmIChTdXBwb3J0c1ByZXNlbmNlQXBpKGRlc2NyaXB0b3JfKSkgeworICAgICgqdmFyaWFibGVzKVsiaGFzX3Byb3BlcnR5X2NoZWNrIl0gPSAiSGFzIiArIHByb3BlcnR5X25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbImhhc19wcm9wZXJ0eV9jaGVjayJdID0KKyAgICAgIG9uZW9mX25hbWUoKSArICJDYXNlXyA9PSAiICsgb25lb2ZfcHJvcGVydHlfbmFtZSgpICsKKyAgICAgICJPbmVvZkNhc2UuIiArIG9uZW9mX2Nhc2VfbmFtZSgpOworICB9CisgICgqdmFyaWFibGVzKVsib25lb2ZfY2FzZV9uYW1lIl0gPSBvbmVvZl9jYXNlX25hbWUoKTsKKyAgKCp2YXJpYWJsZXMpWyJvbmVvZl9wcm9wZXJ0eV9uYW1lIl0gPSBvbmVvZl9wcm9wZXJ0eV9uYW1lKCk7Cit9CisKK0ZpZWxkR2VuZXJhdG9yQmFzZTo6RmllbGRHZW5lcmF0b3JCYXNlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVzZW5jZUluZGV4LCBjb25zdCBPcHRpb25zKiBvcHRpb25zKQorICAgIDogU291cmNlR2VuZXJhdG9yQmFzZShvcHRpb25zKSwKKyAgICAgIGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgICAgcHJlc2VuY2VJbmRleF8ocHJlc2VuY2VJbmRleCkgeworICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcygmdmFyaWFibGVzXyk7Cit9CisKK0ZpZWxkR2VuZXJhdG9yQmFzZTo6fkZpZWxkR2VuZXJhdG9yQmFzZSgpIHsKK30KKwordm9pZCBGaWVsZEdlbmVyYXRvckJhc2U6OkdlbmVyYXRlRnJlZXppbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIE5vLW9wOiBvbmx5IG1lc3NhZ2UgZmllbGRzIGFuZCByZXBlYXRlZCBmaWVsZHMgbmVlZAorICAvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBmcmVlemluZywgc28gZGVmYXVsdCB0byBub3QgZ2VuZXJhdGluZyBhbnkgY29kZS4KK30KKwordm9pZCBGaWVsZEdlbmVyYXRvckJhc2U6OkdlbmVyYXRlQ29kZWNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgICAgLy8gTm8tb3A6IGV4cGVjdCB0aGlzIHRvIGJlIG92ZXJyaWRkZW4gYnkgYXBwcm9wcmlhdGUgdHlwZXMuCisgICAgLy8gQ291bGQgZmFpbCBpZiB3ZSBnZXQgY2FsbGVkIGhlcmUgdGhvdWdoLi4uCit9CisKK3ZvaWQgRmllbGRHZW5lcmF0b3JCYXNlOjpHZW5lcmF0ZUV4dGVuc2lvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gTm8tb3A6IG9ubHkgbWVzc2FnZSBmaWVsZHMsIGVudW0gZmllbGRzLCBwcmltaXRpdmVzLCAKKyAgLy8gYW5kIHJlcGVhdGVkIGZpZWxkcyBuZWVkIHRoaXMgZGVmYXVsdCBpcyB0byBub3QgZ2VuZXJhdGUgYW55IGNvZGUKK30KKwordm9pZCBGaWVsZEdlbmVyYXRvckJhc2U6OkdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgdXNlX3BhcnNlX2NvbnRleHQpIHsKKyAgLy8gZm9yIHNvbWUgZmllbGQgdHlwZXMgdGhlIHZhbHVlIG9mICJ1c2VfcGFyc2VfY29udGV4dCIgZG9lc24ndCBtYXR0ZXIsCisgIC8vIHNvIHdlIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgorICBHZW5lcmF0ZVBhcnNpbmdDb2RlKHByaW50ZXIpOworfQorCit2b2lkIEZpZWxkR2VuZXJhdG9yQmFzZTo6R2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB1c2Vfd3JpdGVfY29udGV4dCkgeworICAvLyBmb3Igc29tZSBmaWVsZCB0eXBlcyB0aGUgdmFsdWUgb2YgInVzZV93cml0ZV9jb250ZXh0IiBkb2Vzbid0IG1hdHRlciwKKyAgLy8gc28gd2UgZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCisgIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUocHJpbnRlcik7Cit9CisKK3ZvaWQgRmllbGRHZW5lcmF0b3JCYXNlOjpBZGREZXByZWNhdGVkRmxhZyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkpIHsKKyAgICBwcmludGVyLT5QcmludCgiW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlXVxuIik7CisgIH0gZWxzZSBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSAmJgorICAgICAgICAgICBkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCktPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkpIHsKKyAgICBwcmludGVyLT5QcmludCgiW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlXVxuIik7CisgIH0KK30KKwordm9pZCBGaWVsZEdlbmVyYXRvckJhc2U6OkFkZFB1YmxpY01lbWJlckF0dHJpYnV0ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgQWRkRGVwcmVjYXRlZEZsYWcocHJpbnRlcik7CisgIFdyaXRlR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMocHJpbnRlcik7Cit9CisKK3N0ZDo6c3RyaW5nIEZpZWxkR2VuZXJhdG9yQmFzZTo6b25lb2ZfY2FzZV9uYW1lKCkgeworICByZXR1cm4gR2V0T25lb2ZDYXNlTmFtZShkZXNjcmlwdG9yXyk7Cit9CisKK3N0ZDo6c3RyaW5nIEZpZWxkR2VuZXJhdG9yQmFzZTo6b25lb2ZfcHJvcGVydHlfbmFtZSgpIHsKKyAgcmV0dXJuIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfb25lb2YoKS0+bmFtZSgpLCB0cnVlKTsKK30KKworc3RkOjpzdHJpbmcgRmllbGRHZW5lcmF0b3JCYXNlOjpvbmVvZl9uYW1lKCkgeworICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShkZXNjcmlwdG9yXy0+Y29udGFpbmluZ19vbmVvZigpLT5uYW1lKCksIGZhbHNlKTsKK30KKworc3RkOjpzdHJpbmcgRmllbGRHZW5lcmF0b3JCYXNlOjpwcm9wZXJ0eV9uYW1lKCkgeworICByZXR1cm4gR2V0UHJvcGVydHlOYW1lKGRlc2NyaXB0b3JfKTsKK30KKworc3RkOjpzdHJpbmcgRmllbGRHZW5lcmF0b3JCYXNlOjpuYW1lKCkgeworICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShHZXRGaWVsZE5hbWUoZGVzY3JpcHRvcl8pLCBmYWxzZSk7Cit9CisKK3N0ZDo6c3RyaW5nIEZpZWxkR2VuZXJhdG9yQmFzZTo6dHlwZV9uYW1lKCkgeworICByZXR1cm4gdHlwZV9uYW1lKGRlc2NyaXB0b3JfKTsKK30KKworc3RkOjpzdHJpbmcgRmllbGRHZW5lcmF0b3JCYXNlOjp0eXBlX25hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHN3aXRjaCAoZGVzY3JpcHRvci0+dHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTToKKyAgICAgIHJldHVybiBHZXRDbGFzc05hbWUoZGVzY3JpcHRvci0+ZW51bV90eXBlKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVA6CisgICAgICBpZiAoSXNXcmFwcGVyVHlwZShkZXNjcmlwdG9yKSkgeworICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHdyYXBwZWRfZmllbGQgPQorICAgICAgICAgICAgZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCktPmZpZWxkKDApOworICAgICAgICBzdGQ6OnN0cmluZyB3cmFwcGVkX2ZpZWxkX3R5cGVfbmFtZSA9IHR5cGVfbmFtZSh3cmFwcGVkX2ZpZWxkKTsKKyAgICAgICAgLy8gU3RyaW5nIGFuZCBCeXRlU3RyaW5nIGdvIHRvIHRoZSBzYW1lIHR5cGU7IG90aGVyIHdyYXBwZWQgdHlwZXMKKyAgICAgICAgLy8gZ28gdG8gdGhlIG51bGxhYmxlIGVxdWl2YWxlbnQuCisgICAgICAgIGlmICh3cmFwcGVkX2ZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyB8fAorICAgICAgICAgICAgd3JhcHBlZF9maWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUykgeworICAgICAgICAgIHJldHVybiB3cmFwcGVkX2ZpZWxkX3R5cGVfbmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gd3JhcHBlZF9maWVsZF90eXBlX25hbWUgKyAiPyI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBHZXRDbGFzc05hbWUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiAiZmxvYXQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0OgorICAgICAgcmV0dXJuICJsb25nIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gInVsb25nIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMjoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0OgorICAgICAgcmV0dXJuICJ1bG9uZyI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMjoKKyAgICAgIHJldHVybiAidWludCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmciOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTOgorICAgICAgcmV0dXJuICJwYjo6Qnl0ZVN0cmluZyI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuICJ1aW50IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDoKKyAgICAgIHJldHVybiAibG9uZyI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgICAgcmV0dXJuICJpbnQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NDoKKyAgICAgIHJldHVybiAibG9uZyI7CisgICAgZGVmYXVsdDoKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpPDwgIlVua25vd24gZmllbGQgdHlwZS4iOworICAgICAgcmV0dXJuICIiOworICB9Cit9CisKK2Jvb2wgRmllbGRHZW5lcmF0b3JCYXNlOjpoYXNfZGVmYXVsdF92YWx1ZSgpIHsKKyAgc3dpdGNoIChkZXNjcmlwdG9yXy0+dHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTToKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIGRlc2NyaXB0b3JfLT5kZWZhdWx0X3ZhbHVlX2RvdWJsZSgpICE9IDAuMDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiBkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9mbG9hdCgpICE9IDAuMDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiBkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCgpICE9IDBMOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiBkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKSAhPSAwTDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMjoKKyAgICAgIHJldHVybiBkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9pbnQzMigpICE9IDA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NDoKKyAgICAgIHJldHVybiBkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKSAhPSAwTDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyOgorICAgICAgcmV0dXJuIGRlc2NyaXB0b3JfLT5kZWZhdWx0X3ZhbHVlX3VpbnQzMigpICE9IDA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiBkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9ib29sKCk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzI6CisgICAgICByZXR1cm4gZGVzY3JpcHRvcl8tPmRlZmF1bHRfdmFsdWVfdWludDMyKCkgIT0gMDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjoKKyAgICAgIHJldHVybiBkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9pbnQzMigpICE9IDA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6CisgICAgICByZXR1cm4gZGVzY3JpcHRvcl8tPmRlZmF1bHRfdmFsdWVfaW50NjQoKSAhPSAwTDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzI6CisgICAgICByZXR1cm4gZGVzY3JpcHRvcl8tPmRlZmF1bHRfdmFsdWVfaW50MzIoKSAhPSAwOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NDoKKyAgICAgIHJldHVybiBkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCgpICE9IDBMOworICAgIGRlZmF1bHQ6CisgICAgICBHT09HTEVfTE9HKEZBVEFMKTw8ICJVbmtub3duIGZpZWxkIHR5cGUuIjsKKyAgICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK2Jvb2wgQWxsUHJpbnRhYmxlQXNjaWkoY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpIHsKKyAgZm9yKGludCBpID0gMDsgaSA8IHRleHQuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAodGV4dFtpXSA8IDB4MjAgfHwgdGV4dFtpXSA+IDB4N2UpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0ZDo6c3RyaW5nIEZpZWxkR2VuZXJhdG9yQmFzZTo6R2V0U3RyaW5nRGVmYXVsdFZhbHVlSW50ZXJuYWwoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgICAgaWYgKGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKSkKKyAgICAgICAgcmV0dXJuICJcIlwiIjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gImdsb2JhbDo6U3lzdGVtLlRleHQuRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoZ2xvYmFsOjpTeXN0ZW0uIgorICAgICAgICAgICAgICJDb252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoXCIiICsKKyAgICAgICAgICAgICBTdHJpbmdUb0Jhc2U2NChkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKSArICJcIiksIDAsICIgKyBTdHJDYXQoZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5sZW5ndGgoKSkgKyAiKSI7Cit9CisKK3N0ZDo6c3RyaW5nIEZpZWxkR2VuZXJhdG9yQmFzZTo6R2V0Qnl0ZXNEZWZhdWx0VmFsdWVJbnRlcm5hbChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgICBpZiAoZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKQorICAgICAgICByZXR1cm4gInBiOjpCeXRlU3RyaW5nLkVtcHR5IjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAicGI6OkJ5dGVTdHJpbmcuRnJvbUJhc2U2NChcIiIgKyBTdHJpbmdUb0Jhc2U2NChkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKSArICJcIikiOworfQorCitzdGQ6OnN0cmluZyBGaWVsZEdlbmVyYXRvckJhc2U6OmRlZmF1bHRfdmFsdWUoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWUoZGVzY3JpcHRvcl8pOworfQorCitzdGQ6OnN0cmluZyBGaWVsZEdlbmVyYXRvckJhc2U6OmRlZmF1bHRfdmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHN3aXRjaCAoZGVzY3JpcHRvci0+dHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTToKKyAgICAgIHJldHVybiBHZXRDbGFzc05hbWUoZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV9lbnVtKCktPnR5cGUoKSkgKyAiLiIgKworICAgICAgICBHZXRFbnVtVmFsdWVOYW1lKGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfZW51bSgpLT50eXBlKCktPm5hbWUoKSwgZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV9lbnVtKCktPm5hbWUoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICAgIGlmIChJc1dyYXBwZXJUeXBlKGRlc2NyaXB0b3IpKSB7CisgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogd3JhcHBlZF9maWVsZCA9IGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLT5maWVsZCgwKTsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWUod3JhcHBlZF9maWVsZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIm51bGwiOworICAgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRTogeworICAgICAgZG91YmxlIHZhbHVlID0gZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV9kb3VibGUoKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKKyAgICAgICAgcmV0dXJuICJkb3VibGUuUG9zaXRpdmVJbmZpbml0eSI7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IC1zdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKKyAgICAgICAgcmV0dXJuICJkb3VibGUuTmVnYXRpdmVJbmZpbml0eSI7CisgICAgICB9IGVsc2UgaWYgKHN0ZDo6aXNuYW4odmFsdWUpKSB7CisgICAgICAgIHJldHVybiAiZG91YmxlLk5hTiI7CisgICAgICB9CisgICAgICByZXR1cm4gU3RyQ2F0KHZhbHVlKSArICJEIjsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQ6IHsKKyAgICAgIGZsb2F0IHZhbHVlID0gZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV9mbG9hdCgpOworICAgICAgaWYgKHZhbHVlID09IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKSB7CisgICAgICAgIHJldHVybiAiZmxvYXQuUG9zaXRpdmVJbmZpbml0eSI7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IC1zdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSkgeworICAgICAgICByZXR1cm4gImZsb2F0Lk5lZ2F0aXZlSW5maW5pdHkiOworICAgICAgfSBlbHNlIGlmIChzdGQ6OmlzbmFuKHZhbHVlKSkgeworICAgICAgICByZXR1cm4gImZsb2F0Lk5hTiI7CisgICAgICB9CisgICAgICByZXR1cm4gU3RyQ2F0KHZhbHVlKSArICJGIjsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQ6CisgICAgICByZXR1cm4gU3RyQ2F0KGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfaW50NjQoKSkgKyAiTCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0OgorICAgICAgcmV0dXJuIFN0ckNhdChkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpKSArICJVTCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzI6CisgICAgICByZXR1cm4gU3RyQ2F0KGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfaW50MzIoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NDoKKyAgICAgIHJldHVybiBTdHJDYXQoZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKSkgKyAiVUwiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzI6CisgICAgICByZXR1cm4gU3RyQ2F0KGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfdWludDMyKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0w6CisgICAgICBpZiAoZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV9ib29sKCkpIHsKKyAgICAgICAgcmV0dXJuICJ0cnVlIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiZmFsc2UiOworICAgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiBHZXRTdHJpbmdEZWZhdWx0VmFsdWVJbnRlcm5hbChkZXNjcmlwdG9yKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzoKKyAgICAgIHJldHVybiBHZXRCeXRlc0RlZmF1bHRWYWx1ZUludGVybmFsKGRlc2NyaXB0b3IpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiBTdHJDYXQoZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV91aW50MzIoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6CisgICAgICByZXR1cm4gU3RyQ2F0KGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfaW50MzIoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6CisgICAgICByZXR1cm4gU3RyQ2F0KGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfaW50NjQoKSkgKyAiTCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgICAgcmV0dXJuIFN0ckNhdChkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX2ludDMyKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NDoKKyAgICAgIHJldHVybiBTdHJDYXQoZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCgpKSArICJMIjsKKyAgICBkZWZhdWx0OgorICAgICAgR09PR0xFX0xPRyhGQVRBTCk8PCAiVW5rbm93biBmaWVsZCB0eXBlLiI7CisgICAgICByZXR1cm4gIiI7CisgIH0KK30KKworc3RkOjpzdHJpbmcgRmllbGRHZW5lcmF0b3JCYXNlOjpudW1iZXIoKSB7CisgIHJldHVybiBTdHJDYXQoZGVzY3JpcHRvcl8tPm51bWJlcigpKTsKK30KKworc3RkOjpzdHJpbmcgRmllbGRHZW5lcmF0b3JCYXNlOjpjYXBpdGFsaXplZF90eXBlX25hbWUoKSB7CisgIHN3aXRjaCAoZGVzY3JpcHRvcl8tPnR5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU06CisgICAgICByZXR1cm4gIkVudW0iOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6CisgICAgICByZXR1cm4gIk1lc3NhZ2UiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOgorICAgICAgcmV0dXJuICJHcm91cCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJEb3VibGUiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuICJGbG9hdCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQ6CisgICAgICByZXR1cm4gIkludDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gIlVJbnQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzI6CisgICAgICByZXR1cm4gIkludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0OgorICAgICAgcmV0dXJuICJGaXhlZDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyOgorICAgICAgcmV0dXJuICJGaXhlZDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJCb29sIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6CisgICAgICByZXR1cm4gIkJ5dGVzIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzI6CisgICAgICByZXR1cm4gIlVJbnQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6CisgICAgICByZXR1cm4gIlNGaXhlZDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDoKKyAgICAgIHJldHVybiAiU0ZpeGVkNjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMjoKKyAgICAgIHJldHVybiAiU0ludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQ6CisgICAgICByZXR1cm4gIlNJbnQ2NCI7CisgICAgZGVmYXVsdDoKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpPDwgIlVua25vd24gZmllbGQgdHlwZS4iOworICAgICAgcmV0dXJuICIiOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjc2hhcnAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZmllbGRfYmFzZS5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2I3NDY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuaApAQCAtMCwwICsxLDExMiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9GSUVMRF9CQVNFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX0ZJRUxEX0JBU0VfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3NvdXJjZV9nZW5lcmF0b3JfYmFzZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjc2hhcnAgeworCitjbGFzcyBGaWVsZEdlbmVyYXRvckJhc2UgOiBwdWJsaWMgU291cmNlR2VuZXJhdG9yQmFzZSB7CisgcHVibGljOgorICBGaWVsZEdlbmVyYXRvckJhc2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgaW50IHByZXNlbmNlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zKiBvcHRpb25zKTsKKyAgfkZpZWxkR2VuZXJhdG9yQmFzZSgpOworCisgIEZpZWxkR2VuZXJhdG9yQmFzZShjb25zdCBGaWVsZEdlbmVyYXRvckJhc2UmKSA9IGRlbGV0ZTsKKyAgRmllbGRHZW5lcmF0b3JCYXNlJiBvcGVyYXRvcj0oY29uc3QgRmllbGRHZW5lcmF0b3JCYXNlJikgPSBkZWxldGU7CisKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQ2xvbmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRnJlZXppbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQ29kZWNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRXh0ZW5zaW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgdXNlX3BhcnNlX2NvbnRleHQpOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB1c2Vfd3JpdGVfY29udGV4dCk7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgPSAwOworCisgIHZpcnR1YWwgdm9pZCBXcml0ZUhhc2goaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKKyAgdmlydHVhbCB2b2lkIFdyaXRlRXF1YWxzKGlvOjpQcmludGVyKiBwcmludGVyKSA9IDA7CisgIC8vIEN1cnJlbnRseSB1bnVzZWQsIGFzIHdlIHVzZSByZWZsZWN0aW9uIHRvIGdlbmVyYXRlIEpTT04KKyAgdmlydHVhbCB2b2lkIFdyaXRlVG9TdHJpbmcoaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKKworIHByb3RlY3RlZDoKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgY29uc3QgaW50IHByZXNlbmNlSW5kZXhfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcmlhYmxlc187CisKKyAgdm9pZCBBZGREZXByZWNhdGVkRmxhZyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgQWRkTnVsbENoZWNrKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBBZGROdWxsQ2hlY2soaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworICB2b2lkIEFkZFB1YmxpY01lbWJlckF0dHJpYnV0ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIFNldENvbW1vbk9uZW9mRmllbGRWYXJpYWJsZXMoCisgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJpYWJsZXMpOworCisgIHN0ZDo6c3RyaW5nIG9uZW9mX3Byb3BlcnR5X25hbWUoKTsKKyAgc3RkOjpzdHJpbmcgb25lb2ZfY2FzZV9uYW1lKCk7IAorICBzdGQ6OnN0cmluZyBvbmVvZl9uYW1lKCk7CisgIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWUoKTsKKyAgc3RkOjpzdHJpbmcgbmFtZSgpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUoKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIGJvb2wgaGFzX2RlZmF1bHRfdmFsdWUoKTsKKyAgc3RkOjpzdHJpbmcgZGVmYXVsdF92YWx1ZSgpOworICBzdGQ6OnN0cmluZyBkZWZhdWx0X3ZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIHN0ZDo6c3RyaW5nIG51bWJlcigpOworICBzdGQ6OnN0cmluZyBjYXBpdGFsaXplZF90eXBlX25hbWUoKTsKKworIHByaXZhdGU6CisgIHZvaWQgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzKTsKKyAgc3RkOjpzdHJpbmcgR2V0U3RyaW5nRGVmYXVsdFZhbHVlSW50ZXJuYWwoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgc3RkOjpzdHJpbmcgR2V0Qnl0ZXNEZWZhdWx0VmFsdWVJbnRlcm5hbChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNzaGFycAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX0ZJRUxEX0JBU0VfSF9fCisKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9nZW5lcmF0b3IuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTA2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTEyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbmFtZXMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9vcHRpb25zLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVmbGVjdGlvbl9jbGFzcy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNzaGFycCB7CisKK0dlbmVyYXRvcjo6R2VuZXJhdG9yKCkge30KK0dlbmVyYXRvcjo6fkdlbmVyYXRvcigpIHt9CisKK3VpbnQ2NF90IEdlbmVyYXRvcjo6R2V0U3VwcG9ydGVkRmVhdHVyZXMoKSBjb25zdCB7CisgIHJldHVybiBDb2RlR2VuZXJhdG9yOjpGZWF0dXJlOjpGRUFUVVJFX1BST1RPM19PUFRJT05BTDsKK30KKwordm9pZCBHZW5lcmF0ZUZpbGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyogb3B0aW9ucykgeworICBSZWZsZWN0aW9uQ2xhc3NHZW5lcmF0b3IgcmVmbGVjdGlvbkNsYXNzR2VuZXJhdG9yKGZpbGUsIG9wdGlvbnMpOworICByZWZsZWN0aW9uQ2xhc3NHZW5lcmF0b3IuR2VuZXJhdGUocHJpbnRlcik7Cit9CisKK2Jvb2wgR2VuZXJhdG9yOjpHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcikgY29uc3QgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiA+IG9wdGlvbnM7CisgIFBhcnNlR2VuZXJhdG9yUGFyYW1ldGVyKHBhcmFtZXRlciwgJm9wdGlvbnMpOworCisgIHN0cnVjdCBPcHRpb25zIGNsaV9vcHRpb25zOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9ucy5zaXplKCk7IGkrKykgeworICAgIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJmaWxlX2V4dGVuc2lvbiIpIHsKKyAgICAgIGNsaV9vcHRpb25zLmZpbGVfZXh0ZW5zaW9uID0gb3B0aW9uc1tpXS5zZWNvbmQ7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJiYXNlX25hbWVzcGFjZSIpIHsKKyAgICAgIGNsaV9vcHRpb25zLmJhc2VfbmFtZXNwYWNlID0gb3B0aW9uc1tpXS5zZWNvbmQ7CisgICAgICBjbGlfb3B0aW9ucy5iYXNlX25hbWVzcGFjZV9zcGVjaWZpZWQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAiaW50ZXJuYWxfYWNjZXNzIikgeworICAgICAgY2xpX29wdGlvbnMuaW50ZXJuYWxfYWNjZXNzID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gInNlcmlhbGl6YWJsZSIpIHsKKyAgICAgIGNsaV9vcHRpb25zLnNlcmlhbGl6YWJsZSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICplcnJvciA9ICJVbmtub3duIGdlbmVyYXRvciBvcHRpb246ICIgKyBvcHRpb25zW2ldLmZpcnN0OworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lX2Vycm9yID0gIiI7CisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gR2V0T3V0cHV0RmlsZShmaWxlLAorICAgICAgY2xpX29wdGlvbnMuZmlsZV9leHRlbnNpb24sCisgICAgICBjbGlfb3B0aW9ucy5iYXNlX25hbWVzcGFjZV9zcGVjaWZpZWQsCisgICAgICBjbGlfb3B0aW9ucy5iYXNlX25hbWVzcGFjZSwKKyAgICAgICZmaWxlbmFtZV9lcnJvcik7CisKKyAgaWYgKGZpbGVuYW1lLmVtcHR5KCkpIHsKKyAgICAqZXJyb3IgPSBmaWxlbmFtZV9lcnJvcjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgZ2VuZXJhdG9yX2NvbnRleHQtPk9wZW4oZmlsZW5hbWUpKTsKKyAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisKKyAgR2VuZXJhdGVGaWxlKGZpbGUsICZwcmludGVyLCAmY2xpX29wdGlvbnMpOworCisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3NoYXJwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MWY5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSw3MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEdlbmVyYXRlcyBDIyBjb2RlIGZvciBhIGdpdmVuIC5wcm90byBmaWxlLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfR0VORVJBVE9SX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX0dFTkVSQVRPUl9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjc2hhcnAgeworCisvLyBDb2RlR2VuZXJhdG9yIGltcGxlbWVudGF0aW9uIHdoaWNoIGdlbmVyYXRlcyBhIEMjIHNvdXJjZSBmaWxlIGFuZAorLy8gaGVhZGVyLiAgSWYgeW91IGNyZWF0ZSB5b3VyIG93biBwcm90b2NvbCBjb21waWxlciBiaW5hcnkgYW5kIHlvdSB3YW50CisvLyBpdCB0byBzdXBwb3J0IEMjIG91dHB1dCwgeW91IGNhbiBkbyBzbyBieSByZWdpc3RlcmluZyBhbiBpbnN0YW5jZSBvZiB0aGlzCisvLyBDb2RlR2VuZXJhdG9yIHdpdGggdGhlIENvbW1hbmRMaW5lSW50ZXJmYWNlIGluIHlvdXIgbWFpbigpIGZ1bmN0aW9uLgorY2xhc3MgUFJPVE9DX0VYUE9SVCBHZW5lcmF0b3IgOiBwdWJsaWMgQ29kZUdlbmVyYXRvciB7CisgcHVibGljOgorICBHZW5lcmF0b3IoKTsKKyAgfkdlbmVyYXRvcigpOworICBib29sIEdlbmVyYXRlKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgc3RkOjpzdHJpbmcqIGVycm9yKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgR2V0U3VwcG9ydGVkRmVhdHVyZXMoKSBjb25zdCBvdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjc2hhcnAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9HRU5FUkFUT1JfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjFlZmYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvcl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDgxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hbnkucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3NoYXJwIHsKK25hbWVzcGFjZSB7CisKK1RFU1QoQ1NoYXJwRW51bVZhbHVlLCBQYXNjYWxDYXNlZFByZWZpeFN0cmlwcGluZykgeworICBFWFBFQ1RfRVEoIkJhciIsIEdldEVudW1WYWx1ZU5hbWUoIkZvbyIsICJCQVIiKSk7CisgIEVYUEVDVF9FUSgiQmFyQmF6IiwgR2V0RW51bVZhbHVlTmFtZSgiRm9vIiwgIkJBUl9CQVoiKSk7CisgIEVYUEVDVF9FUSgiQmFyIiwgR2V0RW51bVZhbHVlTmFtZSgiRm9vIiwgIkZPT19CQVIiKSk7CisgIEVYUEVDVF9FUSgiQmFyIiwgR2V0RW51bVZhbHVlTmFtZSgiRm9vIiwgIkZPT19fQkFSIikpOworICBFWFBFQ1RfRVEoIkJhckJheiIsIEdldEVudW1WYWx1ZU5hbWUoIkZvbyIsICJGT09fQkFSX0JBWiIpKTsKKyAgRVhQRUNUX0VRKCJCYXJCYXoiLCBHZXRFbnVtVmFsdWVOYW1lKCJGb28iLCAiRm9vX0JhckJheiIpKTsKKyAgRVhQRUNUX0VRKCJCYXIiLCBHZXRFbnVtVmFsdWVOYW1lKCJGT19PIiwgIkZPT19CQVIiKSk7CisgIEVYUEVDVF9FUSgiQmFyIiwgR2V0RW51bVZhbHVlTmFtZSgiRk9PIiwgIkZfT19PX0JBUiIpKTsKKyAgRVhQRUNUX0VRKCJCYXIiLCBHZXRFbnVtVmFsdWVOYW1lKCJGb28iLCAiQkFSIikpOworICBFWFBFQ1RfRVEoIkJhckJheiIsIEdldEVudW1WYWx1ZU5hbWUoIkZvbyIsICJCQVJfQkFaIikpOworICBFWFBFQ1RfRVEoIkZvbyIsIEdldEVudW1WYWx1ZU5hbWUoIkZvbyIsICJGT08iKSk7CisgIEVYUEVDVF9FUSgiRm9vIiwgR2V0RW51bVZhbHVlTmFtZSgiRm9vIiwgIkZPT19fXyIpKTsKKyAgLy8gSWRlbnRpZmllcnMgY2FuJ3Qgc3RhcnQgd2l0aCBkaWdpdHMKKyAgRVhQRUNUX0VRKCJfMkJhciIsIEdldEVudW1WYWx1ZU5hbWUoIkZvbyIsICJGT09fMl9CQVIiKSk7CisgIEVYUEVDVF9FUSgiXzIiLCBHZXRFbnVtVmFsdWVOYW1lKCJGb28iLCAiRk9PX19fMiIpKTsKK30KKworVEVTVChEZXNjcmlwdG9yUHJvdG9IZWxwZXJzLCBJc0Rlc2NyaXB0b3JQcm90bykgeworICBFWFBFQ1RfVFJVRShJc0Rlc2NyaXB0b3JQcm90byhEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKS0+ZmlsZSgpKSk7CisgIEVYUEVDVF9GQUxTRShJc0Rlc2NyaXB0b3JQcm90byhnb29nbGU6OnByb3RvYnVmOjpBbnk6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpKSk7Cit9CisKK1RFU1QoRGVzY3JpcHRvclByb3RvSGVscGVycywgSXNEZXNjcmlwdG9yT3B0aW9uTWVzc2FnZSkgeworICBFWFBFQ1RfVFJVRShJc0Rlc2NyaXB0b3JPcHRpb25NZXNzYWdlKEZpbGVPcHRpb25zOjpkZXNjcmlwdG9yKCkpKTsKKyAgRVhQRUNUX0ZBTFNFKElzRGVzY3JpcHRvck9wdGlvbk1lc3NhZ2UoZ29vZ2xlOjpwcm90b2J1Zjo6QW55OjpkZXNjcmlwdG9yKCkpKTsKKyAgRVhQRUNUX0ZBTFNFKElzRGVzY3JpcHRvck9wdGlvbk1lc3NhZ2UoRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCkpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgY3NoYXJwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfaGVscGVycy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2NhODY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuY2MKQEAgLTAsMCArMSw1OTkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbmFtZXMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWFwX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX29wdGlvbnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9wcmltaXRpdmVfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9lbnVtX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfbWVzc2FnZV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX3ByaW1pdGl2ZV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3dyYXBwZXJfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjc2hhcnAgeworCitDU2hhcnBUeXBlIEdldENTaGFycFR5cGUoRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzI6CisgICAgICByZXR1cm4gQ1NIQVJQVFlQRV9JTlQzMjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiBDU0hBUlBUWVBFX0lOVDY0OworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiBDU0hBUlBUWVBFX1VJTlQzMjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gQ1NIQVJQVFlQRV9VSU5UMzI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgICAgcmV0dXJuIENTSEFSUFRZUEVfSU5UMzI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0OgorICAgICAgcmV0dXJuIENTSEFSUFRZUEVfSU5UNjQ7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMjoKKyAgICAgIHJldHVybiBDU0hBUlBUWVBFX1VJTlQzMjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0OgorICAgICAgcmV0dXJuIENTSEFSUFRZUEVfVUlOVDY0OworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOgorICAgICAgcmV0dXJuIENTSEFSUFRZUEVfSU5UMzI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6CisgICAgICByZXR1cm4gQ1NIQVJQVFlQRV9JTlQ2NDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiBDU0hBUlBUWVBFX0ZMT0FUOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiBDU0hBUlBUWVBFX0RPVUJMRTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuIENTSEFSUFRZUEVfQk9PTDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOgorICAgICAgcmV0dXJuIENTSEFSUFRZUEVfRU5VTTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gQ1NIQVJQVFlQRV9TVFJJTkc7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6CisgICAgICByZXR1cm4gQ1NIQVJQVFlQRV9CWVRFU1RSSU5HOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOgorICAgICAgcmV0dXJuIENTSEFSUFRZUEVfTUVTU0FHRTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOgorICAgICAgcmV0dXJuIENTSEFSUFRZUEVfTUVTU0FHRTsKKworICAgICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKKyAgICAgIC8vIHR5cGVzIGFyZSBhZGRlZC4KKyAgfQorICBHT09HTEVfTE9HKEZBVEFMKTw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gKENTaGFycFR5cGUpIC0xOworfQorCitzdGQ6OnN0cmluZyBTdHJpcERvdFByb3RvKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm90b19maWxlKSB7CisgIGludCBsYXN0aW5kZXggPSBwcm90b19maWxlLmZpbmRfbGFzdF9vZigiLiIpOworICByZXR1cm4gcHJvdG9fZmlsZS5zdWJzdHIoMCwgbGFzdGluZGV4KTsKK30KKworc3RkOjpzdHJpbmcgR2V0RmlsZU5hbWVzcGFjZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBpZiAoZGVzY3JpcHRvci0+b3B0aW9ucygpLmhhc19jc2hhcnBfbmFtZXNwYWNlKCkpIHsKKyAgICByZXR1cm4gZGVzY3JpcHRvci0+b3B0aW9ucygpLmNzaGFycF9uYW1lc3BhY2UoKTsKKyAgfQorICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShkZXNjcmlwdG9yLT5wYWNrYWdlKCksIHRydWUsIHRydWUpOworfQorCisvLyBSZXR1cm5zIHRoZSBQYXNjYWwtY2FzZWQgbGFzdCBwYXJ0IG9mIHRoZSBwcm90byBmaWxlLiBGb3IgZXhhbXBsZSwKKy8vIGlucHV0IG9mICJnb29nbGUvcHJvdG9idWYvZm9vX2Jhci5wcm90byIgd291bGQgcmVzdWx0IGluICJGb29CYXIiLgorc3RkOjpzdHJpbmcgR2V0RmlsZU5hbWVCYXNlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgICAgc3RkOjpzdHJpbmcgcHJvdG9fZmlsZSA9IGRlc2NyaXB0b3ItPm5hbWUoKTsKKyAgICBpbnQgbGFzdHNsYXNoID0gcHJvdG9fZmlsZS5maW5kX2xhc3Rfb2YoIi8iKTsKKyAgICBzdGQ6OnN0cmluZyBiYXNlID0gcHJvdG9fZmlsZS5zdWJzdHIobGFzdHNsYXNoICsgMSk7CisgICAgcmV0dXJuIFVuZGVyc2NvcmVzVG9QYXNjYWxDYXNlKFN0cmlwRG90UHJvdG8oYmFzZSkpOworfQorCitzdGQ6OnN0cmluZyBHZXRSZWZsZWN0aW9uQ2xhc3NVbnF1YWxpZmllZE5hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgLy8gVE9ETzogRGV0ZWN0IGNvbGxpc2lvbnMgd2l0aCBleGlzdGluZyBtZXNzYWdlcywKKyAgLy8gYW5kIGFwcGVuZCBhbiB1bmRlcnNjb3JlIGlmIG5lY2Vzc2FyeS4KKyAgcmV0dXJuIEdldEZpbGVOYW1lQmFzZShkZXNjcmlwdG9yKSArICJSZWZsZWN0aW9uIjsKK30KKworc3RkOjpzdHJpbmcgR2V0RXh0ZW5zaW9uQ2xhc3NVbnF1YWxpZmllZE5hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgLy8gVE9ETzogRGV0ZWN0IGNvbGxpc2lvbnMgd2l0aCBleGlzdGluZyBtZXNzYWdlcywKKyAgLy8gYW5kIGFwcGVuZCBhbiB1bmRlcnNjb3JlIGlmIG5lY2Vzc2FyeS4KKyAgcmV0dXJuIEdldEZpbGVOYW1lQmFzZShkZXNjcmlwdG9yKSArICJFeHRlbnNpb25zIjsKK30KKworLy8gVE9ETyhqdGF0dGVybXVzY2gpOiBjYW4gd2UgcmV1c2UgYSB1dGlsaXR5IGZ1bmN0aW9uPworc3RkOjpzdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FwX25leHRfbGV0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZXNlcnZlX3BlcmlvZCkgeworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIC8vIE5vdGU6ICBJIGRpc3RydXN0IGN0eXBlLmggZHVlIHRvIGxvY2FsZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoJ2EnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICd6JykgeworICAgICAgaWYgKGNhcF9uZXh0X2xldHRlcikgeworICAgICAgICByZXN1bHQgKz0gaW5wdXRbaV0gKyAoJ0EnIC0gJ2EnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSBpbnB1dFtpXTsKKyAgICAgIH0KKyAgICAgIGNhcF9uZXh0X2xldHRlciA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAoJ0EnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICdaJykgeworICAgICAgaWYgKGkgPT0gMCAmJiAhY2FwX25leHRfbGV0dGVyKSB7CisgICAgICAgIC8vIEZvcmNlIGZpcnN0IGxldHRlciB0byBsb3dlci1jYXNlIHVubGVzcyBleHBsaWNpdGx5IHRvbGQgdG8KKyAgICAgICAgLy8gY2FwaXRhbGl6ZSBpdC4KKyAgICAgICAgcmVzdWx0ICs9IGlucHV0W2ldICsgKCdhJyAtICdBJyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDYXBpdGFsIGxldHRlcnMgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBsZWZ0IGFzLWlzLgorICAgICAgICByZXN1bHQgKz0gaW5wdXRbaV07CisgICAgICB9CisgICAgICBjYXBfbmV4dF9sZXR0ZXIgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKCcwJyA8PSBpbnB1dFtpXSAmJiBpbnB1dFtpXSA8PSAnOScpIHsKKyAgICAgIHJlc3VsdCArPSBpbnB1dFtpXTsKKyAgICAgIGNhcF9uZXh0X2xldHRlciA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGNhcF9uZXh0X2xldHRlciA9IHRydWU7CisgICAgICBpZiAoaW5wdXRbaV0gPT0gJy4nICYmIHByZXNlcnZlX3BlcmlvZCkgeworICAgICAgICByZXN1bHQgKz0gJy4nOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBBZGQgYSB0cmFpbGluZyAiXyIgaWYgdGhlIG5hbWUgc2hvdWxkIGJlIGFsdGVyZWQuCisgIGlmIChpbnB1dC5zaXplKCkgPiAwICYmIGlucHV0W2lucHV0LnNpemUoKSAtIDFdID09ICcjJykgeworICAgIHJlc3VsdCArPSAnXyc7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgVW5kZXJzY29yZXNUb1Bhc2NhbENhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0KSB7CisgIHJldHVybiBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGlucHV0LCB0cnVlKTsKK30KKworLy8gQ29udmVydCBhIHN0cmluZyB3aGljaCBpcyBleHBlY3RlZCB0byBiZSBTSE9VVFlfQ0FTRSAoYnV0IG1heSBub3QgYmUgKnByZWNpc2VseSogc2hvdXR5KQorLy8gaW50byBhIFBhc2NhbENhc2Ugc3RyaW5nLiBQcmVjaXNlIHJ1bGVzIGltcGxlbWVudGVkOgorCisvLyBQcmV2aW91cyBpbnB1dCBjaGFyYWN0ZXIgICAgICBDdXJyZW50IGNoYXJhY3RlciAgICAgICAgIENhc2UKKy8vIEFueSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbi1hbHBoYW51bWVyaWMgICAgICAgICAgU2tpcHBlZAorLy8gTm9uZSAtIGZpcnN0IGNoYXIgb2YgaW5wdXQgICAgQWxwaGFudW1lcmljICAgICAgICAgICAgICBVcHBlcgorLy8gTm9uLWxldHRlciAoZS5nLiBfIG9yIDEpICAgICAgQWxwaGFudW1lcmljICAgICAgICAgICAgICBVcHBlcgorLy8gTnVtZXJpYyAgICAgICAgICAgICAgICAgICAgICAgQWxwaGFudW1lcmljICAgICAgICAgICAgICBVcHBlcgorLy8gTG93ZXIgbGV0dGVyICAgICAgICAgICAgICAgICAgQWxwaGFudW1lcmljICAgICAgICAgICAgICBTYW1lIGFzIGN1cnJlbnQKKy8vIFVwcGVyIGxldHRlciAgICAgICAgICAgICAgICAgIEFscGhhbnVtZXJpYyAgICAgICAgICAgICAgTG93ZXIKK3N0ZDo6c3RyaW5nIFNob3V0eVRvUGFzY2FsQ2FzZShjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAvLyBTaW1wbGUgd2F5IG9mIGltcGxlbWVudGluZyAiYWx3YXlzIHN0YXJ0IHdpdGggdXBwZXIiCisgIGNoYXIgcHJldmlvdXMgPSAnXyc7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyBpKyspIHsKKyAgICBjaGFyIGN1cnJlbnQgPSBpbnB1dFtpXTsKKyAgICBpZiAoIWFzY2lpX2lzYWxudW0oY3VycmVudCkpIHsKKyAgICAgIHByZXZpb3VzID0gY3VycmVudDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIWFzY2lpX2lzYWxudW0ocHJldmlvdXMpKSB7CisgICAgICByZXN1bHQgKz0gYXNjaWlfdG91cHBlcihjdXJyZW50KTsKKyAgICB9IGVsc2UgaWYgKGFzY2lpX2lzZGlnaXQocHJldmlvdXMpKSB7CisgICAgICByZXN1bHQgKz0gYXNjaWlfdG91cHBlcihjdXJyZW50KTsKKyAgICB9IGVsc2UgaWYgKGFzY2lpX2lzbG93ZXIocHJldmlvdXMpKSB7CisgICAgICByZXN1bHQgKz0gY3VycmVudDsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9IGFzY2lpX3RvbG93ZXIoY3VycmVudCk7CisgICAgfQorICAgIHByZXZpb3VzID0gY3VycmVudDsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBBdHRlbXB0IHRvIHJlbW92ZSBhIHByZWZpeCBmcm9tIGEgdmFsdWUsIGlnbm9yaW5nIGNhc2luZyBhbmQgc2tpcHBpbmcgdW5kZXJzY29yZXMuCisvLyAoZm9vLCBmb29fYmFyKSA9PiBiYXIgLSB1bmRlcnNjb3JlIGFmdGVyIHByZWZpeCBpcyBza2lwcGVkCisvLyAoRk9PLCBmb29fYmFyKSA9PiBiYXIgLSBjYXNpbmcgaXMgaWdub3JlZAorLy8gKGZvb19iYXIsIGZvb2JhcmJheikgPT4gYmF6IC0gdW5kZXJzY29yZSBpbiBwcmVmaXggaXMgaWdub3JlZAorLy8gKGZvb2JhciwgZm9vX2JhcmJheikgPT4gYmF6IC0gdW5kZXJzY29yZSBpbiB2YWx1ZSBpcyBpZ25vcmVkCisvLyAoZm9vLCBiYXIpID0+IGJhciAtIHByZWZpeCBpc24ndCBtYXRjaGVkOyByZXR1cm4gb3JpZ2luYWwgdmFsdWUKK3N0ZDo6c3RyaW5nIFRyeVJlbW92ZVByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgLy8gRmlyc3Qgbm9ybWFsaXplIHRvIGEgbG93ZXItY2FzZSBuby11bmRlcnNjb3JlcyBwcmVmaXggdG8gbWF0Y2ggYWdhaW5zdAorICBzdGQ6OnN0cmluZyBwcmVmaXhfdG9fbWF0Y2ggPSAiIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmVmaXguc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAocHJlZml4W2ldICE9ICdfJykgeworICAgICAgcHJlZml4X3RvX21hdGNoICs9IGFzY2lpX3RvbG93ZXIocHJlZml4W2ldKTsKKyAgICB9CisgIH0KKworICAvLyBUaGlzIGtlZXBzIHRyYWNrIG9mIGhvdyBtdWNoIG9mIHZhbHVlIHdlJ3ZlIGNvbnN1bWVkCisgIHNpemVfdCBwcmVmaXhfaW5kZXgsIHZhbHVlX2luZGV4OworICBmb3IgKHByZWZpeF9pbmRleCA9IDAsIHZhbHVlX2luZGV4ID0gMDsKKyAgICAgIHByZWZpeF9pbmRleCA8IHByZWZpeF90b19tYXRjaC5zaXplKCkgJiYgdmFsdWVfaW5kZXggPCB2YWx1ZS5zaXplKCk7CisgICAgICB2YWx1ZV9pbmRleCsrKSB7CisgICAgLy8gU2tpcCBvdmVyIHVuZGVyc2NvcmVzIGluIHRoZSB2YWx1ZQorICAgIGlmICh2YWx1ZVt2YWx1ZV9pbmRleF0gPT0gJ18nKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGFzY2lpX3RvbG93ZXIodmFsdWVbdmFsdWVfaW5kZXhdKSAhPSBwcmVmaXhfdG9fbWF0Y2hbcHJlZml4X2luZGV4KytdKSB7CisgICAgICAvLyBGYWlsZWQgdG8gbWF0Y2ggdGhlIHByZWZpeCAtIGJhaWwgb3V0IGVhcmx5LgorICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgfQorCisgIC8vIElmIHdlIGRpZG4ndCBmaW5pc2ggbG9va2luZyB0aHJvdWdoIHRoZSBwcmVmaXgsIHdlIGNhbid0IHN0cmlwIGl0LgorICBpZiAocHJlZml4X2luZGV4IDwgcHJlZml4X3RvX21hdGNoLnNpemUoKSkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIC8vIFN0ZXAgb3ZlciBhbnkgdW5kZXJzY29yZXMgYWZ0ZXIgdGhlIHByZWZpeAorICB3aGlsZSAodmFsdWVfaW5kZXggPCB2YWx1ZS5zaXplKCkgJiYgdmFsdWVbdmFsdWVfaW5kZXhdID09ICdfJykgeworICAgIHZhbHVlX2luZGV4Kys7CisgIH0KKworICAvLyBJZiB0aGVyZSdzIG5vdGhpbmcgbGVmdCAoZS5nLiBpdCB3YXMgYSBwcmVmaXggd2l0aCBvbmx5IHVuZGVyc2NvcmVzIGFmdGVyd2FyZHMpLCBkb24ndCBzdHJpcC4KKyAgaWYgKHZhbHVlX2luZGV4ID09IHZhbHVlLnNpemUoKSkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHJldHVybiB2YWx1ZS5zdWJzdHIodmFsdWVfaW5kZXgpOworfQorCisvLyBGb3JtYXQgdGhlIGVudW0gdmFsdWUgbmFtZSBpbiBhIHBsZWFzYW50IHdheSBmb3IgQyM6CisvLyAtIFN0cmlwIHRoZSBlbnVtIG5hbWUgYXMgYSBwcmVmaXggaWYgcG9zc2libGUKKy8vIC0gQ29udmVydCB0byBQYXNjYWxDYXNlLgorLy8gRm9yIGV4YW1wbGUsIGFuIGVudW0gY2FsbGVkIENvbG9yIHdpdGggYSB2YWx1ZSBvZiBDT0xPUl9CTFVFIHNob3VsZAorLy8gcmVzdWx0IGluIGFuIGVudW0gdmFsdWUgaW4gQyMgY2FsbGVkIGp1c3QgQmx1ZQorc3RkOjpzdHJpbmcgR2V0RW51bVZhbHVlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZW51bV9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZW51bV92YWx1ZV9uYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHN0cmlwcGVkID0gVHJ5UmVtb3ZlUHJlZml4KGVudW1fbmFtZSwgZW51bV92YWx1ZV9uYW1lKTsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gU2hvdXR5VG9QYXNjYWxDYXNlKHN0cmlwcGVkKTsKKyAgLy8gSnVzdCBpbiBjYXNlIHdlIGhhdmUgYW4gZW51bSBuYW1lIG9mIEZPTyBhbmQgYSB2YWx1ZSBvZiBGT09fMi4uLiBtYWtlIHN1cmUgdGhlIHJldHVybmVkCisgIC8vIHN0cmluZyBpcyBhIHZhbGlkIGlkZW50aWZpZXIuCisgIGlmIChhc2NpaV9pc2RpZ2l0KHJlc3VsdFswXSkpIHsKKyAgICByZXN1bHQgPSAiXyIgKyByZXN1bHQ7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludCBHZXRHcm91cEVuZFRhZyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSA9IGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpOworICBpZiAoY29udGFpbmluZ190eXBlICE9IE5VTEwpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGFpbmluZ190eXBlLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGZpZWxkID0gY29udGFpbmluZ190eXBlLT5maWVsZChpKTsKKyAgICAgIGlmIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VHlwZTo6VFlQRV9HUk9VUCAmJgorICAgICAgICAgIGZpZWxkLT5tZXNzYWdlX3R5cGUoKSA9PSBkZXNjcmlwdG9yKSB7CisgICAgICAgIHJldHVybiBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoCisgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluaW5nX3R5cGUtPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICAgIGZpZWxkID0gY29udGFpbmluZ190eXBlLT5leHRlbnNpb24oaSk7CisgICAgICBpZiAoZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlR5cGU6OlRZUEVfR1JPVVAgJiYKKyAgICAgICAgICBmaWVsZC0+bWVzc2FnZV90eXBlKCkgPT0gZGVzY3JpcHRvcikgeworICAgICAgICByZXR1cm4gaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgICAgICAgZmllbGQtPm51bWJlcigpLCBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBjb250YWluaW5nX2ZpbGUgPSBkZXNjcmlwdG9yLT5maWxlKCk7CisgICAgaWYgKGNvbnRhaW5pbmdfZmlsZSAhPSBOVUxMKSB7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluaW5nX2ZpbGUtPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgZmllbGQgPSBjb250YWluaW5nX2ZpbGUtPmV4dGVuc2lvbihpKTsKKyAgICAgICAgaWYgKGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUeXBlOjpUWVBFX0dST1VQICYmCisgICAgICAgICAgICBmaWVsZC0+bWVzc2FnZV90eXBlKCkgPT0gZGVzY3JpcHRvcikgeworICAgICAgICAgIHJldHVybiBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoCisgICAgICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSwgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0ZDo6c3RyaW5nIFRvQ1NoYXJwTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gR2V0RmlsZU5hbWVzcGFjZShmaWxlKTsKKyAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgeworICAgIHJlc3VsdCArPSAnLic7CisgIH0KKyAgc3RkOjpzdHJpbmcgY2xhc3NuYW1lOworICBpZiAoZmlsZS0+cGFja2FnZSgpLmVtcHR5KCkpIHsKKyAgICBjbGFzc25hbWUgPSBuYW1lOworICB9IGVsc2UgeworICAgIC8vIFN0cmlwIHRoZSBwcm90byBwYWNrYWdlIGZyb20gZnVsbF9uYW1lIHNpbmNlIHdlJ3ZlIHJlcGxhY2VkIGl0IHdpdGgKKyAgICAvLyB0aGUgQyMgbmFtZXNwYWNlLgorICAgIGNsYXNzbmFtZSA9IG5hbWUuc3Vic3RyKGZpbGUtPnBhY2thZ2UoKS5zaXplKCkgKyAxKTsKKyAgfQorICByZXN1bHQgKz0gU3RyaW5nUmVwbGFjZShjbGFzc25hbWUsICIuIiwgIi5UeXBlcy4iLCB0cnVlKTsKKyAgcmV0dXJuICJnbG9iYWw6OiIgKyByZXN1bHQ7Cit9CisKK3N0ZDo6c3RyaW5nIEdldFJlZmxlY3Rpb25DbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gR2V0RmlsZU5hbWVzcGFjZShkZXNjcmlwdG9yKTsKKyAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgeworICAgIHJlc3VsdCArPSAnLic7CisgIH0KKyAgcmVzdWx0ICs9IEdldFJlZmxlY3Rpb25DbGFzc1VucXVhbGlmaWVkTmFtZShkZXNjcmlwdG9yKTsKKyAgcmV0dXJuICJnbG9iYWw6OiIgKyByZXN1bHQ7Cit9CisKK3N0ZDo6c3RyaW5nIEdldEZ1bGxFeHRlbnNpb25OYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBpZiAoZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX3Njb3BlKCkpIHsKKyAgICByZXR1cm4gR2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9zY29wZSgpKSArICIuRXh0ZW5zaW9ucy4iICsgR2V0UHJvcGVydHlOYW1lKGRlc2NyaXB0b3IpOworICB9CisgIGVsc2UgeworICAgIHJldHVybiBHZXRFeHRlbnNpb25DbGFzc1VucXVhbGlmaWVkTmFtZShkZXNjcmlwdG9yLT5maWxlKCkpICArICIuIiArIEdldFByb3BlcnR5TmFtZShkZXNjcmlwdG9yKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBHZXRDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gVG9DU2hhcnBOYW1lKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLCBkZXNjcmlwdG9yLT5maWxlKCkpOworfQorCitzdGQ6OnN0cmluZyBHZXRDbGFzc05hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIFRvQ1NoYXJwTmFtZShkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSwgZGVzY3JpcHRvci0+ZmlsZSgpKTsKK30KKworLy8gR3JvdXBzIGFyZSBoYWNreTogIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpcyBqdXN0IHRoZSBsb3dlci1jYXNlZCBuYW1lCisvLyBvZiB0aGUgZ3JvdXAgdHlwZS4gIEluIEMjLCB0aG91Z2gsIHdlIHdvdWxkIGxpa2UgdG8gcmV0YWluIHRoZSBvcmlnaW5hbAorLy8gY2FwaXRhbGl6YXRpb24gb2YgdGhlIHR5cGUgbmFtZS4KK3N0ZDo6c3RyaW5nIEdldEZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgaWYgKGRlc2NyaXB0b3ItPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICByZXR1cm4gZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCktPm5hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZGVzY3JpcHRvci0+bmFtZSgpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIEdldEZpZWxkQ29uc3RhbnROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIEdldFByb3BlcnR5TmFtZShmaWVsZCkgKyAiRmllbGROdW1iZXIiOworfQorCitzdGQ6OnN0cmluZyBHZXRQcm9wZXJ0eU5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIC8vIFRPRE8oanRhdHRlcm11c2NoKTogY29uc2lkZXIgaW50cm9kdWNpbmcgY3NoYXJwX3Byb3BlcnR5X25hbWUgZmllbGQgb3B0aW9uCisgIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWUgPSBVbmRlcnNjb3Jlc1RvUGFzY2FsQ2FzZShHZXRGaWVsZE5hbWUoZGVzY3JpcHRvcikpOworICAvLyBBdm9pZCBlaXRoZXIgb3VyIG93biB0eXBlIG5hbWUgb3IgcmVzZXJ2ZWQgbmFtZXMuIE5vdGUgdGhhdCBub3QgYWxsIG5hbWVzCisgIC8vIGFyZSByZXNlcnZlZCAtIGEgZmllbGQgY2FsbGVkIHRvX3N0cmluZywgd3JpdGVfdG8gZXRjIHdvdWxkIHN0aWxsIGNhdXNlIGEgcHJvYmxlbS4KKyAgLy8gVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyBvZiBlbmRpbmcgdXAgd2l0aCBuYW1pbmcgY29sbGlzaW9ucywgYnV0IHdlIHRyeSB0byBhdm9pZCBvYnZpb3VzCisgIC8vIG9uZXMuCisgIGlmIChwcm9wZXJ0eV9uYW1lID09IGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpLT5uYW1lKCkKKyAgICAgIHx8IHByb3BlcnR5X25hbWUgPT0gIlR5cGVzIgorICAgICAgfHwgcHJvcGVydHlfbmFtZSA9PSAiRGVzY3JpcHRvciIpIHsKKyAgICBwcm9wZXJ0eV9uYW1lICs9ICJfIjsKKyAgfQorICByZXR1cm4gcHJvcGVydHlfbmFtZTsKK30KKworc3RkOjpzdHJpbmcgR2V0T25lb2ZDYXNlTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgLy8gVGhlIG5hbWUgaW4gYSBvbmVvZiBjYXNlIGVudW0gaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSBwcm9wZXJ0eSwgYnV0IGFzIHdlIGFsd2F5cyBoYXZlIGEgIk5vbmUiCisgIC8vIHZhbHVlIGFzIHdlbGwsIHdlIG5lZWQgdG8gcmVzZXJ2ZSB0aGF0IGJ5IGFwcGVuZGluZyBhbiB1bmRlcnNjb3JlLgorICBzdGQ6OnN0cmluZyBwcm9wZXJ0eV9uYW1lID0gR2V0UHJvcGVydHlOYW1lKGRlc2NyaXB0b3IpOworICByZXR1cm4gcHJvcGVydHlfbmFtZSA9PSAiTm9uZSIgPyAiTm9uZV8iIDogcHJvcGVydHlfbmFtZTsKK30KKworc3RkOjpzdHJpbmcgR2V0T3V0cHV0RmlsZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgZ2VuZXJhdGVfZGlyZWN0b3JpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGJhc2VfbmFtZXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZXJyb3IpIHsKKyAgc3RkOjpzdHJpbmcgcmVsYXRpdmVfZmlsZW5hbWUgPSBHZXRGaWxlTmFtZUJhc2UoZGVzY3JpcHRvcikgKyBmaWxlX2V4dGVuc2lvbjsKKyAgaWYgKCFnZW5lcmF0ZV9kaXJlY3RvcmllcykgeworICAgIHJldHVybiByZWxhdGl2ZV9maWxlbmFtZTsKKyAgfQorICBzdGQ6OnN0cmluZyBucyA9IEdldEZpbGVOYW1lc3BhY2UoZGVzY3JpcHRvcik7CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9zdWZmaXggPSBuczsKKyAgaWYgKCFiYXNlX25hbWVzcGFjZS5lbXB0eSgpKSB7CisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgYmFzZV9uYW1lc3BhY2UgaXMgZWl0aGVyIGVxdWFsIHRvIG9yIGEgbGVhZGluZyBwYXJ0IG9mCisgICAgLy8gdGhlIGZpbGUgbmFtZXNwYWNlLiBUaGlzIGlzbid0IGp1c3QgYSBzaW1wbGUgcHJlZml4OyAiRm9vLkIiIHNob3VsZG4ndAorICAgIC8vIGJlIHJlZ2FyZGVkIGFzIGEgcHJlZml4IG9mICJGb28uQmFyIi4gVGhlIHNpbXBsZXN0IG9wdGlvbiBpcyB0byBhZGQgIi4iCisgICAgLy8gdG8gYm90aC4KKyAgICBzdGQ6OnN0cmluZyBleHRlbmRlZF9ucyA9IG5zICsgIi4iOworICAgIGlmIChleHRlbmRlZF9ucy5maW5kKGJhc2VfbmFtZXNwYWNlICsgIi4iKSAhPSAwKSB7CisgICAgICAqZXJyb3IgPSAiTmFtZXNwYWNlICIgKyBucyArICIgaXMgbm90IGEgcHJlZml4IG5hbWVzcGFjZSBvZiBiYXNlIG5hbWVzcGFjZSAiICsgYmFzZV9uYW1lc3BhY2U7CisgICAgICByZXR1cm4gIiI7IC8vIFRoaXMgd2lsbCBiZSBpZ25vcmVkLCBiZWNhdXNlIHdlJ3ZlIHNldCBhbiBlcnJvci4KKyAgICB9CisgICAgbmFtZXNwYWNlX3N1ZmZpeCA9IG5zLnN1YnN0cihiYXNlX25hbWVzcGFjZS5sZW5ndGgoKSk7CisgICAgaWYgKG5hbWVzcGFjZV9zdWZmaXguZmluZCgiLiIpID09IDApIHsKKyAgICAgIG5hbWVzcGFjZV9zdWZmaXggPSBuYW1lc3BhY2Vfc3VmZml4LnN1YnN0cigxKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyID0gU3RyaW5nUmVwbGFjZShuYW1lc3BhY2Vfc3VmZml4LCAiLiIsICIvIiwgdHJ1ZSk7CisgIGlmICghbmFtZXNwYWNlX2Rpci5lbXB0eSgpKSB7CisgICAgbmFtZXNwYWNlX2RpciArPSAiLyI7CisgIH0KKyAgcmV0dXJuIG5hbWVzcGFjZV9kaXIgKyByZWxhdGl2ZV9maWxlbmFtZTsKK30KKworLy8gVE9ETzogYyZwIGZyb20gSmF2YSBwcm90b2MgcGx1Z2luCisvLyBGb3IgZW5jb2RpbmdzIHdpdGggZml4ZWQgc2l6ZXMsIHJldHVybnMgdGhhdCBzaXplIGluIGJ5dGVzLiAgT3RoZXJ3aXNlCisvLyByZXR1cm5zIC0xLgoraW50IEdldEZpeGVkU2l6ZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMiAgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0ICAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMiAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0ICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyIDogcmV0dXJuIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6a0ZpeGVkMzJTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQgOiByZXR1cm4gaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjprRml4ZWQ2NFNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6IHJldHVybiBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OmtTRml4ZWQzMlNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6IHJldHVybiBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OmtTRml4ZWQ2NFNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQgICA6IHJldHVybiBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OmtGbG9hdFNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFICA6IHJldHVybiBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OmtEb3VibGVTaXplOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQk9PTCAgICA6IHJldHVybiBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OmtCb29sU2l6ZTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNICAgIDogcmV0dXJuIC0xOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyAgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQICAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSA6IHJldHVybiAtMTsKKworICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgLy8gdHlwZXMgYXJlIGFkZGVkLgorICB9CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGJhc2U2NF9jaGFyc1tdID0KKyAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisKK3N0ZDo6c3RyaW5nIFN0cmluZ1RvQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCkgeworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIHNpemVfdCByZW1haW5pbmcgPSBpbnB1dC5zaXplKCk7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IChjb25zdCB1bnNpZ25lZCBjaGFyKikgaW5wdXQuY19zdHIoKTsKKyAgd2hpbGUgKHJlbWFpbmluZyA+IDIpIHsKKyAgICByZXN1bHQgKz0gYmFzZTY0X2NoYXJzW3NyY1swXSA+PiAyXTsKKyAgICByZXN1bHQgKz0gYmFzZTY0X2NoYXJzWygoc3JjWzBdICYgMHgzKSA8PCA0KSB8IChzcmNbMV0gPj4gNCldOworICAgIHJlc3VsdCArPSBiYXNlNjRfY2hhcnNbKChzcmNbMV0gJiAweGYpIDw8IDIpIHwgKHNyY1syXSA+PiA2KV07CisgICAgcmVzdWx0ICs9IGJhc2U2NF9jaGFyc1tzcmNbMl0gJiAweDNmXTsKKyAgICByZW1haW5pbmcgLT0gMzsKKyAgICBzcmMgKz0gMzsKKyAgfQorICBzd2l0Y2ggKHJlbWFpbmluZykgeworICAgIGNhc2UgMjoKKyAgICAgIHJlc3VsdCArPSBiYXNlNjRfY2hhcnNbc3JjWzBdID4+IDJdOworICAgICAgcmVzdWx0ICs9IGJhc2U2NF9jaGFyc1soKHNyY1swXSAmIDB4MykgPDwgNCkgfCAoc3JjWzFdID4+IDQpXTsKKyAgICAgIHJlc3VsdCArPSBiYXNlNjRfY2hhcnNbKHNyY1sxXSAmIDB4ZikgPDwgMl07CisgICAgICByZXN1bHQgKz0gJz0nOworICAgICAgc3JjICs9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICByZXN1bHQgKz0gYmFzZTY0X2NoYXJzW3NyY1swXSA+PiAyXTsKKyAgICAgIHJlc3VsdCArPSBiYXNlNjRfY2hhcnNbKChzcmNbMF0gJiAweDMpIDw8IDQpXTsKKyAgICAgIHJlc3VsdCArPSAnPSc7CisgICAgICByZXN1bHQgKz0gJz0nOworICAgICAgc3JjICs9IDE7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdGQ6OnN0cmluZyBGaWxlRGVzY3JpcHRvclRvQmFzZTY0KGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHN0ZDo6c3RyaW5nIGZkcF9ieXRlczsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmZHA7CisgIGRlc2NyaXB0b3ItPkNvcHlUbygmZmRwKTsKKyAgZmRwLlNlcmlhbGl6ZVRvU3RyaW5nKCZmZHBfYnl0ZXMpOworICByZXR1cm4gU3RyaW5nVG9CYXNlNjQoZmRwX2J5dGVzKTsKK30KKworRmllbGRHZW5lcmF0b3JCYXNlKiBDcmVhdGVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVzZW5jZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zKiBvcHRpb25zKSB7CisgIHN3aXRjaCAoZGVzY3JpcHRvci0+dHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVA6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICAgIGlmIChkZXNjcmlwdG9yLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yLT5pc19tYXAoKSkgeworICAgICAgICAgIHJldHVybiBuZXcgTWFwRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgcHJlc2VuY2VJbmRleCwgb3B0aW9ucyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBwcmVzZW5jZUluZGV4LCBvcHRpb25zKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKElzV3JhcHBlclR5cGUoZGVzY3JpcHRvcikpIHsKKyAgICAgICAgICBpZiAoZGVzY3JpcHRvci0+cmVhbF9jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV3JhcHBlck9uZW9mRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgcHJlc2VuY2VJbmRleCwgb3B0aW9ucyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV3JhcHBlckZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IsIHByZXNlbmNlSW5kZXgsIG9wdGlvbnMpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoZGVzY3JpcHRvci0+cmVhbF9jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgcHJlc2VuY2VJbmRleCwgb3B0aW9ucyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IsIHByZXNlbmNlSW5kZXgsIG9wdGlvbnMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU06CisgICAgICBpZiAoZGVzY3JpcHRvci0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IsIHByZXNlbmNlSW5kZXgsIG9wdGlvbnMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3ItPnJlYWxfY29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICAgICAgcmV0dXJuIG5ldyBFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBwcmVzZW5jZUluZGV4LCBvcHRpb25zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gbmV3IEVudW1GaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBwcmVzZW5jZUluZGV4LCBvcHRpb25zKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBpZiAoZGVzY3JpcHRvci0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgcHJlc2VuY2VJbmRleCwgb3B0aW9ucyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZGVzY3JpcHRvci0+cmVhbF9jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgcHJlc2VuY2VJbmRleCwgb3B0aW9ucyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBwcmVzZW5jZUluZGV4LCBvcHRpb25zKTsKKyAgICAgICAgfQorICAgICAgfQorICB9Cit9CisKK2Jvb2wgSXNOdWxsYWJsZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgaWYgKGRlc2NyaXB0b3ItPmlzX3JlcGVhdGVkKCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHN3aXRjaCAoZGVzY3JpcHRvci0+dHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTToKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEU6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0OgorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGRlZmF1bHQ6CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5rbm93biBmaWVsZCB0eXBlLiI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY3NoYXJwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2YmQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmgKQEAgLTAsMCArMSwxOTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX0hFTFBFUlNfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfSEVMUEVSU19IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3NoYXJwIHsKKworc3RydWN0IE9wdGlvbnM7CitjbGFzcyBGaWVsZEdlbmVyYXRvckJhc2U7CisKKy8vIFRPRE86IHN0YXJ0IHVzaW5nIHRoaXMgZW51bS4KK2VudW0gQ1NoYXJwVHlwZSB7CisgIENTSEFSUFRZUEVfSU5UMzIgPSAxLAorICBDU0hBUlBUWVBFX0lOVDY0ID0gMiwKKyAgQ1NIQVJQVFlQRV9VSU5UMzIgPSAzLAorICBDU0hBUlBUWVBFX1VJTlQ2NCA9IDQsCisgIENTSEFSUFRZUEVfRkxPQVQgPSA1LAorICBDU0hBUlBUWVBFX0RPVUJMRSA9IDYsCisgIENTSEFSUFRZUEVfQk9PTCA9IDcsCisgIENTSEFSUFRZUEVfU1RSSU5HID0gOCwKKyAgQ1NIQVJQVFlQRV9CWVRFU1RSSU5HID0gOSwKKyAgQ1NIQVJQVFlQRV9NRVNTQUdFID0gMTAsCisgIENTSEFSUFRZUEVfRU5VTSA9IDExLAorICBNQVhfQ1NIQVJQVFlQRSA9IDExCit9OworCisvLyBDb252ZXJ0cyBmaWVsZCB0eXBlIHRvIGNvcnJlc3BvbmRpbmcgQyMgdHlwZS4KK0NTaGFycFR5cGUgR2V0Q1NoYXJwVHlwZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSk7CisKK3N0ZDo6c3RyaW5nIFN0cmlwRG90UHJvdG8oY29uc3Qgc3RkOjpzdHJpbmcmIHByb3RvX2ZpbGUpOworCisvLyBHZXRzIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIHJlZmxlY3Rpb24gY2xhc3MKK3N0ZDo6c3RyaW5nIEdldFJlZmxlY3Rpb25DbGFzc1VucXVhbGlmaWVkTmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisvLyBHZXRzIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBjbGFzcworc3RkOjpzdHJpbmcgR2V0RXh0ZW5zaW9uQ2xhc3NVbnF1YWxpZmllZE5hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCitzdGQ6OnN0cmluZyBHZXRDbGFzc05hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCitzdGQ6OnN0cmluZyBHZXRGaWVsZE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKworc3RkOjpzdHJpbmcgR2V0RmllbGRDb25zdGFudE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKK3N0ZDo6c3RyaW5nIEdldFByb3BlcnR5TmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCitzdGQ6OnN0cmluZyBHZXRPbmVvZkNhc2VOYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKK2ludCBHZXRGaXhlZFNpemUoRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpOworCitzdGQ6OnN0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXBfbmV4dF9sZXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlc2VydmVfcGVyaW9kKTsKKworaW5saW5lIHN0ZDo6c3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0LCBib29sIGNhcF9uZXh0X2xldHRlcikgeworICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShpbnB1dCwgY2FwX25leHRfbGV0dGVyLCBmYWxzZSk7Cit9CisKK3N0ZDo6c3RyaW5nIFVuZGVyc2NvcmVzVG9QYXNjYWxDYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCk7CisKKy8vIE5vdGUgdGhhdCB3ZSB3b3VsZG4ndCBub3JtYWxseSB3YW50IHRvIGV4cG9ydCB0aGlzICh3ZSdyZSBub3QgZXhwZWN0aW5nCisvLyBpdCB0byBiZSB1c2VkIG91dHNpZGUgbGlicHJvdG9jIGl0c2VsZikgYnV0IHRoaXMgZXhwb3NlcyBpdCBmb3IgdGVzdGluZy4KK3N0ZDo6c3RyaW5nIFBST1RPQ19FWFBPUlQgR2V0RW51bVZhbHVlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZW51bV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbnVtX3ZhbHVlX25hbWUpOworCisvLyBUT0RPKGp0YXR0ZXJtdXNjaCk6IHBlcmhhcHMgd2UgY291bGQgbW92ZSB0aGlzIHRvIHN0cnV0aWwKK3N0ZDo6c3RyaW5nIFN0cmluZ1RvQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCk7CisKK3N0ZDo6c3RyaW5nIEZpbGVEZXNjcmlwdG9yVG9CYXNlNjQoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCitGaWVsZEdlbmVyYXRvckJhc2UqIENyZWF0ZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXNlbmNlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMqIG9wdGlvbnMpOworCitzdGQ6OnN0cmluZyBHZXRGdWxsRXh0ZW5zaW9uTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCitib29sIElzTnVsbGFibGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgbWFwIGVudHJ5IG1lc3NhZ2UsCisvLyBpLmUuIG9uZSBpbXBsaWNpdGx5IGNyZWF0ZWQgYnkgcHJvdG9jIGR1ZSB0byBhIG1hcDxrZXksIHZhbHVlPiBmaWVsZC4KK2lubGluZSBib29sIElzTWFwRW50cnlNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5tYXBfZW50cnkoKTsKK30KKworLy8gQ2hlY2tzIGlmIHRoaXMgZGVzY3JpcHRvciBpcyBmb3IgYSBncm91cCBhbmQgZ2V0cyBpdHMgZW5kIHRhZyBvciAwIGlmIGl0J3Mgbm90IGEgZ3JvdXAKK3VpbnQgR2V0R3JvdXBFbmRUYWcoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKKy8vIERldGVybWluZXMgd2hldGhlciB3ZSdyZSBnZW5lcmF0aW5nIGNvZGUgZm9yIHRoZSBwcm90byByZXByZXNlbnRhdGlvbiBvZgorLy8gZGVzY3JpcHRvcnMgZXRjLCBmb3IgdXNlIGluIHRoZSBydW50aW1lLiBUaGlzIGlzIHRoZSBvbmx5IHR5cGUgd2hpY2ggaXMKKy8vIGFsbG93ZWQgdG8gdXNlIHByb3RvMiBzeW50YXgsIGFuZCBpdCBnZW5lcmF0ZXMgaW50ZXJuYWwgY2xhc3Nlcy4KK2lubGluZSBib29sIElzRGVzY3JpcHRvclByb3RvKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5uYW1lKCkgPT0gImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIiB8fAorICAgICAgICAgZGVzY3JpcHRvci0+bmFtZSgpID09ICJuZXQvcHJvdG8yL3Byb3RvL2Rlc2NyaXB0b3IucHJvdG8iOworfQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYW4gb3B0aW9ucyBtZXNzYWdlIHdpdGhpbiBkZXNjcmlwdG9yLnByb3RvLgoraW5saW5lIGJvb2wgSXNEZXNjcmlwdG9yT3B0aW9uTWVzc2FnZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIGlmICghSXNEZXNjcmlwdG9yUHJvdG8oZGVzY3JpcHRvci0+ZmlsZSgpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lID0gZGVzY3JpcHRvci0+bmFtZSgpOworICByZXR1cm4gbmFtZSA9PSAiRmlsZU9wdGlvbnMiIHx8CisgICAgICBuYW1lID09ICJNZXNzYWdlT3B0aW9ucyIgfHwKKyAgICAgIG5hbWUgPT0gIkZpZWxkT3B0aW9ucyIgfHwKKyAgICAgIG5hbWUgPT0gIk9uZW9mT3B0aW9ucyIgfHwKKyAgICAgIG5hbWUgPT0gIkVudW1PcHRpb25zIiB8fAorICAgICAgbmFtZSA9PSAiRW51bVZhbHVlT3B0aW9ucyIgfHwKKyAgICAgIG5hbWUgPT0gIlNlcnZpY2VPcHRpb25zIiB8fAorICAgICAgbmFtZSA9PSAiTWV0aG9kT3B0aW9ucyI7Cit9CisKK2lubGluZSBib29sIElzV3JhcHBlclR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgJiYKKyAgICAgIGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLT5maWxlKCktPm5hbWUoKSA9PSAiZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvIjsKK30KKworaW5saW5lIGJvb2wgSXNQcm90bzIoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8yOworfQorCitpbmxpbmUgYm9vbCBTdXBwb3J0c1ByZXNlbmNlQXBpKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICAvLyBVbmxpa2UgbW9zdCBsYW5ndWFnZXMsIHdlIGRvbid0IGdlbmVyYXRlIEhhcy9DbGVhciBtZW1iZXJzIGZvciBtZXNzYWdlCisgIC8vIHR5cGVzLCBiZWNhdXNlIHRoZXkgY2FuIGFsd2F5cyBiZSBzZXQgdG8gbnVsbCBpbiBDIy4gVGhleSdyZSBub3QgcmVhbGx5CisgIC8vIG5lZWRlZCBmb3Igb25lb2YgZmllbGRzIGluIHByb3RvMiBlaXRoZXIsIGFzIGV2ZXJ5dGhpbmcgY2FuIGJlIGRvbmUgdmlhCisgIC8vIG9uZW9mIGNhc2UsIGJ1dCB3ZSBmb2xsb3cgdGhlIGNvbnZlbnRpb24gZnJvbSBvdGhlciBsYW5ndWFnZXMuIFByb3RvMworICAvLyBvbmVvZiBmaWVsZHMgbmV2ZXIgaGF2ZSBIYXMvQ2xlYXIgbWVtYmVycyAtIGJ1dCB3aWxsIGFsc28gbmV2ZXIgaGF2ZQorICAvLyB0aGUgZXhwbGljaXQgb3B0aW9uYWwga2V5d29yZCBlaXRoZXIuCisgIC8vCisgIC8vIE5vbmUgb2YgdGhlIGJ1aWx0LWluIGhlbHBlcnMgKGRlc2NyaXB0b3ItPmhhc19wcmVzZW5jZSgpIGV0YykgZGVzY3JpYmUKKyAgLy8gcXVpdGUgdGhlIGJlaGF2aW9yIHdlIHdhbnQsIHNvIHRoZSBydWxlcyBhcmUgZXhwbGljaXQgYmVsb3cuCisKKyAgaWYgKGRlc2NyaXB0b3ItPmlzX3JlcGVhdGVkKCkgfHwKKyAgICAgIGRlc2NyaXB0b3ItPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBoYXNfb3B0aW9uYWxfa2V5d29yZCgpIGhhcyBtb3JlIGNvbXBsZXggcnVsZXMgZm9yIHByb3RvMiwgYnV0IHRoYXQKKyAgLy8gZG9lc24ndCBtYXR0ZXIgZ2l2ZW4gdGhlIGZpcnN0IHBhcnQgb2YgdGhpcyBjb25kaXRpb24uCisgIHJldHVybiBJc1Byb3RvMihkZXNjcmlwdG9yLT5maWxlKCkpIHx8IGRlc2NyaXB0b3ItPmhhc19vcHRpb25hbF9rZXl3b3JkKCk7Cit9CisKK2lubGluZSBib29sIFJlcXVpcmVzUHJlc2VuY2VCaXQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBTdXBwb3J0c1ByZXNlbmNlQXBpKGRlc2NyaXB0b3IpICYmCisgICAgIUlzTnVsbGFibGUoZGVzY3JpcHRvcikgJiYKKyAgICAhZGVzY3JpcHRvci0+aXNfZXh0ZW5zaW9uKCkgJiYKKyAgICAhZGVzY3JpcHRvci0+cmVhbF9jb250YWluaW5nX29uZW9mKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjc2hhcnAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9IRUxQRVJTX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tYXBfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzYjk5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tYXBfZmllbGQuY2MKQEAgLTAsMCArMSwxNTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNzaGFycCB7CisKK01hcEZpZWxkR2VuZXJhdG9yOjpNYXBGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXNlbmNlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyogb3B0aW9ucykKKyAgICA6IEZpZWxkR2VuZXJhdG9yQmFzZShkZXNjcmlwdG9yLCBwcmVzZW5jZUluZGV4LCBvcHRpb25zKSB7Cit9CisKK01hcEZpZWxkR2VuZXJhdG9yOjp+TWFwRmllbGRHZW5lcmF0b3IoKSB7Cit9CisKK3ZvaWQgTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGtleV9kZXNjcmlwdG9yID0KKyAgICAgIGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKS0+bWFwX2tleSgpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHZhbHVlX2Rlc2NyaXB0b3IgPQorICAgICAgZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpLT5tYXBfdmFsdWUoKTsKKyAgdmFyaWFibGVzX1sia2V5X3R5cGVfbmFtZSJdID0gdHlwZV9uYW1lKGtleV9kZXNjcmlwdG9yKTsKKyAgdmFyaWFibGVzX1sidmFsdWVfdHlwZV9uYW1lIl0gPSB0eXBlX25hbWUodmFsdWVfZGVzY3JpcHRvcik7CisgIHN0ZDo6dW5pcXVlX3B0cjxGaWVsZEdlbmVyYXRvckJhc2U+IGtleV9nZW5lcmF0b3IoCisgICAgICBDcmVhdGVGaWVsZEdlbmVyYXRvcihrZXlfZGVzY3JpcHRvciwgMSwgdGhpcy0+b3B0aW9ucygpKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxGaWVsZEdlbmVyYXRvckJhc2U+IHZhbHVlX2dlbmVyYXRvcigKKyAgICAgIENyZWF0ZUZpZWxkR2VuZXJhdG9yKHZhbHVlX2Rlc2NyaXB0b3IsIDIsIHRoaXMtPm9wdGlvbnMoKSkpOworCisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8JGtleV90eXBlX25hbWUkLCAkdmFsdWVfdHlwZV9uYW1lJD4uQ29kZWMgX21hcF8kbmFtZSRfY29kZWNcbiIKKyAgICAiICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8JGtleV90eXBlX25hbWUkLCAkdmFsdWVfdHlwZV9uYW1lJD4uQ29kZWMoIik7CisgIGtleV9nZW5lcmF0b3ItPkdlbmVyYXRlQ29kZWNDb2RlKHByaW50ZXIpOworICBwcmludGVyLT5QcmludCgiLCAiKTsKKyAgdmFsdWVfZ2VuZXJhdG9yLT5HZW5lcmF0ZUNvZGVjQ29kZShwcmludGVyKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiLCAkdGFnJCk7XG4iCisgICAgInByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDwka2V5X3R5cGVfbmFtZSQsICR2YWx1ZV90eXBlX25hbWUkPiAkbmFtZSRfID0gbmV3IHBiYzo6TWFwRmllbGQ8JGtleV90eXBlX25hbWUkLCAkdmFsdWVfdHlwZV9uYW1lJD4oKTtcbiIpOworICBXcml0ZVByb3BlcnR5RG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIEFkZFB1YmxpY01lbWJlckF0dHJpYnV0ZXMocHJpbnRlcik7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgIiRhY2Nlc3NfbGV2ZWwkIHBiYzo6TWFwRmllbGQ8JGtleV90eXBlX25hbWUkLCAkdmFsdWVfdHlwZV9uYW1lJD4gJHByb3BlcnR5X25hbWUkIHtcbiIKKyAgICAiICBnZXQgeyByZXR1cm4gJG5hbWUkXzsgfVxuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBNYXBGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJG5hbWUkXy5BZGQob3RoZXIuJG5hbWUkXyk7XG4iKTsKK30KKwordm9pZCBNYXBGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBHZW5lcmF0ZVBhcnNpbmdDb2RlKHByaW50ZXIsIHRydWUpOworfQorCit2b2lkIE1hcEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyLCBib29sIHVzZV9wYXJzZV9jb250ZXh0KSB7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgdXNlX3BhcnNlX2NvbnRleHQKKyAgICA/ICIkbmFtZSRfLkFkZEVudHJpZXNGcm9tKHJlZiBpbnB1dCwgX21hcF8kbmFtZSRfY29kZWMpO1xuIgorICAgIDogIiRuYW1lJF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfJG5hbWUkX2NvZGVjKTtcbiIpOworfQorCit2b2lkIE1hcEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUocHJpbnRlciwgdHJ1ZSk7Cit9CisKK3ZvaWQgTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgdXNlX3dyaXRlX2NvbnRleHQpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICB1c2Vfd3JpdGVfY29udGV4dAorICAgID8gIiRuYW1lJF8uV3JpdGVUbyhyZWYgb3V0cHV0LCBfbWFwXyRuYW1lJF9jb2RlYyk7XG4iCisgICAgOiAiJG5hbWUkXy5Xcml0ZVRvKG91dHB1dCwgX21hcF8kbmFtZSRfY29kZWMpO1xuIik7Cit9CisKK3ZvaWQgTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgInNpemUgKz0gJG5hbWUkXy5DYWxjdWxhdGVTaXplKF9tYXBfJG5hbWUkX2NvZGVjKTtcbiIpOworfQorCit2b2lkIE1hcEZpZWxkR2VuZXJhdG9yOjpXcml0ZUhhc2goaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiaGFzaCBePSAkcHJvcGVydHlfbmFtZSQuR2V0SGFzaENvZGUoKTtcbiIpOworfQordm9pZCBNYXBGaWVsZEdlbmVyYXRvcjo6V3JpdGVFcXVhbHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiaWYgKCEkcHJvcGVydHlfbmFtZSQuRXF1YWxzKG90aGVyLiRwcm9wZXJ0eV9uYW1lJCkpIHJldHVybiBmYWxzZTtcbiIpOworfQorCit2b2lkIE1hcEZpZWxkR2VuZXJhdG9yOjpXcml0ZVRvU3RyaW5nKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgICAgLy8gVE9ETzogSWYgd2UgZXZlciBhY3R1YWxseSB1c2UgVG9TdHJpbmcsIHdlJ2xsIG5lZWQgdG8gaW1wbGVtZSB0aGlzLi4uCit9CisKK3ZvaWQgTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ2xvbmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJG5hbWUkXyA9IG90aGVyLiRuYW1lJF8uQ2xvbmUoKTtcbiIpOworfQorCit2b2lkIE1hcEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUZyZWV6aW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworfQorCit9ICAvLyBuYW1lc3BhY2UgY3NoYXJwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYjM2MTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWFwX2ZpZWxkLmgKQEAgLTAsMCArMSw3MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9NQVBfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfTUFQX0ZJRUxEX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZmllbGRfYmFzZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNzaGFycCB7CisKK2NsYXNzIE1hcEZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yQmFzZSB7CisgcHVibGljOgorICBNYXBGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgIGludCBwcmVzZW5jZUluZGV4LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zKiBvcHRpb25zKTsKKyAgfk1hcEZpZWxkR2VuZXJhdG9yKCk7CisKKyAgTWFwRmllbGRHZW5lcmF0b3IoY29uc3QgTWFwRmllbGRHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKyAgTWFwRmllbGRHZW5lcmF0b3ImIG9wZXJhdG9yPShjb25zdCBNYXBGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUNsb25pbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRnJlZXppbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB1c2VfcGFyc2VfY29udGV4dCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgdXNlX3dyaXRlX2NvbnRleHQpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgdm9pZCBXcml0ZUhhc2goaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgV3JpdGVFcXVhbHMoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgV3JpdGVUb1N0cmluZyhpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY3NoYXJwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfTUFQX0ZJRUxEX0hfXworCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMTliZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZS5jYwpAQCAtMCwwICsxLDc3OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX29wdGlvbnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9kb2NfY29tbWVudC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9maWVsZF9iYXNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9uYW1lcy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNzaGFycCB7CisKK2Jvb2wgQ29tcGFyZUZpZWxkTnVtYmVycyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGQxLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGQyKSB7CisgIHJldHVybiBkMS0+bnVtYmVyKCkgPCBkMi0+bnVtYmVyKCk7Cit9CisKK01lc3NhZ2VHZW5lcmF0b3I6Ok1lc3NhZ2VHZW5lcmF0b3IoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyogb3B0aW9ucykKKyAgICA6IFNvdXJjZUdlbmVyYXRvckJhc2Uob3B0aW9ucyksCisgICAgICBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwKKyAgICAgIGhhc19iaXRfZmllbGRfY291bnRfKDApLAorICAgICAgZW5kX3RhZ18oR2V0R3JvdXBFbmRUYWcoZGVzY3JpcHRvcikpLAorICAgICAgaGFzX2V4dGVuc2lvbl9yYW5nZXNfKGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAvLyBmaWVsZHMgYnkgbnVtYmVyCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkc19ieV9udW1iZXJfLnB1c2hfYmFjayhkZXNjcmlwdG9yXy0+ZmllbGQoaSkpOworICB9CisgIHN0ZDo6c29ydChmaWVsZHNfYnlfbnVtYmVyXy5iZWdpbigpLCBmaWVsZHNfYnlfbnVtYmVyXy5lbmQoKSwKKyAgICAgICAgICAgIENvbXBhcmVGaWVsZE51bWJlcnMpOworCisgIGludCBwcmVzZW5jZV9iaXRfY291bnQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgIGlmIChSZXF1aXJlc1ByZXNlbmNlQml0KGZpZWxkKSkgeworICAgICAgcHJlc2VuY2VfYml0X2NvdW50Kys7CisgICAgICBpZiAoaGFzX2JpdF9maWVsZF9jb3VudF8gPT0gMCB8fCAocHJlc2VuY2VfYml0X2NvdW50ICUgMzIpID09IDApIHsKKyAgICAgICAgaGFzX2JpdF9maWVsZF9jb3VudF8rKzsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworTWVzc2FnZUdlbmVyYXRvcjo6fk1lc3NhZ2VHZW5lcmF0b3IoKSB7Cit9CisKK3N0ZDo6c3RyaW5nIE1lc3NhZ2VHZW5lcmF0b3I6OmNsYXNzX25hbWUoKSB7CisgIHJldHVybiBkZXNjcmlwdG9yXy0+bmFtZSgpOworfQorCitzdGQ6OnN0cmluZyBNZXNzYWdlR2VuZXJhdG9yOjpmdWxsX2NsYXNzX25hbWUoKSB7CisgIHJldHVybiBHZXRDbGFzc05hbWUoZGVzY3JpcHRvcl8pOworfQorCitjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgTWVzc2FnZUdlbmVyYXRvcjo6ZmllbGRzX2J5X251bWJlcigpIHsKKyAgcmV0dXJuIGZpZWxkc19ieV9udW1iZXJfOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkFkZERlcHJlY2F0ZWRGbGFnKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KCJbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGVdXG4iKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkFkZFNlcmlhbGl6YWJsZUF0dHJpYnV0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAodGhpcy0+b3B0aW9ucygpLT5zZXJpYWxpemFibGUpIHsKKyAgICBwcmludGVyLT5QcmludCgiW2dsb2JhbDo6U3lzdGVtLlNlcmlhbGl6YWJsZUF0dHJpYnV0ZV1cbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzOworICB2YXJzWyJjbGFzc19uYW1lIl0gPSBjbGFzc19uYW1lKCk7CisgIHZhcnNbImFjY2Vzc19sZXZlbCJdID0gY2xhc3NfYWNjZXNzX2xldmVsKCk7CisKKyAgV3JpdGVNZXNzYWdlRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIEFkZERlcHJlY2F0ZWRGbGFnKHByaW50ZXIpOworICBBZGRTZXJpYWxpemFibGVBdHRyaWJ1dGUocHJpbnRlcik7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFycywKKyAgICAiJGFjY2Vzc19sZXZlbCQgc2VhbGVkIHBhcnRpYWwgY2xhc3MgJGNsYXNzX25hbWUkIDogIik7CisKKyAgaWYgKGhhc19leHRlbnNpb25fcmFuZ2VzXykgeworICAgIHByaW50ZXItPlByaW50KHZhcnMsICJwYjo6SUV4dGVuZGFibGVNZXNzYWdlPCRjbGFzc19uYW1lJD5cbiIpOworICB9CisgIGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcnMsICJwYjo6SU1lc3NhZ2U8JGNsYXNzX25hbWUkPlxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIiNpZiAhR09PR0xFX1BST1RPQlVGX1JFRlNUUlVDVF9DT01QQVRJQklMSVRZX01PREVcbiIpOworICBwcmludGVyLT5QcmludCgiICAgICwgcGI6OklCdWZmZXJNZXNzYWdlXG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoIiNlbmRpZlxuIik7CisgIHByaW50ZXItPlByaW50KCJ7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgLy8gQWxsIHN0YXRpYyBmaWVsZHMgYW5kIHByb3BlcnRpZXMKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJzLAorICAgICAgInByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPCRjbGFzc19uYW1lJD4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjwkY2xhc3NfbmFtZSQ+KCgpID0+IG5ldyAkY2xhc3NfbmFtZSQoKSk7XG4iKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwcml2YXRlIHBiOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25GaWVsZHM7XG4iKTsKKworICBpZiAoaGFzX2V4dGVuc2lvbl9yYW5nZXNfKSB7CisgICAgaWYgKElzRGVzY3JpcHRvclByb3RvKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgICBwcmludGVyLT5QcmludCh2YXJzLCAiaW50ZXJuYWwgcGI6OkV4dGVuc2lvblNldDwkY2xhc3NfbmFtZSQ+IF9leHRlbnNpb25zO1xuIik7IC8vIEN1c3RvbU9wdGlvbnMgY29tcGF0aWJpbGl0eQorICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCh2YXJzLCAicHJpdmF0ZSBwYjo6RXh0ZW5zaW9uU2V0PCRjbGFzc19uYW1lJD4gX2V4dGVuc2lvbnM7XG4iKTsKKyAgICB9CisKKyAgICAvLyBhIHJlYWQtb25seSBwcm9wZXJ0eSBmb3IgZmFzdAorICAgIC8vIHJldHJpZXZhbCBvZiB0aGUgc2V0IGluIElzSW5pdGlhbGl6ZWQKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAgICAgICAgICAgICJwcml2YXRlIHBiOjpFeHRlbnNpb25TZXQ8JGNsYXNzX25hbWUkPiBfRXh0ZW5zaW9ucyB7IGdldCB7ICIKKyAgICAgICAgICAgICAgICAgICAicmV0dXJuIF9leHRlbnNpb25zOyB9IH1cbiIpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYXNfYml0X2ZpZWxkX2NvdW50XzsgaSsrKSB7CisgICAgLy8gZG9uJ3QgdXNlIGFycmF5cyBzaW5jZSBhbGwgYXJyYXlzIGFyZSBoZWFwIGFsbG9jYXRlZCwgc2F2aW5nIGFsbG9jYXRpb25zCisgICAgLy8gdXNlIGludHMgaW5zdGVhZCBvZiBieXRlcyBzaW5jZSBieXRlcyBsYWNrIGJpdHdpc2Ugb3BlcmF0b3JzLCBzYXZpbmcgY2FzdHMKKyAgICBwcmludGVyLT5QcmludCgicHJpdmF0ZSBpbnQgX2hhc0JpdHMkaSQ7XG4iLCAiaSIsIFN0ckNhdChpKSk7CisgIH0KKworICBXcml0ZUdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzKHByaW50ZXIpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFycywKKyAgICAgICJwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPCRjbGFzc19uYW1lJD4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfVxuXG4iKTsKKworICAvLyBBY2Nlc3MgdGhlIG1lc3NhZ2UgZGVzY3JpcHRvciB2aWEgdGhlIHJlbGV2YW50IGZpbGUgZGVzY3JpcHRvciBvciBjb250YWluaW5nIG1lc3NhZ2UgZGVzY3JpcHRvci4KKyAgaWYgKCFkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpIHsKKyAgICB2YXJzWyJkZXNjcmlwdG9yX2FjY2Vzc29yIl0gPSBHZXRSZWZsZWN0aW9uQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCkpCisgICAgICAgICsgIi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1siICsgU3RyQ2F0KGRlc2NyaXB0b3JfLT5pbmRleCgpKSArICJdIjsKKyAgfSBlbHNlIHsKKyAgICB2YXJzWyJkZXNjcmlwdG9yX2FjY2Vzc29yIl0gPSBHZXRDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKQorICAgICAgICArICIuRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1siICsgU3RyQ2F0KGRlc2NyaXB0b3JfLT5pbmRleCgpKSArICJdIjsKKyAgfQorCisgIFdyaXRlR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMocHJpbnRlcik7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcnMsCisgICAgInB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHtcbiIKKyAgICAiICBnZXQgeyByZXR1cm4gJGRlc2NyaXB0b3JfYWNjZXNzb3IkOyB9XG4iCisgICAgIn1cbiIKKyAgICAiXG4iKTsKKyAgV3JpdGVHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyhwcmludGVyKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFycywKKyAgICAicGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7XG4iCisgICAgIiAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH1cbiIKKyAgICAifVxuIgorICAgICJcbiIpOworCisgIC8vIFBhcmFtZXRlcmxlc3MgY29uc3RydWN0b3IgYW5kIHBhcnRpYWwgT25Db25zdHJ1Y3Rpb24gbWV0aG9kLgorICBXcml0ZUdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzKHByaW50ZXIpOworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJzLAorICAgICJwdWJsaWMgJGNsYXNzX25hbWUkKCkge1xuIgorICAgICIgIE9uQ29uc3RydWN0aW9uKCk7XG4iCisgICAgIn1cblxuIgorICAgICJwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTtcblxuIik7CisKKyAgR2VuZXJhdGVDbG9uaW5nQ29kZShwcmludGVyKTsKKyAgR2VuZXJhdGVGcmVlemluZ0NvZGUocHJpbnRlcik7CisKKyAgLy8gRmllbGRzL3Byb3BlcnRpZXMKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisKKyAgICAvLyBSYXRzOiB3ZSBsb3NlIHRoZSBkZWJ1ZyBjb21tZW50IGhlcmUgOigKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgXCIkZmllbGRfbmFtZSRcIiBmaWVsZC48L3N1bW1hcnk+XG4iCisgICAgICAicHVibGljIGNvbnN0IGludCAkZmllbGRfY29uc3RhbnRfbmFtZSQgPSAkaW5kZXgkO1xuIiwKKyAgICAgICJmaWVsZF9uYW1lIiwgZmllbGREZXNjcmlwdG9yLT5uYW1lKCksCisgICAgICAiZmllbGRfY29uc3RhbnRfbmFtZSIsIEdldEZpZWxkQ29uc3RhbnROYW1lKGZpZWxkRGVzY3JpcHRvciksCisgICAgICAiaW5kZXgiLCBTdHJDYXQoZmllbGREZXNjcmlwdG9yLT5udW1iZXIoKSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxGaWVsZEdlbmVyYXRvckJhc2U+IGdlbmVyYXRvcigKKyAgICAgICAgQ3JlYXRlRmllbGRHZW5lcmF0b3JJbnRlcm5hbChmaWVsZERlc2NyaXB0b3IpKTsKKyAgICBnZW5lcmF0b3ItPkdlbmVyYXRlTWVtYmVycyhwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorCisgIC8vIG9uZW9mIHByb3BlcnRpZXMgKGZvciByZWFsIG9uZW9mcywgd2hpY2ggY29tZSBiZWZvcmUgc3ludGhldGljIG9uZXMpCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnJlYWxfb25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSk7CisgICAgdmFyc1sibmFtZSJdID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShvbmVvZi0+bmFtZSgpLCBmYWxzZSk7CisgICAgdmFyc1sicHJvcGVydHlfbmFtZSJdID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShvbmVvZi0+bmFtZSgpLCB0cnVlKTsKKyAgICB2YXJzWyJvcmlnaW5hbF9uYW1lIl0gPSBvbmVvZi0+bmFtZSgpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgdmFycywKKyAgICAgICJwcml2YXRlIG9iamVjdCAkbmFtZSRfO1xuIgorICAgICAgIi8vLyA8c3VtbWFyeT5FbnVtIG9mIHBvc3NpYmxlIGNhc2VzIGZvciB0aGUgXCIkb3JpZ2luYWxfbmFtZSRcIiBvbmVvZi48L3N1bW1hcnk+XG4iCisgICAgICAicHVibGljIGVudW0gJHByb3BlcnR5X25hbWUkT25lb2ZDYXNlIHtcbiIpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJOb25lID0gMCxcbiIpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgb25lb2YtPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG9uZW9mLT5maWVsZChqKTsKKyAgICAgIHByaW50ZXItPlByaW50KCIkb25lb2ZfY2FzZV9uYW1lJCA9ICRpbmRleCQsXG4iLAorICAgICAgICAgICAgICAgICAgICAgIm9uZW9mX2Nhc2VfbmFtZSIsIEdldE9uZW9mQ2FzZU5hbWUoZmllbGQpLAorICAgICAgICAgICAgICAgICAgICAgImluZGV4IiwgU3RyQ2F0KGZpZWxkLT5udW1iZXIoKSkpOworICAgIH0KKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICAgIC8vIFRPRE86IFNob3VsZCB3ZSBwdXQgdGhlIG9uZW9mIC5wcm90byBjb21tZW50cyBoZXJlPworICAgIC8vIEl0J3MgdW5jbGVhciBleGFjdGx5IHdoZXJlIHRoZXkgc2hvdWxkIGdvLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgdmFycywKKyAgICAgICJwcml2YXRlICRwcm9wZXJ0eV9uYW1lJE9uZW9mQ2FzZSAkbmFtZSRDYXNlXyA9ICRwcm9wZXJ0eV9uYW1lJE9uZW9mQ2FzZS5Ob25lO1xuIik7CisgICAgV3JpdGVHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyhwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcnMsCisgICAgICAicHVibGljICRwcm9wZXJ0eV9uYW1lJE9uZW9mQ2FzZSAkcHJvcGVydHlfbmFtZSRDYXNlIHtcbiIKKyAgICAgICIgIGdldCB7IHJldHVybiAkbmFtZSRDYXNlXzsgfVxuIgorICAgICAgIn1cblxuIik7CisgICAgV3JpdGVHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyhwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcnMsCisgICAgICAicHVibGljIHZvaWQgQ2xlYXIkcHJvcGVydHlfbmFtZSQoKSB7XG4iCisgICAgICAiICAkbmFtZSRDYXNlXyA9ICRwcm9wZXJ0eV9uYW1lJE9uZW9mQ2FzZS5Ob25lO1xuIgorICAgICAgIiAgJG5hbWUkXyA9IG51bGw7XG4iCisgICAgICAifVxuXG4iKTsKKyAgfQorCisgIC8vIFN0YW5kYXJkIG1ldGhvZHMKKyAgR2VuZXJhdGVGcmFtZXdvcmtNZXRob2RzKHByaW50ZXIpOworICBHZW5lcmF0ZU1lc3NhZ2VTZXJpYWxpemF0aW9uTWV0aG9kcyhwcmludGVyKTsKKyAgR2VuZXJhdGVNZXJnaW5nTWV0aG9kcyhwcmludGVyKTsKKworICBpZiAoaGFzX2V4dGVuc2lvbl9yYW5nZXNfKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcnMsCisgICAgICAgICJwdWJsaWMgVFZhbHVlIEdldEV4dGVuc2lvbjxUVmFsdWU+KHBiOjpFeHRlbnNpb248JGNsYXNzX25hbWUkLCAiCisgICAgICAgICJUVmFsdWU+IGV4dGVuc2lvbikge1xuIgorICAgICAgICAiICByZXR1cm4gcGI6OkV4dGVuc2lvblNldC5HZXQocmVmIF9leHRlbnNpb25zLCBleHRlbnNpb24pO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAicHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxUVmFsdWU+ICIKKyAgICAgICAgIkdldEV4dGVuc2lvbjxUVmFsdWU+KHBiOjpSZXBlYXRlZEV4dGVuc2lvbjwkY2xhc3NfbmFtZSQsIFRWYWx1ZT4gIgorICAgICAgICAiZXh0ZW5zaW9uKSB7XG4iCisgICAgICAgICIgIHJldHVybiBwYjo6RXh0ZW5zaW9uU2V0LkdldChyZWYgX2V4dGVuc2lvbnMsIGV4dGVuc2lvbik7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPFRWYWx1ZT4gIgorICAgICAgICAiR2V0T3JJbml0aWFsaXplRXh0ZW5zaW9uPFRWYWx1ZT4ocGI6OlJlcGVhdGVkRXh0ZW5zaW9uPCRjbGFzc19uYW1lJCwgIgorICAgICAgICAiVFZhbHVlPiBleHRlbnNpb24pIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuIHBiOjpFeHRlbnNpb25TZXQuR2V0T3JJbml0aWFsaXplKHJlZiBfZXh0ZW5zaW9ucywgIgorICAgICAgICAiZXh0ZW5zaW9uKTtcbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgInB1YmxpYyB2b2lkIFNldEV4dGVuc2lvbjxUVmFsdWU+KHBiOjpFeHRlbnNpb248JGNsYXNzX25hbWUkLCBUVmFsdWU+ICIKKyAgICAgICAgImV4dGVuc2lvbiwgVFZhbHVlIHZhbHVlKSB7XG4iCisgICAgICAgICIgIHBiOjpFeHRlbnNpb25TZXQuU2V0KHJlZiBfZXh0ZW5zaW9ucywgZXh0ZW5zaW9uLCB2YWx1ZSk7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJwdWJsaWMgYm9vbCBIYXNFeHRlbnNpb248VFZhbHVlPihwYjo6RXh0ZW5zaW9uPCRjbGFzc19uYW1lJCwgVFZhbHVlPiAiCisgICAgICAgICJleHRlbnNpb24pIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuIHBiOjpFeHRlbnNpb25TZXQuSGFzKHJlZiBfZXh0ZW5zaW9ucywgZXh0ZW5zaW9uKTtcbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgInB1YmxpYyB2b2lkIENsZWFyRXh0ZW5zaW9uPFRWYWx1ZT4ocGI6OkV4dGVuc2lvbjwkY2xhc3NfbmFtZSQsICIKKyAgICAgICAgIlRWYWx1ZT4gZXh0ZW5zaW9uKSB7XG4iCisgICAgICAgICIgIHBiOjpFeHRlbnNpb25TZXQuQ2xlYXIocmVmIF9leHRlbnNpb25zLCBleHRlbnNpb24pO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAicHVibGljIHZvaWQgIgorICAgICAgICAiQ2xlYXJFeHRlbnNpb248VFZhbHVlPihwYjo6UmVwZWF0ZWRFeHRlbnNpb248JGNsYXNzX25hbWUkLCBUVmFsdWU+ICIKKyAgICAgICAgImV4dGVuc2lvbikge1xuIgorICAgICAgICAiICBwYjo6RXh0ZW5zaW9uU2V0LkNsZWFyKHJlZiBfZXh0ZW5zaW9ucywgZXh0ZW5zaW9uKTtcbiIKKyAgICAgICAgIn1cblxuIik7CisgIH0KKworICAvLyBOZXN0ZWQgbWVzc2FnZXMgYW5kIGVudW1zCisgIGlmIChIYXNOZXN0ZWRHZW5lcmF0ZWRUeXBlcygpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJzLAorICAgICAgIiNyZWdpb24gTmVzdGVkIHR5cGVzXG4iCisgICAgICAiLy8vIDxzdW1tYXJ5PkNvbnRhaW5lciBmb3IgbmVzdGVkIHR5cGVzIGRlY2xhcmVkIGluIHRoZSAkY2xhc3NfbmFtZSQgbWVzc2FnZSB0eXBlLjwvc3VtbWFyeT5cbiIpOworICAgIFdyaXRlR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoInB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7XG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgICBFbnVtR2VuZXJhdG9yIGVudW1HZW5lcmF0b3IoZGVzY3JpcHRvcl8tPmVudW1fdHlwZShpKSwgdGhpcy0+b3B0aW9ucygpKTsKKyAgICAgIGVudW1HZW5lcmF0b3IuR2VuZXJhdGUocHJpbnRlcik7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgLy8gRG9uJ3QgZ2VuZXJhdGUgbmVzdGVkIHR5cGVzIGZvciBtYXBzLi4uCisgICAgICBpZiAoIUlzTWFwRW50cnlNZXNzYWdlKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSkpIHsKKyAgICAgICAgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlR2VuZXJhdG9yKAorICAgICAgICAgICAgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpLCB0aGlzLT5vcHRpb25zKCkpOworICAgICAgICBtZXNzYWdlR2VuZXJhdG9yLkdlbmVyYXRlKHByaW50ZXIpOworICAgICAgfQorICAgIH0KKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIKKyAgICAgICAgICAgICAgICAgICAiI2VuZHJlZ2lvblxuIgorICAgICAgICAgICAgICAgICAgICJcbiIpOworICB9CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcnMsCisgICAgICAiI3JlZ2lvbiBFeHRlbnNpb25zXG4iCisgICAgICAiLy8vIDxzdW1tYXJ5PkNvbnRhaW5lciBmb3IgZXh0ZW5zaW9ucyBmb3Igb3RoZXIgbWVzc2FnZXMgZGVjbGFyZWQgaW4gdGhlICRjbGFzc19uYW1lJCBtZXNzYWdlIHR5cGUuPC9zdW1tYXJ5PlxuIik7CisgICAgV3JpdGVHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyhwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgicHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIEV4dGVuc2lvbnMge1xuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgICAgc3RkOjp1bmlxdWVfcHRyPEZpZWxkR2VuZXJhdG9yQmFzZT4gZ2VuZXJhdG9yKAorICAgICAgICBDcmVhdGVGaWVsZEdlbmVyYXRvckludGVybmFsKGRlc2NyaXB0b3JfLT5leHRlbnNpb24oaSkpKTsKKyAgICAgIGdlbmVyYXRvci0+R2VuZXJhdGVFeHRlbnNpb25Db2RlKHByaW50ZXIpOworICAgIH0KKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAifVxuIgorICAgICAgIiNlbmRyZWdpb25cbiIKKyAgICAgICJcbiIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7CisgIHByaW50ZXItPlByaW50KCJcbiIpOworfQorCisvLyBIZWxwZXIgdG8gd29yayBvdXQgd2hldGhlciB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgY2xhc3MgdG8gaG9sZCBuZXN0ZWQgdHlwZXMvZW51bXMuCisvLyBPbmx5IHRyaWNreSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZ2VuZXJhdGUgbWFwIGVudHJ5IHR5cGVzLgorYm9vbCBNZXNzYWdlR2VuZXJhdG9yOjpIYXNOZXN0ZWRHZW5lcmF0ZWRUeXBlcygpCit7CisgIGlmIChkZXNjcmlwdG9yXy0+ZW51bV90eXBlX2NvdW50KCkgPiAwKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKCFJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSkpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlQ2xvbmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzOworICBXcml0ZUdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzKHByaW50ZXIpOworICB2YXJzWyJjbGFzc19uYW1lIl0gPSBjbGFzc19uYW1lKCk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFycywKKyAgICAicHVibGljICRjbGFzc19uYW1lJCgkY2xhc3NfbmFtZSQgb3RoZXIpIDogdGhpcygpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYXNfYml0X2ZpZWxkX2NvdW50XzsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIl9oYXNCaXRzJGkkID0gb3RoZXIuX2hhc0JpdHMkaSQ7XG4iLCAiaSIsIFN0ckNhdChpKSk7CisgIH0KKyAgLy8gQ2xvbmUgbm9uLW9uZW9mIGZpZWxkcyBmaXJzdCAodHJlYXRpbmcgb3B0aW9uYWwgcHJvdG8zIGZpZWxkcyBhcyBub24tb25lb2YpCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgaWYgKGZpZWxkLT5yZWFsX2NvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxGaWVsZEdlbmVyYXRvckJhc2U+IGdlbmVyYXRvcihDcmVhdGVGaWVsZEdlbmVyYXRvckludGVybmFsKGZpZWxkKSk7CisgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZUNsb25pbmdDb2RlKHByaW50ZXIpOworICB9CisgIC8vIENsb25lIGp1c3QgdGhlIHJpZ2h0IGZpZWxkIGZvciBlYWNoIHJlYWwgb25lb2YKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+cmVhbF9vbmVvZl9kZWNsX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2YgPSBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKTsKKyAgICB2YXJzWyJuYW1lIl0gPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG9uZW9mLT5uYW1lKCksIGZhbHNlKTsKKyAgICB2YXJzWyJwcm9wZXJ0eV9uYW1lIl0gPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG9uZW9mLT5uYW1lKCksIHRydWUpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsICJzd2l0Y2ggKG90aGVyLiRwcm9wZXJ0eV9uYW1lJENhc2UpIHtcbiIpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgb25lb2YtPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG9uZW9mLT5maWVsZChqKTsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxGaWVsZEdlbmVyYXRvckJhc2U+IGdlbmVyYXRvcihDcmVhdGVGaWVsZEdlbmVyYXRvckludGVybmFsKGZpZWxkKSk7CisgICAgICB2YXJzWyJvbmVvZl9jYXNlX25hbWUiXSA9IEdldE9uZW9mQ2FzZU5hbWUoZmllbGQpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFycywKKyAgICAgICAgICAiY2FzZSAkcHJvcGVydHlfbmFtZSRPbmVvZkNhc2UuJG9uZW9mX2Nhc2VfbmFtZSQ6XG4iKTsKKyAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZUNsb25pbmdDb2RlKHByaW50ZXIpOworICAgICAgcHJpbnRlci0+UHJpbnQoImJyZWFrO1xuIik7CisgICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgfQorICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKKyAgfQorICAvLyBDbG9uZSB1bmtub3duIGZpZWxkcworICBwcmludGVyLT5QcmludCgKKyAgICAgICJfdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuQ2xvbmUob3RoZXIuX3Vua25vd25GaWVsZHMpO1xuIik7CisgIGlmIChoYXNfZXh0ZW5zaW9uX3Jhbmdlc18pIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIl9leHRlbnNpb25zID0gcGI6OkV4dGVuc2lvblNldC5DbG9uZShvdGhlci5fZXh0ZW5zaW9ucyk7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7CisKKyAgV3JpdGVHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyhwcmludGVyKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFycywKKyAgICAicHVibGljICRjbGFzc19uYW1lJCBDbG9uZSgpIHtcbiIKKyAgICAiICByZXR1cm4gbmV3ICRjbGFzc19uYW1lJCh0aGlzKTtcbiIKKyAgICAifVxuXG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUZyZWV6aW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlRnJhbWV3b3JrTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJjbGFzc19uYW1lIl0gPSBjbGFzc19uYW1lKCk7CisKKyAgICAvLyBFcXVhbGl0eQorICAgIFdyaXRlR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcnMsCisgICAgICAgICJwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7XG4iCisgICAgICAgICIgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgJGNsYXNzX25hbWUkKTtcbiIKKyAgICAgICAgIn1cblxuIik7CisgICAgV3JpdGVHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyhwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFycywKKyAgICAgICAgInB1YmxpYyBib29sIEVxdWFscygkY2xhc3NfbmFtZSQgb3RoZXIpIHtcbiIKKyAgICAgICAgIiAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHtcbiIKKyAgICAgICAgIiAgICByZXR1cm4gZmFsc2U7XG4iCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIiAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHtcbiIKKyAgICAgICAgIiAgICByZXR1cm4gdHJ1ZTtcbiIKKyAgICAgICAgIiAgfVxuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RmllbGRHZW5lcmF0b3JCYXNlPiBnZW5lcmF0b3IoCisgICAgICAgICAgICBDcmVhdGVGaWVsZEdlbmVyYXRvckludGVybmFsKGRlc2NyaXB0b3JfLT5maWVsZChpKSkpOworICAgICAgICBnZW5lcmF0b3ItPldyaXRlRXF1YWxzKHByaW50ZXIpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5yZWFsX29uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgICBwcmludGVyLT5QcmludCgiaWYgKCRwcm9wZXJ0eV9uYW1lJENhc2UgIT0gb3RoZXIuJHByb3BlcnR5X25hbWUkQ2FzZSkgcmV0dXJuIGZhbHNlO1xuIiwKKyAgICAgICAgICAicHJvcGVydHlfbmFtZSIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKSwgdHJ1ZSkpOworICAgIH0KKyAgICBpZiAoaGFzX2V4dGVuc2lvbl9yYW5nZXNfKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiaWYgKCFFcXVhbHMoX2V4dGVuc2lvbnMsIG90aGVyLl9leHRlbnNpb25zKSkge1xuIgorICAgICAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgICAifVxuIik7CisgICAgfQorICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiAgcmV0dXJuIEVxdWFscyhfdW5rbm93bkZpZWxkcywgb3RoZXIuX3Vua25vd25GaWVsZHMpO1xuIgorICAgICAgICAifVxuXG4iKTsKKworICAgIC8vIEdldEhhc2hDb2RlCisgICAgLy8gU3RhcnQgd2l0aCBhIG5vbi16ZXJvIHZhbHVlIHRvIGVhc2lseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIG51bGwgYW5kICJlbXB0eSIgbWVzc2FnZXMuCisgICAgV3JpdGVHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyhwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7XG4iCisgICAgICAgICIgIGludCBoYXNoID0gMTtcbiIpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgc3RkOjp1bmlxdWVfcHRyPEZpZWxkR2VuZXJhdG9yQmFzZT4gZ2VuZXJhdG9yKAorICAgICAgICAgICAgQ3JlYXRlRmllbGRHZW5lcmF0b3JJbnRlcm5hbChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpKTsKKyAgICAgICAgZ2VuZXJhdG9yLT5Xcml0ZUhhc2gocHJpbnRlcik7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnJlYWxfb25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJoYXNoIF49IChpbnQpICRuYW1lJENhc2VfO1xuIiwKKyAgICAgICAgICAibmFtZSIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKSwgZmFsc2UpKTsKKyAgICB9CisgICAgaWYgKGhhc19leHRlbnNpb25fcmFuZ2VzXykgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpZiAoX2V4dGVuc2lvbnMgIT0gbnVsbCkge1xuIgorICAgICAgICAiICBoYXNoIF49IF9leHRlbnNpb25zLkdldEhhc2hDb2RlKCk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpZiAoX3Vua25vd25GaWVsZHMgIT0gbnVsbCkge1xuIgorICAgICAgICAiICBoYXNoIF49IF91bmtub3duRmllbGRzLkdldEhhc2hDb2RlKCk7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJyZXR1cm4gaGFzaDtcbiIpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKKworICAgIFdyaXRlR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkge1xuIgorICAgICAgICAiICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpO1xuIgorICAgICAgICAifVxuXG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZU1lc3NhZ2VTZXJpYWxpemF0aW9uTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBXcml0ZUdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzKHByaW50ZXIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHtcbiIpOworICBwcmludGVyLT5QcmludCgiI2lmICFHT09HTEVfUFJPVE9CVUZfUkVGU1RSVUNUX0NPTVBBVElCSUxJVFlfTU9ERVxuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5QcmludCgib3V0cHV0LldyaXRlUmF3TWVzc2FnZSh0aGlzKTtcbiIpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCIjZWxzZVxuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBHZW5lcmF0ZVdyaXRlVG9Cb2R5KHByaW50ZXIsIGZhbHNlKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgiI2VuZGlmXG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQoIiNpZiAhR09PR0xFX1BST1RPQlVGX1JFRlNUUlVDVF9DT01QQVRJQklMSVRZX01PREVcbiIpOworICBXcml0ZUdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzKHByaW50ZXIpOworICBwcmludGVyLT5QcmludCgidm9pZCBwYjo6SUJ1ZmZlck1lc3NhZ2UuSW50ZXJuYWxXcml0ZVRvKHJlZiBwYjo6V3JpdGVDb250ZXh0IG91dHB1dCkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBHZW5lcmF0ZVdyaXRlVG9Cb2R5KHByaW50ZXIsIHRydWUpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoIiNlbmRpZlxuXG4iKTsKKworICBXcml0ZUdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzKHByaW50ZXIpOworICBwcmludGVyLT5QcmludCgKKyAgICAicHVibGljIGludCBDYWxjdWxhdGVTaXplKCkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5QcmludCgiaW50IHNpemUgPSAwO1xuIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxGaWVsZEdlbmVyYXRvckJhc2U+IGdlbmVyYXRvcigKKyAgICAgICAgQ3JlYXRlRmllbGRHZW5lcmF0b3JJbnRlcm5hbChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpKTsKKyAgICBnZW5lcmF0b3ItPkdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKHByaW50ZXIpOworICB9CisKKyAgaWYgKGhhc19leHRlbnNpb25fcmFuZ2VzXykgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgImlmIChfZXh0ZW5zaW9ucyAhPSBudWxsKSB7XG4iCisgICAgICAiICBzaXplICs9IF9leHRlbnNpb25zLkNhbGN1bGF0ZVNpemUoKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJpZiAoX3Vua25vd25GaWVsZHMgIT0gbnVsbCkge1xuIgorICAgICIgIHNpemUgKz0gX3Vua25vd25GaWVsZHMuQ2FsY3VsYXRlU2l6ZSgpO1xuIgorICAgICJ9XG4iKTsKKworICBwcmludGVyLT5QcmludCgicmV0dXJuIHNpemU7XG4iKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVdyaXRlVG9Cb2R5KGlvOjpQcmludGVyKiBwcmludGVyLCBib29sIHVzZV93cml0ZV9jb250ZXh0KSB7CisgIC8vIFNlcmlhbGl6ZSBhbGwgdGhlIGZpZWxkcworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkc19ieV9udW1iZXIoKS5zaXplKCk7IGkrKykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxGaWVsZEdlbmVyYXRvckJhc2U+IGdlbmVyYXRvcigKKyAgICAgIENyZWF0ZUZpZWxkR2VuZXJhdG9ySW50ZXJuYWwoZmllbGRzX2J5X251bWJlcigpW2ldKSk7CisgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKHByaW50ZXIsIHVzZV93cml0ZV9jb250ZXh0KTsKKyAgfQorCisgIGlmIChoYXNfZXh0ZW5zaW9uX3Jhbmdlc18pIHsKKyAgICAvLyBTZXJpYWxpemUgZXh0ZW5zaW9ucworICAgIHByaW50ZXItPlByaW50KAorICAgICAgdXNlX3dyaXRlX2NvbnRleHQKKyAgICAgID8gImlmIChfZXh0ZW5zaW9ucyAhPSBudWxsKSB7XG4iCisgICAgICAgICIgIF9leHRlbnNpb25zLldyaXRlVG8ocmVmIG91dHB1dCk7XG4iCisgICAgICAgICJ9XG4iCisgICAgICA6ICJpZiAoX2V4dGVuc2lvbnMgIT0gbnVsbCkge1xuIgorICAgICAgICAiICBfZXh0ZW5zaW9ucy5Xcml0ZVRvKG91dHB1dCk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZSB1bmtub3duIGZpZWxkcworICBwcmludGVyLT5QcmludCgKKyAgICB1c2Vfd3JpdGVfY29udGV4dAorICAgID8gImlmIChfdW5rbm93bkZpZWxkcyAhPSBudWxsKSB7XG4iCisgICAgICAiICBfdW5rbm93bkZpZWxkcy5Xcml0ZVRvKHJlZiBvdXRwdXQpO1xuIgorICAgICAgIn1cbiIKKyAgICA6ICJpZiAoX3Vua25vd25GaWVsZHMgIT0gbnVsbCkge1xuIgorICAgICAgIiAgX3Vua25vd25GaWVsZHMuV3JpdGVUbyhvdXRwdXQpO1xuIgorICAgICAgIn1cbiIpOworCisgIC8vIFRPRE8oam9uc2tlZXQpOiBNZW1vaXplIHNpemUgb2YgZnJvemVuIG1lc3NhZ2VzPworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlTWVyZ2luZ01ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gTm90ZTogIFRoZXNlIGFyZSBzZXBhcmF0ZSBmcm9tIEdlbmVyYXRlTWVzc2FnZVNlcmlhbGl6YXRpb25NZXRob2RzKCkKKyAgLy8gICBiZWNhdXNlIHRoZXkgbmVlZCB0byBiZSBnZW5lcmF0ZWQgZXZlbiBmb3IgbWVzc2FnZXMgdGhhdCBhcmUgb3B0aW1pemVkCisgIC8vICAgZm9yIGNvZGUgc2l6ZS4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzOworICB2YXJzWyJjbGFzc19uYW1lIl0gPSBjbGFzc19uYW1lKCk7CisKKyAgV3JpdGVHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyhwcmludGVyKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFycywKKyAgICAicHVibGljIHZvaWQgTWVyZ2VGcm9tKCRjbGFzc19uYW1lJCBvdGhlcikge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAiaWYgKG90aGVyID09IG51bGwpIHtcbiIKKyAgICAiICByZXR1cm47XG4iCisgICAgIn1cbiIpOworICAvLyBNZXJnZSBub24tb25lb2YgZmllbGRzLCB0cmVhdGluZyBvcHRpb25hbCBwcm90bzMgZmllbGRzIGFzIG5vcm1hbCBmaWVsZHMKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBpZiAoZmllbGQtPnJlYWxfY29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEZpZWxkR2VuZXJhdG9yQmFzZT4gZ2VuZXJhdG9yKENyZWF0ZUZpZWxkR2VuZXJhdG9ySW50ZXJuYWwoZmllbGQpKTsKKyAgICBnZW5lcmF0b3ItPkdlbmVyYXRlTWVyZ2luZ0NvZGUocHJpbnRlcik7CisgIH0KKyAgLy8gTWVyZ2Ugb25lb2YgZmllbGRzIChmb3Igbm9uLXN5bnRoZXRpYyBvbmVvZnMpCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnJlYWxfb25lb2ZfZGVjbF9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSk7CisgICAgdmFyc1sibmFtZSJdID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShvbmVvZi0+bmFtZSgpLCBmYWxzZSk7CisgICAgdmFyc1sicHJvcGVydHlfbmFtZSJdID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShvbmVvZi0+bmFtZSgpLCB0cnVlKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLCAic3dpdGNoIChvdGhlci4kcHJvcGVydHlfbmFtZSRDYXNlKSB7XG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG9uZW9mLT5maWVsZF9jb3VudCgpOyBqKyspIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBvbmVvZi0+ZmllbGQoaik7CisgICAgICB2YXJzWyJvbmVvZl9jYXNlX25hbWUiXSA9IEdldE9uZW9mQ2FzZU5hbWUoZmllbGQpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcnMsCisgICAgICAgICJjYXNlICRwcm9wZXJ0eV9uYW1lJE9uZW9mQ2FzZS4kb25lb2ZfY2FzZV9uYW1lJDpcbiIpOworICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RmllbGRHZW5lcmF0b3JCYXNlPiBnZW5lcmF0b3IoQ3JlYXRlRmllbGRHZW5lcmF0b3JJbnRlcm5hbChmaWVsZCkpOworICAgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZU1lcmdpbmdDb2RlKHByaW50ZXIpOworICAgICAgcHJpbnRlci0+UHJpbnQoImJyZWFrO1xuIik7CisgICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgfQorICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKKyAgfQorICAvLyBNZXJnZSBleHRlbnNpb25zCisgIGlmIChoYXNfZXh0ZW5zaW9uX3Jhbmdlc18pIHsKKyAgICBwcmludGVyLT5QcmludCgicGI6OkV4dGVuc2lvblNldC5NZXJnZUZyb20ocmVmIF9leHRlbnNpb25zLCBvdGhlci5fZXh0ZW5zaW9ucyk7XG4iKTsKKyAgfQorCisgIC8vIE1lcmdlIHVua25vd24gZmllbGRzLgorICBwcmludGVyLT5QcmludCgKKyAgICAgICJfdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuTWVyZ2VGcm9tKF91bmtub3duRmllbGRzLCBvdGhlci5fdW5rbm93bkZpZWxkcyk7XG4iKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOworCisgIFdyaXRlR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZXMocHJpbnRlcik7CisgIHByaW50ZXItPlByaW50KCJwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHtcbiIpOworICBwcmludGVyLT5QcmludCgiI2lmICFHT09HTEVfUFJPVE9CVUZfUkVGU1RSVUNUX0NPTVBBVElCSUxJVFlfTU9ERVxuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5QcmludCgiaW5wdXQuUmVhZFJhd01lc3NhZ2UodGhpcyk7XG4iKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgiI2Vsc2VcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgR2VuZXJhdGVNYWluUGFyc2VMb29wKHByaW50ZXIsIGZhbHNlKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgiI2VuZGlmXG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQoIiNpZiAhR09PR0xFX1BST1RPQlVGX1JFRlNUUlVDVF9DT01QQVRJQklMSVRZX01PREVcbiIpOworICBXcml0ZUdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzKHByaW50ZXIpOworICBwcmludGVyLT5QcmludCgidm9pZCBwYjo6SUJ1ZmZlck1lc3NhZ2UuSW50ZXJuYWxNZXJnZUZyb20ocmVmIHBiOjpQYXJzZUNvbnRleHQgaW5wdXQpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgR2VuZXJhdGVNYWluUGFyc2VMb29wKHByaW50ZXIsIHRydWUpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsgLy8gbWV0aG9kCisgIHByaW50ZXItPlByaW50KCIjZW5kaWZcblxuIik7CisKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZU1haW5QYXJzZUxvb3AoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgdXNlX3BhcnNlX2NvbnRleHQpIHsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzOworICB2YXJzWyJtYXliZV9yZWZfaW5wdXQiXSA9IHVzZV9wYXJzZV9jb250ZXh0ID8gInJlZiBpbnB1dCIgOiAiaW5wdXQiOworCisgIHByaW50ZXItPlByaW50KAorICAgICJ1aW50IHRhZztcbiIKKyAgICAid2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHtcbiIKKyAgICAiICBzd2l0Y2godGFnKSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPkluZGVudCgpOworICBpZiAoZW5kX3RhZ18gIT0gMCkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiY2FzZSAkZW5kX3RhZyQ6XG4iCisgICAgICAgICIgIHJldHVybjtcbiIsCisgICAgICAgICJlbmRfdGFnIiwgU3RyQ2F0KGVuZF90YWdfKSk7CisgIH0KKyAgaWYgKGhhc19leHRlbnNpb25fcmFuZ2VzXykgeworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiZGVmYXVsdDpcbiIKKyAgICAgICIgIGlmICghcGI6OkV4dGVuc2lvblNldC5UcnlNZXJnZUZpZWxkRnJvbShyZWYgX2V4dGVuc2lvbnMsICRtYXliZV9yZWZfaW5wdXQkKSkge1xuIgorICAgICAgIiAgICBfdW5rbm93bkZpZWxkcyA9IHBiOjpVbmtub3duRmllbGRTZXQuTWVyZ2VGaWVsZEZyb20oX3Vua25vd25GaWVsZHMsICRtYXliZV9yZWZfaW5wdXQkKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIGJyZWFrO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJkZWZhdWx0OlxuIgorICAgICAgIiAgX3Vua25vd25GaWVsZHMgPSBwYjo6VW5rbm93bkZpZWxkU2V0Lk1lcmdlRmllbGRGcm9tKF91bmtub3duRmllbGRzLCAkbWF5YmVfcmVmX2lucHV0JCk7XG4iCisgICAgICAiICBicmVhaztcbiIpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzX2J5X251bWJlcigpLnNpemUoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGZpZWxkc19ieV9udW1iZXIoKVtpXTsKKyAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIHd0ID0KKyAgICAgICAgaW50ZXJuYWw6OldpcmVGb3JtYXQ6OldpcmVUeXBlRm9yRmllbGRUeXBlKGZpZWxkLT50eXBlKCkpOworICAgIHVpbnQzMl90IHRhZyA9IGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC0+bnVtYmVyKCksIHd0KTsKKyAgICAvLyBIYW5kbGUgYm90aCBwYWNrZWQgYW5kIHVucGFja2VkIHJlcGVhdGVkIGZpZWxkcyB3aXRoIHRoZSBzYW1lIFJlYWQqQXJyYXkgY2FsbDsKKyAgICAvLyB0aGUgdHdvIGdlbmVyYXRlZCBjYXNlcyBhcmUgdGhlIHBhY2tlZCBhbmQgdW5wYWNrZWQgdGFncy4KKyAgICAvLyBUT0RPKGpvbnNrZWV0KTogQ2hlY2sgdGhhdCBpc19wYWNrYWJsZSBpcyBlcXVpdmFsZW50IHRvCisgICAgLy8gaXNfcmVwZWF0ZWQgJiYgd3QgaW4geyBWQVJJTlQsIEZJWEVEMzIsIEZJWEVENjQgfS4KKyAgICAvLyBJdCBsb29rcyBsaWtlIGl0IGlzLi4uCisgICAgaWYgKGZpZWxkLT5pc19wYWNrYWJsZSgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImNhc2UgJHBhY2tlZF90YWckOlxuIiwKKyAgICAgICAgInBhY2tlZF90YWciLAorICAgICAgICBTdHJDYXQoCisgICAgICAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoCisgICAgICAgICAgICAgICAgZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkpKTsKKyAgICB9CisKKyAgICBwcmludGVyLT5QcmludCgiY2FzZSAkdGFnJDoge1xuIiwgInRhZyIsIFN0ckNhdCh0YWcpKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RmllbGRHZW5lcmF0b3JCYXNlPiBnZW5lcmF0b3IoCisgICAgICAgIENyZWF0ZUZpZWxkR2VuZXJhdG9ySW50ZXJuYWwoZmllbGQpKTsKKyAgICBnZW5lcmF0b3ItPkdlbmVyYXRlUGFyc2luZ0NvZGUocHJpbnRlciwgdXNlX3BhcnNlX2NvbnRleHQpOworICAgIHByaW50ZXItPlByaW50KCJicmVhaztcbiIpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgIH0KKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7IC8vIHN3aXRjaAorICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsgLy8gd2hpbGUKK30KKworLy8gaXQncyBhIHdhc3RlIG9mIHNwYWNlIHRvIHRyYWNrIHByZXNlbmNlIGZvciBhbGwgdmFsdWVzLCBzbyB3ZSBvbmx5IHRyYWNrIHRoZW0gaWYgdGhleSdyZSBub3QgbnVsbGFibGUKK2ludCBNZXNzYWdlR2VuZXJhdG9yOjpHZXRQcmVzZW5jZUluZGV4KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBpZiAoIVJlcXVpcmVzUHJlc2VuY2VCaXQoZGVzY3JpcHRvcikpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpbnQgaW5kZXggPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkc19ieV9udW1iZXIoKS5zaXplKCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBmaWVsZHNfYnlfbnVtYmVyKClbaV07CisgICAgaWYgKGZpZWxkID09IGRlc2NyaXB0b3IpIHsKKyAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisgICAgaWYgKFJlcXVpcmVzUHJlc2VuY2VCaXQoZmllbGQpKSB7CisgICAgICBpbmRleCsrOworICAgIH0KKyAgfQorICBHT09HTEVfTE9HKERGQVRBTCk8PCAiQ291bGQgbm90IGZpbmQgcHJlc2VuY2UgaW5kZXggZm9yIGZpZWxkICIgPDwgZGVzY3JpcHRvci0+bmFtZSgpOworICByZXR1cm4gLTE7Cit9CisKK0ZpZWxkR2VuZXJhdG9yQmFzZSogTWVzc2FnZUdlbmVyYXRvcjo6Q3JlYXRlRmllbGRHZW5lcmF0b3JJbnRlcm5hbCgKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIENyZWF0ZUZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IsIEdldFByZXNlbmNlSW5kZXgoZGVzY3JpcHRvciksIHRoaXMtPm9wdGlvbnMoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjc2hhcnAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZS5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDI3NjdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2UuaApAQCAtMCwwICsxLDk0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX01FU1NBR0VfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfTUVTU0FHRV9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9zb3VyY2VfZ2VuZXJhdG9yX2Jhc2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3NoYXJwIHsKKworY2xhc3MgRmllbGRHZW5lcmF0b3JCYXNlOworCitjbGFzcyBNZXNzYWdlR2VuZXJhdG9yIDogcHVibGljIFNvdXJjZUdlbmVyYXRvckJhc2UgeworIHB1YmxpYzoKKyAgTWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zKiBvcHRpb25zKTsKKyAgfk1lc3NhZ2VHZW5lcmF0b3IoKTsKKworICBNZXNzYWdlR2VuZXJhdG9yKGNvbnN0IE1lc3NhZ2VHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKyAgTWVzc2FnZUdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2VHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKworICB2b2lkIEdlbmVyYXRlQ2xvbmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlRnJlZXppbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZUZyYW1ld29ya01ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworIHByaXZhdGU6CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHNfYnlfbnVtYmVyXzsKKyAgaW50IGhhc19iaXRfZmllbGRfY291bnRfOworICB1aW50IGVuZF90YWdfOworICBib29sIGhhc19leHRlbnNpb25fcmFuZ2VzXzsKKworICB2b2lkIEdlbmVyYXRlTWVzc2FnZVNlcmlhbGl6YXRpb25NZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVdyaXRlVG9Cb2R5KGlvOjpQcmludGVyKiBwcmludGVyLCBib29sIHVzZV93cml0ZV9jb250ZXh0KTsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZU1haW5QYXJzZUxvb3AoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgdXNlX3BhcnNlX2NvbnRleHQpOworCisgIGludCBHZXRQcmVzZW5jZUluZGV4KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIEZpZWxkR2VuZXJhdG9yQmFzZSogQ3JlYXRlRmllbGRHZW5lcmF0b3JJbnRlcm5hbCgKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKKyAgYm9vbCBIYXNOZXN0ZWRHZW5lcmF0ZWRUeXBlcygpOworCisgIHZvaWQgQWRkRGVwcmVjYXRlZEZsYWcoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEFkZFNlcmlhbGl6YWJsZUF0dHJpYnV0ZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZSgpOworICBzdGQ6OnN0cmluZyBmdWxsX2NsYXNzX25hbWUoKTsKKworICAvLyBmaWVsZCBkZXNjcmlwdG9ycyBzb3J0ZWQgYnkgbnVtYmVyCisgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+JiBmaWVsZHNfYnlfbnVtYmVyKCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY3NoYXJwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfTUVTU0FHRV9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlX2ZpZWxkLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2VfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3ZDAxZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlX2ZpZWxkLmNjCkBAIC0wLDAgKzEsMjkzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2VfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9vcHRpb25zLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3NoYXJwIHsKKworTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXNlbmNlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zICpvcHRpb25zKQorICAgIDogRmllbGRHZW5lcmF0b3JCYXNlKGRlc2NyaXB0b3IsIHByZXNlbmNlSW5kZXgsIG9wdGlvbnMpIHsKKyAgaWYgKCFTdXBwb3J0c1ByZXNlbmNlQXBpKGRlc2NyaXB0b3JfKSkgeworICAgIHZhcmlhYmxlc19bImhhc19wcm9wZXJ0eV9jaGVjayJdID0gbmFtZSgpICsgIl8gIT0gbnVsbCI7CisgICAgdmFyaWFibGVzX1siaGFzX25vdF9wcm9wZXJ0eV9jaGVjayJdID0gbmFtZSgpICsgIl8gPT0gbnVsbCI7CisgIH0KK30KKworTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjp+TWVzc2FnZUZpZWxkR2VuZXJhdG9yKCkgeworCit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAicHJpdmF0ZSAkdHlwZV9uYW1lJCAkbmFtZSRfO1xuIik7CisgIFdyaXRlUHJvcGVydHlEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgQWRkUHVibGljTWVtYmVyQXR0cmlidXRlcyhwcmludGVyKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiJGFjY2Vzc19sZXZlbCQgJHR5cGVfbmFtZSQgJHByb3BlcnR5X25hbWUkIHtcbiIKKyAgICAiICBnZXQgeyByZXR1cm4gJG5hbWUkXzsgfVxuIgorICAgICIgIHNldCB7XG4iCisgICAgIiAgICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iKTsKKyAgaWYgKFN1cHBvcnRzUHJlc2VuY2VBcGkoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIi8vLyA8c3VtbWFyeT5HZXRzIHdoZXRoZXIgdGhlICRkZXNjcmlwdG9yX25hbWUkIGZpZWxkIGlzIHNldDwvc3VtbWFyeT5cbiIpOworICAgIEFkZFB1YmxpY01lbWJlckF0dHJpYnV0ZXMocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRhY2Nlc3NfbGV2ZWwkIGJvb2wgSGFzJHByb3BlcnR5X25hbWUkIHtcbiIKKyAgICAgICIgIGdldCB7IHJldHVybiAkbmFtZSRfICE9IG51bGw7IH1cbiIKKyAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiLy8vIDxzdW1tYXJ5PkNsZWFycyB0aGUgdmFsdWUgb2YgdGhlICRkZXNjcmlwdG9yX25hbWUkIGZpZWxkPC9zdW1tYXJ5PlxuIik7CisgICAgQWRkUHVibGljTWVtYmVyQXR0cmlidXRlcyhwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGFjY2Vzc19sZXZlbCQgdm9pZCBDbGVhciRwcm9wZXJ0eV9uYW1lJCgpIHtcbiIKKyAgICAgICIgICRuYW1lJF8gPSBudWxsO1xuIgorICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgImlmIChvdGhlci4kaGFzX3Byb3BlcnR5X2NoZWNrJCkge1xuIgorICAgICIgIGlmICgkaGFzX25vdF9wcm9wZXJ0eV9jaGVjayQpIHtcbiIKKyAgICAiICAgICRwcm9wZXJ0eV9uYW1lJCA9IG5ldyAkdHlwZV9uYW1lJCgpO1xuIgorICAgICIgIH1cbiIKKyAgICAiICAkcHJvcGVydHlfbmFtZSQuTWVyZ2VGcm9tKG90aGVyLiRwcm9wZXJ0eV9uYW1lJCk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICJpZiAoJGhhc19ub3RfcHJvcGVydHlfY2hlY2skKSB7XG4iCisgICAgIiAgJHByb3BlcnR5X25hbWUkID0gbmV3ICR0eXBlX25hbWUkKCk7XG4iCisgICAgIn1cbiIpOworICBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlR5cGU6OlRZUEVfTUVTU0FHRSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJpbnB1dC5SZWFkTWVzc2FnZSgkcHJvcGVydHlfbmFtZSQpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgImlucHV0LlJlYWRHcm91cCgkcHJvcGVydHlfbmFtZSQpO1xuIik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUeXBlOjpUWVBFX01FU1NBR0UpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiaWYgKCRoYXNfcHJvcGVydHlfY2hlY2skKSB7XG4iCisgICAgICAiICBvdXRwdXQuV3JpdGVSYXdUYWcoJHRhZ19ieXRlcyQpO1xuIgorICAgICAgIiAgb3V0cHV0LldyaXRlTWVzc2FnZSgkcHJvcGVydHlfbmFtZSQpO1xuIgorICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJpZiAoJGhhc19wcm9wZXJ0eV9jaGVjayQpIHtcbiIKKyAgICAgICIgIG91dHB1dC5Xcml0ZVJhd1RhZygkdGFnX2J5dGVzJCk7XG4iCisgICAgICAiICBvdXRwdXQuV3JpdGVHcm91cCgkcHJvcGVydHlfbmFtZSQpO1xuIgorICAgICAgIiAgb3V0cHV0LldyaXRlUmF3VGFnKCRlbmRfdGFnX2J5dGVzJCk7XG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VHlwZTo6VFlQRV9NRVNTQUdFKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgImlmICgkaGFzX3Byb3BlcnR5X2NoZWNrJCkge1xuIgorICAgICAgIiAgc2l6ZSArPSAkdGFnX3NpemUkICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZSgkcHJvcGVydHlfbmFtZSQpO1xuIgorICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJpZiAoJGhhc19wcm9wZXJ0eV9jaGVjayQpIHtcbiIKKyAgICAgICIgIHNpemUgKz0gJHRhZ19zaXplJCArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlR3JvdXBTaXplKCRwcm9wZXJ0eV9uYW1lJCk7XG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OldyaXRlSGFzaChpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICJpZiAoJGhhc19wcm9wZXJ0eV9jaGVjayQpIGhhc2ggXj0gJHByb3BlcnR5X25hbWUkLkdldEhhc2hDb2RlKCk7XG4iKTsKK30KK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpXcml0ZUVxdWFscyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICJpZiAoIW9iamVjdC5FcXVhbHMoJHByb3BlcnR5X25hbWUkLCBvdGhlci4kcHJvcGVydHlfbmFtZSQpKSByZXR1cm4gZmFsc2U7XG4iKTsKK30KK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpXcml0ZVRvU3RyaW5nKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHZhcmlhYmxlc19bImZpZWxkX25hbWUiXSA9IEdldEZpZWxkTmFtZShkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgIlByaW50RmllbGQoXCIkZmllbGRfbmFtZSRcIiwgaGFzJHByb3BlcnR5X25hbWUkLCAkbmFtZSRfLCB3cml0ZXIpO1xuIik7Cit9Cit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVFeHRlbnNpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIFdyaXRlUHJvcGVydHlEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgQWRkRGVwcmVjYXRlZEZsYWcocHJpbnRlcik7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgIiRhY2Nlc3NfbGV2ZWwkIHN0YXRpYyByZWFkb25seSBwYjo6RXh0ZW5zaW9uPCRleHRlbmRlZF90eXBlJCwgJHR5cGVfbmFtZSQ+ICRwcm9wZXJ0eV9uYW1lJCA9XG4iCisgICAgIiAgbmV3IHBiOjpFeHRlbnNpb248JGV4dGVuZGVkX3R5cGUkLCAkdHlwZV9uYW1lJD4oJG51bWJlciQsICIpOworICBHZW5lcmF0ZUNvZGVjQ29kZShwcmludGVyKTsKKyAgcHJpbnRlci0+UHJpbnQoIik7XG4iKTsKK30KK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNsb25pbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRuYW1lJF8gPSBvdGhlci4kaGFzX3Byb3BlcnR5X2NoZWNrJCA/IG90aGVyLiRuYW1lJF8uQ2xvbmUoKSA6IG51bGw7XG4iKTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRnJlZXppbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNvZGVjQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlR5cGU6OlRZUEVfTUVTU0FHRSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKCR0YWckLCAkdHlwZV9uYW1lJC5QYXJzZXIpIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgInBiOjpGaWVsZENvZGVjLkZvckdyb3VwKCR0YWckLCAkZW5kX3RhZyQsICR0eXBlX25hbWUkLlBhcnNlcikiKTsKKyAgfQorfQorCitNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6TWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorCSAgaW50IHByZXNlbmNlSW5kZXgsCisgICAgY29uc3QgT3B0aW9ucyAqb3B0aW9ucykKKyAgICA6IE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBwcmVzZW5jZUluZGV4LCBvcHRpb25zKSB7CisgIFNldENvbW1vbk9uZW9mRmllbGRWYXJpYWJsZXMoJnZhcmlhYmxlc18pOworfQorCitNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6fk1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yKCkgeworCit9CisKK3ZvaWQgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBXcml0ZVByb3BlcnR5RG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIEFkZFB1YmxpY01lbWJlckF0dHJpYnV0ZXMocHJpbnRlcik7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgIiRhY2Nlc3NfbGV2ZWwkICR0eXBlX25hbWUkICRwcm9wZXJ0eV9uYW1lJCB7XG4iCisgICAgIiAgZ2V0IHsgcmV0dXJuICRoYXNfcHJvcGVydHlfY2hlY2skID8gKCR0eXBlX25hbWUkKSAkb25lb2ZfbmFtZSRfIDogbnVsbDsgfVxuIgorICAgICIgIHNldCB7XG4iCisgICAgIiAgICAkb25lb2ZfbmFtZSRfID0gdmFsdWU7XG4iCisgICAgIiAgICAkb25lb2ZfbmFtZSRDYXNlXyA9IHZhbHVlID09IG51bGwgPyAkb25lb2ZfcHJvcGVydHlfbmFtZSRPbmVvZkNhc2UuTm9uZSA6ICRvbmVvZl9wcm9wZXJ0eV9uYW1lJE9uZW9mQ2FzZS4kb25lb2ZfY2FzZV9uYW1lJDtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIpOworICBpZiAoU3VwcG9ydHNQcmVzZW5jZUFwaShkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiLy8vIDxzdW1tYXJ5PkdldHMgd2hldGhlciB0aGUgXCIkZGVzY3JpcHRvcl9uYW1lJFwiIGZpZWxkIGlzIHNldDwvc3VtbWFyeT5cbiIpOworICAgIEFkZFB1YmxpY01lbWJlckF0dHJpYnV0ZXMocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRhY2Nlc3NfbGV2ZWwkIGJvb2wgSGFzJHByb3BlcnR5X25hbWUkIHtcbiIKKyAgICAgICIgIGdldCB7IHJldHVybiAkb25lb2ZfbmFtZSRDYXNlXyA9PSAkb25lb2ZfcHJvcGVydHlfbmFtZSRPbmVvZkNhc2UuJG9uZW9mX2Nhc2VfbmFtZSQ7IH1cbiIKKyAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiLy8vIDxzdW1tYXJ5PiBDbGVhcnMgdGhlIHZhbHVlIG9mIHRoZSBvbmVvZiBpZiBpdCdzIGN1cnJlbnRseSBzZXQgdG8gXCIkZGVzY3JpcHRvcl9uYW1lJFwiIDwvc3VtbWFyeT5cbiIpOworICAgIEFkZFB1YmxpY01lbWJlckF0dHJpYnV0ZXMocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRhY2Nlc3NfbGV2ZWwkIHZvaWQgQ2xlYXIkcHJvcGVydHlfbmFtZSQoKSB7XG4iCisgICAgICAiICBpZiAoJGhhc19wcm9wZXJ0eV9jaGVjayQpIHtcbiIKKyAgICAgICIgICAgQ2xlYXIkb25lb2ZfcHJvcGVydHlfbmFtZSQoKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkcHJvcGVydHlfbmFtZSQgPT0gbnVsbCkge1xuIgorICAgICIgICRwcm9wZXJ0eV9uYW1lJCA9IG5ldyAkdHlwZV9uYW1lJCgpO1xuIgorICAgICJ9XG4iCisgICAgIiRwcm9wZXJ0eV9uYW1lJC5NZXJnZUZyb20ob3RoZXIuJHByb3BlcnR5X25hbWUkKTtcbiIpOworfQorCit2b2lkIE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIFRPRE8oam9uc2tlZXQpOiBXZSBtYXkgYmUgYWJsZSB0byBkbyBiZXR0ZXIgdGhhbiB0aGlzCisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgIiR0eXBlX25hbWUkIHN1YkJ1aWxkZXIgPSBuZXcgJHR5cGVfbmFtZSQoKTtcbiIKKyAgICAiaWYgKCRoYXNfcHJvcGVydHlfY2hlY2skKSB7XG4iCisgICAgIiAgc3ViQnVpbGRlci5NZXJnZUZyb20oJHByb3BlcnR5X25hbWUkKTtcbiIKKyAgICAifVxuIik7CisgIGlmIChkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VHlwZTo6VFlQRV9NRVNTQUdFKSB7CisgICAgcHJpbnRlci0+UHJpbnQoImlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoImlucHV0LlJlYWRHcm91cChzdWJCdWlsZGVyKTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkcHJvcGVydHlfbmFtZSQgPSBzdWJCdWlsZGVyO1xuIik7Cit9CisKK3ZvaWQgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OldyaXRlVG9TdHJpbmcoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiUHJpbnRGaWVsZChcIiRkZXNjcmlwdG9yX25hbWUkXCIsICRoYXNfcHJvcGVydHlfY2hlY2skLCAkb25lb2ZfbmFtZSRfLCB3cml0ZXIpO1xuIik7Cit9CisKK3ZvaWQgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ2xvbmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJHByb3BlcnR5X25hbWUkID0gb3RoZXIuJHByb3BlcnR5X25hbWUkLkNsb25lKCk7XG4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNzaGFycAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlX2ZpZWxkLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZV9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NmRmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZV9maWVsZC5oCkBAIC0wLDAgKzEsOTEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfTUVTU0FHRV9GSUVMRF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9NRVNTQUdFX0ZJRUxEX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZmllbGRfYmFzZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNzaGFycCB7CisKK2NsYXNzIE1lc3NhZ2VGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvckJhc2UgeworIHB1YmxpYzoKKyAgTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVzZW5jZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyAqb3B0aW9ucyk7CisgIH5NZXNzYWdlRmllbGRHZW5lcmF0b3IoKTsKKworICBNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgTWVzc2FnZUZpZWxkR2VuZXJhdG9yJikgPSBkZWxldGU7CisgIE1lc3NhZ2VGaWVsZEdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2VGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUNvZGVjQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUNsb25pbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRnJlZXppbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUV4dGVuc2lvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgdm9pZCBXcml0ZUhhc2goaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgV3JpdGVFcXVhbHMoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgV3JpdGVUb1N0cmluZyhpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBNZXNzYWdlRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlc2VuY2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyAqb3B0aW9ucyk7CisgIH5NZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcigpOworCisgIE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yKGNvbnN0IE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yJikgPSBkZWxldGU7CisgIE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3ImKSA9CisgICAgICBkZWxldGU7CisKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQ2xvbmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgV3JpdGVUb1N0cmluZyhpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjc2hhcnAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9NRVNTQUdFX0ZJRUxEX0hfXworCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbmFtZXMuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9uYW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZTUzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbmFtZXMuaApAQCAtMCwwICsxLDEwOSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBtYXBwaW5nIGEgZGVzY3JpcHRvciB0byB0aGUKKy8vIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIEMjIGNsYXNzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfTkFNRVNfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfTkFNRVNfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIERlc2NyaXB0b3I7CitjbGFzcyBFbnVtRGVzY3JpcHRvcjsKK2NsYXNzIEZpbGVEZXNjcmlwdG9yOworY2xhc3MgU2VydmljZURlc2NyaXB0b3I7CisKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3NoYXJwIHsKKworLy8gUmVxdWlyZXM6CisvLyAgIGRlc2NyaXB0b3IgIT0gTlVMTAorLy8KKy8vIFJldHVybnM6CisvLyAgIFRoZSBuYW1lc3BhY2UgdG8gdXNlIGZvciBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuCitzdGQ6OnN0cmluZyBQUk9UT0NfRVhQT1JUIEdldEZpbGVOYW1lc3BhY2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisvLyBSZXF1aXJlczoKKy8vICAgZGVzY3JpcHRvciAhPSBOVUxMCisvLworLy8gUmV0dXJuczoKKy8vICAgVGhlIGZ1bGx5LXF1YWxpZmllZCBDIyBjbGFzcyBuYW1lLgorc3RkOjpzdHJpbmcgUFJPVE9DX0VYUE9SVCBHZXRDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKKy8vIFJlcXVpcmVzOgorLy8gICBkZXNjcmlwdG9yICE9IE5VTEwKKy8vCisvLyBSZXR1cm5zOgorLy8gICBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEMjIGNsYXNzIHRoYXQgcHJvdmlkZXMKKy8vICAgYWNjZXNzIHRvIHRoZSBmaWxlIGRlc2NyaXB0b3IuIFByb3RvIGNvbXBpbGVyIGdlbmVyYXRlcworLy8gICBzdWNoIGNsYXNzIGZvciBlYWNoIC5wcm90byBmaWxlIHByb2Nlc3NlZC4KK3N0ZDo6c3RyaW5nIFBST1RPQ19FWFBPUlQKK0dldFJlZmxlY3Rpb25DbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisvLyBHZW5lcmF0ZXMgb3V0cHV0IGZpbGUgbmFtZSBmb3IgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiBJZiBnZW5lcmF0ZV9kaXJlY3RvcmllcworLy8gaXMgdHJ1ZSwgdGhlIG91dHB1dCBmaWxlIHdpbGwgYmUgcHV0IHVuZGVyIGRpcmVjdG9yeSBjb3JyZXNwb25kaW5nIHRvIGZpbGUncworLy8gbmFtZXNwYWNlLiBiYXNlX25hbWVzcGFjZSBjYW4gYmUgdXNlZCB0byBzdHJpcCBzb21lIG9mIHRoZSB0b3AgbGV2ZWwKKy8vIGRpcmVjdG9yaWVzLiBFLmcuIGZvciBmaWxlIHdpdGggbmFtZXNwYWNlICJCYXIuRm9vIiBhbmQgYmFzZV9uYW1lc3BhY2U9IkJhciIsCisvLyB0aGUgcmVzdWx0aW5nIGZpbGUgd2lsbCBiZSBwdXQgdW5kZXIgZGlyZWN0b3J5ICJGb28iIChhbmQgbm90ICJCYXIvRm9vIikuCisvLworLy8gUmVxdWlyZXM6CisvLyAgIGRlc2NyaXB0b3IgIT0gTlVMTAorLy8gICBlcnJvciAhPSBOVUxMCisvLworLy8gIFJldHVybnM6CisvLyAgICBUaGUgZmlsZSBuYW1lIHRvIHVzZSBhcyBvdXRwdXQgZmlsZSBmb3IgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiBJbiBjYXNlCisvLyAgICBvZiBmYWlsdXJlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGVtcHR5IHN0cmluZyBhbmQgZXJyb3IgcGFyYW1ldGVyCisvLyAgICB3aWxsIGNvbnRhaW4gdGhlIGVycm9yIG1lc3NhZ2UuCitzdGQ6OnN0cmluZyBQUk9UT0NfRVhQT1JUIEdldE91dHB1dEZpbGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBnZW5lcmF0ZV9kaXJlY3RvcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBiYXNlX25hbWVzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZXJyb3IpOworCit9ICAvLyBuYW1lc3BhY2UgY3NoYXJwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfTkFNRVNfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfb3B0aW9ucy5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX29wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmZmNmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX29wdGlvbnMuaApAQCAtMCwwICsxLDgxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX09QVElPTlNfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfT1BUSU9OU19IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjc2hhcnAgeworCisvLyBHZW5lcmF0b3Igb3B0aW9ucyAodXNlZCBieSBjc2hhcnBfZ2VuZXJhdG9yLmNjKToKK3N0cnVjdCBPcHRpb25zIHsKKyAgT3B0aW9ucygpIDoKKyAgICAgIGZpbGVfZXh0ZW5zaW9uKCIuY3MiKSwKKyAgICAgIGJhc2VfbmFtZXNwYWNlKCIiKSwKKyAgICAgIGJhc2VfbmFtZXNwYWNlX3NwZWNpZmllZChmYWxzZSksCisgICAgICBpbnRlcm5hbF9hY2Nlc3MoZmFsc2UpLAorICAgICAgc2VyaWFsaXphYmxlKGZhbHNlKSB7CisgIH0KKyAgLy8gRXh0ZW5zaW9uIG9mIHRoZSBnZW5lcmF0ZWQgZmlsZS4gRGVmYXVsdHMgdG8gIi5jcyIKKyAgc3RkOjpzdHJpbmcgZmlsZV9leHRlbnNpb247CisgIC8vIEJhc2UgbmFtZXNwYWNlIHRvIHVzZSB0byBjcmVhdGUgZGlyZWN0b3J5IGhpZXJhcmNoeS4gRGVmYXVsdHMgdG8gIiIuCisgIC8vIFRoaXMgb3B0aW9uIGFsbG93cyB0aGUgc2ltcGxlIGNyZWF0aW9uIG9mIGEgY29udmVudGlvbmFsIEMjIGZpbGUgbGF5b3V0LAorICAvLyB3aGVyZSBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZCByZWxhdGl2ZSB0byBhIHByb2plY3Qtc3BlY2lmaWMgYmFzZQorICAvLyBuYW1lc3BhY2UuIEZvciBleGFtcGxlLCBpbiBhIHByb2plY3Qgd2l0aCBhIGJhc2UgbmFtZXNwYWNlIG9mIFBldFNob3AsIGEKKyAgLy8gcHJvdG8gb2YgdXNlci5wcm90byB3aXRoIGEgQyMgbmFtZXNwYWNlIG9mIFBldFNob3AuTW9kZWwuU2hhcmVkIHdvdWxkCisgIC8vIGdlbmVyYXRlIE1vZGVsL1NoYXJlZC9Vc2VyLmNzIHVuZGVybmVhdGggdGhlIHNwZWNpZmllZCAtLWNzaGFycF9vdXQKKyAgLy8gZGlyZWN0b3J5LgorICAvLworICAvLyBJZiBubyBiYXNlIG5hbWVzcGFjZSBpcyBzcGVjaWZpZWQsIGFsbCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGluIHRoZQorICAvLyAtLWNzaGFycF9vdXQgZGlyZWN0b3J5LCB3aXRoIG5vIHN1YmRpcmVjdG9yaWVzIGNyZWF0ZWQgYXV0b21hdGljYWxseS4KKyAgc3RkOjpzdHJpbmcgYmFzZV9uYW1lc3BhY2U7CisgIC8vIFdoZXRoZXIgdGhlIGJhc2UgbmFtZXNwYWNlIGhhcyBiZWVuIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorICAvLyBUaGlzIGlzIHJlcXVpcmVkIGFzIHRoZSBiYXNlIG5hbWVzcGFjZSBjYW4gYmUgZXhwbGljaXRseSBzZXQgdG8gdGhlIGVtcHR5CisgIC8vIHN0cmluZywgbWVhbmluZyAiY3JlYXRlIGEgZnVsbCBkaXJlY3RvcnkgaGllcmFyY2h5LCBzdGFydGluZyBmcm9tIHRoZSBmaXJzdAorICAvLyBzZWdtZW50IG9mIHRoZSBuYW1lc3BhY2UuIgorICBib29sIGJhc2VfbmFtZXNwYWNlX3NwZWNpZmllZDsKKyAgLy8gV2hldGhlciB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgc2hvdWxkIGhhdmUgYWNjZXNzaWJpbGl0eSBsZXZlbCBvZiAiaW50ZXJuYWwiLgorICAvLyBEZWZhdWx0cyB0byBmYWxzZSB0aGF0IGdlbmVyYXRlcyAicHVibGljIiBjbGFzc2VzLgorICBib29sIGludGVybmFsX2FjY2VzczsKKyAgLy8gV2hldGhlciB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgc2hvdWxkIGhhdmUgYSBnbG9iYWw6OlN5c3RlbS5TZXJpYWxpemFibGUgYXR0cmlidXRlIGFkZGVkCisgIC8vIERlZmF1bHRzIHRvIGZhbHNlCisgIGJvb2wgc2VyaWFsaXphYmxlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNzaGFycAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX09QVElPTlNfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcHJpbWl0aXZlX2ZpZWxkLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3ByaW1pdGl2ZV9maWVsZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2Q1MTE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3ByaW1pdGl2ZV9maWVsZC5jYwpAQCAtMCwwICsxLDM0OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZG9jX2NvbW1lbnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfb3B0aW9ucy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3ByaW1pdGl2ZV9maWVsZC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNzaGFycCB7CisKK1ByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBwcmVzZW5jZUluZGV4LCBjb25zdCBPcHRpb25zICpvcHRpb25zKQorICAgIDogRmllbGRHZW5lcmF0b3JCYXNlKGRlc2NyaXB0b3IsIHByZXNlbmNlSW5kZXgsIG9wdGlvbnMpIHsKKyAgLy8gVE9ETyhqb25za2VldCk6IE1ha2UgdGhpcyBjbGVhbmVyLi4uCisgIGlzX3ZhbHVlX3R5cGUgPSBkZXNjcmlwdG9yLT50eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORworICAgICAgJiYgZGVzY3JpcHRvci0+dHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzsKKyAgaWYgKCFpc192YWx1ZV90eXBlICYmICFTdXBwb3J0c1ByZXNlbmNlQXBpKGRlc2NyaXB0b3JfKSkgeworICAgIHZhcmlhYmxlc19bImhhc19wcm9wZXJ0eV9jaGVjayJdID0gdmFyaWFibGVzX1sicHJvcGVydHlfbmFtZSJdICsgIi5MZW5ndGggIT0gMCI7CisgICAgdmFyaWFibGVzX1sib3RoZXJfaGFzX3Byb3BlcnR5X2NoZWNrIl0gPSAib3RoZXIuIiArIHZhcmlhYmxlc19bInByb3BlcnR5X25hbWUiXSArICIuTGVuZ3RoICE9IDAiOworICB9Cit9CisKK1ByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjp+UHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKSB7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAKKyAgLy8gTm90ZTogaW4gbXVsdGlwbGUgcGxhY2VzLCB0aGlzIGNvZGUgYXNzdW1lcyB0aGF0IGFsbCBmaWVsZHMKKyAgLy8gdGhhdCBzdXBwb3J0IHByZXNlbmNlIGFyZSBlaXRoZXIgbnVsbGFibGUsIG9yIHVzZSBhIHByZXNlbmNlIGZpZWxkIGJpdC4KKyAgLy8gRmllbGRzIHdoaWNoIGFyZSBvbmVvZiBtZW1iZXJzIGFyZSBub3QgZ2VuZXJhdGVkIGhlcmU7IHRoZXkncmUgZ2VuZXJhdGVkIGluIFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IgYmVsb3cuCisgIC8vIEV4dGVuc2lvbnMgYXJlIG5vdCBnZW5lcmF0ZWQgaGVyZSBlaXRoZXIuCisKKworICAvLyBQcm90bzIgYWxsb3dzIGRpZmZlcmVudCBkZWZhdWx0IHZhbHVlcyB0byBiZSBzcGVjaWZpZWQuIFRoZXNlIGFyZSByZXRhaW5lZAorICAvLyB2aWEgc3RhdGljIGZpZWxkcy4gVGhleSBkb24ndCBwYXJ0aWN1bGFybHkgbmVlZCB0byBiZSwgYnV0IHdlIGRvbid0IG5lZWQKKyAgLy8gdG8gY2hhbmdlIHRoYXQuIEluIFByb3RvMyB0aGUgZGVmYXVsdCB2YWx1ZSB3ZSBkb24ndCBnZW5lcmF0ZSB0aGVzZQorICAvLyBmaWVsZHMsIGp1c3QgdXNpbmcgdGhlIGxpdGVyYWwgaW5zdGVhZC4KKyAgaWYgKElzUHJvdG8yKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgLy8gTm90ZTogInByaXZhdGUgcmVhZG9ubHkgc3RhdGljIiBpc24ndCBhcyBpZGlvbWF0aWMgYXMKKyAgICAvLyAicHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkiLCBidXQgY2hhbmdpbmcgdGhpcyBub3cgd291bGQgY3JlYXRlIGEgbG90IG9mCisgICAgLy8gY2h1cm4gaW4gZ2VuZXJhdGVkIGNvZGUgd2l0aCBuZWFyLXRvLXplcm8gYmVuZWZpdC4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAicHJpdmF0ZSByZWFkb25seSBzdGF0aWMgJHR5cGVfbmFtZSQgJHByb3BlcnR5X25hbWUkRGVmYXVsdFZhbHVlID0gJGRlZmF1bHRfdmFsdWUkO1xuXG4iKTsKKyAgICB2YXJpYWJsZXNfWyJkZWZhdWx0X3ZhbHVlX2FjY2VzcyJdID0KKyAgICAgIHZhcmlhYmxlc19bInByb3BlcnR5X25hbWUiXSArICJEZWZhdWx0VmFsdWUiOworICB9IGVsc2UgeworICAgIHZhcmlhYmxlc19bImRlZmF1bHRfdmFsdWVfYWNjZXNzIl0gPSB2YXJpYWJsZXNfWyJkZWZhdWx0X3ZhbHVlIl07CisgIH0KKworICAvLyBEZWNsYXJlIHRoZSBmaWVsZCBpdHNlbGYuCisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgJHR5cGVfbmFtZSQgJG5hbWVfZGVmX21lc3NhZ2UkO1xuIik7CisKKyAgV3JpdGVQcm9wZXJ0eURvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBBZGRQdWJsaWNNZW1iZXJBdHRyaWJ1dGVzKHByaW50ZXIpOworCisgIC8vIE1vc3Qgb2YgdGhlIHdvcmsgaXMgZG9uZSBpbiB0aGUgcHJvcGVydHk6CisgIC8vIERlY2xhcmUgdGhlIHByb3BlcnR5IGl0c2VsZiAodGhlIHNhbWUgZm9yIGFsbCBvcHRpb25zKQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJGFjY2Vzc19sZXZlbCQgJHR5cGVfbmFtZSQgJHByb3BlcnR5X25hbWUkIHtcbiIpOworCisgIC8vIFNwZWNpZnkgdGhlICJnZXR0ZXIiLCB3aGljaCBtYXkgbmVlZCB0byBjaGVjayBmb3IgYSBwcmVzZW5jZSBmaWVsZC4KKyAgaWYgKFN1cHBvcnRzUHJlc2VuY2VBcGkoZGVzY3JpcHRvcl8pKSB7CisgICAgaWYgKElzTnVsbGFibGUoZGVzY3JpcHRvcl8pKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIiAgZ2V0IHsgcmV0dXJuICRuYW1lJF8gPz8gJGRlZmF1bHRfdmFsdWVfYWNjZXNzJDsgfVxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAvLyBOb3RlOiBpdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBjb3VsZCBiZSByZXdyaXR0ZW4gYXMgYQorICAgICAgICAvLyBjb25kaXRpb25hbCA/OiBleHByZXNzaW9uLCBidXQgdGhlcmUncyBubyBzaWduaWZpY2FudCBiZW5lZml0CisgICAgICAgIC8vIHRvIGNoYW5naW5nIGl0LgorICAgICAgICAiICBnZXQgeyBpZiAoJGhhc19maWVsZF9jaGVjayQpIHsgcmV0dXJuICRuYW1lJF87IH0gZWxzZSB7IHJldHVybiAkZGVmYXVsdF92YWx1ZV9hY2Nlc3MkOyB9IH1cbiIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiICBnZXQgeyByZXR1cm4gJG5hbWUkXzsgfVxuIik7CisgIH0KKworICAvLyBTcGVjaWZ5IHRoZSAic2V0dGVyIiwgd2hpY2ggbWF5IG5lZWQgdG8gc2V0IGEgZmllbGQgYml0IGFzIHdlbGwgYXMgdGhlCisgIC8vIHZhbHVlLgorICBwcmludGVyLT5QcmludCgiICBzZXQge1xuIik7CisgIGlmIChwcmVzZW5jZUluZGV4XyAhPSAtMSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIgICAgJHNldF9oYXNfZmllbGQkO1xuIik7CisgIH0KKyAgaWYgKGlzX3ZhbHVlX3R5cGUpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiICAgICRuYW1lJF8gPSB2YWx1ZTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIgICAgJG5hbWUkXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCBcInZhbHVlXCIpO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgfVxuIgorICAgICJ9XG4iKTsKKworICAvLyBUaGUgIkhhc0ZvbyIgcHJvcGVydHksIHdoZXJlIHJlcXVpcmVkLgorICBpZiAoU3VwcG9ydHNQcmVzZW5jZUFwaShkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIi8vLyA8c3VtbWFyeT5HZXRzIHdoZXRoZXIgdGhlIFwiJGRlc2NyaXB0b3JfbmFtZSRcIiBmaWVsZCBpcyBzZXQ8L3N1bW1hcnk+XG4iKTsKKyAgICBBZGRQdWJsaWNNZW1iZXJBdHRyaWJ1dGVzKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkYWNjZXNzX2xldmVsJCBib29sIEhhcyRwcm9wZXJ0eV9uYW1lJCB7XG4iCisgICAgICAiICBnZXQgeyByZXR1cm4gIik7CisgICAgaWYgKElzTnVsbGFibGUoZGVzY3JpcHRvcl8pKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIiRuYW1lJF8gIT0gbnVsbDsgfVxufVxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiJGhhc19maWVsZF9jaGVjayQ7IH1cbn1cbiIpOworICAgIH0KKyAgfQorCisgIC8vIFRoZSAiQ2xlYXJGb28iIG1ldGhvZCwgd2hlcmUgcmVxdWlyZWQuCisgIGlmIChTdXBwb3J0c1ByZXNlbmNlQXBpKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiLy8vIDxzdW1tYXJ5PkNsZWFycyB0aGUgdmFsdWUgb2YgdGhlIFwiJGRlc2NyaXB0b3JfbmFtZSRcIiBmaWVsZDwvc3VtbWFyeT5cbiIpOworICAgIEFkZFB1YmxpY01lbWJlckF0dHJpYnV0ZXMocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRhY2Nlc3NfbGV2ZWwkIHZvaWQgQ2xlYXIkcHJvcGVydHlfbmFtZSQoKSB7XG4iKTsKKyAgICBpZiAoSXNOdWxsYWJsZShkZXNjcmlwdG9yXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIgICRuYW1lJF8gPSBudWxsO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIgICRjbGVhcl9oYXNfZmllbGQkO1xuIik7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgfQorfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgImlmICgkb3RoZXJfaGFzX3Byb3BlcnR5X2NoZWNrJCkge1xuIgorICAgICIgICRwcm9wZXJ0eV9uYW1lJCA9IG90aGVyLiRwcm9wZXJ0eV9uYW1lJDtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gTm90ZTogaW52b2tlIHRoZSBwcm9wZXJ0eSBzZXR0ZXIgcmF0aGVyIHRoYW4gd3JpdGluZyBzdHJhaWdodCB0byB0aGUgZmllbGQsCisgIC8vIHNvIHRoYXQgd2UgY2FuIG5vcm1hbGl6ZSAibnVsbCB0byBlbXB0eSIgZm9yIHN0cmluZ3MgYW5kIGJ5dGVzLgorICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICIkcHJvcGVydHlfbmFtZSQgPSBpbnB1dC5SZWFkJGNhcGl0YWxpemVkX3R5cGVfbmFtZSQoKTtcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgImlmICgkaGFzX3Byb3BlcnR5X2NoZWNrJCkge1xuIgorICAgICIgIG91dHB1dC5Xcml0ZVJhd1RhZygkdGFnX2J5dGVzJCk7XG4iCisgICAgIiAgb3V0cHV0LldyaXRlJGNhcGl0YWxpemVkX3R5cGVfbmFtZSQoJHByb3BlcnR5X25hbWUkKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgImlmICgkaGFzX3Byb3BlcnR5X2NoZWNrJCkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBpbnQgZml4ZWRTaXplID0gR2V0Rml4ZWRTaXplKGRlc2NyaXB0b3JfLT50eXBlKCkpOworICBpZiAoZml4ZWRTaXplID09IC0xKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgInNpemUgKz0gJHRhZ19zaXplJCArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlJGNhcGl0YWxpemVkX3R5cGVfbmFtZSRTaXplKCRwcm9wZXJ0eV9uYW1lJCk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJzaXplICs9ICR0YWdfc2l6ZSQgKyAkZml4ZWRfc2l6ZSQ7XG4iLAorICAgICAgImZpeGVkX3NpemUiLCBTdHJDYXQoZml4ZWRTaXplKSwKKyAgICAgICJ0YWdfc2l6ZSIsIHZhcmlhYmxlc19bInRhZ19zaXplIl0pOworICB9CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpXcml0ZUhhc2goaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgY29uc3QgY2hhciAqdGV4dCA9ICJpZiAoJGhhc19wcm9wZXJ0eV9jaGVjayQpIGhhc2ggXj0gJHByb3BlcnR5X25hbWUkLkdldEhhc2hDb2RlKCk7XG4iOworICBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQpIHsKKyAgICB0ZXh0ID0gImlmICgkaGFzX3Byb3BlcnR5X2NoZWNrJCkgaGFzaCBePSBwYmM6OlByb3RvYnVmRXF1YWxpdHlDb21wYXJlcnMuQml0d2lzZVNpbmdsZUVxdWFsaXR5Q29tcGFyZXIuR2V0SGFzaENvZGUoJHByb3BlcnR5X25hbWUkKTtcbiI7CisgIH0gZWxzZSBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFKSB7CisgICAgdGV4dCA9ICJpZiAoJGhhc19wcm9wZXJ0eV9jaGVjayQpIGhhc2ggXj0gcGJjOjpQcm90b2J1ZkVxdWFsaXR5Q29tcGFyZXJzLkJpdHdpc2VEb3VibGVFcXVhbGl0eUNvbXBhcmVyLkdldEhhc2hDb2RlKCRwcm9wZXJ0eV9uYW1lJCk7XG4iOworICB9CisJcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgdGV4dCk7Cit9Cit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpXcml0ZUVxdWFscyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBjb25zdCBjaGFyICp0ZXh0ID0gImlmICgkcHJvcGVydHlfbmFtZSQgIT0gb3RoZXIuJHByb3BlcnR5X25hbWUkKSByZXR1cm4gZmFsc2U7XG4iOworICBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQpIHsKKyAgICB0ZXh0ID0gImlmICghcGJjOjpQcm90b2J1ZkVxdWFsaXR5Q29tcGFyZXJzLkJpdHdpc2VTaW5nbGVFcXVhbGl0eUNvbXBhcmVyLkVxdWFscygkcHJvcGVydHlfbmFtZSQsIG90aGVyLiRwcm9wZXJ0eV9uYW1lJCkpIHJldHVybiBmYWxzZTtcbiI7CisgIH0gZWxzZSBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFKSB7CisgICAgdGV4dCA9ICJpZiAoIXBiYzo6UHJvdG9idWZFcXVhbGl0eUNvbXBhcmVycy5CaXR3aXNlRG91YmxlRXF1YWxpdHlDb21wYXJlci5FcXVhbHMoJHByb3BlcnR5X25hbWUkLCBvdGhlci4kcHJvcGVydHlfbmFtZSQpKSByZXR1cm4gZmFsc2U7XG4iOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIHRleHQpOworfQordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6V3JpdGVUb1N0cmluZyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICJQcmludEZpZWxkKFwiJGRlc2NyaXB0b3JfbmFtZSRcIiwgJGhhc19wcm9wZXJ0eV9jaGVjayQsICRwcm9wZXJ0eV9uYW1lJCwgd3JpdGVyKTtcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNsb25pbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRuYW1lJF8gPSBvdGhlci4kbmFtZSRfO1xuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ29kZWNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgInBiOjpGaWVsZENvZGVjLkZvciRjYXBpdGFsaXplZF90eXBlX25hbWUkKCR0YWckLCAkZGVmYXVsdF92YWx1ZSQpIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRXh0ZW5zaW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBXcml0ZVByb3BlcnR5RG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIEFkZERlcHJlY2F0ZWRGbGFnKHByaW50ZXIpOworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICIkYWNjZXNzX2xldmVsJCBzdGF0aWMgcmVhZG9ubHkgcGI6OkV4dGVuc2lvbjwkZXh0ZW5kZWRfdHlwZSQsICR0eXBlX25hbWUkPiAkcHJvcGVydHlfbmFtZSQgPVxuIgorICAgICIgIG5ldyBwYjo6RXh0ZW5zaW9uPCRleHRlbmRlZF90eXBlJCwgJHR5cGVfbmFtZSQ+KCRudW1iZXIkLCAiKTsKKyAgR2VuZXJhdGVDb2RlY0NvZGUocHJpbnRlcik7CisgIHByaW50ZXItPlByaW50KCIpO1xuIik7Cit9CisKK1ByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OlByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgcHJlc2VuY2VJbmRleCwgY29uc3QgT3B0aW9ucyAqb3B0aW9ucykKKyAgICA6IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IsIHByZXNlbmNlSW5kZXgsIG9wdGlvbnMpIHsKKyAgU2V0Q29tbW9uT25lb2ZGaWVsZFZhcmlhYmxlcygmdmFyaWFibGVzXyk7Cit9CisKK1ByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6On5QcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yKCkgeworfQorCit2b2lkIFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBXcml0ZVByb3BlcnR5RG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIEFkZFB1YmxpY01lbWJlckF0dHJpYnV0ZXMocHJpbnRlcik7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgIiRhY2Nlc3NfbGV2ZWwkICR0eXBlX25hbWUkICRwcm9wZXJ0eV9uYW1lJCB7XG4iCisgICAgIiAgZ2V0IHsgcmV0dXJuICRoYXNfcHJvcGVydHlfY2hlY2skID8gKCR0eXBlX25hbWUkKSAkb25lb2ZfbmFtZSRfIDogJGRlZmF1bHRfdmFsdWUkOyB9XG4iCisgICAgIiAgc2V0IHtcbiIpOworICBpZiAoaXNfdmFsdWVfdHlwZSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIgICAgJG9uZW9mX25hbWUkXyA9IHZhbHVlO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiAgICAkb25lb2ZfbmFtZSRfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsIFwidmFsdWVcIik7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICIgICAgJG9uZW9mX25hbWUkQ2FzZV8gPSAkb25lb2ZfcHJvcGVydHlfbmFtZSRPbmVvZkNhc2UuJG9uZW9mX2Nhc2VfbmFtZSQ7XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iKTsKKyAgaWYgKFN1cHBvcnRzUHJlc2VuY2VBcGkoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIi8vLyA8c3VtbWFyeT5HZXRzIHdoZXRoZXIgdGhlIFwiJGRlc2NyaXB0b3JfbmFtZSRcIiBmaWVsZCBpcyBzZXQ8L3N1bW1hcnk+XG4iKTsKKyAgICBBZGRQdWJsaWNNZW1iZXJBdHRyaWJ1dGVzKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkYWNjZXNzX2xldmVsJCBib29sIEhhcyRwcm9wZXJ0eV9uYW1lJCB7XG4iCisgICAgICAiICBnZXQgeyByZXR1cm4gJG9uZW9mX25hbWUkQ2FzZV8gPT0gJG9uZW9mX3Byb3BlcnR5X25hbWUkT25lb2ZDYXNlLiRvbmVvZl9jYXNlX25hbWUkOyB9XG4iCisgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIi8vLyA8c3VtbWFyeT4gQ2xlYXJzIHRoZSB2YWx1ZSBvZiB0aGUgb25lb2YgaWYgaXQncyBjdXJyZW50bHkgc2V0IHRvIFwiJGRlc2NyaXB0b3JfbmFtZSRcIiA8L3N1bW1hcnk+XG4iKTsKKyAgICBBZGRQdWJsaWNNZW1iZXJBdHRyaWJ1dGVzKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkYWNjZXNzX2xldmVsJCB2b2lkIENsZWFyJHByb3BlcnR5X25hbWUkKCkge1xuIgorICAgICAgIiAgaWYgKCRoYXNfcHJvcGVydHlfY2hlY2skKSB7XG4iCisgICAgICAiICAgIENsZWFyJG9uZW9mX3Byb3BlcnR5X25hbWUkKCk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkcHJvcGVydHlfbmFtZSQgPSBvdGhlci4kcHJvcGVydHlfbmFtZSQ7XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjpXcml0ZVRvU3RyaW5nKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIlByaW50RmllbGQoXCIkZGVzY3JpcHRvcl9uYW1lJFwiLCAkaGFzX3Byb3BlcnR5X2NoZWNrJCwgJG9uZW9mX25hbWUkXywgd3JpdGVyKTtcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJHByb3BlcnR5X25hbWUkID0gaW5wdXQuUmVhZCRjYXBpdGFsaXplZF90eXBlX25hbWUkKCk7XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNsb25pbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRwcm9wZXJ0eV9uYW1lJCA9IG90aGVyLiRwcm9wZXJ0eV9uYW1lJDtcbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3NoYXJwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3ByaW1pdGl2ZV9maWVsZC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3ByaW1pdGl2ZV9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNDk1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcHJpbWl0aXZlX2ZpZWxkLmgKQEAgLTAsMCArMSw5NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9QUklNSVRJVkVfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfUFJJTUlUSVZFX0ZJRUxEX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZmllbGRfYmFzZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNzaGFycCB7CisKK3N0cnVjdCBPcHRpb25zOworCitjbGFzcyBQcmltaXRpdmVGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvckJhc2UgeworIHB1YmxpYzoKKyAgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlc2VuY2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyAqb3B0aW9ucyk7CisgIH5QcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpOworCisgIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGNvbnN0IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yJikgPSBkZWxldGU7CisgIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVDb2RlY0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVDbG9uaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVFeHRlbnNpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKworICB2aXJ0dWFsIHZvaWQgV3JpdGVIYXNoKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFdyaXRlRXF1YWxzKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFdyaXRlVG9TdHJpbmcoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBib29sIGlzX3ZhbHVlX3R5cGU7Cit9OworCitjbGFzcyBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yIDogcHVibGljIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVzZW5jZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMgKm9wdGlvbnMpOworICB+UHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcigpOworCisgIFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworICBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvciYpID0KKyAgICAgIGRlbGV0ZTsKKworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVDbG9uaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBXcml0ZVRvU3RyaW5nKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNzaGFycAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX1BSSU1JVElWRV9GSUVMRF9IX18KKwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlZmxlY3Rpb25fY2xhc3MuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVmbGVjdGlvbl9jbGFzcy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWFiNGI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlZmxlY3Rpb25fY2xhc3MuY2MKQEAgLTAsMCArMSwzMzAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZW51bS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9maWVsZF9iYXNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX25hbWVzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfb3B0aW9ucy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlZmxlY3Rpb25fY2xhc3MuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjc2hhcnAgeworCitSZWZsZWN0aW9uQ2xhc3NHZW5lcmF0b3I6OlJlZmxlY3Rpb25DbGFzc0dlbmVyYXRvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMqIG9wdGlvbnMpCisgICAgOiBTb3VyY2VHZW5lcmF0b3JCYXNlKG9wdGlvbnMpLAorICAgICAgZmlsZV8oZmlsZSkgeworICBuYW1lc3BhY2VfID0gR2V0RmlsZU5hbWVzcGFjZShmaWxlKTsKKyAgcmVmbGVjdGlvbkNsYXNzbmFtZV8gPSBHZXRSZWZsZWN0aW9uQ2xhc3NVbnF1YWxpZmllZE5hbWUoZmlsZSk7CisgIGV4dGVuc2lvbkNsYXNzbmFtZV8gPSBHZXRFeHRlbnNpb25DbGFzc1VucXVhbGlmaWVkTmFtZShmaWxlKTsKK30KKworUmVmbGVjdGlvbkNsYXNzR2VuZXJhdG9yOjp+UmVmbGVjdGlvbkNsYXNzR2VuZXJhdG9yKCkgeworfQorCit2b2lkIFJlZmxlY3Rpb25DbGFzc0dlbmVyYXRvcjo6R2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgV3JpdGVJbnRyb2R1Y3Rpb24ocHJpbnRlcik7CisKKyAgV3JpdGVEZXNjcmlwdG9yKHByaW50ZXIpOworICAvLyBDbG9zZSB0aGUgY2xhc3MgZGVjbGFyYXRpb24uCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworCisgIGlmIChmaWxlXy0+ZXh0ZW5zaW9uX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIvLy8gPHN1bW1hcnk+SG9sZGVyIGZvciBleHRlbnNpb24gaWRlbnRpZmllcnMgZ2VuZXJhdGVkIGZyb20gdGhlIHRvcCAiCisgICAgICAgICJsZXZlbCBvZiAkZmlsZV9uYW1lJDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiRhY2Nlc3NfbGV2ZWwkIHN0YXRpYyBwYXJ0aWFsIGNsYXNzICRjbGFzc19uYW1lJCB7XG4iLAorICAgICAgICAiYWNjZXNzX2xldmVsIiwgY2xhc3NfYWNjZXNzX2xldmVsKCksICJjbGFzc19uYW1lIiwgZXh0ZW5zaW9uQ2xhc3NuYW1lXywKKyAgICAgICAgImZpbGVfbmFtZSIsIGZpbGVfLT5uYW1lKCkpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEZpZWxkR2VuZXJhdG9yQmFzZT4gZ2VuZXJhdG9yKAorICAgICAgICAgIENyZWF0ZUZpZWxkR2VuZXJhdG9yKGZpbGVfLT5leHRlbnNpb24oaSksIC0xLCB0aGlzLT5vcHRpb25zKCkpKTsKKyAgICAgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZUV4dGVuc2lvbkNvZGUocHJpbnRlcik7CisgICAgfQorICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAifVxuIgorICAgICJcbiIpOworICB9CisKKyAgLy8gd3JpdGUgY2hpbGRyZW46IEVudW1zCisgIGlmIChmaWxlXy0+ZW51bV90eXBlX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIiNyZWdpb24gRW51bXNcbiIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIEVudW1HZW5lcmF0b3IgZW51bUdlbmVyYXRvcihmaWxlXy0+ZW51bV90eXBlKGkpLCB0aGlzLT5vcHRpb25zKCkpOworICAgICAgZW51bUdlbmVyYXRvci5HZW5lcmF0ZShwcmludGVyKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoIiNlbmRyZWdpb25cbiIpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICB9CisKKyAgLy8gd3JpdGUgY2hpbGRyZW46IE1lc3NhZ2VzCisgIGlmIChmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIiNyZWdpb24gTWVzc2FnZXNcbiIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZUdlbmVyYXRvcihmaWxlXy0+bWVzc2FnZV90eXBlKGkpLCB0aGlzLT5vcHRpb25zKCkpOworICAgICAgbWVzc2FnZUdlbmVyYXRvci5HZW5lcmF0ZShwcmludGVyKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoIiNlbmRyZWdpb25cbiIpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICB9CisKKyAgLy8gVE9ETyhqdGF0dGVybXVzY2gpOiBhZGQgaW5zZXJ0aW9uIHBvaW50IGZvciBzZXJ2aWNlcy4KKworICBpZiAoIW5hbWVzcGFjZV8uZW1wdHkoKSkgeworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgIHByaW50ZXItPlByaW50KCIjZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlXG4iKTsKK30KKwordm9pZCBSZWZsZWN0aW9uQ2xhc3NHZW5lcmF0b3I6OldyaXRlSW50cm9kdWN0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICIvLyA8YXV0by1nZW5lcmF0ZWQ+XG4iCisgICAgIi8vICAgICBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIVxuIgorICAgICIvLyAgICAgc291cmNlOiAkZmlsZV9uYW1lJFxuIgorICAgICIvLyA8L2F1dG8tZ2VuZXJhdGVkPlxuIgorICAgICIjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxLCA4OTgxXG4iCisgICAgIiNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGVcbiIKKyAgICAiXG4iCisgICAgInVzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWY7XG4iCisgICAgInVzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLkNvbGxlY3Rpb25zO1xuIgorICAgICJ1c2luZyBwYnIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uO1xuIgorICAgICJ1c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIiwKKyAgICAiZmlsZV9uYW1lIiwgZmlsZV8tPm5hbWUoKSk7CisKKyAgaWYgKCFuYW1lc3BhY2VfLmVtcHR5KCkpIHsKKyAgICBwcmludGVyLT5QcmludCgibmFtZXNwYWNlICRuYW1lc3BhY2UkIHtcbiIsICJuYW1lc3BhY2UiLCBuYW1lc3BhY2VfKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICIvLy8gPHN1bW1hcnk+SG9sZGVyIGZvciByZWZsZWN0aW9uIGluZm9ybWF0aW9uIGdlbmVyYXRlZCBmcm9tICRmaWxlX25hbWUkPC9zdW1tYXJ5PlxuIgorICAgICIkYWNjZXNzX2xldmVsJCBzdGF0aWMgcGFydGlhbCBjbGFzcyAkcmVmbGVjdGlvbl9jbGFzc19uYW1lJCB7XG4iCisgICAgIlxuIiwKKyAgICAiZmlsZV9uYW1lIiwgZmlsZV8tPm5hbWUoKSwKKyAgICAiYWNjZXNzX2xldmVsIiwgY2xhc3NfYWNjZXNzX2xldmVsKCksCisgICAgInJlZmxlY3Rpb25fY2xhc3NfbmFtZSIsIHJlZmxlY3Rpb25DbGFzc25hbWVfKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7Cit9CisKK3ZvaWQgUmVmbGVjdGlvbkNsYXNzR2VuZXJhdG9yOjpXcml0ZURlc2NyaXB0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiNyZWdpb24gRGVzY3JpcHRvclxuIgorICAgICIvLy8gPHN1bW1hcnk+RmlsZSBkZXNjcmlwdG9yIGZvciAkZmlsZV9uYW1lJDwvc3VtbWFyeT5cbiIKKyAgICAicHVibGljIHN0YXRpYyBwYnI6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3Ige1xuIgorICAgICIgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9XG4iCisgICAgIn1cbiIKKyAgICAicHJpdmF0ZSBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yO1xuIgorICAgICJcbiIKKyAgICAic3RhdGljICRyZWZsZWN0aW9uX2NsYXNzX25hbWUkKCkge1xuIiwKKyAgICAiZmlsZV9uYW1lIiwgZmlsZV8tPm5hbWUoKSwKKyAgICAicmVmbGVjdGlvbl9jbGFzc19uYW1lIiwgcmVmbGVjdGlvbkNsYXNzbmFtZV8pOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPlByaW50KCJzdHJpbmcuQ29uY2F0KFxuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIC8vIFRPRE8oam9uc2tlZXQpOiBDb25zaWRlciBhIEMjLWVzY2FwaW5nIGZvcm1hdCBoZXJlIGluc3RlYWQgb2YganVzdCBCYXNlNjQuCisgIHN0ZDo6c3RyaW5nIGJhc2U2NCA9IEZpbGVEZXNjcmlwdG9yVG9CYXNlNjQoZmlsZV8pOworICB3aGlsZSAoYmFzZTY0LnNpemUoKSA+IDYwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIlwiJGJhc2U2NCRcIixcbiIsICJiYXNlNjQiLCBiYXNlNjQuc3Vic3RyKDAsIDYwKSk7CisgICAgYmFzZTY0ID0gYmFzZTY0LnN1YnN0cig2MCk7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIlwiJGJhc2U2NCRcIikpO1xuIiwgImJhc2U2NCIsIGJhc2U2NCk7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gSW52b2tlIEludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbSgpIHRvIGJ1aWxkIHRoZSBmaWxlLgorICBwcmludGVyLT5QcmludCgKKyAgICAgICJkZXNjcmlwdG9yID0gcGJyOjpGaWxlRGVzY3JpcHRvci5Gcm9tR2VuZXJhdGVkQ29kZShkZXNjcmlwdG9yRGF0YSxcbiIpOworICBwcmludGVyLT5QcmludCgiICAgIG5ldyBwYnI6OkZpbGVEZXNjcmlwdG9yW10geyAiKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiRmdWxsX3JlZmxlY3Rpb25fY2xhc3NfbmFtZSQuRGVzY3JpcHRvciwgIiwKKyAgICAgICJmdWxsX3JlZmxlY3Rpb25fY2xhc3NfbmFtZSIsCisgICAgICBHZXRSZWZsZWN0aW9uQ2xhc3NOYW1lKGZpbGVfLT5kZXBlbmRlbmN5KGkpKSk7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIn0sXG4iCisgICAgICAiICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKCIpOworICAvLyBTcGVjaWZ5IGFsbCB0aGUgZ2VuZXJhdGVkIGNvZGUgaW5mb3JtYXRpb24sIHJlY3Vyc2l2ZWx5LgorICBpZiAoZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpID4gMCkgeworICAgICAgcHJpbnRlci0+UHJpbnQoIm5ld1tdIHsiKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgICBwcmludGVyLT5QcmludCgidHlwZW9mKCR0eXBlX25hbWUkKSwgIiwgInR5cGVfbmFtZSIsIEdldENsYXNzTmFtZShmaWxlXy0+ZW51bV90eXBlKGkpKSk7CisgICAgICB9CisgICAgICBwcmludGVyLT5QcmludCgifSwgIik7CisgIH0KKyAgZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgibnVsbCwgIik7CisgIH0gIAorICBpZiAoZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpID4gMCkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBleHRlbnNpb25zOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICAgIGV4dGVuc2lvbnMucHVzaF9iYWNrKEdldEZ1bGxFeHRlbnNpb25OYW1lKGZpbGVfLT5leHRlbnNpb24oaSkpKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoIm5ldyBwYjo6RXh0ZW5zaW9uW10geyAkZXh0ZW5zaW9ucyQgfSwgIiwgImV4dGVuc2lvbnMiLCBKb2luKGV4dGVuc2lvbnMsICIsICIpKTsKKyAgfQorICBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgibnVsbCwgIik7CisgIH0KKyAgaWYgKGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKSA+IDApIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHtcbiIpOworICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgICAgIFdyaXRlR2VuZXJhdGVkQ29kZUluZm8oZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSwgcHJpbnRlciwgaSA9PSBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkgLSAxKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgIHByaW50ZXItPlByaW50KCJcbn0pKTtcbiIpOworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICB9CisgIGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoIm51bGwpKTtcbiIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7CisgIHByaW50ZXItPlByaW50KCIjZW5kcmVnaW9uXG5cbiIpOworfQorCisvLyBXcml0ZSBvdXQgdGhlIGdlbmVyYXRlZCBjb2RlIGZvciBhIHBhcnRpY3VsYXIgbWVzc2FnZS4gVGhpcyBjb25zaXN0cyBvZiB0aGUgQ0xSIHR5cGUsIHByb3BlcnR5IG5hbWVzCisvLyBjb3JyZXNwb25kaW5nIHRvIGZpZWxkcywgbmFtZXMgY29ycmVzcG9uZGluZyB0byBvbmVvZnMsIG5lc3RlZCBlbnVtcywgYW5kIG5lc3RlZCB0eXBlcy4gRWFjaCBhcnJheSBwYXJ0CisvLyBjYW4gYmUgc3BlY2lmaWVkIGFzIG51bGwgaWYgaXQgd291bGQgYmUgZW1wdHksIHRvIG1ha2UgdGhlIGdlbmVyYXRlZCBjb2RlIHNvbWV3aGF0IHNpbXBsZXIgdG8gcmVhZC4KKy8vIFdlIHdyaXRlIGEgbGluZSBicmVhayBhdCB0aGUgZW5kIG9mIGVhY2ggZ2VuZXJhdGVkIGNvZGUgaW5mbywgc28gdGhhdCBpbiB0aGUgZmluYWwgZmlsZSB3ZSdsbCBzZWUgYWxsCisvLyB0aGUgdHlwZXMsIHByZS1vcmRlcmVkIGRlcHRoIGZpcnN0LCBvbmUgcGVyIGxpbmUuIFRoZSBpbmRlbnRhdGlvbiB3aWxsIGJlIHNsaWdodGx5IHVudXN1YWwsCisvLyBpbiB0aGF0IGl0IHdpbGwgbG9vayBsaWtlIGEgc2luZ2xlIGFycmF5IHdoZW4gaXQncyBhY3R1YWxseSBjb25zdHJ1Y3RpbmcgYSB0cmVlLCBidXQgaXQnbGwgYmUgZWFzeSB0bworLy8gcmVhZCBldmVuIHdpdGggbXVsdGlwbGUgbGV2ZWxzIG9mIG5lc3RpbmcuCisvLyBUaGUgImxhc3QiIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIG1lc3NhZ2UgZGVzY3JpcHRvciBpcyB0aGUgbGFzdCBvbmUgYmVpbmcgcHJpbnRlZCBpbiB0aGlzIGltbWVkaWF0ZQorLy8gY29udGV4dC4gSXQgZ292ZXJucyB3aGV0aGVyIG9yIG5vdCBhIHRyYWlsaW5nIGNvbW1hIGFuZCBuZXdsaW5lIGlzIHdyaXR0ZW4gYWZ0ZXIgdGhlIGNvbnN0cnVjdG9yLCBlZmZlY3RpdmVseQorLy8ganVzdCBjb250cm9sbGluZyB0aGUgZm9ybWF0dGluZyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCit2b2lkIFJlZmxlY3Rpb25DbGFzc0dlbmVyYXRvcjo6V3JpdGVHZW5lcmF0ZWRDb2RlSW5mbyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCBsYXN0KSB7CisgIGlmIChJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yKSkgeworICAgIHByaW50ZXItPlByaW50KCJudWxsLCAiKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gR2VuZXJhdGVkIG1lc3NhZ2UgdHlwZQorICBwcmludGVyLT5QcmludCgibmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKCR0eXBlX25hbWUkKSwgJHR5cGVfbmFtZSQuUGFyc2VyLCAiLCAidHlwZV9uYW1lIiwgR2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3IpKTsKKworICAvLyBGaWVsZHMKKyAgaWYgKGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCkgPiAwKSB7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZmllbGRzOworICAgICAgZmllbGRzLnJlc2VydmUoZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKSk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgICAgIGZpZWxkcy5wdXNoX2JhY2soR2V0UHJvcGVydHlOYW1lKGRlc2NyaXB0b3ItPmZpZWxkKGkpKSk7CisgICAgICB9CisgICAgICBwcmludGVyLT5QcmludCgibmV3W117IFwiJGZpZWxkcyRcIiB9LCAiLCAiZmllbGRzIiwgSm9pbihmaWVsZHMsICJcIiwgXCIiKSk7CisgIH0KKyAgZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgibnVsbCwgIik7CisgIH0KKworICAvLyBPbmVvZnMKKyAgaWYgKGRlc2NyaXB0b3ItPm9uZW9mX2RlY2xfY291bnQoKSA+IDApIHsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBvbmVvZnM7CisgICAgICBvbmVvZnMucmVzZXJ2ZShkZXNjcmlwdG9yLT5vbmVvZl9kZWNsX2NvdW50KCkpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgeworICAgICAgICAgIG9uZW9mcy5wdXNoX2JhY2soVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShkZXNjcmlwdG9yLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCksIHRydWUpKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZXItPlByaW50KCJuZXdbXXsgXCIkb25lb2ZzJFwiIH0sICIsICJvbmVvZnMiLCBKb2luKG9uZW9mcywgIlwiLCBcIiIpKTsKKyAgfQorICBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJudWxsLCAiKTsKKyAgfQorCisgIC8vIE5lc3RlZCBlbnVtcworICBpZiAoZGVzY3JpcHRvci0+ZW51bV90eXBlX2NvdW50KCkgPiAwKSB7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZW51bXM7CisgICAgICBlbnVtcy5yZXNlcnZlKGRlc2NyaXB0b3ItPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgICAgIGVudW1zLnB1c2hfYmFjayhHZXRDbGFzc05hbWUoZGVzY3JpcHRvci0+ZW51bV90eXBlKGkpKSk7CisgICAgICB9CisgICAgICBwcmludGVyLT5QcmludCgibmV3W117IHR5cGVvZigkZW51bXMkKSB9LCAiLCAiZW51bXMiLCBKb2luKGVudW1zLCAiKSwgdHlwZW9mKCIpKTsKKyAgfQorICBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJudWxsLCAiKTsKKyAgfQorCisgIC8vIEV4dGVuc2lvbnMKKyAgaWYgKGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9jb3VudCgpID4gMCkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBleHRlbnNpb25zOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgICAgZXh0ZW5zaW9ucy5wdXNoX2JhY2soR2V0RnVsbEV4dGVuc2lvbk5hbWUoZGVzY3JpcHRvci0+ZXh0ZW5zaW9uKGkpKSk7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KCJuZXcgcGI6OkV4dGVuc2lvbltdIHsgJGV4dGVuc2lvbnMkIH0sICIsICJleHRlbnNpb25zIiwgSm9pbihleHRlbnNpb25zLCAiLCAiKSk7CisgIH0KKyAgZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoIm51bGwsICIpOworICB9CisKKyAgLy8gTmVzdGVkIHR5cGVzCisgIGlmIChkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpID4gMCkgeworICAgICAgLy8gTmVlZCB0byBzcGVjaWZ5IGFycmF5IHR5cGUgZXhwbGljaXRseSBoZXJlLCBhcyBhbGwgZWxlbWVudHMgbWF5IGJlIG51bGwuCisgICAgICBwcmludGVyLT5QcmludCgibmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7ICIpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgICBXcml0ZUdlbmVyYXRlZENvZGVJbmZvKGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlKGkpLCBwcmludGVyLCBpID09IGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlX2NvdW50KCkgLSAxKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZXItPlByaW50KCJ9Iik7CisgIH0KKyAgZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgibnVsbCIpOworICB9CisgIHByaW50ZXItPlByaW50KGxhc3QgPyAiKSIgOiAiKSxcbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3NoYXJwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlZmxlY3Rpb25fY2xhc3MuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZWZsZWN0aW9uX2NsYXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1NDcyNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZWZsZWN0aW9uX2NsYXNzLmgKQEAgLTAsMCArMSw3NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9SRUZMRUNUSU9OX0NMQVNTX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX1JFRkxFQ1RJT05fQ0xBU1NfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9zb3VyY2VfZ2VuZXJhdG9yX2Jhc2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3NoYXJwIHsKKworY2xhc3MgUmVmbGVjdGlvbkNsYXNzR2VuZXJhdG9yIDogcHVibGljIFNvdXJjZUdlbmVyYXRvckJhc2UgeworIHB1YmxpYzoKKyAgUmVmbGVjdGlvbkNsYXNzR2VuZXJhdG9yKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBPcHRpb25zKiBvcHRpb25zKTsKKyAgflJlZmxlY3Rpb25DbGFzc0dlbmVyYXRvcigpOworCisgIFJlZmxlY3Rpb25DbGFzc0dlbmVyYXRvcihjb25zdCBSZWZsZWN0aW9uQ2xhc3NHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKyAgUmVmbGVjdGlvbkNsYXNzR2VuZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgUmVmbGVjdGlvbkNsYXNzR2VuZXJhdG9yJikgPSBkZWxldGU7CisKKyAgdm9pZCBHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlXzsKKyAgc3RkOjpzdHJpbmcgcmVmbGVjdGlvbkNsYXNzbmFtZV87CisgIHN0ZDo6c3RyaW5nIGV4dGVuc2lvbkNsYXNzbmFtZV87CisKKyAgdm9pZCBXcml0ZUludHJvZHVjdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgV3JpdGVEZXNjcmlwdG9yKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBXcml0ZUdlbmVyYXRlZENvZGVJbmZvKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGFzdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY3NoYXJwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfUkVGTEVDVElPTl9DTEFTU19IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9lbnVtX2ZpZWxkLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiYzdiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9lbnVtX2ZpZWxkLmNjCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZG9jX2NvbW1lbnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfZW51bV9maWVsZC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNzaGFycCB7CisKK1JlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBwcmVzZW5jZUluZGV4LCBjb25zdCBPcHRpb25zICpvcHRpb25zKQorICAgIDogRmllbGRHZW5lcmF0b3JCYXNlKGRlc2NyaXB0b3IsIHByZXNlbmNlSW5kZXgsIG9wdGlvbnMpIHsKK30KKworUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6On5SZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcigpIHsKKworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAicHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8JHR5cGVfbmFtZSQ+IF9yZXBlYXRlZF8kbmFtZSRfY29kZWNcbiIKKyAgICAiICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yRW51bSgkdGFnJCwgeCA9PiAoaW50KSB4LCB4ID0+ICgkdHlwZV9uYW1lJCkgeCk7XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8JHR5cGVfbmFtZSQ+ICRuYW1lJF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPCR0eXBlX25hbWUkPigpO1xuIik7CisgIFdyaXRlUHJvcGVydHlEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgQWRkUHVibGljTWVtYmVyQXR0cmlidXRlcyhwcmludGVyKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiJGFjY2Vzc19sZXZlbCQgcGJjOjpSZXBlYXRlZEZpZWxkPCR0eXBlX25hbWUkPiAkcHJvcGVydHlfbmFtZSQge1xuIgorICAgICIgIGdldCB7IHJldHVybiAkbmFtZSRfOyB9XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgIiRuYW1lJF8uQWRkKG90aGVyLiRuYW1lJF8pO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgR2VuZXJhdGVQYXJzaW5nQ29kZShwcmludGVyLCB0cnVlKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB1c2VfcGFyc2VfY29udGV4dCkgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgIHVzZV9wYXJzZV9jb250ZXh0CisgICAgPyAiJG5hbWUkXy5BZGRFbnRyaWVzRnJvbShyZWYgaW5wdXQsIF9yZXBlYXRlZF8kbmFtZSRfY29kZWMpO1xuIgorICAgIDogIiRuYW1lJF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF8kbmFtZSRfY29kZWMpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShwcmludGVyLCB0cnVlKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB1c2Vfd3JpdGVfY29udGV4dCkgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgIHVzZV93cml0ZV9jb250ZXh0CisgICAgPyAiJG5hbWUkXy5Xcml0ZVRvKHJlZiBvdXRwdXQsIF9yZXBlYXRlZF8kbmFtZSRfY29kZWMpO1xuIgorICAgIDogIiRuYW1lJF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF8kbmFtZSRfY29kZWMpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgInNpemUgKz0gJG5hbWUkXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF8kbmFtZSRfY29kZWMpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OldyaXRlSGFzaChpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICJoYXNoIF49ICRuYW1lJF8uR2V0SGFzaENvZGUoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpXcml0ZUVxdWFscyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICJpZighJG5hbWUkXy5FcXVhbHMob3RoZXIuJG5hbWUkXykpIHJldHVybiBmYWxzZTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpXcml0ZVRvU3RyaW5nKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIlByaW50RmllbGQoXCIkZGVzY3JpcHRvcl9uYW1lJFwiLCAkbmFtZSRfLCB3cml0ZXIpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ2xvbmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJG5hbWUkXyA9IG90aGVyLiRuYW1lJF8uQ2xvbmUoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUV4dGVuc2lvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgV3JpdGVQcm9wZXJ0eURvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBBZGREZXByZWNhdGVkRmxhZyhwcmludGVyKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiJGFjY2Vzc19sZXZlbCQgc3RhdGljIHJlYWRvbmx5IHBiOjpSZXBlYXRlZEV4dGVuc2lvbjwkZXh0ZW5kZWRfdHlwZSQsICR0eXBlX25hbWUkPiAkcHJvcGVydHlfbmFtZSQgPVxuIgorICAgICIgIG5ldyBwYjo6UmVwZWF0ZWRFeHRlbnNpb248JGV4dGVuZGVkX3R5cGUkLCAkdHlwZV9uYW1lJD4oJG51bWJlciQsICIKKyAgICAicGI6OkZpZWxkQ29kZWMuRm9yRW51bSgkdGFnJCwgeCA9PiAoaW50KSB4LCB4ID0+ICgkdHlwZV9uYW1lJCkgeCkpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRnJlZXppbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjc2hhcnAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfZW51bV9maWVsZC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzc5ZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuaApAQCAtMCwwICsxLDc3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX1JFUEVBVEVEX0VOVU1fRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfUkVQRUFURURfRU5VTV9GSUVMRF9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjc2hhcnAgeworCisvLyBUT0RPKGpvbnNrZWV0KTogUmVmYWN0b3IgcmVwZWF0ZWQgZmllbGQgc3VwcG9ydDsgYWxsIHRoZSBpbXBsZW1lbnRhdGlvbnMgYXJlCisvLyAqcmVhbGx5KiBzaW1pbGFyLiBXZSBzaG91bGQgcHJvYmFibHkgaGF2ZSBhIFJlcGVhdGVkRmllbGRHZW5lcmF0b3JCYXNlLgorY2xhc3MgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3JCYXNlIHsKKyBwdWJsaWM6CisgIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXNlbmNlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMgKm9wdGlvbnMpOworICB+UmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IoKTsKKworICBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworICBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yJikgPQorICAgICAgZGVsZXRlOworCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUNsb25pbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRnJlZXppbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB1c2VfcGFyc2VfY29udGV4dCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgdXNlX3dyaXRlX2NvbnRleHQpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVFeHRlbnNpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKworICB2aXJ0dWFsIHZvaWQgV3JpdGVIYXNoKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFdyaXRlRXF1YWxzKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFdyaXRlVG9TdHJpbmcoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNzaGFycAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX1JFUEVBVEVEX0VOVU1fRklFTERfSF9fCisKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9tZXNzYWdlX2ZpZWxkLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX21lc3NhZ2VfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5M2NkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9tZXNzYWdlX2ZpZWxkLmNjCkBAIC0wLDAgKzEsMTc0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZG9jX2NvbW1lbnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfbWVzc2FnZV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2VfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF93cmFwcGVyX2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3NoYXJwIHsKKworUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OlJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IHByZXNlbmNlSW5kZXgsIGNvbnN0IE9wdGlvbnMgKm9wdGlvbnMpCisgICAgOiBGaWVsZEdlbmVyYXRvckJhc2UoZGVzY3JpcHRvciwgcHJlc2VuY2VJbmRleCwgb3B0aW9ucykgeworfQorCitSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKCkgeworCit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICJwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzwkdHlwZV9uYW1lJD4gX3JlcGVhdGVkXyRuYW1lJF9jb2RlY1xuIgorICAgICIgICAgPSAiKTsKKyAgLy8gRG9uJ3Qgd2FudCB0byBkdXBsaWNhdGUgdGhlIGNvZGVjIGNvZGUgaGVyZS4uLiBtYXliZSB3ZSBzaG91bGQgaGF2ZSBhCisgIC8vICJjcmVhdGUgc2luZ2xlIGZpZWxkIGdlbmVyYXRvciBmb3IgdGhpcyByZXBlYXRlZCBmaWVsZCIKKyAgLy8gZnVuY3Rpb24sIGJ1dCBpdCBkb2Vzbid0IHNlZW0gd29ydGggaXQgZm9yIGp1c3QgdGhpcy4KKyAgaWYgKElzV3JhcHBlclR5cGUoZGVzY3JpcHRvcl8pKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEZpZWxkR2VuZXJhdG9yQmFzZT4gc2luZ2xlX2dlbmVyYXRvcigKKyAgICAgIG5ldyBXcmFwcGVyRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvcl8sIHByZXNlbmNlSW5kZXhfLCB0aGlzLT5vcHRpb25zKCkpKTsKKyAgICBzaW5nbGVfZ2VuZXJhdG9yLT5HZW5lcmF0ZUNvZGVjQ29kZShwcmludGVyKTsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RmllbGRHZW5lcmF0b3JCYXNlPiBzaW5nbGVfZ2VuZXJhdG9yKAorICAgICAgbmV3IE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yXywgcHJlc2VuY2VJbmRleF8sIHRoaXMtPm9wdGlvbnMoKSkpOworICAgIHNpbmdsZV9nZW5lcmF0b3ItPkdlbmVyYXRlQ29kZWNDb2RlKHByaW50ZXIpOworICB9CisgIHByaW50ZXItPlByaW50KCI7XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAicHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8JHR5cGVfbmFtZSQ+ICRuYW1lJF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPCR0eXBlX25hbWUkPigpO1xuIik7CisgIFdyaXRlUHJvcGVydHlEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgQWRkUHVibGljTWVtYmVyQXR0cmlidXRlcyhwcmludGVyKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiJGFjY2Vzc19sZXZlbCQgcGJjOjpSZXBlYXRlZEZpZWxkPCR0eXBlX25hbWUkPiAkcHJvcGVydHlfbmFtZSQge1xuIgorICAgICIgIGdldCB7IHJldHVybiAkbmFtZSRfOyB9XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgIiRuYW1lJF8uQWRkKG90aGVyLiRuYW1lJF8pO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgR2VuZXJhdGVQYXJzaW5nQ29kZShwcmludGVyLCB0cnVlKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB1c2VfcGFyc2VfY29udGV4dCkgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgIHVzZV9wYXJzZV9jb250ZXh0CisgICAgPyAiJG5hbWUkXy5BZGRFbnRyaWVzRnJvbShyZWYgaW5wdXQsIF9yZXBlYXRlZF8kbmFtZSRfY29kZWMpO1xuIgorICAgIDogIiRuYW1lJF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF8kbmFtZSRfY29kZWMpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShwcmludGVyLCB0cnVlKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB1c2Vfd3JpdGVfY29udGV4dCkgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgIHVzZV93cml0ZV9jb250ZXh0CisgICAgPyAiJG5hbWUkXy5Xcml0ZVRvKHJlZiBvdXRwdXQsIF9yZXBlYXRlZF8kbmFtZSRfY29kZWMpO1xuIgorICAgIDogIiRuYW1lJF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF8kbmFtZSRfY29kZWMpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgInNpemUgKz0gJG5hbWUkXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF8kbmFtZSRfY29kZWMpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OldyaXRlSGFzaChpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICJoYXNoIF49ICRuYW1lJF8uR2V0SGFzaENvZGUoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpXcml0ZUVxdWFscyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICJpZighJG5hbWUkXy5FcXVhbHMob3RoZXIuJG5hbWUkXykpIHJldHVybiBmYWxzZTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpXcml0ZVRvU3RyaW5nKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHZhcmlhYmxlc19bImZpZWxkX25hbWUiXSA9IEdldEZpZWxkTmFtZShkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgIlByaW50RmllbGQoXCIkZmllbGRfbmFtZSRcIiwgJG5hbWUkXywgd3JpdGVyKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNsb25pbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRuYW1lJF8gPSBvdGhlci4kbmFtZSRfLkNsb25lKCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVGcmVlemluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVFeHRlbnNpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIFdyaXRlUHJvcGVydHlEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgQWRkRGVwcmVjYXRlZEZsYWcocHJpbnRlcik7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgIiRhY2Nlc3NfbGV2ZWwkIHN0YXRpYyByZWFkb25seSBwYjo6UmVwZWF0ZWRFeHRlbnNpb248JGV4dGVuZGVkX3R5cGUkLCAkdHlwZV9uYW1lJD4gJHByb3BlcnR5X25hbWUkID1cbiIKKyAgICAiICBuZXcgcGI6OlJlcGVhdGVkRXh0ZW5zaW9uPCRleHRlbmRlZF90eXBlJCwgJHR5cGVfbmFtZSQ+KCRudW1iZXIkLCAiKTsKKyAgaWYgKElzV3JhcHBlclR5cGUoZGVzY3JpcHRvcl8pKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEZpZWxkR2VuZXJhdG9yQmFzZT4gc2luZ2xlX2dlbmVyYXRvcigKKyAgICAgIG5ldyBXcmFwcGVyRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvcl8sIC0xLCB0aGlzLT5vcHRpb25zKCkpKTsKKyAgICBzaW5nbGVfZ2VuZXJhdG9yLT5HZW5lcmF0ZUNvZGVjQ29kZShwcmludGVyKTsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RmllbGRHZW5lcmF0b3JCYXNlPiBzaW5nbGVfZ2VuZXJhdG9yKAorICAgICAgbmV3IE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yXywgLTEsIHRoaXMtPm9wdGlvbnMoKSkpOworICAgIHNpbmdsZV9nZW5lcmF0b3ItPkdlbmVyYXRlQ29kZWNDb2RlKHByaW50ZXIpOworICB9CisgIHByaW50ZXItPlByaW50KCIpO1xuIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjc2hhcnAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfbWVzc2FnZV9maWVsZC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX21lc3NhZ2VfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjZlZmVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX21lc3NhZ2VfZmllbGQuaApAQCAtMCwwICsxLDc3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX1JFUEVBVEVEX01FU1NBR0VfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfUkVQRUFURURfTUVTU0FHRV9GSUVMRF9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjc2hhcnAgeworCitzdHJ1Y3QgT3B0aW9uczsKKworY2xhc3MgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3JCYXNlIHsKKyBwdWJsaWM6CisgIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXNlbmNlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMgKm9wdGlvbnMpOworICB+UmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoKTsKKworICBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworICBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvciYgb3BlcmF0b3I9KAorICAgICAgY29uc3QgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVDbG9uaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUZyZWV6aW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgdXNlX3BhcnNlX2NvbnRleHQpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyLCBib29sIHVzZV93cml0ZV9jb250ZXh0KSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRXh0ZW5zaW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCB2b2lkIFdyaXRlSGFzaChpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBXcml0ZUVxdWFscyhpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBXcml0ZVRvU3RyaW5nKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjc2hhcnAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9SRVBFQVRFRF9NRVNTQUdFX0ZJRUxEX0hfXworCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfcHJpbWl0aXZlX2ZpZWxkLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX3ByaW1pdGl2ZV9maWVsZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWFjZjkxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX3ByaW1pdGl2ZV9maWVsZC5jYwpAQCAtMCwwICsxLDE0NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX3ByaW1pdGl2ZV9maWVsZC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNzaGFycCB7CisKK1JlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OlJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgcHJlc2VuY2VJbmRleCwgY29uc3QgT3B0aW9ucyAqb3B0aW9ucykKKyAgICA6IEZpZWxkR2VuZXJhdG9yQmFzZShkZXNjcmlwdG9yLCBwcmVzZW5jZUluZGV4LCBvcHRpb25zKSB7Cit9CisKK1JlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6On5SZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKCkgeworCit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPCR0eXBlX25hbWUkPiBfcmVwZWF0ZWRfJG5hbWUkX2NvZGVjXG4iCisgICAgIiAgICA9IHBiOjpGaWVsZENvZGVjLkZvciRjYXBpdGFsaXplZF90eXBlX25hbWUkKCR0YWckKTtcbiIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDwkdHlwZV9uYW1lJD4gJG5hbWUkXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8JHR5cGVfbmFtZSQ+KCk7XG4iKTsKKyAgV3JpdGVQcm9wZXJ0eURvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBBZGRQdWJsaWNNZW1iZXJBdHRyaWJ1dGVzKHByaW50ZXIpOworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICIkYWNjZXNzX2xldmVsJCBwYmM6OlJlcGVhdGVkRmllbGQ8JHR5cGVfbmFtZSQ+ICRwcm9wZXJ0eV9uYW1lJCB7XG4iCisgICAgIiAgZ2V0IHsgcmV0dXJuICRuYW1lJF87IH1cbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICIkbmFtZSRfLkFkZChvdGhlci4kbmFtZSRfKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgR2VuZXJhdGVQYXJzaW5nQ29kZShwcmludGVyLCB0cnVlKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyLCBib29sIHVzZV9wYXJzZV9jb250ZXh0KSB7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgdXNlX3BhcnNlX2NvbnRleHQKKyAgICA/ICIkbmFtZSRfLkFkZEVudHJpZXNGcm9tKHJlZiBpbnB1dCwgX3JlcGVhdGVkXyRuYW1lJF9jb2RlYyk7XG4iCisgICAgOiAiJG5hbWUkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkXyRuYW1lJF9jb2RlYyk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUocHJpbnRlciwgdHJ1ZSk7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB1c2Vfd3JpdGVfY29udGV4dCkgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgIHVzZV93cml0ZV9jb250ZXh0CisgICAgPyAiJG5hbWUkXy5Xcml0ZVRvKHJlZiBvdXRwdXQsIF9yZXBlYXRlZF8kbmFtZSRfY29kZWMpO1xuIgorICAgIDogIiRuYW1lJF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF8kbmFtZSRfY29kZWMpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAic2l6ZSArPSAkbmFtZSRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkXyRuYW1lJF9jb2RlYyk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpXcml0ZUhhc2goaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiaGFzaCBePSAkbmFtZSRfLkdldEhhc2hDb2RlKCk7XG4iKTsKK30KK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6V3JpdGVFcXVhbHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiaWYoISRuYW1lJF8uRXF1YWxzKG90aGVyLiRuYW1lJF8pKSByZXR1cm4gZmFsc2U7XG4iKTsKK30KK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6V3JpdGVUb1N0cmluZyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJQcmludEZpZWxkKFwiJGRlc2NyaXB0b3JfbmFtZSRcIiwgJG5hbWUkXywgd3JpdGVyKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ2xvbmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJG5hbWUkXyA9IG90aGVyLiRuYW1lJF8uQ2xvbmUoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRnJlZXppbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVFeHRlbnNpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIFdyaXRlUHJvcGVydHlEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgQWRkRGVwcmVjYXRlZEZsYWcocHJpbnRlcik7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgIiRhY2Nlc3NfbGV2ZWwkIHN0YXRpYyByZWFkb25seSBwYjo6UmVwZWF0ZWRFeHRlbnNpb248JGV4dGVuZGVkX3R5cGUkLCAkdHlwZV9uYW1lJD4gJHByb3BlcnR5X25hbWUkID1cbiIKKyAgICAiICBuZXcgcGI6OlJlcGVhdGVkRXh0ZW5zaW9uPCRleHRlbmRlZF90eXBlJCwgJHR5cGVfbmFtZSQ+KCRudW1iZXIkLCBwYjo6RmllbGRDb2RlYy5Gb3IkY2FwaXRhbGl6ZWRfdHlwZV9uYW1lJCgkdGFnJCkpO1xuIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjc2hhcnAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfcHJpbWl0aXZlX2ZpZWxkLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfcHJpbWl0aXZlX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkMTJhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9wcmltaXRpdmVfZmllbGQuaApAQCAtMCwwICsxLDczIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX1JFUEVBVEVEX1BSSU1JVElWRV9GSUVMRF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9SRVBFQVRFRF9QUklNSVRJVkVfRklFTERfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9maWVsZF9iYXNlLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3NoYXJwIHsKKworY2xhc3MgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvckJhc2UgeworIHB1YmxpYzoKKyAgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXNlbmNlSW5kZXgsIGNvbnN0IE9wdGlvbnMqIG9wdGlvbnMpOworICB+UmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpOworCisgIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoY29uc3QgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworICBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUNsb25pbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRnJlZXppbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB1c2VfcGFyc2VfY29udGV4dCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgdXNlX3dyaXRlX2NvbnRleHQpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVFeHRlbnNpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKworICB2aXJ0dWFsIHZvaWQgV3JpdGVIYXNoKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFdyaXRlRXF1YWxzKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFdyaXRlVG9TdHJpbmcoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNzaGFycAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX1JFUEVBVEVEX1BSSU1JVElWRV9GSUVMRF9IX18KKwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3NvdXJjZV9nZW5lcmF0b3JfYmFzZS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9zb3VyY2VfZ2VuZXJhdG9yX2Jhc2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1N2U2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9zb3VyY2VfZ2VuZXJhdG9yX2Jhc2UuY2MKQEAgLTAsMCArMSw3NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3NvdXJjZV9nZW5lcmF0b3JfYmFzZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9uYW1lcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX29wdGlvbnMuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjc2hhcnAgeworCitTb3VyY2VHZW5lcmF0b3JCYXNlOjpTb3VyY2VHZW5lcmF0b3JCYXNlKAorICAgIGNvbnN0IE9wdGlvbnMgKm9wdGlvbnMpIDogb3B0aW9uc18ob3B0aW9ucykgeworfQorCitTb3VyY2VHZW5lcmF0b3JCYXNlOjp+U291cmNlR2VuZXJhdG9yQmFzZSgpIHsKK30KKwordm9pZCBTb3VyY2VHZW5lcmF0b3JCYXNlOjpXcml0ZUdlbmVyYXRlZENvZGVBdHRyaWJ1dGVzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KCJbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZV1cbiIpOworICAvLyBUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBbR2VuZXJhdGVkQ29kZV0gYXR0cmlidXRlIGNvdWxkIGJlIHNldCB0byBjdXJyZW50IHByb3RvYworICAvLyB2ZXJzaW9uLCBidXQgdGhhdCB3b3VsZCBjYXVzZSBleGNlc3NpdmUgY29kZSBjaHVybiBpbiB0aGUgcHJlLWdlbmVyYXRlZAorICAvLyBjb2RlIGluIHRoZSByZXBvc2l0b3J5IGV2ZXJ5IHRpbWUgdGhlIHByb3RvYnVmIHZlcnNpb24gbnVtYmVyIGlzIHVwZGF0ZWQuCisgIHByaW50ZXItPlByaW50KCJbZ2xvYmFsOjpTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlKFwicHJvdG9jXCIsIG51bGwpXVxuIik7Cit9CisKK3N0ZDo6c3RyaW5nIFNvdXJjZUdlbmVyYXRvckJhc2U6OmNsYXNzX2FjY2Vzc19sZXZlbCgpIHsKKyAgcmV0dXJuIHRoaXMtPm9wdGlvbnMoKS0+aW50ZXJuYWxfYWNjZXNzID8gImludGVybmFsIiA6ICJwdWJsaWMiOworfQorCitjb25zdCBPcHRpb25zKiBTb3VyY2VHZW5lcmF0b3JCYXNlOjpvcHRpb25zKCkgeworICByZXR1cm4gdGhpcy0+b3B0aW9uc187Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjc2hhcnAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfc291cmNlX2dlbmVyYXRvcl9iYXNlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfc291cmNlX2dlbmVyYXRvcl9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhNTI2OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9zb3VyY2VfZ2VuZXJhdG9yX2Jhc2UuaApAQCAtMCwwICsxLDcxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX1NPVVJDRV9HRU5FUkFUT1JfQkFTRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9TT1VSQ0VfR0VORVJBVE9SX0JBU0VfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNzaGFycCB7CisKK3N0cnVjdCBPcHRpb25zOworCitjbGFzcyBTb3VyY2VHZW5lcmF0b3JCYXNlIHsKKyBwcm90ZWN0ZWQ6CisgIFNvdXJjZUdlbmVyYXRvckJhc2UoY29uc3QgT3B0aW9ucyogb3B0aW9ucyk7CisgIHZpcnR1YWwgflNvdXJjZUdlbmVyYXRvckJhc2UoKTsKKworICBTb3VyY2VHZW5lcmF0b3JCYXNlKGNvbnN0IFNvdXJjZUdlbmVyYXRvckJhc2UmKSA9IGRlbGV0ZTsKKyAgU291cmNlR2VuZXJhdG9yQmFzZSYgb3BlcmF0b3I9KGNvbnN0IFNvdXJjZUdlbmVyYXRvckJhc2UmKSA9IGRlbGV0ZTsKKworICBzdGQ6OnN0cmluZyBjbGFzc19hY2Nlc3NfbGV2ZWwoKTsKKyAgY29uc3QgT3B0aW9ucyogb3B0aW9ucygpOworCisgIC8vIFdyaXRlIGFueSBhdHRyaWJ1dGVzIHVzZWQgdG8gZGVjb3JhdGUgZ2VuZXJhdGVkIGZ1bmN0aW9uIG1lbWJlcnMgKG1ldGhvZHMgYW5kIHByb3BlcnRpZXMpLgorICAvLyBTaG91bGQgbm90IGJlIHVzZWQgdG8gZGVjb3JhdGUgdHlwZXMuCisgIHZvaWQgV3JpdGVHZW5lcmF0ZWRDb2RlQXR0cmlidXRlcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorICBjb25zdCBPcHRpb25zICpvcHRpb25zXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjc2hhcnAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9TT1VSQ0VfR0VORVJBVE9SX0JBU0VfSF9fCisKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF93cmFwcGVyX2ZpZWxkLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3dyYXBwZXJfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzOGRkOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF93cmFwcGVyX2ZpZWxkLmNjCkBAIC0wLDAgKzEsMzA4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZG9jX2NvbW1lbnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfb3B0aW9ucy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3dyYXBwZXJfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjc2hhcnAgeworCitXcmFwcGVyRmllbGRHZW5lcmF0b3I6OldyYXBwZXJGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlc2VuY2VJbmRleCwgY29uc3QgT3B0aW9ucyAqb3B0aW9ucykKKyAgICA6IEZpZWxkR2VuZXJhdG9yQmFzZShkZXNjcmlwdG9yLCBwcmVzZW5jZUluZGV4LCBvcHRpb25zKSB7CisgIHZhcmlhYmxlc19bImhhc19wcm9wZXJ0eV9jaGVjayJdID0gbmFtZSgpICsgIl8gIT0gbnVsbCI7CisgIHZhcmlhYmxlc19bImhhc19ub3RfcHJvcGVydHlfY2hlY2siXSA9IG5hbWUoKSArICJfID09IG51bGwiOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHdyYXBwZWRfZmllbGQgPSBkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKS0+ZmllbGQoMCk7CisgIGlzX3ZhbHVlX3R5cGUgPSB3cmFwcGVkX2ZpZWxkLT50eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAmJgorICAgICAgd3JhcHBlZF9maWVsZC0+dHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzsKKyAgaWYgKGlzX3ZhbHVlX3R5cGUpIHsKKyAgICB2YXJpYWJsZXNfWyJub25udWxsYWJsZV90eXBlX25hbWUiXSA9IHR5cGVfbmFtZSh3cmFwcGVkX2ZpZWxkKTsKKyAgfQorfQorCitXcmFwcGVyRmllbGRHZW5lcmF0b3I6On5XcmFwcGVyRmllbGRHZW5lcmF0b3IoKSB7Cit9CisKK3ZvaWQgV3JhcHBlckZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzwkdHlwZV9uYW1lJD4gX3NpbmdsZV8kbmFtZSRfY29kZWMgPSAiKTsKKyAgR2VuZXJhdGVDb2RlY0NvZGUocHJpbnRlcik7CisgIHByaW50ZXItPlByaW50KAorICAgIHZhcmlhYmxlc18sCisgICAgIjtcbiIKKyAgICAicHJpdmF0ZSAkdHlwZV9uYW1lJCAkbmFtZSRfO1xuIik7CisgIFdyaXRlUHJvcGVydHlEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgQWRkUHVibGljTWVtYmVyQXR0cmlidXRlcyhwcmludGVyKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiJGFjY2Vzc19sZXZlbCQgJHR5cGVfbmFtZSQgJHByb3BlcnR5X25hbWUkIHtcbiIKKyAgICAiICBnZXQgeyByZXR1cm4gJG5hbWUkXzsgfVxuIgorICAgICIgIHNldCB7XG4iCisgICAgIiAgICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG5cbiIpOworICBpZiAoU3VwcG9ydHNQcmVzZW5jZUFwaShkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiLy8vIDxzdW1tYXJ5PkdldHMgd2hldGhlciB0aGUgJGRlc2NyaXB0b3JfbmFtZSQgZmllbGQgaXMgc2V0PC9zdW1tYXJ5PlxuIik7CisgICAgQWRkUHVibGljTWVtYmVyQXR0cmlidXRlcyhwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGFjY2Vzc19sZXZlbCQgYm9vbCBIYXMkcHJvcGVydHlfbmFtZSQge1xuIgorICAgICAgIiAgZ2V0IHsgcmV0dXJuICRuYW1lJF8gIT0gbnVsbDsgfVxuIgorICAgICAgIn1cblxuIik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIi8vLyA8c3VtbWFyeT5DbGVhcnMgdGhlIHZhbHVlIG9mIHRoZSAkZGVzY3JpcHRvcl9uYW1lJCBmaWVsZDwvc3VtbWFyeT5cbiIpOworICAgIEFkZFB1YmxpY01lbWJlckF0dHJpYnV0ZXMocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRhY2Nlc3NfbGV2ZWwkIHZvaWQgQ2xlYXIkcHJvcGVydHlfbmFtZSQoKSB7XG4iCisgICAgICAiICAkbmFtZSRfID0gbnVsbDtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorfQorCit2b2lkIFdyYXBwZXJGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgICJpZiAob3RoZXIuJGhhc19wcm9wZXJ0eV9jaGVjayQpIHtcbiIKKyAgICAiICBpZiAoJGhhc19ub3RfcHJvcGVydHlfY2hlY2skIHx8IG90aGVyLiRwcm9wZXJ0eV9uYW1lJCAhPSAkZGVmYXVsdF92YWx1ZSQpIHtcbiIKKyAgICAiICAgICRwcm9wZXJ0eV9uYW1lJCA9IG90aGVyLiRwcm9wZXJ0eV9uYW1lJDtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFdyYXBwZXJGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBHZW5lcmF0ZVBhcnNpbmdDb2RlKHByaW50ZXIsIHRydWUpOworfQorCit2b2lkIFdyYXBwZXJGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB1c2VfcGFyc2VfY29udGV4dCkgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgIHVzZV9wYXJzZV9jb250ZXh0CisgICAgPyAiJHR5cGVfbmFtZSQgdmFsdWUgPSBfc2luZ2xlXyRuYW1lJF9jb2RlYy5SZWFkKHJlZiBpbnB1dCk7XG4iCisgICAgICAiaWYgKCRoYXNfbm90X3Byb3BlcnR5X2NoZWNrJCB8fCB2YWx1ZSAhPSAkZGVmYXVsdF92YWx1ZSQpIHtcbiIKKyAgICAgICIgICRwcm9wZXJ0eV9uYW1lJCA9IHZhbHVlO1xuIgorICAgICAgIn1cbiIKKyAgICA6ICIkdHlwZV9uYW1lJCB2YWx1ZSA9IF9zaW5nbGVfJG5hbWUkX2NvZGVjLlJlYWQoaW5wdXQpO1xuIgorICAgICAgImlmICgkaGFzX25vdF9wcm9wZXJ0eV9jaGVjayQgfHwgdmFsdWUgIT0gJGRlZmF1bHRfdmFsdWUkKSB7XG4iCisgICAgICAiICAkcHJvcGVydHlfbmFtZSQgPSB2YWx1ZTtcbiIKKyAgICAgICJ9XG4iKTsKK30KKwordm9pZCBXcmFwcGVyRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShwcmludGVyLCB0cnVlKTsKK30KKwordm9pZCBXcmFwcGVyRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgdXNlX3dyaXRlX2NvbnRleHQpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICB1c2Vfd3JpdGVfY29udGV4dAorICAgID8gImlmICgkaGFzX3Byb3BlcnR5X2NoZWNrJCkge1xuIgorICAgICAgIiAgX3NpbmdsZV8kbmFtZSRfY29kZWMuV3JpdGVUYWdBbmRWYWx1ZShyZWYgb3V0cHV0LCAkcHJvcGVydHlfbmFtZSQpO1xuIgorICAgICAgIn1cbiIKKyAgICA6ICJpZiAoJGhhc19wcm9wZXJ0eV9jaGVjayQpIHtcbiIKKyAgICAgICIgIF9zaW5nbGVfJG5hbWUkX2NvZGVjLldyaXRlVGFnQW5kVmFsdWUob3V0cHV0LCAkcHJvcGVydHlfbmFtZSQpO1xuIgorICAgICAgIn1cbiIpOworfQorCit2b2lkIFdyYXBwZXJGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiaWYgKCRoYXNfcHJvcGVydHlfY2hlY2skKSB7XG4iCisgICAgIiAgc2l6ZSArPSBfc2luZ2xlXyRuYW1lJF9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZygkcHJvcGVydHlfbmFtZSQpO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBXcmFwcGVyRmllbGRHZW5lcmF0b3I6OldyaXRlSGFzaChpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBjb25zdCBjaGFyICp0ZXh0ID0gImlmICgkaGFzX3Byb3BlcnR5X2NoZWNrJCkgaGFzaCBePSAkcHJvcGVydHlfbmFtZSQuR2V0SGFzaENvZGUoKTtcbiI7CisgIGlmIChkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCktPmZpZWxkKDApLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUKSB7CisgICAgdGV4dCA9ICJpZiAoJGhhc19wcm9wZXJ0eV9jaGVjayQpIGhhc2ggXj0gcGJjOjpQcm90b2J1ZkVxdWFsaXR5Q29tcGFyZXJzLkJpdHdpc2VOdWxsYWJsZVNpbmdsZUVxdWFsaXR5Q29tcGFyZXIuR2V0SGFzaENvZGUoJHByb3BlcnR5X25hbWUkKTtcbiI7CisgIH0KKyAgZWxzZSBpZiAoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpLT5maWVsZCgwKS0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEUpIHsKKyAgICB0ZXh0ID0gImlmICgkaGFzX3Byb3BlcnR5X2NoZWNrJCkgaGFzaCBePSBwYmM6OlByb3RvYnVmRXF1YWxpdHlDb21wYXJlcnMuQml0d2lzZU51bGxhYmxlRG91YmxlRXF1YWxpdHlDb21wYXJlci5HZXRIYXNoQ29kZSgkcHJvcGVydHlfbmFtZSQpO1xuIjsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCB0ZXh0KTsKK30KKwordm9pZCBXcmFwcGVyRmllbGRHZW5lcmF0b3I6OldyaXRlRXF1YWxzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGNvbnN0IGNoYXIgKnRleHQgPSAiaWYgKCRwcm9wZXJ0eV9uYW1lJCAhPSBvdGhlci4kcHJvcGVydHlfbmFtZSQpIHJldHVybiBmYWxzZTtcbiI7CisgIGlmIChkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCktPmZpZWxkKDApLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUKSB7CisgICAgdGV4dCA9ICJpZiAoIXBiYzo6UHJvdG9idWZFcXVhbGl0eUNvbXBhcmVycy5CaXR3aXNlTnVsbGFibGVTaW5nbGVFcXVhbGl0eUNvbXBhcmVyLkVxdWFscygkcHJvcGVydHlfbmFtZSQsIG90aGVyLiRwcm9wZXJ0eV9uYW1lJCkpIHJldHVybiBmYWxzZTtcbiI7CisgIH0KKyAgZWxzZSBpZiAoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpLT5maWVsZCgwKS0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEUpIHsKKyAgICB0ZXh0ID0gImlmICghcGJjOjpQcm90b2J1ZkVxdWFsaXR5Q29tcGFyZXJzLkJpdHdpc2VOdWxsYWJsZURvdWJsZUVxdWFsaXR5Q29tcGFyZXIuRXF1YWxzKCRwcm9wZXJ0eV9uYW1lJCwgb3RoZXIuJHByb3BlcnR5X25hbWUkKSkgcmV0dXJuIGZhbHNlO1xuIjsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCB0ZXh0KTsKK30KKwordm9pZCBXcmFwcGVyRmllbGRHZW5lcmF0b3I6OldyaXRlVG9TdHJpbmcoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gVE9ETzogSW1wbGVtZW50IGlmIHdlIGV2ZXIgYWN0dWFsbHkgbmVlZCBpdC4uLgorfQorCit2b2lkIFdyYXBwZXJGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDbG9uaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkcHJvcGVydHlfbmFtZSQgPSBvdGhlci4kcHJvcGVydHlfbmFtZSQ7XG4iKTsKK30KKwordm9pZCBXcmFwcGVyRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ29kZWNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChpc192YWx1ZV90eXBlKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgInBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8JG5vbm51bGxhYmxlX3R5cGVfbmFtZSQ+KCR0YWckKSIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJwYjo6RmllbGRDb2RlYy5Gb3JDbGFzc1dyYXBwZXI8JHR5cGVfbmFtZSQ+KCR0YWckKSIpOworICB9Cit9CisKK3ZvaWQgV3JhcHBlckZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUV4dGVuc2lvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgV3JpdGVQcm9wZXJ0eURvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBBZGREZXByZWNhdGVkRmxhZyhwcmludGVyKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiJGFjY2Vzc19sZXZlbCQgc3RhdGljIHJlYWRvbmx5IHBiOjpFeHRlbnNpb248JGV4dGVuZGVkX3R5cGUkLCAkdHlwZV9uYW1lJD4gJHByb3BlcnR5X25hbWUkID1cbiIKKyAgICAiICBuZXcgcGI6OkV4dGVuc2lvbjwkZXh0ZW5kZWRfdHlwZSQsICR0eXBlX25hbWUkPigkbnVtYmVyJCwgIik7CisgIEdlbmVyYXRlQ29kZWNDb2RlKHByaW50ZXIpOworICBwcmludGVyLT5QcmludCgiKTtcbiIpOworfQorCitXcmFwcGVyT25lb2ZGaWVsZEdlbmVyYXRvcjo6V3JhcHBlck9uZW9mRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgcHJlc2VuY2VJbmRleCwgY29uc3QgT3B0aW9ucyAqb3B0aW9ucykKKyAgICA6IFdyYXBwZXJGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBwcmVzZW5jZUluZGV4LCBvcHRpb25zKSB7CisgICAgU2V0Q29tbW9uT25lb2ZGaWVsZFZhcmlhYmxlcygmdmFyaWFibGVzXyk7Cit9CisKK1dyYXBwZXJPbmVvZkZpZWxkR2VuZXJhdG9yOjp+V3JhcHBlck9uZW9mRmllbGRHZW5lcmF0b3IoKSB7Cit9CisKK3ZvaWQgV3JhcHBlck9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBOb3RlOiBkZWxpYmVyYXRlbHkgX29uZW9mXyRuYW1lJF9jb2RlYywgbm90IF8kb25lb2ZfbmFtZSRfY29kZWMuLi4gd2UgaGF2ZSBvbmUgY29kZWMgcGVyIGZpZWxkLgorICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgInByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPCR0eXBlX25hbWUkPiBfb25lb2ZfJG5hbWUkX2NvZGVjID0gIik7CisgIEdlbmVyYXRlQ29kZWNDb2RlKHByaW50ZXIpOworICBwcmludGVyLT5QcmludCgiO1xuIik7CisgIFdyaXRlUHJvcGVydHlEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgQWRkUHVibGljTWVtYmVyQXR0cmlidXRlcyhwcmludGVyKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiJGFjY2Vzc19sZXZlbCQgJHR5cGVfbmFtZSQgJHByb3BlcnR5X25hbWUkIHtcbiIKKyAgICAiICBnZXQgeyByZXR1cm4gJGhhc19wcm9wZXJ0eV9jaGVjayQgPyAoJHR5cGVfbmFtZSQpICRvbmVvZl9uYW1lJF8gOiAoJHR5cGVfbmFtZSQpIG51bGw7IH1cbiIKKyAgICAiICBzZXQge1xuIgorICAgICIgICAgJG9uZW9mX25hbWUkXyA9IHZhbHVlO1xuIgorICAgICIgICAgJG9uZW9mX25hbWUkQ2FzZV8gPSB2YWx1ZSA9PSBudWxsID8gJG9uZW9mX3Byb3BlcnR5X25hbWUkT25lb2ZDYXNlLk5vbmUgOiAkb25lb2ZfcHJvcGVydHlfbmFtZSRPbmVvZkNhc2UuJG9uZW9mX2Nhc2VfbmFtZSQ7XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iKTsKKyAgaWYgKFN1cHBvcnRzUHJlc2VuY2VBcGkoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIi8vLyA8c3VtbWFyeT5HZXRzIHdoZXRoZXIgdGhlIFwiJGRlc2NyaXB0b3JfbmFtZSRcIiBmaWVsZCBpcyBzZXQ8L3N1bW1hcnk+XG4iKTsKKyAgICBBZGRQdWJsaWNNZW1iZXJBdHRyaWJ1dGVzKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkYWNjZXNzX2xldmVsJCBib29sIEhhcyRwcm9wZXJ0eV9uYW1lJCB7XG4iCisgICAgICAiICBnZXQgeyByZXR1cm4gJG9uZW9mX25hbWUkQ2FzZV8gPT0gJG9uZW9mX3Byb3BlcnR5X25hbWUkT25lb2ZDYXNlLiRvbmVvZl9jYXNlX25hbWUkOyB9XG4iCisgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIi8vLyA8c3VtbWFyeT4gQ2xlYXJzIHRoZSB2YWx1ZSBvZiB0aGUgb25lb2YgaWYgaXQncyBjdXJyZW50bHkgc2V0IHRvIFwiJGRlc2NyaXB0b3JfbmFtZSRcIiA8L3N1bW1hcnk+XG4iKTsKKyAgICBBZGRQdWJsaWNNZW1iZXJBdHRyaWJ1dGVzKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkYWNjZXNzX2xldmVsJCB2b2lkIENsZWFyJHByb3BlcnR5X25hbWUkKCkge1xuIgorICAgICAgIiAgaWYgKCRoYXNfcHJvcGVydHlfY2hlY2skKSB7XG4iCisgICAgICAiICAgIENsZWFyJG9uZW9mX3Byb3BlcnR5X25hbWUkKCk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBXcmFwcGVyT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJHByb3BlcnR5X25hbWUkID0gb3RoZXIuJHByb3BlcnR5X25hbWUkO1xuIik7Cit9CisKK3ZvaWQgV3JhcHBlck9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgR2VuZXJhdGVQYXJzaW5nQ29kZShwcmludGVyLCB0cnVlKTsKK30KKwordm9pZCBXcmFwcGVyT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB1c2VfcGFyc2VfY29udGV4dCkgeworICBwcmludGVyLT5QcmludCgKKyAgICB2YXJpYWJsZXNfLAorICAgIHVzZV9wYXJzZV9jb250ZXh0CisgICAgPyAiJHByb3BlcnR5X25hbWUkID0gX29uZW9mXyRuYW1lJF9jb2RlYy5SZWFkKHJlZiBpbnB1dCk7XG4iCisgICAgOiAiJHByb3BlcnR5X25hbWUkID0gX29uZW9mXyRuYW1lJF9jb2RlYy5SZWFkKGlucHV0KTtcbiIpOworfQorCit2b2lkIFdyYXBwZXJPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUocHJpbnRlciwgdHJ1ZSk7Cit9CisKK3ZvaWQgV3JhcHBlck9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgdXNlX3dyaXRlX2NvbnRleHQpIHsKKyAgLy8gVE9ETzogSSBzdXNwZWN0IHRoaXMgaXMgd3JvbmcuLi4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICB1c2Vfd3JpdGVfY29udGV4dAorICAgID8gImlmICgkaGFzX3Byb3BlcnR5X2NoZWNrJCkge1xuIgorICAgICAgIiAgX29uZW9mXyRuYW1lJF9jb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKHJlZiBvdXRwdXQsICgkdHlwZV9uYW1lJCkgJG9uZW9mX25hbWUkXyk7XG4iCisgICAgICAifVxuIgorICAgIDogImlmICgkaGFzX3Byb3BlcnR5X2NoZWNrJCkge1xuIgorICAgICAgIiAgX29uZW9mXyRuYW1lJF9jb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKG91dHB1dCwgKCR0eXBlX25hbWUkKSAkb25lb2ZfbmFtZSRfKTtcbiIKKyAgICAgICJ9XG4iKTsKK30KKwordm9pZCBXcmFwcGVyT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gVE9ETzogSSBzdXNwZWN0IHRoaXMgaXMgd3JvbmcuLi4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgdmFyaWFibGVzXywKKyAgICAiaWYgKCRoYXNfcHJvcGVydHlfY2hlY2skKSB7XG4iCisgICAgIiAgc2l6ZSArPSBfb25lb2ZfJG5hbWUkX2NvZGVjLkNhbGN1bGF0ZVNpemVXaXRoVGFnKCRwcm9wZXJ0eV9uYW1lJCk7XG4iCisgICAgIn1cbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3NoYXJwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3dyYXBwZXJfZmllbGQuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF93cmFwcGVyX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4YTMxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF93cmFwcGVyX2ZpZWxkLmgKQEAgLTAsMCArMSw5NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NTSEFSUF9XUkFQUEVSX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1NIQVJQX1dSQVBQRVJfRklFTERfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9maWVsZF9iYXNlLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3NoYXJwIHsKKworc3RydWN0IE9wdGlvbnM7CisKK2NsYXNzIFdyYXBwZXJGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvckJhc2UgeworIHB1YmxpYzoKKyAgV3JhcHBlckZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVzZW5jZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyAqb3B0aW9ucyk7CisgIH5XcmFwcGVyRmllbGRHZW5lcmF0b3IoKTsKKworICBXcmFwcGVyRmllbGRHZW5lcmF0b3IoY29uc3QgV3JhcHBlckZpZWxkR2VuZXJhdG9yJikgPSBkZWxldGU7CisgIFdyYXBwZXJGaWVsZEdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IFdyYXBwZXJGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUNvZGVjQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUNsb25pbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB1c2VfcGFyc2VfY29udGV4dCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgdXNlX3dyaXRlX2NvbnRleHQpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVFeHRlbnNpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKworICB2aXJ0dWFsIHZvaWQgV3JpdGVIYXNoKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFdyaXRlRXF1YWxzKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFdyaXRlVG9TdHJpbmcoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgYm9vbCBpc192YWx1ZV90eXBlOyAvLyBUcnVlIGZvciBpbnQzMiBldGM7IGZhbHNlIGZvciBieXRlcyBhbmQgc3RyaW5nCit9OworCitjbGFzcyBXcmFwcGVyT25lb2ZGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBXcmFwcGVyRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgV3JhcHBlck9uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlc2VuY2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyAqb3B0aW9ucyk7CisgIH5XcmFwcGVyT25lb2ZGaWVsZEdlbmVyYXRvcigpOworCisgIFdyYXBwZXJPbmVvZkZpZWxkR2VuZXJhdG9yKGNvbnN0IFdyYXBwZXJPbmVvZkZpZWxkR2VuZXJhdG9yJikgPSBkZWxldGU7CisgIFdyYXBwZXJPbmVvZkZpZWxkR2VuZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgV3JhcHBlck9uZW9mRmllbGRHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyLCBib29sIHVzZV9wYXJzZV9jb250ZXh0KSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB1c2Vfd3JpdGVfY29udGV4dCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY3NoYXJwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DU0hBUlBfV1JBUFBFUl9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTI2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmNjCkBAIC0wLDAgKzEsNTI0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPGRpcmVjdC5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKKyNpZmRlZiBfV0lOMzIKKy8vIERPIE5PVCBpbmNsdWRlIDxpby5oPiwgaW5zdGVhZCBjcmVhdGUgZnVuY3Rpb25zIGluIGlvX3dpbjMyLntoLGNjfSBhbmQgaW1wb3J0CisvLyB0aGVtIGxpa2Ugd2UgZG8gYmVsb3cuCit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbzo6d2luMzI6OmFjY2VzczsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6b3BlbjsKKyNlbmRpZgorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgbG9va3MgbGlrZSBhIFdpbmRvd3Mtc3R5bGUgYWJzb2x1dGUgcGF0aCwgc3RhcnRpbmcKKy8vIHdpdGggYSBkcml2ZSBsZXR0ZXIuICBFeGFtcGxlOiAgIkM6XGZvbyIuICBUT0RPKGtlbnRvbik6ICBTaGFyZSB0aGlzIHdpdGgKKy8vIGNvcHkgaW4gY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYz8KK3N0YXRpYyBib29sIElzV2luZG93c0Fic29sdXRlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCkgeworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisgIHJldHVybiB0ZXh0LnNpemUoKSA+PSAzICYmIHRleHRbMV0gPT0gJzonICYmIGlzYWxwaGEodGV4dFswXSkgJiYKKyAgICAgICAgICh0ZXh0WzJdID09ICcvJyB8fCB0ZXh0WzJdID09ICdcXCcpICYmIHRleHQuZmluZF9sYXN0X29mKCc6JykgPT0gMTsKKyNlbHNlCisgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitNdWx0aUZpbGVFcnJvckNvbGxlY3Rvcjo6fk11bHRpRmlsZUVycm9yQ29sbGVjdG9yKCkge30KKworLy8gVGhpcyBjbGFzcyBzZXJ2ZXMgdHdvIHB1cnBvc2VzOgorLy8gLSBJdCBpbXBsZW1lbnRzIHRoZSBFcnJvckNvbGxlY3RvciBpbnRlcmZhY2UgKHVzZWQgYnkgVG9rZW5pemVyIGFuZCBQYXJzZXIpCisvLyAgIGluIHRlcm1zIG9mIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yLCB1c2luZyBhIHBhcnRpY3VsYXIgZmlsZW5hbWUuCisvLyAtIEl0IGxldHMgdXMgY2hlY2sgaWYgYW55IGVycm9ycyBoYXZlIG9jY3VycmVkLgorY2xhc3MgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZTo6U2luZ2xlRmlsZUVycm9yQ29sbGVjdG9yCisgICAgOiBwdWJsaWMgaW86OkVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIFNpbmdsZUZpbGVFcnJvckNvbGxlY3Rvcihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciogbXVsdGlfZmlsZV9lcnJvcl9jb2xsZWN0b3IpCisgICAgICA6IGZpbGVuYW1lXyhmaWxlbmFtZSksCisgICAgICAgIG11bHRpX2ZpbGVfZXJyb3JfY29sbGVjdG9yXyhtdWx0aV9maWxlX2Vycm9yX2NvbGxlY3RvciksCisgICAgICAgIGhhZF9lcnJvcnNfKGZhbHNlKSB7fQorICB+U2luZ2xlRmlsZUVycm9yQ29sbGVjdG9yKCkgb3ZlcnJpZGUge30KKworICBib29sIGhhZF9lcnJvcnMoKSB7IHJldHVybiBoYWRfZXJyb3JzXzsgfQorCisgIC8vIGltcGxlbWVudHMgRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSBvdmVycmlkZSB7CisgICAgaWYgKG11bHRpX2ZpbGVfZXJyb3JfY29sbGVjdG9yXyAhPSBudWxscHRyKSB7CisgICAgICBtdWx0aV9maWxlX2Vycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKGZpbGVuYW1lXywgbGluZSwgY29sdW1uLCBtZXNzYWdlKTsKKyAgICB9CisgICAgaGFkX2Vycm9yc18gPSB0cnVlOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBmaWxlbmFtZV87CisgIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yKiBtdWx0aV9maWxlX2Vycm9yX2NvbGxlY3Rvcl87CisgIGJvb2wgaGFkX2Vycm9yc187Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1NvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OlNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UoCisgICAgU291cmNlVHJlZSogc291cmNlX3RyZWUpCisgICAgOiBzb3VyY2VfdHJlZV8oc291cmNlX3RyZWUpLAorICAgICAgZmFsbGJhY2tfZGF0YWJhc2VfKG51bGxwdHIpLAorICAgICAgZXJyb3JfY29sbGVjdG9yXyhudWxscHRyKSwKKyAgICAgIHVzaW5nX3ZhbGlkYXRpb25fZXJyb3JfY29sbGVjdG9yXyhmYWxzZSksCisgICAgICB2YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcl8odGhpcykge30KKworU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZTo6U291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSgKKyAgICBTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSwgRGVzY3JpcHRvckRhdGFiYXNlKiBmYWxsYmFja19kYXRhYmFzZSkKKyAgICA6IHNvdXJjZV90cmVlXyhzb3VyY2VfdHJlZSksCisgICAgICBmYWxsYmFja19kYXRhYmFzZV8oZmFsbGJhY2tfZGF0YWJhc2UpLAorICAgICAgZXJyb3JfY29sbGVjdG9yXyhudWxscHRyKSwKKyAgICAgIHVzaW5nX3ZhbGlkYXRpb25fZXJyb3JfY29sbGVjdG9yXyhmYWxzZSksCisgICAgICB2YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcl8odGhpcykge30KKworU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZTo6flNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UoKSB7fQorCitib29sIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gaW5wdXQoc291cmNlX3RyZWVfLT5PcGVuKGZpbGVuYW1lKSk7CisgIGlmIChpbnB1dCA9PSBudWxscHRyKSB7CisgICAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyAhPSBudWxscHRyICYmCisgICAgICAgIGZhbGxiYWNrX2RhdGFiYXNlXy0+RmluZEZpbGVCeU5hbWUoZmlsZW5hbWUsIG91dHB1dCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZXJyb3JfY29sbGVjdG9yXyAhPSBudWxscHRyKSB7CisgICAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcihmaWxlbmFtZSwgLTEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfdHJlZV8tPkdldExhc3RFcnJvck1lc3NhZ2UoKSk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFNldCB1cCB0aGUgdG9rZW5pemVyIGFuZCBwYXJzZXIuCisgIFNpbmdsZUZpbGVFcnJvckNvbGxlY3RvciBmaWxlX2Vycm9yX2NvbGxlY3RvcihmaWxlbmFtZSwgZXJyb3JfY29sbGVjdG9yXyk7CisgIGlvOjpUb2tlbml6ZXIgdG9rZW5pemVyKGlucHV0LmdldCgpLCAmZmlsZV9lcnJvcl9jb2xsZWN0b3IpOworCisgIFBhcnNlciBwYXJzZXI7CisgIGlmIChlcnJvcl9jb2xsZWN0b3JfICE9IG51bGxwdHIpIHsKKyAgICBwYXJzZXIuUmVjb3JkRXJyb3JzVG8oJmZpbGVfZXJyb3JfY29sbGVjdG9yKTsKKyAgfQorICBpZiAodXNpbmdfdmFsaWRhdGlvbl9lcnJvcl9jb2xsZWN0b3JfKSB7CisgICAgcGFyc2VyLlJlY29yZFNvdXJjZUxvY2F0aW9uc1RvKCZzb3VyY2VfbG9jYXRpb25zXyk7CisgIH0KKworICAvLyBQYXJzZSBpdC4KKyAgb3V0cHV0LT5zZXRfbmFtZShmaWxlbmFtZSk7CisgIHJldHVybiBwYXJzZXIuUGFyc2UoJnRva2VuaXplciwgb3V0cHV0KSAmJiAhZmlsZV9lcnJvcl9jb2xsZWN0b3IuaGFkX2Vycm9ycygpOworfQorCitib29sIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9sX25hbWUsIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250YWluaW5nX3R5cGUsIGludCBmaWVsZF9udW1iZXIsCisgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlOjpWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3I6OgorICAgIFZhbGlkYXRpb25FcnJvckNvbGxlY3RvcihTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlKiBvd25lcikKKyAgICA6IG93bmVyXyhvd25lcikge30KKworU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZTo6VmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yOjoKKyAgICB+VmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yKCkge30KKwordm9pZCBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlOjpWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3I6OkFkZEVycm9yKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGVsZW1lbnRfbmFtZSwKKyAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLCBFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgIGlmIChvd25lcl8tPmVycm9yX2NvbGxlY3Rvcl8gPT0gbnVsbHB0cikgcmV0dXJuOworCisgIGludCBsaW5lLCBjb2x1bW47CisgIGlmIChsb2NhdGlvbiA9PSBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OklNUE9SVCkgeworICAgIG93bmVyXy0+c291cmNlX2xvY2F0aW9uc18uRmluZEltcG9ydChkZXNjcmlwdG9yLCBlbGVtZW50X25hbWUsICZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uKTsKKyAgfSBlbHNlIHsKKyAgICBvd25lcl8tPnNvdXJjZV9sb2NhdGlvbnNfLkZpbmQoZGVzY3JpcHRvciwgbG9jYXRpb24sICZsaW5lLCAmY29sdW1uKTsKKyAgfQorICBvd25lcl8tPmVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOworfQorCit2b2lkIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OlZhbGlkYXRpb25FcnJvckNvbGxlY3Rvcjo6QWRkV2FybmluZygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbGVtZW50X25hbWUsCisgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwgRXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICBpZiAob3duZXJfLT5lcnJvcl9jb2xsZWN0b3JfID09IG51bGxwdHIpIHJldHVybjsKKworICBpbnQgbGluZSwgY29sdW1uOworICBpZiAobG9jYXRpb24gPT0gRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpJTVBPUlQpIHsKKyAgICBvd25lcl8tPnNvdXJjZV9sb2NhdGlvbnNfLkZpbmRJbXBvcnQoZGVzY3JpcHRvciwgZWxlbWVudF9uYW1lLCAmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbik7CisgIH0gZWxzZSB7CisgICAgb3duZXJfLT5zb3VyY2VfbG9jYXRpb25zXy5GaW5kKGRlc2NyaXB0b3IsIGxvY2F0aW9uLCAmbGluZSwgJmNvbHVtbik7CisgIH0KKyAgb3duZXJfLT5lcnJvcl9jb2xsZWN0b3JfLT5BZGRXYXJuaW5nKGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ltcG9ydGVyOjpJbXBvcnRlcihTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSwKKyAgICAgICAgICAgICAgICAgICBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKQorICAgIDogZGF0YWJhc2VfKHNvdXJjZV90cmVlKSwKKyAgICAgIHBvb2xfKCZkYXRhYmFzZV8sIGRhdGFiYXNlXy5HZXRWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3IoKSkgeworICBwb29sXy5FbmZvcmNlV2Vha0RlcGVuZGVuY2llcyh0cnVlKTsKKyAgZGF0YWJhc2VfLlJlY29yZEVycm9yc1RvKGVycm9yX2NvbGxlY3Rvcik7Cit9CisKK0ltcG9ydGVyOjp+SW1wb3J0ZXIoKSB7fQorCitjb25zdCBGaWxlRGVzY3JpcHRvciogSW1wb3J0ZXI6OkltcG9ydChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKKyAgcmV0dXJuIHBvb2xfLkZpbmRGaWxlQnlOYW1lKGZpbGVuYW1lKTsKK30KKwordm9pZCBJbXBvcnRlcjo6QWRkVW51c2VkSW1wb3J0VHJhY2tGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19lcnJvcikgeworICBwb29sXy5BZGRVbnVzZWRJbXBvcnRUcmFja0ZpbGUoZmlsZV9uYW1lLCBpc19lcnJvcik7Cit9CisKK3ZvaWQgSW1wb3J0ZXI6OkNsZWFyVW51c2VkSW1wb3J0VHJhY2tGaWxlcygpIHsKKyAgcG9vbF8uQ2xlYXJVbnVzZWRJbXBvcnRUcmFja0ZpbGVzKCk7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTb3VyY2VUcmVlOjp+U291cmNlVHJlZSgpIHt9CisKK3N0ZDo6c3RyaW5nIFNvdXJjZVRyZWU6OkdldExhc3RFcnJvck1lc3NhZ2UoKSB7IHJldHVybiAiRmlsZSBub3QgZm91bmQuIjsgfQorCitEaXNrU291cmNlVHJlZTo6RGlza1NvdXJjZVRyZWUoKSB7fQorCitEaXNrU291cmNlVHJlZTo6fkRpc2tTb3VyY2VUcmVlKCkge30KKworc3RhdGljIGlubGluZSBjaGFyIExhc3RDaGFyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHN0cltzdHIuc2l6ZSgpIC0gMV07Cit9CisKKy8vIEdpdmVuIGEgcGF0aCwgcmV0dXJucyBhbiBlcXVpdmFsZW50IHBhdGggd2l0aCB0aGVzZSBjaGFuZ2VzOgorLy8gLSBPbiBXaW5kb3dzLCBhbnkgYmFja3NsYXNoZXMgYXJlIHJlcGxhY2VkIHdpdGggZm9yd2FyZCBzbGFzaGVzLgorLy8gLSBBbnkgaW5zdGFuY2VzIG9mIHRoZSBkaXJlY3RvcnkgIi4iIGFyZSByZW1vdmVkLgorLy8gLSBBbnkgY29uc2VjdXRpdmUgJy8ncyBhcmUgY29sbGFwc2VkIGludG8gYSBzaW5nbGUgc2xhc2guCisvLyBOb3RlIHRoYXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgbWF5IGJlIGVtcHR5LgorLy8KKy8vIFRPRE8oa2VudG9uKTogIEl0IHdvdWxkIGJlIG5pY2UgdG8gaGFuZGxlICIuLiIsIGUuZy4gc28gdGhhdCB3ZSBjYW4gZmlndXJlCisvLyAgIG91dCB0aGF0ICJmb28vYmFyLnByb3RvIiBpcyBpbnNpZGUgImJhei8uLi9mb28iLiAgSG93ZXZlciwgaWYgYmF6IGlzIGEKKy8vICAgc3ltbGluayBvciBkb2Vzbid0IGV4aXN0LCB0aGVuIHRoaW5ncyBnZXQgY29tcGxpY2F0ZWQsIGFuZCB3ZSBjYW4ndAorLy8gICBhY3R1YWxseSBkZXRlcm1pbmUgdGhpcyB3aXRob3V0IGludmVzdGlnYXRpbmcgdGhlIGZpbGVzeXN0ZW0sIHByb2JhYmx5CisvLyAgIGluIG5vbi1wb3J0YWJsZSB3YXlzLiAgU28sIHdlIHB1bnQuCisvLworLy8gVE9ETyhrZW50b24pOiAgSXQgd291bGQgYmUgbmljZSB0byB1c2UgcmVhbHBhdGgoKSBoZXJlIGV4Y2VwdCB0aGF0IGl0CisvLyAgIHJlc29sdmVzIHN5bWJvbGljIGxpbmtzLiAgVGhpcyBjb3VsZCBjYXVzZSBwcm9ibGVtcyBpZiBwZW9wbGUgcGxhY2UKKy8vICAgc3ltYm9saWMgbGlua3MgaW4gdGhlaXIgc291cmNlIHRyZWUuICBGb3IgZXhhbXBsZSwgaWYgeW91IGV4ZWN1dGVkOgorLy8gICAgIHByb3RvYyAtLXByb3RvX3BhdGg9Zm9vIGZvby9iYXIvYmF6LnByb3RvCisvLyAgIHRoZW4gaWYgZm9vL2JhciBpcyBhIHN5bWJvbGljIGxpbmssIGZvby9iYXIvYmF6LnByb3RvIHdpbGwgY2Fub25pY2FsaXplCisvLyAgIHRvIGEgcGF0aCB3aGljaCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgdW5kZXIgZm9vLCBhbmQgdGh1cyB0aGUgY29tcGlsZXIKKy8vICAgd2lsbCBjb21wbGFpbiB0aGF0IGJhei5wcm90byBpcyBub3QgaW5zaWRlIHRoZSAtLXByb3RvX3BhdGguCitzdGF0aWMgc3RkOjpzdHJpbmcgQ2Fub25pY2FsaXplUGF0aChzdGQ6OnN0cmluZyBwYXRoKSB7CisjaWZkZWYgX1dJTjMyCisgIC8vIFRoZSBXaW4zMiBBUEkgYWNjZXB0cyBmb3J3YXJkIHNsYXNoZXMgYXMgYSBwYXRoIGRlbGltaXRlciBldmVuIHRob3VnaAorICAvLyBiYWNrc2xhc2hlcyBhcmUgc3RhbmRhcmQuICBMZXQncyBhdm9pZCBjb25mdXNpb24gYW5kIHVzZSBvbmx5IGZvcndhcmQKKyAgLy8gc2xhc2hlcy4KKyAgaWYgKEhhc1ByZWZpeFN0cmluZyhwYXRoLCAiXFxcXCIpKSB7CisgICAgLy8gQXZvaWQgY29udmVydGluZyB0d28gbGVhZGluZyBiYWNrc2xhc2hlcy4KKyAgICBwYXRoID0gIlxcXFwiICsgU3RyaW5nUmVwbGFjZShwYXRoLnN1YnN0cigyKSwgIlxcIiwgIi8iLCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBwYXRoID0gU3RyaW5nUmVwbGFjZShwYXRoLCAiXFwiLCAiLyIsIHRydWUpOworICB9CisjZW5kaWYKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY2Fub25pY2FsX3BhcnRzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGFydHMgPSBTcGxpdCgKKyAgICAgIHBhdGgsICIvIiwgdHJ1ZSk7ICAvLyBOb3RlOiAgUmVtb3ZlcyBlbXB0eSBwYXJ0cy4KKyAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyYgcGFydCA6IHBhcnRzKSB7CisgICAgaWYgKHBhcnQgPT0gIi4iKSB7CisgICAgICAvLyBJZ25vcmUuCisgICAgfSBlbHNlIHsKKyAgICAgIGNhbm9uaWNhbF9wYXJ0cy5wdXNoX2JhY2socGFydCk7CisgICAgfQorICB9CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IEpvaW4oY2Fub25pY2FsX3BhcnRzLCAiLyIpOworICBpZiAoIXBhdGguZW1wdHkoKSAmJiBwYXRoWzBdID09ICcvJykgeworICAgIC8vIFJlc3RvcmUgbGVhZGluZyBzbGFzaC4KKyAgICByZXN1bHQgPSAnLycgKyByZXN1bHQ7CisgIH0KKyAgaWYgKCFwYXRoLmVtcHR5KCkgJiYgTGFzdENoYXIocGF0aCkgPT0gJy8nICYmICFyZXN1bHQuZW1wdHkoKSAmJgorICAgICAgTGFzdENoYXIocmVzdWx0KSAhPSAnLycpIHsKKyAgICAvLyBSZXN0b3JlIHRyYWlsaW5nIHNsYXNoLgorICAgIHJlc3VsdCArPSAnLyc7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBib29sIENvbnRhaW5zUGFyZW50UmVmZXJlbmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgIHJldHVybiBwYXRoID09ICIuLiIgfHwgSGFzUHJlZml4U3RyaW5nKHBhdGgsICIuLi8iKSB8fAorICAgICAgICAgSGFzU3VmZml4U3RyaW5nKHBhdGgsICIvLi4iKSB8fCBwYXRoLmZpbmQoIi8uLi8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKK30KKworLy8gTWFwcyBhIGZpbGUgZnJvbSBhbiBvbGQgbG9jYXRpb24gdG8gYSBuZXcgb25lLiAgVHlwaWNhbGx5LCBvbGRfcHJlZml4IGlzCisvLyBhIHZpcnR1YWwgcGF0aCBhbmQgbmV3X3ByZWZpeCBpcyBpdHMgY29ycmVzcG9uZGluZyBkaXNrIHBhdGguICBSZXR1cm5zCisvLyBmYWxzZSBpZiB0aGUgZmlsZW5hbWUgZGlkIG5vdCBzdGFydCB3aXRoIG9sZF9wcmVmaXgsIG90aGVyd2lzZSByZXBsYWNlcworLy8gb2xkX3ByZWZpeCB3aXRoIG5ld19wcmVmaXggYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluICpyZXN1bHQuICBFeGFtcGxlczoKKy8vICAgc3RyaW5nIHJlc3VsdDsKKy8vICAgYXNzZXJ0KEFwcGx5TWFwcGluZygiZm9vL2JhciIsICIiLCAiYmF6IiwgJnJlc3VsdCkpOworLy8gICBhc3NlcnQocmVzdWx0ID09ICJiYXovZm9vL2JhciIpOworLy8KKy8vICAgYXNzZXJ0KEFwcGx5TWFwcGluZygiZm9vL2JhciIsICJmb28iLCAiYmF6IiwgJnJlc3VsdCkpOworLy8gICBhc3NlcnQocmVzdWx0ID09ICJiYXovYmFyIik7CisvLworLy8gICBhc3NlcnQoQXBwbHlNYXBwaW5nKCJmb28iLCAiZm9vIiwgImJhciIsICZyZXN1bHQpKTsKKy8vICAgYXNzZXJ0KHJlc3VsdCA9PSAiYmFyIik7CisvLworLy8gICBhc3NlcnQoIUFwcGx5TWFwcGluZygiZm9vL2JhciIsICJiYXoiLCAicXV4IiwgJnJlc3VsdCkpOworLy8gICBhc3NlcnQoIUFwcGx5TWFwcGluZygiZm9vL2JhciIsICJiYXoiLCAicXV4IiwgJnJlc3VsdCkpOworLy8gICBhc3NlcnQoIUFwcGx5TWFwcGluZygiZm9vYmFyIiwgImZvbyIsICJiYXoiLCAmcmVzdWx0KSk7CitzdGF0aWMgYm9vbCBBcHBseU1hcHBpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvbGRfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdfcHJlZml4LCBzdGQ6OnN0cmluZyogcmVzdWx0KSB7CisgIGlmIChvbGRfcHJlZml4LmVtcHR5KCkpIHsKKyAgICAvLyBvbGRfcHJlZml4IG1hdGNoZXMgYW55IHJlbGF0aXZlIHBhdGguCisgICAgaWYgKENvbnRhaW5zUGFyZW50UmVmZXJlbmNlKGZpbGVuYW1lKSkgeworICAgICAgLy8gV2UgZG8gbm90IGFsbG93IHRoZSBmaWxlIG5hbWUgdG8gdXNlICIuLiIuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChIYXNQcmVmaXhTdHJpbmcoZmlsZW5hbWUsICIvIikgfHwgSXNXaW5kb3dzQWJzb2x1dGVQYXRoKGZpbGVuYW1lKSkgeworICAgICAgLy8gVGhpcyBpcyBhbiBhYnNvbHV0ZSBwYXRoLCBzbyBpdCBpc24ndCBtYXRjaGVkIGJ5IHRoZSBlbXB0eSBzdHJpbmcuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJlc3VsdC0+YXNzaWduKG5ld19wcmVmaXgpOworICAgIGlmICghcmVzdWx0LT5lbXB0eSgpKSByZXN1bHQtPnB1c2hfYmFjaygnLycpOworICAgIHJlc3VsdC0+YXBwZW5kKGZpbGVuYW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChIYXNQcmVmaXhTdHJpbmcoZmlsZW5hbWUsIG9sZF9wcmVmaXgpKSB7CisgICAgLy8gb2xkX3ByZWZpeCBpcyBhIHByZWZpeCBvZiB0aGUgZmlsZW5hbWUuICBJcyBpdCB0aGUgd2hvbGUgZmlsZW5hbWU/CisgICAgaWYgKGZpbGVuYW1lLnNpemUoKSA9PSBvbGRfcHJlZml4LnNpemUoKSkgeworICAgICAgLy8gWWVwLCBpdCdzIGFuIGV4YWN0IG1hdGNoLgorICAgICAgKnJlc3VsdCA9IG5ld19wcmVmaXg7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTm90IGFuIGV4YWN0IG1hdGNoLiAgSXMgdGhlIG5leHQgY2hhcmFjdGVyIGEgJy8nPyAgT3RoZXJ3aXNlLAorICAgICAgLy8gdGhpcyBpc24ndCBhY3R1YWxseSBhIG1hdGNoIGF0IGFsbC4gIEUuZy4gdGhlIHByZWZpeCAiZm9vL2JhciIKKyAgICAgIC8vIGRvZXMgbm90IG1hdGNoIHRoZSBmaWxlbmFtZSAiZm9vL2JhcmJheiIuCisgICAgICBpbnQgYWZ0ZXJfcHJlZml4X3N0YXJ0ID0gLTE7CisgICAgICBpZiAoZmlsZW5hbWVbb2xkX3ByZWZpeC5zaXplKCldID09ICcvJykgeworICAgICAgICBhZnRlcl9wcmVmaXhfc3RhcnQgPSBvbGRfcHJlZml4LnNpemUoKSArIDE7CisgICAgICB9IGVsc2UgaWYgKGZpbGVuYW1lW29sZF9wcmVmaXguc2l6ZSgpIC0gMV0gPT0gJy8nKSB7CisgICAgICAgIC8vIG9sZF9wcmVmaXggaXMgbmV2ZXIgZW1wdHksIGFuZCBjYW5vbmljYWxpemVkIHBhdGhzIG5ldmVyIGhhdmUKKyAgICAgICAgLy8gY29uc2VjdXRpdmUgJy8nIGNoYXJhY3RlcnMuCisgICAgICAgIGFmdGVyX3ByZWZpeF9zdGFydCA9IG9sZF9wcmVmaXguc2l6ZSgpOworICAgICAgfQorICAgICAgaWYgKGFmdGVyX3ByZWZpeF9zdGFydCAhPSAtMSkgeworICAgICAgICAvLyBZZXAuICBTbyB0aGUgcHJlZml4ZXMgYXJlIGRpcmVjdG9yaWVzIGFuZCB0aGUgZmlsZW5hbWUgaXMgYSBmaWxlCisgICAgICAgIC8vIGluc2lkZSB0aGVtLgorICAgICAgICBzdGQ6OnN0cmluZyBhZnRlcl9wcmVmaXggPSBmaWxlbmFtZS5zdWJzdHIoYWZ0ZXJfcHJlZml4X3N0YXJ0KTsKKyAgICAgICAgaWYgKENvbnRhaW5zUGFyZW50UmVmZXJlbmNlKGFmdGVyX3ByZWZpeCkpIHsKKyAgICAgICAgICAvLyBXZSBkbyBub3QgYWxsb3cgdGhlIGZpbGUgbmFtZSB0byB1c2UgIi4uIi4KKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LT5hc3NpZ24obmV3X3ByZWZpeCk7CisgICAgICAgIGlmICghcmVzdWx0LT5lbXB0eSgpKSByZXN1bHQtPnB1c2hfYmFjaygnLycpOworICAgICAgICByZXN1bHQtPmFwcGVuZChhZnRlcl9wcmVmaXgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgRGlza1NvdXJjZVRyZWU6Ok1hcFBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHZpcnR1YWxfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRpc2tfcGF0aCkgeworICBtYXBwaW5nc18ucHVzaF9iYWNrKE1hcHBpbmcodmlydHVhbF9wYXRoLCBDYW5vbmljYWxpemVQYXRoKGRpc2tfcGF0aCkpKTsKK30KKworRGlza1NvdXJjZVRyZWU6OkRpc2tGaWxlVG9WaXJ0dWFsRmlsZVJlc3VsdAorRGlza1NvdXJjZVRyZWU6OkRpc2tGaWxlVG9WaXJ0dWFsRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZGlza19maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogdmlydHVhbF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogc2hhZG93aW5nX2Rpc2tfZmlsZSkgeworICBpbnQgbWFwcGluZ19pbmRleCA9IC0xOworICBzdGQ6OnN0cmluZyBjYW5vbmljYWxfZGlza19maWxlID0gQ2Fub25pY2FsaXplUGF0aChkaXNrX2ZpbGUpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3NfLnNpemUoKTsgaSsrKSB7CisgICAgLy8gQXBwbHkgdGhlIG1hcHBpbmcgaW4gcmV2ZXJzZS4KKyAgICBpZiAoQXBwbHlNYXBwaW5nKGNhbm9uaWNhbF9kaXNrX2ZpbGUsIG1hcHBpbmdzX1tpXS5kaXNrX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nc19baV0udmlydHVhbF9wYXRoLCB2aXJ0dWFsX2ZpbGUpKSB7CisgICAgICAvLyBTdWNjZXNzLgorICAgICAgbWFwcGluZ19pbmRleCA9IGk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAobWFwcGluZ19pbmRleCA9PSAtMSkgeworICAgIHJldHVybiBOT19NQVBQSU5HOworICB9CisKKyAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBtYXBwaW5ncyB3aXRoIGhpZ2hlciBwcmVjZWRlbmNlIGFuZCB2ZXJpZnkgdGhhdCBub25lCisgIC8vIG9mIHRoZW0gbWFwIHRoaXMgZmlsZSB0byBzb21lIG90aGVyIGV4aXN0aW5nIGZpbGUuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ19pbmRleDsgaSsrKSB7CisgICAgaWYgKEFwcGx5TWFwcGluZygqdmlydHVhbF9maWxlLCBtYXBwaW5nc19baV0udmlydHVhbF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ3NfW2ldLmRpc2tfcGF0aCwgc2hhZG93aW5nX2Rpc2tfZmlsZSkpIHsKKyAgICAgIGlmIChhY2Nlc3Moc2hhZG93aW5nX2Rpc2tfZmlsZS0+Y19zdHIoKSwgRl9PSykgPj0gMCkgeworICAgICAgICAvLyBGaWxlIGV4aXN0cy4KKyAgICAgICAgcmV0dXJuIFNIQURPV0VEOworICAgICAgfQorICAgIH0KKyAgfQorICBzaGFkb3dpbmdfZGlza19maWxlLT5jbGVhcigpOworCisgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiBvcGVuIHRoZSBmaWxlLiAgTm90ZSB0aGF0IHRoaXMgYWxzbyBoYXMgdGhlIHNpZGUtZWZmZWN0CisgIC8vIG9mIHZlcmlmeWluZyB0aGF0IHdlIGFyZSBub3QgY2Fub25pY2FsaXppbmcgYXdheSBhbnkgbm9uLWV4aXN0ZW50CisgIC8vIGRpcmVjdG9yaWVzLgorICBzdGQ6OnVuaXF1ZV9wdHI8aW86Olplcm9Db3B5SW5wdXRTdHJlYW0+IHN0cmVhbShPcGVuRGlza0ZpbGUoZGlza19maWxlKSk7CisgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgIHJldHVybiBDQU5OT1RfT1BFTjsKKyAgfQorCisgIHJldHVybiBTVUNDRVNTOworfQorCitib29sIERpc2tTb3VyY2VUcmVlOjpWaXJ0dWFsRmlsZVRvRGlza0ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHZpcnR1YWxfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZGlza19maWxlKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gc3RyZWFtKAorICAgICAgT3BlblZpcnR1YWxGaWxlKHZpcnR1YWxfZmlsZSwgZGlza19maWxlKSk7CisgIHJldHVybiBzdHJlYW0gIT0gbnVsbHB0cjsKK30KKworaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIERpc2tTb3VyY2VUcmVlOjpPcGVuKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgeworICByZXR1cm4gT3BlblZpcnR1YWxGaWxlKGZpbGVuYW1lLCBudWxscHRyKTsKK30KKworc3RkOjpzdHJpbmcgRGlza1NvdXJjZVRyZWU6OkdldExhc3RFcnJvck1lc3NhZ2UoKSB7CisgIHJldHVybiBsYXN0X2Vycm9yX21lc3NhZ2VfOworfQorCitpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogRGlza1NvdXJjZVRyZWU6Ok9wZW5WaXJ0dWFsRmlsZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmlydHVhbF9maWxlLCBzdGQ6OnN0cmluZyogZGlza19maWxlKSB7CisgIGlmICh2aXJ0dWFsX2ZpbGUgIT0gQ2Fub25pY2FsaXplUGF0aCh2aXJ0dWFsX2ZpbGUpIHx8CisgICAgICBDb250YWluc1BhcmVudFJlZmVyZW5jZSh2aXJ0dWFsX2ZpbGUpKSB7CisgICAgLy8gV2UgZG8gbm90IGFsbG93IGltcG9ydGluZyBvZiBwYXRocyBjb250YWluaW5nIHRoaW5ncyBsaWtlICIuLiIgb3IKKyAgICAvLyBjb25zZWN1dGl2ZSBzbGFzaGVzIHNpbmNlIHRoZSBjb21waWxlciBleHBlY3RzIGZpbGVzIHRvIGJlIHVuaXF1ZWx5CisgICAgLy8gaWRlbnRpZmllZCBieSBmaWxlIG5hbWUuCisgICAgbGFzdF9lcnJvcl9tZXNzYWdlXyA9CisgICAgICAgICJCYWNrc2xhc2hlcywgY29uc2VjdXRpdmUgc2xhc2hlcywgXCIuXCIsIG9yIFwiLi5cIiAiCisgICAgICAgICJhcmUgbm90IGFsbG93ZWQgaW4gdGhlIHZpcnR1YWwgcGF0aCI7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBmb3IgKGNvbnN0IGF1dG8mIG1hcHBpbmcgOiBtYXBwaW5nc18pIHsKKyAgICBzdGQ6OnN0cmluZyB0ZW1wX2Rpc2tfZmlsZTsKKyAgICBpZiAoQXBwbHlNYXBwaW5nKHZpcnR1YWxfZmlsZSwgbWFwcGluZy52aXJ0dWFsX3BhdGgsIG1hcHBpbmcuZGlza19wYXRoLAorICAgICAgICAgICAgICAgICAgICAgJnRlbXBfZGlza19maWxlKSkgeworICAgICAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIHN0cmVhbSA9IE9wZW5EaXNrRmlsZSh0ZW1wX2Rpc2tfZmlsZSk7CisgICAgICBpZiAoc3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGRpc2tfZmlsZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgKmRpc2tfZmlsZSA9IHRlbXBfZGlza19maWxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHJlYW07CisgICAgICB9CisKKyAgICAgIGlmIChlcnJubyA9PSBFQUNDRVMpIHsKKyAgICAgICAgLy8gVGhlIGZpbGUgZXhpc3RzIGJ1dCBpcyBub3QgcmVhZGFibGUuCisgICAgICAgIGxhc3RfZXJyb3JfbWVzc2FnZV8gPQorICAgICAgICAgICAgIlJlYWQgYWNjZXNzIGlzIGRlbmllZCBmb3IgZmlsZTogIiArIHRlbXBfZGlza19maWxlOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgbGFzdF9lcnJvcl9tZXNzYWdlXyA9ICJGaWxlIG5vdCBmb3VuZC4iOworICByZXR1cm4gbnVsbHB0cjsKK30KKworaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIERpc2tTb3VyY2VUcmVlOjpPcGVuRGlza0ZpbGUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHN0cnVjdCBzdGF0IHNiOworICBpbnQgcmV0ID0gMDsKKyAgZG8geworICAgIHJldCA9IHN0YXQoZmlsZW5hbWUuY19zdHIoKSwgJnNiKTsKKyAgfSB3aGlsZSAocmV0ICE9IDAgJiYgZXJybm8gPT0gRUlOVFIpOworI2lmIGRlZmluZWQoX1dJTjMyKQorICBpZiAocmV0ID09IDAgJiYgc2Iuc3RfbW9kZSAmIFNfSUZESVIpIHsKKyAgICBsYXN0X2Vycm9yX21lc3NhZ2VfID0gIklucHV0IGZpbGUgaXMgYSBkaXJlY3RvcnkuIjsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorI2Vsc2UKKyAgaWYgKHJldCA9PSAwICYmIFNfSVNESVIoc2Iuc3RfbW9kZSkpIHsKKyAgICBsYXN0X2Vycm9yX21lc3NhZ2VfID0gIklucHV0IGZpbGUgaXMgYSBkaXJlY3RvcnkuIjsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorI2VuZGlmCisgIGludCBmaWxlX2Rlc2NyaXB0b3I7CisgIGRvIHsKKyAgICBmaWxlX2Rlc2NyaXB0b3IgPSBvcGVuKGZpbGVuYW1lLmNfc3RyKCksIE9fUkRPTkxZKTsKKyAgfSB3aGlsZSAoZmlsZV9kZXNjcmlwdG9yIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisgIGlmIChmaWxlX2Rlc2NyaXB0b3IgPj0gMCkgeworICAgIGlvOjpGaWxlSW5wdXRTdHJlYW0qIHJlc3VsdCA9IG5ldyBpbzo6RmlsZUlucHV0U3RyZWFtKGZpbGVfZGVzY3JpcHRvcik7CisgICAgcmVzdWx0LT5TZXRDbG9zZU9uRGVsZXRlKHRydWUpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmI4OGI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oCkBAIC0wLDAgKzEsMzM4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoZSAucHJvdG8gZmlsZSBwYXJzZXIuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0lNUE9SVEVSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSU1QT1JURVJfSF9fCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIGlvIHsKK2NsYXNzIFplcm9Db3B5SW5wdXRTdHJlYW07Cit9CisKK25hbWVzcGFjZSBjb21waWxlciB7CisKKy8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgorY2xhc3MgSW1wb3J0ZXI7CitjbGFzcyBNdWx0aUZpbGVFcnJvckNvbGxlY3RvcjsKK2NsYXNzIFNvdXJjZVRyZWU7CitjbGFzcyBEaXNrU291cmNlVHJlZTsKKworLy8gVE9ETyhrZW50b24pOiAgTW92ZSBhbGwgU291cmNlVHJlZSBzdHVmZiB0byBhIHNlcGFyYXRlIGZpbGU/CisKKy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIERlc2NyaXB0b3JEYXRhYmFzZSB3aGljaCBsb2FkcyBmaWxlcyBmcm9tIGEgU291cmNlVHJlZQorLy8gYW5kIHBhcnNlcyB0aGVtLgorLy8KKy8vIE5vdGU6ICBUaGlzIGNsYXNzIGlzIG5vdCB0aHJlYWQtc2FmZSBzaW5jZSBpdCBtYWludGFpbnMgYSB0YWJsZSBvZiBzb3VyY2UKKy8vICAgY29kZSBsb2NhdGlvbnMgZm9yIGVycm9yIHJlcG9ydGluZy4gIEhvd2V2ZXIsIHdoZW4gYSBEZXNjcmlwdG9yUG9vbCB3cmFwcworLy8gICBhIERlc2NyaXB0b3JEYXRhYmFzZSwgaXQgdXNlcyBtdXRleCBsb2NraW5nIHRvIG1ha2Ugc3VyZSBvbmx5IG9uZSBtZXRob2QKKy8vICAgb2YgdGhlIGRhdGFiYXNlIGlzIGNhbGxlZCBhdCBhIHRpbWUsIGV2ZW4gaWYgdGhlIERlc2NyaXB0b3JQb29sIGlzIHVzZWQKKy8vICAgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLiAgVGhlcmVmb3JlLCB0aGVyZSBpcyBvbmx5IGEgcHJvYmxlbSBpZiB5b3UgY3JlYXRlCisvLyAgIG11bHRpcGxlIERlc2NyaXB0b3JQb29scyB3cmFwcGluZyB0aGUgc2FtZSBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlCisvLyAgIGFuZCB1c2UgdGhlbSBmcm9tIG11bHRpcGxlIHRocmVhZHMuCisvLworLy8gTm90ZTogIFRoaXMgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgpIG9yCisvLyAgIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigpOyB0aGVzZSB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgeworIHB1YmxpYzoKKyAgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZShTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSk7CisKKyAgLy8gSWYgbm9uLU5VTEwsIGZhbGxiYWNrX2RhdGFiYXNlIHdpbGwgYmUgY2hlY2tlZCBpZiBhIGZpbGUgZG9lc24ndCBleGlzdCBpbgorICAvLyB0aGUgc3BlY2lmaWVkIHNvdXJjZV90cmVlLgorICBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlKFNvdXJjZVRyZWUqIHNvdXJjZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JEYXRhYmFzZSogZmFsbGJhY2tfZGF0YWJhc2UpOworICB+U291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSgpIG92ZXJyaWRlOworCisgIC8vIEluc3RydWN0cyB0aGUgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSB0byByZXBvcnQgYW55IHBhcnNlIGVycm9ycworICAvLyB0byB0aGUgZ2l2ZW4gTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCisgIC8vIHBhcnNpbmcuICBlcnJvcl9jb2xsZWN0b3IgbXVzdCByZW1haW4gdmFsaWQgdW50aWwgZWl0aGVyIHRoaXMgbWV0aG9kCisgIC8vIGlzIGNhbGxlZCBhZ2FpbiBvciB0aGUgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSBpcyBkZXN0cm95ZWQuCisgIHZvaWQgUmVjb3JkRXJyb3JzVG8oTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3RvcikgeworICAgIGVycm9yX2NvbGxlY3Rvcl8gPSBlcnJvcl9jb2xsZWN0b3I7CisgIH0KKworICAvLyBHZXRzIGEgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yIHdoaWNoIHJlY29yZHMgZXJyb3JzIHRvIHRoZQorICAvLyBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciBzcGVjaWZpZWQgd2l0aCBSZWNvcmRFcnJvcnNUbygpLiAgVGhpcyBjb2xsZWN0b3IKKyAgLy8gaGFzIHRoZSBhYmlsaXR5IHRvIGRldGVybWluZSBleGFjdCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBvZiBlcnJvcnMKKyAgLy8gZnJvbSB0aGUgaW5mb3JtYXRpb24gZ2l2ZW4gdG8gaXQgYnkgdGhlIERlc2NyaXB0b3JQb29sLgorICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3IqIEdldFZhbGlkYXRpb25FcnJvckNvbGxlY3RvcigpIHsKKyAgICB1c2luZ192YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcl8gPSB0cnVlOworICAgIHJldHVybiAmdmFsaWRhdGlvbl9lcnJvcl9jb2xsZWN0b3JfOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBEZXNjcmlwdG9yRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSBvdmVycmlkZTsKKyAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIG92ZXJyaWRlOworICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgY2xhc3MgU2luZ2xlRmlsZUVycm9yQ29sbGVjdG9yOworCisgIFNvdXJjZVRyZWUqIHNvdXJjZV90cmVlXzsKKyAgRGVzY3JpcHRvckRhdGFiYXNlKiBmYWxsYmFja19kYXRhYmFzZV87CisgIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3JfOworCisgIGNsYXNzIFBST1RPQlVGX0VYUE9SVCBWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3IKKyAgICAgIDogcHVibGljIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciB7CisgICBwdWJsaWM6CisgICAgVmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yKFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UqIG93bmVyKTsKKyAgICB+VmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBpbXBsZW1lbnRzIEVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwgRXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSBvdmVycmlkZTsKKworICAgIHZvaWQgQWRkV2FybmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbGVtZW50X25hbWUsIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgIEVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSBvdmVycmlkZTsKKworICAgcHJpdmF0ZToKKyAgICBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlKiBvd25lcl87CisgIH07CisgIGZyaWVuZCBjbGFzcyBWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3I7CisKKyAgYm9vbCB1c2luZ192YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcl87CisgIFNvdXJjZUxvY2F0aW9uVGFibGUgc291cmNlX2xvY2F0aW9uc187CisgIFZhbGlkYXRpb25FcnJvckNvbGxlY3RvciB2YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcl87Cit9OworCisvLyBTaW1wbGUgaW50ZXJmYWNlIGZvciBwYXJzaW5nIC5wcm90byBmaWxlcy4gIFRoaXMgd3JhcHMgdGhlIHByb2Nlc3MKKy8vIG9mIG9wZW5pbmcgdGhlIGZpbGUsIHBhcnNpbmcgaXQgd2l0aCBhIFBhcnNlciwgcmVjdXJzaXZlbHkgcGFyc2luZyBhbGwgaXRzCisvLyBpbXBvcnRzLCBhbmQgdGhlbiBjcm9zcy1saW5raW5nIHRoZSByZXN1bHRzIHRvIHByb2R1Y2UgYSBGaWxlRGVzY3JpcHRvci4KKy8vCisvLyBUaGlzIGlzIHJlYWxseSBqdXN0IGEgdGhpbiB3cmFwcGVyIGFyb3VuZCBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlLgorLy8gWW91IG1heSBmaW5kIHRoYXQgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSBpcyBtb3JlIGZsZXhpYmxlLgorLy8KKy8vIFRPRE8oa2VudG9uKTogIEkgZmVlbCBsaWtlIHRoaXMgY2xhc3MgaXMgbm90IHdlbGwtbmFtZWQuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgSW1wb3J0ZXIgeworIHB1YmxpYzoKKyAgSW1wb3J0ZXIoU291cmNlVHJlZSogc291cmNlX3RyZWUsIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpOworICB+SW1wb3J0ZXIoKTsKKworICAvLyBJbXBvcnQgdGhlIGdpdmVuIGZpbGUgYW5kIGJ1aWxkIGEgRmlsZURlc2NyaXB0b3IgcmVwcmVzZW50aW5nIGl0LiAgSWYKKyAgLy8gdGhlIGZpbGUgaXMgYWxyZWFkeSBpbiB0aGUgRGVzY3JpcHRvclBvb2wsIHRoZSBleGlzdGluZyBGaWxlRGVzY3JpcHRvcgorICAvLyB3aWxsIGJlIHJldHVybmVkLiAgVGhlIEZpbGVEZXNjcmlwdG9yIGlzIHByb3BlcnR5IG9mIHRoZSBEZXNjcmlwdG9yUG9vbCwKKyAgLy8gYW5kIHdpbGwgcmVtYWluIHZhbGlkIHVudGlsIGl0IGlzIGRlc3Ryb3llZC4gIElmIGFueSBlcnJvcnMgb2NjdXIsIHRoZXkKKyAgLy8gd2lsbCBiZSByZXBvcnRlZCB1c2luZyB0aGUgZXJyb3IgY29sbGVjdG9yIGFuZCBJbXBvcnQoKSB3aWxsIHJldHVybiBOVUxMLgorICAvLworICAvLyBBIHBhcnRpY3VsYXIgSW1wb3J0ZXIgb2JqZWN0IHdpbGwgb25seSByZXBvcnQgZXJyb3JzIGZvciBhIHBhcnRpY3VsYXIKKyAgLy8gZmlsZSBvbmNlLiAgQWxsIGZ1dHVyZSBhdHRlbXB0cyB0byBpbXBvcnQgdGhlIHNhbWUgZmlsZSB3aWxsIHJldHVybiBOVUxMCisgIC8vIHdpdGhvdXQgcmVwb3J0aW5nIGFueSBlcnJvcnMuICBUaGUgaWRlYSBpcyB0aGF0IHlvdSBtaWdodCB3YW50IHRvIGltcG9ydAorICAvLyBhIGxvdCBvZiBmaWxlcyB3aXRob3V0IHNlZWluZyB0aGUgc2FtZSBlcnJvcnMgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4gIElmCisgIC8vIHlvdSB3YW50IHRvIHNlZSBlcnJvcnMgZm9yIHRoZSBzYW1lIGZpbGVzIHJlcGVhdGVkbHksIHlvdSBjYW4gdXNlIGEKKyAgLy8gc2VwYXJhdGUgSW1wb3J0ZXIgb2JqZWN0IHRvIGltcG9ydCBlYWNoIG9uZSAoYnV0IHVzZSB0aGUgc2FtZQorICAvLyBEZXNjcmlwdG9yUG9vbCBzbyB0aGF0IHRoZXkgY2FuIGJlIGNyb3NzLWxpbmtlZCkuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBJbXBvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKKworICAvLyBUaGUgRGVzY3JpcHRvclBvb2wgaW4gd2hpY2ggYWxsIGltcG9ydGVkIEZpbGVEZXNjcmlwdG9ycyBhbmQgdGhlaXIKKyAgLy8gY29udGVudHMgYXJlIHN0b3JlZC4KKyAgaW5saW5lIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKCkgY29uc3QgeyByZXR1cm4gJnBvb2xfOyB9CisKKyAgdm9pZCBBZGRVbnVzZWRJbXBvcnRUcmFja0ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19lcnJvciA9IGZhbHNlKTsKKyAgdm9pZCBDbGVhclVudXNlZEltcG9ydFRyYWNrRmlsZXMoKTsKKworCisgcHJpdmF0ZToKKyAgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSBkYXRhYmFzZV87CisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbXBvcnRlcik7Cit9OworCisvLyBJZiB0aGUgaW1wb3J0ZXIgZW5jb3VudGVycyBwcm9ibGVtcyB3aGlsZSB0cnlpbmcgdG8gaW1wb3J0IHRoZSBwcm90byBmaWxlcywKKy8vIGl0IHJlcG9ydHMgdGhlbSB0byBhIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIGlubGluZSBNdWx0aUZpbGVFcnJvckNvbGxlY3RvcigpIHt9CisgIHZpcnR1YWwgfk11bHRpRmlsZUVycm9yQ29sbGVjdG9yKCk7CisKKyAgLy8gTGluZSBhbmQgY29sdW1uIG51bWJlcnMgYXJlIHplcm8tYmFzZWQuICBBIGxpbmUgbnVtYmVyIG9mIC0xIGluZGljYXRlcworICAvLyBhbiBlcnJvciB3aXRoIHRoZSBlbnRpcmUgZmlsZSAoZS5nLiAibm90IGZvdW5kIikuCisgIHZpcnR1YWwgdm9pZCBBZGRFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgQWRkV2FybmluZyhjb25zdCBzdGQ6OnN0cmluZyYgLyogZmlsZW5hbWUgKi8sIGludCAvKiBsaW5lICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogY29sdW1uICovLCBjb25zdCBzdGQ6OnN0cmluZyYgLyogbWVzc2FnZSAqLykge30KKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNdWx0aUZpbGVFcnJvckNvbGxlY3Rvcik7Cit9OworCisvLyBBYnN0cmFjdCBpbnRlcmZhY2Ugd2hpY2ggcmVwcmVzZW50cyBhIGRpcmVjdG9yeSB0cmVlIGNvbnRhaW5pbmcgcHJvdG8gZmlsZXMuCisvLyBVc2VkIGJ5IHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEltcG9ydGVyIHRvIHJlc29sdmUgaW1wb3J0IHN0YXRlbWVudHMKKy8vIE1vc3QgdXNlcnMgd2lsbCBwcm9iYWJseSB3YW50IHRvIHVzZSB0aGUgRGlza1NvdXJjZVRyZWUgaW1wbGVtZW50YXRpb24sCisvLyBiZWxvdy4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBTb3VyY2VUcmVlIHsKKyBwdWJsaWM6CisgIGlubGluZSBTb3VyY2VUcmVlKCkge30KKyAgdmlydHVhbCB+U291cmNlVHJlZSgpOworCisgIC8vIE9wZW4gdGhlIGdpdmVuIGZpbGUgYW5kIHJldHVybiBhIHN0cmVhbSB0aGF0IHJlYWRzIGl0LCBvciBOVUxMIGlmIG5vdAorICAvLyBmb3VuZC4gIFRoZSBjYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCBvYmplY3QuICBUaGUgZmlsZW5hbWUKKyAgLy8gbXVzdCBiZSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlIGFuZCBtdXN0IG5vdAorICAvLyBjb250YWluICIuIiBvciAiLi4iIGNvbXBvbmVudHMuCisgIHZpcnR1YWwgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSA9IDA7CisKKyAgLy8gSWYgT3BlbigpIHJldHVybnMgTlVMTCwgY2FsbGluZyB0aGlzIG1ldGhvZCBpbW1lZGlhdGVseSB3aWxsIHJldHVybiBhbgorICAvLyBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuCisgIC8vIFN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzIG1ldGhvZCBhbmQgcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSBmb3IKKyAgLy8gYmV0dGVyIGVycm9yIHJlcG9ydGluZy4KKyAgLy8gVE9ETyh4aWFvZmVuZyk6IGNoYW5nZSB0aGlzIHRvIGEgcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uLgorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldExhc3RFcnJvck1lc3NhZ2UoKTsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb3VyY2VUcmVlKTsKK307CisKKy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIFNvdXJjZVRyZWUgd2hpY2ggbG9hZHMgZmlsZXMgZnJvbSBsb2NhdGlvbnMgb24gZGlzay4KKy8vIE11bHRpcGxlIG1hcHBpbmdzIGNhbiBiZSBzZXQgdXAgdG8gbWFwIGxvY2F0aW9ucyBpbiB0aGUgRGlza1NvdXJjZVRyZWUgdG8KKy8vIGxvY2F0aW9ucyBpbiB0aGUgcGh5c2ljYWwgZmlsZXN5c3RlbS4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBEaXNrU291cmNlVHJlZSA6IHB1YmxpYyBTb3VyY2VUcmVlIHsKKyBwdWJsaWM6CisgIERpc2tTb3VyY2VUcmVlKCk7CisgIH5EaXNrU291cmNlVHJlZSgpIG92ZXJyaWRlOworCisgIC8vIE1hcCBhIHBhdGggb24gZGlzayB0byBhIGxvY2F0aW9uIGluIHRoZSBTb3VyY2VUcmVlLiAgVGhlIHBhdGggbWF5IGJlCisgIC8vIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuICBJZiBpdCBpcyBhIGRpcmVjdG9yeSwgdGhlIGVudGlyZSB0cmVlCisgIC8vIHVuZGVyIGl0IHdpbGwgYmUgbWFwcGVkIHRvIHRoZSBnaXZlbiB2aXJ0dWFsIGxvY2F0aW9uLiAgVG8gbWFwIGEgZGlyZWN0b3J5CisgIC8vIHRvIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZSwgcGFzcyBhbiBlbXB0eSBzdHJpbmcgZm9yIHZpcnR1YWxfcGF0aC4KKyAgLy8KKyAgLy8gSWYgbXVsdGlwbGUgbWFwcGVkIHBhdGhzIGFwcGx5IHdoZW4gb3BlbmluZyBhIGZpbGUsIHRoZXkgd2lsbCBiZSBzZWFyY2hlZAorICAvLyBpbiBvcmRlci4gIEZvciBleGFtcGxlLCBpZiB5b3UgZG86CisgIC8vICAgTWFwUGF0aCgiYmFyIiwgImZvby9iYXIiKTsKKyAgLy8gICBNYXBQYXRoKCIiLCAiYmF6Iik7CisgIC8vIGFuZCB0aGVuIHlvdSBkbzoKKyAgLy8gICBPcGVuKCJiYXIvcXV4Iik7CisgIC8vIHRoZSBEaXNrU291cmNlVHJlZSB3aWxsIGZpcnN0IHRyeSB0byBvcGVuIGZvby9iYXIvcXV4LCB0aGVuIGJhei9iYXIvcXV4LAorICAvLyByZXR1cm5pbmcgdGhlIGZpcnN0IG9uZSB0aGF0IG9wZW5zIHN1Y2Nlc3NmdWxseS4KKyAgLy8KKyAgLy8gZGlza19wYXRoIG1heSBiZSBhbiBhYnNvbHV0ZSBwYXRoIG9yIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwKKyAgLy8ganVzdCBsaWtlIGEgcGF0aCB5b3UnZCBwYXNzIHRvIG9wZW4oKS4KKyAgdm9pZCBNYXBQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiB2aXJ0dWFsX3BhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXNrX3BhdGgpOworCisgIC8vIFJldHVybiB0eXBlIGZvciBEaXNrRmlsZVRvVmlydHVhbEZpbGUoKS4KKyAgZW51bSBEaXNrRmlsZVRvVmlydHVhbEZpbGVSZXN1bHQgeworICAgIFNVQ0NFU1MsCisgICAgU0hBRE9XRUQsCisgICAgQ0FOTk9UX09QRU4sCisgICAgTk9fTUFQUElORworICB9OworCisgIC8vIEdpdmVuIGEgcGF0aCB0byBhIGZpbGUgb24gZGlzaywgZmluZCBhIHZpcnR1YWwgcGF0aCBtYXBwaW5nIHRvIHRoYXQKKyAgLy8gZmlsZS4gIFRoZSBmaXJzdCBtYXBwaW5nIGNyZWF0ZWQgd2l0aCBNYXBQYXRoKCkgd2hvc2UgZGlza19wYXRoIGNvbnRhaW5zCisgIC8vIHRoZSBmaWxlbmFtZSBpcyB1c2VkLiAgSG93ZXZlciwgdGhhdCB2aXJ0dWFsIHBhdGggbWF5IG5vdCBhY3R1YWxseSBiZQorICAvLyB1c2FibGUgdG8gb3BlbiB0aGUgZ2l2ZW4gZmlsZS4gIFBvc3NpYmxlIHJldHVybiB2YWx1ZXMgYXJlOgorICAvLyAqIFNVQ0NFU1M6IFRoZSBtYXBwaW5nIHdhcyBmb3VuZC4gICp2aXJ0dWFsX2ZpbGUgaXMgZmlsbGVkIGluIHNvIHRoYXQKKyAgLy8gICBjYWxsaW5nIE9wZW4oKnZpcnR1YWxfZmlsZSkgd2lsbCBvcGVuIHRoZSBmaWxlIG5hbWVkIGJ5IGRpc2tfZmlsZS4KKyAgLy8gKiBTSEFET1dFRDogQSBtYXBwaW5nIHdhcyBmb3VuZCwgYnV0IHVzaW5nIE9wZW4oKSB0byBvcGVuIHRoaXMgdmlydHVhbAorICAvLyAgIHBhdGggd2lsbCBlbmQgdXAgcmV0dXJuaW5nIHNvbWUgZGlmZmVyZW50IGZpbGUuICBUaGlzIGlzIGJlY2F1c2Ugc29tZQorICAvLyAgIG90aGVyIG1hcHBpbmcgd2l0aCBhIGhpZ2hlciBwcmVjZWRlbmNlIGFsc28gbWF0Y2hlcyB0aGlzIHZpcnR1YWwgcGF0aAorICAvLyAgIGFuZCBtYXBzIGl0IHRvIGEgZGlmZmVyZW50IGZpbGUgdGhhdCBleGlzdHMgb24gZGlzay4gICp2aXJ0dWFsX2ZpbGUKKyAgLy8gICBpcyBmaWxsZWQgaW4gYXMgaXQgd291bGQgYmUgaW4gdGhlIFNVQ0NFU1MgY2FzZS4gICpzaGFkb3dpbmdfZGlza19maWxlCisgIC8vICAgaXMgZmlsbGVkIGluIHdpdGggdGhlIGRpc2sgcGF0aCBvZiB0aGUgZmlsZSB3aGljaCB3b3VsZCBiZSBvcGVuZWQgaWYKKyAgLy8gICB5b3Ugd2VyZSB0byBjYWxsIE9wZW4oKnZpcnR1YWxfZmlsZSkuCisgIC8vICogQ0FOTk9UX09QRU46IFRoZSBtYXBwaW5nIHdhcyBmb3VuZCBhbmQgd2FzIG5vdCBzaGFkb3dlZCwgYnV0IHRoZQorICAvLyAgIGZpbGUgc3BlY2lmaWVkIGNhbm5vdCBiZSBvcGVuZWQuICBXaGVuIHRoaXMgdmFsdWUgaXMgcmV0dXJuZWQsCisgIC8vICAgZXJybm8gd2lsbCBpbmRpY2F0ZSB0aGUgcmVhc29uIHRoZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQuICAqdmlydHVhbF9maWxlCisgIC8vICAgd2lsbCBiZSBzZXQgdG8gdGhlIHZpcnR1YWwgcGF0aCBhcyBpbiB0aGUgU1VDQ0VTUyBjYXNlLCBldmVuIHRob3VnaAorICAvLyAgIGl0IGlzIG5vdCB1c2VmdWwuCisgIC8vICogTk9fTUFQUElORzogSW5kaWNhdGVzIHRoYXQgbm8gbWFwcGluZyB3YXMgZm91bmQgd2hpY2ggY29udGFpbnMgdGhpcworICAvLyAgIGZpbGUuCisgIERpc2tGaWxlVG9WaXJ0dWFsRmlsZVJlc3VsdCBEaXNrRmlsZVRvVmlydHVhbEZpbGUoCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGlza19maWxlLCBzdGQ6OnN0cmluZyogdmlydHVhbF9maWxlLAorICAgICAgc3RkOjpzdHJpbmcqIHNoYWRvd2luZ19kaXNrX2ZpbGUpOworCisgIC8vIEdpdmVuIGEgdmlydHVhbCBwYXRoLCBmaW5kIHRoZSBwYXRoIHRvIHRoZSBmaWxlIG9uIGRpc2suCisgIC8vIFJldHVybiB0cnVlIGFuZCB1cGRhdGUgZGlza19maWxlIHdpdGggdGhlIG9uLWRpc2sgcGF0aCBpZiB0aGUgZmlsZSBleGlzdHMuCisgIC8vIFJldHVybiBmYWxzZSBhbmQgbGVhdmUgZGlza19maWxlIHVudG91Y2hlZCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LgorICBib29sIFZpcnR1YWxGaWxlVG9EaXNrRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgdmlydHVhbF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZGlza19maWxlKTsKKworICAvLyBpbXBsZW1lbnRzIFNvdXJjZVRyZWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogT3Blbihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIEdldExhc3RFcnJvck1lc3NhZ2UoKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHN0cnVjdCBNYXBwaW5nIHsKKyAgICBzdGQ6OnN0cmluZyB2aXJ0dWFsX3BhdGg7CisgICAgc3RkOjpzdHJpbmcgZGlza19wYXRoOworCisgICAgaW5saW5lIE1hcHBpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHZpcnR1YWxfcGF0aF9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGlza19wYXRoX3BhcmFtKQorICAgICAgICA6IHZpcnR1YWxfcGF0aCh2aXJ0dWFsX3BhdGhfcGFyYW0pLCBkaXNrX3BhdGgoZGlza19wYXRoX3BhcmFtKSB7fQorICB9OworICBzdGQ6OnZlY3RvcjxNYXBwaW5nPiBtYXBwaW5nc187CisgIHN0ZDo6c3RyaW5nIGxhc3RfZXJyb3JfbWVzc2FnZV87CisKKyAgLy8gTGlrZSBPcGVuKCksIGJ1dCByZXR1cm5zIHRoZSBvbi1kaXNrIHBhdGggaW4gZGlza19maWxlIGlmIGRpc2tfZmlsZSBpcworICAvLyBub24tTlVMTCBhbmQgdGhlIGZpbGUgY291bGQgYmUgc3VjY2Vzc2Z1bGx5IG9wZW5lZC4KKyAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIE9wZW5WaXJ0dWFsRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgdmlydHVhbF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBkaXNrX2ZpbGUpOworCisgIC8vIExpa2UgT3BlbigpIGJ1dCBnaXZlbiB0aGUgYWN0dWFsIG9uLWRpc2sgcGF0aC4KKyAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIE9wZW5EaXNrRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEaXNrU291cmNlVHJlZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9JTVBPUlRFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODEwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNTQ4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCituYW1lc3BhY2UgeworCitib29sIEZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKKyAgcmV0dXJuIEZpbGU6OkV4aXN0cyhwYXRoKTsKK30KKworI2RlZmluZSBFWFBFQ1RfU1VCU1RSSU5HKG5lZWRsZSwgaGF5c3RhY2spIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgKG5lZWRsZSksIChoYXlzdGFjaykpCisKK2NsYXNzIE1vY2tFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciB7CisgcHVibGljOgorICBNb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQorICB+TW9ja0Vycm9yQ29sbGVjdG9yKCkgb3ZlcnJpZGUge30KKworICBzdGQ6OnN0cmluZyB0ZXh0XzsKKyAgc3RkOjpzdHJpbmcgd2FybmluZ190ZXh0XzsKKworICAvLyBpbXBsZW1lbnRzIEVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIG92ZXJyaWRlIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZ0ZXh0XywgIiQwOiQxOiQyOiAkM1xuIiwgZmlsZW5hbWUsIGxpbmUsIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UpOworICB9CisKKyAgdm9pZCBBZGRXYXJuaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgb3ZlcnJpZGUgeworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJndhcm5pbmdfdGV4dF8sICIkMDokMTokMjogJDNcbiIsIGZpbGVuYW1lLCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLCBtZXNzYWdlKTsKKyAgfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBIGR1bW15IGltcGxlbWVudGF0aW9uIG9mIFNvdXJjZVRyZWUgYmFja2VkIGJ5IGEgc2ltcGxlIG1hcC4KK2NsYXNzIE1vY2tTb3VyY2VUcmVlIDogcHVibGljIFNvdXJjZVRyZWUgeworIHB1YmxpYzoKKyAgTW9ja1NvdXJjZVRyZWUoKSB7fQorICB+TW9ja1NvdXJjZVRyZWUoKSBvdmVycmlkZSB7fQorCisgIHZvaWQgQWRkRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgY2hhciogY29udGVudHMpIHsKKyAgICBmaWxlc19bbmFtZV0gPSBjb250ZW50czsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgU291cmNlVHJlZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBPcGVuKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgb3ZlcnJpZGUgeworICAgIGNvbnN0IGNoYXIqIGNvbnRlbnRzID0gRmluZFB0ck9yTnVsbChmaWxlc18sIGZpbGVuYW1lKTsKKyAgICBpZiAoY29udGVudHMgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBuZXcgaW86OkFycmF5SW5wdXRTdHJlYW0oY29udGVudHMsIHN0cmxlbihjb250ZW50cykpOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIEdldExhc3RFcnJvck1lc3NhZ2UoKSBvdmVycmlkZSB7IHJldHVybiAiRmlsZSBub3QgZm91bmQuIjsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBjb25zdCBjaGFyKj4gZmlsZXNfOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBJbXBvcnRlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBJbXBvcnRlclRlc3QoKSA6IGltcG9ydGVyXygmc291cmNlX3RyZWVfLCAmZXJyb3JfY29sbGVjdG9yXykge30KKworICB2b2lkIEFkZEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBjaGFyKiB0ZXh0KSB7CisgICAgc291cmNlX3RyZWVfLkFkZEZpbGUoZmlsZW5hbWUsIHRleHQpOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBjb2xsZWN0ZWQgZXJyb3IgdGV4dAorICBzdGQ6OnN0cmluZyB3YXJuaW5nKCkgY29uc3QgeyByZXR1cm4gZXJyb3JfY29sbGVjdG9yXy53YXJuaW5nX3RleHRfOyB9CisKKyAgTW9ja0Vycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3Rvcl87CisgIE1vY2tTb3VyY2VUcmVlIHNvdXJjZV90cmVlXzsKKyAgSW1wb3J0ZXIgaW1wb3J0ZXJfOworfTsKKworVEVTVF9GKEltcG9ydGVyVGVzdCwgSW1wb3J0KSB7CisgIC8vIFRlc3Qgbm9ybWFsIGltcG9ydGluZy4KKyAgQWRkRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gaW1wb3J0ZXJfLkltcG9ydCgiZm9vLnByb3RvIik7CisgIEVYUEVDVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7CisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gbnVsbHB0cik7CisKKyAgQVNTRVJUX0VRKDEsIGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKCJGb28iLCBmaWxlLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7CisKKyAgLy8gSW1wb3J0aW5nIGFnYWluIHNob3VsZCByZXR1cm4gc2FtZSBvYmplY3QuCisgIEVYUEVDVF9FUShmaWxlLCBpbXBvcnRlcl8uSW1wb3J0KCJmb28ucHJvdG8iKSk7Cit9CisKK1RFU1RfRihJbXBvcnRlclRlc3QsIEltcG9ydE5lc3RlZCkgeworICAvLyBUZXN0IHRoYXQgaW1wb3J0aW5nIGEgZmlsZSB3aGljaCBpbXBvcnRzIGFub3RoZXIgZmlsZSB3b3Jrcy4KKyAgQWRkRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAiaW1wb3J0IFwiYmFyLnByb3RvXCI7XG4iCisgICAgICAgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICAgICAiICBvcHRpb25hbCBCYXIgYmFyID0gMTtcbiIKKyAgICAgICAgICAifVxuIik7CisgIEFkZEZpbGUoImJhci5wcm90byIsCisgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgIm1lc3NhZ2UgQmFyIHt9XG4iKTsKKworICAvLyBOb3RlIHRoYXQgYm90aCBmaWxlcyBhcmUgYWN0dWFsbHkgcGFyc2VkIGJ5IHRoZSBmaXJzdCBjYWxsIHRvIEltcG9ydCgpCisgIC8vIGhlcmUsIHNpbmNlIGZvby5wcm90byBpbXBvcnRzIGJhci5wcm90by4gIFRoZSBzZWNvbmQgY2FsbCBqdXN0IHJldHVybnMKKyAgLy8gdGhlIHNhbWUgUHJvdG9GaWxlIGZvciBiYXIucHJvdG8gd2hpY2ggd2FzIGNvbnN0cnVjdGVkIHdoaWxlIGltcG9ydGluZworICAvLyBmb28ucHJvdG8uICBXZSB0ZXN0IHRoYXQgdGhpcyBpcyB0aGUgY2FzZSBiZWxvdyBieSBjaGVja2luZyB0aGF0IGJhcgorICAvLyBpcyBhbW9uZyBmb28ncyBkZXBlbmRlbmNpZXMgKGJ5IHBvaW50ZXIpLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogZm9vID0gaW1wb3J0ZXJfLkltcG9ydCgiZm9vLnByb3RvIik7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXIgPSBpbXBvcnRlcl8uSW1wb3J0KCJiYXIucHJvdG8iKTsKKyAgRVhQRUNUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKKyAgQVNTRVJUX1RSVUUoZm9vICE9IG51bGxwdHIpOworICBBU1NFUlRfVFJVRShiYXIgIT0gbnVsbHB0cik7CisKKyAgLy8gQ2hlY2sgdGhhdCBmb28ncyBkZXBlbmRlbmN5IGlzIHRoZSBzYW1lIG9iamVjdCBhcyBiYXIuCisgIEFTU0VSVF9FUSgxLCBmb28tPmRlcGVuZGVuY3lfY291bnQoKSk7CisgIEVYUEVDVF9FUShiYXIsIGZvby0+ZGVwZW5kZW5jeSgwKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBmb28gcHJvcGVybHkgY3Jvc3MtbGlua3MgYmFyLgorICBBU1NFUlRfRVEoMSwgZm9vLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIEFTU0VSVF9FUSgxLCBiYXItPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKDEsIGZvby0+bWVzc2FnZV90eXBlKDApLT5maWVsZF9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLAorICAgICAgICAgICAgZm9vLT5tZXNzYWdlX3R5cGUoMCktPmZpZWxkKDApLT50eXBlKCkpOworICBFWFBFQ1RfRVEoYmFyLT5tZXNzYWdlX3R5cGUoMCksCisgICAgICAgICAgICBmb28tPm1lc3NhZ2VfdHlwZSgwKS0+ZmllbGQoMCktPm1lc3NhZ2VfdHlwZSgpKTsKK30KKworVEVTVF9GKEltcG9ydGVyVGVzdCwgRmlsZU5vdEZvdW5kKSB7CisgIC8vIEVycm9yOiAgUGFyc2luZyBhIGZpbGUgdGhhdCBkb2Vzbid0IGV4aXN0LgorICBFWFBFQ1RfVFJVRShpbXBvcnRlcl8uSW1wb3J0KCJmb28ucHJvdG8iKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0VRKCJmb28ucHJvdG86LTE6MDogRmlsZSBub3QgZm91bmQuXG4iLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKK30KKworVEVTVF9GKEltcG9ydGVyVGVzdCwgSW1wb3J0Tm90Rm91bmQpIHsKKyAgLy8gRXJyb3I6ICBJbXBvcnRpbmcgYSBmaWxlIHRoYXQgZG9lc24ndCBleGlzdC4KKyAgQWRkRmlsZSgiZm9vLnByb3RvIiwKKyAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAiaW1wb3J0IFwiYmFyLnByb3RvXCI7XG4iKTsKKworICBFWFBFQ1RfVFJVRShpbXBvcnRlcl8uSW1wb3J0KCJmb28ucHJvdG8iKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0VRKAorICAgICAgImJhci5wcm90bzotMTowOiBGaWxlIG5vdCBmb3VuZC5cbiIKKyAgICAgICJmb28ucHJvdG86MTowOiBJbXBvcnQgXCJiYXIucHJvdG9cIiB3YXMgbm90IGZvdW5kIG9yIGhhZCBlcnJvcnMuXG4iLAorICAgICAgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7Cit9CisKK1RFU1RfRihJbXBvcnRlclRlc3QsIFJlY3Vyc2l2ZUltcG9ydCkgeworICAvLyBFcnJvcjogIFJlY3Vyc2l2ZSBpbXBvcnQuCisgIEFkZEZpbGUoInJlY3Vyc2l2ZTEucHJvdG8iLAorICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICJcbiIKKyAgICAgICAgICAiaW1wb3J0IFwicmVjdXJzaXZlMi5wcm90b1wiO1xuIik7CisgIEFkZEZpbGUoInJlY3Vyc2l2ZTIucHJvdG8iLAorICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICJpbXBvcnQgXCJyZWN1cnNpdmUxLnByb3RvXCI7XG4iKTsKKworICBFWFBFQ1RfVFJVRShpbXBvcnRlcl8uSW1wb3J0KCJyZWN1cnNpdmUxLnByb3RvIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9FUSgKKyAgICAgICJyZWN1cnNpdmUxLnByb3RvOjI6MDogRmlsZSByZWN1cnNpdmVseSBpbXBvcnRzIGl0c2VsZjogIgorICAgICAgInJlY3Vyc2l2ZTEucHJvdG8gIgorICAgICAgIi0+IHJlY3Vyc2l2ZTIucHJvdG8gLT4gcmVjdXJzaXZlMS5wcm90b1xuIgorICAgICAgInJlY3Vyc2l2ZTIucHJvdG86MTowOiBJbXBvcnQgXCJyZWN1cnNpdmUxLnByb3RvXCIgd2FzIG5vdCBmb3VuZCAiCisgICAgICAib3IgaGFkIGVycm9ycy5cbiIKKyAgICAgICJyZWN1cnNpdmUxLnByb3RvOjI6MDogSW1wb3J0IFwicmVjdXJzaXZlMi5wcm90b1wiIHdhcyBub3QgZm91bmQgIgorICAgICAgIm9yIGhhZCBlcnJvcnMuXG4iLAorICAgICAgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7Cit9CisKK1RFU1RfRihJbXBvcnRlclRlc3QsIFJlY3Vyc2l2ZUltcG9ydFNlbGYpIHsKKyAgLy8gRXJyb3I6ICBSZWN1cnNpdmUgaW1wb3J0LgorICBBZGRGaWxlKCJyZWN1cnNpdmUucHJvdG8iLAorICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICJcbiIKKyAgICAgICAgICAiaW1wb3J0IFwicmVjdXJzaXZlLnByb3RvXCI7XG4iKTsKKworICBFWFBFQ1RfVFJVRShpbXBvcnRlcl8uSW1wb3J0KCJyZWN1cnNpdmUucHJvdG8iKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0VRKAorICAgICAgInJlY3Vyc2l2ZS5wcm90bzoyOjA6IEZpbGUgcmVjdXJzaXZlbHkgaW1wb3J0cyBpdHNlbGY6ICIKKyAgICAgICJyZWN1cnNpdmUucHJvdG8gLT4gcmVjdXJzaXZlLnByb3RvXG4iLAorICAgICAgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7Cit9CisKK1RFU1RfRihJbXBvcnRlclRlc3QsIExpdGVSdW50aW1lSW1wb3J0KSB7CisgIC8vIEVycm9yOiAgUmVjdXJzaXZlIGltcG9ydC4KKyAgQWRkRmlsZSgiYmFyLnByb3RvIiwKKyAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAib3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTtcbiIpOworICBBZGRGaWxlKCJmb28ucHJvdG8iLAorICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIpOworCisgIEVYUEVDVF9UUlVFKGltcG9ydGVyXy5JbXBvcnQoImZvby5wcm90byIpID09IG51bGxwdHIpOworICBFWFBFQ1RfRVEoCisgICAgICAiZm9vLnByb3RvOjE6MDogRmlsZXMgdGhhdCBkbyBub3QgdXNlIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSAiCisgICAgICAiY2Fubm90IGltcG9ydCBmaWxlcyB3aGljaCBkbyB1c2UgdGhpcyBvcHRpb24uICBUaGlzIGZpbGUgaXMgbm90ICIKKyAgICAgICJsaXRlLCBidXQgaXQgaW1wb3J0cyBcImJhci5wcm90b1wiIHdoaWNoIGlzLlxuIiwKKyAgICAgIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgRGlza1NvdXJjZVRyZWVUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBkaXJuYW1lc18ucHVzaF9iYWNrKFRlc3RUZW1wRGlyKCkgKyAiL3Rlc3RfcHJvdG8yX2ltcG9ydF9wYXRoXzEiKTsKKyAgICBkaXJuYW1lc18ucHVzaF9iYWNrKFRlc3RUZW1wRGlyKCkgKyAiL3Rlc3RfcHJvdG8yX2ltcG9ydF9wYXRoXzIiKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlybmFtZXNfLnNpemUoKTsgaSsrKSB7CisgICAgICBpZiAoRmlsZUV4aXN0cyhkaXJuYW1lc19baV0pKSB7CisgICAgICAgIEZpbGU6OkRlbGV0ZVJlY3Vyc2l2ZWx5KGRpcm5hbWVzX1tpXSwgTlVMTCwgTlVMTCk7CisgICAgICB9CisgICAgICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6Q3JlYXRlRGlyKGRpcm5hbWVzX1tpXSwgMDc3NykpOworICAgIH0KKyAgfQorCisgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJuYW1lc18uc2l6ZSgpOyBpKyspIHsKKyAgICAgIGlmIChGaWxlRXhpc3RzKGRpcm5hbWVzX1tpXSkpIHsKKyAgICAgICAgRmlsZTo6RGVsZXRlUmVjdXJzaXZlbHkoZGlybmFtZXNfW2ldLCBOVUxMLCBOVUxMKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIEFkZEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBjaGFyKiBjb250ZW50cykgeworICAgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpTZXRDb250ZW50cyhmaWxlbmFtZSwgY29udGVudHMsIHRydWUpKTsKKyAgfQorCisgIHZvaWQgQWRkU3ViZGlyKGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXJuYW1lKSB7CisgICAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkNyZWF0ZURpcihkaXJuYW1lLCAwNzc3KSk7CisgIH0KKworICB2b2lkIEV4cGVjdEZpbGVDb250ZW50cyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2NvbnRlbnRzKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weUlucHV0U3RyZWFtPiBpbnB1dChzb3VyY2VfdHJlZV8uT3BlbihmaWxlbmFtZSkpOworCisgICAgQVNTRVJUX0ZBTFNFKGlucHV0ID09IG51bGxwdHIpOworCisgICAgLy8gUmVhZCBhbGwgdGhlIGRhdGEgZnJvbSB0aGUgZmlsZS4KKyAgICBzdGQ6OnN0cmluZyBmaWxlX2NvbnRlbnRzOworICAgIGNvbnN0IHZvaWQqIGRhdGE7CisgICAgaW50IHNpemU7CisgICAgd2hpbGUgKGlucHV0LT5OZXh0KCZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgIGZpbGVfY29udGVudHMuYXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEpLCBzaXplKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfY29udGVudHMsIGZpbGVfY29udGVudHMpOworICB9CisKKyAgdm9pZCBFeHBlY3RDYW5ub3RPcGVuRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW86Olplcm9Db3B5SW5wdXRTdHJlYW0+IGlucHV0KHNvdXJjZV90cmVlXy5PcGVuKGZpbGVuYW1lKSk7CisgICAgRVhQRUNUX1RSVUUoaW5wdXQgPT0gbnVsbHB0cik7CisgICAgRVhQRUNUX0VRKGVycm9yX21lc3NhZ2UsIHNvdXJjZV90cmVlXy5HZXRMYXN0RXJyb3JNZXNzYWdlKCkpOworICB9CisKKyAgRGlza1NvdXJjZVRyZWUgc291cmNlX3RyZWVfOworCisgIC8vIFBhdGhzIG9mIHR3byBvbi1kaXNrIGRpcmVjdG9yaWVzIHRvIHVzZSBkdXJpbmcgdGhlIHRlc3QuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkaXJuYW1lc187Cit9OworCitURVNUX0YoRGlza1NvdXJjZVRyZWVUZXN0LCBNYXBSb290KSB7CisgIC8vIFRlc3Qgb3BlbmluZyBhIGZpbGUgaW4gYSBkaXJlY3RvcnkgdGhhdCBpcyBtYXBwZWQgdG8gdGhlIHJvb3Qgb2YgdGhlCisgIC8vIHNvdXJjZSB0cmVlLgorICBBZGRGaWxlKGRpcm5hbWVzX1swXSArICIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgZGlybmFtZXNfWzBdKTsKKworICBFeHBlY3RGaWxlQ29udGVudHMoImZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgRXhwZWN0Q2Fubm90T3BlbkZpbGUoImJhciIsICJGaWxlIG5vdCBmb3VuZC4iKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgTWFwRGlyZWN0b3J5KSB7CisgIC8vIFRlc3Qgb3BlbmluZyBhIGZpbGUgaW4gYSBkaXJlY3RvcnkgdGhhdCBpcyBtYXBwZWQgdG8gc29tZXdoZXJlIG90aGVyCisgIC8vIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorCisgIEFkZEZpbGUoZGlybmFtZXNfWzBdICsgIi9mb28iLCAiSGVsbG8gV29ybGQhIik7CisgIHNvdXJjZV90cmVlXy5NYXBQYXRoKCJiYXoiLCBkaXJuYW1lc19bMF0pOworCisgIEV4cGVjdEZpbGVDb250ZW50cygiYmF6L2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgRXhwZWN0Q2Fubm90T3BlbkZpbGUoImJhei9iYXIiLCAiRmlsZSBub3QgZm91bmQuIik7CisgIEV4cGVjdENhbm5vdE9wZW5GaWxlKCJmb28iLCAiRmlsZSBub3QgZm91bmQuIik7CisgIEV4cGVjdENhbm5vdE9wZW5GaWxlKCJiYXIiLCAiRmlsZSBub3QgZm91bmQuIik7CisKKyAgLy8gTm9uLWNhbm9uaWNhbCBmaWxlIG5hbWVzIHNob3VsZCBub3Qgd29yay4KKyAgRXhwZWN0Q2Fubm90T3BlbkZpbGUoImJhei8vZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkJhY2tzbGFzaGVzLCBjb25zZWN1dGl2ZSBzbGFzaGVzLCBcIi5cIiwgb3IgXCIuLlwiIGFyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJub3QgYWxsb3dlZCBpbiB0aGUgdmlydHVhbCBwYXRoIik7CisgIEV4cGVjdENhbm5vdE9wZW5GaWxlKCJiYXovLi4vYmF6L2ZvbyIsCisgICAgICAgICAgICAgICAgICAgICAgICJCYWNrc2xhc2hlcywgY29uc2VjdXRpdmUgc2xhc2hlcywgXCIuXCIsIG9yIFwiLi5cIiBhcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAibm90IGFsbG93ZWQgaW4gdGhlIHZpcnR1YWwgcGF0aCIpOworICBFeHBlY3RDYW5ub3RPcGVuRmlsZSgiYmF6Ly4vZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkJhY2tzbGFzaGVzLCBjb25zZWN1dGl2ZSBzbGFzaGVzLCBcIi5cIiwgb3IgXCIuLlwiIGFyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJub3QgYWxsb3dlZCBpbiB0aGUgdmlydHVhbCBwYXRoIik7CisgIEV4cGVjdENhbm5vdE9wZW5GaWxlKCJiYXovZm9vLyIsICJGaWxlIG5vdCBmb3VuZC4iKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgTm9QYXJlbnQpIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGNhbm5vdCBvcGVuIGZpbGVzIGluIGEgcGFyZW50IG9mIGEgbWFwcGVkIGRpcmVjdG9yeS4KKworICBBZGRGaWxlKGRpcm5hbWVzX1swXSArICIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOworICBBZGRTdWJkaXIoZGlybmFtZXNfWzBdICsgIi9iYXIiKTsKKyAgQWRkRmlsZShkaXJuYW1lc19bMF0gKyAiL2Jhci9iYXoiLCAiQmxhaC4iKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoIiIsIGRpcm5hbWVzX1swXSArICIvYmFyIik7CisKKyAgRXhwZWN0RmlsZUNvbnRlbnRzKCJiYXoiLCAiQmxhaC4iKTsKKyAgRXhwZWN0Q2Fubm90T3BlbkZpbGUoIi4uL2ZvbyIsCisgICAgICAgICAgICAgICAgICAgICAgICJCYWNrc2xhc2hlcywgY29uc2VjdXRpdmUgc2xhc2hlcywgXCIuXCIsIG9yIFwiLi5cIiBhcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAibm90IGFsbG93ZWQgaW4gdGhlIHZpcnR1YWwgcGF0aCIpOworICBFeHBlY3RDYW5ub3RPcGVuRmlsZSgiLi4vYmFyL2JheiIsCisgICAgICAgICAgICAgICAgICAgICAgICJCYWNrc2xhc2hlcywgY29uc2VjdXRpdmUgc2xhc2hlcywgXCIuXCIsIG9yIFwiLi5cIiBhcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAibm90IGFsbG93ZWQgaW4gdGhlIHZpcnR1YWwgcGF0aCIpOworfQorCitURVNUX0YoRGlza1NvdXJjZVRyZWVUZXN0LCBNYXBGaWxlKSB7CisgIC8vIFRlc3Qgb3BlbmluZyBhIGZpbGUgdGhhdCBpcyBtYXBwZWQgZGlyZWN0bHkgaW50byB0aGUgc291cmNlIHRyZWUuCisKKyAgQWRkRmlsZShkaXJuYW1lc19bMF0gKyAiL2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImZvbyIsIGRpcm5hbWVzX1swXSArICIvZm9vIik7CisKKyAgRXhwZWN0RmlsZUNvbnRlbnRzKCJmb28iLCAiSGVsbG8gV29ybGQhIik7CisgIEV4cGVjdENhbm5vdE9wZW5GaWxlKCJiYXIiLCAiRmlsZSBub3QgZm91bmQuIik7Cit9CisKK1RFU1RfRihEaXNrU291cmNlVHJlZVRlc3QsIFNlYXJjaE11bHRpcGxlRGlyZWN0b3JpZXMpIHsKKyAgLy8gVGVzdCBtYXBwaW5nIGFuZCBzZWFyY2hpbmcgbXVsdGlwbGUgZGlyZWN0b3JpZXMuCisKKyAgQWRkRmlsZShkaXJuYW1lc19bMF0gKyAiL2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgQWRkRmlsZShkaXJuYW1lc19bMV0gKyAiL2ZvbyIsICJUaGlzIGZpbGUgc2hvdWxkIGJlIGhpZGRlbi4iKTsKKyAgQWRkRmlsZShkaXJuYW1lc19bMV0gKyAiL2JhciIsICJHb29kYnllIFdvcmxkISIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgZGlybmFtZXNfWzBdKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoIiIsIGRpcm5hbWVzX1sxXSk7CisKKyAgRXhwZWN0RmlsZUNvbnRlbnRzKCJmb28iLCAiSGVsbG8gV29ybGQhIik7CisgIEV4cGVjdEZpbGVDb250ZW50cygiYmFyIiwgIkdvb2RieWUgV29ybGQhIik7CisgIEV4cGVjdENhbm5vdE9wZW5GaWxlKCJiYXoiLCAiRmlsZSBub3QgZm91bmQuIik7Cit9CisKK1RFU1RfRihEaXNrU291cmNlVHJlZVRlc3QsIE9yZGVyaW5nVHJ1bXBzU3BlY2lmaWNpdHkpIHsKKyAgLy8gVGVzdCB0aGF0IGRpcmVjdG9yaWVzIGFyZSBhbHdheXMgc2VhcmNoZWQgaW4gb3JkZXIsIGV2ZW4gd2hlbiBhIGxhdHRlcgorICAvLyBkaXJlY3RvcnkgaXMgbW9yZS1zcGVjaWZpYyB0aGFuIGEgZm9ybWVyIG9uZS4KKworICAvLyBDcmVhdGUgdGhlICJiYXIiIGRpcmVjdG9yeSBzbyB3ZSBjYW4gcHV0IGEgZmlsZSBpbiBpdC4KKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkNyZWF0ZURpcihkaXJuYW1lc19bMF0gKyAiL2JhciIsIDA3NzcpKTsKKworICAvLyBBZGQgZmlsZXMgYW5kIG1hcCBwYXRocy4KKyAgQWRkRmlsZShkaXJuYW1lc19bMF0gKyAiL2Jhci9mb28iLCAiSGVsbG8gV29ybGQhIik7CisgIEFkZEZpbGUoZGlybmFtZXNfWzFdICsgIi9mb28iLCAiVGhpcyBmaWxlIHNob3VsZCBiZSBoaWRkZW4uIik7CisgIHNvdXJjZV90cmVlXy5NYXBQYXRoKCIiLCBkaXJuYW1lc19bMF0pOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiYmFyIiwgZGlybmFtZXNfWzFdKTsKKworICAvLyBDaGVjay4KKyAgRXhwZWN0RmlsZUNvbnRlbnRzKCJiYXIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOworfQorCitURVNUX0YoRGlza1NvdXJjZVRyZWVUZXN0LCBEaXNrRmlsZVRvVmlydHVhbEZpbGUpIHsKKyAgLy8gVGVzdCBEaXNrRmlsZVRvVmlydHVhbEZpbGUuCisKKyAgQWRkRmlsZShkaXJuYW1lc19bMF0gKyAiL2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgQWRkRmlsZShkaXJuYW1lc19bMV0gKyAiL2ZvbyIsICJUaGlzIGZpbGUgc2hvdWxkIGJlIGhpZGRlbi4iKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImJhciIsIGRpcm5hbWVzX1swXSk7CisgIHNvdXJjZV90cmVlXy5NYXBQYXRoKCJiYXIiLCBkaXJuYW1lc19bMV0pOworCisgIHN0ZDo6c3RyaW5nIHZpcnR1YWxfZmlsZTsKKyAgc3RkOjpzdHJpbmcgc2hhZG93aW5nX2Rpc2tfZmlsZTsKKworICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6Ok5PX01BUFBJTkcsCisgICAgICAgICAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKCIvZm9vIiwgJnZpcnR1YWxfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKKworICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6OlNIQURPV0VELAorICAgICAgICAgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKKyAgICAgICAgICAgICAgICBkaXJuYW1lc19bMV0gKyAiL2ZvbyIsICZ2aXJ0dWFsX2ZpbGUsICZzaGFkb3dpbmdfZGlza19maWxlKSk7CisgIEVYUEVDVF9FUSgiYmFyL2ZvbyIsIHZpcnR1YWxfZmlsZSk7CisgIEVYUEVDVF9FUShkaXJuYW1lc19bMF0gKyAiL2ZvbyIsIHNoYWRvd2luZ19kaXNrX2ZpbGUpOworCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCisgICAgICAgICAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAorICAgICAgICAgICAgICAgIGRpcm5hbWVzX1sxXSArICIvYmF6IiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKKyAgRVhQRUNUX0VRKCJiYXIvYmF6IiwgdmlydHVhbF9maWxlKTsKKworICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6OlNVQ0NFU1MsCisgICAgICAgICAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAorICAgICAgICAgICAgICAgIGRpcm5hbWVzX1swXSArICIvZm9vIiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKKyAgRVhQRUNUX0VRKCJiYXIvZm9vIiwgdmlydHVhbF9maWxlKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgRGlza0ZpbGVUb1ZpcnR1YWxGaWxlQ2Fub25pY2FsaXphdGlvbikgeworICAvLyBUZXN0IGhhbmRsaW5nIG9mICIuLiIsICIuIiwgZXRjLiBpbiBEaXNrRmlsZVRvVmlydHVhbEZpbGUoKS4KKworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiZGlyMSIsICIuLiIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiZGlyMiIsICIuLi8uLi9mb28iKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImRpcjMiLCAiLi9mb28vYmFyLy4iKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImRpcjQiLCAiLiIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgIi9xdXgiKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImRpcjUiLCAiL3F1dXgvIik7CisKKyAgc3RkOjpzdHJpbmcgdmlydHVhbF9maWxlOworICBzdGQ6OnN0cmluZyBzaGFkb3dpbmdfZGlza19maWxlOworCisgIC8vICIuLi8uLiIgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIHVuZGVyICIuLiIuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Tk9fTUFQUElORywKKyAgICAgICAgICAgIHNvdXJjZV90cmVlXy5EaXNrRmlsZVRvVmlydHVhbEZpbGUoIi4uLy4uL2JheiIsICZ2aXJ0dWFsX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFkb3dpbmdfZGlza19maWxlKSk7CisKKyAgLy8gIi9mb28iIGlzIG5vdCBtYXBwZWQgKGl0IHNob3VsZCBub3QgYmUgbWlzaW50ZXJwcmV0ZWQgYXMgYmVpbmcgdW5kZXIgIi4iKS4KKyAgRVhQRUNUX0VRKERpc2tTb3VyY2VUcmVlOjpOT19NQVBQSU5HLAorICAgICAgICAgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgiL2ZvbyIsICZ2aXJ0dWFsX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFkb3dpbmdfZGlza19maWxlKSk7CisKKyNpZmRlZiBXSU4zMgorICAvLyAiQzpcZm9vIiBpcyBub3QgbWFwcGVkIChpdCBzaG91bGQgbm90IGJlIG1pc2ludGVycHJldGVkIGFzIGJlaW5nIHVuZGVyCisgIC8vICIuIikuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Tk9fTUFQUElORywKKyAgICAgICAgICAgIHNvdXJjZV90cmVlXy5EaXNrRmlsZVRvVmlydHVhbEZpbGUoIkM6XFxmb28iLCAmdmlydHVhbF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOworI2VuZGlmICAvLyBXSU4zMgorCisgIC8vIEJ1dCAiLi4vYmF6IiBzaG91bGQgYmUuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCisgICAgICAgICAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKCIuLi9iYXoiLCAmdmlydHVhbF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOworICBFWFBFQ1RfRVEoImRpcjEvYmF6IiwgdmlydHVhbF9maWxlKTsKKworICAvLyAiLi4vLi4vZm9vL2JheiIgaXMgdW5kZXIgIi4uLy4uL2ZvbyIuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCisgICAgICAgICAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKCIuLi8uLi9mb28vYmF6IiwgJnZpcnR1YWxfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKKyAgRVhQRUNUX0VRKCJkaXIyL2JheiIsIHZpcnR1YWxfZmlsZSk7CisKKyAgLy8gImZvby8uL2Jhci9iYXoiIGlzIHVuZGVyICIuL2Zvby9iYXIvLiIuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCisgICAgICAgICAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKCJmb28vYmFyL2JheiIsICZ2aXJ0dWFsX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFkb3dpbmdfZGlza19maWxlKSk7CisgIEVYUEVDVF9FUSgiZGlyMy9iYXoiLCB2aXJ0dWFsX2ZpbGUpOworCisgIC8vICJiYXIiIGlzIHVuZGVyICIuIi4KKyAgRVhQRUNUX0VRKERpc2tTb3VyY2VUcmVlOjpDQU5OT1RfT1BFTiwKKyAgICAgICAgICAgIHNvdXJjZV90cmVlXy5EaXNrRmlsZVRvVmlydHVhbEZpbGUoImJhciIsICZ2aXJ0dWFsX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFkb3dpbmdfZGlza19maWxlKSk7CisgIEVYUEVDVF9FUSgiZGlyNC9iYXIiLCB2aXJ0dWFsX2ZpbGUpOworCisgIC8vICIvcXV4L2JheiIgaXMgdW5kZXIgIi9xdXgiLgorICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6OkNBTk5PVF9PUEVOLAorICAgICAgICAgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgiL3F1eC9iYXoiLCAmdmlydHVhbF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOworICBFWFBFQ1RfRVEoImJheiIsIHZpcnR1YWxfZmlsZSk7CisKKyAgLy8gIi9xdXV4L2JhciIgaXMgdW5kZXIgIi9xdXV4Ii4KKyAgRVhQRUNUX0VRKERpc2tTb3VyY2VUcmVlOjpDQU5OT1RfT1BFTiwKKyAgICAgICAgICAgIHNvdXJjZV90cmVlXy5EaXNrRmlsZVRvVmlydHVhbEZpbGUoIi9xdXV4L2JhciIsICZ2aXJ0dWFsX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFkb3dpbmdfZGlza19maWxlKSk7CisgIEVYUEVDVF9FUSgiZGlyNS9iYXIiLCB2aXJ0dWFsX2ZpbGUpOworfQorCitURVNUX0YoRGlza1NvdXJjZVRyZWVUZXN0LCBWaXJ0dWFsRmlsZVRvRGlza0ZpbGUpIHsKKyAgLy8gVGVzdCBWaXJ0dWFsRmlsZVRvRGlza0ZpbGUuCisKKyAgQWRkRmlsZShkaXJuYW1lc19bMF0gKyAiL2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgQWRkRmlsZShkaXJuYW1lc19bMV0gKyAiL2ZvbyIsICJUaGlzIGZpbGUgc2hvdWxkIGJlIGhpZGRlbi4iKTsKKyAgQWRkRmlsZShkaXJuYW1lc19bMV0gKyAiL3F1dXgiLCAiVGhpcyBmaWxlIHNob3VsZCBub3QgYmUgaGlkZGVuLiIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiYmFyIiwgZGlybmFtZXNfWzBdKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImJhciIsIGRpcm5hbWVzX1sxXSk7CisKKyAgLy8gRXhpc3RlbnQgZmlsZXMsIHNoYWRvd2VkIGFuZCBub24tc2hhZG93ZWQgY2FzZS4KKyAgc3RkOjpzdHJpbmcgZGlza19maWxlOworICBFWFBFQ1RfVFJVRShzb3VyY2VfdHJlZV8uVmlydHVhbEZpbGVUb0Rpc2tGaWxlKCJiYXIvZm9vIiwgJmRpc2tfZmlsZSkpOworICBFWFBFQ1RfRVEoZGlybmFtZXNfWzBdICsgIi9mb28iLCBkaXNrX2ZpbGUpOworICBFWFBFQ1RfVFJVRShzb3VyY2VfdHJlZV8uVmlydHVhbEZpbGVUb0Rpc2tGaWxlKCJiYXIvcXV1eCIsICZkaXNrX2ZpbGUpKTsKKyAgRVhQRUNUX0VRKGRpcm5hbWVzX1sxXSArICIvcXV1eCIsIGRpc2tfZmlsZSk7CisKKyAgLy8gTm9uZXhpc3RlbnQgZmlsZSBpbiBleGlzdGVudCBkaXJlY3RvcnkgYW5kIHZpY2UgdmVyc2EuCisgIHN0ZDo6c3RyaW5nIG5vdF90b3VjaGVkID0gIm5vdCB0b3VjaGVkIjsKKyAgRVhQRUNUX0ZBTFNFKHNvdXJjZV90cmVlXy5WaXJ0dWFsRmlsZVRvRGlza0ZpbGUoImJhci9iYXoiLCAmbm90X3RvdWNoZWQpKTsKKyAgRVhQRUNUX0VRKCJub3QgdG91Y2hlZCIsIG5vdF90b3VjaGVkKTsKKyAgRVhQRUNUX0ZBTFNFKHNvdXJjZV90cmVlXy5WaXJ0dWFsRmlsZVRvRGlza0ZpbGUoImJhei9mb28iLCAmbm90X3RvdWNoZWQpKTsKKyAgRVhQRUNUX0VRKCJub3QgdG91Y2hlZCIsIG5vdF90b3VjaGVkKTsKKworICAvLyBBY2NlcHQgTlVMTCBhcyBvdXRwdXQgcGFyYW1ldGVyLgorICBFWFBFQ1RfVFJVRShzb3VyY2VfdHJlZV8uVmlydHVhbEZpbGVUb0Rpc2tGaWxlKCJiYXIvZm9vIiwgbnVsbHB0cikpOworICBFWFBFQ1RfRkFMU0Uoc291cmNlX3RyZWVfLlZpcnR1YWxGaWxlVG9EaXNrRmlsZSgiYmF6L2ZvbyIsIG51bGxwdHIpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvY29udGV4dC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9jb250ZXh0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYzBkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvY29udGV4dC5jYwpAQCAtMCwwICsxLDIwMiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9jb250ZXh0Lmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZV9yZXNvbHZlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXBfdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitDb250ZXh0OjpDb250ZXh0KGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogbmFtZV9yZXNvbHZlcl8obmV3IENsYXNzTmFtZVJlc29sdmVyKSwgb3B0aW9uc18ob3B0aW9ucykgeworICBJbml0aWFsaXplRmllbGRHZW5lcmF0b3JJbmZvKGZpbGUpOworfQorCitDb250ZXh0Ojp+Q29udGV4dCgpIHt9CisKK0NsYXNzTmFtZVJlc29sdmVyKiBDb250ZXh0OjpHZXROYW1lUmVzb2x2ZXIoKSBjb25zdCB7CisgIHJldHVybiBuYW1lX3Jlc29sdmVyXy5nZXQoKTsKK30KKworbmFtZXNwYWNlIHsKKy8vIFdoZXRoZXIgdHdvIGZpZWxkcyBoYXZlIGNvbmZsaWN0aW5nIGFjY2Vzc29ycyAoYXNzdW1pbmcgbmFtZTEgYW5kIG5hbWUyCisvLyBhcmUgZGlmZmVyZW50KS4gbmFtZTEgYW5kIG5hbWUyIGFyZSBmaWVsZDEgYW5kIGZpZWxkMidzIGNhbWVsLWNhc2UgbmFtZQorLy8gcmVzcGVjdGl2ZWx5LgorYm9vbCBJc0NvbmZsaWN0aW5nKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQxLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZTEsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZDIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lMiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogaW5mbykgeworICBpZiAoZmllbGQxLT5pc19yZXBlYXRlZCgpKSB7CisgICAgaWYgKGZpZWxkMi0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgLy8gQm90aCBmaWVsZHMgYXJlIHJlcGVhdGVkLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAvLyBmaWVsZDEgaXMgcmVwZWF0ZWQsIGFuZCBmaWVsZDIgaXMgbm90LgorICAgICAgaWYgKG5hbWUxICsgIkNvdW50IiA9PSBuYW1lMikgeworICAgICAgICAqaW5mbyA9ICJib3RoIHJlcGVhdGVkIGZpZWxkIFwiIiArIGZpZWxkMS0+bmFtZSgpICsgIlwiIGFuZCBzaW5ndWxhciAiICsKKyAgICAgICAgICAgICAgICAiZmllbGQgXCIiICsgZmllbGQyLT5uYW1lKCkgKyAiXCIgZ2VuZXJhdGUgdGhlIG1ldGhvZCBcIiIgKworICAgICAgICAgICAgICAgICJnZXQiICsgbmFtZTEgKyAiQ291bnQoKVwiIjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBpZiAobmFtZTEgKyAiTGlzdCIgPT0gbmFtZTIpIHsKKyAgICAgICAgKmluZm8gPSAiYm90aCByZXBlYXRlZCBmaWVsZCBcIiIgKyBmaWVsZDEtPm5hbWUoKSArICJcIiBhbmQgc2luZ3VsYXIgIiArCisgICAgICAgICAgICAgICAgImZpZWxkIFwiIiArIGZpZWxkMi0+bmFtZSgpICsgIlwiIGdlbmVyYXRlIHRoZSBtZXRob2QgXCIiICsKKyAgICAgICAgICAgICAgICAiZ2V0IiArIG5hbWUxICsgIkxpc3QoKVwiIjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICAvLyBXZWxsLCB0aGVyZSBhcmUgb2J2aW91c2x5IG1hbnkgbW9yZSBjb25mbGljdGluZyBjYXNlcywgYnV0IGl0IHByb2JhYmx5CisgICAgICAvLyBkb2Vzbid0IHdvcnRoIHRoZSBlZmZvcnQgdG8gZXhoYXVzdCBhbGwgb2YgdGhlbSBiZWNhdXNlIHRoZXkgcmFyZWx5CisgICAgICAvLyBoYXBwZW4gYW5kIGFzIHdlIGFyZSBjb250aW51aW5nIGFkZGluZyBuZXcgbWV0aG9kcy9jaGFuZ2luZyBleGlzdGluZworICAgICAgLy8gbWV0aG9kcyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBjb25mbGljdGluZyBjYXNlcyB3aWxsIGtlZXAgZ3Jvd2luZy4KKyAgICAgIC8vIFdlIGNhbiBqdXN0IGFkZCBtb3JlIGNhc2VzIGhlcmUgd2hlbiB0aGV5IGFyZSBmb3VuZCBpbiB0aGUgcmVhbCB3b3JsZC4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGZpZWxkMi0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgcmV0dXJuIElzQ29uZmxpY3RpbmcoZmllbGQyLCBuYW1lMiwgZmllbGQxLCBuYW1lMSwgaW5mbyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5vbmUgb2YgdGhlIHR3byBmaWVsZHMgYXJlIHJlcGVhdGVkLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgQ29udGV4dDo6SW5pdGlhbGl6ZUZpZWxkR2VuZXJhdG9ySW5mbyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBJbml0aWFsaXplRmllbGRHZW5lcmF0b3JJbmZvRm9yTWVzc2FnZShmaWxlLT5tZXNzYWdlX3R5cGUoaSkpOworICB9Cit9CisKK3ZvaWQgQ29udGV4dDo6SW5pdGlhbGl6ZUZpZWxkR2VuZXJhdG9ySW5mb0Zvck1lc3NhZ2UoCisgICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPm5lc3RlZF90eXBlX2NvdW50KCk7ICsraSkgeworICAgIEluaXRpYWxpemVGaWVsZEdlbmVyYXRvckluZm9Gb3JNZXNzYWdlKG1lc3NhZ2UtPm5lc3RlZF90eXBlKGkpKTsKKyAgfQorICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIGZpZWxkcy5yZXNlcnZlKG1lc3NhZ2UtPmZpZWxkX2NvdW50KCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmZpZWxkX2NvdW50KCk7ICsraSkgeworICAgIGZpZWxkcy5wdXNoX2JhY2sobWVzc2FnZS0+ZmllbGQoaSkpOworICB9CisgIEluaXRpYWxpemVGaWVsZEdlbmVyYXRvckluZm9Gb3JGaWVsZHMoZmllbGRzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPm9uZW9mX2RlY2xfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZiA9IG1lc3NhZ2UtPm9uZW9mX2RlY2woaSk7CisgICAgT25lb2ZHZW5lcmF0b3JJbmZvIGluZm87CisgICAgaW5mby5uYW1lID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShvbmVvZi0+bmFtZSgpLCBmYWxzZSk7CisgICAgaW5mby5jYXBpdGFsaXplZF9uYW1lID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShvbmVvZi0+bmFtZSgpLCB0cnVlKTsKKyAgICBvbmVvZl9nZW5lcmF0b3JfaW5mb19tYXBfW29uZW9mXSA9IGluZm87CisgIH0KK30KKwordm9pZCBDb250ZXh0OjpJbml0aWFsaXplRmllbGRHZW5lcmF0b3JJbmZvRm9yRmllbGRzKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+JiBmaWVsZHMpIHsKKyAgLy8gRmluZCBvdXQgYWxsIGZpZWxkcyB0aGF0IGNvbmZsaWN0IHdpdGggc29tZSBvdGhlciBmaWVsZCBpbiB0aGUgc2FtZQorICAvLyBtZXNzYWdlLgorICBzdGQ6OnZlY3Rvcjxib29sPiBpc19jb25mbGljdChmaWVsZHMuc2l6ZSgpKTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbmZsaWN0X3JlYXNvbihmaWVsZHMuc2l6ZSgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZmllbGRzW2ldOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lID0gVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGZpZWxkKTsKKyAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBmaWVsZHMuc2l6ZSgpOyArK2opIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogb3RoZXIgPSBmaWVsZHNbal07CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3RoZXJfbmFtZSA9IFVuZGVyc2NvcmVzVG9DYXBpdGFsaXplZENhbWVsQ2FzZShvdGhlcik7CisgICAgICBpZiAobmFtZSA9PSBvdGhlcl9uYW1lKSB7CisgICAgICAgIGlzX2NvbmZsaWN0W2ldID0gaXNfY29uZmxpY3Rbal0gPSB0cnVlOworICAgICAgICBjb25mbGljdF9yZWFzb25baV0gPSBjb25mbGljdF9yZWFzb25bal0gPQorICAgICAgICAgICAgImNhcGl0YWxpemVkIG5hbWUgb2YgZmllbGQgXCIiICsgZmllbGQtPm5hbWUoKSArCisgICAgICAgICAgICAiXCIgY29uZmxpY3RzIHdpdGggZmllbGQgXCIiICsgb3RoZXItPm5hbWUoKSArICJcIiI7CisgICAgICB9IGVsc2UgaWYgKElzQ29uZmxpY3RpbmcoZmllbGQsIG5hbWUsIG90aGVyLCBvdGhlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25mbGljdF9yZWFzb25bal0pKSB7CisgICAgICAgIGlzX2NvbmZsaWN0W2ldID0gaXNfY29uZmxpY3Rbal0gPSB0cnVlOworICAgICAgICBjb25mbGljdF9yZWFzb25baV0gPSBjb25mbGljdF9yZWFzb25bal07CisgICAgICB9CisgICAgfQorICAgIGlmIChpc19jb25mbGljdFtpXSkgeworICAgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiZmllbGQgXCIiIDw8IGZpZWxkLT5mdWxsX25hbWUoKSA8PCAiXCIgaXMgY29uZmxpY3RpbmcgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIGFub3RoZXIgZmllbGQ6ICIgPDwgY29uZmxpY3RfcmVhc29uW2ldOworICAgIH0KKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBmaWVsZHNbaV07CisgICAgRmllbGRHZW5lcmF0b3JJbmZvIGluZm87CisgICAgaW5mby5uYW1lID0gQ2FtZWxDYXNlRmllbGROYW1lKGZpZWxkKTsKKyAgICBpbmZvLmNhcGl0YWxpemVkX25hbWUgPSBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoZmllbGQpOworICAgIC8vIEZvciBmaWVsZHMgY29uZmxpY3Rpbmcgd2l0aCBzb21lIG90aGVyIGZpZWxkcywgd2UgYXBwZW5kIHRoZSBmaWVsZAorICAgIC8vIG51bWJlciB0byB0aGVpciBmaWVsZCBuYW1lcyBpbiBnZW5lcmF0ZWQgY29kZSB0byBhdm9pZCBjb25mbGljdHMuCisgICAgaWYgKGlzX2NvbmZsaWN0W2ldKSB7CisgICAgICBpbmZvLm5hbWUgKz0gU3RyQ2F0KGZpZWxkLT5udW1iZXIoKSk7CisgICAgICBpbmZvLmNhcGl0YWxpemVkX25hbWUgKz0gU3RyQ2F0KGZpZWxkLT5udW1iZXIoKSk7CisgICAgICBpbmZvLmRpc2FtYmlndWF0ZWRfcmVhc29uID0gY29uZmxpY3RfcmVhc29uW2ldOworICAgIH0KKyAgICBmaWVsZF9nZW5lcmF0b3JfaW5mb19tYXBfW2ZpZWxkXSA9IGluZm87CisgIH0KK30KKworY29uc3QgRmllbGRHZW5lcmF0b3JJbmZvKiBDb250ZXh0OjpHZXRGaWVsZEdlbmVyYXRvckluZm8oCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIHJlc3VsdCA9CisgICAgICBGaW5kT3JOdWxsKGZpZWxkX2dlbmVyYXRvcl9pbmZvX21hcF8sIGZpZWxkKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbiBub3QgZmluZCBGaWVsZEdlbmVyYXRvckluZm8gZm9yIGZpZWxkOiAiCisgICAgICAgICAgICAgICA8PCBmaWVsZC0+ZnVsbF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworY29uc3QgT25lb2ZHZW5lcmF0b3JJbmZvKiBDb250ZXh0OjpHZXRPbmVvZkdlbmVyYXRvckluZm8oCisgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZikgY29uc3QgeworICBjb25zdCBPbmVvZkdlbmVyYXRvckluZm8qIHJlc3VsdCA9CisgICAgICBGaW5kT3JOdWxsKG9uZW9mX2dlbmVyYXRvcl9pbmZvX21hcF8sIG9uZW9mKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbiBub3QgZmluZCBPbmVvZkdlbmVyYXRvckluZm8gZm9yIG9uZW9mOiAiCisgICAgICAgICAgICAgICA8PCBvbmVvZi0+bmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIERvZXMgdGhpcyBtZXNzYWdlIGNsYXNzIGhhdmUgZ2VuZXJhdGVkIHBhcnNpbmcsIHNlcmlhbGl6YXRpb24sIGFuZCBvdGhlcgorLy8gc3RhbmRhcmQgbWV0aG9kcyBmb3Igd2hpY2ggcmVmbGVjdGlvbi1iYXNlZCBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbnMgZXhpc3Q/Citib29sIENvbnRleHQ6Okhhc0dlbmVyYXRlZE1ldGhvZHMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgY29uc3QgeworICByZXR1cm4gb3B0aW9uc18uZW5mb3JjZV9saXRlIHx8CisgICAgICAgICBkZXNjcmlwdG9yLT5maWxlKCktPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPSBGaWxlT3B0aW9uczo6Q09ERV9TSVpFOworfQorCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9jb250ZXh0LmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMjRhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvY29udGV4dC5oCkBAIC0wLDAgKzEsMTEzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9DT05URVhUX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9DT05URVhUX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvb3B0aW9ucy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CitjbGFzcyBGaWxlRGVzY3JpcHRvcjsKK2NsYXNzIEZpZWxkRGVzY3JpcHRvcjsKK2NsYXNzIE9uZW9mRGVzY3JpcHRvcjsKK2NsYXNzIERlc2NyaXB0b3I7CitjbGFzcyBFbnVtRGVzY3JpcHRvcjsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CitjbGFzcyBDbGFzc05hbWVSZXNvbHZlcjsgIC8vIG5hbWVfcmVzb2x2ZXIuaAorfQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworc3RydWN0IEZpZWxkR2VuZXJhdG9ySW5mbzsKK3N0cnVjdCBPbmVvZkdlbmVyYXRvckluZm87CisvLyBBIGNvbnRleHQgb2JqZWN0IGhvbGRzIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGlzIHNoYXJlZCBhbW9uZyBhbGwgY29kZQorLy8gZ2VuZXJhdG9ycy4KK2NsYXNzIENvbnRleHQgeworIHB1YmxpYzoKKyAgQ29udGV4dChjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisgIH5Db250ZXh0KCk7CisKKyAgLy8gR2V0IHRoZSBuYW1lIHJlc29sdmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQuIFRoZSByZXNvbHZlcgorICAvLyBjYW4gYmUgdXNlZCB0byBtYXAgZGVzY3JpcHRvcnMgdG8gSmF2YSBjbGFzcyBuYW1lcy4KKyAgQ2xhc3NOYW1lUmVzb2x2ZXIqIEdldE5hbWVSZXNvbHZlcigpIGNvbnN0OworCisgIC8vIEdldCB0aGUgRmllbGRHZW5lcmF0b3JJbmZvIGZvciBhIGdpdmVuIGZpZWxkLgorICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIEdldEZpZWxkR2VuZXJhdG9ySW5mbygKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIC8vIEdldCB0aGUgT25lb2ZHZW5lcmF0b3JJbmZvIGZvciBhIGdpdmVuIG9uZW9mLgorICBjb25zdCBPbmVvZkdlbmVyYXRvckluZm8qIEdldE9uZW9mR2VuZXJhdG9ySW5mbygKKyAgICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2YpIGNvbnN0OworCisgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdCB7IHJldHVybiBvcHRpb25zXzsgfQorCisgIC8vIEVuZm9yY2VzIGFsbCB0aGUgZmlsZXMgKGluY2x1ZGluZyB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcykgdG8gdXNlCisgIC8vIExpdGVSdW50aW1lLgorCisgIGJvb2wgRW5mb3JjZUxpdGUoKSBjb25zdCB7IHJldHVybiBvcHRpb25zXy5lbmZvcmNlX2xpdGU7IH0KKworICAvLyBEb2VzIHRoaXMgbWVzc2FnZSBjbGFzcyBoYXZlIGdlbmVyYXRlZCBwYXJzaW5nLCBzZXJpYWxpemF0aW9uLCBhbmQgb3RoZXIKKyAgLy8gc3RhbmRhcmQgbWV0aG9kcyBmb3Igd2hpY2ggcmVmbGVjdGlvbi1iYXNlZCBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbnMgZXhpc3Q/CisgIGJvb2wgSGFzR2VuZXJhdGVkTWV0aG9kcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSBjb25zdDsKKworIHByaXZhdGU6CisgIHZvaWQgSW5pdGlhbGl6ZUZpZWxkR2VuZXJhdG9ySW5mbyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisgIHZvaWQgSW5pdGlhbGl6ZUZpZWxkR2VuZXJhdG9ySW5mb0Zvck1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSk7CisgIHZvaWQgSW5pdGlhbGl6ZUZpZWxkR2VuZXJhdG9ySW5mb0ZvckZpZWxkcygKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+JiBmaWVsZHMpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDbGFzc05hbWVSZXNvbHZlcj4gbmFtZV9yZXNvbHZlcl87CisgIHN0ZDo6bWFwPGNvbnN0IEZpZWxkRGVzY3JpcHRvciosIEZpZWxkR2VuZXJhdG9ySW5mbz4KKyAgICAgIGZpZWxkX2dlbmVyYXRvcl9pbmZvX21hcF87CisgIHN0ZDo6bWFwPGNvbnN0IE9uZW9mRGVzY3JpcHRvciosIE9uZW9mR2VuZXJhdG9ySW5mbz4KKyAgICAgIG9uZW9mX2dlbmVyYXRvcl9pbmZvX21hcF87CisgIE9wdGlvbnMgb3B0aW9uc187CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb250ZXh0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0NPTlRFWFRfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnQuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2YmZmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudC5jYwpAQCAtMCwwICsxLDQ0NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnQuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitzdGQ6OnN0cmluZyBFc2NhcGVKYXZhZG9jKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCkgeworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5yZXNlcnZlKGlucHV0LnNpemUoKSAqIDIpOworCisgIGNoYXIgcHJldiA9ICcqJzsKKworICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBpbnB1dC5zaXplKCk7IGkrKykgeworICAgIGNoYXIgYyA9IGlucHV0W2ldOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAnKic6CisgICAgICAgIC8vIEF2b2lkICIvKiIuCisgICAgICAgIGlmIChwcmV2ID09ICcvJykgeworICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiYjNDI7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICAvLyBBdm9pZCAiKi8iLgorICAgICAgICBpZiAocHJldiA9PSAnKicpIHsKKyAgICAgICAgICByZXN1bHQuYXBwZW5kKCImIzQ3OyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soYyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdAJzoKKyAgICAgICAgLy8gJ0AnIHN0YXJ0cyBqYXZhZG9jIHRhZ3MgaW5jbHVkaW5nIHRoZSBAZGVwcmVjYXRlZCB0YWcsIHdoaWNoIHdpbGwKKyAgICAgICAgLy8gY2F1c2UgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgaW5zZXJ0ZWQgYmVmb3JlIGEgZGVjbGFyYXRpb24gdGhhdAorICAgICAgICAvLyBkb2VzIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyBARGVwcmVjYXRlZCBhbm5vdGF0aW9uLgorICAgICAgICByZXN1bHQuYXBwZW5kKCImIzY0OyIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzwnOgorICAgICAgICAvLyBBdm9pZCBpbnRlcnByZXRhdGlvbiBhcyBIVE1MLgorICAgICAgICByZXN1bHQuYXBwZW5kKCImbHQ7Iik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPic6CisgICAgICAgIC8vIEF2b2lkIGludGVycHJldGF0aW9uIGFzIEhUTUwuCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiZndDsiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcmJzoKKyAgICAgICAgLy8gQXZvaWQgaW50ZXJwcmV0YXRpb24gYXMgSFRNTC4KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiJmFtcDsiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcXCc6CisgICAgICAgIC8vIEphdmEgaW50ZXJwcmV0cyBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMgYW55d2hlcmUhCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiYjOTI7Iik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcHJldiA9IGM7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBXcml0ZURvY0NvbW1lbnRCb2R5Rm9yTG9jYXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTG9jYXRpb24mIGxvY2F0aW9uKSB7CisgIHN0ZDo6c3RyaW5nIGNvbW1lbnRzID0gbG9jYXRpb24ubGVhZGluZ19jb21tZW50cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzOworICBpZiAoIWNvbW1lbnRzLmVtcHR5KCkpIHsKKyAgICAvLyBUT0RPKGtlbnRvbik6ICBJZGVhbGx5IHdlIHNob3VsZCBwYXJzZSB0aGUgY29tbWVudCB0ZXh0IGFzIE1hcmtkb3duIGFuZAorICAgIC8vICAgd3JpdGUgaXQgYmFjayBhcyBIVE1MLCBidXQgdGhpcyByZXF1aXJlcyBhIE1hcmtkb3duIHBhcnNlci4gIEZvciBub3cKKyAgICAvLyAgIHdlIGp1c3QgdXNlIDxwcmU+IHRvIGdldCBmaXhlZC13aWR0aCB0ZXh0IGZvcm1hdHRpbmcuCisKKyAgICAvLyBJZiB0aGUgY29tbWVudCBpdHNlbGYgY29udGFpbnMgYmxvY2sgY29tbWVudCBzdGFydCBvciBlbmQgbWFya2VycywKKyAgICAvLyBIVE1MLWVzY2FwZSB0aGVtIHNvIHRoYXQgdGhleSBkb24ndCBhY2NpZGVudGFsbHkgY2xvc2UgdGhlIGRvYyBjb21tZW50LgorICAgIGNvbW1lbnRzID0gRXNjYXBlSmF2YWRvYyhjb21tZW50cyk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXMgPSBTcGxpdChjb21tZW50cywgIlxuIik7CisgICAgd2hpbGUgKCFsaW5lcy5lbXB0eSgpICYmIGxpbmVzLmJhY2soKS5lbXB0eSgpKSB7CisgICAgICBsaW5lcy5wb3BfYmFjaygpOworICAgIH0KKworICAgIHByaW50ZXItPlByaW50KCIgKiA8cHJlPlxuIik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgLy8gTW9zdCBsaW5lcyBzaG91bGQgc3RhcnQgd2l0aCBhIHNwYWNlLiAgV2F0Y2ggb3V0IGZvciBsaW5lcyB0aGF0IHN0YXJ0CisgICAgICAvLyB3aXRoIGEgLywgc2luY2UgcHV0dGluZyB0aGF0IHJpZ2h0IGFmdGVyIHRoZSBsZWFkaW5nIGFzdGVyaXNrIHdpbGwKKyAgICAgIC8vIGNsb3NlIHRoZSBjb21tZW50LgorICAgICAgaWYgKCFsaW5lc1tpXS5lbXB0eSgpICYmIGxpbmVzW2ldWzBdID09ICcvJykgeworICAgICAgICBwcmludGVyLT5QcmludCgiICogJGxpbmUkXG4iLCAibGluZSIsIGxpbmVzW2ldKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZXItPlByaW50KCIgKiRsaW5lJFxuIiwgImxpbmUiLCBsaW5lc1tpXSk7CisgICAgICB9CisgICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICogPC9wcmU+XG4iCisgICAgICAgICIgKlxuIik7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUeXBlPgorc3RhdGljIHZvaWQgV3JpdGVEb2NDb21tZW50Qm9keShpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclR5cGUqIGRlc2NyaXB0b3IpIHsKKyAgU291cmNlTG9jYXRpb24gbG9jYXRpb247CisgIGlmIChkZXNjcmlwdG9yLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jYXRpb24pKSB7CisgICAgV3JpdGVEb2NDb21tZW50Qm9keUZvckxvY2F0aW9uKHByaW50ZXIsIGxvY2F0aW9uKTsKKyAgfQorfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgRmlyc3RMaW5lT2YoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHZhbHVlOworCisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gcmVzdWx0LmZpbmRfZmlyc3Rfb2YoJ1xuJyk7CisgIGlmIChwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICByZXN1bHQuZXJhc2UocG9zKTsKKyAgfQorCisgIC8vIElmIGxpbmUgZW5kcyBpbiBhbiBvcGVuaW5nIGJyYWNlLCBtYWtlIGl0ICJ7IC4uLiB9IiBzbyBpdCBsb29rcyBuaWNlLgorICBpZiAoIXJlc3VsdC5lbXB0eSgpICYmIHJlc3VsdFtyZXN1bHQuc2l6ZSgpIC0gMV0gPT0gJ3snKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiIC4uLiB9Iik7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFdyaXRlTWVzc2FnZURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UpIHsKKyAgcHJpbnRlci0+UHJpbnQoIi8qKlxuIik7CisgIFdyaXRlRG9jQ29tbWVudEJvZHkocHJpbnRlciwgbWVzc2FnZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIiAqIFByb3RvYnVmIHR5cGUge0Bjb2RlICRmdWxsbmFtZSR9XG4iCisgICAgICAiICovXG4iLAorICAgICAgImZ1bGxuYW1lIiwgRXNjYXBlSmF2YWRvYyhtZXNzYWdlLT5mdWxsX25hbWUoKSkpOworfQorCit2b2lkIFdyaXRlRmllbGREb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIC8vIFdlIHN0YXJ0IHRoZSBjb21tZW50IHdpdGggdGhlIG1haW4gYm9keSBiYXNlZCBvbiB0aGUgY29tbWVudHMgZnJvbSB0aGUKKyAgLy8gLnByb3RvIGZpbGUgKGlmIHByZXNlbnQpLiBXZSB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIGZpZWxkIGRlY2xhcmF0aW9uLAorICAvLyBlLmcuOgorICAvLyAgIG9wdGlvbmFsIHN0cmluZyBmb28gPSA1OworICAvLyBBbmQgdGhlbiB3ZSBlbmQgd2l0aCB0aGUgamF2YWRvYyB0YWdzIGlmIGFwcGxpY2FibGUuCisgIC8vIElmIHRoZSBmaWVsZCBpcyBhIGdyb3VwLCB0aGUgZGVidWcgc3RyaW5nIG1pZ2h0IGVuZCB3aXRoIHsuCisgIHByaW50ZXItPlByaW50KCIvKipcbiIpOworICBXcml0ZURvY0NvbW1lbnRCb2R5KHByaW50ZXIsIGZpZWxkKTsKKyAgcHJpbnRlci0+UHJpbnQoIiAqIDxjb2RlPiRkZWYkPC9jb2RlPlxuIiwgImRlZiIsCisgICAgICAgICAgICAgICAgIEVzY2FwZUphdmFkb2MoRmlyc3RMaW5lT2YoZmllbGQtPkRlYnVnU3RyaW5nKCkpKSk7CisgIHByaW50ZXItPlByaW50KCIgKi9cbiIpOworfQorCit2b2lkIFdyaXRlRGVwcmVjYXRlZEphdmFkb2MoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGRBY2Nlc3NvclR5cGUgdHlwZSkgeworICBpZiAoIWZpZWxkLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gTGl0ZSBjb2RlZ2VuIGRvZXMgbm90IGFubm90YXRlIHNldCAmIGNsZWFyIG1ldGhvZHMgd2l0aCBARGVwcmVjYXRlZC4KKyAgaWYgKGZpZWxkLT5maWxlKCktPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSA9PSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FICYmCisgICAgICAodHlwZSA9PSBTRVRURVIgfHwgdHlwZSA9PSBDTEVBUkVSKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHN0YXJ0TGluZSA9ICIwIjsKKyAgU291cmNlTG9jYXRpb24gbG9jYXRpb247CisgIGlmIChmaWVsZC0+R2V0U291cmNlTG9jYXRpb24oJmxvY2F0aW9uKSkgeworICAgIHN0YXJ0TGluZSA9IHN0ZDo6dG9fc3RyaW5nKGxvY2F0aW9uLnN0YXJ0X2xpbmUpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoIiAqIEBkZXByZWNhdGVkICRuYW1lJCBpcyBkZXByZWNhdGVkLlxuIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICBmaWVsZC0+ZnVsbF9uYW1lKCkpOworICBwcmludGVyLT5QcmludCgiICogICAgIFNlZSAkZmlsZSQ7bD0kbGluZSRcbiIsICJmaWxlIiwgZmllbGQtPmZpbGUoKS0+bmFtZSgpLAorICAgICAgICAgICAgICAgICAibGluZSIsIHN0YXJ0TGluZSk7Cit9CisKK3ZvaWQgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkQWNjZXNzb3JUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBidWlsZGVyKSB7CisgIHByaW50ZXItPlByaW50KCIvKipcbiIpOworICBXcml0ZURvY0NvbW1lbnRCb2R5KHByaW50ZXIsIGZpZWxkKTsKKyAgcHJpbnRlci0+UHJpbnQoIiAqIDxjb2RlPiRkZWYkPC9jb2RlPlxuIiwgImRlZiIsCisgICAgICAgICAgICAgICAgIEVzY2FwZUphdmFkb2MoRmlyc3RMaW5lT2YoZmllbGQtPkRlYnVnU3RyaW5nKCkpKSk7CisgIFdyaXRlRGVwcmVjYXRlZEphdmFkb2MocHJpbnRlciwgZmllbGQsIHR5cGUpOworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEhBWlpFUjoKKyAgICAgIHByaW50ZXItPlByaW50KCIgKiBAcmV0dXJuIFdoZXRoZXIgdGhlICRuYW1lJCBmaWVsZCBpcyBzZXQuXG4iLCAibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+Y2FtZWxjYXNlX25hbWUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdFVFRFUjoKKyAgICAgIHByaW50ZXItPlByaW50KCIgKiBAcmV0dXJuIFRoZSAkbmFtZSQuXG4iLCAibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+Y2FtZWxjYXNlX25hbWUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNFVFRFUjoKKyAgICAgIHByaW50ZXItPlByaW50KCIgKiBAcGFyYW0gdmFsdWUgVGhlICRuYW1lJCB0byBzZXQuXG4iLCAibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+Y2FtZWxjYXNlX25hbWUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENMRUFSRVI6CisgICAgICAvLyBQcmludCBub3RoaW5nCisgICAgICBicmVhazsKKyAgICAvLyBSZXBlYXRlZAorICAgIGNhc2UgTElTVF9DT1VOVDoKKyAgICAgIHByaW50ZXItPlByaW50KCIgKiBAcmV0dXJuIFRoZSBjb3VudCBvZiAkbmFtZSQuXG4iLCAibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+Y2FtZWxjYXNlX25hbWUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExJU1RfR0VUVEVSOgorICAgICAgcHJpbnRlci0+UHJpbnQoIiAqIEByZXR1cm4gQSBsaXN0IGNvbnRhaW5pbmcgdGhlICRuYW1lJC5cbiIsICJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTElTVF9JTkRFWEVEX0dFVFRFUjoKKyAgICAgIHByaW50ZXItPlByaW50KCIgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybi5cbiIpOworICAgICAgcHJpbnRlci0+UHJpbnQoIiAqIEByZXR1cm4gVGhlICRuYW1lJCBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4iLCAibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+Y2FtZWxjYXNlX25hbWUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExJU1RfSU5ERVhFRF9TRVRURVI6CisgICAgICBwcmludGVyLT5QcmludCgiICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBzZXQgdGhlIHZhbHVlIGF0LlxuIik7CisgICAgICBwcmludGVyLT5QcmludCgiICogQHBhcmFtIHZhbHVlIFRoZSAkbmFtZSQgdG8gc2V0LlxuIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmNhbWVsY2FzZV9uYW1lKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMSVNUX0FEREVSOgorICAgICAgcHJpbnRlci0+UHJpbnQoIiAqIEBwYXJhbSB2YWx1ZSBUaGUgJG5hbWUkIHRvIGFkZC5cbiIsICJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTElTVF9NVUxUSV9BRERFUjoKKyAgICAgIHByaW50ZXItPlByaW50KCIgKiBAcGFyYW0gdmFsdWVzIFRoZSAkbmFtZSQgdG8gYWRkLlxuIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmNhbWVsY2FzZV9uYW1lKCkpOworICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKGJ1aWxkZXIpIHsKKyAgICBwcmludGVyLT5QcmludCgiICogQHJldHVybiBUaGlzIGJ1aWxkZXIgZm9yIGNoYWluaW5nLlxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIiAqL1xuIik7Cit9CisKK3ZvaWQgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkQWNjZXNzb3JUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBidWlsZGVyKSB7CisgIHByaW50ZXItPlByaW50KCIvKipcbiIpOworICBXcml0ZURvY0NvbW1lbnRCb2R5KHByaW50ZXIsIGZpZWxkKTsKKyAgcHJpbnRlci0+UHJpbnQoIiAqIDxjb2RlPiRkZWYkPC9jb2RlPlxuIiwgImRlZiIsCisgICAgICAgICAgICAgICAgIEVzY2FwZUphdmFkb2MoRmlyc3RMaW5lT2YoZmllbGQtPkRlYnVnU3RyaW5nKCkpKSk7CisgIFdyaXRlRGVwcmVjYXRlZEphdmFkb2MocHJpbnRlciwgZmllbGQsIHR5cGUpOworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEhBWlpFUjoKKyAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0VUVEVSOgorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIiAqIEByZXR1cm4gVGhlIGVudW0gbnVtZXJpYyB2YWx1ZSBvbiB0aGUgd2lyZSBmb3IgJG5hbWUkLlxuIiwgIm5hbWUiLAorICAgICAgICAgIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0VUVEVSOgorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIiAqIEBwYXJhbSB2YWx1ZSBUaGUgZW51bSBudW1lcmljIHZhbHVlIG9uIHRoZSB3aXJlIGZvciAkbmFtZSQgdG8gIgorICAgICAgICAgICJzZXQuXG4iLAorICAgICAgICAgICJuYW1lIiwgZmllbGQtPmNhbWVsY2FzZV9uYW1lKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTEVBUkVSOgorICAgICAgLy8gUHJpbnQgbm90aGluZworICAgICAgYnJlYWs7CisgICAgLy8gUmVwZWF0ZWQKKyAgICBjYXNlIExJU1RfQ09VTlQ6CisgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICBicmVhazsKKyAgICBjYXNlIExJU1RfR0VUVEVSOgorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIiAqIEByZXR1cm4gQSBsaXN0IGNvbnRhaW5pbmcgdGhlIGVudW0gbnVtZXJpYyB2YWx1ZXMgb24gdGhlIHdpcmUgIgorICAgICAgICAgICJmb3IgJG5hbWUkLlxuIiwKKyAgICAgICAgICAibmFtZSIsIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTElTVF9JTkRFWEVEX0dFVFRFUjoKKyAgICAgIHByaW50ZXItPlByaW50KCIgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSB2YWx1ZSB0byByZXR1cm4uXG4iKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIgKiBAcmV0dXJuIFRoZSBlbnVtIG51bWVyaWMgdmFsdWUgb24gdGhlIHdpcmUgb2YgJG5hbWUkIGF0IHRoZSAiCisgICAgICAgICAgImdpdmVuIGluZGV4LlxuIiwKKyAgICAgICAgICAibmFtZSIsIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTElTVF9JTkRFWEVEX1NFVFRFUjoKKyAgICAgIHByaW50ZXItPlByaW50KCIgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIHNldCB0aGUgdmFsdWUgYXQuXG4iKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIgKiBAcGFyYW0gdmFsdWUgVGhlIGVudW0gbnVtZXJpYyB2YWx1ZSBvbiB0aGUgd2lyZSBmb3IgJG5hbWUkIHRvICIKKyAgICAgICAgICAic2V0LlxuIiwKKyAgICAgICAgICAibmFtZSIsIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTElTVF9BRERFUjoKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIgKiBAcGFyYW0gdmFsdWUgVGhlIGVudW0gbnVtZXJpYyB2YWx1ZSBvbiB0aGUgd2lyZSBmb3IgJG5hbWUkIHRvICIKKyAgICAgICAgICAiYWRkLlxuIiwKKyAgICAgICAgICAibmFtZSIsIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTElTVF9NVUxUSV9BRERFUjoKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIgKiBAcGFyYW0gdmFsdWVzIFRoZSBlbnVtIG51bWVyaWMgdmFsdWVzIG9uIHRoZSB3aXJlIGZvciAkbmFtZSQgdG8gIgorICAgICAgICAgICJhZGQuXG4iLAorICAgICAgICAgICJuYW1lIiwgZmllbGQtPmNhbWVsY2FzZV9uYW1lKCkpOworICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKGJ1aWxkZXIpIHsKKyAgICBwcmludGVyLT5QcmludCgiICogQHJldHVybiBUaGlzIGJ1aWxkZXIgZm9yIGNoYWluaW5nLlxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIiAqL1xuIik7Cit9CisKK3ZvaWQgV3JpdGVGaWVsZFN0cmluZ0J5dGVzQWNjZXNzb3JEb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkQWNjZXNzb3JUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGJ1aWxkZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoIi8qKlxuIik7CisgIFdyaXRlRG9jQ29tbWVudEJvZHkocHJpbnRlciwgZmllbGQpOworICBwcmludGVyLT5QcmludCgiICogPGNvZGU+JGRlZiQ8L2NvZGU+XG4iLCAiZGVmIiwKKyAgICAgICAgICAgICAgICAgRXNjYXBlSmF2YWRvYyhGaXJzdExpbmVPZihmaWVsZC0+RGVidWdTdHJpbmcoKSkpKTsKKyAgV3JpdGVEZXByZWNhdGVkSmF2YWRvYyhwcmludGVyLCBmaWVsZCwgdHlwZSk7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgSEFaWkVSOgorICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHRVRURVI6CisgICAgICBwcmludGVyLT5QcmludCgiICogQHJldHVybiBUaGUgYnl0ZXMgZm9yICRuYW1lJC5cbiIsICJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0VUVEVSOgorICAgICAgcHJpbnRlci0+UHJpbnQoIiAqIEBwYXJhbSB2YWx1ZSBUaGUgYnl0ZXMgZm9yICRuYW1lJCB0byBzZXQuXG4iLCAibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+Y2FtZWxjYXNlX25hbWUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENMRUFSRVI6CisgICAgICAvLyBQcmludCBub3RoaW5nCisgICAgICBicmVhazsKKyAgICAvLyBSZXBlYXRlZAorICAgIGNhc2UgTElTVF9DT1VOVDoKKyAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTElTVF9HRVRURVI6CisgICAgICBwcmludGVyLT5QcmludCgiICogQHJldHVybiBBIGxpc3QgY29udGFpbmluZyB0aGUgYnl0ZXMgZm9yICRuYW1lJC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAibmFtZSIsIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTElTVF9JTkRFWEVEX0dFVFRFUjoKKyAgICAgIHByaW50ZXItPlByaW50KCIgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSB2YWx1ZSB0byByZXR1cm4uXG4iKTsKKyAgICAgIHByaW50ZXItPlByaW50KCIgKiBAcmV0dXJuIFRoZSBieXRlcyBvZiB0aGUgJG5hbWUkIGF0IHRoZSBnaXZlbiBpbmRleC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAibmFtZSIsIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTElTVF9JTkRFWEVEX1NFVFRFUjoKKyAgICAgIHByaW50ZXItPlByaW50KCIgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIHNldCB0aGUgdmFsdWUgYXQuXG4iKTsKKyAgICAgIHByaW50ZXItPlByaW50KCIgKiBAcGFyYW0gdmFsdWUgVGhlIGJ5dGVzIG9mIHRoZSAkbmFtZSQgdG8gc2V0LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICJuYW1lIiwgZmllbGQtPmNhbWVsY2FzZV9uYW1lKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMSVNUX0FEREVSOgorICAgICAgcHJpbnRlci0+UHJpbnQoIiAqIEBwYXJhbSB2YWx1ZSBUaGUgYnl0ZXMgb2YgdGhlICRuYW1lJCB0byBhZGQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgIm5hbWUiLCBmaWVsZC0+Y2FtZWxjYXNlX25hbWUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExJU1RfTVVMVElfQURERVI6CisgICAgICBwcmludGVyLT5QcmludCgiICogQHBhcmFtIHZhbHVlcyBUaGUgYnl0ZXMgb2YgdGhlICRuYW1lJCB0byBhZGQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgIm5hbWUiLCBmaWVsZC0+Y2FtZWxjYXNlX25hbWUoKSk7CisgICAgICBicmVhazsKKyAgfQorICBpZiAoYnVpbGRlcikgeworICAgIHByaW50ZXItPlByaW50KCIgKiBAcmV0dXJuIFRoaXMgYnVpbGRlciBmb3IgY2hhaW5pbmcuXG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgiICovXG4iKTsKK30KKworLy8gRW51bQorCit2b2lkIFdyaXRlRW51bURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtXykgeworICBwcmludGVyLT5QcmludCgiLyoqXG4iKTsKKyAgV3JpdGVEb2NDb21tZW50Qm9keShwcmludGVyLCBlbnVtXyk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIiAqIFByb3RvYnVmIGVudW0ge0Bjb2RlICRmdWxsbmFtZSR9XG4iCisgICAgICAiICovXG4iLAorICAgICAgImZ1bGxuYW1lIiwgRXNjYXBlSmF2YWRvYyhlbnVtXy0+ZnVsbF9uYW1lKCkpKTsKK30KKwordm9pZCBXcml0ZUVudW1WYWx1ZURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgeworICBwcmludGVyLT5QcmludCgiLyoqXG4iKTsKKyAgV3JpdGVEb2NDb21tZW50Qm9keShwcmludGVyLCB2YWx1ZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIiAqIDxjb2RlPiRkZWYkPC9jb2RlPlxuIgorICAgICAgIiAqL1xuIiwKKyAgICAgICJkZWYiLCBFc2NhcGVKYXZhZG9jKEZpcnN0TGluZU9mKHZhbHVlLT5EZWJ1Z1N0cmluZygpKSkpOworfQorCit2b2lkIFdyaXRlU2VydmljZURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UpIHsKKyAgcHJpbnRlci0+UHJpbnQoIi8qKlxuIik7CisgIFdyaXRlRG9jQ29tbWVudEJvZHkocHJpbnRlciwgc2VydmljZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIiAqIFByb3RvYnVmIHNlcnZpY2Uge0Bjb2RlICRmdWxsbmFtZSR9XG4iCisgICAgICAiICovXG4iLAorICAgICAgImZ1bGxuYW1lIiwgRXNjYXBlSmF2YWRvYyhzZXJ2aWNlLT5mdWxsX25hbWUoKSkpOworfQorCit2b2lkIFdyaXRlTWV0aG9kRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCkgeworICBwcmludGVyLT5QcmludCgiLyoqXG4iKTsKKyAgV3JpdGVEb2NDb21tZW50Qm9keShwcmludGVyLCBtZXRob2QpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICIgKiA8Y29kZT4kZGVmJDwvY29kZT5cbiIKKyAgICAgICIgKi9cbiIsCisgICAgICAiZGVmIiwgRXNjYXBlSmF2YWRvYyhGaXJzdExpbmVPZihtZXRob2QtPkRlYnVnU3RyaW5nKCkpKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50LmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjY4Nzc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50LmgKQEAgLTAsMCArMSwxMDIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9ET0NfQ09NTUVOVF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRE9DX0NPTU1FTlRfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKK2NsYXNzIFByaW50ZXI7ICAvLyBwcmludGVyLmgKK30KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitlbnVtIEZpZWxkQWNjZXNzb3JUeXBlIHsKKyAgSEFaWkVSLAorICBHRVRURVIsCisgIFNFVFRFUiwKKyAgQ0xFQVJFUiwKKyAgLy8gUmVwZWF0ZWQKKyAgTElTVF9DT1VOVCwKKyAgTElTVF9HRVRURVIsCisgIExJU1RfSU5ERVhFRF9HRVRURVIsCisgIExJU1RfSU5ERVhFRF9TRVRURVIsCisgIExJU1RfQURERVIsCisgIExJU1RfTVVMVElfQURERVIKK307CisKK3ZvaWQgV3JpdGVNZXNzYWdlRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSk7Cit2b2lkIFdyaXRlRmllbGREb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKK3ZvaWQgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkQWNjZXNzb3JUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBidWlsZGVyID0gZmFsc2UpOwordm9pZCBXcml0ZUZpZWxkRW51bVZhbHVlQWNjZXNzb3JEb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGRBY2Nlc3NvclR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGJ1aWxkZXIgPSBmYWxzZSk7Cit2b2lkIFdyaXRlRmllbGRTdHJpbmdCeXRlc0FjY2Vzc29yRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZEFjY2Vzc29yVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBidWlsZGVyID0gZmFsc2UpOwordm9pZCBXcml0ZUVudW1Eb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV8pOwordm9pZCBXcml0ZUVudW1WYWx1ZURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSk7Cit2b2lkIFdyaXRlU2VydmljZURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UpOwordm9pZCBXcml0ZU1ldGhvZERvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpOworCisvLyBFeHBvc2VkIGZvciB0ZXN0aW5nIG9ubHkuCitQUk9UT0NfRVhQT1JUIHN0ZDo6c3RyaW5nIEVzY2FwZUphdmFkb2MoY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0KTsKKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRE9DX0NPTU1FTlRfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjZGYwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDU2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnQuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CituYW1lc3BhY2UgeworCitURVNUKEphdmFEb2NDb21tZW50VGVzdCwgRXNjYXBpbmcpIHsKKyAgRVhQRUNUX0VRKCJmb28gLyYjNDI7IGJhciAqJiM0NzsgYmF6IiwgRXNjYXBlSmF2YWRvYygiZm9vIC8qIGJhciAqLyBiYXoiKSk7CisgIEVYUEVDVF9FUSgiZm9vIC8mIzQyOyYjNDc7IGJheiIsIEVzY2FwZUphdmFkb2MoImZvbyAvKi8gYmF6IikpOworICBFWFBFQ1RfRVEoInsmIzY0O2Zvb30iLCBFc2NhcGVKYXZhZG9jKCJ7QGZvb30iKSk7CisgIEVYUEVDVF9FUSgiJmx0O2kmZ3Q7JmFtcDsmbHQ7L2kmZ3Q7IiwgRXNjYXBlSmF2YWRvYygiPGk+JjwvaT4iKSk7CisgIEVYUEVDVF9FUSgiZm9vJiM5Mjt1MTIzNGJhciIsIEVzY2FwZUphdmFkb2MoImZvb1xcdTEyMzRiYXIiKSk7CisgIEVYUEVDVF9FUSgiJiM2NDtkZXByZWNhdGVkIiwgRXNjYXBlSmF2YWRvYygiQGRlcHJlY2F0ZWQiKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYWI5M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bS5jYwpAQCAtMCwwICsxLDM5NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bS5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZV9yZXNvbHZlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisKKy8vIE11c3QgYmUgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitFbnVtR2VuZXJhdG9yOjpFbnVtR2VuZXJhdG9yKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZV9hcGksIENvbnRleHQqIGNvbnRleHQpCisgICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwKKyAgICAgIGltbXV0YWJsZV9hcGlfKGltbXV0YWJsZV9hcGkpLAorICAgICAgY29udGV4dF8oY29udGV4dCksCisgICAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSA9IGRlc2NyaXB0b3JfLT52YWx1ZShpKTsKKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBjYW5vbmljYWxfdmFsdWUgPQorICAgICAgICBkZXNjcmlwdG9yXy0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUtPm51bWJlcigpKTsKKworICAgIGlmICh2YWx1ZSA9PSBjYW5vbmljYWxfdmFsdWUpIHsKKyAgICAgIGNhbm9uaWNhbF92YWx1ZXNfLnB1c2hfYmFjayh2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFsaWFzIGFsaWFzOworICAgICAgYWxpYXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgIGFsaWFzLmNhbm9uaWNhbF92YWx1ZSA9IGNhbm9uaWNhbF92YWx1ZTsKKyAgICAgIGFsaWFzZXNfLnB1c2hfYmFjayhhbGlhcyk7CisgICAgfQorICB9Cit9CisKK0VudW1HZW5lcmF0b3I6On5FbnVtR2VuZXJhdG9yKCkge30KKwordm9pZCBFbnVtR2VuZXJhdG9yOjpHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBXcml0ZUVudW1Eb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgTWF5YmVQcmludEdlbmVyYXRlZEFubm90YXRpb24oY29udGV4dF8sIHByaW50ZXIsIGRlc2NyaXB0b3JfLCBpbW11dGFibGVfYXBpXyk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgZW51bSAkY2xhc3NuYW1lJFxuIgorICAgICAgIiAgICBpbXBsZW1lbnRzIGNvbS5nb29nbGUucHJvdG9idWYuUHJvdG9jb2xNZXNzYWdlRW51bSB7XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCksICJkZXByZWNhdGlvbiIsCisgICAgICBkZXNjcmlwdG9yXy0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKSA/ICJAamF2YS5sYW5nLkRlcHJlY2F0ZWQgIiA6ICIiKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgYm9vbCBvcmRpbmFsX2lzX2luZGV4ID0gdHJ1ZTsKKyAgc3RkOjpzdHJpbmcgaW5kZXhfdGV4dCA9ICJvcmRpbmFsKCkiOworICBmb3IgKGludCBpID0gMDsgaSA8IGNhbm9uaWNhbF92YWx1ZXNfLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKGNhbm9uaWNhbF92YWx1ZXNfW2ldLT5pbmRleCgpICE9IGkpIHsKKyAgICAgIG9yZGluYWxfaXNfaW5kZXggPSBmYWxzZTsKKyAgICAgIGluZGV4X3RleHQgPSAiaW5kZXgiOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYW5vbmljYWxfdmFsdWVzXy5zaXplKCk7IGkrKykgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJuYW1lIl0gPSBjYW5vbmljYWxfdmFsdWVzX1tpXS0+bmFtZSgpOworICAgIHZhcnNbImluZGV4Il0gPSBTdHJDYXQoY2Fub25pY2FsX3ZhbHVlc19baV0tPmluZGV4KCkpOworICAgIHZhcnNbIm51bWJlciJdID0gU3RyQ2F0KGNhbm9uaWNhbF92YWx1ZXNfW2ldLT5udW1iZXIoKSk7CisgICAgV3JpdGVFbnVtVmFsdWVEb2NDb21tZW50KHByaW50ZXIsIGNhbm9uaWNhbF92YWx1ZXNfW2ldKTsKKyAgICBpZiAoY2Fub25pY2FsX3ZhbHVlc19baV0tPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJAamF2YS5sYW5nLkRlcHJlY2F0ZWRcbiIpOworICAgIH0KKyAgICBpZiAob3JkaW5hbF9pc19pbmRleCkgeworICAgICAgcHJpbnRlci0+UHJpbnQodmFycywgIiRuYW1lJCgkbnVtYmVyJCksXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQodmFycywgIiRuYW1lJCgkaW5kZXgkLCAkbnVtYmVyJCksXG4iKTsKKyAgICB9CisgICAgcHJpbnRlci0+QW5ub3RhdGUoIm5hbWUiLCBjYW5vbmljYWxfdmFsdWVzX1tpXSk7CisgIH0KKworICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBpZiAob3JkaW5hbF9pc19pbmRleCkgeworICAgICAgcHJpbnRlci0+UHJpbnQoIiR7JFVOUkVDT0dOSVpFRCR9JCgtMSksXG4iLCAieyIsICIiLCAifSIsICIiKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoIiR7JFVOUkVDT0dOSVpFRCR9JCgtMSwgLTEpLFxuIiwgInsiLCAiIiwgIn0iLCAiIik7CisgICAgfQorICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAgICI7XG4iCisgICAgICAiXG4iKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxpYXNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnM7CisgICAgdmFyc1siY2xhc3NuYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOworICAgIHZhcnNbIm5hbWUiXSA9IGFsaWFzZXNfW2ldLnZhbHVlLT5uYW1lKCk7CisgICAgdmFyc1siY2Fub25pY2FsX25hbWUiXSA9IGFsaWFzZXNfW2ldLmNhbm9uaWNhbF92YWx1ZS0+bmFtZSgpOworICAgIFdyaXRlRW51bVZhbHVlRG9jQ29tbWVudChwcmludGVyLCBhbGlhc2VzX1tpXS52YWx1ZSk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcnMsICJwdWJsaWMgc3RhdGljIGZpbmFsICRjbGFzc25hbWUkICRuYW1lJCA9ICRjYW5vbmljYWxfbmFtZSQ7XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgibmFtZSIsIGFsaWFzZXNfW2ldLnZhbHVlKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCk7IGkrKykgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJuYW1lIl0gPSBkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm5hbWUoKTsKKyAgICB2YXJzWyJudW1iZXIiXSA9IFN0ckNhdChkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm51bWJlcigpKTsKKyAgICB2YXJzWyJ7Il0gPSAiIjsKKyAgICB2YXJzWyJ9Il0gPSAiIjsKKyAgICB2YXJzWyJkZXByZWNhdGlvbiJdID0gZGVzY3JpcHRvcl8tPnZhbHVlKGkpLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJAamF2YS5sYW5nLkRlcHJlY2F0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiIjsKKyAgICBXcml0ZUVudW1WYWx1ZURvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8tPnZhbHVlKGkpKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgJHskJG5hbWUkX1ZBTFVFJH0kID0gIgorICAgICAgICAgICAgICAgICAgICIkbnVtYmVyJDtcbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXy0+dmFsdWUoaSkpOworICB9CisgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiXG4iCisgICAgICAicHVibGljIGZpbmFsIGludCBnZXROdW1iZXIoKSB7XG4iKTsKKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgaWYgKG9yZGluYWxfaXNfaW5kZXgpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIgIGlmICh0aGlzID09IFVOUkVDT0dOSVpFRCkge1xuIgorICAgICAgICAgICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXG4iCisgICAgICAgICAgIiAgICAgICAgXCJDYW4ndCBnZXQgdGhlIG51bWJlciBvZiBhbiB1bmtub3duIGVudW0gdmFsdWUuXCIpO1xuIgorICAgICAgICAgICIgIH1cbiIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiICBpZiAoaW5kZXggPT0gLTEpIHtcbiIKKyAgICAgICAgICAiICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFxuIgorICAgICAgICAgICIgICAgICAgIFwiQ2FuJ3QgZ2V0IHRoZSBudW1iZXIgb2YgYW4gdW5rbm93biBlbnVtIHZhbHVlLlwiKTtcbiIKKyAgICAgICAgICAiICB9XG4iKTsKKyAgICB9CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICByZXR1cm4gdmFsdWU7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgIi8qKlxuIgorICAgICAgIiAqIEBwYXJhbSB2YWx1ZSBUaGUgbnVtZXJpYyB3aXJlIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVudW0gIgorICAgICAgImVudHJ5LlxuIgorICAgICAgIiAqIEByZXR1cm4gVGhlIGVudW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBudW1lcmljIHdpcmUgdmFsdWUuXG4iCisgICAgICAiICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZm9yTnVtYmVyKGludCl9IGluc3RlYWQuXG4iCisgICAgICAiICovXG4iCisgICAgICAiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iCisgICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCB2YWx1ZU9mKGludCB2YWx1ZSkge1xuIgorICAgICAgIiAgcmV0dXJuIGZvck51bWJlcih2YWx1ZSk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgIi8qKlxuIgorICAgICAgIiAqIEBwYXJhbSB2YWx1ZSBUaGUgbnVtZXJpYyB3aXJlIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVudW0gIgorICAgICAgImVudHJ5LlxuIgorICAgICAgIiAqIEByZXR1cm4gVGhlIGVudW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBudW1lcmljIHdpcmUgdmFsdWUuXG4iCisgICAgICAiICovXG4iCisgICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBmb3JOdW1iZXIoaW50IHZhbHVlKSB7XG4iCisgICAgICAiICBzd2l0Y2ggKHZhbHVlKSB7XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYW5vbmljYWxfdmFsdWVzXy5zaXplKCk7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KCJjYXNlICRudW1iZXIkOiByZXR1cm4gJG5hbWUkO1xuIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbF92YWx1ZXNfW2ldLT5uYW1lKCksICJudW1iZXIiLAorICAgICAgICAgICAgICAgICAgIFN0ckNhdChjYW5vbmljYWxfdmFsdWVzX1tpXS0+bnVtYmVyKCkpKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICIgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgInB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5FbnVtTGl0ZU1hcDwkY2xhc3NuYW1lJD5cbiIKKyAgICAgICIgICAgaW50ZXJuYWxHZXRWYWx1ZU1hcCgpIHtcbiIKKyAgICAgICIgIHJldHVybiBpbnRlcm5hbFZhbHVlTWFwO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkVudW1MaXRlTWFwPFxuIgorICAgICAgIiAgICAkY2xhc3NuYW1lJD4gaW50ZXJuYWxWYWx1ZU1hcCA9XG4iCisgICAgICAiICAgICAgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bUxpdGVNYXA8JGNsYXNzbmFtZSQ+KCkge1xuIgorICAgICAgIiAgICAgICAgcHVibGljICRjbGFzc25hbWUkIGZpbmRWYWx1ZUJ5TnVtYmVyKGludCBudW1iZXIpIHtcbiIKKyAgICAgICIgICAgICAgICAgcmV0dXJuICRjbGFzc25hbWUkLmZvck51bWJlcihudW1iZXIpO1xuIgorICAgICAgIiAgICAgICAgfVxuIgorICAgICAgIiAgICAgIH07XG4iCisgICAgICAiXG4iLAorICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFJlZmxlY3Rpb24KKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8sIGNvbnRleHRfLT5FbmZvcmNlTGl0ZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvclxuIgorICAgICAgICAiICAgIGdldFZhbHVlRGVzY3JpcHRvcigpIHtcbiIpOworICAgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgICAgaWYgKG9yZGluYWxfaXNfaW5kZXgpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAiICBpZiAodGhpcyA9PSBVTlJFQ09HTklaRUQpIHtcbiIKKyAgICAgICAgICAgICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oXG4iCisgICAgICAgICAgICAiICAgICAgICBcIkNhbid0IGdldCB0aGUgZGVzY3JpcHRvciBvZiBhbiB1bnJlY29nbml6ZWQgZW51bSAiCisgICAgICAgICAgICAidmFsdWUuXCIpO1xuIgorICAgICAgICAgICAgIiAgfVxuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAgICIgIGlmIChpbmRleCA9PSAtMSkge1xuIgorICAgICAgICAgICAgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcbiIKKyAgICAgICAgICAgICIgICAgICAgIFwiQ2FuJ3QgZ2V0IHRoZSBkZXNjcmlwdG9yIG9mIGFuIHVucmVjb2duaXplZCBlbnVtICIKKyAgICAgICAgICAgICJ2YWx1ZS5cIik7XG4iCisgICAgICAgICAgICAiICB9XG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIHJldHVybiBnZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkuZ2V0KCRpbmRleF90ZXh0JCk7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJwdWJsaWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvclxuIgorICAgICAgICAiICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkge1xuIgorICAgICAgICAiICByZXR1cm4gZ2V0RGVzY3JpcHRvcigpO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1EZXNjcmlwdG9yXG4iCisgICAgICAgICIgICAgZ2V0RGVzY3JpcHRvcigpIHtcbiIsCisgICAgICAgICJpbmRleF90ZXh0IiwgaW5kZXhfdGV4dCk7CisKKyAgICAvLyBUT0RPKGtlbnRvbik6ICBDYWNoZSBzdGF0aWNhbGx5PyAgTm90ZSB0aGF0IHdlIGNhbid0IGFjY2VzcyBkZXNjcmlwdG9ycworICAgIC8vICAgYXQgbW9kdWxlIGluaXQgdGltZSBiZWNhdXNlIGl0IHdvdWxkbid0IHdvcmsgd2l0aCBkZXNjcmlwdG9yLnByb3RvLCBidXQKKyAgICAvLyAgIHdlIGNhbiBjYWNoZSB0aGUgdmFsdWUgdGhlIGZpcnN0IHRpbWUgZ2V0RGVzY3JpcHRvcigpIGlzIGNhbGxlZC4KKyAgICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpID09IE5VTEwpIHsKKyAgICAgIC8vIFRoZSBjbGFzcyBnZW5lcmF0ZWQgZm9yIHRoZSBGaWxlIGZ1bGx5IHBvcHVsYXRlcyB0aGUgZGVzY3JpcHRvciB3aXRoCisgICAgICAvLyBleHRlbnNpb25zIGluIGJvdGggdGhlIG11dGFibGUgYW5kIGltbXV0YWJsZSBjYXNlcy4gKEluIHRoZSBtdXRhYmxlIGFwaQorICAgICAgLy8gdGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgYXR0ZW1wdGluZyB0byBsb2FkIHRoZSBpbW11dGFibGUgb3V0ZXIgY2xhc3MpLgorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIiAgcmV0dXJuICRmaWxlJC5nZXREZXNjcmlwdG9yKCkuZ2V0RW51bVR5cGVzKCkuZ2V0KCRpbmRleCQpO1xuIiwKKyAgICAgICAgICAiZmlsZSIsCisgICAgICAgICAgbmFtZV9yZXNvbHZlcl8tPkdldENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpLCBpbW11dGFibGVfYXBpXyksCisgICAgICAgICAgImluZGV4IiwgU3RyQ2F0KGRlc2NyaXB0b3JfLT5pbmRleCgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIgIHJldHVybiAkcGFyZW50JC4kZGVzY3JpcHRvciQuZ2V0RW51bVR5cGVzKCkuZ2V0KCRpbmRleCQpO1xuIiwKKyAgICAgICAgICAicGFyZW50IiwKKyAgICAgICAgICBuYW1lX3Jlc29sdmVyXy0+R2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbXV0YWJsZV9hcGlfKSwKKyAgICAgICAgICAiZGVzY3JpcHRvciIsCisgICAgICAgICAgZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpCisgICAgICAgICAgICAgICAgICAtPm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKQorICAgICAgICAgICAgICA/ICJnZXREZWZhdWx0SW5zdGFuY2UoKS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpIgorICAgICAgICAgICAgICA6ICJnZXREZXNjcmlwdG9yKCkiLAorICAgICAgICAgICJpbmRleCIsIFN0ckNhdChkZXNjcmlwdG9yXy0+aW5kZXgoKSkpOworICAgIH0KKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAifVxuIgorICAgICAgICAiXG4iCisgICAgICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCAkY2xhc3NuYW1lJFtdIFZBTFVFUyA9ICIsCisgICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKworICAgIGlmIChDYW5Vc2VFbnVtVmFsdWVzKCkpIHsKKyAgICAgIC8vIElmIHRoZSBjb25zdGFudHMgd2UgYXJlIGdvaW5nIHRvIG91dHB1dCBhcmUgZXhhY3RseSB0aGUgb25lcyB3ZQorICAgICAgLy8gaGF2ZSBkZWNsYXJlZCBpbiB0aGUgSmF2YSBlbnVtIGluIHRoZSBzYW1lIG9yZGVyLCB0aGVuIHdlIGNhbiB1c2UKKyAgICAgIC8vIHRoZSB2YWx1ZXMoKSBtZXRob2QgdGhhdCB0aGUgSmF2YSBjb21waWxlciBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcworICAgICAgLy8gZm9yIGV2ZXJ5IGVudW0uCisgICAgICBwcmludGVyLT5QcmludCgidmFsdWVzKCk7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoImdldFN0YXRpY1ZhbHVlc0FycmF5KCk7XG4iKTsKKyAgICAgIHByaW50ZXItPlByaW50KCJwcml2YXRlIHN0YXRpYyAkY2xhc3NuYW1lJFtdIGdldFN0YXRpY1ZhbHVlc0FycmF5KCkge1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgInJldHVybiBuZXcgJGNsYXNzbmFtZSRbXSB7XG4iCisgICAgICAgICAgIiAgIiwKKyAgICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIiRuYW1lJCwgIiwgIm5hbWUiLCBkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm5hbWUoKSk7CisgICAgICB9CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiXG4iCisgICAgICAgICAgIn07XG4iKTsKKyAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgIHByaW50ZXItPlByaW50KCJ9Iik7CisgICAgfQorCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgdmFsdWVPZihcbiIKKyAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgZGVzYykge1xuIgorICAgICAgICAiICBpZiAoZGVzYy5nZXRUeXBlKCkgIT0gZ2V0RGVzY3JpcHRvcigpKSB7XG4iCisgICAgICAgICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXG4iCisgICAgICAgICIgICAgICBcIkVudW1WYWx1ZURlc2NyaXB0b3IgaXMgbm90IGZvciB0aGlzIHR5cGUuXCIpO1xuIgorICAgICAgICAiICB9XG4iLAorICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgICAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiICBpZiAoZGVzYy5nZXRJbmRleCgpID09IC0xKSB7XG4iCisgICAgICAgICAgIiAgICByZXR1cm4gVU5SRUNPR05JWkVEO1xuIgorICAgICAgICAgICIgIH1cbiIpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiAgcmV0dXJuIFZBTFVFU1tkZXNjLmdldEluZGV4KCldO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiXG4iKTsKKworICAgIGlmICghb3JkaW5hbF9pc19pbmRleCkgeworICAgICAgcHJpbnRlci0+UHJpbnQoInByaXZhdGUgZmluYWwgaW50IGluZGV4O1xuIik7CisgICAgfQorICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBwcmludGVyLT5QcmludCgicHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7XG5cbiIpOworCisgIGlmIChvcmRpbmFsX2lzX2luZGV4KSB7CisgICAgcHJpbnRlci0+UHJpbnQoInByaXZhdGUgJGNsYXNzbmFtZSQoaW50IHZhbHVlKSB7XG4iLCAiY2xhc3NuYW1lIiwKKyAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgicHJpdmF0ZSAkY2xhc3NuYW1lJChpbnQgaW5kZXgsIGludCB2YWx1ZSkge1xuIiwgImNsYXNzbmFtZSIsCisgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgIH0KKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLCBjb250ZXh0Xy0+RW5mb3JjZUxpdGUoKSkgJiYKKyAgICAgICFvcmRpbmFsX2lzX2luZGV4KSB7CisgICAgcHJpbnRlci0+UHJpbnQoIiAgdGhpcy5pbmRleCA9IGluZGV4O1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICB0aGlzLnZhbHVlID0gdmFsdWU7XG4iCisgICAgICAifVxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiXG4iCisgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGVudW1fc2NvcGU6JGZ1bGxfbmFtZSQpXG4iLAorICAgICAgImZ1bGxfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKK30KKworYm9vbCBFbnVtR2VuZXJhdG9yOjpDYW5Vc2VFbnVtVmFsdWVzKCkgeworICBpZiAoY2Fub25pY2FsX3ZhbHVlc18uc2l6ZSgpICE9IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCk7IGkrKykgeworICAgIGlmIChkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm5hbWUoKSAhPSBjYW5vbmljYWxfdmFsdWVzX1tpXS0+bmFtZSgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMmMzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bS5oCkBAIC0wLDAgKzEsMTAwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRU5VTV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRU5VTV9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKK2NsYXNzIENvbnRleHQ7ICAgICAgICAgICAgLy8gY29udGV4dC5oCitjbGFzcyBDbGFzc05hbWVSZXNvbHZlcjsgIC8vIG5hbWVfcmVzb2x2ZXIuaAorfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorbmFtZXNwYWNlIGlvIHsKK2NsYXNzIFByaW50ZXI7ICAvLyBwcmludGVyLmgKK30KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitjbGFzcyBFbnVtR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIEVudW1HZW5lcmF0b3IoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGJvb2wgaW1tdXRhYmxlX2FwaSwKKyAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KTsKKyAgfkVudW1HZW5lcmF0b3IoKTsKKworICB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworIHByaXZhdGU6CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKworICAvLyBUaGUgcHJvdG8gbGFuZ3VhZ2UgYWxsb3dzIG11bHRpcGxlIGVudW0gY29uc3RhbnRzIHRvIGhhdmUgdGhlIHNhbWUKKyAgLy8gbnVtZXJpYyB2YWx1ZS4gIEphdmEsIGhvd2V2ZXIsIGRvZXMgbm90IGFsbG93IG11bHRpcGxlIGVudW0gY29uc3RhbnRzIHRvCisgIC8vIGJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudC4gIFdlIHRyZWF0IHRoZSBmaXJzdCBkZWZpbmVkIGNvbnN0YW50IGZvciBhbnkKKyAgLy8gZ2l2ZW4gbnVtZXJpYyB2YWx1ZSBhcyAiY2Fub25pY2FsIiBhbmQgdGhlIHJlc3QgYXMgYWxpYXNlcyBvZiB0aGF0CisgIC8vIGNhbm9uaWNhbCB2YWx1ZS4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcio+IGNhbm9uaWNhbF92YWx1ZXNfOworCisgIHN0cnVjdCBBbGlhcyB7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWU7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogY2Fub25pY2FsX3ZhbHVlOworICB9OworICBzdGQ6OnZlY3RvcjxBbGlhcz4gYWxpYXNlc187CisKKyAgYm9vbCBpbW11dGFibGVfYXBpXzsKKworICBDb250ZXh0KiBjb250ZXh0XzsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXJfOworCisgIGJvb2wgQ2FuVXNlRW51bVZhbHVlcygpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFbnVtR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VOVU1fSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bV9maWVsZC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOGEyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bV9maWVsZC5jYwpAQCAtMCwwICsxLDExNTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGQuaD4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZV9yZXNvbHZlci5oPgorCisvLyBNdXN0IGJlIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworbmFtZXNwYWNlIHsKKwordm9pZCBTZXRFbnVtVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LCBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzKSB7CisgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIGluZm8sIHZhcmlhYmxlcyk7CisKKyAgKCp2YXJpYWJsZXMpWyJ0eXBlIl0gPQorICAgICAgbmFtZV9yZXNvbHZlci0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPmVudW1fdHlwZSgpKTsKKyAgKCp2YXJpYWJsZXMpWyJrdF90eXBlIl0gPSAoKnZhcmlhYmxlcylbInR5cGUiXTsKKyAgKCp2YXJpYWJsZXMpWyJtdXRhYmxlX3R5cGUiXSA9CisgICAgICBuYW1lX3Jlc29sdmVyLT5HZXRNdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPmVudW1fdHlwZSgpKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBJbW11dGFibGVEZWZhdWx0VmFsdWUoZGVzY3JpcHRvciwgbmFtZV9yZXNvbHZlcik7CisgICgqdmFyaWFibGVzKVsiZGVmYXVsdF9udW1iZXIiXSA9CisgICAgICBTdHJDYXQoZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV9lbnVtKCktPm51bWJlcigpKTsKKyAgKCp2YXJpYWJsZXMpWyJ0YWciXSA9IFN0ckNhdCgKKyAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGludGVybmFsOjpXaXJlRm9ybWF0OjpNYWtlVGFnKGRlc2NyaXB0b3IpKSk7CisgICgqdmFyaWFibGVzKVsidGFnX3NpemUiXSA9IFN0ckNhdCgKKyAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0OjpUYWdTaXplKGRlc2NyaXB0b3ItPm51bWJlcigpLCBHZXRUeXBlKGRlc2NyaXB0b3IpKSk7CisgIC8vIFRPRE8oYmlyZG8pOiBBZGQgQGRlcHJlY2F0ZWQgamF2YWRvYyB3aGVuIGdlbmVyYXRpbmcgamF2YWRvYyBpcyBzdXBwb3J0ZWQKKyAgLy8gYnkgdGhlIHByb3RvIGNvbXBpbGVyCisgICgqdmFyaWFibGVzKVsiZGVwcmVjYXRpb24iXSA9CisgICAgICBkZXNjcmlwdG9yLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpID8gIkBqYXZhLmxhbmcuRGVwcmVjYXRlZCAiIDogIiI7CisgICgqdmFyaWFibGVzKVsia3RfZGVwcmVjYXRpb24iXSA9CisgICAgICBkZXNjcmlwdG9yLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpCisgICAgICAgICAgPyAiQGtvdGxpbi5EZXByZWNhdGVkKG1lc3NhZ2UgPSBcIkZpZWxkICIgKyAoKnZhcmlhYmxlcylbIm5hbWUiXSArCisgICAgICAgICAgICAgICAgIiBpcyBkZXByZWNhdGVkXCIpICIKKyAgICAgICAgICA6ICIiOworICAoKnZhcmlhYmxlcylbIm9uX2NoYW5nZWQiXSA9ICJvbkNoYW5nZWQoKTsiOworICAvLyBVc2UgZGVwcmVjYXRlZCB2YWx1ZU9mKCkgbWV0aG9kIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvbGQgZ2VuZXJhdGVkIGNvZGUKKyAgLy8gZm9yIHYyLjUuMC92Mi42LjEuCisgIC8vIFRPRE8oeGlhb2ZlbmcpOiBVc2UgImZvck51bWJlciIgd2hlbiB3ZSBubyBsb25nZXIgc3VwcG9ydCBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggdjIuNS4wL3YyLjYuMSwgYW5kIHJlbW92ZSB0aGUgQFN1cHByZXNzV2FybmluZ3MgYW5ub3RhdGlvbnMuCisgICgqdmFyaWFibGVzKVsiZm9yX251bWJlciJdID0gInZhbHVlT2YiOworCisgIGlmIChIYXNIYXNiaXQoZGVzY3JpcHRvcikpIHsKKyAgICAvLyBGb3Igc2luZ3VsYXIgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHRoZSBoYXNGaWVsZCBiaXQuCisgICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworICAgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKKworICAgIC8vIE5vdGUgdGhhdCB0aGVzZSBoYXZlIGEgdHJhaWxpbmcgIjsiLgorICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0KKyAgICAgICAgR2VuZXJhdGVTZXRCaXQobWVzc2FnZUJpdEluZGV4KSArICI7IjsKKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9CisgICAgICAgIEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCkgKyAiOyI7CisgICAgKCp2YXJpYWJsZXMpWyJjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9CisgICAgICAgIEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KSArICI7IjsKKworICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworICB9IGVsc2UgeworICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0gIiI7CisgICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSAiIjsKKyAgICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gIiI7CisKKyAgICAoKnZhcmlhYmxlcylbImlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSJdID0KKyAgICAgICAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gKyAiXyAhPSAiICsgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gKworICAgICAgICAiLmdldE51bWJlcigpIjsKKyAgfQorCisgIC8vIEZvciByZXBlYXRlZCBidWlsZGVycywgb25lIGJpdCBpcyB1c2VkIGZvciB3aGV0aGVyIHRoZSBhcnJheSBpcyBpbW11dGFibGUuCisgICgqdmFyaWFibGVzKVsiZ2V0X211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlR2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsiY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVDbGVhckJpdChidWlsZGVyQml0SW5kZXgpOworCisgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfZnJvbV9sb2NhbCJdID0KKyAgICAgIEdlbmVyYXRlR2V0Qml0RnJvbUxvY2FsKGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfdG9fbG9jYWwiXSA9CisgICAgICBHZW5lcmF0ZVNldEJpdFRvTG9jYWwobWVzc2FnZUJpdEluZGV4KTsKKworICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvci0+ZmlsZSgpKSkgeworICAgICgqdmFyaWFibGVzKVsidW5rbm93biJdID0gKCp2YXJpYWJsZXMpWyJ0eXBlIl0gKyAiLlVOUkVDT0dOSVpFRCI7CisgIH0gZWxzZSB7CisgICAgKCp2YXJpYWJsZXMpWyJ1bmtub3duIl0gPSAoKnZhcmlhYmxlcylbImRlZmF1bHQiXTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgQ29udGV4dCogY29udGV4dCkKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgeworICBTZXRFbnVtVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yKSwgbmFtZV9yZXNvbHZlcl8sCisgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlc18pOworfQorCitJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6On5JbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IoKSB7fQorCitpbnQgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEhhc0hhc2JpdChkZXNjcmlwdG9yXykgPyAxIDogMDsKK30KKworaW50IEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CisgIHJldHVybiBHZXROdW1CaXRzRm9yTWVzc2FnZSgpOworfQorCit2b2lkIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChIYXNIYXp6ZXIoZGVzY3JpcHRvcl8pKSB7CisgICAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgSEFaWkVSKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworICB9CisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIFdyaXRlRmllbGRFbnVtVmFsdWVBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEdFVFRFUik7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSgpO1xuIik7CisgIH0KKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRkZXByZWNhdGlvbiQkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAicHJpdmF0ZSBpbnQgJG5hbWUkXztcbiIpOworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBpZiAoSGFzSGF6emVyKGRlc2NyaXB0b3JfKSkgeworICAgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZSAkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gIgorICAgICAgICAgICAgICAgICAgICIkeyRoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgfQorICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRW51bVZhbHVlQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGUgJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgIgorICAgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgfQorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZSAkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAiCisgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIEBTdXBwcmVzc1dhcm5pbmdzKFwiZGVwcmVjYXRpb25cIilcbiIKKyAgICAgICAgICAgICAgICAgIiAgJHR5cGUkIHJlc3VsdCA9ICR0eXBlJC4kZm9yX251bWJlciQoJG5hbWUkXyk7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICR1bmtub3duJCA6IHJlc3VsdDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworfQorCit2b2lkIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAicHJpdmF0ZSBpbnQgJG5hbWUkXyA9ICRkZWZhdWx0X251bWJlciQ7XG4iKTsKKyAgaWYgKEhhc0hhenplcihkZXNjcmlwdG9yXykpIHsKKyAgICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGUgJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuICIKKyAgICAgICAgICAgICAgICAgICAiJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlICRkZXByZWNhdGlvbiRwdWJsaWMgaW50ICIKKyAgICAgICAgICAgICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgIgorICAgICAgICAgICAgICAgICAgICIkeyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSR9JChpbnQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgQFN1cHByZXNzV2FybmluZ3MoXCJkZXByZWNhdGlvblwiKVxuIgorICAgICAgICAgICAgICAgICAiICAkdHlwZSQgcmVzdWx0ID0gJHR5cGUkLiRmb3JfbnVtYmVyJCgkbmFtZSRfKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gJHVua25vd24kIDogcmVzdWx0O1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIFNFVFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgIiR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXyA9IHZhbHVlLmdldE51bWJlcigpO1xuIgorICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgIiAgJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKKyAgICAgICIgICRuYW1lJF8gPSAkZGVmYXVsdF9udW1iZXIkO1xuIgorICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKK30KKwordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlS290bGluRHNsTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIka3RfZGVwcmVjYXRpb24kIHZhciAka3RfbmFtZSQ6ICRrdF90eXBlJFxuIgorICAgICAgICAgICAgICAgICAiICBASnZtTmFtZShcIiR7JGdldCRrdF9jYXBpdGFsaXplZF9uYW1lJCR9JFwiKVxuIgorICAgICAgICAgICAgICAgICAiICBnZXQoKSA9ICRrdF9kc2xfYnVpbGRlciQuJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKClcbiIKKyAgICAgICAgICAgICAgICAgIiAgQEp2bU5hbWUoXCIkeyRzZXQka3RfY2FwaXRhbGl6ZWRfbmFtZSQkfSRcIilcbiIKKyAgICAgICAgICAgICAgICAgIiAgc2V0KHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgJGt0X2RzbF9idWlsZGVyJC4keyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQodmFsdWUpXG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIpOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIENMRUFSRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyBmYWxzZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJmdW4gJHskY2xlYXIka3RfY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICRrdF9kc2xfYnVpbGRlciQuJHskY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKVxuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisKKyAgaWYgKEhhc0hhenplcihkZXNjcmlwdG9yXykpIHsKKyAgICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiZnVuICR7JGhhcyRrdF9jYXBpdGFsaXplZF9uYW1lJCR9JCgpOiBrb3RsaW4uQm9vbGVhbiB7XG4iCisgICAgICAgICIgIHJldHVybiAka3RfZHNsX2J1aWxkZXIkLiR7JGhhcyRjYXBpdGFsaXplZF9uYW1lJCR9JCgpXG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQorfQorCit2b2lkIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gbm9vcCBmb3IgZW51bXMKK30KKwordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGRlZmF1bHRfbnVtYmVyJDtcbiIpOworfQorCit2b2lkIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkbmFtZSRfID0gJGRlZmF1bHRfbnVtYmVyJDtcbiIKKyAgICAgICAgICAgICAgICAgIiRjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iKTsKK30KKwordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVyZ2luZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKEhhc0hhenplcihkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJpZiAob3RoZXIuaGFzJGNhcGl0YWxpemVkX25hbWUkKCkpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiaWYgKG90aGVyLiRuYW1lJF8gIT0gJGRlZmF1bHRfbnVtYmVyJCkge1xuIgorICAgICAgICAiICBzZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZShvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSgpKTtcbiIKKyAgICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCByZWFjaCBoZXJlLiI7CisgIH0KK30KKwordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChIYXNIYXp6ZXIoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsJCkge1xuIgorICAgICAgICAgICAgICAgICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF90b19sb2NhbCQ7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIiRuYW1lJF8gPSBpbnB1dC5yZWFkRW51bSgpO1xuIgorICAgICAgICAgICAgICAgICAgICIkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgImludCB0bXBSYXcgPSBpbnB1dC5yZWFkRW51bSgpO1xuIgorICAgICAgICAgICAgICAgICAgICIkdHlwZSQgdG1wVmFsdWUgPVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgJHR5cGUkLmZvck51bWJlcih0bXBSYXcpO1xuIgorICAgICAgICAgICAgICAgICAgICJpZiAodG1wVmFsdWUgPT0gbnVsbCkge1xuIgorICAgICAgICAgICAgICAgICAgICIgIG1lcmdlVW5rbm93blZhcmludEZpZWxkKCRudW1iZXIkLCB0bXBSYXcpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9IGVsc2Uge1xuIgorICAgICAgICAgICAgICAgICAgICIgICRuYW1lJF8gPSB0bXBSYXc7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJpZiAoJGlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgb3V0cHV0LndyaXRlRW51bSgkbnVtYmVyJCwgJG5hbWUkXyk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJpZiAoJGlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtXG4iCisgICAgICAgICAgICAgICAgICIgICAgLmNvbXB1dGVFbnVtU2l6ZSgkbnVtYmVyJCwgJG5hbWUkXyk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRXF1YWxzQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiaWYgKCRuYW1lJF8gIT0gb3RoZXIuJG5hbWUkXykgcmV0dXJuIGZhbHNlO1xuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJoYXNoID0gKDM3ICogaGFzaCkgKyAkY29uc3RhbnRfbmFtZSQ7XG4iCisgICAgICAgICAgICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyAkbmFtZSRfO1xuIik7Cit9CisKK3N0ZDo6c3RyaW5nIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZW51bV90eXBlKCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjpJbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgQ29udGV4dCogY29udGV4dCkKKyAgICA6IEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KSB7CisgIGNvbnN0IE9uZW9mR2VuZXJhdG9ySW5mbyogaW5mbyA9CisgICAgICBjb250ZXh0LT5HZXRPbmVvZkdlbmVyYXRvckluZm8oZGVzY3JpcHRvci0+Y29udGFpbmluZ19vbmVvZigpKTsKKyAgU2V0Q29tbW9uT25lb2ZWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgJnZhcmlhYmxlc18pOworfQorCitJbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcjo6fkltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBJbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7CisgIEdPT0dMRV9EQ0hFQ0soSGFzSGF6emVyKGRlc2NyaXB0b3JfKSk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50ICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlJH0kKCkge1xuIgorICAgICAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAgICIgICAgcmV0dXJuIChqYXZhLmxhbmcuSW50ZWdlcikgJG9uZW9mX25hbWUkXztcbiIKKyAgICAgICAgIiAgfVxuIgorICAgICAgICAiICByZXR1cm4gJGRlZmF1bHRfbnVtYmVyJDtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICAgICAgICAgICAgICAiICAgIEBTdXBwcmVzc1dhcm5pbmdzKFwiZGVwcmVjYXRpb25cIilcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkdHlwZSQgcmVzdWx0ID0gJHR5cGUkLiRmb3JfbnVtYmVyJChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgKGphdmEubGFuZy5JbnRlZ2VyKSAkb25lb2ZfbmFtZSRfKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyAkdW5rbm93biQgOiByZXN1bHQ7XG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRkZWZhdWx0JDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworfQorCit2b2lkIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0soSGFzSGF6emVyKGRlc2NyaXB0b3JfKSk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50ICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlJH0kKCkge1xuIgorICAgICAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAgICIgICAgcmV0dXJuICgoamF2YS5sYW5nLkludGVnZXIpICRvbmVvZl9uYW1lJF8pLmludFZhbHVlKCk7XG4iCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIiAgcmV0dXJuICRkZWZhdWx0X251bWJlciQ7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGRFbnVtVmFsdWVBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIFNFVFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgICAiJHskc2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUkfSQoaW50IHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAgICIgICRvbmVvZl9uYW1lJF8gPSB2YWx1ZTtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgfQorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgQFN1cHByZXNzV2FybmluZ3MoXCJkZXByZWNhdGlvblwiKVxuIgorICAgICAgICAgICAgICAgICAiICAgICR0eXBlJCByZXN1bHQgPSAkdHlwZSQuJGZvcl9udW1iZXIkKFxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICAoamF2YS5sYW5nLkludGVnZXIpICRvbmVvZl9uYW1lJF8pO1xuIgorICAgICAgICAgICAgICAgICAiICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICR1bmtub3duJCA6IHJlc3VsdDtcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJGRlZmF1bHQkO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIFNFVFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgIiR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAiICAkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAgICAgICAgICAgICIgICRvbmVvZl9uYW1lJF8gPSB2YWx1ZS5nZXROdW1iZXIoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIENMRUFSRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICIgICAgJGNsZWFyX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAiICAgICRvbmVvZl9uYW1lJF8gPSBudWxsO1xuIgorICAgICAgIiAgICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworfQorCit2b2lkIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gTm8tb3A6IEVudW0gZmllbGRzIGluIG9uZW9mcyBhcmUgY29ycmVjdGx5IGNsZWFyZWQgYnkgY2xlYXJpbmcgdGhlIG9uZW9mCit9CisKK3ZvaWQgSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJlc3VsdC4kb25lb2ZfbmFtZSRfID0gJG9uZW9mX25hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAic2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoKSk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJzZXQkY2FwaXRhbGl6ZWRfbmFtZSQob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7CisgIH0KK30KKwordm9pZCBJbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyUGFyc2luZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiaW50IHJhd1ZhbHVlID0gaW5wdXQucmVhZEVudW0oKTtcbiIKKyAgICAgICAgICAgICAgICAgICAiJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAgICIkb25lb2ZfbmFtZSRfID0gcmF3VmFsdWU7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpO1xuIgorICAgICAgICAgICAgICAgICAgICIkdHlwZSQgdmFsdWUgPVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgJHR5cGUkLmZvck51bWJlcihyYXdWYWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICAgImlmICh2YWx1ZSA9PSBudWxsKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgbWVyZ2VVbmtub3duVmFyaW50RmllbGQoJG51bWJlciQsIHJhd1ZhbHVlKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifSBlbHNlIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgJG9uZW9mX25hbWUkXyA9IHJhd1ZhbHVlO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgfQorfQorCit2b2lkIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAiICBvdXRwdXQud3JpdGVFbnVtKCRudW1iZXIkLCAoKGphdmEubGFuZy5JbnRlZ2VyKSAkb25lb2ZfbmFtZSRfKSk7XG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAgICIgICAgLmNvbXB1dGVFbnVtU2l6ZSgkbnVtYmVyJCwgKChqYXZhLmxhbmcuSW50ZWdlcikgJG9uZW9mX25hbWUkXykpO1xuIgorICAgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUVxdWFsc0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJpZiAoZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoKVxuIgorICAgICAgICAiICAgICE9IG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKCkpIHJldHVybiBmYWxzZTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiaWYgKCFnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKVxuIgorICAgICAgICAiICAgIC5lcXVhbHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpKSByZXR1cm4gZmFsc2U7XG4iKTsKKyAgfQorfQorCit2b2lkIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUhhc2hDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgImhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIKKyAgICAgICAgICAgICAgICAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoKTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiaGFzaCA9ICgzNyAqIGhhc2gpICsgJGNvbnN0YW50X25hbWUkO1xuIgorICAgICAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkuZ2V0TnVtYmVyKCk7XG4iKTsKKyAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjpSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgQ29udGV4dCogY29udGV4dCkKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgeworICBTZXRFbnVtVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yKSwgbmFtZV9yZXNvbHZlcl8sCisgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlc18pOworfQorCitSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yKCkge30KKworaW50IFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CisgIHJldHVybiAxOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9HRVRURVIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJGphdmEudXRpbC5MaXN0PCR0eXBlJD4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpO1xuIik7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfQ09VTlQpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpO1xuIik7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfSU5ERVhFRF9HRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KTtcbiIpOworICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRW51bVZhbHVlQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0dFVFRFUik7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5JbnRlZ2VyPlxuIgorICAgICAgICAgICAgICAgICAgICJnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZUxpc3QoKTtcbiIpOworICAgIFdyaXRlRmllbGRFbnVtVmFsdWVBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNUX0lOREVYRURfR0VUVEVSKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKGludCBpbmRleCk7XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgInByaXZhdGUgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLkludGVnZXI+ICRuYW1lJF87XG4iCisgICAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgIgorICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuTGlzdEFkYXB0ZXIuQ29udmVydGVyPFxuIgorICAgICAgIiAgICBqYXZhLmxhbmcuSW50ZWdlciwgJHR5cGUkPiAkbmFtZSRfY29udmVydGVyXyA9XG4iCisgICAgICAiICAgICAgICBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5MaXN0QWRhcHRlci5Db252ZXJ0ZXI8XG4iCisgICAgICAiICAgICAgICAgICAgamF2YS5sYW5nLkludGVnZXIsICR0eXBlJD4oKSB7XG4iCisgICAgICAiICAgICAgICAgIHB1YmxpYyAkdHlwZSQgY29udmVydChqYXZhLmxhbmcuSW50ZWdlciBmcm9tKSB7XG4iCisgICAgICAiICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoXCJkZXByZWNhdGlvblwiKVxuIgorICAgICAgIiAgICAgICAgICAgICR0eXBlJCByZXN1bHQgPSAkdHlwZSQuJGZvcl9udW1iZXIkKGZyb20pO1xuIgorICAgICAgIiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICR1bmtub3duJCA6IHJlc3VsdDtcbiIKKyAgICAgICIgICAgICAgICAgfVxuIgorICAgICAgIiAgICAgICAgfTtcbiIpOworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+ICIKKyAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0JH0kKCkge1xuIgorICAgICAgIiAgcmV0dXJuIG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkxpc3RBZGFwdGVyPFxuIgorICAgICAgIiAgICAgIGphdmEubGFuZy5JbnRlZ2VyLCAkdHlwZSQ+KCRuYW1lJF8sICRuYW1lJF9jb252ZXJ0ZXJfKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9DT1VOVCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQkfSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfSU5ERVhFRF9HRVRURVIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JChpbnQgaW5kZXgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRfY29udmVydGVyXy5jb252ZXJ0KCRuYW1lJF8uZ2V0KGluZGV4KSk7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIFdyaXRlRmllbGRFbnVtVmFsdWVBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfR0VUVEVSKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLkludGVnZXI+XG4iCisgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlTGlzdCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRW51bVZhbHVlQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElTVF9JTkRFWEVEX0dFVFRFUik7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCAiCisgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlJH0kKGludCBpbmRleCkge1xuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiAkbmFtZSRfLmdldChpbmRleCk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInByaXZhdGUgaW50ICRuYW1lJE1lbW9pemVkU2VyaWFsaXplZFNpemU7XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgIC8vIE9uZSBmaWVsZCBpcyB0aGUgbGlzdCBhbmQgdGhlIG90aGVyIGZpZWxkIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlCisgICAgICAvLyBsaXN0IGlzIGltbXV0YWJsZS4gSWYgaXQncyBpbW11dGFibGUsIHRoZSBpbnZhcmlhbnQgaXMgdGhhdCBpdCBtdXN0CisgICAgICAvLyBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgb3IgaXQncyBhbiBBcnJheUxpc3QKKyAgICAgIC8vIHdyYXBwZWQgaW4gYSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCkgd3JhcHBlciBhbmQgbm9ib2R5IGVsc2UgaGFzCisgICAgICAvLyBhIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBBcnJheUxpc3QuIFRoaXMgaW52YXJpYW50IGFsbG93cyB1cyB0bworICAgICAgLy8gc2hhcmUgaW5zdGFuY2VzIG9mIGxpc3RzIGJldHdlZW4gcHJvdG9jb2wgYnVmZmVycyBhdm9pZGluZyBleHBlbnNpdmUKKyAgICAgIC8vIG1lbW9yeSBhbGxvY2F0aW9ucy4gTm90ZSwgaW1tdXRhYmxlIGlzIGEgc3Ryb25nIGd1YXJhbnRlZSBoZXJlIC0tIG5vdAorICAgICAgLy8ganVzdCB0aGF0IHRoZSBsaXN0IGNhbm5vdCBiZSBtb2RpZmllZCB2aWEgdGhlIHJlZmVyZW5jZSBidXQgdGhhdCB0aGUKKyAgICAgIC8vIGxpc3QgY2FuIG5ldmVyIGJlIG1vZGlmaWVkLgorICAgICAgInByaXZhdGUgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLkludGVnZXI+ICRuYW1lJF8gPVxuIgorICAgICAgIiAgamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIgorCisgICAgICAicHJpdmF0ZSB2b2lkIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpIHtcbiIKKyAgICAgICIgIGlmICghJGdldF9tdXRhYmxlX2JpdF9idWlsZGVyJCkge1xuIgorICAgICAgIiAgICAkbmFtZSRfID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8amF2YS5sYW5nLkludGVnZXI+KCRuYW1lJF8pO1xuIgorICAgICAgIiAgICAkc2V0X211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIpOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgLy8gTm90ZTogIFdlIHJldHVybiBhbiB1bm1vZGlmaWFibGUgbGlzdCBiZWNhdXNlIG90aGVyd2lzZSB0aGUgY2FsbGVyCisgICAgICAvLyAgIGNvdWxkIGhvbGQgb24gdG8gdGhlIHJldHVybmVkIGxpc3QgYW5kIG1vZGlmeSBpdCBhZnRlciB0aGUgbWVzc2FnZQorICAgICAgLy8gICBoYXMgYmVlbiBidWlsdCwgdGh1cyBtdXRhdGluZyB0aGUgbWVzc2FnZSB3aGljaCBpcyBzdXBwb3NlZCB0byBiZQorICAgICAgLy8gICBpbW11dGFibGUuCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+ICIKKyAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0JH0kKCkge1xuIgorICAgICAgIiAgcmV0dXJuIG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkxpc3RBZGFwdGVyPFxuIgorICAgICAgIiAgICAgIGphdmEubGFuZy5JbnRlZ2VyLCAkdHlwZSQ+KCRuYW1lJF8sICRuYW1lJF9jb252ZXJ0ZXJfKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9DT1VOVCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCR9JCgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRfLnNpemUoKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9JTkRFWEVEX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoaW50IGluZGV4KSB7XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkX2NvbnZlcnRlcl8uY29udmVydCgkbmFtZSRfLmdldChpbmRleCkpO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0lOREVYRURfU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7XG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgICRuYW1lJF8uc2V0KGluZGV4LCB2YWx1ZS5nZXROdW1iZXIoKSk7XG4iCisgICAgICAgICAgICAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgIgorICAgICAgICAgICAgICAgICAiJHskYWRkJGNhcGl0YWxpemVkX25hbWUkJH0kKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiICBpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICAgICAgICAgICAgICAiICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgorICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICAkbmFtZSRfLmFkZCh2YWx1ZS5nZXROdW1iZXIoKSk7XG4iCisgICAgICAgICAgICAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX01VTFRJX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskYWRkQWxsJGNhcGl0YWxpemVkX25hbWUkJH0kKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGphdmEubGFuZy5JdGVyYWJsZTw/IGV4dGVuZHMgJHR5cGUkPiB2YWx1ZXMpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgIGZvciAoJHR5cGUkIHZhbHVlIDogdmFsdWVzKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgJG5hbWUkXy5hZGQodmFsdWUuZ2V0TnVtYmVyKCkpO1xuIgorICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAiICAkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIgorICAgICAgIiAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRW51bVZhbHVlQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0dFVFRFUik7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuSW50ZWdlcj5cbiIKKyAgICAgICAgICAgICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWVMaXN0JH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRW51bVZhbHVlQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElTVF9JTkRFWEVEX0dFVFRFUik7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgIgorICAgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSR9JChpbnQgaW5kZXgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGRFbnVtVmFsdWVBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNUX0lOREVYRURfU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSR9JChcbiIKKyAgICAgICAgIiAgICBpbnQgaW5kZXgsIGludCB2YWx1ZSkge1xuIgorICAgICAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICAgIiAgJG5hbWUkXy5zZXQoaW5kZXgsIHZhbHVlKTtcbiIKKyAgICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRW51bVZhbHVlQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgIgorICAgICAgICAgICAgICAgICAgICIkeyRhZGQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSR9JChpbnQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkbmFtZSRfLmFkZCh2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RfTVVMVElfQURERVIsIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskYWRkQWxsJGNhcGl0YWxpemVkX25hbWUkVmFsdWUkfSQoXG4iCisgICAgICAgICIgICAgamF2YS5sYW5nLkl0ZXJhYmxlPGphdmEubGFuZy5JbnRlZ2VyPiB2YWx1ZXMpIHtcbiIKKyAgICAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgICAgICIgIGZvciAoaW50IHZhbHVlIDogdmFsdWVzKSB7XG4iCisgICAgICAgICIgICAgJG5hbWUkXy5hZGQodmFsdWUpO1xuIgorICAgICAgICAiICB9XG4iCisgICAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6CisgICAgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gbm9vcCBmb3IgZW51bXMKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIgorICAgICAgICAgICAgICAgICAiJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVyZ2luZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gVGhlIGNvZGUgYmVsb3cgZG9lcyB0d28gb3B0aW1pemF0aW9uczoKKyAgLy8gICAxLiBJZiB0aGUgb3RoZXIgbGlzdCBpcyBlbXB0eSwgdGhlcmUncyBub3RoaW5nIHRvIGRvLiBUaGlzIGVuc3VyZXMgd2UKKyAgLy8gICAgICBkb24ndCBhbGxvY2F0ZSBhIG5ldyBhcnJheSBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gaW1tdXRhYmxlIG9uZS4KKyAgLy8gICAyLiBJZiB0aGUgb3RoZXIgbGlzdCBpcyBub24tZW1wdHkgYW5kIG91ciBjdXJyZW50IGxpc3QgaXMgZW1wdHksIHdlIGNhbgorICAvLyAgICAgIHJldXNlIHRoZSBvdGhlciBsaXN0IHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgaW1tdXRhYmxlLgorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiaWYgKCFvdGhlci4kbmFtZSRfLmlzRW1wdHkoKSkge1xuIgorICAgICAgICAgICAgICAgICAiICBpZiAoJG5hbWUkXy5pc0VtcHR5KCkpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkbmFtZSRfID0gb3RoZXIuJG5hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgICAgICAgICAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgICAgJG5hbWUkXy5hZGRBbGwob3RoZXIuJG5hbWUkXyk7XG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGluZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gVGhlIGNvZGUgYmVsb3cgZW5zdXJlcyB0aGF0IHRoZSByZXN1bHQgaGFzIGFuIGltbXV0YWJsZSBsaXN0LiBJZiBvdXIKKyAgLy8gbGlzdCBpcyBpbW11dGFibGUsIHdlIGNhbiBqdXN0IHJldXNlIGl0LiBJZiBub3QsIHdlIG1ha2UgaXQgaW1tdXRhYmxlLgorICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiaWYgKCRnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQpIHtcbiIKKyAgICAgICIgICRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKKyAgICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicmVzdWx0LiRuYW1lJF8gPSAkbmFtZSRfO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFJlYWQgYW5kIHN0b3JlIHRoZSBlbnVtCisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgImludCB0bXBSYXcgPSBpbnB1dC5yZWFkRW51bSgpO1xuIgorICAgICAgICAgICAgICAgICAgICJlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgICAiJG5hbWUkXy5hZGQodG1wUmF3KTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgImludCB0bXBSYXcgPSBpbnB1dC5yZWFkRW51bSgpO1xuIgorICAgICAgICAgICAgICAgICAgICIkdHlwZSQgdG1wVmFsdWUgPVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgJHR5cGUkLmZvck51bWJlcih0bXBSYXcpO1xuIgorICAgICAgICAgICAgICAgICAgICJpZiAodG1wVmFsdWUgPT0gbnVsbCkge1xuIgorICAgICAgICAgICAgICAgICAgICIgIG1lcmdlVW5rbm93blZhcmludEZpZWxkKCRudW1iZXIkLCB0bXBSYXcpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9IGVsc2Uge1xuIgorICAgICAgICAgICAgICAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAgICIgICRuYW1lJF8uYWRkKHRtcFJhdyk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlRnJvbVBhY2tlZCgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBXcmFwIEdlbmVyYXRlUGFyc2luZ0NvZGUncyBjb250ZW50cyB3aXRoIGEgd2hpbGUgbG9vcC4KKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiaW50IGxlbmd0aCA9IGlucHV0LnJlYWRSYXdWYXJpbnQzMigpO1xuIgorICAgICAgICAgICAgICAgICAiaW50IG9sZExpbWl0ID0gaW5wdXQucHVzaExpbWl0KGxlbmd0aCk7XG4iCisgICAgICAgICAgICAgICAgICJ3aGlsZShpbnB1dC5nZXRCeXRlc1VudGlsTGltaXQoKSA+IDApIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nQ29kZShwcmludGVyKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAgICAgICJpbnB1dC5wb3BMaW1pdChvbGRMaW1pdCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiaWYgKGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5zaXplKCkgPiAwKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgb3V0cHV0LndyaXRlVUludDMyTm9UYWcoJHRhZyQpO1xuIgorICAgICAgICAgICAgICAgICAgICIgIG91dHB1dC53cml0ZVVJbnQzMk5vVGFnKCRuYW1lJE1lbW9pemVkU2VyaWFsaXplZFNpemUpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAgICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgorICAgICAgICAgICAgICAgICAgICIgIG91dHB1dC53cml0ZUVudW1Ob1RhZygkbmFtZSRfLmdldChpKSk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgorICAgICAgICAgICAgICAgICAgICIgIG91dHB1dC53cml0ZUVudW0oJG51bWJlciQsICRuYW1lJF8uZ2V0KGkpKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICAgIiAgaW50IGRhdGFTaXplID0gMDtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGRhdGFTaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAgICAgICAgICAgICAgIiAgICAuY29tcHV0ZUVudW1TaXplTm9UYWcoJG5hbWUkXy5nZXQoaSkpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPlByaW50KCJzaXplICs9IGRhdGFTaXplO1xuIik7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJpZiAoIWdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5pc0VtcHR5KCkpIHsiCisgICAgICAgICAgICAgICAgICAgIiAgc2l6ZSArPSAkdGFnX3NpemUkO1xuIgorICAgICAgICAgICAgICAgICAgICIgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgLmNvbXB1dGVVSW50MzJTaXplTm9UYWcoZGF0YVNpemUpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9Iik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInNpemUgKz0gJHRhZ19zaXplJCAqICRuYW1lJF8uc2l6ZSgpO1xuIik7CisgIH0KKworICAvLyBjYWNoZSB0aGUgZGF0YSBzaXplIGZvciBwYWNrZWQgZmllbGRzLgorICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTtcbiIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRXF1YWxzQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiaWYgKCEkbmFtZSRfLmVxdWFscyhvdGhlci4kbmFtZSRfKSkgcmV0dXJuIGZhbHNlO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlSGFzaENvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpID4gMCkge1xuIgorICAgICAgICAgICAgICAgICAiICBoYXNoID0gKDM3ICogaGFzaCkgKyAkY29uc3RhbnRfbmFtZSQ7XG4iCisgICAgICAgICAgICAgICAgICIgIGhhc2ggPSAoNTMgKiBoYXNoKSArICRuYW1lJF8uaGFzaENvZGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIi8qKlxuIgorICAgICAgIiAqIEFuIHVuaW5zdGFudGlhYmxlLCBiZWhhdmlvcmxlc3MgdHlwZSB0byByZXByZXNlbnQgdGhlIGZpZWxkIGluXG4iCisgICAgICAiICogZ2VuZXJpY3MuXG4iCisgICAgICAiICovXG4iCisgICAgICAiQGtvdGxpbi5PcHRJbiIKKyAgICAgICIoY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uT25seUZvclVzZUJ5R2VuZXJhdGVkUHJvdG9Db2RlOjpjbGFzcylcbiIKKyAgICAgICJjbGFzcyAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JCBwcml2YXRlIGNvbnN0cnVjdG9yKCkiCisgICAgICAiIDogY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsUHJveHkoKVxuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGt0X2RlcHJlY2F0aW9uJCB2YWwgJGt0X25hbWUkOiAiCisgICAgICAgICAgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xMaXN0IgorICAgICAgICAgICAgICAgICAiPCRrdF90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+XG4iCisgICAgICAgICAgICAgICAgICIgIEBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAiICBnZXQoKSA9IGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QoXG4iCisgICAgICAgICAgICAgICAgICIgICAgJGt0X2RzbF9idWlsZGVyJC4keyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0JH0kKClcbiIKKyAgICAgICAgICAgICAgICAgIiAgKVxuIik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcImFkZCRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgICAgICAgICAgICAiZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAgICAgICAgICAgICI8JGt0X3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD4uIgorICAgICAgICAgICAgICAgICAiYWRkKHZhbHVlOiAka3RfdHlwZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJGt0X2RzbF9idWlsZGVyJC4keyRhZGQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQodmFsdWUpXG4iCisgICAgICAgICAgICAgICAgICJ9Iik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcInBsdXNBc3NpZ24ka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICAgICAgICAgICAgIkBTdXBwcmVzcyhcIk5PVEhJTkdfVE9fSU5MSU5FXCIpXG4iCisgICAgICAgICAgICAgICAgICJpbmxpbmUgb3BlcmF0b3IgZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAgICAgICAgICAgICI8JGt0X3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD4uIgorICAgICAgICAgICAgICAgICAicGx1c0Fzc2lnbih2YWx1ZTogJGt0X3R5cGUkKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGFkZCh2YWx1ZSlcbiIKKyAgICAgICAgICAgICAgICAgIn0iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX01VTFRJX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwiYWRkQWxsJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAgICAgICAgICAgICJmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAgICAgICAgICAgICJhZGRBbGwodmFsdWVzOiBrb3RsaW4uY29sbGVjdGlvbnMuSXRlcmFibGU8JGt0X3R5cGUkPikge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJCR9JCh2YWx1ZXMpXG4iCisgICAgICAgICAgICAgICAgICJ9Iik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9NVUxUSV9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIkBrb3RsaW4uanZtLkp2bU5hbWUoXCJwbHVzQXNzaWduQWxsJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAiQFN1cHByZXNzKFwiTk9USElOR19UT19JTkxJTkVcIilcbiIKKyAgICAgICJpbmxpbmUgb3BlcmF0b3IgZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAiPCRrdF90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICJwbHVzQXNzaWduKHZhbHVlczoga290bGluLmNvbGxlY3Rpb25zLkl0ZXJhYmxlPCRrdF90eXBlJD4pIHtcbiIKKyAgICAgICIgIGFkZEFsbCh2YWx1ZXMpXG4iCisgICAgICAifSIpOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfSU5ERVhFRF9TRVRURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyBmYWxzZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwic2V0JGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAib3BlcmF0b3IgZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAiPCRrdF90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICJzZXQoaW5kZXg6IGtvdGxpbi5JbnQsIHZhbHVlOiAka3RfdHlwZSQpIHtcbiIKKyAgICAgICIgICRrdF9kc2xfYnVpbGRlciQuJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKGluZGV4LCB2YWx1ZSlcbiIKKyAgICAgICJ9Iik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcImNsZWFyJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAgICAgICAgICAgICJmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAgICAgICAgICAgICJjbGVhcigpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJGt0X2RzbF9idWlsZGVyJC4keyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpXG4iCisgICAgICAgICAgICAgICAgICJ9Iik7Cit9CisKK3N0ZDo6c3RyaW5nIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjpHZXRCb3hlZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5lbnVtX3R5cGUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGQuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5ZWU5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtX2ZpZWxkLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9FTlVNX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9FTlVNX0ZJRUxEX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CitjbGFzcyBDb250ZXh0OyAgICAgICAgICAgIC8vIGNvbnRleHQuaAorY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7ICAvLyBuYW1lX3Jlc29sdmVyLmgKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitjbGFzcyBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KTsKKyAgfkltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IG92ZXJyaWRlOworICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcmlhYmxlc187CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IpOworfTsKKworY2xhc3MgSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCk7CisgIH5JbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3IpOworfTsKKworY2xhc3MgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKKyAgflJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gaW1wbGVtZW50cyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50IEdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludCBHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlRnJvbVBhY2tlZCgKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJpYWJsZXNfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VOVU1fRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bV9maWVsZF9saXRlLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGRfbGl0ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmU2ODNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGRfbGl0ZS5jYwpAQCAtMCwwICsxLDkyMyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bV9maWVsZF9saXRlLmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL25hbWVfcmVzb2x2ZXIuaD4KKworLy8gTXVzdCBiZSBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK25hbWVzcGFjZSB7Citib29sIEVuYWJsZUV4cGVyaW1lbnRhbFJ1bnRpbWVGb3JMaXRlKCkgeworI2lmZGVmIFBST1RPQlVGX0VYUEVSSU1FTlQKKyAgcmV0dXJuIFBST1RPQlVGX0VYUEVSSU1FTlQ7CisjZWxzZSAgIC8vIFBST1RPQlVGX0VYUEVSSU1FTlQKKyAgcmV0dXJuIGZhbHNlOworI2VuZGlmICAvLyAhUFJPVE9CVUZfRVhQRVJJTUVOVAorfQorCit2b2lkIFNldEVudW1WYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgdmFyaWFibGVzKTsKKworICAoKnZhcmlhYmxlcylbInR5cGUiXSA9CisgICAgICBuYW1lX3Jlc29sdmVyLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvci0+ZW51bV90eXBlKCkpOworICAoKnZhcmlhYmxlcylbImt0X3R5cGUiXSA9ICgqdmFyaWFibGVzKVsidHlwZSJdOworICAoKnZhcmlhYmxlcylbIm11dGFibGVfdHlwZSJdID0KKyAgICAgIG5hbWVfcmVzb2x2ZXItPkdldE11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvci0+ZW51bV90eXBlKCkpOworICAoKnZhcmlhYmxlcylbImRlZmF1bHQiXSA9IEltbXV0YWJsZURlZmF1bHRWYWx1ZShkZXNjcmlwdG9yLCBuYW1lX3Jlc29sdmVyKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X251bWJlciJdID0KKyAgICAgIFN0ckNhdChkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX2VudW0oKS0+bnVtYmVyKCkpOworICAoKnZhcmlhYmxlcylbInRhZyJdID0gU3RyQ2F0KAorICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaW50ZXJuYWw6OldpcmVGb3JtYXQ6Ok1ha2VUYWcoZGVzY3JpcHRvcikpKTsKKyAgKCp2YXJpYWJsZXMpWyJ0YWdfc2l6ZSJdID0gU3RyQ2F0KAorICAgICAgaW50ZXJuYWw6OldpcmVGb3JtYXQ6OlRhZ1NpemUoZGVzY3JpcHRvci0+bnVtYmVyKCksIEdldFR5cGUoZGVzY3JpcHRvcikpKTsKKyAgLy8gVE9ETyhiaXJkbyk6IEFkZCBAZGVwcmVjYXRlZCBqYXZhZG9jIHdoZW4gZ2VuZXJhdGluZyBqYXZhZG9jIGlzIHN1cHBvcnRlZAorICAvLyBieSB0aGUgcHJvdG8gY29tcGlsZXIKKyAgKCp2YXJpYWJsZXMpWyJkZXByZWNhdGlvbiJdID0KKyAgICAgIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkICIgOiAiIjsKKyAgKCp2YXJpYWJsZXMpWyJrdF9kZXByZWNhdGlvbiJdID0KKyAgICAgIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkKKyAgICAgICAgICA/ICJAa290bGluLkRlcHJlY2F0ZWQobWVzc2FnZSA9IFwiRmllbGQgIiArICgqdmFyaWFibGVzKVsibmFtZSJdICsKKyAgICAgICAgICAgICAgICAiIGlzIGRlcHJlY2F0ZWRcIikgIgorICAgICAgICAgIDogIiI7CisgICgqdmFyaWFibGVzKVsicmVxdWlyZWQiXSA9IGRlc2NyaXB0b3ItPmlzX3JlcXVpcmVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworCisgIGlmIChIYXNIYXNiaXQoZGVzY3JpcHRvcikpIHsKKyAgICAvLyBGb3Igc2luZ3VsYXIgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHRoZSBoYXNGaWVsZCBiaXQuCisgICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworCisgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGhhdmUgYSB0cmFpbGluZyAiOyIuCisgICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPQorICAgICAgICBHZW5lcmF0ZVNldEJpdChtZXNzYWdlQml0SW5kZXgpICsgIjsiOworICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPQorICAgICAgICBHZW5lcmF0ZUNsZWFyQml0KG1lc3NhZ2VCaXRJbmRleCkgKyAiOyI7CisKKyAgICAoKnZhcmlhYmxlcylbImlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSJdID0gR2VuZXJhdGVHZXRCaXQobWVzc2FnZUJpdEluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9ICIiOworICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSAiIjsKKworICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPQorICAgICAgICAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfICE9ICIgKyAoKnZhcmlhYmxlcylbImRlZmF1bHQiXSArCisgICAgICAgICIuZ2V0TnVtYmVyKCkiOworICB9CisKKyAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsIl0gPQorICAgICAgR2VuZXJhdGVHZXRCaXRGcm9tTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF90b19sb2NhbCJdID0KKyAgICAgIEdlbmVyYXRlU2V0Qml0VG9Mb2NhbChtZXNzYWdlQml0SW5kZXgpOworCisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yLT5maWxlKCkpKSB7CisgICAgKCp2YXJpYWJsZXMpWyJ1bmtub3duIl0gPSAoKnZhcmlhYmxlcylbInR5cGUiXSArICIuVU5SRUNPR05JWkVEIjsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbInVua25vd24iXSA9ICgqdmFyaWFibGVzKVsiZGVmYXVsdCJdOworICB9CisKKyAgLy8gV2UgdXNlIGB4LmdldENsYXNzKClgIGFzIGEgbnVsbCBjaGVjayBiZWNhdXNlIGl0IGdlbmVyYXRlcyBsZXNzIGJ5dGVjb2RlCisgIC8vIHRoYW4gYW4gYGlmICh4ID09IG51bGwpIHsgdGhyb3cgLi4uIH1gIHN0YXRlbWVudC4KKyAgKCp2YXJpYWJsZXMpWyJudWxsX2NoZWNrIl0gPSAidmFsdWUuZ2V0Q2xhc3MoKTtcbiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ltbXV0YWJsZUVudW1GaWVsZExpdGVHZW5lcmF0b3I6OkltbXV0YWJsZUVudW1GaWVsZExpdGVHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCisgICAgICBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCisgICAgICBjb250ZXh0Xyhjb250ZXh0KSwKKyAgICAgIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7CisgIFNldEVudW1WYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCAwLAorICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yKSwgbmFtZV9yZXNvbHZlcl8sCisgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlc18pOworfQorCitJbW11dGFibGVFbnVtRmllbGRMaXRlR2VuZXJhdG9yOjp+SW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcigpIHt9CisKK2ludCBJbW11dGFibGVFbnVtRmllbGRMaXRlR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEhhc0hhc2JpdChkZXNjcmlwdG9yXykgPyAxIDogMDsKK30KKwordm9pZCBJbW11dGFibGVFbnVtRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKEhhc0hhenplcihkZXNjcmlwdG9yXykpIHsKKyAgICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisgIH0KKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKCk7XG4iKTsKKyAgfQorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJGRlcHJlY2F0aW9uJCR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworfQorCit2b2lkIEltbXV0YWJsZUVudW1GaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAicHJpdmF0ZSBpbnQgJG5hbWUkXztcbiIpOworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBpZiAoSGFzSGF6emVyKGRlc2NyaXB0b3JfKSkgeworICAgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAiICByZXR1cm4gJGdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkO1xuIgorICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgfQorICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRW51bVZhbHVlQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUkfSQoKSB7XG4iCisgICAgICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgfQorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICAkdHlwZSQgcmVzdWx0ID0gJHR5cGUkLmZvck51bWJlcigkbmFtZSRfKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gJHVua25vd24kIDogcmVzdWx0O1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgLy8gR2VuZXJhdGUgcHJpdmF0ZSBzZXR0ZXJzIGZvciB0aGUgYnVpbGRlciB0byBwcm94eSBpbnRvLgorICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRW51bVZhbHVlQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBTRVRURVIpOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBzZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZShpbnQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQiCisgICAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgfQorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBTRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2lkIHNldCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXyA9IHZhbHVlLmdldE51bWJlcigpO1xuIgorICAgICAgICAgICAgICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSRcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJGNsZWFyX2hhc19maWVsZF9iaXRfbWVzc2FnZSRcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXyA9ICRkZWZhdWx0X251bWJlciQ7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVFbnVtRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChIYXNIYXp6ZXIoZGVzY3JpcHRvcl8pKSB7CisgICAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgSEFaWkVSKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiAkeyRoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICIgIHJldHVybiBpbnN0YW5jZS5oYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50ICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlJH0kKCkge1xuIgorICAgICAgICAiICByZXR1cm4gaW5zdGFuY2UuZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoKTtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgIgorICAgICAgICAgICAgICAgICAgICIkeyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSR9JChpbnQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICAgICAgICAgICIgIGluc3RhbmNlLnNldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKHZhbHVlKTtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgfQorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gaW5zdGFuY2UuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgIgorICAgICAgICAgICAgICAgICAiJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICBpbnN0YW5jZS5zZXQkY2FwaXRhbGl6ZWRfbmFtZSQodmFsdWUpO1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgIiAgaW5zdGFuY2UuY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworfQorCit2b2lkIEltbXV0YWJsZUVudW1GaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlS290bGluRHNsTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIka3RfZGVwcmVjYXRpb24kdmFyICRrdF9uYW1lJDogJGt0X3R5cGUkXG4iCisgICAgICAgICAgICAgICAgICIgIEBKdm1OYW1lKFwiJHskZ2V0JGt0X2NhcGl0YWxpemVkX25hbWUkJH0kXCIpXG4iCisgICAgICAgICAgICAgICAgICIgIGdldCgpID0gJGt0X2RzbF9idWlsZGVyJC4keyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKVxuIgorICAgICAgICAgICAgICAgICAiICBASnZtTmFtZShcIiR7JHNldCRrdF9jYXBpdGFsaXplZF9uYW1lJCR9JFwiKVxuIgorICAgICAgICAgICAgICAgICAiICBzZXQodmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAka3RfZHNsX2J1aWxkZXIkLiR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JCh2YWx1ZSlcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImZ1biAkeyRjbGVhciRrdF9jYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJGt0X2RzbF9idWlsZGVyJC4keyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpXG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICBpZiAoSGFzSGF6emVyKGRlc2NyaXB0b3JfKSkgeworICAgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJmdW4gJHskaGFzJGt0X2NhcGl0YWxpemVkX25hbWUkJH0kKCk6IGtvdGxpbi5Cb29sZWFuIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRrdF9kc2xfYnVpbGRlciQuJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKClcbiIKKyAgICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgSW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKCFJc0RlZmF1bHRWYWx1ZUphdmFEZWZhdWx0KGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGRlZmF1bHRfbnVtYmVyJDtcbiIpOworICB9Cit9CisKK3ZvaWQgSW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVGaWVsZEluZm8oCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCB7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShkZXNjcmlwdG9yXy0+bnVtYmVyKCksIG91dHB1dCk7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShHZXRFeHBlcmltZW50YWxKYXZhRmllbGRUeXBlKGRlc2NyaXB0b3JfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisgIGlmIChIYXNIYXNiaXQoZGVzY3JpcHRvcl8pKSB7CisgICAgV3JpdGVJbnRUb1V0ZjE2Q2hhclNlcXVlbmNlKG1lc3NhZ2VCaXRJbmRleF8sIG91dHB1dCk7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIlwiJG5hbWUkX1wiLFxuIik7CisgIGlmICghU3VwcG9ydFVua25vd25FbnVtVmFsdWUoKGRlc2NyaXB0b3JfKSkpIHsKKyAgICBQcmludEVudW1WZXJpZmllckxvZ2ljKHByaW50ZXIsIGRlc2NyaXB0b3JfLCB2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp2YXJfbmFtZT0qLyIkdHlwZSQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0ZXJtaW5hdGluZ19zdHJpbmc9Ki8iLFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5mb3JjZV9saXRlPSovY29udGV4dF8tPkVuZm9yY2VMaXRlKCkpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIEltbXV0YWJsZUVudW1GaWVsZExpdGVHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbW11dGFibGVFbnVtT25lb2ZGaWVsZExpdGVHZW5lcmF0b3I6OkltbXV0YWJsZUVudW1PbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsIENvbnRleHQqIGNvbnRleHQpCisgICAgOiBJbW11dGFibGVFbnVtRmllbGRMaXRlR2VuZXJhdG9yKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgY29udGV4dCkgeworICBjb25zdCBPbmVvZkdlbmVyYXRvckluZm8qIGluZm8gPQorICAgICAgY29udGV4dC0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfb25lb2YoKSk7CisgIFNldENvbW1vbk9uZW9mVmFyaWFibGVzKGRlc2NyaXB0b3IsIGluZm8sICZ2YXJpYWJsZXNfKTsKK30KKworSW1tdXRhYmxlRW51bU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yOjp+SW1tdXRhYmxlRW51bU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yKCkge30KKwordm9pZCBJbW11dGFibGVFbnVtT25lb2ZGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBHT09HTEVfRENIRUNLKEhhc0hhenplcihkZXNjcmlwdG9yXykpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuICR7JGhhcyRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIFdyaXRlRmllbGRFbnVtVmFsdWVBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEdFVFRFUik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSR9JCgpIHtcbiIKKyAgICAgICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICAgICAiICAgIHJldHVybiAoamF2YS5sYW5nLkludGVnZXIpICRvbmVvZl9uYW1lJF87XG4iCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIiAgcmV0dXJuICRkZWZhdWx0X251bWJlciQ7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICB9CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEdFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkdHlwZSQgcmVzdWx0ID0gJHR5cGUkLmZvck51bWJlcigoamF2YS5sYW5nLkludGVnZXIpICIKKyAgICAgICAgICAgICAgICAgIiRvbmVvZl9uYW1lJF8pO1xuIgorICAgICAgICAgICAgICAgICAiICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICR1bmtub3duJCA6IHJlc3VsdDtcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJGRlZmF1bHQkO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgLy8gR2VuZXJhdGUgcHJpdmF0ZSBzZXR0ZXJzIGZvciB0aGUgYnVpbGRlciB0byBwcm94eSBpbnRvLgorICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRW51bVZhbHVlQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBTRVRURVIpOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBzZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZShpbnQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgJG9uZW9mX25hbWUkXyA9IHZhbHVlO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgfQorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBTRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2lkIHNldCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG9uZW9mX25hbWUkXyA9IHZhbHVlLmdldE51bWJlcigpO1xuIgorICAgICAgICAgICAgICAgICAiICAkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJwcml2YXRlIHZvaWQgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkY2xlYXJfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkb25lb2ZfbmFtZSRfID0gbnVsbDtcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlRW51bU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUZpZWxkSW5mbygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgc3RkOjp2ZWN0b3I8dWludDE2X3Q+KiBvdXRwdXQpIGNvbnN0IHsKKyAgV3JpdGVJbnRUb1V0ZjE2Q2hhclNlcXVlbmNlKGRlc2NyaXB0b3JfLT5udW1iZXIoKSwgb3V0cHV0KTsKKyAgV3JpdGVJbnRUb1V0ZjE2Q2hhclNlcXVlbmNlKEdldEV4cGVyaW1lbnRhbEphdmFGaWVsZFR5cGUoZGVzY3JpcHRvcl8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KTsKKyAgV3JpdGVJbnRUb1V0ZjE2Q2hhclNlcXVlbmNlKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX29uZW9mKCktPmluZGV4KCksIG91dHB1dCk7CisgIGlmICghU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8pKSB7CisgICAgUHJpbnRFbnVtVmVyaWZpZXJMb2dpYyhwcmludGVyLCBkZXNjcmlwdG9yXywgdmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdmFyX25hbWU9Ki8iJHR5cGUkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGVybWluYXRpbmdfc3RyaW5nPSovIixcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZm9yY2VfbGl0ZT0qL2NvbnRleHRfLT5FbmZvcmNlTGl0ZSgpKTsKKyAgfQorfQorCit2b2lkIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBHT09HTEVfRENIRUNLKEhhc0hhenplcihkZXNjcmlwdG9yXykpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuICR7JGhhcyRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGluc3RhbmNlLmhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50ICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlJH0kKCkge1xuIgorICAgICAgICAiICByZXR1cm4gaW5zdGFuY2UuZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoKTtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgIgorICAgICAgICAgICAgICAgICAgICIkeyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSR9JChpbnQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICAgICAgICAgICIgIGluc3RhbmNlLnNldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKHZhbHVlKTtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgfQorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gaW5zdGFuY2UuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgIgorICAgICAgICAgICAgICAgICAiJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICBpbnN0YW5jZS5zZXQkY2FwaXRhbGl6ZWRfbmFtZSQodmFsdWUpO1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgIiAgaW5zdGFuY2UuY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcjo6CisgICAgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRMaXRlR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCkKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgICAgY29udGV4dF8oY29udGV4dCksCisgICAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgeworICBTZXRFbnVtVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgMCwKKyAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZGVzY3JpcHRvciksIG5hbWVfcmVzb2x2ZXJfLAorICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZXNfKTsKK30KKworUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRMaXRlR2VuZXJhdG9yOjoKKyAgICB+UmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRMaXRlR2VuZXJhdG9yKCkge30KKworaW50IFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCB7CisgIHJldHVybiAwOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+IGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKTtcbiIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0NPVU5UKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKTtcbiIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0lOREVYRURfR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiQkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCk7XG4iKTsKKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9HRVRURVIpOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuSW50ZWdlcj5cbiIKKyAgICAgICAgICAgICAgICAgICAiZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWVMaXN0KCk7XG4iKTsKKyAgICBXcml0ZUZpZWxkRW51bVZhbHVlQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElTVF9JTkRFWEVEX0dFVFRFUik7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZShpbnQgaW5kZXgpO1xuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkludExpc3QgJG5hbWUkXztcbiIKKyAgICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCAiCisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5MaXN0QWRhcHRlci5Db252ZXJ0ZXI8XG4iCisgICAgICAiICAgIGphdmEubGFuZy5JbnRlZ2VyLCAkdHlwZSQ+ICRuYW1lJF9jb252ZXJ0ZXJfID1cbiIKKyAgICAgICIgICAgICAgIG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkxpc3RBZGFwdGVyLkNvbnZlcnRlcjxcbiIKKyAgICAgICIgICAgICAgICAgICBqYXZhLmxhbmcuSW50ZWdlciwgJHR5cGUkPigpIHtcbiIKKyAgICAgICIgICAgICAgICAgQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgIiAgICAgICAgICBwdWJsaWMgJHR5cGUkIGNvbnZlcnQoamF2YS5sYW5nLkludGVnZXIgZnJvbSkge1xuIgorICAgICAgIiAgICAgICAgICAgICR0eXBlJCByZXN1bHQgPSAkdHlwZSQuZm9yTnVtYmVyKGZyb20pO1xuIgorICAgICAgIiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICR1bmtub3duJCA6IHJlc3VsdDtcbiIKKyAgICAgICIgICAgICAgICAgfVxuIgorICAgICAgIiAgICAgICAgfTtcbiIpOworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+ICIKKyAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0JH0kKCkge1xuIgorICAgICAgIiAgcmV0dXJuIG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkxpc3RBZGFwdGVyPFxuIgorICAgICAgIiAgICAgIGphdmEubGFuZy5JbnRlZ2VyLCAkdHlwZSQ+KCRuYW1lJF8sICRuYW1lJF9jb252ZXJ0ZXJfKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9DT1VOVCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQkfSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfSU5ERVhFRF9HRVRURVIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAvLyBOQjogRG8gbm90IHVzZSB0aGUgIiRuYW1lJF9jb252ZXJ0ZXJfIiBmaWVsZDsgdGhlIHVzYWdlIG9mIGdlbmVyaWNzCisgICAgICAvLyAoYW5kIHJlcXVpc2l0ZSB1cGNhc3RzIHRvIE9iamVjdCkgcHJldmVudCBvcHRpbWl6YXRpb25zLiAgRXZlbgorICAgICAgLy8gd2l0aG91dCBhbnkgb3B0aW1pemF0aW9ucywgdGhlIGJlbG93IGNvZGUgaXMgY2hlYXBlciBiZWNhdXNlIGl0CisgICAgICAvLyBhdm9pZHMgYm94aW5nIGFuIGludCBhbmQgYSBjaGVja2Nhc3QgZnJvbSB0aGUgZ2VuZXJpY3MuCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JChpbnQgaW5kZXgpIHtcbiIKKyAgICAgICIgICR0eXBlJCByZXN1bHQgPSAkdHlwZSQuZm9yTnVtYmVyKCRuYW1lJF8uZ2V0SW50KGluZGV4KSk7XG4iCisgICAgICAiICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyAkdW5rbm93biQgOiByZXN1bHQ7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIFdyaXRlRmllbGRFbnVtVmFsdWVBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfR0VUVEVSKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLkludGVnZXI+XG4iCisgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlTGlzdCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRW51bVZhbHVlQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElTVF9JTkRFWEVEX0dFVFRFUik7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCAiCisgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlJH0kKGludCBpbmRleCkge1xuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiAkbmFtZSRfLmdldEludChpbmRleCk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KKworICBpZiAoIUVuYWJsZUV4cGVyaW1lbnRhbFJ1bnRpbWVGb3JMaXRlKCkgJiYgZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpICYmCisgICAgICBjb250ZXh0Xy0+SGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInByaXZhdGUgaW50ICRuYW1lJE1lbW9pemVkU2VyaWFsaXplZFNpemU7XG4iKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHByaXZhdGUgc2V0dGVycyBmb3IgdGhlIGJ1aWxkZXIgdG8gcHJveHkgaW50by4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgInByaXZhdGUgdm9pZCBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKSB7XG4iCisgICAgICAvLyBVc2UgYSB0ZW1wb3JhcnkgdG8gYXZvaWQgYSByZWR1bmRhbnQgaWdldC1vYmplY3QuCisgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkludExpc3QgdG1wID0gJG5hbWUkXztcbiIKKyAgICAgICIgIGlmICghdG1wLmlzTW9kaWZpYWJsZSgpKSB7XG4iCisgICAgICAiICAgICRuYW1lJF8gPVxuIgorICAgICAgIiAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5tdXRhYmxlQ29weSh0bXApO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0lOREVYRURfU0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG51bGxfY2hlY2skIgorICAgICAgICAgICAgICAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXy5zZXRJbnQoaW5kZXgsIHZhbHVlLmdldE51bWJlcigpKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0FEREVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICRudWxsX2NoZWNrJCIKKyAgICAgICAgICAgICAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgICRuYW1lJF8uYWRkSW50KHZhbHVlLmdldE51bWJlcigpKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX01VTFRJX0FEREVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBhZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgamF2YS5sYW5nLkl0ZXJhYmxlPD8gZXh0ZW5kcyAkdHlwZSQ+IHZhbHVlcykge1xuIgorICAgICAgICAgICAgICAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgZm9yICgkdHlwZSQgdmFsdWUgOiB2YWx1ZXMpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkbmFtZSRfLmFkZEludCh2YWx1ZS5nZXROdW1iZXIoKSk7XG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXyA9IGVtcHR5SW50TGlzdCgpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisKKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgU0VUVEVSKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJwcml2YXRlIHZvaWQgc2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBpbnQgaW5kZXgsIGludCB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAgICIgICRuYW1lJF8uc2V0SW50KGluZGV4LCB2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIFdyaXRlRmllbGRFbnVtVmFsdWVBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfQURERVIpOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBhZGQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZShpbnQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkbmFtZSRfLmFkZEludCh2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIFdyaXRlRmllbGRFbnVtVmFsdWVBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNUX01VTFRJX0FEREVSKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJwcml2YXRlIHZvaWQgYWRkQWxsJGNhcGl0YWxpemVkX25hbWUkVmFsdWUoXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBqYXZhLmxhbmcuSXRlcmFibGU8amF2YS5sYW5nLkludGVnZXI+IHZhbHVlcykge1xuIgorICAgICAgICAgICAgICAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAgICIgIGZvciAoaW50IHZhbHVlIDogdmFsdWVzKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAkbmFtZSRfLmFkZEludCh2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVGaWVsZEluZm8oCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCB7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShkZXNjcmlwdG9yXy0+bnVtYmVyKCksIG91dHB1dCk7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShHZXRFeHBlcmltZW50YWxKYXZhRmllbGRUeXBlKGRlc2NyaXB0b3JfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJcIiRuYW1lJF9cIixcbiIpOworICBpZiAoIVN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgUHJpbnRFbnVtVmVyaWZpZXJMb2dpYyhwcmludGVyLCBkZXNjcmlwdG9yXywgdmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdmFyX25hbWU9Ki8iJHR5cGUkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGVybWluYXRpbmdfc3RyaW5nPSovIixcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZm9yY2VfbGl0ZT0qL2NvbnRleHRfLT5FbmZvcmNlTGl0ZSgpKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gIgorICAgICAgICAgICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGluc3RhbmNlLmdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0NPVU5UKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCR9JCgpIHtcbiIKKyAgICAgICIgIHJldHVybiBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0lOREVYRURfR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoaW50IGluZGV4KSB7XG4iCisgICAgICAiICByZXR1cm4gaW5zdGFuY2UuZ2V0JGNhcGl0YWxpemVkX25hbWUkKGluZGV4KTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9JTkRFWEVEX1NFVFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICBpbnN0YW5jZS5zZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW5kZXgsIHZhbHVlKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgIiR7JGFkZCRjYXBpdGFsaXplZF9uYW1lJCR9JCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaW5zdGFuY2UuYWRkJGNhcGl0YWxpemVkX25hbWUkKHZhbHVlKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9NVUxUSV9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBqYXZhLmxhbmcuSXRlcmFibGU8PyBleHRlbmRzICR0eXBlJD4gdmFsdWVzKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGNvcHlPbldyaXRlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgIGluc3RhbmNlLmFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJCh2YWx1ZXMpOyIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICIgIGluc3RhbmNlLmNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCisgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRW51bVZhbHVlQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0dFVFRFUik7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5JbnRlZ2VyPlxuIgorICAgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZUxpc3QkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KFxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZUxpc3QoKSk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RfSU5ERVhFRF9HRVRURVIpOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgIgorICAgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSR9JChpbnQgaW5kZXgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gaW5zdGFuY2UuZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoaW5kZXgpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGRFbnVtVmFsdWVBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNUX0lOREVYRURfU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSR9JChcbiIKKyAgICAgICAgIiAgICBpbnQgaW5kZXgsIGludCB2YWx1ZSkge1xuIgorICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAiICBpbnN0YW5jZS5zZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZShpbmRleCwgdmFsdWUpO1xuIgorICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZEVudW1WYWx1ZUFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgICAiJHskYWRkJGNhcGl0YWxpemVkX25hbWUkVmFsdWUkfSQoaW50IHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgaW5zdGFuY2UuYWRkJGNhcGl0YWxpemVkX25hbWUkVmFsdWUodmFsdWUpO1xuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGRFbnVtVmFsdWVBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNUX01VTFRJX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRhZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSR9JChcbiIKKyAgICAgICAgIiAgICBqYXZhLmxhbmcuSXRlcmFibGU8amF2YS5sYW5nLkludGVnZXI+IHZhbHVlcykge1xuIgorICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAiICBpbnN0YW5jZS5hZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSh2YWx1ZXMpO1xuIgorICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gZW1wdHlJbnRMaXN0KCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlS290bGluRHNsTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiLyoqXG4iCisgICAgICAiICogQW4gdW5pbnN0YW50aWFibGUsIGJlaGF2aW9ybGVzcyB0eXBlIHRvIHJlcHJlc2VudCB0aGUgZmllbGQgaW5cbiIKKyAgICAgICIgKiBnZW5lcmljcy5cbiIKKyAgICAgICIgKi9cbiIKKyAgICAgICJAa290bGluLk9wdEluIgorICAgICAgIihjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Pbmx5Rm9yVXNlQnlHZW5lcmF0ZWRQcm90b0NvZGU6OmNsYXNzKVxuIgorICAgICAgImNsYXNzICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kIHByaXZhdGUgY29uc3RydWN0b3IoKSIKKyAgICAgICIgOiBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xQcm94eSgpXG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIka3RfZGVwcmVjYXRpb24kIHZhbCAka3RfbmFtZSQ6ICIKKyAgICAgICAgICAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAgICAgICAgICAgICI8JGt0X3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD5cbiIKKyAgICAgICAgICAgICAgICAgIiAgQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICIgIGdldCgpID0gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAka3RfZHNsX2J1aWxkZXIkLiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QkfSQoKVxuIgorICAgICAgICAgICAgICAgICAiICApXG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwiYWRkJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAgICAgICAgICAgICJmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAgICAgICAgICAgICJhZGQodmFsdWU6ICRrdF90eXBlJCkge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGFkZCRjYXBpdGFsaXplZF9uYW1lJCR9JCh2YWx1ZSlcbiIKKyAgICAgICAgICAgICAgICAgIn0iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwicGx1c0Fzc2lnbiRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgICAgICAgICAgICAiQFN1cHByZXNzKFwiTk9USElOR19UT19JTkxJTkVcIilcbiIKKyAgICAgICAgICAgICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAgICAgICAgICAgICJwbHVzQXNzaWduKHZhbHVlOiAka3RfdHlwZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgYWRkKHZhbHVlKVxuIgorICAgICAgICAgICAgICAgICAifSIpOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfTVVMVElfQURERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyBmYWxzZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bU5hbWUoXCJhZGRBbGwka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICAgICAgICAgICAgImZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xMaXN0IgorICAgICAgICAgICAgICAgICAiPCRrdF90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICAgICAgICAgICAgImFkZEFsbCh2YWx1ZXM6IGtvdGxpbi5jb2xsZWN0aW9ucy5JdGVyYWJsZTwka3RfdHlwZSQ+KSB7XG4iCisgICAgICAgICAgICAgICAgICIgICRrdF9kc2xfYnVpbGRlciQuJHskYWRkQWxsJGNhcGl0YWxpemVkX25hbWUkJH0kKHZhbHVlcylcbiIKKyAgICAgICAgICAgICAgICAgIn0iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX01VTFRJX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcInBsdXNBc3NpZ25BbGwka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICI8JGt0X3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD4uIgorICAgICAgInBsdXNBc3NpZ24odmFsdWVzOiBrb3RsaW4uY29sbGVjdGlvbnMuSXRlcmFibGU8JGt0X3R5cGUkPikge1xuIgorICAgICAgIiAgYWRkQWxsKHZhbHVlcylcbiIKKyAgICAgICJ9Iik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9JTkRFWEVEX1NFVFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIkBrb3RsaW4uanZtLkp2bU5hbWUoXCJzZXQka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICJvcGVyYXRvciBmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICI8JGt0X3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD4uIgorICAgICAgInNldChpbmRleDoga290bGluLkludCwgdmFsdWU6ICRrdF90eXBlJCkge1xuIgorICAgICAgIiAgJGt0X2RzbF9idWlsZGVyJC4keyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoaW5kZXgsIHZhbHVlKVxuIgorICAgICAgIn0iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwiY2xlYXIka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICAgICAgICAgICAgImZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xMaXN0IgorICAgICAgICAgICAgICAgICAiPCRrdF90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICAgICAgICAgICAgImNsZWFyKCkge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKClcbiIKKyAgICAgICAgICAgICAgICAgIn0iKTsKK30KKworc3RkOjpzdHJpbmcgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRMaXRlR2VuZXJhdG9yOjpHZXRCb3hlZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5lbnVtX3R5cGUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGRfbGl0ZS5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fZmllbGRfbGl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MmIyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bV9maWVsZF9saXRlLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9FTlVNX0ZJRUxEX0xJVEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VOVU1fRklFTERfTElURV9IX18KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CitjbGFzcyBDb250ZXh0OyAgICAgICAgICAgIC8vIGNvbnRleHQuaAorY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7ICAvLyBuYW1lX3Jlc29sdmVyLmgKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitjbGFzcyBJbW11dGFibGVFbnVtRmllbGRMaXRlR2VuZXJhdG9yIDogcHVibGljIEltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBJbW11dGFibGVFbnVtRmllbGRMaXRlR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpOworICB+SW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlRmllbGRJbmZvKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcmlhYmxlc187CisgIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOworICBDb250ZXh0KiBjb250ZXh0XzsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXJfOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEltbXV0YWJsZUVudW1GaWVsZExpdGVHZW5lcmF0b3IpOworfTsKKworY2xhc3MgSW1tdXRhYmxlRW51bU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yCisgICAgOiBwdWJsaWMgSW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvciB7CisgcHVibGljOgorICBJbW11dGFibGVFbnVtT25lb2ZGaWVsZExpdGVHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCk7CisgIH5JbW11dGFibGVFbnVtT25lb2ZGaWVsZExpdGVHZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEluZm8oaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+KiBvdXRwdXQpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEltbXV0YWJsZUVudW1PbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcik7Cit9OworCitjbGFzcyBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZExpdGVHZW5lcmF0b3IKKyAgICA6IHB1YmxpYyBJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRMaXRlR2VuZXJhdG9yKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKKyAgflJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlRmllbGRJbmZvKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJpYWJsZXNfOworICBDb250ZXh0KiBjb250ZXh0XzsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXJfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZExpdGVHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRU5VTV9GSUVMRF9MSVRFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fbGl0ZS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtX2xpdGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4NzA5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtX2xpdGUuY2MKQEAgLTAsMCArMSwyMzYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fbGl0ZS5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZV9yZXNvbHZlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK0VudW1MaXRlR2VuZXJhdG9yOjpFbnVtTGl0ZUdlbmVyYXRvcihjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZV9hcGksIENvbnRleHQqIGNvbnRleHQpCisgICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwKKyAgICAgIGltbXV0YWJsZV9hcGlfKGltbXV0YWJsZV9hcGkpLAorICAgICAgY29udGV4dF8oY29udGV4dCksCisgICAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSA9IGRlc2NyaXB0b3JfLT52YWx1ZShpKTsKKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBjYW5vbmljYWxfdmFsdWUgPQorICAgICAgICBkZXNjcmlwdG9yXy0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUtPm51bWJlcigpKTsKKworICAgIGlmICh2YWx1ZSA9PSBjYW5vbmljYWxfdmFsdWUpIHsKKyAgICAgIGNhbm9uaWNhbF92YWx1ZXNfLnB1c2hfYmFjayh2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFsaWFzIGFsaWFzOworICAgICAgYWxpYXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgIGFsaWFzLmNhbm9uaWNhbF92YWx1ZSA9IGNhbm9uaWNhbF92YWx1ZTsKKyAgICAgIGFsaWFzZXNfLnB1c2hfYmFjayhhbGlhcyk7CisgICAgfQorICB9Cit9CisKK0VudW1MaXRlR2VuZXJhdG9yOjp+RW51bUxpdGVHZW5lcmF0b3IoKSB7fQorCit2b2lkIEVudW1MaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBXcml0ZUVudW1Eb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgTWF5YmVQcmludEdlbmVyYXRlZEFubm90YXRpb24oY29udGV4dF8sIHByaW50ZXIsIGRlc2NyaXB0b3JfLCBpbW11dGFibGVfYXBpXyk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgZW51bSAkY2xhc3NuYW1lJFxuIgorICAgICAgIiAgICBpbXBsZW1lbnRzIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bUxpdGUge1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpLCAiZGVwcmVjYXRpb24iLAorICAgICAgZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkICIgOiAiIik7CisgIHByaW50ZXItPkFubm90YXRlKCJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgY2Fub25pY2FsX3ZhbHVlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnM7CisgICAgdmFyc1sibmFtZSJdID0gY2Fub25pY2FsX3ZhbHVlc19baV0tPm5hbWUoKTsKKyAgICB2YXJzWyJudW1iZXIiXSA9IFN0ckNhdChjYW5vbmljYWxfdmFsdWVzX1tpXS0+bnVtYmVyKCkpOworICAgIFdyaXRlRW51bVZhbHVlRG9jQ29tbWVudChwcmludGVyLCBjYW5vbmljYWxfdmFsdWVzX1tpXSk7CisgICAgaWYgKGNhbm9uaWNhbF92YWx1ZXNfW2ldLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQodmFycywgIiRuYW1lJCgkbnVtYmVyJCksXG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgibmFtZSIsIGNhbm9uaWNhbF92YWx1ZXNfW2ldKTsKKyAgfQorCisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KCIkeyRVTlJFQ09HTklaRUQkfSQoLTEpLFxuIiwgInsiLCAiIiwgIn0iLCAiIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICAgIjtcbiIKKyAgICAgICJcbiIpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGlhc2VzXy5zaXplKCk7IGkrKykgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJjbGFzc25hbWUiXSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7CisgICAgdmFyc1sibmFtZSJdID0gYWxpYXNlc19baV0udmFsdWUtPm5hbWUoKTsKKyAgICB2YXJzWyJjYW5vbmljYWxfbmFtZSJdID0gYWxpYXNlc19baV0uY2Fub25pY2FsX3ZhbHVlLT5uYW1lKCk7CisgICAgV3JpdGVFbnVtVmFsdWVEb2NDb21tZW50KHByaW50ZXIsIGFsaWFzZXNfW2ldLnZhbHVlKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFycywgInB1YmxpYyBzdGF0aWMgZmluYWwgJGNsYXNzbmFtZSQgJG5hbWUkID0gJGNhbm9uaWNhbF9uYW1lJDtcbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJuYW1lIiwgYWxpYXNlc19baV0udmFsdWUpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKTsgaSsrKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzOworICAgIHZhcnNbIm5hbWUiXSA9IGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bmFtZSgpOworICAgIHZhcnNbIm51bWJlciJdID0gU3RyQ2F0KGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bnVtYmVyKCkpOworICAgIHZhcnNbInsiXSA9ICIiOworICAgIHZhcnNbIn0iXSA9ICIiOworICAgIHZhcnNbImRlcHJlY2F0aW9uIl0gPSBkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIkBqYXZhLmxhbmcuRGVwcmVjYXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIiOworICAgIFdyaXRlRW51bVZhbHVlRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXy0+dmFsdWUoaSkpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgc3RhdGljIGZpbmFsIGludCAkeyQkbmFtZSRfVkFMVUUkfSQgPSAiCisgICAgICAgICAgICAgICAgICAgIiRudW1iZXIkO1xuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfLT52YWx1ZShpKSk7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJcbiIKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAicHVibGljIGZpbmFsIGludCBnZXROdW1iZXIoKSB7XG4iKTsKKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIGlmICh0aGlzID09IFVOUkVDT0dOSVpFRCkge1xuIgorICAgICAgICAiICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFxuIgorICAgICAgICAiICAgICAgICBcIkNhbid0IGdldCB0aGUgbnVtYmVyIG9mIGFuIHVua25vd24gZW51bSB2YWx1ZS5cIik7XG4iCisgICAgICAgICIgIH1cbiIpOworICB9CisgIHByaW50ZXItPlByaW50KAorICAgICAgIiAgcmV0dXJuIHZhbHVlO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIKKyAgICAgICIvKipcbiIKKyAgICAgICIgKiBAcGFyYW0gdmFsdWUgVGhlIG51bWJlciBvZiB0aGUgZW51bSB0byBsb29rIGZvci5cbiIKKyAgICAgICIgKiBAcmV0dXJuIFRoZSBlbnVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLlxuIgorICAgICAgIiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2Zvck51bWJlcihpbnQpfSBpbnN0ZWFkLlxuIgorICAgICAgIiAqL1xuIgorICAgICAgIkBqYXZhLmxhbmcuRGVwcmVjYXRlZFxuIgorICAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgdmFsdWVPZihpbnQgdmFsdWUpIHtcbiIKKyAgICAgICIgIHJldHVybiBmb3JOdW1iZXIodmFsdWUpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIKKyAgICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIGZvck51bWJlcihpbnQgdmFsdWUpIHtcbiIKKyAgICAgICIgIHN3aXRjaCAodmFsdWUpIHtcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGNhbm9uaWNhbF92YWx1ZXNfLnNpemUoKTsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoImNhc2UgJG51bWJlciQ6IHJldHVybiAkbmFtZSQ7XG4iLCAibmFtZSIsCisgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsX3ZhbHVlc19baV0tPm5hbWUoKSwgIm51bWJlciIsCisgICAgICAgICAgICAgICAgICAgU3RyQ2F0KGNhbm9uaWNhbF92YWx1ZXNfW2ldLT5udW1iZXIoKSkpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIiAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iCisgICAgICAicHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkVudW1MaXRlTWFwPCRjbGFzc25hbWUkPlxuIgorICAgICAgIiAgICBpbnRlcm5hbEdldFZhbHVlTWFwKCkge1xuIgorICAgICAgIiAgcmV0dXJuIGludGVybmFsVmFsdWVNYXA7XG4iCisgICAgICAifVxuIgorICAgICAgInByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bUxpdGVNYXA8XG4iCisgICAgICAiICAgICRjbGFzc25hbWUkPiBpbnRlcm5hbFZhbHVlTWFwID1cbiIKKyAgICAgICIgICAgICBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5FbnVtTGl0ZU1hcDwkY2xhc3NuYW1lJD4oKSB7XG4iCisgICAgICAiICAgICAgICBAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAiICAgICAgICBwdWJsaWMgJGNsYXNzbmFtZSQgZmluZFZhbHVlQnlOdW1iZXIoaW50IG51bWJlcikge1xuIgorICAgICAgIiAgICAgICAgICByZXR1cm4gJGNsYXNzbmFtZSQuZm9yTnVtYmVyKG51bWJlcik7XG4iCisgICAgICAiICAgICAgICB9XG4iCisgICAgICAiICAgICAgfTtcbiIKKyAgICAgICJcbiIKKyAgICAgICJwdWJsaWMgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bVZlcmlmaWVyIFxuIgorICAgICAgIiAgICBpbnRlcm5hbEdldFZlcmlmaWVyKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRjbGFzc25hbWUkVmVyaWZpZXIuSU5TVEFOQ0U7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgInByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzICRjbGFzc25hbWUkVmVyaWZpZXIgaW1wbGVtZW50cyBcbiIKKyAgICAgICIgICAgIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bVZlcmlmaWVyIHsgXG4iCisgICAgICAiICAgICAgICBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5FbnVtVmVyaWZpZXIgIgorICAgICAgIiAgICAgICAgICBJTlNUQU5DRSA9IG5ldyAkY2xhc3NuYW1lJFZlcmlmaWVyKCk7XG4iCisgICAgICAiICAgICAgICBAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAiICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luUmFuZ2UoaW50IG51bWJlcikge1xuIgorICAgICAgIiAgICAgICAgICByZXR1cm4gJGNsYXNzbmFtZSQuZm9yTnVtYmVyKG51bWJlcikgIT0gbnVsbDtcbiIKKyAgICAgICIgICAgICAgIH1cbiIKKyAgICAgICIgICAgICB9O1xuIgorICAgICAgIlxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwcml2YXRlIGZpbmFsIGludCB2YWx1ZTtcblxuIgorICAgICAgInByaXZhdGUgJGNsYXNzbmFtZSQoaW50IHZhbHVlKSB7XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiIKKyAgICAgICJ9XG4iKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJcbiIKKyAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZW51bV9zY29wZTokZnVsbF9uYW1lJClcbiIsCisgICAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtX2xpdGUuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtX2xpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGYzZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW1fbGl0ZS5oCkBAIC0wLDAgKzEsOTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9FTlVNX0xJVEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VOVU1fTElURV9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKK2NsYXNzIENvbnRleHQ7ICAgICAgICAgICAgLy8gY29udGV4dC5oCitjbGFzcyBDbGFzc05hbWVSZXNvbHZlcjsgIC8vIG5hbWVfcmVzb2x2ZXIuaAorfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorbmFtZXNwYWNlIGlvIHsKK2NsYXNzIFByaW50ZXI7ICAvLyBwcmludGVyLmgKK30KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitjbGFzcyBFbnVtTGl0ZUdlbmVyYXRvciB7CisgcHVibGljOgorICBFbnVtTGl0ZUdlbmVyYXRvcihjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwgYm9vbCBpbW11dGFibGVfYXBpLAorICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KTsKKyAgfkVudW1MaXRlR2VuZXJhdG9yKCk7CisKKyAgdm9pZCBHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorICBjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisKKyAgLy8gVGhlIHByb3RvIGxhbmd1YWdlIGFsbG93cyBtdWx0aXBsZSBlbnVtIGNvbnN0YW50cyB0byBoYXZlIHRoZSBzYW1lCisgIC8vIG51bWVyaWMgdmFsdWUuICBKYXZhLCBob3dldmVyLCBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZSBlbnVtIGNvbnN0YW50cyB0bworICAvLyBiZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQuICBXZSB0cmVhdCB0aGUgZmlyc3QgZGVmaW5lZCBjb25zdGFudCBmb3IgYW55CisgIC8vIGdpdmVuIG51bWVyaWMgdmFsdWUgYXMgImNhbm9uaWNhbCIgYW5kIHRoZSByZXN0IGFzIGFsaWFzZXMgb2YgdGhhdAorICAvLyBjYW5vbmljYWwgdmFsdWUuCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqPiBjYW5vbmljYWxfdmFsdWVzXzsKKworICBzdHJ1Y3QgQWxpYXMgeworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlOworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGNhbm9uaWNhbF92YWx1ZTsKKyAgfTsKKyAgc3RkOjp2ZWN0b3I8QWxpYXM+IGFsaWFzZXNfOworCisgIGJvb2wgaW1tdXRhYmxlX2FwaV87CisKKyAgQ29udGV4dCogY29udGV4dF87CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRW51bUxpdGVHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRU5VTV9MSVRFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbi5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9leHRlbnNpb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5M2ViMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9leHRlbnNpb24uY2MKQEAgLTAsMCArMSwxNzcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbi5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lX3Jlc29sdmVyLmg+CisKKy8vIE11c3QgYmUgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitJbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3I6OkltbXV0YWJsZUV4dGVuc2lvbkdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIENvbnRleHQqIGNvbnRleHQpCisgICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwgbmFtZV9yZXNvbHZlcl8oY29udGV4dC0+R2V0TmFtZVJlc29sdmVyKCkpIHsKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSAhPSBOVUxMKSB7CisgICAgc2NvcGVfID0KKyAgICAgICAgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3Njb3BlKCkpOworICB9IGVsc2UgeworICAgIHNjb3BlXyA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKSk7CisgIH0KK30KKworSW1tdXRhYmxlRXh0ZW5zaW9uR2VuZXJhdG9yOjp+SW1tdXRhYmxlRXh0ZW5zaW9uR2VuZXJhdG9yKCkge30KKworLy8gSW5pdGlhbGl6ZXMgdGhlIHZhcnMgcmVmZXJlbmNlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgdGVtcGxhdGVzLgordm9pZCBFeHRlbnNpb25HZW5lcmF0b3I6OkluaXRUZW1wbGF0ZVZhcnMoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgc2NvcGUsIGJvb2wgaW1tdXRhYmxlLAorICAgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyLAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcnNfcG9pbnRlcikgeworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiB2YXJzID0gKnZhcnNfcG9pbnRlcjsKKyAgdmFyc1sic2NvcGUiXSA9IHNjb3BlOworICB2YXJzWyJuYW1lIl0gPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlQ2hlY2tSZXNlcnZlZChkZXNjcmlwdG9yKTsKKyAgdmFyc1siY29udGFpbmluZ190eXBlIl0gPQorICAgICAgbmFtZV9yZXNvbHZlci0+R2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpLCBpbW11dGFibGUpOworICB2YXJzWyJudW1iZXIiXSA9IFN0ckNhdChkZXNjcmlwdG9yLT5udW1iZXIoKSk7CisgIHZhcnNbImNvbnN0YW50X25hbWUiXSA9IEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3IpOworICB2YXJzWyJpbmRleCJdID0gU3RyQ2F0KGRlc2NyaXB0b3ItPmluZGV4KCkpOworICB2YXJzWyJkZWZhdWx0Il0gPSBkZXNjcmlwdG9yLT5pc19yZXBlYXRlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICA/ICIiCisgICAgICAgICAgICAgICAgICAgICAgICA6IERlZmF1bHRWYWx1ZShkZXNjcmlwdG9yLCBpbW11dGFibGUsIG5hbWVfcmVzb2x2ZXIpOworICB2YXJzWyJ0eXBlX2NvbnN0YW50Il0gPSBGaWVsZFR5cGVOYW1lKEdldFR5cGUoZGVzY3JpcHRvcikpOworICB2YXJzWyJwYWNrZWQiXSA9IGRlc2NyaXB0b3ItPmlzX3BhY2tlZCgpID8gInRydWUiIDogImZhbHNlIjsKKyAgdmFyc1siZW51bV9tYXAiXSA9ICJudWxsIjsKKyAgdmFyc1sicHJvdG90eXBlIl0gPSAibnVsbCI7CisKKyAgSmF2YVR5cGUgamF2YV90eXBlID0gR2V0SmF2YVR5cGUoZGVzY3JpcHRvcik7CisgIHN0ZDo6c3RyaW5nIHNpbmd1bGFyX3R5cGU7CisgIHN3aXRjaCAoamF2YV90eXBlKSB7CisgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgorICAgICAgc2luZ3VsYXJfdHlwZSA9CisgICAgICAgICAgbmFtZV9yZXNvbHZlci0+R2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLCBpbW11dGFibGUpOworICAgICAgdmFyc1sicHJvdG90eXBlIl0gPSBzaW5ndWxhcl90eXBlICsgIi5nZXREZWZhdWx0SW5zdGFuY2UoKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgICBzaW5ndWxhcl90eXBlID0KKyAgICAgICAgICBuYW1lX3Jlc29sdmVyLT5HZXRDbGFzc05hbWUoZGVzY3JpcHRvci0+ZW51bV90eXBlKCksIGltbXV0YWJsZSk7CisgICAgICB2YXJzWyJlbnVtX21hcCJdID0gc2luZ3VsYXJfdHlwZSArICIuaW50ZXJuYWxHZXRWYWx1ZU1hcCgpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HOgorICAgICAgc2luZ3VsYXJfdHlwZSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSkFWQVRZUEVfQllURVM6CisgICAgICBzaW5ndWxhcl90eXBlID0gaW1tdXRhYmxlID8gImNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyIgOiAiYnl0ZVtdIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzaW5ndWxhcl90eXBlID0gQm94ZWRQcmltaXRpdmVUeXBlTmFtZShqYXZhX3R5cGUpOworICAgICAgYnJlYWs7CisgIH0KKyAgdmFyc1sidHlwZSJdID0gZGVzY3JpcHRvci0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgICAgICAgICAgICAgPyAiamF2YS51dGlsLkxpc3Q8IiArIHNpbmd1bGFyX3R5cGUgKyAiPiIKKyAgICAgICAgICAgICAgICAgICAgIDogc2luZ3VsYXJfdHlwZTsKKyAgdmFyc1sic2luZ3VsYXJfdHlwZSJdID0gc2luZ3VsYXJfdHlwZTsKK30KKwordm9pZCBJbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3I6OkdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgY29uc3QgYm9vbCBrVXNlSW1tdXRhYmxlTmFtZXMgPSB0cnVlOworICBJbml0VGVtcGxhdGVWYXJzKGRlc2NyaXB0b3JfLCBzY29wZV8sIGtVc2VJbW11dGFibGVOYW1lcywgbmFtZV9yZXNvbHZlcl8sCisgICAgICAgICAgICAgICAgICAgJnZhcnMpOworICBwcmludGVyLT5QcmludCh2YXJzLCAicHVibGljIHN0YXRpYyBmaW5hbCBpbnQgJGNvbnN0YW50X25hbWUkID0gJG51bWJlciQ7XG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3Njb3BlKCkgPT0gTlVMTCkgeworICAgIC8vIE5vbi1uZXN0ZWQKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFycywKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWxcbiIKKyAgICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkdlbmVyYXRlZEV4dGVuc2lvbjxcbiIKKyAgICAgICAgIiAgICAkY29udGFpbmluZ190eXBlJCxcbiIKKyAgICAgICAgIiAgICAkdHlwZSQ+ICRuYW1lJCA9IGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZVxuIgorICAgICAgICAiICAgICAgICAubmV3RmlsZVNjb3BlZEdlbmVyYXRlZEV4dGVuc2lvbihcbiIKKyAgICAgICAgIiAgICAgICRzaW5ndWxhcl90eXBlJC5jbGFzcyxcbiIKKyAgICAgICAgIiAgICAgICRwcm90b3R5cGUkKTtcbiIpOworICB9IGVsc2UgeworICAgIC8vIE5lc3RlZAorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJzLAorICAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbFxuIgorICAgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuR2VuZXJhdGVkRXh0ZW5zaW9uPFxuIgorICAgICAgICAiICAgICRjb250YWluaW5nX3R5cGUkLFxuIgorICAgICAgICAiICAgICR0eXBlJD4gJG5hbWUkID0gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlXG4iCisgICAgICAgICIgICAgICAgIC5uZXdNZXNzYWdlU2NvcGVkR2VuZXJhdGVkRXh0ZW5zaW9uKFxuIgorICAgICAgICAiICAgICAgJHNjb3BlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSxcbiIKKyAgICAgICAgIiAgICAgICRpbmRleCQsXG4iCisgICAgICAgICIgICAgICAkc2luZ3VsYXJfdHlwZSQuY2xhc3MsXG4iCisgICAgICAgICIgICAgICAkcHJvdG90eXBlJCk7XG4iKTsKKyAgfQorICBwcmludGVyLT5Bbm5vdGF0ZSgibmFtZSIsIGRlc2NyaXB0b3JfKTsKK30KKworaW50IEltbXV0YWJsZUV4dGVuc2lvbkdlbmVyYXRvcjo6R2VuZXJhdGVOb25OZXN0ZWRJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaW50IGJ5dGVjb2RlX2VzdGltYXRlID0gMDsKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSA9PSBOVUxMKSB7CisgICAgLy8gT25seSBhcHBsaWVzIHRvIG5vbi1uZXN0ZWQgZXh0ZW5zaW9ucy4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiRuYW1lJC5pbnRlcm5hbEluaXQoZGVzY3JpcHRvci5nZXRFeHRlbnNpb25zKCkuZ2V0KCRpbmRleCQpKTtcbiIsCisgICAgICAgICJuYW1lIiwgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZUNoZWNrUmVzZXJ2ZWQoZGVzY3JpcHRvcl8pLCAiaW5kZXgiLAorICAgICAgICBTdHJDYXQoZGVzY3JpcHRvcl8tPmluZGV4KCkpKTsKKyAgICBieXRlY29kZV9lc3RpbWF0ZSArPSAyMTsKKyAgfQorICByZXR1cm4gYnl0ZWNvZGVfZXN0aW1hdGU7Cit9CisKK2ludCBJbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3I6OkdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgicmVnaXN0cnkuYWRkKCRzY29wZSQuJG5hbWUkKTtcbiIsICJzY29wZSIsIHNjb3BlXywgIm5hbWUiLAorICAgICAgICAgICAgICAgICBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlQ2hlY2tSZXNlcnZlZChkZXNjcmlwdG9yXykpOworICByZXR1cm4gNzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZXh0ZW5zaW9uLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZXh0ZW5zaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4Y2ZhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9leHRlbnNpb24uaApAQCAtMCwwICsxLDExNSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VYVEVOU0lPTl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRVhURU5TSU9OX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworY2xhc3MgRmllbGREZXNjcmlwdG9yOyAgLy8gZGVzY3JpcHRvci5oCituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworY2xhc3MgQ29udGV4dDsgICAgICAgICAgICAvLyBjb250ZXh0LmgKK2NsYXNzIENsYXNzTmFtZVJlc29sdmVyOyAgLy8gbmFtZV9yZXNvbHZlci5oCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCituYW1lc3BhY2UgaW8geworY2xhc3MgUHJpbnRlcjsgIC8vIHByaW50ZXIuaAorfQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKKy8vIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBleHRlbnNpb24sIHdoaWNoIG1heSBiZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHNvbWUKKy8vIG1lc3NhZ2Ugb3IgbWF5IGJlIGF0IGZpbGUgc2NvcGUuICBUaGlzIGlzIG11Y2ggc2ltcGxlciB0aGFuIEZpZWxkR2VuZXJhdG9yCisvLyBzaW5jZSBleHRlbnNpb25zIGFyZSBqdXN0IHNpbXBsZSBpZGVudGlmaWVycyB3aXRoIGludGVyZXN0aW5nIHR5cGVzLgorY2xhc3MgRXh0ZW5zaW9uR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEV4dGVuc2lvbkdlbmVyYXRvcigpIHt9CisgIHZpcnR1YWwgfkV4dGVuc2lvbkdlbmVyYXRvcigpIHt9CisKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSA9IDA7CisKKyAgLy8gUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBwcmludGVkIGNvZGUgd2lsbCBjb21waWxlCisgIC8vIHRvCisgIHZpcnR1YWwgaW50IEdlbmVyYXRlTm9uTmVzdGVkSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSA9IDA7CisKKyAgLy8gUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBwcmludGVkIGNvZGUgd2lsbCBjb21waWxlCisgIC8vIHRvCisgIHZpcnR1YWwgaW50IEdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgPSAwOworCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBJbml0VGVtcGxhdGVWYXJzKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgc2NvcGUsCisgICAgICBib29sIGltbXV0YWJsZSwgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXIsCisgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJzX3BvaW50ZXIpOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEV4dGVuc2lvbkdlbmVyYXRvcik7Cit9OworCitjbGFzcyBJbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3IgOiBwdWJsaWMgRXh0ZW5zaW9uR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEltbXV0YWJsZUV4dGVuc2lvbkdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KTsKKyAgfkltbXV0YWJsZUV4dGVuc2lvbkdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICBpbnQgR2VuZXJhdGVOb25OZXN0ZWRJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICBpbnQgR2VuZXJhdGVSZWdpc3RyYXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKworIHByb3RlY3RlZDoKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXJfOworICBzdGQ6OnN0cmluZyBzY29wZV87CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlRXh0ZW5zaW9uR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VYVEVOU0lPTl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9leHRlbnNpb25fbGl0ZS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9leHRlbnNpb25fbGl0ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmZiMWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbl9saXRlLmNjCkBAIC0wLDAgKzEsMTIwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbl9saXRlLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL25hbWVfcmVzb2x2ZXIuaD4KKworLy8gTXVzdCBiZSBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK0ltbXV0YWJsZUV4dGVuc2lvbkxpdGVHZW5lcmF0b3I6OkltbXV0YWJsZUV4dGVuc2lvbkxpdGVHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBDb250ZXh0KiBjb250ZXh0KQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3Njb3BlKCkgIT0gTlVMTCkgeworICAgIHNjb3BlXyA9CisgICAgICAgIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9zY29wZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBzY29wZV8gPSBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCkpOworICB9Cit9CisKK0ltbXV0YWJsZUV4dGVuc2lvbkxpdGVHZW5lcmF0b3I6On5JbW11dGFibGVFeHRlbnNpb25MaXRlR2VuZXJhdG9yKCkge30KKwordm9pZCBJbW11dGFibGVFeHRlbnNpb25MaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnM7CisgIGNvbnN0IGJvb2wga1VzZUltbXV0YWJsZU5hbWVzID0gdHJ1ZTsKKyAgSW5pdFRlbXBsYXRlVmFycyhkZXNjcmlwdG9yXywgc2NvcGVfLCBrVXNlSW1tdXRhYmxlTmFtZXMsIG5hbWVfcmVzb2x2ZXJfLAorICAgICAgICAgICAgICAgICAgICZ2YXJzKTsKKyAgcHJpbnRlci0+UHJpbnQodmFycywgInB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICRjb25zdGFudF9uYW1lJCA9ICRudW1iZXIkO1xuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFycywKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWxcbiIKKyAgICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5HZW5lcmF0ZWRFeHRlbnNpb248XG4iCisgICAgICAgICIgICAgJGNvbnRhaW5pbmdfdHlwZSQsXG4iCisgICAgICAgICIgICAgJHR5cGUkPiAkbmFtZSQgPSBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlXG4iCisgICAgICAgICIgICAgICAgIC5uZXdSZXBlYXRlZEdlbmVyYXRlZEV4dGVuc2lvbihcbiIKKyAgICAgICAgIiAgICAgICRjb250YWluaW5nX3R5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpLFxuIgorICAgICAgICAiICAgICAgJHByb3RvdHlwZSQsXG4iCisgICAgICAgICIgICAgICAkZW51bV9tYXAkLFxuIgorICAgICAgICAiICAgICAgJG51bWJlciQsXG4iCisgICAgICAgICIgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLldpcmVGb3JtYXQuRmllbGRUeXBlLiR0eXBlX2NvbnN0YW50JCxcbiIKKyAgICAgICAgIiAgICAgICRwYWNrZWQkLFxuIgorICAgICAgICAiICAgICAgJHNpbmd1bGFyX3R5cGUkLmNsYXNzKTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJzLAorICAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbFxuIgorICAgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLkdlbmVyYXRlZEV4dGVuc2lvbjxcbiIKKyAgICAgICAgIiAgICAkY29udGFpbmluZ190eXBlJCxcbiIKKyAgICAgICAgIiAgICAkdHlwZSQ+ICRuYW1lJCA9IGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGVcbiIKKyAgICAgICAgIiAgICAgICAgLm5ld1Npbmd1bGFyR2VuZXJhdGVkRXh0ZW5zaW9uKFxuIgorICAgICAgICAiICAgICAgJGNvbnRhaW5pbmdfdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCksXG4iCisgICAgICAgICIgICAgICAkZGVmYXVsdCQsXG4iCisgICAgICAgICIgICAgICAkcHJvdG90eXBlJCxcbiIKKyAgICAgICAgIiAgICAgICRlbnVtX21hcCQsXG4iCisgICAgICAgICIgICAgICAkbnVtYmVyJCxcbiIKKyAgICAgICAgIiAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuV2lyZUZvcm1hdC5GaWVsZFR5cGUuJHR5cGVfY29uc3RhbnQkLFxuIgorICAgICAgICAiICAgICAgJHNpbmd1bGFyX3R5cGUkLmNsYXNzKTtcbiIpOworICB9CisgIHByaW50ZXItPkFubm90YXRlKCJuYW1lIiwgZGVzY3JpcHRvcl8pOworfQorCitpbnQgSW1tdXRhYmxlRXh0ZW5zaW9uTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVOb25OZXN0ZWRJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBJbW11dGFibGVFeHRlbnNpb25MaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZVJlZ2lzdHJhdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoInJlZ2lzdHJ5LmFkZCgkc2NvcGUkLiRuYW1lJCk7XG4iLCAic2NvcGUiLCBzY29wZV8sICJuYW1lIiwKKyAgICAgICAgICAgICAgICAgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZUNoZWNrUmVzZXJ2ZWQoZGVzY3JpcHRvcl8pKTsKKyAgcmV0dXJuIDc7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbl9saXRlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZXh0ZW5zaW9uX2xpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjQyMzBjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbl9saXRlLmgKQEAgLTAsMCArMSw3NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRVhURU5TSU9OX0xJVEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VYVEVOU0lPTl9MSVRFX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9leHRlbnNpb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworLy8gR2VuZXJhdGVzIGNvZGUgZm9yIGEgbGl0ZSBleHRlbnNpb24sIHdoaWNoIG1heSBiZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHNvbWUKKy8vIG1lc3NhZ2Ugb3IgbWF5IGJlIGF0IGZpbGUgc2NvcGUuICBUaGlzIGlzIG11Y2ggc2ltcGxlciB0aGFuIEZpZWxkR2VuZXJhdG9yCisvLyBzaW5jZSBleHRlbnNpb25zIGFyZSBqdXN0IHNpbXBsZSBpZGVudGlmaWVycyB3aXRoIGludGVyZXN0aW5nIHR5cGVzLgorY2xhc3MgSW1tdXRhYmxlRXh0ZW5zaW9uTGl0ZUdlbmVyYXRvciA6IHB1YmxpYyBFeHRlbnNpb25HZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgSW1tdXRhYmxlRXh0ZW5zaW9uTGl0ZUdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCk7CisgIH5JbW11dGFibGVFeHRlbnNpb25MaXRlR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisKKyAgLy8gUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBwcmludGVkIGNvZGUgd2lsbCBjb21waWxlIHRvCisgIGludCBHZW5lcmF0ZU5vbk5lc3RlZEluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisKKyAgLy8gUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBwcmludGVkIGNvZGUgd2lsbCBjb21waWxlIHRvCisgIGludCBHZW5lcmF0ZVJlZ2lzdHJhdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXJfOworICBzdGQ6OnN0cmluZyBzY29wZV87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEltbXV0YWJsZUV4dGVuc2lvbkxpdGVHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRVhURU5TSU9OX0xJVEVfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZmllbGQuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkNTI4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9maWVsZC5jYwpAQCAtMCwwICsxLDMxMiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZmllbGQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bV9maWVsZF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfZmllbGRfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3ByaW1pdGl2ZV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3ByaW1pdGl2ZV9maWVsZF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc3RyaW5nX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc3RyaW5nX2ZpZWxkX2xpdGUuaD4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCituYW1lc3BhY2UgeworCitJbW11dGFibGVGaWVsZEdlbmVyYXRvciogTWFrZUltbXV0YWJsZUdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KSB7CisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIHN3aXRjaCAoR2V0SmF2YVR5cGUoZmllbGQpKSB7CisgICAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6CisgICAgICAgIGlmIChJc01hcEVudHJ5KGZpZWxkLT5tZXNzYWdlX3R5cGUoKSkpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZU1hcEZpZWxkR2VuZXJhdG9yKGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IoCisgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICAgIH0KKyAgICAgIGNhc2UgSkFWQVRZUEVfRU5VTToKKyAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICBjYXNlIEpBVkFUWVBFX1NUUklORzoKKyAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChJc1JlYWxPbmVvZihmaWVsZCkpIHsKKyAgICAgIHN3aXRjaCAoR2V0SmF2YVR5cGUoZmllbGQpKSB7CisgICAgICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRToKKyAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcihmaWVsZCwgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkc6CisgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChHZXRKYXZhVHlwZShmaWVsZCkpIHsKKyAgICAgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgorICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgICAgY2FzZSBKQVZBVFlQRV9FTlVNOgorICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yKGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkc6CisgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcihmaWVsZCwgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IqIE1ha2VJbW11dGFibGVMaXRlR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBtZXNzYWdlQml0SW5kZXgsIENvbnRleHQqIGNvbnRleHQpIHsKKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgc3dpdGNoIChHZXRKYXZhVHlwZShmaWVsZCkpIHsKKyAgICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRToKKyAgICAgICAgaWYgKElzTWFwRW50cnkoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSkgeworICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlTWFwRmllbGRMaXRlR2VuZXJhdG9yKGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZExpdGVHZW5lcmF0b3IoCisgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgICB9CisgICAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRMaXRlR2VuZXJhdG9yKAorICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgY29udGV4dCk7CisgICAgICBjYXNlIEpBVkFUWVBFX1NUUklORzoKKyAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcigKKyAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcigKKyAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGNvbnRleHQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoSXNSZWFsT25lb2YoZmllbGQpKSB7CisgICAgICBzd2l0Y2ggKEdldEphdmFUeXBlKGZpZWxkKSkgeworICAgICAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6CisgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZExpdGVHZW5lcmF0b3IoCisgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVFbnVtT25lb2ZGaWVsZExpdGVHZW5lcmF0b3IoCisgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgICBjYXNlIEpBVkFUWVBFX1NUUklORzoKKyAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRMaXRlR2VuZXJhdG9yKAorICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yKAorICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChHZXRKYXZhVHlwZShmaWVsZCkpIHsKKyAgICAgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgorICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlTWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcihmaWVsZCwgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KTsKKyAgICAgICAgY2FzZSBKQVZBVFlQRV9FTlVNOgorICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcihmaWVsZCwgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KTsKKyAgICAgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkc6CisgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVTdHJpbmdGaWVsZExpdGVHZW5lcmF0b3IoZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcigKKyAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgY29udGV4dCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIFJlcG9ydFVuZXhwZWN0ZWRQYWNrZWRGaWVsZHNDYWxsKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIFJlYWNoaW5nIGhlcmUgaW5kaWNhdGVzIGEgYnVnLiBDYXNlcyBhcmU6CisgIC8vICAgLSBUaGlzIEZpZWxkR2VuZXJhdG9yIHNob3VsZCBzdXBwb3J0IHBhY2tpbmcsCisgIC8vICAgICBidXQgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4uCisgIC8vICAgLSBUaGlzIEZpZWxkR2VuZXJhdG9yIGRvZXNuJ3Qgc3VwcG9ydCBwYWNraW5nLCBhbmQgdGhpcyBtZXRob2QKKyAgLy8gICAgIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gY2FsbGVkLgorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiR2VuZXJhdGVCdWlsZGVyUGFyc2luZ0NvZGVGcm9tUGFja2VkKCkgIgorICAgICAgICAgICAgIDw8ICJjYWxsZWQgb24gZmllbGQgZ2VuZXJhdG9yIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBwYWNraW5nLiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitJbW11dGFibGVGaWVsZEdlbmVyYXRvcjo6fkltbXV0YWJsZUZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBJbW11dGFibGVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyUGFyc2luZ0NvZGVGcm9tUGFja2VkKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFJlcG9ydFVuZXhwZWN0ZWRQYWNrZWRGaWVsZHNDYWxsKHByaW50ZXIpOworfQorCitJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3I6On5JbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IoKSB7fQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3RlbXBsYXRlIDw+CitGaWVsZEdlbmVyYXRvck1hcDxJbW11dGFibGVGaWVsZEdlbmVyYXRvcj46OkZpZWxkR2VuZXJhdG9yTWFwKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIENvbnRleHQqIGNvbnRleHQpCisgICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwgZmllbGRfZ2VuZXJhdG9yc18oZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKSkgeworICAvLyBDb25zdHJ1Y3QgYWxsIHRoZSBGaWVsZEdlbmVyYXRvcnMgYW5kIGFzc2lnbiB0aGVtIGJpdCBpbmRpY2VzIGZvciB0aGVpcgorICAvLyBiaXQgZmllbGRzLgorICBpbnQgbWVzc2FnZUJpdEluZGV4ID0gMDsKKyAgaW50IGJ1aWxkZXJCaXRJbmRleCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IqIGdlbmVyYXRvciA9IE1ha2VJbW11dGFibGVHZW5lcmF0b3IoCisgICAgICAgIGRlc2NyaXB0b3ItPmZpZWxkKGkpLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgZmllbGRfZ2VuZXJhdG9yc19baV0ucmVzZXQoZ2VuZXJhdG9yKTsKKyAgICBtZXNzYWdlQml0SW5kZXggKz0gZ2VuZXJhdG9yLT5HZXROdW1CaXRzRm9yTWVzc2FnZSgpOworICAgIGJ1aWxkZXJCaXRJbmRleCArPSBnZW5lcmF0b3ItPkdldE51bUJpdHNGb3JCdWlsZGVyKCk7CisgIH0KK30KKwordGVtcGxhdGUgPD4KK0ZpZWxkR2VuZXJhdG9yTWFwPEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yPjo6fkZpZWxkR2VuZXJhdG9yTWFwKCkge30KKwordGVtcGxhdGUgPD4KK0ZpZWxkR2VuZXJhdG9yTWFwPEltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvcj46OkZpZWxkR2VuZXJhdG9yTWFwKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIENvbnRleHQqIGNvbnRleHQpCisgICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwgZmllbGRfZ2VuZXJhdG9yc18oZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKSkgeworICAvLyBDb25zdHJ1Y3QgYWxsIHRoZSBGaWVsZEdlbmVyYXRvcnMgYW5kIGFzc2lnbiB0aGVtIGJpdCBpbmRpY2VzIGZvciB0aGVpcgorICAvLyBiaXQgZmllbGRzLgorICBpbnQgbWVzc2FnZUJpdEluZGV4ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IqIGdlbmVyYXRvciA9IE1ha2VJbW11dGFibGVMaXRlR2VuZXJhdG9yKAorICAgICAgICBkZXNjcmlwdG9yLT5maWVsZChpKSwgbWVzc2FnZUJpdEluZGV4LCBjb250ZXh0KTsKKyAgICBmaWVsZF9nZW5lcmF0b3JzX1tpXS5yZXNldChnZW5lcmF0b3IpOworICAgIG1lc3NhZ2VCaXRJbmRleCArPSBnZW5lcmF0b3ItPkdldE51bUJpdHNGb3JNZXNzYWdlKCk7CisgIH0KK30KKwordGVtcGxhdGUgPD4KK0ZpZWxkR2VuZXJhdG9yTWFwPEltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvcj46On5GaWVsZEdlbmVyYXRvck1hcCgpIHt9CisKKwordm9pZCBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzKSB7CisgICgqdmFyaWFibGVzKVsiZmllbGRfbmFtZSJdID0gZGVzY3JpcHRvci0+bmFtZSgpOworICAoKnZhcmlhYmxlcylbIm5hbWUiXSA9IGluZm8tPm5hbWU7CisgICgqdmFyaWFibGVzKVsiY2xhc3NuYW1lIl0gPSBkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKS0+bmFtZSgpOworICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX25hbWUiXSA9IGluZm8tPmNhcGl0YWxpemVkX25hbWU7CisgICgqdmFyaWFibGVzKVsiZGlzYW1iaWd1YXRlZF9yZWFzb24iXSA9IGluZm8tPmRpc2FtYmlndWF0ZWRfcmVhc29uOworICAoKnZhcmlhYmxlcylbImNvbnN0YW50X25hbWUiXSA9IEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbIm51bWJlciJdID0gU3RyQ2F0KGRlc2NyaXB0b3ItPm51bWJlcigpKTsKKyAgKCp2YXJpYWJsZXMpWyJrdF9kc2xfYnVpbGRlciJdID0gIl9idWlsZGVyIjsKKyAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSBwbGFjZWhvbGRlcnMgdG8gcGljayBvdXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kcyBvZgorICAvLyBpZGVudGlmaWVycyBmb3IgYW5ub3RhdGlvbnMgKHdoZW4gZG9pbmcgc28gd2l0aCBleGlzdGluZyB2YXJpYWJsZXMgd291bGQKKyAgLy8gYmUgYW1iaWd1b3VzIG9yIGltcG9zc2libGUpLiBUaGV5IHNob3VsZCBuZXZlciBiZSBzZXQgdG8gYW55dGhpbmcgYnV0IHRoZQorICAvLyBlbXB0eSBzdHJpbmcuCisgICgqdmFyaWFibGVzKVsieyJdID0gIiI7CisgICgqdmFyaWFibGVzKVsifSJdID0gIiI7CisgICgqdmFyaWFibGVzKVsia3RfbmFtZSJdID0KKyAgICAgIElzRm9yYmlkZGVuS290bGluKGluZm8tPm5hbWUpID8gaW5mby0+bmFtZSArICJfIiA6IGluZm8tPm5hbWU7CisgICgqdmFyaWFibGVzKVsia3RfY2FwaXRhbGl6ZWRfbmFtZSJdID0gSXNGb3JiaWRkZW5Lb3RsaW4oaW5mby0+bmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbmZvLT5jYXBpdGFsaXplZF9uYW1lICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZTsKKyAgaWYgKCFkZXNjcmlwdG9yLT5pc19yZXBlYXRlZCgpKSB7CisgICAgKCp2YXJpYWJsZXMpWyJhbm5vdGF0aW9uX2ZpZWxkX3R5cGUiXSA9IEZpZWxkVHlwZU5hbWUoZGVzY3JpcHRvci0+dHlwZSgpKTsKKyAgfSBlbHNlIGlmIChHZXRKYXZhVHlwZShkZXNjcmlwdG9yKSA9PSBKQVZBVFlQRV9NRVNTQUdFICYmCisgICAgICAgICAgICAgSXNNYXBFbnRyeShkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKSkpIHsKKyAgICAoKnZhcmlhYmxlcylbImFubm90YXRpb25fZmllbGRfdHlwZSJdID0KKyAgICAgICAgc3RkOjpzdHJpbmcoRmllbGRUeXBlTmFtZShkZXNjcmlwdG9yLT50eXBlKCkpKSArICJNQVAiOworICB9IGVsc2UgeworICAgICgqdmFyaWFibGVzKVsiYW5ub3RhdGlvbl9maWVsZF90eXBlIl0gPQorICAgICAgICBzdGQ6OnN0cmluZyhGaWVsZFR5cGVOYW1lKGRlc2NyaXB0b3ItPnR5cGUoKSkpICsgIl9MSVNUIjsKKyAgICBpZiAoZGVzY3JpcHRvci0+aXNfcGFja2VkKCkpIHsKKyAgICAgICgqdmFyaWFibGVzKVsiYW5ub3RhdGlvbl9maWVsZF90eXBlIl0gPQorICAgICAgICAgICgqdmFyaWFibGVzKVsiYW5ub3RhdGlvbl9maWVsZF90eXBlIl0gKyAiX1BBQ0tFRCI7CisgICAgfQorICB9Cit9CisKK3ZvaWQgU2V0Q29tbW9uT25lb2ZWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPbmVvZkdlbmVyYXRvckluZm8qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcykgeworICAoKnZhcmlhYmxlcylbIm9uZW9mX25hbWUiXSA9IGluZm8tPm5hbWU7CisgICgqdmFyaWFibGVzKVsib25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSJdID0gaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZTsKKyAgKCp2YXJpYWJsZXMpWyJvbmVvZl9pbmRleCJdID0KKyAgICAgIFN0ckNhdChkZXNjcmlwdG9yLT5jb250YWluaW5nX29uZW9mKCktPmluZGV4KCkpOworICAoKnZhcmlhYmxlcylbIm9uZW9mX3N0b3JlZF90eXBlIl0gPSBHZXRPbmVvZlN0b3JlZFR5cGUoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsic2V0X29uZW9mX2Nhc2VfbWVzc2FnZSJdID0KKyAgICAgIGluZm8tPm5hbWUgKyAiQ2FzZV8gPSAiICsgU3RyQ2F0KGRlc2NyaXB0b3ItPm51bWJlcigpKTsKKyAgKCp2YXJpYWJsZXMpWyJjbGVhcl9vbmVvZl9jYXNlX21lc3NhZ2UiXSA9IGluZm8tPm5hbWUgKyAiQ2FzZV8gPSAwIjsKKyAgKCp2YXJpYWJsZXMpWyJoYXNfb25lb2ZfY2FzZV9tZXNzYWdlIl0gPQorICAgICAgaW5mby0+bmFtZSArICJDYXNlXyA9PSAiICsgU3RyQ2F0KGRlc2NyaXB0b3ItPm51bWJlcigpKTsKK30KKwordm9pZCBQcmludEV4dHJhRmllbGRJbmZvKGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICB2YXJpYWJsZXMuZmluZCgiZGlzYW1iaWd1YXRlZF9yZWFzb24iKTsKKyAgaWYgKGl0ICE9IHZhcmlhYmxlcy5lbmQoKSAmJiAhaXQtPnNlY29uZC5lbXB0eSgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlcywKKyAgICAgICAgIi8vIEFuIGFsdGVybmF0aXZlIG5hbWUgaXMgdXNlZCBmb3IgZmllbGQgXCIkZmllbGRfbmFtZSRcIiBiZWNhdXNlOlxuIgorICAgICAgICAiLy8gICAgICRkaXNhbWJpZ3VhdGVkX3JlYXNvbiRcbiIpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTEyNWYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9GSUVMRF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRklFTERfSF9fCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKK2NsYXNzIENvbnRleHQ7ICAgICAgICAgICAgLy8gY29udGV4dC5oCitjbGFzcyBDbGFzc05hbWVSZXNvbHZlcjsgIC8vIG5hbWVfcmVzb2x2ZXIuaAorfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorbmFtZXNwYWNlIGlvIHsKK2NsYXNzIFByaW50ZXI7ICAvLyBwcmludGVyLmgKK30KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitjbGFzcyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBJbW11dGFibGVGaWVsZEdlbmVyYXRvcigpIHt9CisgIHZpcnR1YWwgfkltbXV0YWJsZUZpZWxkR2VuZXJhdG9yKCk7CisKKyAgdmlydHVhbCBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVCdWlsZGVyUGFyc2luZ0NvZGVGcm9tUGFja2VkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZSgKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRCb3hlZFR5cGUoKSBjb25zdCA9IDA7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IpOworfTsKKworY2xhc3MgSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIEltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvcigpIHt9CisgIHZpcnR1YWwgfkltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvcigpOworCisgIHZpcnR1YWwgaW50IEdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUZpZWxkSW5mbyhpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0ID0gMDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IpOworfTsKKworCisvLyBDb252ZW5pZW5jZSBjbGFzcyB3aGljaCBjb25zdHJ1Y3RzIEZpZWxkR2VuZXJhdG9ycyBmb3IgYSBEZXNjcmlwdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIEZpZWxkR2VuZXJhdG9yVHlwZT4KK2NsYXNzIEZpZWxkR2VuZXJhdG9yTWFwIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEZpZWxkR2VuZXJhdG9yTWFwKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIENvbnRleHQqIGNvbnRleHQpOworICB+RmllbGRHZW5lcmF0b3JNYXAoKTsKKworICBjb25zdCBGaWVsZEdlbmVyYXRvclR5cGUmIGdldChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RmllbGRHZW5lcmF0b3JUeXBlPj4gZmllbGRfZ2VuZXJhdG9yc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpZWxkR2VuZXJhdG9yTWFwKTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGaWVsZEdlbmVyYXRvclR5cGU+CitpbmxpbmUgY29uc3QgRmllbGRHZW5lcmF0b3JUeXBlJiBGaWVsZEdlbmVyYXRvck1hcDxGaWVsZEdlbmVyYXRvclR5cGU+OjpnZXQoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBHT09HTEVfQ0hFQ0tfRVEoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLCBkZXNjcmlwdG9yXyk7CisgIHJldHVybiAqZmllbGRfZ2VuZXJhdG9yc19bZmllbGQtPmluZGV4KCldOworfQorCisvLyBJbnN0YW50aWF0ZSB0ZW1wbGF0ZSBmb3IgbXV0YWJsZSBhbmQgaW1tdXRhYmxlIG1hcHMuCit0ZW1wbGF0ZSA8PgorRmllbGRHZW5lcmF0b3JNYXA8SW1tdXRhYmxlRmllbGRHZW5lcmF0b3I+OjpGaWVsZEdlbmVyYXRvck1hcCgKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBDb250ZXh0KiBjb250ZXh0KTsKKwordGVtcGxhdGUgPD4KK0ZpZWxkR2VuZXJhdG9yTWFwPEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yPjo6fkZpZWxkR2VuZXJhdG9yTWFwKCk7CisKKwordGVtcGxhdGUgPD4KK0ZpZWxkR2VuZXJhdG9yTWFwPEltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvcj46OkZpZWxkR2VuZXJhdG9yTWFwKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIENvbnRleHQqIGNvbnRleHQpOworCit0ZW1wbGF0ZSA8PgorRmllbGRHZW5lcmF0b3JNYXA8SW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yPjo6fkZpZWxkR2VuZXJhdG9yTWFwKCk7CisKKworLy8gRmllbGQgaW5mb3JtYXRpb24gdXNlZCBpbiBGaWVsZEdlbmVyYXRvcnMuCitzdHJ1Y3QgRmllbGRHZW5lcmF0b3JJbmZvIHsKKyAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgc3RkOjpzdHJpbmcgY2FwaXRhbGl6ZWRfbmFtZTsKKyAgc3RkOjpzdHJpbmcgZGlzYW1iaWd1YXRlZF9yZWFzb247Cit9OworCisvLyBPbmVvZiBpbmZvcm1hdGlvbiB1c2VkIGluIE9uZW9mRmllbGRHZW5lcmF0b3JzLgorc3RydWN0IE9uZW9mR2VuZXJhdG9ySW5mbyB7CisgIHN0ZDo6c3RyaW5nIG5hbWU7CisgIHN0ZDo6c3RyaW5nIGNhcGl0YWxpemVkX25hbWU7Cit9OworCisvLyBTZXQgc29tZSBjb21tb24gdmFyaWFibGVzIHVzZWQgaW4gdmFyaWFibGUgRmllbGRHZW5lcmF0b3JzLgordm9pZCBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzKTsKKworLy8gU2V0IHNvbWUgY29tbW9uIG9uZW9mIHZhcmlhYmxlcyB1c2VkIGluIE9uZW9mRmllbGRHZW5lcmF0b3JzLgordm9pZCBTZXRDb21tb25PbmVvZlZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9uZW9mR2VuZXJhdG9ySW5mbyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzKTsKKworLy8gUHJpbnQgdXNlZnVsIGNvbW1lbnRzIGJlZm9yZSBhIGZpZWxkJ3MgYWNjZXNzb3JzLgordm9pZCBQcmludEV4dHJhRmllbGRJbmZvKGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcik7CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0ZJRUxEX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpbGUuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZmlsZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI3NzAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpbGUuY2MKQEAgLTAsMCArMSw3MzkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpbGUuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9leHRlbnNpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3JfZmFjdG9yeS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZV9yZXNvbHZlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3NlcnZpY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zaGFyZWRfY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorCisvLyBNdXN0IGJlIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworbmFtZXNwYWNlIHsKKworc3RydWN0IEZpZWxkRGVzY3JpcHRvckNvbXBhcmUgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmMSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmMikgY29uc3QgeworICAgIGlmIChmMSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChmMiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGYxLT5mdWxsX25hbWUoKSA8IGYyLT5mdWxsX25hbWUoKTsKKyAgfQorfTsKKwordHlwZWRlZiBzdGQ6OnNldDxjb25zdCBGaWVsZERlc2NyaXB0b3IqLCBGaWVsZERlc2NyaXB0b3JDb21wYXJlPgorICAgIEZpZWxkRGVzY3JpcHRvclNldDsKKworLy8gUmVjdXJzaXZlbHkgc2VhcmNoZXMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gY29sbGVjdCBleHRlbnNpb25zLgorLy8gUmV0dXJucyB0cnVlIGlmIGFsbCB0aGUgZXh0ZW5zaW9ucyBjYW4gYmUgcmVjb2duaXplZC4gVGhlIGV4dGVuc2lvbnMgd2lsbCBiZQorLy8gYXBwZW5kZWQgaW4gdG8gdGhlIGV4dGVuc2lvbnMgcGFyYW1ldGVyLgorLy8gUmV0dXJucyBmYWxzZSB3aGVuIHRoZXJlIGFyZSB1bmtub3duIGZpZWxkcywgaW4gd2hpY2ggY2FzZSB0aGUgZGF0YSBpbiB0aGUKKy8vIGV4dGVuc2lvbnMgb3V0cHV0IHBhcmFtZXRlciBpcyBub3QgcmVsaWFibGUgYW5kIHNob3VsZCBiZSBkaXNjYXJkZWQuCitib29sIENvbGxlY3RFeHRlbnNpb25zKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIEZpZWxkRGVzY3JpcHRvclNldCogZXh0ZW5zaW9ucykgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisKKyAgLy8gVGhlcmUgYXJlIHVua25vd24gZmllbGRzIHRoYXQgY291bGQgYmUgZXh0ZW5zaW9ucywgdGh1cyB0aGlzIGNhbGwgZmFpbHMuCisgIGlmIChyZWZsZWN0aW9uLT5HZXRVbmtub3duRmllbGRzKG1lc3NhZ2UpLmZpZWxkX2NvdW50KCkgPiAwKSByZXR1cm4gZmFsc2U7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1lc3NhZ2UsICZmaWVsZHMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKGZpZWxkc1tpXS0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAgIGV4dGVuc2lvbnMtPmluc2VydChmaWVsZHNbaV0pOworICAgIH0KKworICAgIGlmIChHZXRKYXZhVHlwZShmaWVsZHNbaV0pID09IEpBVkFUWVBFX01FU1NBR0UpIHsKKyAgICAgIGlmIChmaWVsZHNbaV0tPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgaW50IHNpemUgPSByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgZmllbGRzW2ldKTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9CisgICAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBmaWVsZHNbaV0sIGopOworICAgICAgICAgIGlmICghQ29sbGVjdEV4dGVuc2lvbnMoc3ViX21lc3NhZ2UsIGV4dGVuc2lvbnMpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBmaWVsZHNbaV0pOworICAgICAgICBpZiAoIUNvbGxlY3RFeHRlbnNpb25zKHN1Yl9tZXNzYWdlLCBleHRlbnNpb25zKSkgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBGaW5kcyBhbGwgZXh0ZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgaXRzIHN1Yi1tZXNzYWdlcy4gIElmIHRoZQorLy8gbWVzc2FnZSBjb250YWlucyB1bmtub3duIGZpZWxkcyAod2hpY2ggY291bGQgYmUgZXh0ZW5zaW9ucyksIHRoZW4gdGhvc2UKKy8vIGV4dGVuc2lvbnMgYXJlIGRlZmluZWQgaW4gYWx0ZXJuYXRlX3Bvb2wuCisvLyBUaGUgbWVzc2FnZSB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIER5bmFtaWNNZXNzYWdlIGJhY2tlZCBieSBhbHRlcm5hdGVfcG9vbAorLy8gaW4gb3JkZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4KK3ZvaWQgQ29sbGVjdEV4dGVuc2lvbnMoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZmlsZV9wcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclBvb2wmIGFsdGVybmF0ZV9wb29sLAorICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JTZXQqIGV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX2RhdGEpIHsKKyAgaWYgKCFDb2xsZWN0RXh0ZW5zaW9ucyhmaWxlX3Byb3RvLCBleHRlbnNpb25zKSkgeworICAgIC8vIFRoZXJlIGFyZSB1bmtub3duIGZpZWxkcyBpbiB0aGUgZmlsZV9wcm90bywgd2hpY2ggYXJlIHByb2JhYmx5CisgICAgLy8gZXh0ZW5zaW9ucy4gV2UgbmVlZCB0byBwYXJzZSB0aGUgZGF0YSBpbnRvIGEgZHluYW1pYyBtZXNzYWdlIGJhc2VkIG9uIHRoZQorICAgIC8vIGJ1aWxkZXItcG9vbCB0byBmaW5kIG91dCBhbGwgZXh0ZW5zaW9ucy4KKyAgICBjb25zdCBEZXNjcmlwdG9yKiBmaWxlX3Byb3RvX2Rlc2MgPSBhbHRlcm5hdGVfcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCisgICAgICAgIGZpbGVfcHJvdG8uR2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKSk7CisgICAgR09PR0xFX0NIRUNLKGZpbGVfcHJvdG9fZGVzYykKKyAgICAgICAgPDwgIkZpbmQgdW5rbm93biBmaWVsZHMgaW4gRmlsZURlc2NyaXB0b3JQcm90byB3aGVuIGJ1aWxkaW5nICIKKyAgICAgICAgPDwgZmlsZV9wcm90by5uYW1lKCkKKyAgICAgICAgPDwgIi4gSXQncyBsaWtlbHkgdGhhdCB0aG9zZSBmaWVsZHMgYXJlIGN1c3RvbSBvcHRpb25zLCBob3dldmVyLCAiCisgICAgICAgICAgICJkZXNjcmlwdG9yLnByb3RvIGlzIG5vdCBpbiB0aGUgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMuICIKKyAgICAgICAgICAgIlRoaXMgbm9ybWFsbHkgc2hvdWxkIG5vdCBoYXBwZW4uIFBsZWFzZSByZXBvcnQgYSBidWcuIjsKKyAgICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZmFjdG9yeTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gZHluYW1pY19maWxlX3Byb3RvKAorICAgICAgICBmYWN0b3J5LkdldFByb3RvdHlwZShmaWxlX3Byb3RvX2Rlc2MpLT5OZXcoKSk7CisgICAgR09PR0xFX0NIRUNLKGR5bmFtaWNfZmlsZV9wcm90by5nZXQoKSAhPSBOVUxMKTsKKyAgICBHT09HTEVfQ0hFQ0soZHluYW1pY19maWxlX3Byb3RvLT5QYXJzZUZyb21TdHJpbmcoZmlsZV9kYXRhKSk7CisKKyAgICAvLyBDb2xsZWN0IHRoZSBleHRlbnNpb25zIGFnYWluIGZyb20gdGhlIGR5bmFtaWMgbWVzc2FnZS4gVGhlcmUgc2hvdWxkIGJlIG5vCisgICAgLy8gbW9yZSB1bmtub3duIGZpZWxkcyB0aGlzIHRpbWUsIGkuZS4gYWxsIHRoZSBjdXN0b20gb3B0aW9ucyBzaG91bGQgYmUKKyAgICAvLyBwYXJzZWQgYXMgZXh0ZW5zaW9ucyBub3cuCisgICAgZXh0ZW5zaW9ucy0+Y2xlYXIoKTsKKyAgICBHT09HTEVfQ0hFQ0soQ29sbGVjdEV4dGVuc2lvbnMoKmR5bmFtaWNfZmlsZV9wcm90bywgZXh0ZW5zaW9ucykpCisgICAgICAgIDw8ICJGaW5kIHVua25vd24gZmllbGRzIGluIEZpbGVEZXNjcmlwdG9yUHJvdG8gd2hlbiBidWlsZGluZyAiCisgICAgICAgIDw8IGZpbGVfcHJvdG8ubmFtZSgpCisgICAgICAgIDw8ICIuIEl0J3MgbGlrZWx5IHRoYXQgdGhvc2UgZmllbGRzIGFyZSBjdXN0b20gb3B0aW9ucywgaG93ZXZlciwgIgorICAgICAgICAgICAidGhvc2Ugb3B0aW9ucyBjYW5ub3QgYmUgcmVjb2duaXplZCBpbiB0aGUgYnVpbGRlciBwb29sLiAiCisgICAgICAgICAgICJUaGlzIG5vcm1hbGx5IHNob3VsZCBub3QgaGFwcGVuLiBQbGVhc2UgcmVwb3J0IGEgYnVnLiI7CisgIH0KK30KKworLy8gT3VyIHN0YXRpYyBpbml0aWFsaXphdGlvbiBtZXRob2RzIGNhbiBiZWNvbWUgdmVyeSwgdmVyeSBsYXJnZS4KKy8vIFNvIGxhcmdlIHRoYXQgaWYgd2UgYXJlbid0IGNhcmVmdWwgd2UgZW5kIHVwIGJsb3dpbmcgdGhlIEpWTSdzCisvLyA2NEsgYnl0ZXMgb2YgYnl0ZWNvZGUvbWV0aG9kLiBGb3J0dW5hdGVseSwgc2luY2UgdGhlc2Ugc3RhdGljCisvLyBtZXRob2RzIGFyZSBleGVjdXRlZCBvbmx5IG9uY2UgbmVhciB0aGUgYmVnaW5uaW5nIG9mIGEgcHJvZ3JhbSwKKy8vIHRoZXJlJ3MgdXN1YWxseSBwbGVudHkgb2Ygc3RhY2sgc3BhY2UgYXZhaWxhYmxlIGFuZCB3ZSBjYW4KKy8vIGV4dGVuZCBvdXIgbWV0aG9kcyBieSBzaW1wbHkgY2hhaW5pbmcgdGhlbSB0byBhbm90aGVyIG1ldGhvZAorLy8gd2l0aCBhIHRhaWwgY2FsbC4gVGhpcyBpbnNlcnRzIHRoZSBzZXF1ZW5jZSBjYWxsLW5leHQtbWV0aG9kLAorLy8gZW5kIHRoaXMgb25lLCBiZWdpbi1uZXh0LW1ldGhvZCBhcyBuZWVkZWQuCit2b2lkIE1heWJlUmVzdGFydEphdmFNZXRob2QoaW86OlByaW50ZXIqIHByaW50ZXIsIGludCogYnl0ZWNvZGVfZXN0aW1hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBtZXRob2RfbnVtLCBjb25zdCBjaGFyKiBjaGFpbl9zdGF0ZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWV0aG9kX2RlY2wpIHsKKyAgLy8gVGhlIGdvYWwgaGVyZSBpcyB0byBzdGF5IHVuZGVyIDY0SyBieXRlcyBvZiBqdm0gYnl0ZWNvZGUvbWV0aG9kLAorICAvLyBzaW5jZSBvdGhlcndpc2Ugd2UgaGl0IGEgaGFyZGNvZGVkIGxpbWl0IGluIHRoZSBqdm0gYW5kIGphdmFjIHdpbGwKKyAgLy8gdGhlbiBmYWlsIHdpdGggdGhlIGVycm9yICJjb2RlIHRvbyBsYXJnZSIuIFRoaXMgbGltaXQgbGV0cyBvdXIKKyAgLy8gZXN0aW1hdGVzIGJlIG9mZiBieSBhIGZhY3RvciBvZiB0d28gYW5kIHN0aWxsIHdlJ3JlIG9rYXkuCisgIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJNZXRob2QgPSBrTWF4U3RhdGljU2l6ZTsKKworICBpZiAoKCpieXRlY29kZV9lc3RpbWF0ZSkgPiBieXRlc1Blck1ldGhvZCkgeworICAgICsrKCptZXRob2RfbnVtKTsKKyAgICBwcmludGVyLT5QcmludChjaGFpbl9zdGF0ZW1lbnQsICJtZXRob2RfbnVtIiwgU3RyQ2F0KCptZXRob2RfbnVtKSk7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgICBwcmludGVyLT5QcmludChtZXRob2RfZGVjbCwgIm1ldGhvZF9udW0iLCBTdHJDYXQoKm1ldGhvZF9udW0pKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAqYnl0ZWNvZGVfZXN0aW1hdGUgPSAwOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworRmlsZUdlbmVyYXRvcjo6RmlsZUdlbmVyYXRvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW11dGFibGVfYXBpKQorICAgIDogZmlsZV8oZmlsZSksCisgICAgICBqYXZhX3BhY2thZ2VfKEZpbGVKYXZhUGFja2FnZShmaWxlLCBpbW11dGFibGVfYXBpKSksCisgICAgICBtZXNzYWdlX2dlbmVyYXRvcnNfKGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpKSwKKyAgICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzXyhmaWxlLT5leHRlbnNpb25fY291bnQoKSksCisgICAgICBjb250ZXh0XyhuZXcgQ29udGV4dChmaWxlLCBvcHRpb25zKSksCisgICAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0Xy0+R2V0TmFtZVJlc29sdmVyKCkpLAorICAgICAgb3B0aW9uc18ob3B0aW9ucyksCisgICAgICBpbW11dGFibGVfYXBpXyhpbW11dGFibGVfYXBpKSB7CisgIGNsYXNzbmFtZV8gPSBuYW1lX3Jlc29sdmVyXy0+R2V0RmlsZUNsYXNzTmFtZShmaWxlLCBpbW11dGFibGVfYXBpKTsKKyAgZ2VuZXJhdG9yX2ZhY3RvcnlfLnJlc2V0KG5ldyBJbW11dGFibGVHZW5lcmF0b3JGYWN0b3J5KGNvbnRleHRfLmdldCgpKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLnJlc2V0KAorICAgICAgICBnZW5lcmF0b3JfZmFjdG9yeV8tPk5ld01lc3NhZ2VHZW5lcmF0b3IoZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKKyAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0ucmVzZXQoCisgICAgICAgIGdlbmVyYXRvcl9mYWN0b3J5Xy0+TmV3RXh0ZW5zaW9uR2VuZXJhdG9yKGZpbGVfLT5leHRlbnNpb24oaSkpKTsKKyAgfQorfQorCitGaWxlR2VuZXJhdG9yOjp+RmlsZUdlbmVyYXRvcigpIHt9CisKK2Jvb2wgRmlsZUdlbmVyYXRvcjo6VmFsaWRhdGUoc3RkOjpzdHJpbmcqIGVycm9yKSB7CisgIC8vIENoZWNrIHRoYXQgbm8gY2xhc3MgbmFtZSBtYXRjaGVzIHRoZSBmaWxlJ3MgY2xhc3MgbmFtZS4gIFRoaXMgaXMgYSBjb21tb24KKyAgLy8gcHJvYmxlbSB0aGF0IGxlYWRzIHRvIEphdmEgY29tcGlsZSBlcnJvcnMgdGhhdCBjYW4gYmUgaGFyZCB0byB1bmRlcnN0YW5kLgorICAvLyBJdCdzIGVzcGVjaWFsbHkgYmFkIHdoZW4gdXNpbmcgdGhlIGphdmFfbXVsdGlwbGVfZmlsZXMsIHNpbmNlIHdlIHdvdWxkCisgIC8vIGVuZCB1cCBvdmVyd3JpdGluZyB0aGUgb3V0ZXIgY2xhc3Mgd2l0aCBvbmUgb2YgdGhlIGlubmVyIG9uZXMuCisgIGlmIChuYW1lX3Jlc29sdmVyXy0+SGFzQ29uZmxpY3RpbmdDbGFzc05hbWUoZmlsZV8sIGNsYXNzbmFtZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZUVxdWFsaXR5OjpFWEFDVF9FUVVBTCkpIHsKKyAgICBlcnJvci0+YXNzaWduKGZpbGVfLT5uYW1lKCkpOworICAgIGVycm9yLT5hcHBlbmQoCisgICAgICAgICI6IENhbm5vdCBnZW5lcmF0ZSBKYXZhIG91dHB1dCBiZWNhdXNlIHRoZSBmaWxlJ3Mgb3V0ZXIgY2xhc3MgbmFtZSwgIgorICAgICAgICAiXCIiKTsKKyAgICBlcnJvci0+YXBwZW5kKGNsYXNzbmFtZV8pOworICAgIGVycm9yLT5hcHBlbmQoCisgICAgICAgICJcIiwgbWF0Y2hlcyB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHR5cGVzIGRlY2xhcmVkIGluc2lkZSBpdC4gICIKKyAgICAgICAgIlBsZWFzZSBlaXRoZXIgcmVuYW1lIHRoZSB0eXBlIG9yIHVzZSB0aGUgamF2YV9vdXRlcl9jbGFzc25hbWUgIgorICAgICAgICAib3B0aW9uIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgb3V0ZXIgY2xhc3MgbmFtZSBmb3IgdGhlIC5wcm90byBmaWxlLiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBTaW1pbGFyIHRvIHRoZSBjaGVjayBhYm92ZSwgYnV0IGlnbm9yZSB0aGUgY2FzZSB0aGlzIHRpbWUuIFRoaXMgaXMgbm90IGEKKyAgLy8gcHJvYmxlbSBvbiBMaW51eCwgYnV0IHdpbGwgbGVhZCB0byBKYXZhIGNvbXBpbGUgZXJyb3JzIG9uIFdpbmRvd3MgLyBNYWMKKyAgLy8gYmVjYXVzZSBmaWxlbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgb24gdGhvc2UgcGxhdGZvcm1zLgorICBpZiAobmFtZV9yZXNvbHZlcl8tPkhhc0NvbmZsaWN0aW5nQ2xhc3NOYW1lKAorICAgICAgICAgIGZpbGVfLCBjbGFzc25hbWVfLCBOYW1lRXF1YWxpdHk6OkVRVUFMX0lHTk9SRV9DQVNFKSkgeworICAgIEdPT0dMRV9MT0coV0FSTklORykKKyAgICAgICAgPDwgZmlsZV8tPm5hbWUoKSA8PCAiOiBUaGUgZmlsZSdzIG91dGVyIGNsYXNzIG5hbWUsIFwiIiA8PCBjbGFzc25hbWVfCisgICAgICAgIDw8ICJcIiwgbWF0Y2hlcyB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHR5cGVzIGRlY2xhcmVkIGluc2lkZSBpdCB3aGVuICIKKyAgICAgICAgPDwgImNhc2UgaXMgaWdub3JlZC4gVGhpcyBjYW4gY2F1c2UgY29tcGlsYXRpb24gaXNzdWVzIG9uIFdpbmRvd3MgLyAiCisgICAgICAgIDw8ICJNYWNPUy4gUGxlYXNlIGVpdGhlciByZW5hbWUgdGhlIHR5cGUgb3IgdXNlIHRoZSAiCisgICAgICAgIDw8ICJqYXZhX291dGVyX2NsYXNzbmFtZSBvcHRpb24gdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBvdXRlciBjbGFzcyAiCisgICAgICAgIDw8ICJuYW1lIGZvciB0aGUgLnByb3RvIGZpbGUgdG8gYmUgc2FmZS4iOworICB9CisKKyAgLy8gUHJpbnQgYSB3YXJuaW5nIGlmIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSBpcyB1c2VkLgorICBpZiAoZmlsZV8tPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSA9PSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FICYmCisgICAgICAhb3B0aW9uc18uZW5mb3JjZV9saXRlKSB7CisgICAgR09PR0xFX0xPRyhXQVJOSU5HKQorICAgICAgICA8PCAiVGhlIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSBvcHRpb24gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSAiCisgICAgICAgIDw8ICJwcm90b2J1ZiBKYXZhIGNvZGUgZ2VuZXJhdG9yIGFuZCBpcyBpZ25vcmVkLS1wcm90b2Mgd2lsbCBhbHdheXMgIgorICAgICAgICA8PCAiZ2VuZXJhdGUgZnVsbCBydW50aW1lIGNvZGUgZm9yIEphdmEuIFRvIHVzZSBKYXZhIExpdGUgcnVudGltZSwgIgorICAgICAgICA8PCAidXNlcnMgc2hvdWxkIHVzZSB0aGUgSmF2YSBMaXRlIHBsdWdpbiBpbnN0ZWFkLiBTZWU6XG4iCisgICAgICAgIDw8ICIgICIKKyAgICAgICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvYmxvYi9tYWluL2phdmEvIgorICAgICAgICAgICAibGl0ZS5tZCI7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gV2UgZG9uJ3QgaW1wb3J0IGFueXRoaW5nIGJlY2F1c2Ugd2UgcmVmZXIgdG8gYWxsIGNsYXNzZXMgYnkgdGhlaXIKKyAgLy8gZnVsbHktcXVhbGlmaWVkIG5hbWVzIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLgorICBwcmludGVyLT5QcmludCgKKyAgICAgICIvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIVxuIgorICAgICAgIi8vIHNvdXJjZTogJGZpbGVuYW1lJFxuIgorICAgICAgIlxuIiwKKyAgICAgICJmaWxlbmFtZSIsIGZpbGVfLT5uYW1lKCkpOworICBpZiAoIWphdmFfcGFja2FnZV8uZW1wdHkoKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicGFja2FnZSAkcGFja2FnZSQ7XG4iCisgICAgICAgICJcbiIsCisgICAgICAgICJwYWNrYWdlIiwgamF2YV9wYWNrYWdlXyk7CisgIH0KKyAgUHJpbnRHZW5lcmF0ZWRBbm5vdGF0aW9uKAorICAgICAgcHJpbnRlciwgJyQnLCBvcHRpb25zXy5hbm5vdGF0ZV9jb2RlID8gY2xhc3NuYW1lXyArICIuamF2YS5wYi5tZXRhIiA6ICIiKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGZpbmFsIGNsYXNzICRjbGFzc25hbWUkIHtcbiIKKyAgICAgICIgIHByaXZhdGUgJGN0b3IkKCkge31cbiIsCisgICAgICAiZGVwcmVjYXRpb24iLAorICAgICAgZmlsZV8tPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkICIgOiAiIiwKKyAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLCAiY3RvciIsIGNsYXNzbmFtZV8pOworICBwcmludGVyLT5Bbm5vdGF0ZSgiY2xhc3NuYW1lIiwgZmlsZV8tPm5hbWUoKSk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgcmVnaXN0cnkpIHtcbiIpOworCisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZShwcmludGVyKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbkNvZGUocHJpbnRlcik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBjb250ZXh0Xy0+RW5mb3JjZUxpdGUoKSkpIHsKKyAgICAvLyBPdmVybG9hZCByZWdpc3RlckFsbEV4dGVuc2lvbnMgZm9yIHRoZSBub24tbGl0ZSB1c2FnZSB0bworICAgIC8vIHJlZHVuZGFudGx5IG1haW50YWluIHRoZSBvcmlnaW5hbCBzaWduYXR1cmUgKHRoaXMgaXMKKyAgICAvLyByZWR1bmRhbnQgYmVjYXVzZSBFeHRlbnNpb25SZWdpc3RyeUxpdGUgbm93IGludm9rZXMKKyAgICAvLyBFeHRlbnNpb25SZWdpc3RyeSBpbiB0aGUgbm9uLWxpdGUgdXNhZ2UpLiBJbnRlbnQgaXMKKyAgICAvLyB0byByZW1vdmUgdGhpcyBpbiB0aGUgZnV0dXJlLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJBbGxFeHRlbnNpb25zKFxuIgorICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHtcbiIKKyAgICAgICAgIiAgcmVnaXN0ZXJBbGxFeHRlbnNpb25zKFxuIgorICAgICAgICAiICAgICAgKGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKSByZWdpc3RyeSk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgaWYgKCFNdWx0aXBsZUphdmFGaWxlcyhmaWxlXywgaW1tdXRhYmxlX2FwaV8pKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBjb250ZXh0Xy0+RW5mb3JjZUxpdGUoKSkpIHsKKyAgICAgICAgRW51bUdlbmVyYXRvcihmaWxlXy0+ZW51bV90eXBlKGkpLCBpbW11dGFibGVfYXBpXywgY29udGV4dF8uZ2V0KCkpCisgICAgICAgICAgICAuR2VuZXJhdGUocHJpbnRlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBFbnVtTGl0ZUdlbmVyYXRvcihmaWxlXy0+ZW51bV90eXBlKGkpLCBpbW11dGFibGVfYXBpXywgY29udGV4dF8uZ2V0KCkpCisgICAgICAgICAgICAuR2VuZXJhdGUocHJpbnRlcik7CisgICAgICB9CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlSW50ZXJmYWNlKHByaW50ZXIpOworICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGUocHJpbnRlcik7CisgICAgfQorICAgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8sIGNvbnRleHRfLT5FbmZvcmNlTGl0ZSgpKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFNlcnZpY2VHZW5lcmF0b3I+IGdlbmVyYXRvcigKKyAgICAgICAgICAgIGdlbmVyYXRvcl9mYWN0b3J5Xy0+TmV3U2VydmljZUdlbmVyYXRvcihmaWxlXy0+c2VydmljZShpKSkpOworICAgICAgICBnZW5lcmF0b3ItPkdlbmVyYXRlKHByaW50ZXIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEV4dGVuc2lvbnMgbXVzdCBiZSBnZW5lcmF0ZWQgaW4gdGhlIG91dGVyIGNsYXNzIHNpbmNlIHRoZXkgYXJlIHZhbHVlcywKKyAgLy8gbm90IGNsYXNzZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlKHByaW50ZXIpOworICB9CisKKyAgLy8gU3RhdGljIHZhcmlhYmxlcy4gV2UnZCBsaWtlIHRoZW0gdG8gYmUgZmluYWwgaWYgcG9zc2libGUsIGJ1dCBkdWUgdG8KKyAgLy8gdGhlIEpWTSdzIDY0ayBzaXplIGxpbWl0IG9uIHN0YXRpYyBibG9ja3MsIHdlIGhhdmUgdG8gaW5pdGlhbGl6ZSBzb21lCisgIC8vIG9mIHRoZW0gaW4gbWV0aG9kczsgdGh1cyB0aGV5IGNhbm5vdCBiZSBmaW5hbC4KKyAgaW50IHN0YXRpY19ibG9ja19ieXRlY29kZV9lc3RpbWF0ZSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlcygKKyAgICAgICAgcHJpbnRlciwgJnN0YXRpY19ibG9ja19ieXRlY29kZV9lc3RpbWF0ZSk7CisgIH0KKworICBwcmludGVyLT5QcmludCgiXG4iKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8sIGNvbnRleHRfLT5FbmZvcmNlTGl0ZSgpKSkgeworICAgIGlmIChpbW11dGFibGVfYXBpXykgeworICAgICAgR2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6YXRpb25Db2RlRm9ySW1tdXRhYmxlKHByaW50ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBHZW5lcmF0ZURlc2NyaXB0b3JJbml0aWFsaXphdGlvbkNvZGVGb3JNdXRhYmxlKHByaW50ZXIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgic3RhdGljIHtcbiIpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIGludCBieXRlY29kZV9lc3RpbWF0ZSA9IDA7CisgICAgaW50IG1ldGhvZF9udW0gPSAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgYnl0ZWNvZGVfZXN0aW1hdGUgKz0KKyAgICAgICAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKHByaW50ZXIpOworICAgICAgTWF5YmVSZXN0YXJ0SmF2YU1ldGhvZCgKKyAgICAgICAgICBwcmludGVyLCAmYnl0ZWNvZGVfZXN0aW1hdGUsICZtZXRob2RfbnVtLAorICAgICAgICAgICJfY2xpbml0X2F1dG9zcGxpdF8kbWV0aG9kX251bSQoKTtcbiIsCisgICAgICAgICAgInByaXZhdGUgc3RhdGljIHZvaWQgX2NsaW5pdF9hdXRvc3BsaXRfJG1ldGhvZF9udW0kKCkge1xuIik7CisgICAgfQorCisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICAgIlxuIgorICAgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChvdXRlcl9jbGFzc19zY29wZSlcbiIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemF0aW9uQ29kZUZvckltbXV0YWJsZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwdWJsaWMgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3JcbiIKKyAgICAgICIgICAgZ2V0RGVzY3JpcHRvcigpIHtcbiIKKyAgICAgICIgIHJldHVybiBkZXNjcmlwdG9yO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJwcml2YXRlIHN0YXRpYyAkZmluYWwkIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3JcbiIKKyAgICAgICIgICAgZGVzY3JpcHRvcjtcbiIKKyAgICAgICJzdGF0aWMge1xuIiwKKyAgICAgIC8vIFRPRE8oZHdlaXMpOiBNYXJrIHRoaXMgYXMgZmluYWwuCisgICAgICAiZmluYWwiLCAiIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIFNoYXJlZENvZGVHZW5lcmF0b3Igc2hhcmVkX2NvZGVfZ2VuZXJhdG9yKGZpbGVfLCBvcHRpb25zXyk7CisgIHNoYXJlZF9jb2RlX2dlbmVyYXRvci5HZW5lcmF0ZURlc2NyaXB0b3JzKHByaW50ZXIpOworCisgIGludCBieXRlY29kZV9lc3RpbWF0ZSA9IDA7CisgIGludCBtZXRob2RfbnVtID0gMDsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgYnl0ZWNvZGVfZXN0aW1hdGUgKz0KKyAgICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycyhwcmludGVyKTsKKyAgICBNYXliZVJlc3RhcnRKYXZhTWV0aG9kKAorICAgICAgICBwcmludGVyLCAmYnl0ZWNvZGVfZXN0aW1hdGUsICZtZXRob2RfbnVtLAorICAgICAgICAiX2NsaW5pdF9hdXRvc3BsaXRfZGluaXRfJG1ldGhvZF9udW0kKCk7XG4iLAorICAgICAgICAicHJpdmF0ZSBzdGF0aWMgdm9pZCBfY2xpbml0X2F1dG9zcGxpdF9kaW5pdF8kbWV0aG9kX251bSQoKSB7XG4iKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgYnl0ZWNvZGVfZXN0aW1hdGUgKz0KKyAgICAgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZU5vbk5lc3RlZEluaXRpYWxpemF0aW9uQ29kZShwcmludGVyKTsKKyAgICBNYXliZVJlc3RhcnRKYXZhTWV0aG9kKAorICAgICAgICBwcmludGVyLCAmYnl0ZWNvZGVfZXN0aW1hdGUsICZtZXRob2RfbnVtLAorICAgICAgICAiX2NsaW5pdF9hdXRvc3BsaXRfZGluaXRfJG1ldGhvZF9udW0kKCk7XG4iLAorICAgICAgICAicHJpdmF0ZSBzdGF0aWMgdm9pZCBfY2xpbml0X2F1dG9zcGxpdF9kaW5pdF8kbWV0aG9kX251bSQoKSB7XG4iKTsKKyAgfQorCisgIC8vIFByb3RvIGNvbXBpbGVyIGJ1aWxkcyBhIERlc2NyaXB0b3JQb29sLCB3aGljaCBob2xkcyBhbGwgdGhlIGRlc2NyaXB0b3JzIHRvCisgIC8vIGdlbmVyYXRlLCB3aGVuIHByb2Nlc3NpbmcgdGhlICIucHJvdG8iIGZpbGVzLiBXZSBjYWxsIHRoaXMgRGVzY3JpcHRvclBvb2wKKyAgLy8gdGhlIHBhcnNlZCBwb29sIChhLmsuYS4gZmlsZV8tPnBvb2woKSkuCisgIC8vCisgIC8vIE5vdGUgdGhhdCB3aGVuIHVzZXJzIHRyeSB0byBleHRlbmQgdGhlICguKilEZXNjcmlwdG9yUHJvdG8gaW4gdGhlaXIKKyAgLy8gIi5wcm90byIgZmlsZXMsIGl0IGRvZXMgbm90IGFmZmVjdCB0aGUgcHJlLWJ1aWx0IEZpbGVEZXNjcmlwdG9yUHJvdG8gY2xhc3MKKyAgLy8gaW4gcHJvdG8gY29tcGlsZXIuIFdoZW4gd2UgcHV0IHRoZSBkZXNjcmlwdG9yIGRhdGEgaW4gdGhlIGZpbGVfcHJvdG8sIHRob3NlCisgIC8vIGV4dGVuc2lvbnMgYmVjb21lIHVua25vd24gZmllbGRzLgorICAvLworICAvLyBOb3cgd2UgbmVlZCB0byBmaW5kIG91dCBhbGwgdGhlIGV4dGVuc2lvbiB2YWx1ZSB0byB0aGUgKC4qKURlc2NyaXB0b3JQcm90bworICAvLyBpbiB0aGUgZmlsZV9wcm90byBtZXNzYWdlLCBhbmQgcHJlcGFyZSBhbiBFeHRlbnNpb25SZWdpc3RyeSB0byByZXR1cm4uCisgIC8vCisgIC8vIFRvIGZpbmQgdGhvc2UgZXh0ZW5zaW9ucywgd2UgbmVlZCB0byBwYXJzZSB0aGUgZGF0YSBpbnRvIGEgZHluYW1pYyBtZXNzYWdlCisgIC8vIG9mIHRoZSBGaWxlRGVzY3JpcHRvciBiYXNlZCBvbiB0aGUgYnVpbGRlci1wb29sLCB0aGVuIHdlIGNhbiB1c2UKKyAgLy8gcmVmbGVjdGlvbnMgdG8gZmluZCBhbGwgZXh0ZW5zaW9uIGZpZWxkcworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIGZpbGVfLT5Db3B5VG8oJmZpbGVfcHJvdG8pOworICBzdGQ6OnN0cmluZyBmaWxlX2RhdGE7CisgIGZpbGVfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJmZpbGVfZGF0YSk7CisgIEZpZWxkRGVzY3JpcHRvclNldCBleHRlbnNpb25zOworICBDb2xsZWN0RXh0ZW5zaW9ucyhmaWxlX3Byb3RvLCAqZmlsZV8tPnBvb2woKSwgJmV4dGVuc2lvbnMsIGZpbGVfZGF0YSk7CisKKyAgaWYgKGV4dGVuc2lvbnMuc2l6ZSgpID4gMCkgeworICAgIC8vIE11c3QgY29uc3RydWN0IGFuIEV4dGVuc2lvblJlZ2lzdHJ5IGNvbnRhaW5pbmcgYWxsIGV4aXN0aW5nIGV4dGVuc2lvbnMKKyAgICAvLyBhbmQgdXNlIGl0IHRvIHBhcnNlIHRoZSBkZXNjcmlwdG9yIGRhdGEgYWdhaW4gdG8gcmVjb2duaXplIGV4dGVuc2lvbnMuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID1cbiIKKyAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7XG4iKTsKKyAgICBGaWVsZERlc2NyaXB0b3JTZXQ6Oml0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBleHRlbnNpb25zLmJlZ2luKCk7IGl0ICE9IGV4dGVuc2lvbnMuZW5kKCk7IGl0KyspIHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxFeHRlbnNpb25HZW5lcmF0b3I+IGdlbmVyYXRvcigKKyAgICAgICAgICBnZW5lcmF0b3JfZmFjdG9yeV8tPk5ld0V4dGVuc2lvbkdlbmVyYXRvcigqaXQpKTsKKyAgICAgIGJ5dGVjb2RlX2VzdGltYXRlICs9IGdlbmVyYXRvci0+R2VuZXJhdGVSZWdpc3RyYXRpb25Db2RlKHByaW50ZXIpOworICAgICAgTWF5YmVSZXN0YXJ0SmF2YU1ldGhvZCgKKyAgICAgICAgICBwcmludGVyLCAmYnl0ZWNvZGVfZXN0aW1hdGUsICZtZXRob2RfbnVtLAorICAgICAgICAgICJfY2xpbml0X2F1dG9zcGxpdF9kaW5pdF8kbWV0aG9kX251bSQocmVnaXN0cnkpO1xuIiwKKyAgICAgICAgICAicHJpdmF0ZSBzdGF0aWMgdm9pZCBfY2xpbml0X2F1dG9zcGxpdF9kaW5pdF8kbWV0aG9kX251bSQoXG4iCisgICAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7XG4iKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yXG4iCisgICAgICAgICIgICAgLmludGVybmFsVXBkYXRlRmlsZURlc2NyaXB0b3IoZGVzY3JpcHRvciwgcmVnaXN0cnkpO1xuIik7CisgIH0KKworICAvLyBGb3JjZSBkZXNjcmlwdG9yIGluaXRpYWxpemF0aW9uIG9mIGFsbCBkZXBlbmRlbmNpZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKFNob3VsZEluY2x1ZGVEZXBlbmRlbmN5KGZpbGVfLT5kZXBlbmRlbmN5KGkpLCB0cnVlKSkgeworICAgICAgc3RkOjpzdHJpbmcgZGVwZW5kZW5jeSA9CisgICAgICAgICAgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShmaWxlXy0+ZGVwZW5kZW5jeShpKSk7CisgICAgICBwcmludGVyLT5QcmludCgiJGRlcGVuZGVuY3kkLmdldERlc2NyaXB0b3IoKTtcbiIsICJkZXBlbmRlbmN5IiwKKyAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kpOworICAgIH0KKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemF0aW9uQ29kZUZvck11dGFibGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yXG4iCisgICAgICAiICAgIGdldERlc2NyaXB0b3IoKSB7XG4iCisgICAgICAiICByZXR1cm4gZGVzY3JpcHRvcjtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvclxuIgorICAgICAgIiAgICBkZXNjcmlwdG9yO1xuIgorICAgICAgInN0YXRpYyB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiZGVzY3JpcHRvciA9ICRpbW11dGFibGVfcGFja2FnZSQuJGRlc2NyaXB0b3JfY2xhc3NuYW1lJC5kZXNjcmlwdG9yO1xuIiwKKyAgICAgICJpbW11dGFibGVfcGFja2FnZSIsIEZpbGVKYXZhUGFja2FnZShmaWxlXywgdHJ1ZSksICJkZXNjcmlwdG9yX2NsYXNzbmFtZSIsCisgICAgICBuYW1lX3Jlc29sdmVyXy0+R2V0RGVzY3JpcHRvckNsYXNzTmFtZShmaWxlXykpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKHByaW50ZXIpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlTm9uTmVzdGVkSW5pdGlhbGl6YXRpb25Db2RlKHByaW50ZXIpOworICB9CisKKyAgLy8gQ2hlY2sgaWYgY3VzdG9tIG9wdGlvbnMgZXhpc3QuIElmIGFueSwgdHJ5IHRvIGxvYWQgaW1tdXRhYmxlIGNsYXNzZXMgc2luY2UKKyAgLy8gY3VzdG9tIG9wdGlvbnMgYXJlIG9ubHkgcmVwcmVzZW50ZWQgd2l0aCBpbW11dGFibGUgbWVzc2FnZXMuCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgZmlsZV8tPkNvcHlUbygmZmlsZV9wcm90byk7CisgIHN0ZDo6c3RyaW5nIGZpbGVfZGF0YTsKKyAgZmlsZV9wcm90by5TZXJpYWxpemVUb1N0cmluZygmZmlsZV9kYXRhKTsKKyAgRmllbGREZXNjcmlwdG9yU2V0IGV4dGVuc2lvbnM7CisgIENvbGxlY3RFeHRlbnNpb25zKGZpbGVfcHJvdG8sICpmaWxlXy0+cG9vbCgpLCAmZXh0ZW5zaW9ucywgZmlsZV9kYXRhKTsKKworICBpZiAoZXh0ZW5zaW9ucy5zaXplKCkgPiAwKSB7CisgICAgLy8gVHJ5IHRvIGxvYWQgaW1tdXRhYmxlIG1lc3NhZ2VzJyBvdXRlciBjbGFzcy4gSXRzIGluaXRpYWxpemF0aW9uIGNvZGUKKyAgICAvLyB3aWxsIHRha2UgY2FyZSBvZiBpbnRlcnByZXRpbmcgY3VzdG9tIG9wdGlvbnMuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ0cnkge1xuIgorICAgICAgICAvLyBOb3RlIHRoYXQgd2UgaGF2ZSB0byBsb2FkIHRoZSBpbW11dGFibGUgY2xhc3MgZHluYW1pY2FsbHkgaGVyZSBhcworICAgICAgICAvLyB3ZSB3YW50IHRoZSBtdXRhYmxlIGNvZGUgdG8gYmUgaW5kZXBlbmRlbnQgZnJvbSB0aGUgaW1tdXRhYmxlIGNvZGUKKyAgICAgICAgLy8gYXQgY29tcGlsZSB0aW1lLiBJdCBpcyByZXF1aXJlZCB0byBpbXBsZW1lbnQgZHVhbC1jb21waWxlIGZvcgorICAgICAgICAvLyBtdXRhYmxlIGFuZCBpbW11dGFibGUgQVBJIGluIGJsYXplLgorICAgICAgICAiICBqYXZhLmxhbmcuQ2xhc3M8Pz4gaW1tdXRhYmxlQ2xhc3MgPSBqYXZhLmxhbmcuQ2xhc3MuZm9yTmFtZShcbiIKKyAgICAgICAgIiAgICAgIFwiJGltbXV0YWJsZV9jbGFzc25hbWUkXCIpO1xuIgorICAgICAgICAifSBjYXRjaCAoamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkge1xuIiwKKyAgICAgICAgImltbXV0YWJsZV9jbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGZpbGVfKSk7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgICAvLyBUaGUgaW1tdXRhYmxlIGNsYXNzIGNhbiBub3QgYmUgZm91bmQuIFdlIHRyeSBvdXIgYmVzdCB0byBjb2xsZWN0IGFsbAorICAgIC8vIGN1c3RvbSBvcHRpb24gZXh0ZW5zaW9ucyB0byBpbnRlcnByZXQgdGhlIGN1c3RvbSBvcHRpb25zLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9XG4iCisgICAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeS5uZXdJbnN0YW5jZSgpO1xuIgorICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlTGl0ZSBkZWZhdWx0RXh0ZW5zaW9uSW5zdGFuY2UgPSBudWxsO1xuIik7CisgICAgRmllbGREZXNjcmlwdG9yU2V0OjppdGVyYXRvciBpdDsKKyAgICBmb3IgKGl0ID0gZXh0ZW5zaW9ucy5iZWdpbigpOyBpdCAhPSBleHRlbnNpb25zLmVuZCgpOyBpdCsrKSB7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gKml0OworICAgICAgc3RkOjpzdHJpbmcgc2NvcGU7CisgICAgICBpZiAoZmllbGQtPmV4dGVuc2lvbl9zY29wZSgpICE9IE5VTEwpIHsKKyAgICAgICAgc2NvcGUgPSBuYW1lX3Jlc29sdmVyXy0+R2V0TXV0YWJsZUNsYXNzTmFtZShmaWVsZC0+ZXh0ZW5zaW9uX3Njb3BlKCkpICsKKyAgICAgICAgICAgICAgICAiLmdldERlc2NyaXB0b3IoKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBzY29wZSA9IEZpbGVKYXZhUGFja2FnZShmaWVsZC0+ZmlsZSgpLCB0cnVlKSArICIuIiArCisgICAgICAgICAgICAgICAgbmFtZV9yZXNvbHZlcl8tPkdldERlc2NyaXB0b3JDbGFzc05hbWUoZmllbGQtPmZpbGUoKSkgKworICAgICAgICAgICAgICAgICIuZGVzY3JpcHRvciI7CisgICAgICB9CisgICAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAiZGVmYXVsdEV4dGVuc2lvbkluc3RhbmNlID0gY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbFxuIgorICAgICAgICAgICAgIiAgICAuZ2V0RGVmYXVsdEluc3RhbmNlKFwiJGNsYXNzJFwiKTtcbiIKKyAgICAgICAgICAgICJpZiAoZGVmYXVsdEV4dGVuc2lvbkluc3RhbmNlICE9IG51bGwpIHtcbiIKKyAgICAgICAgICAgICIgIHJlZ2lzdHJ5LmFkZChcbiIKKyAgICAgICAgICAgICIgICAgICAkc2NvcGUkLmdldEV4dGVuc2lvbnMoKS5nZXQoJGluZGV4JCksXG4iCisgICAgICAgICAgICAiICAgICAgKGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZSkgZGVmYXVsdEV4dGVuc2lvbkluc3RhbmNlKTtcbiIKKyAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgInNjb3BlIiwgc2NvcGUsICJpbmRleCIsIFN0ckNhdChmaWVsZC0+aW5kZXgoKSksICJjbGFzcyIsCisgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoInJlZ2lzdHJ5LmFkZCgkc2NvcGUkLmdldEV4dGVuc2lvbnMoKS5nZXQoJGluZGV4JCkpO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgInNjb3BlIiwgc2NvcGUsICJpbmRleCIsIFN0ckNhdChmaWVsZC0+aW5kZXgoKSkpOworICAgICAgfQorICAgIH0KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3JcbiIKKyAgICAgICAgIiAgICAuaW50ZXJuYWxVcGRhdGVGaWxlRGVzY3JpcHRvcihkZXNjcmlwdG9yLCByZWdpc3RyeSk7XG4iKTsKKworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgIH0KKworICAvLyBGb3JjZSBkZXNjcmlwdG9yIGluaXRpYWxpemF0aW9uIG9mIGFsbCBkZXBlbmRlbmNpZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKFNob3VsZEluY2x1ZGVEZXBlbmRlbmN5KGZpbGVfLT5kZXBlbmRlbmN5KGkpLCBmYWxzZSkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGRlcGVuZGVuY3kgPQorICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLT5HZXRNdXRhYmxlQ2xhc3NOYW1lKGZpbGVfLT5kZXBlbmRlbmN5KGkpKTsKKyAgICAgIHByaW50ZXItPlByaW50KCIkZGVwZW5kZW5jeSQuZ2V0RGVzY3JpcHRvcigpO1xuIiwgImRlcGVuZGVuY3kiLAorICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeSk7CisgICAgfQorICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3JDbGFzcywgdHlwZW5hbWUgRGVzY3JpcHRvckNsYXNzPgorc3RhdGljIHZvaWQgR2VuZXJhdGVTaWJsaW5nKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlX2RpciwgY29uc3Qgc3RkOjpzdHJpbmcmIGphdmFfcGFja2FnZSwKKyAgICBjb25zdCBEZXNjcmlwdG9yQ2xhc3MqIGRlc2NyaXB0b3IsIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBmaWxlX2xpc3QsIGJvb2wgYW5ub3RhdGVfY29kZSwKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGFubm90YXRpb25fbGlzdCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWVfc3VmZml4LAorICAgIEdlbmVyYXRvckNsYXNzKiBnZW5lcmF0b3IsCisgICAgdm9pZCAoR2VuZXJhdG9yQ2xhc3M6OipwZm4pKGlvOjpQcmludGVyKiBwcmludGVyKSkgeworICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9CisgICAgICBwYWNrYWdlX2RpciArIGRlc2NyaXB0b3ItPm5hbWUoKSArIG5hbWVfc3VmZml4ICsgIi5qYXZhIjsKKyAgZmlsZV9saXN0LT5wdXNoX2JhY2soZmlsZW5hbWUpOworICBzdGQ6OnN0cmluZyBpbmZvX2Z1bGxfcGF0aCA9IGZpbGVuYW1lICsgIi5wYi5tZXRhIjsKKyAgR2VuZXJhdGVkQ29kZUluZm8gYW5ub3RhdGlvbnM7CisgIGlvOjpBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGFubm90YXRpb25fY29sbGVjdG9yKAorICAgICAgJmFubm90YXRpb25zKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoY29udGV4dC0+T3BlbihmaWxlbmFtZSkpOworICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnLAorICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRlX2NvZGUgPyAmYW5ub3RhdGlvbl9jb2xsZWN0b3IgOiBOVUxMKTsKKworICBwcmludGVyLlByaW50KAorICAgICAgIi8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhXG4iCisgICAgICAiLy8gc291cmNlOiAkZmlsZW5hbWUkXG4iCisgICAgICAiXG4iLAorICAgICAgImZpbGVuYW1lIiwgZGVzY3JpcHRvci0+ZmlsZSgpLT5uYW1lKCkpOworICBpZiAoIWphdmFfcGFja2FnZS5lbXB0eSgpKSB7CisgICAgcHJpbnRlci5QcmludCgKKyAgICAgICAgInBhY2thZ2UgJHBhY2thZ2UkO1xuIgorICAgICAgICAiXG4iLAorICAgICAgICAicGFja2FnZSIsIGphdmFfcGFja2FnZSk7CisgIH0KKworICAoZ2VuZXJhdG9yLT4qcGZuKSgmcHJpbnRlcik7CisKKyAgaWYgKGFubm90YXRlX2NvZGUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBpbmZvX291dHB1dCgKKyAgICAgICAgY29udGV4dC0+T3BlbihpbmZvX2Z1bGxfcGF0aCkpOworICAgIGFubm90YXRpb25zLlNlcmlhbGl6ZVRvWmVyb0NvcHlTdHJlYW0oaW5mb19vdXRwdXQuZ2V0KCkpOworICAgIGFubm90YXRpb25fbGlzdC0+cHVzaF9iYWNrKGluZm9fZnVsbF9wYXRoKTsKKyAgfQorfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlU2libGluZ3MoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2VfZGlyLCBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogZmlsZV9saXN0LAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogYW5ub3RhdGlvbl9saXN0KSB7CisgIGlmIChNdWx0aXBsZUphdmFGaWxlcyhmaWxlXywgaW1tdXRhYmxlX2FwaV8pKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBjb250ZXh0Xy0+RW5mb3JjZUxpdGUoKSkpIHsKKyAgICAgICAgRW51bUdlbmVyYXRvciBnZW5lcmF0b3IoZmlsZV8tPmVudW1fdHlwZShpKSwgaW1tdXRhYmxlX2FwaV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfLmdldCgpKTsKKyAgICAgICAgR2VuZXJhdGVTaWJsaW5nPEVudW1HZW5lcmF0b3I+KAorICAgICAgICAgICAgcGFja2FnZV9kaXIsIGphdmFfcGFja2FnZV8sIGZpbGVfLT5lbnVtX3R5cGUoaSksIGNvbnRleHQsIGZpbGVfbGlzdCwKKyAgICAgICAgICAgIG9wdGlvbnNfLmFubm90YXRlX2NvZGUsIGFubm90YXRpb25fbGlzdCwgIiIsICZnZW5lcmF0b3IsCisgICAgICAgICAgICAmRW51bUdlbmVyYXRvcjo6R2VuZXJhdGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRW51bUxpdGVHZW5lcmF0b3IgZ2VuZXJhdG9yKGZpbGVfLT5lbnVtX3R5cGUoaSksIGltbXV0YWJsZV9hcGlfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF8uZ2V0KCkpOworICAgICAgICBHZW5lcmF0ZVNpYmxpbmc8RW51bUxpdGVHZW5lcmF0b3I+KAorICAgICAgICAgICAgcGFja2FnZV9kaXIsIGphdmFfcGFja2FnZV8sIGZpbGVfLT5lbnVtX3R5cGUoaSksIGNvbnRleHQsIGZpbGVfbGlzdCwKKyAgICAgICAgICAgIG9wdGlvbnNfLmFubm90YXRlX2NvZGUsIGFubm90YXRpb25fbGlzdCwgIiIsICZnZW5lcmF0b3IsCisgICAgICAgICAgICAmRW51bUxpdGVHZW5lcmF0b3I6OkdlbmVyYXRlKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgaWYgKGltbXV0YWJsZV9hcGlfKSB7CisgICAgICAgIEdlbmVyYXRlU2libGluZzxNZXNzYWdlR2VuZXJhdG9yPigKKyAgICAgICAgICAgIHBhY2thZ2VfZGlyLCBqYXZhX3BhY2thZ2VfLCBmaWxlXy0+bWVzc2FnZV90eXBlKGkpLCBjb250ZXh0LAorICAgICAgICAgICAgZmlsZV9saXN0LCBvcHRpb25zXy5hbm5vdGF0ZV9jb2RlLCBhbm5vdGF0aW9uX2xpc3QsICJPckJ1aWxkZXIiLAorICAgICAgICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS5nZXQoKSwgJk1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJmYWNlKTsKKyAgICAgIH0KKyAgICAgIEdlbmVyYXRlU2libGluZzxNZXNzYWdlR2VuZXJhdG9yPigKKyAgICAgICAgICBwYWNrYWdlX2RpciwgamF2YV9wYWNrYWdlXywgZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSwgY29udGV4dCwKKyAgICAgICAgICBmaWxlX2xpc3QsIG9wdGlvbnNfLmFubm90YXRlX2NvZGUsIGFubm90YXRpb25fbGlzdCwgIiIsCisgICAgICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS5nZXQoKSwgJk1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlKTsKKyAgICB9CisgICAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlXywgY29udGV4dF8tPkVuZm9yY2VMaXRlKCkpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5zZXJ2aWNlX2NvdW50KCk7IGkrKykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U2VydmljZUdlbmVyYXRvcj4gZ2VuZXJhdG9yKAorICAgICAgICAgICAgZ2VuZXJhdG9yX2ZhY3RvcnlfLT5OZXdTZXJ2aWNlR2VuZXJhdG9yKGZpbGVfLT5zZXJ2aWNlKGkpKSk7CisgICAgICAgIEdlbmVyYXRlU2libGluZzxTZXJ2aWNlR2VuZXJhdG9yPigKKyAgICAgICAgICAgIHBhY2thZ2VfZGlyLCBqYXZhX3BhY2thZ2VfLCBmaWxlXy0+c2VydmljZShpKSwgY29udGV4dCwgZmlsZV9saXN0LAorICAgICAgICAgICAgb3B0aW9uc18uYW5ub3RhdGVfY29kZSwgYW5ub3RhdGlvbl9saXN0LCAiIiwgZ2VuZXJhdG9yLmdldCgpLAorICAgICAgICAgICAgJlNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RkOjpzdHJpbmcgRmlsZUdlbmVyYXRvcjo6R2V0S290bGluQ2xhc3NuYW1lKCkgeworICByZXR1cm4gbmFtZV9yZXNvbHZlcl8tPkdldEZpbGVDbGFzc05hbWUoZmlsZV8sIGltbXV0YWJsZV9hcGlfLCB0cnVlKTsKK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZUtvdGxpblNpYmxpbmdzKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlX2RpciwgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGZpbGVfbGlzdCwKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGFubm90YXRpb25fbGlzdCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IGZpbGVfLT5tZXNzYWdlX3R5cGUoaSk7CisgICAgTWVzc2FnZUdlbmVyYXRvciogZ2VuZXJhdG9yID0gbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS5nZXQoKTsKKyAgICBhdXRvIG9wZW5fZmlsZSA9IFtjb250ZXh0XShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKKyAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPihjb250ZXh0LT5PcGVuKGZpbGVuYW1lKSk7CisgICAgfTsKKyAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IHBhY2thZ2VfZGlyICsgZGVzY3JpcHRvci0+bmFtZSgpICsgIkt0Lmt0IjsKKyAgICBmaWxlX2xpc3QtPnB1c2hfYmFjayhmaWxlbmFtZSk7CisgICAgc3RkOjpzdHJpbmcgaW5mb19mdWxsX3BhdGggPSBmaWxlbmFtZSArICIucGIubWV0YSI7CisgICAgR2VuZXJhdGVkQ29kZUluZm8gYW5ub3RhdGlvbnM7CisgICAgaW86OkFubm90YXRpb25Qcm90b0NvbGxlY3RvcjxHZW5lcmF0ZWRDb2RlSW5mbz4gYW5ub3RhdGlvbl9jb2xsZWN0b3IoCisgICAgICAgICZhbm5vdGF0aW9ucyk7CisgICAgYXV0byBvdXRwdXQgPSBvcGVuX2ZpbGUoZmlsZW5hbWUpOworICAgIGlvOjpQcmludGVyIHByaW50ZXIoCisgICAgICAgIG91dHB1dC5nZXQoKSwgJyQnLAorICAgICAgICBvcHRpb25zXy5hbm5vdGF0ZV9jb2RlID8gJmFubm90YXRpb25fY29sbGVjdG9yIDogbnVsbHB0cik7CisKKyAgICBwcmludGVyLlByaW50KAorICAgICAgICAiLy9HZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gRE8gTk9UIEVESVQhXG4iCisgICAgICAgICIvLyBzb3VyY2U6ICRmaWxlbmFtZSRcbiIKKyAgICAgICAgIlxuIiwKKyAgICAgICAgImZpbGVuYW1lIiwgZGVzY3JpcHRvci0+ZmlsZSgpLT5uYW1lKCkpOworICAgIGlmICghamF2YV9wYWNrYWdlXy5lbXB0eSgpKSB7CisgICAgICBwcmludGVyLlByaW50KAorICAgICAgICAgICJwYWNrYWdlICRwYWNrYWdlJDtcbiIKKyAgICAgICAgICAiXG4iLAorICAgICAgICAgICJwYWNrYWdlIiwgamF2YV9wYWNrYWdlXyk7CisgICAgfQorCisgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZUtvdGxpbk1lbWJlcnMoJnByaW50ZXIpOworICAgIGdlbmVyYXRvci0+R2VuZXJhdGVUb3BMZXZlbEtvdGxpbk1lbWJlcnMoJnByaW50ZXIpOworCisgICAgaWYgKG9wdGlvbnNfLmFubm90YXRlX2NvZGUpIHsKKyAgICAgIGF1dG8gaW5mb19vdXRwdXQgPSBvcGVuX2ZpbGUoaW5mb19mdWxsX3BhdGgpOworICAgICAgYW5ub3RhdGlvbnMuU2VyaWFsaXplVG9aZXJvQ29weVN0cmVhbShpbmZvX291dHB1dC5nZXQoKSk7CisgICAgICBhbm5vdGF0aW9uX2xpc3QtPnB1c2hfYmFjayhpbmZvX2Z1bGxfcGF0aCk7CisgICAgfQorICB9Cit9CisKK2Jvb2wgRmlsZUdlbmVyYXRvcjo6U2hvdWxkSW5jbHVkZURlcGVuZGVuY3koY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW1tdXRhYmxlX2FwaSkgeworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZmlsZS5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmUwMzczCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpbGUuaApAQCAtMCwwICsxLDEyNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0ZJTEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0ZJTEVfSF9fCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9vcHRpb25zLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK2NsYXNzIEZpbGVEZXNjcmlwdG9yOyAgLy8gZGVzY3JpcHRvci5oCituYW1lc3BhY2UgaW8geworY2xhc3MgUHJpbnRlcjsgIC8vIHByaW50ZXIuaAorfQorbmFtZXNwYWNlIGNvbXBpbGVyIHsKK2NsYXNzIEdlbmVyYXRvckNvbnRleHQ7ICAvLyBjb2RlX2dlbmVyYXRvci5oCituYW1lc3BhY2UgamF2YSB7CitjbGFzcyBDb250ZXh0OyAgICAgICAgICAgICAvLyBjb250ZXh0LmgKK2NsYXNzIE1lc3NhZ2VHZW5lcmF0b3I7ICAgIC8vIG1lc3NhZ2UuaAorY2xhc3MgR2VuZXJhdG9yRmFjdG9yeTsgICAgLy8gZ2VuZXJhdG9yX2ZhY3RvcnkuaAorY2xhc3MgRXh0ZW5zaW9uR2VuZXJhdG9yOyAgLy8gZXh0ZW5zaW9uLmgKK2NsYXNzIENsYXNzTmFtZVJlc29sdmVyOyAgIC8vIG5hbWVfcmVzb2x2ZXIuaAorfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK2NsYXNzIEZpbGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgRmlsZUdlbmVyYXRvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZV9hcGkgPSB0cnVlKTsKKyAgfkZpbGVHZW5lcmF0b3IoKTsKKworICAvLyBDaGVja3MgZm9yIHByb2JsZW1zIHRoYXQgd291bGQgb3RoZXJ3aXNlIGxlYWQgdG8gY3J5cHRpYyBjb21waWxlIGVycm9ycy4KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBubyBwcm9ibGVtcywgb3Igd3JpdGVzIGFuIGVycm9yIGRlc2NyaXB0aW9uIHRvCisgIC8vIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIFZhbGlkYXRlKHN0ZDo6c3RyaW5nKiBlcnJvcik7CisKKyAgdm9pZCBHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgc3RkOjpzdHJpbmcgR2V0S290bGluQ2xhc3NuYW1lKCk7CisgIHZvaWQgR2VuZXJhdGVLb3RsaW5TaWJsaW5ncyhjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogZmlsZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBhbm5vdGF0aW9uX2xpc3QpOworCisgIC8vIElmIHdlIGFyZW4ndCBwdXR0aW5nIGV2ZXJ5dGhpbmcgaW50byBvbmUgZmlsZSwgdGhpcyB3aWxsIHdyaXRlIGFsbCB0aGUKKyAgLy8gZmlsZXMgb3RoZXIgdGhhbiB0aGUgb3V0ZXIgZmlsZSAoaS5lLiBvbmUgZm9yIGVhY2ggbWVzc2FnZSwgZW51bSwgYW5kCisgIC8vIHNlcnZpY2UgdHlwZSkuCisgIHZvaWQgR2VuZXJhdGVTaWJsaW5ncyhjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogZmlsZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBhbm5vdGF0aW9uX2xpc3QpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBqYXZhX3BhY2thZ2UoKSB7IHJldHVybiBqYXZhX3BhY2thZ2VfOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjbGFzc25hbWUoKSB7IHJldHVybiBjbGFzc25hbWVfOyB9CisKKyBwcml2YXRlOgorICB2b2lkIEdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemF0aW9uQ29kZUZvckltbXV0YWJsZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6YXRpb25Db2RlRm9yTXV0YWJsZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgYm9vbCBTaG91bGRJbmNsdWRlRGVwZW5kZW5jeShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZV9hcGlfKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisgIHN0ZDo6c3RyaW5nIGphdmFfcGFja2FnZV87CisgIHN0ZDo6c3RyaW5nIGNsYXNzbmFtZV87CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2VHZW5lcmF0b3I+PiBtZXNzYWdlX2dlbmVyYXRvcnNfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RXh0ZW5zaW9uR2VuZXJhdG9yPj4gZXh0ZW5zaW9uX2dlbmVyYXRvcnNfOworICBzdGQ6OnVuaXF1ZV9wdHI8R2VuZXJhdG9yRmFjdG9yeT4gZ2VuZXJhdG9yX2ZhY3RvcnlfOworICBzdGQ6OnVuaXF1ZV9wdHI8Q29udGV4dD4gY29udGV4dF87CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKKyAgY29uc3QgT3B0aW9ucyBvcHRpb25zXzsKKyAgYm9vbCBpbW11dGFibGVfYXBpXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmlsZUdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9GSUxFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvci5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVlMzk5MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyMTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvci5oPgorCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3JfZmFjdG9yeS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lX3Jlc29sdmVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvb3B0aW9ucy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3NoYXJlZF9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCisKK0phdmFHZW5lcmF0b3I6OkphdmFHZW5lcmF0b3IoKSB7fQorSmF2YUdlbmVyYXRvcjo6fkphdmFHZW5lcmF0b3IoKSB7fQorCit1aW50NjRfdCBKYXZhR2VuZXJhdG9yOjpHZXRTdXBwb3J0ZWRGZWF0dXJlcygpIGNvbnN0IHsKKyAgcmV0dXJuIENvZGVHZW5lcmF0b3I6OkZlYXR1cmU6OkZFQVRVUkVfUFJPVE8zX09QVElPTkFMOworfQorCitib29sIEphdmFHZW5lcmF0b3I6OkdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZXJyb3IpIGNvbnN0IHsKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gcGFyc2UgZ2VuZXJhdG9yIG9wdGlvbnMKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiA+IG9wdGlvbnM7CisgIFBhcnNlR2VuZXJhdG9yUGFyYW1ldGVyKHBhcmFtZXRlciwgJm9wdGlvbnMpOworICBPcHRpb25zIGZpbGVfb3B0aW9uczsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG9wdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAib3V0cHV0X2xpc3RfZmlsZSIpIHsKKyAgICAgIGZpbGVfb3B0aW9ucy5vdXRwdXRfbGlzdF9maWxlID0gb3B0aW9uc1tpXS5zZWNvbmQ7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJpbW11dGFibGUiKSB7CisgICAgICBmaWxlX29wdGlvbnMuZ2VuZXJhdGVfaW1tdXRhYmxlX2NvZGUgPSB0cnVlOworICAgIH0gZWxzZSBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAibXV0YWJsZSIpIHsKKyAgICAgIGZpbGVfb3B0aW9ucy5nZW5lcmF0ZV9tdXRhYmxlX2NvZGUgPSB0cnVlOworICAgIH0gZWxzZSBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAic2hhcmVkIikgeworICAgICAgZmlsZV9vcHRpb25zLmdlbmVyYXRlX3NoYXJlZF9jb2RlID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImxpdGUiKSB7CisgICAgICAvLyBOb3RlOiBKYXZhIExpdGUgZG9lcyBub3QgZ3VhcmFudGVlIEFQSS9BQkkgc3RhYmlsaXR5LiBXZSBtYXkgY2hvb3NlIHRvCisgICAgICAvLyBicmVhayBleGlzdGluZyBBUEkgaW4gb3JkZXIgdG8gYm9vc3QgcGVyZm9ybWFuY2UgLyByZWR1Y2UgY29kZSBzaXplLgorICAgICAgZmlsZV9vcHRpb25zLmVuZm9yY2VfbGl0ZSA9IHRydWU7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJhbm5vdGF0ZV9jb2RlIikgeworICAgICAgZmlsZV9vcHRpb25zLmFubm90YXRlX2NvZGUgPSB0cnVlOworICAgIH0gZWxzZSBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAiYW5ub3RhdGlvbl9saXN0X2ZpbGUiKSB7CisgICAgICBmaWxlX29wdGlvbnMuYW5ub3RhdGlvbl9saXN0X2ZpbGUgPSBvcHRpb25zW2ldLnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgKmVycm9yID0gIlVua25vd24gZ2VuZXJhdG9yIG9wdGlvbjogIiArIG9wdGlvbnNbaV0uZmlyc3Q7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgaWYgKGZpbGVfb3B0aW9ucy5lbmZvcmNlX2xpdGUgJiYgZmlsZV9vcHRpb25zLmdlbmVyYXRlX211dGFibGVfY29kZSkgeworICAgICplcnJvciA9ICJsaXRlIHJ1bnRpbWUgZ2VuZXJhdG9yIG9wdGlvbiBjYW5ub3QgYmUgdXNlZCB3aXRoIG11dGFibGUgQVBJLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQnkgZGVmYXVsdCB3ZSBnZW5lcmF0ZSBpbW11dGFibGUgY29kZSBhbmQgc2hhcmVkIGNvZGUgZm9yIGltbXV0YWJsZSBBUEkuCisgIGlmICghZmlsZV9vcHRpb25zLmdlbmVyYXRlX2ltbXV0YWJsZV9jb2RlICYmCisgICAgICAhZmlsZV9vcHRpb25zLmdlbmVyYXRlX211dGFibGVfY29kZSAmJgorICAgICAgIWZpbGVfb3B0aW9ucy5nZW5lcmF0ZV9zaGFyZWRfY29kZSkgeworICAgIGZpbGVfb3B0aW9ucy5nZW5lcmF0ZV9pbW11dGFibGVfY29kZSA9IHRydWU7CisgICAgZmlsZV9vcHRpb25zLmdlbmVyYXRlX3NoYXJlZF9jb2RlID0gdHJ1ZTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYWxsX2ZpbGVzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYWxsX2Fubm90YXRpb25zOworCisKKyAgc3RkOjp2ZWN0b3I8RmlsZUdlbmVyYXRvcio+IGZpbGVfZ2VuZXJhdG9yczsKKyAgaWYgKGZpbGVfb3B0aW9ucy5nZW5lcmF0ZV9pbW11dGFibGVfY29kZSkgeworICAgIGZpbGVfZ2VuZXJhdG9ycy5wdXNoX2JhY2sobmV3IEZpbGVHZW5lcmF0b3IoZmlsZSwgZmlsZV9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tdXRhYmxlID0gKi8gdHJ1ZSkpOworICB9CisgIGlmIChmaWxlX29wdGlvbnMuZ2VuZXJhdGVfbXV0YWJsZV9jb2RlKSB7CisgICAgZmlsZV9nZW5lcmF0b3JzLnB1c2hfYmFjayhuZXcgRmlsZUdlbmVyYXRvcihmaWxlLCBmaWxlX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXRhYmxlID0gKi8gZmFsc2UpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV9nZW5lcmF0b3JzLnNpemUoKTsgKytpKSB7CisgICAgaWYgKCFmaWxlX2dlbmVyYXRvcnNbaV0tPlZhbGlkYXRlKGVycm9yKSkgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmaWxlX2dlbmVyYXRvcnMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgZGVsZXRlIGZpbGVfZ2VuZXJhdG9yc1tqXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfZ2VuZXJhdG9ycy5zaXplKCk7ICsraSkgeworICAgIEZpbGVHZW5lcmF0b3IqIGZpbGVfZ2VuZXJhdG9yID0gZmlsZV9nZW5lcmF0b3JzW2ldOworCisgICAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXIgPSBKYXZhUGFja2FnZVRvRGlyKGZpbGVfZ2VuZXJhdG9yLT5qYXZhX3BhY2thZ2UoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBqYXZhX2ZpbGVuYW1lID0gcGFja2FnZV9kaXI7CisgICAgamF2YV9maWxlbmFtZSArPSBmaWxlX2dlbmVyYXRvci0+Y2xhc3NuYW1lKCk7CisgICAgamF2YV9maWxlbmFtZSArPSAiLmphdmEiOworICAgIGFsbF9maWxlcy5wdXNoX2JhY2soamF2YV9maWxlbmFtZSk7CisgICAgc3RkOjpzdHJpbmcgaW5mb19mdWxsX3BhdGggPSBqYXZhX2ZpbGVuYW1lICsgIi5wYi5tZXRhIjsKKyAgICBpZiAoZmlsZV9vcHRpb25zLmFubm90YXRlX2NvZGUpIHsKKyAgICAgIGFsbF9hbm5vdGF0aW9ucy5wdXNoX2JhY2soaW5mb19mdWxsX3BhdGgpOworICAgIH0KKworICAgIC8vIEdlbmVyYXRlIG1haW4gamF2YSBmaWxlLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgICAgY29udGV4dC0+T3BlbihqYXZhX2ZpbGVuYW1lKSk7CisgICAgR2VuZXJhdGVkQ29kZUluZm8gYW5ub3RhdGlvbnM7CisgICAgaW86OkFubm90YXRpb25Qcm90b0NvbGxlY3RvcjxHZW5lcmF0ZWRDb2RlSW5mbz4gYW5ub3RhdGlvbl9jb2xsZWN0b3IoCisgICAgICAgICZhbm5vdGF0aW9ucyk7CisgICAgaW86OlByaW50ZXIgcHJpbnRlcigKKyAgICAgICAgb3V0cHV0LmdldCgpLCAnJCcsCisgICAgICAgIGZpbGVfb3B0aW9ucy5hbm5vdGF0ZV9jb2RlID8gJmFubm90YXRpb25fY29sbGVjdG9yIDogTlVMTCk7CisKKyAgICBmaWxlX2dlbmVyYXRvci0+R2VuZXJhdGUoJnByaW50ZXIpOworCisgICAgLy8gR2VuZXJhdGUgc2libGluZyBmaWxlcy4KKyAgICBmaWxlX2dlbmVyYXRvci0+R2VuZXJhdGVTaWJsaW5ncyhwYWNrYWdlX2RpciwgY29udGV4dCwgJmFsbF9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxsX2Fubm90YXRpb25zKTsKKworICAgIGlmIChmaWxlX29wdGlvbnMuYW5ub3RhdGVfY29kZSkgeworICAgICAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gaW5mb19vdXRwdXQoCisgICAgICAgICAgY29udGV4dC0+T3BlbihpbmZvX2Z1bGxfcGF0aCkpOworICAgICAgYW5ub3RhdGlvbnMuU2VyaWFsaXplVG9aZXJvQ29weVN0cmVhbShpbmZvX291dHB1dC5nZXQoKSk7CisgICAgfQorICB9CisKKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfZ2VuZXJhdG9ycy5zaXplKCk7ICsraSkgeworICAgIGRlbGV0ZSBmaWxlX2dlbmVyYXRvcnNbaV07CisgIH0KKyAgZmlsZV9nZW5lcmF0b3JzLmNsZWFyKCk7CisKKyAgLy8gR2VuZXJhdGUgb3V0cHV0IGxpc3QgaWYgcmVxdWVzdGVkLgorICBpZiAoIWZpbGVfb3B0aW9ucy5vdXRwdXRfbGlzdF9maWxlLmVtcHR5KCkpIHsKKyAgICAvLyBHZW5lcmF0ZSBvdXRwdXQgbGlzdC4gIFRoaXMgaXMganVzdCBhIHNpbXBsZSB0ZXh0IGZpbGUgcGxhY2VkIGluIGEKKyAgICAvLyBkZXRlcm1pbmlzdGljIGxvY2F0aW9uIHdoaWNoIGxpc3RzIHRoZSAuamF2YSBmaWxlcyBiZWluZyBnZW5lcmF0ZWQuCisgICAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gc3JjbGlzdF9yYXdfb3V0cHV0KAorICAgICAgICBjb250ZXh0LT5PcGVuKGZpbGVfb3B0aW9ucy5vdXRwdXRfbGlzdF9maWxlKSk7CisgICAgaW86OlByaW50ZXIgc3JjbGlzdF9wcmludGVyKHNyY2xpc3RfcmF3X291dHB1dC5nZXQoKSwgJyQnKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbF9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgc3JjbGlzdF9wcmludGVyLlByaW50KCIkZmlsZW5hbWUkXG4iLCAiZmlsZW5hbWUiLCBhbGxfZmlsZXNbaV0pOworICAgIH0KKyAgfQorCisgIGlmICghZmlsZV9vcHRpb25zLmFubm90YXRpb25fbGlzdF9maWxlLmVtcHR5KCkpIHsKKyAgICAvLyBHZW5lcmF0ZSBvdXRwdXQgbGlzdC4gIFRoaXMgaXMganVzdCBhIHNpbXBsZSB0ZXh0IGZpbGUgcGxhY2VkIGluIGEKKyAgICAvLyBkZXRlcm1pbmlzdGljIGxvY2F0aW9uIHdoaWNoIGxpc3RzIHRoZSAuamF2YSBmaWxlcyBiZWluZyBnZW5lcmF0ZWQuCisgICAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gYW5ub3RhdGlvbl9saXN0X3Jhd19vdXRwdXQoCisgICAgICAgIGNvbnRleHQtPk9wZW4oZmlsZV9vcHRpb25zLmFubm90YXRpb25fbGlzdF9maWxlKSk7CisgICAgaW86OlByaW50ZXIgYW5ub3RhdGlvbl9saXN0X3ByaW50ZXIoYW5ub3RhdGlvbl9saXN0X3Jhd19vdXRwdXQuZ2V0KCksICckJyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxfYW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGFubm90YXRpb25fbGlzdF9wcmludGVyLlByaW50KCIkZmlsZW5hbWUkXG4iLCAiZmlsZW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2Fubm90YXRpb25zW2ldKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZ2VuZXJhdG9yLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjNzE3MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDc3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gR2VuZXJhdGVzIEphdmEgY29kZSBmb3IgYSBnaXZlbiAucHJvdG8gZmlsZS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9HRU5FUkFUT1JfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0dFTkVSQVRPUl9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKKy8vIENvZGVHZW5lcmF0b3IgaW1wbGVtZW50YXRpb24gd2hpY2ggZ2VuZXJhdGVzIEphdmEgY29kZS4gIElmIHlvdSBjcmVhdGUgeW91cgorLy8gb3duIHByb3RvY29sIGNvbXBpbGVyIGJpbmFyeSBhbmQgeW91IHdhbnQgaXQgdG8gc3VwcG9ydCBKYXZhIG91dHB1dCwgeW91CisvLyBjYW4gZG8gc28gYnkgcmVnaXN0ZXJpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBDb2RlR2VuZXJhdG9yIHdpdGggdGhlCisvLyBDb21tYW5kTGluZUludGVyZmFjZSBpbiB5b3VyIG1haW4oKSBmdW5jdGlvbi4KK2NsYXNzIFBST1RPQ19FWFBPUlQgSmF2YUdlbmVyYXRvciA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIEphdmFHZW5lcmF0b3IoKTsKKyAgfkphdmFHZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICAvLyBpbXBsZW1lbnRzIENvZGVHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIEdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsIHN0ZDo6c3RyaW5nKiBlcnJvcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdWludDY0X3QgR2V0U3VwcG9ydGVkRmVhdHVyZXMoKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhKYXZhR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0dFTkVSQVRPUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3JfZmFjdG9yeS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3JfZmFjdG9yeS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDUyNmJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvcl9mYWN0b3J5LmNjCkBAIC0wLDAgKzEsODYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGxpdWppc2lAZ29vZ2xlLmNvbSAoUGhlcmwgTGl1KQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZ2VuZXJhdG9yX2ZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZXh0ZW5zaW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZXh0ZW5zaW9uX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc2VydmljZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitHZW5lcmF0b3JGYWN0b3J5OjpHZW5lcmF0b3JGYWN0b3J5KCkge30KK0dlbmVyYXRvckZhY3Rvcnk6On5HZW5lcmF0b3JGYWN0b3J5KCkge30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbW11dGFibGVHZW5lcmF0b3JGYWN0b3J5OjpJbW11dGFibGVHZW5lcmF0b3JGYWN0b3J5KENvbnRleHQqIGNvbnRleHQpCisgICAgOiBjb250ZXh0Xyhjb250ZXh0KSB7fQorSW1tdXRhYmxlR2VuZXJhdG9yRmFjdG9yeTo6fkltbXV0YWJsZUdlbmVyYXRvckZhY3RvcnkoKSB7fQorCitNZXNzYWdlR2VuZXJhdG9yKiBJbW11dGFibGVHZW5lcmF0b3JGYWN0b3J5OjpOZXdNZXNzYWdlR2VuZXJhdG9yKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIGNvbnN0IHsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3IsIGNvbnRleHRfLT5FbmZvcmNlTGl0ZSgpKSkgeworICAgIHJldHVybiBuZXcgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcihkZXNjcmlwdG9yLCBjb250ZXh0Xyk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5ldyBJbW11dGFibGVNZXNzYWdlTGl0ZUdlbmVyYXRvcihkZXNjcmlwdG9yLCBjb250ZXh0Xyk7CisgIH0KK30KKworRXh0ZW5zaW9uR2VuZXJhdG9yKiBJbW11dGFibGVHZW5lcmF0b3JGYWN0b3J5OjpOZXdFeHRlbnNpb25HZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yLT5maWxlKCksIGNvbnRleHRfLT5FbmZvcmNlTGl0ZSgpKSkgeworICAgIHJldHVybiBuZXcgSW1tdXRhYmxlRXh0ZW5zaW9uR2VuZXJhdG9yKGRlc2NyaXB0b3IsIGNvbnRleHRfKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV3IEltbXV0YWJsZUV4dGVuc2lvbkxpdGVHZW5lcmF0b3IoZGVzY3JpcHRvciwgY29udGV4dF8pOworICB9Cit9CisKK1NlcnZpY2VHZW5lcmF0b3IqIEltbXV0YWJsZUdlbmVyYXRvckZhY3Rvcnk6Ok5ld1NlcnZpY2VHZW5lcmF0b3IoCisgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yKGRlc2NyaXB0b3IsIGNvbnRleHRfKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3JfZmFjdG9yeS5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvcl9mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3YmNhMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3JfZmFjdG9yeS5oCkBAIC0wLDAgKzEsMTAzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBsaXVqaXNpQGdvb2dsZS5jb20gKFBoZXJsIExpdSkKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9HRU5FUkFUT1JfRkFDVE9SWV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfR0VORVJBVE9SX0ZBQ1RPUllfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK2NsYXNzIEZpZWxkRGVzY3JpcHRvcjsgICAgLy8gZGVzY3JpcHRvci5oCitjbGFzcyBEZXNjcmlwdG9yOyAgICAgICAgIC8vIGRlc2NyaXB0b3IuaAorY2xhc3MgU2VydmljZURlc2NyaXB0b3I7ICAvLyBkZXNjcmlwdG9yLmgKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CitjbGFzcyBNZXNzYWdlR2VuZXJhdG9yOyAgICAvLyBtZXNzYWdlLmgKK2NsYXNzIEV4dGVuc2lvbkdlbmVyYXRvcjsgIC8vIGV4dGVuc2lvbi5oCitjbGFzcyBTZXJ2aWNlR2VuZXJhdG9yOyAgICAvLyBzZXJ2aWNlLmgKK2NsYXNzIENvbnRleHQ7ICAgICAgICAgICAgIC8vIGNvbnRleHQuaAorfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK2NsYXNzIEdlbmVyYXRvckZhY3RvcnkgeworIHB1YmxpYzoKKyAgR2VuZXJhdG9yRmFjdG9yeSgpOworICB2aXJ0dWFsIH5HZW5lcmF0b3JGYWN0b3J5KCk7CisKKyAgdmlydHVhbCBNZXNzYWdlR2VuZXJhdG9yKiBOZXdNZXNzYWdlR2VuZXJhdG9yKAorICAgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgY29uc3QgPSAwOworCisgIHZpcnR1YWwgRXh0ZW5zaW9uR2VuZXJhdG9yKiBOZXdFeHRlbnNpb25HZW5lcmF0b3IoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIFNlcnZpY2VHZW5lcmF0b3IqIE5ld1NlcnZpY2VHZW5lcmF0b3IoCisgICAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgY29uc3QgPSAwOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEdlbmVyYXRvckZhY3RvcnkpOworfTsKKworLy8gRmFjdG9yeSB0aGF0IGNyZWF0ZXMgZ2VuZXJhdG9ycyBmb3IgaW1tdXRhYmxlLWRlZmF1bHQgbWVzc2FnZXMuCitjbGFzcyBJbW11dGFibGVHZW5lcmF0b3JGYWN0b3J5IDogcHVibGljIEdlbmVyYXRvckZhY3RvcnkgeworIHB1YmxpYzoKKyAgSW1tdXRhYmxlR2VuZXJhdG9yRmFjdG9yeShDb250ZXh0KiBjb250ZXh0KTsKKyAgfkltbXV0YWJsZUdlbmVyYXRvckZhY3RvcnkoKSBvdmVycmlkZTsKKworICBNZXNzYWdlR2VuZXJhdG9yKiBOZXdNZXNzYWdlR2VuZXJhdG9yKAorICAgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRXh0ZW5zaW9uR2VuZXJhdG9yKiBOZXdFeHRlbnNpb25HZW5lcmF0b3IoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIGNvbnN0IG92ZXJyaWRlOworCisgIFNlcnZpY2VHZW5lcmF0b3IqIE5ld1NlcnZpY2VHZW5lcmF0b3IoCisgICAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBDb250ZXh0KiBjb250ZXh0XzsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEltbXV0YWJsZUdlbmVyYXRvckZhY3RvcnkpOworfTsKKworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9HRU5FUkFUT1JfRkFDVE9SWV9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9oZWxwZXJzLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlZThmNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9oZWxwZXJzLmNjCkBAIC0wLDAgKzEsMTExNSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvaGVscGVycy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lX3Jlc29sdmVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZXMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+ICAvLyBmb3IgaGFzaDxUICo+CisKKy8vIE11c3QgYmUgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTsKKworY29uc3QgY2hhciBrVGhpY2tTZXBhcmF0b3JbXSA9CisgICAgIi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7Citjb25zdCBjaGFyIGtUaGluU2VwYXJhdG9yW10gPQorICAgICIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworCituYW1lc3BhY2UgeworCitjb25zdCBjaGFyKiBrRGVmYXVsdFBhY2thZ2UgPSAiIjsKKworLy8gTmFtZXMgdGhhdCBzaG91bGQgYmUgYXZvaWRlZCAoaW4gVXBwZXJDYW1lbENhc2UgZm9ybWF0KS4KKy8vIFVzaW5nIHRoZW0gd2lsbCBjYXVzZSB0aGUgY29tcGlsZXIgdG8gZ2VuZXJhdGUgYWNjZXNzb3JzIHdob3NlIG5hbWVzCisvLyBjb2xsaWRlIHdpdGggbWV0aG9kcyBkZWZpbmVkIGluIGJhc2UgY2xhc3Nlcy4KKy8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBzcGVjaWFsRmllbGROYW1lcyBpbgorLy8gamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXNjcmlwdG9yTWVzc2FnZUluZm9GYWN0b3J5LmphdmEKK2NvbnN0IGNoYXIqIGtGb3JiaWRkZW5Xb3JkTGlzdFtdID0geworICAgIC8vIGphdmEubGFuZy5PYmplY3Q6CisgICAgIkNsYXNzIiwKKyAgICAvLyBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VMaXRlT3JCdWlsZGVyOgorICAgICJEZWZhdWx0SW5zdGFuY2VGb3JUeXBlIiwKKyAgICAvLyBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VMaXRlOgorICAgICJQYXJzZXJGb3JUeXBlIiwKKyAgICAiU2VyaWFsaXplZFNpemUiLAorICAgIC8vIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9yQnVpbGRlcjoKKyAgICAiQWxsRmllbGRzIiwKKyAgICAiRGVzY3JpcHRvckZvclR5cGUiLAorICAgICJJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nIiwKKyAgICAiVW5rbm93bkZpZWxkcyIsCisgICAgLy8gb2Jzb2xldGUuIGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9mIGdlbmVyYXRlZCBjb2RlCisgICAgIkNhY2hlZFNpemUiLAorfTsKKworY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPioga1Jlc2VydmVkTmFtZXMgPQorICAgIG5ldyBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+KHsKKyAgICAgICAgImFic3RyYWN0IiwgICAiYXNzZXJ0IiwgICAgICAgImJvb2xlYW4iLCAgICJicmVhayIsICAgICAgImJ5dGUiLAorICAgICAgICAiY2FzZSIsICAgICAgICJjYXRjaCIsICAgICAgICAiY2hhciIsICAgICAgImNsYXNzIiwgICAgICAiY29uc3QiLAorICAgICAgICAiY29udGludWUiLCAgICJkZWZhdWx0IiwgICAgICAiZG8iLCAgICAgICAgImRvdWJsZSIsICAgICAiZWxzZSIsCisgICAgICAgICJlbnVtIiwgICAgICAgImV4dGVuZHMiLCAgICAgICJmaW5hbCIsICAgICAiZmluYWxseSIsICAgICJmbG9hdCIsCisgICAgICAgICJmb3IiLCAgICAgICAgImdvdG8iLCAgICAgICAgICJpZiIsICAgICAgICAiaW1wbGVtZW50cyIsICJpbXBvcnQiLAorICAgICAgICAiaW5zdGFuY2VvZiIsICJpbnQiLCAgICAgICAgICAiaW50ZXJmYWNlIiwgImxvbmciLCAgICAgICAibmF0aXZlIiwKKyAgICAgICAgIm5ldyIsICAgICAgICAicGFja2FnZSIsICAgICAgInByaXZhdGUiLCAgICJwcm90ZWN0ZWQiLCAgInB1YmxpYyIsCisgICAgICAgICJyZXR1cm4iLCAgICAgInNob3J0IiwgICAgICAgICJzdGF0aWMiLCAgICAic3RyaWN0ZnAiLCAgICJzdXBlciIsCisgICAgICAgICJzd2l0Y2giLCAgICAgInN5bmNocm9uaXplZCIsICJ0aGlzIiwgICAgICAidGhyb3ciLCAgICAgICJ0aHJvd3MiLAorICAgICAgICAidHJhbnNpZW50IiwgICJ0cnkiLCAgICAgICAgICAidm9pZCIsICAgICAgInZvbGF0aWxlIiwgICAid2hpbGUiLAorICAgIH0pOworCitib29sIElzRm9yYmlkZGVuKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShrRm9yYmlkZGVuV29yZExpc3QpOyArK2kpIHsKKyAgICBpZiAoVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShmaWVsZF9uYW1lLCB0cnVlKSA9PSBrRm9yYmlkZGVuV29yZExpc3RbaV0pIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0ZDo6c3RyaW5nIEZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWU7CisgIC8vIEdyb3VwcyBhcmUgaGFja3k6ICBUaGUgbmFtZSBvZiB0aGUgZmllbGQgaXMganVzdCB0aGUgbG93ZXItY2FzZWQgbmFtZQorICAvLyBvZiB0aGUgZ3JvdXAgdHlwZS4gIEluIEphdmEsIHRob3VnaCwgd2Ugd291bGQgbGlrZSB0byByZXRhaW4gdGhlIG9yaWdpbmFsCisgIC8vIGNhcGl0YWxpemF0aW9uIG9mIHRoZSB0eXBlIG5hbWUuCisgIGlmIChHZXRUeXBlKGZpZWxkKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICBmaWVsZF9uYW1lID0gZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgZmllbGRfbmFtZSA9IGZpZWxkLT5uYW1lKCk7CisgIH0KKyAgaWYgKElzRm9yYmlkZGVuKGZpZWxkX25hbWUpKSB7CisgICAgLy8gQXBwZW5kIGEgdHJhaWxpbmcgIiMiIHRvIGluZGljYXRlIHRoYXQgdGhlIG5hbWUgc2hvdWxkIGJlIGRlY29yYXRlZCB0bworICAgIC8vIGF2b2lkIGNvbGxpc2lvbiB3aXRoIG90aGVyIG5hbWVzLgorICAgIGZpZWxkX25hbWUgKz0gIiMiOworICB9CisgIHJldHVybiBmaWVsZF9uYW1lOworfQorCisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIFByaW50R2VuZXJhdGVkQW5ub3RhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlciwgY2hhciBkZWxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYW5ub3RhdGlvbl9maWxlKSB7CisgIGlmIChhbm5vdGF0aW9uX2ZpbGUuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBzdGQ6OnN0cmluZyBwdGVtcGxhdGUgPQorICAgICAgIkBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZCh2YWx1ZT1cInByb3RvY1wiLCBjb21tZW50cz1cImFubm90YXRpb25zOiI7CisgIHB0ZW1wbGF0ZS5wdXNoX2JhY2soZGVsaW1pdGVyKTsKKyAgcHRlbXBsYXRlLmFwcGVuZCgiYW5ub3RhdGlvbl9maWxlIik7CisgIHB0ZW1wbGF0ZS5wdXNoX2JhY2soZGVsaW1pdGVyKTsKKyAgcHRlbXBsYXRlLmFwcGVuZCgiXCIpXG4iKTsKKyAgcHJpbnRlci0+UHJpbnQocHRlbXBsYXRlLmNfc3RyKCksICJhbm5vdGF0aW9uX2ZpbGUiLCBhbm5vdGF0aW9uX2ZpbGUpOworfQorCit2b2lkIFByaW50RW51bVZlcmlmaWVyTG9naWMoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXJtaW5hdGluZ19zdHJpbmcsIGJvb2wgZW5mb3JjZV9saXRlKSB7CisgIHN0ZDo6c3RyaW5nIGVudW1fdmVyaWZpZXJfc3RyaW5nID0KKyAgICAgIGVuZm9yY2VfbGl0ZSA/IFN0ckNhdCh2YXJfbmFtZSwgIi5pbnRlcm5hbEdldFZlcmlmaWVyKCkiKQorICAgICAgICAgICAgICAgICAgIDogU3RyQ2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgICJuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5FbnVtVmVyaWZpZXIoKSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5SYW5nZShpbnQgbnVtYmVyKSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICByZXR1cm4gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiLmZvck51bWJlcihudW1iZXIpICE9IG51bGw7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgfVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICB9Iik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzLAorICAgICAgU3RyQ2F0KGVudW1fdmVyaWZpZXJfc3RyaW5nLCB0ZXJtaW5hdGluZ19zdHJpbmcpLmNfc3RyKCkpOworfQorCitzdGQ6OnN0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXBfbmV4dF9sZXR0ZXIpIHsKKyAgR09PR0xFX0NIRUNLKCFpbnB1dC5lbXB0eSgpKTsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAvLyBOb3RlOiAgSSBkaXN0cnVzdCBjdHlwZS5oIGR1ZSB0byBsb2NhbGVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgaSsrKSB7CisgICAgaWYgKCdhJyA8PSBpbnB1dFtpXSAmJiBpbnB1dFtpXSA8PSAneicpIHsKKyAgICAgIGlmIChjYXBfbmV4dF9sZXR0ZXIpIHsKKyAgICAgICAgcmVzdWx0ICs9IGlucHV0W2ldICsgKCdBJyAtICdhJyk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gaW5wdXRbaV07CisgICAgICB9CisgICAgICBjYXBfbmV4dF9sZXR0ZXIgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKCdBJyA8PSBpbnB1dFtpXSAmJiBpbnB1dFtpXSA8PSAnWicpIHsKKyAgICAgIGlmIChpID09IDAgJiYgIWNhcF9uZXh0X2xldHRlcikgeworICAgICAgICAvLyBGb3JjZSBmaXJzdCBsZXR0ZXIgdG8gbG93ZXItY2FzZSB1bmxlc3MgZXhwbGljaXRseSB0b2xkIHRvCisgICAgICAgIC8vIGNhcGl0YWxpemUgaXQuCisgICAgICAgIHJlc3VsdCArPSBpbnB1dFtpXSArICgnYScgLSAnQScpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ2FwaXRhbCBsZXR0ZXJzIGFmdGVyIHRoZSBmaXJzdCBhcmUgbGVmdCBhcy1pcy4KKyAgICAgICAgcmVzdWx0ICs9IGlucHV0W2ldOworICAgICAgfQorICAgICAgY2FwX25leHRfbGV0dGVyID0gZmFsc2U7CisgICAgfSBlbHNlIGlmICgnMCcgPD0gaW5wdXRbaV0gJiYgaW5wdXRbaV0gPD0gJzknKSB7CisgICAgICByZXN1bHQgKz0gaW5wdXRbaV07CisgICAgICBjYXBfbmV4dF9sZXR0ZXIgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBjYXBfbmV4dF9sZXR0ZXIgPSB0cnVlOworICAgIH0KKyAgfQorICAvLyBBZGQgYSB0cmFpbGluZyAiXyIgaWYgdGhlIG5hbWUgc2hvdWxkIGJlIGFsdGVyZWQuCisgIGlmIChpbnB1dFtpbnB1dC5zaXplKCkgLSAxXSA9PSAnIycpIHsKKyAgICByZXN1bHQgKz0gJ18nOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0ZDo6c3RyaW5nIFRvQ2FtZWxDYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCwgYm9vbCBsb3dlcl9maXJzdCkgeworICBib29sIGNhcGl0YWxpemVfbmV4dCA9ICFsb3dlcl9maXJzdDsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzZXJ2ZShpbnB1dC5zaXplKCkpOworCisgIGZvciAoY2hhciBpIDogaW5wdXQpIHsKKyAgICBpZiAoaSA9PSAnXycpIHsKKyAgICAgIGNhcGl0YWxpemVfbmV4dCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChjYXBpdGFsaXplX25leHQpIHsKKyAgICAgIHJlc3VsdC5wdXNoX2JhY2soVG9VcHBlckNoKGkpKTsKKyAgICAgIGNhcGl0YWxpemVfbmV4dCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQucHVzaF9iYWNrKGkpOworICAgIH0KKyAgfQorCisgIC8vIExvd2VyLWNhc2UgdGhlIGZpcnN0IGxldHRlci4KKyAgaWYgKGxvd2VyX2ZpcnN0ICYmICFyZXN1bHQuZW1wdHkoKSkgeworICAgIHJlc3VsdFswXSA9IFRvTG93ZXJDaChyZXN1bHRbMF0pOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworY2hhciBUb1VwcGVyQ2goY2hhciBjaCkgeworICByZXR1cm4gKGNoID49ICdhJyAmJiBjaCA8PSAneicpID8gKGNoIC0gJ2EnICsgJ0EnKSA6IGNoOworfQorCitjaGFyIFRvTG93ZXJDaChjaGFyIGNoKSB7CisgIHJldHVybiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykgPyAoY2ggLSAnQScgKyAnYScpIDogY2g7Cit9CisKK3N0ZDo6c3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShGaWVsZE5hbWUoZmllbGQpLCBmYWxzZSk7Cit9CisKK3N0ZDo6c3RyaW5nIFVuZGVyc2NvcmVzVG9DYXBpdGFsaXplZENhbWVsQ2FzZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHJldHVybiBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKEZpZWxkTmFtZShmaWVsZCksIHRydWUpOworfQorCitzdGQ6OnN0cmluZyBDYXBpdGFsaXplZEZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHJldHVybiBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoZmllbGQpOworfQorCitzdGQ6OnN0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCkgeworICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShtZXRob2QtPm5hbWUoKSwgZmFsc2UpOworfQorCitzdGQ6OnN0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlQ2hlY2tSZXNlcnZlZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHN0ZDo6c3RyaW5nIG5hbWUgPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGZpZWxkKTsKKyAgaWYgKGtSZXNlcnZlZE5hbWVzLT5maW5kKG5hbWUpICE9IGtSZXNlcnZlZE5hbWVzLT5lbmQoKSkgeworICAgIHJldHVybiBuYW1lICsgIl8iOworICB9CisgIHJldHVybiBuYW1lOworfQorCisvLyBOYW1lcyB0aGF0IHNob3VsZCBiZSBhdm9pZGVkIGFzIGZpZWxkIG5hbWVzIGluIEtvdGxpbi4KKy8vIEFsbCBLb3RsaW4gaGFyZCBrZXl3b3JkcyBhcmUgaW4gdGhpcyBsaXN0LgorY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPioga0tvdGxpbkZvcmJpZGRlbk5hbWVzID0KKyAgICBuZXcgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPih7CisgICAgICAgICJhcyIsICAgICJhcz8iLCAgICJicmVhayIsICJjbGFzcyIsICAiY29udGludWUiLCAgImRvIiwgICAgICJlbHNlIiwKKyAgICAgICAgImZhbHNlIiwgImZvciIsICAgImZ1biIsICAgImlmIiwgICAgICJpbiIsICAgICAgICAiIWluIiwgICAgImludGVyZmFjZSIsCisgICAgICAgICJpcyIsICAgICIhaXMiLCAgICJudWxsIiwgICJvYmplY3QiLCAicGFja2FnZSIsICAgInJldHVybiIsICJzdXBlciIsCisgICAgICAgICJ0aGlzIiwgICJ0aHJvdyIsICJ0cnVlIiwgICJ0cnkiLCAgICAidHlwZWFsaWFzIiwgInR5cGVvZiIsICJ2YWwiLAorICAgICAgICAidmFyIiwgICAid2hlbiIsICAid2hpbGUiLAorICAgIH0pOworCitib29sIElzRm9yYmlkZGVuS290bGluKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lKSB7CisgIHJldHVybiBrS290bGluRm9yYmlkZGVuTmFtZXMtPmZpbmQoZmllbGRfbmFtZSkgIT0KKyAgICAgICAgIGtLb3RsaW5Gb3JiaWRkZW5OYW1lcy0+ZW5kKCk7Cit9CisKK3N0ZDo6c3RyaW5nIFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gInN0YXRpY18iICsgU3RyaW5nUmVwbGFjZShkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSwgIi4iLCAiXyIsIHRydWUpOworfQorCitzdGQ6OnN0cmluZyBDYW1lbENhc2VGaWVsZE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBzdGQ6OnN0cmluZyBmaWVsZE5hbWUgPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGZpZWxkKTsKKyAgaWYgKCcwJyA8PSBmaWVsZE5hbWVbMF0gJiYgZmllbGROYW1lWzBdIDw9ICc5JykgeworICAgIHJldHVybiAnXycgKyBmaWVsZE5hbWU7CisgIH0KKyAgcmV0dXJuIGZpZWxkTmFtZTsKK30KKworc3RkOjpzdHJpbmcgRmlsZUNsYXNzTmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgYm9vbCBpbW11dGFibGUpIHsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIgbmFtZV9yZXNvbHZlcjsKKyAgcmV0dXJuIG5hbWVfcmVzb2x2ZXIuR2V0RmlsZUNsYXNzTmFtZShmaWxlLCBpbW11dGFibGUpOworfQorCitzdGQ6OnN0cmluZyBGaWxlSmF2YVBhY2thZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGJvb2wgaW1tdXRhYmxlKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICBpZiAoZmlsZS0+b3B0aW9ucygpLmhhc19qYXZhX3BhY2thZ2UoKSkgeworICAgIHJlc3VsdCA9IGZpbGUtPm9wdGlvbnMoKS5qYXZhX3BhY2thZ2UoKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBrRGVmYXVsdFBhY2thZ2U7CisgICAgaWYgKCFmaWxlLT5wYWNrYWdlKCkuZW1wdHkoKSkgeworICAgICAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgcmVzdWx0ICs9ICcuJzsKKyAgICAgIHJlc3VsdCArPSBmaWxlLT5wYWNrYWdlKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgRmlsZUphdmFQYWNrYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIHJldHVybiBGaWxlSmF2YVBhY2thZ2UoZmlsZSwgdHJ1ZSAvKiBpbW11dGFibGUgKi8pOworfQorCitzdGQ6OnN0cmluZyBKYXZhUGFja2FnZVRvRGlyKHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZSkgeworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2RpciA9IFN0cmluZ1JlcGxhY2UocGFja2FnZV9uYW1lLCAiLiIsICIvIiwgdHJ1ZSk7CisgIGlmICghcGFja2FnZV9kaXIuZW1wdHkoKSkgcGFja2FnZV9kaXIgKz0gIi8iOworICByZXR1cm4gcGFja2FnZV9kaXI7Cit9CisKK3N0ZDo6c3RyaW5nIENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIENsYXNzTmFtZVJlc29sdmVyIG5hbWVfcmVzb2x2ZXI7CisgIHJldHVybiBuYW1lX3Jlc29sdmVyLkdldENsYXNzTmFtZShkZXNjcmlwdG9yLCB0cnVlKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIENsYXNzTmFtZVJlc29sdmVyIG5hbWVfcmVzb2x2ZXI7CisgIHJldHVybiBuYW1lX3Jlc29sdmVyLkdldENsYXNzTmFtZShkZXNjcmlwdG9yLCB0cnVlKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIENsYXNzTmFtZVJlc29sdmVyIG5hbWVfcmVzb2x2ZXI7CisgIHJldHVybiBuYW1lX3Jlc29sdmVyLkdldENsYXNzTmFtZShkZXNjcmlwdG9yLCB0cnVlKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIENsYXNzTmFtZVJlc29sdmVyIG5hbWVfcmVzb2x2ZXI7CisgIHJldHVybiBuYW1lX3Jlc29sdmVyLkdldENsYXNzTmFtZShkZXNjcmlwdG9yLCB0cnVlKTsKK30KKworCitzdGQ6OnN0cmluZyBFeHRyYU1lc3NhZ2VJbnRlcmZhY2VzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgc3RkOjpzdHJpbmcgaW50ZXJmYWNlcyA9ICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9pbXBsZW1lbnRzOiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgKyAiKSI7CisgIHJldHVybiBpbnRlcmZhY2VzOworfQorCisKK3N0ZDo6c3RyaW5nIEV4dHJhQnVpbGRlckludGVyZmFjZXMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBzdGQ6OnN0cmluZyBpbnRlcmZhY2VzID0gIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChidWlsZGVyX2ltcGxlbWVudHM6IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSArICIpIjsKKyAgcmV0dXJuIGludGVyZmFjZXM7Cit9CisKK3N0ZDo6c3RyaW5nIEV4dHJhTWVzc2FnZU9yQnVpbGRlckludGVyZmFjZXMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBzdGQ6OnN0cmluZyBpbnRlcmZhY2VzID0gIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbnRlcmZhY2VfZXh0ZW5kczoiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpICsgIikiOworICByZXR1cm4gaW50ZXJmYWNlczsKK30KKworc3RkOjpzdHJpbmcgRmllbGRDb25zdGFudE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBzdGQ6OnN0cmluZyBuYW1lID0gZmllbGQtPm5hbWUoKSArICJfRklFTERfTlVNQkVSIjsKKyAgVG9VcHBlcigmbmFtZSk7CisgIHJldHVybiBuYW1lOworfQorCitGaWVsZERlc2NyaXB0b3I6OlR5cGUgR2V0VHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHJldHVybiBmaWVsZC0+dHlwZSgpOworfQorCitKYXZhVHlwZSBHZXRKYXZhVHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHN3aXRjaCAoR2V0VHlwZShmaWVsZCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6CisgICAgICByZXR1cm4gSkFWQVRZUEVfSU5UOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OgorICAgICAgcmV0dXJuIEpBVkFUWVBFX0xPTkc7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiBKQVZBVFlQRV9GTE9BVDsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiBKQVZBVFlQRV9ET1VCTEU7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuIEpBVkFUWVBFX0JPT0xFQU47CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gSkFWQVRZUEVfU1RSSU5HOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6CisgICAgICByZXR1cm4gSkFWQVRZUEVfQllURVM7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOgorICAgICAgcmV0dXJuIEpBVkFUWVBFX0VOVU07CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOgorICAgICAgcmV0dXJuIEpBVkFUWVBFX01FU1NBR0U7CisKKyAgICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgICAvLyB0eXBlcyBhcmUgYWRkZWQuCisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIEpBVkFUWVBFX0lOVDsKK30KKworY29uc3QgY2hhciogUHJpbWl0aXZlVHlwZU5hbWUoSmF2YVR5cGUgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEpBVkFUWVBFX0lOVDoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIEpBVkFUWVBFX0xPTkc6CisgICAgICByZXR1cm4gImxvbmciOworICAgIGNhc2UgSkFWQVRZUEVfRkxPQVQ6CisgICAgICByZXR1cm4gImZsb2F0IjsKKyAgICBjYXNlIEpBVkFUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICBjYXNlIEpBVkFUWVBFX0JPT0xFQU46CisgICAgICByZXR1cm4gImJvb2xlYW4iOworICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICBjYXNlIEpBVkFUWVBFX0JZVEVTOgorICAgICAgcmV0dXJuICJjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmciOworICAgIGNhc2UgSkFWQVRZUEVfRU5VTToKKyAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgICAgLy8gSmF2YVR5cGVzIGFyZSBhZGRlZC4KKyAgfQorCisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciogUHJpbWl0aXZlVHlwZU5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBQcmltaXRpdmVUeXBlTmFtZShHZXRKYXZhVHlwZShkZXNjcmlwdG9yKSk7Cit9CisKK2NvbnN0IGNoYXIqIEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoSmF2YVR5cGUgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEpBVkFUWVBFX0lOVDoKKyAgICAgIHJldHVybiAiamF2YS5sYW5nLkludGVnZXIiOworICAgIGNhc2UgSkFWQVRZUEVfTE9ORzoKKyAgICAgIHJldHVybiAiamF2YS5sYW5nLkxvbmciOworICAgIGNhc2UgSkFWQVRZUEVfRkxPQVQ6CisgICAgICByZXR1cm4gImphdmEubGFuZy5GbG9hdCI7CisgICAgY2FzZSBKQVZBVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImphdmEubGFuZy5Eb3VibGUiOworICAgIGNhc2UgSkFWQVRZUEVfQk9PTEVBTjoKKyAgICAgIHJldHVybiAiamF2YS5sYW5nLkJvb2xlYW4iOworICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICBjYXNlIEpBVkFUWVBFX0JZVEVTOgorICAgICAgcmV0dXJuICJjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmciOworICAgIGNhc2UgSkFWQVRZUEVfRU5VTToKKyAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgICAgLy8gSmF2YVR5cGVzIGFyZSBhZGRlZC4KKyAgfQorCisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciogQm94ZWRQcmltaXRpdmVUeXBlTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoR2V0SmF2YVR5cGUoZGVzY3JpcHRvcikpOworfQorCitjb25zdCBjaGFyKiBLb3RsaW5UeXBlTmFtZShKYXZhVHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgSkFWQVRZUEVfSU5UOgorICAgICAgcmV0dXJuICJrb3RsaW4uSW50IjsKKyAgICBjYXNlIEpBVkFUWVBFX0xPTkc6CisgICAgICByZXR1cm4gImtvdGxpbi5Mb25nIjsKKyAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuICJrb3RsaW4uRmxvYXQiOworICAgIGNhc2UgSkFWQVRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJrb3RsaW4uRG91YmxlIjsKKyAgICBjYXNlIEpBVkFUWVBFX0JPT0xFQU46CisgICAgICByZXR1cm4gImtvdGxpbi5Cb29sZWFuIjsKKyAgICBjYXNlIEpBVkFUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAia290bGluLlN0cmluZyI7CisgICAgY2FzZSBKQVZBVFlQRV9CWVRFUzoKKyAgICAgIHJldHVybiAiY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIjsKKyAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgICByZXR1cm4gTlVMTDsKKyAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6CisgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKKyAgICAgIC8vIEphdmFUeXBlcyBhcmUgYWRkZWQuCisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0ZDo6c3RyaW5nIEdldE9uZW9mU3RvcmVkVHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGNvbnN0IEphdmFUeXBlIGphdmFUeXBlID0gR2V0SmF2YVR5cGUoZmllbGQpOworICBzd2l0Y2ggKGphdmFUeXBlKSB7CisgICAgY2FzZSBKQVZBVFlQRV9FTlVNOgorICAgICAgcmV0dXJuICJqYXZhLmxhbmcuSW50ZWdlciI7CisgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgorICAgICAgcmV0dXJuIENsYXNzTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCkpOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQm94ZWRQcmltaXRpdmVUeXBlTmFtZShqYXZhVHlwZSk7CisgIH0KK30KKworY29uc3QgY2hhciogRmllbGRUeXBlTmFtZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgZmllbGRfdHlwZSkgeworICBzd2l0Y2ggKGZpZWxkX3R5cGUpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMjoKKyAgICAgIHJldHVybiAiSU5UMzIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiAiVUlOVDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzI6CisgICAgICByZXR1cm4gIlNJTlQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMjoKKyAgICAgIHJldHVybiAiRklYRUQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6CisgICAgICByZXR1cm4gIlNGSVhFRDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiAiSU5UNjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiAiVUlOVDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQ6CisgICAgICByZXR1cm4gIlNJTlQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NDoKKyAgICAgIHJldHVybiAiRklYRUQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6CisgICAgICByZXR1cm4gIlNGSVhFRDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiAiRkxPQVQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiRE9VQkxFIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJCT09MIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlNUUklORyI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6CisgICAgICByZXR1cm4gIkJZVEVTIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOgorICAgICAgcmV0dXJuICJFTlVNIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICAgIHJldHVybiAiR1JPVVAiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6CisgICAgICByZXR1cm4gIk1FU1NBR0UiOworCisgICAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgICAgLy8gdHlwZXMgYXJlIGFkZGVkLgorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBOVUxMOworfQorCitib29sIEFsbEFzY2lpKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5zaXplKCk7IGkrKykgeworICAgIGlmICgodGV4dFtpXSAmIDB4ODApICE9IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0ZDo6c3RyaW5nIERlZmF1bHRWYWx1ZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBib29sIGltbXV0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcikgeworICAvLyBTd2l0Y2ggb24gQ3BwVHlwZSBzaW5jZSB3ZSBuZWVkIHRvIGtub3cgd2hpY2ggZGVmYXVsdF92YWx1ZV8qIG1ldGhvZAorICAvLyBvZiBGaWVsZERlc2NyaXB0b3IgdG8gY2FsbC4KKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgcmV0dXJuIFN0ckNhdChmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQzMigpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6CisgICAgICAvLyBOZWVkIHRvIHByaW50IGFzIGEgc2lnbmVkIGludCBzaW5jZSBKYXZhIGhhcyBubyB1bnNpZ25lZC4KKyAgICAgIHJldHVybiBTdHJDYXQoc3RhdGljX2Nhc3Q8aW50MzJfdD4oZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDMyKCkpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiBTdHJDYXQoZmllbGQtPmRlZmF1bHRfdmFsdWVfaW50NjQoKSkgKyAiTCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgcmV0dXJuIFN0ckNhdChzdGF0aWNfY2FzdDxpbnQ2NF90PihmaWVsZC0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKSkpICsKKyAgICAgICAgICAgICAiTCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7CisgICAgICBkb3VibGUgdmFsdWUgPSBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9kb3VibGUoKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKKyAgICAgICAgcmV0dXJuICJEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkiOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7CisgICAgICAgIHJldHVybiAiRG91YmxlLk5FR0FUSVZFX0lORklOSVRZIjsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICJEb3VibGUuTmFOIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTaW1wbGVEdG9hKHZhbHVlKSArICJEIjsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKKyAgICAgIGZsb2F0IHZhbHVlID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfZmxvYXQoKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSkgeworICAgICAgICByZXR1cm4gIkZsb2F0LlBPU0lUSVZFX0lORklOSVRZIjsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gLXN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKSB7CisgICAgICAgIHJldHVybiAiRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkiOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSB2YWx1ZSkgeworICAgICAgICByZXR1cm4gIkZsb2F0Lk5hTiI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gU2ltcGxlRnRvYSh2YWx1ZSkgKyAiRiI7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfYm9vbCgpID8gInRydWUiIDogImZhbHNlIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICBpZiAoR2V0VHlwZShmaWVsZCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTKSB7CisgICAgICAgIGlmIChmaWVsZC0+aGFzX2RlZmF1bHRfdmFsdWUoKSkgeworICAgICAgICAgIC8vIFNlZSBjb21tZW50cyBpbiBJbnRlcm5hbC5qYXZhIGZvciBnb3J5IGRldGFpbHMuCisgICAgICAgICAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLmJ5dGVzRGVmYXVsdFZhbHVlKFwiJDBcIikiLAorICAgICAgICAgICAgICBDRXNjYXBlKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuICJjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcuRU1QVFkiOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoQWxsQXNjaWkoZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpKSB7CisgICAgICAgICAgLy8gQWxsIGNoYXJzIGFyZSBBU0NJSS4gIEluIHRoaXMgY2FzZSBDRXNjYXBlKCkgd29ya3MgZmluZS4KKyAgICAgICAgICByZXR1cm4gIlwiIiArIENFc2NhcGUoZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpICsgIlwiIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBTZWUgY29tbWVudHMgaW4gSW50ZXJuYWwuamF2YSBmb3IgZ29yeSBkZXRhaWxzLgorICAgICAgICAgIHJldHVybiBzdHJpbmdzOjpTdWJzdGl0dXRlKAorICAgICAgICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5zdHJpbmdEZWZhdWx0VmFsdWUoXCIkMFwiKSIsCisgICAgICAgICAgICAgIENFc2NhcGUoZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgIHJldHVybiBuYW1lX3Jlc29sdmVyLT5HZXRDbGFzc05hbWUoZmllbGQtPmVudW1fdHlwZSgpLCBpbW11dGFibGUpICsgIi4iICsKKyAgICAgICAgICAgICBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtKCktPm5hbWUoKTsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICByZXR1cm4gbmFtZV9yZXNvbHZlci0+R2V0Q2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgaW1tdXRhYmxlKSArCisgICAgICAgICAgICAgIi5nZXREZWZhdWx0SW5zdGFuY2UoKSI7CisKKyAgICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgICAvLyB0eXBlcyBhcmUgYWRkZWQuCisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuICIiOworfQorCitib29sIElzRGVmYXVsdFZhbHVlSmF2YURlZmF1bHQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAvLyBTd2l0Y2ggb24gQ3BwVHlwZSBzaW5jZSB3ZSBuZWVkIHRvIGtub3cgd2hpY2ggZGVmYXVsdF92YWx1ZV8qIG1ldGhvZAorICAvLyBvZiBGaWVsZERlc2NyaXB0b3IgdG8gY2FsbC4KKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2ludDMyKCkgPT0gMDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDMyKCkgPT0gMDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCgpID09IDBMOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKSA9PSAwTDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfZG91YmxlKCkgPT0gMC4wOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2Zsb2F0KCkgPT0gMC4wOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfYm9vbCgpID09IGZhbHNlOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKSA9PSAwOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgICAgLy8gdHlwZXMgYXJlIGFkZGVkLgorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJc0J5dGVTdHJpbmdXaXRoQ3VzdG9tRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9CWVRFUyAmJgorICAgICAgICAgZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkgIT0gIiI7Cit9CisKK2NvbnN0IGNoYXIqIGJpdF9tYXNrc1tdID0geworICAgICIweDAwMDAwMDAxIiwgIjB4MDAwMDAwMDIiLCAiMHgwMDAwMDAwNCIsICIweDAwMDAwMDA4IiwKKyAgICAiMHgwMDAwMDAxMCIsICIweDAwMDAwMDIwIiwgIjB4MDAwMDAwNDAiLCAiMHgwMDAwMDA4MCIsCisKKyAgICAiMHgwMDAwMDEwMCIsICIweDAwMDAwMjAwIiwgIjB4MDAwMDA0MDAiLCAiMHgwMDAwMDgwMCIsCisgICAgIjB4MDAwMDEwMDAiLCAiMHgwMDAwMjAwMCIsICIweDAwMDA0MDAwIiwgIjB4MDAwMDgwMDAiLAorCisgICAgIjB4MDAwMTAwMDAiLCAiMHgwMDAyMDAwMCIsICIweDAwMDQwMDAwIiwgIjB4MDAwODAwMDAiLAorICAgICIweDAwMTAwMDAwIiwgIjB4MDAyMDAwMDAiLCAiMHgwMDQwMDAwMCIsICIweDAwODAwMDAwIiwKKworICAgICIweDAxMDAwMDAwIiwgIjB4MDIwMDAwMDAiLCAiMHgwNDAwMDAwMCIsICIweDA4MDAwMDAwIiwKKyAgICAiMHgxMDAwMDAwMCIsICIweDIwMDAwMDAwIiwgIjB4NDAwMDAwMDAiLCAiMHg4MDAwMDAwMCIsCit9OworCitzdGQ6OnN0cmluZyBHZXRCaXRGaWVsZE5hbWUoaW50IGluZGV4KSB7CisgIHN0ZDo6c3RyaW5nIHZhck5hbWUgPSAiYml0RmllbGQiOworICB2YXJOYW1lICs9IFN0ckNhdChpbmRleCk7CisgIHZhck5hbWUgKz0gIl8iOworICByZXR1cm4gdmFyTmFtZTsKK30KKworc3RkOjpzdHJpbmcgR2V0Qml0RmllbGROYW1lRm9yQml0KGludCBiaXRJbmRleCkgeworICByZXR1cm4gR2V0Qml0RmllbGROYW1lKGJpdEluZGV4IC8gMzIpOworfQorCituYW1lc3BhY2UgeworCitzdGQ6OnN0cmluZyBHZW5lcmF0ZUdldEJpdEludGVybmFsKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgsIGludCBiaXRJbmRleCkgeworICBzdGQ6OnN0cmluZyB2YXJOYW1lID0gcHJlZml4ICsgR2V0Qml0RmllbGROYW1lRm9yQml0KGJpdEluZGV4KTsKKyAgaW50IGJpdEluVmFySW5kZXggPSBiaXRJbmRleCAlIDMyOworCisgIHN0ZDo6c3RyaW5nIG1hc2sgPSBiaXRfbWFza3NbYml0SW5WYXJJbmRleF07CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICIoKCIgKyB2YXJOYW1lICsgIiAmICIgKyBtYXNrICsgIikgIT0gMCkiOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGQ6OnN0cmluZyBHZW5lcmF0ZVNldEJpdEludGVybmFsKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgsIGludCBiaXRJbmRleCkgeworICBzdGQ6OnN0cmluZyB2YXJOYW1lID0gcHJlZml4ICsgR2V0Qml0RmllbGROYW1lRm9yQml0KGJpdEluZGV4KTsKKyAgaW50IGJpdEluVmFySW5kZXggPSBiaXRJbmRleCAlIDMyOworCisgIHN0ZDo6c3RyaW5nIG1hc2sgPSBiaXRfbWFza3NbYml0SW5WYXJJbmRleF07CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHZhck5hbWUgKyAiIHw9ICIgKyBtYXNrOworICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworc3RkOjpzdHJpbmcgR2VuZXJhdGVHZXRCaXQoaW50IGJpdEluZGV4KSB7CisgIHJldHVybiBHZW5lcmF0ZUdldEJpdEludGVybmFsKCIiLCBiaXRJbmRleCk7Cit9CisKK3N0ZDo6c3RyaW5nIEdlbmVyYXRlU2V0Qml0KGludCBiaXRJbmRleCkgeworICByZXR1cm4gR2VuZXJhdGVTZXRCaXRJbnRlcm5hbCgiIiwgYml0SW5kZXgpOworfQorCitzdGQ6OnN0cmluZyBHZW5lcmF0ZUNsZWFyQml0KGludCBiaXRJbmRleCkgeworICBzdGQ6OnN0cmluZyB2YXJOYW1lID0gR2V0Qml0RmllbGROYW1lRm9yQml0KGJpdEluZGV4KTsKKyAgaW50IGJpdEluVmFySW5kZXggPSBiaXRJbmRleCAlIDMyOworCisgIHN0ZDo6c3RyaW5nIG1hc2sgPSBiaXRfbWFza3NbYml0SW5WYXJJbmRleF07CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHZhck5hbWUgKyAiID0gKCIgKyB2YXJOYW1lICsgIiAmIH4iICsgbWFzayArICIpIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgR2VuZXJhdGVHZXRCaXRGcm9tTG9jYWwoaW50IGJpdEluZGV4KSB7CisgIHJldHVybiBHZW5lcmF0ZUdldEJpdEludGVybmFsKCJmcm9tXyIsIGJpdEluZGV4KTsKK30KKworc3RkOjpzdHJpbmcgR2VuZXJhdGVTZXRCaXRUb0xvY2FsKGludCBiaXRJbmRleCkgeworICByZXR1cm4gR2VuZXJhdGVTZXRCaXRJbnRlcm5hbCgidG9fIiwgYml0SW5kZXgpOworfQorCitzdGQ6OnN0cmluZyBHZW5lcmF0ZUdldEJpdE11dGFibGVMb2NhbChpbnQgYml0SW5kZXgpIHsKKyAgcmV0dXJuIEdlbmVyYXRlR2V0Qml0SW50ZXJuYWwoIm11dGFibGVfIiwgYml0SW5kZXgpOworfQorCitzdGQ6OnN0cmluZyBHZW5lcmF0ZVNldEJpdE11dGFibGVMb2NhbChpbnQgYml0SW5kZXgpIHsKKyAgcmV0dXJuIEdlbmVyYXRlU2V0Qml0SW50ZXJuYWwoIm11dGFibGVfIiwgYml0SW5kZXgpOworfQorCitib29sIElzUmVmZXJlbmNlVHlwZShKYXZhVHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgSkFWQVRZUEVfSU5UOgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgSkFWQVRZUEVfTE9ORzoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgSkFWQVRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgSkFWQVRZUEVfQk9PTEVBTjoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEpBVkFUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgSkFWQVRZUEVfQllURVM6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKKyAgICAgIC8vIEphdmFUeXBlcyBhcmUgYWRkZWQuCisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIGZhbHNlOworfQorCitjb25zdCBjaGFyKiBHZXRDYXBpdGFsaXplZFR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgYm9vbCBpbW11dGFibGUpIHsKKyAgc3dpdGNoIChHZXRUeXBlKGZpZWxkKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyOgorICAgICAgcmV0dXJuICJJbnQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuICJVSW50MzIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMjoKKyAgICAgIHJldHVybiAiU0ludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyOgorICAgICAgcmV0dXJuICJGaXhlZDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjoKKyAgICAgIHJldHVybiAiU0ZpeGVkMzIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0OgorICAgICAgcmV0dXJuICJJbnQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0OgorICAgICAgcmV0dXJuICJVSW50NjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NDoKKyAgICAgIHJldHVybiAiU0ludDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0OgorICAgICAgcmV0dXJuICJGaXhlZDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDoKKyAgICAgIHJldHVybiAiU0ZpeGVkNjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuICJGbG9hdCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJEb3VibGUiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIkJvb2wiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzogeworICAgICAgcmV0dXJuICJCeXRlcyI7CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU06CisgICAgICByZXR1cm4gIkVudW0iOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOgorICAgICAgcmV0dXJuICJHcm91cCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiAiTWVzc2FnZSI7CisKKyAgICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgICAvLyB0eXBlcyBhcmUgYWRkZWQuCisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIEZvciBlbmNvZGluZ3Mgd2l0aCBmaXhlZCBzaXplcywgcmV0dXJucyB0aGF0IHNpemUgaW4gYnl0ZXMuICBPdGhlcndpc2UKKy8vIHJldHVybnMgLTEuCitpbnQgRml4ZWRTaXplKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyOgorICAgICAgcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0OgorICAgICAgcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgICAgcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NDoKKyAgICAgIHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyOgorICAgICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprRml4ZWQzMlNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NDoKKyAgICAgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0ZpeGVkNjRTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOgorICAgICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprU0ZpeGVkMzJTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OgorICAgICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprU0ZpeGVkNjRTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprRmxvYXRTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0RvdWJsZVNpemU7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprQm9vbFNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTToKKyAgICAgIHJldHVybiAtMTsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzoKKyAgICAgIHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICAgIHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOgorICAgICAgcmV0dXJuIC0xOworCisgICAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgICAgLy8gdHlwZXMgYXJlIGFkZGVkLgorICB9CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gLTE7Cit9CisKKy8vIFNvcnQgdGhlIGZpZWxkcyBvZiB0aGUgZ2l2ZW4gRGVzY3JpcHRvciBieSBudW1iZXIgaW50byBhIG5ld1tdJ2QgYXJyYXkKKy8vIGFuZCByZXR1cm4gaXQuIFRoZSBjYWxsZXIgc2hvdWxkIGRlbGV0ZSB0aGUgcmV0dXJuZWQgYXJyYXkuCitjb25zdCBGaWVsZERlc2NyaXB0b3IqKiBTb3J0RmllbGRzQnlOdW1iZXIoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqKiBmaWVsZHMgPQorICAgICAgbmV3IGNvbnN0IEZpZWxkRGVzY3JpcHRvcipbZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKV07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRzW2ldID0gZGVzY3JpcHRvci0+ZmllbGQoaSk7CisgIH0KKyAgc3RkOjpzb3J0KGZpZWxkcywgZmllbGRzICsgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKSwKKyAgICAgICAgICAgIEZpZWxkT3JkZXJpbmdCeU51bWJlcigpKTsKKyAgcmV0dXJuIGZpZWxkczsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtZXNzYWdlIHR5cGUgaGFzIGFueSByZXF1aXJlZCBmaWVsZHMuICBJZiBpdCBkb2Vzbid0LAorLy8gd2UgY2FuIG9wdGltaXplIG91dCBjYWxscyB0byBpdHMgaXNJbml0aWFsaXplZCgpIG1ldGhvZC4KKy8vCisvLyBhbHJlYWR5X3NlZW4gaXMgdXNlZCB0byBhdm9pZCBjaGVja2luZyB0aGUgc2FtZSB0eXBlIG11bHRpcGxlIHRpbWVzCisvLyAoYW5kIGFsc28gdG8gcHJvdGVjdCBhZ2FpbnN0IHJlY3Vyc2lvbikuCitib29sIEhhc1JlcXVpcmVkRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxjb25zdCBEZXNjcmlwdG9yKj4qIGFscmVhZHlfc2VlbikgeworICBpZiAoYWxyZWFkeV9zZWVuLT5jb3VudCh0eXBlKSA+IDApIHsKKyAgICAvLyBUaGUgdHlwZSBpcyBhbHJlYWR5IGluIGNhY2hlLiAgVGhpcyBtZWFucyB0aGF0IGVpdGhlcjoKKyAgICAvLyBhLiBUaGUgdHlwZSBoYXMgbm8gcmVxdWlyZWQgZmllbGRzLgorICAgIC8vIGIuIFdlIGFyZSBpbiB0aGUgbWlkc3Qgb2YgY2hlY2tpbmcgaWYgdGhlIHR5cGUgaGFzIHJlcXVpcmVkIGZpZWxkcywKKyAgICAvLyAgICBzb21ld2hlcmUgdXAgdGhlIHN0YWNrLiAgSW4gdGhpcyBjYXNlLCB3ZSBrbm93IHRoYXQgaWYgdGhlIHR5cGUKKyAgICAvLyAgICBoYXMgYW55IHJlcXVpcmVkIGZpZWxkcywgdGhleSdsbCBiZSBmb3VuZCB3aGVuIHdlIHJldHVybiB0byBpdCwKKyAgICAvLyAgICBhbmQgdGhlIHdob2xlIGNhbGwgdG8gSGFzUmVxdWlyZWRGaWVsZHMoKSB3aWxsIHJldHVybiB0cnVlLgorICAgIC8vICAgIFRoZXJlZm9yZSwgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBpZiB0aGlzIHR5cGUgaGFzIHJlcXVpcmVkIGZpZWxkcworICAgIC8vICAgIGhlcmUuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGFscmVhZHlfc2Vlbi0+aW5zZXJ0KHR5cGUpOworCisgIC8vIElmIHRoZSB0eXBlIGhhcyBleHRlbnNpb25zLCBhbiBleHRlbnNpb24gd2l0aCBtZXNzYWdlIHR5cGUgY291bGQgY29udGFpbgorICAvLyByZXF1aXJlZCBmaWVsZHMsIHNvIHdlIGhhdmUgdG8gYmUgY29uc2VydmF0aXZlIGFuZCBhc3N1bWUgc3VjaCBhbgorICAvLyBleHRlbnNpb24gZXhpc3RzLgorICBpZiAodHlwZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSByZXR1cm4gdHJ1ZTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSB0eXBlLT5maWVsZChpKTsKKyAgICBpZiAoZmllbGQtPmlzX3JlcXVpcmVkKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoR2V0SmF2YVR5cGUoZmllbGQpID09IEpBVkFUWVBFX01FU1NBR0UpIHsKKyAgICAgIGlmIChIYXNSZXF1aXJlZEZpZWxkcyhmaWVsZC0+bWVzc2FnZV90eXBlKCksIGFscmVhZHlfc2VlbikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEhhc1JlcXVpcmVkRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpIHsKKyAgc3RkOjp1bm9yZGVyZWRfc2V0PGNvbnN0IERlc2NyaXB0b3IqPiBhbHJlYWR5X3NlZW47CisgIHJldHVybiBIYXNSZXF1aXJlZEZpZWxkcyh0eXBlLCAmYWxyZWFkeV9zZWVuKTsKK30KKworYm9vbCBIYXNSZXBlYXRlZEZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3ItPmZpZWxkKGkpOworICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gRW5jb2RlIGFuIHVuc2lnbmVkIDMyLWJpdCB2YWx1ZSBpbnRvIGEgc2VxdWVuY2Ugb2YgVVRGLTE2IGNoYXJhY3RlcnMuCisvLworLy8gSWYgdGhlIHZhbHVlIGlzIGluIFsweDAwMDAsIDB4RDdGRl0sIHdlIGVuY29kZSBpdCB3aXRoIGEgc2luZ2xlIGNoYXJhY3RlcgorLy8gd2l0aCB0aGUgc2FtZSBudW1lcmljIHZhbHVlLgorLy8KKy8vIElmIHRoZSB2YWx1ZSBpcyBsYXJnZXIgdGhhbiAweEQ3RkYsIHdlIGVuY29kZSBpdHMgbG93ZXN0IDEzIGJpdHMgaW50byBhCisvLyBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlIFsweEUwMDAsIDB4RkZGRl0gYnkgY29tYmluaW5nIHRoZXNlIDEzIGJpdHMgd2l0aAorLy8gMHhFMDAwIHVzaW5nIGxvZ2ljLW9yLiBUaGVuIHdlIHNoaWZ0IHRoZSB2YWx1ZSB0byB0aGUgcmlnaHQgYnkgMTMgYml0cywgYW5kCisvLyBlbmNvZGUgdGhlIHJlbWFpbmluZyB2YWx1ZSBieSByZXBlYXRpbmcgdGhpcyBzYW1lIHByb2Nlc3MgdW50aWwgd2UgZ2V0IHRvCisvLyBhIHZhbHVlIGluIFsweDAwMDAsIDB4RDdGRl0gd2hlcmUgd2Ugd2lsbCBlbmNvZGUgaXQgdXNpbmcgYSBjaGFyYWN0ZXIgd2l0aAorLy8gdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZS4KKy8vCisvLyBOb3RlIHRoYXQgd2Ugb25seSB1c2UgY29kZSBwb2ludHMgaW4gWzB4MDAwMCwgMHhEN0ZGXSBhbmQgWzB4RTAwMCwgMHhGRkZGXS4KKy8vIFRoZXJlIHdpbGwgYmUgbm8gc3Vycm9nYXRlIHBhaXJzIGluIHRoZSBlbmNvZGVkIGNoYXJhY3RlciBzZXF1ZW5jZS4KK3ZvaWQgV3JpdGVVSW50MzJUb1V0ZjE2Q2hhclNlcXVlbmNlKHVpbnQzMl90IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSB7CisgIC8vIEZvciB2YWx1ZXMgaW4gWzB4MDAwMCwgMHhEN0ZGXSwgb25seSB1c2Ugb25lIGNoYXIgdG8gZW5jb2RlIGl0LgorICBpZiAobnVtYmVyIDwgMHhEODAwKSB7CisgICAgb3V0cHV0LT5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDE2X3Q+KG51bWJlcikpOworICAgIHJldHVybjsKKyAgfQorICAvLyBFbmNvZGUgaW50byBtdWx0aXBsZSBjaGFycy4gQWxsIGV4Y2VwdCB0aGUgbGFzdCBjaGFyIHdpbGwgYmUgaW4gdGhlIHJhbmdlCisgIC8vIFsweEUwMDAsIDB4RkZGRl0sIGFuZCB0aGUgbGFzdCBjaGFyIHdpbGwgYmUgaW4gdGhlIHJhbmdlIFsweDAwMDAsIDB4RDdGRl0uCisgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCB1c2UgYW55IHZhbHVlIGluIHJhbmdlIFsweEQ4MDAsIDB4REZGRl0gYmVjYXVzZSB0aGV5CisgIC8vIGhhdmUgdG8gY29tZSBpbiBwYWlycyBhbmQgdGhlIGVuY29kaW5nIGlzIGp1c3QgbW9yZSBzcGFjZS1lZmZpY2llbnQgdy9vCisgIC8vIHRoZW0uCisgIHdoaWxlIChudW1iZXIgPj0gMHhEODAwKSB7CisgICAgLy8gWzB4RTAwMCwgMHhGRkZGXSBjYW4gcmVwcmVzZW50IDEzIGJpdHMgb2YgaW5mby4KKyAgICBvdXRwdXQtPnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50MTZfdD4oMHhFMDAwIHwgKG51bWJlciAmIDB4MUZGRikpKTsKKyAgICBudW1iZXIgPj49IDEzOworICB9CisgIG91dHB1dC0+cHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQxNl90PihudW1iZXIpKTsKK30KKworaW50IEdldEV4cGVyaW1lbnRhbEphdmFGaWVsZFR5cGVGb3JTaW5ndWxhcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIC8vIGovYy9nL3Byb3RvYnVmL0ZpZWxkVHlwZS5qYXZhIGxpc3RzIGZpZWxkIHR5cGVzIGluIGEgc2xpZ2h0bHkgZGlmZmVyZW50CisgIC8vIG9yZGVyIGZyb20gRmllbGREZXNjcmlwdG9yOjpUeXBlIHNvIHdlIGNhbid0IGRvIGEgc2ltcGxlIGNhc3QuCisgIC8vCisgIC8vIFRPRE8oeGlhb2ZlbmcpOiBNYWtlIGovYy9nL3Byb3RvYnVmL0ZpZWxkVHlwZS5qYXZhIGZvbGxvdyB0aGUgc2FtZSBvcmRlci4KKyAgaW50IHJlc3VsdCA9IGZpZWxkLT50eXBlKCk7CisgIGlmIChyZXN1bHQgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgcmV0dXJuIDE3OworICB9IGVsc2UgaWYgKHJlc3VsdCA8IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgeworICAgIHJldHVybiByZXN1bHQgLSAxOworICB9IGVsc2UgeworICAgIHJldHVybiByZXN1bHQgLSAyOworICB9Cit9CisKK2ludCBHZXRFeHBlcmltZW50YWxKYXZhRmllbGRUeXBlRm9yUmVwZWF0ZWQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBpZiAoZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICByZXR1cm4gNDk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEdldEV4cGVyaW1lbnRhbEphdmFGaWVsZFR5cGVGb3JTaW5ndWxhcihmaWVsZCkgKyAxODsKKyAgfQorfQorCitpbnQgR2V0RXhwZXJpbWVudGFsSmF2YUZpZWxkVHlwZUZvclBhY2tlZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGludCByZXN1bHQgPSBmaWVsZC0+dHlwZSgpOworICBpZiAocmVzdWx0IDwgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgeworICAgIHJldHVybiByZXN1bHQgKyAzNDsKKyAgfSBlbHNlIGlmIChyZXN1bHQgPiBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMpIHsKKyAgICByZXR1cm4gcmVzdWx0ICsgMzA7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgZmllbGQtPmZ1bGxfbmFtZSgpIDw8ICIgY2FuJ3QgYmUgcGFja2VkLiI7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworaW50IEdldEV4cGVyaW1lbnRhbEphdmFGaWVsZFR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBzdGF0aWMgY29uc3QgaW50IGtNYXBGaWVsZFR5cGUgPSA1MDsKKyAgc3RhdGljIGNvbnN0IGludCBrT25lb2ZGaWVsZFR5cGVPZmZzZXQgPSA1MTsKKyAgc3RhdGljIGNvbnN0IGludCBrUmVxdWlyZWRCaXQgPSAweDEwMDsKKyAgc3RhdGljIGNvbnN0IGludCBrVXRmOENoZWNrQml0ID0gMHgyMDA7CisgIHN0YXRpYyBjb25zdCBpbnQga0NoZWNrSW5pdGlhbGl6ZWQgPSAweDQwMDsKKyAgc3RhdGljIGNvbnN0IGludCBrTWFwV2l0aFByb3RvMkVudW1WYWx1ZSA9IDB4ODAwOworICBzdGF0aWMgY29uc3QgaW50IGtIYXNIYXNCaXQgPSAweDEwMDA7CisgIGludCBleHRyYV9iaXRzID0gZmllbGQtPmlzX3JlcXVpcmVkKCkgPyBrUmVxdWlyZWRCaXQgOiAwOworICBpZiAoZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HICYmIENoZWNrVXRmOChmaWVsZCkpIHsKKyAgICBleHRyYV9iaXRzIHw9IGtVdGY4Q2hlY2tCaXQ7CisgIH0KKyAgaWYgKGZpZWxkLT5pc19yZXF1aXJlZCgpIHx8IChHZXRKYXZhVHlwZShmaWVsZCkgPT0gSkFWQVRZUEVfTUVTU0FHRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc1JlcXVpcmVkRmllbGRzKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSkpKSB7CisgICAgZXh0cmFfYml0cyB8PSBrQ2hlY2tJbml0aWFsaXplZDsKKyAgfQorICBpZiAoSGFzSGFzYml0KGZpZWxkKSkgeworICAgIGV4dHJhX2JpdHMgfD0ga0hhc0hhc0JpdDsKKyAgfQorCisgIGlmIChmaWVsZC0+aXNfbWFwKCkpIHsKKyAgICBpZiAoIVN1cHBvcnRVbmtub3duRW51bVZhbHVlKGZpZWxkKSkgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZSA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+bWFwX3ZhbHVlKCk7CisgICAgICBpZiAoR2V0SmF2YVR5cGUodmFsdWUpID09IEpBVkFUWVBFX0VOVU0pIHsKKyAgICAgICAgZXh0cmFfYml0cyB8PSBrTWFwV2l0aFByb3RvMkVudW1WYWx1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGtNYXBGaWVsZFR5cGUgfCBleHRyYV9iaXRzOworICB9IGVsc2UgaWYgKGZpZWxkLT5pc19wYWNrZWQoKSkgeworICAgIHJldHVybiBHZXRFeHBlcmltZW50YWxKYXZhRmllbGRUeXBlRm9yUGFja2VkKGZpZWxkKTsKKyAgfSBlbHNlIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIHJldHVybiBHZXRFeHBlcmltZW50YWxKYXZhRmllbGRUeXBlRm9yUmVwZWF0ZWQoZmllbGQpIHwgZXh0cmFfYml0czsKKyAgfSBlbHNlIGlmIChJc1JlYWxPbmVvZihmaWVsZCkpIHsKKyAgICByZXR1cm4gKEdldEV4cGVyaW1lbnRhbEphdmFGaWVsZFR5cGVGb3JTaW5ndWxhcihmaWVsZCkgKworICAgICAgICAgICAga09uZW9mRmllbGRUeXBlT2Zmc2V0KSB8CisgICAgICAgICAgIGV4dHJhX2JpdHM7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEdldEV4cGVyaW1lbnRhbEphdmFGaWVsZFR5cGVGb3JTaW5ndWxhcihmaWVsZCkgfCBleHRyYV9iaXRzOworICB9Cit9CisKKy8vIEVzY2FwZSBhIFVURi0xNiBjaGFyYWN0ZXIgdG8gYmUgZW1iZWRkZWQgaW4gYSBKYXZhIHN0cmluZy4KK3ZvaWQgRXNjYXBlVXRmMTZUb1N0cmluZyh1aW50MTZfdCBjb2RlLCBzdGQ6OnN0cmluZyogb3V0cHV0KSB7CisgIGlmIChjb2RlID09ICdcdCcpIHsKKyAgICBvdXRwdXQtPmFwcGVuZCgiXFx0Iik7CisgIH0gZWxzZSBpZiAoY29kZSA9PSAnXGInKSB7CisgICAgb3V0cHV0LT5hcHBlbmQoIlxcYiIpOworICB9IGVsc2UgaWYgKGNvZGUgPT0gJ1xuJykgeworICAgIG91dHB1dC0+YXBwZW5kKCJcXG4iKTsKKyAgfSBlbHNlIGlmIChjb2RlID09ICdccicpIHsKKyAgICBvdXRwdXQtPmFwcGVuZCgiXFxyIik7CisgIH0gZWxzZSBpZiAoY29kZSA9PSAnXGYnKSB7CisgICAgb3V0cHV0LT5hcHBlbmQoIlxcZiIpOworICB9IGVsc2UgaWYgKGNvZGUgPT0gJ1wnJykgeworICAgIG91dHB1dC0+YXBwZW5kKCJcXCciKTsKKyAgfSBlbHNlIGlmIChjb2RlID09ICdcIicpIHsKKyAgICBvdXRwdXQtPmFwcGVuZCgiXFxcIiIpOworICB9IGVsc2UgaWYgKGNvZGUgPT0gJ1xcJykgeworICAgIG91dHB1dC0+YXBwZW5kKCJcXFxcIik7CisgIH0gZWxzZSBpZiAoY29kZSA+PSAweDIwICYmIGNvZGUgPD0gMHg3ZikgeworICAgIG91dHB1dC0+cHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KGNvZGUpKTsKKyAgfSBlbHNlIHsKKyAgICBvdXRwdXQtPmFwcGVuZChTdHJpbmdQcmludGYoIlxcdSUwNHgiLCBjb2RlKSk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvaGVscGVycy5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjFhNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuaApAQCAtMCwwICsxLDQ3NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0hFTFBFUlNfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0hFTFBFUlNfSF9fCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworLy8gQ29tbW9ubHktdXNlZCBzZXBhcmF0b3IgY29tbWVudHMuICBUaGljayBpcyBhIGxpbmUgb2YgJz0nLCB0aGluIGlzIGEgbGluZQorLy8gb2YgJy0nLgorZXh0ZXJuIGNvbnN0IGNoYXIga1RoaWNrU2VwYXJhdG9yW107CitleHRlcm4gY29uc3QgY2hhciBrVGhpblNlcGFyYXRvcltdOworCitib29sIElzRm9yYmlkZGVuS290bGluKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lKTsKKworLy8gSWYgYW5ub3RhdGlvbl9maWxlIGlzIG5vbi1lbXB0eSwgcHJpbnRzIGEgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQKKy8vIGFubm90YXRpb24gdG8gdGhlIGdpdmVuIFByaW50ZXIuIGFubm90YXRpb25fZmlsZSB3aWxsIGJlIHJlZmVyZW5jZWQgaW4gdGhlCisvLyBhbm5vdGF0aW9uJ3MgY29tbWVudHMgZmllbGQuIGRlbGltaXRlciBzaG91bGQgYmUgdGhlIFByaW50ZXIncyBkZWxpbWl0ZXIKKy8vIGNoYXJhY3Rlci4gYW5ub3RhdGlvbl9maWxlIHdpbGwgYmUgaW5jbHVkZWQgdmVyYmF0aW0gaW50byBhIEphdmEgbGl0ZXJhbAorLy8gc3RyaW5nLCBzbyBpdCBzaG91bGQgbm90IGNvbnRhaW4gcXVvdGVzIG9yIGludmFsaWQgSmF2YSBlc2NhcGUgc2VxdWVuY2VzOworLy8gaG93ZXZlciwgdGhlc2UgYXJlIHVubGlrZWx5IHRvIGFwcGVhciBpbiBwcmFjdGljZSwgYXMgdGhlIHZhbHVlIG9mCisvLyBhbm5vdGF0aW9uX2ZpbGUgc2hvdWxkIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUKKy8vIGJlaW5nIGFubm90YXRlZCAod2hpY2ggaW4gdHVybiBtdXN0IGJlIGEgSmF2YSBpZGVudGlmaWVyIHBsdXMgIi5qYXZhIikuCit2b2lkIFByaW50R2VuZXJhdGVkQW5ub3RhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlciwgY2hhciBkZWxpbWl0ZXIgPSAnJCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYW5ub3RhdGlvbl9maWxlID0gIiIpOworCisvLyBJZiBhIEdlbmVyYXRlZE1lc3NhZ2VMaXRlIGNvbnRhaW5zIG5vbi1saXRlIGVudW1zLCB0aGVuIGl0cyB2ZXJpZmllcgorLy8gbXVzdCBiZSBpbnN0YW50aWF0ZWQgaW5saW5lLCByYXRoZXIgdGhhbiByZXRyaWV2ZWQgZnJvbSB0aGUgZW51bSBjbGFzcy4KK3ZvaWQgUHJpbnRFbnVtVmVyaWZpZXJMb2dpYyhpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdmFyaWFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlcm1pbmF0aW5nX3N0cmluZywgYm9vbCBlbmZvcmNlX2xpdGUpOworCisvLyBDb252ZXJ0cyBhIG5hbWUgdG8gY2FtZWwtY2FzZS4gSWYgY2FwX2ZpcnN0X2xldHRlciBpcyB0cnVlLCBjYXBpdGFsaXplIHRoZQorLy8gZmlyc3QgbGV0dGVyLgorc3RkOjpzdHJpbmcgVG9DYW1lbENhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0LCBib29sIGxvd2VyX2ZpcnN0KTsKKworY2hhciBUb1VwcGVyQ2goY2hhciBjaCk7CitjaGFyIFRvTG93ZXJDaChjaGFyIGNoKTsKKworLy8gQ29udmVydHMgYSBuYW1lIHRvIGNhbWVsLWNhc2UuIElmIGNhcF9maXJzdF9sZXR0ZXIgaXMgdHJ1ZSwgY2FwaXRhbGl6ZSB0aGUKKy8vIGZpcnN0IGxldHRlci4KK3N0ZDo6c3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FwX2ZpcnN0X2xldHRlcik7CisvLyBDb252ZXJ0cyB0aGUgZmllbGQncyBuYW1lIHRvIGNhbWVsLWNhc2UsIGUuZy4gImZvb19iYXJfYmF6IiBiZWNvbWVzCisvLyAiZm9vQmFyQmF6IiBvciAiRm9vQmFyQmF6IiwgcmVzcGVjdGl2ZWx5Lgorc3RkOjpzdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKK3N0ZDo6c3RyaW5nIFVuZGVyc2NvcmVzVG9DYXBpdGFsaXplZENhbWVsQ2FzZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworLy8gU2ltaWxhciwgYnV0IGZvciBtZXRob2QgbmFtZXMuICAoVHlwaWNhbGx5LCB0aGlzIG1lcmVseSBoYXMgdGhlIGVmZmVjdAorLy8gb2YgbG93ZXItY2FzaW5nIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIG5hbWUuKQorc3RkOjpzdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpOworCisvLyBTYW1lIGFzIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UsIGJ1dCBjaGVja3MgZm9yIHJlc2VydmVkIGtleXdvcmRzCitzdGQ6OnN0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlQ2hlY2tSZXNlcnZlZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworLy8gU2ltaWxhciB0byBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlLCBidXQgZ3VhcmFudGVlcyB0aGF0IHRoZSByZXN1bHQgaXMgYQorLy8gY29tcGxldGUgSmF2YSBpZGVudGlmaWVyIGJ5IGFkZGluZyBhIF8gaWYgbmVlZGVkLgorc3RkOjpzdHJpbmcgQ2FtZWxDYXNlRmllbGROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisvLyBHZXQgYW4gaWRlbnRpZmllciB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyB0eXBlIHdpdGhpbiB0aGUgZmlsZS4KKy8vIFRoaXMgaXMgdXNlZCB0byBkZWNsYXJlIHN0YXRpYyB2YXJpYWJsZXMgcmVsYXRlZCB0byB0aGlzIHR5cGUgYXQgdGhlCisvLyBvdXRlcm1vc3QgZmlsZSBzY29wZS4KK3N0ZDo6c3RyaW5nIFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKKy8vIEdldHMgdGhlIHVucXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBmaWxlLiAgRm9yIGVhY2ggLnByb3RvIGZpbGUsIHRoZXJlCisvLyB3aWxsIGJlIG9uZSBKYXZhIGNsYXNzIGNvbnRhaW5pbmcgYWxsIHRoZSBpbW11dGFibGUgbWVzc2FnZXMgYW5kIGFub3RoZXIKKy8vIEphdmEgY2xhc3MgY29udGFpbmluZyBhbGwgdGhlIG11dGFibGUgbWVzc2FnZXMuCisvLyBUT0RPKHhpYW9mZW5nKTogcmVtb3ZlIHRoZSBkZWZhdWx0IHZhbHVlIGFmdGVyIHVwZGF0aW5nIGNsaWVudCBjb2RlLgorc3RkOjpzdHJpbmcgRmlsZUNsYXNzTmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgYm9vbCBpbW11dGFibGUgPSB0cnVlKTsKKworLy8gUmV0dXJucyB0aGUgZmlsZSdzIEphdmEgcGFja2FnZSBuYW1lLgorc3RkOjpzdHJpbmcgRmlsZUphdmFQYWNrYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBib29sIGltbXV0YWJsZSk7CisKKy8vIFJldHVybnMgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIGdpdmVuIHBhY2thZ2UgbmFtZS4KK3N0ZDo6c3RyaW5nIEphdmFQYWNrYWdlVG9EaXIoc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lKTsKKworLy8gQ29tbWEtc2VwYXJhdGUgbGlzdCBvZiBvcHRpb24tc3BlY2lmaWVkIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlCisvLyBNZXNzYWdlLCB0byBmb2xsb3cgdGhlICJpbXBsZW1lbnRzIiBkZWNsYXJhdGlvbiBvZiB0aGUgTWVzc2FnZSBkZWZpbml0aW9uLgorc3RkOjpzdHJpbmcgRXh0cmFNZXNzYWdlSW50ZXJmYWNlcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKy8vIENvbW1hLXNlcGFyYXRlIGxpc3Qgb2Ygb3B0aW9uLXNwZWNpZmllZCBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZQorLy8gTXV0YWJsZU1lc3NhZ2UsIHRvIGZvbGxvdyB0aGUgImltcGxlbWVudHMiIGRlY2xhcmF0aW9uIG9mIHRoZSBNdXRhYmxlTWVzc2FnZQorLy8gZGVmaW5pdGlvbi4KK3N0ZDo6c3RyaW5nIEV4dHJhTXV0YWJsZU1lc3NhZ2VJbnRlcmZhY2VzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworLy8gQ29tbWEtc2VwYXJhdGUgbGlzdCBvZiBvcHRpb24tc3BlY2lmaWVkIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlCisvLyBCdWlsZGVyLCB0byBmb2xsb3cgdGhlICJpbXBsZW1lbnRzIiBkZWNsYXJhdGlvbiBvZiB0aGUgQnVpbGRlciBkZWZpbml0aW9uLgorc3RkOjpzdHJpbmcgRXh0cmFCdWlsZGVySW50ZXJmYWNlcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKy8vIENvbW1hLXNlcGFyYXRlIGxpc3Qgb2Ygb3B0aW9uLXNwZWNpZmllZCBpbnRlcmZhY2VzIGV4dGVuZGVkIGJ5IHRoZQorLy8gTWVzc2FnZU9yQnVpbGRlciwgdG8gZm9sbG93IHRoZSAiZXh0ZW5kcyIgZGVjbGFyYXRpb24gb2YgdGhlCisvLyBNZXNzYWdlT3JCdWlsZGVyIGRlZmluaXRpb24uCitzdGQ6OnN0cmluZyBFeHRyYU1lc3NhZ2VPckJ1aWxkZXJJbnRlcmZhY2VzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisvLyBHZXQgdGhlIHVucXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBmb3IgbXV0YWJsZSBtZXNzYWdlcy4gaS5lLiB3aXRob3V0CisvLyBwYWNrYWdlIG9yIG91dGVyIGNsYXNzbmFtZXMuCitpbmxpbmUgc3RkOjpzdHJpbmcgU2hvcnRNdXRhYmxlSmF2YUNsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5uYW1lKCk7Cit9CisKKy8vIFdoZXRoZXIgdGhlIGdpdmVuIGRlc2NyaXB0b3IgaXMgZm9yIG9uZSBvZiB0aGUgY29yZSBkZXNjcmlwdG9yIHByb3Rvcy4gV2UKKy8vIGNhbm5vdCBjdXJyZW50bHkgdXNlIHRoZSBuZXcgcnVudGltZSB3aXRoIGNvcmUgcHJvdG9zIHNpbmNlIHRoZXJlIGlzIGEKKy8vIGJvb3RzdHJhcHBpbmcgcHJvYmxlbSB3aXRoIG9idGFpbmluZyB0aGVpciBkZXNjcmlwdG9ycy4KK2lubGluZSBib29sIElzRGVzY3JpcHRvclByb3RvKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPmZpbGUoKS0+bmFtZSgpID09ICJuZXQvcHJvdG8yL3Byb3RvL2Rlc2NyaXB0b3IucHJvdG8iIHx8CisgICAgICAgICBkZXNjcmlwdG9yLT5maWxlKCktPm5hbWUoKSA9PSAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iOworfQorCisvLyBSZXR1cm5zIHRoZSBzdG9yZWQgdHlwZSBzdHJpbmcgdXNlZCBieSB0aGUgZXhwZXJpbWVudGFsIHJ1bnRpbWUgZm9yIG9uZW9mCisvLyBmaWVsZHMuCitzdGQ6OnN0cmluZyBHZXRPbmVvZlN0b3JlZFR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKy8vIFdlIHVzZSBlaXRoZXIgdGhlIHByb3RvMSBlbnVtcyBpZiB0aGUgZW51bSBpcyBnZW5lcmF0ZWQsIG90aGVyd2lzZSBmYWxsIGJhY2sKKy8vIHRvIHVzZSBpbnRlZ2Vycy4KK2VudW0gY2xhc3MgUHJvdG8xRW51bVJlcHJlc2VudGF0aW9uIHsKKyAga0VudW0sCisgIGtJbnRlZ2VyLAorfTsKKworLy8gUmV0dXJucyB3aGljaCByZXByZXNlbnRhdGlvbiB3ZSBzaG91bGQgdXNlLgoraW5saW5lIFByb3RvMUVudW1SZXByZXNlbnRhdGlvbiBHZXRQcm90bzFFbnVtUmVwcmVzZW50YXRpb24oCisgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgaWYgKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpICE9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gUHJvdG8xRW51bVJlcHJlc2VudGF0aW9uOjprRW51bTsKKyAgfQorICByZXR1cm4gUHJvdG8xRW51bVJlcHJlc2VudGF0aW9uOjprSW50ZWdlcjsKK30KKworLy8gV2hldGhlciB3ZSBzaG91bGQgZ2VuZXJhdGUgbXVsdGlwbGUgamF2YSBmaWxlcyBmb3IgbWVzc2FnZXMuCitpbmxpbmUgYm9vbCBNdWx0aXBsZUphdmFGaWxlcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW1tdXRhYmxlKSB7CisgICh2b2lkKWltbXV0YWJsZTsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5qYXZhX211bHRpcGxlX2ZpbGVzKCk7Cit9CisKKworLy8gUmV0dXJucyB0cnVlIGlmIGBkZXNjcmlwdG9yYCB3aWxsIGJlIHdyaXR0ZW4gdG8gaXRzIG93biAuamF2YSBmaWxlLgorLy8gYGltbXV0YWJsZWAgc2hvdWxkIGJlIHNldCB0byB0cnVlIGlmIHdlJ3JlIGdlbmVyYXRpbmcgZm9yIHRoZSBpbW11dGFibGUgQVBJLgordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3I+Citib29sIElzT3duRmlsZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBib29sIGltbXV0YWJsZSkgeworICByZXR1cm4gZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCAmJgorICAgICAgICAgTXVsdGlwbGVKYXZhRmlsZXMoZGVzY3JpcHRvci0+ZmlsZSgpLCBpbW11dGFibGUpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgSXNPd25GaWxlKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBib29sIGltbXV0YWJsZSkgeworICByZXR1cm4gTXVsdGlwbGVKYXZhRmlsZXMoZGVzY3JpcHRvci0+ZmlsZSgpLCBpbW11dGFibGUpOworfQorCisvLyBJZiBgZGVzY3JpcHRvcmAgZGVzY3JpYmVzIGFuIG9iamVjdCB3aXRoIGl0cyBvd24gLmphdmEgZmlsZSwKKy8vIHJldHVybnMgdGhlIG5hbWUgKHJlbGF0aXZlIHRvIHRoYXQgLmphdmEgZmlsZSkgb2YgdGhlIGZpbGUgdGhhdCBzdG9yZXMKKy8vIGFubm90YXRpb24gZGF0YSBmb3IgdGhhdCBkZXNjcmlwdG9yLiBgc3VmZml4YCBpcyB1c3VhbGx5IGVtcHR5LCBidXQgbWF5CisvLyAoZS5nLikgYmUgIk9yQnVpbGRlciIgZm9yIHNvbWUgZ2VuZXJhdGVkIGludGVyZmFjZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvcj4KK3N0ZDo6c3RyaW5nIEFubm90YXRpb25GaWxlTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWZmaXgpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPm5hbWUoKSArIHN1ZmZpeCArICIuamF2YS5wYi5tZXRhIjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3I+Cit2b2lkIE1heWJlUHJpbnRHZW5lcmF0ZWRBbm5vdGF0aW9uKENvbnRleHQqIGNvbnRleHQsIGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBib29sIGltbXV0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCA9ICIiKSB7CisgIGlmIChJc093bkZpbGUoZGVzY3JpcHRvciwgaW1tdXRhYmxlKSkgeworICAgIFByaW50R2VuZXJhdGVkQW5ub3RhdGlvbihwcmludGVyLCAnJCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPm9wdGlvbnMoKS5hbm5vdGF0ZV9jb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFubm90YXRpb25GaWxlTmFtZShkZXNjcmlwdG9yLCBzdWZmaXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIiKTsKKyAgfQorfQorCisvLyBHZXQgdGhlIHVucXVhbGlmaWVkIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgYSBmaWVsZCdzIGZpZWxkCisvLyBudW1iZXIgY29uc3RhbnQuCitzdGQ6OnN0cmluZyBGaWVsZENvbnN0YW50TmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworLy8gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgRmllbGREZXNjcmlwdG9yLgorLy8gVGhpcyBkb2VzIG5vdGhpbmcgaW50ZXJlc3RpbmcgZm9yIHRoZSBvcGVuIHNvdXJjZSByZWxlYXNlLCBidXQgaXMgdXNlZCBmb3IKKy8vIGhhY2tzIHRoYXQgaW1wcm92ZSBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbiAxIHByb3RvY29sIGJ1ZmZlcnMgYXQgR29vZ2xlLgorRmllbGREZXNjcmlwdG9yOjpUeXBlIEdldFR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKK2VudW0gSmF2YVR5cGUgeworICBKQVZBVFlQRV9JTlQsCisgIEpBVkFUWVBFX0xPTkcsCisgIEpBVkFUWVBFX0ZMT0FULAorICBKQVZBVFlQRV9ET1VCTEUsCisgIEpBVkFUWVBFX0JPT0xFQU4sCisgIEpBVkFUWVBFX1NUUklORywKKyAgSkFWQVRZUEVfQllURVMsCisgIEpBVkFUWVBFX0VOVU0sCisgIEpBVkFUWVBFX01FU1NBR0UKK307CisKK0phdmFUeXBlIEdldEphdmFUeXBlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCitjb25zdCBjaGFyKiBQcmltaXRpdmVUeXBlTmFtZShKYXZhVHlwZSB0eXBlKTsKKworLy8gR2V0IHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgYSBib3hlZCBwcmltaXRpdmUgdHlwZSwgZS5nLgorLy8gImphdmEubGFuZy5JbnRlZ2VyIiBmb3IgSkFWQVRZUEVfSU5ULiAgUmV0dXJucyBOVUxMIGZvciBlbnVtIGFuZCBtZXNzYWdlCisvLyB0eXBlcy4KK2NvbnN0IGNoYXIqIEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoSmF2YVR5cGUgdHlwZSk7CisKKy8vIEtvdGxpbiBzb3VyY2UgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwcmltaXRpdmVzIGFuZCBub24tcHJpbWl0aXZlcywKKy8vIGJ1dCBkb2VzIHVzZSBLb3RsaW4tc3BlY2lmaWMgcXVhbGlmaWVkIHR5cGVzIGZvciB0aGVtLgorY29uc3QgY2hhciogS290bGluVHlwZU5hbWUoSmF2YVR5cGUgdHlwZSk7CisKKy8vIEdldCB0aGUgbmFtZSBvZiB0aGUgamF2YSBlbnVtIGNvbnN0YW50IHJlcHJlc2VudGluZyB0aGlzIHR5cGUuIEUuZy4sCisvLyAiSU5UMzIiIGZvciBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzIuIFRoZSBlbnVtIGNvbnN0YW50J3MgZnVsbAorLy8gbmFtZSBpcyAiY29tLmdvb2dsZS5wcm90b2J1Zi5XaXJlRm9ybWF0LkZpZWxkVHlwZS5JTlQzMiIuCitjb25zdCBjaGFyKiBGaWVsZFR5cGVOYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvcjo6VHlwZSBmaWVsZF90eXBlKTsKKworY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7CitzdGQ6OnN0cmluZyBEZWZhdWx0VmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgYm9vbCBpbW11dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXIpOworaW5saW5lIHN0ZDo6c3RyaW5nIEltbXV0YWJsZURlZmF1bHRWYWx1ZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcikgeworICByZXR1cm4gRGVmYXVsdFZhbHVlKGZpZWxkLCB0cnVlLCBuYW1lX3Jlc29sdmVyKTsKK30KK2Jvb2wgSXNEZWZhdWx0VmFsdWVKYXZhRGVmYXVsdChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKK2Jvb2wgSXNCeXRlU3RyaW5nV2l0aEN1c3RvbURlZmF1bHRWYWx1ZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworLy8gRG9lcyB0aGlzIG1lc3NhZ2UgY2xhc3MgaGF2ZSBkZXNjcmlwdG9yIGFuZCByZWZsZWN0aW9uIG1ldGhvZHM/CitpbmxpbmUgYm9vbCBIYXNEZXNjcmlwdG9yTWV0aG9kcyhjb25zdCBEZXNjcmlwdG9yKiAvKiBkZXNjcmlwdG9yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmZvcmNlX2xpdGUpIHsKKyAgcmV0dXJuICFlbmZvcmNlX2xpdGU7Cit9CitpbmxpbmUgYm9vbCBIYXNEZXNjcmlwdG9yTWV0aG9kcyhjb25zdCBFbnVtRGVzY3JpcHRvciogLyogZGVzY3JpcHRvciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5mb3JjZV9saXRlKSB7CisgIHJldHVybiAhZW5mb3JjZV9saXRlOworfQoraW5saW5lIGJvb2wgSGFzRGVzY3JpcHRvck1ldGhvZHMoY29uc3QgRmlsZURlc2NyaXB0b3IqIC8qIGRlc2NyaXB0b3IgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuZm9yY2VfbGl0ZSkgeworICByZXR1cm4gIWVuZm9yY2VfbGl0ZTsKK30KKworLy8gU2hvdWxkIHdlIGdlbmVyYXRlIGdlbmVyaWMgc2VydmljZXMgZm9yIHRoaXMgZmlsZT8KK2lubGluZSBib29sIEhhc0dlbmVyaWNTZXJ2aWNlcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgYm9vbCBlbmZvcmNlX2xpdGUpIHsKKyAgcmV0dXJuIGZpbGUtPnNlcnZpY2VfY291bnQoKSA+IDAgJiYKKyAgICAgICAgIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGUsIGVuZm9yY2VfbGl0ZSkgJiYKKyAgICAgICAgIGZpbGUtPm9wdGlvbnMoKS5qYXZhX2dlbmVyaWNfc2VydmljZXMoKTsKK30KKworLy8gTWV0aG9kcyBmb3Igc2hhcmVkIGJpdGZpZWxkcy4KKworLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgc2hhcmVkIGJpdGZpZWxkIGZvciB0aGUgZ2l2ZW4gaW5kZXguCitzdGQ6OnN0cmluZyBHZXRCaXRGaWVsZE5hbWUoaW50IGluZGV4KTsKKworLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgc2hhcmVkIGJpdGZpZWxkIGZvciB0aGUgZ2l2ZW4gYml0IGluZGV4LgorLy8gRWZmZWN0aXZlbHksIEdldEJpdEZpZWxkTmFtZShiaXRJbmRleCAvIDMyKQorc3RkOjpzdHJpbmcgR2V0Qml0RmllbGROYW1lRm9yQml0KGludCBiaXRJbmRleCk7CisKKy8vIEdlbmVyYXRlcyB0aGUgamF2YSBjb2RlIGZvciB0aGUgZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdGhlIGJvb2xlYW4gdmFsdWUKKy8vIG9mIHRoZSBiaXQgb2YgdGhlIHNoYXJlZCBiaXRmaWVsZHMgZm9yIHRoZSBnaXZlbiBiaXQgaW5kZXguCisvLyBFeGFtcGxlOiAiKChiaXRGaWVsZDFfICYgMHgwNCkgPT0gMHgwNCkiCitzdGQ6OnN0cmluZyBHZW5lcmF0ZUdldEJpdChpbnQgYml0SW5kZXgpOworCisvLyBHZW5lcmF0ZXMgdGhlIGphdmEgY29kZSBmb3IgdGhlIGV4cHJlc3Npb24gdGhhdCBzZXRzIHRoZSBiaXQgb2YgdGhlIHNoYXJlZAorLy8gYml0ZmllbGRzIGZvciB0aGUgZ2l2ZW4gYml0IGluZGV4LgorLy8gRXhhbXBsZTogImJpdEZpZWxkMV8gPSAoYml0RmllbGQxXyB8IDB4MDQpIgorc3RkOjpzdHJpbmcgR2VuZXJhdGVTZXRCaXQoaW50IGJpdEluZGV4KTsKKworLy8gR2VuZXJhdGVzIHRoZSBqYXZhIGNvZGUgZm9yIHRoZSBleHByZXNzaW9uIHRoYXQgY2xlYXJzIHRoZSBiaXQgb2YgdGhlIHNoYXJlZAorLy8gYml0ZmllbGRzIGZvciB0aGUgZ2l2ZW4gYml0IGluZGV4LgorLy8gRXhhbXBsZTogImJpdEZpZWxkMV8gPSAoYml0RmllbGQxXyAmIH4weDA0KSIKK3N0ZDo6c3RyaW5nIEdlbmVyYXRlQ2xlYXJCaXQoaW50IGJpdEluZGV4KTsKKworLy8gRG9lcyB0aGUgc2FtZSBhcyBHZW5lcmF0ZUdldEJpdCBidXQgb3BlcmF0ZXMgb24gdGhlIGJpdCBmaWVsZCBvbiBhIGxvY2FsCisvLyB2YXJpYWJsZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBidWlsZGVyIHRvIGNvcHkgdGhlIHZhbHVlIGluIHRoZSBidWlsZGVyIHRvCisvLyB0aGUgbWVzc2FnZS4KKy8vIEV4YW1wbGU6ICIoKGZyb21fYml0RmllbGQxXyAmIDB4MDQpID09IDB4MDQpIgorc3RkOjpzdHJpbmcgR2VuZXJhdGVHZXRCaXRGcm9tTG9jYWwoaW50IGJpdEluZGV4KTsKKworLy8gRG9lcyB0aGUgc2FtZSBhcyBHZW5lcmF0ZVNldEJpdCBidXQgb3BlcmF0ZXMgb24gdGhlIGJpdCBmaWVsZCBvbiBhIGxvY2FsCisvLyB2YXJpYWJsZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBidWlsZGVyIHRvIGNvcHkgdGhlIHZhbHVlIGluIHRoZSBidWlsZGVyIHRvCisvLyB0aGUgbWVzc2FnZS4KKy8vIEV4YW1wbGU6ICJ0b19iaXRGaWVsZDFfID0gKHRvX2JpdEZpZWxkMV8gfCAweDA0KSIKK3N0ZDo6c3RyaW5nIEdlbmVyYXRlU2V0Qml0VG9Mb2NhbChpbnQgYml0SW5kZXgpOworCisvLyBEb2VzIHRoZSBzYW1lIGFzIEdlbmVyYXRlR2V0Qml0IGJ1dCBvcGVyYXRlcyBvbiB0aGUgYml0IGZpZWxkIG9uIGEgbG9jYWwKKy8vIHZhcmlhYmxlLiBUaGlzIGlzIHVzZWQgYnkgdGhlIHBhcnNpbmcgY29uc3RydWN0b3IgdG8gcmVjb3JkIGlmIGEgcmVwZWF0ZWQKKy8vIGZpZWxkIGlzIG11dGFibGUuCisvLyBFeGFtcGxlOiAiKChtdXRhYmxlX2JpdEZpZWxkMV8gJiAweDA0KSA9PSAweDA0KSIKK3N0ZDo6c3RyaW5nIEdlbmVyYXRlR2V0Qml0TXV0YWJsZUxvY2FsKGludCBiaXRJbmRleCk7CisKKy8vIERvZXMgdGhlIHNhbWUgYXMgR2VuZXJhdGVTZXRCaXQgYnV0IG9wZXJhdGVzIG9uIHRoZSBiaXQgZmllbGQgb24gYSBsb2NhbAorLy8gdmFyaWFibGUuIFRoaXMgaXMgdXNlZCBieSB0aGUgcGFyc2luZyBjb25zdHJ1Y3RvciB0byByZWNvcmQgaWYgYSByZXBlYXRlZAorLy8gZmllbGQgaXMgbXV0YWJsZS4KKy8vIEV4YW1wbGU6ICJtdXRhYmxlX2JpdEZpZWxkMV8gPSAobXV0YWJsZV9iaXRGaWVsZDFfIHwgMHgwNCkiCitzdGQ6OnN0cmluZyBHZW5lcmF0ZVNldEJpdE11dGFibGVMb2NhbChpbnQgYml0SW5kZXgpOworCisvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIEphdmFUeXBlIGlzIGEgcmVmZXJlbmNlIHR5cGUuCitib29sIElzUmVmZXJlbmNlVHlwZShKYXZhVHlwZSB0eXBlKTsKKworLy8gUmV0dXJucyB0aGUgY2FwaXRhbGl6ZWQgbmFtZSBmb3IgY2FsbGluZyByZWxhdGl2ZSBmdW5jdGlvbnMgaW4KKy8vIENvZGVkSW5wdXRTdHJlYW0KK2NvbnN0IGNoYXIqIEdldENhcGl0YWxpemVkVHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBib29sIGltbXV0YWJsZSk7CisKKy8vIEZvciBlbmNvZGluZ3Mgd2l0aCBmaXhlZCBzaXplcywgcmV0dXJucyB0aGF0IHNpemUgaW4gYnl0ZXMuICBPdGhlcndpc2UKKy8vIHJldHVybnMgLTEuCitpbnQgRml4ZWRTaXplKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKTsKKworLy8gQ29tcGFyYXRvcnMgdXNlZCB0byBzb3J0IGZpZWxkcyBpbiBNZXNzYWdlR2VuZXJhdG9yCitzdHJ1Y3QgRmllbGRPcmRlcmluZ0J5TnVtYmVyIHsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBiKSBjb25zdCB7CisgICAgcmV0dXJuIGEtPm51bWJlcigpIDwgYi0+bnVtYmVyKCk7CisgIH0KK307CisKK3N0cnVjdCBFeHRlbnNpb25SYW5nZU9yZGVyaW5nIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiBhLAorICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gYS0+c3RhcnQgPCBiLT5zdGFydDsKKyAgfQorfTsKKworLy8gU29ydCB0aGUgZmllbGRzIG9mIHRoZSBnaXZlbiBEZXNjcmlwdG9yIGJ5IG51bWJlciBpbnRvIGEgbmV3W10nZCBhcnJheQorLy8gYW5kIHJldHVybiBpdC4gVGhlIGNhbGxlciBzaG91bGQgZGVsZXRlIHRoZSByZXR1cm5lZCBhcnJheS4KK2NvbnN0IEZpZWxkRGVzY3JpcHRvcioqIFNvcnRGaWVsZHNCeU51bWJlcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKworLy8gRG9lcyB0aGlzIG1lc3NhZ2UgY2xhc3MgaGF2ZSBhbnkgcGFja2VkIGZpZWxkcz8KK2lubGluZSBib29sIEhhc1BhY2tlZEZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGRlc2NyaXB0b3ItPmZpZWxkKGkpLT5pc19wYWNrZWQoKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gQ2hlY2sgYSBtZXNzYWdlIHR5cGUgYW5kIGl0cyBzdWItbWVzc2FnZSB0eXBlcyByZWN1cnNpdmVseSB0byBzZWUgaWYgYW55IG9mCisvLyB0aGVtIGhhcyBhIHJlcXVpcmVkIGZpZWxkLiBSZXR1cm4gdHJ1ZSBpZiBhIHJlcXVpcmVkIGZpZWxkIGlzIGZvdW5kLgorYm9vbCBIYXNSZXF1aXJlZEZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKworaW5saW5lIGJvb2wgSXNQcm90bzIoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8yOworfQorCitpbmxpbmUgYm9vbCBJc1JlYWxPbmVvZihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfb25lb2YoKSAmJgorICAgICAgICAgIWRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfb25lb2YoKS0+aXNfc3ludGhldGljKCk7Cit9CisKK2lubGluZSBib29sIEhhc0hhenplcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuICFkZXNjcmlwdG9yLT5pc19yZXBlYXRlZCgpICYmCisgICAgICAgICAoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkgfHwgZGVzY3JpcHRvci0+aGFzX29wdGlvbmFsX2tleXdvcmQoKSB8fAorICAgICAgICAgIElzUHJvdG8yKGRlc2NyaXB0b3ItPmZpbGUoKSkgfHwgSXNSZWFsT25lb2YoZGVzY3JpcHRvcikpOworfQorCitpbmxpbmUgYm9vbCBIYXNIYXNiaXQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIC8vIE5vdGUgdGhhdCBjdXJyZW50bHkgbWVzc2FnZSBmaWVsZHMgaW5zaWRlIG9uZW9mcyBoYXZlIGhhc2JpdHMuIFRoaXMgaXMKKyAgLy8gc3VycHJpc2luZywgYXMgdGhlIG9uZW9mIGNhc2Ugc2hvdWxkIGF2b2lkIGFueSBuZWVkIGZvciBhIGhhc2JpdC4gQnV0IGlmCisgIC8vIHlvdSBjaGFuZ2UgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIGhhc2JpdHMgZm9yIG9uZW9mcywgYSBmZXcgdGVzdHMgZmFpbC4KKyAgLy8gVE9ETyhiLzEyNDM0Nzc5MCk6IHJlbW92ZSBoYXNiaXRzIGZvciBvbmVvZnMKKyAgcmV0dXJuICFkZXNjcmlwdG9yLT5pc19yZXBlYXRlZCgpICYmCisgICAgICAgICAoZGVzY3JpcHRvci0+aGFzX29wdGlvbmFsX2tleXdvcmQoKSB8fCBJc1Byb3RvMihkZXNjcmlwdG9yLT5maWxlKCkpKTsKK30KKworLy8gV2hldGhlciBnZW5lcmF0ZSBjbGFzc2VzIGV4cG9zZSBwdWJsaWMgUEFSU0VSIGluc3RhbmNlcy4KK2lubGluZSBib29sIEV4cG9zZVB1YmxpY1BhcnNlcihjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICAvLyBUT0RPKGxpdWppc2kpOiBNYXJrIHRoZSBQQVJTRVIgcHJpdmF0ZSBpbiAzLjEueCByZWxlYXNlcy4KKyAgcmV0dXJuIGRlc2NyaXB0b3ItPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8yOworfQorCisvLyBXaGV0aGVyIHVua25vd24gZW51bSB2YWx1ZXMgYXJlIGtlcHQgKGkuZS4sIG5vdCBzdG9yZWQgaW4gVW5rbm93bkZpZWxkU2V0CisvLyBidXQgaW4gdGhlIG1lc3NhZ2UgYW5kIGNhbiBiZSBxdWVyaWVkIHVzaW5nIGFkZGl0aW9uYWwgZ2V0dGVycyB0aGF0IHJldHVybgorLy8gaW50cy4KK2lubGluZSBib29sIFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMzsKK30KKworaW5saW5lIGJvb2wgU3VwcG9ydFVua25vd25FbnVtVmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICByZXR1cm4gZmllbGQtPmZpbGUoKS0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzM7Cit9CisKKy8vIENoZWNrIHdoZXRoZXIgYSBtZXNzYWdlIGhhcyByZXBlYXRlZCBmaWVsZHMuCitib29sIEhhc1JlcGVhdGVkRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCitpbmxpbmUgYm9vbCBJc01hcEVudHJ5KGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5tYXBfZW50cnkoKTsKK30KKworaW5saW5lIGJvb2wgSXNNYXBGaWVsZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPmlzX21hcCgpOworfQorCitpbmxpbmUgYm9vbCBJc0FueU1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgPT0gImdvb2dsZS5wcm90b2J1Zi5BbnkiOworfQorCitpbmxpbmUgYm9vbCBJc1dyYXBwZXJzUHJvdG9GaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5uYW1lKCkgPT0gImdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90byI7Cit9CisKK2lubGluZSBib29sIENoZWNrVXRmOChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPmZpbGUoKS0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzMgfHwKKyAgICAgICAgIGRlc2NyaXB0b3ItPmZpbGUoKS0+b3B0aW9ucygpLmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIEdlbmVyYXRlZENvZGVWZXJzaW9uU3VmZml4KCkgeworICByZXR1cm4gIlYzIjsKK30KKwordm9pZCBXcml0ZVVJbnQzMlRvVXRmMTZDaGFyU2VxdWVuY2UodWludDMyX3QgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+KiBvdXRwdXQpOworCitpbmxpbmUgdm9pZCBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoaW50IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSB7CisgIFdyaXRlVUludDMyVG9VdGYxNkNoYXJTZXF1ZW5jZShzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUpLCBvdXRwdXQpOworfQorCisvLyBFc2NhcGUgYSBVVEYtMTYgY2hhcmFjdGVyIHNvIGl0IGNhbiBiZSBlbWJlZGRlZCBpbiBhIEphdmEgc3RyaW5nIGxpdGVyYWwuCit2b2lkIEVzY2FwZVV0ZjE2VG9TdHJpbmcodWludDE2X3QgY29kZSwgc3RkOjpzdHJpbmcqIG91dHB1dCk7CisKKy8vIE9ubHkgdGhlIGxvd2VzdCB0d28gYnl0ZXMgb2YgdGhlIHJldHVybiB2YWx1ZSBhcmUgdXNlZC4gVGhlIGxvd2VzdCBieXRlCisvLyBpcyB0aGUgaW50ZWdlciB2YWx1ZSBvZiBhIGovYy9nL3Byb3RvYnVmL0ZpZWxkVHlwZSBlbnVtLiBGb3IgdGhlIG90aGVyCisvLyBieXRlOgorLy8gICAgYml0IDA6IHdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlcXVpcmVkLgorLy8gICAgYml0IDE6IHdoZXRoZXIgdGhlIGZpZWxkIHJlcXVpcmVzIFVURi04IHZhbGlkYXRpb24uCisvLyAgICBiaXQgMjogd2hldGhlciB0aGUgZmllbGQgbmVlZHMgaXNJbml0aWFsaXplZCBjaGVjay4KKy8vICAgIGJpdCAzOiB3aGV0aGVyIHRoZSBmaWVsZCBpcyBhIG1hcCBmaWVsZCB3aXRoIHByb3RvMiBlbnVtIHZhbHVlLgorLy8gICAgYml0cyA0LTc6IHVudXNlZAoraW50IEdldEV4cGVyaW1lbnRhbEphdmFGaWVsZFR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKy8vIFRvIGdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgbmVlZCB0byBiZSBidWlsdCBmb3IgZXhwZXJpbWVudGFsIHJ1bnRpbWUKKy8vIGFuZCB0aGUgZmlyc3QgZmllbGQgbnVtYmVyIHRoYXQgYXJlIG5vdCBpbiB0aGUgdGFibGUgcGFydAorc3RkOjpwYWlyPGludCwgaW50PiBHZXRUYWJsZURyaXZlbk51bWJlck9mRW50cmllc0FuZExvb2tVcFN0YXJ0RmllbGROdW1iZXIoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiogZmllbGRzLCBpbnQgY291bnQpOworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfSEVMUEVSU19IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk0YjFiZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9KQVZBX0dFTkVSQVRPUl9IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9KQVZBX0dFTkVSQVRPUl9IXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZ2VuZXJhdG9yLmg+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfSkFWQV9HRU5FUkFUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9rb3RsaW5fZ2VuZXJhdG9yLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2tvdGxpbl9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmNTQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9rb3RsaW5fZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTU4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2tvdGxpbl9nZW5lcmF0b3IuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvb3B0aW9ucy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitLb3RsaW5HZW5lcmF0b3I6OktvdGxpbkdlbmVyYXRvcigpIHt9CitLb3RsaW5HZW5lcmF0b3I6On5Lb3RsaW5HZW5lcmF0b3IoKSB7fQorCit1aW50NjRfdCBLb3RsaW5HZW5lcmF0b3I6OkdldFN1cHBvcnRlZEZlYXR1cmVzKCkgY29uc3QgeworICByZXR1cm4gQ29kZUdlbmVyYXRvcjo6RmVhdHVyZTo6RkVBVFVSRV9QUk9UTzNfT1BUSU9OQUw7Cit9CisKK2Jvb2wgS290bGluR2VuZXJhdG9yOjpHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yKSBjb25zdCB7CisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIHBhcnNlIGdlbmVyYXRvciBvcHRpb25zCisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gPiBvcHRpb25zOworICBQYXJzZUdlbmVyYXRvclBhcmFtZXRlcihwYXJhbWV0ZXIsICZvcHRpb25zKTsKKyAgT3B0aW9ucyBmaWxlX29wdGlvbnM7CisKKyAgZm9yIChhdXRvJiBvcHRpb24gOiBvcHRpb25zKSB7CisgICAgaWYgKG9wdGlvbi5maXJzdCA9PSAib3V0cHV0X2xpc3RfZmlsZSIpIHsKKyAgICAgIGZpbGVfb3B0aW9ucy5vdXRwdXRfbGlzdF9maWxlID0gb3B0aW9uLnNlY29uZDsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbi5maXJzdCA9PSAiaW1tdXRhYmxlIikgeworICAgICAgLy8gTm90ZTogdGhlIG9wdGlvbiBpcyBjb25zaWRlcmVkIGFsd2F5cyBzZXQgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQuCisgICAgICBmaWxlX29wdGlvbnMuZ2VuZXJhdGVfaW1tdXRhYmxlX2NvZGUgPSB0cnVlOworICAgIH0gZWxzZSBpZiAob3B0aW9uLmZpcnN0ID09ICJtdXRhYmxlIikgeworICAgICAgKmVycm9yID0gIk11dGFibGUgbm90IHN1cHBvcnRlZCBieSBLb3RsaW4gZ2VuZXJhdG9yIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbi5maXJzdCA9PSAic2hhcmVkIikgeworICAgICAgLy8gTm90ZTogdGhlIG9wdGlvbiBpcyBjb25zaWRlcmVkIGFsd2F5cyBzZXQgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQuCisgICAgICBmaWxlX29wdGlvbnMuZ2VuZXJhdGVfc2hhcmVkX2NvZGUgPSB0cnVlOworICAgIH0gZWxzZSBpZiAob3B0aW9uLmZpcnN0ID09ICJsaXRlIikgeworICAgICAgZmlsZV9vcHRpb25zLmVuZm9yY2VfbGl0ZSA9IHRydWU7CisgICAgfSBlbHNlIGlmIChvcHRpb24uZmlyc3QgPT0gImFubm90YXRlX2NvZGUiKSB7CisgICAgICBmaWxlX29wdGlvbnMuYW5ub3RhdGVfY29kZSA9IHRydWU7CisgICAgfSBlbHNlIGlmIChvcHRpb24uZmlyc3QgPT0gImFubm90YXRpb25fbGlzdF9maWxlIikgeworICAgICAgZmlsZV9vcHRpb25zLmFubm90YXRpb25fbGlzdF9maWxlID0gb3B0aW9uLnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgKmVycm9yID0gIlVua25vd24gZ2VuZXJhdG9yIG9wdGlvbjogIiArIG9wdGlvbi5maXJzdDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBXZSBvbmx5IHN1cHBvcnQgZ2VuZXJhdGlvbiBvZiBpbW11dGFibGUgY29kZSBzbyB3ZSBkbyBpdC4KKyAgZmlsZV9vcHRpb25zLmdlbmVyYXRlX2ltbXV0YWJsZV9jb2RlID0gdHJ1ZTsKKyAgZmlsZV9vcHRpb25zLmdlbmVyYXRlX3NoYXJlZF9jb2RlID0gdHJ1ZTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYWxsX2ZpbGVzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYWxsX2Fubm90YXRpb25zOworCisgIHN0ZDo6dW5pcXVlX3B0cjxGaWxlR2VuZXJhdG9yPiBmaWxlX2dlbmVyYXRvcigKKyAgICAgICAgbmV3IEZpbGVHZW5lcmF0b3IoZmlsZSwgZmlsZV9vcHRpb25zLCAvKiBpbW11dGFibGVfYXBpID0gKi8gdHJ1ZSkpOworCisgIGlmICghZmlsZV9nZW5lcmF0b3IgfHwgIWZpbGVfZ2VuZXJhdG9yLT5WYWxpZGF0ZShlcnJvcikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBhdXRvIG9wZW5fZmlsZSA9IFtjb250ZXh0XShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4oY29udGV4dC0+T3BlbihmaWxlbmFtZSkpOworICB9OworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2RpciA9IEphdmFQYWNrYWdlVG9EaXIoZmlsZV9nZW5lcmF0b3ItPmphdmFfcGFja2FnZSgpKTsKKyAgc3RkOjpzdHJpbmcga290bGluX2ZpbGVuYW1lID0gcGFja2FnZV9kaXI7CisgIGtvdGxpbl9maWxlbmFtZSArPSBmaWxlX2dlbmVyYXRvci0+R2V0S290bGluQ2xhc3NuYW1lKCk7CisgIGtvdGxpbl9maWxlbmFtZSArPSAiLmt0IjsKKyAgYWxsX2ZpbGVzLnB1c2hfYmFjayhrb3RsaW5fZmlsZW5hbWUpOworICBzdGQ6OnN0cmluZyBpbmZvX2Z1bGxfcGF0aCA9IGtvdGxpbl9maWxlbmFtZSArICIucGIubWV0YSI7CisgIGlmIChmaWxlX29wdGlvbnMuYW5ub3RhdGVfY29kZSkgeworICAgIGFsbF9hbm5vdGF0aW9ucy5wdXNoX2JhY2soaW5mb19mdWxsX3BhdGgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgbWFpbiBrb3RsaW4gZmlsZS4KKyAgYXV0byBvdXRwdXQgPSBvcGVuX2ZpbGUoa290bGluX2ZpbGVuYW1lKTsKKyAgR2VuZXJhdGVkQ29kZUluZm8gYW5ub3RhdGlvbnM7CisgIGlvOjpBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGFubm90YXRpb25fY29sbGVjdG9yKAorICAgICAgJmFubm90YXRpb25zKTsKKyAgaW86OlByaW50ZXIgcHJpbnRlcigKKyAgICAgIG91dHB1dC5nZXQoKSwgJyQnLAorICAgICAgZmlsZV9vcHRpb25zLmFubm90YXRlX2NvZGUgPyAmYW5ub3RhdGlvbl9jb2xsZWN0b3IgOiBudWxscHRyKTsKKworICBmaWxlX2dlbmVyYXRvci0+R2VuZXJhdGVLb3RsaW5TaWJsaW5ncyhwYWNrYWdlX2RpciwgY29udGV4dCwgJmFsbF9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsbF9hbm5vdGF0aW9ucyk7CisKKyAgaWYgKGZpbGVfb3B0aW9ucy5hbm5vdGF0ZV9jb2RlKSB7CisgICAgYXV0byBpbmZvX291dHB1dCA9IG9wZW5fZmlsZShpbmZvX2Z1bGxfcGF0aCk7CisgICAgYW5ub3RhdGlvbnMuU2VyaWFsaXplVG9aZXJvQ29weVN0cmVhbShpbmZvX291dHB1dC5nZXQoKSk7CisgIH0KKworICAvLyBHZW5lcmF0ZSBvdXRwdXQgbGlzdCBpZiByZXF1ZXN0ZWQuCisgIGlmICghZmlsZV9vcHRpb25zLm91dHB1dF9saXN0X2ZpbGUuZW1wdHkoKSkgeworICAgIC8vIEdlbmVyYXRlIG91dHB1dCBsaXN0LiAgVGhpcyBpcyBqdXN0IGEgc2ltcGxlIHRleHQgZmlsZSBwbGFjZWQgaW4gYQorICAgIC8vIGRldGVybWluaXN0aWMgbG9jYXRpb24gd2hpY2ggbGlzdHMgdGhlIC5rdCBmaWxlcyBiZWluZyBnZW5lcmF0ZWQuCisgICAgYXV0byBzcmNsaXN0X3Jhd19vdXRwdXQgPSBvcGVuX2ZpbGUoZmlsZV9vcHRpb25zLm91dHB1dF9saXN0X2ZpbGUpOworICAgIGlvOjpQcmludGVyIHNyY2xpc3RfcHJpbnRlcihzcmNsaXN0X3Jhd19vdXRwdXQuZ2V0KCksICckJyk7CisgICAgZm9yIChhdXRvJiBhbGxfZmlsZSA6IGFsbF9maWxlcykgeworICAgICAgc3JjbGlzdF9wcmludGVyLlByaW50KCIkZmlsZW5hbWUkXG4iLCAiZmlsZW5hbWUiLCBhbGxfZmlsZSk7CisgICAgfQorICB9CisKKyAgaWYgKCFmaWxlX29wdGlvbnMuYW5ub3RhdGlvbl9saXN0X2ZpbGUuZW1wdHkoKSkgeworICAgIC8vIEdlbmVyYXRlIG91dHB1dCBsaXN0LiAgVGhpcyBpcyBqdXN0IGEgc2ltcGxlIHRleHQgZmlsZSBwbGFjZWQgaW4gYQorICAgIC8vIGRldGVybWluaXN0aWMgbG9jYXRpb24gd2hpY2ggbGlzdHMgdGhlIC5rdCBmaWxlcyBiZWluZyBnZW5lcmF0ZWQuCisgICAgYXV0byBhbm5vdGF0aW9uX2xpc3RfcmF3X291dHB1dCA9CisgICAgICAgIG9wZW5fZmlsZShmaWxlX29wdGlvbnMuYW5ub3RhdGlvbl9saXN0X2ZpbGUpOworICAgIGlvOjpQcmludGVyIGFubm90YXRpb25fbGlzdF9wcmludGVyKGFubm90YXRpb25fbGlzdF9yYXdfb3V0cHV0LmdldCgpLCAnJCcpOworICAgIGZvciAoYXV0byYgYWxsX2Fubm90YXRpb24gOiBhbGxfYW5ub3RhdGlvbnMpIHsKKyAgICAgIGFubm90YXRpb25fbGlzdF9wcmludGVyLlByaW50KCIkZmlsZW5hbWUkXG4iLCAiZmlsZW5hbWUiLCBhbGxfYW5ub3RhdGlvbik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2tvdGxpbl9nZW5lcmF0b3IuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9rb3RsaW5fZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkOTY4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9rb3RsaW5fZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSw3NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEdlbmVyYXRlcyBLb3RsaW4gY29kZSBmb3IgYSBnaXZlbiAucHJvdG8gZmlsZS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9LT1RMSU5fR0VORVJBVE9SX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9LT1RMSU5fR0VORVJBVE9SX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCisvLyBDb2RlR2VuZXJhdG9yIGltcGxlbWVudGF0aW9uIHdoaWNoIGdlbmVyYXRlcyBLb3RsaW4gY29kZS4gIElmIHlvdSBjcmVhdGUgeW91cgorLy8gb3duIHByb3RvY29sIGNvbXBpbGVyIGJpbmFyeSBhbmQgeW91IHdhbnQgaXQgdG8gc3VwcG9ydCBLb3RsaW4gb3V0cHV0LCB5b3UKKy8vIGNhbiBkbyBzbyBieSByZWdpc3RlcmluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIENvZGVHZW5lcmF0b3Igd2l0aCB0aGUKKy8vIENvbW1hbmRMaW5lSW50ZXJmYWNlIGluIHlvdXIgbWFpbigpIGZ1bmN0aW9uLgorY2xhc3MgUFJPVE9DX0VYUE9SVCBLb3RsaW5HZW5lcmF0b3IgOiBwdWJsaWMgQ29kZUdlbmVyYXRvciB7CisgcHVibGljOgorICBLb3RsaW5HZW5lcmF0b3IoKTsKKyAgfktvdGxpbkdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgQ29kZUdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwgc3RkOjpzdHJpbmcqIGVycm9yKSBjb25zdCBvdmVycmlkZTsKKworICB1aW50NjRfdCBHZXRTdXBwb3J0ZWRGZWF0dXJlcygpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEtvdGxpbkdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9LT1RMSU5fR0VORVJBVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tYXBfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhYmJhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tYXBfZmllbGQuY2MKQEAgLTAsMCArMSw4NzQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWFwX2ZpZWxkLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lX3Jlc29sdmVyLmg+CisKKy8vIE11c3QgYmUgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCituYW1lc3BhY2UgeworCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIEtleUZpZWxkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBHT09HTEVfQ0hFQ0tfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UsIGRlc2NyaXB0b3ItPnR5cGUoKSk7CisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UgPSBkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKTsKKyAgR09PR0xFX0NIRUNLKG1lc3NhZ2UtPm9wdGlvbnMoKS5tYXBfZW50cnkoKSk7CisgIHJldHVybiBtZXNzYWdlLT5tYXBfa2V5KCk7Cit9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvciogVmFsdWVGaWVsZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgR09PR0xFX0NIRUNLX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBkZXNjcmlwdG9yLT50eXBlKCkpOworICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlID0gZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCk7CisgIEdPT0dMRV9DSEVDSyhtZXNzYWdlLT5vcHRpb25zKCkubWFwX2VudHJ5KCkpOworICByZXR1cm4gbWVzc2FnZS0+bWFwX3ZhbHVlKCk7Cit9CisKK3N0ZDo6c3RyaW5nIFR5cGVOYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlciwgYm9vbCBib3hlZCkgeworICBpZiAoR2V0SmF2YVR5cGUoZmllbGQpID09IEpBVkFUWVBFX01FU1NBR0UpIHsKKyAgICByZXR1cm4gbmFtZV9yZXNvbHZlci0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSk7CisgIH0gZWxzZSBpZiAoR2V0SmF2YVR5cGUoZmllbGQpID09IEpBVkFUWVBFX0VOVU0pIHsKKyAgICByZXR1cm4gbmFtZV9yZXNvbHZlci0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGZpZWxkLT5lbnVtX3R5cGUoKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGJveGVkID8gQm94ZWRQcmltaXRpdmVUeXBlTmFtZShHZXRKYXZhVHlwZShmaWVsZCkpCisgICAgICAgICAgICAgICAgIDogUHJpbWl0aXZlVHlwZU5hbWUoR2V0SmF2YVR5cGUoZmllbGQpKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBLb3RsaW5UeXBlTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXIpIHsKKyAgaWYgKEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9NRVNTQUdFKSB7CisgICAgcmV0dXJuIG5hbWVfcmVzb2x2ZXItPkdldEltbXV0YWJsZUNsYXNzTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCkpOworICB9IGVsc2UgaWYgKEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9FTlVNKSB7CisgICAgcmV0dXJuIG5hbWVfcmVzb2x2ZXItPkdldEltbXV0YWJsZUNsYXNzTmFtZShmaWVsZC0+ZW51bV90eXBlKCkpOworICB9IGVsc2UgeworICAgIHJldHVybiBLb3RsaW5UeXBlTmFtZShHZXRKYXZhVHlwZShmaWVsZCkpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIFdpcmVUeXBlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuICJjb20uZ29vZ2xlLnByb3RvYnVmLldpcmVGb3JtYXQuRmllbGRUeXBlLiIgKworICAgICAgICAgc3RkOjpzdHJpbmcoRmllbGRUeXBlTmFtZShmaWVsZC0+dHlwZSgpKSk7Cit9CisKK3ZvaWQgU2V0TWVzc2FnZVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwgY29uc3QgRmllbGRHZW5lcmF0b3JJbmZvKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzKSB7CisgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIGluZm8sIHZhcmlhYmxlcyk7CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyID0gY29udGV4dC0+R2V0TmFtZVJlc29sdmVyKCk7CisKKyAgKCp2YXJpYWJsZXMpWyJ0eXBlIl0gPQorICAgICAgbmFtZV9yZXNvbHZlci0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBrZXkgPSBLZXlGaWVsZChkZXNjcmlwdG9yKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZSA9IFZhbHVlRmllbGQoZGVzY3JpcHRvcik7CisgIGNvbnN0IEphdmFUeXBlIGtleUphdmFUeXBlID0gR2V0SmF2YVR5cGUoa2V5KTsKKyAgY29uc3QgSmF2YVR5cGUgdmFsdWVKYXZhVHlwZSA9IEdldEphdmFUeXBlKHZhbHVlKTsKKworICBzdGQ6OnN0cmluZyBwYXNzX3Rocm91Z2hfbnVsbG5lc3MgPSAiLyogbnVsbGFibGUgKi9cbiI7CisKKyAgKCp2YXJpYWJsZXMpWyJrZXlfdHlwZSJdID0gVHlwZU5hbWUoa2V5LCBuYW1lX3Jlc29sdmVyLCBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGJveGVkX2tleV90eXBlID0gVHlwZU5hbWUoa2V5LCBuYW1lX3Jlc29sdmVyLCB0cnVlKTsKKyAgKCp2YXJpYWJsZXMpWyJib3hlZF9rZXlfdHlwZSJdID0gYm94ZWRfa2V5X3R5cGU7CisgICgqdmFyaWFibGVzKVsia3Rfa2V5X3R5cGUiXSA9IEtvdGxpblR5cGVOYW1lKGtleSwgbmFtZV9yZXNvbHZlcik7CisgICgqdmFyaWFibGVzKVsia3RfdmFsdWVfdHlwZSJdID0gS290bGluVHlwZU5hbWUodmFsdWUsIG5hbWVfcmVzb2x2ZXIpOworICAvLyBVc2VkIGZvciBjYWxsaW5nIHRoZSBzZXJpYWxpemF0aW9uIGZ1bmN0aW9uLgorICAoKnZhcmlhYmxlcylbInNob3J0X2tleV90eXBlIl0gPQorICAgICAgYm94ZWRfa2V5X3R5cGUuc3Vic3RyKGJveGVkX2tleV90eXBlLnJmaW5kKCcuJykgKyAxKTsKKyAgKCp2YXJpYWJsZXMpWyJrZXlfd2lyZV90eXBlIl0gPSBXaXJlVHlwZShrZXkpOworICAoKnZhcmlhYmxlcylbImtleV9kZWZhdWx0X3ZhbHVlIl0gPSBEZWZhdWx0VmFsdWUoa2V5LCB0cnVlLCBuYW1lX3Jlc29sdmVyKTsKKyAgKCp2YXJpYWJsZXMpWyJrZXlfbnVsbF9jaGVjayJdID0KKyAgICAgIElzUmVmZXJlbmNlVHlwZShrZXlKYXZhVHlwZSkKKyAgICAgICAgICA/ICJpZiAoa2V5ID09IG51bGwpIHsgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKFwibWFwIGtleVwiKTsgfSIKKyAgICAgICAgICA6ICIiOworICAoKnZhcmlhYmxlcylbInZhbHVlX251bGxfY2hlY2siXSA9CisgICAgICB2YWx1ZUphdmFUeXBlICE9IEpBVkFUWVBFX0VOVU0gJiYgSXNSZWZlcmVuY2VUeXBlKHZhbHVlSmF2YVR5cGUpCisgICAgICAgICAgPyAiaWYgKHZhbHVlID09IG51bGwpIHtcbiIKKyAgICAgICAgICAgICIgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihcIm1hcCB2YWx1ZVwiKTtcbiIKKyAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgOiAiIjsKKyAgaWYgKHZhbHVlSmF2YVR5cGUgPT0gSkFWQVRZUEVfRU5VTSkgeworICAgIC8vIFdlIHN0b3JlIGVudW1zIGFzIEludGVnZXJzIGludGVybmFsbHkuCisgICAgKCp2YXJpYWJsZXMpWyJ2YWx1ZV90eXBlIl0gPSAiaW50IjsKKyAgICAoKnZhcmlhYmxlcylbImJveGVkX3ZhbHVlX3R5cGUiXSA9ICJqYXZhLmxhbmcuSW50ZWdlciI7CisgICAgKCp2YXJpYWJsZXMpWyJ2YWx1ZV93aXJlX3R5cGUiXSA9IFdpcmVUeXBlKHZhbHVlKTsKKyAgICAoKnZhcmlhYmxlcylbInZhbHVlX2RlZmF1bHRfdmFsdWUiXSA9CisgICAgICAgIERlZmF1bHRWYWx1ZSh2YWx1ZSwgdHJ1ZSwgbmFtZV9yZXNvbHZlcikgKyAiLmdldE51bWJlcigpIjsKKworICAgICgqdmFyaWFibGVzKVsidmFsdWVfZW51bV90eXBlIl0gPSBUeXBlTmFtZSh2YWx1ZSwgbmFtZV9yZXNvbHZlciwgZmFsc2UpOworCisgICAgKCp2YXJpYWJsZXMpWyJ2YWx1ZV9lbnVtX3R5cGVfcGFzc190aHJvdWdoX251bGxuZXNzIl0gPQorICAgICAgICBwYXNzX3Rocm91Z2hfbnVsbG5lc3MgKyAoKnZhcmlhYmxlcylbInZhbHVlX2VudW1fdHlwZSJdOworCisgICAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3ItPmZpbGUoKSkpIHsKKyAgICAgIC8vIE1hcCB1bmtub3duIHZhbHVlcyB0byBhIHNwZWNpYWwgVU5SRUNPR05JWkVEIHZhbHVlIGlmIHN1cHBvcnRlZC4KKyAgICAgICgqdmFyaWFibGVzKVsidW5yZWNvZ25pemVkX3ZhbHVlIl0gPQorICAgICAgICAgICgqdmFyaWFibGVzKVsidmFsdWVfZW51bV90eXBlIl0gKyAiLlVOUkVDT0dOSVpFRCI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE1hcCB1bmtub3duIHZhbHVlcyB0byB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB3ZSBkb24ndCBoYXZlIFVOUkVDT0dOSVpFRC4KKyAgICAgICgqdmFyaWFibGVzKVsidW5yZWNvZ25pemVkX3ZhbHVlIl0gPQorICAgICAgICAgIERlZmF1bHRWYWx1ZSh2YWx1ZSwgdHJ1ZSwgbmFtZV9yZXNvbHZlcik7CisgICAgfQorICB9IGVsc2UgeworICAgICgqdmFyaWFibGVzKVsidmFsdWVfdHlwZSJdID0gVHlwZU5hbWUodmFsdWUsIG5hbWVfcmVzb2x2ZXIsIGZhbHNlKTsKKworICAgICgqdmFyaWFibGVzKVsidmFsdWVfdHlwZV9wYXNzX3Rocm91Z2hfbnVsbG5lc3MiXSA9CisgICAgICAgIChJc1JlZmVyZW5jZVR5cGUodmFsdWVKYXZhVHlwZSkgPyBwYXNzX3Rocm91Z2hfbnVsbG5lc3MgOiAiIikgKworICAgICAgICAoKnZhcmlhYmxlcylbInZhbHVlX3R5cGUiXTsKKworICAgICgqdmFyaWFibGVzKVsiYm94ZWRfdmFsdWVfdHlwZSJdID0gVHlwZU5hbWUodmFsdWUsIG5hbWVfcmVzb2x2ZXIsIHRydWUpOworICAgICgqdmFyaWFibGVzKVsidmFsdWVfd2lyZV90eXBlIl0gPSBXaXJlVHlwZSh2YWx1ZSk7CisgICAgKCp2YXJpYWJsZXMpWyJ2YWx1ZV9kZWZhdWx0X3ZhbHVlIl0gPQorICAgICAgICBEZWZhdWx0VmFsdWUodmFsdWUsIHRydWUsIG5hbWVfcmVzb2x2ZXIpOworICB9CisgICgqdmFyaWFibGVzKVsidHlwZV9wYXJhbWV0ZXJzIl0gPQorICAgICAgKCp2YXJpYWJsZXMpWyJib3hlZF9rZXlfdHlwZSJdICsgIiwgIiArICgqdmFyaWFibGVzKVsiYm94ZWRfdmFsdWVfdHlwZSJdOworICAvLyBUT0RPKGJpcmRvKTogQWRkIEBkZXByZWNhdGVkIGphdmFkb2Mgd2hlbiBnZW5lcmF0aW5nIGphdmFkb2MgaXMgc3VwcG9ydGVkCisgIC8vIGJ5IHRoZSBwcm90byBjb21waWxlcgorICAoKnZhcmlhYmxlcylbImRlcHJlY2F0aW9uIl0gPQorICAgICAgZGVzY3JpcHRvci0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKSA/ICJAamF2YS5sYW5nLkRlcHJlY2F0ZWQgIiA6ICIiOworICAoKnZhcmlhYmxlcylbImt0X2RlcHJlY2F0aW9uIl0gPQorICAgICAgZGVzY3JpcHRvci0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKQorICAgICAgICAgID8gIkBrb3RsaW4uRGVwcmVjYXRlZChtZXNzYWdlID0gXCJGaWVsZCAiICsgKCp2YXJpYWJsZXMpWyJuYW1lIl0gKworICAgICAgICAgICAgICAgICIgaXMgZGVwcmVjYXRlZFwiKSAiCisgICAgICAgICAgOiAiIjsKKyAgKCp2YXJpYWJsZXMpWyJvbl9jaGFuZ2VkIl0gPSAib25DaGFuZ2VkKCk7IjsKKworICAoKnZhcmlhYmxlcylbImRlZmF1bHRfZW50cnkiXSA9CisgICAgICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX25hbWUiXSArICJEZWZhdWx0RW50cnlIb2xkZXIuZGVmYXVsdEVudHJ5IjsKKyAgKCp2YXJpYWJsZXMpWyJtYXBfZmllbGRfcGFyYW1ldGVyIl0gPSAoKnZhcmlhYmxlcylbImRlZmF1bHRfZW50cnkiXTsKKyAgKCp2YXJpYWJsZXMpWyJkZXNjcmlwdG9yIl0gPQorICAgICAgbmFtZV9yZXNvbHZlci0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPmZpbGUoKSkgKyAiLmludGVybmFsXyIgKworICAgICAgVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKSkgKyAiX2Rlc2NyaXB0b3IsICI7CisgICgqdmFyaWFibGVzKVsidmVyIl0gPSBHZW5lcmF0ZWRDb2RlVmVyc2lvblN1ZmZpeCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworSW1tdXRhYmxlTWFwRmllbGRHZW5lcmF0b3I6OkltbXV0YWJsZU1hcEZpZWxkR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICBDb250ZXh0KiBjb250ZXh0KQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7CisgIFNldE1lc3NhZ2VWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGRlc2NyaXB0b3IpLCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZXNfKTsKK30KKworSW1tdXRhYmxlTWFwRmllbGRHZW5lcmF0b3I6On5JbW11dGFibGVNYXBGaWVsZEdlbmVyYXRvcigpIHt9CisKK2ludCBJbW11dGFibGVNYXBGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiAwOyB9CisKK2ludCBJbW11dGFibGVNYXBGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7IHJldHVybiAxOyB9CisKK3ZvaWQgSW1tdXRhYmxlTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kaW50ICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50JH0kKCk7XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJGJvb2xlYW4gJHskY29udGFpbnMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgJGtleV90eXBlJCBrZXkpO1xuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIGlmIChHZXRKYXZhVHlwZShWYWx1ZUZpZWxkKGRlc2NyaXB0b3JfKSkgPT0gSkFWQVRZUEVfRU5VTSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIi8qKlxuIgorICAgICAgICAgICAgICAgICAgICIgKiBVc2Uge0BsaW5rICNnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKX0gaW5zdGVhZC5cbiIKKyAgICAgICAgICAgICAgICAgICAiICovXG4iCisgICAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuRGVwcmVjYXRlZFxuIgorICAgICAgICAgICAgICAgICAgICJqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICR2YWx1ZV9lbnVtX3R5cGUkPlxuIgorICAgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKTtcbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiJGRlcHJlY2F0aW9uJGphdmEudXRpbC5NYXA8JGJveGVkX2tleV90eXBlJCwgJHZhbHVlX2VudW1fdHlwZSQ+XG4iCisgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAkfSQoKTtcbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiQkdmFsdWVfZW51bV90eXBlX3Bhc3NfdGhyb3VnaF9udWxsbmVzcyQgIgorICAgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckRlZmF1bHQkfSQoXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAka2V5X3R5cGUkIGtleSxcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICR2YWx1ZV9lbnVtX3R5cGVfcGFzc190aHJvdWdoX251bGxuZXNzJCAiCisgICAgICAgICAgICAgICAgICAgIiAgICAgICAgZGVmYXVsdFZhbHVlKTtcbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiJGRlcHJlY2F0aW9uJCR2YWx1ZV9lbnVtX3R5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJE9yVGhyb3ckfSQoXG4iCisgICAgICAgICIgICAgJGtleV90eXBlJCBrZXkpO1xuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICAgIi8qKlxuIgorICAgICAgICAgICIgKiBVc2Uge0BsaW5rICNnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZU1hcCgpfSBpbnN0ZWFkLlxuIgorICAgICAgICAgICIgKi9cbiIKKyAgICAgICAgICAiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iCisgICAgICAgICAgImphdmEudXRpbC5NYXA8JHR5cGVfcGFyYW1ldGVycyQ+XG4iCisgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlJH0kKCk7XG4iKTsKKyAgICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTWFwPCR0eXBlX3BhcmFtZXRlcnMkPlxuIgorICAgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlTWFwJH0kKCk7XG4iKTsKKyAgICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICAgICAgICAgICAgICAgICIkdmFsdWVfdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWVPckRlZmF1bHQkfSQoXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgICRrZXlfdHlwZSQga2V5LFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgICAkdmFsdWVfdHlwZSQgZGVmYXVsdFZhbHVlKTtcbiIpOworICAgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAgICAgICAgICAgICAgIiR2YWx1ZV90eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZU9yVGhyb3ckfSQoXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgICRrZXlfdHlwZSQga2V5KTtcbiIpOworICAgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiLyoqXG4iCisgICAgICAgICAgICAgICAgICAgIiAqIFVzZSB7QGxpbmsgI2dldCRjYXBpdGFsaXplZF9uYW1lJE1hcCgpfSBpbnN0ZWFkLlxuIgorICAgICAgICAgICAgICAgICAgICIgKi9cbiIKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iCisgICAgICAgICAgICAgICAgICAgImphdmEudXRpbC5NYXA8JHR5cGVfcGFyYW1ldGVycyQ+XG4iCisgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpO1xuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJGphdmEudXRpbC5NYXA8JHR5cGVfcGFyYW1ldGVycyQ+XG4iCisgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJE1hcCR9JCgpO1xuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAgICAgICAgICAgICIkdmFsdWVfdHlwZV9wYXNzX3Rocm91Z2hfbnVsbG5lc3MkICIKKyAgICAgICAgICAgICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JEZWZhdWx0JH0kKFxuIgorICAgICAgICAgICAgICAgICAgICIgICAgJGtleV90eXBlJCBrZXksXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAkdmFsdWVfdHlwZV9wYXNzX3Rocm91Z2hfbnVsbG5lc3MkIGRlZmF1bHRWYWx1ZSk7XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kXG4iCisgICAgICAgICAgICAgICAgICAgIiR2YWx1ZV90eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPclRocm93JH0kKFxuIgorICAgICAgICAgICAgICAgICAgICIgICAgJGtleV90eXBlJCBrZXkpO1xuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgfQorfQorCit2b2lkIEltbXV0YWJsZU1hcEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgInByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzICRjYXBpdGFsaXplZF9uYW1lJERlZmF1bHRFbnRyeUhvbGRlciB7XG4iCisgICAgICAiICBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5NYXBFbnRyeTxcbiIKKyAgICAgICIgICAgICAkdHlwZV9wYXJhbWV0ZXJzJD4gZGVmYXVsdEVudHJ5ID1cbiIKKyAgICAgICIgICAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5NYXBFbnRyeVxuIgorICAgICAgIiAgICAgICAgICAuPCR0eXBlX3BhcmFtZXRlcnMkPm5ld0RlZmF1bHRJbnN0YW5jZShcbiIKKyAgICAgICIgICAgICAgICAgICAgICRkZXNjcmlwdG9yJFxuIgorICAgICAgIiAgICAgICAgICAgICAgJGtleV93aXJlX3R5cGUkLFxuIgorICAgICAgIiAgICAgICAgICAgICAgJGtleV9kZWZhdWx0X3ZhbHVlJCxcbiIKKyAgICAgICIgICAgICAgICAgICAgICR2YWx1ZV93aXJlX3R5cGUkLFxuIgorICAgICAgIiAgICAgICAgICAgICAgJHZhbHVlX2RlZmF1bHRfdmFsdWUkKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5NYXBGaWVsZDxcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkdHlwZV9wYXJhbWV0ZXJzJD4gJG5hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5NYXBGaWVsZDwkdHlwZV9wYXJhbWV0ZXJzJD5cbiIKKyAgICAgICAgICAgICAgICAgImludGVybmFsR2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgICAgICAgICAgICAiICBpZiAoJG5hbWUkXyA9PSBudWxsKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuTWFwRmllbGQuZW1wdHlNYXBGaWVsZChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgJG1hcF9maWVsZF9wYXJhbWV0ZXIkKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBpZiAoR2V0SmF2YVR5cGUoVmFsdWVGaWVsZChkZXNjcmlwdG9yXykpID09IEpBVkFUWVBFX0VOVU0pIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgInByaXZhdGUgc3RhdGljIGZpbmFsXG4iCisgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLk1hcEFkYXB0ZXIuQ29udmVydGVyPFxuIgorICAgICAgICAiICAgIGphdmEubGFuZy5JbnRlZ2VyLCAkdmFsdWVfZW51bV90eXBlJD4gJG5hbWUkVmFsdWVDb252ZXJ0ZXIgPVxuIgorICAgICAgICAiICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLk1hcEFkYXB0ZXIubmV3RW51bUNvbnZlcnRlcihcbiIKKyAgICAgICAgIiAgICAgICAgICAgICR2YWx1ZV9lbnVtX3R5cGUkLmludGVybmFsR2V0VmFsdWVNYXAoKSxcbiIKKyAgICAgICAgIiAgICAgICAgICAgICR1bnJlY29nbml6ZWRfdmFsdWUkKTtcbiIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLk1hcDwkYm94ZWRfa2V5X3R5cGUkLCAiCisgICAgICAgICIkdmFsdWVfZW51bV90eXBlJD5cbiIKKyAgICAgICAgImludGVybmFsR2V0QWRhcHRlZCRjYXBpdGFsaXplZF9uYW1lJE1hcChcbiIKKyAgICAgICAgIiAgICBqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICRib3hlZF92YWx1ZV90eXBlJD4gbWFwKSB7XG4iCisgICAgICAgICIgIHJldHVybiBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5NYXBBZGFwdGVyPFxuIgorICAgICAgICAiICAgICAgJGJveGVkX2tleV90eXBlJCwgJHZhbHVlX2VudW1fdHlwZSQsIGphdmEubGFuZy5JbnRlZ2VyPihcbiIKKyAgICAgICAgIiAgICAgICAgICBtYXAsICRuYW1lJFZhbHVlQ29udmVydGVyKTtcbiIKKyAgICAgICAgIn1cbiIpOworICB9CisgIEdlbmVyYXRlTWFwR2V0dGVycyhwcmludGVyKTsKK30KKwordm9pZCBJbW11dGFibGVNYXBGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLk1hcEZpZWxkPFxuIgorICAgICAgICAgICAgICAgICAiICAgICR0eXBlX3BhcmFtZXRlcnMkPiAkbmFtZSRfO1xuIgorICAgICAgICAgICAgICAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLk1hcEZpZWxkPCR0eXBlX3BhcmFtZXRlcnMkPlxuIgorICAgICAgICAgICAgICAgICAiaW50ZXJuYWxHZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGlmICgkbmFtZSRfID09IG51bGwpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gY29tLmdvb2dsZS5wcm90b2J1Zi5NYXBGaWVsZC5lbXB0eU1hcEZpZWxkKFxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICAkbWFwX2ZpZWxkX3BhcmFtZXRlciQpO1xuIgorICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICAgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgICAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLk1hcEZpZWxkPCR0eXBlX3BhcmFtZXRlcnMkPlxuIgorICAgICAgICAgICAgICAgICAiaW50ZXJuYWxHZXRNdXRhYmxlJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCQ7XG4iCisgICAgICAgICAgICAgICAgICIgIGlmICgkbmFtZSRfID09IG51bGwpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkbmFtZSRfID0gY29tLmdvb2dsZS5wcm90b2J1Zi5NYXBGaWVsZC5uZXdNYXBGaWVsZChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgJG1hcF9maWVsZF9wYXJhbWV0ZXIkKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAiICBpZiAoISRuYW1lJF8uaXNNdXRhYmxlKCkpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkbmFtZSRfID0gJG5hbWUkXy5jb3B5KCk7XG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgR2VuZXJhdGVNYXBHZXR0ZXJzKHByaW50ZXIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAgICAgICAgICAicHVibGljIEJ1aWxkZXIgJHskY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGludGVybmFsR2V0TXV0YWJsZSRjYXBpdGFsaXplZF9uYW1lJCgpLmdldE11dGFibGVNYXAoKVxuIgorICAgICAgICAgICAgICAgICAiICAgICAgLmNsZWFyKCk7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICAgICAgICAgICAgInB1YmxpYyBCdWlsZGVyICR7JHJlbW92ZSRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAka2V5X3R5cGUkIGtleSkge1xuIgorICAgICAgICAgICAgICAgICAiICAka2V5X251bGxfY2hlY2skXG4iCisgICAgICAgICAgICAgICAgICIgIGludGVybmFsR2V0TXV0YWJsZSRjYXBpdGFsaXplZF9uYW1lJCgpLmdldE11dGFibGVNYXAoKVxuIgorICAgICAgICAgICAgICAgICAiICAgICAgLnJlbW92ZShrZXkpO1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBpZiAoR2V0SmF2YVR5cGUoVmFsdWVGaWVsZChkZXNjcmlwdG9yXykpID09IEpBVkFUWVBFX0VOVU0pIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIi8qKlxuIgorICAgICAgICAiICogVXNlIGFsdGVybmF0ZSBtdXRhdGlvbiBhY2Nlc3NvcnMgaW5zdGVhZC5cbiIKKyAgICAgICAgIiAqL1xuIgorICAgICAgICAiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iCisgICAgICAgICJwdWJsaWMgamF2YS51dGlsLk1hcDwkYm94ZWRfa2V5X3R5cGUkLCAkdmFsdWVfZW51bV90eXBlJD5cbiIKKyAgICAgICAgIiR7JGdldE11dGFibGUkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICIgIHJldHVybiBpbnRlcm5hbEdldEFkYXB0ZWQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoXG4iCisgICAgICAgICIgICAgICAgaW50ZXJuYWxHZXRNdXRhYmxlJGNhcGl0YWxpemVkX25hbWUkKCkuZ2V0TXV0YWJsZU1hcCgpKTtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRwdXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAka2V5X3R5cGUkIGtleSxcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICR2YWx1ZV9lbnVtX3R5cGUkIHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgJGtleV9udWxsX2NoZWNrJFxuIgorICAgICAgICAgICAgICAgICAgICIgICR2YWx1ZV9udWxsX2NoZWNrJFxuIgorICAgICAgICAgICAgICAgICAgICIgIGludGVybmFsR2V0TXV0YWJsZSRjYXBpdGFsaXplZF9uYW1lJCgpLmdldE11dGFibGVNYXAoKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAucHV0KGtleSwgJG5hbWUkVmFsdWVDb252ZXJ0ZXIuZG9CYWNrd2FyZCh2YWx1ZSkpO1xuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRwdXRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICIgICAgamF2YS51dGlsLk1hcDwkYm94ZWRfa2V5X3R5cGUkLCAkdmFsdWVfZW51bV90eXBlJD4gdmFsdWVzKSB7XG4iCisgICAgICAgICIgIGludGVybmFsR2V0QWRhcHRlZCRjYXBpdGFsaXplZF9uYW1lJE1hcChcbiIKKyAgICAgICAgIiAgICAgIGludGVybmFsR2V0TXV0YWJsZSRjYXBpdGFsaXplZF9uYW1lJCgpLmdldE11dGFibGVNYXAoKSlcbiIKKyAgICAgICAgIiAgICAgICAgICAucHV0QWxsKHZhbHVlcyk7XG4iCisgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICAgIi8qKlxuIgorICAgICAgICAgICIgKiBVc2UgYWx0ZXJuYXRlIG11dGF0aW9uIGFjY2Vzc29ycyBpbnN0ZWFkLlxuIgorICAgICAgICAgICIgKi9cbiIKKyAgICAgICAgICAiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iCisgICAgICAgICAgInB1YmxpYyBqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICRib3hlZF92YWx1ZV90eXBlJD5cbiIKKyAgICAgICAgICAiJHskZ2V0TXV0YWJsZSRjYXBpdGFsaXplZF9uYW1lJFZhbHVlJH0kKCkge1xuIgorICAgICAgICAgICIgIHJldHVybiBpbnRlcm5hbEdldE11dGFibGUkY2FwaXRhbGl6ZWRfbmFtZSQoKS5nZXRNdXRhYmxlTWFwKCk7XG4iCisgICAgICAgICAgIn1cbiIpOworICAgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRwdXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSR9JChcbiIKKyAgICAgICAgICAiICAgICRrZXlfdHlwZSQga2V5LFxuIgorICAgICAgICAgICIgICAgJHZhbHVlX3R5cGUkIHZhbHVlKSB7XG4iCisgICAgICAgICAgIiAgJGtleV9udWxsX2NoZWNrJFxuIgorICAgICAgICAgICIgICR2YWx1ZV9udWxsX2NoZWNrJFxuIgorICAgICAgICAgICIgIGludGVybmFsR2V0TXV0YWJsZSRjYXBpdGFsaXplZF9uYW1lJCgpLmdldE11dGFibGVNYXAoKVxuIgorICAgICAgICAgICIgICAgICAucHV0KGtleSwgdmFsdWUpO1xuIgorICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskcHV0QWxsJGNhcGl0YWxpemVkX25hbWUkVmFsdWUkfSQoXG4iCisgICAgICAgICAgIiAgICBqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICRib3hlZF92YWx1ZV90eXBlJD4gdmFsdWVzKSB7XG4iCisgICAgICAgICAgIiAgaW50ZXJuYWxHZXRNdXRhYmxlJGNhcGl0YWxpemVkX25hbWUkKCkuZ2V0TXV0YWJsZU1hcCgpXG4iCisgICAgICAgICAgIiAgICAgIC5wdXRBbGwodmFsdWVzKTtcbiIKKyAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAifVxuIik7CisgICAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIi8qKlxuIgorICAgICAgICAiICogVXNlIGFsdGVybmF0ZSBtdXRhdGlvbiBhY2Nlc3NvcnMgaW5zdGVhZC5cbiIKKyAgICAgICAgIiAqL1xuIgorICAgICAgICAiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iCisgICAgICAgICJwdWJsaWMgamF2YS51dGlsLk1hcDwkdHlwZV9wYXJhbWV0ZXJzJD5cbiIKKyAgICAgICAgIiR7JGdldE11dGFibGUkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICIgIHJldHVybiBpbnRlcm5hbEdldE11dGFibGUkY2FwaXRhbGl6ZWRfbmFtZSQoKS5nZXRNdXRhYmxlTWFwKCk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kIgorICAgICAgICAgICAgICAgICAgICJwdWJsaWMgQnVpbGRlciAkeyRwdXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAka2V5X3R5cGUkIGtleSxcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICR2YWx1ZV90eXBlJCB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAgICIgICRrZXlfbnVsbF9jaGVjayRcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkdmFsdWVfbnVsbF9jaGVjayRcbiIKKyAgICAgICAgICAgICAgICAgICAiICBpbnRlcm5hbEdldE11dGFibGUkY2FwaXRhbGl6ZWRfbmFtZSQoKS5nZXRNdXRhYmxlTWFwKClcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgLnB1dChrZXksIHZhbHVlKTtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAgICAgICAgICAgICJwdWJsaWMgQnVpbGRlciAkeyRwdXRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBqYXZhLnV0aWwuTWFwPCR0eXBlX3BhcmFtZXRlcnMkPiB2YWx1ZXMpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICBpbnRlcm5hbEdldE11dGFibGUkY2FwaXRhbGl6ZWRfbmFtZSQoKS5nZXRNdXRhYmxlTWFwKClcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgLnB1dEFsbCh2YWx1ZXMpO1xuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICB9Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWFwR2V0dGVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAgICAgICAgICAicHVibGljIGludCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGludGVybmFsR2V0JGNhcGl0YWxpemVkX25hbWUkKCkuZ2V0TWFwKCkuc2l6ZSgpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAicHVibGljIGJvb2xlYW4gJHskY29udGFpbnMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAiICAgICRrZXlfdHlwZSQga2V5KSB7XG4iCisgICAgICAiICAka2V5X251bGxfY2hlY2skXG4iCisgICAgICAiICByZXR1cm4gaW50ZXJuYWxHZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5nZXRNYXAoKS5jb250YWluc0tleShrZXkpO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBpZiAoR2V0SmF2YVR5cGUoVmFsdWVGaWVsZChkZXNjcmlwdG9yXykpID09IEpBVkFUWVBFX0VOVU0pIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIvKipcbiIKKyAgICAgICAgICAgICAgICAgICAiICogVXNlIHtAbGluayAjZ2V0JGNhcGl0YWxpemVkX25hbWUkTWFwKCl9IGluc3RlYWQuXG4iCisgICAgICAgICAgICAgICAgICAgIiAqL1xuIgorICAgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuRGVwcmVjYXRlZFxuIgorICAgICAgICAgICAgICAgICAgICJwdWJsaWMgamF2YS51dGlsLk1hcDwkYm94ZWRfa2V5X3R5cGUkLCAkdmFsdWVfZW51bV90eXBlJD5cbiIKKyAgICAgICAgICAgICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kXG4iCisgICAgICAgICAgICAgICAgICAgInB1YmxpYyBqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICR2YWx1ZV9lbnVtX3R5cGUkPlxuIgorICAgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGludGVybmFsR2V0QWRhcHRlZCRjYXBpdGFsaXplZF9uYW1lJE1hcChcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgaW50ZXJuYWxHZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5nZXRNYXAoKSk7IgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICAgInB1YmxpYyAkdmFsdWVfZW51bV90eXBlX3Bhc3NfdGhyb3VnaF9udWxsbmVzcyQgIgorICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JEZWZhdWx0JH0kKFxuIgorICAgICAgICAiICAgICRrZXlfdHlwZSQga2V5LFxuIgorICAgICAgICAiICAgICR2YWx1ZV9lbnVtX3R5cGVfcGFzc190aHJvdWdoX251bGxuZXNzJCBkZWZhdWx0VmFsdWUpIHtcbiIKKyAgICAgICAgIiAgJGtleV9udWxsX2NoZWNrJFxuIgorICAgICAgICAiICBqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICRib3hlZF92YWx1ZV90eXBlJD4gbWFwID1cbiIKKyAgICAgICAgIiAgICAgIGludGVybmFsR2V0JGNhcGl0YWxpemVkX25hbWUkKCkuZ2V0TWFwKCk7XG4iCisgICAgICAgICIgIHJldHVybiBtYXAuY29udGFpbnNLZXkoa2V5KVxuIgorICAgICAgICAiICAgICAgICAgPyAkbmFtZSRWYWx1ZUNvbnZlcnRlci5kb0ZvcndhcmQobWFwLmdldChrZXkpKVxuIgorICAgICAgICAiICAgICAgICAgOiBkZWZhdWx0VmFsdWU7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICAgInB1YmxpYyAkdmFsdWVfZW51bV90eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPclRocm93JH0kKFxuIgorICAgICAgICAiICAgICRrZXlfdHlwZSQga2V5KSB7XG4iCisgICAgICAgICIgICRrZXlfbnVsbF9jaGVjayRcbiIKKyAgICAgICAgIiAgamF2YS51dGlsLk1hcDwkYm94ZWRfa2V5X3R5cGUkLCAkYm94ZWRfdmFsdWVfdHlwZSQ+IG1hcCA9XG4iCisgICAgICAgICIgICAgICBpbnRlcm5hbEdldCRjYXBpdGFsaXplZF9uYW1lJCgpLmdldE1hcCgpO1xuIgorICAgICAgICAiICBpZiAoIW1hcC5jb250YWluc0tleShrZXkpKSB7XG4iCisgICAgICAgICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTtcbiIKKyAgICAgICAgIiAgfVxuIgorICAgICAgICAiICByZXR1cm4gJG5hbWUkVmFsdWVDb252ZXJ0ZXIuZG9Gb3J3YXJkKG1hcC5nZXQoa2V5KSk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgICAiLyoqXG4iCisgICAgICAgICAgIiAqIFVzZSB7QGxpbmsgI2dldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlTWFwKCl9IGluc3RlYWQuXG4iCisgICAgICAgICAgIiAqL1xuIgorICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgIkBqYXZhLmxhbmcuRGVwcmVjYXRlZFxuIgorICAgICAgICAgICJwdWJsaWMgamF2YS51dGlsLk1hcDwkYm94ZWRfa2V5X3R5cGUkLCAkYm94ZWRfdmFsdWVfdHlwZSQ+XG4iCisgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlJH0kKCkge1xuIgorICAgICAgICAgICIgIHJldHVybiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZU1hcCgpO1xuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICAgICAicHVibGljIGphdmEudXRpbC5NYXA8JGJveGVkX2tleV90eXBlJCwgJGJveGVkX3ZhbHVlX3R5cGUkPlxuIgorICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZU1hcCR9JCgpIHtcbiIKKyAgICAgICAgICAiICByZXR1cm4gaW50ZXJuYWxHZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5nZXRNYXAoKTtcbiIKKyAgICAgICAgICAifVxuIik7CisgICAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICIkZGVwcmVjYXRpb24kXG4iCisgICAgICAgICAgInB1YmxpYyAkdmFsdWVfdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWVPckRlZmF1bHQkfSQoXG4iCisgICAgICAgICAgIiAgICAka2V5X3R5cGUkIGtleSxcbiIKKyAgICAgICAgICAiICAgICR2YWx1ZV90eXBlJCBkZWZhdWx0VmFsdWUpIHtcbiIKKyAgICAgICAgICAiICAka2V5X251bGxfY2hlY2skXG4iCisgICAgICAgICAgIiAgamF2YS51dGlsLk1hcDwkYm94ZWRfa2V5X3R5cGUkLCAkYm94ZWRfdmFsdWVfdHlwZSQ+IG1hcCA9XG4iCisgICAgICAgICAgIiAgICAgIGludGVybmFsR2V0JGNhcGl0YWxpemVkX25hbWUkKCkuZ2V0TWFwKCk7XG4iCisgICAgICAgICAgIiAgcmV0dXJuIG1hcC5jb250YWluc0tleShrZXkpID8gbWFwLmdldChrZXkpIDogZGVmYXVsdFZhbHVlO1xuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICAgICAicHVibGljICR2YWx1ZV90eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZU9yVGhyb3ckfSQoXG4iCisgICAgICAgICAgIiAgICAka2V5X3R5cGUkIGtleSkge1xuIgorICAgICAgICAgICIgICRrZXlfbnVsbF9jaGVjayRcbiIKKyAgICAgICAgICAiICBqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICRib3hlZF92YWx1ZV90eXBlJD4gbWFwID1cbiIKKyAgICAgICAgICAiICAgICAgaW50ZXJuYWxHZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5nZXRNYXAoKTtcbiIKKyAgICAgICAgICAiICBpZiAoIW1hcC5jb250YWluc0tleShrZXkpKSB7XG4iCisgICAgICAgICAgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpO1xuIgorICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAiICByZXR1cm4gbWFwLmdldChrZXkpO1xuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgfQorICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIi8qKlxuIgorICAgICAgICAgICAgICAgICAgICIgKiBVc2Uge0BsaW5rICNnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKX0gaW5zdGVhZC5cbiIKKyAgICAgICAgICAgICAgICAgICAiICovXG4iCisgICAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iCisgICAgICAgICAgICAgICAgICAgInB1YmxpYyBqYXZhLnV0aWwuTWFwPCR0eXBlX3BhcmFtZXRlcnMkPiAiCisgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTWFwKCk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAgICAgICAgICAgICJwdWJsaWMgamF2YS51dGlsLk1hcDwkdHlwZV9wYXJhbWV0ZXJzJD4gIgorICAgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGludGVybmFsR2V0JGNhcGl0YWxpemVkX25hbWUkKCkuZ2V0TWFwKCk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAicHVibGljICR2YWx1ZV90eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckRlZmF1bHQkfSQoXG4iCisgICAgICAgICIgICAgJGtleV90eXBlJCBrZXksXG4iCisgICAgICAgICIgICAgJHZhbHVlX3R5cGUkIGRlZmF1bHRWYWx1ZSkge1xuIgorICAgICAgICAiICAka2V5X251bGxfY2hlY2skXG4iCisgICAgICAgICIgIGphdmEudXRpbC5NYXA8JHR5cGVfcGFyYW1ldGVycyQ+IG1hcCA9XG4iCisgICAgICAgICIgICAgICBpbnRlcm5hbEdldCRjYXBpdGFsaXplZF9uYW1lJCgpLmdldE1hcCgpO1xuIgorICAgICAgICAiICByZXR1cm4gbWFwLmNvbnRhaW5zS2V5KGtleSkgPyBtYXAuZ2V0KGtleSkgOiBkZWZhdWx0VmFsdWU7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICAgICAgICAgICAgICAicHVibGljICR2YWx1ZV90eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPclRocm93JH0kKFxuIgorICAgICAgICAgICAgICAgICAgICIgICAgJGtleV90eXBlJCBrZXkpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAka2V5X251bGxfY2hlY2skXG4iCisgICAgICAgICAgICAgICAgICAgIiAgamF2YS51dGlsLk1hcDwkdHlwZV9wYXJhbWV0ZXJzJD4gbWFwID1cbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgaW50ZXJuYWxHZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5nZXRNYXAoKTtcbiIKKyAgICAgICAgICAgICAgICAgICAiICBpZiAoIW1hcC5jb250YWluc0tleShrZXkpKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpO1xuIgorICAgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gbWFwLmdldChrZXkpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICB9Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlS290bGluRHNsTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiLyoqXG4iCisgICAgICAiICogQW4gdW5pbnN0YW50aWFibGUsIGJlaGF2aW9ybGVzcyB0eXBlIHRvIHJlcHJlc2VudCB0aGUgZmllbGQgaW5cbiIKKyAgICAgICIgKiBnZW5lcmljcy5cbiIKKyAgICAgICIgKi9cbiIKKyAgICAgICJAa290bGluLk9wdEluIgorICAgICAgIihjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Pbmx5Rm9yVXNlQnlHZW5lcmF0ZWRQcm90b0NvZGU6OmNsYXNzKVxuIgorICAgICAgImNsYXNzICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kIHByaXZhdGUgY29uc3RydWN0b3IoKSIKKyAgICAgICIgOiBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xQcm94eSgpXG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIka3RfZGVwcmVjYXRpb24kIHZhbCAka3RfbmFtZSQ6ICIKKyAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xNYXAiCisgICAgICAiPCRrdF9rZXlfdHlwZSQsICRrdF92YWx1ZV90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+XG4iCisgICAgICAiICBAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICIgIEBKdm1OYW1lKFwiZ2V0JGt0X2NhcGl0YWxpemVkX25hbWUkTWFwXCIpXG4iCisgICAgICAiICBnZXQoKSA9IGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbE1hcChcbiIKKyAgICAgICIgICAgJGt0X2RzbF9idWlsZGVyJC4keyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAkfSQoKVxuIgorICAgICAgIiAgKVxuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQEp2bU5hbWUoXCJwdXQka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICJmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTWFwIgorICAgICAgIjwka3Rfa2V5X3R5cGUkLCAka3RfdmFsdWVfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPlxuIgorICAgICAgIiAgLnB1dChrZXk6ICRrdF9rZXlfdHlwZSQsIHZhbHVlOiAka3RfdmFsdWVfdHlwZSQpIHtcbiIKKyAgICAgICIgICAgICRrdF9kc2xfYnVpbGRlciQuJHskcHV0JGNhcGl0YWxpemVkX25hbWUkJH0kKGtleSwgdmFsdWUpXG4iCisgICAgICAiICAgfVxuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiQEp2bU5hbWUoXCJzZXQka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTWFwIgorICAgICAgIjwka3Rfa2V5X3R5cGUkLCAka3RfdmFsdWVfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPlxuIgorICAgICAgIiAgLnNldChrZXk6ICRrdF9rZXlfdHlwZSQsIHZhbHVlOiAka3RfdmFsdWVfdHlwZSQpIHtcbiIKKyAgICAgICIgICAgIHB1dChrZXksIHZhbHVlKVxuIgorICAgICAgIiAgIH1cbiIpOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIkBKdm1OYW1lKFwicmVtb3ZlJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAiZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbE1hcCIKKyAgICAgICI8JGt0X2tleV90eXBlJCwgJGt0X3ZhbHVlX3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD5cbiIKKyAgICAgICIgIC5yZW1vdmUoa2V5OiAka3Rfa2V5X3R5cGUkKSB7XG4iCisgICAgICAiICAgICAka3RfZHNsX2J1aWxkZXIkLiR7JHJlbW92ZSRjYXBpdGFsaXplZF9uYW1lJCR9JChrZXkpXG4iCisgICAgICAiICAgfVxuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiQEp2bU5hbWUoXCJwdXRBbGwka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICJmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTWFwIgorICAgICAgIjwka3Rfa2V5X3R5cGUkLCAka3RfdmFsdWVfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPlxuIgorICAgICAgIiAgLnB1dEFsbChtYXA6IGtvdGxpbi5jb2xsZWN0aW9ucy5NYXA8JGt0X2tleV90eXBlJCwgJGt0X3ZhbHVlX3R5cGUkPikgIgorICAgICAgIntcbiIKKyAgICAgICIgICAgICRrdF9kc2xfYnVpbGRlciQuJHskcHV0QWxsJGNhcGl0YWxpemVkX25hbWUkJH0kKG1hcClcbiIKKyAgICAgICIgICB9XG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJASnZtTmFtZShcImNsZWFyJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAiZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbE1hcCIKKyAgICAgICI8JGt0X2tleV90eXBlJCwgJGt0X3ZhbHVlX3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD5cbiIKKyAgICAgICIgIC5jbGVhcigpIHtcbiIKKyAgICAgICIgICAgICRrdF9kc2xfYnVpbGRlciQuJHskY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKVxuIgorICAgICAgIiAgIH1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZU1hcEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBOb3RoaW5nIHRvIGluaXRpYWxpemUuCit9CisKK3ZvaWQgSW1tdXRhYmxlTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIE5vdGhpbmcgdG8gaW5pdGlhbGl6ZS4KK30KKwordm9pZCBJbW11dGFibGVNYXBGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJpbnRlcm5hbEdldE11dGFibGUkY2FwaXRhbGl6ZWRfbmFtZSQoKS5jbGVhcigpO1xuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVyZ2luZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImludGVybmFsR2V0TXV0YWJsZSRjYXBpdGFsaXplZF9uYW1lJCgpLm1lcmdlRnJvbShcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBvdGhlci5pbnRlcm5hbEdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOworfQorCit2b2lkIEltbXV0YWJsZU1hcEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkaW5nQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicmVzdWx0LiRuYW1lJF8gPSBpbnRlcm5hbEdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgorICAgICAgICAgICAgICAgICAicmVzdWx0LiRuYW1lJF8ubWFrZUltbXV0YWJsZSgpO1xuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmICghU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkgJiYKKyAgICAgIEdldEphdmFUeXBlKFZhbHVlRmllbGQoZGVzY3JpcHRvcl8pKSA9PSBKQVZBVFlQRV9FTlVNKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYnl0ZXMgPSBpbnB1dC5yZWFkQnl0ZXMoKTtcbiIKKyAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuTWFwRW50cnk8JHR5cGVfcGFyYW1ldGVycyQ+XG4iCisgICAgICAgICIkbmFtZSRfXyA9ICRkZWZhdWx0X2VudHJ5JC5nZXRQYXJzZXJGb3JUeXBlKCkucGFyc2VGcm9tKGJ5dGVzKTtcbiIKKyAgICAgICAgImlmICgkdmFsdWVfZW51bV90eXBlJC5mb3JOdW1iZXIoJG5hbWUkX18uZ2V0VmFsdWUoKSkgPT0gbnVsbCkge1xuIgorICAgICAgICAiICBtZXJnZVVua25vd25MZW5ndGhEZWxpbWl0ZWRGaWVsZCgkbnVtYmVyJCwgYnl0ZXMpO1xuIgorICAgICAgICAifSBlbHNlIHtcbiIKKyAgICAgICAgIiAgaW50ZXJuYWxHZXRNdXRhYmxlJGNhcGl0YWxpemVkX25hbWUkKCkuZ2V0TXV0YWJsZU1hcCgpLnB1dChcbiIKKyAgICAgICAgIiAgICAgICRuYW1lJF9fLmdldEtleSgpLCAkbmFtZSRfXy5nZXRWYWx1ZSgpKTtcbiIKKyAgICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5NYXBFbnRyeTwkdHlwZV9wYXJhbWV0ZXJzJD5cbiIKKyAgICAgICAgIiRuYW1lJF9fID0gaW5wdXQucmVhZE1lc3NhZ2UoXG4iCisgICAgICAgICIgICAgJGRlZmF1bHRfZW50cnkkLmdldFBhcnNlckZvclR5cGUoKSwgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIgorICAgICAgICAiaW50ZXJuYWxHZXRNdXRhYmxlJGNhcGl0YWxpemVkX25hbWUkKCkuZ2V0TXV0YWJsZU1hcCgpLnB1dChcbiIKKyAgICAgICAgIiAgICAkbmFtZSRfXy5nZXRLZXkoKSwgJG5hbWUkX18uZ2V0VmFsdWUoKSk7XG4iKTsKKyAgfQorfQorCit2b2lkIEltbXV0YWJsZU1hcEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UkdmVyJFxuIgorICAgICAgICAgICAgICAgICAiICAuc2VyaWFsaXplJHNob3J0X2tleV90eXBlJE1hcFRvKFxuIgorICAgICAgICAgICAgICAgICAiICAgIG91dHB1dCxcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBpbnRlcm5hbEdldCRjYXBpdGFsaXplZF9uYW1lJCgpLFxuIgorICAgICAgICAgICAgICAgICAiICAgICRkZWZhdWx0X2VudHJ5JCxcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkbnVtYmVyJCk7XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVNYXBGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgImZvciAoamF2YS51dGlsLk1hcC5FbnRyeTwkdHlwZV9wYXJhbWV0ZXJzJD4gZW50cnlcbiIKKyAgICAgICIgICAgIDogaW50ZXJuYWxHZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5nZXRNYXAoKS5lbnRyeVNldCgpKSB7XG4iCisgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLk1hcEVudHJ5PCR0eXBlX3BhcmFtZXRlcnMkPlxuIgorICAgICAgIiAgJG5hbWUkX18gPSAkZGVmYXVsdF9lbnRyeSQubmV3QnVpbGRlckZvclR5cGUoKVxuIgorICAgICAgIiAgICAgIC5zZXRLZXkoZW50cnkuZ2V0S2V5KCkpXG4iCisgICAgICAiICAgICAgLnNldFZhbHVlKGVudHJ5LmdldFZhbHVlKCkpXG4iCisgICAgICAiICAgICAgLmJ1aWxkKCk7XG4iCisgICAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAgICIgICAgICAuY29tcHV0ZU1lc3NhZ2VTaXplKCRudW1iZXIkLCAkbmFtZSRfXyk7XG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRXF1YWxzQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiaWYgKCFpbnRlcm5hbEdldCRjYXBpdGFsaXplZF9uYW1lJCgpLmVxdWFscyhcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBvdGhlci5pbnRlcm5hbEdldCRjYXBpdGFsaXplZF9uYW1lJCgpKSkgcmV0dXJuIGZhbHNlO1xuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWFwRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgImlmICghaW50ZXJuYWxHZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5nZXRNYXAoKS5pc0VtcHR5KCkpIHtcbiIKKyAgICAgICIgIGhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIKKyAgICAgICIgIGhhc2ggPSAoNTMgKiBoYXNoKSArIGludGVybmFsR2V0JGNhcGl0YWxpemVkX25hbWUkKCkuaGFzaENvZGUoKTtcbiIKKyAgICAgICJ9XG4iKTsKK30KKworc3RkOjpzdHJpbmcgSW1tdXRhYmxlTWFwRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWFwX2ZpZWxkLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWFwX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2OTlhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tYXBfZmllbGQuaApAQCAtMCwwICsxLDgxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NQVBfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01BUF9GSUVMRF9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK2NsYXNzIEltbXV0YWJsZU1hcEZpZWxkR2VuZXJhdG9yIDogcHVibGljIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEltbXV0YWJsZU1hcEZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCk7CisgIH5JbW11dGFibGVNYXBGaWVsZEdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IG92ZXJyaWRlOworICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJpYWJsZXNfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CisgIHZvaWQgR2VuZXJhdGVNYXBHZXR0ZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01BUF9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tYXBfZmllbGRfbGl0ZS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tYXBfZmllbGRfbGl0ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjI3NjZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZF9saXRlLmNjCkBAIC0wLDAgKzEsOTI3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZF9saXRlLmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZV9yZXNvbHZlci5oPgorCisvLyBNdXN0IGJlIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworbmFtZXNwYWNlIHsKKworY29uc3QgRmllbGREZXNjcmlwdG9yKiBLZXlGaWVsZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgR09PR0xFX0NIRUNLX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBkZXNjcmlwdG9yLT50eXBlKCkpOworICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlID0gZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCk7CisgIEdPT0dMRV9DSEVDSyhtZXNzYWdlLT5vcHRpb25zKCkubWFwX2VudHJ5KCkpOworICByZXR1cm4gbWVzc2FnZS0+bWFwX2tleSgpOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIFZhbHVlRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIEdPT0dMRV9DSEVDS19FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSwgZGVzY3JpcHRvci0+dHlwZSgpKTsKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSA9IGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpOworICBHT09HTEVfQ0hFQ0sobWVzc2FnZS0+b3B0aW9ucygpLm1hcF9lbnRyeSgpKTsKKyAgcmV0dXJuIG1lc3NhZ2UtPm1hcF92YWx1ZSgpOworfQorCitzdGQ6OnN0cmluZyBUeXBlTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXIsIGJvb2wgYm94ZWQpIHsKKyAgaWYgKEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9NRVNTQUdFKSB7CisgICAgcmV0dXJuIG5hbWVfcmVzb2x2ZXItPkdldEltbXV0YWJsZUNsYXNzTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCkpOworICB9IGVsc2UgaWYgKEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9FTlVNKSB7CisgICAgcmV0dXJuIG5hbWVfcmVzb2x2ZXItPkdldEltbXV0YWJsZUNsYXNzTmFtZShmaWVsZC0+ZW51bV90eXBlKCkpOworICB9IGVsc2UgeworICAgIHJldHVybiBib3hlZCA/IEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoR2V0SmF2YVR5cGUoZmllbGQpKQorICAgICAgICAgICAgICAgICA6IFByaW1pdGl2ZVR5cGVOYW1lKEdldEphdmFUeXBlKGZpZWxkKSk7CisgIH0KK30KKworc3RkOjpzdHJpbmcgS290bGluVHlwZU5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyKSB7CisgIGlmIChHZXRKYXZhVHlwZShmaWVsZCkgPT0gSkFWQVRZUEVfTUVTU0FHRSkgeworICAgIHJldHVybiBuYW1lX3Jlc29sdmVyLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKTsKKyAgfSBlbHNlIGlmIChHZXRKYXZhVHlwZShmaWVsZCkgPT0gSkFWQVRZUEVfRU5VTSkgeworICAgIHJldHVybiBuYW1lX3Jlc29sdmVyLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZmllbGQtPmVudW1fdHlwZSgpKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gS290bGluVHlwZU5hbWUoR2V0SmF2YVR5cGUoZmllbGQpKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBXaXJlVHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHJldHVybiAiY29tLmdvb2dsZS5wcm90b2J1Zi5XaXJlRm9ybWF0LkZpZWxkVHlwZS4iICsKKyAgICAgICAgIHN0ZDo6c3RyaW5nKEZpZWxkVHlwZU5hbWUoZmllbGQtPnR5cGUoKSkpOworfQorCit2b2lkIFNldE1lc3NhZ2VWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcykgeworICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhkZXNjcmlwdG9yLCBpbmZvLCB2YXJpYWJsZXMpOworCisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyID0gY29udGV4dC0+R2V0TmFtZVJlc29sdmVyKCk7CisgICgqdmFyaWFibGVzKVsidHlwZSJdID0KKyAgICAgIG5hbWVfcmVzb2x2ZXItPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKSk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5ID0gS2V5RmllbGQoZGVzY3JpcHRvcik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsdWUgPSBWYWx1ZUZpZWxkKGRlc2NyaXB0b3IpOworICBjb25zdCBKYXZhVHlwZSBrZXlKYXZhVHlwZSA9IEdldEphdmFUeXBlKGtleSk7CisgIGNvbnN0IEphdmFUeXBlIHZhbHVlSmF2YVR5cGUgPSBHZXRKYXZhVHlwZSh2YWx1ZSk7CisKKyAgc3RkOjpzdHJpbmcgcGFzc190aHJvdWdoX251bGxuZXNzID0gIi8qIG51bGxhYmxlICovXG4iOworCisgICgqdmFyaWFibGVzKVsia2V5X3R5cGUiXSA9IFR5cGVOYW1lKGtleSwgbmFtZV9yZXNvbHZlciwgZmFsc2UpOworICAoKnZhcmlhYmxlcylbImJveGVkX2tleV90eXBlIl0gPSBUeXBlTmFtZShrZXksIG5hbWVfcmVzb2x2ZXIsIHRydWUpOworICAoKnZhcmlhYmxlcylbImt0X2tleV90eXBlIl0gPSBLb3RsaW5UeXBlTmFtZShrZXksIG5hbWVfcmVzb2x2ZXIpOworICAoKnZhcmlhYmxlcylbImt0X3ZhbHVlX3R5cGUiXSA9IEtvdGxpblR5cGVOYW1lKHZhbHVlLCBuYW1lX3Jlc29sdmVyKTsKKyAgKCp2YXJpYWJsZXMpWyJrZXlfd2lyZV90eXBlIl0gPSBXaXJlVHlwZShrZXkpOworICAoKnZhcmlhYmxlcylbImtleV9kZWZhdWx0X3ZhbHVlIl0gPSBEZWZhdWx0VmFsdWUoa2V5LCB0cnVlLCBuYW1lX3Jlc29sdmVyKTsKKyAgLy8gV2UgdXNlIGB4LmdldENsYXNzKClgIGFzIGEgbnVsbCBjaGVjayBiZWNhdXNlIGl0IGdlbmVyYXRlcyBsZXNzIGJ5dGVjb2RlCisgIC8vIHRoYW4gYW4gYGlmICh4ID09IG51bGwpIHsgdGhyb3cgLi4uIH1gIHN0YXRlbWVudC4KKyAgKCp2YXJpYWJsZXMpWyJrZXlfbnVsbF9jaGVjayJdID0KKyAgICAgIElzUmVmZXJlbmNlVHlwZShrZXlKYXZhVHlwZSkKKyAgICAgICAgICA/ICJqYXZhLmxhbmcuQ2xhc3M8Pz4ga2V5Q2xhc3MgPSBrZXkuZ2V0Q2xhc3MoKTsiCisgICAgICAgICAgOiAiIjsKKyAgKCp2YXJpYWJsZXMpWyJ2YWx1ZV9udWxsX2NoZWNrIl0gPQorICAgICAgSXNSZWZlcmVuY2VUeXBlKHZhbHVlSmF2YVR5cGUpCisgICAgICAgICAgPyAiamF2YS5sYW5nLkNsYXNzPD8+IHZhbHVlQ2xhc3MgPSB2YWx1ZS5nZXRDbGFzcygpOyIKKyAgICAgICAgICA6ICIiOworCisgIGlmIChHZXRKYXZhVHlwZSh2YWx1ZSkgPT0gSkFWQVRZUEVfRU5VTSkgeworICAgIC8vIFdlIHN0b3JlIGVudW1zIGFzIEludGVnZXJzIGludGVybmFsbHkuCisgICAgKCp2YXJpYWJsZXMpWyJ2YWx1ZV90eXBlIl0gPSAiaW50IjsKKyAgICAoKnZhcmlhYmxlcylbImJveGVkX3ZhbHVlX3R5cGUiXSA9ICJqYXZhLmxhbmcuSW50ZWdlciI7CisgICAgKCp2YXJpYWJsZXMpWyJ2YWx1ZV93aXJlX3R5cGUiXSA9IFdpcmVUeXBlKHZhbHVlKTsKKyAgICAoKnZhcmlhYmxlcylbInZhbHVlX2RlZmF1bHRfdmFsdWUiXSA9CisgICAgICAgIERlZmF1bHRWYWx1ZSh2YWx1ZSwgdHJ1ZSwgbmFtZV9yZXNvbHZlcikgKyAiLmdldE51bWJlcigpIjsKKworICAgICgqdmFyaWFibGVzKVsidmFsdWVfZW51bV90eXBlIl0gPSBUeXBlTmFtZSh2YWx1ZSwgbmFtZV9yZXNvbHZlciwgZmFsc2UpOworCisgICAgKCp2YXJpYWJsZXMpWyJ2YWx1ZV9lbnVtX3R5cGVfcGFzc190aHJvdWdoX251bGxuZXNzIl0gPQorICAgICAgICBwYXNzX3Rocm91Z2hfbnVsbG5lc3MgKyAoKnZhcmlhYmxlcylbInZhbHVlX2VudW1fdHlwZSJdOworCisgICAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3ItPmZpbGUoKSkpIHsKKyAgICAgIC8vIE1hcCB1bmtub3duIHZhbHVlcyB0byBhIHNwZWNpYWwgVU5SRUNPR05JWkVEIHZhbHVlIGlmIHN1cHBvcnRlZC4KKyAgICAgICgqdmFyaWFibGVzKVsidW5yZWNvZ25pemVkX3ZhbHVlIl0gPQorICAgICAgICAgICgqdmFyaWFibGVzKVsidmFsdWVfZW51bV90eXBlIl0gKyAiLlVOUkVDT0dOSVpFRCI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE1hcCB1bmtub3duIHZhbHVlcyB0byB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB3ZSBkb24ndCBoYXZlIFVOUkVDT0dOSVpFRC4KKyAgICAgICgqdmFyaWFibGVzKVsidW5yZWNvZ25pemVkX3ZhbHVlIl0gPQorICAgICAgICAgIERlZmF1bHRWYWx1ZSh2YWx1ZSwgdHJ1ZSwgbmFtZV9yZXNvbHZlcik7CisgICAgfQorICB9IGVsc2UgeworICAgICgqdmFyaWFibGVzKVsidmFsdWVfdHlwZSJdID0gVHlwZU5hbWUodmFsdWUsIG5hbWVfcmVzb2x2ZXIsIGZhbHNlKTsKKworICAgICgqdmFyaWFibGVzKVsidmFsdWVfdHlwZV9wYXNzX3Rocm91Z2hfbnVsbG5lc3MiXSA9CisgICAgICAgIChJc1JlZmVyZW5jZVR5cGUodmFsdWVKYXZhVHlwZSkgPyBwYXNzX3Rocm91Z2hfbnVsbG5lc3MgOiAiIikgKworICAgICAgICAoKnZhcmlhYmxlcylbInZhbHVlX3R5cGUiXTsKKworICAgICgqdmFyaWFibGVzKVsiYm94ZWRfdmFsdWVfdHlwZSJdID0gVHlwZU5hbWUodmFsdWUsIG5hbWVfcmVzb2x2ZXIsIHRydWUpOworICAgICgqdmFyaWFibGVzKVsidmFsdWVfd2lyZV90eXBlIl0gPSBXaXJlVHlwZSh2YWx1ZSk7CisgICAgKCp2YXJpYWJsZXMpWyJ2YWx1ZV9kZWZhdWx0X3ZhbHVlIl0gPQorICAgICAgICBEZWZhdWx0VmFsdWUodmFsdWUsIHRydWUsIG5hbWVfcmVzb2x2ZXIpOworICB9CisgICgqdmFyaWFibGVzKVsidHlwZV9wYXJhbWV0ZXJzIl0gPQorICAgICAgKCp2YXJpYWJsZXMpWyJib3hlZF9rZXlfdHlwZSJdICsgIiwgIiArICgqdmFyaWFibGVzKVsiYm94ZWRfdmFsdWVfdHlwZSJdOworICAvLyBUT0RPKGJpcmRvKTogQWRkIEBkZXByZWNhdGVkIGphdmFkb2Mgd2hlbiBnZW5lcmF0aW5nIGphdmFkb2MgaXMgc3VwcG9ydGVkCisgIC8vIGJ5IHRoZSBwcm90byBjb21waWxlcgorICAoKnZhcmlhYmxlcylbImRlcHJlY2F0aW9uIl0gPQorICAgICAgZGVzY3JpcHRvci0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKSA/ICJAamF2YS5sYW5nLkRlcHJlY2F0ZWQgIiA6ICIiOworICAoKnZhcmlhYmxlcylbImt0X2RlcHJlY2F0aW9uIl0gPQorICAgICAgZGVzY3JpcHRvci0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKQorICAgICAgICAgID8gIkBrb3RsaW4uRGVwcmVjYXRlZChtZXNzYWdlID0gXCJGaWVsZCAiICsgKCp2YXJpYWJsZXMpWyJuYW1lIl0gKworICAgICAgICAgICAgICAgICIgaXMgZGVwcmVjYXRlZFwiKSAiCisgICAgICAgICAgOiAiIjsKKworICAoKnZhcmlhYmxlcylbImRlZmF1bHRfZW50cnkiXSA9CisgICAgICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX25hbWUiXSArICJEZWZhdWx0RW50cnlIb2xkZXIuZGVmYXVsdEVudHJ5IjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0ltbXV0YWJsZU1hcEZpZWxkTGl0ZUdlbmVyYXRvcjo6SW1tdXRhYmxlTWFwRmllbGRMaXRlR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCkKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgICAgY29udGV4dF8oY29udGV4dCksCisgICAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgeworICBTZXRNZXNzYWdlVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZGVzY3JpcHRvciksIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlc18pOworfQorCitJbW11dGFibGVNYXBGaWVsZExpdGVHZW5lcmF0b3I6On5JbW11dGFibGVNYXBGaWVsZExpdGVHZW5lcmF0b3IoKSB7fQorCitpbnQgSW1tdXRhYmxlTWFwRmllbGRMaXRlR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKwordm9pZCBJbW11dGFibGVNYXBGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kaW50ICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50JH0kKCk7XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJGJvb2xlYW4gJHskY29udGFpbnMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgJGtleV90eXBlJCBrZXkpO1xuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIGlmIChHZXRKYXZhVHlwZShWYWx1ZUZpZWxkKGRlc2NyaXB0b3JfKSkgPT0gSkFWQVRZUEVfRU5VTSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIi8qKlxuIgorICAgICAgICAgICAgICAgICAgICIgKiBVc2Uge0BsaW5rICNnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKX0gaW5zdGVhZC5cbiIKKyAgICAgICAgICAgICAgICAgICAiICovXG4iCisgICAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuRGVwcmVjYXRlZFxuIgorICAgICAgICAgICAgICAgICAgICJqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICR2YWx1ZV9lbnVtX3R5cGUkPlxuIgorICAgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKTtcbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiJGRlcHJlY2F0aW9uJGphdmEudXRpbC5NYXA8JGJveGVkX2tleV90eXBlJCwgJHZhbHVlX2VudW1fdHlwZSQ+XG4iCisgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAkfSQoKTtcbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiQkdmFsdWVfZW51bV90eXBlX3Bhc3NfdGhyb3VnaF9udWxsbmVzcyQgIgorICAgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckRlZmF1bHQkfSQoXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAka2V5X3R5cGUkIGtleSxcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICR2YWx1ZV9lbnVtX3R5cGVfcGFzc190aHJvdWdoX251bGxuZXNzJCAiCisgICAgICAgICAgICAgICAgICAgIiAgICAgICAgZGVmYXVsdFZhbHVlKTtcbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiJGRlcHJlY2F0aW9uJCR2YWx1ZV9lbnVtX3R5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJE9yVGhyb3ckfSQoXG4iCisgICAgICAgICIgICAgJGtleV90eXBlJCBrZXkpO1xuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICAgIi8qKlxuIgorICAgICAgICAgICIgKiBVc2Uge0BsaW5rICNnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZU1hcCgpfSBpbnN0ZWFkLlxuIgorICAgICAgICAgICIgKi9cbiIKKyAgICAgICAgICAiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iCisgICAgICAgICAgImphdmEudXRpbC5NYXA8JHR5cGVfcGFyYW1ldGVycyQ+XG4iCisgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlJH0kKCk7XG4iKTsKKyAgICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTWFwPCR0eXBlX3BhcmFtZXRlcnMkPlxuIgorICAgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlTWFwJH0kKCk7XG4iKTsKKyAgICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICAgICAgICAgICAgICAgICIkdmFsdWVfdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWVPckRlZmF1bHQkfSQoXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgICRrZXlfdHlwZSQga2V5LFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgICAkdmFsdWVfdHlwZSQgZGVmYXVsdFZhbHVlKTtcbiIpOworICAgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAgICAgICAgICAgICAgIiR2YWx1ZV90eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZU9yVGhyb3ckfSQoXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgICRrZXlfdHlwZSQga2V5KTtcbiIpOworICAgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiLyoqXG4iCisgICAgICAgICAgICAgICAgICAgIiAqIFVzZSB7QGxpbmsgI2dldCRjYXBpdGFsaXplZF9uYW1lJE1hcCgpfSBpbnN0ZWFkLlxuIgorICAgICAgICAgICAgICAgICAgICIgKi9cbiIKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iCisgICAgICAgICAgICAgICAgICAgImphdmEudXRpbC5NYXA8JHR5cGVfcGFyYW1ldGVycyQ+XG4iCisgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpO1xuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJGphdmEudXRpbC5NYXA8JHR5cGVfcGFyYW1ldGVycyQ+XG4iCisgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJE1hcCR9JCgpO1xuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAgICAgICAgICAgICIkdmFsdWVfdHlwZV9wYXNzX3Rocm91Z2hfbnVsbG5lc3MkICIKKyAgICAgICAgICAgICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JEZWZhdWx0JH0kKFxuIgorICAgICAgICAgICAgICAgICAgICIgICAgJGtleV90eXBlJCBrZXksXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAkdmFsdWVfdHlwZV9wYXNzX3Rocm91Z2hfbnVsbG5lc3MkIGRlZmF1bHRWYWx1ZSk7XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kXG4iCisgICAgICAgICAgICAgICAgICAgIiR2YWx1ZV90eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPclRocm93JH0kKFxuIgorICAgICAgICAgICAgICAgICAgICIgICAgJGtleV90eXBlJCBrZXkpO1xuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgfQorfQorCit2b2lkIEltbXV0YWJsZU1hcEZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyAkY2FwaXRhbGl6ZWRfbmFtZSREZWZhdWx0RW50cnlIb2xkZXIge1xuIgorICAgICAgIiAgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuTWFwRW50cnlMaXRlPFxuIgorICAgICAgIiAgICAgICR0eXBlX3BhcmFtZXRlcnMkPiBkZWZhdWx0RW50cnkgPVxuIgorICAgICAgIiAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLk1hcEVudHJ5TGl0ZVxuIgorICAgICAgIiAgICAgICAgICAuPCR0eXBlX3BhcmFtZXRlcnMkPm5ld0RlZmF1bHRJbnN0YW5jZShcbiIKKyAgICAgICIgICAgICAgICAgICAgICRrZXlfd2lyZV90eXBlJCxcbiIKKyAgICAgICIgICAgICAgICAgICAgICRrZXlfZGVmYXVsdF92YWx1ZSQsXG4iCisgICAgICAiICAgICAgICAgICAgICAkdmFsdWVfd2lyZV90eXBlJCxcbiIKKyAgICAgICIgICAgICAgICAgICAgICR2YWx1ZV9kZWZhdWx0X3ZhbHVlJCk7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuTWFwRmllbGRMaXRlPFxuIgorICAgICAgICAgICAgICAgICAiICAgICR0eXBlX3BhcmFtZXRlcnMkPiAkbmFtZSRfID1cbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5NYXBGaWVsZExpdGUuZW1wdHlNYXBGaWVsZCgpO1xuIgorICAgICAgICAgICAgICAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLk1hcEZpZWxkTGl0ZTwkdHlwZV9wYXJhbWV0ZXJzJD5cbiIKKyAgICAgICAgICAgICAgICAgImludGVybmFsR2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5NYXBGaWVsZExpdGU8JHR5cGVfcGFyYW1ldGVycyQ+XG4iCisgICAgICAgICAgICAgICAgICJpbnRlcm5hbEdldE11dGFibGUkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGlmICghJG5hbWUkXy5pc011dGFibGUoKSkge1xuIgorICAgICAgICAgICAgICAgICAiICAgICRuYW1lJF8gPSAkbmFtZSRfLm11dGFibGVDb3B5KCk7XG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICAgICAgICAgICAgInB1YmxpYyBpbnQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiBpbnRlcm5hbEdldCRjYXBpdGFsaXplZF9uYW1lJCgpLnNpemUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kXG4iCisgICAgICAgICAgICAgICAgICJwdWJsaWMgYm9vbGVhbiAkeyRjb250YWlucyRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAka2V5X3R5cGUkIGtleSkge1xuIgorICAgICAgICAgICAgICAgICAiICAka2V5X251bGxfY2hlY2skXG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiBpbnRlcm5hbEdldCRjYXBpdGFsaXplZF9uYW1lJCgpLmNvbnRhaW5zS2V5KGtleSk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgaWYgKEdldEphdmFUeXBlKFZhbHVlRmllbGQoZGVzY3JpcHRvcl8pKSA9PSBKQVZBVFlQRV9FTlVNKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbFxuIgorICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5NYXBBZGFwdGVyLkNvbnZlcnRlcjxcbiIKKyAgICAgICAgIiAgICBqYXZhLmxhbmcuSW50ZWdlciwgJHZhbHVlX2VudW1fdHlwZSQ+ICRuYW1lJFZhbHVlQ29udmVydGVyID1cbiIKKyAgICAgICAgIiAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5NYXBBZGFwdGVyLm5ld0VudW1Db252ZXJ0ZXIoXG4iCisgICAgICAgICIgICAgICAgICAgICAkdmFsdWVfZW51bV90eXBlJC5pbnRlcm5hbEdldFZhbHVlTWFwKCksXG4iCisgICAgICAgICIgICAgICAgICAgICAkdW5yZWNvZ25pemVkX3ZhbHVlJCk7XG4iKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIvKipcbiIKKyAgICAgICAgICAgICAgICAgICAiICogVXNlIHtAbGluayAjZ2V0JGNhcGl0YWxpemVkX25hbWUkTWFwKCl9IGluc3RlYWQuXG4iCisgICAgICAgICAgICAgICAgICAgIiAqL1xuIgorICAgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLkRlcHJlY2F0ZWRcbiIKKyAgICAgICAgICAgICAgICAgICAicHVibGljIGphdmEudXRpbC5NYXA8JGJveGVkX2tleV90eXBlJCwgJHZhbHVlX2VudW1fdHlwZSQ+XG4iCisgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTWFwKCk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAicHVibGljIGphdmEudXRpbC5NYXA8JGJveGVkX2tleV90eXBlJCwgJHZhbHVlX2VudW1fdHlwZSQ+XG4iCisgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAkfSQoKSB7XG4iCisgICAgICAgICIgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKFxuIgorICAgICAgICAiICAgICAgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuTWFwQWRhcHRlcjxcbiIKKyAgICAgICAgIiAgICAgICAgJGJveGVkX2tleV90eXBlJCwgJHZhbHVlX2VudW1fdHlwZSQsIGphdmEubGFuZy5JbnRlZ2VyPihcbiIKKyAgICAgICAgIiAgICAgICAgICAgIGludGVybmFsR2V0JGNhcGl0YWxpemVkX25hbWUkKCksXG4iCisgICAgICAgICIgICAgICAgICAgICAkbmFtZSRWYWx1ZUNvbnZlcnRlcikpO1xuIgorICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICIkZGVwcmVjYXRpb24kXG4iCisgICAgICAgICJwdWJsaWMgJHZhbHVlX2VudW1fdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JEZWZhdWx0JH0kKFxuIgorICAgICAgICAiICAgICRrZXlfdHlwZSQga2V5LFxuIgorICAgICAgICAiICAgICR2YWx1ZV9lbnVtX3R5cGUkIGRlZmF1bHRWYWx1ZSkge1xuIgorICAgICAgICAiICAka2V5X251bGxfY2hlY2skXG4iCisgICAgICAgICIgIGphdmEudXRpbC5NYXA8JGJveGVkX2tleV90eXBlJCwgJGJveGVkX3ZhbHVlX3R5cGUkPiBtYXAgPVxuIgorICAgICAgICAiICAgICAgaW50ZXJuYWxHZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICAgIiAgcmV0dXJuIG1hcC5jb250YWluc0tleShrZXkpXG4iCisgICAgICAgICIgICAgICAgICA/ICRuYW1lJFZhbHVlQ29udmVydGVyLmRvRm9yd2FyZChtYXAuZ2V0KGtleSkpXG4iCisgICAgICAgICIgICAgICAgICA6IGRlZmF1bHRWYWx1ZTtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAicHVibGljICR2YWx1ZV9lbnVtX3R5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJE9yVGhyb3ckfSQoXG4iCisgICAgICAgICIgICAgJGtleV90eXBlJCBrZXkpIHtcbiIKKyAgICAgICAgIiAgJGtleV9udWxsX2NoZWNrJFxuIgorICAgICAgICAiICBqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICRib3hlZF92YWx1ZV90eXBlJD4gbWFwID1cbiIKKyAgICAgICAgIiAgICAgIGludGVybmFsR2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCisgICAgICAgICIgIGlmICghbWFwLmNvbnRhaW5zS2V5KGtleSkpIHtcbiIKKyAgICAgICAgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpO1xuIgorICAgICAgICAiICB9XG4iCisgICAgICAgICIgIHJldHVybiAkbmFtZSRWYWx1ZUNvbnZlcnRlci5kb0ZvcndhcmQobWFwLmdldChrZXkpKTtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAgICIvKipcbiIKKyAgICAgICAgICAiICogVXNlIHtAbGluayAjZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWVNYXAoKX0gaW5zdGVhZC5cbiIKKyAgICAgICAgICAiICovXG4iCisgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iCisgICAgICAgICAgInB1YmxpYyBqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICRib3hlZF92YWx1ZV90eXBlJD5cbiIKKyAgICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUkfSQoKSB7XG4iCisgICAgICAgICAgIiAgcmV0dXJuIGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlTWFwKCk7XG4iCisgICAgICAgICAgIn1cbiIpOworICAgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAgICJwdWJsaWMgamF2YS51dGlsLk1hcDwkYm94ZWRfa2V5X3R5cGUkLCAkYm94ZWRfdmFsdWVfdHlwZSQ+XG4iCisgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlTWFwJH0kKCkge1xuIgorICAgICAgICAgICIgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKFxuIgorICAgICAgICAgICIgICAgICBpbnRlcm5hbEdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIKKyAgICAgICAgICAifVxuIik7CisgICAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICIkZGVwcmVjYXRpb24kXG4iCisgICAgICAgICAgInB1YmxpYyAkdmFsdWVfdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWVPckRlZmF1bHQkfSQoXG4iCisgICAgICAgICAgIiAgICAka2V5X3R5cGUkIGtleSxcbiIKKyAgICAgICAgICAiICAgICR2YWx1ZV90eXBlJCBkZWZhdWx0VmFsdWUpIHtcbiIKKyAgICAgICAgICAiICAka2V5X251bGxfY2hlY2skXG4iCisgICAgICAgICAgIiAgamF2YS51dGlsLk1hcDwkYm94ZWRfa2V5X3R5cGUkLCAkYm94ZWRfdmFsdWVfdHlwZSQ+IG1hcCA9XG4iCisgICAgICAgICAgIiAgICAgIGludGVybmFsR2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCisgICAgICAgICAgIiAgcmV0dXJuIG1hcC5jb250YWluc0tleShrZXkpID8gbWFwLmdldChrZXkpIDogZGVmYXVsdFZhbHVlO1xuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICAgICAicHVibGljICR2YWx1ZV90eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZU9yVGhyb3ckfSQoXG4iCisgICAgICAgICAgIiAgICAka2V5X3R5cGUkIGtleSkge1xuIgorICAgICAgICAgICIgICRrZXlfbnVsbF9jaGVjayRcbiIKKyAgICAgICAgICAiICBqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICRib3hlZF92YWx1ZV90eXBlJD4gbWFwID1cbiIKKyAgICAgICAgICAiICAgICAgaW50ZXJuYWxHZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICAgICAiICBpZiAoIW1hcC5jb250YWluc0tleShrZXkpKSB7XG4iCisgICAgICAgICAgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpO1xuIgorICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAiICByZXR1cm4gbWFwLmdldChrZXkpO1xuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgfQorICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIi8qKlxuIgorICAgICAgICAgICAgICAgICAgICIgKiBVc2Uge0BsaW5rICNnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKX0gaW5zdGVhZC5cbiIKKyAgICAgICAgICAgICAgICAgICAiICovXG4iCisgICAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iCisgICAgICAgICAgICAgICAgICAgInB1YmxpYyBqYXZhLnV0aWwuTWFwPCR0eXBlX3BhcmFtZXRlcnMkPiAiCisgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTWFwKCk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAgICAgICAgICAgICJwdWJsaWMgamF2YS51dGlsLk1hcDwkdHlwZV9wYXJhbWV0ZXJzJD4gIgorICAgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIGludGVybmFsR2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICAgInB1YmxpYyAkdmFsdWVfdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JEZWZhdWx0JH0kKFxuIgorICAgICAgICAiICAgICRrZXlfdHlwZSQga2V5LFxuIgorICAgICAgICAiICAgICR2YWx1ZV90eXBlJCBkZWZhdWx0VmFsdWUpIHtcbiIKKyAgICAgICAgIiAgJGtleV9udWxsX2NoZWNrJFxuIgorICAgICAgICAiICBqYXZhLnV0aWwuTWFwPCR0eXBlX3BhcmFtZXRlcnMkPiBtYXAgPVxuIgorICAgICAgICAiICAgICAgaW50ZXJuYWxHZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICAgIiAgcmV0dXJuIG1hcC5jb250YWluc0tleShrZXkpID8gbWFwLmdldChrZXkpIDogZGVmYXVsdFZhbHVlO1xuIgorICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kXG4iCisgICAgICAgICAgICAgICAgICAgInB1YmxpYyAkdmFsdWVfdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JUaHJvdyR9JChcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICRrZXlfdHlwZSQga2V5KSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgJGtleV9udWxsX2NoZWNrJFxuIgorICAgICAgICAgICAgICAgICAgICIgIGphdmEudXRpbC5NYXA8JHR5cGVfcGFyYW1ldGVycyQ+IG1hcCA9XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIGludGVybmFsR2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgaWYgKCFtYXAuY29udGFpbnNLZXkoa2V5KSkge1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTtcbiIKKyAgICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIG1hcC5nZXQoa2V5KTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHByaXZhdGUgc2V0dGVycyBmb3IgdGhlIGJ1aWxkZXIgdG8gcHJveHkgaW50by4KKyAgaWYgKEdldEphdmFUeXBlKFZhbHVlRmllbGQoZGVzY3JpcHRvcl8pKSA9PSBKQVZBVFlQRV9FTlVNKSB7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAicHJpdmF0ZSBqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICR2YWx1ZV9lbnVtX3R5cGUkPlxuIgorICAgICAgICAiZ2V0TXV0YWJsZSRjYXBpdGFsaXplZF9uYW1lJE1hcCgpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuIG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLk1hcEFkYXB0ZXI8XG4iCisgICAgICAgICIgICAgICAkYm94ZWRfa2V5X3R5cGUkLCAkdmFsdWVfZW51bV90eXBlJCwgamF2YS5sYW5nLkludGVnZXI+KFxuIgorICAgICAgICAiICAgICAgICAgIGludGVybmFsR2V0TXV0YWJsZSRjYXBpdGFsaXplZF9uYW1lJCgpLFxuIgorICAgICAgICAiICAgICAgICAgICRuYW1lJFZhbHVlQ29udmVydGVyKTtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgICAicHJpdmF0ZSBqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICRib3hlZF92YWx1ZV90eXBlJD5cbiIKKyAgICAgICAgICAiZ2V0TXV0YWJsZSRjYXBpdGFsaXplZF9uYW1lJFZhbHVlTWFwKCkge1xuIgorICAgICAgICAgICIgIHJldHVybiBpbnRlcm5hbEdldE11dGFibGUkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICAgICAifVxuIik7CisgICAgfQorICB9IGVsc2UgeworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJwcml2YXRlIGphdmEudXRpbC5NYXA8JHR5cGVfcGFyYW1ldGVycyQ+XG4iCisgICAgICAgICAgICAgICAgICAgImdldE11dGFibGUkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGludGVybmFsR2V0TXV0YWJsZSRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgfQorfQorCit2b2lkIEltbXV0YWJsZU1hcEZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVGaWVsZEluZm8oCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCB7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShkZXNjcmlwdG9yXy0+bnVtYmVyKCksIG91dHB1dCk7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShHZXRFeHBlcmltZW50YWxKYXZhRmllbGRUeXBlKGRlc2NyaXB0b3JfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJcIiRuYW1lJF9cIixcbiIKKyAgICAgICAgICAgICAgICAgIiRkZWZhdWx0X2VudHJ5JCxcbiIpOworICBpZiAoIVN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfKSAmJgorICAgICAgR2V0SmF2YVR5cGUoVmFsdWVGaWVsZChkZXNjcmlwdG9yXykpID09IEpBVkFUWVBFX0VOVU0pIHsKKyAgICBQcmludEVudW1WZXJpZmllckxvZ2ljKHByaW50ZXIsIFZhbHVlRmllbGQoZGVzY3JpcHRvcl8pLCB2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp2YXJfbmFtZT0qLyIkdmFsdWVfZW51bV90eXBlJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRlcm1pbmF0aW5nX3N0cmluZz0qLyIsXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyplbmZvcmNlX2xpdGU9Ki9jb250ZXh0Xy0+RW5mb3JjZUxpdGUoKSk7CisgIH0KK30KKwordm9pZCBJbW11dGFibGVNYXBGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlck1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICAgICAgICAgICAgInB1YmxpYyBpbnQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKS5zaXplKCk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICJwdWJsaWMgYm9vbGVhbiAkeyRjb250YWlucyRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICIgICAgJGtleV90eXBlJCBrZXkpIHtcbiIKKyAgICAgICIgICRrZXlfbnVsbF9jaGVjayRcbiIKKyAgICAgICIgIHJldHVybiBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKS5jb250YWluc0tleShrZXkpO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAgICAgICAgICAicHVibGljIEJ1aWxkZXIgJHskY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGNvcHlPbldyaXRlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgIGluc3RhbmNlLmdldE11dGFibGUkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKS5jbGVhcigpO1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kXG4iCisgICAgICAgICAgICAgICAgICJwdWJsaWMgQnVpbGRlciAkeyRyZW1vdmUkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgJGtleV90eXBlJCBrZXkpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJGtleV9udWxsX2NoZWNrJFxuIgorICAgICAgICAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICBpbnN0YW5jZS5nZXRNdXRhYmxlJGNhcGl0YWxpemVkX25hbWUkTWFwKCkucmVtb3ZlKGtleSk7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIGlmIChHZXRKYXZhVHlwZShWYWx1ZUZpZWxkKGRlc2NyaXB0b3JfKSkgPT0gSkFWQVRZUEVfRU5VTSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIi8qKlxuIgorICAgICAgICAgICAgICAgICAgICIgKiBVc2Uge0BsaW5rICNnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKX0gaW5zdGVhZC5cbiIKKyAgICAgICAgICAgICAgICAgICAiICovXG4iCisgICAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuRGVwcmVjYXRlZFxuIgorICAgICAgICAgICAgICAgICAgICJwdWJsaWMgamF2YS51dGlsLk1hcDwkYm94ZWRfa2V5X3R5cGUkLCAkdmFsdWVfZW51bV90eXBlJD5cbiIKKyAgICAgICAgICAgICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kXG4iCisgICAgICAgICAgICAgICAgICAgInB1YmxpYyBqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICR2YWx1ZV9lbnVtX3R5cGUkPlxuIgorICAgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIGluc3RhbmNlLmdldCRjYXBpdGFsaXplZF9uYW1lJE1hcCgpKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICIkZGVwcmVjYXRpb24kXG4iCisgICAgICAgICJwdWJsaWMgJHZhbHVlX2VudW1fdHlwZV9wYXNzX3Rocm91Z2hfbnVsbG5lc3MkICIKKyAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJE9yRGVmYXVsdCR9JChcbiIKKyAgICAgICAgIiAgICAka2V5X3R5cGUkIGtleSxcbiIKKyAgICAgICAgIiAgICAkdmFsdWVfZW51bV90eXBlX3Bhc3NfdGhyb3VnaF9udWxsbmVzcyQgZGVmYXVsdFZhbHVlKSB7XG4iCisgICAgICAgICIgICRrZXlfbnVsbF9jaGVjayRcbiIKKyAgICAgICAgIiAgamF2YS51dGlsLk1hcDwkYm94ZWRfa2V5X3R5cGUkLCAkdmFsdWVfZW51bV90eXBlJD4gbWFwID1cbiIKKyAgICAgICAgIiAgICAgIGluc3RhbmNlLmdldCRjYXBpdGFsaXplZF9uYW1lJE1hcCgpO1xuIgorICAgICAgICAiICByZXR1cm4gbWFwLmNvbnRhaW5zS2V5KGtleSlcbiIKKyAgICAgICAgIiAgICAgICAgID8gbWFwLmdldChrZXkpXG4iCisgICAgICAgICIgICAgICAgICA6IGRlZmF1bHRWYWx1ZTtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAicHVibGljICR2YWx1ZV9lbnVtX3R5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJE9yVGhyb3ckfSQoXG4iCisgICAgICAgICIgICAgJGtleV90eXBlJCBrZXkpIHtcbiIKKyAgICAgICAgIiAgJGtleV9udWxsX2NoZWNrJFxuIgorICAgICAgICAiICBqYXZhLnV0aWwuTWFwPCRib3hlZF9rZXlfdHlwZSQsICR2YWx1ZV9lbnVtX3R5cGUkPiBtYXAgPVxuIgorICAgICAgICAiICAgICAgaW5zdGFuY2UuZ2V0JGNhcGl0YWxpemVkX25hbWUkTWFwKCk7XG4iCisgICAgICAgICIgIGlmICghbWFwLmNvbnRhaW5zS2V5KGtleSkpIHtcbiIKKyAgICAgICAgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpO1xuIgorICAgICAgICAiICB9XG4iCisgICAgICAgICIgIHJldHVybiBtYXAuZ2V0KGtleSk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRwdXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICIgICAgJGtleV90eXBlJCBrZXksXG4iCisgICAgICAgICIgICAgJHZhbHVlX2VudW1fdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgIiAgJGtleV9udWxsX2NoZWNrJFxuIgorICAgICAgICAiICAkdmFsdWVfbnVsbF9jaGVjayRcbiIKKyAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgIiAgaW5zdGFuY2UuZ2V0TXV0YWJsZSRjYXBpdGFsaXplZF9uYW1lJE1hcCgpLnB1dChrZXksIHZhbHVlKTtcbiIKKyAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRwdXRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICIgICAgamF2YS51dGlsLk1hcDwkYm94ZWRfa2V5X3R5cGUkLCAkdmFsdWVfZW51bV90eXBlJD4gdmFsdWVzKSB7XG4iCisgICAgICAgICIgIGNvcHlPbldyaXRlKCk7XG4iCisgICAgICAgICIgIGluc3RhbmNlLmdldE11dGFibGUkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKS5wdXRBbGwodmFsdWVzKTtcbiIKKyAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgICAiLyoqXG4iCisgICAgICAgICAgIiAqIFVzZSB7QGxpbmsgI2dldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlTWFwKCl9IGluc3RlYWQuXG4iCisgICAgICAgICAgIiAqL1xuIgorICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgIkBqYXZhLmxhbmcuRGVwcmVjYXRlZFxuIgorICAgICAgICAgICJwdWJsaWMgamF2YS51dGlsLk1hcDwkYm94ZWRfa2V5X3R5cGUkLCAkYm94ZWRfdmFsdWVfdHlwZSQ+XG4iCisgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlJH0kKCkge1xuIgorICAgICAgICAgICIgIHJldHVybiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZU1hcCgpO1xuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgIiRkZXByZWNhdGlvbiRcbiIKKyAgICAgICAgICAicHVibGljIGphdmEudXRpbC5NYXA8JGJveGVkX2tleV90eXBlJCwgJGJveGVkX3ZhbHVlX3R5cGUkPlxuIgorICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZU1hcCR9JCgpIHtcbiIKKyAgICAgICAgICAiICByZXR1cm4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChcbiIKKyAgICAgICAgICAiICAgICAgaW5zdGFuY2UuZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWVNYXAoKSk7XG4iCisgICAgICAgICAgIn1cbiIpOworICAgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAgICJwdWJsaWMgJHZhbHVlX3R5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlT3JEZWZhdWx0JH0kKFxuIgorICAgICAgICAgICIgICAgJGtleV90eXBlJCBrZXksXG4iCisgICAgICAgICAgIiAgICAkdmFsdWVfdHlwZSQgZGVmYXVsdFZhbHVlKSB7XG4iCisgICAgICAgICAgIiAgJGtleV9udWxsX2NoZWNrJFxuIgorICAgICAgICAgICIgIGphdmEudXRpbC5NYXA8JGJveGVkX2tleV90eXBlJCwgJGJveGVkX3ZhbHVlX3R5cGUkPiBtYXAgPVxuIgorICAgICAgICAgICIgICAgICBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZU1hcCgpO1xuIgorICAgICAgICAgICIgIHJldHVybiBtYXAuY29udGFpbnNLZXkoa2V5KSA/IG1hcC5nZXQoa2V5KSA6IGRlZmF1bHRWYWx1ZTtcbiIKKyAgICAgICAgICAifVxuIik7CisgICAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICIkZGVwcmVjYXRpb24kXG4iCisgICAgICAgICAgInB1YmxpYyAkdmFsdWVfdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWVPclRocm93JH0kKFxuIgorICAgICAgICAgICIgICAgJGtleV90eXBlJCBrZXkpIHtcbiIKKyAgICAgICAgICAiICAka2V5X251bGxfY2hlY2skXG4iCisgICAgICAgICAgIiAgamF2YS51dGlsLk1hcDwkYm94ZWRfa2V5X3R5cGUkLCAkYm94ZWRfdmFsdWVfdHlwZSQ+IG1hcCA9XG4iCisgICAgICAgICAgIiAgICAgIGluc3RhbmNlLmdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlTWFwKCk7XG4iCisgICAgICAgICAgIiAgaWYgKCFtYXAuY29udGFpbnNLZXkoa2V5KSkge1xuIgorICAgICAgICAgICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTtcbiIKKyAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgIiAgcmV0dXJuIG1hcC5nZXQoa2V5KTtcbiIKKyAgICAgICAgICAifVxuIik7CisgICAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JHB1dCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlJH0kKFxuIgorICAgICAgICAgICIgICAgJGtleV90eXBlJCBrZXksXG4iCisgICAgICAgICAgIiAgICAkdmFsdWVfdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAiICAka2V5X251bGxfY2hlY2skXG4iCisgICAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgICAiICBpbnN0YW5jZS5nZXRNdXRhYmxlJGNhcGl0YWxpemVkX25hbWUkVmFsdWVNYXAoKS5wdXQoa2V5LCB2YWx1ZSk7XG4iCisgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgIn1cbiIpOworICAgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRwdXRBbGwkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSR9JChcbiIKKyAgICAgICAgICAiICAgIGphdmEudXRpbC5NYXA8JGJveGVkX2tleV90eXBlJCwgJGJveGVkX3ZhbHVlX3R5cGUkPiB2YWx1ZXMpIHtcbiIKKyAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICIgIGluc3RhbmNlLmdldE11dGFibGUkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZU1hcCgpLnB1dEFsbCh2YWx1ZXMpO1xuIgorICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgfQorICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIi8qKlxuIgorICAgICAgICAgICAgICAgICAgICIgKiBVc2Uge0BsaW5rICNnZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKX0gaW5zdGVhZC5cbiIKKyAgICAgICAgICAgICAgICAgICAiICovXG4iCisgICAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iCisgICAgICAgICAgICAgICAgICAgInB1YmxpYyBqYXZhLnV0aWwuTWFwPCR0eXBlX3BhcmFtZXRlcnMkPiAiCisgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTWFwKCk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJCIKKyAgICAgICAgICAgICAgICAgICAicHVibGljIGphdmEudXRpbC5NYXA8JHR5cGVfcGFyYW1ldGVycyQ+ICIKKyAgICAgICAgICAgICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkTWFwJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKFxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKSk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAiJGRlcHJlY2F0aW9uJFxuIgorICAgICAgICAicHVibGljICR2YWx1ZV90eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckRlZmF1bHQkfSQoXG4iCisgICAgICAgICIgICAgJGtleV90eXBlJCBrZXksXG4iCisgICAgICAgICIgICAgJHZhbHVlX3R5cGUkIGRlZmF1bHRWYWx1ZSkge1xuIgorICAgICAgICAiICAka2V5X251bGxfY2hlY2skXG4iCisgICAgICAgICIgIGphdmEudXRpbC5NYXA8JHR5cGVfcGFyYW1ldGVycyQ+IG1hcCA9XG4iCisgICAgICAgICIgICAgICBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKTtcbiIKKyAgICAgICAgIiAgcmV0dXJuIG1hcC5jb250YWluc0tleShrZXkpID8gbWFwLmdldChrZXkpIDogZGVmYXVsdFZhbHVlO1xuIgorICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kXG4iCisgICAgICAgICAgICAgICAgICAgInB1YmxpYyAkdmFsdWVfdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JUaHJvdyR9JChcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICRrZXlfdHlwZSQga2V5KSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgJGtleV9udWxsX2NoZWNrJFxuIgorICAgICAgICAgICAgICAgICAgICIgIGphdmEudXRpbC5NYXA8JHR5cGVfcGFyYW1ldGVycyQ+IG1hcCA9XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIGluc3RhbmNlLmdldCRjYXBpdGFsaXplZF9uYW1lJE1hcCgpO1xuIgorICAgICAgICAgICAgICAgICAgICIgIGlmICghbWFwLmNvbnRhaW5zS2V5KGtleSkpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiBtYXAuZ2V0KGtleSk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiJGRlcHJlY2F0aW9uJCIKKyAgICAgICAgInB1YmxpYyBCdWlsZGVyICR7JHB1dCRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICAgIiAgICAka2V5X3R5cGUkIGtleSxcbiIKKyAgICAgICAgIiAgICAkdmFsdWVfdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgIiAgJGtleV9udWxsX2NoZWNrJFxuIgorICAgICAgICAiICAkdmFsdWVfbnVsbF9jaGVjayRcbiIKKyAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgIiAgaW5zdGFuY2UuZ2V0TXV0YWJsZSRjYXBpdGFsaXplZF9uYW1lJE1hcCgpLnB1dChrZXksIHZhbHVlKTtcbiIKKyAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIiRkZXByZWNhdGlvbiQiCisgICAgICAgICJwdWJsaWMgQnVpbGRlciAkeyRwdXRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICIgICAgamF2YS51dGlsLk1hcDwkdHlwZV9wYXJhbWV0ZXJzJD4gdmFsdWVzKSB7XG4iCisgICAgICAgICIgIGNvcHlPbldyaXRlKCk7XG4iCisgICAgICAgICIgIGluc3RhbmNlLmdldE11dGFibGUkY2FwaXRhbGl6ZWRfbmFtZSRNYXAoKS5wdXRBbGwodmFsdWVzKTtcbiIKKyAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICB9Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWFwRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIi8qKlxuIgorICAgICAgIiAqIEFuIHVuaW5zdGFudGlhYmxlLCBiZWhhdmlvcmxlc3MgdHlwZSB0byByZXByZXNlbnQgdGhlIGZpZWxkIGluXG4iCisgICAgICAiICogZ2VuZXJpY3MuXG4iCisgICAgICAiICovXG4iCisgICAgICAiQGtvdGxpbi5PcHRJbiIKKyAgICAgICIoY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uT25seUZvclVzZUJ5R2VuZXJhdGVkUHJvdG9Db2RlOjpjbGFzcylcbiIKKyAgICAgICJjbGFzcyAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JCBwcml2YXRlIGNvbnN0cnVjdG9yKCkiCisgICAgICAiIDogY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsUHJveHkoKVxuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGt0X2RlcHJlY2F0aW9uJCB2YWwgJGt0X25hbWUkOiAiCisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTWFwIgorICAgICAgIjwka3Rfa2V5X3R5cGUkLCAka3RfdmFsdWVfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPlxuIgorICAgICAgIiAgQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiICBASnZtTmFtZShcImdldCRrdF9jYXBpdGFsaXplZF9uYW1lJE1hcFwiKVxuIgorICAgICAgIiAgZ2V0KCkgPSBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xNYXAoXG4iCisgICAgICAiICAgICRrdF9kc2xfYnVpbGRlciQuJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkTWFwJH0kKClcbiIKKyAgICAgICIgIClcbiIpOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBKdm1OYW1lKFwicHV0JGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAiZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbE1hcCIKKyAgICAgICI8JGt0X2tleV90eXBlJCwgJGt0X3ZhbHVlX3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD5cbiIKKyAgICAgICIgIC5wdXQoa2V5OiAka3Rfa2V5X3R5cGUkLCB2YWx1ZTogJGt0X3ZhbHVlX3R5cGUkKSB7XG4iCisgICAgICAiICAgICAka3RfZHNsX2J1aWxkZXIkLiR7JHB1dCRjYXBpdGFsaXplZF9uYW1lJCR9JChrZXksIHZhbHVlKVxuIgorICAgICAgIiAgIH1cbiIpOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIkBKdm1OYW1lKFwic2V0JGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAiQFN1cHByZXNzKFwiTk9USElOR19UT19JTkxJTkVcIilcbiIKKyAgICAgICJpbmxpbmUgb3BlcmF0b3IgZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbE1hcCIKKyAgICAgICI8JGt0X2tleV90eXBlJCwgJGt0X3ZhbHVlX3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD5cbiIKKyAgICAgICIgIC5zZXQoa2V5OiAka3Rfa2V5X3R5cGUkLCB2YWx1ZTogJGt0X3ZhbHVlX3R5cGUkKSB7XG4iCisgICAgICAiICAgICBwdXQoa2V5LCB2YWx1ZSlcbiIKKyAgICAgICIgICB9XG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJASnZtTmFtZShcInJlbW92ZSRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgImZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xNYXAiCisgICAgICAiPCRrdF9rZXlfdHlwZSQsICRrdF92YWx1ZV90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+XG4iCisgICAgICAiICAucmVtb3ZlKGtleTogJGt0X2tleV90eXBlJCkge1xuIgorICAgICAgIiAgICAgJGt0X2RzbF9idWlsZGVyJC4keyRyZW1vdmUkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoa2V5KVxuIgorICAgICAgIiAgIH1cbiIpOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIkBKdm1OYW1lKFwicHV0QWxsJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAiZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbE1hcCIKKyAgICAgICI8JGt0X2tleV90eXBlJCwgJGt0X3ZhbHVlX3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD5cbiIKKyAgICAgICIgIC5wdXRBbGwobWFwOiBrb3RsaW4uY29sbGVjdGlvbnMuTWFwPCRrdF9rZXlfdHlwZSQsICRrdF92YWx1ZV90eXBlJD4pICIKKyAgICAgICJ7XG4iCisgICAgICAiICAgICAka3RfZHNsX2J1aWxkZXIkLiR7JHB1dEFsbCRjYXBpdGFsaXplZF9uYW1lJCR9JChtYXApXG4iCisgICAgICAiICAgfVxuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiQEp2bU5hbWUoXCJjbGVhciRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgImZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xNYXAiCisgICAgICAiPCRrdF9rZXlfdHlwZSQsICRrdF92YWx1ZV90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+XG4iCisgICAgICAiICAuY2xlYXIoKSB7XG4iCisgICAgICAiICAgICAka3RfZHNsX2J1aWxkZXIkLiR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKClcbiIKKyAgICAgICIgICB9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVNYXBGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIE5vdGhpbmcgdG8gaW5pdGlhbGl6ZS4KK30KKworc3RkOjpzdHJpbmcgSW1tdXRhYmxlTWFwRmllbGRMaXRlR2VuZXJhdG9yOjpHZXRCb3hlZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZF9saXRlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWFwX2ZpZWxkX2xpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjRmMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21hcF9maWVsZF9saXRlLmgKQEAgLTAsMCArMSw3NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUFQX0ZJRUxEX0xJVEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01BUF9GSUVMRF9MSVRFX0hfXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK2NsYXNzIEltbXV0YWJsZU1hcEZpZWxkTGl0ZUdlbmVyYXRvciA6IHB1YmxpYyBJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgSW1tdXRhYmxlTWFwRmllbGRMaXRlR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KTsKKyAgfkltbXV0YWJsZU1hcEZpZWxkTGl0ZUdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlRmllbGRJbmZvKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJpYWJsZXNfOworICBDb250ZXh0KiBjb250ZXh0XzsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXJfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUFQX0ZJRUxEX0xJVEVfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NGNiZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZS5jYwpAQCAtMCwwICsxLDE2MDMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvcl9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlcl9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZV9yZXNvbHZlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisKKy8vIE11c3QgYmUgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTsKKworbmFtZXNwYWNlIHsKK3N0ZDo6c3RyaW5nIE1hcFZhbHVlSW1tdXRhYmxlQ2xhc3NkTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsdWVfZmllbGQgPSBkZXNjcmlwdG9yLT5tYXBfdmFsdWUoKTsKKyAgR09PR0xFX0NIRUNLX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCB2YWx1ZV9maWVsZC0+dHlwZSgpKTsKKyAgcmV0dXJuIG5hbWVfcmVzb2x2ZXItPkdldEltbXV0YWJsZUNsYXNzTmFtZSh2YWx1ZV9maWVsZC0+bWVzc2FnZV90eXBlKCkpOworfQorfSAgLy8gbmFtZXNwYWNlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTWVzc2FnZUdlbmVyYXRvcjo6TWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoSXNSZWFsT25lb2YoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKSkgeworICAgICAgb25lb2ZzXy5pbnNlcnQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpLT5jb250YWluaW5nX29uZW9mKCkpOworICAgIH0KKyAgfQorfQorCitNZXNzYWdlR2VuZXJhdG9yOjp+TWVzc2FnZUdlbmVyYXRvcigpIHt9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0ltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3IoCisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgQ29udGV4dCogY29udGV4dCkKKyAgICA6IE1lc3NhZ2VHZW5lcmF0b3IoZGVzY3JpcHRvciksCisgICAgICBjb250ZXh0Xyhjb250ZXh0KSwKKyAgICAgIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSwKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfKGRlc2NyaXB0b3IsIGNvbnRleHRfKSB7CisgIEdPT0dMRV9DSEVDSyhIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yLT5maWxlKCksIGNvbnRleHQtPkVuZm9yY2VMaXRlKCkpKQorICAgICAgPDwgIkdlbmVyYXRvciBmYWN0b3J5IGVycm9yOiBBIG5vbi1saXRlIG1lc3NhZ2UgZ2VuZXJhdG9yIGlzIHVzZWQgdG8gIgorICAgICAgICAgImdlbmVyYXRlIGxpdGUgbWVzc2FnZXMuIjsKK30KKworSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6fkltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3IoKSB7fQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlU3RhdGljVmFyaWFibGVzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBpbnQqIGJ5dGVjb2RlX2VzdGltYXRlKSB7CisgIC8vIEJlY2F1c2UgZGVzY3JpcHRvci5wcm90byAoY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9zKSBpcworICAvLyB1c2VkIGluIHRoZSBjb25zdHJ1Y3Rpb24gb2YgZGVzY3JpcHRvcnMsIHdlIGhhdmUgYSB0cmlja3kgYm9vdHN0cmFwcGluZworICAvLyBwcm9ibGVtLiAgVG8gaGVscCBjb250cm9sIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvcmRlciwgd2UgbWFrZSBzdXJlIGFsbAorICAvLyBkZXNjcmlwdG9ycyBhbmQgb3RoZXIgc3RhdGljIGRhdGEgdGhhdCBkZXBlbmRzIG9uIHRoZW0gYXJlIG1lbWJlcnMgb2YKKyAgLy8gdGhlIG91dGVybW9zdCBjbGFzcyBpbiB0aGUgZmlsZS4gIFRoaXMgd2F5LCB0aGV5IHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4KKyAgLy8gYSBkZXRlcm1pbmlzdGljIG9yZGVyLgorCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgdmFyc1siaWRlbnRpZmllciJdID0gVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihkZXNjcmlwdG9yXyk7CisgIHZhcnNbImluZGV4Il0gPSBTdHJDYXQoZGVzY3JpcHRvcl8tPmluZGV4KCkpOworICB2YXJzWyJjbGFzc25hbWUiXSA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pOworICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpICE9IE5VTEwpIHsKKyAgICB2YXJzWyJwYXJlbnQiXSA9IFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgfQorICBpZiAoTXVsdGlwbGVKYXZhRmlsZXMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgLyogaW1tdXRhYmxlID0gKi8gdHJ1ZSkpIHsKKyAgICAvLyBXZSBjYW4gb25seSBtYWtlIHRoZXNlIHBhY2thZ2UtcHJpdmF0ZSBzaW5jZSB0aGUgY2xhc3NlcyB0aGF0IHVzZSB0aGVtCisgICAgLy8gYXJlIGluIHNlcGFyYXRlIGZpbGVzLgorICAgIHZhcnNbInByaXZhdGUiXSA9ICIiOworICB9IGVsc2UgeworICAgIHZhcnNbInByaXZhdGUiXSA9ICJwcml2YXRlICI7CisgIH0KKyAgaWYgKCpieXRlY29kZV9lc3RpbWF0ZSA8PSBrTWF4U3RhdGljU2l6ZSkgeworICAgIHZhcnNbImZpbmFsIl0gPSAiZmluYWwgIjsKKyAgfSBlbHNlIHsKKyAgICB2YXJzWyJmaW5hbCJdID0gIiI7CisgIH0KKworICAvLyBUaGUgZGVzY3JpcHRvciBmb3IgdGhpcyB0eXBlLgorICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcnMsCisgICAgICAvLyBUT0RPKHRlYm9yaW5nKTogZmluYWwgbmVlZHMgdG8gYmUgYWRkZWQgYmFjay4gVGhlIHdheSB0byBmaXggaXQgaXMgdG8KKyAgICAgIC8vIGdlbmVyYXRlIG1ldGhvZHMgdGhhdCBjYW4gY29uc3RydWN0IHRoZSB0eXBlcywgYW5kIHRoZW4gc3RpbGwgZGVjbGFyZQorICAgICAgLy8gdGhlIHR5cGVzLCBhbmQgdGhlbiBpbml0IHRoZW0gaW4gY2xpbml0IHdpdGggdGhlIG5ldyBtZXRob2QgY2FsbHMuCisgICAgICAiJHByaXZhdGUkc3RhdGljICRmaW5hbCRjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3JcbiIKKyAgICAgICIgIGludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yO1xuIik7CisgICpieXRlY29kZV9lc3RpbWF0ZSArPSAzMDsKKworICAvLyBBbmQgdGhlIEZpZWxkQWNjZXNzb3JUYWJsZS4KKyAgR2VuZXJhdGVGaWVsZEFjY2Vzc29yVGFibGUocHJpbnRlciwgYnl0ZWNvZGVfZXN0aW1hdGUpOworCisgIC8vIEdlbmVyYXRlIHN0YXRpYyBtZW1iZXJzIGZvciBhbGwgbmVzdGVkIHR5cGVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAvLyBUT0RPKGtlbnRvbik6ICBSZXVzZSBNZXNzYWdlR2VuZXJhdG9yIG9iamVjdHM/CisgICAgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcihkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSksIGNvbnRleHRfKQorICAgICAgICAuR2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMocHJpbnRlciwgYnl0ZWNvZGVfZXN0aW1hdGUpOworICB9Cit9CisKK2ludCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGludCBieXRlY29kZV9lc3RpbWF0ZSA9IDA7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgdmFyc1siaWRlbnRpZmllciJdID0gVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihkZXNjcmlwdG9yXyk7CisgIHZhcnNbImluZGV4Il0gPSBTdHJDYXQoZGVzY3JpcHRvcl8tPmluZGV4KCkpOworICB2YXJzWyJjbGFzc25hbWUiXSA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pOworICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpICE9IE5VTEwpIHsKKyAgICB2YXJzWyJwYXJlbnQiXSA9IFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgfQorCisgIC8vIFRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIHR5cGUuCisgIGlmIChkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCkgeworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICAgICAgICAgICAgImludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yID1cbiIKKyAgICAgICAgICAgICAgICAgICAiICBnZXREZXNjcmlwdG9yKCkuZ2V0TWVzc2FnZVR5cGVzKCkuZ2V0KCRpbmRleCQpO1xuIik7CisgICAgYnl0ZWNvZGVfZXN0aW1hdGUgKz0gMzA7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcnMsCisgICAgICAgICJpbnRlcm5hbF8kaWRlbnRpZmllciRfZGVzY3JpcHRvciA9XG4iCisgICAgICAgICIgIGludGVybmFsXyRwYXJlbnQkX2Rlc2NyaXB0b3IuZ2V0TmVzdGVkVHlwZXMoKS5nZXQoJGluZGV4JCk7XG4iKTsKKyAgICBieXRlY29kZV9lc3RpbWF0ZSArPSAzMDsKKyAgfQorCisgIC8vIEFuZCB0aGUgRmllbGRBY2Nlc3NvclRhYmxlLgorICBieXRlY29kZV9lc3RpbWF0ZSArPSBHZW5lcmF0ZUZpZWxkQWNjZXNzb3JUYWJsZUluaXRpYWxpemVyKHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIHN0YXRpYyBtZW1iZXIgaW5pdGlhbGl6ZXJzIGZvciBhbGwgbmVzdGVkIHR5cGVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAvLyBUT0RPKGtlbnRvbik6ICBSZXVzZSBNZXNzYWdlR2VuZXJhdG9yIG9iamVjdHM/CisgICAgYnl0ZWNvZGVfZXN0aW1hdGUgKz0KKyAgICAgICAgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcihkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSksIGNvbnRleHRfKQorICAgICAgICAgICAgLkdlbmVyYXRlU3RhdGljVmFyaWFibGVJbml0aWFsaXplcnMocHJpbnRlcik7CisgIH0KKyAgcmV0dXJuIGJ5dGVjb2RlX2VzdGltYXRlOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlRmllbGRBY2Nlc3NvclRhYmxlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBpbnQqIGJ5dGVjb2RlX2VzdGltYXRlKSB7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgdmFyc1siaWRlbnRpZmllciJdID0gVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihkZXNjcmlwdG9yXyk7CisgIGlmIChNdWx0aXBsZUphdmFGaWxlcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCAvKiBpbW11dGFibGUgPSAqLyB0cnVlKSkgeworICAgIC8vIFdlIGNhbiBvbmx5IG1ha2UgdGhlc2UgcGFja2FnZS1wcml2YXRlIHNpbmNlIHRoZSBjbGFzc2VzIHRoYXQgdXNlIHRoZW0KKyAgICAvLyBhcmUgaW4gc2VwYXJhdGUgZmlsZXMuCisgICAgdmFyc1sicHJpdmF0ZSJdID0gIiI7CisgIH0gZWxzZSB7CisgICAgdmFyc1sicHJpdmF0ZSJdID0gInByaXZhdGUgIjsKKyAgfQorICBpZiAoKmJ5dGVjb2RlX2VzdGltYXRlIDw9IGtNYXhTdGF0aWNTaXplKSB7CisgICAgdmFyc1siZmluYWwiXSA9ICJmaW5hbCAiOworICB9IGVsc2UgeworICAgIHZhcnNbImZpbmFsIl0gPSAiIjsKKyAgfQorICB2YXJzWyJ2ZXIiXSA9IEdlbmVyYXRlZENvZGVWZXJzaW9uU3VmZml4KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFycywKKyAgICAgICIkcHJpdmF0ZSRzdGF0aWMgJGZpbmFsJFxuIgorICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlJHZlciQuRmllbGRBY2Nlc3NvclRhYmxlXG4iCisgICAgICAiICAgIGludGVybmFsXyRpZGVudGlmaWVyJF9maWVsZEFjY2Vzc29yVGFibGU7XG4iKTsKKworICAvLyBUaGUgZm9sbG93aW5nIGJ5dGVjb2RlX2VzdGltYXRlIGNhbGN1bGF0aW9uIGxvZ2ljIG11c3Qgc3RheSBpbiBzeW5jIHdpdGgKKyAgLy8gdGhlIHNpbWlsYXIgbG9naWMgaW4gdGhlIEdlbmVyYXRlRmllbGRBY2Nlc3NvclRhYmxlSW5pdGlhbGl6ZXIgbWV0aG9kIGJlbG93CisgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBnZW5lcmF0ZWQgc3RhdGljIGZpbmFsIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgIGluIHRoZQorICAvLyBzdGF0aWMgaW5pdGlhbGl6YXRpb24gYmxvY2sgZGlyZWN0bHkuCisgIC8vCisgIC8vIDYgYnl0ZXMgcGVyIGZpZWxkIGFuZCBvbmVvZgorICAqYnl0ZWNvZGVfZXN0aW1hdGUgKz0KKyAgICAgIDEwICsgNiAqIGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpICsgNiAqIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7Cit9CisKK2ludCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUZpZWxkQWNjZXNzb3JUYWJsZUluaXRpYWxpemVyKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGludCBieXRlY29kZV9lc3RpbWF0ZSA9IDEwOworICBwcmludGVyLT5QcmludCgKKyAgICAgICJpbnRlcm5hbF8kaWRlbnRpZmllciRfZmllbGRBY2Nlc3NvclRhYmxlID0gbmV3XG4iCisgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UkdmVyJC5GaWVsZEFjY2Vzc29yVGFibGUoXG4iCisgICAgICAiICAgIGludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yLFxuIgorICAgICAgIiAgICBuZXcgamF2YS5sYW5nLlN0cmluZ1tdIHsgIiwKKyAgICAgICJpZGVudGlmaWVyIiwgVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihkZXNjcmlwdG9yXyksICJ2ZXIiLAorICAgICAgR2VuZXJhdGVkQ29kZVZlcnNpb25TdWZmaXgoKSk7CisgIC8vIEFsbCB0aGUgYnl0ZWNvZGVfZXN0aW1hdGUgY2FsY3VsYXRpb24gbG9naWMgaW4gdGhpcyBtZXRob2QgbXVzdCBzdGF5IGluCisgIC8vIHN5bmMgd2l0aCB0aGUgc2ltaWxhciBsb2dpYyBpbiB0aGUgR2VuZXJhdGVGaWVsZEFjY2Vzc29yVGFibGUgbWV0aG9kCisgIC8vIGFib3ZlLiBTZWUgdGhlIGNvcnJlc3BvbmRpbmcgY29tbWVudCBpbiBHZW5lcmF0ZUZpZWxkQWNjZXNzb3JUYWJsZSBmb3IKKyAgLy8gZGV0YWlscy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8gPSBjb250ZXh0Xy0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGZpZWxkKTsKKyAgICBieXRlY29kZV9lc3RpbWF0ZSArPSA2OworICAgIHByaW50ZXItPlByaW50KCJcIiRmaWVsZF9uYW1lJFwiLCAiLCAiZmllbGRfbmFtZSIsIGluZm8tPmNhcGl0YWxpemVkX25hbWUpOworICB9CisgIC8vIFdlIHJlcHJvZHVjZSBzeW50aGV0aWMgb25lb2ZzIGhlcmUgc2luY2UgcHJvdG8gcmVmbGVjdGlvbiBuZWVkcyB0aGVzZS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSk7CisgICAgY29uc3QgT25lb2ZHZW5lcmF0b3JJbmZvKiBpbmZvID0gY29udGV4dF8tPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhvbmVvZik7CisgICAgYnl0ZWNvZGVfZXN0aW1hdGUgKz0gNjsKKyAgICBwcmludGVyLT5QcmludCgiXCIkb25lb2ZfbmFtZSRcIiwgIiwgIm9uZW9mX25hbWUiLCBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKKyAgfQorICBwcmludGVyLT5QcmludCgifSk7XG4iKTsKKyAgcmV0dXJuIGJ5dGVjb2RlX2VzdGltYXRlOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVJbnRlcmZhY2UoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgTWF5YmVQcmludEdlbmVyYXRlZEFubm90YXRpb24oY29udGV4dF8sIHByaW50ZXIsIGRlc2NyaXB0b3JfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW11dGFibGUgPSAqLyB0cnVlLCAiT3JCdWlsZGVyIik7CisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludGVyZmFjZSAkeyQkY2xhc3NuYW1lJE9yQnVpbGRlciR9JCBleHRlbmRzXG4iCisgICAgICAgICIgICAgJGV4dHJhX2ludGVyZmFjZXMkXG4iCisgICAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlJHZlciQuXG4iCisgICAgICAgICIgICAgICAgIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPCRjbGFzc25hbWUkPiB7XG4iLAorICAgICAgICAiZGVwcmVjYXRpb24iLAorICAgICAgICBkZXNjcmlwdG9yXy0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKSA/ICJAamF2YS5sYW5nLkRlcHJlY2F0ZWQgIiA6ICIiLAorICAgICAgICAiZXh0cmFfaW50ZXJmYWNlcyIsIEV4dHJhTWVzc2FnZU9yQnVpbGRlckludGVyZmFjZXMoZGVzY3JpcHRvcl8pLAorICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSwgInsiLCAiIiwgIn0iLCAiIiwgInZlciIsCisgICAgICAgIEdlbmVyYXRlZENvZGVWZXJzaW9uU3VmZml4KCkpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnRlcmZhY2UgJHskJGNsYXNzbmFtZSRPckJ1aWxkZXIkfSQgZXh0ZW5kc1xuIgorICAgICAgICAiICAgICRleHRyYV9pbnRlcmZhY2VzJFxuIgorICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9yQnVpbGRlciB7XG4iLAorICAgICAgICAiZGVwcmVjYXRpb24iLAorICAgICAgICBkZXNjcmlwdG9yXy0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKSA/ICJAamF2YS5sYW5nLkRlcHJlY2F0ZWQgIiA6ICIiLAorICAgICAgICAiZXh0cmFfaW50ZXJmYWNlcyIsIEV4dHJhTWVzc2FnZU9yQnVpbGRlckludGVyZmFjZXMoZGVzY3JpcHRvcl8pLAorICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSwgInsiLCAiIiwgIn0iLCAiIik7CisgIH0KKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKKyAgICAgICAgLkdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhwcmludGVyKTsKKyAgfQorICBmb3IgKGF1dG8gb25lb2YgOiBvbmVvZnNfKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyAkY2xhc3NuYW1lJC4kb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlICIKKyAgICAgICAgImdldCRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2UoKTtcbiIsCisgICAgICAgICJvbmVvZl9jYXBpdGFsaXplZF9uYW1lIiwKKyAgICAgICAgY29udGV4dF8tPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhvbmVvZiktPmNhcGl0YWxpemVkX25hbWUsICJjbGFzc25hbWUiLAorICAgICAgICBjb250ZXh0Xy0+R2V0TmFtZVJlc29sdmVyKCktPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOworICB9CisgIHByaW50ZXItPk91dGRlbnQoKTsKKworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBib29sIGlzX293bl9maWxlID0gSXNPd25GaWxlKGRlc2NyaXB0b3JfLCAvKiBpbW11dGFibGUgPSAqLyB0cnVlKTsKKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcmlhYmxlczsKKyAgdmFyaWFibGVzWyJzdGF0aWMiXSA9IGlzX293bl9maWxlID8gIiIgOiAic3RhdGljICI7CisgIHZhcmlhYmxlc1siY2xhc3NuYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOworICB2YXJpYWJsZXNbImV4dHJhX2ludGVyZmFjZXMiXSA9IEV4dHJhTWVzc2FnZUludGVyZmFjZXMoZGVzY3JpcHRvcl8pOworICB2YXJpYWJsZXNbInZlciJdID0gR2VuZXJhdGVkQ29kZVZlcnNpb25TdWZmaXgoKTsKKyAgdmFyaWFibGVzWyJkZXByZWNhdGlvbiJdID0KKyAgICAgIGRlc2NyaXB0b3JfLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpID8gIkBqYXZhLmxhbmcuRGVwcmVjYXRlZCAiIDogIiI7CisKKyAgV3JpdGVNZXNzYWdlRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIE1heWJlUHJpbnRHZW5lcmF0ZWRBbm5vdGF0aW9uKGNvbnRleHRfLCBwcmludGVyLCBkZXNjcmlwdG9yXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tdXRhYmxlID0gKi8gdHJ1ZSk7CisgIC8vIFRoZSBidWlsZGVyX3R5cGUgc3RvcmVzIHRoZSBzdXBlciB0eXBlIG5hbWUgb2YgdGhlIG5lc3RlZCBCdWlsZGVyIGNsYXNzLgorICBzdGQ6OnN0cmluZyBidWlsZGVyX3R5cGU7CisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlcywKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHN0YXRpYyRmaW5hbCBjbGFzcyAkY2xhc3NuYW1lJCBleHRlbmRzXG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXMsCisgICAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlJHZlciQuRXh0ZW5kYWJsZU1lc3NhZ2U8XG4iCisgICAgICAgICIgICAgICAkY2xhc3NuYW1lJD4gaW1wbGVtZW50c1xuIgorICAgICAgICAiICAgICRleHRyYV9pbnRlcmZhY2VzJFxuIgorICAgICAgICAiICAgICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIpOworICAgIGJ1aWxkZXJfdHlwZSA9IHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UkMS5FeHRlbmRhYmxlQnVpbGRlcjwkMCwgPz4iLAorICAgICAgICBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSwKKyAgICAgICAgR2VuZXJhdGVkQ29kZVZlcnNpb25TdWZmaXgoKSk7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlcywKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHN0YXRpYyRmaW5hbCBjbGFzcyAkY2xhc3NuYW1lJCBleHRlbmRzXG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZSR2ZXIkIGltcGxlbWVudHNcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICRleHRyYV9pbnRlcmZhY2VzJFxuIgorICAgICAgICAgICAgICAgICAgICIgICAgJGNsYXNzbmFtZSRPckJ1aWxkZXIge1xuIik7CisgICAgYnVpbGRlcl90eXBlID0KKyAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlJDAuQnVpbGRlcjw/PiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVkQ29kZVZlcnNpb25TdWZmaXgoKSk7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoInByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDBMO1xuIik7CisKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIC8vIFVzaW5nIGJ1aWxkZXJfdHlwZSwgaW5zdGVhZCBvZiBCdWlsZGVyLCBwcmV2ZW50cyB0aGUgQnVpbGRlciBjbGFzcyBmcm9tCisgIC8vIGJlaW5nIGxvYWRlZCBpbnRvIFBlcm1HZW4gc3BhY2Ugd2hlbiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpcyBjcmVhdGVkLgorICAvLyBUaGlzIG9wdGltaXplcyB0aGUgUGVybUdlbiBzcGFjZSB1c2FnZSBmb3IgY2xpZW50cyB0aGF0IGRvIG5vdCBtb2RpZnkKKyAgLy8gbWVzc2FnZXMuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIi8vIFVzZSAkY2xhc3NuYW1lJC5uZXdCdWlsZGVyKCkgdG8gY29uc3RydWN0LlxuIgorICAgICAgInByaXZhdGUgJGNsYXNzbmFtZSQoJGJ1aWxkZXJ0eXBlJCBidWlsZGVyKSB7XG4iCisgICAgICAiICBzdXBlcihidWlsZGVyKTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCksICJidWlsZGVydHlwZSIsIGJ1aWxkZXJfdHlwZSk7CisgIHByaW50ZXItPlByaW50KCJwcml2YXRlICRjbGFzc25hbWUkKCkge1xuIiwgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgR2VuZXJhdGVJbml0aWFsaXplcnMocHJpbnRlcik7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAifVxuIgorICAgICAgIlxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiQFN1cHByZXNzV2FybmluZ3Moe1widW51c2VkXCJ9KVxuIgorICAgICAgICAgICAgICAgICAicHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgbmV3SW5zdGFuY2UoXG4iCisgICAgICAgICAgICAgICAgICIgICAgVW51c2VkUHJpdmF0ZVBhcmFtZXRlciB1bnVzZWQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIG5ldyAkY2xhc3NuYW1lJCgpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKKworICAvLyBUT0RPKGIvMjQ4MTQ5MTE4KTogUmVtb3ZlIHRoaXMgc3VwZXJmbHVvdXMgb3ZlcnJpZGUuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICJwdWJsaWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbmtub3duRmllbGRTZXRcbiIKKyAgICAgICJnZXRVbmtub3duRmllbGRzKCkge1xuIgorICAgICAgIiAgcmV0dXJuIHRoaXMudW5rbm93bkZpZWxkcztcbiIKKyAgICAgICJ9XG4iKTsKKworICBHZW5lcmF0ZURlc2NyaXB0b3JNZXRob2RzKHByaW50ZXIpOworCisgIC8vIE5lc3RlZCB0eXBlcworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgRW51bUdlbmVyYXRvcihkZXNjcmlwdG9yXy0+ZW51bV90eXBlKGkpLCB0cnVlLCBjb250ZXh0XykuR2VuZXJhdGUocHJpbnRlcik7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAvLyBEb24ndCBnZW5lcmF0ZSBKYXZhIGNsYXNzZXMgZm9yIG1hcCBlbnRyeSBtZXNzYWdlcy4KKyAgICBpZiAoSXNNYXBFbnRyeShkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSkpKSBjb250aW51ZTsKKyAgICBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VHZW5lcmF0b3IoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Xyk7CisgICAgbWVzc2FnZUdlbmVyYXRvci5HZW5lcmF0ZUludGVyZmFjZShwcmludGVyKTsKKyAgICBtZXNzYWdlR2VuZXJhdG9yLkdlbmVyYXRlKHByaW50ZXIpOworICB9CisKKyAgLy8gSW50ZWdlcnMgZm9yIGJpdCBmaWVsZHMuCisgIGludCB0b3RhbEJpdHMgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICB0b3RhbEJpdHMgKz0KKyAgICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkuR2V0TnVtQml0c0Zvck1lc3NhZ2UoKTsKKyAgfQorICBpbnQgdG90YWxJbnRzID0gKHRvdGFsQml0cyArIDMxKSAvIDMyOworICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsSW50czsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoInByaXZhdGUgaW50ICRiaXRfZmllbGRfbmFtZSQ7XG4iLCAiYml0X2ZpZWxkX25hbWUiLAorICAgICAgICAgICAgICAgICAgIEdldEJpdEZpZWxkTmFtZShpKSk7CisgIH0KKworICAvLyBvbmVvZgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnM7CisgIGZvciAoYXV0byBvbmVvZiA6IG9uZW9mc18pIHsKKyAgICB2YXJzWyJvbmVvZl9uYW1lIl0gPSBjb250ZXh0Xy0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKG9uZW9mKS0+bmFtZTsKKyAgICB2YXJzWyJvbmVvZl9jYXBpdGFsaXplZF9uYW1lIl0gPQorICAgICAgICBjb250ZXh0Xy0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKG9uZW9mKS0+Y2FwaXRhbGl6ZWRfbmFtZTsKKyAgICB2YXJzWyJvbmVvZl9pbmRleCJdID0gU3RyQ2F0KChvbmVvZiktPmluZGV4KCkpOworICAgIC8vIG9uZW9mQ2FzZV8gYW5kIG9uZW9mXworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICAgICAgICAgICAgInByaXZhdGUgaW50ICRvbmVvZl9uYW1lJENhc2VfID0gMDtcbiIKKyAgICAgICAgICAgICAgICAgICAicHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0ICRvbmVvZl9uYW1lJF87XG4iKTsKKyAgICAvLyBPbmVvZkNhc2UgZW51bQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJzLAorICAgICAgICAicHVibGljIGVudW0gJG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZVxuIgorICAgICAgICAvLyBUT0RPKGR3ZWlzKTogUmVtb3ZlIEVudW1MaXRlIHdoZW4gd2Ugd2FudCB0byBicmVhayBjb21wYXRpYmlsaXR5IHdpdGgKKyAgICAgICAgLy8gMy54IHVzZXJzCisgICAgICAgICIgICAgaW1wbGVtZW50cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkVudW1MaXRlLFxuIgorICAgICAgICAiICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkFic3RyYWN0TWVzc2FnZS5JbnRlcm5hbE9uZU9mRW51bSB7XG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IChvbmVvZiktPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IChvbmVvZiktPmZpZWxkKGopOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIiRkZXByZWNhdGlvbiQkZmllbGRfbmFtZSQoJGZpZWxkX251bWJlciQpLFxuIiwgImRlcHJlY2F0aW9uIiwKKyAgICAgICAgICBmaWVsZC0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKSA/ICJAamF2YS5sYW5nLkRlcHJlY2F0ZWQgIiA6ICIiLAorICAgICAgICAgICJmaWVsZF9uYW1lIiwgVG9VcHBlcihmaWVsZC0+bmFtZSgpKSwgImZpZWxkX251bWJlciIsCisgICAgICAgICAgU3RyQ2F0KGZpZWxkLT5udW1iZXIoKSkpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgiJGNhcF9vbmVvZl9uYW1lJF9OT1RfU0VUKDApO1xuIiwgImNhcF9vbmVvZl9uYW1lIiwKKyAgICAgICAgICAgICAgICAgICBUb1VwcGVyKHZhcnNbIm9uZW9mX25hbWUiXSkpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICAgICAgICAgICAgInByaXZhdGUgZmluYWwgaW50IHZhbHVlO1xuIgorICAgICAgICAgICAgICAgICAgICJwcml2YXRlICRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2UoaW50IHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFycywKKyAgICAgICAgIi8qKlxuIgorICAgICAgICAiICogQHBhcmFtIHZhbHVlIFRoZSBudW1iZXIgb2YgdGhlIGVudW0gdG8gbG9vayBmb3IuXG4iCisgICAgICAgICIgKiBAcmV0dXJuIFRoZSBlbnVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLlxuIgorICAgICAgICAiICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZm9yTnVtYmVyKGludCl9IGluc3RlYWQuXG4iCisgICAgICAgICIgKi9cbiIKKyAgICAgICAgIkBqYXZhLmxhbmcuRGVwcmVjYXRlZFxuIgorICAgICAgICAicHVibGljIHN0YXRpYyAkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlIHZhbHVlT2YoaW50IHZhbHVlKSB7XG4iCisgICAgICAgICIgIHJldHVybiBmb3JOdW1iZXIodmFsdWUpO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljICRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2UgZm9yTnVtYmVyKGludCB2YWx1ZSkge1xuIgorICAgICAgICAiICBzd2l0Y2ggKHZhbHVlKSB7XG4iKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IChvbmVvZiktPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IChvbmVvZiktPmZpZWxkKGopOworICAgICAgcHJpbnRlci0+UHJpbnQoIiAgICBjYXNlICRmaWVsZF9udW1iZXIkOiByZXR1cm4gJGZpZWxkX25hbWUkO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICJmaWVsZF9udW1iZXIiLCBTdHJDYXQoZmllbGQtPm51bWJlcigpKSwKKyAgICAgICAgICAgICAgICAgICAgICJmaWVsZF9uYW1lIiwgVG9VcHBlcihmaWVsZC0+bmFtZSgpKSk7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICAgIGNhc2UgMDogcmV0dXJuICRjYXBfb25lb2ZfbmFtZSRfTk9UX1NFVDtcbiIKKyAgICAgICAgIiAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDtcbiIKKyAgICAgICAgIiAgfVxuIgorICAgICAgICAifVxuIgorICAgICAgICAicHVibGljIGludCBnZXROdW1iZXIoKSB7XG4iCisgICAgICAgICIgIHJldHVybiB0aGlzLnZhbHVlO1xuIgorICAgICAgICAifVxuIiwKKyAgICAgICAgImNhcF9vbmVvZl9uYW1lIiwgVG9VcHBlcih2YXJzWyJvbmVvZl9uYW1lIl0pKTsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoIn07XG5cbiIpOworICAgIC8vIG9uZW9mQ2FzZSgpCisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgICAgICAgICAgICAicHVibGljICRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2VcbiIKKyAgICAgICAgICAgICAgICAgICAiZ2V0JG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gJG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZS5mb3JOdW1iZXIoXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICRvbmVvZl9uYW1lJENhc2VfKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgICAgICAgICJcbiIpOworICB9CisKKyAgaWYgKElzQW55TWVzc2FnZShkZXNjcmlwdG9yXykpIHsKKyAgICBHZW5lcmF0ZUFueU1ldGhvZHMocHJpbnRlcik7CisgIH0KKworICAvLyBGaWVsZHMKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoInB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICRjb25zdGFudF9uYW1lJCA9ICRudW1iZXIkO1xuIiwKKyAgICAgICAgICAgICAgICAgICAiY29uc3RhbnRfbmFtZSIsIEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3JfLT5maWVsZChpKSksCisgICAgICAgICAgICAgICAgICAgIm51bWJlciIsIFN0ckNhdChkZXNjcmlwdG9yXy0+ZmllbGQoaSktPm51bWJlcigpKSk7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoImNvbnN0YW50X25hbWUiLCBkZXNjcmlwdG9yXy0+ZmllbGQoaSkpOworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpLkdlbmVyYXRlTWVtYmVycyhwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorCisgIGlmIChjb250ZXh0Xy0+SGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICBHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQocHJpbnRlcik7CisgICAgR2VuZXJhdGVNZXNzYWdlU2VyaWFsaXphdGlvbk1ldGhvZHMocHJpbnRlcik7CisgICAgR2VuZXJhdGVFcXVhbHNBbmRIYXNoQ29kZShwcmludGVyKTsKKyAgfQorCisKKyAgR2VuZXJhdGVQYXJzZUZyb21NZXRob2RzKHByaW50ZXIpOworICBHZW5lcmF0ZUJ1aWxkZXIocHJpbnRlcik7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiXG4iCisgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOiRmdWxsX25hbWUkKVxuIiwKKyAgICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOworCisgIC8vIENhcmVmdWxseSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IGluc3RhbmNlIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBkb2Vzbid0CisgIC8vIGNvbmZsaWN0IHdpdGggb3RoZXIgaW5pdGlhbGl6YXRpb24uCisgIHByaW50ZXItPlByaW50KCJwcml2YXRlIHN0YXRpYyBmaW5hbCAkY2xhc3NuYW1lJCBERUZBVUxUX0lOU1RBTkNFO1xuIiwKKyAgICAgICAgICAgICAgICAgImNsYXNzbmFtZSIsCisgICAgICAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAic3RhdGljIHtcbiIKKyAgICAgICIgIERFRkFVTFRfSU5TVEFOQ0UgPSBuZXcgJGNsYXNzbmFtZSQoKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIGdldERlZmF1bHRJbnN0YW5jZSgpIHtcbiIKKyAgICAgICIgIHJldHVybiBERUZBVUxUX0lOU1RBTkNFO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOworCisgIC8vICdvZicgbWV0aG9kIGZvciBXcmFwcGVycworICBpZiAoSXNXcmFwcGVyc1Byb3RvRmlsZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBvZigkZmllbGRfdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuIG5ld0J1aWxkZXIoKS5zZXRWYWx1ZSh2YWx1ZSkuYnVpbGQoKTtcbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgIlxuIiwKKyAgICAgICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pLAorICAgICAgICAiZmllbGRfdHlwZSIsIFByaW1pdGl2ZVR5cGVOYW1lKEdldEphdmFUeXBlKGRlc2NyaXB0b3JfLT5maWVsZCgwKSkpKTsKKyAgfQorCisgIEdlbmVyYXRlUGFyc2VyKHByaW50ZXIpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICJwdWJsaWMgJGNsYXNzbmFtZSQgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHtcbiIKKyAgICAgICIgIHJldHVybiBERUZBVUxUX0lOU1RBTkNFO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOworCisgIC8vIEV4dGVuc2lvbnMgbXVzdCBiZSBkZWNsYXJlZCBhZnRlciB0aGUgREVGQVVMVF9JTlNUQU5DRSBpcyBpbml0aWFsaXplZAorICAvLyBiZWNhdXNlIHRoZSBERUZBVUxUX0lOU1RBTkNFIGlzIHVzZWQgYnkgdGhlIGV4dGVuc2lvbiB0byBsYXppbHkgcmV0cmlldmUKKyAgLy8gdGhlIG91dGVyIGNsYXNzJ3MgRmlsZURlc2NyaXB0b3IuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBJbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3IoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbihpKSwgY29udGV4dF8pCisgICAgICAgIC5HZW5lcmF0ZShwcmludGVyKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZU1lc3NhZ2VTZXJpYWxpemF0aW9uTWV0aG9kcygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgRmllbGREZXNjcmlwdG9yKltdPiBzb3J0ZWRfZmllbGRzKAorICAgICAgU29ydEZpZWxkc0J5TnVtYmVyKGRlc2NyaXB0b3JfKSk7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqPiBzb3J0ZWRfZXh0ZW5zaW9uczsKKyAgc29ydGVkX2V4dGVuc2lvbnMucmVzZXJ2ZShkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKTsgKytpKSB7CisgICAgc29ydGVkX2V4dGVuc2lvbnMucHVzaF9iYWNrKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2UoaSkpOworICB9CisgIHN0ZDo6c29ydChzb3J0ZWRfZXh0ZW5zaW9ucy5iZWdpbigpLCBzb3J0ZWRfZXh0ZW5zaW9ucy5lbmQoKSwKKyAgICAgICAgICAgIEV4dGVuc2lvblJhbmdlT3JkZXJpbmcoKSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICJwdWJsaWMgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KVxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGlmIChIYXNQYWNrZWRGaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgLy8gd3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIG1pZ2h0IGJlIGludm9rZWQgd2l0aG91dAorICAgIC8vIGdldFNlcmlhbGl6ZWRTaXplKCkgZXZlciBiZWluZyBjYWxsZWQsIGJ1dCB3ZSBuZWVkIHRoZSBtZW1vaXplZAorICAgIC8vIHNpemVzIGluIGNhc2UgdGhpcyBtZXNzYWdlIGhhcyBwYWNrZWQgZmllbGRzLiBSYXRoZXIgdGhhbiBlbWl0IGNoZWNrcworICAgIC8vIGZvciBlYWNoIHBhY2tlZCBmaWVsZCwganVzdCBjYWxsIGdldFNlcmlhbGl6ZWRTaXplKCkgdXAgZnJvbnQuIEluIG1vc3QKKyAgICAvLyBjYXNlcywgZ2V0U2VyaWFsaXplZFNpemUoKSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhbnl3YXkgYnkgb25lCisgICAgLy8gb2YgdGhlIHdyYXBwZXIgd3JpdGVUbygpIG1ldGhvZHMsIG1ha2luZyB0aGlzIGNhbGwgY2hlYXAuCisgICAgcHJpbnRlci0+UHJpbnQoImdldFNlcmlhbGl6ZWRTaXplKCk7XG4iKTsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZSR2ZXIkXG4iCisgICAgICAgICAgIiAgLkV4dGVuZGFibGVNZXNzYWdlPCRjbGFzc25hbWUkPi5FeHRlbnNpb25Xcml0ZXJcbiIKKyAgICAgICAgICAiICAgIGV4dGVuc2lvbldyaXRlciA9IG5ld01lc3NhZ2VTZXRFeHRlbnNpb25Xcml0ZXIoKTtcbiIsCisgICAgICAgICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pLAorICAgICAgICAgICJ2ZXIiLCBHZW5lcmF0ZWRDb2RlVmVyc2lvblN1ZmZpeCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZSR2ZXIkXG4iCisgICAgICAgICAgIiAgLkV4dGVuZGFibGVNZXNzYWdlPCRjbGFzc25hbWUkPi5FeHRlbnNpb25Xcml0ZXJcbiIKKyAgICAgICAgICAiICAgIGV4dGVuc2lvbldyaXRlciA9IG5ld0V4dGVuc2lvbldyaXRlcigpO1xuIiwKKyAgICAgICAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXyksCisgICAgICAgICAgInZlciIsIEdlbmVyYXRlZENvZGVWZXJzaW9uU3VmZml4KCkpOworICAgIH0KKyAgfQorCisgIC8vIE1lcmdlIHRoZSBmaWVsZHMgYW5kIHRoZSBleHRlbnNpb24gcmFuZ2VzLCBib3RoIHNvcnRlZCBieSBmaWVsZCBudW1iZXIuCisgIGZvciAoaW50IGkgPSAwLCBqID0gMDsKKyAgICAgICBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkgfHwgaiA8IHNvcnRlZF9leHRlbnNpb25zLnNpemUoKTspIHsKKyAgICBpZiAoaSA9PSBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSkgeworICAgICAgR2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZShwcmludGVyLCBzb3J0ZWRfZXh0ZW5zaW9uc1tqKytdKTsKKyAgICB9IGVsc2UgaWYgKGogPT0gc29ydGVkX2V4dGVuc2lvbnMuc2l6ZSgpKSB7CisgICAgICBHZW5lcmF0ZVNlcmlhbGl6ZU9uZUZpZWxkKHByaW50ZXIsIHNvcnRlZF9maWVsZHNbaSsrXSk7CisgICAgfSBlbHNlIGlmIChzb3J0ZWRfZmllbGRzW2ldLT5udW1iZXIoKSA8IHNvcnRlZF9leHRlbnNpb25zW2pdLT5zdGFydCkgeworICAgICAgR2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZChwcmludGVyLCBzb3J0ZWRfZmllbGRzW2krK10pOworICAgIH0gZWxzZSB7CisgICAgICBHZW5lcmF0ZVNlcmlhbGl6ZU9uZUV4dGVuc2lvblJhbmdlKHByaW50ZXIsIHNvcnRlZF9leHRlbnNpb25zW2orK10pOworICAgIH0KKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICBwcmludGVyLT5QcmludCgiZ2V0VW5rbm93bkZpZWxkcygpLndyaXRlQXNNZXNzYWdlU2V0VG8ob3V0cHV0KTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KCJnZXRVbmtub3duRmllbGRzKCkud3JpdGVUbyhvdXRwdXQpO1xuIik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIn1cbiIKKyAgICAgICJcbiIKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAicHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHtcbiIKKyAgICAgICIgIGludCBzaXplID0gbWVtb2l6ZWRTaXplO1xuIgorICAgICAgIiAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplO1xuIgorICAgICAgIlxuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIHByaW50ZXItPlByaW50KCJzaXplID0gMDtcbiIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChzb3J0ZWRfZmllbGRzW2ldKS5HZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShwcmludGVyKTsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoInNpemUgKz0gZXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplQXNNZXNzYWdlU2V0KCk7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoInNpemUgKz0gZXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplKCk7XG4iKTsKKyAgICB9CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJzaXplICs9IGdldFVua25vd25GaWVsZHMoKS5nZXRTZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldCgpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoInNpemUgKz0gZ2V0VW5rbm93bkZpZWxkcygpLmdldFNlcmlhbGl6ZWRTaXplKCk7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICAgIm1lbW9pemVkU2l6ZSA9IHNpemU7XG4iCisgICAgICAicmV0dXJuIHNpemU7XG4iKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIn1cbiIKKyAgICAgICJcbiIpOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlUGFyc2VGcm9tTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBOb3RlOiAgVGhlc2UgYXJlIHNlcGFyYXRlIGZyb20gR2VuZXJhdGVNZXNzYWdlU2VyaWFsaXphdGlvbk1ldGhvZHMoKQorICAvLyAgIGJlY2F1c2UgdGhleSBuZWVkIHRvIGJlIGdlbmVyYXRlZCBldmVuIGZvciBtZXNzYWdlcyB0aGF0IGFyZSBvcHRpbWl6ZWQKKyAgLy8gICBmb3IgY29kZSBzaXplLgorICBwcmludGVyLT5QcmludCgKKyAgICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRnJvbShcbiIKKyAgICAgICIgICAgamF2YS5uaW8uQnl0ZUJ1ZmZlciBkYXRhKVxuIgorICAgICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIgorICAgICAgIiAgcmV0dXJuIFBBUlNFUi5wYXJzZUZyb20oZGF0YSk7XG4iCisgICAgICAifVxuIgorICAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKFxuIgorICAgICAgIiAgICBqYXZhLm5pby5CeXRlQnVmZmVyIGRhdGEsXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgorICAgICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIgorICAgICAgIiAgcmV0dXJuIFBBUlNFUi5wYXJzZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRnJvbShcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGRhdGEpXG4iCisgICAgICAiICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7XG4iCisgICAgICAiICByZXR1cm4gUEFSU0VSLnBhcnNlRnJvbShkYXRhKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBkYXRhLFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKKyAgICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKKyAgICAgICIgIHJldHVybiBQQVJTRVIucGFyc2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oYnl0ZVtdIGRhdGEpXG4iCisgICAgICAiICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7XG4iCisgICAgICAiICByZXR1cm4gUEFSU0VSLnBhcnNlRnJvbShkYXRhKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCisgICAgICAiICAgIGJ5dGVbXSBkYXRhLFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKKyAgICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKKyAgICAgICIgIHJldHVybiBQQVJTRVIucGFyc2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dClcbiIKKyAgICAgICIgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIgorICAgICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZSR2ZXIkXG4iCisgICAgICAiICAgICAgLnBhcnNlV2l0aElPRXhjZXB0aW9uKFBBUlNFUiwgaW5wdXQpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRnJvbShcbiIKKyAgICAgICIgICAgamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dCxcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCisgICAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKKyAgICAgICIgIHJldHVybiBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UkdmVyJFxuIgorICAgICAgIiAgICAgIC5wYXJzZVdpdGhJT0V4Y2VwdGlvbihQQVJTRVIsIGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7XG4iCisgICAgICAifVxuIgorICAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VEZWxpbWl0ZWRGcm9tKGphdmEuaW8uSW5wdXRTdHJlYW0gIgorICAgICAgImlucHV0KVxuIgorICAgICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iCisgICAgICAiICByZXR1cm4gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlJHZlciRcbiIKKyAgICAgICIgICAgICAucGFyc2VEZWxpbWl0ZWRXaXRoSU9FeGNlcHRpb24oUEFSU0VSLCBpbnB1dCk7XG4iCisgICAgICAifVxuIgorICAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VEZWxpbWl0ZWRGcm9tKFxuIgorICAgICAgIiAgICBqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0LFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKKyAgICAgICIgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIgorICAgICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZSR2ZXIkXG4iCisgICAgICAiICAgICAgLnBhcnNlRGVsaW1pdGVkV2l0aElPRXhjZXB0aW9uKFBBUlNFUiwgaW5wdXQsICIKKyAgICAgICJleHRlbnNpb25SZWdpc3RyeSk7XG4iCisgICAgICAifVxuIgorICAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpXG4iCisgICAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKKyAgICAgICIgIHJldHVybiBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UkdmVyJFxuIgorICAgICAgIiAgICAgIC5wYXJzZVdpdGhJT0V4Y2VwdGlvbihQQVJTRVIsIGlucHV0KTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCxcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCisgICAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKKyAgICAgICIgIHJldHVybiBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UkdmVyJFxuIgorICAgICAgIiAgICAgIC5wYXJzZVdpdGhJT0V4Y2VwdGlvbihQQVJTRVIsIGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSwgInZlciIsCisgICAgICBHZW5lcmF0ZWRDb2RlVmVyc2lvblN1ZmZpeCgpKTsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZU9uZUZpZWxkKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShwcmludGVyKTsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZU9uZUV4dGVuc2lvblJhbmdlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UpIHsKKyAgcHJpbnRlci0+UHJpbnQoImV4dGVuc2lvbldyaXRlci53cml0ZVVudGlsKCRlbmQkLCBvdXRwdXQpO1xuIiwgImVuZCIsCisgICAgICAgICAgICAgICAgIFN0ckNhdChyYW5nZS0+ZW5kKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gTElURV9SVU5USU1FIGltcGxlbWVudHMgdGhpcyBhdCB0aGUgR2VuZXJhdGVkTWVzc2FnZUxpdGUgbGV2ZWwuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICJwdWJsaWMgQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ld0J1aWxkZXIoKTsgfVxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoKSB7XG4iCisgICAgICAiICByZXR1cm4gREVGQVVMVF9JTlNUQU5DRS50b0J1aWxkZXIoKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoJGNsYXNzbmFtZSQgcHJvdG90eXBlKSB7XG4iCisgICAgICAiICByZXR1cm4gREVGQVVMVF9JTlNUQU5DRS50b0J1aWxkZXIoKS5tZXJnZUZyb20ocHJvdG90eXBlKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgInB1YmxpYyBCdWlsZGVyIHRvQnVpbGRlcigpIHtcbiIKKyAgICAgICIgIHJldHVybiB0aGlzID09IERFRkFVTFRfSU5TVEFOQ0VcbiIKKyAgICAgICIgICAgICA/IG5ldyBCdWlsZGVyKCkgOiBuZXcgQnVpbGRlcigpLm1lcmdlRnJvbSh0aGlzKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAicHJvdGVjdGVkIEJ1aWxkZXIgbmV3QnVpbGRlckZvclR5cGUoXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZSR2ZXIkLkJ1aWxkZXJQYXJlbnQgcGFyZW50KSB7XG4iCisgICAgICAiICBCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcihwYXJlbnQpO1xuIgorICAgICAgIiAgcmV0dXJuIGJ1aWxkZXI7XG4iCisgICAgICAifVxuIiwKKyAgICAgICJ2ZXIiLCBHZW5lcmF0ZWRDb2RlVmVyc2lvblN1ZmZpeCgpKTsKKworICBNZXNzYWdlQnVpbGRlckdlbmVyYXRvciBidWlsZGVyR2VuZXJhdG9yKGRlc2NyaXB0b3JfLCBjb250ZXh0Xyk7CisgIGJ1aWxkZXJHZW5lcmF0b3IuR2VuZXJhdGUocHJpbnRlcik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVEZXNjcmlwdG9yTWV0aG9kcygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoIWRlc2NyaXB0b3JfLT5vcHRpb25zKCkubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvclxuIgorICAgICAgICAiICAgIGdldERlc2NyaXB0b3IoKSB7XG4iCisgICAgICAgICIgIHJldHVybiAkZmlsZWNsYXNzJC5pbnRlcm5hbF8kaWRlbnRpZmllciRfZGVzY3JpcHRvcjtcbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgIlxuIiwKKyAgICAgICAgImZpbGVjbGFzcyIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKSksCisgICAgICAgICJpZGVudGlmaWVyIiwgVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihkZXNjcmlwdG9yXykpOworICB9CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IG1hcF9maWVsZHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgaWYgKEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9NRVNTQUdFICYmCisgICAgICAgIElzTWFwRW50cnkoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSkgeworICAgICAgbWFwX2ZpZWxkcy5wdXNoX2JhY2soZmllbGQpOworICAgIH0KKyAgfQorICBpZiAoIW1hcF9maWVsZHMuZW1wdHkoKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiQFN1cHByZXNzV2FybmluZ3Moe1wicmF3dHlwZXNcIn0pXG4iCisgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICJwcm90ZWN0ZWQgY29tLmdvb2dsZS5wcm90b2J1Zi5NYXBGaWVsZCBpbnRlcm5hbEdldE1hcEZpZWxkKFxuIgorICAgICAgICAiICAgIGludCBudW1iZXIpIHtcbiIKKyAgICAgICAgIiAgc3dpdGNoIChudW1iZXIpIHtcbiIpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwX2ZpZWxkcy5zaXplKCk7ICsraSkgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG1hcF9maWVsZHNbaV07CisgICAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8gPSBjb250ZXh0Xy0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGZpZWxkKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJjYXNlICRudW1iZXIkOlxuIgorICAgICAgICAgICIgIHJldHVybiBpbnRlcm5hbEdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIiwKKyAgICAgICAgICAibnVtYmVyIiwgU3RyQ2F0KGZpZWxkLT5udW1iZXIoKSksICJjYXBpdGFsaXplZF9uYW1lIiwKKyAgICAgICAgICBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJkZWZhdWx0OlxuIgorICAgICAgICAiICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcbiIKKyAgICAgICAgIiAgICAgIFwiSW52YWxpZCBtYXAgZmllbGQgbnVtYmVyOiBcIiArIG51bWJlcik7XG4iKTsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICB9XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAicHJvdGVjdGVkIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZSR2ZXIkLkZpZWxkQWNjZXNzb3JUYWJsZVxuIgorICAgICAgIiAgICBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkZmlsZWNsYXNzJC5pbnRlcm5hbF8kaWRlbnRpZmllciRfZmllbGRBY2Nlc3NvclRhYmxlXG4iCisgICAgICAiICAgICAgLmVuc3VyZUZpZWxkQWNjZXNzb3JzSW5pdGlhbGl6ZWQoXG4iCisgICAgICAiICAgICAgICAgICRjbGFzc25hbWUkLmNsYXNzLCAkY2xhc3NuYW1lJC5CdWlsZGVyLmNsYXNzKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pLAorICAgICAgImZpbGVjbGFzcyIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKSksCisgICAgICAiaWRlbnRpZmllciIsIFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoZGVzY3JpcHRvcl8pLCAidmVyIiwKKyAgICAgIEdlbmVyYXRlZENvZGVWZXJzaW9uU3VmZml4KCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVJc0luaXRpYWxpemVkKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIE1lbW9pemVzIHdoZXRoZXIgdGhlIHByb3RvY29sIGJ1ZmZlciBpcyBmdWxseSBpbml0aWFsaXplZCAoaGFzIGFsbAorICAvLyByZXF1aXJlZCBmaWVsZHMpLiAtMSBtZWFucyBub3QgeWV0IGNvbXB1dGVkLiAwIG1lYW5zIGZhbHNlIGFuZCAxIG1lYW5zCisgIC8vIHRydWUuCisgIHByaW50ZXItPlByaW50KCJwcml2YXRlIGJ5dGUgbWVtb2l6ZWRJc0luaXRpYWxpemVkID0gLTE7XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgInB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgLy8gRG9uJ3QgZGlyZWN0bHkgY29tcGFyZSB0byAtMSB0byBhdm9pZCBhbiBBbmRyb2lkIHg4NiBKSVQgYnVnLgorICBwcmludGVyLT5QcmludCgKKyAgICAgICJieXRlIGlzSW5pdGlhbGl6ZWQgPSBtZW1vaXplZElzSW5pdGlhbGl6ZWQ7XG4iCisgICAgICAiaWYgKGlzSW5pdGlhbGl6ZWQgPT0gMSkgcmV0dXJuIHRydWU7XG4iCisgICAgICAiaWYgKGlzSW5pdGlhbGl6ZWQgPT0gMCkgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgIlxuIik7CisKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGluIHRoaXMgbWVzc2FnZSBhcmUgc2V0LgorICAvLyBUT0RPKGtlbnRvbik6ICBXZSBjYW4gb3B0aW1pemUgdGhpcyB3aGVuIHdlIHN3aXRjaCB0byBwdXR0aW5nIGFsbCB0aGUKKyAgLy8gICAiaGFzIiBmaWVsZHMgaW50byBhIHNpbmdsZSBiaXRmaWVsZC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8gPSBjb250ZXh0Xy0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGZpZWxkKTsKKworICAgIGlmIChmaWVsZC0+aXNfcmVxdWlyZWQoKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImlmICghaGFzJG5hbWUkKCkpIHtcbiIKKyAgICAgICAgICAiICBtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAwO1xuIgorICAgICAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAibmFtZSIsIGluZm8tPmNhcGl0YWxpemVkX25hbWUpOworICAgIH0KKyAgfQorCisgIC8vIE5vdyBjaGVjayB0aGF0IGFsbCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgY29uc3QgRmllbGRHZW5lcmF0b3JJbmZvKiBpbmZvID0gY29udGV4dF8tPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhmaWVsZCk7CisgICAgaWYgKEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9NRVNTQUdFICYmCisgICAgICAgIEhhc1JlcXVpcmVkRmllbGRzKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSkpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPmxhYmVsKCkpIHsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUVVJUkVEOgorICAgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICAgICAiaWYgKCFnZXQkbmFtZSQoKS5pc0luaXRpYWxpemVkKCkpIHtcbiIKKyAgICAgICAgICAgICAgIiAgbWVtb2l6ZWRJc0luaXRpYWxpemVkID0gMDtcbiIKKyAgICAgICAgICAgICAgIiAgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICAgInR5cGUiLAorICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSksCisgICAgICAgICAgICAgICJuYW1lIiwgaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTDoKKyAgICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAgICAgImlmIChoYXMkbmFtZSQoKSkge1xuIgorICAgICAgICAgICAgICAiICBpZiAoIWdldCRuYW1lJCgpLmlzSW5pdGlhbGl6ZWQoKSkge1xuIgorICAgICAgICAgICAgICAiICAgIG1lbW9pemVkSXNJbml0aWFsaXplZCA9IDA7XG4iCisgICAgICAgICAgICAgICIgICAgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgICAibmFtZSIsIGluZm8tPmNhcGl0YWxpemVkX25hbWUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQ6CisgICAgICAgICAgaWYgKElzTWFwRW50cnkoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSkgeworICAgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAgICAgImZvciAoJHR5cGUkIGl0ZW0gOiBnZXQkbmFtZSRNYXAoKS52YWx1ZXMoKSkge1xuIgorICAgICAgICAgICAgICAgICIgIGlmICghaXRlbS5pc0luaXRpYWxpemVkKCkpIHtcbiIKKyAgICAgICAgICAgICAgICAiICAgIG1lbW9pemVkSXNJbml0aWFsaXplZCA9IDA7XG4iCisgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gZmFsc2U7XG4iCisgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgICAgICJ0eXBlIiwKKyAgICAgICAgICAgICAgICBNYXBWYWx1ZUltbXV0YWJsZUNsYXNzZE5hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXyksCisgICAgICAgICAgICAgICAgIm5hbWUiLCBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgZ2V0JG5hbWUkQ291bnQoKTsgaSsrKSB7XG4iCisgICAgICAgICAgICAgICAgIiAgaWYgKCFnZXQkbmFtZSQoaSkuaXNJbml0aWFsaXplZCgpKSB7XG4iCisgICAgICAgICAgICAgICAgIiAgICBtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAwO1xuIgorICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICAgICAidHlwZSIsCisgICAgICAgICAgICAgICAgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCkpLAorICAgICAgICAgICAgICAgICJuYW1lIiwgaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpZiAoIWV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCgpKSB7XG4iCisgICAgICAgICIgIG1lbW9pemVkSXNJbml0aWFsaXplZCA9IDA7XG4iCisgICAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgIn1cbiIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworCisgIHByaW50ZXItPlByaW50KCIgIG1lbW9pemVkSXNJbml0aWFsaXplZCA9IDE7XG4iKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIHJldHVybiB0cnVlO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK25hbWVzcGFjZSB7Citib29sIENoZWNrSGFzQml0c0ZvckVxdWFsc0FuZEhhc2hDb2RlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChIYXNIYXNiaXQoZmllbGQpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9NRVNTQUdFICYmICFJc1JlYWxPbmVvZihmaWVsZCk7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUVxdWFsc0FuZEhhc2hDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIik7CisgIHByaW50ZXItPlByaW50KCJmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IG9iaikge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICJpZiAob2JqID09IHRoaXMpIHtcbiIKKyAgICAgICIgcmV0dXJuIHRydWU7XG4iCisgICAgICAifVxuIgorICAgICAgImlmICghKG9iaiBpbnN0YW5jZW9mICRjbGFzc25hbWUkKSkge1xuIgorICAgICAgIiAgcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopO1xuIgorICAgICAgIn1cbiIKKyAgICAgICIkY2xhc3NuYW1lJCBvdGhlciA9ICgkY2xhc3NuYW1lJCkgb2JqO1xuIgorICAgICAgIlxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBpZiAoIUlzUmVhbE9uZW9mKGZpZWxkKSkgeworICAgICAgY29uc3QgRmllbGRHZW5lcmF0b3JJbmZvKiBpbmZvID0gY29udGV4dF8tPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhmaWVsZCk7CisgICAgICBib29sIGNoZWNrX2hhc19iaXRzID0gQ2hlY2tIYXNCaXRzRm9yRXF1YWxzQW5kSGFzaENvZGUoZmllbGQpOworICAgICAgaWYgKGNoZWNrX2hhc19iaXRzKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICAgImlmIChoYXMkbmFtZSQoKSAhPSBvdGhlci5oYXMkbmFtZSQoKSkgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgICAgICAgImlmIChoYXMkbmFtZSQoKSkge1xuIiwKKyAgICAgICAgICAgICJuYW1lIiwgaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZSk7CisgICAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgfQorICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUVxdWFsc0NvZGUocHJpbnRlcik7CisgICAgICBpZiAoY2hlY2tfaGFzX2JpdHMpIHsKKyAgICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ29tcGFyZSBvbmVvZnMuCisgIGZvciAoYXV0byBvbmVvZiA6IG9uZW9mc18pIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImlmICghZ2V0JG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSgpLmVxdWFscygiCisgICAgICAgICJvdGhlci5nZXQkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlKCkpKSByZXR1cm4gZmFsc2U7XG4iLAorICAgICAgICAib25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSIsCisgICAgICAgIGNvbnRleHRfLT5HZXRPbmVvZkdlbmVyYXRvckluZm8ob25lb2YpLT5jYXBpdGFsaXplZF9uYW1lKTsKKyAgICBwcmludGVyLT5QcmludCgic3dpdGNoICgkb25lb2ZfbmFtZSRDYXNlXykge1xuIiwgIm9uZW9mX25hbWUiLAorICAgICAgICAgICAgICAgICAgIGNvbnRleHRfLT5HZXRPbmVvZkdlbmVyYXRvckluZm8ob25lb2YpLT5uYW1lKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IChvbmVvZiktPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IChvbmVvZiktPmZpZWxkKGopOworICAgICAgcHJpbnRlci0+UHJpbnQoImNhc2UgJGZpZWxkX251bWJlciQ6XG4iLCAiZmllbGRfbnVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgIFN0ckNhdChmaWVsZC0+bnVtYmVyKCkpKTsKKyAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUVxdWFsc0NvZGUocHJpbnRlcik7CisgICAgICBwcmludGVyLT5QcmludCgiYnJlYWs7XG4iKTsKKyAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJjYXNlIDA6XG4iCisgICAgICAgICJkZWZhdWx0OlxuIik7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgfQorCisgIC8vIEFsd2F5cyBjb25zaWRlciB1bmtub3duIGZpZWxkcyBmb3IgZXF1YWxpdHkuIFRoaXMgd2lsbCBzb21ldGltZXMgcmV0dXJuCisgIC8vIGZhbHNlIGZvciBub24tY2Fub25pY2FsIG9yZGVyaW5nIHdoZW4gcnVubmluZyBpbiBMSVRFX1JVTlRJTUUgYnV0IGl0J3MKKyAgLy8gdGhlIGJlc3Qgd2UgY2FuIGRvLgorICBwcmludGVyLT5QcmludCgKKyAgICAgICJpZiAoIWdldFVua25vd25GaWVsZHMoKS5lcXVhbHMob3RoZXIuZ2V0VW5rbm93bkZpZWxkcygpKSkgcmV0dXJuICIKKyAgICAgICJmYWxzZTtcbiIpOworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiaWYgKCFnZXRFeHRlbnNpb25GaWVsZHMoKS5lcXVhbHMob3RoZXIuZ2V0RXh0ZW5zaW9uRmllbGRzKCkpKVxuIgorICAgICAgICAiICByZXR1cm4gZmFsc2U7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgicmV0dXJuIHRydWU7XG4iKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAicHVibGljIGludCBoYXNoQ29kZSgpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoImlmIChtZW1vaXplZEhhc2hDb2RlICE9IDApIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoInJldHVybiBtZW1vaXplZEhhc2hDb2RlO1xuIik7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAifVxuIgorICAgICAgImludCBoYXNoID0gNDE7XG4iKTsKKworICAvLyBJZiB3ZSBvdXRwdXQgYSBnZXREZXNjcmlwdG9yKCkgbWV0aG9kLCB1c2UgdGhhdCBhcyBpdCBpcyBtb3JlIGVmZmljaWVudC4KKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoImhhc2ggPSAoMTkgKiBoYXNoKSArIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuaGFzaENvZGUoKTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KCJoYXNoID0gKDE5ICogaGFzaCkgKyBnZXREZXNjcmlwdG9yKCkuaGFzaENvZGUoKTtcbiIpOworICB9CisKKyAgLy8gaGFzaENvZGUgbm9uLW9uZW9mcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBpZiAoIUlzUmVhbE9uZW9mKGZpZWxkKSkgeworICAgICAgY29uc3QgRmllbGRHZW5lcmF0b3JJbmZvKiBpbmZvID0gY29udGV4dF8tPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhmaWVsZCk7CisgICAgICBib29sIGNoZWNrX2hhc19iaXRzID0gQ2hlY2tIYXNCaXRzRm9yRXF1YWxzQW5kSGFzaENvZGUoZmllbGQpOworICAgICAgaWYgKGNoZWNrX2hhc19iaXRzKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KCJpZiAoaGFzJG5hbWUkKCkpIHtcbiIsICJuYW1lIiwgaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZSk7CisgICAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgfQorICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUhhc2hDb2RlKHByaW50ZXIpOworICAgICAgaWYgKGNoZWNrX2hhc19iaXRzKSB7CisgICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGhhc2hDb2RlIG9uZW9mcy4KKyAgZm9yIChhdXRvIG9uZW9mIDogb25lb2ZzXykgeworICAgIHByaW50ZXItPlByaW50KCJzd2l0Y2ggKCRvbmVvZl9uYW1lJENhc2VfKSB7XG4iLCAib25lb2ZfbmFtZSIsCisgICAgICAgICAgICAgICAgICAgY29udGV4dF8tPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhvbmVvZiktPm5hbWUpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgKG9uZW9mKS0+ZmllbGRfY291bnQoKTsgaisrKSB7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gKG9uZW9mKS0+ZmllbGQoaik7CisgICAgICBwcmludGVyLT5QcmludCgiY2FzZSAkZmllbGRfbnVtYmVyJDpcbiIsICJmaWVsZF9udW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgU3RyQ2F0KGZpZWxkLT5udW1iZXIoKSkpOworICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlSGFzaENvZGUocHJpbnRlcik7CisgICAgICBwcmludGVyLT5QcmludCgiYnJlYWs7XG4iKTsKKyAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJjYXNlIDA6XG4iCisgICAgICAgICJkZWZhdWx0OlxuIik7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoImhhc2ggPSBoYXNoRmllbGRzKGhhc2gsIGdldEV4dGVuc2lvbkZpZWxkcygpKTtcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoImhhc2ggPSAoMjkgKiBoYXNoKSArIGdldFVua25vd25GaWVsZHMoKS5oYXNoQ29kZSgpO1xuIik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIm1lbW9pemVkSGFzaENvZGUgPSBoYXNoO1xuIgorICAgICAgInJldHVybiBoYXNoO1xuIik7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAifVxuIgorICAgICAgIlxuIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIEltbXV0YWJsZUV4dGVuc2lvbkdlbmVyYXRvcihkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uKGkpLCBjb250ZXh0XykKKyAgICAgICAgLkdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZShwcmludGVyKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3IoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpLCBjb250ZXh0XykKKyAgICAgICAgLkdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZShwcmludGVyKTsKKyAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit2b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlUGFyc2VyKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIiR2aXNpYmlsaXR5JCBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5QYXJzZXI8JGNsYXNzbmFtZSQ+XG4iCisgICAgICAiICAgIFBBUlNFUiA9IG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkFic3RyYWN0UGFyc2VyPCRjbGFzc25hbWUkPigpIHtcbiIKKyAgICAgICIgIEBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICIgIHB1YmxpYyAkY2xhc3NuYW1lJCBwYXJzZVBhcnRpYWxGcm9tKFxuIgorICAgICAgIiAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCxcbiIKKyAgICAgICIgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKKyAgICAgICIgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIgorICAgICAgIiAgICBCdWlsZGVyIGJ1aWxkZXIgPSBuZXdCdWlsZGVyKCk7XG4iCisgICAgICAiICAgIHRyeSB7XG4iCisgICAgICAiICAgICAgYnVpbGRlci5tZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIKKyAgICAgICIgICAgfSBjYXRjaCAoY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkge1xuIgorICAgICAgIiAgICAgIHRocm93IGUuc2V0VW5maW5pc2hlZE1lc3NhZ2UoYnVpbGRlci5idWlsZFBhcnRpYWwoKSk7XG4iCisgICAgICAiICAgIH0gY2F0Y2ggKGNvbS5nb29nbGUucHJvdG9idWYuVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24gZSkge1xuIgorICAgICAgIiAgICAgIHRocm93ICIKKyAgICAgICJlLmFzSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCkuc2V0VW5maW5pc2hlZE1lc3NhZ2UoYnVpbGRlci4iCisgICAgICAiYnVpbGRQYXJ0aWFsKCkpO1xuIgorICAgICAgIiAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHtcbiIKKyAgICAgICIgICAgICB0aHJvdyBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oZSlcbiIKKyAgICAgICIgICAgICAgICAgLnNldFVuZmluaXNoZWRNZXNzYWdlKGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpO1xuIgorICAgICAgIiAgICB9XG4iCisgICAgICAiICAgIHJldHVybiBidWlsZGVyLmJ1aWxkUGFydGlhbCgpO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn07XG4iCisgICAgICAiXG4iCisgICAgICAicHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlBhcnNlcjwkY2xhc3NuYW1lJD4gcGFyc2VyKCkge1xuIgorICAgICAgIiAgcmV0dXJuIFBBUlNFUjtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgInB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlBhcnNlcjwkY2xhc3NuYW1lJD4gZ2V0UGFyc2VyRm9yVHlwZSgpIHtcbiIKKyAgICAgICIgIHJldHVybiBQQVJTRVI7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgICJ2aXNpYmlsaXR5IiwKKyAgICAgIEV4cG9zZVB1YmxpY1BhcnNlcihkZXNjcmlwdG9yXy0+ZmlsZSgpKSA/ICJAamF2YS5sYW5nLkRlcHJlY2F0ZWQgcHVibGljIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInByaXZhdGUiLAorICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit2b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlSW5pdGlhbGl6ZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGlmICghSXNSZWFsT25lb2YoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKSkgeworICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKKyAgICAgICAgICAuR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUocHJpbnRlcik7CisgICAgfQorICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVNdXRhYmxlQ29weShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwcm90ZWN0ZWQgY29tLmdvb2dsZS5wcm90b2J1Zi5NdXRhYmxlTWVzc2FnZVxuIgorICAgICAgIiAgICBpbnRlcm5hbE11dGFibGVEZWZhdWx0KCkge1xuIgorICAgICAgIiAgcmV0dXJuIE11dGFibGVEZWZhdWx0TG9hZGVyLmdldCgpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIKKyAgICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNdXRhYmxlRGVmYXVsdExvYWRlciB7XG4iCisgICAgICAiICBwcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGRlZmF1bHRPclJ1bnRpbWVFeGNlcHRpb247XG4iCisgICAgICAiICBzdGF0aWMge1xuIgorICAgICAgIiAgICBqYXZhLmxhbmcuT2JqZWN0IGxvY2FsO1xuIgorICAgICAgIiAgICB0cnkge1xuIgorICAgICAgIiAgICAgIGxvY2FsID0gaW50ZXJuYWxNdXRhYmxlRGVmYXVsdChcIiRtdXRhYmxlX25hbWUkXCIpO1xuIgorICAgICAgIiAgICB9IGNhdGNoIChqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiBlKSB7XG4iCisgICAgICAiICAgICAgbG9jYWwgPSBlO1xuIgorICAgICAgIiAgICB9XG4iCisgICAgICAiICAgIGRlZmF1bHRPclJ1bnRpbWVFeGNlcHRpb24gPSBsb2NhbDtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJcbiIKKyAgICAgICIgIHByaXZhdGUgTXV0YWJsZURlZmF1bHRMb2FkZXIoKSB7fVxuIgorICAgICAgIlxuIgorICAgICAgIiAgcHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLk11dGFibGVNZXNzYWdlIGdldCgpIHtcbiIKKyAgICAgICIgICAgaWYgKGRlZmF1bHRPclJ1bnRpbWVFeGNlcHRpb25cbiIKKyAgICAgICIgICAgICAgICBpbnN0YW5jZW9mIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKSB7XG4iCisgICAgICAiICAgICAgdGhyb3cgKGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKSBkZWZhdWx0T3JSdW50aW1lRXhjZXB0aW9uO1xuIgorICAgICAgIiAgICB9XG4iCisgICAgICAiICAgIHJldHVyblxuIgorICAgICAgIiAgICAgICAgKGNvbS5nb29nbGUucHJvdG9idWYuTXV0YWJsZU1lc3NhZ2UpICIKKyAgICAgICJkZWZhdWx0T3JSdW50aW1lRXhjZXB0aW9uO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIsCisgICAgICAibXV0YWJsZV9uYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEphdmFNdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVLb3RsaW5Ec2woaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiQGtvdGxpbi5PcHRJbiIKKyAgICAgICIoY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uT25seUZvclVzZUJ5R2VuZXJhdGVkUHJvdG9Db2RlOjpjbGFzcylcbiIKKyAgICAgICJAY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uUHJvdG9Ec2xNYXJrZXJcbiIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICJjbGFzcyBEc2wgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiIKKyAgICAgICIgIHByaXZhdGUgdmFsIF9idWlsZGVyOiAkbWVzc2FnZSQuQnVpbGRlclxuIgorICAgICAgIikge1xuIgorICAgICAgIiAgY29tcGFuaW9uIG9iamVjdCB7XG4iCisgICAgICAiICAgIEBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIiAgICBAa290bGluLlB1Ymxpc2hlZEFwaVxuIgorICAgICAgIiAgICBpbnRlcm5hbCBmdW4gX2NyZWF0ZShidWlsZGVyOiAkbWVzc2FnZSQuQnVpbGRlcik6IERzbCA9ICIKKyAgICAgICJEc2woYnVpbGRlcilcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJcbiIKKyAgICAgICIgIEBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIiAgQGtvdGxpbi5QdWJsaXNoZWRBcGlcbiIKKyAgICAgICIgIGludGVybmFsIGZ1biBfYnVpbGQoKTogJG1lc3NhZ2UkID0gX2J1aWxkZXIuYnVpbGQoKVxuIiwKKyAgICAgICJtZXNzYWdlIiwgbmFtZV9yZXNvbHZlcl8tPkdldENsYXNzTmFtZShkZXNjcmlwdG9yXywgdHJ1ZSkpOworCisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgIC5HZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMocHJpbnRlcik7CisgIH0KKworICBmb3IgKGF1dG8gb25lb2YgOiBvbmVvZnNfKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ2YWwgJG9uZW9mX25hbWUkQ2FzZTogJG1lc3NhZ2UkLiRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2VcbiIKKyAgICAgICAgIiAgQEp2bU5hbWUoXCJnZXQkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlXCIpXG4iCisgICAgICAgICIgIGdldCgpID0gX2J1aWxkZXIuZ2V0JG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSgpXG5cbiIKKyAgICAgICAgImZ1biBjbGVhciRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAgICAgIiAgX2J1aWxkZXIuY2xlYXIkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSQoKVxuIgorICAgICAgICAifVxuIiwKKyAgICAgICAgIm9uZW9mX25hbWUiLCBjb250ZXh0Xy0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKG9uZW9mKS0+bmFtZSwKKyAgICAgICAgIm9uZW9mX2NhcGl0YWxpemVkX25hbWUiLAorICAgICAgICBjb250ZXh0Xy0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKG9uZW9mKS0+Y2FwaXRhbGl6ZWRfbmFtZSwgIm1lc3NhZ2UiLAorICAgICAgICBuYW1lX3Jlc29sdmVyXy0+R2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3JfLCB0cnVlKSk7CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIEdlbmVyYXRlS290bGluRXh0ZW5zaW9ucyhwcmludGVyKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlS290bGluTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwiLWluaXRpYWxpemUkY2FtZWxjYXNlX25hbWUkXCIpXG4iCisgICAgICAiaW5saW5lIGZ1biAkY2FtZWxjYXNlX25hbWUkKGJsb2NrOiAkbWVzc2FnZV9rdCQuRHNsLigpIC0+ICIKKyAgICAgICJrb3RsaW4uVW5pdCk6ICIKKyAgICAgICIkbWVzc2FnZSQgIgorICAgICAgIj1cbiIKKyAgICAgICIgICRtZXNzYWdlX2t0JC5Ec2wuX2NyZWF0ZSgkbWVzc2FnZSQubmV3QnVpbGRlcigpKS5hcHBseSB7IGJsb2NrKCkgIgorICAgICAgIn0uX2J1aWxkKClcbiIsCisgICAgICAiY2FtZWxjYXNlX25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0S290bGluRmFjdG9yeU5hbWUoZGVzY3JpcHRvcl8pLAorICAgICAgIm1lc3NhZ2Vfa3QiLCBuYW1lX3Jlc29sdmVyXy0+R2V0S290bGluRXh0ZW5zaW9uc0NsYXNzTmFtZShkZXNjcmlwdG9yXyksCisgICAgICAibWVzc2FnZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRDbGFzc05hbWUoZGVzY3JpcHRvcl8sIHRydWUpKTsKKworICBwcmludGVyLT5QcmludCgib2JqZWN0ICRuYW1lJEt0IHtcbiIsICJuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgIHByaW50ZXItPkluZGVudCgpOworICBHZW5lcmF0ZUtvdGxpbkRzbChwcmludGVyKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKElzTWFwRW50cnkoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpKSkgY29udGludWU7CisgICAgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcihkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSksIGNvbnRleHRfKQorICAgICAgICAuR2VuZXJhdGVLb3RsaW5NZW1iZXJzKHByaW50ZXIpOworICB9CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlVG9wTGV2ZWxLb3RsaW5NZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgImlubGluZSBmdW4gJG1lc3NhZ2UkLmNvcHkoYmxvY2s6ICRtZXNzYWdlX2t0JC5Ec2wuKCkgLT4gIgorICAgICAgImtvdGxpbi5Vbml0KTogIgorICAgICAgIiRtZXNzYWdlJCA9XG4iCisgICAgICAiICAkbWVzc2FnZV9rdCQuRHNsLl9jcmVhdGUodGhpcy50b0J1aWxkZXIoKSkuYXBwbHkgeyBibG9jaygpICIKKyAgICAgICJ9Ll9idWlsZCgpXG5cbiIsCisgICAgICAibWVzc2FnZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRDbGFzc05hbWUoZGVzY3JpcHRvcl8sIHRydWUpLCAibWVzc2FnZV9rdCIsCisgICAgICBuYW1lX3Jlc29sdmVyXy0+R2V0S290bGluRXh0ZW5zaW9uc0NsYXNzTmFtZShkZXNjcmlwdG9yXykpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGlmIChJc01hcEVudHJ5KGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSkpIGNvbnRpbnVlOworICAgIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3IoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpLCBjb250ZXh0XykKKyAgICAgICAgLkdlbmVyYXRlVG9wTGV2ZWxLb3RsaW5NZW1iZXJzKHByaW50ZXIpOworICB9CisKKyAgR2VuZXJhdGVLb3RsaW5Pck51bGwocHJpbnRlcik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVLb3RsaW5Pck51bGwoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBpZiAoZmllbGQtPmhhc19wcmVzZW5jZSgpICYmIEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9NRVNTQUdFKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAidmFsICRmdWxsX2NsYXNzbmFtZSRPckJ1aWxkZXIuJGNhbWVsY2FzZV9uYW1lJE9yTnVsbDogJGZ1bGxfbmFtZSQ/XG4iCisgICAgICAgICAgIiAgZ2V0KCkgPSBpZiAoaGFzJG5hbWUkKCkpIGdldCRuYW1lJCgpIGVsc2UgbnVsbFxuXG4iLAorICAgICAgICAgICJmdWxsX2NsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRDbGFzc05hbWUoZGVzY3JpcHRvcl8sIHRydWUpLAorICAgICAgICAgICJjYW1lbGNhc2VfbmFtZSIsIGNvbnRleHRfLT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZmllbGQpLT5uYW1lLAorICAgICAgICAgICJmdWxsX25hbWUiLAorICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSwgIm5hbWUiLAorICAgICAgICAgIGNvbnRleHRfLT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZmllbGQpLT5jYXBpdGFsaXplZF9uYW1lKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUtvdGxpbkV4dGVuc2lvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgbWVzc2FnZV9uYW1lID0gbmFtZV9yZXNvbHZlcl8tPkdldENsYXNzTmFtZShkZXNjcmlwdG9yXywgdHJ1ZSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiQFN1cHByZXNzKFwiVU5DSEVDS0VEX0NBU1RcIilcbiIKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJvcGVyYXRvciBmdW4gPFQgOiBrb3RsaW4uQW55PiBnZXQoZXh0ZW5zaW9uOiAiCisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25MaXRlPCRtZXNzYWdlJCwgVD4pOiBUIHtcbiIKKyAgICAgICIgIHJldHVybiBpZiAoZXh0ZW5zaW9uLmlzUmVwZWF0ZWQpIHtcbiIKKyAgICAgICIgICAgZ2V0KGV4dGVuc2lvbiBhcyBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvbkxpdGU8JG1lc3NhZ2UkLCAiCisgICAgICAiTGlzdDwqPj4pIGFzIFRcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgIF9idWlsZGVyLmdldEV4dGVuc2lvbihleHRlbnNpb24pXG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuXG4iLAorICAgICAgIm1lc3NhZ2UiLCBtZXNzYWdlX25hbWUpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIkBrb3RsaW4uT3B0SW4iCisgICAgICAiKGNvbS5nb29nbGUucHJvdG9idWYua290bGluLk9ubHlGb3JVc2VCeUdlbmVyYXRlZFByb3RvQ29kZTo6Y2xhc3MpXG4iCisgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcIi1nZXRSZXBlYXRlZEV4dGVuc2lvblwiKVxuIgorICAgICAgIm9wZXJhdG9yIGZ1biA8RSA6IGtvdGxpbi5Bbnk+IGdldChcbiIKKyAgICAgICIgIGV4dGVuc2lvbjogY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25MaXRlPCRtZXNzYWdlJCwgTGlzdDxFPj5cbiIKKyAgICAgICIpOiBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5FeHRlbnNpb25MaXN0PEUsICRtZXNzYWdlJD4ge1xuIgorICAgICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkV4dGVuc2lvbkxpc3QoZXh0ZW5zaW9uLCAiCisgICAgICAiX2J1aWxkZXIuZ2V0RXh0ZW5zaW9uKGV4dGVuc2lvbikpXG4iCisgICAgICAifVxuXG4iLAorICAgICAgIm1lc3NhZ2UiLCBtZXNzYWdlX25hbWUpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIm9wZXJhdG9yIGZ1biBjb250YWlucyhleHRlbnNpb246ICIKKyAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvbkxpdGU8JG1lc3NhZ2UkLCAqPik6ICIKKyAgICAgICJCb29sZWFuIHtcbiIKKyAgICAgICIgIHJldHVybiBfYnVpbGRlci5oYXNFeHRlbnNpb24oZXh0ZW5zaW9uKVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJmdW4gY2xlYXIoZXh0ZW5zaW9uOiAiCisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25MaXRlPCRtZXNzYWdlJCwgKj4pICIKKyAgICAgICJ7XG4iCisgICAgICAiICBfYnVpbGRlci5jbGVhckV4dGVuc2lvbihleHRlbnNpb24pXG4iCisgICAgICAifVxuXG4iLAorICAgICAgIm1lc3NhZ2UiLCBtZXNzYWdlX25hbWUpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIkBrb3RsaW4uUHVibGlzaGVkQXBpXG4iCisgICAgICAiaW50ZXJuYWwgZnVuIDxUIDoga290bGluLkFueT4gc2V0RXh0ZW5zaW9uKGV4dGVuc2lvbjogIgorICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uTGl0ZTwkbWVzc2FnZSQsIFQ+LCAiCisgICAgICAidmFsdWU6IFQpIHtcbiIKKyAgICAgICIgIF9idWlsZGVyLnNldEV4dGVuc2lvbihleHRlbnNpb24sIHZhbHVlKVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gPFQgOiBDb21wYXJhYmxlPFQ+PiBzZXQoXG4iCisgICAgICAiICBleHRlbnNpb246IGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uTGl0ZTwkbWVzc2FnZSQsIFQ+LFxuIgorICAgICAgIiAgdmFsdWU6IFRcbiIKKyAgICAgICIpIHtcbiIKKyAgICAgICIgIHNldEV4dGVuc2lvbihleHRlbnNpb24sIHZhbHVlKVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gc2V0KFxuIgorICAgICAgIiAgZXh0ZW5zaW9uOiBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvbkxpdGU8JG1lc3NhZ2UkLCAiCisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nPixcbiIKKyAgICAgICIgIHZhbHVlOiBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKKyAgICAgICIpIHtcbiIKKyAgICAgICIgIHNldEV4dGVuc2lvbihleHRlbnNpb24sIHZhbHVlKVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gPFQgOiBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VMaXRlPiBzZXQoXG4iCisgICAgICAiICBleHRlbnNpb246IGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uTGl0ZTwkbWVzc2FnZSQsIFQ+LFxuIgorICAgICAgIiAgdmFsdWU6IFRcbiIKKyAgICAgICIpIHtcbiIKKyAgICAgICIgIHNldEV4dGVuc2lvbihleHRlbnNpb24sIHZhbHVlKVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJmdW4gPEUgOiBrb3RsaW4uQW55PiBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5FeHRlbnNpb25MaXN0PEUsICIKKyAgICAgICIkbWVzc2FnZSQ+LmFkZCh2YWx1ZTogRSkge1xuIgorICAgICAgIiAgX2J1aWxkZXIuYWRkRXh0ZW5zaW9uKHRoaXMuZXh0ZW5zaW9uLCB2YWx1ZSlcbiIKKyAgICAgICJ9XG5cbiIsCisgICAgICAibWVzc2FnZSIsIG1lc3NhZ2VfbmFtZSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiQFN1cHByZXNzKFwiTk9USElOR19UT19JTkxJTkVcIilcbiIKKyAgICAgICJpbmxpbmUgb3BlcmF0b3IgZnVuIDxFIDoga290bGluLkFueT4gIgorICAgICAgImNvbS5nb29nbGUucHJvdG9idWYua290bGluLkV4dGVuc2lvbkxpc3Q8RSwgIgorICAgICAgIiRtZXNzYWdlJD4ucGx1c0Fzc2lnbiIKKyAgICAgICIodmFsdWU6IEUpIHtcbiIKKyAgICAgICIgIGFkZCh2YWx1ZSlcbiIKKyAgICAgICJ9XG5cbiIsCisgICAgICAibWVzc2FnZSIsIG1lc3NhZ2VfbmFtZSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiZnVuIDxFIDoga290bGluLkFueT4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRXh0ZW5zaW9uTGlzdDxFLCAiCisgICAgICAiJG1lc3NhZ2UkPi5hZGRBbGwodmFsdWVzOiBJdGVyYWJsZTxFPikge1xuIgorICAgICAgIiAgZm9yICh2YWx1ZSBpbiB2YWx1ZXMpIHtcbiIKKyAgICAgICIgICAgYWRkKHZhbHVlKVxuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gPEUgOiBrb3RsaW4uQW55PiAiCisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRXh0ZW5zaW9uTGlzdDxFLCAiCisgICAgICAiJG1lc3NhZ2UkPi5wbHVzQXNzaWduKHZhbHVlczogIgorICAgICAgIkl0ZXJhYmxlPEU+KSB7XG4iCisgICAgICAiICBhZGRBbGwodmFsdWVzKVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJvcGVyYXRvciBmdW4gPEUgOiBrb3RsaW4uQW55PiAiCisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRXh0ZW5zaW9uTGlzdDxFLCAiCisgICAgICAiJG1lc3NhZ2UkPi5zZXQoaW5kZXg6IEludCwgdmFsdWU6ICIKKyAgICAgICJFKSB7XG4iCisgICAgICAiICBfYnVpbGRlci5zZXRFeHRlbnNpb24odGhpcy5leHRlbnNpb24sIGluZGV4LCB2YWx1ZSlcbiIKKyAgICAgICJ9XG5cbiIsCisgICAgICAibWVzc2FnZSIsIG1lc3NhZ2VfbmFtZSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiQFN1cHByZXNzKFwiTk9USElOR19UT19JTkxJTkVcIilcbiIKKyAgICAgICJpbmxpbmUgZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkV4dGVuc2lvbkxpc3Q8KiwgIgorICAgICAgIiRtZXNzYWdlJD4uY2xlYXIoKSB7XG4iCisgICAgICAiICBjbGVhcihleHRlbnNpb24pXG4iCisgICAgICAifVxuXG4iLAorICAgICAgIm1lc3NhZ2UiLCBtZXNzYWdlX25hbWUpOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlQW55TWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZVVybChcbiIKKyAgICAgICIgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlVXJsUHJlZml4LFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZGVzY3JpcHRvcikge1xuIgorICAgICAgIiAgcmV0dXJuIHR5cGVVcmxQcmVmaXguZW5kc1dpdGgoXCIvXCIpXG4iCisgICAgICAiICAgICAgPyB0eXBlVXJsUHJlZml4ICsgZGVzY3JpcHRvci5nZXRGdWxsTmFtZSgpXG4iCisgICAgICAiICAgICAgOiB0eXBlVXJsUHJlZml4ICsgXCIvXCIgKyBkZXNjcmlwdG9yLmdldEZ1bGxOYW1lKCk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgInByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZUZyb21UeXBlVXJsKFxuIgorICAgICAgIiAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGVVcmwpIHtcbiIKKyAgICAgICIgIGludCBwb3MgPSB0eXBlVXJsLmxhc3RJbmRleE9mKCcvJyk7XG4iCisgICAgICAiICByZXR1cm4gcG9zID09IC0xID8gXCJcIiA6IHR5cGVVcmwuc3Vic3RyaW5nKHBvcyArIDEpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIKKyAgICAgICJwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlPiBBbnkgcGFjayhcbiIKKyAgICAgICIgICAgVCBtZXNzYWdlKSB7XG4iCisgICAgICAiICByZXR1cm4gQW55Lm5ld0J1aWxkZXIoKVxuIgorICAgICAgIiAgICAgIC5zZXRUeXBlVXJsKGdldFR5cGVVcmwoXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkpKVxuIgorICAgICAgIiAgICAgIC5zZXRWYWx1ZShtZXNzYWdlLnRvQnl0ZVN0cmluZygpKVxuIgorICAgICAgIiAgICAgIC5idWlsZCgpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIKKyAgICAgICIvKipcbiIKKyAgICAgICIgKiBQYWNrcyBhIG1lc3NhZ2UgdXNpbmcgdGhlIGdpdmVuIHR5cGUgVVJMIHByZWZpeC4gVGhlIHR5cGUgVVJMIHdpbGxcbiIKKyAgICAgICIgKiBiZSBjb25zdHJ1Y3RlZCBieSBjb25jYXRlbmF0aW5nIHRoZSBtZXNzYWdlIHR5cGUncyBmdWxsIG5hbWUgdG8gdGhlXG4iCisgICAgICAiICogcHJlZml4IHdpdGggYW4gb3B0aW9uYWwgXCIvXCIgc2VwYXJhdG9yIGlmIHRoZSBwcmVmaXggZG9lc24ndCBlbmRcbiIKKyAgICAgICIgKiB3aXRoIFwiL1wiIGFscmVhZHkuXG4iCisgICAgICAiICovXG4iCisgICAgICAicHVibGljIHN0YXRpYyA8VCBleHRlbmRzIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZT4gQW55IHBhY2soXG4iCisgICAgICAiICAgIFQgbWVzc2FnZSwgamF2YS5sYW5nLlN0cmluZyB0eXBlVXJsUHJlZml4KSB7XG4iCisgICAgICAiICByZXR1cm4gQW55Lm5ld0J1aWxkZXIoKVxuIgorICAgICAgIiAgICAgIC5zZXRUeXBlVXJsKGdldFR5cGVVcmwodHlwZVVybFByZWZpeCxcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0RGVzY3JpcHRvckZvclR5cGUoKSkpXG4iCisgICAgICAiICAgICAgLnNldFZhbHVlKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpXG4iCisgICAgICAiICAgICAgLmJ1aWxkKCk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgInB1YmxpYyA8VCBleHRlbmRzIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZT4gYm9vbGVhbiBpcyhcbiIKKyAgICAgICIgICAgamF2YS5sYW5nLkNsYXNzPFQ+IGNsYXp6KSB7XG4iCisgICAgICAiICBUIGRlZmF1bHRJbnN0YW5jZSA9XG4iCisgICAgICAiICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5nZXREZWZhdWx0SW5zdGFuY2UoY2xhenopO1xuIgorICAgICAgIiAgcmV0dXJuIGdldFR5cGVOYW1lRnJvbVR5cGVVcmwoZ2V0VHlwZVVybCgpKS5lcXVhbHMoXG4iCisgICAgICAiICAgICAgZGVmYXVsdEluc3RhbmNlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RnVsbE5hbWUoKSk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgInByaXZhdGUgdm9sYXRpbGUgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlIGNhY2hlZFVucGFja1ZhbHVlO1xuIgorICAgICAgIlxuIgorICAgICAgIkBqYXZhLmxhbmcuU3VwcHJlc3NXYXJuaW5ncyhcInVuY2hlY2tlZFwiKVxuIgorICAgICAgInB1YmxpYyA8VCBleHRlbmRzIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZT4gVCB1bnBhY2soXG4iCisgICAgICAiICAgIGphdmEubGFuZy5DbGFzczxUPiBjbGF6eilcbiIKKyAgICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKKyAgICAgICIgIGJvb2xlYW4gaW52YWxpZENsYXp6ID0gZmFsc2U7XG4iCisgICAgICAiICBpZiAoY2FjaGVkVW5wYWNrVmFsdWUgIT0gbnVsbCkge1xuIgorICAgICAgIiAgICBpZiAoY2FjaGVkVW5wYWNrVmFsdWUuZ2V0Q2xhc3MoKSA9PSBjbGF6eikge1xuIgorICAgICAgIiAgICAgIHJldHVybiAoVCkgY2FjaGVkVW5wYWNrVmFsdWU7XG4iCisgICAgICAiICAgIH1cbiIKKyAgICAgICIgICAgaW52YWxpZENsYXp6ID0gdHJ1ZTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIGlmIChpbnZhbGlkQ2xhenogfHwgIWlzKGNsYXp6KSkge1xuIgorICAgICAgIiAgICB0aHJvdyBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oXG4iCisgICAgICAiICAgICAgICBcIlR5cGUgb2YgdGhlIEFueSBtZXNzYWdlIGRvZXMgbm90IG1hdGNoIHRoZSBnaXZlbiBjbGFzcy5cIik7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICBUIGRlZmF1bHRJbnN0YW5jZSA9XG4iCisgICAgICAiICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5nZXREZWZhdWx0SW5zdGFuY2UoY2xhenopO1xuIgorICAgICAgIiAgVCByZXN1bHQgPSAoVCkgZGVmYXVsdEluc3RhbmNlLmdldFBhcnNlckZvclR5cGUoKVxuIgorICAgICAgIiAgICAgIC5wYXJzZUZyb20oZ2V0VmFsdWUoKSk7XG4iCisgICAgICAiICBjYWNoZWRVbnBhY2tWYWx1ZSA9IHJlc3VsdDtcbiIKKyAgICAgICIgIHJldHVybiByZXN1bHQ7XG4iCisgICAgICAifVxuIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2UuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiZDBkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CitjbGFzcyBDb250ZXh0OyAgICAgICAgICAgIC8vIGNvbnRleHQuaAorY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7ICAvLyBuYW1lX3Jlc29sdmVyLmgKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK25hbWVzcGFjZSBpbyB7CitjbGFzcyBQcmludGVyOyAgLy8gcHJpbnRlci5oCit9Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworc3RhdGljIGNvbnN0IGludCBrTWF4U3RhdGljU2l6ZSA9IDEgPDwgMTU7ICAvLyBha2EgMzJrCisKK2NsYXNzIE1lc3NhZ2VHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgdmlydHVhbCB+TWVzc2FnZUdlbmVyYXRvcigpOworCisgIC8vIEFsbCBzdGF0aWMgdmFyaWFibGVzIGhhdmUgdG8gYmUgZGVjbGFyZWQgYXQgdGhlIHRvcC1sZXZlbCBvZiB0aGUgZmlsZQorICAvLyBzbyB0aGF0IHdlIGNhbiBjb250cm9sIGluaXRpYWxpemF0aW9uIG9yZGVyLCB3aGljaCBpcyBpbXBvcnRhbnQgZm9yCisgIC8vIERlc2NyaXB0b3JQcm90byBib290c3RyYXBwaW5nIHRvIHdvcmsuCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlcyhpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYnl0ZWNvZGVfZXN0aW1hdGUpID0gMDsKKworICAvLyBPdXRwdXQgY29kZSB3aGljaCBpbml0aWFsaXplcyB0aGUgc3RhdGljIHZhcmlhYmxlcyBnZW5lcmF0ZWQgYnkKKyAgLy8gR2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMoKS4gUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiBieXRlY29kZSBzaXplLgorICB2aXJ0dWFsIGludCBHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSA9IDA7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGNsYXNzIGl0c2VsZi4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSA9IDA7CisKKyAgLy8gR2VuZXJhdGVzIHRoZSBiYXNlIGludGVyZmFjZSB0aGF0IGJvdGggdGhlIGNsYXNzIGFuZCBpdHMgYnVpbGRlcgorICAvLyBpbXBsZW1lbnQKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlKGlvOjpQcmludGVyKiBwcmludGVyKSA9IDA7CisKKyAgLy8gR2VuZXJhdGUgY29kZSB0byByZWdpc3RlciBhbGwgY29udGFpbmVkIGV4dGVuc2lvbnMgd2l0aCBhbgorICAvLyBFeHRlbnNpb25SZWdpc3RyeS4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVLb3RsaW5Ec2woaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlS290bGluTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVUb3BMZXZlbEtvdGxpbk1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworIHByb3RlY3RlZDoKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIHN0ZDo6c2V0PGNvbnN0IE9uZW9mRGVzY3JpcHRvcio+IG9uZW9mc187CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZUdlbmVyYXRvcik7Cit9OworCitjbGFzcyBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yIDogcHVibGljIE1lc3NhZ2VHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBDb250ZXh0KiBjb250ZXh0KTsKKyAgfkltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZShpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVFeHRlbnNpb25SZWdpc3RyYXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlcyhpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGJ5dGVjb2RlX2VzdGltYXRlKSBvdmVycmlkZTsKKworICAvLyBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIHByaW50ZWQgY29kZSB3aWxsIGNvbXBpbGUgdG8KKyAgaW50IEdlbmVyYXRlU3RhdGljVmFyaWFibGVJbml0aWFsaXplcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlS290bGluRHNsKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUtvdGxpbk1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlVG9wTGV2ZWxLb3RsaW5NZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHZvaWQgR2VuZXJhdGVGaWVsZEFjY2Vzc29yVGFibGUoaW86OlByaW50ZXIqIHByaW50ZXIsIGludCogYnl0ZWNvZGVfZXN0aW1hdGUpOworCisgIC8vIFJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBieXRlcyB0aGUgcHJpbnRlZCBjb2RlIHdpbGwgY29tcGlsZSB0bworICBpbnQgR2VuZXJhdGVGaWVsZEFjY2Vzc29yVGFibGVJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgdm9pZCBHZW5lcmF0ZU1lc3NhZ2VTZXJpYWxpemF0aW9uTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVQYXJzZUZyb21NZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZU9uZUZpZWxkKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZSgKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UpOworCisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlRGVzY3JpcHRvck1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6ZXJzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZUVxdWFsc0FuZEhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNlcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29uc3RydWN0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlTXV0YWJsZUNvcHkoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlS290bGluRXh0ZW5zaW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVLb3RsaW5Pck51bGwoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQW55TWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgQ29udGV4dCogY29udGV4dF87CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKKyAgRmllbGRHZW5lcmF0b3JNYXA8SW1tdXRhYmxlRmllbGRHZW5lcmF0b3I+IGZpZWxkX2dlbmVyYXRvcnNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01FU1NBR0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZV9idWlsZGVyLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2UxMWFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlci5jYwpAQCAtMCwwICsxLDgxMCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogZHdlaXNAZ29vZ2xlLmNvbSAoRGFuaWVsIFdlaXMpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlci5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2VudW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9leHRlbnNpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3JfZmFjdG9yeS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lX3Jlc29sdmVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKworLy8gTXVzdCBiZSBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0OwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOworCituYW1lc3BhY2Ugeworc3RkOjpzdHJpbmcgTWFwVmFsdWVJbW11dGFibGVDbGFzc2ROYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXIpIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZV9maWVsZCA9IGRlc2NyaXB0b3ItPm1hcF92YWx1ZSgpOworICBHT09HTEVfQ0hFQ0tfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UsIHZhbHVlX2ZpZWxkLT50eXBlKCkpOworICByZXR1cm4gbmFtZV9yZXNvbHZlci0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKHZhbHVlX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKSk7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworTWVzc2FnZUJ1aWxkZXJHZW5lcmF0b3I6Ok1lc3NhZ2VCdWlsZGVyR2VuZXJhdG9yKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCkKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgICAgY29udGV4dF8oY29udGV4dCksCisgICAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSksCisgICAgICBmaWVsZF9nZW5lcmF0b3JzXyhkZXNjcmlwdG9yLCBjb250ZXh0XykgeworICBHT09HTEVfQ0hFQ0soSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvci0+ZmlsZSgpLCBjb250ZXh0LT5FbmZvcmNlTGl0ZSgpKSkKKyAgICAgIDw8ICJHZW5lcmF0b3IgZmFjdG9yeSBlcnJvcjogQSBub24tbGl0ZSBtZXNzYWdlIGdlbmVyYXRvciBpcyB1c2VkIHRvICIKKyAgICAgICAgICJnZW5lcmF0ZSBsaXRlIG1lc3NhZ2VzLiI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGlmIChJc1JlYWxPbmVvZihkZXNjcmlwdG9yXy0+ZmllbGQoaSkpKSB7CisgICAgICBvbmVvZnNfLmluc2VydChkZXNjcmlwdG9yXy0+ZmllbGQoaSktPmNvbnRhaW5pbmdfb25lb2YoKSk7CisgICAgfQorICB9Cit9CisKK01lc3NhZ2VCdWlsZGVyR2VuZXJhdG9yOjp+TWVzc2FnZUJ1aWxkZXJHZW5lcmF0b3IoKSB7fQorCit2b2lkIE1lc3NhZ2VCdWlsZGVyR2VuZXJhdG9yOjpHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBXcml0ZU1lc3NhZ2VEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciBleHRlbmRzXG4iCisgICAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlJHZlciQuRXh0ZW5kYWJsZUJ1aWxkZXI8XG4iCisgICAgICAgICIgICAgICAkY2xhc3NuYW1lJCwgQnVpbGRlcj4gaW1wbGVtZW50c1xuIgorICAgICAgICAiICAgICRleHRyYV9pbnRlcmZhY2VzJFxuIgorICAgICAgICAiICAgICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSwKKyAgICAgICAgImV4dHJhX2ludGVyZmFjZXMiLCBFeHRyYUJ1aWxkZXJJbnRlcmZhY2VzKGRlc2NyaXB0b3JfKSwgInZlciIsCisgICAgICAgIEdlbmVyYXRlZENvZGVWZXJzaW9uU3VmZml4KCkpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIGV4dGVuZHNcbiIKKyAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UkdmVyJC5CdWlsZGVyPEJ1aWxkZXI+ICIKKyAgICAgICAgImltcGxlbWVudHNcbiIKKyAgICAgICAgIiAgICAkZXh0cmFfaW50ZXJmYWNlcyRcbiIKKyAgICAgICAgIiAgICAkY2xhc3NuYW1lJE9yQnVpbGRlciB7XG4iLAorICAgICAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXyksCisgICAgICAgICJleHRyYV9pbnRlcmZhY2VzIiwgRXh0cmFCdWlsZGVySW50ZXJmYWNlcyhkZXNjcmlwdG9yXyksICJ2ZXIiLAorICAgICAgICBHZW5lcmF0ZWRDb2RlVmVyc2lvblN1ZmZpeCgpKTsKKyAgfQorICBwcmludGVyLT5JbmRlbnQoKTsKKworICBHZW5lcmF0ZURlc2NyaXB0b3JNZXRob2RzKHByaW50ZXIpOworICBHZW5lcmF0ZUNvbW1vbkJ1aWxkZXJNZXRob2RzKHByaW50ZXIpOworCisgIGlmIChjb250ZXh0Xy0+SGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICBHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQocHJpbnRlcik7CisgICAgR2VuZXJhdGVCdWlsZGVyUGFyc2luZ01ldGhvZHMocHJpbnRlcik7CisgIH0KKworICAvLyBvbmVvZgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnM7CisgIGZvciAoYXV0byBvbmVvZiA6IG9uZW9mc18pIHsKKyAgICB2YXJzWyJvbmVvZl9uYW1lIl0gPSBjb250ZXh0Xy0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKG9uZW9mKS0+bmFtZTsKKyAgICB2YXJzWyJvbmVvZl9jYXBpdGFsaXplZF9uYW1lIl0gPQorICAgICAgICBjb250ZXh0Xy0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKG9uZW9mKS0+Y2FwaXRhbGl6ZWRfbmFtZTsKKyAgICB2YXJzWyJvbmVvZl9pbmRleCJdID0gU3RyQ2F0KG9uZW9mLT5pbmRleCgpKTsKKyAgICAvLyBvbmVvZkNhc2VfIGFuZCBvbmVvZl8KKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAgICAgICAgICAgICJwcml2YXRlIGludCAkb25lb2ZfbmFtZSRDYXNlXyA9IDA7XG4iCisgICAgICAgICAgICAgICAgICAgInByaXZhdGUgamF2YS5sYW5nLk9iamVjdCAkb25lb2ZfbmFtZSRfO1xuIik7CisgICAgLy8gb25lb2ZDYXNlKCkgYW5kIGNsZWFyT25lb2YoKQorICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICAgICAgICAgICAgInB1YmxpYyAkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBnZXQkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlKCkge1xuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiAkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlLmZvck51bWJlcihcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgJG9uZW9mX25hbWUkQ2FzZV8pO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICJwdWJsaWMgQnVpbGRlciBjbGVhciRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkb25lb2ZfbmFtZSRDYXNlXyA9IDA7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgJG9uZW9mX25hbWUkXyA9IG51bGw7XG4iKTsKKyAgICBwcmludGVyLT5QcmludCgiICBvbkNoYW5nZWQoKTtcbiIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgIlxuIik7CisgIH0KKworICAvLyBJbnRlZ2VycyBmb3IgYml0IGZpZWxkcy4KKyAgaW50IHRvdGFsQml0cyA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIHRvdGFsQml0cyArPQorICAgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKS5HZXROdW1CaXRzRm9yQnVpbGRlcigpOworICB9CisgIGludCB0b3RhbEludHMgPSAodG90YWxCaXRzICsgMzEpIC8gMzI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxJbnRzOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgicHJpdmF0ZSBpbnQgJGJpdF9maWVsZF9uYW1lJDtcbiIsICJiaXRfZmllbGRfbmFtZSIsCisgICAgICAgICAgICAgICAgICAgR2V0Qml0RmllbGROYW1lKGkpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgIC5HZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKHByaW50ZXIpOworICB9CisKKyAgLy8gT3ZlcnJpZGUgbWV0aG9kcyBkZWNsYXJlZCBpbiBHZW5lcmF0ZWRNZXNzYWdlIHRvIHJldHVybiB0aGUgY29uY3JldGUKKyAgLy8gZ2VuZXJhdGVkIHR5cGUgc28gY2FsbHNpdGVzIHdvbid0IGRlcGVuZCBvbiBHZW5lcmF0ZWRNZXNzYWdlLiBUaGlzCisgIC8vIGlzIG5lZWRlZCB0byBrZWVwIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdoZW4gd2UgY2hhbmdlIGdlbmVyYXRlZCBjb2RlCisgIC8vIHRvIHN1YmNsYXNzIGEgZGlmZmVyZW50IEdlbmVyYXRlZE1lc3NhZ2UgY2xhc3MgKGUuZy4sIGluIHYzLjAuMCByZWxlYXNlCisgIC8vIHdlIGNoYW5nZWQgYWxsIGdlbmVyYXRlZCBjb2RlIHRvIHN1YmNsYXNzIEdlbmVyYXRlZE1lc3NhZ2VWMykuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICJwdWJsaWMgZmluYWwgQnVpbGRlciBzZXRVbmtub3duRmllbGRzKFxuIgorICAgICAgIiAgICBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLlVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzKSB7XG4iCisgICAgICAiICByZXR1cm4gc3VwZXIuc2V0VW5rbm93bkZpZWxkcyh1bmtub3duRmllbGRzKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgInB1YmxpYyBmaW5hbCBCdWlsZGVyIG1lcmdlVW5rbm93bkZpZWxkcyhcbiIKKyAgICAgICIgICAgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcykge1xuIgorICAgICAgIiAgcmV0dXJuIHN1cGVyLm1lcmdlVW5rbm93bkZpZWxkcyh1bmtub3duRmllbGRzKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJcbiIKKyAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYnVpbGRlcl9zY29wZTokZnVsbF9uYW1lJClcbiIsCisgICAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIE1lc3NhZ2VCdWlsZGVyR2VuZXJhdG9yOjpHZW5lcmF0ZURlc2NyaXB0b3JNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmICghZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yXG4iCisgICAgICAgICIgICAgZ2V0RGVzY3JpcHRvcigpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRmaWxlY2xhc3MkLmludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiXG4iLAorICAgICAgICAiZmlsZWNsYXNzIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSwKKyAgICAgICAgImlkZW50aWZpZXIiLCBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKGRlc2NyaXB0b3JfKSk7CisgIH0KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gbWFwX2ZpZWxkczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBpZiAoR2V0SmF2YVR5cGUoZmllbGQpID09IEpBVkFUWVBFX01FU1NBR0UgJiYKKyAgICAgICAgSXNNYXBFbnRyeShmaWVsZC0+bWVzc2FnZV90eXBlKCkpKSB7CisgICAgICBtYXBfZmllbGRzLnB1c2hfYmFjayhmaWVsZCk7CisgICAgfQorICB9CisgIGlmICghbWFwX2ZpZWxkcy5lbXB0eSgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJAU3VwcHJlc3NXYXJuaW5ncyh7XCJyYXd0eXBlc1wifSlcbiIKKyAgICAgICAgInByb3RlY3RlZCBjb20uZ29vZ2xlLnByb3RvYnVmLk1hcEZpZWxkIGludGVybmFsR2V0TWFwRmllbGQoXG4iCisgICAgICAgICIgICAgaW50IG51bWJlcikge1xuIgorICAgICAgICAiICBzd2l0Y2ggKG51bWJlcikge1xuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBfZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gbWFwX2ZpZWxkc1tpXTsKKyAgICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbyA9IGNvbnRleHRfLT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZmllbGQpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImNhc2UgJG51bWJlciQ6XG4iCisgICAgICAgICAgIiAgcmV0dXJuIGludGVybmFsR2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iLAorICAgICAgICAgICJudW1iZXIiLCBTdHJDYXQoZmllbGQtPm51bWJlcigpKSwgImNhcGl0YWxpemVkX25hbWUiLAorICAgICAgICAgIGluZm8tPmNhcGl0YWxpemVkX25hbWUpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImRlZmF1bHQ6XG4iCisgICAgICAgICIgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFxuIgorICAgICAgICAiICAgICAgXCJJbnZhbGlkIG1hcCBmaWVsZCBudW1iZXI6IFwiICsgbnVtYmVyKTtcbiIpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiQFN1cHByZXNzV2FybmluZ3Moe1wicmF3dHlwZXNcIn0pXG4iCisgICAgICAgICJwcm90ZWN0ZWQgY29tLmdvb2dsZS5wcm90b2J1Zi5NYXBGaWVsZCBpbnRlcm5hbEdldE11dGFibGVNYXBGaWVsZChcbiIKKyAgICAgICAgIiAgICBpbnQgbnVtYmVyKSB7XG4iCisgICAgICAgICIgIHN3aXRjaCAobnVtYmVyKSB7XG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcF9maWVsZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBtYXBfZmllbGRzW2ldOworICAgICAgY29uc3QgRmllbGRHZW5lcmF0b3JJbmZvKiBpbmZvID0gY29udGV4dF8tPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhmaWVsZCk7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiY2FzZSAkbnVtYmVyJDpcbiIKKyAgICAgICAgICAiICByZXR1cm4gaW50ZXJuYWxHZXRNdXRhYmxlJGNhcGl0YWxpemVkX25hbWUkKCk7XG4iLAorICAgICAgICAgICJudW1iZXIiLCBTdHJDYXQoZmllbGQtPm51bWJlcigpKSwgImNhcGl0YWxpemVkX25hbWUiLAorICAgICAgICAgIGluZm8tPmNhcGl0YWxpemVkX25hbWUpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImRlZmF1bHQ6XG4iCisgICAgICAgICIgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFxuIgorICAgICAgICAiICAgICAgXCJJbnZhbGlkIG1hcCBmaWVsZCBudW1iZXI6IFwiICsgbnVtYmVyKTtcbiIpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIn1cbiIpOworICB9CisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICJwcm90ZWN0ZWQgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlJHZlciQuRmllbGRBY2Nlc3NvclRhYmxlXG4iCisgICAgICAiICAgIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRmaWxlY2xhc3MkLmludGVybmFsXyRpZGVudGlmaWVyJF9maWVsZEFjY2Vzc29yVGFibGVcbiIKKyAgICAgICIgICAgICAuZW5zdXJlRmllbGRBY2Nlc3NvcnNJbml0aWFsaXplZChcbiIKKyAgICAgICIgICAgICAgICAgJGNsYXNzbmFtZSQuY2xhc3MsICRjbGFzc25hbWUkLkJ1aWxkZXIuY2xhc3MpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXyksCisgICAgICAiZmlsZWNsYXNzIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSwKKyAgICAgICJpZGVudGlmaWVyIiwgVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihkZXNjcmlwdG9yXyksICJ2ZXIiLAorICAgICAgR2VuZXJhdGVkQ29kZVZlcnNpb25TdWZmaXgoKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBNZXNzYWdlQnVpbGRlckdlbmVyYXRvcjo6R2VuZXJhdGVDb21tb25CdWlsZGVyTWV0aG9kcygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBEZWNpZGUgaWYgd2UgcmVhbGx5IG5lZWQgdG8gaGF2ZSB0aGUgIm1heWJlRm9yY2VCdWlsZGVySW5pdGlhbGl6YXRpb24oKSIKKyAgLy8gbWV0aG9kLgorICAvLyBUT0RPKGIvMjQ5MTU4MTQ4KTogUmVtb3ZlIHRoZSBuZWVkIGZvciB0aGlzIGVudGlyZWx5CisgIGJvb2wgbmVlZF9tYXliZV9mb3JjZV9idWlsZGVyX2luaXQgPSBmYWxzZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGRlc2NyaXB0b3JfLT5maWVsZChpKS0+bWVzc2FnZV90eXBlKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICAhSXNSZWFsT25lb2YoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKSAmJgorICAgICAgICBIYXNIYXNiaXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKSkgeworICAgICAgbmVlZF9tYXliZV9mb3JjZV9idWlsZGVyX2luaXQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgY29uc3QgY2hhciogZm9yY2VfYnVpbGRlcl9pbml0ID0gbmVlZF9tYXliZV9mb3JjZV9idWlsZGVyX2luaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIiAgbWF5YmVGb3JjZUJ1aWxkZXJJbml0aWFsaXphdGlvbigpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiI7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiLy8gQ29uc3RydWN0IHVzaW5nICRjbGFzc25hbWUkLm5ld0J1aWxkZXIoKVxuIgorICAgICAgInByaXZhdGUgQnVpbGRlcigpIHtcbiIKKyAgICAgICIkZm9yY2VfYnVpbGRlcl9pbml0JFxuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXyksCisgICAgICAiZm9yY2VfYnVpbGRlcl9pbml0IiwgZm9yY2VfYnVpbGRlcl9pbml0KTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwcml2YXRlIEJ1aWxkZXIoXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZSR2ZXIkLkJ1aWxkZXJQYXJlbnQgcGFyZW50KSB7XG4iCisgICAgICAiICBzdXBlcihwYXJlbnQpO1xuIgorICAgICAgIiRmb3JjZV9idWlsZGVyX2luaXQkXG4iCisgICAgICAifVxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSwgInZlciIsCisgICAgICBHZW5lcmF0ZWRDb2RlVmVyc2lvblN1ZmZpeCgpLCAiZm9yY2VfYnVpbGRlcl9pbml0IiwgZm9yY2VfYnVpbGRlcl9pbml0KTsKKworICBpZiAobmVlZF9tYXliZV9mb3JjZV9idWlsZGVyX2luaXQpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInByaXZhdGUgdm9pZCBtYXliZUZvcmNlQnVpbGRlckluaXRpYWxpemF0aW9uKCkge1xuIgorICAgICAgICAiICBpZiAoY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlJHZlciRcbiIKKyAgICAgICAgIiAgICAgICAgICAuYWx3YXlzVXNlRmllbGRCdWlsZGVycykge1xuIiwKKyAgICAgICAgInZlciIsIEdlbmVyYXRlZENvZGVWZXJzaW9uU3VmZml4KCkpOworCisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICBpZiAoIUlzUmVhbE9uZW9mKGRlc2NyaXB0b3JfLT5maWVsZChpKSkpIHsKKyAgICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKKyAgICAgICAgICAgIC5HZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShwcmludGVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICB9XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICJwdWJsaWMgQnVpbGRlciBjbGVhcigpIHtcbiIKKyAgICAgICIgIHN1cGVyLmNsZWFyKCk7XG4iKTsKKworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQorICAgICAgICAuR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKHByaW50ZXIpOworICB9CisKKyAgZm9yIChhdXRvIG9uZW9mIDogb25lb2ZzXykgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiJG9uZW9mX25hbWUkQ2FzZV8gPSAwO1xuIgorICAgICAgICAiJG9uZW9mX25hbWUkXyA9IG51bGw7XG4iLAorICAgICAgICAib25lb2ZfbmFtZSIsIGNvbnRleHRfLT5HZXRPbmVvZkdlbmVyYXRvckluZm8ob25lb2YpLT5uYW1lKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICJwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yXG4iCisgICAgICAiICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRmaWxlY2xhc3MkLmludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIsCisgICAgICAiZmlsZWNsYXNzIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSwKKyAgICAgICJpZGVudGlmaWVyIiwgVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihkZXNjcmlwdG9yXykpOworCisgIC8vIExJVEUgcnVudGltZSBpbXBsZW1lbnRzIHRoaXMgaW4gR2VuZXJhdGVkTWVzc2FnZUxpdGUuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICJwdWJsaWMgJGNsYXNzbmFtZSQgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkY2xhc3NuYW1lJC5nZXREZWZhdWx0SW5zdGFuY2UoKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAicHVibGljICRjbGFzc25hbWUkIGJ1aWxkKCkge1xuIgorICAgICAgIiAgJGNsYXNzbmFtZSQgcmVzdWx0ID0gYnVpbGRQYXJ0aWFsKCk7XG4iCisgICAgICAiICBpZiAoIXJlc3VsdC5pc0luaXRpYWxpemVkKCkpIHtcbiIKKyAgICAgICIgICAgdGhyb3cgbmV3VW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24ocmVzdWx0KTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHJldHVybiByZXN1bHQ7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgInB1YmxpYyAkY2xhc3NuYW1lJCBidWlsZFBhcnRpYWwoKSB7XG4iCisgICAgICAiICAkY2xhc3NuYW1lJCByZXN1bHQgPSBuZXcgJGNsYXNzbmFtZSQodGhpcyk7XG4iLAorICAgICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBpbnQgdG90YWxCdWlsZGVyQml0cyA9IDA7CisgIGludCB0b3RhbE1lc3NhZ2VCaXRzID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3ImIGZpZWxkID0KKyAgICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSk7CisgICAgdG90YWxCdWlsZGVyQml0cyArPSBmaWVsZC5HZXROdW1CaXRzRm9yQnVpbGRlcigpOworICAgIHRvdGFsTWVzc2FnZUJpdHMgKz0gZmllbGQuR2V0TnVtQml0c0Zvck1lc3NhZ2UoKTsKKyAgfQorICBpbnQgdG90YWxCdWlsZGVySW50cyA9ICh0b3RhbEJ1aWxkZXJCaXRzICsgMzEpIC8gMzI7CisgIGludCB0b3RhbE1lc3NhZ2VJbnRzID0gKHRvdGFsTWVzc2FnZUJpdHMgKyAzMSkgLyAzMjsKKworICAvLyBMb2NhbCB2YXJzIGZvciBmcm9tIGFuZCB0byBiaXQgZmllbGRzIHRvIGF2b2lkIGFjY2Vzc2luZyB0aGUgYnVpbGRlciBhbmQKKyAgLy8gbWVzc2FnZSBvdmVyIGFuZCBvdmVyIGZvciB0aGVzZSBmaWVsZHMuIFNlZW1zIHRvIHByb3ZpZGUgYSBzbGlnaHQKKyAgLy8gcGVyZm9yYW1hbmNlIGltcHJvdmVtZW50IGluIG1pY3JvIGJlbmNobWFyayBhbmQgdGhpcyBpcyBhbHNvIHdoYXQgcHJvdG8xCisgIC8vIGNvZGUgZG9lcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbEJ1aWxkZXJJbnRzOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgiaW50IGZyb21fJGJpdF9maWVsZF9uYW1lJCA9ICRiaXRfZmllbGRfbmFtZSQ7XG4iLAorICAgICAgICAgICAgICAgICAgICJiaXRfZmllbGRfbmFtZSIsIEdldEJpdEZpZWxkTmFtZShpKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbE1lc3NhZ2VJbnRzOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgiaW50IHRvXyRiaXRfZmllbGRfbmFtZSQgPSAwO1xuIiwgImJpdF9maWVsZF9uYW1lIiwKKyAgICAgICAgICAgICAgICAgICBHZXRCaXRGaWVsZE5hbWUoaSkpOworICB9CisKKyAgLy8gT3V0cHV0IGdlbmVyYXRpb24gY29kZSBmb3IgZWFjaCBmaWVsZC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkuR2VuZXJhdGVCdWlsZGluZ0NvZGUocHJpbnRlcik7CisgIH0KKworICAvLyBDb3B5IHRoZSBiaXQgZmllbGQgcmVzdWx0cyB0byB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbE1lc3NhZ2VJbnRzOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgicmVzdWx0LiRiaXRfZmllbGRfbmFtZSQgPSB0b18kYml0X2ZpZWxkX25hbWUkO1xuIiwKKyAgICAgICAgICAgICAgICAgICAiYml0X2ZpZWxkX25hbWUiLCBHZXRCaXRGaWVsZE5hbWUoaSkpOworICB9CisKKyAgZm9yIChhdXRvIG9uZW9mIDogb25lb2ZzXykgeworICAgIHByaW50ZXItPlByaW50KCJyZXN1bHQuJG9uZW9mX25hbWUkQ2FzZV8gPSAkb25lb2ZfbmFtZSRDYXNlXztcbiIsCisgICAgICAgICAgICAgICAgICAgIm9uZW9mX25hbWUiLCBjb250ZXh0Xy0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKG9uZW9mKS0+bmFtZSk7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoIiAgb25CdWlsdCgpO1xuIik7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICByZXR1cm4gcmVzdWx0O1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOworCisgIC8vIE92ZXJyaWRlIG1ldGhvZHMgZGVjbGFyZWQgaW4gR2VuZXJhdGVkTWVzc2FnZSB0byByZXR1cm4gdGhlIGNvbmNyZXRlCisgIC8vIGdlbmVyYXRlZCB0eXBlIHNvIGNhbGxzaXRlcyB3b24ndCBkZXBlbmQgb24gR2VuZXJhdGVkTWVzc2FnZS4gVGhpcworICAvLyBpcyBuZWVkZWQgdG8ga2VlcCBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aGVuIHdlIGNoYW5nZSBnZW5lcmF0ZWQgY29kZQorICAvLyB0byBzdWJjbGFzcyBhIGRpZmZlcmVudCBHZW5lcmF0ZWRNZXNzYWdlIGNsYXNzIChlLmcuLCBpbiB2My4wLjAgcmVsZWFzZQorICAvLyB3ZSBjaGFuZ2VkIGFsbCBnZW5lcmF0ZWQgY29kZSB0byBzdWJjbGFzcyBHZW5lcmF0ZWRNZXNzYWdlVjMpLgorICBwcmludGVyLT5QcmludCgKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAicHVibGljIEJ1aWxkZXIgY2xvbmUoKSB7XG4iCisgICAgICAiICByZXR1cm4gc3VwZXIuY2xvbmUoKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgInB1YmxpYyBCdWlsZGVyIHNldEZpZWxkKFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCxcbiIKKyAgICAgICIgICAgamF2YS5sYW5nLk9iamVjdCB2YWx1ZSkge1xuIgorICAgICAgIiAgcmV0dXJuIHN1cGVyLnNldEZpZWxkKGZpZWxkLCB2YWx1ZSk7XG4iCisgICAgICAifVxuIgorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICJwdWJsaWMgQnVpbGRlciBjbGVhckZpZWxkKFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkge1xuIgorICAgICAgIiAgcmV0dXJuIHN1cGVyLmNsZWFyRmllbGQoZmllbGQpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAicHVibGljIEJ1aWxkZXIgY2xlYXJPbmVvZihcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5PbmVvZkRlc2NyaXB0b3Igb25lb2YpIHtcbiIKKyAgICAgICIgIHJldHVybiBzdXBlci5jbGVhck9uZW9mKG9uZW9mKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgInB1YmxpYyBCdWlsZGVyIHNldFJlcGVhdGVkRmllbGQoXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkLFxuIgorICAgICAgIiAgICBpbnQgaW5kZXgsIGphdmEubGFuZy5PYmplY3QgdmFsdWUpIHtcbiIKKyAgICAgICIgIHJldHVybiBzdXBlci5zZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCwgdmFsdWUpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAicHVibGljIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsXG4iCisgICAgICAiICAgIGphdmEubGFuZy5PYmplY3QgdmFsdWUpIHtcbiIKKyAgICAgICIgIHJldHVybiBzdXBlci5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7XG4iCisgICAgICAifVxuIik7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgInB1YmxpYyA8VHlwZT4gQnVpbGRlciBzZXRFeHRlbnNpb24oXG4iCisgICAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkdlbmVyYXRlZEV4dGVuc2lvbjxcbiIKKyAgICAgICAgIiAgICAgICAgJGNsYXNzbmFtZSQsIFR5cGU+IGV4dGVuc2lvbixcbiIKKyAgICAgICAgIiAgICBUeXBlIHZhbHVlKSB7XG4iCisgICAgICAgICIgIHJldHVybiBzdXBlci5zZXRFeHRlbnNpb24oZXh0ZW5zaW9uLCB2YWx1ZSk7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICJwdWJsaWMgPFR5cGU+IEJ1aWxkZXIgc2V0RXh0ZW5zaW9uKFxuIgorICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5HZW5lcmF0ZWRFeHRlbnNpb248XG4iCisgICAgICAgICIgICAgICAgICRjbGFzc25hbWUkLCBqYXZhLnV0aWwuTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLFxuIgorICAgICAgICAiICAgIGludCBpbmRleCwgVHlwZSB2YWx1ZSkge1xuIgorICAgICAgICAiICByZXR1cm4gc3VwZXIuc2V0RXh0ZW5zaW9uKGV4dGVuc2lvbiwgaW5kZXgsIHZhbHVlKTtcbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgInB1YmxpYyA8VHlwZT4gQnVpbGRlciBhZGRFeHRlbnNpb24oXG4iCisgICAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkdlbmVyYXRlZEV4dGVuc2lvbjxcbiIKKyAgICAgICAgIiAgICAgICAgJGNsYXNzbmFtZSQsIGphdmEudXRpbC5MaXN0PFR5cGU+PiBleHRlbnNpb24sXG4iCisgICAgICAgICIgICAgVHlwZSB2YWx1ZSkge1xuIgorICAgICAgICAiICByZXR1cm4gc3VwZXIuYWRkRXh0ZW5zaW9uKGV4dGVuc2lvbiwgdmFsdWUpO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAicHVibGljIDxUeXBlPiBCdWlsZGVyIGNsZWFyRXh0ZW5zaW9uKFxuIgorICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5HZW5lcmF0ZWRFeHRlbnNpb248XG4iCisgICAgICAgICIgICAgICAgICRjbGFzc25hbWUkLCA/PiBleHRlbnNpb24pIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuIHN1cGVyLmNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbik7XG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBpZiAoY29udGV4dF8tPkhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICJwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlIG90aGVyKSB7XG4iCisgICAgICAgICIgIGlmIChvdGhlciBpbnN0YW5jZW9mICRjbGFzc25hbWUkKSB7XG4iCisgICAgICAgICIgICAgcmV0dXJuIG1lcmdlRnJvbSgoJGNsYXNzbmFtZSQpb3RoZXIpO1xuIgorICAgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgICAiICAgIHN1cGVyLm1lcmdlRnJvbShvdGhlcik7XG4iCisgICAgICAgICIgICAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgIlxuIiwKKyAgICAgICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKCRjbGFzc25hbWUkIG90aGVyKSB7XG4iCisgICAgICAgIC8vIE9wdGltaXphdGlvbjogIElmIG90aGVyIGlzIHRoZSBkZWZhdWx0IGluc3RhbmNlLCB3ZSBrbm93IG5vbmUgb2YgaXRzCisgICAgICAgIC8vICAgZmllbGRzIGFyZSBzZXQgc28gd2UgY2FuIHNraXAgdGhlIG1lcmdlLgorICAgICAgICAiICBpZiAob3RoZXIgPT0gJGNsYXNzbmFtZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpIHJldHVybiB0aGlzO1xuIiwKKyAgICAgICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgaWYgKCFJc1JlYWxPbmVvZihkZXNjcmlwdG9yXy0+ZmllbGQoaSkpKSB7CisgICAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgICAgICAuR2VuZXJhdGVNZXJnaW5nQ29kZShwcmludGVyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNZXJnZSBvbmVvZiBmaWVsZHMuCisgICAgZm9yIChhdXRvIG9uZW9mIDogb25lb2ZzXykgeworICAgICAgcHJpbnRlci0+UHJpbnQoInN3aXRjaCAob3RoZXIuZ2V0JG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSgpKSB7XG4iLAorICAgICAgICAgICAgICAgICAgICAgIm9uZW9mX2NhcGl0YWxpemVkX25hbWUiLAorICAgICAgICAgICAgICAgICAgICAgY29udGV4dF8tPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhvbmVvZiktPmNhcGl0YWxpemVkX25hbWUpOworICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG9uZW9mLT5maWVsZF9jb3VudCgpOyBqKyspIHsKKyAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG9uZW9mLT5maWVsZChqKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoImNhc2UgJGZpZWxkX25hbWUkOiB7XG4iLCAiZmllbGRfbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgIFRvVXBwZXIoZmllbGQtPm5hbWUoKSkpOworICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZU1lcmdpbmdDb2RlKHByaW50ZXIpOworICAgICAgICBwcmludGVyLT5QcmludCgiYnJlYWs7XG4iKTsKKyAgICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgICAgICB9CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiY2FzZSAkY2FwX29uZW9mX25hbWUkX05PVF9TRVQ6IHtcbiIKKyAgICAgICAgICAiICBicmVhaztcbiIKKyAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAiY2FwX29uZW9mX25hbWUiLAorICAgICAgICAgIFRvVXBwZXIoY29udGV4dF8tPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhvbmVvZiktPm5hbWUpKTsKKyAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgICB9CisKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgICAvLyBpZiBtZXNzYWdlIHR5cGUgaGFzIGV4dGVuc2lvbnMKKyAgICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgICAgcHJpbnRlci0+UHJpbnQoIiAgdGhpcy5tZXJnZUV4dGVuc2lvbkZpZWxkcyhvdGhlcik7XG4iKTsKKyAgICB9CisKKyAgICBwcmludGVyLT5QcmludCgiICB0aGlzLm1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5nZXRVbmtub3duRmllbGRzKCkpO1xuIik7CisKKyAgICBwcmludGVyLT5QcmludCgiICBvbkNoYW5nZWQoKTtcbiIpOworCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiXG4iKTsKKyAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgTWVzc2FnZUJ1aWxkZXJHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlclBhcnNpbmdNZXRob2RzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICJwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCxcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCisgICAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKKyAgICAgICIgIGlmIChleHRlbnNpb25SZWdpc3RyeSA9PSBudWxsKSB7XG4iCisgICAgICAiICAgIHRocm93IG5ldyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24oKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHRyeSB7XG4iCisgICAgICAiICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlO1xuIgorICAgICAgIiAgICB3aGlsZSAoIWRvbmUpIHtcbiIKKyAgICAgICIgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpO1xuIgorICAgICAgIiAgICAgIHN3aXRjaCAodGFnKSB7XG4iCisgICAgICAiICAgICAgICBjYXNlIDA6XG4iICAvLyB6ZXJvIHNpZ25hbHMgRU9GIC8gbGltaXQgcmVhY2hlZAorICAgICAgIiAgICAgICAgICBkb25lID0gdHJ1ZTtcbiIKKyAgICAgICIgICAgICAgICAgYnJlYWs7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7ICAvLyBtZXRob2QKKyAgcHJpbnRlci0+SW5kZW50KCk7ICAvLyB0cnkKKyAgcHJpbnRlci0+SW5kZW50KCk7ICAvLyB3aGlsZQorICBwcmludGVyLT5JbmRlbnQoKTsgIC8vIHN3aXRjaAorICBHZW5lcmF0ZUJ1aWxkZXJGaWVsZFBhcnNpbmdDYXNlcyhwcmludGVyKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOyAgLy8gc3dpdGNoCisgIHByaW50ZXItPk91dGRlbnQoKTsgIC8vIHdoaWxlCisgIHByaW50ZXItPk91dGRlbnQoKTsgIC8vIHRyeQorICBwcmludGVyLT5PdXRkZW50KCk7ICAvLyBtZXRob2QKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICAgICAgICBkZWZhdWx0OiB7XG4iCisgICAgICAiICAgICAgICAgIGlmICghc3VwZXIucGFyc2VVbmtub3duRmllbGQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcpKSAiCisgICAgICAie1xuIgorICAgICAgIiAgICAgICAgICAgIGRvbmUgPSB0cnVlOyAvLyB3YXMgYW4gZW5kZ3JvdXAgdGFnXG4iCisgICAgICAiICAgICAgICAgIH1cbiIKKyAgICAgICIgICAgICAgICAgYnJlYWs7XG4iCisgICAgICAiICAgICAgICB9IC8vIGRlZmF1bHQ6XG4iCisgICAgICAiICAgICAgfSAvLyBzd2l0Y2ggKHRhZylcbiIKKyAgICAgICIgICAgfSAvLyB3aGlsZSAoIWRvbmUpXG4iCisgICAgICAiICB9IGNhdGNoIChjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7XG4iCisgICAgICAiICAgIHRocm93IGUudW53cmFwSU9FeGNlcHRpb24oKTtcbiIKKyAgICAgICIgIH0gZmluYWxseSB7XG4iCisgICAgICAiICAgIG9uQ2hhbmdlZCgpO1xuIgorICAgICAgIiAgfSAvLyBmaW5hbGx5XG4iCisgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlQnVpbGRlckdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyRmllbGRQYXJzaW5nQ2FzZXMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEZpZWxkRGVzY3JpcHRvcipbXT4gc29ydGVkX2ZpZWxkcygKKyAgICAgIFNvcnRGaWVsZHNCeU51bWJlcihkZXNjcmlwdG9yXykpOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gc29ydGVkX2ZpZWxkc1tpXTsKKyAgICBHZW5lcmF0ZUJ1aWxkZXJGaWVsZFBhcnNpbmdDYXNlKHByaW50ZXIsIGZpZWxkKTsKKyAgICBpZiAoZmllbGQtPmlzX3BhY2thYmxlKCkpIHsKKyAgICAgIEdlbmVyYXRlQnVpbGRlclBhY2tlZEZpZWxkUGFyc2luZ0Nhc2UocHJpbnRlciwgZmllbGQpOworICAgIH0KKyAgfQorfQorCit2b2lkIE1lc3NhZ2VCdWlsZGVyR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJGaWVsZFBhcnNpbmdDYXNlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHVpbnQzMl90IHRhZyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgZmllbGQtPm51bWJlcigpLCBXaXJlRm9ybWF0OjpXaXJlVHlwZUZvckZpZWxkVHlwZShmaWVsZC0+dHlwZSgpKSk7CisgIHN0ZDo6c3RyaW5nIHRhZ1N0cmluZyA9IFN0ckNhdChzdGF0aWNfY2FzdDxpbnQzMl90Pih0YWcpKTsKKyAgcHJpbnRlci0+UHJpbnQoImNhc2UgJHRhZyQ6IHtcbiIsICJ0YWciLCB0YWdTdHJpbmcpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlKHByaW50ZXIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICBicmVhaztcbiIKKyAgICAgICJ9IC8vIGNhc2UgJHRhZyRcbiIsCisgICAgICAidGFnIiwgdGFnU3RyaW5nKTsKK30KKwordm9pZCBNZXNzYWdlQnVpbGRlckdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyUGFja2VkRmllbGRQYXJzaW5nQ2FzZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAvLyBUbyBtYWtlIHBhY2tlZCA9IHRydWUgd2lyZSBjb21wYXRpYmxlLCB3ZSBnZW5lcmF0ZSBwYXJzaW5nIGNvZGUgZnJvbSBhCisgIC8vIHBhY2tlZCB2ZXJzaW9uIG9mIHRoaXMgZmllbGQgcmVnYXJkbGVzcyBvZiBmaWVsZC0+b3B0aW9ucygpLnBhY2tlZCgpLgorICB1aW50MzJfdCB0YWcgPSBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKKyAgICAgIGZpZWxkLT5udW1iZXIoKSwgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICBzdGQ6OnN0cmluZyB0YWdTdHJpbmcgPSBTdHJDYXQoc3RhdGljX2Nhc3Q8aW50MzJfdD4odGFnKSk7CisgIHByaW50ZXItPlByaW50KCJjYXNlICR0YWckOiB7XG4iLCAidGFnIiwgdGFnU3RyaW5nKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nQ29kZUZyb21QYWNrZWQocHJpbnRlcik7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIGJyZWFrO1xuIgorICAgICAgIn0gLy8gY2FzZSAkdGFnJFxuIiwKKyAgICAgICJ0YWciLCB0YWdTdHJpbmcpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgTWVzc2FnZUJ1aWxkZXJHZW5lcmF0b3I6OkdlbmVyYXRlSXNJbml0aWFsaXplZChpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAicHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICAvLyBDaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgaW4gdGhpcyBtZXNzYWdlIGFyZSBzZXQuCisgIC8vIFRPRE8oa2VudG9uKTogIFdlIGNhbiBvcHRpbWl6ZSB0aGlzIHdoZW4gd2Ugc3dpdGNoIHRvIHB1dHRpbmcgYWxsIHRoZQorICAvLyAgICJoYXMiIGZpZWxkcyBpbnRvIGEgc2luZ2xlIGJpdGZpZWxkLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbyA9IGNvbnRleHRfLT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZmllbGQpOworCisgICAgaWYgKGZpZWxkLT5pc19yZXF1aXJlZCgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiaWYgKCFoYXMkbmFtZSQoKSkge1xuIgorICAgICAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAibmFtZSIsIGluZm8tPmNhcGl0YWxpemVkX25hbWUpOworICAgIH0KKyAgfQorCisgIC8vIE5vdyBjaGVjayB0aGF0IGFsbCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgY29uc3QgRmllbGRHZW5lcmF0b3JJbmZvKiBpbmZvID0gY29udGV4dF8tPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhmaWVsZCk7CisgICAgaWYgKEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9NRVNTQUdFICYmCisgICAgICAgIEhhc1JlcXVpcmVkRmllbGRzKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSkpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPmxhYmVsKCkpIHsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUVVJUkVEOgorICAgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICAgICAiaWYgKCFnZXQkbmFtZSQoKS5pc0luaXRpYWxpemVkKCkpIHtcbiIKKyAgICAgICAgICAgICAgIiAgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICAgInR5cGUiLAorICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSksCisgICAgICAgICAgICAgICJuYW1lIiwgaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTDoKKyAgICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAgICAgImlmIChoYXMkbmFtZSQoKSkge1xuIgorICAgICAgICAgICAgICAiICBpZiAoIWdldCRuYW1lJCgpLmlzSW5pdGlhbGl6ZWQoKSkge1xuIgorICAgICAgICAgICAgICAiICAgIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICAgIm5hbWUiLCBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEOgorICAgICAgICAgIGlmIChJc01hcEVudHJ5KGZpZWxkLT5tZXNzYWdlX3R5cGUoKSkpIHsKKyAgICAgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICAgICAgICJmb3IgKCR0eXBlJCBpdGVtIDogZ2V0JG5hbWUkTWFwKCkudmFsdWVzKCkpIHtcbiIKKyAgICAgICAgICAgICAgICAiICBpZiAoIWl0ZW0uaXNJbml0aWFsaXplZCgpKSB7XG4iCisgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gZmFsc2U7XG4iCisgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgICAgICJ0eXBlIiwKKyAgICAgICAgICAgICAgICBNYXBWYWx1ZUltbXV0YWJsZUNsYXNzZE5hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXyksCisgICAgICAgICAgICAgICAgIm5hbWUiLCBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgZ2V0JG5hbWUkQ291bnQoKTsgaSsrKSB7XG4iCisgICAgICAgICAgICAgICAgIiAgaWYgKCFnZXQkbmFtZSQoaSkuaXNJbml0aWFsaXplZCgpKSB7XG4iCisgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gZmFsc2U7XG4iCisgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgICAgICJ0eXBlIiwKKyAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSksCisgICAgICAgICAgICAgICAgIm5hbWUiLCBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImlmICghZXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKCkpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgICAifVxuIik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICByZXR1cm4gdHJ1ZTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2J1aWxkZXIuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2J1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjcxYjhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlci5oCkBAIC0wLDAgKzEsOTUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGR3ZWlzQGdvb2dsZS5jb20gKERhbmllbCBXZWlzKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUVTU0FHRV9CVUlMREVSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0JVSUxERVJfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKK2NsYXNzIENvbnRleHQ7ICAgICAgICAgICAgLy8gY29udGV4dC5oCitjbGFzcyBDbGFzc05hbWVSZXNvbHZlcjsgIC8vIG5hbWVfcmVzb2x2ZXIuaAorfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorbmFtZXNwYWNlIGlvIHsKK2NsYXNzIFByaW50ZXI7ICAvLyBwcmludGVyLmgKK30KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitjbGFzcyBNZXNzYWdlQnVpbGRlckdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBNZXNzYWdlQnVpbGRlckdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KTsKKyAgdmlydHVhbCB+TWVzc2FnZUJ1aWxkZXJHZW5lcmF0b3IoKTsKKworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgcHJpdmF0ZToKKyAgdm9pZCBHZW5lcmF0ZUNvbW1vbkJ1aWxkZXJNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZURlc2NyaXB0b3JNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyRmllbGRQYXJzaW5nQ2FzZXMoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlQnVpbGRlckZpZWxkUGFyc2luZ0Nhc2UoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJQYWNrZWRGaWVsZFBhcnNpbmdDYXNlKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisgIHZvaWQgR2VuZXJhdGVJc0luaXRpYWxpemVkKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgQ29udGV4dCogY29udGV4dF87CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKKyAgRmllbGRHZW5lcmF0b3JNYXA8SW1tdXRhYmxlRmllbGRHZW5lcmF0b3I+IGZpZWxkX2dlbmVyYXRvcnNfOworICBzdGQ6OnNldDxjb25zdCBPbmVvZkRlc2NyaXB0b3IqPiBvbmVvZnNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXNzYWdlQnVpbGRlckdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0JVSUxERVJfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZV9idWlsZGVyX2xpdGUuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZV9idWlsZGVyX2xpdGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2Zjk0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2J1aWxkZXJfbGl0ZS5jYwpAQCAtMCwwICsxLDE1NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogZHdlaXNAZ29vZ2xlLmNvbSAoRGFuaWVsIFdlaXMpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlcl9saXRlLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZW51bS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvcl9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL25hbWVfcmVzb2x2ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorCisvLyBNdXN0IGJlIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworTWVzc2FnZUJ1aWxkZXJMaXRlR2VuZXJhdG9yOjpNZXNzYWdlQnVpbGRlckxpdGVHZW5lcmF0b3IoCisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgQ29udGV4dCogY29udGV4dCkKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgICAgY29udGV4dF8oY29udGV4dCksCisgICAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSksCisgICAgICBmaWVsZF9nZW5lcmF0b3JzXyhkZXNjcmlwdG9yLCBjb250ZXh0XykgeworICBHT09HTEVfQ0hFQ0soIUhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3ItPmZpbGUoKSwgY29udGV4dC0+RW5mb3JjZUxpdGUoKSkpCisgICAgICA8PCAiR2VuZXJhdG9yIGZhY3RvcnkgZXJyb3I6IEEgbGl0ZSBtZXNzYWdlIGdlbmVyYXRvciBpcyB1c2VkIHRvICIKKyAgICAgICAgICJnZW5lcmF0ZSBub24tbGl0ZSBtZXNzYWdlcy4iOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoSXNSZWFsT25lb2YoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKSkgeworICAgICAgb25lb2ZzXy5pbnNlcnQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpLT5jb250YWluaW5nX29uZW9mKCkpOworICAgIH0KKyAgfQorfQorCitNZXNzYWdlQnVpbGRlckxpdGVHZW5lcmF0b3I6On5NZXNzYWdlQnVpbGRlckxpdGVHZW5lcmF0b3IoKSB7fQorCit2b2lkIE1lc3NhZ2VCdWlsZGVyTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgV3JpdGVNZXNzYWdlRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciBleHRlbmRzXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGUuJGV4dGVuZGlibGUkQnVpbGRlcjxcbiIKKyAgICAgICIgICAgICAkY2xhc3NuYW1lJCwgQnVpbGRlcj4gaW1wbGVtZW50c1xuIgorICAgICAgIiAgICAkZXh0cmFfaW50ZXJmYWNlcyRcbiIKKyAgICAgICIgICAgJGNsYXNzbmFtZSRPckJ1aWxkZXIge1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSwKKyAgICAgICJleHRyYV9pbnRlcmZhY2VzIiwgRXh0cmFCdWlsZGVySW50ZXJmYWNlcyhkZXNjcmlwdG9yXyksICJleHRlbmRpYmxlIiwKKyAgICAgIGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDAgPyAiRXh0ZW5kYWJsZSIgOiAiIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIEdlbmVyYXRlQ29tbW9uQnVpbGRlck1ldGhvZHMocHJpbnRlcik7CisKKyAgLy8gb25lb2YKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzOworICBmb3IgKGF1dG8gb25lb2YgOiBvbmVvZnNfKSB7CisgICAgdmFyc1sib25lb2ZfbmFtZSJdID0gY29udGV4dF8tPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhvbmVvZiktPm5hbWU7CisgICAgdmFyc1sib25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSJdID0KKyAgICAgICAgY29udGV4dF8tPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhvbmVvZiktPmNhcGl0YWxpemVkX25hbWU7CisgICAgdmFyc1sib25lb2ZfaW5kZXgiXSA9IFN0ckNhdChvbmVvZi0+aW5kZXgoKSk7CisKKyAgICAvLyBvbmVvZkNhc2UoKSBhbmQgY2xlYXJPbmVvZigpCisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAgICJwdWJsaWMgJG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgZ2V0JG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gaW5zdGFuY2UuZ2V0JG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSgpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICJwdWJsaWMgQnVpbGRlciBjbGVhciRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICAgICAgICAgICIgIGluc3RhbmNlLmNsZWFyJG9uZW9mX2NhcGl0YWxpemVkX25hbWUkKCk7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgIC5HZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiXG4iCisgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGJ1aWxkZXJfc2NvcGU6JGZ1bGxfbmFtZSQpXG4iLAorICAgICAgImZ1bGxfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBNZXNzYWdlQnVpbGRlckxpdGVHZW5lcmF0b3I6OkdlbmVyYXRlQ29tbW9uQnVpbGRlck1ldGhvZHMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiLy8gQ29uc3RydWN0IHVzaW5nICRjbGFzc25hbWUkLm5ld0J1aWxkZXIoKVxuIgorICAgICAgInByaXZhdGUgQnVpbGRlcigpIHtcbiIKKyAgICAgICIgIHN1cGVyKERFRkFVTFRfSU5TVEFOQ0UpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlcl9saXRlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZV9idWlsZGVyX2xpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg5NWZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlcl9saXRlLmgKQEAgLTAsMCArMSw4NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogZHdlaXNAZ29vZ2xlLmNvbSAoRGFuaWVsIFdlaXMpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0JVSUxERVJfTElURV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUVTU0FHRV9CVUlMREVSX0xJVEVfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKK2NsYXNzIENvbnRleHQ7ICAgICAgICAgICAgLy8gY29udGV4dC5oCitjbGFzcyBDbGFzc05hbWVSZXNvbHZlcjsgIC8vIG5hbWVfcmVzb2x2ZXIuaAorfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorbmFtZXNwYWNlIGlvIHsKK2NsYXNzIFByaW50ZXI7ICAvLyBwcmludGVyLmgKK30KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitjbGFzcyBNZXNzYWdlQnVpbGRlckxpdGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTWVzc2FnZUJ1aWxkZXJMaXRlR2VuZXJhdG9yKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KTsKKyAgdmlydHVhbCB+TWVzc2FnZUJ1aWxkZXJMaXRlR2VuZXJhdG9yKCk7CisKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworIHByaXZhdGU6CisgIHZvaWQgR2VuZXJhdGVDb21tb25CdWlsZGVyTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIENvbnRleHQqIGNvbnRleHRfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CisgIEZpZWxkR2VuZXJhdG9yTWFwPEltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvcj4gZmllbGRfZ2VuZXJhdG9yc187CisgIHN0ZDo6c2V0PGNvbnN0IE9uZW9mRGVzY3JpcHRvcio+IG9uZW9mc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2VCdWlsZGVyTGl0ZUdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0JVSUxERVJfTElURV9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2ZpZWxkLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjMzcyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2ZpZWxkLmNjCkBAIC0wLDAgKzEsMTQ4MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZV9maWVsZC5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZV9yZXNvbHZlci5oPgorCisvLyBNdXN0IGJlIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworCituYW1lc3BhY2UgeworCit2b2lkIFNldE1lc3NhZ2VWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgdmFyaWFibGVzKTsKKworICAoKnZhcmlhYmxlcylbInR5cGUiXSA9CisgICAgICBuYW1lX3Jlc29sdmVyLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAoKnZhcmlhYmxlcylbImt0X3R5cGUiXSA9ICgqdmFyaWFibGVzKVsidHlwZSJdOworICAoKnZhcmlhYmxlcylbIm11dGFibGVfdHlwZSJdID0KKyAgICAgIG5hbWVfcmVzb2x2ZXItPkdldE11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAoKnZhcmlhYmxlcylbImdyb3VwX29yX21lc3NhZ2UiXSA9CisgICAgICAoR2V0VHlwZShkZXNjcmlwdG9yKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApID8gIkdyb3VwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJNZXNzYWdlIjsKKyAgLy8gVE9ETyhiaXJkbyk6IEFkZCBAZGVwcmVjYXRlZCBqYXZhZG9jIHdoZW4gZ2VuZXJhdGluZyBqYXZhZG9jIGlzIHN1cHBvcnRlZAorICAvLyBieSB0aGUgcHJvdG8gY29tcGlsZXIKKyAgKCp2YXJpYWJsZXMpWyJkZXByZWNhdGlvbiJdID0KKyAgICAgIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkICIgOiAiIjsKKyAgKCp2YXJpYWJsZXMpWyJrdF9kZXByZWNhdGlvbiJdID0KKyAgICAgIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkKKyAgICAgICAgICA/ICJAa290bGluLkRlcHJlY2F0ZWQobWVzc2FnZSA9IFwiRmllbGQgIiArICgqdmFyaWFibGVzKVsibmFtZSJdICsKKyAgICAgICAgICAgICAgICAiIGlzIGRlcHJlY2F0ZWRcIikgIgorICAgICAgICAgIDogIiI7CisgICgqdmFyaWFibGVzKVsib25fY2hhbmdlZCJdID0gIm9uQ2hhbmdlZCgpOyI7CisgICgqdmFyaWFibGVzKVsidmVyIl0gPSBHZW5lcmF0ZWRDb2RlVmVyc2lvblN1ZmZpeCgpOworICAoKnZhcmlhYmxlcylbImdldF9wYXJzZXIiXSA9CisgICAgICBFeHBvc2VQdWJsaWNQYXJzZXIoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCktPmZpbGUoKSkgPyAiUEFSU0VSIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInBhcnNlcigpIjsKKworICBpZiAoSGFzSGFzYml0KGRlc2NyaXB0b3IpKSB7CisgICAgLy8gRm9yIHNpbmd1bGFyIG1lc3NhZ2VzIGFuZCBidWlsZGVycywgb25lIGJpdCBpcyB1c2VkIGZvciB0aGUgaGFzRmllbGQgYml0LgorICAgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0gR2VuZXJhdGVHZXRCaXQobWVzc2FnZUJpdEluZGV4KTsKKyAgICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlR2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisKKyAgICAvLyBOb3RlIHRoYXQgdGhlc2UgaGF2ZSBhIHRyYWlsaW5nICI7Ii4KKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9CisgICAgICAgIEdlbmVyYXRlU2V0Qml0KG1lc3NhZ2VCaXRJbmRleCkgKyAiOyI7CisgICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPQorICAgICAgICBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpICsgIjsiOworICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPQorICAgICAgICBHZW5lcmF0ZUNsZWFyQml0KGJ1aWxkZXJCaXRJbmRleCkgKyAiOyI7CisKKyAgICAoKnZhcmlhYmxlcylbImlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSJdID0gR2VuZXJhdGVHZXRCaXQobWVzc2FnZUJpdEluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9ICIiOworICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gIiI7CisgICAgKCp2YXJpYWJsZXMpWyJjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9ICIiOworCisgICAgKCp2YXJpYWJsZXMpWyJpc19maWVsZF9wcmVzZW50X21lc3NhZ2UiXSA9CisgICAgICAgICgqdmFyaWFibGVzKVsibmFtZSJdICsgIl8gIT0gbnVsbCI7CisgIH0KKworICAvLyBGb3IgcmVwZWF0ZWQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3Igd2hldGhlciB0aGUgYXJyYXkgaXMgaW1tdXRhYmxlLgorICAoKnZhcmlhYmxlcylbImdldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbImNsZWFyX211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KTsKKworICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwiXSA9CisgICAgICBHZW5lcmF0ZUdldEJpdEZyb21Mb2NhbChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsIl0gPQorICAgICAgR2VuZXJhdGVTZXRCaXRUb0xvY2FsKG1lc3NhZ2VCaXRJbmRleCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6SW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICBDb250ZXh0KiBjb250ZXh0KQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7CisgIFNldE1lc3NhZ2VWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGRlc2NyaXB0b3IpLAorICAgICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLCAmdmFyaWFibGVzXyk7Cit9CisKK0ltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6fkltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpIHt9CisKK2ludCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworICByZXR1cm4gSGFzSGFzYml0KGRlc2NyaXB0b3JfKSA/IDEgOiAwOworfQorCitpbnQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IHsKKyAgcmV0dXJuIEdldE51bUJpdHNGb3JNZXNzYWdlKCk7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gVE9ETyhqb25wKTogSW4gdGhlIGZ1dHVyZSwgY29uc2lkZXIgaGF2aW5nIGEgbWV0aG9kIHNwZWNpZmljIHRvIHRoZQorICAvLyBpbnRlcmZhY2Ugc28gdGhhdCBidWlsZGVycyBjYW4gY2hvb3NlIGR5bmFtaWNhbGx5IHRvIGVpdGhlciByZXR1cm4gYQorICAvLyBtZXNzYWdlIG9yIGEgbmVzdGVkIGJ1aWxkZXIsIHNvIHRoYXQgYXNraW5nIGZvciB0aGUgaW50ZXJmYWNlIGRvZXNuJ3QKKyAgLy8gY2F1c2UgYSBtZXNzYWdlIHRvIGV2ZXIgYmUgYnVpbHQuCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkZGVwcmVjYXRpb24kYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJGRlcHJlY2F0aW9uJCR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiQkdHlwZSRPckJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyKCk7XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAicHJpdmF0ZSAkdHlwZSQgJG5hbWUkXztcbiIpOworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworCisgIGlmIChIYXNIYXNiaXQoZGVzY3JpcHRvcl8pKSB7CisgICAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgSEFaWkVSKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiAkeyRoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQ7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEdFVFRFUik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICIgIHJldHVybiAkbmFtZSRfID09IG51bGwgPyAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkgOiAkbmFtZSRfO1xuIgorICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkT3JCdWlsZGVyICIKKyAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlciR9JCgpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRuYW1lJF8gPT0gbnVsbCA/ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSA6ICRuYW1lJF87XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICB9IGVsc2UgeworICAgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAiICByZXR1cm4gJG5hbWUkXyAhPSBudWxsO1xuIgorICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAiICByZXR1cm4gJG5hbWUkXyA9PSBudWxsID8gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpIDogJG5hbWUkXztcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciAiCisgICAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlciR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OlByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgY2hhciogcmVndWxhcl9jYXNlLAorICAgIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgImlmICgkbmFtZSRCdWlsZGVyXyA9PSBudWxsKSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIHJlZ3VsYXJfY2FzZSk7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn0gZWxzZSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIG5lc3RlZF9idWlsZGVyX2Nhc2UpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OlByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBjaGFyKiBtZXRob2RfcHJvdG90eXBlLAorICAgIGNvbnN0IGNoYXIqIHJlZ3VsYXJfY2FzZSwgY29uc3QgY2hhciogbmVzdGVkX2J1aWxkZXJfY2FzZSwKKyAgICBjb25zdCBjaGFyKiB0cmFpbGluZ19jb2RlKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIG1ldGhvZF9wcm90b3R5cGUpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCgiIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgUHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKHByaW50ZXIsIHJlZ3VsYXJfY2FzZSwgbmVzdGVkX2J1aWxkZXJfY2FzZSk7CisgIGlmICh0cmFpbGluZ19jb2RlICE9IE5VTEwpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCB0cmFpbGluZ19jb2RlKTsKKyAgfQorICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlck1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gV2hlbiB1c2luZyBuZXN0ZWQtYnVpbGRlcnMsIHRoZSBjb2RlIGluaXRpYWxseSB3b3JrcyBqdXN0IGxpa2UgdGhlCisgIC8vIG5vbi1uZXN0ZWQgYnVpbGRlciBjYXNlLiBJdCBvbmx5IGNyZWF0ZXMgYSBuZXN0ZWQgYnVpbGRlciBsYXppbHkgb24KKyAgLy8gZGVtYW5kIGFuZCB0aGVuIGZvcmV2ZXIgZGVsZWdhdGVzIHRvIGl0IGFmdGVyIGNyZWF0aW9uLgorCisgIGJvb2wgaGFzX2hhc2JpdCA9IEhhc0hhc2JpdChkZXNjcmlwdG9yXyk7CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInByaXZhdGUgJHR5cGUkICRuYW1lJF87XG4iKTsKKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGJ1aWxkZXIgaXMgbm9uLW51bGwsIGl0IGlzIHVzZWQgYW5kIHRoZSBvdGhlciBmaWVsZHMKKyAgICAgICAgICAgICAgICAgLy8gYXJlIGlnbm9yZWQuCisgICAgICAgICAgICAgICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuU2luZ2xlRmllbGRCdWlsZGVyJHZlciQ8XG4iCisgICAgICAgICAgICAgICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiAkbmFtZSRCdWlsZGVyXzsiCisgICAgICAgICAgICAgICAgICJcbiIpOworCisgIC8vIFRoZSBjb21tZW50cyBhYm92ZSB0aGUgbWV0aG9kcyBiZWxvdyBhcmUgYmFzZWQgb24gYSBoeXBvdGhldGljYWwKKyAgLy8gZmllbGQgb2YgdHlwZSAiRmllbGQiIGNhbGxlZCAiRmllbGQiLgorCisgIC8vIGJvb2xlYW4gaGFzRmllbGQoKQorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICBpZiAoaGFzX2hhc2JpdCkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuICR7JGhhcyRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAiICByZXR1cm4gJG5hbWUkQnVpbGRlcl8gIT0gbnVsbCB8fCAkbmFtZSRfICE9IG51bGw7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICB9CisKKyAgLy8gRmllbGQgZ2V0RmllbGQoKQorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbigKKyAgICAgIHByaW50ZXIsICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSIsCisgICAgICAicmV0dXJuICRuYW1lJF8gPT0gbnVsbCA/ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSA6ICRuYW1lJF87XG4iLAorICAgICAgInJldHVybiAkbmFtZSRCdWlsZGVyXy5nZXRNZXNzYWdlKCk7XG4iLCBOVUxMKTsKKworICAvLyBGaWVsZC5CdWlsZGVyIHNldEZpZWxkKEZpZWxkIHZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKAorICAgICAgcHJpbnRlciwKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCR0eXBlJCB2YWx1ZSkiLAorCisgICAgICAiaWYgKHZhbHVlID09IG51bGwpIHtcbiIKKyAgICAgICIgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICIkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgICAiJG9uX2NoYW5nZWQkXG4iLAorCisgICAgICAiJG5hbWUkQnVpbGRlcl8uc2V0TWVzc2FnZSh2YWx1ZSk7XG4iLAorCisgICAgICAiJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iCisgICAgICAicmV0dXJuIHRoaXM7XG4iKTsKKworICAvLyBGaWVsZC5CdWlsZGVyIHNldEZpZWxkKEZpZWxkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKAorICAgICAgcHJpbnRlciwKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKFxuIgorICAgICAgIiAgICAkdHlwZSQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIiwKKworICAgICAgIiRuYW1lJF8gPSBidWlsZGVyRm9yVmFsdWUuYnVpbGQoKTtcbiIKKyAgICAgICIkb25fY2hhbmdlZCRcbiIsCisKKyAgICAgICIkbmFtZSRCdWlsZGVyXy5zZXRNZXNzYWdlKGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpKTtcbiIsCisKKyAgICAgICIkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKKyAgICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEZpZWxkLkJ1aWxkZXIgbWVyZ2VGaWVsZChGaWVsZCB2YWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbigKKyAgICAgIHByaW50ZXIsCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JG1lcmdlJGNhcGl0YWxpemVkX25hbWUkJH0kKCR0eXBlJCB2YWx1ZSkiLAorCisgICAgICBoYXNfaGFzYml0CisgICAgICAgICAgPyAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJCAmJlxuIgorICAgICAgICAgICAgIiAgICAkbmFtZSRfICE9IG51bGwgJiZcbiIKKyAgICAgICAgICAgICIgICAgJG5hbWUkXyAhPSAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpIHtcbiIKKyAgICAgICAgICAgICIgICRuYW1lJF8gPVxuIgorICAgICAgICAgICAgIiAgICAkdHlwZSQubmV3QnVpbGRlcigkbmFtZSRfKS5tZXJnZUZyb20odmFsdWUpLmJ1aWxkUGFydGlhbCgpO1xuIgorICAgICAgICAgICAgIn0gZWxzZSB7XG4iCisgICAgICAgICAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgIiRvbl9jaGFuZ2VkJFxuIgorICAgICAgICAgIDogImlmICgkbmFtZSRfICE9IG51bGwpIHtcbiIKKyAgICAgICAgICAgICIgICRuYW1lJF8gPVxuIgorICAgICAgICAgICAgIiAgICAkdHlwZSQubmV3QnVpbGRlcigkbmFtZSRfKS5tZXJnZUZyb20odmFsdWUpLmJ1aWxkUGFydGlhbCgpO1xuIgorICAgICAgICAgICAgIn0gZWxzZSB7XG4iCisgICAgICAgICAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICAgIiRuYW1lJEJ1aWxkZXJfLm1lcmdlRnJvbSh2YWx1ZSk7XG4iLAorCisgICAgICAiJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iCisgICAgICAicmV0dXJuIHRoaXM7XG4iKTsKKworICAvLyBGaWVsZC5CdWlsZGVyIGNsZWFyRmllbGQoKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKAorICAgICAgcHJpbnRlciwgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIiwKKworICAgICAgIiRuYW1lJF8gPSBudWxsO1xuIgorICAgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICAgaGFzX2hhc2JpdCA/ICIkbmFtZSRCdWlsZGVyXy5jbGVhcigpO1xuIgorICAgICAgICAgICAgICAgICA6ICIkbmFtZSRfID0gbnVsbDtcbiIKKyAgICAgICAgICAgICAgICAgICAiJG5hbWUkQnVpbGRlcl8gPSBudWxsO1xuIiwKKworICAgICAgIiRjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iCisgICAgICAicmV0dXJuIHRoaXM7XG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJC5CdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJEJ1aWxkZXIkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIgorICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpLmdldEJ1aWxkZXIoKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciAiCisgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGlmICgkbmFtZSRCdWlsZGVyXyAhPSBudWxsKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuICRuYW1lJEJ1aWxkZXJfLmdldE1lc3NhZ2VPckJ1aWxkZXIoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gJG5hbWUkXyA9PSBudWxsID9cbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpIDogJG5hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5TaW5nbGVGaWVsZEJ1aWxkZXIkdmVyJDxcbiIKKyAgICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiBcbiIKKyAgICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkge1xuIgorICAgICAgIiAgaWYgKCRuYW1lJEJ1aWxkZXJfID09IG51bGwpIHtcbiIKKyAgICAgICIgICAgJG5hbWUkQnVpbGRlcl8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5TaW5nbGVGaWVsZEJ1aWxkZXIkdmVyJDxcbiIKKyAgICAgICIgICAgICAgICR0eXBlJCwgJHR5cGUkLkJ1aWxkZXIsICR0eXBlJE9yQnVpbGRlcj4oXG4iCisgICAgICAiICAgICAgICAgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCksXG4iCisgICAgICAiICAgICAgICAgICAgZ2V0UGFyZW50Rm9yQ2hpbGRyZW4oKSxcbiIKKyAgICAgICIgICAgICAgICAgICBpc0NsZWFuKCkpO1xuIgorICAgICAgIiAgICAkbmFtZSRfID0gbnVsbDtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRCdWlsZGVyXztcbiIKKyAgICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlS290bGluRHNsTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIka3RfZGVwcmVjYXRpb24kdmFyICRrdF9uYW1lJDogJGt0X3R5cGUkXG4iCisgICAgICAgICAgICAgICAgICIgIEBKdm1OYW1lKFwiJHskZ2V0JGt0X2NhcGl0YWxpemVkX25hbWUkJH0kXCIpXG4iCisgICAgICAgICAgICAgICAgICIgIGdldCgpID0gJGt0X2RzbF9idWlsZGVyJC4keyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKVxuIgorICAgICAgICAgICAgICAgICAiICBASnZtTmFtZShcIiR7JHNldCRrdF9jYXBpdGFsaXplZF9uYW1lJCR9JFwiKVxuIgorICAgICAgICAgICAgICAgICAiICBzZXQodmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAka3RfZHNsX2J1aWxkZXIkLiR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JCh2YWx1ZSlcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImZ1biAkeyRjbGVhciRrdF9jYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJGt0X2RzbF9idWlsZGVyJC4keyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpXG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiZnVuICR7JGhhcyRrdF9jYXBpdGFsaXplZF9uYW1lJCR9JCgpOiBrb3RsaW4uQm9vbGVhbiB7XG4iCisgICAgICAiICByZXR1cm4gJGt0X2RzbF9idWlsZGVyJC4keyRoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKVxuIgorICAgICAgIn1cbiIpOworCisgIEdlbmVyYXRlS290bGluT3JOdWxsKHByaW50ZXIpOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVLb3RsaW5Pck51bGwoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKGRlc2NyaXB0b3JfLT5oYXNfb3B0aW9uYWxfa2V5d29yZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAidmFsICRjbGFzc25hbWUkS3QuRHNsLiRuYW1lJE9yTnVsbDogJGt0X3R5cGUkP1xuIgorICAgICAgICAgICAgICAgICAgICIgIGdldCgpID0gJGt0X2RzbF9idWlsZGVyJC4kbmFtZSRPck51bGxcbiIpOworICB9Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoSGFzSGFzYml0KGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKTtcbiIpOworICB9Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qge30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoSGFzSGFzYml0KGRlc2NyaXB0b3JfKSkgeworICAgIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLCAiJG5hbWUkXyA9IG51bGw7XG4iLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkbmFtZSRCdWlsZGVyXy5jbGVhcigpO1xuIik7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24ocHJpbnRlciwgIiRuYW1lJF8gPSBudWxsO1xuIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJG5hbWUkXyA9IG51bGw7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkbmFtZSRCdWlsZGVyXyA9IG51bGw7XG4iKTsKKyAgfQorfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZXJnaW5nQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiaWYgKG90aGVyLmhhcyRjYXBpdGFsaXplZF9uYW1lJCgpKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIG1lcmdlJGNhcGl0YWxpemVkX25hbWUkKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGluZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKEhhc0hhc2JpdChkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsJCkge1xuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgUHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKHByaW50ZXIsICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzdWx0LiRuYW1lJF8gPSAkbmFtZSRCdWlsZGVyXy5idWlsZCgpO1xuIik7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsJDtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgUHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKHByaW50ZXIsICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzdWx0LiRuYW1lJF8gPSAkbmFtZSRCdWlsZGVyXy5idWlsZCgpO1xuIik7CisgIH0KK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChHZXRUeXBlKGRlc2NyaXB0b3JfKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJpbnB1dC5yZWFkR3JvdXAoJG51bWJlciQsXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKS5nZXRCdWlsZGVyKCksXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBleHRlbnNpb25SZWdpc3RyeSk7XG4iCisgICAgICAgICAgICAgICAgICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiaW5wdXQucmVhZE1lc3NhZ2UoXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKS5nZXRCdWlsZGVyKCksXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBleHRlbnNpb25SZWdpc3RyeSk7XG4iCisgICAgICAgICAgICAgICAgICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIik7CisgIH0KK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgImlmICgkaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlJCkge1xuIgorICAgICAgIiAgb3V0cHV0LndyaXRlJGdyb3VwX29yX21lc3NhZ2UkKCRudW1iZXIkLCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiaWYgKCRpc19maWVsZF9wcmVzZW50X21lc3NhZ2UkKSB7XG4iCisgICAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAgICIgICAgLmNvbXB1dGUkZ3JvdXBfb3JfbWVzc2FnZSRTaXplKCRudW1iZXIkLCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUVxdWFsc0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImlmICghZ2V0JGNhcGl0YWxpemVkX25hbWUkKClcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAuZXF1YWxzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKSkgcmV0dXJuIGZhbHNlO1xuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUhhc2hDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJoYXNoID0gKDM3ICogaGFzaCkgKyAkY29uc3RhbnRfbmFtZSQ7XG4iCisgICAgICAgICAgICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5oYXNoQ29kZSgpO1xuIik7Cit9CisKK3N0ZDo6c3RyaW5nIEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjpJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgQ29udGV4dCogY29udGV4dCkKKyAgICA6IEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KSB7CisgIGNvbnN0IE9uZW9mR2VuZXJhdG9ySW5mbyogaW5mbyA9CisgICAgICBjb250ZXh0LT5HZXRPbmVvZkdlbmVyYXRvckluZm8oZGVzY3JpcHRvci0+Y29udGFpbmluZ19vbmVvZigpKTsKKyAgU2V0Q29tbW9uT25lb2ZWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgJnZhcmlhYmxlc18pOworfQorCitJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6fkltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEdFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgcmV0dXJuICgkdHlwZSQpICRvbmVvZl9uYW1lJF87XG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkT3JCdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlciR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICAgICAgICAgICAgICAiICAgICByZXR1cm4gKCR0eXBlJCkgJG9uZW9mX25hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlck1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gV2hlbiB1c2luZyBuZXN0ZWQtYnVpbGRlcnMsIHRoZSBjb2RlIGluaXRpYWxseSB3b3JrcyBqdXN0IGxpa2UgdGhlCisgIC8vIG5vbi1uZXN0ZWQgYnVpbGRlciBjYXNlLiBJdCBvbmx5IGNyZWF0ZXMgYSBuZXN0ZWQgYnVpbGRlciBsYXppbHkgb24KKyAgLy8gZGVtYW5kIGFuZCB0aGVuIGZvcmV2ZXIgZGVsZWdhdGVzIHRvIGl0IGFmdGVyIGNyZWF0aW9uLgorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGJ1aWxkZXIgaXMgbm9uLW51bGwsIGl0IGlzIHVzZWQgYW5kIHRoZSBvdGhlciBmaWVsZHMKKyAgICAgICAgICAgICAgICAgLy8gYXJlIGlnbm9yZWQuCisgICAgICAgICAgICAgICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuU2luZ2xlRmllbGRCdWlsZGVyJHZlciQ8XG4iCisgICAgICAgICAgICAgICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiAkbmFtZSRCdWlsZGVyXzsiCisgICAgICAgICAgICAgICAgICJcbiIpOworCisgIC8vIFRoZSBjb21tZW50cyBhYm92ZSB0aGUgbWV0aG9kcyBiZWxvdyBhcmUgYmFzZWQgb24gYSBoeXBvdGhldGljYWwKKyAgLy8gZmllbGQgb2YgdHlwZSAiRmllbGQiIGNhbGxlZCAiRmllbGQiLgorCisgIC8vIGJvb2xlYW4gaGFzRmllbGQoKQorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuICR7JGhhcyRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIC8vIEZpZWxkIGdldEZpZWxkKCkKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24oCisgICAgICBwcmludGVyLAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSIsCisKKyAgICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAiICByZXR1cm4gKCR0eXBlJCkgJG9uZW9mX25hbWUkXztcbiIKKyAgICAgICJ9XG4iCisgICAgICAicmV0dXJuICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKTtcbiIsCisKKyAgICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZSgpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJyZXR1cm4gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpO1xuIiwKKworICAgICAgTlVMTCk7CisKKyAgLy8gRmllbGQuQnVpbGRlciBzZXRGaWVsZChGaWVsZCB2YWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbigKKyAgICAgIHByaW50ZXIsCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgkdHlwZSQgdmFsdWUpIiwKKworICAgICAgImlmICh2YWx1ZSA9PSBudWxsKSB7XG4iCisgICAgICAiICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJG9uZW9mX25hbWUkXyA9IHZhbHVlO1xuIgorICAgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICAgIiRuYW1lJEJ1aWxkZXJfLnNldE1lc3NhZ2UodmFsdWUpO1xuIiwKKworICAgICAgIiRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEZpZWxkLkJ1aWxkZXIgc2V0RmllbGQoRmllbGQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24oCisgICAgICBwcmludGVyLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAiICAgICR0eXBlJC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkiLAorCisgICAgICAiJG9uZW9mX25hbWUkXyA9IGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpO1xuIgorICAgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICAgIiRuYW1lJEJ1aWxkZXJfLnNldE1lc3NhZ2UoYnVpbGRlckZvclZhbHVlLmJ1aWxkKCkpO1xuIiwKKworICAgICAgIiRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEZpZWxkLkJ1aWxkZXIgbWVyZ2VGaWVsZChGaWVsZCB2YWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbigKKyAgICAgIHByaW50ZXIsCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JG1lcmdlJGNhcGl0YWxpemVkX25hbWUkJH0kKCR0eXBlJCB2YWx1ZSkiLAorCisgICAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCAmJlxuIgorICAgICAgIiAgICAkb25lb2ZfbmFtZSRfICE9ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSkge1xuIgorICAgICAgIiAgJG9uZW9mX25hbWUkXyA9ICR0eXBlJC5uZXdCdWlsZGVyKCgkdHlwZSQpICRvbmVvZl9uYW1lJF8pXG4iCisgICAgICAiICAgICAgLm1lcmdlRnJvbSh2YWx1ZSkuYnVpbGRQYXJ0aWFsKCk7XG4iCisgICAgICAifSBlbHNlIHtcbiIKKyAgICAgICIgICRvbmVvZl9uYW1lJF8gPSB2YWx1ZTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJG9uX2NoYW5nZWQkXG4iLAorCisgICAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICAgIiAgJG5hbWUkQnVpbGRlcl8ubWVyZ2VGcm9tKHZhbHVlKTtcbiIKKyAgICAgICJ9IGVsc2Uge1xuIgorICAgICAgIiAgJG5hbWUkQnVpbGRlcl8uc2V0TWVzc2FnZSh2YWx1ZSk7XG4iCisgICAgICAifVxuIiwKKworICAgICAgIiRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEZpZWxkLkJ1aWxkZXIgY2xlYXJGaWVsZCgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24oCisgICAgICBwcmludGVyLCAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKCkiLAorCisgICAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICAgIiAgJGNsZWFyX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAiICAkb25lb2ZfbmFtZSRfID0gbnVsbDtcbiIKKyAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAiICAkY2xlYXJfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICIgICRvbmVvZl9uYW1lJF8gPSBudWxsO1xuIgorICAgICAgIn1cbiIKKyAgICAgICIkbmFtZSRCdWlsZGVyXy5jbGVhcigpO1xuIiwKKworICAgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQuQnVpbGRlciAiCisgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCdWlsZGVyJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkuZ2V0QnVpbGRlcigpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciAiCisgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyJH0kKCkge1xuIgorICAgICAgIiAgaWYgKCgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpICYmICgkbmFtZSRCdWlsZGVyXyAhPSBudWxsKSkge1xuIgorICAgICAgIiAgICByZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZU9yQnVpbGRlcigpO1xuIgorICAgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAgICIgICAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICAgIiAgICAgIHJldHVybiAoJHR5cGUkKSAkb25lb2ZfbmFtZSRfO1xuIgorICAgICAgIiAgICB9XG4iCisgICAgICAiICAgIHJldHVybiAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5TaW5nbGVGaWVsZEJ1aWxkZXIkdmVyJDxcbiIKKyAgICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiBcbiIKKyAgICAgICIgICAgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyJH0kKCkge1xuIgorICAgICAgIiAgaWYgKCRuYW1lJEJ1aWxkZXJfID09IG51bGwpIHtcbiIKKyAgICAgICIgICAgaWYgKCEoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSkge1xuIgorICAgICAgIiAgICAgICRvbmVvZl9uYW1lJF8gPSAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7XG4iCisgICAgICAiICAgIH1cbiIKKyAgICAgICIgICAgJG5hbWUkQnVpbGRlcl8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5TaW5nbGVGaWVsZEJ1aWxkZXIkdmVyJDxcbiIKKyAgICAgICIgICAgICAgICR0eXBlJCwgJHR5cGUkLkJ1aWxkZXIsICR0eXBlJE9yQnVpbGRlcj4oXG4iCisgICAgICAiICAgICAgICAgICAgKCR0eXBlJCkgJG9uZW9mX25hbWUkXyxcbiIKKyAgICAgICIgICAgICAgICAgICBnZXRQYXJlbnRGb3JDaGlsZHJlbigpLFxuIgorICAgICAgIiAgICAgICAgICAgIGlzQ2xlYW4oKSk7XG4iCisgICAgICAiICAgICRvbmVvZl9uYW1lJF8gPSBudWxsO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgIiAgJG9uX2NoYW5nZWQkO1xuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJEJ1aWxkZXJfO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gTWFrZSBzdXJlIHRoZSBidWlsZGVyIGdldHMgY2xlYXJlZC4KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImlmICgkbmFtZSRCdWlsZGVyXyAhPSBudWxsKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICRuYW1lJEJ1aWxkZXJfLmNsZWFyKCk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGluZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24oCisgICAgICBwcmludGVyLCAicmVzdWx0LiRvbmVvZl9uYW1lJF8gPSAkb25lb2ZfbmFtZSRfO1xuIiwKKworICAgICAgInJlc3VsdC4kb25lb2ZfbmFtZSRfID0gJG5hbWUkQnVpbGRlcl8uYnVpbGQoKTtcbiIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJtZXJnZSRjYXBpdGFsaXplZF9uYW1lJChvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyUGFyc2luZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKEdldFR5cGUoZGVzY3JpcHRvcl8pID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgImlucHV0LnJlYWRHcm91cCgkbnVtYmVyJCxcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpLmdldEJ1aWxkZXIoKSxcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIKKyAgICAgICAgICAgICAgICAgICAiJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiaW5wdXQucmVhZE1lc3NhZ2UoXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKS5nZXRCdWlsZGVyKCksXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBleHRlbnNpb25SZWdpc3RyeSk7XG4iCisgICAgICAgICAgICAgICAgICAgIiRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIpOworICB9Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICIgIG91dHB1dC53cml0ZSRncm91cF9vcl9tZXNzYWdlJCgkbnVtYmVyJCwgKCR0eXBlJCkgJG9uZW9mX25hbWUkXyk7XG4iCisgICAgICAifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAgICIgICAgLmNvbXB1dGUkZ3JvdXBfb3JfbWVzc2FnZSRTaXplKCRudW1iZXIkLCAoJHR5cGUkKSAkb25lb2ZfbmFtZSRfKTtcbiIKKyAgICAgICJ9XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6UmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgIENvbnRleHQqIGNvbnRleHQpCisgICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwgbmFtZV9yZXNvbHZlcl8oY29udGV4dC0+R2V0TmFtZVJlc29sdmVyKCkpIHsKKyAgU2V0TWVzc2FnZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZGVzY3JpcHRvciksCisgICAgICAgICAgICAgICAgICAgICAgbmFtZV9yZXNvbHZlcl8sICZ2YXJpYWJsZXNfKTsKK30KKworUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorICAgIH5SZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpIHt9CisKK2ludCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCB7CisgIHJldHVybiAwOworfQorCitpbnQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgeworICByZXR1cm4gMTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRPRE8oam9ucCk6IEluIHRoZSBmdXR1cmUsIGNvbnNpZGVyIGhhdmluZyBtZXRob2RzIHNwZWNpZmljIHRvIHRoZQorICAvLyBpbnRlcmZhY2Ugc28gdGhhdCBidWlsZGVycyBjYW4gY2hvb3NlIGR5bmFtaWNhbGx5IHRvIGVpdGhlciByZXR1cm4gYQorICAvLyBtZXNzYWdlIG9yIGEgbmVzdGVkIGJ1aWxkZXIsIHNvIHRoYXQgYXNraW5nIGZvciB0aGUgaW50ZXJmYWNlIGRvZXNuJ3QKKyAgLy8gY2F1c2UgYSBtZXNzYWdlIHRvIGV2ZXIgYmUgYnVpbHQuCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+IFxuIgorICAgICAgICAgICAgICAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKTtcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpO1xuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKTtcbiIpOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgJHR5cGUkT3JCdWlsZGVyPiBcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXJMaXN0KCk7XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoXG4iCisgICAgICAiICAgIGludCBpbmRleCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJwcml2YXRlIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gJG5hbWUkXztcbiIpOworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gIgorICAgICAgICAgICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iICAvLyBub3RlOiAgdW5tb2RpZmlhYmxlIGxpc3QKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgJHR5cGUkT3JCdWlsZGVyPiBcbiIKKyAgICAgICIgICAgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyTGlzdCR9JCgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQkfSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoaW50IGluZGV4KSB7XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciAiCisgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIkfSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgaW50IGluZGV4KSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiAkbmFtZSRfLmdldChpbmRleCk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6UHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBjaGFyKiByZWd1bGFyX2Nhc2UsCisgICAgY29uc3QgY2hhciogbmVzdGVkX2J1aWxkZXJfY2FzZSkgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiaWYgKCRuYW1lJEJ1aWxkZXJfID09IG51bGwpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgcmVndWxhcl9jYXNlKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifSBlbHNlIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgbmVzdGVkX2J1aWxkZXJfY2FzZSk7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgY2hhciogbWV0aG9kX3Byb3RvdHlwZSwKKyAgICBjb25zdCBjaGFyKiByZWd1bGFyX2Nhc2UsIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UsCisgICAgY29uc3QgY2hhciogdHJhaWxpbmdfY29kZSkgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCBtZXRob2RfcHJvdG90eXBlKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoIiB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLCByZWd1bGFyX2Nhc2UsIG5lc3RlZF9idWlsZGVyX2Nhc2UpOworICBpZiAodHJhaWxpbmdfY29kZSAhPSBOVUxMKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgdHJhaWxpbmdfY29kZSk7CisgIH0KKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlck1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gV2hlbiB1c2luZyBuZXN0ZWQtYnVpbGRlcnMsIHRoZSBjb2RlIGluaXRpYWxseSB3b3JrcyBqdXN0IGxpa2UgdGhlCisgIC8vIG5vbi1uZXN0ZWQgYnVpbGRlciBjYXNlLiBJdCBvbmx5IGNyZWF0ZXMgYSBuZXN0ZWQgYnVpbGRlciBsYXppbHkgb24KKyAgLy8gZGVtYW5kIGFuZCB0aGVuIGZvcmV2ZXIgZGVsZWdhdGVzIHRvIGl0IGFmdGVyIGNyZWF0aW9uLgorCisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgIC8vIFVzZWQgd2hlbiB0aGUgYnVpbGRlciBpcyBudWxsLgorICAgICAgLy8gT25lIGZpZWxkIGlzIHRoZSBsaXN0IGFuZCB0aGUgb3RoZXIgZmllbGQga2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUKKyAgICAgIC8vIGxpc3QgaXMgaW1tdXRhYmxlLiBJZiBpdCdzIGltbXV0YWJsZSwgdGhlIGludmFyaWFudCBpcyB0aGF0IGl0IG11c3QKKyAgICAgIC8vIGVpdGhlciBhbiBpbnN0YW5jZSBvZiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSBvciBpdCdzIGFuIEFycmF5TGlzdAorICAgICAgLy8gd3JhcHBlZCBpbiBhIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKSB3cmFwcGVyIGFuZCBub2JvZHkgZWxzZSBoYXMKKyAgICAgIC8vIGEgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIEFycmF5TGlzdC4gVGhpcyBpbnZhcmlhbnQgYWxsb3dzIHVzIHRvCisgICAgICAvLyBzaGFyZSBpbnN0YW5jZXMgb2YgbGlzdHMgYmV0d2VlbiBwcm90b2NvbCBidWZmZXJzIGF2b2lkaW5nIGV4cGVuc2l2ZQorICAgICAgLy8gbWVtb3J5IGFsbG9jYXRpb25zLiBOb3RlLCBpbW11dGFibGUgaXMgYSBzdHJvbmcgZ3VhcmFudGVlIGhlcmUgLS0gbm90CisgICAgICAvLyBqdXN0IHRoYXQgdGhlIGxpc3QgY2Fubm90IGJlIG1vZGlmaWVkIHZpYSB0aGUgcmVmZXJlbmNlIGJ1dCB0aGF0IHRoZQorICAgICAgLy8gbGlzdCBjYW4gbmV2ZXIgYmUgbW9kaWZpZWQuCisgICAgICAicHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+ICRuYW1lJF8gPVxuIgorICAgICAgIiAgamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIgorCisgICAgICAicHJpdmF0ZSB2b2lkIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpIHtcbiIKKyAgICAgICIgIGlmICghJGdldF9tdXRhYmxlX2JpdF9idWlsZGVyJCkge1xuIgorICAgICAgIiAgICAkbmFtZSRfID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8JHR5cGUkPigkbmFtZSRfKTtcbiIKKyAgICAgICIgICAgJHNldF9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAgICIgICB9XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgLy8gSWYgdGhpcyBidWlsZGVyIGlzIG5vbi1udWxsLCBpdCBpcyB1c2VkIGFuZCB0aGUgb3RoZXIgZmllbGRzIGFyZQorICAgICAgLy8gaWdub3JlZC4KKyAgICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuUmVwZWF0ZWRGaWVsZEJ1aWxkZXIkdmVyJDxcbiIKKyAgICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiAkbmFtZSRCdWlsZGVyXztcbiIKKyAgICAgICJcbiIpOworCisgIC8vIFRoZSBjb21tZW50cyBhYm92ZSB0aGUgbWV0aG9kcyBiZWxvdyBhcmUgYmFzZWQgb24gYSBoeXBvdGhldGljYWwKKyAgLy8gcmVwZWF0ZWQgZmllbGQgb2YgdHlwZSAiRmllbGQiIGNhbGxlZCAiUmVwZWF0ZWRGaWVsZCIuCisKKyAgLy8gTGlzdDxGaWVsZD4gZ2V0UmVwZWF0ZWRGaWVsZExpc3QoKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKAorICAgICAgcHJpbnRlciwKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gIgorICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QkfSQoKSIsCisKKyAgICAgICJyZXR1cm4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iLAorICAgICAgInJldHVybiAkbmFtZSRCdWlsZGVyXy5nZXRNZXNzYWdlTGlzdCgpO1xuIiwKKworICAgICAgTlVMTCk7CisKKyAgLy8gaW50IGdldFJlcGVhdGVkRmllbGRDb3VudCgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24oCisgICAgICBwcmludGVyLCAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQkfSQoKSIsCisKKyAgICAgICJyZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iLCAicmV0dXJuICRuYW1lJEJ1aWxkZXJfLmdldENvdW50KCk7XG4iLAorCisgICAgICBOVUxMKTsKKworICAvLyBGaWVsZCBnZXRSZXBlYXRlZEZpZWxkKGludCBpbmRleCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbigKKyAgICAgIHByaW50ZXIsCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKGludCBpbmRleCkiLAorCisgICAgICAicmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIsCisKKyAgICAgICJyZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZShpbmRleCk7XG4iLAorCisgICAgICBOVUxMKTsKKworICAvLyBCdWlsZGVyIHNldFJlcGVhdGVkRmllbGQoaW50IGluZGV4LCBGaWVsZCB2YWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbigKKyAgICAgIHByaW50ZXIsCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICIgICAgaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpIiwKKyAgICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICAgIiAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7XG4iCisgICAgICAifVxuIgorICAgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgIiRuYW1lJF8uc2V0KGluZGV4LCB2YWx1ZSk7XG4iCisgICAgICAiJG9uX2NoYW5nZWQkXG4iLAorICAgICAgIiRuYW1lJEJ1aWxkZXJfLnNldE1lc3NhZ2UoaW5kZXgsIHZhbHVlKTtcbiIsICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEJ1aWxkZXIgc2V0UmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgsIEZpZWxkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKAorICAgICAgcHJpbnRlciwKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKFxuIgorICAgICAgIiAgICBpbnQgaW5kZXgsICR0eXBlJC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkiLAorCisgICAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgICAiJG5hbWUkXy5zZXQoaW5kZXgsIGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpKTtcbiIKKyAgICAgICIkb25fY2hhbmdlZCRcbiIsCisKKyAgICAgICIkbmFtZSRCdWlsZGVyXy5zZXRNZXNzYWdlKGluZGV4LCBidWlsZGVyRm9yVmFsdWUuYnVpbGQoKSk7XG4iLAorCisgICAgICAicmV0dXJuIHRoaXM7XG4iKTsKKworICAvLyBCdWlsZGVyIGFkZFJlcGVhdGVkRmllbGQoRmllbGQgdmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24oCisgICAgICBwcmludGVyLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRhZGQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoJHR5cGUkIHZhbHVlKSIsCisKKyAgICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICAgIiAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7XG4iCisgICAgICAifVxuIgorICAgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgIiRuYW1lJF8uYWRkKHZhbHVlKTtcbiIKKworICAgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICAgIiRuYW1lJEJ1aWxkZXJfLmFkZE1lc3NhZ2UodmFsdWUpO1xuIiwKKworICAgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgLy8gQnVpbGRlciBhZGRSZXBlYXRlZEZpZWxkKGludCBpbmRleCwgRmllbGQgdmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24oCisgICAgICBwcmludGVyLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRhZGQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAiICAgIGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSIsCisKKyAgICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICAgIiAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7XG4iCisgICAgICAifVxuIgorICAgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgIiRuYW1lJF8uYWRkKGluZGV4LCB2YWx1ZSk7XG4iCisgICAgICAiJG9uX2NoYW5nZWQkXG4iLAorCisgICAgICAiJG5hbWUkQnVpbGRlcl8uYWRkTWVzc2FnZShpbmRleCwgdmFsdWUpO1xuIiwKKworICAgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgLy8gQnVpbGRlciBhZGRSZXBlYXRlZEZpZWxkKEZpZWxkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKAorICAgICAgcHJpbnRlciwKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskYWRkJGNhcGl0YWxpemVkX25hbWUkJH0kKFxuIgorICAgICAgIiAgICAkdHlwZSQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIiwKKworICAgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgIiRuYW1lJF8uYWRkKGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpKTtcbiIKKyAgICAgICIkb25fY2hhbmdlZCRcbiIsCisKKyAgICAgICIkbmFtZSRCdWlsZGVyXy5hZGRNZXNzYWdlKGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpKTtcbiIsCisKKyAgICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgsIEZpZWxkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKAorICAgICAgcHJpbnRlciwKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskYWRkJGNhcGl0YWxpemVkX25hbWUkJH0kKFxuIgorICAgICAgIiAgICBpbnQgaW5kZXgsICR0eXBlJC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkiLAorCisgICAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgICAiJG5hbWUkXy5hZGQoaW5kZXgsIGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpKTtcbiIKKyAgICAgICIkb25fY2hhbmdlZCRcbiIsCisKKyAgICAgICIkbmFtZSRCdWlsZGVyXy5hZGRNZXNzYWdlKGluZGV4LCBidWlsZGVyRm9yVmFsdWUuYnVpbGQoKSk7XG4iLAorCisgICAgICAicmV0dXJuIHRoaXM7XG4iKTsKKworICAvLyBCdWlsZGVyIGFkZEFsbFJlcGVhdGVkRmllbGQoSXRlcmFibGU8RmllbGQ+IHZhbHVlcykKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbigKKyAgICAgIHByaW50ZXIsCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICIgICAgamF2YS5sYW5nLkl0ZXJhYmxlPD8gZXh0ZW5kcyAkdHlwZSQ+IHZhbHVlcykiLAorCisgICAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5BYnN0cmFjdE1lc3NhZ2VMaXRlLkJ1aWxkZXIuYWRkQWxsKFxuIgorICAgICAgIiAgICB2YWx1ZXMsICRuYW1lJF8pO1xuIgorICAgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICAgIiRuYW1lJEJ1aWxkZXJfLmFkZEFsbE1lc3NhZ2VzKHZhbHVlcyk7XG4iLAorCisgICAgICAicmV0dXJuIHRoaXM7XG4iKTsKKworICAvLyBCdWlsZGVyIGNsZWFyQWxsUmVwZWF0ZWRGaWVsZCgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24oCisgICAgICBwcmludGVyLCAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKCkiLAorCisgICAgICAiJG5hbWUkXyA9IGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKTtcbiIKKyAgICAgICIkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgICAiJG9uX2NoYW5nZWQkXG4iLAorCisgICAgICAiJG5hbWUkQnVpbGRlcl8uY2xlYXIoKTtcbiIsCisKKyAgICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEJ1aWxkZXIgcmVtb3ZlUmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24oCisgICAgICBwcmludGVyLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRyZW1vdmUkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoaW50IGluZGV4KSIsCisKKyAgICAgICJlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICIkbmFtZSRfLnJlbW92ZShpbmRleCk7XG4iCisgICAgICAiJG9uX2NoYW5nZWQkXG4iLAorCisgICAgICAiJG5hbWUkQnVpbGRlcl8ucmVtb3ZlKGluZGV4KTtcbiIsCisKKyAgICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkLkJ1aWxkZXIgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQnVpbGRlciR9JChcbiIKKyAgICAgICIgICAgaW50IGluZGV4KSB7XG4iCisgICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkuZ2V0QnVpbGRlcihpbmRleCk7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSRPckJ1aWxkZXIgIgorICAgICAgICAgICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyJH0kKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGludCBpbmRleCkge1xuIgorICAgICAgICAgICAgICAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gPT0gbnVsbCkge1xuIgorICAgICAgICAgICAgICAgICAiICAgIHJldHVybiAkbmFtZSRfLmdldChpbmRleCk7IgorICAgICAgICAgICAgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgICAgICAgICAgICAiICAgIHJldHVybiAkbmFtZSRCdWlsZGVyXy5nZXRNZXNzYWdlT3JCdWlsZGVyKGluZGV4KTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgJHR5cGUkT3JCdWlsZGVyPiBcbiIKKyAgICAgICIgICAgICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlckxpc3QkfSQoKSB7XG4iCisgICAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gIT0gbnVsbCkge1xuIgorICAgICAgIiAgICByZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZU9yQnVpbGRlckxpc3QoKTtcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJC5CdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgIiR7JGFkZCRjYXBpdGFsaXplZF9uYW1lJEJ1aWxkZXIkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKS5hZGRCdWlsZGVyKFxuIgorICAgICAgICAgICAgICAgICAiICAgICAgJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJC5CdWlsZGVyICR7JGFkZCRjYXBpdGFsaXplZF9uYW1lJEJ1aWxkZXIkfSQoXG4iCisgICAgICAiICAgIGludCBpbmRleCkge1xuIgorICAgICAgIiAgcmV0dXJuIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpLmFkZEJ1aWxkZXIoXG4iCisgICAgICAiICAgICAgaW5kZXgsICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSk7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8JHR5cGUkLkJ1aWxkZXI+IFxuIgorICAgICAgIiAgICAgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQnVpbGRlckxpc3QkfSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkuZ2V0QnVpbGRlckxpc3QoKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLlJlcGVhdGVkRmllbGRCdWlsZGVyJHZlciQ8XG4iCisgICAgICAiICAgICR0eXBlJCwgJHR5cGUkLkJ1aWxkZXIsICR0eXBlJE9yQnVpbGRlcj4gXG4iCisgICAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpIHtcbiIKKyAgICAgICIgIGlmICgkbmFtZSRCdWlsZGVyXyA9PSBudWxsKSB7XG4iCisgICAgICAiICAgICRuYW1lJEJ1aWxkZXJfID0gbmV3ICIKKyAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLlJlcGVhdGVkRmllbGRCdWlsZGVyJHZlciQ8XG4iCisgICAgICAiICAgICAgICAkdHlwZSQsICR0eXBlJC5CdWlsZGVyLCAkdHlwZSRPckJ1aWxkZXI+KFxuIgorICAgICAgIiAgICAgICAgICAgICRuYW1lJF8sXG4iCisgICAgICAiICAgICAgICAgICAgJGdldF9tdXRhYmxlX2JpdF9idWlsZGVyJCxcbiIKKyAgICAgICIgICAgICAgICAgICBnZXRQYXJlbnRGb3JDaGlsZHJlbigpLFxuIgorICAgICAgIiAgICAgICAgICAgIGlzQ2xlYW4oKSk7XG4iCisgICAgICAiICAgICRuYW1lJF8gPSBudWxsO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJEJ1aWxkZXJfO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKKyAgICBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7XG4iLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJG5hbWUkXyA9IG51bGw7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJG5hbWUkQnVpbGRlcl8uY2xlYXIoKTtcbiIpOworCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZXJnaW5nQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBUaGUgY29kZSBiZWxvdyBkb2VzIHR3byBvcHRpbWl6YXRpb25zIChub24tbmVzdGVkIGJ1aWxkZXIgY2FzZSk6CisgIC8vICAgMS4gSWYgdGhlIG90aGVyIGxpc3QgaXMgZW1wdHksIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gVGhpcyBlbnN1cmVzIHdlCisgIC8vICAgICAgZG9uJ3QgYWxsb2NhdGUgYSBuZXcgYXJyYXkgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGltbXV0YWJsZSBvbmUuCisgIC8vICAgMi4gSWYgdGhlIG90aGVyIGxpc3QgaXMgbm9uLWVtcHR5IGFuZCBvdXIgY3VycmVudCBsaXN0IGlzIGVtcHR5LCB3ZSBjYW4KKyAgLy8gICAgICByZXVzZSB0aGUgb3RoZXIgbGlzdCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGltbXV0YWJsZS4KKyAgUHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKAorICAgICAgcHJpbnRlciwKKyAgICAgICJpZiAoIW90aGVyLiRuYW1lJF8uaXNFbXB0eSgpKSB7XG4iCisgICAgICAiICBpZiAoJG5hbWUkXy5pc0VtcHR5KCkpIHtcbiIKKyAgICAgICIgICAgJG5hbWUkXyA9IG90aGVyLiRuYW1lJF87XG4iCisgICAgICAiICAgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgIiAgICAkbmFtZSRfLmFkZEFsbChvdGhlci4kbmFtZSRfKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJpZiAoIW90aGVyLiRuYW1lJF8uaXNFbXB0eSgpKSB7XG4iCisgICAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8uaXNFbXB0eSgpKSB7XG4iCisgICAgICAiICAgICRuYW1lJEJ1aWxkZXJfLmRpc3Bvc2UoKTtcbiIKKyAgICAgICIgICAgJG5hbWUkQnVpbGRlcl8gPSBudWxsO1xuIgorICAgICAgIiAgICAkbmFtZSRfID0gb3RoZXIuJG5hbWUkXztcbiIKKyAgICAgICIgICAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICAgIiAgICAkbmFtZSRCdWlsZGVyXyA9IFxuIgorICAgICAgIiAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZSR2ZXIkLmFsd2F5c1VzZUZpZWxkQnVpbGRlcnMgIgorICAgICAgIj9cbiIKKyAgICAgICIgICAgICAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKSA6IG51bGw7XG4iCisgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgIiAgICAkbmFtZSRCdWlsZGVyXy5hZGRBbGxNZXNzYWdlcyhvdGhlci4kbmFtZSRfKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGluZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gVGhlIGNvZGUgYmVsb3cgKG5vbi1uZXN0ZWQgYnVpbGRlciBjYXNlKSBlbnN1cmVzIHRoYXQgdGhlIHJlc3VsdCBoYXMgYW4KKyAgLy8gaW1tdXRhYmxlIGxpc3QuIElmIG91ciBsaXN0IGlzIGltbXV0YWJsZSwgd2UgY2FuIGp1c3QgcmV1c2UgaXQuIElmIG5vdCwKKyAgLy8gd2UgbWFrZSBpdCBpbW11dGFibGUuCisgIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbigKKyAgICAgIHByaW50ZXIsCisgICAgICAiaWYgKCRnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQpIHtcbiIKKyAgICAgICIgICRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKKyAgICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicmVzdWx0LiRuYW1lJF8gPSAkbmFtZSRfO1xuIiwKKworICAgICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkQnVpbGRlcl8uYnVpbGQoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoR2V0VHlwZShkZXNjcmlwdG9yXykgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJHR5cGUkIG0gPVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgaW5wdXQucmVhZEdyb3VwKCRudW1iZXIkLFxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAgICR0eXBlJC4kZ2V0X3BhcnNlciQsXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJHR5cGUkIG0gPVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgaW5wdXQucmVhZE1lc3NhZ2UoXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICAgJHR5cGUkLiRnZXRfcGFyc2VyJCxcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgICBleHRlbnNpb25SZWdpc3RyeSk7XG4iKTsKKyAgfQorICBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24ocHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkbmFtZSRfLmFkZChtKTtcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJG5hbWUkQnVpbGRlcl8uYWRkTWVzc2FnZShtKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgb3V0cHV0LndyaXRlJGdyb3VwX29yX21lc3NhZ2UkKCRudW1iZXIkLCAkbmFtZSRfLmdldChpKSk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgorICAgICAgIiAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtXG4iCisgICAgICAiICAgIC5jb21wdXRlJGdyb3VwX29yX21lc3NhZ2UkU2l6ZSgkbnVtYmVyJCwgJG5hbWUkXy5nZXQoaSkpO1xuIgorICAgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUVxdWFsc0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgImlmICghZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpXG4iCisgICAgICAiICAgIC5lcXVhbHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpKSkgcmV0dXJuIGZhbHNlO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlSGFzaENvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpID4gMCkge1xuIgorICAgICAgIiAgaGFzaCA9ICgzNyAqIGhhc2gpICsgJGNvbnN0YW50X25hbWUkO1xuIgorICAgICAgIiAgaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLmhhc2hDb2RlKCk7XG4iCisgICAgICAifVxuIik7Cit9CisKK3N0ZDo6c3RyaW5nIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZXRCb3hlZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSk7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlS290bGluRHNsTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiLyoqXG4iCisgICAgICAiICogQW4gdW5pbnN0YW50aWFibGUsIGJlaGF2aW9ybGVzcyB0eXBlIHRvIHJlcHJlc2VudCB0aGUgZmllbGQgaW5cbiIKKyAgICAgICIgKiBnZW5lcmljcy5cbiIKKyAgICAgICIgKi9cbiIKKyAgICAgICJAa290bGluLk9wdEluIgorICAgICAgIihjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Pbmx5Rm9yVXNlQnlHZW5lcmF0ZWRQcm90b0NvZGU6OmNsYXNzKVxuIgorICAgICAgImNsYXNzICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kIHByaXZhdGUgY29uc3RydWN0b3IoKSIKKyAgICAgICIgOiBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xQcm94eSgpXG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIka3RfZGVwcmVjYXRpb24kIHZhbCAka3RfbmFtZSQ6ICIKKyAgICAgICAgICAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAgICAgICAgICAgICI8JGt0X3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD5cbiIKKyAgICAgICAgICAgICAgICAgIiAgQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICIgIGdldCgpID0gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAka3RfZHNsX2J1aWxkZXIkLiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QkfSQoKVxuIgorICAgICAgICAgICAgICAgICAiICApXG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwiYWRkJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAgICAgICAgICAgICJmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAgICAgICAgICAgICJhZGQodmFsdWU6ICRrdF90eXBlJCkge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGFkZCRjYXBpdGFsaXplZF9uYW1lJCR9JCh2YWx1ZSlcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfQURERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyBmYWxzZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bU5hbWUoXCJwbHVzQXNzaWduJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAgICAgICAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgICAgICAgICAgICAiaW5saW5lIG9wZXJhdG9yIGZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xMaXN0IgorICAgICAgICAgICAgICAgICAiPCRrdF90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICAgICAgICAgICAgInBsdXNBc3NpZ24odmFsdWU6ICRrdF90eXBlJCkge1xuIgorICAgICAgICAgICAgICAgICAiICBhZGQodmFsdWUpXG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX01VTFRJX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwiYWRkQWxsJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAgICAgICAgICAgICJmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAgICAgICAgICAgICJhZGRBbGwodmFsdWVzOiBrb3RsaW4uY29sbGVjdGlvbnMuSXRlcmFibGU8JGt0X3R5cGUkPikge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJCR9JCh2YWx1ZXMpXG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX01VTFRJX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcInBsdXNBc3NpZ25BbGwka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICI8JGt0X3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD4uIgorICAgICAgInBsdXNBc3NpZ24odmFsdWVzOiBrb3RsaW4uY29sbGVjdGlvbnMuSXRlcmFibGU8JGt0X3R5cGUkPikge1xuIgorICAgICAgIiAgYWRkQWxsKHZhbHVlcylcbiIKKyAgICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0lOREVYRURfU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcInNldCRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgIm9wZXJhdG9yIGZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xMaXN0IgorICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAic2V0KGluZGV4OiBrb3RsaW4uSW50LCB2YWx1ZTogJGt0X3R5cGUkKSB7XG4iCisgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JChpbmRleCwgdmFsdWUpXG4iCisgICAgICAifVxuIik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcImNsZWFyJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAgICAgICAgICAgICJmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAgICAgICAgICAgICJjbGVhcigpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJGt0X2RzbF9idWlsZGVyJC4keyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpXG4iCisgICAgICAgICAgICAgICAgICJ9XG5cbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2ZpZWxkLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZV9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZjUzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZV9maWVsZC5oCkBAIC0wLDAgKzEsMTgwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUVTU0FHRV9GSUVMRF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUVTU0FHRV9GSUVMRF9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9maWVsZC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworY2xhc3MgQ29udGV4dDsgICAgICAgICAgICAvLyBjb250ZXh0LmgKK2NsYXNzIENsYXNzTmFtZVJlc29sdmVyOyAgLy8gbmFtZV9yZXNvbHZlci5oCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworY2xhc3MgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpOworICB+SW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gaW1wbGVtZW50cyBJbW11dGFibGVGaWVsZEdlbmVyYXRvcgorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50IEdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludCBHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZSgKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlS290bGluRHNsTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjpzdHJpbmcgR2V0Qm94ZWRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyaWFibGVzXzsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXJfOworCisgIHZvaWQgUHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZWd1bGFyX2Nhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UpIGNvbnN0OworICB2b2lkIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1ldGhvZF9wcm90b3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmVndWxhcl9jYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdHJhaWxpbmdfY29kZSkgY29uc3Q7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yKTsKKyAgdm9pZCBHZW5lcmF0ZUtvdGxpbk9yTnVsbChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Cit9OworCitjbGFzcyBJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcgorICAgIDogcHVibGljIEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpOworICB+SW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcik7Cit9OworCitjbGFzcyBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcigKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgIGludCBidWlsZGVyQml0SW5kZXgsIENvbnRleHQqIGNvbnRleHQpOworICB+UmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICAvLyBpbXBsZW1lbnRzIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVLb3RsaW5Ec2xNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnN0cmluZyBHZXRCb3hlZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKworIHByb3RlY3RlZDoKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJpYWJsZXNfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CisKKyAgdm9pZCBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJlZ3VsYXJfY2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmVzdGVkX2J1aWxkZXJfY2FzZSkgY29uc3Q7CisgIHZvaWQgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24oaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWV0aG9kX3Byb3RvdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZWd1bGFyX2Nhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmVzdGVkX2J1aWxkZXJfY2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0cmFpbGluZ19jb2RlKSBjb25zdDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0ZJRUxEX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfZmllbGRfbGl0ZS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2ZpZWxkX2xpdGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzN2NhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2ZpZWxkX2xpdGUuY2MKQEAgLTAsMCArMSw4OTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfZmllbGRfbGl0ZS5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lX3Jlc29sdmVyLmg+CisKKy8vIE11c3QgYmUgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCituYW1lc3BhY2UgeworCit2b2lkIFNldE1lc3NhZ2VWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgdmFyaWFibGVzKTsKKworICAoKnZhcmlhYmxlcylbInR5cGUiXSA9CisgICAgICBuYW1lX3Jlc29sdmVyLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAoKnZhcmlhYmxlcylbImt0X3R5cGUiXSA9ICgqdmFyaWFibGVzKVsidHlwZSJdOworICAoKnZhcmlhYmxlcylbIm11dGFibGVfdHlwZSJdID0KKyAgICAgIG5hbWVfcmVzb2x2ZXItPkdldE11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAoKnZhcmlhYmxlcylbImdyb3VwX29yX21lc3NhZ2UiXSA9CisgICAgICAoR2V0VHlwZShkZXNjcmlwdG9yKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApID8gIkdyb3VwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJNZXNzYWdlIjsKKyAgLy8gVE9ETyhiaXJkbyk6IEFkZCBAZGVwcmVjYXRlZCBqYXZhZG9jIHdoZW4gZ2VuZXJhdGluZyBqYXZhZG9jIGlzIHN1cHBvcnRlZAorICAvLyBieSB0aGUgcHJvdG8gY29tcGlsZXIKKyAgKCp2YXJpYWJsZXMpWyJkZXByZWNhdGlvbiJdID0KKyAgICAgIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkICIgOiAiIjsKKyAgKCp2YXJpYWJsZXMpWyJrdF9kZXByZWNhdGlvbiJdID0KKyAgICAgIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkKKyAgICAgICAgICA/ICJAa290bGluLkRlcHJlY2F0ZWQobWVzc2FnZSA9IFwiRmllbGQgIiArICgqdmFyaWFibGVzKVsibmFtZSJdICsKKyAgICAgICAgICAgICAgICAiIGlzIGRlcHJlY2F0ZWRcIikgIgorICAgICAgICAgIDogIiI7CisgICgqdmFyaWFibGVzKVsicmVxdWlyZWQiXSA9IGRlc2NyaXB0b3ItPmlzX3JlcXVpcmVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworCisgIGlmIChIYXNIYXNiaXQoZGVzY3JpcHRvcikpIHsKKyAgICAvLyBGb3Igc2luZ3VsYXIgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHRoZSBoYXNGaWVsZCBiaXQuCisgICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworCisgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGhhdmUgYSB0cmFpbGluZyAiOyIuCisgICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPQorICAgICAgICBHZW5lcmF0ZVNldEJpdChtZXNzYWdlQml0SW5kZXgpICsgIjsiOworICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPQorICAgICAgICBHZW5lcmF0ZUNsZWFyQml0KG1lc3NhZ2VCaXRJbmRleCkgKyAiOyI7CisKKyAgICAoKnZhcmlhYmxlcylbImlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSJdID0gR2VuZXJhdGVHZXRCaXQobWVzc2FnZUJpdEluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9ICIiOworICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSAiIjsKKworICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPQorICAgICAgICAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfICE9IG51bGwiOworICB9CisKKyAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsIl0gPQorICAgICAgR2VuZXJhdGVHZXRCaXRGcm9tTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF90b19sb2NhbCJdID0KKyAgICAgIEdlbmVyYXRlU2V0Qml0VG9Mb2NhbChtZXNzYWdlQml0SW5kZXgpOworCisgIC8vIFdlIHVzZSBgeC5nZXRDbGFzcygpYCBhcyBhIG51bGwgY2hlY2sgYmVjYXVzZSBpdCBnZW5lcmF0ZXMgbGVzcyBieXRlY29kZQorICAvLyB0aGFuIGFuIGBpZiAoeCA9PSBudWxsKSB7IHRocm93IC4uLiB9YCBzdGF0ZW1lbnQuCisgICgqdmFyaWFibGVzKVsibnVsbF9jaGVjayJdID0gInZhbHVlLmdldENsYXNzKCk7XG4iOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbW11dGFibGVNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yOjpJbW11dGFibGVNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCkKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgICAgbWVzc2FnZUJpdEluZGV4XyhtZXNzYWdlQml0SW5kZXgpLAorICAgICAgbmFtZV9yZXNvbHZlcl8oY29udGV4dC0+R2V0TmFtZVJlc29sdmVyKCkpIHsKKyAgU2V0TWVzc2FnZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGRlc2NyaXB0b3IpLAorICAgICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLCAmdmFyaWFibGVzXyk7Cit9CisKK0ltbXV0YWJsZU1lc3NhZ2VGaWVsZExpdGVHZW5lcmF0b3I6On5JbW11dGFibGVNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yKCkge30KKworaW50IEltbXV0YWJsZU1lc3NhZ2VGaWVsZExpdGVHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworICAvLyBUT0RPKGR3ZWlzKTogV2UgZG9uJ3QgbmVlZCBhIGhhcyBiaXQgZm9yIG1lc3NhZ2VzIGFzIHRoZXkgaGF2ZSBudWxsCisgIC8vIHNlbnRpbmVscyBhbmQgbm8gdXNlciBzaG91bGQgYmUgcmVmbGVjdGluZyBvbiB0aGlzLiBXZSBjb3VsZCBzYXZlIHNvbWUKKyAgLy8gYml0cyBieSBzZXR0aW5nIHRvIDAgYW5kIHVwZGF0aW5nIHRoZSBydW50aW1lcyBidXQgdGhpcyBtaWdodCBjb21lIGF0IGEKKyAgLy8gcnVudGltZSBwZXJmb3JtYW5jZSBjb3N0IHNpbmNlIHdlIGNhbid0IG1lbW9pemUgaGFzLWJpdCByZWFkcy4KKyAgcmV0dXJuIEhhc0hhc2JpdChkZXNjcmlwdG9yXykgPyAxIDogMDsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgSEFaWkVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRkZXByZWNhdGlvbiRib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEdFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkZGVwcmVjYXRpb24kJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInByaXZhdGUgJHR5cGUkICRuYW1lJF87XG4iKTsKKyAgUHJpbnRFeHRyYUZpZWxkSW5mbyh2YXJpYWJsZXNfLCBwcmludGVyKTsKKworICBpZiAoSGFzSGFzYml0KGRlc2NyaXB0b3JfKSkgeworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiAkeyRoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQ7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRuYW1lJF8gPT0gbnVsbCA/ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSA6ICRuYW1lJF87XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICB9IGVsc2UgeworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiAkeyRoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICIgIHJldHVybiAkbmFtZSRfICE9IG51bGw7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRuYW1lJF8gPT0gbnVsbCA/ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSA6ICRuYW1lJF87XG4iCisgICAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICB9CisKKyAgLy8gRmllbGQuQnVpbGRlciBzZXRGaWVsZChGaWVsZCB2YWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2lkIHNldCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG51bGxfY2hlY2skIgorICAgICAgICAgICAgICAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgICAgICAgICAgICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJFxuIgorICAgICAgICAgICAgICAgICAiICB9XG4iKTsKKworICAvLyBGaWVsZC5CdWlsZGVyIG1lcmdlRmllbGQoRmllbGQgdmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBqYXZhLmxhbmcuU3VwcHJlc3NXYXJuaW5ncyh7XCJSZWZlcmVuY2VFcXVhbGl0eVwifSlcbiIKKyAgICAgICJwcml2YXRlIHZvaWQgbWVyZ2UkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAiICAkbnVsbF9jaGVjayQiCisgICAgICAiICBpZiAoJG5hbWUkXyAhPSBudWxsICYmXG4iCisgICAgICAiICAgICAgJG5hbWUkXyAhPSAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpIHtcbiIKKyAgICAgICIgICAgJG5hbWUkXyA9XG4iCisgICAgICAiICAgICAgJHR5cGUkLm5ld0J1aWxkZXIoJG5hbWUkXykubWVyZ2VGcm9tKHZhbHVlKS5idWlsZFBhcnRpYWwoKTtcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgICRuYW1lJF8gPSB2YWx1ZTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJFxuIgorICAgICAgIn1cbiIpOworCisgIC8vIEZpZWxkLkJ1aWxkZXIgY2xlYXJGaWVsZCgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHsiCisgICAgICAgICAgICAgICAgICIgICRuYW1lJF8gPSBudWxsO1xuIgorICAgICAgICAgICAgICAgICAiICAkY2xlYXJfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJFxuIgorICAgICAgICAgICAgICAgICAifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBUaGUgY29tbWVudHMgYWJvdmUgdGhlIG1ldGhvZHMgYmVsb3cgYXJlIGJhc2VkIG9uIGEgaHlwb3RoZXRpY2FsCisgIC8vIGZpZWxkIG9mIHR5cGUgIkZpZWxkIiBjYWxsZWQgIkZpZWxkIi4KKworICAvLyBib29sZWFuIGhhc0ZpZWxkKCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuICR7JGhhcyRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGluc3RhbmNlLmhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgLy8gRmllbGQgZ2V0RmllbGQoKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIC8vIEZpZWxkLkJ1aWxkZXIgc2V0RmllbGQoRmllbGQgdmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAiCisgICAgICAgICAgICAgICAgICIkeyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGNvcHlPbldyaXRlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgIGluc3RhbmNlLnNldCRjYXBpdGFsaXplZF9uYW1lJCh2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAiICB9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICAvLyBGaWVsZC5CdWlsZGVyIHNldEZpZWxkKEZpZWxkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKFxuIgorICAgICAgICAgICAgICAgICAiICAgICR0eXBlJC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICBpbnN0YW5jZS5zZXQkY2FwaXRhbGl6ZWRfbmFtZSQoYnVpbGRlckZvclZhbHVlLmJ1aWxkKCkpO1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIC8vIEZpZWxkLkJ1aWxkZXIgbWVyZ2VGaWVsZChGaWVsZCB2YWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgIiR7JG1lcmdlJGNhcGl0YWxpemVkX25hbWUkJH0kKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICBpbnN0YW5jZS5tZXJnZSRjYXBpdGFsaXplZF9uYW1lJCh2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgLy8gRmllbGQuQnVpbGRlciBjbGVhckZpZWxkKCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKCkgeyIKKyAgICAgICAgICAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaW5zdGFuY2UuY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGt0X2RlcHJlY2F0aW9uJHZhciAka3RfbmFtZSQ6ICRrdF90eXBlJFxuIgorICAgICAgICAgICAgICAgICAiICBASnZtTmFtZShcIiR7JGdldCRrdF9jYXBpdGFsaXplZF9uYW1lJCR9JFwiKVxuIgorICAgICAgICAgICAgICAgICAiICBnZXQoKSA9ICRrdF9kc2xfYnVpbGRlciQuJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKClcbiIKKyAgICAgICAgICAgICAgICAgIiAgQEp2bU5hbWUoXCIkeyRzZXQka3RfY2FwaXRhbGl6ZWRfbmFtZSQkfSRcIilcbiIKKyAgICAgICAgICAgICAgICAgIiAgc2V0KHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgJGt0X2RzbF9idWlsZGVyJC4keyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQodmFsdWUpXG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIpOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIENMRUFSRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyBmYWxzZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJmdW4gJHskY2xlYXIka3RfY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICRrdF9kc2xfYnVpbGRlciQuJHskY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKVxuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgSEFaWkVSKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgImZ1biAkeyRoYXMka3RfY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKToga290bGluLkJvb2xlYW4ge1xuIgorICAgICAgIiAgcmV0dXJuICRrdF9kc2xfYnVpbGRlciQuJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKClcbiIKKyAgICAgICJ9XG4iKTsKKyAgR2VuZXJhdGVLb3RsaW5Pck51bGwocHJpbnRlcik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVLb3RsaW5Pck51bGwoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKGRlc2NyaXB0b3JfLT5oYXNfb3B0aW9uYWxfa2V5d29yZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAidmFsICRjbGFzc25hbWUkS3QuRHNsLiRuYW1lJE9yTnVsbDogJGt0X3R5cGUkP1xuIgorICAgICAgICAgICAgICAgICAgICIgIGdldCgpID0gJGt0X2RzbF9idWlsZGVyJC4kbmFtZSRPck51bGxcbiIpOworICB9Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVGaWVsZEluZm8oCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCB7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShkZXNjcmlwdG9yXy0+bnVtYmVyKCksIG91dHB1dCk7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShHZXRFeHBlcmltZW50YWxKYXZhRmllbGRUeXBlKGRlc2NyaXB0b3JfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisgIGlmIChIYXNIYXNiaXQoZGVzY3JpcHRvcl8pKSB7CisgICAgV3JpdGVJbnRUb1V0ZjE2Q2hhclNlcXVlbmNlKG1lc3NhZ2VCaXRJbmRleF8sIG91dHB1dCk7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIlwiJG5hbWUkX1wiLFxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHt9CisKK3N0ZDo6c3RyaW5nIEltbXV0YWJsZU1lc3NhZ2VGaWVsZExpdGVHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZExpdGVHZW5lcmF0b3I6OgorICAgIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpCisgICAgOiBJbW11dGFibGVNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgY29udGV4dCkgeworICBjb25zdCBPbmVvZkdlbmVyYXRvckluZm8qIGluZm8gPQorICAgICAgY29udGV4dC0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfb25lb2YoKSk7CisgIFNldENvbW1vbk9uZW9mVmFyaWFibGVzKGRlc2NyaXB0b3IsIGluZm8sICZ2YXJpYWJsZXNfKTsKK30KKworSW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yOjoKKyAgICB+SW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yKCkge30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICAgICAgICAgICAgICAiICAgICByZXR1cm4gKCR0eXBlJCkgJG9uZW9mX25hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgLy8gRmllbGQuQnVpbGRlciBzZXRGaWVsZChGaWVsZCB2YWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2lkIHNldCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG51bGxfY2hlY2skIgorICAgICAgICAgICAgICAgICAiICAkb25lb2ZfbmFtZSRfID0gdmFsdWU7XG4iCisgICAgICAgICAgICAgICAgICIgICRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIC8vIEZpZWxkLkJ1aWxkZXIgbWVyZ2VGaWVsZChGaWVsZCB2YWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAicHJpdmF0ZSB2b2lkIG1lcmdlJGNhcGl0YWxpemVkX25hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICAgIiAgJG51bGxfY2hlY2skIgorICAgICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCAmJlxuIgorICAgICAgIiAgICAgICRvbmVvZl9uYW1lJF8gIT0gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpKSB7XG4iCisgICAgICAiICAgICRvbmVvZl9uYW1lJF8gPSAkdHlwZSQubmV3QnVpbGRlcigoJHR5cGUkKSAkb25lb2ZfbmFtZSRfKVxuIgorICAgICAgIiAgICAgICAgLm1lcmdlRnJvbSh2YWx1ZSkuYnVpbGRQYXJ0aWFsKCk7XG4iCisgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgIiAgICAkb25lb2ZfbmFtZSRfID0gdmFsdWU7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICAkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAifVxuIik7CisKKyAgLy8gRmllbGQuQnVpbGRlciBjbGVhckZpZWxkKCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2lkIGNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgICAgICAgICAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgJGNsZWFyX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAgICAgICAgICAgICIgICAgJG9uZW9mX25hbWUkXyA9IG51bGw7XG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVGaWVsZEluZm8oCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCB7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShkZXNjcmlwdG9yXy0+bnVtYmVyKCksIG91dHB1dCk7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShHZXRFeHBlcmltZW50YWxKYXZhRmllbGRUeXBlKGRlc2NyaXB0b3JfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShkZXNjcmlwdG9yXy0+Y29udGFpbmluZ19vbmVvZigpLT5pbmRleCgpLCBvdXRwdXQpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG9uZW9mX3N0b3JlZF90eXBlJC5jbGFzcyxcbiIpOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBUaGUgY29tbWVudHMgYWJvdmUgdGhlIG1ldGhvZHMgYmVsb3cgYXJlIGJhc2VkIG9uIGEgaHlwb3RoZXRpY2FsCisgIC8vIGZpZWxkIG9mIHR5cGUgIkZpZWxkIiBjYWxsZWQgIkZpZWxkIi4KKworICAvLyBib29sZWFuIGhhc0ZpZWxkKCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuICR7JGhhcyRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGluc3RhbmNlLmhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgLy8gRmllbGQgZ2V0RmllbGQoKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIC8vIEZpZWxkLkJ1aWxkZXIgc2V0RmllbGQoRmllbGQgdmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAiCisgICAgICAgICAgICAgICAgICIkeyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGNvcHlPbldyaXRlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgIGluc3RhbmNlLnNldCRjYXBpdGFsaXplZF9uYW1lJCh2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgLy8gRmllbGQuQnVpbGRlciBzZXRGaWVsZChGaWVsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkdHlwZSQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaW5zdGFuY2Uuc2V0JGNhcGl0YWxpemVkX25hbWUkKGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICAvLyBGaWVsZC5CdWlsZGVyIG1lcmdlRmllbGQoRmllbGQgdmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAiCisgICAgICAgICAgICAgICAgICIkeyRtZXJnZSRjYXBpdGFsaXplZF9uYW1lJCR9JCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaW5zdGFuY2UubWVyZ2UkY2FwaXRhbGl6ZWRfbmFtZSQodmFsdWUpO1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIC8vIEZpZWxkLkJ1aWxkZXIgY2xlYXJGaWVsZCgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICIgIGNvcHlPbldyaXRlKCk7XG4iCisgICAgICAiICBpbnN0YW5jZS5jbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgorICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yOjoKKyAgICBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZExpdGVHZW5lcmF0b3IoCisgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgQ29udGV4dCogY29udGV4dCkKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgeworICBTZXRNZXNzYWdlVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZGVzY3JpcHRvciksCisgICAgICAgICAgICAgICAgICAgICAgbmFtZV9yZXNvbHZlcl8sICZ2YXJpYWJsZXNfKTsKK30KKworUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yOjoKKyAgICB+UmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yKCkge30KKworaW50IFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCB7CisgIHJldHVybiAwOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRPRE8oam9ucCk6IEluIHRoZSBmdXR1cmUsIGNvbnNpZGVyIGhhdmluZyBtZXRob2RzIHNwZWNpZmljIHRvIHRoZQorICAvLyBpbnRlcmZhY2Ugc28gdGhhdCBidWlsZGVycyBjYW4gY2hvb3NlIGR5bmFtaWNhbGx5IHRvIGVpdGhlciByZXR1cm4gYQorICAvLyBtZXNzYWdlIG9yIGEgbmVzdGVkIGJ1aWxkZXIsIHNvIHRoYXQgYXNraW5nIGZvciB0aGUgaW50ZXJmYWNlIGRvZXNuJ3QKKyAgLy8gY2F1c2UgYSBtZXNzYWdlIHRvIGV2ZXIgYmUgYnVpbHQuCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+IFxuIgorICAgICAgICAgICAgICAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKTtcbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpO1xuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuUHJvdG9idWZMaXN0PCR0eXBlJD4gJG5hbWUkXztcbiIpOworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gIgorICAgICAgICAgICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iICAvLyBub3RlOiAgdW5tb2RpZmlhYmxlIGxpc3QKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyAkdHlwZSRPckJ1aWxkZXI+IFxuIgorICAgICAgIiAgICAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXJMaXN0JH0kKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCR9JCgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRfLnNpemUoKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JChpbnQgaW5kZXgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRfLmdldChpbmRleCk7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkT3JCdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlciR9JChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBpbnQgaW5kZXgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJwcml2YXRlIHZvaWQgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCkge1xuIgorICAgICAgLy8gVXNlIGEgdGVtcG9yYXJ5IHRvIGF2b2lkIGEgcmVkdW5kYW50IGlnZXQtb2JqZWN0LgorICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5Qcm90b2J1Zkxpc3Q8JHR5cGUkPiB0bXAgPSAkbmFtZSRfO1xuIgorICAgICAgIiAgaWYgKCF0bXAuaXNNb2RpZmlhYmxlKCkpIHtcbiIKKyAgICAgICIgICAgJG5hbWUkXyA9XG4iCisgICAgICAiICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLm11dGFibGVDb3B5KHRtcCk7XG4iCisgICAgICAiICAgfVxuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIpOworCisgIC8vIEJ1aWxkZXIgc2V0UmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgsIEZpZWxkIHZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJwcml2YXRlIHZvaWQgc2V0JGNhcGl0YWxpemVkX25hbWUkKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICRudWxsX2NoZWNrJCIKKyAgICAgICAgICAgICAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgICRuYW1lJF8uc2V0KGluZGV4LCB2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICAvLyBCdWlsZGVyIGFkZFJlcGVhdGVkRmllbGQoRmllbGQgdmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICRudWxsX2NoZWNrJCIKKyAgICAgICAgICAgICAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgICRuYW1lJF8uYWRkKHZhbHVlKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIC8vIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgsIEZpZWxkIHZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJwcml2YXRlIHZvaWQgYWRkJGNhcGl0YWxpemVkX25hbWUkKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICRudWxsX2NoZWNrJCIKKyAgICAgICAgICAgICAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgICRuYW1lJF8uYWRkKGluZGV4LCB2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICAvLyBCdWlsZGVyIGFkZEFsbFJlcGVhdGVkRmllbGQoSXRlcmFibGU8RmllbGQ+IHZhbHVlcykKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2lkIGFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBqYXZhLmxhbmcuSXRlcmFibGU8PyBleHRlbmRzICR0eXBlJD4gdmFsdWVzKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkFic3RyYWN0TWVzc2FnZUxpdGUuYWRkQWxsKFxuIgorICAgICAgICAgICAgICAgICAiICAgICAgdmFsdWVzLCAkbmFtZSRfKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIC8vIEJ1aWxkZXIgY2xlYXJBbGxSZXBlYXRlZEZpZWxkKCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2lkIGNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgICAgICAgICAgICAiICAkbmFtZSRfID0gZW1wdHlQcm90b2J1Zkxpc3QoKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIC8vIEJ1aWxkZXIgcmVtb3ZlUmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCByZW1vdmUkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICAkbmFtZSRfLnJlbW92ZShpbmRleCk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlck1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gVGhlIGNvbW1lbnRzIGFib3ZlIHRoZSBtZXRob2RzIGJlbG93IGFyZSBiYXNlZCBvbiBhIGh5cG90aGV0aWNhbAorICAvLyByZXBlYXRlZCBmaWVsZCBvZiB0eXBlICJGaWVsZCIgY2FsbGVkICJSZXBlYXRlZEZpZWxkIi4KKworICAvLyBMaXN0PEZpZWxkPiBnZXRSZXBlYXRlZEZpZWxkTGlzdCgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8JHR5cGUkPiAiCisgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0JH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoXG4iCisgICAgICAgICAgICAgICAgICIgICAgICBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgLy8gaW50IGdldFJlcGVhdGVkRmllbGRDb3VudCgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCR9JCgpIHtcbiIKKyAgICAgICIgIHJldHVybiBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpO1xuIgorICAgICAgIn0iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICAvLyBGaWVsZCBnZXRSZXBlYXRlZEZpZWxkKGludCBpbmRleCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JChpbnQgaW5kZXgpIHtcbiIKKyAgICAgICIgIHJldHVybiBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW5kZXgpO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIC8vIEJ1aWxkZXIgc2V0UmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgsIEZpZWxkIHZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGNvcHlPbldyaXRlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgIGluc3RhbmNlLnNldCRjYXBpdGFsaXplZF9uYW1lJChpbmRleCwgdmFsdWUpO1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIC8vIEJ1aWxkZXIgc2V0UmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgsIEZpZWxkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGludCBpbmRleCwgJHR5cGUkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGNvcHlPbldyaXRlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgIGluc3RhbmNlLnNldCRjYXBpdGFsaXplZF9uYW1lJChpbmRleCxcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgIGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICAvLyBCdWlsZGVyIGFkZFJlcGVhdGVkRmllbGQoRmllbGQgdmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAiCisgICAgICAgICAgICAgICAgICIkeyRhZGQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGNvcHlPbldyaXRlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgIGluc3RhbmNlLmFkZCRjYXBpdGFsaXplZF9uYW1lJCh2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgLy8gQnVpbGRlciBhZGRSZXBlYXRlZEZpZWxkKGludCBpbmRleCwgRmllbGQgdmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRhZGQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaW5zdGFuY2UuYWRkJGNhcGl0YWxpemVkX25hbWUkKGluZGV4LCB2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIC8vIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChGaWVsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGFkZCRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkdHlwZSQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaW5zdGFuY2UuYWRkJGNhcGl0YWxpemVkX25hbWUkKGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICAvLyBCdWlsZGVyIGFkZFJlcGVhdGVkRmllbGQoaW50IGluZGV4LCBGaWVsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGFkZCRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBpbnQgaW5kZXgsICR0eXBlJC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICBpbnN0YW5jZS5hZGQkY2FwaXRhbGl6ZWRfbmFtZSQoaW5kZXgsXG4iCisgICAgICAgICAgICAgICAgICIgICAgICBidWlsZGVyRm9yVmFsdWUuYnVpbGQoKSk7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgLy8gQnVpbGRlciBhZGRBbGxSZXBlYXRlZEZpZWxkKEl0ZXJhYmxlPEZpZWxkPiB2YWx1ZXMpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRhZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgamF2YS5sYW5nLkl0ZXJhYmxlPD8gZXh0ZW5kcyAkdHlwZSQ+IHZhbHVlcykge1xuIgorICAgICAgICAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICBpbnN0YW5jZS5hZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQodmFsdWVzKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICAvLyBCdWlsZGVyIGNsZWFyQWxsUmVwZWF0ZWRGaWVsZCgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICIgIGNvcHlPbldyaXRlKCk7XG4iCisgICAgICAiICBpbnN0YW5jZS5jbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgorICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgLy8gQnVpbGRlciByZW1vdmVSZXBlYXRlZEZpZWxkKGludCBpbmRleCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgIiR7JHJlbW92ZSRjYXBpdGFsaXplZF9uYW1lJCR9JChpbnQgaW5kZXgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaW5zdGFuY2UucmVtb3ZlJGNhcGl0YWxpemVkX25hbWUkKGluZGV4KTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlRmllbGRJbmZvKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4qIG91dHB1dCkgY29uc3QgeworICBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoZGVzY3JpcHRvcl8tPm51bWJlcigpLCBvdXRwdXQpOworICBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoR2V0RXhwZXJpbWVudGFsSmF2YUZpZWxkVHlwZShkZXNjcmlwdG9yXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiXCIkbmFtZSRfXCIsXG4iCisgICAgICAgICAgICAgICAgICIkdHlwZSQuY2xhc3MsXG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gZW1wdHlQcm90b2J1Zkxpc3QoKTtcbiIpOworfQorCitzdGQ6OnN0cmluZyBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZExpdGVHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlS290bGluRHNsTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiLyoqXG4iCisgICAgICAiICogQW4gdW5pbnN0YW50aWFibGUsIGJlaGF2aW9ybGVzcyB0eXBlIHRvIHJlcHJlc2VudCB0aGUgZmllbGQgaW5cbiIKKyAgICAgICIgKiBnZW5lcmljcy5cbiIKKyAgICAgICIgKi9cbiIKKyAgICAgICJAa290bGluLk9wdEluIgorICAgICAgIihjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Pbmx5Rm9yVXNlQnlHZW5lcmF0ZWRQcm90b0NvZGU6OmNsYXNzKVxuIgorICAgICAgImNsYXNzICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kIHByaXZhdGUgY29uc3RydWN0b3IoKSIKKyAgICAgICIgOiBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xQcm94eSgpXG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIka3RfZGVwcmVjYXRpb24kIHZhbCAka3RfbmFtZSQ6ICIKKyAgICAgICAgICAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAgICAgICAgICAgICI8JGt0X3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD5cbiIKKyAgICAgICAgICAgICAgICAgIiAgQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICIgIGdldCgpID0gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAka3RfZHNsX2J1aWxkZXIkLiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QkfSQoKVxuIgorICAgICAgICAgICAgICAgICAiICApXG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwiYWRkJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAgICAgICAgICAgICJmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAgICAgICAgICAgICJhZGQodmFsdWU6ICRrdF90eXBlJCkge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGFkZCRjYXBpdGFsaXplZF9uYW1lJCR9JCh2YWx1ZSlcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfQURERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyBmYWxzZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bU5hbWUoXCJwbHVzQXNzaWduJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAgICAgICAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgICAgICAgICAgICAiaW5saW5lIG9wZXJhdG9yIGZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xMaXN0IgorICAgICAgICAgICAgICAgICAiPCRrdF90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICAgICAgICAgICAgInBsdXNBc3NpZ24odmFsdWU6ICRrdF90eXBlJCkge1xuIgorICAgICAgICAgICAgICAgICAiICBhZGQodmFsdWUpXG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX01VTFRJX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwiYWRkQWxsJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAgICAgICAgICAgICJmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAgICAgICAgICAgICJhZGRBbGwodmFsdWVzOiBrb3RsaW4uY29sbGVjdGlvbnMuSXRlcmFibGU8JGt0X3R5cGUkPikge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJCR9JCh2YWx1ZXMpXG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX01VTFRJX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcInBsdXNBc3NpZ25BbGwka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICI8JGt0X3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD4uIgorICAgICAgInBsdXNBc3NpZ24odmFsdWVzOiBrb3RsaW4uY29sbGVjdGlvbnMuSXRlcmFibGU8JGt0X3R5cGUkPikge1xuIgorICAgICAgIiAgYWRkQWxsKHZhbHVlcylcbiIKKyAgICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0lOREVYRURfU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcInNldCRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgIm9wZXJhdG9yIGZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xMaXN0IgorICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAic2V0KGluZGV4OiBrb3RsaW4uSW50LCB2YWx1ZTogJGt0X3R5cGUkKSB7XG4iCisgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JChpbmRleCwgdmFsdWUpXG4iCisgICAgICAifVxuIik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcImNsZWFyJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAgICAgICAgICAgICJmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAgICAgICAgICAgICJjbGVhcigpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJGt0X2RzbF9idWlsZGVyJC4keyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpXG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZV9maWVsZF9saXRlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZV9maWVsZF9saXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI1M2FjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2ZpZWxkX2xpdGUuaApAQCAtMCwwICsxLDE0MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01FU1NBR0VfRklFTERfTElURV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUVTU0FHRV9GSUVMRF9MSVRFX0hfXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKK2NsYXNzIENvbnRleHQ7ICAgICAgICAgICAgLy8gY29udGV4dC5oCitjbGFzcyBDbGFzc05hbWVSZXNvbHZlcjsgIC8vIG5hbWVfcmVzb2x2ZXIuaAorfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK2NsYXNzIEltbXV0YWJsZU1lc3NhZ2VGaWVsZExpdGVHZW5lcmF0b3IgOiBwdWJsaWMgSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEltbXV0YWJsZU1lc3NhZ2VGaWVsZExpdGVHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCk7CisgIH5JbW11dGFibGVNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gaW1wbGVtZW50cyBJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEluZm8oaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+KiBvdXRwdXQpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlS290bGluRHNsTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjpzdHJpbmcgR2V0Qm94ZWRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyaWFibGVzXzsKKyAgY29uc3QgaW50IG1lc3NhZ2VCaXRJbmRleF87CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yKTsKKyAgdm9pZCBHZW5lcmF0ZUtvdGxpbk9yTnVsbChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Cit9OworCitjbGFzcyBJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZExpdGVHZW5lcmF0b3IKKyAgICA6IHB1YmxpYyBJbW11dGFibGVNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCk7CisgIH5JbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZExpdGVHZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEluZm8oaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+KiBvdXRwdXQpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcik7Cit9OworCitjbGFzcyBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZExpdGVHZW5lcmF0b3IKKyAgICA6IHB1YmxpYyBJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKKyAgflJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlRmllbGRJbmZvKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcmlhYmxlc187CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZExpdGVHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUVTU0FHRV9GSUVMRF9MSVRFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfbGl0ZS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2xpdGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQyYWUzZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2xpdGUuY2MKQEAgLTAsMCArMSwxMDAzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBkd2Vpc0Bnb29nbGUuY29tIChEYW5pZWwgV2VpcykKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZV9saXRlLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZG9jX2NvbW1lbnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9lbnVtX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9leHRlbnNpb25fbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvcl9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL21lc3NhZ2VfYnVpbGRlcl9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZV9yZXNvbHZlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisKKy8vIE11c3QgYmUgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSW1tdXRhYmxlTWVzc2FnZUxpdGVHZW5lcmF0b3I6OkltbXV0YWJsZU1lc3NhZ2VMaXRlR2VuZXJhdG9yKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIENvbnRleHQqIGNvbnRleHQpCisgICAgOiBNZXNzYWdlR2VuZXJhdG9yKGRlc2NyaXB0b3IpLAorICAgICAgY29udGV4dF8oY29udGV4dCksCisgICAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSksCisgICAgICBmaWVsZF9nZW5lcmF0b3JzXyhkZXNjcmlwdG9yLCBjb250ZXh0XykgeworICBHT09HTEVfQ0hFQ0soIUhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3ItPmZpbGUoKSwgY29udGV4dC0+RW5mb3JjZUxpdGUoKSkpCisgICAgICA8PCAiR2VuZXJhdG9yIGZhY3RvcnkgZXJyb3I6IEEgbGl0ZSBtZXNzYWdlIGdlbmVyYXRvciBpcyB1c2VkIHRvICIKKyAgICAgICAgICJnZW5lcmF0ZSBub24tbGl0ZSBtZXNzYWdlcy4iOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoSXNSZWFsT25lb2YoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKSkgeworICAgICAgb25lb2ZzXy5pbnNlcnQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpLT5jb250YWluaW5nX29uZW9mKCkpOworICAgIH0KKyAgfQorfQorCitJbW11dGFibGVNZXNzYWdlTGl0ZUdlbmVyYXRvcjo6fkltbXV0YWJsZU1lc3NhZ2VMaXRlR2VuZXJhdG9yKCkge30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGludCogYnl0ZWNvZGVfZXN0aW1hdGUpIHsKKyAgLy8gR2VuZXJhdGUgc3RhdGljIG1lbWJlcnMgZm9yIGFsbCBuZXN0ZWQgdHlwZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIC8vIFRPRE8oa2VudG9uKTogIFJldXNlIE1lc3NhZ2VHZW5lcmF0b3Igb2JqZWN0cz8KKyAgICBJbW11dGFibGVNZXNzYWdlTGl0ZUdlbmVyYXRvcihkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSksIGNvbnRleHRfKQorICAgICAgICAuR2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMocHJpbnRlciwgYnl0ZWNvZGVfZXN0aW1hdGUpOworICB9Cit9CisKK2ludCBJbW11dGFibGVNZXNzYWdlTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpbnQgYnl0ZWNvZGVfZXN0aW1hdGUgPSAwOworICAvLyBHZW5lcmF0ZSBzdGF0aWMgbWVtYmVyIGluaXRpYWxpemVycyBmb3IgYWxsIG5lc3RlZCB0eXBlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgLy8gVE9ETyhrZW50b24pOiAgUmV1c2UgTWVzc2FnZUdlbmVyYXRvciBvYmplY3RzPworICAgIGJ5dGVjb2RlX2VzdGltYXRlICs9CisgICAgICAgIEltbXV0YWJsZU1lc3NhZ2VMaXRlR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSwgY29udGV4dF8pCisgICAgICAgICAgICAuR2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycyhwcmludGVyKTsKKyAgfQorICByZXR1cm4gYnl0ZWNvZGVfZXN0aW1hdGU7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBJbW11dGFibGVNZXNzYWdlTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVJbnRlcmZhY2UoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgTWF5YmVQcmludEdlbmVyYXRlZEFubm90YXRpb24oY29udGV4dF8sIHByaW50ZXIsIGRlc2NyaXB0b3JfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW11dGFibGUgPSAqLyB0cnVlLCAiT3JCdWlsZGVyIik7CisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludGVyZmFjZSAkeyQkY2xhc3NuYW1lJE9yQnVpbGRlciR9JCBleHRlbmRzIFxuIgorICAgICAgICAiICAgICRleHRyYV9pbnRlcmZhY2VzJFxuIgorICAgICAgICAiICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLlxuIgorICAgICAgICAiICAgICAgICAgIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPFxuIgorICAgICAgICAiICAgICAgICAgICAgICAkY2xhc3NuYW1lJCwgJGNsYXNzbmFtZSQuQnVpbGRlcj4ge1xuIiwKKyAgICAgICAgImRlcHJlY2F0aW9uIiwKKyAgICAgICAgZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkICIgOiAiIiwKKyAgICAgICAgImV4dHJhX2ludGVyZmFjZXMiLCBFeHRyYU1lc3NhZ2VPckJ1aWxkZXJJbnRlcmZhY2VzKGRlc2NyaXB0b3JfKSwKKyAgICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCksICJ7IiwgIiIsICJ9IiwgIiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnRlcmZhY2UgJHskJGNsYXNzbmFtZSRPckJ1aWxkZXIkfSQgZXh0ZW5kc1xuIgorICAgICAgICAiICAgICRleHRyYV9pbnRlcmZhY2VzJFxuIgorICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZUxpdGVPckJ1aWxkZXIge1xuIiwKKyAgICAgICAgImRlcHJlY2F0aW9uIiwKKyAgICAgICAgZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkICIgOiAiIiwKKyAgICAgICAgImV4dHJhX2ludGVyZmFjZXMiLCBFeHRyYU1lc3NhZ2VPckJ1aWxkZXJJbnRlcmZhY2VzKGRlc2NyaXB0b3JfKSwKKyAgICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCksICJ7IiwgIiIsICJ9IiwgIiIpOworICB9CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgIC5HZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMocHJpbnRlcik7CisgIH0KKyAgZm9yIChhdXRvIG9uZW9mIDogb25lb2ZzXykgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgJGNsYXNzbmFtZSQuJG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSAiCisgICAgICAgICJnZXQkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlKCk7XG4iLAorICAgICAgICAib25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSIsCisgICAgICAgIGNvbnRleHRfLT5HZXRPbmVvZkdlbmVyYXRvckluZm8ob25lb2YpLT5jYXBpdGFsaXplZF9uYW1lLCAiY2xhc3NuYW1lIiwKKyAgICAgICAgY29udGV4dF8tPkdldE5hbWVSZXNvbHZlcigpLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgfQorICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUxpdGVHZW5lcmF0b3I6OkdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGJvb2wgaXNfb3duX2ZpbGUgPSBJc093bkZpbGUoZGVzY3JpcHRvcl8sIC8qIGltbXV0YWJsZSA9ICovIHRydWUpOworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyaWFibGVzOworICB2YXJpYWJsZXNbInN0YXRpYyJdID0gaXNfb3duX2ZpbGUgPyAiICIgOiAiIHN0YXRpYyAiOworICB2YXJpYWJsZXNbImNsYXNzbmFtZSJdID0gZGVzY3JpcHRvcl8tPm5hbWUoKTsKKyAgdmFyaWFibGVzWyJleHRyYV9pbnRlcmZhY2VzIl0gPSBFeHRyYU1lc3NhZ2VJbnRlcmZhY2VzKGRlc2NyaXB0b3JfKTsKKyAgdmFyaWFibGVzWyJkZXByZWNhdGlvbiJdID0KKyAgICAgIGRlc2NyaXB0b3JfLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpID8gIkBqYXZhLmxhbmcuRGVwcmVjYXRlZCAiIDogIiI7CisKKyAgV3JpdGVNZXNzYWdlRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIE1heWJlUHJpbnRHZW5lcmF0ZWRBbm5vdGF0aW9uKGNvbnRleHRfLCBwcmludGVyLCBkZXNjcmlwdG9yXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tdXRhYmxlID0gKi8gdHJ1ZSk7CisKKworICAvLyBUaGUgYnVpbGRlcl90eXBlIHN0b3JlcyB0aGUgc3VwZXIgdHlwZSBuYW1lIG9mIHRoZSBuZXN0ZWQgQnVpbGRlciBjbGFzcy4KKyAgc3RkOjpzdHJpbmcgYnVpbGRlcl90eXBlOworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXMsCisgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICRzdGF0aWMkZmluYWwgY2xhc3MgJGNsYXNzbmFtZSQgZXh0ZW5kc1xuIgorICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGUuRXh0ZW5kYWJsZU1lc3NhZ2U8XG4iCisgICAgICAgICIgICAgICAkY2xhc3NuYW1lJCwgJGNsYXNzbmFtZSQuQnVpbGRlcj4gaW1wbGVtZW50c1xuIgorICAgICAgICAiICAgICRleHRyYV9pbnRlcmZhY2VzJFxuIgorICAgICAgICAiICAgICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIpOworICAgIGJ1aWxkZXJfdHlwZSA9IHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLkV4dGVuZGFibGVCdWlsZGVyPCQwLCA/PiIsCisgICAgICAgIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzLAorICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkc3RhdGljJGZpbmFsIGNsYXNzICRjbGFzc25hbWUkIGV4dGVuZHNcbiIKKyAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlPFxuIgorICAgICAgICAiICAgICAgICAkY2xhc3NuYW1lJCwgJGNsYXNzbmFtZSQuQnVpbGRlcj4gaW1wbGVtZW50c1xuIgorICAgICAgICAiICAgICRleHRyYV9pbnRlcmZhY2VzJFxuIgorICAgICAgICAiICAgICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIpOworCisgICAgYnVpbGRlcl90eXBlID0gImNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGUuQnVpbGRlciI7CisgIH0KKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgR2VuZXJhdGVDb25zdHJ1Y3RvcihwcmludGVyKTsKKworICAvLyBOZXN0ZWQgdHlwZXMKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIEVudW1MaXRlR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5lbnVtX3R5cGUoaSksIHRydWUsIGNvbnRleHRfKQorICAgICAgICAuR2VuZXJhdGUocHJpbnRlcik7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAvLyBEb24ndCBnZW5lcmF0ZSBKYXZhIGNsYXNzZXMgZm9yIG1hcCBlbnRyeSBtZXNzYWdlcy4KKyAgICBpZiAoSXNNYXBFbnRyeShkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSkpKSBjb250aW51ZTsKKyAgICBJbW11dGFibGVNZXNzYWdlTGl0ZUdlbmVyYXRvciBtZXNzYWdlR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfKTsKKyAgICBtZXNzYWdlR2VuZXJhdG9yLkdlbmVyYXRlSW50ZXJmYWNlKHByaW50ZXIpOworICAgIG1lc3NhZ2VHZW5lcmF0b3IuR2VuZXJhdGUocHJpbnRlcik7CisgIH0KKworICAvLyBJbnRlZ2VycyBmb3IgYml0IGZpZWxkcy4KKyAgaW50IHRvdGFsQml0cyA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIHRvdGFsQml0cyArPQorICAgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKS5HZXROdW1CaXRzRm9yTWVzc2FnZSgpOworICB9CisgIGludCB0b3RhbEludHMgPSAodG90YWxCaXRzICsgMzEpIC8gMzI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxJbnRzOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgicHJpdmF0ZSBpbnQgJGJpdF9maWVsZF9uYW1lJDtcbiIsICJiaXRfZmllbGRfbmFtZSIsCisgICAgICAgICAgICAgICAgICAgR2V0Qml0RmllbGROYW1lKGkpKTsKKyAgfQorCisgIC8vIG9uZW9mCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgZm9yIChhdXRvIG9uZW9mIDogb25lb2ZzXykgeworICAgIHZhcnNbIm9uZW9mX25hbWUiXSA9IGNvbnRleHRfLT5HZXRPbmVvZkdlbmVyYXRvckluZm8ob25lb2YpLT5uYW1lOworICAgIHZhcnNbIm9uZW9mX2NhcGl0YWxpemVkX25hbWUiXSA9CisgICAgICAgIGNvbnRleHRfLT5HZXRPbmVvZkdlbmVyYXRvckluZm8ob25lb2YpLT5jYXBpdGFsaXplZF9uYW1lOworICAgIHZhcnNbIm9uZW9mX2luZGV4Il0gPSBTdHJDYXQoKG9uZW9mKS0+aW5kZXgoKSk7CisgICAgLy8gb25lb2ZDYXNlXyBhbmQgb25lb2ZfCisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgICAgICAgICAgICAicHJpdmF0ZSBpbnQgJG9uZW9mX25hbWUkQ2FzZV8gPSAwO1xuIgorICAgICAgICAgICAgICAgICAgICJwcml2YXRlIGphdmEubGFuZy5PYmplY3QgJG9uZW9mX25hbWUkXztcbiIpOworICAgIC8vIE9uZW9mQ2FzZSBlbnVtCisgICAgcHJpbnRlci0+UHJpbnQodmFycywgInB1YmxpYyBlbnVtICRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2Uge1xuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAob25lb2YpLT5maWVsZF9jb3VudCgpOyBqKyspIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSAob25lb2YpLT5maWVsZChqKTsKKyAgICAgIHByaW50ZXItPlByaW50KCIkZmllbGRfbmFtZSQoJGZpZWxkX251bWJlciQpLFxuIiwgImZpZWxkX25hbWUiLAorICAgICAgICAgICAgICAgICAgICAgVG9VcHBlcihmaWVsZC0+bmFtZSgpKSwgImZpZWxkX251bWJlciIsCisgICAgICAgICAgICAgICAgICAgICBTdHJDYXQoZmllbGQtPm51bWJlcigpKSk7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KCIkY2FwX29uZW9mX25hbWUkX05PVF9TRVQoMCk7XG4iLCAiY2FwX29uZW9mX25hbWUiLAorICAgICAgICAgICAgICAgICAgIFRvVXBwZXIodmFyc1sib25lb2ZfbmFtZSJdKSk7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgICAgICAgICAgICAicHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7XG4iCisgICAgICAgICAgICAgICAgICAgInByaXZhdGUgJG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZShpbnQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICB0aGlzLnZhbHVlID0gdmFsdWU7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJzLAorICAgICAgICAiLyoqXG4iCisgICAgICAgICIgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNmb3JOdW1iZXIoaW50KX0gaW5zdGVhZC5cbiIKKyAgICAgICAgIiAqL1xuIgorICAgICAgICAiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljICRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2UgdmFsdWVPZihpbnQgdmFsdWUpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuIGZvck51bWJlcih2YWx1ZSk7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgJG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSBmb3JOdW1iZXIoaW50IHZhbHVlKSB7XG4iCisgICAgICAgICIgIHN3aXRjaCAodmFsdWUpIHtcbiIpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgKG9uZW9mKS0+ZmllbGRfY291bnQoKTsgaisrKSB7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gKG9uZW9mKS0+ZmllbGQoaik7CisgICAgICBwcmludGVyLT5QcmludCgiICAgIGNhc2UgJGZpZWxkX251bWJlciQ6IHJldHVybiAkZmllbGRfbmFtZSQ7XG4iLAorICAgICAgICAgICAgICAgICAgICAgImZpZWxkX251bWJlciIsIFN0ckNhdChmaWVsZC0+bnVtYmVyKCkpLAorICAgICAgICAgICAgICAgICAgICAgImZpZWxkX25hbWUiLCBUb1VwcGVyKGZpZWxkLT5uYW1lKCkpKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgICAgY2FzZSAwOiByZXR1cm4gJGNhcF9vbmVvZl9uYW1lJF9OT1RfU0VUO1xuIgorICAgICAgICAiICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuIgorICAgICAgICAiICB9XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgIC8vIFRPRE8oYi8xMzU2MjA2NTkpOiBSZW5hbWUgdGhpcyB0byAiZ2V0RmllbGROdW1iZXIiIG9yIHNvbWV0aGluZyB0bworICAgICAgICAvLyBkaXNhbWJpZ3VhdGUgaXQgZnJvbSBhY3R1YWwgcHJvdG8gZW51bXMuCisgICAgICAgICJwdWJsaWMgaW50IGdldE51bWJlcigpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuIHRoaXMudmFsdWU7XG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICAiY2FwX29uZW9mX25hbWUiLCBUb1VwcGVyKHZhcnNbIm9uZW9mX25hbWUiXSkpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifTtcblxuIik7CisgICAgLy8gb25lb2ZDYXNlKCkKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICAgInB1YmxpYyAkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlXG4iCisgICAgICAgICAgICAgICAgICAgImdldCRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2UoKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2UuZm9yTnVtYmVyKFxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAkb25lb2ZfbmFtZSRDYXNlXyk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBjbGVhciRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkb25lb2ZfbmFtZSRDYXNlXyA9IDA7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgJG9uZW9mX25hbWUkXyA9IG51bGw7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iKTsKKyAgfQorCisgIC8vIEZpZWxkcworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgicHVibGljIHN0YXRpYyBmaW5hbCBpbnQgJGNvbnN0YW50X25hbWUkID0gJG51bWJlciQ7XG4iLAorICAgICAgICAgICAgICAgICAgICJjb25zdGFudF9uYW1lIiwgRmllbGRDb25zdGFudE5hbWUoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKSwKKyAgICAgICAgICAgICAgICAgICAibnVtYmVyIiwgU3RyQ2F0KGRlc2NyaXB0b3JfLT5maWVsZChpKS0+bnVtYmVyKCkpKTsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKS5HZW5lcmF0ZU1lbWJlcnMocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgIH0KKworICBHZW5lcmF0ZVBhcnNlRnJvbU1ldGhvZHMocHJpbnRlcik7CisgIEdlbmVyYXRlQnVpbGRlcihwcmludGVyKTsKKworICBpZiAoSGFzUmVxdWlyZWRGaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgLy8gTWVtb2l6ZXMgd2hldGhlciB0aGUgcHJvdG9jb2wgYnVmZmVyIGlzIGZ1bGx5IGluaXRpYWxpemVkIChoYXMgYWxsCisgICAgLy8gcmVxdWlyZWQgZmllbGRzKS4gMCBtZWFucyBmYWxzZSwgMSBtZWFucyB0cnVlLCBhbmQgYWxsIG90aGVyIHZhbHVlcworICAgIC8vIG1lYW4gbm90IHlldCBjb21wdXRlZC4KKyAgICBwcmludGVyLT5QcmludCgicHJpdmF0ZSBieXRlIG1lbW9pemVkSXNJbml0aWFsaXplZCA9IDI7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICJAamF2YS5sYW5nLlN1cHByZXNzV2FybmluZ3Moe1widW5jaGVja2VkXCIsIFwiZmFsbHRocm91Z2hcIn0pXG4iCisgICAgICAicHJvdGVjdGVkIGZpbmFsIGphdmEubGFuZy5PYmplY3QgZHluYW1pY01ldGhvZChcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5NZXRob2RUb0ludm9rZSBtZXRob2QsXG4iCisgICAgICAiICAgIGphdmEubGFuZy5PYmplY3QgYXJnMCwgamF2YS5sYW5nLk9iamVjdCBhcmcxKSB7XG4iCisgICAgICAiICBzd2l0Y2ggKG1ldGhvZCkge1xuIgorICAgICAgIiAgICBjYXNlIE5FV19NVVRBQkxFX0lOU1RBTkNFOiB7XG4iCisgICAgICAiICAgICAgcmV0dXJuIG5ldyAkY2xhc3NuYW1lJCgpO1xuIgorICAgICAgIiAgICB9XG4iLAorICAgICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoImNhc2UgTkVXX0JVSUxERVI6IHtcbiIpOworCisgIHByaW50ZXItPkluZGVudCgpOworICBHZW5lcmF0ZUR5bmFtaWNNZXRob2ROZXdCdWlsZGVyKHByaW50ZXIpOworICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAifVxuIgorICAgICAgImNhc2UgQlVJTERfTUVTU0FHRV9JTkZPOiB7XG4iKTsKKworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgR2VuZXJhdGVEeW5hbWljTWV0aG9kTmV3QnVpbGRNZXNzYWdlSW5mbyhwcmludGVyKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgIn1cbiIKKyAgICAgICIvLyBmYWxsIHRocm91Z2hcbiIKKyAgICAgICJjYXNlIEdFVF9ERUZBVUxUX0lOU1RBTkNFOiB7XG4iCisgICAgICAiICByZXR1cm4gREVGQVVMVF9JTlNUQU5DRTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiY2FzZSBHRVRfUEFSU0VSOiB7XG4iCisgICAgICAvLyBHZW5lcmFsbHkgb25lIHdvdWxkIHVzZSB0aGUgbGF6eSBpbml0aWFsaXphdGlvbiBob2xkZXIgcGF0dGVybiBmb3IKKyAgICAgIC8vIG1hbmlwdWxhdGluZyBzdGF0aWMgZmllbGRzIGJ1dCB0aGF0IGhhcyBleGNlcHRpb25hbCBjb3N0IG9uIEFuZHJvaWQgYXMKKyAgICAgIC8vIGl0IHdpbGwgZ2VuZXJhdGUgYW4gZXh0cmEgY2xhc3MgZm9yIGV2ZXJ5IG1lc3NhZ2UuIEluc3RlYWQsIHVzZSB0aGUKKyAgICAgIC8vIGRvdWJsZS1jaGVjayBsb2NraW5nIHBhdHRlcm4gd2hpY2ggd29ya3MganVzdCBhcyB3ZWxsLgorICAgICAgLy8KKyAgICAgIC8vIFRoZSAicGFyc2VyIiB0ZW1wb3JhcnkgbWlycm9ycyB0aGUgIlBBUlNFUiIgZmllbGQgdG8gZWxpbWluYXRlIGEgcmVhZAorICAgICAgLy8gYXQgdGhlIGZpbmFsIHJldHVybiBzdGF0ZW1lbnQuCisgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLlBhcnNlcjwkY2xhc3NuYW1lJD4gcGFyc2VyID0gUEFSU0VSO1xuIgorICAgICAgIiAgaWYgKHBhcnNlciA9PSBudWxsKSB7XG4iCisgICAgICAiICAgIHN5bmNocm9uaXplZCAoJGNsYXNzbmFtZSQuY2xhc3MpIHtcbiIKKyAgICAgICIgICAgICBwYXJzZXIgPSBQQVJTRVI7XG4iCisgICAgICAiICAgICAgaWYgKHBhcnNlciA9PSBudWxsKSB7XG4iCisgICAgICAiICAgICAgICBwYXJzZXIgPVxuIgorICAgICAgIiAgICAgICAgICAgIG5ldyBEZWZhdWx0SW5zdGFuY2VCYXNlZFBhcnNlcjwkY2xhc3NuYW1lJD4oXG4iCisgICAgICAiICAgICAgICAgICAgICAgIERFRkFVTFRfSU5TVEFOQ0UpO1xuIgorICAgICAgIiAgICAgICAgUEFSU0VSID0gcGFyc2VyO1xuIgorICAgICAgIiAgICAgIH1cbiIKKyAgICAgICIgICAgfVxuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgcmV0dXJuIHBhcnNlcjtcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKworICBpZiAoSGFzUmVxdWlyZWRGaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ9XG4iCisgICAgICAgICJjYXNlIEdFVF9NRU1PSVpFRF9JU19JTklUSUFMSVpFRDoge1xuIgorICAgICAgICAiICByZXR1cm4gbWVtb2l6ZWRJc0luaXRpYWxpemVkO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiY2FzZSBTRVRfTUVNT0laRURfSVNfSU5JVElBTElaRUQ6IHtcbiIKKyAgICAgICAgIiAgbWVtb2l6ZWRJc0luaXRpYWxpemVkID0gKGJ5dGUpIChhcmcwID09IG51bGwgPyAwIDogMSk7XG4iCisgICAgICAgICIgIHJldHVybiBudWxsO1xuIgorICAgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ9XG4iCisgICAgICAgICJjYXNlIEdFVF9NRU1PSVpFRF9JU19JTklUSUFMSVpFRDoge1xuIgorICAgICAgICAiICByZXR1cm4gKGJ5dGUpIDE7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJjYXNlIFNFVF9NRU1PSVpFRF9JU19JTklUSUFMSVpFRDoge1xuIgorICAgICAgICAiICByZXR1cm4gbnVsbDtcbiIKKyAgICAgICAgIn1cbiIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgIlxuIgorICAgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTokZnVsbF9uYW1lJClcbiIsCisgICAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKKworICAvLyBDYXJlZnVsbHkgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgZG9lc24ndAorICAvLyBjb25mbGljdCB3aXRoIG90aGVyIGluaXRpYWxpemF0aW9uLgorICBwcmludGVyLT5QcmludCgicHJpdmF0ZSBzdGF0aWMgZmluYWwgJGNsYXNzbmFtZSQgREVGQVVMVF9JTlNUQU5DRTtcbiIsCisgICAgICAgICAgICAgICAgICJjbGFzc25hbWUiLAorICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAic3RhdGljIHtcbiIKKyAgICAgICIgICRjbGFzc25hbWUkIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyAkY2xhc3NuYW1lJCgpO1xuIgorICAgICAgIiAgLy8gTmV3IGluc3RhbmNlcyBhcmUgaW1wbGljaXRseSBpbW11dGFibGUgc28gbm8gbmVlZCB0byBtYWtlXG4iCisgICAgICAiICAvLyBpbW11dGFibGUuXG4iCisgICAgICAiICBERUZBVUxUX0lOU1RBTkNFID0gZGVmYXVsdEluc3RhbmNlO1xuIgorICAgICAgLy8gUmVnaXN0ZXIgdGhlIGRlZmF1bHQgaW5zdGFuY2UgaW4gYSBtYXAuIFRoaXMgbWFwIHdpbGwgYmUgdXNlZCBieQorICAgICAgLy8gZXhwZXJpbWVudGFsIHJ1bnRpbWUgdG8gbG9va3VwIGRlZmF1bHQgaW5zdGFuY2UgZ2l2ZW4gYSBjbGFzcyBpbnN0YW5jZQorICAgICAgLy8gd2l0aG91dCB1c2luZyBKYXZhIHJlZmxlY3Rpb24uCisgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLnJlZ2lzdGVyRGVmYXVsdEluc3RhbmNlKFxuIgorICAgICAgIiAgICAkY2xhc3NuYW1lJC5jbGFzcywgZGVmYXVsdEluc3RhbmNlKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgZ2V0RGVmYXVsdEluc3RhbmNlKCkge1xuIgorICAgICAgIiAgcmV0dXJuIERFRkFVTFRfSU5TVEFOQ0U7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisKKyAgLy8gJ29mJyBtZXRob2QgZm9yIFdyYXBwZXJzCisgIGlmIChJc1dyYXBwZXJzUHJvdG9GaWxlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIG9mKCRmaWVsZF90eXBlJCB2YWx1ZSkge1xuIgorICAgICAgICAiICByZXR1cm4gbmV3QnVpbGRlcigpLnNldFZhbHVlKHZhbHVlKS5idWlsZCgpO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiXG4iLAorICAgICAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXyksCisgICAgICAgICJmaWVsZF90eXBlIiwgUHJpbWl0aXZlVHlwZU5hbWUoR2V0SmF2YVR5cGUoZGVzY3JpcHRvcl8tPmZpZWxkKDApKSkpOworICB9CisKKyAgR2VuZXJhdGVQYXJzZXIocHJpbnRlcik7CisKKyAgLy8gRXh0ZW5zaW9ucyBtdXN0IGJlIGRlY2xhcmVkIGFmdGVyIHRoZSBERUZBVUxUX0lOU1RBTkNFIGlzIGluaXRpYWxpemVkCisgIC8vIGJlY2F1c2UgdGhlIERFRkFVTFRfSU5TVEFOQ0UgaXMgdXNlZCBieSB0aGUgZXh0ZW5zaW9uIHRvIGxhemlseSByZXRyaWV2ZQorICAvLyB0aGUgb3V0ZXIgY2xhc3MncyBGaWxlRGVzY3JpcHRvci4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIEltbXV0YWJsZUV4dGVuc2lvbkxpdGVHZW5lcmF0b3IoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbihpKSwgY29udGV4dF8pCisgICAgICAgIC5HZW5lcmF0ZShwcmludGVyKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUxpdGVHZW5lcmF0b3I6OkdlbmVyYXRlRHluYW1pY01ldGhvZE5ld0J1aWxkTWVzc2FnZUluZm8oCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgLy8gQ29sbGVjdCBmaWVsZCBpbmZvIGludG8gYSBzZXF1ZW5jZSBvZiBVVEYtMTYgY2hhcnMuIEl0IHdpbGwgYmUgZW1iZWRkZWQKKyAgLy8gYXMgYSBKYXZhIHN0cmluZyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjaGFyczsKKworICBpbnQgZmxhZ3MgPSAwOworICBpZiAoSXNQcm90bzIoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBmbGFncyB8PSAweDE7CisgIH0KKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgeworICAgIGZsYWdzIHw9IDB4MjsKKyAgfQorICBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoZmxhZ3MsICZjaGFycyk7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSwgJmNoYXJzKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkgPT0gMCkgeworICAgIHByaW50ZXItPlByaW50KCJqYXZhLmxhbmcuT2JqZWN0W10gb2JqZWN0cyA9IG51bGw7Iik7CisgIH0gZWxzZSB7CisgICAgLy8gQSBzaW5nbGUgYXJyYXkgb2YgYWxsIGZpZWxkcyAoaW5jbHVkaW5nIG9uZW9mLCBvbmVvZkNhc2UsIGhhc0JpdHMpLgorICAgIHByaW50ZXItPlByaW50KCJqYXZhLmxhbmcuT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBqYXZhLmxhbmcuT2JqZWN0W10ge1xuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgICAvLyBSZWNvcmQgdGhlIG51bWJlciBvZiBvbmVvZnMuCisgICAgV3JpdGVJbnRUb1V0ZjE2Q2hhclNlcXVlbmNlKG9uZW9mc18uc2l6ZSgpLCAmY2hhcnMpOworICAgIGZvciAoYXV0byBvbmVvZiA6IG9uZW9mc18pIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJcIiRvbmVvZl9uYW1lJF9cIixcbiIKKyAgICAgICAgICAiXCIkb25lb2ZfbmFtZSRDYXNlX1wiLFxuIiwKKyAgICAgICAgICAib25lb2ZfbmFtZSIsIGNvbnRleHRfLT5HZXRPbmVvZkdlbmVyYXRvckluZm8ob25lb2YpLT5uYW1lKTsKKyAgICB9CisKKyAgICAvLyBJbnRlZ2VycyBmb3IgYml0IGZpZWxkcy4KKyAgICBpbnQgdG90YWxfYml0cyA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICB0b3RhbF9iaXRzICs9CisgICAgICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkuR2V0TnVtQml0c0Zvck1lc3NhZ2UoKTsKKyAgICB9CisgICAgaW50IHRvdGFsX2ludHMgPSAodG90YWxfYml0cyArIDMxKSAvIDMyOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfaW50czsgaSsrKSB7CisgICAgICBwcmludGVyLT5QcmludCgiXCIkYml0X2ZpZWxkX25hbWUkXCIsXG4iLCAiYml0X2ZpZWxkX25hbWUiLAorICAgICAgICAgICAgICAgICAgICAgR2V0Qml0RmllbGROYW1lKGkpKTsKKyAgICB9CisgICAgV3JpdGVJbnRUb1V0ZjE2Q2hhclNlcXVlbmNlKHRvdGFsX2ludHMsICZjaGFycyk7CisKKyAgICBpbnQgbWFwX2NvdW50ID0gMDsKKyAgICBpbnQgcmVwZWF0ZWRfY291bnQgPSAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBGaWVsZERlc2NyaXB0b3IqW10+IHNvcnRlZF9maWVsZHMoCisgICAgICAgIFNvcnRGaWVsZHNCeU51bWJlcihkZXNjcmlwdG9yXykpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IHNvcnRlZF9maWVsZHNbaV07CisgICAgICBpZiAoZmllbGQtPmlzX21hcCgpKSB7CisgICAgICAgIG1hcF9jb3VudCsrOworICAgICAgfSBlbHNlIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICByZXBlYXRlZF9jb3VudCsrOworICAgICAgfQorICAgIH0KKworICAgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShzb3J0ZWRfZmllbGRzWzBdLT5udW1iZXIoKSwgJmNoYXJzKTsKKyAgICBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoCisgICAgICAgIHNvcnRlZF9maWVsZHNbZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkgLSAxXS0+bnVtYmVyKCksICZjaGFycyk7CisgICAgV3JpdGVJbnRUb1V0ZjE2Q2hhclNlcXVlbmNlKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpLCAmY2hhcnMpOworICAgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShtYXBfY291bnQsICZjaGFycyk7CisgICAgV3JpdGVJbnRUb1V0ZjE2Q2hhclNlcXVlbmNlKHJlcGVhdGVkX2NvdW50LCAmY2hhcnMpOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzX2Zvcl9pc19pbml0aWFsaXplZF9jaGVjazsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGlmIChkZXNjcmlwdG9yXy0+ZmllbGQoaSktPmlzX3JlcXVpcmVkKCkgfHwKKyAgICAgICAgICAoR2V0SmF2YVR5cGUoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKSA9PSBKQVZBVFlQRV9NRVNTQUdFICYmCisgICAgICAgICAgIEhhc1JlcXVpcmVkRmllbGRzKGRlc2NyaXB0b3JfLT5maWVsZChpKS0+bWVzc2FnZV90eXBlKCkpKSkgeworICAgICAgICBmaWVsZHNfZm9yX2lzX2luaXRpYWxpemVkX2NoZWNrLnB1c2hfYmFjayhkZXNjcmlwdG9yXy0+ZmllbGQoaSkpOworICAgICAgfQorICAgIH0KKyAgICBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoZmllbGRzX2Zvcl9pc19pbml0aWFsaXplZF9jaGVjay5zaXplKCksICZjaGFycyk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBzb3J0ZWRfZmllbGRzW2ldOworICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUZpZWxkSW5mbyhwcmludGVyLCAmY2hhcnMpOworICAgIH0KKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoIn07XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KCJqYXZhLmxhbmcuU3RyaW5nIGluZm8gPVxuIik7CisgIHN0ZDo6c3RyaW5nIGxpbmU7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hhcnMuc2l6ZSgpOyBpKyspIHsKKyAgICB1aW50MTZfdCBjb2RlID0gY2hhcnNbaV07CisgICAgRXNjYXBlVXRmMTZUb1N0cmluZyhjb2RlLCAmbGluZSk7CisgICAgaWYgKGxpbmUuc2l6ZSgpID49IDgwKSB7CisgICAgICBwcmludGVyLT5QcmludCgiICAgIFwiJHN0cmluZyRcIiArXG4iLCAic3RyaW5nIiwgbGluZSk7CisgICAgICBsaW5lLmNsZWFyKCk7CisgICAgfQorICB9CisgIHByaW50ZXItPlByaW50KCIgICAgXCIkc3RyaW5nJFwiO1xuIiwgInN0cmluZyIsIGxpbmUpOworCisgIHByaW50ZXItPlByaW50KCJyZXR1cm4gbmV3TWVzc2FnZUluZm8oREVGQVVMVF9JTlNUQU5DRSwgaW5mbywgb2JqZWN0cyk7XG4iKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUxpdGVHZW5lcmF0b3I6OkdlbmVyYXRlUGFyc2VGcm9tTWV0aG9kcygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRnJvbShcbiIKKyAgICAgICIgICAgamF2YS5uaW8uQnl0ZUJ1ZmZlciBkYXRhKVxuIgorICAgICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIgorICAgICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGUucGFyc2VGcm9tKFxuIgorICAgICAgIiAgICAgIERFRkFVTFRfSU5TVEFOQ0UsIGRhdGEpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRnJvbShcbiIKKyAgICAgICIgICAgamF2YS5uaW8uQnl0ZUJ1ZmZlciBkYXRhLFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKKyAgICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKKyAgICAgICIgIHJldHVybiBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLnBhcnNlRnJvbShcbiIKKyAgICAgICIgICAgICBERUZBVUxUX0lOU1RBTkNFLCBkYXRhLCBleHRlbnNpb25SZWdpc3RyeSk7XG4iCisgICAgICAifVxuIgorICAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgZGF0YSlcbiIKKyAgICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKKyAgICAgICIgIHJldHVybiBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLnBhcnNlRnJvbShcbiIKKyAgICAgICIgICAgICBERUZBVUxUX0lOU1RBTkNFLCBkYXRhKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBkYXRhLFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKKyAgICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKKyAgICAgICIgIHJldHVybiBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLnBhcnNlRnJvbShcbiIKKyAgICAgICIgICAgICBERUZBVUxUX0lOU1RBTkNFLCBkYXRhLCBleHRlbnNpb25SZWdpc3RyeSk7XG4iCisgICAgICAifVxuIgorICAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKVxuIgorICAgICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIgorICAgICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGUucGFyc2VGcm9tKFxuIgorICAgICAgIiAgICAgIERFRkFVTFRfSU5TVEFOQ0UsIGRhdGEpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRnJvbShcbiIKKyAgICAgICIgICAgYnl0ZVtdIGRhdGEsXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgorICAgICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIgorICAgICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGUucGFyc2VGcm9tKFxuIgorICAgICAgIiAgICAgIERFRkFVTFRfSU5TVEFOQ0UsIGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dClcbiIKKyAgICAgICIgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIgorICAgICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGUucGFyc2VGcm9tKFxuIgorICAgICAgIiAgICAgIERFRkFVTFRfSU5TVEFOQ0UsIGlucHV0KTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCisgICAgICAiICAgIGphdmEuaW8uSW5wdXRTdHJlYW0gaW5wdXQsXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgorICAgICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iCisgICAgICAiICByZXR1cm4gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5wYXJzZUZyb20oXG4iCisgICAgICAiICAgICAgREVGQVVMVF9JTlNUQU5DRSwgaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZURlbGltaXRlZEZyb20oamF2YS5pby5JbnB1dFN0cmVhbSAiCisgICAgICAiaW5wdXQpXG4iCisgICAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKKyAgICAgICIgIHJldHVybiBwYXJzZURlbGltaXRlZEZyb20oREVGQVVMVF9JTlNUQU5DRSwgaW5wdXQpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRGVsaW1pdGVkRnJvbShcbiIKKyAgICAgICIgICAgamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dCxcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCisgICAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKKyAgICAgICIgIHJldHVybiBwYXJzZURlbGltaXRlZEZyb20oREVGQVVMVF9JTlNUQU5DRSwgaW5wdXQsICIKKyAgICAgICJleHRlbnNpb25SZWdpc3RyeSk7XG4iCisgICAgICAifVxuIgorICAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpXG4iCisgICAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKKyAgICAgICIgIHJldHVybiBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLnBhcnNlRnJvbShcbiIKKyAgICAgICIgICAgICBERUZBVUxUX0lOU1RBTkNFLCBpbnB1dCk7XG4iCisgICAgICAifVxuIgorICAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgorICAgICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iCisgICAgICAiICByZXR1cm4gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5wYXJzZUZyb20oXG4iCisgICAgICAiICAgICAgREVGQVVMVF9JTlNUQU5DRSwgaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoKSB7XG4iCisgICAgICAiICByZXR1cm4gKEJ1aWxkZXIpIERFRkFVTFRfSU5TVEFOQ0UuY3JlYXRlQnVpbGRlcigpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbmV3QnVpbGRlcigkY2xhc3NuYW1lJCBwcm90b3R5cGUpIHtcbiIKKyAgICAgICIgIHJldHVybiAoQnVpbGRlcikgREVGQVVMVF9JTlNUQU5DRS5jcmVhdGVCdWlsZGVyKHByb3RvdHlwZSk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisKKyAgTWVzc2FnZUJ1aWxkZXJMaXRlR2VuZXJhdG9yIGJ1aWxkZXJHZW5lcmF0b3IoZGVzY3JpcHRvcl8sIGNvbnRleHRfKTsKKyAgYnVpbGRlckdlbmVyYXRvci5HZW5lcmF0ZShwcmludGVyKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUR5bmFtaWNNZXRob2ROZXdCdWlsZGVyKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KCJyZXR1cm4gbmV3IEJ1aWxkZXIoKTtcbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUxpdGVHZW5lcmF0b3I6OkdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgSW1tdXRhYmxlRXh0ZW5zaW9uTGl0ZUdlbmVyYXRvcihkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uKGkpLCBjb250ZXh0XykKKyAgICAgICAgLkdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZShwcmludGVyKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIEltbXV0YWJsZU1lc3NhZ2VMaXRlR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSwgY29udGV4dF8pCisgICAgICAgIC5HZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbkNvZGUocHJpbnRlcik7CisgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordm9pZCBJbW11dGFibGVNZXNzYWdlTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVDb25zdHJ1Y3Rvcihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgicHJpdmF0ZSAkY2xhc3NuYW1lJCgpIHtcbiIsICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgLy8gSW5pdGlhbGl6ZSBhbGwgZmllbGRzIHRvIGRlZmF1bHQuCisgIEdlbmVyYXRlSW5pdGlhbGl6ZXJzKHByaW50ZXIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit2b2lkIEltbXV0YWJsZU1lc3NhZ2VMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZVBhcnNlcihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBjb20uZ29vZ2xlLnByb3RvYnVmLlBhcnNlcjwkY2xhc3NuYW1lJD4gIgorICAgICAgIlBBUlNFUjtcbiIKKyAgICAgICJcbiIKKyAgICAgICJwdWJsaWMgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuUGFyc2VyPCRjbGFzc25hbWUkPiBwYXJzZXIoKSB7XG4iCisgICAgICAiICByZXR1cm4gREVGQVVMVF9JTlNUQU5DRS5nZXRQYXJzZXJGb3JUeXBlKCk7XG4iCisgICAgICAifVxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordm9pZCBJbW11dGFibGVNZXNzYWdlTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVJbml0aWFsaXplcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKCFJc1JlYWxPbmVvZihkZXNjcmlwdG9yXy0+ZmllbGQoaSkpKSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQorICAgICAgICAgIC5HZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShwcmludGVyKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVLb3RsaW5Ec2woCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiQGtvdGxpbi5PcHRJbiIKKyAgICAgICIoY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uT25seUZvclVzZUJ5R2VuZXJhdGVkUHJvdG9Db2RlOjpjbGFzcylcbiIKKyAgICAgICJAY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uUHJvdG9Ec2xNYXJrZXJcbiIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICJjbGFzcyBEc2wgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiIKKyAgICAgICIgIHByaXZhdGUgdmFsIF9idWlsZGVyOiAkbWVzc2FnZSQuQnVpbGRlclxuIgorICAgICAgIikge1xuIgorICAgICAgIiAgY29tcGFuaW9uIG9iamVjdCB7XG4iCisgICAgICAiICAgIEBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIiAgICBAa290bGluLlB1Ymxpc2hlZEFwaVxuIgorICAgICAgIiAgICBpbnRlcm5hbCBmdW4gX2NyZWF0ZShidWlsZGVyOiAkbWVzc2FnZSQuQnVpbGRlcik6IERzbCA9ICIKKyAgICAgICJEc2woYnVpbGRlcilcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJcbiIKKyAgICAgICIgIEBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIiAgQGtvdGxpbi5QdWJsaXNoZWRBcGlcbiIKKyAgICAgICIgIGludGVybmFsIGZ1biBfYnVpbGQoKTogJG1lc3NhZ2UkID0gX2J1aWxkZXIuYnVpbGQoKVxuIiwKKyAgICAgICJtZXNzYWdlIiwgbmFtZV9yZXNvbHZlcl8tPkdldENsYXNzTmFtZShkZXNjcmlwdG9yXywgdHJ1ZSkpOworCisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgIC5HZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMocHJpbnRlcik7CisgIH0KKworICBmb3IgKGF1dG8gb25lb2YgOiBvbmVvZnNfKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ2YWwgJG9uZW9mX25hbWUkQ2FzZTogJG1lc3NhZ2UkLiRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2VcbiIKKyAgICAgICAgIiAgQEp2bU5hbWUoXCJnZXQkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlXCIpXG4iCisgICAgICAgICIgIGdldCgpID0gX2J1aWxkZXIuZ2V0JG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSgpXG5cbiIKKyAgICAgICAgImZ1biBjbGVhciRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAgICAgIiAgX2J1aWxkZXIuY2xlYXIkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSQoKVxuIgorICAgICAgICAifVxuIiwKKyAgICAgICAgIm9uZW9mX25hbWUiLCBjb250ZXh0Xy0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKG9uZW9mKS0+bmFtZSwKKyAgICAgICAgIm9uZW9mX2NhcGl0YWxpemVkX25hbWUiLAorICAgICAgICBjb250ZXh0Xy0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKG9uZW9mKS0+Y2FwaXRhbGl6ZWRfbmFtZSwgIm1lc3NhZ2UiLAorICAgICAgICBuYW1lX3Jlc29sdmVyXy0+R2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3JfLCB0cnVlKSk7CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIEdlbmVyYXRlS290bGluRXh0ZW5zaW9ucyhwcmludGVyKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUtvdGxpbk1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcIi1pbml0aWFsaXplJGNhbWVsY2FzZV9uYW1lJFwiKVxuIgorICAgICAgImlubGluZSBmdW4gJGNhbWVsY2FzZV9uYW1lJChibG9jazogJG1lc3NhZ2Vfa3QkLkRzbC4oKSAtPiAiCisgICAgICAia290bGluLlVuaXQpOiAiCisgICAgICAiJG1lc3NhZ2UkID1cbiIKKyAgICAgICIgICRtZXNzYWdlX2t0JC5Ec2wuX2NyZWF0ZSgkbWVzc2FnZSQubmV3QnVpbGRlcigpKS5hcHBseSB7IGJsb2NrKCkgIgorICAgICAgIn0uX2J1aWxkKClcbiIsCisgICAgICAiY2FtZWxjYXNlX25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0S290bGluRmFjdG9yeU5hbWUoZGVzY3JpcHRvcl8pLAorICAgICAgIm1lc3NhZ2Vfa3QiLCBuYW1lX3Jlc29sdmVyXy0+R2V0S290bGluRXh0ZW5zaW9uc0NsYXNzTmFtZShkZXNjcmlwdG9yXyksCisgICAgICAibWVzc2FnZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRDbGFzc05hbWUoZGVzY3JpcHRvcl8sIHRydWUpKTsKKworICBwcmludGVyLT5QcmludCgib2JqZWN0ICRuYW1lJEt0IHtcbiIsICJuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgIHByaW50ZXItPkluZGVudCgpOworICBHZW5lcmF0ZUtvdGxpbkRzbChwcmludGVyKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKElzTWFwRW50cnkoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpKSkgY29udGludWU7CisgICAgSW1tdXRhYmxlTWVzc2FnZUxpdGVHZW5lcmF0b3IoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpLCBjb250ZXh0XykKKyAgICAgICAgLkdlbmVyYXRlS290bGluTWVtYmVycyhwcmludGVyKTsKKyAgfQorICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVUb3BMZXZlbEtvdGxpbk1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiaW5saW5lIGZ1biAkbWVzc2FnZSQuY29weShibG9jazogJG1lc3NhZ2Vfa3QkLkRzbC4oKSAtPiAiCisgICAgICAia290bGluLlVuaXQpOiAiCisgICAgICAiJG1lc3NhZ2UkID1cbiIKKyAgICAgICIgICRtZXNzYWdlX2t0JC5Ec2wuX2NyZWF0ZSh0aGlzLnRvQnVpbGRlcigpKS5hcHBseSB7IGJsb2NrKCkgIgorICAgICAgIn0uX2J1aWxkKClcblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbmFtZV9yZXNvbHZlcl8tPkdldENsYXNzTmFtZShkZXNjcmlwdG9yXywgdHJ1ZSksICJtZXNzYWdlX2t0IiwKKyAgICAgIG5hbWVfcmVzb2x2ZXJfLT5HZXRLb3RsaW5FeHRlbnNpb25zQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKElzTWFwRW50cnkoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpKSkgY29udGludWU7CisgICAgSW1tdXRhYmxlTWVzc2FnZUxpdGVHZW5lcmF0b3IoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpLCBjb250ZXh0XykKKyAgICAgICAgLkdlbmVyYXRlVG9wTGV2ZWxLb3RsaW5NZW1iZXJzKHByaW50ZXIpOworICB9CisKKyAgR2VuZXJhdGVLb3RsaW5Pck51bGwocHJpbnRlcik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUxpdGVHZW5lcmF0b3I6OkdlbmVyYXRlS290bGluT3JOdWxsKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIEdlbmVyYXRlIGdldEZpZWxkT3JOdWxsIGdldHRlcnMgZm9yIGFsbCBvcHRpb25hbCBtZXNzYWdlIGZpZWxkcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBpZiAoZmllbGQtPmhhc19wcmVzZW5jZSgpICYmIEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9NRVNTQUdFKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAidmFsICRmdWxsX2NsYXNzbmFtZSRPckJ1aWxkZXIuJGNhbWVsY2FzZV9uYW1lJE9yTnVsbDogIgorICAgICAgICAgICIkZnVsbF9uYW1lJD9cbiIKKyAgICAgICAgICAiICBnZXQoKSA9IGlmIChoYXMkbmFtZSQoKSkgZ2V0JG5hbWUkKCkgZWxzZSBudWxsXG5cbiIsCisgICAgICAgICAgImZ1bGxfY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldENsYXNzTmFtZShkZXNjcmlwdG9yXywgdHJ1ZSksCisgICAgICAgICAgImNhbWVsY2FzZV9uYW1lIiwgY29udGV4dF8tPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhmaWVsZCktPm5hbWUsCisgICAgICAgICAgImZ1bGxfbmFtZSIsCisgICAgICAgICAgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCkpLCAibmFtZSIsCisgICAgICAgICAgY29udGV4dF8tPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhmaWVsZCktPmNhcGl0YWxpemVkX25hbWUpOworICAgIH0KKyAgfQorfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUtvdGxpbkV4dGVuc2lvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgbWVzc2FnZV9uYW1lID0gbmFtZV9yZXNvbHZlcl8tPkdldENsYXNzTmFtZShkZXNjcmlwdG9yXywgdHJ1ZSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiQFN1cHByZXNzKFwiVU5DSEVDS0VEX0NBU1RcIilcbiIKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJvcGVyYXRvciBmdW4gPFQgOiBrb3RsaW4uQW55PiBnZXQoZXh0ZW5zaW9uOiAiCisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25MaXRlPCRtZXNzYWdlJCwgVD4pOiBUIHtcbiIKKyAgICAgICIgIHJldHVybiBpZiAoZXh0ZW5zaW9uLmlzUmVwZWF0ZWQpIHtcbiIKKyAgICAgICIgICAgZ2V0KGV4dGVuc2lvbiBhcyBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvbkxpdGU8JG1lc3NhZ2UkLCAiCisgICAgICAiTGlzdDwqPj4pIGFzIFRcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgIF9idWlsZGVyLmdldEV4dGVuc2lvbihleHRlbnNpb24pXG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuXG4iLAorICAgICAgIm1lc3NhZ2UiLCBtZXNzYWdlX25hbWUpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIkBrb3RsaW4uT3B0SW4iCisgICAgICAiKGNvbS5nb29nbGUucHJvdG9idWYua290bGluLk9ubHlGb3JVc2VCeUdlbmVyYXRlZFByb3RvQ29kZTo6Y2xhc3MpXG4iCisgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcIi1nZXRSZXBlYXRlZEV4dGVuc2lvblwiKVxuIgorICAgICAgIm9wZXJhdG9yIGZ1biA8RSA6IGtvdGxpbi5Bbnk+IGdldChcbiIKKyAgICAgICIgIGV4dGVuc2lvbjogY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25MaXRlPCRtZXNzYWdlJCwgTGlzdDxFPj5cbiIKKyAgICAgICIpOiBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5FeHRlbnNpb25MaXN0PEUsICRtZXNzYWdlJD4ge1xuIgorICAgICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkV4dGVuc2lvbkxpc3QoZXh0ZW5zaW9uLCAiCisgICAgICAiX2J1aWxkZXIuZ2V0RXh0ZW5zaW9uKGV4dGVuc2lvbikpXG4iCisgICAgICAifVxuXG4iLAorICAgICAgIm1lc3NhZ2UiLCBtZXNzYWdlX25hbWUpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIm9wZXJhdG9yIGZ1biBjb250YWlucyhleHRlbnNpb246ICIKKyAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvbkxpdGU8JG1lc3NhZ2UkLCAqPik6ICIKKyAgICAgICJCb29sZWFuIHtcbiIKKyAgICAgICIgIHJldHVybiBfYnVpbGRlci5oYXNFeHRlbnNpb24oZXh0ZW5zaW9uKVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJmdW4gY2xlYXIoZXh0ZW5zaW9uOiAiCisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25MaXRlPCRtZXNzYWdlJCwgKj4pICIKKyAgICAgICJ7XG4iCisgICAgICAiICBfYnVpbGRlci5jbGVhckV4dGVuc2lvbihleHRlbnNpb24pXG4iCisgICAgICAifVxuXG4iLAorICAgICAgIm1lc3NhZ2UiLCBtZXNzYWdlX25hbWUpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIkBrb3RsaW4uUHVibGlzaGVkQXBpXG4iCisgICAgICAiaW50ZXJuYWwgZnVuIDxUIDoga290bGluLkFueT4gc2V0RXh0ZW5zaW9uKGV4dGVuc2lvbjogIgorICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uTGl0ZTwkbWVzc2FnZSQsIFQ+LCAiCisgICAgICAidmFsdWU6IFQpIHtcbiIKKyAgICAgICIgIF9idWlsZGVyLnNldEV4dGVuc2lvbihleHRlbnNpb24sIHZhbHVlKVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gPFQgOiBDb21wYXJhYmxlPFQ+PiBzZXQoXG4iCisgICAgICAiICBleHRlbnNpb246IGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uTGl0ZTwkbWVzc2FnZSQsIFQ+LFxuIgorICAgICAgIiAgdmFsdWU6IFRcbiIKKyAgICAgICIpIHtcbiIKKyAgICAgICIgIHNldEV4dGVuc2lvbihleHRlbnNpb24sIHZhbHVlKVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gc2V0KFxuIgorICAgICAgIiAgZXh0ZW5zaW9uOiBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvbkxpdGU8JG1lc3NhZ2UkLCAiCisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nPixcbiIKKyAgICAgICIgIHZhbHVlOiBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKKyAgICAgICIpIHtcbiIKKyAgICAgICIgIHNldEV4dGVuc2lvbihleHRlbnNpb24sIHZhbHVlKVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gPFQgOiBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VMaXRlPiBzZXQoXG4iCisgICAgICAiICBleHRlbnNpb246IGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uTGl0ZTwkbWVzc2FnZSQsIFQ+LFxuIgorICAgICAgIiAgdmFsdWU6IFRcbiIKKyAgICAgICIpIHtcbiIKKyAgICAgICIgIHNldEV4dGVuc2lvbihleHRlbnNpb24sIHZhbHVlKVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJmdW48RSA6IGtvdGxpbi5Bbnk+IGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkV4dGVuc2lvbkxpc3Q8RSwgIgorICAgICAgIiRtZXNzYWdlJD4uYWRkKHZhbHVlOiBFKSB7XG4iCisgICAgICAiICBfYnVpbGRlci5hZGRFeHRlbnNpb24odGhpcy5leHRlbnNpb24sIHZhbHVlKVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gPEUgOiBrb3RsaW4uQW55PiAiCisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRXh0ZW5zaW9uTGlzdDxFLCAiCisgICAgICAiJG1lc3NhZ2UkPi5wbHVzQXNzaWduIgorICAgICAgIih2YWx1ZTogRSkge1xuIgorICAgICAgIiAgYWRkKHZhbHVlKVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJmdW48RSA6IGtvdGxpbi5Bbnk+IGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkV4dGVuc2lvbkxpc3Q8RSwgIgorICAgICAgIiRtZXNzYWdlJD4uYWRkQWxsKHZhbHVlczogSXRlcmFibGU8RT4pIHtcbiIKKyAgICAgICIgIGZvciAodmFsdWUgaW4gdmFsdWVzKSB7XG4iCisgICAgICAiICAgIGFkZCh2YWx1ZSlcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG5cbiIsCisgICAgICAibWVzc2FnZSIsIG1lc3NhZ2VfbmFtZSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiQFN1cHByZXNzKFwiTk9USElOR19UT19JTkxJTkVcIilcbiIKKyAgICAgICJpbmxpbmUgb3BlcmF0b3IgZnVuIDxFIDoga290bGluLkFueT4gIgorICAgICAgImNvbS5nb29nbGUucHJvdG9idWYua290bGluLkV4dGVuc2lvbkxpc3Q8RSwgIgorICAgICAgIiRtZXNzYWdlJD4ucGx1c0Fzc2lnbih2YWx1ZXM6ICIKKyAgICAgICJJdGVyYWJsZTxFPikge1xuIgorICAgICAgIiAgYWRkQWxsKHZhbHVlcylcbiIKKyAgICAgICJ9XG5cbiIsCisgICAgICAibWVzc2FnZSIsIG1lc3NhZ2VfbmFtZSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAib3BlcmF0b3IgZnVuIDxFIDoga290bGluLkFueT4gIgorICAgICAgImNvbS5nb29nbGUucHJvdG9idWYua290bGluLkV4dGVuc2lvbkxpc3Q8RSwgIgorICAgICAgIiRtZXNzYWdlJD4uc2V0KGluZGV4OiBJbnQsIHZhbHVlOiAiCisgICAgICAiRSkge1xuIgorICAgICAgIiAgX2J1aWxkZXIuc2V0RXh0ZW5zaW9uKHRoaXMuZXh0ZW5zaW9uLCBpbmRleCwgdmFsdWUpXG4iCisgICAgICAifVxuXG4iLAorICAgICAgIm1lc3NhZ2UiLCBtZXNzYWdlX25hbWUpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIkBTdXBwcmVzcyhcIk5PVEhJTkdfVE9fSU5MSU5FXCIpXG4iCisgICAgICAiaW5saW5lIGZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5FeHRlbnNpb25MaXN0PCosICIKKyAgICAgICIkbWVzc2FnZSQ+LmNsZWFyKCkge1xuIgorICAgICAgIiAgY2xlYXIoZXh0ZW5zaW9uKVxuIgorICAgICAgIn1cblxuIiwKKyAgICAgICJtZXNzYWdlIiwgbWVzc2FnZV9uYW1lKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZV9saXRlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbWVzc2FnZV9saXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlNGI2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlX2xpdGUuaApAQCAtMCwwICsxLDg1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBkd2Vpc0Bnb29nbGUuY29tIChEYW5pZWwgV2VpcykKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01FU1NBR0VfTElURV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUVTU0FHRV9MSVRFX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9tZXNzYWdlLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK2NsYXNzIEltbXV0YWJsZU1lc3NhZ2VMaXRlR2VuZXJhdG9yIDogcHVibGljIE1lc3NhZ2VHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgSW1tdXRhYmxlTWVzc2FnZUxpdGVHZW5lcmF0b3IoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgQ29udGV4dCogY29udGV4dCk7CisgIH5JbW11dGFibGVNZXNzYWdlTGl0ZUdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlKGlvOjpQcmludGVyKiBwcmludGVyKSBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU3RhdGljVmFyaWFibGVzKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYnl0ZWNvZGVfZXN0aW1hdGUpIG92ZXJyaWRlOworICBpbnQgR2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVLb3RsaW5Ec2woaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlS290bGluTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVUb3BMZXZlbEtvdGxpbk1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgdm9pZCBHZW5lcmF0ZVBhcnNlRnJvbU1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZUR5bmFtaWNNZXRob2ROZXdCdWlsZGVyKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZUluaXRpYWxpemVycyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVQYXJzZXIoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlRHluYW1pY01ldGhvZE5ld0J1aWxkTWVzc2FnZUluZm8oaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlS290bGluRXh0ZW5zaW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVLb3RsaW5Pck51bGwoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCisgIENvbnRleHQqIGNvbnRleHRfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CisgIEZpZWxkR2VuZXJhdG9yTWFwPEltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvcj4gZmllbGRfZ2VuZXJhdG9yc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEltbXV0YWJsZU1lc3NhZ2VMaXRlR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01FU1NBR0VfTElURV9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lX3Jlc29sdmVyLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL25hbWVfcmVzb2x2ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhNjM3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lX3Jlc29sdmVyLmNjCkBAIC0wLDAgKzEsMzg1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL25hbWVfcmVzb2x2ZXIuaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lcy5oPgorCisvLyBNdXN0IGJlIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworbmFtZXNwYWNlIHsKKy8vIEEgc3VmZml4IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZmlsZSdzIG91dGVyIGNsYXNzIG5hbWUgaWYgdGhlIG5hbWUKKy8vIGNvbmZsaWN0cyB3aXRoIHNvbWUgb3RoZXIgdHlwZXMgZGVmaW5lZCBpbiB0aGUgZmlsZS4KK2NvbnN0IGNoYXIqIGtPdXRlckNsYXNzTmFtZVN1ZmZpeCA9ICJPdXRlckNsYXNzIjsKKworLy8gU3RyaXAgcGFja2FnZSBuYW1lIGZyb20gYSBkZXNjcmlwdG9yJ3MgZnVsbCBuYW1lLgorLy8gRm9yIGV4YW1wbGU6CisvLyAgIEZ1bGwgbmFtZSAgIDogZm9vLkJhci5CYXoKKy8vICAgUGFja2FnZSBuYW1lOiBmb28KKy8vICAgQWZ0ZXIgc3RyaXAgOiBCYXIuQmF6CitzdGQ6OnN0cmluZyBTdHJpcFBhY2thZ2VOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIGlmIChmaWxlLT5wYWNrYWdlKCkuZW1wdHkoKSkgeworICAgIHJldHVybiBmdWxsX25hbWU7CisgIH0gZWxzZSB7CisgICAgLy8gU3RyaXAgcGFja2FnZSBuYW1lCisgICAgcmV0dXJuIGZ1bGxfbmFtZS5zdWJzdHIoZmlsZS0+cGFja2FnZSgpLnNpemUoKSArIDEpOworICB9Cit9CisKKy8vIEdldCB0aGUgbmFtZSBvZiBhIG1lc3NhZ2UncyBKYXZhIGNsYXNzIHdpdGhvdXQgcGFja2FnZSBuYW1lIHByZWZpeC4KK3N0ZDo6c3RyaW5nIENsYXNzTmFtZVdpdGhvdXRQYWNrYWdlKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZSkgeworICByZXR1cm4gU3RyaXBQYWNrYWdlTmFtZShkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSwgZGVzY3JpcHRvci0+ZmlsZSgpKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lV2l0aG91dFBhY2thZ2VLb3RsaW4oY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBzdGQ6OnN0cmluZyByZXN1bHQgPSBkZXNjcmlwdG9yLT5uYW1lKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIHRlbXAgPSBkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKTsKKworICB3aGlsZSAodGVtcCkgeworICAgIHJlc3VsdCA9IHRlbXAtPm5hbWUoKSArICJLdC4iICsgcmVzdWx0OworICAgIHRlbXAgPSB0ZW1wLT5jb250YWluaW5nX3R5cGUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBHZXQgdGhlIG5hbWUgb2YgYW4gZW51bSdzIEphdmEgY2xhc3Mgd2l0aG91dCBwYWNrYWdlIG5hbWUgcHJlZml4Lgorc3RkOjpzdHJpbmcgQ2xhc3NOYW1lV2l0aG91dFBhY2thZ2UoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZSkgeworICAvLyBEb2Vzbid0IGFwcGVuZCAiTXV0YWJsZSIgZm9yIGVudW0gdHlwZSdzIG5hbWUuCisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfZGVzY3JpcHRvciA9IGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpOworICBpZiAobWVzc2FnZV9kZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICByZXR1cm4gZGVzY3JpcHRvci0+bmFtZSgpOworICB9IGVsc2UgeworICAgIHJldHVybiBDbGFzc05hbWVXaXRob3V0UGFja2FnZShtZXNzYWdlX2Rlc2NyaXB0b3IsIGltbXV0YWJsZSkgKyAiLiIgKworICAgICAgICAgICBkZXNjcmlwdG9yLT5uYW1lKCk7CisgIH0KK30KKworLy8gR2V0IHRoZSBuYW1lIG9mIGEgc2VydmljZSdzIEphdmEgY2xhc3Mgd2l0aG91dCBwYWNrYWdlIG5hbWUgcHJlZml4Lgorc3RkOjpzdHJpbmcgQ2xhc3NOYW1lV2l0aG91dFBhY2thZ2UoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZSkgeworICBzdGQ6OnN0cmluZyBmdWxsX25hbWUgPQorICAgICAgU3RyaXBQYWNrYWdlTmFtZShkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSwgZGVzY3JpcHRvci0+ZmlsZSgpKTsKKyAgLy8gV2UgZG9uJ3QgYWxsb3cgbmVzdGVkIHNlcnZpY2UgZGVmaW5pdGlvbnMuCisgIEdPT0dMRV9DSEVDSyhmdWxsX25hbWUuZmluZCgnLicpID09IHN0ZDo6c3RyaW5nOjpucG9zKTsKKyAgcmV0dXJuIGZ1bGxfbmFtZTsKK30KKworLy8gUmV0dXJuIHRydWUgaWYgYSBhbmQgYiBhcmUgZXF1YWxzIChjYXNlIGluc2Vuc2l0aXZlKS4KK05hbWVFcXVhbGl0eSBDaGVja05hbWVFcXVhbGl0eShjb25zdCBzdGQ6OnN0cmluZyYgYSwgY29uc3Qgc3RkOjpzdHJpbmcmIGIpIHsKKyAgaWYgKFRvVXBwZXIoYSkgPT0gVG9VcHBlcihiKSkgeworICAgIGlmIChhID09IGIpIHsKKyAgICAgIHJldHVybiBOYW1lRXF1YWxpdHk6OkVYQUNUX0VRVUFMOworICAgIH0KKyAgICByZXR1cm4gTmFtZUVxdWFsaXR5OjpFUVVBTF9JR05PUkVfQ0FTRTsKKyAgfQorICByZXR1cm4gTmFtZUVxdWFsaXR5OjpOT19NQVRDSDsKK30KKworLy8gQ2hlY2sgd2hldGhlciBhIGdpdmVuIG1lc3NhZ2Ugb3IgaXRzIG5lc3RlZCB0eXBlcyBoYXMgdGhlIGdpdmVuIGNsYXNzIG5hbWUuCitib29sIE1lc3NhZ2VIYXNDb25mbGljdGluZ0NsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNsYXNzbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVFcXVhbGl0eSBlcXVhbGl0eV9tb2RlKSB7CisgIGlmIChDaGVja05hbWVFcXVhbGl0eShtZXNzYWdlLT5uYW1lKCksIGNsYXNzbmFtZSkgPT0gZXF1YWxpdHlfbW9kZSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+bmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgaWYgKE1lc3NhZ2VIYXNDb25mbGljdGluZ0NsYXNzTmFtZShtZXNzYWdlLT5uZXN0ZWRfdHlwZShpKSwgY2xhc3NuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxpdHlfbW9kZSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmVudW1fdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoQ2hlY2tOYW1lRXF1YWxpdHkobWVzc2FnZS0+ZW51bV90eXBlKGkpLT5uYW1lKCksIGNsYXNzbmFtZSkgPT0KKyAgICAgICAgZXF1YWxpdHlfbW9kZSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NsYXNzTmFtZVJlc29sdmVyOjpDbGFzc05hbWVSZXNvbHZlcigpIHt9CisKK0NsYXNzTmFtZVJlc29sdmVyOjp+Q2xhc3NOYW1lUmVzb2x2ZXIoKSB7fQorCitzdGQ6OnN0cmluZyBDbGFzc05hbWVSZXNvbHZlcjo6R2V0RmlsZURlZmF1bHRJbW11dGFibGVDbGFzc05hbWUoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgc3RkOjpzdHJpbmcgYmFzZW5hbWU7CisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IGZpbGUtPm5hbWUoKS5maW5kX2xhc3Rfb2YoJy8nKTsKKyAgaWYgKGxhc3Rfc2xhc2ggPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBiYXNlbmFtZSA9IGZpbGUtPm5hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBiYXNlbmFtZSA9IGZpbGUtPm5hbWUoKS5zdWJzdHIobGFzdF9zbGFzaCArIDEpOworICB9CisgIHJldHVybiBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKFN0cmlwUHJvdG8oYmFzZW5hbWUpLCB0cnVlKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lUmVzb2x2ZXI6OkdldEZpbGVJbW11dGFibGVDbGFzc05hbWUoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgc3RkOjpzdHJpbmcmIGNsYXNzX25hbWUgPSBmaWxlX2ltbXV0YWJsZV9vdXRlcl9jbGFzc19uYW1lc19bZmlsZV07CisgIGlmIChjbGFzc19uYW1lLmVtcHR5KCkpIHsKKyAgICBpZiAoZmlsZS0+b3B0aW9ucygpLmhhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpKSB7CisgICAgICBjbGFzc19uYW1lID0gZmlsZS0+b3B0aW9ucygpLmphdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNsYXNzX25hbWUgPSBHZXRGaWxlRGVmYXVsdEltbXV0YWJsZUNsYXNzTmFtZShmaWxlKTsKKyAgICAgIGlmIChIYXNDb25mbGljdGluZ0NsYXNzTmFtZShmaWxlLCBjbGFzc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVFcXVhbGl0eTo6RVhBQ1RfRVFVQUwpKSB7CisgICAgICAgIGNsYXNzX25hbWUgKz0ga091dGVyQ2xhc3NOYW1lU3VmZml4OworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gY2xhc3NfbmFtZTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lUmVzb2x2ZXI6OkdldEZpbGVDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZSkgeworICByZXR1cm4gR2V0RmlsZUNsYXNzTmFtZShmaWxlLCBpbW11dGFibGUsIGZhbHNlKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lUmVzb2x2ZXI6OkdldEZpbGVDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZSwgYm9vbCBrb3RsaW4pIHsKKyAgaWYgKGtvdGxpbikgeworICAgIHJldHVybiBHZXRGaWxlSW1tdXRhYmxlQ2xhc3NOYW1lKGZpbGUpICsgIkt0IjsKKyAgfSBlbHNlIGlmIChpbW11dGFibGUpIHsKKyAgICByZXR1cm4gR2V0RmlsZUltbXV0YWJsZUNsYXNzTmFtZShmaWxlKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIk11dGFibGUiICsgR2V0RmlsZUltbXV0YWJsZUNsYXNzTmFtZShmaWxlKTsKKyAgfQorfQorCisvLyBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFueSB0eXBlIGRlZmluZWQgaW4gdGhlIHByb3RvIGZpbGUgdGhhdCBoYXMKKy8vIHRoZSBnaXZlbiBjbGFzcyBuYW1lLgorYm9vbCBDbGFzc05hbWVSZXNvbHZlcjo6SGFzQ29uZmxpY3RpbmdDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2xhc3NuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZUVxdWFsaXR5IGVxdWFsaXR5X21vZGUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKENoZWNrTmFtZUVxdWFsaXR5KGZpbGUtPmVudW1fdHlwZShpKS0+bmFtZSgpLCBjbGFzc25hbWUpID09CisgICAgICAgIGVxdWFsaXR5X21vZGUpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPnNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKENoZWNrTmFtZUVxdWFsaXR5KGZpbGUtPnNlcnZpY2UoaSktPm5hbWUoKSwgY2xhc3NuYW1lKSA9PQorICAgICAgICBlcXVhbGl0eV9tb2RlKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKE1lc3NhZ2VIYXNDb25mbGljdGluZ0NsYXNzTmFtZShmaWxlLT5tZXNzYWdlX3R5cGUoaSksIGNsYXNzbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFsaXR5X21vZGUpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGQ6OnN0cmluZyBDbGFzc05hbWVSZXNvbHZlcjo6R2V0RGVzY3JpcHRvckNsYXNzTmFtZSgKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gR2V0RmlsZUltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lUmVzb2x2ZXI6OkdldENsYXNzTmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW11dGFibGUpIHsKKyAgcmV0dXJuIEdldENsYXNzTmFtZShkZXNjcmlwdG9yLCBpbW11dGFibGUsIGZhbHNlKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lUmVzb2x2ZXI6OkdldENsYXNzTmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW11dGFibGUsIGJvb2wga290bGluKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IEZpbGVKYXZhUGFja2FnZShkZXNjcmlwdG9yLCBpbW11dGFibGUpOworICBpZiAoIXJlc3VsdC5lbXB0eSgpKSByZXN1bHQgKz0gJy4nOworICByZXN1bHQgKz0gR2V0RmlsZUNsYXNzTmFtZShkZXNjcmlwdG9yLCBpbW11dGFibGUsIGtvdGxpbik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEdldCB0aGUgZnVsbCBuYW1lIG9mIGEgSmF2YSBjbGFzcyBieSBwcmVwZW5kaW5nIHRoZSBKYXZhIHBhY2thZ2UgbmFtZQorLy8gb3Igb3V0ZXIgY2xhc3MgbmFtZS4KK3N0ZDo6c3RyaW5nIENsYXNzTmFtZVJlc29sdmVyOjpHZXRDbGFzc0Z1bGxOYW1lKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lX3dpdGhvdXRfcGFja2FnZSwgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgYm9vbCBpbW11dGFibGUsIGJvb2wgaXNfb3duX2ZpbGUpIHsKKyAgcmV0dXJuIEdldENsYXNzRnVsbE5hbWUobmFtZV93aXRob3V0X3BhY2thZ2UsIGZpbGUsIGltbXV0YWJsZSwgaXNfb3duX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lUmVzb2x2ZXI6OkdldENsYXNzRnVsbE5hbWUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWVfd2l0aG91dF9wYWNrYWdlLCBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICBib29sIGltbXV0YWJsZSwgYm9vbCBpc19vd25fZmlsZSwgYm9vbCBrb3RsaW4pIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICBpZiAoaXNfb3duX2ZpbGUpIHsKKyAgICByZXN1bHQgPSBGaWxlSmF2YVBhY2thZ2UoZmlsZSwgaW1tdXRhYmxlKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBHZXRDbGFzc05hbWUoZmlsZSwgaW1tdXRhYmxlLCBrb3RsaW4pOworICB9CisgIGlmICghcmVzdWx0LmVtcHR5KCkpIHsKKyAgICByZXN1bHQgKz0gJy4nOworICB9CisgIHJlc3VsdCArPSBuYW1lX3dpdGhvdXRfcGFja2FnZTsKKyAgaWYgKGtvdGxpbikgcmVzdWx0ICs9ICJLdCI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0ZDo6c3RyaW5nIENsYXNzTmFtZVJlc29sdmVyOjpHZXRDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW11dGFibGUpIHsKKyAgcmV0dXJuIEdldENsYXNzTmFtZShkZXNjcmlwdG9yLCBpbW11dGFibGUsIGZhbHNlKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lUmVzb2x2ZXI6OkdldENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZSwgYm9vbCBrb3RsaW4pIHsKKyAgcmV0dXJuIEdldENsYXNzRnVsbE5hbWUoCisgICAgICBDbGFzc05hbWVXaXRob3V0UGFja2FnZShkZXNjcmlwdG9yLCBpbW11dGFibGUpLCBkZXNjcmlwdG9yLT5maWxlKCksCisgICAgICBpbW11dGFibGUsIE11bHRpcGxlSmF2YUZpbGVzKGRlc2NyaXB0b3ItPmZpbGUoKSwgaW1tdXRhYmxlKSwga290bGluKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lUmVzb2x2ZXI6OkdldENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW11dGFibGUpIHsKKyAgcmV0dXJuIEdldENsYXNzTmFtZShkZXNjcmlwdG9yLCBpbW11dGFibGUsIGZhbHNlKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lUmVzb2x2ZXI6OkdldENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW11dGFibGUsIGJvb2wga290bGluKSB7CisgIHJldHVybiBHZXRDbGFzc0Z1bGxOYW1lKAorICAgICAgQ2xhc3NOYW1lV2l0aG91dFBhY2thZ2UoZGVzY3JpcHRvciwgaW1tdXRhYmxlKSwgZGVzY3JpcHRvci0+ZmlsZSgpLAorICAgICAgaW1tdXRhYmxlLCBNdWx0aXBsZUphdmFGaWxlcyhkZXNjcmlwdG9yLT5maWxlKCksIGltbXV0YWJsZSksIGtvdGxpbik7Cit9CisKK3N0ZDo6c3RyaW5nIENsYXNzTmFtZVJlc29sdmVyOjpHZXRDbGFzc05hbWUoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW1tdXRhYmxlKSB7CisgIHJldHVybiBHZXRDbGFzc05hbWUoZGVzY3JpcHRvciwgaW1tdXRhYmxlLCBmYWxzZSk7Cit9CisKK3N0ZDo6c3RyaW5nIENsYXNzTmFtZVJlc29sdmVyOjpHZXRDbGFzc05hbWUoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW1tdXRhYmxlLCBib29sIGtvdGxpbikgeworICByZXR1cm4gR2V0Q2xhc3NGdWxsTmFtZShDbGFzc05hbWVXaXRob3V0UGFja2FnZShkZXNjcmlwdG9yLCBpbW11dGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5maWxlKCksIGltbXV0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSXNPd25GaWxlKGRlc2NyaXB0b3IsIGltbXV0YWJsZSksIGtvdGxpbik7Cit9CisKKy8vIEdldCB0aGUgSmF2YSBDbGFzcyBzdHlsZSBmdWxsIG5hbWUgb2YgYSBtZXNzYWdlLgorc3RkOjpzdHJpbmcgQ2xhc3NOYW1lUmVzb2x2ZXI6OkdldEphdmFDbGFzc0Z1bGxOYW1lKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lX3dpdGhvdXRfcGFja2FnZSwgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgYm9vbCBpbW11dGFibGUpIHsKKyAgcmV0dXJuIEdldEphdmFDbGFzc0Z1bGxOYW1lKG5hbWVfd2l0aG91dF9wYWNrYWdlLCBmaWxlLCBpbW11dGFibGUsIGZhbHNlKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lUmVzb2x2ZXI6OkdldEphdmFDbGFzc0Z1bGxOYW1lKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lX3dpdGhvdXRfcGFja2FnZSwgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgYm9vbCBpbW11dGFibGUsIGJvb2wga290bGluKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgaWYgKE11bHRpcGxlSmF2YUZpbGVzKGZpbGUsIGltbXV0YWJsZSkpIHsKKyAgICByZXN1bHQgPSBGaWxlSmF2YVBhY2thZ2UoZmlsZSwgaW1tdXRhYmxlKTsKKyAgICBpZiAoIXJlc3VsdC5lbXB0eSgpKSByZXN1bHQgKz0gJy4nOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IEdldENsYXNzTmFtZShmaWxlLCBpbW11dGFibGUsIGtvdGxpbik7CisgICAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgcmVzdWx0ICs9ICckJzsKKyAgfQorICByZXN1bHQgKz0gU3RyaW5nUmVwbGFjZShuYW1lX3dpdGhvdXRfcGFja2FnZSwgIi4iLCAiJCIsIHRydWUpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGQ6OnN0cmluZyBDbGFzc05hbWVSZXNvbHZlcjo6R2V0RXh0ZW5zaW9uSWRlbnRpZmllck5hbWUoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBib29sIGltbXV0YWJsZSkgeworICByZXR1cm4gR2V0RXh0ZW5zaW9uSWRlbnRpZmllck5hbWUoZGVzY3JpcHRvciwgaW1tdXRhYmxlLCBmYWxzZSk7Cit9CisKK3N0ZDo6c3RyaW5nIENsYXNzTmFtZVJlc29sdmVyOjpHZXRFeHRlbnNpb25JZGVudGlmaWVyTmFtZSgKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGJvb2wgaW1tdXRhYmxlLCBib29sIGtvdGxpbikgeworICByZXR1cm4gR2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpLCBpbW11dGFibGUsIGtvdGxpbikgKyAiLiIgKworICAgICAgICAgZGVzY3JpcHRvci0+bmFtZSgpOworfQorCitzdGQ6OnN0cmluZyBDbGFzc05hbWVSZXNvbHZlcjo6R2V0S290bGluRmFjdG9yeU5hbWUoCisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBzdGQ6OnN0cmluZyBuYW1lID0gVG9DYW1lbENhc2UoZGVzY3JpcHRvci0+bmFtZSgpLCAvKiBsb3dlcl9maXJzdCA9ICovIHRydWUpOworICByZXR1cm4gSXNGb3JiaWRkZW5Lb3RsaW4obmFtZSkgPyBuYW1lICsgIl8iIDogbmFtZTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lUmVzb2x2ZXI6OkdldEphdmFJbW11dGFibGVDbGFzc05hbWUoCisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gR2V0SmF2YUNsYXNzRnVsbE5hbWUoQ2xhc3NOYW1lV2l0aG91dFBhY2thZ2UoZGVzY3JpcHRvciwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5maWxlKCksIHRydWUpOworfQorCitzdGQ6OnN0cmluZyBDbGFzc05hbWVSZXNvbHZlcjo6R2V0SmF2YUltbXV0YWJsZUNsYXNzTmFtZSgKKyAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gR2V0SmF2YUNsYXNzRnVsbE5hbWUoQ2xhc3NOYW1lV2l0aG91dFBhY2thZ2UoZGVzY3JpcHRvciwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5maWxlKCksIHRydWUpOworfQorCitzdGQ6OnN0cmluZyBDbGFzc05hbWVSZXNvbHZlcjo6R2V0S290bGluRXh0ZW5zaW9uc0NsYXNzTmFtZSgKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBHZXRDbGFzc0Z1bGxOYW1lKENsYXNzTmFtZVdpdGhvdXRQYWNrYWdlS290bGluKGRlc2NyaXB0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5maWxlKCksIHRydWUsIHRydWUsIHRydWUpOworfQorCitzdGQ6OnN0cmluZyBDbGFzc05hbWVSZXNvbHZlcjo6R2V0SmF2YU11dGFibGVDbGFzc05hbWUoCisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gR2V0SmF2YUNsYXNzRnVsbE5hbWUoQ2xhc3NOYW1lV2l0aG91dFBhY2thZ2UoZGVzY3JpcHRvciwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+ZmlsZSgpLCBmYWxzZSk7Cit9CisKK3N0ZDo6c3RyaW5nIENsYXNzTmFtZVJlc29sdmVyOjpHZXRKYXZhTXV0YWJsZUNsYXNzTmFtZSgKKyAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gR2V0SmF2YUNsYXNzRnVsbE5hbWUoQ2xhc3NOYW1lV2l0aG91dFBhY2thZ2UoZGVzY3JpcHRvciwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+ZmlsZSgpLCBmYWxzZSk7Cit9CisKK3N0ZDo6c3RyaW5nIENsYXNzTmFtZVJlc29sdmVyOjpHZXREb3duZ3JhZGVkRmlsZUNsYXNzTmFtZSgKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICByZXR1cm4gIkRvd25ncmFkZWQiICsgR2V0RmlsZUNsYXNzTmFtZShmaWxlLCBmYWxzZSk7Cit9CisKK3N0ZDo6c3RyaW5nIENsYXNzTmFtZVJlc29sdmVyOjpHZXREb3duZ3JhZGVkQ2xhc3NOYW1lKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIEZpbGVKYXZhUGFja2FnZShkZXNjcmlwdG9yLT5maWxlKCkpICsgIi4iICsKKyAgICAgICAgIEdldERvd25ncmFkZWRGaWxlQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPmZpbGUoKSkgKyAiLiIgKworICAgICAgICAgQ2xhc3NOYW1lV2l0aG91dFBhY2thZ2UoZGVzY3JpcHRvciwgZmFsc2UpOworfQorCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lX3Jlc29sdmVyLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZV9yZXNvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwM2NhY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZV9yZXNvbHZlci5oCkBAIC0wLDAgKzEsMTU5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9OQU1FX1JFU09MVkVSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9OQU1FX1JFU09MVkVSX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworLy8gTXVzdCBiZSBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK2NsYXNzIERlc2NyaXB0b3I7CitjbGFzcyBFbnVtRGVzY3JpcHRvcjsKK2NsYXNzIEZpZWxkRGVzY3JpcHRvcjsKK2NsYXNzIEZpbGVEZXNjcmlwdG9yOworY2xhc3MgU2VydmljZURlc2NyaXB0b3I7CisKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKKy8vIEluZGljYXRlcyBob3cgY2xvc2VseSB0aGUgdHdvIGNsYXNzIG5hbWVzIG1hdGNoLgorZW51bSBOYW1lRXF1YWxpdHkgeyBOT19NQVRDSCwgRVhBQ1RfRVFVQUwsIEVRVUFMX0lHTk9SRV9DQVNFIH07CisKKy8vIFVzZWQgdG8gZ2V0IHRoZSBKYXZhIGNsYXNzIHJlbGF0ZWQgbmFtZXMgZm9yIGEgZ2l2ZW4gZGVzY3JpcHRvci4gSXQgY2FjaGVzCisvLyB0aGUgcmVzdWx0cyB0byBhdm9pZCByZWR1bmRhbnQgY2FsY3VsYXRpb24gYWNyb3NzIG11bHRpcGxlIG5hbWUgcXVlcmllcy4KKy8vIFRocmVhZC1zYWZldHkgbm90ZTogVGhpcyBjbGFzcyBpcyAqbm90KiB0aHJlYWQtc2FmZS4KK2NsYXNzIENsYXNzTmFtZVJlc29sdmVyIHsKKyBwdWJsaWM6CisgIENsYXNzTmFtZVJlc29sdmVyKCk7CisgIH5DbGFzc05hbWVSZXNvbHZlcigpOworCisgIC8vIEdldHMgdGhlIHVucXVhbGlmaWVkIG91dGVyIGNsYXNzIG5hbWUgZm9yIHRoZSBmaWxlLgorICBzdGQ6OnN0cmluZyBHZXRGaWxlQ2xhc3NOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBib29sIGltbXV0YWJsZSk7CisgIHN0ZDo6c3RyaW5nIEdldEZpbGVDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGJvb2wgaW1tdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wga290bGluKTsKKyAgLy8gR2V0cyB0aGUgdW5xdWFsaWZpZWQgaW1tdXRhYmxlIG91dGVyIGNsYXNzIG5hbWUgb2YgYSBmaWxlLgorICBzdGQ6OnN0cmluZyBHZXRGaWxlSW1tdXRhYmxlQ2xhc3NOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKyAgLy8gR2V0cyB0aGUgdW5xdWFsaWZpZWQgZGVmYXVsdCBpbW11dGFibGUgb3V0ZXIgY2xhc3MgbmFtZSBvZiBhIGZpbGUKKyAgLy8gKGNvbnZlcnRlZCBmcm9tIHRoZSBwcm90byBmaWxlJ3MgbmFtZSkuCisgIHN0ZDo6c3RyaW5nIEdldEZpbGVEZWZhdWx0SW1tdXRhYmxlQ2xhc3NOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworICAvLyBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFueSB0eXBlIGRlZmluZWQgaW4gdGhlIHByb3RvIGZpbGUgdGhhdCBoYXMKKyAgLy8gdGhlIGdpdmVuIGNsYXNzIG5hbWUuCisgIGJvb2wgSGFzQ29uZmxpY3RpbmdDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNsYXNzbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lRXF1YWxpdHkgZXF1YWxpdHlfbW9kZSk7CisKKyAgLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgb3V0ZXIgY2xhc3MgdGhhdCBob2xkcyBkZXNjcmlwdG9yIGluZm9ybWF0aW9uLgorICAvLyBEZXNjcmlwdG9ycyBhcmUgc2hhcmVkIGJldHdlZW4gaW1tdXRhYmxlIG1lc3NhZ2VzIGFuZCBtdXRhYmxlIG1lc3NhZ2VzLgorICAvLyBTaW5jZSBib3RoIG9mIHRoZW0gYXJlIGdlbmVyYXRlZCBvcHRpb25hbGx5LCB0aGUgZGVzY3JpcHRvcnMgbmVlZCB0byBiZQorICAvLyBwdXQgaW4gYW5vdGhlciBjb21tb24gcGxhY2UuCisgIHN0ZDo6c3RyaW5nIEdldERlc2NyaXB0b3JDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworCisgIC8vIEdldHMgdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGRlc2NyaXB0b3IuCisgIHN0ZDo6c3RyaW5nIEdldENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBib29sIGltbXV0YWJsZSk7CisgIHN0ZDo6c3RyaW5nIEdldENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBib29sIGltbXV0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wga290bGluKTsKKyAgc3RkOjpzdHJpbmcgR2V0Q2xhc3NOYW1lKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBib29sIGltbXV0YWJsZSk7CisgIHN0ZDo6c3RyaW5nIEdldENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwgYm9vbCBpbW11dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGtvdGxpbik7CisgIHN0ZDo6c3RyaW5nIEdldENsYXNzTmFtZShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvciwgYm9vbCBpbW11dGFibGUpOworICBzdGQ6OnN0cmluZyBHZXRDbGFzc05hbWUoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGJvb2wgaW1tdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBrb3RsaW4pOworICBzdGQ6OnN0cmluZyBHZXRDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGJvb2wgaW1tdXRhYmxlKTsKKyAgc3RkOjpzdHJpbmcgR2V0Q2xhc3NOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBib29sIGltbXV0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wga290bGluKTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgRGVzY3JpcHRvclR5cGU+CisgIHN0ZDo6c3RyaW5nIEdldEltbXV0YWJsZUNsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yVHlwZSogZGVzY3JpcHRvcikgeworICAgIHJldHVybiBHZXRDbGFzc05hbWUoZGVzY3JpcHRvciwgdHJ1ZSk7CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzIERlc2NyaXB0b3JUeXBlPgorICBzdGQ6OnN0cmluZyBHZXRNdXRhYmxlQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3JUeXBlKiBkZXNjcmlwdG9yKSB7CisgICAgcmV0dXJuIEdldENsYXNzTmFtZShkZXNjcmlwdG9yLCBmYWxzZSk7CisgIH0KKworICAvLyBHZXRzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhbiBleHRlbnNpb24gaWRlbnRpZmllci4KKyAgc3RkOjpzdHJpbmcgR2V0RXh0ZW5zaW9uSWRlbnRpZmllck5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZSk7CisgIHN0ZDo6c3RyaW5nIEdldEV4dGVuc2lvbklkZW50aWZpZXJOYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW11dGFibGUsIGJvb2wga290bGluKTsKKworICAvLyBHZXRzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgZ2VuZXJhdGVkIGNsYXNzZXMgaW4gSmF2YSBjb252ZW50aW9uLgorICAvLyBOZXN0ZWQgY2xhc3NlcyB3aWxsIGJlIHNlcGFyYXRlZCB1c2luZyAnJCcgaW5zdGVhZCBvZiAnLicKKyAgLy8gRm9yIGV4YW1wbGU6CisgIC8vICAgY29tLnBhY2thZ2UuT3V0ZXJDbGFzcyRPdXRlck1lc3NhZ2UkSW5uZXJNZXNzYWdlCisgIHN0ZDo6c3RyaW5nIEdldEphdmFJbW11dGFibGVDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIHN0ZDo6c3RyaW5nIEdldEphdmFJbW11dGFibGVDbGFzc05hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICBzdGQ6OnN0cmluZyBHZXRLb3RsaW5GYWN0b3J5TmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgc3RkOjpzdHJpbmcgR2V0S290bGluRXh0ZW5zaW9uc0NsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgc3RkOjpzdHJpbmcgR2V0SmF2YU11dGFibGVDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIHN0ZDo6c3RyaW5nIEdldEphdmFNdXRhYmxlQ2xhc3NOYW1lKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgLy8gR2V0cyB0aGUgb3V0ZXIgY2xhc3MgYW5kIHRoZSBhY3R1YWwgY2xhc3MgZm9yIGRvd25ncmFkZWQgbXV0YWJsZSBtZXNzYWdlcy4KKyAgc3RkOjpzdHJpbmcgR2V0RG93bmdyYWRlZEZpbGVDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworICBzdGQ6OnN0cmluZyBHZXREb3duZ3JhZGVkQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisgIC8vIEdldCB0aGUgZnVsbCBuYW1lIG9mIGEgSmF2YSBjbGFzcyBieSBwcmVwZW5kaW5nIHRoZSBKYXZhIHBhY2thZ2UgbmFtZQorICAvLyBvciBvdXRlciBjbGFzcyBuYW1lLgorICBzdGQ6OnN0cmluZyBHZXRDbGFzc0Z1bGxOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lX3dpdGhvdXRfcGFja2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgYm9vbCBpbW11dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19vd25fZmlsZSk7CisgIHN0ZDo6c3RyaW5nIEdldENsYXNzRnVsbE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWVfd2l0aG91dF9wYWNrYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBib29sIGltbXV0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX293bl9maWxlLCBib29sIGtvdGxpbik7CisKKyBwcml2YXRlOgorICAvLyBHZXQgdGhlIEphdmEgQ2xhc3Mgc3R5bGUgZnVsbCBuYW1lIG9mIGEgbWVzc2FnZS4KKyAgc3RkOjpzdHJpbmcgR2V0SmF2YUNsYXNzRnVsbE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWVfd2l0aG91dF9wYWNrYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgYm9vbCBpbW11dGFibGUpOworICBzdGQ6OnN0cmluZyBHZXRKYXZhQ2xhc3NGdWxsTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZV93aXRob3V0X3BhY2thZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBib29sIGltbXV0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBrb3RsaW4pOworICAvLyBDYWNoZXMgdGhlIHJlc3VsdCB0byBwcm92aWRlIGJldHRlciBwZXJmb3JtYW5jZS4KKyAgc3RkOjptYXA8Y29uc3QgRmlsZURlc2NyaXB0b3IqLCBzdGQ6OnN0cmluZz4KKyAgICAgIGZpbGVfaW1tdXRhYmxlX291dGVyX2NsYXNzX25hbWVzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2xhc3NOYW1lUmVzb2x2ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTkFNRV9SRVNPTFZFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lcy5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL25hbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEzYWNlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lcy5oCkBAIC0wLDAgKzEsMTAwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gUHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIG1hcHBpbmcgYSBkZXNjcmlwdG9yIHRvIHRoZQorLy8gZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSBjbGFzcy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9OQU1FU19IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTkFNRVNfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgRGVzY3JpcHRvcjsKK2NsYXNzIEVudW1EZXNjcmlwdG9yOworY2xhc3MgRmlsZURlc2NyaXB0b3I7CitjbGFzcyBGaWVsZERlc2NyaXB0b3I7CitjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsKKworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworLy8gUmVxdWlyZXM6CisvLyAgIGRlc2NyaXB0b3IgIT0gTlVMTAorLy8KKy8vIFJldHVybnM6CisvLyAgIFRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lLgorc3RkOjpzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisvLyBSZXF1aXJlczoKKy8vICAgZGVzY3JpcHRvciAhPSBOVUxMCisvLworLy8gUmV0dXJuczoKKy8vICAgVGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUuCitzdGQ6OnN0cmluZyBDbGFzc05hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisvLyBSZXF1aXJlczoKKy8vICAgZGVzY3JpcHRvciAhPSBOVUxMCisvLworLy8gUmV0dXJuczoKKy8vICAgVGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUuCitzdGQ6OnN0cmluZyBDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisvLyBSZXF1aXJlczoKKy8vICAgZGVzY3JpcHRvciAhPSBOVUxMCisvLworLy8gUmV0dXJuczoKKy8vICAgVGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUuCitzdGQ6OnN0cmluZyBDbGFzc05hbWUoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisvLyBSZXF1aXJlczoKKy8vICAgZGVzY3JpcHRvciAhPSBOVUxMCisvLworLy8gUmV0dXJuczoKKy8vICAgSmF2YSBwYWNrYWdlIG5hbWUuCitzdGQ6OnN0cmluZyBGaWxlSmF2YVBhY2thZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisvLyBSZXF1aXJlczoKKy8vICAgZGVzY3JpcHRvciAhPSBOVUxMCisvLyBSZXR1cm5zOgorLy8gICBDYXBpdGFsaXplZCBjYW1lbCBjYXNlIG5hbWUgZmllbGQgbmFtZS4KK3N0ZDo6c3RyaW5nIENhcGl0YWxpemVkRmllbGROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9OQU1FU19IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9vcHRpb25zLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvb3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjliZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvb3B0aW9ucy5oCkBAIC0wLDAgKzEsNzMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX09QVElPTlNfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX09QVElPTlNfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKKy8vIEdlbmVyYXRvciBvcHRpb25zCitzdHJ1Y3QgT3B0aW9ucyB7CisgIE9wdGlvbnMoKQorICAgICAgOiBnZW5lcmF0ZV9pbW11dGFibGVfY29kZShmYWxzZSksCisgICAgICAgIGdlbmVyYXRlX211dGFibGVfY29kZShmYWxzZSksCisgICAgICAgIGdlbmVyYXRlX3NoYXJlZF9jb2RlKGZhbHNlKSwKKyAgICAgICAgZW5mb3JjZV9saXRlKGZhbHNlKSwKKyAgICAgICAgYW5ub3RhdGVfY29kZShmYWxzZSkgeworICB9CisKKyAgYm9vbCBnZW5lcmF0ZV9pbW11dGFibGVfY29kZTsKKyAgYm9vbCBnZW5lcmF0ZV9tdXRhYmxlX2NvZGU7CisgIGJvb2wgZ2VuZXJhdGVfc2hhcmVkX2NvZGU7CisgIC8vIFdoZW4gc2V0LCB0aGUgcHJvdG9jIHdpbGwgZ2VuZXJhdGUgdGhlIGN1cnJlbnQgZmlsZXMgYW5kIGFsbCB0aGUgdHJhbnNpdGl2ZQorICAvLyBkZXBlbmRlbmNpZXMgYXMgbGl0ZSBydW50aW1lLgorICBib29sIGVuZm9yY2VfbGl0ZTsKKyAgLy8gSWYgdHJ1ZSwgd2Ugc2hvdWxkIGJ1aWxkIC5tZXRhIGZpbGVzIGFuZCBlbWl0IEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnMgaW50bworICAvLyBnZW5lcmF0ZWQgY29kZS4KKyAgYm9vbCBhbm5vdGF0ZV9jb2RlOworICAvLyBOYW1lIG9mIGEgZmlsZSB3aGVyZSB3ZSB3aWxsIHdyaXRlIGEgbGlzdCBvZiBnZW5lcmF0ZWQgLm1ldGEgZmlsZSBuYW1lcywKKyAgLy8gb25lIHBlciBsaW5lLgorICBzdGQ6OnN0cmluZyBhbm5vdGF0aW9uX2xpc3RfZmlsZTsKKyAgLy8gTmFtZSBvZiBhIGZpbGUgd2hlcmUgd2Ugd2lsbCB3cml0ZSBhIGxpc3Qgb2YgZ2VuZXJhdGVkIGZpbGUgbmFtZXMsIG9uZQorICAvLyBwZXIgbGluZS4KKyAgc3RkOjpzdHJpbmcgb3V0cHV0X2xpc3RfZmlsZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX09QVElPTlNfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcGx1Z2luX3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3BsdWdpbl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTM1Zjg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3BsdWdpbl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDEzNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CituYW1lc3BhY2UgeworCitjbGFzcyBUZXN0R2VuZXJhdG9yIDogcHVibGljIENvZGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgVGVzdEdlbmVyYXRvcigpIHt9CisgIH5UZXN0R2VuZXJhdG9yKCkgb3ZlcnJpZGUge30KKworICBib29sIEdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsIHN0ZDo6c3RyaW5nKiBlcnJvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gIlRlc3QuamF2YSI7CisgICAgVHJ5SW5zZXJ0KGZpbGVuYW1lLCAib3V0ZXJfY2xhc3Nfc2NvcGUiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoZmlsZW5hbWUsICJjbGFzc19zY29wZTpmb28uQmFyIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KGZpbGVuYW1lLCAiY2xhc3Nfc2NvcGU6Zm9vLkJhci5CYXoiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoZmlsZW5hbWUsICJidWlsZGVyX3Njb3BlOmZvby5CYXIiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoZmlsZW5hbWUsICJidWlsZGVyX3Njb3BlOmZvby5CYXIuQmF6IiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KGZpbGVuYW1lLCAiZW51bV9zY29wZTpmb28uUXV4IiwgY29udGV4dCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2b2lkIFRyeUluc2VydChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnNlcnRpb25fcG9pbnQsCisgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQpIGNvbnN0IHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICAgIGNvbnRleHQtPk9wZW5Gb3JJbnNlcnQoZmlsZW5hbWUsIGluc2VydGlvbl9wb2ludCkpOworICAgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcpOworICAgIHByaW50ZXIuUHJpbnQoIi8vIGluc2VydGVkICRuYW1lJFxuIiwgIm5hbWUiLCBpbnNlcnRpb25fcG9pbnQpOworICB9Cit9OworCisvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBhbGwgdGhlIGV4cGVjdGVkIGluc2VydGlvbiBwb2ludHMgZXhpc3QuICBJdCBkb2VzCisvLyBub3QgdmVyaWZ5IHRoYXQgdGhleSBhcmUgY29ycmVjdGx5LXBsYWNlZDsgdGhhdCB3b3VsZCByZXF1aXJlIGFjdHVhbGx5CisvLyBjb21waWxpbmcgdGhlIG91dHB1dCB3aGljaCBpcyBhIGJpdCBtb3JlIHRoYW4gSSBjYXJlIHRvIGRvIGZvciB0aGlzIHRlc3QuCitURVNUKEphdmFQbHVnaW5UZXN0LCBQbHVnaW5UZXN0KSB7CisgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpTZXRDb250ZW50cyhUZXN0VGVtcERpcigpICsgIi90ZXN0LnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIGZvbztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiBqYXZhX3BhY2thZ2UgPSBcIlwiO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gXCJUZXN0XCI7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIG1lc3NhZ2UgQmF6IHt9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIFF1eCB7IEJMQUggPSAxOyB9XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSk7CisKKyAgQ29tbWFuZExpbmVJbnRlcmZhY2UgY2xpOworICBjbGkuU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUodHJ1ZSk7CisKKyAgSmF2YUdlbmVyYXRvciBqYXZhX2dlbmVyYXRvcjsKKyAgVGVzdEdlbmVyYXRvciB0ZXN0X2dlbmVyYXRvcjsKKyAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWphdmFfb3V0IiwgJmphdmFfZ2VuZXJhdG9yLCAiIik7CisgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS10ZXN0X291dCIsICZ0ZXN0X2dlbmVyYXRvciwgIiIpOworCisgIHN0ZDo6c3RyaW5nIHByb3RvX3BhdGggPSAiLUkiICsgVGVzdFRlbXBEaXIoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV9vdXQgPSAiLS1qYXZhX291dD0iICsgVGVzdFRlbXBEaXIoKTsKKyAgc3RkOjpzdHJpbmcgdGVzdF9vdXQgPSAiLS10ZXN0X291dD0iICsgVGVzdFRlbXBEaXIoKTsKKworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7InByb3RvYyIsIHByb3RvX3BhdGguY19zdHIoKSwgamF2YV9vdXQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb3V0LmNfc3RyKCksICJ0ZXN0LnByb3RvIn07CisKKyAgRVhQRUNUX0VRKDAsIGNsaS5SdW4oNSwgYXJndikpOworCisgIC8vIExvb3Agb3ZlciB0aGUgbGluZXMgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIGFuZCB2ZXJpZnkgdGhhdCB3ZSBmaW5kIHdoYXQgd2UKKyAgLy8gZXhwZWN0CisKKyAgc3RkOjpzdHJpbmcgb3V0cHV0OworICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6R2V0Q29udGVudHMoVGVzdFRlbXBEaXIoKSArICIvVGVzdC5qYXZhIiwgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXMgPSBTcGxpdChvdXRwdXQsICJcbiIpOworICBib29sIGZvdW5kX2dlbmVyYXRlZF9hbm5vdGF0aW9uID0gZmFsc2U7CisgIGJvb2wgZm91bmRfZG9fbm90X2VkaXQgPSBmYWxzZTsKKyAgZm9yIChjb25zdCBhdXRvJiBsaW5lIDogbGluZXMpIHsKKyAgICBpZiAobGluZS5maW5kKCIgRE8gTk9UIEVESVQhIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGZvdW5kX2RvX25vdF9lZGl0ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGxpbmUuZmluZCgiQGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGZvdW5kX2dlbmVyYXRlZF9hbm5vdGF0aW9uID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgRVhQRUNUX1RSVUUoZm91bmRfZG9fbm90X2VkaXQpOworICAodm9pZClmb3VuZF9nZW5lcmF0ZWRfYW5ub3RhdGlvbjsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcmltaXRpdmVfZmllbGQuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJpbWl0aXZlX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDQ3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJpbWl0aXZlX2ZpZWxkLmNjCkBAIC0wLDAgKzEsMTA5MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJpbWl0aXZlX2ZpZWxkLmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL25hbWVfcmVzb2x2ZXIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcykgeworICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhkZXNjcmlwdG9yLCBpbmZvLCB2YXJpYWJsZXMpOworICBKYXZhVHlwZSBqYXZhVHlwZSA9IEdldEphdmFUeXBlKGRlc2NyaXB0b3IpOworCisgICgqdmFyaWFibGVzKVsidHlwZSJdID0gUHJpbWl0aXZlVHlwZU5hbWUoamF2YVR5cGUpOworICAoKnZhcmlhYmxlcylbImJveGVkX3R5cGUiXSA9IEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoamF2YVR5cGUpOworICAoKnZhcmlhYmxlcylbImt0X3R5cGUiXSA9IEtvdGxpblR5cGVOYW1lKGphdmFUeXBlKTsKKyAgKCp2YXJpYWJsZXMpWyJmaWVsZF90eXBlIl0gPSAoKnZhcmlhYmxlcylbInR5cGUiXTsKKworICBpZiAoamF2YVR5cGUgPT0gSkFWQVRZUEVfQk9PTEVBTiB8fCBqYXZhVHlwZSA9PSBKQVZBVFlQRV9ET1VCTEUgfHwKKyAgICAgIGphdmFUeXBlID09IEpBVkFUWVBFX0ZMT0FUIHx8IGphdmFUeXBlID09IEpBVkFUWVBFX0lOVCB8fAorICAgICAgamF2YVR5cGUgPT0gSkFWQVRZUEVfTE9ORykgeworICAgIHN0ZDo6c3RyaW5nIGNhcGl0YWxpemVkX3R5cGUgPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKAorICAgICAgICBQcmltaXRpdmVUeXBlTmFtZShqYXZhVHlwZSksIC8qY2FwX2ZpcnN0X2xldHRlcj0qL3RydWUpOworICAgICgqdmFyaWFibGVzKVsiZmllbGRfbGlzdF90eXBlIl0gPQorICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC4iICsgY2FwaXRhbGl6ZWRfdHlwZSArICJMaXN0IjsKKyAgICAoKnZhcmlhYmxlcylbImVtcHR5X2xpc3QiXSA9ICJlbXB0eSIgKyBjYXBpdGFsaXplZF90eXBlICsgIkxpc3QoKSI7CisgICAgKCp2YXJpYWJsZXMpWyJjcmVhdGVfbGlzdCJdID0gIm5ldyIgKyBjYXBpdGFsaXplZF90eXBlICsgIkxpc3QoKSI7CisgICAgKCp2YXJpYWJsZXMpWyJtdXRhYmxlX2NvcHlfbGlzdCJdID0KKyAgICAgICAgIm11dGFibGVDb3B5KCIgKyAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfKSI7CisgICAgKCp2YXJpYWJsZXMpWyJuYW1lX21ha2VfaW1tdXRhYmxlIl0gPQorICAgICAgICAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfLm1ha2VJbW11dGFibGUoKSI7CisgICAgKCp2YXJpYWJsZXMpWyJyZXBlYXRlZF9nZXQiXSA9CisgICAgICAgICgqdmFyaWFibGVzKVsibmFtZSJdICsgIl8uZ2V0IiArIGNhcGl0YWxpemVkX3R5cGU7CisgICAgKCp2YXJpYWJsZXMpWyJyZXBlYXRlZF9hZGQiXSA9CisgICAgICAgICgqdmFyaWFibGVzKVsibmFtZSJdICsgIl8uYWRkIiArIGNhcGl0YWxpemVkX3R5cGU7CisgICAgKCp2YXJpYWJsZXMpWyJyZXBlYXRlZF9zZXQiXSA9CisgICAgICAgICgqdmFyaWFibGVzKVsibmFtZSJdICsgIl8uc2V0IiArIGNhcGl0YWxpemVkX3R5cGU7CisgIH0gZWxzZSB7CisgICAgKCp2YXJpYWJsZXMpWyJmaWVsZF9saXN0X3R5cGUiXSA9CisgICAgICAgICJqYXZhLnV0aWwuTGlzdDwiICsgKCp2YXJpYWJsZXMpWyJib3hlZF90eXBlIl0gKyAiPiI7CisgICAgKCp2YXJpYWJsZXMpWyJjcmVhdGVfbGlzdCJdID0KKyAgICAgICAgIm5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PCIgKyAoKnZhcmlhYmxlcylbImJveGVkX3R5cGUiXSArICI+KCkiOworICAgICgqdmFyaWFibGVzKVsibXV0YWJsZV9jb3B5X2xpc3QiXSA9ICJuZXcgamF2YS51dGlsLkFycmF5TGlzdDwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnZhcmlhYmxlcylbImJveGVkX3R5cGUiXSArICI+KCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqdmFyaWFibGVzKVsibmFtZSJdICsgIl8pIjsKKyAgICAoKnZhcmlhYmxlcylbImVtcHR5X2xpc3QiXSA9ICJqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkiOworICAgICgqdmFyaWFibGVzKVsibmFtZV9tYWtlX2ltbXV0YWJsZSJdID0KKyAgICAgICAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gKyAiXyA9IGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCIgKworICAgICAgICAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfKSI7CisgICAgKCp2YXJpYWJsZXMpWyJyZXBlYXRlZF9nZXQiXSA9ICgqdmFyaWFibGVzKVsibmFtZSJdICsgIl8uZ2V0IjsKKyAgICAoKnZhcmlhYmxlcylbInJlcGVhdGVkX2FkZCJdID0gKCp2YXJpYWJsZXMpWyJuYW1lIl0gKyAiXy5hZGQiOworICAgICgqdmFyaWFibGVzKVsicmVwZWF0ZWRfc2V0Il0gPSAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfLnNldCI7CisgIH0KKworICAoKnZhcmlhYmxlcylbImRlZmF1bHQiXSA9IEltbXV0YWJsZURlZmF1bHRWYWx1ZShkZXNjcmlwdG9yLCBuYW1lX3Jlc29sdmVyKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X2luaXQiXSA9CisgICAgICBJc0RlZmF1bHRWYWx1ZUphdmFEZWZhdWx0KGRlc2NyaXB0b3IpCisgICAgICAgICAgPyAiIgorICAgICAgICAgIDogKCI9ICIgKyBJbW11dGFibGVEZWZhdWx0VmFsdWUoZGVzY3JpcHRvciwgbmFtZV9yZXNvbHZlcikpOworICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX3R5cGUiXSA9CisgICAgICBHZXRDYXBpdGFsaXplZFR5cGUoZGVzY3JpcHRvciwgLyogaW1tdXRhYmxlID0gKi8gdHJ1ZSk7CisgICgqdmFyaWFibGVzKVsidGFnIl0gPQorICAgICAgU3RyQ2F0KHN0YXRpY19jYXN0PGludDMyX3Q+KFdpcmVGb3JtYXQ6Ok1ha2VUYWcoZGVzY3JpcHRvcikpKTsKKyAgKCp2YXJpYWJsZXMpWyJ0YWdfc2l6ZSJdID0gU3RyQ2F0KAorICAgICAgV2lyZUZvcm1hdDo6VGFnU2l6ZShkZXNjcmlwdG9yLT5udW1iZXIoKSwgR2V0VHlwZShkZXNjcmlwdG9yKSkpOworICBpZiAoSXNSZWZlcmVuY2VUeXBlKEdldEphdmFUeXBlKGRlc2NyaXB0b3IpKSkgeworICAgICgqdmFyaWFibGVzKVsibnVsbF9jaGVjayJdID0KKyAgICAgICAgIiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiIKKyAgICAgICAgIiAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTtcbiIKKyAgICAgICAgIiAgfVxuIjsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbIm51bGxfY2hlY2siXSA9ICIiOworICB9CisgIC8vIFRPRE8oYmlyZG8pOiBBZGQgQGRlcHJlY2F0ZWQgamF2YWRvYyB3aGVuIGdlbmVyYXRpbmcgamF2YWRvYyBpcyBzdXBwb3J0ZWQKKyAgLy8gYnkgdGhlIHByb3RvIGNvbXBpbGVyCisgICgqdmFyaWFibGVzKVsiZGVwcmVjYXRpb24iXSA9CisgICAgICBkZXNjcmlwdG9yLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpID8gIkBqYXZhLmxhbmcuRGVwcmVjYXRlZCAiIDogIiI7CisgICgqdmFyaWFibGVzKVsia3RfZGVwcmVjYXRpb24iXSA9CisgICAgICBkZXNjcmlwdG9yLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpCisgICAgICAgICAgPyAiQGtvdGxpbi5EZXByZWNhdGVkKG1lc3NhZ2UgPSBcIkZpZWxkICIgKyAoKnZhcmlhYmxlcylbIm5hbWUiXSArCisgICAgICAgICAgICAgICAgIiBpcyBkZXByZWNhdGVkXCIpICIKKyAgICAgICAgICA6ICIiOworICBpbnQgZml4ZWRfc2l6ZSA9IEZpeGVkU2l6ZShHZXRUeXBlKGRlc2NyaXB0b3IpKTsKKyAgaWYgKGZpeGVkX3NpemUgIT0gLTEpIHsKKyAgICAoKnZhcmlhYmxlcylbImZpeGVkX3NpemUiXSA9IFN0ckNhdChmaXhlZF9zaXplKTsKKyAgfQorICAoKnZhcmlhYmxlcylbIm9uX2NoYW5nZWQiXSA9ICJvbkNoYW5nZWQoKTsiOworCisgIGlmIChIYXNIYXNiaXQoZGVzY3JpcHRvcikpIHsKKyAgICAvLyBGb3Igc2luZ3VsYXIgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHRoZSBoYXNGaWVsZCBiaXQuCisgICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworICAgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKKworICAgIC8vIE5vdGUgdGhhdCB0aGVzZSBoYXZlIGEgdHJhaWxpbmcgIjsiLgorICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0KKyAgICAgICAgR2VuZXJhdGVTZXRCaXQobWVzc2FnZUJpdEluZGV4KSArICI7IjsKKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9CisgICAgICAgIEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCkgKyAiOyI7CisgICAgKCp2YXJpYWJsZXMpWyJjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9CisgICAgICAgIEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KSArICI7IjsKKworICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworICB9IGVsc2UgeworICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0gIiI7CisgICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSAiIjsKKyAgICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gIiI7CisKKyAgICBzd2l0Y2ggKGRlc2NyaXB0b3ItPnR5cGUoKSkgeworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6CisgICAgICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPQorICAgICAgICAgICAgIiEiICsgKCp2YXJpYWJsZXMpWyJuYW1lIl0gKyAiXy5pc0VtcHR5KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUOgorICAgICAgICAoKnZhcmlhYmxlcylbImlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSJdID0KKyAgICAgICAgICAgICJqYXZhLmxhbmcuRmxvYXQuZmxvYXRUb1Jhd0ludEJpdHMoIiArICgqdmFyaWFibGVzKVsibmFtZSJdICsKKyAgICAgICAgICAgICJfKSAhPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEU6CisgICAgICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPQorICAgICAgICAgICAgImphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9SYXdMb25nQml0cygiICsgKCp2YXJpYWJsZXMpWyJuYW1lIl0gKworICAgICAgICAgICAgIl8pICE9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPQorICAgICAgICAgICAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gKyAiXyAhPSAiICsgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il07CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIEZvciByZXBlYXRlZCBidWlsZGVycywgb25lIGJpdCBpcyB1c2VkIGZvciB3aGV0aGVyIHRoZSBhcnJheSBpcyBpbW11dGFibGUuCisgICgqdmFyaWFibGVzKVsiZ2V0X211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlR2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsiY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVDbGVhckJpdChidWlsZGVyQml0SW5kZXgpOworCisgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfZnJvbV9sb2NhbCJdID0KKyAgICAgIEdlbmVyYXRlR2V0Qml0RnJvbUxvY2FsKGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfdG9fbG9jYWwiXSA9CisgICAgICBHZW5lcmF0ZVNldEJpdFRvTG9jYWwobWVzc2FnZUJpdEluZGV4KTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICBDb250ZXh0KiBjb250ZXh0KQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7CisgIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLCAmdmFyaWFibGVzXyk7Cit9CisKK0ltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjp+SW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKSB7fQorCitpbnQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworICByZXR1cm4gSGFzSGFzYml0KGRlc2NyaXB0b3JfKSA/IDEgOiAwOworfQorCitpbnQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgeworICByZXR1cm4gR2V0TnVtQml0c0Zvck1lc3NhZ2UoKTsKK30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChIYXNIYXp6ZXIoZGVzY3JpcHRvcl8pKSB7CisgICAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgSEFaWkVSKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworICB9CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEdFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkZGVwcmVjYXRpb24kJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAicHJpdmF0ZSAkZmllbGRfdHlwZSQgJG5hbWUkXztcbiIpOworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBpZiAoSGFzSGF6emVyKGRlc2NyaXB0b3JfKSkgeworICAgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAiICByZXR1cm4gJGdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkO1xuIgorICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgfQorCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEdFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7Cit9CisKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlck1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInByaXZhdGUgJGZpZWxkX3R5cGUkICRuYW1lJF8gJGRlZmF1bHRfaW5pdCQ7XG4iKTsKKworICBpZiAoSGFzSGF6emVyKGRlc2NyaXB0b3JfKSkgeworICAgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAiICByZXR1cm4gJGdldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgfQorCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEdFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgIgorICAgICAgICAgICAgICAgICAiJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiJG51bGxfY2hlY2skIgorICAgICAgICAgICAgICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAiICAkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIEphdmFUeXBlIHR5cGUgPSBHZXRKYXZhVHlwZShkZXNjcmlwdG9yXyk7CisgIGlmICh0eXBlID09IEpBVkFUWVBFX1NUUklORyB8fCB0eXBlID09IEpBVkFUWVBFX0JZVEVTKSB7CisgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgaXMgbm90IGEgc2ltcGxlIGxpdGVyYWwgc28gd2Ugd2FudCB0byBhdm9pZCBleGVjdXRpbmcKKyAgICAvLyBpdCBtdWx0aXBsZSB0aW1lcy4gIEluc3RlYWQsIGdldCB0aGUgZGVmYXVsdCBvdXQgb2YgdGhlIGRlZmF1bHQgaW5zdGFuY2UuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICIgICRuYW1lJF8gPSBnZXREZWZhdWx0SW5zdGFuY2UoKS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIgICRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVLb3RsaW5Ec2xNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRrdF9kZXByZWNhdGlvbiR2YXIgJGt0X25hbWUkOiAka3RfdHlwZSRcbiIKKyAgICAgICAgICAgICAgICAgIiAgQEp2bU5hbWUoXCIkeyRnZXQka3RfY2FwaXRhbGl6ZWRfbmFtZSQkfSRcIilcbiIKKyAgICAgICAgICAgICAgICAgIiAgZ2V0KCkgPSAka3RfZHNsX2J1aWxkZXIkLiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpXG4iCisgICAgICAgICAgICAgICAgICIgIEBKdm1OYW1lKFwiJHskc2V0JGt0X2NhcGl0YWxpemVkX25hbWUkJH0kXCIpXG4iCisgICAgICAgICAgICAgICAgICIgIHNldCh2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiICAgICRrdF9kc2xfYnVpbGRlciQuJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKHZhbHVlKVxuIgorICAgICAgICAgICAgICAgICAiICB9XG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiZnVuICR7JGNsZWFyJGt0X2NhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKClcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIGlmIChIYXNIYXp6ZXIoZGVzY3JpcHRvcl8pKSB7CisgICAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgSEFaWkVSKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgImZ1biAkeyRoYXMka3RfY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKToga290bGluLkJvb2xlYW4ge1xuIgorICAgICAgICAiICByZXR1cm4gJGt0X2RzbF9idWlsZGVyJC4keyRoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKVxuIgorICAgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gbm9vcCBmb3IgcHJpbWl0aXZlcworfQorCit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoIUlzRGVmYXVsdFZhbHVlSmF2YURlZmF1bHQoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKKyAgfQorfQorCit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iCisgICAgICAgICAgICAgICAgICIkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVyZ2luZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKEhhc0hhenplcihkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJpZiAob3RoZXIuaGFzJGNhcGl0YWxpemVkX25hbWUkKCkpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJpZiAob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkgIT0gJGRlZmF1bHQkKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgc2V0JGNhcGl0YWxpemVkX25hbWUkKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGluZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKEhhc0hhenplcihkZXNjcmlwdG9yXykpIHsKKyAgICBpZiAoSXNEZWZhdWx0VmFsdWVKYXZhRGVmYXVsdChkZXNjcmlwdG9yXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsJCkge1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgcmVzdWx0LiRuYW1lJF8gPSAkbmFtZSRfO1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsJDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwkKSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfdG9fbG9jYWwkO1xuIgorICAgICAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkXztcbiIpOworICB9Cit9CisKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkbmFtZSRfID0gaW5wdXQucmVhZCRjYXBpdGFsaXplZF90eXBlJCgpO1xuIgorICAgICAgICAgICAgICAgICAiJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iKTsKK30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiaWYgKCRpc19maWVsZF9wcmVzZW50X21lc3NhZ2UkKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIG91dHB1dC53cml0ZSRjYXBpdGFsaXplZF90eXBlJCgkbnVtYmVyJCwgJG5hbWUkXyk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImlmICgkaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlJCkge1xuIgorICAgICAgICAgICAgICAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAgICAgICAgICAgICAgIiAgICAuY29tcHV0ZSRjYXBpdGFsaXplZF90eXBlJFNpemUoJG51bWJlciQsICRuYW1lJF8pO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRXF1YWxzQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBzd2l0Y2ggKEdldEphdmFUeXBlKGRlc2NyaXB0b3JfKSkgeworICAgIGNhc2UgSkFWQVRZUEVfSU5UOgorICAgIGNhc2UgSkFWQVRZUEVfTE9ORzoKKyAgICBjYXNlIEpBVkFUWVBFX0JPT0xFQU46CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKVxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgICAhPSBvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSkgcmV0dXJuIGZhbHNlO1xuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSkFWQVRZUEVfRkxPQVQ6CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAgICJpZiAoamF2YS5sYW5nLkZsb2F0LmZsb2F0VG9JbnRCaXRzKGdldCRjYXBpdGFsaXplZF9uYW1lJCgpKVxuIgorICAgICAgICAgICIgICAgIT0gamF2YS5sYW5nLkZsb2F0LmZsb2F0VG9JbnRCaXRzKFxuIgorICAgICAgICAgICIgICAgICAgIG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKSkgcmV0dXJuIGZhbHNlO1xuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSkFWQVRZUEVfRE9VQkxFOgorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgICAiaWYgKGphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9Mb25nQml0cyhnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSlcbiIKKyAgICAgICAgICAiICAgICE9IGphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9Mb25nQml0cyhcbiIKKyAgICAgICAgICAiICAgICAgICBvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSkpIHJldHVybiBmYWxzZTtcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpBVkFUWVBFX1NUUklORzoKKyAgICBjYXNlIEpBVkFUWVBFX0JZVEVTOgorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgICAiaWYgKCFnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKVxuIgorICAgICAgICAgICIgICAgLmVxdWFscyhvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSkpIHJldHVybiBmYWxzZTtcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgorICAgIGRlZmF1bHQ6CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlSGFzaENvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgImhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIpOworICBzd2l0Y2ggKEdldEphdmFUeXBlKGRlc2NyaXB0b3JfKSkgeworICAgIGNhc2UgSkFWQVRZUEVfSU5UOgorICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpBVkFUWVBFX0xPTkc6CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLmhhc2hMb25nKFxuIgorICAgICAgICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSkFWQVRZUEVfQk9PTEVBTjoKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuaGFzaEJvb2xlYW4oXG4iCisgICAgICAgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBKQVZBVFlQRV9GTE9BVDoKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgamF2YS5sYW5nLkZsb2F0LmZsb2F0VG9JbnRCaXRzKFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBKQVZBVFlQRV9ET1VCTEU6CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLmhhc2hMb25nKFxuIgorICAgICAgICAgICIgICAgamF2YS5sYW5nLkRvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGdldCRjYXBpdGFsaXplZF9uYW1lJCgpKSk7XG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkc6CisgICAgY2FzZSBKQVZBVFlQRV9CWVRFUzoKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpLmhhc2hDb2RlKCk7XG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBKQVZBVFlQRV9FTlVNOgorICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRToKKyAgICBkZWZhdWx0OgorICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gQm94ZWRQcmltaXRpdmVUeXBlTmFtZShHZXRKYXZhVHlwZShkZXNjcmlwdG9yXykpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OkltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgIENvbnRleHQqIGNvbnRleHQpCisgICAgOiBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpIHsKKyAgY29uc3QgT25lb2ZHZW5lcmF0b3JJbmZvKiBpbmZvID0KKyAgICAgIGNvbnRleHQtPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yLT5jb250YWluaW5nX29uZW9mKCkpOworICBTZXRDb21tb25PbmVvZlZhcmlhYmxlcyhkZXNjcmlwdG9yLCBpbmZvLCAmdmFyaWFibGVzXyk7Cit9CisKK0ltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OgorICAgIH5JbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgUHJpbnRFeHRyYUZpZWxkSW5mbyh2YXJpYWJsZXNfLCBwcmludGVyKTsKKyAgR09PR0xFX0RDSEVDSyhIYXNIYXp6ZXIoZGVzY3JpcHRvcl8pKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgSEFaWkVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiAkeyRoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiAkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuICgkYm94ZWRfdHlwZSQpICRvbmVvZl9uYW1lJF87XG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRkZWZhdWx0JDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworfQorCit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlck1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyhIYXNIYXp6ZXIoZGVzY3JpcHRvcl8pKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgSEFaWkVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiAkeyRoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiAkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuICgkYm94ZWRfdHlwZSQpICRvbmVvZl9uYW1lJF87XG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRkZWZhdWx0JDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIFNFVFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgIiR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiRudWxsX2NoZWNrJCIKKyAgICAgICAgICAgICAgICAgIiAgJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAiICAkb25lb2ZfbmFtZSRfID0gdmFsdWU7XG4iCisgICAgICAgICAgICAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIENMRUFSRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICIgICAgJGNsZWFyX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAiICAgICRvbmVvZl9uYW1lJF8gPSBudWxsO1xuIgorICAgICAgIiAgICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworfQorCit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBOby1PcDogV2hlbiBhIHByaW1pdGl2ZSBmaWVsZCBpcyBpbiBhIG9uZW9mLCBjbGVhcmluZyB0aGUgb25lb2YgY2xlYXJzIHRoYXQKKyAgLy8gZmllbGQuCit9CisKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGluZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmVzdWx0LiRvbmVvZl9uYW1lJF8gPSAkb25lb2ZfbmFtZSRfO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVNZXJnaW5nQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAic2V0JGNhcGl0YWxpemVkX25hbWUkKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOworfQorCit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkb25lb2ZfbmFtZSRfID0gaW5wdXQucmVhZCRjYXBpdGFsaXplZF90eXBlJCgpO1xuIgorICAgICAgICAgICAgICAgICAiJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICAgICAgICAgICAgICAiICBvdXRwdXQud3JpdGUkY2FwaXRhbGl6ZWRfdHlwZSQoXG4iKTsKKyAgLy8gJHR5cGUkIGFuZCAkYm94ZWRfdHlwZSQgaXMgdGhlIHNhbWUgZm9yIGJ5dGVzIGZpZWxkcyBzbyB3ZSBkb24ndCBuZWVkIHRvCisgIC8vIGRvIHJlZHVuZGFudCBjYXN0cy4KKyAgaWYgKEdldEphdmFUeXBlKGRlc2NyaXB0b3JfKSA9PSBKQVZBVFlQRV9CWVRFUykgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIgICAgICAkbnVtYmVyJCwgKCR0eXBlJCkgJG9uZW9mX25hbWUkXyk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIiAgICAgICRudW1iZXIkLCAoJHR5cGUkKSgoJGJveGVkX3R5cGUkKSAkb25lb2ZfbmFtZSRfKSk7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtXG4iCisgICAgICAgICAgICAgICAgICIgICAgLmNvbXB1dGUkY2FwaXRhbGl6ZWRfdHlwZSRTaXplKFxuIik7CisgIC8vICR0eXBlJCBhbmQgJGJveGVkX3R5cGUkIGlzIHRoZSBzYW1lIGZvciBieXRlcyBmaWVsZHMgc28gd2UgZG9uJ3QgbmVlZCB0bworICAvLyBkbyByZWR1bmRhbnQgY2FzdHMuCisgIGlmIChHZXRKYXZhVHlwZShkZXNjcmlwdG9yXykgPT0gSkFWQVRZUEVfQllURVMpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiICAgICAgICAkbnVtYmVyJCwgKCR0eXBlJCkgJG9uZW9mX25hbWUkXyk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIiAgICAgICAgJG51bWJlciQsICgkdHlwZSQpKCgkYm94ZWRfdHlwZSQpICRvbmVvZl9uYW1lJF8pKTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKKyAgICBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCkKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgeworICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZGVzY3JpcHRvciksCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXywgJnZhcmlhYmxlc18pOworfQorCitSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKKyAgICB+UmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpIHt9CisKK2ludCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IHsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDwkYm94ZWRfdHlwZSQ+ICIKKyAgICAgICAgICAgICAgICAgImdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKTtcbiIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0NPVU5UKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKTtcbiIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0lOREVYRURfR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiQkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInByaXZhdGUgJGZpZWxkX2xpc3RfdHlwZSQgJG5hbWUkXztcbiIpOworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCRib3hlZF90eXBlJD5cbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0JH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIgIC8vIG5vdGU6ICB1bm1vZGlmaWFibGUgbGlzdAorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfQ09VTlQpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQkfSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfSU5ERVhFRF9HRVRURVIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKGludCBpbmRleCkge1xuIgorICAgICAgIiAgcmV0dXJuICRyZXBlYXRlZF9nZXQkKGluZGV4KTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAicHJpdmF0ZSBpbnQgJG5hbWUkTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xO1xuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIE9uZSBmaWVsZCBpcyB0aGUgbGlzdCBhbmQgdGhlIGJpdCBmaWVsZCBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZQorICAvLyBsaXN0IGlzIGltbXV0YWJsZS4gSWYgaXQncyBpbW11dGFibGUsIHRoZSBpbnZhcmlhbnQgaXMgdGhhdCBpdCBtdXN0CisgIC8vIGVpdGhlciBhbiBpbnN0YW5jZSBvZiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSBvciBpdCdzIGFuIEFycmF5TGlzdAorICAvLyB3cmFwcGVkIGluIGEgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgpIHdyYXBwZXIgYW5kIG5vYm9keSBlbHNlIGhhcworICAvLyBhIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBBcnJheUxpc3QuIFRoaXMgaW52YXJpYW50IGFsbG93cyB1cyB0bworICAvLyBzaGFyZSBpbnN0YW5jZXMgb2YgbGlzdHMgYmV0d2VlbiBwcm90b2NvbCBidWZmZXJzIGF2b2lkaW5nIGV4cGVuc2l2ZQorICAvLyBtZW1vcnkgYWxsb2NhdGlvbnMuIE5vdGUsIGltbXV0YWJsZSBpcyBhIHN0cm9uZyBndWFyYW50ZWUgaGVyZSAtLSBub3QKKyAgLy8ganVzdCB0aGF0IHRoZSBsaXN0IGNhbm5vdCBiZSBtb2RpZmllZCB2aWEgdGhlIHJlZmVyZW5jZSBidXQgdGhhdCB0aGUKKyAgLy8gbGlzdCBjYW4gbmV2ZXIgYmUgbW9kaWZpZWQuCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJwcml2YXRlICRmaWVsZF9saXN0X3R5cGUkICRuYW1lJF8gPSAkZW1wdHlfbGlzdCQ7XG4iKTsKKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2lkIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaWYgKCEkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgJG5hbWUkXyA9ICRtdXRhYmxlX2NvcHlfbGlzdCQ7XG4iCisgICAgICAgICAgICAgICAgICIgICAgJHNldF9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAgICAgICAgICAgICAgIiAgIH1cbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIC8vIE5vdGU6ICBXZSByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIGxpc3QgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGNhbGxlcgorICAvLyAgIGNvdWxkIGhvbGQgb24gdG8gdGhlIHJldHVybmVkIGxpc3QgYW5kIG1vZGlmeSBpdCBhZnRlciB0aGUgbWVzc2FnZQorICAvLyAgIGhhcyBiZWVuIGJ1aWx0LCB0aHVzIG11dGF0aW5nIHRoZSBtZXNzYWdlIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlCisgIC8vICAgaW1tdXRhYmxlLgorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCRib3hlZF90eXBlJD5cbiIKKyAgICAgICIgICAgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCR9JCgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkID9cbiIKKyAgICAgICIgICAgICAgICAgIGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCRuYW1lJF8pIDogJG5hbWUkXztcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9DT1VOVCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCR9JCgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRfLnNpemUoKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9JTkRFWEVEX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoaW50IGluZGV4KSB7XG4iCisgICAgICAiICByZXR1cm4gJHJlcGVhdGVkX2dldCQoaW5kZXgpO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0lOREVYRURfU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIkbnVsbF9jaGVjayQiCisgICAgICAgICAgICAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICAkcmVwZWF0ZWRfc2V0JChpbmRleCwgdmFsdWUpO1xuIgorICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgIiR7JGFkZCRjYXBpdGFsaXplZF9uYW1lJCR9JCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiRudWxsX2NoZWNrJCIKKyAgICAgICAgICAgICAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgICRyZXBlYXRlZF9hZGQkKHZhbHVlKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfTVVMVElfQURERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRhZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgamF2YS5sYW5nLkl0ZXJhYmxlPD8gZXh0ZW5kcyAkYm94ZWRfdHlwZSQ+IHZhbHVlcykge1xuIgorICAgICAgICAgICAgICAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5BYnN0cmFjdE1lc3NhZ2VMaXRlLkJ1aWxkZXIuYWRkQWxsKFxuIgorICAgICAgICAgICAgICAgICAiICAgICAgdmFsdWVzLCAkbmFtZSRfKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIENMRUFSRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICIgICRuYW1lJF8gPSAkZW1wdHlfbGlzdCQ7XG4iCisgICAgICAiICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlS290bGluRHNsTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiLyoqXG4iCisgICAgICAiICogQW4gdW5pbnN0YW50aWFibGUsIGJlaGF2aW9ybGVzcyB0eXBlIHRvIHJlcHJlc2VudCB0aGUgZmllbGQgaW5cbiIKKyAgICAgICIgKiBnZW5lcmljcy5cbiIKKyAgICAgICIgKi9cbiIKKyAgICAgICJAa290bGluLk9wdEluIgorICAgICAgIihjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Pbmx5Rm9yVXNlQnlHZW5lcmF0ZWRQcm90b0NvZGU6OmNsYXNzKVxuIgorICAgICAgImNsYXNzICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kIHByaXZhdGUgY29uc3RydWN0b3IoKSIKKyAgICAgICIgOiBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xQcm94eSgpXG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIka3RfZGVwcmVjYXRpb24kIHZhbCAka3RfbmFtZSQ6ICIKKyAgICAgICAgICAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAgICAgICAgICAgICI8JGt0X3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD5cbiIKKyAgICAgICAgICAgICAgICAgIiAgQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICIgIGdldCgpID0gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAka3RfZHNsX2J1aWxkZXIkLiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QkfSQoKVxuIgorICAgICAgICAgICAgICAgICAiICApXG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwiYWRkJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAgICAgICAgICAgICJmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAgICAgICAgICAgICJhZGQodmFsdWU6ICRrdF90eXBlJCkge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGFkZCRjYXBpdGFsaXplZF9uYW1lJCR9JCh2YWx1ZSlcbiIKKyAgICAgICAgICAgICAgICAgIn0iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwicGx1c0Fzc2lnbiRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgICAgICAgICAgICAiQFN1cHByZXNzKFwiTk9USElOR19UT19JTkxJTkVcIilcbiIKKyAgICAgICAgICAgICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAgICAgICAgICAgICJwbHVzQXNzaWduKHZhbHVlOiAka3RfdHlwZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgYWRkKHZhbHVlKVxuIgorICAgICAgICAgICAgICAgICAifSIpOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfTVVMVElfQURERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyBmYWxzZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bU5hbWUoXCJhZGRBbGwka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICAgICAgICAgICAgImZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xMaXN0IgorICAgICAgICAgICAgICAgICAiPCRrdF90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICAgICAgICAgICAgImFkZEFsbCh2YWx1ZXM6IGtvdGxpbi5jb2xsZWN0aW9ucy5JdGVyYWJsZTwka3RfdHlwZSQ+KSB7XG4iCisgICAgICAgICAgICAgICAgICIgICRrdF9kc2xfYnVpbGRlciQuJHskYWRkQWxsJGNhcGl0YWxpemVkX25hbWUkJH0kKHZhbHVlcylcbiIKKyAgICAgICAgICAgICAgICAgIn0iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX01VTFRJX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcInBsdXNBc3NpZ25BbGwka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICJAU3VwcHJlc3MoXCJOT1RISU5HX1RPX0lOTElORVwiKVxuIgorICAgICAgImlubGluZSBvcGVyYXRvciBmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICI8JGt0X3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD4uIgorICAgICAgInBsdXNBc3NpZ24odmFsdWVzOiBrb3RsaW4uY29sbGVjdGlvbnMuSXRlcmFibGU8JGt0X3R5cGUkPikge1xuIgorICAgICAgIiAgYWRkQWxsKHZhbHVlcylcbiIKKyAgICAgICJ9Iik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9JTkRFWEVEX1NFVFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIkBrb3RsaW4uanZtLkp2bU5hbWUoXCJzZXQka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICJvcGVyYXRvciBmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICI8JGt0X3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD4uIgorICAgICAgInNldChpbmRleDoga290bGluLkludCwgdmFsdWU6ICRrdF90eXBlJCkge1xuIgorICAgICAgIiAgJGt0X2RzbF9idWlsZGVyJC4keyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoaW5kZXgsIHZhbHVlKVxuIgorICAgICAgIn0iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwiY2xlYXIka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICAgICAgICAgICAgImZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xMaXN0IgorICAgICAgICAgICAgICAgICAiPCRrdF90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICAgICAgICAgICAgImNsZWFyKCkge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKClcbiIKKyAgICAgICAgICAgICAgICAgIn0iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKKyAgICBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBub29wIGZvciBwcmltaXRpdmVzCit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZW1wdHlfbGlzdCQ7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRuYW1lJF8gPSAkZW1wdHlfbGlzdCQ7XG4iCisgICAgICAgICAgICAgICAgICIkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRoZSBjb2RlIGJlbG93IGRvZXMgdHdvIG9wdGltaXphdGlvbnM6CisgIC8vICAgMS4gSWYgdGhlIG90aGVyIGxpc3QgaXMgZW1wdHksIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gVGhpcyBlbnN1cmVzIHdlCisgIC8vICAgICAgZG9uJ3QgYWxsb2NhdGUgYSBuZXcgYXJyYXkgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGltbXV0YWJsZSBvbmUuCisgIC8vICAgMi4gSWYgdGhlIG90aGVyIGxpc3QgaXMgbm9uLWVtcHR5IGFuZCBvdXIgY3VycmVudCBsaXN0IGlzIGVtcHR5LCB3ZSBjYW4KKyAgLy8gICAgICByZXVzZSB0aGUgb3RoZXIgbGlzdCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGltbXV0YWJsZS4KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImlmICghb3RoZXIuJG5hbWUkXy5pc0VtcHR5KCkpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaWYgKCRuYW1lJF8uaXNFbXB0eSgpKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgJG5hbWUkXyA9IG90aGVyLiRuYW1lJF87XG4iCisgICAgICAgICAgICAgICAgICIgICAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICAgICAgICAgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgICAgICAgICAgICAiICAgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICAgICRuYW1lJF8uYWRkQWxsKG90aGVyLiRuYW1lJF8pO1xuIgorICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICAgICAgICAgICAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGluZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gVGhlIGNvZGUgYmVsb3cgZW5zdXJlcyB0aGF0IHRoZSByZXN1bHQgaGFzIGFuIGltbXV0YWJsZSBsaXN0LiBJZiBvdXIKKyAgLy8gbGlzdCBpcyBpbW11dGFibGUsIHdlIGNhbiBqdXN0IHJldXNlIGl0LiBJZiBub3QsIHdlIG1ha2UgaXQgaW1tdXRhYmxlLgorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiaWYgKCRnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWVfbWFrZV9pbW11dGFibGUkO1xuIgorICAgICAgICAgICAgICAgICAiICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAgICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJHR5cGUkIHYgPSBpbnB1dC5yZWFkJGNhcGl0YWxpemVkX3R5cGUkKCk7XG4iCisgICAgICAgICAgICAgICAgICJlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiRyZXBlYXRlZF9hZGQkKHYpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CisgICAgR2VuZXJhdGVCdWlsZGVyUGFyc2luZ0NvZGVGcm9tUGFja2VkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJpbnQgbGVuZ3RoID0gaW5wdXQucmVhZFJhd1ZhcmludDMyKCk7XG4iCisgICAgICAgICAgICAgICAgICJpbnQgbGltaXQgPSBpbnB1dC5wdXNoTGltaXQobGVuZ3RoKTtcbiIKKyAgICAgICAgICAgICAgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAid2hpbGUgKGlucHV0LmdldEJ5dGVzVW50aWxMaW1pdCgpID4gMCkge1xuIgorICAgICAgICAgICAgICAgICAiICAkcmVwZWF0ZWRfYWRkJChpbnB1dC5yZWFkJGNhcGl0YWxpemVkX3R5cGUkKCkpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgICAgICAiaW5wdXQucG9wTGltaXQobGltaXQpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7CisgICAgLy8gV2UgaW52b2tlIGdldFNlcmlhbGl6ZWRTaXplIGluIHdyaXRlVG8gZm9yIG1lc3NhZ2VzIHRoYXQgaGF2ZSBwYWNrZWQKKyAgICAvLyBmaWVsZHMgaW4gSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVNZXNzYWdlU2VyaWFsaXphdGlvbk1ldGhvZHMuCisgICAgLy8gVGhhdCBtYWtlcyBpdCBzYWZlIHRvIHJlbHkgb24gdGhlIG1lbW9pemVkIHNpemUgaGVyZS4KKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJpZiAoZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLnNpemUoKSA+IDApIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICBvdXRwdXQud3JpdGVVSW50MzJOb1RhZygkdGFnJCk7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgb3V0cHV0LndyaXRlVUludDMyTm9UYWcoJG5hbWUkTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgb3V0cHV0LndyaXRlJGNhcGl0YWxpemVkX3R5cGUkTm9UYWcoJHJlcGVhdGVkX2dldCQoaSkpO1xuIgorICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgorICAgICAgICAiICBvdXRwdXQud3JpdGUkY2FwaXRhbGl6ZWRfdHlwZSQoJG51bWJlciQsICRyZXBlYXRlZF9nZXQkKGkpKTtcbiIKKyAgICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICAgIiAgaW50IGRhdGFTaXplID0gMDtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBpZiAoRml4ZWRTaXplKEdldFR5cGUoZGVzY3JpcHRvcl8pKSA9PSAtMSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCisgICAgICAgICIgIGRhdGFTaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAgICAgIiAgICAuY29tcHV0ZSRjYXBpdGFsaXplZF90eXBlJFNpemVOb1RhZygkcmVwZWF0ZWRfZ2V0JChpKSk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgImRhdGFTaXplID0gJGZpeGVkX3NpemUkICogZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLnNpemUoKTtcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoInNpemUgKz0gZGF0YVNpemU7XG4iKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiaWYgKCFnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkuaXNFbXB0eSgpKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgc2l6ZSArPSAkdGFnX3NpemUkO1xuIgorICAgICAgICAgICAgICAgICAgICIgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAuY29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJzaXplICs9ICR0YWdfc2l6ZSQgKiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkuc2l6ZSgpO1xuIik7CisgIH0KKworICAvLyBjYWNoZSB0aGUgZGF0YSBzaXplIGZvciBwYWNrZWQgZmllbGRzLgorICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTtcbiIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVFcXVhbHNDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJpZiAoIWdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKVxuIgorICAgICAgIiAgICAuZXF1YWxzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSkpIHJldHVybiBmYWxzZTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlSGFzaENvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpID4gMCkge1xuIgorICAgICAgIiAgaGFzaCA9ICgzNyAqIGhhc2gpICsgJGNvbnN0YW50X25hbWUkO1xuIgorICAgICAgIiAgaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLmhhc2hDb2RlKCk7XG4iCisgICAgICAifVxuIik7Cit9CisKK3N0ZDo6c3RyaW5nIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoR2V0SmF2YVR5cGUoZGVzY3JpcHRvcl8pKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJpbWl0aXZlX2ZpZWxkLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJpbWl0aXZlX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhNmMyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcmltaXRpdmVfZmllbGQuaApAQCAtMCwwICsxLDE2MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX1BSSU1JVElWRV9GSUVMRF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfUFJJTUlUSVZFX0ZJRUxEX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CitjbGFzcyBDb250ZXh0OyAgICAgICAgICAgIC8vIGNvbnRleHQuaAorY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7ICAvLyBuYW1lX3Jlc29sdmVyLmgKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitjbGFzcyBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpOworICB+SW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICAvLyBpbXBsZW1lbnRzIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVLb3RsaW5Ec2xNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnN0cmluZyBHZXRCb3hlZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKworIHByb3RlY3RlZDoKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJpYWJsZXNfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IpOworfTsKKworY2xhc3MgSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcgorICAgIDogcHVibGljIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCk7CisgIH5JbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcik7Cit9OworCitjbGFzcyBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yCisgICAgOiBwdWJsaWMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgIGludCBidWlsZGVyQml0SW5kZXgsIENvbnRleHQqIGNvbnRleHQpOworICB+UmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IG92ZXJyaWRlOworICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nQ29kZUZyb21QYWNrZWQoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVLb3RsaW5Ec2xNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnN0cmluZyBHZXRCb3hlZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyaWFibGVzXzsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXJfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX1BSSU1JVElWRV9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcmltaXRpdmVfZmllbGRfbGl0ZS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcmltaXRpdmVfZmllbGRfbGl0ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzIzZmVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3ByaW1pdGl2ZV9maWVsZF9saXRlLmNjCkBAIC0wLDAgKzEsNzc4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcmltaXRpdmVfZmllbGRfbGl0ZS5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lX3Jlc29sdmVyLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0OwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOworCituYW1lc3BhY2UgeworYm9vbCBFbmFibGVFeHBlcmltZW50YWxSdW50aW1lRm9yTGl0ZSgpIHsKKyNpZmRlZiBQUk9UT0JVRl9FWFBFUklNRU5UCisgIHJldHVybiBQUk9UT0JVRl9FWFBFUklNRU5UOworI2Vsc2UgICAvLyBQUk9UT0JVRl9FWFBFUklNRU5UCisgIHJldHVybiBmYWxzZTsKKyNlbmRpZiAgLy8gIVBST1RPQlVGX0VYUEVSSU1FTlQKK30KKwordm9pZCBTZXRQcmltaXRpdmVWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzKSB7CisgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIGluZm8sIHZhcmlhYmxlcyk7CisgIEphdmFUeXBlIGphdmFUeXBlID0gR2V0SmF2YVR5cGUoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsidHlwZSJdID0gUHJpbWl0aXZlVHlwZU5hbWUoamF2YVR5cGUpOworICAoKnZhcmlhYmxlcylbImJveGVkX3R5cGUiXSA9IEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoamF2YVR5cGUpOworICAoKnZhcmlhYmxlcylbImt0X3R5cGUiXSA9IEtvdGxpblR5cGVOYW1lKGphdmFUeXBlKTsKKyAgKCp2YXJpYWJsZXMpWyJmaWVsZF90eXBlIl0gPSAoKnZhcmlhYmxlcylbInR5cGUiXTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBJbW11dGFibGVEZWZhdWx0VmFsdWUoZGVzY3JpcHRvciwgbmFtZV9yZXNvbHZlcik7CisgICgqdmFyaWFibGVzKVsiY2FwaXRhbGl6ZWRfdHlwZSJdID0KKyAgICAgIEdldENhcGl0YWxpemVkVHlwZShkZXNjcmlwdG9yLCAvKiBpbW11dGFibGUgPSAqLyB0cnVlKTsKKyAgKCp2YXJpYWJsZXMpWyJ0YWciXSA9CisgICAgICBTdHJDYXQoc3RhdGljX2Nhc3Q8aW50MzJfdD4oV2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yKSkpOworICAoKnZhcmlhYmxlcylbInRhZ19zaXplIl0gPSBTdHJDYXQoCisgICAgICBXaXJlRm9ybWF0OjpUYWdTaXplKGRlc2NyaXB0b3ItPm51bWJlcigpLCBHZXRUeXBlKGRlc2NyaXB0b3IpKSk7CisgICgqdmFyaWFibGVzKVsicmVxdWlyZWQiXSA9IGRlc2NyaXB0b3ItPmlzX3JlcXVpcmVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworCisgIHN0ZDo6c3RyaW5nIGNhcGl0YWxpemVkX3R5cGUgPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKAorICAgICAgUHJpbWl0aXZlVHlwZU5hbWUoamF2YVR5cGUpLCB0cnVlIC8qIGNhcF9uZXh0X2xldHRlciAqLyk7CisgIHN3aXRjaCAoamF2YVR5cGUpIHsKKyAgICBjYXNlIEpBVkFUWVBFX0lOVDoKKyAgICBjYXNlIEpBVkFUWVBFX0xPTkc6CisgICAgY2FzZSBKQVZBVFlQRV9GTE9BVDoKKyAgICBjYXNlIEpBVkFUWVBFX0RPVUJMRToKKyAgICBjYXNlIEpBVkFUWVBFX0JPT0xFQU46CisgICAgICAoKnZhcmlhYmxlcylbImZpZWxkX2xpc3RfdHlwZSJdID0KKyAgICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC4iICsgY2FwaXRhbGl6ZWRfdHlwZSArICJMaXN0IjsKKyAgICAgICgqdmFyaWFibGVzKVsiZW1wdHlfbGlzdCJdID0gImVtcHR5IiArIGNhcGl0YWxpemVkX3R5cGUgKyAiTGlzdCgpIjsKKyAgICAgICgqdmFyaWFibGVzKVsibWFrZV9uYW1lX3VubW9kaWZpYWJsZSJdID0KKyAgICAgICAgICAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfLm1ha2VJbW11dGFibGUoKSI7CisgICAgICAoKnZhcmlhYmxlcylbInJlcGVhdGVkX2dldCJdID0KKyAgICAgICAgICAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfLmdldCIgKyBjYXBpdGFsaXplZF90eXBlOworICAgICAgKCp2YXJpYWJsZXMpWyJyZXBlYXRlZF9hZGQiXSA9CisgICAgICAgICAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gKyAiXy5hZGQiICsgY2FwaXRhbGl6ZWRfdHlwZTsKKyAgICAgICgqdmFyaWFibGVzKVsicmVwZWF0ZWRfc2V0Il0gPQorICAgICAgICAgICgqdmFyaWFibGVzKVsibmFtZSJdICsgIl8uc2V0IiArIGNhcGl0YWxpemVkX3R5cGU7CisgICAgICAoKnZhcmlhYmxlcylbInZpc2l0X3R5cGUiXSA9IGNhcGl0YWxpemVkX3R5cGU7CisgICAgICAoKnZhcmlhYmxlcylbInZpc2l0X3R5cGVfbGlzdCJdID0gInZpc2l0IiArIGNhcGl0YWxpemVkX3R5cGUgKyAiTGlzdCI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgKCp2YXJpYWJsZXMpWyJmaWVsZF9saXN0X3R5cGUiXSA9CisgICAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuUHJvdG9idWZMaXN0PCIgKworICAgICAgICAgICgqdmFyaWFibGVzKVsiYm94ZWRfdHlwZSJdICsgIj4iOworICAgICAgKCp2YXJpYWJsZXMpWyJlbXB0eV9saXN0Il0gPSAiZW1wdHlQcm90b2J1Zkxpc3QoKSI7CisgICAgICAoKnZhcmlhYmxlcylbIm1ha2VfbmFtZV91bm1vZGlmaWFibGUiXSA9CisgICAgICAgICAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gKyAiXy5tYWtlSW1tdXRhYmxlKCkiOworICAgICAgKCp2YXJpYWJsZXMpWyJyZXBlYXRlZF9nZXQiXSA9ICgqdmFyaWFibGVzKVsibmFtZSJdICsgIl8uZ2V0IjsKKyAgICAgICgqdmFyaWFibGVzKVsicmVwZWF0ZWRfYWRkIl0gPSAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfLmFkZCI7CisgICAgICAoKnZhcmlhYmxlcylbInJlcGVhdGVkX3NldCJdID0gKCp2YXJpYWJsZXMpWyJuYW1lIl0gKyAiXy5zZXQiOworICAgICAgKCp2YXJpYWJsZXMpWyJ2aXNpdF90eXBlIl0gPSAiQnl0ZVN0cmluZyI7CisgICAgICAoKnZhcmlhYmxlcylbInZpc2l0X3R5cGVfbGlzdCJdID0gInZpc2l0TGlzdCI7CisgIH0KKworICBpZiAoamF2YVR5cGUgPT0gSkFWQVRZUEVfQllURVMpIHsKKyAgICAoKnZhcmlhYmxlcylbImJ5dGVzX2RlZmF1bHQiXSA9CisgICAgICAgIFRvVXBwZXIoKCp2YXJpYWJsZXMpWyJuYW1lIl0pICsgIl9ERUZBVUxUX1ZBTFVFIjsKKyAgfQorCisgIGlmIChJc1JlZmVyZW5jZVR5cGUoamF2YVR5cGUpKSB7CisgICAgLy8gV2UgdXNlIGB4LmdldENsYXNzKClgIGFzIGEgbnVsbCBjaGVjayBiZWNhdXNlIGl0IGdlbmVyYXRlcyBsZXNzIGJ5dGVjb2RlCisgICAgLy8gdGhhbiBhbiBgaWYgKHggPT0gbnVsbCkgeyB0aHJvdyAuLi4gfWAgc3RhdGVtZW50LgorICAgICgqdmFyaWFibGVzKVsibnVsbF9jaGVjayJdID0KKyAgICAgICAgIiAgamF2YS5sYW5nLkNsYXNzPD8+IHZhbHVlQ2xhc3MgPSB2YWx1ZS5nZXRDbGFzcygpO1xuIjsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbIm51bGxfY2hlY2siXSA9ICIiOworICB9CisgIC8vIFRPRE8oYmlyZG8pOiBBZGQgQGRlcHJlY2F0ZWQgamF2YWRvYyB3aGVuIGdlbmVyYXRpbmcgamF2YWRvYyBpcyBzdXBwb3J0ZWQKKyAgLy8gYnkgdGhlIHByb3RvIGNvbXBpbGVyCisgICgqdmFyaWFibGVzKVsiZGVwcmVjYXRpb24iXSA9CisgICAgICBkZXNjcmlwdG9yLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpID8gIkBqYXZhLmxhbmcuRGVwcmVjYXRlZCAiIDogIiI7CisgICgqdmFyaWFibGVzKVsia3RfZGVwcmVjYXRpb24iXSA9CisgICAgICBkZXNjcmlwdG9yLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpCisgICAgICAgICAgPyAiQGtvdGxpbi5EZXByZWNhdGVkKG1lc3NhZ2UgPSBcIkZpZWxkICIgKyAoKnZhcmlhYmxlcylbIm5hbWUiXSArCisgICAgICAgICAgICAgICAgIiBpcyBkZXByZWNhdGVkXCIpICIKKyAgICAgICAgICA6ICIiOworICBpbnQgZml4ZWRfc2l6ZSA9IEZpeGVkU2l6ZShHZXRUeXBlKGRlc2NyaXB0b3IpKTsKKyAgaWYgKGZpeGVkX3NpemUgIT0gLTEpIHsKKyAgICAoKnZhcmlhYmxlcylbImZpeGVkX3NpemUiXSA9IFN0ckNhdChmaXhlZF9zaXplKTsKKyAgfQorCisgIGlmIChIYXNIYXNiaXQoZGVzY3JpcHRvcikpIHsKKyAgICAvLyBGb3Igc2luZ3VsYXIgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHRoZSBoYXNGaWVsZCBiaXQuCisgICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworCisgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGhhdmUgYSB0cmFpbGluZyAiOyIuCisgICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPQorICAgICAgICBHZW5lcmF0ZVNldEJpdChtZXNzYWdlQml0SW5kZXgpICsgIjsiOworICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPQorICAgICAgICBHZW5lcmF0ZUNsZWFyQml0KG1lc3NhZ2VCaXRJbmRleCkgKyAiOyI7CisKKyAgICAoKnZhcmlhYmxlcylbImlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSJdID0gR2VuZXJhdGVHZXRCaXQobWVzc2FnZUJpdEluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9ICIiOworICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSAiIjsKKworICAgIHN3aXRjaCAoZGVzY3JpcHRvci0+dHlwZSgpKSB7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzoKKyAgICAgICAgKCp2YXJpYWJsZXMpWyJpc19maWVsZF9wcmVzZW50X21lc3NhZ2UiXSA9CisgICAgICAgICAgICAiISIgKyAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfLmlzRW1wdHkoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQ6CisgICAgICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPQorICAgICAgICAgICAgImphdmEubGFuZy5GbG9hdC5mbG9hdFRvUmF3SW50Qml0cygiICsgKCp2YXJpYWJsZXMpWyJuYW1lIl0gKworICAgICAgICAgICAgIl8pICE9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRToKKyAgICAgICAgKCp2YXJpYWJsZXMpWyJpc19maWVsZF9wcmVzZW50X21lc3NhZ2UiXSA9CisgICAgICAgICAgICAiamF2YS5sYW5nLkRvdWJsZS5kb3VibGVUb1Jhd0xvbmdCaXRzKCIgKyAoKnZhcmlhYmxlcylbIm5hbWUiXSArCisgICAgICAgICAgICAiXykgIT0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgKCp2YXJpYWJsZXMpWyJpc19maWVsZF9wcmVzZW50X21lc3NhZ2UiXSA9CisgICAgICAgICAgICAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfICE9ICIgKyAoKnZhcmlhYmxlcylbImRlZmF1bHQiXTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsIl0gPQorICAgICAgR2VuZXJhdGVHZXRCaXRGcm9tTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF90b19sb2NhbCJdID0KKyAgICAgIEdlbmVyYXRlU2V0Qml0VG9Mb2NhbChtZXNzYWdlQml0SW5kZXgpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbW11dGFibGVQcmltaXRpdmVGaWVsZExpdGVHZW5lcmF0b3I6OkltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsIENvbnRleHQqIGNvbnRleHQpCisgICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwKKyAgICAgIG1lc3NhZ2VCaXRJbmRleF8obWVzc2FnZUJpdEluZGV4KSwKKyAgICAgIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7CisgIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZGVzY3JpcHRvciksCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXywgJnZhcmlhYmxlc18pOworfQorCitJbW11dGFibGVQcmltaXRpdmVGaWVsZExpdGVHZW5lcmF0b3I6On5JbW11dGFibGVQcmltaXRpdmVGaWVsZExpdGVHZW5lcmF0b3IoKSB7fQorCitpbnQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRMaXRlR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEhhc0hhc2JpdChkZXNjcmlwdG9yXykgPyAxIDogMDsKK30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoSGFzSGF6emVyKGRlc2NyaXB0b3JfKSkgeworICAgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCk7XG4iKTsKKyAgfQorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJGRlcHJlY2F0aW9uJCR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworfQorCit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChJc0J5dGVTdHJpbmdXaXRoQ3VzdG9tRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3JfKSkgeworICAgIC8vIGFsbG9jYXRlIHRoaXMgb25jZSBzdGF0aWNhbGx5IHNpbmNlIHdlIGtub3cgQnl0ZVN0cmluZ3MgYXJlIGltbXV0YWJsZQorICAgIC8vIHZhbHVlcyB0aGF0IGNhbiBiZSByZXVzZWQuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCAkZmllbGRfdHlwZSQgJGJ5dGVzX2RlZmF1bHQkID0gJGRlZmF1bHQkO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInByaXZhdGUgJGZpZWxkX3R5cGUkICRuYW1lJF87XG4iKTsKKyAgUHJpbnRFeHRyYUZpZWxkSW5mbyh2YXJpYWJsZXNfLCBwcmludGVyKTsKKyAgaWYgKEhhc0hhenplcihkZXNjcmlwdG9yXykpIHsKKyAgICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuICR7JGhhcyRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIFNFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJwcml2YXRlIHZvaWQgc2V0JGNhcGl0YWxpemVkX25hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiJG51bGxfY2hlY2skIgorICAgICAgICAgICAgICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSRcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJwcml2YXRlIHZvaWQgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICRjbGVhcl9oYXNfZmllbGRfYml0X21lc3NhZ2UkXG4iKTsKKyAgSmF2YVR5cGUgdHlwZSA9IEdldEphdmFUeXBlKGRlc2NyaXB0b3JfKTsKKyAgaWYgKHR5cGUgPT0gSkFWQVRZUEVfU1RSSU5HIHx8IHR5cGUgPT0gSkFWQVRZUEVfQllURVMpIHsKKyAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBub3QgYSBzaW1wbGUgbGl0ZXJhbCBzbyB3ZSB3YW50IHRvIGF2b2lkIGV4ZWN1dGluZworICAgIC8vIGl0IG11bHRpcGxlIHRpbWVzLiAgSW5zdGVhZCwgZ2V0IHRoZSBkZWZhdWx0IG91dCBvZiB0aGUgZGVmYXVsdCBpbnN0YW5jZS4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIiAgJG5hbWUkXyA9IGdldERlZmF1bHRJbnN0YW5jZSgpLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiAgJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlck1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKEhhc0hhenplcihkZXNjcmlwdG9yXykpIHsKKyAgICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuICR7JGhhcyRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuIGluc3RhbmNlLmhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgorICAgICAgICAifVxuIik7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgfQorCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEdFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIFNFVFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgIiR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaW5zdGFuY2Uuc2V0JGNhcGl0YWxpemVkX25hbWUkKHZhbHVlKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgIiAgaW5zdGFuY2UuY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworfQorCit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVLb3RsaW5Ec2xNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRrdF9kZXByZWNhdGlvbiR2YXIgJGt0X25hbWUkOiAka3RfdHlwZSRcbiIKKyAgICAgICAgICAgICAgICAgIiAgQEp2bU5hbWUoXCIkeyRnZXQka3RfY2FwaXRhbGl6ZWRfbmFtZSQkfSRcIilcbiIKKyAgICAgICAgICAgICAgICAgIiAgZ2V0KCkgPSAka3RfZHNsX2J1aWxkZXIkLiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpXG4iCisgICAgICAgICAgICAgICAgICIgIEBKdm1OYW1lKFwiJHskc2V0JGt0X2NhcGl0YWxpemVkX25hbWUkJH0kXCIpXG4iCisgICAgICAgICAgICAgICAgICIgIHNldCh2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiICAgICRrdF9kc2xfYnVpbGRlciQuJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKHZhbHVlKVxuIgorICAgICAgICAgICAgICAgICAiICB9XG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiZnVuICR7JGNsZWFyJGt0X2NhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKClcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIGlmIChIYXNIYXp6ZXIoZGVzY3JpcHRvcl8pKSB7CisgICAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgSEFaWkVSKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgImZ1biAkeyRoYXMka3RfY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKToga290bGluLkJvb2xlYW4ge1xuIgorICAgICAgICAiICByZXR1cm4gJGt0X2RzbF9idWlsZGVyJC4keyRoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKVxuIgorICAgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlRmllbGRJbmZvKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4qIG91dHB1dCkgY29uc3QgeworICBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoZGVzY3JpcHRvcl8tPm51bWJlcigpLCBvdXRwdXQpOworICBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoR2V0RXhwZXJpbWVudGFsSmF2YUZpZWxkVHlwZShkZXNjcmlwdG9yXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpOworICBpZiAoSGFzSGFzYml0KGRlc2NyaXB0b3JfKSkgeworICAgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShtZXNzYWdlQml0SW5kZXhfLCBvdXRwdXQpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJcIiRuYW1lJF9cIixcbiIpOworfQorCit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKElzQnl0ZVN0cmluZ1dpdGhDdXN0b21EZWZhdWx0VmFsdWUoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkYnl0ZXNfZGVmYXVsdCQ7XG4iKTsKKyAgfSBlbHNlIGlmICghSXNEZWZhdWx0VmFsdWVKYXZhRGVmYXVsdChkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gQm94ZWRQcmltaXRpdmVUeXBlTmFtZShHZXRKYXZhVHlwZShkZXNjcmlwdG9yXykpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yOjoKKyAgICBJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQorICAgIDogSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRMaXRlR2VuZXJhdG9yKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KSB7CisgIGNvbnN0IE9uZW9mR2VuZXJhdG9ySW5mbyogaW5mbyA9CisgICAgICBjb250ZXh0LT5HZXRPbmVvZkdlbmVyYXRvckluZm8oZGVzY3JpcHRvci0+Y29udGFpbmluZ19vbmVvZigpKTsKKyAgU2V0Q29tbW9uT25lb2ZWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgJnZhcmlhYmxlc18pOworfQorCitJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcjo6CisgICAgfkltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yKCkge30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7CisgIEdPT0dMRV9EQ0hFQ0soSGFzSGF6emVyKGRlc2NyaXB0b3JfKSk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICAgICAgICAgICAgICAiICAgIHJldHVybiAoJGJveGVkX3R5cGUkKSAkb25lb2ZfbmFtZSRfO1xuIgorICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiAkZGVmYXVsdCQ7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBTRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2lkIHNldCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiRudWxsX2NoZWNrJCIKKyAgICAgICAgICAgICAgICAgIiAgJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAiICAkb25lb2ZfbmFtZSRfID0gdmFsdWU7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICAgICAgICAgICAgICAiICAgICRjbGVhcl9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAiICAgICRvbmVvZl9uYW1lJF8gPSBudWxsO1xuIgorICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVGaWVsZEluZm8oCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCB7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShkZXNjcmlwdG9yXy0+bnVtYmVyKCksIG91dHB1dCk7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShHZXRFeHBlcmltZW50YWxKYXZhRmllbGRUeXBlKGRlc2NyaXB0b3JfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShkZXNjcmlwdG9yXy0+Y29udGFpbmluZ19vbmVvZigpLT5pbmRleCgpLCBvdXRwdXQpOworfQorCit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0soSGFzSGF6emVyKGRlc2NyaXB0b3JfKSk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gaW5zdGFuY2UuaGFzJGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gaW5zdGFuY2UuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBTRVRURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAiCisgICAgICAgICAgICAgICAgICIkeyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGNvcHlPbldyaXRlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgIGluc3RhbmNlLnNldCRjYXBpdGFsaXplZF9uYW1lJCh2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICIgIGluc3RhbmNlLmNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCisgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcjo6CisgICAgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZExpdGVHZW5lcmF0b3IoCisgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgQ29udGV4dCogY29udGV4dCkKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgICAgY29udGV4dF8oY29udGV4dCksCisgICAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgeworICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGRlc2NyaXB0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9yZXNvbHZlcl8sICZ2YXJpYWJsZXNfKTsKK30KKworUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZExpdGVHZW5lcmF0b3I6OgorICAgIH5SZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcigpIHt9CisKK2ludCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCB7CisgIHJldHVybiAwOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9HRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJGphdmEudXRpbC5MaXN0PCRib3hlZF90eXBlJD4gIgorICAgICAgICAgICAgICAgICAiZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpO1xuIik7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfQ09VTlQpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpO1xuIik7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfSU5ERVhFRF9HRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInByaXZhdGUgJGZpZWxkX2xpc3RfdHlwZSQgJG5hbWUkXztcbiIpOworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCRib3hlZF90eXBlJD5cbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0JH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIgIC8vIG5vdGU6ICB1bm1vZGlmaWFibGUgbGlzdAorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfQ09VTlQpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50ICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50JH0kKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJF8uc2l6ZSgpO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0lOREVYRURfR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoaW50IGluZGV4KSB7XG4iCisgICAgICAiICByZXR1cm4gJHJlcGVhdGVkX2dldCQoaW5kZXgpO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIGlmICghRW5hYmxlRXhwZXJpbWVudGFsUnVudGltZUZvckxpdGUoKSAmJiBkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkgJiYKKyAgICAgIGNvbnRleHRfLT5IYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJwcml2YXRlIGludCAkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJwcml2YXRlIHZvaWQgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCkge1xuIgorICAgICAgLy8gVXNlIGEgdGVtcG9yYXJ5IHRvIGF2b2lkIGEgcmVkdW5kYW50IGlnZXQtb2JqZWN0LgorICAgICAgIiAgJGZpZWxkX2xpc3RfdHlwZSQgdG1wID0gJG5hbWUkXztcbiIKKyAgICAgICIgIGlmICghdG1wLmlzTW9kaWZpYWJsZSgpKSB7XG4iCisgICAgICAiICAgICRuYW1lJF8gPVxuIgorICAgICAgIiAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5tdXRhYmxlQ29weSh0bXApO1xuIgorICAgICAgIiAgIH1cbiIKKyAgICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0lOREVYRURfU0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiRudWxsX2NoZWNrJCIKKyAgICAgICAgICAgICAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgICRyZXBlYXRlZF9zZXQkKGluZGV4LCB2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9BRERFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJwcml2YXRlIHZvaWQgYWRkJGNhcGl0YWxpemVkX25hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiJG51bGxfY2hlY2skIgorICAgICAgICAgICAgICAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJHJlcGVhdGVkX2FkZCQodmFsdWUpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfTVVMVElfQURERVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2lkIGFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBqYXZhLmxhbmcuSXRlcmFibGU8PyBleHRlbmRzICRib3hlZF90eXBlJD4gdmFsdWVzKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkFic3RyYWN0TWVzc2FnZUxpdGUuYWRkQWxsKFxuIgorICAgICAgICAgICAgICAgICAiICAgICAgdmFsdWVzLCAkbmFtZSRfKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8JGJveGVkX3R5cGUkPlxuIgorICAgICAgICAgICAgICAgICAiICAgICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgIGluc3RhbmNlLmdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9DT1VOVCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQkfSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gaW5zdGFuY2UuZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9JTkRFWEVEX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKGludCBpbmRleCkge1xuIgorICAgICAgIiAgcmV0dXJuIGluc3RhbmNlLmdldCRjYXBpdGFsaXplZF9uYW1lJChpbmRleCk7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIFNFVFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICBpbnN0YW5jZS5zZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW5kZXgsIHZhbHVlKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICIKKyAgICAgICAgICAgICAgICAgIiR7JGFkZCRjYXBpdGFsaXplZF9uYW1lJCR9JCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaW5zdGFuY2UuYWRkJGNhcGl0YWxpemVkX25hbWUkKHZhbHVlKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9NVUxUSV9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBqYXZhLmxhbmcuSXRlcmFibGU8PyBleHRlbmRzICRib3hlZF90eXBlJD4gdmFsdWVzKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGNvcHlPbldyaXRlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgIGluc3RhbmNlLmFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJCh2YWx1ZXMpO1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgIiAgaW5zdGFuY2UuY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIi8qKlxuIgorICAgICAgIiAqIEFuIHVuaW5zdGFudGlhYmxlLCBiZWhhdmlvcmxlc3MgdHlwZSB0byByZXByZXNlbnQgdGhlIGZpZWxkIGluXG4iCisgICAgICAiICogZ2VuZXJpY3MuXG4iCisgICAgICAiICovXG4iCisgICAgICAiQGtvdGxpbi5PcHRJbiIKKyAgICAgICIoY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uT25seUZvclVzZUJ5R2VuZXJhdGVkUHJvdG9Db2RlOjpjbGFzcylcbiIKKyAgICAgICJjbGFzcyAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JCBwcml2YXRlIGNvbnN0cnVjdG9yKCkiCisgICAgICAiIDogY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsUHJveHkoKVxuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGt0X2RlcHJlY2F0aW9uJCB2YWwgJGt0X25hbWUkOiAiCisgICAgICAgICAgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xMaXN0IgorICAgICAgICAgICAgICAgICAiPCRrdF90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+XG4iCisgICAgICAgICAgICAgICAgICIgIEBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAiICBnZXQoKSA9IGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QoXG4iCisgICAgICAgICAgICAgICAgICIgICAgJGt0X2RzbF9idWlsZGVyJC4keyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0JH0kKClcbiIKKyAgICAgICAgICAgICAgICAgIiAgKVxuIik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcImFkZCRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgICAgICAgICAgICAiZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAgICAgICAgICAgICI8JGt0X3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD4uIgorICAgICAgICAgICAgICAgICAiYWRkKHZhbHVlOiAka3RfdHlwZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJGt0X2RzbF9idWlsZGVyJC4keyRhZGQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQodmFsdWUpXG4iCisgICAgICAgICAgICAgICAgICJ9Iik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcInBsdXNBc3NpZ24ka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICAgICAgICAgICAgIkBTdXBwcmVzcyhcIk5PVEhJTkdfVE9fSU5MSU5FXCIpXG4iCisgICAgICAgICAgICAgICAgICJpbmxpbmUgb3BlcmF0b3IgZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAgICAgICAgICAgICI8JGt0X3R5cGUkLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD4uIgorICAgICAgICAgICAgICAgICAicGx1c0Fzc2lnbih2YWx1ZTogJGt0X3R5cGUkKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGFkZCh2YWx1ZSlcbiIKKyAgICAgICAgICAgICAgICAgIn0iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX01VTFRJX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwiYWRkQWxsJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAgICAgICAgICAgICJmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAgICAgICAgICAgICJhZGRBbGwodmFsdWVzOiBrb3RsaW4uY29sbGVjdGlvbnMuSXRlcmFibGU8JGt0X3R5cGUkPikge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJCR9JCh2YWx1ZXMpXG4iCisgICAgICAgICAgICAgICAgICJ9Iik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9NVUxUSV9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIkBrb3RsaW4uanZtLkp2bU5hbWUoXCJwbHVzQXNzaWduQWxsJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAiQFN1cHByZXNzKFwiTk9USElOR19UT19JTkxJTkVcIilcbiIKKyAgICAgICJpbmxpbmUgb3BlcmF0b3IgZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAiPCRrdF90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICJwbHVzQXNzaWduKHZhbHVlczoga290bGluLmNvbGxlY3Rpb25zLkl0ZXJhYmxlPCRrdF90eXBlJD4pIHtcbiIKKyAgICAgICIgIGFkZEFsbCh2YWx1ZXMpXG4iCisgICAgICAifSIpOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfSU5ERVhFRF9TRVRURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyBmYWxzZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwic2V0JGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAib3BlcmF0b3IgZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAiPCRrdF90eXBlJCwgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICJzZXQoaW5kZXg6IGtvdGxpbi5JbnQsIHZhbHVlOiAka3RfdHlwZSQpIHtcbiIKKyAgICAgICIgICRrdF9kc2xfYnVpbGRlciQuJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKGluZGV4LCB2YWx1ZSlcbiIKKyAgICAgICJ9Iik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcImNsZWFyJGt0X2NhcGl0YWxpemVkX25hbWUkXCIpXG4iCisgICAgICAgICAgICAgICAgICJmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjwka3RfdHlwZSQsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPi4iCisgICAgICAgICAgICAgICAgICJjbGVhcigpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJGt0X2RzbF9idWlsZGVyJC4keyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpXG4iCisgICAgICAgICAgICAgICAgICJ9Iik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlRmllbGRJbmZvKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4qIG91dHB1dCkgY29uc3QgeworICBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoZGVzY3JpcHRvcl8tPm51bWJlcigpLCBvdXRwdXQpOworICBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoR2V0RXhwZXJpbWVudGFsSmF2YUZpZWxkVHlwZShkZXNjcmlwdG9yXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiXCIkbmFtZSRfXCIsXG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZW1wdHlfbGlzdCQ7XG4iKTsKK30KKworc3RkOjpzdHJpbmcgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZExpdGVHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoR2V0SmF2YVR5cGUoZGVzY3JpcHRvcl8pKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJpbWl0aXZlX2ZpZWxkX2xpdGUuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9wcmltaXRpdmVfZmllbGRfbGl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTBjZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvcHJpbWl0aXZlX2ZpZWxkX2xpdGUuaApAQCAtMCwwICsxLDE0MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX1BSSU1JVElWRV9GSUVMRF9MSVRFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9QUklNSVRJVkVfRklFTERfTElURV9IX18KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CitjbGFzcyBDb250ZXh0OyAgICAgICAgICAgIC8vIGNvbnRleHQuaAorY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7ICAvLyBuYW1lX3Jlc29sdmVyLmgKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitjbGFzcyBJbW11dGFibGVQcmltaXRpdmVGaWVsZExpdGVHZW5lcmF0b3IKKyAgICA6IHB1YmxpYyBJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRMaXRlR2VuZXJhdG9yKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKKyAgfkltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlRmllbGRJbmZvKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcmlhYmxlc187CisgIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRMaXRlR2VuZXJhdG9yKTsKK307CisKK2NsYXNzIEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yCisgICAgOiBwdWJsaWMgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRMaXRlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCk7CisgIH5JbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIEdlbmVyYXRlRmllbGRJbmZvKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcik7Cit9OworCitjbGFzcyBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcgorICAgIDogcHVibGljIEltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcigKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCk7CisgIH5SZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlRmllbGRJbmZvKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJpYWJsZXNfOworICBDb250ZXh0KiBjb250ZXh0XzsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXJfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkTGl0ZUdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9QUklNSVRJVkVfRklFTERfTElURV9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zZXJ2aWNlLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3NlcnZpY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyMDYyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zZXJ2aWNlLmNjCkBAIC0wLDAgKzEsNDc5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zZXJ2aWNlLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL25hbWVfcmVzb2x2ZXIuaD4KKworLy8gTXVzdCBiZSBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK1NlcnZpY2VHZW5lcmF0b3I6OlNlcnZpY2VHZW5lcmF0b3IoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSB7fQorCitTZXJ2aWNlR2VuZXJhdG9yOjp+U2VydmljZUdlbmVyYXRvcigpIHt9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0ltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3IoCisgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIENvbnRleHQqIGNvbnRleHQpCisgICAgOiBTZXJ2aWNlR2VuZXJhdG9yKGRlc2NyaXB0b3IpLAorICAgICAgY29udGV4dF8oY29udGV4dCksCisgICAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkge30KKworSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcjo6fkltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3IoKSB7fQorCit2b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGJvb2wgaXNfb3duX2ZpbGUgPSBJc093bkZpbGUoZGVzY3JpcHRvcl8sIC8qIGltbXV0YWJsZSA9ICovIHRydWUpOworICBXcml0ZVNlcnZpY2VEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgTWF5YmVQcmludEdlbmVyYXRlZEFubm90YXRpb24oY29udGV4dF8sIHByaW50ZXIsIGRlc2NyaXB0b3JfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW11dGFibGUgPSAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHVibGljICRzdGF0aWMkIGFic3RyYWN0IGNsYXNzICRjbGFzc25hbWUkXG4iCisgICAgICAiICAgIGltcGxlbWVudHMgY29tLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlIHtcbiIsCisgICAgICAic3RhdGljIiwgaXNfb3duX2ZpbGUgPyAiIiA6ICJzdGF0aWMiLCAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIHByaW50ZXItPlByaW50KCJwcm90ZWN0ZWQgJGNsYXNzbmFtZSQoKSB7fVxuXG4iLCAiY2xhc3NuYW1lIiwKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisKKyAgR2VuZXJhdGVJbnRlcmZhY2UocHJpbnRlcik7CisKKyAgR2VuZXJhdGVOZXdSZWZsZWN0aXZlU2VydmljZU1ldGhvZChwcmludGVyKTsKKyAgR2VuZXJhdGVOZXdSZWZsZWN0aXZlQmxvY2tpbmdTZXJ2aWNlTWV0aG9kKHByaW50ZXIpOworCisgIEdlbmVyYXRlQWJzdHJhY3RNZXRob2RzKHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGdldERlc2NyaXB0b3IoKSBhbmQgZ2V0RGVzY3JpcHRvckZvclR5cGUoKS4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHVibGljIHN0YXRpYyBmaW5hbFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLlNlcnZpY2VEZXNjcmlwdG9yXG4iCisgICAgICAiICAgIGdldERlc2NyaXB0b3IoKSB7XG4iCisgICAgICAiICByZXR1cm4gJGZpbGUkLmdldERlc2NyaXB0b3IoKS5nZXRTZXJ2aWNlcygpLmdldCgkaW5kZXgkKTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgImZpbGUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCkpLAorICAgICAgImluZGV4IiwgU3RyQ2F0KGRlc2NyaXB0b3JfLT5pbmRleCgpKSk7CisgIEdlbmVyYXRlR2V0RGVzY3JpcHRvckZvclR5cGUocHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgbW9yZSBzdHVmZi4KKyAgR2VuZXJhdGVDYWxsTWV0aG9kKHByaW50ZXIpOworICBHZW5lcmF0ZUdldFByb3RvdHlwZShSRVFVRVNULCBwcmludGVyKTsKKyAgR2VuZXJhdGVHZXRQcm90b3R5cGUoUkVTUE9OU0UsIHByaW50ZXIpOworICBHZW5lcmF0ZVN0dWIocHJpbnRlcik7CisgIEdlbmVyYXRlQmxvY2tpbmdTdHViKHByaW50ZXIpOworCisgIC8vIEFkZCBhbiBpbnNlcnRpb24gcG9pbnQuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIlxuIgorICAgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTokZnVsbF9uYW1lJClcbiIsCisgICAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOworfQorCit2b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlR2V0RGVzY3JpcHRvckZvclR5cGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHVibGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuU2VydmljZURlc2NyaXB0b3JcbiIKKyAgICAgICIgICAgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7XG4iCisgICAgICAiICByZXR1cm4gZ2V0RGVzY3JpcHRvcigpO1xuIgorICAgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJmYWNlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KCJwdWJsaWMgaW50ZXJmYWNlIEludGVyZmFjZSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIEdlbmVyYXRlQWJzdHJhY3RNZXRob2RzKHByaW50ZXIpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOworfQorCit2b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlTmV3UmVmbGVjdGl2ZVNlcnZpY2VNZXRob2QoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2UgbmV3UmVmbGVjdGl2ZVNlcnZpY2UoXG4iCisgICAgICAiICAgIGZpbmFsIEludGVyZmFjZSBpbXBsKSB7XG4iCisgICAgICAiICByZXR1cm4gbmV3ICRjbGFzc25hbWUkKCkge1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOworICAgIHByaW50ZXItPlByaW50KCJAamF2YS5sYW5nLk92ZXJyaWRlXG4iKTsKKyAgICBHZW5lcmF0ZU1ldGhvZFNpZ25hdHVyZShwcmludGVyLCBtZXRob2QsIElTX0NPTkNSRVRFKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiB7XG4iCisgICAgICAgICIgIGltcGwuJG1ldGhvZCQoY29udHJvbGxlciwgcmVxdWVzdCwgZG9uZSk7XG4iCisgICAgICAgICJ9XG5cbiIsCisgICAgICAgICJtZXRob2QiLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG1ldGhvZCkpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifTtcbiIpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOworfQorCit2b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlTmV3UmVmbGVjdGl2ZUJsb2NraW5nU2VydmljZU1ldGhvZCgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwdWJsaWMgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuQmxvY2tpbmdTZXJ2aWNlXG4iCisgICAgICAiICAgIG5ld1JlZmxlY3RpdmVCbG9ja2luZ1NlcnZpY2UoZmluYWwgQmxvY2tpbmdJbnRlcmZhY2UgaW1wbCkge1xuIgorICAgICAgIiAgcmV0dXJuIG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkJsb2NraW5nU2VydmljZSgpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgR2VuZXJhdGVHZXREZXNjcmlwdG9yRm9yVHlwZShwcmludGVyKTsKKworICBHZW5lcmF0ZUNhbGxCbG9ja2luZ01ldGhvZChwcmludGVyKTsKKyAgR2VuZXJhdGVHZXRQcm90b3R5cGUoUkVRVUVTVCwgcHJpbnRlcik7CisgIEdlbmVyYXRlR2V0UHJvdG90eXBlKFJFU1BPTlNFLCBwcmludGVyKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9O1xuIik7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVBYnN0cmFjdE1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7CisgICAgV3JpdGVNZXRob2REb2NDb21tZW50KHByaW50ZXIsIG1ldGhvZCk7CisgICAgR2VuZXJhdGVNZXRob2RTaWduYXR1cmUocHJpbnRlciwgbWV0aG9kLCBJU19BQlNUUkFDVCk7CisgICAgcHJpbnRlci0+UHJpbnQoIjtcblxuIik7CisgIH0KK30KKworc3RkOjpzdHJpbmcgSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcjo6R2V0T3V0cHV0KAorICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCkgeworICByZXR1cm4gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCkpOworfQorCit2b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlQ2FsbE1ldGhvZChpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICJcbiIKKyAgICAgICJwdWJsaWMgZmluYWwgdm9pZCBjYWxsTWV0aG9kKFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLk1ldGhvZERlc2NyaXB0b3IgbWV0aG9kLFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NvbnRyb2xsZXIgY29udHJvbGxlcixcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlIHJlcXVlc3QsXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ2FsbGJhY2s8XG4iCisgICAgICAiICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlPiBkb25lKSB7XG4iCisgICAgICAiICBpZiAobWV0aG9kLmdldFNlcnZpY2UoKSAhPSBnZXREZXNjcmlwdG9yKCkpIHtcbiIKKyAgICAgICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXG4iCisgICAgICAiICAgICAgXCJTZXJ2aWNlLmNhbGxNZXRob2QoKSBnaXZlbiBtZXRob2QgZGVzY3JpcHRvciBmb3Igd3JvbmcgXCIgK1xuIgorICAgICAgIiAgICAgIFwic2VydmljZSB0eXBlLlwiKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHN3aXRjaChtZXRob2QuZ2V0SW5kZXgoKSkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnM7CisgICAgdmFyc1siaW5kZXgiXSA9IFN0ckNhdChpKTsKKyAgICB2YXJzWyJtZXRob2QiXSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UobWV0aG9kKTsKKyAgICB2YXJzWyJpbnB1dCJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShtZXRob2QtPmlucHV0X3R5cGUoKSk7CisgICAgdmFyc1sib3V0cHV0Il0gPSBHZXRPdXRwdXQobWV0aG9kKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFycywKKyAgICAgICAgImNhc2UgJGluZGV4JDpcbiIKKyAgICAgICAgIiAgdGhpcy4kbWV0aG9kJChjb250cm9sbGVyLCAoJGlucHV0JClyZXF1ZXN0LFxuIgorICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuUnBjVXRpbC48JG91dHB1dCQ+c3BlY2lhbGl6ZUNhbGxiYWNrKFxuIgorICAgICAgICAiICAgICAgZG9uZSkpO1xuIgorICAgICAgICAiICByZXR1cm47XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICAgImRlZmF1bHQ6XG4iCisgICAgICAiICB0aHJvdyBuZXcgamF2YS5sYW5nLkFzc2VydGlvbkVycm9yKFwiQ2FuJ3QgZ2V0IGhlcmUuXCIpO1xuIik7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICB9XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVDYWxsQmxvY2tpbmdNZXRob2QoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiXG4iCisgICAgICAicHVibGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZSBjYWxsQmxvY2tpbmdNZXRob2QoXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QsXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ29udHJvbGxlciBjb250cm9sbGVyLFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2UgcmVxdWVzdClcbiIKKyAgICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuU2VydmljZUV4Y2VwdGlvbiB7XG4iCisgICAgICAiICBpZiAobWV0aG9kLmdldFNlcnZpY2UoKSAhPSBnZXREZXNjcmlwdG9yKCkpIHtcbiIKKyAgICAgICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXG4iCisgICAgICAiICAgICAgXCJTZXJ2aWNlLmNhbGxCbG9ja2luZ01ldGhvZCgpIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yIGZvciBcIiArXG4iCisgICAgICAiICAgICAgXCJ3cm9uZyBzZXJ2aWNlIHR5cGUuXCIpO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgc3dpdGNoKG1ldGhvZC5nZXRJbmRleCgpKSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJpbmRleCJdID0gU3RyQ2F0KGkpOworICAgIHZhcnNbIm1ldGhvZCJdID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShtZXRob2QpOworICAgIHZhcnNbImlucHV0Il0gPSBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKG1ldGhvZC0+aW5wdXRfdHlwZSgpKTsKKyAgICB2YXJzWyJvdXRwdXQiXSA9IEdldE91dHB1dChtZXRob2QpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICAgICAgICAgICAgImNhc2UgJGluZGV4JDpcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gaW1wbC4kbWV0aG9kJChjb250cm9sbGVyLCAoJGlucHV0JClyZXF1ZXN0KTtcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiZGVmYXVsdDpcbiIKKyAgICAgICIgIHRocm93IG5ldyBqYXZhLmxhbmcuQXNzZXJ0aW9uRXJyb3IoXCJDYW4ndCBnZXQgaGVyZS5cIik7XG4iKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKK30KKwordm9pZCBJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUdldFByb3RvdHlwZShSZXF1ZXN0T3JSZXNwb25zZSB3aGljaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLyoKKyAgICogVE9ETyhjcG92aXJrKTogVGhlIGV4Y2VwdGlvbiBtZXNzYWdlIHNheXMgIlNlcnZpY2UuZm9vIiB3aGVuIGl0IG1heSBiZQorICAgKiAiQmxvY2tpbmdTZXJ2aWNlLmZvby4iICBDb25zaWRlciBmaXhpbmcuCisgICAqLworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwdWJsaWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlXG4iCisgICAgICAiICAgIGdldCRyZXF1ZXN0X29yX3Jlc3BvbnNlJFByb3RvdHlwZShcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIG1ldGhvZCkge1xuIgorICAgICAgIiAgaWYgKG1ldGhvZC5nZXRTZXJ2aWNlKCkgIT0gZ2V0RGVzY3JpcHRvcigpKSB7XG4iCisgICAgICAiICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFxuIgorICAgICAgIiAgICAgIFwiU2VydmljZS5nZXQkcmVxdWVzdF9vcl9yZXNwb25zZSRQcm90b3R5cGUoKSBnaXZlbiBtZXRob2QgXCIgK1xuIgorICAgICAgIiAgICAgIFwiZGVzY3JpcHRvciBmb3Igd3Jvbmcgc2VydmljZSB0eXBlLlwiKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHN3aXRjaChtZXRob2QuZ2V0SW5kZXgoKSkge1xuIiwKKyAgICAgICJyZXF1ZXN0X29yX3Jlc3BvbnNlIiwgKHdoaWNoID09IFJFUVVFU1QpID8gIlJlcXVlc3QiIDogIlJlc3BvbnNlIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnM7CisgICAgdmFyc1siaW5kZXgiXSA9IFN0ckNhdChpKTsKKyAgICB2YXJzWyJ0eXBlIl0gPQorICAgICAgICAod2hpY2ggPT0gUkVRVUVTVCkKKyAgICAgICAgICAgID8gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShtZXRob2QtPmlucHV0X3R5cGUoKSkKKyAgICAgICAgICAgIDogR2V0T3V0cHV0KG1ldGhvZCk7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgICAgICAgICAgICAiY2FzZSAkaW5kZXgkOlxuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICAgImRlZmF1bHQ6XG4iCisgICAgICAiICB0aHJvdyBuZXcgamF2YS5sYW5nLkFzc2VydGlvbkVycm9yKFwiQ2FuJ3QgZ2V0IGhlcmUuXCIpO1xuIik7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICB9XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVTdHViKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgInB1YmxpYyBzdGF0aWMgU3R1YiBuZXdTdHViKFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NoYW5uZWwgY2hhbm5lbCkge1xuIgorICAgICAgIiAgcmV0dXJuIG5ldyBTdHViKGNoYW5uZWwpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIKKyAgICAgICJwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFN0dWIgZXh0ZW5kcyAkY2xhc3NuYW1lJCBpbXBsZW1lbnRzIEludGVyZmFjZSAiCisgICAgICAieyIKKyAgICAgICJcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwcml2YXRlIFN0dWIoY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNDaGFubmVsIGNoYW5uZWwpIHtcbiIKKyAgICAgICIgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgInByaXZhdGUgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNDaGFubmVsIGNoYW5uZWw7XG4iCisgICAgICAiXG4iCisgICAgICAicHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ2hhbm5lbCBnZXRDaGFubmVsKCkge1xuIgorICAgICAgIiAgcmV0dXJuIGNoYW5uZWw7XG4iCisgICAgICAifVxuIik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgR2VuZXJhdGVNZXRob2RTaWduYXR1cmUocHJpbnRlciwgbWV0aG9kLCBJU19DT05DUkVURSk7CisgICAgcHJpbnRlci0+UHJpbnQoIiB7XG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJpbmRleCJdID0gU3RyQ2F0KGkpOworICAgIHZhcnNbIm91dHB1dCJdID0gR2V0T3V0cHV0KG1ldGhvZCk7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgICAgICAgICAgICAiY2hhbm5lbC5jYWxsTWV0aG9kKFxuIgorICAgICAgICAgICAgICAgICAgICIgIGdldERlc2NyaXB0b3IoKS5nZXRNZXRob2RzKCkuZ2V0KCRpbmRleCQpLFxuIgorICAgICAgICAgICAgICAgICAgICIgIGNvbnRyb2xsZXIsXG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmVxdWVzdCxcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkb3V0cHV0JC5nZXREZWZhdWx0SW5zdGFuY2UoKSxcbiIKKyAgICAgICAgICAgICAgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY1V0aWwuZ2VuZXJhbGl6ZUNhbGxiYWNrKFxuIgorICAgICAgICAgICAgICAgICAgICIgICAgZG9uZSxcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICRvdXRwdXQkLmNsYXNzLFxuIgorICAgICAgICAgICAgICAgICAgICIgICAgJG91dHB1dCQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTtcbiIpOworCisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAifVxuIgorICAgICAgIlxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVCbG9ja2luZ1N0dWIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHVibGljIHN0YXRpYyBCbG9ja2luZ0ludGVyZmFjZSBuZXdCbG9ja2luZ1N0dWIoXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQmxvY2tpbmdScGNDaGFubmVsIGNoYW5uZWwpIHtcbiIKKyAgICAgICIgIHJldHVybiBuZXcgQmxvY2tpbmdTdHViKGNoYW5uZWwpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIpOworCisgIHByaW50ZXItPlByaW50KCJwdWJsaWMgaW50ZXJmYWNlIEJsb2NraW5nSW50ZXJmYWNlIHsiKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7CisgICAgR2VuZXJhdGVCbG9ja2luZ01ldGhvZFNpZ25hdHVyZShwcmludGVyLCBtZXRob2QpOworICAgIHByaW50ZXItPlByaW50KCI7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAifVxuIgorICAgICAgIlxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQmxvY2tpbmdTdHViIGltcGxlbWVudHMgQmxvY2tpbmdJbnRlcmZhY2UgIgorICAgICAgIntcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwcml2YXRlIEJsb2NraW5nU3R1Yihjb20uZ29vZ2xlLnByb3RvYnVmLkJsb2NraW5nUnBjQ2hhbm5lbCBjaGFubmVsKSB7XG4iCisgICAgICAiICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIKKyAgICAgICJwcml2YXRlIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuQmxvY2tpbmdScGNDaGFubmVsIGNoYW5uZWw7XG4iKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBHZW5lcmF0ZUJsb2NraW5nTWV0aG9kU2lnbmF0dXJlKHByaW50ZXIsIG1ldGhvZCk7CisgICAgcHJpbnRlci0+UHJpbnQoIiB7XG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJpbmRleCJdID0gU3RyQ2F0KGkpOworICAgIHZhcnNbIm91dHB1dCJdID0gR2V0T3V0cHV0KG1ldGhvZCk7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgICAgICAgICAgICAicmV0dXJuICgkb3V0cHV0JCkgY2hhbm5lbC5jYWxsQmxvY2tpbmdNZXRob2QoXG4iCisgICAgICAgICAgICAgICAgICAgIiAgZ2V0RGVzY3JpcHRvcigpLmdldE1ldGhvZHMoKS5nZXQoJGluZGV4JCksXG4iCisgICAgICAgICAgICAgICAgICAgIiAgY29udHJvbGxlcixcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXF1ZXN0LFxuIgorICAgICAgICAgICAgICAgICAgICIgICRvdXRwdXQkLmdldERlZmF1bHRJbnN0YW5jZSgpKTtcbiIpOworCisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAifVxuIgorICAgICAgICAiXG4iKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlTWV0aG9kU2lnbmF0dXJlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QsCisgICAgSXNBYnN0cmFjdCBpc19hYnN0cmFjdCkgeworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnM7CisgIHZhcnNbIm5hbWUiXSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UobWV0aG9kKTsKKyAgdmFyc1siaW5wdXQiXSA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUobWV0aG9kLT5pbnB1dF90eXBlKCkpOworICB2YXJzWyJvdXRwdXQiXSA9IEdldE91dHB1dChtZXRob2QpOworICB2YXJzWyJhYnN0cmFjdCJdID0gKGlzX2Fic3RyYWN0ID09IElTX0FCU1RSQUNUKSA/ICJhYnN0cmFjdCIgOiAiIjsKKyAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgICAgICAgICAgInB1YmxpYyAkYWJzdHJhY3QkIHZvaWQgJG5hbWUkKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ29udHJvbGxlciBjb250cm9sbGVyLFxuIgorICAgICAgICAgICAgICAgICAiICAgICRpbnB1dCQgcmVxdWVzdCxcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NhbGxiYWNrPCRvdXRwdXQkPiBkb25lKSIpOworfQorCit2b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlQmxvY2tpbmdNZXRob2RTaWduYXR1cmUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCkgeworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnM7CisgIHZhcnNbIm1ldGhvZCJdID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShtZXRob2QpOworICB2YXJzWyJpbnB1dCJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShtZXRob2QtPmlucHV0X3R5cGUoKSk7CisgIHZhcnNbIm91dHB1dCJdID0gR2V0T3V0cHV0KG1ldGhvZCk7CisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgInB1YmxpYyAkb3V0cHV0JCAkbWV0aG9kJChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NvbnRyb2xsZXIgY29udHJvbGxlcixcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkaW5wdXQkIHJlcXVlc3QpXG4iCisgICAgICAgICAgICAgICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuU2VydmljZUV4Y2VwdGlvbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zZXJ2aWNlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYjkwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc2VydmljZS5oCkBAIC0wLDAgKzEsMTM5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfU0VSVklDRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfU0VSVklDRV9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworY2xhc3MgQ29udGV4dDsgICAgICAgICAgICAvLyBjb250ZXh0LmgKK2NsYXNzIENsYXNzTmFtZVJlc29sdmVyOyAgLy8gbmFtZV9yZXNvbHZlci5oCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCituYW1lc3BhY2UgaW8geworY2xhc3MgUHJpbnRlcjsgIC8vIHByaW50ZXIuaAorfQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK2NsYXNzIFNlcnZpY2VHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgU2VydmljZUdlbmVyYXRvcihjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIHZpcnR1YWwgflNlcnZpY2VHZW5lcmF0b3IoKTsKKworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKKworICBlbnVtIFJlcXVlc3RPclJlc3BvbnNlIHsgUkVRVUVTVCwgUkVTUE9OU0UgfTsKKyAgZW51bSBJc0Fic3RyYWN0IHsgSVNfQUJTVFJBQ1QsIElTX0NPTkNSRVRFIH07CisKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZXJ2aWNlR2VuZXJhdG9yKTsKK307CisKK2NsYXNzIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3IgOiBwdWJsaWMgU2VydmljZUdlbmVyYXRvciB7CisgcHVibGljOgorICBJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpOworICB+SW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgLy8gR2VuZXJhdGUgdGhlIGdldERlc2NyaXB0b3JGb3JUeXBlKCkgbWV0aG9kLgorICB2b2lkIEdlbmVyYXRlR2V0RGVzY3JpcHRvckZvclR5cGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGEgSmF2YSBpbnRlcmZhY2UgZm9yIHRoZSBzZXJ2aWNlLgorICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBuZXdSZWZsZWN0aXZlU2VydmljZSgpIG1ldGhvZC4KKyAgdm9pZCBHZW5lcmF0ZU5ld1JlZmxlY3RpdmVTZXJ2aWNlTWV0aG9kKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBuZXdSZWZsZWN0aXZlQmxvY2tpbmdTZXJ2aWNlKCkgbWV0aG9kLgorICB2b2lkIEdlbmVyYXRlTmV3UmVmbGVjdGl2ZUJsb2NraW5nU2VydmljZU1ldGhvZChpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgYWJzdHJhY3QgbWV0aG9kIGRlY2xhcmF0aW9ucyBmb3IgYWxsIG1ldGhvZHMuCisgIHZvaWQgR2VuZXJhdGVBYnN0cmFjdE1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBTZXJ2aWNlLmNhbGxNZXRob2QoKS4KKyAgdm9pZCBHZW5lcmF0ZUNhbGxNZXRob2QoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBCbG9ja2luZ1NlcnZpY2UuY2FsbEJsb2NraW5nTWV0aG9kKCkuCisgIHZvaWQgR2VuZXJhdGVDYWxsQmxvY2tpbmdNZXRob2QoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgU2VydmljZS5nZXR7UmVxdWVzdCxSZXNwb25zZX1Qcm90b3R5cGUoKS4KKyAgdm9pZCBHZW5lcmF0ZUdldFByb3RvdHlwZShSZXF1ZXN0T3JSZXNwb25zZSB3aGljaCwgaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGEgc3R1YiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VydmljZS4KKyAgdm9pZCBHZW5lcmF0ZVN0dWIoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGEgbWV0aG9kIHNpZ25hdHVyZSwgcG9zc2libHkgYWJzdHJhY3QsIHdpdGhvdXQgYm9keSBvciB0cmFpbGluZworICAvLyBzZW1pY29sb24uCisgIHZvaWQgR2VuZXJhdGVNZXRob2RTaWduYXR1cmUoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzQWJzdHJhY3QgaXNfYWJzdHJhY3QpOworCisgIC8vIEdlbmVyYXRlIGEgYmxvY2tpbmcgc3R1YiBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlLgorICB2b2lkIEdlbmVyYXRlQmxvY2tpbmdTdHViKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgbWV0aG9kIHNpZ25hdHVyZSBmb3Igb25lIG1ldGhvZCBvZiBhIGJsb2NraW5nIHN0dWIuCisgIHZvaWQgR2VuZXJhdGVCbG9ja2luZ01ldGhvZFNpZ25hdHVyZShpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCk7CisKKyAgLy8gUmV0dXJuIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgbWV0aG9kLgorICBzdGQ6OnN0cmluZyBHZXRPdXRwdXQoY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKTsKKworICBDb250ZXh0KiBjb250ZXh0XzsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXJfOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBORVRfUFJPVE8yX0NPTVBJTEVSX0pBVkFfU0VSVklDRV9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zaGFyZWRfY29kZV9nZW5lcmF0b3IuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc2hhcmVkX2NvZGVfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Yjk2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc2hhcmVkX2NvZGVfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTk4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiB4aWFvZmVuZ0Bnb29nbGUuY29tIChGZW5nIFhpYW8pCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zaGFyZWRfY29kZV9nZW5lcmF0b3IuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL25hbWVfcmVzb2x2ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK1NoYXJlZENvZGVHZW5lcmF0b3I6OlNoYXJlZENvZGVHZW5lcmF0b3IoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgICAgOiBuYW1lX3Jlc29sdmVyXyhuZXcgQ2xhc3NOYW1lUmVzb2x2ZXIpLCBmaWxlXyhmaWxlKSwgb3B0aW9uc18ob3B0aW9ucykge30KKworU2hhcmVkQ29kZUdlbmVyYXRvcjo6flNoYXJlZENvZGVHZW5lcmF0b3IoKSB7fQorCit2b2lkIFNoYXJlZENvZGVHZW5lcmF0b3I6OkdlbmVyYXRlKAorICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogZmlsZV9saXN0LAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogYW5ub3RhdGlvbl9maWxlX2xpc3QpIHsKKyAgc3RkOjpzdHJpbmcgamF2YV9wYWNrYWdlID0gRmlsZUphdmFQYWNrYWdlKGZpbGVfKTsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXIgPSBKYXZhUGFja2FnZVRvRGlyKGphdmFfcGFja2FnZSk7CisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBvcHRpb25zXy5lbmZvcmNlX2xpdGUpKSB7CisgICAgLy8gR2VuZXJhdGUgZGVzY3JpcHRvcnMuCisgICAgc3RkOjpzdHJpbmcgY2xhc3NuYW1lID0gbmFtZV9yZXNvbHZlcl8tPkdldERlc2NyaXB0b3JDbGFzc05hbWUoZmlsZV8pOworICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gcGFja2FnZV9kaXIgKyBjbGFzc25hbWUgKyAiLmphdmEiOworICAgIGZpbGVfbGlzdC0+cHVzaF9iYWNrKGZpbGVuYW1lKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoY29udGV4dC0+T3BlbihmaWxlbmFtZSkpOworICAgIEdlbmVyYXRlZENvZGVJbmZvIGFubm90YXRpb25zOworICAgIGlvOjpBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGFubm90YXRpb25fY29sbGVjdG9yKAorICAgICAgICAmYW5ub3RhdGlvbnMpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6UHJpbnRlcj4gcHJpbnRlcigKKyAgICAgICAgbmV3IGlvOjpQcmludGVyKG91dHB1dC5nZXQoKSwgJyQnLAorICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc18uYW5ub3RhdGVfY29kZSA/ICZhbm5vdGF0aW9uX2NvbGxlY3RvciA6IE5VTEwpKTsKKyAgICBzdGQ6OnN0cmluZyBpbmZvX3JlbGF0aXZlX3BhdGggPSBjbGFzc25hbWUgKyAiLmphdmEucGIubWV0YSI7CisgICAgc3RkOjpzdHJpbmcgaW5mb19mdWxsX3BhdGggPSBmaWxlbmFtZSArICIucGIubWV0YSI7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIVxuIgorICAgICAgICAiLy8gc291cmNlOiAkZmlsZW5hbWUkXG4iCisgICAgICAgICJcbiIsCisgICAgICAgICJmaWxlbmFtZSIsIGZpbGVfLT5uYW1lKCkpOworICAgIGlmICghamF2YV9wYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJwYWNrYWdlICRwYWNrYWdlJDtcbiIKKyAgICAgICAgICAiXG4iLAorICAgICAgICAgICJwYWNrYWdlIiwgamF2YV9wYWNrYWdlKTsKKyAgICB9CisgICAgUHJpbnRHZW5lcmF0ZWRBbm5vdGF0aW9uKHByaW50ZXIuZ2V0KCksICckJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc18uYW5ub3RhdGVfY29kZSA/IGluZm9fcmVsYXRpdmVfcGF0aCA6ICIiKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInB1YmxpYyBmaW5hbCBjbGFzcyAkY2xhc3NuYW1lJCB7XG4iCisgICAgICAgICIgIHB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvclxuIgorICAgICAgICAiICAgICAgZGVzY3JpcHRvcjtcbiIKKyAgICAgICAgIiAgc3RhdGljIHtcbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWUpOworICAgIHByaW50ZXItPkFubm90YXRlKCJjbGFzc25hbWUiLCBmaWxlXy0+bmFtZSgpKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBHZW5lcmF0ZURlc2NyaXB0b3JzKHByaW50ZXIuZ2V0KCkpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIn1cbiIpOworCisgICAgaWYgKG9wdGlvbnNfLmFubm90YXRlX2NvZGUpIHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IGluZm9fb3V0cHV0KAorICAgICAgICAgIGNvbnRleHQtPk9wZW4oaW5mb19mdWxsX3BhdGgpKTsKKyAgICAgIGFubm90YXRpb25zLlNlcmlhbGl6ZVRvWmVyb0NvcHlTdHJlYW0oaW5mb19vdXRwdXQuZ2V0KCkpOworICAgICAgYW5ub3RhdGlvbl9maWxlX2xpc3QtPnB1c2hfYmFjayhpbmZvX2Z1bGxfcGF0aCk7CisgICAgfQorCisgICAgcHJpbnRlci5yZXNldCgpOworICAgIG91dHB1dC5yZXNldCgpOworICB9Cit9CisKK3ZvaWQgU2hhcmVkQ29kZUdlbmVyYXRvcjo6R2VuZXJhdGVEZXNjcmlwdG9ycyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBFbWJlZCB0aGUgZGVzY3JpcHRvci4gIFdlIHNpbXBseSBzZXJpYWxpemUgdGhlIGVudGlyZSBGaWxlRGVzY3JpcHRvclByb3RvCisgIC8vIGFuZCBlbWJlZCBpdCBhcyBhIHN0cmluZyBsaXRlcmFsLCB3aGljaCBpcyBwYXJzZWQgYW5kIGJ1aWx0IGludG8gcmVhbAorICAvLyBkZXNjcmlwdG9ycyBhdCBpbml0aWFsaXphdGlvbiB0aW1lLiAgV2UgdW5mb3J0dW5hdGVseSBoYXZlIHRvIHB1dCBpdCBpbgorICAvLyBhIHN0cmluZyBsaXRlcmFsLCBub3QgYSBieXRlIGFycmF5LCBiZWNhdXNlIGFwcGFyZW50bHkgdXNpbmcgYSBsaXRlcmFsCisgIC8vIGJ5dGUgYXJyYXkgY2F1c2VzIHRoZSBKYXZhIGNvbXBpbGVyIHRvIGdlbmVyYXRlICppbnN0cnVjdGlvbnMqIHRvCisgIC8vIGluaXRpYWxpemUgZWFjaCBhbmQgZXZlcnkgYnl0ZSBvZiB0aGUgYXJyYXksIGUuZy4gYXMgaWYgeW91IHR5cGVkOgorICAvLyAgIGJbMF0gPSAxMjM7IGJbMV0gPSA0NTY7IGJbMl0gPSA3ODk7CisgIC8vIFRoaXMgbWFrZXMgaHVnZSBieXRlY29kZSBmaWxlcyBhbmQgY2FuIGVhc2lseSBoaXQgdGhlIGNvbXBpbGVyJ3MgaW50ZXJuYWwKKyAgLy8gY29kZSBzaXplIGxpbWl0cyAoZXJyb3IgImNvZGUgdG8gbGFyZ2UiKS4gIFN0cmluZyBsaXRlcmFscyBhcmUgYXBwYXJlbnRseQorICAvLyBlbWJlZGRlZCByYXcsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudC4KKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBmaWxlXy0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKworICBzdGQ6OnN0cmluZyBmaWxlX2RhdGE7CisgIGZpbGVfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJmZpbGVfZGF0YSk7CisKKyAgcHJpbnRlci0+UHJpbnQoImphdmEubGFuZy5TdHJpbmdbXSBkZXNjcmlwdG9yRGF0YSA9IHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICAvLyBMaW1pdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBsaW5lLgorICBzdGF0aWMgY29uc3QgaW50IGtCeXRlc1BlckxpbmUgPSA0MDsKKyAgLy8gTGltaXQgdGhlIG51bWJlciBvZiBsaW5lcyBwZXIgc3RyaW5nIHBhcnQuCisgIHN0YXRpYyBjb25zdCBpbnQga0xpbmVzUGVyUGFydCA9IDQwMDsKKyAgLy8gRXZlcnkgYmxvY2sgb2YgYnl0ZXMsIHN0YXJ0IGEgbmV3IHN0cmluZyBsaXRlcmFsLCBpbiBvcmRlciB0byBhdm9pZCB0aGUKKyAgLy8gNjRrIGxlbmd0aCBsaW1pdC4gTm90ZSB0aGF0IHRoaXMgdmFsdWUgbmVlZHMgdG8gYmUgPDY0ay4KKyAgc3RhdGljIGNvbnN0IGludCBrQnl0ZXNQZXJQYXJ0ID0ga0J5dGVzUGVyTGluZSAqIGtMaW5lc1BlclBhcnQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV9kYXRhLnNpemUoKTsgaSArPSBrQnl0ZXNQZXJMaW5lKSB7CisgICAgaWYgKGkgPiAwKSB7CisgICAgICBpZiAoaSAlIGtCeXRlc1BlclBhcnQgPT0gMCkgeworICAgICAgICBwcmludGVyLT5QcmludCgiLFxuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGVyLT5QcmludCgiICtcbiIpOworICAgICAgfQorICAgIH0KKyAgICBwcmludGVyLT5QcmludCgiXCIkZGF0YSRcIiIsICJkYXRhIiwKKyAgICAgICAgICAgICAgICAgICBDRXNjYXBlKGZpbGVfZGF0YS5zdWJzdHIoaSwga0J5dGVzUGVyTGluZSkpKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIlxufTtcbiIpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEZpbmQgb3V0IGFsbCBkZXBlbmRlbmNpZXMuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ID4gZGVwZW5kZW5jaWVzOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gZmlsZV8tPmRlcGVuZGVuY3koaSktPm5hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBwYWNrYWdlID0gRmlsZUphdmFQYWNrYWdlKGZpbGVfLT5kZXBlbmRlbmN5KGkpKTsKKyAgICBzdGQ6OnN0cmluZyBjbGFzc25hbWUgPQorICAgICAgICBuYW1lX3Jlc29sdmVyXy0+R2V0RGVzY3JpcHRvckNsYXNzTmFtZShmaWxlXy0+ZGVwZW5kZW5jeShpKSk7CisgICAgc3RkOjpzdHJpbmcgZnVsbF9uYW1lOworICAgIGlmIChwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgIGZ1bGxfbmFtZSA9IGNsYXNzbmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgZnVsbF9uYW1lID0gcGFja2FnZSArICIuIiArIGNsYXNzbmFtZTsKKyAgICB9CisgICAgZGVwZW5kZW5jaWVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihmaWxlbmFtZSwgZnVsbF9uYW1lKSk7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBJbnZva2UgaW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKCkgdG8gYnVpbGQgdGhlIGZpbGUuCisgIHByaW50ZXItPlByaW50KAorICAgICAgImRlc2NyaXB0b3IgPSBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yXG4iCisgICAgICAiICAuaW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKGRlc2NyaXB0b3JEYXRhLFxuIik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIiAgICBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvcltdIHtcbiIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVwZW5kZW5jaWVzLnNpemUoKTsgaSsrKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRlcGVuZGVuY3kgPSBkZXBlbmRlbmNpZXNbaV0uc2Vjb25kOworICAgIHByaW50ZXItPlByaW50KCIgICAgICAkZGVwZW5kZW5jeSQuZ2V0RGVzY3JpcHRvcigpLFxuIiwgImRlcGVuZGVuY3kiLAorICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoIiAgICB9KTtcbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zaGFyZWRfY29kZV9nZW5lcmF0b3IuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zaGFyZWRfY29kZV9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWY2ZWIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3NoYXJlZF9jb2RlX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHhpYW9mZW5nQGdvb2dsZS5jb20gKEZlbmcgWGlhbykKKy8vCisvLyBHZW5lcmF0b3JzIHRoYXQgZ2VuZXJhdGUgc2hhcmVkIGNvZGUgYmV0d2VlbiBpbW11dGFibGUgQVBJIGFuZCBtdXRhYmxlIEFQSS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9TSEFSRURfQ09ERV9HRU5FUkFUT1JfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX1NIQVJFRF9DT0RFX0dFTkVSQVRPUl9IX18KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL29wdGlvbnMuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworY2xhc3MgRmlsZURlc2NyaXB0b3I7ICAvLyBkZXNjcmlwdG9yLmgKK25hbWVzcGFjZSBjb21waWxlciB7CitjbGFzcyBHZW5lcmF0b3JDb250ZXh0OyAgLy8gY29kZV9nZW5lcmF0b3IuaAorbmFtZXNwYWNlIGphdmEgeworY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7ICAvLyBuYW1lX3Jlc29sdmVyLmgKK30KK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorbmFtZXNwYWNlIGlvIHsKK2NsYXNzIFByaW50ZXI7ICAvLyBwcmludGVyLmgKK30KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCisvLyBBIGdlbmVyYXRvciB0aGF0IGdlbmVyYXRlcyBjb2RlIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIGltbXV0YWJsZSBBUEkKKy8vIGFuZCBtdXRhYmxlIEFQSS4gQ3VycmVudGx5IG9ubHkgZGVzY3JpcHRvcnMgYXJlIHNoYXJlZC4KK2NsYXNzIFNoYXJlZENvZGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgU2hhcmVkQ29kZUdlbmVyYXRvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisgIH5TaGFyZWRDb2RlR2VuZXJhdG9yKCk7CisKKyAgdm9pZCBHZW5lcmF0ZShHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCwKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGZpbGVfbGlzdCwKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGFubm90YXRpb25fZmlsZV9saXN0KTsKKworICB2b2lkIEdlbmVyYXRlRGVzY3JpcHRvcnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPENsYXNzTmFtZVJlc29sdmVyPiBuYW1lX3Jlc29sdmVyXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfOworICBjb25zdCBPcHRpb25zIG9wdGlvbnNfOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2hhcmVkQ29kZUdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9TSEFSRURfQ09ERV9HRU5FUkFUT1JfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc3RyaW5nX2ZpZWxkLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3N0cmluZ19maWVsZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzdhOGVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3N0cmluZ19maWVsZC5jYwpAQCAtMCwwICsxLDExNjcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyBBdXRob3I6IGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc3RyaW5nX2ZpZWxkLmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2RvY19jb21tZW50Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL25hbWVfcmVzb2x2ZXIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7Cit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcykgeworICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhkZXNjcmlwdG9yLCBpbmZvLCB2YXJpYWJsZXMpOworCisgICgqdmFyaWFibGVzKVsiZW1wdHlfbGlzdCJdID0gImNvbS5nb29nbGUucHJvdG9idWYuTGF6eVN0cmluZ0FycmF5TGlzdC5FTVBUWSI7CisKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBJbW11dGFibGVEZWZhdWx0VmFsdWUoZGVzY3JpcHRvciwgbmFtZV9yZXNvbHZlcik7CisgICgqdmFyaWFibGVzKVsiZGVmYXVsdF9pbml0Il0gPQorICAgICAgIj0gIiArIEltbXV0YWJsZURlZmF1bHRWYWx1ZShkZXNjcmlwdG9yLCBuYW1lX3Jlc29sdmVyKTsKKyAgKCp2YXJpYWJsZXMpWyJjYXBpdGFsaXplZF90eXBlIl0gPSAiU3RyaW5nIjsKKyAgKCp2YXJpYWJsZXMpWyJ0YWciXSA9CisgICAgICBTdHJDYXQoc3RhdGljX2Nhc3Q8aW50MzJfdD4oV2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yKSkpOworICAoKnZhcmlhYmxlcylbInRhZ19zaXplIl0gPSBTdHJDYXQoCisgICAgICBXaXJlRm9ybWF0OjpUYWdTaXplKGRlc2NyaXB0b3ItPm51bWJlcigpLCBHZXRUeXBlKGRlc2NyaXB0b3IpKSk7CisgICgqdmFyaWFibGVzKVsibnVsbF9jaGVjayJdID0KKyAgICAgICIgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4iCisgICAgICAiICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgorICAgICAgIiAgfVxuIjsKKyAgKCp2YXJpYWJsZXMpWyJpc1N0cmluZ0VtcHR5Il0gPSAiY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVkQ29kZVZlcnNpb25TdWZmaXgoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5pc1N0cmluZ0VtcHR5IjsKKyAgKCp2YXJpYWJsZXMpWyJ3cml0ZVN0cmluZyJdID0gImNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZWRDb2RlVmVyc2lvblN1ZmZpeCgpICsgIi53cml0ZVN0cmluZyI7CisgICgqdmFyaWFibGVzKVsiY29tcHV0ZVN0cmluZ1NpemUiXSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVkQ29kZVZlcnNpb25TdWZmaXgoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuY29tcHV0ZVN0cmluZ1NpemUiOworCisgIC8vIFRPRE8oYmlyZG8pOiBBZGQgQGRlcHJlY2F0ZWQgamF2YWRvYyB3aGVuIGdlbmVyYXRpbmcgamF2YWRvYyBpcyBzdXBwb3J0ZWQKKyAgLy8gYnkgdGhlIHByb3RvIGNvbXBpbGVyCisgICgqdmFyaWFibGVzKVsiZGVwcmVjYXRpb24iXSA9CisgICAgICBkZXNjcmlwdG9yLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpID8gIkBqYXZhLmxhbmcuRGVwcmVjYXRlZCAiIDogIiI7CisgICgqdmFyaWFibGVzKVsia3RfZGVwcmVjYXRpb24iXSA9CisgICAgICBkZXNjcmlwdG9yLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpCisgICAgICAgICAgPyAiQGtvdGxpbi5EZXByZWNhdGVkKG1lc3NhZ2UgPSBcIkZpZWxkICIgKyAoKnZhcmlhYmxlcylbIm5hbWUiXSArCisgICAgICAgICAgICAgICAgIiBpcyBkZXByZWNhdGVkXCIpICIKKyAgICAgICAgICA6ICIiOworICAoKnZhcmlhYmxlcylbIm9uX2NoYW5nZWQiXSA9ICJvbkNoYW5nZWQoKTsiOworCisgIGlmIChIYXNIYXNiaXQoZGVzY3JpcHRvcikpIHsKKyAgICAvLyBGb3Igc2luZ3VsYXIgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHRoZSBoYXNGaWVsZCBiaXQuCisgICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworICAgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKKworICAgIC8vIE5vdGUgdGhhdCB0aGVzZSBoYXZlIGEgdHJhaWxpbmcgIjsiLgorICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0KKyAgICAgICAgR2VuZXJhdGVTZXRCaXQobWVzc2FnZUJpdEluZGV4KSArICI7IjsKKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9CisgICAgICAgIEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCkgKyAiOyI7CisgICAgKCp2YXJpYWJsZXMpWyJjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9CisgICAgICAgIEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KSArICI7IjsKKworICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworICB9IGVsc2UgeworICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0gIiI7CisgICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSAiIjsKKyAgICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gIiI7CisKKyAgICAoKnZhcmlhYmxlcylbImlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSJdID0KKyAgICAgICAgIiEiICsgKCp2YXJpYWJsZXMpWyJpc1N0cmluZ0VtcHR5Il0gKyAiKCIgKyAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfKSI7CisgIH0KKworICAvLyBGb3IgcmVwZWF0ZWQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3Igd2hldGhlciB0aGUgYXJyYXkgaXMgaW1tdXRhYmxlLgorICAoKnZhcmlhYmxlcylbImdldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbImNsZWFyX211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KTsKKworICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwiXSA9CisgICAgICBHZW5lcmF0ZUdldEJpdEZyb21Mb2NhbChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsIl0gPQorICAgICAgR2VuZXJhdGVTZXRCaXRUb0xvY2FsKG1lc3NhZ2VCaXRJbmRleCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgQ29udGV4dCogY29udGV4dCkKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgeworICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZGVzY3JpcHRvciksCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXywgJnZhcmlhYmxlc18pOworfQorCitJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6fkltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKCkge30KKworaW50IEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEhhc0hhc2JpdChkZXNjcmlwdG9yXykgPyAxIDogMDsKK30KKworaW50IEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IHsKKyAgcmV0dXJuIEdldE51bUJpdHNGb3JNZXNzYWdlKCk7Cit9CisKKy8vIEEgbm90ZSBhYm91dCBob3cgc3RyaW5ncyBhcmUgaGFuZGxlZC4gVGhpcyBjb2RlIHVzZWQgdG8ganVzdCBzdG9yZSBhIFN0cmluZworLy8gaW4gdGhlIE1lc3NhZ2UuIFRoaXMgaGFkIHR3byBpc3N1ZXM6CisvLworLy8gIDEuIEl0IHdvdWxkbid0IHJvdW5kdHJpcCBieXRlIGFycmF5cyB0aGF0IHdlcmUgbm90IHZhbGlkIFVURi04IGVuY29kZWQKKy8vICAgICBzdHJpbmdzLCBidXQgcmF0aGVyIGZpZWxkcyB0aGF0IHdlcmUgcmF3IGJ5dGVzIGluY29ycmVjdGx5IG1hcmtlZAorLy8gICAgIGFzIHN0cmluZ3MgaW4gdGhlIHByb3RvIGZpbGUuIFRoaXMgaXMgY29tbW9uIGJlY2F1c2UgaW4gdGhlIHByb3RvMQorLy8gICAgIHN5bnRheCwgc3RyaW5nIHdhcyB0aGUgd2F5IHRvIGluZGljYXRlIGJ5dGVzIGFuZCBDKysgZW5naW5lZXJzIGNhbgorLy8gICAgIGVhc2lseSBtYWtlIHRoaXMgbWlzdGFrZSB3aXRob3V0IGFmZmVjdGluZyB0aGUgQysrIEFQSS4gQnkgY29udmVydGluZyB0bworLy8gICAgIHN0cmluZ3MgaW1tZWRpYXRlbHksIHNvbWUgamF2YSBjb2RlIG1pZ2h0IGNvcnJ1cHQgdGhlc2UgYnl0ZSBhcnJheXMgYXMKKy8vICAgICBpdCBwYXNzZXMgdGhyb3VnaCBhIGphdmEgc2VydmVyIGV2ZW4gaWYgdGhlIGZpZWxkIHdhcyBuZXZlciBhY2Nlc3NlZCBieQorLy8gICAgIGFwcGxpY2F0aW9uIGNvZGUuCisvLworLy8gIDIuIFRoZXJlJ3MgYSBwZXJmb3JtYW5jZSBoaXQgdG8gY29udmVydGluZyBiZXR3ZWVuIGJ5dGVzIGFuZCBzdHJpbmdzIGFuZAorLy8gICAgIGl0IG1hbnkgY2FzZXMsIHRoZSBmaWVsZCBpcyBuZXZlciBldmVuIHJlYWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNvZGUuIFRoaXMKKy8vICAgICBhdm9pZHMgdW5uZWNlc3NhcnkgY29udmVyc2lvbnMgaW4gdGhlIGNvbW1vbiB1c2UgY2FzZXMuCisvLworLy8gU28gbm93LCB0aGUgZmllbGQgZm9yIFN0cmluZyBpcyBtYWludGFpbmVkIGFzIGFuIE9iamVjdCByZWZlcmVuY2Ugd2hpY2ggY2FuCisvLyBlaXRoZXIgc3RvcmUgYSBTdHJpbmcgb3IgYSBCeXRlU3RyaW5nLiBUaGUgY29kZSB1c2VzIGFuIGluc3RhbmNlb2YgY2hlY2sKKy8vIHRvIHNlZSB3aGljaCBvbmUgaXQgaGFzIGFuZCBjb252ZXJ0cyB0byB0aGUgb3RoZXIgb25lIGlmIG5lZWRlZC4gSXQgcmVtZW1iZXJzCisvLyB0aGUgbGFzdCB2YWx1ZSByZXF1ZXN0ZWQgKGluIGEgdGhyZWFkIHNhZmUgbWFubmVyKSBhcyB0aGlzIGlzIG1vc3QgbGlrZWx5CisvLyB0aGUgb25lIG5lZWRlZCBuZXh0LiBUaGUgdGhyZWFkIHNhZmV0eSBpcyBzdWNoIHRoYXQgaWYgdHdvIHRocmVhZHMgYm90aAorLy8gY29udmVydCB0aGUgZmllbGQgYmVjYXVzZSB0aGUgY2hhbmdlcyBtYWRlIGJ5IGVhY2ggdGhyZWFkIHdlcmUgbm90IHZpc2libGUgdG8KKy8vIHRoZSBvdGhlciwgdGhleSBtYXkgY2F1c2UgYSBjb252ZXJzaW9uIHRvIGhhcHBlbiBtb3JlIHRpbWVzIHRoYW4gd291bGQKKy8vIG90aGVyd2lzZSBiZSBuZWNlc3NhcnkuIFRoaXMgd2FzIGRlZW1lZCBiZXR0ZXIgdGhhbiBhZGRpbmcgc3luY2hyb25pemF0aW9uCisvLyBvdmVyaGVhZC4gSXQgd2lsbCBub3QgY2F1c2UgYW55IGNvcnJ1cHRpb24gaXNzdWVzIG9yIGFmZmVjdCB0aGUgYmVoYXZpb3Igb2YKKy8vIHRoZSBBUEkuIFRoZSBpbnN0YW5jZW9mIGNoZWNrIGlzIGFsc28gaGlnaGx5IG9wdGltaXplZCBpbiB0aGUgSlZNIGFuZCB3ZQorLy8gZGVjaWRlZCBpdCB3YXMgYmV0dGVyIHRvIHJlZHVjZSB0aGUgbWVtb3J5IG92ZXJoZWFkIGJ5IG5vdCBoYXZpbmcgdHdvCisvLyBzZXBhcmF0ZSBmaWVsZHMgYnV0IHJhdGhlciB1c2UgZHluYW1pYyB0eXBlIGNoZWNraW5nLgorLy8KKy8vIEZvciBzaW5nbGUgZmllbGRzLCB0aGUgbG9naWMgZm9yIHRoaXMgaXMgZG9uZSBpbnNpZGUgdGhlIGdlbmVyYXRlZCBjb2RlLiBGb3IKKy8vIHJlcGVhdGVkIGZpZWxkcywgdGhlIGxvZ2ljIGlzIGRvbmUgaW4gTGF6eVN0cmluZ0FycmF5TGlzdCBhbmQKKy8vIFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0Lgordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChIYXNIYXp6ZXIoZGVzY3JpcHRvcl8pKSB7CisgICAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgSEFaWkVSKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworICB9CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEdFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kamF2YS5sYW5nLlN0cmluZyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworICBXcml0ZUZpZWxkU3RyaW5nQnl0ZXNBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEdFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCisgICAgICAgICAgICAgICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoKTtcbiIpOworfQorCit2b2lkIEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInByaXZhdGUgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCAkbmFtZSRfO1xuIik7CisgIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7CisKKyAgaWYgKEhhc0hhenplcihkZXNjcmlwdG9yXykpIHsKKyAgICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuICR7JGhhcyRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS5sYW5nLlN0cmluZyAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAiICBqYXZhLmxhbmcuT2JqZWN0IHJlZiA9ICRuYW1lJF87XG4iCisgICAgICAiICBpZiAocmVmIGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZykge1xuIgorICAgICAgIiAgICByZXR1cm4gKGphdmEubGFuZy5TdHJpbmcpIHJlZjtcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBicyA9IFxuIgorICAgICAgIiAgICAgICAgKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmO1xuIgorICAgICAgIiAgICBqYXZhLmxhbmcuU3RyaW5nIHMgPSBicy50b1N0cmluZ1V0ZjgoKTtcbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBpZiAoQ2hlY2tVdGY4KGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIgICAgJG5hbWUkXyA9IHM7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIgICAgaWYgKGJzLmlzVmFsaWRVdGY4KCkpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgJG5hbWUkXyA9IHM7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICB9XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiICAgIHJldHVybiBzO1xuIgorICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZFN0cmluZ0J5dGVzQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgamF2YS5sYW5nLk9iamVjdCByZWYgPSAkbmFtZSRfO1xuIgorICAgICAgICAgICAgICAgICAiICBpZiAocmVmIGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZykge1xuIgorICAgICAgICAgICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBiID0gXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAoamF2YS5sYW5nLlN0cmluZykgcmVmKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkbmFtZSRfID0gYjtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gYjtcbiIKKyAgICAgICAgICAgICAgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmO1xuIgorICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0ICRuYW1lJF8gJGRlZmF1bHRfaW5pdCQ7XG4iKTsKKyAgaWYgKEhhc0hhenplcihkZXNjcmlwdG9yXykpIHsKKyAgICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuICR7JGhhcyRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICIgIGphdmEubGFuZy5PYmplY3QgcmVmID0gJG5hbWUkXztcbiIKKyAgICAgICIgIGlmICghKHJlZiBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmcpKSB7XG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBicyA9XG4iCisgICAgICAiICAgICAgICAoY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nKSByZWY7XG4iCisgICAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgcyA9IGJzLnRvU3RyaW5nVXRmOCgpO1xuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiAgICAkbmFtZSRfID0gcztcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIiAgICBpZiAoYnMuaXNWYWxpZFV0ZjgoKSkge1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAkbmFtZSRfID0gcztcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIH1cbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHM7XG4iCisgICAgICAgICAgICAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIChqYXZhLmxhbmcuU3RyaW5nKSByZWY7XG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIFdyaXRlRmllbGRTdHJpbmdCeXRlc0FjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCisgICAgICAgICAgICAgICAgICIgICAgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGphdmEubGFuZy5PYmplY3QgcmVmID0gJG5hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgIiAgaWYgKHJlZiBpbnN0YW5jZW9mIFN0cmluZykge1xuIgorICAgICAgICAgICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBiID0gXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAoamF2YS5sYW5nLlN0cmluZykgcmVmKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkbmFtZSRfID0gYjtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gYjtcbiIKKyAgICAgICAgICAgICAgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmO1xuIgorICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBTRVRURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiJG51bGxfY2hlY2skIgorICAgICAgICAgICAgICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgIiAgJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBub3QgYSBzaW1wbGUgbGl0ZXJhbCBzbyB3ZSB3YW50IHRvIGF2b2lkIGV4ZWN1dGluZworICAvLyBpdCBtdWx0aXBsZSB0aW1lcy4gIEluc3RlYWQsIGdldCB0aGUgZGVmYXVsdCBvdXQgb2YgdGhlIGRlZmF1bHQgaW5zdGFuY2UuCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIgICRuYW1lJF8gPSBnZXREZWZhdWx0SW5zdGFuY2UoKS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkU3RyaW5nQnl0ZXNBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIFNFVFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskc2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMkfSQoXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyB2YWx1ZSkge1xuIgorICAgICAgIiRudWxsX2NoZWNrJCIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBpZiAoQ2hlY2tVdGY4KGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIgIGNoZWNrQnl0ZVN0cmluZ0lzVXRmOCh2YWx1ZSk7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVLb3RsaW5Ec2xNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRrdF9kZXByZWNhdGlvbiR2YXIgJGt0X25hbWUkOiBrb3RsaW4uU3RyaW5nXG4iCisgICAgICAgICAgICAgICAgICIgIEBKdm1OYW1lKFwiJHskZ2V0JGt0X2NhcGl0YWxpemVkX25hbWUkJH0kXCIpXG4iCisgICAgICAgICAgICAgICAgICIgIGdldCgpID0gJGt0X2RzbF9idWlsZGVyJC4keyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKVxuIgorICAgICAgICAgICAgICAgICAiICBASnZtTmFtZShcIiR7JHNldCRrdF9jYXBpdGFsaXplZF9uYW1lJCR9JFwiKVxuIgorICAgICAgICAgICAgICAgICAiICBzZXQodmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAka3RfZHNsX2J1aWxkZXIkLiR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JCh2YWx1ZSlcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIik7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImZ1biAkeyRjbGVhciRrdF9jYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJGt0X2RzbF9idWlsZGVyJC4keyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpXG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICBpZiAoSGFzSGF6emVyKGRlc2NyaXB0b3JfKSkgeworICAgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICJmdW4gJHskaGFzJGt0X2NhcGl0YWxpemVkX25hbWUkJH0kKCk6IGtvdGxpbi5Cb29sZWFuIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRrdF9kc2xfYnVpbGRlciQuJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKClcbiIKKyAgICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIG5vb3AgZm9yIHByaW1pdGl2ZXMKK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkbmFtZSRfID0gJGRlZmF1bHQkO1xuIgorICAgICAgICAgICAgICAgICAiJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIpOworfQorCit2b2lkIEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChIYXNIYXp6ZXIoZGVzY3JpcHRvcl8pKSB7CisgICAgLy8gQWxsb3cgYSBzbGlnaHQgYnJlYWNoIG9mIGFic3RyYWN0aW9uIGhlcmUgaW4gb3JkZXIgdG8gYXZvaWQgZm9yY2luZworICAgIC8vIGFsbCBzdHJpbmcgZmllbGRzIHRvIFN0cmluZ3Mgd2hlbiBjb3B5aW5nIGZpZWxkcyBmcm9tIGEgTWVzc2FnZS4KKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJpZiAob3RoZXIuaGFzJGNhcGl0YWxpemVkX25hbWUkKCkpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkbmFtZSRfID0gb3RoZXIuJG5hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiaWYgKCFvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5pc0VtcHR5KCkpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkbmFtZSRfID0gb3RoZXIuJG5hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGluZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKEhhc0hhenplcihkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwkKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsJDtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkXztcbiIpOworfQorCit2b2lkIEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoQ2hlY2tVdGY4KGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIiRuYW1lJF8gPSBpbnB1dC5yZWFkU3RyaW5nUmVxdWlyZVV0ZjgoKTtcbiIKKyAgICAgICAgICAgICAgICAgICAiJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICIkbmFtZSRfID0gaW5wdXQucmVhZEJ5dGVzKCk7XG4iCisgICAgICAgICAgICAgICAgICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIik7CisgIH0KK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiaWYgKCRpc19maWVsZF9wcmVzZW50X21lc3NhZ2UkKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICR3cml0ZVN0cmluZyQob3V0cHV0LCAkbnVtYmVyJCwgJG5hbWUkXyk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImlmICgkaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlJCkge1xuIgorICAgICAgICAgICAgICAgICAiICBzaXplICs9ICRjb21wdXRlU3RyaW5nU2l6ZSQoJG51bWJlciQsICRuYW1lJF8pO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRXF1YWxzQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiaWYgKCFnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKVxuIgorICAgICAgICAgICAgICAgICAiICAgIC5lcXVhbHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpKSByZXR1cm4gZmFsc2U7XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVIYXNoQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiaGFzaCA9ICgzNyAqIGhhc2gpICsgJGNvbnN0YW50X25hbWUkO1xuIik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5oYXNoQ29kZSgpO1xuIik7Cit9CisKK3N0ZDo6c3RyaW5nIEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZXRCb3hlZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiAiamF2YS5sYW5nLlN0cmluZyI7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6SW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgQ29udGV4dCogY29udGV4dCkKKyAgICA6IEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCkgeworICBjb25zdCBPbmVvZkdlbmVyYXRvckluZm8qIGluZm8gPQorICAgICAgY29udGV4dC0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfb25lb2YoKSk7CisgIFNldENvbW1vbk9uZW9mVmFyaWFibGVzKGRlc2NyaXB0b3IsIGluZm8sICZ2YXJpYWJsZXNfKTsKK30KKworSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6fkltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBHT09HTEVfRENIRUNLKEhhc0hhenplcihkZXNjcmlwdG9yXykpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuICR7JGhhcyRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEdFVFRFUik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEubGFuZy5TdHJpbmcgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgIiAgamF2YS5sYW5nLk9iamVjdCByZWYgJGRlZmF1bHRfaW5pdCQ7XG4iCisgICAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAiICAgIHJlZiA9ICRvbmVvZl9uYW1lJF87XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICBpZiAocmVmIGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZykge1xuIgorICAgICAgIiAgICByZXR1cm4gKGphdmEubGFuZy5TdHJpbmcpIHJlZjtcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBicyA9IFxuIgorICAgICAgIiAgICAgICAgKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmO1xuIgorICAgICAgIiAgICBqYXZhLmxhbmcuU3RyaW5nIHMgPSBicy50b1N0cmluZ1V0ZjgoKTtcbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBpZiAoQ2hlY2tVdGY4KGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIiAgICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICRvbmVvZl9uYW1lJF8gPSBzO1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgfVxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiICAgIGlmIChicy5pc1ZhbGlkVXRmOCgpICYmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICRvbmVvZl9uYW1lJF8gPSBzO1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgfVxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gcztcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIFdyaXRlRmllbGRTdHJpbmdCeXRlc0FjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgamF2YS5sYW5nLk9iamVjdCByZWYgJGRlZmF1bHRfaW5pdCQ7XG4iCisgICAgICAgICAgICAgICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZWYgPSAkb25lb2ZfbmFtZSRfO1xuIgorICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICIgIGlmIChyZWYgaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGIgPSBcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLmNvcHlGcm9tVXRmOChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIChqYXZhLmxhbmcuU3RyaW5nKSByZWYpO1xuIgorICAgICAgICAgICAgICAgICAiICAgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICRvbmVvZl9uYW1lJF8gPSBiO1xuIgorICAgICAgICAgICAgICAgICAiICAgIH1cbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gYjtcbiIKKyAgICAgICAgICAgICAgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmO1xuIgorICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0soSGFzSGF6emVyKGRlc2NyaXB0b3JfKSk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIEhBWlpFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gJHskaGFzJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEubGFuZy5TdHJpbmcgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgIiAgamF2YS5sYW5nLk9iamVjdCByZWYgJGRlZmF1bHRfaW5pdCQ7XG4iCisgICAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAiICAgIHJlZiA9ICRvbmVvZl9uYW1lJF87XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICBpZiAoIShyZWYgaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nKSkge1xuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYnMgPVxuIgorICAgICAgIiAgICAgICAgKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmO1xuIgorICAgICAgIiAgICBqYXZhLmxhbmcuU3RyaW5nIHMgPSBicy50b1N0cmluZ1V0ZjgoKTtcbiIKKyAgICAgICIgICAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiAgICAgICRvbmVvZl9uYW1lJF8gPSBzO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiICAgICAgaWYgKGJzLmlzVmFsaWRVdGY4KCkpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgICAkb25lb2ZfbmFtZSRfID0gcztcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgfVxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiAgICB9XG4iCisgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHM7XG4iCisgICAgICAgICAgICAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIChqYXZhLmxhbmcuU3RyaW5nKSByZWY7XG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIFdyaXRlRmllbGRTdHJpbmdCeXRlc0FjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCisgICAgICAgICAgICAgICAgICIgICAgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGphdmEubGFuZy5PYmplY3QgcmVmICRkZWZhdWx0X2luaXQkO1xuIgorICAgICAgICAgICAgICAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgcmVmID0gJG9uZW9mX25hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAiICBpZiAocmVmIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGIgPSBcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLmNvcHlGcm9tVXRmOChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIChqYXZhLmxhbmcuU3RyaW5nKSByZWYpO1xuIgorICAgICAgICAgICAgICAgICAiICAgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICRvbmVvZl9uYW1lJF8gPSBiO1xuIgorICAgICAgICAgICAgICAgICAiICAgIH1cbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gYjtcbiIKKyAgICAgICAgICAgICAgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmO1xuIgorICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBTRVRURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiJG51bGxfY2hlY2skIgorICAgICAgICAgICAgICAgICAiICAkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAgICAgICAgICAgICIgICRvbmVvZl9uYW1lJF8gPSB2YWx1ZTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIENMRUFSRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICIgICAgJGNsZWFyX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAiICAgICRvbmVvZl9uYW1lJF8gPSBudWxsO1xuIgorICAgICAgIiAgICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIFdyaXRlRmllbGRTdHJpbmdCeXRlc0FjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyR9JChcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIHZhbHVlKSB7XG4iCisgICAgICAiJG51bGxfY2hlY2skIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiAgY2hlY2tCeXRlU3RyaW5nSXNVdGY4KHZhbHVlKTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIgICRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG9uZW9mX25hbWUkXyA9IHZhbHVlO1xuIgorICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gTm8tT3A6IFN0cmluZyBmaWVsZHMgaW4gb25lb2ZzIGFyZSBjb3JyZWN0bHkgY2xlYXJlZCBieSBjbGVhcmluZyB0aGUgb25lb2YKK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIEFsbG93IGEgc2xpZ2h0IGJyZWFjaCBvZiBhYnN0cmFjdGlvbiBoZXJlIGluIG9yZGVyIHRvIGF2b2lkIGZvcmNpbmcKKyAgLy8gYWxsIHN0cmluZyBmaWVsZHMgdG8gU3RyaW5ncyB3aGVuIGNvcHlpbmcgZmllbGRzIGZyb20gYSBNZXNzYWdlLgorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAiJG9uZW9mX25hbWUkXyA9IG90aGVyLiRvbmVvZl9uYW1lJF87XG4iCisgICAgICAgICAgICAgICAgICIkb25fY2hhbmdlZCRcbiIpOworfQorCit2b2lkIEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJlc3VsdC4kb25lb2ZfbmFtZSRfID0gJG9uZW9mX25hbWUkXztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiamF2YS5sYW5nLlN0cmluZyBzID0gaW5wdXQucmVhZFN0cmluZ1JlcXVpcmVVdGY4KCk7XG4iCisgICAgICAgICAgICAgICAgICAgIiRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICAgICAgICAgICAgICAiJG9uZW9mX25hbWUkXyA9IHM7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYnMgPSBpbnB1dC5yZWFkQnl0ZXMoKTtcbiIKKyAgICAgICAgICAgICAgICAgICAiJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAgICIkb25lb2ZfbmFtZSRfID0gYnM7XG4iKTsKKyAgfQorfQorCit2b2lkIEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJHdyaXRlU3RyaW5nJChvdXRwdXQsICRudW1iZXIkLCAkb25lb2ZfbmFtZSRfKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHNpemUgKz0gJGNvbXB1dGVTdHJpbmdTaXplJCgkbnVtYmVyJCwgJG9uZW9mX25hbWUkXyk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICBDb250ZXh0KiBjb250ZXh0KQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7CisgIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLCAmdmFyaWFibGVzXyk7Cit9CisKK1JlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorICAgIH5SZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKCkge30KKworaW50IFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworICByZXR1cm4gMDsKK30KKworaW50IFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgeworICByZXR1cm4gMTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9HRVRURVIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAvLyBOT1RFOiB0aGUgc2FtZSBtZXRob2QgaW4gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGFjdHVhbGx5IHJldHVybnMKKyAgICAgIC8vIGNvbS5nb29nbGUucHJvdG9idWYuUHJvdG9jb2xTdHJpbmdMaXN0IChhIHN1YmNsYXNzIG9mIExpc3QpLiBJdCdzCisgICAgICAvLyBjaGFuZ2VkIGJldHdlZW4gcHJvdG9idWYgMi41LjAgcmVsZWFzZSBhbmQgcHJvdG9idWYgMi42LjEgcmVsZWFzZS4KKyAgICAgIC8vIFRvIHJldGFpbiBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIGJvdGggMi41LjAgYW5kIDIuNi4xIGdlbmVyYXRlZAorICAgICAgLy8gY29kZSwgd2UgbWFrZSB0aGlzIGludGVyZmFjZSBtZXRob2QgcmV0dXJuIExpc3Qgc28gYm90aCBtZXRob2RzCisgICAgICAvLyB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZXMgZXhpc3QgaW4gdGhlIGNvbXBpbGVkIGJ5dGUgY29kZS4KKyAgICAgICIkZGVwcmVjYXRpb24kamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz5cbiIKKyAgICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpO1xuIik7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfQ09VTlQpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpO1xuIik7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfSU5ERVhFRF9HRVRURVIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJGphdmEubGFuZy5TdHJpbmcgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCk7XG4iKTsKKyAgV3JpdGVGaWVsZFN0cmluZ0J5dGVzQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElTVF9JTkRFWEVEX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCisgICAgICAgICAgICAgICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoaW50IGluZGV4KTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLkxhenlTdHJpbmdMaXN0ICRuYW1lJF87XG4iKTsKKyAgUHJpbnRFeHRyYUZpZWxkSW5mbyh2YXJpYWJsZXNfLCBwcmludGVyKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9HRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlByb3RvY29sU3RyaW5nTGlzdFxuIgorICAgICAgICAgICAgICAgICAiICAgICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiAkbmFtZSRfO1xuIiAgLy8gbm90ZTogIHVubW9kaWZpYWJsZSBsaXN0CisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9DT1VOVCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCR9JCgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRfLnNpemUoKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9JTkRFWEVEX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEubGFuZy5TdHJpbmcgIgorICAgICAgICAgICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKGludCBpbmRleCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRTdHJpbmdCeXRlc0FjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RfSU5ERVhFRF9HRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyR9JChpbnQgaW5kZXgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0Qnl0ZVN0cmluZyhpbmRleCk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIE9uZSBmaWVsZCBpcyB0aGUgbGlzdCBhbmQgdGhlIGJpdCBmaWVsZCBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZQorICAvLyBsaXN0IGlzIGltbXV0YWJsZS4gSWYgaXQncyBpbW11dGFibGUsIHRoZSBpbnZhcmlhbnQgaXMgdGhhdCBpdCBtdXN0CisgIC8vIGVpdGhlciBhbiBpbnN0YW5jZSBvZiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSBvciBpdCdzIGFuIEFycmF5TGlzdAorICAvLyB3cmFwcGVkIGluIGEgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgpIHdyYXBwZXIgYW5kIG5vYm9keSBlbHNlIGhhcworICAvLyBhIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBBcnJheUxpc3QuIFRoaXMgaW52YXJpYW50IGFsbG93cyB1cyB0bworICAvLyBzaGFyZSBpbnN0YW5jZXMgb2YgbGlzdHMgYmV0d2VlbiBwcm90b2NvbCBidWZmZXJzIGF2b2lkaW5nIGV4cGVuc2l2ZQorICAvLyBtZW1vcnkgYWxsb2NhdGlvbnMuIE5vdGUsIGltbXV0YWJsZSBpcyBhIHN0cm9uZyBndWFyYW50ZWUgaGVyZSAtLSBub3QKKyAgLy8ganVzdCB0aGF0IHRoZSBsaXN0IGNhbm5vdCBiZSBtb2RpZmllZCB2aWEgdGhlIHJlZmVyZW5jZSBidXQgdGhhdCB0aGUKKyAgLy8gbGlzdCBjYW4gbmV2ZXIgYmUgbW9kaWZpZWQuCisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuTGF6eVN0cmluZ0xpc3QgJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJwcml2YXRlIHZvaWQgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCkge1xuIgorICAgICAgIiAgaWYgKCEkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkKSB7XG4iCisgICAgICAiICAgICRuYW1lJF8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5MYXp5U3RyaW5nQXJyYXlMaXN0KCRuYW1lJF8pO1xuIgorICAgICAgIiAgICAkc2V0X211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICAgIiAgIH1cbiIKKyAgICAgICJ9XG4iKTsKKworICAvLyBOb3RlOiAgV2UgcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBsaXN0IGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBjYWxsZXIKKyAgLy8gICBjb3VsZCBob2xkIG9uIHRvIHRoZSByZXR1cm5lZCBsaXN0IGFuZCBtb2RpZnkgaXQgYWZ0ZXIgdGhlIG1lc3NhZ2UKKyAgLy8gICBoYXMgYmVlbiBidWlsdCwgdGh1cyBtdXRhdGluZyB0aGUgbWVzc2FnZSB3aGljaCBpcyBzdXBwb3NlZCB0byBiZQorICAvLyAgIGltbXV0YWJsZS4KKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9HRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlByb3RvY29sU3RyaW5nTGlzdFxuIgorICAgICAgICAgICAgICAgICAiICAgICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiAkbmFtZSRfLmdldFVubW9kaWZpYWJsZVZpZXcoKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0NPVU5UKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50ICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50JH0kKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJF8uc2l6ZSgpO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0lOREVYRURfR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS5sYW5nLlN0cmluZyAiCisgICAgICAgICAgICAgICAgICIkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoaW50IGluZGV4KSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiAkbmFtZSRfLmdldChpbmRleCk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZFN0cmluZ0J5dGVzQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElTVF9JTkRFWEVEX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZ1xuIgorICAgICAgICAgICAgICAgICAiICAgICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzJH0kKGludCBpbmRleCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gJG5hbWUkXy5nZXRCeXRlU3RyaW5nKGluZGV4KTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0lOREVYRURfU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGludCBpbmRleCwgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiJG51bGxfY2hlY2skIgorICAgICAgICAgICAgICAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXy5zZXQoaW5kZXgsIHZhbHVlKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfQURERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRhZGQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiJG51bGxfY2hlY2skIgorICAgICAgICAgICAgICAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXy5hZGQodmFsdWUpO1xuIgorICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9NVUxUSV9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBqYXZhLmxhbmcuSXRlcmFibGU8amF2YS5sYW5nLlN0cmluZz4gdmFsdWVzKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkFic3RyYWN0TWVzc2FnZUxpdGUuQnVpbGRlci5hZGRBbGwoXG4iCisgICAgICAgICAgICAgICAgICIgICAgICB2YWx1ZXMsICRuYW1lJF8pO1xuIgorICAgICAgICAgICAgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgIiAgJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIKKyAgICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgV3JpdGVGaWVsZFN0cmluZ0J5dGVzQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRhZGQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyR9JChcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIHZhbHVlKSB7XG4iCisgICAgICAiJG51bGxfY2hlY2skIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiAgY2hlY2tCeXRlU3RyaW5nSXNVdGY4KHZhbHVlKTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICAkbmFtZSRfLmFkZCh2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlS290bGluRHNsTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiLyoqXG4iCisgICAgICAiICogQW4gdW5pbnN0YW50aWFibGUsIGJlaGF2aW9ybGVzcyB0eXBlIHRvIHJlcHJlc2VudCB0aGUgZmllbGQgaW5cbiIKKyAgICAgICIgKiBnZW5lcmljcy5cbiIKKyAgICAgICIgKi9cbiIKKyAgICAgICJAa290bGluLk9wdEluIgorICAgICAgIihjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Pbmx5Rm9yVXNlQnlHZW5lcmF0ZWRQcm90b0NvZGU6OmNsYXNzKVxuIgorICAgICAgImNsYXNzICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kIHByaXZhdGUgY29uc3RydWN0b3IoKSIKKyAgICAgICIgOiBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xQcm94eSgpXG4iKTsKKworICAvLyBwcm9wZXJ0eSBmb3IgTGlzdDxTdHJpbmc+CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRrdF9kZXByZWNhdGlvbiQgdmFsICRrdF9uYW1lJDogIgorICAgICAgICAgICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICAgICAgICAgICAgIjxrb3RsaW4uU3RyaW5nLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD5cbiIKKyAgICAgICAgICAgICAgICAgIiAgQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAgICAgICAgICAgICIgIGdldCgpID0gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAka3RfZHNsX2J1aWxkZXIkLiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QkfSQoKVxuIgorICAgICAgICAgICAgICAgICAiICApXG4iKTsKKworICAvLyBMaXN0PFN0cmluZz4uYWRkKFN0cmluZykKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcImFkZCRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgICAgICAgICAgICAiZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAgICAgICAgICAgICI8a290bGluLlN0cmluZywgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICAgICAgICAgICAgImFkZCh2YWx1ZToga290bGluLlN0cmluZykge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGFkZCRjYXBpdGFsaXplZF9uYW1lJCR9JCh2YWx1ZSlcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIC8vIExpc3Q8U3RyaW5nPiArPSBTdHJpbmcKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcInBsdXNBc3NpZ24ka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICAgICAgICAgICAgIkBTdXBwcmVzcyhcIk5PVEhJTkdfVE9fSU5MSU5FXCIpXG4iCisgICAgICAgICAgICAgICAgICJpbmxpbmUgb3BlcmF0b3IgZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAgICAgICAgICAgICI8a290bGluLlN0cmluZywgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICAgICAgICAgICAgInBsdXNBc3NpZ24odmFsdWU6IGtvdGxpbi5TdHJpbmcpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgYWRkKHZhbHVlKVxuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisKKyAgLy8gTGlzdDxTdHJpbmc+LmFkZEFsbChJdGVyYWJsZTxTdHJpbmc+KQorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX01VTFRJX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcImFkZEFsbCRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgImZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xMaXN0IgorICAgICAgIjxrb3RsaW4uU3RyaW5nLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD4uIgorICAgICAgImFkZEFsbCh2YWx1ZXM6IGtvdGxpbi5jb2xsZWN0aW9ucy5JdGVyYWJsZTxrb3RsaW4uU3RyaW5nPikge1xuIgorICAgICAgIiAgJGt0X2RzbF9idWlsZGVyJC4keyRhZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQkfSQodmFsdWVzKVxuIgorICAgICAgIn1cbiIpOworCisgIC8vIExpc3Q8U3RyaW5nPiArPSBJdGVyYWJsZTxTdHJpbmc+CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfTVVMVElfQURERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyBmYWxzZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwicGx1c0Fzc2lnbkFsbCRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgIkBTdXBwcmVzcyhcIk5PVEhJTkdfVE9fSU5MSU5FXCIpXG4iCisgICAgICAiaW5saW5lIG9wZXJhdG9yIGZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xMaXN0IgorICAgICAgIjxrb3RsaW4uU3RyaW5nLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD4uIgorICAgICAgInBsdXNBc3NpZ24odmFsdWVzOiBrb3RsaW4uY29sbGVjdGlvbnMuSXRlcmFibGU8a290bGluLlN0cmluZz4pIHtcbiIKKyAgICAgICIgIGFkZEFsbCh2YWx1ZXMpXG4iCisgICAgICAifVxuIik7CisKKyAgLy8gTGlzdDxTdHJpbmc+W0ludF0gPSBTdHJpbmcKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9JTkRFWEVEX1NFVFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIkBrb3RsaW4uanZtLkp2bU5hbWUoXCJzZXQka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICJvcGVyYXRvciBmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICI8a290bGluLlN0cmluZywgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICJzZXQoaW5kZXg6IGtvdGxpbi5JbnQsIHZhbHVlOiBrb3RsaW4uU3RyaW5nKSB7XG4iCisgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JChpbmRleCwgdmFsdWUpXG4iCisgICAgICAifSIpOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIENMRUFSRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyBmYWxzZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bU5hbWUoXCJjbGVhciRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgICAgICAgICAgICAiZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAgICAgICAgICAgICI8a290bGluLlN0cmluZywgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICAgICAgICAgICAgImNsZWFyKCkge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKClcbiIKKyAgICAgICAgICAgICAgICAgIn0iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKKyAgICBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBub29wIGZvciBwcmltaXRpdmVzCit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZW1wdHlfbGlzdCQ7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRuYW1lJF8gPSAkZW1wdHlfbGlzdCQ7XG4iCisgICAgICAgICAgICAgICAgICIkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU1lcmdpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRoZSBjb2RlIGJlbG93IGRvZXMgdHdvIG9wdGltaXphdGlvbnM6CisgIC8vICAgMS4gSWYgdGhlIG90aGVyIGxpc3QgaXMgZW1wdHksIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gVGhpcyBlbnN1cmVzIHdlCisgIC8vICAgICAgZG9uJ3QgYWxsb2NhdGUgYSBuZXcgYXJyYXkgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGltbXV0YWJsZSBvbmUuCisgIC8vICAgMi4gSWYgdGhlIG90aGVyIGxpc3QgaXMgbm9uLWVtcHR5IGFuZCBvdXIgY3VycmVudCBsaXN0IGlzIGVtcHR5LCB3ZSBjYW4KKyAgLy8gICAgICByZXVzZSB0aGUgb3RoZXIgbGlzdCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGltbXV0YWJsZS4KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImlmICghb3RoZXIuJG5hbWUkXy5pc0VtcHR5KCkpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaWYgKCRuYW1lJF8uaXNFbXB0eSgpKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgJG5hbWUkXyA9IG90aGVyLiRuYW1lJF87XG4iCisgICAgICAgICAgICAgICAgICIgICAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICAgICAgICAgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgICAgICAgICAgICAiICAgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICAgICRuYW1lJF8uYWRkQWxsKG90aGVyLiRuYW1lJF8pO1xuIgorICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICAgICAgICAgICAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGluZ0NvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gVGhlIGNvZGUgYmVsb3cgZW5zdXJlcyB0aGF0IHRoZSByZXN1bHQgaGFzIGFuIGltbXV0YWJsZSBsaXN0LiBJZiBvdXIKKyAgLy8gbGlzdCBpcyBpbW11dGFibGUsIHdlIGNhbiBqdXN0IHJldXNlIGl0LiBJZiBub3QsIHdlIG1ha2UgaXQgaW1tdXRhYmxlLgorCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJpZiAoJGdldF9tdXRhYmxlX2JpdF9idWlsZGVyJCkge1xuIgorICAgICAgICAgICAgICAgICAiICAkbmFtZSRfID0gJG5hbWUkXy5nZXRVbm1vZGlmaWFibGVWaWV3KCk7XG4iCisgICAgICAgICAgICAgICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkXztcbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgICAiamF2YS5sYW5nLlN0cmluZyBzID0gaW5wdXQucmVhZFN0cmluZ1JlcXVpcmVVdGY4KCk7XG4iCisgICAgICAgICAgICAgICAgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAgICIkbmFtZSRfLmFkZChzKTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBicyA9IGlucHV0LnJlYWRCeXRlcygpO1xuIgorICAgICAgICAgICAgICAgICAgICJlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgICAiJG5hbWUkXy5hZGQoYnMpO1xuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJHdyaXRlU3RyaW5nJChvdXRwdXQsICRudW1iZXIkLCAkbmFtZSRfLmdldFJhdyhpKSk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgICAiICBpbnQgZGF0YVNpemUgPSAwO1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgZGF0YVNpemUgKz0gY29tcHV0ZVN0cmluZ1NpemVOb1RhZygkbmFtZSRfLmdldFJhdyhpKSk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKworICBwcmludGVyLT5QcmludCgic2l6ZSArPSBkYXRhU2l6ZTtcbiIpOworCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJzaXplICs9ICR0YWdfc2l6ZSQgKiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkuc2l6ZSgpO1xuIik7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVFcXVhbHNDb2RlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJpZiAoIWdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKVxuIgorICAgICAgIiAgICAuZXF1YWxzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSkpIHJldHVybiBmYWxzZTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlSGFzaENvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpID4gMCkge1xuIgorICAgICAgIiAgaGFzaCA9ICgzNyAqIGhhc2gpICsgJGNvbnN0YW50X25hbWUkO1xuIgorICAgICAgIiAgaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLmhhc2hDb2RlKCk7XG4iCisgICAgICAifVxuIik7Cit9CisKK3N0ZDo6c3RyaW5nIFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJTdHJpbmciOworfQorCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zdHJpbmdfZmllbGQuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zdHJpbmdfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzJkYzVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3N0cmluZ19maWVsZC5oCkBAIC0wLDAgKzEsMTYwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gQXV0aG9yOiBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9TVFJJTkdfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX1NUUklOR19GSUVMRF9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9maWVsZC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworY2xhc3MgQ29udGV4dDsgICAgICAgICAgICAvLyBjb250ZXh0LmgKK2NsYXNzIENsYXNzTmFtZVJlc29sdmVyOyAgLy8gbmFtZV9yZXNvbHZlci5oCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworY2xhc3MgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKKyAgfkltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gaW1wbGVtZW50cyBJbW11dGFibGVGaWVsZEdlbmVyYXRvcgorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50IEdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludCBHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZSgKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlS290bGluRHNsTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjpzdHJpbmcgR2V0Qm94ZWRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyaWFibGVzXzsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXJfOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKTsKK307CisKK2NsYXNzIEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IKKyAgICA6IHB1YmxpYyBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBJbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpOworICB+SW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQnVpbGRlclBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IpOworfTsKKworY2xhc3MgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCk7CisgIH5SZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gaW1wbGVtZW50cyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50IEdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludCBHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZSgKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlS290bGluRHNsTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjpzdHJpbmcgR2V0Qm94ZWRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcmlhYmxlc187CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9TVFJJTkdfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc3RyaW5nX2ZpZWxkX2xpdGUuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvc3RyaW5nX2ZpZWxkX2xpdGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1YjIzMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zdHJpbmdfZmllbGRfbGl0ZS5jYwpAQCAtMCwwICsxLDg2NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vIEF1dGhvcjogam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zdHJpbmdfZmllbGRfbGl0ZS5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9kb2NfY29tbWVudC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lX3Jlc29sdmVyLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0OwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOworCituYW1lc3BhY2UgeworCit2b2lkIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGRHZW5lcmF0b3JJbmZvKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgdmFyaWFibGVzKTsKKworICAoKnZhcmlhYmxlcylbImVtcHR5X2xpc3QiXSA9CisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5lbXB0eVByb3RvYnVmTGlzdCgpIjsKKworICAoKnZhcmlhYmxlcylbImRlZmF1bHQiXSA9IEltbXV0YWJsZURlZmF1bHRWYWx1ZShkZXNjcmlwdG9yLCBuYW1lX3Jlc29sdmVyKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X2luaXQiXSA9CisgICAgICAiPSAiICsgSW1tdXRhYmxlRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3IsIG5hbWVfcmVzb2x2ZXIpOworICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX3R5cGUiXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgKCp2YXJpYWJsZXMpWyJ0YWciXSA9CisgICAgICBTdHJDYXQoc3RhdGljX2Nhc3Q8aW50MzJfdD4oV2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yKSkpOworICAoKnZhcmlhYmxlcylbInRhZ19zaXplIl0gPSBTdHJDYXQoCisgICAgICBXaXJlRm9ybWF0OjpUYWdTaXplKGRlc2NyaXB0b3ItPm51bWJlcigpLCBHZXRUeXBlKGRlc2NyaXB0b3IpKSk7CisgIC8vIFdlIHVzZSBgeC5nZXRDbGFzcygpYCBhcyBhIG51bGwgY2hlY2sgYmVjYXVzZSBpdCBnZW5lcmF0ZXMgbGVzcyBieXRlY29kZQorICAvLyB0aGFuIGFuIGBpZiAoeCA9PSBudWxsKSB7IHRocm93IC4uLiB9YCBzdGF0ZW1lbnQuCisgICgqdmFyaWFibGVzKVsibnVsbF9jaGVjayJdID0KKyAgICAgICIgIGphdmEubGFuZy5DbGFzczw/PiB2YWx1ZUNsYXNzID0gdmFsdWUuZ2V0Q2xhc3MoKTtcbiI7CisKKyAgLy8gVE9ETyhiaXJkbyk6IEFkZCBAZGVwcmVjYXRlZCBqYXZhZG9jIHdoZW4gZ2VuZXJhdGluZyBqYXZhZG9jIGlzIHN1cHBvcnRlZAorICAvLyBieSB0aGUgcHJvdG8gY29tcGlsZXIKKyAgKCp2YXJpYWJsZXMpWyJkZXByZWNhdGlvbiJdID0KKyAgICAgIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkICIgOiAiIjsKKyAgKCp2YXJpYWJsZXMpWyJrdF9kZXByZWNhdGlvbiJdID0KKyAgICAgIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkKKyAgICAgICAgICA/ICJAa290bGluLkRlcHJlY2F0ZWQobWVzc2FnZSA9IFwiRmllbGQgIiArICgqdmFyaWFibGVzKVsibmFtZSJdICsKKyAgICAgICAgICAgICAgICAiIGlzIGRlcHJlY2F0ZWRcIikgIgorICAgICAgICAgIDogIiI7CisgICgqdmFyaWFibGVzKVsicmVxdWlyZWQiXSA9IGRlc2NyaXB0b3ItPmlzX3JlcXVpcmVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworCisgIGlmIChIYXNIYXNiaXQoZGVzY3JpcHRvcikpIHsKKyAgICAvLyBGb3Igc2luZ3VsYXIgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHRoZSBoYXNGaWVsZCBiaXQuCisgICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworCisgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGhhdmUgYSB0cmFpbGluZyAiOyIuCisgICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPQorICAgICAgICBHZW5lcmF0ZVNldEJpdChtZXNzYWdlQml0SW5kZXgpICsgIjsiOworICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPQorICAgICAgICBHZW5lcmF0ZUNsZWFyQml0KG1lc3NhZ2VCaXRJbmRleCkgKyAiOyI7CisKKyAgICAoKnZhcmlhYmxlcylbImlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSJdID0gR2VuZXJhdGVHZXRCaXQobWVzc2FnZUJpdEluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9ICIiOworICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSAiIjsKKworICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPQorICAgICAgICAiISIgKyAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfLmlzRW1wdHkoKSI7CisgIH0KKworICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwiXSA9CisgICAgICBHZW5lcmF0ZUdldEJpdEZyb21Mb2NhbChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsIl0gPQorICAgICAgR2VuZXJhdGVTZXRCaXRUb0xvY2FsKG1lc3NhZ2VCaXRJbmRleCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcjo6SW1tdXRhYmxlU3RyaW5nRmllbGRMaXRlR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCkKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgICAgbWVzc2FnZUJpdEluZGV4XyhtZXNzYWdlQml0SW5kZXgpLAorICAgICAgbmFtZV9yZXNvbHZlcl8oY29udGV4dC0+R2V0TmFtZVJlc29sdmVyKCkpIHsKKyAgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLCAmdmFyaWFibGVzXyk7Cit9CisKK0ltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcjo6fkltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcigpIHt9CisKK2ludCBJbW11dGFibGVTdHJpbmdGaWVsZExpdGVHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworICByZXR1cm4gSGFzSGFzYml0KGRlc2NyaXB0b3JfKSA/IDEgOiAwOworfQorCisvLyBBIG5vdGUgYWJvdXQgaG93IHN0cmluZ3MgYXJlIGhhbmRsZWQuIEluIHRoZSBTUEVFRCBhbmQgQ09ERV9TSVpFIHJ1bnRpbWVzLAorLy8gc3RyaW5ncyBhcmUgbm90IHN0b3JlZCBhcyBqYXZhLmxhbmcuU3RyaW5nIGluIHRoZSBNZXNzYWdlIGJlY2F1c2Ugb2YgdHdvCisvLyBpc3N1ZXM6CisvLworLy8gIDEuIEl0IHdvdWxkbid0IHJvdW5kdHJpcCBieXRlIGFycmF5cyB0aGF0IHdlcmUgbm90IHZhbGlkIFVURi04IGVuY29kZWQKKy8vICAgICBzdHJpbmdzLCBidXQgcmF0aGVyIGZpZWxkcyB0aGF0IHdlcmUgcmF3IGJ5dGVzIGluY29ycmVjdGx5IG1hcmtlZAorLy8gICAgIGFzIHN0cmluZ3MgaW4gdGhlIHByb3RvIGZpbGUuIFRoaXMgaXMgY29tbW9uIGJlY2F1c2UgaW4gdGhlIHByb3RvMQorLy8gICAgIHN5bnRheCwgc3RyaW5nIHdhcyB0aGUgd2F5IHRvIGluZGljYXRlIGJ5dGVzIGFuZCBDKysgZW5naW5lZXJzIGNhbgorLy8gICAgIGVhc2lseSBtYWtlIHRoaXMgbWlzdGFrZSB3aXRob3V0IGFmZmVjdGluZyB0aGUgQysrIEFQSS4gQnkgY29udmVydGluZyB0bworLy8gICAgIHN0cmluZ3MgaW1tZWRpYXRlbHksIHNvbWUgamF2YSBjb2RlIG1pZ2h0IGNvcnJ1cHQgdGhlc2UgYnl0ZSBhcnJheXMgYXMKKy8vICAgICBpdCBwYXNzZXMgdGhyb3VnaCBhIGphdmEgc2VydmVyIGV2ZW4gaWYgdGhlIGZpZWxkIHdhcyBuZXZlciBhY2Nlc3NlZCBieQorLy8gICAgIGFwcGxpY2F0aW9uIGNvZGUuCisvLworLy8gIDIuIFRoZXJlJ3MgYSBwZXJmb3JtYW5jZSBoaXQgdG8gY29udmVydGluZyBiZXR3ZWVuIGJ5dGVzIGFuZCBzdHJpbmdzIGFuZAorLy8gICAgIGl0IG1hbnkgY2FzZXMsIHRoZSBmaWVsZCBpcyBuZXZlciBldmVuIHJlYWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNvZGUuIFRoaXMKKy8vICAgICBhdm9pZHMgdW5uZWNlc3NhcnkgY29udmVyc2lvbnMgaW4gdGhlIGNvbW1vbiB1c2UgY2FzZXMuCisvLworLy8gSW4gdGhlIExJVEVfUlVOVElNRSwgd2Ugc3RvcmUgc3RyaW5ncyBhcyBqYXZhLmxhbmcuU3RyaW5nIGJlY2F1c2Ugd2UgYXNzdW1lCisvLyB0aGF0IHRoZSB1c2VycyBvZiB0aGlzIHJ1bnRpbWUgYXJlIG5vdCBzdWJqZWN0IHRvIHByb3RvMSBjb25zdHJhaW50cyBhbmQgYXJlCisvLyBydW5uaW5nIGNvZGUgb24gZGV2aWNlcyB0aGF0IGFyZSB1c2VyIGZhY2luZy4gVGhhdCBpcywgdGhlIGRldmVsb3BlcnMgYXJlCisvLyBwcm9wZXJseSBpbmNlbnRpdml6ZWQgdG8gb25seSBmZXRjaCB0aGUgZGF0YSB0aGV5IG5lZWQgdG8gcmVhZCBhbmQgd2lzaCB0bworLy8gcmVkdWNlIHRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbnMgaW5jdXJyZWQgd2hlbiBydW5uaW5nIG9uIGEgdXNlcidzIGRldmljZS4KKworLy8gVE9ETyhkd2Vpcyk6IENvbnNpZGVyIGRyb3BwaW5nIGFsbCBvZiB0aGUgKkJ5dGVzKCkgbWV0aG9kcy4gVGhleSByZWFsbHkKKy8vICAgICBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IG9yIHVzZWQgb24gZGV2aWNlcy4KK3ZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKEhhc0hhenplcihkZXNjcmlwdG9yXykpIHsKKyAgICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisgIH0KKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisgIFdyaXRlRmllbGRTdHJpbmdCeXRlc0FjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcygpO1xuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInByaXZhdGUgamF2YS5sYW5nLlN0cmluZyAkbmFtZSRfO1xuIik7CisgIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7CisKKyAgaWYgKEhhc0hhenplcihkZXNjcmlwdG9yXykpIHsKKyAgICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuICR7JGhhcyRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS5sYW5nLlN0cmluZyAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZFN0cmluZ0J5dGVzQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCisgICAgICAiICAgICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzJH0kKCkge1xuIgorICAgICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoJG5hbWUkXyk7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgU0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiJG51bGxfY2hlY2skIgorICAgICAgICAgICAgICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSRcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIENMRUFSRVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2lkIGNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgICAgICAgICAgICAiICAkY2xlYXJfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJFxuIgorICAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBub3QgYSBzaW1wbGUgbGl0ZXJhbCBzbyB3ZSB3YW50IHRvCisgICAgICAgICAgICAgICAgIC8vIGF2b2lkIGV4ZWN1dGluZyBpdCBtdWx0aXBsZSB0aW1lcy4gIEluc3RlYWQsIGdldCB0aGUgZGVmYXVsdAorICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgdGhlIGRlZmF1bHQgaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgICIgICRuYW1lJF8gPSBnZXREZWZhdWx0SW5zdGFuY2UoKS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIFdyaXRlRmllbGRTdHJpbmdCeXRlc0FjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgU0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBzZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyhcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgdmFsdWUpIHtcbiIpOworICBpZiAoQ2hlY2tVdGY4KGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIgIGNoZWNrQnl0ZVN0cmluZ0lzVXRmOCh2YWx1ZSk7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiICAkbmFtZSRfID0gdmFsdWUudG9TdHJpbmdVdGY4KCk7XG4iCisgICAgICAgICAgICAgICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJFxuIgorICAgICAgICAgICAgICAgICAifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChIYXNIYXp6ZXIoZGVzY3JpcHRvcl8pKSB7CisgICAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgSEFaWkVSKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiAkeyRoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICIgIHJldHVybiBpbnN0YW5jZS5oYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIH0KKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS5sYW5nLlN0cmluZyAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gaW5zdGFuY2UuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgV3JpdGVGaWVsZFN0cmluZ0J5dGVzQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGluc3RhbmNlLmdldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKCk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBTRVRURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICBpbnN0YW5jZS5zZXQkY2FwaXRhbGl6ZWRfbmFtZSQodmFsdWUpO1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgIiAgaW5zdGFuY2UuY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIFdyaXRlRmllbGRTdHJpbmdCeXRlc0FjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRzZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyR9JChcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIHZhbHVlKSB7XG4iCisgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgIiAgaW5zdGFuY2Uuc2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXModmFsdWUpO1xuIgorICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7Cit9CisKK3ZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGt0X2RlcHJlY2F0aW9uJHZhciAka3RfbmFtZSQ6IGtvdGxpbi5TdHJpbmdcbiIKKyAgICAgICAgICAgICAgICAgIiAgQEp2bU5hbWUoXCIkeyRnZXQka3RfY2FwaXRhbGl6ZWRfbmFtZSQkfSRcIilcbiIKKyAgICAgICAgICAgICAgICAgIiAgZ2V0KCkgPSAka3RfZHNsX2J1aWxkZXIkLiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JCgpXG4iCisgICAgICAgICAgICAgICAgICIgIEBKdm1OYW1lKFwiJHskc2V0JGt0X2NhcGl0YWxpemVkX25hbWUkJH0kXCIpXG4iCisgICAgICAgICAgICAgICAgICIgIHNldCh2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiICAgICRrdF9kc2xfYnVpbGRlciQuJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKHZhbHVlKVxuIgorICAgICAgICAgICAgICAgICAiICB9XG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBDTEVBUkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiZnVuICR7JGNsZWFyJGt0X2NhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKClcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIGlmIChIYXNIYXp6ZXIoZGVzY3JpcHRvcl8pKSB7CisgICAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgSEFaWkVSKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgImZ1biAkeyRoYXMka3RfY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKToga290bGluLkJvb2xlYW4ge1xuIgorICAgICAgICAiICByZXR1cm4gJGt0X2RzbF9idWlsZGVyJC4keyRoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKVxuIgorICAgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlRmllbGRJbmZvKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4qIG91dHB1dCkgY29uc3QgeworICBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoZGVzY3JpcHRvcl8tPm51bWJlcigpLCBvdXRwdXQpOworICBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoR2V0RXhwZXJpbWVudGFsSmF2YUZpZWxkVHlwZShkZXNjcmlwdG9yXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpOworICBpZiAoSGFzSGFzYml0KGRlc2NyaXB0b3JfKSkgeworICAgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShtZXNzYWdlQml0SW5kZXhfLCBvdXRwdXQpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJcIiRuYW1lJF9cIixcbiIpOworfQorCit2b2lkIEltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKK30KKworc3RkOjpzdHJpbmcgSW1tdXRhYmxlU3RyaW5nRmllbGRMaXRlR2VuZXJhdG9yOjpHZXRCb3hlZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiAiamF2YS5sYW5nLlN0cmluZyI7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZExpdGVHZW5lcmF0b3I6OkltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRMaXRlR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCkKKyAgICA6IEltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcihkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGNvbnRleHQpIHsKKyAgY29uc3QgT25lb2ZHZW5lcmF0b3JJbmZvKiBpbmZvID0KKyAgICAgIGNvbnRleHQtPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yLT5jb250YWluaW5nX29uZW9mKCkpOworICBTZXRDb21tb25PbmVvZlZhcmlhYmxlcyhkZXNjcmlwdG9yLCBpbmZvLCAmdmFyaWFibGVzXyk7Cit9CisKK0ltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRMaXRlR2VuZXJhdG9yOjoKKyAgICB+SW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZExpdGVHZW5lcmF0b3IoKSB7fQorCit2b2lkIEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZU1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgUHJpbnRFeHRyYUZpZWxkSW5mbyh2YXJpYWJsZXNfLCBwcmludGVyKTsKKyAgR09PR0xFX0RDSEVDSyhIYXNIYXp6ZXIoZGVzY3JpcHRvcl8pKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgSEFaWkVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiAkeyRoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiAkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBHRVRURVIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS5sYW5nLlN0cmluZyAkeyRnZXQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAiICBqYXZhLmxhbmcuU3RyaW5nIHJlZiAkZGVmYXVsdF9pbml0JDtcbiIKKyAgICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICIgICAgcmVmID0gKGphdmEubGFuZy5TdHJpbmcpICRvbmVvZl9uYW1lJF87XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICByZXR1cm4gcmVmO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIFdyaXRlRmllbGRTdHJpbmdCeXRlc0FjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCisgICAgICAgICAgICAgICAgICIgICAgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGphdmEubGFuZy5TdHJpbmcgcmVmICRkZWZhdWx0X2luaXQkO1xuIgorICAgICAgICAgICAgICAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAgICAgICAgICAgICIgICAgcmVmID0gKGphdmEubGFuZy5TdHJpbmcpICRvbmVvZl9uYW1lJF87XG4iCisgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgocmVmKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIFNFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJwcml2YXRlIHZvaWQgJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiRudWxsX2NoZWNrJCIKKyAgICAgICAgICAgICAgICAgIiAgJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAiICAkb25lb2ZfbmFtZSRfID0gdmFsdWU7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJwcml2YXRlIHZvaWQgJHskY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkY2xlYXJfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAkb25lb2ZfbmFtZSRfID0gbnVsbDtcbiIKKyAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgV3JpdGVGaWVsZFN0cmluZ0J5dGVzQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBTRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2lkICR7JHNldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzJH0kKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyB2YWx1ZSkge1xuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiAgY2hlY2tCeXRlU3RyaW5nSXNVdGY4KHZhbHVlKTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIgICRvbmVvZl9uYW1lJF8gPSB2YWx1ZS50b1N0cmluZ1V0ZjgoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlRmllbGRJbmZvKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4qIG91dHB1dCkgY29uc3QgeworICBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoZGVzY3JpcHRvcl8tPm51bWJlcigpLCBvdXRwdXQpOworICBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoR2V0RXhwZXJpbWVudGFsSmF2YUZpZWxkVHlwZShkZXNjcmlwdG9yXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpOworICBXcml0ZUludFRvVXRmMTZDaGFyU2VxdWVuY2UoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfb25lb2YoKS0+aW5kZXgoKSwgb3V0cHV0KTsKK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBHT09HTEVfRENIRUNLKEhhc0hhenplcihkZXNjcmlwdG9yXykpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBIQVpaRVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuICR7JGhhcyRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGluc3RhbmNlLmhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEubGFuZy5TdHJpbmcgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgIiAgcmV0dXJuIGluc3RhbmNlLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIFdyaXRlRmllbGRTdHJpbmdCeXRlc0FjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCisgICAgICAgICAgICAgICAgICIgICAgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcygpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgU0VUVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskc2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaW5zdGFuY2Uuc2V0JGNhcGl0YWxpemVkX25hbWUkKHZhbHVlKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgQ0xFQVJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKCkge1xuIgorICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICIgIGluc3RhbmNlLmNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCisgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKworICBXcml0ZUZpZWxkU3RyaW5nQnl0ZXNBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIFNFVFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskc2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMkfSQoXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyB2YWx1ZSkge1xuIgorICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICIgIGluc3RhbmNlLnNldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKHZhbHVlKTtcbiIKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRMaXRlR2VuZXJhdG9yOjoKKyAgICBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7CisgIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZGVzY3JpcHRvciksCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXywgJnZhcmlhYmxlc18pOworfQorCitSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcjo6CisgICAgflJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRMaXRlR2VuZXJhdG9yKCkge30KKworaW50IFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRMaXRlR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz5cbiIKKyAgICAgICAgICAgICAgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCk7XG4iKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9DT1VOVCk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCk7XG4iKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9JTkRFWEVEX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kamF2YS5sYW5nLlN0cmluZyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KTtcbiIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0lOREVYRURfR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyhpbnQgaW5kZXgpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLlByb3RvYnVmTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiAiCisgICAgICAiJG5hbWUkXztcbiIpOworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+ICIKKyAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiAkbmFtZSRfO1xuIiAgLy8gbm90ZTogIHVubW9kaWZpYWJsZSBsaXN0CisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9DT1VOVCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQkfSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfSU5ERVhFRF9HRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nICIKKyAgICAgICAgICAgICAgICAgIiR7JGdldCRjYXBpdGFsaXplZF9uYW1lJCR9JChpbnQgaW5kZXgpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkU3RyaW5nQnl0ZXNBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNUX0lOREVYRURfR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCisgICAgICAgICAgICAgICAgICIgICAgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMkfSQoaW50IGluZGV4KSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcuY29weUZyb21VdGY4KFxuIgorICAgICAgICAgICAgICAgICAiICAgICAgJG5hbWUkXy5nZXQoaW5kZXgpKTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJwcml2YXRlIHZvaWQgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCkge1xuIgorICAgICAgLy8gVXNlIGEgdGVtcG9yYXJ5IHRvIGF2b2lkIGEgcmVkdW5kYW50IGlnZXQtb2JqZWN0LgorICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5Qcm90b2J1Zkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gdG1wID1cbiIKKyAgICAgICIgICAgICAkbmFtZSRfOyIKKyAgICAgICIgIGlmICghdG1wLmlzTW9kaWZpYWJsZSgpKSB7XG4iCisgICAgICAiICAgICRuYW1lJF8gPVxuIgorICAgICAgIiAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5tdXRhYmxlQ29weSh0bXApO1xuIgorICAgICAgIiAgIH1cbiIKKyAgICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0lOREVYRURfU0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgaW50IGluZGV4LCBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIkbnVsbF9jaGVjayQiCisgICAgICAgICAgICAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICAkbmFtZSRfLnNldChpbmRleCwgdmFsdWUpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfQURERVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2lkIGFkZCRjYXBpdGFsaXplZF9uYW1lJChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7XG4iCisgICAgICAgICAgICAgICAgICIkbnVsbF9jaGVjayQiCisgICAgICAgICAgICAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICAkbmFtZSRfLmFkZCh2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9NVUxUSV9BRERFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJwcml2YXRlIHZvaWQgYWRkQWxsJGNhcGl0YWxpemVkX25hbWUkKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGphdmEubGFuZy5JdGVyYWJsZTxqYXZhLmxhbmcuU3RyaW5nPiB2YWx1ZXMpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgICAgICAgICAgICAgICIgIGNvbS5nb29nbGUucHJvdG9idWYuQWJzdHJhY3RNZXNzYWdlTGl0ZS5hZGRBbGwoXG4iCisgICAgICAgICAgICAgICAgICIgICAgICB2YWx1ZXMsICRuYW1lJF8pO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIENMRUFSRVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2lkIGNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgICAgICAgICAgICAiICAkbmFtZSRfID0gJGVtcHR5X2xpc3QkO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisKKyAgV3JpdGVGaWVsZFN0cmluZ0J5dGVzQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0FEREVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgInByaXZhdGUgdm9pZCBhZGQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyhcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgdmFsdWUpIHtcbiIpOworICBpZiAoQ2hlY2tVdGY4KGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIgIGNoZWNrQnl0ZVN0cmluZ0lzVXRmOCh2YWx1ZSk7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgJG5hbWUkXy5hZGQodmFsdWUudG9TdHJpbmdVdGY4KCkpO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlQnVpbGRlck1lbWJlcnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9HRVRURVIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPlxuIgorICAgICAgICAgICAgICAgICAiICAgICR7JGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QkfSQoKSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgIGluc3RhbmNlLmdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9DT1VOVCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQkfSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gaW5zdGFuY2UuZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9JTkRFWEVEX0dFVFRFUik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEubGFuZy5TdHJpbmcgIgorICAgICAgICAgICAgICAgICAiJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkJH0kKGludCBpbmRleCkge1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gaW5zdGFuY2UuZ2V0JGNhcGl0YWxpemVkX25hbWUkKGluZGV4KTtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkU3RyaW5nQnl0ZXNBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNUX0lOREVYRURfR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCisgICAgICAgICAgICAgICAgICIgICAgJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMkfSQoaW50IGluZGV4KSB7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiBpbnN0YW5jZS5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyhpbmRleCk7XG4iCisgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoInsiLCAifSIsIGRlc2NyaXB0b3JfKTsKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9JTkRFWEVEX1NFVFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIHRydWUpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyICR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JChcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBpbnQgaW5kZXgsIGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaW5zdGFuY2Uuc2V0JGNhcGl0YWxpemVkX25hbWUkKGluZGV4LCB2YWx1ZSk7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfQURERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRhZGQkY2FwaXRhbGl6ZWRfbmFtZSQkfSQoXG4iCisgICAgICAgICAgICAgICAgICIgICAgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkge1xuIgorICAgICAgICAgICAgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgICAgICAgICAgICAiICBpbnN0YW5jZS5hZGQkY2FwaXRhbGl6ZWRfbmFtZSQodmFsdWUpO1xuIgorICAgICAgICAgICAgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICBwcmludGVyLT5Bbm5vdGF0ZSgieyIsICJ9IiwgZGVzY3JpcHRvcl8pOworICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX01VTFRJX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gdHJ1ZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgJHskYWRkQWxsJGNhcGl0YWxpemVkX25hbWUkJH0kKFxuIgorICAgICAgICAgICAgICAgICAiICAgIGphdmEubGFuZy5JdGVyYWJsZTxqYXZhLmxhbmcuU3RyaW5nPiB2YWx1ZXMpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgY29weU9uV3JpdGUoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaW5zdGFuY2UuYWRkQWxsJGNhcGl0YWxpemVkX25hbWUkKHZhbHVlcyk7XG4iCisgICAgICAgICAgICAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIENMRUFSRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRjbGVhciRjYXBpdGFsaXplZF9uYW1lJCR9JCgpIHtcbiIKKyAgICAgICIgIGNvcHlPbldyaXRlKCk7XG4iCisgICAgICAiICBpbnN0YW5jZS5jbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgorICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7CisKKyAgV3JpdGVGaWVsZFN0cmluZ0J5dGVzQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciAkeyRhZGQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyR9JChcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIHZhbHVlKSB7XG4iCisgICAgICAiICBjb3B5T25Xcml0ZSgpO1xuIgorICAgICAgIiAgaW5zdGFuY2UuYWRkJGNhcGl0YWxpemVkX25hbWUkQnl0ZXModmFsdWUpO1xuIgorICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAifVxuIik7CisgIHByaW50ZXItPkFubm90YXRlKCJ7IiwgIn0iLCBkZXNjcmlwdG9yXyk7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZExpdGVHZW5lcmF0b3I6OkdlbmVyYXRlS290bGluRHNsTWVtYmVycygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiLyoqXG4iCisgICAgICAiICogQW4gdW5pbnN0YW50aWFibGUsIGJlaGF2aW9ybGVzcyB0eXBlIHRvIHJlcHJlc2VudCB0aGUgZmllbGQgaW5cbiIKKyAgICAgICIgKiBnZW5lcmljcy5cbiIKKyAgICAgICIgKi9cbiIKKyAgICAgICJAa290bGluLk9wdEluIgorICAgICAgIihjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Pbmx5Rm9yVXNlQnlHZW5lcmF0ZWRQcm90b0NvZGU6OmNsYXNzKVxuIgorICAgICAgImNsYXNzICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kIHByaXZhdGUgY29uc3RydWN0b3IoKSIKKyAgICAgICIgOiBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xQcm94eSgpXG4iKTsKKworICAvLyBwcm9wZXJ0eSBmb3IgTGlzdDxTdHJpbmc+CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfR0VUVEVSKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRrdF9kZXByZWNhdGlvbiQgdmFsICRrdF9uYW1lJDogIgorICAgICAgImNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAiPGtvdGxpbi5TdHJpbmcsICR7JCRrdF9jYXBpdGFsaXplZF9uYW1lJFByb3h5JH0kPlxuIgorICAgICAgIkBrb3RsaW4uT3B0SW4iCisgICAgICAiKGNvbS5nb29nbGUucHJvdG9idWYua290bGluLk9ubHlGb3JVc2VCeUdlbmVyYXRlZFByb3RvQ29kZTo6Y2xhc3MpXG4iCisgICAgICAiICBnZXQoKSA9IGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QoXG4iCisgICAgICAiICAgICRrdF9kc2xfYnVpbGRlciQuJHskZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCR9JCgpXG4iCisgICAgICAiICApXG4iKTsKKworICAvLyBMaXN0PFN0cmluZz4uYWRkKFN0cmluZykKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcImFkZCRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgICAgICAgICAgICAiZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAgICAgICAgICAgICI8a290bGluLlN0cmluZywgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICAgICAgICAgICAgImFkZCh2YWx1ZToga290bGluLlN0cmluZykge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGFkZCRjYXBpdGFsaXplZF9uYW1lJCR9JCh2YWx1ZSlcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIC8vIExpc3Q8U3RyaW5nPiArPSBTdHJpbmcKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9BRERFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcInBsdXNBc3NpZ24ka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICAgICAgICAgICAgIkBTdXBwcmVzcyhcIk5PVEhJTkdfVE9fSU5MSU5FXCIpXG4iCisgICAgICAgICAgICAgICAgICJpbmxpbmUgb3BlcmF0b3IgZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAgICAgICAgICAgICI8a290bGluLlN0cmluZywgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICAgICAgICAgICAgInBsdXNBc3NpZ24odmFsdWU6IGtvdGxpbi5TdHJpbmcpIHtcbiIKKyAgICAgICAgICAgICAgICAgIiAgYWRkKHZhbHVlKVxuIgorICAgICAgICAgICAgICAgICAifVxuIik7CisKKyAgLy8gTGlzdDxTdHJpbmc+LmFkZEFsbChJdGVyYWJsZTxTdHJpbmc+KQorICBXcml0ZUZpZWxkQWNjZXNzb3JEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLCBMSVNUX01VTFRJX0FEREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1aWxkZXIgKi8gZmFsc2UpOworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiQGtvdGxpbi5qdm0uSnZtU3ludGhldGljXG4iCisgICAgICAiQGtvdGxpbi5qdm0uSnZtTmFtZShcImFkZEFsbCRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgImZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xMaXN0IgorICAgICAgIjxrb3RsaW4uU3RyaW5nLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD4uIgorICAgICAgImFkZEFsbCh2YWx1ZXM6IGtvdGxpbi5jb2xsZWN0aW9ucy5JdGVyYWJsZTxrb3RsaW4uU3RyaW5nPikge1xuIgorICAgICAgIiAgJGt0X2RzbF9idWlsZGVyJC4keyRhZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQkfSQodmFsdWVzKVxuIgorICAgICAgIn1cbiIpOworCisgIC8vIExpc3Q8U3RyaW5nPiArPSBJdGVyYWJsZTxTdHJpbmc+CisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIExJU1RfTVVMVElfQURERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyBmYWxzZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICJAa290bGluLmp2bS5Kdm1OYW1lKFwicGx1c0Fzc2lnbkFsbCRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgIkBTdXBwcmVzcyhcIk5PVEhJTkdfVE9fSU5MSU5FXCIpXG4iCisgICAgICAiaW5saW5lIG9wZXJhdG9yIGZ1biBjb20uZ29vZ2xlLnByb3RvYnVmLmtvdGxpbi5Ec2xMaXN0IgorICAgICAgIjxrb3RsaW4uU3RyaW5nLCAkeyQka3RfY2FwaXRhbGl6ZWRfbmFtZSRQcm94eSR9JD4uIgorICAgICAgInBsdXNBc3NpZ24odmFsdWVzOiBrb3RsaW4uY29sbGVjdGlvbnMuSXRlcmFibGU8a290bGluLlN0cmluZz4pIHtcbiIKKyAgICAgICIgIGFkZEFsbCh2YWx1ZXMpXG4iCisgICAgICAifVxuIik7CisKKyAgLy8gTGlzdDxTdHJpbmc+W0ludF0gPSBTdHJpbmcKKyAgV3JpdGVGaWVsZEFjY2Vzc29yRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXywgTElTVF9JTkRFWEVEX1NFVFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZGVyICovIGZhbHNlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBrb3RsaW4uanZtLkp2bVN5bnRoZXRpY1xuIgorICAgICAgIkBrb3RsaW4uanZtLkp2bU5hbWUoXCJzZXQka3RfY2FwaXRhbGl6ZWRfbmFtZSRcIilcbiIKKyAgICAgICJvcGVyYXRvciBmdW4gY29tLmdvb2dsZS5wcm90b2J1Zi5rb3RsaW4uRHNsTGlzdCIKKyAgICAgICI8a290bGluLlN0cmluZywgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICJzZXQoaW5kZXg6IGtvdGxpbi5JbnQsIHZhbHVlOiBrb3RsaW4uU3RyaW5nKSB7XG4iCisgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JHNldCRjYXBpdGFsaXplZF9uYW1lJCR9JChpbmRleCwgdmFsdWUpXG4iCisgICAgICAifSIpOworCisgIFdyaXRlRmllbGRBY2Nlc3NvckRvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8sIENMRUFSRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGRlciAqLyBmYWxzZSk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICJAa290bGluLmp2bS5Kdm1TeW50aGV0aWNcbiIKKyAgICAgICAgICAgICAgICAgIkBrb3RsaW4uanZtLkp2bU5hbWUoXCJjbGVhciRrdF9jYXBpdGFsaXplZF9uYW1lJFwiKVxuIgorICAgICAgICAgICAgICAgICAiZnVuIGNvbS5nb29nbGUucHJvdG9idWYua290bGluLkRzbExpc3QiCisgICAgICAgICAgICAgICAgICI8a290bGluLlN0cmluZywgJHskJGt0X2NhcGl0YWxpemVkX25hbWUkUHJveHkkfSQ+LiIKKyAgICAgICAgICAgICAgICAgImNsZWFyKCkge1xuIgorICAgICAgICAgICAgICAgICAiICAka3RfZHNsX2J1aWxkZXIkLiR7JGNsZWFyJGNhcGl0YWxpemVkX25hbWUkJH0kKClcbiIKKyAgICAgICAgICAgICAgICAgIn0iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGVGaWVsZEluZm8oCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCB7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShkZXNjcmlwdG9yXy0+bnVtYmVyKCksIG91dHB1dCk7CisgIFdyaXRlSW50VG9VdGYxNkNoYXJTZXF1ZW5jZShHZXRFeHBlcmltZW50YWxKYXZhRmllbGRUeXBlKGRlc2NyaXB0b3JfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJcIiRuYW1lJF9cIixcbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRMaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIpOworfQorCitzdGQ6OnN0cmluZyBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gImphdmEubGFuZy5TdHJpbmciOworfQorCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zdHJpbmdfZmllbGRfbGl0ZS5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL3N0cmluZ19maWVsZF9saXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhZDFlYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9zdHJpbmdfZmllbGRfbGl0ZS5oCkBAIC0wLDAgKzEsMTM5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gQXV0aG9yOiBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9TVFJJTkdfRklFTERfTElURV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfU1RSSU5HX0ZJRUxEX0xJVEVfSF9fCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9maWVsZC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworY2xhc3MgQ29udGV4dDsgICAgICAgICAgICAvLyBjb250ZXh0LmgKK2NsYXNzIENsYXNzTmFtZVJlc29sdmVyOyAgLy8gbmFtZV9yZXNvbHZlci5oCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworY2xhc3MgSW1tdXRhYmxlU3RyaW5nRmllbGRMaXRlR2VuZXJhdG9yIDogcHVibGljIEltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBJbW11dGFibGVTdHJpbmdGaWVsZExpdGVHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpOworICB+SW1tdXRhYmxlU3RyaW5nRmllbGRMaXRlR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gaW1wbGVtZW50cyBJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEluZm8oaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+KiBvdXRwdXQpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlS290bGluRHNsTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjpzdHJpbmcgR2V0Qm94ZWRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyaWFibGVzXzsKKyAgY29uc3QgaW50IG1lc3NhZ2VCaXRJbmRleF87CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVTdHJpbmdGaWVsZExpdGVHZW5lcmF0b3IpOworfTsKKworY2xhc3MgSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZExpdGVHZW5lcmF0b3IKKyAgICA6IHB1YmxpYyBJbW11dGFibGVTdHJpbmdGaWVsZExpdGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZExpdGVHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKKyAgfkltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRMaXRlR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEluZm8oaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+KiBvdXRwdXQpIGNvbnN0IG92ZXJyaWRlOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcik7Cit9OworCitjbGFzcyBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcgorICAgIDogcHVibGljIEltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcigKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCk7CisgIH5SZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlRmllbGRJbmZvKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90Piogb3V0cHV0KSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZW5lcmF0ZUtvdGxpbkRzbE1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJpYWJsZXNfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRMaXRlR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX1NUUklOR19GSUVMRF9MSVRFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NjA5NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uY2MKQEAgLTAsMCArMSwxMTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9rb3RsaW5fZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9waHAvcGhwX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weWlfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3IuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKK2ludCBQcm90b2J1Zk1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworCisgIENvbW1hbmRMaW5lSW50ZXJmYWNlIGNsaTsKKyAgY2xpLkFsbG93UGx1Z2lucygicHJvdG9jLSIpOworCisgIC8vIFByb3RvMiBDKysKKyAgY3BwOjpDcHBHZW5lcmF0b3IgY3BwX2dlbmVyYXRvcjsKKyAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWNwcF9vdXQiLCAiLS1jcHBfb3B0IiwgJmNwcF9nZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgQysrIGhlYWRlciBhbmQgc291cmNlLiIpOworCisjaWZkZWYgR09PR0xFX1BST1RPQlVGX1JVTlRJTUVfSU5DTFVERV9CQVNFCisgIGNwcF9nZW5lcmF0b3Iuc2V0X29wZW5zb3VyY2VfcnVudGltZSh0cnVlKTsKKyAgY3BwX2dlbmVyYXRvci5zZXRfcnVudGltZV9pbmNsdWRlX2Jhc2UoR09PR0xFX1BST1RPQlVGX1JVTlRJTUVfSU5DTFVERV9CQVNFKTsKKyNlbmRpZgorCisgIC8vIFByb3RvMiBKYXZhCisgIGphdmE6OkphdmFHZW5lcmF0b3IgamF2YV9nZW5lcmF0b3I7CisgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1qYXZhX291dCIsICItLWphdmFfb3B0IiwgJmphdmFfZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIEphdmEgc291cmNlIGZpbGUuIik7CisKKyAgLy8gUHJvdG8yIEtvdGxpbgorICBqYXZhOjpLb3RsaW5HZW5lcmF0b3Iga3RfZ2VuZXJhdG9yOworICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0ta290bGluX291dCIsICItLWtvdGxpbl9vcHQiLCAma3RfZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIEtvdGxpbiBmaWxlLiIpOworCisKKyAgLy8gUHJvdG8yIFB5dGhvbgorICBweXRob246OkdlbmVyYXRvciBweV9nZW5lcmF0b3I7CisgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1weXRob25fb3V0IiwgIi0tcHl0aG9uX29wdCIsICZweV9nZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgUHl0aG9uIHNvdXJjZSBmaWxlLiIpOworICAvLyBQeXRob24gcHlpCisgIHB5dGhvbjo6UHlpR2VuZXJhdG9yIHB5aV9nZW5lcmF0b3I7CisgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1weWlfb3V0IiwgJnB5aV9nZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgcHl0aG9uIHB5aSBzdHViLiIpOworCisgIC8vIFBIUAorICBwaHA6OkdlbmVyYXRvciBwaHBfZ2VuZXJhdG9yOworICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tcGhwX291dCIsICItLXBocF9vcHQiLCAmcGhwX2dlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBQSFAgc291cmNlIGZpbGUuIik7CisKKyAgLy8gUnVieQorICBydWJ5OjpHZW5lcmF0b3IgcmJfZ2VuZXJhdG9yOworICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tcnVieV9vdXQiLCAiLS1ydWJ5X29wdCIsICZyYl9nZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgUnVieSBzb3VyY2UgZmlsZS4iKTsKKworICAvLyBDU2hhcnAKKyAgY3NoYXJwOjpHZW5lcmF0b3IgY3NoYXJwX2dlbmVyYXRvcjsKKyAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWNzaGFycF9vdXQiLCAiLS1jc2hhcnBfb3B0IiwgJmNzaGFycF9nZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgQyMgc291cmNlIGZpbGUuIik7CisKKyAgLy8gT2JqZWN0aXZlLUMKKyAgb2JqZWN0aXZlYzo6T2JqZWN0aXZlQ0dlbmVyYXRvciBvYmpjX2dlbmVyYXRvcjsKKyAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLW9iamNfb3V0IiwgIi0tb2JqY19vcHQiLCAmb2JqY19nZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgT2JqZWN0aXZlLUMgaGVhZGVyIGFuZCBzb3VyY2UuIik7CisKKyAgcmV0dXJuIGNsaS5SdW4oYXJnYywgYXJndik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgcmV0dXJuIFBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlByb3RvYnVmTWFpbihhcmdjLCBhcmd2KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDA0NTExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzg0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaD4KKworI2lmZGVmIG1ham9yCisjdW5kZWYgbWFqb3IKKyNlbmRpZgorI2lmZGVmIG1pbm9yCisjdW5kZWYgbWlub3IKKyNlbmRpZgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCisvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBmaWxlcyBpbiBhbGxfZmlsZXMgaW4gdGhlIGZvcm0gb2YgYQorLy8gY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KK3N0ZDo6c3RyaW5nIENvbW1hU2VwYXJhdGVkTGlzdCgKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBhbGxfZmlsZXMpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5hbWVzOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFsbF9maWxlcy5zaXplKCk7IGkrKykgeworICAgIG5hbWVzLnB1c2hfYmFjayhhbGxfZmlsZXNbaV0tPm5hbWUoKSk7CisgIH0KKyAgcmV0dXJuIEpvaW4obmFtZXMsICIsIik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBrRmlyc3RJbnNlcnRpb25Qb2ludE5hbWUgPSAiZmlyc3RfbW9ja19pbnNlcnRpb25fcG9pbnQiOworc3RhdGljIGNvbnN0IGNoYXIqIGtTZWNvbmRJbnNlcnRpb25Qb2ludE5hbWUgPSAic2Vjb25kX21vY2tfaW5zZXJ0aW9uX3BvaW50IjsKK3N0YXRpYyBjb25zdCBjaGFyKiBrRmlyc3RJbnNlcnRpb25Qb2ludCA9CisgICAgIiMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpcnN0X21vY2tfaW5zZXJ0aW9uX3BvaW50KSBpcyBoZXJlXG4iOworc3RhdGljIGNvbnN0IGNoYXIqIGtTZWNvbmRJbnNlcnRpb25Qb2ludCA9CisgICAgIiAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2Vjb25kX21vY2tfaW5zZXJ0aW9uX3BvaW50KSBpcyBoZXJlXG4iOworCitNb2NrQ29kZUdlbmVyYXRvcjo6TW9ja0NvZGVHZW5lcmF0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIDogbmFtZV8obmFtZSkge30KKworTW9ja0NvZGVHZW5lcmF0b3I6On5Nb2NrQ29kZUdlbmVyYXRvcigpIHt9CisKK3VpbnQ2NF90IE1vY2tDb2RlR2VuZXJhdG9yOjpHZXRTdXBwb3J0ZWRGZWF0dXJlcygpIGNvbnN0IHsKKyAgdWludDY0X3QgYWxsX2ZlYXR1cmVzID0gQ29kZUdlbmVyYXRvcjo6RkVBVFVSRV9QUk9UTzNfT1BUSU9OQUw7CisgIHJldHVybiBhbGxfZmVhdHVyZXMgJiB+c3VwcHJlc3NlZF9mZWF0dXJlc187Cit9CisKK3ZvaWQgTW9ja0NvZGVHZW5lcmF0b3I6OlN1cHByZXNzRmVhdHVyZXModWludDY0X3QgZmVhdHVyZXMpIHsKKyAgc3VwcHJlc3NlZF9mZWF0dXJlc18gPSBmZWF0dXJlczsKK30KKwordm9pZCBNb2NrQ29kZUdlbmVyYXRvcjo6RXhwZWN0R2VuZXJhdGVkKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnNlcnRpb25zLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlyc3RfbWVzc2FnZV9uYW1lLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaXJzdF9wYXJzZWRfZmlsZV9uYW1lLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRfZGlyZWN0b3J5KSB7CisgIHN0ZDo6c3RyaW5nIGNvbnRlbnQ7CisgIEdPT0dMRV9DSEVDS19PSygKKyAgICAgIEZpbGU6OkdldENvbnRlbnRzKG91dHB1dF9kaXJlY3RvcnkgKyAiLyIgKyBHZXRPdXRwdXRGaWxlTmFtZShuYW1lLCBmaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZW50LCB0cnVlKSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzID0KKyAgICAgIFNwbGl0KGNvbnRlbnQsICJcbiIsIHRydWUpOworCisgIHdoaWxlICghbGluZXMuZW1wdHkoKSAmJiBsaW5lcy5iYWNrKCkuZW1wdHkoKSkgeworICAgIGxpbmVzLnBvcF9iYWNrKCk7CisgIH0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaW5lcy5zaXplKCk7IGkrKykgeworICAgIGxpbmVzW2ldICs9ICJcbiI7CisgIH0KKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW5zZXJ0aW9uX2xpc3Q7CisgIGlmICghaW5zZXJ0aW9ucy5lbXB0eSgpKSB7CisgICAgaW5zZXJ0aW9uX2xpc3QgPSBTcGxpdChpbnNlcnRpb25zLCAiLCIsIHRydWUpOworICB9CisKKyAgRVhQRUNUX0VRKGxpbmVzLnNpemUoKSwgMyArIGluc2VydGlvbl9saXN0LnNpemUoKSAqIDIpOworICBFWFBFQ1RfRVEoR2V0T3V0cHV0RmlsZUNvbnRlbnQobmFtZSwgcGFyYW1ldGVyLCBmaWxlLCBmaXJzdF9wYXJzZWRfZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfbWVzc2FnZV9uYW1lKSwKKyAgICAgICAgICAgIGxpbmVzWzBdKTsKKworICBFWFBFQ1RfRVEoa0ZpcnN0SW5zZXJ0aW9uUG9pbnQsIGxpbmVzWzEgKyBpbnNlcnRpb25fbGlzdC5zaXplKCldKTsKKyAgRVhQRUNUX0VRKGtTZWNvbmRJbnNlcnRpb25Qb2ludCwgbGluZXNbMiArIGluc2VydGlvbl9saXN0LnNpemUoKSAqIDJdKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluc2VydGlvbl9saXN0LnNpemUoKTsgaSsrKSB7CisgICAgRVhQRUNUX0VRKEdldE91dHB1dEZpbGVDb250ZW50KGluc2VydGlvbl9saXN0W2ldLCAiZmlyc3RfaW5zZXJ0IiwgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwgZmlyc3RfbWVzc2FnZV9uYW1lKSwKKyAgICAgICAgICAgICAgbGluZXNbMSArIGldKTsKKyAgICAvLyBTZWNvbmQgaW5zZXJ0aW9uIHBvaW50IGlzIGluZGVudGVkLCBzbyB0aGUgaW5zZXJ0ZWQgdGV4dCBzaG91bGQKKyAgICAvLyBhdXRvbWF0aWNhbGx5IGJlIGluZGVudGVkIHRvby4KKyAgICBFWFBFQ1RfRVEoIiAgIiArIEdldE91dHB1dEZpbGVDb250ZW50KGluc2VydGlvbl9saXN0W2ldLCAic2Vjb25kX2luc2VydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBmaWxlLCBmaXJzdF9tZXNzYWdlX25hbWUpLAorICAgICAgICAgICAgICBsaW5lc1syICsgaW5zZXJ0aW9uX2xpc3Quc2l6ZSgpICsgaV0pOworICB9Cit9CisKK25hbWVzcGFjZSB7Cit2b2lkIENoZWNrU2luZ2xlQW5ub3RhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uJiBhbm5vdGF0aW9uKSB7CisgIEVYUEVDVF9FUShleHBlY3RlZF9maWxlLCBhbm5vdGF0aW9uLnNvdXJjZV9maWxlKCkpOworICBBU1NFUlRfR0UoZmlsZV9jb250ZW50LnNpemUoKSwgYW5ub3RhdGlvbi5iZWdpbigpKTsKKyAgQVNTRVJUX0dFKGZpbGVfY29udGVudC5zaXplKCksIGFubm90YXRpb24uZW5kKCkpOworICBBU1NFUlRfTEUoYW5ub3RhdGlvbi5iZWdpbigpLCBhbm5vdGF0aW9uLmVuZCgpKTsKKyAgRVhQRUNUX0VRKGV4cGVjdGVkX3RleHQuc2l6ZSgpLCBhbm5vdGF0aW9uLmVuZCgpIC0gYW5ub3RhdGlvbi5iZWdpbigpKTsKKyAgRVhQRUNUX0VRKGV4cGVjdGVkX3RleHQsCisgICAgICAgICAgICBmaWxlX2NvbnRlbnQuc3Vic3RyKGFubm90YXRpb24uYmVnaW4oKSwgZXhwZWN0ZWRfdGV4dC5zaXplKCkpKTsKK30KK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKwordm9pZCBNb2NrQ29kZUdlbmVyYXRvcjo6Q2hlY2tHZW5lcmF0ZWRBbm5vdGF0aW9ucygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG91dHB1dF9kaXJlY3RvcnkpIHsKKyAgc3RkOjpzdHJpbmcgZmlsZV9jb250ZW50OworICBHT09HTEVfQ0hFQ0tfT0soCisgICAgICBGaWxlOjpHZXRDb250ZW50cyhvdXRwdXRfZGlyZWN0b3J5ICsgIi8iICsgR2V0T3V0cHV0RmlsZU5hbWUobmFtZSwgZmlsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZV9jb250ZW50LCB0cnVlKSk7CisgIHN0ZDo6c3RyaW5nIG1ldGFfY29udGVudDsKKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkdldENvbnRlbnRzKAorICAgICAgb3V0cHV0X2RpcmVjdG9yeSArICIvIiArIEdldE91dHB1dEZpbGVOYW1lKG5hbWUsIGZpbGUpICsgIi5wYi5tZXRhIiwKKyAgICAgICZtZXRhX2NvbnRlbnQsIHRydWUpKTsKKyAgR2VuZXJhdGVkQ29kZUluZm8gYW5ub3RhdGlvbnM7CisgIEdPT0dMRV9DSEVDSyhUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcobWV0YV9jb250ZW50LCAmYW5ub3RhdGlvbnMpKTsKKyAgQVNTRVJUX0VRKDcsIGFubm90YXRpb25zLmFubm90YXRpb25fc2l6ZSgpKTsKKworICBDaGVja1NpbmdsZUFubm90YXRpb24oImZpcnN0X2Fubm90YXRpb24iLCAiZmlyc3QiLCBmaWxlX2NvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5hbm5vdGF0aW9uKDApKTsKKyAgQ2hlY2tTaW5nbGVBbm5vdGF0aW9uKCJmaXJzdF9wYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X2dlbmVyYXRvcjogZmlyc3RfaW5zZXJ0LFxuIGZvby5wcm90byxcbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiTW9ja0NvZGVHZW5lcmF0b3JfQW5ub3RhdGUsXG4gZm9vLnByb3RvXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9jb250ZW50LCBhbm5vdGF0aW9ucy5hbm5vdGF0aW9uKDEpKTsKKyAgQ2hlY2tTaW5nbGVBbm5vdGF0aW9uKCJmaXJzdF9wYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X3BsdWdpbjogZmlyc3RfaW5zZXJ0LFxuIGZvby5wcm90byxcbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiTW9ja0NvZGVHZW5lcmF0b3JfQW5ub3RhdGUsXG4gZm9vLnByb3RvXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9jb250ZW50LCBhbm5vdGF0aW9ucy5hbm5vdGF0aW9uKDIpKTsKKyAgQ2hlY2tTaW5nbGVBbm5vdGF0aW9uKCJzZWNvbmRfYW5ub3RhdGlvbiIsICJzZWNvbmQiLCBmaWxlX2NvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5hbm5vdGF0aW9uKDMpKTsKKyAgLy8gVGhpcyBhbm5vdGF0ZWQgdGV4dCBoYXMgY2hhbmdlZCBiZWNhdXNlIGl0IHdhcyBpbnNlcnRlZCBhdCBhbiBpbmRlbnRlZAorICAvLyBpbnNlcnRpb24gcG9pbnQuCisgIENoZWNrU2luZ2xlQW5ub3RhdGlvbigic2Vjb25kX3BhdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RfZ2VuZXJhdG9yOiBzZWNvbmRfaW5zZXJ0LFxuICAgZm9vLnByb3RvLFxuICAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIk1vY2tDb2RlR2VuZXJhdG9yX0Fubm90YXRlLFxuICAgZm9vLnByb3RvXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9jb250ZW50LCBhbm5vdGF0aW9ucy5hbm5vdGF0aW9uKDQpKTsKKyAgQ2hlY2tTaW5nbGVBbm5vdGF0aW9uKCJzZWNvbmRfcGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF9wbHVnaW46IHNlY29uZF9pbnNlcnQsXG4gICBmb28ucHJvdG8sXG4gICAiCisgICAgICAgICAgICAgICAgICAgICAgICAiTW9ja0NvZGVHZW5lcmF0b3JfQW5ub3RhdGUsXG4gICBmb28ucHJvdG9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbnRlbnQsIGFubm90YXRpb25zLmFubm90YXRpb24oNSkpOworICBDaGVja1NpbmdsZUFubm90YXRpb24oInRoaXJkX2Fubm90YXRpb24iLCAidGhpcmQiLCBmaWxlX2NvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5hbm5vdGF0aW9uKDYpKTsKK30KKworYm9vbCBNb2NrQ29kZUdlbmVyYXRvcjo6R2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcikgY29uc3QgeworICBib29sIGFubm90YXRlID0gZmFsc2U7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGlmIChIYXNQcmVmaXhTdHJpbmcoZmlsZS0+bWVzc2FnZV90eXBlKGkpLT5uYW1lKCksICJNb2NrQ29kZUdlbmVyYXRvcl8iKSkgeworICAgICAgc3RkOjpzdHJpbmcgY29tbWFuZCA9IFN0cmlwUHJlZml4U3RyaW5nKAorICAgICAgICAgIGZpbGUtPm1lc3NhZ2VfdHlwZShpKS0+bmFtZSgpLCAiTW9ja0NvZGVHZW5lcmF0b3JfIik7CisgICAgICBpZiAoY29tbWFuZCA9PSAiRXJyb3IiKSB7CisgICAgICAgICplcnJvciA9ICJTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0Vycm9yLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSAiRXhpdCIpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0V4aXQuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGV4aXQoMTIzKTsKKyAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSAiQWJvcnQiKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9BYm9ydC4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgYWJvcnQoKTsKKyAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSAiSGFzU291cmNlQ29kZUluZm8iKSB7CisgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9kZXNjcmlwdG9yX3Byb3RvOworICAgICAgICBmaWxlLT5Db3B5U291cmNlQ29kZUluZm9UbygmZmlsZV9kZXNjcmlwdG9yX3Byb3RvKTsKKyAgICAgICAgYm9vbCBoYXNfc291cmNlX2NvZGVfaW5mbyA9CisgICAgICAgICAgICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8uaGFzX3NvdXJjZV9jb2RlX2luZm8oKSAmJgorICAgICAgICAgICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLnNvdXJjZV9jb2RlX2luZm8oKS5sb2NhdGlvbl9zaXplKCkgPiAwOworICAgICAgICBzdGQ6OmNlcnIgPDwgIlNhdyBtZXNzYWdlIHR5cGUgTW9ja0NvZGVHZW5lcmF0b3JfSGFzU291cmNlQ29kZUluZm86ICIKKyAgICAgICAgICAgICAgICAgIDw8IGhhc19zb3VyY2VfY29kZV9pbmZvIDw8ICIuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGFib3J0KCk7CisgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gIkhhc0pzb25OYW1lIikgeworICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZF9kZXNjcmlwdG9yX3Byb3RvOworICAgICAgICBmaWxlLT5tZXNzYWdlX3R5cGUoaSktPmZpZWxkKDApLT5Db3B5VG8oJmZpZWxkX2Rlc2NyaXB0b3JfcHJvdG8pOworICAgICAgICBzdGQ6OmNlcnIgPDwgIlNhdyBqc29uX25hbWU6ICIgPDwgZmllbGRfZGVzY3JpcHRvcl9wcm90by5oYXNfanNvbl9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgYWJvcnQoKTsKKyAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSAiQW5ub3RhdGUiKSB7CisgICAgICAgIGFubm90YXRlID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSAiU2hvd1ZlcnNpb25OdW1iZXIiKSB7CisgICAgICAgIFZlcnNpb24gY29tcGlsZXJfdmVyc2lvbjsKKyAgICAgICAgY29udGV4dC0+R2V0Q29tcGlsZXJWZXJzaW9uKCZjb21waWxlcl92ZXJzaW9uKTsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJTYXcgY29tcGlsZXJfdmVyc2lvbjogIgorICAgICAgICAgICAgICAgICAgPDwgY29tcGlsZXJfdmVyc2lvbi5tYWpvcigpICogMTAwMDAwMCArCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXJfdmVyc2lvbi5taW5vcigpICogMTAwMCArCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXJfdmVyc2lvbi5wYXRjaCgpCisgICAgICAgICAgICAgICAgICA8PCAiICIgPDwgY29tcGlsZXJfdmVyc2lvbi5zdWZmaXgoKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGFib3J0KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5rbm93biBNb2NrQ29kZUdlbmVyYXRvciBjb21tYW5kOiAiIDw8IGNvbW1hbmQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgYm9vbCBpbnNlcnRfZW5kbGluZXMgPSBIYXNQcmVmaXhTdHJpbmcocGFyYW1ldGVyLCAiaW5zZXJ0X2VuZGxpbmVzPSIpOworICBpZiAoaW5zZXJ0X2VuZGxpbmVzIHx8IEhhc1ByZWZpeFN0cmluZyhwYXJhbWV0ZXIsICJpbnNlcnQ9IikpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW5zZXJ0X2ludG8gPSBTcGxpdCgKKyAgICAgICAgU3RyaXBQcmVmaXhTdHJpbmcoCisgICAgICAgICAgICBwYXJhbWV0ZXIsIGluc2VydF9lbmRsaW5lcyA/ICJpbnNlcnRfZW5kbGluZXM9IiA6ICJpbnNlcnQ9IiksCisgICAgICAgICIsIiwgdHJ1ZSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluc2VydF9pbnRvLnNpemUoKTsgaSsrKSB7CisgICAgICB7CisgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvIGluZm87CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnQgPQorICAgICAgICAgICAgR2V0T3V0cHV0RmlsZUNvbnRlbnQobmFtZV8sICJmaXJzdF9pbnNlcnQiLCBmaWxlLCBjb250ZXh0KTsKKyAgICAgICAgaWYgKGluc2VydF9lbmRsaW5lcykgeworICAgICAgICAgIEdsb2JhbFJlcGxhY2VTdWJzdHJpbmcoIiwiLCAiLFxuIiwgJmNvbnRlbnQpOworICAgICAgICB9CisgICAgICAgIGlmIChhbm5vdGF0ZSkgeworICAgICAgICAgIGF1dG8qIGFubm90YXRpb24gPSBpbmZvLmFkZF9hbm5vdGF0aW9uKCk7CisgICAgICAgICAgYW5ub3RhdGlvbi0+c2V0X2JlZ2luKDApOworICAgICAgICAgIGFubm90YXRpb24tPnNldF9lbmQoY29udGVudC5zaXplKCkpOworICAgICAgICAgIGFubm90YXRpb24tPnNldF9zb3VyY2VfZmlsZSgiZmlyc3RfcGF0aCIpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgICAgICAgIGNvbnRleHQtPk9wZW5Gb3JJbnNlcnRXaXRoR2VuZXJhdGVkQ29kZUluZm8oCisgICAgICAgICAgICAgICAgR2V0T3V0cHV0RmlsZU5hbWUoaW5zZXJ0X2ludG9baV0sIGZpbGUpLAorICAgICAgICAgICAgICAgIGtGaXJzdEluc2VydGlvblBvaW50TmFtZSwgaW5mbykpOworICAgICAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKKyAgICAgICAgcHJpbnRlci5QcmludFJhdyhjb250ZW50KTsKKyAgICAgICAgaWYgKHByaW50ZXIuZmFpbGVkKCkpIHsKKyAgICAgICAgICAqZXJyb3IgPSAiTW9ja0NvZGVHZW5lcmF0b3IgZGV0ZWN0ZWQgd3JpdGUgZXJyb3IuIjsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgeworICAgICAgICBnb29nbGU6OnByb3RvYnVmOjpHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOworICAgICAgICBzdGQ6OnN0cmluZyBjb250ZW50ID0KKyAgICAgICAgICAgIEdldE91dHB1dEZpbGVDb250ZW50KG5hbWVfLCAic2Vjb25kX2luc2VydCIsIGZpbGUsIGNvbnRleHQpOworICAgICAgICBpZiAoaW5zZXJ0X2VuZGxpbmVzKSB7CisgICAgICAgICAgR2xvYmFsUmVwbGFjZVN1YnN0cmluZygiLCIsICIsXG4iLCAmY29udGVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFubm90YXRlKSB7CisgICAgICAgICAgYXV0byogYW5ub3RhdGlvbiA9IGluZm8uYWRkX2Fubm90YXRpb24oKTsKKyAgICAgICAgICBhbm5vdGF0aW9uLT5zZXRfYmVnaW4oMCk7CisgICAgICAgICAgYW5ub3RhdGlvbi0+c2V0X2VuZChjb250ZW50LnNpemUoKSk7CisgICAgICAgICAgYW5ub3RhdGlvbi0+c2V0X3NvdXJjZV9maWxlKCJzZWNvbmRfcGF0aCIpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgICAgICAgIGNvbnRleHQtPk9wZW5Gb3JJbnNlcnRXaXRoR2VuZXJhdGVkQ29kZUluZm8oCisgICAgICAgICAgICAgICAgR2V0T3V0cHV0RmlsZU5hbWUoaW5zZXJ0X2ludG9baV0sIGZpbGUpLAorICAgICAgICAgICAgICAgIGtTZWNvbmRJbnNlcnRpb25Qb2ludE5hbWUsIGluZm8pKTsKKyAgICAgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisgICAgICAgIHByaW50ZXIuUHJpbnRSYXcoY29udGVudCk7CisgICAgICAgIGlmIChwcmludGVyLmZhaWxlZCgpKSB7CisgICAgICAgICAgKmVycm9yID0gIk1vY2tDb2RlR2VuZXJhdG9yIGRldGVjdGVkIHdyaXRlIGVycm9yLiI7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgICAgY29udGV4dC0+T3BlbihHZXRPdXRwdXRGaWxlTmFtZShuYW1lXywgZmlsZSkpKTsKKworICAgIEdlbmVyYXRlZENvZGVJbmZvIGFubm90YXRpb25zOworICAgIGlvOjpBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGFubm90YXRpb25fY29sbGVjdG9yKAorICAgICAgICAmYW5ub3RhdGlvbnMpOworICAgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcsCisgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0ZSA/ICZhbm5vdGF0aW9uX2NvbGxlY3RvciA6IG51bGxwdHIpOworICAgIHByaW50ZXIuUHJpbnRSYXcoR2V0T3V0cHV0RmlsZUNvbnRlbnQobmFtZV8sIHBhcmFtZXRlciwgZmlsZSwgY29udGV4dCkpOworICAgIHN0ZDo6c3RyaW5nIGFubm90YXRlX3N1ZmZpeCA9ICJfYW5ub3RhdGlvbiI7CisgICAgaWYgKGFubm90YXRlKSB7CisgICAgICBwcmludGVyLlByaW50KCIkcCRcbiIsICJwIiwgImZpcnN0Iik7CisgICAgICBwcmludGVyLkFubm90YXRlKCJwIiwgImZpcnN0IiArIGFubm90YXRlX3N1ZmZpeCk7CisgICAgfQorICAgIHByaW50ZXIuUHJpbnRSYXcoa0ZpcnN0SW5zZXJ0aW9uUG9pbnQpOworICAgIGlmIChhbm5vdGF0ZSkgeworICAgICAgcHJpbnRlci5QcmludCgiJHAkXG4iLCAicCIsICJzZWNvbmQiKTsKKyAgICAgIHByaW50ZXIuQW5ub3RhdGUoInAiLCAic2Vjb25kIiArIGFubm90YXRlX3N1ZmZpeCk7CisgICAgfQorICAgIHByaW50ZXIuUHJpbnRSYXcoa1NlY29uZEluc2VydGlvblBvaW50KTsKKyAgICBpZiAoYW5ub3RhdGUpIHsKKyAgICAgIHByaW50ZXIuUHJpbnQoIiRwJFxuIiwgInAiLCAidGhpcmQiKTsKKyAgICAgIHByaW50ZXIuQW5ub3RhdGUoInAiLCAidGhpcmQiICsgYW5ub3RhdGVfc3VmZml4KTsKKyAgICB9CisKKyAgICBpZiAocHJpbnRlci5mYWlsZWQoKSkgeworICAgICAgKmVycm9yID0gIk1vY2tDb2RlR2VuZXJhdG9yIGRldGVjdGVkIHdyaXRlIGVycm9yLiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChhbm5vdGF0ZSkgeworICAgICAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gbWV0YV9vdXRwdXQoCisgICAgICAgICAgY29udGV4dC0+T3BlbihHZXRPdXRwdXRGaWxlTmFtZShuYW1lXywgZmlsZSkgKyAiLnBiLm1ldGEiKSk7CisgICAgICBpZiAoIVRleHRGb3JtYXQ6OlByaW50KGFubm90YXRpb25zLCBtZXRhX291dHB1dC5nZXQoKSkpIHsKKyAgICAgICAgKmVycm9yID0gIk1vY2tDb2RlR2VuZXJhdG9yIGNvdWxkbid0IHdyaXRlIC5wYi5tZXRhIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnN0cmluZyBNb2NrQ29kZUdlbmVyYXRvcjo6R2V0T3V0cHV0RmlsZU5hbWUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLCBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICByZXR1cm4gR2V0T3V0cHV0RmlsZU5hbWUoZ2VuZXJhdG9yX25hbWUsIGZpbGUtPm5hbWUoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIE1vY2tDb2RlR2VuZXJhdG9yOjpHZXRPdXRwdXRGaWxlTmFtZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2VuZXJhdG9yX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlKSB7CisgIHJldHVybiBmaWxlICsgIi5Nb2NrQ29kZUdlbmVyYXRvci4iICsgZ2VuZXJhdG9yX25hbWU7Cit9CisKK3N0ZDo6c3RyaW5nIE1vY2tDb2RlR2VuZXJhdG9yOjpHZXRPdXRwdXRGaWxlQ29udGVudCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2VuZXJhdG9yX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQpIHsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBhbGxfZmlsZXM7CisgIGNvbnRleHQtPkxpc3RQYXJzZWRGaWxlcygmYWxsX2ZpbGVzKTsKKyAgcmV0dXJuIEdldE91dHB1dEZpbGVDb250ZW50KAorICAgICAgZ2VuZXJhdG9yX25hbWUsIHBhcmFtZXRlciwgZmlsZS0+bmFtZSgpLCBDb21tYVNlcGFyYXRlZExpc3QoYWxsX2ZpbGVzKSwKKyAgICAgIGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpID4gMCA/IGZpbGUtPm1lc3NhZ2VfdHlwZSgwKS0+bmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiKG5vbmUpIik7Cit9CisKK3N0ZDo6c3RyaW5nIE1vY2tDb2RlR2VuZXJhdG9yOjpHZXRPdXRwdXRGaWxlQ29udGVudCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2VuZXJhdG9yX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJzZWRfZmlsZV9saXN0LAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaXJzdF9tZXNzYWdlX25hbWUpIHsKKyAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoIiQwOiAkMSwgJDIsICQzLCAkNFxuIiwgZ2VuZXJhdG9yX25hbWUsIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwgZmlyc3RfbWVzc2FnZV9uYW1lLCBwYXJzZWRfZmlsZV9saXN0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkNzM1YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTM2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9NT0NLX0NPREVfR0VORVJBVE9SX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfTU9DS19DT0RFX0dFTkVSQVRPUl9IX18KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK2NsYXNzIEZpbGVEZXNjcmlwdG9yOworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKKy8vIEEgbW9jayBDb2RlR2VuZXJhdG9yLCB1c2VkIGJ5IGNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuICBUaGlzIGlzIGluCisvLyBpdHMgb3duIGZpbGUgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBib3RoIGRpcmVjdGx5IGFuZCBhcyBhIHBsdWdpbi4KKy8vCisvLyBHZW5lcmF0ZSgpIHByb2R1Y2VzIHNvbWUgb3V0cHV0IHdoaWNoIGNhbiBiZSBjaGVja2VkIGJ5IEV4cGVjdENhbGxlZCgpLiAgVGhlCisvLyBnZW5lcmF0b3IgY2FuIHJ1biBpbiBhIGRpZmZlcmVudCBwcm9jZXNzIChlLmcuIGEgcGx1Z2luKS4KKy8vCisvLyBJZiB0aGUgcGFyYW1ldGVyIGlzICJpbnNlcnQ9TkFNRVMiLCB0aGUgTW9ja0NvZGVHZW5lcmF0b3Igd2lsbCBpbnNlcnQgbGluZXMKKy8vIGludG8gdGhlIGZpbGVzIGdlbmVyYXRlZCBieSBvdGhlciBNb2NrQ29kZUdlbmVyYXRvcnMgaW5zdGVhZCBvZiBjcmVhdGluZworLy8gaXRzIG93biBmaWxlLiAgTkFNRVMgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdGhvc2Ugb3RoZXIKKy8vIE1vY2tDb2RlR2VuZXJhdG9ycy4gIElmIHRoZSBwYXJhbWV0ZXIgaXMgImluc2VydF9lbmRsaW5lcz1OQU1FUyIsIHRoZQorLy8gTW9ja0NvZGVHZW5lcmF0b3Igd2lsbCBpbnNlcnQgZGF0YSBndWFyYW50ZWVkIHRvIGNvbnRhaW4gbW9yZSB0aGFuIG9uZQorLy8gZW5kbGluZSBpbnRvIHRoZSBmaWxlcyBnZW5lcmF0ZWQgYnkgTkFNRVMuCisvLworLy8gTW9ja0NvZGVHZW5lcmF0b3Igd2lsbCBhbHNvIG1vZGlmeSBpdHMgYmVoYXZpb3Igc2xpZ2h0bHkgaWYgdGhlIGlucHV0IGZpbGUKKy8vIGNvbnRhaW5zIGEgbWVzc2FnZSB0eXBlIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgbmFtZXM6CisvLyAgIE1vY2tDb2RlR2VuZXJhdG9yX0Vycm9yOiAgQ2F1c2VzIEdlbmVyYXRlKCkgdG8gcmV0dXJuIGZhbHNlIGFuZCBzZXQgdGhlCisvLyAgICAgZXJyb3IgbWVzc2FnZSB0byAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9FcnJvci4iCisvLyAgIE1vY2tDb2RlR2VuZXJhdG9yX0V4aXQ6ICBHZW5lcmF0ZSgpIHByaW50cyAiU2F3IG1lc3NhZ2UgdHlwZQorLy8gICAgIE1vY2tDb2RlR2VuZXJhdG9yX0V4aXQuIiB0byBzdGRlcnIgYW5kIHRoZW4gY2FsbHMgZXhpdCgxMjMpLgorLy8gICBNb2NrQ29kZUdlbmVyYXRvcl9BYm9ydDogIEdlbmVyYXRlKCkgcHJpbnRzICJTYXcgbWVzc2FnZSB0eXBlCisvLyAgICAgTW9ja0NvZGVHZW5lcmF0b3JfQWJvcnQuIiB0byBzdGRlcnIgYW5kIHRoZW4gY2FsbHMgYWJvcnQoKS4KKy8vICAgTW9ja0NvZGVHZW5lcmF0b3JfSGFzU291cmNlQ29kZUluZm86ICBDYXVzZXMgR2VuZXJhdGUoKSB0byBhYm9ydCBhZnRlcgorLy8gICAgIHByaW50aW5nICJTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0hhc1NvdXJjZUNvZGVJbmZvOiBGT08uIiB0bworLy8gICAgIHN0ZGVyciwgd2hlcmUgRk9PIGlzICIxIiBpZiB0aGUgc3VwcGxpZWQgRmlsZURlc2NyaXB0b3JQcm90byBoYXMgc291cmNlCisvLyAgICAgY29kZSBpbmZvLCBhbmQgIjAiIG90aGVyd2lzZS4KKy8vICAgTW9ja0NvZGVHZW5lcmF0b3JfQW5ub3RhdGU6ICBHZW5lcmF0ZSgpIHdpbGwgYWRkIGFubm90YXRpb25zIHRvIGl0cyBvdXRwdXQKKy8vICAgICB0aGF0IGNhbiBsYXRlciBiZSB2ZXJpZmllZCB3aXRoIENoZWNrR2VuZXJhdGVkQW5ub3RhdGlvbnMuCitjbGFzcyBNb2NrQ29kZUdlbmVyYXRvciA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIE1vY2tDb2RlR2VuZXJhdG9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKyAgfk1vY2tDb2RlR2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gRXhwZWN0ICh2aWEgZ1Rlc3QpIHRoYXQgYSBNb2NrQ29kZUdlbmVyYXRvciB3aXRoIHRoZSBnaXZlbiBuYW1lIHdhcyBjYWxsZWQKKyAgLy8gd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBieSBpbnNwZWN0aW5nIHRoZSBvdXRwdXQgbG9jYXRpb24uCisgIC8vCisgIC8vIHxpbnNlcnRpb25zfCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG5hbWVzIG9mIE1vY2tDb2RlR2VuZXJhdG9ycyB3aGljaAorICAvLyBzaG91bGQgaGF2ZSBpbnNlcnRlZCBsaW5lcyBpbnRvIHRoaXMgZmlsZS4KKyAgLy8gfHBhcnNlZF9maWxlX2xpc3R8IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbmFtZXMgb2YgdGhlIGZpbGVzCisgIC8vIHRoYXQgYXJlIGJlaW5nIGNvbXBpbGVkIHRvZ2V0aGVyIGluIHRoaXMgcnVuLgorICBzdGF0aWMgdm9pZCBFeHBlY3RHZW5lcmF0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluc2VydGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaXJzdF9tZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyc2VkX2ZpbGVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRfZGlyZWN0b3J5KTsKKworICAvLyBDaGVja3MgdGhhdCB0aGUgY29ycmVjdCB0ZXh0IHJhbmdlcyB3ZXJlIGFubm90YXRlZCBieSB0aGUKKyAgLy8gTW9ja0NvZGVHZW5lcmF0b3JfQW5ub3RhdGUgZGlyZWN0aXZlLgorICBzdGF0aWMgdm9pZCBDaGVja0dlbmVyYXRlZEFubm90YXRpb25zKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRfZGlyZWN0b3J5KTsKKworICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgd2hpY2ggd291bGQgYmUgd3JpdHRlbiBieSB0aGUgZ2l2ZW4gZ2VuZXJhdG9yLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0T3V0cHV0RmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0T3V0cHV0RmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUpOworCisgIC8vIGltcGxlbWVudHMgQ29kZUdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgYm9vbCBHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LCBzdGQ6OnN0cmluZyogZXJyb3IpIGNvbnN0IG92ZXJyaWRlOworCisgIHVpbnQ2NF90IEdldFN1cHBvcnRlZEZlYXR1cmVzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU3VwcHJlc3NGZWF0dXJlcyh1aW50NjRfdCBmZWF0dXJlcyk7CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgdWludDY0X3Qgc3VwcHJlc3NlZF9mZWF0dXJlc18gPSAwOworCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBHZXRPdXRwdXRGaWxlQ29udGVudChjb25zdCBzdGQ6OnN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEdldE91dHB1dEZpbGVDb250ZW50KAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJzZWRfZmlsZV9saXN0LAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpcnN0X21lc3NhZ2VfbmFtZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9NT0NLX0NPREVfR0VORVJBVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4ZjM5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW0uY2MKQEAgLTAsMCArMSwyNjAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+IC8vIHN0ZDo6ZmluZCgpCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2Ugb2JqZWN0aXZlYyB7CisKK0VudW1HZW5lcmF0b3I6OkVudW1HZW5lcmF0b3IoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwKKyAgICAgIG5hbWVfKEVudW1OYW1lKGRlc2NyaXB0b3JfKSkgeworICAvLyBUcmFjayB0aGUgbmFtZXMgZm9yIHRoZSBlbnVtIHZhbHVlcywgYW5kIGlmIGFuIGFsaWFzIG92ZXJsYXBzIGEgYmFzZQorICAvLyB2YWx1ZSwgc2tpcCBtYWtpbmcgYSBuYW1lIGZvciBpdC4gTGlrZXdpc2UgaWYgdHdvIGFsaWFzIG92ZXJsYXAsIHRoZQorICAvLyBmaXJzdCBvbmUgd2lucy4KKyAgLy8gVGhlIG9uZSBnYXAgaW4gdGhpcyBsb2dpYyBpcyBpZiB0d28gYmFzZSB2YWx1ZXMgb3ZlcmxhcCwgYnV0IGZvciB0aGF0CisgIC8vIHRvIGhhcHBlbiB5b3UgaGF2ZSB0byBoYXZlICJGb28iIGFuZCAiRk9PIiBvciAiRk9PX0JBUiIgYW5kICJGb29CYXIiLAorICAvLyBhbmQgaWYgYW4gZW51bSBoYXMgdGhhdCwgaXQgaXMgYWxyZWFkeSBnb2luZyB0byBiZSBjb25mdXNpbmcgYW5kIGEKKyAgLy8gY29tcGlsZSBlcnJvciBpcyBqdXN0IGZpbmUuCisgIC8vIFRoZSB2YWx1ZXMgYXJlIHN0aWxsIHRyYWNrZWQgdG8gc3VwcG9ydCB0aGUgcmVmbGVjdGlvbiBhcGlzIGFuZAorICAvLyBUZXh0Rm9ybWF0IGhhbmRpbmcgc2luY2UgdGhleSBhcmUgZGlmZmVyZW50IHRoZXJlLgorICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdmFsdWVfbmFtZXM7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUgPSBkZXNjcmlwdG9yXy0+dmFsdWUoaSk7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogY2Fub25pY2FsX3ZhbHVlID0KKyAgICAgICAgZGVzY3JpcHRvcl8tPkZpbmRWYWx1ZUJ5TnVtYmVyKHZhbHVlLT5udW1iZXIoKSk7CisKKyAgICBpZiAodmFsdWUgPT0gY2Fub25pY2FsX3ZhbHVlKSB7CisgICAgICBiYXNlX3ZhbHVlc18ucHVzaF9iYWNrKHZhbHVlKTsKKyAgICAgIHZhbHVlX25hbWVzLmluc2VydChFbnVtVmFsdWVOYW1lKHZhbHVlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlX25hbWUoRW51bVZhbHVlTmFtZSh2YWx1ZSkpOworICAgICAgaWYgKHZhbHVlX25hbWVzLmZpbmQodmFsdWVfbmFtZSkgIT0gdmFsdWVfbmFtZXMuZW5kKCkpIHsKKyAgICAgICAgYWxpYXNfdmFsdWVzX3RvX3NraXBfLmluc2VydCh2YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YWx1ZV9uYW1lcy5pbnNlcnQodmFsdWVfbmFtZSk7CisgICAgICB9CisgICAgfQorICAgIGFsbF92YWx1ZXNfLnB1c2hfYmFjayh2YWx1ZSk7CisgIH0KK30KKworRW51bUdlbmVyYXRvcjo6fkVudW1HZW5lcmF0b3IoKSB7fQorCit2b2lkIEVudW1HZW5lcmF0b3I6OkdlbmVyYXRlSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHN0ZDo6c3RyaW5nIGVudW1fY29tbWVudHM7CisgIFNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uOworICBpZiAoZGVzY3JpcHRvcl8tPkdldFNvdXJjZUxvY2F0aW9uKCZsb2NhdGlvbikpIHsKKyAgICBlbnVtX2NvbW1lbnRzID0gQnVpbGRDb21tZW50c1N0cmluZyhsb2NhdGlvbiwgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgZW51bV9jb21tZW50cyA9ICIiOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiI3ByYWdtYSBtYXJrIC0gRW51bSAkbmFtZSRcbiIKKyAgICAgICJcbiIsCisgICAgICAibmFtZSIsIG5hbWVfKTsKKworICAvLyBTd2lmdCA1IGluY2x1ZGVkIFNFMDE5MiAiSGFuZGxpbmcgRnV0dXJlIEVudW0gQ2FzZXMiCisgIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL2FwcGxlL3N3aWZ0LWV2b2x1dGlvbi9ibG9iL21hc3Rlci9wcm9wb3NhbHMvMDE5Mi1ub24tZXhoYXVzdGl2ZS1lbnVtcy5tZAorICAvLyBTaW5jZSBhIC5wcm90byBmaWxlIGNhbiBnZXQgbmV3IHZhbHVlcyBhZGRlZCB0byBhbiBlbnVtIGF0IGFueSB0aW1lLCB0aGV5CisgIC8vIGFyZSBlZmZlY3RpdmVseSAibm9uLWZyb3plbiIuIEV2ZW4gaW4gYSBwcm90bzMgc3ludGF4IGZpbGUgd2hlcmUgdGhlcmUgaXMKKyAgLy8gc3VwcG9ydCBmb3IgdGhlIHVua25vd24gdmFsdWUsIGFuIGVkaXQgdG8gdGhlIGZpbGUgY2FuIGFsd2F5cyBhZGQgYSBuZXcKKyAgLy8gdmFsdWUgbW92aW5nIHNvbWV0aGluZyBmcm9tIHVua25vd24gdG8ga25vd24uIFNpbmNlIFN3aWZ0IGlzIG5vdyBBQkkKKyAgLy8gc3RhYmxlLCBpdCBhbHNvIG1lYW5zIGEgYmluYXJ5IGNvdWxkIGNvbnRhaW4gU3dpZnQgY29tcGlsZWQgYWdhaW5zdCBvbmUKKyAgLy8gdmVyc2lvbiBvZiB0aGUgLnBib2JqYy5oIGZpbGUsIGJ1dCBmaW5hbGx5IGxpbmtlZCBhZ2FpbnN0IGFuIGVudW0gd2l0aAorICAvLyBtb3JlIGNhc2VzLiBTbyB0aGUgU3dpZnQgY29kZSB3aWxsIGFsd2F5cyBoYXZlIHRvIHRyZWF0IE9iakMgUHJvdG8gRW51bXMKKyAgLy8gYXMgIm5vbi1mcm96ZW4iLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpbiBTRTAxOTIgaXMgZm9yIGFsbCBvYmpjIGVudW1zIHRvCisgIC8vIGJlICJub24tZnJvemVuIiB1bmxlc3MgbWFya2VkIGFzIG90aGVyd2lzZSwgc28gdGhpcyBtZWFucyB0aGlzIGdlbmVyYXRpb24KKyAgLy8gZG9lc24ndCBoYXZlIHRvIGJvdGhlciB3aXRoIHRoZSBgZW51bV9leHRlbnNpYmlsaXR5YCBhdHRyaWJ1dGUsIGFzIHRoZQorICAvLyBkZWZhdWx0IHdpbGwgYmUgd2hhdCBpcyBuZWVkZWQuCisKKyAgcHJpbnRlci0+UHJpbnQoIiRjb21tZW50cyR0eXBlZGVmJGRlcHJlY2F0ZWRfYXR0cmlidXRlJCBHUEJfRU5VTSgkbmFtZSQpIHtcbiIsCisgICAgICAgICAgICAgICAgICJjb21tZW50cyIsIGVudW1fY29tbWVudHMsCisgICAgICAgICAgICAgICAgICJkZXByZWNhdGVkX2F0dHJpYnV0ZSIsIEdldE9wdGlvbmFsRGVwcmVjYXRlZEF0dHJpYnV0ZShkZXNjcmlwdG9yXywgZGVzY3JpcHRvcl8tPmZpbGUoKSksCisgICAgICAgICAgICAgICAgICJuYW1lIiwgbmFtZV8pOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBpZiAoSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgLy8gSW5jbHVkZSB0aGUgdW5rbm93biB2YWx1ZS4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIvKipcbiIKKyAgICAgICIgKiBWYWx1ZSB1c2VkIGlmIGFueSBtZXNzYWdlJ3MgZmllbGQgZW5jb3VudGVycyBhIHZhbHVlIHRoYXQgaXMgbm90IGRlZmluZWRcbiIKKyAgICAgICIgKiBieSB0aGlzIGVudW0uIFRoZSBtZXNzYWdlIHdpbGwgYWxzbyBoYXZlIEMgZnVuY3Rpb25zIHRvIGdldC9zZXQgdGhlIHJhd1ZhbHVlXG4iCisgICAgICAiICogb2YgdGhlIGZpZWxkLlxuIgorICAgICAgIiAqKi9cbiIKKyAgICAgICIkbmFtZSRfR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlID0ga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSxcbiIsCisgICAgICAibmFtZSIsIG5hbWVfKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGFsbF92YWx1ZXNfLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKGFsaWFzX3ZhbHVlc190b19za2lwXy5maW5kKGFsbF92YWx1ZXNfW2ldKSAhPSBhbGlhc192YWx1ZXNfdG9fc2tpcF8uZW5kKCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoYWxsX3ZhbHVlc19baV0tPkdldFNvdXJjZUxvY2F0aW9uKCZsb2NhdGlvbikpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGNvbW1lbnRzID0gQnVpbGRDb21tZW50c1N0cmluZyhsb2NhdGlvbiwgdHJ1ZSkuY19zdHIoKTsKKyAgICAgIGlmIChjb21tZW50cy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci0+UHJpbnQoY29tbWVudHMuY19zdHIoKSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIkbmFtZSQkZGVwcmVjYXRlZF9hdHRyaWJ1dGUkID0gJHZhbHVlJCxcbiIsCisgICAgICAgICJuYW1lIiwgRW51bVZhbHVlTmFtZShhbGxfdmFsdWVzX1tpXSksCisgICAgICAgICJkZXByZWNhdGVkX2F0dHJpYnV0ZSIsIEdldE9wdGlvbmFsRGVwcmVjYXRlZEF0dHJpYnV0ZShhbGxfdmFsdWVzX1tpXSksCisgICAgICAgICJ2YWx1ZSIsIFN0ckNhdChhbGxfdmFsdWVzX1tpXS0+bnVtYmVyKCkpKTsKKyAgfQorICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIn07XG4iCisgICAgICAiXG4iCisgICAgICAiR1BCRW51bURlc2NyaXB0b3IgKiRuYW1lJF9FbnVtRGVzY3JpcHRvcih2b2lkKTtcbiIKKyAgICAgICJcbiIKKyAgICAgICIvKipcbiIKKyAgICAgICIgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBkZWZpbmVkIGJ5IHRoZSBlbnVtIG9yIHdhcyBub3Qga25vd24gYXRcbiIKKyAgICAgICIgKiB0aGUgdGltZSB0aGlzIHNvdXJjZSB3YXMgZ2VuZXJhdGVkLlxuIgorICAgICAgIiAqKi9cbiIKKyAgICAgICJCT09MICRuYW1lJF9Jc1ZhbGlkVmFsdWUoaW50MzJfdCB2YWx1ZSk7XG4iCisgICAgICAiXG4iLAorICAgICAgIm5hbWUiLCBuYW1lXyk7Cit9CisKK3ZvaWQgRW51bUdlbmVyYXRvcjo6R2VuZXJhdGVTb3VyY2UoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiI3ByYWdtYSBtYXJrIC0gRW51bSAkbmFtZSRcbiIKKyAgICAgICJcbiIsCisgICAgICAibmFtZSIsIG5hbWVfKTsKKworICAvLyBOb3RlOiBGb3IgdGhlIFRleHRGb3JtYXQgZGVjb2RlIGluZm8sIHdlIGNhbid0IHVzZSB0aGUgZW51bSB2YWx1ZSBhcworICAvLyB0aGUga2V5IGJlY2F1c2UgcHJvdG9jb2wgYnVmZmVyIGVudW1zIGhhdmUgJ2FsbG93X2FsaWFzJywgd2hpY2ggbGV0cworICAvLyBhIHZhbHVlIGJlIHVzZWQgbW9yZSB0aGFuIG9uY2UuIEluc3RlYWQsIHRoZSBpbmRleCBpbnRvIHRoZSBsaXN0IG9mCisgIC8vIGVudW0gdmFsdWUgZGVzY3JpcHRpb25zIGlzIHVzZWQuIE5vdGU6IHN0YXJ0IHdpdGggLTEgc28gdGhlIGZpcnN0IG9uZQorICAvLyB3aWxsIGJlIHplcm8uCisgIFRleHRGb3JtYXREZWNvZGVEYXRhIHRleHRfZm9ybWF0X2RlY29kZV9kYXRhOworICBpbnQgZW51bV92YWx1ZV9kZXNjcmlwdGlvbl9rZXkgPSAtMTsKKyAgc3RkOjpzdHJpbmcgdGV4dF9ibG9iOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsX3ZhbHVlc18uc2l6ZSgpOyBpKyspIHsKKyAgICArK2VudW1fdmFsdWVfZGVzY3JpcHRpb25fa2V5OworICAgIHN0ZDo6c3RyaW5nIHNob3J0X25hbWUoRW51bVZhbHVlU2hvcnROYW1lKGFsbF92YWx1ZXNfW2ldKSk7CisgICAgdGV4dF9ibG9iICs9IHNob3J0X25hbWUgKyAnXDAnOworICAgIGlmIChVbkNhbWVsQ2FzZUVudW1TaG9ydE5hbWUoc2hvcnRfbmFtZSkgIT0gYWxsX3ZhbHVlc19baV0tPm5hbWUoKSkgeworICAgICAgdGV4dF9mb3JtYXRfZGVjb2RlX2RhdGEuQWRkU3RyaW5nKGVudW1fdmFsdWVfZGVzY3JpcHRpb25fa2V5LCBzaG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF92YWx1ZXNfW2ldLT5uYW1lKCkpOworICAgIH0KKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkdQQkVudW1EZXNjcmlwdG9yICokbmFtZSRfRW51bURlc2NyaXB0b3Iodm9pZCkge1xuIgorICAgICAgIiAgc3RhdGljIF9BdG9taWMoR1BCRW51bURlc2NyaXB0b3IqKSBkZXNjcmlwdG9yID0gbmlsO1xuIgorICAgICAgIiAgaWYgKCFkZXNjcmlwdG9yKSB7XG4iLAorICAgICAgIm5hbWUiLCBuYW1lXyk7CisKKyAgc3RhdGljIGNvbnN0IGludCBrQnl0ZXNQZXJMaW5lID0gNDA7ICAvLyBhbGxvdyBmb3IgZXNjYXBpbmcKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICAgIHN0YXRpYyBjb25zdCBjaGFyICp2YWx1ZU5hbWVzID0iKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0X2Jsb2Iuc2l6ZSgpOyBpICs9IGtCeXRlc1BlckxpbmUpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIlxuICAgICAgICBcIiRkYXRhJFwiIiwKKyAgICAgICAgImRhdGEiLCBFc2NhcGVUcmlncmFwaHMoQ0VzY2FwZSh0ZXh0X2Jsb2Iuc3Vic3RyKGksIGtCeXRlc1BlckxpbmUpKSkpOworICB9CisgIHByaW50ZXItPlByaW50KAorICAgICAgIjtcbiIKKyAgICAgICIgICAgc3RhdGljIGNvbnN0IGludDMyX3QgdmFsdWVzW10gPSB7XG4iKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxfdmFsdWVzXy5zaXplKCk7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KCIgICAgICAgICRuYW1lJCxcbiIsICAibmFtZSIsIEVudW1WYWx1ZU5hbWUoYWxsX3ZhbHVlc19baV0pKTsKKyAgfQorICBwcmludGVyLT5QcmludCgiICAgIH07XG4iKTsKKworICBpZiAodGV4dF9mb3JtYXRfZGVjb2RlX2RhdGEubnVtX2VudHJpZXMoKSA9PSAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgICAgR1BCRW51bURlc2NyaXB0b3IgKndvcmtlciA9XG4iCisgICAgICAgICIgICAgICAgIFtHUEJFbnVtRGVzY3JpcHRvciBhbGxvY0Rlc2NyaXB0b3JGb3JOYW1lOkdQQk5TU3RyaW5naWZ5U3ltYm9sKCRuYW1lJClcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlTmFtZXM6dmFsdWVOYW1lc1xuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczp2YWx1ZXNcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KHVpbnQzMl90KShzaXplb2YodmFsdWVzKSAvIHNpemVvZihpbnQzMl90KSlcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtVmVyaWZpZXI6JG5hbWUkX0lzVmFsaWRWYWx1ZV07XG4iLAorICAgICAgICAibmFtZSIsIG5hbWVfKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgICAgc3RhdGljIGNvbnN0IGNoYXIgKmV4dHJhVGV4dEZvcm1hdEluZm8gPSBcIiRleHRyYVRleHRGb3JtYXRJbmZvJFwiO1xuIgorICAgICAgICAiICAgIEdQQkVudW1EZXNjcmlwdG9yICp3b3JrZXIgPVxuIgorICAgICAgICAiICAgICAgICBbR1BCRW51bURlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yTmFtZTpHUEJOU1N0cmluZ2lmeVN5bWJvbCgkbmFtZSQpXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZU5hbWVzOnZhbHVlTmFtZXNcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6dmFsdWVzXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Oih1aW50MzJfdCkoc2l6ZW9mKHZhbHVlcykgLyBzaXplb2YoaW50MzJfdCkpXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bVZlcmlmaWVyOiRuYW1lJF9Jc1ZhbGlkVmFsdWVcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhVGV4dEZvcm1hdEluZm86ZXh0cmFUZXh0Rm9ybWF0SW5mb107XG4iLAorICAgICAgICAibmFtZSIsIG5hbWVfLAorICAgICAgICAiZXh0cmFUZXh0Rm9ybWF0SW5mbyIsIENFc2NhcGUodGV4dF9mb3JtYXRfZGVjb2RlX2RhdGEuRGF0YSgpKSk7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiAgICBHUEJFbnVtRGVzY3JpcHRvciAqZXhwZWN0ZWQgPSBuaWw7XG4iCisgICAgICAiICAgIGlmICghYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKCZkZXNjcmlwdG9yLCAmZXhwZWN0ZWQsIHdvcmtlcikpIHtcbiIKKyAgICAgICIgICAgICBbd29ya2VyIHJlbGVhc2VdO1xuIgorICAgICAgIiAgICB9XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICByZXR1cm4gZGVzY3JpcHRvcjtcbiIKKyAgICAgICJ9XG5cbiIpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgIkJPT0wgJG5hbWUkX0lzVmFsaWRWYWx1ZShpbnQzMl90IHZhbHVlX18pIHtcbiIKKyAgICAgICIgIHN3aXRjaCAodmFsdWVfXykge1xuIiwKKyAgICAgICJuYW1lIiwgbmFtZV8pOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgYmFzZV92YWx1ZXNfLnNpemUoKTsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgICAgY2FzZSAkbmFtZSQ6XG4iLAorICAgICAgICAibmFtZSIsIEVudW1WYWx1ZU5hbWUoYmFzZV92YWx1ZXNfW2ldKSk7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAgICIgICAgICByZXR1cm4gWUVTO1xuIgorICAgICAgIiAgICBkZWZhdWx0OlxuIgorICAgICAgIiAgICAgIHJldHVybiBOTztcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG5cbiIpOworfQorfSAgLy8gbmFtZXNwYWNlIG9iamVjdGl2ZWMKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1NzQxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW0uaApAQCAtMCwwICsxLDcxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfT0JKRUNUSVZFQ19FTlVNX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfT0JKRUNUSVZFQ19FTlVNX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIG9iamVjdGl2ZWMgeworCitjbGFzcyBFbnVtR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEVudW1HZW5lcmF0b3IoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICB+RW51bUdlbmVyYXRvcigpOworCisgIEVudW1HZW5lcmF0b3IoY29uc3QgRW51bUdlbmVyYXRvciYpID0gZGVsZXRlOworICBFbnVtR2VuZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgRW51bUdlbmVyYXRvciYpID0gZGVsZXRlOworCisgIHZvaWQgR2VuZXJhdGVIZWFkZXIoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlU291cmNlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyBwcml2YXRlOgorICBjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqPiBiYXNlX3ZhbHVlc187CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqPiBhbGxfdmFsdWVzXzsKKyAgc3RkOjpzZXQ8Y29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcio+IGFsaWFzX3ZhbHVlc190b19za2lwXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugb2JqZWN0aXZlYworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfT0JKRUNUSVZFQ19FTlVNX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW1fZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwZDY5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW1fZmllbGQuY2MKQEAgLTAsMCArMSwxNTEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2Ugb2JqZWN0aXZlYyB7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgU2V0RW51bVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzKSB7CisgIHN0ZDo6c3RyaW5nIHR5cGUgPSBFbnVtTmFtZShkZXNjcmlwdG9yLT5lbnVtX3R5cGUoKSk7CisgICgqdmFyaWFibGVzKVsic3RvcmFnZV90eXBlIl0gPSB0eXBlOworICAvLyBGb3Igbm9uIHJlcGVhdGVkIGZpZWxkcywgaWYgaXQgd2FzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgZmlsZSwgdGhlCisgIC8vIHByb3BlcnR5IGRlY2xzIG5lZWQgdG8gdXNlICJlbnVtIE5BTUUiIHJhdGhlciB0aGFuIGp1c3QgIk5BTUUiIHRvIHN1cHBvcnQKKyAgLy8gdGhlIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgdGhlIGVudW1zLgorICBpZiAoIWRlc2NyaXB0b3ItPmlzX3JlcGVhdGVkKCkgJiYKKyAgICAgIChkZXNjcmlwdG9yLT5maWxlKCkgIT0gZGVzY3JpcHRvci0+ZW51bV90eXBlKCktPmZpbGUoKSkpIHsKKyAgICAoKnZhcmlhYmxlcylbInByb3BlcnR5X3R5cGUiXSA9ICJlbnVtICIgKyB0eXBlOworICB9CisgICgqdmFyaWFibGVzKVsiZW51bV92ZXJpZmllciJdID0gdHlwZSArICJfSXNWYWxpZFZhbHVlIjsKKyAgKCp2YXJpYWJsZXMpWyJlbnVtX2Rlc2NfZnVuYyJdID0gdHlwZSArICJfRW51bURlc2NyaXB0b3IiOworCisgICgqdmFyaWFibGVzKVsiZGF0YVR5cGVTcGVjaWZpY19uYW1lIl0gPSAiZW51bURlc2NGdW5jIjsKKyAgKCp2YXJpYWJsZXMpWyJkYXRhVHlwZVNwZWNpZmljX3ZhbHVlIl0gPSAoKnZhcmlhYmxlcylbImVudW1fZGVzY19mdW5jIl07CisKKyAgY29uc3QgRGVzY3JpcHRvciogbXNnX2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKTsKKyAgKCp2YXJpYWJsZXMpWyJvd25pbmdfbWVzc2FnZV9jbGFzcyJdID0gQ2xhc3NOYW1lKG1zZ19kZXNjcmlwdG9yKTsKK30KK30gIC8vIG5hbWVzcGFjZQorCitFbnVtRmllbGRHZW5lcmF0b3I6OkVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgICAgOiBTaW5nbGVGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yKSB7CisgIFNldEVudW1WYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18pOworfQorCitFbnVtRmllbGRHZW5lcmF0b3I6On5FbnVtRmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVDRnVuY3Rpb25EZWNsYXJhdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKCFIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAiLyoqXG4iCisgICAgICAiICogRmV0Y2hlcyB0aGUgcmF3IHZhbHVlIG9mIGEgQGMgJG93bmluZ19tZXNzYWdlX2NsYXNzJCdzIEBjICRuYW1lJCBwcm9wZXJ0eSwgZXZlblxuIgorICAgICAgIiAqIGlmIHRoZSB2YWx1ZSB3YXMgbm90IGRlZmluZWQgYnkgdGhlIGVudW0gYXQgdGhlIHRpbWUgdGhlIGNvZGUgd2FzIGdlbmVyYXRlZC5cbiIKKyAgICAgICIgKiovXG4iCisgICAgICAiaW50MzJfdCAkb3duaW5nX21lc3NhZ2VfY2xhc3MkXyRjYXBpdGFsaXplZF9uYW1lJF9SYXdWYWx1ZSgkb3duaW5nX21lc3NhZ2VfY2xhc3MkICptZXNzYWdlKTtcbiIKKyAgICAgICIvKipcbiIKKyAgICAgICIgKiBTZXRzIHRoZSByYXcgdmFsdWUgb2YgYW4gQGMgJG93bmluZ19tZXNzYWdlX2NsYXNzJCdzIEBjICRuYW1lJCBwcm9wZXJ0eSwgYWxsb3dpbmdcbiIKKyAgICAgICIgKiBpdCB0byBiZSBzZXQgdG8gYSB2YWx1ZSB0aGF0IHdhcyBub3QgZGVmaW5lZCBieSB0aGUgZW51bSBhdCB0aGUgdGltZSB0aGUgY29kZVxuIgorICAgICAgIiAqIHdhcyBnZW5lcmF0ZWQuXG4iCisgICAgICAiICoqL1xuIgorICAgICAgInZvaWQgU2V0JG93bmluZ19tZXNzYWdlX2NsYXNzJF8kY2FwaXRhbGl6ZWRfbmFtZSRfUmF3VmFsdWUoJG93bmluZ19tZXNzYWdlX2NsYXNzJCAqbWVzc2FnZSwgaW50MzJfdCB2YWx1ZSk7XG4iCisgICAgICAiXG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ0Z1bmN0aW9uSW1wbGVtZW50YXRpb25zKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmICghSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSByZXR1cm47CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgImludDMyX3QgJG93bmluZ19tZXNzYWdlX2NsYXNzJF8kY2FwaXRhbGl6ZWRfbmFtZSRfUmF3VmFsdWUoJG93bmluZ19tZXNzYWdlX2NsYXNzJCAqbWVzc2FnZSkge1xuIgorICAgICAgIiAgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IFskb3duaW5nX21lc3NhZ2VfY2xhc3MkIGRlc2NyaXB0b3JdO1xuIgorICAgICAgIiAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE51bWJlcjokZmllbGRfbnVtYmVyX25hbWUkXTtcbiIKKyAgICAgICIgIHJldHVybiBHUEJHZXRNZXNzYWdlUmF3RW51bUZpZWxkKG1lc3NhZ2UsIGZpZWxkKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iCisgICAgICAidm9pZCBTZXQkb3duaW5nX21lc3NhZ2VfY2xhc3MkXyRjYXBpdGFsaXplZF9uYW1lJF9SYXdWYWx1ZSgkb3duaW5nX21lc3NhZ2VfY2xhc3MkICptZXNzYWdlLCBpbnQzMl90IHZhbHVlKSB7XG4iCisgICAgICAiICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gWyRvd25pbmdfbWVzc2FnZV9jbGFzcyQgZGVzY3JpcHRvcl07XG4iCisgICAgICAiICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkID0gW2Rlc2NyaXB0b3IgZmllbGRXaXRoTnVtYmVyOiRmaWVsZF9udW1iZXJfbmFtZSRdO1xuIgorICAgICAgIiAgR1BCU2V0TWVzc2FnZVJhd0VudW1GaWVsZChtZXNzYWdlLCBmaWVsZCwgdmFsdWUpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6RGV0ZXJtaW5lRm9yd2FyZERlY2xhcmF0aW9ucygKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGZ3ZF9kZWNscywKKyAgICBib29sIGluY2x1ZGVfZXh0ZXJuYWxfdHlwZXMpIGNvbnN0IHsKKyAgU2luZ2xlRmllbGRHZW5lcmF0b3I6OkRldGVybWluZUZvcndhcmREZWNsYXJhdGlvbnMoCisgICAgICBmd2RfZGVjbHMsIGluY2x1ZGVfZXh0ZXJuYWxfdHlwZXMpOworICAvLyBJZiBpdCBpcyBhbiBlbnVtIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgZmlsZSAoYW5kIG5vdCBhIFdLVCksIHRoZW4gd2UnbGwKKyAgLy8gbmVlZCBhIGZvcndhcmQgZGVjbGFyYXRpb24gZm9yIGl0LiAgV2hlbiBpdCBpcyBpbiBvdXIgZmlsZSwgYWxsIHRoZSBlbnVtcworICAvLyBhcmUgb3V0cHV0IGJlZm9yZSB0aGUgbWVzc2FnZSwgc28gaXQgd2lsbCBiZSBkZWNsYXJlZCBiZWZvcmUgaXQgaXMgbmVlZGVkLgorICBpZiAoaW5jbHVkZV9leHRlcm5hbF90eXBlcyAmJgorICAgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSAhPSBkZXNjcmlwdG9yXy0+ZW51bV90eXBlKCktPmZpbGUoKSAmJgorICAgICAgIUlzUHJvdG9idWZMaWJyYXJ5QnVuZGxlZFByb3RvRmlsZShkZXNjcmlwdG9yXy0+ZW51bV90eXBlKCktPmZpbGUoKSkpIHsKKyAgICAvLyBFbnVtIG5hbWUgaXMgYWxyZWFkeSBpbiAic3RvcmFnZV90eXBlIi4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSA9IHZhcmlhYmxlKCJzdG9yYWdlX3R5cGUiKTsKKyAgICBmd2RfZGVjbHMtPmluc2VydCgiR1BCX0VOVU1fRldEX0RFQ0xBUkUoIiArIG5hbWUgKyAiKSIpOworICB9Cit9CisKK1JlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgICAgOiBSZXBlYXRlZEZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IpIHsKKyAgU2V0RW51bVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7CisgIHZhcmlhYmxlc19bImFycmF5X3N0b3JhZ2VfdHlwZSJdID0gIkdQQkVudW1BcnJheSI7Cit9CisKK1JlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjp+UmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpGaW5pc2hJbml0aWFsaXphdGlvbih2b2lkKSB7CisgIFJlcGVhdGVkRmllbGRHZW5lcmF0b3I6OkZpbmlzaEluaXRpYWxpemF0aW9uKCk7CisgIHZhcmlhYmxlc19bImFycmF5X2NvbW1lbnQiXSA9CisgICAgICAiLy8gfCIgKyB2YXJpYWJsZXNfWyJuYW1lIl0gKyAifCBjb250YWlucyB8IiArIHZhcmlhYmxlc19bInN0b3JhZ2VfdHlwZSJdICsgInxcbiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBvYmplY3RpdmVjCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZDY4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtX2ZpZWxkLmgKQEAgLTAsMCArMSw3OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX09CSkVDVElWRUNfRU5VTV9GSUVMRF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX09CSkVDVElWRUNfRU5VTV9GSUVMRF9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIG9iamVjdGl2ZWMgeworCitjbGFzcyBFbnVtRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgU2luZ2xlRmllbGRHZW5lcmF0b3IgeworICBmcmllbmQgRmllbGRHZW5lcmF0b3IqIEZpZWxkR2VuZXJhdG9yOjpNYWtlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBFbnVtRmllbGRHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKyAgRW51bUZpZWxkR2VuZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgRW51bUZpZWxkR2VuZXJhdG9yJikgPSBkZWxldGU7CisKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUNGdW5jdGlvbkRlY2xhcmF0aW9ucygKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQ0Z1bmN0aW9uSW1wbGVtZW50YXRpb25zKAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgRGV0ZXJtaW5lRm9yd2FyZERlY2xhcmF0aW9ucygKKyAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiogZndkX2RlY2xzLAorICAgICAgYm9vbCBpbmNsdWRlX2V4dGVybmFsX3R5cGVzKSBjb25zdCBvdmVycmlkZTsKKworIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgRW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIHZpcnR1YWwgfkVudW1GaWVsZEdlbmVyYXRvcigpOworfTsKKworY2xhc3MgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgUmVwZWF0ZWRGaWVsZEdlbmVyYXRvciB7CisgIGZyaWVuZCBGaWVsZEdlbmVyYXRvciogRmllbGRHZW5lcmF0b3I6Ok1ha2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBGaW5pc2hJbml0aWFsaXphdGlvbigpIG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBleHBsaWNpdCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICB2aXJ0dWFsIH5SZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcigpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG9iamVjdGl2ZWMKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9PQkpFQ1RJVkVDX0VOVU1fRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19leHRlbnNpb24uY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19leHRlbnNpb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlYmNiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2V4dGVuc2lvbi5jYwpAQCAtMCwwICsxLDE1NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZXh0ZW5zaW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2Ugb2JqZWN0aXZlYyB7CisKK0V4dGVuc2lvbkdlbmVyYXRvcjo6RXh0ZW5zaW9uR2VuZXJhdG9yKGNvbnN0IHN0ZDo6c3RyaW5nJiByb290X2NsYXNzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgICAgOiBtZXRob2RfbmFtZV8oRXh0ZW5zaW9uTWV0aG9kTmFtZShkZXNjcmlwdG9yKSksCisgICAgICByb290X2NsYXNzX2FuZF9tZXRob2RfbmFtZV8ocm9vdF9jbGFzc19uYW1lICsgIl8iICsgbWV0aG9kX25hbWVfKSwKKyAgICAgIGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKKyAgaWYgKGRlc2NyaXB0b3ItPmlzX21hcCgpKSB7CisgICAgLy8gTk9URTogc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uY2MgbWFrZXMgdXNlIG9mIGNlcnIgZm9yIHNvbWUKKyAgICAvLyBlcnJvciBjYXNlcywgc28gaXQgc2VlbXMgdG8gYmUgb2sgdG8gdXNlIGFzIGEgYmFjayBkb29yIGZvciBlcnJvcnMuCisgICAgc3RkOjpjZXJyIDw8ICJlcnJvcjogRXh0ZW5zaW9uIGlzIGEgbWFwPD4hIgorICAgICAgICAgPDwgIiBUaGF0IHVzZWQgdG8gYmUgYmxvY2tlZCBieSB0aGUgY29tcGlsZXIuIiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyLmZsdXNoKCk7CisgICAgYWJvcnQoKTsKKyAgfQorfQorCitFeHRlbnNpb25HZW5lcmF0b3I6On5FeHRlbnNpb25HZW5lcmF0b3IoKSB7fQorCit2b2lkIEV4dGVuc2lvbkdlbmVyYXRvcjo6R2VuZXJhdGVNZW1iZXJzSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgdmFyc1sibWV0aG9kX25hbWUiXSA9IG1ldGhvZF9uYW1lXzsKKyAgaWYgKElzUmV0YWluZWROYW1lKG1ldGhvZF9uYW1lXykpIHsKKyAgICB2YXJzWyJzdG9yYWdlX2F0dHJpYnV0ZSJdID0gIiBOU19SRVRVUk5TX05PVF9SRVRBSU5FRCI7CisgIH0gZWxzZSB7CisgICAgdmFyc1sic3RvcmFnZV9hdHRyaWJ1dGUiXSA9ICIiOworICB9CisgIFNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uOworICBpZiAoZGVzY3JpcHRvcl8tPkdldFNvdXJjZUxvY2F0aW9uKCZsb2NhdGlvbikpIHsKKyAgICB2YXJzWyJjb21tZW50cyJdID0gQnVpbGRDb21tZW50c1N0cmluZyhsb2NhdGlvbiwgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgdmFyc1siY29tbWVudHMiXSA9ICIiOworICB9CisgIC8vIFVubGlrZSBub3JtYWwgbWVzc2FnZSBmaWVsZHMsIGNoZWNrIGlmIHRoZSBmaWxlIGZvciB0aGUgZXh0ZW5zaW9uIHdhcworICAvLyBkZXByZWNhdGVkLgorICB2YXJzWyJkZXByZWNhdGVkX2F0dHJpYnV0ZSJdID0gR2V0T3B0aW9uYWxEZXByZWNhdGVkQXR0cmlidXRlKGRlc2NyaXB0b3JfLCBkZXNjcmlwdG9yXy0+ZmlsZSgpKTsKKyAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgICAgICAgICAgIiRjb21tZW50cyQiCisgICAgICAgICAgICAgICAgICIrIChHUEJFeHRlbnNpb25EZXNjcmlwdG9yICopJG1ldGhvZF9uYW1lJCRzdG9yYWdlX2F0dHJpYnV0ZSQkZGVwcmVjYXRlZF9hdHRyaWJ1dGUkO1xuIik7Cit9CisKK3ZvaWQgRXh0ZW5zaW9uR2VuZXJhdG9yOjpHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlc0luaXRpYWxpemF0aW9uKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgdmFyc1sicm9vdF9jbGFzc19hbmRfbWV0aG9kX25hbWUiXSA9IHJvb3RfY2xhc3NfYW5kX21ldGhvZF9uYW1lXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgY29udGFpbmluZ190eXBlID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSk7CisgIHZhcnNbImV4dGVuZGVkX3R5cGUiXSA9IE9iakNDbGFzcyhjb250YWluaW5nX3R5cGUpOworICB2YXJzWyJudW1iZXIiXSA9IFN0ckNhdChkZXNjcmlwdG9yXy0+bnVtYmVyKCkpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBvcHRpb25zOworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3JlcGVhdGVkKCkpIG9wdGlvbnMucHVzaF9iYWNrKCJHUEJFeHRlbnNpb25SZXBlYXRlZCIpOworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSBvcHRpb25zLnB1c2hfYmFjaygiR1BCRXh0ZW5zaW9uUGFja2VkIik7CisgIGlmIChkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCktPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CisgICAgb3B0aW9ucy5wdXNoX2JhY2soIkdQQkV4dGVuc2lvblNldFdpcmVGb3JtYXQiKTsKKyAgfQorICB2YXJzWyJvcHRpb25zIl0gPSBCdWlsZEZsYWdzU3RyaW5nKEZMQUdUWVBFX0VYVEVOU0lPTiwgb3B0aW9ucyk7CisKKyAgT2JqZWN0aXZlQ1R5cGUgb2JqY190eXBlID0gR2V0T2JqZWN0aXZlQ1R5cGUoZGVzY3JpcHRvcl8pOworICBpZiAob2JqY190eXBlID09IE9CSkVDVElWRUNUWVBFX01FU1NBR0UpIHsKKyAgICBzdGQ6OnN0cmluZyBtZXNzYWdlX3R5cGUgPSBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpKTsKKyAgICB2YXJzWyJ0eXBlIl0gPSBPYmpDQ2xhc3MobWVzc2FnZV90eXBlKTsKKyAgfSBlbHNlIHsKKyAgICB2YXJzWyJ0eXBlIl0gPSAiTmlsIjsKKyAgfQorCisgIHZhcnNbImRlZmF1bHRfbmFtZSJdID0gR1BCR2VuZXJpY1ZhbHVlRmllbGROYW1lKGRlc2NyaXB0b3JfKTsKKyAgaWYgKGRlc2NyaXB0b3JfLT5pc19yZXBlYXRlZCgpKSB7CisgICAgdmFyc1siZGVmYXVsdCJdID0gIm5pbCI7CisgIH0gZWxzZSB7CisgICAgdmFyc1siZGVmYXVsdCJdID0gRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3JfKTsKKyAgfQorICBzdGQ6OnN0cmluZyB0eXBlID0gR2V0Q2FwaXRhbGl6ZWRUeXBlKGRlc2NyaXB0b3JfKTsKKyAgdmFyc1siZXh0ZW5zaW9uX3R5cGUiXSA9IHN0ZDo6c3RyaW5nKCJHUEJEYXRhVHlwZSIpICsgdHlwZTsKKworICBpZiAob2JqY190eXBlID09IE9CSkVDVElWRUNUWVBFX0VOVU0pIHsKKyAgICB2YXJzWyJlbnVtX2Rlc2NfZnVuY19uYW1lIl0gPQorICAgICAgICAgRW51bU5hbWUoZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgpKSArICJfRW51bURlc2NyaXB0b3IiOworICB9IGVsc2UgeworICAgIHZhcnNbImVudW1fZGVzY19mdW5jX25hbWUiXSA9ICJOVUxMIjsKKyAgfQorCisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAgICIgIC5kZWZhdWx0VmFsdWUuJGRlZmF1bHRfbmFtZSQgPSAkZGVmYXVsdCQsXG4iCisgICAgICAgICAgICAgICAgICIgIC5zaW5nbGV0b25OYW1lID0gR1BCU3RyaW5naWZ5U3ltYm9sKCRyb290X2NsYXNzX2FuZF9tZXRob2RfbmFtZSQpLFxuIgorICAgICAgICAgICAgICAgICAiICAuZXh0ZW5kZWRDbGFzcy5jbGF6eiA9ICRleHRlbmRlZF90eXBlJCxcbiIKKyAgICAgICAgICAgICAgICAgIiAgLm1lc3NhZ2VPckdyb3VwQ2xhc3MuY2xhenogPSAkdHlwZSQsXG4iCisgICAgICAgICAgICAgICAgICIgIC5lbnVtRGVzY3JpcHRvckZ1bmMgPSAkZW51bV9kZXNjX2Z1bmNfbmFtZSQsXG4iCisgICAgICAgICAgICAgICAgICIgIC5maWVsZE51bWJlciA9ICRudW1iZXIkLFxuIgorICAgICAgICAgICAgICAgICAiICAuZGF0YVR5cGUgPSAkZXh0ZW5zaW9uX3R5cGUkLFxuIgorICAgICAgICAgICAgICAgICAiICAub3B0aW9ucyA9ICRvcHRpb25zJCxcbiIKKyAgICAgICAgICAgICAgICAgIn0sXG4iKTsKK30KKwordm9pZCBFeHRlbnNpb25HZW5lcmF0b3I6OkRldGVybWluZU9iamVjdGl2ZUNDbGFzc0RlZmluaXRpb25zKAorICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiogZndkX2RlY2xzKSB7CisgIHN0ZDo6c3RyaW5nIGV4dGVuZGVkX3R5cGUgPSBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgZndkX2RlY2xzLT5pbnNlcnQoT2JqQ0NsYXNzRGVjbGFyYXRpb24oZXh0ZW5kZWRfdHlwZSkpOworICBPYmplY3RpdmVDVHlwZSBvYmpjX3R5cGUgPSBHZXRPYmplY3RpdmVDVHlwZShkZXNjcmlwdG9yXyk7CisgIGlmIChvYmpjX3R5cGUgPT0gT0JKRUNUSVZFQ1RZUEVfTUVTU0FHRSkgeworICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VfdHlwZSA9IENsYXNzTmFtZShkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCkpOworICAgIGZ3ZF9kZWNscy0+aW5zZXJ0KE9iakNDbGFzc0RlY2xhcmF0aW9uKG1lc3NhZ2VfdHlwZSkpOworICB9Cit9CisKK3ZvaWQgRXh0ZW5zaW9uR2VuZXJhdG9yOjpHZW5lcmF0ZVJlZ2lzdHJhdGlvblNvdXJjZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICJbcmVnaXN0cnkgYWRkRXh0ZW5zaW9uOiRyb290X2NsYXNzX2FuZF9tZXRob2RfbmFtZSRdO1xuIiwKKyAgICAgICJyb290X2NsYXNzX2FuZF9tZXRob2RfbmFtZSIsIHJvb3RfY2xhc3NfYW5kX21ldGhvZF9uYW1lXyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBvYmplY3RpdmVjCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZXh0ZW5zaW9uLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19leHRlbnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDEyZjRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZXh0ZW5zaW9uLmgKQEAgLTAsMCArMSw2NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX09CSkVDVElWRUNfRVhURU5TSU9OX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfT0JKRUNUSVZFQ19FWFRFTlNJT05fSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2Ugb2JqZWN0aXZlYyB7CisKK2NsYXNzIEV4dGVuc2lvbkdlbmVyYXRvciB7CisgcHVibGljOgorICBFeHRlbnNpb25HZW5lcmF0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIHJvb3RfY2xhc3NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIH5FeHRlbnNpb25HZW5lcmF0b3IoKTsKKworICBFeHRlbnNpb25HZW5lcmF0b3IoY29uc3QgRXh0ZW5zaW9uR2VuZXJhdG9yJikgPSBkZWxldGU7CisgIEV4dGVuc2lvbkdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEV4dGVuc2lvbkdlbmVyYXRvciYpID0gZGVsZXRlOworCisgIHZvaWQgR2VuZXJhdGVNZW1iZXJzSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlc0luaXRpYWxpemF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVJlZ2lzdHJhdGlvblNvdXJjZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgRGV0ZXJtaW5lT2JqZWN0aXZlQ0NsYXNzRGVmaW5pdGlvbnMoc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBmd2RfZGVjbHMpOworCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWVfOworICBzdGQ6OnN0cmluZyByb290X2NsYXNzX2FuZF9tZXRob2RfbmFtZV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugb2JqZWN0aXZlYworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfT0JKRUNUSVZFQ19NRVNTQUdFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmllbGQuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDRlYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmllbGQuY2MKQEAgLTAsMCArMSw0NzAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tYXBfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2VfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX3ByaW1pdGl2ZV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBvYmplY3RpdmVjIHsKKworbmFtZXNwYWNlIHsKKwordm9pZCBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcmlhYmxlcykgeworICBzdGQ6OnN0cmluZyBjYW1lbF9jYXNlX25hbWUgPSBGaWVsZE5hbWUoZGVzY3JpcHRvcik7CisgIHN0ZDo6c3RyaW5nIHJhd19maWVsZF9uYW1lOworICBpZiAoZGVzY3JpcHRvci0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgeworICAgIHJhd19maWVsZF9uYW1lID0gZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCktPm5hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICByYXdfZmllbGRfbmFtZSA9IGRlc2NyaXB0b3ItPm5hbWUoKTsKKyAgfQorICAvLyBUaGUgbG9naWMgaGVyZSBoYXMgdG8gbWF0Y2ggLVtHR1BCRmllbGREZXNjcmlwdG9yIHRleHRGb3JtYXROYW1lXS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgdW5fY2FtZWxfY2FzZV9uYW1lKAorICAgICAgVW5DYW1lbENhc2VGaWVsZE5hbWUoY2FtZWxfY2FzZV9uYW1lLCBkZXNjcmlwdG9yKSk7CisgIGNvbnN0IGJvb2wgbmVlZHNfY3VzdG9tX25hbWUgPSAocmF3X2ZpZWxkX25hbWUgIT0gdW5fY2FtZWxfY2FzZV9uYW1lKTsKKworICBTb3VyY2VMb2NhdGlvbiBsb2NhdGlvbjsKKyAgaWYgKGRlc2NyaXB0b3ItPkdldFNvdXJjZUxvY2F0aW9uKCZsb2NhdGlvbikpIHsKKyAgICAoKnZhcmlhYmxlcylbImNvbW1lbnRzIl0gPSBCdWlsZENvbW1lbnRzU3RyaW5nKGxvY2F0aW9uLCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbImNvbW1lbnRzIl0gPSAiXG4iOworICB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjbGFzc25hbWUgPSBDbGFzc05hbWUoZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCkpOworICAoKnZhcmlhYmxlcylbImNsYXNzbmFtZSJdID0gY2xhc3NuYW1lOworICAoKnZhcmlhYmxlcylbIm5hbWUiXSA9IGNhbWVsX2Nhc2VfbmFtZTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhcGl0YWxpemVkX25hbWUgPSBGaWVsZE5hbWVDYXBpdGFsaXplZChkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJjYXBpdGFsaXplZF9uYW1lIl0gPSBjYXBpdGFsaXplZF9uYW1lOworICAoKnZhcmlhYmxlcylbInJhd19maWVsZF9uYW1lIl0gPSByYXdfZmllbGRfbmFtZTsKKyAgKCp2YXJpYWJsZXMpWyJmaWVsZF9udW1iZXJfbmFtZSJdID0KKyAgICAgIGNsYXNzbmFtZSArICJfRmllbGROdW1iZXJfIiArIGNhcGl0YWxpemVkX25hbWU7CisgICgqdmFyaWFibGVzKVsiZmllbGRfbnVtYmVyIl0gPSBTdHJDYXQoZGVzY3JpcHRvci0+bnVtYmVyKCkpOworICAoKnZhcmlhYmxlcylbImZpZWxkX3R5cGUiXSA9IEdldENhcGl0YWxpemVkVHlwZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJkZXByZWNhdGVkX2F0dHJpYnV0ZSJdID0gR2V0T3B0aW9uYWxEZXByZWNhdGVkQXR0cmlidXRlKGRlc2NyaXB0b3IpOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZmllbGRfZmxhZ3M7CisgIGlmIChkZXNjcmlwdG9yLT5pc19yZXBlYXRlZCgpKSBmaWVsZF9mbGFncy5wdXNoX2JhY2soIkdQQkZpZWxkUmVwZWF0ZWQiKTsKKyAgaWYgKGRlc2NyaXB0b3ItPmlzX3JlcXVpcmVkKCkpIGZpZWxkX2ZsYWdzLnB1c2hfYmFjaygiR1BCRmllbGRSZXF1aXJlZCIpOworICBpZiAoZGVzY3JpcHRvci0+aXNfb3B0aW9uYWwoKSkgZmllbGRfZmxhZ3MucHVzaF9iYWNrKCJHUEJGaWVsZE9wdGlvbmFsIik7CisgIGlmIChkZXNjcmlwdG9yLT5pc19wYWNrZWQoKSkgZmllbGRfZmxhZ3MucHVzaF9iYWNrKCJHUEJGaWVsZFBhY2tlZCIpOworCisgIC8vIE9iakMgY3VzdG9tIGZsYWdzLgorICBpZiAoZGVzY3JpcHRvci0+aGFzX2RlZmF1bHRfdmFsdWUoKSkKKyAgICBmaWVsZF9mbGFncy5wdXNoX2JhY2soIkdQQkZpZWxkSGFzRGVmYXVsdFZhbHVlIik7CisgIGlmIChuZWVkc19jdXN0b21fbmFtZSkgZmllbGRfZmxhZ3MucHVzaF9iYWNrKCJHUEJGaWVsZFRleHRGb3JtYXROYW1lQ3VzdG9tIik7CisgIGlmIChkZXNjcmlwdG9yLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU0pIHsKKyAgICBmaWVsZF9mbGFncy5wdXNoX2JhY2soIkdQQkZpZWxkSGFzRW51bURlc2NyaXB0b3IiKTsKKyAgfQorICAvLyBJdCB3aWxsIGNsZWFyIG9uIGEgemVybyB2YWx1ZSBpZi4uLgorICAvLyAgLSBub3QgcmVwZWF0ZWQvbWFwCisgIC8vICAtIGRvZXNuJ3QgaGF2ZSBwcmVzZW5jZQorICBib29sIGNsZWFyX29uX3plcm8gPQorICAgICAgKCFkZXNjcmlwdG9yLT5pc19yZXBlYXRlZCgpICYmICFkZXNjcmlwdG9yLT5oYXNfcHJlc2VuY2UoKSk7CisgIGlmIChjbGVhcl9vbl96ZXJvKSB7CisgICAgZmllbGRfZmxhZ3MucHVzaF9iYWNrKCJHUEJGaWVsZENsZWFySGFzSXZhck9uWmVybyIpOworICB9CisKKyAgKCp2YXJpYWJsZXMpWyJmaWVsZGZsYWdzIl0gPSBCdWlsZEZsYWdzU3RyaW5nKEZMQUdUWVBFX0ZJRUxELCBmaWVsZF9mbGFncyk7CisKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBEZWZhdWx0VmFsdWUoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsiZGVmYXVsdF9uYW1lIl0gPSBHUEJHZW5lcmljVmFsdWVGaWVsZE5hbWUoZGVzY3JpcHRvcik7CisKKyAgKCp2YXJpYWJsZXMpWyJkYXRhVHlwZVNwZWNpZmljX25hbWUiXSA9ICJjbGF6eiI7CisgICgqdmFyaWFibGVzKVsiZGF0YVR5cGVTcGVjaWZpY192YWx1ZSJdID0gIk5pbCI7CisKKyAgKCp2YXJpYWJsZXMpWyJzdG9yYWdlX29mZnNldF92YWx1ZSJdID0KKyAgICAgICIodWludDMyX3Qpb2Zmc2V0b2YoIiArIGNsYXNzbmFtZSArICJfX3N0b3JhZ2VfLCAiICsgY2FtZWxfY2FzZV9uYW1lICsgIikiOworICAoKnZhcmlhYmxlcylbInN0b3JhZ2Vfb2Zmc2V0X2NvbW1lbnQiXSA9ICIiOworCisgIC8vIENsZWFyIHNvbWUgY29tbW9uIHRoaW5ncyBzbyB0aGV5IGNhbiBiZSBzZXQganVzdCB3aGVuIG5lZWRlZC4KKyAgKCp2YXJpYWJsZXMpWyJzdG9yYWdlX2F0dHJpYnV0ZSJdID0gIiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitGaWVsZEdlbmVyYXRvciogRmllbGRHZW5lcmF0b3I6Ok1ha2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBGaWVsZEdlbmVyYXRvciogcmVzdWx0ID0gTlVMTDsKKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgc3dpdGNoIChHZXRPYmplY3RpdmVDVHlwZShmaWVsZCkpIHsKKyAgICAgIGNhc2UgT0JKRUNUSVZFQ1RZUEVfTUVTU0FHRTogeworICAgICAgICBpZiAoZmllbGQtPmlzX21hcCgpKSB7CisgICAgICAgICAgcmVzdWx0ID0gbmV3IE1hcEZpZWxkR2VuZXJhdG9yKGZpZWxkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQgPSBuZXcgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoZmllbGQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9FTlVNOgorICAgICAgICByZXN1bHQgPSBuZXcgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IoZmllbGQpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJlc3VsdCA9IG5ldyBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGZpZWxkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIHN3aXRjaCAoR2V0T2JqZWN0aXZlQ1R5cGUoZmllbGQpKSB7CisgICAgICBjYXNlIE9CSkVDVElWRUNUWVBFX01FU1NBR0U6IHsKKyAgICAgICAgcmVzdWx0ID0gbmV3IE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihmaWVsZCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9FTlVNOgorICAgICAgICByZXN1bHQgPSBuZXcgRW51bUZpZWxkR2VuZXJhdG9yKGZpZWxkKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoSXNSZWZlcmVuY2VUeXBlKGZpZWxkKSkgeworICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcmltaXRpdmVPYmpGaWVsZEdlbmVyYXRvcihmaWVsZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0ID0gbmV3IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGZpZWxkKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmVzdWx0LT5GaW5pc2hJbml0aWFsaXphdGlvbigpOworICByZXR1cm4gcmVzdWx0OworfQorCitGaWVsZEdlbmVyYXRvcjo6RmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7Cit9CisKK0ZpZWxkR2VuZXJhdG9yOjp+RmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUZpZWxkTnVtYmVyQ29uc3RhbnQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRmaWVsZF9udW1iZXJfbmFtZSQgPSAkZmllbGRfbnVtYmVyJCxcbiIpOworfQorCit2b2lkIEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUNGdW5jdGlvbkRlY2xhcmF0aW9ucygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBOb3RoaW5nCit9CisKK3ZvaWQgRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlQ0Z1bmN0aW9uSW1wbGVtZW50YXRpb25zKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIE5vdGhpbmcKK30KKwordm9pZCBGaWVsZEdlbmVyYXRvcjo6RGV0ZXJtaW5lRm9yd2FyZERlY2xhcmF0aW9ucygKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGZ3ZF9kZWNscywKKyAgICBib29sIGluY2x1ZGVfZXh0ZXJuYWxfdHlwZXMpIGNvbnN0IHsKKyAgLy8gTm90aGluZworfQorCit2b2lkIEZpZWxkR2VuZXJhdG9yOjpEZXRlcm1pbmVPYmplY3RpdmVDQ2xhc3NEZWZpbml0aW9ucygKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGZ3ZF9kZWNscykgY29uc3QgeworICAvLyBOb3RoaW5nCit9CisKK3ZvaWQgRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRmllbGREZXNjcmlwdGlvbigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCBpbmNsdWRlX2RlZmF1bHQpIGNvbnN0IHsKKyAgLy8gUHJpbnRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgc3RydWN0dXJlIGRlY2wuCisgIGlmIChpbmNsdWRlX2RlZmF1bHQpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLmRlZmF1bHRWYWx1ZS4kZGVmYXVsdF9uYW1lJCA9ICRkZWZhdWx0JCxcbiIKKyAgICAgICAgIiAgLmNvcmUubmFtZSA9IFwiJG5hbWUkXCIsXG4iCisgICAgICAgICIgIC5jb3JlLmRhdGFUeXBlU3BlY2lmaWMuJGRhdGFUeXBlU3BlY2lmaWNfbmFtZSQgPSAkZGF0YVR5cGVTcGVjaWZpY192YWx1ZSQsXG4iCisgICAgICAgICIgIC5jb3JlLm51bWJlciA9ICRmaWVsZF9udW1iZXJfbmFtZSQsXG4iCisgICAgICAgICIgIC5jb3JlLmhhc0luZGV4ID0gJGhhc19pbmRleCQsXG4iCisgICAgICAgICIgIC5jb3JlLm9mZnNldCA9ICRzdG9yYWdlX29mZnNldF92YWx1ZSQsJHN0b3JhZ2Vfb2Zmc2V0X2NvbW1lbnQkXG4iCisgICAgICAgICIgIC5jb3JlLmZsYWdzID0gJGZpZWxkZmxhZ3MkLFxuIgorICAgICAgICAiICAuY29yZS5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlJGZpZWxkX3R5cGUkLFxuIgorICAgICAgICAifSxcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJpYWJsZXNfLAorICAgICAgICAie1xuIgorICAgICAgICAiICAubmFtZSA9IFwiJG5hbWUkXCIsXG4iCisgICAgICAgICIgIC5kYXRhVHlwZVNwZWNpZmljLiRkYXRhVHlwZVNwZWNpZmljX25hbWUkID0gJGRhdGFUeXBlU3BlY2lmaWNfdmFsdWUkLFxuIgorICAgICAgICAiICAubnVtYmVyID0gJGZpZWxkX251bWJlcl9uYW1lJCxcbiIKKyAgICAgICAgIiAgLmhhc0luZGV4ID0gJGhhc19pbmRleCQsXG4iCisgICAgICAgICIgIC5vZmZzZXQgPSAkc3RvcmFnZV9vZmZzZXRfdmFsdWUkLCRzdG9yYWdlX29mZnNldF9jb21tZW50JFxuIgorICAgICAgICAiICAuZmxhZ3MgPSAkZmllbGRmbGFncyQsXG4iCisgICAgICAgICIgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlJGZpZWxkX3R5cGUkLFxuIgorICAgICAgICAifSxcbiIpOworICB9Cit9CisKK3ZvaWQgRmllbGRHZW5lcmF0b3I6OlNldFJ1bnRpbWVIYXNCaXQoaW50IGhhc19pbmRleCkgeworICB2YXJpYWJsZXNfWyJoYXNfaW5kZXgiXSA9IFN0ckNhdChoYXNfaW5kZXgpOworfQorCit2b2lkIEZpZWxkR2VuZXJhdG9yOjpTZXROb0hhc0JpdCh2b2lkKSB7CisgIHZhcmlhYmxlc19bImhhc19pbmRleCJdID0gIkdQQk5vSGFzQml0IjsKK30KKworaW50IEZpZWxkR2VuZXJhdG9yOjpFeHRyYVJ1bnRpbWVIYXNCaXRzTmVlZGVkKHZvaWQpIGNvbnN0IHsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRmllbGRHZW5lcmF0b3I6OlNldEV4dHJhUnVudGltZUhhc0JpdHNCYXNlKGludCBpbmRleF9iYXNlKSB7CisgIC8vIE5PVEU6IHNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjIG1ha2VzIHVzZSBvZiBjZXJyIGZvciBzb21lCisgIC8vIGVycm9yIGNhc2VzLCBzbyBpdCBzZWVtcyB0byBiZSBvayB0byB1c2UgYXMgYSBiYWNrIGRvb3IgZm9yIGVycm9ycy4KKyAgc3RkOjpjZXJyIDw8ICJFcnJvcjogc2hvdWxkIGhhdmUgb3ZlcnJpZGRlbiBTZXRFeHRyYVJ1bnRpbWVIYXNCaXRzQmFzZSgpLiIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNlcnIuZmx1c2goKTsKKyAgYWJvcnQoKTsKK30KKwordm9pZCBGaWVsZEdlbmVyYXRvcjo6U2V0T25lb2ZJbmRleEJhc2UoaW50IGluZGV4X2Jhc2UpIHsKKyAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZiA9IGRlc2NyaXB0b3JfLT5yZWFsX2NvbnRhaW5pbmdfb25lb2YoKTsKKyAgaWYgKG9uZW9mICE9IE5VTEwpIHsKKyAgICBpbnQgaW5kZXggPSBvbmVvZi0+aW5kZXgoKSArIGluZGV4X2Jhc2U7CisgICAgLy8gRmxpcCB0aGUgc2lnbiB0byBtYXJrIGl0IGFzIGEgb25lb2YuCisgICAgdmFyaWFibGVzX1siaGFzX2luZGV4Il0gPSBTdHJDYXQoLWluZGV4KTsKKyAgfQorfQorCitib29sIEZpZWxkR2VuZXJhdG9yOjpXYW50c0hhc1Byb3BlcnR5KHZvaWQpIGNvbnN0IHsKKyAgcmV0dXJuIGRlc2NyaXB0b3JfLT5oYXNfcHJlc2VuY2UoKSAmJiAhZGVzY3JpcHRvcl8tPnJlYWxfY29udGFpbmluZ19vbmVvZigpOworfQorCit2b2lkIEZpZWxkR2VuZXJhdG9yOjpGaW5pc2hJbml0aWFsaXphdGlvbih2b2lkKSB7CisgIC8vIElmICJwcm9wZXJ0eV90eXBlIiB3YXNuJ3Qgc2V0LCBtYWtlIGl0ICJzdG9yYWdlX3R5cGUiLgorICBpZiAoKHZhcmlhYmxlc18uZmluZCgicHJvcGVydHlfdHlwZSIpID09IHZhcmlhYmxlc18uZW5kKCkpICYmCisgICAgICAodmFyaWFibGVzXy5maW5kKCJzdG9yYWdlX3R5cGUiKSAhPSB2YXJpYWJsZXNfLmVuZCgpKSkgeworICAgIHZhcmlhYmxlc19bInByb3BlcnR5X3R5cGUiXSA9IHZhcmlhYmxlKCJzdG9yYWdlX3R5cGUiKTsKKyAgfQorfQorCitTaW5nbGVGaWVsZEdlbmVyYXRvcjo6U2luZ2xlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICAgIDogRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvcikgeworICAvLyBOb3RoaW5nCit9CisKK1NpbmdsZUZpZWxkR2VuZXJhdG9yOjp+U2luZ2xlRmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIFNpbmdsZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUZpZWxkU3RvcmFnZURlY2xhcmF0aW9uKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkc3RvcmFnZV90eXBlJCAkbmFtZSQ7XG4iKTsKK30KKwordm9pZCBTaW5nbGVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQcm9wZXJ0eURlY2xhcmF0aW9uKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkY29tbWVudHMkIik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUpICRwcm9wZXJ0eV90eXBlJCAkbmFtZSQkZGVwcmVjYXRlZF9hdHRyaWJ1dGUkO1xuIgorICAgICAgIlxuIik7CisgIGlmIChXYW50c0hhc1Byb3BlcnR5KCkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgIkBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSkgQk9PTCBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkZGVwcmVjYXRlZF9hdHRyaWJ1dGUkO1xuIik7CisgIH0KK30KKwordm9pZCBTaW5nbGVGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQcm9wZXJ0eUltcGxlbWVudGF0aW9uKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChXYW50c0hhc1Byb3BlcnR5KCkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiQGR5bmFtaWMgaGFzJGNhcGl0YWxpemVkX25hbWUkLCAkbmFtZSQ7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiQGR5bmFtaWMgJG5hbWUkO1xuIik7CisgIH0KK30KKworYm9vbCBTaW5nbGVGaWVsZEdlbmVyYXRvcjo6UnVudGltZVVzZXNIYXNCaXQodm9pZCkgY29uc3QgeworICBpZiAoZGVzY3JpcHRvcl8tPnJlYWxfY29udGFpbmluZ19vbmVvZigpKSB7CisgICAgLy8gVGhlIG9uZW9mIHRyYWNrcyB3aGF0IGlzIHNldCBpbnN0ZWFkLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworT2JqQ09iakZpZWxkR2VuZXJhdG9yOjpPYmpDT2JqRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICAgIDogU2luZ2xlRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvcikgeworICB2YXJpYWJsZXNfWyJwcm9wZXJ0eV9zdG9yYWdlX2F0dHJpYnV0ZSJdID0gInN0cm9uZyI7CisgIGlmIChJc1JldGFpbmVkTmFtZSh2YXJpYWJsZXNfWyJuYW1lIl0pKSB7CisgICAgdmFyaWFibGVzX1sic3RvcmFnZV9hdHRyaWJ1dGUiXSA9ICIgTlNfUkVUVVJOU19OT1RfUkVUQUlORUQiOworICB9Cit9CisKK09iakNPYmpGaWVsZEdlbmVyYXRvcjo6fk9iakNPYmpGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgT2JqQ09iakZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUZpZWxkU3RvcmFnZURlY2xhcmF0aW9uKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkc3RvcmFnZV90eXBlJCAqJG5hbWUkO1xuIik7Cit9CisKK3ZvaWQgT2JqQ09iakZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVByb3BlcnR5RGVjbGFyYXRpb24oCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKworICAvLyBEaWZmZXJzIGZyb20gU2luZ2xlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlUHJvcGVydHlEZWNsYXJhdGlvbigpIGluIHRoYXQKKyAgLy8gaXQgdXNlcyBwb2ludGVycyBhbmQgZGVhbHMgd2l0aCBPYmplY3RpdmUgQydzIHJ1bGVzIGFyb3VuZCBzdG9yYWdlIG5hbWUKKyAgLy8gY29udmVudGlvbnMgKGluaXQqLCBuZXcqLCBldGMuKQorCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkY29tbWVudHMkIik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJAcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUsICRwcm9wZXJ0eV9zdG9yYWdlX2F0dHJpYnV0ZSQsIG51bGxfcmVzZXR0YWJsZSkgJHByb3BlcnR5X3R5cGUkICokbmFtZSQkc3RvcmFnZV9hdHRyaWJ1dGUkJGRlcHJlY2F0ZWRfYXR0cmlidXRlJDtcbiIpOworICBpZiAoV2FudHNIYXNQcm9wZXJ0eSgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcmlhYmxlc18sCisgICAgICAgICIvKiogVGVzdCB0byBzZWUgaWYgQGMgJG5hbWUkIGhhcyBiZWVuIHNldC4gKi9cbiIKKyAgICAgICAgIkBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSkgQk9PTCBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQkZGVwcmVjYXRlZF9hdHRyaWJ1dGUkO1xuIik7CisgIH0KKyAgaWYgKElzSW5pdE5hbWUodmFyaWFibGVzXy5maW5kKCJuYW1lIiktPnNlY29uZCkpIHsKKyAgICAvLyBJZiBwcm9wZXJ0eSBuYW1lIHN0YXJ0cyB3aXRoIGluaXQgd2UgbmVlZCB0byBhbm5vdGF0ZSBpdCB0byBnZXQgcGFzdCBBUkMuCisgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xODcyMzIyNi9ob3ctZG8taS1hbm5vdGF0ZS1hbi1vYmplY3RpdmUtYy1wcm9wZXJ0eS13aXRoLWFuLW9iamMtbWV0aG9kLWZhbWlseS8xODcyMzIyNyMxODcyMzIyNworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgICAgICAgICAgIi0gKCRwcm9wZXJ0eV90eXBlJCAqKSRuYW1lJCBHUEJfTUVUSE9EX0ZBTUlMWV9OT05FJGRlcHJlY2F0ZWRfYXR0cmlidXRlJDtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KCJcbiIpOworfQorCitSZXBlYXRlZEZpZWxkR2VuZXJhdG9yOjpSZXBlYXRlZEZpZWxkR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikKKyAgICA6IE9iakNPYmpGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yKSB7CisgIC8vIERlZmF1bHQgdG8gbm8gY29tbWVudCBhbmQgbGV0IHRoZSBjYXNlcyBuZWVkaW5nIGl0IGZpbGwgaXQgaW4uCisgIHZhcmlhYmxlc19bImFycmF5X2NvbW1lbnQiXSA9ICIiOworfQorCitSZXBlYXRlZEZpZWxkR2VuZXJhdG9yOjp+UmVwZWF0ZWRGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgUmVwZWF0ZWRGaWVsZEdlbmVyYXRvcjo6RmluaXNoSW5pdGlhbGl6YXRpb24odm9pZCkgeworICBGaWVsZEdlbmVyYXRvcjo6RmluaXNoSW5pdGlhbGl6YXRpb24oKTsKKyAgaWYgKHZhcmlhYmxlc18uZmluZCgiYXJyYXlfcHJvcGVydHlfdHlwZSIpID09IHZhcmlhYmxlc18uZW5kKCkpIHsKKyAgICB2YXJpYWJsZXNfWyJhcnJheV9wcm9wZXJ0eV90eXBlIl0gPSB2YXJpYWJsZSgiYXJyYXlfc3RvcmFnZV90eXBlIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZUZpZWxkU3RvcmFnZURlY2xhcmF0aW9uKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkYXJyYXlfc3RvcmFnZV90eXBlJCAqJG5hbWUkO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQcm9wZXJ0eUltcGxlbWVudGF0aW9uKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJAZHluYW1pYyAkbmFtZSQsICRuYW1lJF9Db3VudDtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlUHJvcGVydHlEZWNsYXJhdGlvbigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworCisgIC8vIFJlcGVhdGVkIGZpZWxkcyBkb24ndCBuZWVkIHRoZSBoYXMqIHByb3BlcnRpZXMsIGJ1dCB0aGV5IGRvIGV4cG9zZSBhCisgIC8vICpDb3VudCAodG8gY2hlY2sgd2l0aG91dCBhdXRvY3JlYXRpb24pLiAgU28gZm9yIHRoZSBmaWVsZCBwcm9wZXJ0eSB3ZSBuZWVkCisgIC8vIHRoZSBzYW1lIGxvZ2ljIGFzIE9iakNPYmpGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVQcm9wZXJ0eURlY2xhcmF0aW9uKCkgZm9yCisgIC8vIGRlYWxpbmcgd2l0aCBuZWVkaW5nIE9iamVjdGl2ZSBDJ3MgcnVsZXMgYXJvdW5kIHN0b3JhZ2UgbmFtZSBjb252ZW50aW9ucworICAvLyAoaW5pdCosIG5ldyosIGV0Yy4pCisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIiRjb21tZW50cyQiCisgICAgICAiJGFycmF5X2NvbW1lbnQkIgorICAgICAgIkBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgc3Ryb25nLCBudWxsX3Jlc2V0dGFibGUpICRhcnJheV9wcm9wZXJ0eV90eXBlJCAqJG5hbWUkJHN0b3JhZ2VfYXR0cmlidXRlJCRkZXByZWNhdGVkX2F0dHJpYnV0ZSQ7XG4iCisgICAgICAiLyoqIFRoZSBudW1iZXIgb2YgaXRlbXMgaW4gQGMgJG5hbWUkIHdpdGhvdXQgY2F1c2luZyB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZC4gKi9cbiIKKyAgICAgICJAcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciAkbmFtZSRfQ291bnQkZGVwcmVjYXRlZF9hdHRyaWJ1dGUkO1xuIik7CisgIGlmIChJc0luaXROYW1lKHZhcmlhYmxlc18uZmluZCgibmFtZSIpLT5zZWNvbmQpKSB7CisgICAgLy8gSWYgcHJvcGVydHkgbmFtZSBzdGFydHMgd2l0aCBpbml0IHdlIG5lZWQgdG8gYW5ub3RhdGUgaXQgdG8gZ2V0IHBhc3QgQVJDLgorICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTg3MjMyMjYvaG93LWRvLWktYW5ub3RhdGUtYW4tb2JqZWN0aXZlLWMtcHJvcGVydHktd2l0aC1hbi1vYmpjLW1ldGhvZC1mYW1pbHkvMTg3MjMyMjcjMTg3MjMyMjcKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICAgICAgICAgICItICgkYXJyYXlfcHJvcGVydHlfdHlwZSQgKikkbmFtZSQgR1BCX01FVEhPRF9GQU1JTFlfTk9ORSRkZXByZWNhdGVkX2F0dHJpYnV0ZSQ7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgiXG4iKTsKK30KKworYm9vbCBSZXBlYXRlZEZpZWxkR2VuZXJhdG9yOjpSdW50aW1lVXNlc0hhc0JpdCh2b2lkKSBjb25zdCB7CisgIHJldHVybiBmYWxzZTsgIC8vIFRoZSBhcnJheSAob3IgbWFwL2RpY3QpIGhhdmluZyBhbnl0aGluZyBpcyB3aGF0IGlzIHVzZWQuCit9CisKK0ZpZWxkR2VuZXJhdG9yTWFwOjpGaWVsZEdlbmVyYXRvck1hcChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCisgICAgICBmaWVsZF9nZW5lcmF0b3JzXyhkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpKSwKKyAgICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzXyhkZXNjcmlwdG9yLT5leHRlbnNpb25fY291bnQoKSkgeworICAvLyBDb25zdHJ1Y3QgYWxsIHRoZSBGaWVsZEdlbmVyYXRvcnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc19baV0ucmVzZXQoCisgICAgICAgIEZpZWxkR2VuZXJhdG9yOjpNYWtlKGRlc2NyaXB0b3ItPmZpZWxkKGkpKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLnJlc2V0KAorICAgICAgICBGaWVsZEdlbmVyYXRvcjo6TWFrZShkZXNjcmlwdG9yLT5leHRlbnNpb24oaSkpKTsKKyAgfQorfQorCitGaWVsZEdlbmVyYXRvck1hcDo6fkZpZWxkR2VuZXJhdG9yTWFwKCkge30KKworY29uc3QgRmllbGRHZW5lcmF0b3ImIEZpZWxkR2VuZXJhdG9yTWFwOjpnZXQoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBHT09HTEVfQ0hFQ0tfRVEoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLCBkZXNjcmlwdG9yXyk7CisgIHJldHVybiAqZmllbGRfZ2VuZXJhdG9yc19bZmllbGQtPmluZGV4KCldOworfQorCitjb25zdCBGaWVsZEdlbmVyYXRvciYgRmllbGRHZW5lcmF0b3JNYXA6OmdldF9leHRlbnNpb24oaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiAqZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2luZGV4XTsKK30KKworaW50IEZpZWxkR2VuZXJhdG9yTWFwOjpDYWxjdWxhdGVIYXNCaXRzKHZvaWQpIHsKKyAgaW50IHRvdGFsX2JpdHMgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoZmllbGRfZ2VuZXJhdG9yc19baV0tPlJ1bnRpbWVVc2VzSGFzQml0KCkpIHsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfW2ldLT5TZXRSdW50aW1lSGFzQml0KHRvdGFsX2JpdHMpOworICAgICAgKyt0b3RhbF9iaXRzOworICAgIH0gZWxzZSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzX1tpXS0+U2V0Tm9IYXNCaXQoKTsKKyAgICB9CisgICAgaW50IGV4dHJhX2JpdHMgPSBmaWVsZF9nZW5lcmF0b3JzX1tpXS0+RXh0cmFSdW50aW1lSGFzQml0c05lZWRlZCgpOworICAgIGlmIChleHRyYV9iaXRzKSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzX1tpXS0+U2V0RXh0cmFSdW50aW1lSGFzQml0c0Jhc2UodG90YWxfYml0cyk7CisgICAgICB0b3RhbF9iaXRzICs9IGV4dHJhX2JpdHM7CisgICAgfQorICB9CisgIHJldHVybiB0b3RhbF9iaXRzOworfQorCit2b2lkIEZpZWxkR2VuZXJhdG9yTWFwOjpTZXRPbmVvZkluZGV4QmFzZShpbnQgaW5kZXhfYmFzZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZF9nZW5lcmF0b3JzX1tpXS0+U2V0T25lb2ZJbmRleEJhc2UoaW5kZXhfYmFzZSk7CisgIH0KK30KKworYm9vbCBGaWVsZEdlbmVyYXRvck1hcDo6RG9lc0FueUZpZWxkSGF2ZU5vblplcm9EZWZhdWx0KHZvaWQpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKEhhc05vblplcm9EZWZhdWx0VmFsdWUoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2Ugb2JqZWN0aXZlYworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2ZpZWxkLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OWVmODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5oCkBAIC0wLDAgKzEsMTkwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfT0JKRUNUSVZFQ19GSUVMRF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX09CSkVDVElWRUNfRklFTERfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBvYmplY3RpdmVjIHsKKworY2xhc3MgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgc3RhdGljIEZpZWxkR2VuZXJhdG9yKiBNYWtlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIHZpcnR1YWwgfkZpZWxkR2VuZXJhdG9yKCk7CisKKyAgRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGRHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKyAgRmllbGRHZW5lcmF0b3ImIG9wZXJhdG9yPShjb25zdCBGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworCisgIC8vIEV4cG9zZWQgZm9yIHN1YmNsYXNzZXMgdG8gZmlsbCBpbi4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRmllbGRTdG9yYWdlRGVjbGFyYXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUHJvcGVydHlEZWNsYXJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVQcm9wZXJ0eUltcGxlbWVudGF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisKKyAgLy8gQ2FsbGVkIGJ5IEdlbmVyYXRlRmllbGREZXNjcmlwdGlvbiwgZXhwb3NlZCBmb3IgY2xhc3NlcyB0aGF0IG5lZWQgY3VzdG9tCisgIC8vIGdlbmVyYXRpb24uCisKKyAgLy8gRXhwb3NlZCBmb3Igc3ViY2xhc3NlcyB0byBleHRlbmQsIGJhc2UgZG9lcyBub3RoaW5nLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVDRnVuY3Rpb25EZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVDRnVuY3Rpb25JbXBsZW1lbnRhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCisgIC8vIEV4cG9zZWQgZm9yIHN1YmNsYXNzZXMsIHNob3VsZCBhbHdheXMgY2FsbCBpdCBvbiB0aGUgcGFyZW50IGNsYXNzIGFsc28uCisgIHZpcnR1YWwgdm9pZCBEZXRlcm1pbmVGb3J3YXJkRGVjbGFyYXRpb25zKAorICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBmd2RfZGVjbHMsCisgICAgICBib29sIGluY2x1ZGVfZXh0ZXJuYWxfdHlwZXMpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgRGV0ZXJtaW5lT2JqZWN0aXZlQ0NsYXNzRGVmaW5pdGlvbnMoCisgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGZ3ZF9kZWNscykgY29uc3Q7CisKKyAgLy8gVXNlZCBkdXJpbmcgZ2VuZXJhdGlvbiwgbm90IGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIGJ5IHN1YmNsYXNzZXMuCisgIHZvaWQgR2VuZXJhdGVGaWVsZERlc2NyaXB0aW9uKAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgaW5jbHVkZV9kZWZhdWx0KSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUZpZWxkTnVtYmVyQ29uc3RhbnQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCisgIC8vIEV4cG9zZWQgdG8gZ2V0IGFuZCBzZXQgdGhlIGhhcyBiaXRzIGluZm9ybWF0aW9uLgorICB2aXJ0dWFsIGJvb2wgUnVudGltZVVzZXNIYXNCaXQodm9pZCkgY29uc3QgPSAwOworICB2b2lkIFNldFJ1bnRpbWVIYXNCaXQoaW50IGhhc19pbmRleCk7CisgIHZvaWQgU2V0Tm9IYXNCaXQodm9pZCk7CisgIHZpcnR1YWwgaW50IEV4dHJhUnVudGltZUhhc0JpdHNOZWVkZWQodm9pZCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBTZXRFeHRyYVJ1bnRpbWVIYXNCaXRzQmFzZShpbnQgaW5kZXhfYmFzZSk7CisgIHZvaWQgU2V0T25lb2ZJbmRleEJhc2UoaW50IGluZGV4X2Jhc2UpOworCisgIHN0ZDo6c3RyaW5nIHZhcmlhYmxlKGNvbnN0IGNoYXIqIGtleSkgY29uc3QgeworICAgIHJldHVybiB2YXJpYWJsZXNfLmZpbmQoa2V5KS0+c2Vjb25kOworICB9CisKKyAgYm9vbCBuZWVkc190ZXh0Zm9ybWF0X25hbWVfc3VwcG9ydCgpIGNvbnN0IHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfZmxhZ3MgPSB2YXJpYWJsZSgiZmllbGRmbGFncyIpOworICAgIHJldHVybiBmaWVsZF9mbGFncy5maW5kKCJHUEJGaWVsZFRleHRGb3JtYXROYW1lQ3VzdG9tIikgIT0KKyAgICAgICAgICAgc3RkOjpzdHJpbmc6Om5wb3M7CisgIH0KKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVkX29iamNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIHZhcmlhYmxlKCJuYW1lIik7IH0KKyAgc3RkOjpzdHJpbmcgcmF3X2ZpZWxkX25hbWUoKSBjb25zdCB7IHJldHVybiB2YXJpYWJsZSgicmF3X2ZpZWxkX25hbWUiKTsgfQorCisgcHJvdGVjdGVkOgorICBleHBsaWNpdCBGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisgIHZpcnR1YWwgdm9pZCBGaW5pc2hJbml0aWFsaXphdGlvbih2b2lkKTsKKyAgYm9vbCBXYW50c0hhc1Byb3BlcnR5KHZvaWQpIGNvbnN0OworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyaWFibGVzXzsKK307CisKK2NsYXNzIFNpbmdsZUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflNpbmdsZUZpZWxkR2VuZXJhdG9yKCk7CisKKyAgU2luZ2xlRmllbGRHZW5lcmF0b3IoY29uc3QgU2luZ2xlRmllbGRHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKyAgU2luZ2xlRmllbGRHZW5lcmF0b3ImIG9wZXJhdG9yPShjb25zdCBTaW5nbGVGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUZpZWxkU3RvcmFnZURlY2xhcmF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUHJvcGVydHlEZWNsYXJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUHJvcGVydHlJbXBsZW1lbnRhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCBib29sIFJ1bnRpbWVVc2VzSGFzQml0KHZvaWQpIGNvbnN0IG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBleHBsaWNpdCBTaW5nbGVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworfTsKKworLy8gU3ViY2xhc3Mgd2l0aCBjb21tb24gc3VwcG9ydCBmb3Igd2hlbiB0aGUgZmllbGQgZW5kcyB1cCBhcyBhbiBPYmpDIE9iamVjdC4KK2NsYXNzIE9iakNPYmpGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBTaW5nbGVGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5PYmpDT2JqRmllbGRHZW5lcmF0b3IoKTsKKworICBPYmpDT2JqRmllbGRHZW5lcmF0b3IoY29uc3QgT2JqQ09iakZpZWxkR2VuZXJhdG9yJikgPSBkZWxldGU7CisgIE9iakNPYmpGaWVsZEdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IE9iakNPYmpGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUZpZWxkU3RvcmFnZURlY2xhcmF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUHJvcGVydHlEZWNsYXJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IE9iakNPYmpGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworfTsKKworY2xhc3MgUmVwZWF0ZWRGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBPYmpDT2JqRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+UmVwZWF0ZWRGaWVsZEdlbmVyYXRvcigpOworCisgIFJlcGVhdGVkRmllbGRHZW5lcmF0b3IoY29uc3QgUmVwZWF0ZWRGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworICBSZXBlYXRlZEZpZWxkR2VuZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgUmVwZWF0ZWRGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUZpZWxkU3RvcmFnZURlY2xhcmF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUHJvcGVydHlEZWNsYXJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUHJvcGVydHlJbXBsZW1lbnRhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCBib29sIFJ1bnRpbWVVc2VzSGFzQml0KHZvaWQpIGNvbnN0IG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBleHBsaWNpdCBSZXBlYXRlZEZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIHZpcnR1YWwgdm9pZCBGaW5pc2hJbml0aWFsaXphdGlvbih2b2lkKSBvdmVycmlkZTsKK307CisKKy8vIENvbnZlbmllbmNlIGNsYXNzIHdoaWNoIGNvbnN0cnVjdHMgRmllbGRHZW5lcmF0b3JzIGZvciBhIERlc2NyaXB0b3IuCitjbGFzcyBGaWVsZEdlbmVyYXRvck1hcCB7CisgcHVibGljOgorICBleHBsaWNpdCBGaWVsZEdlbmVyYXRvck1hcChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgfkZpZWxkR2VuZXJhdG9yTWFwKCk7CisKKyAgRmllbGRHZW5lcmF0b3JNYXAoY29uc3QgRmllbGRHZW5lcmF0b3JNYXAmKSA9IGRlbGV0ZTsKKyAgRmllbGRHZW5lcmF0b3JNYXAmIG9wZXJhdG9yPShjb25zdCBGaWVsZEdlbmVyYXRvck1hcCYpID0gZGVsZXRlOworCisgIGNvbnN0IEZpZWxkR2VuZXJhdG9yJiBnZXQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGNvbnN0IEZpZWxkR2VuZXJhdG9yJiBnZXRfZXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gQXNzaWducyB0aGUgaGFzIGJpdHMgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZC4KKyAgaW50IENhbGN1bGF0ZUhhc0JpdHModm9pZCk7CisKKyAgdm9pZCBTZXRPbmVvZkluZGV4QmFzZShpbnQgaW5kZXhfYmFzZSk7CisKKyAgLy8gQ2hlY2sgaWYgYW55IGZpZWxkIG9mIHRoaXMgbWVzc2FnZSBoYXMgYSBub24gemVybyBkZWZhdWx0LgorICBib29sIERvZXNBbnlGaWVsZEhhdmVOb25aZXJvRGVmYXVsdCh2b2lkKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RmllbGRHZW5lcmF0b3I+PiBmaWVsZF9nZW5lcmF0b3JzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEZpZWxkR2VuZXJhdG9yPj4gZXh0ZW5zaW9uX2dlbmVyYXRvcnNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG9iamVjdGl2ZWMKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX09CSkVDVElWRUNfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWxlLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmlsZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGI0Mjg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmlsZS5jYwpAQCAtMCwwICsxLDY4MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPiAvLyBzdGQ6OmZpbmQoKQorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8vIE5PVEU6IHNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjIG1ha2VzIHVzZSBvZiBjZXJyIGZvciBzb21lCisvLyBlcnJvciBjYXNlcywgc28gaXQgc2VlbXMgdG8gYmUgb2sgdG8gdXNlIGFzIGEgYmFjayBkb29yIGZvciBlcnJvcnMuCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2Ugb2JqZWN0aXZlYyB7CisKK25hbWVzcGFjZSB7CisKKy8vIFRoaXMgaXMgYWxzbyBmb3VuZCBpbiBHUEJCb290c3RyYXAuaCwgYW5kIG5lZWRzIHRvIGJlIGtlcHQgaW4gc3luYy4KK2NvbnN0IGludDMyX3QgR09PR0xFX1BST1RPQlVGX09CSkNfVkVSU0lPTiA9IDMwMDA0OworCitjb25zdCBjaGFyKiBrSGVhZGVyRXh0ZW5zaW9uID0gIi5wYm9iamMuaCI7CisKK3N0ZDo6c3RyaW5nIEJ1bmRsZWRGaWxlTmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICByZXR1cm4gIkdQQiIgKyBGaWxlUGF0aEJhc2VuYW1lKGZpbGUpICsga0hlYWRlckV4dGVuc2lvbjsKK30KKworLy8gQ2hlY2tzIGlmIGEgbWVzc2FnZSBjb250YWlucyBhbnkgZW51bXMgZGVmaW5pdGlvbnMgKG9uIHRoZSBtZXNzYWdlIG9yCisvLyBhIG5lc3RlZCBtZXNzYWdlIHVuZGVyIGl0KS4KK2Jvb2wgTWVzc2FnZUNvbnRhaW5zRW51bXMoY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSkgeworICBpZiAobWVzc2FnZS0+ZW51bV90eXBlX2NvdW50KCkgPiAwKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoTWVzc2FnZUNvbnRhaW5zRW51bXMobWVzc2FnZS0+bmVzdGVkX3R5cGUoaSkpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBDaGVja3MgaWYgYSBtZXNzYWdlIGNvbnRhaW5zIGFueSBleHRlbnNpb24gZGVmaW5pdGlvbnMgKG9uIHRoZSBtZXNzYWdlIG9yCisvLyBhIG5lc3RlZCBtZXNzYWdlIHVuZGVyIGl0KS4KK2Jvb2wgTWVzc2FnZUNvbnRhaW5zRXh0ZW5zaW9ucyhjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlKSB7CisgIGlmIChtZXNzYWdlLT5leHRlbnNpb25fY291bnQoKSA+IDApIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGlmIChNZXNzYWdlQ29udGFpbnNFeHRlbnNpb25zKG1lc3NhZ2UtPm5lc3RlZF90eXBlKGkpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gQ2hlY2tzIGlmIHRoZSBmaWxlIGNvbnRhaW5zIGFueSBlbnVtIGRlZmluaXRpb25zIChhdCB0aGUgcm9vdCBvcgorLy8gbmVzdGVkIHVuZGVyIGEgbWVzc2FnZSkuCitib29sIEZpbGVDb250YWluc0VudW1zKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIGlmIChmaWxlLT5lbnVtX3R5cGVfY291bnQoKSA+IDApIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoTWVzc2FnZUNvbnRhaW5zRW51bXMoZmlsZS0+bWVzc2FnZV90eXBlKGkpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gQ2hlY2tzIGlmIHRoZSBmaWxlIGNvbnRhaW5zIGFueSBleHRlbnNpb25zIGRlZmluaXRpb25zIChhdCB0aGUgcm9vdCBvcgorLy8gbmVzdGVkIHVuZGVyIGEgbWVzc2FnZSkuCitib29sIEZpbGVDb250YWluc0V4dGVuc2lvbnMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgaWYgKGZpbGUtPmV4dGVuc2lvbl9jb3VudCgpID4gMCkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGlmIChNZXNzYWdlQ29udGFpbnNFeHRlbnNpb25zKGZpbGUtPm1lc3NhZ2VfdHlwZShpKSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSXNEaXJlY3REZXBlbmRlbmN5KGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXAsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoZGVwID09IGZpbGUtPmRlcGVuZGVuY3koaSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0cnVjdCBGaWxlRGVzY3JpcHRvcnNPcmRlcmVkQnlOYW1lIHsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBGaWxlRGVzY3JpcHRvciogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogYikgY29uc3QgeworICAgIHJldHVybiBhLT5uYW1lKCkgPCBiLT5uYW1lKCk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitGaWxlR2VuZXJhdG9yOjpDb21tb25TdGF0ZTo6Q29tbW9uU3RhdGUoKSB7IH0KKworY29uc3QgRmlsZUdlbmVyYXRvcjo6Q29tbW9uU3RhdGU6Ok1pbkRlcHNFbnRyeSYKK0ZpbGVHZW5lcmF0b3I6OkNvbW1vblN0YXRlOjpDb2xsZWN0TWluaW1hbEZpbGVEZXBzQ29udGFpbmluZ0V4dGVuc2lvbnNJbnRlcm5hbCgKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICBhdXRvIGl0ID0gZGVwc19pbmZvX2NhY2hlXy5maW5kKGZpbGUpOworICBpZiAoaXQgIT0gZGVwc19pbmZvX2NhY2hlXy5lbmQoKSkgeworICAgIHJldHVybiBpdC0+c2Vjb25kOworICB9CisKKyAgc3RkOjpzZXQ8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBtaW5fZGVwc19jb2xsZWN0b3I7CisgIHN0ZDo6c2V0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gY292ZXJlZF9kZXBzX2NvbGxlY3RvcjsKKyAgc3RkOjpzZXQ8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiB0b19wcnVuZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXAgPSBmaWxlLT5kZXBlbmRlbmN5KGkpOworICAgIE1pbkRlcHNFbnRyeSBkZXBfaW5mbyA9CisgICAgICAgIENvbGxlY3RNaW5pbWFsRmlsZURlcHNDb250YWluaW5nRXh0ZW5zaW9uc0ludGVybmFsKGRlcCk7CisKKyAgICAvLyBFdmVyeXRoaW5nIHRoZSBkZXAgY292ZXJlZCwgdGhpcyBmaWxlIHdpbGwgYWxzbyBjb3Zlci4KKyAgICBjb3ZlcmVkX2RlcHNfY29sbGVjdG9yLmluc2VydChkZXBfaW5mby5jb3ZlcmVkX2RlcHMuYmVnaW4oKSwgZGVwX2luZm8uY292ZXJlZF9kZXBzLmVuZCgpKTsKKyAgICAvLyBQcnVuZSBldmVyeXRoaW5nIGZyb20gdGhlIGRlcCdzIGNvdmVyZWQgbGlzdCBpbiBjYXNlIGFub3RoZXIgZGVwIGxpc3RzIGl0CisgICAgLy8gYXMgYSBtaW4gZGVwLgorICAgIHRvX3BydW5lLmluc2VydChkZXBfaW5mby5jb3ZlcmVkX2RlcHMuYmVnaW4oKSwgZGVwX2luZm8uY292ZXJlZF9kZXBzLmVuZCgpKTsKKworICAgIC8vIERvZXMgdGhlIGRlcCBoYXZlIGFueSBleHRlbnNpb25zLi4uCisgICAgaWYgKGRlcF9pbmZvLmhhc19leHRlbnNpb25zKSB7CisgICAgICAvLyBZZXMgLT4gQWRkIHRoaXMgZmlsZSwgcHJ1bmUgaXRzIG1pbl9kZXBzIGFuZCBhZGQgdGhlbSB0byB0aGUgY292ZXJlZCBkZXBzLgorICAgICAgbWluX2RlcHNfY29sbGVjdG9yLmluc2VydChkZXApOworICAgICAgdG9fcHJ1bmUuaW5zZXJ0KGRlcF9pbmZvLm1pbl9kZXBzLmJlZ2luKCksIGRlcF9pbmZvLm1pbl9kZXBzLmVuZCgpKTsKKyAgICAgIGNvdmVyZWRfZGVwc19jb2xsZWN0b3IuaW5zZXJ0KGRlcF9pbmZvLm1pbl9kZXBzLmJlZ2luKCksIGRlcF9pbmZvLm1pbl9kZXBzLmVuZCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTm8gLT4gSnVzdCB1c2UgaXRzIG1pbl9kZXBzLgorICAgICAgbWluX2RlcHNfY29sbGVjdG9yLmluc2VydChkZXBfaW5mby5taW5fZGVwcy5iZWdpbigpLCBkZXBfaW5mby5taW5fZGVwcy5lbmQoKSk7CisgICAgfQorICB9CisKKyAgY29uc3QgYm9vbCBmaWxlX2hhc19leHRzID0gRmlsZUNvbnRhaW5zRXh0ZW5zaW9ucyhmaWxlKTsKKworICAvLyBGYXN0IHBhdGg6IGlmIG5vdGhpbmcgdG8gcHJ1bmUgb3IgdGhlcmUgd2FzIG9ubHkgb25lIGRlcCwgdGhlIHBydW5lIHdvcmsgaXMKKyAgLy8gYSB3YXN0ZSwgc2tpcCBpdC4KKyAgaWYgKHRvX3BydW5lLmVtcHR5KCkgfHwgZmlsZS0+ZGVwZW5kZW5jeV9jb3VudCgpID09IDEpIHsKKyAgICByZXR1cm4gZGVwc19pbmZvX2NhY2hlXy5pbnNlcnQoCisgICAgICAgIHtmaWxlLCB7ZmlsZV9oYXNfZXh0cywgbWluX2RlcHNfY29sbGVjdG9yLCBjb3ZlcmVkX2RlcHNfY29sbGVjdG9yfX0pLmZpcnN0LT5zZWNvbmQ7CisgIH0KKworICBzdGQ6OnNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IG1pbl9kZXBzOworICBzdGQ6OmNvcHlfaWYobWluX2RlcHNfY29sbGVjdG9yLmJlZ2luKCksIG1pbl9kZXBzX2NvbGxlY3Rvci5lbmQoKSwKKyAgICAgICAgICAgICAgIHN0ZDo6aW5zZXJ0ZXIobWluX2RlcHMsIG1pbl9kZXBzLmVuZCgpKSwKKyAgICAgICAgICAgICAgIFsmXShjb25zdCBGaWxlRGVzY3JpcHRvciogdmFsdWUpeworICAgIHJldHVybiB0b19wcnVuZS5maW5kKHZhbHVlKSA9PSB0b19wcnVuZS5lbmQoKTsKKyAgfSk7CisgIHJldHVybiBkZXBzX2luZm9fY2FjaGVfLmluc2VydCgKKyAgICAgIHtmaWxlLCB7ZmlsZV9oYXNfZXh0cywgbWluX2RlcHMsIGNvdmVyZWRfZGVwc19jb2xsZWN0b3J9fSkuZmlyc3QtPnNlY29uZDsKK30KKworLy8gQ29sbGVjdCB0aGUgZGVwcyBvZiB0aGUgZ2l2ZW4gZmlsZSB0aGF0IGNvbnRhaW4gZXh0ZW5zaW9ucy4gVGhpcyBjYW4gYmUgdXNlZCB0bworLy8gY3JlYXRlIHRoZSBjaGFpbiBvZiByb290cyB0aGF0IG5lZWQgdG8gYmUgd2lyZWQgdG9nZXRoZXIuCisvLworLy8gTk9URTogSWYgYW55IGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhpcyBhbmQgdGhlIHN1cHBvcnRpbmcgZnVuY3Rpb25zLCB5b3Ugd2lsbAorLy8gbmVlZCB0byBtYW51YWxseSB2YWxpZGF0ZSB3aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBpcyBmb3IgdGhlIHRlc3QgZmlsZXM6CisvLyAgIG9iamVjdGl2ZWMvVGVzdHMvdW5pdHRlc3RfZXh0ZW5zaW9uX2NoYWluXyoucHJvdG8KKy8vIFRoZXJlIGFyZSBjb21tZW50cyBhYm91dCB3aGF0IHRoZSBleHBlY3RlZCBjb2RlIHNob3VsZCBiZSBsaW5lIGFuZCBsaW1pdGVkCisvLyB0ZXN0aW5nIG9iamVjdGl2ZWMvVGVzdHMvR1BCVW5pdHRlc3RQcm90b3MyLm0gYXJvdW5kIGNvbXBpbGF0aW9uICgjaW1wb3J0cworLy8gc3BlY2lmaWNhbGx5KS4KK2NvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4KK0ZpbGVHZW5lcmF0b3I6OkNvbW1vblN0YXRlOjpDb2xsZWN0TWluaW1hbEZpbGVEZXBzQ29udGFpbmluZ0V4dGVuc2lvbnMoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgc3RkOjpzZXQ8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBtaW5fZGVwcyA9CisgICAgQ29sbGVjdE1pbmltYWxGaWxlRGVwc0NvbnRhaW5pbmdFeHRlbnNpb25zSW50ZXJuYWwoZmlsZSkubWluX2RlcHM7CisgIC8vIFNvcnQgdGhlIGxpc3Qgc2luY2UgcG9pbnRlciBvcmRlciBpc24ndCBzdGFibGUgYWNyb3NzIHJ1bnMuCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gcmVzdWx0KG1pbl9kZXBzLmJlZ2luKCksIG1pbl9kZXBzLmVuZCgpKTsKKyAgc3RkOjpzb3J0KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCksIEZpbGVEZXNjcmlwdG9yc09yZGVyZWRCeU5hbWUoKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0ZpbGVHZW5lcmF0b3I6OkZpbGVHZW5lcmF0b3IoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdlbmVyYXRpb25PcHRpb25zJiBnZW5lcmF0aW9uX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblN0YXRlJiBjb21tb25fc3RhdGUpCisgICAgOiBmaWxlXyhmaWxlKSwKKyAgICAgIGdlbmVyYXRpb25fb3B0aW9uc18oZ2VuZXJhdGlvbl9vcHRpb25zKSwKKyAgICAgIGNvbW1vbl9zdGF0ZV8oY29tbW9uX3N0YXRlKSwKKyAgICAgIHJvb3RfY2xhc3NfbmFtZV8oRmlsZUNsYXNzTmFtZShmaWxlKSksCisgICAgICBpc19idW5kbGVkX3Byb3RvXyhJc1Byb3RvYnVmTGlicmFyeUJ1bmRsZWRQcm90b0ZpbGUoZmlsZSkpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIEVudW1HZW5lcmF0b3IqIGdlbmVyYXRvciA9IG5ldyBFbnVtR2VuZXJhdG9yKGZpbGVfLT5lbnVtX3R5cGUoaSkpOworICAgIGVudW1fZ2VuZXJhdG9yc18uZW1wbGFjZV9iYWNrKGdlbmVyYXRvcik7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIE1lc3NhZ2VHZW5lcmF0b3IqIGdlbmVyYXRvciA9CisgICAgICAgIG5ldyBNZXNzYWdlR2VuZXJhdG9yKHJvb3RfY2xhc3NfbmFtZV8sIGZpbGVfLT5tZXNzYWdlX3R5cGUoaSkpOworICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc18uZW1wbGFjZV9iYWNrKGdlbmVyYXRvcik7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIEV4dGVuc2lvbkdlbmVyYXRvciogZ2VuZXJhdG9yID0KKyAgICAgICAgbmV3IEV4dGVuc2lvbkdlbmVyYXRvcihyb290X2NsYXNzX25hbWVfLCBmaWxlXy0+ZXh0ZW5zaW9uKGkpKTsKKyAgICBleHRlbnNpb25fZ2VuZXJhdG9yc18uZW1wbGFjZV9iYWNrKGdlbmVyYXRvcik7CisgIH0KK30KKworRmlsZUdlbmVyYXRvcjo6fkZpbGVHZW5lcmF0b3IoKSB7fQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBoZWFkZXJzOworICAvLyBHZW5lcmF0ZWQgZmlsZXMgYnVuZGxlZCB3aXRoIHRoZSBsaWJyYXJ5IGdldCBtaW5pbWFsIGltcG9ydHMsIGV2ZXJ5dGhpbmcKKyAgLy8gZWxzZSBnZXRzIHRoZSB3cmFwcGVyIHNvIGV2ZXJ5dGhpbmcgaXMgdXNhYmxlLgorICBpZiAoaXNfYnVuZGxlZF9wcm90b18pIHsKKyAgICBoZWFkZXJzLnB1c2hfYmFjaygiR1BCRGVzY3JpcHRvci5oIik7CisgICAgaGVhZGVycy5wdXNoX2JhY2soIkdQQk1lc3NhZ2UuaCIpOworICAgIGhlYWRlcnMucHVzaF9iYWNrKCJHUEJSb290T2JqZWN0LmgiKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgaGVhZGVyX25hbWUgPSBCdW5kbGVkRmlsZU5hbWUoZmlsZV8tPmRlcGVuZGVuY3koaSkpOworICAgICAgaGVhZGVycy5wdXNoX2JhY2soaGVhZGVyX25hbWUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBoZWFkZXJzLnB1c2hfYmFjaygiR1BCUHJvdG9jb2xCdWZmZXJzLmgiKTsKKyAgfQorICBQcmludEZpbGVSdW50aW1lUHJlYW1ibGUocHJpbnRlciwgaGVhZGVycyk7CisKKyAgLy8gQWRkIHNvbWUgdmVyaWZpY2F0aW9uIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIG1hdGNoZXMgdGhlIHNvdXJjZSB0aGUKKyAgLy8gY29kZSBpcyBiZWluZyBjb21waWxlZCB3aXRoLgorICAvLyBOT1RFOiBUaGlzIGNhcHR1cmVzIHRoZSByYXcgbnVtZXJpYyB2YWx1ZXMgYXQgdGhlIHRpbWUgdGhlIGdlbmVyYXRvciB3YXMKKyAgLy8gY29tcGlsZWQsIHNpbmNlIHRoYXQgd2lsbCBiZSB0aGUgdmVyc2lvbnMgZm9yIHRoZSBPYmpDIHJ1bnRpbWUgYXQgdGhhdAorICAvLyB0aW1lLiAgVGhlIGNvbnN0YW50cyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgd2lsbCB0aGVuIGdldCB0aGVpciB2YWx1ZXMgYXQKKyAgLy8gYXQgY29tcGlsZSB0aW1lIChzbyBjaGVja2luZyBhZ2FpbnN0IHRoZSBoZWFkZXJzIGJlaW5nIHVzZWQgdG8gY29tcGlsZSkuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIiNpZiBHT09HTEVfUFJPVE9CVUZfT0JKQ19WRVJTSU9OIDwgJGdvb2dsZV9wcm90b2J1Zl9vYmpjX3ZlcnNpb24kXG4iCisgICAgICAiI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgbGlicmFyeSBzb3VyY2VzLlxuIgorICAgICAgIiNlbmRpZlxuIgorICAgICAgIiNpZiAkZ29vZ2xlX3Byb3RvYnVmX29iamNfdmVyc2lvbiQgPCBHT09HTEVfUFJPVE9CVUZfT0JKQ19NSU5fU1VQUE9SVEVEX1ZFUlNJT05cbiIKKyAgICAgICIjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgbGlicmFyeSBzb3VyY2VzLlxuIgorICAgICAgIiNlbmRpZlxuIgorICAgICAgIlxuIiwKKyAgICAgICJnb29nbGVfcHJvdG9idWZfb2JqY192ZXJzaW9uIiwgU3RyQ2F0KEdPT0dMRV9QUk9UT0JVRl9PQkpDX1ZFUlNJT04pKTsKKworICAvLyBUaGUgYnVuZGxlZCBwcm90b3MgKFdLVHMpIGRvbid0IHVzZSBvZiBmb3J3YXJkIGRlY2xhcmF0aW9ucy4KKyAgYm9vbCBoZWFkZXJzX3VzZV9mb3J3YXJkX2RlY2xhcmF0aW9ucyA9CisgICAgICBnZW5lcmF0aW9uX29wdGlvbnNfLmhlYWRlcnNfdXNlX2ZvcndhcmRfZGVjbGFyYXRpb25zICYmICFpc19idW5kbGVkX3Byb3RvXzsKKworICB7CisgICAgSW1wb3J0V3JpdGVyIGltcG9ydF93cml0ZXIoCisgICAgICAgIGdlbmVyYXRpb25fb3B0aW9uc18uZ2VuZXJhdGVfZm9yX25hbWVkX2ZyYW1ld29yaywKKyAgICAgICAgZ2VuZXJhdGlvbl9vcHRpb25zXy5uYW1lZF9mcmFtZXdvcmtfdG9fcHJvdG9fcGF0aF9tYXBwaW5nc19wYXRoLAorICAgICAgICBnZW5lcmF0aW9uX29wdGlvbnNfLnJ1bnRpbWVfaW1wb3J0X3ByZWZpeCwKKyAgICAgICAgLyogaW5jbHVkZV93a3RfaW1wb3J0cyA9ICovIGZhbHNlKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBoZWFkZXJfZXh0ZW5zaW9uKGtIZWFkZXJFeHRlbnNpb24pOworICAgIGlmIChoZWFkZXJzX3VzZV9mb3J3YXJkX2RlY2xhcmF0aW9ucykgeworICAgICAgLy8gI2ltcG9ydCBhbnkgaGVhZGVycyBmb3IgInB1YmxpYyBpbXBvcnRzIiBpbiB0aGUgcHJvdG8gZmlsZS4KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnB1YmxpY19kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgICAgICBpbXBvcnRfd3JpdGVyLkFkZEZpbGUoZmlsZV8tPnB1YmxpY19kZXBlbmRlbmN5KGkpLCBoZWFkZXJfZXh0ZW5zaW9uKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgaW1wb3J0X3dyaXRlci5BZGRGaWxlKGZpbGVfLT5kZXBlbmRlbmN5KGkpLCBoZWFkZXJfZXh0ZW5zaW9uKTsKKyAgICAgIH0KKyAgICB9CisgICAgaW1wb3J0X3dyaXRlci5QcmludChwcmludGVyKTsKKyAgfQorCisgIC8vIE5vdGU6CisgIC8vICBkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyBzdXBwcmVzc2lvbiBpcyBvbmx5IG5lZWRlZCBpZiBzb21lIHBsYWNlIGluIHRoaXMKKyAgLy8gICAgcHJvdG8gZmlsZSBpcyBzb21ldGhpbmcgZGVwcmVjYXRlZCBvciBpZiBpdCByZWZlcmVuY2VzIHNvbWV0aGluZyBmcm9tCisgIC8vICAgIGFub3RoZXIgZmlsZSB0aGF0IGlzIGRlcHJlY2F0ZWQuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKVxuIgorICAgICAgIlxuIgorICAgICAgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoXG4iCisgICAgICAiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zXCJcbiIKKyAgICAgICJcbiIKKyAgICAgICJDRl9FWFRFUk5fQ19CRUdJTlxuIgorICAgICAgIlxuIik7CisKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGZ3ZF9kZWNsczsKKyAgZm9yIChjb25zdCBhdXRvJiBnZW5lcmF0b3IgOiBtZXNzYWdlX2dlbmVyYXRvcnNfKSB7CisgICAgZ2VuZXJhdG9yLT5EZXRlcm1pbmVGb3J3YXJkRGVjbGFyYXRpb25zKAorICAgICAgICAmZndkX2RlY2xzLAorICAgICAgICAvKiBpbmNsdWRlX2V4dGVybmFsX3R5cGVzID0gKi8gaGVhZGVyc191c2VfZm9yd2FyZF9kZWNsYXJhdGlvbnMpOworICB9CisgIGZvciAoc3RkOjpzZXQ8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpKGZ3ZF9kZWNscy5iZWdpbigpKTsKKyAgICAgICBpICE9IGZ3ZF9kZWNscy5lbmQoKTsgKytpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIiR2YWx1ZSQ7XG4iLCAidmFsdWUiLCAqaSk7CisgIH0KKyAgaWYgKGZ3ZF9kZWNscy5iZWdpbigpICE9IGZ3ZF9kZWNscy5lbmQoKSkgeworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiTlNfQVNTVU1FX05PTk5VTExfQkVHSU5cbiIKKyAgICAgICJcbiIpOworCisgIC8vIG5lZWQgdG8gd3JpdGUgb3V0IGFsbCBlbnVtcyBmaXJzdAorICBmb3IgKGNvbnN0IGF1dG8mIGdlbmVyYXRvciA6IGVudW1fZ2VuZXJhdG9yc18pIHsKKyAgICBnZW5lcmF0b3ItPkdlbmVyYXRlSGVhZGVyKHByaW50ZXIpOworICB9CisKKyAgZm9yIChjb25zdCBhdXRvJiBnZW5lcmF0b3IgOiBtZXNzYWdlX2dlbmVyYXRvcnNfKSB7CisgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZUVudW1IZWFkZXIocHJpbnRlcik7CisgIH0KKworICAvLyBGb3IgZXh0ZW5zaW9ucyB0byBjaGFpbiB0b2dldGhlciwgdGhlIFJvb3QgZ2V0cyBjcmVhdGVkIGV2ZW4gaWYgdGhlcmUKKyAgLy8gYXJlIG5vIGV4dGVuc2lvbnMuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIiNwcmFnbWEgbWFyayAtICRyb290X2NsYXNzX25hbWUkXG4iCisgICAgICAiXG4iCisgICAgICAiLyoqXG4iCisgICAgICAiICogRXhwb3NlcyB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5IGZvciB0aGlzIGZpbGUuXG4iCisgICAgICAiICpcbiIKKyAgICAgICIgKiBUaGUgYmFzZSBjbGFzcyBwcm92aWRlczpcbiIKKyAgICAgICIgKiBAY29kZVxuIgorICAgICAgIiAqICAgKyAoR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKilleHRlbnNpb25SZWdpc3RyeTtcbiIKKyAgICAgICIgKiBAZW5kY29kZVxuIgorICAgICAgIiAqIHdoaWNoIGlzIGEgQGMgR1BCRXh0ZW5zaW9uUmVnaXN0cnkgdGhhdCBpbmNsdWRlcyBhbGwgdGhlIGV4dGVuc2lvbnMgZGVmaW5lZCBieVxuIgorICAgICAgIiAqIHRoaXMgZmlsZSBhbmQgYWxsIGZpbGVzIHRoYXQgaXQgZGVwZW5kcyBvbi5cbiIKKyAgICAgICIgKiovXG4iCisgICAgICAiR1BCX0ZJTkFMIEBpbnRlcmZhY2UgJHJvb3RfY2xhc3NfbmFtZSQgOiBHUEJSb290T2JqZWN0XG4iCisgICAgICAiQGVuZFxuIgorICAgICAgIlxuIiwKKyAgICAgICJyb290X2NsYXNzX25hbWUiLCByb290X2NsYXNzX25hbWVfKTsKKworICBpZiAoIWV4dGVuc2lvbl9nZW5lcmF0b3JzXy5lbXB0eSgpKSB7CisgICAgLy8gVGhlIGR5bmFtaWMgbWV0aG9kcyBibG9jayBpcyBvbmx5IG5lZWRlZCBpZiB0aGVyZSBhcmUgZXh0ZW5zaW9ucy4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIkBpbnRlcmZhY2UgJHJvb3RfY2xhc3NfbmFtZSQgKER5bmFtaWNNZXRob2RzKVxuIiwKKyAgICAgICAgInJvb3RfY2xhc3NfbmFtZSIsIHJvb3RfY2xhc3NfbmFtZV8pOworCisgICAgZm9yIChjb25zdCBhdXRvJiBnZW5lcmF0b3IgOiBleHRlbnNpb25fZ2VuZXJhdG9yc18pIHsKKyAgICAgIGdlbmVyYXRvci0+R2VuZXJhdGVNZW1iZXJzSGVhZGVyKHByaW50ZXIpOworICAgIH0KKworICAgIHByaW50ZXItPlByaW50KCJAZW5kXG5cbiIpOworICB9ICAvLyAhZXh0ZW5zaW9uX2dlbmVyYXRvcnNfLmVtcHR5KCkKKworICBmb3IgKGNvbnN0IGF1dG8mIGdlbmVyYXRvciA6IG1lc3NhZ2VfZ2VuZXJhdG9yc18pIHsKKyAgICBnZW5lcmF0b3ItPkdlbmVyYXRlTWVzc2FnZUhlYWRlcihwcmludGVyKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICAgIk5TX0FTU1VNRV9OT05OVUxMX0VORFxuIgorICAgICAgIlxuIgorICAgICAgIkNGX0VYVEVSTl9DX0VORFxuIgorICAgICAgIlxuIgorICAgICAgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3BcbiIKKyAgICAgICJcbiIKKyAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKVxuIik7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVTb3VyY2UoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gI2ltcG9ydCB0aGUgcnVudGltZSBzdXBwb3J0LgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaGVhZGVyczsKKyAgaGVhZGVycy5wdXNoX2JhY2soIkdQQlByb3RvY29sQnVmZmVyc19SdW50aW1lU3VwcG9ydC5oIik7CisgIGlmIChpc19idW5kbGVkX3Byb3RvXykgeworICAgIGhlYWRlcnMucHVzaF9iYWNrKEJ1bmRsZWRGaWxlTmFtZShmaWxlXykpOworICB9CisgIFByaW50RmlsZVJ1bnRpbWVQcmVhbWJsZShwcmludGVyLCBoZWFkZXJzKTsKKworICAvLyBFbnVtcyB1c2UgYXRvbWljIGluIHRoZSBnZW5lcmF0ZWQgY29kZSwgc28gYWRkIHRoZSBzeXN0ZW0gaW1wb3J0IGFzIG5lZWRlZC4KKyAgaWYgKEZpbGVDb250YWluc0VudW1zKGZpbGVfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiI2ltcG9ydCA8c3RkYXRvbWljLmg+XG4iCisgICAgICAgICJcbiIpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBkZXBzX3dpdGhfZXh0ZW5zaW9ucyA9CisgICAgY29tbW9uX3N0YXRlXy5Db2xsZWN0TWluaW1hbEZpbGVEZXBzQ29udGFpbmluZ0V4dGVuc2lvbnMoZmlsZV8pOworCisgIC8vIFRoZSBidW5kbGVkIHByb3RvcyAoV0tUcykgZG9uJ3QgdXNlIG9mIGZvcndhcmQgZGVjbGFyYXRpb25zLgorICBib29sIGhlYWRlcnNfdXNlX2ZvcndhcmRfZGVjbGFyYXRpb25zID0KKyAgICAgIGdlbmVyYXRpb25fb3B0aW9uc18uaGVhZGVyc191c2VfZm9yd2FyZF9kZWNsYXJhdGlvbnMgJiYgIWlzX2J1bmRsZWRfcHJvdG9fOworCisgIHsKKyAgICBJbXBvcnRXcml0ZXIgaW1wb3J0X3dyaXRlcigKKyAgICAgICAgZ2VuZXJhdGlvbl9vcHRpb25zXy5nZW5lcmF0ZV9mb3JfbmFtZWRfZnJhbWV3b3JrLAorICAgICAgICBnZW5lcmF0aW9uX29wdGlvbnNfLm5hbWVkX2ZyYW1ld29ya190b19wcm90b19wYXRoX21hcHBpbmdzX3BhdGgsCisgICAgICAgIGdlbmVyYXRpb25fb3B0aW9uc18ucnVudGltZV9pbXBvcnRfcHJlZml4LAorICAgICAgICAvKiBpbmNsdWRlX3drdF9pbXBvcnRzID0gKi8gZmFsc2UpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGhlYWRlcl9leHRlbnNpb24oa0hlYWRlckV4dGVuc2lvbik7CisKKyAgICAvLyAjaW1wb3J0IHRoZSBoZWFkZXIgZm9yIHRoaXMgcHJvdG8gZmlsZS4KKyAgICBpbXBvcnRfd3JpdGVyLkFkZEZpbGUoZmlsZV8sIGhlYWRlcl9leHRlbnNpb24pOworCisgICAgaWYgKGhlYWRlcnNfdXNlX2ZvcndhcmRfZGVjbGFyYXRpb25zKSB7CisgICAgICAvLyAjaW1wb3J0IHRoZSBoZWFkZXJzIGZvciBhbnl0aGluZyB0aGF0IGEgcGxhaW4gZGVwZW5kZW5jeSBvZiB0aGlzIHByb3RvCisgICAgICAvLyBmaWxlICh0aGF0IG1lYW5zIHRoZXkgd2VyZSBqdXN0IGFuIGluY2x1ZGUsIG5vdCBhICJwdWJsaWMiIGluY2x1ZGUpLgorICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHB1YmxpY19pbXBvcnRfbmFtZXM7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5wdWJsaWNfZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgcHVibGljX2ltcG9ydF9uYW1lcy5pbnNlcnQoZmlsZV8tPnB1YmxpY19kZXBlbmRlbmN5KGkpLT5uYW1lKCkpOworICAgICAgfQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IgKmRlcCA9IGZpbGVfLT5kZXBlbmRlbmN5KGkpOworICAgICAgICBib29sIHB1YmxpY19pbXBvcnQgPSAocHVibGljX2ltcG9ydF9uYW1lcy5jb3VudChkZXAtPm5hbWUoKSkgIT0gMCk7CisgICAgICAgIGlmICghcHVibGljX2ltcG9ydCkgeworICAgICAgICAgIGltcG9ydF93cml0ZXIuQWRkRmlsZShkZXAsIGhlYWRlcl9leHRlbnNpb24pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgYW55IGluZGlyZWN0IGRlcGVuZGVuY3kgcHJvdmlkZWQgZXh0ZW5zaW9ucywgaXQgbmVlZHMgdG8gYmUgZGlyZWN0bHkKKyAgICAvLyBpbXBvcnRlZCBzbyBpdCBjYW4gZ2V0IG1lcmdlZCBpbnRvIHRoZSByb290J3MgZXh0ZW5zaW9ucyByZWdpc3RyeS4KKyAgICAvLyBTZWUgdGhlIE5vdGUgYnkgQ29sbGVjdE1pbmltYWxGaWxlRGVwc0NvbnRhaW5pbmdFeHRlbnNpb25zIGJlZm9yZQorICAgIC8vIGNoYW5naW5nIHRoaXMuCisgICAgZm9yIChzdGQ6OnZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+OjppdGVyYXRvciBpdGVyID0KKyAgICAgICAgICAgICBkZXBzX3dpdGhfZXh0ZW5zaW9ucy5iZWdpbigpOworICAgICAgICAgaXRlciAhPSBkZXBzX3dpdGhfZXh0ZW5zaW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiAoIUlzRGlyZWN0RGVwZW5kZW5jeSgqaXRlciwgZmlsZV8pKSB7CisgICAgICAgIGltcG9ydF93cml0ZXIuQWRkRmlsZSgqaXRlciwgaGVhZGVyX2V4dGVuc2lvbik7CisgICAgICB9CisgICAgfQorCisgICAgaW1wb3J0X3dyaXRlci5QcmludChwcmludGVyKTsKKyAgfQorCisgIGJvb2wgaW5jbHVkZXNfb25lb2YgPSBmYWxzZTsKKyAgZm9yIChjb25zdCBhdXRvJiBnZW5lcmF0b3IgOiBtZXNzYWdlX2dlbmVyYXRvcnNfKSB7CisgICAgaWYgKGdlbmVyYXRvci0+SW5jbHVkZXNPbmVPZkRlZmluaXRpb24oKSkgeworICAgICAgaW5jbHVkZXNfb25lb2YgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGZ3ZF9kZWNsczsKKyAgZm9yIChjb25zdCBhdXRvJiBnZW5lcmF0b3IgOiBtZXNzYWdlX2dlbmVyYXRvcnNfKSB7CisgICAgZ2VuZXJhdG9yLT5EZXRlcm1pbmVPYmplY3RpdmVDQ2xhc3NEZWZpbml0aW9ucygmZndkX2RlY2xzKTsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIGdlbmVyYXRvciA6IGV4dGVuc2lvbl9nZW5lcmF0b3JzXykgeworICAgIGdlbmVyYXRvci0+RGV0ZXJtaW5lT2JqZWN0aXZlQ0NsYXNzRGVmaW5pdGlvbnMoJmZ3ZF9kZWNscyk7CisgIH0KKworICAvLyBOb3RlOgorICAvLyAgZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMgc3VwcHJlc3Npb24gaXMgb25seSBuZWVkZWQgaWYgc29tZSBwbGFjZSBpbiB0aGlzCisgIC8vICAgIHByb3RvIGZpbGUgaXMgc29tZXRoaW5nIGRlcHJlY2F0ZWQgb3IgaWYgaXQgcmVmZXJlbmNlcyBzb21ldGhpbmcgZnJvbQorICAvLyAgICBhbm90aGVyIGZpbGUgdGhhdCBpcyBkZXByZWNhdGVkLgorICAvLyAgZG9sbGFyLWluLWlkZW50aWZpZXItZXh0ZW5zaW9uIGlzIG5lZWRlZCBiZWNhdXNlIHdlIHVzZSByZWZlcmVuY2VzIHRvCisgIC8vICAgIG9iamMgY2xhc3MgbmFtZXMgdGhhdCBoYXZlICQgaW4gaWRlbnRpZmllcnMuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKVxuIgorICAgICAgIlxuIgorICAgICAgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoXG4iCisgICAgICAiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zXCJcbiIpOworICBpZiAoaW5jbHVkZXNfb25lb2YpIHsKKyAgICAvLyBUaGUgZ2VuZXJhdGVkIGNvZGUgZm9yIG9uZW9mJ3MgdXNlcyBkaXJlY3QgaXZhciBhY2Nlc3MsIHN1cHByZXNzIHRoZQorICAgIC8vIHdhcm5pbmcgaW4gY2FzZSBkZXZlbG9wZXIgdHVybiB0aGF0IG9uIGluIHRoZSBjb250ZXh0IHRoZXkgY29tcGlsZSB0aGUKKyAgICAvLyBnZW5lcmF0ZWQgY29kZS4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdkaXJlY3QtaXZhci1hY2Nlc3NcIlxuIik7CisgIH0KKyAgaWYgKCFmd2RfZGVjbHMuZW1wdHkoKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdkb2xsYXItaW4taWRlbnRpZmllci1leHRlbnNpb25cIlxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiXG4iKTsKKyAgaWYgKCFmd2RfZGVjbHMuZW1wdHkoKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiI3ByYWdtYSBtYXJrIC0gT2JqZWN0aXZlIEMgQ2xhc3MgZGVjbGFyYXRpb25zXG4iCisgICAgICAgICIvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBPYmplY3RpdmUgQyBjbGFzc2VzIHRoYXQgd2UgY2FuIHVzZSBhc1xuIgorICAgICAgICAiLy8gc3RhdGljIHZhbHVlcyBpbiBzdHJ1Y3QgaW5pdGlhbGl6ZXJzLlxuIgorICAgICAgICAiLy8gV2UgZG9uJ3QgdXNlIFtGb28gY2xhc3NdIGJlY2F1c2UgaXQgaXMgbm90IGEgc3RhdGljIHZhbHVlLlxuIik7CisgIH0KKyAgZm9yIChjb25zdCBhdXRvJiBpIDogZndkX2RlY2xzKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIiR2YWx1ZSRcbiIsICJ2YWx1ZSIsIGkpOworICB9CisgIGlmICghZndkX2RlY2xzLmVtcHR5KCkpIHsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgKKyAgICAgICIjcHJhZ21hIG1hcmsgLSAkcm9vdF9jbGFzc19uYW1lJFxuIgorICAgICAgIlxuIgorICAgICAgIkBpbXBsZW1lbnRhdGlvbiAkcm9vdF9jbGFzc19uYW1lJFxuXG4iLAorICAgICAgInJvb3RfY2xhc3NfbmFtZSIsIHJvb3RfY2xhc3NfbmFtZV8pOworCisgIGNvbnN0IGJvb2wgZmlsZV9jb250YWluc19leHRlbnNpb25zID0gRmlsZUNvbnRhaW5zRXh0ZW5zaW9ucyhmaWxlXyk7CisKKyAgLy8gSWYgdGhlcmUgd2VyZSBhbnkgZXh0ZW5zaW9ucyBvciB0aGlzIGZpbGUgaGFzIGFueSBkZXBlbmRlbmNpZXMsIG91dHB1dAorICAvLyBhIHJlZ2lzdHJ5IHRvIG92ZXJyaWRlIHRvIGNyZWF0ZSB0aGUgZmlsZSBzcGVjaWZpYyByZWdpc3RyeS4KKyAgaWYgKGZpbGVfY29udGFpbnNfZXh0ZW5zaW9ucyB8fCAhZGVwc193aXRoX2V4dGVuc2lvbnMuZW1wdHkoKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiKyAoR1BCRXh0ZW5zaW9uUmVnaXN0cnkqKWV4dGVuc2lvblJlZ2lzdHJ5IHtcbiIKKyAgICAgICAgIiAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgK2luaXRpYWxpemUgc28gdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeVxuIgorICAgICAgICAiICAvLyBhYm91dCB0aHJlYWQgc2FmZXR5IGFuZCBpbml0aWFsaXphdGlvbiBvZiByZWdpc3RyeS5cbiIKKyAgICAgICAgIiAgc3RhdGljIEdQQkV4dGVuc2lvblJlZ2lzdHJ5KiByZWdpc3RyeSA9IG5pbDtcbiIKKyAgICAgICAgIiAgaWYgKCFyZWdpc3RyeSkge1xuIgorICAgICAgICAiICAgIEdQQl9ERUJVR19DSEVDS19SVU5USU1FX1ZFUlNJT05TKCk7XG4iCisgICAgICAgICIgICAgcmVnaXN0cnkgPSBbW0dQQkV4dGVuc2lvblJlZ2lzdHJ5IGFsbG9jXSBpbml0XTtcbiIpOworCisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgICBpZiAoZmlsZV9jb250YWluc19leHRlbnNpb25zKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAic3RhdGljIEdQQkV4dGVuc2lvbkRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uc1tdID0ge1xuIik7CisgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgZ2VuZXJhdG9yIDogZXh0ZW5zaW9uX2dlbmVyYXRvcnNfKSB7CisgICAgICAgIGdlbmVyYXRvci0+R2VuZXJhdGVTdGF0aWNWYXJpYWJsZXNJbml0aWFsaXphdGlvbihwcmludGVyKTsKKyAgICAgIH0KKyAgICAgIGZvciAoY29uc3QgYXV0byYgZ2VuZXJhdG9yIDogbWVzc2FnZV9nZW5lcmF0b3JzXykgeworICAgICAgICBnZW5lcmF0b3ItPkdlbmVyYXRlU3RhdGljVmFyaWFibGVzSW5pdGlhbGl6YXRpb24ocHJpbnRlcik7CisgICAgICB9CisgICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAifTtcbiIKKyAgICAgICAgICAiZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoZGVzY3JpcHRpb25zKSAvIHNpemVvZihkZXNjcmlwdGlvbnNbMF0pOyArK2kpIHtcbiIKKyAgICAgICAgICAiICBHUEJFeHRlbnNpb25EZXNjcmlwdG9yICpleHRlbnNpb24gPVxuIgorICAgICAgICAgICIgICAgICBbW0dQQkV4dGVuc2lvbkRlc2NyaXB0b3IgYWxsb2NdIGluaXRXaXRoRXh0ZW5zaW9uRGVzY3JpcHRpb246JmRlc2NyaXB0aW9uc1tpXVxuIgorICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXNDbGFzc1JlZnM6WUVTXTtcbiIKKyAgICAgICAgICAiICBbcmVnaXN0cnkgYWRkRXh0ZW5zaW9uOmV4dGVuc2lvbl07XG4iCisgICAgICAgICAgIiAgW3NlbGYgZ2xvYmFsbHlSZWdpc3RlckV4dGVuc2lvbjpleHRlbnNpb25dO1xuIgorICAgICAgICAgICIgIFtleHRlbnNpb24gcmVsZWFzZV07XG4iCisgICAgICAgICAgIn1cbiIpOworICAgIH0KKworICAgIGlmIChkZXBzX3dpdGhfZXh0ZW5zaW9ucy5lbXB0eSgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiLy8gTm9uZSBvZiB0aGUgaW1wb3J0cyAoZGlyZWN0IG9yIGluZGlyZWN0KSBkZWZpbmVkIGV4dGVuc2lvbnMsIHNvIG5vIG5lZWQgdG8gYWRkXG4iCisgICAgICAgICAgIi8vIHRoZW0gdG8gdGhpcyByZWdpc3RyeS5cbiIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiLy8gTWVyZ2UgaW4gdGhlIGltcG9ydHMgKGRpcmVjdCBvciBpbmRpcmVjdCkgdGhhdCBkZWZpbmVkIGV4dGVuc2lvbnMuXG4iKTsKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPjo6aXRlcmF0b3IgaXRlciA9CisgICAgICAgICAgICAgICBkZXBzX3dpdGhfZXh0ZW5zaW9ucy5iZWdpbigpOworICAgICAgICAgICBpdGVyICE9IGRlcHNfd2l0aF9leHRlbnNpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcm9vdF9jbGFzc19uYW1lKEZpbGVDbGFzc05hbWUoKCppdGVyKSkpOworICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAgICJbcmVnaXN0cnkgYWRkRXh0ZW5zaW9uczpbJGRlcGVuZGVuY3kkIGV4dGVuc2lvblJlZ2lzdHJ5XV07XG4iLAorICAgICAgICAgICAgImRlcGVuZGVuY3kiLCByb290X2NsYXNzX25hbWUpOworICAgICAgfQorICAgIH0KKworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiAgfVxuIgorICAgICAgICAiICByZXR1cm4gcmVnaXN0cnk7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKSA+IDApIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIvLyBObyBleHRlbnNpb25zIGluIHRoZSBmaWxlIGFuZCBub25lIG9mIHRoZSBpbXBvcnRzIChkaXJlY3Qgb3IgaW5kaXJlY3QpXG4iCisgICAgICAgICAgIi8vIGRlZmluZWQgZXh0ZW5zaW9ucywgc28gbm8gbmVlZCB0byBnZW5lcmF0ZSArZXh0ZW5zaW9uUmVnaXN0cnkuXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIi8vIE5vIGV4dGVuc2lvbnMgaW4gdGhlIGZpbGUgYW5kIG5vIGltcG9ydHMsIHNvIG5vIG5lZWQgdG8gZ2VuZXJhdGVcbiIKKyAgICAgICAgICAiLy8gK2V4dGVuc2lvblJlZ2lzdHJ5LlxuIik7CisgICAgfQorICB9CisKKyAgcHJpbnRlci0+UHJpbnQoIlxuQGVuZFxuXG4iKTsKKworICAvLyBGaWxlIGRlc2NyaXB0b3Igb25seSBuZWVkZWQgaWYgdGhlcmUgYXJlIG1lc3NhZ2VzIHRvIHVzZSBpdC4KKyAgaWYgKCFtZXNzYWdlX2dlbmVyYXRvcnNfLmVtcHR5KCkpIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnM7CisgICAgdmFyc1sicm9vdF9jbGFzc19uYW1lIl0gPSByb290X2NsYXNzX25hbWVfOworICAgIHZhcnNbInBhY2thZ2UiXSA9IGZpbGVfLT5wYWNrYWdlKCk7CisgICAgdmFyc1sib2JqY19wcmVmaXgiXSA9IEZpbGVDbGFzc1ByZWZpeChmaWxlXyk7CisgICAgc3dpdGNoIChmaWxlXy0+c3ludGF4KCkpIHsKKyAgICAgIGNhc2UgRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9VTktOT1dOOgorICAgICAgICB2YXJzWyJzeW50YXgiXSA9ICJHUEJGaWxlU3ludGF4VW5rbm93biI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMjoKKyAgICAgICAgdmFyc1sic3ludGF4Il0gPSAiR1BCRmlsZVN5bnRheFByb3RvMiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMzoKKyAgICAgICAgdmFyc1sic3ludGF4Il0gPSAiR1BCRmlsZVN5bnRheFByb3RvMyI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAiI3ByYWdtYSBtYXJrIC0gJHJvb3RfY2xhc3NfbmFtZSRfRmlsZURlc2NyaXB0b3JcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAic3RhdGljIEdQQkZpbGVEZXNjcmlwdG9yICokcm9vdF9jbGFzc19uYW1lJF9GaWxlRGVzY3JpcHRvcih2b2lkKSB7XG4iCisgICAgICAgICIgIC8vIFRoaXMgaXMgY2FsbGVkIGJ5ICtpbml0aWFsaXplIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gd29ycnlcbiIKKyAgICAgICAgIiAgLy8gYWJvdXQgdGhyZWFkIHNhZmV0eSBvZiB0aGUgc2luZ2xldG9uLlxuIgorICAgICAgICAiICBzdGF0aWMgR1BCRmlsZURlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBOVUxMO1xuIgorICAgICAgICAiICBpZiAoIWRlc2NyaXB0b3IpIHtcbiIKKyAgICAgICAgIiAgICBHUEJfREVCVUdfQ0hFQ0tfUlVOVElNRV9WRVJTSU9OUygpO1xuIik7CisgICAgaWYgKCF2YXJzWyJvYmpjX3ByZWZpeCJdLmVtcHR5KCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgIHZhcnMsCisgICAgICAgICAgIiAgICBkZXNjcmlwdG9yID0gW1tHUEJGaWxlRGVzY3JpcHRvciBhbGxvY10gaW5pdFdpdGhQYWNrYWdlOkBcIiRwYWNrYWdlJFwiXG4iCisgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpjUHJlZml4OkBcIiRvYmpjX3ByZWZpeCRcIlxuIgorICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheDokc3ludGF4JF07XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFycywKKyAgICAgICAgICAiICAgIGRlc2NyaXB0b3IgPSBbW0dQQkZpbGVEZXNjcmlwdG9yIGFsbG9jXSBpbml0V2l0aFBhY2thZ2U6QFwiJHBhY2thZ2UkXCJcbiIKKyAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXg6JHN5bnRheCRdO1xuIik7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICB9XG4iCisgICAgICAgICIgIHJldHVybiBkZXNjcmlwdG9yO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiXG4iKTsKKyAgfQorCisgIGZvciAoY29uc3QgYXV0byYgZ2VuZXJhdG9yIDogZW51bV9nZW5lcmF0b3JzXykgeworICAgIGdlbmVyYXRvci0+R2VuZXJhdGVTb3VyY2UocHJpbnRlcik7CisgIH0KKyAgZm9yIChjb25zdCBhdXRvJiBnZW5lcmF0b3IgOiBtZXNzYWdlX2dlbmVyYXRvcnNfKSB7CisgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZVNvdXJjZShwcmludGVyKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJcbiIKKyAgICAiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcFxuIgorICAgICJcbiIKKyAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSlcbiIpOworfQorCisvLyBIZWxwZXIgdG8gcHJpbnQgdGhlIGltcG9ydCBvZiB0aGUgcnVudGltZSBzdXBwb3J0IGF0IHRoZSB0b3Agb2YgZ2VuZXJhdGVkCisvLyBmaWxlcy4gVGhpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB0aGUgcnVudGltZSBjb21pbmcgZnJvbSBhIGZyYW1ld29yaworLy8gYXMgZGVmaW5lZCBieSB0aGUgb2ZmaWNpYWwgQ29jb2FQb2QuCit2b2lkIEZpbGVHZW5lcmF0b3I6OlByaW50RmlsZVJ1bnRpbWVQcmVhbWJsZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGhlYWRlcnNfdG9faW1wb3J0KSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIi8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhXG4iCisgICAgICAiLy8gc291cmNlOiAkZmlsZW5hbWUkXG4iCisgICAgICAiXG4iLAorICAgICAgImZpbGVuYW1lIiwgZmlsZV8tPm5hbWUoKSk7CisKKyAgaWYgKGlzX2J1bmRsZWRfcHJvdG9fKSB7CisgICAgLy8gVGhpcyBpcyBiYXNpY2FsbHkgYSBjbG9uZSBvZiBJbXBvcnRXcml0ZXI6OlByaW50UnVudGltZUltcG9ydHMoKSBidXQKKyAgICAvLyB3aXRob3V0IHRoZSBDUFAgc3ltYm9sIGdhdGUsIHNpbmNlIHdpdGhpbiB0aGUgYnVuZGxlZCBmaWxlcywgdGhhdCBpc24ndAorICAgIC8vIG5lZWRlZC4KKyAgICBzdGQ6OnN0cmluZyBpbXBvcnRfcHJlZml4ID0gZ2VuZXJhdGlvbl9vcHRpb25zXy5ydW50aW1lX2ltcG9ydF9wcmVmaXg7CisgICAgaWYgKCFpbXBvcnRfcHJlZml4LmVtcHR5KCkpIHsKKyAgICAgIGltcG9ydF9wcmVmaXggKz0gIi8iOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlYWRlciA6IGhlYWRlcnNfdG9faW1wb3J0KSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiI2ltcG9ydCBcIiRpbXBvcnRfcHJlZml4JCRoZWFkZXIkXCJcbiIsCisgICAgICAgICAgImltcG9ydF9wcmVmaXgiLCBpbXBvcnRfcHJlZml4LAorICAgICAgICAgICJoZWFkZXIiLCBoZWFkZXIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBJbXBvcnRXcml0ZXI6OlByaW50UnVudGltZUltcG9ydHMoCisgICAgICAgIHByaW50ZXIsIGhlYWRlcnNfdG9faW1wb3J0LCBnZW5lcmF0aW9uX29wdGlvbnNfLnJ1bnRpbWVfaW1wb3J0X3ByZWZpeCwgdHJ1ZSk7CisgIH0KKworICBwcmludGVyLT5QcmludCgiXG4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG9iamVjdGl2ZWMKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWxlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0OWNmOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2ZpbGUuaApAQCAtMCwwICsxLDExNSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX09CSkVDVElWRUNfRklMRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX09CSkVDVElWRUNfRklMRV9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2Ugb2JqZWN0aXZlYyB7CisKK2NsYXNzIEVudW1HZW5lcmF0b3I7CitjbGFzcyBFeHRlbnNpb25HZW5lcmF0b3I7CitjbGFzcyBNZXNzYWdlR2VuZXJhdG9yOworCitjbGFzcyBGaWxlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIHN0cnVjdCBHZW5lcmF0aW9uT3B0aW9ucyB7CisgICAgR2VuZXJhdGlvbk9wdGlvbnMoKQorICAgICAgLy8gVE9ETyh0aG9tYXN2bCk6IEV2ZW50dWFsbHkgZmxpcCB0aGlzIGRlZmF1bHQgdG8gZmFsc2UgZm9yIGJldHRlcgorICAgICAgLy8gaW50ZXJvcCB3aXRoIFN3aWZ0IGlmIHByb3RvIHVzYWdlcyBzcGFuIG1vZHVsZXMgbWFkZSBmcm9tIE9iakMgc291cmNlcy4KKyAgICAgIDogaGVhZGVyc191c2VfZm9yd2FyZF9kZWNsYXJhdGlvbnModHJ1ZSkge30KKyAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9mb3JfbmFtZWRfZnJhbWV3b3JrOworICAgIHN0ZDo6c3RyaW5nIG5hbWVkX2ZyYW1ld29ya190b19wcm90b19wYXRoX21hcHBpbmdzX3BhdGg7CisgICAgc3RkOjpzdHJpbmcgcnVudGltZV9pbXBvcnRfcHJlZml4OworICAgIGJvb2wgaGVhZGVyc191c2VfZm9yd2FyZF9kZWNsYXJhdGlvbnM7CisgIH07CisKKyAgLy8gV3JhcHBlciBmb3Igc29tZSBjb21tb24gc3RhdGUgdGhhdCBpcyBzaGFyZWQgYmV0d2VlbiBmaWxlIGdlbmVyYXRpb25zIHRvCisgIC8vIGltcHJvdmUgcGVyZm9ybWFuY2Ugd2hlbiBtb3JlIHRoYW4gb25lIGZpbGUgaXMgZ2VuZXJhdGVkIGF0IGEgdGltZS4KKyAgc3RydWN0IENvbW1vblN0YXRlIHsKKyAgICBDb21tb25TdGF0ZSgpOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPgorICAgIENvbGxlY3RNaW5pbWFsRmlsZURlcHNDb250YWluaW5nRXh0ZW5zaW9ucyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisKKyAgIHByaXZhdGU6CisgICAgc3RydWN0IE1pbkRlcHNFbnRyeSB7CisgICAgICBib29sIGhhc19leHRlbnNpb25zOworICAgICAgc3RkOjpzZXQ8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBtaW5fZGVwczsKKyAgICAgIC8vIGBjb3ZlcmVkX2RlcHNgIGFyZSB0aGUgdHJhbnN0aXZlIGRlcHMgb2YgYG1pbl9kZXBzX3dfZXh0c2AgdGhhdCBhbHNvCisgICAgICAvLyBoYXZlIGV4dGVuc2lvbnMuCisgICAgICBzdGQ6OnNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IGNvdmVyZWRfZGVwczsKKyAgICB9OworICAgIGNvbnN0IE1pbkRlcHNFbnRyeSYgQ29sbGVjdE1pbmltYWxGaWxlRGVwc0NvbnRhaW5pbmdFeHRlbnNpb25zSW50ZXJuYWwoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworICAgIHN0ZDo6bWFwPGNvbnN0IEZpbGVEZXNjcmlwdG9yKiwgTWluRGVwc0VudHJ5PiBkZXBzX2luZm9fY2FjaGVfOworICB9OworCisgIEZpbGVHZW5lcmF0b3IoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgY29uc3QgR2VuZXJhdGlvbk9wdGlvbnMmIGdlbmVyYXRpb25fb3B0aW9ucywKKyAgICAgICAgICAgICAgICBDb21tb25TdGF0ZSYgY29tbW9uX3N0YXRlKTsKKyAgfkZpbGVHZW5lcmF0b3IoKTsKKworICBGaWxlR2VuZXJhdG9yKGNvbnN0IEZpbGVHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKyAgRmlsZUdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEZpbGVHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKworICB2b2lkIEdlbmVyYXRlU291cmNlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZUhlYWRlcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisgIGNvbnN0IEdlbmVyYXRpb25PcHRpb25zJiBnZW5lcmF0aW9uX29wdGlvbnNfOworICBDb21tb25TdGF0ZSYgY29tbW9uX3N0YXRlXzsKKyAgc3RkOjpzdHJpbmcgcm9vdF9jbGFzc19uYW1lXzsKKyAgYm9vbCBpc19idW5kbGVkX3Byb3RvXzsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RW51bUdlbmVyYXRvcj4+IGVudW1fZ2VuZXJhdG9yc187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlR2VuZXJhdG9yPj4gbWVzc2FnZV9nZW5lcmF0b3JzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEV4dGVuc2lvbkdlbmVyYXRvcj4+IGV4dGVuc2lvbl9nZW5lcmF0b3JzXzsKKworICB2b2lkIFByaW50RmlsZVJ1bnRpbWVQcmVhbWJsZSgKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBoZWFkZXJzX3RvX2ltcG9ydCkgY29uc3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugb2JqZWN0aXZlYworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfT0JKRUNUSVZFQ19GSUxFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZ2VuZXJhdG9yLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkY2NmMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMDEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIG9iamVjdGl2ZWMgeworCituYW1lc3BhY2UgeworCisvLyBDb252ZXJ0IGEgc3RyaW5nIHdpdGggInllcyIvIm5vIiAoY2FzZSBpbnNlbnNpdGl2ZSkgdG8gYSBib29sZWFuLCByZXR1cm5pbmcKKy8vIHRydWUvZmFsc2UgZm9yIGlmIHRoZSBpbnB1dCBzdHJpbmcgd2FzIGEgdmFsaWQgdmFsdWUuIElmIHRoZSBpbnB1dCBzdHJpbmcgaXMKKy8vIGludmFsaWQsIGByZXN1bHRgIGlzIHVuY2hhbmdlZC4KK2Jvb2wgU3RyaW5nVG9Cb29sKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwgYm9vbCogcmVzdWx0KSB7CisgIHN0ZDo6c3RyaW5nIHVwcGVyX3ZhbHVlKHZhbHVlKTsKKyAgVXBwZXJTdHJpbmcoJnVwcGVyX3ZhbHVlKTsKKyAgaWYgKHVwcGVyX3ZhbHVlID09ICJOTyIpIHsKKyAgICAqcmVzdWx0ID0gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKHVwcGVyX3ZhbHVlID09ICJZRVMiKSB7CisgICAgKnJlc3VsdCA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitPYmplY3RpdmVDR2VuZXJhdG9yOjpPYmplY3RpdmVDR2VuZXJhdG9yKCkge30KKworT2JqZWN0aXZlQ0dlbmVyYXRvcjo6fk9iamVjdGl2ZUNHZW5lcmF0b3IoKSB7fQorCitib29sIE9iamVjdGl2ZUNHZW5lcmF0b3I6Okhhc0dlbmVyYXRlQWxsKCkgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPYmplY3RpdmVDR2VuZXJhdG9yOjpHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yKSBjb25zdCB7CisgICplcnJvciA9ICJVbmltcGxlbWVudGVkIEdlbmVyYXRlKCkgbWV0aG9kLiBDYWxsIEdlbmVyYXRlQWxsKCkgaW5zdGVhZC4iOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgT2JqZWN0aXZlQ0dlbmVyYXRvcjo6R2VuZXJhdGVBbGwoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgZmlsZXMsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlciwgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKKyAgICBzdGQ6OnN0cmluZyogZXJyb3IpIGNvbnN0IHsKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gUGFyc2UgZ2VuZXJhdG9yIG9wdGlvbnMuIFRoZXNlIG9wdGlvbnMgYXJlIHBhc3NlZCB0byB0aGUgY29tcGlsZXIgdXNpbmcgdGhlCisgIC8vIC0tb2JqY19vcHQgZmxhZy4gVGhlIG9wdGlvbnMgYXJlIHBhc3NlZCBhcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mCisgIC8vIG9wdGlvbnMgYWxvbmcgd2l0aCB0aGVpciB2YWx1ZXMuIElmIHRoZSBvcHRpb24gYXBwZWFycyBtdWx0aXBsZSB0aW1lcywgb25seQorICAvLyB0aGUgbGFzdCB2YWx1ZSB3aWxsIGJlIGNvbnNpZGVyZWQuCisgIC8vCisgIC8vIGUuZy4gcHJvdG9jIC4uLiAtLW9iamNfb3B0PWV4cGVjdGVkX3ByZWZpeGVzPWZpbGUudHh0LGdlbmVyYXRlX2Zvcl9uYW1lZF9mcmFtZXdvcms9TXlGcmFtZXdvcmsKKworICBPcHRpb25zIHZhbGlkYXRpb25fb3B0aW9uczsKKyAgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGlvbk9wdGlvbnMgZ2VuZXJhdGlvbl9vcHRpb25zOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ID4gb3B0aW9uczsKKyAgUGFyc2VHZW5lcmF0b3JQYXJhbWV0ZXIocGFyYW1ldGVyLCAmb3B0aW9ucyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9ucy5zaXplKCk7IGkrKykgeworICAgIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJleHBlY3RlZF9wcmVmaXhlc19wYXRoIikgeworICAgICAgLy8gUGF0aCB0byBmaW5kIGEgZmlsZSBjb250YWluaW5nIHRoZSBleHBlY3RlZCBwcmVmaXhlcworICAgICAgLy8gKG9iamNfY2xhc3NfcHJlZml4ICJQUkVGSVgiKSBmb3IgcHJvdG8gcGFja2FnZXMgKHBhY2thZ2UgTkFNRSkuIFRoZQorICAgICAgLy8gZ2VuZXJhdG9yIHdpbGwgdGhlbiBpc3N1ZSB3YXJuaW5ncy9lcnJvcnMgaWYgaW4gdGhlIHByb3RvIGZpbGVzIGJlaW5nCisgICAgICAvLyBnZW5lcmF0ZWQgdGhlIG9wdGlvbiBpcyBub3QgbGlzdGVkL3dyb25nL2V0YyBpbiB0aGUgZmlsZS4KKyAgICAgIC8vCisgICAgICAvLyBUaGUgZm9ybWF0IG9mIHRoZSBmaWxlIGlzOgorICAgICAgLy8gICAtIEFuIGVudHJ5IGlzIGEgbGluZSBvZiAicGFja2FnZT1wcmVmaXgiLgorICAgICAgLy8gICAtIENvbW1lbnRzIHN0YXJ0IHdpdGggIiMiLgorICAgICAgLy8gICAtIEEgY29tbWVudCBjYW4gZ28gb24gYSBsaW5lIGFmdGVyIGEgZXhwZWN0ZWQgcGFja2FnZS9wcmVmaXggcGFpci4KKyAgICAgIC8vICAgICAoaS5lLiAtICJwYWNrYWdlPXByZWZpeCAjIGNvbW1lbnQiKQorICAgICAgLy8gICAtIEZvciBmaWxlcyB0aGF0IGRvIE5PVCBoYXZlIGEgcHJvdG8gcGFja2FnZSAobm90IHJlY29tbWVuZGVkKSwgYW4KKyAgICAgIC8vICAgICBlbnRyeSBjYW4gYmUgbWFkZSBhcyAibm9fcGFja2FnZTpQQVRIPXByZWZpeCIsIHdoZXJlIFBBVEggaXMgdGhlCisgICAgICAvLyAgICAgcGF0aCBmb3IgdGhlIC5wcm90byBmaWxlLgorICAgICAgLy8KKyAgICAgIC8vIFRoZXJlIGlzIG5vIHZhbGlkYXRpb24gdGhhdCB0aGUgcHJlZml4ZXMgYXJlIGdvb2QgcHJlZml4ZXMsIGl0IGlzCisgICAgICAvLyBhc3N1bWVkIHRoYXQgdGhleSBhcmUgd2hlbiB5b3UgY3JlYXRlIHRoZSBmaWxlLgorICAgICAgdmFsaWRhdGlvbl9vcHRpb25zLmV4cGVjdGVkX3ByZWZpeGVzX3BhdGggPSBvcHRpb25zW2ldLnNlY29uZDsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImV4cGVjdGVkX3ByZWZpeGVzX3N1cHByZXNzaW9ucyIpIHsKKyAgICAgIC8vIEEgc2VtaWNvbG9uIGRlbGltaXRlZCBzdHJpbmcgdGhhdCBsaXN0cyB0aGUgcGF0aHMgb2YgLnByb3RvIGZpbGVzIHRvCisgICAgICAvLyBleGNsdWRlIGZyb20gdGhlIHBhY2thZ2UgcHJlZml4IHZhbGlkYXRpb25zIChleHBlY3RlZF9wcmVmaXhlc19wYXRoKS4KKyAgICAgIC8vIFRoaXMgaXMgcHJvdmlkZWQgYXMgYW4gIm91dCIsIHRvIHNraXAgc29tZSBmaWxlcyBiZWluZyBjaGVja2VkLgorICAgICAgZm9yIChTdHJpbmdQaWVjZSBzcGxpdF9waWVjZSA6IFNwbGl0KAorICAgICAgICAgICAgICAgb3B0aW9uc1tpXS5zZWNvbmQsICI7IiwgdHJ1ZSkpIHsKKyAgICAgICAgdmFsaWRhdGlvbl9vcHRpb25zLmV4cGVjdGVkX3ByZWZpeGVzX3N1cHByZXNzaW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICBzdGQ6OnN0cmluZyhzcGxpdF9waWVjZSkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAicHJlZml4ZXNfbXVzdF9iZV9yZWdpc3RlcmVkIikgeworICAgICAgLy8gSWYgb2JqYyBwcmVmaXggZmlsZSBvcHRpb24gdmFsdWUgbXVzdCBiZSByZWdpc3RlcmVkIHRvIGJlIHVzZWQuIFRoaXMKKyAgICAgIC8vIG9wdGlvbiBoYXMgbm8gbWVhbmluZyBpZiBhbiAiZXhwZWN0ZWRfcHJlZml4ZXNfcGF0aCIgaXNuJ3Qgc2V0LiBUaGUKKyAgICAgIC8vIGF2YWlsYWJsZSBvcHRpb25zIGFyZToKKyAgICAgIC8vICAgIm5vIjogVGhleSBkb24ndCBoYXZlIHRvIGJlIHJlZ2lzdGVyZWQuCisgICAgICAvLyAgICJ5ZXMiOiBUaGV5IG11c3QgYmUgcmVnaXN0ZXJlZCBhbmQgYW4gZXJyb3Igd2lsbCBiZSByYWlzZWQgaWYgYSBmaWxlcworICAgICAgLy8gICAgIHRyaWVkIHRvIHVzZSBhIHByZWZpeCB0aGF0IGlzbid0IHJlZ2lzdGVyZWQuCisgICAgICAvLyBEZWZhdWx0IGlzICJubyIuCisgICAgICBpZiAoIVN0cmluZ1RvQm9vbChvcHRpb25zW2ldLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZGF0aW9uX29wdGlvbnMucHJlZml4ZXNfbXVzdF9iZV9yZWdpc3RlcmVkKSkgeworICAgICAgICAqZXJyb3IgPSAiZXJyb3I6IFVua25vd24gdmFsdWUgZm9yIHByZWZpeGVzX211c3RfYmVfcmVnaXN0ZXJlZDogIiArIG9wdGlvbnNbaV0uc2Vjb25kOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJyZXF1aXJlX3ByZWZpeGVzIikgeworICAgICAgLy8gSWYgZXZlcnkgZmlsZSBtdXN0IGhhdmUgYW4gb2JqYyBwcmVmaXggZmlsZSBvcHRpb24gdG8gYmUgdXNlZC4gVGhlCisgICAgICAvLyBhdmFpbGFibGUgb3B0aW9ucyBhcmU6CisgICAgICAvLyAgICJubyI6IEZpbGVzIGNhbiBiZSBnZW5lcmF0ZWQgd2l0aG91dCB0aGUgcHJlZml4IG9wdGlvbi4KKyAgICAgIC8vICAgInllcyI6IEZpbGVzIG11c3QgaGF2ZSB0aGUgb2JqYyBwcmVmaXggb3B0aW9uLCBhbmQgYW4gZXJyb3Igd2lsbCBiZQorICAgICAgLy8gICAgIHJhaXNlZCBpZiBhIGZpbGVzIGRvZXNuJ3QgaGF2ZSBvbmUuCisgICAgICAvLyBEZWZhdWx0IGlzICJubyIuCisgICAgICBpZiAoIVN0cmluZ1RvQm9vbChvcHRpb25zW2ldLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZGF0aW9uX29wdGlvbnMucmVxdWlyZV9wcmVmaXhlcykpIHsKKyAgICAgICAgKmVycm9yID0gImVycm9yOiBVbmtub3duIHZhbHVlIGZvciByZXF1aXJlX3ByZWZpeGVzOiAiICsgb3B0aW9uc1tpXS5zZWNvbmQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImdlbmVyYXRlX2Zvcl9uYW1lZF9mcmFtZXdvcmsiKSB7CisgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgZnJhbWV3b3JrIHRoYXQgcHJvdG9zIGFyZSBiZWluZyBnZW5lcmF0ZWQgZm9yLiBUaGlzCisgICAgICAvLyB3aWxsIGNhdXNlIHRoZSAjaW1wb3J0IHN0YXRlbWVudHMgdG8gYmUgZnJhbWV3b3JrIGJhc2VkIHVzaW5nIHRoaXMKKyAgICAgIC8vIG5hbWUgKGkuZS4gLSAiI2ltcG9ydCA8TkFNRS9wcm90by5wYm9iamMuaD4pLgorICAgICAgLy8KKyAgICAgIC8vIE5PVEU6IElmIHRoaXMgb3B0aW9uIGlzIHVzZWQgd2l0aAorICAgICAgLy8gbmFtZWRfZnJhbWV3b3JrX3RvX3Byb3RvX3BhdGhfbWFwcGluZ3NfcGF0aCwgdGhlbiB0aGlzIGlzIGVmZmVjdGl2ZWx5CisgICAgICAvLyB0aGUgImRlZmF1bHQiIGZyYW1ld29yayBuYW1lIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgdGhhdCB3YXNuJ3QgbWFwcGVkIGJ5CisgICAgICAvLyB0aGUgbWFwcGluZyBmaWxlLgorICAgICAgZ2VuZXJhdGlvbl9vcHRpb25zLmdlbmVyYXRlX2Zvcl9uYW1lZF9mcmFtZXdvcmsgPSBvcHRpb25zW2ldLnNlY29uZDsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gIm5hbWVkX2ZyYW1ld29ya190b19wcm90b19wYXRoX21hcHBpbmdzX3BhdGgiKSB7CisgICAgICAvLyBQYXRoIHRvIGZpbmQgYSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpc3Qgb2YgZnJhbWV3b3JrIG5hbWVzIGFuZCBwcm90bworICAgICAgLy8gZmlsZXMuIFRoZSBnZW5lcmF0b3IgdXNlcyB0aGlzIHRvIGRlY2lkZSBpZiBhIHByb3RvIGZpbGUKKyAgICAgIC8vIHJlZmVyZW5jZWQgc2hvdWxkIHVzZSBhIGZyYW1ld29yayBzdHlsZSBpbXBvcnQgdnMuIGEgdXNlciBsZXZlbCBpbXBvcnQKKyAgICAgIC8vICgjaW1wb3J0IDxGUkFNRVdPUksvZmlsZS5wYm9iamMuaD4gdnMgI2ltcG9ydCAiZGlyL2ZpbGUucGJvYmpjLmgiKS4KKyAgICAgIC8vCisgICAgICAvLyBUaGUgZm9ybWF0IG9mIHRoZSBmaWxlIGlzOgorICAgICAgLy8gICAtIEFuIGVudHJ5IGlzIGEgbGluZSBvZiAiZnJhbWV3b3JrTmFtZTogZmlsZS5wcm90bywgZGlyL2ZpbGUyLnByb3RvIi4KKyAgICAgIC8vICAgLSBDb21tZW50cyBzdGFydCB3aXRoICIjIi4KKyAgICAgIC8vICAgLSBBIGNvbW1lbnQgY2FuIGdvIG9uIGEgbGluZSBhZnRlciBhIGV4cGVjdGVkIHBhY2thZ2UvcHJlZml4IHBhaXIuCisgICAgICAvLyAgICAgKGkuZS4gLSAiZnJhbWV3b3JrTmFtZTogZmlsZS5wcm90byAjIGNvbW1lbnQiKQorICAgICAgLy8KKyAgICAgIC8vIEFueSBudW1iZXIgb2YgZmlsZXMgY2FuIGJlIGxpc3RlZCBmb3IgYSBmcmFtZXdvcmssIGp1c3Qgc2VwYXJhdGUgdGhlbQorICAgICAgLy8gd2l0aCBjb21tYXMuCisgICAgICAvLworICAgICAgLy8gVGhlcmUgY2FuIGJlIG11bHRpcGxlIGxpbmVzIGxpc3RpbmcgdGhlIHNhbWUgZnJhbWV3b3JrTmFtZSBpbiBjYXNlIGl0CisgICAgICAvLyBoYXMgYSBsb3Qgb2YgcHJvdG8gZmlsZXMgaW5jbHVkZWQgaW4gaXQ7IGhhdmluZyBtdWx0aXBsZSBsaW5lcyBtYWtlcworICAgICAgLy8gdGhpbmdzIGVhc2llciB0byByZWFkLiBJZiBhIHByb3RvIGZpbGUgaXMgbm90IGNvbmZpZ3VyZWQgaW4gdGhlCisgICAgICAvLyBtYXBwaW5ncyBmaWxlLCBpdCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBmcmFtZXdvcmsgbmFtZSBpZiBvbmUgd2FzIHBhc3NlZAorICAgICAgLy8gd2l0aCBnZW5lcmF0ZV9mb3JfbmFtZWRfZnJhbWV3b3JrLCBvciB0aGUgcmVsYXRpdmUgcGF0aCB0byBpdCdzIGluY2x1ZGUKKyAgICAgIC8vIHBhdGggb3RoZXJ3aXNlLgorICAgICAgZ2VuZXJhdGlvbl9vcHRpb25zLm5hbWVkX2ZyYW1ld29ya190b19wcm90b19wYXRoX21hcHBpbmdzX3BhdGggPSBvcHRpb25zW2ldLnNlY29uZDsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gInJ1bnRpbWVfaW1wb3J0X3ByZWZpeCIpIHsKKyAgICAgIC8vIFBhdGggdG8gdXNlIGFzIGEgcHJlZml4IG9uICNpbXBvcnRzIG9mIHJ1bnRpbWUgcHJvdmlkZWQgaGVhZGVycyBpbiB0aGUKKyAgICAgIC8vIGdlbmVyYXRlZCBmaWxlcy4gV2hlbiBpbnRlZ3JhdGluZyBPYmpDIHByb3RvcyBpbnRvIGEgYnVpbGQgc3lzdGVtLAorICAgICAgLy8gdGhpcyBjYW4gYmUgdXNlZCB0byBhdm9pZCBoYXZpbmcgdG8gYWRkIHRoZSBydW50aW1lIGRpcmVjdG9yeSB0byB0aGUKKyAgICAgIC8vIGhlYWRlciBzZWFyY2ggcGF0aCBzaW5jZSB0aGUgZ2VuZXJhdGUgI2ltcG9ydCB3aWxsIGJlIG1vcmUgY29tcGxldGUuCisgICAgICBnZW5lcmF0aW9uX29wdGlvbnMucnVudGltZV9pbXBvcnRfcHJlZml4ID0gU3RyaXBTdWZmaXhTdHJpbmcob3B0aW9uc1tpXS5zZWNvbmQsICIvIik7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJwYWNrYWdlX3RvX3ByZWZpeF9tYXBwaW5nc19wYXRoIikgeworICAgICAgLy8gUGF0aCB0byB1c2UgZm9yIHdoZW4gbG9hZGluZyB0aGUgb2JqYyBjbGFzcyBwcmVmaXggbWFwcGluZ3MgdG8gdXNlLgorICAgICAgLy8gVGhlIGBvYmpjX2NsYXNzX3ByZWZpeGAgZmlsZSBvcHRpb24gaXMgYWx3YXlzIGhvbm9yZWQgZmlyc3QgaWYgb25lIGlzIHByZXNlbnQuCisgICAgICAvLyBUaGlzIG9wdGlvbiBhbHNvIGhhcyBwcmVjZWRlbnQgb3ZlciB0aGUgdXNlX3BhY2thZ2VfYXNfcHJlZml4IG9wdGlvbi4KKyAgICAgIC8vCisgICAgICAvLyBUaGUgZm9ybWF0IG9mIHRoZSBmaWxlIGlzOgorICAgICAgLy8gICAtIEFuIGVudHJ5IGlzIGEgbGluZSBvZiAicGFja2FnZT1wcmVmaXgiLgorICAgICAgLy8gICAtIENvbW1lbnRzIHN0YXJ0IHdpdGggIiMiLgorICAgICAgLy8gICAtIEEgY29tbWVudCBjYW4gZ28gb24gYSBsaW5lIGFmdGVyIGEgZXhwZWN0ZWQgcGFja2FnZS9wcmVmaXggcGFpci4KKyAgICAgIC8vICAgICAoaS5lLiAtICJwYWNrYWdlPXByZWZpeCAjIGNvbW1lbnQiKQorICAgICAgLy8gICAtIEZvciBmaWxlcyB0aGF0IGRvIE5PVCBoYXZlIGEgcHJvdG8gcGFja2FnZSAobm90IHJlY29tbWVuZGVkKSwgYW4KKyAgICAgIC8vICAgICBlbnRyeSBjYW4gYmUgbWFkZSBhcyAibm9fcGFja2FnZTpQQVRIPXByZWZpeCIsIHdoZXJlIFBBVEggaXMgdGhlCisgICAgICAvLyAgICAgcGF0aCBmb3IgdGhlIC5wcm90byBmaWxlLgorICAgICAgLy8KKyAgICAgIFNldFBhY2thZ2VUb1ByZWZpeE1hcHBpbmdzUGF0aChvcHRpb25zW2ldLnNlY29uZCk7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJ1c2VfcGFja2FnZV9hc19wcmVmaXgiKSB7CisgICAgICAvLyBDb250cm9scyBob3cgdGhlIHN5bWJvbHMgc2hvdWxkIGJlIHByZWZpeGVkIHRvIGF2b2lkIHN5bWJvbHMKKyAgICAgIC8vIGNvbGxpc2lvbnMuIFRoZSBvYmpjX2NsYXNzX3ByZWZpeCBmaWxlIG9wdGlvbiBpcyBhbHdheXMgaG9ub3JlZCwgdGhpcworICAgICAgLy8gaXMganVzdCB3aGF0IHRvIGRvIGlmIHRoYXQgaXNuJ3Qgc2V0LiBUaGUgYXZhaWxhYmxlIG9wdGlvbnMgYXJlOgorICAgICAgLy8gICAibm8iOiBOb3QgcHJlZml4ZWQgKHRoZSBleGlzdGluZyBtb2RlKS4KKyAgICAgIC8vICAgInllcyI6IE1ha2UgYSBwcmVmaXggb3V0IG9mIHRoZSBwcm90byBwYWNrYWdlLgorICAgICAgYm9vbCB2YWx1ZSA9IGZhbHNlOworICAgICAgaWYgKFN0cmluZ1RvQm9vbChvcHRpb25zW2ldLnNlY29uZCwgJnZhbHVlKSkgeworICAgICAgICBTZXRVc2VQcm90b1BhY2thZ2VBc0RlZmF1bHRQcmVmaXgodmFsdWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKmVycm9yID0gImVycm9yOiBVbmtub3duIHVzZV9wYWNrYWdlX2FzX3ByZWZpeDogIiArIG9wdGlvbnNbaV0uc2Vjb25kOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJwcm90b19wYWNrYWdlX3ByZWZpeF9leGNlcHRpb25zX3BhdGgiKSB7CisgICAgICAvLyBQYXRoIHRvIGZpbmQgYSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpc3Qgb2YgcHJvdG8gcGFja2FnZSBuYW1lcyB0aGF0IGFyZQorICAgICAgLy8gZXhjZXB0aW9ucyB3aGVuIHVzZV9wYWNrYWdlX2FzX3ByZWZpeCBpcyBlbmFibGVkLiBUaGlzIGNhbiBiZSB1c2VkIHRvCisgICAgICAvLyBtaWdyYXRlIHBhY2thZ2VzIG9uZSBhdCBhIHRpbWUgdG8gdXNlX3BhY2thZ2VfYXNfcHJlZml4IHNpbmNlIHRoZXJlCisgICAgICAvLyBhcmUgbGlrZWx5IGNvZGUgdXBkYXRlcyBuZWVkZWQgd2l0aCBlYWNoIG9uZS4KKyAgICAgIC8vCisgICAgICAvLyBUaGUgZm9ybWF0IG9mIHRoZSBmaWxlIGlzOgorICAgICAgLy8gICAtIEFuIGVudHJ5IGlzIGEgbGluZSBvZiAicHJvdG8ucGFja2FnZS5uYW1lIi4KKyAgICAgIC8vICAgLSBDb21tZW50cyBzdGFydCB3aXRoICIjIi4KKyAgICAgIC8vICAgLSBBIGNvbW1lbnQgY2FuIGdvIG9uIGEgbGluZSBhZnRlciBhIGV4cGVjdGVkIHBhY2thZ2UvcHJlZml4IHBhaXIuCisgICAgICAvLyAgICAgKGkuZS4gLSAic29tZS5wcm90by5wYWNrYWdlICMgY29tbWVudCIpCisgICAgICBTZXRQcm90b1BhY2thZ2VQcmVmaXhFeGNlcHRpb25MaXN0KG9wdGlvbnNbaV0uc2Vjb25kKTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImhlYWRlcnNfdXNlX2ZvcndhcmRfZGVjbGFyYXRpb25zIikgeworICAgICAgaWYgKCFTdHJpbmdUb0Jvb2wob3B0aW9uc1tpXS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAmZ2VuZXJhdGlvbl9vcHRpb25zLmhlYWRlcnNfdXNlX2ZvcndhcmRfZGVjbGFyYXRpb25zKSkgeworICAgICAgICAqZXJyb3IgPSAiZXJyb3I6IFVua25vd24gdmFsdWUgZm9yIGhlYWRlcnNfdXNlX2ZvcndhcmRfZGVjbGFyYXRpb25zOiAiICsgb3B0aW9uc1tpXS5zZWNvbmQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgKmVycm9yID0gImVycm9yOiBVbmtub3duIGdlbmVyYXRvciBvcHRpb246ICIgKyBvcHRpb25zW2ldLmZpcnN0OworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gVGhlc2UgYXJlIG5vdCBvZmZpY2lhbCBnZW5lcmF0aW9uIG9wdGlvbnMgYW5kIGNvdWxkIGJlIHJlbW92ZWQvY2hhbmdlZCBpbgorICAvLyB0aGUgZnV0dXJlIGFuZCBkb2luZyB0aGF0IHdvbid0IGNvdW50IGFzIGEgYnJlYWtpbmcgY2hhbmdlLgorICBib29sIGhlYWRlcnNfb25seSA9IGdldGVudigiR1BCX09CSkNfSEVBREVSU19PTkxZIikgIT0gTlVMTDsKKyAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBza2lwX2ltcGxzOworICBpZiAoZ2V0ZW52KCJHUEJfT0JKQ19TS0lQX0lNUExTX0ZJTEUiKSAhPSBOVUxMKSB7CisgICAgc3RkOjppZnN0cmVhbSBza2lwX2ZpbGUoZ2V0ZW52KCJHUEJfT0JKQ19TS0lQX0lNUExTX0ZJTEUiKSk7CisgICAgaWYgKHNraXBfZmlsZS5pc19vcGVuKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGxpbmU7CisgICAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKHNraXBfZmlsZSwgbGluZSkpIHsKKyAgICAgICAgc2tpcF9pbXBscy5pbnNlcnQobGluZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICplcnJvciA9ICJlcnJvcjogRmFpbGVkIHRvIG9wZW4gR1BCX09CSkNfU0tJUF9JTVBMU19GSUxFIGZpbGUiOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gVmFsaWRhdGUgdGhlIG9iamMgcHJlZml4L3BhY2thZ2UgcGFpcmluZ3MuCisgIGlmICghVmFsaWRhdGVPYmpDQ2xhc3NQcmVmaXhlcyhmaWxlcywgdmFsaWRhdGlvbl9vcHRpb25zLCBlcnJvcikpIHsKKyAgICAvLyAqZXJyb3Igd2lsbCBoYXZlIGJlZW4gZmlsbGVkIGluLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEZpbGVHZW5lcmF0b3I6OkNvbW1vblN0YXRlIHN0YXRlOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBmaWxlc1tpXTsKKyAgICBGaWxlR2VuZXJhdG9yIGZpbGVfZ2VuZXJhdG9yKGZpbGUsIGdlbmVyYXRpb25fb3B0aW9ucywgc3RhdGUpOworICAgIHN0ZDo6c3RyaW5nIGZpbGVwYXRoID0gRmlsZVBhdGgoZmlsZSk7CisKKyAgICAvLyBHZW5lcmF0ZSBoZWFkZXIuCisgICAgeworICAgICAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgICAgIGNvbnRleHQtPk9wZW4oZmlsZXBhdGggKyAiLnBib2JqYy5oIikpOworICAgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisgICAgICBmaWxlX2dlbmVyYXRvci5HZW5lcmF0ZUhlYWRlcigmcHJpbnRlcik7CisgICAgfQorCisgICAgLy8gR2VuZXJhdGUgbSBmaWxlLgorICAgIGlmICghaGVhZGVyc19vbmx5ICYmIHNraXBfaW1wbHMuY291bnQoZmlsZS0+bmFtZSgpKSA9PSAwKSB7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICAgICAgY29udGV4dC0+T3BlbihmaWxlcGF0aCArICIucGJvYmpjLm0iKSk7CisgICAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKKyAgICAgIGZpbGVfZ2VuZXJhdG9yLkdlbmVyYXRlU291cmNlKCZwcmludGVyKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG9iamVjdGl2ZWMKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19nZW5lcmF0b3IuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYmM2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19nZW5lcmF0b3IuaApAQCAtMCwwICsxLDc5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gR2VuZXJhdGVzIE9iamVjdGl2ZUMgY29kZSBmb3IgYSBnaXZlbiAucHJvdG8gZmlsZS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfT0JKRUNUSVZFQ19HRU5FUkFUT1JfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9PQkpFQ1RJVkVDX0dFTkVSQVRPUl9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBvYmplY3RpdmVjIHsKKworLy8gQ29kZUdlbmVyYXRvciBpbXBsZW1lbnRhdGlvbiB3aGljaCBnZW5lcmF0ZXMgYSBPYmplY3RpdmVDIHNvdXJjZSBmaWxlIGFuZAorLy8gaGVhZGVyLiAgSWYgeW91IGNyZWF0ZSB5b3VyIG93biBwcm90b2NvbCBjb21waWxlciBiaW5hcnkgYW5kIHlvdSB3YW50IGl0IHRvCisvLyBzdXBwb3J0IE9iamVjdGl2ZUMgb3V0cHV0LCB5b3UgY2FuIGRvIHNvIGJ5IHJlZ2lzdGVyaW5nIGFuIGluc3RhbmNlIG9mIHRoaXMKKy8vIENvZGVHZW5lcmF0b3Igd2l0aCB0aGUgQ29tbWFuZExpbmVJbnRlcmZhY2UgaW4geW91ciBtYWluKCkgZnVuY3Rpb24uCitjbGFzcyBQUk9UT0NfRVhQT1JUIE9iamVjdGl2ZUNHZW5lcmF0b3IgOiBwdWJsaWMgQ29kZUdlbmVyYXRvciB7CisgcHVibGljOgorICBPYmplY3RpdmVDR2VuZXJhdG9yKCk7CisgIH5PYmplY3RpdmVDR2VuZXJhdG9yKCk7CisKKyAgT2JqZWN0aXZlQ0dlbmVyYXRvcihjb25zdCBPYmplY3RpdmVDR2VuZXJhdG9yJikgPSBkZWxldGU7CisgIE9iamVjdGl2ZUNHZW5lcmF0b3ImIG9wZXJhdG9yPShjb25zdCBPYmplY3RpdmVDR2VuZXJhdG9yJikgPSBkZWxldGU7CisKKyAgLy8gaW1wbGVtZW50cyBDb2RlR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBIYXNHZW5lcmF0ZUFsbCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIEdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsIHN0ZDo6c3RyaW5nKiBlcnJvcikgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgR2VuZXJhdGVBbGwoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgZmlsZXMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlciwgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZXJyb3IpIGNvbnN0IG92ZXJyaWRlOworCisgIHVpbnQ2NF90IEdldFN1cHBvcnRlZEZlYXR1cmVzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBGRUFUVVJFX1BST1RPM19PUFRJT05BTDsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIG9iamVjdGl2ZWMKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX09CSkVDVElWRUNfR0VORVJBVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1ZjU4MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnMuY2MKQEAgLTAsMCArMSwyMDQzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19uc29iamVjdF9tZXRob2RzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworLy8gTk9URTogc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uY2MgbWFrZXMgdXNlIG9mIGNlcnIgZm9yIHNvbWUKKy8vIGVycm9yIGNhc2VzLCBzbyBpdCBzZWVtcyB0byBiZSBvayB0byB1c2UgYXMgYSBiYWNrIGRvb3IgZm9yIGVycm9ycy4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBvYmplY3RpdmVjIHsKKworLy8gPGlvLmg+IGlzIHRyYW5zaXRpdmVseSBpbmNsdWRlZCBpbiB0aGlzIGZpbGUuIEltcG9ydCB0aGUgZnVuY3Rpb25zIGV4cGxpY2l0bHkKKy8vIGluIHRoaXMgcG9ydCBuYW1lc3BhY2UgdG8gYXZvaWQgYW1iaWd1b3VzIGRlZmluaXRpb24uCituYW1lc3BhY2UgcG9zaXggeworI2lmZGVmIF9XSU4zMgordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6d2luMzI6Om9wZW47CisjZWxzZQordXNpbmcgOjpvcGVuOworI2VuZGlmCit9ICAvLyBuYW1lc3BhY2UgcG9ydAorCituYW1lc3BhY2UgeworCitib29sIEJvb2xGcm9tRW52VmFyKGNvbnN0IGNoYXIqIGVudl92YXIsIGJvb2wgZGVmYXVsdF92YWx1ZSkgeworICBjb25zdCBjaGFyKiB2YWx1ZSA9IGdldGVudihlbnZfdmFyKTsKKyAgaWYgKHZhbHVlKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJZRVMiKSA9PSBUb1VwcGVyKHZhbHVlKTsKKyAgfQorICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKK30KKworY2xhc3MgU2ltcGxlTGluZUNvbGxlY3RvciA6IHB1YmxpYyBMaW5lQ29uc3VtZXIgeworIHB1YmxpYzoKKyAgU2ltcGxlTGluZUNvbGxlY3RvcihzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+KiBpbm91dF9zZXQpCisgICAgICA6IHNldF8oaW5vdXRfc2V0KSB7fQorCisgIHZpcnR1YWwgYm9vbCBDb25zdW1lTGluZShjb25zdCBTdHJpbmdQaWVjZSYgbGluZSwgc3RkOjpzdHJpbmcqIG91dF9lcnJvcikgb3ZlcnJpZGUgeworICAgIHNldF8tPmluc2VydChzdGQ6OnN0cmluZyhsaW5lKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4qIHNldF87Cit9OworCitjbGFzcyBQYWNrYWdlVG9QcmVmaXhlc0NvbGxlY3RvciA6IHB1YmxpYyBMaW5lQ29uc3VtZXIgeworIHB1YmxpYzoKKyAgUGFja2FnZVRvUHJlZml4ZXNDb2xsZWN0b3IoY29uc3Qgc3RkOjpzdHJpbmcgJnVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiBpbm91dF9wYWNrYWdlX3RvX3ByZWZpeF9tYXApCisgICAgICA6IHVzYWdlXyh1c2FnZSksIHByZWZpeF9tYXBfKGlub3V0X3BhY2thZ2VfdG9fcHJlZml4X21hcCkge30KKworICB2aXJ0dWFsIGJvb2wgQ29uc3VtZUxpbmUoY29uc3QgU3RyaW5nUGllY2UmIGxpbmUsIHN0ZDo6c3RyaW5nKiBvdXRfZXJyb3IpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcgdXNhZ2VfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiBwcmVmaXhfbWFwXzsKK307CisKK2NsYXNzIFByZWZpeE1vZGVTdG9yYWdlIHsKKyBwdWJsaWM6CisgIFByZWZpeE1vZGVTdG9yYWdlKCk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcGFja2FnZV90b19wcmVmaXhfbWFwcGluZ3NfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIHBhY2thZ2VfdG9fcHJlZml4X21hcHBpbmdzX3BhdGhfOyB9CisgIHZvaWQgc2V0X3BhY2thZ2VfdG9fcHJlZml4X21hcHBpbmdzX3BhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKKyAgICBwYWNrYWdlX3RvX3ByZWZpeF9tYXBwaW5nc19wYXRoXyA9IHBhdGg7CisgICAgcGFja2FnZV90b19wcmVmaXhfbWFwXy5jbGVhcigpOworICB9CisKKyAgc3RkOjpzdHJpbmcgcHJlZml4X2Zyb21fcHJvdG9fcGFja2FnZV9tYXBwaW5ncyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisKKyAgYm9vbCB1c2VfcGFja2FnZV9uYW1lKCkgY29uc3QgeyByZXR1cm4gdXNlX3BhY2thZ2VfbmFtZV87IH0KKyAgdm9pZCBzZXRfdXNlX3BhY2thZ2VfbmFtZShib29sIG9uX29yX29mZikgeyB1c2VfcGFja2FnZV9uYW1lXyA9IG9uX29yX29mZjsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4Y2VwdGlvbl9wYXRoKCkgY29uc3QgeyByZXR1cm4gZXhjZXB0aW9uX3BhdGhfOyB9CisgIHZvaWQgc2V0X2V4Y2VwdGlvbl9wYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgZXhjZXB0aW9uX3BhdGhfID0gcGF0aDsKKyAgICBleGNlcHRpb25zXy5jbGVhcigpOworICB9CisKKyAgYm9vbCBpc19wYWNrYWdlX2V4ZW1wdGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlKTsKKworICAvLyBXaGVuIHVzaW5nIGEgcHJvdG8gcGFja2FnZSBhcyB0aGUgcHJlZml4LCB0aGlzIHNob3VsZCBiZSBhZGRlZCBhcyB0aGUKKyAgLy8gcHJlZml4IGluIGZyb250IG9mIGl0LgorICBjb25zdCBzdGQ6OnN0cmluZyYgZm9yY2VkX3BhY2thZ2VfcHJlZml4KCkgY29uc3QgeyByZXR1cm4gZm9yY2VkX3ByZWZpeF87IH0KKworIHByaXZhdGU6CisgIGJvb2wgdXNlX3BhY2thZ2VfbmFtZV87CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gcGFja2FnZV90b19wcmVmaXhfbWFwXzsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV90b19wcmVmaXhfbWFwcGluZ3NfcGF0aF87CisgIHN0ZDo6c3RyaW5nIGV4Y2VwdGlvbl9wYXRoXzsKKyAgc3RkOjpzdHJpbmcgZm9yY2VkX3ByZWZpeF87CisgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gZXhjZXB0aW9uc187Cit9OworCitQcmVmaXhNb2RlU3RvcmFnZTo6UHJlZml4TW9kZVN0b3JhZ2UoKSB7CisgIC8vIEV2ZW4gdGhvdWdodCB0aGVyZSBhcmUgZ2VuZXJhdGlvbiBvcHRpb25zLCBoYXZlIGFuIGVudiBiYWNrIGRvb3Igc2luY2Ugc29tZQorICAvLyBvZiB0aGVzZSBoZWxwZXJzIGNvdWxkIGJlIHVzZWQgaW4gb3RoZXIgcGx1Z2lucy4KKworICB1c2VfcGFja2FnZV9uYW1lXyA9IEJvb2xGcm9tRW52VmFyKCJHUEJfT0JKQ19VU0VfUEFDS0FHRV9BU19QUkVGSVgiLCBmYWxzZSk7CisKKyAgY29uc3QgY2hhciogZXhjZXB0aW9uX3BhdGggPSBnZXRlbnYoIkdQQl9PQkpDX1BBQ0tBR0VfUFJFRklYX0VYQ0VQVElPTlNfUEFUSCIpOworICBpZiAoZXhjZXB0aW9uX3BhdGgpIHsKKyAgICBleGNlcHRpb25fcGF0aF8gPSBleGNlcHRpb25fcGF0aDsKKyAgfQorCisgIC8vIFRoaXMgb25lIGlzIGEgbm90IGV4cGVjdGVkIHRvIGJlIGNvbW1vbiwgc28gaXQgZG9lc24ndCBnZXQgYSBnZW5lcmF0aW9uCisgIC8vIG9wdGlvbiwganVzdCB0aGUgZW52IHZhci4KKyAgY29uc3QgY2hhciogcHJlZml4ID0gZ2V0ZW52KCJHUEJfT0JKQ19VU0VfUEFDS0FHRV9BU19QUkVGSVhfUFJFRklYIik7CisgIGlmIChwcmVmaXgpIHsKKyAgICBmb3JjZWRfcHJlZml4XyA9IHByZWZpeDsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBQcmVmaXhNb2RlU3RvcmFnZTo6cHJlZml4X2Zyb21fcHJvdG9fcGFja2FnZV9tYXBwaW5ncyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICBpZiAoIWZpbGUpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBpZiAocGFja2FnZV90b19wcmVmaXhfbWFwXy5lbXB0eSgpICYmICFwYWNrYWdlX3RvX3ByZWZpeF9tYXBwaW5nc19wYXRoXy5lbXB0eSgpKSB7CisgICAgc3RkOjpzdHJpbmcgZXJyb3Jfc3RyOworICAgIC8vIFJlIHVzZSB0aGUgc2FtZSBjb2xsZWN0b3IgYXMgd2UgdXNlIGZvciBleHBlY3RlZF9wcmVmaXhlc19wYXRoIHNpbmNlIHRoZSBmaWxlCisgICAgLy8gZm9ybWF0IGlzIHRoZSBzYW1lLgorICAgIFBhY2thZ2VUb1ByZWZpeGVzQ29sbGVjdG9yIGNvbGxlY3RvcigiUGFja2FnZSB0byBwcmVmaXhlcyIsICZwYWNrYWdlX3RvX3ByZWZpeF9tYXBfKTsKKyAgICBpZiAoIVBhcnNlU2ltcGxlRmlsZShwYWNrYWdlX3RvX3ByZWZpeF9tYXBwaW5nc19wYXRoXywgJmNvbGxlY3RvciwgJmVycm9yX3N0cikpIHsKKyAgICAgIGlmIChlcnJvcl9zdHIuZW1wdHkoKSkgeworICAgICAgICBlcnJvcl9zdHIgPSBzdGQ6OnN0cmluZygicHJvdG9jOjA6IHdhcm5pbmc6IEZhaWxlZCB0byBwYXJzZSIpCisgICAgICAgICAgICsgc3RkOjpzdHJpbmcoIiBwcmVmaXggdG8gcHJvdG8gcGFja2FnZSBtYXBwaW5ncyBmaWxlOiAiKQorICAgICAgICAgICArIHBhY2thZ2VfdG9fcHJlZml4X21hcHBpbmdzX3BhdGhfOworICAgICAgfQorICAgICAgc3RkOjpjZXJyIDw8IGVycm9yX3N0ciA8PCBzdGQ6OmVuZGw7CisgICAgICBzdGQ6OmNlcnIuZmx1c2goKTsKKyAgICAgIHBhY2thZ2VfdG9fcHJlZml4X21hcF8uY2xlYXIoKTsKKyAgICB9CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyBwYWNrYWdlID0gZmlsZS0+cGFja2FnZSgpOworICAvLyBGb3IgZmlsZXMgd2l0aG91dCBwYWNrYWdlcywgdGhlIGNhbiBiZSByZWdpc3RlcmVkIGFzICJub19wYWNrYWdlOlBBVEgiLAorICAvLyBhbGxvd2luZyB0aGUgZXhwZWN0ZWQgcHJlZml4ZXMgZmlsZS4KKyAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIG5vX3BhY2thZ2VfcHJlZml4KCJub19wYWNrYWdlOiIpOworICBjb25zdCBzdGQ6OnN0cmluZyBsb29rdXBfa2V5ID0gcGFja2FnZS5lbXB0eSgpID8gbm9fcGFja2FnZV9wcmVmaXggKyBmaWxlLT5uYW1lKCkgOiBwYWNrYWdlOworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHByZWZpeF9sb29rdXAgPQorICAgICAgcGFja2FnZV90b19wcmVmaXhfbWFwXy5maW5kKGxvb2t1cF9rZXkpOworCisgIGlmIChwcmVmaXhfbG9va3VwICE9IHBhY2thZ2VfdG9fcHJlZml4X21hcF8uZW5kKCkpIHsKKyAgICByZXR1cm4gcHJlZml4X2xvb2t1cC0+c2Vjb25kOworICB9ICAKKworICByZXR1cm4gIiI7Cit9CisKK2Jvb2wgUHJlZml4TW9kZVN0b3JhZ2U6OmlzX3BhY2thZ2VfZXhlbXB0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2UpIHsKKyAgaWYgKGV4Y2VwdGlvbnNfLmVtcHR5KCkgJiYgIWV4Y2VwdGlvbl9wYXRoXy5lbXB0eSgpKSB7CisgICAgc3RkOjpzdHJpbmcgZXJyb3Jfc3RyOworICAgIFNpbXBsZUxpbmVDb2xsZWN0b3IgY29sbGVjdG9yKCZleGNlcHRpb25zXyk7CisgICAgaWYgKCFQYXJzZVNpbXBsZUZpbGUoZXhjZXB0aW9uX3BhdGhfLCAmY29sbGVjdG9yLCAmZXJyb3Jfc3RyKSkgeworICAgICAgaWYgKGVycm9yX3N0ci5lbXB0eSgpKSB7CisgICAgICAgIGVycm9yX3N0ciA9IHN0ZDo6c3RyaW5nKCJwcm90b2M6MDogd2FybmluZzogRmFpbGVkIHRvIHBhcnNlIikKKyAgICAgICAgICAgKyBzdGQ6OnN0cmluZygiIHBhY2thZ2UgcHJlZml4IGV4Y2VwdGlvbnMgZmlsZTogIikKKyAgICAgICAgICAgKyBleGNlcHRpb25fcGF0aF87CisgICAgICB9CisgICAgICBzdGQ6OmNlcnIgPDwgZXJyb3Jfc3RyIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y2Vyci5mbHVzaCgpOworICAgICAgZXhjZXB0aW9uc18uY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgZmlsZSB3YXMgZW1wdHkgcHV0IHNvbWV0aGluZyBpbiBpdCBzbyBpdCBkb2Vzbid0IGdldCByZWxvYWRlZCBvdmVyCisgICAgLy8gYW5kIG92ZXIuCisgICAgaWYgKGV4Y2VwdGlvbnNfLmVtcHR5KCkpIHsKKyAgICAgIGV4Y2VwdGlvbnNfLmluc2VydCgiPG5vdCBhIHJlYWwgcGFja2FnZT4iKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZXhjZXB0aW9uc18uY291bnQocGFja2FnZSkgIT0gMDsKK30KKworUHJlZml4TW9kZVN0b3JhZ2UgZ19wcmVmaXhfbW9kZTsKKworfSAgLy8gbmFtZXNwYWNlCisKK3N0ZDo6c3RyaW5nIEdldFBhY2thZ2VUb1ByZWZpeE1hcHBpbmdzUGF0aCgpIHsKKyAgcmV0dXJuIGdfcHJlZml4X21vZGUucGFja2FnZV90b19wcmVmaXhfbWFwcGluZ3NfcGF0aCgpOworfQorCit2b2lkIFNldFBhY2thZ2VUb1ByZWZpeE1hcHBpbmdzUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9wYXRoKSB7CisgIGdfcHJlZml4X21vZGUuc2V0X3BhY2thZ2VfdG9fcHJlZml4X21hcHBpbmdzX3BhdGgoZmlsZV9wYXRoKTsKK30KKworYm9vbCBVc2VQcm90b1BhY2thZ2VBc0RlZmF1bHRQcmVmaXgoKSB7CisgIHJldHVybiBnX3ByZWZpeF9tb2RlLnVzZV9wYWNrYWdlX25hbWUoKTsKK30KKwordm9pZCBTZXRVc2VQcm90b1BhY2thZ2VBc0RlZmF1bHRQcmVmaXgoYm9vbCBvbl9vcl9vZmYpIHsKKyAgZ19wcmVmaXhfbW9kZS5zZXRfdXNlX3BhY2thZ2VfbmFtZShvbl9vcl9vZmYpOworfQorCitzdGQ6OnN0cmluZyBHZXRQcm90b1BhY2thZ2VQcmVmaXhFeGNlcHRpb25MaXN0KCkgeworICByZXR1cm4gZ19wcmVmaXhfbW9kZS5leGNlcHRpb25fcGF0aCgpOworfQorCit2b2lkIFNldFByb3RvUGFja2FnZVByZWZpeEV4Y2VwdGlvbkxpc3QoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfcGF0aCkgeworICBnX3ByZWZpeF9tb2RlLnNldF9leGNlcHRpb25fcGF0aChmaWxlX3BhdGgpOworfQorCitPcHRpb25zOjpPcHRpb25zKCkgeworICAvLyBXaGlsZSB0aGVyZSBhcmUgZ2VuZXJhdG9yIG9wdGlvbnMsIGFsc28gc3VwcG9ydCBlbnYgdmFyaWFibGVzIHRvIGhlbHAgd2l0aAorICAvLyBidWlsZCBzeXN0ZW1zIHdoZXJlIGl0IGlzbid0IGFzIGVhc3kgdG8gaG9vayBpbiBmb3IgYWRkIHRoZSBnZW5lcmF0aW9uCisgIC8vIG9wdGlvbnMgd2hlbiBpbnZva2luZyBwcm90b2MuCisgIGNvbnN0IGNoYXIqIGZpbGVfcGF0aCA9IGdldGVudigiR1BCX09CSkNfRVhQRUNURURfUEFDS0FHRV9QUkVGSVhFUyIpOworICBpZiAoZmlsZV9wYXRoKSB7CisgICAgZXhwZWN0ZWRfcHJlZml4ZXNfcGF0aCA9IGZpbGVfcGF0aDsKKyAgfQorICBjb25zdCBjaGFyKiBzdXBwcmVzc2lvbnMgPSBnZXRlbnYoIkdQQl9PQkpDX0VYUEVDVEVEX1BBQ0tBR0VfUFJFRklYRVNfU1VQUFJFU1NJT05TIik7CisgIGlmIChzdXBwcmVzc2lvbnMpIHsKKyAgICBleHBlY3RlZF9wcmVmaXhlc19zdXBwcmVzc2lvbnMgPQorICAgICAgICBTcGxpdChzdXBwcmVzc2lvbnMsICI7IiwgdHJ1ZSk7CisgIH0KKyAgcHJlZml4ZXNfbXVzdF9iZV9yZWdpc3RlcmVkID0KKyAgICAgIEJvb2xGcm9tRW52VmFyKCJHUEJfT0JKQ19QUkVGSVhFU19NVVNUX0JFX1JFR0lTVEVSRUQiLCBmYWxzZSk7CisgIHJlcXVpcmVfcHJlZml4ZXMgPSBCb29sRnJvbUVudlZhcigiR1BCX09CSkNfUkVRVUlSRV9QUkVGSVhFUyIsIGZhbHNlKTsKK30KKworbmFtZXNwYWNlIHsKKworc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBNYWtlV29yZHNNYXAoY29uc3QgY2hhciogY29uc3Qgd29yZHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fd29yZHMpIHsKKyAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiByZXN1bHQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3dvcmRzOyBpKyspIHsKKyAgICByZXN1bHQuaW5zZXJ0KHdvcmRzW2ldKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitjb25zdCBjaGFyKiBjb25zdCBrVXBwZXJTZWdtZW50c0xpc3RbXSA9IHsidXJsIiwgImh0dHAiLCAiaHR0cHMifTsKKworc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBrVXBwZXJTZWdtZW50cyA9CisgICAgTWFrZVdvcmRzTWFwKGtVcHBlclNlZ21lbnRzTGlzdCwgR09PR0xFX0FSUkFZU0laRShrVXBwZXJTZWdtZW50c0xpc3QpKTsKKworYm9vbCBhc2NpaV9pc25ld2xpbmUoY2hhciBjKSB7CisgIHJldHVybiBjID09ICdcbicgfHwgYyA9PSAnXHInOworfQorCisvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIG5hbWUgaGFuZGluZy4KKy8vIERvIG5vdCBleHBvc2UgdGhpcyBvdXRzaWRlIG9mIGhlbHBlcnMsIHN0aWNrIHRvIGhhdmluZyBmdW5jdGlvbnMgZm9yIHNwZWNpZmljCisvLyBjYXNlcyAoQ2xhc3NOYW1lKCksIEZpZWxkTmFtZSgpKSwgc28gdGhlcmUgaXMgYWx3YXlzIGNvbnNpc3RlbnQgc3VmZml4IHJ1bGVzLgorc3RkOjpzdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmlyc3RfY2FwaXRhbGl6ZWQpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZhbHVlczsKKyAgc3RkOjpzdHJpbmcgY3VycmVudDsKKworICBib29sIGxhc3RfY2hhcl93YXNfbnVtYmVyID0gZmFsc2U7CisgIGJvb2wgbGFzdF9jaGFyX3dhc19sb3dlciA9IGZhbHNlOworICBib29sIGxhc3RfY2hhcl93YXNfdXBwZXIgPSBmYWxzZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5zaXplKCk7IGkrKykgeworICAgIGNoYXIgYyA9IGlucHV0W2ldOworICAgIGlmIChhc2NpaV9pc2RpZ2l0KGMpKSB7CisgICAgICBpZiAoIWxhc3RfY2hhcl93YXNfbnVtYmVyKSB7CisgICAgICAgIHZhbHVlcy5wdXNoX2JhY2soY3VycmVudCk7CisgICAgICAgIGN1cnJlbnQgPSAiIjsKKyAgICAgIH0KKyAgICAgIGN1cnJlbnQgKz0gYzsKKyAgICAgIGxhc3RfY2hhcl93YXNfbnVtYmVyID0gbGFzdF9jaGFyX3dhc19sb3dlciA9IGxhc3RfY2hhcl93YXNfdXBwZXIgPSBmYWxzZTsKKyAgICAgIGxhc3RfY2hhcl93YXNfbnVtYmVyID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGFzY2lpX2lzbG93ZXIoYykpIHsKKyAgICAgIC8vIGxvd2VyY2FzZSBsZXR0ZXIgY2FuIGZvbGxvdyBhIGxvd2VyY2FzZSBvciB1cHBlcmNhc2UgbGV0dGVyCisgICAgICBpZiAoIWxhc3RfY2hhcl93YXNfbG93ZXIgJiYgIWxhc3RfY2hhcl93YXNfdXBwZXIpIHsKKyAgICAgICAgdmFsdWVzLnB1c2hfYmFjayhjdXJyZW50KTsKKyAgICAgICAgY3VycmVudCA9ICIiOworICAgICAgfQorICAgICAgY3VycmVudCArPSBjOyAgLy8gYWxyZWFkeSBsb3dlcgorICAgICAgbGFzdF9jaGFyX3dhc19udW1iZXIgPSBsYXN0X2NoYXJfd2FzX2xvd2VyID0gbGFzdF9jaGFyX3dhc191cHBlciA9IGZhbHNlOworICAgICAgbGFzdF9jaGFyX3dhc19sb3dlciA9IHRydWU7CisgICAgfSBlbHNlIGlmIChhc2NpaV9pc3VwcGVyKGMpKSB7CisgICAgICBpZiAoIWxhc3RfY2hhcl93YXNfdXBwZXIpIHsKKyAgICAgICAgdmFsdWVzLnB1c2hfYmFjayhjdXJyZW50KTsKKyAgICAgICAgY3VycmVudCA9ICIiOworICAgICAgfQorICAgICAgY3VycmVudCArPSBhc2NpaV90b2xvd2VyKGMpOworICAgICAgbGFzdF9jaGFyX3dhc19udW1iZXIgPSBsYXN0X2NoYXJfd2FzX2xvd2VyID0gbGFzdF9jaGFyX3dhc191cHBlciA9IGZhbHNlOworICAgICAgbGFzdF9jaGFyX3dhc191cHBlciA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGxhc3RfY2hhcl93YXNfbnVtYmVyID0gbGFzdF9jaGFyX3dhc19sb3dlciA9IGxhc3RfY2hhcl93YXNfdXBwZXIgPSBmYWxzZTsKKyAgICB9CisgIH0KKyAgdmFsdWVzLnB1c2hfYmFjayhjdXJyZW50KTsKKworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIGJvb2wgZmlyc3Rfc2VnbWVudF9mb3JjZXNfdXBwZXIgPSBmYWxzZTsKKyAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGkgPSB2YWx1ZXMuYmVnaW4oKTsgaSAhPSB2YWx1ZXMuZW5kKCk7CisgICAgICAgKytpKSB7CisgICAgc3RkOjpzdHJpbmcgdmFsdWUgPSAqaTsKKyAgICBib29sIGFsbF91cHBlciA9IChrVXBwZXJTZWdtZW50cy5jb3VudCh2YWx1ZSkgPiAwKTsKKyAgICBpZiAoYWxsX3VwcGVyICYmIChyZXN1bHQubGVuZ3RoKCkgPT0gMCkpIHsKKyAgICAgIGZpcnN0X3NlZ21lbnRfZm9yY2VzX3VwcGVyID0gdHJ1ZTsKKyAgICB9CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCB2YWx1ZS5sZW5ndGgoKTsgaisrKSB7CisgICAgICBpZiAoaiA9PSAwIHx8IGFsbF91cHBlcikgeworICAgICAgICB2YWx1ZVtqXSA9IGFzY2lpX3RvdXBwZXIodmFsdWVbal0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTm90aGluZywgYWxyZWFkeSBpbiBsb3dlci4KKyAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0ICs9IHZhbHVlOworICB9CisgIGlmICgocmVzdWx0Lmxlbmd0aCgpICE9IDApICYmCisgICAgICAhZmlyc3RfY2FwaXRhbGl6ZWQgJiYKKyAgICAgICFmaXJzdF9zZWdtZW50X2ZvcmNlc191cHBlcikgeworICAgIHJlc3VsdFswXSA9IGFzY2lpX3RvbG93ZXIocmVzdWx0WzBdKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitjb25zdCBjaGFyKiBjb25zdCBrUmVzZXJ2ZWRXb3JkTGlzdFtdID0geworICAvLyBOb3RlIE5TT2JqZWN0IE1ldGhvZHM6CisgIC8vIFRoZXNlIGFyZSBicm91Z2h0IGluIGZyb20gb2JqZWN0aXZlY19uc29iamVjdF9tZXRob2RzLmggdGhhdCBpcyBnZW5lcmF0ZWQKKyAgLy8gdXNpbmcgbWV0aG9kX2R1bXAuc2guIFNlZSBrTlNPYmplY3RNZXRob2RzIGJlbG93LgorCisgIC8vIE9iamVjdGl2ZSBDICJrZXl3b3JkcyIgdGhhdCBhcmVuJ3QgaW4gQworICAvLyBGcm9tCisgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTg3MzYzMC9yZXNlcnZlZC1rZXl3b3Jkcy1pbi1vYmplY3RpdmUtYworICAvLyB3aXRoIHNvbWUgb3RoZXJzIGFkZGVkIG9uLgorICAiaWQiLCAiX2NtZCIsICJzdXBlciIsICJpbiIsICJvdXQiLCAiaW5vdXQiLCAiYnljb3B5IiwgImJ5cmVmIiwgIm9uZXdheSIsCisgICJzZWxmIiwgImluc3RhbmNldHlwZSIsICJudWxsYWJsZSIsICJub25udWxsIiwgIm5pbCIsICJOaWwiLAorICAiWUVTIiwgIk5PIiwgIndlYWsiLAorCisgIC8vIEMvQysrIGtleXdvcmRzIChJbmNsIEMrKyAweDExKQorICAvLyBGcm9tIGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2tleXdvcmRzCisgICJhbmQiLCAiYW5kX2VxIiwgImFsaWduYXMiLCAiYWxpZ25vZiIsICJhc20iLCAiYXV0byIsICJiaXRhbmQiLCAiYml0b3IiLAorICAiYm9vbCIsICJicmVhayIsICJjYXNlIiwgImNhdGNoIiwgImNoYXIiLCAiY2hhcjE2X3QiLCAiY2hhcjMyX3QiLCAiY2xhc3MiLAorICAiY29tcGwiLCAiY29uc3QiLCAiY29uc3RleHByIiwgImNvbnN0X2Nhc3QiLCAiY29udGludWUiLCAiZGVjbHR5cGUiLAorICAiZGVmYXVsdCIsICJkZWxldGUiLCAiZG91YmxlIiwgImR5bmFtaWNfY2FzdCIsICJlbHNlIiwgImVudW0iLCAiZXhwbGljaXQiLAorICAiZXhwb3J0IiwgImV4dGVybiAiLCAiZmFsc2UiLCAiZmxvYXQiLCAiZm9yIiwgImZyaWVuZCIsICJnb3RvIiwgImlmIiwKKyAgImlubGluZSIsICJpbnQiLCAibG9uZyIsICJtdXRhYmxlIiwgIm5hbWVzcGFjZSIsICJuZXciLCAibm9leGNlcHQiLCAibm90IiwKKyAgIm5vdF9lcSIsICJudWxscHRyIiwgIm9wZXJhdG9yIiwgIm9yIiwgIm9yX2VxIiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwKKyAgInB1YmxpYyIsICJyZWdpc3RlciIsICJyZWludGVycHJldF9jYXN0IiwgInJldHVybiIsICJzaG9ydCIsICJzaWduZWQiLAorICAic2l6ZW9mIiwgInN0YXRpYyIsICJzdGF0aWNfYXNzZXJ0IiwgInN0YXRpY19jYXN0IiwgInN0cnVjdCIsICJzd2l0Y2giLAorICAidGVtcGxhdGUiLCAidGhpcyIsICJ0aHJlYWRfbG9jYWwiLCAidGhyb3ciLCAidHJ1ZSIsICJ0cnkiLCAidHlwZWRlZiIsCisgICJ0eXBlaWQiLCAidHlwZW5hbWUiLCAidW5pb24iLCAidW5zaWduZWQiLCAidXNpbmciLCAidmlydHVhbCIsICJ2b2lkIiwKKyAgInZvbGF0aWxlIiwgIndjaGFyX3QiLCAid2hpbGUiLCAieG9yIiwgInhvcl9lcSIsCisKKyAgLy8gQzk5IGtleXdvcmRzCisgIC8vIEZyb20KKyAgLy8gaHR0cDovL3B1YmxpYi5ib3VsZGVyLmlibS5jb20vaW5mb2NlbnRlci9sbnhwY29tcC92OHYxMDEvaW5kZXguanNwP3RvcGljPSUyRmNvbS5pYm0ueGxjcHA4bC5kb2MlMkZsYW5ndWFnZSUyRnJlZiUyRmtleXcuaHRtCisgICJyZXN0cmljdCIsCisKKyAgLy8gR0NDL0NsYW5nIGV4dGVuc2lvbgorICAidHlwZW9mIiwKKworICAvLyBOb3QgYSBrZXl3b3JkLCBidXQgd2lsbCBicmVhayB5b3UKKyAgIk5VTEwiLAorCisgIC8vIEM4OCsgc3BlY3MgY2FsbCBmb3IgdGhlc2UgdG8gYmUgbWFjcm9zLCBzbyBkZXBlbmRpbmcgb24gd2hhdCB0aGV5IGFyZQorICAvLyBkZWZpbmVkIHRvIGJlIGl0IGNhbiBsZWFkIHRvIG9kZCBlcnJvcnMgZm9yIHNvbWUgWGNvZGUvU0RLIHZlcnNpb25zLgorICAic3RkaW4iLCAic3Rkb3V0IiwgInN0ZGVyciIsCisKKyAgLy8gT2JqZWN0aXZlLUMgUnVudGltZSB0eXBlZGVmcworICAvLyBGcm9tIDxvYmMvcnVudGltZS5oPgorICAiQ2F0ZWdvcnkiLCAiSXZhciIsICJNZXRob2QiLCAiUHJvdG9jb2wiLAorCisgIC8vIEdQQk1lc3NhZ2UgTWV0aG9kcworICAvLyBPbmx5IG5lZWQgdG8gYWRkIGluc3RhbmNlIG1ldGhvZHMgdGhhdCBtYXkgY29uZmxpY3Qgd2l0aAorICAvLyBtZXRob2QgZGVjbGFyZWQgaW4gcHJvdG9zLiBUaGUgbWFpbiBjYXNlcyBhcmUgbWV0aG9kcworICAvLyB0aGF0IHRha2Ugbm8gYXJndW1lbnRzLCBvciBzZXRGb286L2hhc0ZvbzogdHlwZSBtZXRob2RzLgorICAiY2xlYXIiLCAiZGF0YSIsICJkZWxpbWl0ZWREYXRhIiwgImRlc2NyaXB0b3IiLCAiZXh0ZW5zaW9uUmVnaXN0cnkiLAorICAiZXh0ZW5zaW9uc0N1cnJlbnRseVNldCIsICJpbml0aWFsaXplZCIsICJpc0luaXRpYWxpemVkIiwgInNlcmlhbGl6ZWRTaXplIiwKKyAgInNvcnRlZEV4dGVuc2lvbnNJblVzZSIsICJ1bmtub3duRmllbGRzIiwKKworICAvLyBNYWNUeXBlcy5oIG5hbWVzCisgICJGaXhlZCIsICJGcmFjdCIsICJTaXplIiwgIkxvZ2ljYWxBZGRyZXNzIiwgIlBoeXNpY2FsQWRkcmVzcyIsICJCeXRlQ291bnQiLAorICAiQnl0ZU9mZnNldCIsICJEdXJhdGlvbiIsICJBYnNvbHV0ZVRpbWUiLCAiT3B0aW9uQml0cyIsICJJdGVtQ291bnQiLAorICAiUEJWZXJzaW9uIiwgIlNjcmlwdENvZGUiLCAiTGFuZ0NvZGUiLCAiUmVnaW9uQ29kZSIsICJPU1R5cGUiLAorICAiUHJvY2Vzc1NlcmlhbE51bWJlciIsICJQb2ludCIsICJSZWN0IiwgIkZpeGVkUG9pbnQiLCAiRml4ZWRSZWN0IiwgIlN0eWxlIiwKKyAgIlN0eWxlUGFyYW1ldGVyIiwgIlN0eWxlRmllbGQiLCAiVGltZVNjYWxlIiwgIlRpbWVCYXNlIiwgIlRpbWVSZWNvcmQiLAorfTsKKworLy8gcmV0dXJucyB0cnVlIGlzIGlucHV0IHN0YXJ0cyB3aXRoIF9fIG9yIF9bQS1aXSB3aGljaCBhcmUgcmVzZXJ2ZWQgaWRlbnRpZmllcnMKKy8vIGluIEMvIEMrKy4gQWxsIGNhbGxzIHNob3VsZCBnbyB0aHJvdWdoIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UgYmVmb3JlIGdldHRpbmcgaGVyZQorLy8gYnV0IHRoaXMgdmVyaWZpZXMgYW5kIGFsbG93cyBmb3IgZnV0dXJlIGV4cGFuc2lvbiBpZiB3ZSBkZWNpZGUgdG8gcmVkZWZpbmUgd2hhdCBhCisvLyByZXNlcnZlZCBDIGlkZW50aWZpZXIgaXMgKGZvciBleGFtcGxlIHRoZSBHTlUgbGlzdAorLy8gaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJjL21hbnVhbC9odG1sX25vZGUvUmVzZXJ2ZWQtTmFtZXMuaHRtbCApCitib29sIElzUmVzZXJ2ZWRDSWRlbnRpZmllcihjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQpIHsKKyAgaWYgKGlucHV0Lmxlbmd0aCgpID4gMikgeworICAgIGlmIChpbnB1dC5hdCgwKSA9PSAnXycpIHsKKyAgICAgIGlmIChpc3VwcGVyKGlucHV0LmF0KDEpKSB8fCBpbnB1dC5hdCgxKSA9PSAnXycpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjpzdHJpbmcgU2FuaXRpemVOYW1lRm9yT2JqQyhjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRfc3VmZml4X2FkZGVkKSB7CisgIHN0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGtSZXNlcnZlZFdvcmRzID0KKyAgICAgIE1ha2VXb3Jkc01hcChrUmVzZXJ2ZWRXb3JkTGlzdCwgR09PR0xFX0FSUkFZU0laRShrUmVzZXJ2ZWRXb3JkTGlzdCkpOworICBzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBrTlNPYmplY3RNZXRob2RzID0KKyAgICAgIE1ha2VXb3Jkc01hcChrTlNPYmplY3RNZXRob2RzTGlzdCwgR09PR0xFX0FSUkFZU0laRShrTlNPYmplY3RNZXRob2RzTGlzdCkpOworICBzdGQ6OnN0cmluZyBzYW5pdGl6ZWQ7CisgIC8vIFdlIGFkZCB0aGUgcHJlZml4IGluIHRoZSBjYXNlcyB3aGVyZSB0aGUgc3RyaW5nIGlzIG1pc3NpbmcgYSBwcmVmaXguCisgIC8vIFdlIGRlZmluZSAibWlzc2luZyBhIHByZWZpeCIgYXMgd2hlcmUgJ2lucHV0JzoKKyAgLy8gYSkgRG9lc24ndCBzdGFydCB3aXRoIHRoZSBwcmVmaXggb3IKKyAgLy8gYikgSXNuJ3QgZXF1aXZhbGVudCB0byB0aGUgcHJlZml4IG9yCisgIC8vIGMpIEhhcyB0aGUgcHJlZml4LCBidXQgdGhlIGxldHRlciBhZnRlciB0aGUgcHJlZml4IGlzIGxvd2VyY2FzZQorICBpZiAoSGFzUHJlZml4U3RyaW5nKGlucHV0LCBwcmVmaXgpKSB7CisgICAgaWYgKGlucHV0Lmxlbmd0aCgpID09IHByZWZpeC5sZW5ndGgoKSB8fCAhYXNjaWlfaXN1cHBlcihpbnB1dFtwcmVmaXgubGVuZ3RoKCldKSkgeworICAgICAgc2FuaXRpemVkID0gcHJlZml4ICsgaW5wdXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHNhbml0aXplZCA9IGlucHV0OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzYW5pdGl6ZWQgPSBwcmVmaXggKyBpbnB1dDsKKyAgfQorICBpZiAoSXNSZXNlcnZlZENJZGVudGlmaWVyKHNhbml0aXplZCkgfHwKKyAgICAgIChrUmVzZXJ2ZWRXb3Jkcy5jb3VudChzYW5pdGl6ZWQpID4gMCkgfHwKKyAgICAgIChrTlNPYmplY3RNZXRob2RzLmNvdW50KHNhbml0aXplZCkgPiAwKSkgeworICAgIGlmIChvdXRfc3VmZml4X2FkZGVkKSAqb3V0X3N1ZmZpeF9hZGRlZCA9IGV4dGVuc2lvbjsKKyAgICByZXR1cm4gc2FuaXRpemVkICsgZXh0ZW5zaW9uOworICB9CisgIGlmIChvdXRfc3VmZml4X2FkZGVkKSBvdXRfc3VmZml4X2FkZGVkLT5jbGVhcigpOworICByZXR1cm4gc2FuaXRpemVkOworfQorCitzdGQ6OnN0cmluZyBOYW1lRnJvbUZpZWxkRGVzY3JpcHRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGlmIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgeworICAgIHJldHVybiBmaWVsZC0+bWVzc2FnZV90eXBlKCktPm5hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmllbGQtPm5hbWUoKTsKKyAgfQorfQorCit2b2lkIFBhdGhTcGxpdChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBiYXNlbmFtZSkgeworICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBwYXRoLnJmaW5kKCcvJyk7CisgIGlmIChsYXN0X3NsYXNoID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgaWYgKGRpcmVjdG9yeSkgeworICAgICAgKmRpcmVjdG9yeSA9ICIiOworICAgIH0KKyAgICBpZiAoYmFzZW5hbWUpIHsKKyAgICAgICpiYXNlbmFtZSA9IHBhdGg7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChkaXJlY3RvcnkpIHsKKyAgICAgICpkaXJlY3RvcnkgPSBwYXRoLnN1YnN0cigwLCBsYXN0X3NsYXNoKTsKKyAgICB9CisgICAgaWYgKGJhc2VuYW1lKSB7CisgICAgICAqYmFzZW5hbWUgPSBwYXRoLnN1YnN0cihsYXN0X3NsYXNoICsgMSk7CisgICAgfQorICB9Cit9CisKK2Jvb2wgSXNTcGVjaWFsTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcqIHNwZWNpYWxfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50KSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgIHNpemVfdCBsZW5ndGggPSBzcGVjaWFsX25hbWVzW2ldLmxlbmd0aCgpOworICAgIGlmIChuYW1lLmNvbXBhcmUoMCwgbGVuZ3RoLCBzcGVjaWFsX25hbWVzW2ldKSA9PSAwKSB7CisgICAgICBpZiAobmFtZS5sZW5ndGgoKSA+IGxlbmd0aCkgeworICAgICAgICAvLyBJZiBuYW1lIGlzIGxvbmdlciB0aGFuIHRoZSByZXRhaW5lZF9uYW1lW2ldIHRoYXQgaXQgbWF0Y2hlcworICAgICAgICAvLyB0aGUgbmV4dCBjaGFyYWN0ZXIgbXVzdCBiZSBub3QgbG93ZXIgY2FzZSAobmV3dG9uIHZzIG5ld1RvbiB2cworICAgICAgICAvLyBuZXdfdG9uKS4KKyAgICAgICAgcmV0dXJuICFhc2NpaV9pc2xvd2VyKG5hbWVbbGVuZ3RoXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGQ6OnN0cmluZyBHZXRaZXJvRW51bU5hbWVGb3JGbGFnVHlwZShjb25zdCBGbGFnVHlwZSBmbGFnX3R5cGUpIHsKKyAgc3dpdGNoKGZsYWdfdHlwZSkgeworICAgIGNhc2UgRkxBR1RZUEVfREVTQ1JJUFRPUl9JTklUSUFMSVpBVElPTjoKKyAgICAgIHJldHVybiAiR1BCRGVzY3JpcHRvckluaXRpYWxpemF0aW9uRmxhZ19Ob25lIjsKKyAgICBjYXNlIEZMQUdUWVBFX0VYVEVOU0lPTjoKKyAgICAgIHJldHVybiAiR1BCRXh0ZW5zaW9uTm9uZSI7CisgICAgY2FzZSBGTEFHVFlQRV9GSUVMRDoKKyAgICAgIHJldHVybiAiR1BCRmllbGROb25lIjsKKyAgICBkZWZhdWx0OgorICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgICAgICByZXR1cm4gIjAiOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIEdldEVudW1OYW1lRm9yRmxhZ1R5cGUoY29uc3QgRmxhZ1R5cGUgZmxhZ190eXBlKSB7CisgIHN3aXRjaChmbGFnX3R5cGUpIHsKKyAgICBjYXNlIEZMQUdUWVBFX0RFU0NSSVBUT1JfSU5JVElBTElaQVRJT046CisgICAgICByZXR1cm4gIkdQQkRlc2NyaXB0b3JJbml0aWFsaXphdGlvbkZsYWdzIjsKKyAgICBjYXNlIEZMQUdUWVBFX0VYVEVOU0lPTjoKKyAgICAgIHJldHVybiAiR1BCRXh0ZW5zaW9uT3B0aW9ucyI7CisgICAgY2FzZSBGTEFHVFlQRV9GSUVMRDoKKyAgICAgIHJldHVybiAiR1BCRmllbGRGbGFncyI7CisgICAgZGVmYXVsdDoKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgIH0KK30KKwordm9pZCBNYXliZVVuUXVvdGUoU3RyaW5nUGllY2UqIGlucHV0KSB7CisgIGlmICgoaW5wdXQtPmxlbmd0aCgpID49IDIpICYmCisgICAgICAoKCppbnB1dC0+ZGF0YSgpID09ICdcJycgfHwgKmlucHV0LT5kYXRhKCkgPT0gJyInKSkgJiYKKyAgICAgICgoKmlucHV0KVtpbnB1dC0+bGVuZ3RoKCkgLSAxXSA9PSAqaW5wdXQtPmRhdGEoKSkpIHsKKyAgICBpbnB1dC0+cmVtb3ZlX3ByZWZpeCgxKTsKKyAgICBpbnB1dC0+cmVtb3ZlX3N1ZmZpeCgxKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gRXNjYXBlIEMrKyB0cmlncmFwaHMgYnkgZXNjYXBpbmcgcXVlc3Rpb24gbWFya3MgdG8gXD8KK3N0ZDo6c3RyaW5nIEVzY2FwZVRyaWdyYXBocyhjb25zdCBzdGQ6OnN0cmluZyYgdG9fZXNjYXBlKSB7CisgIHJldHVybiBTdHJpbmdSZXBsYWNlKHRvX2VzY2FwZSwgIj8iLCAiXFw/IiwgdHJ1ZSk7Cit9CisKK3ZvaWQgVHJpbVdoaXRlc3BhY2UoU3RyaW5nUGllY2UqIGlucHV0KSB7CisgIHdoaWxlICghaW5wdXQtPmVtcHR5KCkgJiYgYXNjaWlfaXNzcGFjZSgqaW5wdXQtPmRhdGEoKSkpIHsKKyAgICBpbnB1dC0+cmVtb3ZlX3ByZWZpeCgxKTsKKyAgfQorICB3aGlsZSAoIWlucHV0LT5lbXB0eSgpICYmIGFzY2lpX2lzc3BhY2UoKCppbnB1dClbaW5wdXQtPmxlbmd0aCgpIC0gMV0pKSB7CisgICAgaW5wdXQtPnJlbW92ZV9zdWZmaXgoMSk7CisgIH0KK30KKworYm9vbCBJc1JldGFpbmVkTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAvLyBMaXN0IG9mIHByZWZpeGVzIGZyb20KKyAgLy8gaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vbGlicmFyeS9tYWMvI2RvY3VtZW50YXRpb24vQ29jb2EvQ29uY2VwdHVhbC9NZW1vcnlNZ210L0FydGljbGVzL21tUnVsZXMuaHRtbAorICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgcmV0YWluZWRfbmFtZXNbXSA9IHsibmV3IiwgImFsbG9jIiwgImNvcHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXV0YWJsZUNvcHkifTsKKyAgcmV0dXJuIElzU3BlY2lhbE5hbWUobmFtZSwgcmV0YWluZWRfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyZXRhaW5lZF9uYW1lcykgLyBzaXplb2YocmV0YWluZWRfbmFtZXNbMF0pKTsKK30KKworYm9vbCBJc0luaXROYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBpbml0X25hbWVzW10gPSB7ImluaXQifTsKKyAgcmV0dXJuIElzU3BlY2lhbE5hbWUobmFtZSwgaW5pdF9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGluaXRfbmFtZXMpIC8gc2l6ZW9mKGluaXRfbmFtZXNbMF0pKTsKK30KKworc3RkOjpzdHJpbmcgQmFzZUZpbGVOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIHN0ZDo6c3RyaW5nIGJhc2VuYW1lOworICBQYXRoU3BsaXQoZmlsZS0+bmFtZSgpLCBOVUxMLCAmYmFzZW5hbWUpOworICByZXR1cm4gYmFzZW5hbWU7Cit9CisKK3N0ZDo6c3RyaW5nIEZpbGVDbGFzc1ByZWZpeChjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICAvLyBBbHdheXMgaG9ub3IgdGhlIGZpbGUgb3B0aW9uLgorICBpZiAoZmlsZS0+b3B0aW9ucygpLmhhc19vYmpjX2NsYXNzX3ByZWZpeCgpKSB7CisgICAgcmV0dXJuIGZpbGUtPm9wdGlvbnMoKS5vYmpjX2NsYXNzX3ByZWZpeCgpOworICB9CisKKyAgLy8gSWYgcGFja2FnZSBwcmVmaXggaXMgc3BlY2lmaWVkIGluIGFuIHByZWZpeCB0byBwcm90byBtYXBwaW5ncyBmaWxlIHRoZW4gdXNlIHRoYXQuCisgIHN0ZDo6c3RyaW5nIG9iamNfY2xhc3NfcHJlZml4ID0gZ19wcmVmaXhfbW9kZS5wcmVmaXhfZnJvbV9wcm90b19wYWNrYWdlX21hcHBpbmdzKGZpbGUpOworICBpZiAoIW9iamNfY2xhc3NfcHJlZml4LmVtcHR5KCkpIHsKKyAgICByZXR1cm4gb2JqY19jbGFzc19wcmVmaXg7CisgIH0KKworICAvLyBJZiBwYWNrYWdlIHByZWZpeCBpc24ndCBlbmFibGVkLCBkb25lLgorICBpZiAoIWdfcHJlZml4X21vZGUudXNlX3BhY2thZ2VfbmFtZSgpKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8gSWYgdGhlIHBhY2thZ2UgaXMgaW4gdGhlIGV4Y2VwdGlvbnMgbGlzdCwgZG9uZS4KKyAgaWYgKGdfcHJlZml4X21vZGUuaXNfcGFja2FnZV9leGVtcHRlZChmaWxlLT5wYWNrYWdlKCkpKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8gVHJhbnNmb3JtIHRoZSBwYWNrYWdlIGludG8gYSBwcmVmaXg6IHVzZSB0aGUgZG90IHNlZ21lbnRzIGFzIHBhcnQsCisgIC8vIGNhbWVsY2FzZSBlYWNoIG9uZSBhbmQgdGhlbiBqb2luIHRoZW0gd2l0aCB1bmRlcnNjb3JlcywgYW5kIGFkZCBhbgorICAvLyB1bmRlcnNjb3JlIGF0IHRoZSBlbmQuCisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNlZ21lbnRzID0gU3BsaXQoZmlsZS0+cGFja2FnZSgpLCAiLiIsIHRydWUpOworICBmb3IgKGNvbnN0IGF1dG8mIHNlZ21lbnQgOiBzZWdtZW50cykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhcnQgPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKHNlZ21lbnQsIHRydWUpOworICAgIGlmIChwYXJ0LmVtcHR5KCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIXJlc3VsdC5lbXB0eSgpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCJfIik7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQocGFydCk7CisgIH0KKyAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoIl8iKTsKKyAgfQorICByZXR1cm4gZ19wcmVmaXhfbW9kZS5mb3JjZWRfcGFja2FnZV9wcmVmaXgoKSArIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgRmlsZVBhdGgoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgc3RkOjpzdHJpbmcgb3V0cHV0OworICBzdGQ6OnN0cmluZyBiYXNlbmFtZTsKKyAgc3RkOjpzdHJpbmcgZGlyZWN0b3J5OworICBQYXRoU3BsaXQoZmlsZS0+bmFtZSgpLCAmZGlyZWN0b3J5LCAmYmFzZW5hbWUpOworICBpZiAoZGlyZWN0b3J5Lmxlbmd0aCgpID4gMCkgeworICAgIG91dHB1dCA9IGRpcmVjdG9yeSArICIvIjsKKyAgfQorICBiYXNlbmFtZSA9IFN0cmlwUHJvdG8oYmFzZW5hbWUpOworCisgIC8vIENhbWVsQ2FzZSB0byBiZSBtb3JlIE9iakMgZnJpZW5kbHkuCisgIGJhc2VuYW1lID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShiYXNlbmFtZSwgdHJ1ZSk7CisKKyAgb3V0cHV0ICs9IGJhc2VuYW1lOworICByZXR1cm4gb3V0cHV0OworfQorCitzdGQ6OnN0cmluZyBGaWxlUGF0aEJhc2VuYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIHN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgc3RkOjpzdHJpbmcgYmFzZW5hbWU7CisgIHN0ZDo6c3RyaW5nIGRpcmVjdG9yeTsKKyAgUGF0aFNwbGl0KGZpbGUtPm5hbWUoKSwgJmRpcmVjdG9yeSwgJmJhc2VuYW1lKTsKKyAgYmFzZW5hbWUgPSBTdHJpcFByb3RvKGJhc2VuYW1lKTsKKworICAvLyBDYW1lbENhc2UgdG8gYmUgbW9yZSBPYmpDIGZyaWVuZGx5LgorICBvdXRwdXQgPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGJhc2VuYW1lLCB0cnVlKTsKKworICByZXR1cm4gb3V0cHV0OworfQorCitzdGQ6OnN0cmluZyBGaWxlQ2xhc3NOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IEZpbGVDbGFzc1ByZWZpeChmaWxlKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSA9CisgICAgICBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKFN0cmlwUHJvdG8oQmFzZUZpbGVOYW1lKGZpbGUpKSwgdHJ1ZSkgKyAiUm9vdCI7CisgIC8vIFRoZXJlIGFyZW4ndCByZWFsbHkgYW55IHJlc2VydmVkIHdvcmRzIHRoYXQgZW5kIGluICJSb290IiwgYnV0IHBsYXlpbmcKKyAgLy8gaXQgc2FmZSBhbmQgY2hlY2tpbmcuCisgIHJldHVybiBTYW5pdGl6ZU5hbWVGb3JPYmpDKHByZWZpeCwgbmFtZSwgIl9Sb290Q2xhc3MiLCBOVUxMKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lV29ya2VyKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgaWYgKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpICE9IE5VTEwpIHsKKyAgICBuYW1lID0gQ2xhc3NOYW1lV29ya2VyKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgICBuYW1lICs9ICJfIjsKKyAgfQorICByZXR1cm4gbmFtZSArIGRlc2NyaXB0b3ItPm5hbWUoKTsKK30KKworc3RkOjpzdHJpbmcgQ2xhc3NOYW1lV29ya2VyKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHN0ZDo6c3RyaW5nIG5hbWU7CisgIGlmIChkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSAhPSBOVUxMKSB7CisgICAgbmFtZSA9IENsYXNzTmFtZVdvcmtlcihkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSk7CisgICAgbmFtZSArPSAiXyI7CisgIH0KKyAgcmV0dXJuIG5hbWUgKyBkZXNjcmlwdG9yLT5uYW1lKCk7Cit9CisKK3N0ZDo6c3RyaW5nIENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBDbGFzc05hbWUoZGVzY3JpcHRvciwgTlVMTCk7Cit9CisKK3N0ZDo6c3RyaW5nIENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRfc3VmZml4X2FkZGVkKSB7CisgIC8vIDEuIE1lc3NhZ2UgbmFtZXMgYXJlIHVzZWQgYXMgaXMgKHN0eWxlIGNhbGxzIGZvciBDYW1lbENhc2UsIHRydXN0IGl0KS4KKyAgLy8gMi4gQ2hlY2sgZm9yIHJlc2VydmVkIHdvcmQgYXQgdGhlIHZlcnkgZW5kIGFuZCB0aGVuIHN1ZmZpeCB0aGluZ3MuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IEZpbGVDbGFzc1ByZWZpeChkZXNjcmlwdG9yLT5maWxlKCkpOworICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lID0gQ2xhc3NOYW1lV29ya2VyKGRlc2NyaXB0b3IpOworICByZXR1cm4gU2FuaXRpemVOYW1lRm9yT2JqQyhwcmVmaXgsIG5hbWUsICJfQ2xhc3MiLCBvdXRfc3VmZml4X2FkZGVkKTsKK30KKworc3RkOjpzdHJpbmcgRW51bU5hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgLy8gMS4gRW51bSBuYW1lcyBhcmUgdXNlZCBhcyBpcyAoc3R5bGUgY2FsbHMgZm9yIENhbWVsQ2FzZSwgdHJ1c3QgaXQpLgorICAvLyAyLiBDaGVjayBmb3IgcmVzZXJ2ZWQgd29yZCBhdCB0aGUgZXZlcnkgZW5kIGFuZCB0aGVuIHN1ZmZpeCB0aGluZ3MuCisgIC8vICAgICAgbWVzc2FnZSBGaXhlZCB7CisgIC8vICAgICAgICBtZXNzYWdlIFNpemUgey4uLn0KKyAgLy8gICAgICAgIGVudW0gTXVtYmxlIHsuLi59CisgIC8vICAgICAgLi4uCisgIC8vICAgICAgfQorICAvLyAgICB5aWVsZHMgRml4ZWRfQ2xhc3MsIEZpeGVkX1NpemUuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IEZpbGVDbGFzc1ByZWZpeChkZXNjcmlwdG9yLT5maWxlKCkpOworICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lID0gQ2xhc3NOYW1lV29ya2VyKGRlc2NyaXB0b3IpOworICByZXR1cm4gU2FuaXRpemVOYW1lRm9yT2JqQyhwcmVmaXgsIG5hbWUsICJfRW51bSIsIE5VTEwpOworfQorCitzdGQ6OnN0cmluZyBFbnVtVmFsdWVOYW1lKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgLy8gQmVjYXVzZSBvZiB0aGUgU3dpdGNoIGVudW0gY29tcGF0aWJpbGl0eSwgdGhlIG5hbWUgb24gdGhlIGVudW0gaGFzIHRvIGhhdmUKKyAgLy8gdGhlIHN1ZmZpeCBoYW5kaW5nLCBzbyBpdCBzbGlnaHRseSBkaXZlcmdlcyBmcm9tIGhvdyBuZXN0ZWQgY2xhc3NlcyB3b3JrLgorICAvLyAgIGVudW0gRml4ZWQgeworICAvLyAgICAgRk9PID0gMQorICAvLyAgIH0KKyAgLy8geWllbGRzIEZpeGVkX0VudW0gYW5kIEZpeGVkX0VudW1fRm9vIChub3QgRml4ZWRfRm9vKS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZSA9IEVudW1OYW1lKGRlc2NyaXB0b3ItPnR5cGUoKSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHZhbHVlX3N0ciA9CisgICAgICBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3ItPm5hbWUoKSwgdHJ1ZSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWUgPSBjbGFzc19uYW1lICsgIl8iICsgdmFsdWVfc3RyOworICAvLyBUaGVyZSBhcmVuJ3QgcmVhbGx5IGFueSByZXNlcnZlZCB3b3JkcyB3aXRoIGFuIHVuZGVyc2NvcmUgYW5kIGEgbGVhZGluZworICAvLyBjYXBpdGFsIGxldHRlciwgYnV0IHBsYXlpbmcgaXQgc2FmZSBhbmQgY2hlY2tpbmcuCisgIHJldHVybiBTYW5pdGl6ZU5hbWVGb3JPYmpDKCIiLCBuYW1lLCAiX1ZhbHVlIiwgTlVMTCk7Cit9CisKK3N0ZDo6c3RyaW5nIEVudW1WYWx1ZVNob3J0TmFtZShjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIC8vIEVudW0gdmFsdWUgbmFtZXMgKEVudW1WYWx1ZU5hbWUgYWJvdmUpIGFyZSB0aGUgZW51bSBuYW1lIHR1cm5lZCBpbnRvCisgIC8vIGEgY2xhc3MgbmFtZSBhbmQgdGhlbiB0aGUgdmFsdWUgbmFtZSBpcyBDYW1lbENhc2VkIGFuZCBjb25jYXRlbmF0ZWQ7IHRoZQorICAvLyB3aG9sZSB0aGluZyB0aGVuIGdldHMgc2FuaXRpemVkIGZvciByZXNlcnZlZCB3b3Jkcy4KKyAgLy8gVGhlICJzaG9ydCBuYW1lIiBpcyBpbnRlbmRlZCB0byBiZSB0aGUgZmluYWwgbGVhZiwgdGhlIHZhbHVlIG5hbWU7IGJ1dAorICAvLyB5b3UgY2FuJ3Qgc2ltcGx5IHNlbmQgdGhhdCBvZmYgdG8gc2FuaXRpemUgYXMgdGhhdCBjb3VsZCByZXN1bHQgaW4gaXQKKyAgLy8gZ2V0dGluZyBtb2RpZmllZCB3aGVuIHRoZSBmdWxsIG5hbWUgZGlkbid0LiAgRm9yIGV4YW1wbGUgZW51bQorICAvLyAiU3RvcmFnZU1vZGVzIiBoYXMgYSB2YWx1ZSAicmV0YWluIi4gIFNvIHRoZSBmdWxsIG5hbWUgaXMKKyAgLy8gIlN0b3JhZ2VNb2Rlc19SZXRhaW4iLCBidXQgaWYgd2Ugc2FuaXRpemUgInJldGFpbiIgaXQgd291bGQgYmVjb21lCisgIC8vICJSZXRhaW5WYWx1ZSIuCisgIC8vIFNvIHRoZSByaWdodCB3YXkgdG8gZ2V0IHRoZSBzaG9ydCBuYW1lIGlzIHRvIHRha2UgdGhlIGZ1bGwgZW51bSBuYW1lCisgIC8vIGFuZCB0aGVuIHN0cmlwIG9mZiB0aGUgZW51bSBuYW1lIChsZWF2aW5nIHRoZSB2YWx1ZSBuYW1lIGFuZCBhbnl0aGluZworICAvLyBkb25lIGJ5IHNhbml0aXplKS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZSA9IEVudW1OYW1lKGRlc2NyaXB0b3ItPnR5cGUoKSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGxvbmdfbmFtZV9wcmVmaXggPSBjbGFzc19uYW1lICsgIl8iOworICBjb25zdCBzdGQ6OnN0cmluZyBsb25nX25hbWUgPSBFbnVtVmFsdWVOYW1lKGRlc2NyaXB0b3IpOworICByZXR1cm4gU3RyaXBQcmVmaXhTdHJpbmcobG9uZ19uYW1lLCBsb25nX25hbWVfcHJlZml4KTsKK30KKworc3RkOjpzdHJpbmcgVW5DYW1lbENhc2VFbnVtU2hvcnROYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgY2hhciBjID0gbmFtZVtpXTsKKyAgICBpZiAoaSA+IDAgJiYgYXNjaWlfaXN1cHBlcihjKSkgeworICAgICAgcmVzdWx0ICs9ICdfJzsKKyAgICB9CisgICAgcmVzdWx0ICs9IGFzY2lpX3RvdXBwZXIoYyk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgRXh0ZW5zaW9uTWV0aG9kTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSA9IE5hbWVGcm9tRmllbGREZXNjcmlwdG9yKGRlc2NyaXB0b3IpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQgPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG5hbWUsIGZhbHNlKTsKKyAgcmV0dXJuIFNhbml0aXplTmFtZUZvck9iakMoIiIsIHJlc3VsdCwgIl9FeHRlbnNpb24iLCBOVUxMKTsKK30KKworc3RkOjpzdHJpbmcgRmllbGROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSA9IE5hbWVGcm9tRmllbGREZXNjcmlwdG9yKGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShuYW1lLCBmYWxzZSk7CisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiAhZmllbGQtPmlzX21hcCgpKSB7CisgICAgLy8gQWRkICJBcnJheSIgYmVmb3JlIGRvIGNoZWNrIGZvciByZXNlcnZlZCB3b3JsZHMuCisgICAgcmVzdWx0ICs9ICJBcnJheSI7CisgIH0gZWxzZSB7CisgICAgLy8gSWYgaXQgd2Fzbid0IHJlcGVhdGVkLCBidXQgZW5kcyBpbiAiQXJyYXkiLCBmb3JjZSBvbiB0aGUgX3Agc3VmZml4LgorICAgIGlmIChIYXNTdWZmaXhTdHJpbmcocmVzdWx0LCAiQXJyYXkiKSkgeworICAgICAgcmVzdWx0ICs9ICJfcCI7CisgICAgfQorICB9CisgIHJldHVybiBTYW5pdGl6ZU5hbWVGb3JPYmpDKCIiLCByZXN1bHQsICJfcCIsIE5VTEwpOworfQorCitzdGQ6OnN0cmluZyBGaWVsZE5hbWVDYXBpdGFsaXplZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIC8vIFdhbnQgdGhlIHNhbWUgc3VmZml4IGhhbmRsaW5nLCBzbyB1cGNhc2UgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUgb3RoZXIKKyAgLy8gbmFtZS4KKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gRmllbGROYW1lKGZpZWxkKTsKKyAgaWYgKHJlc3VsdC5sZW5ndGgoKSA+IDApIHsKKyAgICByZXN1bHRbMF0gPSBhc2NpaV90b3VwcGVyKHJlc3VsdFswXSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgT25lb2ZFbnVtTmFtZShjb25zdCBPbmVvZkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogZmllbGREZXNjcmlwdG9yID0gZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCk7CisgIHN0ZDo6c3RyaW5nIG5hbWUgPSBDbGFzc05hbWUoZmllbGREZXNjcmlwdG9yKTsKKyAgbmFtZSArPSAiXyIgKyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3ItPm5hbWUoKSwgdHJ1ZSkgKyAiX09uZU9mQ2FzZSI7CisgIC8vIE5vIHNhbml0aXplIG5lZWRlZCBiZWNhdXNlIHRoZSBPUyBuZXZlciBoYXMgbmFtZXMgdGhhdCBlbmQgaW4gX09uZU9mQ2FzZS4KKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0ZDo6c3RyaW5nIE9uZW9mTmFtZShjb25zdCBPbmVvZkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgc3RkOjpzdHJpbmcgbmFtZSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZGVzY3JpcHRvci0+bmFtZSgpLCBmYWxzZSk7CisgIC8vIE5vIHNhbml0aXplIG5lZWRlZCBiZWNhdXNlIGl0IGdldHMgT25lT2ZDYXNlIGFkZGVkIGFuZCB0aGF0IHNob3VsZG4ndAorICAvLyBldmVyIGNvbmZsaWN0LgorICByZXR1cm4gbmFtZTsKK30KKworc3RkOjpzdHJpbmcgT25lb2ZOYW1lQ2FwaXRhbGl6ZWQoY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIC8vIFVzZSB0aGUgY29tbW9uIGhhbmRsaW5nIGFuZCB0aGVuIHVwLWNhc2UgdGhlIGZpcnN0IGxldHRlci4KKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gT25lb2ZOYW1lKGRlc2NyaXB0b3IpOworICBpZiAocmVzdWx0Lmxlbmd0aCgpID4gMCkgeworICAgIHJlc3VsdFswXSA9IGFzY2lpX3RvdXBwZXIocmVzdWx0WzBdKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdGQ6OnN0cmluZyBPYmpDQ2xhc3MoY29uc3Qgc3RkOjpzdHJpbmcmIGNsYXNzX25hbWUpIHsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHUEJPYmpDQ2xhc3MoIikgKyBjbGFzc19uYW1lICsgIikiOworfQorCitzdGQ6OnN0cmluZyBPYmpDQ2xhc3NEZWNsYXJhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgY2xhc3NfbmFtZSkgeworICByZXR1cm4gc3RkOjpzdHJpbmcoIkdQQk9iakNDbGFzc0RlY2xhcmF0aW9uKCIpICsgY2xhc3NfbmFtZSArICIpOyI7Cit9CisKK3N0ZDo6c3RyaW5nIFVuQ2FtZWxDYXNlRmllbGROYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHN0ZDo6c3RyaW5nIHdvcmtlcihuYW1lKTsKKyAgaWYgKEhhc1N1ZmZpeFN0cmluZyh3b3JrZXIsICJfcCIpKSB7CisgICAgd29ya2VyID0gU3RyaXBTdWZmaXhTdHJpbmcod29ya2VyLCAiX3AiKTsKKyAgfQorICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgSGFzU3VmZml4U3RyaW5nKHdvcmtlciwgIkFycmF5IikpIHsKKyAgICB3b3JrZXIgPSBTdHJpcFN1ZmZpeFN0cmluZyh3b3JrZXIsICJBcnJheSIpOworICB9CisgIGlmIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgeworICAgIGlmICh3b3JrZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICBpZiAoYXNjaWlfaXNsb3dlcih3b3JrZXJbMF0pKSB7CisgICAgICAgIHdvcmtlclswXSA9IGFzY2lpX3RvdXBwZXIod29ya2VyWzBdKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHdvcmtlcjsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3JrZXIuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGNoYXIgYyA9IHdvcmtlcltpXTsKKyAgICAgIGlmIChhc2NpaV9pc3VwcGVyKGMpKSB7CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgIHJlc3VsdCArPSAnXyc7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IGFzY2lpX3RvbG93ZXIoYyk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gYzsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBHZXRDYXBpdGFsaXplZFR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBzd2l0Y2ggKGZpZWxkLT50eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMjoKKyAgICAgIHJldHVybiAiSW50MzIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiAiVUludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzI6CisgICAgICByZXR1cm4gIlNJbnQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMjoKKyAgICAgIHJldHVybiAiRml4ZWQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6CisgICAgICByZXR1cm4gIlNGaXhlZDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiAiSW50NjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiAiVUludDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQ6CisgICAgICByZXR1cm4gIlNJbnQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NDoKKyAgICAgIHJldHVybiAiRml4ZWQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6CisgICAgICByZXR1cm4gIlNGaXhlZDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiAiRmxvYXQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiRG91YmxlIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJCb29sIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6CisgICAgICByZXR1cm4gIkJ5dGVzIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOgorICAgICAgcmV0dXJuICJFbnVtIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICAgIHJldHVybiAiR3JvdXAiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6CisgICAgICByZXR1cm4gIk1lc3NhZ2UiOworICB9CisKKyAgLy8gU29tZSBjb21waWxlcnMgcmVwb3J0IHJlYWNoaW5nIGVuZCBvZiBmdW5jdGlvbiBldmVuIHRob3VnaCBhbGwgY2FzZXMgb2YKKyAgLy8gdGhlIGVudW0gYXJlIGhhbmRlZCBpbiB0aGUgc3dpdGNoLgorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Cit9CisKK09iamVjdGl2ZUNUeXBlIEdldE9iamVjdGl2ZUNUeXBlKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSBmaWVsZF90eXBlKSB7CisgIHN3aXRjaCAoZmllbGRfdHlwZSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjoKKyAgICAgIHJldHVybiBPQkpFQ1RJVkVDVFlQRV9JTlQzMjsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyOgorICAgICAgcmV0dXJuIE9CSkVDVElWRUNUWVBFX1VJTlQzMjsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDoKKyAgICAgIHJldHVybiBPQkpFQ1RJVkVDVFlQRV9JTlQ2NDsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0OgorICAgICAgcmV0dXJuIE9CSkVDVElWRUNUWVBFX1VJTlQ2NDsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuIE9CSkVDVElWRUNUWVBFX0ZMT0FUOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIE9CSkVDVElWRUNUWVBFX0RPVUJMRTsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gT0JKRUNUSVZFQ1RZUEVfQk9PTEVBTjsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiBPQkpFQ1RJVkVDVFlQRV9TVFJJTkc7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzoKKyAgICAgIHJldHVybiBPQkpFQ1RJVkVDVFlQRV9EQVRBOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTToKKyAgICAgIHJldHVybiBPQkpFQ1RJVkVDVFlQRV9FTlVNOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVA6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiBPQkpFQ1RJVkVDVFlQRV9NRVNTQUdFOworICB9CisKKyAgLy8gU29tZSBjb21waWxlcnMgcmVwb3J0IHJlYWNoaW5nIGVuZCBvZiBmdW5jdGlvbiBldmVuIHRob3VnaCBhbGwgY2FzZXMgb2YKKyAgLy8gdGhlIGVudW0gYXJlIGhhbmRlZCBpbiB0aGUgc3dpdGNoLgorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIE9CSkVDVElWRUNUWVBFX0lOVDMyOworfQorCitib29sIElzUHJpbWl0aXZlVHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIE9iamVjdGl2ZUNUeXBlIHR5cGUgPSBHZXRPYmplY3RpdmVDVHlwZShmaWVsZCk7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgT0JKRUNUSVZFQ1RZUEVfSU5UMzI6CisgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9VSU5UMzI6CisgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9JTlQ2NDoKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX1VJTlQ2NDoKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX0ZMT0FUOgorICAgIGNhc2UgT0JKRUNUSVZFQ1RZUEVfRE9VQkxFOgorICAgIGNhc2UgT0JKRUNUSVZFQ1RZUEVfQk9PTEVBTjoKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX0VOVU06CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBJc1JlZmVyZW5jZVR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICByZXR1cm4gIUlzUHJpbWl0aXZlVHlwZShmaWVsZCk7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBIYW5kbGVFeHRyZW1lRmxvYXRpbmdQb2ludChzdGQ6OnN0cmluZyB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGRfZmxvYXRfc3VmZml4KSB7CisgIGlmICh2YWwgPT0gIm5hbiIpIHsKKyAgICByZXR1cm4gIk5BTiI7CisgIH0gZWxzZSBpZiAodmFsID09ICJpbmYiKSB7CisgICAgcmV0dXJuICJJTkZJTklUWSI7CisgIH0gZWxzZSBpZiAodmFsID09ICItaW5mIikgeworICAgIHJldHVybiAiLUlORklOSVRZIjsKKyAgfSBlbHNlIHsKKyAgICAvLyBmbG9hdCBzdHJpbmdzIHdpdGggLiwgZSBvciBFIG5lZWQgdG8gaGF2ZSBmIGFwcGVuZGVkCisgICAgaWYgKGFkZF9mbG9hdF9zdWZmaXggJiYgKHZhbC5maW5kKCIuIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmZpbmQoImUiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZmluZCgiRSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgICAgdmFsICs9ICJmIjsKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBHUEJHZW5lcmljVmFsdWVGaWVsZE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAvLyBSZXR1cm5zIHRoZSBmaWVsZCB3aXRoaW4gdGhlIEdQQkdlbmVyaWNWYWx1ZSB1bmlvbiB0byB1c2UgZm9yIHRoZSBnaXZlbgorICAvLyBmaWVsZC4KKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICByZXR1cm4gInZhbHVlTWVzc2FnZSI7CisgIH0KKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgcmV0dXJuICJ2YWx1ZUludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6CisgICAgICByZXR1cm4gInZhbHVlVUludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiAidmFsdWVJbnQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgcmV0dXJuICJ2YWx1ZVVJbnQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICByZXR1cm4gInZhbHVlRmxvYXQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAidmFsdWVEb3VibGUiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gInZhbHVlQm9vbCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgaWYgKGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTKSB7CisgICAgICAgIHJldHVybiAidmFsdWVEYXRhIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAidmFsdWVTdHJpbmciOworICAgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICByZXR1cm4gInZhbHVlRW51bSI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiAidmFsdWVNZXNzYWdlIjsKKyAgfQorCisgIC8vIFNvbWUgY29tcGlsZXJzIHJlcG9ydCByZWFjaGluZyBlbmQgb2YgZnVuY3Rpb24gZXZlbiB0aG91Z2ggYWxsIGNhc2VzIG9mCisgIC8vIHRoZSBlbnVtIGFyZSBoYW5kZWQgaW4gdGhlIHN3aXRjaC4KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBzdGQ6OnN0cmluZygpOworfQorCisKK3N0ZDo6c3RyaW5nIERlZmF1bHRWYWx1ZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIC8vIFJlcGVhdGVkIGZpZWxkcyBkb24ndCBoYXZlIGRlZmF1bHRzLgorICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICByZXR1cm4gIm5pbCI7CisgIH0KKworICAvLyBTd2l0Y2ggb24gY3BwX3R5cGUgc2luY2Ugd2UgbmVlZCB0byBrbm93IHdoaWNoIGRlZmF1bHRfdmFsdWVfKiBtZXRob2QKKyAgLy8gb2YgRmllbGREZXNjcmlwdG9yIHRvIGNhbGwuCisgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgIC8vIGdjYyBhbmQgbGx2bSByZWplY3QgdGhlIGRlY2ltYWwgZm9ybSBvZiBraW50MzJtaW4gYW5kIGtpbnQ2NG1pbi4KKyAgICAgIGlmIChmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQzMigpID09IElOVF9NSU4pIHsKKyAgICAgICAgcmV0dXJuICItMHg4MDAwMDAwMCI7CisgICAgICB9CisgICAgICByZXR1cm4gU3RyQ2F0KGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2ludDMyKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiBTdHJDYXQoZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDMyKCkpICsgIlUiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgICAgLy8gZ2NjIGFuZCBsbHZtIHJlamVjdCB0aGUgZGVjaW1hbCBmb3JtIG9mIGtpbnQzMm1pbiBhbmQga2ludDY0bWluLgorICAgICAgaWYgKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2ludDY0KCkgPT0gTExPTkdfTUlOKSB7CisgICAgICAgIHJldHVybiAiLTB4ODAwMDAwMDAwMDAwMDAwMExMIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBTdHJDYXQoZmllbGQtPmRlZmF1bHRfdmFsdWVfaW50NjQoKSkgKyAiTEwiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiBTdHJDYXQoZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDY0KCkpICsgIlVMTCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIEhhbmRsZUV4dHJlbWVGbG9hdGluZ1BvaW50KAorICAgICAgICAgIFNpbXBsZUR0b2EoZmllbGQtPmRlZmF1bHRfdmFsdWVfZG91YmxlKCkpLCBmYWxzZSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICByZXR1cm4gSGFuZGxlRXh0cmVtZUZsb2F0aW5nUG9pbnQoCisgICAgICAgICAgU2ltcGxlRnRvYShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9mbG9hdCgpKSwgdHJ1ZSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9ib29sKCkgPyAiWUVTIiA6ICJOTyI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICBjb25zdCBib29sIGhhc19kZWZhdWx0X3ZhbHVlID0gZmllbGQtPmhhc19kZWZhdWx0X3ZhbHVlKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVmYXVsdF9zdHJpbmcgPSBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKTsKKyAgICAgIGlmICghaGFzX2RlZmF1bHRfdmFsdWUgfHwgZGVmYXVsdF9zdHJpbmcubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAvLyBJZiB0aGUgZmllbGQgaXMgZGVmaW5lZCBhcyBiZWluZyB0aGUgZW1wdHkgc3RyaW5nLAorICAgICAgICAvLyB0aGVuIHdlIHdpbGwganVzdCBhc3NpZ24gdG8gbmlsLCBhcyB0aGUgZW1wdHkgc3RyaW5nIGlzIHRoZQorICAgICAgICAvLyBkZWZhdWx0IGZvciBib3RoIHN0cmluZ3MgYW5kIGRhdGEuCisgICAgICAgIHJldHVybiAibmlsIjsKKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUykgeworICAgICAgICAvLyBXZSB3YW50IGNvbnN0YW50IGZpZWxkcyBpbiBvdXIgZGF0YSBzdHJ1Y3R1cmVzIHNvIHdlIGNhbgorICAgICAgICAvLyBkZWNsYXJlIHRoZW0gYXMgc3RhdGljLiBUbyBhY2hpZXZlIHRoaXMgd2UgY2hlYXQgYW5kIHN0dWZmCisgICAgICAgIC8vIGEgZXNjYXBlZCBjIHN0cmluZyAocHJlZml4ZWQgd2l0aCBhIGxlbmd0aCkgaW50byB0aGUgZGF0YQorICAgICAgICAvLyBmaWVsZCwgYW5kIGNhc3QgaXQgdG8gYW4gKE5TRGF0YSopIHNvIGl0IHdpbGwgY29tcGlsZS4KKyAgICAgICAgLy8gVGhlIHJ1bnRpbWUgbGlicmFyeSBrbm93cyBob3cgdG8gaGFuZGxlIGl0LgorCisgICAgICAgIC8vIE11c3QgY29udmVydCB0byBhIHN0YW5kYXJkIGJ5dGUgb3JkZXIgZm9yIHBhY2tpbmcgbGVuZ3RoIGludG8KKyAgICAgICAgLy8gYSBjc3RyaW5nLgorICAgICAgICB1aW50MzJfdCBsZW5ndGggPSBnaHRvbmwoZGVmYXVsdF9zdHJpbmcubGVuZ3RoKCkpOworICAgICAgICBzdGQ6OnN0cmluZyBieXRlcygoY29uc3QgY2hhciopJmxlbmd0aCwgc2l6ZW9mKGxlbmd0aCkpOworICAgICAgICBieXRlcy5hcHBlbmQoZGVmYXVsdF9zdHJpbmcpOworICAgICAgICByZXR1cm4gIihOU0RhdGEqKVwiIiArIEVzY2FwZVRyaWdyYXBocyhDRXNjYXBlKGJ5dGVzKSkgKyAiXCIiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICJAXCIiICsgRXNjYXBlVHJpZ3JhcGhzKENFc2NhcGUoZGVmYXVsdF9zdHJpbmcpKSArICJcIiI7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICByZXR1cm4gRW51bVZhbHVlTmFtZShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICByZXR1cm4gIm5pbCI7CisgIH0KKworICAvLyBTb21lIGNvbXBpbGVycyByZXBvcnQgcmVhY2hpbmcgZW5kIG9mIGZ1bmN0aW9uIGV2ZW4gdGhvdWdoIGFsbCBjYXNlcyBvZgorICAvLyB0aGUgZW51bSBhcmUgaGFuZGVkIGluIHRoZSBzd2l0Y2guCisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKK30KKworYm9vbCBIYXNOb25aZXJvRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgLy8gUmVwZWF0ZWQgZmllbGRzIGRvbid0IGhhdmUgZGVmYXVsdHMuCisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEFzIG11Y2ggYXMgY2hlY2tpbmcgZmllbGQtPmhhc19kZWZhdWx0X3ZhbHVlKCkgc2VlbXMgdXNlZnVsLCBpdCBpc24ndAorICAvLyBiZWNhdXNlIG9mIGVudW1zLiBwcm90bzIgc3ludGF4IGFsbG93cyB0aGUgZmlyc3QgaXRlbSBpbiBhbiBlbnVtICh0aGUKKyAgLy8gZGVmYXVsdCkgdG8gYmUgbm9uIHplcm8uIFNvIGNoZWNraW5nIGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpIHdvdWxkCisgIC8vIHJlc3VsdCBpbiBtaXNzaW5nIHRoaXMgbm9uIHplcm8gZGVmYXVsdC4gIFNlZSBNZXNzYWdlV2l0aE9uZUJhc2VkRW51bSBpbgorICAvLyBvYmplY3RpdmVjL1Rlc3RzL3VuaXR0ZXN0X29iamMucHJvdG8gZm9yIGEgdGVzdCBNZXNzYWdlIHRvIGNvbmZpcm0gdGhpcy4KKworICAvLyBTb21lIHByb3RvIGZpbGUgc2V0IHRoZSBkZWZhdWx0IHRvIHRoZSB6ZXJvIHZhbHVlLCBzbyBtYWtlIHN1cmUgdGhlIHZhbHVlCisgIC8vIGlzbid0IHRoZSB6ZXJvIGNhc2UuCisgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQzMigpICE9IDA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3VpbnQzMigpICE9IDBVOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2ludDY0KCkgIT0gMExMOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKSAhPSAwVUxMOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9kb3VibGUoKSAhPSAwLjA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfZmxvYXQoKSAhPSAwLjBmOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfYm9vbCgpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRlZmF1bHRfc3RyaW5nID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCk7CisgICAgICByZXR1cm4gZGVmYXVsdF9zdHJpbmcubGVuZ3RoKCkgIT0gMDsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtKCktPm51bWJlcigpICE9IDA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFNvbWUgY29tcGlsZXJzIHJlcG9ydCByZWFjaGluZyBlbmQgb2YgZnVuY3Rpb24gZXZlbiB0aG91Z2ggYWxsIGNhc2VzIG9mCisgIC8vIHRoZSBlbnVtIGFyZSBoYW5kZWQgaW4gdGhlIHN3aXRjaC4KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjpzdHJpbmcgQnVpbGRGbGFnc1N0cmluZyhjb25zdCBGbGFnVHlwZSBmbGFnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc3RyaW5ncykgeworICBpZiAoc3RyaW5ncy5lbXB0eSgpKSB7CisgICAgcmV0dXJuIEdldFplcm9FbnVtTmFtZUZvckZsYWdUeXBlKGZsYWdfdHlwZSk7CisgIH0gZWxzZSBpZiAoc3RyaW5ncy5zaXplKCkgPT0gMSkgeworICAgIHJldHVybiBzdHJpbmdzWzBdOworICB9CisgIHN0ZDo6c3RyaW5nIHN0cmluZygiKCIgKyBHZXRFbnVtTmFtZUZvckZsYWdUeXBlKGZsYWdfdHlwZSkgKyAiKSgiKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gc3RyaW5ncy5zaXplKCk7ICsraSkgeworICAgIGlmIChpID4gMCkgeworICAgICAgc3RyaW5nLmFwcGVuZCgiIHwgIik7CisgICAgfQorICAgIHN0cmluZy5hcHBlbmQoc3RyaW5nc1tpXSk7CisgIH0KKyAgc3RyaW5nLmFwcGVuZCgiKSIpOworICByZXR1cm4gc3RyaW5nOworfQorCitzdGQ6OnN0cmluZyBCdWlsZENvbW1lbnRzU3RyaW5nKGNvbnN0IFNvdXJjZUxvY2F0aW9uJiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlZmVyX3NpbmdsZV9saW5lKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tZW50cyA9IGxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHM7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5lczsKKyAgbGluZXMgPSBTcGxpdChjb21tZW50cywgIlxuIiwgZmFsc2UpOworICB3aGlsZSAoIWxpbmVzLmVtcHR5KCkgJiYgbGluZXMuYmFjaygpLmVtcHR5KCkpIHsKKyAgICBsaW5lcy5wb3BfYmFjaygpOworICB9CisgIC8vIElmIHRoZXJlIGFyZSBubyBjb21tZW50cywganVzdCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgorICBpZiAobGluZXMuZW1wdHkoKSkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHByZWZpeDsKKyAgc3RkOjpzdHJpbmcgc3VmZml4OworICBzdGQ6OnN0cmluZyBmaW5hbF9jb21tZW50czsKKyAgc3RkOjpzdHJpbmcgZXBpbG9ndWU7CisKKyAgYm9vbCBhZGRfbGVhZGluZ19zcGFjZSA9IGZhbHNlOworCisgIGlmIChwcmVmZXJfc2luZ2xlX2xpbmUgJiYgbGluZXMuc2l6ZSgpID09IDEpIHsKKyAgICBwcmVmaXggPSAiLyoqICI7CisgICAgc3VmZml4ID0gIiAqL1xuIjsKKyAgfSBlbHNlIHsKKyAgICBwcmVmaXggPSAiKiAiOworICAgIHN1ZmZpeCA9ICJcbiI7CisgICAgZmluYWxfY29tbWVudHMgKz0gIi8qKlxuIjsKKyAgICBlcGlsb2d1ZSA9ICIgKiovXG4iOworICAgIGFkZF9sZWFkaW5nX3NwYWNlID0gdHJ1ZTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBzdGQ6OnN0cmluZyBsaW5lID0gU3RyaXBQcmVmaXhTdHJpbmcobGluZXNbaV0sICIgIik7CisgICAgLy8gSGVhZGVyRG9jIGFuZCBhcHBsZWRvYyB1c2UgJ1wnIGFuZCAnQCcgZm9yIG1hcmtlcnM7IGVzY2FwZSB0aGVtLgorICAgIGxpbmUgPSBTdHJpbmdSZXBsYWNlKGxpbmUsICJcXCIsICJcXFxcIiwgdHJ1ZSk7CisgICAgbGluZSA9IFN0cmluZ1JlcGxhY2UobGluZSwgIkAiLCAiXFxAIiwgdHJ1ZSk7CisgICAgLy8gRGVjb3VwbGUgLyBmcm9tICogdG8gbm90IGhhdmUgaW5saW5lIGNvbW1lbnRzIGluc2lkZSBjb21tZW50cy4KKyAgICBsaW5lID0gU3RyaW5nUmVwbGFjZShsaW5lLCAiLyoiLCAiL1xcKiIsIHRydWUpOworICAgIGxpbmUgPSBTdHJpbmdSZXBsYWNlKGxpbmUsICIqLyIsICIqXFwvIiwgdHJ1ZSk7CisgICAgbGluZSA9IHByZWZpeCArIGxpbmU7CisgICAgU3RyaXBXaGl0ZXNwYWNlKCZsaW5lKTsKKyAgICAvLyBJZiBub3QgYSBvbmUgbGluZSwgbmVlZCB0byBhZGQgdGhlIGZpcnN0IHNwYWNlIGJlZm9yZSAqLCBhcworICAgIC8vIFN0cmlwV2hpdGVzcGFjZSB3b3VsZCBoYXZlIHJlbW92ZWQgaXQuCisgICAgbGluZSA9IChhZGRfbGVhZGluZ19zcGFjZSA/ICIgIiA6ICIiKSArIGxpbmU7CisgICAgZmluYWxfY29tbWVudHMgKz0gbGluZSArIHN1ZmZpeDsKKyAgfQorICBmaW5hbF9jb21tZW50cyArPSBlcGlsb2d1ZTsKKyAgcmV0dXJuIGZpbmFsX2NvbW1lbnRzOworfQorCisvLyBNYWtpbmcgdGhlc2UgYSBnZW5lcmF0b3Igb3B0aW9uIGZvciBmb2xrcyB0aGF0IGRvbid0IHVzZSBDb2NvYVBvZHMsIGJ1dCBkbworLy8gd2FudCB0byBwdXQgdGhlIGxpYnJhcnkgaW4gYSBmcmFtZXdvcmsgaXMgYW4gaW50ZXJlc3RpbmcgcXVlc3Rpb24uIFRoZQorLy8gcHJvYmxlbSBpcyBpdCBtZWFucyBjaGFuZ2luZyBzb3VyY2VzIHNoaXBwZWQgd2l0aCB0aGUgbGlicmFyeSB0byBhY3R1YWxseQorLy8gdXNlIGEgZGlmZmVyZW50IHZhbHVlOyBzbyBpdCBpc24ndCBhcyBzaW1wbGUgYXMgYSBvcHRpb24uCitjb25zdCBjaGFyKiBjb25zdCBQcm90b2J1ZkxpYnJhcnlGcmFtZXdvcmtOYW1lID0gIlByb3RvYnVmIjsKKworc3RkOjpzdHJpbmcgUHJvdG9idWZGcmFtZXdvcmtJbXBvcnRTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcmIGZyYW1ld29ya19uYW1lKSB7CisgIC8vIEdQQl9VU0VfW2ZyYW1ld29ya19uYW1lXV9GUkFNRVdPUktfSU1QT1JUUworICBzdGQ6OnN0cmluZyByZXN1bHQgPSBzdGQ6OnN0cmluZygiR1BCX1VTRV8iKTsKKyAgcmVzdWx0ICs9IFRvVXBwZXIoZnJhbWV3b3JrX25hbWUpOworICByZXN1bHQgKz0gIl9GUkFNRVdPUktfSU1QT1JUUyI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgSXNQcm90b2J1ZkxpYnJhcnlCdW5kbGVkUHJvdG9GaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIC8vIFdlIGRvbid0IGNoZWNrIHRoZSBuYW1lIHByZWZpeCBvciBwcm90byBwYWNrYWdlIGJlY2F1c2Ugc29tZSBmaWxlcworICAvLyAoZGVzY3JpcHRvci5wcm90byksIGFyZW4ndCBzaGlwcGVkIGdlbmVyYXRlZCBieSB0aGUgbGlicmFyeSwgc28gdGhpcworICAvLyBzZWVtcyB0byBiZSB0aGUgc2FmZXN0IHdheSB0byBvbmx5IGNhdGNoIHRoZSBvbmVzIHNoaXBwZWQuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWUgPSBmaWxlLT5uYW1lKCk7CisgIGlmIChuYW1lID09ICJnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIiB8fAorICAgICAgbmFtZSA9PSAiZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90byIgfHwKKyAgICAgIG5hbWUgPT0gImdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90byIgfHwKKyAgICAgIG5hbWUgPT0gImdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byIgfHwKKyAgICAgIG5hbWUgPT0gImdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvIiB8fAorICAgICAgbmFtZSA9PSAiZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvIiB8fAorICAgICAgbmFtZSA9PSAiZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byIgfHwKKyAgICAgIG5hbWUgPT0gImdvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8iIHx8CisgICAgICBuYW1lID09ICJnb29nbGUvcHJvdG9idWYvdHlwZS5wcm90byIgfHwKKyAgICAgIG5hbWUgPT0gImdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90byIpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVhZExpbmUoU3RyaW5nUGllY2UqIGlucHV0LCBTdHJpbmdQaWVjZSogbGluZSkgeworICBmb3IgKGludCBsZW4gPSAwOyBsZW4gPCBpbnB1dC0+c2l6ZSgpOyArK2xlbikgeworICAgIGlmIChhc2NpaV9pc25ld2xpbmUoKCppbnB1dClbbGVuXSkpIHsKKyAgICAgICpsaW5lID0gU3RyaW5nUGllY2UoaW5wdXQtPmRhdGEoKSwgbGVuKTsKKyAgICAgICsrbGVuOyAgLy8gYWR2YW5jZSBvdmVyIHRoZSBuZXdsaW5lCisgICAgICAqaW5wdXQgPSBTdHJpbmdQaWVjZShpbnB1dC0+ZGF0YSgpICsgbGVuLCBpbnB1dC0+c2l6ZSgpIC0gbGVuKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7ICAvLyBSYW4gb3V0IG9mIGlucHV0IHdpdGggbm8gbmV3bGluZS4KK30KKwordm9pZCBSZW1vdmVDb21tZW50KFN0cmluZ1BpZWNlKiBpbnB1dCkgeworICBpbnQgb2Zmc2V0ID0gaW5wdXQtPmZpbmQoJyMnKTsKKyAgaWYgKG9mZnNldCAhPSBTdHJpbmdQaWVjZTo6bnBvcykgeworICAgIGlucHV0LT5yZW1vdmVfc3VmZml4KGlucHV0LT5sZW5ndGgoKSAtIG9mZnNldCk7CisgIH0KK30KKworbmFtZXNwYWNlIHsKKworYm9vbCBQYWNrYWdlVG9QcmVmaXhlc0NvbGxlY3Rvcjo6Q29uc3VtZUxpbmUoCisgICAgY29uc3QgU3RyaW5nUGllY2UmIGxpbmUsIHN0ZDo6c3RyaW5nKiBvdXRfZXJyb3IpIHsKKyAgaW50IG9mZnNldCA9IGxpbmUuZmluZCgnPScpOworICBpZiAob2Zmc2V0ID09IFN0cmluZ1BpZWNlOjpucG9zKSB7CisgICAgKm91dF9lcnJvciA9IHVzYWdlXyArICIgZmlsZSBsaW5lIHdpdGhvdXQgZXF1YWwgc2lnbjogJyIgKyBTdHJDYXQobGluZSkgKyAiJy4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBTdHJpbmdQaWVjZSBwYWNrYWdlID0gbGluZS5zdWJzdHIoMCwgb2Zmc2V0KTsKKyAgU3RyaW5nUGllY2UgcHJlZml4ID0gbGluZS5zdWJzdHIob2Zmc2V0ICsgMSk7CisgIFRyaW1XaGl0ZXNwYWNlKCZwYWNrYWdlKTsKKyAgVHJpbVdoaXRlc3BhY2UoJnByZWZpeCk7CisgIE1heWJlVW5RdW90ZSgmcHJlZml4KTsKKyAgLy8gRG9uJ3QgcmVhbGx5IHdvcnJ5IGFib3V0IGVycm9yIGNoZWNraW5nIHRoZSBwYWNrYWdlL3ByZWZpeCBmb3IKKyAgLy8gYmVpbmcgdmFsaWQuICBBc3N1bWUgdGhlIGZpbGUgaXMgdmFsaWRhdGVkIHdoZW4gaXQgaXMgY3JlYXRlZC9lZGl0ZWQuCisgICgqcHJlZml4X21hcF8pW3N0ZDo6c3RyaW5nKHBhY2thZ2UpXSA9IHN0ZDo6c3RyaW5nKHByZWZpeCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIExvYWRFeHBlY3RlZFBhY2thZ2VQcmVmaXhlcyhjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfcHJlZml4ZXNfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHByZWZpeF9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0X2Vycm9yKSB7CisgIGlmIChleHBlY3RlZF9wcmVmaXhlc19wYXRoLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIFBhY2thZ2VUb1ByZWZpeGVzQ29sbGVjdG9yIGNvbGxlY3RvcigiRXhwZWN0ZWQgcHJlZml4ZXMiLCBwcmVmaXhfbWFwKTsKKyAgcmV0dXJuIFBhcnNlU2ltcGxlRmlsZSgKKyAgICAgIGV4cGVjdGVkX3ByZWZpeGVzX3BhdGgsICZjb2xsZWN0b3IsIG91dF9lcnJvcik7Cit9CisKK2Jvb2wgVmFsaWRhdGVPYmpDQ2xhc3NQcmVmaXgoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZF9wcmVmaXhlc19wYXRoLAorICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGV4cGVjdGVkX3BhY2thZ2VfcHJlZml4ZXMsCisgICAgYm9vbCBwcmVmaXhlc19tdXN0X2JlX3JlZ2lzdGVyZWQsIGJvb2wgcmVxdWlyZV9wcmVmaXhlcywKKyAgICBzdGQ6OnN0cmluZyogb3V0X2Vycm9yKSB7CisgIC8vIFJlbWluZGVyOiBBbiBleHBsaWNpdCBwcmVmaXggb3B0aW9uIG9mICIiIGlzIHZhbGlkIGluIGNhc2UgdGhlIGRlZmF1bHQKKyAgLy8gcHJlZml4aW5nIGlzIHNldCB0byB1c2UgdGhlIHByb3RvIHBhY2thZ2UgYW5kIGEgZmlsZSBuZWVkcyB0byBiZSBnZW5lcmF0ZWQKKyAgLy8gd2l0aG91dCBhbnkgcHJlZml4IGF0IGFsbCAoZm9yIGxlZ2FjeSByZWFzb25zKS4KKworICBib29sIGhhc19wcmVmaXggPSBmaWxlLT5vcHRpb25zKCkuaGFzX29iamNfY2xhc3NfcHJlZml4KCk7CisgIGJvb2wgaGF2ZV9leHBlY3RlZF9wcmVmaXhfZmlsZSA9ICFleHBlY3RlZF9wcmVmaXhlc19wYXRoLmVtcHR5KCk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gZmlsZS0+b3B0aW9ucygpLm9iamNfY2xhc3NfcHJlZml4KCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhY2thZ2UgPSBmaWxlLT5wYWNrYWdlKCk7CisgIC8vIEZvciBmaWxlcyB3aXRob3V0IHBhY2thZ2VzLCB0aGUgY2FuIGJlIHJlZ2lzdGVyZWQgYXMgIm5vX3BhY2thZ2U6UEFUSCIsCisgIC8vIGFsbG93aW5nIHRoZSBleHBlY3RlZCBwcmVmaXhlcyBmaWxlLgorICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgbm9fcGFja2FnZV9wcmVmaXgoIm5vX3BhY2thZ2U6Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGxvb2t1cF9rZXkgPQorICAgICAgcGFja2FnZS5lbXB0eSgpID8gbm9fcGFja2FnZV9wcmVmaXggKyBmaWxlLT5uYW1lKCkgOiBwYWNrYWdlOworCisgIC8vIE5PVEU6IHNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjIG1ha2VzIHVzZSBvZiBjZXJyIGZvciBzb21lCisgIC8vIGVycm9yIGNhc2VzLCBzbyBpdCBzZWVtcyB0byBiZSBvayB0byB1c2UgYXMgYSBiYWNrIGRvb3IgZm9yIHdhcm5pbmdzLgorCisgIC8vIENoZWNrOiBFcnJvciAtIFNlZSBpZiB0aGVyZSB3YXMgYW4gZXhwZWN0ZWQgcHJlZml4IGZvciB0aGUgcGFja2FnZSBhbmQKKyAgLy8gcmVwb3J0IGlmIGl0IGRvZXNuJ3QgbWF0Y2ggKHdyb25nIG9yIG1pc3NpbmcpLgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBwYWNrYWdlX21hdGNoID0KKyAgICAgIGV4cGVjdGVkX3BhY2thZ2VfcHJlZml4ZXMuZmluZChsb29rdXBfa2V5KTsKKyAgaWYgKHBhY2thZ2VfbWF0Y2ggIT0gZXhwZWN0ZWRfcGFja2FnZV9wcmVmaXhlcy5lbmQoKSkgeworICAgIC8vIFRoZXJlIHdhcyBhbiBlbnRyeSwgYW5kLi4uCisgICAgaWYgKGhhc19wcmVmaXggJiYgcGFja2FnZV9tYXRjaC0+c2Vjb25kID09IHByZWZpeCkgeworICAgICAgLy8gLi4uaXQgbWF0Y2hlcy4gIEFsbCBnb29kLCBvdXQgb2YgaGVyZSEKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAvLyAuLi5pdCBkaWRuJ3QgbWF0Y2ghCisgICAgICAqb3V0X2Vycm9yID0gImVycm9yOiBFeHBlY3RlZCAnb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gXCIiICsKKyAgICAgICAgICAgICAgICAgICBwYWNrYWdlX21hdGNoLT5zZWNvbmQgKyAiXCI7JyI7CisgICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgeworICAgICAgICAqb3V0X2Vycm9yICs9ICIgZm9yIHBhY2thZ2UgJyIgKyBwYWNrYWdlICsgIiciOworICAgICAgfQorICAgICAgKm91dF9lcnJvciArPSAiIGluICciICsgZmlsZS0+bmFtZSgpICsgIiciOworICAgICAgaWYgKGhhc19wcmVmaXgpIHsKKyAgICAgICAgKm91dF9lcnJvciArPSAiOyBidXQgZm91bmQgJyIgKyBwcmVmaXggKyAiJyBpbnN0ZWFkIjsKKyAgICAgIH0KKyAgICAgICpvdXRfZXJyb3IgKz0gIi4iOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vIElmIHRoZXJlIHdhcyBubyBwcmVmaXggb3B0aW9uLCB3ZSdyZSBkb25lIGF0IHRoaXMgcG9pbnQuCisgIGlmICghaGFzX3ByZWZpeCkgeworICAgIGlmIChyZXF1aXJlX3ByZWZpeGVzKSB7CisgICAgICAqb3V0X2Vycm9yID0KKyAgICAgICAgImVycm9yOiAnIiArIGZpbGUtPm5hbWUoKSArICInIGRvZXMgbm90IGhhdmUgYSByZXF1aXJlZCAnb3B0aW9uIiArCisgICAgICAgICIgb2JqY19jbGFzc19wcmVmaXgnLiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gV2hlbiB0aGUgcHJlZml4IGlzIG5vbiBlbXB0eSwgY2hlY2sgaXQgYWdhaW5zdCB0aGUgZXhwZWN0ZWQgZW50cmllcy4KKyAgaWYgKCFwcmVmaXguZW1wdHkoKSAmJiBoYXZlX2V4cGVjdGVkX3ByZWZpeF9maWxlKSB7CisgICAgLy8gRm9yIGEgbm9uIGVtcHR5IHByZWZpeCwgbG9vayBmb3IgYW55IG90aGVyIHBhY2thZ2UgdGhhdCB1c2VzIHRoZSBwcmVmaXguCisgICAgc3RkOjpzdHJpbmcgb3RoZXJfcGFja2FnZV9mb3JfcHJlZml4OworICAgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaSA9CisgICAgICAgICAgICAgZXhwZWN0ZWRfcGFja2FnZV9wcmVmaXhlcy5iZWdpbigpOworICAgICAgICAgaSAhPSBleHBlY3RlZF9wYWNrYWdlX3ByZWZpeGVzLmVuZCgpOyArK2kpIHsKKyAgICAgIGlmIChpLT5zZWNvbmQgPT0gcHJlZml4KSB7CisgICAgICAgIG90aGVyX3BhY2thZ2VfZm9yX3ByZWZpeCA9IGktPmZpcnN0OworICAgICAgICAvLyBTdG9wIG9uIHRoZSBmaXJzdCByZWFsIHBhY2thZ2UgbGlzdGluZywgaWYgaXQgd2FzIGEgbm9fcGFja2FnZSBmaWxlCisgICAgICAgIC8vIHNwZWNpZmljIGVudHJ5LCBrZWVwIGxvb2tpbmcgdG8gdHJ5IGFuZCBmaW5kIGEgcGFja2FnZSBvbmUuCisgICAgICAgIGlmICghSGFzUHJlZml4U3RyaW5nKG90aGVyX3BhY2thZ2VfZm9yX3ByZWZpeCwgbm9fcGFja2FnZV9wcmVmaXgpKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjazogRXJyb3IgLSBNYWtlIHN1cmUgdGhlIHByZWZpeCB3YXNuJ3QgZXhwZWN0ZWQgZm9yIGEgZGlmZmVyZW50CisgICAgLy8gcGFja2FnZSAob3ZlcmxhcCBpcyBhbGxvd2VkLCBidXQgaXQgaGFzIHRvIGJlIGxpc3RlZCBhcyBhbiBleHBlY3RlZAorICAgIC8vIG92ZXJsYXApLgorICAgIGlmICghb3RoZXJfcGFja2FnZV9mb3JfcHJlZml4LmVtcHR5KCkpIHsKKyAgICAgICpvdXRfZXJyb3IgPQorICAgICAgICAgICJlcnJvcjogRm91bmQgJ29wdGlvbiBvYmpjX2NsYXNzX3ByZWZpeCA9IFwiIiArIHByZWZpeCArCisgICAgICAgICAgIlwiOycgaW4gJyIgKyBmaWxlLT5uYW1lKCkgKyAiJzsgdGhhdCBwcmVmaXggaXMgYWxyZWFkeSB1c2VkIGZvciAiOworICAgICAgaWYgKEhhc1ByZWZpeFN0cmluZyhvdGhlcl9wYWNrYWdlX2Zvcl9wcmVmaXgsIG5vX3BhY2thZ2VfcHJlZml4KSkgeworICAgICAgICAqb3V0X2Vycm9yICs9ICJmaWxlICciICsKKyAgICAgICAgICBTdHJpcFByZWZpeFN0cmluZyhvdGhlcl9wYWNrYWdlX2Zvcl9wcmVmaXgsIG5vX3BhY2thZ2VfcHJlZml4KSArCisgICAgICAgICAgIicuIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpvdXRfZXJyb3IgKz0gIidwYWNrYWdlICIgKyBvdGhlcl9wYWNrYWdlX2Zvcl9wcmVmaXggKyAiOycuIjsKKyAgICAgIH0KKyAgICAgICpvdXRfZXJyb3IgKz0KKyAgICAgICAgIiBJdCBjYW4gb25seSBiZSByZXVzZWQgYnkgYWRkaW5nICciICsgbG9va3VwX2tleSArICIgPSAiICsgcHJlZml4ICsKKyAgICAgICAgIicgdG8gdGhlIGV4cGVjdGVkIHByZWZpeGVzIGZpbGUgKCIgKyBleHBlY3RlZF9wcmVmaXhlc19wYXRoICsgIikuIjsKKyAgICAgIHJldHVybiBmYWxzZTsgIC8vIE9ubHkgcmVwb3J0IGZpcnN0IHVzYWdlIG9mIHRoZSBwcmVmaXguCisgICAgfQorICB9IC8vICFwcmVmaXguZW1wdHkoKSAmJiBoYXZlX2V4cGVjdGVkX3ByZWZpeF9maWxlCisKKyAgLy8gQ2hlY2s6IFdhcm5pbmcgLSBNYWtlIHN1cmUgdGhlIHByZWZpeCBpcyBpcyBhIHJlYXNvbmFibGUgdmFsdWUgYWNjb3JkaW5nCisgIC8vIHRvIEFwcGxlJ3MgcnVsZXMgKHRoZSBjaGVja3MgYWJvdmUgaW1wbGljaXRseSB3aGl0ZWxpc3QgYW55dGhpbmcgdGhhdAorICAvLyBkb2Vzbid0IG1lZXQgdGhlc2UgcnVsZXMpLgorICBpZiAoIXByZWZpeC5lbXB0eSgpICYmICFhc2NpaV9pc3VwcGVyKHByZWZpeFswXSkpIHsKKyAgICBzdGQ6OmNlcnIKKyAgICAgICAgIDw8ICJwcm90b2M6MDogd2FybmluZzogSW52YWxpZCAnb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gXCIiCisgICAgICAgICA8PCBwcmVmaXggPDwgIlwiOycgaW4gJyIgPDwgZmlsZS0+bmFtZSgpIDw8ICInOyIKKyAgICAgICAgIDw8ICIgaXQgc2hvdWxkIHN0YXJ0IHdpdGggYSBjYXBpdGFsIGxldHRlci4iIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIuZmx1c2goKTsKKyAgfQorICBpZiAoIXByZWZpeC5lbXB0eSgpICYmIHByZWZpeC5sZW5ndGgoKSA8IDMpIHsKKyAgICAvLyBBcHBsZSByZXNlcnZlcyAyIGNoYXJhY3RlciBwcmVmaXhlcyBmb3IgdGhlbXNlbHZlcy4gVGhleSBkbyB1c2Ugc29tZQorICAgIC8vIDMgY2hhcmFjdGVyIHByZWZpeGVzLCBidXQgdGhleSBoYXZlbid0IHVwZGF0ZWQgdGhlIHJ1bGVzL2RvY3MuCisgICAgc3RkOjpjZXJyCisgICAgICAgICA8PCAicHJvdG9jOjA6IHdhcm5pbmc6IEludmFsaWQgJ29wdGlvbiBvYmpjX2NsYXNzX3ByZWZpeCA9IFwiIgorICAgICAgICAgPDwgcHJlZml4IDw8ICJcIjsnIGluICciIDw8IGZpbGUtPm5hbWUoKSA8PCAiJzsiCisgICAgICAgICA8PCAiIEFwcGxlIHJlY29tbWVuZHMgdGhleSBzaG91bGQgYmUgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzIGxvbmcuIgorICAgICAgICAgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2Vyci5mbHVzaCgpOworICB9CisKKyAgLy8gQ2hlY2s6IEVycm9yL1dhcm5pbmcgLSBJZiB0aGUgZ2l2ZW4gcGFja2FnZS9wcmVmaXggcGFpciB3YXNuJ3QgZXhwZWN0ZWQsCisgIC8vIGlzc3VlIGEgZXJyb3Ivd2FybmluZyB0byBhZGRlZCB0byB0aGUgZmlsZS4KKyAgaWYgKGhhdmVfZXhwZWN0ZWRfcHJlZml4X2ZpbGUpIHsKKyAgICBpZiAocHJlZml4ZXNfbXVzdF9iZV9yZWdpc3RlcmVkKSB7CisgICAgICAqb3V0X2Vycm9yID0KKyAgICAgICAgImVycm9yOiAnIiArIGZpbGUtPm5hbWUoKSArICInIGhhcyAnb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gXCIiICsKKyAgICAgICAgcHJlZml4ICsgIlwiOycsIGJ1dCBpdCBpcyBub3QgcmVnaXN0ZXJlZC4gQWRkICciICsgbG9va3VwX2tleSArICIgPSAiICsKKyAgICAgICAgKHByZWZpeC5lbXB0eSgpID8gIlwiXCIiIDogcHJlZml4KSArCisgICAgICAgICInIHRvIHRoZSBleHBlY3RlZCBwcmVmaXhlcyBmaWxlICgiICsgZXhwZWN0ZWRfcHJlZml4ZXNfcGF0aCArICIpLiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpjZXJyCisgICAgICAgICA8PCAicHJvdG9jOjA6IHdhcm5pbmc6IEZvdW5kIHVuZXhwZWN0ZWQgJ29wdGlvbiBvYmpjX2NsYXNzX3ByZWZpeCA9IFwiIgorICAgICAgICAgPDwgcHJlZml4IDw8ICJcIjsnIGluICciIDw8IGZpbGUtPm5hbWUoKSA8PCAiJzsgY29uc2lkZXIgYWRkaW5nICciCisgICAgICAgICA8PCBsb29rdXBfa2V5IDw8ICIgPSAiIDw8IChwcmVmaXguZW1wdHkoKSA/ICJcIlwiIiA6IHByZWZpeCkKKyAgICAgICAgIDw8ICInIHRvIHRoZSBleHBlY3RlZCBwcmVmaXhlcyBmaWxlICgiIDw8IGV4cGVjdGVkX3ByZWZpeGVzX3BhdGgKKyAgICAgICAgIDw8ICIpLiIgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2Vyci5mbHVzaCgpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitib29sIFZhbGlkYXRlT2JqQ0NsYXNzUHJlZml4ZXMoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dF9lcnJvcikgeworICAgIC8vIE9wdGlvbnMncyBjdG9yIGxvYWQgZnJvbSB0aGUgZW52aXJvbm1lbnQuCisgICAgT3B0aW9ucyBvcHRpb25zOworICAgIHJldHVybiBWYWxpZGF0ZU9iakNDbGFzc1ByZWZpeGVzKGZpbGVzLCBvcHRpb25zLCBvdXRfZXJyb3IpOworfQorCitib29sIFZhbGlkYXRlT2JqQ0NsYXNzUHJlZml4ZXMoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgZ2VuZXJhdGlvbl9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRfZXJyb3IpIHsKKyAgLy8gQWxsb3cgYSAnLScgYXMgdGhlIHBhdGggZm9yIHRoZSBleHBlY3RlZCBwcmVmaXhlcyB0byBjb21wbGV0ZWx5IGRpc2FibGUKKyAgLy8gZXZlbiB0aGUgbW9zdCBiYXNpYyBvZiBjaGVja3MuCisgIGlmIChnZW5lcmF0aW9uX29wdGlvbnMuZXhwZWN0ZWRfcHJlZml4ZXNfcGF0aCA9PSAiLSIpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIExvYWQgdGhlIGV4cGVjdGVkIHBhY2thZ2UgcHJlZml4ZXMsIGlmIGF2YWlsYWJsZSwgdG8gdmFsaWRhdGUgYWdhaW5zdC4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBleHBlY3RlZF9wYWNrYWdlX3ByZWZpeGVzOworICBpZiAoIUxvYWRFeHBlY3RlZFBhY2thZ2VQcmVmaXhlcyhnZW5lcmF0aW9uX29wdGlvbnMuZXhwZWN0ZWRfcHJlZml4ZXNfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4cGVjdGVkX3BhY2thZ2VfcHJlZml4ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9lcnJvcikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgYm9vbCBzaG91bGRfc2tpcCA9CisgICAgICAoc3RkOjpmaW5kKGdlbmVyYXRpb25fb3B0aW9ucy5leHBlY3RlZF9wcmVmaXhlc19zdXBwcmVzc2lvbnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbl9vcHRpb25zLmV4cGVjdGVkX3ByZWZpeGVzX3N1cHByZXNzaW9ucy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgZmlsZXNbaV0tPm5hbWUoKSkKKyAgICAgICAgICAhPSBnZW5lcmF0aW9uX29wdGlvbnMuZXhwZWN0ZWRfcHJlZml4ZXNfc3VwcHJlc3Npb25zLmVuZCgpKTsKKyAgICBpZiAoc2hvdWxkX3NraXApIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGJvb2wgaXNfdmFsaWQgPQorICAgICAgICBWYWxpZGF0ZU9iakNDbGFzc1ByZWZpeChmaWxlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbl9vcHRpb25zLmV4cGVjdGVkX3ByZWZpeGVzX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3BhY2thZ2VfcHJlZml4ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25fb3B0aW9ucy5wcmVmaXhlc19tdXN0X2JlX3JlZ2lzdGVyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25fb3B0aW9ucy5yZXF1aXJlX3ByZWZpeGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZXJyb3IpOworICAgIGlmICghaXNfdmFsaWQpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK1RleHRGb3JtYXREZWNvZGVEYXRhOjpUZXh0Rm9ybWF0RGVjb2RlRGF0YSgpIHsgfQorCitUZXh0Rm9ybWF0RGVjb2RlRGF0YTo6flRleHRGb3JtYXREZWNvZGVEYXRhKCkgeyB9CisKK3ZvaWQgVGV4dEZvcm1hdERlY29kZURhdGE6OkFkZFN0cmluZyhpbnQzMl90IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXRfZm9yX2RlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVzaXJlZF9vdXRwdXQpIHsKKyAgZm9yIChzdGQ6OnZlY3RvcjxEYXRhRW50cnk+Ojpjb25zdF9pdGVyYXRvciBpID0gZW50cmllc18uYmVnaW4oKTsKKyAgICAgICBpICE9IGVudHJpZXNfLmVuZCgpOyArK2kpIHsKKyAgICBpZiAoaS0+Zmlyc3QgPT0ga2V5KSB7CisgICAgICBzdGQ6OmNlcnIgPDwgImVycm9yOiBkdXBsaWNhdGUga2V5ICgiIDw8IGtleQorICAgICAgICAgICA8PCAiKSBtYWtpbmcgVGV4dEZvcm1hdCBkYXRhLCBpbnB1dDogXCIiIDw8IGlucHV0X2Zvcl9kZWNvZGUKKyAgICAgICAgICAgPDwgIlwiLCBkZXNpcmVkOiBcIiIgPDwgZGVzaXJlZF9vdXRwdXQgPDwgIlwiLiIgPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjZXJyLmZsdXNoKCk7CisgICAgICBhYm9ydCgpOworICAgIH0KKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhID0gVGV4dEZvcm1hdERlY29kZURhdGE6OkRlY29kZURhdGFGb3JTdHJpbmcoCisgICAgICBpbnB1dF9mb3JfZGVjb2RlLCBkZXNpcmVkX291dHB1dCk7CisgIGVudHJpZXNfLnB1c2hfYmFjayhEYXRhRW50cnkoa2V5LCBkYXRhKSk7Cit9CisKK3N0ZDo6c3RyaW5nIFRleHRGb3JtYXREZWNvZGVEYXRhOjpEYXRhKCkgY29uc3QgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZGF0YV9zdHJpbmdzdHJlYW07CisKKyAgaWYgKG51bV9lbnRyaWVzKCkgPiAwKSB7CisgICAgaW86Ok9zdHJlYW1PdXRwdXRTdHJlYW0gZGF0YV9vdXRwdXRzdHJlYW0oJmRhdGFfc3RyaW5nc3RyZWFtKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmZGF0YV9vdXRwdXRzdHJlYW0pOworCisgICAgb3V0cHV0X3N0cmVhbS5Xcml0ZVZhcmludDMyKG51bV9lbnRyaWVzKCkpOworICAgIGZvciAoc3RkOjp2ZWN0b3I8RGF0YUVudHJ5Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IGVudHJpZXNfLmJlZ2luKCk7CisgICAgICAgICBpICE9IGVudHJpZXNfLmVuZCgpOyArK2kpIHsKKyAgICAgIG91dHB1dF9zdHJlYW0uV3JpdGVWYXJpbnQzMihpLT5maXJzdCk7CisgICAgICBvdXRwdXRfc3RyZWFtLldyaXRlU3RyaW5nKGktPnNlY29uZCk7CisgICAgfQorICB9CisKKyAgZGF0YV9zdHJpbmdzdHJlYW0uZmx1c2goKTsKKyAgcmV0dXJuIGRhdGFfc3RyaW5nc3RyZWFtLnN0cigpOworfQorCituYW1lc3BhY2UgeworCisvLyBIZWxwZXIgdG8gYnVpbGQgdXAgdGhlIGRlY29kZSBkYXRhIGZvciBhIHN0cmluZy4KK2NsYXNzIERlY29kZURhdGFCdWlsZGVyIHsKKyBwdWJsaWM6CisgIERlY29kZURhdGFCdWlsZGVyKCkgeyBSZXNldCgpOyB9CisKKyAgYm9vbCBBZGRDaGFyYWN0ZXIoY29uc3QgY2hhciBkZXNpcmVkLCBjb25zdCBjaGFyIGlucHV0KTsKKyAgdm9pZCBBZGRVbmRlcnNjb3JlKCkgeworICAgIFB1c2goKTsKKyAgICBuZWVkX3VuZGVyc2NvcmVfID0gdHJ1ZTsKKyAgfQorICBzdGQ6OnN0cmluZyBGaW5pc2goKSB7CisgICAgUHVzaCgpOworICAgIHJldHVybiBkZWNvZGVfZGF0YV87CisgIH0KKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQWRkVW5kZXJzY29yZSA9IDB4ODA7CisKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtPcEFzSXMgPSAweDAwOworICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga09wRmlyc3RVcHBlciA9IDB4NDA7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrT3BGaXJzdExvd2VyID0gMHgyMDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtPcEFsbFVwcGVyID0gMHg2MDsKKworICBzdGF0aWMgY29uc3RleHByIGludCBrTWF4U2VnbWVudExlbiA9IDB4MWY7CisKKyAgdm9pZCBBZGRDaGFyKGNvbnN0IGNoYXIgZGVzaXJlZCkgeworICAgICsrc2VnbWVudF9sZW5fOworICAgIGlzX2FsbF91cHBlcl8gJj0gYXNjaWlfaXN1cHBlcihkZXNpcmVkKTsKKyAgfQorCisgIHZvaWQgUHVzaCgpIHsKKyAgICB1aW50OF90IG9wID0gKG9wXyB8IHNlZ21lbnRfbGVuXyk7CisgICAgaWYgKG5lZWRfdW5kZXJzY29yZV8pIG9wIHw9IGtBZGRVbmRlcnNjb3JlOworICAgIGlmIChvcCAhPSAwKSB7CisgICAgICBkZWNvZGVfZGF0YV8gKz0gKGNoYXIpb3A7CisgICAgfQorICAgIFJlc2V0KCk7CisgIH0KKworICBib29sIEFkZEZpcnN0KGNvbnN0IGNoYXIgZGVzaXJlZCwgY29uc3QgY2hhciBpbnB1dCkgeworICAgIGlmIChkZXNpcmVkID09IGlucHV0KSB7CisgICAgICBvcF8gPSBrT3BBc0lzOworICAgIH0gZWxzZSBpZiAoZGVzaXJlZCA9PSBhc2NpaV90b3VwcGVyKGlucHV0KSkgeworICAgICAgb3BfID0ga09wRmlyc3RVcHBlcjsKKyAgICB9IGVsc2UgaWYgKGRlc2lyZWQgPT0gYXNjaWlfdG9sb3dlcihpbnB1dCkpIHsKKyAgICAgIG9wXyA9IGtPcEZpcnN0TG93ZXI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIENhbid0IGJlIHRyYW5zZm9ybWVkIHRvIG1hdGNoLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBZGRDaGFyKGRlc2lyZWQpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdm9pZCBSZXNldCgpIHsKKyAgICBuZWVkX3VuZGVyc2NvcmVfID0gZmFsc2U7CisgICAgb3BfID0gMDsKKyAgICBzZWdtZW50X2xlbl8gPSAwOworICAgIGlzX2FsbF91cHBlcl8gPSB0cnVlOworICB9CisKKyAgYm9vbCBuZWVkX3VuZGVyc2NvcmVfOworICBib29sIGlzX2FsbF91cHBlcl87CisgIHVpbnQ4X3Qgb3BfOworICBpbnQgc2VnbWVudF9sZW5fOworCisgIHN0ZDo6c3RyaW5nIGRlY29kZV9kYXRhXzsKK307CisKK2Jvb2wgRGVjb2RlRGF0YUJ1aWxkZXI6OkFkZENoYXJhY3Rlcihjb25zdCBjaGFyIGRlc2lyZWQsIGNvbnN0IGNoYXIgaW5wdXQpIHsKKyAgLy8gSWYgd2UndmUgaGl0IHRoZSBtYXggc2l6ZSwgcHVzaCB0byBzdGFydCBhIG5ldyBzZWdtZW50LgorICBpZiAoc2VnbWVudF9sZW5fID09IGtNYXhTZWdtZW50TGVuKSB7CisgICAgUHVzaCgpOworICB9CisgIGlmIChzZWdtZW50X2xlbl8gPT0gMCkgeworICAgIHJldHVybiBBZGRGaXJzdChkZXNpcmVkLCBpbnB1dCk7CisgIH0KKworICAvLyBEZXNpcmVkIGFuZCBpbnB1dCBtYXRjaC4uLgorICBpZiAoZGVzaXJlZCA9PSBpbnB1dCkgeworICAgIC8vIElmIHdlIGFyZW4ndCB0cmFuc2Zvcm1pbmcgaXQsIG9yIHdlJ3JlIHVwcGVyIGNhc2luZyBpdCBhbmQgaXQgaXMKKyAgICAvLyBzdXBwb3NlZCB0byBiZSB1cHBlcmNhc2U7IGp1c3QgYWRkIGl0IHRvIHRoZSBzZWdtZW50LgorICAgIGlmICgob3BfICE9IGtPcEFsbFVwcGVyKSB8fCBhc2NpaV9pc3VwcGVyKGRlc2lyZWQpKSB7CisgICAgICBBZGRDaGFyKGRlc2lyZWQpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gQWRkIHRoZSBjdXJyZW50IHNlZ21lbnQsIGFuZCBzdGFydCB0aGUgbmV4dCBvbmUuCisgICAgUHVzaCgpOworICAgIHJldHVybiBBZGRGaXJzdChkZXNpcmVkLCBpbnB1dCk7CisgIH0KKworICAvLyBJZiB3ZSBuZWVkIHRvIHVwcGVyY2FzZSwgYW5kIGV2ZXJ5dGhpbmcgc28gZmFyIGhhcyBiZWVuIHVwcGVyY2FzZSwKKyAgLy8gcHJvbW90ZSBvcCB0byBBbGxVcHBlci4KKyAgaWYgKChkZXNpcmVkID09IGFzY2lpX3RvdXBwZXIoaW5wdXQpKSAmJiBpc19hbGxfdXBwZXJfKSB7CisgICAgb3BfID0ga09wQWxsVXBwZXI7CisgICAgQWRkQ2hhcihkZXNpcmVkKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIEdpdmUgdXAsIHB1c2ggYW5kIHN0YXJ0IGEgbmV3IHNlZ21lbnQuCisgIFB1c2goKTsKKyAgcmV0dXJuIEFkZEZpcnN0KGRlc2lyZWQsIGlucHV0KTsKK30KKworLy8gSWYgZGVjb2RlIGRhdGEgY2FuJ3QgYmUgZ2VuZXJhdGVkLCBhIGRpcmVjdGl2ZSBmb3IgdGhlIHJhdyBzdHJpbmcKKy8vIGlzIHVzZWQgaW5zdGVhZC4KK3N0ZDo6c3RyaW5nIERpcmVjdERlY29kZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0ICs9IChjaGFyKSdcMCc7ICAvLyBNYXJrZXIgZm9yIGZ1bGwgc3RyaW5nLgorICByZXN1bHQgKz0gc3RyOworICByZXN1bHQgKz0gKGNoYXIpJ1wwJzsgIC8vIEVuZCBvZiBzdHJpbmcuCisgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK3N0ZDo6c3RyaW5nIFRleHRGb3JtYXREZWNvZGVEYXRhOjpEZWNvZGVEYXRhRm9yU3RyaW5nKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dF9mb3JfZGVjb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgZGVzaXJlZF9vdXRwdXQpIHsKKyAgaWYgKGlucHV0X2Zvcl9kZWNvZGUuZW1wdHkoKSB8fCBkZXNpcmVkX291dHB1dC5lbXB0eSgpKSB7CisgICAgc3RkOjpjZXJyIDw8ICJlcnJvcjogZ290IGVtcHR5IHN0cmluZyBmb3IgbWFraW5nIFRleHRGb3JtYXQgZGF0YSwgaW5wdXQ6IFwiIgorICAgICAgICAgPDwgaW5wdXRfZm9yX2RlY29kZSA8PCAiXCIsIGRlc2lyZWQ6IFwiIiA8PCBkZXNpcmVkX291dHB1dCA8PCAiXCIuIgorICAgICAgICAgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2Vyci5mbHVzaCgpOworICAgIGFib3J0KCk7CisgIH0KKyAgaWYgKChpbnB1dF9mb3JfZGVjb2RlLmZpbmQoJ1wwJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHx8CisgICAgICAoZGVzaXJlZF9vdXRwdXQuZmluZCgnXDAnKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykpIHsKKyAgICBzdGQ6OmNlcnIgPDwgImVycm9yOiBnb3QgYSBudWxsIGNoYXIgaW4gYSBzdHJpbmcgZm9yIG1ha2luZyBUZXh0Rm9ybWF0IGRhdGEsIgorICAgICAgICAgPDwgIiBpbnB1dDogXCIiIDw8IENFc2NhcGUoaW5wdXRfZm9yX2RlY29kZSkgPDwgIlwiLCBkZXNpcmVkOiBcIiIKKyAgICAgICAgIDw8IENFc2NhcGUoZGVzaXJlZF9vdXRwdXQpIDw8ICJcIi4iIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIuZmx1c2goKTsKKyAgICBhYm9ydCgpOworICB9CisKKyAgRGVjb2RlRGF0YUJ1aWxkZXIgYnVpbGRlcjsKKworICAvLyBXYWxrIHRoZSBvdXRwdXQgYnVpbGRpbmcgaXQgZnJvbSB0aGUgaW5wdXQuCisgIGludCB4ID0gMDsKKyAgZm9yIChpbnQgeSA9IDA7IHkgPCBkZXNpcmVkX291dHB1dC5zaXplKCk7IHkrKykgeworICAgIGNvbnN0IGNoYXIgZCA9IGRlc2lyZWRfb3V0cHV0W3ldOworICAgIGlmIChkID09ICdfJykgeworICAgICAgYnVpbGRlci5BZGRVbmRlcnNjb3JlKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoeCA+PSBpbnB1dF9mb3JfZGVjb2RlLnNpemUoKSkgeworICAgICAgLy8gT3V0IG9mIGlucHV0LCBubyB3YXkgdG8gZW5jb2RlIGl0LCBqdXN0IHJldHVybiBhIGZ1bGwgZGVjb2RlLgorICAgICAgcmV0dXJuIERpcmVjdERlY29kZVN0cmluZyhkZXNpcmVkX291dHB1dCk7CisgICAgfQorICAgIGlmIChidWlsZGVyLkFkZENoYXJhY3RlcihkLCBpbnB1dF9mb3JfZGVjb2RlW3hdKSkgeworICAgICAgKyt4OyAgLy8gQ29uc3VtZWQgb25lIGlucHV0CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIENvdWxkbid0IHRyYW5zZm9ybSBmb3IgdGhlIG5leHQgY2hhcmFjdGVyLCBqdXN0IHJldHVybiBhIGZ1bGwgZGVjb2RlLgorICAgICAgcmV0dXJuIERpcmVjdERlY29kZVN0cmluZyhkZXNpcmVkX291dHB1dCk7CisgICAgfQorICB9CisKKyAgaWYgKHggIT0gaW5wdXRfZm9yX2RlY29kZS5zaXplKCkpIHsKKyAgICAvLyBFeHRyYSBpbnB1dCAoc3VmZml4IGZyb20gbmFtZSBzYW5pdGl6aW5nPyksIGp1c3QgcmV0dXJuIGEgZnVsbCBkZWNvZGUuCisgICAgcmV0dXJuIERpcmVjdERlY29kZVN0cmluZyhkZXNpcmVkX291dHB1dCk7CisgIH0KKworICAvLyBBZGQgdGhlIGVuZCBtYXJrZXIuCisgIHJldHVybiBidWlsZGVyLkZpbmlzaCgpICsgKGNoYXIpJ1wwJzsKK30KKworbmFtZXNwYWNlIHsKKworY2xhc3MgUGFyc2VyIHsKKyBwdWJsaWM6CisgIFBhcnNlcihMaW5lQ29uc3VtZXIqIGxpbmVfY29uc3VtZXIpCisgICAgICA6IGxpbmVfY29uc3VtZXJfKGxpbmVfY29uc3VtZXIpLCBsaW5lXygwKSB7fQorCisgIC8vIEZlZWRzIGluIHNvbWUgaW5wdXQsIHBhcnNlIHdoYXQgaXQgY2FuLCByZXR1cm5pbmcgc3VjY2Vzcy9mYWlsdXJlLiBDYWxsaW5nCisgIC8vIGFnYWluIGFmdGVyIGFuIGVycm9yIGlzIHVuZGVmaW5lZC4KKyAgYm9vbCBQYXJzZUNodW5rKFN0cmluZ1BpZWNlIGNodW5rLCBzdGQ6OnN0cmluZyogb3V0X2Vycm9yKTsKKworICAvLyBTaG91bGQgYmUgY2FsbGVkIHRvIGZpbmlzaCBwYXJzaW5nIChhZnRlciBhbGwgaW5wdXQgaGFzIGJlZW4gcHJvdmlkZWQgdmlhCisgIC8vIHN1Y2Nlc3NmdWwgY2FsbHMgdG8gUGFyc2VDaHVuaygpLCBjYWxsaW5nIGFmdGVyIGEgUGFyc2VDaHVuaygpIGZhaWx1cmUgaXMKKyAgLy8gdW5kZWZpbmVkKS4gUmV0dXJucyBzdWNjZXNzL2ZhaWx1cmUuCisgIGJvb2wgRmluaXNoKHN0ZDo6c3RyaW5nKiBvdXRfZXJyb3IpOworCisgIGludCBsYXN0X2xpbmUoKSBjb25zdCB7IHJldHVybiBsaW5lXzsgfQorCisgcHJpdmF0ZToKKyAgTGluZUNvbnN1bWVyKiBsaW5lX2NvbnN1bWVyXzsKKyAgaW50IGxpbmVfOworICBzdGQ6OnN0cmluZyBsZWZ0b3Zlcl87Cit9OworCitib29sIFBhcnNlcjo6UGFyc2VDaHVuayhTdHJpbmdQaWVjZSBjaHVuaywgc3RkOjpzdHJpbmcqIG91dF9lcnJvcikgeworICBTdHJpbmdQaWVjZSBmdWxsX2NodW5rOworICBpZiAoIWxlZnRvdmVyXy5lbXB0eSgpKSB7CisgICAgbGVmdG92ZXJfICs9IHN0ZDo6c3RyaW5nKGNodW5rKTsKKyAgICBmdWxsX2NodW5rID0gU3RyaW5nUGllY2UobGVmdG92ZXJfKTsKKyAgfSBlbHNlIHsKKyAgICBmdWxsX2NodW5rID0gY2h1bms7CisgIH0KKworICBTdHJpbmdQaWVjZSBsaW5lOworICB3aGlsZSAoUmVhZExpbmUoJmZ1bGxfY2h1bmssICZsaW5lKSkgeworICAgICsrbGluZV87CisgICAgUmVtb3ZlQ29tbWVudCgmbGluZSk7CisgICAgVHJpbVdoaXRlc3BhY2UoJmxpbmUpOworICAgIGlmICghbGluZS5lbXB0eSgpICYmICFsaW5lX2NvbnN1bWVyXy0+Q29uc3VtZUxpbmUobGluZSwgb3V0X2Vycm9yKSkgeworICAgICAgaWYgKG91dF9lcnJvci0+ZW1wdHkoKSkgeworICAgICAgICAqb3V0X2Vycm9yID0gIkNvbnN1bWVMaW5lIGZhaWxlZCB3aXRob3V0IHNldHRpbmcgYW4gZXJyb3IuIjsKKyAgICAgIH0KKyAgICAgIGxlZnRvdmVyXy5jbGVhcigpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIGlmIChmdWxsX2NodW5rLmVtcHR5KCkpIHsKKyAgICBsZWZ0b3Zlcl8uY2xlYXIoKTsKKyAgfSBlbHNlIHsKKyAgICBsZWZ0b3Zlcl8gPSBzdGQ6OnN0cmluZyhmdWxsX2NodW5rKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OkZpbmlzaChzdGQ6OnN0cmluZyogb3V0X2Vycm9yKSB7CisgIC8vIElmIHRoZXJlIGlzIHN0aWxsIHNvbWV0aGluZyB0byBnbywgZmx1c2ggaXQgd2l0aCBhIG5ld2xpbmUuCisgIGlmICghbGVmdG92ZXJfLmVtcHR5KCkgJiYgIVBhcnNlQ2h1bmsoIlxuIiwgb3V0X2Vycm9yKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBUaGlzIHJlYWxseSBzaG91bGQgbmV2ZXIgZmFpbCBpZiBQYXJzZUNodW5rIHN1Y2NlZWRlZCwgYnV0IGNoZWNrIHRvIGJlIHN1cmUuCisgIGlmICghbGVmdG92ZXJfLmVtcHR5KCkpIHsKKyAgICAqb3V0X2Vycm9yID0gIlBhcnNlU2ltcGxlIEludGVybmFsIGVycm9yOiBmaW5pc2hlZCB3aXRoIHBlbmRpbmcgZGF0YS4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RkOjpzdHJpbmcgRnVsbEVycm9yU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQgbGluZV9udW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJlcnJvcjogIikgKyBuYW1lICsgIiBMaW5lICIgKyBTdHJDYXQobGluZV9udW0pICsgIiwgIiArIG1zZzsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0xpbmVDb25zdW1lcjo6TGluZUNvbnN1bWVyKCkge30KKworTGluZUNvbnN1bWVyOjp+TGluZUNvbnN1bWVyKCkge30KKworYm9vbCBQYXJzZVNpbXBsZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIExpbmVDb25zdW1lciogbGluZV9jb25zdW1lciwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRfZXJyb3IpIHsKKyAgaW50IGZkOworICBkbyB7CisgICAgZmQgPSBwb3NpeDo6b3BlbihwYXRoLmNfc3RyKCksIE9fUkRPTkxZKTsKKyAgfSB3aGlsZSAoZmQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKyAgaWYgKGZkIDwgMCkgeworICAgICpvdXRfZXJyb3IgPSBzdGQ6OnN0cmluZygiZXJyb3I6IFVuYWJsZSB0byBvcGVuIFwiIikgKyBwYXRoICsgIlwiLCAiICsKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbzo6RmlsZUlucHV0U3RyZWFtIGZpbGVfc3RyZWFtKGZkKTsKKyAgZmlsZV9zdHJlYW0uU2V0Q2xvc2VPbkRlbGV0ZSh0cnVlKTsKKworICByZXR1cm4gUGFyc2VTaW1wbGVTdHJlYW0oZmlsZV9zdHJlYW0sIHBhdGgsIGxpbmVfY29uc3VtZXIsIG91dF9lcnJvcik7Cit9CisKK2Jvb2wgUGFyc2VTaW1wbGVTdHJlYW0oaW86Olplcm9Db3B5SW5wdXRTdHJlYW0mIGlucHV0X3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmVhbV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBMaW5lQ29uc3VtZXIqIGxpbmVfY29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRfZXJyb3IpIHsKKyAgc3RkOjpzdHJpbmcgbG9jYWxfZXJyb3I7CisgIFBhcnNlciBwYXJzZXIobGluZV9jb25zdW1lcik7CisgIGNvbnN0IHZvaWQqIGJ1ZjsKKyAgaW50IGJ1Zl9sZW47CisgIHdoaWxlIChpbnB1dF9zdHJlYW0uTmV4dCgmYnVmLCAmYnVmX2xlbikpIHsKKyAgICBpZiAoYnVmX2xlbiA9PSAwKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoIXBhcnNlci5QYXJzZUNodW5rKFN0cmluZ1BpZWNlKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihidWYpLCBidWZfbGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2NhbF9lcnJvcikpIHsKKyAgICAgICpvdXRfZXJyb3IgPSBGdWxsRXJyb3JTdHJpbmcoc3RyZWFtX25hbWUsIHBhcnNlci5sYXN0X2xpbmUoKSwgbG9jYWxfZXJyb3IpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICBpZiAoIXBhcnNlci5GaW5pc2goJmxvY2FsX2Vycm9yKSkgeworICAgICpvdXRfZXJyb3IgPSBGdWxsRXJyb3JTdHJpbmcoc3RyZWFtX25hbWUsIHBhcnNlci5sYXN0X2xpbmUoKSwgbG9jYWxfZXJyb3IpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworSW1wb3J0V3JpdGVyOjpJbXBvcnRXcml0ZXIoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdlbmVyYXRlX2Zvcl9uYW1lZF9mcmFtZXdvcmssCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWVkX2ZyYW1ld29ya190b19wcm90b19wYXRoX21hcHBpbmdzX3BhdGgsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJ1bnRpbWVfaW1wb3J0X3ByZWZpeCwgYm9vbCBpbmNsdWRlX3drdF9pbXBvcnRzKQorICAgIDogZ2VuZXJhdGVfZm9yX25hbWVkX2ZyYW1ld29ya18oZ2VuZXJhdGVfZm9yX25hbWVkX2ZyYW1ld29yayksCisgICAgICBuYW1lZF9mcmFtZXdvcmtfdG9fcHJvdG9fcGF0aF9tYXBwaW5nc19wYXRoXygKKyAgICAgICAgICBuYW1lZF9mcmFtZXdvcmtfdG9fcHJvdG9fcGF0aF9tYXBwaW5nc19wYXRoKSwKKyAgICAgIHJ1bnRpbWVfaW1wb3J0X3ByZWZpeF8ocnVudGltZV9pbXBvcnRfcHJlZml4KSwKKyAgICAgIGluY2x1ZGVfd2t0X2ltcG9ydHNfKGluY2x1ZGVfd2t0X2ltcG9ydHMpLAorICAgICAgbmVlZF90b19wYXJzZV9tYXBwaW5nX2ZpbGVfKHRydWUpIHt9CisKK0ltcG9ydFdyaXRlcjo6fkltcG9ydFdyaXRlcigpIHt9CisKK3ZvaWQgSW1wb3J0V3JpdGVyOjpBZGRGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhlYWRlcl9leHRlbnNpb24pIHsKKyAgaWYgKElzUHJvdG9idWZMaWJyYXJ5QnVuZGxlZFByb3RvRmlsZShmaWxlKSkgeworICAgIC8vIFRoZSBpbXBvcnRzIG9mIHRoZSBXS1RzIGFyZSBvbmx5IG5lZWRlZCB3aXRoaW4gdGhlIGxpYnJhcnkgaXRzZWxmLAorICAgIC8vIGluIG90aGVyIGNhc2VzLCB0aGV5IGdldCBza2lwcGVkIGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBjb2RlIGFscmVhZHkKKyAgICAvLyBpbXBvcnQgR1BCUHJvdG9jb2xCdWZmZXJzLmggYW5kIGhlbmNlIHByb3ZlcyB0aGVtLgorICAgIGlmIChpbmNsdWRlX3drdF9pbXBvcnRzXykgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgaGVhZGVyX25hbWUgPQorICAgICAgICAgICJHUEIiICsgRmlsZVBhdGhCYXNlbmFtZShmaWxlKSArIGhlYWRlcl9leHRlbnNpb247CisgICAgICBwcm90b2J1Zl9pbXBvcnRzXy5wdXNoX2JhY2soaGVhZGVyX25hbWUpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvLyBMYXp5IHBhcnNlIGFueSBtYXBwaW5ncy4KKyAgaWYgKG5lZWRfdG9fcGFyc2VfbWFwcGluZ19maWxlXykgeworICAgIFBhcnNlRnJhbWV3b3JrTWFwcGluZ3MoKTsKKyAgfQorCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIHByb3RvX2xvb2t1cCA9CisgICAgICBwcm90b19maWxlX3RvX2ZyYW1ld29ya19uYW1lXy5maW5kKGZpbGUtPm5hbWUoKSk7CisgIGlmIChwcm90b19sb29rdXAgIT0gcHJvdG9fZmlsZV90b19mcmFtZXdvcmtfbmFtZV8uZW5kKCkpIHsKKyAgICBvdGhlcl9mcmFtZXdvcmtfaW1wb3J0c18ucHVzaF9iYWNrKAorICAgICAgICBwcm90b19sb29rdXAtPnNlY29uZCArICIvIiArCisgICAgICAgIEZpbGVQYXRoQmFzZW5hbWUoZmlsZSkgKyBoZWFkZXJfZXh0ZW5zaW9uKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIWdlbmVyYXRlX2Zvcl9uYW1lZF9mcmFtZXdvcmtfLmVtcHR5KCkpIHsKKyAgICBvdGhlcl9mcmFtZXdvcmtfaW1wb3J0c18ucHVzaF9iYWNrKAorICAgICAgICBnZW5lcmF0ZV9mb3JfbmFtZWRfZnJhbWV3b3JrXyArICIvIiArCisgICAgICAgIEZpbGVQYXRoQmFzZW5hbWUoZmlsZSkgKyBoZWFkZXJfZXh0ZW5zaW9uKTsKKyAgICByZXR1cm47CisgIH0KKworICBvdGhlcl9pbXBvcnRzXy5wdXNoX2JhY2soRmlsZVBhdGgoZmlsZSkgKyBoZWFkZXJfZXh0ZW5zaW9uKTsKK30KKwordm9pZCBJbXBvcnRXcml0ZXI6OlByaW50KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGJvb2wgYWRkX2JsYW5rX2xpbmUgPSBmYWxzZTsKKworICBpZiAoIXByb3RvYnVmX2ltcG9ydHNfLmVtcHR5KCkpIHsKKyAgICBQcmludFJ1bnRpbWVJbXBvcnRzKHByaW50ZXIsIHByb3RvYnVmX2ltcG9ydHNfLCBydW50aW1lX2ltcG9ydF9wcmVmaXhfKTsKKyAgICBhZGRfYmxhbmtfbGluZSA9IHRydWU7CisgIH0KKworICBpZiAoIW90aGVyX2ZyYW1ld29ya19pbXBvcnRzXy5lbXB0eSgpKSB7CisgICAgaWYgKGFkZF9ibGFua19saW5lKSB7CisgICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICB9CisKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9CisgICAgICAgICAgICAgb3RoZXJfZnJhbWV3b3JrX2ltcG9ydHNfLmJlZ2luKCk7CisgICAgICAgICBpdGVyICE9IG90aGVyX2ZyYW1ld29ya19pbXBvcnRzXy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiI2ltcG9ydCA8JGhlYWRlciQ+XG4iLAorICAgICAgICAgICJoZWFkZXIiLCAqaXRlcik7CisgICAgfQorCisgICAgYWRkX2JsYW5rX2xpbmUgPSB0cnVlOworICB9CisKKyAgaWYgKCFvdGhlcl9pbXBvcnRzXy5lbXB0eSgpKSB7CisgICAgaWYgKGFkZF9ibGFua19saW5lKSB7CisgICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICB9CisKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IG90aGVyX2ltcG9ydHNfLmJlZ2luKCk7CisgICAgICAgICBpdGVyICE9IG90aGVyX2ltcG9ydHNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIjaW1wb3J0IFwiJGhlYWRlciRcIlxuIiwKKyAgICAgICAgICAiaGVhZGVyIiwgKml0ZXIpOworICAgIH0KKyAgfQorfQorCit2b2lkIEltcG9ydFdyaXRlcjo6UHJpbnRSdW50aW1lSW1wb3J0cygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBoZWFkZXJfdG9faW1wb3J0LAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBydW50aW1lX2ltcG9ydF9wcmVmaXgsIGJvb2wgZGVmYXVsdF9jcHBfc3ltYm9sKSB7CisgIC8vIEdpdmVuIGFuIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgaWYgKCFydW50aW1lX2ltcG9ydF9wcmVmaXguZW1wdHkoKSkgeworICAgIGZvciAoY29uc3QgYXV0byYgaGVhZGVyIDogaGVhZGVyX3RvX2ltcG9ydCkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIiAjaW1wb3J0IFwiJGltcG9ydF9wcmVmaXgkLyRoZWFkZXIkXCJcbiIsCisgICAgICAgICAgImltcG9ydF9wcmVmaXgiLCBydW50aW1lX2ltcG9ydF9wcmVmaXgsCisgICAgICAgICAgImhlYWRlciIsIGhlYWRlcik7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZyYW1ld29ya19uYW1lKFByb3RvYnVmTGlicmFyeUZyYW1ld29ya05hbWUpOworICBjb25zdCBzdGQ6OnN0cmluZyBjcHBfc3ltYm9sKFByb3RvYnVmRnJhbWV3b3JrSW1wb3J0U3ltYm9sKGZyYW1ld29ya19uYW1lKSk7CisKKyAgaWYgKGRlZmF1bHRfY3BwX3N5bWJvbCkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiLy8gVGhpcyBDUFAgc3ltYm9sIGNhbiBiZSBkZWZpbmVkIHRvIHVzZSBpbXBvcnRzIHRoYXQgbWF0Y2ggdXAgdG8gdGhlIGZyYW1ld29ya1xuIgorICAgICAgICAiLy8gaW1wb3J0cyBuZWVkZWQgd2hlbiB1c2luZyBDb2NvYVBvZHMuXG4iCisgICAgICAgICIjaWYgIWRlZmluZWQoJGNwcF9zeW1ib2wkKVxuIgorICAgICAgICAiICNkZWZpbmUgJGNwcF9zeW1ib2wkIDBcbiIKKyAgICAgICAgIiNlbmRpZlxuIgorICAgICAgICAiXG4iLAorICAgICAgICAiY3BwX3N5bWJvbCIsIGNwcF9zeW1ib2wpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiI2lmICRjcHBfc3ltYm9sJFxuIiwKKyAgICAgICJjcHBfc3ltYm9sIiwgY3BwX3N5bWJvbCk7CisgIGZvciAoY29uc3QgYXV0byYgaGVhZGVyIDogaGVhZGVyX3RvX2ltcG9ydCkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICNpbXBvcnQgPCRmcmFtZXdvcmtfbmFtZSQvJGhlYWRlciQ+XG4iLAorICAgICAgICAiZnJhbWV3b3JrX25hbWUiLCBmcmFtZXdvcmtfbmFtZSwKKyAgICAgICAgImhlYWRlciIsIGhlYWRlcik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiI2Vsc2VcbiIpOworICBmb3IgKGNvbnN0IGF1dG8mIGhlYWRlciA6IGhlYWRlcl90b19pbXBvcnQpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiAjaW1wb3J0IFwiJGhlYWRlciRcIlxuIiwKKyAgICAgICAgImhlYWRlciIsIGhlYWRlcik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiI2VuZGlmXG4iKTsKK30KKwordm9pZCBJbXBvcnRXcml0ZXI6OlBhcnNlRnJhbWV3b3JrTWFwcGluZ3MoKSB7CisgIG5lZWRfdG9fcGFyc2VfbWFwcGluZ19maWxlXyA9IGZhbHNlOworICBpZiAobmFtZWRfZnJhbWV3b3JrX3RvX3Byb3RvX3BhdGhfbWFwcGluZ3NfcGF0aF8uZW1wdHkoKSkgeworICAgIHJldHVybjsgIC8vIE5vdGhpbmcgdG8gZG8uCisgIH0KKworICBQcm90b0ZyYW1ld29ya0NvbGxlY3RvciBjb2xsZWN0b3IoJnByb3RvX2ZpbGVfdG9fZnJhbWV3b3JrX25hbWVfKTsKKyAgc3RkOjpzdHJpbmcgcGFyc2VfZXJyb3I7CisgIGlmICghUGFyc2VTaW1wbGVGaWxlKG5hbWVkX2ZyYW1ld29ya190b19wcm90b19wYXRoX21hcHBpbmdzX3BhdGhfLAorICAgICAgICAgICAgICAgICAgICAgICAmY29sbGVjdG9yLCAmcGFyc2VfZXJyb3IpKSB7CisgICAgc3RkOjpjZXJyIDw8ICJlcnJvciBwYXJzaW5nICIgPDwgbmFtZWRfZnJhbWV3b3JrX3RvX3Byb3RvX3BhdGhfbWFwcGluZ3NfcGF0aF8KKyAgICAgICAgIDw8ICIgOiAiIDw8IHBhcnNlX2Vycm9yIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIuZmx1c2goKTsKKyAgfQorfQorCitib29sIEltcG9ydFdyaXRlcjo6UHJvdG9GcmFtZXdvcmtDb2xsZWN0b3I6OkNvbnN1bWVMaW5lKAorICAgIGNvbnN0IFN0cmluZ1BpZWNlJiBsaW5lLCBzdGQ6OnN0cmluZyogb3V0X2Vycm9yKSB7CisgIGludCBvZmZzZXQgPSBsaW5lLmZpbmQoJzonKTsKKyAgaWYgKG9mZnNldCA9PSBTdHJpbmdQaWVjZTo6bnBvcykgeworICAgICpvdXRfZXJyb3IgPQorICAgICAgICBzdGQ6OnN0cmluZygiRnJhbWV3b3JrL3Byb3RvIGZpbGUgbWFwcGluZyBsaW5lIHdpdGhvdXQgY29sb24gc2lnbjogJyIpICsKKyAgICAgICAgc3RkOjpzdHJpbmcobGluZSkgKyAiJy4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBTdHJpbmdQaWVjZSBmcmFtZXdvcmtfbmFtZSA9IGxpbmUuc3Vic3RyKDAsIG9mZnNldCk7CisgIFN0cmluZ1BpZWNlIHByb3RvX2ZpbGVfbGlzdCA9IGxpbmUuc3Vic3RyKG9mZnNldCArIDEpOworICBUcmltV2hpdGVzcGFjZSgmZnJhbWV3b3JrX25hbWUpOworCisgIGludCBzdGFydCA9IDA7CisgIHdoaWxlIChzdGFydCA8IHByb3RvX2ZpbGVfbGlzdC5sZW5ndGgoKSkgeworICAgIG9mZnNldCA9IHByb3RvX2ZpbGVfbGlzdC5maW5kKCcsJywgc3RhcnQpOworICAgIGlmIChvZmZzZXQgPT0gU3RyaW5nUGllY2U6Om5wb3MpIHsKKyAgICAgIG9mZnNldCA9IHByb3RvX2ZpbGVfbGlzdC5sZW5ndGgoKTsKKyAgICB9CisKKyAgICBTdHJpbmdQaWVjZSBwcm90b19maWxlID0gcHJvdG9fZmlsZV9saXN0LnN1YnN0cihzdGFydCwgb2Zmc2V0IC0gc3RhcnQpOworICAgIFRyaW1XaGl0ZXNwYWNlKCZwcm90b19maWxlKTsKKyAgICBpZiAoIXByb3RvX2ZpbGUuZW1wdHkoKSkgeworICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgZXhpc3RpbmdfZW50cnkgPQorICAgICAgICAgIG1hcF8tPmZpbmQoc3RkOjpzdHJpbmcocHJvdG9fZmlsZSkpOworICAgICAgaWYgKGV4aXN0aW5nX2VudHJ5ICE9IG1hcF8tPmVuZCgpKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAid2FybmluZzogZHVwbGljYXRlIHByb3RvIGZpbGUgcmVmZXJlbmNlLCByZXBsYWNpbmcgIgorICAgICAgICAgICAgICAgICAgICAgImZyYW1ld29yayBlbnRyeSBmb3IgJyIKKyAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6c3RyaW5nKHByb3RvX2ZpbGUpIDw8ICInIHdpdGggJyIgPDwgc3RkOjpzdHJpbmcoZnJhbWV3b3JrX25hbWUpCisgICAgICAgICAgICAgICAgICA8PCAiJyAod2FzICciIDw8IGV4aXN0aW5nX2VudHJ5LT5zZWNvbmQgPDwgIicpLiIgPDwgc3RkOjplbmRsOworICAgICAgICBzdGQ6OmNlcnIuZmx1c2goKTsKKyAgICAgIH0KKworICAgICAgaWYgKHByb3RvX2ZpbGUuZmluZCgnICcpICE9IFN0cmluZ1BpZWNlOjpucG9zKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAibm90ZTogZnJhbWV3b3JrIG1hcHBpbmcgZmlsZSBoYWQgYSBwcm90byBmaWxlIHdpdGggYSAiCisgICAgICAgICAgICAgICAgICAgICAic3BhY2UgaW4sIGhvcGVmdWxseSB0aGF0IGlzbid0IGEgbWlzc2luZyBjb21tYTogJyIKKyAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6c3RyaW5nKHByb3RvX2ZpbGUpIDw8ICInIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y2Vyci5mbHVzaCgpOworICAgICAgfQorCisgICAgICAoKm1hcF8pW3N0ZDo6c3RyaW5nKHByb3RvX2ZpbGUpXSA9IHN0ZDo6c3RyaW5nKGZyYW1ld29ya19uYW1lKTsKKyAgICB9CisKKyAgICBzdGFydCA9IG9mZnNldCArIDE7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG9iamVjdGl2ZWMKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxZmVkMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnMuaApAQCAtMCwwICsxLDM1MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGdlbmVyYXRpbmcgT2JqZWN0aXZlQyBjb2RlLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9PQkpFQ1RJVkVDX0hFTFBFUlNfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9PQkpFQ1RJVkVDX0hFTFBFUlNfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIG9iamVjdGl2ZWMgeworCisvLyBHZXQvU2V0IHRoZSBwYXRoIHRvIGEgZmlsZSB0byBsb2FkIGZvciBvYmpjIGNsYXNzIHByZWZpeCBsb29rdXBzLgorc3RkOjpzdHJpbmcgUFJPVE9DX0VYUE9SVCBHZXRQYWNrYWdlVG9QcmVmaXhNYXBwaW5nc1BhdGgoKTsKK3ZvaWQgUFJPVE9DX0VYUE9SVCBTZXRQYWNrYWdlVG9QcmVmaXhNYXBwaW5nc1BhdGgoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfcGF0aCk7CisvLyBHZXQvU2V0IGlmIHRoZSBwcm90byBwYWNrYWdlIHNob3VsZCBiZSB1c2VkIHRvIG1ha2UgdGhlIGRlZmF1bHQgcHJlZml4IGZvcgorLy8gc3ltYm9scy4gVGhpcyB3aWxsIHRoZW4gaW1wYWN0IG1vc3Qgb2YgdGhlIHR5cGUgbmFtaW5nIGFwaXMgYmVsb3cuIEl0IGlzIGRvbmUKKy8vIGFzIGEgZ2xvYmFsIHRvIG5vdCBicmVhayBhbnkgb3RoZXIgZ2VuZXJhdG9yIHJldXNpbmcgdGhlIG1ldGhvZHMgc2luY2UgdGhleQorLy8gYXJlIGV4cG9ydGVkLgorYm9vbCBQUk9UT0NfRVhQT1JUIFVzZVByb3RvUGFja2FnZUFzRGVmYXVsdFByZWZpeCgpOwordm9pZCBQUk9UT0NfRVhQT1JUIFNldFVzZVByb3RvUGFja2FnZUFzRGVmYXVsdFByZWZpeChib29sIG9uX29yX29mZik7CisvLyBHZXQvU2V0IHRoZSBwYXRoIHRvIGEgZmlsZSB0byBsb2FkIGFzIGV4Y2VwdGlvbnMgd2hlbgorLy8gYFVzZVByb3RvUGFja2FnZUFzRGVmYXVsdFByZWZpeCgpYCBpcyBgdHJ1ZWAuIEFuIGVtcHR5IHN0cmluZyBtZWFucyB0aGVyZQorLy8gc2hvdWxkIGJlIG5vIGV4Y2VwdGlvbnMuCitzdGQ6OnN0cmluZyBQUk9UT0NfRVhQT1JUIEdldFByb3RvUGFja2FnZVByZWZpeEV4Y2VwdGlvbkxpc3QoKTsKK3ZvaWQgUFJPVE9DX0VYUE9SVCBTZXRQcm90b1BhY2thZ2VQcmVmaXhFeGNlcHRpb25MaXN0KAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX3BhdGgpOworCisvLyBHZW5lcmF0b3IgUHJlZml4IFZhbGlkYXRpb24gT3B0aW9ucyAoc2VlIG9iamVjdGl2ZWNfZ2VuZXJhdG9yLmNjIGZvciBhCisvLyBkZXNjcmlwdGlvbiBvZiBlYWNoKToKK3N0cnVjdCBPcHRpb25zIHsKKyAgT3B0aW9ucygpOworICBzdGQ6OnN0cmluZyBleHBlY3RlZF9wcmVmaXhlc19wYXRoOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXhwZWN0ZWRfcHJlZml4ZXNfc3VwcHJlc3Npb25zOworICBib29sIHByZWZpeGVzX211c3RfYmVfcmVnaXN0ZXJlZDsKKyAgYm9vbCByZXF1aXJlX3ByZWZpeGVzOworfTsKKworLy8gRXNjYXBlIEMrKyB0cmlncmFwaHMgYnkgZXNjYXBpbmcgcXVlc3Rpb24gbWFya3MgdG8gIlw/Ii4KK3N0ZDo6c3RyaW5nIFBST1RPQ19FWFBPUlQgRXNjYXBlVHJpZ3JhcGhzKGNvbnN0IHN0ZDo6c3RyaW5nJiB0b19lc2NhcGUpOworCisvLyBSZW1vdmUgd2hpdGUgc3BhY2UgZnJvbSBlaXRoZXIgZW5kIG9mIGEgU3RyaW5nUGllY2UuCit2b2lkIFBST1RPQ19FWFBPUlQgVHJpbVdoaXRlc3BhY2UoU3RyaW5nUGllY2UqIGlucHV0KTsKKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBuYW1lIHJlcXVpcmVzIGEgbnNfcmV0dXJuc19ub3RfcmV0YWluZWQgYXR0cmlidXRlIGFwcGxpZWQKKy8vIHRvIGl0LgorYm9vbCBQUk9UT0NfRVhQT1JUIElzUmV0YWluZWROYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBuYW1lIHN0YXJ0cyB3aXRoICJpbml0IiBhbmQgd2lsbCBuZWVkIHRvIGhhdmUgc3BlY2lhbAorLy8gaGFuZGxpbmcgdW5kZXIgQVJDLgorYm9vbCBQUk9UT0NfRVhQT1JUIElzSW5pdE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOworCisvLyBHZXRzIHRoZSBvYmpjX2NsYXNzX3ByZWZpeCBvciB0aGUgcHJlZml4IG1hZGUgZnJvbSB0aGUgcHJvdG8gcGFja2FnZS4KK3N0ZDo6c3RyaW5nIFBST1RPQ19FWFBPUlQgRmlsZUNsYXNzUHJlZml4KGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworLy8gR2V0cyB0aGUgcGF0aCBvZiB0aGUgZmlsZSB3ZSdyZSBnb2luZyB0byBnZW5lcmF0ZSAoc2FucyB0aGUgLnBiLmgKKy8vIGV4dGVuc2lvbikuICBUaGUgcGF0aCB3aWxsIGJlIGRlcGVuZGVudCBvbiB0aGUgb2JqZWN0aXZlYyBwYWNrYWdlCisvLyBkZWNsYXJlZCBpbiB0aGUgcHJvdG8gcGFja2FnZS4KK3N0ZDo6c3RyaW5nIFBST1RPQ19FWFBPUlQgRmlsZVBhdGgoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworCisvLyBKdXN0IGxpa2UgRmlsZVBhdGgoKSwgYnV0IHdpdGhvdXQgdGhlIGRpcmVjdG9yeSBwYXJ0Lgorc3RkOjpzdHJpbmcgUFJPVE9DX0VYUE9SVCBGaWxlUGF0aEJhc2VuYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgcm9vdCBjbGFzcyB3ZSdsbCBnZW5lcmF0ZSBpbiB0aGUgZmlsZS4gIFRoaXMgY2xhc3MKKy8vIGlzIG5vdCBtZWFudCBmb3IgZXh0ZXJuYWwgY29uc3VtcHRpb24sIGJ1dCBpbnN0ZWFkIGNvbnRhaW5zIGhlbHBlcnMgdGhhdAorLy8gdGhlIHJlc3Qgb2YgdGhlIGNsYXNzZXMgbmVlZAorc3RkOjpzdHJpbmcgUFJPVE9DX0VYUE9SVCBGaWxlQ2xhc3NOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworLy8gVGhlc2UgcmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgorLy8gZGVzY3JpcHRvci4KK3N0ZDo6c3RyaW5nIFBST1RPQ19FWFBPUlQgQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworc3RkOjpzdHJpbmcgUFJPVE9DX0VYUE9SVCBDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRfc3VmZml4X2FkZGVkKTsKK3N0ZDo6c3RyaW5nIFBST1RPQ19FWFBPUlQgRW51bU5hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisvLyBSZXR1cm5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW51bSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZQorLy8gdGhlIGRlc2NyaXB0b3IuCitzdGQ6OnN0cmluZyBQUk9UT0NfRVhQT1JUIEVudW1WYWx1ZU5hbWUoY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKKy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVudW0gdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgZGVzY3JpcHRvci4KK3N0ZDo6c3RyaW5nIFBST1RPQ19FWFBPUlQgRW51bVZhbHVlU2hvcnROYW1lKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisvLyBSZXZlcnNlIHdoYXQgYW4gZW51bSBkb2VzLgorc3RkOjpzdHJpbmcgUFJPVE9DX0VYUE9SVCBVbkNhbWVsQ2FzZUVudW1TaG9ydE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOworCisvLyBSZXR1cm5zIHRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGV4dGVuc2lvbiAodXNlZCBhcyB0aGUgbWV0aG9kIG9mZiB0aGUgZmlsZSdzCisvLyBSb290IGNsYXNzKS4KK3N0ZDo6c3RyaW5nIFBST1RPQ19FWFBPUlQgRXh0ZW5zaW9uTWV0aG9kTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisvLyBSZXR1cm5zIHRoZSB0cmFuc2Zvcm1lZCBmaWVsZCBuYW1lLgorc3RkOjpzdHJpbmcgUFJPVE9DX0VYUE9SVCBGaWVsZE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CitzdGQ6OnN0cmluZyBQUk9UT0NfRVhQT1JUIEZpZWxkTmFtZUNhcGl0YWxpemVkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisvLyBSZXR1cm5zIHRoZSB0cmFuc2Zvcm1lZCBvbmVvZiBuYW1lLgorc3RkOjpzdHJpbmcgUFJPVE9DX0VYUE9SVCBPbmVvZkVudW1OYW1lKGNvbnN0IE9uZW9mRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CitzdGQ6OnN0cmluZyBQUk9UT0NfRVhQT1JUIE9uZW9mTmFtZShjb25zdCBPbmVvZkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworc3RkOjpzdHJpbmcgUFJPVE9DX0VYUE9SVCBPbmVvZk5hbWVDYXBpdGFsaXplZChjb25zdCBPbmVvZkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisvLyBSZXR1cm5zIGEgc3ltYm9sIHRoYXQgY2FuIGJlIHVzZWQgaW4gQyBjb2RlIHRvIHJlZmVyIHRvIGFuIE9iamVjdGl2ZSBDCisvLyBjbGFzcyB3aXRob3V0IGluaXRpYWxpemluZyB0aGUgY2xhc3MuCitzdGQ6OnN0cmluZyBQUk9UT0NfRVhQT1JUIE9iakNDbGFzcyhjb25zdCBzdGQ6OnN0cmluZyYgY2xhc3NfbmFtZSk7CisKKy8vIERlY2xhcmVzIGFuIE9iamVjdGl2ZSBDIGNsYXNzIHdpdGhvdXQgaW5pdGlhbGl6aW5nIHRoZSBjbGFzcyBzbyB0aGF0IGl0IGNhbgorLy8gYmUgcmVmcmVycmVkIHRvIGJ5IE9iakNDbGFzcy4KK3N0ZDo6c3RyaW5nIFBST1RPQ19FWFBPUlQgT2JqQ0NsYXNzRGVjbGFyYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGNsYXNzX25hbWUpOworCitpbmxpbmUgYm9vbCBIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgcmV0dXJuIGZpbGUtPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zOworfQorCitpbmxpbmUgYm9vbCBJc01hcEVudHJ5TWVzc2FnZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5vcHRpb25zKCkubWFwX2VudHJ5KCk7Cit9CisKKy8vIFJldmVyc2Ugb2YgdGhlIGFib3ZlLgorc3RkOjpzdHJpbmcgUFJPVE9DX0VYUE9SVCBVbkNhbWVsQ2FzZUZpZWxkTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKK2VudW0gT2JqZWN0aXZlQ1R5cGUgeworICBPQkpFQ1RJVkVDVFlQRV9JTlQzMiwKKyAgT0JKRUNUSVZFQ1RZUEVfVUlOVDMyLAorICBPQkpFQ1RJVkVDVFlQRV9JTlQ2NCwKKyAgT0JKRUNUSVZFQ1RZUEVfVUlOVDY0LAorICBPQkpFQ1RJVkVDVFlQRV9GTE9BVCwKKyAgT0JKRUNUSVZFQ1RZUEVfRE9VQkxFLAorICBPQkpFQ1RJVkVDVFlQRV9CT09MRUFOLAorICBPQkpFQ1RJVkVDVFlQRV9TVFJJTkcsCisgIE9CSkVDVElWRUNUWVBFX0RBVEEsCisgIE9CSkVDVElWRUNUWVBFX0VOVU0sCisgIE9CSkVDVElWRUNUWVBFX01FU1NBR0UKK307CisKK2VudW0gRmxhZ1R5cGUgeworICBGTEFHVFlQRV9ERVNDUklQVE9SX0lOSVRJQUxJWkFUSU9OLAorICBGTEFHVFlQRV9FWFRFTlNJT04sCisgIEZMQUdUWVBFX0ZJRUxECit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVERlc2NyaXB0b3I+CitzdGQ6OnN0cmluZyBHZXRPcHRpb25hbERlcHJlY2F0ZWRBdHRyaWJ1dGUoY29uc3QgVERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlU3BhY2UgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9zdE5ld2xpbmUgPSBmYWxzZSkgeworICBib29sIGlzRGVwcmVjYXRlZCA9IGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCk7CisgIC8vIFRoZSBmaWxlIGlzIG9ubHkgcGFzc2VkIHdoZW4gY2hlY2tpbmcgTWVzc2FnZXMgJiBFbnVtcywgc28gdGhvc2UgdHlwZXMKKyAgLy8gZ2V0IHRhZ2dlZC4gQXQgdGhlIG1vbWVudCwgaXQgZG9lc24ndCBzZWVtIHRvIG1ha2Ugc2Vuc2UgdG8gdGFnIGV2ZXJ5CisgIC8vIGZpZWxkIG9yIGVudW0gdmFsdWUgd2l0aCB3aGVuIHRoZSBmaWxlIGlzIGRlcHJlY2F0ZWQuCisgIGJvb2wgaXNGaWxlTGV2ZWxEZXByZWNhdGlvbiA9IGZhbHNlOworICBpZiAoIWlzRGVwcmVjYXRlZCAmJiBmaWxlKSB7CisgICAgaXNGaWxlTGV2ZWxEZXByZWNhdGlvbiA9IGZpbGUtPm9wdGlvbnMoKS5kZXByZWNhdGVkKCk7CisgICAgaXNEZXByZWNhdGVkID0gaXNGaWxlTGV2ZWxEZXByZWNhdGlvbjsKKyAgfQorICBpZiAoaXNEZXByZWNhdGVkKSB7CisgICAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogc291cmNlRmlsZSA9IGRlc2NyaXB0b3ItPmZpbGUoKTsKKyAgICBpZiAoaXNGaWxlTGV2ZWxEZXByZWNhdGlvbikgeworICAgICAgbWVzc2FnZSA9IHNvdXJjZUZpbGUtPm5hbWUoKSArICIgaXMgZGVwcmVjYXRlZC4iOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlID0gZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgKyAiIGlzIGRlcHJlY2F0ZWQgKHNlZSAiICsKKyAgICAgICAgICAgICAgICBzb3VyY2VGaWxlLT5uYW1lKCkgKyAiKS4iOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHN0ZDo6c3RyaW5nKCJHUEJfREVQUkVDQVRFRF9NU0coXCIiKSArIG1lc3NhZ2UgKyAiXCIpIjsKKyAgICBpZiAocHJlU3BhY2UpIHsKKyAgICAgIHJlc3VsdC5pbnNlcnQoMCwgIiAiKTsKKyAgICB9CisgICAgaWYgKHBvc3ROZXdsaW5lKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9IGVsc2UgeworICAgIHJldHVybiAiIjsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBQUk9UT0NfRVhQT1JUIEdldENhcGl0YWxpemVkVHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworT2JqZWN0aXZlQ1R5cGUgUFJPVE9DX0VYUE9SVAorR2V0T2JqZWN0aXZlQ1R5cGUoRmllbGREZXNjcmlwdG9yOjpUeXBlIGZpZWxkX3R5cGUpOworCitpbmxpbmUgT2JqZWN0aXZlQ1R5cGUgR2V0T2JqZWN0aXZlQ1R5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICByZXR1cm4gR2V0T2JqZWN0aXZlQ1R5cGUoZmllbGQtPnR5cGUoKSk7Cit9CisKK2Jvb2wgUFJPVE9DX0VYUE9SVCBJc1ByaW1pdGl2ZVR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7Citib29sIFBST1RPQ19FWFBPUlQgSXNSZWZlcmVuY2VUeXBlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCitzdGQ6OnN0cmluZyBQUk9UT0NfRVhQT1JUCitHUEJHZW5lcmljVmFsdWVGaWVsZE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CitzdGQ6OnN0cmluZyBQUk9UT0NfRVhQT1JUIERlZmF1bHRWYWx1ZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKK2Jvb2wgUFJPVE9DX0VYUE9SVCBIYXNOb25aZXJvRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCitzdGQ6OnN0cmluZyBQUk9UT0NfRVhQT1JUCitCdWlsZEZsYWdzU3RyaW5nKGNvbnN0IEZsYWdUeXBlIHR5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc3RyaW5ncyk7CisKKy8vIEJ1aWxkcyBIZWFkZXJEb2MvYXBwbGVkb2Mgc3R5bGUgY29tbWVudHMgb3V0IG9mIHRoZSBjb21tZW50cyBpbiB0aGUgLnByb3RvCisvLyBmaWxlLgorc3RkOjpzdHJpbmcgUFJPVE9DX0VYUE9SVCBCdWlsZENvbW1lbnRzU3RyaW5nKGNvbnN0IFNvdXJjZUxvY2F0aW9uJiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZWZlcl9zaW5nbGVfbGluZSk7CisKKy8vIFRoZSBuYW1lIHRoZSBjb21tb25seSB1c2VkIGJ5IHRoZSBsaWJyYXJ5IHdoZW4gYnVpbHQgYXMgYSBmcmFtZXdvcmsuCisvLyBUaGlzIGxpbmVzIHVwIHRvIHRoZSBuYW1lIHVzZWQgaW4gdGhlIENvY29hUG9kLgorZXh0ZXJuIFBST1RPQ19FWFBPUlQgY29uc3QgY2hhciogY29uc3QgUHJvdG9idWZMaWJyYXJ5RnJhbWV3b3JrTmFtZTsKKy8vIFJldHVybnMgdGhlIENQUCBzeW1ib2wgbmFtZSB0byB1c2UgYXMgdGhlIGdhdGUgZm9yIGZyYW1ld29yayBzdHlsZSBpbXBvcnRzCisvLyBmb3IgdGhlIGdpdmVuIGZyYW1ld29yayBuYW1lIHRvIHVzZS4KK3N0ZDo6c3RyaW5nIFBST1RPQ19FWFBPUlQKK1Byb3RvYnVmRnJhbWV3b3JrSW1wb3J0U3ltYm9sKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcmFtZXdvcmtfbmFtZSk7CisKKy8vIENoZWNrcyBpZiB0aGUgZmlsZSBpcyBvbmUgb2YgdGhlIHByb3RvJ3MgYnVuZGxlZCB3aXRoIHRoZSBsaWJyYXJ5LgorYm9vbCBQUk9UT0NfRVhQT1JUCitJc1Byb3RvYnVmTGlicmFyeUJ1bmRsZWRQcm90b0ZpbGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworCisvLyBDaGVja3MgdGhlIHByZWZpeCBmb3IgdGhlIGdpdmVuIGZpbGVzIGFuZCBvdXRwdXRzIGFueSB3YXJuaW5ncyBhcyBuZWVkZWQuIElmCisvLyB0aGVyZSBhcmUgZmxhdCBvdXQgZXJyb3JzLCB0aGVuIG91dF9lcnJvciBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgZmlyc3QgZXJyb3IKKy8vIGFuZCB0aGUgcmVzdWx0IGlzIGZhbHNlLgorYm9vbCBQUk9UT0NfRVhQT1JUIFZhbGlkYXRlT2JqQ0NsYXNzUHJlZml4ZXMoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgZmlsZXMsCisgICAgY29uc3QgT3B0aW9ucyYgdmFsaWRhdGlvbl9vcHRpb25zLCBzdGQ6OnN0cmluZyogb3V0X2Vycm9yKTsKKy8vIFNhbWUgd2FzIHRoZSBvdGhlciBWYWxpZGF0ZU9iakNDbGFzc1ByZWZpeGVzKCkgY2FsbHMsIGJ1dCB0aGUgb3B0aW9ucyBhbGwKKy8vIGNvbWUgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorYm9vbCBQUk9UT0NfRVhQT1JUIFZhbGlkYXRlT2JqQ0NsYXNzUHJlZml4ZXMoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgZmlsZXMsIHN0ZDo6c3RyaW5nKiBvdXRfZXJyb3IpOworCisvLyBHZW5lcmF0ZSBkZWNvZGUgZGF0YSBuZWVkZWQgZm9yIE9iakMncyBHUEJEZWNvZGVUZXh0Rm9ybWF0TmFtZSgpIHRvIHRyYW5zZm9ybQorLy8gdGhlIGlucHV0IGludG8gdGhlIGV4cGVjdGVkIG91dHB1dC4KK2NsYXNzIFBST1RPQ19FWFBPUlQgVGV4dEZvcm1hdERlY29kZURhdGEgeworIHB1YmxpYzoKKyAgVGV4dEZvcm1hdERlY29kZURhdGEoKTsKKyAgflRleHRGb3JtYXREZWNvZGVEYXRhKCk7CisKKyAgVGV4dEZvcm1hdERlY29kZURhdGEoY29uc3QgVGV4dEZvcm1hdERlY29kZURhdGEmKSA9IGRlbGV0ZTsKKyAgVGV4dEZvcm1hdERlY29kZURhdGEmIG9wZXJhdG9yPShjb25zdCBUZXh0Rm9ybWF0RGVjb2RlRGF0YSYpID0gZGVsZXRlOworCisgIHZvaWQgQWRkU3RyaW5nKGludDMyX3Qga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXRfZm9yX2RlY29kZSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2lyZWRfb3V0cHV0KTsKKyAgc2l6ZV90IG51bV9lbnRyaWVzKCkgY29uc3QgeyByZXR1cm4gZW50cmllc18uc2l6ZSgpOyB9CisgIHN0ZDo6c3RyaW5nIERhdGEoKSBjb25zdDsKKworICBzdGF0aWMgc3RkOjpzdHJpbmcgRGVjb2RlRGF0YUZvclN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXRfZm9yX2RlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2lyZWRfb3V0cHV0KTsKKworIHByaXZhdGU6CisgIHR5cGVkZWYgc3RkOjpwYWlyPGludDMyX3QsIHN0ZDo6c3RyaW5nPiBEYXRhRW50cnk7CisgIHN0ZDo6dmVjdG9yPERhdGFFbnRyeT4gZW50cmllc187Cit9OworCisvLyBIZWxwZXIgZm9yIHBhcnNpbmcgc2ltcGxlIGZpbGVzLgorY2xhc3MgUFJPVE9DX0VYUE9SVCBMaW5lQ29uc3VtZXIgeworIHB1YmxpYzoKKyAgTGluZUNvbnN1bWVyKCk7CisgIHZpcnR1YWwgfkxpbmVDb25zdW1lcigpOworICB2aXJ0dWFsIGJvb2wgQ29uc3VtZUxpbmUoY29uc3QgU3RyaW5nUGllY2UmIGxpbmUsIHN0ZDo6c3RyaW5nKiBvdXRfZXJyb3IpID0gMDsKK307CisKK2Jvb2wgUFJPVE9DX0VYUE9SVCBQYXJzZVNpbXBsZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVDb25zdW1lciogbGluZV9jb25zdW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dF9lcnJvcik7CisKK2Jvb2wgUFJPVE9DX0VYUE9SVCBQYXJzZVNpbXBsZVN0cmVhbShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSYgaW5wdXRfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJlYW1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lQ29uc3VtZXIqIGxpbmVfY29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dF9lcnJvcik7CisKKy8vIEhlbHBlciBjbGFzcyBmb3IgcGFyc2luZyBmcmFtZXdvcmsgaW1wb3J0IG1hcHBpbmdzIGFuZCBnZW5lcmF0aW5nCisvLyBpbXBvcnQgc3RhdGVtZW50cy4KK2NsYXNzIFBST1RPQ19FWFBPUlQgSW1wb3J0V3JpdGVyIHsKKyBwdWJsaWM6CisgIEltcG9ydFdyaXRlcihjb25zdCBzdGQ6OnN0cmluZyYgZ2VuZXJhdGVfZm9yX25hbWVkX2ZyYW1ld29yaywKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lZF9mcmFtZXdvcmtfdG9fcHJvdG9fcGF0aF9tYXBwaW5nc19wYXRoLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJ1bnRpbWVfaW1wb3J0X3ByZWZpeCwKKyAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV93a3RfaW1wb3J0cyk7CisgIH5JbXBvcnRXcml0ZXIoKTsKKworICB2b2lkIEFkZEZpbGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBoZWFkZXJfZXh0ZW5zaW9uKTsKKyAgdm9pZCBQcmludChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyAgc3RhdGljIHZvaWQgUHJpbnRSdW50aW1lSW1wb3J0cyhpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGhlYWRlcl90b19pbXBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJ1bnRpbWVfaW1wb3J0X3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZmF1bHRfY3BwX3N5bWJvbCA9IGZhbHNlKTsKKworIHByaXZhdGU6CisgIGNsYXNzIFByb3RvRnJhbWV3b3JrQ29sbGVjdG9yIDogcHVibGljIExpbmVDb25zdW1lciB7CisgICBwdWJsaWM6CisgICAgUHJvdG9GcmFtZXdvcmtDb2xsZWN0b3Ioc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogaW5vdXRfcHJvdG9fZmlsZV90b19mcmFtZXdvcmtfbmFtZSkKKyAgICAgICAgOiBtYXBfKGlub3V0X3Byb3RvX2ZpbGVfdG9fZnJhbWV3b3JrX25hbWUpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgQ29uc3VtZUxpbmUoY29uc3QgU3RyaW5nUGllY2UmIGxpbmUsIHN0ZDo6c3RyaW5nKiBvdXRfZXJyb3IpIG92ZXJyaWRlOworCisgICBwcml2YXRlOgorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIG1hcF87CisgIH07CisKKyAgdm9pZCBQYXJzZUZyYW1ld29ya01hcHBpbmdzKCk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfZm9yX25hbWVkX2ZyYW1ld29ya187CisgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVkX2ZyYW1ld29ya190b19wcm90b19wYXRoX21hcHBpbmdzX3BhdGhfOworICBjb25zdCBzdGQ6OnN0cmluZyBydW50aW1lX2ltcG9ydF9wcmVmaXhfOworICBjb25zdCBib29sIGluY2x1ZGVfd2t0X2ltcG9ydHNfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHByb3RvX2ZpbGVfdG9fZnJhbWV3b3JrX25hbWVfOworICBib29sIG5lZWRfdG9fcGFyc2VfbWFwcGluZ19maWxlXzsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcHJvdG9idWZfaW1wb3J0c187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBvdGhlcl9mcmFtZXdvcmtfaW1wb3J0c187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBvdGhlcl9pbXBvcnRzXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBvYmplY3RpdmVjCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9PQkpFQ1RJVkVDX0hFTFBFUlNfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzX3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVyc191bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWU2YTkyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVyc191bml0dGVzdC5jYwpAQCAtMCwwICsxLDM4NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIG9iamVjdGl2ZWMgeworbmFtZXNwYWNlIHsKKworVEVTVChPYmpDSGVscGVyLCBUZXh0Rm9ybWF0RGVjb2RlRGF0YV9EZWNvZGVEYXRhRm9yU3RyaW5nX1Jhd1N0cmluZ3MpIHsKKyAgc3RkOjpzdHJpbmcgaW5wdXRfZm9yX2RlY29kZSgiYWJjZGVmZ2hJSiIpOworICBzdGQ6OnN0cmluZyBkZXNpcmVkX291dHB1dF9mb3JfZGVjb2RlOworICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgIC8vIERpZmZlcmVudCBkYXRhLCBjYW4ndCB0cmFuc2Zvcm0uCisKKyAgZGVzaXJlZF9vdXRwdXRfZm9yX2RlY29kZSA9ICJ6YmNkZWZnaElKIjsKKyAgZXhwZWN0ZWQgPSBzdGQ6OnN0cmluZygiXDB6YmNkZWZnaElKXDAiLCAxMik7CisgIHJlc3VsdCA9IFRleHRGb3JtYXREZWNvZGVEYXRhOjpEZWNvZGVEYXRhRm9yU3RyaW5nKGlucHV0X2Zvcl9kZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRfb3V0cHV0X2Zvcl9kZWNvZGUpOworICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHJlc3VsdCk7CisKKyAgZGVzaXJlZF9vdXRwdXRfZm9yX2RlY29kZSA9ICJhYmNkZXpnaElKIjsKKyAgZXhwZWN0ZWQgPSBzdGQ6OnN0cmluZygiXDBhYmNkZXpnaElKXDAiLCAxMik7CisgIHJlc3VsdCA9IFRleHRGb3JtYXREZWNvZGVEYXRhOjpEZWNvZGVEYXRhRm9yU3RyaW5nKGlucHV0X2Zvcl9kZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRfb3V0cHV0X2Zvcl9kZWNvZGUpOworICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHJlc3VsdCk7CisKKyAgLy8gU2hvcnRlbmVkIGRhdGEsIGNhbid0IHRyYW5zZm9ybS4KKworICBkZXNpcmVkX291dHB1dF9mb3JfZGVjb2RlID0gImFiY2RlZmdoSSI7CisgIGV4cGVjdGVkID0gc3RkOjpzdHJpbmcoIlwwYWJjZGVmZ2hJXDAiLCAxMSk7CisgIHJlc3VsdCA9IFRleHRGb3JtYXREZWNvZGVEYXRhOjpEZWNvZGVEYXRhRm9yU3RyaW5nKGlucHV0X2Zvcl9kZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRfb3V0cHV0X2Zvcl9kZWNvZGUpOworICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHJlc3VsdCk7CisKKyAgLy8gRXh0cmEgZGF0YSwgY2FuJ3QgdHJhbnNmb3JtLgorCisgIGRlc2lyZWRfb3V0cHV0X2Zvcl9kZWNvZGUgPSAiYWJjZGVmZ2hJSnoiOworICBleHBlY3RlZCA9IHN0ZDo6c3RyaW5nKCJcMGFiY2RlZmdoSUp6XDAiLCAxMyk7CisgIHJlc3VsdCA9IFRleHRGb3JtYXREZWNvZGVEYXRhOjpEZWNvZGVEYXRhRm9yU3RyaW5nKGlucHV0X2Zvcl9kZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRfb3V0cHV0X2Zvcl9kZWNvZGUpOworICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHJlc3VsdCk7Cit9CisKK1RFU1QoT2JqQ0hlbHBlciwgVGV4dEZvcm1hdERlY29kZURhdGFfRGVjb2RlRGF0YUZvclN0cmluZ19CeXRlQ29kZXMpIHsKKyAgc3RkOjpzdHJpbmcgaW5wdXRfZm9yX2RlY29kZSgiYWJjZGVmZ2hJSiIpOworICBzdGQ6OnN0cmluZyBkZXNpcmVkX291dHB1dF9mb3JfZGVjb2RlOworICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgIGRlc2lyZWRfb3V0cHV0X2Zvcl9kZWNvZGUgPSAiYWJjZGVmZ2hJSiI7CisgIGV4cGVjdGVkID0gc3RkOjpzdHJpbmcoIlx4MEFceDAiLCAyKTsKKyAgcmVzdWx0ID0gVGV4dEZvcm1hdERlY29kZURhdGE6OkRlY29kZURhdGFGb3JTdHJpbmcoaW5wdXRfZm9yX2RlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZF9vdXRwdXRfZm9yX2RlY29kZSk7CisgIEVYUEVDVF9FUShleHBlY3RlZCwgcmVzdWx0KTsKKworICBkZXNpcmVkX291dHB1dF9mb3JfZGVjb2RlID0gIl9BYmNkZWZnaElKIjsKKyAgZXhwZWN0ZWQgPSBzdGQ6OnN0cmluZygiXHhDQVx4MCIsIDIpOworICByZXN1bHQgPSBUZXh0Rm9ybWF0RGVjb2RlRGF0YTo6RGVjb2RlRGF0YUZvclN0cmluZyhpbnB1dF9mb3JfZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkX291dHB1dF9mb3JfZGVjb2RlKTsKKyAgRVhQRUNUX0VRKGV4cGVjdGVkLCByZXN1bHQpOworCisgIGRlc2lyZWRfb3V0cHV0X2Zvcl9kZWNvZGUgPSAiQUJDRF9fRWZnaElfaiI7CisgIGV4cGVjdGVkID0gc3RkOjpzdHJpbmcoIlx4NjRceDgwXHhDNVx4QTFceDAiLCA1KTsKKyAgcmVzdWx0ID0gVGV4dEZvcm1hdERlY29kZURhdGE6OkRlY29kZURhdGFGb3JTdHJpbmcoaW5wdXRfZm9yX2RlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZF9vdXRwdXRfZm9yX2RlY29kZSk7CisgIEVYUEVDVF9FUShleHBlY3RlZCwgcmVzdWx0KTsKKworICAvLyBMb25nIG5hbWUgc28gbXVsdGlwbGUgZGVjb2RlIG9wcyBhcmUgbmVlZGVkLgorCisgIGlucHV0X2Zvcl9kZWNvZGUgPQorICAgICAgImxvbmdGaWVsZE5hbWVJc0xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmcxMDAwIjsKKyAgZGVzaXJlZF9vdXRwdXRfZm9yX2RlY29kZSA9CisgICAgICAibG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTAwMCI7CisgIGV4cGVjdGVkID0gc3RkOjpzdHJpbmcoIlx4MDRceEE1XHhBNFx4QTJceEJGXHgxRlx4MEVceDg0XHgwIiwgOSk7CisgIHJlc3VsdCA9IFRleHRGb3JtYXREZWNvZGVEYXRhOjpEZWNvZGVEYXRhRm9yU3RyaW5nKGlucHV0X2Zvcl9kZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRfb3V0cHV0X2Zvcl9kZWNvZGUpOworICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHJlc3VsdCk7Cit9CisKKy8vIERlYXRoIHRlc3RzIGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgYXMgb2YgeWV0LgorI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCitURVNUKE9iakNIZWxwZXJEZWF0aFRlc3QsIFRleHRGb3JtYXREZWNvZGVEYXRhX0RlY29kZURhdGFGb3JTdHJpbmdfRmFpbHVyZXMpIHsKKyAgLy8gRW1wdHkgaW5wdXRzLgorCisgIEVYUEVDVF9FWElUKFRleHRGb3JtYXREZWNvZGVEYXRhOjpEZWNvZGVEYXRhRm9yU3RyaW5nKCIiLCAiIiksCisgICAgICAgICAgICAgIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHQUJSVCksCisgICAgICAgICAgICAgICJlcnJvcjogZ290IGVtcHR5IHN0cmluZyBmb3IgbWFraW5nIFRleHRGb3JtYXQgZGF0YSwgaW5wdXQ6Iik7CisgIEVYUEVDVF9FWElUKFRleHRGb3JtYXREZWNvZGVEYXRhOjpEZWNvZGVEYXRhRm9yU3RyaW5nKCJhIiwgIiIpLAorICAgICAgICAgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLAorICAgICAgICAgICAgICAiZXJyb3I6IGdvdCBlbXB0eSBzdHJpbmcgZm9yIG1ha2luZyBUZXh0Rm9ybWF0IGRhdGEsIGlucHV0OiIpOworICBFWFBFQ1RfRVhJVChUZXh0Rm9ybWF0RGVjb2RlRGF0YTo6RGVjb2RlRGF0YUZvclN0cmluZygiIiwgImEiKSwKKyAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdBQlJUKSwKKyAgICAgICAgICAgICAgImVycm9yOiBnb3QgZW1wdHkgc3RyaW5nIGZvciBtYWtpbmcgVGV4dEZvcm1hdCBkYXRhLCBpbnB1dDoiKTsKKworICAvLyBOdWxsIGNoYXIgaW4gdGhlIHN0cmluZy4KKworICBzdGQ6OnN0cmluZyBzdHJfd2l0aF9udWxsX2NoYXIoImFiXDBjIiwgNCk7CisgIEVYUEVDVF9FWElUKAorICAgICAgVGV4dEZvcm1hdERlY29kZURhdGE6OkRlY29kZURhdGFGb3JTdHJpbmcoc3RyX3dpdGhfbnVsbF9jaGFyLCAiZGVmIiksCisgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLAorICAgICAgImVycm9yOiBnb3QgYSBudWxsIGNoYXIgaW4gYSBzdHJpbmcgZm9yIG1ha2luZyBUZXh0Rm9ybWF0IGRhdGEsIGlucHV0OiIpOworICBFWFBFQ1RfRVhJVCgKKyAgICAgIFRleHRGb3JtYXREZWNvZGVEYXRhOjpEZWNvZGVEYXRhRm9yU3RyaW5nKCJkZWYiLCBzdHJfd2l0aF9udWxsX2NoYXIpLAorICAgICAgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdBQlJUKSwKKyAgICAgICJlcnJvcjogZ290IGEgbnVsbCBjaGFyIGluIGEgc3RyaW5nIGZvciBtYWtpbmcgVGV4dEZvcm1hdCBkYXRhLCBpbnB1dDoiKTsKK30KKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKworVEVTVChPYmpDSGVscGVyLCBUZXh0Rm9ybWF0RGVjb2RlRGF0YV9SYXdTdHJpbmdzKSB7CisgIFRleHRGb3JtYXREZWNvZGVEYXRhIGRlY29kZV9kYXRhOworCisgIC8vIERpZmZlcmVudCBkYXRhLCBjYW4ndCB0cmFuc2Zvcm0uCisgIGRlY29kZV9kYXRhLkFkZFN0cmluZygxLCAiYWJjZGVmZ2hJSiIsICJ6YmNkZWZnaElKIik7CisgIGRlY29kZV9kYXRhLkFkZFN0cmluZygzLCAiYWJjZGVmZ2hJSiIsICJhYmNkZXpnaElKIik7CisgIC8vIFNob3J0ZW5lZCBkYXRhLCBjYW4ndCB0cmFuc2Zvcm0uCisgIGRlY29kZV9kYXRhLkFkZFN0cmluZygyLCAiYWJjZGVmZ2hJSiIsICJhYmNkZWZnaEkiKTsKKyAgLy8gRXh0cmEgZGF0YSwgY2FuJ3QgdHJhbnNmb3JtLgorICBkZWNvZGVfZGF0YS5BZGRTdHJpbmcoNCwgImFiY2RlZmdoSUoiLCAiYWJjZGVmZ2hJSnoiKTsKKworICBFWFBFQ1RfRVEoNCwgZGVjb2RlX2RhdGEubnVtX2VudHJpZXMoKSk7CisKKyAgdWludDhfdCBleHBlY3RlZF9kYXRhW10gPSB7CisgICAgICAweDQsCisgICAgICAweDEsIDB4MCwgJ3onLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdJJywgJ0onLCAweDAsCisgICAgICAweDMsIDB4MCwgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICd6JywgJ2cnLCAnaCcsICdJJywgJ0onLCAweDAsCisgICAgICAweDIsIDB4MCwgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdJJywgMHgwLAorICAgICAgMHg0LCAweDAsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnSScsICdKJywgJ3onLCAweDAsCisgIH07CisgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkKChjb25zdCBjaGFyKilleHBlY3RlZF9kYXRhLCBzaXplb2YoZXhwZWN0ZWRfZGF0YSkpOworCisgIEVYUEVDVF9FUShleHBlY3RlZCwgZGVjb2RlX2RhdGEuRGF0YSgpKTsKK30KKworVEVTVChPYmpDSGVscGVyLCBUZXh0Rm9ybWF0RGVjb2RlRGF0YV9CeXRlQ29kZXMpIHsKKyAgVGV4dEZvcm1hdERlY29kZURhdGEgZGVjb2RlX2RhdGE7CisKKyAgZGVjb2RlX2RhdGEuQWRkU3RyaW5nKDEsICJhYmNkZWZnaElKIiwgImFiY2RlZmdoSUoiKTsKKyAgZGVjb2RlX2RhdGEuQWRkU3RyaW5nKDMsICJhYmNkZWZnaElKIiwgIl9BYmNkZWZnaElKIik7CisgIGRlY29kZV9kYXRhLkFkZFN0cmluZygyLCAiYWJjZGVmZ2hJSiIsICJBYmNkX0VmZ2hJSiIpOworICBkZWNvZGVfZGF0YS5BZGRTdHJpbmcoNCwgImFiY2RlZmdoSUoiLCAiQUJDRF9fRWZnaElfaiIpOworICBkZWNvZGVfZGF0YS5BZGRTdHJpbmcoMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsb25nRmllbGROYW1lSXNMb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nMTAwMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAibG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTAwMCIpOworCisgIEVYUEVDVF9FUSg1LCBkZWNvZGVfZGF0YS5udW1fZW50cmllcygpKTsKKworICB1aW50OF90IGV4cGVjdGVkX2RhdGFbXSA9IHsKKyAgICAgIDB4NSwKKyAgICAgIC8vIEFsbCBhcyBpcyAoMDAgb3ApCisgICAgICAweDEsICAweDBBLCAweDAsCisgICAgICAvLyBVbmRlcnNjb3JlLCB1cHBlciArIDkgKDEwIG9wKQorICAgICAgMHgzLCAgMHhDQSwgMHgwLAorICAgICAgLy8gIFVwcGVyICsgMyAoMTAgb3ApLCB1bmRlcnNjb3JlLCB1cHBlciArIDUgKDEwIG9wKQorICAgICAgMHgyLCAgMHg0NCwgMHhDNiwgMHgwLAorICAgICAgLy8gQWxsIFVwcGVyIGZvciA0ICgxMSBvcCksIHVuZGVyc2NvcmUsIHVuZGVyc2NvcmUsIHVwcGVyICsgNSAoMTAgb3ApLAorICAgICAgLy8gdW5kZXJzY29yZSwgbG93ZXIgKyAwICgwMSBvcCkKKyAgICAgIDB4NCwgIDB4NjQsIDB4ODAsIDB4QzUsIDB4QTEsIDB4MCwKKyAgICAgIC8vIDIgYnl0ZSBrZXk6IGFzIGlzICsgMyAoMDAgb3ApLCB1bmRlcnNjb3JlLCBsb3dlciArIDQgKDAxIG9wKSwKKyAgICAgIC8vICAgdW5kZXJzY29yZSwgbG93ZXIgKyAzICgwMSBvcCksIHVuZGVyc2NvcmUsIGxvd2VyICsgMSAoMDEgb3ApLAorICAgICAgLy8gICB1bmRlcnNjb3JlLCBsb3dlciArIDMwICgwMSBvcCksIGFzIGlzICsgMzAgKDAwIG9wKSwgYXMgaXMgKyAxMyAoMDAKKyAgICAgIC8vICAgb3ApLAorICAgICAgLy8gICB1bmRlcnNjb3JlLCBhcyBpcyArIDMgKDAwIG9wKQorICAgICAgMHhFOCwgMHgwNywgMHgwNCwgMHhBNSwgMHhBNCwgMHhBMiwgMHhCRiwgMHgxRiwgMHgwRSwgMHg4NCwgMHgwLAorICB9OworICBzdGQ6OnN0cmluZyBleHBlY3RlZCgoY29uc3QgY2hhciopZXhwZWN0ZWRfZGF0YSwgc2l6ZW9mKGV4cGVjdGVkX2RhdGEpKTsKKworICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIGRlY29kZV9kYXRhLkRhdGEoKSk7Cit9CisKKworLy8gRGVhdGggdGVzdHMgZG8gbm90IHdvcmsgb24gV2luZG93cyBhcyBvZiB5ZXQuCisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKK1RFU1QoT2JqQ0hlbHBlckRlYXRoVGVzdCwgVGV4dEZvcm1hdERlY29kZURhdGFfRmFpbHVyZXMpIHsKKyAgVGV4dEZvcm1hdERlY29kZURhdGEgZGVjb2RlX2RhdGE7CisKKyAgLy8gRW1wdHkgaW5wdXRzLgorCisgIEVYUEVDVF9FWElUKGRlY29kZV9kYXRhLkFkZFN0cmluZygxLCAiIiwgIiIpLAorICAgICAgICAgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLAorICAgICAgICAgICAgICAiZXJyb3I6IGdvdCBlbXB0eSBzdHJpbmcgZm9yIG1ha2luZyBUZXh0Rm9ybWF0IGRhdGEsIGlucHV0OiIpOworICBFWFBFQ1RfRVhJVChkZWNvZGVfZGF0YS5BZGRTdHJpbmcoMSwgImEiLCAiIiksCisgICAgICAgICAgICAgIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHQUJSVCksCisgICAgICAgICAgICAgICJlcnJvcjogZ290IGVtcHR5IHN0cmluZyBmb3IgbWFraW5nIFRleHRGb3JtYXQgZGF0YSwgaW5wdXQ6Iik7CisgIEVYUEVDVF9FWElUKGRlY29kZV9kYXRhLkFkZFN0cmluZygxLCAiIiwgImEiKSwKKyAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdBQlJUKSwKKyAgICAgICAgICAgICAgImVycm9yOiBnb3QgZW1wdHkgc3RyaW5nIGZvciBtYWtpbmcgVGV4dEZvcm1hdCBkYXRhLCBpbnB1dDoiKTsKKworICAvLyBOdWxsIGNoYXIgaW4gdGhlIHN0cmluZy4KKworICBzdGQ6OnN0cmluZyBzdHJfd2l0aF9udWxsX2NoYXIoImFiXDBjIiwgNCk7CisgIEVYUEVDVF9FWElUKAorICAgICAgZGVjb2RlX2RhdGEuQWRkU3RyaW5nKDEsIHN0cl93aXRoX251bGxfY2hhciwgImRlZiIpLAorICAgICAgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdBQlJUKSwKKyAgICAgICJlcnJvcjogZ290IGEgbnVsbCBjaGFyIGluIGEgc3RyaW5nIGZvciBtYWtpbmcgVGV4dEZvcm1hdCBkYXRhLCBpbnB1dDoiKTsKKyAgRVhQRUNUX0VYSVQoCisgICAgICBkZWNvZGVfZGF0YS5BZGRTdHJpbmcoMSwgImRlZiIsIHN0cl93aXRoX251bGxfY2hhciksCisgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLAorICAgICAgImVycm9yOiBnb3QgYSBudWxsIGNoYXIgaW4gYSBzdHJpbmcgZm9yIG1ha2luZyBUZXh0Rm9ybWF0IGRhdGEsIGlucHV0OiIpOworCisgIC8vIER1cGxpY2F0ZSBrZXlzCisKKyAgZGVjb2RlX2RhdGEuQWRkU3RyaW5nKDEsICJhYmNkZWZnaElKIiwgImFiY2RlZmdoSUoiKTsKKyAgZGVjb2RlX2RhdGEuQWRkU3RyaW5nKDMsICJhYmNkZWZnaElKIiwgIl9BYmNkZWZnaElKIik7CisgIGRlY29kZV9kYXRhLkFkZFN0cmluZygyLCAiYWJjZGVmZ2hJSiIsICJBYmNkX0VmZ2hJSiIpOworICBFWFBFQ1RfRVhJVChkZWNvZGVfZGF0YS5BZGRTdHJpbmcoMiwgInh5eiIsICJ4X3l6IiksCisgICAgICAgICAgICAgIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHQUJSVCksCisgICAgICAgICAgICAgICJlcnJvcjogZHVwbGljYXRlIGtleSBcXCgyXFwpIG1ha2luZyBUZXh0Rm9ybWF0IGRhdGEsIGlucHV0OiIpOworfQorI2VuZGlmICAvLyBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorCitjbGFzcyBUZXN0TGluZUNvbGxlY3RvciA6IHB1YmxpYyBMaW5lQ29uc3VtZXIgeworIHB1YmxpYzoKKyAgVGVzdExpbmVDb2xsZWN0b3Ioc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBpbm91dF9saW5lcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcqIHJlamVjdF9saW5lID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX21zZyA9IGZhbHNlKQorICAgIDogbGluZXNfKGlub3V0X2xpbmVzKSwgcmVqZWN0XyhyZWplY3RfbGluZSksIHNraXBfbXNnXyhza2lwX21zZykge30KKworICBib29sIENvbnN1bWVMaW5lKGNvbnN0IFN0cmluZ1BpZWNlJiBsaW5lLCBzdGQ6OnN0cmluZyogb3V0X2Vycm9yKSBvdmVycmlkZSB7CisgICAgaWYgKHJlamVjdF8gJiYgKnJlamVjdF8gPT0gbGluZSkgeworICAgICAgaWYgKCFza2lwX21zZ18pIHsKKyAgICAgICAgKm91dF9lcnJvciA9IHN0ZDo6c3RyaW5nKCJSZWplY3RlZCAnIikgKyAqcmVqZWN0XyArICInIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGxpbmVzXykgeworICAgICAgbGluZXNfLT5lbXBsYWNlX2JhY2sobGluZSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGxpbmVzXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcqIHJlamVjdF87CisgIGJvb2wgc2tpcF9tc2dfOworfTsKKworY29uc3QgaW50IGtCbG9ja1NpemVzW10gPSB7LTEsIDEsIDIsIDUsIDY0fTsKK2NvbnN0IGludCBrQmxvY2tTaXplQ291bnQgPSBHT09HTEVfQVJSQVlTSVpFKGtCbG9ja1NpemVzKTsKKworVEVTVChPYmpDSGVscGVyLCBQYXJzZVNpbXBsZV9CYXNpY3NTdWNjZXNzKSB7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Pj4gdGVzdHMgPSB7CisgICAgeyIiLCB7fX0sCisgICAgeyJhIiwgeyJhIn19LAorICAgIHsiYSBjIiwgeyJhIGMifX0sCisgICAgeyIgYSBjICIsIHsiYSBjIn19LAorICAgIHsiXHRhIGMgIiwgeyJhIGMifX0sCisgICAgeyJhYmNcbiIsIHsiYWJjIn19LAorICAgIHsiYWJjXG5kIGYiLCB7ImFiYyIsICJkIGYifX0sCisgICAgeyJcbiBhYmMgXG4gZGVmIFxuXG4iLCB7ImFiYyIsICJkZWYifX0sCisgIH07CisKKyAgZm9yIChjb25zdCBhdXRvJiB0ZXN0IDogdGVzdHMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtCbG9ja1NpemVDb3VudDsgaSsrKSB7CisgICAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dCh0ZXN0LmZpcnN0LmRhdGEoKSwgdGVzdC5maXJzdC5zaXplKCksIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGVycl9zdHI7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXM7CisgICAgICBUZXN0TGluZUNvbGxlY3RvciBjb2xsZWN0b3IoJmxpbmVzKTsKKyAgICAgIEVYUEVDVF9UUlVFKFBhcnNlU2ltcGxlU3RyZWFtKGlucHV0LCAiZHVtbXkiLCAmY29sbGVjdG9yLCAmZXJyX3N0cikpOworICAgICAgRVhQRUNUX0VRKGxpbmVzLCB0ZXN0LnNlY29uZCk7CisgICAgICBFWFBFQ1RfVFJVRShlcnJfc3RyLmVtcHR5KCkpOworICAgIH0KKyAgfQorfQorCitURVNUKE9iakNIZWxwZXIsIFBhcnNlU2ltcGxlX0Ryb3BzQ29tbWVudHMpIHsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+PiB0ZXN0cyA9IHsKKyAgICB7IiMgbm90aGluZyIsIHt9fSwKKyAgICB7IiMiLCB7fX0sCisgICAgeyIjIyIsIHt9fSwKKyAgICB7IlxuIyBub3RoaW5nXG4iLCB7fX0sCisgICAgeyJhICMgc2FtZSBsaW5lIiwgeyJhIn19LAorICAgIHsiYSAjIHNhbWUgbGluZVxuIiwgeyJhIn19LAorICAgIHsiYVxuIyBsaW5lXG5jIiwgeyJhIiwgImMifX0sCisgICAgeyIjIG4gbyB0ICMgaCBpIG4gZyAjIiwge319LAorICAgIHsiIyMgbiBvICMgdCBoIGkgbiBnICMiLCB7fX0sCisgICAgeyJhIyBuIG8gdCAjIGggaSBuIGcgIyIsIHsiYSJ9fSwKKyAgICB7ImFcbiMjIG4gbyAjIHQgaCBpIG4gZyAjIiwgeyJhIn19LAorICB9OworCisgIGZvciAoY29uc3QgYXV0byYgdGVzdCA6IHRlc3RzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXQodGVzdC5maXJzdC5kYXRhKCksIHRlc3QuZmlyc3Quc2l6ZSgpLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICBzdGQ6OnN0cmluZyBlcnJfc3RyOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzOworICAgICAgVGVzdExpbmVDb2xsZWN0b3IgY29sbGVjdG9yKCZsaW5lcyk7CisgICAgICBFWFBFQ1RfVFJVRShQYXJzZVNpbXBsZVN0cmVhbShpbnB1dCwgImR1bW15IiwgJmNvbGxlY3RvciwgJmVycl9zdHIpKTsKKyAgICAgIEVYUEVDVF9FUShsaW5lcywgdGVzdC5zZWNvbmQpOworICAgICAgRVhQRUNUX1RSVUUoZXJyX3N0ci5lbXB0eSgpKTsKKyAgICB9CisgIH0KK30KKworVEVTVChPYmpDSGVscGVyLCBQYXJzZVNpbXBsZV9SZWplY3RMaW5lcykgeworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgaW50Pj4gdGVzdHMgPSB7CisgICAgc3RkOjptYWtlX3R1cGxlKCJhXG5iXG5jIiwgImEiLCAxKSwKKyAgICBzdGQ6Om1ha2VfdHVwbGUoImFcbmJcbmMiLCAiYiIsIDIpLAorICAgIHN0ZDo6bWFrZV90dXBsZSgiYVxuYlxuYyIsICJjIiwgMyksCisgICAgc3RkOjptYWtlX3R1cGxlKCJhXG5iXG5jXG4iLCAiYyIsIDMpLAorICB9OworCisgIGZvciAoY29uc3QgYXV0byYgdGVzdCA6IHRlc3RzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXQoc3RkOjpnZXQ8MD4odGVzdCkuZGF0YSgpLCBzdGQ6OmdldDwwPih0ZXN0KS5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc1tpXSk7CisgICAgICBzdGQ6OnN0cmluZyBlcnJfc3RyOworICAgICAgVGVzdExpbmVDb2xsZWN0b3IgY29sbGVjdG9yKG51bGxwdHIsICZzdGQ6OmdldDwxPih0ZXN0KSk7CisgICAgICBFWFBFQ1RfRkFMU0UoUGFyc2VTaW1wbGVTdHJlYW0oaW5wdXQsICJkdW1teSIsICZjb2xsZWN0b3IsICZlcnJfc3RyKSk7CisgICAgICBzdGQ6OnN0cmluZyBleHBlY3RlZF9lcnIgPQorICAgICAgICBTdHJDYXQoImVycm9yOiBkdW1teSBMaW5lICIsIHN0ZDo6Z2V0PDI+KHRlc3QpLCAiLCBSZWplY3RlZCAnIiwgc3RkOjpnZXQ8MT4odGVzdCksICInIik7CisgICAgICBFWFBFQ1RfRVEoZXJyX3N0ciwgZXhwZWN0ZWRfZXJyKTsKKyAgICB9CisgIH0KK30KKworVEVTVChPYmpDSGVscGVyLCBQYXJzZVNpbXBsZV9SZWplY3RMaW5lc05vTWVzc2FnZSkgeworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgaW50Pj4gdGVzdHMgPSB7CisgICAgc3RkOjptYWtlX3R1cGxlKCJhXG5iXG5jIiwgImEiLCAxKSwKKyAgICBzdGQ6Om1ha2VfdHVwbGUoImFcbmJcbmMiLCAiYiIsIDIpLAorICAgIHN0ZDo6bWFrZV90dXBsZSgiYVxuYlxuYyIsICJjIiwgMyksCisgICAgc3RkOjptYWtlX3R1cGxlKCJhXG5iXG5jXG4iLCAiYyIsIDMpLAorICB9OworCisgIGZvciAoY29uc3QgYXV0byYgdGVzdCA6IHRlc3RzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXQoc3RkOjpnZXQ8MD4odGVzdCkuZGF0YSgpLCBzdGQ6OmdldDwwPih0ZXN0KS5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc1tpXSk7CisgICAgICBzdGQ6OnN0cmluZyBlcnJfc3RyOworICAgICAgVGVzdExpbmVDb2xsZWN0b3IgY29sbGVjdG9yKG51bGxwdHIsICZzdGQ6OmdldDwxPih0ZXN0KSwgdHJ1ZSAvKiBza2lwIG1zZyAqLyk7CisgICAgICBFWFBFQ1RfRkFMU0UoUGFyc2VTaW1wbGVTdHJlYW0oaW5wdXQsICJkdW1teSIsICZjb2xsZWN0b3IsICZlcnJfc3RyKSk7CisgICAgICBzdGQ6OnN0cmluZyBleHBlY3RlZF9lcnIgPQorICAgICAgICBTdHJDYXQoImVycm9yOiBkdW1teSBMaW5lICIsIHN0ZDo6Z2V0PDI+KHRlc3QpLAorICAgICAgICAgICAgICAgIiwgQ29uc3VtZUxpbmUgZmFpbGVkIHdpdGhvdXQgc2V0dGluZyBhbiBlcnJvci4iKTsKKyAgICAgIEVYUEVDVF9FUShlcnJfc3RyLCBleHBlY3RlZF9lcnIpOworICAgIH0KKyAgfQorfQorCisvLyBUT0RPKHRob21hc3ZsKTogU2hvdWxkIHByb2JhYmx5IGFkZCBzb21lIHVuaXR0ZXN0cyBmb3IgYWxsIHRoZSBzcGVjaWFsIGNhc2VzCisvLyBvZiBuYW1lIG1hbmdsaW5nIChjbGFzcyBuYW1lLCBmaWVsZCBuYW1lLCBlbnVtIG5hbWVzKS4gIFJhdGhlciB0aGFuIGRvaW5nCisvLyB0aGlzIHdpdGggYW4gT2JqQyB0ZXN0IGluIHRoZSBvYmplY3RpdmVjIGRpcmVjdG9yeSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8KKy8vIHVzZSBzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyKiAobGlrZSBvdGhlciB0ZXN0cykgdG8gc3VwcG9ydCBhCisvLyB2aXJ0dWFsIGZpbGUgc3lzdGVtIHRvIGZlZWQgaW4gcHJvdG9zLCBvbmNlIHdlIGhhdmUgdGhlIERlc2NyaXB0b3IgdHJlZSwgdGhlCisvLyB0ZXN0cyBjb3VsZCB1c2UgdGhlIGhlbHBlciBtZXRob2RzIGZvciBnZW5lcmF0aW5nIG5hbWVzIGFuZCB2YWxpZGF0ZSB0aGUKKy8vIHJpZ2h0IHRoaW5ncyBhcmUgaGFwcGVuaW5nLgorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBvYmplY3RpdmVjCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWFwX2ZpZWxkLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWFwX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZDc1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tYXBfZmllbGQuY2MKQEAgLTAsMCArMSwxOTYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWFwX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBvYmplY3RpdmVjIHsKKworLy8gTWFwRmllbGRHZW5lcmF0b3IgdXNlcyBSZXBlYXRlZEZpZWxkR2VuZXJhdG9yIGFzIHRoZSBwYXJlbnQgYmVjYXVzZSBpdAorLy8gcHJvdmlkZXMgYSBidW5jaCBvZiB0aGluZ3MgKG5vIGhhcyogbWV0aG9kcywgY29tbWVudHMgZm9yIGNvbnRhaW5lZCB0eXBlLAorLy8gZXRjLikuCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IGNoYXIqIE1hcEVudHJ5VHlwZU5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBib29sIGlzS2V5KSB7CisgIE9iamVjdGl2ZUNUeXBlIHR5cGUgPSBHZXRPYmplY3RpdmVDVHlwZShkZXNjcmlwdG9yKTsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9JTlQzMjoKKyAgICAgIHJldHVybiAiSW50MzIiOworICAgIGNhc2UgT0JKRUNUSVZFQ1RZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuICJVSW50MzIiOworICAgIGNhc2UgT0JKRUNUSVZFQ1RZUEVfSU5UNjQ6CisgICAgICByZXR1cm4gIkludDY0IjsKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiAiVUludDY0IjsKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuICJGbG9hdCI7CisgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIkRvdWJsZSI7CisgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9CT09MRUFOOgorICAgICAgcmV0dXJuICJCb29sIjsKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAoaXNLZXkgPyAiU3RyaW5nIiA6ICJPYmplY3QiKTsKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX0RBVEE6CisgICAgICByZXR1cm4gIk9iamVjdCI7CisgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9FTlVNOgorICAgICAgcmV0dXJuICJFbnVtIjsKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX01FU1NBR0U6CisgICAgICByZXR1cm4gIk9iamVjdCI7CisgIH0KKworICAvLyBTb21lIGNvbXBpbGVycyByZXBvcnQgcmVhY2hpbmcgZW5kIG9mIGZ1bmN0aW9uIGV2ZW4gdGhvdWdoIGFsbCBjYXNlcyBvZgorICAvLyB0aGUgZW51bSBhcmUgaGFuZGVkIGluIHRoZSBzd2l0Y2guCisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gTlVMTDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK01hcEZpZWxkR2VuZXJhdG9yOjpNYXBGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgICAgOiBSZXBlYXRlZEZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IpIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBrZXlfZGVzY3JpcHRvciA9CisgICAgICBkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKS0+bWFwX2tleSgpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHZhbHVlX2Rlc2NyaXB0b3IgPQorICAgICAgZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCktPm1hcF92YWx1ZSgpOworICB2YWx1ZV9maWVsZF9nZW5lcmF0b3JfLnJlc2V0KEZpZWxkR2VuZXJhdG9yOjpNYWtlKHZhbHVlX2Rlc2NyaXB0b3IpKTsKKworICAvLyBQdWxsIG92ZXIgc29tZSB2YXJpYWJsZXNfIGZyb20gdGhlIHZhbHVlLgorICB2YXJpYWJsZXNfWyJmaWVsZF90eXBlIl0gPSB2YWx1ZV9maWVsZF9nZW5lcmF0b3JfLT52YXJpYWJsZSgiZmllbGRfdHlwZSIpOworICB2YXJpYWJsZXNfWyJkZWZhdWx0Il0gPSB2YWx1ZV9maWVsZF9nZW5lcmF0b3JfLT52YXJpYWJsZSgiZGVmYXVsdCIpOworICB2YXJpYWJsZXNfWyJkZWZhdWx0X25hbWUiXSA9IHZhbHVlX2ZpZWxkX2dlbmVyYXRvcl8tPnZhcmlhYmxlKCJkZWZhdWx0X25hbWUiKTsKKworICAvLyBCdWlsZCBjdXN0b20gZmllbGQgZmxhZ3MuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWVsZF9mbGFnczsKKyAgZmllbGRfZmxhZ3MucHVzaF9iYWNrKCJHUEJGaWVsZE1hcEtleSIgKyBHZXRDYXBpdGFsaXplZFR5cGUoa2V5X2Rlc2NyaXB0b3IpKTsKKyAgLy8gUHVsbCBvdmVyIHRoZSBjdXJyZW50IHRleHQgZm9ybWF0IGN1c3RvbSBuYW1lIHZhbHVlcyB0aGF0IHdhcyBjYWxjdWxhdGVkLgorICBpZiAodmFyaWFibGVzX1siZmllbGRmbGFncyJdLmZpbmQoIkdQQkZpZWxkVGV4dEZvcm1hdE5hbWVDdXN0b20iKSAhPQorICAgICAgc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBmaWVsZF9mbGFncy5wdXNoX2JhY2soIkdQQkZpZWxkVGV4dEZvcm1hdE5hbWVDdXN0b20iKTsKKyAgfQorICAvLyBQdWxsIG92ZXIgc29tZSBpbmZvIGZyb20gdGhlIHZhbHVlJ3MgZmxhZ3MuCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZV9maWVsZF9mbGFncyA9CisgICAgICB2YWx1ZV9maWVsZF9nZW5lcmF0b3JfLT52YXJpYWJsZSgiZmllbGRmbGFncyIpOworICBpZiAodmFsdWVfZmllbGRfZmxhZ3MuZmluZCgiR1BCRmllbGRIYXNEZWZhdWx0VmFsdWUiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgIGZpZWxkX2ZsYWdzLnB1c2hfYmFjaygiR1BCRmllbGRIYXNEZWZhdWx0VmFsdWUiKTsKKyAgfQorICBpZiAodmFsdWVfZmllbGRfZmxhZ3MuZmluZCgiR1BCRmllbGRIYXNFbnVtRGVzY3JpcHRvciIpICE9CisgICAgICBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgIGZpZWxkX2ZsYWdzLnB1c2hfYmFjaygiR1BCRmllbGRIYXNFbnVtRGVzY3JpcHRvciIpOworICB9CisKKyAgdmFyaWFibGVzX1siZmllbGRmbGFncyJdID0gQnVpbGRGbGFnc1N0cmluZyhGTEFHVFlQRV9GSUVMRCwgZmllbGRfZmxhZ3MpOworCisgIE9iamVjdGl2ZUNUeXBlIHZhbHVlX29iamNfdHlwZSA9IEdldE9iamVjdGl2ZUNUeXBlKHZhbHVlX2Rlc2NyaXB0b3IpOworICBjb25zdCBib29sIHZhbHVlX2lzX29iamVjdF90eXBlID0KKyAgICAgICgodmFsdWVfb2JqY190eXBlID09IE9CSkVDVElWRUNUWVBFX1NUUklORykgfHwKKyAgICAgICAodmFsdWVfb2JqY190eXBlID09IE9CSkVDVElWRUNUWVBFX0RBVEEpIHx8CisgICAgICAgKHZhbHVlX29iamNfdHlwZSA9PSBPQkpFQ1RJVkVDVFlQRV9NRVNTQUdFKSk7CisgIGlmICgoR2V0T2JqZWN0aXZlQ1R5cGUoa2V5X2Rlc2NyaXB0b3IpID09IE9CSkVDVElWRUNUWVBFX1NUUklORykgJiYKKyAgICAgIHZhbHVlX2lzX29iamVjdF90eXBlKSB7CisgICAgdmFyaWFibGVzX1siYXJyYXlfc3RvcmFnZV90eXBlIl0gPSAiTlNNdXRhYmxlRGljdGlvbmFyeSI7CisgICAgdmFyaWFibGVzX1siYXJyYXlfcHJvcGVydHlfdHlwZSJdID0KKyAgICAgICAgIk5TTXV0YWJsZURpY3Rpb25hcnk8TlNTdHJpbmcqLCAiICsKKyAgICAgICAgdmFsdWVfZmllbGRfZ2VuZXJhdG9yXy0+dmFyaWFibGUoInN0b3JhZ2VfdHlwZSIpICsgIio+IjsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnN0cmluZyBjbGFzc19uYW1lKCJHUEIiKTsKKyAgICBjbGFzc19uYW1lICs9IE1hcEVudHJ5VHlwZU5hbWUoa2V5X2Rlc2NyaXB0b3IsIHRydWUpOworICAgIGNsYXNzX25hbWUgKz0gTWFwRW50cnlUeXBlTmFtZSh2YWx1ZV9kZXNjcmlwdG9yLCBmYWxzZSk7CisgICAgY2xhc3NfbmFtZSArPSAiRGljdGlvbmFyeSI7CisgICAgdmFyaWFibGVzX1siYXJyYXlfc3RvcmFnZV90eXBlIl0gPSBjbGFzc19uYW1lOworICAgIGlmICh2YWx1ZV9pc19vYmplY3RfdHlwZSkgeworICAgICAgdmFyaWFibGVzX1siYXJyYXlfcHJvcGVydHlfdHlwZSJdID0KKyAgICAgICAgICBjbGFzc19uYW1lICsgIjwiICsKKyAgICAgICAgICB2YWx1ZV9maWVsZF9nZW5lcmF0b3JfLT52YXJpYWJsZSgic3RvcmFnZV90eXBlIikgKyAiKj4iOworICAgIH0KKyAgfQorCisgIHZhcmlhYmxlc19bImRhdGFUeXBlU3BlY2lmaWNfbmFtZSJdID0KKyAgICAgIHZhbHVlX2ZpZWxkX2dlbmVyYXRvcl8tPnZhcmlhYmxlKCJkYXRhVHlwZVNwZWNpZmljX25hbWUiKTsKKyAgdmFyaWFibGVzX1siZGF0YVR5cGVTcGVjaWZpY192YWx1ZSJdID0KKyAgICAgIHZhbHVlX2ZpZWxkX2dlbmVyYXRvcl8tPnZhcmlhYmxlKCJkYXRhVHlwZVNwZWNpZmljX3ZhbHVlIik7Cit9CisKK01hcEZpZWxkR2VuZXJhdG9yOjp+TWFwRmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIE1hcEZpZWxkR2VuZXJhdG9yOjpGaW5pc2hJbml0aWFsaXphdGlvbih2b2lkKSB7CisgIFJlcGVhdGVkRmllbGRHZW5lcmF0b3I6OkZpbmlzaEluaXRpYWxpemF0aW9uKCk7CisgIC8vIFVzZSB0aGUgYXJyYXlfY29tbWVudCBzdXBwb3J0IGluIFJlcGVhdGVkRmllbGRHZW5lcmF0b3IgdG8gb3V0cHV0IHdoYXQgdGhlCisgIC8vIHZhbHVlcyBpbiB0aGUgbWFwIGFyZS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZV9kZXNjcmlwdG9yID0KKyAgICAgIGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKS0+bWFwX3ZhbHVlKCk7CisgIGlmIChHZXRPYmplY3RpdmVDVHlwZSh2YWx1ZV9kZXNjcmlwdG9yKSA9PSBPQkpFQ1RJVkVDVFlQRV9FTlVNKSB7CisgICAgdmFyaWFibGVzX1siYXJyYXlfY29tbWVudCJdID0KKyAgICAgICAgIi8vIHwiICsgdmFyaWFibGVzX1sibmFtZSJdICsgInwgdmFsdWVzIGFyZSB8IiArIHZhbHVlX2ZpZWxkX2dlbmVyYXRvcl8tPnZhcmlhYmxlKCJzdG9yYWdlX3R5cGUiKSArICJ8XG4iOworICB9Cit9CisKK3ZvaWQgTWFwRmllbGRHZW5lcmF0b3I6OkRldGVybWluZUZvcndhcmREZWNsYXJhdGlvbnMoCisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBmd2RfZGVjbHMsCisgICAgYm9vbCBpbmNsdWRlX2V4dGVybmFsX3R5cGVzKSBjb25zdCB7CisgIFJlcGVhdGVkRmllbGRHZW5lcmF0b3I6OkRldGVybWluZUZvcndhcmREZWNsYXJhdGlvbnMoCisgICAgICBmd2RfZGVjbHMsIGluY2x1ZGVfZXh0ZXJuYWxfdHlwZXMpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHZhbHVlX2Rlc2NyaXB0b3IgPQorICAgICAgZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpLT5tYXBfdmFsdWUoKTsKKyAgLy8gV2l0aGluIGEgZmlsZSB0aGVyZSBpcyBubyByZXF1aXJlbWVudCBvbiB0aGUgb3JkZXIgb2YgdGhlIG1lc3NhZ2VzLCBzbworICAvLyBsb2NhbCByZWZlcmVuY2VzIG5lZWQgYSBmb3J3YXJkIGRlY2xhcmF0aW9uLiBFeHRlcm5hbCBmaWxlcyAobm90IFdLVHMpLAorICAvLyBuZWVkIG9uZSB3aGVuIHJlcXVlc3RlZC4KKyAgaWYgKEdldE9iamVjdGl2ZUNUeXBlKHZhbHVlX2Rlc2NyaXB0b3IpID09IE9CSkVDVElWRUNUWVBFX01FU1NBR0UgJiYKKyAgICAgICgoaW5jbHVkZV9leHRlcm5hbF90eXBlcyAmJgorICAgICAgICAhSXNQcm90b2J1ZkxpYnJhcnlCdW5kbGVkUHJvdG9GaWxlKHZhbHVlX2Rlc2NyaXB0b3ItPmZpbGUoKSkpIHx8CisgICAgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSA9PSB2YWx1ZV9kZXNjcmlwdG9yLT5maWxlKCkpKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlX3N0b3JhZ2VfdHlwZSA9CisgICAgICAgIHZhbHVlX2ZpZWxkX2dlbmVyYXRvcl8tPnZhcmlhYmxlKCJzdG9yYWdlX3R5cGUiKTsKKyAgICBmd2RfZGVjbHMtPmluc2VydCgiQGNsYXNzICIgKyB2YWx1ZV9zdG9yYWdlX3R5cGUpOworICB9Cit9CisKK3ZvaWQgTWFwRmllbGRHZW5lcmF0b3I6OkRldGVybWluZU9iamVjdGl2ZUNDbGFzc0RlZmluaXRpb25zKAorICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiogZndkX2RlY2xzKSBjb25zdCB7CisgIC8vIENsYXNzIG5hbWUgaXMgYWxyZWFkeSBpbiAic3RvcmFnZV90eXBlIi4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZV9kZXNjcmlwdG9yID0KKyAgICAgIGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKS0+bWFwX3ZhbHVlKCk7CisgIGlmIChHZXRPYmplY3RpdmVDVHlwZSh2YWx1ZV9kZXNjcmlwdG9yKSA9PSBPQkpFQ1RJVkVDVFlQRV9NRVNTQUdFKSB7CisgICAgZndkX2RlY2xzLT5pbnNlcnQoT2JqQ0NsYXNzRGVjbGFyYXRpb24oCisgICAgICAgIHZhbHVlX2ZpZWxkX2dlbmVyYXRvcl8tPnZhcmlhYmxlKCJzdG9yYWdlX3R5cGUiKSkpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBvYmplY3RpdmVjCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWFwX2ZpZWxkLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tYXBfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWFhMzg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWFwX2ZpZWxkLmgKQEAgLTAsMCArMSw3MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX09CSkVDVElWRUNfTUFQX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfT0JKRUNUSVZFQ19NQVBfRklFTERfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBvYmplY3RpdmVjIHsKKworY2xhc3MgTWFwRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgUmVwZWF0ZWRGaWVsZEdlbmVyYXRvciB7CisgIGZyaWVuZCBGaWVsZEdlbmVyYXRvciogRmllbGRHZW5lcmF0b3I6Ok1ha2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBGaW5pc2hJbml0aWFsaXphdGlvbih2b2lkKSBvdmVycmlkZTsKKworICBNYXBGaWVsZEdlbmVyYXRvcihjb25zdCBNYXBGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworICBNYXBGaWVsZEdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IE1hcEZpZWxkR2VuZXJhdG9yJikgPSBkZWxldGU7CisKKyBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IE1hcEZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIHZpcnR1YWwgfk1hcEZpZWxkR2VuZXJhdG9yKCk7CisKKyAgdmlydHVhbCB2b2lkIERldGVybWluZU9iamVjdGl2ZUNDbGFzc0RlZmluaXRpb25zKAorICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBmd2RfZGVjbHMpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgRGV0ZXJtaW5lRm9yd2FyZERlY2xhcmF0aW9ucygKKyAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiogZndkX2RlY2xzLAorICAgICAgYm9vbCBpbmNsdWRlX2V4dGVybmFsX3R5cGVzKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxGaWVsZEdlbmVyYXRvcj4gdmFsdWVfZmllbGRfZ2VuZXJhdG9yXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBvYmplY3RpdmVjCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9PQkpFQ1RJVkVDX01BUF9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2UuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYmI3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlLmNjCkBAIC0wLDAgKzEsNjMzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19leHRlbnNpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIG9iamVjdGl2ZWMgeworCituYW1lc3BhY2Ugeworc3RydWN0IEZpZWxkT3JkZXJpbmdCeU51bWJlciB7CisgIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYikgY29uc3QgeworICAgIHJldHVybiBhLT5udW1iZXIoKSA8IGItPm51bWJlcigpOworICB9Cit9OworCitpbnQgT3JkZXJHcm91cEZvckZpZWxkRGVzY3JpcHRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgLy8gVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIG9iamVjdCBzdHJ1Y3R1cmUgaXMgb3VyIHVpbnQzMltdIGZvciBoYXMgYml0cy4KKyAgLy8gV2UgdGhlbiB3YW50IHRvIG9yZGVyIHRoaW5ncyB0byBtYWtlIHRoZSBpbnN0YW5jZXMgYXMgc21hbGwgYXMKKyAgLy8gcG9zc2libGUuIFNvIHdlIGZvbGxvdyB0aGUgaGFzIGJpdHMgd2l0aDoKKyAgLy8gICAxLiBBbnl0aGluZyBhbHdheXMgNCBieXRlcyAtIGZsb2F0LCAqMzIsIGVudW1zCisgIC8vICAgMi4gQW55dGhpbmcgdGhhdCBpcyBhbHdheXMgYSBwb2ludGVyICh0aGV5IHdpbGwgYmUgOCBieXRlcyBvbiA2NCBiaXQKKyAgLy8gICAgICBidWlsZHMgYW5kIDQgYnl0ZXMgb24gMzJiaXQgYnVpbGRzLgorICAvLyAgIDMuIEFueXRoaW5nIGFsd2F5cyA4IGJ5dGVzIC0gZG91YmxlLCAqNjQKKyAgLy8KKyAgLy8gTk9URTogQm9vbHMgYXJlbid0IGxpc3RlZCwgdGhleSB3ZXJlIHN0b3JlZCBpbiB0aGUgaGFzIGJpdHMuCisgIC8vCisgIC8vIFdoeT8gVXNpbmcgNjRiaXQgYnVpbGRzIGFzIGFuIGV4YW1wbGUsIHRoaXMgbWVhbnMgd29yc2UgY2FzZSwgd2UgaGF2ZQorICAvLyBlbm91Z2ggYm9vbHMgdGhhdCB3ZSBvdmVyZmxvdyAxIGJ5dGUgZnJvbSA0IGJ5dGUgYWxpZ25tZW50LCBzbyAzIGJ5dGVzCisgIC8vIGFyZSB3YXN0ZWQgYmVmb3JlIHRoZSA0IGJ5dGUgdmFsdWVzLiBUaGVuIGlmIHdlIGhhdmUgYW4gb2RkIG51bWJlciBvZgorICAvLyB0aG9zZSA0IGJ5dGUgdmFsdWVzLCB0aGUgOCBieXRlIHZhbHVlcyB3aWxsIGJlIHB1c2hlZCBkb3duIGJ5IDMyYml0cyB0bworICAvLyBrZWVwIHRoZW0gYWxpZ25lZC4gQnV0IHRoZSBzdHJ1Y3R1cmUgd2lsbCBlbmQgOCBieXRlIGFsaWduZWQsIHNvIG5vCisgIC8vIHdhc3RlIG9uIHRoZSBlbmQuIElmIHlvdSBkaWQgdGhlIHJldmVyc2Ugb3JkZXIsIHlvdSBjb3VsZCB3YXN0ZSA0IGJ5dGVzCisgIC8vIGJlZm9yZSB0aGUgZmlyc3QgOCBieXRlIHZhbHVlIChhZnRlciB0aGUgaGFzIGFycmF5KSwgdGhlbiBhIHNpbmdsZQorICAvLyBib29sIG9uIHRoZSBlbmQgd291bGQgbmVlZCA3IGJ5dGVzIG9mIHBhZGRpbmcgdG8gbWFrZSB0aGUgb3ZlcmFsbAorICAvLyBzdHJ1Y3R1cmUgOCBieXRlIGFsaWduZWQ7IHNvIDExIGJ5dGVzLCB3YXN0ZWQgdG90YWwuCisKKyAgLy8gQW55dGhpbmcgcmVwZWF0ZWQgaXMgYSBHUEIqQXJyYXkvTlNBcnJheSwgc28gcG9pbnRlci4KKyAgaWYgKGRlc2NyaXB0b3ItPmlzX3JlcGVhdGVkKCkpIHsKKyAgICByZXR1cm4gMzsKKyAgfQorCisgIHN3aXRjaCAoZGVzY3JpcHRvci0+dHlwZSgpKSB7CisgICAgLy8gQWxsIGFsd2F5cyA4IGJ5dGVzLgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRToKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQ6CisgICAgICByZXR1cm4gNDsKKworICAgIC8vIFBvaW50ZXJzIChzdHJpbmcgYW5kIGJ5dGVzIGFyZSBOU1N0cmluZyBhbmQgTlNEYXRhKTsgOCBvciA0IGJ5dGVzCisgICAgLy8gZGVwZW5kaW5nIG9uIHRoZSBidWlsZCBhcmNoaXRlY3R1cmUuCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVA6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6CisgICAgICByZXR1cm4gMzsKKworICAgIC8vIEFsbCBhbHdheXMgNCBieXRlcyAoZW51bXMgYXJlIGludDMycykuCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU06CisgICAgICByZXR1cm4gMjsKKworICAgIC8vIDAgYnl0ZXMuIFN0b3JlZCBpbiB0aGUgaGFzIGJpdHMuCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiA5OTsgIC8vIEVuZCBvZiB0aGUgbGlzdCAoZG9lc24ndCByZWFsbHkgbWF0dGVyKS4KKyAgfQorCisgIC8vIFNvbWUgY29tcGlsZXJzIHJlcG9ydCByZWFjaGluZyBlbmQgb2YgZnVuY3Rpb24gZXZlbiB0aG91Z2ggYWxsIGNhc2VzIG9mCisgIC8vIHRoZSBlbnVtIGFyZSBoYW5kZWQgaW4gdGhlIHN3aXRjaC4KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiAwOworfQorCitzdHJ1Y3QgRmllbGRPcmRlcmluZ0J5U3RvcmFnZVNpemUgeworICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGIpIGNvbnN0IHsKKyAgICAvLyBPcmRlciBieSBncm91cGluZy4KKyAgICBjb25zdCBpbnQgb3JkZXJfZ3JvdXBfYSA9IE9yZGVyR3JvdXBGb3JGaWVsZERlc2NyaXB0b3IoYSk7CisgICAgY29uc3QgaW50IG9yZGVyX2dyb3VwX2IgPSBPcmRlckdyb3VwRm9yRmllbGREZXNjcmlwdG9yKGIpOworICAgIGlmIChvcmRlcl9ncm91cF9hICE9IG9yZGVyX2dyb3VwX2IpIHsKKyAgICAgIHJldHVybiBvcmRlcl9ncm91cF9hIDwgb3JkZXJfZ3JvdXBfYjsKKyAgICB9CisgICAgLy8gV2l0aGluIHRoZSBncm91cCwgb3JkZXIgYnkgZmllbGQgbnVtYmVyIChwcm92aWRlcyBzdGFibGUgb3JkZXJpbmcpLgorICAgIHJldHVybiBhLT5udW1iZXIoKSA8IGItPm51bWJlcigpOworICB9Cit9OworCitzdHJ1Y3QgRXh0ZW5zaW9uUmFuZ2VPcmRlcmluZyB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogYSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiBiKSBjb25zdCB7CisgICAgcmV0dXJuIGEtPnN0YXJ0IDwgYi0+c3RhcnQ7CisgIH0KK307CisKKy8vIFNvcnQgdGhlIGZpZWxkcyBvZiB0aGUgZ2l2ZW4gRGVzY3JpcHRvciBieSBudW1iZXIgaW50byBhIG5ld1tdJ2QgYXJyYXkKKy8vIGFuZCByZXR1cm4gaXQuCitjb25zdCBGaWVsZERlc2NyaXB0b3IqKiBTb3J0RmllbGRzQnlOdW1iZXIoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqKiBmaWVsZHMgPQorICAgICAgbmV3IGNvbnN0IEZpZWxkRGVzY3JpcHRvciogW2Rlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCldOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkc1tpXSA9IGRlc2NyaXB0b3ItPmZpZWxkKGkpOworICB9CisgIHN0ZDo6c29ydChmaWVsZHMsIGZpZWxkcyArIGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCksIEZpZWxkT3JkZXJpbmdCeU51bWJlcigpKTsKKyAgcmV0dXJuIGZpZWxkczsKK30KKworLy8gU29ydCB0aGUgZmllbGRzIG9mIHRoZSBnaXZlbiBEZXNjcmlwdG9yIGJ5IHN0b3JhZ2Ugc2l6ZSBpbnRvIGEgbmV3W10nZAorLy8gYXJyYXkgYW5kIHJldHVybiBpdC4KK2NvbnN0IEZpZWxkRGVzY3JpcHRvcioqIFNvcnRGaWVsZHNCeVN0b3JhZ2VTaXplKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiogZmllbGRzID0KKyAgICAgIG5ldyBjb25zdCBGaWVsZERlc2NyaXB0b3IqIFtkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpXTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZHNbaV0gPSBkZXNjcmlwdG9yLT5maWVsZChpKTsKKyAgfQorICBzdGQ6OnNvcnQoZmllbGRzLCBmaWVsZHMgKyBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpLAorICAgICAgIEZpZWxkT3JkZXJpbmdCeVN0b3JhZ2VTaXplKCkpOworICByZXR1cm4gZmllbGRzOworfQorfSAgLy8gbmFtZXNwYWNlCisKK01lc3NhZ2VHZW5lcmF0b3I6Ok1lc3NhZ2VHZW5lcmF0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIHJvb3RfY2xhc3NuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICAgIDogcm9vdF9jbGFzc25hbWVfKHJvb3RfY2xhc3NuYW1lKSwKKyAgICAgIGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgICAgZmllbGRfZ2VuZXJhdG9yc18oZGVzY3JpcHRvciksCisgICAgICBjbGFzc19uYW1lXyhDbGFzc05hbWUoZGVzY3JpcHRvcl8pKSwKKyAgICAgIGRlcHJlY2F0ZWRfYXR0cmlidXRlXyhHZXRPcHRpb25hbERlcHJlY2F0ZWRBdHRyaWJ1dGUoCisgICAgICAgICAgZGVzY3JpcHRvciwgZGVzY3JpcHRvci0+ZmlsZSgpLCBmYWxzZSwgdHJ1ZSkpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzXy5lbXBsYWNlX2JhY2soCisgICAgICAgIG5ldyBFeHRlbnNpb25HZW5lcmF0b3IoY2xhc3NfbmFtZV8sIGRlc2NyaXB0b3JfLT5leHRlbnNpb24oaSkpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnJlYWxfb25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKKyAgICBPbmVvZkdlbmVyYXRvciogZ2VuZXJhdG9yID0gbmV3IE9uZW9mR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpKTsKKyAgICBvbmVvZl9nZW5lcmF0b3JzXy5lbXBsYWNlX2JhY2soZ2VuZXJhdG9yKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBFbnVtR2VuZXJhdG9yKiBnZW5lcmF0b3IgPSBuZXcgRW51bUdlbmVyYXRvcihkZXNjcmlwdG9yXy0+ZW51bV90eXBlKGkpKTsKKyAgICBlbnVtX2dlbmVyYXRvcnNfLmVtcGxhY2VfYmFjayhnZW5lcmF0b3IpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgTWVzc2FnZUdlbmVyYXRvciogZ2VuZXJhdG9yID0KKyAgICAgICAgbmV3IE1lc3NhZ2VHZW5lcmF0b3Iocm9vdF9jbGFzc25hbWVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSkpOworICAgIG5lc3RlZF9tZXNzYWdlX2dlbmVyYXRvcnNfLmVtcGxhY2VfYmFjayhnZW5lcmF0b3IpOworICB9Cit9CisKK01lc3NhZ2VHZW5lcmF0b3I6On5NZXNzYWdlR2VuZXJhdG9yKCkge30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlc0luaXRpYWxpemF0aW9uKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGZvciAoY29uc3QgYXV0byYgZ2VuZXJhdG9yIDogZXh0ZW5zaW9uX2dlbmVyYXRvcnNfKSB7CisgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlc0luaXRpYWxpemF0aW9uKHByaW50ZXIpOworICB9CisKKyAgZm9yIChjb25zdCBhdXRvJiBnZW5lcmF0b3IgOiBuZXN0ZWRfbWVzc2FnZV9nZW5lcmF0b3JzXykgeworICAgIGdlbmVyYXRvci0+R2VuZXJhdGVTdGF0aWNWYXJpYWJsZXNJbml0aWFsaXphdGlvbihwcmludGVyKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkRldGVybWluZUZvcndhcmREZWNsYXJhdGlvbnMoCisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBmd2RfZGVjbHMsCisgICAgYm9vbCBpbmNsdWRlX2V4dGVybmFsX3R5cGVzKSB7CisgIGlmICghSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkRGVzY3JpcHRvciA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZERlc2NyaXB0b3IpCisgICAgICAgICAgLkRldGVybWluZUZvcndhcmREZWNsYXJhdGlvbnMoZndkX2RlY2xzLCBpbmNsdWRlX2V4dGVybmFsX3R5cGVzKTsKKyAgICB9CisgIH0KKworICBmb3IgKGNvbnN0IGF1dG8mIGdlbmVyYXRvciA6IG5lc3RlZF9tZXNzYWdlX2dlbmVyYXRvcnNfKSB7CisgICAgZ2VuZXJhdG9yLT5EZXRlcm1pbmVGb3J3YXJkRGVjbGFyYXRpb25zKGZ3ZF9kZWNscywgaW5jbHVkZV9leHRlcm5hbF90eXBlcyk7CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpEZXRlcm1pbmVPYmplY3RpdmVDQ2xhc3NEZWZpbml0aW9ucygKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGZ3ZF9kZWNscykgeworICBpZiAoIUlzTWFwRW50cnlNZXNzYWdlKGRlc2NyaXB0b3JfKSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGREZXNjcmlwdG9yKQorICAgICAgICAgIC5EZXRlcm1pbmVPYmplY3RpdmVDQ2xhc3NEZWZpbml0aW9ucyhmd2RfZGVjbHMpOworICAgIH0KKyAgfQorCisgIGZvciAoY29uc3QgYXV0byYgZ2VuZXJhdG9yIDogZXh0ZW5zaW9uX2dlbmVyYXRvcnNfKSB7CisgICAgZ2VuZXJhdG9yLT5EZXRlcm1pbmVPYmplY3RpdmVDQ2xhc3NEZWZpbml0aW9ucyhmd2RfZGVjbHMpOworICB9CisKKyAgZm9yIChjb25zdCBhdXRvJiBnZW5lcmF0b3IgOiBuZXN0ZWRfbWVzc2FnZV9nZW5lcmF0b3JzXykgeworICAgIGdlbmVyYXRvci0+RGV0ZXJtaW5lT2JqZWN0aXZlQ0NsYXNzRGVmaW5pdGlvbnMoZndkX2RlY2xzKTsKKyAgfQorCisgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKTsKKyAgaWYgKGNvbnRhaW5pbmdfZGVzY3JpcHRvciAhPSBOVUxMKSB7CisgICAgc3RkOjpzdHJpbmcgY29udGFpbmluZ19jbGFzcyA9IENsYXNzTmFtZShjb250YWluaW5nX2Rlc2NyaXB0b3IpOworICAgIGZ3ZF9kZWNscy0+aW5zZXJ0KE9iakNDbGFzc0RlY2xhcmF0aW9uKGNvbnRhaW5pbmdfY2xhc3MpKTsKKyAgfQorfQorCitib29sIE1lc3NhZ2VHZW5lcmF0b3I6OkluY2x1ZGVzT25lT2ZEZWZpbml0aW9uKCkgY29uc3QgeworICBpZiAoIW9uZW9mX2dlbmVyYXRvcnNfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGZvciAoY29uc3QgYXV0byYgZ2VuZXJhdG9yIDogbmVzdGVkX21lc3NhZ2VfZ2VuZXJhdG9yc18pIHsKKyAgICBpZiAoZ2VuZXJhdG9yLT5JbmNsdWRlc09uZU9mRGVmaW5pdGlvbigpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVFbnVtSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGZvciAoY29uc3QgYXV0byYgZ2VuZXJhdG9yIDogZW51bV9nZW5lcmF0b3JzXykgeworICAgIGdlbmVyYXRvci0+R2VuZXJhdGVIZWFkZXIocHJpbnRlcik7CisgIH0KKworICBmb3IgKGNvbnN0IGF1dG8mIGdlbmVyYXRvciA6IG5lc3RlZF9tZXNzYWdlX2dlbmVyYXRvcnNfKSB7CisgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZUVudW1IZWFkZXIocHJpbnRlcik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvblNvdXJjZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGNvbnN0IGF1dG8mIGdlbmVyYXRvciA6IGV4dGVuc2lvbl9nZW5lcmF0b3JzXykgeworICAgIGdlbmVyYXRvci0+R2VuZXJhdGVSZWdpc3RyYXRpb25Tb3VyY2UocHJpbnRlcik7CisgIH0KKworICBmb3IgKGNvbnN0IGF1dG8mIGdlbmVyYXRvciA6IG5lc3RlZF9tZXNzYWdlX2dlbmVyYXRvcnNfKSB7CisgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvblNvdXJjZShwcmludGVyKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlTWVzc2FnZUhlYWRlcihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBUaGlzIGEgYSBtYXAgZW50cnkgbWVzc2FnZSwganVzdCByZWN1cnNlIGFuZCBkbyBub3RoaW5nIGRpcmVjdGx5LgorICBpZiAoSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBnZW5lcmF0b3IgOiBuZXN0ZWRfbWVzc2FnZV9nZW5lcmF0b3JzXykgeworICAgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZU1lc3NhZ2VIZWFkZXIocHJpbnRlcik7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICAgIiNwcmFnbWEgbWFyayAtICRjbGFzc25hbWUkXG4iCisgICAgICAiXG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzX25hbWVfKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgRmllbGREZXNjcmlwdG9yKltdPiBzb3J0ZWRfZmllbGRzKAorICAgICAgICBTb3J0RmllbGRzQnlOdW1iZXIoZGVzY3JpcHRvcl8pKTsKKworICAgIHByaW50ZXItPlByaW50KCJ0eXBlZGVmIEdQQl9FTlVNKCRjbGFzc25hbWUkX0ZpZWxkTnVtYmVyKSB7XG4iLAorICAgICAgICAgICAgICAgICAgICJjbGFzc25hbWUiLCBjbGFzc19uYW1lXyk7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChzb3J0ZWRfZmllbGRzW2ldKQorICAgICAgICAgIC5HZW5lcmF0ZUZpZWxkTnVtYmVyQ29uc3RhbnQocHJpbnRlcik7CisgICAgfQorCisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9O1xuXG4iKTsKKyAgfQorCisgIGZvciAoY29uc3QgYXV0byYgZ2VuZXJhdG9yIDogb25lb2ZfZ2VuZXJhdG9yc18pIHsKKyAgICBnZW5lcmF0b3ItPkdlbmVyYXRlQ2FzZUVudW0ocHJpbnRlcik7CisgIH0KKworICBzdGQ6OnN0cmluZyBtZXNzYWdlX2NvbW1lbnRzOworICBTb3VyY2VMb2NhdGlvbiBsb2NhdGlvbjsKKyAgaWYgKGRlc2NyaXB0b3JfLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jYXRpb24pKSB7CisgICAgbWVzc2FnZV9jb21tZW50cyA9IEJ1aWxkQ29tbWVudHNTdHJpbmcobG9jYXRpb24sIGZhbHNlKTsKKyAgfSBlbHNlIHsKKyAgICBtZXNzYWdlX2NvbW1lbnRzID0gIiI7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAgICIkY29tbWVudHMkJGRlcHJlY2F0ZWRfYXR0cmlidXRlJEdQQl9GSU5BTCBAaW50ZXJmYWNlICRjbGFzc25hbWUkIDogR1BCTWVzc2FnZVxuXG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzX25hbWVfLAorICAgICAgImRlcHJlY2F0ZWRfYXR0cmlidXRlIiwgZGVwcmVjYXRlZF9hdHRyaWJ1dGVfLAorICAgICAgImNvbW1lbnRzIiwgbWVzc2FnZV9jb21tZW50cyk7CisKKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gc2Vlbl9vbmVvZnMob25lb2ZfZ2VuZXJhdG9yc18uc2l6ZSgpLCAwKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gZmllbGQtPnJlYWxfY29udGFpbmluZ19vbmVvZigpOworICAgIGlmIChvbmVvZikgeworICAgICAgY29uc3QgaW50IG9uZW9mX2luZGV4ID0gb25lb2YtPmluZGV4KCk7CisgICAgICBpZiAoIXNlZW5fb25lb2ZzW29uZW9mX2luZGV4XSkgeworICAgICAgICBzZWVuX29uZW9mc1tvbmVvZl9pbmRleF0gPSAxOworICAgICAgICBvbmVvZl9nZW5lcmF0b3JzX1tvbmVvZl9pbmRleF0tPkdlbmVyYXRlUHVibGljQ2FzZVByb3BlcnR5RGVjbGFyYXRpb24oCisgICAgICAgICAgICBwcmludGVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZVByb3BlcnR5RGVjbGFyYXRpb24ocHJpbnRlcik7CisgIH0KKworICBwcmludGVyLT5QcmludCgiQGVuZFxuXG4iKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQorICAgICAgICAuR2VuZXJhdGVDRnVuY3Rpb25EZWNsYXJhdGlvbnMocHJpbnRlcik7CisgIH0KKworICBpZiAoIW9uZW9mX2dlbmVyYXRvcnNfLmVtcHR5KCkpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGdlbmVyYXRvciA6IG9uZW9mX2dlbmVyYXRvcnNfKSB7CisgICAgICBnZW5lcmF0b3ItPkdlbmVyYXRlQ2xlYXJGdW5jdGlvbkRlY2xhcmF0aW9uKHByaW50ZXIpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIkBpbnRlcmZhY2UgJGNsYXNzbmFtZSQgKER5bmFtaWNNZXRob2RzKVxuXG4iLAorICAgICAgICAgICAgICAgICAgICJjbGFzc25hbWUiLCBjbGFzc19uYW1lXyk7CisgICAgZm9yIChjb25zdCBhdXRvJiBnZW5lcmF0b3IgOiBleHRlbnNpb25fZ2VuZXJhdG9yc18pIHsKKyAgICAgIGdlbmVyYXRvci0+R2VuZXJhdGVNZW1iZXJzSGVhZGVyKHByaW50ZXIpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgiQGVuZFxuXG4iKTsKKyAgfQorCisgIGZvciAoY29uc3QgYXV0byYgZ2VuZXJhdG9yIDogbmVzdGVkX21lc3NhZ2VfZ2VuZXJhdG9yc18pIHsKKyAgICBnZW5lcmF0b3ItPkdlbmVyYXRlTWVzc2FnZUhlYWRlcihwcmludGVyKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlU291cmNlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmICghSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIjcHJhZ21hIG1hcmsgLSAkY2xhc3NuYW1lJFxuIgorICAgICAgICAiXG4iLAorICAgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NfbmFtZV8pOworCisgICAgaWYgKCFkZXByZWNhdGVkX2F0dHJpYnV0ZV8uZW1wdHkoKSkgeworICAgICAgLy8gTm8gd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgdGhlIGltcGwgb2YgdGhpcyBkZXByZWNhdGVkIGNsYXNzLgorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoXG4iCisgICAgICAgICAgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdkZXByZWNhdGVkLWltcGxlbWVudGF0aW9uc1wiXG4iCisgICAgICAgICAgIlxuIik7CisgICAgfQorCisgICAgcHJpbnRlci0+UHJpbnQoIkBpbXBsZW1lbnRhdGlvbiAkY2xhc3NuYW1lJFxuXG4iLAorICAgICAgICAgICAgICAgICAgICJjbGFzc25hbWUiLCBjbGFzc19uYW1lXyk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGdlbmVyYXRvciA6IG9uZW9mX2dlbmVyYXRvcnNfKSB7CisgICAgICBnZW5lcmF0b3ItPkdlbmVyYXRlUHJvcGVydHlJbXBsZW1lbnRhdGlvbihwcmludGVyKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgICAgLkdlbmVyYXRlUHJvcGVydHlJbXBsZW1lbnRhdGlvbihwcmludGVyKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgRmllbGREZXNjcmlwdG9yKltdPiBzb3J0ZWRfZmllbGRzKAorICAgICAgICBTb3J0RmllbGRzQnlOdW1iZXIoZGVzY3JpcHRvcl8pKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgRmllbGREZXNjcmlwdG9yKltdPiBzaXplX29yZGVyX2ZpZWxkcygKKyAgICAgICAgU29ydEZpZWxkc0J5U3RvcmFnZVNpemUoZGVzY3JpcHRvcl8pKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKj4gc29ydGVkX2V4dGVuc2lvbnM7CisgICAgc29ydGVkX2V4dGVuc2lvbnMucmVzZXJ2ZShkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyArK2kpIHsKKyAgICAgIHNvcnRlZF9leHRlbnNpb25zLnB1c2hfYmFjayhkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlKGkpKTsKKyAgICB9CisKKyAgICBzdGQ6OnNvcnQoc29ydGVkX2V4dGVuc2lvbnMuYmVnaW4oKSwgc29ydGVkX2V4dGVuc2lvbnMuZW5kKCksCisgICAgICAgICBFeHRlbnNpb25SYW5nZU9yZGVyaW5nKCkpOworCisgICAgLy8gQXNzaWduIGhhcyBiaXRzOgorICAgIC8vIDEuIEZpZWxkR2VuZXJhdG9yTWFwOjpDYWxjdWxhdGVIYXNCaXRzKCkgbG9vcHMgdGhyb3VnaCB0aGUgZmllbGRzIHNlZWluZworICAgIC8vICAgIHdobyBuZWVkcyBoYXMgYml0cyBhbmQgYXNzaWduaW5nIHRoZW0uCisgICAgLy8gMi4gRmllbGRHZW5lcmF0b3I6OlNldE9uZW9mSW5kZXhCYXNlKCkgb3ZlcnJpZGVzIGhhc19iaXQgd2l0aCBhIG5lZ2F0aXZlCisgICAgLy8gICAgaW5kZXggdGhhdCBncm91cHMgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgb25lb2YuCisgICAgc2l6ZV90IG51bV9oYXNfYml0cyA9IGZpZWxkX2dlbmVyYXRvcnNfLkNhbGN1bGF0ZUhhc0JpdHMoKTsKKyAgICBzaXplX3Qgc2l6ZW9mX2hhc19zdG9yYWdlID0gKG51bV9oYXNfYml0cyArIDMxKSAvIDMyOworICAgIGlmIChzaXplb2ZfaGFzX3N0b3JhZ2UgPT0gMCkgeworICAgICAgLy8gSW4gdGhlIGNhc2Ugd2hlcmUgbm8gZmllbGQgbmVlZHMgaGFzIGJpdHMsIGRvbid0IGxldCB0aGUgX2hhc19zdG9yYWdlXworICAgICAgLy8gZW5kIHVwIGFzIHplcm8gbGVuZ3RoICh6ZXJvIGxlbmd0aCBhcnJheXMgYXJlIHNvcnQgb2YgYSBncmV5IGFyZWEKKyAgICAgIC8vIHNpbmNlIGl0IGhhcyB0byBiZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cnVjdCkuIFRoaXMgYWxzbyBlbnN1cmVzIGEKKyAgICAgIC8vIGZpZWxkIHdpdGggb25seSBvbmVvZnMga2VlcHMgdGhlIHJlcXVpcmVkIG5lZ2F0aXZlIGluZGljZXMgdGhleSBuZWVkLgorICAgICAgc2l6ZW9mX2hhc19zdG9yYWdlID0gMTsKKyAgICB9CisgICAgLy8gVGVsbCBhbGwgdGhlIGZpZWxkcyB0aGUgb25lb2YgYmFzZS4KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGdlbmVyYXRvciA6IG9uZW9mX2dlbmVyYXRvcnNfKSB7CisgICAgICBnZW5lcmF0b3ItPlNldE9uZW9mSW5kZXhCYXNlKHNpemVvZl9oYXNfc3RvcmFnZSk7CisgICAgfQorICAgIGZpZWxkX2dlbmVyYXRvcnNfLlNldE9uZW9mSW5kZXhCYXNlKHNpemVvZl9oYXNfc3RvcmFnZSk7CisgICAgLy8gc2l6ZW9mX2hhc19zdG9yYWdlIG5lZWRzIGVub3VnaCBiaXRzIGZvciB0aGUgc2luZ2xlIGZpZWxkcyB0aGF0IGFyZW4ndCBpbgorICAgIC8vIGFueSBvbmVvZiwgYW5kIHRoZW4gb25lIGludDMyIGZvciBlYWNoIG9uZW9mICh0byBzdG9yZSB0aGUgZmllbGQgbnVtYmVyKS4KKyAgICBzaXplb2ZfaGFzX3N0b3JhZ2UgKz0gb25lb2ZfZ2VuZXJhdG9yc18uc2l6ZSgpOworCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJcbiIKKyAgICAgICAgInR5cGVkZWYgc3RydWN0ICRjbGFzc25hbWUkX19zdG9yYWdlXyB7XG4iCisgICAgICAgICIgIHVpbnQzMl90IF9oYXNfc3RvcmFnZV9bJHNpemVvZl9oYXNfc3RvcmFnZSRdO1xuIiwKKyAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzX25hbWVfLAorICAgICAgICAic2l6ZW9mX2hhc19zdG9yYWdlIiwgU3RyQ2F0KHNpemVvZl9oYXNfc3RvcmFnZSkpOworICAgIHByaW50ZXItPkluZGVudCgpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoc2l6ZV9vcmRlcl9maWVsZHNbaV0pCisgICAgICAgICAgLkdlbmVyYXRlRmllbGRTdG9yYWdlRGVjbGFyYXRpb24ocHJpbnRlcik7CisgICAgfQorICAgIHByaW50ZXItPk91dGRlbnQoKTsKKworICAgIHByaW50ZXItPlByaW50KCJ9ICRjbGFzc25hbWUkX19zdG9yYWdlXztcblxuIiwgImNsYXNzbmFtZSIsIGNsYXNzX25hbWVfKTsKKworCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIvLyBUaGlzIG1ldGhvZCBpcyB0aHJlYWRzYWZlIGJlY2F1c2UgaXQgaXMgaW5pdGlhbGx5IGNhbGxlZFxuIgorICAgICAgICAiLy8gaW4gK2luaXRpYWxpemUgZm9yIGVhY2ggc3ViY2xhc3MuXG4iCisgICAgICAgICIrIChHUEJEZXNjcmlwdG9yICopZGVzY3JpcHRvciB7XG4iCisgICAgICAgICIgIHN0YXRpYyBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gbmlsO1xuIgorICAgICAgICAiICBpZiAoIWRlc2NyaXB0b3IpIHtcbiIpOworCisgICAgVGV4dEZvcm1hdERlY29kZURhdGEgdGV4dF9mb3JtYXRfZGVjb2RlX2RhdGE7CisgICAgYm9vbCBoYXNfZmllbGRzID0gZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkgPiAwOworICAgIGJvb2wgbmVlZF9kZWZhdWx0cyA9IGZpZWxkX2dlbmVyYXRvcnNfLkRvZXNBbnlGaWVsZEhhdmVOb25aZXJvRGVmYXVsdCgpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX2Rlc2NyaXB0aW9uX3R5cGU7CisgICAgaWYgKG5lZWRfZGVmYXVsdHMpIHsKKyAgICAgIGZpZWxkX2Rlc2NyaXB0aW9uX3R5cGUgPSAiR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb25XaXRoRGVmYXVsdCI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpZWxkX2Rlc2NyaXB0aW9uX3R5cGUgPSAiR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24iOworICAgIH0KKyAgICBpZiAoaGFzX2ZpZWxkcykgeworICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJzdGF0aWMgJGZpZWxkX2Rlc2NyaXB0aW9uX3R5cGUkIGZpZWxkc1tdID0ge1xuIiwKKyAgICAgICAgICAiZmllbGRfZGVzY3JpcHRpb25fdHlwZSIsIGZpZWxkX2Rlc2NyaXB0aW9uX3R5cGUpOworICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgRmllbGRHZW5lcmF0b3ImIGZpZWxkX2dlbmVyYXRvciA9CisgICAgICAgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoc29ydGVkX2ZpZWxkc1tpXSk7CisgICAgICAgIGZpZWxkX2dlbmVyYXRvci5HZW5lcmF0ZUZpZWxkRGVzY3JpcHRpb24ocHJpbnRlciwgbmVlZF9kZWZhdWx0cyk7CisgICAgICAgIGlmIChmaWVsZF9nZW5lcmF0b3IubmVlZHNfdGV4dGZvcm1hdF9uYW1lX3N1cHBvcnQoKSkgeworICAgICAgICAgIHRleHRfZm9ybWF0X2RlY29kZV9kYXRhLkFkZFN0cmluZyhzb3J0ZWRfZmllbGRzW2ldLT5udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZ2VuZXJhdG9yLmdlbmVyYXRlZF9vYmpjX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZ2VuZXJhdG9yLnJhd19maWVsZF9uYW1lKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAifTtcbiIpOworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIH0KKworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJjbGFzc25hbWUiXSA9IGNsYXNzX25hbWVfOworICAgIHZhcnNbInJvb3RjbGFzc25hbWUiXSA9IHJvb3RfY2xhc3NuYW1lXzsKKyAgICB2YXJzWyJmaWVsZHMiXSA9IGhhc19maWVsZHMgPyAiZmllbGRzIiA6ICJOVUxMIjsKKyAgICBpZiAoaGFzX2ZpZWxkcykgeworICAgICAgdmFyc1siZmllbGRzX2NvdW50Il0gPQorICAgICAgICAgICIodWludDMyX3QpKHNpemVvZihmaWVsZHMpIC8gc2l6ZW9mKCIgKyBmaWVsZF9kZXNjcmlwdGlvbl90eXBlICsgIikpIjsKKyAgICB9IGVsc2UgeworICAgICAgdmFyc1siZmllbGRzX2NvdW50Il0gPSAiMCI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGluaXRfZmxhZ3M7CisgICAgaW5pdF9mbGFncy5wdXNoX2JhY2soIkdQQkRlc2NyaXB0b3JJbml0aWFsaXphdGlvbkZsYWdfVXNlc0NsYXNzUmVmcyIpOworICAgIGluaXRfZmxhZ3MucHVzaF9iYWNrKCJHUEJEZXNjcmlwdG9ySW5pdGlhbGl6YXRpb25GbGFnX1Byb3RvM09wdGlvbmFsS25vd24iKTsKKyAgICBpZiAobmVlZF9kZWZhdWx0cykgeworICAgICAgaW5pdF9mbGFncy5wdXNoX2JhY2soIkdQQkRlc2NyaXB0b3JJbml0aWFsaXphdGlvbkZsYWdfRmllbGRzV2l0aERlZmF1bHQiKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgeworICAgICAgaW5pdF9mbGFncy5wdXNoX2JhY2soIkdQQkRlc2NyaXB0b3JJbml0aWFsaXphdGlvbkZsYWdfV2lyZUZvcm1hdCIpOworICAgIH0KKyAgICB2YXJzWyJpbml0X2ZsYWdzIl0gPSBCdWlsZEZsYWdzU3RyaW5nKEZMQUdUWVBFX0RFU0NSSVBUT1JfSU5JVElBTElaQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2ZsYWdzKTsKKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJzLAorICAgICAgICAiICAgIEdQQkRlc2NyaXB0b3IgKmxvY2FsRGVzY3JpcHRvciA9XG4iCisgICAgICAgICIgICAgICAgIFtHUEJEZXNjcmlwdG9yIGFsbG9jRGVzY3JpcHRvckZvckNsYXNzOlskY2xhc3NuYW1lJCBjbGFzc11cbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290Q2xhc3M6WyRyb290Y2xhc3NuYW1lJCBjbGFzc11cbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6JHJvb3RjbGFzc25hbWUkX0ZpbGVEZXNjcmlwdG9yKClcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHM6JGZpZWxkcyRcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ291bnQ6JGZpZWxkc19jb3VudCRcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZVNpemU6c2l6ZW9mKCRjbGFzc25hbWUkX19zdG9yYWdlXylcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6JGluaXRfZmxhZ3MkXTtcbiIpOworICAgIGlmICghb25lb2ZfZ2VuZXJhdG9yc18uZW1wdHkoKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIiAgICBzdGF0aWMgY29uc3QgY2hhciAqb25lb2ZzW10gPSB7XG4iKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgZ2VuZXJhdG9yIDogb25lb2ZfZ2VuZXJhdG9yc18pIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIiAgICAgIFwiJG5hbWUkXCIsXG4iLCAibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvci0+RGVzY3JpcHRvck5hbWUoKSk7CisgICAgICB9CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiICAgIH07XG4iCisgICAgICAgICAgIiAgICBbbG9jYWxEZXNjcmlwdG9yIHNldHVwT25lb2ZzOm9uZW9mc1xuIgorICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoodWludDMyX3QpKHNpemVvZihvbmVvZnMpIC8gc2l6ZW9mKGNoYXIqKSlcbiIKKyAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIGZpcnN0SGFzSW5kZXg6JGZpcnN0X2hhc19pbmRleCRdO1xuIiwKKyAgICAgICAgICAiZmlyc3RfaGFzX2luZGV4Iiwgb25lb2ZfZ2VuZXJhdG9yc19bMF0tPkhhc0luZGV4QXNTdHJpbmcoKSk7CisgICAgfQorICAgIGlmICh0ZXh0X2Zvcm1hdF9kZWNvZGVfZGF0YS5udW1fZW50cmllcygpICE9IDApIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHRleHRfZm9ybWF0X2RhdGFfc3RyKHRleHRfZm9ybWF0X2RlY29kZV9kYXRhLkRhdGEoKSk7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiI2lmICFHUEJPQkpDX1NLSVBfTUVTU0FHRV9URVhURk9STUFUX0VYVFJBU1xuIgorICAgICAgICAgICIgICAgc3RhdGljIGNvbnN0IGNoYXIgKmV4dHJhVGV4dEZvcm1hdEluZm8gPSIpOworICAgICAgc3RhdGljIGNvbnN0IGludCBrQnl0ZXNQZXJMaW5lID0gNDA7ICAvLyBhbGxvdyBmb3IgZXNjYXBpbmcKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dF9mb3JtYXRfZGF0YV9zdHIuc2l6ZSgpOyBpICs9IGtCeXRlc1BlckxpbmUpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAiXG4gICAgICAgIFwiJGRhdGEkXCIiLAorICAgICAgICAgICAgImRhdGEiLCBFc2NhcGVUcmlncmFwaHMoCisgICAgICAgICAgICAgICAgQ0VzY2FwZSh0ZXh0X2Zvcm1hdF9kYXRhX3N0ci5zdWJzdHIoaSwga0J5dGVzUGVyTGluZSkpKSk7CisgICAgICB9CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiO1xuIgorICAgICAgICAgICIgICAgW2xvY2FsRGVzY3JpcHRvciBzZXR1cEV4dHJhVGV4dEluZm86ZXh0cmFUZXh0Rm9ybWF0SW5mb107XG4iCisgICAgICAgICAgIiNlbmRpZiAgLy8gIUdQQk9CSkNfU0tJUF9NRVNTQUdFX1RFWFRGT1JNQVRfRVhUUkFTXG4iKTsKKyAgICB9CisgICAgaWYgKCFzb3J0ZWRfZXh0ZW5zaW9ucy5lbXB0eSgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiICAgIHN0YXRpYyBjb25zdCBHUEJFeHRlbnNpb25SYW5nZSByYW5nZXNbXSA9IHtcbiIpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3J0ZWRfZXh0ZW5zaW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICBwcmludGVyLT5QcmludCgiICAgICAgeyAuc3RhcnQgPSAkc3RhcnQkLCAuZW5kID0gJGVuZCQgfSxcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICJzdGFydCIsIFN0ckNhdChzb3J0ZWRfZXh0ZW5zaW9uc1tpXS0+c3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAiZW5kIiwgU3RyQ2F0KHNvcnRlZF9leHRlbnNpb25zW2ldLT5lbmQpKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIgICAgfTtcbiIKKyAgICAgICAgICAiICAgIFtsb2NhbERlc2NyaXB0b3Igc2V0dXBFeHRlbnNpb25SYW5nZXM6cmFuZ2VzXG4iCisgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Oih1aW50MzJfdCkoc2l6ZW9mKHJhbmdlcykgLyBzaXplb2YoR1BCRXh0ZW5zaW9uUmFuZ2UpKV07XG4iKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSAhPSBOVUxMKSB7CisgICAgICBzdGQ6OnN0cmluZyBjb250YWluaW5nX2NsYXNzID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSk7CisgICAgICBzdGQ6OnN0cmluZyBwYXJlbnRfY2xhc3NfcmVmID0gT2JqQ0NsYXNzKGNvbnRhaW5pbmdfY2xhc3MpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIiAgICBbbG9jYWxEZXNjcmlwdG9yIHNldHVwQ29udGFpbmluZ01lc3NhZ2VDbGFzczokcGFyZW50X2NsYXNzX3JlZiRdO1xuIiwKKyAgICAgICAgICAicGFyZW50X2NsYXNzX3JlZiIsIHBhcmVudF9jbGFzc19yZWYpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBzdWZmaXhfYWRkZWQ7CisgICAgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLCAmc3VmZml4X2FkZGVkKTsKKyAgICBpZiAoIXN1ZmZpeF9hZGRlZC5lbXB0eSgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiICAgIFtsb2NhbERlc2NyaXB0b3Igc2V0dXBNZXNzYWdlQ2xhc3NOYW1lU3VmZml4OkBcIiRzdWZmaXgkXCJdO1xuIiwKKyAgICAgICAgICAic3VmZml4Iiwgc3VmZml4X2FkZGVkKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgICAgI2lmIGRlZmluZWQoREVCVUcpICYmIERFQlVHXG4iCisgICAgICAgICIgICAgICBOU0Fzc2VydChkZXNjcmlwdG9yID09IG5pbCwgQFwiU3RhcnR1cCByZWN1cnNlZCFcIik7XG4iCisgICAgICAgICIgICAgI2VuZGlmICAvLyBERUJVR1xuIgorICAgICAgICAiICAgIGRlc2NyaXB0b3IgPSBsb2NhbERlc2NyaXB0b3I7XG4iCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIiAgcmV0dXJuIGRlc2NyaXB0b3I7XG4iCisgICAgICAgICJ9XG5cbiIKKyAgICAgICAgIkBlbmRcblxuIik7CisKKyAgICBpZiAoIWRlcHJlY2F0ZWRfYXR0cmlidXRlXy5lbXB0eSgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcFxuIgorICAgICAgICAgICJcbiIpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKKyAgICAgICAgICAuR2VuZXJhdGVDRnVuY3Rpb25JbXBsZW1lbnRhdGlvbnMocHJpbnRlcik7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBnZW5lcmF0b3IgOiBvbmVvZl9nZW5lcmF0b3JzXykgeworICAgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZUNsZWFyRnVuY3Rpb25JbXBsZW1lbnRhdGlvbihwcmludGVyKTsKKyAgICB9CisgIH0KKworICBmb3IgKGNvbnN0IGF1dG8mIGdlbmVyYXRvciA6IGVudW1fZ2VuZXJhdG9yc18pIHsKKyAgICBnZW5lcmF0b3ItPkdlbmVyYXRlU291cmNlKHByaW50ZXIpOworICB9CisKKyAgZm9yIChjb25zdCBhdXRvJiBnZW5lcmF0b3IgOiBuZXN0ZWRfbWVzc2FnZV9nZW5lcmF0b3JzXykgeworICAgIGdlbmVyYXRvci0+R2VuZXJhdGVTb3VyY2UocHJpbnRlcik7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIG9iamVjdGl2ZWMKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxNDQzMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2UuaApAQCAtMCwwICsxLDk5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfT0JKRUNUSVZFQ19NRVNTQUdFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfT0JKRUNUSVZFQ19NRVNTQUdFX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfb25lb2YuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2Ugb2JqZWN0aXZlYyB7CisKK2NsYXNzIEV4dGVuc2lvbkdlbmVyYXRvcjsKK2NsYXNzIEVudW1HZW5lcmF0b3I7CisKK2NsYXNzIE1lc3NhZ2VHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgTWVzc2FnZUdlbmVyYXRvcihjb25zdCBzdGQ6OnN0cmluZyYgcm9vdF9jbGFzc25hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIH5NZXNzYWdlR2VuZXJhdG9yKCk7CisKKyAgTWVzc2FnZUdlbmVyYXRvcihjb25zdCBNZXNzYWdlR2VuZXJhdG9yJikgPSBkZWxldGU7CisgIE1lc3NhZ2VHZW5lcmF0b3ImIG9wZXJhdG9yPShjb25zdCBNZXNzYWdlR2VuZXJhdG9yJikgPSBkZWxldGU7CisKKyAgdm9pZCBHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlc0luaXRpYWxpemF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZUVudW1IZWFkZXIoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlTWVzc2FnZUhlYWRlcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVTb3VyY2UoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uU291cmNlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBEZXRlcm1pbmVPYmplY3RpdmVDQ2xhc3NEZWZpbml0aW9ucyhzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGZ3ZF9kZWNscyk7CisgIHZvaWQgRGV0ZXJtaW5lRm9yd2FyZERlY2xhcmF0aW9ucyhzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGZ3ZF9kZWNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV9leHRlcm5hbF90eXBlcyk7CisKKyAgLy8gQ2hlY2tzIGlmIHRoZSBtZXNzYWdlIG9yIGEgbmVzdGVkIG1lc3NhZ2UgaW5jbHVkZXMgYSBvbmVvZiBkZWZpbml0aW9uLgorICBib29sIEluY2x1ZGVzT25lT2ZEZWZpbml0aW9uKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICB2b2lkIEdlbmVyYXRlUGFyc2VGcm9tTWV0aG9kc0hlYWRlcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZU9uZUZpZWxkU291cmNlKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZVNvdXJjZSgKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UpOworCisgIHZvaWQgR2VuZXJhdGVNZXNzYWdlRGVzY3JpcHRpb25Tb3VyY2UoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlRGVzY3JpcHRpb25PbmVGaWVsZFNvdXJjZShpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcm9vdF9jbGFzc25hbWVfOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgRmllbGRHZW5lcmF0b3JNYXAgZmllbGRfZ2VuZXJhdG9yc187CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGNsYXNzX25hbWVfOworICBjb25zdCBzdGQ6OnN0cmluZyBkZXByZWNhdGVkX2F0dHJpYnV0ZV87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxFeHRlbnNpb25HZW5lcmF0b3I+PiBleHRlbnNpb25fZ2VuZXJhdG9yc187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxFbnVtR2VuZXJhdG9yPj4gZW51bV9nZW5lcmF0b3JzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2VHZW5lcmF0b3I+PiBuZXN0ZWRfbWVzc2FnZV9nZW5lcmF0b3JzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE9uZW9mR2VuZXJhdG9yPj4gb25lb2ZfZ2VuZXJhdG9yc187Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugb2JqZWN0aXZlYworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfT0JKRUNUSVZFQ19NRVNTQUdFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2VfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmMGI0NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2VfZmllbGQuY2MKQEAgLTAsMCArMSwxMjMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2Ugb2JqZWN0aXZlYyB7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgU2V0TWVzc2FnZVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogdmFyaWFibGVzKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlX3R5cGUgPSBDbGFzc05hbWUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGFpbmluZ19jbGFzcyA9CisgICAgICBDbGFzc05hbWUoZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCkpOworICAoKnZhcmlhYmxlcylbInR5cGUiXSA9IG1lc3NhZ2VfdHlwZTsKKyAgKCp2YXJpYWJsZXMpWyJjb250YWluaW5nX2NsYXNzIl0gPSBjb250YWluaW5nX2NsYXNzOworICAoKnZhcmlhYmxlcylbInN0b3JhZ2VfdHlwZSJdID0gbWVzc2FnZV90eXBlOworICAoKnZhcmlhYmxlcylbImdyb3VwX29yX21lc3NhZ2UiXSA9CisgICAgICAoZGVzY3JpcHRvci0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgPyAiR3JvdXAiIDogIk1lc3NhZ2UiOworICAoKnZhcmlhYmxlcylbImRhdGFUeXBlU3BlY2lmaWNfdmFsdWUiXSA9IE9iakNDbGFzcyhtZXNzYWdlX3R5cGUpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICAgIDogT2JqQ09iakZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IpIHsKKyAgU2V0TWVzc2FnZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7Cit9CisKK01lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6fk1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpEZXRlcm1pbmVGb3J3YXJkRGVjbGFyYXRpb25zKAorICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiogZndkX2RlY2xzLAorICAgIGJvb2wgaW5jbHVkZV9leHRlcm5hbF90eXBlcykgY29uc3QgeworICBPYmpDT2JqRmllbGRHZW5lcmF0b3I6OkRldGVybWluZUZvcndhcmREZWNsYXJhdGlvbnMoCisgICAgICBmd2RfZGVjbHMsIGluY2x1ZGVfZXh0ZXJuYWxfdHlwZXMpOworICAvLyBXaXRoaW4gYSBmaWxlIHRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IG9uIHRoZSBvcmRlciBvZiB0aGUgbWVzc2FnZXMsIHNvCisgIC8vIGxvY2FsIHJlZmVyZW5jZXMgbmVlZCBhIGZvcndhcmQgZGVjbGFyYXRpb24uIEV4dGVybmFsIGZpbGVzIChub3QgV0tUcyksCisgIC8vIG5lZWQgb25lIHdoZW4gcmVxdWVzdGVkLgorICBpZiAoKGluY2x1ZGVfZXh0ZXJuYWxfdHlwZXMgJiYKKyAgICAgICAhSXNQcm90b2J1ZkxpYnJhcnlCdW5kbGVkUHJvdG9GaWxlKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKS0+ZmlsZSgpKSkgfHwKKyAgICAgIGRlc2NyaXB0b3JfLT5maWxlKCkgPT0gZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpLT5maWxlKCkpIHsKKyAgICAvLyBDbGFzcyBuYW1lIGlzIGFscmVhZHkgaW4gInN0b3JhZ2VfdHlwZSIuCisgICAgZndkX2RlY2xzLT5pbnNlcnQoIkBjbGFzcyAiICsgdmFyaWFibGUoInN0b3JhZ2VfdHlwZSIpKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6RGV0ZXJtaW5lT2JqZWN0aXZlQ0NsYXNzRGVmaW5pdGlvbnMoCisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBmd2RfZGVjbHMpIGNvbnN0IHsKKyAgZndkX2RlY2xzLT5pbnNlcnQoT2JqQ0NsYXNzRGVjbGFyYXRpb24odmFyaWFibGUoInN0b3JhZ2VfdHlwZSIpKSk7Cit9CisKK1JlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgICAgOiBSZXBlYXRlZEZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IpIHsKKyAgU2V0TWVzc2FnZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7CisgIHZhcmlhYmxlc19bImFycmF5X3N0b3JhZ2VfdHlwZSJdID0gIk5TTXV0YWJsZUFycmF5IjsKKyAgdmFyaWFibGVzX1siYXJyYXlfcHJvcGVydHlfdHlwZSJdID0KKyAgICAgICJOU011dGFibGVBcnJheTwiICsgdmFyaWFibGVzX1sic3RvcmFnZV90eXBlIl0gKyAiKj4iOworfQorCitSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6RGV0ZXJtaW5lRm9yd2FyZERlY2xhcmF0aW9ucygKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGZ3ZF9kZWNscywKKyAgICBib29sIGluY2x1ZGVfZXh0ZXJuYWxfdHlwZXMpIGNvbnN0IHsKKyAgUmVwZWF0ZWRGaWVsZEdlbmVyYXRvcjo6RGV0ZXJtaW5lRm9yd2FyZERlY2xhcmF0aW9ucygKKyAgICAgIGZ3ZF9kZWNscywgaW5jbHVkZV9leHRlcm5hbF90eXBlcyk7CisgIC8vIFdpdGhpbiBhIGZpbGUgdGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgb24gdGhlIG9yZGVyIG9mIHRoZSBtZXNzYWdlcywgc28KKyAgLy8gbG9jYWwgcmVmZXJlbmNlcyBuZWVkIGEgZm9yd2FyZCBkZWNsYXJhdGlvbi4gRXh0ZXJuYWwgZmlsZXMgKG5vdCBXS1RzKSwKKyAgLy8gbmVlZCBvbmUgd2hlbiByZXF1ZXN0ZWQuCisgIGlmICgoaW5jbHVkZV9leHRlcm5hbF90eXBlcyAmJgorICAgICAgICFJc1Byb3RvYnVmTGlicmFyeUJ1bmRsZWRQcm90b0ZpbGUoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpLT5maWxlKCkpKSB8fAorICAgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSA9PSBkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCktPmZpbGUoKSkgeworICAgIC8vIENsYXNzIG5hbWUgaXMgYWxyZWFkeSBpbiAic3RvcmFnZV90eXBlIi4KKyAgICBmd2RfZGVjbHMtPmluc2VydCgiQGNsYXNzICIgKyB2YXJpYWJsZSgic3RvcmFnZV90eXBlIikpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkRldGVybWluZU9iamVjdGl2ZUNDbGFzc0RlZmluaXRpb25zKAorICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiogZndkX2RlY2xzKSBjb25zdCB7CisgIGZ3ZF9kZWNscy0+aW5zZXJ0KE9iakNDbGFzc0RlY2xhcmF0aW9uKHZhcmlhYmxlKCJzdG9yYWdlX3R5cGUiKSkpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugb2JqZWN0aXZlYworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2VfZmllbGQuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2VfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWE4NGZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5oCkBAIC0wLDAgKzEsODUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9PQkpFQ1RJVkVDX01FU1NBR0VfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9PQkpFQ1RJVkVDX01FU1NBR0VfRklFTERfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBvYmplY3RpdmVjIHsKKworY2xhc3MgTWVzc2FnZUZpZWxkR2VuZXJhdG9yIDogcHVibGljIE9iakNPYmpGaWVsZEdlbmVyYXRvciB7CisgIGZyaWVuZCBGaWVsZEdlbmVyYXRvciogRmllbGRHZW5lcmF0b3I6Ok1ha2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisgIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBNZXNzYWdlRmllbGRHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKyAgTWVzc2FnZUZpZWxkR2VuZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgTWVzc2FnZUZpZWxkR2VuZXJhdG9yJikgPSBkZWxldGU7CisKKyAgdmlydHVhbCB+TWVzc2FnZUZpZWxkR2VuZXJhdG9yKCk7CisKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBEZXRlcm1pbmVGb3J3YXJkRGVjbGFyYXRpb25zKAorICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBmd2RfZGVjbHMsCisgICAgICBib29sIGluY2x1ZGVfZXh0ZXJuYWxfdHlwZXMpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgRGV0ZXJtaW5lT2JqZWN0aXZlQ0NsYXNzRGVmaW5pdGlvbnMoCisgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGZ3ZF9kZWNscykgY29uc3Qgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBSZXBlYXRlZEZpZWxkR2VuZXJhdG9yIHsKKyAgZnJpZW5kIEZpZWxkR2VuZXJhdG9yKiBGaWVsZEdlbmVyYXRvcjo6TWFrZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgdmlydHVhbCB+UmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoKTsKKworICBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworICBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvciBvcGVyYXRvcj0oY29uc3QgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIERldGVybWluZUZvcndhcmREZWNsYXJhdGlvbnMoCisgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGZ3ZF9kZWNscywKKyAgICAgIGJvb2wgaW5jbHVkZV9leHRlcm5hbF90eXBlcykgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBEZXRlcm1pbmVPYmplY3RpdmVDQ2xhc3NEZWZpbml0aW9ucygKKyAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiogZndkX2RlY2xzKSBjb25zdCBvdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBvYmplY3RpdmVjCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9PQkpFQ1RJVkVDX01FU1NBR0VfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19uc29iamVjdF9tZXRob2RzLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19uc29iamVjdF9tZXRob2RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzMzA0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX25zb2JqZWN0X21ldGhvZHMuaApAQCAtMCwwICsxLDE5NyBAQAorLy8gTlNPYmplY3QgbWV0aG9kcworLy8gQXV0b2dlbmVyYXRlZCBieSBtZXRob2RfZHVtcC5zaC4gRG8gbm90IGVkaXQgYnkgaGFuZC4KKy8vIERhdGU6IFRodSBOb3YgIDEgMTQ6MTI6MTYgUERUIDIwMTgKKy8vIG1hY09TOiBNYWNPU1gxMC4xNC5zZGsKKy8vIGlPUzogaVBob25lU2ltdWxhdG9yMTIuMS5zZGsKKworY29uc3QgY2hhciogY29uc3Qga05TT2JqZWN0TWV0aG9kc0xpc3RbXSA9IHsKKwkiQ0FNTFR5cGUiLAorCSJDQV9jb3B5UmVuZGVyVmFsdWUiLAorCSJDQV9wcmVwYXJlUmVuZGVyVmFsdWUiLAorCSJOU19jb3B5Q0dJbWFnZSIsCisJIk5TX3RpbGVkTGF5ZXJWaXNpYmxlUmVjdCIsCisJIl9fX3RyeVJldGFpbl9PQSIsCisJIl9fYXV0b3JlbGVhc2VfT0EiLAorCSJfX2RlYWxsb2Nfem9tYmllIiwKKwkiX19yZWxlYXNlX09BIiwKKwkiX19yZXRhaW5fT0EiLAorCSJfYWNjZXNzaWJpbGl0eUZpbmFsaXplIiwKKwkiX2FjY2Vzc2liaWxpdHlJc1RhYmxlVmlld0Rlc2NlbmRhbnQiLAorCSJfYWNjZXNzaWJpbGl0eVVJRWxlbWVudFNwZWNpZmllciIsCisJIl9hY2Nlc3NpYmlsaXR5VXNlQ29udmVuaWVuY2VBUEkiLAorCSJfYWxsb3dzRGlyZWN0RW5jb2RpbmciLAorCSJfYXNTY3JpcHRUZXJtaW5vbG9neU5hbWVBcnJheSIsCisJIl9hc1NjcmlwdFRlcm1pbm9sb2d5TmFtZVN0cmluZyIsCisJIl9iaW5kaW5nQWRhcHRvciIsCisJIl9jZlR5cGVJRCIsCisJIl9jb3B5RGVzY3JpcHRpb24iLAorCSJfZGVzdHJveU9ic2VydmVyTGlzdCIsCisJIl9kaWRFbmRLZXlWYWx1ZU9ic2VydmluZyIsCisJIl9pbXBsaWNpdE9ic2VydmF0aW9uSW5mbyIsCisJIl9pbnRlcm5hbEFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVkSGludCIsCisJIl9pbnRlcm5hbEFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVkTGFiZWwiLAorCSJfaW50ZXJuYWxBY2Nlc3NpYmlsaXR5QXR0cmlidXRlZFZhbHVlIiwKKwkiX2lzQVhDb25uZWN0b3IiLAorCSJfaXNBY2Nlc3NpYmlsaXR5Q29udGFpbmVyU2VjdGlvbkNhbmRpZGF0ZSIsCisJIl9pc0FjY2Vzc2liaWxpdHlDb250ZW50TmF2aWdhdG9yU2VjdGlvbkNhbmRpZGF0ZSIsCisJIl9pc0FjY2Vzc2liaWxpdHlDb250ZW50U2VjdGlvbkNhbmRpZGF0ZSIsCisJIl9pc0FjY2Vzc2liaWxpdHlUb3BMZXZlbE5hdmlnYXRvclNlY3Rpb25DYW5kaWRhdGUiLAorCSJfaXNEZWFsbG9jYXRpbmciLAorCSJfaXNLVk9BIiwKKwkiX2lzVG9NYW55Q2hhbmdlSW5mb3JtYXRpb24iLAorCSJfaXZhckRlc2NyaXB0aW9uIiwKKwkiX2xvY2FsQ2xhc3NOYW1lRm9yQ2xhc3MiLAorCSJfbWV0aG9kRGVzY3JpcHRpb24iLAorCSJfb2JzZXJ2ZXJTdG9yYWdlIiwKKwkiX292ZXJyaWRlVXNlRmFzdEJsb2NrT2JzZXJ2ZXJzIiwKKwkiX3Byb3BlcnR5RGVzY3JpcHRpb24iLAorCSJfcmVsZWFzZUJpbmRpbmdBZGFwdG9yIiwKKwkiX3NjcmlwdGluZ0NvdW50IiwKKwkiX3NjcmlwdGluZ0NvdW50Tm9ucmVjdXJzaXZlbHkiLAorCSJfc2NyaXB0aW5nRGVidWdEZXNjcmlwdGlvbiIsCisJIl9zY3JpcHRpbmdFeGlzdHMiLAorCSJfc2NyaXB0aW5nU2hvdWxkQ2hlY2tPYmplY3RJbmRleGVzIiwKKwkiX3Nob3J0TWV0aG9kRGVzY3JpcHRpb24iLAorCSJfc2hvdWxkU2VhcmNoQ2hpbGRyZW5Gb3JTZWN0aW9uIiwKKwkiX3RyYWl0U3RvcmFnZUxpc3QiLAorCSJfdHJ5UmV0YWluIiwKKwkiX3VpX2Rlc2NyaXB0aW9uQnVpbGRlciIsCisJIl91aWtpdF92YXJpZXNCeVRyYWl0Q29sbGVjdGlvbnMiLAorCSJfd2ViX2Rlc2NyaXB0aW9uIiwKKwkiX3dlYmtpdF9pbnZva2VPbk1haW5UaHJlYWQiLAorCSJfd2lsbEJlZ2luS2V5VmFsdWVPYnNlcnZpbmciLAorCSJhY2Nlc3NpYmlsaXR5QWN0aXZhdGUiLAorCSJhY2Nlc3NpYmlsaXR5QWN0aXZhdGlvblBvaW50IiwKKwkiYWNjZXNzaWJpbGl0eUFsbG93c092ZXJyaWRkZW5BdHRyaWJ1dGVzV2hlbklnbm9yZWQiLAorCSJhY2Nlc3NpYmlsaXR5QXNzaXN0aXZlVGVjaG5vbG9neUZvY3VzZWRJZGVudGlmaWVycyIsCisJImFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVkSGludCIsCisJImFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVkTGFiZWwiLAorCSJhY2Nlc3NpYmlsaXR5QXR0cmlidXRlZFZhbHVlIiwKKwkiYWNjZXNzaWJpbGl0eUNvbnRhaW5lciIsCisJImFjY2Vzc2liaWxpdHlDb250YWluZXJUeXBlIiwKKwkiYWNjZXNzaWJpbGl0eUN1c3RvbUFjdGlvbnMiLAorCSJhY2Nlc3NpYmlsaXR5Q3VzdG9tUm90b3JzIiwKKwkiYWNjZXNzaWJpbGl0eURlY3JlbWVudCIsCisJImFjY2Vzc2liaWxpdHlEcmFnU291cmNlRGVzY3JpcHRvcnMiLAorCSJhY2Nlc3NpYmlsaXR5RHJvcFBvaW50RGVzY3JpcHRvcnMiLAorCSJhY2Nlc3NpYmlsaXR5RWxlbWVudENvdW50IiwKKwkiYWNjZXNzaWJpbGl0eUVsZW1lbnREaWRCZWNvbWVGb2N1c2VkIiwKKwkiYWNjZXNzaWJpbGl0eUVsZW1lbnREaWRMb3NlRm9jdXMiLAorCSJhY2Nlc3NpYmlsaXR5RWxlbWVudElzRm9jdXNlZCIsCisJImFjY2Vzc2liaWxpdHlFbGVtZW50cyIsCisJImFjY2Vzc2liaWxpdHlFbGVtZW50c0hpZGRlbiIsCisJImFjY2Vzc2liaWxpdHlGcmFtZSIsCisJImFjY2Vzc2liaWxpdHlIZWFkZXJFbGVtZW50cyIsCisJImFjY2Vzc2liaWxpdHlIaW50IiwKKwkiYWNjZXNzaWJpbGl0eUlkZW50aWZpY2F0aW9uIiwKKwkiYWNjZXNzaWJpbGl0eUlkZW50aWZpZXIiLAorCSJhY2Nlc3NpYmlsaXR5SW5jcmVtZW50IiwKKwkiYWNjZXNzaWJpbGl0eUxhYmVsIiwKKwkiYWNjZXNzaWJpbGl0eUxhbmd1YWdlIiwKKwkiYWNjZXNzaWJpbGl0eUxvY2FsaXplZFN0cmluZ0tleSIsCisJImFjY2Vzc2liaWxpdHlOYXZpZ2F0aW9uU3R5bGUiLAorCSJhY2Nlc3NpYmlsaXR5T3ZlcnJpZGRlbkF0dHJpYnV0ZXMiLAorCSJhY2Nlc3NpYmlsaXR5UGFyYW1ldGVyaXplZEF0dHJpYnV0ZU5hbWVzIiwKKwkiYWNjZXNzaWJpbGl0eVBhdGgiLAorCSJhY2Nlc3NpYmlsaXR5UGVyZm9ybUVzY2FwZSIsCisJImFjY2Vzc2liaWxpdHlQZXJmb3JtTWFnaWNUYXAiLAorCSJhY2Nlc3NpYmlsaXR5UHJlc2VudGVyUHJvY2Vzc0lkZW50aWZpZXIiLAorCSJhY2Nlc3NpYmlsaXR5U2hvdWxkVXNlVW5pcXVlSWQiLAorCSJhY2Nlc3NpYmlsaXR5U3VwcG9ydHNOb3RpZmljYXRpb25zIiwKKwkiYWNjZXNzaWJpbGl0eVN1cHBvcnRzT3ZlcnJpZGRlbkF0dHJpYnV0ZXMiLAorCSJhY2Nlc3NpYmlsaXR5VGVtcG9yYXJ5Q2hpbGRyZW4iLAorCSJhY2Nlc3NpYmlsaXR5VHJhaXRzIiwKKwkiYWNjZXNzaWJpbGl0eVZhbHVlIiwKKwkiYWNjZXNzaWJpbGl0eVZpZXdJc01vZGFsIiwKKwkiYWNjZXNzaWJpbGl0eVZpc2libGVBcmVhIiwKKwkiYWxsUHJvcGVydHlLZXlzIiwKKwkiYWxsb3dzV2Vha1JlZmVyZW5jZSIsCisJImF0dHJpYnV0ZUtleXMiLAorCSJhdXRvQ29udGVudEFjY2Vzc2luZ1Byb3h5IiwKKwkiYXV0b3JlbGVhc2UiLAorCSJhd2FrZUZyb21OaWIiLAorCSJib29sVmFsdWVTYWZlIiwKKwkiYnNfZW5jb2RlZCIsCisJImJzX2lzUGxpc3RhYmxlVHlwZSIsCisJImJzX3NlY3VyZUVuY29kZWQiLAorCSJjbF9qc29uX3NlcmlhbGl6ZUtleSIsCisJImNsYXNzIiwKKwkiY2xhc3NDb2RlIiwKKwkiY2xhc3NEZXNjcmlwdGlvbiIsCisJImNsYXNzRm9yQXJjaGl2ZXIiLAorCSJjbGFzc0ZvckNvZGVyIiwKKwkiY2xhc3NGb3JLZXllZEFyY2hpdmVyIiwKKwkiY2xhc3NGb3JQb3J0Q29kZXIiLAorCSJjbGFzc05hbWUiLAorCSJjbGVhclByb3BlcnRpZXMiLAorCSJjb3B5IiwKKwkiZGVhbGxvYyIsCisJImRlYnVnRGVzY3JpcHRpb24iLAorCSJkZWZhdWx0QWNjZXNzaWJpbGl0eVRyYWl0cyIsCisJImRlc2NyaXB0aW9uIiwKKwkiZG91YmxlVmFsdWVTYWZlIiwKKwkiZW50aXR5TmFtZSIsCisJImV4cG9zZWRCaW5kaW5ncyIsCisJImZpbmFsaXplIiwKKwkiZmluaXNoT2JzZXJ2aW5nIiwKKwkiZmx1c2hLZXlCaW5kaW5ncyIsCisJImhhc2giLAorCSJpbml0IiwKKwkiaW50NjRWYWx1ZVNhZmUiLAorCSJpc0FjY2Vzc2liaWxpdHlFbGVtZW50IiwKKwkiaXNBY2Nlc3NpYmlsaXR5RWxlbWVudEJ5RGVmYXVsdCIsCisJImlzRWxlbWVudEFjY2Vzc2liaWxpdHlFeHBvc2VkVG9JbnRlcmZhY2VCdWlsZGVyIiwKKwkiaXNGYXVsdCIsCisJImlzTlNBcnJheV9fIiwKKwkiaXNOU0NGQ29uc3RhbnRTdHJpbmdfXyIsCisJImlzTlNEYXRhX18iLAorCSJpc05TRGF0ZV9fIiwKKwkiaXNOU0RpY3Rpb25hcnlfXyIsCisJImlzTlNOdW1iZXJfXyIsCisJImlzTlNPYmplY3RfXyIsCisJImlzTlNPcmRlcmVkU2V0X18iLAorCSJpc05TU2V0X18iLAorCSJpc05TU3RyaW5nX18iLAorCSJpc05TVGltZVpvbmVfXyIsCisJImlzTlNWYWx1ZV9fIiwKKwkiaXNQcm94eSIsCisJIm11dGFibGVDb3B5IiwKKwkibmlsVmFsdWVGb3JLZXkiLAorCSJvYmplY3RTcGVjaWZpZXIiLAorCSJvYnNlcnZhdGlvbkluZm8iLAorCSJwZXBfb25EZXRhY2hlZFRocmVhZCIsCisJInBlcF9vbk1haW5UaHJlYWQiLAorCSJwZXBfb25NYWluVGhyZWFkSWZOZWNlc3NhcnkiLAorCSJwcmVwYXJlRm9ySW50ZXJmYWNlQnVpbGRlciIsCisJInJlbGVhc2UiLAorCSJyZWxlYXNlT25NYWluVGhyZWFkIiwKKwkicmV0YWluIiwKKwkicmV0YWluQ291bnQiLAorCSJyZXRhaW5XZWFrUmVmZXJlbmNlIiwKKwkic2NyaXB0aW5nUHJvcGVydGllcyIsCisJInNlbGYiLAorCSJzaG91bGRHcm91cEFjY2Vzc2liaWxpdHlDaGlsZHJlbiIsCisJInN0b3JlZEFjY2Vzc2liaWxpdHlBY3RpdmF0aW9uUG9pbnQiLAorCSJzdG9yZWRBY2Nlc3NpYmlsaXR5Q29udGFpbmVyVHlwZSIsCisJInN0b3JlZEFjY2Vzc2liaWxpdHlFbGVtZW50c0hpZGRlbiIsCisJInN0b3JlZEFjY2Vzc2liaWxpdHlGcmFtZSIsCisJInN0b3JlZEFjY2Vzc2liaWxpdHlOYXZpZ2F0aW9uU3R5bGUiLAorCSJzdG9yZWRBY2Nlc3NpYmlsaXR5VHJhaXRzIiwKKwkic3RvcmVkQWNjZXNzaWJpbGl0eVZpZXdJc01vZGFsIiwKKwkic3RvcmVkSXNBY2Nlc3NpYmlsaXR5RWxlbWVudCIsCisJInN0b3JlZFNob3VsZEdyb3VwQWNjZXNzaWJpbGl0eUNoaWxkcmVuIiwKKwkic3RyaW5nVmFsdWVTYWZlIiwKKwkic3VwZXJjbGFzcyIsCisJInRvTWFueVJlbGF0aW9uc2hpcEtleXMiLAorCSJ0b09uZVJlbGF0aW9uc2hpcEtleXMiLAorCSJ0cmFpdFN0b3JhZ2VMaXN0IiwKKwkidW5fc2FmZUJvb2xWYWx1ZSIsCisJInVzZXJJbnRlcmZhY2VJdGVtSWRlbnRpZmllciIsCisJInV0ZjhWYWx1ZVNhZmUiLAorCSJ2YWx1ZXNGb3JLZXlzV2l0aERpY3Rpb25hcnkiLAorCSJ6b25lIiwKKy8vIFByb3RvY29sOiBDQUFuaW1hdGFibGVWYWx1ZQorLy8gUHJvdG9jb2w6IENBUmVuZGVyVmFsdWUKKy8vIFByb3RvY29sOiBOU09iamVjdAorLy8gUHJvdG9jb2w6IFJPQ0tSZW1vdGVJbnZvY2F0aW9uSW50ZXJmYWNlCit9OwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfb25lb2YuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19vbmVvZi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmVmMjkzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfb25lb2YuY2MKQEAgLTAsMCArMSwxNDAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfb25lb2YuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2Ugb2JqZWN0aXZlYyB7CisKK09uZW9mR2VuZXJhdG9yOjpPbmVvZkdlbmVyYXRvcihjb25zdCBPbmVvZkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSB7CisgIHZhcmlhYmxlc19bImVudW1fbmFtZSJdID0gT25lb2ZFbnVtTmFtZShkZXNjcmlwdG9yXyk7CisgIHZhcmlhYmxlc19bIm5hbWUiXSA9IE9uZW9mTmFtZShkZXNjcmlwdG9yXyk7CisgIHZhcmlhYmxlc19bImNhcGl0YWxpemVkX25hbWUiXSA9IE9uZW9mTmFtZUNhcGl0YWxpemVkKGRlc2NyaXB0b3JfKTsKKyAgdmFyaWFibGVzX1sicmF3X2luZGV4Il0gPSBTdHJDYXQoZGVzY3JpcHRvcl8tPmluZGV4KCkpOworICBjb25zdCBEZXNjcmlwdG9yKiBtc2dfZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKTsKKyAgdmFyaWFibGVzX1sib3duaW5nX21lc3NhZ2VfY2xhc3MiXSA9IENsYXNzTmFtZShtc2dfZGVzY3JpcHRvcik7CisKKyAgc3RkOjpzdHJpbmcgY29tbWVudHM7CisgIFNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uOworICBpZiAoZGVzY3JpcHRvcl8tPkdldFNvdXJjZUxvY2F0aW9uKCZsb2NhdGlvbikpIHsKKyAgICBjb21tZW50cyA9IEJ1aWxkQ29tbWVudHNTdHJpbmcobG9jYXRpb24sIHRydWUpOworICB9IGVsc2UgeworICAgIGNvbW1lbnRzID0gIiI7CisgIH0KKyAgdmFyaWFibGVzX1siY29tbWVudHMiXSA9IGNvbW1lbnRzOworfQorCitPbmVvZkdlbmVyYXRvcjo6fk9uZW9mR2VuZXJhdG9yKCkge30KKwordm9pZCBPbmVvZkdlbmVyYXRvcjo6U2V0T25lb2ZJbmRleEJhc2UoaW50IGluZGV4X2Jhc2UpIHsKKyAgaW50IGluZGV4ID0gZGVzY3JpcHRvcl8tPmluZGV4KCkgKyBpbmRleF9iYXNlOworICAvLyBGbGlwIHRoZSBzaWduIHRvIG1hcmsgaXQgYXMgYSBvbmVvZi4KKyAgdmFyaWFibGVzX1siaW5kZXgiXSA9IFN0ckNhdCgtaW5kZXgpOworfQorCit2b2lkIE9uZW9mR2VuZXJhdG9yOjpHZW5lcmF0ZUNhc2VFbnVtKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICJ0eXBlZGVmIEdQQl9FTlVNKCRlbnVtX25hbWUkKSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkZW51bV9uYW1lJF9HUEJVbnNldE9uZU9mQ2FzZSA9IDAsXG4iKTsKKyAgc3RkOjpzdHJpbmcgZW51bV9uYW1lID0gdmFyaWFibGVzX1siZW51bV9uYW1lIl07CisgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaik7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IEZpZWxkTmFtZUNhcGl0YWxpemVkKGZpZWxkKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiRlbnVtX25hbWUkXyRmaWVsZF9uYW1lJCA9ICRmaWVsZF9udW1iZXIkLFxuIiwKKyAgICAgICAgImVudW1fbmFtZSIsIGVudW1fbmFtZSwKKyAgICAgICAgImZpZWxkX25hbWUiLCBmaWVsZF9uYW1lLAorICAgICAgICAiZmllbGRfbnVtYmVyIiwgU3RyQ2F0KGZpZWxkLT5udW1iZXIoKSkpOworICB9CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAifTtcbiIKKyAgICAgICJcbiIpOworfQorCit2b2lkIE9uZW9mR2VuZXJhdG9yOjpHZW5lcmF0ZVB1YmxpY0Nhc2VQcm9wZXJ0eURlY2xhcmF0aW9uKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIkY29tbWVudHMkIgorICAgICAgIkBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSAkZW51bV9uYW1lJCAkbmFtZSRPbmVPZkNhc2U7XG4iCisgICAgICAiXG4iKTsKK30KKwordm9pZCBPbmVvZkdlbmVyYXRvcjo6R2VuZXJhdGVDbGVhckZ1bmN0aW9uRGVjbGFyYXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIi8qKlxuIgorICAgICAgIiAqIENsZWFycyB3aGF0ZXZlciB2YWx1ZSB3YXMgc2V0IGZvciB0aGUgb25lb2YgJyRuYW1lJCcuXG4iCisgICAgICAiICoqL1xuIgorICAgICAgInZvaWQgJG93bmluZ19tZXNzYWdlX2NsYXNzJF9DbGVhciRjYXBpdGFsaXplZF9uYW1lJE9uZU9mQ2FzZSgkb3duaW5nX21lc3NhZ2VfY2xhc3MkICptZXNzYWdlKTtcbiIpOworfQorCit2b2lkIE9uZW9mR2VuZXJhdG9yOjpHZW5lcmF0ZVByb3BlcnR5SW1wbGVtZW50YXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICB2YXJpYWJsZXNfLAorICAgICAgIkBkeW5hbWljICRuYW1lJE9uZU9mQ2FzZTtcbiIpOworfQorCit2b2lkIE9uZW9mR2VuZXJhdG9yOjpHZW5lcmF0ZUNsZWFyRnVuY3Rpb25JbXBsZW1lbnRhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgIHZhcmlhYmxlc18sCisgICAgICAidm9pZCAkb3duaW5nX21lc3NhZ2VfY2xhc3MkX0NsZWFyJGNhcGl0YWxpemVkX25hbWUkT25lT2ZDYXNlKCRvd25pbmdfbWVzc2FnZV9jbGFzcyQgKm1lc3NhZ2UpIHtcbiIKKyAgICAgICIgIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBbJG93bmluZ19tZXNzYWdlX2NsYXNzJCBkZXNjcmlwdG9yXTtcbiIKKyAgICAgICIgIEdQQk9uZW9mRGVzY3JpcHRvciAqb25lb2YgPSBbZGVzY3JpcHRvci5vbmVvZnMgb2JqZWN0QXRJbmRleDokcmF3X2luZGV4JF07XG4iCisgICAgICAiICBHUEJDbGVhck9uZW9mKG1lc3NhZ2UsIG9uZW9mKTtcbiIKKyAgICAgICJ9XG4iKTsKK30KKworc3RkOjpzdHJpbmcgT25lb2ZHZW5lcmF0b3I6OkRlc2NyaXB0b3JOYW1lKHZvaWQpIGNvbnN0IHsKKyAgcmV0dXJuIHZhcmlhYmxlc18uZmluZCgibmFtZSIpLT5zZWNvbmQ7Cit9CisKK3N0ZDo6c3RyaW5nIE9uZW9mR2VuZXJhdG9yOjpIYXNJbmRleEFzU3RyaW5nKHZvaWQpIGNvbnN0IHsKKyAgcmV0dXJuIHZhcmlhYmxlc18uZmluZCgiaW5kZXgiKS0+c2Vjb25kOworfQorCit9ICAvLyBuYW1lc3BhY2Ugb2JqZWN0aXZlYworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX29uZW9mLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19vbmVvZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNGYwN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19vbmVvZi5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9PQkpFQ1RJVkVDX09ORU9GX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfT0JKRUNUSVZFQ19PTkVPRl9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBvYmplY3RpdmVjIHsKKworY2xhc3MgT25lb2ZHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgT25lb2ZHZW5lcmF0b3IoY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgfk9uZW9mR2VuZXJhdG9yKCk7CisKKyAgT25lb2ZHZW5lcmF0b3IoY29uc3QgT25lb2ZHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKyAgT25lb2ZHZW5lcmF0b3ImIG9wZXJhdG9yPShjb25zdCBPbmVvZkdlbmVyYXRvciYpID0gZGVsZXRlOworCisgIHZvaWQgU2V0T25lb2ZJbmRleEJhc2UoaW50IGluZGV4X2Jhc2UpOworCisgIHZvaWQgR2VuZXJhdGVDYXNlRW51bShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgdm9pZCBHZW5lcmF0ZVB1YmxpY0Nhc2VQcm9wZXJ0eURlY2xhcmF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZUNsZWFyRnVuY3Rpb25EZWNsYXJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgdm9pZCBHZW5lcmF0ZVByb3BlcnR5SW1wbGVtZW50YXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlQ2xlYXJGdW5jdGlvbkltcGxlbWVudGF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICBzdGQ6OnN0cmluZyBEZXNjcmlwdG9yTmFtZSh2b2lkKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgSGFzSW5kZXhBc1N0cmluZyh2b2lkKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyaWFibGVzXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBvYmplY3RpdmVjCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9PQkpFQ1RJVkVDX09ORU9GX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfcHJpbWl0aXZlX2ZpZWxkLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfcHJpbWl0aXZlX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZWZkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19wcmltaXRpdmVfZmllbGQuY2MKQEAgLTAsMCArMSwxODggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfcHJpbWl0aXZlX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIG9iamVjdGl2ZWMgeworCit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTsKKworbmFtZXNwYWNlIHsKKworY29uc3QgY2hhciogUHJpbWl0aXZlVHlwZU5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIE9iamVjdGl2ZUNUeXBlIHR5cGUgPSBHZXRPYmplY3RpdmVDVHlwZShkZXNjcmlwdG9yKTsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9JTlQzMjoKKyAgICAgIHJldHVybiAiaW50MzJfdCI7CisgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9VSU5UMzI6CisgICAgICByZXR1cm4gInVpbnQzMl90IjsKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX0lOVDY0OgorICAgICAgcmV0dXJuICJpbnQ2NF90IjsKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiAidWludDY0X3QiOworICAgIGNhc2UgT0JKRUNUSVZFQ1RZUEVfRkxPQVQ6CisgICAgICByZXR1cm4gImZsb2F0IjsKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX0JPT0xFQU46CisgICAgICByZXR1cm4gIkJPT0wiOworICAgIGNhc2UgT0JKRUNUSVZFQ1RZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJOU1N0cmluZyI7CisgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9EQVRBOgorICAgICAgcmV0dXJuICJOU0RhdGEiOworICAgIGNhc2UgT0JKRUNUSVZFQ1RZUEVfRU5VTToKKyAgICAgIHJldHVybiAiaW50MzJfdCI7CisgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9NRVNTQUdFOgorICAgICAgcmV0dXJuIE5VTEw7ICAvLyBNZXNzYWdlcyBnbyB0aHJvdWdoIG9iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5jY3xoLgorICB9CisKKyAgLy8gU29tZSBjb21waWxlcnMgcmVwb3J0IHJlYWNoaW5nIGVuZCBvZiBmdW5jdGlvbiBldmVuIHRob3VnaCBhbGwgY2FzZXMgb2YKKyAgLy8gdGhlIGVudW0gYXJlIGhhbmRlZCBpbiB0aGUgc3dpdGNoLgorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IGNoYXIqIFByaW1pdGl2ZUFycmF5VHlwZU5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIE9iamVjdGl2ZUNUeXBlIHR5cGUgPSBHZXRPYmplY3RpdmVDVHlwZShkZXNjcmlwdG9yKTsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9JTlQzMjoKKyAgICAgIHJldHVybiAiSW50MzIiOworICAgIGNhc2UgT0JKRUNUSVZFQ1RZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuICJVSW50MzIiOworICAgIGNhc2UgT0JKRUNUSVZFQ1RZUEVfSU5UNjQ6CisgICAgICByZXR1cm4gIkludDY0IjsKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiAiVUludDY0IjsKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuICJGbG9hdCI7CisgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIkRvdWJsZSI7CisgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9CT09MRUFOOgorICAgICAgcmV0dXJuICJCb29sIjsKKyAgICBjYXNlIE9CSkVDVElWRUNUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiIjsgIC8vIFdhbnQgTlNBcnJheQorICAgIGNhc2UgT0JKRUNUSVZFQ1RZUEVfREFUQToKKyAgICAgIHJldHVybiAiIjsgIC8vIFdhbnQgTlNBcnJheQorICAgIGNhc2UgT0JKRUNUSVZFQ1RZUEVfRU5VTToKKyAgICAgIHJldHVybiAiRW51bSI7CisgICAgY2FzZSBPQkpFQ1RJVkVDVFlQRV9NRVNTQUdFOgorICAgICAgLy8gV2FudCBOU0FycmF5IChidXQgZ29lcyB0aHJvdWdoIG9iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5jY3xoKS4KKyAgICAgIHJldHVybiAiIjsKKyAgfQorCisgIC8vIFNvbWUgY29tcGlsZXJzIHJlcG9ydCByZWFjaGluZyBlbmQgb2YgZnVuY3Rpb24gZXZlbiB0aG91Z2ggYWxsIGNhc2VzIG9mCisgIC8vIHRoZSBlbnVtIGFyZSBoYW5kZWQgaW4gdGhlIHN3aXRjaC4KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBOVUxMOworfQorCit2b2lkIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgc3RkOjpzdHJpbmcgcHJpbWl0aXZlX25hbWUgPSBQcmltaXRpdmVUeXBlTmFtZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJ0eXBlIl0gPSBwcmltaXRpdmVfbmFtZTsKKyAgKCp2YXJpYWJsZXMpWyJzdG9yYWdlX3R5cGUiXSA9IHByaW1pdGl2ZV9uYW1lOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OlByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikKKyAgICA6IFNpbmdsZUZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IpIHsKKyAgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfKTsKK30KKworUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6On5QcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRmllbGRTdG9yYWdlRGVjbGFyYXRpb24oCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKEdldE9iamVjdGl2ZUNUeXBlKGRlc2NyaXB0b3JfKSA9PSBPQkpFQ1RJVkVDVFlQRV9CT09MRUFOKSB7CisgICAgLy8gTm90aGluZywgQk9PTHMgYXJlIHN0b3JlZCBpbiB0aGUgaGFzIGJpdHMuCisgIH0gZWxzZSB7CisgICAgU2luZ2xlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRmllbGRTdG9yYWdlRGVjbGFyYXRpb24ocHJpbnRlcik7CisgIH0KK30KKworaW50IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpFeHRyYVJ1bnRpbWVIYXNCaXRzTmVlZGVkKHZvaWQpIGNvbnN0IHsKKyAgaWYgKEdldE9iamVjdGl2ZUNUeXBlKGRlc2NyaXB0b3JfKSA9PSBPQkpFQ1RJVkVDVFlQRV9CT09MRUFOKSB7CisgICAgLy8gUmVzZXJ2ZSBhIGJpdCBmb3IgdGhlIHN0b3JhZ2Ugb2YgdGhlIGJvb2xlYW4uCisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OlNldEV4dHJhUnVudGltZUhhc0JpdHNCYXNlKGludCBoYXNfYmFzZSkgeworICBpZiAoR2V0T2JqZWN0aXZlQ1R5cGUoZGVzY3JpcHRvcl8pID09IE9CSkVDVElWRUNUWVBFX0JPT0xFQU4pIHsKKyAgICAvLyBTZXQgaW50byB0aGUgb2Zmc2V0IHRoZSBoYXMgYml0IHRvIHVzZSBmb3IgdGhlIGFjdHVhbCB2YWx1ZS4KKyAgICB2YXJpYWJsZXNfWyJzdG9yYWdlX29mZnNldF92YWx1ZSJdID0gU3RyQ2F0KGhhc19iYXNlKTsKKyAgICB2YXJpYWJsZXNfWyJzdG9yYWdlX29mZnNldF9jb21tZW50Il0gPQorICAgICAgICAiICAvLyBTdG9yZWQgaW4gX2hhc19zdG9yYWdlXyB0byBzYXZlIHNwYWNlLiI7CisgIH0KK30KKworUHJpbWl0aXZlT2JqRmllbGRHZW5lcmF0b3I6OlByaW1pdGl2ZU9iakZpZWxkR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikKKyAgICA6IE9iakNPYmpGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yKSB7CisgIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7CisgIHZhcmlhYmxlc19bInByb3BlcnR5X3N0b3JhZ2VfYXR0cmlidXRlIl0gPSAiY29weSI7Cit9CisKK1ByaW1pdGl2ZU9iakZpZWxkR2VuZXJhdG9yOjp+UHJpbWl0aXZlT2JqRmllbGRHZW5lcmF0b3IoKSB7fQorCitSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikKKyAgICA6IFJlcGVhdGVkRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvcikgeworICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18pOworCisgIHN0ZDo6c3RyaW5nIGJhc2VfbmFtZSA9IFByaW1pdGl2ZUFycmF5VHlwZU5hbWUoZGVzY3JpcHRvcik7CisgIGlmIChiYXNlX25hbWUubGVuZ3RoKCkpIHsKKyAgICB2YXJpYWJsZXNfWyJhcnJheV9zdG9yYWdlX3R5cGUiXSA9ICJHUEIiICsgYmFzZV9uYW1lICsgIkFycmF5IjsKKyAgfSBlbHNlIHsKKyAgICB2YXJpYWJsZXNfWyJhcnJheV9zdG9yYWdlX3R5cGUiXSA9ICJOU011dGFibGVBcnJheSI7CisgICAgdmFyaWFibGVzX1siYXJyYXlfcHJvcGVydHlfdHlwZSJdID0KKyAgICAgICAgIk5TTXV0YWJsZUFycmF5PCIgKyB2YXJpYWJsZXNfWyJzdG9yYWdlX3R5cGUiXSArICIqPiI7CisgIH0KK30KKworUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKSB7fQorCit9ICAvLyBuYW1lc3BhY2Ugb2JqZWN0aXZlYworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX3ByaW1pdGl2ZV9maWVsZC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfcHJpbWl0aXZlX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhMTUyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX3ByaW1pdGl2ZV9maWVsZC5oCkBAIC0wLDAgKzEsODcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9PQkpFQ1RJVkVDX1BSSU1JVElWRV9GSUVMRF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX09CSkVDVElWRUNfUFJJTUlUSVZFX0ZJRUxEX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIG9iamVjdGl2ZWMgeworCitjbGFzcyBQcmltaXRpdmVGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBTaW5nbGVGaWVsZEdlbmVyYXRvciB7CisgIGZyaWVuZCBGaWVsZEdlbmVyYXRvciogRmllbGRHZW5lcmF0b3I6Ok1ha2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIHZpcnR1YWwgflByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKCk7CisKKyAgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoY29uc3QgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3ImKSA9IGRlbGV0ZTsKKyAgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3ImIG9wZXJhdG9yPShjb25zdCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUZpZWxkU3RvcmFnZURlY2xhcmF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCBvdmVycmlkZTsKKworICB2aXJ0dWFsIGludCBFeHRyYVJ1bnRpbWVIYXNCaXRzTmVlZGVkKHZvaWQpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU2V0RXh0cmFSdW50aW1lSGFzQml0c0Jhc2UoaW50IGluZGV4X2Jhc2UpIG92ZXJyaWRlOworfTsKKworY2xhc3MgUHJpbWl0aXZlT2JqRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgT2JqQ09iakZpZWxkR2VuZXJhdG9yIHsKKyAgZnJpZW5kIEZpZWxkR2VuZXJhdG9yKiBGaWVsZEdlbmVyYXRvcjo6TWFrZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgUHJpbWl0aXZlT2JqRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgdmlydHVhbCB+UHJpbWl0aXZlT2JqRmllbGRHZW5lcmF0b3IoKTsKKworICBQcmltaXRpdmVPYmpGaWVsZEdlbmVyYXRvcihjb25zdCBQcmltaXRpdmVPYmpGaWVsZEdlbmVyYXRvciYpID0gZGVsZXRlOworICBQcmltaXRpdmVPYmpGaWVsZEdlbmVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IFByaW1pdGl2ZU9iakZpZWxkR2VuZXJhdG9yJikgPQorICAgICAgZGVsZXRlOworfTsKKworY2xhc3MgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBSZXBlYXRlZEZpZWxkR2VuZXJhdG9yIHsKKyAgZnJpZW5kIEZpZWxkR2VuZXJhdG9yKiBGaWVsZEdlbmVyYXRvcjo6TWFrZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICB2aXJ0dWFsIH5SZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKCk7CisKKyAgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yJikgPQorICAgICAgZGVsZXRlOworICBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yJiBvcGVyYXRvcj0oCisgICAgICBjb25zdCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yJikgPSBkZWxldGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugb2JqZWN0aXZlYworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfT0JKRUNUSVZFQ19QUklNSVRJVkVfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhY2thZ2VfaW5mby5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYWNrYWdlX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDVlZjYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYWNrYWdlX2luZm8uaApAQCAtMCwwICsxLDYzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIGV4aXN0cyBzb2xlbHkgdG8gZG9jdW1lbnQgdGhlIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyIG5hbWVzcGFjZS4KKy8vIEl0IGlzIG5vdCBjb21waWxlZCBpbnRvIGFueXRoaW5nLCBidXQgaXQgbWF5IGJlIHJlYWQgYnkgYW4gYXV0b21hdGVkCisvLyBkb2N1bWVudGF0aW9uIGdlbmVyYXRvci4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHJvdG9jb2wgQnVmZmVyIGNvbXBpbGVyLgorLy8KKy8vIFRoaXMgcGFja2FnZSBjb250YWlucyBjb2RlIGZvciBwYXJzaW5nIC5wcm90byBmaWxlcyBhbmQgZ2VuZXJhdGluZyBjb2RlCisvLyBiYXNlZCBvbiB0aGVtLiAgVGhlcmUgYXJlIHR3byByZWFzb25zIHlvdSBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoaXMKKy8vIHBhY2thZ2U6CisvLyAtIFlvdSB3YW50IHRvIHBhcnNlIC5wcm90byBmaWxlcyBhdCBydW50aW1lLiAgSW4gdGhpcyBjYXNlLCB5b3Ugc2hvdWxkCisvLyAgIGxvb2sgYXQgaW1wb3J0ZXIuaC4gIFNpbmNlIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyB3aWRlbHkgdXNlZnVsLCBpdCBpcworLy8gICBpbmNsdWRlZCBpbiB0aGUgbGlicHJvdG9idWYgYmFzZSBsaWJyYXJ5OyB5b3UgZG8gbm90IGhhdmUgdG8gbGluayBhZ2FpbnN0CisvLyAgIGxpYnByb3RvYy4KKy8vIC0gWW91IHdhbnQgdG8gd3JpdGUgYSBjdXN0b20gcHJvdG9jb2wgY29tcGlsZXIgd2hpY2ggZ2VuZXJhdGVzIGRpZmZlcmVudAorLy8gICBraW5kcyBvZiBjb2RlLCBlLmcuIGNvZGUgaW4gYSBkaWZmZXJlbnQgbGFuZ3VhZ2Ugd2hpY2ggaXMgbm90IHN1cHBvcnRlZAorLy8gICBieSB0aGUgb2ZmaWNpYWwgY29tcGlsZXIuICBGb3IgdGhpcyBwdXJwb3NlLCBjb21tYW5kX2xpbmVfaW50ZXJmYWNlLmgKKy8vICAgcHJvdmlkZXMgeW91IHdpdGggYSBjb21wbGV0ZSBjb21waWxlciBmcm9udC1lbmQsIHNvIGFsbCB5b3UgbmVlZCB0byBkbworLy8gICBpcyB3cml0ZSBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBDb2RlR2VuZXJhdG9yIGFuZCBhIHRyaXZpYWwgbWFpbigpCisvLyAgIGZ1bmN0aW9uLiAgWW91IGNhbiBldmVuIG1ha2UgeW91ciBjb21waWxlciBzdXBwb3J0IHRoZSBvZmZpY2lhbCBsYW5ndWFnZXMKKy8vICAgaW4gYWRkaXRpb24gdG8geW91ciBvd24uICBTaW5jZSB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgb25seSB1c2VmdWwgdG8gdGhvc2UKKy8vICAgd3JpdGluZyBjdXN0b20gY29tcGlsZXJzLCBpdCBpcyBpbiBhIHNlcGFyYXRlIGxpYnJhcnkgY2FsbGVkICJsaWJwcm90b2MiCisvLyAgIHdoaWNoIHlvdSB3aWxsIGhhdmUgdG8gbGluayBhZ2FpbnN0LgorbmFtZXNwYWNlIGNvbXBpbGVyIHt9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQzN2QxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuY2MKQEAgLTAsMCArMSwyNDQ2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gUmVjdXJzaXZlIGRlc2NlbnQgRlRXLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5oPgorCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKKworbmFtZXNwYWNlIHsKKwordHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlPiBUeXBlTmFtZU1hcDsKKworY29uc3QgVHlwZU5hbWVNYXAmIEdldFR5cGVOYW1lVGFibGUoKSB7CisgIHN0YXRpYyBhdXRvKiB0YWJsZSA9IG5ldyBhdXRvKFtdKCkgeworICAgIFR5cGVOYW1lTWFwIHJlc3VsdDsKKworICAgIHJlc3VsdFsiZG91YmxlIl0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9ET1VCTEU7CisgICAgcmVzdWx0WyJmbG9hdCJdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRkxPQVQ7CisgICAgcmVzdWx0WyJ1aW50NjQiXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1VJTlQ2NDsKKyAgICByZXN1bHRbImZpeGVkNjQiXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZJWEVENjQ7CisgICAgcmVzdWx0WyJmaXhlZDMyIl0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9GSVhFRDMyOworICAgIHJlc3VsdFsiYm9vbCJdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfQk9PTDsKKyAgICByZXN1bHRbInN0cmluZyJdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HOworICAgIHJlc3VsdFsiZ3JvdXAiXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0dST1VQOworCisgICAgcmVzdWx0WyJieXRlcyJdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfQllURVM7CisgICAgcmVzdWx0WyJ1aW50MzIiXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1VJTlQzMjsKKyAgICByZXN1bHRbInNmaXhlZDMyIl0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TRklYRUQzMjsKKyAgICByZXN1bHRbInNmaXhlZDY0Il0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TRklYRUQ2NDsKKyAgICByZXN1bHRbImludDMyIl0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMjsKKyAgICByZXN1bHRbImludDY0Il0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQ2NDsKKyAgICByZXN1bHRbInNpbnQzMiJdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0lOVDMyOworICAgIHJlc3VsdFsic2ludDY0Il0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TSU5UNjQ7CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9KCkpOworICByZXR1cm4gKnRhYmxlOworfQorCisvLyBDYW1lbC1jYXNlIHRoZSBmaWVsZCBuYW1lIGFuZCBhcHBlbmQgIkVudHJ5IiBmb3IgZ2VuZXJhdGVkIG1hcCBlbnRyeSBuYW1lLgorLy8gZS5nLiBtYXA8S2V5VHlwZSwgVmFsdWVUeXBlPiBmb29fbWFwID0+IEZvb01hcEVudHJ5CitzdGQ6OnN0cmluZyBNYXBFbnRyeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkX25hbWUpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICBzdGF0aWMgY29uc3QgY2hhciBrU3VmZml4W10gPSAiRW50cnkiOworICByZXN1bHQucmVzZXJ2ZShmaWVsZF9uYW1lLnNpemUoKSArIHNpemVvZihrU3VmZml4KSk7CisgIGJvb2wgY2FwX25leHQgPSB0cnVlOworICBmb3IgKGNvbnN0IGNoYXIgZmllbGRfbmFtZV9jaGFyIDogZmllbGRfbmFtZSkgeworICAgIGlmIChmaWVsZF9uYW1lX2NoYXIgPT0gJ18nKSB7CisgICAgICBjYXBfbmV4dCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChjYXBfbmV4dCkgeworICAgICAgLy8gTm90ZTogRG8gbm90IHVzZSBjdHlwZS5oIGR1ZSB0byBsb2NhbGVzLgorICAgICAgaWYgKCdhJyA8PSBmaWVsZF9uYW1lX2NoYXIgJiYgZmllbGRfbmFtZV9jaGFyIDw9ICd6JykgeworICAgICAgICByZXN1bHQucHVzaF9iYWNrKGZpZWxkX25hbWVfY2hhciAtICdhJyArICdBJyk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQucHVzaF9iYWNrKGZpZWxkX25hbWVfY2hhcik7CisgICAgICB9CisgICAgICBjYXBfbmV4dCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQucHVzaF9iYWNrKGZpZWxkX25hbWVfY2hhcik7CisgICAgfQorICB9CisgIHJlc3VsdC5hcHBlbmQoa1N1ZmZpeCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgSXNVcHBlcmNhc2UoY2hhciBjKSB7IHJldHVybiBjID49ICdBJyAmJiBjIDw9ICdaJzsgfQorCitib29sIElzTG93ZXJjYXNlKGNoYXIgYykgeyByZXR1cm4gYyA+PSAnYScgJiYgYyA8PSAneic7IH0KKworYm9vbCBJc051bWJlcihjaGFyIGMpIHsgcmV0dXJuIGMgPj0gJzAnICYmIGMgPD0gJzknOyB9CisKK2Jvb2wgSXNVcHBlckNhbWVsQ2FzZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgLy8gTmFtZSBtdXN0IHN0YXJ0IHdpdGggYW4gdXBwZXIgY2FzZSBjaGFyYWN0ZXIuCisgIGlmICghSXNVcHBlcmNhc2UobmFtZVswXSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTXVzdCBub3QgY29udGFpbnMgdW5kZXJzY29yZS4KKyAgZm9yIChjb25zdCBjaGFyIGMgOiBuYW1lKSB7CisgICAgaWYgKGMgPT0gJ18nKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIElzVXBwZXJVbmRlcnNjb3JlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIGZvciAoY29uc3QgY2hhciBjIDogbmFtZSkgeworICAgIGlmICghSXNVcHBlcmNhc2UoYykgJiYgYyAhPSAnXycgJiYgIUlzTnVtYmVyKGMpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIElzTG93ZXJVbmRlcnNjb3JlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIGZvciAoY29uc3QgY2hhciBjIDogbmFtZSkgeworICAgIGlmICghSXNMb3dlcmNhc2UoYykgJiYgYyAhPSAnXycgJiYgIUlzTnVtYmVyKGMpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIElzTnVtYmVyRm9sbG93VW5kZXJzY29yZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICBmb3IgKGludCBpID0gMTsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgeworICAgIGNvbnN0IGNoYXIgYyA9IG5hbWVbaV07CisgICAgaWYgKElzTnVtYmVyKGMpICYmIG5hbWVbaSAtIDFdID09ICdfJykgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBNYWtlcyBjb2RlIHNsaWdodGx5IG1vcmUgcmVhZGFibGUuICBUaGUgbWVhbmluZyBvZiAiRE8oZm9vKSIgaXMKKy8vICJFeGVjdXRlIGZvbyBhbmQgZmFpbCBpZiBpdCBmYWlscy4iLCB3aGVyZSBmYWlsdXJlIGlzIGluZGljYXRlZCBieQorLy8gcmV0dXJuaW5nIGZhbHNlLgorI2RlZmluZSBETyhTVEFURU1FTlQpIFwKKyAgaWYgKFNUQVRFTUVOVCkgeyAgICBcCisgIH0gZWxzZSAgICAgICAgICAgICAgXAorICAgIHJldHVybiBmYWxzZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1BhcnNlcjo6UGFyc2VyKCkKKyAgICA6IGlucHV0XyhudWxscHRyKSwKKyAgICAgIGVycm9yX2NvbGxlY3Rvcl8obnVsbHB0ciksCisgICAgICBzb3VyY2VfbG9jYXRpb25fdGFibGVfKG51bGxwdHIpLAorICAgICAgaGFkX2Vycm9yc18oZmFsc2UpLAorICAgICAgcmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl8oZmFsc2UpLAorICAgICAgc3RvcF9hZnRlcl9zeW50YXhfaWRlbnRpZmllcl8oZmFsc2UpIHsKK30KKworUGFyc2VyOjp+UGFyc2VyKCkge30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmxpbmUgYm9vbCBQYXJzZXI6Okxvb2tpbmdBdChjb25zdCBjaGFyKiB0ZXh0KSB7CisgIHJldHVybiBpbnB1dF8tPmN1cnJlbnQoKS50ZXh0ID09IHRleHQ7Cit9CisKK2lubGluZSBib29sIFBhcnNlcjo6TG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUb2tlblR5cGUgdG9rZW5fdHlwZSkgeworICByZXR1cm4gaW5wdXRfLT5jdXJyZW50KCkudHlwZSA9PSB0b2tlbl90eXBlOworfQorCitpbmxpbmUgYm9vbCBQYXJzZXI6OkF0RW5kKCkgeyByZXR1cm4gTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0VORCk7IH0KKworYm9vbCBQYXJzZXI6OlRyeUNvbnN1bWUoY29uc3QgY2hhciogdGV4dCkgeworICBpZiAoTG9va2luZ0F0KHRleHQpKSB7CisgICAgaW5wdXRfLT5OZXh0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgUGFyc2VyOjpDb25zdW1lKGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IGNoYXIqIGVycm9yKSB7CisgIGlmIChUcnlDb25zdW1lKHRleHQpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgQWRkRXJyb3IoZXJyb3IpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIFBhcnNlcjo6Q29uc3VtZShjb25zdCBjaGFyKiB0ZXh0KSB7CisgIHN0ZDo6c3RyaW5nIGVycm9yID0gIkV4cGVjdGVkIFwiIiArIHN0ZDo6c3RyaW5nKHRleHQpICsgIlwiLiI7CisgIHJldHVybiBDb25zdW1lKHRleHQsIGVycm9yLmNfc3RyKCkpOworfQorCitib29sIFBhcnNlcjo6Q29uc3VtZUlkZW50aWZpZXIoc3RkOjpzdHJpbmcqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpIHsKKyAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSKSkgeworICAgICpvdXRwdXQgPSBpbnB1dF8tPmN1cnJlbnQoKS50ZXh0OworICAgIGlucHV0Xy0+TmV4dCgpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIEFkZEVycm9yKGVycm9yKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBQYXJzZXI6OkNvbnN1bWVJbnRlZ2VyKGludCogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcikgeworICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7CisgICAgdWludDY0X3QgdmFsdWUgPSAwOworICAgIGlmICghaW86OlRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKGlucHV0Xy0+Y3VycmVudCgpLnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgQWRkRXJyb3IoIkludGVnZXIgb3V0IG9mIHJhbmdlLiIpOworICAgICAgLy8gV2Ugc3RpbGwgcmV0dXJuIHRydWUgYmVjYXVzZSB3ZSBkaWQsIGluIGZhY3QsIHBhcnNlIGFuIGludGVnZXIuCisgICAgfQorICAgICpvdXRwdXQgPSB2YWx1ZTsKKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBBZGRFcnJvcihlcnJvcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgUGFyc2VyOjpDb25zdW1lU2lnbmVkSW50ZWdlcihpbnQqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpIHsKKyAgYm9vbCBpc19uZWdhdGl2ZSA9IGZhbHNlOworICB1aW50NjRfdCBtYXhfdmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKTsKKyAgaWYgKFRyeUNvbnN1bWUoIi0iKSkgeworICAgIGlzX25lZ2F0aXZlID0gdHJ1ZTsKKyAgICBtYXhfdmFsdWUgKz0gMTsKKyAgfQorICB1aW50NjRfdCB2YWx1ZSA9IDA7CisgIERPKENvbnN1bWVJbnRlZ2VyNjQobWF4X3ZhbHVlLCAmdmFsdWUsIGVycm9yKSk7CisgIGlmIChpc19uZWdhdGl2ZSkgdmFsdWUgKj0gLTE7CisgICpvdXRwdXQgPSB2YWx1ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpDb25zdW1lSW50ZWdlcjY0KHVpbnQ2NF90IG1heF92YWx1ZSwgdWludDY0X3QqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVycm9yKSB7CisgIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfSU5URUdFUikpIHsKKyAgICBpZiAoIWlvOjpUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcihpbnB1dF8tPmN1cnJlbnQoKS50ZXh0LCBtYXhfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KSkgeworICAgICAgQWRkRXJyb3IoIkludGVnZXIgb3V0IG9mIHJhbmdlLiIpOworICAgICAgLy8gV2Ugc3RpbGwgcmV0dXJuIHRydWUgYmVjYXVzZSB3ZSBkaWQsIGluIGZhY3QsIHBhcnNlIGFuIGludGVnZXIuCisgICAgICAqb3V0cHV0ID0gMDsKKyAgICB9CisgICAgaW5wdXRfLT5OZXh0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgQWRkRXJyb3IoZXJyb3IpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIFBhcnNlcjo6Q29uc3VtZU51bWJlcihkb3VibGUqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpIHsKKyAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9GTE9BVCkpIHsKKyAgICAqb3V0cHV0ID0gaW86OlRva2VuaXplcjo6UGFyc2VGbG9hdChpbnB1dF8tPmN1cnJlbnQoKS50ZXh0KTsKKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfSU5URUdFUikpIHsKKyAgICAvLyBBbHNvIGFjY2VwdCBpbnRlZ2Vycy4KKyAgICB1aW50NjRfdCB2YWx1ZSA9IDA7CisgICAgaWYgKCFpbzo6VG9rZW5pemVyOjpQYXJzZUludGVnZXIoaW5wdXRfLT5jdXJyZW50KCkudGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgQWRkRXJyb3IoIkludGVnZXIgb3V0IG9mIHJhbmdlLiIpOworICAgICAgLy8gV2Ugc3RpbGwgcmV0dXJuIHRydWUgYmVjYXVzZSB3ZSBkaWQsIGluIGZhY3QsIHBhcnNlIGEgbnVtYmVyLgorICAgIH0KKyAgICAqb3V0cHV0ID0gdmFsdWU7CisgICAgaW5wdXRfLT5OZXh0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJpbmYiKSkgeworICAgICpvdXRwdXQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgICAgaW5wdXRfLT5OZXh0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJuYW4iKSkgeworICAgICpvdXRwdXQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OnF1aWV0X05hTigpOworICAgIGlucHV0Xy0+TmV4dCgpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIEFkZEVycm9yKGVycm9yKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBQYXJzZXI6OkNvbnN1bWVTdHJpbmcoc3RkOjpzdHJpbmcqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpIHsKKyAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkcpKSB7CisgICAgaW86OlRva2VuaXplcjo6UGFyc2VTdHJpbmcoaW5wdXRfLT5jdXJyZW50KCkudGV4dCwgb3V0cHV0KTsKKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgICAvLyBBbGxvdyBDKysgbGlrZSBjb25jYXRlbmF0aW9uIG9mIGFkamFjZW50IHN0cmluZyB0b2tlbnMuCisgICAgd2hpbGUgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkcpKSB7CisgICAgICBpbzo6VG9rZW5pemVyOjpQYXJzZVN0cmluZ0FwcGVuZChpbnB1dF8tPmN1cnJlbnQoKS50ZXh0LCBvdXRwdXQpOworICAgICAgaW5wdXRfLT5OZXh0KCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIEFkZEVycm9yKGVycm9yKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBQYXJzZXI6OlRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKGNvbnN0IGNoYXIqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciogbG9jYXRpb24pIHsKKyAgaWYgKExvb2tpbmdBdCh0ZXh0KSkgeworICAgIHN0ZDo6c3RyaW5nIGxlYWRpbmcsIHRyYWlsaW5nOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZXRhY2hlZDsKKyAgICBpbnB1dF8tPk5leHRXaXRoQ29tbWVudHMoJnRyYWlsaW5nLCAmZGV0YWNoZWQsICZsZWFkaW5nKTsKKworICAgIC8vIFNhdmUgdGhlIGxlYWRpbmcgY29tbWVudHMgZm9yIG5leHQgdGltZSwgYW5kIHJlY2FsbCB0aGUgbGVhZGluZyBjb21tZW50cworICAgIC8vIGZyb20gbGFzdCB0aW1lLgorICAgIGxlYWRpbmcuc3dhcCh1cGNvbWluZ19kb2NfY29tbWVudHNfKTsKKworICAgIGlmIChsb2NhdGlvbiAhPSBudWxscHRyKSB7CisgICAgICB1cGNvbWluZ19kZXRhY2hlZF9jb21tZW50c18uc3dhcChkZXRhY2hlZCk7CisgICAgICBsb2NhdGlvbi0+QXR0YWNoQ29tbWVudHMoJmxlYWRpbmcsICZ0cmFpbGluZywgJmRldGFjaGVkKTsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcCh0ZXh0LCAifSIpID09IDApIHsKKyAgICAgIC8vIElmIHRoZSBjdXJyZW50IGxvY2F0aW9uIGlzIG51bGwgYW5kIHdlIGFyZSBmaW5pc2hpbmcgdGhlIGN1cnJlbnQgc2NvcGUsCisgICAgICAvLyBkcm9wIHBlbmRpbmcgdXBjb21pbmcgZGV0YWNoZWQgY29tbWVudHMuCisgICAgICB1cGNvbWluZ19kZXRhY2hlZF9jb21tZW50c18uc3dhcChkZXRhY2hlZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE90aGVyd2lzZSwgYXBwZW5kIHRoZSBuZXcgZGV0YWNoZWQgY29tbWVudHMgdG8gdGhlIGV4aXN0aW5nIHVwY29taW5nCisgICAgICAvLyBkZXRhY2hlZCBjb21tZW50cy4KKyAgICAgIHVwY29taW5nX2RldGFjaGVkX2NvbW1lbnRzXy5pbnNlcnQodXBjb21pbmdfZGV0YWNoZWRfY29tbWVudHNfLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZC5iZWdpbigpLCBkZXRhY2hlZC5lbmQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgUGFyc2VyOjpDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbihjb25zdCBjaGFyKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXIqIGxvY2F0aW9uKSB7CisgIGlmIChUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbih0ZXh0LCBsb2NhdGlvbikpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBBZGRFcnJvcigiRXhwZWN0ZWQgXCIiICsgc3RkOjpzdHJpbmcodGV4dCkgKyAiXCIuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBQYXJzZXI6OkFkZEVycm9yKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IpIHsKKyAgaWYgKGVycm9yX2NvbGxlY3Rvcl8gIT0gbnVsbHB0cikgeworICAgIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKGxpbmUsIGNvbHVtbiwgZXJyb3IpOworICB9CisgIGhhZF9lcnJvcnNfID0gdHJ1ZTsKK30KKwordm9pZCBQYXJzZXI6OkFkZEVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcikgeworICBBZGRFcnJvcihpbnB1dF8tPmN1cnJlbnQoKS5saW5lLCBpbnB1dF8tPmN1cnJlbnQoKS5jb2x1bW4sIGVycm9yKTsKK30KKwordm9pZCBQYXJzZXI6OkFkZFdhcm5pbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHdhcm5pbmcpIHsKKyAgaWYgKGVycm9yX2NvbGxlY3Rvcl8gIT0gbnVsbHB0cikgeworICAgIGVycm9yX2NvbGxlY3Rvcl8tPkFkZFdhcm5pbmcoaW5wdXRfLT5jdXJyZW50KCkubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Xy0+Y3VycmVudCgpLmNvbHVtbiwgd2FybmluZyk7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkxvY2F0aW9uUmVjb3JkZXIoUGFyc2VyKiBwYXJzZXIpCisgICAgOiBwYXJzZXJfKHBhcnNlciksCisgICAgICBzb3VyY2VfY29kZV9pbmZvXyhwYXJzZXItPnNvdXJjZV9jb2RlX2luZm9fKSwKKyAgICAgIGxvY2F0aW9uXyhwYXJzZXJfLT5zb3VyY2VfY29kZV9pbmZvXy0+YWRkX2xvY2F0aW9uKCkpIHsKKyAgbG9jYXRpb25fLT5hZGRfc3BhbihwYXJzZXJfLT5pbnB1dF8tPmN1cnJlbnQoKS5saW5lKTsKKyAgbG9jYXRpb25fLT5hZGRfc3BhbihwYXJzZXJfLT5pbnB1dF8tPmN1cnJlbnQoKS5jb2x1bW4pOworfQorCitQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkxvY2F0aW9uUmVjb3JkZXIoY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50KSB7CisgIEluaXQocGFyZW50LCBwYXJlbnQuc291cmNlX2NvZGVfaW5mb18pOworfQorCitQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkxvY2F0aW9uUmVjb3JkZXIoY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXRoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VDb2RlSW5mbyogc291cmNlX2NvZGVfaW5mbykgeworICBJbml0KHBhcmVudCwgc291cmNlX2NvZGVfaW5mbyk7CisgIEFkZFBhdGgocGF0aDEpOworfQorCitQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkxvY2F0aW9uUmVjb3JkZXIoY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXRoMSkgeworICBJbml0KHBhcmVudCwgcGFyZW50LnNvdXJjZV9jb2RlX2luZm9fKTsKKyAgQWRkUGF0aChwYXRoMSk7Cit9CisKK1BhcnNlcjo6TG9jYXRpb25SZWNvcmRlcjo6TG9jYXRpb25SZWNvcmRlcihjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhdGgxLCBpbnQgcGF0aDIpIHsKKyAgSW5pdChwYXJlbnQsIHBhcmVudC5zb3VyY2VfY29kZV9pbmZvXyk7CisgIEFkZFBhdGgocGF0aDEpOworICBBZGRQYXRoKHBhdGgyKTsKK30KKwordm9pZCBQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkluaXQoY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlQ29kZUluZm8qIHNvdXJjZV9jb2RlX2luZm8pIHsKKyAgcGFyc2VyXyA9IHBhcmVudC5wYXJzZXJfOworICBzb3VyY2VfY29kZV9pbmZvXyA9IHNvdXJjZV9jb2RlX2luZm87CisKKyAgbG9jYXRpb25fID0gc291cmNlX2NvZGVfaW5mb18tPmFkZF9sb2NhdGlvbigpOworICBsb2NhdGlvbl8tPm11dGFibGVfcGF0aCgpLT5Db3B5RnJvbShwYXJlbnQubG9jYXRpb25fLT5wYXRoKCkpOworCisgIGxvY2F0aW9uXy0+YWRkX3NwYW4ocGFyc2VyXy0+aW5wdXRfLT5jdXJyZW50KCkubGluZSk7CisgIGxvY2F0aW9uXy0+YWRkX3NwYW4ocGFyc2VyXy0+aW5wdXRfLT5jdXJyZW50KCkuY29sdW1uKTsKK30KKworUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjp+TG9jYXRpb25SZWNvcmRlcigpIHsKKyAgaWYgKGxvY2F0aW9uXy0+c3Bhbl9zaXplKCkgPD0gMikgeworICAgIEVuZEF0KHBhcnNlcl8tPmlucHV0Xy0+cHJldmlvdXMoKSk7CisgIH0KK30KKwordm9pZCBQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkFkZFBhdGgoaW50IHBhdGhfY29tcG9uZW50KSB7CisgIGxvY2F0aW9uXy0+YWRkX3BhdGgocGF0aF9jb21wb25lbnQpOworfQorCit2b2lkIFBhcnNlcjo6TG9jYXRpb25SZWNvcmRlcjo6U3RhcnRBdChjb25zdCBpbzo6VG9rZW5pemVyOjpUb2tlbiYgdG9rZW4pIHsKKyAgbG9jYXRpb25fLT5zZXRfc3BhbigwLCB0b2tlbi5saW5lKTsKKyAgbG9jYXRpb25fLT5zZXRfc3BhbigxLCB0b2tlbi5jb2x1bW4pOworfQorCit2b2lkIFBhcnNlcjo6TG9jYXRpb25SZWNvcmRlcjo6U3RhcnRBdChjb25zdCBMb2NhdGlvblJlY29yZGVyJiBvdGhlcikgeworICBsb2NhdGlvbl8tPnNldF9zcGFuKDAsIG90aGVyLmxvY2F0aW9uXy0+c3BhbigwKSk7CisgIGxvY2F0aW9uXy0+c2V0X3NwYW4oMSwgb3RoZXIubG9jYXRpb25fLT5zcGFuKDEpKTsKK30KKwordm9pZCBQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkVuZEF0KGNvbnN0IGlvOjpUb2tlbml6ZXI6OlRva2VuJiB0b2tlbikgeworICBpZiAodG9rZW4ubGluZSAhPSBsb2NhdGlvbl8tPnNwYW4oMCkpIHsKKyAgICBsb2NhdGlvbl8tPmFkZF9zcGFuKHRva2VuLmxpbmUpOworICB9CisgIGxvY2F0aW9uXy0+YWRkX3NwYW4odG9rZW4uZW5kX2NvbHVtbik7Cit9CisKK3ZvaWQgUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpSZWNvcmRMZWdhY3lMb2NhdGlvbigKKyAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAorICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbikgeworICBpZiAocGFyc2VyXy0+c291cmNlX2xvY2F0aW9uX3RhYmxlXyAhPSBudWxscHRyKSB7CisgICAgcGFyc2VyXy0+c291cmNlX2xvY2F0aW9uX3RhYmxlXy0+QWRkKAorICAgICAgICBkZXNjcmlwdG9yLCBsb2NhdGlvbiwgbG9jYXRpb25fLT5zcGFuKDApLCBsb2NhdGlvbl8tPnNwYW4oMSkpOworICB9Cit9CisKK3ZvaWQgUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpSZWNvcmRMZWdhY3lJbXBvcnRMb2NhdGlvbigKKyAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICBpZiAocGFyc2VyXy0+c291cmNlX2xvY2F0aW9uX3RhYmxlXyAhPSBudWxscHRyKSB7CisgICAgcGFyc2VyXy0+c291cmNlX2xvY2F0aW9uX3RhYmxlXy0+QWRkSW1wb3J0KAorICAgICAgICBkZXNjcmlwdG9yLCBuYW1lLCBsb2NhdGlvbl8tPnNwYW4oMCksIGxvY2F0aW9uXy0+c3BhbigxKSk7CisgIH0KK30KKworaW50IFBhcnNlcjo6TG9jYXRpb25SZWNvcmRlcjo6Q3VycmVudFBhdGhTaXplKCkgY29uc3QgeworICByZXR1cm4gbG9jYXRpb25fLT5wYXRoX3NpemUoKTsKK30KKwordm9pZCBQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkF0dGFjaENvbW1lbnRzKAorICAgIHN0ZDo6c3RyaW5nKiBsZWFkaW5nLCBzdGQ6OnN0cmluZyogdHJhaWxpbmcsCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBkZXRhY2hlZF9jb21tZW50cykgY29uc3QgeworICBHT09HTEVfQ0hFQ0soIWxvY2F0aW9uXy0+aGFzX2xlYWRpbmdfY29tbWVudHMoKSk7CisgIEdPT0dMRV9DSEVDSyghbG9jYXRpb25fLT5oYXNfdHJhaWxpbmdfY29tbWVudHMoKSk7CisKKyAgaWYgKCFsZWFkaW5nLT5lbXB0eSgpKSB7CisgICAgbG9jYXRpb25fLT5tdXRhYmxlX2xlYWRpbmdfY29tbWVudHMoKS0+c3dhcCgqbGVhZGluZyk7CisgIH0KKyAgaWYgKCF0cmFpbGluZy0+ZW1wdHkoKSkgeworICAgIGxvY2F0aW9uXy0+bXV0YWJsZV90cmFpbGluZ19jb21tZW50cygpLT5zd2FwKCp0cmFpbGluZyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXRhY2hlZF9jb21tZW50cy0+c2l6ZSgpOyArK2kpIHsKKyAgICBsb2NhdGlvbl8tPmFkZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCktPnN3YXAoKCpkZXRhY2hlZF9jb21tZW50cylbaV0pOworICB9CisgIGRldGFjaGVkX2NvbW1lbnRzLT5jbGVhcigpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgUGFyc2VyOjpTa2lwU3RhdGVtZW50KCkgeworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChBdEVuZCgpKSB7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfU1lNQk9MKSkgeworICAgICAgaWYgKFRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgbnVsbHB0cikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCJ7IikpIHsKKyAgICAgICAgU2tpcFJlc3RPZkJsb2NrKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJ9IikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgfQorfQorCit2b2lkIFBhcnNlcjo6U2tpcFJlc3RPZkJsb2NrKCkgeworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChBdEVuZCgpKSB7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfU1lNQk9MKSkgeworICAgICAgaWYgKFRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ9IiwgbnVsbHB0cikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCJ7IikpIHsKKyAgICAgICAgU2tpcFJlc3RPZkJsb2NrKCk7CisgICAgICB9CisgICAgfQorICAgIGlucHV0Xy0+TmV4dCgpOworICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYm9vbCBQYXJzZXI6OlZhbGlkYXRlRW51bShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvKiBwcm90bykgeworICBib29sIGhhc19hbGxvd19hbGlhcyA9IGZhbHNlOworICBib29sIGFsbG93X2FsaWFzID0gZmFsc2U7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by0+b3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiBvcHRpb24gPSBwcm90by0+b3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpOworICAgIGlmIChvcHRpb24ubmFtZV9zaXplKCkgPiAxKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFvcHRpb24ubmFtZSgwKS5pc19leHRlbnNpb24oKSAmJgorICAgICAgICBvcHRpb24ubmFtZSgwKS5uYW1lX3BhcnQoKSA9PSAiYWxsb3dfYWxpYXMiKSB7CisgICAgICBoYXNfYWxsb3dfYWxpYXMgPSB0cnVlOworICAgICAgaWYgKG9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKCkgPT0gInRydWUiKSB7CisgICAgICAgIGFsbG93X2FsaWFzID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChoYXNfYWxsb3dfYWxpYXMgJiYgIWFsbG93X2FsaWFzKSB7CisgICAgc3RkOjpzdHJpbmcgZXJyb3IgPQorICAgICAgICAiXCIiICsgcHJvdG8tPm5hbWUoKSArCisgICAgICAgICJcIiBkZWNsYXJlcyAnb3B0aW9uIGFsbG93X2FsaWFzID0gZmFsc2U7JyB3aGljaCBoYXMgbm8gZWZmZWN0LiAiCisgICAgICAgICJQbGVhc2UgcmVtb3ZlIHRoZSBkZWNsYXJhdGlvbi4iOworICAgIC8vIFRoaXMgbmVlZGxlc3NseSBjbHV0dGVycyBkZWNsYXJhdGlvbnMgd2l0aCBub3BzLgorICAgIEFkZEVycm9yKGVycm9yKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGQ6OnNldDxpbnQ+IHVzZWRfdmFsdWVzOworICBib29sIGhhc19kdXBsaWNhdGVzID0gZmFsc2U7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8tPnZhbHVlX3NpemUoKTsgKytpKSB7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBlbnVtX3ZhbHVlID0gcHJvdG8tPnZhbHVlKGkpOworICAgIGlmICh1c2VkX3ZhbHVlcy5maW5kKGVudW1fdmFsdWUubnVtYmVyKCkpICE9IHVzZWRfdmFsdWVzLmVuZCgpKSB7CisgICAgICBoYXNfZHVwbGljYXRlcyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgdXNlZF92YWx1ZXMuaW5zZXJ0KGVudW1fdmFsdWUubnVtYmVyKCkpOworICAgIH0KKyAgfQorICBpZiAoYWxsb3dfYWxpYXMgJiYgIWhhc19kdXBsaWNhdGVzKSB7CisgICAgc3RkOjpzdHJpbmcgZXJyb3IgPQorICAgICAgICAiXCIiICsgcHJvdG8tPm5hbWUoKSArCisgICAgICAgICJcIiBkZWNsYXJlcyBzdXBwb3J0IGZvciBlbnVtIGFsaWFzZXMgYnV0IG5vIGVudW0gdmFsdWVzIHNoYXJlIGZpZWxkICIKKyAgICAgICAgIm51bWJlcnMuIFBsZWFzZSByZW1vdmUgdGhlIHVubmVjZXNzYXJ5ICdvcHRpb24gYWxsb3dfYWxpYXMgPSB0cnVlOycgIgorICAgICAgICAiZGVjbGFyYXRpb24uIjsKKyAgICAvLyBHZW5lcmF0ZSBhbiBlcnJvciBpZiBhbiBlbnVtIGRlY2xhcmVzIHN1cHBvcnQgZm9yIGR1cGxpY2F0ZSBlbnVtIHZhbHVlcworICAgIC8vIGFuZCBkb2VzIG5vdCB1c2UgaXQgcHJvdGVjdCBmdXR1cmUgYXV0aG9ycy4KKyAgICBBZGRFcnJvcihlcnJvcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gRW5mb3JjZSB0aGF0IGVudW0gY29uc3RhbnRzIG11c3QgYmUgVVBQRVJfQ0FTRSBleGNlcHQgaW4gY2FzZSBvZgorICAvLyBlbnVtX2FsaWFzLgorICBpZiAoIWFsbG93X2FsaWFzKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBlbnVtX3ZhbHVlIDogcHJvdG8tPnZhbHVlKCkpIHsKKyAgICAgIGlmICghSXNVcHBlclVuZGVyc2NvcmUoZW51bV92YWx1ZS5uYW1lKCkpKSB7CisgICAgICAgIEFkZFdhcm5pbmcoCisgICAgICAgICAgICAiRW51bSBjb25zdGFudCBzaG91bGQgYmUgaW4gVVBQRVJfQ0FTRS4gRm91bmQ6ICIgKworICAgICAgICAgICAgZW51bV92YWx1ZS5uYW1lKCkgKworICAgICAgICAgICAgIi4gU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9zdHlsZSIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2UoaW86OlRva2VuaXplciogaW5wdXQsIEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUpIHsKKyAgaW5wdXRfID0gaW5wdXQ7CisgIGhhZF9lcnJvcnNfID0gZmFsc2U7CisgIHN5bnRheF9pZGVudGlmaWVyXy5jbGVhcigpOworCisgIC8vIE5vdGUgdGhhdCB8ZmlsZXwgY291bGQgYmUgTlVMTCBhdCB0aGlzIHBvaW50IGlmCisgIC8vIHN0b3BfYWZ0ZXJfc3ludGF4X2lkZW50aWZpZXJfIGlzIHRydWUuICBTbywgd2UgY29uc2VydmF0aXZlbHkgYWxsb2NhdGUKKyAgLy8gU291cmNlQ29kZUluZm8gb24gdGhlIHN0YWNrLCB0aGVuIHN3YXAgaXQgaW50byB0aGUgRmlsZURlc2NyaXB0b3JQcm90bworICAvLyBsYXRlciBvbi4KKyAgU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbzsKKyAgc291cmNlX2NvZGVfaW5mb18gPSAmc291cmNlX2NvZGVfaW5mbzsKKworICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX1NUQVJUKSkgeworICAgIC8vIEFkdmFuY2UgdG8gZmlyc3QgdG9rZW4uCisgICAgaW5wdXRfLT5OZXh0V2l0aENvbW1lbnRzKG51bGxwdHIsICZ1cGNvbWluZ19kZXRhY2hlZF9jb21tZW50c18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1cGNvbWluZ19kb2NfY29tbWVudHNfKTsKKyAgfQorCisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIHJvb3RfbG9jYXRpb24odGhpcyk7CisgICAgcm9vdF9sb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbihmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUik7CisKKyAgICBpZiAocmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl8gfHwgTG9va2luZ0F0KCJzeW50YXgiKSkgeworICAgICAgaWYgKCFQYXJzZVN5bnRheElkZW50aWZpZXIocm9vdF9sb2NhdGlvbikpIHsKKyAgICAgICAgLy8gRG9uJ3QgYXR0ZW1wdCB0byBwYXJzZSB0aGUgZmlsZSBpZiB3ZSBkaWRuJ3QgcmVjb2duaXplIHRoZSBzeW50YXgKKyAgICAgICAgLy8gaWRlbnRpZmllci4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLy8gU3RvcmUgdGhlIHN5bnRheCBpbnRvIHRoZSBmaWxlLgorICAgICAgaWYgKGZpbGUgIT0gbnVsbHB0cikgZmlsZS0+c2V0X3N5bnRheChzeW50YXhfaWRlbnRpZmllcl8pOworICAgIH0gZWxzZSBpZiAoIXN0b3BfYWZ0ZXJfc3ludGF4X2lkZW50aWZpZXJfKSB7CisgICAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJObyBzeW50YXggc3BlY2lmaWVkIGZvciB0aGUgcHJvdG8gZmlsZTogIiA8PCBmaWxlLT5uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiLiBQbGVhc2UgdXNlICdzeW50YXggPSBcInByb3RvMlwiOycgIgorICAgICAgICAgICAgICAgICAgIDw8ICJvciAnc3ludGF4ID0gXCJwcm90bzNcIjsnIHRvIHNwZWNpZnkgYSBzeW50YXggIgorICAgICAgICAgICAgICAgICAgIDw8ICJ2ZXJzaW9uLiAoRGVmYXVsdGVkIHRvIHByb3RvMiBzeW50YXguKSI7CisgICAgICBzeW50YXhfaWRlbnRpZmllcl8gPSAicHJvdG8yIjsKKyAgICB9CisKKyAgICBpZiAoc3RvcF9hZnRlcl9zeW50YXhfaWRlbnRpZmllcl8pIHJldHVybiAhaGFkX2Vycm9yc187CisKKyAgICAvLyBSZXBlYXRlZGx5IHBhcnNlIHN0YXRlbWVudHMgdW50aWwgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAgICB3aGlsZSAoIUF0RW5kKCkpIHsKKyAgICAgIGlmICghUGFyc2VUb3BMZXZlbFN0YXRlbWVudChmaWxlLCByb290X2xvY2F0aW9uKSkgeworICAgICAgICAvLyBUaGlzIHN0YXRlbWVudCBmYWlsZWQgdG8gcGFyc2UuICBTa2lwIGl0LCBidXQga2VlcCBsb29waW5nIHRvIHBhcnNlCisgICAgICAgIC8vIG90aGVyIHN0YXRlbWVudHMuCisgICAgICAgIFNraXBTdGF0ZW1lbnQoKTsKKworICAgICAgICBpZiAoTG9va2luZ0F0KCJ9IikpIHsKKyAgICAgICAgICBBZGRFcnJvcigiVW5tYXRjaGVkIFwifVwiLiIpOworICAgICAgICAgIGlucHV0Xy0+TmV4dFdpdGhDb21tZW50cyhudWxscHRyLCAmdXBjb21pbmdfZGV0YWNoZWRfY29tbWVudHNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBjb21pbmdfZG9jX2NvbW1lbnRzXyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbnB1dF8gPSBudWxscHRyOworICBzb3VyY2VfY29kZV9pbmZvXyA9IG51bGxwdHI7CisgIGFzc2VydChmaWxlICE9IG51bGxwdHIpOworICBzb3VyY2VfY29kZV9pbmZvLlN3YXAoZmlsZS0+bXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCkpOworICByZXR1cm4gIWhhZF9lcnJvcnNfOworfQorCitib29sIFBhcnNlcjo6UGFyc2VTeW50YXhJZGVudGlmaWVyKGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCkgeworICBMb2NhdGlvblJlY29yZGVyIHN5bnRheF9sb2NhdGlvbihwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtTeW50YXhGaWVsZE51bWJlcik7CisgIERPKENvbnN1bWUoCisgICAgICAic3ludGF4IiwKKyAgICAgICJGaWxlIG11c3QgYmVnaW4gd2l0aCBhIHN5bnRheCBzdGF0ZW1lbnQsIGUuZy4gJ3N5bnRheCA9IFwicHJvdG8yXCI7Jy4iKSk7CisgIERPKENvbnN1bWUoIj0iKSk7CisgIGlvOjpUb2tlbml6ZXI6OlRva2VuIHN5bnRheF90b2tlbiA9IGlucHV0Xy0+Y3VycmVudCgpOworICBzdGQ6OnN0cmluZyBzeW50YXg7CisgIERPKENvbnN1bWVTdHJpbmcoJnN5bnRheCwgIkV4cGVjdGVkIHN5bnRheCBpZGVudGlmaWVyLiIpKTsKKyAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCAmc3ludGF4X2xvY2F0aW9uKSk7CisKKyAgc3ludGF4X2lkZW50aWZpZXJfID0gc3ludGF4OworCisgIGlmIChzeW50YXggIT0gInByb3RvMiIgJiYgc3ludGF4ICE9ICJwcm90bzMiICYmCisgICAgICAhc3RvcF9hZnRlcl9zeW50YXhfaWRlbnRpZmllcl8pIHsKKyAgICBBZGRFcnJvcihzeW50YXhfdG9rZW4ubGluZSwgc3ludGF4X3Rva2VuLmNvbHVtbiwKKyAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIHN5bnRheCBpZGVudGlmaWVyIFwiIiArIHN5bnRheCArCisgICAgICAgICAgICAgICAgICJcIi4gIFRoaXMgcGFyc2VyICIKKyAgICAgICAgICAgICAgICAgIm9ubHkgcmVjb2duaXplcyBcInByb3RvMlwiIGFuZCBcInByb3RvM1wiLiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VUb3BMZXZlbFN0YXRlbWVudChGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcm9vdF9sb2NhdGlvbikgeworICBpZiAoVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCBudWxscHRyKSkgeworICAgIC8vIGVtcHR5IHN0YXRlbWVudDsgaWdub3JlCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJtZXNzYWdlIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHJvb3RfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprTWVzc2FnZVR5cGVGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUtPm1lc3NhZ2VfdHlwZV9zaXplKCkpOworICAgIHJldHVybiBQYXJzZU1lc3NhZ2VEZWZpbml0aW9uKGZpbGUtPmFkZF9tZXNzYWdlX3R5cGUoKSwgbG9jYXRpb24sIGZpbGUpOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiZW51bSIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLT5lbnVtX3R5cGVfc2l6ZSgpKTsKKyAgICByZXR1cm4gUGFyc2VFbnVtRGVmaW5pdGlvbihmaWxlLT5hZGRfZW51bV90eXBlKCksIGxvY2F0aW9uLCBmaWxlKTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXQoInNlcnZpY2UiKSkgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24ocm9vdF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtTZXJ2aWNlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLT5zZXJ2aWNlX3NpemUoKSk7CisgICAgcmV0dXJuIFBhcnNlU2VydmljZURlZmluaXRpb24oZmlsZS0+YWRkX3NlcnZpY2UoKSwgbG9jYXRpb24sIGZpbGUpOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiZXh0ZW5kIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHJvb3RfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXIpOworICAgIHJldHVybiBQYXJzZUV4dGVuZCgKKyAgICAgICAgZmlsZS0+bXV0YWJsZV9leHRlbnNpb24oKSwgZmlsZS0+bXV0YWJsZV9tZXNzYWdlX3R5cGUoKSwgcm9vdF9sb2NhdGlvbiwKKyAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXIsIGxvY2F0aW9uLCBmaWxlKTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXQoImltcG9ydCIpKSB7CisgICAgcmV0dXJuIFBhcnNlSW1wb3J0KGZpbGUtPm11dGFibGVfZGVwZW5kZW5jeSgpLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlLT5tdXRhYmxlX3B1YmxpY19kZXBlbmRlbmN5KCksCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGUtPm11dGFibGVfd2Vha19kZXBlbmRlbmN5KCksIHJvb3RfbG9jYXRpb24sIGZpbGUpOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgicGFja2FnZSIpKSB7CisgICAgcmV0dXJuIFBhcnNlUGFja2FnZShmaWxlLCByb290X2xvY2F0aW9uLCBmaWxlKTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXQoIm9wdGlvbiIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcik7CisgICAgcmV0dXJuIFBhcnNlT3B0aW9uKGZpbGUtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbiwgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OX1NUQVRFTUVOVCk7CisgIH0gZWxzZSB7CisgICAgQWRkRXJyb3IoIkV4cGVjdGVkIHRvcC1sZXZlbCBzdGF0ZW1lbnQgKGUuZy4gXCJtZXNzYWdlXCIpLiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXNzYWdlcworCitib29sIFBhcnNlcjo6UGFyc2VNZXNzYWdlRGVmaW5pdGlvbigKKyAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24sCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CisgIERPKENvbnN1bWUoIm1lc3NhZ2UiKSk7CisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FKTsKKyAgICBETyhDb25zdW1lSWRlbnRpZmllcihtZXNzYWdlLT5tdXRhYmxlX25hbWUoKSwgIkV4cGVjdGVkIG1lc3NhZ2UgbmFtZS4iKSk7CisgICAgaWYgKCFJc1VwcGVyQ2FtZWxDYXNlKG1lc3NhZ2UtPm5hbWUoKSkpIHsKKyAgICAgIEFkZFdhcm5pbmcoCisgICAgICAgICAgIk1lc3NhZ2UgbmFtZSBzaG91bGQgYmUgaW4gVXBwZXJDYW1lbENhc2UuIEZvdW5kOiAiICsKKyAgICAgICAgICBtZXNzYWdlLT5uYW1lKCkgKworICAgICAgICAgICIuIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3Mvc3R5bGUiKTsKKyAgICB9CisgIH0KKyAgRE8oUGFyc2VNZXNzYWdlQmxvY2sobWVzc2FnZSwgbWVzc2FnZV9sb2NhdGlvbiwgY29udGFpbmluZ19maWxlKSk7CisKKyAgaWYgKHN5bnRheF9pZGVudGlmaWVyXyA9PSAicHJvdG8zIikgeworICAgIC8vIEFkZCBzeW50aGV0aWMgb25lLWZpZWxkIG9uZW9mcyBmb3Igb3B0aW9uYWwgZmllbGRzLCBleGNlcHQgbWVzc2FnZXMgd2hpY2gKKyAgICAvLyBhbHJlYWR5IGhhdmUgcHJlc2VuY2UgaW4gcHJvdG8zLgorICAgIC8vCisgICAgLy8gV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIG9uZW9mIG5hbWVzIGRvbid0IGNvbmZsaWN0IHdpdGggYW55IG90aGVyCisgICAgLy8gZmllbGQgb3Igb25lb2YuCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBuYW1lczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogbWVzc2FnZS0+ZmllbGQoKSkgeworICAgICAgbmFtZXMuaW5zZXJ0KGZpZWxkLm5hbWUoKSk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgb25lb2YgOiBtZXNzYWdlLT5vbmVvZl9kZWNsKCkpIHsKKyAgICAgIG5hbWVzLmluc2VydChvbmVvZi5uYW1lKCkpOworICAgIH0KKworICAgIGZvciAoYXV0byYgZmllbGQgOiAqbWVzc2FnZS0+bXV0YWJsZV9maWVsZCgpKSB7CisgICAgICBpZiAoZmllbGQucHJvdG8zX29wdGlvbmFsKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgb25lb2ZfbmFtZSA9IGZpZWxkLm5hbWUoKTsKKworICAgICAgICAvLyBQcmVwZW5kICdYWFhYWF8nIHVudGlsIHdlIGFyZSBubyBsb25nZXIgY29uZmxpY3RpbmcuCisgICAgICAgIC8vIEF2b2lkIHByZXBlbmRpbmcgYSBkb3VibGUtdW5kZXJzY29yZSBiZWNhdXNlIHN1Y2ggbmFtZXMgYXJlCisgICAgICAgIC8vIHJlc2VydmVkIGluIEMrKy4KKyAgICAgICAgaWYgKG9uZW9mX25hbWUuZW1wdHkoKSB8fCBvbmVvZl9uYW1lWzBdICE9ICdfJykgeworICAgICAgICAgIG9uZW9mX25hbWUgPSAnXycgKyBvbmVvZl9uYW1lOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChuYW1lcy5jb3VudChvbmVvZl9uYW1lKSA+IDApIHsKKyAgICAgICAgICBvbmVvZl9uYW1lID0gJ1gnICsgb25lb2ZfbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIG5hbWVzLmluc2VydChvbmVvZl9uYW1lKTsKKyAgICAgICAgZmllbGQuc2V0X29uZW9mX2luZGV4KG1lc3NhZ2UtPm9uZW9mX2RlY2xfc2l6ZSgpKTsKKyAgICAgICAgT25lb2ZEZXNjcmlwdG9yUHJvdG8qIG9uZW9mID0gbWVzc2FnZS0+YWRkX29uZW9mX2RlY2woKTsKKyAgICAgICAgb25lb2YtPnNldF9uYW1lKG9uZW9mX25hbWUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgeworCitjb25zdCBpbnQga01heFJhbmdlU2VudGluZWwgPSAtMTsKKworYm9vbCBJc01lc3NhZ2VTZXRXaXJlRm9ybWF0TWVzc2FnZShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIG1lc3NhZ2UpIHsKKyAgY29uc3QgTWVzc2FnZU9wdGlvbnMmIG9wdGlvbnMgPSBtZXNzYWdlLm9wdGlvbnMoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgKytpKSB7CisgICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZCA9IG9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24oaSk7CisgICAgaWYgKHVuaW50ZXJwcmV0ZWQubmFtZV9zaXplKCkgPT0gMSAmJgorICAgICAgICB1bmludGVycHJldGVkLm5hbWUoMCkubmFtZV9wYXJ0KCkgPT0gIm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IiAmJgorICAgICAgICB1bmludGVycHJldGVkLmlkZW50aWZpZXJfdmFsdWUoKSA9PSAidHJ1ZSIpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIE1vZGlmaWVzIGFueSBleHRlbnNpb24gcmFuZ2VzIHRoYXQgc3BlY2lmaWVkICdtYXgnIGFzIHRoZSBlbmQgb2YgdGhlCisvLyBleHRlbnNpb24gcmFuZ2UsIGFuZCBzZXRzIHRoZW0gdG8gdGhlIHR5cGUtc3BlY2lmaWMgbWF4aW11bS4gVGhlIGFjdHVhbCBtYXgKKy8vIHRhZyBudW1iZXIgY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBhZnRlciBhbGwgb3B0aW9ucyBoYXZlIGJlZW4gcGFyc2VkLgordm9pZCBBZGp1c3RFeHRlbnNpb25SYW5nZXNXaXRoTWF4RW5kTnVtYmVyKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSkgeworICBjb25zdCBib29sIGlzX21lc3NhZ2Vfc2V0ID0gSXNNZXNzYWdlU2V0V2lyZUZvcm1hdE1lc3NhZ2UoKm1lc3NhZ2UpOworICBjb25zdCBpbnQgbWF4X2V4dGVuc2lvbl9udW1iZXIgPSBpc19tZXNzYWdlX3NldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIgKyAxOworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZV9zaXplKCk7ICsraSkgeworICAgIGlmIChtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2UoaSkuZW5kKCkgPT0ga01heFJhbmdlU2VudGluZWwpIHsKKyAgICAgIG1lc3NhZ2UtPm11dGFibGVfZXh0ZW5zaW9uX3JhbmdlKGkpLT5zZXRfZW5kKG1heF9leHRlbnNpb25fbnVtYmVyKTsKKyAgICB9CisgIH0KK30KKworLy8gTW9kaWZpZXMgYW55IHJlc2VydmVkIHJhbmdlcyB0aGF0IHNwZWNpZmllZCAnbWF4JyBhcyB0aGUgZW5kIG9mIHRoZQorLy8gcmVzZXJ2ZWQgcmFuZ2UsIGFuZCBzZXRzIHRoZW0gdG8gdGhlIHR5cGUtc3BlY2lmaWMgbWF4aW11bS4gVGhlIGFjdHVhbCBtYXgKKy8vIHRhZyBudW1iZXIgY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBhZnRlciBhbGwgb3B0aW9ucyBoYXZlIGJlZW4gcGFyc2VkLgordm9pZCBBZGp1c3RSZXNlcnZlZFJhbmdlc1dpdGhNYXhFbmROdW1iZXIoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlKSB7CisgIGNvbnN0IGJvb2wgaXNfbWVzc2FnZV9zZXQgPSBJc01lc3NhZ2VTZXRXaXJlRm9ybWF0TWVzc2FnZSgqbWVzc2FnZSk7CisgIGNvbnN0IGludCBtYXhfZmllbGRfbnVtYmVyID0gaXNfbWVzc2FnZV9zZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlciArIDE7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+cmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAobWVzc2FnZS0+cmVzZXJ2ZWRfcmFuZ2UoaSkuZW5kKCkgPT0ga01heFJhbmdlU2VudGluZWwpIHsKKyAgICAgIG1lc3NhZ2UtPm11dGFibGVfcmVzZXJ2ZWRfcmFuZ2UoaSktPnNldF9lbmQobWF4X2ZpZWxkX251bWJlcik7CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitib29sIFBhcnNlcjo6UGFyc2VNZXNzYWdlQmxvY2soRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CisgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ7IiwgJm1lc3NhZ2VfbG9jYXRpb24pKTsKKworICB3aGlsZSAoIVRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ9IiwgbnVsbHB0cikpIHsKKyAgICBpZiAoQXRFbmQoKSkgeworICAgICAgQWRkRXJyb3IoIlJlYWNoZWQgZW5kIG9mIGlucHV0IGluIG1lc3NhZ2UgZGVmaW5pdGlvbiAobWlzc2luZyAnfScpLiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghUGFyc2VNZXNzYWdlU3RhdGVtZW50KG1lc3NhZ2UsIG1lc3NhZ2VfbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSkpIHsKKyAgICAgIC8vIFRoaXMgc3RhdGVtZW50IGZhaWxlZCB0byBwYXJzZS4gIFNraXAgaXQsIGJ1dCBrZWVwIGxvb3BpbmcgdG8gcGFyc2UKKyAgICAgIC8vIG90aGVyIHN0YXRlbWVudHMuCisgICAgICBTa2lwU3RhdGVtZW50KCk7CisgICAgfQorICB9CisKKyAgaWYgKG1lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZV9zaXplKCkgPiAwKSB7CisgICAgQWRqdXN0RXh0ZW5zaW9uUmFuZ2VzV2l0aE1heEVuZE51bWJlcihtZXNzYWdlKTsKKyAgfQorICBpZiAobWVzc2FnZS0+cmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpID4gMCkgeworICAgIEFkanVzdFJlc2VydmVkUmFuZ2VzV2l0aE1heEVuZE51bWJlcihtZXNzYWdlKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlTWVzc2FnZVN0YXRlbWVudChEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgeworICBpZiAoVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCBudWxscHRyKSkgeworICAgIC8vIGVtcHR5IHN0YXRlbWVudDsgaWdub3JlCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJtZXNzYWdlIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOZXN0ZWRUeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5uZXN0ZWRfdHlwZV9zaXplKCkpOworICAgIHJldHVybiBQYXJzZU1lc3NhZ2VEZWZpbml0aW9uKG1lc3NhZ2UtPmFkZF9uZXN0ZWRfdHlwZSgpLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX2ZpbGUpOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiZW51bSIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprRW51bVR5cGVGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPmVudW1fdHlwZV9zaXplKCkpOworICAgIHJldHVybiBQYXJzZUVudW1EZWZpbml0aW9uKG1lc3NhZ2UtPmFkZF9lbnVtX3R5cGUoKSwgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ19maWxlKTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXQoImV4dGVuc2lvbnMiKSkgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24obWVzc2FnZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a0V4dGVuc2lvblJhbmdlRmllbGROdW1iZXIpOworICAgIHJldHVybiBQYXJzZUV4dGVuc2lvbnMobWVzc2FnZSwgbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSk7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJyZXNlcnZlZCIpKSB7CisgICAgcmV0dXJuIFBhcnNlUmVzZXJ2ZWQobWVzc2FnZSwgbWVzc2FnZV9sb2NhdGlvbik7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJleHRlbmQiKSkgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24obWVzc2FnZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a0V4dGVuc2lvbkZpZWxkTnVtYmVyKTsKKyAgICByZXR1cm4gUGFyc2VFeHRlbmQobWVzc2FnZS0+bXV0YWJsZV9leHRlbnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgpLCBtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOZXN0ZWRUeXBlRmllbGROdW1iZXIsIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX2ZpbGUpOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgib3B0aW9uIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIpOworICAgIHJldHVybiBQYXJzZU9wdGlvbihtZXNzYWdlLT5tdXRhYmxlX29wdGlvbnMoKSwgbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OX1NUQVRFTUVOVCk7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJvbmVvZiIpKSB7CisgICAgaW50IG9uZW9mX2luZGV4ID0gbWVzc2FnZS0+b25lb2ZfZGVjbF9zaXplKCk7CisgICAgTG9jYXRpb25SZWNvcmRlciBvbmVvZl9sb2NhdGlvbigKKyAgICAgICAgbWVzc2FnZV9sb2NhdGlvbiwgRGVzY3JpcHRvclByb3RvOjprT25lb2ZEZWNsRmllbGROdW1iZXIsIG9uZW9mX2luZGV4KTsKKworICAgIHJldHVybiBQYXJzZU9uZW9mKG1lc3NhZ2UtPmFkZF9vbmVvZl9kZWNsKCksIG1lc3NhZ2UsIG9uZW9mX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgIG9uZW9mX2xvY2F0aW9uLCBtZXNzYWdlX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpOworICB9IGVsc2UgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24obWVzc2FnZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a0ZpZWxkRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5maWVsZF9zaXplKCkpOworICAgIHJldHVybiBQYXJzZU1lc3NhZ2VGaWVsZCgKKyAgICAgICAgbWVzc2FnZS0+YWRkX2ZpZWxkKCksIG1lc3NhZ2UtPm11dGFibGVfbmVzdGVkX3R5cGUoKSwgbWVzc2FnZV9sb2NhdGlvbiwKKyAgICAgICAgRGVzY3JpcHRvclByb3RvOjprTmVzdGVkVHlwZUZpZWxkTnVtYmVyLCBsb2NhdGlvbiwgY29udGFpbmluZ19maWxlKTsKKyAgfQorfQorCitib29sIFBhcnNlcjo6UGFyc2VNZXNzYWdlRmllbGQoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8RGVzY3JpcHRvclByb3RvPiogbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2NhdGlvbl9maWVsZF9udW1iZXJfZm9yX25lc3RlZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgeworICB7CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsIGxhYmVsOworICAgIGlmIChQYXJzZUxhYmVsKCZsYWJlbCwgZmllbGRfbG9jYXRpb24pKSB7CisgICAgICBmaWVsZC0+c2V0X2xhYmVsKGxhYmVsKTsKKyAgICAgIGlmIChsYWJlbCA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwgJiYKKyAgICAgICAgICBzeW50YXhfaWRlbnRpZmllcl8gPT0gInByb3RvMyIpIHsKKyAgICAgICAgZmllbGQtPnNldF9wcm90bzNfb3B0aW9uYWwodHJ1ZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIFBhcnNlTWVzc2FnZUZpZWxkTm9MYWJlbChmaWVsZCwgbWVzc2FnZXMsIHBhcmVudF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl9maWVsZF9udW1iZXJfZm9yX25lc3RlZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpOworfQorCitib29sIFBhcnNlcjo6UGFyc2VNZXNzYWdlRmllbGROb0xhYmVsKAorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCwgUmVwZWF0ZWRQdHJGaWVsZDxEZXNjcmlwdG9yUHJvdG8+KiBtZXNzYWdlcywKKyAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCisgICAgaW50IGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUsCisgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZmllbGRfbG9jYXRpb24sCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CisgIE1hcEZpZWxkIG1hcF9maWVsZDsKKyAgLy8gUGFyc2UgdHlwZS4KKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24pOyAgLy8gYWRkIHBhdGggbGF0ZXIKKyAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbihmaWVsZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFKTsKKworICAgIGJvb2wgdHlwZV9wYXJzZWQgPSBmYWxzZTsKKyAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZSB0eXBlID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzI7CisgICAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lOworCisgICAgLy8gU3BlY2lhbCBjYXNlIG1hcCBmaWVsZC4gV2Ugb25seSB0cmVhdCB0aGUgZmllbGQgYXMgYSBtYXAgZmllbGQgaWYgdGhlCisgICAgLy8gZmllbGQgdHlwZSBuYW1lIHN0YXJ0cyB3aXRoIHRoZSB3b3JkICJtYXAiIHdpdGggYSBmb2xsb3dpbmcgIjwiLgorICAgIGlmIChUcnlDb25zdW1lKCJtYXAiKSkgeworICAgICAgaWYgKExvb2tpbmdBdCgiPCIpKSB7CisgICAgICAgIG1hcF9maWVsZC5pc19tYXBfZmllbGQgPSB0cnVlOworICAgICAgICBETyhQYXJzZU1hcFR5cGUoJm1hcF9maWVsZCwgZmllbGQsIGxvY2F0aW9uKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBGYWxzZSBwb3NpdGl2ZQorICAgICAgICB0eXBlX3BhcnNlZCA9IHRydWU7CisgICAgICAgIHR5cGVfbmFtZSA9ICJtYXAiOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIW1hcF9maWVsZC5pc19tYXBfZmllbGQpIHsKKyAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBubyBleHBsaWNpdCBsYWJlbCBpcyBnaXZlbiBmb3IgYSBub24tbWFwIGZpZWxkLgorICAgICAgaWYgKCFmaWVsZC0+aGFzX2xhYmVsKCkgJiYgRGVmYXVsdFRvT3B0aW9uYWxGaWVsZHMoKSkgeworICAgICAgICBmaWVsZC0+c2V0X2xhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCk7CisgICAgICB9CisgICAgICBpZiAoIWZpZWxkLT5oYXNfbGFiZWwoKSkgeworICAgICAgICBBZGRFcnJvcigiRXhwZWN0ZWQgXCJyZXF1aXJlZFwiLCBcIm9wdGlvbmFsXCIsIG9yIFwicmVwZWF0ZWRcIi4iKTsKKyAgICAgICAgLy8gV2UgY2FuIGFjdHVhbGx5IHJlYXNvbmFibHkgcmVjb3ZlciBoZXJlIGJ5IGp1c3QgYXNzdW1pbmcgdGhlIHVzZXIKKyAgICAgICAgLy8gZm9yZ290IHRoZSBsYWJlbCBhbHRvZ2V0aGVyLgorICAgICAgICBmaWVsZC0+c2V0X2xhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCk7CisgICAgICB9CisKKyAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgYWN0dWFsIHR5cGUgaXMgYSBtZXNzYWdlIG9yIGVudW0gbmFtZWQKKyAgICAgIC8vICJtYXAiLCB3aGljaCB3ZSBhbHJlYWR5IGNvbnN1bWVkIGluIHRoZSBjb2RlIGFib3ZlLgorICAgICAgaWYgKCF0eXBlX3BhcnNlZCkgeworICAgICAgICBETyhQYXJzZVR5cGUoJnR5cGUsICZ0eXBlX25hbWUpKTsKKyAgICAgIH0KKyAgICAgIGlmICh0eXBlX25hbWUuZW1wdHkoKSkgeworICAgICAgICBsb2NhdGlvbi5BZGRQYXRoKEZpZWxkRGVzY3JpcHRvclByb3RvOjprVHlwZUZpZWxkTnVtYmVyKTsKKyAgICAgICAgZmllbGQtPnNldF90eXBlKHR5cGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG9jYXRpb24uQWRkUGF0aChGaWVsZERlc2NyaXB0b3JQcm90bzo6a1R5cGVOYW1lRmllbGROdW1iZXIpOworICAgICAgICBmaWVsZC0+c2V0X3R5cGVfbmFtZSh0eXBlX25hbWUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFBhcnNlIG5hbWUgYW5kICc9Jy4KKyAgaW86OlRva2VuaXplcjo6VG9rZW4gbmFtZV90b2tlbiA9IGlucHV0Xy0+Y3VycmVudCgpOworICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihmaWVsZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyKTsKKyAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbihmaWVsZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FKTsKKyAgICBETyhDb25zdW1lSWRlbnRpZmllcihmaWVsZC0+bXV0YWJsZV9uYW1lKCksICJFeHBlY3RlZCBmaWVsZCBuYW1lLiIpKTsKKworICAgIGlmICghSXNMb3dlclVuZGVyc2NvcmUoZmllbGQtPm5hbWUoKSkpIHsKKyAgICAgIEFkZFdhcm5pbmcoCisgICAgICAgICAgIkZpZWxkIG5hbWUgc2hvdWxkIGJlIGxvd2VyY2FzZS4gRm91bmQ6ICIgKyBmaWVsZC0+bmFtZSgpICsKKyAgICAgICAgICAiLiBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9zdHlsZSIpOworICAgIH0KKyAgICBpZiAoSXNOdW1iZXJGb2xsb3dVbmRlcnNjb3JlKGZpZWxkLT5uYW1lKCkpKSB7CisgICAgICBBZGRXYXJuaW5nKAorICAgICAgICAgICJOdW1iZXIgc2hvdWxkIG5vdCBjb21lIHJpZ2h0IGFmdGVyIGFuIHVuZGVyc2NvcmUuIEZvdW5kOiAiICsKKyAgICAgICAgICBmaWVsZC0+bmFtZSgpICsKKyAgICAgICAgICAiLiBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9zdHlsZSIpOworICAgIH0KKyAgfQorICBETyhDb25zdW1lKCI9IiwgIk1pc3NpbmcgZmllbGQgbnVtYmVyLiIpKTsKKworICAvLyBQYXJzZSBmaWVsZCBudW1iZXIuCisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGZpZWxkX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OmtOdW1iZXJGaWVsZE51bWJlcik7CisgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIpOworICAgIGludCBudW1iZXI7CisgICAgRE8oQ29uc3VtZUludGVnZXIoJm51bWJlciwgIkV4cGVjdGVkIGZpZWxkIG51bWJlci4iKSk7CisgICAgZmllbGQtPnNldF9udW1iZXIobnVtYmVyKTsKKyAgfQorCisgIC8vIFBhcnNlIG9wdGlvbnMuCisgIERPKFBhcnNlRmllbGRPcHRpb25zKGZpZWxkLCBmaWVsZF9sb2NhdGlvbiwgY29udGFpbmluZ19maWxlKSk7CisKKyAgLy8gRGVhbCB3aXRoIGdyb3Vwcy4KKyAgaWYgKGZpZWxkLT5oYXNfdHlwZSgpICYmIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfR1JPVVApIHsKKyAgICAvLyBBd2t3YXJkOiAgU2luY2UgYSBncm91cCBkZWNsYXJlcyBib3RoIGEgbWVzc2FnZSB0eXBlIGFuZCBhIGZpZWxkLCB3ZQorICAgIC8vICAgaGF2ZSB0byBjcmVhdGUgb3ZlcmxhcHBpbmcgbG9jYXRpb25zLgorICAgIExvY2F0aW9uUmVjb3JkZXIgZ3JvdXBfbG9jYXRpb24ocGFyZW50X2xvY2F0aW9uKTsKKyAgICBncm91cF9sb2NhdGlvbi5TdGFydEF0KGZpZWxkX2xvY2F0aW9uKTsKKyAgICBncm91cF9sb2NhdGlvbi5BZGRQYXRoKGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUpOworICAgIGdyb3VwX2xvY2F0aW9uLkFkZFBhdGgobWVzc2FnZXMtPnNpemUoKSk7CisKKyAgICBEZXNjcmlwdG9yUHJvdG8qIGdyb3VwID0gbWVzc2FnZXMtPkFkZCgpOworICAgIGdyb3VwLT5zZXRfbmFtZShmaWVsZC0+bmFtZSgpKTsKKworICAgIC8vIFJlY29yZCBuYW1lIGxvY2F0aW9uIHRvIG1hdGNoIHRoZSBmaWVsZCBuYW1lJ3MgbG9jYXRpb24uCisgICAgeworICAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihncm91cF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyKTsKKyAgICAgIGxvY2F0aW9uLlN0YXJ0QXQobmFtZV90b2tlbik7CisgICAgICBsb2NhdGlvbi5FbmRBdChuYW1lX3Rva2VuKTsKKyAgICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FKTsKKyAgICB9CisKKyAgICAvLyBUaGUgZmllbGQncyB0eXBlX25hbWUgYWxzbyBjb21lcyBmcm9tIHRoZSBuYW1lLiAgQ29uZnVzaW5nIQorICAgIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjprVHlwZU5hbWVGaWVsZE51bWJlcik7CisgICAgICBsb2NhdGlvbi5TdGFydEF0KG5hbWVfdG9rZW4pOworICAgICAgbG9jYXRpb24uRW5kQXQobmFtZV90b2tlbik7CisgICAgfQorCisgICAgLy8gQXMgYSBoYWNrIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSwgd2UgZm9yY2UgdGhlIGdyb3VwIG5hbWUgdG8gc3RhcnQKKyAgICAvLyB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIgYW5kIGxvd2VyLWNhc2UgdGhlIGZpZWxkIG5hbWUuICBOZXcgY29kZSBzaG91bGQKKyAgICAvLyBub3QgdXNlIGdyb3VwczsgaXQgc2hvdWxkIHVzZSBuZXN0ZWQgbWVzc2FnZXMuCisgICAgaWYgKGdyb3VwLT5uYW1lKClbMF0gPCAnQScgfHwgJ1onIDwgZ3JvdXAtPm5hbWUoKVswXSkgeworICAgICAgQWRkRXJyb3IobmFtZV90b2tlbi5saW5lLCBuYW1lX3Rva2VuLmNvbHVtbiwKKyAgICAgICAgICAgICAgICJHcm91cCBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsIGxldHRlci4iKTsKKyAgICB9CisgICAgTG93ZXJTdHJpbmcoZmllbGQtPm11dGFibGVfbmFtZSgpKTsKKworICAgIGZpZWxkLT5zZXRfdHlwZV9uYW1lKGdyb3VwLT5uYW1lKCkpOworICAgIGlmIChMb29raW5nQXQoInsiKSkgeworICAgICAgRE8oUGFyc2VNZXNzYWdlQmxvY2soZ3JvdXAsIGdyb3VwX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgQWRkRXJyb3IoIk1pc3NpbmcgZ3JvdXAgYm9keS4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCAmZmllbGRfbG9jYXRpb24pKTsKKyAgfQorCisgIC8vIENyZWF0ZSBhIG1hcCBlbnRyeSB0eXBlIGlmIHRoaXMgaXMgYSBtYXAgZmllbGQuCisgIGlmIChtYXBfZmllbGQuaXNfbWFwX2ZpZWxkKSB7CisgICAgR2VuZXJhdGVNYXBFbnRyeShtYXBfZmllbGQsIGZpZWxkLCBtZXNzYWdlcyk7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlTWFwVHlwZShNYXBGaWVsZCogbWFwX2ZpZWxkLCBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uUmVjb3JkZXImIHR5cGVfbmFtZV9sb2NhdGlvbikgeworICBpZiAoZmllbGQtPmhhc19vbmVvZl9pbmRleCgpKSB7CisgICAgQWRkRXJyb3IoIk1hcCBmaWVsZHMgYXJlIG5vdCBhbGxvd2VkIGluIG9uZW9mcy4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGZpZWxkLT5oYXNfbGFiZWwoKSkgeworICAgIEFkZEVycm9yKAorICAgICAgICAiRmllbGQgbGFiZWxzIChyZXF1aXJlZC9vcHRpb25hbC9yZXBlYXRlZCkgYXJlIG5vdCBhbGxvd2VkIG9uICIKKyAgICAgICAgIm1hcCBmaWVsZHMuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChmaWVsZC0+aGFzX2V4dGVuZGVlKCkpIHsKKyAgICBBZGRFcnJvcigiTWFwIGZpZWxkcyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgZXh0ZW5zaW9ucy4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZmllbGQtPnNldF9sYWJlbChGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVQRUFURUQpOworICBETyhDb25zdW1lKCI8IikpOworICBETyhQYXJzZVR5cGUoJm1hcF9maWVsZC0+a2V5X3R5cGUsICZtYXBfZmllbGQtPmtleV90eXBlX25hbWUpKTsKKyAgRE8oQ29uc3VtZSgiLCIpKTsKKyAgRE8oUGFyc2VUeXBlKCZtYXBfZmllbGQtPnZhbHVlX3R5cGUsICZtYXBfZmllbGQtPnZhbHVlX3R5cGVfbmFtZSkpOworICBETyhDb25zdW1lKCI+IikpOworICAvLyBEZWZlciBzZXR0aW5nIG9mIHRoZSB0eXBlIG5hbWUgb2YgdGhlIG1hcCBmaWVsZCB1bnRpbCB0aGUKKyAgLy8gZmllbGQgbmFtZSBpcyBwYXJzZWQuIEFkZCB0aGUgc291cmNlIGxvY2F0aW9uIHRob3VnaC4KKyAgdHlwZV9uYW1lX2xvY2F0aW9uLkFkZFBhdGgoRmllbGREZXNjcmlwdG9yUHJvdG86OmtUeXBlTmFtZUZpZWxkTnVtYmVyKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUGFyc2VyOjpHZW5lcmF0ZU1hcEVudHJ5KGNvbnN0IE1hcEZpZWxkJiBtYXBfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz4qIG1lc3NhZ2VzKSB7CisgIERlc2NyaXB0b3JQcm90byogZW50cnkgPSBtZXNzYWdlcy0+QWRkKCk7CisgIHN0ZDo6c3RyaW5nIGVudHJ5X25hbWUgPSBNYXBFbnRyeU5hbWUoZmllbGQtPm5hbWUoKSk7CisgIGZpZWxkLT5zZXRfdHlwZV9uYW1lKGVudHJ5X25hbWUpOworICBlbnRyeS0+c2V0X25hbWUoZW50cnlfbmFtZSk7CisgIGVudHJ5LT5tdXRhYmxlX29wdGlvbnMoKS0+c2V0X21hcF9lbnRyeSh0cnVlKTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGtleV9maWVsZCA9IGVudHJ5LT5hZGRfZmllbGQoKTsKKyAga2V5X2ZpZWxkLT5zZXRfbmFtZSgia2V5Iik7CisgIGtleV9maWVsZC0+c2V0X2xhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCk7CisgIGtleV9maWVsZC0+c2V0X251bWJlcigxKTsKKyAgaWYgKG1hcF9maWVsZC5rZXlfdHlwZV9uYW1lLmVtcHR5KCkpIHsKKyAgICBrZXlfZmllbGQtPnNldF90eXBlKG1hcF9maWVsZC5rZXlfdHlwZSk7CisgIH0gZWxzZSB7CisgICAga2V5X2ZpZWxkLT5zZXRfdHlwZV9uYW1lKG1hcF9maWVsZC5rZXlfdHlwZV9uYW1lKTsKKyAgfQorICBGaWVsZERlc2NyaXB0b3JQcm90byogdmFsdWVfZmllbGQgPSBlbnRyeS0+YWRkX2ZpZWxkKCk7CisgIHZhbHVlX2ZpZWxkLT5zZXRfbmFtZSgidmFsdWUiKTsKKyAgdmFsdWVfZmllbGQtPnNldF9sYWJlbChGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwpOworICB2YWx1ZV9maWVsZC0+c2V0X251bWJlcigyKTsKKyAgaWYgKG1hcF9maWVsZC52YWx1ZV90eXBlX25hbWUuZW1wdHkoKSkgeworICAgIHZhbHVlX2ZpZWxkLT5zZXRfdHlwZShtYXBfZmllbGQudmFsdWVfdHlwZSk7CisgIH0gZWxzZSB7CisgICAgdmFsdWVfZmllbGQtPnNldF90eXBlX25hbWUobWFwX2ZpZWxkLnZhbHVlX3R5cGVfbmFtZSk7CisgIH0KKyAgLy8gUHJvcGFnYXRlIHRoZSAiZW5mb3JjZV91dGY4IiBvcHRpb24gdG8ga2V5IGFuZCB2YWx1ZSBmaWVsZHMgaWYgdGhleQorICAvLyBhcmUgc3RyaW5ncy4gVGhpcyBoZWxwcyBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24gb2YgY29kZSBnZW5lcmF0b3JzCisgIC8vIGFuZCBhbHNvIHJlZmxlY3Rpb24tYmFzZWQgcGFyc2luZyBjb2RlLgorICAvLworICAvLyBUaGUgZm9sbG93aW5nIGRlZmluaXRpb246CisgIC8vICAgbWVzc2FnZSBGb28geworICAvLyAgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YWx1ZSA9IDEgW2VuZm9yY2VfdXRmOCA9IGZhbHNlXTsKKyAgLy8gICB9CisgIC8vIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXM6CisgIC8vICAgbWVzc2FnZSBGb28geworICAvLyAgICAgbWVzc2FnZSBWYWx1ZUVudHJ5IHsKKyAgLy8gICAgICAgb3B0aW9uIG1hcF9lbnRyeSA9IHRydWU7CisgIC8vICAgICAgIHN0cmluZyBrZXkgPSAxIFtlbmZvcmNlX3V0ZjggPSBmYWxzZV07CisgIC8vICAgICAgIHN0cmluZyB2YWx1ZSA9IDIgW2VuZm9yY2VfdXRmOCA9IGZhbHNlXTsKKyAgLy8gICAgIH0KKyAgLy8gICAgIHJlcGVhdGVkIFZhbHVlRW50cnkgdmFsdWUgPSAxIFtlbmZvcmNlX3V0ZjggPSBmYWxzZV07CisgIC8vICB9CisgIC8vCisgIC8vIFRPRE8oeGlhb2ZlbmcpOiBSZW1vdmUgdGhpcyB3aGVuIHRoZSAiZW5mb3JjZV91dGY4IiBvcHRpb24gaXMgcmVtb3ZlZAorICAvLyBmcm9tIHByb3RvY29sIGNvbXBpbGVyLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkLT5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24gPQorICAgICAgICBmaWVsZC0+b3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpOworICAgIGlmIChvcHRpb24ubmFtZV9zaXplKCkgPT0gMSAmJgorICAgICAgICBvcHRpb24ubmFtZSgwKS5uYW1lX3BhcnQoKSA9PSAiZW5mb3JjZV91dGY4IiAmJgorICAgICAgICAhb3B0aW9uLm5hbWUoMCkuaXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAgIGlmIChrZXlfZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkcpIHsKKyAgICAgICAga2V5X2ZpZWxkLT5tdXRhYmxlX29wdGlvbnMoKS0+YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCktPkNvcHlGcm9tKAorICAgICAgICAgICAgb3B0aW9uKTsKKyAgICAgIH0KKyAgICAgIGlmICh2YWx1ZV9maWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORykgeworICAgICAgICB2YWx1ZV9maWVsZC0+bXV0YWJsZV9vcHRpb25zKCktPmFkZF91bmludGVycHJldGVkX29wdGlvbigpLT5Db3B5RnJvbSgKKyAgICAgICAgICAgIG9wdGlvbik7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZUZpZWxkT3B0aW9ucyhGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CisgIGlmICghTG9va2luZ0F0KCJbIikpIHJldHVybiB0cnVlOworCisgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIpOworCisgIERPKENvbnN1bWUoIlsiKSk7CisKKyAgLy8gUGFyc2UgZmllbGQgb3B0aW9ucy4KKyAgZG8geworICAgIGlmIChMb29raW5nQXQoImRlZmF1bHQiKSkgeworICAgICAgLy8gV2UgaW50ZW50aW9uYWxseSBwYXNzIGZpZWxkX2xvY2F0aW9uIHJhdGhlciB0aGFuIGxvY2F0aW9uIGhlcmUsIHNpbmNlCisgICAgICAvLyB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBub3QgYWN0dWFsbHkgYW4gb3B0aW9uLgorICAgICAgRE8oUGFyc2VEZWZhdWx0QXNzaWdubWVudChmaWVsZCwgZmllbGRfbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSkpOworICAgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJqc29uX25hbWUiKSkgeworICAgICAgLy8gTGlrZSBkZWZhdWx0IHZhbHVlLCB0aGlzICJqc29uX25hbWUiIGlzIG5vdCBhbiBhY3R1YWwgb3B0aW9uLgorICAgICAgRE8oUGFyc2VKc29uTmFtZShmaWVsZCwgZmllbGRfbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSkpOworICAgIH0gZWxzZSB7CisgICAgICBETyhQYXJzZU9wdGlvbihmaWVsZC0+bXV0YWJsZV9vcHRpb25zKCksIGxvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICBPUFRJT05fQVNTSUdOTUVOVCkpOworICAgIH0KKyAgfSB3aGlsZSAoVHJ5Q29uc3VtZSgiLCIpKTsKKworICBETyhDb25zdW1lKCJdIikpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlRGVmYXVsdEFzc2lnbm1lbnQoCisgICAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLCBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbiwKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKKyAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgQWRkRXJyb3IoIkFscmVhZHkgc2V0IG9wdGlvbiBcImRlZmF1bHRcIi4iKTsKKyAgICBmaWVsZC0+Y2xlYXJfZGVmYXVsdF92YWx1ZSgpOworICB9CisKKyAgRE8oQ29uc3VtZSgiZGVmYXVsdCIpKTsKKyAgRE8oQ29uc3VtZSgiPSIpKTsKKworICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGZpZWxkX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjprRGVmYXVsdFZhbHVlRmllbGROdW1iZXIpOworICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbihmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFKTsKKyAgc3RkOjpzdHJpbmcqIGRlZmF1bHRfdmFsdWUgPSBmaWVsZC0+bXV0YWJsZV9kZWZhdWx0X3ZhbHVlKCk7CisKKyAgaWYgKCFmaWVsZC0+aGFzX3R5cGUoKSkgeworICAgIC8vIFRoZSBmaWVsZCBoYXMgYSB0eXBlIG5hbWUsIGJ1dCB3ZSBkb24ndCBrbm93IGlmIGl0IGlzIGEgbWVzc2FnZSBvciBhbgorICAgIC8vIGVudW0geWV0LiAoSWYgaXQgd2VyZSBhIHByaW1pdGl2ZSB0eXBlLCB8ZmllbGR8IHdvdWxkIGhhdmUgYSB0eXBlIHNldAorICAgIC8vIGFscmVhZHkuKSBJbiB0aGlzIGNhc2UsIHNpbXBseSB0YWtlIHRoZSBjdXJyZW50IHN0cmluZyBhcyB0aGUgZGVmYXVsdAorICAgIC8vIHZhbHVlOyB3ZSB3aWxsIGNhdGNoIHRoZSBlcnJvciBsYXRlciBpZiBpdCBpcyBub3QgYSB2YWxpZCBlbnVtIHZhbHVlLgorICAgIC8vIChOLkIuIHRoYXQgd2UgZG8gbm90IGNoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYW4gaWRlbnRpZmllcjoKKyAgICAvLyBkb2luZyBzbyB0aHJvd3Mgc3RyYW5nZSBlcnJvcnMgd2hlbiB0aGUgdXNlciBtaXN0eXBlcyBhIHByaW1pdGl2ZQorICAgIC8vIHR5cGVuYW1lIGFuZCB3ZSBhc3N1bWUgaXQncyBhbiBlbnVtLiBFLmcuOiAib3B0aW9uYWwgaW50IGZvbyA9IDEgW2RlZmF1bHQKKyAgICAvLyA9IDQyXSIuIEluIHN1Y2ggYSBjYXNlIHRoZSBmdW5kYW1lbnRhbCBlcnJvciBpcyByZWFsbHkgdGhhdCAiaW50IiBpcyBub3QKKyAgICAvLyBhIHR5cGUsIG5vdCB0aGF0ICI0MiIgaXMgbm90IGFuIGlkZW50aWZpZXIuIFNlZSBiLzEyNTMzNTgyLikKKyAgICAqZGVmYXVsdF92YWx1ZSA9IGlucHV0Xy0+Y3VycmVudCgpLnRleHQ7CisgICAgaW5wdXRfLT5OZXh0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzd2l0Y2ggKGZpZWxkLT50eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TRklYRUQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NGSVhFRDY0OiB7CisgICAgICB1aW50NjRfdCBtYXhfdmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKTsKKyAgICAgIGlmIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyIHx8CisgICAgICAgICAgZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TSU5UMzIgfHwKKyAgICAgICAgICBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NGSVhFRDMyKSB7CisgICAgICAgIG1heF92YWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpOworICAgICAgfQorCisgICAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgbmVnYXRpdmUuCisgICAgICBpZiAoVHJ5Q29uc3VtZSgiLSIpKSB7CisgICAgICAgIGRlZmF1bHRfdmFsdWUtPmFwcGVuZCgiLSIpOworICAgICAgICAvLyBUd28ncyBjb21wbGVtZW50IGFsd2F5cyBoYXMgb25lIG1vcmUgbmVnYXRpdmUgdmFsdWUgdGhhbiBwb3NpdGl2ZS4KKyAgICAgICAgKyttYXhfdmFsdWU7CisgICAgICB9CisgICAgICAvLyBQYXJzZSB0aGUgaW50ZWdlciB0byB2ZXJpZnkgdGhhdCBpdCBpcyBub3Qgb3V0LW9mLXJhbmdlLgorICAgICAgdWludDY0X3QgdmFsdWU7CisgICAgICBETyhDb25zdW1lSW50ZWdlcjY0KG1heF92YWx1ZSwgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaW50ZWdlciBmb3IgZmllbGQgZGVmYXVsdCB2YWx1ZS4iKSk7CisgICAgICAvLyBBbmQgc3RyaW5naWZ5IGl0IGFnYWluLgorICAgICAgZGVmYXVsdF92YWx1ZS0+YXBwZW5kKFN0ckNhdCh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9VSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9VSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9GSVhFRDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRklYRUQ2NDogeworICAgICAgdWludDY0X3QgbWF4X3ZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpOworICAgICAgaWYgKGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfVUlOVDMyIHx8CisgICAgICAgICAgZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9GSVhFRDMyKSB7CisgICAgICAgIG1heF92YWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKTsKKyAgICAgIH0KKworICAgICAgLy8gTnVtZXJpYywgbm90IG5lZ2F0aXZlLgorICAgICAgaWYgKFRyeUNvbnN1bWUoIi0iKSkgeworICAgICAgICBBZGRFcnJvcigiVW5zaWduZWQgZmllbGQgY2FuJ3QgaGF2ZSBuZWdhdGl2ZSBkZWZhdWx0IHZhbHVlLiIpOworICAgICAgfQorICAgICAgLy8gUGFyc2UgdGhlIGludGVnZXIgdG8gdmVyaWZ5IHRoYXQgaXQgaXMgbm90IG91dC1vZi1yYW5nZS4KKyAgICAgIHVpbnQ2NF90IHZhbHVlOworICAgICAgRE8oQ29uc3VtZUludGVnZXI2NChtYXhfdmFsdWUsICZ2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGludGVnZXIgZm9yIGZpZWxkIGRlZmF1bHQgdmFsdWUuIikpOworICAgICAgLy8gQW5kIHN0cmluZ2lmeSBpdCBhZ2Fpbi4KKyAgICAgIGRlZmF1bHRfdmFsdWUtPmFwcGVuZChTdHJDYXQodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRkxPQVQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9ET1VCTEU6CisgICAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgbmVnYXRpdmUuCisgICAgICBpZiAoVHJ5Q29uc3VtZSgiLSIpKSB7CisgICAgICAgIGRlZmF1bHRfdmFsdWUtPmFwcGVuZCgiLSIpOworICAgICAgfQorICAgICAgLy8gUGFyc2UgdGhlIGludGVnZXIgYmVjYXVzZSB3ZSBoYXZlIHRvIGNvbnZlcnQgaGV4IGludGVnZXJzIHRvIGRlY2ltYWwKKyAgICAgIC8vIGZsb2F0cy4KKyAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgIERPKENvbnN1bWVOdW1iZXIoJnZhbHVlLCAiRXhwZWN0ZWQgbnVtYmVyLiIpKTsKKyAgICAgIC8vIEFuZCBzdHJpbmdpZnkgaXQgYWdhaW4uCisgICAgICBkZWZhdWx0X3ZhbHVlLT5hcHBlbmQoU2ltcGxlRHRvYSh2YWx1ZSkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0JPT0w6CisgICAgICBpZiAoVHJ5Q29uc3VtZSgidHJ1ZSIpKSB7CisgICAgICAgIGRlZmF1bHRfdmFsdWUtPmFzc2lnbigidHJ1ZSIpOworICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCJmYWxzZSIpKSB7CisgICAgICAgIGRlZmF1bHRfdmFsdWUtPmFzc2lnbigiZmFsc2UiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFkZEVycm9yKCJFeHBlY3RlZCBcInRydWVcIiBvciBcImZhbHNlXCIuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkc6CisgICAgICAvLyBOb3RlOiBXaGVuIGZpbGUgb3B0aW9uIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjggaXMgdHJ1ZSwgaWYgYQorICAgICAgLy8gbm9uLXN0cmluZyByZXByZXNlbnRhdGlvbiAoZWcgYnl0ZVtdKSBpcyBsYXRlciBzdXBwb3J0ZWQsIGl0IG11c3QKKyAgICAgIC8vIGJlIGNoZWNrZWQgZm9yIFVURi04LW5lc3MuCisgICAgICBETyhDb25zdW1lU3RyaW5nKGRlZmF1bHRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBzdHJpbmcgZm9yIGZpZWxkIGRlZmF1bHQgIgorICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUuIikpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0JZVEVTOgorICAgICAgRE8oQ29uc3VtZVN0cmluZyhkZWZhdWx0X3ZhbHVlLCAiRXhwZWN0ZWQgc3RyaW5nLiIpKTsKKyAgICAgICpkZWZhdWx0X3ZhbHVlID0gQ0VzY2FwZSgqZGVmYXVsdF92YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTToKKyAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKGRlZmF1bHRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZW51bSBpZGVudGlmaWVyIGZvciBmaWVsZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCB2YWx1ZS4iKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfTUVTU0FHRToKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0dST1VQOgorICAgICAgQWRkRXJyb3IoIk1lc3NhZ2VzIGNhbid0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlSnNvbk5hbWUoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKKyAgaWYgKGZpZWxkLT5oYXNfanNvbl9uYW1lKCkpIHsKKyAgICBBZGRFcnJvcigiQWxyZWFkeSBzZXQgb3B0aW9uIFwianNvbl9uYW1lXCIuIik7CisgICAgZmllbGQtPmNsZWFyX2pzb25fbmFtZSgpOworICB9CisKKyAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihmaWVsZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6a0pzb25OYW1lRmllbGROdW1iZXIpOworICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbihmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPUFRJT05fTkFNRSk7CisKKyAgRE8oQ29uc3VtZSgianNvbl9uYW1lIikpOworICBETyhDb25zdW1lKCI9IikpOworCisgIExvY2F0aW9uUmVjb3JkZXIgdmFsdWVfbG9jYXRpb24obG9jYXRpb24pOworICB2YWx1ZV9sb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKKyAgICAgIGZpZWxkLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9QVElPTl9WQUxVRSk7CisKKyAgRE8oQ29uc3VtZVN0cmluZyhmaWVsZC0+bXV0YWJsZV9qc29uX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgc3RyaW5nIGZvciBKU09OIG5hbWUuIikpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlT3B0aW9uTmFtZVBhcnQoVW5pbnRlcnByZXRlZE9wdGlvbiogdW5pbnRlcnByZXRlZF9vcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJ0X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CisgIFVuaW50ZXJwcmV0ZWRPcHRpb246Ok5hbWVQYXJ0KiBuYW1lID0gdW5pbnRlcnByZXRlZF9vcHRpb24tPmFkZF9uYW1lKCk7CisgIHN0ZDo6c3RyaW5nIGlkZW50aWZpZXI7ICAvLyBXZSBwYXJzZSBpZGVudGlmaWVycyBpbnRvIHRoaXMgc3RyaW5nLgorICBpZiAoTG9va2luZ0F0KCIoIikpIHsgICAgLy8gVGhpcyBpcyBhbiBleHRlbnNpb24uCisgICAgRE8oQ29uc3VtZSgiKCIpKTsKKworICAgIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oCisgICAgICAgICAgcGFydF9sb2NhdGlvbiwgVW5pbnRlcnByZXRlZE9wdGlvbjo6TmFtZVBhcnQ6OmtOYW1lUGFydEZpZWxkTnVtYmVyKTsKKyAgICAgIC8vIEFuIGV4dGVuc2lvbiBuYW1lIGNvbnNpc3RzIG9mIGRvdC1zZXBhcmF0ZWQgaWRlbnRpZmllcnMsIGFuZCBtYXkgYmVnaW4KKyAgICAgIC8vIHdpdGggYSBkb3QuCisgICAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIpKSB7CisgICAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZpZGVudGlmaWVyLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iKSk7CisgICAgICAgIG5hbWUtPm11dGFibGVfbmFtZV9wYXJ0KCktPmFwcGVuZChpZGVudGlmaWVyKTsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChMb29raW5nQXQoIi4iKSkgeworICAgICAgICBETyhDb25zdW1lKCIuIikpOworICAgICAgICBuYW1lLT5tdXRhYmxlX25hbWVfcGFydCgpLT5hcHBlbmQoIi4iKTsKKyAgICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJmlkZW50aWZpZXIsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIpKTsKKyAgICAgICAgbmFtZS0+bXV0YWJsZV9uYW1lX3BhcnQoKS0+YXBwZW5kKGlkZW50aWZpZXIpOworICAgICAgfQorICAgIH0KKworICAgIERPKENvbnN1bWUoIikiKSk7CisgICAgbmFtZS0+c2V0X2lzX2V4dGVuc2lvbih0cnVlKTsKKyAgfSBlbHNlIHsgIC8vIFRoaXMgaXMgYSByZWd1bGFyIGZpZWxkLgorICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oCisgICAgICAgIHBhcnRfbG9jYXRpb24sIFVuaW50ZXJwcmV0ZWRPcHRpb246Ok5hbWVQYXJ0OjprTmFtZVBhcnRGaWVsZE51bWJlcik7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJmlkZW50aWZpZXIsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIpKTsKKyAgICBuYW1lLT5tdXRhYmxlX25hbWVfcGFydCgpLT5hcHBlbmQoaWRlbnRpZmllcik7CisgICAgbmFtZS0+c2V0X2lzX2V4dGVuc2lvbihmYWxzZSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZVVuaW50ZXJwcmV0ZWRCbG9jayhzdGQ6OnN0cmluZyogdmFsdWUpIHsKKyAgLy8gTm90ZSB0aGF0IGVuY2xvc2luZyBicmFjZXMgYXJlIG5vdCBhZGRlZCB0byAqdmFsdWUuCisgIC8vIFdlIGRvIE5PVCB1c2UgQ29uc3VtZUVuZE9mU3RhdGVtZW50IGZvciB0aGlzIGJyYWNlIGJlY2F1c2UgaXQncyBkZWxpbWl0aW5nCisgIC8vIGFuIGV4cHJlc3Npb24sIG5vdCBhIGJsb2NrIG9mIHN0YXRlbWVudHMuCisgIERPKENvbnN1bWUoInsiKSk7CisgIGludCBicmFjZV9kZXB0aCA9IDE7CisgIHdoaWxlICghQXRFbmQoKSkgeworICAgIGlmIChMb29raW5nQXQoInsiKSkgeworICAgICAgYnJhY2VfZGVwdGgrKzsKKyAgICB9IGVsc2UgaWYgKExvb2tpbmdBdCgifSIpKSB7CisgICAgICBicmFjZV9kZXB0aC0tOworICAgICAgaWYgKGJyYWNlX2RlcHRoID09IDApIHsKKyAgICAgICAgaW5wdXRfLT5OZXh0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICAvLyBUT0RPKHNhbmpheSk6IEludGVycHJldCBsaW5lL2NvbHVtbiBudW1iZXJzIHRvIHByZXNlcnZlIGZvcm1hdHRpbmcKKyAgICBpZiAoIXZhbHVlLT5lbXB0eSgpKSB2YWx1ZS0+cHVzaF9iYWNrKCcgJyk7CisgICAgdmFsdWUtPmFwcGVuZChpbnB1dF8tPmN1cnJlbnQoKS50ZXh0KTsKKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgfQorICBBZGRFcnJvcigiVW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtIHdoaWxlIHBhcnNpbmcgYWdncmVnYXRlIHZhbHVlLiIpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFdlIGRvbid0IGludGVycHJldCB0aGUgb3B0aW9uIGhlcmUuIEluc3RlYWQgd2Ugc3RvcmUgaXQgaW4gYW4KKy8vIFVuaW50ZXJwcmV0ZWRPcHRpb24sIHRvIGJlIGludGVycHJldGVkIGxhdGVyLgorYm9vbCBQYXJzZXI6OlBhcnNlT3B0aW9uKE1lc3NhZ2UqIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgb3B0aW9uc19sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uU3R5bGUgc3R5bGUpIHsKKyAgLy8gQ3JlYXRlIGFuIGVudHJ5IGluIHRoZSB1bmludGVycHJldGVkX29wdGlvbiBmaWVsZC4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB1bmludGVycHJldGVkX29wdGlvbl9maWVsZCA9CisgICAgICBvcHRpb25zLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgidW5pbnRlcnByZXRlZF9vcHRpb24iKTsKKyAgR09PR0xFX0NIRUNLKHVuaW50ZXJwcmV0ZWRfb3B0aW9uX2ZpZWxkICE9IG51bGxwdHIpCisgICAgICA8PCAiTm8gZmllbGQgbmFtZWQgXCJ1bmludGVycHJldGVkX29wdGlvblwiIGluIHRoZSBPcHRpb25zIHByb3RvLiI7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG9wdGlvbnMtPkdldFJlZmxlY3Rpb24oKTsKKworICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAorICAgICAgb3B0aW9uc19sb2NhdGlvbiwgdW5pbnRlcnByZXRlZF9vcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgcmVmbGVjdGlvbi0+RmllbGRTaXplKCpvcHRpb25zLCB1bmludGVycHJldGVkX29wdGlvbl9maWVsZCkpOworCisgIGlmIChzdHlsZSA9PSBPUFRJT05fU1RBVEVNRU5UKSB7CisgICAgRE8oQ29uc3VtZSgib3B0aW9uIikpOworICB9CisKKyAgVW5pbnRlcnByZXRlZE9wdGlvbiogdW5pbnRlcnByZXRlZF9vcHRpb24gPQorICAgICAgZG93bl9jYXN0PFVuaW50ZXJwcmV0ZWRPcHRpb24qPihvcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPkFkZE1lc3NhZ2UoCisgICAgICAgICAgb3B0aW9ucywgdW5pbnRlcnByZXRlZF9vcHRpb25fZmllbGQpKTsKKworICAvLyBQYXJzZSBkb3Qtc2VwYXJhdGVkIG5hbWUuCisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIG5hbWVfbG9jYXRpb24obG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb246OmtOYW1lRmllbGROdW1iZXIpOworICAgIG5hbWVfbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCisgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9QVElPTl9OQU1FKTsKKworICAgIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgcGFydF9sb2NhdGlvbihuYW1lX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLT5uYW1lX3NpemUoKSk7CisgICAgICBETyhQYXJzZU9wdGlvbk5hbWVQYXJ0KHVuaW50ZXJwcmV0ZWRfb3B0aW9uLCBwYXJ0X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX2ZpbGUpKTsKKyAgICB9CisKKyAgICB3aGlsZSAoTG9va2luZ0F0KCIuIikpIHsKKyAgICAgIERPKENvbnN1bWUoIi4iKSk7CisgICAgICBMb2NhdGlvblJlY29yZGVyIHBhcnRfbG9jYXRpb24obmFtZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+bmFtZV9zaXplKCkpOworICAgICAgRE8oUGFyc2VPcHRpb25OYW1lUGFydCh1bmludGVycHJldGVkX29wdGlvbiwgcGFydF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ19maWxlKSk7CisgICAgfQorICB9CisKKyAgRE8oQ29uc3VtZSgiPSIpKTsKKworICB7CisgICAgTG9jYXRpb25SZWNvcmRlciB2YWx1ZV9sb2NhdGlvbihsb2NhdGlvbik7CisgICAgdmFsdWVfbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCisgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9QVElPTl9WQUxVRSk7CisKKyAgICAvLyBBbGwgdmFsdWVzIGFyZSBhIHNpbmdsZSB0b2tlbiwgZXhjZXB0IGZvciBuZWdhdGl2ZSBudW1iZXJzLCB3aGljaCBjb25zaXN0CisgICAgLy8gb2YgYSBzaW5nbGUgJy0nIHN5bWJvbCwgZm9sbG93ZWQgYnkgYSBwb3NpdGl2ZSBudW1iZXIuCisgICAgYm9vbCBpc19uZWdhdGl2ZSA9IFRyeUNvbnN1bWUoIi0iKTsKKworICAgIHN3aXRjaCAoaW5wdXRfLT5jdXJyZW50KCkudHlwZSkgeworICAgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX1NUQVJUOgorICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVHJ5aW5nIHRvIHJlYWQgdmFsdWUgYmVmb3JlIGFueSB0b2tlbnMgaGF2ZSBiZWVuIHJlYWQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBjYXNlIGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5EOgorICAgICAgICBBZGRFcnJvcigiVW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtIHdoaWxlIHBhcnNpbmcgb3B0aW9uIHZhbHVlLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9XSElURVNQQUNFOgorICAgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX05FV0xJTkU6CisgICAgICAgIEdPT0dMRV9DSEVDSyghaW5wdXRfLT5yZXBvcnRfd2hpdGVzcGFjZSgpICYmICFpbnB1dF8tPnJlcG9ydF9uZXdsaW5lcygpKQorICAgICAgICAgICAgPDwgIldoaXRlc3BhY2UgdG9rZW5zIHdlcmUgbm90IHJlcXVlc3RlZC4iOworICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVG9rZW5pemVyIHJlcG9ydGVkIHdoaXRlc3BhY2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBjYXNlIGlvOjpUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUjogeworICAgICAgICB2YWx1ZV9sb2NhdGlvbi5BZGRQYXRoKAorICAgICAgICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbjo6a0lkZW50aWZpZXJWYWx1ZUZpZWxkTnVtYmVyKTsKKyAgICAgICAgaWYgKGlzX25lZ2F0aXZlKSB7CisgICAgICAgICAgQWRkRXJyb3IoIkludmFsaWQgJy0nIHN5bWJvbCBiZWZvcmUgaWRlbnRpZmllci4iKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWU7CisgICAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZ2YWx1ZSwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIikpOworICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X2lkZW50aWZpZXJfdmFsdWUodmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVI6IHsKKyAgICAgICAgdWludDY0X3QgdmFsdWU7CisgICAgICAgIHVpbnQ2NF90IG1heF92YWx1ZSA9CisgICAgICAgICAgICBpc19uZWdhdGl2ZQorICAgICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpKSArIDEKKyAgICAgICAgICAgICAgICA6IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKTsKKyAgICAgICAgRE8oQ29uc3VtZUludGVnZXI2NChtYXhfdmFsdWUsICZ2YWx1ZSwgIkV4cGVjdGVkIGludGVnZXIuIikpOworICAgICAgICBpZiAoaXNfbmVnYXRpdmUpIHsKKyAgICAgICAgICB2YWx1ZV9sb2NhdGlvbi5BZGRQYXRoKAorICAgICAgICAgICAgICBVbmludGVycHJldGVkT3B0aW9uOjprTmVnYXRpdmVJbnRWYWx1ZUZpZWxkTnVtYmVyKTsKKyAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X25lZ2F0aXZlX2ludF92YWx1ZSgKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4oMCAtIHZhbHVlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aCgKKyAgICAgICAgICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbjo6a1Bvc2l0aXZlSW50VmFsdWVGaWVsZE51bWJlcik7CisgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24tPnNldF9wb3NpdGl2ZV9pbnRfdmFsdWUodmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGlvOjpUb2tlbml6ZXI6OlRZUEVfRkxPQVQ6IHsKKyAgICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aChVbmludGVycHJldGVkT3B0aW9uOjprRG91YmxlVmFsdWVGaWVsZE51bWJlcik7CisgICAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgICAgRE8oQ29uc3VtZU51bWJlcigmdmFsdWUsICJFeHBlY3RlZCBudW1iZXIuIikpOworICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X2RvdWJsZV92YWx1ZShpc19uZWdhdGl2ZSA/IC12YWx1ZSA6IHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkc6IHsKKyAgICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aChVbmludGVycHJldGVkT3B0aW9uOjprU3RyaW5nVmFsdWVGaWVsZE51bWJlcik7CisgICAgICAgIGlmIChpc19uZWdhdGl2ZSkgeworICAgICAgICAgIEFkZEVycm9yKCJJbnZhbGlkICctJyBzeW1ib2wgYmVmb3JlIHN0cmluZy4iKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWU7CisgICAgICAgIERPKENvbnN1bWVTdHJpbmcoJnZhbHVlLCAiRXhwZWN0ZWQgc3RyaW5nLiIpKTsKKyAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24tPnNldF9zdHJpbmdfdmFsdWUodmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX1NZTUJPTDoKKyAgICAgICAgaWYgKExvb2tpbmdBdCgieyIpKSB7CisgICAgICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aCgKKyAgICAgICAgICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbjo6a0FnZ3JlZ2F0ZVZhbHVlRmllbGROdW1iZXIpOworICAgICAgICAgIERPKFBhcnNlVW5pbnRlcnByZXRlZEJsb2NrKAorICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+bXV0YWJsZV9hZ2dyZWdhdGVfdmFsdWUoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEFkZEVycm9yKCJFeHBlY3RlZCBvcHRpb24gdmFsdWUuIik7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChzdHlsZSA9PSBPUFRJT05fU1RBVEVNRU5UKSB7CisgICAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCAmbG9jYXRpb24pKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VFeHRlbnNpb25zKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZXh0ZW5zaW9uc19sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CisgIC8vIFBhcnNlIHRoZSBkZWNsYXJhdGlvbi4KKyAgRE8oQ29uc3VtZSgiZXh0ZW5zaW9ucyIpKTsKKworICBpbnQgb2xkX3JhbmdlX3NpemUgPSBtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2Vfc2l6ZSgpOworCisgIGRvIHsKKyAgICAvLyBOb3RlIHRoYXQga0V4dGVuc2lvblJhbmdlRmllbGROdW1iZXIgd2FzIGFscmVhZHkgcHVzaGVkIGJ5IHRoZSBwYXJlbnQuCisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihleHRlbnNpb25zX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKSk7CisKKyAgICBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlKiByYW5nZSA9IG1lc3NhZ2UtPmFkZF9leHRlbnNpb25fcmFuZ2UoKTsKKyAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbihyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUik7CisKKyAgICBpbnQgc3RhcnQsIGVuZDsKKyAgICBpbzo6VG9rZW5pemVyOjpUb2tlbiBzdGFydF90b2tlbjsKKworICAgIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgc3RhcnRfbG9jYXRpb24oCisgICAgICAgICAgbG9jYXRpb24sIERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2U6OmtTdGFydEZpZWxkTnVtYmVyKTsKKyAgICAgIHN0YXJ0X3Rva2VuID0gaW5wdXRfLT5jdXJyZW50KCk7CisgICAgICBETyhDb25zdW1lSW50ZWdlcigmc3RhcnQsICJFeHBlY3RlZCBmaWVsZCBudW1iZXIgcmFuZ2UuIikpOworICAgIH0KKworICAgIGlmIChUcnlDb25zdW1lKCJ0byIpKSB7CisgICAgICBMb2NhdGlvblJlY29yZGVyIGVuZF9sb2NhdGlvbigKKyAgICAgICAgICBsb2NhdGlvbiwgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZTo6a0VuZEZpZWxkTnVtYmVyKTsKKyAgICAgIGlmIChUcnlDb25zdW1lKCJtYXgiKSkgeworICAgICAgICAvLyBTZXQgdG8gdGhlIHNlbnRpbmVsIHZhbHVlIC0gMSBzaW5jZSB3ZSBpbmNyZW1lbnQgdGhlIHZhbHVlIGJlbG93LgorICAgICAgICAvLyBUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHNob3VsZCBiZSBzZXQgd2l0aAorICAgICAgICAvLyBBZGp1c3RFeHRlbnNpb25SYW5nZXNXaXRoTWF4RW5kTnVtYmVyLgorICAgICAgICBlbmQgPSBrTWF4UmFuZ2VTZW50aW5lbCAtIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBETyhDb25zdW1lSW50ZWdlcigmZW5kLCAiRXhwZWN0ZWQgaW50ZWdlci4iKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgZW5kX2xvY2F0aW9uKAorICAgICAgICAgIGxvY2F0aW9uLCBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlOjprRW5kRmllbGROdW1iZXIpOworICAgICAgZW5kX2xvY2F0aW9uLlN0YXJ0QXQoc3RhcnRfdG9rZW4pOworICAgICAgZW5kX2xvY2F0aW9uLkVuZEF0KHN0YXJ0X3Rva2VuKTsKKyAgICAgIGVuZCA9IHN0YXJ0OworICAgIH0KKworICAgIC8vIFVzZXJzIGxpa2UgdG8gc3BlY2lmeSBpbmNsdXNpdmUgcmFuZ2VzLCBidXQgaW4gY29kZSB3ZSBsaWtlIHRoZSBlbmQKKyAgICAvLyBudW1iZXIgdG8gYmUgZXhjbHVzaXZlLgorICAgICsrZW5kOworCisgICAgcmFuZ2UtPnNldF9zdGFydChzdGFydCk7CisgICAgcmFuZ2UtPnNldF9lbmQoZW5kKTsKKyAgfSB3aGlsZSAoVHJ5Q29uc3VtZSgiLCIpKTsKKworICBpZiAoTG9va2luZ0F0KCJbIikpIHsKKyAgICBpbnQgcmFuZ2VfbnVtYmVyX2luZGV4ID0gZXh0ZW5zaW9uc19sb2NhdGlvbi5DdXJyZW50UGF0aFNpemUoKTsKKyAgICBTb3VyY2VDb2RlSW5mbyBpbmZvOworCisgICAgLy8gUGFyc2UgZXh0ZW5zaW9uIHJhbmdlIG9wdGlvbnMgaW4gdGhlIGZpcnN0IHJhbmdlLgorICAgIEV4dGVuc2lvblJhbmdlT3B0aW9ucyogb3B0aW9ucyA9CisgICAgICAgIG1lc3NhZ2UtPm11dGFibGVfZXh0ZW5zaW9uX3JhbmdlKG9sZF9yYW5nZV9zaXplKS0+bXV0YWJsZV9vcHRpb25zKCk7CisKKyAgICB7CisgICAgICBMb2NhdGlvblJlY29yZGVyIGluZGV4X2xvY2F0aW9uKAorICAgICAgICAgIGV4dGVuc2lvbnNfbG9jYXRpb24sIDAgLyogd2UgZmlsbCB0aGlzIGluIHcvIGFjdHVhbCBpbmRleCBiZWxvdyAqLywKKyAgICAgICAgICAmaW5mbyk7CisgICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAorICAgICAgICAgIGluZGV4X2xvY2F0aW9uLCBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlOjprT3B0aW9uc0ZpZWxkTnVtYmVyKTsKKyAgICAgIERPKENvbnN1bWUoIlsiKSk7CisKKyAgICAgIGRvIHsKKyAgICAgICAgRE8oUGFyc2VPcHRpb24ob3B0aW9ucywgbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSwgT1BUSU9OX0FTU0lHTk1FTlQpKTsKKyAgICAgIH0gd2hpbGUgKFRyeUNvbnN1bWUoIiwiKSk7CisKKyAgICAgIERPKENvbnN1bWUoIl0iKSk7CisgICAgfQorCisgICAgLy8gVGhlbiBjb3B5IHRoZSBleHRlbnNpb24gcmFuZ2Ugb3B0aW9ucyB0byBhbGwgb2YgdGhlIG90aGVyIHJhbmdlcyB3ZSd2ZQorICAgIC8vIHBhcnNlZC4KKyAgICBmb3IgKGludCBpID0gb2xkX3JhbmdlX3NpemUgKyAxOyBpIDwgbWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKTsgaSsrKSB7CisgICAgICBtZXNzYWdlLT5tdXRhYmxlX2V4dGVuc2lvbl9yYW5nZShpKS0+bXV0YWJsZV9vcHRpb25zKCktPkNvcHlGcm9tKAorICAgICAgICAgICpvcHRpb25zKTsKKyAgICB9CisgICAgLy8gYW5kIGNvcHkgc291cmNlIGxvY2F0aW9ucyB0byB0aGUgb3RoZXIgcmFuZ2VzLCB0b28KKyAgICBmb3IgKGludCBpID0gb2xkX3JhbmdlX3NpemU7IGkgPCBtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2Vfc2l6ZSgpOyBpKyspIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW5mby5sb2NhdGlvbl9zaXplKCk7IGorKykgeworICAgICAgICBpZiAoaW5mby5sb2NhdGlvbihqKS5wYXRoX3NpemUoKSA9PSByYW5nZV9udW1iZXJfaW5kZXggKyAxKSB7CisgICAgICAgICAgLy8gdGhpcyBsb2NhdGlvbidzIHBhdGggaXMgdXAgdG8gdGhlIGV4dGVuc2lvbiByYW5nZSBpbmRleCwgYnV0CisgICAgICAgICAgLy8gZG9lc24ndCBpbmNsdWRlIG9wdGlvbnM7IHNvIGl0J3MgcmVkdW5kYW50IHdpdGggbG9jYXRpb24gYWJvdmUKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogZGVzdCA9IHNvdXJjZV9jb2RlX2luZm9fLT5hZGRfbG9jYXRpb24oKTsKKyAgICAgICAgKmRlc3QgPSBpbmZvLmxvY2F0aW9uKGopOworICAgICAgICBkZXN0LT5zZXRfcGF0aChyYW5nZV9udW1iZXJfaW5kZXgsIGkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJmV4dGVuc2lvbnNfbG9jYXRpb24pKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRoaXMgaXMgc2ltaWxhciB0byBleHRlbnNpb24gcmFuZ2UgcGFyc2luZywgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBmaWVsZAorLy8gbmFtZSBsaXRlcmFscy4KK2Jvb2wgUGFyc2VyOjpQYXJzZVJlc2VydmVkKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24pIHsKKyAgaW86OlRva2VuaXplcjo6VG9rZW4gc3RhcnRfdG9rZW4gPSBpbnB1dF8tPmN1cnJlbnQoKTsKKyAgLy8gUGFyc2UgdGhlIGRlY2xhcmF0aW9uLgorICBETyhDb25zdW1lKCJyZXNlcnZlZCIpKTsKKyAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkcpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprUmVzZXJ2ZWROYW1lRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlN0YXJ0QXQoc3RhcnRfdG9rZW4pOworICAgIHJldHVybiBQYXJzZVJlc2VydmVkTmFtZXMobWVzc2FnZSwgbG9jYXRpb24pOworICB9IGVsc2UgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24obWVzc2FnZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a1Jlc2VydmVkUmFuZ2VGaWVsZE51bWJlcik7CisgICAgbG9jYXRpb24uU3RhcnRBdChzdGFydF90b2tlbik7CisgICAgcmV0dXJuIFBhcnNlUmVzZXJ2ZWROdW1iZXJzKG1lc3NhZ2UsIGxvY2F0aW9uKTsKKyAgfQorfQorCitib29sIFBhcnNlcjo6UGFyc2VSZXNlcnZlZE5hbWVzKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uKSB7CisgIGRvIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHBhcmVudF9sb2NhdGlvbiwgbWVzc2FnZS0+cmVzZXJ2ZWRfbmFtZV9zaXplKCkpOworICAgIERPKENvbnN1bWVTdHJpbmcobWVzc2FnZS0+YWRkX3Jlc2VydmVkX25hbWUoKSwgIkV4cGVjdGVkIGZpZWxkIG5hbWUuIikpOworICB9IHdoaWxlIChUcnlDb25zdW1lKCIsIikpOworICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsICZwYXJlbnRfbG9jYXRpb24pKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZVJlc2VydmVkTnVtYmVycyhEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uKSB7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBkbyB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihwYXJlbnRfbG9jYXRpb24sIG1lc3NhZ2UtPnJlc2VydmVkX3JhbmdlX3NpemUoKSk7CisKKyAgICBEZXNjcmlwdG9yUHJvdG86OlJlc2VydmVkUmFuZ2UqIHJhbmdlID0gbWVzc2FnZS0+YWRkX3Jlc2VydmVkX3JhbmdlKCk7CisgICAgaW50IHN0YXJ0LCBlbmQ7CisgICAgaW86OlRva2VuaXplcjo6VG9rZW4gc3RhcnRfdG9rZW47CisgICAgeworICAgICAgTG9jYXRpb25SZWNvcmRlciBzdGFydF9sb2NhdGlvbigKKyAgICAgICAgICBsb2NhdGlvbiwgRGVzY3JpcHRvclByb3RvOjpSZXNlcnZlZFJhbmdlOjprU3RhcnRGaWVsZE51bWJlcik7CisgICAgICBzdGFydF90b2tlbiA9IGlucHV0Xy0+Y3VycmVudCgpOworICAgICAgRE8oQ29uc3VtZUludGVnZXIoJnN0YXJ0LCAoZmlyc3QgPyAiRXhwZWN0ZWQgZmllbGQgbmFtZSBvciBudW1iZXIgcmFuZ2UuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiRXhwZWN0ZWQgZmllbGQgbnVtYmVyIHJhbmdlLiIpKSk7CisgICAgfQorCisgICAgaWYgKFRyeUNvbnN1bWUoInRvIikpIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgZW5kX2xvY2F0aW9uKAorICAgICAgICAgIGxvY2F0aW9uLCBEZXNjcmlwdG9yUHJvdG86OlJlc2VydmVkUmFuZ2U6OmtFbmRGaWVsZE51bWJlcik7CisgICAgICBpZiAoVHJ5Q29uc3VtZSgibWF4IikpIHsKKyAgICAgICAgLy8gU2V0IHRvIHRoZSBzZW50aW5lbCB2YWx1ZSAtIDEgc2luY2Ugd2UgaW5jcmVtZW50IHRoZSB2YWx1ZSBiZWxvdy4KKyAgICAgICAgLy8gVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZW5kIG9mIHRoZSByYW5nZSBzaG91bGQgYmUgc2V0IHdpdGgKKyAgICAgICAgLy8gQWRqdXN0RXh0ZW5zaW9uUmFuZ2VzV2l0aE1heEVuZE51bWJlci4KKyAgICAgICAgZW5kID0ga01heFJhbmdlU2VudGluZWwgLSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRE8oQ29uc3VtZUludGVnZXIoJmVuZCwgIkV4cGVjdGVkIGludGVnZXIuIikpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBMb2NhdGlvblJlY29yZGVyIGVuZF9sb2NhdGlvbigKKyAgICAgICAgICBsb2NhdGlvbiwgRGVzY3JpcHRvclByb3RvOjpSZXNlcnZlZFJhbmdlOjprRW5kRmllbGROdW1iZXIpOworICAgICAgZW5kX2xvY2F0aW9uLlN0YXJ0QXQoc3RhcnRfdG9rZW4pOworICAgICAgZW5kX2xvY2F0aW9uLkVuZEF0KHN0YXJ0X3Rva2VuKTsKKyAgICAgIGVuZCA9IHN0YXJ0OworICAgIH0KKworICAgIC8vIFVzZXJzIGxpa2UgdG8gc3BlY2lmeSBpbmNsdXNpdmUgcmFuZ2VzLCBidXQgaW4gY29kZSB3ZSBsaWtlIHRoZSBlbmQKKyAgICAvLyBudW1iZXIgdG8gYmUgZXhjbHVzaXZlLgorICAgICsrZW5kOworCisgICAgcmFuZ2UtPnNldF9zdGFydChzdGFydCk7CisgICAgcmFuZ2UtPnNldF9lbmQoZW5kKTsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9IHdoaWxlIChUcnlDb25zdW1lKCIsIikpOworCisgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJnBhcmVudF9sb2NhdGlvbikpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlUmVzZXJ2ZWQoRW51bURlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24pIHsKKyAgaW86OlRva2VuaXplcjo6VG9rZW4gc3RhcnRfdG9rZW4gPSBpbnB1dF8tPmN1cnJlbnQoKTsKKyAgLy8gUGFyc2UgdGhlIGRlY2xhcmF0aW9uLgorICBETyhDb25zdW1lKCJyZXNlcnZlZCIpKTsKKyAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkcpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bURlc2NyaXB0b3JQcm90bzo6a1Jlc2VydmVkTmFtZUZpZWxkTnVtYmVyKTsKKyAgICBsb2NhdGlvbi5TdGFydEF0KHN0YXJ0X3Rva2VuKTsKKyAgICByZXR1cm4gUGFyc2VSZXNlcnZlZE5hbWVzKG1lc3NhZ2UsIGxvY2F0aW9uKTsKKyAgfSBlbHNlIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvclByb3RvOjprUmVzZXJ2ZWRSYW5nZUZpZWxkTnVtYmVyKTsKKyAgICBsb2NhdGlvbi5TdGFydEF0KHN0YXJ0X3Rva2VuKTsKKyAgICByZXR1cm4gUGFyc2VSZXNlcnZlZE51bWJlcnMobWVzc2FnZSwgbG9jYXRpb24pOworICB9Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZVJlc2VydmVkTmFtZXMoRW51bURlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uKSB7CisgIGRvIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHBhcmVudF9sb2NhdGlvbiwgbWVzc2FnZS0+cmVzZXJ2ZWRfbmFtZV9zaXplKCkpOworICAgIERPKENvbnN1bWVTdHJpbmcobWVzc2FnZS0+YWRkX3Jlc2VydmVkX25hbWUoKSwgIkV4cGVjdGVkIGVudW0gdmFsdWUuIikpOworICB9IHdoaWxlIChUcnlDb25zdW1lKCIsIikpOworICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsICZwYXJlbnRfbG9jYXRpb24pKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZVJlc2VydmVkTnVtYmVycyhFbnVtRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbikgeworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZG8geworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24ocGFyZW50X2xvY2F0aW9uLCBtZXNzYWdlLT5yZXNlcnZlZF9yYW5nZV9zaXplKCkpOworCisgICAgRW51bURlc2NyaXB0b3JQcm90bzo6RW51bVJlc2VydmVkUmFuZ2UqIHJhbmdlID0KKyAgICAgICAgbWVzc2FnZS0+YWRkX3Jlc2VydmVkX3JhbmdlKCk7CisgICAgaW50IHN0YXJ0LCBlbmQ7CisgICAgaW86OlRva2VuaXplcjo6VG9rZW4gc3RhcnRfdG9rZW47CisgICAgeworICAgICAgTG9jYXRpb25SZWNvcmRlciBzdGFydF9sb2NhdGlvbigKKyAgICAgICAgICBsb2NhdGlvbiwgRW51bURlc2NyaXB0b3JQcm90bzo6RW51bVJlc2VydmVkUmFuZ2U6OmtTdGFydEZpZWxkTnVtYmVyKTsKKyAgICAgIHN0YXJ0X3Rva2VuID0gaW5wdXRfLT5jdXJyZW50KCk7CisgICAgICBETyhDb25zdW1lU2lnbmVkSW50ZWdlcigmc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlyc3QgPyAiRXhwZWN0ZWQgZW51bSB2YWx1ZSBvciBudW1iZXIgcmFuZ2UuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkV4cGVjdGVkIGVudW0gbnVtYmVyIHJhbmdlLiIpKSk7CisgICAgfQorCisgICAgaWYgKFRyeUNvbnN1bWUoInRvIikpIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgZW5kX2xvY2F0aW9uKAorICAgICAgICAgIGxvY2F0aW9uLCBFbnVtRGVzY3JpcHRvclByb3RvOjpFbnVtUmVzZXJ2ZWRSYW5nZTo6a0VuZEZpZWxkTnVtYmVyKTsKKyAgICAgIGlmIChUcnlDb25zdW1lKCJtYXgiKSkgeworICAgICAgICAvLyBUaGlzIGlzIGluIHRoZSBlbnVtIGRlc2NyaXB0b3IgcGF0aCwgd2hpY2ggZG9lc24ndCBoYXZlIHRoZSBtZXNzYWdlCisgICAgICAgIC8vIHNldCBkdWFsaXR5IHRvIGZpeCB1cCwgc28gaXQgZG9lc24ndCBpbnRlZ3JhdGUgd2l0aCB0aGUgc2VudGluZWwuCisgICAgICAgIGVuZCA9IElOVF9NQVg7CisgICAgICB9IGVsc2UgeworICAgICAgICBETyhDb25zdW1lU2lnbmVkSW50ZWdlcigmZW5kLCAiRXhwZWN0ZWQgaW50ZWdlci4iKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgZW5kX2xvY2F0aW9uKAorICAgICAgICAgIGxvY2F0aW9uLCBFbnVtRGVzY3JpcHRvclByb3RvOjpFbnVtUmVzZXJ2ZWRSYW5nZTo6a0VuZEZpZWxkTnVtYmVyKTsKKyAgICAgIGVuZF9sb2NhdGlvbi5TdGFydEF0KHN0YXJ0X3Rva2VuKTsKKyAgICAgIGVuZF9sb2NhdGlvbi5FbmRBdChzdGFydF90b2tlbik7CisgICAgICBlbmQgPSBzdGFydDsKKyAgICB9CisKKyAgICByYW5nZS0+c2V0X3N0YXJ0KHN0YXJ0KTsKKyAgICByYW5nZS0+c2V0X2VuZChlbmQpOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0gd2hpbGUgKFRyeUNvbnN1bWUoIiwiKSk7CisKKyAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCAmcGFyZW50X2xvY2F0aW9uKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VFeHRlbmQoUmVwZWF0ZWRQdHJGaWVsZDxGaWVsZERlc2NyaXB0b3JQcm90bz4qIGV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxEZXNjcmlwdG9yUHJvdG8+KiBtZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZXh0ZW5kX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgeworICBETyhDb25zdW1lKCJleHRlbmQiKSk7CisKKyAgLy8gUGFyc2UgdGhlIGV4dGVuZGVlIHR5cGUuCisgIGlvOjpUb2tlbml6ZXI6OlRva2VuIGV4dGVuZGVlX3N0YXJ0ID0gaW5wdXRfLT5jdXJyZW50KCk7CisgIHN0ZDo6c3RyaW5nIGV4dGVuZGVlOworICBETyhQYXJzZVVzZXJEZWZpbmVkVHlwZSgmZXh0ZW5kZWUpKTsKKyAgaW86OlRva2VuaXplcjo6VG9rZW4gZXh0ZW5kZWVfZW5kID0gaW5wdXRfLT5wcmV2aW91cygpOworCisgIC8vIFBhcnNlIHRoZSBibG9jay4KKyAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oInsiLCAmZXh0ZW5kX2xvY2F0aW9uKSk7CisKKyAgYm9vbCBpc19maXJzdCA9IHRydWU7CisKKyAgZG8geworICAgIGlmIChBdEVuZCgpKSB7CisgICAgICBBZGRFcnJvcigiUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gZXh0ZW5kIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOb3RlIHRoYXQga0V4dGVuc2lvbkZpZWxkTnVtYmVyIHdhcyBhbHJlYWR5IHB1c2hlZCBieSB0aGUgcGFyZW50LgorICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZXh0ZW5kX2xvY2F0aW9uLCBleHRlbnNpb25zLT5zaXplKCkpOworCisgICAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkID0gZXh0ZW5zaW9ucy0+QWRkKCk7CisKKyAgICB7CisgICAgICBMb2NhdGlvblJlY29yZGVyIGV4dGVuZGVlX2xvY2F0aW9uKAorICAgICAgICAgIGxvY2F0aW9uLCBGaWVsZERlc2NyaXB0b3JQcm90bzo6a0V4dGVuZGVlRmllbGROdW1iZXIpOworICAgICAgZXh0ZW5kZWVfbG9jYXRpb24uU3RhcnRBdChleHRlbmRlZV9zdGFydCk7CisgICAgICBleHRlbmRlZV9sb2NhdGlvbi5FbmRBdChleHRlbmRlZV9lbmQpOworCisgICAgICBpZiAoaXNfZmlyc3QpIHsKKyAgICAgICAgZXh0ZW5kZWVfbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCisgICAgICAgICAgICBmaWVsZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFWFRFTkRFRSk7CisgICAgICAgIGlzX2ZpcnN0ID0gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgZmllbGQtPnNldF9leHRlbmRlZShleHRlbmRlZSk7CisKKyAgICBpZiAoIVBhcnNlTWVzc2FnZUZpZWxkKGZpZWxkLCBtZXNzYWdlcywgcGFyZW50X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fZmllbGRfbnVtYmVyX2Zvcl9uZXN0ZWRfdHlwZSwgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX2ZpbGUpKSB7CisgICAgICAvLyBUaGlzIHN0YXRlbWVudCBmYWlsZWQgdG8gcGFyc2UuICBTa2lwIGl0LCBidXQga2VlcCBsb29waW5nIHRvIHBhcnNlCisgICAgICAvLyBvdGhlciBzdGF0ZW1lbnRzLgorICAgICAgU2tpcFN0YXRlbWVudCgpOworICAgIH0KKyAgfSB3aGlsZSAoIVRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ9IiwgbnVsbHB0cikpOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VPbmVvZihPbmVvZkRlc2NyaXB0b3JQcm90byogb25lb2ZfZGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90byogY29udGFpbmluZ190eXBlLCBpbnQgb25lb2ZfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBvbmVvZl9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGNvbnRhaW5pbmdfdHlwZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgeworICBETyhDb25zdW1lKCJvbmVvZiIpKTsKKworICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBuYW1lX2xvY2F0aW9uKG9uZW9mX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmVvZkRlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcik7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIob25lb2ZfZGVjbC0+bXV0YWJsZV9uYW1lKCksICJFeHBlY3RlZCBvbmVvZiBuYW1lLiIpKTsKKyAgfQorCisgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ7IiwgJm9uZW9mX2xvY2F0aW9uKSk7CisKKyAgZG8geworICAgIGlmIChBdEVuZCgpKSB7CisgICAgICBBZGRFcnJvcigiUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gb25lb2YgZGVmaW5pdGlvbiAobWlzc2luZyAnfScpLiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChMb29raW5nQXQoIm9wdGlvbiIpKSB7CisgICAgICBMb2NhdGlvblJlY29yZGVyIG9wdGlvbl9sb2NhdGlvbigKKyAgICAgICAgICBvbmVvZl9sb2NhdGlvbiwgT25lb2ZEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIpOworICAgICAgaWYgKCFQYXJzZU9wdGlvbihvbmVvZl9kZWNsLT5tdXRhYmxlX29wdGlvbnMoKSwgb3B0aW9uX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX2ZpbGUsIE9QVElPTl9TVEFURU1FTlQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIFByaW50IGEgbmljZSBlcnJvciBpZiB0aGUgdXNlciBhY2NpZGVudGFsbHkgdHJpZXMgdG8gcGxhY2UgYSBsYWJlbAorICAgIC8vIG9uIGFuIGluZGl2aWR1YWwgbWVtYmVyIG9mIGEgb25lb2YuCisgICAgaWYgKExvb2tpbmdBdCgicmVxdWlyZWQiKSB8fCBMb29raW5nQXQoIm9wdGlvbmFsIikgfHwKKyAgICAgICAgTG9va2luZ0F0KCJyZXBlYXRlZCIpKSB7CisgICAgICBBZGRFcnJvcigKKyAgICAgICAgICAiRmllbGRzIGluIG9uZW9mcyBtdXN0IG5vdCBoYXZlIGxhYmVscyAocmVxdWlyZWQgLyBvcHRpb25hbCAiCisgICAgICAgICAgIi8gcmVwZWF0ZWQpLiIpOworICAgICAgLy8gV2UgY2FuIGNvbnRpbnVlIHBhcnNpbmcgaGVyZSBiZWNhdXNlIHdlIHVuZGVyc3RhbmQgd2hhdCB0aGUgdXNlcgorICAgICAgLy8gbWVhbnQuICBUaGUgZXJyb3IgcmVwb3J0IHdpbGwgc3RpbGwgbWFrZSBwYXJzaW5nIGZhaWwgb3ZlcmFsbC4KKyAgICAgIGlucHV0Xy0+TmV4dCgpOworICAgIH0KKworICAgIExvY2F0aW9uUmVjb3JkZXIgZmllbGRfbG9jYXRpb24oY29udGFpbmluZ190eXBlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprRmllbGRGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZS0+ZmllbGRfc2l6ZSgpKTsKKworICAgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCA9IGNvbnRhaW5pbmdfdHlwZS0+YWRkX2ZpZWxkKCk7CisgICAgZmllbGQtPnNldF9sYWJlbChGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwpOworICAgIGZpZWxkLT5zZXRfb25lb2ZfaW5kZXgob25lb2ZfaW5kZXgpOworCisgICAgaWYgKCFQYXJzZU1lc3NhZ2VGaWVsZE5vTGFiZWwoZmllbGQsIGNvbnRhaW5pbmdfdHlwZS0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOZXN0ZWRUeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSkpIHsKKyAgICAgIC8vIFRoaXMgc3RhdGVtZW50IGZhaWxlZCB0byBwYXJzZS4gIFNraXAgaXQsIGJ1dCBrZWVwIGxvb3BpbmcgdG8gcGFyc2UKKyAgICAgIC8vIG90aGVyIHN0YXRlbWVudHMuCisgICAgICBTa2lwU3RhdGVtZW50KCk7CisgICAgfQorICB9IHdoaWxlICghVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIn0iLCBudWxscHRyKSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudW1zCisKK2Jvb2wgUGFyc2VyOjpQYXJzZUVudW1EZWZpbml0aW9uKEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKKyAgRE8oQ29uc3VtZSgiZW51bSIpKTsKKworICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihlbnVtX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bURlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcik7CisgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oZW51bV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSk7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoZW51bV90eXBlLT5tdXRhYmxlX25hbWUoKSwgIkV4cGVjdGVkIGVudW0gbmFtZS4iKSk7CisgIH0KKworICBETyhQYXJzZUVudW1CbG9jayhlbnVtX3R5cGUsIGVudW1fbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSkpOworCisgIERPKFZhbGlkYXRlRW51bShlbnVtX3R5cGUpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlRW51bUJsb2NrKEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgeworICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigieyIsICZlbnVtX2xvY2F0aW9uKSk7CisKKyAgd2hpbGUgKCFUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigifSIsIG51bGxwdHIpKSB7CisgICAgaWYgKEF0RW5kKCkpIHsKKyAgICAgIEFkZEVycm9yKCJSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBlbnVtIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIVBhcnNlRW51bVN0YXRlbWVudChlbnVtX3R5cGUsIGVudW1fbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSkpIHsKKyAgICAgIC8vIFRoaXMgc3RhdGVtZW50IGZhaWxlZCB0byBwYXJzZS4gIFNraXAgaXQsIGJ1dCBrZWVwIGxvb3BpbmcgdG8gcGFyc2UKKyAgICAgIC8vIG90aGVyIHN0YXRlbWVudHMuCisgICAgICBTa2lwU3RhdGVtZW50KCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZUVudW1TdGF0ZW1lbnQoRW51bURlc2NyaXB0b3JQcm90byogZW51bV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKKyAgaWYgKFRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgbnVsbHB0cikpIHsKKyAgICAvLyBlbXB0eSBzdGF0ZW1lbnQ7IGlnbm9yZQorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgib3B0aW9uIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGVudW1fbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyKTsKKyAgICByZXR1cm4gUGFyc2VPcHRpb24oZW51bV90eXBlLT5tdXRhYmxlX29wdGlvbnMoKSwgbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OX1NUQVRFTUVOVCk7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJyZXNlcnZlZCIpKSB7CisgICAgcmV0dXJuIFBhcnNlUmVzZXJ2ZWQoZW51bV90eXBlLCBlbnVtX2xvY2F0aW9uKTsKKyAgfSBlbHNlIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGVudW1fbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvclByb3RvOjprVmFsdWVGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1fdHlwZS0+dmFsdWVfc2l6ZSgpKTsKKyAgICByZXR1cm4gUGFyc2VFbnVtQ29uc3RhbnQoZW51bV90eXBlLT5hZGRfdmFsdWUoKSwgbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSk7CisgIH0KK30KKworYm9vbCBQYXJzZXI6OlBhcnNlRW51bUNvbnN0YW50KEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogZW51bV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX3ZhbHVlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgeworICAvLyBQYXJzZSBuYW1lLgorICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihlbnVtX3ZhbHVlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyKTsKKyAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbihlbnVtX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSk7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoZW51bV92YWx1ZS0+bXV0YWJsZV9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGVudW0gY29uc3RhbnQgbmFtZS4iKSk7CisgIH0KKworICBETyhDb25zdW1lKCI9IiwgIk1pc3NpbmcgbnVtZXJpYyB2YWx1ZSBmb3IgZW51bSBjb25zdGFudC4iKSk7CisKKyAgLy8gUGFyc2UgdmFsdWUuCisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGVudW1fdmFsdWVfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmtOdW1iZXJGaWVsZE51bWJlcik7CisgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oZW51bV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUik7CisKKyAgICBpbnQgbnVtYmVyOworICAgIERPKENvbnN1bWVTaWduZWRJbnRlZ2VyKCZudW1iZXIsICJFeHBlY3RlZCBpbnRlZ2VyLiIpKTsKKyAgICBlbnVtX3ZhbHVlLT5zZXRfbnVtYmVyKG51bWJlcik7CisgIH0KKworICBETyhQYXJzZUVudW1Db25zdGFudE9wdGlvbnMoZW51bV92YWx1ZSwgZW51bV92YWx1ZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfZmlsZSkpOworCisgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJmVudW1fdmFsdWVfbG9jYXRpb24pKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlRW51bUNvbnN0YW50T3B0aW9ucygKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIHZhbHVlLAorICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fdmFsdWVfbG9jYXRpb24sCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CisgIGlmICghTG9va2luZ0F0KCJbIikpIHJldHVybiB0cnVlOworCisgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZW51bV92YWx1ZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIpOworCisgIERPKENvbnN1bWUoIlsiKSk7CisKKyAgZG8geworICAgIERPKFBhcnNlT3B0aW9uKHZhbHVlLT5tdXRhYmxlX29wdGlvbnMoKSwgbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSwKKyAgICAgICAgICAgICAgICAgICBPUFRJT05fQVNTSUdOTUVOVCkpOworICB9IHdoaWxlIChUcnlDb25zdW1lKCIsIikpOworCisgIERPKENvbnN1bWUoIl0iKSk7CisgIHJldHVybiB0cnVlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTZXJ2aWNlcworCitib29sIFBhcnNlcjo6UGFyc2VTZXJ2aWNlRGVmaW5pdGlvbigKKyAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBzZXJ2aWNlLCBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBzZXJ2aWNlX2xvY2F0aW9uLAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgeworICBETyhDb25zdW1lKCJzZXJ2aWNlIikpOworCisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHNlcnZpY2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyKTsKKyAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbihzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSk7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoc2VydmljZS0+bXV0YWJsZV9uYW1lKCksICJFeHBlY3RlZCBzZXJ2aWNlIG5hbWUuIikpOworICB9CisKKyAgRE8oUGFyc2VTZXJ2aWNlQmxvY2soc2VydmljZSwgc2VydmljZV9sb2NhdGlvbiwgY29udGFpbmluZ19maWxlKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VTZXJ2aWNlQmxvY2soU2VydmljZURlc2NyaXB0b3JQcm90byogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBzZXJ2aWNlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgeworICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigieyIsICZzZXJ2aWNlX2xvY2F0aW9uKSk7CisKKyAgd2hpbGUgKCFUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigifSIsIG51bGxwdHIpKSB7CisgICAgaWYgKEF0RW5kKCkpIHsKKyAgICAgIEFkZEVycm9yKCJSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBzZXJ2aWNlIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIVBhcnNlU2VydmljZVN0YXRlbWVudChzZXJ2aWNlLCBzZXJ2aWNlX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpKSB7CisgICAgICAvLyBUaGlzIHN0YXRlbWVudCBmYWlsZWQgdG8gcGFyc2UuICBTa2lwIGl0LCBidXQga2VlcCBsb29waW5nIHRvIHBhcnNlCisgICAgICAvLyBvdGhlciBzdGF0ZW1lbnRzLgorICAgICAgU2tpcFN0YXRlbWVudCgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VTZXJ2aWNlU3RhdGVtZW50KFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHNlcnZpY2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgeworICBpZiAoVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCBudWxscHRyKSkgeworICAgIC8vIGVtcHR5IHN0YXRlbWVudDsgaWdub3JlCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJvcHRpb24iKSkgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oc2VydmljZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIpOworICAgIHJldHVybiBQYXJzZU9wdGlvbihzZXJ2aWNlLT5tdXRhYmxlX29wdGlvbnMoKSwgbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OX1NUQVRFTUVOVCk7CisgIH0gZWxzZSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihzZXJ2aWNlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0b3JQcm90bzo6a01ldGhvZEZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+bWV0aG9kX3NpemUoKSk7CisgICAgcmV0dXJuIFBhcnNlU2VydmljZU1ldGhvZChzZXJ2aWNlLT5hZGRfbWV0aG9kKCksIGxvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpOworICB9Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZVNlcnZpY2VNZXRob2QoTWV0aG9kRGVzY3JpcHRvclByb3RvKiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1ldGhvZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CisgIERPKENvbnN1bWUoInJwYyIpKTsKKworICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXRob2RfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKG1ldGhvZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FKTsKKyAgICBETyhDb25zdW1lSWRlbnRpZmllcihtZXRob2QtPm11dGFibGVfbmFtZSgpLCAiRXhwZWN0ZWQgbWV0aG9kIG5hbWUuIikpOworICB9CisKKyAgLy8gUGFyc2UgaW5wdXQgdHlwZS4KKyAgRE8oQ29uc3VtZSgiKCIpKTsKKyAgeworICAgIGlmIChMb29raW5nQXQoInN0cmVhbSIpKSB7CisgICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAorICAgICAgICAgIG1ldGhvZF9sb2NhdGlvbiwgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprQ2xpZW50U3RyZWFtaW5nRmllbGROdW1iZXIpOworICAgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24obWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUik7CisgICAgICBtZXRob2QtPnNldF9jbGllbnRfc3RyZWFtaW5nKHRydWUpOworICAgICAgRE8oQ29uc3VtZSgic3RyZWFtIikpOworICAgIH0KKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1ldGhvZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a0lucHV0VHlwZUZpZWxkTnVtYmVyKTsKKyAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbihtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpJTlBVVF9UWVBFKTsKKyAgICBETyhQYXJzZVVzZXJEZWZpbmVkVHlwZShtZXRob2QtPm11dGFibGVfaW5wdXRfdHlwZSgpKSk7CisgIH0KKyAgRE8oQ29uc3VtZSgiKSIpKTsKKworICAvLyBQYXJzZSBvdXRwdXQgdHlwZS4KKyAgRE8oQ29uc3VtZSgicmV0dXJucyIpKTsKKyAgRE8oQ29uc3VtZSgiKCIpKTsKKyAgeworICAgIGlmIChMb29raW5nQXQoInN0cmVhbSIpKSB7CisgICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAorICAgICAgICAgIG1ldGhvZF9sb2NhdGlvbiwgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprU2VydmVyU3RyZWFtaW5nRmllbGROdW1iZXIpOworICAgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24obWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUik7CisgICAgICBETyhDb25zdW1lKCJzdHJlYW0iKSk7CisgICAgICBtZXRob2QtPnNldF9zZXJ2ZXJfc3RyZWFtaW5nKHRydWUpOworICAgIH0KKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1ldGhvZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a091dHB1dFR5cGVGaWVsZE51bWJlcik7CisgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24obWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1VUUFVUX1RZUEUpOworICAgIERPKFBhcnNlVXNlckRlZmluZWRUeXBlKG1ldGhvZC0+bXV0YWJsZV9vdXRwdXRfdHlwZSgpKSk7CisgIH0KKyAgRE8oQ29uc3VtZSgiKSIpKTsKKworICBpZiAoTG9va2luZ0F0KCJ7IikpIHsKKyAgICAvLyBPcHRpb25zIQorICAgIERPKFBhcnNlTWV0aG9kT3B0aW9ucyhtZXRob2RfbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QtPm11dGFibGVfb3B0aW9ucygpKSk7CisgIH0gZWxzZSB7CisgICAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCAmbWV0aG9kX2xvY2F0aW9uKSk7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlTWV0aG9kT3B0aW9ucyhjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG9wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbXV0YWJsZV9vcHRpb25zKSB7CisgIC8vIE9wdGlvbnMhCisgIENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ7IiwgJnBhcmVudF9sb2NhdGlvbik7CisgIHdoaWxlICghVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIn0iLCBudWxscHRyKSkgeworICAgIGlmIChBdEVuZCgpKSB7CisgICAgICBBZGRFcnJvcigiUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gbWV0aG9kIG9wdGlvbnMgKG1pc3NpbmcgJ30nKS4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCBudWxscHRyKSkgeworICAgICAgLy8gZW1wdHkgc3RhdGVtZW50OyBpZ25vcmUKKyAgICB9IGVsc2UgeworICAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihwYXJlbnRfbG9jYXRpb24sIG9wdGlvbnNGaWVsZE51bWJlcik7CisgICAgICBpZiAoIVBhcnNlT3B0aW9uKG11dGFibGVfb3B0aW9ucywgbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OX1NUQVRFTUVOVCkpIHsKKyAgICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0bworICAgICAgICAvLyBwYXJzZSBvdGhlciBzdGF0ZW1lbnRzLgorICAgICAgICBTa2lwU3RhdGVtZW50KCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYm9vbCBQYXJzZXI6OlBhcnNlTGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsKiBsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uKSB7CisgIGlmICghTG9va2luZ0F0KCJvcHRpb25hbCIpICYmICFMb29raW5nQXQoInJlcGVhdGVkIikgJiYKKyAgICAgICFMb29raW5nQXQoInJlcXVpcmVkIikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihmaWVsZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6a0xhYmVsRmllbGROdW1iZXIpOworICBpZiAoVHJ5Q29uc3VtZSgib3B0aW9uYWwiKSkgeworICAgICpsYWJlbCA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTDsKKyAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCJyZXBlYXRlZCIpKSB7CisgICAgKmxhYmVsID0gRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUEVBVEVEOworICB9IGVsc2UgeworICAgIENvbnN1bWUoInJlcXVpcmVkIik7CisgICAgKmxhYmVsID0gRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUVVJUkVEOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VUeXBlKEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogdHlwZV9uYW1lKSB7CisgIGNvbnN0IGF1dG8mIHR5cGVfbmFtZXNfdGFibGUgPSBHZXRUeXBlTmFtZVRhYmxlKCk7CisgIGF1dG8gaXRlciA9IHR5cGVfbmFtZXNfdGFibGUuZmluZChpbnB1dF8tPmN1cnJlbnQoKS50ZXh0KTsKKyAgaWYgKGl0ZXIgIT0gdHlwZV9uYW1lc190YWJsZS5lbmQoKSkgeworICAgICp0eXBlID0gaXRlci0+c2Vjb25kOworICAgIGlucHV0Xy0+TmV4dCgpOworICB9IGVsc2UgeworICAgIERPKFBhcnNlVXNlckRlZmluZWRUeXBlKHR5cGVfbmFtZSkpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VVc2VyRGVmaW5lZFR5cGUoc3RkOjpzdHJpbmcqIHR5cGVfbmFtZSkgeworICB0eXBlX25hbWUtPmNsZWFyKCk7CisKKyAgY29uc3QgYXV0byYgdHlwZV9uYW1lc190YWJsZSA9IEdldFR5cGVOYW1lVGFibGUoKTsKKyAgYXV0byBpdGVyID0gdHlwZV9uYW1lc190YWJsZS5maW5kKGlucHV0Xy0+Y3VycmVudCgpLnRleHQpOworICBpZiAoaXRlciAhPSB0eXBlX25hbWVzX3RhYmxlLmVuZCgpKSB7CisgICAgLy8gTm90ZTogIFRoZSBvbmx5IHBsYWNlIGVudW0gdHlwZXMgYXJlIGFsbG93ZWQgaXMgZm9yIGZpZWxkIHR5cGVzLCBidXQKKyAgICAvLyAgIGlmIHdlIGFyZSBwYXJzaW5nIGEgZmllbGQgdHlwZSB0aGVuIHdlIHdvdWxkIG5vdCBnZXQgaGVyZSBiZWNhdXNlCisgICAgLy8gICBwcmltaXRpdmVzIGFyZSBhbGxvd2VkIHRoZXJlIGFzIHdlbGwuICBTbyB0aGlzIGVycm9yIG1lc3NhZ2UgZG9lc24ndAorICAgIC8vICAgbmVlZCB0byBhY2NvdW50IGZvciBlbnVtcy4KKyAgICBBZGRFcnJvcigiRXhwZWN0ZWQgbWVzc2FnZSB0eXBlLiIpOworCisgICAgLy8gUHJldGVuZCB0byBhY2NlcHQgdGhpcyB0eXBlIHNvIHRoYXQgd2UgY2FuIGdvIG9uIHBhcnNpbmcuCisgICAgKnR5cGVfbmFtZSA9IGlucHV0Xy0+Y3VycmVudCgpLnRleHQ7CisgICAgaW5wdXRfLT5OZXh0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBBIGxlYWRpbmcgIi4iIG1lYW5zIHRoZSBuYW1lIGlzIGZ1bGx5LXF1YWxpZmllZC4KKyAgaWYgKFRyeUNvbnN1bWUoIi4iKSkgdHlwZV9uYW1lLT5hcHBlbmQoIi4iKTsKKworICAvLyBDb25zdW1lIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBuYW1lLgorICBzdGQ6OnN0cmluZyBpZGVudGlmaWVyOworICBETyhDb25zdW1lSWRlbnRpZmllcigmaWRlbnRpZmllciwgIkV4cGVjdGVkIHR5cGUgbmFtZS4iKSk7CisgIHR5cGVfbmFtZS0+YXBwZW5kKGlkZW50aWZpZXIpOworCisgIC8vIENvbnN1bWUgbW9yZSBwYXJ0cy4KKyAgd2hpbGUgKFRyeUNvbnN1bWUoIi4iKSkgeworICAgIHR5cGVfbmFtZS0+YXBwZW5kKCIuIik7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJmlkZW50aWZpZXIsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIpKTsKKyAgICB0eXBlX25hbWUtPmFwcGVuZChpZGVudGlmaWVyKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2Jvb2wgUGFyc2VyOjpQYXJzZVBhY2thZ2UoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcm9vdF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CisgIGlmIChmaWxlLT5oYXNfcGFja2FnZSgpKSB7CisgICAgQWRkRXJyb3IoIk11bHRpcGxlIHBhY2thZ2UgZGVmaW5pdGlvbnMuIik7CisgICAgLy8gRG9uJ3QgYXBwZW5kIHRoZSBuZXcgcGFja2FnZSB0byB0aGUgb2xkIG9uZS4gIEp1c3QgcmVwbGFjZSBpdC4gIE5vdAorICAgIC8vIHRoYXQgaXQgcmVhbGx5IG1hdHRlcnMgc2luY2UgdGhpcyBpcyBhbiBlcnJvciBhbnl3YXkuCisgICAgZmlsZS0+Y2xlYXJfcGFja2FnZSgpOworICB9CisKKyAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtQYWNrYWdlRmllbGROdW1iZXIpOworICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbihmaWxlLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUpOworCisgIERPKENvbnN1bWUoInBhY2thZ2UiKSk7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzdGQ6OnN0cmluZyBpZGVudGlmaWVyOworICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZpZGVudGlmaWVyLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iKSk7CisgICAgZmlsZS0+bXV0YWJsZV9wYWNrYWdlKCktPmFwcGVuZChpZGVudGlmaWVyKTsKKyAgICBpZiAoIVRyeUNvbnN1bWUoIi4iKSkgYnJlYWs7CisgICAgZmlsZS0+bXV0YWJsZV9wYWNrYWdlKCktPmFwcGVuZCgiLiIpOworICB9CisKKyAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCAmbG9jYXRpb24pKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlSW1wb3J0KFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KiBkZXBlbmRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8aW50MzJfdD4qIHB1YmxpY19kZXBlbmRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8aW50MzJfdD4qIHdlYWtfZGVwZW5kZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiByb290X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgeworICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHJvb3RfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a0RlcGVuZGVuY3lGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LT5zaXplKCkpOworCisgIERPKENvbnN1bWUoImltcG9ydCIpKTsKKworICBpZiAoTG9va2luZ0F0KCJwdWJsaWMiKSkgeworICAgIExvY2F0aW9uUmVjb3JkZXIgcHVibGljX2xvY2F0aW9uKAorICAgICAgICByb290X2xvY2F0aW9uLCBGaWxlRGVzY3JpcHRvclByb3RvOjprUHVibGljRGVwZW5kZW5jeUZpZWxkTnVtYmVyLAorICAgICAgICBwdWJsaWNfZGVwZW5kZW5jeS0+c2l6ZSgpKTsKKyAgICBETyhDb25zdW1lKCJwdWJsaWMiKSk7CisgICAgKnB1YmxpY19kZXBlbmRlbmN5LT5BZGQoKSA9IGRlcGVuZGVuY3ktPnNpemUoKTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXQoIndlYWsiKSkgeworICAgIExvY2F0aW9uUmVjb3JkZXIgd2Vha19sb2NhdGlvbigKKyAgICAgICAgcm9vdF9sb2NhdGlvbiwgRmlsZURlc2NyaXB0b3JQcm90bzo6a1dlYWtEZXBlbmRlbmN5RmllbGROdW1iZXIsCisgICAgICAgIHdlYWtfZGVwZW5kZW5jeS0+c2l6ZSgpKTsKKyAgICB3ZWFrX2xvY2F0aW9uLlJlY29yZExlZ2FjeUltcG9ydExvY2F0aW9uKGNvbnRhaW5pbmdfZmlsZSwgIndlYWsiKTsKKyAgICBETyhDb25zdW1lKCJ3ZWFrIikpOworICAgICp3ZWFrX2RlcGVuZGVuY3ktPkFkZCgpID0gZGVwZW5kZW5jeS0+c2l6ZSgpOworICB9CisKKyAgc3RkOjpzdHJpbmcgaW1wb3J0X2ZpbGU7CisgIERPKENvbnN1bWVTdHJpbmcoJmltcG9ydF9maWxlLAorICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBhIHN0cmluZyBuYW1pbmcgdGhlIGZpbGUgdG8gaW1wb3J0LiIpKTsKKyAgKmRlcGVuZGVuY3ktPkFkZCgpID0gaW1wb3J0X2ZpbGU7CisgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUltcG9ydExvY2F0aW9uKGNvbnRhaW5pbmdfZmlsZSwgaW1wb3J0X2ZpbGUpOworCisgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJmxvY2F0aW9uKSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU291cmNlTG9jYXRpb25UYWJsZTo6U291cmNlTG9jYXRpb25UYWJsZSgpIHt9CitTb3VyY2VMb2NhdGlvblRhYmxlOjp+U291cmNlTG9jYXRpb25UYWJsZSgpIHt9CisKK2Jvb2wgU291cmNlTG9jYXRpb25UYWJsZTo6RmluZCgKKyAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAorICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwgaW50KiBsaW5lLAorICAgIGludCogY29sdW1uKSBjb25zdCB7CisgIGNvbnN0IHN0ZDo6cGFpcjxpbnQsIGludD4qIHJlc3VsdCA9CisgICAgICBGaW5kT3JOdWxsKGxvY2F0aW9uX21hcF8sIHN0ZDo6bWFrZV9wYWlyKGRlc2NyaXB0b3IsIGxvY2F0aW9uKSk7CisgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgeworICAgICpsaW5lID0gLTE7CisgICAgKmNvbHVtbiA9IDA7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgICpsaW5lID0gcmVzdWx0LT5maXJzdDsKKyAgICAqY29sdW1uID0gcmVzdWx0LT5zZWNvbmQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKworYm9vbCBTb3VyY2VMb2NhdGlvblRhYmxlOjpGaW5kSW1wb3J0KGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCogbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbHVtbikgY29uc3QgeworICBjb25zdCBzdGQ6OnBhaXI8aW50LCBpbnQ+KiByZXN1bHQgPQorICAgICAgRmluZE9yTnVsbChpbXBvcnRfbG9jYXRpb25fbWFwXywgc3RkOjptYWtlX3BhaXIoZGVzY3JpcHRvciwgbmFtZSkpOworICBpZiAocmVzdWx0ID09IG51bGxwdHIpIHsKKyAgICAqbGluZSA9IC0xOworICAgICpjb2x1bW4gPSAwOworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICAqbGluZSA9IHJlc3VsdC0+Zmlyc3Q7CisgICAgKmNvbHVtbiA9IHJlc3VsdC0+c2Vjb25kOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK3ZvaWQgU291cmNlTG9jYXRpb25UYWJsZTo6QWRkKAorICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCisgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLCBpbnQgbGluZSwKKyAgICBpbnQgY29sdW1uKSB7CisgIGxvY2F0aW9uX21hcF9bc3RkOjptYWtlX3BhaXIoZGVzY3JpcHRvciwgbG9jYXRpb24pXSA9CisgICAgICBzdGQ6Om1ha2VfcGFpcihsaW5lLCBjb2x1bW4pOworfQorCit2b2lkIFNvdXJjZUxvY2F0aW9uVGFibGU6OkFkZEltcG9ydChjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbikgeworICBpbXBvcnRfbG9jYXRpb25fbWFwX1tzdGQ6Om1ha2VfcGFpcihkZXNjcmlwdG9yLCBuYW1lKV0gPQorICAgICAgc3RkOjptYWtlX3BhaXIobGluZSwgY29sdW1uKTsKK30KKwordm9pZCBTb3VyY2VMb2NhdGlvblRhYmxlOjpDbGVhcigpIHsgbG9jYXRpb25fbWFwXy5jbGVhcigpOyB9CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGViNzYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuaApAQCAtMCwwICsxLDYwMiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIEltcGxlbWVudHMgcGFyc2luZyBvZiAucHJvdG8gZmlsZXMgdG8gRmlsZURlc2NyaXB0b3JQcm90b3MuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BBUlNFUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BBUlNFUl9IX18KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgTWVzc2FnZTsKKworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworLy8gRGVmaW5lZCBpbiB0aGlzIGZpbGUuCitjbGFzcyBQYXJzZXI7CitjbGFzcyBTb3VyY2VMb2NhdGlvblRhYmxlOworCisvLyBJbXBsZW1lbnRzIHBhcnNpbmcgb2YgcHJvdG9jb2wgZGVmaW5pdGlvbnMgKHN1Y2ggYXMgLnByb3RvIGZpbGVzKS4KKy8vCisvLyBOb3RlIHRoYXQgbW9zdCB1c2VycyB3aWxsIGJlIG1vcmUgaW50ZXJlc3RlZCBpbiB0aGUgSW1wb3J0ZXIgY2xhc3MuCisvLyBQYXJzZXIgaXMgYSBsb3dlci1sZXZlbCBjbGFzcyB3aGljaCBzaW1wbHkgY29udmVydHMgYSBzaW5nbGUgLnByb3RvIGZpbGUKKy8vIHRvIGEgRmlsZURlc2NyaXB0b3JQcm90by4gIEl0IGRvZXMgbm90IHJlc29sdmUgaW1wb3J0IGRpcmVjdGl2ZXMgb3IgcGVyZm9ybQorLy8gbWFueSBvdGhlciBraW5kcyBvZiB2YWxpZGF0aW9uIG5lZWRlZCB0byBjb25zdHJ1Y3QgYSBjb21wbGV0ZQorLy8gRmlsZURlc2NyaXB0b3IuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgUGFyc2VyIHsKKyBwdWJsaWM6CisgIFBhcnNlcigpOworICB+UGFyc2VyKCk7CisKKyAgLy8gUGFyc2UgdGhlIGVudGlyZSBpbnB1dCBhbmQgY29uc3RydWN0IGEgRmlsZURlc2NyaXB0b3JQcm90byByZXByZXNlbnRpbmcKKyAgLy8gaXQuICBSZXR1cm5zIHRydWUgaWYgbm8gZXJyb3JzIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgUGFyc2UoaW86OlRva2VuaXplciogaW5wdXQsIEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUpOworCisgIC8vIE9wdGlvbmFsIGZlYXR1cmVzOgorCisgIC8vIERFUFJFQ0FURUQ6ICBOZXcgY29kZSBzaG91bGQgdXNlIHRoZSBTb3VyY2VDb2RlSW5mbyBlbWJlZGRlZCBpbiB0aGUKKyAgLy8gICBGaWxlRGVzY3JpcHRvclByb3RvLgorICAvLworICAvLyBSZXF1ZXN0cyB0aGF0IGxvY2F0aW9ucyBvZiBjZXJ0YWluIGRlZmluaXRpb25zIGJlIHJlY29yZGVkIHRvIHRoZSBnaXZlbgorICAvLyBTb3VyY2VMb2NhdGlvblRhYmxlIHdoaWxlIHBhcnNpbmcuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvb2sgdXAgZXhhY3QgbGluZQorICAvLyBhbmQgY29sdW1uIG51bWJlcnMgZm9yIGVycm9ycyByZXBvcnRlZCBieSBEZXNjcmlwdG9yUG9vbCBkdXJpbmcgdmFsaWRhdGlvbi4KKyAgLy8gU2V0IHRvIE5VTEwgKHRoZSBkZWZhdWx0KSB0byBkaXNjYXJkIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgdm9pZCBSZWNvcmRTb3VyY2VMb2NhdGlvbnNUbyhTb3VyY2VMb2NhdGlvblRhYmxlKiBsb2NhdGlvbl90YWJsZSkgeworICAgIHNvdXJjZV9sb2NhdGlvbl90YWJsZV8gPSBsb2NhdGlvbl90YWJsZTsKKyAgfQorCisgIC8vIFJlcXVlc3RzIHRoYXQgZXJyb3JzIGJlIHJlY29yZGVkIHRvIHRoZSBnaXZlbiBFcnJvckNvbGxlY3RvciB3aGlsZQorICAvLyBwYXJzaW5nLiAgU2V0IHRvIE5VTEwgKHRoZSBkZWZhdWx0KSB0byBkaXNjYXJkIGVycm9yIG1lc3NhZ2VzLgorICB2b2lkIFJlY29yZEVycm9yc1RvKGlvOjpFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKSB7CisgICAgZXJyb3JfY29sbGVjdG9yXyA9IGVycm9yX2NvbGxlY3RvcjsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIGlkZW50aWZpZXIgdXNlZCBpbiB0aGUgInN5bnRheCA9ICIgZGVjbGFyYXRpb24sIGlmIG9uZSB3YXMKKyAgLy8gc2VlbiBkdXJpbmcgdGhlIGxhc3QgY2FsbCB0byBQYXJzZSgpLCBvciB0aGUgZW1wdHkgc3RyaW5nIG90aGVyd2lzZS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldFN5bnRheElkZW50aWZpZXIoKSB7IHJldHVybiBzeW50YXhfaWRlbnRpZmllcl87IH0KKworICAvLyBJZiBzZXQgdHJ1ZSwgaW5wdXQgZmlsZXMgd2lsbCBiZSByZXF1aXJlZCB0byBiZWdpbiB3aXRoIGEgc3ludGF4CisgIC8vIGlkZW50aWZpZXIuICBPdGhlcndpc2UsIGZpbGVzIG1heSBvbWl0IHRoaXMuICBJZiBhIHN5bnRheCBpZGVudGlmaWVyCisgIC8vIGlzIHByb3ZpZGVkLCBpdCBtdXN0IGJlICdzeW50YXggPSAicHJvdG8yIjsnIGFuZCBtdXN0IGFwcGVhciBhdCB0aGUKKyAgLy8gdG9wIG9mIHRoaXMgZmlsZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IGl0IHdhcyByZXF1aXJlZC4KKyAgdm9pZCBTZXRSZXF1aXJlU3ludGF4SWRlbnRpZmllcihib29sIHZhbHVlKSB7CisgICAgcmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl8gPSB2YWx1ZTsKKyAgfQorCisgIC8vIENhbGwgU2V0U3RvcEFmdGVyU3ludGF4SWRlbnRpZmllcih0cnVlKSB0byB0ZWxsIHRoZSBwYXJzZXIgdG8gc3RvcAorICAvLyBwYXJzaW5nIGFzIHNvb24gYXMgaXQgaGFzIHNlZW4gdGhlIHN5bnRheCBpZGVudGlmaWVyLCBvciBsYWNrIHRoZXJlb2YuCisgIC8vIFRoaXMgaXMgdXNlZnVsIGZvciBxdWlja2x5IGlkZW50aWZ5aW5nIHRoZSBzeW50YXggb2YgdGhlIGZpbGUgd2l0aG91dAorICAvLyBwYXJzaW5nIHRoZSB3aG9sZSB0aGluZy4gIElmIHRoaXMgaXMgZW5hYmxlZCwgbm8gZXJyb3Igd2lsbCBiZSByZWNvcmRlZAorICAvLyBpZiB0aGUgc3ludGF4IGlkZW50aWZpZXIgaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gInByb3RvMiIgKHNpbmNlCisgIC8vIHByZXN1bWFibHkgdGhlIGNhbGxlciBpbnRlbmRzIHRvIGRlYWwgd2l0aCB0aGF0KSwgYnV0IG90aGVyIGtpbmRzIG9mCisgIC8vIGVycm9ycyAoZS5nLiBwYXJzZSBlcnJvcnMpIHdpbGwgc3RpbGwgYmUgcmVwb3J0ZWQuICBXaGVuIHRoaXMgaXMgZW5hYmxlZCwKKyAgLy8geW91IG1heSBwYXNzIGEgTlVMTCBGaWxlRGVzY3JpcHRvclByb3RvIHRvIFBhcnNlKCkuCisgIHZvaWQgU2V0U3RvcEFmdGVyU3ludGF4SWRlbnRpZmllcihib29sIHZhbHVlKSB7CisgICAgc3RvcF9hZnRlcl9zeW50YXhfaWRlbnRpZmllcl8gPSB2YWx1ZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgTG9jYXRpb25SZWNvcmRlcjsKKyAgc3RydWN0IE1hcEZpZWxkOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEVycm9yIHJlY292ZXJ5IGhlbHBlcnMKKworICAvLyBDb25zdW1lIHRoZSByZXN0IG9mIHRoZSBjdXJyZW50IHN0YXRlbWVudC4gIFRoaXMgY29uc3VtZXMgdG9rZW5zCisgIC8vIHVudGlsIGl0IHNlZXMgb25lIG9mOgorICAvLyAgICc7JyAgQ29uc3VtZXMgdGhlIHRva2VuIGFuZCByZXR1cm5zLgorICAvLyAgICd7JyAgQ29uc3VtZXMgdGhlIGJyYWNlIHRoZW4gY2FsbHMgU2tpcFJlc3RPZkJsb2NrKCkuCisgIC8vICAgJ30nICBSZXR1cm5zIHdpdGhvdXQgY29uc3VtaW5nLgorICAvLyAgIEVPRiAgUmV0dXJucyAoY2FuJ3QgY29uc3VtZSkuCisgIC8vIFRoZSBQYXJzZXIgb2Z0ZW4gY2FsbHMgU2tpcFN0YXRlbWVudCgpIGFmdGVyIGVuY291bnRlcmluZyBhIHN5bnRheAorICAvLyBlcnJvci4gIFRoaXMgYWxsb3dzIGl0IHRvIGdvIG9uIHBhcnNpbmcgdGhlIGZvbGxvd2luZyBsaW5lcywgYWxsb3dpbmcKKyAgLy8gaXQgdG8gcmVwb3J0IG1vcmUgdGhhbiBqdXN0IG9uZSBlcnJvciBpbiB0aGUgZmlsZS4KKyAgdm9pZCBTa2lwU3RhdGVtZW50KCk7CisKKyAgLy8gQ29uc3VtZSB0aGUgcmVzdCBvZiB0aGUgY3VycmVudCBibG9jaywgaW5jbHVkaW5nIG5lc3RlZCBibG9ja3MsCisgIC8vIGVuZGluZyBhZnRlciB0aGUgY2xvc2luZyAnfScgaXMgZW5jb3VudGVyZWQgYW5kIGNvbnN1bWVkLCBvciBhdCBFT0YuCisgIHZvaWQgU2tpcFJlc3RPZkJsb2NrKCk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gU2luZ2xlLXRva2VuIGNvbnN1bWluZyBoZWxwZXJzCisgIC8vCisgIC8vIFRoZXNlIG1ha2UgcGFyc2luZyBjb2RlIG1vcmUgcmVhZGFibGUuCisKKyAgLy8gVHJ1ZSBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBUWVBFX0VORC4KKyAgaW5saW5lIGJvb2wgQXRFbmQoKTsKKworICAvLyBUcnVlIGlmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIGdpdmVuIHRleHQuCisgIGlubGluZSBib29sIExvb2tpbmdBdChjb25zdCBjaGFyKiB0ZXh0KTsKKyAgLy8gVHJ1ZSBpZiB0aGUgbmV4dCB0b2tlbiBpcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgaW5saW5lIGJvb2wgTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUb2tlblR5cGUgdG9rZW5fdHlwZSk7CisKKyAgLy8gSWYgdGhlIG5leHQgdG9rZW4gZXhhY3RseSBtYXRjaGVzIHRoZSB0ZXh0IGdpdmVuLCBjb25zdW1lIGl0IGFuZCByZXR1cm4KKyAgLy8gdHJ1ZS4gIE90aGVyd2lzZSwgcmV0dXJuIGZhbHNlIHdpdGhvdXQgbG9nZ2luZyBhbiBlcnJvci4KKyAgYm9vbCBUcnlDb25zdW1lKGNvbnN0IGNoYXIqIHRleHQpOworCisgIC8vIFRoZXNlIGF0dGVtcHQgdG8gcmVhZCBzb21lIGtpbmQgb2YgdG9rZW4gZnJvbSB0aGUgaW5wdXQuICBJZiBzdWNjZXNzZnVsLAorICAvLyB0aGV5IHJldHVybiB0cnVlLiAgT3RoZXJ3aXNlIHRoZXkgcmV0dXJuIGZhbHNlIGFuZCBhZGQgdGhlIGdpdmVuIGVycm9yCisgIC8vIHRvIHRoZSBlcnJvciBsaXN0LgorCisgIC8vIENvbnN1bWUgYSB0b2tlbiB3aXRoIHRoZSBleGFjdCB0ZXh0IGdpdmVuLgorICBib29sIENvbnN1bWUoY29uc3QgY2hhciogdGV4dCwgY29uc3QgY2hhciogZXJyb3IpOworICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgdGhlIGVycm9yICJFeHBlY3RlZCBcInRleHRcIi4iLAorICAvLyB3aGVyZSAidGV4dCIgaXMgdGhlIGV4cGVjdGVkIHRva2VuIHRleHQuCisgIGJvb2wgQ29uc3VtZShjb25zdCBjaGFyKiB0ZXh0KTsKKyAgLy8gQ29uc3VtZSBhIHRva2VuIG9mIHR5cGUgSURFTlRJRklFUiBhbmQgc3RvcmUgaXRzIHRleHQgaW4gIm91dHB1dCIuCisgIGJvb2wgQ29uc3VtZUlkZW50aWZpZXIoc3RkOjpzdHJpbmcqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpOworICAvLyBDb25zdW1lIGFuIGludGVnZXIgYW5kIHN0b3JlIGl0cyB2YWx1ZSBpbiAib3V0cHV0Ii4KKyAgYm9vbCBDb25zdW1lSW50ZWdlcihpbnQqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpOworICAvLyBDb25zdW1lIGEgc2lnbmVkIGludGVnZXIgYW5kIHN0b3JlIGl0cyB2YWx1ZSBpbiAib3V0cHV0Ii4KKyAgYm9vbCBDb25zdW1lU2lnbmVkSW50ZWdlcihpbnQqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpOworICAvLyBDb25zdW1lIGEgNjQtYml0IGludGVnZXIgYW5kIHN0b3JlIGl0cyB2YWx1ZSBpbiAib3V0cHV0Ii4gIElmIHRoZSB2YWx1ZQorICAvLyBpcyBncmVhdGVyIHRoYW4gbWF4X3ZhbHVlLCBhbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkLgorICBib29sIENvbnN1bWVJbnRlZ2VyNjQodWludDY0X3QgbWF4X3ZhbHVlLCB1aW50NjRfdCogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXJyb3IpOworICAvLyBDb25zdW1lIGEgbnVtYmVyIGFuZCBzdG9yZSBpdHMgdmFsdWUgaW4gIm91dHB1dCIuICBUaGlzIHdpbGwgYWNjZXB0CisgIC8vIHRva2VucyBvZiBlaXRoZXIgSU5URUdFUiBvciBGTE9BVCB0eXBlLgorICBib29sIENvbnN1bWVOdW1iZXIoZG91YmxlKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKTsKKyAgLy8gQ29uc3VtZSBhIHN0cmluZyBsaXRlcmFsIGFuZCBzdG9yZSBpdHMgKHVuZXNjYXBlZCkgdmFsdWUgaW4gIm91dHB1dCIuCisgIGJvb2wgQ29uc3VtZVN0cmluZyhzdGQ6OnN0cmluZyogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcik7CisKKyAgLy8gQ29uc3VtZSBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZW5kIG9mIHRoZSBzdGF0ZW1lbnQuICBDb21tZW50cyBiZXR3ZWVuCisgIC8vIHRoaXMgdG9rZW4gYW5kIHRoZSBuZXh0IHdpbGwgYmUgaGFydmVzdGVkIGZvciBkb2N1bWVudGF0aW9uLiAgVGhlIGdpdmVuCisgIC8vIExvY2F0aW9uUmVjb3JkZXIgc2hvdWxkIHJlZmVyIHRvIHRoZSBkZWNsYXJhdGlvbiB0aGF0IHdhcyBqdXN0IHBhcnNlZDsKKyAgLy8gaXQgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCB0aGVzZSBjb21tZW50cy4KKyAgLy8KKyAgLy8gVE9ETyhrZW50b24pOiAgVGhlIExvY2F0aW9uUmVjb3JkZXIgaXMgY29uc3QgYmVjYXVzZSBoaXN0b3JpY2FsbHkgbG9jYXRpb25zCisgIC8vICAgaGF2ZSBiZWVuIHBhc3NlZCBhcm91bmQgYnkgY29uc3QgcmVmZXJlbmNlLCBmb3Igbm8gcGFydGljdWxhcmx5IGdvb2QKKyAgLy8gICByZWFzb24uICBXZSBzaG91bGQgcHJvYmFibHkgZ28gdGhyb3VnaCBhbmQgY2hhbmdlIHRoZW0gYWxsIHRvIG11dGFibGUKKyAgLy8gICBwb2ludGVyIHRvIG1ha2UgdGhpcyBtb3JlIGludHVpdGl2ZS4KKyAgYm9vbCBUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbihjb25zdCBjaGFyKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXIqIGxvY2F0aW9uKTsKKyAgYm9vbCBUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbkZpbmlzaFNjb3BlKGNvbnN0IGNoYXIqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyKiBsb2NhdGlvbik7CisKKyAgYm9vbCBDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbihjb25zdCBjaGFyKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXIqIGxvY2F0aW9uKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBFcnJvciBsb2dnaW5nIGhlbHBlcnMKKworICAvLyBJbnZva2VzIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKCksIGlmIGVycm9yX2NvbGxlY3Rvcl8gaXMgbm90IE5VTEwuCisgIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcik7CisKKyAgLy8gSW52b2tlcyBlcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcigpIHdpdGggdGhlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXIKKyAgLy8gb2YgdGhlIGN1cnJlbnQgdG9rZW4uCisgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yKTsKKworICAvLyBJbnZva2VzIGVycm9yX2NvbGxlY3Rvcl8tPkFkZFdhcm5pbmcoKSB3aXRoIHRoZSBsaW5lIGFuZCBjb2x1bW4gbnVtYmVyCisgIC8vIG9mIHRoZSBjdXJyZW50IHRva2VuLgorICB2b2lkIEFkZFdhcm5pbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHdhcm5pbmcpOworCisgIC8vIFJlY29yZHMgYSBsb2NhdGlvbiBpbiB0aGUgU291cmNlQ29kZUluZm8ubG9jYXRpb24gdGFibGUgKHNlZQorICAvLyBkZXNjcmlwdG9yLnByb3RvKS4gIFdlIHVzZSBSQUlJIHRvIGVuc3VyZSB0aGF0IHRoZSBzdGFydCBhbmQgZW5kIGxvY2F0aW9ucworICAvLyBhcmUgcmVjb3JkZWQgLS0gdGhlIGNvbnN0cnVjdG9yIHJlY29yZHMgdGhlIHN0YXJ0IGxvY2F0aW9uIGFuZCB0aGUKKyAgLy8gZGVzdHJ1Y3RvciByZWNvcmRzIHRoZSBlbmQgbG9jYXRpb24uICBTaW5jZSB0aGUgcGFyc2VyIGlzCisgIC8vIHJlY3Vyc2l2ZS1kZXNjZW50LCB0aGlzIHdvcmtzIG91dCBiZWF1dGlmdWxseS4KKyAgY2xhc3MgUFJPVE9CVUZfRVhQT1JUIExvY2F0aW9uUmVjb3JkZXIgeworICAgcHVibGljOgorICAgIC8vIENvbnN0cnVjdCB0aGUgZmlsZSdzICJyb290IiBsb2NhdGlvbi4KKyAgICBMb2NhdGlvblJlY29yZGVyKFBhcnNlciogcGFyc2VyKTsKKworICAgIC8vIENvbnN0cnVjdCBhIGxvY2F0aW9uIHRoYXQgcmVwcmVzZW50cyBhIGRlY2xhcmF0aW9uIG5lc3RlZCB3aXRoaW4gdGhlCisgICAgLy8gZ2l2ZW4gcGFyZW50LiAgRS5nLiBhIGZpZWxkJ3MgbG9jYXRpb24gaXMgbmVzdGVkIHdpdGhpbiB0aGUgbG9jYXRpb24KKyAgICAvLyBmb3IgYSBtZXNzYWdlIHR5cGUuICBUaGUgcGFyZW50J3MgcGF0aCB3aWxsIGJlIGNvcGllZCwgc28geW91IHNob3VsZAorICAgIC8vIGNhbGwgQWRkUGF0aCgpIG9ubHkgdG8gYWRkIHRoZSBwYXRoIGNvbXBvbmVudHMgbGVhZGluZyBmcm9tIHRoZSBwYXJlbnQKKyAgICAvLyB0byB0aGUgY2hpbGQgKGFzIG9wcG9zZWQgdG8gbGVhZGluZyBmcm9tIHRoZSByb290IHRvIHRoZSBjaGlsZCkuCisgICAgTG9jYXRpb25SZWNvcmRlcihjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQpOworCisgICAgLy8gQ29udmVuaWVuY2UgY29uc3RydWN0b3JzIHRoYXQgY2FsbCBBZGRQYXRoKCkgb25lIG9yIHR3byB0aW1lcy4KKyAgICBMb2NhdGlvblJlY29yZGVyKGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCwgaW50IHBhdGgxKTsKKyAgICBMb2NhdGlvblJlY29yZGVyKGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCwgaW50IHBhdGgxLCBpbnQgcGF0aDIpOworCisgICAgLy8gQ3JlYXRlcyBhIHJlY29yZGVyIHRoYXQgZ2VuZXJhdGVzIGxvY2F0aW9ucyBpbnRvIGdpdmVuIHNvdXJjZSBjb2RlIGluZm8uCisgICAgTG9jYXRpb25SZWNvcmRlcihjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQsIGludCBwYXRoMSwKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUNvZGVJbmZvKiBzb3VyY2VfY29kZV9pbmZvKTsKKworICAgIH5Mb2NhdGlvblJlY29yZGVyKCk7CisKKyAgICAvLyBBZGQgYSBwYXRoIGNvbXBvbmVudC4gIFNlZSBTb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5wYXRoIGluCisgICAgLy8gZGVzY3JpcHRvci5wcm90by4KKyAgICB2b2lkIEFkZFBhdGgoaW50IHBhdGhfY29tcG9uZW50KTsKKworICAgIC8vIEJ5IGRlZmF1bHQgdGhlIGxvY2F0aW9uIGlzIGNvbnNpZGVyZWQgdG8gc3RhcnQgYXQgdGhlIGN1cnJlbnQgdG9rZW4gYXQKKyAgICAvLyB0aGUgdGltZSB0aGUgTG9jYXRpb25SZWNvcmRlciBpcyBjcmVhdGVkLiAgU3RhcnRBdCgpIHNldHMgdGhlIHN0YXJ0CisgICAgLy8gbG9jYXRpb24gdG8gdGhlIGdpdmVuIHRva2VuIGluc3RlYWQuCisgICAgdm9pZCBTdGFydEF0KGNvbnN0IGlvOjpUb2tlbml6ZXI6OlRva2VuJiB0b2tlbik7CisKKyAgICAvLyBTdGFydCBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhcyBzb21lIG90aGVyIExvY2F0aW9uUmVjb3JkZXIuCisgICAgdm9pZCBTdGFydEF0KGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG90aGVyKTsKKworICAgIC8vIEJ5IGRlZmF1bHQgdGhlIGxvY2F0aW9uIGlzIGNvbnNpZGVyZWQgdG8gZW5kIGF0IHRoZSBwcmV2aW91cyB0b2tlbiBhdAorICAgIC8vIHRoZSB0aW1lIHRoZSBMb2NhdGlvblJlY29yZGVyIGlzIGRlc3Ryb3llZC4gIEVuZEF0KCkgc2V0cyB0aGUgZW5kCisgICAgLy8gbG9jYXRpb24gdG8gdGhlIGdpdmVuIHRva2VuIGluc3RlYWQuCisgICAgdm9pZCBFbmRBdChjb25zdCBpbzo6VG9rZW5pemVyOjpUb2tlbiYgdG9rZW4pOworCisgICAgLy8gUmVjb3JkcyB0aGUgc3RhcnQgcG9pbnQgb2YgdGhpcyBsb2NhdGlvbiB0byB0aGUgU291cmNlTG9jYXRpb25UYWJsZSB0aGF0CisgICAgLy8gd2FzIHBhc3NlZCB0byBSZWNvcmRTb3VyY2VMb2NhdGlvbnNUbygpLCBpZiBhbnkuICBTb3VyY2VMb2NhdGlvblRhYmxlCisgICAgLy8gaXMgYW4gb2xkZXIgd2F5IG9mIGtlZXBpbmcgdHJhY2sgb2Ygc291cmNlIGxvY2F0aW9ucyB3aGljaCBpcyBzdGlsbAorICAgIC8vIHVzZWQgaW4gc29tZSBwbGFjZXMuCisgICAgdm9pZCBSZWNvcmRMZWdhY3lMb2NhdGlvbigKKyAgICAgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKKyAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uKTsKKyAgICB2b2lkIFJlY29yZExlZ2FjeUltcG9ydExvY2F0aW9uKGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGF0aCBjb21wb25lbnRzIGluIHRoZSByZWNvcmRlcidzIGN1cnJlbnQgbG9jYXRpb24uCisgICAgaW50IEN1cnJlbnRQYXRoU2l6ZSgpIGNvbnN0OworCisgICAgLy8gQXR0YWNoZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgY29tbWVudHMgdG8gdGhlIGxvY2F0aW9uLiAgVGhlIHR3byBzdHJpbmdzCisgICAgLy8gd2lsbCBiZSBzd2FwcGVkIGludG8gcGxhY2UsIHNvIGFmdGVyIHRoaXMgaXMgY2FsbGVkICpsZWFkaW5nIGFuZAorICAgIC8vICp0cmFpbGluZyB3aWxsIGJlIGVtcHR5LgorICAgIC8vCisgICAgLy8gVE9ETyhrZW50b24pOiAgU2VlIGNvbW1lbnQgb24gVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oKSwgYWJvdmUsIGZvcgorICAgIC8vICAgd2h5IHRoaXMgaXMgY29uc3QuCisgICAgdm9pZCBBdHRhY2hDb21tZW50cyhzdGQ6OnN0cmluZyogbGVhZGluZywgc3RkOjpzdHJpbmcqIHRyYWlsaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBkZXRhY2hlZF9jb21tZW50cykgY29uc3Q7CisKKyAgIHByaXZhdGU6CisgICAgUGFyc2VyKiBwYXJzZXJfOworICAgIFNvdXJjZUNvZGVJbmZvKiBzb3VyY2VfY29kZV9pbmZvXzsKKyAgICBTb3VyY2VDb2RlSW5mbzo6TG9jYXRpb24qIGxvY2F0aW9uXzsKKworICAgIHZvaWQgSW5pdChjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQsIFNvdXJjZUNvZGVJbmZvKiBzb3VyY2VfY29kZV9pbmZvKTsKKyAgfTsKKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBQYXJzZXJzIGZvciB2YXJpb3VzIGxhbmd1YWdlIGNvbnN0cnVjdHMKKworICAvLyBQYXJzZXMgdGhlICJzeW50YXggPSBcInByb3RvMlwiOyIgbGluZSBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLiAgUmV0dXJucworICAvLyBmYWxzZSBpZiBpdCBmYWlsZWQgdG8gcGFyc2Ugb3IgaWYgdGhlIHN5bnRheCBpZGVudGlmaWVyIHdhcyBub3QKKyAgLy8gcmVjb2duaXplZC4KKyAgYm9vbCBQYXJzZVN5bnRheElkZW50aWZpZXIoY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50KTsKKworICAvLyBUaGVzZSBtZXRob2RzIHBhcnNlIHZhcmlvdXMgaW5kaXZpZHVhbCBiaXRzIG9mIGNvZGUuICBUaGV5IHJldHVybgorICAvLyBmYWxzZSBpZiB0aGV5IGNvbXBsZXRlbHkgZmFpbCB0byBwYXJzZSB0aGUgY29uc3RydWN0LiAgSW4gdGhpcyBjYXNlLAorICAvLyBpdCBpcyBwcm9iYWJseSBuZWNlc3NhcnkgdG8gc2tpcCB0aGUgcmVzdCBvZiB0aGUgc3RhdGVtZW50IHRvIHJlY292ZXIuCisgIC8vIEhvd2V2ZXIsIGlmIHRoZXNlIG1ldGhvZHMgcmV0dXJuIHRydWUsIGl0IGRvZXMgTk9UIG1lYW4gdGhhdCB0aGVyZQorICAvLyB3ZXJlIG5vIGVycm9yczsgb25seSB0aGF0IHRoZXJlIHdlcmUgbm8gKnN5bnRheCogZXJyb3JzLiAgRm9yIGluc3RhbmNlLAorICAvLyBpZiBhIHNlcnZpY2UgbWV0aG9kIGlzIGRlZmluZWQgdXNpbmcgcHJvcGVyIHN5bnRheCBidXQgdXNlcyBhIHByaW1pdGl2ZQorICAvLyB0eXBlIGFzIGl0cyBpbnB1dCBvciBvdXRwdXQsIFBhcnNlTWV0aG9kRmllbGQoKSBzdGlsbCByZXR1cm5zIHRydWUKKyAgLy8gYW5kIG9ubHkgcmVwb3J0cyB0aGUgZXJyb3IgYnkgY2FsbGluZyBBZGRFcnJvcigpLiAgSW4gcHJhY3RpY2UsIHRoaXMKKyAgLy8gbWFrZXMgbG9naWMgbXVjaCBzaW1wbGVyIGZvciB0aGUgY2FsbGVyLgorCisgIC8vIFBhcnNlIGEgdG9wLWxldmVsIG1lc3NhZ2UsIGVudW0sIHNlcnZpY2UsIGV0Yy4KKyAgYm9vbCBQYXJzZVRvcExldmVsU3RhdGVtZW50KEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiByb290X2xvY2F0aW9uKTsKKworICAvLyBQYXJzZSB2YXJpb3VzIGxhbmd1YWdlIGhpZ2gtbGV2ZWwgbGFuZ3VhZ2UgY29uc3RydXJjdHMuCisgIGJvb2wgUGFyc2VNZXNzYWdlRGVmaW5pdGlvbihEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKKyAgYm9vbCBQYXJzZUVudW1EZWZpbml0aW9uKEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOworICBib29sIFBhcnNlU2VydmljZURlZmluaXRpb24oU2VydmljZURlc2NyaXB0b3JQcm90byogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHNlcnZpY2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOworICBib29sIFBhcnNlUGFja2FnZShGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiByb290X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOworICBib29sIFBhcnNlSW1wb3J0KFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KiBkZXBlbmRlbmN5LAorICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8aW50MzJfdD4qIHB1YmxpY19kZXBlbmRlbmN5LAorICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8aW50MzJfdD4qIHdlYWtfZGVwZW5kZW5jeSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiByb290X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7CisKKyAgLy8gVGhlc2UgbWV0aG9kcyBwYXJzZSB0aGUgY29udGVudHMgb2YgYSBtZXNzYWdlLCBlbnVtLCBvciBzZXJ2aWNlIHR5cGUgYW5kCisgIC8vIGFkZCB0aGVtIHRvIHRoZSBnaXZlbiBvYmplY3QuICBUaGV5IGNvbnN1bWUgdGhlIGVudGlyZSBibG9jayBpbmNsdWRpbmcKKyAgLy8gdGhlIGJlZ2lubmluZyBhbmQgZW5kaW5nIGJyYWNlLgorICBib29sIFBhcnNlTWVzc2FnZUJsb2NrKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7CisgIGJvb2wgUGFyc2VFbnVtQmxvY2soRW51bURlc2NyaXB0b3JQcm90byogZW51bV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKKyAgYm9vbCBQYXJzZVNlcnZpY2VCbG9jayhTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHNlcnZpY2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKKworICAvLyBQYXJzZSBvbmUgc3RhdGVtZW50IHdpdGhpbiBhIG1lc3NhZ2UsIGVudW0sIG9yIHNlcnZpY2UgYmxvY2ssIGluY2x1ZGluZworICAvLyBmaW5hbCBzZW1pY29sb24uCisgIGJvb2wgUGFyc2VNZXNzYWdlU3RhdGVtZW50KERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKKyAgYm9vbCBQYXJzZUVudW1TdGF0ZW1lbnQoRW51bURlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKKyAgYm9vbCBQYXJzZVNlcnZpY2VTdGF0ZW1lbnQoU2VydmljZURlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgc2VydmljZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKKworICAvLyBQYXJzZSBhIGZpZWxkIG9mIGEgbWVzc2FnZS4gIElmIHRoZSBmaWVsZCBpcyBhIGdyb3VwLCBpdHMgdHlwZSB3aWxsIGJlCisgIC8vIGFkZGVkIHRvICJtZXNzYWdlcyIuCisgIC8vCisgIC8vIHBhcmVudF9sb2NhdGlvbiBhbmQgbG9jYXRpb25fZmllbGRfbnVtYmVyX2Zvcl9uZXN0ZWRfdHlwZSBhcmUgbmVlZGVkIHdoZW4KKyAgLy8gcGFyc2luZyBncm91cHMgLS0gd2UgbmVlZCB0byBnZW5lcmF0ZSBhIG5lc3RlZCBtZXNzYWdlIHR5cGUgd2l0aGluIHRoZQorICAvLyBwYXJlbnQgYW5kIHJlY29yZCBpdHMgbG9jYXRpb24gYWNjb3JkaW5nbHkuICBTaW5jZSB0aGUgcGFyZW50IGNvdWxkIGJlCisgIC8vIGVpdGhlciBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3IgYSBEZXNjcmlwdG9yUHJvdG8sIHdlIG11c3QgcGFzcyBpbiB0aGUKKyAgLy8gY29ycmVjdCBmaWVsZCBudW1iZXIgdG8gdXNlLgorICBib29sIFBhcnNlTWVzc2FnZUZpZWxkKEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz4qIG1lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYXRpb25fZmllbGRfbnVtYmVyX2Zvcl9uZXN0ZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOworCisgIC8vIExpa2UgUGFyc2VNZXNzYWdlRmllbGQoKSBidXQgZXhwZWN0cyB0aGUgbGFiZWwgaGFzIGFscmVhZHkgYmVlbiBmaWxsZWQgaW4KKyAgLy8gYnkgdGhlIGNhbGxlci4KKyAgYm9vbCBQYXJzZU1lc3NhZ2VGaWVsZE5vTGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz4qIG1lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2NhdGlvbl9maWVsZF9udW1iZXJfZm9yX25lc3RlZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKKworICBib29sIFBhcnNlTWFwVHlwZShNYXBGaWVsZCogbWFwX2ZpZWxkLCBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCisgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uUmVjb3JkZXImIHR5cGVfbmFtZV9sb2NhdGlvbik7CisKKyAgLy8gUGFyc2UgYW4gImV4dGVuc2lvbnMiIGRlY2xhcmF0aW9uLgorICBib29sIFBhcnNlRXh0ZW5zaW9ucyhEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGV4dGVuc2lvbnNfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7CisKKyAgLy8gUGFyc2UgYSAicmVzZXJ2ZWQiIGRlY2xhcmF0aW9uLgorICBib29sIFBhcnNlUmVzZXJ2ZWQoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbik7CisgIGJvb2wgUGFyc2VSZXNlcnZlZE5hbWVzKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uKTsKKyAgYm9vbCBQYXJzZVJlc2VydmVkTnVtYmVycyhEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uKTsKKyAgYm9vbCBQYXJzZVJlc2VydmVkKEVudW1EZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBtZXNzYWdlX2xvY2F0aW9uKTsKKyAgYm9vbCBQYXJzZVJlc2VydmVkTmFtZXMoRW51bURlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uKTsKKyAgYm9vbCBQYXJzZVJlc2VydmVkTnVtYmVycyhFbnVtRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbik7CisKKyAgLy8gUGFyc2UgYW4gImV4dGVuZCIgZGVjbGFyYXRpb24uICAoU2VlIGFsc28gY29tbWVudHMgZm9yCisgIC8vIFBhcnNlTWVzc2FnZUZpZWxkKCkuKQorICBib29sIFBhcnNlRXh0ZW5kKFJlcGVhdGVkUHRyRmllbGQ8RmllbGREZXNjcmlwdG9yUHJvdG8+KiBleHRlbnNpb25zLAorICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8RGVzY3JpcHRvclByb3RvPiogbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgIGludCBsb2NhdGlvbl9maWVsZF9udW1iZXJfZm9yX25lc3RlZF90eXBlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGV4dGVuZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOworCisgIC8vIFBhcnNlIGEgIm9uZW9mIiBkZWNsYXJhdGlvbi4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcKKyAgLy8gb25lb2ZfZGVjbC0+bGFiZWwoKSBzaW5jZSBpdCB3aWxsIGhhdmUgaGFkIHRvIHBhcnNlIHRoZSBsYWJlbCBiZWZvcmUgaXQKKyAgLy8ga25ldyBpdCB3YXMgcGFyc2luZyBhIG9uZW9mLgorICBib29sIFBhcnNlT25lb2YoT25lb2ZEZXNjcmlwdG9yUHJvdG8qIG9uZW9mX2RlY2wsCisgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfdHlwZSwgaW50IG9uZW9mX2luZGV4LAorICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgb25lb2ZfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBjb250YWluaW5nX3R5cGVfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOworCisgIC8vIFBhcnNlIGEgc2luZ2xlIGVudW0gdmFsdWUgd2l0aGluIGFuIGVudW0gYmxvY2suCisgIGJvb2wgUGFyc2VFbnVtQ29uc3RhbnQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBlbnVtX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fdmFsdWVfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKKworICAvLyBQYXJzZSBlbnVtIGNvbnN0YW50IG9wdGlvbnMsIGkuZS4gdGhlIGxpc3QgaW4gc3F1YXJlIGJyYWNrZXRzIGF0IHRoZSBlbmQKKyAgLy8gb2YgdGhlIGVudW0gY29uc3RhbnQgdmFsdWUgZGVmaW5pdGlvbi4KKyAgYm9vbCBQYXJzZUVudW1Db25zdGFudE9wdGlvbnMoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV92YWx1ZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKKworICAvLyBQYXJzZSBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEgc2VydmljZSBkZWZpbml0aW9uLgorICBib29sIFBhcnNlU2VydmljZU1ldGhvZChNZXRob2REZXNjcmlwdG9yUHJvdG8qIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWV0aG9kX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOworCisgIC8vIFBhcnNlIG9wdGlvbnMgb2YgYSBzaW5nbGUgbWV0aG9kIG9yIHN0cmVhbS4KKyAgYm9vbCBQYXJzZU1ldGhvZE9wdGlvbnMoY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG11dGFibGVfb3B0aW9ucyk7CisKKyAgLy8gUGFyc2UgInJlcXVpcmVkIiwgIm9wdGlvbmFsIiwgb3IgInJlcGVhdGVkIiBhbmQgZmlsbCBpbiAibGFiZWwiCisgIC8vIHdpdGggdGhlIHZhbHVlLiBSZXR1cm5zIHRydWUgaWYgc3VjaCBhIGxhYmVsIGlzIGNvbnN1bWVkLgorICBib29sIFBhcnNlTGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsKiBsYWJlbCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uKTsKKworICAvLyBQYXJzZSBhIHR5cGUgbmFtZSBhbmQgZmlsbCBpbiAidHlwZSIgKGlmIGl0IGlzIGEgcHJpbWl0aXZlKSBvcgorICAvLyAidHlwZV9uYW1lIiAoaWYgaXQgaXMgbm90KSB3aXRoIHRoZSB0eXBlIHBhcnNlZC4KKyAgYm9vbCBQYXJzZVR5cGUoRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nKiB0eXBlX25hbWUpOworICAvLyBQYXJzZSBhIHVzZXItZGVmaW5lZCB0eXBlIGFuZCBmaWxsIGluICJ0eXBlX25hbWUiIHdpdGggdGhlIG5hbWUuCisgIC8vIElmIGEgcHJpbWl0aXZlIHR5cGUgaXMgbmFtZWQsIGl0IGlzIHRyZWF0ZWQgYXMgYW4gZXJyb3IuCisgIGJvb2wgUGFyc2VVc2VyRGVmaW5lZFR5cGUoc3RkOjpzdHJpbmcqIHR5cGVfbmFtZSk7CisKKyAgLy8gUGFyc2VzIGZpZWxkIG9wdGlvbnMsIGkuZS4gdGhlIHN0dWZmIGluIHNxdWFyZSBicmFja2V0cyBhdCB0aGUgZW5kCisgIC8vIG9mIGEgZmllbGQgZGVmaW5pdGlvbi4gIEFsc28gcGFyc2VzIGRlZmF1bHQgdmFsdWUuCisgIGJvb2wgUGFyc2VGaWVsZE9wdGlvbnMoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7CisKKyAgLy8gUGFyc2UgdGhlICJkZWZhdWx0IiBvcHRpb24uICBUaGlzIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcgYmVjYXVzZSBpdHMKKyAgLy8gdHlwZSBpcyB0aGUgZmllbGQncyB0eXBlLgorICBib29sIFBhcnNlRGVmYXVsdEFzc2lnbm1lbnQoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOworCisgIGJvb2wgUGFyc2VKc29uTmFtZShGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7CisKKyAgZW51bSBPcHRpb25TdHlsZSB7CisgICAgT1BUSU9OX0FTU0lHTk1FTlQsICAvLyBqdXN0ICJuYW1lID0gdmFsdWUiCisgICAgT1BUSU9OX1NUQVRFTUVOVCAgICAvLyAib3B0aW9uIG5hbWUgPSB2YWx1ZTsiCisgIH07CisKKyAgLy8gUGFyc2UgYSBzaW5nbGUgb3B0aW9uIG5hbWUvdmFsdWUgcGFpciwgZS5nLiAiY3R5cGUgPSBDT1JEIi4gIFRoZSBuYW1lCisgIC8vIGlkZW50aWZpZXMgYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gTWVzc2FnZSwgYW5kIHRoZSB2YWx1ZSBvZiB0aGF0IGZpZWxkCisgIC8vIGlzIHNldCB0byB0aGUgcGFyc2VkIHZhbHVlLgorICBib29sIFBhcnNlT3B0aW9uKE1lc3NhZ2UqIG9wdGlvbnMsIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG9wdGlvbnNfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlLAorICAgICAgICAgICAgICAgICAgIE9wdGlvblN0eWxlIHN0eWxlKTsKKworICAvLyBQYXJzZXMgYSBzaW5nbGUgcGFydCBvZiBhIG11bHRpcGFydCBvcHRpb24gbmFtZS4gQSBtdWx0aXBhcnQgbmFtZSBjb25zaXN0cworICAvLyBvZiBuYW1lcyBzZXBhcmF0ZWQgYnkgZG90cy4gRWFjaCBuYW1lIGlzIGVpdGhlciBhbiBpZGVudGlmaWVyIG9yIGEgc2VyaWVzCisgIC8vIG9mIGlkZW50aWZpZXJzIHNlcGFyYXRlZCBieSBkb3RzIGFuZCBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcy4gRS5nLiwKKyAgLy8gImZvby4oYmFyLmJheikubW9vIi4KKyAgYm9vbCBQYXJzZU9wdGlvbk5hbWVQYXJ0KFVuaW50ZXJwcmV0ZWRPcHRpb24qIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFydF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7CisKKyAgLy8gUGFyc2VzIGEgc3RyaW5nIHN1cnJvdW5kZWQgYnkgYmFsYW5jZWQgYnJhY2VzLiAgU3RyaXBzIG9mZiB0aGUgb3V0ZXIKKyAgLy8gYnJhY2VzIGFuZCBzdG9yZXMgdGhlIGVuY2xvc2VkIHN0cmluZyBpbiAqdmFsdWUuCisgIC8vIEUuZy4sCisgIC8vICAgICB7IGZvbyB9ICAgICAgICAgICAgICAgICAgICAgKnZhbHVlIGdldHMgJ2ZvbycKKyAgLy8gICAgIHsgZm9vIHsgYmFyOiBib3ggfSB9ICAgICAgICAqdmFsdWUgZ2V0cyAnZm9vIHsgYmFyOiBib3ggfScKKyAgLy8gICAgIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUgZ2V0cyAnJworICAvLworICAvLyBSRVFVSVJFUzogTG9va2luZ0F0KCJ7IikKKyAgLy8gV2hlbiBmaW5pc2hlZCBzdWNjZXNzZnVsbHksIHdlIGFyZSBsb29raW5nIGF0IHRoZSBmaXJzdCB0b2tlbiBwYXN0CisgIC8vIHRoZSBlbmRpbmcgYnJhY2UuCisgIGJvb2wgUGFyc2VVbmludGVycHJldGVkQmxvY2soc3RkOjpzdHJpbmcqIHZhbHVlKTsKKworICBzdHJ1Y3QgTWFwRmllbGQgeworICAgIC8vIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGEgbWFwIGZpZWxkLgorICAgIGJvb2wgaXNfbWFwX2ZpZWxkOworICAgIC8vIFRoZSB0eXBlcyBvZiB0aGUga2V5IGFuZCB2YWx1ZSBpZiB0aGV5IGFyZSBwcmltaXRpdmUgdHlwZXMuCisgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGUga2V5X3R5cGU7CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGUgdmFsdWVfdHlwZTsKKyAgICAvLyBPciB0aGUgdHlwZSBuYW1lcyBzdHJpbmcgaWYgdGhlIHR5cGVzIGFyZSBjdXN0b21pemVkIHR5cGVzLgorICAgIHN0ZDo6c3RyaW5nIGtleV90eXBlX25hbWU7CisgICAgc3RkOjpzdHJpbmcgdmFsdWVfdHlwZV9uYW1lOworCisgICAgTWFwRmllbGQoKSA6IGlzX21hcF9maWVsZChmYWxzZSkge30KKyAgfTsKKyAgLy8gRGVzdWdhciB0aGUgbWFwIHN5bnRheCB0byBnZW5lcmF0ZSBhIG5lc3RlZCBtYXAgZW50cnkgbWVzc2FnZS4KKyAgdm9pZCBHZW5lcmF0ZU1hcEVudHJ5KGNvbnN0IE1hcEZpZWxkJiBtYXBfZmllbGQsIEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8RGVzY3JpcHRvclByb3RvPiogbWVzc2FnZXMpOworCisgIC8vIFdoZXRoZXIgZmllbGRzIHdpdGhvdXQgbGFiZWwgZGVmYXVsdCB0byBvcHRpb25hbCBmaWVsZHMuCisgIGJvb2wgRGVmYXVsdFRvT3B0aW9uYWxGaWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN5bnRheF9pZGVudGlmaWVyXyA9PSAicHJvdG8zIjsKKyAgfQorCisgIGJvb2wgVmFsaWRhdGVFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8qIHByb3RvKTsKKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIGlvOjpUb2tlbml6ZXIqIGlucHV0XzsKKyAgaW86OkVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3JfOworICBTb3VyY2VDb2RlSW5mbyogc291cmNlX2NvZGVfaW5mb187CisgIFNvdXJjZUxvY2F0aW9uVGFibGUqIHNvdXJjZV9sb2NhdGlvbl90YWJsZV87ICAvLyBsZWdhY3kKKyAgYm9vbCBoYWRfZXJyb3JzXzsKKyAgYm9vbCByZXF1aXJlX3N5bnRheF9pZGVudGlmaWVyXzsKKyAgYm9vbCBzdG9wX2FmdGVyX3N5bnRheF9pZGVudGlmaWVyXzsKKyAgc3RkOjpzdHJpbmcgc3ludGF4X2lkZW50aWZpZXJfOworCisgIC8vIExlYWRpbmcgZG9jIGNvbW1lbnRzIGZvciB0aGUgbmV4dCBkZWNsYXJhdGlvbi4gIFRoZXNlIGFyZSBub3QgY29tcGxldGUKKyAgLy8geWV0OyB1c2UgQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oKSB0byBnZXQgdGhlIGNvbXBsZXRlIGNvbW1lbnRzLgorICBzdGQ6OnN0cmluZyB1cGNvbWluZ19kb2NfY29tbWVudHNfOworCisgIC8vIERldGFjaGVkIGNvbW1lbnRzIGFyZSBub3QgY29ubmVjdGVkIHRvIGFueSBzeW50YXggZW50aXRpZXMuIEVsZW1lbnRzIGluCisgIC8vIHRoaXMgdmVjdG9yIGFyZSBwYXJhZ3JhcGhzIG9mIGNvbW1lbnRzIHNlcGFyYXRlZCBieSBlbXB0eSBsaW5lcy4gVGhlCisgIC8vIGRldGFjaGVkIGNvbW1lbnRzIHdpbGwgYmUgcHV0IGludG8gdGhlIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMgZmllbGQgZm9yCisgIC8vIHRoZSBuZXh0IGVsZW1lbnQgKFNlZSBTb3VyY2VDb2RlSW5mby5Mb2NhdGlvbiBpbiBkZXNjcmlwdG9yLnByb3RvKSwgd2hlbgorICAvLyBDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigpIGlzIGNhbGxlZC4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHVwY29taW5nX2RldGFjaGVkX2NvbW1lbnRzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyc2VyKTsKK307CisKKy8vIEEgdGFibGUgbWFwcGluZyAoZGVzY3JpcHRvciwgRXJyb3JMb2NhdGlvbikgcGFpcnMgLS0gYXMgcmVwb3J0ZWQgYnkKKy8vIERlc2NyaXB0b3JQb29sIHdoZW4gdmFsaWRhdGluZyBkZXNjcmlwdG9ycyAtLSB0byBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycworLy8gd2l0aGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZS4KKy8vCisvLyBUaGlzIGlzIHNlbWktb2Jzb2xldGU6ICBGaWxlRGVzY3JpcHRvclByb3RvLnNvdXJjZV9jb2RlX2luZm8gbm93IGNvbnRhaW5zCisvLyBmYXIgbW9yZSBjb21wbGV0ZSBpbmZvcm1hdGlvbiBhYm91dCBzb3VyY2UgbG9jYXRpb25zLiAgSG93ZXZlciwgYXMgb2YgdGhpcworLy8gd3JpdGluZyB5b3Ugc3RpbGwgbmVlZCB0byB1c2UgU291cmNlTG9jYXRpb25UYWJsZSB3aGVuIGludGVncmF0aW5nIHdpdGgKKy8vIERlc2NyaXB0b3JQb29sLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFNvdXJjZUxvY2F0aW9uVGFibGUgeworIHB1YmxpYzoKKyAgU291cmNlTG9jYXRpb25UYWJsZSgpOworICB+U291cmNlTG9jYXRpb25UYWJsZSgpOworCisgIC8vIEZpbmRzIHRoZSBwcmVjaXNlIGxvY2F0aW9uIG9mIHRoZSBnaXZlbiBlcnJvciBhbmQgZmlsbHMgaW4gKmxpbmUgYW5kCisgIC8vICpjb2x1bW4gd2l0aCB0aGUgbGluZSBhbmQgY29sdW1uIG51bWJlcnMuICBJZiBub3QgZm91bmQsIHNldHMgKmxpbmUgdG8KKyAgLy8gLTEgYW5kICpjb2x1bW4gdG8gMCAoc2luY2UgbGluZSA9IC0xIGlzIHVzZWQgdG8gbWVhbiAiZXJyb3IgaGFzIG5vIGV4YWN0CisgIC8vIGxvY2F0aW9uIiBpbiB0aGUgRXJyb3JDb2xsZWN0b3IgaW50ZXJmYWNlKS4gIFJldHVybnMgdHJ1ZSBpZiBmb3VuZCwgZmFsc2UKKyAgLy8gb3RoZXJ3aXNlLgorICBib29sIEZpbmQoY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKKyAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwgaW50KiBsaW5lLAorICAgICAgICAgICAgaW50KiBjb2x1bW4pIGNvbnN0OworICBib29sIEZpbmRJbXBvcnQoY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCogbGluZSwKKyAgICAgICAgICAgICAgICAgIGludCogY29sdW1uKSBjb25zdDsKKworICAvLyBBZGRzIGEgbG9jYXRpb24gdG8gdGhlIHRhYmxlLgorICB2b2lkIEFkZChjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAorICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24sIGludCBsaW5lLAorICAgICAgICAgICBpbnQgY29sdW1uKTsKKyAgdm9pZCBBZGRJbXBvcnQoY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICBpbnQgY29sdW1uKTsKKworICAvLyBDbGVhcnMgdGhlIGNvbnRlbnRzIG9mIHRoZSB0YWJsZS4KKyAgdm9pZCBDbGVhcigpOworCisgcHJpdmF0ZToKKyAgdHlwZWRlZiBzdGQ6Om1hcDwKKyAgICAgIHN0ZDo6cGFpcjxjb25zdCBNZXNzYWdlKiwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uPiwKKyAgICAgIHN0ZDo6cGFpcjxpbnQsIGludD4gPgorICAgICAgTG9jYXRpb25NYXA7CisgIExvY2F0aW9uTWFwIGxvY2F0aW9uX21hcF87CisgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxjb25zdCBNZXNzYWdlKiwgc3RkOjpzdHJpbmc+LCBzdGQ6OnBhaXI8aW50LCBpbnQ+ID4KKyAgICAgIGltcG9ydF9sb2NhdGlvbl9tYXBfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUEFSU0VSX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXJfdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDY4MWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXJfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwzNjg1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsMi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hbnkucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW9ja0Vycm9yQ29sbGVjdG9yIDogcHVibGljIGlvOjpFcnJvckNvbGxlY3RvciB7CisgcHVibGljOgorICBNb2NrRXJyb3JDb2xsZWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5Nb2NrRXJyb3JDb2xsZWN0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgc3RkOjpzdHJpbmcgd2FybmluZ187CisgIHN0ZDo6c3RyaW5nIHRleHRfOworCisgIC8vIGltcGxlbWVudHMgRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkV2FybmluZyhpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIG92ZXJyaWRlIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZ3YXJuaW5nXywgIiQwOiQxOiAkMlxuIiwgbGluZSwgY29sdW1uLCBtZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSBvdmVycmlkZSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmdGV4dF8sICIkMDokMTogJDJcbiIsIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7CisgIH0KK307CisKK2NsYXNzIE1vY2tWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIE1vY2tWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3IoY29uc3QgU291cmNlTG9jYXRpb25UYWJsZSYgc291cmNlX2xvY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6RXJyb3JDb2xsZWN0b3IqIHdyYXBwZWRfY29sbGVjdG9yKQorICAgICAgOiBzb3VyY2VfbG9jYXRpb25zXyhzb3VyY2VfbG9jYXRpb25zKSwKKyAgICAgICAgd3JhcHBlZF9jb2xsZWN0b3JfKHdyYXBwZWRfY29sbGVjdG9yKSB7fQorICB+TW9ja1ZhbGlkYXRpb25FcnJvckNvbGxlY3RvcigpIG92ZXJyaWRlIHt9CisKKyAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBBZGRFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwgRXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgb3ZlcnJpZGUgeworICAgIGludCBsaW5lLCBjb2x1bW47CisgICAgaWYgKGxvY2F0aW9uID09IERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6SU1QT1JUKSB7CisgICAgICBzb3VyY2VfbG9jYXRpb25zXy5GaW5kSW1wb3J0KGRlc2NyaXB0b3IsIGVsZW1lbnRfbmFtZSwgJmxpbmUsICZjb2x1bW4pOworICAgIH0gZWxzZSB7CisgICAgICBzb3VyY2VfbG9jYXRpb25zXy5GaW5kKGRlc2NyaXB0b3IsIGxvY2F0aW9uLCAmbGluZSwgJmNvbHVtbik7CisgICAgfQorICAgIHdyYXBwZWRfY29sbGVjdG9yXy0+QWRkRXJyb3IobGluZSwgY29sdW1uLCBtZXNzYWdlKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgU291cmNlTG9jYXRpb25UYWJsZSYgc291cmNlX2xvY2F0aW9uc187CisgIGlvOjpFcnJvckNvbGxlY3Rvciogd3JhcHBlZF9jb2xsZWN0b3JfOworfTsKKworY2xhc3MgUGFyc2VyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFBhcnNlclRlc3QoKSA6IHJlcXVpcmVfc3ludGF4X2lkZW50aWZpZXJfKGZhbHNlKSB7fQorCisgIC8vIFNldCB1cCB0aGUgcGFyc2VyIHRvIHBhcnNlIHRoZSBnaXZlbiB0ZXh0LgorICB2b2lkIFNldHVwUGFyc2VyKGNvbnN0IGNoYXIqIHRleHQpIHsKKyAgICByYXdfaW5wdXRfLnJlc2V0KG5ldyBpbzo6QXJyYXlJbnB1dFN0cmVhbSh0ZXh0LCBzdHJsZW4odGV4dCkpKTsKKyAgICBpbnB1dF8ucmVzZXQobmV3IGlvOjpUb2tlbml6ZXIocmF3X2lucHV0Xy5nZXQoKSwgJmVycm9yX2NvbGxlY3Rvcl8pKTsKKyAgICBwYXJzZXJfLnJlc2V0KG5ldyBQYXJzZXIoKSk7CisgICAgcGFyc2VyXy0+UmVjb3JkRXJyb3JzVG8oJmVycm9yX2NvbGxlY3Rvcl8pOworICAgIHBhcnNlcl8tPlNldFJlcXVpcmVTeW50YXhJZGVudGlmaWVyKHJlcXVpcmVfc3ludGF4X2lkZW50aWZpZXJfKTsKKyAgfQorCisgIC8vIFBhcnNlIHRoZSBpbnB1dCBhbmQgZXhwZWN0IHRoYXQgdGhlIHJlc3VsdGluZyBGaWxlRGVzY3JpcHRvclByb3RvIG1hdGNoZXMKKyAgLy8gdGhlIGdpdmVuIG91dHB1dC4gIFRoZSBvdXRwdXQgaXMgYSBGaWxlRGVzY3JpcHRvclByb3RvIGluIHByb3RvY29sIGJ1ZmZlcgorICAvLyB0ZXh0IGZvcm1hdC4KKyAgdm9pZCBFeHBlY3RQYXJzZXNUbyhjb25zdCBjaGFyKiBpbnB1dCwgY29uc3QgY2hhciogb3V0cHV0KSB7CisgICAgU2V0dXBQYXJzZXIoaW5wdXQpOworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gYWN0dWFsLCBleHBlY3RlZDsKKworICAgIHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJmFjdHVhbCk7CisgICAgRVhQRUNUX0VRKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5ELCBpbnB1dF8tPmN1cnJlbnQoKS50eXBlKTsKKyAgICBBU1NFUlRfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOworCisgICAgLy8gV2UgZG9uJ3QgY292ZXIgU291cmNlQ29kZUluZm8gaW4gdGhlc2UgdGVzdHMuCisgICAgYWN0dWFsLmNsZWFyX3NvdXJjZV9jb2RlX2luZm8oKTsKKworICAgIC8vIFBhcnNlIHRoZSBBU0NJSSByZXByZXNlbnRhdGlvbiBpbiBvcmRlciB0byBjYW5vbmljYWxpemUgaXQuICBXZSBjb3VsZAorICAgIC8vIGp1c3QgY29tcGFyZSBkaXJlY3RseSB0byBhY3R1YWwuRGVidWdTdHJpbmcoKSwgYnV0IHRoYXQgd291bGQgcmVxdWlyZQorICAgIC8vIHRoYXQgdGhlIGNhbGxlciBwcmVjaXNlbHkgbWF0Y2ggdGhlIGZvcm1hdHRpbmcgdGhhdCBEZWJ1Z1N0cmluZygpCisgICAgLy8gcHJvZHVjZXMuCisgICAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKG91dHB1dCwgJmV4cGVjdGVkKSk7CisKKyAgICAvLyBDb21wYXJlIGJ5IGNvbXBhcmluZyBkZWJ1ZyBzdHJpbmdzLgorICAgIC8vIFRPRE8oa2VudG9uKTogIFVzZSBkaWZmZXJlbmNlciwgb25jZSBpdCBpcyBhdmFpbGFibGUuCisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLkRlYnVnU3RyaW5nKCksIGFjdHVhbC5EZWJ1Z1N0cmluZygpKTsKKyAgfQorCisgIC8vIFBhcnNlIHRoZSB0ZXh0IGFuZCBleHBlY3QgdGhhdCB0aGUgZ2l2ZW4gZXJyb3JzIGFyZSByZXBvcnRlZC4KKyAgdm9pZCBFeHBlY3RIYXNFcnJvcnMoY29uc3QgY2hhciogdGV4dCwgY29uc3QgY2hhciogZXhwZWN0ZWRfZXJyb3JzKSB7CisgICAgRXhwZWN0SGFzRWFybHlFeGl0RXJyb3JzKHRleHQsIGV4cGVjdGVkX2Vycm9ycyk7CisgICAgRVhQRUNUX0VRKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5ELCBpbnB1dF8tPmN1cnJlbnQoKS50eXBlKTsKKyAgfQorCisgIC8vIFNhbWUgYXMgYWJvdmUgYnV0IGRvZXMgbm90IGV4cGVjdCB0aGF0IHRoZSBwYXJzZXIgcGFyc2VzIHRoZSBjb21wbGV0ZQorICAvLyBpbnB1dC4KKyAgdm9pZCBFeHBlY3RIYXNFYXJseUV4aXRFcnJvcnMoY29uc3QgY2hhciogdGV4dCwgY29uc3QgY2hhciogZXhwZWN0ZWRfZXJyb3JzKSB7CisgICAgU2V0dXBQYXJzZXIodGV4dCk7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJmZpbGUpOworICAgIEVYUEVDVF9FUShleHBlY3RlZF9lcnJvcnMsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOworICB9CisKKyAgLy8gUGFyc2UgdGhlIHRleHQgYXMgYSBmaWxlIGFuZCB2YWxpZGF0ZSBpdCAod2l0aCBhIERlc2NyaXB0b3JQb29sKSwgYW5kCisgIC8vIGV4cGVjdCB0aGF0IHRoZSB2YWxpZGF0aW9uIHN0ZXAgcmVwb3J0cyB0aGUgZ2l2ZW4gZXJyb3JzLgorICB2b2lkIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoY29uc3QgY2hhciogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2Vycm9ycykgeworICAgIFNldHVwUGFyc2VyKHRleHQpOworICAgIFNvdXJjZUxvY2F0aW9uVGFibGUgc291cmNlX2xvY2F0aW9uczsKKyAgICBwYXJzZXJfLT5SZWNvcmRTb3VyY2VMb2NhdGlvbnNUbygmc291cmNlX2xvY2F0aW9ucyk7CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisgICAgcGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmZmlsZSk7CisgICAgRVhQRUNUX0VRKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5ELCBpbnB1dF8tPmN1cnJlbnQoKS50eXBlKTsKKyAgICBBU1NFUlRfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOworCisgICAgTW9ja1ZhbGlkYXRpb25FcnJvckNvbGxlY3RvciB2YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcihzb3VyY2VfbG9jYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yX2NvbGxlY3Rvcl8pOworICAgIEVYUEVDVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoCisgICAgICAgICAgICAgICAgICAgIGZpbGUsICZ2YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3RvcikgPT0gbnVsbHB0cik7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkX2Vycm9ycywgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7CisgIH0KKworICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yXzsKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisKKyAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weUlucHV0U3RyZWFtPiByYXdfaW5wdXRfOworICBzdGQ6OnVuaXF1ZV9wdHI8aW86OlRva2VuaXplcj4gaW5wdXRfOworICBzdGQ6OnVuaXF1ZV9wdHI8UGFyc2VyPiBwYXJzZXJfOworICBib29sIHJlcXVpcmVfc3ludGF4X2lkZW50aWZpZXJfOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitURVNUX0YoUGFyc2VyVGVzdCwgU3RvcEFmdGVyU3ludGF4SWRlbnRpZmllcikgeworICBTZXR1cFBhcnNlcigKKyAgICAgICIvLyBibGFoXG4iCisgICAgICAic3ludGF4ID0gXCJmb29iYXJcIjtcbiIKKyAgICAgICJ0aGlzIGxpbmUgd2lsbCBub3QgYmUgcGFyc2VkXG4iKTsKKyAgcGFyc2VyXy0+U2V0U3RvcEFmdGVyU3ludGF4SWRlbnRpZmllcih0cnVlKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCBudWxscHRyKSk7CisgIEVYUEVDVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7CisgIEVYUEVDVF9FUSgiZm9vYmFyIiwgcGFyc2VyXy0+R2V0U3ludGF4SWRlbnRpZmllcigpKTsKK30KKworVEVTVF9GKFBhcnNlclRlc3QsIFN0b3BBZnRlck9taXR0ZWRTeW50YXhJZGVudGlmaWVyKSB7CisgIFNldHVwUGFyc2VyKAorICAgICAgIi8vIGJsYWhcbiIKKyAgICAgICJ0aGlzIGxpbmUgd2lsbCBub3QgYmUgcGFyc2VkXG4iKTsKKyAgcGFyc2VyXy0+U2V0U3RvcEFmdGVyU3ludGF4SWRlbnRpZmllcih0cnVlKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCBudWxscHRyKSk7CisgIEVYUEVDVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7CisgIEVYUEVDVF9FUSgiIiwgcGFyc2VyXy0+R2V0U3ludGF4SWRlbnRpZmllcigpKTsKK30KKworVEVTVF9GKFBhcnNlclRlc3QsIFN0b3BBZnRlclN5bnRheElkZW50aWZpZXJXaXRoRXJyb3JzKSB7CisgIFNldHVwUGFyc2VyKAorICAgICAgIi8vIGJsYWhcbiIKKyAgICAgICJzeW50YXggPSBlcnJvcjtcbiIpOworICBwYXJzZXJfLT5TZXRTdG9wQWZ0ZXJTeW50YXhJZGVudGlmaWVyKHRydWUpOworICBFWFBFQ1RfRkFMU0UocGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCBudWxscHRyKSk7CisgIEVYUEVDVF9FUSgiMTo5OiBFeHBlY3RlZCBzeW50YXggaWRlbnRpZmllci5cbiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOworfQorCitURVNUX0YoUGFyc2VyVGVzdCwgV2FybklmU3ludGF4SWRlbnRpZmllck9tbWl0dGVkKSB7CisgIFNldHVwUGFyc2VyKCJtZXNzYWdlIEEge30iKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICBDYXB0dXJlVGVzdFN0ZGVycigpOworICBFWFBFQ1RfVFJVRShwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksICZmaWxlKSk7CisgIEVYUEVDVF9UUlVFKEdldENhcHR1cmVkVGVzdFN0ZGVycigpLmZpbmQoIk5vIHN5bnRheCBzcGVjaWZpZWQiKSAhPQorICAgICAgICAgICAgICBzdGQ6OnN0cmluZzo6bnBvcyk7Cit9CisKK1RFU1RfRihQYXJzZXJUZXN0LCBXYXJuSWZGaWVsZE5hbWVJc05vdFVwcGVyQ2FtZWwpIHsKKyAgU2V0dXBQYXJzZXIoCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjsiCisgICAgICAibWVzc2FnZSBhYmMge30iKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICBFWFBFQ1RfVFJVRShwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksICZmaWxlKSk7CisgIEVYUEVDVF9UUlVFKGVycm9yX2NvbGxlY3Rvcl8ud2FybmluZ18uZmluZCgKKyAgICAgICAgICAgICAgICAgICJNZXNzYWdlIG5hbWUgc2hvdWxkIGJlIGluIFVwcGVyQ2FtZWxDYXNlLiBGb3VuZDogYWJjLiIpICE9CisgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nOjpucG9zKTsKK30KKworVEVTVF9GKFBhcnNlclRlc3QsIFdhcm5JZkZpZWxkTmFtZUlzTm90TG93ZXJVbmRlcnNjb3JlKSB7CisgIFNldHVwUGFyc2VyKAorICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7IgorICAgICAgIm1lc3NhZ2UgQSB7IgorICAgICAgIiAgb3B0aW9uYWwgc3RyaW5nIFNvbmdOYW1lID0gMTsiCisgICAgICAifSIpOworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgIEVYUEVDVF9UUlVFKHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJmZpbGUpKTsKKyAgRVhQRUNUX1RSVUUoZXJyb3JfY29sbGVjdG9yXy53YXJuaW5nXy5maW5kKAorICAgICAgICAgICAgICAgICAgIkZpZWxkIG5hbWUgc2hvdWxkIGJlIGxvd2VyY2FzZS4gRm91bmQ6IFNvbmdOYW1lIikgIT0KKyAgICAgICAgICAgICAgc3RkOjpzdHJpbmc6Om5wb3MpOworfQorCitURVNUX0YoUGFyc2VyVGVzdCwgV2FybklmRmllbGROYW1lQ29udGFpbnNOdW1iZXJJbW1lZGlhdGVseUZvbGxvd1VuZGVyc2NvcmUpIHsKKyAgU2V0dXBQYXJzZXIoCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjsiCisgICAgICAibWVzc2FnZSBBIHsiCisgICAgICAiICBvcHRpb25hbCBzdHJpbmcgc29uZ19uYW1lXzEgPSAxOyIKKyAgICAgICJ9Iik7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmZmlsZSkpOworICBFWFBFQ1RfVFJVRShlcnJvcl9jb2xsZWN0b3JfLndhcm5pbmdfLmZpbmQoCisgICAgICAgICAgICAgICAgICAiTnVtYmVyIHNob3VsZCBub3QgY29tZSByaWdodCBhZnRlciBhbiB1bmRlcnNjb3JlLiBGb3VuZDogIgorICAgICAgICAgICAgICAgICAgInNvbmdfbmFtZV8xLiIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0eXBlZGVmIFBhcnNlclRlc3QgUGFyc2VNZXNzYWdlVGVzdDsKKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIElnbm9yZUJPTSkgeworICBjaGFyIGlucHV0W10gPQorICAgICAgIiAgIG1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgcmVxdWlyZWQgaW50MzIgZm9vID0gMTtcbiIKKyAgICAgICJ9XG4iOworICAvLyBTZXQgVVRGLTggQk9NLgorICBpbnB1dFswXSA9IChjaGFyKTB4RUY7CisgIGlucHV0WzFdID0gKGNoYXIpMHhCQjsKKyAgaW5wdXRbMl0gPSAoY2hhcikweEJGOworICBFeHBlY3RQYXJzZXNUbygKKyAgICAgIGlucHV0LAorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxIH0iCisgICAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgQk9NRXJyb3IpIHsKKyAgY2hhciBpbnB1dFtdID0KKyAgICAgICIgICBtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIHJlcXVpcmVkIGludDMyIGZvbyA9IDE7XG4iCisgICAgICAifVxuIjsKKyAgaW5wdXRbMF0gPSAoY2hhcikweEVGOworICBFeHBlY3RIYXNFcnJvcnMoaW5wdXQsCisgICAgICAgICAgICAgICAgICAiMDoxOiBQcm90byBmaWxlIHN0YXJ0cyB3aXRoIDB4RUYgYnV0IG5vdCBVVEYtOCBCT00uICIKKyAgICAgICAgICAgICAgICAgICJPbmx5IFVURi04IGlzIGFjY2VwdGVkIGZvciBwcm90byBmaWxlLlxuIgorICAgICAgICAgICAgICAgICAgIjA6MDogRXhwZWN0ZWQgdG9wLWxldmVsIHN0YXRlbWVudCAoZS5nLiBcIm1lc3NhZ2VcIikuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIFNpbXBsZU1lc3NhZ2UpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICByZXF1aXJlZCBpbnQzMiBmb28gPSAxO1xuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MSB9IgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEltcGxpY2l0U3ludGF4SWRlbnRpZmllcikgeworICByZXF1aXJlX3N5bnRheF9pZGVudGlmaWVyXyA9IGZhbHNlOworICBFeHBlY3RQYXJzZXNUbygKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIHJlcXVpcmVkIGludDMyIGZvbyA9IDE7XG4iCisgICAgICAifVxuIiwKKworICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxIH0iCisgICAgICAifSIpOworICBFWFBFQ1RfRVEoInByb3RvMiIsIHBhcnNlcl8tPkdldFN5bnRheElkZW50aWZpZXIoKSk7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBFeHBsaWNpdFN5bnRheElkZW50aWZpZXIpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIHJlcXVpcmVkIGludDMyIGZvbyA9IDE7XG4iCisgICAgICAifVxuIiwKKworICAgICAgInN5bnRheDogJ3Byb3RvMicgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxIH0iCisgICAgICAifSIpOworICBFWFBFQ1RfRVEoInByb3RvMiIsIHBhcnNlcl8tPkdldFN5bnRheElkZW50aWZpZXIoKSk7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBFeHBsaWNpdFJlcXVpcmVkU3ludGF4SWRlbnRpZmllcikgeworICByZXF1aXJlX3N5bnRheF9pZGVudGlmaWVyXyA9IHRydWU7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICByZXF1aXJlZCBpbnQzMiBmb28gPSAxO1xuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJzeW50YXg6ICdwcm90bzInICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MSB9IgorICAgICAgIn0iKTsKKyAgRVhQRUNUX0VRKCJwcm90bzIiLCBwYXJzZXJfLT5HZXRTeW50YXhJZGVudGlmaWVyKCkpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgU2ltcGxlRmllbGRzKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgcmVxdWlyZWQgaW50MzIgZm9vID0gMTU7XG4iCisgICAgICAiICBvcHRpb25hbCBpbnQzMiBiYXIgPSAzNDtcbiIKKyAgICAgICIgIHJlcGVhdGVkIGludDMyIGJheiA9IDM7XG4iCisgICAgICAifVxuIiwKKworICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxNSB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiYmFyXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjozNCB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiYmF6XCIgbGFiZWw6TEFCRUxfUkVQRUFURUQgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjozICB9IgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIFByaW1pdGl2ZUZpZWxkVHlwZXMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICByZXF1aXJlZCBpbnQzMiAgICBmb28gPSAxO1xuIgorICAgICAgIiAgcmVxdWlyZWQgaW50NjQgICAgZm9vID0gMTtcbiIKKyAgICAgICIgIHJlcXVpcmVkIHVpbnQzMiAgIGZvbyA9IDE7XG4iCisgICAgICAiICByZXF1aXJlZCB1aW50NjQgICBmb28gPSAxO1xuIgorICAgICAgIiAgcmVxdWlyZWQgc2ludDMyICAgZm9vID0gMTtcbiIKKyAgICAgICIgIHJlcXVpcmVkIHNpbnQ2NCAgIGZvbyA9IDE7XG4iCisgICAgICAiICByZXF1aXJlZCBmaXhlZDMyICBmb28gPSAxO1xuIgorICAgICAgIiAgcmVxdWlyZWQgZml4ZWQ2NCAgZm9vID0gMTtcbiIKKyAgICAgICIgIHJlcXVpcmVkIHNmaXhlZDMyIGZvbyA9IDE7XG4iCisgICAgICAiICByZXF1aXJlZCBzZml4ZWQ2NCBmb28gPSAxO1xuIgorICAgICAgIiAgcmVxdWlyZWQgZmxvYXQgICAgZm9vID0gMTtcbiIKKyAgICAgICIgIHJlcXVpcmVkIGRvdWJsZSAgIGZvbyA9IDE7XG4iCisgICAgICAiICByZXF1aXJlZCBzdHJpbmcgICBmb28gPSAxO1xuIgorICAgICAgIiAgcmVxdWlyZWQgYnl0ZXMgICAgZm9vID0gMTtcbiIKKyAgICAgICIgIHJlcXVpcmVkIGJvb2wgICAgIGZvbyA9IDE7XG4iCisgICAgICAifVxuIiwKKworICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0lOVDMyICAgIG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0lOVDY0ICAgIG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX1VJTlQzMiAgIG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX1VJTlQ2NCAgIG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX1NJTlQzMiAgIG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX1NJTlQ2NCAgIG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0ZJWEVEMzIgIG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0ZJWEVENjQgIG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX1NGSVhFRDMyIG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX1NGSVhFRDY0IG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0ZMT0FUICAgIG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0RPVUJMRSAgIG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX1NUUklORyAgIG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0JZVEVTICAgIG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0JPT0wgICAgIG51bWJlcjoxICIKKyAgICAgICJ9IgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEZpZWxkRGVmYXVsdHMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICByZXF1aXJlZCBpbnQzMiAgZm9vID0gMSBbZGVmYXVsdD0gIDEgIF07XG4iCisgICAgICAiICByZXF1aXJlZCBpbnQzMiAgZm9vID0gMSBbZGVmYXVsdD0gLTIgIF07XG4iCisgICAgICAiICByZXF1aXJlZCBpbnQ2NCAgZm9vID0gMSBbZGVmYXVsdD0gIDMgIF07XG4iCisgICAgICAiICByZXF1aXJlZCBpbnQ2NCAgZm9vID0gMSBbZGVmYXVsdD0gLTQgIF07XG4iCisgICAgICAiICByZXF1aXJlZCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD0gIDUgIF07XG4iCisgICAgICAiICByZXF1aXJlZCB1aW50NjQgZm9vID0gMSBbZGVmYXVsdD0gIDYgIF07XG4iCisgICAgICAiICByZXF1aXJlZCBmbG9hdCAgZm9vID0gMSBbZGVmYXVsdD0gIDcuNV07XG4iCisgICAgICAiICByZXF1aXJlZCBmbG9hdCAgZm9vID0gMSBbZGVmYXVsdD0gLTguNV07XG4iCisgICAgICAiICByZXF1aXJlZCBmbG9hdCAgZm9vID0gMSBbZGVmYXVsdD0gIDkgIF07XG4iCisgICAgICAiICByZXF1aXJlZCBkb3VibGUgZm9vID0gMSBbZGVmYXVsdD0gMTAuNV07XG4iCisgICAgICAiICByZXF1aXJlZCBkb3VibGUgZm9vID0gMSBbZGVmYXVsdD0tMTEuNV07XG4iCisgICAgICAiICByZXF1aXJlZCBkb3VibGUgZm9vID0gMSBbZGVmYXVsdD0gMTIgIF07XG4iCisgICAgICAiICByZXF1aXJlZCBkb3VibGUgZm9vID0gMSBbZGVmYXVsdD0gaW5mIF07XG4iCisgICAgICAiICByZXF1aXJlZCBkb3VibGUgZm9vID0gMSBbZGVmYXVsdD0taW5mIF07XG4iCisgICAgICAiICByZXF1aXJlZCBkb3VibGUgZm9vID0gMSBbZGVmYXVsdD0gbmFuIF07XG4iCisgICAgICAiICByZXF1aXJlZCBzdHJpbmcgZm9vID0gMSBbZGVmYXVsdD0nMTNcXDAwMSddO1xuIgorICAgICAgIiAgcmVxdWlyZWQgc3RyaW5nIGZvbyA9IDEgW2RlZmF1bHQ9J2EnIFwiYlwiIFxuIFwiY1wiXTtcbiIKKyAgICAgICIgIHJlcXVpcmVkIGJ5dGVzICBmb28gPSAxIFtkZWZhdWx0PScxNFxcMDAyJ107XG4iCisgICAgICAiICByZXF1aXJlZCBieXRlcyAgZm9vID0gMSBbZGVmYXVsdD0nYScgXCJiXCIgXG4gJ2MnXTtcbiIKKyAgICAgICIgIHJlcXVpcmVkIGJvb2wgICBmb28gPSAxIFtkZWZhdWx0PXRydWUgXTtcbiIKKyAgICAgICIgIHJlcXVpcmVkIEZvbyAgICBmb28gPSAxIFtkZWZhdWx0PUZPTyAgXTtcbiIKKworICAgICAgIiAgcmVxdWlyZWQgaW50MzIgIGZvbyA9IDEgW2RlZmF1bHQ9IDB4N0ZGRkZGRkZdO1xuIgorICAgICAgIiAgcmVxdWlyZWQgaW50MzIgIGZvbyA9IDEgW2RlZmF1bHQ9LTB4ODAwMDAwMDBdO1xuIgorICAgICAgIiAgcmVxdWlyZWQgdWludDMyIGZvbyA9IDEgW2RlZmF1bHQ9IDB4RkZGRkZGRkZdO1xuIgorICAgICAgIiAgcmVxdWlyZWQgaW50NjQgIGZvbyA9IDEgW2RlZmF1bHQ9IDB4N0ZGRkZGRkZGRkZGRkZGRl07XG4iCisgICAgICAiICByZXF1aXJlZCBpbnQ2NCAgZm9vID0gMSBbZGVmYXVsdD0tMHg4MDAwMDAwMDAwMDAwMDAwXTtcbiIKKyAgICAgICIgIHJlcXVpcmVkIHVpbnQ2NCBmb28gPSAxIFtkZWZhdWx0PSAweEZGRkZGRkZGRkZGRkZGRkZdO1xuIgorICAgICAgIiAgcmVxdWlyZWQgZG91YmxlIGZvbyA9IDEgW2RlZmF1bHQ9IDB4YWJjZF07XG4iCisgICAgICAifVxuIiwKKworI2RlZmluZSBFVEMgIm5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCBudW1iZXI6MSIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0lOVDMyICAgZGVmYXVsdF92YWx1ZTpcIjFcIiAgICAgICAgICIgRVRDCisgICAgICAiIH0iCisgICAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9JTlQzMiAgIGRlZmF1bHRfdmFsdWU6XCItMlwiICAgICAgICAiIEVUQworICAgICAgIiB9IgorICAgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfSU5UNjQgICBkZWZhdWx0X3ZhbHVlOlwiM1wiICAgICAgICAgIiBFVEMKKyAgICAgICIgfSIKKyAgICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0lOVDY0ICAgZGVmYXVsdF92YWx1ZTpcIi00XCIgICAgICAgICIgRVRDCisgICAgICAiIH0iCisgICAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9VSU5UMzIgIGRlZmF1bHRfdmFsdWU6XCI1XCIgICAgICAgICAiIEVUQworICAgICAgIiB9IgorICAgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfVUlOVDY0ICBkZWZhdWx0X3ZhbHVlOlwiNlwiICAgICAgICAgIiBFVEMKKyAgICAgICIgfSIKKyAgICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0ZMT0FUICAgZGVmYXVsdF92YWx1ZTpcIjcuNVwiICAgICAgICIgRVRDCisgICAgICAiIH0iCisgICAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9GTE9BVCAgIGRlZmF1bHRfdmFsdWU6XCItOC41XCIgICAgICAiIEVUQworICAgICAgIiB9IgorICAgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRkxPQVQgICBkZWZhdWx0X3ZhbHVlOlwiOVwiICAgICAgICAgIiBFVEMKKyAgICAgICIgfSIKKyAgICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0RPVUJMRSAgZGVmYXVsdF92YWx1ZTpcIjEwLjVcIiAgICAgICIgRVRDCisgICAgICAiIH0iCisgICAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9ET1VCTEUgIGRlZmF1bHRfdmFsdWU6XCItMTEuNVwiICAgICAiIEVUQworICAgICAgIiB9IgorICAgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwiMTJcIiAgICAgICAgIiBFVEMKKyAgICAgICIgfSIKKyAgICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0RPVUJMRSAgZGVmYXVsdF92YWx1ZTpcImluZlwiICAgICAgICIgRVRDCisgICAgICAiIH0iCisgICAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9ET1VCTEUgIGRlZmF1bHRfdmFsdWU6XCItaW5mXCIgICAgICAiIEVUQworICAgICAgIiB9IgorICAgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwibmFuXCIgICAgICAgIiBFVEMKKyAgICAgICIgfSIKKyAgICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX1NUUklORyAgZGVmYXVsdF92YWx1ZTpcIjEzXFwwMDFcIiAgICIgRVRDCisgICAgICAiIH0iCisgICAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9TVFJJTkcgIGRlZmF1bHRfdmFsdWU6XCJhYmNcIiAgICAgICAiIEVUQworICAgICAgIiB9IgorICAgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfQllURVMgICBkZWZhdWx0X3ZhbHVlOlwiMTRcXFxcMDAyXCIgIiBFVEMKKyAgICAgICIgfSIKKyAgICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0JZVEVTICAgZGVmYXVsdF92YWx1ZTpcImFiY1wiICAgICAgICIgRVRDCisgICAgICAiIH0iCisgICAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9CT09MICAgIGRlZmF1bHRfdmFsdWU6XCJ0cnVlXCIgICAgICAiIEVUQworICAgICAgIiB9IgorICAgICAgIiAgZmllbGQgeyB0eXBlX25hbWU6XCJGb29cIiBkZWZhdWx0X3ZhbHVlOlwiRk9PXCIgICAgICAgIiBFVEMKKyAgICAgICIgfSIKKworICAgICAgIiAgZmllbGQgeyIKKyAgICAgICIgICAgdHlwZTpUWVBFX0lOVDMyICAgZGVmYXVsdF92YWx1ZTpcIjIxNDc0ODM2NDdcIiAgICAgICAgICAgIiBFVEMKKyAgICAgICIgIH0iCisgICAgICAiICBmaWVsZCB7IgorICAgICAgIiAgICB0eXBlOlRZUEVfSU5UMzIgICBkZWZhdWx0X3ZhbHVlOlwiLTIxNDc0ODM2NDhcIiAgICAgICAgICAiIEVUQworICAgICAgIiAgfSIKKyAgICAgICIgIGZpZWxkIHsiCisgICAgICAiICAgIHR5cGU6VFlQRV9VSU5UMzIgIGRlZmF1bHRfdmFsdWU6XCI0Mjk0OTY3Mjk1XCIgICAgICAgICAgICIgRVRDCisgICAgICAiICB9IgorICAgICAgIiAgZmllbGQgeyIKKyAgICAgICIgICAgdHlwZTpUWVBFX0lOVDY0ICAgZGVmYXVsdF92YWx1ZTpcIjkyMjMzNzIwMzY4NTQ3NzU4MDdcIiAgIiBFVEMKKyAgICAgICIgIH0iCisgICAgICAiICBmaWVsZCB7IgorICAgICAgIiAgICB0eXBlOlRZUEVfSU5UNjQgICBkZWZhdWx0X3ZhbHVlOlwiLTkyMjMzNzIwMzY4NTQ3NzU4MDhcIiAiIEVUQworICAgICAgIiAgfSIKKyAgICAgICIgIGZpZWxkIHsiCisgICAgICAiICAgIHR5cGU6VFlQRV9VSU5UNjQgIGRlZmF1bHRfdmFsdWU6XCIxODQ0Njc0NDA3MzcwOTU1MTYxNVwiICIgRVRDCisgICAgICAiICB9IgorICAgICAgIiAgZmllbGQgeyIKKyAgICAgICIgICAgdHlwZTpUWVBFX0RPVUJMRSAgZGVmYXVsdF92YWx1ZTpcIjQzOTgxXCIgICAgICAgICAgICAgICAgIiBFVEMKKyAgICAgICIgIH0iCisgICAgICAifSIpOworI3VuZGVmIEVUQworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgRmllbGRKc29uTmFtZSkgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxIFtqc29uX25hbWUgPSBcIkB0eXBlXCJdO1xuIgorICAgICAgIn1cbiIsCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgICAiICBmaWVsZCB7XG4iCisgICAgICAiICAgIG5hbWU6IFwiZm9vXCIgbGFiZWw6IExBQkVMX09QVElPTkFMIHR5cGU6IFRZUEVfU1RSSU5HIG51bWJlcjogMSIKKyAgICAgICIgICAganNvbl9uYW1lOiBcIkB0eXBlXCJcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEZpZWxkT3B0aW9ucykgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxXG4iCisgICAgICAiICAgICAgW2N0eXBlPUNPUkQsIChmb28pPTcsIGZvby4oLmJhci5iYXopLnF1eC5xdXV4Lihjb3JnZSk9LTMzLCBcbiIKKyAgICAgICIgICAgICAgKHF1dXgpPVwieFwwNDB5XCIsIChiYXoucXV4KT1oZXldO1xuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTogXCJmb29cIiBsYWJlbDogTEFCRUxfT1BUSU9OQUwgdHlwZTogVFlQRV9TVFJJTkcgbnVtYmVyOiAiCisgICAgICAiMSIKKyAgICAgICIgICAgICAgICAgb3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uOiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiY3R5cGVcIiAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgICAifSAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcIkNPUkRcIiAgIgorICAgICAgIn0iCisgICAgICAiICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbjogeyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDcgIH0iCisgICAgICAiICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbjogeyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKKyAgICAgICJ9ICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6ICIKKyAgICAgICJcIi5iYXIuYmF6XCIiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJxdXhcIiAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgICAifSAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcInF1dXhcIiAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgICAifSAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcImNvcmdlXCIgIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlX2ludF92YWx1ZTogLTMzIH0iCisgICAgICAiICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbjogeyBuYW1lIHsgbmFtZV9wYXJ0OiBcInF1dXhcIiAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3ZhbHVlOiBcInggeVwiIH0iCisgICAgICAiICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbjogeyBuYW1lIHsgbmFtZV9wYXJ0OiAiCisgICAgICAiXCJiYXoucXV4XCIgIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiaGV5XCIgfSIKKyAgICAgICIgICAgICAgICAgfSIKKyAgICAgICIgIH0iCisgICAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgT25lb2YpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBvbmVvZiBmb28ge1xuIgorICAgICAgIiAgICBpbnQzMiBhID0gMTtcbiIKKyAgICAgICIgICAgc3RyaW5nIGIgPSAyO1xuIgorICAgICAgIiAgICBUZXN0TWVzc2FnZSBjID0gMztcbiIKKyAgICAgICIgICAgZ3JvdXAgRCA9IDQgeyBvcHRpb25hbCBpbnQzMiBpID0gNTsgfVxuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImFcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgIgorICAgICAgIiAgICAgICAgICBvbmVvZl9pbmRleDowIH0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJiXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX1NUUklORyBudW1iZXI6MiAiCisgICAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OjAgfSIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImNcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJUZXN0TWVzc2FnZVwiICIKKyAgICAgICIgICAgICAgICAgbnVtYmVyOjMgb25lb2ZfaW5kZXg6MCB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZFwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9HUk9VUCAiCisgICAgICAiICAgICAgICAgIHR5cGVfbmFtZTpcIkRcIiBudW1iZXI6NCBvbmVvZl9pbmRleDowIH0iCisgICAgICAiICBvbmVvZl9kZWNsIHsiCisgICAgICAiICAgIG5hbWU6IFwiZm9vXCIiCisgICAgICAiICB9IgorICAgICAgIiAgbmVzdGVkX3R5cGUgeyIKKyAgICAgICIgICAgbmFtZTogXCJEXCIiCisgICAgICAiICAgIGZpZWxkIHsgbmFtZTpcImlcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjUgfSIKKyAgICAgICIgIH0iCisgICAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgTXVsdGlwbGVPbmVvZnMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBvbmVvZiBmb28ge1xuIgorICAgICAgIiAgICBpbnQzMiBhID0gMTtcbiIKKyAgICAgICIgICAgc3RyaW5nIGIgPSAyO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgb25lb2YgYmFyIHtcbiIKKyAgICAgICIgICAgaW50MzIgYyA9IDM7XG4iCisgICAgICAiICAgIHN0cmluZyBkID0gNDtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iLAorCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJhXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxICIKKyAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6MCB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiYlwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9TVFJJTkcgbnVtYmVyOjIgIgorICAgICAgIiAgICAgICAgICBvbmVvZl9pbmRleDowIH0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJjXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjozICIKKyAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6MSB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZFwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9TVFJJTkcgbnVtYmVyOjQgIgorICAgICAgIiAgICAgICAgICBvbmVvZl9pbmRleDoxIH0iCisgICAgICAiICBvbmVvZl9kZWNsIHsiCisgICAgICAiICAgIG5hbWU6IFwiZm9vXCIiCisgICAgICAiICB9IgorICAgICAgIiAgb25lb2ZfZGVjbCB7IgorICAgICAgIiAgICBuYW1lOiBcImJhclwiIgorICAgICAgIiAgfSIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBNYXBzKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgbWFwPGludDMyLCBzdHJpbmc+IHByaW1pdGl2ZV90eXBlX21hcCA9IDE7XG4iCisgICAgICAiICBtYXA8S2V5VHlwZSwgVmFsdWVUeXBlPiBjb21wb3NpdGVfdHlwZV9tYXAgPSAyO1xuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIG5lc3RlZF90eXBlIHsiCisgICAgICAiICAgIG5hbWU6IFwiUHJpbWl0aXZlVHlwZU1hcEVudHJ5XCIiCisgICAgICAiICAgIGZpZWxkIHsgIgorICAgICAgIiAgICAgICBuYW1lOiBcImtleVwiIG51bWJlcjogMSBsYWJlbDpMQUJFTF9PUFRJT05BTCIKKyAgICAgICIgICAgICAgdHlwZTpUWVBFX0lOVDMyIgorICAgICAgIiAgICB9IgorICAgICAgIiAgICBmaWVsZCB7ICIKKyAgICAgICIgICAgICAgbmFtZTogXCJ2YWx1ZVwiIG51bWJlcjogMiBsYWJlbDpMQUJFTF9PUFRJT05BTCIKKyAgICAgICIgICAgICAgdHlwZTpUWVBFX1NUUklORyIKKyAgICAgICIgICAgfSIKKyAgICAgICIgICAgb3B0aW9ucyB7IG1hcF9lbnRyeTogdHJ1ZSB9IgorICAgICAgIiAgfSIKKyAgICAgICIgIG5lc3RlZF90eXBlIHsiCisgICAgICAiICAgIG5hbWU6IFwiQ29tcG9zaXRlVHlwZU1hcEVudHJ5XCIiCisgICAgICAiICAgIGZpZWxkIHsgIgorICAgICAgIiAgICAgICBuYW1lOiBcImtleVwiIG51bWJlcjogMSBsYWJlbDpMQUJFTF9PUFRJT05BTCIKKyAgICAgICIgICAgICAgdHlwZV9uYW1lOiBcIktleVR5cGVcIiIKKyAgICAgICIgICAgfSIKKyAgICAgICIgICAgZmllbGQgeyAiCisgICAgICAiICAgICAgIG5hbWU6IFwidmFsdWVcIiBudW1iZXI6IDIgbGFiZWw6TEFCRUxfT1BUSU9OQUwiCisgICAgICAiICAgICAgIHR5cGVfbmFtZTogXCJWYWx1ZVR5cGVcIiIKKyAgICAgICIgICAgfSIKKyAgICAgICIgICAgb3B0aW9ucyB7IG1hcF9lbnRyeTogdHJ1ZSB9IgorICAgICAgIiAgfSIKKyAgICAgICIgIGZpZWxkIHsiCisgICAgICAiICAgIG5hbWU6IFwicHJpbWl0aXZlX3R5cGVfbWFwXCIiCisgICAgICAiICAgIGxhYmVsOiBMQUJFTF9SRVBFQVRFRCIKKyAgICAgICIgICAgdHlwZV9uYW1lOiBcIlByaW1pdGl2ZVR5cGVNYXBFbnRyeVwiIgorICAgICAgIiAgICBudW1iZXI6IDEiCisgICAgICAiICB9IgorICAgICAgIiAgZmllbGQgeyIKKyAgICAgICIgICAgbmFtZTogXCJjb21wb3NpdGVfdHlwZV9tYXBcIiIKKyAgICAgICIgICAgbGFiZWw6IExBQkVMX1JFUEVBVEVEIgorICAgICAgIiAgICB0eXBlX25hbWU6IFwiQ29tcG9zaXRlVHlwZU1hcEVudHJ5XCIiCisgICAgICAiICAgIG51bWJlcjogMiIKKyAgICAgICIgIH0iCisgICAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgR3JvdXApIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBvcHRpb25hbCBncm91cCBUZXN0R3JvdXAgPSAxIHt9O1xuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIG5lc3RlZF90eXBlIHsgbmFtZTogXCJUZXN0R3JvdXBcIiB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwidGVzdGdyb3VwXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgbnVtYmVyOjEiCisgICAgICAiICAgICAgICAgIHR5cGU6VFlQRV9HUk9VUCB0eXBlX25hbWU6IFwiVGVzdEdyb3VwXCIgfSIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBOZXN0ZWRNZXNzYWdlKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgbWVzc2FnZSBOZXN0ZWQge31cbiIKKyAgICAgICIgIG9wdGlvbmFsIE5lc3RlZCB0ZXN0X25lc3RlZCA9IDE7XG4iCisgICAgICAifVxuIiwKKworICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICAgIiAgbmVzdGVkX3R5cGUgeyBuYW1lOiBcIk5lc3RlZFwiIH0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJ0ZXN0X25lc3RlZFwiIGxhYmVsOkxBQkVMX09QVElPTkFMIG51bWJlcjoxIgorICAgICAgIiAgICAgICAgICB0eXBlX25hbWU6IFwiTmVzdGVkXCIgfSIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBOZXN0ZWRFbnVtKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgZW51bSBOZXN0ZWRFbnVtIHt9XG4iCisgICAgICAiICBvcHRpb25hbCBOZXN0ZWRFbnVtIHRlc3RfZW51bSA9IDE7XG4iCisgICAgICAifVxuIiwKKworICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICAgIiAgZW51bV90eXBlIHsgbmFtZTogXCJOZXN0ZWRFbnVtXCIgfSIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcInRlc3RfZW51bVwiIGxhYmVsOkxBQkVMX09QVElPTkFMIG51bWJlcjoxIgorICAgICAgIiAgICAgICAgICB0eXBlX25hbWU6IFwiTmVzdGVkRW51bVwiIH0iCisgICAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgUmVzZXJ2ZWRSYW5nZSkgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIHJlcXVpcmVkIGludDMyIGZvbyA9IDE7XG4iCisgICAgICAiICByZXNlcnZlZCAyLCAxNSwgOSB0byAxMSwgMywgMjAgdG8gbWF4O1xuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MSB9IgorICAgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDoyICAgZW5kOjMgICAgICAgICB9IgorICAgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDoxNSAgZW5kOjE2ICAgICAgICB9IgorICAgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDo5ICAgZW5kOjEyICAgICAgICB9IgorICAgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDozICAgZW5kOjQgICAgICAgICB9IgorICAgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDoyMCAgZW5kOjUzNjg3MDkxMiB9IgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIFJlc2VydmVkUmFuZ2VPbk1lc3NhZ2VTZXQpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBvcHRpb24gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlO1xuIgorICAgICAgIiAgcmVzZXJ2ZWQgMjAgdG8gbWF4O1xuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIG9wdGlvbnMgeyIKKyAgICAgICIgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyIKKyAgICAgICIgICAgICBuYW1lIHsiCisgICAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwibWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRcIiIKKyAgICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UiCisgICAgICAiICAgICAgfSIKKyAgICAgICIgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcInRydWVcIiIKKyAgICAgICIgICAgfSIKKyAgICAgICIgIH0iCisgICAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0OjIwICBlbmQ6MjE0NzQ4MzY0NyB9IgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIFJlc2VydmVkTmFtZXMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICByZXNlcnZlZCBcImZvb1wiLCBcImJhclwiO1xuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIHJlc2VydmVkX25hbWU6IFwiZm9vXCIiCisgICAgICAiICByZXNlcnZlZF9uYW1lOiBcImJhclwiIgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEV4dGVuc2lvblJhbmdlKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgZXh0ZW5zaW9ucyAxMCB0byAxOTtcbiIKKyAgICAgICIgIGV4dGVuc2lvbnMgMzAgdG8gbWF4O1xuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjEwIGVuZDoyMCAgICAgICAgfSIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjMwIGVuZDo1MzY4NzA5MTIgfSIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBFeHRlbnNpb25SYW5nZVdpdGhPcHRpb25zKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgZXh0ZW5zaW9ucyAxMCB0byAxOSBbKGkpID0gNV07XG4iCisgICAgICAifVxuIiwKKworICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsiCisgICAgICAiICAgIHN0YXJ0OjEwIgorICAgICAgIiAgICBlbmQ6MjAiCisgICAgICAiICAgIG9wdGlvbnMgeyIKKyAgICAgICIgICAgICB1bmludGVycHJldGVkX29wdGlvbiB7IgorICAgICAgIiAgICAgICAgbmFtZSB7IgorICAgICAgIiAgICAgICAgICBuYW1lX3BhcnQ6IFwiaVwiIgorICAgICAgIiAgICAgICAgICBpc19leHRlbnNpb246IHRydWUiCisgICAgICAiICAgICAgICB9IgorICAgICAgIiAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiA1IgorICAgICAgIiAgICAgIH0iCisgICAgICAiICAgIH0iCisgICAgICAiICB9IgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIENvbXBvdW5kRXh0ZW5zaW9uUmFuZ2UpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBleHRlbnNpb25zIDIsIDE1LCA5IHRvIDExLCAxMDAgdG8gbWF4LCAzO1xuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjIgICBlbmQ6MyAgICAgICAgIH0iCisgICAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDoxNSAgZW5kOjE2ICAgICAgICB9IgorICAgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6OSAgIGVuZDoxMiAgICAgICAgfSIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjEwMCBlbmQ6NTM2ODcwOTEyIH0iCisgICAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDozICAgZW5kOjQgICAgICAgICB9IgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIENvbXBvdW5kRXh0ZW5zaW9uUmFuZ2VXaXRoT3B0aW9ucykgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIGV4dGVuc2lvbnMgMiwgMTUsIDkgdG8gMTEsIDEwMCB0byBtYXgsIDMgWyhpKSA9IDVdO1xuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IgorICAgICAgIiAgICBzdGFydDoyIgorICAgICAgIiAgICBlbmQ6MyIKKyAgICAgICIgICAgb3B0aW9ucyB7IgorICAgICAgIiAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsiCisgICAgICAiICAgICAgICBuYW1lIHsiCisgICAgICAiICAgICAgICAgIG5hbWVfcGFydDogXCJpXCIiCisgICAgICAiICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSIKKyAgICAgICIgICAgICAgIH0iCisgICAgICAiICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDUiCisgICAgICAiICAgICAgfSIKKyAgICAgICIgICAgfSIKKyAgICAgICIgIH0iCisgICAgICAiICBleHRlbnNpb25fcmFuZ2UgeyIKKyAgICAgICIgICAgc3RhcnQ6MTUiCisgICAgICAiICAgIGVuZDoxNiIKKyAgICAgICIgICAgb3B0aW9ucyB7IgorICAgICAgIiAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsiCisgICAgICAiICAgICAgICBuYW1lIHsiCisgICAgICAiICAgICAgICAgIG5hbWVfcGFydDogXCJpXCIiCisgICAgICAiICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSIKKyAgICAgICIgICAgICAgIH0iCisgICAgICAiICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDUiCisgICAgICAiICAgICAgfSIKKyAgICAgICIgICAgfSIKKyAgICAgICIgIH0iCisgICAgICAiICBleHRlbnNpb25fcmFuZ2UgeyIKKyAgICAgICIgICAgc3RhcnQ6OSIKKyAgICAgICIgICAgZW5kOjEyIgorICAgICAgIiAgICBvcHRpb25zIHsiCisgICAgICAiICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyIKKyAgICAgICIgICAgICAgIG5hbWUgeyIKKyAgICAgICIgICAgICAgICAgbmFtZV9wYXJ0OiBcImlcIiIKKyAgICAgICIgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIgorICAgICAgIiAgICAgICAgfSIKKyAgICAgICIgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogNSIKKyAgICAgICIgICAgICB9IgorICAgICAgIiAgICB9IgorICAgICAgIiAgfSIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IgorICAgICAgIiAgICBzdGFydDoxMDAiCisgICAgICAiICAgIGVuZDo1MzY4NzA5MTIiCisgICAgICAiICAgIG9wdGlvbnMgeyIKKyAgICAgICIgICAgICB1bmludGVycHJldGVkX29wdGlvbiB7IgorICAgICAgIiAgICAgICAgbmFtZSB7IgorICAgICAgIiAgICAgICAgICBuYW1lX3BhcnQ6IFwiaVwiIgorICAgICAgIiAgICAgICAgICBpc19leHRlbnNpb246IHRydWUiCisgICAgICAiICAgICAgICB9IgorICAgICAgIiAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiA1IgorICAgICAgIiAgICAgIH0iCisgICAgICAiICAgIH0iCisgICAgICAiICB9IgorICAgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsiCisgICAgICAiICAgIHN0YXJ0OjMiCisgICAgICAiICAgIGVuZDo0IgorICAgICAgIiAgICBvcHRpb25zIHsiCisgICAgICAiICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyIKKyAgICAgICIgICAgICAgIG5hbWUgeyIKKyAgICAgICIgICAgICAgICAgbmFtZV9wYXJ0OiBcImlcIiIKKyAgICAgICIgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIgorICAgICAgIiAgICAgICAgfSIKKyAgICAgICIgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogNSIKKyAgICAgICIgICAgICB9IgorICAgICAgIiAgICB9IgorICAgICAgIiAgfSIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBMYXJnZXJNYXhGb3JNZXNzYWdlU2V0V2lyZUZvcm1hdE1lc3NhZ2VzKSB7CisgIC8vIE1lc3NhZ2VzIHVzaW5nIHRoZSBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCBvcHRpb24gY2FuIGFjY2VwdCBsYXJnZXIKKyAgLy8gZXh0ZW5zaW9uIG51bWJlcnMsIGFzIHRoZSBudW1iZXJzIGFyZSBub3QgZW5jb2RlZCBhcyBpbnQzMiBmaWVsZCB2YWx1ZXMKKyAgLy8gcmF0aGVyIHRoYW4gdGFncy4KKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBleHRlbnNpb25zIDQgdG8gbWF4O1xuIgorICAgICAgIiAgb3B0aW9uIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gdHJ1ZTtcbiIKKyAgICAgICJ9XG4iLAorCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgICAiICAgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjQgZW5kOiAweDdmZmZmZmZmIH0iCisgICAgICAiICBvcHRpb25zIHtcbiIKKyAgICAgICIgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyBcbiIKKyAgICAgICIgICAgICBuYW1lIHtcbiIKKyAgICAgICIgICAgICAgIG5hbWVfcGFydDogXCJtZXNzYWdlX3NldF93aXJlX2Zvcm1hdFwiXG4iCisgICAgICAiICAgICAgICBpc19leHRlbnNpb246IGZhbHNlXG4iCisgICAgICAiICAgICAgfVxuIgorICAgICAgIiAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwidHJ1ZVwiXG4iCisgICAgICAiICAgIH1cbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBFeHRlbnNpb25zKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICAgImV4dGVuZCBFeHRlbmRlZTEgeyBvcHRpb25hbCBpbnQzMiBmb28gPSAxMjsgfVxuIgorICAgICAgImV4dGVuZCBFeHRlbmRlZTIgeyByZXBlYXRlZCBUZXN0TWVzc2FnZSBiYXIgPSAyMjsgfVxuIiwKKworICAgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEyIgorICAgICAgIiAgICAgICAgICAgIGV4dGVuZGVlOiBcIkV4dGVuZGVlMVwiIH0gIgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJiYXJcIiBsYWJlbDpMQUJFTF9SRVBFQVRFRCBudW1iZXI6MjIiCisgICAgICAiICAgICAgICAgICAgdHlwZV9uYW1lOlwiVGVzdE1lc3NhZ2VcIiBleHRlbmRlZTogXCJFeHRlbmRlZTJcIiB9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBFeHRlbnNpb25zSW5NZXNzYWdlU2NvcGUpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBleHRlbmQgRXh0ZW5kZWUxIHsgb3B0aW9uYWwgaW50MzIgZm9vID0gMTI7IH1cbiIKKyAgICAgICIgIGV4dGVuZCBFeHRlbmRlZTIgeyByZXBlYXRlZCBUZXN0TWVzc2FnZSBiYXIgPSAyMjsgfVxuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIGV4dGVuc2lvbiB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIm51bWJlcjoxMiIKKyAgICAgICIgICAgICAgICAgICAgIGV4dGVuZGVlOiBcIkV4dGVuZGVlMVwiIH0iCisgICAgICAiICBleHRlbnNpb24geyBuYW1lOlwiYmFyXCIgbGFiZWw6TEFCRUxfUkVQRUFURUQgbnVtYmVyOjIyIgorICAgICAgIiAgICAgICAgICAgICAgdHlwZV9uYW1lOlwiVGVzdE1lc3NhZ2VcIiBleHRlbmRlZTogXCJFeHRlbmRlZTJcIiB9IgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIE11bHRpcGxlRXh0ZW5zaW9uc09uZUV4dGVuZGVlKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICAgImV4dGVuZCBFeHRlbmRlZTEge1xuIgorICAgICAgIiAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTI7XG4iCisgICAgICAiICByZXBlYXRlZCBUZXN0TWVzc2FnZSBiYXIgPSAyMjtcbiIKKyAgICAgICJ9XG4iLAorCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MTIiCisgICAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiRXh0ZW5kZWUxXCIgfSAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImJhclwiIGxhYmVsOkxBQkVMX1JFUEVBVEVEIG51bWJlcjoyMiIKKyAgICAgICIgICAgICAgICAgICB0eXBlX25hbWU6XCJUZXN0TWVzc2FnZVwiIGV4dGVuZGVlOiBcIkV4dGVuZGVlMVwiIH0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIE9wdGlvbmFsTGFiZWxQcm90bzMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAic3ludGF4ID0gXCJwcm90bzNcIjtcbiIKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIGludDMyIGZvbyA9IDE7XG4iCisgICAgICAifVxuIiwKKworICAgICAgInN5bnRheDogXCJwcm90bzNcIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgfSAiCisgICAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgRXhwbGljaXRPcHRpb25hbExhYmVsUHJvdG8zKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICAgInN5bnRheCA9ICdwcm90bzMnO1xuIgorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTtcbiIKKyAgICAgICJ9XG4iLAorCisgICAgICAic3ludGF4OiBcInByb3RvM1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MSAiCisgICAgICAiICAgICAgICAgIHByb3RvM19vcHRpb25hbDogdHJ1ZSBvbmVvZl9pbmRleDogMCB9ICIKKyAgICAgICIgIG9uZW9mX2RlY2wgeyBuYW1lOlwiX2Zvb1wiIH0gIgorICAgICAgIn0iKTsKKworICAvLyBIYW5kbGUgY29sbGlzaW9ucyBpbiB0aGUgc3ludGhldGljIG9uZW9mIG5hbWUuCisgIEV4cGVjdFBhcnNlc1RvKAorICAgICAgInN5bnRheCA9ICdwcm90bzMnO1xuIgorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTtcbiIKKyAgICAgICIgIG9uZW9mIF9mb28ge1xuIgorICAgICAgIiAgICBpbnQzMiBfX2ZvbyA9IDI7XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIiwKKworICAgICAgInN5bnRheDogXCJwcm90bzNcIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgIgorICAgICAgIiAgICAgICAgICBwcm90bzNfb3B0aW9uYWw6IHRydWUgb25lb2ZfaW5kZXg6IDEgfSAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJfX2Zvb1wiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MiAiCisgICAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OiAwIH0gIgorICAgICAgIiAgb25lb2ZfZGVjbCB7IG5hbWU6XCJfZm9vXCIgfSAiCisgICAgICAiICBvbmVvZl9kZWNsIHsgbmFtZTpcIlhfZm9vXCIgfSAiCisgICAgICAifSIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3R5cGVkZWYgUGFyc2VyVGVzdCBQYXJzZUVudW1UZXN0OworCitURVNUX0YoUGFyc2VFbnVtVGVzdCwgU2ltcGxlRW51bSkgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAgICJlbnVtIFRlc3RFbnVtIHtcbiIKKyAgICAgICIgIEZPTyA9IDA7XG4iCisgICAgICAifVxuIiwKKworICAgICAgImVudW1fdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0RW51bVwiIgorICAgICAgIiAgdmFsdWUgeyBuYW1lOlwiRk9PXCIgbnVtYmVyOjAgfSIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZUVudW1UZXN0LCBWYWx1ZXMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAiZW51bSBUZXN0RW51bSB7XG4iCisgICAgICAiICBGT08gPSAxMztcbiIKKyAgICAgICIgIEJBUiA9IC0xMDtcbiIKKyAgICAgICIgIEJBWiA9IDUwMDtcbiIKKyAgICAgICIgIEhFWF9NQVggPSAweDdGRkZGRkZGO1xuIgorICAgICAgIiAgSEVYX01JTiA9IC0weDgwMDAwMDAwO1xuIgorICAgICAgIiAgSU5UX01BWCA9IDIxNDc0ODM2NDc7XG4iCisgICAgICAiICBJTlRfTUlOID0gLTIxNDc0ODM2NDg7XG4iCisgICAgICAifVxuIiwKKworICAgICAgImVudW1fdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0RW51bVwiIgorICAgICAgIiAgdmFsdWUgeyBuYW1lOlwiRk9PXCIgbnVtYmVyOjEzIH0iCisgICAgICAiICB2YWx1ZSB7IG5hbWU6XCJCQVJcIiBudW1iZXI6LTEwIH0iCisgICAgICAiICB2YWx1ZSB7IG5hbWU6XCJCQVpcIiBudW1iZXI6NTAwIH0iCisgICAgICAiICB2YWx1ZSB7IG5hbWU6XCJIRVhfTUFYXCIgbnVtYmVyOjIxNDc0ODM2NDcgfSIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTpcIkhFWF9NSU5cIiBudW1iZXI6LTIxNDc0ODM2NDggfSIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTpcIklOVF9NQVhcIiBudW1iZXI6MjE0NzQ4MzY0NyB9IgorICAgICAgIiAgdmFsdWUgeyBuYW1lOlwiSU5UX01JTlwiIG51bWJlcjotMjE0NzQ4MzY0OCB9IgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlRW51bVRlc3QsIFZhbHVlT3B0aW9ucykgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAgICJlbnVtIFRlc3RFbnVtIHtcbiIKKyAgICAgICIgIEZPTyA9IDEzO1xuIgorICAgICAgIiAgQkFSID0gLTEwIFsgKHNvbWV0aGluZy50ZXh0KSA9ICdhYmMnIF07XG4iCisgICAgICAiICBCQVogPSA1MDAgWyAoc29tZXRoaW5nLnRleHQpID0gJ2RlZicsIG90aGVyID0gMSBdO1xuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJlbnVtX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdEVudW1cIiIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTogXCJGT09cIiBudW1iZXI6IDEzIH0iCisgICAgICAiICB2YWx1ZSB7IG5hbWU6IFwiQkFSXCIgbnVtYmVyOiAtMTAgIgorICAgICAgIiAgICBvcHRpb25zIHsgIgorICAgICAgIiAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICAgIiAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJzb21ldGhpbmcudGV4dFwiIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAgICIgICAgICAgIHN0cmluZ192YWx1ZTogXCJhYmNcIiAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgIH0gIgorICAgICAgIiAgfSAiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6IFwiQkFaXCIgbnVtYmVyOiA1MDAgIgorICAgICAgIiAgICBvcHRpb25zIHsgIgorICAgICAgIiAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICAgIiAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJzb21ldGhpbmcudGV4dFwiIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAgICIgICAgICAgIHN0cmluZ192YWx1ZTogXCJkZWZcIiAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgICAiICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcIm90aGVyXCIgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9ICIKKyAgICAgICIgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMSAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgIH0gIgorICAgICAgIiAgfSAiCisgICAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VFbnVtVGVzdCwgUmVzZXJ2ZWRSYW5nZSkgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAgICJlbnVtIFRlc3RFbnVtIHtcbiIKKyAgICAgICIgIEZPTyA9IDA7XG4iCisgICAgICAiICByZXNlcnZlZCAtMjE0NzQ4MzY0OCwgLTYgdG8gLTQsIC0xIHRvIDEsIDIsIDE1LCA5IHRvIDExLCAzLCAyMCB0byAiCisgICAgICAibWF4O1xuIgorICAgICAgIn1cbiIsCisKKyAgICAgICJlbnVtX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdEVudW1cIiIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTpcIkZPT1wiIG51bWJlcjowIH0iCisgICAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0Oi0yMTQ3NDgzNjQ4ICBlbmQ6LTIxNDc0ODM2NDggfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6LTYgICAgICAgICAgIGVuZDotNCAgICAgICAgICB9IgorICAgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDotMSAgICAgICAgICAgZW5kOjEgICAgICAgICAgIH0iCisgICAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0OjIgICAgICAgICAgICBlbmQ6MiAgICAgICAgICAgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6MTUgICAgICAgICAgIGVuZDoxNSAgICAgICAgICB9IgorICAgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDo5ICAgICAgICAgICAgZW5kOjExICAgICAgICAgIH0iCisgICAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0OjMgICAgICAgICAgICBlbmQ6MyAgICAgICAgICAgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6MjAgICAgICAgICAgIGVuZDoyMTQ3NDgzNjQ3ICB9IgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlRW51bVRlc3QsIFJlc2VydmVkTmFtZXMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAiZW51bSBUZXN0RW51bSB7XG4iCisgICAgICAiICBGT08gPSAwO1xuIgorICAgICAgIiAgcmVzZXJ2ZWQgXCJmb29cIiwgXCJiYXJcIjtcbiIKKyAgICAgICJ9XG4iLAorCisgICAgICAiZW51bV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIlRlc3RFbnVtXCIiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6XCJGT09cIiBudW1iZXI6MCB9IgorICAgICAgIiAgcmVzZXJ2ZWRfbmFtZTogXCJmb29cIiIKKyAgICAgICIgIHJlc2VydmVkX25hbWU6IFwiYmFyXCIiCisgICAgICAifSIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3R5cGVkZWYgUGFyc2VyVGVzdCBQYXJzZVNlcnZpY2VUZXN0OworCitURVNUX0YoUGFyc2VTZXJ2aWNlVGVzdCwgU2ltcGxlU2VydmljZSkgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAgICJzZXJ2aWNlIFRlc3RTZXJ2aWNlIHtcbiIKKyAgICAgICIgIHJwYyBGb28oSW4pIHJldHVybnMgKE91dCk7XG4iCisgICAgICAifVxuIiwKKworICAgICAgInNlcnZpY2UgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdFNlcnZpY2VcIiIKKyAgICAgICIgIG1ldGhvZCB7IG5hbWU6XCJGb29cIiBpbnB1dF90eXBlOlwiSW5cIiBvdXRwdXRfdHlwZTpcIk91dFwiIH0iCisgICAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VTZXJ2aWNlVGVzdCwgTWV0aG9kc0FuZFN0cmVhbXMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAic2VydmljZSBUZXN0U2VydmljZSB7XG4iCisgICAgICAiICBycGMgRm9vKEluMSkgcmV0dXJucyAoT3V0MSk7XG4iCisgICAgICAiICBycGMgQmFyKEluMikgcmV0dXJucyAoT3V0Mik7XG4iCisgICAgICAiICBycGMgQmF6KEluMykgcmV0dXJucyAoT3V0Myk7XG4iCisgICAgICAifVxuIiwKKworICAgICAgInNlcnZpY2UgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdFNlcnZpY2VcIiIKKyAgICAgICIgIG1ldGhvZCB7IG5hbWU6XCJGb29cIiBpbnB1dF90eXBlOlwiSW4xXCIgb3V0cHV0X3R5cGU6XCJPdXQxXCIgfSIKKyAgICAgICIgIG1ldGhvZCB7IG5hbWU6XCJCYXJcIiBpbnB1dF90eXBlOlwiSW4yXCIgb3V0cHV0X3R5cGU6XCJPdXQyXCIgfSIKKyAgICAgICIgIG1ldGhvZCB7IG5hbWU6XCJCYXpcIiBpbnB1dF90eXBlOlwiSW4zXCIgb3V0cHV0X3R5cGU6XCJPdXQzXCIgfSIKKyAgICAgICJ9Iik7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gaW1wb3J0cyBhbmQgcGFja2FnZXMKKwordHlwZWRlZiBQYXJzZXJUZXN0IFBhcnNlTWlzY1Rlc3Q7CisKK1RFU1RfRihQYXJzZU1pc2NUZXN0LCBQYXJzZUltcG9ydCkgeworICBFeHBlY3RQYXJzZXNUbygiaW1wb3J0IFwiZm9vL2Jhci9iYXoucHJvdG9cIjtcbiIsCisgICAgICAgICAgICAgICAgICJkZXBlbmRlbmN5OiBcImZvby9iYXIvYmF6LnByb3RvXCIiKTsKK30KKworVEVTVF9GKFBhcnNlTWlzY1Rlc3QsIFBhcnNlTXVsdGlwbGVJbXBvcnRzKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICAgImltcG9ydCBcImJhci5wcm90b1wiO1xuIgorICAgICAgImltcG9ydCBcImJhei5wcm90b1wiO1xuIiwKKyAgICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiIgorICAgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIiCisgICAgICAiZGVwZW5kZW5jeTogXCJiYXoucHJvdG9cIiIpOworfQorCitURVNUX0YoUGFyc2VNaXNjVGVzdCwgUGFyc2VQdWJsaWNJbXBvcnRzKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICAgImltcG9ydCBwdWJsaWMgXCJiYXIucHJvdG9cIjtcbiIKKyAgICAgICJpbXBvcnQgXCJiYXoucHJvdG9cIjtcbiIKKyAgICAgICJpbXBvcnQgcHVibGljIFwicXV4LnByb3RvXCI7XG4iLAorICAgICAgImRlcGVuZGVuY3k6IFwiZm9vLnByb3RvXCIiCisgICAgICAiZGVwZW5kZW5jeTogXCJiYXIucHJvdG9cIiIKKyAgICAgICJkZXBlbmRlbmN5OiBcImJhei5wcm90b1wiIgorICAgICAgImRlcGVuZGVuY3k6IFwicXV4LnByb3RvXCIiCisgICAgICAicHVibGljX2RlcGVuZGVuY3k6IDEgIgorICAgICAgInB1YmxpY19kZXBlbmRlbmN5OiAzICIpOworfQorCitURVNUX0YoUGFyc2VNaXNjVGVzdCwgUGFyc2VQYWNrYWdlKSB7CisgIEV4cGVjdFBhcnNlc1RvKCJwYWNrYWdlIGZvby5iYXIuYmF6O1xuIiwgInBhY2thZ2U6IFwiZm9vLmJhci5iYXpcIiIpOworfQorCitURVNUX0YoUGFyc2VNaXNjVGVzdCwgUGFyc2VQYWNrYWdlV2l0aFNwYWNlcykgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAgICJwYWNrYWdlIGZvbyAgIC4gICBiYXIuICBcbiIKKyAgICAgICIgIGJhejtcbiIsCisgICAgICAicGFja2FnZTogXCJmb28uYmFyLmJhelwiIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIG9wdGlvbnMKKworVEVTVF9GKFBhcnNlTWlzY1Rlc3QsIFBhcnNlRmlsZU9wdGlvbnMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgICAib3B0aW9uIGphdmFfcGFja2FnZSA9IFwiY29tLmdvb2dsZS5mb29cIjtcbiIKKyAgICAgICJvcHRpb24gb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFOyIsCisKKyAgICAgICJvcHRpb25zIHsiCisgICAgICAidW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImphdmFfcGFja2FnZVwiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdmFsdWU6IFwiY29tLmdvb2dsZS5mb29cIn0gIgorICAgICAgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJvcHRpbWl6ZV9mb3JcIiAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9IgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJDT0RFX1NJWkVcIiB9ICIKKyAgICAgICJ9Iik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEVycm9yIHRlc3RzCisvLworLy8gVGhlcmUgYXJlIGEgdmVyeSBsYXJnZSBudW1iZXIgb2YgcG9zc2libGUgZXJyb3JzIHRoYXQgdGhlIHBhcnNlciBjb3VsZAorLy8gcmVwb3J0LCBzbyBpdCdzIGluZmVhc2libGUgdG8gdGVzdCBldmVyeSBzaW5nbGUgb25lIG9mIHRoZW0uICBJbnN0ZWFkLAorLy8gd2UgdGVzdCBlYWNoIHVuaXF1ZSBjYWxsIHRvIEFkZEVycm9yKCkgaW4gcGFyc2VyLmguICBUaGlzIGRvZXMgbm90IG1lYW4KKy8vIHdlIGFyZSB0ZXN0aW5nIGV2ZXJ5IHBvc3NpYmxlIGVycm9yIHRoYXQgUGFyc2VyIGNhbiBnZW5lcmF0ZSBiZWNhdXNlCisvLyBlYWNoIHZhcmlhbnQgb2YgdGhlIENvbnN1bWUoKSBoZWxwZXIgb25seSBjb3VudHMgYXMgb25lIHVuaXF1ZSBjYWxsIHRvCisvLyBBZGRFcnJvcigpLgorCit0eXBlZGVmIFBhcnNlclRlc3QgUGFyc2VFcnJvclRlc3Q7CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTWlzc2luZ1N5bnRheElkZW50aWZpZXIpIHsKKyAgcmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl8gPSB0cnVlOworICBFeHBlY3RIYXNFYXJseUV4aXRFcnJvcnMoIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIjA6MDogRmlsZSBtdXN0IGJlZ2luIHdpdGggYSBzeW50YXggc3RhdGVtZW50LCBlLmcuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICInc3ludGF4ID0gXCJwcm90bzJcIjsnLlxuIik7CisgIEVYUEVDVF9FUSgiIiwgcGFyc2VyXy0+R2V0U3ludGF4SWRlbnRpZmllcigpKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBVbmtub3duU3ludGF4SWRlbnRpZmllcikgeworICBFeHBlY3RIYXNFYXJseUV4aXRFcnJvcnMoCisgICAgICAic3ludGF4ID0gXCJub19zdWNoX3N5bnRheFwiOyIsCisgICAgICAiMDo5OiBVbnJlY29nbml6ZWQgc3ludGF4IGlkZW50aWZpZXIgXCJub19zdWNoX3N5bnRheFwiLiAgVGhpcyBwYXJzZXIgIgorICAgICAgIm9ubHkgcmVjb2duaXplcyBcInByb3RvMlwiIGFuZCBcInByb3RvM1wiLlxuIik7CisgIEVYUEVDVF9FUSgibm9fc3VjaF9zeW50YXgiLCBwYXJzZXJfLT5HZXRTeW50YXhJZGVudGlmaWVyKCkpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIFNpbXBsZVN5bnRheEVycm9yKSB7CisgIEV4cGVjdEhhc0Vycm9ycygibWVzc2FnZSBUZXN0TWVzc2FnZSBAIyQgeyBibGFoIH0iLAorICAgICAgICAgICAgICAgICAgIjA6MjA6IEV4cGVjdGVkIFwie1wiLlxuIik7CisgIEVYUEVDVF9FUSgicHJvdG8yIiwgcGFyc2VyXy0+R2V0U3ludGF4SWRlbnRpZmllcigpKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFeHBlY3RlZFRvcExldmVsKSB7CisgIEV4cGVjdEhhc0Vycm9ycygiYmxhaDsiLAorICAgICAgICAgICAgICAgICAgIjA6MDogRXhwZWN0ZWQgdG9wLWxldmVsIHN0YXRlbWVudCAoZS5nLiBcIm1lc3NhZ2VcIikuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBVbm1hdGNoZWRDbG9zZUJyYWNlKSB7CisgIC8vIFRoaXMgdXNlZCB0byBjYXVzZSBhbiBpbmZpbml0ZSBsb29wLiAgRG9oLgorICBFeHBlY3RIYXNFcnJvcnMoIn0iLAorICAgICAgICAgICAgICAgICAgIjA6MDogRXhwZWN0ZWQgdG9wLWxldmVsIHN0YXRlbWVudCAoZS5nLiBcIm1lc3NhZ2VcIikuXG4iCisgICAgICAgICAgICAgICAgICAiMDowOiBVbm1hdGNoZWQgXCJ9XCIuXG4iKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWVzc2FnZSBlcnJvcnMKKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBNZXNzYWdlTWlzc2luZ05hbWUpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKCJtZXNzYWdlIHt9IiwgIjA6ODogRXhwZWN0ZWQgbWVzc2FnZSBuYW1lLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTWVzc2FnZU1pc3NpbmdCb2R5KSB7CisgIEV4cGVjdEhhc0Vycm9ycygibWVzc2FnZSBUZXN0TWVzc2FnZTsiLCAiMDoxOTogRXhwZWN0ZWQgXCJ7XCIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFb2ZJbk1lc3NhZ2UpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2UgeyIsCisgICAgICAiMDoyMTogUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gbWVzc2FnZSBkZWZpbml0aW9uIChtaXNzaW5nICd9JykuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBNaXNzaW5nRmllbGROdW1iZXIpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgb3B0aW9uYWwgaW50MzIgZm9vO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiMToyMDogTWlzc2luZyBmaWVsZCBudW1iZXIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFeHBlY3RlZEZpZWxkTnVtYmVyKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIG9wdGlvbmFsIGludDMyIGZvbyA9IDtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjE6MjM6IEV4cGVjdGVkIGZpZWxkIG51bWJlci5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEZpZWxkTnVtYmVyT3V0T2ZSYW5nZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBvcHRpb25hbCBpbnQzMiBmb28gPSAweDEwMDAwMDAwMDtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjE6MjM6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTWlzc2luZ0xhYmVsKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIGludDMyIGZvbyA9IDE7XG4iCisgICAgICAifVxuIiwKKyAgICAgICIxOjI6IEV4cGVjdGVkIFwicmVxdWlyZWRcIiwgXCJvcHRpb25hbFwiLCBvciBcInJlcGVhdGVkXCIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFeHBlY3RlZE9wdGlvbk5hbWUpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgb3B0aW9uYWwgdWludDMyIGZvbyA9IDEgW107XG4iCisgICAgICAifVxuIiwKKyAgICAgICIxOjI3OiBFeHBlY3RlZCBpZGVudGlmaWVyLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTm9uRXh0ZW5zaW9uT3B0aW9uTmFtZUJlZ2lubmluZ1dpdGhEb3QpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgb3B0aW9uYWwgdWludDMyIGZvbyA9IDEgWy5mb289MV07XG4iCisgICAgICAifVxuIiwKKyAgICAgICIxOjI3OiBFeHBlY3RlZCBpZGVudGlmaWVyLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRGVmYXVsdFZhbHVlVHlwZU1pc21hdGNoKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIG9wdGlvbmFsIHVpbnQzMiBmb28gPSAxIFtkZWZhdWx0PXRydWVdO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiMTozNTogRXhwZWN0ZWQgaW50ZWdlciBmb3IgZmllbGQgZGVmYXVsdCB2YWx1ZS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIERlZmF1bHRWYWx1ZU5vdEJvb2xlYW4pIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgb3B0aW9uYWwgYm9vbCBmb28gPSAxIFtkZWZhdWx0PWJsYWhdO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiMTozMzogRXhwZWN0ZWQgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRGVmYXVsdFZhbHVlTm90U3RyaW5nKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxIFtkZWZhdWx0PTFdO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiMTozNTogRXhwZWN0ZWQgc3RyaW5nIGZvciBmaWVsZCBkZWZhdWx0IHZhbHVlLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRGVmYXVsdFZhbHVlVW5zaWduZWROZWdhdGl2ZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD0tMV07XG4iCisgICAgICAifVxuIiwKKyAgICAgICIxOjM2OiBVbnNpZ25lZCBmaWVsZCBjYW4ndCBoYXZlIG5lZ2F0aXZlIGRlZmF1bHQgdmFsdWUuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBEZWZhdWx0VmFsdWVUb29MYXJnZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBvcHRpb25hbCBpbnQzMiAgZm9vID0gMSBbZGVmYXVsdD0gMHg4MDAwMDAwMF07XG4iCisgICAgICAiICBvcHRpb25hbCBpbnQzMiAgZm9vID0gMSBbZGVmYXVsdD0tMHg4MDAwMDAwMV07XG4iCisgICAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD0gMHgxMDAwMDAwMDBdO1xuIgorICAgICAgIiAgb3B0aW9uYWwgaW50NjQgIGZvbyA9IDEgW2RlZmF1bHQ9IDB4ODAwMDAwMDAwMDAwMDAwMDBdO1xuIgorICAgICAgIiAgb3B0aW9uYWwgaW50NjQgIGZvbyA9IDEgW2RlZmF1bHQ9LTB4ODAwMDAwMDAwMDAwMDAwMDFdO1xuIgorICAgICAgIiAgb3B0aW9uYWwgdWludDY0IGZvbyA9IDEgW2RlZmF1bHQ9IDB4MTAwMDAwMDAwMDAwMDAwMDAwXTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjE6MzY6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgorICAgICAgIjI6MzY6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgorICAgICAgIjM6MzY6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgorICAgICAgIjQ6MzY6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgorICAgICAgIjU6MzY6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgorICAgICAgIjY6MzY6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgSnNvbk5hbWVOb3RTdHJpbmcpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDEgW2pzb25fbmFtZT0xXTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjE6Mzc6IEV4cGVjdGVkIHN0cmluZyBmb3IgSlNPTiBuYW1lLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRHVwbGljYXRlSnNvbk5hbWUpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgb3B0aW9uYWwgdWludDMyIGZvbyA9IDEgW2pzb25fbmFtZT1cImFcIixqc29uX25hbWU9XCJiXCJdO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiMTo0MTogQWxyZWFkeSBzZXQgb3B0aW9uIFwianNvbl9uYW1lXCIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFbnVtVmFsdWVPdXRPZlJhbmdlKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJlbnVtIFRlc3RFbnVtIHtcbiIKKyAgICAgICIgIEhFWF9UT09fQklHICAgPSAgMHg4MDAwMDAwMDtcbiIKKyAgICAgICIgIEhFWF9UT09fU01BTEwgPSAtMHg4MDAwMDAwMTtcbiIKKyAgICAgICIgIElOVF9UT09fQklHICAgPSAgMjE0NzQ4MzY0ODtcbiIKKyAgICAgICIgIElOVF9UT09fU01BTEwgPSAtMjE0NzQ4MzY0OTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjE6MTk6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgorICAgICAgIjI6MTk6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgorICAgICAgIjM6MTk6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgorICAgICAgIjQ6MTk6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRW51bUFsbG93QWxpYXNGYWxzZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAiZW51bSBGb28ge1xuIgorICAgICAgIiAgb3B0aW9uIGFsbG93X2FsaWFzID0gZmFsc2U7XG4iCisgICAgICAiICBCQVIgPSAxO1xuIgorICAgICAgIiAgQkFaID0gMjtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjU6MDogXCJGb29cIiBkZWNsYXJlcyAnb3B0aW9uIGFsbG93X2FsaWFzID0gZmFsc2U7JyB3aGljaCBoYXMgbm8gIgorICAgICAgImVmZmVjdC4gIgorICAgICAgIlBsZWFzZSByZW1vdmUgdGhlIGRlY2xhcmF0aW9uLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgVW5uZWNlc3NhcnlFbnVtQWxsb3dBbGlhcykgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAiZW51bSBGb28ge1xuIgorICAgICAgIiAgb3B0aW9uIGFsbG93X2FsaWFzID0gdHJ1ZTtcbiIKKyAgICAgICIgIEJBUiA9IDE7XG4iCisgICAgICAiICBCQVogPSAyO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiNTowOiBcIkZvb1wiIGRlY2xhcmVzIHN1cHBvcnQgZm9yIGVudW0gYWxpYXNlcyBidXQgbm8gZW51bSB2YWx1ZXMgc2hhcmUgIgorICAgICAgImZpZWxkIG51bWJlcnMuIFBsZWFzZSByZW1vdmUgdGhlIHVubmVjZXNzYXJ5ICdvcHRpb24gYWxsb3dfYWxpYXMgPSAiCisgICAgICAidHJ1ZTsnICIKKyAgICAgICJkZWNsYXJhdGlvbi5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIERlZmF1bHRWYWx1ZU1pc3NpbmcpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgb3B0aW9uYWwgdWludDMyIGZvbyA9IDEgW2RlZmF1bHQ9XTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjE6MzU6IEV4cGVjdGVkIGludGVnZXIgZm9yIGZpZWxkIGRlZmF1bHQgdmFsdWUuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBEZWZhdWx0VmFsdWVGb3JHcm91cCkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBvcHRpb25hbCBncm91cCBGb28gPSAxIFtkZWZhdWx0PWJsYWhdIHt9XG4iCisgICAgICAifVxuIiwKKyAgICAgICIxOjM0OiBNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHQgdmFsdWVzLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRHVwbGljYXRlRGVmYXVsdFZhbHVlKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIG9wdGlvbmFsIHVpbnQzMiBmb28gPSAxIFtkZWZhdWx0PTEsZGVmYXVsdD0yXTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjE6Mzc6IEFscmVhZHkgc2V0IG9wdGlvbiBcImRlZmF1bHRcIi5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIE1pc3NpbmdPbmVvZk5hbWUpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgb25lb2Yge1xuIgorICAgICAgIiAgICBpbnQzMiBiYXIgPSAxO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIsCisgICAgICAiMTo4OiBFeHBlY3RlZCBvbmVvZiBuYW1lLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTGFiZWxJbk9uZW9mKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIG9uZW9mIGZvbyB7XG4iCisgICAgICAiICAgIG9wdGlvbmFsIGludDMyIGJhciA9IDE7XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIiwKKyAgICAgICIyOjQ6IEZpZWxkcyBpbiBvbmVvZnMgbXVzdCBub3QgaGF2ZSBsYWJlbHMgKHJlcXVpcmVkIC8gb3B0aW9uYWwgIgorICAgICAgIi8gcmVwZWF0ZWQpLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTWFwSW5PbmVvZikgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBvbmVvZiBmb28ge1xuIgorICAgICAgIiAgICBtYXA8aW50MzIsIGludDMyPiBmb29fbWFwID0gMTtcbiIKKyAgICAgICIgICAgbWFwIG1lc3NhZ2VfZmllbGQgPSAyO1xuIiAgLy8gYSBub3JtYWwgbWVzc2FnZSBmaWVsZCBpcyBPSworICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIsCisgICAgICAiMjo3OiBNYXAgZmllbGRzIGFyZSBub3QgYWxsb3dlZCBpbiBvbmVvZnMuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBMYWJlbEZvck1hcCkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBvcHRpb25hbCBtYXA8aW50MzIsIGludDMyPiBpbnRfbWFwID0gMTtcbiIKKyAgICAgICIgIHJlcXVpcmVkIG1hcDxpbnQzMiwgaW50MzI+IGludF9tYXAyID0gMjtcbiIKKyAgICAgICIgIHJlcGVhdGVkIG1hcDxpbnQzMiwgaW50MzI+IGludF9tYXAzID0gMztcbiIKKyAgICAgICIgIG9wdGlvbmFsIG1hcCBtYXBfbWVzc2FnZSA9IDQ7XG4iICAvLyBhIG5vcm1hbCBtZXNzYWdlIGZpZWxkIGlzIE9LCisgICAgICAifVxuIiwKKyAgICAgICIxOjE0OiBGaWVsZCBsYWJlbHMgKHJlcXVpcmVkL29wdGlvbmFsL3JlcGVhdGVkKSBhcmUgbm90IGFsbG93ZWQgb24gbWFwICIKKyAgICAgICJmaWVsZHMuXG4iCisgICAgICAiMjoxNDogRmllbGQgbGFiZWxzIChyZXF1aXJlZC9vcHRpb25hbC9yZXBlYXRlZCkgYXJlIG5vdCBhbGxvd2VkIG9uIG1hcCAiCisgICAgICAiZmllbGRzLlxuIgorICAgICAgIjM6MTQ6IEZpZWxkIGxhYmVscyAocmVxdWlyZWQvb3B0aW9uYWwvcmVwZWF0ZWQpIGFyZSBub3QgYWxsb3dlZCBvbiBtYXAgIgorICAgICAgImZpZWxkcy5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIE1hbGZvcm1lZE1hcHMpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgbWFwIG1hcF9tZXNzYWdlID0gMTtcbiIgIC8vIGEgbm9ybWFsIG1lc3NhZ2UgZmllbGQgbGFja2luZyBsYWJlbAorICAgICAgIiAgbWFwPHN0cmluZz4gc3RyX21hcCA9IDI7XG4iCisgICAgICAiICBtYXA8c3RyaW5nLD4gc3RyX21hcDIgPSAzO1xuIgorICAgICAgIiAgbWFwPCxzdHJpbmc+IHN0cl9tYXAzID0gNDtcbiIKKyAgICAgICIgIG1hcDw+IGVtcHR5X21hcCA9IDU7XG4iCisgICAgICAiICBtYXA8c3RyaW5nLHN0cmluZyBzdHJfbWFwNiA9IDY7XG4iCisgICAgICAifSIKKyAgICAgICJleHRlbmQgU29tZU1lc3NhZ2Uge1xuIgorICAgICAgIiAgbWFwPGludDMyLCBpbnQzMj4gaW50X21hcCA9IDE7XG4iCisgICAgICAifSIsCisgICAgICAiMTo2OiBFeHBlY3RlZCBcInJlcXVpcmVkXCIsIFwib3B0aW9uYWxcIiwgb3IgXCJyZXBlYXRlZFwiLlxuIgorICAgICAgIjI6MTI6IEV4cGVjdGVkIFwiLFwiLlxuIgorICAgICAgIjM6MTM6IEV4cGVjdGVkIHR5cGUgbmFtZS5cbiIKKyAgICAgICI0OjY6IEV4cGVjdGVkIHR5cGUgbmFtZS5cbiIKKyAgICAgICI1OjY6IEV4cGVjdGVkIHR5cGUgbmFtZS5cbiIKKyAgICAgICI2OjIwOiBFeHBlY3RlZCBcIj5cIi5cbiIKKyAgICAgICI4OjU6IE1hcCBmaWVsZHMgYXJlIG5vdCBhbGxvd2VkIHRvIGJlIGV4dGVuc2lvbnMuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBHcm91cE5vdENhcGl0YWxpemVkKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIG9wdGlvbmFsIGdyb3VwIGZvbyA9IDEge31cbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjE6MTc6IEdyb3VwIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgR3JvdXBNaXNzaW5nQm9keSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBvcHRpb25hbCBncm91cCBGb28gPSAxO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiMToyNDogTWlzc2luZyBncm91cCBib2R5LlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRXh0ZW5kaW5nUHJpbWl0aXZlKSB7CisgIEV4cGVjdEhhc0Vycm9ycygiZXh0ZW5kIGludDMyIHsgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDQ7IH1cbiIsCisgICAgICAgICAgICAgICAgICAiMDo3OiBFeHBlY3RlZCBtZXNzYWdlIHR5cGUuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFcnJvckluRXh0ZW5zaW9uKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJtZXNzYWdlIEZvbyB7IGV4dGVuc2lvbnMgMTAwIHRvIDE5OTsgfVxuIgorICAgICAgImV4dGVuZCBGb28geyBvcHRpb25hbCBzdHJpbmcgZm9vOyB9XG4iLAorICAgICAgIjE6MzI6IE1pc3NpbmcgZmllbGQgbnVtYmVyLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTXVsdGlwbGVQYXJzZUVycm9ycykgeworICAvLyBXaGVuIGEgc3RhdGVtZW50IGhhcyBhIHBhcnNlIGVycm9yLCB0aGUgcGFyc2VyIHNob3VsZCBiZSBhYmxlIHRvIGNvbnRpbnVlCisgIC8vIHBhcnNpbmcgYXQgdGhlIG5leHQgc3RhdGVtZW50LgorICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBvcHRpb25hbCBpbnQzMiBmb287XG4iCisgICAgICAiICAhaW52YWxpZCBzdGF0ZW1lbnQgZW5kaW5nIGluIGEgYmxvY2sgeyBibGFoIGJsYWggeyBibGFoIH0gYmxhaCB9XG4iCisgICAgICAiICBvcHRpb25hbCBpbnQzMiBiYXIgPSAzIHt9XG4iCisgICAgICAifVxuIiwKKyAgICAgICIxOjIwOiBNaXNzaW5nIGZpZWxkIG51bWJlci5cbiIKKyAgICAgICIyOjI6IEV4cGVjdGVkIFwicmVxdWlyZWRcIiwgXCJvcHRpb25hbFwiLCBvciBcInJlcGVhdGVkXCIuXG4iCisgICAgICAiMjoyOiBFeHBlY3RlZCB0eXBlIG5hbWUuXG4iCisgICAgICAiMzoyNTogRXhwZWN0ZWQgXCI7XCIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFb2ZJbkFnZ3JlZ2F0ZVZhbHVlKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJvcHRpb24gKGZpbGVvcHQpID0geyBpOjEwMFxuIiwKKyAgICAgICIxOjA6IFVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSB3aGlsZSBwYXJzaW5nIGFnZ3JlZ2F0ZSB2YWx1ZS5cbiIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnVtIGVycm9ycworCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEVvZkluRW51bSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAiZW51bSBUZXN0RW51bSB7IiwKKyAgICAgICIwOjE1OiBSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBlbnVtIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEVudW1WYWx1ZU1pc3NpbmdOdW1iZXIpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgImVudW0gVGVzdEVudW0ge1xuIgorICAgICAgIiAgRk9PO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiMTo1OiBNaXNzaW5nIG51bWVyaWMgdmFsdWUgZm9yIGVudW0gY29uc3RhbnQuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFbnVtUmVzZXJ2ZWRTdGFuZGFsb25lTWF4Tm90QWxsb3dlZCkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAiZW51bSBUZXN0RW51bSB7XG4iCisgICAgICAiICBGT08gPSAxO1xuIgorICAgICAgIiAgcmVzZXJ2ZWQgbWF4O1xuIgorICAgICAgIn1cbiIsCisgICAgICAiMjoxMTogRXhwZWN0ZWQgZW51bSB2YWx1ZSBvciBudW1iZXIgcmFuZ2UuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFbnVtUmVzZXJ2ZWRNaXhOYW1lQW5kTnVtYmVyKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJlbnVtIFRlc3RFbnVtIHtcbiIKKyAgICAgICIgIEZPTyA9IDE7XG4iCisgICAgICAiICByZXNlcnZlZCAxMCwgXCJmb29cIjtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjI6MTU6IEV4cGVjdGVkIGVudW0gbnVtYmVyIHJhbmdlLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRW51bVJlc2VydmVkUG9zaXRpdmVOdW1iZXJPdXRPZlJhbmdlKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJlbnVtIFRlc3RFbnVtIHtcbiIKKyAgICAgICJGT08gPSAxO1xuIgorICAgICAgIiAgcmVzZXJ2ZWQgMjE0NzQ4MzY0ODtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjI6MTE6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRW51bVJlc2VydmVkTmVnYXRpdmVOdW1iZXJPdXRPZlJhbmdlKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJlbnVtIFRlc3RFbnVtIHtcbiIKKyAgICAgICJGT08gPSAxO1xuIgorICAgICAgIiAgcmVzZXJ2ZWQgLTIxNDc0ODM2NDk7XG4iCisgICAgICAifVxuIiwKKyAgICAgICIyOjEyOiBJbnRlZ2VyIG91dCBvZiByYW5nZS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEVudW1SZXNlcnZlZE1pc3NpbmdRdW90ZXMpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgImVudW0gVGVzdEVudW0ge1xuIgorICAgICAgIiAgRk9PID0gMTtcbiIKKyAgICAgICIgIHJlc2VydmVkIGZvbztcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjI6MTE6IEV4cGVjdGVkIGVudW0gdmFsdWUgb3IgbnVtYmVyIHJhbmdlLlxuIik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJlc2VydmVkIGZpZWxkIG51bWJlciBlcnJvcnMKKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBSZXNlcnZlZFN0YW5kYWxvbmVNYXhOb3RBbGxvd2VkKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgICAiICByZXNlcnZlZCBtYXg7XG4iCisgICAgICAifVxuIiwKKyAgICAgICIxOjExOiBFeHBlY3RlZCBmaWVsZCBuYW1lIG9yIG51bWJlciByYW5nZS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIFJlc2VydmVkTWl4TmFtZUFuZE51bWJlcikgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICAgIiAgcmVzZXJ2ZWQgMTAsIFwiZm9vXCI7XG4iCisgICAgICAifVxuIiwKKyAgICAgICIxOjE1OiBFeHBlY3RlZCBmaWVsZCBudW1iZXIgcmFuZ2UuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBSZXNlcnZlZE1pc3NpbmdRdW90ZXMpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICIgIHJlc2VydmVkIGZvbztcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjE6MTE6IEV4cGVjdGVkIGZpZWxkIG5hbWUgb3IgbnVtYmVyIHJhbmdlLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgUmVzZXJ2ZWROZWdhdGl2ZU51bWJlcikgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICAgIiAgcmVzZXJ2ZWQgLTEwO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiMToxMTogRXhwZWN0ZWQgZmllbGQgbmFtZSBvciBudW1iZXIgcmFuZ2UuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBSZXNlcnZlZE51bWJlck91dE9mUmFuZ2UpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICIgIHJlc2VydmVkIDIxNDc0ODM2NDg7XG4iCisgICAgICAifVxuIiwKKyAgICAgICIxOjExOiBJbnRlZ2VyIG91dCBvZiByYW5nZS5cbiIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTZXJ2aWNlIGVycm9ycworCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEVvZkluU2VydmljZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAic2VydmljZSBUZXN0U2VydmljZSB7IiwKKyAgICAgICIwOjIxOiBSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBzZXJ2aWNlIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIFNlcnZpY2VNZXRob2RQcmltaXRpdmVQYXJhbXMpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgInNlcnZpY2UgVGVzdFNlcnZpY2Uge1xuIgorICAgICAgIiAgcnBjIEZvbyhpbnQzMikgcmV0dXJucyAoc3RyaW5nKTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjE6MTA6IEV4cGVjdGVkIG1lc3NhZ2UgdHlwZS5cbiIKKyAgICAgICIxOjI2OiBFeHBlY3RlZCBtZXNzYWdlIHR5cGUuXG4iKTsKK30KKworCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEVvZkluTWV0aG9kT3B0aW9ucykgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAic2VydmljZSBUZXN0U2VydmljZSB7XG4iCisgICAgICAiICBycGMgRm9vKEJhcikgcmV0dXJucyhCYXIpIHsiLAorICAgICAgIjE6Mjk6IFJlYWNoZWQgZW5kIG9mIGlucHV0IGluIG1ldGhvZCBvcHRpb25zIChtaXNzaW5nICd9JykuXG4iCisgICAgICAiMToyOTogUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gc2VydmljZSBkZWZpbml0aW9uIChtaXNzaW5nICd9JykuXG4iKTsKK30KKworCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIFByaW1pdGl2ZU1ldGhvZElucHV0KSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJzZXJ2aWNlIFRlc3RTZXJ2aWNlIHtcbiIKKyAgICAgICIgIHJwYyBGb28oaW50MzIpIHJldHVybnMoQmFyKTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjE6MTA6IEV4cGVjdGVkIG1lc3NhZ2UgdHlwZS5cbiIpOworfQorCisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTWV0aG9kT3B0aW9uVHlwZUVycm9yKSB7CisgIC8vIFRoaXMgdXNlZCB0byBjYXVzZSBhbiBpbmZpbml0ZSBsb29wLgorICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAibWVzc2FnZSBCYXoge31cbiIKKyAgICAgICJzZXJ2aWNlIEZvbyB7XG4iCisgICAgICAiICBycGMgQmFyKEJheikgcmV0dXJucyhCYXopIHsgb3B0aW9uIGludmFsaWQgc3ludGF4OyB9XG4iCisgICAgICAifVxuIiwKKyAgICAgICIyOjQ1OiBFeHBlY3RlZCBcIj1cIi5cbiIpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEltcG9ydCBhbmQgcGFja2FnZSBlcnJvcnMKKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBJbXBvcnROb3RRdW90ZWQpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKCJpbXBvcnQgZm9vO1xuIiwKKyAgICAgICAgICAgICAgICAgICIwOjc6IEV4cGVjdGVkIGEgc3RyaW5nIG5hbWluZyB0aGUgZmlsZSB0byBpbXBvcnQuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBNdWx0aXBsZVBhY2thZ2VzSW5GaWxlKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAgICJwYWNrYWdlIGZvbztcbiIKKyAgICAgICJwYWNrYWdlIGJhcjtcbiIsCisgICAgICAiMTowOiBNdWx0aXBsZSBwYWNrYWdlIGRlZmluaXRpb25zLlxuIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRlc3QgdGhhdCBlcnJvcnMgZGV0ZWN0ZWQgYnkgRGVzY3JpcHRvclBvb2wgY29ycmVjdGx5IHJlcG9ydCBsaW5lIGFuZAorLy8gY29sdW1uIG51bWJlcnMuICBXZSBoYXZlIG9uZSB0ZXN0IGZvciBldmVyeSBjYWxsIHRvIFJlY29yZExvY2F0aW9uKCkgaW4KKy8vIHBhcnNlci5jYy4KKwordHlwZWRlZiBQYXJzZXJUZXN0IFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3Q7CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBQYWNrYWdlTmFtZUVycm9yKSB7CisgIC8vIENyZWF0ZSBhbm90aGVyIGZpbGUgd2hpY2ggZGVmaW5lcyBzeW1ib2wgImZvbyIuCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3RoZXJfZmlsZTsKKyAgb3RoZXJfZmlsZS5zZXRfbmFtZSgiYmFyLnByb3RvIik7CisgIG90aGVyX2ZpbGUuYWRkX21lc3NhZ2VfdHlwZSgpLT5zZXRfbmFtZSgiZm9vIik7CisgIEVYUEVDVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShvdGhlcl9maWxlKSAhPSBudWxscHRyKTsKKworICAvLyBOb3cgdHJ5IHRvIGRlZmluZSBpdCBhcyBhIHBhY2thZ2UuCisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgICAicGFja2FnZSBmb28uYmFyOyIsCisgICAgICAiMDowOiBcImZvb1wiIGlzIGFscmVhZHkgZGVmaW5lZCAoYXMgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBwYWNrYWdlKSAiCisgICAgICAiaW4gZmlsZSBcImJhci5wcm90b1wiLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbXBvcnRVbmxvYWRlZEVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgICAicGFja2FnZSB0ZXN0O1xuIgorICAgICAgIlxuIgorICAgICAgImltcG9ydCBcInVubG9hZGVkLnByb3RvXCI7IiwKKyAgICAgICIyOjA6IEltcG9ydCBcInVubG9hZGVkLnByb3RvXCIgaGFzIG5vdCBiZWVuIGxvYWRlZC5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgSW1wb3J0VHdpY2UpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBvdGhlcl9maWxlOworICBvdGhlcl9maWxlLnNldF9uYW1lKCJiYXIucHJvdG8iKTsKKyAgb3RoZXJfZmlsZS5hZGRfbWVzc2FnZV90eXBlKCktPnNldF9uYW1lKCJmb28iKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8uQnVpbGRGaWxlKG90aGVyX2ZpbGUpICE9IG51bGxwdHIpOworCisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgICAicGFja2FnZSB0ZXN0O1xuIgorICAgICAgIlxuIgorICAgICAgImltcG9ydCBcImJhci5wcm90b1wiO1xuIgorICAgICAgIiAgaW1wb3J0IFwiYmFyLnByb3RvXCI7IiwKKyAgICAgICIzOjI6IEltcG9ydCBcImJhci5wcm90b1wiIHdhcyBsaXN0ZWQgdHdpY2UuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIER1cGxpY2F0ZUZpbGVFcnJvcikgeworICBGaWxlRGVzY3JpcHRvclByb3RvIG90aGVyX2ZpbGU7CisgIG90aGVyX2ZpbGUuc2V0X25hbWUoImZvby5wcm90byIpOworICBFWFBFQ1RfVFJVRShwb29sXy5CdWlsZEZpbGUob3RoZXJfZmlsZSkgIT0gbnVsbHB0cik7CisKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAgICJwYWNrYWdlIHRlc3Q7IiwgIjA6MDogQSBmaWxlIHdpdGggdGhpcyBuYW1lIGlzIGFscmVhZHkgaW4gdGhlIHBvb2wuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIE1lc3NhZ2VOYW1lRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAgICJtZXNzYWdlIEZvbyB7fVxuIgorICAgICAgIm1lc3NhZ2UgRm9vIHt9XG4iLAorICAgICAgIjE6ODogXCJGb29cIiBpcyBhbHJlYWR5IGRlZmluZWQuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkTmFtZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICAgIiAgb3B0aW9uYWwgaW50MzIgYmFyID0gMTtcbiIKKyAgICAgICIgIG9wdGlvbmFsIGludDMyIGJhciA9IDI7XG4iCisgICAgICAifVxuIiwKKyAgICAgICIyOjE3OiBcImJhclwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBcIkZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZFR5cGVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICIgIG9wdGlvbmFsIEJheiBiYXIgPSAxO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiMToxMTogXCJCYXpcIiBpcyBub3QgZGVmaW5lZC5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGROdW1iZXJFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICIgIG9wdGlvbmFsIGludDMyIGJhciA9IDA7XG4iCisgICAgICAifVxuIiwKKyAgICAgICIxOjIzOiBGaWVsZCBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMuXG4iCisgICAgICAiMToyMzogU3VnZ2VzdGVkIGZpZWxkIG51bWJlcnMgZm9yIEZvbzogMVxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZEV4dGVuZGVlRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygiZXh0ZW5kIEJheiB7IG9wdGlvbmFsIGludDMyIGJhciA9IDE7IH1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjA6NzogXCJCYXpcIiBpcyBub3QgZGVmaW5lZC5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRXh0ZW5zaW9uSnNvbk5hbWVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgZXh0ZW5zaW9ucyAxIHRvIDEwMDtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiZXh0ZW5kIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIG9wdGlvbmFsIGludDMyIGZvbyA9IDEyIFtqc29uX25hbWUgPSBcImJhclwiXTtcbiIKKyAgICAgICJ9IiwKKyAgICAgICI0OjI3OiBvcHRpb24ganNvbl9uYW1lIGlzIG5vdCBhbGxvd2VkIG9uIGV4dGVuc2lvbiBmaWVsZHMuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkRGVmYXVsdFZhbHVlRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAgICJlbnVtIEJheiB7IFFVWCA9IDE7IH1cbiIKKyAgICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgICAiICBvcHRpb25hbCBCYXogYmFyID0gMSBbZGVmYXVsdD1OT19TVUNIX1ZBTFVFXTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjI6MzI6IEVudW0gdHlwZSBcIkJhelwiIGhhcyBubyB2YWx1ZSBuYW1lZCBcIk5PX1NVQ0hfVkFMVUVcIi5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRmlsZU9wdGlvbk5hbWVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICAgIm9wdGlvbiBmb28gPSA1OyIsCisgICAgICAiMDo3OiBPcHRpb24gXCJmb29cIiB1bmtub3duLiBFbnN1cmUgdGhhdCB5b3VyIHByb3RvIGRlZmluaXRpb24gZmlsZSAiCisgICAgICAiaW1wb3J0cyB0aGUgcHJvdG8gd2hpY2ggZGVmaW5lcyB0aGUgb3B0aW9uLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWxlT3B0aW9uVmFsdWVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICAgIm9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDU7IiwKKyAgICAgICIwOjMwOiBWYWx1ZSBtdXN0IGJlIHF1b3RlZCBzdHJpbmcgZm9yIHN0cmluZyBvcHRpb24gIgorICAgICAgIlwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lXCIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkT3B0aW9uTmFtZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICAgIiAgb3B0aW9uYWwgYm9vbCBiYXIgPSAxIFtmb289MV07XG4iCisgICAgICAifVxuIiwKKyAgICAgICIxOjI1OiBPcHRpb24gXCJmb29cIiB1bmtub3duLiBFbnN1cmUgdGhhdCB5b3VyIHByb3RvIGRlZmluaXRpb24gZmlsZSAiCisgICAgICAiaW1wb3J0cyB0aGUgcHJvdG8gd2hpY2ggZGVmaW5lcyB0aGUgb3B0aW9uLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZE9wdGlvblZhbHVlRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgICAiICBvcHRpb25hbCBpbnQzMiBiYXIgPSAxIFtjdHlwZT0xXTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjE6MzI6IFZhbHVlIG11c3QgYmUgaWRlbnRpZmllciBmb3IgZW51bS12YWx1ZWQgb3B0aW9uICIKKyAgICAgICJcImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuY3R5cGVcIi5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRXh0ZW5zaW9uUmFuZ2VOdW1iZXJFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICIgIGV4dGVuc2lvbnMgMDtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjE6MTM6IEV4dGVuc2lvbiBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMuXG4iCisgICAgICAiMToxMzogU3VnZ2VzdGVkIGZpZWxkIG51bWJlcnMgZm9yIEZvbzogMVxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBQcm90bzNFeHRlbnNpb25FcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICAgInN5bnRheCA9ICdwcm90bzMnO1xuIgorICAgICAgIm1lc3NhZ2UgRm9vIHsgXG4iCisgICAgICAiICBleHRlbnNpb25zIDEwMCB0byAxOTk7XG4iCisgICAgICAifVxuIgorICAgICAgImV4dGVuZCBGb28geyBzdHJpbmcgZm9vID0gMTAxOyB9XG4iLAorICAgICAgIjQ6NzogRXh0ZW5zaW9ucyBpbiBwcm90bzMgYXJlIG9ubHkgYWxsb3dlZCBmb3IgZGVmaW5pbmcgb3B0aW9ucy5cbiIKKyAgICAgICIyOjEzOiBFeHRlbnNpb24gcmFuZ2VzIGFyZSBub3QgYWxsb3dlZCBpbiBwcm90bzMuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIFByb3RvM01lc3NhZ2VTZXQpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAgICJzeW50YXggPSAncHJvdG8zJztcbiIKKyAgICAgICJtZXNzYWdlIEZvbyB7IFxuIgorICAgICAgIiAgb3B0aW9uIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gdHJ1ZTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjE6ODogTWVzc2FnZVNldCBpcyBub3Qgc3VwcG9ydGVkIGluIHByb3RvMy5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgUHJvdG8zUmVxdWlyZWQpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAgICJzeW50YXggPSAncHJvdG8zJztcbiIKKyAgICAgICJtZXNzYWdlIEZvbyB7IFxuIgorICAgICAgIiAgcmVxdWlyZWQgaW50MzIgZmllbGQgPSAxOyIKKyAgICAgICJ9XG4iLAorICAgICAgIjI6MTE6IFJlcXVpcmVkIGZpZWxkcyBhcmUgbm90IGFsbG93ZWQgaW4gcHJvdG8zLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBQcm90bzNEZWZhdWx0KSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgICAic3ludGF4ID0gJ3Byb3RvMyc7XG4iCisgICAgICAibWVzc2FnZSBGb28geyBcbiIKKyAgICAgICIgIGludDMyIGZpZWxkID0gMSBbZGVmYXVsdCA9IDEyXTsiCisgICAgICAifVxuIiwKKyAgICAgICIyOjI5OiBFeHBsaWNpdCBkZWZhdWx0IHZhbHVlcyBhcmUgbm90IGFsbG93ZWQgaW4gcHJvdG8zLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBQcm90bzNKc29uQ29uZmxpY3RFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICAgInN5bnRheCA9ICdwcm90bzMnO1xuIgorICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgdWludDMyIGZvbyA9IDE7XG4iCisgICAgICAiICB1aW50MzIgRm9vID0gMjtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjM6OTogVGhlIEpTT04gY2FtZWwtY2FzZSBuYW1lIG9mIGZpZWxkIFwiRm9vXCIgY29uZmxpY3RzIHdpdGggZmllbGQgIgorICAgICAgIlwiZm9vXCIuIFRoaXMgaXMgbm90IGFsbG93ZWQgaW4gcHJvdG8zLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtTmFtZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgICAiZW51bSBGb28ge0EgPSAxO31cbiIKKyAgICAgICJlbnVtIEZvbyB7QiA9IDE7fVxuIiwKKyAgICAgICIxOjU6IFwiRm9vXCIgaXMgYWxyZWFkeSBkZWZpbmVkLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBQcm90bzNFbnVtRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAgICJzeW50YXggPSAncHJvdG8zJztcbiIKKyAgICAgICJlbnVtIEZvbyB7QSA9IDE7fVxuIiwKKyAgICAgICIxOjE0OiBUaGUgZmlyc3QgZW51bSB2YWx1ZSBtdXN0IGJlIHplcm8gaW4gcHJvdG8zLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtVmFsdWVOYW1lRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAgICJlbnVtIEZvbyB7XG4iCisgICAgICAiICBCQVIgPSAxO1xuIgorICAgICAgIiAgQkFSID0gMTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjI6MjogXCJCQVJcIiBpcyBhbHJlYWR5IGRlZmluZWQuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1WYWx1ZUFsaWFzRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAgICJlbnVtIEZvbyB7XG4iCisgICAgICAiICBCQVIgPSAxO1xuIgorICAgICAgIiAgQkFaID0gMTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjI6ODogXCJCQVpcIiB1c2VzIHRoZSBzYW1lIGVudW0gdmFsdWUgYXMgXCJCQVJcIi4gSWYgdGhpcyBpcyAiCisgICAgICAiaW50ZW5kZWQsIHNldCAnb3B0aW9uIGFsbG93X2FsaWFzID0gdHJ1ZTsnIHRvIHRoZSBlbnVtICIKKyAgICAgICJkZWZpbml0aW9uLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBFeHBsaWNpdGx5TWFwRW50cnlFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICIgIG1lc3NhZ2UgVmFsdWVFbnRyeSB7XG4iCisgICAgICAiICAgIG9wdGlvbiBtYXBfZW50cnkgPSB0cnVlO1xuIgorICAgICAgIiAgICBvcHRpb25hbCBpbnQzMiBrZXkgPSAxO1xuIgorICAgICAgIiAgICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDI7XG4iCisgICAgICAiICAgIGV4dGVuc2lvbnMgOTkgdG8gOTk5O1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgcmVwZWF0ZWQgVmFsdWVFbnRyeSB2YWx1ZSA9IDE7XG4iCisgICAgICAifSIsCisgICAgICAiNzoxMTogbWFwX2VudHJ5IHNob3VsZCBub3QgYmUgc2V0IGV4cGxpY2l0bHkuIFVzZSAiCisgICAgICAibWFwPEtleVR5cGUsIFZhbHVlVHlwZT4gaW5zdGVhZC5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgU2VydmljZU5hbWVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICAgInNlcnZpY2UgRm9vIHt9XG4iCisgICAgICAic2VydmljZSBGb28ge31cbiIsCisgICAgICAiMTo4OiBcIkZvb1wiIGlzIGFscmVhZHkgZGVmaW5lZC5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgTWV0aG9kTmFtZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgICAibWVzc2FnZSBCYXoge31cbiIKKyAgICAgICJzZXJ2aWNlIEZvbyB7XG4iCisgICAgICAiICBycGMgQmFyKEJheikgcmV0dXJucyhCYXopO1xuIgorICAgICAgIiAgcnBjIEJhcihCYXopIHJldHVybnMoQmF6KTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjM6NjogXCJCYXJcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gXCJGb29cIi5cbiIpOworfQorCisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBNZXRob2RJbnB1dFR5cGVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICAgIm1lc3NhZ2UgQmF6IHt9XG4iCisgICAgICAic2VydmljZSBGb28ge1xuIgorICAgICAgIiAgcnBjIEJhcihRdXgpIHJldHVybnMoQmF6KTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIjI6MTA6IFwiUXV4XCIgaXMgbm90IGRlZmluZWQuXG4iKTsKK30KKworCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgTWV0aG9kT3V0cHV0VHlwZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgICAibWVzc2FnZSBCYXoge31cbiIKKyAgICAgICJzZXJ2aWNlIEZvbyB7XG4iCisgICAgICAiICBycGMgQmFyKEJheikgcmV0dXJucyhRdXgpO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiMjoyMzogXCJRdXhcIiBpcyBub3QgZGVmaW5lZC5cbiIpOworfQorCisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXNvbHZlZFVuZGVmaW5lZEVycm9yKSB7CisgIC8vIENyZWF0ZSBhbm90aGVyIGZpbGUgd2hpY2ggZGVmaW5lcyBzeW1ib2wgIi5iYXNlLmJhciIuCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3RoZXJfZmlsZTsKKyAgb3RoZXJfZmlsZS5zZXRfbmFtZSgiYmFzZS5wcm90byIpOworICBvdGhlcl9maWxlLnNldF9wYWNrYWdlKCJiYXNlIik7CisgIG90aGVyX2ZpbGUuYWRkX21lc3NhZ2VfdHlwZSgpLT5zZXRfbmFtZSgiYmFyIik7CisgIEVYUEVDVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShvdGhlcl9maWxlKSAhPSBudWxscHRyKTsKKworICAvLyBEZWZpbmUgImZvby5iYXNlIiBhbmQgdHJ5ICJiYXNlLmJhciIuCisgIC8vICJiYXNlLmJhciIgaXMgcmVzb2x2ZWQgdG8gImZvby5iYXNlLmJhciIgd2hpY2ggaXMgbm90IGRlZmluZWQuCisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgICAicGFja2FnZSBmb28uYmFzZTtcbiIKKyAgICAgICJpbXBvcnQgXCJiYXNlLnByb3RvXCI7XG4iCisgICAgICAibWVzc2FnZSBxdXgge1xuIgorICAgICAgIiAgb3B0aW9uYWwgYmFzZS5iYXIgYmF6ID0gMTtcbiIKKyAgICAgICIgIG9wdGlvbmFsIC5iYXNlLmJhciBxdXogPSAyO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiMzoxMTogXCJiYXNlLmJhclwiIGlzIHJlc29sdmVkIHRvIFwiZm9vLmJhc2UuYmFyXCIsIgorICAgICAgIiB3aGljaCBpcyBub3QgZGVmaW5lZC4gVGhlIGlubmVybW9zdCBzY29wZSBpcyBzZWFyY2hlZCBmaXJzdCAiCisgICAgICAiaW4gbmFtZSByZXNvbHV0aW9uLiBDb25zaWRlciB1c2luZyBhIGxlYWRpbmcgJy4nKGkuZS4sIFwiLmJhc2UuYmFyXCIpIgorICAgICAgIiB0byBzdGFydCBmcm9tIHRoZSBvdXRlcm1vc3Qgc2NvcGUuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIFJlc292bGVkVW5kZWZpbmVkT3B0aW9uRXJyb3IpIHsKKyAgLy8gQnVpbGQgZGVzY3JpcHRvciBtZXNzYWdlIGluIHRlc3QgcG9vbAorICBGaWxlRGVzY3JpcHRvclByb3RvIGRlc2NyaXB0b3JfcHJvdG87CisgIERlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmZGVzY3JpcHRvcl9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShkZXNjcmlwdG9yX3Byb3RvKSAhPSBudWxscHRyKTsKKworICAvLyBiYXNlMi5wcm90bzoKKyAgLy8gICBwYWNrYWdlIGJhegorICAvLyAgIGltcG9ydCBuZXQvcHJvdG8yL3Byb3RvL2Rlc2NyaXB0b3IucHJvdG8KKyAgLy8gICBtZXNzYWdlIEJhciB7IG9wdGlvbmFsIGludDMyIGZvbyA9IDE7IH0KKyAgLy8gICBleHRlbmQgRmlsZU9wdGlvbnMgeyBvcHRpb25hbCBCYXIgYmFyID0gNzY3Mjc1NzsgfQorICBGaWxlRGVzY3JpcHRvclByb3RvIG90aGVyX2ZpbGU7CisgIG90aGVyX2ZpbGUuc2V0X25hbWUoImJhc2UyLnByb3RvIik7CisgIG90aGVyX2ZpbGUuc2V0X3BhY2thZ2UoImJheiIpOworICBvdGhlcl9maWxlLmFkZF9kZXBlbmRlbmN5KCk7CisgIG90aGVyX2ZpbGUuc2V0X2RlcGVuZGVuY3koMCwgZGVzY3JpcHRvcl9wcm90by5uYW1lKCkpOworCisgIERlc2NyaXB0b3JQcm90byogbWVzc2FnZShvdGhlcl9maWxlLmFkZF9tZXNzYWdlX3R5cGUoKSk7CisgIG1lc3NhZ2UtPnNldF9uYW1lKCJCYXIiKTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkKG1lc3NhZ2UtPmFkZF9maWVsZCgpKTsKKyAgZmllbGQtPnNldF9uYW1lKCJmb28iKTsKKyAgZmllbGQtPnNldF9udW1iZXIoMSk7CisgIGZpZWxkLT5zZXRfbGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMKTsKKyAgZmllbGQtPnNldF90eXBlKEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKworICBGaWVsZERlc2NyaXB0b3JQcm90byogZXh0ZW5zaW9uKG90aGVyX2ZpbGUuYWRkX2V4dGVuc2lvbigpKTsKKyAgZXh0ZW5zaW9uLT5zZXRfbmFtZSgiYmFyIik7CisgIGV4dGVuc2lvbi0+c2V0X251bWJlcig3NjcyNzU3KTsKKyAgZXh0ZW5zaW9uLT5zZXRfbGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMKTsKKyAgZXh0ZW5zaW9uLT5zZXRfdHlwZShGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9NRVNTQUdFKTsKKyAgZXh0ZW5zaW9uLT5zZXRfdHlwZV9uYW1lKCJCYXIiKTsKKyAgZXh0ZW5zaW9uLT5zZXRfZXh0ZW5kZWUoImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyIpOworCisgIEVYUEVDVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShvdGhlcl9maWxlKSAhPSBudWxscHRyKTsKKworICAvLyBxdXgucHJvdG86CisgIC8vICAgcGFja2FnZSBxdXguYmF6CisgIC8vICAgb3B0aW9uIChiYXouYmFyKS5mb28gPSAxOworICAvLworICAvLyBBbHRob3VnaCAiYmF6LmJhciIgaXMgYWxyZWFkeSBkZWZpbmVkLCB0aGUgbG9va3VwIGNvZGUgd2lsbCB0cnkKKyAgLy8gInF1eC5iYXouYmFyIiwgc2luY2UgaXQncyB0aGUgbWF0Y2ggZnJvbSB0aGUgaW5uZXJtb3N0IHNjb3BlLAorICAvLyB3aGljaCB3aWxsIGNhdXNlIGEgc3ltYm9sIG5vdCBkZWZpbmVkIGVycm9yLgorICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICAgInBhY2thZ2UgcXV4LmJhejtcbiIKKyAgICAgICJpbXBvcnQgXCJiYXNlMi5wcm90b1wiO1xuIgorICAgICAgIm9wdGlvbiAoYmF6LmJhcikuZm9vID0gMTtcbiIsCisgICAgICAiMjo3OiBPcHRpb24gXCIoYmF6LmJhcilcIiBpcyByZXNvbHZlZCB0byBcIihxdXguYmF6LmJhcilcIiwiCisgICAgICAiIHdoaWNoIGlzIG5vdCBkZWZpbmVkLiBUaGUgaW5uZXJtb3N0IHNjb3BlIGlzIHNlYXJjaGVkIGZpcnN0ICIKKyAgICAgICJpbiBuYW1lIHJlc29sdXRpb24uIENvbnNpZGVyIHVzaW5nIGEgbGVhZGluZyAnLicoaS5lLiwgXCIoLmJhei5iYXIpXCIpIgorICAgICAgIiB0byBzdGFydCBmcm9tIHRoZSBvdXRlcm1vc3Qgc2NvcGUuXG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVGVzdCB0aGF0IHRoZSBvdXRwdXQgZnJvbSBGaWxlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSAoYW5kIGFsbCBvdGhlcgorLy8gZGVzY3JpcHRvciB0eXBlcykgaXMgcGFyc2VhYmxlLCBhbmQgcmVzdWx0cyBpbiB0aGUgc2FtZSBEZXNjcmlwdG9yCisvLyBkZWZpbml0aW9ucyBhZ2FpbiBhZm90ZXIgcGFyc2luZyAobm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgb3JkZXIgb2YgbWVzc2FnZXMKKy8vIGNhbm5vdCBiZSBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lKQorCit0eXBlZGVmIFBhcnNlclRlc3QgUGFyc2VEZXNjcmlwdG9yRGVidWdUZXN0OworCitjbGFzcyBDb21wYXJlRGVzY3JpcHRvck5hbWVzIHsKKyBwdWJsaWM6CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBEZXNjcmlwdG9yUHJvdG8qIGxlZnQsCisgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG8qIHJpZ2h0KSBjb25zdCB7CisgICAgcmV0dXJuIGxlZnQtPm5hbWUoKSA8IHJpZ2h0LT5uYW1lKCk7CisgIH0KK307CisKKy8vIFNvcnRzIG5lc3RlZCBEZXNjcmlwdG9yUHJvdG9zIG9mIGEgRGVzY3JpcHRvUHJvdG8sIGJ5IG5hbWUuCit2b2lkIFNvcnRNZXNzYWdlcyhEZXNjcmlwdG9yUHJvdG8qIGRlc2NyaXB0b3JfcHJvdG8pIHsKKyAgaW50IHNpemUgPSBkZXNjcmlwdG9yX3Byb3RvLT5uZXN0ZWRfdHlwZV9zaXplKCk7CisgIC8vIHJlY3Vyc2l2ZWx5IHNvcnQ7IHdlIGNhbid0IGd1YXJhbnRlZSB0aGUgb3JkZXIgb2YgbmVzdGVkIG1lc3NhZ2VzIGVpdGhlcgorICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgIFNvcnRNZXNzYWdlcyhkZXNjcmlwdG9yX3Byb3RvLT5tdXRhYmxlX25lc3RlZF90eXBlKGkpKTsKKyAgfQorICBEZXNjcmlwdG9yUHJvdG8qKiBkYXRhID0KKyAgICAgIGRlc2NyaXB0b3JfcHJvdG8tPm11dGFibGVfbmVzdGVkX3R5cGUoKS0+bXV0YWJsZV9kYXRhKCk7CisgIHN0ZDo6c29ydChkYXRhLCBkYXRhICsgc2l6ZSwgQ29tcGFyZURlc2NyaXB0b3JOYW1lcygpKTsKK30KKworLy8gU29ydHMgRGVzY3JpcHRvclByb3RvcyBiZWxvbmdpbmcgdG8gYSBGaWxlRGVzY3JpcHRvclByb3RvLCBieSBuYW1lLgordm9pZCBTb3J0TWVzc2FnZXMoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZV9kZXNjcmlwdG9yX3Byb3RvKSB7CisgIGludCBzaXplID0gZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5tZXNzYWdlX3R5cGVfc2l6ZSgpOworICAvLyByZWN1cnNpdmVseSBzb3J0OyB3ZSBjYW4ndCBndWFyYW50ZWUgdGhlIG9yZGVyIG9mIG5lc3RlZCBtZXNzYWdlcyBlaXRoZXIKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICBTb3J0TWVzc2FnZXMoZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5tdXRhYmxlX21lc3NhZ2VfdHlwZShpKSk7CisgIH0KKyAgRGVzY3JpcHRvclByb3RvKiogZGF0YSA9CisgICAgICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPm11dGFibGVfbWVzc2FnZV90eXBlKCktPm11dGFibGVfZGF0YSgpOworICBzdGQ6OnNvcnQoZGF0YSwgZGF0YSArIHNpemUsIENvbXBhcmVEZXNjcmlwdG9yTmFtZXMoKSk7Cit9CisKKy8vIFN0cmlwcyB0aGUgbWVzc2FnZSBhbmQgZW51bSBmaWVsZCB0eXBlIG5hbWVzIGZvciBjb21wYXJpc29uIHB1cnBvc2Ugb25seS4KK3ZvaWQgU3RyaXBGaWVsZFR5cGVOYW1lKERlc2NyaXB0b3JQcm90byogcHJvdG8pIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by0+ZmllbGRfc2l6ZSgpOyArK2kpIHsKKyAgICBzdGQ6OnN0cmluZyB0eXBlX25hbWUgPSBwcm90by0+ZmllbGQoaSkudHlwZV9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSB0eXBlX25hbWUuZmluZF9sYXN0X29mKCcuJyk7CisgICAgaWYgKHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgcHJvdG8tPm11dGFibGVfZmllbGQoaSktPm11dGFibGVfdHlwZV9uYW1lKCktPmFzc2lnbigKKyAgICAgICAgICB0eXBlX25hbWUuYmVnaW4oKSArIHBvcyArIDEsIHR5cGVfbmFtZS5lbmQoKSk7CisgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8tPm5lc3RlZF90eXBlX3NpemUoKTsgKytpKSB7CisgICAgU3RyaXBGaWVsZFR5cGVOYW1lKHByb3RvLT5tdXRhYmxlX25lc3RlZF90eXBlKGkpKTsKKyAgfQorfQorCit2b2lkIFN0cmlwRmllbGRUeXBlTmFtZShGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlX3Byb3RvKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV9wcm90by0+bWVzc2FnZV90eXBlX3NpemUoKTsgKytpKSB7CisgICAgU3RyaXBGaWVsZFR5cGVOYW1lKGZpbGVfcHJvdG8tPm11dGFibGVfbWVzc2FnZV90eXBlKGkpKTsKKyAgfQorfQorCitURVNUX0YoUGFyc2VEZXNjcmlwdG9yRGVidWdUZXN0LCBUZXN0QWxsRGVzY3JpcHRvclR5cGVzKSB7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBvcmlnaW5hbF9maWxlID0KKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOworICBGaWxlRGVzY3JpcHRvclByb3RvIGV4cGVjdGVkOworICBvcmlnaW5hbF9maWxlLT5Db3B5VG8oJmV4cGVjdGVkKTsKKworICAvLyBHZXQgdGhlIERlYnVnU3RyaW5nIG9mIHRoZSB1bml0dGVzdC5wcm90byBGaWxlRGVjcmlwdG9yLCB3aGljaCBpbmNsdWRlcworICAvLyBhbGwgb3RoZXIgZGVzY3JpcHRvciB0eXBlcworICBzdGQ6OnN0cmluZyBkZWJ1Z19zdHJpbmcgPSBvcmlnaW5hbF9maWxlLT5EZWJ1Z1N0cmluZygpOworCisgIC8vIFBhcnNlIHRoZSBkZWJ1ZyBzdHJpbmcKKyAgU2V0dXBQYXJzZXIoZGVidWdfc3RyaW5nLmNfc3RyKCkpOworICBGaWxlRGVzY3JpcHRvclByb3RvIHBhcnNlZDsKKyAgcGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmcGFyc2VkKTsKKyAgRVhQRUNUX0VRKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5ELCBpbnB1dF8tPmN1cnJlbnQoKS50eXBlKTsKKyAgQVNTRVJUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKSA8PCAiRmFpbGVkIHRvIHBhcnNlOlxuIiA8PCBkZWJ1Z19zdHJpbmc7CisKKyAgLy8gV2Ugbm93IGhhdmUgYSBGaWxlRGVzY3JpcHRvclByb3RvLCBidXQgdG8gY29tcGFyZSB3aXRoIHRoZSBleHBlY3RlZCB3ZQorICAvLyBuZWVkIHRvIGxpbmsgdG8gYSBGaWxlRGVjcmlwdG9yLCB0aGVuIG91dHB1dCBiYWNrIHRvIGEgcHJvdG8uIFdlJ2xsCisgIC8vIGFsc28gbmVlZCB0byBnaXZlIGl0IHRoZSBzYW1lIG5hbWUgYXMgdGhlIG9yaWdpbmFsLgorICBwYXJzZWQuc2V0X25hbWUoCisgICAgICBUZXN0VXRpbDo6TWF5YmVUcmFuc2xhdGVQYXRoKCJuZXQvcHJvdG8yL2ludGVybmFsL3VuaXR0ZXN0LnByb3RvIikpOworICAvLyBXZSBuZWVkIHRoZSBpbXBvcnRlZCBkZXBlbmRlbmN5IGJlZm9yZSB3ZSBjYW4gYnVpbGQgb3VyIHBhcnNlZCBwcm90bworICBjb25zdCBGaWxlRGVzY3JpcHRvciogcHVibGljX2ltcG9ydCA9CisgICAgICBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ6OlB1YmxpY0ltcG9ydE1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOworICBGaWxlRGVzY3JpcHRvclByb3RvIHB1YmxpY19pbXBvcnRfcHJvdG87CisgIHB1YmxpY19pbXBvcnQtPkNvcHlUbygmcHVibGljX2ltcG9ydF9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShwdWJsaWNfaW1wb3J0X3Byb3RvKSAhPSBudWxscHRyKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGltcG9ydCA9CisgICAgICBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ6OkltcG9ydE1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOworICBGaWxlRGVzY3JpcHRvclByb3RvIGltcG9ydF9wcm90bzsKKyAgaW1wb3J0LT5Db3B5VG8oJmltcG9ydF9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShpbXBvcnRfcHJvdG8pICE9IG51bGxwdHIpOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogYWN0dWFsID0gcG9vbF8uQnVpbGRGaWxlKHBhcnNlZCk7CisgIHBhcnNlZC5DbGVhcigpOworICBBU1NFUlRfVFJVRShhY3R1YWwgIT0gbnVsbHB0cikgPDwgIkZhaWxlZCB0byB2YWxpZGF0ZTpcbiIgPDwgZGVidWdfc3RyaW5nOworICBhY3R1YWwtPkNvcHlUbygmcGFyc2VkKTsKKyAgQVNTRVJUX1RSVUUoYWN0dWFsICE9IG51bGxwdHIpOworCisgIC8vIFRoZSBtZXNzYWdlcyBtaWdodCBiZSBpbiBkaWZmZXJlbnQgb3JkZXJzLCBtYWtpbmcgdGhlbSBoYXJkIHRvIGNvbXBhcmUuCisgIC8vIFNvLCBzb3J0IHRoZSBtZXNzYWdlcyBpbiB0aGUgZGVzY3JpcHRvciBwcm90b3MgKGluY2x1ZGluZyBuZXN0ZWQgbWVzc2FnZXMsCisgIC8vIHJlY3Vyc2l2ZWx5KS4KKyAgU29ydE1lc3NhZ2VzKCZleHBlY3RlZCk7CisgIFNvcnRNZXNzYWdlcygmcGFyc2VkKTsKKworICAvLyBJIHJlYWxseSB3YW50ZWQgdG8gdXNlIFN0cmluZ0RpZmYgaGVyZSBmb3IgdGhlIGRlYnVnIG91dHB1dCBvbiBmYWlsLAorICAvLyBidXQgdGhlIHN0cmluZ3MgYXJlIHRvbyBsb25nIGZvciBpdCwgYW5kIGlmIEkgaW5jcmVhc2UgaXRzIG1heCBzaXplLAorICAvLyB3ZSBnZXQgYSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIDooCisgIEVYUEVDVF9FUShleHBlY3RlZC5EZWJ1Z1N0cmluZygpLCBwYXJzZWQuRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihQYXJzZURlc2NyaXB0b3JEZWJ1Z1Rlc3QsIFRlc3RDdXN0b21PcHRpb25zKSB7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBvcmlnaW5hbF9maWxlID0KKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpBZ2dyZWdhdGVNZXNzYWdlOjpkZXNjcmlwdG9yKCktPmZpbGUoKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBleHBlY3RlZDsKKyAgb3JpZ2luYWxfZmlsZS0+Q29weVRvKCZleHBlY3RlZCk7CisKKyAgc3RkOjpzdHJpbmcgZGVidWdfc3RyaW5nID0gb3JpZ2luYWxfZmlsZS0+RGVidWdTdHJpbmcoKTsKKworICAvLyBQYXJzZSB0aGUgZGVidWcgc3RyaW5nCisgIFNldHVwUGFyc2VyKGRlYnVnX3N0cmluZy5jX3N0cigpKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBwYXJzZWQ7CisgIHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJnBhcnNlZCk7CisgIEVYUEVDVF9FUShpbzo6VG9rZW5pemVyOjpUWVBFX0VORCwgaW5wdXRfLT5jdXJyZW50KCkudHlwZSk7CisgIEFTU0VSVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7CisKKyAgLy8gV2Ugbm93IGhhdmUgYSBGaWxlRGVzY3JpcHRvclByb3RvLCBidXQgdG8gY29tcGFyZSB3aXRoIHRoZSBleHBlY3RlZCB3ZQorICAvLyBuZWVkIHRvIGxpbmsgdG8gYSBGaWxlRGVjcmlwdG9yLCB0aGVuIG91dHB1dCBiYWNrIHRvIGEgcHJvdG8uIFdlJ2xsCisgIC8vIGFsc28gbmVlZCB0byBnaXZlIGl0IHRoZSBzYW1lIG5hbWUgYXMgdGhlIG9yaWdpbmFsLgorICBwYXJzZWQuc2V0X25hbWUob3JpZ2luYWxfZmlsZS0+bmFtZSgpKTsKKworICAvLyB1bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byBkZXBlbmRzIG9uIGRlc2NyaXB0b3IucHJvdG8uCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBpbXBvcnQgPSBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCktPmZpbGUoKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBpbXBvcnRfcHJvdG87CisgIGltcG9ydC0+Q29weVRvKCZpbXBvcnRfcHJvdG8pOworICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUoaW1wb3J0X3Byb3RvKSAhPSBudWxscHRyKTsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIGFueV9pbXBvcnQ7CisgIGdvb2dsZTo6cHJvdG9idWY6OkFueTo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmYW55X2ltcG9ydCk7CisgIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShhbnlfaW1wb3J0KSAhPSBudWxscHRyKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogYWN0dWFsID0gcG9vbF8uQnVpbGRGaWxlKHBhcnNlZCk7CisgIEFTU0VSVF9UUlVFKGFjdHVhbCAhPSBudWxscHRyKTsKKyAgcGFyc2VkLkNsZWFyKCk7CisgIGFjdHVhbC0+Q29weVRvKCZwYXJzZWQpOworCisgIC8vIFRoZSBtZXNzYWdlcyBtaWdodCBiZSBpbiBkaWZmZXJlbnQgb3JkZXJzLCBtYWtpbmcgdGhlbSBoYXJkIHRvIGNvbXBhcmUuCisgIC8vIFNvLCBzb3J0IHRoZSBtZXNzYWdlcyBpbiB0aGUgZGVzY3JpcHRvciBwcm90b3MgKGluY2x1ZGluZyBuZXN0ZWQgbWVzc2FnZXMsCisgIC8vIHJlY3Vyc2l2ZWx5KS4KKyAgU29ydE1lc3NhZ2VzKCZleHBlY3RlZCk7CisgIFNvcnRNZXNzYWdlcygmcGFyc2VkKTsKKworICBFWFBFQ1RfRVEoZXhwZWN0ZWQuRGVidWdTdHJpbmcoKSwgcGFyc2VkLkRlYnVnU3RyaW5nKCkpOworfQorCisvLyBFbnN1cmUgdGhhdCBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKCksIHdpdGggfGluY2x1ZGVfY29tbWVudHN8IHNldCB0byB0cnVlLAorLy8gaW5jbHVkZXMgY29tbWVudHMgZnJvbSB0aGUgb3JpZ2luYWwgcGFyc2VyIGlucHV0IGluIGFsbCBvZiB0aGUgYXBwcm9wcmlhdGUKKy8vIHBsYWNlcy4KK1RFU1RfRihQYXJzZURlc2NyaXB0b3JEZWJ1Z1Rlc3QsIFRlc3RDb21tZW50c0luRGVidWdTdHJpbmcpIHsKKyAgU2V0dXBQYXJzZXIoCisgICAgICAiLy8gRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgc3ludGF4LlxuIgorICAgICAgIlxuIgorICAgICAgIi8vIFN5bnRheCBjb21tZW50LlxuIgorICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAiXG4iCisgICAgICAiLy8gRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgcGFja2FnZS5cbiIKKyAgICAgICJcbiIKKyAgICAgICIvLyBQYWNrYWdlIGNvbW1lbnQuXG4iCisgICAgICAicGFja2FnZSBjb21tZW50X3Rlc3Q7XG4iCisgICAgICAiXG4iCisgICAgICAiLy8gRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgVGVzdE1lc3NhZ2UxLlxuIgorICAgICAgIlxuIgorICAgICAgIi8vIE1lc3NhZ2UgY29tbWVudC5cbiIKKyAgICAgICIvL1xuIgorICAgICAgIi8vIE1vcmUgZGV0YWlsIGluIG1lc3NhZ2UgY29tbWVudC5cbiIKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlMSB7XG4iCisgICAgICAiXG4iCisgICAgICAiICAvLyBEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBmb28uXG4iCisgICAgICAiXG4iCisgICAgICAiICAvLyBGaWVsZCBjb21tZW50LlxuIgorICAgICAgIiAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTtcbiIKKyAgICAgICJcbiIKKyAgICAgICIgIC8vIERldGFjaGVkIGNvbW1lbnQgYmVmb3JlIE5lc3RlZE1lc3NhZ2UuXG4iCisgICAgICAiXG4iCisgICAgICAiICAvLyBOZXN0ZWQtbWVzc2FnZSBjb21tZW50LlxuIgorICAgICAgIiAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHtcbiIKKyAgICAgICIgICAgb3B0aW9uYWwgaW50MzIgYmFyID0gMTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iCisgICAgICAiLy8gRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgTXlFbnVtVHlwZS5cbiIKKyAgICAgICJcbiIKKyAgICAgICIvLyBFbnVtIGNvbW1lbnQuXG4iCisgICAgICAiZW51bSBNeUVudW1UeXBlIHtcbiIKKyAgICAgICJcbiIKKyAgICAgICIgIC8vIERldGFjaGVkIGNvbW1lbnQgYmVmb3JlIEFTREYuXG4iCisgICAgICAiXG4iCisgICAgICAiICAvLyBFbnVtLXZhbHVlIGNvbW1lbnQuXG4iCisgICAgICAiICBBU0RGID0gMTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iCisgICAgICAiLy8gRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgTXlTZXJ2aWNlLlxuIgorICAgICAgIlxuIgorICAgICAgIi8vIFNlcnZpY2UgY29tbWVudC5cbiIKKyAgICAgICJzZXJ2aWNlIE15U2VydmljZSB7XG4iCisgICAgICAiXG4iCisgICAgICAiICAvLyBEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBNeVJQQ0NhbGwuXG4iCisgICAgICAiXG4iCisgICAgICAiICAvLyBSUEMgY29tbWVudC5cbiIKKyAgICAgICIgIHJwYyBNeVJQQ0NhbGwoVGVzdE1lc3NhZ2UxKSByZXR1cm5zIChUZXN0TWVzc2FnZTEpIHsgfVxuIgorICAgICAgIn1cbiIpOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gcGFyc2VkX2Rlc2M7CisgIHBhcnNlZF9kZXNjLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgU291cmNlTG9jYXRpb25UYWJsZSBzb3VyY2VfbG9jYXRpb25zOworICBwYXJzZXJfLT5SZWNvcmRTb3VyY2VMb2NhdGlvbnNUbygmc291cmNlX2xvY2F0aW9ucyk7CisgIHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJnBhcnNlZF9kZXNjKTsKKyAgRVhQRUNUX0VRKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5ELCBpbnB1dF8tPmN1cnJlbnQoKS50eXBlKTsKKyAgQVNTRVJUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKKworICAvLyBXZSBuZWVkIHRvIGltcG9ydCB0aGUgRmlsZURlc2NyaXB0b3JQcm90byB0byBnZXQgYSBGaWxlRGVzY3JpcHRvci4KKyAgTW9ja1ZhbGlkYXRpb25FcnJvckNvbGxlY3RvciBjb2xsZWN0b3Ioc291cmNlX2xvY2F0aW9ucywgJmVycm9yX2NvbGxlY3Rvcl8pOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciA9CisgICAgICBwb29sXy5CdWlsZEZpbGVDb2xsZWN0aW5nRXJyb3JzKHBhcnNlZF9kZXNjLCAmY29sbGVjdG9yKTsKKyAgQVNTRVJUX1RSVUUoZGVzY3JpcHRvciAhPSBudWxscHRyKTsKKworICAvLyBFbnN1cmUgdGhhdCBlYWNoIG9mIHRoZSBjb21tZW50cyBhcHBlYXJzIHNvbWV3aGVyZSBpbiB0aGUgRGVidWdTdHJpbmcoKS4KKyAgLy8gV2UgZG9uJ3QgdGVzdCB0aGUgZXhhY3QgY29tbWVudCBwbGFjZW1lbnQgb3IgZm9ybWF0dGluZywgYmVjYXVzZSB3ZSBkbyBub3QKKyAgLy8gd2FudCB0byBiZSB0b28gZnJhZ2lsZSBoZXJlLgorICBjb25zdCBjaGFyKiBleHBlY3RlZF9jb21tZW50c1tdID0geworICAgICAgIkRldGFjaGVkIGNvbW1lbnQgYmVmb3JlIHN5bnRheC4iLAorICAgICAgIlN5bnRheCBjb21tZW50LiIsCisgICAgICAiRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgcGFja2FnZS4iLAorICAgICAgIlBhY2thZ2UgY29tbWVudC4iLAorICAgICAgIkRldGFjaGVkIGNvbW1lbnQgYmVmb3JlIFRlc3RNZXNzYWdlMS4iLAorICAgICAgIk1lc3NhZ2UgY29tbWVudC4iLAorICAgICAgIk1vcmUgZGV0YWlsIGluIG1lc3NhZ2UgY29tbWVudC4iLAorICAgICAgIkRldGFjaGVkIGNvbW1lbnQgYmVmb3JlIGZvby4iLAorICAgICAgIkZpZWxkIGNvbW1lbnQiLAorICAgICAgIkRldGFjaGVkIGNvbW1lbnQgYmVmb3JlIE5lc3RlZE1lc3NhZ2UuIiwKKyAgICAgICJOZXN0ZWQtbWVzc2FnZSBjb21tZW50IiwKKyAgICAgICJEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBNeUVudW1UeXBlLiIsCisgICAgICAiRW51bSBjb21tZW50IiwKKyAgICAgICJEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBBU0RGLiIsCisgICAgICAiRW51bS12YWx1ZSBjb21tZW50IiwKKyAgICAgICJEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBNeVNlcnZpY2UuIiwKKyAgICAgICJTZXJ2aWNlIGNvbW1lbnQiLAorICAgICAgIkRldGFjaGVkIGNvbW1lbnQgYmVmb3JlIE15UlBDQ2FsbC4iLAorICAgICAgIlJQQyBjb21tZW50IiwKKyAgfTsKKworICBEZWJ1Z1N0cmluZ09wdGlvbnMgZGVidWdfc3RyaW5nX29wdGlvbnM7CisgIGRlYnVnX3N0cmluZ19vcHRpb25zLmluY2x1ZGVfY29tbWVudHMgPSB0cnVlOworCisgIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBkZWJ1Z19zdHJpbmcgPQorICAgICAgICBkZXNjcmlwdG9yLT5EZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKGRlYnVnX3N0cmluZ19vcHRpb25zKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShleHBlY3RlZF9jb21tZW50cyk7ICsraSkgeworICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBmb3VuZF9wb3MgPQorICAgICAgICAgIGRlYnVnX3N0cmluZy5maW5kKGV4cGVjdGVkX2NvbW1lbnRzW2ldKTsKKyAgICAgIEVYUEVDVF9UUlVFKGZvdW5kX3BvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgICA8PCAiXCIiIDw8IGV4cGVjdGVkX2NvbW1lbnRzW2ldIDw8ICJcIiBub3QgZm91bmQuIjsKKyAgICB9CisKKyAgICAvLyBSZXN1bHQgb2YgRGVidWdTdHJpbmdXaXRoT3B0aW9ucyBzaG91bGQgYmUgcGFyc2VhYmxlLgorICAgIFNldHVwUGFyc2VyKGRlYnVnX3N0cmluZy5jX3N0cigpKTsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIHBhcnNlZDsKKyAgICBwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksICZwYXJzZWQpOworICAgIEVYUEVDVF9FUShpbzo6VG9rZW5pemVyOjpUWVBFX0VORCwgaW5wdXRfLT5jdXJyZW50KCkudHlwZSk7CisgICAgQVNTRVJUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKSA8PCAiRmFpbGVkIHRvIHBhcnNlOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZGVidWdfc3RyaW5nOworICB9CisKK30KKworVEVTVF9GKFBhcnNlRGVzY3JpcHRvckRlYnVnVGVzdCwgVGVzdE1hcHMpIHsKKyAgU2V0dXBQYXJzZXIoCisgICAgICAic3ludGF4ID0gXCJwcm90bzNcIjsgIgorICAgICAgIm1lc3NhZ2UgRm9vIHsgIgorICAgICAgIiAgbWVzc2FnZSBCYXIgeyB9ICIKKyAgICAgICIgIG1hcDxpbnQzMiwgQmFyPiBlbnVtX21lc3NhZ2VfbWFwID0gMTsgIgorICAgICAgIiAgbWFwPHN0cmluZywgZmxvYXQ+IHByaW1pdGl2ZV9tYXAgPSAyOyAiCisgICAgICAifSAiKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBvcmlnaW5hbDsKKyAgRVhQRUNUX1RSVUUocGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmb3JpZ2luYWwpKTsKKyAgb3JpZ2luYWwuc2V0X25hbWUoImZvby5wcm90byIpOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2xfLkJ1aWxkRmlsZShvcmlnaW5hbCk7CisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gbnVsbHB0cik7CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBkZWJ1ZyBzdHJpbmcgdXNlcyBtYXAgc3ludGF4IGFuZCBkb2VzIG5vdCBoYXZlIHRoZSBhdXRvCisgIC8vIGdlbmVyYXRlZCBlbnRyeS4KKyAgc3RkOjpzdHJpbmcgZGVidWdfc3RyaW5nID0gZmlsZS0+RGVidWdTdHJpbmcoKTsKKyAgRVhQRUNUX1RSVUUoZGVidWdfc3RyaW5nLmZpbmQoIm1hcDwiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyk7CisgIEVYUEVDVF9UUlVFKGRlYnVnX3N0cmluZy5maW5kKCJvcHRpb24gbWFwX2VudHJ5IikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpOworICBFWFBFQ1RfVFJVRShkZWJ1Z19zdHJpbmcuZmluZCgiTWFwRW50cnkiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyk7CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBkZXNjcmlwdG9yIGRlYnVnIHN0cmluZyBpcyBwYXJzYWJsZS4KKyAgRmlsZURlc2NyaXB0b3JQcm90byBwYXJzZWQ7CisgIFNldHVwUGFyc2VyKGRlYnVnX3N0cmluZy5jX3N0cigpKTsKKyAgcGFyc2VkLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgQVNTRVJUX1RSVUUocGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmcGFyc2VkKSk7CisKKyAgb3JpZ2luYWwuY2xlYXJfc291cmNlX2NvZGVfaW5mbygpOworICBwYXJzZWQuY2xlYXJfc291cmNlX2NvZGVfaW5mbygpOworICBTdHJpcEZpZWxkVHlwZU5hbWUoJm9yaWdpbmFsKTsKKyAgU3RyaXBGaWVsZFR5cGVOYW1lKCZwYXJzZWQpOworICBFWFBFQ1RfRVEob3JpZ2luYWwuRGVidWdTdHJpbmcoKSwgcGFyc2VkLkRlYnVnU3RyaW5nKCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBTb3VyY2VDb2RlSW5mbyB0ZXN0cy4KKworLy8gRm9sbG93cyBhIHBhdGggLS0gYXMgZGVmaW5lZCBieSBTb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5wYXRoIC0tIGZyb20gYQorLy8gbWVzc2FnZSB0byBhIHBhcnRpY3VsYXIgc3ViLWZpZWxkLgorLy8gKiBJZiB0aGUgdGFyZ2V0IGlzIGl0c2VsZiBhIG1lc3NhZ2UsIHNldHMgKm91dHB1dF9tZXNzYWdlIHRvIHBvaW50IGF0IGl0LAorLy8gICAqb3V0cHV0X2ZpZWxkIHRvIE5VTEwsIGFuZCAqb3V0cHV0X2luZGV4IHRvIC0xLgorLy8gKiBPdGhlcndpc2UsIGlmIHRoZSB0YXJnZXQgaXMgYW4gZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkLCBzZXRzCisvLyAgICpvdXRwdXRfbWVzc2FnZSB0byB0aGUgY29udGFpbmluZyBtZXNzYWdlLCAqb3V0cHV0X2ZpZWxkIHRvIHRoZSBkZXNjcmlwdG9yCisvLyAgIG9mIHRoZSBmaWVsZCwgYW5kICpvdXRwdXRfaW5kZXggdG8gdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50LgorLy8gKiBPdGhlcndpc2UsIHRoZSB0YXJnZXQgaXMgYSBmaWVsZCAocG9zc2libHkgYSByZXBlYXRlZCBmaWVsZCwgYnV0IG5vdCBhbnkKKy8vICAgb25lIGVsZW1lbnQpLiAgU2V0cyAqb3V0cHV0X21lc3NhZ2UgdG8gdGhlIGNvbnRhaW5pbmcgbWVzc2FnZSwKKy8vICAgKm91dHB1dF9maWVsZCB0byB0aGUgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQsIGFuZCAqb3V0cHV0X2luZGV4IHRvIC0xLgorLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIHdhcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLiAgQSBnVGVzdCBmYWlsdXJlIGlzCisvLyByZWNvcmRlZCBiZWZvcmUgcmV0dXJuaW5nIGZhbHNlLgorYm9vbCBGb2xsb3dQYXRoKGNvbnN0IE1lc3NhZ2UmIHJvb3QsCisgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBwYXRoX2JlZ2luLAorICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgcGF0aF9lbmQsCisgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSoqIG91dHB1dF9tZXNzYWdlLAorICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioqIG91dHB1dF9maWVsZCwgaW50KiBvdXRwdXRfaW5kZXgpIHsKKyAgaWYgKHBhdGhfYmVnaW4gPT0gcGF0aF9lbmQpIHsKKyAgICAvLyBQYXRoIHJlZmVycyB0byB0aGlzIHdob2xlIG1lc3NhZ2UuCisgICAgKm91dHB1dF9tZXNzYWdlID0gJnJvb3Q7CisgICAgKm91dHB1dF9maWVsZCA9IG51bGxwdHI7CisgICAgKm91dHB1dF9pbmRleCA9IC0xOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IHJvb3QuR2V0RGVzY3JpcHRvcigpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gcm9vdC5HZXRSZWZsZWN0aW9uKCk7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TnVtYmVyKCpwYXRoX2JlZ2luKTsKKworICBpZiAoZmllbGQgPT0gbnVsbHB0cikgeworICAgIEFERF9GQUlMVVJFKCkgPDwgZGVzY3JpcHRvci0+bmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiIGhhcyBubyBmaWVsZCBudW1iZXI6ICIgPDwgKnBhdGhfYmVnaW47CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKytwYXRoX2JlZ2luOworCisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIGlmIChwYXRoX2JlZ2luID09IHBhdGhfZW5kKSB7CisgICAgICAvLyBQYXRoIHJlZmVycyB0byB0aGUgd2hvbGUgcmVwZWF0ZWQgZmllbGQuCisgICAgICAqb3V0cHV0X21lc3NhZ2UgPSAmcm9vdDsKKyAgICAgICpvdXRwdXRfZmllbGQgPSBmaWVsZDsKKyAgICAgICpvdXRwdXRfaW5kZXggPSAtMTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGludCBpbmRleCA9ICpwYXRoX2JlZ2luKys7CisgICAgaW50IHNpemUgPSByZWZsZWN0aW9uLT5GaWVsZFNpemUocm9vdCwgZmllbGQpOworCisgICAgaWYgKGluZGV4ID49IHNpemUpIHsKKyAgICAgIEFERF9GQUlMVVJFKCkgPDwgZGVzY3JpcHRvci0+bmFtZSgpIDw8ICIuIiA8PCBmaWVsZC0+bmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgaGFzIHNpemUgIiA8PCBzaXplCisgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJ1dCBwYXRoIGNvbnRhaW5lZCBpbmRleDogIiA8PCBpbmRleDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIC8vIERlc2NlbmQgaW50byBjaGlsZCBtZXNzYWdlLgorICAgICAgY29uc3QgTWVzc2FnZSYgY2hpbGQgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2Uocm9vdCwgZmllbGQsIGluZGV4KTsKKyAgICAgIHJldHVybiBGb2xsb3dQYXRoKGNoaWxkLCBwYXRoX2JlZ2luLCBwYXRoX2VuZCwgb3V0cHV0X21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZmllbGQsIG91dHB1dF9pbmRleCk7CisgICAgfSBlbHNlIGlmIChwYXRoX2JlZ2luID09IHBhdGhfZW5kKSB7CisgICAgICAvLyBQYXRoIHJlZmVycyB0byB0aGlzIGVsZW1lbnQuCisgICAgICAqb3V0cHV0X21lc3NhZ2UgPSAmcm9vdDsKKyAgICAgICpvdXRwdXRfZmllbGQgPSBmaWVsZDsKKyAgICAgICpvdXRwdXRfaW5kZXggPSBpbmRleDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8IGRlc2NyaXB0b3ItPm5hbWUoKSA8PCAiLiIgPDwgZmllbGQtPm5hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiIGlzIG5vdCBhIG1lc3NhZ2U7IGNhbm5vdCBkZXNjZW5kIGludG8gaXQuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBjb25zdCBNZXNzYWdlJiBjaGlsZCA9IHJlZmxlY3Rpb24tPkdldE1lc3NhZ2Uocm9vdCwgZmllbGQpOworICAgICAgcmV0dXJuIEZvbGxvd1BhdGgoY2hpbGQsIHBhdGhfYmVnaW4sIHBhdGhfZW5kLCBvdXRwdXRfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9maWVsZCwgb3V0cHV0X2luZGV4KTsKKyAgICB9IGVsc2UgaWYgKHBhdGhfYmVnaW4gPT0gcGF0aF9lbmQpIHsKKyAgICAgIC8vIFBhdGggcmVmZXJzIHRvIHRoaXMgZmllbGQuCisgICAgICAqb3V0cHV0X21lc3NhZ2UgPSAmcm9vdDsKKyAgICAgICpvdXRwdXRfZmllbGQgPSBmaWVsZDsKKyAgICAgICpvdXRwdXRfaW5kZXggPSAtMTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8IGRlc2NyaXB0b3ItPm5hbWUoKSA8PCAiLiIgPDwgZmllbGQtPm5hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiIGlzIG5vdCBhIG1lc3NhZ2U7IGNhbm5vdCBkZXNjZW5kIGludG8gaXQuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30KKworLy8gQ2hlY2sgaWYgdHdvIHNwYW5zIGFyZSBlcXVhbC4KK2Jvb2wgQ29tcGFyZVNwYW5zKGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50PiYgc3BhbjEsCisgICAgICAgICAgICAgICAgICBjb25zdCBSZXBlYXRlZEZpZWxkPGludD4mIHNwYW4yKSB7CisgIGlmIChzcGFuMS5zaXplKCkgIT0gc3BhbjIuc2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbjEuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoc3BhbjEuR2V0KGkpICE9IHNwYW4yLkdldChpKSkgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBUZXN0IGZpeHR1cmUgZm9yIHNvdXJjZSBpbmZvIHRlc3RzLCB3aGljaCBjaGVjayB0aGF0IHNvdXJjZSBsb2NhdGlvbnMgYXJlCisvLyByZWNvcmRlZCBjb3JyZWN0bHkgaW4gRmlsZURlc2NyaXB0b3JQcm90by5zb3VyY2VfY29kZV9pbmZvLmxvY2F0aW9uLgorY2xhc3MgU291cmNlSW5mb1Rlc3QgOiBwdWJsaWMgUGFyc2VyVGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBUaGUgcGFyc2VkIGZpbGUgKGluaXRpYWxpemVkIGJ5IFBhcnNlKCkpLgorICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfOworCisgIC8vIFBhcnNlIHRoZSBnaXZlbiB0ZXh0IGFzIGEgLnByb3RvIGZpbGUgYW5kIHBvcHVsYXRlIHRoZSBzcGFuc18gbWFwIHdpdGgKKyAgLy8gYWxsIHRoZSBzb3VyY2UgbG9jYXRpb24gc3BhbnMgaW4gaXRzIFNvdXJjZUNvZGVJbmZvIHRhYmxlLgorICBib29sIFBhcnNlKGNvbnN0IGNoYXIqIHRleHQpIHsKKyAgICBFeHRyYWN0TWFya2Vycyh0ZXh0KTsKKyAgICBTZXR1cFBhcnNlcih0ZXh0X3dpdGhvdXRfbWFya2Vyc18uY19zdHIoKSk7CisgICAgaWYgKCFwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksICZmaWxlXykpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBTb3VyY2VDb2RlSW5mbyYgc291cmNlX2luZm8gPSBmaWxlXy5zb3VyY2VfY29kZV9pbmZvKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VfaW5mby5sb2NhdGlvbl9zaXplKCk7IGkrKykgeworICAgICAgY29uc3QgU291cmNlQ29kZUluZm86OkxvY2F0aW9uJiBsb2NhdGlvbiA9IHNvdXJjZV9pbmZvLmxvY2F0aW9uKGkpOworICAgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvcl9wcm90byA9IG51bGxwdHI7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gbnVsbHB0cjsKKyAgICAgIGludCBpbmRleCA9IDA7CisgICAgICBpZiAoIUZvbGxvd1BhdGgoZmlsZV8sIGxvY2F0aW9uLnBhdGgoKS5iZWdpbigpLCBsb2NhdGlvbi5wYXRoKCkuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3JfcHJvdG8sICZmaWVsZCwgJmluZGV4KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHNwYW5zXy5pbnNlcnQoCisgICAgICAgICAgc3RkOjptYWtlX3BhaXIoU3BhbktleSgqZGVzY3JpcHRvcl9wcm90bywgZmllbGQsIGluZGV4KSwgJmxvY2F0aW9uKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIEVYUEVDVF9UUlVFKHNwYW5zXy5lbXB0eSgpKSA8PCAiRm9yZ290IHRvIGNhbGwgSGFzU3BhbigpIGZvcjpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3BhbnNfLmJlZ2luKCktPnNlY29uZC0+RGVidWdTdHJpbmcoKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEhhc1NwYW4oKSBjaGVja3MgdGhhdCB0aGUgc3BhbiBvZiBzb3VyY2UgY29kZSBkZWxpbWl0ZWQgYnkgdGhlIGdpdmVuCisgIC8vIHRhZ3MgKGNvbW1lbnRzKSBjb3JyZXNwb25kIHZpYSB0aGUgU291cmNlQ29kZUluZm8gdGFibGUgdG8gdGhlIGdpdmVuCisgIC8vIHBhcnQgb2YgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8uICAoSWYgdW5jbGVhciwgbG9vayBhdCB0aGUgYWN0dWFsIHRlc3RzOworICAvLyBpdCBzaG91bGQgcXVpY2tseSBiZWNvbWUgb2J2aW91cy4pCisKKyAgYm9vbCBIYXNTcGFuKGNoYXIgc3RhcnRfbWFya2VyLCBjaGFyIGVuZF9tYXJrZXIsCisgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvKSB7CisgICAgcmV0dXJuIEhhc1NwYW5XaXRoQ29tbWVudChzdGFydF9tYXJrZXIsIGVuZF9tYXJrZXIsIGRlc2NyaXB0b3JfcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAtMSwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7CisgIH0KKworICBib29sIEhhc1NwYW5XaXRoQ29tbWVudChjaGFyIHN0YXJ0X21hcmtlciwgY2hhciBlbmRfbWFya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9sZWFkaW5nX2NvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF90cmFpbGluZ19jb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykgeworICAgIHJldHVybiBIYXNTcGFuV2l0aENvbW1lbnQoc3RhcnRfbWFya2VyLCBlbmRfbWFya2VyLCBkZXNjcmlwdG9yX3Byb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgLTEsIGV4cGVjdGVkX2xlYWRpbmdfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF90cmFpbGluZ19jb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpOworICB9CisKKyAgYm9vbCBIYXNTcGFuKGNoYXIgc3RhcnRfbWFya2VyLCBjaGFyIGVuZF9tYXJrZXIsCisgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvLCBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSkgeworICAgIHJldHVybiBIYXNTcGFuKHN0YXJ0X21hcmtlciwgZW5kX21hcmtlciwgZGVzY3JpcHRvcl9wcm90bywgZmllbGRfbmFtZSwgLTEpOworICB9CisKKyAgYm9vbCBIYXNTcGFuKGNoYXIgc3RhcnRfbWFya2VyLCBjaGFyIGVuZF9tYXJrZXIsCisgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvLCBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICAgIHJldHVybiBIYXNTcGFuKHN0YXJ0X21hcmtlciwgZW5kX21hcmtlciwgZGVzY3JpcHRvcl9wcm90bywgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBpbmRleCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7CisgIH0KKworICBib29sIEhhc1NwYW4oY2hhciBzdGFydF9tYXJrZXIsIGNoYXIgZW5kX21hcmtlciwKKyAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8sIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgaW50IGluZGV4LCBjb25zdCBjaGFyKiBleHBlY3RlZF9sZWFkaW5nX2NvbW1lbnRzLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfdHJhaWxpbmdfY29tbWVudHMsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9CisgICAgICAgIGRlc2NyaXB0b3JfcHJvdG8uR2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoZmllbGRfbmFtZSk7CisgICAgaWYgKGZpZWxkID09IG51bGxwdHIpIHsKKyAgICAgIEFERF9GQUlMVVJFKCkgPDwgZGVzY3JpcHRvcl9wcm90by5HZXREZXNjcmlwdG9yKCktPm5hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiIGhhcyBubyBzdWNoIGZpZWxkOiAiIDw8IGZpZWxkX25hbWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIEhhc1NwYW5XaXRoQ29tbWVudChzdGFydF9tYXJrZXIsIGVuZF9tYXJrZXIsIGRlc2NyaXB0b3JfcHJvdG8sIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGV4cGVjdGVkX2xlYWRpbmdfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF90cmFpbGluZ19jb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpOworICB9CisKKyAgYm9vbCBIYXNTcGFuKGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8pIHsKKyAgICByZXR1cm4gSGFzU3BhbldpdGhDb21tZW50KCdcMCcsICdcMCcsIGRlc2NyaXB0b3JfcHJvdG8sIG51bGxwdHIsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7CisgIH0KKworICBib29sIEhhc1NwYW4oY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvcl9wcm90bywgY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkX25hbWUpIHsKKyAgICByZXR1cm4gSGFzU3BhbignXDAnLCAnXDAnLCBkZXNjcmlwdG9yX3Byb3RvLCBmaWVsZF9uYW1lLCAtMSk7CisgIH0KKworICBib29sIEhhc1NwYW5XaXRoQ29tbWVudChjaGFyIHN0YXJ0X21hcmtlciwgY2hhciBlbmRfbWFya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2xlYWRpbmdfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX3RyYWlsaW5nX2NvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKSB7CisgICAgc3RkOjpwYWlyPFNwYW5NYXA6Oml0ZXJhdG9yLCBTcGFuTWFwOjppdGVyYXRvcj4gcmFuZ2UgPQorICAgICAgICBzcGFuc18uZXF1YWxfcmFuZ2UoU3BhbktleShkZXNjcmlwdG9yX3Byb3RvLCBmaWVsZCwgaW5kZXgpKTsKKworICAgIGlmIChzdGFydF9tYXJrZXIgPT0gJ1wwJykgeworICAgICAgaWYgKHJhbmdlLmZpcnN0ID09IHJhbmdlLnNlY29uZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcGFuc18uZXJhc2UocmFuZ2UuZmlyc3QpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3RkOjpwYWlyPGludCwgaW50PiBzdGFydF9wb3MgPSBGaW5kT3JEaWUobWFya2Vyc18sIHN0YXJ0X21hcmtlcik7CisgICAgICBzdGQ6OnBhaXI8aW50LCBpbnQ+IGVuZF9wb3MgPSBGaW5kT3JEaWUobWFya2Vyc18sIGVuZF9tYXJrZXIpOworCisgICAgICBSZXBlYXRlZEZpZWxkPGludD4gZXhwZWN0ZWRfc3BhbjsKKyAgICAgIGV4cGVjdGVkX3NwYW4uQWRkKHN0YXJ0X3Bvcy5maXJzdCk7CisgICAgICBleHBlY3RlZF9zcGFuLkFkZChzdGFydF9wb3Muc2Vjb25kKTsKKyAgICAgIGlmIChlbmRfcG9zLmZpcnN0ICE9IHN0YXJ0X3Bvcy5maXJzdCkgeworICAgICAgICBleHBlY3RlZF9zcGFuLkFkZChlbmRfcG9zLmZpcnN0KTsKKyAgICAgIH0KKyAgICAgIGV4cGVjdGVkX3NwYW4uQWRkKGVuZF9wb3Muc2Vjb25kKTsKKworICAgICAgZm9yIChTcGFuTWFwOjppdGVyYXRvciBpdGVyID0gcmFuZ2UuZmlyc3Q7IGl0ZXIgIT0gcmFuZ2Uuc2Vjb25kOyArK2l0ZXIpIHsKKyAgICAgICAgaWYgKENvbXBhcmVTcGFucyhleHBlY3RlZF9zcGFuLCBpdGVyLT5zZWNvbmQtPnNwYW4oKSkpIHsKKyAgICAgICAgICBpZiAoZXhwZWN0ZWRfbGVhZGluZ19jb21tZW50cyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoaXRlci0+c2Vjb25kLT5oYXNfbGVhZGluZ19jb21tZW50cygpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoaXRlci0+c2Vjb25kLT5oYXNfbGVhZGluZ19jb21tZW50cygpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZF9sZWFkaW5nX2NvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+bGVhZGluZ19jb21tZW50cygpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGV4cGVjdGVkX3RyYWlsaW5nX2NvbW1lbnRzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShpdGVyLT5zZWNvbmQtPmhhc190cmFpbGluZ19jb21tZW50cygpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoaXRlci0+c2Vjb25kLT5oYXNfdHJhaWxpbmdfY29tbWVudHMoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfdHJhaWxpbmdfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT50cmFpbGluZ19jb21tZW50cygpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGV4cGVjdGVkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgRVhQRUNUX0VRKDAsIGl0ZXItPnNlY29uZC0+bGVhZGluZ19kZXRhY2hlZF9jb21tZW50c19zaXplKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cywKKyAgICAgICAgICAgICAgICBKb2luKGl0ZXItPnNlY29uZC0+bGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpLCAiXG4iKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgc3BhbnNfLmVyYXNlKGl0ZXIpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIHN0cnVjdCBTcGFuS2V5IHsKKyAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yX3Byb3RvOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQ7CisgICAgaW50IGluZGV4OworCisgICAgaW5saW5lIFNwYW5LZXkoKSB7fQorICAgIGlubGluZSBTcGFuS2V5KGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG9fcGFyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9wYXJhbSwgaW50IGluZGV4X3BhcmFtKQorICAgICAgICA6IGRlc2NyaXB0b3JfcHJvdG8oJmRlc2NyaXB0b3JfcHJvdG9fcGFyYW0pLAorICAgICAgICAgIGZpZWxkKGZpZWxkX3BhcmFtKSwKKyAgICAgICAgICBpbmRleChpbmRleF9wYXJhbSkge30KKworICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBTcGFuS2V5JiBvdGhlcikgY29uc3QgeworICAgICAgaWYgKGRlc2NyaXB0b3JfcHJvdG8gPCBvdGhlci5kZXNjcmlwdG9yX3Byb3RvKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChkZXNjcmlwdG9yX3Byb3RvID4gb3RoZXIuZGVzY3JpcHRvcl9wcm90bykgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKGZpZWxkIDwgb3RoZXIuZmllbGQpIHJldHVybiB0cnVlOworICAgICAgaWYgKGZpZWxkID4gb3RoZXIuZmllbGQpIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiBpbmRleCA8IG90aGVyLmluZGV4OworICAgIH0KKyAgfTsKKworICB0eXBlZGVmIHN0ZDo6bXVsdGltYXA8U3BhbktleSwgY29uc3QgU291cmNlQ29kZUluZm86OkxvY2F0aW9uKj4gU3Bhbk1hcDsKKyAgU3Bhbk1hcCBzcGFuc187CisgIHN0ZDo6bWFwPGNoYXIsIHN0ZDo6cGFpcjxpbnQsIGludD4gPiBtYXJrZXJzXzsKKyAgc3RkOjpzdHJpbmcgdGV4dF93aXRob3V0X21hcmtlcnNfOworCisgIHZvaWQgRXh0cmFjdE1hcmtlcnMoY29uc3QgY2hhciogdGV4dCkgeworICAgIG1hcmtlcnNfLmNsZWFyKCk7CisgICAgdGV4dF93aXRob3V0X21hcmtlcnNfLmNsZWFyKCk7CisgICAgaW50IGxpbmUgPSAwOworICAgIGludCBjb2x1bW4gPSAwOworICAgIHdoaWxlICgqdGV4dCAhPSAnXDAnKSB7CisgICAgICBpZiAoKnRleHQgPT0gJyQnKSB7CisgICAgICAgICsrdGV4dDsKKyAgICAgICAgR09PR0xFX0NIRUNLX05FKCdcMCcsICp0ZXh0KTsKKyAgICAgICAgaWYgKCp0ZXh0ID09ICckJykgeworICAgICAgICAgIHRleHRfd2l0aG91dF9tYXJrZXJzXyArPSAnJCc7CisgICAgICAgICAgKytjb2x1bW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWFya2Vyc19bKnRleHRdID0gc3RkOjptYWtlX3BhaXIobGluZSwgY29sdW1uKTsKKyAgICAgICAgICArK3RleHQ7CisgICAgICAgICAgR09PR0xFX0NIRUNLX0VRKCckJywgKnRleHQpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCp0ZXh0ID09ICdcbicpIHsKKyAgICAgICAgKytsaW5lOworICAgICAgICBjb2x1bW4gPSAwOworICAgICAgICB0ZXh0X3dpdGhvdXRfbWFya2Vyc18gKz0gKnRleHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ZXh0X3dpdGhvdXRfbWFya2Vyc18gKz0gKnRleHQ7CisgICAgICAgICsrY29sdW1uOworICAgICAgfQorICAgICAgKyt0ZXh0OworICAgIH0KKyAgfQorfTsKKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBCYXNpY0ZpbGVEZWNscykgeworICBFWFBFQ1RfVFJVRSgKKyAgICAgIFBhcnNlKCIkYSRzeW50YXggPSBcInByb3RvMlwiOyRpJFxuIgorICAgICAgICAgICAgIiRiJHBhY2thZ2UgZm9vLmJhcjskYyRcbiIKKyAgICAgICAgICAgICIkZCRpbXBvcnQgXCJiYXoucHJvdG9cIjskZSRcbiIKKyAgICAgICAgICAgICIkZiRpbXBvcnRcInF1eC5wcm90b1wiOyRoJFxuIgorICAgICAgICAgICAgIiRqJGltcG9ydCAkayRwdWJsaWMkbCQgXCJiYXIucHJvdG9cIjskbSRcbiIKKyAgICAgICAgICAgICIkbiRpbXBvcnQgJG8kd2VhayRwJCBcImJhci5wcm90b1wiOyRxJFxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIi8vIGNvbW1lbnQgaWdub3JlZFxuIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAncScsIGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGZpbGVfLCAicGFja2FnZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdlJywgZmlsZV8sICJkZXBlbmRlbmN5IiwgMCkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2gnLCBmaWxlXywgImRlcGVuZGVuY3kiLCAxKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2onLCAnbScsIGZpbGVfLCAiZGVwZW5kZW5jeSIsIDIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignaycsICdsJywgZmlsZV8sICJwdWJsaWNfZGVwZW5kZW5jeSIsIDApKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignbicsICdxJywgZmlsZV8sICJkZXBlbmRlbmN5IiwgMykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdvJywgJ3AnLCBmaWxlXywgIndlYWtfZGVwZW5kZW5jeSIsIDApKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdpJywgZmlsZV8sICJzeW50YXgiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgTWVzc2FnZXMpIHsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBQYXJzZSgiJGEkbWVzc2FnZSAkYiRGb28kYyQge30kZCRcbiIKKyAgICAgICAgICAgICIkZSRtZXNzYWdlICRmJEJhciRnJCB7fSRoJFxuIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnZCcsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2gnLCBmaWxlXy5tZXNzYWdlX3R5cGUoMSkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZicsICdnJywgZmlsZV8ubWVzc2FnZV90eXBlKDEpLCAibmFtZSIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBGaWVsZHMpIHsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBQYXJzZSgibWVzc2FnZSBGb28ge1xuIgorICAgICAgICAgICAgIiAgJGEkb3B0aW9uYWwkYiQgJGMkaW50MzIkZCQgJGUkYmFyJGYkID0gJGckMSRoJDskaSRcbiIKKyAgICAgICAgICAgICIgICRqJHJlcGVhdGVkJGskICRsJFguWSRtJCAkbiRiYXokbyQgPSAkcCQyJHEkOyRyJFxuIgorICAgICAgICAgICAgIn1cbiIpKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQxID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmZpZWxkKDApOworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQyID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmZpZWxkKDEpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaScsIGZpZWxkMSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2InLCBmaWVsZDEsICJsYWJlbCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYycsICdkJywgZmllbGQxLCAidHlwZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdmJywgZmllbGQxLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZycsICdoJywgZmllbGQxLCAibnVtYmVyIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2onLCAncicsIGZpZWxkMikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdqJywgJ2snLCBmaWVsZDIsICJsYWJlbCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignbCcsICdtJywgZmllbGQyLCAidHlwZV9uYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCduJywgJ28nLCBmaWVsZDIsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdwJywgJ3EnLCBmaWVsZDIsICJudW1iZXIiKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBQcm90bzNGaWVsZHMpIHsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBQYXJzZSgic3ludGF4ID0gXCJwcm90bzNcIjtcbiIKKyAgICAgICAgICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgICAgICAgICAiICAkYSRpbnQzMiRiJCAkYyRiYXIkZCQgPSAkZSQxJGYkOyRnJFxuIgorICAgICAgICAgICAgIiAgJGgkcmVwZWF0ZWQkaSQgJGokWC5ZJGskICRsJGJheiRtJCA9ICRuJDIkbyQ7JHAkXG4iCisgICAgICAgICAgICAifVxuIikpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmaWVsZDEgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmaWVsZDIgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdnJywgZmllbGQxKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnYicsIGZpZWxkMSwgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2MnLCAnZCcsIGZpZWxkMSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnZicsIGZpZWxkMSwgIm51bWJlciIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdoJywgJ3AnLCBmaWVsZDIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignaCcsICdpJywgZmllbGQyLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2onLCAnaycsIGZpZWxkMiwgInR5cGVfbmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignbCcsICdtJywgZmllbGQyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignbicsICdvJywgZmllbGQyLCAibnVtYmVyIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLCAic3ludGF4IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgRXh0ZW5zaW9ucykgeworICBFWFBFQ1RfVFJVRSgKKyAgICAgIFBhcnNlKCIkYSRleHRlbmQgJGIkRm9vJGMkIHtcbiIKKyAgICAgICAgICAgICIgICRkJG9wdGlvbmFsJGUkIGludDMyIGJhciA9IDE7JGYkXG4iCisgICAgICAgICAgICAiICAkZyRyZXBlYXRlZCRoJCBYLlkgYmF6ID0gMjskaSRcbiIKKyAgICAgICAgICAgICJ9JGokXG4iCisgICAgICAgICAgICAiJGskZXh0ZW5kICRsJEJhciRtJCB7XG4iCisgICAgICAgICAgICAiICAkbiRvcHRpb25hbCBpbnQzMiBxdXggPSAxOyRvJFxuIgorICAgICAgICAgICAgIn0kcCRcbiIpKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQxID0gZmlsZV8uZXh0ZW5zaW9uKDApOworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQyID0gZmlsZV8uZXh0ZW5zaW9uKDEpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQzID0gZmlsZV8uZXh0ZW5zaW9uKDIpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaicsIGZpbGVfLCAiZXh0ZW5zaW9uIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdrJywgJ3AnLCBmaWxlXywgImV4dGVuc2lvbiIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdkJywgJ2YnLCBmaWVsZDEpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdlJywgZmllbGQxLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGZpZWxkMSwgImV4dGVuZGVlIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2cnLCAnaScsIGZpZWxkMikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdnJywgJ2gnLCBmaWVsZDIsICJsYWJlbCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgZmllbGQyLCAiZXh0ZW5kZWUiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignbicsICdvJywgZmllbGQzKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2wnLCAnbScsIGZpZWxkMywgImV4dGVuZGVlIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMSwgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQxLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDEsICJudW1iZXIiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQyLCAidHlwZV9uYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQyLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMywgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMywgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQzLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDMsICJudW1iZXIiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgTmVzdGVkRXh0ZW5zaW9ucykgeworICBFWFBFQ1RfVFJVRSgKKyAgICAgIFBhcnNlKCJtZXNzYWdlIE1lc3NhZ2Uge1xuIgorICAgICAgICAgICAgIiAgJGEkZXh0ZW5kICRiJEZvbyRjJCB7XG4iCisgICAgICAgICAgICAiICAgICRkJG9wdGlvbmFsJGUkIGludDMyIGJhciA9IDE7JGYkXG4iCisgICAgICAgICAgICAiICAgICRnJHJlcGVhdGVkJGgkIFguWSBiYXogPSAyOyRpJFxuIgorICAgICAgICAgICAgIiAgfSRqJFxuIgorICAgICAgICAgICAgIiAgJGskZXh0ZW5kICRsJEJhciRtJCB7XG4iCisgICAgICAgICAgICAiICAgICRuJG9wdGlvbmFsIGludDMyIHF1eCA9IDE7JG8kXG4iCisgICAgICAgICAgICAiICB9JHAkXG4iCisgICAgICAgICAgICAifVxuIikpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmaWVsZDEgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZXh0ZW5zaW9uKDApOworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQyID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmV4dGVuc2lvbigxKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkMyA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5leHRlbnNpb24oMik7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdqJywgZmlsZV8ubWVzc2FnZV90eXBlKDApLCAiZXh0ZW5zaW9uIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdrJywgJ3AnLCBmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJleHRlbnNpb24iKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdmJywgZmllbGQxKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZScsIGZpZWxkMSwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBmaWVsZDEsICJleHRlbmRlZSIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdnJywgJ2knLCBmaWVsZDIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZycsICdoJywgZmllbGQyLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGZpZWxkMiwgImV4dGVuZGVlIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ24nLCAnbycsIGZpZWxkMykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdsJywgJ20nLCBmaWVsZDMsICJleHRlbmRlZSIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMSwgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQxLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDEsICJudW1iZXIiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQyLCAidHlwZV9uYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQyLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMywgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMywgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQzLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDMsICJudW1iZXIiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgRXh0ZW5zaW9uUmFuZ2VzKSB7CisgIEVYUEVDVF9UUlVFKAorICAgICAgUGFyc2UoIm1lc3NhZ2UgTWVzc2FnZSB7XG4iCisgICAgICAgICAgICAiICAkYSRleHRlbnNpb25zICRiJDEkYyQgdG8gJGQkNCRlJCwgJGYkNiRnJDskaCRcbiIKKyAgICAgICAgICAgICIgICRpJGV4dGVuc2lvbnMgJGokOCRrJCB0byAkbCRtYXgkbSQ7JG4kXG4iCisgICAgICAgICAgICAifVxuIikpOworCisgIGNvbnN0IERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2UmIHJhbmdlMSA9CisgICAgICBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZXh0ZW5zaW9uX3JhbmdlKDApOworICBjb25zdCBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlJiByYW5nZTIgPQorICAgICAgZmlsZV8ubWVzc2FnZV90eXBlKDApLmV4dGVuc2lvbl9yYW5nZSgxKTsKKyAgY29uc3QgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSYgcmFuZ2UzID0KKyAgICAgIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5leHRlbnNpb25fcmFuZ2UoMik7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdoJywgZmlsZV8ubWVzc2FnZV90eXBlKDApLCAiZXh0ZW5zaW9uX3JhbmdlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdpJywgJ24nLCBmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJleHRlbnNpb25fcmFuZ2UiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdlJywgcmFuZ2UxKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIHJhbmdlMSwgInN0YXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdkJywgJ2UnLCByYW5nZTEsICJlbmQiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZicsICdnJywgcmFuZ2UyKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnZycsIHJhbmdlMiwgInN0YXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCByYW5nZTIsICJlbmQiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignaicsICdtJywgcmFuZ2UzKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2onLCAnaycsIHJhbmdlMywgInN0YXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdsJywgJ20nLCByYW5nZTMsICJlbmQiKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBSZXNlcnZlZFJhbmdlcykgeworICBFWFBFQ1RfVFJVRSgKKyAgICAgIFBhcnNlKCJtZXNzYWdlIE1lc3NhZ2Uge1xuIgorICAgICAgICAgICAgIiAgJGEkcmVzZXJ2ZWQgJGIkMSRjJCB0byAkZCQ0JGUkLCAkZiQ2JGckOyRoJFxuIgorICAgICAgICAgICAgIn1cbiIpKTsKKworICBjb25zdCBEZXNjcmlwdG9yUHJvdG86OlJlc2VydmVkUmFuZ2UmIHJhbmdlMSA9CisgICAgICBmaWxlXy5tZXNzYWdlX3R5cGUoMCkucmVzZXJ2ZWRfcmFuZ2UoMCk7CisgIGNvbnN0IERlc2NyaXB0b3JQcm90bzo6UmVzZXJ2ZWRSYW5nZSYgcmFuZ2UyID0KKyAgICAgIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5yZXNlcnZlZF9yYW5nZSgxKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2gnLCBmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJyZXNlcnZlZF9yYW5nZSIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2UnLCByYW5nZTEpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgcmFuZ2UxLCAic3RhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZScsIHJhbmdlMSwgImVuZCIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCByYW5nZTIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZicsICdnJywgcmFuZ2UyLCAic3RhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnZycsIHJhbmdlMiwgImVuZCIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJuYW1lIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIE9uZW9mcykgeworICBFWFBFQ1RfVFJVRSgKKyAgICAgIFBhcnNlKCJtZXNzYWdlIEZvbyB7XG4iCisgICAgICAgICAgICAiICAkYSRvbmVvZiAkYyRmb28kZCQge1xuIgorICAgICAgICAgICAgIiAgICAkZSRpbnQzMiRmJCAkZyRhJGgkID0gJGkkMSRqJDskayRcbiIKKyAgICAgICAgICAgICIgIH0kciRcbiIKKyAgICAgICAgICAgICJ9XG4iKSk7CisKKyAgY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIG9uZW9mX2RlY2wgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkub25lb2ZfZGVjbCgwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmZpZWxkKDApOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAncicsIG9uZW9mX2RlY2wpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYycsICdkJywgb25lb2ZfZGVjbCwgIm5hbWUiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdrJywgZmllbGQpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdmJywgZmllbGQsICJ0eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdnJywgJ2gnLCBmaWVsZCwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2knLCAnaicsIGZpZWxkLCAibnVtYmVyIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgTmVzdGVkTWVzc2FnZXMpIHsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBQYXJzZSgibWVzc2FnZSBGb28ge1xuIgorICAgICAgICAgICAgIiAgJGEkbWVzc2FnZSAkYiRCYXIkYyQge1xuIgorICAgICAgICAgICAgIiAgICAkZCRtZXNzYWdlICRlJEJheiRmJCB7fSRnJFxuIgorICAgICAgICAgICAgIiAgfSRoJFxuIgorICAgICAgICAgICAgIiAgJGkkbWVzc2FnZSAkaiRRdXgkayQge30kbCRcbiIKKyAgICAgICAgICAgICJ9XG4iKSk7CisKKyAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBiYXIgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkubmVzdGVkX3R5cGUoMCk7CisgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgYmF6ID0gYmFyLm5lc3RlZF90eXBlKDApOworICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHF1eCA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5uZXN0ZWRfdHlwZSgxKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2gnLCBiYXIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdnJywgYmF6KSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnZicsIGJheiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2knLCAnbCcsIHF1eCkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdqJywgJ2snLCBxdXgsICJuYW1lIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgR3JvdXBzKSB7CisgIEVYUEVDVF9UUlVFKAorICAgICAgUGFyc2UoIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICAgICAgICIgIG1lc3NhZ2UgQmFyIHt9XG4iCisgICAgICAgICAgICAiICAkYSRvcHRpb25hbCRiJCAkYyRncm91cCRkJCAkZSRCYXokZiQgPSAkZyQxJGgkIHtcbiIKKyAgICAgICAgICAgICIgICAgJGkkbWVzc2FnZSBRdXgge30kaiRcbiIKKyAgICAgICAgICAgICIgIH0kayRcbiIKKyAgICAgICAgICAgICJ9XG4iKSk7CisKKyAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBiYXIgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkubmVzdGVkX3R5cGUoMCk7CisgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgYmF6ID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLm5lc3RlZF90eXBlKDEpOworICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHF1eCA9IGJhei5uZXN0ZWRfdHlwZSgwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmZpZWxkKDApOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaycsIGZpZWxkKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnYicsIGZpZWxkLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2MnLCAnZCcsIGZpZWxkLCAidHlwZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdmJywgZmllbGQsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2YnLCBmaWVsZCwgInR5cGVfbmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZycsICdoJywgZmllbGQsICJudW1iZXIiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdrJywgYmF6KSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnZicsIGJheiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2knLCAnaicsIHF1eCkpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihxdXgsICJuYW1lIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIEVudW1zKSB7CisgIEVYUEVDVF9UUlVFKAorICAgICAgUGFyc2UoIiRhJGVudW0gJGIkRm9vJGMkIHt9JGQkXG4iCisgICAgICAgICAgICAiJGUkZW51bSAkZiRCYXIkZyQge30kaCRcbiIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2QnLCBmaWxlXy5lbnVtX3R5cGUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgZmlsZV8uZW51bV90eXBlKDApLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdoJywgZmlsZV8uZW51bV90eXBlKDEpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnZycsIGZpbGVfLmVudW1fdHlwZSgxKSwgIm5hbWUiKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgRW51bVZhbHVlcykgeworICBFWFBFQ1RfVFJVRSgKKyAgICAgIFBhcnNlKCJlbnVtIEZvbyB7XG4iCisgICAgICAgICAgICAiICAkYSRCQVIkYiQgPSAkYyQxJGQkOyRlJFxuIgorICAgICAgICAgICAgIiAgJGYkQkFaJGckID0gJGgkMiRpJDskaiRcbiIKKyAgICAgICAgICAgICJ9IikpOworCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgYmFyID0gZmlsZV8uZW51bV90eXBlKDApLnZhbHVlKDApOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGJheiA9IGZpbGVfLmVudW1fdHlwZSgwKS52YWx1ZSgxKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2UnLCBiYXIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdiJywgYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYycsICdkJywgYmFyLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2onLCBiYXopKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZicsICdnJywgYmF6LCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignaCcsICdpJywgYmF6LCAibnVtYmVyIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKSwgIm5hbWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgRW51bVJlc2VydmVkUmFuZ2UpIHsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBQYXJzZSgiZW51bSBUZXN0RW51bSB7XG4iCisgICAgICAgICAgICAiICAkYSRyZXNlcnZlZCAkYiQxJGMkIHRvICRkJDEwJGUkOyRmJFxuIgorICAgICAgICAgICAgIn0iKSk7CisKKyAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90bzo6RW51bVJlc2VydmVkUmFuZ2UmIGJhciA9CisgICAgICBmaWxlXy5lbnVtX3R5cGUoMCkucmVzZXJ2ZWRfcmFuZ2UoMCk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdmJywgZmlsZV8uZW51bV90eXBlKDApLCAicmVzZXJ2ZWRfcmFuZ2UiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnZScsIGJhcikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBiYXIsICJzdGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdlJywgYmFyLCAiZW5kIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKSwgIm5hbWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgRW51bVJlc2VydmVkTmFtZSkgeworICBFWFBFQ1RfVFJVRSgKKyAgICAgIFBhcnNlKCJlbnVtIFRlc3RFbnVtIHtcbiIKKyAgICAgICAgICAgICIgICRhJHJlc2VydmVkICRiJCdmb28nJGMkOyRkJFxuIgorICAgICAgICAgICAgIn0iKSk7CisKKyAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgYmFyID0gZmlsZV8uZW51bV90eXBlKDApOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnZCcsIGJhciwgInJlc2VydmVkX25hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGJhciwgInJlc2VydmVkX25hbWUiLCAwKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApLCAibmFtZSIpKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBOZXN0ZWRFbnVtcykgeworICBFWFBFQ1RfVFJVRSgKKyAgICAgIFBhcnNlKCJtZXNzYWdlIEZvbyB7XG4iCisgICAgICAgICAgICAiICAkYSRlbnVtICRiJEJhciRjJCB7fSRkJFxuIgorICAgICAgICAgICAgIiAgJGUkZW51bSAkZiRCYXokZyQge30kaCRcbiIKKyAgICAgICAgICAgICJ9XG4iKSk7CisKKyAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgYmFyID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmVudW1fdHlwZSgwKTsKKyAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgYmF6ID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmVudW1fdHlwZSgxKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2QnLCBiYXIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdoJywgYmF6KSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnZycsIGJheiwgIm5hbWUiKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBTZXJ2aWNlcykgeworICBFWFBFQ1RfVFJVRSgKKyAgICAgIFBhcnNlKCIkYSRzZXJ2aWNlICRiJEZvbyRjJCB7fSRkJFxuIgorICAgICAgICAgICAgIiRlJHNlcnZpY2UgJGYkQmFyJGckIHt9JGgkXG4iKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdkJywgZmlsZV8uc2VydmljZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBmaWxlXy5zZXJ2aWNlKDApLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdoJywgZmlsZV8uc2VydmljZSgxKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCBmaWxlXy5zZXJ2aWNlKDEpLCAibmFtZSIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBNZXRob2RzQW5kU3RyZWFtcykgeworICBFWFBFQ1RfVFJVRSgKKyAgICAgIFBhcnNlKCJzZXJ2aWNlIEZvbyB7XG4iCisgICAgICAgICAgICAiICAkYSRycGMgJGIkQmFyJGMkKCRkJFgkZSQpIHJldHVybnMoJGYkWSRnJCk7JGgkIgorICAgICAgICAgICAgIiAgJGkkcnBjICRqJEJheiRrJCgkbCRaJG0kKSByZXR1cm5zKCRuJFckbyQpOyRwJCIKKyAgICAgICAgICAgICJ9IikpOworCisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgYmFyID0gZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCk7CisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgYmF6ID0gZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdoJywgYmFyKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGJhciwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZScsIGJhciwgImlucHV0X3R5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnZycsIGJhciwgIm91dHB1dF90eXBlIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2knLCAncCcsIGJheikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdqJywgJ2snLCBiYXosICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdsJywgJ20nLCBiYXosICJpbnB1dF90eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCduJywgJ28nLCBiYXosICJvdXRwdXRfdHlwZSIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKSwgIm5hbWUiKSk7Cit9CisKKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBPcHRpb25zKSB7CisgIEVYUEVDVF9UUlVFKAorICAgICAgUGFyc2UoIiRhJG9wdGlvbiAkYiRmb28kYyQuJGQkKCRlJGJhci5iYXokZiQpJGckID0gIgorICAgICAgICAgICAgIiRoJDEyMyRpJDskaiRcbiIKKyAgICAgICAgICAgICIkayRvcHRpb24gcXV4ID0gJGwkLTEyMyRtJDskbiRcbiIKKyAgICAgICAgICAgICIkbyRvcHRpb24gY29yZ2UgPSAkcCRhYmMkcSQ7JHIkXG4iCisgICAgICAgICAgICAiJHMkb3B0aW9uIGdyYXVsdCA9ICR0JCdibGFoJyR1JDskdiRcbiIKKyAgICAgICAgICAgICIkdyRvcHRpb24gZ2FycGx5ID0gJHgkeyB5YWRkYSB5YWRkYSB9JHkkOyR6JFxuIgorICAgICAgICAgICAgIiQwJG9wdGlvbiB3YWxkbyA9ICQxJDEyMy4wJDIkOyQzJFxuIikpOworCisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbjEgPSBmaWxlXy5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbjIgPSBmaWxlXy5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMSk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbjMgPSBmaWxlXy5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMik7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbjQgPSBmaWxlXy5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMyk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbjUgPSBmaWxlXy5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oNCk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbjYgPSBmaWxlXy5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oNSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdqJywgZmlsZV8ub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaicsIG9wdGlvbjEpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdnJywgb3B0aW9uMSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIG9wdGlvbjEubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBvcHRpb24xLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZycsIG9wdGlvbjEubmFtZSgxKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2YnLCBvcHRpb24xLm5hbWUoMSksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2gnLCAnaScsIG9wdGlvbjEsICJwb3NpdGl2ZV9pbnRfdmFsdWUiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignaycsICduJywgZmlsZV8ub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2wnLCAnbScsIG9wdGlvbjIsICJuZWdhdGl2ZV9pbnRfdmFsdWUiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignbycsICdyJywgZmlsZV8ub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ3AnLCAncScsIG9wdGlvbjMsICJpZGVudGlmaWVyX3ZhbHVlIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ3MnLCAndicsIGZpbGVfLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCd0JywgJ3UnLCBvcHRpb240LCAic3RyaW5nX3ZhbHVlIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ3cnLCAneicsIGZpbGVfLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCd4JywgJ3knLCBvcHRpb241LCAiYWdncmVnYXRlX3ZhbHVlIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJzAnLCAnMycsIGZpbGVfLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCcxJywgJzInLCBvcHRpb242LCAiZG91YmxlX3ZhbHVlIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24zKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uNCkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjUpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb242KSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMywgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uNCwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uNSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uNiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMi5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMy5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uNC5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uNS5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uNi5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMi5uYW1lKDApLCAibmFtZV9wYXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjMubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb240Lm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uNS5uYW1lKDApLCAibmFtZV9wYXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjYubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBTY29wZWRPcHRpb25zKSB7CisgIEVYUEVDVF9UUlVFKAorICAgICAgUGFyc2UoIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICAgICAgICIgICRhJG9wdGlvbiBtb3B0ID0gMTskYiRcbiIKKyAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAiZW51bSBCYXIge1xuIgorICAgICAgICAgICAgIiAgJGMkb3B0aW9uIGVvcHQgPSAxOyRkJFxuIgorICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICJzZXJ2aWNlIEJheiB7XG4iCisgICAgICAgICAgICAiICAkZSRvcHRpb24gc29wdCA9IDE7JGYkXG4iCisgICAgICAgICAgICAiICBycGMgTShYKSByZXR1cm5zKFkpIHtcbiIKKyAgICAgICAgICAgICIgICAgJGckb3B0aW9uIG1vcHQgPSAxOyRoJFxuIgorICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgIiAgcnBjIE1TNCgkMSRzdHJlYW0kMiQgWCkgcmV0dXJucygkMyRzdHJlYW0kNCQgWSkge1xuIgorICAgICAgICAgICAgIiAgICAkayRvcHRpb24gbW9wdCA9IDE7JGwkXG4iCisgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAifVxuIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnYicsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYycsICdkJywgZmlsZV8uZW51bV90eXBlKDApLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2YnLCBmaWxlXy5zZXJ2aWNlKDApLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdnJywgJ2gnLCBmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKS5vcHRpb25zKCkpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCkpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKS5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCkub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCksCisgICAgICAgICAgICAgICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKSwKKyAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpdmVfaW50X3ZhbHVlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKSkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgSGFzU3BhbihmaWxlXy5lbnVtX3R5cGUoMCkub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKS5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSwKKyAgICAgICAgICAgICAgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5lbnVtX3R5cGUoMCkub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLAorICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGl2ZV9pbnRfdmFsdWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCkpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigKKyAgICAgIGZpbGVfLnNlcnZpY2UoMCkub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCksCisgICAgICAgICAgICAgICAgICAgICAgInBvc2l0aXZlX2ludF92YWx1ZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCksICJpbnB1dF90eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApLCAib3V0cHV0X3R5cGUiKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKS5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigKKyAgICAgIGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oCisgICAgICBmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKS5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKAorICAgICAgZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCkub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCksCisgICAgICAibmFtZV9wYXJ0IikpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCkub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLAorICAgICAgICAgICAgICAicG9zaXRpdmVfaW50X3ZhbHVlIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2snLCAnbCcsIGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDEpLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDEpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMSksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDEpLCAiaW5wdXRfdHlwZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKSwgIm91dHB1dF90eXBlIikpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMSkub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oCisgICAgICBmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKS5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKAorICAgICAgZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMSkub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigKKyAgICAgIGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDEpLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKS5uYW1lKDApLAorICAgICAgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDEpLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKSwKKyAgICAgICAgICAgICAgInBvc2l0aXZlX2ludF92YWx1ZSIpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBIYXNTcGFuKCcxJywgJzInLCBmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKSwgImNsaWVudF9zdHJlYW1pbmciKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgSGFzU3BhbignMycsICc0JywgZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMSksICJzZXJ2ZXJfc3RyZWFtaW5nIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIEZpZWxkT3B0aW9ucykgeworICAvLyBUaGUgYWN0dWFsICJuYW1lID0gdmFsdWUiIHBhaXJzIGFyZSBwYXJzZWQgYnkgdGhlIHNhbWUgY29kZSBhcyBmb3IKKyAgLy8gdG9wLWxldmVsIG9wdGlvbnMgc28gd2Ugd29uJ3QgcmUtdGVzdCB0aGF0IC0tIGp1c3QgbWFrZSBzdXJlIHRoYXQgdGhlCisgIC8vIHN5bnRheCB1c2VkIGZvciBmaWVsZCBvcHRpb25zIGlzIHVuZGVyc3Rvb2QuCisgIEVYUEVDVF9UUlVFKAorICAgICAgUGFyc2UoIm1lc3NhZ2UgRm9vIHsiCisgICAgICAgICAgICAiICBvcHRpb25hbCBpbnQzMiBiYXIgPSAxICIKKyAgICAgICAgICAgICIkYSRbZGVmYXVsdD0kYiQxMjMkYyQsJGQkb3B0MT0xMjMkZSQsIgorICAgICAgICAgICAgIiRmJG9wdDI9J2hpJyRnJF0kaCQ7IgorICAgICAgICAgICAgIn1cbiIpKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMCk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbjEgPSBmaWVsZC5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbjIgPSBmaWVsZC5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdoJywgZmllbGQub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGZpZWxkLCAiZGVmYXVsdF92YWx1ZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdlJywgb3B0aW9uMSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCBvcHRpb24yKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZCkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQsICJ0eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZCwgIm51bWJlciIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24xLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24xLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24xLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMi5uYW1lKDApLCAibmFtZV9wYXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjEsICJwb3NpdGl2ZV9pbnRfdmFsdWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMiwgInN0cmluZ192YWx1ZSIpKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBFbnVtVmFsdWVPcHRpb25zKSB7CisgIC8vIFRoZSBhY3R1YWwgIm5hbWUgPSB2YWx1ZSIgcGFpcnMgYXJlIHBhcnNlZCBieSB0aGUgc2FtZSBjb2RlIGFzIGZvcgorICAvLyB0b3AtbGV2ZWwgb3B0aW9ucyBzbyB3ZSB3b24ndCByZS10ZXN0IHRoYXQgLS0ganVzdCBtYWtlIHN1cmUgdGhhdCB0aGUKKyAgLy8gc3ludGF4IHVzZWQgZm9yIGVudW0gb3B0aW9ucyBpcyB1bmRlcnN0b29kLgorICBFWFBFQ1RfVFJVRSgKKyAgICAgIFBhcnNlKCJlbnVtIEZvbyB7IgorICAgICAgICAgICAgIiAgQkFSID0gMSAkYSRbJGIkb3B0MT0xMjMkYyQsJGQkb3B0Mj0naGknJGUkXSRmJDsiCisgICAgICAgICAgICAifVxuIikpOworCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgdmFsdWUgPSBmaWxlXy5lbnVtX3R5cGUoMCkudmFsdWUoMCk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbjEgPSB2YWx1ZS5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbjIgPSB2YWx1ZS5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdmJywgdmFsdWUub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIG9wdGlvbjEpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdlJywgb3B0aW9uMikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4odmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3Bhbih2YWx1ZSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4odmFsdWUsICJudW1iZXIiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMS5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMi5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMS5uYW1lKDApLCAibmFtZV9wYXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjIubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24xLCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjIsICJzdHJpbmdfdmFsdWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgRG9jQ29tbWVudHMpIHsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBQYXJzZSgiLy8gRm9vIGxlYWRpbmdcbiIKKyAgICAgICAgICAgICIvLyBsaW5lIDJcbiIKKyAgICAgICAgICAgICIkYSRtZXNzYWdlIEZvbyB7XG4iCisgICAgICAgICAgICAiICAvLyBGb28gdHJhaWxpbmdcbiIKKyAgICAgICAgICAgICIgIC8vIGxpbmUgMlxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIiAgLy8gZGV0YWNoZWRcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICIgIC8vIGJhciBsZWFkaW5nXG4iCisgICAgICAgICAgICAiICAkYiRvcHRpb25hbCBpbnQzMiBiYXIgPSAxOyRjJFxuIgorICAgICAgICAgICAgIiAgLy8gYmFyIHRyYWlsaW5nXG4iCisgICAgICAgICAgICAifSRkJFxuIgorICAgICAgICAgICAgIi8vIGlnbm9yZWRcbiIpKTsKKworICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZvbyA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGJhciA9IGZvby5maWVsZCgwKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuV2l0aENvbW1lbnQoJ2EnLCAnZCcsIGZvbywgIiBGb28gbGVhZGluZ1xuIGxpbmUgMlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgRm9vIHRyYWlsaW5nXG4gbGluZSAyXG4iLCBudWxscHRyKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW5XaXRoQ29tbWVudCgnYicsICdjJywgYmFyLCAiIGJhciBsZWFkaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBiYXIgdHJhaWxpbmdcbiIsICIgZGV0YWNoZWRcbiIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3Bhbihmb28sICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJudW1iZXIiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgRG9jQ29tbWVudHMyKSB7CisgIEVYUEVDVF9UUlVFKAorICAgICAgUGFyc2UoIi8vIGRldGFjaGVkIGJlZm9yZSBtZXNzYWdlLlxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIi8vIEZvbyBsZWFkaW5nXG4iCisgICAgICAgICAgICAiLy8gbGluZSAyXG4iCisgICAgICAgICAgICAiJGEkbWVzc2FnZSBGb28ge1xuIgorICAgICAgICAgICAgIiAgLyogRm9vIHRyYWlsaW5nXG4iCisgICAgICAgICAgICAiICAgKiBsaW5lIDIgKi9cbiIKKyAgICAgICAgICAgICIgIC8vIGRldGFjaGVkXG4iCisgICAgICAgICAgICAiICAvKiBiYXIgbGVhZGluZ1xuIgorICAgICAgICAgICAgIiAgICovIgorICAgICAgICAgICAgIiAgJGIkb3B0aW9uYWwgaW50MzIgYmFyID0gMTskYyQgIC8vIGJhciB0cmFpbGluZ1xuIgorICAgICAgICAgICAgIiAgLy8gaWdub3JlZCBkZXRhY2hlZFxuIgorICAgICAgICAgICAgIn0kZCRcbiIKKyAgICAgICAgICAgICIvLyBpZ25vcmVkXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiLy8gZGV0YWNoZWQgYmVmb3JlIG9wdGlvblxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIi8vIG9wdGlvbiBsZWFkaW5nXG4iCisgICAgICAgICAgICAiJGUkb3B0aW9uIGJheiA9IDEyMzskZiRcbiIKKyAgICAgICAgICAgICIvLyBvcHRpb24gdHJhaWxpbmdcbiIpKTsKKworICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZvbyA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGJhciA9IGZvby5maWVsZCgwKTsKKyAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgYmF6ID0gZmlsZV8ub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW5XaXRoQ29tbWVudCgnYScsICdkJywgZm9vLCAiIEZvbyBsZWFkaW5nXG4gbGluZSAyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBGb28gdHJhaWxpbmdcbiBsaW5lIDIgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGV0YWNoZWQgYmVmb3JlIG1lc3NhZ2UuXG4iKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW5XaXRoQ29tbWVudCgnYicsICdjJywgYmFyLCAiIGJhciBsZWFkaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBiYXIgdHJhaWxpbmdcbiIsICIgZGV0YWNoZWRcbiIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbldpdGhDb21tZW50KCdlJywgJ2YnLCBiYXosICIgb3B0aW9uIGxlYWRpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9wdGlvbiB0cmFpbGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGV0YWNoZWQgYmVmb3JlIG9wdGlvblxuIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZvbywgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAidHlwZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgIm51bWJlciIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXosICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhei5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmF6Lm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmF6LCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIERvY0NvbW1lbnRzMykgeworICBFWFBFQ1RfVFJVRSgKKyAgICAgIFBhcnNlKCIkYSRtZXNzYWdlIEZvbyB7XG4iCisgICAgICAgICAgICAiICAvLyBiYXIgbGVhZGluZ1xuIgorICAgICAgICAgICAgIiAgJGIkb3B0aW9uYWwgaW50MzIgYmFyID0gMSBbKGJhei5xdXgpID0ge31dOyRjJFxuIgorICAgICAgICAgICAgIiAgLy8gYmFyIHRyYWlsaW5nXG4iCisgICAgICAgICAgICAifSRkJFxuIgorICAgICAgICAgICAgIi8vIGlnbm9yZWRcbiIpKTsKKworICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZvbyA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGJhciA9IGZvby5maWVsZCgwKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuV2l0aENvbW1lbnQoJ2InLCAnYycsIGJhciwgIiBiYXIgbGVhZGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYmFyIHRyYWlsaW5nXG4iLCBudWxscHRyKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZm9vKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZm9vLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJsYWJlbCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJ0eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhci5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKS5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgSGFzU3BhbihiYXIub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgSGFzU3BhbihiYXIub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLCAiYWdncmVnYXRlX3ZhbHVlIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIERvY0NvbW1lbnRzVG9wTGV2ZWwpIHsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBQYXJzZSgiLy8gZGV0YWNoZWQgYmVmb3JlIHN5bnRheCBwYXJhZ3JhcGggMVxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIi8vIGRldGFjaGVkIGJlZm9yZSBzeW50YXggcGFyYWdyYXBoIDJcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICIvLyBzeW50YXggbGVhZGluZ1xuIgorICAgICAgICAgICAgIiRhJHN5bnRheCA9IFwicHJvdG8yXCI7JGIkXG4iCisgICAgICAgICAgICAiLy8gc3ludGF4IHRyYWlsaW5nXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiLy8gc3ludGF4LXBhY2thZ2UgZGV0YWNoZWQgY29tbWVudHNcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICI7XG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiLy8gZGV0YWNoZWQgYWZ0ZXIgZW1wdHkgYmVmb3JlIHBhY2thZ2VcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICIvLyBwYWNrYWdlIGxlYWRpbmdcbiIKKyAgICAgICAgICAgICIkYyRwYWNrYWdlIGZvbzskZCRcbiIKKyAgICAgICAgICAgICIvLyBwYWNrYWdlIHRyYWlsaW5nXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiLy8gaWdub3JlZCBkZXRhY2hcbiIKKyAgICAgICAgICAgICJcbiIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2InLCBmaWxlXywgInN5bnRheCIsIC0xLCAiIHN5bnRheCBsZWFkaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICIgc3ludGF4IHRyYWlsaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICIgZGV0YWNoZWQgYmVmb3JlIHN5bnRheCBwYXJhZ3JhcGggMVxuIgorICAgICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiIGRldGFjaGVkIGJlZm9yZSBzeW50YXggcGFyYWdyYXBoIDJcbiIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYycsICdkJywgZmlsZV8sICJwYWNrYWdlIiwgLTEsICIgcGFja2FnZSBsZWFkaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICIgcGFja2FnZSB0cmFpbGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAiIHN5bnRheC1wYWNrYWdlIGRldGFjaGVkIGNvbW1lbnRzXG4iCisgICAgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICIgZGV0YWNoZWQgYWZ0ZXIgZW1wdHkgYmVmb3JlIHBhY2thZ2VcbiIpKTsKKworICAvLyBpZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBEb2NDb21tZW50c09uZW9mKSB7CisgIEVYUEVDVF9UUlVFKAorICAgICAgUGFyc2UoIi8vIEZvbyBsZWFkaW5nXG4iCisgICAgICAgICAgICAiJGEkbWVzc2FnZSBGb28ge1xuIgorICAgICAgICAgICAgIiAgLyogRm9vIHRyYWlsaW5nXG4iCisgICAgICAgICAgICAiICAgKi9cbiIKKyAgICAgICAgICAgICIgIC8vIGRldGFjaGVkIGJlZm9yZSBvbmVvZlxuIgorICAgICAgICAgICAgIiAgLyogYmFyIGxlYWRpbmdcbiIKKyAgICAgICAgICAgICIgICAqIGxpbmUgMiAqL1xuIgorICAgICAgICAgICAgIiAgJGIkb25lb2YgYmFyIHtcbiIKKyAgICAgICAgICAgICIgIC8qIGJhciB0cmFpbGluZ1xuIgorICAgICAgICAgICAgIiAgICogbGluZSAyICovXG4iCisgICAgICAgICAgICAiICAvLyBkZXRhY2hlZCBiZWZvcmUgYmFyX2ludFxuIgorICAgICAgICAgICAgIiAgLyogYmFyX2ludCBsZWFkaW5nXG4iCisgICAgICAgICAgICAiICAgKi9cbiIKKyAgICAgICAgICAgICIgICRjJGludDMyIGJhcl9pbnQgPSAxOyRkJCAgLy8gYmFyX2ludCB0cmFpbGluZ1xuIgorICAgICAgICAgICAgIiAgLy8gZGV0YWNoIGNvbW1lbnQgaWdub3JlZFxuIgorICAgICAgICAgICAgIiAgfSRlJFxuIgorICAgICAgICAgICAgIn0kZiRcbiIpKTsKKworICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZvbyA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKTsKKyAgY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIGJhciA9IGZvby5vbmVvZl9kZWNsKDApOworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgYmFyX2ludCA9IGZvby5maWVsZCgwKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuV2l0aENvbW1lbnQoJ2EnLCAnZicsIGZvbywgIiBGb28gbGVhZGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgRm9vIHRyYWlsaW5nXG4iLCBudWxscHRyKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW5XaXRoQ29tbWVudCgnYicsICdlJywgYmFyLCAiIGJhciBsZWFkaW5nXG4gbGluZSAyICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJhciB0cmFpbGluZ1xuIGxpbmUgMiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkZXRhY2hlZCBiZWZvcmUgb25lb2ZcbiIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbldpdGhDb21tZW50KCdjJywgJ2QnLCBiYXJfaW50LCAiIGJhcl9pbnQgbGVhZGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYmFyX2ludCB0cmFpbGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGV0YWNoZWQgYmVmb3JlIGJhcl9pbnRcbiIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3Bhbihmb28sICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyX2ludCwgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyX2ludCwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyX2ludCwgIm51bWJlciIpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BocC9waHBfZ2VuZXJhdG9yLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9waHAvcGhwX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2FhOTJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9waHAvcGhwX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI0MjYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BocC9waHBfZ2VuZXJhdG9yLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworY29uc3Qgc3RkOjpzdHJpbmcga0Rlc2NyaXB0b3JGaWxlID0gImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtFbXB0eUZpbGUgPSAiZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvIjsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtFbXB0eU1ldGFkYXRhRmlsZSA9ICJHUEJNZXRhZGF0YS9Hb29nbGUvUHJvdG9idWYvR1BCRW1wdHkucGhwIjsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtEZXNjcmlwdG9yTWV0YWRhdGFGaWxlID0KKyAgICAiR1BCTWV0YWRhdGEvR29vZ2xlL1Byb3RvYnVmL0ludGVybmFsL0Rlc2NyaXB0b3IucGhwIjsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtEZXNjcmlwdG9yRGlyTmFtZSA9ICJHb29nbGUvUHJvdG9idWYvSW50ZXJuYWwiOworY29uc3Qgc3RkOjpzdHJpbmcga0Rlc2NyaXB0b3JQYWNrYWdlTmFtZSA9ICJHb29nbGVcXFByb3RvYnVmXFxJbnRlcm5hbCI7Citjb25zdCBjaGFyKiBjb25zdCBrUmVzZXJ2ZWROYW1lc1tdID0geworICAgICJhYnN0cmFjdCIsICAgICAiYW5kIiwgICAgICAgICJhcnJheSIsICAgICAgICAiYXMiLCAgICAgICAgICJicmVhayIsCisgICAgImNhbGxhYmxlIiwgICAgICJjYXNlIiwgICAgICAgImNhdGNoIiwgICAgICAgICJjbGFzcyIsICAgICAgImNsb25lIiwKKyAgICAiY29uc3QiLCAgICAgICAgImNvbnRpbnVlIiwgICAiZGVjbGFyZSIsICAgICAgImRlZmF1bHQiLCAgICAiZGllIiwKKyAgICAiZG8iLCAgICAgICAgICAgImVjaG8iLCAgICAgICAiZWxzZSIsICAgICAgICAgImVsc2VpZiIsICAgICAiZW1wdHkiLAorICAgICJlbmRkZWNsYXJlIiwgICAiZW5kZm9yIiwgICAgICJlbmRmb3JlYWNoIiwgICAiZW5kaWYiLCAgICAgICJlbmRzd2l0Y2giLAorICAgICJlbmR3aGlsZSIsICAgICAiZXZhbCIsICAgICAgICJleGl0IiwgICAgICAgICAiZXh0ZW5kcyIsICAgICJmaW5hbCIsCisgICAgImZpbmFsbHkiLCAgICAgICJmbiIsICAgICAgICAgImZvciIsICAgICAgICAgICJmb3JlYWNoIiwgICAgImZ1bmN0aW9uIiwKKyAgICAiZ2xvYmFsIiwgICAgICAgImdvdG8iLCAgICAgICAiaWYiLCAgICAgICAgICAgImltcGxlbWVudHMiLCAiaW5jbHVkZSIsCisgICAgImluY2x1ZGVfb25jZSIsICJpbnN0YW5jZW9mIiwgImluc3RlYWRvZiIsICAgICJpbnRlcmZhY2UiLCAgImlzc2V0IiwKKyAgICAibGlzdCIsICAgICAgICAgIm1hdGNoIiwgICAgICAibmFtZXNwYWNlIiwgICAgIm5ldyIsICAgICAgICAib3IiLAorICAgICJwYXJlbnQiLCAgICAgICAicHJpbnQiLCAgICAgICJwcml2YXRlIiwgICAgICAicHJvdGVjdGVkIiwgICJwdWJsaWMiLAorICAgICJyZWFkb25seSIsICAgICAicmVxdWlyZSIsICAgICJyZXF1aXJlX29uY2UiLCAicmV0dXJuIiwgICAgICJzZWxmIiwKKyAgICAic3RhdGljIiwgICAgICAgInN3aXRjaCIsICAgICAidGhyb3ciLCAgICAgICAgInRyYWl0IiwgICAgICAidHJ5IiwKKyAgICAidW5zZXQiLCAgICAgICAgInVzZSIsICAgICAgICAidmFyIiwgICAgICAgICAgIndoaWxlIiwgICAgICAieG9yIiwKKyAgICAieWllbGQiLCAgICAgICAgImludCIsICAgICAgICAiZmxvYXQiLCAgICAgICAgImJvb2wiLCAgICAgICAic3RyaW5nIiwKKyAgICAidHJ1ZSIsICAgICAgICAgImZhbHNlIiwgICAgICAibnVsbCIsICAgICAgICAgInZvaWQiLCAgICAgICAiaXRlcmFibGUifTsKK2NvbnN0IGNoYXIqIGNvbnN0IGtWYWxpZENvbnN0YW50TmFtZXNbXSA9IHsKKyAgICAiaW50IiwgICAiZmxvYXQiLCAiYm9vbCIsICJzdHJpbmciLCAgICJ0cnVlIiwKKyAgICAiZmFsc2UiLCAibnVsbCIsICAidm9pZCIsICJpdGVyYWJsZSIsICJwYXJlbnQiLAorICAgICJzZWxmIiwgInJlYWRvbmx5IgorfTsKK2NvbnN0IGludCBrUmVzZXJ2ZWROYW1lc1NpemUgPSA4MDsKK2NvbnN0IGludCBrVmFsaWRDb25zdGFudE5hbWVzU2l6ZSA9IDEyOworY29uc3QgaW50IGtGaWVsZFNldHRlciA9IDE7Citjb25zdCBpbnQga0ZpZWxkR2V0dGVyID0gMjsKK2NvbnN0IGludCBrRmllbGRQcm9wZXJ0eSA9IDM7CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgcGhwIHsKKworc3RydWN0IE9wdGlvbnMgeworICBib29sIGlzX2Rlc2NyaXB0b3IgPSBmYWxzZTsKKyAgYm9vbCBhZ2dyZWdhdGVfbWV0YWRhdGEgPSBmYWxzZTsKKyAgYm9vbCBnZW5fY193a3QgPSBmYWxzZTsKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGFnZ3JlZ2F0ZV9tZXRhZGF0YV9wcmVmaXhlczsKK307CisKK25hbWVzcGFjZSB7CisKKy8vIEZvcndhcmQgZGVjbHMuCitzdGQ6OnN0cmluZyBQaHBOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsX25hbWUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworc3RkOjpzdHJpbmcgSW50VG9TdHJpbmcoaW50MzJfdCB2YWx1ZSk7CitzdGQ6OnN0cmluZyBGaWxlbmFtZVRvQ2xhc3NuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSk7CitzdGQ6OnN0cmluZyBHZW5lcmF0ZWRNZXRhZGF0YUZpbGVOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKK3N0ZDo6c3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FwX2ZpcnN0X2xldHRlcik7Cit2b2lkIEluZGVudChpbzo6UHJpbnRlciogcHJpbnRlcik7Cit2b2lkIE91dGRlbnQoaW86OlByaW50ZXIqIHByaW50ZXIpOwordm9pZCBHZW5lcmF0ZUFkZEZpbGVzVG9Qb29sKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKTsKK3ZvaWQgR2VuZXJhdGVNZXNzYWdlRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKK3ZvaWQgR2VuZXJhdGVNZXNzYWdlQ29uc3RydWN0b3JEb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwordm9pZCBHZW5lcmF0ZUZpZWxkRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgaW50IGZ1bmN0aW9uX3R5cGUpOwordm9pZCBHZW5lcmF0ZVdyYXBwZXJGaWVsZEdldHRlckRvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKK3ZvaWQgR2VuZXJhdGVXcmFwcGVyRmllbGRTZXR0ZXJEb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7Cit2b2lkIEdlbmVyYXRlRW51bURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKK3ZvaWQgR2VuZXJhdGVFbnVtVmFsdWVEb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpOwordm9pZCBHZW5lcmF0ZVNlcnZpY2VEb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlKTsKK3ZvaWQgR2VuZXJhdGVTZXJ2aWNlTWV0aG9kRG9jQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCk7CisKK3N0ZDo6c3RyaW5nIFJlc2VydmVkTmFtZVByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgY2xhc3NuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICBib29sIGlzX3Jlc2VydmVkID0gZmFsc2U7CisKKyAgc3RkOjpzdHJpbmcgbG93ZXIgPSBjbGFzc25hbWU7CisgIHN0ZDo6dHJhbnNmb3JtKGxvd2VyLmJlZ2luKCksIGxvd2VyLmVuZCgpLCBsb3dlci5iZWdpbigpLCA6OnRvbG93ZXIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga1Jlc2VydmVkTmFtZXNTaXplOyBpKyspIHsKKyAgICBpZiAobG93ZXIgPT0ga1Jlc2VydmVkTmFtZXNbaV0pIHsKKyAgICAgIGlzX3Jlc2VydmVkID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChpc19yZXNlcnZlZCkgeworICAgIGlmIChmaWxlLT5wYWNrYWdlKCkgPT0gImdvb2dsZS5wcm90b2J1ZiIpIHsKKyAgICAgIHJldHVybiAiR1BCIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJQQiI7CisgICAgfQorICB9CisKKyAgcmV0dXJuICIiOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclR5cGU+CitzdGQ6OnN0cmluZyBEZXNjcmlwdG9yRnVsbE5hbWUoY29uc3QgRGVzY3JpcHRvclR5cGUqIGRlc2MsIGJvb2wgaXNfaW50ZXJuYWwpIHsKKyAgaWYgKGlzX2ludGVybmFsKSB7CisgICAgcmV0dXJuIFN0cmluZ1JlcGxhY2UoZGVzYy0+ZnVsbF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1ZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCIsIGZhbHNlKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZGVzYy0+ZnVsbF9uYW1lKCk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUeXBlPgorc3RkOjpzdHJpbmcgQ2xhc3NOYW1lUHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiBjbGFzc25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclR5cGUqIGRlc2MpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCA9IChkZXNjLT5maWxlKCktPm9wdGlvbnMoKSkucGhwX2NsYXNzX3ByZWZpeCgpOworICBpZiAoIXByZWZpeC5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHByZWZpeDsKKyAgfQorCisgIHJldHVybiBSZXNlcnZlZE5hbWVQcmVmaXgoY2xhc3NuYW1lLCBkZXNjLT5maWxlKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclR5cGU+CitzdGQ6OnN0cmluZyBHZW5lcmF0ZWRDbGFzc05hbWVJbXBsKGNvbnN0IERlc2NyaXB0b3JUeXBlKiBkZXNjKSB7CisgIHN0ZDo6c3RyaW5nIGNsYXNzbmFtZSA9IENsYXNzTmFtZVByZWZpeChkZXNjLT5uYW1lKCksIGRlc2MpICsgZGVzYy0+bmFtZSgpOworICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nID0gZGVzYy0+Y29udGFpbmluZ190eXBlKCk7CisgIHdoaWxlIChjb250YWluaW5nICE9IE5VTEwpIHsKKyAgICBjbGFzc25hbWUgPSBDbGFzc05hbWVQcmVmaXgoY29udGFpbmluZy0+bmFtZSgpLCBkZXNjKSArIGNvbnRhaW5pbmctPm5hbWUoKQorICAgICAgICsgJ1xcJyArIGNsYXNzbmFtZTsKKyAgICBjb250YWluaW5nID0gY29udGFpbmluZy0+Y29udGFpbmluZ190eXBlKCk7CisgIH0KKyAgcmV0dXJuIGNsYXNzbmFtZTsKK30KKworc3RkOjpzdHJpbmcgR2VuZXJhdGVkQ2xhc3NOYW1lSW1wbChjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzYykgeworICBzdGQ6OnN0cmluZyBjbGFzc25hbWUgPSBkZXNjLT5uYW1lKCk7CisgIHJldHVybiBDbGFzc05hbWVQcmVmaXgoY2xhc3NuYW1lLCBkZXNjKSArIGNsYXNzbmFtZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUeXBlPgorc3RkOjpzdHJpbmcgTGVnYWN5R2VuZXJhdGVkQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3JUeXBlKiBkZXNjKSB7CisgIHN0ZDo6c3RyaW5nIGNsYXNzbmFtZSA9IGRlc2MtPm5hbWUoKTsKKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZyA9IGRlc2MtPmNvbnRhaW5pbmdfdHlwZSgpOworICB3aGlsZSAoY29udGFpbmluZyAhPSBOVUxMKSB7CisgICAgY2xhc3NuYW1lID0gY29udGFpbmluZy0+bmFtZSgpICsgJ18nICsgY2xhc3NuYW1lOworICAgIGNvbnRhaW5pbmcgPSBjb250YWluaW5nLT5jb250YWluaW5nX3R5cGUoKTsKKyAgfQorICByZXR1cm4gQ2xhc3NOYW1lUHJlZml4KGNsYXNzbmFtZSwgZGVzYykgKyBjbGFzc25hbWU7Cit9CisKK3N0ZDo6c3RyaW5nIENsYXNzTmFtZVByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgY2xhc3NuYW1lKSB7CisgIHN0ZDo6c3RyaW5nIGxvd2VyID0gY2xhc3NuYW1lOworICBzdGQ6OnRyYW5zZm9ybShsb3dlci5iZWdpbigpLCBsb3dlci5lbmQoKSwgbG93ZXIuYmVnaW4oKSwgOjp0b2xvd2VyKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGtSZXNlcnZlZE5hbWVzU2l6ZTsgaSsrKSB7CisgICAgaWYgKGxvd2VyID09IGtSZXNlcnZlZE5hbWVzW2ldKSB7CisgICAgICByZXR1cm4gIlBCIjsKKyAgICB9CisgIH0KKworICByZXR1cm4gIiI7Cit9CisKK3N0ZDo6c3RyaW5nIENvbnN0YW50TmFtZVByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgY2xhc3NuYW1lKSB7CisgIGJvb2wgaXNfcmVzZXJ2ZWQgPSBmYWxzZTsKKworICBzdGQ6OnN0cmluZyBsb3dlciA9IGNsYXNzbmFtZTsKKyAgc3RkOjp0cmFuc2Zvcm0obG93ZXIuYmVnaW4oKSwgbG93ZXIuZW5kKCksIGxvd2VyLmJlZ2luKCksIDo6dG9sb3dlcik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrUmVzZXJ2ZWROYW1lc1NpemU7IGkrKykgeworICAgIGlmIChsb3dlciA9PSBrUmVzZXJ2ZWROYW1lc1tpXSkgeworICAgICAgaXNfcmVzZXJ2ZWQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVmFsaWRDb25zdGFudE5hbWVzU2l6ZTsgaSsrKSB7CisgICAgaWYgKGxvd2VyID09IGtWYWxpZENvbnN0YW50TmFtZXNbaV0pIHsKKyAgICAgIGlzX3Jlc2VydmVkID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoaXNfcmVzZXJ2ZWQpIHsKKyAgICByZXR1cm4gIlBCIjsKKyAgfQorCisgIHJldHVybiAiIjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUeXBlPgorc3RkOjpzdHJpbmcgUm9vdFBocE5hbWVzcGFjZShjb25zdCBEZXNjcmlwdG9yVHlwZSogZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBpZiAoZGVzYy0+ZmlsZSgpLT5vcHRpb25zKCkuaGFzX3BocF9uYW1lc3BhY2UoKSkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHBfbmFtZXNwYWNlID0gZGVzYy0+ZmlsZSgpLT5vcHRpb25zKCkucGhwX25hbWVzcGFjZSgpOworICAgIGlmICghcGhwX25hbWVzcGFjZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGhwX25hbWVzcGFjZTsKKyAgICB9CisgICAgcmV0dXJuICIiOworICB9CisKKyAgaWYgKCFkZXNjLT5maWxlKCktPnBhY2thZ2UoKS5lbXB0eSgpKSB7CisgICAgcmV0dXJuIFBocE5hbWUoZGVzYy0+ZmlsZSgpLT5wYWNrYWdlKCksIG9wdGlvbnMpOworICB9CisgIHJldHVybiAiIjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUeXBlPgorc3RkOjpzdHJpbmcgRnVsbENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yVHlwZSogZGVzYywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBzdGQ6OnN0cmluZyBjbGFzc25hbWUgPSBHZW5lcmF0ZWRDbGFzc05hbWVJbXBsKGRlc2MpOworICBzdGQ6OnN0cmluZyBwaHBfbmFtZXNwYWNlID0gUm9vdFBocE5hbWVzcGFjZShkZXNjLCBvcHRpb25zKTsKKyAgaWYgKCFwaHBfbmFtZXNwYWNlLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gcGhwX25hbWVzcGFjZSArICJcXCIgKyBjbGFzc25hbWU7CisgIH0KKyAgcmV0dXJuIGNsYXNzbmFtZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUeXBlPgorc3RkOjpzdHJpbmcgRnVsbENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yVHlwZSogZGVzYywgYm9vbCBpc19kZXNjcmlwdG9yKSB7CisgIE9wdGlvbnMgb3B0aW9uczsKKyAgb3B0aW9ucy5pc19kZXNjcmlwdG9yID0gaXNfZGVzY3JpcHRvcjsKKyAgcmV0dXJuIEZ1bGxDbGFzc05hbWUoZGVzYywgb3B0aW9ucyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXNjcmlwdG9yVHlwZT4KK3N0ZDo6c3RyaW5nIExlZ2FjeUZ1bGxDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvclR5cGUqIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgc3RkOjpzdHJpbmcgY2xhc3NuYW1lID0gTGVnYWN5R2VuZXJhdGVkQ2xhc3NOYW1lKGRlc2MpOworICBzdGQ6OnN0cmluZyBwaHBfbmFtZXNwYWNlID0gUm9vdFBocE5hbWVzcGFjZShkZXNjLCBvcHRpb25zKTsKKyAgaWYgKCFwaHBfbmFtZXNwYWNlLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gcGhwX25hbWVzcGFjZSArICJcXCIgKyBjbGFzc25hbWU7CisgIH0KKyAgcmV0dXJuIGNsYXNzbmFtZTsKK30KKworc3RkOjpzdHJpbmcgUGhwTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZnVsbF9uYW1lLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGlmIChvcHRpb25zLmlzX2Rlc2NyaXB0b3IpIHsKKyAgICByZXR1cm4ga0Rlc2NyaXB0b3JQYWNrYWdlTmFtZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHNlZ21lbnQ7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgYm9vbCBjYXBfbmV4dF9sZXR0ZXIgPSB0cnVlOworICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bGxfbmFtZS5zaXplKCk7IGkrKykgeworICAgIGlmICgnYScgPD0gZnVsbF9uYW1lW2ldICYmIGZ1bGxfbmFtZVtpXSA8PSAneicgJiYgY2FwX25leHRfbGV0dGVyKSB7CisgICAgICBzZWdtZW50ICs9IGZ1bGxfbmFtZVtpXSArICgnQScgLSAnYScpOworICAgICAgY2FwX25leHRfbGV0dGVyID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChmdWxsX25hbWVbaV0gPT0gJy4nKSB7CisgICAgICByZXN1bHQgKz0gQ2xhc3NOYW1lUHJlZml4KHNlZ21lbnQpICsgc2VnbWVudCArICdcXCc7CisgICAgICBzZWdtZW50ID0gIiI7CisgICAgICBjYXBfbmV4dF9sZXR0ZXIgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBzZWdtZW50ICs9IGZ1bGxfbmFtZVtpXTsKKyAgICAgIGNhcF9uZXh0X2xldHRlciA9IGZhbHNlOworICAgIH0KKyAgfQorICByZXN1bHQgKz0gQ2xhc3NOYW1lUHJlZml4KHNlZ21lbnQpICsgc2VnbWVudDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgRGVmYXVsdEZvckZpZWxkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOiByZXR1cm4gIjAiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRToKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GTE9BVDogcmV0dXJuICIwLjAiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0w6IHJldHVybiAiZmFsc2UiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzogcmV0dXJuICInJyI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDogcmV0dXJuICJudWxsIjsKKyAgICBkZWZhdWx0OiBhc3NlcnQoZmFsc2UpOyByZXR1cm4gIiI7CisgIH0KK30KKworc3RkOjpzdHJpbmcgR2VuZXJhdGVkTWV0YWRhdGFGaWxlTmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvdG9fZmlsZSA9IGZpbGUtPm5hbWUoKTsKKyAgaW50IHN0YXJ0X2luZGV4ID0gMDsKKyAgaW50IGZpcnN0X2luZGV4ID0gcHJvdG9fZmlsZS5maW5kX2ZpcnN0X29mKCIvIiwgc3RhcnRfaW5kZXgpOworICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiIjsKKyAgc3RkOjpzdHJpbmcgc2VnbWVudCA9ICIiOworCisgIGlmIChwcm90b19maWxlID09IGtFbXB0eUZpbGUpIHsKKyAgICByZXR1cm4ga0VtcHR5TWV0YWRhdGFGaWxlOworICB9CisgIGlmIChvcHRpb25zLmlzX2Rlc2NyaXB0b3IpIHsKKyAgICByZXR1cm4ga0Rlc2NyaXB0b3JNZXRhZGF0YUZpbGU7CisgIH0KKworICAvLyBBcHBlbmQgZGlyZWN0b3J5IG5hbWUuCisgIHN0ZDo6c3RyaW5nIGZpbGVfbm9fc3VmZml4OworICBpbnQgbGFzdGluZGV4ID0gcHJvdG9fZmlsZS5maW5kX2xhc3Rfb2YoIi4iKTsKKyAgaWYgKHByb3RvX2ZpbGUgPT0ga0VtcHR5RmlsZSkgeworICAgIHJldHVybiBrRW1wdHlNZXRhZGF0YUZpbGU7CisgIH0gZWxzZSB7CisgICAgZmlsZV9ub19zdWZmaXggPSBwcm90b19maWxlLnN1YnN0cigwLCBsYXN0aW5kZXgpOworICB9CisKKyAgaWYgKGZpbGUtPm9wdGlvbnMoKS5oYXNfcGhwX21ldGFkYXRhX25hbWVzcGFjZSgpKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBocF9tZXRhZGF0YV9uYW1lc3BhY2UgPQorICAgICAgICBmaWxlLT5vcHRpb25zKCkucGhwX21ldGFkYXRhX25hbWVzcGFjZSgpOworICAgIGlmICghcGhwX21ldGFkYXRhX25hbWVzcGFjZS5lbXB0eSgpICYmIHBocF9tZXRhZGF0YV9uYW1lc3BhY2UgIT0gIlxcIikgeworICAgICAgcmVzdWx0ICs9IHBocF9tZXRhZGF0YV9uYW1lc3BhY2U7CisgICAgICBzdGQ6OnJlcGxhY2UocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSwgJ1xcJywgJy8nKTsKKyAgICAgIGlmIChyZXN1bHQuYXQocmVzdWx0LnNpemUoKSAtIDEpICE9ICcvJykgeworICAgICAgICByZXN1bHQgKz0gIi8iOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgKz0gIkdQQk1ldGFkYXRhLyI7CisgICAgd2hpbGUgKGZpcnN0X2luZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBzZWdtZW50ID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgKKyAgICAgICAgICBmaWxlX25vX3N1ZmZpeC5zdWJzdHIoc3RhcnRfaW5kZXgsIGZpcnN0X2luZGV4IC0gc3RhcnRfaW5kZXgpLCB0cnVlKTsKKyAgICAgIHJlc3VsdCArPSBSZXNlcnZlZE5hbWVQcmVmaXgoc2VnbWVudCwgZmlsZSkgKyBzZWdtZW50ICsgIi8iOworICAgICAgc3RhcnRfaW5kZXggPSBmaXJzdF9pbmRleCArIDE7CisgICAgICBmaXJzdF9pbmRleCA9IGZpbGVfbm9fc3VmZml4LmZpbmRfZmlyc3Rfb2YoIi8iLCBzdGFydF9pbmRleCk7CisgICAgfQorICB9CisKKyAgLy8gQXBwZW5kIGZpbGUgbmFtZS4KKyAgaW50IGZpbGVfbmFtZV9zdGFydCA9IGZpbGVfbm9fc3VmZml4LmZpbmRfbGFzdF9vZigiLyIpOworICBpZiAoZmlsZV9uYW1lX3N0YXJ0ID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgZmlsZV9uYW1lX3N0YXJ0ID0gMDsKKyAgfSBlbHNlIHsKKyAgICBmaWxlX25hbWVfc3RhcnQgKz0gMTsKKyAgfQorICBzZWdtZW50ID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgKKyAgICAgIGZpbGVfbm9fc3VmZml4LnN1YnN0cihmaWxlX25hbWVfc3RhcnQsIGZpcnN0X2luZGV4IC0gZmlsZV9uYW1lX3N0YXJ0KSwgdHJ1ZSk7CisKKyAgcmV0dXJuIHJlc3VsdCArIFJlc2VydmVkTmFtZVByZWZpeChzZWdtZW50LCBmaWxlKSArIHNlZ21lbnQgKyAiLnBocCI7Cit9CisKK3N0ZDo6c3RyaW5nIEdlbmVyYXRlZE1ldGFkYXRhRmlsZU5hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGVzY3JpcHRvcikgeworICBPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMuaXNfZGVzY3JpcHRvciA9IGlzX2Rlc2NyaXB0b3I7CisgIHJldHVybiBHZW5lcmF0ZWRNZXRhZGF0YUZpbGVOYW1lKGZpbGUsIG9wdGlvbnMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclR5cGU+CitzdGQ6OnN0cmluZyBHZW5lcmF0ZWRDbGFzc0ZpbGVOYW1lKGNvbnN0IERlc2NyaXB0b3JUeXBlKiBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IEZ1bGxDbGFzc05hbWUoZGVzYywgb3B0aW9ucyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHJlc3VsdFtpXSA9PSAnXFwnKSB7CisgICAgICByZXN1bHRbaV0gPSAnLyc7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQgKyAiLnBocCI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXNjcmlwdG9yVHlwZT4KK3N0ZDo6c3RyaW5nIExlZ2FjeUdlbmVyYXRlZENsYXNzRmlsZU5hbWUoY29uc3QgRGVzY3JpcHRvclR5cGUqIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gTGVnYWN5RnVsbENsYXNzTmFtZShkZXNjLCBvcHRpb25zKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5zaXplKCk7IGkrKykgeworICAgIGlmIChyZXN1bHRbaV0gPT0gJ1xcJykgeworICAgICAgcmVzdWx0W2ldID0gJy8nOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIi5waHAiOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclR5cGU+CitzdGQ6OnN0cmluZyBMZWdhY3lSZWFkT25seUdlbmVyYXRlZENsYXNzRmlsZU5hbWUoc3RkOjpzdHJpbmcgcGhwX25hbWVzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yVHlwZSogZGVzYykgeworICBpZiAoIXBocF9uYW1lc3BhY2UuZW1wdHkoKSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhwX25hbWVzcGFjZS5zaXplKCk7IGkrKykgeworICAgICAgaWYgKHBocF9uYW1lc3BhY2VbaV0gPT0gJ1xcJykgeworICAgICAgICBwaHBfbmFtZXNwYWNlW2ldID0gJy8nOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcGhwX25hbWVzcGFjZSArICIvIiArIGRlc2MtPm5hbWUoKSArICIucGhwIjsKKyAgfQorCisgIHJldHVybiBkZXNjLT5uYW1lKCkgKyAiLnBocCI7Cit9CisKK3N0ZDo6c3RyaW5nIEdlbmVyYXRlZFNlcnZpY2VGaWxlTmFtZShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IEZ1bGxDbGFzc05hbWUoc2VydmljZSwgb3B0aW9ucykgKyAiSW50ZXJmYWNlIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAocmVzdWx0W2ldID09ICdcXCcpIHsKKyAgICAgIHJlc3VsdFtpXSA9ICcvJzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICIucGhwIjsKK30KKworc3RkOjpzdHJpbmcgSW50VG9TdHJpbmcoaW50MzJfdCB2YWx1ZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgIG9zIDw8IHZhbHVlOworICByZXR1cm4gb3Muc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIExhYmVsRm9yRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBzd2l0Y2ggKGZpZWxkLT5sYWJlbCgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMOiByZXR1cm4gIm9wdGlvbmFsIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVRVUlSRUQ6IHJldHVybiAicmVxdWlyZWQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRDogcmV0dXJuICJyZXBlYXRlZCI7CisgICAgZGVmYXVsdDogYXNzZXJ0KGZhbHNlKTsgcmV0dXJuICIiOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIFBocFNldHRlclR5cGVOYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGlmIChmaWVsZC0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gImFycmF5fFxcR29vZ2xlXFxQcm90b2J1ZlxcSW50ZXJuYWxcXE1hcEZpZWxkIjsKKyAgfQorICBzdGQ6OnN0cmluZyB0eXBlOworICBzd2l0Y2ggKGZpZWxkLT50eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTToKKyAgICAgIHR5cGUgPSAiaW50IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDoKKyAgICAgIHR5cGUgPSAiaW50fHN0cmluZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEU6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQ6CisgICAgICB0eXBlID0gImZsb2F0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0w6CisgICAgICB0eXBlID0gImJvb2wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTOgorICAgICAgdHlwZSA9ICJzdHJpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICAgIHR5cGUgPSAiXFwiICsgRnVsbENsYXNzTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCksIG9wdGlvbnMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVA6CisgICAgICByZXR1cm4gIm51bGwiOworICAgIGRlZmF1bHQ6IGFzc2VydChmYWxzZSk7IHJldHVybiAiIjsKKyAgfQorICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAvLyBhY2NvbW1vZGF0ZSBmb3IgZWRnZSBjYXNlIHdpdGggbXVsdGlwbGUgdHlwZXMuCisgICAgc2l6ZV90IHN0YXJ0X3BvcyA9IHR5cGUuZmluZCgifCIpOworICAgIGlmIChzdGFydF9wb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHR5cGUucmVwbGFjZShzdGFydF9wb3MsIDEsICI+fGFycmF5PCIpOworICAgIH0KKyAgICB0eXBlID0gImFycmF5PCIgKyB0eXBlICsgIj58XFxHb29nbGVcXFByb3RvYnVmXFxJbnRlcm5hbFxcUmVwZWF0ZWRGaWVsZCI7CisgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CisKK3N0ZDo6c3RyaW5nIFBocFNldHRlclR5cGVOYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2Rlc2NyaXB0b3IpIHsKKyAgT3B0aW9ucyBvcHRpb25zOworICBvcHRpb25zLmlzX2Rlc2NyaXB0b3IgPSBpc19kZXNjcmlwdG9yOworICByZXR1cm4gUGhwU2V0dGVyVHlwZU5hbWUoZmllbGQsIG9wdGlvbnMpOworfQorCitzdGQ6OnN0cmluZyBQaHBHZXR0ZXJUeXBlTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBpZiAoZmllbGQtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJcXEdvb2dsZVxcUHJvdG9idWZcXEludGVybmFsXFxNYXBGaWVsZCI7CisgIH0KKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgcmV0dXJuICJcXEdvb2dsZVxcUHJvdG9idWZcXEludGVybmFsXFxSZXBlYXRlZEZpZWxkIjsKKyAgfQorICBzd2l0Y2ggKGZpZWxkLT50eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTTogcmV0dXJuICJpbnQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDogcmV0dXJuICJpbnR8c3RyaW5nIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEU6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQ6IHJldHVybiAiZmxvYXQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0w6IHJldHVybiAiYm9vbCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTOiByZXR1cm4gInN0cmluZyI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiAiXFwiICsgRnVsbENsYXNzTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCksIG9wdGlvbnMpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOiByZXR1cm4gIm51bGwiOworICAgIGRlZmF1bHQ6IGFzc2VydChmYWxzZSk7IHJldHVybiAiIjsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBQaHBHZXR0ZXJUeXBlTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kZXNjcmlwdG9yKSB7CisgIE9wdGlvbnMgb3B0aW9uczsKKyAgb3B0aW9ucy5pc19kZXNjcmlwdG9yID0gaXNfZGVzY3JpcHRvcjsKKyAgcmV0dXJuIFBocEdldHRlclR5cGVOYW1lKGZpZWxkLCBvcHRpb25zKTsKK30KKworc3RkOjpzdHJpbmcgRW51bU9yTWVzc2FnZVN1ZmZpeChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgIHJldHVybiAiLCAnIiArCisgICAgICAgICAgIERlc2NyaXB0b3JGdWxsTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCksIG9wdGlvbnMuaXNfZGVzY3JpcHRvcikgKworICAgICAgICAgICAiJyI7CisgIH0KKyAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNKSB7CisgICAgcmV0dXJuICIsICciICsKKyAgICAgICAgICAgRGVzY3JpcHRvckZ1bGxOYW1lKGZpZWxkLT5lbnVtX3R5cGUoKSwgb3B0aW9ucy5pc19kZXNjcmlwdG9yKSArICInIjsKKyAgfQorICByZXR1cm4gIiI7Cit9CisKK3N0ZDo6c3RyaW5nIEVudW1Pck1lc3NhZ2VTdWZmaXgoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kZXNjcmlwdG9yKSB7CisgIE9wdGlvbnMgb3B0aW9uczsKKyAgb3B0aW9ucy5pc19kZXNjcmlwdG9yID0gaXNfZGVzY3JpcHRvcjsKKyAgcmV0dXJuIEVudW1Pck1lc3NhZ2VTdWZmaXgoZmllbGQsIG9wdGlvbnMpOworfQorCisvLyBDb252ZXJ0cyBhIG5hbWUgdG8gY2FtZWwtY2FzZS4gSWYgY2FwX2ZpcnN0X2xldHRlciBpcyB0cnVlLCBjYXBpdGFsaXplIHRoZQorLy8gZmlyc3QgbGV0dGVyLgorc3RkOjpzdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXBfZmlyc3RfbGV0dGVyKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKCdhJyA8PSBuYW1lW2ldICYmIG5hbWVbaV0gPD0gJ3onKSB7CisgICAgICBpZiAoY2FwX2ZpcnN0X2xldHRlcikgeworICAgICAgICByZXN1bHQgKz0gbmFtZVtpXSArICgnQScgLSAnYScpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICs9IG5hbWVbaV07CisgICAgICB9CisgICAgICBjYXBfZmlyc3RfbGV0dGVyID0gZmFsc2U7CisgICAgfSBlbHNlIGlmICgnQScgPD0gbmFtZVtpXSAmJiBuYW1lW2ldIDw9ICdaJykgeworICAgICAgaWYgKGkgPT0gMCAmJiAhY2FwX2ZpcnN0X2xldHRlcikgeworICAgICAgICAvLyBGb3JjZSBmaXJzdCBsZXR0ZXIgdG8gbG93ZXItY2FzZSB1bmxlc3MgZXhwbGljaXRseSB0b2xkIHRvCisgICAgICAgIC8vIGNhcGl0YWxpemUgaXQuCisgICAgICAgIHJlc3VsdCArPSBuYW1lW2ldICsgKCdhJyAtICdBJyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDYXBpdGFsIGxldHRlcnMgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBsZWZ0IGFzLWlzLgorICAgICAgICByZXN1bHQgKz0gbmFtZVtpXTsKKyAgICAgIH0KKyAgICAgIGNhcF9maXJzdF9sZXR0ZXIgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKCcwJyA8PSBuYW1lW2ldICYmIG5hbWVbaV0gPD0gJzknKSB7CisgICAgICByZXN1bHQgKz0gbmFtZVtpXTsKKyAgICAgIGNhcF9maXJzdF9sZXR0ZXIgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBjYXBfZmlyc3RfbGV0dGVyID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgLy8gQWRkIGEgdHJhaWxpbmcgIl8iIGlmIHRoZSBuYW1lIHNob3VsZCBiZSBhbHRlcmVkLgorICBpZiAobmFtZVtuYW1lLnNpemUoKSAtIDFdID09ICcjJykgeworICAgIHJlc3VsdCArPSAnXyc7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBJbmRlbnQoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPkluZGVudCgpOworfQordm9pZCBPdXRkZW50KGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworfQorCit2b2lkIEdlbmVyYXRlRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBHZW5lcmF0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBmaWVsZCwgb3B0aW9ucywga0ZpZWxkUHJvcGVydHkpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHJpdmF0ZSAkXm5hbWVeO1xuIiwKKyAgICAgICAgIm5hbWUiLCBmaWVsZC0+bmFtZSgpKTsKKyAgfSBlbHNlIGlmIChmaWVsZC0+cmVhbF9jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAvLyBPbmVvZiBmaWVsZHMgYXJlIGhhbmRsZWQgYnkgR2VuZXJhdGVPbmVvZkZpZWxkLgorICAgIHJldHVybjsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnN0cmluZyBpbml0aWFsX3ZhbHVlID0KKyAgICAgICAgZmllbGQtPmhhc19wcmVzZW5jZSgpID8gIm51bGwiIDogRGVmYXVsdEZvckZpZWxkKGZpZWxkKTsKKyAgICBHZW5lcmF0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBmaWVsZCwgb3B0aW9ucywga0ZpZWxkUHJvcGVydHkpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHJvdGVjdGVkICRebmFtZV4gPSBeaW5pdGlhbF92YWx1ZV47XG4iLAorICAgICAgICAibmFtZSIsIGZpZWxkLT5uYW1lKCksCisgICAgICAgICJpbml0aWFsX3ZhbHVlIiwgaW5pdGlhbF92YWx1ZSk7CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZU9uZW9mRmllbGQoY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZiwgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gT25lb2YgcHJvcGVydHkgbmVlZHMgdG8gYmUgcHJvdGVjdGVkIGluIG9yZGVyIHRvIGJlIGFjY2Vzc2VkIGJ5IHBhcmVudAorICAvLyBjbGFzcyBpbiBpbXBsZW1lbnRhdGlvbi4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHJvdGVjdGVkICRebmFtZV47XG4iLAorICAgICAgIm5hbWUiLCBvbmVvZi0+bmFtZSgpKTsKK30KKwordm9pZCBHZW5lcmF0ZUZpZWxkQWNjZXNzb3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2YgPSBmaWVsZC0+cmVhbF9jb250YWluaW5nX29uZW9mKCk7CisKKyAgLy8gR2VuZXJhdGUgZ2V0dGVyLgorICBHZW5lcmF0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBmaWVsZCwgb3B0aW9ucywga0ZpZWxkR2V0dGVyKTsKKworICAvLyBkZXByZWNhdGlvbgorICBzdGQ6OnN0cmluZyBkZXByZWNhdGlvbl90cmlnZ2VyID0gKGZpZWxkLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpKSA/ICJAdHJpZ2dlcl9lcnJvcignIiArCisgICAgICBmaWVsZC0+bmFtZSgpICsgIiBpcyBkZXByZWNhdGVkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTtcbiAgICAgICAgIiA6ICIiOworCisgIC8vIEVtaXQgZ2V0dGVyLgorICBpZiAob25lb2YgIT0gTlVMTCkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIGZ1bmN0aW9uIGdldF5jYW1lbF9uYW1lXigpXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgICAgXmRlcHJlY2F0aW9uX3RyaWdnZXJecmV0dXJuICR0aGlzLT5yZWFkT25lb2YoXm51bWJlcl4pO1xuIgorICAgICAgICAifVxuXG4iLAorICAgICAgICAiY2FtZWxfbmFtZSIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSksCisgICAgICAgICJudW1iZXIiLCBJbnRUb1N0cmluZyhmaWVsZC0+bnVtYmVyKCkpLAorICAgICAgICAiZGVwcmVjYXRpb25fdHJpZ2dlciIsIGRlcHJlY2F0aW9uX3RyaWdnZXIpOworICB9IGVsc2UgaWYgKGZpZWxkLT5oYXNfcHJlc2VuY2UoKSAmJiAhZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgZnVuY3Rpb24gZ2V0XmNhbWVsX25hbWVeKClcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgICBeZGVwcmVjYXRpb25fdHJpZ2dlcl5yZXR1cm4gaXNzZXQoJHRoaXMtPl5uYW1lXikgPyAkdGhpcy0+Xm5hbWVeIDogXmRlZmF1bHRfdmFsdWVeO1xuIgorICAgICAgICAifVxuXG4iLAorICAgICAgICAiY2FtZWxfbmFtZSIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSksCisgICAgICAgICJuYW1lIiwgZmllbGQtPm5hbWUoKSwKKyAgICAgICAgImRlZmF1bHRfdmFsdWUiLCBEZWZhdWx0Rm9yRmllbGQoZmllbGQpLAorICAgICAgICAiZGVwcmVjYXRpb25fdHJpZ2dlciIsIGRlcHJlY2F0aW9uX3RyaWdnZXIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIGZ1bmN0aW9uIGdldF5jYW1lbF9uYW1lXigpXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgICAgXmRlcHJlY2F0aW9uX3RyaWdnZXJecmV0dXJuICR0aGlzLT5ebmFtZV47XG4iCisgICAgICAgICJ9XG5cbiIsCisgICAgICAgICJjYW1lbF9uYW1lIiwgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShmaWVsZC0+bmFtZSgpLCB0cnVlKSwKKyAgICAgICAgIm5hbWUiLCBmaWVsZC0+bmFtZSgpLAorICAgICAgICAiZGVwcmVjYXRpb25fdHJpZ2dlciIsIGRlcHJlY2F0aW9uX3RyaWdnZXIpOworICB9CisKKyAgLy8gRW1pdCBoYXp6ZXJzL2NsZWFyLgorICBpZiAob25lb2YpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInB1YmxpYyBmdW5jdGlvbiBoYXNeY2FtZWxfbmFtZV4oKVxuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAgIF5kZXByZWNhdGlvbl90cmlnZ2VyXnJldHVybiAkdGhpcy0+aGFzT25lb2YoXm51bWJlcl4pO1xuIgorICAgICAgICAifVxuXG4iLAorICAgICAgICAiY2FtZWxfbmFtZSIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSksCisgICAgICAgICJudW1iZXIiLCBJbnRUb1N0cmluZyhmaWVsZC0+bnVtYmVyKCkpLAorICAgICAgICAiZGVwcmVjYXRpb25fdHJpZ2dlciIsIGRlcHJlY2F0aW9uX3RyaWdnZXIpOworICB9IGVsc2UgaWYgKGZpZWxkLT5oYXNfcHJlc2VuY2UoKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIGZ1bmN0aW9uIGhhc15jYW1lbF9uYW1lXigpXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgICAgXmRlcHJlY2F0aW9uX3RyaWdnZXJecmV0dXJuIGlzc2V0KCR0aGlzLT5ebmFtZV4pO1xuIgorICAgICAgICAifVxuXG4iCisgICAgICAgICJwdWJsaWMgZnVuY3Rpb24gY2xlYXJeY2FtZWxfbmFtZV4oKVxuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAgIF5kZXByZWNhdGlvbl90cmlnZ2VyXnVuc2V0KCR0aGlzLT5ebmFtZV4pO1xuIgorICAgICAgICAifVxuXG4iLAorICAgICAgICAiY2FtZWxfbmFtZSIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSksCisgICAgICAgICJuYW1lIiwgZmllbGQtPm5hbWUoKSwKKyAgICAgICAgImRlZmF1bHRfdmFsdWUiLCBEZWZhdWx0Rm9yRmllbGQoZmllbGQpLAorICAgICAgICAiZGVwcmVjYXRpb25fdHJpZ2dlciIsIGRlcHJlY2F0aW9uX3RyaWdnZXIpOworICB9CisKKyAgLy8gRm9yIHdyYXBwZXIgdHlwZXMsIGdlbmVyYXRlIGFuIGFkZGl0aW9uYWwgZ2V0WFhYVW53cmFwcGVkIGdldHRlcgorICBpZiAoIWZpZWxkLT5pc19tYXAoKSAmJgorICAgICAgIWZpZWxkLT5pc19yZXBlYXRlZCgpICYmCisgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSAmJgorICAgICAgSXNXcmFwcGVyVHlwZShmaWVsZCkpIHsKKyAgICBHZW5lcmF0ZVdyYXBwZXJGaWVsZEdldHRlckRvY0NvbW1lbnQocHJpbnRlciwgZmllbGQpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIGZ1bmN0aW9uIGdldF5jYW1lbF9uYW1lXlVud3JhcHBlZCgpXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgICAgXmRlcHJlY2F0aW9uX3RyaWdnZXJecmV0dXJuICR0aGlzLT5yZWFkV3JhcHBlclZhbHVlKFwiXmZpZWxkX25hbWVeXCIpO1xuIgorICAgICAgICAifVxuXG4iLAorICAgICAgICAiY2FtZWxfbmFtZSIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSksCisgICAgICAgICJmaWVsZF9uYW1lIiwgZmllbGQtPm5hbWUoKSwKKyAgICAgICAgImRlcHJlY2F0aW9uX3RyaWdnZXIiLCBkZXByZWNhdGlvbl90cmlnZ2VyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHNldHRlci4KKyAgR2VuZXJhdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZmllbGQsIG9wdGlvbnMsIGtGaWVsZFNldHRlcik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgInB1YmxpYyBmdW5jdGlvbiBzZXReY2FtZWxfbmFtZV4oJHZhcilcbiIKKyAgICAgICJ7XG4iLAorICAgICAgImNhbWVsX25hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGZpZWxkLT5uYW1lKCksIHRydWUpKTsKKworICBJbmRlbnQocHJpbnRlcik7CisKKyAgaWYgKGZpZWxkLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiXmRlcHJlY2F0aW9uX3RyaWdnZXJeIiwKKyAgICAgICAgICAiZGVwcmVjYXRpb25fdHJpZ2dlciIsIGRlcHJlY2F0aW9uX3RyaWdnZXIKKyAgICAgICk7CisgIH0KKworICAvLyBUeXBlIGNoZWNrLgorICBpZiAoZmllbGQtPmlzX21hcCgpKSB7CisgICAgY29uc3QgRGVzY3JpcHRvciogbWFwX2VudHJ5ID0gZmllbGQtPm1lc3NhZ2VfdHlwZSgpOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5ID0gbWFwX2VudHJ5LT5tYXBfa2V5KCk7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZSA9IG1hcF9lbnRyeS0+bWFwX3ZhbHVlKCk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIkYXJyID0gR1BCVXRpbDo6Y2hlY2tNYXBGaWVsZCgkdmFyLCAiCisgICAgICAgICJcXEdvb2dsZVxcUHJvdG9idWZcXEludGVybmFsXFxHUEJUeXBlOjpea2V5X3R5cGVeLCAiCisgICAgICAgICJcXEdvb2dsZVxcUHJvdG9idWZcXEludGVybmFsXFxHUEJUeXBlOjpedmFsdWVfdHlwZV4iLAorICAgICAgICAia2V5X3R5cGUiLCBUb1VwcGVyKGtleS0+dHlwZV9uYW1lKCkpLAorICAgICAgICAidmFsdWVfdHlwZSIsIFRvVXBwZXIodmFsdWUtPnR5cGVfbmFtZSgpKSk7CisgICAgaWYgKHZhbHVlLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiLCBcXF5jbGFzc19uYW1lXik7XG4iLAorICAgICAgICAgICJjbGFzc19uYW1lIiwKKyAgICAgICAgICBGdWxsQ2xhc3NOYW1lKHZhbHVlLT5tZXNzYWdlX3R5cGUoKSwgb3B0aW9ucykgKyAiOjpjbGFzcyIpOworICAgIH0gZWxzZSBpZiAodmFsdWUtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU0pIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIsIFxcXmNsYXNzX25hbWVeKTtcbiIsCisgICAgICAgICAgImNsYXNzX25hbWUiLAorICAgICAgICAgIEZ1bGxDbGFzc05hbWUodmFsdWUtPmVudW1fdHlwZSgpLCBvcHRpb25zKSArICI6OmNsYXNzIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KCIpO1xuIik7CisgICAgfQorICB9IGVsc2UgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIkYXJyID0gR1BCVXRpbDo6Y2hlY2tSZXBlYXRlZEZpZWxkKCR2YXIsICIKKyAgICAgICAgIlxcR29vZ2xlXFxQcm90b2J1ZlxcSW50ZXJuYWxcXEdQQlR5cGU6Ol50eXBlXiIsCisgICAgICAgICJ0eXBlIiwgVG9VcHBlcihmaWVsZC0+dHlwZV9uYW1lKCkpKTsKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIsIFxcXmNsYXNzX25hbWVeKTtcbiIsCisgICAgICAgICAgImNsYXNzX25hbWUiLAorICAgICAgICAgIEZ1bGxDbGFzc05hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCBvcHRpb25zKSArICI6OmNsYXNzIik7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIiwgXFxeY2xhc3NfbmFtZV4pO1xuIiwKKyAgICAgICAgICAiY2xhc3NfbmFtZSIsCisgICAgICAgICAgRnVsbENsYXNzTmFtZShmaWVsZC0+ZW51bV90eXBlKCksIG9wdGlvbnMpICsgIjo6Y2xhc3MiKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoIik7XG4iKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIkdQQlV0aWw6OmNoZWNrTWVzc2FnZSgkdmFyLCBcXF5jbGFzc19uYW1lXjo6Y2xhc3MpO1xuIiwKKyAgICAgICAgImNsYXNzX25hbWUiLCBGdWxsQ2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgb3B0aW9ucykpOworICB9IGVsc2UgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJHUEJVdGlsOjpjaGVja0VudW0oJHZhciwgXFxeY2xhc3NfbmFtZV46OmNsYXNzKTtcbiIsCisgICAgICAgICJjbGFzc19uYW1lIiwgRnVsbENsYXNzTmFtZShmaWVsZC0+ZW51bV90eXBlKCksIG9wdGlvbnMpKTsKKyAgfSBlbHNlIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJHUEJVdGlsOjpjaGVja1N0cmluZygkdmFyLCBedXRmOF4pO1xuIiwKKyAgICAgICAgInV0ZjgiLAorICAgICAgICBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgPyAiVHJ1ZSI6ICJGYWxzZSIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiR1BCVXRpbDo6Y2hlY2tedHlwZV4oJHZhcik7XG4iLAorICAgICAgICAidHlwZSIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPmNwcF90eXBlX25hbWUoKSwgdHJ1ZSkpOworICB9CisKKyAgaWYgKG9uZW9mICE9IE5VTEwpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiR0aGlzLT53cml0ZU9uZW9mKF5udW1iZXJeLCAkdmFyKTtcbiIsCisgICAgICAgICJudW1iZXIiLCBJbnRUb1N0cmluZyhmaWVsZC0+bnVtYmVyKCkpKTsKKyAgfSBlbHNlIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiJHRoaXMtPl5uYW1lXiA9ICRhcnI7XG4iLAorICAgICAgICAibmFtZSIsIGZpZWxkLT5uYW1lKCkpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiJHRoaXMtPl5uYW1lXiA9ICR2YXI7XG4iLAorICAgICAgICAibmFtZSIsIGZpZWxkLT5uYW1lKCkpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoIlxucmV0dXJuICR0aGlzO1xuIik7CisKKyAgT3V0ZGVudChwcmludGVyKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJ9XG5cbiIpOworCisgIC8vIEZvciB3cmFwcGVyIHR5cGVzLCBnZW5lcmF0ZSBhbiBhZGRpdGlvbmFsIHNldFhYWFZhbHVlIGdldHRlcgorICBpZiAoIWZpZWxkLT5pc19tYXAoKSAmJgorICAgICAgIWZpZWxkLT5pc19yZXBlYXRlZCgpICYmCisgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSAmJgorICAgICAgSXNXcmFwcGVyVHlwZShmaWVsZCkpIHsKKyAgICBHZW5lcmF0ZVdyYXBwZXJGaWVsZFNldHRlckRvY0NvbW1lbnQocHJpbnRlciwgZmllbGQpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIGZ1bmN0aW9uIHNldF5jYW1lbF9uYW1lXlVud3JhcHBlZCgkdmFyKVxuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAgICR0aGlzLT53cml0ZVdyYXBwZXJWYWx1ZShcIl5maWVsZF9uYW1lXlwiLCAkdmFyKTtcbiIKKyAgICAgICAgIiAgICByZXR1cm4gJHRoaXM7IgorICAgICAgICAifVxuXG4iLAorICAgICAgICAiY2FtZWxfbmFtZSIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSksCisgICAgICAgICJmaWVsZF9uYW1lIiwgZmllbGQtPm5hbWUoKSk7CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZUVudW1Ub1Bvb2woY29uc3QgRW51bURlc2NyaXB0b3IqIGVuLCBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICIkcG9vbC0+YWRkRW51bSgnXm5hbWVeJywgIgorICAgICAgIlxcR29vZ2xlXFxQcm90b2J1ZlxcSW50ZXJuYWxcXF5jbGFzc19uYW1lXjo6Y2xhc3MpXG4iLAorICAgICAgIm5hbWUiLCBEZXNjcmlwdG9yRnVsbE5hbWUoZW4sIHRydWUpLAorICAgICAgImNsYXNzX25hbWUiLCBlbi0+bmFtZSgpKTsKKyAgSW5kZW50KHByaW50ZXIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW4tPnZhbHVlX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlID0gZW4tPnZhbHVlKGkpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiLT52YWx1ZShcIl5uYW1lXlwiLCBebnVtYmVyXilcbiIsCisgICAgICAgICJuYW1lIiwgQ29uc3RhbnROYW1lUHJlZml4KHZhbHVlLT5uYW1lKCkpICsgdmFsdWUtPm5hbWUoKSwKKyAgICAgICAgIm51bWJlciIsIEludFRvU3RyaW5nKHZhbHVlLT5udW1iZXIoKSkpOworICB9CisgIHByaW50ZXItPlByaW50KCItPmZpbmFsaXplVG9Qb29sKCk7XG5cbiIpOworICBPdXRkZW50KHByaW50ZXIpOworfQorCit2b2lkIEdlbmVyYXRlU2VydmljZU1ldGhvZChjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInB1YmxpYyBmdW5jdGlvbiBeY2FtZWxfbmFtZV4oXFxecmVxdWVzdF9uYW1lXiAkcmVxdWVzdCk7XG5cbiIsCisgICAgICAgICJjYW1lbF9uYW1lIiwgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShtZXRob2QtPm5hbWUoKSwgZmFsc2UpLAorICAgICAgICAicmVxdWVzdF9uYW1lIiwgRnVsbENsYXNzTmFtZSgKKyAgICAgICAgICBtZXRob2QtPmlucHV0X3R5cGUoKSwgZmFsc2UpCisgICk7Cit9CisKK3ZvaWQgR2VuZXJhdGVNZXNzYWdlVG9Qb29sKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UsIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIERvbid0IGdlbmVyYXRlIE1hcEVudHJ5IG1lc3NhZ2VzIC0tIHdlIHVzZSB0aGUgUEhQIGV4dGVuc2lvbidzIG5hdGl2ZQorICAvLyBzdXBwb3J0IGZvciBtYXAgZmllbGRzIGluc3RlYWQuCisgIGlmIChtZXNzYWdlLT5vcHRpb25zKCkubWFwX2VudHJ5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZSA9CisgICAgICAobmFtZV9wcmVmaXguZW1wdHkoKSA/ICIiIDogbmFtZV9wcmVmaXggKyAiXFwiKSArCisgICAgICBSZXNlcnZlZE5hbWVQcmVmaXgobWVzc2FnZS0+bmFtZSgpLCBtZXNzYWdlLT5maWxlKCkpICsgbWVzc2FnZS0+bmFtZSgpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgIiRwb29sLT5hZGRNZXNzYWdlKCdebWVzc2FnZV4nLCAiCisgICAgICAiXFxHb29nbGVcXFByb3RvYnVmXFxJbnRlcm5hbFxcXmNsYXNzX25hbWVeOjpjbGFzcylcbiIsCisgICAgICAibWVzc2FnZSIsIERlc2NyaXB0b3JGdWxsTmFtZShtZXNzYWdlLCB0cnVlKSwKKyAgICAgICJjbGFzc19uYW1lIiwgY2xhc3NfbmFtZSk7CisKKyAgSW5kZW50KHByaW50ZXIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG1lc3NhZ2UtPmZpZWxkKGkpOworICAgIGlmIChmaWVsZC0+aXNfbWFwKCkpIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5ID0KKyAgICAgICAgICBmaWVsZC0+bWVzc2FnZV90eXBlKCktPm1hcF9rZXkoKTsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsID0KKyAgICAgICAgICBmaWVsZC0+bWVzc2FnZV90eXBlKCktPm1hcF92YWx1ZSgpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIi0+bWFwKCdeZmllbGReJywgXFxHb29nbGVcXFByb3RvYnVmXFxJbnRlcm5hbFxcR1BCVHlwZTo6XmtleV4sICIKKyAgICAgICAgICAiXFxHb29nbGVcXFByb3RvYnVmXFxJbnRlcm5hbFxcR1BCVHlwZTo6XnZhbHVlXiwgXm51bWJlcl5eb3RoZXJeKVxuIiwKKyAgICAgICAgICAiZmllbGQiLCBmaWVsZC0+bmFtZSgpLAorICAgICAgICAgICJrZXkiLCBUb1VwcGVyKGtleS0+dHlwZV9uYW1lKCkpLAorICAgICAgICAgICJ2YWx1ZSIsIFRvVXBwZXIodmFsLT50eXBlX25hbWUoKSksCisgICAgICAgICAgIm51bWJlciIsIFN0ckNhdChmaWVsZC0+bnVtYmVyKCkpLAorICAgICAgICAgICJvdGhlciIsIEVudW1Pck1lc3NhZ2VTdWZmaXgodmFsLCB0cnVlKSk7CisgICAgfSBlbHNlIGlmICghZmllbGQtPnJlYWxfY29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiLT5ebGFiZWxeKCdeZmllbGReJywgIgorICAgICAgICAgICJcXEdvb2dsZVxcUHJvdG9idWZcXEludGVybmFsXFxHUEJUeXBlOjpedHlwZV4sIF5udW1iZXJeXm90aGVyXilcbiIsCisgICAgICAgICAgImZpZWxkIiwgZmllbGQtPm5hbWUoKSwKKyAgICAgICAgICAibGFiZWwiLCBMYWJlbEZvckZpZWxkKGZpZWxkKSwKKyAgICAgICAgICAidHlwZSIsIFRvVXBwZXIoZmllbGQtPnR5cGVfbmFtZSgpKSwKKyAgICAgICAgICAibnVtYmVyIiwgU3RyQ2F0KGZpZWxkLT5udW1iZXIoKSksCisgICAgICAgICAgIm90aGVyIiwgRW51bU9yTWVzc2FnZVN1ZmZpeChmaWVsZCwgdHJ1ZSkpOworICAgIH0KKyAgfQorCisgIC8vIG9uZW9mcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5yZWFsX29uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZiA9IG1lc3NhZ2UtPm9uZW9mX2RlY2woaSk7CisgICAgcHJpbnRlci0+UHJpbnQoIi0+b25lb2YoXm5hbWVeKVxuIiwKKyAgICAgICAgICAgICAgICAgICAibmFtZSIsIG9uZW9mLT5uYW1lKCkpOworICAgIEluZGVudChwcmludGVyKTsKKyAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgb25lb2YtPmZpZWxkX2NvdW50KCk7IGluZGV4KyspIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBvbmVvZi0+ZmllbGQoaW5kZXgpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIi0+dmFsdWUoJ15maWVsZF4nLCAiCisgICAgICAgICAgIlxcR29vZ2xlXFxQcm90b2J1ZlxcSW50ZXJuYWxcXEdQQlR5cGU6Ol50eXBlXiwgXm51bWJlcl5eb3RoZXJeKVxuIiwKKyAgICAgICAgICAiZmllbGQiLCBmaWVsZC0+bmFtZSgpLAorICAgICAgICAgICJ0eXBlIiwgVG9VcHBlcihmaWVsZC0+dHlwZV9uYW1lKCkpLAorICAgICAgICAgICJudW1iZXIiLCBTdHJDYXQoZmllbGQtPm51bWJlcigpKSwKKyAgICAgICAgICAib3RoZXIiLCBFbnVtT3JNZXNzYWdlU3VmZml4KGZpZWxkLCB0cnVlKSk7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KCItPmZpbmlzaCgpXG4iKTsKKyAgICBPdXRkZW50KHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiLT5maW5hbGl6ZVRvUG9vbCgpO1xuIik7CisKKyAgT3V0ZGVudChwcmludGVyKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJcbiIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgR2VuZXJhdGVNZXNzYWdlVG9Qb29sKGNsYXNzX25hbWUsIG1lc3NhZ2UtPm5lc3RlZF90eXBlKGkpLCBwcmludGVyKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBHZW5lcmF0ZUVudW1Ub1Bvb2wobWVzc2FnZS0+ZW51bV90eXBlKGkpLCBwcmludGVyKTsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlQWRkRmlsZVRvUG9vbChjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgInB1YmxpYyBzdGF0aWMgJGlzX2luaXRpYWxpemVkID0gZmFsc2U7XG5cbiIKKyAgICAgICJwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGluaXRPbmNlKCkge1xuIik7CisgIEluZGVudChwcmludGVyKTsKKworICBpZiAob3B0aW9ucy5hZ2dyZWdhdGVfbWV0YWRhdGEpIHsKKyAgICBHZW5lcmF0ZUFkZEZpbGVzVG9Qb29sKGZpbGUsIG9wdGlvbnMsIHByaW50ZXIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiJHBvb2wgPSBcXEdvb2dsZVxcUHJvdG9idWZcXEludGVybmFsXFwiCisgICAgICAgICJEZXNjcmlwdG9yUG9vbDo6Z2V0R2VuZXJhdGVkUG9vbCgpO1xuXG4iCisgICAgICAgICJpZiAoc3RhdGljOjokaXNfaW5pdGlhbGl6ZWQgPT0gdHJ1ZSkge1xuIgorICAgICAgICAiICByZXR1cm47XG4iCisgICAgICAgICJ9XG4iKTsKKworICAgIGlmIChvcHRpb25zLmlzX2Rlc2NyaXB0b3IpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgICBHZW5lcmF0ZU1lc3NhZ2VUb1Bvb2woIiIsIGZpbGUtPm1lc3NhZ2VfdHlwZShpKSwgcHJpbnRlcik7CisgICAgICB9CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgR2VuZXJhdGVFbnVtVG9Qb29sKGZpbGUtPmVudW1fdHlwZShpKSwgcHJpbnRlcik7CisgICAgICB9CisKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIkcG9vbC0+ZmluaXNoKCk7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSA9IGZpbGUtPmRlcGVuZGVuY3koaSktPm5hbWUoKTsKKyAgICAgICAgLy8gQ3VycmVudGx5LCBkZXNjcmlwdG9yLnByb3RvIGlzIG5vdCByZWFkeSBmb3IgZXh0ZXJuYWwgdXNhZ2UuIFNraXAgdG8KKyAgICAgICAgLy8gaW1wb3J0IGl0IGZvciBub3csIHNvIHRoYXQgaXRzIGRlcGVuZGVuY2llcyBjYW4gc3RpbGwgd29yayBhcyBsb25nIGFzCisgICAgICAgIC8vIHRoZXkgZG9uJ3QgdXNlIHByb3RvcyBkZWZpbmVkIGluIGRlc2NyaXB0b3IucHJvdG8uCisgICAgICAgIGlmIChuYW1lID09IGtEZXNjcmlwdG9yRmlsZSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlcGVuZGVuY3lfZmlsZW5hbWUgPQorICAgICAgICAgICAgR2VuZXJhdGVkTWV0YWRhdGFGaWxlTmFtZShmaWxlLT5kZXBlbmRlbmN5KGkpLCBvcHRpb25zKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAiXFxebmFtZV46OmluaXRPbmNlKCk7XG4iLAorICAgICAgICAgICAgIm5hbWUiLCBGaWxlbmFtZVRvQ2xhc3NuYW1lKGRlcGVuZGVuY3lfZmlsZW5hbWUpKTsKKyAgICAgIH0KKworICAgICAgLy8gQWRkIG1lc3NhZ2VzIGFuZCBlbnVtcyB0byBkZXNjcmlwdG9yIHBvb2wuCisgICAgICBGaWxlRGVzY3JpcHRvclNldCBmaWxlczsKKyAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGVfcHJvdG8gPSBmaWxlcy5hZGRfZmlsZSgpOworICAgICAgZmlsZS0+Q29weVRvKGZpbGVfcHJvdG8pOworCisgICAgICAvLyBGaWx0ZXIgb3V0IGRlc2NyaXB0b3IucHJvdG8gYXMgaXQgY2Fubm90IGJlIGRlcGVuZGVkIG9uIGZvciBub3cuCisgICAgICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiogZGVwZW5kZW5jeSA9CisgICAgICAgICAgZmlsZV9wcm90by0+bXV0YWJsZV9kZXBlbmRlbmN5KCk7CisgICAgICBmb3IgKFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdCA9IGRlcGVuZGVuY3ktPmJlZ2luKCk7CisgICAgICAgICAgIGl0ICE9IGRlcGVuZGVuY3ktPmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmICgqaXQgIT0ga0Rlc2NyaXB0b3JGaWxlKSB7CisgICAgICAgICAgZGVwZW5kZW5jeS0+ZXJhc2UoaXQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEZpbHRlciBvdXQgYWxsIGV4dGVuc2lvbnMsIHNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiB5ZXQuCisgICAgICBmaWxlX3Byb3RvLT5jbGVhcl9leHRlbnNpb24oKTsKKyAgICAgIFJlcGVhdGVkUHRyRmllbGQ8RGVzY3JpcHRvclByb3RvPiogbWVzc2FnZV90eXBlID0KKyAgICAgICAgICBmaWxlX3Byb3RvLT5tdXRhYmxlX21lc3NhZ2VfdHlwZSgpOworICAgICAgZm9yIChSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz46Oml0ZXJhdG9yIGl0ID0gbWVzc2FnZV90eXBlLT5iZWdpbigpOworICAgICAgICAgICBpdCAhPSBtZXNzYWdlX3R5cGUtPmVuZCgpOyArK2l0KSB7CisgICAgICAgIGl0LT5jbGVhcl9leHRlbnNpb24oKTsKKyAgICAgIH0KKworICAgICAgc3RkOjpzdHJpbmcgZmlsZXNfZGF0YTsKKyAgICAgIGZpbGVzLlNlcmlhbGl6ZVRvU3RyaW5nKCZmaWxlc19kYXRhKTsKKworICAgICAgcHJpbnRlci0+UHJpbnQoIiRwb29sLT5pbnRlcm5hbEFkZEdlbmVyYXRlZEZpbGUoXG4iKTsKKyAgICAgIEluZGVudChwcmludGVyKTsKKyAgICAgIHByaW50ZXItPlByaW50KCInIik7CisKKyAgICAgIGZvciAoYXV0byBjaCA6IGZpbGVzX2RhdGEpIHsKKyAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgIHByaW50ZXItPlByaW50KFIiKFxcKSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgcHJpbnRlci0+UHJpbnQoUiIoXCcpIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRlci0+UHJpbnQoIl5jaGFyXiIsICJjaGFyIiwgc3RkOjpzdHJpbmcoMSwgY2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHByaW50ZXItPlByaW50KCInXG4iKTsKKyAgICAgIE91dGRlbnQocHJpbnRlcik7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiLCB0cnVlKTtcblxuIik7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAic3RhdGljOjokaXNfaW5pdGlhbGl6ZWQgPSB0cnVlO1xuIik7CisgIH0KKworICBPdXRkZW50KHByaW50ZXIpOworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIEFuYWx5emVEZXBlbmRlbmN5Rm9yRmlsZSgKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICBzdGQ6OnNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+KiBub2Rlc193aXRob3V0X2RlcGVuZGVuY3ksCisgICAgc3RkOjptYXA8Y29uc3QgRmlsZURlc2NyaXB0b3IqLCBzdGQ6OnNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+PiogZGVwcywKKyAgICBzdGQ6Om1hcDxjb25zdCBGaWxlRGVzY3JpcHRvciosIGludD4qIGRlcGVuZGVuY3lfY291bnQpIHsKKyAgaW50IGNvdW50ID0gZmlsZS0+ZGVwZW5kZW5jeV9jb3VudCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVwZW5kZW5jeSA9IGZpbGUtPmRlcGVuZGVuY3koaSk7CisgICAgICBpZiAoZGVwZW5kZW5jeS0+bmFtZSgpID09IGtEZXNjcmlwdG9yRmlsZSkgeworICAgICAgICBjb3VudC0tOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgfQorCisgIGlmIChjb3VudCA9PSAwKSB7CisgICAgbm9kZXNfd2l0aG91dF9kZXBlbmRlbmN5LT5pbnNlcnQoZmlsZSk7CisgIH0gZWxzZSB7CisgICAgKCpkZXBlbmRlbmN5X2NvdW50KVtmaWxlXSA9IGNvdW50OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXBlbmRlbmN5ID0gZmlsZS0+ZGVwZW5kZW5jeShpKTsKKyAgICAgIGlmIChkZXBlbmRlbmN5LT5uYW1lKCkgPT0ga0Rlc2NyaXB0b3JGaWxlKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGRlcHMtPmZpbmQoZGVwZW5kZW5jeSkgPT0gZGVwcy0+ZW5kKCkpIHsKKyAgICAgICAgKCpkZXBzKVtkZXBlbmRlbmN5XSA9IHN0ZDo6c2V0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4oKTsKKyAgICAgIH0KKyAgICAgICgqZGVwcylbZGVwZW5kZW5jeV0uaW5zZXJ0KGZpbGUpOworICAgICAgQW5hbHl6ZURlcGVuZGVuY3lGb3JGaWxlKAorICAgICAgICAgIGRlcGVuZGVuY3ksIG5vZGVzX3dpdGhvdXRfZGVwZW5kZW5jeSwgZGVwcywgZGVwZW5kZW5jeV9jb3VudCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBib29sIE5lZWRzVW53cmFwcGluZyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGJvb2wgaGFzX2FnZ3JlZ2F0ZV9tZXRhZGF0YV9wcmVmaXggPSBmYWxzZTsKKyAgaWYgKG9wdGlvbnMuYWdncmVnYXRlX21ldGFkYXRhX3ByZWZpeGVzLmVtcHR5KCkpIHsKKyAgICBoYXNfYWdncmVnYXRlX21ldGFkYXRhX3ByZWZpeCA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBwcmVmaXggOiBvcHRpb25zLmFnZ3JlZ2F0ZV9tZXRhZGF0YV9wcmVmaXhlcykgeworICAgICAgaWYgKEhhc1ByZWZpeFN0cmluZyhmaWxlLT5wYWNrYWdlKCksIHByZWZpeCkpIHsKKyAgICAgICAgaGFzX2FnZ3JlZ2F0ZV9tZXRhZGF0YV9wcmVmaXggPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gaGFzX2FnZ3JlZ2F0ZV9tZXRhZGF0YV9wcmVmaXg7Cit9CisKK3ZvaWQgR2VuZXJhdGVBZGRGaWxlc1RvUG9vbChjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICIkcG9vbCA9IFxcR29vZ2xlXFxQcm90b2J1ZlxcSW50ZXJuYWxcXCIKKyAgICAgICJEZXNjcmlwdG9yUG9vbDo6Z2V0R2VuZXJhdGVkUG9vbCgpO1xuIgorICAgICAgImlmIChzdGF0aWM6OiRpc19pbml0aWFsaXplZCA9PSB0cnVlKSB7XG4iCisgICAgICAiICByZXR1cm47XG4iCisgICAgICAifVxuIik7CisKKyAgLy8gU29ydCBmaWxlcyBhY2NvcmRpbmcgdG8gZGVwZW5kZW5jeQorICBzdGQ6Om1hcDxjb25zdCBGaWxlRGVzY3JpcHRvciosIHN0ZDo6c2V0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4+IGRlcHM7CisgIHN0ZDo6bWFwPGNvbnN0IEZpbGVEZXNjcmlwdG9yKiwgaW50PiBkZXBlbmRlbmN5X2NvdW50OworICBzdGQ6OnNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IG5vZGVzX3dpdGhvdXRfZGVwZW5kZW5jeTsKKyAgRmlsZURlc2NyaXB0b3JTZXQgc29ydGVkX2ZpbGVfc2V0OworCisgIEFuYWx5emVEZXBlbmRlbmN5Rm9yRmlsZSgKKyAgICAgIGZpbGUsICZub2Rlc193aXRob3V0X2RlcGVuZGVuY3ksICZkZXBzLCAmZGVwZW5kZW5jeV9jb3VudCk7CisKKyAgd2hpbGUgKCFub2Rlc193aXRob3V0X2RlcGVuZGVuY3kuZW1wdHkoKSkgeworICAgIGF1dG8gZmlsZV9ub2RlID0gKm5vZGVzX3dpdGhvdXRfZGVwZW5kZW5jeS5iZWdpbigpOworICAgIG5vZGVzX3dpdGhvdXRfZGVwZW5kZW5jeS5lcmFzZShmaWxlX25vZGUpOworICAgIGZvciAoYXV0byBkZXBlbmRlbnQgOiBkZXBzW2ZpbGVfbm9kZV0pIHsKKyAgICAgIGlmIChkZXBlbmRlbmN5X2NvdW50W2RlcGVuZGVudF0gPT0gMSkgeworICAgICAgICBkZXBlbmRlbmN5X2NvdW50LmVyYXNlKGRlcGVuZGVudCk7CisgICAgICAgIG5vZGVzX3dpdGhvdXRfZGVwZW5kZW5jeS5pbnNlcnQoZGVwZW5kZW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlcGVuZGVuY3lfY291bnRbZGVwZW5kZW50XSAtPSAxOworICAgICAgfQorICAgIH0KKworICAgIGJvb2wgbmVlZHNfYWdncmVnYXRlID0gTmVlZHNVbndyYXBwaW5nKGZpbGVfbm9kZSwgb3B0aW9ucyk7CisKKyAgICBpZiAobmVlZHNfYWdncmVnYXRlKSB7CisgICAgICBhdXRvIGZpbGVfcHJvdG8gPSBzb3J0ZWRfZmlsZV9zZXQuYWRkX2ZpbGUoKTsKKyAgICAgIGZpbGVfbm9kZS0+Q29weVRvKGZpbGVfcHJvdG8pOworCisgICAgICAvLyBGaWx0ZXIgb3V0IGRlc2NyaXB0b3IucHJvdG8gYXMgaXQgY2Fubm90IGJlIGRlcGVuZGVkIG9uIGZvciBub3cuCisgICAgICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiogZGVwZW5kZW5jeSA9CisgICAgICAgICAgZmlsZV9wcm90by0+bXV0YWJsZV9kZXBlbmRlbmN5KCk7CisgICAgICBmb3IgKFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdCA9IGRlcGVuZGVuY3ktPmJlZ2luKCk7CisgICAgICAgICAgIGl0ICE9IGRlcGVuZGVuY3ktPmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmICgqaXQgIT0ga0Rlc2NyaXB0b3JGaWxlKSB7CisgICAgICAgICAgZGVwZW5kZW5jeS0+ZXJhc2UoaXQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEZpbHRlciBvdXQgYWxsIGV4dGVuc2lvbnMsIHNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiB5ZXQuCisgICAgICBmaWxlX3Byb3RvLT5jbGVhcl9leHRlbnNpb24oKTsKKyAgICAgIFJlcGVhdGVkUHRyRmllbGQ8RGVzY3JpcHRvclByb3RvPiogbWVzc2FnZV90eXBlID0KKyAgICAgICAgICBmaWxlX3Byb3RvLT5tdXRhYmxlX21lc3NhZ2VfdHlwZSgpOworICAgICAgZm9yIChSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz46Oml0ZXJhdG9yIGl0ID0gbWVzc2FnZV90eXBlLT5iZWdpbigpOworICAgICAgICAgICBpdCAhPSBtZXNzYWdlX3R5cGUtPmVuZCgpOyArK2l0KSB7CisgICAgICAgIGl0LT5jbGVhcl9leHRlbnNpb24oKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3RkOjpzdHJpbmcgZGVwZW5kZW5jeV9maWxlbmFtZSA9IEdlbmVyYXRlZE1ldGFkYXRhRmlsZU5hbWUoZmlsZV9ub2RlLCBmYWxzZSk7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiXFxebmFtZV46OmluaXRPbmNlKCk7XG4iLAorICAgICAgICAgICJuYW1lIiwgRmlsZW5hbWVUb0NsYXNzbmFtZShkZXBlbmRlbmN5X2ZpbGVuYW1lKSk7CisgICAgfQorICB9CisKKyAgc3RkOjpzdHJpbmcgZmlsZXNfZGF0YTsKKyAgc29ydGVkX2ZpbGVfc2V0LlNlcmlhbGl6ZVRvU3RyaW5nKCZmaWxlc19kYXRhKTsKKworICBwcmludGVyLT5QcmludCgiJHBvb2wtPmludGVybmFsQWRkR2VuZXJhdGVkRmlsZShcbiIpOworICBJbmRlbnQocHJpbnRlcik7CisgIHByaW50ZXItPlByaW50KCInIik7CisKKyAgZm9yIChhdXRvIGNoIDogZmlsZXNfZGF0YSkgeworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoUiIoXFwpIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXCcnOgorICAgICAgICBwcmludGVyLT5QcmludChSIihcJykiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBwcmludGVyLT5QcmludCgiXmNoYXJeIiwgImNoYXIiLCBzdGQ6OnN0cmluZygxLCBjaCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBwcmludGVyLT5QcmludCgiJ1xuIik7CisgIE91dGRlbnQocHJpbnRlcik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIiwgdHJ1ZSk7XG4iKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJzdGF0aWM6OiRpc19pbml0aWFsaXplZCA9IHRydWU7XG4iKTsKK30KKwordm9pZCBHZW5lcmF0ZVVzZURlY2xhcmF0aW9uKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmICghb3B0aW9ucy5pc19kZXNjcmlwdG9yKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ1c2UgR29vZ2xlXFxQcm90b2J1ZlxcSW50ZXJuYWxcXEdQQlR5cGU7XG4iCisgICAgICAgICJ1c2UgR29vZ2xlXFxQcm90b2J1ZlxcSW50ZXJuYWxcXFJlcGVhdGVkRmllbGQ7XG4iCisgICAgICAgICJ1c2UgR29vZ2xlXFxQcm90b2J1ZlxcSW50ZXJuYWxcXEdQQlV0aWw7XG5cbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAidXNlIEdvb2dsZVxcUHJvdG9idWZcXEludGVybmFsXFxHUEJUeXBlO1xuIgorICAgICAgICAidXNlIEdvb2dsZVxcUHJvdG9idWZcXEludGVybmFsXFxHUEJXaXJlO1xuIgorICAgICAgICAidXNlIEdvb2dsZVxcUHJvdG9idWZcXEludGVybmFsXFxSZXBlYXRlZEZpZWxkO1xuIgorICAgICAgICAidXNlIEdvb2dsZVxcUHJvdG9idWZcXEludGVybmFsXFxJbnB1dFN0cmVhbTtcbiIKKyAgICAgICAgInVzZSBHb29nbGVcXFByb3RvYnVmXFxJbnRlcm5hbFxcR1BCVXRpbDtcblxuIik7CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZUhlYWQoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICI8P3BocFxuIgorICAgICIjIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhXG4iCisgICAgIiMgc291cmNlOiBeZmlsZW5hbWVeXG4iCisgICAgIlxuIiwKKyAgICAiZmlsZW5hbWUiLCBmaWxlLT5uYW1lKCkpOworfQorCitzdGQ6OnN0cmluZyBGaWxlbmFtZVRvQ2xhc3NuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgeworICBpbnQgbGFzdGluZGV4ID0gZmlsZW5hbWUuZmluZF9sYXN0X29mKCIuIik7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IGZpbGVuYW1lLnN1YnN0cigwLCBsYXN0aW5kZXgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5zaXplKCk7IGkrKykgeworICAgIGlmIChyZXN1bHRbaV0gPT0gJy8nKSB7CisgICAgICByZXN1bHRbaV0gPSAnXFwnOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEdlbmVyYXRlTWV0YWRhdGFGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCkgeworICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IEdlbmVyYXRlZE1ldGFkYXRhRmlsZU5hbWUoZmlsZSwgb3B0aW9ucyk7CisgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgIGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKGZpbGVuYW1lKSk7CisgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnXicpOworCisgIEdlbmVyYXRlSGVhZChmaWxlLCAmcHJpbnRlcik7CisKKyAgc3RkOjpzdHJpbmcgZnVsbG5hbWUgPSBGaWxlbmFtZVRvQ2xhc3NuYW1lKGZpbGVuYW1lKTsKKyAgaW50IGxhc3RpbmRleCA9IGZ1bGxuYW1lLmZpbmRfbGFzdF9vZigiXFwiKTsKKworICBpZiAobGFzdGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgcHJpbnRlci5QcmludCgKKyAgICAgICAgIm5hbWVzcGFjZSBebmFtZV47XG5cbiIsCisgICAgICAgICJuYW1lIiwgZnVsbG5hbWUuc3Vic3RyKDAsIGxhc3RpbmRleCkpOworCisgICAgcHJpbnRlci5QcmludCgKKyAgICAgICAgImNsYXNzIF5uYW1lXlxuIgorICAgICAgICAie1xuIiwKKyAgICAgICAgIm5hbWUiLCBmdWxsbmFtZS5zdWJzdHIobGFzdGluZGV4ICsgMSkpOworICB9IGVsc2UgeworICAgIHByaW50ZXIuUHJpbnQoCisgICAgICAgICJjbGFzcyBebmFtZV5cbiIKKyAgICAgICAgIntcbiIsCisgICAgICAgICJuYW1lIiwgZnVsbG5hbWUpOworICB9CisgIEluZGVudCgmcHJpbnRlcik7CisKKyAgR2VuZXJhdGVBZGRGaWxlVG9Qb29sKGZpbGUsIG9wdGlvbnMsICZwcmludGVyKTsKKworICBPdXRkZW50KCZwcmludGVyKTsKKyAgcHJpbnRlci5QcmludCgifVxuXG4iKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUeXBlPgordm9pZCBMZWdhY3lHZW5lcmF0ZUNsYXNzRmlsZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclR5cGUqIGRlc2MsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0KSB7CisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gTGVnYWN5R2VuZXJhdGVkQ2xhc3NGaWxlTmFtZShkZXNjLCBvcHRpb25zKTsKKyAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgZ2VuZXJhdG9yX2NvbnRleHQtPk9wZW4oZmlsZW5hbWUpKTsKKyAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICdeJyk7CisKKyAgR2VuZXJhdGVIZWFkKGZpbGUsICZwcmludGVyKTsKKworICBzdGQ6OnN0cmluZyBwaHBfbmFtZXNwYWNlID0gUm9vdFBocE5hbWVzcGFjZShkZXNjLCBvcHRpb25zKTsKKyAgaWYgKCFwaHBfbmFtZXNwYWNlLmVtcHR5KCkpIHsKKyAgICBwcmludGVyLlByaW50KAorICAgICAgICAibmFtZXNwYWNlIF5uYW1lXjtcblxuIiwKKyAgICAgICAgIm5hbWUiLCBwaHBfbmFtZXNwYWNlKTsKKyAgfQorICBzdGQ6OnN0cmluZyBuZXduYW1lID0gRnVsbENsYXNzTmFtZShkZXNjLCBvcHRpb25zKTsKKyAgcHJpbnRlci5QcmludCgiaWYgKGZhbHNlKSB7XG4iKTsKKyAgSW5kZW50KCZwcmludGVyKTsKKyAgcHJpbnRlci5QcmludCgiLyoqXG4iKTsKKyAgcHJpbnRlci5QcmludCgiICogVGhpcyBjbGFzcyBpcyBkZXByZWNhdGVkLiBVc2UgXm5ld14gaW5zdGVhZC5cbiIsCisgICAgICAibmV3IiwgbmV3bmFtZSk7CisgIHByaW50ZXIuUHJpbnQoIiAqIEBkZXByZWNhdGVkXG4iKTsKKyAgcHJpbnRlci5QcmludCgiICovXG4iKTsKKyAgcHJpbnRlci5QcmludCgiY2xhc3MgXm9sZF4ge31cbiIsCisgICAgICAib2xkIiwgTGVnYWN5R2VuZXJhdGVkQ2xhc3NOYW1lKGRlc2MpKTsKKyAgT3V0ZGVudCgmcHJpbnRlcik7CisgIHByaW50ZXIuUHJpbnQoIn1cbiIpOworICBwcmludGVyLlByaW50KCJjbGFzc19leGlzdHMoXm5ld146OmNsYXNzKTtcbiIsCisgICAgICAibmV3IiwgR2VuZXJhdGVkQ2xhc3NOYW1lSW1wbChkZXNjKSk7CisgIHByaW50ZXIuUHJpbnQoIkB0cmlnZ2VyX2Vycm9yKCdeb2xkXiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gIgorICAgICAgInRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIFVzZSBeZnVsbG5hbWVeIGluc3RlYWQnLCBFX1VTRVJfREVQUkVDQVRFRCk7XG5cbiIsCisgICAgICAib2xkIiwgTGVnYWN5RnVsbENsYXNzTmFtZShkZXNjLCBvcHRpb25zKSwKKyAgICAgICJmdWxsbmFtZSIsIG5ld25hbWUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclR5cGU+Cit2b2lkIExlZ2FjeVJlYWRPbmx5R2VuZXJhdGVDbGFzc0ZpbGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JUeXBlKiBkZXNjLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCkgeworICBzdGQ6OnN0cmluZyBmdWxsbmFtZSA9IEZ1bGxDbGFzc05hbWUoZGVzYywgb3B0aW9ucyk7CisgIHN0ZDo6c3RyaW5nIHBocF9uYW1lc3BhY2U7CisgIHN0ZDo6c3RyaW5nIGNsYXNzbmFtZTsKKyAgaW50IGxhc3RpbmRleCA9IGZ1bGxuYW1lLmZpbmRfbGFzdF9vZigiXFwiKTsKKworICBpZiAobGFzdGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgcGhwX25hbWVzcGFjZSA9IGZ1bGxuYW1lLnN1YnN0cigwLCBsYXN0aW5kZXgpOworICAgIGNsYXNzbmFtZSA9IGZ1bGxuYW1lLnN1YnN0cihsYXN0aW5kZXggKyAxKTsKKyAgfSBlbHNlIHsKKyAgICBwaHBfbmFtZXNwYWNlID0gIiI7CisgICAgY2xhc3NuYW1lID0gZnVsbG5hbWU7CisgIH0KKworICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IExlZ2FjeVJlYWRPbmx5R2VuZXJhdGVkQ2xhc3NGaWxlTmFtZShwaHBfbmFtZXNwYWNlLCBkZXNjKTsKKyAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgZ2VuZXJhdG9yX2NvbnRleHQtPk9wZW4oZmlsZW5hbWUpKTsKKyAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICdeJyk7CisKKyAgR2VuZXJhdGVIZWFkKGZpbGUsICZwcmludGVyKTsKKworICBpZiAoIXBocF9uYW1lc3BhY2UuZW1wdHkoKSkgeworICAgIHByaW50ZXIuUHJpbnQoCisgICAgICAgICJuYW1lc3BhY2UgXm5hbWVeO1xuXG4iLAorICAgICAgICAibmFtZSIsIHBocF9uYW1lc3BhY2UpOworICB9CisKKyAgcHJpbnRlci5QcmludCgiY2xhc3NfZXhpc3RzKF5uZXdeOjpjbGFzcyk7IC8vIGF1dG9sb2FkIHRoZSBuZXcgY2xhc3MsIHdoaWNoICIKKyAgICAgICJ3aWxsIGFsc28gY3JlYXRlIGFuIGFsaWFzIHRvIHRoZSBkZXByZWNhdGVkIGNsYXNzXG4iLAorICAgICAgIm5ldyIsIGNsYXNzbmFtZSk7CisgIHByaW50ZXIuUHJpbnQoIkB0cmlnZ2VyX2Vycm9yKF9fTkFNRVNQQUNFX18gLiAnXFxeb2xkXiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gIgorICAgICAgInRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIFVzZSBeZnVsbG5hbWVeIGluc3RlYWQnLCBFX1VTRVJfREVQUkVDQVRFRCk7XG5cbiIsCisgICAgICAib2xkIiwgZGVzYy0+bmFtZSgpLAorICAgICAgImZ1bGxuYW1lIiwgY2xhc3NuYW1lKTsKK30KKwordm9pZCBHZW5lcmF0ZUVudW1GaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBFbnVtRGVzY3JpcHRvciogZW4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCkgeworICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IEdlbmVyYXRlZENsYXNzRmlsZU5hbWUoZW4sIG9wdGlvbnMpOworICBzdGQ6OnVuaXF1ZV9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICBnZW5lcmF0b3JfY29udGV4dC0+T3BlbihmaWxlbmFtZSkpOworICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJ14nKTsKKworICBHZW5lcmF0ZUhlYWQoZmlsZSwgJnByaW50ZXIpOworCisgIHN0ZDo6c3RyaW5nIGZ1bGxuYW1lID0gRmlsZW5hbWVUb0NsYXNzbmFtZShmaWxlbmFtZSk7CisgIGludCBsYXN0aW5kZXggPSBmdWxsbmFtZS5maW5kX2xhc3Rfb2YoIlxcIik7CisKKyAgaWYgKGxhc3RpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgIHByaW50ZXIuUHJpbnQoCisgICAgICAgICJuYW1lc3BhY2UgXm5hbWVeO1xuXG4iLAorICAgICAgICAibmFtZSIsIGZ1bGxuYW1lLnN1YnN0cigwLCBsYXN0aW5kZXgpKTsKKworICAgIC8vIFdlIG9ubHkgbmVlZCB0aGlzICd1c2UnIHN0YXRlbWVudCBpZiB0aGUgZW51bSBoYXMgYSBuYW1lc3BhY2UuCisgICAgLy8gT3RoZXJ3aXNlLCB3ZSBnZXQgYSB3YXJuaW5nIHRoYXQgdGhlIHVzZSBzdGF0ZW1lbnQgaGFzIG5vIGVmZmVjdC4KKyAgICBwcmludGVyLlByaW50KCJ1c2UgVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uO1xuXG4iKTsKKyAgfQorCisgIEdlbmVyYXRlRW51bURvY0NvbW1lbnQoJnByaW50ZXIsIGVuLCBvcHRpb25zKTsKKworICBpZiAobGFzdGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgZnVsbG5hbWUgPSBmdWxsbmFtZS5zdWJzdHIobGFzdGluZGV4ICsgMSk7CisgIH0KKworICBwcmludGVyLlByaW50KAorICAgICAgImNsYXNzIF5uYW1lXlxuIgorICAgICAgIntcbiIsCisgICAgICAibmFtZSIsIGZ1bGxuYW1lKTsKKyAgSW5kZW50KCZwcmludGVyKTsKKworICBib29sIGhhc1Jlc2VydmVkID0gZmFsc2U7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW4tPnZhbHVlX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlID0gZW4tPnZhbHVlKGkpOworICAgIEdlbmVyYXRlRW51bVZhbHVlRG9jQ29tbWVudCgmcHJpbnRlciwgdmFsdWUpOworCisgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gQ29uc3RhbnROYW1lUHJlZml4KHZhbHVlLT5uYW1lKCkpOworICAgIGlmICghcHJlZml4LmVtcHR5KCkpIHsKKyAgICAgIGhhc1Jlc2VydmVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwcmludGVyLlByaW50KCJjb25zdCBebmFtZV4gPSBebnVtYmVyXjtcbiIsCisgICAgICAgICAgICAgICAgICAibmFtZSIsIHByZWZpeCArIHZhbHVlLT5uYW1lKCksCisgICAgICAgICAgICAgICAgICAibnVtYmVyIiwgSW50VG9TdHJpbmcodmFsdWUtPm51bWJlcigpKSk7CisgIH0KKworICBwcmludGVyLlByaW50KCJcbnByaXZhdGUgc3RhdGljICR2YWx1ZVRvTmFtZSA9IFtcbiIpOworICBJbmRlbnQoJnByaW50ZXIpOworICBmb3IgKGludCBpID0gMDsgaSA8IGVuLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSA9IGVuLT52YWx1ZShpKTsKKyAgICBwcmludGVyLlByaW50KCJzZWxmOjpeY29uc3RhbnReID0+ICdebmFtZV4nLFxuIiwKKyAgICAgICAgICAgICAgICAgICJjb25zdGFudCIsIENvbnN0YW50TmFtZVByZWZpeCh2YWx1ZS0+bmFtZSgpKSArIHZhbHVlLT5uYW1lKCksCisgICAgICAgICAgICAgICAgICAibmFtZSIsIHZhbHVlLT5uYW1lKCkpOworICB9CisgIE91dGRlbnQoJnByaW50ZXIpOworICBwcmludGVyLlByaW50KCJdO1xuIik7CisKKyAgcHJpbnRlci5QcmludCgKKyAgICAgICJcbnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbmFtZSgkdmFsdWUpXG4iCisgICAgICAie1xuIik7CisgIEluZGVudCgmcHJpbnRlcik7CisgIHByaW50ZXIuUHJpbnQoImlmICghaXNzZXQoc2VsZjo6JHZhbHVlVG9OYW1lWyR2YWx1ZV0pKSB7XG4iKTsKKyAgSW5kZW50KCZwcmludGVyKTsKKyAgcHJpbnRlci5QcmludCgidGhyb3cgbmV3IFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbihzcHJpbnRmKFxuIik7CisgIEluZGVudCgmcHJpbnRlcik7CisgIEluZGVudCgmcHJpbnRlcik7CisgIHByaW50ZXIuUHJpbnQoIidFbnVtICVzIGhhcyBubyBuYW1lIGRlZmluZWQgZm9yIHZhbHVlICVzJywgX19DTEFTU19fLCAkdmFsdWUpKTtcbiIpOworICBPdXRkZW50KCZwcmludGVyKTsKKyAgT3V0ZGVudCgmcHJpbnRlcik7CisgIE91dGRlbnQoJnByaW50ZXIpOworICBwcmludGVyLlByaW50KCJ9XG4iCisgICAgICAgICAgICAgICAgInJldHVybiBzZWxmOjokdmFsdWVUb05hbWVbJHZhbHVlXTtcbiIpOworICBPdXRkZW50KCZwcmludGVyKTsKKyAgcHJpbnRlci5QcmludCgifVxuXG4iKTsKKworICBwcmludGVyLlByaW50KAorICAgICAgIlxucHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWx1ZSgkbmFtZSlcbiIKKyAgICAgICJ7XG4iKTsKKyAgSW5kZW50KCZwcmludGVyKTsKKyAgcHJpbnRlci5QcmludCgiJGNvbnN0ID0gX19DTEFTU19fIC4gJzo6JyAuIHN0cnRvdXBwZXIoJG5hbWUpO1xuIgorICAgICAgICAgICAgICAgICJpZiAoIWRlZmluZWQoJGNvbnN0KSkge1xuIik7CisgIEluZGVudCgmcHJpbnRlcik7CisgIGlmIChoYXNSZXNlcnZlZCkgeworICAgIHByaW50ZXIuUHJpbnQoIiRwYmNvbnN0ID0gIF9fQ0xBU1NfXy4gJzo6UEInIC4gc3RydG91cHBlcigkbmFtZSk7XG4iCisgICAgICAgICAgICAgICAgImlmICghZGVmaW5lZCgkcGJjb25zdCkpIHtcbiIpOworICAgIEluZGVudCgmcHJpbnRlcik7CisgIH0KKyAgcHJpbnRlci5QcmludCgidGhyb3cgbmV3IFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbihzcHJpbnRmKFxuIik7CisgIEluZGVudCgmcHJpbnRlcik7CisgIEluZGVudCgmcHJpbnRlcik7CisgIHByaW50ZXIuUHJpbnQoIidFbnVtICVzIGhhcyBubyB2YWx1ZSBkZWZpbmVkIGZvciBuYW1lICVzJywgX19DTEFTU19fLCAkbmFtZSkpO1xuIik7CisgIE91dGRlbnQoJnByaW50ZXIpOworICBPdXRkZW50KCZwcmludGVyKTsKKyAgaWYgKGhhc1Jlc2VydmVkKSB7CisgICAgT3V0ZGVudCgmcHJpbnRlcik7CisgICAgcHJpbnRlci5QcmludCgifVxuIgorICAgICAgICAgICAgICAgICAgInJldHVybiBjb25zdGFudCgkcGJjb25zdCk7XG4iKTsKKyAgfQorICBPdXRkZW50KCZwcmludGVyKTsKKyAgcHJpbnRlci5QcmludCgifVxuIgorICAgICAgICAgICAgICAgICJyZXR1cm4gY29uc3RhbnQoJGNvbnN0KTtcbiIpOworICBPdXRkZW50KCZwcmludGVyKTsKKyAgcHJpbnRlci5QcmludCgifVxuIik7CisKKyAgT3V0ZGVudCgmcHJpbnRlcik7CisgIHByaW50ZXIuUHJpbnQoIn1cblxuIik7CisKKyAgLy8gd3JpdGUgbGVnYWN5IGZpbGUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggbmVzdGVkIG1lc3NhZ2VzIGFuZCBlbnVtcworICBpZiAoZW4tPmNvbnRhaW5pbmdfdHlwZSgpICE9IE5VTEwpIHsKKyAgICBwcmludGVyLlByaW50KAorICAgICAgICAiLy8gQWRkaW5nIGEgY2xhc3MgYWxpYXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHByZXZpb3VzIGNsYXNzIG5hbWUuXG4iKTsKKyAgICBwcmludGVyLlByaW50KAorICAgICAgICAiY2xhc3NfYWxpYXMoXm5ld146OmNsYXNzLCBcXF5vbGReOjpjbGFzcyk7XG5cbiIsCisgICAgICAgICJuZXciLCBmdWxsbmFtZSwKKyAgICAgICAgIm9sZCIsIExlZ2FjeUZ1bGxDbGFzc05hbWUoZW4sIG9wdGlvbnMpKTsKKyAgICBMZWdhY3lHZW5lcmF0ZUNsYXNzRmlsZShmaWxlLCBlbiwgb3B0aW9ucywgZ2VuZXJhdG9yX2NvbnRleHQpOworICB9CisKKyAgLy8gV3JpdGUgbGVnYWN5IGZpbGUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggInJlYWRvbmx5IiBrZXl3d29yZAorICBzdGQ6OnN0cmluZyBsb3dlciA9IGVuLT5uYW1lKCk7CisgIHN0ZDo6dHJhbnNmb3JtKGxvd2VyLmJlZ2luKCksIGxvd2VyLmVuZCgpLCBsb3dlci5iZWdpbigpLCA6OnRvbG93ZXIpOworICBpZiAobG93ZXIgPT0gInJlYWRvbmx5IikgeworICAgIHByaW50ZXIuUHJpbnQoCisgICAgICAgICIvLyBBZGRpbmcgYSBjbGFzcyBhbGlhcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgXCJyZWFkb25seVwiIGtleXdvcmQuXG4iKTsKKyAgICBwcmludGVyLlByaW50KAorICAgICAgICAiY2xhc3NfYWxpYXMoXm5ld146OmNsYXNzLCBfX05BTUVTUEFDRV9fIC4gJ1xcXm9sZF4nKTtcblxuIiwKKyAgICAgICAgIm5ldyIsIGZ1bGxuYW1lLAorICAgICAgICAib2xkIiwgZW4tPm5hbWUoKSk7CisgICAgTGVnYWN5UmVhZE9ubHlHZW5lcmF0ZUNsYXNzRmlsZShmaWxlLCBlbiwgb3B0aW9ucywgZ2VuZXJhdG9yX2NvbnRleHQpOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdGVNZXNzYWdlRmlsZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0KSB7CisgIC8vIERvbid0IGdlbmVyYXRlIE1hcEVudHJ5IG1lc3NhZ2VzIC0tIHdlIHVzZSB0aGUgUEhQIGV4dGVuc2lvbidzIG5hdGl2ZQorICAvLyBzdXBwb3J0IGZvciBtYXAgZmllbGRzIGluc3RlYWQuCisgIGlmIChtZXNzYWdlLT5vcHRpb25zKCkubWFwX2VudHJ5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IEdlbmVyYXRlZENsYXNzRmlsZU5hbWUobWVzc2FnZSwgb3B0aW9ucyk7CisgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgIGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKGZpbGVuYW1lKSk7CisgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnXicpOworCisgIEdlbmVyYXRlSGVhZChmaWxlLCAmcHJpbnRlcik7CisKKyAgc3RkOjpzdHJpbmcgZnVsbG5hbWUgPSBGaWxlbmFtZVRvQ2xhc3NuYW1lKGZpbGVuYW1lKTsKKyAgaW50IGxhc3RpbmRleCA9IGZ1bGxuYW1lLmZpbmRfbGFzdF9vZigiXFwiKTsKKworICBpZiAobGFzdGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgcHJpbnRlci5QcmludCgKKyAgICAgICAgIm5hbWVzcGFjZSBebmFtZV47XG5cbiIsCisgICAgICAgICJuYW1lIiwgZnVsbG5hbWUuc3Vic3RyKDAsIGxhc3RpbmRleCkpOworICB9CisKKyAgR2VuZXJhdGVVc2VEZWNsYXJhdGlvbihvcHRpb25zLCAmcHJpbnRlcik7CisKKyAgR2VuZXJhdGVNZXNzYWdlRG9jQ29tbWVudCgmcHJpbnRlciwgbWVzc2FnZSwgb3B0aW9ucyk7CisgIGlmIChsYXN0aW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBmdWxsbmFtZSA9IGZ1bGxuYW1lLnN1YnN0cihsYXN0aW5kZXggKyAxKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGJhc2U7CisKKyAgc3dpdGNoIChtZXNzYWdlLT53ZWxsX2tub3duX3R5cGUoKSkgeworICAgIGNhc2UgRGVzY3JpcHRvcjo6V0VMTEtOT1dOVFlQRV9BTlk6CisgICAgICBiYXNlID0gIlxcR29vZ2xlXFxQcm90b2J1ZlxcSW50ZXJuYWxcXEFueUJhc2UiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEZXNjcmlwdG9yOjpXRUxMS05PV05UWVBFX1RJTUVTVEFNUDoKKyAgICAgIGJhc2UgPSAiXFxHb29nbGVcXFByb3RvYnVmXFxJbnRlcm5hbFxcVGltZXN0YW1wQmFzZSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYmFzZSA9ICJcXEdvb2dsZVxcUHJvdG9idWZcXEludGVybmFsXFxNZXNzYWdlIjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcHJpbnRlci5QcmludCgKKyAgICAgICJjbGFzcyBebmFtZV4gZXh0ZW5kcyBeYmFzZV5cbiIKKyAgICAgICJ7XG4iLAorICAgICAgImJhc2UiLCBiYXNlLAorICAgICAgIm5hbWUiLCBmdWxsbmFtZSk7CisgIEluZGVudCgmcHJpbnRlcik7CisKKyAgLy8gRmllbGQgYW5kIG9uZW9mIGRlZmluaXRpb25zLgorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBtZXNzYWdlLT5maWVsZChpKTsKKyAgICBHZW5lcmF0ZUZpZWxkKGZpZWxkLCAmcHJpbnRlciwgb3B0aW9ucyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5yZWFsX29uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZiA9IG1lc3NhZ2UtPm9uZW9mX2RlY2woaSk7CisgICAgR2VuZXJhdGVPbmVvZkZpZWxkKG9uZW9mLCAmcHJpbnRlcik7CisgIH0KKyAgcHJpbnRlci5QcmludCgiXG4iKTsKKworICBHZW5lcmF0ZU1lc3NhZ2VDb25zdHJ1Y3RvckRvY0NvbW1lbnQoJnByaW50ZXIsIG1lc3NhZ2UsIG9wdGlvbnMpOworICBwcmludGVyLlByaW50KAorICAgICAgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZGF0YSA9IE5VTEwpIHtcbiIpOworICBJbmRlbnQoJnByaW50ZXIpOworCisgIHN0ZDo6c3RyaW5nIG1ldGFkYXRhX2ZpbGVuYW1lID0gR2VuZXJhdGVkTWV0YWRhdGFGaWxlTmFtZShmaWxlLCBvcHRpb25zKTsKKyAgc3RkOjpzdHJpbmcgbWV0YWRhdGFfZnVsbG5hbWUgPSBGaWxlbmFtZVRvQ2xhc3NuYW1lKG1ldGFkYXRhX2ZpbGVuYW1lKTsKKyAgcHJpbnRlci5QcmludCgKKyAgICAgICJcXF5mdWxsbmFtZV46OmluaXRPbmNlKCk7XG4iLAorICAgICAgImZ1bGxuYW1lIiwgbWV0YWRhdGFfZnVsbG5hbWUpOworCisgIHByaW50ZXIuUHJpbnQoCisgICAgICAicGFyZW50OjpfX2NvbnN0cnVjdCgkZGF0YSk7XG4iKTsKKworICBPdXRkZW50KCZwcmludGVyKTsKKyAgcHJpbnRlci5QcmludCgifVxuXG4iKTsKKworICAvLyBGaWVsZCBhbmQgb25lb2YgYWNjZXNzb3JzLgorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBtZXNzYWdlLT5maWVsZChpKTsKKyAgICBHZW5lcmF0ZUZpZWxkQWNjZXNzb3IoZmllbGQsIG9wdGlvbnMsICZwcmludGVyKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPnJlYWxfb25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gbWVzc2FnZS0+b25lb2ZfZGVjbChpKTsKKyAgICBwcmludGVyLlByaW50KAorICAgICAgIi8qKlxuIgorICAgICAgIiAqIEByZXR1cm4gc3RyaW5nXG4iCisgICAgICAiICovXG4iCisgICAgICAicHVibGljIGZ1bmN0aW9uIGdldF5jYW1lbF9uYW1lXigpXG4iCisgICAgICAie1xuIgorICAgICAgIiAgICByZXR1cm4gJHRoaXMtPndoaWNoT25lb2YoXCJebmFtZV5cIik7XG4iCisgICAgICAifVxuXG4iLAorICAgICAgImNhbWVsX25hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG9uZW9mLT5uYW1lKCksIHRydWUpLCAibmFtZSIsCisgICAgICBvbmVvZi0+bmFtZSgpKTsKKyAgfQorCisgIE91dGRlbnQoJnByaW50ZXIpOworICBwcmludGVyLlByaW50KCJ9XG5cbiIpOworCisgIC8vIHdyaXRlIGxlZ2FjeSBmaWxlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG5lc3RlZCBtZXNzYWdlcyBhbmQgZW51bXMKKyAgaWYgKG1lc3NhZ2UtPmNvbnRhaW5pbmdfdHlwZSgpICE9IE5VTEwpIHsKKyAgICBwcmludGVyLlByaW50KAorICAgICAgICAiLy8gQWRkaW5nIGEgY2xhc3MgYWxpYXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHByZXZpb3VzIGNsYXNzIG5hbWUuXG4iKTsKKyAgICBwcmludGVyLlByaW50KAorICAgICAgICAiY2xhc3NfYWxpYXMoXm5ld146OmNsYXNzLCBcXF5vbGReOjpjbGFzcyk7XG5cbiIsCisgICAgICAgICJuZXciLCBmdWxsbmFtZSwKKyAgICAgICAgIm9sZCIsIExlZ2FjeUZ1bGxDbGFzc05hbWUobWVzc2FnZSwgb3B0aW9ucykpOworICAgIExlZ2FjeUdlbmVyYXRlQ2xhc3NGaWxlKGZpbGUsIG1lc3NhZ2UsIG9wdGlvbnMsIGdlbmVyYXRvcl9jb250ZXh0KTsKKyAgfQorCisgIC8vIFdyaXRlIGxlZ2FjeSBmaWxlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoICJyZWFkb25seSIga2V5d3dvcmQKKyAgc3RkOjpzdHJpbmcgbG93ZXIgPSBtZXNzYWdlLT5uYW1lKCk7CisgIHN0ZDo6dHJhbnNmb3JtKGxvd2VyLmJlZ2luKCksIGxvd2VyLmVuZCgpLCBsb3dlci5iZWdpbigpLCA6OnRvbG93ZXIpOworICBpZiAobG93ZXIgPT0gInJlYWRvbmx5IikgeworICAgIHByaW50ZXIuUHJpbnQoCisgICAgICAgICIvLyBBZGRpbmcgYSBjbGFzcyBhbGlhcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgXCJyZWFkb25seVwiIGtleXdvcmQuXG4iKTsKKyAgICBwcmludGVyLlByaW50KAorICAgICAgICAiY2xhc3NfYWxpYXMoXm5ld146OmNsYXNzLCBfX05BTUVTUEFDRV9fIC4gJ1xcXm9sZF4nKTtcblxuIiwKKyAgICAgICAgIm5ldyIsIGZ1bGxuYW1lLAorICAgICAgICAib2xkIiwgbWVzc2FnZS0+bmFtZSgpKTsKKyAgICBMZWdhY3lSZWFkT25seUdlbmVyYXRlQ2xhc3NGaWxlKGZpbGUsIG1lc3NhZ2UsIG9wdGlvbnMsIGdlbmVyYXRvcl9jb250ZXh0KTsKKyAgfQorCisgIC8vIE5lc3RlZCBtZXNzYWdlcyBhbmQgZW51bXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgR2VuZXJhdGVNZXNzYWdlRmlsZShmaWxlLCBtZXNzYWdlLT5uZXN0ZWRfdHlwZShpKSwgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcl9jb250ZXh0KTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBHZW5lcmF0ZUVudW1GaWxlKGZpbGUsIG1lc3NhZ2UtPmVudW1fdHlwZShpKSwgb3B0aW9ucywgZ2VuZXJhdG9yX2NvbnRleHQpOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdGVTZXJ2aWNlRmlsZSgKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UsCisgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQpIHsKKyAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBHZW5lcmF0ZWRTZXJ2aWNlRmlsZU5hbWUoc2VydmljZSwgb3B0aW9ucyk7CisgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgIGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKGZpbGVuYW1lKSk7CisgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnXicpOworCisgIEdlbmVyYXRlSGVhZChmaWxlLCAmcHJpbnRlcik7CisKKyAgc3RkOjpzdHJpbmcgZnVsbG5hbWUgPSBGaWxlbmFtZVRvQ2xhc3NuYW1lKGZpbGVuYW1lKTsKKyAgaW50IGxhc3RpbmRleCA9IGZ1bGxuYW1lLmZpbmRfbGFzdF9vZigiXFwiKTsKKworICBpZiAoIWZpbGUtPm9wdGlvbnMoKS5waHBfbmFtZXNwYWNlKCkuZW1wdHkoKSB8fAorICAgICAgKCFmaWxlLT5vcHRpb25zKCkuaGFzX3BocF9uYW1lc3BhY2UoKSAmJiAhZmlsZS0+cGFja2FnZSgpLmVtcHR5KCkpIHx8CisgICAgICBsYXN0aW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBwcmludGVyLlByaW50KAorICAgICAgICAibmFtZXNwYWNlIF5uYW1lXjtcblxuIiwKKyAgICAgICAgIm5hbWUiLCBmdWxsbmFtZS5zdWJzdHIoMCwgbGFzdGluZGV4KSk7CisgIH0KKworICBHZW5lcmF0ZVNlcnZpY2VEb2NDb21tZW50KCZwcmludGVyLCBzZXJ2aWNlKTsKKworICBpZiAobGFzdGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgcHJpbnRlci5QcmludCgKKyAgICAgICAgImludGVyZmFjZSBebmFtZV5cbiIKKyAgICAgICAgIntcbiIsCisgICAgICAgICJuYW1lIiwgZnVsbG5hbWUuc3Vic3RyKGxhc3RpbmRleCArIDEpKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLlByaW50KAorICAgICAgICAiaW50ZXJmYWNlIF5uYW1lXlxuIgorICAgICAgICAie1xuIiwKKyAgICAgICAgIm5hbWUiLCBmdWxsbmFtZSk7CisgIH0KKworICBJbmRlbnQoJnByaW50ZXIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZS0+bWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IHNlcnZpY2UtPm1ldGhvZChpKTsKKyAgICBHZW5lcmF0ZVNlcnZpY2VNZXRob2REb2NDb21tZW50KCZwcmludGVyLCBtZXRob2QpOworICAgIEdlbmVyYXRlU2VydmljZU1ldGhvZChtZXRob2QsICZwcmludGVyKTsKKyAgfQorCisgIE91dGRlbnQoJnByaW50ZXIpOworICBwcmludGVyLlByaW50KCJ9XG5cbiIpOworfQorCit2b2lkIEdlbmVyYXRlRmlsZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0KSB7CisgIEdlbmVyYXRlTWV0YWRhdGFGaWxlKGZpbGUsIG9wdGlvbnMsIGdlbmVyYXRvcl9jb250ZXh0KTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBHZW5lcmF0ZU1lc3NhZ2VGaWxlKGZpbGUsIGZpbGUtPm1lc3NhZ2VfdHlwZShpKSwgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcl9jb250ZXh0KTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBHZW5lcmF0ZUVudW1GaWxlKGZpbGUsIGZpbGUtPmVudW1fdHlwZShpKSwgb3B0aW9ucywgZ2VuZXJhdG9yX2NvbnRleHQpOworICB9CisgIGlmIChmaWxlLT5vcHRpb25zKCkucGhwX2dlbmVyaWNfc2VydmljZXMoKSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+c2VydmljZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIEdlbmVyYXRlU2VydmljZUZpbGUoZmlsZSwgZmlsZS0+c2VydmljZShpKSwgb3B0aW9ucywgZ2VuZXJhdG9yX2NvbnRleHQpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgRXNjYXBlUGhwZG9jKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCkgeworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5yZXNlcnZlKGlucHV0LnNpemUoKSAqIDIpOworCisgIGNoYXIgcHJldiA9ICcqJzsKKworICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBpbnB1dC5zaXplKCk7IGkrKykgeworICAgIGNoYXIgYyA9IGlucHV0W2ldOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAnKic6CisgICAgICAgIC8vIEF2b2lkICIvKiIuCisgICAgICAgIGlmIChwcmV2ID09ICcvJykgeworICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiYjNDI7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICAvLyBBdm9pZCAiKi8iLgorICAgICAgICBpZiAocHJldiA9PSAnKicpIHsKKyAgICAgICAgICByZXN1bHQuYXBwZW5kKCImIzQ3OyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soYyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdAJzoKKyAgICAgICAgLy8gJ0AnIHN0YXJ0cyBwaHBkb2MgdGFncyBpbmNsdWRpbmcgdGhlIEBkZXByZWNhdGVkIHRhZywgd2hpY2ggd2lsbAorICAgICAgICAvLyBjYXVzZSBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBpbnNlcnRlZCBiZWZvcmUgYSBkZWNsYXJhdGlvbiB0aGF0CisgICAgICAgIC8vIGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIEBEZXByZWNhdGVkIGFubm90YXRpb24uCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiYjNjQ7Iik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcHJldiA9IGM7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBHZW5lcmF0ZURvY0NvbW1lbnRCb2R5Rm9yTG9jYXRpb24oCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IFNvdXJjZUxvY2F0aW9uJiBsb2NhdGlvbiwgYm9vbCB0cmFpbGluZ05ld2xpbmUsCisgICAgaW50IGluZGVudENvdW50KSB7CisgIHN0ZDo6c3RyaW5nIGNvbW1lbnRzID0gbG9jYXRpb24ubGVhZGluZ19jb21tZW50cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzOworICBpZiAoIWNvbW1lbnRzLmVtcHR5KCkpIHsKKyAgICAvLyBUT0RPKHRlYm9yaW5nKTogIElkZWFsbHkgd2Ugc2hvdWxkIHBhcnNlIHRoZSBjb21tZW50IHRleHQgYXMgTWFya2Rvd24gYW5kCisgICAgLy8gICB3cml0ZSBpdCBiYWNrIGFzIEhUTUwsIGJ1dCB0aGlzIHJlcXVpcmVzIGEgTWFya2Rvd24gcGFyc2VyLiAgRm9yIG5vdworICAgIC8vICAgd2UganVzdCB1c2UgdGhlIHByb3RvIGNvbW1lbnRzIHVuY2hhbmdlZC4KKworICAgIC8vIElmIHRoZSBjb21tZW50IGl0c2VsZiBjb250YWlucyBibG9jayBjb21tZW50IHN0YXJ0IG9yIGVuZCBtYXJrZXJzLAorICAgIC8vIEhUTUwtZXNjYXBlIHRoZW0gc28gdGhhdCB0aGV5IGRvbid0IGFjY2lkZW50YWxseSBjbG9zZSB0aGUgZG9jIGNvbW1lbnQuCisgICAgY29tbWVudHMgPSBFc2NhcGVQaHBkb2MoY29tbWVudHMpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzID0gU3BsaXQoY29tbWVudHMsICJcbiIsIHRydWUpOworICAgIHdoaWxlICghbGluZXMuZW1wdHkoKSAmJiBsaW5lcy5iYWNrKCkuZW1wdHkoKSkgeworICAgICAgbGluZXMucG9wX2JhY2soKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAvLyBNb3N0IGxpbmVzIHNob3VsZCBzdGFydCB3aXRoIGEgc3BhY2UuICBXYXRjaCBvdXQgZm9yIGxpbmVzIHRoYXQgc3RhcnQKKyAgICAgIC8vIHdpdGggYSAvLCBzaW5jZSBwdXR0aW5nIHRoYXQgcmlnaHQgYWZ0ZXIgdGhlIGxlYWRpbmcgYXN0ZXJpc2sgd2lsbAorICAgICAgLy8gY2xvc2UgdGhlIGNvbW1lbnQuCisgICAgICBpZiAoaW5kZW50Q291bnQgPT0gMCAmJiAhbGluZXNbaV0uZW1wdHkoKSAmJiBsaW5lc1tpXVswXSA9PSAnLycpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIiAqIF5saW5lXlxuIiwgImxpbmUiLCBsaW5lc1tpXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbmRlbnQgPSBzdGQ6OnN0cmluZyhpbmRlbnRDb3VudCwgJyAnKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIiAqXmluZF5ebGluZV5cbiIsICJpbmQiLCBpbmRlbnQsICJsaW5lIiwgbGluZXNbaV0pOworICAgICAgfQorICAgIH0KKyAgICBpZiAodHJhaWxpbmdOZXdsaW5lKSB7CisgICAgICBwcmludGVyLT5QcmludCgiICpcbiIpOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclR5cGU+CitzdGF0aWMgdm9pZCBHZW5lcmF0ZURvY0NvbW1lbnRCb2R5KAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBEZXNjcmlwdG9yVHlwZSogZGVzY3JpcHRvcikgeworICBTb3VyY2VMb2NhdGlvbiBsb2NhdGlvbjsKKyAgaWYgKGRlc2NyaXB0b3ItPkdldFNvdXJjZUxvY2F0aW9uKCZsb2NhdGlvbikpIHsKKyAgICBHZW5lcmF0ZURvY0NvbW1lbnRCb2R5Rm9yTG9jYXRpb24ocHJpbnRlciwgbG9jYXRpb24sIHRydWUsIDApOworICB9Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBGaXJzdExpbmVPZihjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gdmFsdWU7CisKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSByZXN1bHQuZmluZF9maXJzdF9vZignXG4nKTsKKyAgaWYgKHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgIHJlc3VsdC5lcmFzZShwb3MpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBHZW5lcmF0ZU1lc3NhZ2VEb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcHJpbnRlci0+UHJpbnQoIi8qKlxuIik7CisgIEdlbmVyYXRlRG9jQ29tbWVudEJvZHkocHJpbnRlciwgbWVzc2FnZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICIgKiBHZW5lcmF0ZWQgZnJvbSBwcm90b2J1ZiBtZXNzYWdlIDxjb2RlPl5tZXNzYWdlbmFtZV48L2NvZGU+XG4iCisgICAgIiAqL1xuIiwKKyAgICAiZnVsbG5hbWUiLCBFc2NhcGVQaHBkb2MoRnVsbENsYXNzTmFtZShtZXNzYWdlLCBvcHRpb25zKSksCisgICAgIm1lc3NhZ2VuYW1lIiwgRXNjYXBlUGhwZG9jKG1lc3NhZ2UtPmZ1bGxfbmFtZSgpKSk7Cit9CisKK3ZvaWQgR2VuZXJhdGVNZXNzYWdlQ29uc3RydWN0b3JEb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgLy8gSW4gdGhlb3J5IHdlIHNob3VsZCBoYXZlIHNsaWdodGx5IGRpZmZlcmVudCBjb21tZW50cyBmb3Igc2V0dGVycywgZ2V0dGVycywKKyAgLy8gZXRjLiwgYnV0IGluIHByYWN0aWNlIGV2ZXJ5b25lIGFscmVhZHkga25vd3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZQorICAvLyBzbyBpdCdzIHJlZHVuZGFudCBpbmZvcm1hdGlvbi4KKworICAvLyBXZSBzdGFydCB0aGUgY29tbWVudCB3aXRoIHRoZSBtYWluIGJvZHkgYmFzZWQgb24gdGhlIGNvbW1lbnRzIGZyb20gdGhlCisgIC8vIC5wcm90byBmaWxlIChpZiBwcmVzZW50KS4gV2UgdGhlbiBlbmQgd2l0aCB0aGUgZmllbGQgZGVjbGFyYXRpb24sIGUuZy46CisgIC8vICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDU7CisgIC8vIElmIHRoZSBmaWVsZCBpcyBhIGdyb3VwLCB0aGUgZGVidWcgc3RyaW5nIG1pZ2h0IGVuZCB3aXRoIHsuCisgIHByaW50ZXItPlByaW50KCIvKipcbiIpOworICBwcmludGVyLT5QcmludCgiICogQ29uc3RydWN0b3IuXG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoIiAqXG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoIiAqIEBwYXJhbSBhcnJheSAkZGF0YSB7XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoIiAqICAgICBPcHRpb25hbC4gRGF0YSBmb3IgcG9wdWxhdGluZyB0aGUgTWVzc2FnZSBvYmplY3QuXG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoIiAqXG4iKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gbWVzc2FnZS0+ZmllbGQoaSk7CisgICAgcHJpbnRlci0+UHJpbnQoIiAqICAgICBAdHlwZSBecGhwX3R5cGVeICRedmFyXlxuIiwKKyAgICAgICJwaHBfdHlwZSIsIFBocFNldHRlclR5cGVOYW1lKGZpZWxkLCBvcHRpb25zKSwKKyAgICAgICJ2YXIiLCBmaWVsZC0+bmFtZSgpKTsKKyAgICBTb3VyY2VMb2NhdGlvbiBsb2NhdGlvbjsKKyAgICBpZiAoZmllbGQtPkdldFNvdXJjZUxvY2F0aW9uKCZsb2NhdGlvbikpIHsKKyAgICAgIEdlbmVyYXRlRG9jQ29tbWVudEJvZHlGb3JMb2NhdGlvbihwcmludGVyLCBsb2NhdGlvbiwgZmFsc2UsIDEwKTsKKyAgICB9CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIiAqIH1cbiIpOworICBwcmludGVyLT5QcmludCgiICovXG4iKTsKK30KKwordm9pZCBHZW5lcmF0ZVNlcnZpY2VEb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlKSB7CisgIHByaW50ZXItPlByaW50KCIvKipcbiIpOworICBHZW5lcmF0ZURvY0NvbW1lbnRCb2R5KHByaW50ZXIsIHNlcnZpY2UpOworICBwcmludGVyLT5QcmludCgKKyAgICAiICogUHJvdG9idWYgdHlwZSA8Y29kZT5eZnVsbG5hbWVePC9jb2RlPlxuIgorICAgICIgKi9cbiIsCisgICAgImZ1bGxuYW1lIiwgRXNjYXBlUGhwZG9jKHNlcnZpY2UtPmZ1bGxfbmFtZSgpKSk7Cit9CisKK3ZvaWQgR2VuZXJhdGVGaWVsZERvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGludCBmdW5jdGlvbl90eXBlKSB7CisgIC8vIEluIHRoZW9yeSB3ZSBzaG91bGQgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgY29tbWVudHMgZm9yIHNldHRlcnMsIGdldHRlcnMsCisgIC8vIGV0Yy4sIGJ1dCBpbiBwcmFjdGljZSBldmVyeW9uZSBhbHJlYWR5IGtub3dzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UKKyAgLy8gc28gaXQncyByZWR1bmRhbnQgaW5mb3JtYXRpb24uCisKKyAgLy8gV2Ugc3RhcnQgdGhlIGNvbW1lbnQgd2l0aCB0aGUgbWFpbiBib2R5IGJhc2VkIG9uIHRoZSBjb21tZW50cyBmcm9tIHRoZQorICAvLyAucHJvdG8gZmlsZSAoaWYgcHJlc2VudCkuIFdlIHRoZW4gZW5kIHdpdGggdGhlIGZpZWxkIGRlY2xhcmF0aW9uLCBlLmcuOgorICAvLyAgIG9wdGlvbmFsIHN0cmluZyBmb28gPSA1OworICAvLyBJZiB0aGUgZmllbGQgaXMgYSBncm91cCwgdGhlIGRlYnVnIHN0cmluZyBtaWdodCBlbmQgd2l0aCB7LgorICBwcmludGVyLT5QcmludCgiLyoqXG4iKTsKKyAgR2VuZXJhdGVEb2NDb21tZW50Qm9keShwcmludGVyLCBmaWVsZCk7CisgIHByaW50ZXItPlByaW50KAorICAgICIgKiBHZW5lcmF0ZWQgZnJvbSBwcm90b2J1ZiBmaWVsZCA8Y29kZT5eZGVmXjwvY29kZT5cbiIsCisgICAgImRlZiIsIEVzY2FwZVBocGRvYyhGaXJzdExpbmVPZihmaWVsZC0+RGVidWdTdHJpbmcoKSkpKTsKKyAgaWYgKGZ1bmN0aW9uX3R5cGUgPT0ga0ZpZWxkU2V0dGVyKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIiAqIEBwYXJhbSBecGhwX3R5cGVeICR2YXJcbiIsCisgICAgICAicGhwX3R5cGUiLCBQaHBTZXR0ZXJUeXBlTmFtZShmaWVsZCwgb3B0aW9ucykpOworICAgIHByaW50ZXItPlByaW50KCIgKiBAcmV0dXJuICR0aGlzXG4iKTsKKyAgfSBlbHNlIGlmIChmdW5jdGlvbl90eXBlID09IGtGaWVsZEdldHRlcikgeworICAgIGJvb2wgY2FuX3JldHVybl9udWxsID0gZmllbGQtPmhhc19wcmVzZW5jZSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTsKKyAgICBwcmludGVyLT5QcmludCgiICogQHJldHVybiBecGhwX3R5cGVeXm1heWJlX251bGxeXG4iLAorICAgICAgInBocF90eXBlIiwgUGhwR2V0dGVyVHlwZU5hbWUoZmllbGQsIG9wdGlvbnMpLAorICAgICAgIm1heWJlX251bGwiLCBjYW5fcmV0dXJuX251bGwgPyAifG51bGwiIDogIiIpOworICB9CisgIGlmIChmaWVsZC0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KCIgKiBAZGVwcmVjYXRlZFxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIiAqL1xuIik7Cit9CisKK3ZvaWQgR2VuZXJhdGVXcmFwcGVyRmllbGRHZXR0ZXJEb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIC8vIEdlbmVyYXRlIGEgZG9jIGNvbW1lbnQgZm9yIHRoZSBzcGVjaWFsIGdldFhYWFZhbHVlIG1ldGhvZHMgdGhhdCBhcmUKKyAgLy8gZ2VuZXJhdGVkIGZvciB3cmFwcGVyIHR5cGVzLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHByaW1pdGl2ZUZpZWxkID0gZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5GaW5kRmllbGRCeU5hbWUoInZhbHVlIik7CisgIHByaW50ZXItPlByaW50KCIvKipcbiIpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICIgKiBSZXR1cm5zIHRoZSB1bmJveGVkIHZhbHVlIGZyb20gPGNvZGU+Z2V0XmNhbWVsX25hbWVeKCk8L2NvZGU+XG5cbiIsCisgICAgICAiY2FtZWxfbmFtZSIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSkpOworICBHZW5lcmF0ZURvY0NvbW1lbnRCb2R5KHByaW50ZXIsIGZpZWxkKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAqIEdlbmVyYXRlZCBmcm9tIHByb3RvYnVmIGZpZWxkIDxjb2RlPl5kZWZePC9jb2RlPlxuIiwKKyAgICAiZGVmIiwgRXNjYXBlUGhwZG9jKEZpcnN0TGluZU9mKGZpZWxkLT5EZWJ1Z1N0cmluZygpKSkpOworICBwcmludGVyLT5QcmludCgiICogQHJldHVybiBecGhwX3R5cGVefG51bGxcbiIsCisgICAgICAgICJwaHBfdHlwZSIsIFBocEdldHRlclR5cGVOYW1lKHByaW1pdGl2ZUZpZWxkLCBmYWxzZSkpOworICBwcmludGVyLT5QcmludCgiICovXG4iKTsKK30KKwordm9pZCBHZW5lcmF0ZVdyYXBwZXJGaWVsZFNldHRlckRvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgLy8gR2VuZXJhdGUgYSBkb2MgY29tbWVudCBmb3IgdGhlIHNwZWNpYWwgc2V0WFhYVmFsdWUgbWV0aG9kcyB0aGF0IGFyZQorICAvLyBnZW5lcmF0ZWQgZm9yIHdyYXBwZXIgdHlwZXMuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcHJpbWl0aXZlRmllbGQgPSBmaWVsZC0+bWVzc2FnZV90eXBlKCktPkZpbmRGaWVsZEJ5TmFtZSgidmFsdWUiKTsKKyAgcHJpbnRlci0+UHJpbnQoIi8qKlxuIik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIiAqIFNldHMgdGhlIGZpZWxkIGJ5IHdyYXBwaW5nIGEgcHJpbWl0aXZlIHR5cGUgaW4gYSBebWVzc2FnZV9uYW1lXiBvYmplY3QuXG5cbiIsCisgICAgICAibWVzc2FnZV9uYW1lIiwgRnVsbENsYXNzTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCksIGZhbHNlKSk7CisgIEdlbmVyYXRlRG9jQ29tbWVudEJvZHkocHJpbnRlciwgZmllbGQpOworICBwcmludGVyLT5QcmludCgKKyAgICAiICogR2VuZXJhdGVkIGZyb20gcHJvdG9idWYgZmllbGQgPGNvZGU+XmRlZl48L2NvZGU+XG4iLAorICAgICJkZWYiLCBFc2NhcGVQaHBkb2MoRmlyc3RMaW5lT2YoZmllbGQtPkRlYnVnU3RyaW5nKCkpKSk7CisgIHByaW50ZXItPlByaW50KCIgKiBAcGFyYW0gXnBocF90eXBlXnxudWxsICR2YXJcbiIsCisgICAgICAgICJwaHBfdHlwZSIsIFBocFNldHRlclR5cGVOYW1lKHByaW1pdGl2ZUZpZWxkLCBmYWxzZSkpOworICBwcmludGVyLT5QcmludCgiICogQHJldHVybiAkdGhpc1xuIik7CisgIHByaW50ZXItPlByaW50KCIgKi9cbiIpOworfQorCit2b2lkIEdlbmVyYXRlRW51bURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHByaW50ZXItPlByaW50KCIvKipcbiIpOworICBHZW5lcmF0ZURvY0NvbW1lbnRCb2R5KHByaW50ZXIsIGVudW1fKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAqIFByb3RvYnVmIHR5cGUgPGNvZGU+XmZ1bGxuYW1lXjwvY29kZT5cbiIKKyAgICAiICovXG4iLAorICAgICJmdWxsbmFtZSIsIEVzY2FwZVBocGRvYyhlbnVtXy0+ZnVsbF9uYW1lKCkpKTsKK30KKwordm9pZCBHZW5lcmF0ZUVudW1WYWx1ZURvY0NvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgeworICBwcmludGVyLT5QcmludCgiLyoqXG4iKTsKKyAgR2VuZXJhdGVEb2NDb21tZW50Qm9keShwcmludGVyLCB2YWx1ZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICIgKiBHZW5lcmF0ZWQgZnJvbSBwcm90b2J1ZiBlbnVtIDxjb2RlPl5kZWZePC9jb2RlPlxuIgorICAgICIgKi9cbiIsCisgICAgImRlZiIsIEVzY2FwZVBocGRvYyhGaXJzdExpbmVPZih2YWx1ZS0+RGVidWdTdHJpbmcoKSkpKTsKK30KKwordm9pZCBHZW5lcmF0ZVNlcnZpY2VNZXRob2REb2NDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCkgeworICBwcmludGVyLT5QcmludCgiLyoqXG4iKTsKKyAgR2VuZXJhdGVEb2NDb21tZW50Qm9keShwcmludGVyLCBtZXRob2QpOworICBwcmludGVyLT5QcmludCgKKyAgICAiICogTWV0aG9kIDxjb2RlPl5tZXRob2RfbmFtZV48L2NvZGU+XG4iCisgICAgIiAqXG4iLAorICAgICJtZXRob2RfbmFtZSIsIEVzY2FwZVBocGRvYyhVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG1ldGhvZC0+bmFtZSgpLCBmYWxzZSkpKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAqIEBwYXJhbSBcXF5pbnB1dF90eXBlXiAkcmVxdWVzdFxuIiwKKyAgICAiaW5wdXRfdHlwZSIsIEVzY2FwZVBocGRvYyhGdWxsQ2xhc3NOYW1lKG1ldGhvZC0+aW5wdXRfdHlwZSgpLCBmYWxzZSkpKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAqIEByZXR1cm4gXFxecmV0dXJuX3R5cGVeXG4iCisgICAgIiAqL1xuIiwKKyAgICAicmV0dXJuX3R5cGUiLCBFc2NhcGVQaHBkb2MoRnVsbENsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCksIGZhbHNlKSkpOworfQorCitzdGQ6OnN0cmluZyBGaWxlbmFtZUNOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIHN0ZDo6c3RyaW5nIGNfbmFtZSA9IGZpbGUtPm5hbWUoKTsKKyAgY19uYW1lID0gU3RyaW5nUmVwbGFjZShjX25hbWUsICIuIiwgIl8iLCB0cnVlKTsKKyAgY19uYW1lID0gU3RyaW5nUmVwbGFjZShjX25hbWUsICIvIiwgIl8iLCB0cnVlKTsKKyAgcmV0dXJuIGNfbmFtZTsKK30KKwordm9pZCBHZW5lcmF0ZUNFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjLCBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBzdGQ6OnN0cmluZyBjX25hbWUgPSBkZXNjLT5mdWxsX25hbWUoKTsKKyAgY19uYW1lID0gU3RyaW5nUmVwbGFjZShjX25hbWUsICIuIiwgIl8iLCB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgcGhwX25hbWUgPSBGdWxsQ2xhc3NOYW1lKGRlc2MsIE9wdGlvbnMoKSk7CisgIHBocF9uYW1lID0gU3RyaW5nUmVwbGFjZShwaHBfbmFtZSwgIlxcIiwgIlxcXFwiLCB0cnVlKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiLyogJGNfbmFtZSQgKi9cbiIKKyAgICAgICJcbiIKKyAgICAgICJ6ZW5kX2NsYXNzX2VudHJ5KiAkY19uYW1lJF9jZTtcbiIKKyAgICAgICJcbiIKKyAgICAgICJQSFBfTUVUSE9EKCRjX25hbWUkLCBuYW1lKSB7XG4iCisgICAgICAiICAkZmlsZV9jX25hbWUkX0FkZERlc2NyaXB0b3IoKTtcbiIKKyAgICAgICIgIGNvbnN0IHVwYl9EZWZQb29sICpzeW10YWIgPSBEZXNjcmlwdG9yUG9vbF9HZXRTeW1ib2xUYWJsZSgpO1xuIgorICAgICAgIiAgY29uc3QgdXBiX0VudW1EZWYgKmUgPSB1cGJfRGVmUG9vbF9GaW5kRW51bUJ5TmFtZShzeW10YWIsIFwiJG5hbWUkXCIpO1xuIgorICAgICAgIiAgemVuZF9sb25nIHZhbHVlO1xuIgorICAgICAgIiAgaWYgKHplbmRfcGFyc2VfcGFyYW1ldGVycyhaRU5EX05VTV9BUkdTKCksIFwibFwiLCAmdmFsdWUpID09XG4iCisgICAgICAiICAgICAgRkFJTFVSRSkge1xuIgorICAgICAgIiAgICByZXR1cm47XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICBjb25zdCB1cGJfRW51bVZhbHVlRGVmKiBldiA9XG4iCisgICAgICAiICAgICAgdXBiX0VudW1EZWZfRmluZFZhbHVlQnlOdW1iZXIoZSwgdmFsdWUpO1xuIgorICAgICAgIiAgaWYgKCFldikge1xuIgorICAgICAgIiAgICB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9leChOVUxMLCAwLFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiRwaHBfbmFtZSQgaGFzIG5vIG5hbWUgXCJcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZWZpbmVkIGZvciB2YWx1ZSBcIiBaRU5EX0xPTkdfRk1UIFwiLlwiLFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7XG4iCisgICAgICAiICAgIHJldHVybjtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIFJFVFVSTl9TVFJJTkcodXBiX0VudW1WYWx1ZURlZl9OYW1lKGV2KSk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgIlBIUF9NRVRIT0QoJGNfbmFtZSQsIHZhbHVlKSB7XG4iCisgICAgICAiICAkZmlsZV9jX25hbWUkX0FkZERlc2NyaXB0b3IoKTtcbiIKKyAgICAgICIgIGNvbnN0IHVwYl9EZWZQb29sICpzeW10YWIgPSBEZXNjcmlwdG9yUG9vbF9HZXRTeW1ib2xUYWJsZSgpO1xuIgorICAgICAgIiAgY29uc3QgdXBiX0VudW1EZWYgKmUgPSB1cGJfRGVmUG9vbF9GaW5kRW51bUJ5TmFtZShzeW10YWIsIFwiJG5hbWUkXCIpO1xuIgorICAgICAgIiAgY2hhciAqbmFtZSA9IE5VTEw7XG4iCisgICAgICAiICBzaXplX3QgbmFtZV9sZW47XG4iCisgICAgICAiICBpZiAoemVuZF9wYXJzZV9wYXJhbWV0ZXJzKFpFTkRfTlVNX0FSR1MoKSwgXCJzXCIsICZuYW1lLFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZV9sZW4pID09IEZBSUxVUkUpIHtcbiIKKyAgICAgICIgICAgcmV0dXJuO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgY29uc3QgdXBiX0VudW1WYWx1ZURlZiogZXYgPSB1cGJfRW51bURlZl9GaW5kVmFsdWVCeU5hbWVXaXRoU2l6ZShcbiIKKyAgICAgICIgICAgICBlLCBuYW1lLCBuYW1lX2xlbik7XG4iCisgICAgICAiICBpZiAoIWV2KSB7XG4iCisgICAgICAiICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX2V4KE5VTEwsIDAsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiJHBocF9uYW1lJCBoYXMgbm8gdmFsdWUgXCJcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZWZpbmVkIGZvciBuYW1lICVzLlwiLFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTtcbiIKKyAgICAgICIgICAgcmV0dXJuO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgUkVUVVJOX0xPTkcodXBiX0VudW1WYWx1ZURlZl9OdW1iZXIoZXYpKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iCisgICAgICAic3RhdGljIHplbmRfZnVuY3Rpb25fZW50cnkgJGNfbmFtZSRfcGhwbWV0aG9kc1tdID0ge1xuIgorICAgICAgIiAgUEhQX01FKCRjX25hbWUkLCBuYW1lLCBhcmdpbmZvX2xvb2t1cCwgWkVORF9BQ0NfUFVCTElDIHwgWkVORF9BQ0NfU1RBVElDKVxuIgorICAgICAgIiAgUEhQX01FKCRjX25hbWUkLCB2YWx1ZSwgYXJnaW5mb19sb29rdXAsIFpFTkRfQUNDX1BVQkxJQyB8IFpFTkRfQUNDX1NUQVRJQylcbiIKKyAgICAgICIgIFpFTkRfRkVfRU5EXG4iCisgICAgICAifTtcbiIKKyAgICAgICJcbiIKKyAgICAgICJzdGF0aWMgdm9pZCAkY19uYW1lJF9Nb2R1bGVJbml0KCkge1xuIgorICAgICAgIiAgemVuZF9jbGFzc19lbnRyeSB0bXBfY2U7XG4iCisgICAgICAiXG4iCisgICAgICAiICBJTklUX0NMQVNTX0VOVFJZKHRtcF9jZSwgXCIkcGhwX25hbWUkXCIsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICRjX25hbWUkX3BocG1ldGhvZHMpO1xuIgorICAgICAgIlxuIgorICAgICAgIiAgJGNfbmFtZSRfY2UgPSB6ZW5kX3JlZ2lzdGVyX2ludGVybmFsX2NsYXNzKCZ0bXBfY2UpO1xuIiwKKyAgICAgICJuYW1lIiwgZGVzYy0+ZnVsbF9uYW1lKCksCisgICAgICAiZmlsZV9jX25hbWUiLCBGaWxlbmFtZUNOYW1lKGRlc2MtPmZpbGUoKSksCisgICAgICAiY19uYW1lIiwgY19uYW1lLAorICAgICAgInBocF9uYW1lIiwgcGhwX25hbWUpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzYy0+dmFsdWVfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUgPSBkZXNjLT52YWx1ZShpKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiAgemVuZF9kZWNsYXJlX2NsYXNzX2NvbnN0YW50X2xvbmcoJGNfbmFtZSRfY2UsIFwiJG5hbWUkXCIsXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihcIiRuYW1lJFwiKSwgJG51bSQpO1xuIiwKKyAgICAgICAgImNfbmFtZSIsIGNfbmFtZSwKKyAgICAgICAgIm5hbWUiLCB2YWx1ZS0+bmFtZSgpLAorICAgICAgICAibnVtIiwgc3RkOjp0b19zdHJpbmcodmFsdWUtPm51bWJlcigpKSk7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKK30KKwordm9pZCBHZW5lcmF0ZUNNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UsIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHN0ZDo6c3RyaW5nIGNfbmFtZSA9IG1lc3NhZ2UtPmZ1bGxfbmFtZSgpOworICBjX25hbWUgPSBTdHJpbmdSZXBsYWNlKGNfbmFtZSwgIi4iLCAiXyIsIHRydWUpOworICBzdGQ6OnN0cmluZyBwaHBfbmFtZSA9IEZ1bGxDbGFzc05hbWUobWVzc2FnZSwgT3B0aW9ucygpKTsKKyAgcGhwX25hbWUgPSBTdHJpbmdSZXBsYWNlKHBocF9uYW1lLCAiXFwiLCAiXFxcXCIsIHRydWUpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICIvKiAkY19uYW1lJCAqL1xuIgorICAgICAgIlxuIgorICAgICAgInplbmRfY2xhc3NfZW50cnkqICRjX25hbWUkX2NlO1xuIgorICAgICAgIlxuIgorICAgICAgInN0YXRpYyBQSFBfTUVUSE9EKCRjX25hbWUkLCBfX2NvbnN0cnVjdCkge1xuIgorICAgICAgIiAgJGZpbGVfY19uYW1lJF9BZGREZXNjcmlwdG9yKCk7XG4iCisgICAgICAiICB6aW1fTWVzc2FnZV9fX2NvbnN0cnVjdChJTlRFUk5BTF9GVU5DVElPTl9QQVJBTV9QQVNTVEhSVSk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgICJmaWxlX2NfbmFtZSIsIEZpbGVuYW1lQ05hbWUobWVzc2FnZS0+ZmlsZSgpKSwKKyAgICAgICJjX25hbWUiLCBjX25hbWUpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgYXV0byBmaWVsZCA9IG1lc3NhZ2UtPmZpZWxkKGkpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInN0YXRpYyBQSFBfTUVUSE9EKCRjX25hbWUkLCBnZXQkY2FtZWxfbmFtZSQpIHtcbiIKKyAgICAgICIgIE1lc3NhZ2UqIGludGVybiA9IChNZXNzYWdlKilaX09CSl9QKGdldFRoaXMoKSk7XG4iCisgICAgICAiICBjb25zdCB1cGJfRmllbGREZWYgKmYgPSB1cGJfTWVzc2FnZURlZl9GaW5kRmllbGRCeU5hbWUoXG4iCisgICAgICAiICAgICAgaW50ZXJuLT5kZXNjLT5tc2dkZWYsIFwiJG5hbWUkXCIpO1xuIgorICAgICAgIiAgenZhbCByZXQ7XG4iCisgICAgICAiICBNZXNzYWdlX2dldChpbnRlcm4sIGYsICZyZXQpO1xuIgorICAgICAgIiAgUkVUVVJOX0NPUFlfVkFMVUUoJnJldCk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgInN0YXRpYyBQSFBfTUVUSE9EKCRjX25hbWUkLCBzZXQkY2FtZWxfbmFtZSQpIHtcbiIKKyAgICAgICIgIE1lc3NhZ2UqIGludGVybiA9IChNZXNzYWdlKilaX09CSl9QKGdldFRoaXMoKSk7XG4iCisgICAgICAiICBjb25zdCB1cGJfRmllbGREZWYgKmYgPSB1cGJfTWVzc2FnZURlZl9GaW5kRmllbGRCeU5hbWUoXG4iCisgICAgICAiICAgICAgaW50ZXJuLT5kZXNjLT5tc2dkZWYsIFwiJG5hbWUkXCIpO1xuIgorICAgICAgIiAgenZhbCAqdmFsO1xuIgorICAgICAgIiAgaWYgKHplbmRfcGFyc2VfcGFyYW1ldGVycyhaRU5EX05VTV9BUkdTKCksIFwielwiLCAmdmFsKVxuIgorICAgICAgIiAgICAgID09IEZBSUxVUkUpIHtcbiIKKyAgICAgICIgICAgcmV0dXJuO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgTWVzc2FnZV9zZXQoaW50ZXJuLCBmLCB2YWwpO1xuIgorICAgICAgIiAgUkVUVVJOX0NPUFkoZ2V0VGhpcygpKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgImNfbmFtZSIsIGNfbmFtZSwKKyAgICAgICJuYW1lIiwgZmllbGQtPm5hbWUoKSwKKyAgICAgICJjYW1lbF9uYW1lIiwgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShmaWVsZC0+bmFtZSgpLCB0cnVlKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPnJlYWxfb25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKKyAgICBhdXRvIG9uZW9mID0gbWVzc2FnZS0+b25lb2ZfZGVjbChpKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJzdGF0aWMgUEhQX01FVEhPRCgkY19uYW1lJCwgZ2V0JGNhbWVsX25hbWUkKSB7XG4iCisgICAgICAiICBNZXNzYWdlKiBpbnRlcm4gPSAoTWVzc2FnZSopWl9PQkpfUChnZXRUaGlzKCkpO1xuIgorICAgICAgIiAgY29uc3QgdXBiX09uZW9mRGVmICpvbmVvZiA9IHVwYl9NZXNzYWdlRGVmX0ZpbmRPbmVvZkJ5TmFtZShcbiIKKyAgICAgICIgICAgICBpbnRlcm4tPmRlc2MtPm1zZ2RlZiwgXCIkbmFtZSRcIik7XG4iCisgICAgICAiICBjb25zdCB1cGJfRmllbGREZWYgKmZpZWxkID0gXG4iCisgICAgICAiICAgICAgdXBiX01lc3NhZ2VfV2hpY2hPbmVvZihpbnRlcm4tPm1zZywgb25lb2YpO1xuIgorICAgICAgIiAgUkVUVVJOX1NUUklORyhmaWVsZCA/IHVwYl9GaWVsZERlZl9OYW1lKGZpZWxkKSA6IFwiXCIpO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiY19uYW1lIiwgY19uYW1lLAorICAgICAgIm5hbWUiLCBvbmVvZi0+bmFtZSgpLAorICAgICAgImNhbWVsX25hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG9uZW9mLT5uYW1lKCksIHRydWUpKTsKKyAgfQorCisgIHN3aXRjaCAobWVzc2FnZS0+d2VsbF9rbm93bl90eXBlKCkpIHsKKyAgICBjYXNlIERlc2NyaXB0b3I6OldFTExLTk9XTlRZUEVfQU5ZOgorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIlpFTkRfQkVHSU5fQVJHX0lORk9fRVgoYXJnaW5mb19pcywgMCwgMCwgMSlcbiIKKyAgICAgICAgICAiICBaRU5EX0FSR19JTkZPKDAsIHByb3RvKVxuIgorICAgICAgICAgICJaRU5EX0VORF9BUkdfSU5GTygpXG4iCisgICAgICAgICAgIlxuIgorICAgICAgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRGVzY3JpcHRvcjo6V0VMTEtOT1dOVFlQRV9USU1FU1RBTVA6CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiWkVORF9CRUdJTl9BUkdfSU5GT19FWChhcmdpbmZvX3RpbWVzdGFtcF9mcm9tZGF0ZXRpbWUsIDAsIDAsIDEpXG4iCisgICAgICAgICAgIiAgWkVORF9BUkdfSU5GTygwLCBkYXRldGltZSlcbiIKKyAgICAgICAgICAiWkVORF9FTkRfQVJHX0lORk8oKVxuIgorICAgICAgICAgICJcbiIKKyAgICAgICk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJzdGF0aWMgemVuZF9mdW5jdGlvbl9lbnRyeSAkY19uYW1lJF9waHBtZXRob2RzW10gPSB7XG4iCisgICAgICAiICBQSFBfTUUoJGNfbmFtZSQsIF9fY29uc3RydWN0LCBhcmdpbmZvX2NvbnN0cnVjdCwgWkVORF9BQ0NfUFVCTElDKVxuIiwKKyAgICAgICJjX25hbWUiLCBjX25hbWUpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgYXV0byBmaWVsZCA9IG1lc3NhZ2UtPmZpZWxkKGkpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiAgUEhQX01FKCRjX25hbWUkLCBnZXQkY2FtZWxfbmFtZSQsIGFyZ2luZm9fdm9pZCwgWkVORF9BQ0NfUFVCTElDKVxuIgorICAgICAgIiAgUEhQX01FKCRjX25hbWUkLCBzZXQkY2FtZWxfbmFtZSQsIGFyZ2luZm9fc2V0dGVyLCBaRU5EX0FDQ19QVUJMSUMpXG4iLAorICAgICAgImNfbmFtZSIsIGNfbmFtZSwKKyAgICAgICJjYW1lbF9uYW1lIiwgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShmaWVsZC0+bmFtZSgpLCB0cnVlKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPnJlYWxfb25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKKyAgICBhdXRvIG9uZW9mID0gbWVzc2FnZS0+b25lb2ZfZGVjbChpKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIFBIUF9NRSgkY19uYW1lJCwgZ2V0JGNhbWVsX25hbWUkLCBhcmdpbmZvX3ZvaWQsIFpFTkRfQUNDX1BVQkxJQylcbiIsCisgICAgICAiY19uYW1lIiwgY19uYW1lLAorICAgICAgImNhbWVsX25hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG9uZW9mLT5uYW1lKCksIHRydWUpKTsKKyAgfQorCisgIC8vIEV4dHJhIGhhbmQtd3JpdHRlbiBmdW5jdGlvbnMgYWRkZWQgdG8gdGhlIHdlbGwta25vd24gdHlwZXMuCisgIHN3aXRjaCAobWVzc2FnZS0+d2VsbF9rbm93bl90eXBlKCkpIHsKKyAgICBjYXNlIERlc2NyaXB0b3I6OldFTExLTk9XTlRZUEVfQU5ZOgorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIFBIUF9NRSgkY19uYW1lJCwgaXMsIGFyZ2luZm9faXMsIFpFTkRfQUNDX1BVQkxJQylcbiIKKyAgICAgICAgIiAgUEhQX01FKCRjX25hbWUkLCBwYWNrLCBhcmdpbmZvX3NldHRlciwgWkVORF9BQ0NfUFVCTElDKVxuIgorICAgICAgICAiICBQSFBfTUUoJGNfbmFtZSQsIHVucGFjaywgYXJnaW5mb192b2lkLCBaRU5EX0FDQ19QVUJMSUMpXG4iLAorICAgICAgICAiY19uYW1lIiwgY19uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRGVzY3JpcHRvcjo6V0VMTEtOT1dOVFlQRV9USU1FU1RBTVA6CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiAgUEhQX01FKCRjX25hbWUkLCBmcm9tRGF0ZVRpbWUsIGFyZ2luZm9fdGltZXN0YW1wX2Zyb21kYXRldGltZSwgWkVORF9BQ0NfUFVCTElDKVxuIgorICAgICAgICAiICBQSFBfTUUoJGNfbmFtZSQsIHRvRGF0ZVRpbWUsIGFyZ2luZm9fdm9pZCwgWkVORF9BQ0NfUFVCTElDKVxuIiwKKyAgICAgICAgImNfbmFtZSIsIGNfbmFtZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIFpFTkRfRkVfRU5EXG4iCisgICAgICAifTtcbiIKKyAgICAgICJcbiIKKyAgICAgICJzdGF0aWMgdm9pZCAkY19uYW1lJF9Nb2R1bGVJbml0KCkge1xuIgorICAgICAgIiAgemVuZF9jbGFzc19lbnRyeSB0bXBfY2U7XG4iCisgICAgICAiXG4iCisgICAgICAiICBJTklUX0NMQVNTX0VOVFJZKHRtcF9jZSwgXCIkcGhwX25hbWUkXCIsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICRjX25hbWUkX3BocG1ldGhvZHMpO1xuIgorICAgICAgIlxuIgorICAgICAgIiAgJGNfbmFtZSRfY2UgPSB6ZW5kX3JlZ2lzdGVyX2ludGVybmFsX2NsYXNzKCZ0bXBfY2UpO1xuIgorICAgICAgIiAgJGNfbmFtZSRfY2UtPmNlX2ZsYWdzIHw9IFpFTkRfQUNDX0ZJTkFMO1xuIgorICAgICAgIiAgJGNfbmFtZSRfY2UtPmNyZWF0ZV9vYmplY3QgPSBNZXNzYWdlX2NyZWF0ZTtcbiIKKyAgICAgICIgIHplbmRfZG9faW5oZXJpdGFuY2UoJGNfbmFtZSRfY2UsIG1lc3NhZ2VfY2UpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIsCisgICAgICAiY19uYW1lIiwgY19uYW1lLAorICAgICAgInBocF9uYW1lIiwgcGhwX25hbWUpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgR2VuZXJhdGVDTWVzc2FnZShtZXNzYWdlLT5uZXN0ZWRfdHlwZShpKSwgcHJpbnRlcik7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgR2VuZXJhdGVDRW51bShtZXNzYWdlLT5lbnVtX3R5cGUoaSksIHByaW50ZXIpOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdGVFbnVtQ0luaXQoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2MsIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHN0ZDo6c3RyaW5nIGNfbmFtZSA9IGRlc2MtPmZ1bGxfbmFtZSgpOworICBjX25hbWUgPSBTdHJpbmdSZXBsYWNlKGNfbmFtZSwgIi4iLCAiXyIsIHRydWUpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgIiAgJGNfbmFtZSRfTW9kdWxlSW5pdCgpO1xuIiwKKyAgICAgICJjX25hbWUiLCBjX25hbWUpOworfQorCit2b2lkIEdlbmVyYXRlQ0luaXQoY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSwgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgc3RkOjpzdHJpbmcgY19uYW1lID0gbWVzc2FnZS0+ZnVsbF9uYW1lKCk7CisgIGNfbmFtZSA9IFN0cmluZ1JlcGxhY2UoY19uYW1lLCAiLiIsICJfIiwgdHJ1ZSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICAkY19uYW1lJF9Nb2R1bGVJbml0KCk7XG4iLAorICAgICAgImNfbmFtZSIsIGNfbmFtZSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBHZW5lcmF0ZUNJbml0KG1lc3NhZ2UtPm5lc3RlZF90eXBlKGkpLCBwcmludGVyKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBHZW5lcmF0ZUVudW1DSW5pdChtZXNzYWdlLT5lbnVtX3R5cGUoaSksIHByaW50ZXIpOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdGVDV2VsbEtub3duVHlwZXMoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgY29udGV4dC0+T3BlbigiLi4vZXh0L2dvb2dsZS9wcm90b2J1Zi93a3QuaW5jIikpOworICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKKworICBwcmludGVyLlByaW50KAorICAgICAgIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgLnByb3RvIGZpbGVzIGZvciB0aGUgd2VsbC1rbm93blxuIgorICAgICAgIi8vIHR5cGVzLiBEbyBub3QgZWRpdCFcblxuIik7CisKKyAgcHJpbnRlci5QcmludCgKKyAgICAgICJaRU5EX0JFR0lOX0FSR19JTkZPX0VYKGFyZ2luZm9fbG9va3VwLCAwLCAwLCAxKVxuIgorICAgICAgIiAgWkVORF9BUkdfSU5GTygwLCBrZXkpXG4iCisgICAgICAiWkVORF9FTkRfQVJHX0lORk8oKVxuIgorICAgICAgIlxuIgorICApOworCisgIGZvciAoYXV0byBmaWxlIDogZmlsZXMpIHsKKyAgICBwcmludGVyLlByaW50KAorICAgICAgICAic3RhdGljIHZvaWQgJGNfbmFtZSRfQWRkRGVzY3JpcHRvcigpO1xuIiwKKyAgICAgICAgImNfbmFtZSIsIEZpbGVuYW1lQ05hbWUoZmlsZSkpOworICB9CisKKyAgZm9yIChhdXRvIGZpbGUgOiBmaWxlcykgeworICAgIHN0ZDo6c3RyaW5nIGNfbmFtZSA9IEZpbGVuYW1lQ05hbWUoZmlsZSk7CisgICAgc3RkOjpzdHJpbmcgbWV0YWRhdGFfZmlsZW5hbWUgPSBHZW5lcmF0ZWRNZXRhZGF0YUZpbGVOYW1lKGZpbGUsIE9wdGlvbnMoKSk7CisgICAgc3RkOjpzdHJpbmcgbWV0YWRhdGFfY2xhc3NuYW1lID0gRmlsZW5hbWVUb0NsYXNzbmFtZShtZXRhZGF0YV9maWxlbmFtZSk7CisgICAgc3RkOjpzdHJpbmcgbWV0YWRhdGFfY19uYW1lID0KKyAgICAgICAgU3RyaW5nUmVwbGFjZShtZXRhZGF0YV9jbGFzc25hbWUsICJcXCIsICJfIiwgdHJ1ZSk7CisgICAgbWV0YWRhdGFfY2xhc3NuYW1lID0gU3RyaW5nUmVwbGFjZShtZXRhZGF0YV9jbGFzc25hbWUsICJcXCIsICJcXFxcIiwgdHJ1ZSk7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICAgIGZpbGUtPkNvcHlUbygmZmlsZV9wcm90byk7CisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgICBmaWxlX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKTsKKyAgICBwcmludGVyLlByaW50KAorICAgICAgICAiLyogJGZpbGVuYW1lJCAqL1xuIgorICAgICAgICAiXG4iCisgICAgICAgICJ6ZW5kX2NsYXNzX2VudHJ5KiAkbWV0YWRhdGFfY19uYW1lJF9jZTtcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiY29uc3QgY2hhciAkY19uYW1lJF9kZXNjcmlwdG9yIFskc2l6ZSRdID0ge1xuIiwKKyAgICAgICAgImZpbGVuYW1lIiwgZmlsZS0+bmFtZSgpLAorICAgICAgICAiY19uYW1lIiwgY19uYW1lLAorICAgICAgICAibWV0YWRhdGFfY19uYW1lIiwgbWV0YWRhdGFfY19uYW1lLAorICAgICAgICAic2l6ZSIsIHN0ZDo6dG9fc3RyaW5nKHNlcmlhbGl6ZWQuc2l6ZSgpKSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlcmlhbGl6ZWQuc2l6ZSgpOykgeworICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCAyNSAmJiBpIDwgc2VyaWFsaXplZC5zaXplKCk7ICsraSwgKytqKSB7CisgICAgICAgIHByaW50ZXIuUHJpbnQoIickY2gkJywgIiwgImNoIiwgQ0VzY2FwZShzZXJpYWxpemVkLnN1YnN0cihpLCAxKSkpOworICAgICAgfQorICAgICAgcHJpbnRlci5QcmludCgiXG4iKTsKKyAgICB9CisKKyAgICBwcmludGVyLlByaW50KAorICAgICAgICAifTtcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAic3RhdGljIHZvaWQgJGNfbmFtZSRfQWRkRGVzY3JpcHRvcigpIHtcbiIKKyAgICAgICAgIiAgaWYgKERlc2NyaXB0b3JQb29sX0hhc0ZpbGUoXCIkZmlsZW5hbWUkXCIpKSByZXR1cm47XG4iLAorICAgICAgICAiZmlsZW5hbWUiLCBmaWxlLT5uYW1lKCksCisgICAgICAgICJjX25hbWUiLCBjX25hbWUsCisgICAgICAgICJtZXRhZGF0YV9jX25hbWUiLCBtZXRhZGF0YV9jX25hbWUpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgICAgc3RkOjpzdHJpbmcgZGVwX2NfbmFtZSA9IEZpbGVuYW1lQ05hbWUoZmlsZS0+ZGVwZW5kZW5jeShpKSk7CisgICAgICBwcmludGVyLlByaW50KAorICAgICAgICAgICIgICRkZXBfY19uYW1lJF9BZGREZXNjcmlwdG9yKCk7XG4iLAorICAgICAgICAgICJkZXBfY19uYW1lIiwgZGVwX2NfbmFtZSk7CisgICAgfQorCisgICAgcHJpbnRlci5QcmludCgKKyAgICAgICAgIiAgRGVzY3JpcHRvclBvb2xfQWRkRGVzY3JpcHRvcihcIiRmaWxlbmFtZSRcIiwgJGNfbmFtZSRfZGVzY3JpcHRvcixcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoJGNfbmFtZSRfZGVzY3JpcHRvcikpO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiXG4iCisgICAgICAgICJzdGF0aWMgUEhQX01FVEhPRCgkbWV0YWRhdGFfY19uYW1lJCwgaW5pdE9uY2UpIHtcbiIKKyAgICAgICAgIiAgJGNfbmFtZSRfQWRkRGVzY3JpcHRvcigpO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiXG4iCisgICAgICAgICJzdGF0aWMgemVuZF9mdW5jdGlvbl9lbnRyeSAkbWV0YWRhdGFfY19uYW1lJF9tZXRob2RzW10gPSB7XG4iCisgICAgICAgICIgIFBIUF9NRSgkbWV0YWRhdGFfY19uYW1lJCwgaW5pdE9uY2UsIGFyZ2luZm9fdm9pZCwgWkVORF9BQ0NfUFVCTElDIHwgWkVORF9BQ0NfU1RBVElDKVxuIgorICAgICAgICAiICBaRU5EX0ZFX0VORFxuIgorICAgICAgICAifTtcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAic3RhdGljIHZvaWQgJG1ldGFkYXRhX2NfbmFtZSRfTW9kdWxlSW5pdCgpIHtcbiIKKyAgICAgICAgIiAgemVuZF9jbGFzc19lbnRyeSB0bXBfY2U7XG4iCisgICAgICAgICJcbiIKKyAgICAgICAgIiAgSU5JVF9DTEFTU19FTlRSWSh0bXBfY2UsIFwiJG1ldGFkYXRhX2NsYXNzbmFtZSRcIixcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAkbWV0YWRhdGFfY19uYW1lJF9tZXRob2RzKTtcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiICAkbWV0YWRhdGFfY19uYW1lJF9jZSA9IHplbmRfcmVnaXN0ZXJfaW50ZXJuYWxfY2xhc3MoJnRtcF9jZSk7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJcbiIsCisgICAgICAgICJmaWxlbmFtZSIsIGZpbGUtPm5hbWUoKSwKKyAgICAgICAgImNfbmFtZSIsIGNfbmFtZSwKKyAgICAgICAgIm1ldGFkYXRhX2NfbmFtZSIsIG1ldGFkYXRhX2NfbmFtZSwKKyAgICAgICAgIm1ldGFkYXRhX2NsYXNzbmFtZSIsIG1ldGFkYXRhX2NsYXNzbmFtZSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgICBHZW5lcmF0ZUNNZXNzYWdlKGZpbGUtPm1lc3NhZ2VfdHlwZShpKSwgJnByaW50ZXIpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIEdlbmVyYXRlQ0VudW0oZmlsZS0+ZW51bV90eXBlKGkpLCAmcHJpbnRlcik7CisgICAgfQorICB9CisKKyAgcHJpbnRlci5QcmludCgKKyAgICAgICJzdGF0aWMgdm9pZCBXZWxsS25vd25UeXBlc19Nb2R1bGVJbml0KCkge1xuIik7CisKKyAgZm9yIChhdXRvIGZpbGUgOiBmaWxlcykgeworICAgIHN0ZDo6c3RyaW5nIG1ldGFkYXRhX2ZpbGVuYW1lID0gR2VuZXJhdGVkTWV0YWRhdGFGaWxlTmFtZShmaWxlLCBPcHRpb25zKCkpOworICAgIHN0ZDo6c3RyaW5nIG1ldGFkYXRhX2NsYXNzbmFtZSA9IEZpbGVuYW1lVG9DbGFzc25hbWUobWV0YWRhdGFfZmlsZW5hbWUpOworICAgIHN0ZDo6c3RyaW5nIG1ldGFkYXRhX2NfbmFtZSA9CisgICAgICAgIFN0cmluZ1JlcGxhY2UobWV0YWRhdGFfY2xhc3NuYW1lLCAiXFwiLCAiXyIsIHRydWUpOworICAgIHByaW50ZXIuUHJpbnQoCisgICAgICAgICIgICRtZXRhZGF0YV9jX25hbWUkX01vZHVsZUluaXQoKTtcbiIsCisgICAgICAgICJtZXRhZGF0YV9jX25hbWUiLCBtZXRhZGF0YV9jX25hbWUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgR2VuZXJhdGVDSW5pdChmaWxlLT5tZXNzYWdlX3R5cGUoaSksICZwcmludGVyKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgICBHZW5lcmF0ZUVudW1DSW5pdChmaWxlLT5lbnVtX3R5cGUoaSksICZwcmludGVyKTsKKyAgICB9CisgIH0KKworICBwcmludGVyLlByaW50KAorICAgICAgIn1cbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworc3RkOjpzdHJpbmcgR2VuZXJhdGVkQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2MpIHsKKyAgcmV0dXJuIEdlbmVyYXRlZENsYXNzTmFtZUltcGwoZGVzYyk7Cit9CisKK3N0ZDo6c3RyaW5nIEdlbmVyYXRlZENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzYykgeworICByZXR1cm4gR2VuZXJhdGVkQ2xhc3NOYW1lSW1wbChkZXNjKTsKK30KKworc3RkOjpzdHJpbmcgR2VuZXJhdGVkQ2xhc3NOYW1lKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjKSB7CisgIHJldHVybiBHZW5lcmF0ZWRDbGFzc05hbWVJbXBsKGRlc2MpOworfQorCitib29sIEdlbmVyYXRvcjo6R2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZXJyb3IpIGNvbnN0IHsKKyAgcmV0dXJuIEdlbmVyYXRlKGZpbGUsIE9wdGlvbnMoKSwgZ2VuZXJhdG9yX2NvbnRleHQsIGVycm9yKTsKK30KKworYm9vbCBHZW5lcmF0b3I6OkdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcikgY29uc3QgeworICBpZiAob3B0aW9ucy5pc19kZXNjcmlwdG9yICYmIGZpbGUtPm5hbWUoKSAhPSBrRGVzY3JpcHRvckZpbGUpIHsKKyAgICAqZXJyb3IgPQorICAgICAgICAiQ2FuIG9ubHkgZ2VuZXJhdGUgUEhQIGNvZGUgZm9yIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvLlxuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIW9wdGlvbnMuaXNfZGVzY3JpcHRvciAmJiBmaWxlLT5zeW50YXgoKSAhPSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMykgeworICAgICplcnJvciA9CisgICAgICAgICJDYW4gb25seSBnZW5lcmF0ZSBQSFAgY29kZSBmb3IgcHJvdG8zIC5wcm90byBmaWxlcy5cbiIKKyAgICAgICAgIlBsZWFzZSBhZGQgJ3N5bnRheCA9IFwicHJvdG8zXCI7JyB0byB0aGUgdG9wIG9mIHlvdXIgLnByb3RvIGZpbGUuXG4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEdlbmVyYXRlRmlsZShmaWxlLCBvcHRpb25zLCBnZW5lcmF0b3JfY29udGV4dCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR2VuZXJhdG9yOjpHZW5lcmF0ZUFsbChjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBmaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcikgY29uc3QgeworICBPcHRpb25zIG9wdGlvbnM7CisKKyAgZm9yIChjb25zdCBhdXRvJiBvcHRpb24gOiBTcGxpdChwYXJhbWV0ZXIsICIsIiwgdHJ1ZSkpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3B0aW9uX3BhaXIgPSBTcGxpdChvcHRpb24sICI9IiwgdHJ1ZSk7CisgICAgaWYgKEhhc1ByZWZpeFN0cmluZyhvcHRpb25fcGFpclswXSwgImFnZ3JlZ2F0ZV9tZXRhZGF0YSIpKSB7CisgICAgICBvcHRpb25zLmFnZ3JlZ2F0ZV9tZXRhZGF0YSA9IHRydWU7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIHByZWZpeCA6IFNwbGl0KG9wdGlvbl9wYWlyWzFdLCAiIyIsIGZhbHNlKSkgeworICAgICAgICBvcHRpb25zLmFnZ3JlZ2F0ZV9tZXRhZGF0YV9wcmVmaXhlcy5lbXBsYWNlKHByZWZpeCk7CisgICAgICAgIEdPT0dMRV9MT0coSU5GTykgPDwgcHJlZml4OworICAgICAgfQorICAgIH0gZWxzZSBpZiAob3B0aW9uX3BhaXJbMF0gPT0gImludGVybmFsIikgeworICAgICAgb3B0aW9ucy5pc19kZXNjcmlwdG9yID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbl9wYWlyWzBdID09ICJpbnRlcm5hbF9nZW5lcmF0ZV9jX3drdCIpIHsKKyAgICAgIEdlbmVyYXRlQ1dlbGxLbm93blR5cGVzKGZpbGVzLCBnZW5lcmF0b3JfY29udGV4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbmtub3duIGNvZGVnZW4gb3B0aW9uOiAiIDw8IG9wdGlvbl9wYWlyWzBdOworICAgIH0KKyAgfQorCisgIGZvciAoYXV0byBmaWxlIDogZmlsZXMpIHsKKyAgICBpZiAoIUdlbmVyYXRlKGZpbGUsIG9wdGlvbnMsIGdlbmVyYXRvcl9jb250ZXh0LCBlcnJvcikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHBocAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGhwL3BocF9nZW5lcmF0b3IuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGhwL3BocF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2NiNTljCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9waHAvcGhwX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsOTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QSFBfR0VORVJBVE9SX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUEhQX0dFTkVSQVRPUl9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIHBocCB7CisKK3N0cnVjdCBPcHRpb25zOworCitjbGFzcyBQUk9UT0NfRVhQT1JUIEdlbmVyYXRvciA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBHZW5lcmF0ZSgKKyAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0LAorICAgICAgc3RkOjpzdHJpbmcqIGVycm9yKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIEdlbmVyYXRlQWxsKGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4mIGZpbGVzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yKSBjb25zdCBvdmVycmlkZTsKKworICB1aW50NjRfdCBHZXRTdXBwb3J0ZWRGZWF0dXJlcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gRkVBVFVSRV9QUk9UTzNfT1BUSU9OQUw7CisgIH0KKworIHByaXZhdGU6CisgIGJvb2wgR2VuZXJhdGUoCisgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCwKKyAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcikgY29uc3Q7Cit9OworCisvLyBUbyBza2lwIHJlc2VydmVkIGtleXdvcmRzIGluIHBocCwgc29tZSBnZW5lcmF0ZWQgY2xhc3NuYW1lIGFyZSBwcmVmaXhlZC4KKy8vIE90aGVyIGNvZGUgZ2VuZXJhdG9ycyBtYXkgbmVlZCBmb2xsb3dpbmcgQVBJIHRvIGZpZ3VyZSBvdXQgdGhlIGFjdHVhbAorLy8gY2xhc3NuYW1lLgorUFJPVE9DX0VYUE9SVCBzdGQ6OnN0cmluZyBHZW5lcmF0ZWRDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzYyk7CitQUk9UT0NfRVhQT1JUIHN0ZDo6c3RyaW5nIEdlbmVyYXRlZENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzYyk7CitQUk9UT0NfRVhQT1JUIHN0ZDo6c3RyaW5nIEdlbmVyYXRlZENsYXNzTmFtZShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzYyk7CisKK2lubGluZSBib29sIElzV3JhcHBlclR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFICYmCisgICAgICBkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKS0+ZmlsZSgpLT5uYW1lKCkgPT0gImdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90byI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwaHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BIUF9HRU5FUkFUT1JfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzIzODQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5jYwpAQCAtMCwwICsxLDIwMSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNldD4KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGZjbnRsLmg+CisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCisjaWYgZGVmaW5lZChfV0lOMzIpCisvLyBETyBOT1QgaW5jbHVkZSA8aW8uaD4sIGluc3RlYWQgY3JlYXRlIGZ1bmN0aW9ucyBpbiBpb193aW4zMi57aCxjY30gYW5kIGltcG9ydAorLy8gdGhlbSBsaWtlIHdlIGRvIGJlbG93LgordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjpzZXRtb2RlOworI2VuZGlmCisKK2NsYXNzIEdlbmVyYXRvclJlc3BvbnNlQ29udGV4dCA6IHB1YmxpYyBHZW5lcmF0b3JDb250ZXh0IHsKKyBwdWJsaWM6CisgIEdlbmVyYXRvclJlc3BvbnNlQ29udGV4dCgKKyAgICAgIGNvbnN0IFZlcnNpb24mIGNvbXBpbGVyX3ZlcnNpb24sIENvZGVHZW5lcmF0b3JSZXNwb25zZSogcmVzcG9uc2UsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMpCisgICAgICA6IGNvbXBpbGVyX3ZlcnNpb25fKGNvbXBpbGVyX3ZlcnNpb24pLAorICAgICAgICByZXNwb25zZV8ocmVzcG9uc2UpLAorICAgICAgICBwYXJzZWRfZmlsZXNfKHBhcnNlZF9maWxlcykge30KKyAgfkdlbmVyYXRvclJlc3BvbnNlQ29udGV4dCgpIG92ZXJyaWRlIHt9CisKKyAgLy8gaW1wbGVtZW50cyBHZW5lcmF0b3JDb250ZXh0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBPcGVuKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgb3ZlcnJpZGUgeworICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6RmlsZSogZmlsZSA9IHJlc3BvbnNlXy0+YWRkX2ZpbGUoKTsKKyAgICBmaWxlLT5zZXRfbmFtZShmaWxlbmFtZSk7CisgICAgcmV0dXJuIG5ldyBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtKGZpbGUtPm11dGFibGVfY29udGVudCgpKTsKKyAgfQorCisgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3BlbkZvckluc2VydCgKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnNlcnRpb25fcG9pbnQpIG92ZXJyaWRlIHsKKyAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkZpbGUqIGZpbGUgPSByZXNwb25zZV8tPmFkZF9maWxlKCk7CisgICAgZmlsZS0+c2V0X25hbWUoZmlsZW5hbWUpOworICAgIGZpbGUtPnNldF9pbnNlcnRpb25fcG9pbnQoaW5zZXJ0aW9uX3BvaW50KTsKKyAgICByZXR1cm4gbmV3IGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0oZmlsZS0+bXV0YWJsZV9jb250ZW50KCkpOworICB9CisKKyAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBPcGVuRm9ySW5zZXJ0V2l0aEdlbmVyYXRlZENvZGVJbmZvKAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgaW5zZXJ0aW9uX3BvaW50LAorICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6R2VuZXJhdGVkQ29kZUluZm8mIGluZm8pIG92ZXJyaWRlIHsKKyAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkZpbGUqIGZpbGUgPSByZXNwb25zZV8tPmFkZF9maWxlKCk7CisgICAgZmlsZS0+c2V0X25hbWUoZmlsZW5hbWUpOworICAgIGZpbGUtPnNldF9pbnNlcnRpb25fcG9pbnQoaW5zZXJ0aW9uX3BvaW50KTsKKyAgICAqZmlsZS0+bXV0YWJsZV9nZW5lcmF0ZWRfY29kZV9pbmZvKCkgPSBpbmZvOworICAgIHJldHVybiBuZXcgaW86OlN0cmluZ091dHB1dFN0cmVhbShmaWxlLT5tdXRhYmxlX2NvbnRlbnQoKSk7CisgIH0KKworICB2b2lkIExpc3RQYXJzZWRGaWxlcyhzdGQ6OnZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+KiBvdXRwdXQpIG92ZXJyaWRlIHsKKyAgICAqb3V0cHV0ID0gcGFyc2VkX2ZpbGVzXzsKKyAgfQorCisgIHZvaWQgR2V0Q29tcGlsZXJWZXJzaW9uKFZlcnNpb24qIHZlcnNpb24pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAqdmVyc2lvbiA9IGNvbXBpbGVyX3ZlcnNpb25fOworICB9CisKKyBwcml2YXRlOgorICBWZXJzaW9uIGNvbXBpbGVyX3ZlcnNpb25fOworICBDb2RlR2VuZXJhdG9yUmVzcG9uc2UqIHJlc3BvbnNlXzsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzXzsKK307CisKK2Jvb2wgR2VuZXJhdGVDb2RlKGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlKiByZXNwb25zZSwgc3RkOjpzdHJpbmcqIGVycm9yX21zZykgeworICBEZXNjcmlwdG9yUG9vbCBwb29sOworICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3QucHJvdG9fZmlsZV9zaXplKCk7IGkrKykgeworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5CdWlsZEZpbGUocmVxdWVzdC5wcm90b19maWxlKGkpKTsKKyAgICBpZiAoZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAvLyBCdWlsZEZpbGUoKSBhbHJlYWR5IHdyb3RlIGFuIGVycm9yIG1lc3NhZ2UuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBwYXJzZWRfZmlsZXM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlX3NpemUoKTsgaSsrKSB7CisgICAgcGFyc2VkX2ZpbGVzLnB1c2hfYmFjayhwb29sLkZpbmRGaWxlQnlOYW1lKHJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZShpKSkpOworICAgIGlmIChwYXJzZWRfZmlsZXMuYmFjaygpID09IG51bGxwdHIpIHsKKyAgICAgICplcnJvcl9tc2cgPQorICAgICAgICAgICJwcm90b2MgYXNrZWQgcGx1Z2luIHRvIGdlbmVyYXRlIGEgZmlsZSBidXQgIgorICAgICAgICAgICJkaWQgbm90IHByb3ZpZGUgYSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZTogIiArCisgICAgICAgICAgcmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKGkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIEdlbmVyYXRvclJlc3BvbnNlQ29udGV4dCBjb250ZXh0KHJlcXVlc3QuY29tcGlsZXJfdmVyc2lvbigpLCByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkX2ZpbGVzKTsKKworCisgIHN0ZDo6c3RyaW5nIGVycm9yOworICBib29sIHN1Y2NlZWRlZCA9IGdlbmVyYXRvci5HZW5lcmF0ZUFsbChwYXJzZWRfZmlsZXMsIHJlcXVlc3QucGFyYW1ldGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0LCAmZXJyb3IpOworCisgIHJlc3BvbnNlLT5zZXRfc3VwcG9ydGVkX2ZlYXR1cmVzKGdlbmVyYXRvci5HZXRTdXBwb3J0ZWRGZWF0dXJlcygpKTsKKworICBpZiAoIXN1Y2NlZWRlZCAmJiBlcnJvci5lbXB0eSgpKSB7CisgICAgZXJyb3IgPQorICAgICAgICAiQ29kZSBnZW5lcmF0b3IgcmV0dXJuZWQgZmFsc2UgYnV0IHByb3ZpZGVkIG5vIGVycm9yICIKKyAgICAgICAgImRlc2NyaXB0aW9uLiI7CisgIH0KKyAgaWYgKCFlcnJvci5lbXB0eSgpKSB7CisgICAgcmVzcG9uc2UtPnNldF9lcnJvcihlcnJvcik7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworaW50IFBsdWdpbk1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSwgY29uc3QgQ29kZUdlbmVyYXRvciogZ2VuZXJhdG9yKSB7CisKKyAgaWYgKGFyZ2MgPiAxKSB7CisgICAgc3RkOjpjZXJyIDw8IGFyZ3ZbMF0gPDwgIjogVW5rbm93biBvcHRpb246ICIgPDwgYXJndlsxXSA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIDE7CisgIH0KKworI2lmZGVmIF9XSU4zMgorICBzZXRtb2RlKFNURElOX0ZJTEVOTywgX09fQklOQVJZKTsKKyAgc2V0bW9kZShTVERPVVRfRklMRU5PLCBfT19CSU5BUlkpOworI2VuZGlmCisKKyAgQ29kZUdlbmVyYXRvclJlcXVlc3QgcmVxdWVzdDsKKyAgaWYgKCFyZXF1ZXN0LlBhcnNlRnJvbUZpbGVEZXNjcmlwdG9yKFNURElOX0ZJTEVOTykpIHsKKyAgICBzdGQ6OmNlcnIgPDwgYXJndlswXSA8PCAiOiBwcm90b2Mgc2VudCB1bnBhcnNlYWJsZSByZXF1ZXN0IHRvIHBsdWdpbi4iCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisKKyAgc3RkOjpzdHJpbmcgZXJyb3JfbXNnOworICBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgaWYgKEdlbmVyYXRlQ29kZShyZXF1ZXN0LCAqZ2VuZXJhdG9yLCAmcmVzcG9uc2UsICZlcnJvcl9tc2cpKSB7CisgICAgaWYgKCFyZXNwb25zZS5TZXJpYWxpemVUb0ZpbGVEZXNjcmlwdG9yKFNURE9VVF9GSUxFTk8pKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgYXJndlswXSA8PCAiOiBFcnJvciB3cml0aW5nIHRvIHN0ZG91dC4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIWVycm9yX21zZy5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgYXJndlswXSA8PCAiOiAiIDw8IGVycm9yX21zZyA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTE3MTNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uaApAQCAtMCwwICsxLDk2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIEZyb250LWVuZCBmb3IgcHJvdG9jIGNvZGUgZ2VuZXJhdG9yIHBsdWdpbnMgd3JpdHRlbiBpbiBDKysuCisvLworLy8gVG8gaW1wbGVtZW50IGEgcHJvdG9jIHBsdWdpbiBpbiBDKyssIHNpbXBseSB3cml0ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZgorLy8gQ29kZUdlbmVyYXRvciwgdGhlbiBjcmVhdGUgYSBtYWluKCkgZnVuY3Rpb24gbGlrZToKKy8vICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworLy8gICAgIE15Q29kZUdlbmVyYXRvciBnZW5lcmF0b3I7CisvLyAgICAgcmV0dXJuIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpQbHVnaW5NYWluKGFyZ2MsIGFyZ3YsICZnZW5lcmF0b3IpOworLy8gICB9CisvLyBZb3UgbXVzdCBsaW5rIHlvdXIgcGx1Z2luIGFnYWluc3QgbGlicHJvdG9idWYgYW5kIGxpYnByb3RvYy4KKy8vCisvLyBUaGUgY29yZSBwYXJ0IG9mIFBsdWdpbk1haW4gaXMgdG8gaW52b2tlIHRoZSBnaXZlbiBDb2RlR2VuZXJhdG9yIG9uIGEKKy8vIENvZGVHZW5lcmF0b3JSZXF1ZXN0IHRvIGdlbmVyYXRlIGEgQ29kZUdlbmVyYXRvclJlc3BvbnNlLiBUaGlzIHBhcnQgaXMKKy8vIGFic3RyYWN0ZWQgb3V0IGFuZCBtYWRlIGludG8gZnVuY3Rpb24gR2VuZXJhdGVDb2RlIHNvIHRoYXQgaXQgY2FuIGJlIHJldXNlZCwKKy8vIGZvciBleGFtcGxlLCB0byBpbXBsZW1lbnQgYSB2YXJpYW50IG9mIFBsdWdpbk1haW4gdGhhdCBkb2VzIHNvbWUKKy8vIHByZXByb2Nlc3Npbmcgb24gdGhlIGlucHV0IENvZGVHZW5lcmF0b3JSZXF1ZXN0IGJlZm9yZSBmZWVkaW5nIHRoZSByZXF1ZXN0CisvLyB0byB0aGUgZ2l2ZW4gY29kZSBnZW5lcmF0b3IuCisvLworLy8gVG8gZ2V0IHByb3RvYyB0byB1c2UgdGhlIHBsdWdpbiwgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisvLyAqIFBsYWNlIHRoZSBwbHVnaW4gYmluYXJ5IHNvbWV3aGVyZSBpbiB0aGUgUEFUSCBhbmQgZ2l2ZSBpdCB0aGUgbmFtZQorLy8gICAicHJvdG9jLWdlbi1OQU1FIiAocmVwbGFjaW5nICJOQU1FIiB3aXRoIHRoZSBuYW1lIG9mIHlvdXIgcGx1Z2luKS4gIElmIHlvdQorLy8gICB0aGVuIGludm9rZSBwcm90b2Mgd2l0aCB0aGUgcGFyYW1ldGVyIC0tTkFNRV9vdXQ9T1VUX0RJUiAoYWdhaW4sIHJlcGxhY2UKKy8vICAgIk5BTUUiIHdpdGggeW91ciBwbHVnaW4ncyBuYW1lKSwgcHJvdG9jIHdpbGwgaW52b2tlIHlvdXIgcGx1Z2luIHRvIGdlbmVyYXRlCisvLyAgIHRoZSBvdXRwdXQsIHdoaWNoIHdpbGwgYmUgcGxhY2VkIGluIE9VVF9ESVIuCisvLyAqIFBsYWNlIHRoZSBwbHVnaW4gYmluYXJ5IGFueXdoZXJlLCB3aXRoIGFueSBuYW1lLCBhbmQgcGFzcyB0aGUgLS1wbHVnaW4KKy8vICAgcGFyYW1ldGVyIHRvIHByb3RvYyB0byBkaXJlY3QgaXQgdG8geW91ciBwbHVnaW4gbGlrZSBzbzoKKy8vICAgICBwcm90b2MgLS1wbHVnaW49cHJvdG9jLWdlbi1OQU1FPXBhdGgvdG8vbXliaW5hcnkgLS1OQU1FX291dD1PVVRfRElSCisvLyAgIE9uIFdpbmRvd3MsIG1ha2Ugc3VyZSB0byBpbmNsdWRlIHRoZSAuZXhlIHN1ZmZpeDoKKy8vICAgICBwcm90b2MgLS1wbHVnaW49cHJvdG9jLWdlbi1OQU1FPXBhdGgvdG8vbXliaW5hcnkuZXhlIC0tTkFNRV9vdXQ9T1VUX0RJUgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QTFVHSU5fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QTFVHSU5fSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCitjbGFzcyBDb2RlR2VuZXJhdG9yOyAgLy8gY29kZV9nZW5lcmF0b3IuaAorY2xhc3MgQ29kZUdlbmVyYXRvclJlcXVlc3Q7CitjbGFzcyBDb2RlR2VuZXJhdG9yUmVzcG9uc2U7CisKKy8vIEltcGxlbWVudHMgbWFpbigpIGZvciBhIHByb3RvYyBwbHVnaW4gZXhwb3NpbmcgdGhlIGdpdmVuIGNvZGUgZ2VuZXJhdG9yLgorUFJPVE9DX0VYUE9SVCBpbnQgUGx1Z2luTWFpbihpbnQgYXJnYywgY2hhciogYXJndltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3IpOworCisKKy8vIEdlbmVyYXRlcyBjb2RlIHVzaW5nIHRoZSBnaXZlbiBjb2RlIGdlbmVyYXRvci4gUmV0dXJucyB0cnVlIGlmIHRoZSBjb2RlCisvLyBnZW5lcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuIElmIHRoZSBjb2RlIGdlbmVyYXRpb24gZmFpbHMsIGVycm9yX21zZyBtYXkgYmUKKy8vIHBvcHVsYXRlZCB0byBkZXNjcmliZSB0aGUgZmFpbHVyZSBjYXVzZS4KK2Jvb2wgR2VuZXJhdGVDb2RlKGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlKiByZXNwb25zZSwgc3RkOjpzdHJpbmcqIGVycm9yX21zZyk7CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BMVUdJTl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4ZDgzZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjCkBAIC0wLDAgKzEsMTYxMiBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90bworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworUFJPVE9CVUZfUFJBR01BX0lOSVRfU0VHCisKK25hbWVzcGFjZSBfcGIgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDsKK25hbWVzcGFjZSBfcGJpID0gX3BiOjppbnRlcm5hbDsKKworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK25hbWVzcGFjZSBjb21waWxlciB7CitQUk9UT0JVRl9DT05TVEVYUFIgVmVyc2lvbjo6VmVyc2lvbigKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uc3VmZml4XykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8ubWFqb3JfKSovMAorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm1pbm9yXykqLzAKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5wYXRjaF8pKi8wfSB7fQorc3RydWN0IFZlcnNpb25EZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIFZlcnNpb25EZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+VmVyc2lvbkRlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgVmVyc2lvbiBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBWZXJzaW9uRGVmYXVsdFR5cGVJbnRlcm5hbCBfVmVyc2lvbl9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Q29kZUdlbmVyYXRvclJlcXVlc3QoCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmZpbGVfdG9fZ2VuZXJhdGVfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5wcm90b19maWxlXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8ucGFyYW1ldGVyXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uY29tcGlsZXJfdmVyc2lvbl8pKi9udWxscHRyfSB7fQorc3RydWN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0RGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBDb2RlR2VuZXJhdG9yUmVxdWVzdERlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5Db2RlR2VuZXJhdG9yUmVxdWVzdERlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgQ29kZUdlbmVyYXRvclJlcXVlc3QgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgQ29kZUdlbmVyYXRvclJlcXVlc3REZWZhdWx0VHlwZUludGVybmFsIF9Db2RlR2VuZXJhdG9yUmVxdWVzdF9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUoCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm5hbWVfKSoveyY6Ol9wYmk6OmZpeGVkX2FkZHJlc3NfZW1wdHlfc3RyaW5nLCA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fX0KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5pbnNlcnRpb25fcG9pbnRfKSoveyY6Ol9wYmk6OmZpeGVkX2FkZHJlc3NfZW1wdHlfc3RyaW5nLCA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fX0KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5jb250ZW50XykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uZ2VuZXJhdGVkX2NvZGVfaW5mb18pKi9udWxscHRyfSB7fQorc3RydWN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlRGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZURlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5Db2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZURlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVEZWZhdWx0VHlwZUludGVybmFsIF9Db2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkNvZGVHZW5lcmF0b3JSZXNwb25zZSgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uZmlsZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmVycm9yXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uc3VwcG9ydGVkX2ZlYXR1cmVzXykqL3VpbnQ2NF90ezB1fX0ge30KK3N0cnVjdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VEZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIENvZGVHZW5lcmF0b3JSZXNwb25zZURlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5Db2RlR2VuZXJhdG9yUmVzcG9uc2VEZWZhdWx0VHlwZUludGVybmFsKCkge30KKyAgdW5pb24geworICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZSBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VEZWZhdWx0VHlwZUludGVybmFsIF9Db2RlR2VuZXJhdG9yUmVzcG9uc2VfZGVmYXVsdF9pbnN0YW5jZV87Cit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorc3RhdGljIDo6X3BiOjpNZXRhZGF0YSBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90b1s0XTsKK3N0YXRpYyBjb25zdCA6Ol9wYjo6RW51bURlc2NyaXB0b3IqIGZpbGVfbGV2ZWxfZW51bV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9bMV07CitzdGF0aWMgY29uc3RleHByIDo6X3BiOjpTZXJ2aWNlRGVzY3JpcHRvciBjb25zdCoqIGZpbGVfbGV2ZWxfc2VydmljZV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8gPSBudWxscHRyOworCitjb25zdCB1aW50MzJfdCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG86Om9mZnNldHNbXSBQUk9UT0JVRl9TRUNUSU9OX1ZBUklBQkxFKHByb3RvZGVzY19jb2xkKSA9IHsKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbiwgX2ltcGxfLl9oYXNfYml0c18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpWZXJzaW9uLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgfjB1LCAgLy8gbm8gX2V4dGVuc2lvbnNfCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpWZXJzaW9uLCBfaW1wbF8ubWFqb3JfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbiwgX2ltcGxfLm1pbm9yXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24sIF9pbXBsXy5wYXRjaF8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpWZXJzaW9uLCBfaW1wbF8uc3VmZml4XyksCisgIDEsCisgIDIsCisgIDMsCisgIDAsCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXF1ZXN0LCBfaW1wbF8uX2hhc19iaXRzXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXF1ZXN0LCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgfjB1LCAgLy8gbm8gX2V4dGVuc2lvbnNfCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVxdWVzdCwgX2ltcGxfLmZpbGVfdG9fZ2VuZXJhdGVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlcXVlc3QsIF9pbXBsXy5wYXJhbWV0ZXJfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlcXVlc3QsIF9pbXBsXy5wcm90b19maWxlXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXF1ZXN0LCBfaW1wbF8uY29tcGlsZXJfdmVyc2lvbl8pLAorICB+MHUsCisgIDAsCisgIH4wdSwKKyAgMSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUsIF9pbXBsXy5faGFzX2JpdHNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlLCBfaW1wbF8ubmFtZV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSwgX2ltcGxfLmluc2VydGlvbl9wb2ludF8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSwgX2ltcGxfLmNvbnRlbnRfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUsIF9pbXBsXy5nZW5lcmF0ZWRfY29kZV9pbmZvXyksCisgIDAsCisgIDEsCisgIDIsCisgIDMsCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZSwgX2ltcGxfLl9oYXNfYml0c18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2UsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZSwgX2ltcGxfLmVycm9yXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZSwgX2ltcGxfLnN1cHBvcnRlZF9mZWF0dXJlc18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2UsIF9pbXBsXy5maWxlXyksCisgIDAsCisgIDEsCisgIH4wdSwKK307CitzdGF0aWMgY29uc3QgOjpfcGJpOjpNaWdyYXRpb25TY2hlbWEgc2NoZW1hc1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0geworICB7IDAsIDEwLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbil9LAorICB7IDE0LCAyNCwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXF1ZXN0KX0sCisgIHsgMjgsIDM4LCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUpfSwKKyAgeyA0MiwgNTEsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2UpfSwKK307CisKK3N0YXRpYyBjb25zdCA6Ol9wYjo6TWVzc2FnZSogY29uc3QgZmlsZV9kZWZhdWx0X2luc3RhbmNlc1tdID0geworICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpfVmVyc2lvbl9kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6Ol9Db2RlR2VuZXJhdG9yUmVxdWVzdF9kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6Ol9Db2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6Ol9Db2RlR2VuZXJhdG9yUmVzcG9uc2VfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorfTsKKworY29uc3QgY2hhciBkZXNjcmlwdG9yX3RhYmxlX3Byb3RvZGVmX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90b1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0KKyAgIlxuJWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG9cMDIyIgorICAiXDAzMGdvb2dsZS5wcm90b2J1Zi5jb21waWxlclwwMzIgZ29vZ2xlL3Byb3RvYiIKKyAgInVmL2Rlc2NyaXB0b3IucHJvdG9cIkZcblwwMDdWZXJzaW9uXDAyMlxyXG5cMDA1bWFqb3JcMDMwIgorICAiXDAwMSBcMDAxKFwwMDVcMDIyXHJcblwwMDVtaW5vclwwMzBcMDAyIFwwMDEoXDAwNVwwMjJcclxuXDAwNXBhdGNoXDAzMFwwMDMgXDAwMShcMDA1XDAyMlwwMTZcblwwMDZzIgorICAidWZmaXhcMDMwXDAwNCBcMDAxKFx0XCJcMjcyXDAwMVxuXDAyNENvZGVHZW5lcmF0b3JSZXF1ZXN0XDAyMlwwMzBcblwwMjAiCisgICJmaWxlX3RvX2dlbmVyYXRlXDAzMFwwMDEgXDAwMyhcdFwwMjJcMDIxXG5cdHBhcmFtZXRlclwwMzBcMDAyIFwwMDEoIgorICAiXHRcMDIyOFxuXG5wcm90b19maWxlXDAzMFwwMTcgXDAwMyhcMDEzMiQuZ29vZ2xlLnByb3RvYnVmLiIKKyAgIkZpbGVEZXNjcmlwdG9yUHJvdG9cMDIyO1xuXDAyMGNvbXBpbGVyX3ZlcnNpb25cMDMwIgorICAiXDAwMyBcMDAxKFwwMTMyIS5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuVmVyc2lvbiIKKyAgIlwiXDMwMVwwMDJcblwwMjVDb2RlR2VuZXJhdG9yUmVzcG9uc2VcMDIyXHJcblwwMDVlcnJvclwwMzBcMDAxIFwwMDEoIgorICAiXHRcMDIyXDAzMlxuXDAyMnN1cHBvcnRlZF9mZWF0dXJlc1wwMzBcMDAyIFwwMDEoXDAwNFwwMjJCXG5cMDA0ZmlsZVwwMzBcMDE3ICIKKyAgIlwwMDMoXDAxMzI0Lmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXIiCisgICJhdG9yUmVzcG9uc2UuRmlsZVwwMzJcMTc3XG5cMDA0RmlsZVwwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyIgorICAiXDAyN1xuXDAxN2luc2VydGlvbl9wb2ludFwwMzBcMDAyIFwwMDEoXHRcMDIyXDAxN1xuXDAwN2NvbnRlbnRcMDMwXDAxNyBcMDAxKCIKKyAgIlx0XDAyMlw/XG5cMDIzZ2VuZXJhdGVkX2NvZGVfaW5mb1wwMzBcMDIwIFwwMDEoXDAxMzJcIi5nb29nbGUuIgorICAicHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm9cIjhcblwwMDdGZWF0dXJlXDAyMlwwMjBcbiIKKyAgIlwwMTRGRUFUVVJFX05PTkVcMDIwXDAwMFwwMjJcMDMzXG5cMDI3RkVBVFVSRV9QUk9UTzNfT1BUSU9OIgorICAiQUxcMDIwXDAwMUJXXG5cMDM0Y29tLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlckJcMDE0UGwiCisgICJ1Z2luUHJvdG9zWilnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90IgorICAieXBlcy9wbHVnaW5wYiIKKyAgOworc3RhdGljIGNvbnN0IDo6X3BiaTo6RGVzY3JpcHRvclRhYmxlKiBjb25zdCBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90b19kZXBzWzFdID0geworICAmOjpkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvLAorfTsKK3N0YXRpYyA6Ol9wYmk6Om9uY2VfZmxhZyBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90b19vbmNlOworY29uc3QgOjpfcGJpOjpEZXNjcmlwdG9yVGFibGUgZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8gPSB7CisgICAgZmFsc2UsIGZhbHNlLCA3NzMsIGRlc2NyaXB0b3JfdGFibGVfcHJvdG9kZWZfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvLAorICAgICJnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvIiwKKyAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fb25jZSwgZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fZGVwcywgMSwgNCwKKyAgICBzY2hlbWFzLCBmaWxlX2RlZmF1bHRfaW5zdGFuY2VzLCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG86Om9mZnNldHMsCisgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8sIGZpbGVfbGV2ZWxfZW51bV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8sCisgICAgZmlsZV9sZXZlbF9zZXJ2aWNlX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bywKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfV0VBSyBjb25zdCA6Ol9wYmk6OkRlc2NyaXB0b3JUYWJsZSogZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fZ2V0dGVyKCkgeworICByZXR1cm4gJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvOworfQorCisvLyBGb3JjZSBydW5uaW5nIEFkZERlc2NyaXB0b3JzKCkgYXQgZHluYW1pYyBpbml0aWFsaXphdGlvbiB0aW1lLgorUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkyIHN0YXRpYyA6Ol9wYmk6OkFkZERlc2NyaXB0b3JzUnVubmVyIGR5bmFtaWNfaW5pdF9kdW1teV9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKTsKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCituYW1lc3BhY2UgY29tcGlsZXIgeworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZV9kZXNjcmlwdG9yKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFzc2lnbkRlc2NyaXB0b3JzKCZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90byk7CisgIHJldHVybiBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvWzBdOworfQorYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworI2lmIChfX2NwbHVzcGx1cyA8IDIwMTcwMykgJiYgKCFkZWZpbmVkKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPj0gMTkwMCAmJiBfTVNDX1ZFUiA8IDE5MTIpKQorY29uc3RleHByIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GZWF0dXJlIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6RkVBVFVSRV9OT05FOworY29uc3RleHByIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GZWF0dXJlIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6RkVBVFVSRV9QUk9UTzNfT1BUSU9OQUw7Citjb25zdGV4cHIgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZlYXR1cmUgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpGZWF0dXJlX01JTjsKK2NvbnN0ZXhwciBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZSBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkZlYXR1cmVfTUFYOworY29uc3RleHByIGludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkZlYXR1cmVfQVJSQVlTSVpFOworI2VuZGlmICAvLyAoX19jcGx1c3BsdXMgPCAyMDE3MDMpICYmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDE5MDAgJiYgX01TQ19WRVIgPCAxOTEyKSkKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBWZXJzaW9uOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKKyAgdXNpbmcgSGFzQml0cyA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxWZXJzaW9uPigpLl9pbXBsXy5faGFzX2JpdHNfKTsKKyAgc3RhdGljIHZvaWQgc2V0X2hhc19tYWpvcihIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDJ1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfbWlub3IoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSA0dTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX3BhdGNoKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gOHU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19zdWZmaXgoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAxdTsKKyAgfQorfTsKKworVmVyc2lvbjo6VmVyc2lvbig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5WZXJzaW9uKQorfQorVmVyc2lvbjo6VmVyc2lvbihjb25zdCBWZXJzaW9uJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBWZXJzaW9uKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe2Zyb20uX2ltcGxfLl9oYXNfYml0c199CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zdWZmaXhfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubWFqb3JfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubWlub3JfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucGF0Y2hfKXt9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8uc3VmZml4Xy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5zdWZmaXhfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX3N1ZmZpeCgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5zdWZmaXhfLlNldChmcm9tLl9pbnRlcm5hbF9zdWZmaXgoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIDo6bWVtY3B5KCZfaW1wbF8ubWFqb3JfLCAmZnJvbS5faW1wbF8ubWFqb3JfLAorICAgIHN0YXRpY19jYXN0PHNpemVfdD4ocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5wYXRjaF8pIC0KKyAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLm1ham9yXykpICsgc2l6ZW9mKF9pbXBsXy5wYXRjaF8pKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24pCit9CisKK2lubGluZSB2b2lkIFZlcnNpb246OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnN1ZmZpeF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5tYWpvcl8pezB9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubWlub3JfKXswfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnBhdGNoXyl7MH0KKyAgfTsKKyAgX2ltcGxfLnN1ZmZpeF8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8uc3VmZml4Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKK30KKworVmVyc2lvbjo6flZlcnNpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5WZXJzaW9uKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgVmVyc2lvbjo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKKyAgX2ltcGxfLnN1ZmZpeF8uRGVzdHJveSgpOworfQorCit2b2lkIFZlcnNpb246OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIFZlcnNpb246OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICBfaW1wbF8uc3VmZml4Xy5DbGVhck5vbkRlZmF1bHRUb0VtcHR5KCk7CisgIH0KKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMGV1KSB7CisgICAgOjptZW1zZXQoJl9pbXBsXy5tYWpvcl8sIDAsIHN0YXRpY19jYXN0PHNpemVfdD4oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8ucGF0Y2hfKSAtCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8ubWFqb3JfKSkgKyBzaXplb2YoX2ltcGxfLnBhdGNoXykpOworICB9CisgIF9pbXBsXy5faGFzX2JpdHNfLkNsZWFyKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogVmVyc2lvbjo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICBfSW50ZXJuYWw6Okhhc0JpdHMgaGFzX2JpdHN7fTsKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gb3B0aW9uYWwgaW50MzIgbWFqb3IgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gOCkpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfbWFqb3IoJmhhc19iaXRzKTsKKyAgICAgICAgICBfaW1wbF8ubWFqb3JfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50MzIoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIGludDMyIG1pbm9yID0gMjsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDE2KSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19taW5vcigmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy5taW5vcl8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQzMigmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgaW50MzIgcGF0Y2ggPSAzOworICAgICAgY2FzZSAzOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMjQpKSB7CisgICAgICAgICAgX0ludGVybmFsOjpzZXRfaGFzX3BhdGNoKCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLnBhdGNoXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDMyKCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgc3VmZml4ID0gNDsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDM0KSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfc3VmZml4KCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5WZXJzaW9uLnN1ZmZpeCIpOworICAgICAgICAgICNlbmRpZiAgLy8gIU5ERUJVRworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIF9pbXBsXy5faGFzX2JpdHNfLk9yKGhhc19iaXRzKTsKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogVmVyc2lvbjo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuVmVyc2lvbikKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgLy8gb3B0aW9uYWwgaW50MzIgbWFqb3IgPSAxOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMSwgdGhpcy0+X2ludGVybmFsX21ham9yKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBpbnQzMiBtaW5vciA9IDI7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA0dSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgyLCB0aGlzLT5faW50ZXJuYWxfbWlub3IoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGludDMyIHBhdGNoID0gMzsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDMsIHRoaXMtPl9pbnRlcm5hbF9wYXRjaCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHN1ZmZpeCA9IDQ7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICB0aGlzLT5faW50ZXJuYWxfc3VmZml4KCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9zdWZmaXgoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuVmVyc2lvbi5zdWZmaXgiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICA0LCB0aGlzLT5faW50ZXJuYWxfc3VmZml4KCksIHRhcmdldCk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuVmVyc2lvbikKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IFZlcnNpb246OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuVmVyc2lvbikKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwZnUpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgc3VmZml4ID0gNDsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+X2ludGVybmFsX3N1ZmZpeCgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBpbnQzMiBtYWpvciA9IDE7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZVBsdXNPbmUodGhpcy0+X2ludGVybmFsX21ham9yKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGludDMyIG1pbm9yID0gMjsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwNHUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplUGx1c09uZSh0aGlzLT5faW50ZXJuYWxfbWlub3IoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgaW50MzIgcGF0Y2ggPSAzOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA4dSkgeworICAgICAgdG90YWxfc2l6ZSArPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemVQbHVzT25lKHRoaXMtPl9pbnRlcm5hbF9wYXRjaCgpKTsKKyAgICB9CisKKyAgfQorICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBWZXJzaW9uOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgVmVyc2lvbjo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpWZXJzaW9uOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBWZXJzaW9uOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8VmVyc2lvbio+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgVmVyc2lvbiY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24pCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBmcm9tLl9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwZnUpIHsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X3N1ZmZpeChmcm9tLl9pbnRlcm5hbF9zdWZmaXgoKSk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgICAgX3RoaXMtPl9pbXBsXy5tYWpvcl8gPSBmcm9tLl9pbXBsXy5tYWpvcl87CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA0dSkgeworICAgICAgX3RoaXMtPl9pbXBsXy5taW5vcl8gPSBmcm9tLl9pbXBsXy5taW5vcl87CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA4dSkgeworICAgICAgX3RoaXMtPl9pbXBsXy5wYXRjaF8gPSBmcm9tLl9pbXBsXy5wYXRjaF87CisgICAgfQorICAgIF90aGlzLT5faW1wbF8uX2hhc19iaXRzX1swXSB8PSBjYWNoZWRfaGFzX2JpdHM7CisgIH0KKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgVmVyc2lvbjo6Q29weUZyb20oY29uc3QgVmVyc2lvbiYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuVmVyc2lvbikKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIFZlcnNpb246OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFZlcnNpb246OkludGVybmFsU3dhcChWZXJzaW9uKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIGF1dG8qIGxoc19hcmVuYSA9IEdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBhdXRvKiByaHNfYXJlbmEgPSBvdGhlci0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN3YXAoX2ltcGxfLl9oYXNfYml0c19bMF0sIG90aGVyLT5faW1wbF8uX2hhc19iaXRzX1swXSk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8uc3VmZml4XywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8uc3VmZml4XywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6bWVtc3dhcDwKKyAgICAgIFBST1RPQlVGX0ZJRUxEX09GRlNFVChWZXJzaW9uLCBfaW1wbF8ucGF0Y2hfKQorICAgICAgKyBzaXplb2YoVmVyc2lvbjo6X2ltcGxfLnBhdGNoXykKKyAgICAgIC0gUFJPVE9CVUZfRklFTERfT0ZGU0VUKFZlcnNpb24sIF9pbXBsXy5tYWpvcl8pPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLm1ham9yXyksCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm90aGVyLT5faW1wbF8ubWFqb3JfKSk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBWZXJzaW9uOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvWzBdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6X0ludGVybmFsIHsKKyBwdWJsaWM6CisgIHVzaW5nIEhhc0JpdHMgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8Q29kZUdlbmVyYXRvclJlcXVlc3Q+KCkuX2ltcGxfLl9oYXNfYml0c18pOworICBzdGF0aWMgdm9pZCBzZXRfaGFzX3BhcmFtZXRlcihIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDF1OworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24mIGNvbXBpbGVyX3ZlcnNpb24oY29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QqIG1zZyk7CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfY29tcGlsZXJfdmVyc2lvbihIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDJ1OworICB9Cit9OworCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24mCitDb2RlR2VuZXJhdG9yUmVxdWVzdDo6X0ludGVybmFsOjpjb21waWxlcl92ZXJzaW9uKGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBtc2cpIHsKKyAgcmV0dXJuICptc2ctPl9pbXBsXy5jb21waWxlcl92ZXJzaW9uXzsKK30KK3ZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmNsZWFyX3Byb3RvX2ZpbGUoKSB7CisgIF9pbXBsXy5wcm90b19maWxlXy5DbGVhcigpOworfQorQ29kZUdlbmVyYXRvclJlcXVlc3Q6OkNvZGVHZW5lcmF0b3JSZXF1ZXN0KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQorfQorQ29kZUdlbmVyYXRvclJlcXVlc3Q6OkNvZGVHZW5lcmF0b3JSZXF1ZXN0KGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBDb2RlR2VuZXJhdG9yUmVxdWVzdCogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXtmcm9tLl9pbXBsXy5faGFzX2JpdHNffQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZmlsZV90b19nZW5lcmF0ZV8pe2Zyb20uX2ltcGxfLmZpbGVfdG9fZ2VuZXJhdGVffQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnByb3RvX2ZpbGVfKXtmcm9tLl9pbXBsXy5wcm90b19maWxlX30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5wYXJhbWV0ZXJfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uY29tcGlsZXJfdmVyc2lvbl8pe251bGxwdHJ9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8ucGFyYW1ldGVyXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5wYXJhbWV0ZXJfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX3BhcmFtZXRlcigpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5wYXJhbWV0ZXJfLlNldChmcm9tLl9pbnRlcm5hbF9wYXJhbWV0ZXIoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfY29tcGlsZXJfdmVyc2lvbigpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5jb21waWxlcl92ZXJzaW9uXyA9IG5ldyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24oKmZyb20uX2ltcGxfLmNvbXBpbGVyX3ZlcnNpb25fKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QpCit9CisKK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5maWxlX3RvX2dlbmVyYXRlXyl7YXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucHJvdG9fZmlsZV8pe2FyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnBhcmFtZXRlcl8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5jb21waWxlcl92ZXJzaW9uXyl7bnVsbHB0cn0KKyAgfTsKKyAgX2ltcGxfLnBhcmFtZXRlcl8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ucGFyYW1ldGVyXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKK30KKworQ29kZUdlbmVyYXRvclJlcXVlc3Q6On5Db2RlR2VuZXJhdG9yUmVxdWVzdCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy5maWxlX3RvX2dlbmVyYXRlXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworICBfaW1wbF8ucHJvdG9fZmlsZV8uflJlcGVhdGVkUHRyRmllbGQoKTsKKyAgX2ltcGxfLnBhcmFtZXRlcl8uRGVzdHJveSgpOworICBpZiAodGhpcyAhPSBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkpIGRlbGV0ZSBfaW1wbF8uY29tcGlsZXJfdmVyc2lvbl87Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLmZpbGVfdG9fZ2VuZXJhdGVfLkNsZWFyKCk7CisgIF9pbXBsXy5wcm90b19maWxlXy5DbGVhcigpOworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDN1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfaW1wbF8ucGFyYW1ldGVyXy5DbGVhck5vbkRlZmF1bHRUb0VtcHR5KCk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgICAgR09PR0xFX0RDSEVDSyhfaW1wbF8uY29tcGlsZXJfdmVyc2lvbl8gIT0gbnVsbHB0cik7CisgICAgICBfaW1wbF8uY29tcGlsZXJfdmVyc2lvbl8tPkNsZWFyKCk7CisgICAgfQorICB9CisgIF9pbXBsXy5faGFzX2JpdHNfLkNsZWFyKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgX0ludGVybmFsOjpIYXNCaXRzIGhhc19iaXRze307CisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIHJlcGVhdGVkIHN0cmluZyBmaWxlX3RvX2dlbmVyYXRlID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDEwKSkgeworICAgICAgICAgIHB0ciAtPSAxOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfYWRkX2ZpbGVfdG9fZ2VuZXJhdGUoKTsKKyAgICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSIpOworICAgICAgICAgICAgI2VuZGlmICAvLyAhTkRFQlVHCisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzwxMD4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxOCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX3BhcmFtZXRlcigpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAjaWZuZGVmIE5ERUJVRworICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyIik7CisgICAgICAgICAgI2VuZGlmICAvLyAhTkRFQlVHCisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5WZXJzaW9uIGNvbXBpbGVyX3ZlcnNpb24gPSAzOworICAgICAgY2FzZSAzOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMjYpKSB7CisgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX211dGFibGVfY29tcGlsZXJfdmVyc2lvbigpLCBwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG9fZmlsZSA9IDE1OworICAgICAgY2FzZSAxNToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDEyMikpIHsKKyAgICAgICAgICBwdHIgLT0gMTsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9hZGRfcHJvdG9fZmlsZSgpLCBwdHIpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8MTIyPihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICBfaW1wbF8uX2hhc19iaXRzXy5PcihoYXNfYml0cyk7CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCBzdHJpbmcgZmlsZV90b19nZW5lcmF0ZSA9IDE7CisgIGZvciAoaW50IGkgPSAwLCBuID0gdGhpcy0+X2ludGVybmFsX2ZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CisgICAgY29uc3QgYXV0byYgcyA9IHRoaXMtPl9pbnRlcm5hbF9maWxlX3RvX2dlbmVyYXRlKGkpOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICBzLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihzLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZygxLCBzLCB0YXJnZXQpOworICB9CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIC8vIG9wdGlvbmFsIHN0cmluZyBwYXJhbWV0ZXIgPSAyOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX3BhcmFtZXRlcigpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pih0aGlzLT5faW50ZXJuYWxfcGFyYW1ldGVyKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnBhcmFtZXRlciIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDIsIHRoaXMtPl9pbnRlcm5hbF9wYXJhbWV0ZXIoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuVmVyc2lvbiBjb21waWxlcl92ZXJzaW9uID0gMzsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSgzLCBfSW50ZXJuYWw6OmNvbXBpbGVyX3ZlcnNpb24odGhpcyksCisgICAgICAgIF9JbnRlcm5hbDo6Y29tcGlsZXJfdmVyc2lvbih0aGlzKS5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9wcm90b19maWxlX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9wcm90b19maWxlKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSgxNSwgcmVwZmllbGQsIHJlcGZpZWxkLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCBzdHJpbmcgZmlsZV90b19nZW5lcmF0ZSA9IDE7CisgIHRvdGFsX3NpemUgKz0gMSAqCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZyb21JbnRTaXplKF9pbXBsXy5maWxlX3RvX2dlbmVyYXRlXy5zaXplKCkpOworICBmb3IgKGludCBpID0gMCwgbiA9IF9pbXBsXy5maWxlX3RvX2dlbmVyYXRlXy5zaXplKCk7IGkgPCBuOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICBfaW1wbF8uZmlsZV90b19nZW5lcmF0ZV8uR2V0KGkpKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7CisgIHRvdGFsX3NpemUgKz0gMVVMICogdGhpcy0+X2ludGVybmFsX3Byb3RvX2ZpbGVfc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy5wcm90b19maWxlXykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKG1zZyk7CisgIH0KKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDN1KSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9wYXJhbWV0ZXIoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5WZXJzaW9uIGNvbXBpbGVyX3ZlcnNpb24gPSAzOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUoCisgICAgICAgICAgKl9pbXBsXy5jb21waWxlcl92ZXJzaW9uXyk7CisgICAgfQorCisgIH0KKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpDb2RlR2VuZXJhdG9yUmVxdWVzdDo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxDb2RlR2VuZXJhdG9yUmVxdWVzdCo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF90aGlzLT5faW1wbF8uZmlsZV90b19nZW5lcmF0ZV8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLmZpbGVfdG9fZ2VuZXJhdGVfKTsKKyAgX3RoaXMtPl9pbXBsXy5wcm90b19maWxlXy5NZXJnZUZyb20oZnJvbS5faW1wbF8ucHJvdG9fZmlsZV8pOworICBjYWNoZWRfaGFzX2JpdHMgPSBmcm9tLl9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwM3UpIHsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X3BhcmFtZXRlcihmcm9tLl9pbnRlcm5hbF9wYXJhbWV0ZXIoKSk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9tdXRhYmxlX2NvbXBpbGVyX3ZlcnNpb24oKS0+OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpWZXJzaW9uOjpNZXJnZUZyb20oCisgICAgICAgICAgZnJvbS5faW50ZXJuYWxfY29tcGlsZXJfdmVyc2lvbigpKTsKKyAgICB9CisgIH0KKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OkNvcHlGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICBpZiAoITo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQoX2ltcGxfLnByb3RvX2ZpbGVfKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpJbnRlcm5hbFN3YXAoQ29kZUdlbmVyYXRvclJlcXVlc3QqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgYXV0byogbGhzX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGF1dG8qIHJoc19hcmVuYSA9IG90aGVyLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3dhcChfaW1wbF8uX2hhc19iaXRzX1swXSwgb3RoZXItPl9pbXBsXy5faGFzX2JpdHNfWzBdKTsKKyAgX2ltcGxfLmZpbGVfdG9fZ2VuZXJhdGVfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5maWxlX3RvX2dlbmVyYXRlXyk7CisgIF9pbXBsXy5wcm90b19maWxlXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8ucHJvdG9fZmlsZV8pOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLnBhcmFtZXRlcl8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLnBhcmFtZXRlcl8sIHJoc19hcmVuYQorICApOworICBzd2FwKF9pbXBsXy5jb21waWxlcl92ZXJzaW9uXywgb3RoZXItPl9pbXBsXy5jb21waWxlcl92ZXJzaW9uXyk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90b1sxXSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Ol9JbnRlcm5hbCB7CisgcHVibGljOgorICB1c2luZyBIYXNCaXRzID0gZGVjbHR5cGUoc3RkOjpkZWNsdmFsPENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlPigpLl9pbXBsXy5faGFzX2JpdHNfKTsKKyAgc3RhdGljIHZvaWQgc2V0X2hhc19uYW1lKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMXU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19pbnNlcnRpb25fcG9pbnQoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAydTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX2NvbnRlbnQoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSA0dTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvJiBnZW5lcmF0ZWRfY29kZV9pbmZvKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBtc2cpOworICBzdGF0aWMgdm9pZCBzZXRfaGFzX2dlbmVyYXRlZF9jb2RlX2luZm8oSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSA4dTsKKyAgfQorfTsKKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvJgorQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Ol9JbnRlcm5hbDo6Z2VuZXJhdGVkX2NvZGVfaW5mbyhjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogbXNnKSB7CisgIHJldHVybiAqbXNnLT5faW1wbF8uZ2VuZXJhdGVkX2NvZGVfaW5mb187Cit9Cit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpjbGVhcl9nZW5lcmF0ZWRfY29kZV9pbmZvKCkgeworICBpZiAoX2ltcGxfLmdlbmVyYXRlZF9jb2RlX2luZm9fICE9IG51bGxwdHIpIF9pbXBsXy5nZW5lcmF0ZWRfY29kZV9pbmZvXy0+Q2xlYXIoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworfQorQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQorfQorQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXtmcm9tLl9pbXBsXy5faGFzX2JpdHNffQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubmFtZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5pbnNlcnRpb25fcG9pbnRfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uY29udGVudF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5nZW5lcmF0ZWRfY29kZV9pbmZvXyl7bnVsbHB0cn19OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19uYW1lKCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLm5hbWVfLlNldChmcm9tLl9pbnRlcm5hbF9uYW1lKCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICBfaW1wbF8uaW5zZXJ0aW9uX3BvaW50Xy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5pbnNlcnRpb25fcG9pbnRfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX2luc2VydGlvbl9wb2ludCgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5pbnNlcnRpb25fcG9pbnRfLlNldChmcm9tLl9pbnRlcm5hbF9pbnNlcnRpb25fcG9pbnQoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIF9pbXBsXy5jb250ZW50Xy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5jb250ZW50Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19jb250ZW50KCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLmNvbnRlbnRfLlNldChmcm9tLl9pbnRlcm5hbF9jb250ZW50KCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX2dlbmVyYXRlZF9jb2RlX2luZm8oKSkgeworICAgIF90aGlzLT5faW1wbF8uZ2VuZXJhdGVkX2NvZGVfaW5mb18gPSBuZXcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvKCpmcm9tLl9pbXBsXy5nZW5lcmF0ZWRfY29kZV9pbmZvXyk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQorfQorCitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubmFtZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5pbnNlcnRpb25fcG9pbnRfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uY29udGVudF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5nZW5lcmF0ZWRfY29kZV9pbmZvXyl7bnVsbHB0cn0KKyAgfTsKKyAgX2ltcGxfLm5hbWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBfaW1wbF8uaW5zZXJ0aW9uX3BvaW50Xy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5pbnNlcnRpb25fcG9pbnRfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBfaW1wbF8uY29udGVudF8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8uY29udGVudF8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCit9CisKK0NvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjp+Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8ubmFtZV8uRGVzdHJveSgpOworICBfaW1wbF8uaW5zZXJ0aW9uX3BvaW50Xy5EZXN0cm95KCk7CisgIF9pbXBsXy5jb250ZW50Xy5EZXN0cm95KCk7CisgIGlmICh0aGlzICE9IGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSkgZGVsZXRlIF9pbXBsXy5nZW5lcmF0ZWRfY29kZV9pbmZvXzsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMGZ1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfaW1wbF8ubmFtZV8uQ2xlYXJOb25EZWZhdWx0VG9FbXB0eSgpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIF9pbXBsXy5pbnNlcnRpb25fcG9pbnRfLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICBfaW1wbF8uY29udGVudF8uQ2xlYXJOb25EZWZhdWx0VG9FbXB0eSgpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwOHUpIHsKKyAgICAgIEdPT0dMRV9EQ0hFQ0soX2ltcGxfLmdlbmVyYXRlZF9jb2RlX2luZm9fICE9IG51bGxwdHIpOworICAgICAgX2ltcGxfLmdlbmVyYXRlZF9jb2RlX2luZm9fLT5DbGVhcigpOworICAgIH0KKyAgfQorICBfaW1wbF8uX2hhc19iaXRzXy5DbGVhcigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIF9JbnRlcm5hbDo6SGFzQml0cyBoYXNfYml0c3t9OworICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxMCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICA6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50ID0gMjsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDE4KSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfaW5zZXJ0aW9uX3BvaW50KCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1OworICAgICAgY2FzZSAxNToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDEyMikpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX2NvbnRlbnQoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICA6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmNvbnRlbnQiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvIGdlbmVyYXRlZF9jb2RlX2luZm8gPSAxNjsKKyAgICAgIGNhc2UgMTY6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxMzApKSB7CisgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX211dGFibGVfZ2VuZXJhdGVkX2NvZGVfaW5mbygpLCBwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICBfaW1wbF8uX2hhc19iaXRzXy5PcihoYXNfYml0cyk7CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX25hbWUoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX25hbWUoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUubmFtZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDEsIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50ID0gMjsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9pbnNlcnRpb25fcG9pbnQoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX2luc2VydGlvbl9wb2ludCgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICAyLCB0aGlzLT5faW50ZXJuYWxfaW5zZXJ0aW9uX3BvaW50KCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1OworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwNHUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX2NvbnRlbnQoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX2NvbnRlbnQoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuY29udGVudCIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDE1LCB0aGlzLT5faW50ZXJuYWxfY29udGVudCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbyBnZW5lcmF0ZWRfY29kZV9pbmZvID0gMTY7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA4dSkgeworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoMTYsIF9JbnRlcm5hbDo6Z2VuZXJhdGVkX2NvZGVfaW5mbyh0aGlzKSwKKyAgICAgICAgX0ludGVybmFsOjpnZW5lcmF0ZWRfY29kZV9pbmZvKHRoaXMpLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMGZ1KSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5faW50ZXJuYWxfbmFtZSgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50ID0gMjsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+X2ludGVybmFsX2luc2VydGlvbl9wb2ludCgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1OworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA0dSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5faW50ZXJuYWxfY29udGVudCgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvIGdlbmVyYXRlZF9jb2RlX2luZm8gPSAxNjsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwOHUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMiArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKAorICAgICAgICAgICpfaW1wbF8uZ2VuZXJhdGVkX2NvZGVfaW5mb18pOworICAgIH0KKworICB9CisgIHJldHVybiBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCAmX2ltcGxfLl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH0KKworCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJj4oZnJvbV9tc2cpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBmcm9tLl9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwZnUpIHsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X25hbWUoZnJvbS5faW50ZXJuYWxfbmFtZSgpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9pbnNlcnRpb25fcG9pbnQoZnJvbS5faW50ZXJuYWxfaW5zZXJ0aW9uX3BvaW50KCkpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwNHUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X2NvbnRlbnQoZnJvbS5faW50ZXJuYWxfY29udGVudCgpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX211dGFibGVfZ2VuZXJhdGVkX2NvZGVfaW5mbygpLT46OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm86Ok1lcmdlRnJvbSgKKyAgICAgICAgICBmcm9tLl9pbnRlcm5hbF9nZW5lcmF0ZWRfY29kZV9pbmZvKCkpOworICAgIH0KKyAgfQorICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Q29weUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpJbnRlcm5hbFN3YXAoQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgYXV0byogbGhzX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGF1dG8qIHJoc19hcmVuYSA9IG90aGVyLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3dhcChfaW1wbF8uX2hhc19iaXRzX1swXSwgb3RoZXItPl9pbXBsXy5faGFzX2JpdHNfWzBdKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5uYW1lXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8ubmFtZV8sIHJoc19hcmVuYQorICApOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLmluc2VydGlvbl9wb2ludF8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLmluc2VydGlvbl9wb2ludF8sIHJoc19hcmVuYQorICApOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLmNvbnRlbnRfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5jb250ZW50XywgcmhzX2FyZW5hCisgICk7CisgIHN3YXAoX2ltcGxfLmdlbmVyYXRlZF9jb2RlX2luZm9fLCBvdGhlci0+X2ltcGxfLmdlbmVyYXRlZF9jb2RlX2luZm9fKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvWzJdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Ol9JbnRlcm5hbCB7CisgcHVibGljOgorICB1c2luZyBIYXNCaXRzID0gZGVjbHR5cGUoc3RkOjpkZWNsdmFsPENvZGVHZW5lcmF0b3JSZXNwb25zZT4oKS5faW1wbF8uX2hhc19iaXRzXyk7CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfZXJyb3IoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAxdTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX3N1cHBvcnRlZF9mZWF0dXJlcyhIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDJ1OworICB9Cit9OworCitDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkNvZGVHZW5lcmF0b3JSZXNwb25zZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCit9CitDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkNvZGVHZW5lcmF0b3JSZXNwb25zZShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIENvZGVHZW5lcmF0b3JSZXNwb25zZSogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXtmcm9tLl9pbXBsXy5faGFzX2JpdHNffQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZmlsZV8pe2Zyb20uX2ltcGxfLmZpbGVffQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmVycm9yXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnN1cHBvcnRlZF9mZWF0dXJlc18pe319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5lcnJvcl8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8uZXJyb3JfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX2Vycm9yKCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLmVycm9yXy5TZXQoZnJvbS5faW50ZXJuYWxfZXJyb3IoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIF90aGlzLT5faW1wbF8uc3VwcG9ydGVkX2ZlYXR1cmVzXyA9IGZyb20uX2ltcGxfLnN1cHBvcnRlZF9mZWF0dXJlc187CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCit9CisKK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZmlsZV8pe2FyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmVycm9yXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnN1cHBvcnRlZF9mZWF0dXJlc18pe3VpbnQ2NF90ezB1fX0KKyAgfTsKKyAgX2ltcGxfLmVycm9yXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5lcnJvcl8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCit9CisKK0NvZGVHZW5lcmF0b3JSZXNwb25zZTo6fkNvZGVHZW5lcmF0b3JSZXNwb25zZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKKyAgX2ltcGxfLmZpbGVfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5lcnJvcl8uRGVzdHJveSgpOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy5maWxlXy5DbGVhcigpOworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgX2ltcGxfLmVycm9yXy5DbGVhck5vbkRlZmF1bHRUb0VtcHR5KCk7CisgIH0KKyAgX2ltcGxfLnN1cHBvcnRlZF9mZWF0dXJlc18gPSB1aW50NjRfdHswdX07CisgIF9pbXBsXy5faGFzX2JpdHNfLkNsZWFyKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIF9JbnRlcm5hbDo6SGFzQml0cyBoYXNfYml0c3t9OworICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTApKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9lcnJvcigpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAjaWZuZGVmIE5ERUJVRworICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yIik7CisgICAgICAgICAgI2VuZGlmICAvLyAhTkRFQlVHCisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgdWludDY0IHN1cHBvcnRlZF9mZWF0dXJlcyA9IDI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxNikpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfc3VwcG9ydGVkX2ZlYXR1cmVzKCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLnN1cHBvcnRlZF9mZWF0dXJlc18gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSBmaWxlID0gMTU7CisgICAgICBjYXNlIDE1OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTIyKSkgeworICAgICAgICAgIHB0ciAtPSAxOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX2FkZF9maWxlKCksIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzwxMjI+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIF9pbXBsXy5faGFzX2JpdHNfLk9yKGhhc19iaXRzKTsKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIC8vIG9wdGlvbmFsIHN0cmluZyBlcnJvciA9IDE7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICB0aGlzLT5faW50ZXJuYWxfZXJyb3IoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX2Vycm9yKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5lcnJvciIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDEsIHRoaXMtPl9pbnRlcm5hbF9lcnJvcigpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgdWludDY0IHN1cHBvcnRlZF9mZWF0dXJlcyA9IDI7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQ2NFRvQXJyYXkoMiwgdGhpcy0+X2ludGVybmFsX3N1cHBvcnRlZF9mZWF0dXJlcygpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSBmaWxlID0gMTU7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9maWxlX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9maWxlKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSgxNSwgcmVwZmllbGQsIHJlcGZpZWxkLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlIGZpbGUgPSAxNTsKKyAgdG90YWxfc2l6ZSArPSAxVUwgKiB0aGlzLT5faW50ZXJuYWxfZmlsZV9zaXplKCk7CisgIGZvciAoY29uc3QgYXV0byYgbXNnIDogdGhpcy0+X2ltcGxfLmZpbGVfKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUobXNnKTsKKyAgfQorCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwM3UpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAxOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5faW50ZXJuYWxfZXJyb3IoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgdWludDY0IHN1cHBvcnRlZF9mZWF0dXJlcyA9IDI7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OlVJbnQ2NFNpemVQbHVzT25lKHRoaXMtPl9pbnRlcm5hbF9zdXBwb3J0ZWRfZmVhdHVyZXMoKSk7CisgICAgfQorCisgIH0KKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkNvZGVHZW5lcmF0b3JSZXNwb25zZTo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8Q29kZUdlbmVyYXRvclJlc3BvbnNlKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfdGhpcy0+X2ltcGxfLmZpbGVfLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5maWxlXyk7CisgIGNhY2hlZF9oYXNfYml0cyA9IGZyb20uX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAzdSkgeworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfZXJyb3IoZnJvbS5faW50ZXJuYWxfZXJyb3IoKSk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgICAgX3RoaXMtPl9pbXBsXy5zdXBwb3J0ZWRfZmVhdHVyZXNfID0gZnJvbS5faW1wbF8uc3VwcG9ydGVkX2ZlYXR1cmVzXzsKKyAgICB9CisgICAgX3RoaXMtPl9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IGNhY2hlZF9oYXNfYml0czsKKyAgfQorICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkNvcHlGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkludGVybmFsU3dhcChDb2RlR2VuZXJhdG9yUmVzcG9uc2UqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgYXV0byogbGhzX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGF1dG8qIHJoc19hcmVuYSA9IG90aGVyLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3dhcChfaW1wbF8uX2hhc19iaXRzX1swXSwgb3RoZXItPl9pbXBsXy5faGFzX2JpdHNfWzBdKTsKKyAgX2ltcGxfLmZpbGVfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5maWxlXyk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8uZXJyb3JfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5lcnJvcl8sIHJoc19hcmVuYQorICApOworICBzd2FwKF9pbXBsXy5zdXBwb3J0ZWRfZmVhdHVyZXNfLCBvdGhlci0+X2ltcGxfLnN1cHBvcnRlZF9mZWF0dXJlc18pOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvWzNdKTsKK30KKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24qCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24gPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbiA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVxdWVzdCoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlcXVlc3QgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlcXVlc3QgPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZSoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZSA+KGFyZW5hKTsKK30KK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YzJjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oCkBAIC0wLDAgKzEsMTkwMSBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90bworCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bworCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisjaWYgUFJPVE9CVUZfVkVSU0lPTiA8IDMwMjEwMDAKKyNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCisjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gUGxlYXNlIHVwZGF0ZQorI2Vycm9yIHlvdXIgaGVhZGVycy4KKyNlbmRpZgorI2lmIDMwMjEwMDkgPCBQUk9UT0JVRl9NSU5fUFJPVE9DX1ZFUlNJT04KKyNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhbiBvbGRlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcworI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuIFBsZWFzZQorI2Vycm9yIHJlZ2VuZXJhdGUgdGhpcyBmaWxlIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYy4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisjZGVmaW5lIFBST1RPQlVGX0lOVEVSTkFMX0VYUE9SVF9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8gUFJPVE9DX0VYUE9SVAorI2lmZGVmIG1ham9yCisjdW5kZWYgbWFqb3IKKyNlbmRpZgorI2lmZGVmIG1pbm9yCisjdW5kZWYgbWlub3IKKyNlbmRpZgorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBBbnlNZXRhZGF0YTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCisKKy8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCAtLSBkbyBub3QgdXNlIHRoZXNlIG1lbWJlcnMuCitzdHJ1Y3QgUFJPVE9DX0VYUE9SVCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8geworICBzdGF0aWMgY29uc3QgdWludDMyX3Qgb2Zmc2V0c1tdOworfTsKK1BST1RPQ19FWFBPUlQgZXh0ZXJuIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RGVzY3JpcHRvclRhYmxlIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvOworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK25hbWVzcGFjZSBjb21waWxlciB7CitjbGFzcyBDb2RlR2VuZXJhdG9yUmVxdWVzdDsKK3N0cnVjdCBDb2RlR2VuZXJhdG9yUmVxdWVzdERlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0NfRVhQT1JUIGV4dGVybiBDb2RlR2VuZXJhdG9yUmVxdWVzdERlZmF1bHRUeXBlSW50ZXJuYWwgX0NvZGVHZW5lcmF0b3JSZXF1ZXN0X2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgQ29kZUdlbmVyYXRvclJlc3BvbnNlOworc3RydWN0IENvZGVHZW5lcmF0b3JSZXNwb25zZURlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0NfRVhQT1JUIGV4dGVybiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VEZWZhdWx0VHlwZUludGVybmFsIF9Db2RlR2VuZXJhdG9yUmVzcG9uc2VfZGVmYXVsdF9pbnN0YW5jZV87CitjbGFzcyBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTsKK3N0cnVjdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZURlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0NfRVhQT1JUIGV4dGVybiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZURlZmF1bHRUeXBlSW50ZXJuYWwgX0NvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgVmVyc2lvbjsKK3N0cnVjdCBWZXJzaW9uRGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQ19FWFBPUlQgZXh0ZXJuIFZlcnNpb25EZWZhdWx0VHlwZUludGVybmFsIF9WZXJzaW9uX2RlZmF1bHRfaW5zdGFuY2VfOworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCit0ZW1wbGF0ZTw+IFBST1RPQ19FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVxdWVzdCogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXF1ZXN0PihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0NfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0NfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZT4oQXJlbmEqKTsKK3RlbXBsYXRlPD4gUFJPVE9DX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24qIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpWZXJzaW9uPihBcmVuYSopOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworZW51bSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZSA6IGludCB7CisgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GZWF0dXJlX0ZFQVRVUkVfTk9ORSA9IDAsCisgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GZWF0dXJlX0ZFQVRVUkVfUFJPVE8zX09QVElPTkFMID0gMQorfTsKK1BST1RPQ19FWFBPUlQgYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZV9Jc1ZhbGlkKGludCB2YWx1ZSk7Citjb25zdGV4cHIgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZlYXR1cmUgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZlYXR1cmVfRmVhdHVyZV9NSU4gPSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZV9GRUFUVVJFX05PTkU7Citjb25zdGV4cHIgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZlYXR1cmUgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZlYXR1cmVfRmVhdHVyZV9NQVggPSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZV9GRUFUVVJFX1BST1RPM19PUFRJT05BTDsKK2NvbnN0ZXhwciBpbnQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZlYXR1cmVfRmVhdHVyZV9BUlJBWVNJWkUgPSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZV9GZWF0dXJlX01BWCArIDE7CisKK1BST1RPQ19FWFBPUlQgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZV9kZXNjcmlwdG9yKCk7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZV9OYW1lKFQgZW51bV90X3ZhbHVlKSB7CisgIHN0YXRpY19hc3NlcnQoOjpzdGQ6OmlzX3NhbWU8VCwgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZlYXR1cmU+Ojp2YWx1ZSB8fAorICAgIDo6c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsCisgICAgIkluY29ycmVjdCB0eXBlIHBhc3NlZCB0byBmdW5jdGlvbiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZV9OYW1lLiIpOworICByZXR1cm4gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpOYW1lT2ZFbnVtKAorICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GZWF0dXJlX2Rlc2NyaXB0b3IoKSwgZW51bV90X3ZhbHVlKTsKK30KK2lubGluZSBib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GZWF0dXJlX1BhcnNlKAorICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpDb25zdFN0cmluZ1BhcmFtIG5hbWUsIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GZWF0dXJlKiB2YWx1ZSkgeworICByZXR1cm4gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZU5hbWVkRW51bTxDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZT4oCisgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZlYXR1cmVfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Cit9CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFBST1RPQ19FWFBPUlQgVmVyc2lvbiBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5WZXJzaW9uKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgVmVyc2lvbigpIDogVmVyc2lvbihudWxscHRyKSB7fQorICB+VmVyc2lvbigpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgVmVyc2lvbig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIFZlcnNpb24oY29uc3QgVmVyc2lvbiYgZnJvbSk7CisgIFZlcnNpb24oVmVyc2lvbiYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBWZXJzaW9uKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgVmVyc2lvbiYgb3BlcmF0b3I9KGNvbnN0IFZlcnNpb24mIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIFZlcnNpb24mIG9wZXJhdG9yPShWZXJzaW9uJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKTsKKyAgfQorICBpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBWZXJzaW9uJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgVmVyc2lvbiogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWZXJzaW9uKj4oCisgICAgICAgICAgICAgICAmX1ZlcnNpb25fZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAwOworCisgIGZyaWVuZCB2b2lkIHN3YXAoVmVyc2lvbiYgYSwgVmVyc2lvbiYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChWZXJzaW9uKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChWZXJzaW9uKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBWZXJzaW9uKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPFZlcnNpb24+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgVmVyc2lvbiYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBWZXJzaW9uJiBmcm9tKSB7CisgICAgVmVyc2lvbjo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKFZlcnNpb24qIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuVmVyc2lvbiI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBWZXJzaW9uKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrU3VmZml4RmllbGROdW1iZXIgPSA0LAorICAgIGtNYWpvckZpZWxkTnVtYmVyID0gMSwKKyAgICBrTWlub3JGaWVsZE51bWJlciA9IDIsCisgICAga1BhdGNoRmllbGROdW1iZXIgPSAzLAorICB9OworICAvLyBvcHRpb25hbCBzdHJpbmcgc3VmZml4ID0gNDsKKyAgYm9vbCBoYXNfc3VmZml4KCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19zdWZmaXgoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3N1ZmZpeCgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfc3VmZml4KEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfc3VmZml4KCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9zdWZmaXgoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX3N1ZmZpeChzdGQ6OnN0cmluZyogc3VmZml4KTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9zdWZmaXgoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X3N1ZmZpeChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfc3VmZml4KCk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBpbnQzMiBtYWpvciA9IDE7CisgIGJvb2wgaGFzX21ham9yKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19tYWpvcigpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfbWFqb3IoKTsKKyAgaW50MzJfdCBtYWpvcigpIGNvbnN0OworICB2b2lkIHNldF9tYWpvcihpbnQzMl90IHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgaW50MzJfdCBfaW50ZXJuYWxfbWFqb3IoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X21ham9yKGludDMyX3QgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgaW50MzIgbWlub3IgPSAyOworICBib29sIGhhc19taW5vcigpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfbWlub3IoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX21pbm9yKCk7CisgIGludDMyX3QgbWlub3IoKSBjb25zdDsKKyAgdm9pZCBzZXRfbWlub3IoaW50MzJfdCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGludDMyX3QgX2ludGVybmFsX21pbm9yKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9taW5vcihpbnQzMl90IHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIGludDMyIHBhdGNoID0gMzsKKyAgYm9vbCBoYXNfcGF0Y2goKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX3BhdGNoKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9wYXRjaCgpOworICBpbnQzMl90IHBhdGNoKCkgY29uc3Q7CisgIHZvaWQgc2V0X3BhdGNoKGludDMyX3QgdmFsdWUpOworICBwcml2YXRlOgorICBpbnQzMl90IF9pbnRlcm5hbF9wYXRjaCgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfcGF0Y2goaW50MzJfdCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24pCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6SGFzQml0czwxPiBfaGFzX2JpdHNfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBzdWZmaXhfOworICAgIGludDMyX3QgbWFqb3JfOworICAgIGludDMyX3QgbWlub3JfOworICAgIGludDMyX3QgcGF0Y2hfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQ19FWFBPUlQgQ29kZUdlbmVyYXRvclJlcXVlc3QgZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBDb2RlR2VuZXJhdG9yUmVxdWVzdCgpIDogQ29kZUdlbmVyYXRvclJlcXVlc3QobnVsbHB0cikge30KKyAgfkNvZGVHZW5lcmF0b3JSZXF1ZXN0KCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBDb2RlR2VuZXJhdG9yUmVxdWVzdCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIENvZGVHZW5lcmF0b3JSZXF1ZXN0KGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBmcm9tKTsKKyAgQ29kZUdlbmVyYXRvclJlcXVlc3QoQ29kZUdlbmVyYXRvclJlcXVlc3QmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogQ29kZUdlbmVyYXRvclJlcXVlc3QoKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgb3BlcmF0b3I9KGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgb3BlcmF0b3I9KENvZGVHZW5lcmF0b3JSZXF1ZXN0JiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKTsKKyAgfQorICBpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gKmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0Kj4oCisgICAgICAgICAgICAgICAmX0NvZGVHZW5lcmF0b3JSZXF1ZXN0X2RlZmF1bHRfaW5zdGFuY2VfKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9CisgICAgMTsKKworICBmcmllbmQgdm9pZCBzd2FwKENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBhLCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChDb2RlR2VuZXJhdG9yUmVxdWVzdCogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICBHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICAjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdlbmVyaWNTd2FwKHRoaXMsIG90aGVyKTsKKyAgICB9CisgIH0KKyAgdm9pZCBVbnNhZmVBcmVuYVN3YXAoQ29kZUdlbmVyYXRvclJlcXVlc3QqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPENvZGVHZW5lcmF0b3JSZXF1ZXN0PihhcmVuYSk7CisgIH0KKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlGcm9tOworICB2b2lkIENvcHlGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBmcm9tKSB7CisgICAgQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ok1lcmdlSW1wbCgqdGhpcywgZnJvbSk7CisgIH0KKyAgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgTWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZyk7CisgIHB1YmxpYzoKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IGZpbmFsOworICB2b2lkIEludGVybmFsU3dhcChDb2RlR2VuZXJhdG9yUmVxdWVzdCogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXzsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDsKKworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga0ZpbGVUb0dlbmVyYXRlRmllbGROdW1iZXIgPSAxLAorICAgIGtQcm90b0ZpbGVGaWVsZE51bWJlciA9IDE1LAorICAgIGtQYXJhbWV0ZXJGaWVsZE51bWJlciA9IDIsCisgICAga0NvbXBpbGVyVmVyc2lvbkZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIGZpbGVfdG9fZ2VuZXJhdGUgPSAxOworICBpbnQgZmlsZV90b19nZW5lcmF0ZV9zaXplKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGludCBfaW50ZXJuYWxfZmlsZV90b19nZW5lcmF0ZV9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9maWxlX3RvX2dlbmVyYXRlKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4KTsKKyAgdm9pZCBzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4LCBzdGQ6OnN0cmluZyYmIHZhbHVlKTsKKyAgdm9pZCBzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIHN0ZDo6c3RyaW5nKiBhZGRfZmlsZV90b19nZW5lcmF0ZSgpOworICB2b2lkIGFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgYWRkX2ZpbGVfdG9fZ2VuZXJhdGUoc3RkOjpzdHJpbmcmJiB2YWx1ZSk7CisgIHZvaWQgYWRkX2ZpbGVfdG9fZ2VuZXJhdGUoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIGFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiYgZmlsZV90b19nZW5lcmF0ZSgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4qIG11dGFibGVfZmlsZV90b19nZW5lcmF0ZSgpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4KSBjb25zdDsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9hZGRfZmlsZV90b19nZW5lcmF0ZSgpOworICBwdWJsaWM6CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIHByb3RvX2ZpbGUgPSAxNTsKKyAgaW50IHByb3RvX2ZpbGVfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX3Byb3RvX2ZpbGVfc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfcHJvdG9fZmlsZSgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byogbXV0YWJsZV9wcm90b19maWxlKGludCBpbmRleCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9wcm90b19maWxlKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvJiBfaW50ZXJuYWxfcHJvdG9fZmlsZShpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byogX2ludGVybmFsX2FkZF9wcm90b19maWxlKCk7CisgIHB1YmxpYzoKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvX2ZpbGUoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIGFkZF9wcm90b19maWxlKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byA+JgorICAgICAgcHJvdG9fZmlsZSgpIGNvbnN0OworCisgIC8vIG9wdGlvbmFsIHN0cmluZyBwYXJhbWV0ZXIgPSAyOworICBib29sIGhhc19wYXJhbWV0ZXIoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX3BhcmFtZXRlcigpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfcGFyYW1ldGVyKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF9wYXJhbWV0ZXIoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9wYXJhbWV0ZXIoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX3BhcmFtZXRlcigpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfcGFyYW1ldGVyKHN0ZDo6c3RyaW5nKiBwYXJhbWV0ZXIpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX3BhcmFtZXRlcigpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfcGFyYW1ldGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9wYXJhbWV0ZXIoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuVmVyc2lvbiBjb21waWxlcl92ZXJzaW9uID0gMzsKKyAgYm9vbCBoYXNfY29tcGlsZXJfdmVyc2lvbigpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfY29tcGlsZXJfdmVyc2lvbigpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfY29tcGlsZXJfdmVyc2lvbigpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24mIGNvbXBpbGVyX3ZlcnNpb24oKSBjb25zdDsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbiogcmVsZWFzZV9jb21waWxlcl92ZXJzaW9uKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbiogbXV0YWJsZV9jb21waWxlcl92ZXJzaW9uKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9jb21waWxlcl92ZXJzaW9uKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbiogY29tcGlsZXJfdmVyc2lvbik7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbiYgX2ludGVybmFsX2NvbXBpbGVyX3ZlcnNpb24oKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpWZXJzaW9uKiBfaW50ZXJuYWxfbXV0YWJsZV9jb21waWxlcl92ZXJzaW9uKCk7CisgIHB1YmxpYzoKKyAgdm9pZCB1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF9jb21waWxlcl92ZXJzaW9uKAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpWZXJzaW9uKiBjb21waWxlcl92ZXJzaW9uKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpWZXJzaW9uKiB1bnNhZmVfYXJlbmFfcmVsZWFzZV9jb21waWxlcl92ZXJzaW9uKCk7CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpIYXNCaXRzPDE+IF9oYXNfYml0c187CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gZmlsZV90b19nZW5lcmF0ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvID4gcHJvdG9fZmlsZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBwYXJhbWV0ZXJfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbiogY29tcGlsZXJfdmVyc2lvbl87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUFJPVE9DX0VYUE9SVCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKCkgOiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZShudWxscHRyKSB7fQorICB+Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUoKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUoY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZyb20pOworICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZShDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSgpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBvcGVyYXRvcj0oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBvcGVyYXRvcj0oQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpOworICB9CisgIGlubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqPigKKyAgICAgICAgICAgICAgICZfQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAyOworCisgIGZyaWVuZCB2b2lkIHN3YXAoQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGEsIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZyb20pIHsKKyAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5zZXJ0aW9uUG9pbnRGaWVsZE51bWJlciA9IDIsCisgICAga0NvbnRlbnRGaWVsZE51bWJlciA9IDE1LAorICAgIGtHZW5lcmF0ZWRDb2RlSW5mb0ZpZWxkTnVtYmVyID0gMTYsCisgIH07CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfbmFtZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfbmFtZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X25hbWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9uYW1lKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50ID0gMjsKKyAgYm9vbCBoYXNfaW5zZXJ0aW9uX3BvaW50KCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19pbnNlcnRpb25fcG9pbnQoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2luc2VydGlvbl9wb2ludCgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgaW5zZXJ0aW9uX3BvaW50KCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfaW5zZXJ0aW9uX3BvaW50KEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfaW5zZXJ0aW9uX3BvaW50KCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9pbnNlcnRpb25fcG9pbnQoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2luc2VydGlvbl9wb2ludChzdGQ6OnN0cmluZyogaW5zZXJ0aW9uX3BvaW50KTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9pbnNlcnRpb25fcG9pbnQoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X2luc2VydGlvbl9wb2ludChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfaW5zZXJ0aW9uX3BvaW50KCk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1OworICBib29sIGhhc19jb250ZW50KCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19jb250ZW50KCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9jb250ZW50KCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50KCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfY29udGVudChBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX2NvbnRlbnQoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX2NvbnRlbnQoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2NvbnRlbnQoc3RkOjpzdHJpbmcqIGNvbnRlbnQpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX2NvbnRlbnQoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X2NvbnRlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX2NvbnRlbnQoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8gZ2VuZXJhdGVkX2NvZGVfaW5mbyA9IDE2OworICBib29sIGhhc19nZW5lcmF0ZWRfY29kZV9pbmZvKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19nZW5lcmF0ZWRfY29kZV9pbmZvKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9nZW5lcmF0ZWRfY29kZV9pbmZvKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpHZW5lcmF0ZWRDb2RlSW5mbyYgZ2VuZXJhdGVkX2NvZGVfaW5mbygpIGNvbnN0OworICBQUk9UT0JVRl9OT0RJU0NBUkQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvKiByZWxlYXNlX2dlbmVyYXRlZF9jb2RlX2luZm8oKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvKiBtdXRhYmxlX2dlbmVyYXRlZF9jb2RlX2luZm8oKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2dlbmVyYXRlZF9jb2RlX2luZm8oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvKiBnZW5lcmF0ZWRfY29kZV9pbmZvKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvJiBfaW50ZXJuYWxfZ2VuZXJhdGVkX2NvZGVfaW5mbygpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm8qIF9pbnRlcm5hbF9tdXRhYmxlX2dlbmVyYXRlZF9jb2RlX2luZm8oKTsKKyAgcHVibGljOgorICB2b2lkIHVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkX2dlbmVyYXRlZF9jb2RlX2luZm8oCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm8qIGdlbmVyYXRlZF9jb2RlX2luZm8pOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm8qIHVuc2FmZV9hcmVuYV9yZWxlYXNlX2dlbmVyYXRlZF9jb2RlX2luZm8oKTsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Okhhc0JpdHM8MT4gX2hhc19iaXRzXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgbmFtZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBpbnNlcnRpb25fcG9pbnRfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgY29udGVudF87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvKiBnZW5lcmF0ZWRfY29kZV9pbmZvXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0NfRVhQT1JUIENvZGVHZW5lcmF0b3JSZXNwb25zZSBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBDb2RlR2VuZXJhdG9yUmVzcG9uc2UoKSA6IENvZGVHZW5lcmF0b3JSZXNwb25zZShudWxscHRyKSB7fQorICB+Q29kZUdlbmVyYXRvclJlc3BvbnNlKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBDb2RlR2VuZXJhdG9yUmVzcG9uc2UoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBDb2RlR2VuZXJhdG9yUmVzcG9uc2UoY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBmcm9tKTsKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlKENvZGVHZW5lcmF0b3JSZXNwb25zZSYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBDb2RlR2VuZXJhdG9yUmVzcG9uc2UoKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIG9wZXJhdG9yPShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIENvZGVHZW5lcmF0b3JSZXNwb25zZSYgb3BlcmF0b3I9KENvZGVHZW5lcmF0b3JSZXNwb25zZSYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSk7CisgIH0KKyAgaW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZSo+KAorICAgICAgICAgICAgICAgJl9Db2RlR2VuZXJhdG9yUmVzcG9uc2VfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAzOworCisgIGZyaWVuZCB2b2lkIHN3YXAoQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBhLCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChDb2RlR2VuZXJhdG9yUmVzcG9uc2UqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIENvZGVHZW5lcmF0b3JSZXNwb25zZSogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxDb2RlR2VuZXJhdG9yUmVzcG9uc2U+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZSYgZnJvbSkgeworICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKENvZGVHZW5lcmF0b3JSZXNwb25zZSogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UiOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgQ29kZUdlbmVyYXRvclJlc3BvbnNlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdHlwZWRlZiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSBGaWxlOworCisgIHR5cGVkZWYgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZlYXR1cmUgRmVhdHVyZTsKKyAgc3RhdGljIGNvbnN0ZXhwciBGZWF0dXJlIEZFQVRVUkVfTk9ORSA9CisgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZlYXR1cmVfRkVBVFVSRV9OT05FOworICBzdGF0aWMgY29uc3RleHByIEZlYXR1cmUgRkVBVFVSRV9QUk9UTzNfT1BUSU9OQUwgPQorICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GZWF0dXJlX0ZFQVRVUkVfUFJPVE8zX09QVElPTkFMOworICBzdGF0aWMgaW5saW5lIGJvb2wgRmVhdHVyZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICAgIHJldHVybiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZV9Jc1ZhbGlkKHZhbHVlKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIEZlYXR1cmUgRmVhdHVyZV9NSU4gPQorICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GZWF0dXJlX0ZlYXR1cmVfTUlOOworICBzdGF0aWMgY29uc3RleHByIEZlYXR1cmUgRmVhdHVyZV9NQVggPQorICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GZWF0dXJlX0ZlYXR1cmVfTUFYOworICBzdGF0aWMgY29uc3RleHByIGludCBGZWF0dXJlX0FSUkFZU0laRSA9CisgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZlYXR1cmVfRmVhdHVyZV9BUlJBWVNJWkU7CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yKgorICBGZWF0dXJlX2Rlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GZWF0dXJlX2Rlc2NyaXB0b3IoKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBzdGF0aWMgaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGZWF0dXJlX05hbWUoVCBlbnVtX3RfdmFsdWUpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KDo6c3RkOjppc19zYW1lPFQsIEZlYXR1cmU+Ojp2YWx1ZSB8fAorICAgICAgOjpzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSwKKyAgICAgICJJbmNvcnJlY3QgdHlwZSBwYXNzZWQgdG8gZnVuY3Rpb24gRmVhdHVyZV9OYW1lLiIpOworICAgIHJldHVybiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZV9OYW1lKGVudW1fdF92YWx1ZSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIEZlYXR1cmVfUGFyc2UoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkNvbnN0U3RyaW5nUGFyYW0gbmFtZSwKKyAgICAgIEZlYXR1cmUqIHZhbHVlKSB7CisgICAgcmV0dXJuIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GZWF0dXJlX1BhcnNlKG5hbWUsIHZhbHVlKTsKKyAgfQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga0ZpbGVGaWVsZE51bWJlciA9IDE1LAorICAgIGtFcnJvckZpZWxkTnVtYmVyID0gMSwKKyAgICBrU3VwcG9ydGVkRmVhdHVyZXNGaWVsZE51bWJlciA9IDIsCisgIH07CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUgZmlsZSA9IDE1OworICBpbnQgZmlsZV9zaXplKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGludCBfaW50ZXJuYWxfZmlsZV9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9maWxlKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIG11dGFibGVfZmlsZShpbnQgaW5kZXgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSA+KgorICAgICAgbXV0YWJsZV9maWxlKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIF9pbnRlcm5hbF9maWxlKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIF9pbnRlcm5hbF9hZGRfZmlsZSgpOworICBwdWJsaWM6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZpbGUoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogYWRkX2ZpbGUoKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgPiYKKyAgICAgIGZpbGUoKSBjb25zdDsKKworICAvLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAxOworICBib29sIGhhc19lcnJvcigpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfZXJyb3IoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2Vycm9yKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcigpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X2Vycm9yKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfZXJyb3IoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX2Vycm9yKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9lcnJvcihzdGQ6OnN0cmluZyogZXJyb3IpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX2Vycm9yKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9lcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfZXJyb3IoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIHVpbnQ2NCBzdXBwb3J0ZWRfZmVhdHVyZXMgPSAyOworICBib29sIGhhc19zdXBwb3J0ZWRfZmVhdHVyZXMoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX3N1cHBvcnRlZF9mZWF0dXJlcygpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfc3VwcG9ydGVkX2ZlYXR1cmVzKCk7CisgIHVpbnQ2NF90IHN1cHBvcnRlZF9mZWF0dXJlcygpIGNvbnN0OworICB2b2lkIHNldF9zdXBwb3J0ZWRfZmVhdHVyZXModWludDY0X3QgdmFsdWUpOworICBwcml2YXRlOgorICB1aW50NjRfdCBfaW50ZXJuYWxfc3VwcG9ydGVkX2ZlYXR1cmVzKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9zdXBwb3J0ZWRfZmVhdHVyZXModWludDY0X3QgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6SGFzQml0czwxPiBfaGFzX2JpdHNfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgPiBmaWxlXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIGVycm9yXzsKKyAgICB1aW50NjRfdCBzdXBwb3J0ZWRfZmVhdHVyZXNfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bzsKK307CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzdHJpY3QtYWxpYXNpbmciCisjZW5kaWYgIC8vIF9fR05VQ19fCisvLyBWZXJzaW9uCisKKy8vIG9wdGlvbmFsIGludDMyIG1ham9yID0gMTsKK2lubGluZSBib29sIFZlcnNpb246Ol9pbnRlcm5hbF9oYXNfbWFqb3IoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgVmVyc2lvbjo6aGFzX21ham9yKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19tYWpvcigpOworfQoraW5saW5lIHZvaWQgVmVyc2lvbjo6Y2xlYXJfbWFqb3IoKSB7CisgIF9pbXBsXy5tYWpvcl8gPSAwOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgaW50MzJfdCBWZXJzaW9uOjpfaW50ZXJuYWxfbWFqb3IoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubWFqb3JfOworfQoraW5saW5lIGludDMyX3QgVmVyc2lvbjo6bWFqb3IoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24ubWFqb3IpCisgIHJldHVybiBfaW50ZXJuYWxfbWFqb3IoKTsKK30KK2lubGluZSB2b2lkIFZlcnNpb246Ol9pbnRlcm5hbF9zZXRfbWFqb3IoaW50MzJfdCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgX2ltcGxfLm1ham9yXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgVmVyc2lvbjo6c2V0X21ham9yKGludDMyX3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9tYWpvcih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24ubWFqb3IpCit9CisKKy8vIG9wdGlvbmFsIGludDMyIG1pbm9yID0gMjsKK2lubGluZSBib29sIFZlcnNpb246Ol9pbnRlcm5hbF9oYXNfbWlub3IoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgVmVyc2lvbjo6aGFzX21pbm9yKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19taW5vcigpOworfQoraW5saW5lIHZvaWQgVmVyc2lvbjo6Y2xlYXJfbWlub3IoKSB7CisgIF9pbXBsXy5taW5vcl8gPSAwOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgaW50MzJfdCBWZXJzaW9uOjpfaW50ZXJuYWxfbWlub3IoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubWlub3JfOworfQoraW5saW5lIGludDMyX3QgVmVyc2lvbjo6bWlub3IoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24ubWlub3IpCisgIHJldHVybiBfaW50ZXJuYWxfbWlub3IoKTsKK30KK2lubGluZSB2b2lkIFZlcnNpb246Ol9pbnRlcm5hbF9zZXRfbWlub3IoaW50MzJfdCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKKyAgX2ltcGxfLm1pbm9yXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgVmVyc2lvbjo6c2V0X21pbm9yKGludDMyX3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9taW5vcih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24ubWlub3IpCit9CisKKy8vIG9wdGlvbmFsIGludDMyIHBhdGNoID0gMzsKK2lubGluZSBib29sIFZlcnNpb246Ol9pbnRlcm5hbF9oYXNfcGF0Y2goKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgVmVyc2lvbjo6aGFzX3BhdGNoKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19wYXRjaCgpOworfQoraW5saW5lIHZvaWQgVmVyc2lvbjo6Y2xlYXJfcGF0Y2goKSB7CisgIF9pbXBsXy5wYXRjaF8gPSAwOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Cit9CitpbmxpbmUgaW50MzJfdCBWZXJzaW9uOjpfaW50ZXJuYWxfcGF0Y2goKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ucGF0Y2hfOworfQoraW5saW5lIGludDMyX3QgVmVyc2lvbjo6cGF0Y2goKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24ucGF0Y2gpCisgIHJldHVybiBfaW50ZXJuYWxfcGF0Y2goKTsKK30KK2lubGluZSB2b2lkIFZlcnNpb246Ol9pbnRlcm5hbF9zZXRfcGF0Y2goaW50MzJfdCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKKyAgX2ltcGxfLnBhdGNoXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgVmVyc2lvbjo6c2V0X3BhdGNoKGludDMyX3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9wYXRjaCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24ucGF0Y2gpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBzdWZmaXggPSA0OworaW5saW5lIGJvb2wgVmVyc2lvbjo6X2ludGVybmFsX2hhc19zdWZmaXgoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgVmVyc2lvbjo6aGFzX3N1ZmZpeCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfc3VmZml4KCk7Cit9CitpbmxpbmUgdm9pZCBWZXJzaW9uOjpjbGVhcl9zdWZmaXgoKSB7CisgIF9pbXBsXy5zdWZmaXhfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIFZlcnNpb246OnN1ZmZpeCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuVmVyc2lvbi5zdWZmaXgpCisgIHJldHVybiBfaW50ZXJuYWxfc3VmZml4KCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBWZXJzaW9uOjpzZXRfc3VmZml4KEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7CisgX2ltcGxfLnN1ZmZpeF8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5WZXJzaW9uLnN1ZmZpeCkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogVmVyc2lvbjo6bXV0YWJsZV9zdWZmaXgoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX3N1ZmZpeCgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuVmVyc2lvbi5zdWZmaXgpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgVmVyc2lvbjo6X2ludGVybmFsX3N1ZmZpeCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5zdWZmaXhfLkdldCgpOworfQoraW5saW5lIHZvaWQgVmVyc2lvbjo6X2ludGVybmFsX3NldF9zdWZmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICBfaW1wbF8uc3VmZml4Xy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogVmVyc2lvbjo6X2ludGVybmFsX211dGFibGVfc3VmZml4KCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgcmV0dXJuIF9pbXBsXy5zdWZmaXhfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBWZXJzaW9uOjpyZWxlYXNlX3N1ZmZpeCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24uc3VmZml4KQorICBpZiAoIV9pbnRlcm5hbF9oYXNfc3VmZml4KCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIGF1dG8qIHAgPSBfaW1wbF8uc3VmZml4Xy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnN1ZmZpeF8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uc3VmZml4Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBWZXJzaW9uOjpzZXRfYWxsb2NhdGVkX3N1ZmZpeChzdGQ6OnN0cmluZyogc3VmZml4KSB7CisgIGlmIChzdWZmaXggIT0gbnVsbHB0cikgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKKyAgfQorICBfaW1wbF8uc3VmZml4Xy5TZXRBbGxvY2F0ZWQoc3VmZml4LCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnN1ZmZpeF8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uc3VmZml4Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24uc3VmZml4KQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIENvZGVHZW5lcmF0b3JSZXF1ZXN0CisKKy8vIHJlcGVhdGVkIHN0cmluZyBmaWxlX3RvX2dlbmVyYXRlID0gMTsKK2lubGluZSBpbnQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ol9pbnRlcm5hbF9maWxlX3RvX2dlbmVyYXRlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZmlsZV90b19nZW5lcmF0ZV8uc2l6ZSgpOworfQoraW5saW5lIGludCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZmlsZV90b19nZW5lcmF0ZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2ZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmNsZWFyX2ZpbGVfdG9fZ2VuZXJhdGUoKSB7CisgIF9pbXBsXy5maWxlX3RvX2dlbmVyYXRlXy5DbGVhcigpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX2ZpbGVfdG9fZ2VuZXJhdGUoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9hZGRfZmlsZV90b19nZW5lcmF0ZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ol9pbnRlcm5hbF9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmZpbGVfdG9fZ2VuZXJhdGVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpmaWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQorICByZXR1cm4gX2ludGVybmFsX2ZpbGVfdG9fZ2VuZXJhdGUoaW5kZXgpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6bXV0YWJsZV9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKKyAgcmV0dXJuIF9pbXBsXy5maWxlX3RvX2dlbmVyYXRlXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uZmlsZV90b19nZW5lcmF0ZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4LCBzdGQ6OnN0cmluZyYmIHZhbHVlKSB7CisgIF9pbXBsXy5maWxlX3RvX2dlbmVyYXRlXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHN0ZDo6bW92ZSh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQorfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgR09PR0xFX0RDSEVDSyh2YWx1ZSAhPSBudWxscHRyKTsKKyAgX2ltcGxfLmZpbGVfdG9fZ2VuZXJhdGVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgX2ltcGxfLmZpbGVfdG9fZ2VuZXJhdGVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24oCisgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6X2ludGVybmFsX2FkZF9maWxlX3RvX2dlbmVyYXRlKCkgeworICByZXR1cm4gX2ltcGxfLmZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uZmlsZV90b19nZW5lcmF0ZV8uQWRkKCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX2ZpbGVfdG9fZ2VuZXJhdGUoc3RkOjpzdHJpbmcmJiB2YWx1ZSkgeworICBfaW1wbF8uZmlsZV90b19nZW5lcmF0ZV8uQWRkKHN0ZDo6bW92ZSh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQorfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0sodmFsdWUgIT0gbnVsbHB0cik7CisgIF9pbXBsXy5maWxlX3RvX2dlbmVyYXRlXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQorfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBfaW1wbF8uZmlsZV90b19nZW5lcmF0ZV8uQWRkKCktPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+JgorQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmZpbGVfdG9fZ2VuZXJhdGUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQorICByZXR1cm4gX2ltcGxfLmZpbGVfdG9fZ2VuZXJhdGVfOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPioKK0NvZGVHZW5lcmF0b3JSZXF1ZXN0OjptdXRhYmxlX2ZpbGVfdG9fZ2VuZXJhdGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCisgIHJldHVybiAmX2ltcGxfLmZpbGVfdG9fZ2VuZXJhdGVfOworfQorCisvLyBvcHRpb25hbCBzdHJpbmcgcGFyYW1ldGVyID0gMjsKK2lubGluZSBib29sIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpfaW50ZXJuYWxfaGFzX3BhcmFtZXRlcigpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6aGFzX3BhcmFtZXRlcigpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfcGFyYW1ldGVyKCk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Y2xlYXJfcGFyYW1ldGVyKCkgeworICBfaW1wbF8ucGFyYW1ldGVyXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6cGFyYW1ldGVyKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wYXJhbWV0ZXIpCisgIHJldHVybiBfaW50ZXJuYWxfcGFyYW1ldGVyKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X3BhcmFtZXRlcihBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworIF9pbXBsXy5wYXJhbWV0ZXJfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6bXV0YWJsZV9wYXJhbWV0ZXIoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX3BhcmFtZXRlcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpfaW50ZXJuYWxfcGFyYW1ldGVyKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnBhcmFtZXRlcl8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6X2ludGVybmFsX3NldF9wYXJhbWV0ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICBfaW1wbF8ucGFyYW1ldGVyXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ol9pbnRlcm5hbF9tdXRhYmxlX3BhcmFtZXRlcigpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7CisgIHJldHVybiBfaW1wbF8ucGFyYW1ldGVyXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnJlbGVhc2VfcGFyYW1ldGVyKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyKQorICBpZiAoIV9pbnRlcm5hbF9oYXNfcGFyYW1ldGVyKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIGF1dG8qIHAgPSBfaW1wbF8ucGFyYW1ldGVyXy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnBhcmFtZXRlcl8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ucGFyYW1ldGVyXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X2FsbG9jYXRlZF9wYXJhbWV0ZXIoc3RkOjpzdHJpbmcqIHBhcmFtZXRlcikgeworICBpZiAocGFyYW1ldGVyICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIH0KKyAgX2ltcGxfLnBhcmFtZXRlcl8uU2V0QWxsb2NhdGVkKHBhcmFtZXRlciwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5wYXJhbWV0ZXJfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLnBhcmFtZXRlcl8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wYXJhbWV0ZXIpCit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7CitpbmxpbmUgaW50IENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpfaW50ZXJuYWxfcHJvdG9fZmlsZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnByb3RvX2ZpbGVfLnNpemUoKTsKK30KK2lubGluZSBpbnQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnByb3RvX2ZpbGVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9wcm90b19maWxlX3NpemUoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byogQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfcHJvdG9fZmlsZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnByb3RvX2ZpbGUpCisgIHJldHVybiBfaW1wbF8ucHJvdG9fZmlsZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvID4qCitDb2RlR2VuZXJhdG9yUmVxdWVzdDo6bXV0YWJsZV9wcm90b19maWxlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wcm90b19maWxlKQorICByZXR1cm4gJl9pbXBsXy5wcm90b19maWxlXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byYgQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ol9pbnRlcm5hbF9wcm90b19maWxlKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnByb3RvX2ZpbGVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yUHJvdG8mIENvZGVHZW5lcmF0b3JSZXF1ZXN0Ojpwcm90b19maWxlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wcm90b19maWxlKQorICByZXR1cm4gX2ludGVybmFsX3Byb3RvX2ZpbGUoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6X2ludGVybmFsX2FkZF9wcm90b19maWxlKCkgeworICByZXR1cm4gX2ltcGxfLnByb3RvX2ZpbGVfLkFkZCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX3Byb3RvX2ZpbGUoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvKiBfYWRkID0gX2ludGVybmFsX2FkZF9wcm90b19maWxlKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnByb3RvX2ZpbGUpCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byA+JgorQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnByb3RvX2ZpbGUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wcm90b19maWxlKQorICByZXR1cm4gX2ltcGxfLnByb3RvX2ZpbGVfOworfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLlZlcnNpb24gY29tcGlsZXJfdmVyc2lvbiA9IDM7CitpbmxpbmUgYm9vbCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6X2ludGVybmFsX2hhc19jb21waWxlcl92ZXJzaW9uKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7CisgIFBST1RPQlVGX0FTU1VNRSghdmFsdWUgfHwgX2ltcGxfLmNvbXBpbGVyX3ZlcnNpb25fICE9IG51bGxwdHIpOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6aGFzX2NvbXBpbGVyX3ZlcnNpb24oKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2NvbXBpbGVyX3ZlcnNpb24oKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpjbGVhcl9jb21waWxlcl92ZXJzaW9uKCkgeworICBpZiAoX2ltcGxfLmNvbXBpbGVyX3ZlcnNpb25fICE9IG51bGxwdHIpIF9pbXBsXy5jb21waWxlcl92ZXJzaW9uXy0+Q2xlYXIoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbiYgQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ol9pbnRlcm5hbF9jb21waWxlcl92ZXJzaW9uKCkgY29uc3QgeworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24qIHAgPSBfaW1wbF8uY29tcGlsZXJfdmVyc2lvbl87CisgIHJldHVybiBwICE9IG51bGxwdHIgPyAqcCA6IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpWZXJzaW9uJj4oCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6Ol9WZXJzaW9uX2RlZmF1bHRfaW5zdGFuY2VfKTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24mIENvZGVHZW5lcmF0b3JSZXF1ZXN0Ojpjb21waWxlcl92ZXJzaW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5jb21waWxlcl92ZXJzaW9uKQorICByZXR1cm4gX2ludGVybmFsX2NvbXBpbGVyX3ZlcnNpb24oKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0Ojp1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF9jb21waWxlcl92ZXJzaW9uKAorICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbiogY29tcGlsZXJfdmVyc2lvbikgeworICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikgeworICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSo+KF9pbXBsXy5jb21waWxlcl92ZXJzaW9uXyk7CisgIH0KKyAgX2ltcGxfLmNvbXBpbGVyX3ZlcnNpb25fID0gY29tcGlsZXJfdmVyc2lvbjsKKyAgaWYgKGNvbXBpbGVyX3ZlcnNpb24pIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3Vuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5jb21waWxlcl92ZXJzaW9uKQorfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbiogQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnJlbGVhc2VfY29tcGlsZXJfdmVyc2lvbigpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24qIHRlbXAgPSBfaW1wbF8uY29tcGlsZXJfdmVyc2lvbl87CisgIF9pbXBsXy5jb21waWxlcl92ZXJzaW9uXyA9IG51bGxwdHI7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGF1dG8qIG9sZCA9ICByZWludGVycHJldF9jYXN0PDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSo+KHRlbXApOworICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7IGRlbGV0ZSBvbGQ7IH0KKyNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpICE9IG51bGxwdHIpIHsKKyAgICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIH0KKyNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICByZXR1cm4gdGVtcDsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24qIENvZGVHZW5lcmF0b3JSZXF1ZXN0Ojp1bnNhZmVfYXJlbmFfcmVsZWFzZV9jb21waWxlcl92ZXJzaW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuY29tcGlsZXJfdmVyc2lvbikKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24qIHRlbXAgPSBfaW1wbF8uY29tcGlsZXJfdmVyc2lvbl87CisgIF9pbXBsXy5jb21waWxlcl92ZXJzaW9uXyA9IG51bGxwdHI7CisgIHJldHVybiB0ZW1wOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbiogQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ol9pbnRlcm5hbF9tdXRhYmxlX2NvbXBpbGVyX3ZlcnNpb24oKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworICBpZiAoX2ltcGxfLmNvbXBpbGVyX3ZlcnNpb25fID09IG51bGxwdHIpIHsKKyAgICBhdXRvKiBwID0gQ3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbj4oR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAgIF9pbXBsXy5jb21waWxlcl92ZXJzaW9uXyA9IHA7CisgIH0KKyAgcmV0dXJuIF9pbXBsXy5jb21waWxlcl92ZXJzaW9uXzsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24qIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjptdXRhYmxlX2NvbXBpbGVyX3ZlcnNpb24oKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6VmVyc2lvbiogX21zZyA9IF9pbnRlcm5hbF9tdXRhYmxlX2NvbXBpbGVyX3ZlcnNpb24oKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmNvbXBpbGVyX3ZlcnNpb24pCisgIHJldHVybiBfbXNnOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9hbGxvY2F0ZWRfY29tcGlsZXJfdmVyc2lvbig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OlZlcnNpb24qIGNvbXBpbGVyX3ZlcnNpb24pIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBtZXNzYWdlX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGlmIChtZXNzYWdlX2FyZW5hID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgX2ltcGxfLmNvbXBpbGVyX3ZlcnNpb25fOworICB9CisgIGlmIChjb21waWxlcl92ZXJzaW9uKSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBzdWJtZXNzYWdlX2FyZW5hID0KKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEdldE93bmluZ0FyZW5hKGNvbXBpbGVyX3ZlcnNpb24pOworICAgIGlmIChtZXNzYWdlX2FyZW5hICE9IHN1Ym1lc3NhZ2VfYXJlbmEpIHsKKyAgICAgIGNvbXBpbGVyX3ZlcnNpb24gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdldE93bmVkTWVzc2FnZSgKKyAgICAgICAgICBtZXNzYWdlX2FyZW5hLCBjb21waWxlcl92ZXJzaW9uLCBzdWJtZXNzYWdlX2FyZW5hKTsKKyAgICB9CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICB9CisgIF9pbXBsXy5jb21waWxlcl92ZXJzaW9uXyA9IGNvbXBpbGVyX3ZlcnNpb247CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5jb21waWxlcl92ZXJzaW9uKQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlCisKKy8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKK2lubGluZSBib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpfaW50ZXJuYWxfaGFzX25hbWUoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19uYW1lKCk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y2xlYXJfbmFtZSgpIHsKKyAgX2ltcGxfLm5hbWVfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5uYW1lKQorICByZXR1cm4gX2ludGVybmFsX25hbWUoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCwgdHlwZW5hbWUuLi4gQXJnVD4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworIF9pbXBsXy5uYW1lXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjptdXRhYmxlX25hbWUoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Ol9pbnRlcm5hbF9uYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm5hbWVfLkdldCgpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Ol9pbnRlcm5hbF9zZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7CisgIF9pbXBsXy5uYW1lXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Ol9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICByZXR1cm4gX2ltcGxfLm5hbWVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6cmVsZWFzZV9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUubmFtZSkKKyAgaWYgKCFfaW50ZXJuYWxfaGFzX25hbWUoKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKKyAgYXV0byogcCA9IF9pbXBsXy5uYW1lXy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLm5hbWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICByZXR1cm4gcDsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfYWxsb2NhdGVkX25hbWUoc3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWUgIT0gbnVsbHB0cikgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKKyAgfQorICBfaW1wbF8ubmFtZV8uU2V0QWxsb2NhdGVkKG5hbWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ubmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5uYW1lKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50ID0gMjsKK2lubGluZSBib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpfaW50ZXJuYWxfaGFzX2luc2VydGlvbl9wb2ludCgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6aGFzX2luc2VydGlvbl9wb2ludCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y2xlYXJfaW5zZXJ0aW9uX3BvaW50KCkgeworICBfaW1wbF8uaW5zZXJ0aW9uX3BvaW50Xy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6aW5zZXJ0aW9uX3BvaW50KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCisgIHJldHVybiBfaW50ZXJuYWxfaW5zZXJ0aW9uX3BvaW50KCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2luc2VydGlvbl9wb2ludChBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworIF9pbXBsXy5pbnNlcnRpb25fcG9pbnRfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuaW5zZXJ0aW9uX3BvaW50KQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6bXV0YWJsZV9pbnNlcnRpb25fcG9pbnQoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX2luc2VydGlvbl9wb2ludCgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuaW5zZXJ0aW9uX3BvaW50KQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpfaW50ZXJuYWxfaW5zZXJ0aW9uX3BvaW50KCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmluc2VydGlvbl9wb2ludF8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6X2ludGVybmFsX3NldF9pbnNlcnRpb25fcG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworICBfaW1wbF8uaW5zZXJ0aW9uX3BvaW50Xy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Ol9pbnRlcm5hbF9tdXRhYmxlX2luc2VydGlvbl9wb2ludCgpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIHJldHVybiBfaW1wbF8uaW5zZXJ0aW9uX3BvaW50Xy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnJlbGVhc2VfaW5zZXJ0aW9uX3BvaW50KCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuaW5zZXJ0aW9uX3BvaW50KQorICBpZiAoIV9pbnRlcm5hbF9oYXNfaW5zZXJ0aW9uX3BvaW50KCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CisgIGF1dG8qIHAgPSBfaW1wbF8uaW5zZXJ0aW9uX3BvaW50Xy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLmluc2VydGlvbl9wb2ludF8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uaW5zZXJ0aW9uX3BvaW50Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2FsbG9jYXRlZF9pbnNlcnRpb25fcG9pbnQoc3RkOjpzdHJpbmcqIGluc2VydGlvbl9wb2ludCkgeworICBpZiAoaW5zZXJ0aW9uX3BvaW50ICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CisgIH0KKyAgX2ltcGxfLmluc2VydGlvbl9wb2ludF8uU2V0QWxsb2NhdGVkKGluc2VydGlvbl9wb2ludCwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5pbnNlcnRpb25fcG9pbnRfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLmluc2VydGlvbl9wb2ludF8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7CitpbmxpbmUgYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6X2ludGVybmFsX2hhc19jb250ZW50KCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpoYXNfY29udGVudCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfY29udGVudCgpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmNsZWFyX2NvbnRlbnQoKSB7CisgIF9pbXBsXy5jb250ZW50Xy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y29udGVudCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuY29udGVudCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9jb250ZW50KCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2NvbnRlbnQoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKKyBfaW1wbF8uY29udGVudF8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5jb250ZW50KQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6bXV0YWJsZV9jb250ZW50KCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9jb250ZW50KCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5jb250ZW50KQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpfaW50ZXJuYWxfY29udGVudCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5jb250ZW50Xy5HZXQoKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpfaW50ZXJuYWxfc2V0X2NvbnRlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworICBfaW1wbF8uY29udGVudF8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpfaW50ZXJuYWxfbXV0YWJsZV9jb250ZW50KCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKKyAgcmV0dXJuIF9pbXBsXy5jb250ZW50Xy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnJlbGVhc2VfY29udGVudCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmNvbnRlbnQpCisgIGlmICghX2ludGVybmFsX2hhc19jb250ZW50KCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7CisgIGF1dG8qIHAgPSBfaW1wbF8uY29udGVudF8uUmVsZWFzZSgpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5jb250ZW50Xy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5jb250ZW50Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2FsbG9jYXRlZF9jb250ZW50KHN0ZDo6c3RyaW5nKiBjb250ZW50KSB7CisgIGlmIChjb250ZW50ICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7CisgIH0KKyAgX2ltcGxfLmNvbnRlbnRfLlNldEFsbG9jYXRlZChjb250ZW50LCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLmNvbnRlbnRfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLmNvbnRlbnRfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuY29udGVudCkKK30KKworLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbyBnZW5lcmF0ZWRfY29kZV9pbmZvID0gMTY7CitpbmxpbmUgYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6X2ludGVybmFsX2hhc19nZW5lcmF0ZWRfY29kZV9pbmZvKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7CisgIFBST1RPQlVGX0FTU1VNRSghdmFsdWUgfHwgX2ltcGxfLmdlbmVyYXRlZF9jb2RlX2luZm9fICE9IG51bGxwdHIpOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6aGFzX2dlbmVyYXRlZF9jb2RlX2luZm8oKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2dlbmVyYXRlZF9jb2RlX2luZm8oKTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm8mIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpfaW50ZXJuYWxfZ2VuZXJhdGVkX2NvZGVfaW5mbygpIGNvbnN0IHsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvKiBwID0gX2ltcGxfLmdlbmVyYXRlZF9jb2RlX2luZm9fOworICByZXR1cm4gcCAhPSBudWxscHRyID8gKnAgOiByZWludGVycHJldF9jYXN0PGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpHZW5lcmF0ZWRDb2RlSW5mbyY+KAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9HZW5lcmF0ZWRDb2RlSW5mb19kZWZhdWx0X2luc3RhbmNlXyk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Z2VuZXJhdGVkX2NvZGVfaW5mbygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuZ2VuZXJhdGVkX2NvZGVfaW5mbykKKyAgcmV0dXJuIF9pbnRlcm5hbF9nZW5lcmF0ZWRfY29kZV9pbmZvKCk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6dW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfZ2VuZXJhdGVkX2NvZGVfaW5mbygKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm8qIGdlbmVyYXRlZF9jb2RlX2luZm8pIHsKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPihfaW1wbF8uZ2VuZXJhdGVkX2NvZGVfaW5mb18pOworICB9CisgIF9pbXBsXy5nZW5lcmF0ZWRfY29kZV9pbmZvXyA9IGdlbmVyYXRlZF9jb2RlX2luZm87CisgIGlmIChnZW5lcmF0ZWRfY29kZV9pbmZvKSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuZ2VuZXJhdGVkX2NvZGVfaW5mbykKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm8qIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpyZWxlYXNlX2dlbmVyYXRlZF9jb2RlX2luZm8oKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvKiB0ZW1wID0gX2ltcGxfLmdlbmVyYXRlZF9jb2RlX2luZm9fOworICBfaW1wbF8uZ2VuZXJhdGVkX2NvZGVfaW5mb18gPSBudWxscHRyOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICBhdXRvKiBvbGQgPSAgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPih0ZW1wKTsKKyAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikgeyBkZWxldGUgb2xkOyB9CisjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSAhPSBudWxscHRyKSB7CisgICAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICB9CisjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgcmV0dXJuIHRlbXA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6dW5zYWZlX2FyZW5hX3JlbGVhc2VfZ2VuZXJhdGVkX2NvZGVfaW5mbygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmdlbmVyYXRlZF9jb2RlX2luZm8pCisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvKiB0ZW1wID0gX2ltcGxfLmdlbmVyYXRlZF9jb2RlX2luZm9fOworICBfaW1wbF8uZ2VuZXJhdGVkX2NvZGVfaW5mb18gPSBudWxscHRyOworICByZXR1cm4gdGVtcDsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm8qIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpfaW50ZXJuYWxfbXV0YWJsZV9nZW5lcmF0ZWRfY29kZV9pbmZvKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKKyAgaWYgKF9pbXBsXy5nZW5lcmF0ZWRfY29kZV9pbmZvXyA9PSBudWxscHRyKSB7CisgICAgYXV0byogcCA9IENyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm8+KEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgICBfaW1wbF8uZ2VuZXJhdGVkX2NvZGVfaW5mb18gPSBwOworICB9CisgIHJldHVybiBfaW1wbF8uZ2VuZXJhdGVkX2NvZGVfaW5mb187Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6bXV0YWJsZV9nZW5lcmF0ZWRfY29kZV9pbmZvKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm8qIF9tc2cgPSBfaW50ZXJuYWxfbXV0YWJsZV9nZW5lcmF0ZWRfY29kZV9pbmZvKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5nZW5lcmF0ZWRfY29kZV9pbmZvKQorICByZXR1cm4gX21zZzsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfYWxsb2NhdGVkX2dlbmVyYXRlZF9jb2RlX2luZm8oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvKiBnZW5lcmF0ZWRfY29kZV9pbmZvKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogbWVzc2FnZV9hcmVuYSA9IEdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBpZiAobWVzc2FnZV9hcmVuYSA9PSBudWxscHRyKSB7CisgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSo+KF9pbXBsXy5nZW5lcmF0ZWRfY29kZV9pbmZvXyk7CisgIH0KKyAgaWYgKGdlbmVyYXRlZF9jb2RlX2luZm8pIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIHN1Ym1lc3NhZ2VfYXJlbmEgPQorICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPihnZW5lcmF0ZWRfY29kZV9pbmZvKSk7CisgICAgaWYgKG1lc3NhZ2VfYXJlbmEgIT0gc3VibWVzc2FnZV9hcmVuYSkgeworICAgICAgZ2VuZXJhdGVkX2NvZGVfaW5mbyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2V0T3duZWRNZXNzYWdlKAorICAgICAgICAgIG1lc3NhZ2VfYXJlbmEsIGdlbmVyYXRlZF9jb2RlX2luZm8sIHN1Ym1lc3NhZ2VfYXJlbmEpOworICAgIH0KKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7CisgIH0KKyAgX2ltcGxfLmdlbmVyYXRlZF9jb2RlX2luZm9fID0gZ2VuZXJhdGVkX2NvZGVfaW5mbzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmdlbmVyYXRlZF9jb2RlX2luZm8pCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQ29kZUdlbmVyYXRvclJlc3BvbnNlCisKKy8vIG9wdGlvbmFsIHN0cmluZyBlcnJvciA9IDE7CitpbmxpbmUgYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Ol9pbnRlcm5hbF9oYXNfZXJyb3IoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpoYXNfZXJyb3IoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2Vycm9yKCk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmNsZWFyX2Vycm9yKCkgeworICBfaW1wbF8uZXJyb3JfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZXJyb3IoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5lcnJvcikKKyAgcmV0dXJuIF9pbnRlcm5hbF9lcnJvcigpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpzZXRfZXJyb3IoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyBfaW1wbF8uZXJyb3JfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Om11dGFibGVfZXJyb3IoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX2Vycm9yKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZXJyb3IpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpfaW50ZXJuYWxfZXJyb3IoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZXJyb3JfLkdldCgpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpfaW50ZXJuYWxfc2V0X2Vycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgX2ltcGxfLmVycm9yXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpfaW50ZXJuYWxfbXV0YWJsZV9lcnJvcigpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7CisgIHJldHVybiBfaW1wbF8uZXJyb3JfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OnJlbGVhc2VfZXJyb3IoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZXJyb3IpCisgIGlmICghX2ludGVybmFsX2hhc19lcnJvcigpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworICBhdXRvKiBwID0gX2ltcGxfLmVycm9yXy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLmVycm9yXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5lcnJvcl8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIHJldHVybiBwOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpzZXRfYWxsb2NhdGVkX2Vycm9yKHN0ZDo6c3RyaW5nKiBlcnJvcikgeworICBpZiAoZXJyb3IgIT0gbnVsbHB0cikgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKKyAgfQorICBfaW1wbF8uZXJyb3JfLlNldEFsbG9jYXRlZChlcnJvciwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5lcnJvcl8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uZXJyb3JfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yKQorfQorCisvLyBvcHRpb25hbCB1aW50NjQgc3VwcG9ydGVkX2ZlYXR1cmVzID0gMjsKK2lubGluZSBib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6X2ludGVybmFsX2hhc19zdXBwb3J0ZWRfZmVhdHVyZXMoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpoYXNfc3VwcG9ydGVkX2ZlYXR1cmVzKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19zdXBwb3J0ZWRfZmVhdHVyZXMoKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Y2xlYXJfc3VwcG9ydGVkX2ZlYXR1cmVzKCkgeworICBfaW1wbF8uc3VwcG9ydGVkX2ZlYXR1cmVzXyA9IHVpbnQ2NF90ezB1fTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIHVpbnQ2NF90IENvZGVHZW5lcmF0b3JSZXNwb25zZTo6X2ludGVybmFsX3N1cHBvcnRlZF9mZWF0dXJlcygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5zdXBwb3J0ZWRfZmVhdHVyZXNfOworfQoraW5saW5lIHVpbnQ2NF90IENvZGVHZW5lcmF0b3JSZXNwb25zZTo6c3VwcG9ydGVkX2ZlYXR1cmVzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2Uuc3VwcG9ydGVkX2ZlYXR1cmVzKQorICByZXR1cm4gX2ludGVybmFsX3N1cHBvcnRlZF9mZWF0dXJlcygpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpfaW50ZXJuYWxfc2V0X3N1cHBvcnRlZF9mZWF0dXJlcyh1aW50NjRfdCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgX2ltcGxfLnN1cHBvcnRlZF9mZWF0dXJlc18gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6c2V0X3N1cHBvcnRlZF9mZWF0dXJlcyh1aW50NjRfdCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X3N1cHBvcnRlZF9mZWF0dXJlcyh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5zdXBwb3J0ZWRfZmVhdHVyZXMpCit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUgZmlsZSA9IDE1OworaW5saW5lIGludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Ol9pbnRlcm5hbF9maWxlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZmlsZV8uc2l6ZSgpOworfQoraW5saW5lIGludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmZpbGVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9maWxlX3NpemUoKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Y2xlYXJfZmlsZSgpIHsKKyAgX2ltcGxfLmZpbGVfLkNsZWFyKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjptdXRhYmxlX2ZpbGUoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZmlsZSkKKyAgcmV0dXJuIF9pbXBsXy5maWxlXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSA+KgorQ29kZUdlbmVyYXRvclJlc3BvbnNlOjptdXRhYmxlX2ZpbGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5maWxlKQorICByZXR1cm4gJl9pbXBsXy5maWxlXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Ol9pbnRlcm5hbF9maWxlKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmZpbGVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpmaWxlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZmlsZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9maWxlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Ol9pbnRlcm5hbF9hZGRfZmlsZSgpIHsKKyAgcmV0dXJuIF9pbXBsXy5maWxlXy5BZGQoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmFkZF9maWxlKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBfYWRkID0gX2ludGVybmFsX2FkZF9maWxlKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5maWxlKQorICByZXR1cm4gX2FkZDsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSA+JgorQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpmaWxlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmZpbGUpCisgIHJldHVybiBfaW1wbF8uZmlsZV87Cit9CisKKyNpZmRlZiBfX0dOVUNfXworICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorI2VuZGlmICAvLyBfX0dOVUNfXworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNfcHJvdG9fZW51bTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZT4gOiA6OnN0ZDo6dHJ1ZV90eXBlIHt9OwordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3I8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZlYXR1cmU+KCkgeworICByZXR1cm4gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmVhdHVyZV9kZXNjcmlwdG9yKCk7Cit9CisKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjQyYWFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8KQEAgLTAsMCArMSwxODMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLworLy8gV0FSTklORzogIFRoZSBwbHVnaW4gaW50ZXJmYWNlIGlzIGN1cnJlbnRseSBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8KKy8vICAgY2hhbmdlLgorLy8KKy8vIHByb3RvYyAoYWthIHRoZSBQcm90b2NvbCBDb21waWxlcikgY2FuIGJlIGV4dGVuZGVkIHZpYSBwbHVnaW5zLiAgQSBwbHVnaW4gaXMKKy8vIGp1c3QgYSBwcm9ncmFtIHRoYXQgcmVhZHMgYSBDb2RlR2VuZXJhdG9yUmVxdWVzdCBmcm9tIHN0ZGluIGFuZCB3cml0ZXMgYQorLy8gQ29kZUdlbmVyYXRvclJlc3BvbnNlIHRvIHN0ZG91dC4KKy8vCisvLyBQbHVnaW5zIHdyaXR0ZW4gdXNpbmcgQysrIGNhbiB1c2UgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oIGluc3RlYWQKKy8vIG9mIGRlYWxpbmcgd2l0aCB0aGUgcmF3IHByb3RvY29sIGRlZmluZWQgaGVyZS4KKy8vCisvLyBBIHBsdWdpbiBleGVjdXRhYmxlIG5lZWRzIG9ubHkgdG8gYmUgcGxhY2VkIHNvbWV3aGVyZSBpbiB0aGUgcGF0aC4gIFRoZQorLy8gcGx1Z2luIHNob3VsZCBiZSBuYW1lZCAicHJvdG9jLWdlbi0kTkFNRSIsIGFuZCB3aWxsIHRoZW4gYmUgdXNlZCB3aGVuIHRoZQorLy8gZmxhZyAiLS0ke05BTUV9X291dCIgaXMgcGFzc2VkIHRvIHByb3RvYy4KKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJQbHVnaW5Qcm90b3MiOworCitvcHRpb24gZ29fcGFja2FnZSA9ICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9wbHVnaW5wYiI7CisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iOworCisvLyBUaGUgdmVyc2lvbiBudW1iZXIgb2YgcHJvdG9jb2wgY29tcGlsZXIuCittZXNzYWdlIFZlcnNpb24geworICBvcHRpb25hbCBpbnQzMiBtYWpvciA9IDE7CisgIG9wdGlvbmFsIGludDMyIG1pbm9yID0gMjsKKyAgb3B0aW9uYWwgaW50MzIgcGF0Y2ggPSAzOworICAvLyBBIHN1ZmZpeCBmb3IgYWxwaGEsIGJldGEgb3IgcmMgcmVsZWFzZSwgZS5nLiwgImFscGhhLTEiLCAicmMyIi4gSXQgc2hvdWxkCisgIC8vIGJlIGVtcHR5IGZvciBtYWlubGluZSBzdGFibGUgcmVsZWFzZXMuCisgIG9wdGlvbmFsIHN0cmluZyBzdWZmaXggPSA0OworfQorCisvLyBBbiBlbmNvZGVkIENvZGVHZW5lcmF0b3JSZXF1ZXN0IGlzIHdyaXR0ZW4gdG8gdGhlIHBsdWdpbidzIHN0ZGluLgorbWVzc2FnZSBDb2RlR2VuZXJhdG9yUmVxdWVzdCB7CisgIC8vIFRoZSAucHJvdG8gZmlsZXMgdGhhdCB3ZXJlIGV4cGxpY2l0bHkgbGlzdGVkIG9uIHRoZSBjb21tYW5kLWxpbmUuICBUaGUKKyAgLy8gY29kZSBnZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIGNvZGUgb25seSBmb3IgdGhlc2UgZmlsZXMuICBFYWNoIGZpbGUncworICAvLyBkZXNjcmlwdG9yIHdpbGwgYmUgaW5jbHVkZWQgaW4gcHJvdG9fZmlsZSwgYmVsb3cuCisgIHJlcGVhdGVkIHN0cmluZyBmaWxlX3RvX2dlbmVyYXRlID0gMTsKKworICAvLyBUaGUgZ2VuZXJhdG9yIHBhcmFtZXRlciBwYXNzZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KKyAgb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7CisKKyAgLy8gRmlsZURlc2NyaXB0b3JQcm90b3MgZm9yIGFsbCBmaWxlcyBpbiBmaWxlc190b19nZW5lcmF0ZSBhbmQgZXZlcnl0aGluZworICAvLyB0aGV5IGltcG9ydC4gIFRoZSBmaWxlcyB3aWxsIGFwcGVhciBpbiB0b3BvbG9naWNhbCBvcmRlciwgc28gZWFjaCBmaWxlCisgIC8vIGFwcGVhcnMgYmVmb3JlIGFueSBmaWxlIHRoYXQgaW1wb3J0cyBpdC4KKyAgLy8KKyAgLy8gcHJvdG9jIGd1YXJhbnRlZXMgdGhhdCBhbGwgcHJvdG9fZmlsZXMgd2lsbCBiZSB3cml0dGVuIGFmdGVyCisgIC8vIHRoZSBmaWVsZHMgYWJvdmUsIGV2ZW4gdGhvdWdoIHRoaXMgaXMgbm90IHRlY2huaWNhbGx5IGd1YXJhbnRlZWQgYnkgdGhlCisgIC8vIHByb3RvYnVmIHdpcmUgZm9ybWF0LiAgVGhpcyB0aGVvcmV0aWNhbGx5IGNvdWxkIGFsbG93IGEgcGx1Z2luIHRvIHN0cmVhbQorICAvLyBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90b3MgYW5kIGhhbmRsZSB0aGVtIG9uZSBieSBvbmUgcmF0aGVyIHRoYW4gcmVhZAorICAvLyB0aGUgZW50aXJlIHNldCBpbnRvIG1lbW9yeSBhdCBvbmNlLiAgSG93ZXZlciwgYXMgb2YgdGhpcyB3cml0aW5nLCB0aGlzCisgIC8vIGlzIG5vdCBzaW1pbGFybHkgb3B0aW1pemVkIG9uIHByb3RvYydzIGVuZCAtLSBpdCB3aWxsIHN0b3JlIGFsbCBmaWVsZHMgaW4KKyAgLy8gbWVtb3J5IGF0IG9uY2UgYmVmb3JlIHNlbmRpbmcgdGhlbSB0byB0aGUgcGx1Z2luLgorICAvLworICAvLyBUeXBlIG5hbWVzIG9mIGZpZWxkcyBhbmQgZXh0ZW5zaW9ucyBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90byBhcmUgYWx3YXlzCisgIC8vIGZ1bGx5IHF1YWxpZmllZC4KKyAgcmVwZWF0ZWQgRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7CisKKyAgLy8gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHByb3RvY29sIGNvbXBpbGVyLgorICBvcHRpb25hbCBWZXJzaW9uIGNvbXBpbGVyX3ZlcnNpb24gPSAzOworCit9CisKKy8vIFRoZSBwbHVnaW4gd3JpdGVzIGFuIGVuY29kZWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlIHRvIHN0ZG91dC4KK21lc3NhZ2UgQ29kZUdlbmVyYXRvclJlc3BvbnNlIHsKKyAgLy8gRXJyb3IgbWVzc2FnZS4gIElmIG5vbi1lbXB0eSwgY29kZSBnZW5lcmF0aW9uIGZhaWxlZC4gIFRoZSBwbHVnaW4gcHJvY2VzcworICAvLyBzaG91bGQgZXhpdCB3aXRoIHN0YXR1cyBjb2RlIHplcm8gZXZlbiBpZiBpdCByZXBvcnRzIGFuIGVycm9yIGluIHRoaXMgd2F5LgorICAvLworICAvLyBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIGluZGljYXRlIGVycm9ycyBpbiAucHJvdG8gZmlsZXMgd2hpY2ggcHJldmVudCB0aGUKKyAgLy8gY29kZSBnZW5lcmF0b3IgZnJvbSBnZW5lcmF0aW5nIGNvcnJlY3QgY29kZS4gIEVycm9ycyB3aGljaCBpbmRpY2F0ZSBhCisgIC8vIHByb2JsZW0gaW4gcHJvdG9jIGl0c2VsZiAtLSBzdWNoIGFzIHRoZSBpbnB1dCBDb2RlR2VuZXJhdG9yUmVxdWVzdCBiZWluZworICAvLyB1bnBhcnNlYWJsZSAtLSBzaG91bGQgYmUgcmVwb3J0ZWQgYnkgd3JpdGluZyBhIG1lc3NhZ2UgdG8gc3RkZXJyIGFuZAorICAvLyBleGl0aW5nIHdpdGggYSBub24temVybyBzdGF0dXMgY29kZS4KKyAgb3B0aW9uYWwgc3RyaW5nIGVycm9yID0gMTsKKworICAvLyBBIGJpdG1hc2sgb2Ygc3VwcG9ydGVkIGZlYXR1cmVzIHRoYXQgdGhlIGNvZGUgZ2VuZXJhdG9yIHN1cHBvcnRzLgorICAvLyBUaGlzIGlzIGEgYml0d2lzZSAib3IiIG9mIHZhbHVlcyBmcm9tIHRoZSBGZWF0dXJlIGVudW0uCisgIG9wdGlvbmFsIHVpbnQ2NCBzdXBwb3J0ZWRfZmVhdHVyZXMgPSAyOworCisgIC8vIFN5bmMgd2l0aCBjb2RlX2dlbmVyYXRvci5oLgorICBlbnVtIEZlYXR1cmUgeworICAgIEZFQVRVUkVfTk9ORSA9IDA7CisgICAgRkVBVFVSRV9QUk9UTzNfT1BUSU9OQUwgPSAxOworICB9CisKKyAgLy8gUmVwcmVzZW50cyBhIHNpbmdsZSBnZW5lcmF0ZWQgZmlsZS4KKyAgbWVzc2FnZSBGaWxlIHsKKyAgICAvLyBUaGUgZmlsZSBuYW1lLCByZWxhdGl2ZSB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gIFRoZSBuYW1lIG11c3Qgbm90CisgICAgLy8gY29udGFpbiAiLiIgb3IgIi4uIiBjb21wb25lbnRzIGFuZCBtdXN0IGJlIHJlbGF0aXZlLCBub3QgYmUgYWJzb2x1dGUgKHNvLAorICAgIC8vIHRoZSBmaWxlIGNhbm5vdCBsaWUgb3V0c2lkZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSkuICAiLyIgbXVzdCBiZSB1c2VkIGFzCisgICAgLy8gdGhlIHBhdGggc2VwYXJhdG9yLCBub3QgIlwiLgorICAgIC8vCisgICAgLy8gSWYgdGhlIG5hbWUgaXMgb21pdHRlZCwgdGhlIGNvbnRlbnQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcHJldmlvdXMKKyAgICAvLyBmaWxlLiAgVGhpcyBhbGxvd3MgdGhlIGdlbmVyYXRvciB0byBicmVhayBsYXJnZSBmaWxlcyBpbnRvIHNtYWxsIGNodW5rcywKKyAgICAvLyBhbmQgYWxsb3dzIHRoZSBnZW5lcmF0ZWQgdGV4dCB0byBiZSBzdHJlYW1lZCBiYWNrIHRvIHByb3RvYyBzbyB0aGF0IGxhcmdlCisgICAgLy8gZmlsZXMgbmVlZCBub3QgcmVzaWRlIGNvbXBsZXRlbHkgaW4gbWVtb3J5IGF0IG9uZSB0aW1lLiAgTm90ZSB0aGF0IGFzIG9mCisgICAgLy8gdGhpcyB3cml0aW5nIHByb3RvYyBkb2VzIG5vdCBvcHRpbWl6ZSBmb3IgdGhpcyAtLSBpdCB3aWxsIHJlYWQgdGhlIGVudGlyZQorICAgIC8vIENvZGVHZW5lcmF0b3JSZXNwb25zZSBiZWZvcmUgd3JpdGluZyBmaWxlcyB0byBkaXNrLgorICAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKworICAgIC8vIElmIG5vbi1lbXB0eSwgaW5kaWNhdGVzIHRoYXQgdGhlIG5hbWVkIGZpbGUgc2hvdWxkIGFscmVhZHkgZXhpc3QsIGFuZCB0aGUKKyAgICAvLyBjb250ZW50IGhlcmUgaXMgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGF0IGZpbGUgYXQgYSBkZWZpbmVkIGluc2VydGlvbgorICAgIC8vIHBvaW50LiAgVGhpcyBmZWF0dXJlIGFsbG93cyBhIGNvZGUgZ2VuZXJhdG9yIHRvIGV4dGVuZCB0aGUgb3V0cHV0CisgICAgLy8gcHJvZHVjZWQgYnkgYW5vdGhlciBjb2RlIGdlbmVyYXRvci4gIFRoZSBvcmlnaW5hbCBnZW5lcmF0b3IgbWF5IHByb3ZpZGUKKyAgICAvLyBpbnNlcnRpb24gcG9pbnRzIGJ5IHBsYWNpbmcgc3BlY2lhbCBhbm5vdGF0aW9ucyBpbiB0aGUgZmlsZSB0aGF0IGxvb2sKKyAgICAvLyBsaWtlOgorICAgIC8vICAgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KE5BTUUpCisgICAgLy8gVGhlIGFubm90YXRpb24gY2FuIGhhdmUgYXJiaXRyYXJ5IHRleHQgYmVmb3JlIGFuZCBhZnRlciBpdCBvbiB0aGUgbGluZSwKKyAgICAvLyB3aGljaCBhbGxvd3MgaXQgdG8gYmUgcGxhY2VkIGluIGEgY29tbWVudC4gIE5BTUUgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGgKKyAgICAvLyBhbiBpZGVudGlmaWVyIG5hbWluZyB0aGUgcG9pbnQgLS0gdGhpcyBpcyB3aGF0IG90aGVyIGdlbmVyYXRvcnMgd2lsbCB1c2UKKyAgICAvLyBhcyB0aGUgaW5zZXJ0aW9uX3BvaW50LiAgQ29kZSBpbnNlcnRlZCBhdCB0aGlzIHBvaW50IHdpbGwgYmUgcGxhY2VkCisgICAgLy8gaW1tZWRpYXRlbHkgYWJvdmUgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgaW5zZXJ0aW9uIHBvaW50ICh0aHVzIG11bHRpcGxlCisgICAgLy8gaW5zZXJ0aW9ucyB0byB0aGUgc2FtZSBwb2ludCB3aWxsIGNvbWUgb3V0IGluIHRoZSBvcmRlciB0aGV5IHdlcmUgYWRkZWQpLgorICAgIC8vIFRoZSBkb3VibGUtQCBpcyBpbnRlbmRlZCB0byBtYWtlIGl0IHVubGlrZWx5IHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlCisgICAgLy8gY291bGQgY29udGFpbiB0aGluZ3MgdGhhdCBsb29rIGxpa2UgaW5zZXJ0aW9uIHBvaW50cyBieSBhY2NpZGVudC4KKyAgICAvLworICAgIC8vIEZvciBleGFtcGxlLCB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yIHBsYWNlcyB0aGUgZm9sbG93aW5nIGxpbmUgaW4gdGhlCisgICAgLy8gLnBiLmggZmlsZXMgdGhhdCBpdCBnZW5lcmF0ZXM6CisgICAgLy8gICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorICAgIC8vIFRoaXMgbGluZSBhcHBlYXJzIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGZpbGUncyBwYWNrYWdlIG5hbWVzcGFjZSwgYnV0CisgICAgLy8gb3V0c2lkZSBvZiBhbnkgcGFydGljdWxhciBjbGFzcy4gIEFub3RoZXIgcGx1Z2luIGNhbiB0aGVuIHNwZWNpZnkgdGhlCisgICAgLy8gaW5zZXJ0aW9uX3BvaW50ICJuYW1lc3BhY2Vfc2NvcGUiIHRvIGdlbmVyYXRlIGFkZGl0aW9uYWwgY2xhc3NlcyBvcgorICAgIC8vIG90aGVyIGRlY2xhcmF0aW9ucyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW4gdGhpcyBzY29wZS4KKyAgICAvLworICAgIC8vIE5vdGUgdGhhdCBpZiB0aGUgbGluZSBjb250YWluaW5nIHRoZSBpbnNlcnRpb24gcG9pbnQgYmVnaW5zIHdpdGgKKyAgICAvLyB3aGl0ZXNwYWNlLCB0aGUgc2FtZSB3aGl0ZXNwYWNlIHdpbGwgYmUgYWRkZWQgdG8gZXZlcnkgbGluZSBvZiB0aGUKKyAgICAvLyBpbnNlcnRlZCB0ZXh0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGxhbmd1YWdlcyBsaWtlIFB5dGhvbiwgd2hlcmUKKyAgICAvLyBpbmRlbnRhdGlvbiBtYXR0ZXJzLiAgSW4gdGhlc2UgbGFuZ3VhZ2VzLCB0aGUgaW5zZXJ0aW9uIHBvaW50IGNvbW1lbnQKKyAgICAvLyBzaG91bGQgYmUgaW5kZW50ZWQgdGhlIHNhbWUgYW1vdW50IGFzIGFueSBpbnNlcnRlZCBjb2RlIHdpbGwgbmVlZCB0byBiZQorICAgIC8vIGluIG9yZGVyIHRvIHdvcmsgY29ycmVjdGx5IGluIHRoYXQgY29udGV4dC4KKyAgICAvLworICAgIC8vIFRoZSBjb2RlIGdlbmVyYXRvciB0aGF0IGdlbmVyYXRlcyB0aGUgaW5pdGlhbCBmaWxlIGFuZCB0aGUgb25lIHdoaWNoCisgICAgLy8gaW5zZXJ0cyBpbnRvIGl0IG11c3QgYm90aCBydW4gYXMgcGFydCBvZiBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mIHByb3RvYy4KKyAgICAvLyBDb2RlIGdlbmVyYXRvcnMgYXJlIGV4ZWN1dGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBvbiB0aGUKKyAgICAvLyBjb21tYW5kIGxpbmUuCisgICAgLy8KKyAgICAvLyBJZiB8aW5zZXJ0aW9uX3BvaW50fCBpcyBwcmVzZW50LCB8bmFtZXwgbXVzdCBhbHNvIGJlIHByZXNlbnQuCisgICAgb3B0aW9uYWwgc3RyaW5nIGluc2VydGlvbl9wb2ludCA9IDI7CisKKyAgICAvLyBUaGUgZmlsZSBjb250ZW50cy4KKyAgICBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1OworCisgICAgLy8gSW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgZmlsZSBjb250ZW50IGJlaW5nIGluc2VydGVkLiBJZiBhbiBpbnNlcnRpb24KKyAgICAvLyBwb2ludCBpcyB1c2VkLCB0aGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgYXBwcm9wcmlhdGVseSBvZmZzZXQgYW5kIGluc2VydGVkCisgICAgLy8gaW50byB0aGUgY29kZSBnZW5lcmF0aW9uIG1ldGFkYXRhIGZvciB0aGUgZ2VuZXJhdGVkIGZpbGVzLgorICAgIG9wdGlvbmFsIEdlbmVyYXRlZENvZGVJbmZvIGdlbmVyYXRlZF9jb2RlX2luZm8gPSAxNjsKKyAgfQorICByZXBlYXRlZCBGaWxlIGZpbGUgPSAxNTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2dlbmVyYXRvci5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGQ2ZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTM5MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogcm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbikKKy8vCisvLyBUaGlzIG1vZHVsZSBvdXRwdXRzIHB1cmUtUHl0aG9uIHByb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyB0aGF0IHdpbGwKKy8vIGxhcmdlbHkgYmUgY29uc3RydWN0ZWQgYXQgcnVudGltZSB2aWEgdGhlIG1ldGFjbGFzcyBpbiByZWZsZWN0aW9uLnB5LgorLy8gSW4gb3RoZXIgd29yZHMsIG91ciBqb2IgaXMgYmFzaWNhbGx5IHRvIG91dHB1dCBhIFB5dGhvbiBlcXVpdmFsZW50CisvLyBvZiB0aGUgQysrICpEZXNjcmlwdG9yIG9iamVjdHMsIGFuZCBmaXggdXAgYWxsIGNpcmN1bGFyIHJlZmVyZW5jZXMKKy8vIHdpdGhpbiB0aGVzZSBvYmplY3RzLgorLy8KKy8vIE5vdGUgdGhhdCB0aGUgcnVudGltZSBwZXJmb3JtYW5jZSBvZiBwcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgY3JlYXRlZCBpbgorLy8gdGhpcyB3YXkgaXMgZXhwZWN0ZWQgdG8gYmUgbG91c3kuICBUaGUgcGxhbiBpcyB0byBjcmVhdGUgYW4gYWx0ZXJuYXRlCisvLyBnZW5lcmF0b3IgdGhhdCBvdXRwdXRzIGEgUHl0aG9uL0MgZXh0ZW5zaW9uIG1vZHVsZSB0aGF0IGxldHMKKy8vIHBlcmZvcm1hbmNlLW1pbmRlZCBQeXRob24gY29kZSBsZXZlcmFnZSB0aGUgZmFzdCBDKysgaW1wbGVtZW50YXRpb24KKy8vIGRpcmVjdGx5LgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9nZW5lcmF0b3IuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHlpX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgcHl0aG9uIHsKKworbmFtZXNwYWNlIHsKKy8vIFJldHVybnMgdGhlIGFsaWFzIHdlIGFzc2lnbiB0byB0aGUgbW9kdWxlIG9mIHRoZSBnaXZlbiAucHJvdG8gZmlsZW5hbWUKKy8vIHdoZW4gaW1wb3J0aW5nLiBTZWUgdGVzdFBhY2thZ2VJbml0aWFsaXphdGlvbkltcG9ydCBpbgorLy8gbmV0L3Byb3RvMi9weXRob24vaW50ZXJuYWwvcmVmbGVjdGlvbl90ZXN0LnB5CisvLyB0byBzZWUgd2h5IHdlIG5lZWQgdGhlIGFsaWFzLgorc3RkOjpzdHJpbmcgTW9kdWxlQWxpYXMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHN0ZDo6c3RyaW5nIG1vZHVsZV9uYW1lID0gTW9kdWxlTmFtZShmaWxlbmFtZSk7CisgIC8vIFdlIGNhbid0IGhhdmUgZG90cyBpbiB0aGUgbW9kdWxlIG5hbWUsIHNvIHdlIHJlcGxhY2UgZWFjaCB3aXRoIF9kb3RfLgorICAvLyBCdXQgdGhhdCBjb3VsZCBsZWFkIHRvIGEgY29sbGlzaW9uIGJldHdlZW4gYS5iIGFuZCBhX2RvdF9iLCBzbyB3ZSBhbHNvCisgIC8vIGR1cGxpY2F0ZSBlYWNoIHVuZGVyc2NvcmUuCisgIEdsb2JhbFJlcGxhY2VTdWJzdHJpbmcoIl8iLCAiX18iLCAmbW9kdWxlX25hbWUpOworICBHbG9iYWxSZXBsYWNlU3Vic3RyaW5nKCIuIiwgIl9kb3RfIiwgJm1vZHVsZV9uYW1lKTsKKyAgcmV0dXJuIG1vZHVsZV9uYW1lOworfQorCisvLyBOYW1lIG9mIHRoZSBjbGFzcyBhdHRyaWJ1dGUgd2hlcmUgd2Ugc3RvcmUgdGhlIFB5dGhvbgorLy8gZGVzY3JpcHRvci5EZXNjcmlwdG9yIGluc3RhbmNlIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzLgorLy8gTXVzdCBzdGF5IGNvbnNpc3RlbnQgd2l0aCB0aGUgX0RFU0NSSVBUT1JfS0VZIGNvbnN0YW50CisvLyBpbiBwcm90bzIvcHVibGljL3JlZmxlY3Rpb24ucHkuCitjb25zdCBjaGFyIGtEZXNjcmlwdG9yS2V5W10gPSAiREVTQ1JJUFRPUiI7CisKKworLy8gZmlsZSBvdXRwdXQgYnkgdGhpcyBnZW5lcmF0b3IuCit2b2lkIFByaW50VG9wQm9pbGVycGxhdGUoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVzY3JpcHRvcl9wcm90bykgeworICAvLyBUT0RPKHJvYmluc29uKTogQWxsb3cgcGFyYW1ldGVyaXphdGlvbiBvZiBQeXRob24gdmVyc2lvbj8KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiIyAtKi0gY29kaW5nOiB1dGYtOCAtKi1cbiIKKyAgICAgICIjIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhXG4iCisgICAgICAiIyBzb3VyY2U6ICRmaWxlbmFtZSRcbiIKKyAgICAgICJcIlwiXCJHZW5lcmF0ZWQgcHJvdG9jb2wgYnVmZmVyIGNvZGUuXCJcIlwiXG4iLAorICAgICAgImZpbGVuYW1lIiwgZmlsZS0+bmFtZSgpKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGJ1aWxkZXIgYXMgX2J1aWxkZXJcbiIKKyAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvciBhcyBfZGVzY3JpcHRvclxuIgorICAgICAgImZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3Bvb2wgYXMgIgorICAgICAgIl9kZXNjcmlwdG9yX3Bvb2xcbiIKKyAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc3ltYm9sX2RhdGFiYXNlIGFzICIKKyAgICAgICJfc3ltYm9sX2RhdGFiYXNlXG4iKTsKKworICBwcmludGVyLT5QcmludCgiIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW1wb3J0cylcblxuIik7CisgIHByaW50ZXItPlByaW50KCJfc3ltX2RiID0gX3N5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KClcbiIpOworICBwcmludGVyLT5QcmludCgiXG5cbiIpOworfQorCisvLyBSZXR1cm5zIGEgUHl0aG9uIGxpdGVyYWwgZ2l2aW5nIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIGZpZWxkLgorLy8gSWYgdGhlIGZpZWxkIHNwZWNpZmllcyBubyBleHBsaWNpdCBkZWZhdWx0IHZhbHVlLCB3ZSdsbCByZXR1cm4KKy8vIHRoZSBkZWZhdWx0IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBmaWVsZCB0eXBlICh6ZXJvIGZvciBudW1iZXJzLAorLy8gZW1wdHkgc3RyaW5nIGZvciBzdHJpbmdzLCBlbXB0eSBsaXN0IGZvciByZXBlYXRlZCBmaWVsZHMsIGFuZAorLy8gTm9uZSBmb3Igbm9uLXJlcGVhdGVkLCBjb21wb3NpdGUgZmllbGRzKS4KKy8vCisvLyBUT0RPKHJvYmluc29uKTogVW5pZnkgd2l0aCBjb2RlIGZyb20KKy8vIC8vY29tcGlsZXIvY3BwL2ludGVybmFsL3ByaW1pdGl2ZV9maWVsZC5jYworLy8gLy9jb21waWxlci9jcHAvaW50ZXJuYWwvZW51bV9maWVsZC5jYworLy8gLy9jb21waWxlci9jcHAvaW50ZXJuYWwvc3RyaW5nX2ZpZWxkLmNjCitzdGQ6OnN0cmluZyBTdHJpbmdpZnlEZWZhdWx0VmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCkgeworICBpZiAoZmllbGQuaXNfcmVwZWF0ZWQoKSkgeworICAgIHJldHVybiAiW10iOworICB9CisKKyAgc3dpdGNoIChmaWVsZC5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6CisgICAgICByZXR1cm4gU3RyQ2F0KGZpZWxkLmRlZmF1bHRfdmFsdWVfaW50MzIoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuIFN0ckNhdChmaWVsZC5kZWZhdWx0X3ZhbHVlX3VpbnQzMigpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiBTdHJDYXQoZmllbGQuZGVmYXVsdF92YWx1ZV9pbnQ2NCgpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gU3RyQ2F0KGZpZWxkLmRlZmF1bHRfdmFsdWVfdWludDY0KCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRTogeworICAgICAgZG91YmxlIHZhbHVlID0gZmllbGQuZGVmYXVsdF92YWx1ZV9kb3VibGUoKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKKyAgICAgICAgLy8gUHl0aG9uIHByZS0yLjYgb24gV2luZG93cyBkb2VzIG5vdCBwYXJzZSAiaW5mIiBjb3JyZWN0bHkuICBIb3dldmVyLAorICAgICAgICAvLyBhIG51bWVyaWMgbGl0ZXJhbCB0aGF0IGlzIHRvbyBiaWcgZm9yIGEgZG91YmxlIHdpbGwgYmVjb21lIGluZmluaXR5LgorICAgICAgICByZXR1cm4gIjFlMTAwMDAiOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7CisgICAgICAgIC8vIFNlZSBhYm92ZS4KKyAgICAgICAgcmV0dXJuICItMWUxMDAwMCI7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IHZhbHVlKSB7CisgICAgICAgIC8vIGluZmluaXR5ICogMCA9IG5hbgorICAgICAgICByZXR1cm4gIigxZTEwMDAwICogMCkiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICJmbG9hdCgiICsgU2ltcGxlRHRvYSh2YWx1ZSkgKyAiKSI7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CisgICAgICBmbG9hdCB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRfdmFsdWVfZmxvYXQoKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSkgeworICAgICAgICAvLyBQeXRob24gcHJlLTIuNiBvbiBXaW5kb3dzIGRvZXMgbm90IHBhcnNlICJpbmYiIGNvcnJlY3RseS4gIEhvd2V2ZXIsCisgICAgICAgIC8vIGEgbnVtZXJpYyBsaXRlcmFsIHRoYXQgaXMgdG9vIGJpZyBmb3IgYSBkb3VibGUgd2lsbCBiZWNvbWUgaW5maW5pdHkuCisgICAgICAgIHJldHVybiAiMWUxMDAwMCI7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IC1zdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSkgeworICAgICAgICAvLyBTZWUgYWJvdmUuCisgICAgICAgIHJldHVybiAiLTFlMTAwMDAiOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSB2YWx1ZSkgeworICAgICAgICAvLyBpbmZpbml0eSAtIGluZmluaXR5ID0gbmFuCisgICAgICAgIHJldHVybiAiKDFlMTAwMDAgKiAwKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gImZsb2F0KCIgKyBTaW1wbGVGdG9hKHZhbHVlKSArICIpIjsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKKyAgICAgIHJldHVybiBmaWVsZC5kZWZhdWx0X3ZhbHVlX2Jvb2woKSA/ICJUcnVlIiA6ICJGYWxzZSI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgIHJldHVybiBTdHJDYXQoZmllbGQuZGVmYXVsdF92YWx1ZV9lbnVtKCktPm51bWJlcigpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gImJcIiIgKyBDRXNjYXBlKGZpZWxkLmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpICsKKyAgICAgICAgICAgICAoZmllbGQudHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcKKyAgICAgICAgICAgICAgICAgID8gIlwiIgorICAgICAgICAgICAgICAgICAgOiAiXCIuZGVjb2RlKCd1dGYtOCcpIik7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiAiTm9uZSI7CisgIH0KKyAgLy8gKFdlIGNvdWxkIGFkZCBhIGRlZmF1bHQgY2FzZSBhYm92ZSBidXQgdGhlbiB3ZSB3b3VsZG4ndCBnZXQgdGhlIG5pY2UKKyAgLy8gY29tcGlsZXIgd2FybmluZyB3aGVuIGEgbmV3IHR5cGUgaXMgYWRkZWQuKQorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiTm90IHJlYWNoZWQuIjsKKyAgcmV0dXJuICIiOworfQorCitzdGQ6OnN0cmluZyBTdHJpbmdpZnlTeW50YXgoRmlsZURlc2NyaXB0b3I6OlN5bnRheCBzeW50YXgpIHsKKyAgc3dpdGNoIChzeW50YXgpIHsKKyAgICBjYXNlIEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8yOgorICAgICAgcmV0dXJuICJwcm90bzIiOworICAgIGNhc2UgRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzM6CisgICAgICByZXR1cm4gInByb3RvMyI7CisgICAgY2FzZSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1VOS05PV046CisgICAgZGVmYXVsdDoKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbnN1cHBvcnRlZCBzeW50YXg7IHRoaXMgZ2VuZXJhdG9yIG9ubHkgc3VwcG9ydHMgcHJvdG8yICIKKyAgICAgICAgICAgICAgICAgICAgImFuZCBwcm90bzMgc3ludGF4LiI7CisgICAgICByZXR1cm4gIiI7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0dlbmVyYXRvcjo6R2VuZXJhdG9yKCkgOiBmaWxlXyhudWxscHRyKSB7fQorCitHZW5lcmF0b3I6On5HZW5lcmF0b3IoKSB7fQorCit1aW50NjRfdCBHZW5lcmF0b3I6OkdldFN1cHBvcnRlZEZlYXR1cmVzKCkgY29uc3QgeworICByZXR1cm4gQ29kZUdlbmVyYXRvcjo6RmVhdHVyZTo6RkVBVFVSRV9QUk9UTzNfT1BUSU9OQUw7Cit9CisKK2Jvb2wgR2VuZXJhdG9yOjpHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsIHN0ZDo6c3RyaW5nKiBlcnJvcikgY29uc3QgeworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBwYXJzZSBnZW5lcmF0b3Igb3B0aW9ucworICBib29sIGNwcF9nZW5lcmF0ZWRfbGliX2xpbmtlZCA9IGZhbHNlOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ID4gb3B0aW9uczsKKyAgUGFyc2VHZW5lcmF0b3JQYXJhbWV0ZXIocGFyYW1ldGVyLCAmb3B0aW9ucyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImNwcF9nZW5lcmF0ZWRfbGliX2xpbmtlZCIpIHsKKyAgICAgIGNwcF9nZW5lcmF0ZWRfbGliX2xpbmtlZCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJweWlfb3V0IikgeworICAgICAgcHl0aG9uOjpQeWlHZW5lcmF0b3IgcHlpX2dlbmVyYXRvcjsKKyAgICAgIGlmICghcHlpX2dlbmVyYXRvci5HZW5lcmF0ZShmaWxlLCAiIiwgY29udGV4dCwgZXJyb3IpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgKmVycm9yID0gIlVua25vd24gZ2VuZXJhdG9yIG9wdGlvbjogIiArIG9wdGlvbnNbaV0uZmlyc3Q7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gQ29tcGxldGVseSBzZXJpYWxpemUgYWxsIEdlbmVyYXRlKCkgY2FsbHMgb24gdGhpcyBpbnN0YW5jZS4gIFRoZQorICAvLyB0aHJlYWQtc2FmZXR5IGNvbnN0cmFpbnRzIG9mIHRoZSBDb2RlR2VuZXJhdG9yIGludGVyZmFjZSBhcmVuJ3QgY2xlYXIgc28KKyAgLy8ganVzdCBiZSBhcyBjb25zZXJ2YXRpdmUgYXMgcG9zc2libGUuICBJdCdzIGVhc2llciB0byByZWxheCB0aGlzIGxhdGVyIGlmCisgIC8vIHdlIG5lZWQgdG8sIGJ1dCBJIGRvdWJ0IGl0IHdpbGwgYmUgYW4gaXNzdWUuCisgIC8vIFRPRE8oa2VudG9uKTogIFRoZSBwcm9wZXIgdGhpbmcgdG8gZG8gd291bGQgYmUgdG8gYWxsb2NhdGUgYW55IHN0YXRlIG9uCisgIC8vICAgdGhlIHN0YWNrIGFuZCB1c2UgdGhhdCwgc28gdGhhdCB0aGUgR2VuZXJhdG9yIGNsYXNzIGl0c2VsZiBkb2VzIG5vdCBuZWVkCisgIC8vICAgdG8gaGF2ZSBhbnkgbXV0YWJsZSBtZW1iZXJzLiAgVGhlbiBpdCBpcyBpbXBsaWNpdGx5IHRocmVhZC1zYWZlLgorICBNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgZmlsZV8gPSBmaWxlOworCisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gR2V0RmlsZU5hbWUoZmlsZSwgIi5weSIpOworICBwdXJlX3B5dGhvbl93b3JrYWJsZV8gPSAhY3BwX2dlbmVyYXRlZF9saWJfbGlua2VkOworICBpZiAoSGFzUHJlZml4U3RyaW5nKGZpbGUtPm5hbWUoKSwgImdvb2dsZS9wcm90b2J1Zi8iKSkgeworICAgIHB1cmVfcHl0aG9uX3dvcmthYmxlXyA9IHRydWU7CisgIH0KKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZkcDsKKyAgZmlsZV8tPkNvcHlUbygmZmRwKTsKKyAgZmRwLlNlcmlhbGl6ZVRvU3RyaW5nKCZmaWxlX2Rlc2NyaXB0b3Jfc2VyaWFsaXplZF8pOworCisKKyAgc3RkOjp1bmlxdWVfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KGNvbnRleHQtPk9wZW4oZmlsZW5hbWUpKTsKKyAgR09PR0xFX0NIRUNLKG91dHB1dC5nZXQoKSk7CisgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcpOworICBwcmludGVyXyA9ICZwcmludGVyOworCisgIFByaW50VG9wQm9pbGVycGxhdGUocHJpbnRlcl8sIGZpbGVfLCBHZW5lcmF0aW5nRGVzY3JpcHRvclByb3RvKCkpOworICBpZiAocHVyZV9weXRob25fd29ya2FibGVfKSB7CisgICAgUHJpbnRJbXBvcnRzKCk7CisgIH0KKyAgUHJpbnRGaWxlRGVzY3JpcHRvcigpOworICBpZiAocHVyZV9weXRob25fd29ya2FibGVfKSB7CisgICAgaWYgKEdlbmVyYXRpbmdEZXNjcmlwdG9yUHJvdG8oKSkgeworICAgICAgcHJpbnRlcl8tPlByaW50KCJpZiBfZGVzY3JpcHRvci5fVVNFX0NfREVTQ1JJUFRPUlMgPT0gRmFsc2U6XG4iKTsKKyAgICAgIHByaW50ZXJfLT5JbmRlbnQoKTsKKyAgICAgIC8vIENyZWF0ZSBlbnVtcyBiZWZvcmUgbWVzc2FnZSBkZXNjcmlwdG9ycworICAgICAgUHJpbnRBbGxOZXN0ZWRFbnVtc0luRmlsZSgpOworICAgICAgUHJpbnRNZXNzYWdlRGVzY3JpcHRvcnMoKTsKKyAgICAgIEZpeEZvcmVpZ25GaWVsZHNJbkRlc2NyaXB0b3JzKCk7CisgICAgICBwcmludGVyXy0+T3V0ZGVudCgpOworICAgICAgcHJpbnRlcl8tPlByaW50KCJlbHNlOlxuIik7CisgICAgICBwcmludGVyXy0+SW5kZW50KCk7CisgICAgfQorICAgIC8vIEZpbmQgdGhlIG1lc3NhZ2UgZGVzY3JpcHRvcnMgZmlyc3QgYW5kIHRoZW4gdXNlIHRoZSBtZXNzYWdlCisgICAgLy8gZGVzY3JpcHRvciB0byBmaW5kIGVudW1zLgorICAgIHByaW50ZXJfLT5QcmludCgKKyAgICAgICAgIl9idWlsZGVyLkJ1aWxkTWVzc2FnZUFuZEVudW1EZXNjcmlwdG9ycyhERVNDUklQVE9SLCBnbG9iYWxzKCkpXG4iKTsKKyAgICBpZiAoR2VuZXJhdGluZ0Rlc2NyaXB0b3JQcm90bygpKSB7CisgICAgICBwcmludGVyXy0+T3V0ZGVudCgpOworICAgIH0KKyAgfQorICBzdGQ6OnN0cmluZyBtb2R1bGVfbmFtZSA9IE1vZHVsZU5hbWUoZmlsZS0+bmFtZSgpKTsKKyAgcHJpbnRlcl8tPlByaW50KAorICAgICAgIl9idWlsZGVyLkJ1aWxkVG9wRGVzY3JpcHRvcnNBbmRNZXNzYWdlcyhERVNDUklQVE9SLCAnJG1vZHVsZV9uYW1lJCcsICIKKyAgICAgICJnbG9iYWxzKCkpXG4iLAorICAgICAgIm1vZHVsZV9uYW1lIiwgbW9kdWxlX25hbWUpOworICBpZiAocHVyZV9weXRob25fd29ya2FibGVfKSB7CisgICAgcHJpbnRlci5QcmludCgiaWYgX2Rlc2NyaXB0b3IuX1VTRV9DX0RFU0NSSVBUT1JTID09IEZhbHNlOlxuIik7CisgICAgcHJpbnRlcl8tPkluZGVudCgpOworCisgICAgLy8gV2UgaGF2ZSB0byBmaXggdXAgdGhlIGV4dGVuc2lvbnMgYWZ0ZXIgdGhlIG1lc3NhZ2UgY2xhc3NlcyB0aGVtc2VsdmVzLAorICAgIC8vIHNpbmNlIHRoZXkgbmVlZCB0byBjYWxsIHN0YXRpYyBSZWdpc3RlckV4dGVuc2lvbigpIG1ldGhvZHMgb24gdGhlc2UKKyAgICAvLyBjbGFzc2VzLgorICAgIEZpeEZvcmVpZ25GaWVsZHNJbkV4dGVuc2lvbnMoKTsKKyAgICAvLyBEZXNjcmlwdG9yIG9wdGlvbnMgbWF5IGhhdmUgY3VzdG9tIGV4dGVuc2lvbnMuIFRoZXNlIGN1c3RvbSBvcHRpb25zCisgICAgLy8gY2FuIG9ubHkgYmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBhZnRlciB3ZSByZWdpc3RlciBjb3JyZXNwb25kaW5nCisgICAgLy8gZXh0ZW5zaW9ucy4gVGhlcmVmb3JlIHdlIHBhcnNlIGFsbCBvcHRpb25zIGFnYWluIGhlcmUgdG8gcmVjb2duaXplCisgICAgLy8gY3VzdG9tIG9wdGlvbnMgdGhhdCBtYXkgYmUgdW5rbm93biB3aGVuIHdlIGRlZmluZSB0aGUgZGVzY3JpcHRvcnMuCisgICAgLy8gVGhpcyBkb2VzIG5vdCBhcHBseSB0byBzZXJ2aWNlcyBiZWNhdXNlIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGV4dGVuc2lvbnMuCisgICAgRml4QWxsRGVzY3JpcHRvck9wdGlvbnMoKTsKKworICAgIC8vIFNldCBzZXJpYWxpemVkX3N0YXJ0IGFuZCBzZXJpYWxpemVkX2VuZC4KKyAgICBTZXRTZXJpYWxpemVkUGJJbnRlcnZhbCgpOworCisgICAgcHJpbnRlcl8tPk91dGRlbnQoKTsKKyAgfQorICBpZiAoSGFzR2VuZXJpY1NlcnZpY2VzKGZpbGUpKSB7CisgICAgcHJpbnRlcl8tPlByaW50KAorICAgICAgICAiX2J1aWxkZXIuQnVpbGRTZXJ2aWNlcyhERVNDUklQVE9SLCAnJG1vZHVsZV9uYW1lJCcsIGdsb2JhbHMoKSlcbiIsCisgICAgICAgICJtb2R1bGVfbmFtZSIsIG1vZHVsZV9uYW1lKTsKKyAgfQorCisgIHByaW50ZXIuUHJpbnQoIiMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1vZHVsZV9zY29wZSlcbiIpOworCisgIHJldHVybiAhcHJpbnRlci5mYWlsZWQoKTsKK30KKworLy8gUHJpbnRzIFB5dGhvbiBpbXBvcnRzIGZvciBhbGwgbW9kdWxlcyBpbXBvcnRlZCBieSB8ZmlsZXwuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRJbXBvcnRzKCkgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSA9IGZpbGVfLT5kZXBlbmRlbmN5KGkpLT5uYW1lKCk7CisKKyAgICBzdGQ6OnN0cmluZyBtb2R1bGVfbmFtZSA9IE1vZHVsZU5hbWUoZmlsZW5hbWUpOworICAgIHN0ZDo6c3RyaW5nIG1vZHVsZV9hbGlhcyA9IE1vZHVsZUFsaWFzKGZpbGVuYW1lKTsKKyAgICBpZiAoQ29udGFpbnNQeXRob25LZXl3b3JkKG1vZHVsZV9uYW1lKSkgeworICAgICAgLy8gSWYgdGhlIG1vZHVsZSBwYXRoIGNvbnRhaW5zIGEgUHl0aG9uIGtleXdvcmQsIHdlIGhhdmUgdG8gcXVvdGUgdGhlCisgICAgICAvLyBtb2R1bGUgbmFtZSBhbmQgaW1wb3J0IGl0IHVzaW5nIGltcG9ydGxpYi4gT3RoZXJ3aXNlIHRoZSB1c3VhbCBraW5kIG9mCisgICAgICAvLyBpbXBvcnQgc3RhdGVtZW50IHdvdWxkIHJlc3VsdCBpbiBhIHN5bnRheCBlcnJvciBmcm9tIHRoZSBwcmVzZW5jZSBvZgorICAgICAgLy8gdGhlIGtleXdvcmQuCisgICAgICBwcmludGVyXy0+UHJpbnQoImltcG9ydCBpbXBvcnRsaWJcbiIpOworICAgICAgcHJpbnRlcl8tPlByaW50KCIkYWxpYXMkID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoJyRuYW1lJCcpXG4iLCAiYWxpYXMiLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9hbGlhcywgIm5hbWUiLCBtb2R1bGVfbmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBsYXN0X2RvdF9wb3MgPSBtb2R1bGVfbmFtZS5yZmluZCgnLicpOworICAgICAgc3RkOjpzdHJpbmcgaW1wb3J0X3N0YXRlbWVudDsKKyAgICAgIGlmIChsYXN0X2RvdF9wb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgLy8gTk9URShwZXR5YSk6IHRoaXMgaXMgbm90IHRlc3RlZCBhcyBpdCB3b3VsZCByZXF1aXJlIGEgcHJvdG9jb2wgYnVmZmVyCisgICAgICAgIC8vIG91dHNpZGUgb2YgYW55IHBhY2thZ2UsIGFuZCBJIGRvbid0IHRoaW5rIHRoYXQgaXMgZWFzaWx5IGFjaGlldmFibGUuCisgICAgICAgIGltcG9ydF9zdGF0ZW1lbnQgPSAiaW1wb3J0ICIgKyBtb2R1bGVfbmFtZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGltcG9ydF9zdGF0ZW1lbnQgPSAiZnJvbSAiICsgbW9kdWxlX25hbWUuc3Vic3RyKDAsIGxhc3RfZG90X3BvcykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbXBvcnQgIiArIG1vZHVsZV9uYW1lLnN1YnN0cihsYXN0X2RvdF9wb3MgKyAxKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZXJfLT5QcmludCgiJHN0YXRlbWVudCQgYXMgJGFsaWFzJFxuIiwgInN0YXRlbWVudCIsIGltcG9ydF9zdGF0ZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgImFsaWFzIiwgbW9kdWxlX2FsaWFzKTsKKyAgICB9CisKKyAgICBDb3B5UHVibGljRGVwZW5kZW5jaWVzQWxpYXNlcyhtb2R1bGVfYWxpYXMsIGZpbGVfLT5kZXBlbmRlbmN5KGkpKTsKKyAgfQorICBwcmludGVyXy0+UHJpbnQoIlxuIik7CisKKyAgLy8gUHJpbnQgcHVibGljIGltcG9ydHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnB1YmxpY19kZXBlbmRlbmN5X2NvdW50KCk7ICsraSkgeworICAgIHN0ZDo6c3RyaW5nIG1vZHVsZV9uYW1lID0gTW9kdWxlTmFtZShmaWxlXy0+cHVibGljX2RlcGVuZGVuY3koaSktPm5hbWUoKSk7CisgICAgcHJpbnRlcl8tPlByaW50KCJmcm9tICRtb2R1bGUkIGltcG9ydCAqXG4iLCAibW9kdWxlIiwgbW9kdWxlX25hbWUpOworICB9CisgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKK30KKworLy8gUHJpbnRzIHRoZSBzaW5nbGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGlzIGZpbGUuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRGaWxlRGVzY3JpcHRvcigpIGNvbnN0IHsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtOworICBtWyJkZXNjcmlwdG9yX25hbWUiXSA9IGtEZXNjcmlwdG9yS2V5OworICBtWyJuYW1lIl0gPSBmaWxlXy0+bmFtZSgpOworICBtWyJwYWNrYWdlIl0gPSBmaWxlXy0+cGFja2FnZSgpOworICBtWyJzeW50YXgiXSA9IFN0cmluZ2lmeVN5bnRheChmaWxlXy0+c3ludGF4KCkpOworICBtWyJvcHRpb25zIl0gPSBPcHRpb25zVmFsdWUoZmlsZV8tPm9wdGlvbnMoKS5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgbVsic2VyaWFsaXplZF9kZXNjcmlwdG9yIl0gPSBzdHJpbmdzOjpDSGV4RXNjYXBlKGZpbGVfZGVzY3JpcHRvcl9zZXJpYWxpemVkXyk7CisgIGlmIChHZW5lcmF0aW5nRGVzY3JpcHRvclByb3RvKCkpIHsKKyAgICBwcmludGVyXy0+UHJpbnQoImlmIF9kZXNjcmlwdG9yLl9VU0VfQ19ERVNDUklQVE9SUyA9PSBGYWxzZTpcbiIpOworICAgIHByaW50ZXJfLT5JbmRlbnQoKTsKKyAgICAvLyBQdXJlIHB5dGhvbidzIEFkZFNlcmlhbGl6ZWRGaWxlKCkgZGVwZW5kIG9uIHRoZSBnZW5lcmF0ZWQKKyAgICAvLyBkZXNjcmlwdG9yX3BiMi5weSB0aHVzIHdlIGNhbiBub3QgdXNlIEFkZFNlcmlhbGl6ZWRGaWxlKCkgd2hlbgorICAgIC8vIGdlbmVyYXRlZCBkZXNjcmlwdG9yLnByb3RvIGZvciBwdXJlIHB5dGhvbi4KKyAgICBjb25zdCBjaGFyIGZpbGVfZGVzY3JpcHRvcl90ZW1wbGF0ZVtdID0KKyAgICAgICAgIiRkZXNjcmlwdG9yX25hbWUkID0gX2Rlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IoXG4iCisgICAgICAgICIgIG5hbWU9JyRuYW1lJCcsXG4iCisgICAgICAgICIgIHBhY2thZ2U9JyRwYWNrYWdlJCcsXG4iCisgICAgICAgICIgIHN5bnRheD0nJHN5bnRheCQnLFxuIgorICAgICAgICAiICBzZXJpYWxpemVkX29wdGlvbnM9JG9wdGlvbnMkLFxuIgorICAgICAgICAiICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LFxuIjsKKyAgICBwcmludGVyXy0+UHJpbnQobSwgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlKTsKKyAgICBwcmludGVyXy0+SW5kZW50KCk7CisgICAgaWYgKHB1cmVfcHl0aG9uX3dvcmthYmxlXykgeworICAgICAgcHJpbnRlcl8tPlByaW50KCJzZXJpYWxpemVkX3BiPWInJHZhbHVlJCdcbiIsICJ2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nczo6Q0hleEVzY2FwZShmaWxlX2Rlc2NyaXB0b3Jfc2VyaWFsaXplZF8pKTsKKyAgICAgIGlmIChmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpICE9IDApIHsKKyAgICAgICAgcHJpbnRlcl8tPlByaW50KCIsXG5kZXBlbmRlbmNpZXM9WyIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7ICsraSkgeworICAgICAgICAgIHN0ZDo6c3RyaW5nIG1vZHVsZV9hbGlhcyA9IE1vZHVsZUFsaWFzKGZpbGVfLT5kZXBlbmRlbmN5KGkpLT5uYW1lKCkpOworICAgICAgICAgIHByaW50ZXJfLT5QcmludCgiJG1vZHVsZV9hbGlhcyQuREVTQ1JJUFRPUiwiLCAibW9kdWxlX2FsaWFzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX2FsaWFzKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyXy0+UHJpbnQoIl0iKTsKKyAgICAgIH0KKyAgICAgIGlmIChmaWxlXy0+cHVibGljX2RlcGVuZGVuY3lfY291bnQoKSA+IDApIHsKKyAgICAgICAgcHJpbnRlcl8tPlByaW50KCIsXG5wdWJsaWNfZGVwZW5kZW5jaWVzPVsiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+cHVibGljX2RlcGVuZGVuY3lfY291bnQoKTsgKytpKSB7CisgICAgICAgICAgc3RkOjpzdHJpbmcgbW9kdWxlX2FsaWFzID0KKyAgICAgICAgICAgICAgTW9kdWxlQWxpYXMoZmlsZV8tPnB1YmxpY19kZXBlbmRlbmN5KGkpLT5uYW1lKCkpOworICAgICAgICAgIHByaW50ZXJfLT5QcmludCgiJG1vZHVsZV9hbGlhcyQuREVTQ1JJUFRPUiwiLCAibW9kdWxlX2FsaWFzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX2FsaWFzKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyXy0+UHJpbnQoIl0iKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlcl8tPlByaW50KCJzZXJpYWxpemVkX3BiPScnXG4iKTsKKyAgICB9CisKKyAgICAvLyBUT0RPKGZhbGspOiBBbHNvIHByaW50IG9wdGlvbnMgYW5kIGZpeCB0aGUgbWVzc2FnZV90eXBlLCBlbnVtX3R5cGUsCisgICAgLy8gICAgICAgICAgICAgc2VydmljZSBhbmQgZXh0ZW5zaW9uIGxhdGVyIGluIHRoZSBnZW5lcmF0aW9uLgorCisgICAgcHJpbnRlcl8tPk91dGRlbnQoKTsKKyAgICBwcmludGVyXy0+UHJpbnQoIilcbiIpOworCisgICAgcHJpbnRlcl8tPk91dGRlbnQoKTsKKyAgICBwcmludGVyXy0+UHJpbnQoImVsc2U6XG4iKTsKKyAgICBwcmludGVyXy0+SW5kZW50KCk7CisgIH0KKyAgcHJpbnRlcl8tPlByaW50KG0sCisgICAgICAgICAgICAgICAgICAiJGRlc2NyaXB0b3JfbmFtZSQgPSAiCisgICAgICAgICAgICAgICAgICAiX2Rlc2NyaXB0b3JfcG9vbC5EZWZhdWx0KCkuQWRkU2VyaWFsaXplZEZpbGUoYickc2VyaWFsaXplZF8iCisgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvciQnKVxuIik7CisgIGlmIChHZW5lcmF0aW5nRGVzY3JpcHRvclByb3RvKCkpIHsKKyAgICBwcmludGVyXy0+T3V0ZGVudCgpOworICB9CisgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKK30KKworLy8gUHJpbnRzIGFsbCBlbnVtcyBjb250YWluZWQgaW4gYWxsIG1lc3NhZ2UgdHlwZXMgaW4gfGZpbGV8Lgordm9pZCBHZW5lcmF0b3I6OlByaW50QWxsTmVzdGVkRW51bXNJbkZpbGUoKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBQcmludE5lc3RlZEVudW1zKCpmaWxlXy0+bWVzc2FnZV90eXBlKGkpKTsKKyAgfQorfQorCisvLyBQcmludHMgYSBQeXRob24gc3RhdGVtZW50IGFzc2lnbmluZyB0aGUgYXBwcm9wcmlhdGUgbW9kdWxlLWxldmVsCisvLyBlbnVtIG5hbWUgdG8gYSBQeXRob24gRW51bURlc2NyaXB0b3Igb2JqZWN0IGVxdWl2YWxlbnQgdG8KKy8vIGVudW1fZGVzY3JpcHRvci4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludEVudW0oY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvcikgY29uc3QgeworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG07CisgIHN0ZDo6c3RyaW5nIG1vZHVsZV9sZXZlbF9kZXNjcmlwdG9yX25hbWUgPQorICAgICAgTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShlbnVtX2Rlc2NyaXB0b3IpOworICBtWyJkZXNjcmlwdG9yX25hbWUiXSA9IG1vZHVsZV9sZXZlbF9kZXNjcmlwdG9yX25hbWU7CisgIG1bIm5hbWUiXSA9IGVudW1fZGVzY3JpcHRvci5uYW1lKCk7CisgIG1bImZ1bGxfbmFtZSJdID0gZW51bV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSgpOworICBtWyJmaWxlIl0gPSBrRGVzY3JpcHRvcktleTsKKyAgY29uc3QgY2hhciBlbnVtX2Rlc2NyaXB0b3JfdGVtcGxhdGVbXSA9CisgICAgICAiJGRlc2NyaXB0b3JfbmFtZSQgPSBfZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcihcbiIKKyAgICAgICIgIG5hbWU9JyRuYW1lJCcsXG4iCisgICAgICAiICBmdWxsX25hbWU9JyRmdWxsX25hbWUkJyxcbiIKKyAgICAgICIgIGZpbGVuYW1lPU5vbmUsXG4iCisgICAgICAiICBmaWxlPSRmaWxlJCxcbiIKKyAgICAgICIgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksXG4iCisgICAgICAiICB2YWx1ZXM9W1xuIjsKKyAgc3RkOjpzdHJpbmcgb3B0aW9uc19zdHJpbmc7CisgIGVudW1fZGVzY3JpcHRvci5vcHRpb25zKCkuU2VyaWFsaXplVG9TdHJpbmcoJm9wdGlvbnNfc3RyaW5nKTsKKyAgcHJpbnRlcl8tPlByaW50KG0sIGVudW1fZGVzY3JpcHRvcl90ZW1wbGF0ZSk7CisgIHByaW50ZXJfLT5JbmRlbnQoKTsKKyAgcHJpbnRlcl8tPkluZGVudCgpOworCisgIGlmIChwdXJlX3B5dGhvbl93b3JrYWJsZV8pIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fZGVzY3JpcHRvci52YWx1ZV9jb3VudCgpOyArK2kpIHsKKyAgICAgIFByaW50RW51bVZhbHVlRGVzY3JpcHRvcigqZW51bV9kZXNjcmlwdG9yLnZhbHVlKGkpKTsKKyAgICAgIHByaW50ZXJfLT5QcmludCgiLFxuIik7CisgICAgfQorICB9CisKKyAgcHJpbnRlcl8tPk91dGRlbnQoKTsKKyAgcHJpbnRlcl8tPlByaW50KCJdLFxuIik7CisgIHByaW50ZXJfLT5QcmludCgiY29udGFpbmluZ190eXBlPU5vbmUsXG4iKTsKKyAgcHJpbnRlcl8tPlByaW50KCJzZXJpYWxpemVkX29wdGlvbnM9JG9wdGlvbnNfdmFsdWUkLFxuIiwgIm9wdGlvbnNfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgT3B0aW9uc1ZhbHVlKG9wdGlvbnNfc3RyaW5nKSk7CisgIEVudW1EZXNjcmlwdG9yUHJvdG8gZWRwOworICBwcmludGVyXy0+T3V0ZGVudCgpOworICBwcmludGVyXy0+UHJpbnQoIilcbiIpOworICBpZiAocHVyZV9weXRob25fd29ya2FibGVfKSB7CisgICAgcHJpbnRlcl8tPlByaW50KCJfc3ltX2RiLlJlZ2lzdGVyRW51bURlc2NyaXB0b3IoJG5hbWUkKVxuIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICBtb2R1bGVfbGV2ZWxfZGVzY3JpcHRvcl9uYW1lKTsKKyAgfQorICBwcmludGVyXy0+UHJpbnQoIlxuIik7Cit9CisKKy8vIFJlY3Vyc2l2ZWx5IHByaW50cyBlbnVtcyBpbiBuZXN0ZWQgdHlwZXMgd2l0aGluIGRlc2NyaXB0b3IsIHRoZW4KKy8vIHByaW50cyBlbnVtcyBjb250YWluZWQgYXQgdGhlIHRvcCBsZXZlbCBpbiBkZXNjcmlwdG9yLgordm9pZCBHZW5lcmF0b3I6OlByaW50TmVzdGVkRW51bXMoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IubmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgUHJpbnROZXN0ZWRFbnVtcygqZGVzY3JpcHRvci5uZXN0ZWRfdHlwZShpKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IuZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIFByaW50RW51bSgqZGVzY3JpcHRvci5lbnVtX3R5cGUoaSkpOworICB9Cit9CisKKy8vIFByaW50cyBQeXRob24gZXF1aXZhbGVudHMgb2YgYWxsIERlc2NyaXB0b3JzIGluIHxmaWxlfC4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludE1lc3NhZ2VEZXNjcmlwdG9ycygpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIFByaW50RGVzY3JpcHRvcigqZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7CisgICAgcHJpbnRlcl8tPlByaW50KCJcbiIpOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdG9yOjpQcmludFNlcnZpY2VEZXNjcmlwdG9ycygpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpOyArK2kpIHsKKyAgICBQcmludFNlcnZpY2VEZXNjcmlwdG9yKCpmaWxlXy0+c2VydmljZShpKSk7CisgIH0KK30KKwordm9pZCBHZW5lcmF0b3I6OlByaW50U2VydmljZXMoKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnNlcnZpY2VfY291bnQoKTsgKytpKSB7CisgICAgUHJpbnRTZXJ2aWNlQ2xhc3MoKmZpbGVfLT5zZXJ2aWNlKGkpKTsKKyAgICBQcmludFNlcnZpY2VTdHViKCpmaWxlXy0+c2VydmljZShpKSk7CisgICAgcHJpbnRlcl8tPlByaW50KCJcbiIpOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdG9yOjpQcmludFNlcnZpY2VEZXNjcmlwdG9yKAorICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbTsKKyAgbVsic2VydmljZV9uYW1lIl0gPSBNb2R1bGVMZXZlbFNlcnZpY2VEZXNjcmlwdG9yTmFtZShkZXNjcmlwdG9yKTsKKyAgbVsibmFtZSJdID0gZGVzY3JpcHRvci5uYW1lKCk7CisgIG1bImZpbGUiXSA9IGtEZXNjcmlwdG9yS2V5OworICBwcmludGVyXy0+UHJpbnQobSwgIiRzZXJ2aWNlX25hbWUkID0gJGZpbGUkLnNlcnZpY2VzX2J5X25hbWVbJyRuYW1lJCddXG4iKTsKK30KKwordm9pZCBHZW5lcmF0b3I6OlByaW50RGVzY3JpcHRvcktleUFuZE1vZHVsZU5hbWUoCisgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgbmFtZSA9IE1vZHVsZUxldmVsU2VydmljZURlc2NyaXB0b3JOYW1lKGRlc2NyaXB0b3IpOworICBpZiAoIXB1cmVfcHl0aG9uX3dvcmthYmxlXykgeworICAgIG5hbWUgPSAiX2Rlc2NyaXB0b3IuU2VydmljZURlc2NyaXB0b3IoZnVsbF9uYW1lPSciICsKKyAgICAgICAgICAgZGVzY3JpcHRvci5mdWxsX25hbWUoKSArICInKSI7CisgIH0KKyAgcHJpbnRlcl8tPlByaW50KCIkZGVzY3JpcHRvcl9rZXkkID0gJGRlc2NyaXB0b3JfbmFtZSQsXG4iLCAiZGVzY3JpcHRvcl9rZXkiLAorICAgICAgICAgICAgICAgICAga0Rlc2NyaXB0b3JLZXksICJkZXNjcmlwdG9yX25hbWUiLCBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgbW9kdWxlX25hbWUgPSBNb2R1bGVOYW1lKGZpbGVfLT5uYW1lKCkpOworICBwcmludGVyXy0+UHJpbnQoIl9fbW9kdWxlX18gPSAnJG1vZHVsZV9uYW1lJCdcbiIsICJtb2R1bGVfbmFtZSIsIG1vZHVsZV9uYW1lKTsKK30KKwordm9pZCBHZW5lcmF0b3I6OlByaW50U2VydmljZUNsYXNzKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIC8vIFByaW50IHRoZSBzZXJ2aWNlLgorICBwcmludGVyXy0+UHJpbnQoCisgICAgICAiJGNsYXNzX25hbWUkID0gc2VydmljZV9yZWZsZWN0aW9uLkdlbmVyYXRlZFNlcnZpY2VUeXBlKCIKKyAgICAgICInJGNsYXNzX25hbWUkJywgKF9zZXJ2aWNlLlNlcnZpY2UsKSwgZGljdChcbiIsCisgICAgICAiY2xhc3NfbmFtZSIsIGRlc2NyaXB0b3IubmFtZSgpKTsKKyAgcHJpbnRlcl8tPkluZGVudCgpOworICBHZW5lcmF0b3I6OlByaW50RGVzY3JpcHRvcktleUFuZE1vZHVsZU5hbWUoZGVzY3JpcHRvcik7CisgIHByaW50ZXJfLT5QcmludCgiKSlcblxuIik7CisgIHByaW50ZXJfLT5PdXRkZW50KCk7Cit9CisKK3ZvaWQgR2VuZXJhdG9yOjpQcmludFNlcnZpY2VTdHViKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIC8vIFByaW50IHRoZSBzZXJ2aWNlIHN0dWIuCisgIHByaW50ZXJfLT5QcmludCgKKyAgICAgICIkY2xhc3NfbmFtZSRfU3R1YiA9ICIKKyAgICAgICJzZXJ2aWNlX3JlZmxlY3Rpb24uR2VuZXJhdGVkU2VydmljZVN0dWJUeXBlKCIKKyAgICAgICInJGNsYXNzX25hbWUkX1N0dWInLCAoJGNsYXNzX25hbWUkLCksIGRpY3QoXG4iLAorICAgICAgImNsYXNzX25hbWUiLCBkZXNjcmlwdG9yLm5hbWUoKSk7CisgIHByaW50ZXJfLT5JbmRlbnQoKTsKKyAgR2VuZXJhdG9yOjpQcmludERlc2NyaXB0b3JLZXlBbmRNb2R1bGVOYW1lKGRlc2NyaXB0b3IpOworICBwcmludGVyXy0+UHJpbnQoIikpXG5cbiIpOworICBwcmludGVyXy0+T3V0ZGVudCgpOworfQorCisvLyBQcmludHMgc3RhdGVtZW50IGFzc2lnbmluZyBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKG1lc3NhZ2VfZGVzY3JpcHRvcikKKy8vIHRvIGEgUHl0aG9uIERlc2NyaXB0b3Igb2JqZWN0IGZvciBtZXNzYWdlX2Rlc2NyaXB0b3IuCisvLworLy8gTXV0dWFsbHkgcmVjdXJzaXZlIHdpdGggUHJpbnROZXN0ZWREZXNjcmlwdG9ycygpLgordm9pZCBHZW5lcmF0b3I6OlByaW50RGVzY3JpcHRvcihjb25zdCBEZXNjcmlwdG9yJiBtZXNzYWdlX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtOworICBtWyJuYW1lIl0gPSBtZXNzYWdlX2Rlc2NyaXB0b3IubmFtZSgpOworICBtWyJmdWxsX25hbWUiXSA9IG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUoKTsKKyAgbVsiZmlsZSJdID0ga0Rlc2NyaXB0b3JLZXk7CisKKyAgUHJpbnROZXN0ZWREZXNjcmlwdG9ycyhtZXNzYWdlX2Rlc2NyaXB0b3IpOworCisgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKKyAgcHJpbnRlcl8tPlByaW50KCIkZGVzY3JpcHRvcl9uYW1lJCA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoXG4iLAorICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3JfbmFtZSIsCisgICAgICAgICAgICAgICAgICBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKG1lc3NhZ2VfZGVzY3JpcHRvcikpOworICBwcmludGVyXy0+SW5kZW50KCk7CisgIGNvbnN0IGNoYXIgcmVxdWlyZWRfZnVuY3Rpb25fYXJndW1lbnRzW10gPQorICAgICAgIm5hbWU9JyRuYW1lJCcsXG4iCisgICAgICAiZnVsbF9uYW1lPSckZnVsbF9uYW1lJCcsXG4iCisgICAgICAiZmlsZW5hbWU9Tm9uZSxcbiIKKyAgICAgICJmaWxlPSRmaWxlJCxcbiIKKyAgICAgICJjb250YWluaW5nX3R5cGU9Tm9uZSxcbiIKKyAgICAgICJjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5LFxuIjsKKyAgcHJpbnRlcl8tPlByaW50KG0sIHJlcXVpcmVkX2Z1bmN0aW9uX2FyZ3VtZW50cyk7CisgIFByaW50RmllbGRzSW5EZXNjcmlwdG9yKG1lc3NhZ2VfZGVzY3JpcHRvcik7CisgIFByaW50RXh0ZW5zaW9uc0luRGVzY3JpcHRvcihtZXNzYWdlX2Rlc2NyaXB0b3IpOworCisgIC8vIE5lc3RlZCB0eXBlcworICBwcmludGVyXy0+UHJpbnQoIm5lc3RlZF90eXBlcz1bIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV9kZXNjcmlwdG9yLm5lc3RlZF90eXBlX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5lc3RlZF9uYW1lID0KKyAgICAgICAgTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgqbWVzc2FnZV9kZXNjcmlwdG9yLm5lc3RlZF90eXBlKGkpKTsKKyAgICBwcmludGVyXy0+UHJpbnQoIiRuYW1lJCwgIiwgIm5hbWUiLCBuZXN0ZWRfbmFtZSk7CisgIH0KKyAgcHJpbnRlcl8tPlByaW50KCJdLFxuIik7CisKKyAgLy8gRW51bSB0eXBlcworICBwcmludGVyXy0+UHJpbnQoImVudW1fdHlwZXM9W1xuIik7CisgIHByaW50ZXJfLT5JbmRlbnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX2Rlc2NyaXB0b3IuZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRlc2NyaXB0b3JfbmFtZSA9CisgICAgICAgIE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoKm1lc3NhZ2VfZGVzY3JpcHRvci5lbnVtX3R5cGUoaSkpOworICAgIHByaW50ZXJfLT5QcmludChkZXNjcmlwdG9yX25hbWUuY19zdHIoKSk7CisgICAgcHJpbnRlcl8tPlByaW50KCIsXG4iKTsKKyAgfQorICBwcmludGVyXy0+T3V0ZGVudCgpOworICBwcmludGVyXy0+UHJpbnQoIl0sXG4iKTsKKyAgc3RkOjpzdHJpbmcgb3B0aW9uc19zdHJpbmc7CisgIG1lc3NhZ2VfZGVzY3JpcHRvci5vcHRpb25zKCkuU2VyaWFsaXplVG9TdHJpbmcoJm9wdGlvbnNfc3RyaW5nKTsKKyAgcHJpbnRlcl8tPlByaW50KAorICAgICAgInNlcmlhbGl6ZWRfb3B0aW9ucz0kb3B0aW9uc192YWx1ZSQsXG4iCisgICAgICAiaXNfZXh0ZW5kYWJsZT0kZXh0ZW5kYWJsZSQsXG4iCisgICAgICAic3ludGF4PSckc3ludGF4JCciLAorICAgICAgIm9wdGlvbnNfdmFsdWUiLCBPcHRpb25zVmFsdWUob3B0aW9uc19zdHJpbmcpLCAiZXh0ZW5kYWJsZSIsCisgICAgICBtZXNzYWdlX2Rlc2NyaXB0b3IuZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwID8gIlRydWUiIDogIkZhbHNlIiwKKyAgICAgICJzeW50YXgiLCBTdHJpbmdpZnlTeW50YXgobWVzc2FnZV9kZXNjcmlwdG9yLmZpbGUoKS0+c3ludGF4KCkpKTsKKyAgcHJpbnRlcl8tPlByaW50KCIsXG4iKTsKKworICAvLyBFeHRlbnNpb24gcmFuZ2VzCisgIHByaW50ZXJfLT5QcmludCgiZXh0ZW5zaW9uX3Jhbmdlcz1bIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV9kZXNjcmlwdG9yLmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UgPQorICAgICAgICBtZXNzYWdlX2Rlc2NyaXB0b3IuZXh0ZW5zaW9uX3JhbmdlKGkpOworICAgIHByaW50ZXJfLT5QcmludCgiKCRzdGFydCQsICRlbmQkKSwgIiwgInN0YXJ0IiwgU3RyQ2F0KHJhbmdlLT5zdGFydCksCisgICAgICAgICAgICAgICAgICAgICJlbmQiLCBTdHJDYXQocmFuZ2UtPmVuZCkpOworICB9CisgIHByaW50ZXJfLT5QcmludCgiXSxcbiIpOworICBwcmludGVyXy0+UHJpbnQoIm9uZW9mcz1bXG4iKTsKKyAgcHJpbnRlcl8tPkluZGVudCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfZGVzY3JpcHRvci5vbmVvZl9kZWNsX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogZGVzYyA9IG1lc3NhZ2VfZGVzY3JpcHRvci5vbmVvZl9kZWNsKGkpOworICAgIG0uY2xlYXIoKTsKKyAgICBtWyJuYW1lIl0gPSBkZXNjLT5uYW1lKCk7CisgICAgbVsiZnVsbF9uYW1lIl0gPSBkZXNjLT5mdWxsX25hbWUoKTsKKyAgICBtWyJpbmRleCJdID0gU3RyQ2F0KGRlc2MtPmluZGV4KCkpOworICAgIG9wdGlvbnNfc3RyaW5nID0gT3B0aW9uc1ZhbHVlKGRlc2MtPm9wdGlvbnMoKS5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgICBpZiAob3B0aW9uc19zdHJpbmcgPT0gIk5vbmUiKSB7CisgICAgICBtWyJzZXJpYWxpemVkX29wdGlvbnMiXSA9ICIiOworICAgIH0gZWxzZSB7CisgICAgICBtWyJzZXJpYWxpemVkX29wdGlvbnMiXSA9ICIsIHNlcmlhbGl6ZWRfb3B0aW9ucz0iICsgb3B0aW9uc19zdHJpbmc7CisgICAgfQorICAgIHByaW50ZXJfLT5QcmludChtLAorICAgICAgICAgICAgICAgICAgICAiX2Rlc2NyaXB0b3IuT25lb2ZEZXNjcmlwdG9yKFxuIgorICAgICAgICAgICAgICAgICAgICAiICBuYW1lPSckbmFtZSQnLCBmdWxsX25hbWU9JyRmdWxsX25hbWUkJyxcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgaW5kZXg9JGluZGV4JCwgY29udGFpbmluZ190eXBlPU5vbmUsXG4iCisgICAgICAgICAgICAgICAgICAgICIgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXksXG4iCisgICAgICAgICAgICAgICAgICAgICJmaWVsZHM9W10kc2VyaWFsaXplZF9vcHRpb25zJCksXG4iKTsKKyAgfQorICBwcmludGVyXy0+T3V0ZGVudCgpOworICBwcmludGVyXy0+UHJpbnQoIl0sXG4iKTsKKworICBwcmludGVyXy0+T3V0ZGVudCgpOworICBwcmludGVyXy0+UHJpbnQoIilcbiIpOworfQorCisvLyBQcmludHMgUHl0aG9uIERlc2NyaXB0b3Igb2JqZWN0cyBmb3IgYWxsIG5lc3RlZCB0eXBlcyBjb250YWluZWQgaW4KKy8vIG1lc3NhZ2VfZGVzY3JpcHRvci4KKy8vCisvLyBNdXR1YWxseSByZWN1cnNpdmUgd2l0aCBQcmludERlc2NyaXB0b3IoKS4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludE5lc3RlZERlc2NyaXB0b3JzKAorICAgIGNvbnN0IERlc2NyaXB0b3ImIGNvbnRhaW5pbmdfZGVzY3JpcHRvcikgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5pbmdfZGVzY3JpcHRvci5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBQcmludERlc2NyaXB0b3IoKmNvbnRhaW5pbmdfZGVzY3JpcHRvci5uZXN0ZWRfdHlwZShpKSk7CisgIH0KK30KKworLy8gUHJpbnRzIGFsbCBtZXNzYWdlcyBpbiB8ZmlsZXwuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRNZXNzYWdlcygpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0b19yZWdpc3RlcjsKKyAgICBQcmludE1lc3NhZ2UoKmZpbGVfLT5tZXNzYWdlX3R5cGUoaSksICIiLCAmdG9fcmVnaXN0ZXIsIGZhbHNlKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHRvX3JlZ2lzdGVyLnNpemUoKTsgKytqKSB7CisgICAgICBwcmludGVyXy0+UHJpbnQoIl9zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKCRuYW1lJClcbiIsICJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlS2V5d29yZCh0b19yZWdpc3RlcltqXSkpOworICAgIH0KKyAgICBwcmludGVyXy0+UHJpbnQoIlxuIik7CisgIH0KK30KKworLy8gUHJpbnRzIGEgUHl0aG9uIGNsYXNzIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSBkZXNjcmlwdG9yLiAgV2UgZGVmZXIgdG8gdGhlCisvLyBtZXRhY2xhc3MgdG8gZG8gYWxtb3N0IGFsbCBvZiB0aGUgd29yayBvZiBhY3R1YWxseSBjcmVhdGluZyBhIHVzZWZ1bCBjbGFzcy4KKy8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gYW5kIGl0cyBtYW55IGhlbHBlciBmdW5jdGlvbnMgYWJvdmUgaXMgbWVyZWx5CisvLyB0byBvdXRwdXQgYSBQeXRob24gdmVyc2lvbiBvZiB0aGUgZGVzY3JpcHRvcnMsIHdoaWNoIHRoZSBtZXRhY2xhc3MgaW4KKy8vIHJlZmxlY3Rpb24ucHkgd2lsbCB1c2UgdG8gY29uc3RydWN0IHRoZSBtZWF0IG9mIHRoZSBjbGFzcyBpdHNlbGYuCisvLworLy8gTXV0dWFsbHkgcmVjdXJzaXZlIHdpdGggUHJpbnROZXN0ZWRNZXNzYWdlcygpLgorLy8gQ29sbGVjdCBuZXN0ZWQgbWVzc2FnZSBuYW1lcyB0b19yZWdpc3RlciBmb3IgdGhlIHN5bWJvbF9kYXRhYmFzZS4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludE1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHRvX3JlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX25lc3RlZCkgY29uc3QgeworICBzdGQ6OnN0cmluZyBxdWFsaWZpZWRfbmFtZTsKKyAgaWYgKGlzX25lc3RlZCkgeworICAgIGlmIChJc1B5dGhvbktleXdvcmQobWVzc2FnZV9kZXNjcmlwdG9yLm5hbWUoKSkpIHsKKyAgICAgIHF1YWxpZmllZF9uYW1lID0KKyAgICAgICAgICAiZ2V0YXR0cigiICsgcHJlZml4ICsgIiwgJyIgKyBtZXNzYWdlX2Rlc2NyaXB0b3IubmFtZSgpICsgIicpIjsKKyAgICB9IGVsc2UgeworICAgICAgcXVhbGlmaWVkX25hbWUgPSBwcmVmaXggKyAiLiIgKyBtZXNzYWdlX2Rlc2NyaXB0b3IubmFtZSgpOworICAgIH0KKyAgICBwcmludGVyXy0+UHJpbnQoCisgICAgICAgICInJG5hbWUkJyA6IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJyRuYW1lJCcsICIKKyAgICAgICAgIihfbWVzc2FnZS5NZXNzYWdlLCksIHtcbiIsCisgICAgICAgICJuYW1lIiwgbWVzc2FnZV9kZXNjcmlwdG9yLm5hbWUoKSk7CisgIH0gZWxzZSB7CisgICAgcXVhbGlmaWVkX25hbWUgPSBSZXNvbHZlS2V5d29yZChtZXNzYWdlX2Rlc2NyaXB0b3IubmFtZSgpKTsKKyAgICBwcmludGVyXy0+UHJpbnQoCisgICAgICAgICIkcXVhbGlmaWVkX25hbWUkID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnJG5hbWUkJywgIgorICAgICAgICAiKF9tZXNzYWdlLk1lc3NhZ2UsKSwge1xuIiwKKyAgICAgICAgInF1YWxpZmllZF9uYW1lIiwgcXVhbGlmaWVkX25hbWUsICJuYW1lIiwgbWVzc2FnZV9kZXNjcmlwdG9yLm5hbWUoKSk7CisgIH0KKyAgcHJpbnRlcl8tPkluZGVudCgpOworCisgIHRvX3JlZ2lzdGVyLT5wdXNoX2JhY2socXVhbGlmaWVkX25hbWUpOworCisgIFByaW50TmVzdGVkTWVzc2FnZXMobWVzc2FnZV9kZXNjcmlwdG9yLCBxdWFsaWZpZWRfbmFtZSwgdG9fcmVnaXN0ZXIpOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG07CisgIG1bImRlc2NyaXB0b3Jfa2V5Il0gPSBrRGVzY3JpcHRvcktleTsKKyAgaWYgKHB1cmVfcHl0aG9uX3dvcmthYmxlXykgeworICAgIG1bImRlc2NyaXB0b3JfbmFtZSJdID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShtZXNzYWdlX2Rlc2NyaXB0b3IpOworICB9IGVsc2UgeworICAgIG1bImRlc2NyaXB0b3JfbmFtZSJdID0gIl9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoZnVsbF9uYW1lPSciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUoKSArICInKSI7CisgIH0KKyAgcHJpbnRlcl8tPlByaW50KG0sICInJGRlc2NyaXB0b3Jfa2V5JCcgOiAkZGVzY3JpcHRvcl9uYW1lJCxcbiIpOworICBzdGQ6OnN0cmluZyBtb2R1bGVfbmFtZSA9IE1vZHVsZU5hbWUoZmlsZV8tPm5hbWUoKSk7CisgIHByaW50ZXJfLT5QcmludCgiJ19fbW9kdWxlX18nIDogJyRtb2R1bGVfbmFtZSQnXG4iLCAibW9kdWxlX25hbWUiLAorICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUpOworICBwcmludGVyXy0+UHJpbnQoIiMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOiRmdWxsX25hbWUkKVxuIiwKKyAgICAgICAgICAgICAgICAgICJmdWxsX25hbWUiLCBtZXNzYWdlX2Rlc2NyaXB0b3IuZnVsbF9uYW1lKCkpOworICBwcmludGVyXy0+UHJpbnQoIn0pXG4iKTsKKyAgcHJpbnRlcl8tPk91dGRlbnQoKTsKK30KKworLy8gUHJpbnRzIGFsbCBuZXN0ZWQgbWVzc2FnZXMgd2l0aGluIHxjb250YWluaW5nX2Rlc2NyaXB0b3J8LgorLy8gTXV0dWFsbHkgcmVjdXJzaXZlIHdpdGggUHJpbnRNZXNzYWdlKCkuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnROZXN0ZWRNZXNzYWdlcygKKyAgICBjb25zdCBEZXNjcmlwdG9yJiBjb250YWluaW5nX2Rlc2NyaXB0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgsCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiB0b19yZWdpc3RlcikgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5pbmdfZGVzY3JpcHRvci5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBwcmludGVyXy0+UHJpbnQoIlxuIik7CisgICAgUHJpbnRNZXNzYWdlKCpjb250YWluaW5nX2Rlc2NyaXB0b3IubmVzdGVkX3R5cGUoaSksIHByZWZpeCwgdG9fcmVnaXN0ZXIsCisgICAgICAgICAgICAgICAgIHRydWUpOworICAgIHByaW50ZXJfLT5QcmludCgiLFxuIik7CisgIH0KK30KKworLy8gUmVjdXJzaXZlbHkgZml4ZXMgZm9yZWlnbiBmaWVsZHMgaW4gYWxsIG5lc3RlZCB0eXBlcyBpbiB8ZGVzY3JpcHRvcnwsIHRoZW4KKy8vIHNldHMgdGhlIG1lc3NhZ2VfdHlwZSBhbmQgZW51bV90eXBlIG9mIGFsbCBtZXNzYWdlIGFuZCBlbnVtIGZpZWxkcyB0byBwb2ludAorLy8gdG8gdGhlaXIgcmVzcGVjdGl2ZSBkZXNjcmlwdG9ycy4KKy8vIEFyZ3M6CisvLyAgIGRlc2NyaXB0b3I6IGRlc2NyaXB0b3IgdG8gcHJpbnQgZmllbGRzIGZvci4KKy8vICAgY29udGFpbmluZ19kZXNjcmlwdG9yOiBpZiBkZXNjcmlwdG9yIGlzIGEgbmVzdGVkIHR5cGUsIHRoaXMgaXMgaXRzCisvLyAgICAgICBjb250YWluaW5nIHR5cGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBhIHJvb3QvdG9wLWxldmVsIHR5cGUuCit2b2lkIEdlbmVyYXRvcjo6Rml4Rm9yZWlnbkZpZWxkc0luRGVzY3JpcHRvcigKKyAgICBjb25zdCBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yLAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfZGVzY3JpcHRvcikgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IubmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgRml4Rm9yZWlnbkZpZWxkc0luRGVzY3JpcHRvcigqZGVzY3JpcHRvci5uZXN0ZWRfdHlwZShpKSwgJmRlc2NyaXB0b3IpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmZpZWxkX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGRfZGVzY3JpcHRvciA9ICpkZXNjcmlwdG9yLmZpZWxkKGkpOworICAgIEZpeEZvcmVpZ25GaWVsZHNJbkZpZWxkKCZkZXNjcmlwdG9yLCBmaWVsZF9kZXNjcmlwdG9yLCAiZmllbGRzX2J5X25hbWUiKTsKKyAgfQorCisgIEZpeENvbnRhaW5pbmdUeXBlSW5EZXNjcmlwdG9yKGRlc2NyaXB0b3IsIGNvbnRhaW5pbmdfZGVzY3JpcHRvcik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvciA9ICpkZXNjcmlwdG9yLmVudW1fdHlwZShpKTsKKyAgICBGaXhDb250YWluaW5nVHlwZUluRGVzY3JpcHRvcihlbnVtX2Rlc2NyaXB0b3IsICZkZXNjcmlwdG9yKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3Iub25lb2ZfZGVjbF9jb3VudCgpOyArK2kpIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG07CisgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZiA9IGRlc2NyaXB0b3Iub25lb2ZfZGVjbChpKTsKKyAgICBtWyJkZXNjcmlwdG9yX25hbWUiXSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcik7CisgICAgbVsib25lb2ZfbmFtZSJdID0gb25lb2YtPm5hbWUoKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG9uZW9mLT5maWVsZF9jb3VudCgpOyArK2opIHsKKyAgICAgIG1bImZpZWxkX25hbWUiXSA9IG9uZW9mLT5maWVsZChqKS0+bmFtZSgpOworICAgICAgcHJpbnRlcl8tPlByaW50KAorICAgICAgICAgIG0sCisgICAgICAgICAgIiRkZXNjcmlwdG9yX25hbWUkLm9uZW9mc19ieV9uYW1lWyckb25lb2ZfbmFtZSQnXS5maWVsZHMuYXBwZW5kKFxuIgorICAgICAgICAgICIgICRkZXNjcmlwdG9yX25hbWUkLmZpZWxkc19ieV9uYW1lWyckZmllbGRfbmFtZSQnXSlcbiIpOworICAgICAgcHJpbnRlcl8tPlByaW50KAorICAgICAgICAgIG0sCisgICAgICAgICAgIiRkZXNjcmlwdG9yX25hbWUkLmZpZWxkc19ieV9uYW1lWyckZmllbGRfbmFtZSQnXS5jb250YWluaW5nX29uZW9mID0gIgorICAgICAgICAgICIkZGVzY3JpcHRvcl9uYW1lJC5vbmVvZnNfYnlfbmFtZVsnJG9uZW9mX25hbWUkJ11cbiIpOworICAgIH0KKyAgfQorfQorCit2b2lkIEdlbmVyYXRvcjo6QWRkTWVzc2FnZVRvRmlsZURlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgeworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG07CisgIG1bImRlc2NyaXB0b3JfbmFtZSJdID0ga0Rlc2NyaXB0b3JLZXk7CisgIG1bIm1lc3NhZ2VfbmFtZSJdID0gZGVzY3JpcHRvci5uYW1lKCk7CisgIG1bIm1lc3NhZ2VfZGVzY3JpcHRvcl9uYW1lIl0gPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKGRlc2NyaXB0b3IpOworICBjb25zdCBjaGFyIGZpbGVfZGVzY3JpcHRvcl90ZW1wbGF0ZVtdID0KKyAgICAgICIkZGVzY3JpcHRvcl9uYW1lJC5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJyRtZXNzYWdlX25hbWUkJ10gPSAiCisgICAgICAiJG1lc3NhZ2VfZGVzY3JpcHRvcl9uYW1lJFxuIjsKKyAgcHJpbnRlcl8tPlByaW50KG0sIGZpbGVfZGVzY3JpcHRvcl90ZW1wbGF0ZSk7Cit9CisKK3ZvaWQgR2VuZXJhdG9yOjpBZGRTZXJ2aWNlVG9GaWxlRGVzY3JpcHRvcigKKyAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgeworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG07CisgIG1bImRlc2NyaXB0b3JfbmFtZSJdID0ga0Rlc2NyaXB0b3JLZXk7CisgIG1bInNlcnZpY2VfbmFtZSJdID0gZGVzY3JpcHRvci5uYW1lKCk7CisgIG1bInNlcnZpY2VfZGVzY3JpcHRvcl9uYW1lIl0gPSBNb2R1bGVMZXZlbFNlcnZpY2VEZXNjcmlwdG9yTmFtZShkZXNjcmlwdG9yKTsKKyAgY29uc3QgY2hhciBmaWxlX2Rlc2NyaXB0b3JfdGVtcGxhdGVbXSA9CisgICAgICAiJGRlc2NyaXB0b3JfbmFtZSQuc2VydmljZXNfYnlfbmFtZVsnJHNlcnZpY2VfbmFtZSQnXSA9ICIKKyAgICAgICIkc2VydmljZV9kZXNjcmlwdG9yX25hbWUkXG4iOworICBwcmludGVyXy0+UHJpbnQobSwgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlKTsKK30KKwordm9pZCBHZW5lcmF0b3I6OkFkZEVudW1Ub0ZpbGVEZXNjcmlwdG9yKAorICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbTsKKyAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBrRGVzY3JpcHRvcktleTsKKyAgbVsiZW51bV9uYW1lIl0gPSBkZXNjcmlwdG9yLm5hbWUoKTsKKyAgbVsiZW51bV9kZXNjcmlwdG9yX25hbWUiXSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcik7CisgIGNvbnN0IGNoYXIgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlW10gPQorICAgICAgIiRkZXNjcmlwdG9yX25hbWUkLmVudW1fdHlwZXNfYnlfbmFtZVsnJGVudW1fbmFtZSQnXSA9ICIKKyAgICAgICIkZW51bV9kZXNjcmlwdG9yX25hbWUkXG4iOworICBwcmludGVyXy0+UHJpbnQobSwgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlKTsKK30KKwordm9pZCBHZW5lcmF0b3I6OkFkZEV4dGVuc2lvblRvRmlsZURlc2NyaXB0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbTsKKyAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBrRGVzY3JpcHRvcktleTsKKyAgbVsiZmllbGRfbmFtZSJdID0gZGVzY3JpcHRvci5uYW1lKCk7CisgIG1bInJlc29sdmVkX25hbWUiXSA9IFJlc29sdmVLZXl3b3JkKGRlc2NyaXB0b3IubmFtZSgpKTsKKyAgY29uc3QgY2hhciBmaWxlX2Rlc2NyaXB0b3JfdGVtcGxhdGVbXSA9CisgICAgICAiJGRlc2NyaXB0b3JfbmFtZSQuZXh0ZW5zaW9uc19ieV9uYW1lWyckZmllbGRfbmFtZSQnXSA9ICIKKyAgICAgICIkcmVzb2x2ZWRfbmFtZSRcbiI7CisgIHByaW50ZXJfLT5QcmludChtLCBmaWxlX2Rlc2NyaXB0b3JfdGVtcGxhdGUpOworfQorCisvLyBTZXRzIGFueSBuZWNlc3NhcnkgbWVzc2FnZV90eXBlIGFuZCBlbnVtX3R5cGUgYXR0cmlidXRlcworLy8gZm9yIHRoZSBQeXRob24gdmVyc2lvbiBvZiB8ZmllbGR8LgorLy8KKy8vIGNvbnRhaW5pbmdfdHlwZSBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGlzIGlzIGEgbW9kdWxlLWxldmVsIGZpZWxkLgorLy8KKy8vIHB5dGhvbl9kaWN0X25hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIFB5dGhvbiBkaWN0IHdoZXJlIHdlIHNob3VsZAorLy8gbG9vayB0aGUgZmllbGQgdXAgaW4gdGhlIGNvbnRhaW5pbmcgdHlwZS4gIChlLmcuLCBmaWVsZHNfYnlfbmFtZQorLy8gb3IgZXh0ZW5zaW9uc19ieV9uYW1lKS4gIFdlIGlnbm9yZSBweXRob25fZGljdF9uYW1lIGlmIGNvbnRhaW5pbmdfdHlwZQorLy8gaXMgTlVMTC4KK3ZvaWQgR2VuZXJhdG9yOjpGaXhGb3JlaWduRmllbGRzSW5GaWVsZCgKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHB5dGhvbl9kaWN0X25hbWUpIGNvbnN0IHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGRfcmVmZXJlbmNpbmdfZXhwcmVzc2lvbiA9CisgICAgICBGaWVsZFJlZmVyZW5jaW5nRXhwcmVzc2lvbihjb250YWluaW5nX3R5cGUsIGZpZWxkLCBweXRob25fZGljdF9uYW1lKTsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtOworICBtWyJmaWVsZF9yZWYiXSA9IGZpZWxkX3JlZmVyZW5jaW5nX2V4cHJlc3Npb247CisgIGNvbnN0IERlc2NyaXB0b3IqIGZvcmVpZ25fbWVzc2FnZV90eXBlID0gZmllbGQubWVzc2FnZV90eXBlKCk7CisgIGlmIChmb3JlaWduX21lc3NhZ2VfdHlwZSkgeworICAgIG1bImZvcmVpZ25fdHlwZSJdID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgqZm9yZWlnbl9tZXNzYWdlX3R5cGUpOworICAgIHByaW50ZXJfLT5QcmludChtLCAiJGZpZWxkX3JlZiQubWVzc2FnZV90eXBlID0gJGZvcmVpZ25fdHlwZSRcbiIpOworICB9CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUgPSBmaWVsZC5lbnVtX3R5cGUoKTsKKyAgaWYgKGVudW1fdHlwZSkgeworICAgIG1bImVudW1fdHlwZSJdID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgqZW51bV90eXBlKTsKKyAgICBwcmludGVyXy0+UHJpbnQobSwgIiRmaWVsZF9yZWYkLmVudW1fdHlwZSA9ICRlbnVtX3R5cGUkXG4iKTsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRoZSBtb2R1bGUtbGV2ZWwgZXhwcmVzc2lvbiBmb3IgdGhlIGdpdmVuIEZpZWxkRGVzY3JpcHRvci4KKy8vIE9ubHkgd29ya3MgZm9yIGZpZWxkcyBpbiB0aGUgLnByb3RvIGZpbGUgdGhpcyBHZW5lcmF0b3IgaXMgZ2VuZXJhdGluZyBmb3IuCisvLworLy8gY29udGFpbmluZ190eXBlIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIHRoaXMgaXMgYSBtb2R1bGUtbGV2ZWwgZmllbGQuCisvLworLy8gcHl0aG9uX2RpY3RfbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgUHl0aG9uIGRpY3Qgd2hlcmUgd2Ugc2hvdWxkCisvLyBsb29rIHRoZSBmaWVsZCB1cCBpbiB0aGUgY29udGFpbmluZyB0eXBlLiAgKGUuZy4sIGZpZWxkc19ieV9uYW1lCisvLyBvciBleHRlbnNpb25zX2J5X25hbWUpLiAgV2UgaWdub3JlIHB5dGhvbl9kaWN0X25hbWUgaWYgY29udGFpbmluZ190eXBlCisvLyBpcyBOVUxMLgorc3RkOjpzdHJpbmcgR2VuZXJhdG9yOjpGaWVsZFJlZmVyZW5jaW5nRXhwcmVzc2lvbigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHB5dGhvbl9kaWN0X25hbWUpIGNvbnN0IHsKKyAgLy8gV2Ugc2hvdWxkIG9ubHkgZXZlciBiZSBsb29raW5nIHVwIGZpZWxkcyBpbiB0aGUgY3VycmVudCBmaWxlLgorICAvLyBUaGUgb25seSB0aGluZ3Mgd2UgcmVmZXIgdG8gZnJvbSBvdGhlciBmaWxlcyBhcmUgbWVzc2FnZSBkZXNjcmlwdG9ycy4KKyAgR09PR0xFX0NIRUNLX0VRKGZpZWxkLmZpbGUoKSwgZmlsZV8pCisgICAgICA8PCBmaWVsZC5maWxlKCktPm5hbWUoKSA8PCAiIHZzLiAiIDw8IGZpbGVfLT5uYW1lKCk7CisgIGlmICghY29udGFpbmluZ190eXBlKSB7CisgICAgcmV0dXJuIFJlc29sdmVLZXl3b3JkKGZpZWxkLm5hbWUoKSk7CisgIH0KKyAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoIiQwLiQxWyckMiddIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgqY29udGFpbmluZ190eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHl0aG9uX2RpY3RfbmFtZSwgZmllbGQubmFtZSgpKTsKK30KKworLy8gUHJpbnRzIGNvbnRhaW5pbmdfdHlwZSBmb3IgbmVzdGVkIGRlc2NyaXB0b3JzIG9yIGVudW0gZGVzY3JpcHRvcnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclQ+Cit2b2lkIEdlbmVyYXRvcjo6Rml4Q29udGFpbmluZ1R5cGVJbkRlc2NyaXB0b3IoCisgICAgY29uc3QgRGVzY3JpcHRvclQmIGRlc2NyaXB0b3IsCisgICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ19kZXNjcmlwdG9yKSBjb25zdCB7CisgIGlmIChjb250YWluaW5nX2Rlc2NyaXB0b3IgIT0gbnVsbHB0cikgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5lc3RlZF9uYW1lID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShkZXNjcmlwdG9yKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwYXJlbnRfbmFtZSA9CisgICAgICAgIE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoKmNvbnRhaW5pbmdfZGVzY3JpcHRvcik7CisgICAgcHJpbnRlcl8tPlByaW50KCIkbmVzdGVkX25hbWUkLmNvbnRhaW5pbmdfdHlwZSA9ICRwYXJlbnRfbmFtZSRcbiIsCisgICAgICAgICAgICAgICAgICAgICJuZXN0ZWRfbmFtZSIsIG5lc3RlZF9uYW1lLCAicGFyZW50X25hbWUiLCBwYXJlbnRfbmFtZSk7CisgIH0KK30KKworLy8gUHJpbnRzIHN0YXRlbWVudHMgc2V0dGluZyB0aGUgbWVzc2FnZV90eXBlIGFuZCBlbnVtX3R5cGUgZmllbGRzIGluIHRoZQorLy8gUHl0aG9uIGRlc2NyaXB0b3Igb2JqZWN0cyB3ZSd2ZSBhbHJlYWR5IG91dHB1dCBpbiB0aGUgZmlsZS4gIFdlIG11c3QKKy8vIGRvIHRoaXMgaW4gYSBzZXBhcmF0ZSBzdGVwIGR1ZSB0byBjaXJjdWxhciByZWZlcmVuY2VzIChvdGhlcndpc2UsIHdlJ2QKKy8vIGp1c3Qgc2V0IGV2ZXJ5dGhpbmcgaW4gdGhlIGluaXRpYWwgYXNzaWdubWVudCBzdGF0ZW1lbnRzKS4KK3ZvaWQgR2VuZXJhdG9yOjpGaXhGb3JlaWduRmllbGRzSW5EZXNjcmlwdG9ycygpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIEZpeEZvcmVpZ25GaWVsZHNJbkRlc2NyaXB0b3IoKmZpbGVfLT5tZXNzYWdlX3R5cGUoaSksIG51bGxwdHIpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBBZGRNZXNzYWdlVG9GaWxlRGVzY3JpcHRvcigqZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIEFkZEVudW1Ub0ZpbGVEZXNjcmlwdG9yKCpmaWxlXy0+ZW51bV90eXBlKGkpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5leHRlbnNpb25fY291bnQoKTsgKytpKSB7CisgICAgQWRkRXh0ZW5zaW9uVG9GaWxlRGVzY3JpcHRvcigqZmlsZV8tPmV4dGVuc2lvbihpKSk7CisgIH0KKworICAvLyBUT0RPKGppZWx1byk6IE1vdmUgdGhpcyByZWdpc3RlciB0byBQcmludEZpbGVEZXNjcmlwdG9yKCkgd2hlbgorICAvLyBGaWVsZERlc2NyaXB0b3IuZmlsZSBpcyBhZGRlZCBpbiBnZW5lcmF0ZWQgZmlsZS4KKyAgcHJpbnRlcl8tPlByaW50KCJfc3ltX2RiLlJlZ2lzdGVyRmlsZURlc2NyaXB0b3IoJG5hbWUkKVxuIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAga0Rlc2NyaXB0b3JLZXkpOworICBwcmludGVyXy0+UHJpbnQoIlxuIik7Cit9CisKKy8vIFdlIG5lZWQgdG8gbm90IG9ubHkgc2V0IGFueSBuZWNlc3NhcnkgbWVzc2FnZV90eXBlIGZpZWxkcywgYnV0CisvLyBhbHNvIG5lZWQgdG8gY2FsbCBSZWdpc3RlckV4dGVuc2lvbigpIG9uIGVhY2ggbWVzc2FnZSB3ZSdyZQorLy8gZXh0ZW5kaW5nLgordm9pZCBHZW5lcmF0b3I6OkZpeEZvcmVpZ25GaWVsZHNJbkV4dGVuc2lvbnMoKSBjb25zdCB7CisgIC8vIFRvcC1sZXZlbCBleHRlbnNpb25zLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5leHRlbnNpb25fY291bnQoKTsgKytpKSB7CisgICAgRml4Rm9yZWlnbkZpZWxkc0luRXh0ZW5zaW9uKCpmaWxlXy0+ZXh0ZW5zaW9uKGkpKTsKKyAgfQorICAvLyBOZXN0ZWQgZXh0ZW5zaW9ucy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIEZpeEZvcmVpZ25GaWVsZHNJbk5lc3RlZEV4dGVuc2lvbnMoKmZpbGVfLT5tZXNzYWdlX3R5cGUoaSkpOworICB9CisgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKK30KKwordm9pZCBHZW5lcmF0b3I6OkZpeEZvcmVpZ25GaWVsZHNJbkV4dGVuc2lvbigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGV4dGVuc2lvbl9maWVsZCkgY29uc3QgeworICBHT09HTEVfQ0hFQ0soZXh0ZW5zaW9uX2ZpZWxkLmlzX2V4dGVuc2lvbigpKTsKKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG07CisgIC8vIENvbmZ1c2luZ2x5LCBmb3IgRmllbGREZXNjcmlwdG9ycyB0aGF0IGhhcHBlbiB0byBiZSBleHRlbnNpb25zLAorICAvLyBjb250YWluaW5nX3R5cGUoKSBtZWFucyAiZXh0ZW5kZWQgdHlwZS4iCisgIC8vIE9uIHRoZSBvdGhlciBoYW5kLCBleHRlbnNpb25fc2NvcGUoKSB3aWxsIGdpdmUgdXMgd2hhdCB3ZSBub3JtYWxseQorICAvLyBtZWFuIGJ5IGNvbnRhaW5pbmdfdHlwZSgpLgorICBtWyJleHRlbmRlZF9tZXNzYWdlX2NsYXNzIl0gPQorICAgICAgTW9kdWxlTGV2ZWxNZXNzYWdlTmFtZSgqZXh0ZW5zaW9uX2ZpZWxkLmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgbVsiZmllbGQiXSA9IEZpZWxkUmVmZXJlbmNpbmdFeHByZXNzaW9uKAorICAgICAgZXh0ZW5zaW9uX2ZpZWxkLmV4dGVuc2lvbl9zY29wZSgpLCBleHRlbnNpb25fZmllbGQsICJleHRlbnNpb25zX2J5X25hbWUiKTsKKyAgcHJpbnRlcl8tPlByaW50KG0sICIkZXh0ZW5kZWRfbWVzc2FnZV9jbGFzcyQuUmVnaXN0ZXJFeHRlbnNpb24oJGZpZWxkJClcbiIpOworfQorCit2b2lkIEdlbmVyYXRvcjo6Rml4Rm9yZWlnbkZpZWxkc0luTmVzdGVkRXh0ZW5zaW9ucygKKyAgICBjb25zdCBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIC8vIFJlY3Vyc2l2ZWx5IGZpeCB1cCBleHRlbnNpb25zIGluIGFsbCBuZXN0ZWQgdHlwZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBGaXhGb3JlaWduRmllbGRzSW5OZXN0ZWRFeHRlbnNpb25zKCpkZXNjcmlwdG9yLm5lc3RlZF90eXBlKGkpKTsKKyAgfQorICAvLyBGaXggdXAgZXh0ZW5zaW9ucyBkaXJlY3RseSBjb250YWluZWQgd2l0aGluIHRoaXMgdHlwZS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKKyAgICBGaXhGb3JlaWduRmllbGRzSW5FeHRlbnNpb24oKmRlc2NyaXB0b3IuZXh0ZW5zaW9uKGkpKTsKKyAgfQorfQorCisvLyBSZXR1cm5zIGEgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBpbnN0YW50aWF0ZXMgYSBQeXRob24gRW51bVZhbHVlRGVzY3JpcHRvcgorLy8gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gQysrIGRlc2NyaXB0b3IuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRFbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKKyAgLy8gVE9ETyhyb2JpbnNvbik6IEZpeCB1cCBFbnVtVmFsdWVEZXNjcmlwdG9yICJ0eXBlIiBmaWVsZHMuCisgIC8vIE1vcmUgY2lyY3VsYXIgcmVmZXJlbmNlcy4gIDo6c2lnaDo6CisgIHN0ZDo6c3RyaW5nIG9wdGlvbnNfc3RyaW5nOworICBkZXNjcmlwdG9yLm9wdGlvbnMoKS5TZXJpYWxpemVUb1N0cmluZygmb3B0aW9uc19zdHJpbmcpOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG07CisgIG1bIm5hbWUiXSA9IGRlc2NyaXB0b3IubmFtZSgpOworICBtWyJpbmRleCJdID0gU3RyQ2F0KGRlc2NyaXB0b3IuaW5kZXgoKSk7CisgIG1bIm51bWJlciJdID0gU3RyQ2F0KGRlc2NyaXB0b3IubnVtYmVyKCkpOworICBtWyJvcHRpb25zIl0gPSBPcHRpb25zVmFsdWUob3B0aW9uc19zdHJpbmcpOworICBwcmludGVyXy0+UHJpbnQobSwKKyAgICAgICAgICAgICAgICAgICJfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKFxuIgorICAgICAgICAgICAgICAgICAgIiAgbmFtZT0nJG5hbWUkJywgaW5kZXg9JGluZGV4JCwgbnVtYmVyPSRudW1iZXIkLFxuIgorICAgICAgICAgICAgICAgICAgIiAgc2VyaWFsaXplZF9vcHRpb25zPSRvcHRpb25zJCxcbiIKKyAgICAgICAgICAgICAgICAgICIgIHR5cGU9Tm9uZSxcbiIKKyAgICAgICAgICAgICAgICAgICIgIGNyZWF0ZV9rZXk9X2Rlc2NyaXB0b3IuX2ludGVybmFsX2NyZWF0ZV9rZXkpIik7Cit9CisKKy8vIFJldHVybnMgYSBDRXNjYXBlZCBzdHJpbmcgb2Ygc2VyaWFsaXplZF9vcHRpb25zLgorc3RkOjpzdHJpbmcgR2VuZXJhdG9yOjpPcHRpb25zVmFsdWUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRfb3B0aW9ucykgY29uc3QgeworICBpZiAoc2VyaWFsaXplZF9vcHRpb25zLmxlbmd0aCgpID09IDAgfHwgR2VuZXJhdGluZ0Rlc2NyaXB0b3JQcm90bygpKSB7CisgICAgcmV0dXJuICJOb25lIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gImInIiArIENFc2NhcGUoc2VyaWFsaXplZF9vcHRpb25zKSArICInIjsKKyAgfQorfQorCisvLyBQcmludHMgYW4gZXhwcmVzc2lvbiBmb3IgYSBQeXRob24gRmllbGREZXNjcmlwdG9yIGZvciB8ZmllbGR8Lgordm9pZCBHZW5lcmF0b3I6OlByaW50RmllbGREZXNjcmlwdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leHRlbnNpb24pIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgb3B0aW9uc19zdHJpbmc7CisgIGZpZWxkLm9wdGlvbnMoKS5TZXJpYWxpemVUb1N0cmluZygmb3B0aW9uc19zdHJpbmcpOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG07CisgIG1bIm5hbWUiXSA9IGZpZWxkLm5hbWUoKTsKKyAgbVsiZnVsbF9uYW1lIl0gPSBmaWVsZC5mdWxsX25hbWUoKTsKKyAgbVsiaW5kZXgiXSA9IFN0ckNhdChmaWVsZC5pbmRleCgpKTsKKyAgbVsibnVtYmVyIl0gPSBTdHJDYXQoZmllbGQubnVtYmVyKCkpOworICBtWyJ0eXBlIl0gPSBTdHJDYXQoZmllbGQudHlwZSgpKTsKKyAgbVsiY3BwX3R5cGUiXSA9IFN0ckNhdChmaWVsZC5jcHBfdHlwZSgpKTsKKyAgbVsibGFiZWwiXSA9IFN0ckNhdChmaWVsZC5sYWJlbCgpKTsKKyAgbVsiaGFzX2RlZmF1bHRfdmFsdWUiXSA9IGZpZWxkLmhhc19kZWZhdWx0X3ZhbHVlKCkgPyAiVHJ1ZSIgOiAiRmFsc2UiOworICBtWyJkZWZhdWx0X3ZhbHVlIl0gPSBTdHJpbmdpZnlEZWZhdWx0VmFsdWUoZmllbGQpOworICBtWyJpc19leHRlbnNpb24iXSA9IGlzX2V4dGVuc2lvbiA/ICJUcnVlIiA6ICJGYWxzZSI7CisgIG1bInNlcmlhbGl6ZWRfb3B0aW9ucyJdID0gT3B0aW9uc1ZhbHVlKG9wdGlvbnNfc3RyaW5nKTsKKyAgbVsianNvbl9uYW1lIl0gPQorICAgICAgZmllbGQuaGFzX2pzb25fbmFtZSgpID8gIiwganNvbl9uYW1lPSciICsgZmllbGQuanNvbl9uYW1lKCkgKyAiJyIgOiAiIjsKKyAgLy8gV2UgYWx3YXlzIHNldCBtZXNzYWdlX3R5cGUgYW5kIGVudW1fdHlwZSB0byBOb25lIGF0IHRoaXMgcG9pbnQsIGFuZCB0aGVuCisgIC8vIHRoZXNlIGZpZWxkcyBpbiBjb3JyZWN0bHkgYWZ0ZXIgYWxsIHJlZmVyZW5jZWQgZGVzY3JpcHRvcnMgaGF2ZSBiZWVuCisgIC8vIGRlZmluZWQgYW5kL29yIGltcG9ydGVkIChzZWUgRml4Rm9yZWlnbkZpZWxkc0luRGVzY3JpcHRvcnMoKSkuCisgIGNvbnN0IGNoYXIgZmllbGRfZGVzY3JpcHRvcl9kZWNsW10gPQorICAgICAgIl9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcihcbiIKKyAgICAgICIgIG5hbWU9JyRuYW1lJCcsIGZ1bGxfbmFtZT0nJGZ1bGxfbmFtZSQnLCBpbmRleD0kaW5kZXgkLFxuIgorICAgICAgIiAgbnVtYmVyPSRudW1iZXIkLCB0eXBlPSR0eXBlJCwgY3BwX3R5cGU9JGNwcF90eXBlJCwgbGFiZWw9JGxhYmVsJCxcbiIKKyAgICAgICIgIGhhc19kZWZhdWx0X3ZhbHVlPSRoYXNfZGVmYXVsdF92YWx1ZSQsICIKKyAgICAgICJkZWZhdWx0X3ZhbHVlPSRkZWZhdWx0X3ZhbHVlJCxcbiIKKyAgICAgICIgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsXG4iCisgICAgICAiICBpc19leHRlbnNpb249JGlzX2V4dGVuc2lvbiQsIGV4dGVuc2lvbl9zY29wZT1Ob25lLFxuIgorICAgICAgIiAgc2VyaWFsaXplZF9vcHRpb25zPSRzZXJpYWxpemVkX29wdGlvbnMkJGpzb25fbmFtZSQsIGZpbGU9REVTQ1JJUFRPUiwiCisgICAgICAiICBjcmVhdGVfa2V5PV9kZXNjcmlwdG9yLl9pbnRlcm5hbF9jcmVhdGVfa2V5KSI7CisgIHByaW50ZXJfLT5QcmludChtLCBmaWVsZF9kZXNjcmlwdG9yX2RlY2wpOworfQorCisvLyBIZWxwZXIgZm9yIFByaW50e0ZpZWxkcyxFeHRlbnNpb25zfUluRGVzY3JpcHRvcigpLgordm9pZCBHZW5lcmF0b3I6OlByaW50RmllbGREZXNjcmlwdG9yc0luRGVzY3JpcHRvcigKKyAgICBjb25zdCBEZXNjcmlwdG9yJiBtZXNzYWdlX2Rlc2NyaXB0b3IsIGJvb2wgaXNfZXh0ZW5zaW9uLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaXN0X3ZhcmlhYmxlX25hbWUsIGludCAoRGVzY3JpcHRvcjo6KkNvdW50Rm4pKCkgY29uc3QsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiAoRGVzY3JpcHRvcjo6KkdldHRlckZuKShpbnQpY29uc3QpIGNvbnN0IHsKKyAgcHJpbnRlcl8tPlByaW50KCIkbGlzdCQ9W1xuIiwgImxpc3QiLCBsaXN0X3ZhcmlhYmxlX25hbWUpOworICBwcmludGVyXy0+SW5kZW50KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgKG1lc3NhZ2VfZGVzY3JpcHRvci4qQ291bnRGbikoKTsgKytpKSB7CisgICAgUHJpbnRGaWVsZERlc2NyaXB0b3IoKihtZXNzYWdlX2Rlc2NyaXB0b3IuKkdldHRlckZuKShpKSwgaXNfZXh0ZW5zaW9uKTsKKyAgICBwcmludGVyXy0+UHJpbnQoIixcbiIpOworICB9CisgIHByaW50ZXJfLT5PdXRkZW50KCk7CisgIHByaW50ZXJfLT5QcmludCgiXSxcbiIpOworfQorCisvLyBQcmludHMgYSBzdGF0ZW1lbnQgYXNzaWduaW5nICJmaWVsZHMiIHRvIGEgbGlzdCBvZiBQeXRob24gRmllbGREZXNjcmlwdG9ycywKKy8vIG9uZSBmb3IgZWFjaCBmaWVsZCBwcmVzZW50IGluIG1lc3NhZ2VfZGVzY3JpcHRvci4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludEZpZWxkc0luRGVzY3JpcHRvcigKKyAgICBjb25zdCBEZXNjcmlwdG9yJiBtZXNzYWdlX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgY29uc3QgYm9vbCBpc19leHRlbnNpb24gPSBmYWxzZTsKKyAgUHJpbnRGaWVsZERlc2NyaXB0b3JzSW5EZXNjcmlwdG9yKG1lc3NhZ2VfZGVzY3JpcHRvciwgaXNfZXh0ZW5zaW9uLCAiZmllbGRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEZXNjcmlwdG9yOjpmaWVsZF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEZXNjcmlwdG9yOjpmaWVsZCk7Cit9CisKKy8vIFByaW50cyBhIHN0YXRlbWVudCBhc3NpZ25pbmcgImV4dGVuc2lvbnMiIHRvIGEgbGlzdCBvZiBQeXRob24KKy8vIEZpZWxkRGVzY3JpcHRvcnMsIG9uZSBmb3IgZWFjaCBleHRlbnNpb24gcHJlc2VudCBpbiBtZXNzYWdlX2Rlc2NyaXB0b3IuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRFeHRlbnNpb25zSW5EZXNjcmlwdG9yKAorICAgIGNvbnN0IERlc2NyaXB0b3ImIG1lc3NhZ2VfZGVzY3JpcHRvcikgY29uc3QgeworICBjb25zdCBib29sIGlzX2V4dGVuc2lvbiA9IHRydWU7CisgIFByaW50RmllbGREZXNjcmlwdG9yc0luRGVzY3JpcHRvcihtZXNzYWdlX2Rlc2NyaXB0b3IsIGlzX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnNpb25zIiwgJkRlc2NyaXB0b3I6OmV4dGVuc2lvbl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEZXNjcmlwdG9yOjpleHRlbnNpb24pOworfQorCitib29sIEdlbmVyYXRvcjo6R2VuZXJhdGluZ0Rlc2NyaXB0b3JQcm90bygpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGVfLT5uYW1lKCkgPT0gIm5ldC9wcm90bzIvcHJvdG8vZGVzY3JpcHRvci5wcm90byIgfHwKKyAgICAgICAgIGZpbGVfLT5uYW1lKCkgPT0gImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKK30KKworLy8gUmV0dXJucyB0aGUgdW5pcXVlIFB5dGhvbiBtb2R1bGUtbGV2ZWwgaWRlbnRpZmllciBnaXZlbiB0byBhIGRlc2NyaXB0b3IuCisvLyBUaGlzIG5hbWUgaXMgbW9kdWxlLXF1YWxpZmllZCBpZmYgdGhlIGdpdmVuIGRlc2NyaXB0b3IgZGVzY3JpYmVzIGFuCisvLyBlbnRpdHkgdGhhdCBkb2Vzbid0IGNvbWUgZnJvbSB0aGUgY3VycmVudCBmaWxlLgordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUPgorc3RkOjpzdHJpbmcgR2VuZXJhdG9yOjpNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKAorICAgIGNvbnN0IERlc2NyaXB0b3JUJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIC8vIEZJWE1FKHJvYmluc29uKToKKyAgLy8gV2UgY3VycmVudGx5IGRvbid0IHdvcnJ5IGFib3V0IGNvbGxpc2lvbnMgd2l0aCB1bmRlcnNjb3JlcyBpbiB0aGUgdHlwZQorICAvLyBuYW1lcywgc28gdGhlc2Ugd291bGQgY29sbGlkZSBpbiBuYXN0eSB3YXlzIGlmIGZvdW5kIGluIHRoZSBzYW1lIGZpbGU6CisgIC8vICAgT3V0ZXJQcm90by5Qcm90b0EuUHJvdG9CCisgIC8vICAgT3V0ZXJQcm90b19Qcm90b0EuUHJvdG9CICAjIFVuZGVyc2NvcmUgaW5zdGVhZCBvZiBwZXJpb2QuCisgIC8vIEFzIHdvdWxkIHRoZXNlOgorICAvLyAgIE91dGVyUHJvdG8uUHJvdG9BXy5Qcm90b0IKKyAgLy8gICBPdXRlclByb3RvLlByb3RvQS5fUHJvdG9CICAjIExlYWRpbmcgdnMuIHRyYWlsaW5nIHVuZGVyc2NvcmUuCisgIC8vIChDb250cml2ZWQsIGJ1dCBjZXJ0YWlubHkgcG9zc2libGUpLgorICAvLworICAvLyBUaGUgQysrIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgZ3VhcmQgYWdhaW5zdCB0aGlzIGVpdGhlci4gIExlYXZpbmcKKyAgLy8gaXQgZm9yIG5vdy4uLgorICBzdGQ6OnN0cmluZyBuYW1lID0gTmFtZVByZWZpeGVkV2l0aE5lc3RlZFR5cGVzKGRlc2NyaXB0b3IsICJfIik7CisgIFRvVXBwZXIoJm5hbWUpOworICAvLyBNb2R1bGUtcHJpdmF0ZSBmb3Igbm93LiAgRWFzeSB0byBtYWtlIHB1YmxpYyBsYXRlcjsgYWxtb3N0IGltcG9zc2libGUKKyAgLy8gdG8gbWFrZSBwcml2YXRlIGxhdGVyLgorICBuYW1lID0gIl8iICsgbmFtZTsKKyAgLy8gV2Ugbm93IGhhdmUgdGhlIG5hbWUgcmVsYXRpdmUgdG8gaXRzIG93biBtb2R1bGUuICBBbHNvIHF1YWxpZnkgd2l0aAorICAvLyB0aGUgbW9kdWxlIG5hbWUgaWZmIHRoaXMgZGVzY3JpcHRvciBpcyBmcm9tIGEgZGlmZmVyZW50IC5wcm90byBmaWxlLgorICBpZiAoZGVzY3JpcHRvci5maWxlKCkgIT0gZmlsZV8pIHsKKyAgICBuYW1lID0gTW9kdWxlQWxpYXMoZGVzY3JpcHRvci5maWxlKCktPm5hbWUoKSkgKyAiLiIgKyBuYW1lOworICB9CisgIHJldHVybiBuYW1lOworfQorCisvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGNsYXNzIGl0c2VsZiwgbm90IHRoZSBkZXNjcmlwdG9yLgorLy8gTGlrZSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKCksIG1vZHVsZS1xdWFsaWZpZXMgdGhlIG5hbWUgaWZmCisvLyB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBkZXNjcmliZXMgYW4gZW50aXR5IHRoYXQgZG9lc24ndCBjb21lIGZyb20KKy8vIHRoZSBjdXJyZW50IGZpbGUuCitzdGQ6OnN0cmluZyBHZW5lcmF0b3I6Ok1vZHVsZUxldmVsTWVzc2FnZU5hbWUoCisgICAgY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgeworICBzdGQ6OnN0cmluZyBuYW1lID0gTmFtZVByZWZpeGVkV2l0aE5lc3RlZFR5cGVzKGRlc2NyaXB0b3IsICIuIik7CisgIGlmIChkZXNjcmlwdG9yLmZpbGUoKSAhPSBmaWxlXykgeworICAgIG5hbWUgPSBNb2R1bGVBbGlhcyhkZXNjcmlwdG9yLmZpbGUoKS0+bmFtZSgpKSArICIuIiArIG5hbWU7CisgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisKKy8vIFJldHVybnMgdGhlIHVuaXF1ZSBQeXRob24gbW9kdWxlLWxldmVsIGlkZW50aWZpZXIgZ2l2ZW4gdG8gYSBzZXJ2aWNlCisvLyBkZXNjcmlwdG9yLgorc3RkOjpzdHJpbmcgR2VuZXJhdG9yOjpNb2R1bGVMZXZlbFNlcnZpY2VEZXNjcmlwdG9yTmFtZSgKKyAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgeworICBzdGQ6OnN0cmluZyBuYW1lID0gZGVzY3JpcHRvci5uYW1lKCk7CisgIFRvVXBwZXIoJm5hbWUpOworICBuYW1lID0gIl8iICsgbmFtZTsKKyAgaWYgKGRlc2NyaXB0b3IuZmlsZSgpICE9IGZpbGVfKSB7CisgICAgbmFtZSA9IE1vZHVsZUFsaWFzKGRlc2NyaXB0b3IuZmlsZSgpLT5uYW1lKCkpICsgIi4iICsgbmFtZTsKKyAgfQorICByZXR1cm4gbmFtZTsKK30KKworLy8gUHJpbnRzIHN0YW5kYXJkIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBzZXJpYWxpemVkX3N0YXJ0IGFuZCBzZXJpYWxpemVkX2VuZC4KKy8vIEFyZ3M6CisvLyAgIGRlc2NyaXB0b3I6IFRoZSBjcHAgZGVzY3JpcHRvciB0byBoYXZlIGEgc2VyaWFsaXplZCByZWZlcmVuY2UuCisvLyAgIHByb3RvOiBBIHByb3RvCisvLyBFeGFtcGxlIHByaW50ZXIgb3V0cHV0OgorLy8gc2VyaWFsaXplZF9zdGFydD00MSwKKy8vIHNlcmlhbGl6ZWRfZW5kPTQzLAorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXNjcmlwdG9yVCwgdHlwZW5hbWUgRGVzY3JpcHRvclByb3RvVD4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludFNlcmlhbGl6ZWRQYkludGVydmFsKGNvbnN0IERlc2NyaXB0b3JUJiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvVCYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3QgeworICBkZXNjcmlwdG9yLkNvcHlUbygmcHJvdG8pOworICBzdGQ6OnN0cmluZyBzcDsKKyAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJnNwKTsKKyAgaW50IG9mZnNldCA9IGZpbGVfZGVzY3JpcHRvcl9zZXJpYWxpemVkXy5maW5kKHNwKTsKKyAgR09PR0xFX0NIRUNLX0dFKG9mZnNldCwgMCk7CisKKyAgcHJpbnRlcl8tPlByaW50KAorICAgICAgIiRuYW1lJC5fc2VyaWFsaXplZF9zdGFydD0kc2VyaWFsaXplZF9zdGFydCRcbiIKKyAgICAgICIkbmFtZSQuX3NlcmlhbGl6ZWRfZW5kPSRzZXJpYWxpemVkX2VuZCRcbiIsCisgICAgICAibmFtZSIsIG5hbWUsICJzZXJpYWxpemVkX3N0YXJ0IiwgU3RyQ2F0KG9mZnNldCksICJzZXJpYWxpemVkX2VuZCIsCisgICAgICBTdHJDYXQob2Zmc2V0ICsgc3Auc2l6ZSgpKSk7Cit9CisKK25hbWVzcGFjZSB7Cit2b2lkIFByaW50RGVzY3JpcHRvck9wdGlvbnNGaXhpbmdDb2RlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gUmVzZXQgdGhlIF9vcHRpb25zIHRvIE5vbmUgdGh1cyBEZXNjcmlwdG9yQmFzZS5HZXRPcHRpb25zKCkgY2FuCisgIC8vIHBhcnNlIF9vcHRpb25zIGFnYWluIGFmdGVyIGV4dGVuc2lvbnMgYXJlIHJlZ2lzdGVyZWQuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIiRkZXNjcmlwdG9yJC5fb3B0aW9ucyA9IE5vbmVcbiIKKyAgICAgICIkZGVzY3JpcHRvciQuX3NlcmlhbGl6ZWRfb3B0aW9ucyA9ICRzZXJpYWxpemVkX3ZhbHVlJFxuIiwKKyAgICAgICJkZXNjcmlwdG9yIiwgZGVzY3JpcHRvciwgInNlcmlhbGl6ZWRfdmFsdWUiLCBvcHRpb25zKTsKK30KK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIEdlbmVyYXRvcjo6U2V0U2VyaWFsaXplZFBiSW50ZXJ2YWwoKSBjb25zdCB7CisgIC8vIFRvcCBsZXZlbCBlbnVtcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIEVudW1EZXNjcmlwdG9yUHJvdG8gcHJvdG87CisgICAgY29uc3QgRW51bURlc2NyaXB0b3ImIGRlc2NyaXB0b3IgPSAqZmlsZV8tPmVudW1fdHlwZShpKTsKKyAgICBQcmludFNlcmlhbGl6ZWRQYkludGVydmFsKGRlc2NyaXB0b3IsIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShkZXNjcmlwdG9yKSk7CisgIH0KKworICAvLyBNZXNzYWdlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIFNldE1lc3NhZ2VQYkludGVydmFsKCpmaWxlXy0+bWVzc2FnZV90eXBlKGkpKTsKKyAgfQorCisgIC8vIFNlcnZpY2VzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5zZXJ2aWNlX2NvdW50KCk7ICsraSkgeworICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gcHJvdG87CisgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3ImIHNlcnZpY2UgPSAqZmlsZV8tPnNlcnZpY2UoaSk7CisgICAgUHJpbnRTZXJpYWxpemVkUGJJbnRlcnZhbChzZXJ2aWNlLCBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUxldmVsU2VydmljZURlc2NyaXB0b3JOYW1lKHNlcnZpY2UpKTsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRvcjo6U2V0TWVzc2FnZVBiSW50ZXJ2YWwoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgeworICBEZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV9wcm90bzsKKyAgUHJpbnRTZXJpYWxpemVkUGJJbnRlcnZhbChkZXNjcmlwdG9yLCBtZXNzYWdlX3Byb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcikpOworCisgIC8vIE5lc3RlZCBtZXNzYWdlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLm5lc3RlZF90eXBlX2NvdW50KCk7ICsraSkgeworICAgIFNldE1lc3NhZ2VQYkludGVydmFsKCpkZXNjcmlwdG9yLm5lc3RlZF90eXBlKGkpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgRW51bURlc2NyaXB0b3JQcm90byBwcm90bzsKKyAgICBjb25zdCBFbnVtRGVzY3JpcHRvciYgZW51bV9kZXMgPSAqZGVzY3JpcHRvci5lbnVtX3R5cGUoaSk7CisgICAgUHJpbnRTZXJpYWxpemVkUGJJbnRlcnZhbChlbnVtX2RlcywgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKGVudW1fZGVzKSk7CisgIH0KK30KKworLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZpZWxkIG9mIGFsbCBkZXNjcmlwdG9ycy4KK3ZvaWQgR2VuZXJhdG9yOjpGaXhBbGxEZXNjcmlwdG9yT3B0aW9ucygpIGNvbnN0IHsKKyAgLy8gUHJpbnRzIGFuIGV4cHJlc3Npb24gdGhhdCBzZXRzIHRoZSBmaWxlIGRlc2NyaXB0b3IncyBvcHRpb25zLgorICBzdGQ6OnN0cmluZyBmaWxlX29wdGlvbnMgPSBPcHRpb25zVmFsdWUoZmlsZV8tPm9wdGlvbnMoKS5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgaWYgKGZpbGVfb3B0aW9ucyAhPSAiTm9uZSIpIHsKKyAgICBQcmludERlc2NyaXB0b3JPcHRpb25zRml4aW5nQ29kZShrRGVzY3JpcHRvcktleSwgZmlsZV9vcHRpb25zLCBwcmludGVyXyk7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlcl8tPlByaW50KCJERVNDUklQVE9SLl9vcHRpb25zID0gTm9uZVxuIik7CisgIH0KKyAgLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBhbGwgdG9wIGxldmVsIGVudW1zLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvciA9ICpmaWxlXy0+ZW51bV90eXBlKGkpOworICAgIEZpeE9wdGlvbnNGb3JFbnVtKGVudW1fZGVzY3JpcHRvcik7CisgIH0KKyAgLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBhbGwgdG9wIGxldmVsIGV4dGVuc2lvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkID0gKmZpbGVfLT5leHRlbnNpb24oaSk7CisgICAgRml4T3B0aW9uc0ZvckZpZWxkKGZpZWxkKTsKKyAgfQorICAvLyBQcmludHMgZXhwcmVzc2lvbnMgdGhhdCBzZXQgdGhlIG9wdGlvbnMgZm9yIGFsbCBtZXNzYWdlcywgbmVzdGVkIGVudW1zLAorICAvLyBuZXN0ZWQgZXh0ZW5zaW9ucyBhbmQgbWVzc2FnZSBmaWVsZHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBGaXhPcHRpb25zRm9yTWVzc2FnZSgqZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5zZXJ2aWNlX2NvdW50KCk7ICsraSkgeworICAgIEZpeE9wdGlvbnNGb3JTZXJ2aWNlKCpmaWxlXy0+c2VydmljZShpKSk7CisgIH0KK30KKwordm9pZCBHZW5lcmF0b3I6OkZpeE9wdGlvbnNGb3JPbmVvZihjb25zdCBPbmVvZkRlc2NyaXB0b3ImIG9uZW9mKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIG9uZW9mX29wdGlvbnMgPSBPcHRpb25zVmFsdWUob25lb2Yub3B0aW9ucygpLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICBpZiAob25lb2Zfb3B0aW9ucyAhPSAiTm9uZSIpIHsKKyAgICBzdGQ6OnN0cmluZyBvbmVvZl9uYW1lID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICAgIiQwLiQxWyckMiddIiwgTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgqb25lb2YuY29udGFpbmluZ190eXBlKCkpLAorICAgICAgICAib25lb2ZzX2J5X25hbWUiLCBvbmVvZi5uYW1lKCkpOworICAgIFByaW50RGVzY3JpcHRvck9wdGlvbnNGaXhpbmdDb2RlKG9uZW9mX25hbWUsIG9uZW9mX29wdGlvbnMsIHByaW50ZXJfKTsKKyAgfQorfQorCisvLyBQcmludHMgZXhwcmVzc2lvbnMgdGhhdCBzZXQgdGhlIG9wdGlvbnMgZm9yIGFuIGVudW0gZGVzY3JpcHRvciBhbmQgaXRzCisvLyB2YWx1ZSBkZXNjcmlwdG9ycy4KK3ZvaWQgR2VuZXJhdG9yOjpGaXhPcHRpb25zRm9yRW51bShjb25zdCBFbnVtRGVzY3JpcHRvciYgZW51bV9kZXNjcmlwdG9yKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0b3JfbmFtZSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZW51bV9kZXNjcmlwdG9yKTsKKyAgc3RkOjpzdHJpbmcgZW51bV9vcHRpb25zID0KKyAgICAgIE9wdGlvbnNWYWx1ZShlbnVtX2Rlc2NyaXB0b3Iub3B0aW9ucygpLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICBpZiAoZW51bV9vcHRpb25zICE9ICJOb25lIikgeworICAgIFByaW50RGVzY3JpcHRvck9wdGlvbnNGaXhpbmdDb2RlKGRlc2NyaXB0b3JfbmFtZSwgZW51bV9vcHRpb25zLCBwcmludGVyXyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtX2Rlc2NyaXB0b3IudmFsdWVfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciYgdmFsdWVfZGVzY3JpcHRvciA9ICplbnVtX2Rlc2NyaXB0b3IudmFsdWUoaSk7CisgICAgc3RkOjpzdHJpbmcgdmFsdWVfb3B0aW9ucyA9CisgICAgICAgIE9wdGlvbnNWYWx1ZSh2YWx1ZV9kZXNjcmlwdG9yLm9wdGlvbnMoKS5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgICBpZiAodmFsdWVfb3B0aW9ucyAhPSAiTm9uZSIpIHsKKyAgICAgIFByaW50RGVzY3JpcHRvck9wdGlvbnNGaXhpbmdDb2RlKAorICAgICAgICAgIFN0cmluZ1ByaW50ZigiJXMudmFsdWVzX2J5X25hbWVbXCIlc1wiXSIsIGRlc2NyaXB0b3JfbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9kZXNjcmlwdG9yLm5hbWUoKS5jX3N0cigpKSwKKyAgICAgICAgICB2YWx1ZV9vcHRpb25zLCBwcmludGVyXyk7CisgICAgfQorICB9Cit9CisKKy8vIFByaW50cyBleHByZXNzaW9ucyB0aGF0IHNldCB0aGUgb3B0aW9ucyBmb3IgYW4gc2VydmljZSBkZXNjcmlwdG9yIGFuZCBpdHMKKy8vIHZhbHVlIGRlc2NyaXB0b3JzLgordm9pZCBHZW5lcmF0b3I6OkZpeE9wdGlvbnNGb3JTZXJ2aWNlKAorICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBzZXJ2aWNlX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgZGVzY3JpcHRvcl9uYW1lID0KKyAgICAgIE1vZHVsZUxldmVsU2VydmljZURlc2NyaXB0b3JOYW1lKHNlcnZpY2VfZGVzY3JpcHRvcik7CisgIHN0ZDo6c3RyaW5nIHNlcnZpY2Vfb3B0aW9ucyA9CisgICAgICBPcHRpb25zVmFsdWUoc2VydmljZV9kZXNjcmlwdG9yLm9wdGlvbnMoKS5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgaWYgKHNlcnZpY2Vfb3B0aW9ucyAhPSAiTm9uZSIpIHsKKyAgICBQcmludERlc2NyaXB0b3JPcHRpb25zRml4aW5nQ29kZShkZXNjcmlwdG9yX25hbWUsIHNlcnZpY2Vfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGVyXyk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VfZGVzY3JpcHRvci5tZXRob2RfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gc2VydmljZV9kZXNjcmlwdG9yLm1ldGhvZChpKTsKKyAgICBzdGQ6OnN0cmluZyBtZXRob2Rfb3B0aW9ucyA9CisgICAgICAgIE9wdGlvbnNWYWx1ZShtZXRob2QtPm9wdGlvbnMoKS5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgICBpZiAobWV0aG9kX29wdGlvbnMgIT0gIk5vbmUiKSB7CisgICAgICBzdGQ6OnN0cmluZyBtZXRob2RfbmFtZSA9CisgICAgICAgICAgZGVzY3JpcHRvcl9uYW1lICsgIi5tZXRob2RzX2J5X25hbWVbJyIgKyBtZXRob2QtPm5hbWUoKSArICInXSI7CisgICAgICBQcmludERlc2NyaXB0b3JPcHRpb25zRml4aW5nQ29kZShtZXRob2RfbmFtZSwgbWV0aG9kX29wdGlvbnMsIHByaW50ZXJfKTsKKyAgICB9CisgIH0KK30KKworLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBmaWVsZCBkZXNjcmlwdG9ycyAoaW5jbHVkaW5nCisvLyBleHRlbnNpb25zKS4KK3ZvaWQgR2VuZXJhdG9yOjpGaXhPcHRpb25zRm9yRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCkgY29uc3QgeworICBzdGQ6OnN0cmluZyBmaWVsZF9vcHRpb25zID0gT3B0aW9uc1ZhbHVlKGZpZWxkLm9wdGlvbnMoKS5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgaWYgKGZpZWxkX29wdGlvbnMgIT0gIk5vbmUiKSB7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZTsKKyAgICBpZiAoZmllbGQuaXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAgIGlmIChmaWVsZC5leHRlbnNpb25fc2NvcGUoKSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIFRvcCBsZXZlbCBleHRlbnNpb25zLgorICAgICAgICBmaWVsZF9uYW1lID0gZmllbGQubmFtZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmllbGRfbmFtZSA9IEZpZWxkUmVmZXJlbmNpbmdFeHByZXNzaW9uKGZpZWxkLmV4dGVuc2lvbl9zY29wZSgpLCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnNpb25zX2J5X25hbWUiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZmllbGRfbmFtZSA9IEZpZWxkUmVmZXJlbmNpbmdFeHByZXNzaW9uKGZpZWxkLmNvbnRhaW5pbmdfdHlwZSgpLCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzX2J5X25hbWUiKTsKKyAgICB9CisgICAgUHJpbnREZXNjcmlwdG9yT3B0aW9uc0ZpeGluZ0NvZGUoZmllbGRfbmFtZSwgZmllbGRfb3B0aW9ucywgcHJpbnRlcl8pOworICB9Cit9CisKKy8vIFByaW50cyBleHByZXNzaW9ucyB0aGF0IHNldCB0aGUgb3B0aW9ucyBmb3IgYSBtZXNzYWdlIGFuZCBhbGwgaXRzIGlubmVyCisvLyB0eXBlcyAobmVzdGVkIG1lc3NhZ2VzLCBuZXN0ZWQgZW51bXMsIGV4dGVuc2lvbnMsIGZpZWxkcykuCit2b2lkIEdlbmVyYXRvcjo6Rml4T3B0aW9uc0Zvck1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgeworICAvLyBOZXN0ZWQgbWVzc2FnZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBGaXhPcHRpb25zRm9yTWVzc2FnZSgqZGVzY3JpcHRvci5uZXN0ZWRfdHlwZShpKSk7CisgIH0KKyAgLy8gT25lb2ZzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3Iub25lb2ZfZGVjbF9jb3VudCgpOyArK2kpIHsKKyAgICBGaXhPcHRpb25zRm9yT25lb2YoKmRlc2NyaXB0b3Iub25lb2ZfZGVjbChpKSk7CisgIH0KKyAgLy8gRW51bXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgRml4T3B0aW9uc0ZvckVudW0oKmRlc2NyaXB0b3IuZW51bV90eXBlKGkpKTsKKyAgfQorICAvLyBGaWVsZHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5maWVsZF9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkID0gKmRlc2NyaXB0b3IuZmllbGQoaSk7CisgICAgRml4T3B0aW9uc0ZvckZpZWxkKGZpZWxkKTsKKyAgfQorICAvLyBFeHRlbnNpb25zLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IuZXh0ZW5zaW9uX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQgPSAqZGVzY3JpcHRvci5leHRlbnNpb24oaSk7CisgICAgRml4T3B0aW9uc0ZvckZpZWxkKGZpZWxkKTsKKyAgfQorICAvLyBNZXNzYWdlIG9wdGlvbiBmb3IgdGhpcyBtZXNzYWdlLgorICBzdGQ6OnN0cmluZyBtZXNzYWdlX29wdGlvbnMgPQorICAgICAgT3B0aW9uc1ZhbHVlKGRlc2NyaXB0b3Iub3B0aW9ucygpLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICBpZiAobWVzc2FnZV9vcHRpb25zICE9ICJOb25lIikgeworICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0b3JfbmFtZSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcik7CisgICAgUHJpbnREZXNjcmlwdG9yT3B0aW9uc0ZpeGluZ0NvZGUoZGVzY3JpcHRvcl9uYW1lLCBtZXNzYWdlX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRlcl8pOworICB9Cit9CisKKy8vIElmIGEgZGVwZW5kZW5jeSBmb3J3YXJkcyBvdGhlciBmaWxlcyB0aHJvdWdoIHB1YmxpYyBkZXBlbmRlbmNpZXMsIGxldCdzCisvLyBjb3B5IG92ZXIgdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIGFsaWFzZXMuCit2b2lkIEdlbmVyYXRvcjo6Q29weVB1YmxpY0RlcGVuZGVuY2llc0FsaWFzZXMoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvcHlfZnJvbSwgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5wdWJsaWNfZGVwZW5kZW5jeV9jb3VudCgpOyArK2kpIHsKKyAgICBzdGQ6OnN0cmluZyBtb2R1bGVfbmFtZSA9IE1vZHVsZU5hbWUoZmlsZS0+cHVibGljX2RlcGVuZGVuY3koaSktPm5hbWUoKSk7CisgICAgc3RkOjpzdHJpbmcgbW9kdWxlX2FsaWFzID0gTW9kdWxlQWxpYXMoZmlsZS0+cHVibGljX2RlcGVuZGVuY3koaSktPm5hbWUoKSk7CisgICAgLy8gVGhlcmUncyBubyBtb2R1bGUgYWxpYXMgaW4gdGhlIGRlcGVuZGVudCBmaWxlIGlmIGl0IHdhcyBnZW5lcmF0ZWQgYnkKKyAgICAvLyBhbiBvbGQgcHJvdG9jIChsZXNzIHRoYW4gMy4wLjAtYWxwaGEtMSkuIFVzZSBtb2R1bGUgbmFtZSBpbiB0aGlzCisgICAgLy8gc2l0dWF0aW9uLgorICAgIHByaW50ZXJfLT5QcmludCgKKyAgICAgICAgInRyeTpcbiIKKyAgICAgICAgIiAgJGFsaWFzJCA9ICRjb3B5X2Zyb20kLiRhbGlhcyRcbiIKKyAgICAgICAgImV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjpcbiIKKyAgICAgICAgIiAgJGFsaWFzJCA9ICRjb3B5X2Zyb20kLiRtb2R1bGUkXG4iLAorICAgICAgICAiYWxpYXMiLCBtb2R1bGVfYWxpYXMsICJtb2R1bGUiLCBtb2R1bGVfbmFtZSwgImNvcHlfZnJvbSIsIGNvcHlfZnJvbSk7CisgICAgQ29weVB1YmxpY0RlcGVuZGVuY2llc0FsaWFzZXMoY29weV9mcm9tLCBmaWxlLT5wdWJsaWNfZGVwZW5kZW5jeShpKSk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2dlbmVyYXRvci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmZWNiYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTg1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiByb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKQorLy8KKy8vIEdlbmVyYXRlcyBQeXRob24gY29kZSBmb3IgYSBnaXZlbiAucHJvdG8gZmlsZS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUFlUSE9OX0dFTkVSQVRPUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BZVEhPTl9HRU5FUkFUT1JfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbXV0ZXguaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgRGVzY3JpcHRvcjsKK2NsYXNzIEVudW1EZXNjcmlwdG9yOworY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvcjsKK2NsYXNzIEZpZWxkRGVzY3JpcHRvcjsKK2NsYXNzIE9uZW9mRGVzY3JpcHRvcjsKK2NsYXNzIFNlcnZpY2VEZXNjcmlwdG9yOworCituYW1lc3BhY2UgaW8geworY2xhc3MgUHJpbnRlcjsKK30KKworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBweXRob24geworCisvLyBDb2RlR2VuZXJhdG9yIGltcGxlbWVudGF0aW9uIGZvciBnZW5lcmF0ZWQgUHl0aG9uIHByb3RvY29sIGJ1ZmZlciBjbGFzc2VzLgorLy8gSWYgeW91IGNyZWF0ZSB5b3VyIG93biBwcm90b2NvbCBjb21waWxlciBiaW5hcnkgYW5kIHlvdSB3YW50IGl0IHRvIHN1cHBvcnQKKy8vIFB5dGhvbiBvdXRwdXQsIHlvdSBjYW4gZG8gc28gYnkgcmVnaXN0ZXJpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcworLy8gQ29kZUdlbmVyYXRvciB3aXRoIHRoZSBDb21tYW5kTGluZUludGVyZmFjZSBpbiB5b3VyIG1haW4oKSBmdW5jdGlvbi4KK2NsYXNzIFBST1RPQ19FWFBPUlQgR2VuZXJhdG9yIDogcHVibGljIENvZGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgR2VuZXJhdG9yKCk7CisgIH5HZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICAvLyBDb2RlR2VuZXJhdG9yIG1ldGhvZHMuCisgIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yKSBjb25zdCBvdmVycmlkZTsKKworICB1aW50NjRfdCBHZXRTdXBwb3J0ZWRGZWF0dXJlcygpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgdm9pZCBQcmludEltcG9ydHMoKSBjb25zdDsKKyAgdm9pZCBQcmludEZpbGVEZXNjcmlwdG9yKCkgY29uc3Q7CisgIHZvaWQgUHJpbnRBbGxOZXN0ZWRFbnVtc0luRmlsZSgpIGNvbnN0OworICB2b2lkIFByaW50TmVzdGVkRW51bXMoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisgIHZvaWQgUHJpbnRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yJiBlbnVtX2Rlc2NyaXB0b3IpIGNvbnN0OworCisgIHZvaWQgUHJpbnRGaWVsZERlc2NyaXB0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4dGVuc2lvbikgY29uc3Q7CisgIHZvaWQgUHJpbnRGaWVsZERlc2NyaXB0b3JzSW5EZXNjcmlwdG9yKAorICAgICAgY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yLCBib29sIGlzX2V4dGVuc2lvbiwKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaXN0X3ZhcmlhYmxlX25hbWUsIGludCAoRGVzY3JpcHRvcjo6KkNvdW50Rm4pKCkgY29uc3QsCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIChEZXNjcmlwdG9yOjoqR2V0dGVyRm4pKGludCljb25zdCkgY29uc3Q7CisgIHZvaWQgUHJpbnRGaWVsZHNJbkRlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdDsKKyAgdm9pZCBQcmludEV4dGVuc2lvbnNJbkRlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdDsKKyAgdm9pZCBQcmludE1lc3NhZ2VEZXNjcmlwdG9ycygpIGNvbnN0OworICB2b2lkIFByaW50RGVzY3JpcHRvcihjb25zdCBEZXNjcmlwdG9yJiBtZXNzYWdlX2Rlc2NyaXB0b3IpIGNvbnN0OworICB2b2lkIFByaW50TmVzdGVkRGVzY3JpcHRvcnMoY29uc3QgRGVzY3JpcHRvciYgY29udGFpbmluZ19kZXNjcmlwdG9yKSBjb25zdDsKKworICB2b2lkIFByaW50TWVzc2FnZXMoKSBjb25zdDsKKyAgdm9pZCBQcmludE1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHRvX3JlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICBib29sIGlzX25lc3RlZCkgY29uc3Q7CisgIHZvaWQgUHJpbnROZXN0ZWRNZXNzYWdlcyhjb25zdCBEZXNjcmlwdG9yJiBjb250YWluaW5nX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiB0b19yZWdpc3RlcikgY29uc3Q7CisKKyAgdm9pZCBGaXhGb3JlaWduRmllbGRzSW5EZXNjcmlwdG9ycygpIGNvbnN0OworICB2b2lkIEZpeEZvcmVpZ25GaWVsZHNJbkRlc2NyaXB0b3IoCisgICAgICBjb25zdCBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yLAorICAgICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ19kZXNjcmlwdG9yKSBjb25zdDsKKyAgdm9pZCBGaXhGb3JlaWduRmllbGRzSW5GaWVsZChjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHl0aG9uX2RpY3RfbmFtZSkgY29uc3Q7CisgIHZvaWQgQWRkTWVzc2FnZVRvRmlsZURlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisgIHZvaWQgQWRkRW51bVRvRmlsZURlc2NyaXB0b3IoY29uc3QgRW51bURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OworICB2b2lkIEFkZEV4dGVuc2lvblRvRmlsZURlc2NyaXB0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKKyAgdm9pZCBBZGRTZXJ2aWNlVG9GaWxlRGVzY3JpcHRvcihjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIEZpZWxkUmVmZXJlbmNpbmdFeHByZXNzaW9uKAorICAgICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlLCBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHB5dGhvbl9kaWN0X25hbWUpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclQ+CisgIHZvaWQgRml4Q29udGFpbmluZ1R5cGVJbkRlc2NyaXB0b3IoCisgICAgICBjb25zdCBEZXNjcmlwdG9yVCYgZGVzY3JpcHRvciwKKyAgICAgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfZGVzY3JpcHRvcikgY29uc3Q7CisKKyAgdm9pZCBGaXhGb3JlaWduRmllbGRzSW5FeHRlbnNpb25zKCkgY29uc3Q7CisgIHZvaWQgRml4Rm9yZWlnbkZpZWxkc0luRXh0ZW5zaW9uKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBleHRlbnNpb25fZmllbGQpIGNvbnN0OworICB2b2lkIEZpeEZvcmVpZ25GaWVsZHNJbk5lc3RlZEV4dGVuc2lvbnMoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisKKyAgdm9pZCBQcmludFNlcnZpY2VzKCkgY29uc3Q7CisgIHZvaWQgUHJpbnRTZXJ2aWNlRGVzY3JpcHRvcnMoKSBjb25zdDsKKyAgdm9pZCBQcmludFNlcnZpY2VEZXNjcmlwdG9yKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKKyAgdm9pZCBQcmludFNlcnZpY2VDbGFzcyhjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisgIHZvaWQgUHJpbnRTZXJ2aWNlU3R1Yihjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisgIHZvaWQgUHJpbnREZXNjcmlwdG9yS2V5QW5kTW9kdWxlTmFtZSgKKyAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKKworICB2b2lkIFByaW50RW51bVZhbHVlRGVzY3JpcHRvcihjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgT3B0aW9uc1ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkX29wdGlvbnMpIGNvbnN0OworICBib29sIEdlbmVyYXRpbmdEZXNjcmlwdG9yUHJvdG8oKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclQ+CisgIHN0ZDo6c3RyaW5nIE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoY29uc3QgRGVzY3JpcHRvclQmIGRlc2NyaXB0b3IpIGNvbnN0OworICBzdGQ6OnN0cmluZyBNb2R1bGVMZXZlbE1lc3NhZ2VOYW1lKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OworICBzdGQ6OnN0cmluZyBNb2R1bGVMZXZlbFNlcnZpY2VEZXNjcmlwdG9yTmFtZSgKKyAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclQsIHR5cGVuYW1lIERlc2NyaXB0b3JQcm90b1Q+CisgIHZvaWQgUHJpbnRTZXJpYWxpemVkUGJJbnRlcnZhbChjb25zdCBEZXNjcmlwdG9yVCYgZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90b1QmIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0OworCisgIHZvaWQgRml4QWxsRGVzY3JpcHRvck9wdGlvbnMoKSBjb25zdDsKKyAgdm9pZCBGaXhPcHRpb25zRm9yRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCkgY29uc3Q7CisgIHZvaWQgRml4T3B0aW9uc0Zvck9uZW9mKGNvbnN0IE9uZW9mRGVzY3JpcHRvciYgb25lb2YpIGNvbnN0OworICB2b2lkIEZpeE9wdGlvbnNGb3JFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKKyAgdm9pZCBGaXhPcHRpb25zRm9yU2VydmljZShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisgIHZvaWQgRml4T3B0aW9uc0Zvck1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisKKyAgdm9pZCBTZXRTZXJpYWxpemVkUGJJbnRlcnZhbCgpIGNvbnN0OworICB2b2lkIFNldE1lc3NhZ2VQYkludGVydmFsKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OworCisgIHZvaWQgQ29weVB1YmxpY0RlcGVuZGVuY2llc0FsaWFzZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGNvcHlfZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgY29uc3Q7CisKKyAgLy8gVmVyeSBjb2Fyc2UtZ3JhaW5lZCBsb2NrIHRvIGVuc3VyZSB0aGF0IEdlbmVyYXRlKCkgaXMgcmVlbnRyYW50LgorICAvLyBHdWFyZHMgZmlsZV8sIHByaW50ZXJfIGFuZCBmaWxlX2Rlc2NyaXB0b3Jfc2VyaWFsaXplZF8uCisgIG11dGFibGUgTXV0ZXggbXV0ZXhfOworICBtdXRhYmxlIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlXzsgIC8vIFNldCBpbiBHZW5lcmF0ZSgpLiAgVW5kZXIgbXV0ZXhfLgorICBtdXRhYmxlIHN0ZDo6c3RyaW5nIGZpbGVfZGVzY3JpcHRvcl9zZXJpYWxpemVkXzsKKyAgbXV0YWJsZSBpbzo6UHJpbnRlciogcHJpbnRlcl87ICAvLyBTZXQgaW4gR2VuZXJhdGUoKS4gIFVuZGVyIG11dGV4Xy4KKyAgbXV0YWJsZSBib29sIHB1cmVfcHl0aG9uX3dvcmthYmxlXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BZVEhPTl9HRU5FUkFUT1JfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9oZWxwZXJzLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vaGVscGVycy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQzYzEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vaGVscGVycy5jYwpAQCAtMCwwICsxLDEzMSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2hlbHBlcnMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIHB5dGhvbiB7CisKKy8vIFJldHVybnMgdGhlIFB5dGhvbiBtb2R1bGUgbmFtZSBleHBlY3RlZCBmb3IgYSBnaXZlbiAucHJvdG8gZmlsZW5hbWUuCitzdGQ6OnN0cmluZyBNb2R1bGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgeworICBzdGQ6OnN0cmluZyBiYXNlbmFtZSA9IFN0cmlwUHJvdG8oZmlsZW5hbWUpOworICBSZXBsYWNlQ2hhcmFjdGVycygmYmFzZW5hbWUsICItIiwgJ18nKTsKKyAgUmVwbGFjZUNoYXJhY3RlcnMoJmJhc2VuYW1lLCAiLyIsICcuJyk7CisgIHJldHVybiBiYXNlbmFtZSArICJfcGIyIjsKK30KKworc3RkOjpzdHJpbmcgU3RyaXBwZWRNb2R1bGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgeworICBzdGQ6OnN0cmluZyBtb2R1bGVfbmFtZSA9IE1vZHVsZU5hbWUoZmlsZW5hbWUpOworICByZXR1cm4gbW9kdWxlX25hbWU7Cit9CisKKy8vIEtleXdvcmRzIHJlc2VydmVkIGJ5IHRoZSBQeXRob24gbGFuZ3VhZ2UuCitjb25zdCBjaGFyKiBjb25zdCBrS2V5d29yZHNbXSA9IHsKKyAgICAiRmFsc2UiLCAgIk5vbmUiLCAgICAgIlRydWUiLCAgImFuZCIsICAgICJhcyIsICAgICAgICJhc3NlcnQiLAorICAgICJhc3luYyIsICAiYXdhaXQiLCAgICAiYnJlYWsiLCAiY2xhc3MiLCAgImNvbnRpbnVlIiwgImRlZiIsCisgICAgImRlbCIsICAgICJlbGlmIiwgICAgICJlbHNlIiwgICJleGNlcHQiLCAiZmluYWxseSIsICAiZm9yIiwKKyAgICAiZnJvbSIsICAgImdsb2JhbCIsICAgImlmIiwgICAgImltcG9ydCIsICJpbiIsICAgICAgICJpcyIsCisgICAgImxhbWJkYSIsICJub25sb2NhbCIsICJub3QiLCAgICJvciIsICAgICAicGFzcyIsICAgICAicmFpc2UiLAorICAgICJyZXR1cm4iLCAidHJ5IiwgICAgICAid2hpbGUiLCAid2l0aCIsICAgInlpZWxkIiwKK307Citjb25zdCBjaGFyKiBjb25zdCoga0tleXdvcmRzRW5kID0KKyAgICBrS2V5d29yZHMgKyAoc2l6ZW9mKGtLZXl3b3JkcykgLyBzaXplb2Yoa0tleXdvcmRzWzBdKSk7CisKK2Jvb2wgQ29udGFpbnNQeXRob25LZXl3b3JkKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2R1bGVfbmFtZSkgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdG9rZW5zID0gU3BsaXQobW9kdWxlX25hbWUsICIuIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGljX2Nhc3Q8aW50Pih0b2tlbnMuc2l6ZSgpKTsgKytpKSB7CisgICAgaWYgKHN0ZDo6ZmluZChrS2V5d29yZHMsIGtLZXl3b3Jkc0VuZCwgdG9rZW5zW2ldKSAhPSBrS2V5d29yZHNFbmQpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSXNQeXRob25LZXl3b3JkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIHJldHVybiAoc3RkOjpmaW5kKGtLZXl3b3Jkcywga0tleXdvcmRzRW5kLCBuYW1lKSAhPSBrS2V5d29yZHNFbmQpOworfQorCitzdGQ6OnN0cmluZyBSZXNvbHZlS2V5d29yZChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICBpZiAoSXNQeXRob25LZXl3b3JkKG5hbWUpKSB7CisgICAgcmV0dXJuICJnbG9iYWxzKClbJyIgKyBuYW1lICsgIiddIjsKKyAgfQorICByZXR1cm4gbmFtZTsKK30KKworc3RkOjpzdHJpbmcgR2V0RmlsZU5hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCkgeworICBzdGQ6OnN0cmluZyBtb2R1bGVfbmFtZSA9IE1vZHVsZU5hbWUoZmlsZV9kZXMtPm5hbWUoKSk7CisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gbW9kdWxlX25hbWU7CisgIFJlcGxhY2VDaGFyYWN0ZXJzKCZmaWxlbmFtZSwgIi4iLCAnLycpOworICBmaWxlbmFtZSArPSBzdWZmaXg7CisgIHJldHVybiBmaWxlbmFtZTsKK30KKworYm9vbCBIYXNHZW5lcmljU2VydmljZXMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgcmV0dXJuIGZpbGUtPnNlcnZpY2VfY291bnQoKSA+IDAgJiYgZmlsZS0+b3B0aW9ucygpLnB5X2dlbmVyaWNfc2VydmljZXMoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUPgorc3RkOjpzdHJpbmcgTmFtZVByZWZpeGVkV2l0aE5lc3RlZFR5cGVzKGNvbnN0IERlc2NyaXB0b3JUJiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXBhcmF0b3IpIHsKKyAgc3RkOjpzdHJpbmcgbmFtZSA9IGRlc2NyaXB0b3IubmFtZSgpOworICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQgPSBkZXNjcmlwdG9yLmNvbnRhaW5pbmdfdHlwZSgpOworICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSBOYW1lUHJlZml4ZWRXaXRoTmVzdGVkVHlwZXMoKnBhcmVudCwgc2VwYXJhdG9yKTsKKyAgICBpZiAoc2VwYXJhdG9yID09ICIuIiAmJiBJc1B5dGhvbktleXdvcmQobmFtZSkpIHsKKyAgICAgIHJldHVybiAiZ2V0YXR0cigiICsgcHJlZml4ICsgIiwgJyIgKyBuYW1lICsgIicpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHByZWZpeCArIHNlcGFyYXRvciArIG5hbWU7CisgICAgfQorICB9CisgIGlmIChzZXBhcmF0b3IgPT0gIi4iKSB7CisgICAgbmFtZSA9IFJlc29sdmVLZXl3b3JkKG5hbWUpOworICB9CisgIHJldHVybiBuYW1lOworfQorCit0ZW1wbGF0ZSBzdGQ6OnN0cmluZyBOYW1lUHJlZml4ZWRXaXRoTmVzdGVkVHlwZXM8RGVzY3JpcHRvcj4oCisgICAgY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvciwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcGFyYXRvcik7Cit0ZW1wbGF0ZSBzdGQ6OnN0cmluZyBOYW1lUHJlZml4ZWRXaXRoTmVzdGVkVHlwZXM8RW51bURlc2NyaXB0b3I+KAorICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VwYXJhdG9yKTsKKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2hlbHBlcnMuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjhjZWIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vaGVscGVycy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QWVRIT05fSEVMUEVSU19IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BZVEhPTl9IRUxQRVJTX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBweXRob24geworCisKK3N0ZDo6c3RyaW5nIE1vZHVsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKK3N0ZDo6c3RyaW5nIFN0cmlwcGVkTW9kdWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOworYm9vbCBDb250YWluc1B5dGhvbktleXdvcmQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vZHVsZV9uYW1lKTsKK2Jvb2wgSXNQeXRob25LZXl3b3JkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKK3N0ZDo6c3RyaW5nIFJlc29sdmVLZXl3b3JkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKK3N0ZDo6c3RyaW5nIEdldEZpbGVOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlX2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWZmaXgpOworYm9vbCBIYXNHZW5lcmljU2VydmljZXMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclQ+CitzdGQ6OnN0cmluZyBOYW1lUHJlZml4ZWRXaXRoTmVzdGVkVHlwZXMoY29uc3QgRGVzY3JpcHRvclQmIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcGFyYXRvcik7CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BZVEhPTl9IRUxQRVJTX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcGx1Z2luX3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcGx1Z2luX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOTU4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9wbHVnaW5fdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMjYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgcHl0aG9uIHsKK25hbWVzcGFjZSB7CisKK2NsYXNzIFRlc3RHZW5lcmF0b3IgOiBwdWJsaWMgQ29kZUdlbmVyYXRvciB7CisgcHVibGljOgorICBUZXN0R2VuZXJhdG9yKCkge30KKyAgflRlc3RHZW5lcmF0b3IoKSBvdmVycmlkZSB7fQorCisgIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwgc3RkOjpzdHJpbmcqIGVycm9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0X3BiMi5weSIsICJpbXBvcnRzIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0X3BiMi5weSIsICJtb2R1bGVfc2NvcGUiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3RfcGIyLnB5IiwgImNsYXNzX3Njb3BlOmZvby5CYXIiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3RfcGIyLnB5IiwgImNsYXNzX3Njb3BlOmZvby5CYXIuQmF6IiwgY29udGV4dCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2b2lkIFRyeUluc2VydChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnNlcnRpb25fcG9pbnQsCisgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQpIGNvbnN0IHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICAgIGNvbnRleHQtPk9wZW5Gb3JJbnNlcnQoZmlsZW5hbWUsIGluc2VydGlvbl9wb2ludCkpOworICAgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcpOworICAgIHByaW50ZXIuUHJpbnQoIi8vIGluc2VydGVkICRuYW1lJFxuIiwgIm5hbWUiLCBpbnNlcnRpb25fcG9pbnQpOworICB9Cit9OworCisvLyBvcHBvc2VkIHRvIGltcG9ydGxpYikgaW4gdGhlIHVzdWFsIGNhc2Ugd2hlcmUgdGhlIC5wcm90byBmaWxlIHBhdGhzIGRvIG5vdAorLy8gbm90IGNvbnRhaW4gYW55IFB5dGhvbiBrZXl3b3Jkcy4KK1RFU1QoUHl0aG9uUGx1Z2luVGVzdCwgSW1wb3J0VGVzdCkgeworICAvLyBDcmVhdGUgZmlsZXMgdGVzdDEucHJvdG8gYW5kIHRlc3QyLnByb3RvIHdpdGggdGhlIGZvcm1lciBpbXBvcnRpbmcgdGhlCisgIC8vIGxhdHRlci4KKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OlNldENvbnRlbnRzKFRlc3RUZW1wRGlyKCkgKyAiL3Rlc3QxLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8zXCI7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIGZvbztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBcInRlc3QyLnByb3RvXCI7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSBNZXNzYWdlMSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIE1lc3NhZ2UyIG1lc3NhZ2VfMiA9IDE7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSk7CisgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpTZXRDb250ZW50cyhUZXN0VGVtcERpcigpICsgIi90ZXN0Mi5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvM1wiO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBmb287XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIE1lc3NhZ2UyIHt9XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSk7CisKKyAgY29tcGlsZXI6OkNvbW1hbmRMaW5lSW50ZXJmYWNlIGNsaTsKKyAgY2xpLlNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKHRydWUpOworICBweXRob246OkdlbmVyYXRvciBweXRob25fZ2VuZXJhdG9yOworICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tcHl0aG9uX291dCIsICZweXRob25fZ2VuZXJhdG9yLCAiIik7CisgIHN0ZDo6c3RyaW5nIHByb3RvX3BhdGggPSAiLUkiICsgVGVzdFRlbXBEaXIoKTsKKyAgc3RkOjpzdHJpbmcgcHl0aG9uX291dCA9ICItLXB5dGhvbl9vdXQ9IiArIFRlc3RUZW1wRGlyKCk7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsicHJvdG9jIiwgcHJvdG9fcGF0aC5jX3N0cigpLCAiLUkuIiwgcHl0aG9uX291dC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QxLnByb3RvIn07CisgIEFTU0VSVF9FUSgwLCBjbGkuUnVuKDUsIGFyZ3YpKTsKKworICAvLyBMb29wIG92ZXIgdGhlIGxpbmVzIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSBhbmQgdmVyaWZ5IHRoYXQgd2UgZmluZCBhbgorICAvLyBvcmRpbmFyeSBQeXRob24gaW1wb3J0IGJ1dCBkbyBub3QgZmluZCB0aGUgc3RyaW5nICJpbXBvcnRsaWIiLgorICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpHZXRDb250ZW50cyhUZXN0VGVtcERpcigpICsgIi90ZXN0MV9wYjIucHkiLCAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5lcyA9IFNwbGl0KG91dHB1dCwgIlxuIik7CisgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkX2ltcG9ydCA9ICJpbXBvcnQgdGVzdDJfcGIyIjsKKyAgYm9vbCBmb3VuZF9leHBlY3RlZF9pbXBvcnQgPSBmYWxzZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5zaXplKCk7ICsraSkgeworICAgIGlmIChsaW5lc1tpXS5maW5kKGV4cGVjdGVkX2ltcG9ydCkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGZvdW5kX2V4cGVjdGVkX2ltcG9ydCA9IHRydWU7CisgICAgfQorICAgIEVYUEVDVF9FUShzdGQ6OnN0cmluZzo6bnBvcywgbGluZXNbaV0uZmluZCgiaW1wb3J0bGliIikpOworICB9CisgIEVYUEVDVF9UUlVFKGZvdW5kX2V4cGVjdGVkX2ltcG9ydCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5aV9nZW5lcmF0b3IuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weWlfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjY2M5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weWlfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNjM2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHlpX2dlbmVyYXRvci5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIHB5dGhvbiB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXNjcmlwdG9yVD4KK3N0cnVjdCBTb3J0QnlOYW1lIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IERlc2NyaXB0b3JUKiBsLCBjb25zdCBEZXNjcmlwdG9yVCogcikgY29uc3QgeworICAgIHJldHVybiBsLT5uYW1lKCkgPCByLT5uYW1lKCk7CisgIH0KK307CisKK1B5aUdlbmVyYXRvcjo6UHlpR2VuZXJhdG9yKCkgOiBmaWxlXyhudWxscHRyKSB7fQorCitQeWlHZW5lcmF0b3I6On5QeWlHZW5lcmF0b3IoKSB7fQorCit2b2lkIFB5aUdlbmVyYXRvcjo6UHJpbnRJdGVtTWFwKAorICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGl0ZW1fbWFwKSBjb25zdCB7CisgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBpdGVtX21hcCkgeworICAgIHByaW50ZXJfLT5QcmludCgiJGtleSQ6ICR2YWx1ZSRcbiIsICJrZXkiLCBlbnRyeS5maXJzdCwgInZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuc2Vjb25kKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclQ+CitzdGQ6OnN0cmluZyBQeWlHZW5lcmF0b3I6Ok1vZHVsZUxldmVsTmFtZSgKKyAgICBjb25zdCBEZXNjcmlwdG9yVCYgZGVzY3JpcHRvciwKKyAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBpbXBvcnRfbWFwKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIG5hbWUgPSBOYW1lUHJlZml4ZWRXaXRoTmVzdGVkVHlwZXMoZGVzY3JpcHRvciwgIi4iKTsKKyAgaWYgKGRlc2NyaXB0b3IuZmlsZSgpICE9IGZpbGVfKSB7CisgICAgc3RkOjpzdHJpbmcgbW9kdWxlX2FsaWFzOworICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gZGVzY3JpcHRvci5maWxlKCktPm5hbWUoKTsKKyAgICBpZiAoaW1wb3J0X21hcC5maW5kKGZpbGVuYW1lKSA9PSBpbXBvcnRfbWFwLmVuZCgpKSB7CisgICAgICBzdGQ6OnN0cmluZyBtb2R1bGVfbmFtZSA9IE1vZHVsZU5hbWUoZGVzY3JpcHRvci5maWxlKCktPm5hbWUoKSk7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdG9rZW5zID0gU3BsaXQobW9kdWxlX25hbWUsICIuIik7CisgICAgICBtb2R1bGVfYWxpYXMgPSAiXyIgKyB0b2tlbnMuYmFjaygpOworICAgIH0gZWxzZSB7CisgICAgICBtb2R1bGVfYWxpYXMgPSBpbXBvcnRfbWFwLmF0KGZpbGVuYW1lKTsKKyAgICB9CisgICAgbmFtZSA9IG1vZHVsZV9hbGlhcyArICIuIiArIG5hbWU7CisgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0cnVjdCBJbXBvcnRNb2R1bGVzIHsKKyAgYm9vbCBoYXNfcmVwZWF0ZWQgPSBmYWxzZTsgICAgLy8gX2NvbnRhaW5lcnMKKyAgYm9vbCBoYXNfaXRlcmFibGUgPSBmYWxzZTsgICAgLy8gdHlwaW5nLkl0ZXJhYmxlCisgIGJvb2wgaGFzX21lc3NhZ2VzID0gZmFsc2U7ICAgIC8vIF9tZXNzYWdlCisgIGJvb2wgaGFzX2VudW1zID0gZmFsc2U7ICAgICAgIC8vIF9lbnVtX3R5cGVfd3JhcHBlcgorICBib29sIGhhc19leHRlbmRhYmxlID0gZmFsc2U7ICAvLyBfcHl0aG9uX21lc3NhZ2UKKyAgYm9vbCBoYXNfbWFwcGluZyA9IGZhbHNlOyAgICAgLy8gdHlwaW5nLk1hcHBpbmcKKyAgYm9vbCBoYXNfb3B0aW9uYWwgPSBmYWxzZTsgICAgLy8gdHlwaW5nLk9wdGlvbmFsCisgIGJvb2wgaGFzX3VuaW9uID0gZmFsc2U7ICAgICAgIC8vIHR5cGluZy5VbmlvbgorICBib29sIGhhc193ZWxsX2tub3duX3R5cGUgPSBmYWxzZTsKK307CisKKy8vIENoZWNrcyB3aGV0aGVyIGEgZGVzY3JpcHRvciBuYW1lIG1hdGNoZXMgYSB3ZWxsLWtub3duIHR5cGUuCitib29sIElzV2VsbEtub3duVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAvLyBMSU5ULklmQ2hhbmdlKHdrdGJhc2VzKQorICByZXR1cm4gKG5hbWUgPT0gImdvb2dsZS5wcm90b2J1Zi5BbnkiIHx8CisgICAgICAgICAgbmFtZSA9PSAiZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIiB8fAorICAgICAgICAgIG5hbWUgPT0gImdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2siIHx8CisgICAgICAgICAgbmFtZSA9PSAiZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZSIgfHwKKyAgICAgICAgICBuYW1lID09ICJnb29nbGUucHJvdG9idWYuU3RydWN0IiB8fAorICAgICAgICAgIG5hbWUgPT0gImdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiKTsKKyAgLy8gTElOVC5UaGVuQ2hhbmdlKC8vZGVwb3QvZ29vZ2xlMy9uZXQvcHJvdG8yL3B5dGhvbi9pbnRlcm5hbC93ZWxsX2tub3duX3R5cGVzLnB5OndrdGJhc2VzKQorfQorCisvLyBDaGVja3Mgd2hhdCBtb2R1bGVzIHNob3VsZCBiZSBpbXBvcnRlZCBmb3IgdGhpcyBtZXNzYWdlCisvLyBkZXNjcmlwdG9yLgordm9pZCBDaGVja0ltcG9ydE1vZHVsZXMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydE1vZHVsZXMqIGltcG9ydF9tb2R1bGVzKSB7CisgIGlmIChkZXNjcmlwdG9yLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBpbXBvcnRfbW9kdWxlcy0+aGFzX2V4dGVuZGFibGUgPSB0cnVlOworICB9CisgIGlmIChkZXNjcmlwdG9yLT5lbnVtX3R5cGVfY291bnQoKSA+IDApIHsKKyAgICBpbXBvcnRfbW9kdWxlcy0+aGFzX2VudW1zID0gdHJ1ZTsKKyAgfQorICBpZiAoSXNXZWxsS25vd25UeXBlKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpKSkgeworICAgIGltcG9ydF9tb2R1bGVzLT5oYXNfd2VsbF9rbm93bl90eXBlID0gdHJ1ZTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yLT5maWVsZChpKTsKKyAgICBpZiAoSXNQeXRob25LZXl3b3JkKGZpZWxkLT5uYW1lKCkpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW1wb3J0X21vZHVsZXMtPmhhc19vcHRpb25hbCA9IHRydWU7CisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBpbXBvcnRfbW9kdWxlcy0+aGFzX3JlcGVhdGVkID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGZpZWxkLT5pc19tYXAoKSkgeworICAgICAgaW1wb3J0X21vZHVsZXMtPmhhc19tYXBwaW5nID0gdHJ1ZTsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsdWVfZGVzID0gZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5maWVsZCgxKTsKKyAgICAgIGlmICh2YWx1ZV9kZXMtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UgfHwKKyAgICAgICAgICB2YWx1ZV9kZXMtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU0pIHsKKyAgICAgICAgaW1wb3J0X21vZHVsZXMtPmhhc191bmlvbiA9IHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICBpbXBvcnRfbW9kdWxlcy0+aGFzX2l0ZXJhYmxlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgICBpbXBvcnRfbW9kdWxlcy0+aGFzX3VuaW9uID0gdHJ1ZTsKKyAgICAgICAgaW1wb3J0X21vZHVsZXMtPmhhc19tYXBwaW5nID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTSkgeworICAgICAgICBpbXBvcnRfbW9kdWxlcy0+aGFzX3VuaW9uID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBDaGVja0ltcG9ydE1vZHVsZXMoZGVzY3JpcHRvci0+bmVzdGVkX3R5cGUoaSksIGltcG9ydF9tb2R1bGVzKTsKKyAgfQorfQorCit2b2lkIFB5aUdlbmVyYXRvcjo6UHJpbnRJbXBvcnRGb3JEZXNjcmlwdG9yKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yJiBkZXNjLAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIGltcG9ydF9tYXAsCisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBzZWVuX2FsaWFzZXMpIGNvbnN0IHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lID0gZGVzYy5uYW1lKCk7CisgIHN0ZDo6c3RyaW5nIG1vZHVsZV9uYW1lID0gU3RyaXBwZWRNb2R1bGVOYW1lKGZpbGVuYW1lKTsKKyAgc2l6ZV90IGxhc3RfZG90X3BvcyA9IG1vZHVsZV9uYW1lLnJmaW5kKCcuJyk7CisgIHN0ZDo6c3RyaW5nIGltcG9ydF9zdGF0ZW1lbnQ7CisgIGlmIChsYXN0X2RvdF9wb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBpbXBvcnRfc3RhdGVtZW50ID0gImltcG9ydCAiICsgbW9kdWxlX25hbWU7CisgIH0gZWxzZSB7CisgICAgaW1wb3J0X3N0YXRlbWVudCA9ICJmcm9tICIgKyBtb2R1bGVfbmFtZS5zdWJzdHIoMCwgbGFzdF9kb3RfcG9zKSArCisgICAgICAgICAgICAgICAgICAgICAgICIgaW1wb3J0ICIgKyBtb2R1bGVfbmFtZS5zdWJzdHIobGFzdF9kb3RfcG9zICsgMSk7CisgICAgbW9kdWxlX25hbWUgPSBtb2R1bGVfbmFtZS5zdWJzdHIobGFzdF9kb3RfcG9zICsgMSk7CisgIH0KKyAgc3RkOjpzdHJpbmcgYWxpYXMgPSAiXyIgKyBtb2R1bGVfbmFtZTsKKyAgLy8gR2VuZXJhdGUgYSB1bmlxdWUgYWxpYXMgYnkgYWRkaW5nIF8xIHN1ZmZpeGVzIHVudGlsIHdlIGdldCBhbiB1bnVzZWQgYWxpYXMuCisgIHdoaWxlIChzZWVuX2FsaWFzZXMtPmZpbmQoYWxpYXMpICE9IHNlZW5fYWxpYXNlcy0+ZW5kKCkpIHsKKyAgICBhbGlhcyA9IGFsaWFzICsgIl8xIjsKKyAgfQorICBwcmludGVyXy0+UHJpbnQoIiRzdGF0ZW1lbnQkIGFzICRhbGlhcyRcbiIsICJzdGF0ZW1lbnQiLAorICAgICAgICAgICAgICAgICAgaW1wb3J0X3N0YXRlbWVudCwgImFsaWFzIiwgYWxpYXMpOworICAoKmltcG9ydF9tYXApW2ZpbGVuYW1lXSA9IGFsaWFzOworICBzZWVuX2FsaWFzZXMtPmluc2VydChhbGlhcyk7Cit9CisKK3ZvaWQgUHlpR2VuZXJhdG9yOjpQcmludEltcG9ydHMoCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogaXRlbV9tYXAsCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiogaW1wb3J0X21hcCkgY29uc3QgeworICAvLyBQcmludHMgaW1wb3J0ZWQgZGVwZW5kZW50IF9wYjIgZmlsZXMuCisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBzZWVuX2FsaWFzZXM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlcCA9IGZpbGVfLT5kZXBlbmRlbmN5KGkpOworICAgIFByaW50SW1wb3J0Rm9yRGVzY3JpcHRvcigqZGVwLCBpbXBvcnRfbWFwLCAmc2Vlbl9hbGlhc2VzKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlcC0+cHVibGljX2RlcGVuZGVuY3lfY291bnQoKTsgKytqKSB7CisgICAgICBQcmludEltcG9ydEZvckRlc2NyaXB0b3IoCisgICAgICAgICAgKmRlcC0+cHVibGljX2RlcGVuZGVuY3koaiksIGltcG9ydF9tYXAsICZzZWVuX2FsaWFzZXMpOworICAgIH0KKyAgfQorCisgIC8vIENoZWNrcyB3aGF0IG1vZHVsZXMgc2hvdWxkIGJlIGltcG9ydGVkLgorICBJbXBvcnRNb2R1bGVzIGltcG9ydF9tb2R1bGVzOworICBpZiAoZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpID4gMCkgeworICAgIGltcG9ydF9tb2R1bGVzLmhhc19tZXNzYWdlcyA9IHRydWU7CisgIH0KKyAgaWYgKGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKSA+IDApIHsKKyAgICBpbXBvcnRfbW9kdWxlcy5oYXNfZW51bXMgPSB0cnVlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBDaGVja0ltcG9ydE1vZHVsZXMoZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSwgJmltcG9ydF9tb2R1bGVzKTsKKyAgfQorCisgIC8vIFByaW50cyBtb2R1bGVzIChlLmcuIF9jb250YWluZXJzLCBfbWVzc2FnZXMsIHR5cGluZykgdGhhdCBhcmUKKyAgLy8gcmVxdWlyZWQgaW4gdGhlIHByb3RvIGZpbGUuCisgIGlmIChpbXBvcnRfbW9kdWxlcy5oYXNfcmVwZWF0ZWQpIHsKKyAgICBwcmludGVyXy0+UHJpbnQoCisgICAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgY29udGFpbmVycyBhcyAiCisgICAgICAgICJfY29udGFpbmVyc1xuIik7CisgIH0KKyAgaWYgKGltcG9ydF9tb2R1bGVzLmhhc19lbnVtcykgeworICAgIHByaW50ZXJfLT5QcmludCgKKyAgICAgICAgImZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbnVtX3R5cGVfd3JhcHBlciIKKyAgICAgICAgIiBhcyBfZW51bV90eXBlX3dyYXBwZXJcbiIpOworICB9CisgIGlmIChpbXBvcnRfbW9kdWxlcy5oYXNfZXh0ZW5kYWJsZSkgeworICAgIHByaW50ZXJfLT5QcmludCgKKyAgICAgICAgImZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBweXRob25fbWVzc2FnZSIKKyAgICAgICAgIiBhcyBfcHl0aG9uX21lc3NhZ2VcbiIpOworICB9CisgIGlmIChpbXBvcnRfbW9kdWxlcy5oYXNfd2VsbF9rbm93bl90eXBlKSB7CisgICAgcHJpbnRlcl8tPlByaW50KAorICAgICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHdlbGxfa25vd25fdHlwZXMiCisgICAgICAgICIgYXMgX3dlbGxfa25vd25fdHlwZXNcbiIpOworICB9CisgIHByaW50ZXJfLT5QcmludCgKKyAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQiCisgICAgICAiIGRlc2NyaXB0b3IgYXMgX2Rlc2NyaXB0b3JcbiIpOworICBpZiAoaW1wb3J0X21vZHVsZXMuaGFzX21lc3NhZ2VzKSB7CisgICAgcHJpbnRlcl8tPlByaW50KAorICAgICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UgYXMgX21lc3NhZ2VcbiIpOworICB9CisgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8pKSB7CisgICAgcHJpbnRlcl8tPlByaW50KAorICAgICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHNlcnZpY2UgYXMiCisgICAgICAgICIgX3NlcnZpY2VcbiIpOworICB9CisgIHByaW50ZXJfLT5QcmludCgiZnJvbSB0eXBpbmcgaW1wb3J0ICIpOworICBwcmludGVyXy0+UHJpbnQoIkNsYXNzVmFyIGFzIF9DbGFzc1ZhciIpOworICBpZiAoaW1wb3J0X21vZHVsZXMuaGFzX2l0ZXJhYmxlKSB7CisgICAgcHJpbnRlcl8tPlByaW50KCIsIEl0ZXJhYmxlIGFzIF9JdGVyYWJsZSIpOworICB9CisgIGlmIChpbXBvcnRfbW9kdWxlcy5oYXNfbWFwcGluZykgeworICAgIHByaW50ZXJfLT5QcmludCgiLCBNYXBwaW5nIGFzIF9NYXBwaW5nIik7CisgIH0KKyAgaWYgKGltcG9ydF9tb2R1bGVzLmhhc19vcHRpb25hbCkgeworICAgIHByaW50ZXJfLT5QcmludCgiLCBPcHRpb25hbCBhcyBfT3B0aW9uYWwiKTsKKyAgfQorICBpZiAoaW1wb3J0X21vZHVsZXMuaGFzX3VuaW9uKSB7CisgICAgcHJpbnRlcl8tPlByaW50KCIsIFVuaW9uIGFzIF9VbmlvbiIpOworICB9CisgIHByaW50ZXJfLT5QcmludCgiXG5cbiIpOworCisgIC8vIFB1YmxpYyBpbXBvcnRzCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnB1YmxpY19kZXBlbmRlbmN5X2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBwdWJsaWNfZGVwID0gZmlsZV8tPnB1YmxpY19kZXBlbmRlbmN5KGkpOworICAgIHN0ZDo6c3RyaW5nIG1vZHVsZV9uYW1lID0gU3RyaXBwZWRNb2R1bGVOYW1lKHB1YmxpY19kZXAtPm5hbWUoKSk7CisgICAgLy8gVG9wIGxldmVsIG1lc3NhZ2VzIGluIHB1YmxpYyBpbXBvcnRzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdWJsaWNfZGVwLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgICBwcmludGVyXy0+UHJpbnQoImZyb20gJG1vZHVsZSQgaW1wb3J0ICRtZXNzYWdlX2NsYXNzJFxuIiwgIm1vZHVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUsICJtZXNzYWdlX2NsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNfZGVwLT5tZXNzYWdlX3R5cGUoaSktPm5hbWUoKSk7CisgICAgfQorICAgIC8vIFRvcCBsZXZlbCBlbnVtcyBmb3IgcHVibGljIGltcG9ydHMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHB1YmxpY19kZXAtPmVudW1fdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICAgIHByaW50ZXJfLT5QcmludCgiZnJvbSAkbW9kdWxlJCBpbXBvcnQgJGVudW1fY2xhc3MkXG4iLCAibW9kdWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSwgImVudW1fY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY19kZXAtPmVudW1fdHlwZShpKS0+bmFtZSgpKTsKKyAgICB9CisgICAgLy8gRW51bSB2YWx1ZXMgZm9yIHB1YmxpYyBpbXBvcnRzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdWJsaWNfZGVwLT5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yID0gcHVibGljX2RlcC0+ZW51bV90eXBlKGkpOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbnVtX2Rlc2NyaXB0b3ItPnZhbHVlX2NvdW50KCk7ICsraikgeworICAgICAgICAoKml0ZW1fbWFwKVtlbnVtX2Rlc2NyaXB0b3ItPnZhbHVlKGopLT5uYW1lKCldID0KKyAgICAgICAgICAgIE1vZHVsZUxldmVsTmFtZSgqZW51bV9kZXNjcmlwdG9yLCAqaW1wb3J0X21hcCk7CisgICAgICB9CisgICAgfQorICAgIC8vIFRvcCBsZXZlbCBleHRlbnNpb25zIGZvciBwdWJsaWMgaW1wb3J0cworICAgIEFkZEV4dGVuc2lvbnMoKnB1YmxpY19kZXAsIGl0ZW1fbWFwKTsKKyAgfQorfQorCit2b2lkIFB5aUdlbmVyYXRvcjo6UHJpbnRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yJiBlbnVtX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgZW51bV9uYW1lID0gZW51bV9kZXNjcmlwdG9yLm5hbWUoKTsKKyAgcHJpbnRlcl8tPlByaW50KAorICAgICAgImNsYXNzICRlbnVtX25hbWUkKGludCwgbWV0YWNsYXNzPV9lbnVtX3R5cGVfd3JhcHBlci5FbnVtVHlwZVdyYXBwZXIpOlxuIgorICAgICAgIiAgICBfX3Nsb3RzX18gPSBbXVxuIiwKKyAgICAgICJlbnVtX25hbWUiLCBlbnVtX25hbWUpOworfQorCisvLyBBZGRzIGVudW0gdmFsdWUgdG8gaXRlbSBtYXAgd2hpY2ggd2lsbCBiZSBvcmRlcmVkIGFuZCBwcmludGVkIGxhdGVyLgordm9pZCBQeWlHZW5lcmF0b3I6OkFkZEVudW1WYWx1ZSgKKyAgICBjb25zdCBFbnVtRGVzY3JpcHRvciYgZW51bV9kZXNjcmlwdG9yLAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIGl0ZW1fbWFwLAorICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGltcG9ydF9tYXApIGNvbnN0IHsKKyAgLy8gZW51bSB2YWx1ZXMKKyAgc3RkOjpzdHJpbmcgbW9kdWxlX2VudW1fbmFtZSA9IE1vZHVsZUxldmVsTmFtZShlbnVtX2Rlc2NyaXB0b3IsIGltcG9ydF9tYXApOworICBmb3IgKGludCBqID0gMDsgaiA8IGVudW1fZGVzY3JpcHRvci52YWx1ZV9jb3VudCgpOyArK2opIHsKKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZV9kZXNjcmlwdG9yID0gZW51bV9kZXNjcmlwdG9yLnZhbHVlKGopOworICAgICgqaXRlbV9tYXApW3ZhbHVlX2Rlc2NyaXB0b3ItPm5hbWUoKV0gPSBtb2R1bGVfZW51bV9uYW1lOworICB9Cit9CisKKy8vIFByaW50cyB0b3AgbGV2ZWwgZW51bXMKK3ZvaWQgUHlpR2VuZXJhdG9yOjpQcmludFRvcExldmVsRW51bXMoKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBwcmludGVyXy0+UHJpbnQoIlxuIik7CisgICAgUHJpbnRFbnVtKCpmaWxlXy0+ZW51bV90eXBlKGkpKTsKKyAgfQorfQorCisvLyBBZGQgdG9wIGxldmVsIGV4dGVuc2lvbnMgdG8gaXRlbV9tYXAgd2hpY2ggd2lsbCBiZSBvcmRlcmVkIGFuZAorLy8gcHJpbnRlZCBsYXRlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXNjcmlwdG9yVD4KK3ZvaWQgUHlpR2VuZXJhdG9yOjpBZGRFeHRlbnNpb25zKAorICAgIGNvbnN0IERlc2NyaXB0b3JUJiBkZXNjcmlwdG9yLAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIGl0ZW1fbWFwKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5leHRlbnNpb25fY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb25fZmllbGQgPSBkZXNjcmlwdG9yLmV4dGVuc2lvbihpKTsKKyAgICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lID0gZXh0ZW5zaW9uX2ZpZWxkLT5uYW1lKCkgKyAiX0ZJRUxEX05VTUJFUiI7CisgICAgVG9VcHBlcigmY29uc3RhbnRfbmFtZSk7CisgICAgKCppdGVtX21hcClbY29uc3RhbnRfbmFtZV0gPSAiX0NsYXNzVmFyW2ludF0iOworICAgICgqaXRlbV9tYXApW2V4dGVuc2lvbl9maWVsZC0+bmFtZSgpXSA9ICJfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IiOworICB9Cit9CisKKy8vIFJldHVybnMgdGhlIHN0cmluZyBmb3JtYXQgb2YgYSBmaWVsZCdzIGNwcF90eXBlCitzdGQ6OnN0cmluZyBQeWlHZW5lcmF0b3I6OkdldEZpZWxkVHlwZSgKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkX2RlcywgY29uc3QgRGVzY3JpcHRvciYgY29udGFpbmluZ19kZXMsCisgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgaW1wb3J0X21hcCkgY29uc3QgeworICBzd2l0Y2ggKGZpZWxkX2Rlcy5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICByZXR1cm4gImZsb2F0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgICAgcmV0dXJuICJib29sIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgcmV0dXJuIE1vZHVsZUxldmVsTmFtZSgqZmllbGRfZGVzLmVudW1fdHlwZSgpLCBpbXBvcnRfbWFwKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICBpZiAoZmllbGRfZGVzLnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7CisgICAgICAgIHJldHVybiAic3RyIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiYnl0ZXMiOworICAgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6IHsKKyAgICAgIC8vIElmIHRoZSBmaWVsZCBpcyBpbnNpZGUgYSBuZXN0ZWQgbWVzc2FnZSBhbmQgdGhlIG5lc3RlZCBtZXNzYWdlIGhhcyB0aGUKKyAgICAgIC8vIHNhbWUgbmFtZSBhcyBhIHRvcC1sZXZlbCBtZXNzYWdlLCB0aGVuIHdlIG5lZWQgdG8gcHJlZml4IHRoZSBmaWVsZCB0eXBlCisgICAgICAvLyB3aXRoIHRoZSBtb2R1bGUgbmFtZSBmb3IgZGlzYW1iaWd1YXRpb24uCisgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gTW9kdWxlTGV2ZWxOYW1lKCpmaWVsZF9kZXMubWVzc2FnZV90eXBlKCksIGltcG9ydF9tYXApOworICAgICAgaWYgKChjb250YWluaW5nX2Rlcy5jb250YWluaW5nX3R5cGUoKSAhPSBudWxscHRyICYmCisgICAgICAgICAgIG5hbWUgPT0gY29udGFpbmluZ19kZXMubmFtZSgpKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBtb2R1bGUgPSBNb2R1bGVOYW1lKGZpZWxkX2Rlcy5maWxlKCktPm5hbWUoKSk7CisgICAgICAgIG5hbWUgPSBtb2R1bGUgKyAiLiIgKyBuYW1lOworICAgICAgfQorICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5zdXBwb3J0ZWQgZmllbGQgdHlwZS4iOworICB9CisgIHJldHVybiAiIjsKK30KKwordm9pZCBQeWlHZW5lcmF0b3I6OlByaW50TWVzc2FnZSgKKyAgICBjb25zdCBEZXNjcmlwdG9yJiBtZXNzYWdlX2Rlc2NyaXB0b3IsIGJvb2wgaXNfbmVzdGVkLAorICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGltcG9ydF9tYXApIGNvbnN0IHsKKyAgaWYgKCFpc19uZXN0ZWQpIHsKKyAgICBwcmludGVyXy0+UHJpbnQoIlxuIik7CisgIH0KKyAgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZSA9IG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lKCk7CisgIHN0ZDo6c3RyaW5nIGV4dHJhX2Jhc2U7CisgIC8vIEEgd2VsbC1rbm93biB0eXBlIG5lZWRzIHRvIGluaGVyaXQgZnJvbSBpdHMgY29ycmVzcG9uZGluZyBiYXNlIGNsYXNzIGluCisgIC8vIG5ldC9wcm90bzIvcHl0aG9uL2ludGVybmFsL3dlbGxfa25vd25fdHlwZXMuCisgIGlmIChJc1dlbGxLbm93blR5cGUobWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSgpKSkgeworICAgIGV4dHJhX2Jhc2UgPSAiLCBfd2VsbF9rbm93bl90eXBlcy4iICsgbWVzc2FnZV9kZXNjcmlwdG9yLm5hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBleHRyYV9iYXNlID0gIiI7CisgIH0KKyAgcHJpbnRlcl8tPlByaW50KCJjbGFzcyAkY2xhc3NfbmFtZSQoX21lc3NhZ2UuTWVzc2FnZSRleHRyYV9iYXNlJCk6XG4iLAorICAgICAgICAgICAgICAgICAgImNsYXNzX25hbWUiLCBjbGFzc19uYW1lLCAiZXh0cmFfYmFzZSIsIGV4dHJhX2Jhc2UpOworICBwcmludGVyXy0+SW5kZW50KCk7CisgIHByaW50ZXJfLT5JbmRlbnQoKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIGZpZWxkcy5yZXNlcnZlKG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZF9jb3VudCgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgZmllbGRzLnB1c2hfYmFjayhtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGQoaSkpOworICB9CisgIHN0ZDo6c29ydChmaWVsZHMuYmVnaW4oKSwgZmllbGRzLmVuZCgpLCBTb3J0QnlOYW1lPEZpZWxkRGVzY3JpcHRvcj4oKSk7CisKKyAgLy8gUHJpbnRzIHNsb3RzCisgIHByaW50ZXJfLT5QcmludCgiX19zbG90c19fID0gWyIsICJjbGFzc19uYW1lIiwgY2xhc3NfbmFtZSk7CisgIGJvb2wgZmlyc3RfaXRlbSA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byYgZmllbGRfZGVzIDogZmllbGRzKSB7CisgICAgaWYgKElzUHl0aG9uS2V5d29yZChmaWVsZF9kZXMtPm5hbWUoKSkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoZmlyc3RfaXRlbSkgeworICAgICAgZmlyc3RfaXRlbSA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyXy0+UHJpbnQoIiwgIik7CisgICAgfQorICAgIHByaW50ZXJfLT5QcmludCgiXCIkZmllbGRfbmFtZSRcIiIsICJmaWVsZF9uYW1lIiwgZmllbGRfZGVzLT5uYW1lKCkpOworICB9CisgIHByaW50ZXJfLT5QcmludCgiXVxuIik7CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBpdGVtX21hcDsKKyAgLy8gUHJpbnRzIEV4dGVuc2lvbnMgZm9yIGV4dGVuZGFibGUgbWVzc2FnZXMKKyAgaWYgKG1lc3NhZ2VfZGVzY3JpcHRvci5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBpdGVtX21hcFsiRXh0ZW5zaW9ucyJdID0gIl9weXRob25fbWVzc2FnZS5fRXh0ZW5zaW9uRGljdCI7CisgIH0KKworICAvLyBQcmludHMgbmVzdGVkIGVudW1zCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEVudW1EZXNjcmlwdG9yKj4gbmVzdGVkX2VudW1zOworICBuZXN0ZWRfZW51bXMucmVzZXJ2ZShtZXNzYWdlX2Rlc2NyaXB0b3IuZW51bV90eXBlX2NvdW50KCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfZGVzY3JpcHRvci5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgbmVzdGVkX2VudW1zLnB1c2hfYmFjayhtZXNzYWdlX2Rlc2NyaXB0b3IuZW51bV90eXBlKGkpKTsKKyAgfQorICBzdGQ6OnNvcnQobmVzdGVkX2VudW1zLmJlZ2luKCksIG5lc3RlZF9lbnVtcy5lbmQoKSwKKyAgICAgICAgICAgIFNvcnRCeU5hbWU8RW51bURlc2NyaXB0b3I+KCkpOworCisgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBuZXN0ZWRfZW51bXMpIHsKKyAgICBQcmludEVudW0oKmVudHJ5KTsKKyAgICAvLyBBZGRzIGVudW0gdmFsdWUgdG8gaXRlbV9tYXAgd2hpY2ggd2lsbCBiZSBvcmRlcmVkIGFuZCBwcmludGVkIGxhdGVyCisgICAgQWRkRW51bVZhbHVlKCplbnRyeSwgJml0ZW1fbWFwLCBpbXBvcnRfbWFwKTsKKyAgfQorCisgIC8vIFByaW50cyBuZXN0ZWQgbWVzc2FnZXMKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+IG5lc3RlZF9tZXNzYWdlczsKKyAgbmVzdGVkX21lc3NhZ2VzLnJlc2VydmUobWVzc2FnZV9kZXNjcmlwdG9yLm5lc3RlZF90eXBlX2NvdW50KCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfZGVzY3JpcHRvci5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBuZXN0ZWRfbWVzc2FnZXMucHVzaF9iYWNrKG1lc3NhZ2VfZGVzY3JpcHRvci5uZXN0ZWRfdHlwZShpKSk7CisgIH0KKyAgc3RkOjpzb3J0KG5lc3RlZF9tZXNzYWdlcy5iZWdpbigpLCBuZXN0ZWRfbWVzc2FnZXMuZW5kKCksCisgICAgICAgICAgICBTb3J0QnlOYW1lPERlc2NyaXB0b3I+KCkpOworCisgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBuZXN0ZWRfbWVzc2FnZXMpIHsKKyAgICBQcmludE1lc3NhZ2UoKmVudHJ5LCB0cnVlLCBpbXBvcnRfbWFwKTsKKyAgfQorCisgIC8vIEFkZHMgZXh0ZW5zaW9ucyB0byBpdGVtX21hcCB3aGljaCB3aWxsIGJlIG9yZGVyZWQgYW5kIHByaW50ZWQgbGF0ZXIKKyAgQWRkRXh0ZW5zaW9ucyhtZXNzYWdlX2Rlc2NyaXB0b3IsICZpdGVtX21hcCk7CisKKyAgLy8gQWRkcyBmaWVsZCBudW1iZXIgYW5kIGZpZWxkIGRlc2NyaXB0b3IgdG8gaXRlbV9tYXAKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZF9kZXMgPSAqbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkKGkpOworICAgIGl0ZW1fbWFwW1RvVXBwZXIoZmllbGRfZGVzLm5hbWUoKSkgKyAiX0ZJRUxEX05VTUJFUiJdID0KKyAgICAgICAgIl9DbGFzc1ZhcltpbnRdIjsKKyAgICBpZiAoSXNQeXRob25LZXl3b3JkKGZpZWxkX2Rlcy5uYW1lKCkpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgZmllbGRfdHlwZSA9ICIiOworICAgIGlmIChmaWVsZF9kZXMuaXNfbWFwKCkpIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5X2RlcyA9IGZpZWxkX2Rlcy5tZXNzYWdlX3R5cGUoKS0+ZmllbGQoMCk7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHZhbHVlX2RlcyA9IGZpZWxkX2Rlcy5tZXNzYWdlX3R5cGUoKS0+ZmllbGQoMSk7CisgICAgICBmaWVsZF90eXBlID0gKHZhbHVlX2Rlcy0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRQorICAgICAgICAgICAgICAgICAgICAgICAgPyAiX2NvbnRhaW5lcnMuTWVzc2FnZU1hcFsiCisgICAgICAgICAgICAgICAgICAgICAgICA6ICJfY29udGFpbmVycy5TY2FsYXJNYXBbIik7CisgICAgICBmaWVsZF90eXBlICs9IEdldEZpZWxkVHlwZSgqa2V5X2RlcywgbWVzc2FnZV9kZXNjcmlwdG9yLCBpbXBvcnRfbWFwKTsKKyAgICAgIGZpZWxkX3R5cGUgKz0gIiwgIjsKKyAgICAgIGZpZWxkX3R5cGUgKz0gR2V0RmllbGRUeXBlKCp2YWx1ZV9kZXMsIG1lc3NhZ2VfZGVzY3JpcHRvciwgaW1wb3J0X21hcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChmaWVsZF9kZXMuaXNfcmVwZWF0ZWQoKSkgeworICAgICAgICBmaWVsZF90eXBlID0gKGZpZWxkX2Rlcy5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gIl9jb250YWluZXJzLlJlcGVhdGVkQ29tcG9zaXRlRmllbGRDb250YWluZXJbIgorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJfY29udGFpbmVycy5SZXBlYXRlZFNjYWxhckZpZWxkQ29udGFpbmVyWyIpOworICAgICAgfQorICAgICAgZmllbGRfdHlwZSArPSBHZXRGaWVsZFR5cGUoZmllbGRfZGVzLCBtZXNzYWdlX2Rlc2NyaXB0b3IsIGltcG9ydF9tYXApOworICAgIH0KKworICAgIGlmIChmaWVsZF9kZXMuaXNfcmVwZWF0ZWQoKSkgeworICAgICAgZmllbGRfdHlwZSArPSAiXSI7CisgICAgfQorICAgIGl0ZW1fbWFwW2ZpZWxkX2Rlcy5uYW1lKCldID0gZmllbGRfdHlwZTsKKyAgfQorCisgIC8vIFByaW50cyBhbGwgaXRlbXMgaW4gaXRlbV9tYXAKKyAgUHJpbnRJdGVtTWFwKGl0ZW1fbWFwKTsKKworICAvLyBQcmludHMgX19pbml0X18KKyAgcHJpbnRlcl8tPlByaW50KCJkZWYgX19pbml0X18oc2VsZiIpOworICBib29sIGhhc19rZXlfd29yZHMgPSBmYWxzZTsKKyAgYm9vbCBpc19maXJzdCA9IHRydWU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkKGkpOworICAgIGlmIChJc1B5dGhvbktleXdvcmQoZmllbGRfZGVzLT5uYW1lKCkpKSB7CisgICAgICBoYXNfa2V5X3dvcmRzID0gdHJ1ZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGRfZGVzLT5uYW1lKCk7CisgICAgaWYgKGlzX2ZpcnN0ICYmIGZpZWxkX25hbWUgPT0gInNlbGYiKSB7CisgICAgICAvLyBTZWUgYi8xNDQxNDY3OTMgZm9yIGFuIGV4YW1wbGUgb2YgcmVhbCBjb2RlIHRoYXQgZ2VuZXJhdGVzIGEgKHNlbGYsCisgICAgICAvLyBzZWxmKSBtZXRob2Qgc2lnbmF0dXJlLiBTaW5jZSByZXBlYXRpbmcgYSBwYXJhbWV0ZXIgbmFtZSBpcyBpbGxlZ2FsIGluCisgICAgICAvLyBQeXRob24sIHdlIHJlbmFtZSB0aGUgZHVwbGljYXRlIHNlbGYuCisgICAgICBmaWVsZF9uYW1lID0gInNlbGZfIjsKKyAgICB9CisgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICBwcmludGVyXy0+UHJpbnQoIiwgJGZpZWxkX25hbWUkOiAiLCAiZmllbGRfbmFtZSIsIGZpZWxkX25hbWUpOworICAgIGlmIChmaWVsZF9kZXMtPmlzX3JlcGVhdGVkKCkgfHwKKyAgICAgICAgZmllbGRfZGVzLT5jcHBfdHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MKSB7CisgICAgICBwcmludGVyXy0+UHJpbnQoIl9PcHRpb25hbFsiKTsKKyAgICB9CisgICAgaWYgKGZpZWxkX2Rlcy0+aXNfbWFwKCkpIHsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3IqIG1hcF9lbnRyeSA9IGZpZWxkX2Rlcy0+bWVzc2FnZV90eXBlKCk7CisgICAgICBwcmludGVyXy0+UHJpbnQoCisgICAgICAgICAgIl9NYXBwaW5nWyRrZXlfdHlwZSQsICR2YWx1ZV90eXBlJF0iLCAia2V5X3R5cGUiLAorICAgICAgICAgIEdldEZpZWxkVHlwZSgqbWFwX2VudHJ5LT5maWVsZCgwKSwgbWVzc2FnZV9kZXNjcmlwdG9yLCBpbXBvcnRfbWFwKSwKKyAgICAgICAgICAidmFsdWVfdHlwZSIsCisgICAgICAgICAgR2V0RmllbGRUeXBlKCptYXBfZW50cnktPmZpZWxkKDEpLCBtZXNzYWdlX2Rlc2NyaXB0b3IsIGltcG9ydF9tYXApKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGZpZWxkX2Rlcy0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICBwcmludGVyXy0+UHJpbnQoIl9JdGVyYWJsZVsiKTsKKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF9kZXMtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgICAgcHJpbnRlcl8tPlByaW50KAorICAgICAgICAgICAgIl9VbmlvblskdHlwZV9uYW1lJCwgX01hcHBpbmddIiwgInR5cGVfbmFtZSIsCisgICAgICAgICAgICBHZXRGaWVsZFR5cGUoKmZpZWxkX2RlcywgbWVzc2FnZV9kZXNjcmlwdG9yLCBpbXBvcnRfbWFwKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZmllbGRfZGVzLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNKSB7CisgICAgICAgICAgcHJpbnRlcl8tPlByaW50KCJfVW5pb25bJHR5cGVfbmFtZSQsIHN0cl0iLCAidHlwZV9uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlTGV2ZWxOYW1lKCpmaWVsZF9kZXMtPmVudW1fdHlwZSgpLCBpbXBvcnRfbWFwKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRlcl8tPlByaW50KAorICAgICAgICAgICAgICAiJHR5cGVfbmFtZSQiLCAidHlwZV9uYW1lIiwKKyAgICAgICAgICAgICAgR2V0RmllbGRUeXBlKCpmaWVsZF9kZXMsIG1lc3NhZ2VfZGVzY3JpcHRvciwgaW1wb3J0X21hcCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfZGVzLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgIHByaW50ZXJfLT5QcmludCgiXSIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoZmllbGRfZGVzLT5pc19yZXBlYXRlZCgpIHx8CisgICAgICAgIGZpZWxkX2Rlcy0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTCkgeworICAgICAgcHJpbnRlcl8tPlByaW50KCJdIik7CisgICAgfQorICAgIHByaW50ZXJfLT5QcmludCgiID0gLi4uIik7CisgIH0KKyAgaWYgKGhhc19rZXlfd29yZHMpIHsKKyAgICBwcmludGVyXy0+UHJpbnQoIiwgKiprd2FyZ3MiKTsKKyAgfQorICBwcmludGVyXy0+UHJpbnQoIikgLT4gTm9uZTogLi4uXG4iKTsKKworICBwcmludGVyXy0+T3V0ZGVudCgpOworICBwcmludGVyXy0+T3V0ZGVudCgpOworfQorCit2b2lkIFB5aUdlbmVyYXRvcjo6UHJpbnRNZXNzYWdlcygKKyAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBpbXBvcnRfbWFwKSBjb25zdCB7CisgIC8vIERldGVybWluaXN0aWNhbGx5IG9yZGVyIHRoZSBkZXNjcmlwdG9ycy4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+IG1lc3NhZ2VzOworICBtZXNzYWdlcy5yZXNlcnZlKGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBtZXNzYWdlcy5wdXNoX2JhY2soZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7CisgIH0KKyAgc3RkOjpzb3J0KG1lc3NhZ2VzLmJlZ2luKCksIG1lc3NhZ2VzLmVuZCgpLCBTb3J0QnlOYW1lPERlc2NyaXB0b3I+KCkpOworCisgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBtZXNzYWdlcykgeworICAgIFByaW50TWVzc2FnZSgqZW50cnksIGZhbHNlLCBpbXBvcnRfbWFwKTsKKyAgfQorfQorCit2b2lkIFB5aUdlbmVyYXRvcjo6UHJpbnRTZXJ2aWNlcygpIGNvbnN0IHsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgU2VydmljZURlc2NyaXB0b3IqPiBzZXJ2aWNlczsKKyAgc2VydmljZXMucmVzZXJ2ZShmaWxlXy0+c2VydmljZV9jb3VudCgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpOyArK2kpIHsKKyAgICBzZXJ2aWNlcy5wdXNoX2JhY2soZmlsZV8tPnNlcnZpY2UoaSkpOworICB9CisgIHN0ZDo6c29ydChzZXJ2aWNlcy5iZWdpbigpLCBzZXJ2aWNlcy5lbmQoKSwgU29ydEJ5TmFtZTxTZXJ2aWNlRGVzY3JpcHRvcj4oKSk7CisKKyAgLy8gUHJpbnRzICRTZXJ2aWNlJCBhbmQgJFNlcnZpY2UkX1N0dWIgY2xhc3NlcworICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogc2VydmljZXMpIHsKKyAgICBwcmludGVyXy0+UHJpbnQoIlxuIik7CisgICAgcHJpbnRlcl8tPlByaW50KAorICAgICAgICAiY2xhc3MgJHNlcnZpY2VfbmFtZSQoX3NlcnZpY2Uuc2VydmljZSk6IC4uLlxuXG4iCisgICAgICAgICJjbGFzcyAkc2VydmljZV9uYW1lJF9TdHViKCRzZXJ2aWNlX25hbWUkKTogLi4uXG4iLAorICAgICAgICAic2VydmljZV9uYW1lIiwgZW50cnktPm5hbWUoKSk7CisgIH0KK30KKworYm9vbCBQeWlHZW5lcmF0b3I6OkdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZXJyb3IpIGNvbnN0IHsKKyAgTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgIC8vIENhbGN1bGF0ZSBmaWxlIG5hbWUuCisgIGZpbGVfID0gZmlsZTsKKyAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPQorICAgICAgcGFyYW1ldGVyLmVtcHR5KCkgPyBHZXRGaWxlTmFtZShmaWxlLCAiLnB5aSIpIDogcGFyYW1ldGVyOworCisgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dChjb250ZXh0LT5PcGVuKGZpbGVuYW1lKSk7CisgIEdPT0dMRV9DSEVDSyhvdXRwdXQuZ2V0KCkpOworICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKKyAgcHJpbnRlcl8gPSAmcHJpbnRlcjsKKworICAvLyBpdGVtIG1hcCB3aWxsIHN0b3JlICJERVNDUklQVE9SIiwgdG9wIGxldmVsIGV4dGVuc2lvbnMsIHRvcCBsZXZlbCBlbnVtCisgIC8vIHZhbHVlcy4gVGhlIGl0ZW1zIHdpbGwgYmUgc29ydGVkIGFuZCBwcmludGVkIGxhdGVyLgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGl0ZW1fbWFwOworCisgIC8vIEFkZHMgIkRFU0NSSVBUT1IiIGludG8gaXRlbV9tYXAuCisgIGl0ZW1fbWFwWyJERVNDUklQVE9SIl0gPSAiX2Rlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IiOworCisgIC8vIGltcG9ydF9tYXAgd2lsbCBiZSBhIG1hcHBpbmcgZnJvbSBmaWxlbmFtZSB0byBtb2R1bGUgYWxpYXMsIGUuZy4KKyAgLy8gImdvb2dsZTMvZm9vL2Jhci5weSIgLT4gIl9iYXIiCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gaW1wb3J0X21hcDsKKworICBQcmludEltcG9ydHMoJml0ZW1fbWFwLCAmaW1wb3J0X21hcCk7CisgIC8vIEFkZHMgdG9wIGxldmVsIGVudW0gdmFsdWVzIHRvIGl0ZW1fbWFwLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgQWRkRW51bVZhbHVlKCpmaWxlXy0+ZW51bV90eXBlKGkpLCAmaXRlbV9tYXAsIGltcG9ydF9tYXApOworICB9CisgIC8vIEFkZHMgdG9wIGxldmVsIGV4dGVuc2lvbnMgdG8gaXRlbV9tYXAuCisgIEFkZEV4dGVuc2lvbnMoKmZpbGVfLCAmaXRlbV9tYXApOworICAvLyBQcmludHMgaXRlbSBtYXAKKyAgUHJpbnRJdGVtTWFwKGl0ZW1fbWFwKTsKKworICBQcmludE1lc3NhZ2VzKGltcG9ydF9tYXApOworICBQcmludFRvcExldmVsRW51bXMoKTsKKyAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlKSkgeworICAgIFByaW50U2VydmljZXMoKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5aV9nZW5lcmF0b3IuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5aV9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjExZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHlpX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTIwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBqaWVsdW9AZ29vZ2xlLmNvbSAoSmllIEx1bykKKy8vCisvLyBHZW5lcmF0ZXMgUHl0aG9uIHN0dWIgKC5weWkpIGZvciBhIGdpdmVuIC5wcm90byBmaWxlLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QWVRIT05fUFlJX0dFTkVSQVRPUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BZVEhPTl9QWUlfR0VORVJBVE9SX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbXV0ZXguaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK2NsYXNzIERlc2NyaXB0b3I7CitjbGFzcyBFbnVtRGVzY3JpcHRvcjsKK2NsYXNzIEZpZWxkRGVzY3JpcHRvcjsKK2NsYXNzIE1ldGhvZERlc2NyaXB0b3I7CitjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsKKworbmFtZXNwYWNlIGlvIHsKK2NsYXNzIFByaW50ZXI7Cit9CisKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgcHl0aG9uIHsKKworY2xhc3MgUFJPVE9DX0VYUE9SVCBQeWlHZW5lcmF0b3IgOiBwdWJsaWMgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgUHlpR2VuZXJhdG9yKCk7CisgIH5QeWlHZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICAvLyBDb2RlR2VuZXJhdG9yIG1ldGhvZHMuCisgIHVpbnQ2NF90IEdldFN1cHBvcnRlZEZlYXR1cmVzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIC8vIENvZGUgZ2VuZXJhdG9ycyBtdXN0IGV4cGxpY2l0bHkgc3VwcG9ydCBwcm90bzMgb3B0aW9uYWwuCisgICAgcmV0dXJuIENvZGVHZW5lcmF0b3I6OkZFQVRVUkVfUFJPVE8zX09QVElPTkFMOworICB9CisgIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHZvaWQgUHJpbnRJbXBvcnRGb3JEZXNjcmlwdG9yKGNvbnN0IEZpbGVEZXNjcmlwdG9yJiBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiBpbXBvcnRfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIHNlZW5fYWxpYXNlcykgY29uc3Q7CisgIHZvaWQgUHJpbnRJbXBvcnRzKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIGl0ZW1fbWFwLAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiBpbXBvcnRfbWFwKSBjb25zdDsKKyAgdm9pZCBQcmludEVudW0oY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvcikgY29uc3Q7CisgIHZvaWQgQWRkRW51bVZhbHVlKGNvbnN0IEVudW1EZXNjcmlwdG9yJiBlbnVtX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIGl0ZW1fbWFwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBpbXBvcnRfbWFwKSBjb25zdDsKKyAgdm9pZCBQcmludFRvcExldmVsRW51bXMoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUPgorICB2b2lkIEFkZEV4dGVuc2lvbnMoY29uc3QgRGVzY3JpcHRvclQmIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiBpdGVtX21hcCkgY29uc3Q7CisgIHZvaWQgUHJpbnRNZXNzYWdlcygKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGltcG9ydF9tYXApIGNvbnN0OworICB2b2lkIFByaW50TWVzc2FnZShjb25zdCBEZXNjcmlwdG9yJiBtZXNzYWdlX2Rlc2NyaXB0b3IsIGJvb2wgaXNfbmVzdGVkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBpbXBvcnRfbWFwKSBjb25zdDsKKyAgdm9pZCBQcmludFNlcnZpY2VzKCkgY29uc3Q7CisgIHZvaWQgUHJpbnRJdGVtTWFwKGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGl0ZW1fbWFwKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgR2V0RmllbGRUeXBlKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZF9kZXMsIGNvbnN0IERlc2NyaXB0b3ImIGNvbnRhaW5pbmdfZGVzLAorICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgaW1wb3J0X21hcCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXNjcmlwdG9yVD4KKyAgc3RkOjpzdHJpbmcgTW9kdWxlTGV2ZWxOYW1lKAorICAgICAgY29uc3QgRGVzY3JpcHRvclQmIGRlc2NyaXB0b3IsCisgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBpbXBvcnRfbWFwKSBjb25zdDsKKworICAvLyBWZXJ5IGNvYXJzZS1ncmFpbmVkIGxvY2sgdG8gZW5zdXJlIHRoYXQgR2VuZXJhdGUoKSBpcyByZWVudHJhbnQuCisgIC8vIEd1YXJkcyBmaWxlXyBhbmQgcHJpbnRlcl8uCisgIG11dGFibGUgTXV0ZXggbXV0ZXhfOworICBtdXRhYmxlIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlXzsgIC8vIFNldCBpbiBHZW5lcmF0ZSgpLiAgVW5kZXIgbXV0ZXhfLgorICBtdXRhYmxlIGlvOjpQcmludGVyKiBwcmludGVyXzsgICAgICAgIC8vIFNldCBpbiBHZW5lcmF0ZSgpLiAgVW5kZXIgbXV0ZXhfLgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUHlpR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BZVEhPTl9QWUlfR0VORVJBVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZDQ4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QWVRIT05fUFlUSE9OX0dFTkVSQVRPUl9IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUFlUSE9OX1BZVEhPTl9HRU5FUkFUT1JfSF8KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vZ2VuZXJhdG9yLmg+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BZVEhPTl9QWVRIT05fR0VORVJBVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfY29kZS5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9jb2RlLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZWM5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfY29kZS5wcm90bwpAQCAtMCwwICsxLDcwIEBACitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBBLkIuQzsKKworaW1wb3J0ICJydWJ5X2dlbmVyYXRlZF9jb2RlX3Byb3RvMl9pbXBvcnQucHJvdG8iOworCittZXNzYWdlIFRlc3RNZXNzYWdlIHsKKyAgaW50MzIgb3B0aW9uYWxfaW50MzIgPSAxOworICBpbnQ2NCBvcHRpb25hbF9pbnQ2NCA9IDI7CisgIHVpbnQzMiBvcHRpb25hbF91aW50MzIgPSAzOworICB1aW50NjQgb3B0aW9uYWxfdWludDY0ID0gNDsKKyAgYm9vbCBvcHRpb25hbF9ib29sID0gNTsKKyAgZG91YmxlIG9wdGlvbmFsX2RvdWJsZSA9IDY7CisgIGZsb2F0IG9wdGlvbmFsX2Zsb2F0ID0gNzsKKyAgc3RyaW5nIG9wdGlvbmFsX3N0cmluZyA9IDg7CisgIGJ5dGVzIG9wdGlvbmFsX2J5dGVzID0gOTsKKyAgVGVzdEVudW0gb3B0aW9uYWxfZW51bSA9IDEwOworICBUZXN0TWVzc2FnZSBvcHRpb25hbF9tc2cgPSAxMTsKKyAgVGVzdEltcG9ydGVkTWVzc2FnZSBvcHRpb25hbF9wcm90bzJfc3VibWVzc2FnZSA9IDEyOworCisgIHJlcGVhdGVkIGludDMyIHJlcGVhdGVkX2ludDMyID0gMjE7CisgIHJlcGVhdGVkIGludDY0IHJlcGVhdGVkX2ludDY0ID0gMjI7CisgIHJlcGVhdGVkIHVpbnQzMiByZXBlYXRlZF91aW50MzIgPSAyMzsKKyAgcmVwZWF0ZWQgdWludDY0IHJlcGVhdGVkX3VpbnQ2NCA9IDI0OworICByZXBlYXRlZCBib29sIHJlcGVhdGVkX2Jvb2wgPSAyNTsKKyAgcmVwZWF0ZWQgZG91YmxlIHJlcGVhdGVkX2RvdWJsZSA9IDI2OworICByZXBlYXRlZCBmbG9hdCByZXBlYXRlZF9mbG9hdCA9IDI3OworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nID0gMjg7CisgIHJlcGVhdGVkIGJ5dGVzIHJlcGVhdGVkX2J5dGVzID0gMjk7CisgIHJlcGVhdGVkIFRlc3RFbnVtIHJlcGVhdGVkX2VudW0gPSAzMDsKKyAgcmVwZWF0ZWQgVGVzdE1lc3NhZ2UgcmVwZWF0ZWRfbXNnID0gMzE7CisKKyAgb25lb2YgbXlfb25lb2YgeworICAgIGludDMyIG9uZW9mX2ludDMyID0gNDE7CisgICAgaW50NjQgb25lb2ZfaW50NjQgPSA0MjsKKyAgICB1aW50MzIgb25lb2ZfdWludDMyID0gNDM7CisgICAgdWludDY0IG9uZW9mX3VpbnQ2NCA9IDQ0OworICAgIGJvb2wgb25lb2ZfYm9vbCA9IDQ1OworICAgIGRvdWJsZSBvbmVvZl9kb3VibGUgPSA0NjsKKyAgICBmbG9hdCBvbmVvZl9mbG9hdCA9IDQ3OworICAgIHN0cmluZyBvbmVvZl9zdHJpbmcgPSA0ODsKKyAgICBieXRlcyBvbmVvZl9ieXRlcyA9IDQ5OworICAgIFRlc3RFbnVtIG9uZW9mX2VudW0gPSA1MDsKKyAgICBUZXN0TWVzc2FnZSBvbmVvZl9tc2cgPSA1MTsKKyAgfQorCisgIG1hcDxpbnQzMiwgc3RyaW5nPiBtYXBfaW50MzJfc3RyaW5nID0gNjE7CisgIG1hcDxpbnQ2NCwgc3RyaW5nPiBtYXBfaW50NjRfc3RyaW5nID0gNjI7CisgIG1hcDx1aW50MzIsIHN0cmluZz4gbWFwX3VpbnQzMl9zdHJpbmcgPSA2MzsKKyAgbWFwPHVpbnQ2NCwgc3RyaW5nPiBtYXBfdWludDY0X3N0cmluZyA9IDY0OworICBtYXA8Ym9vbCwgc3RyaW5nPiBtYXBfYm9vbF9zdHJpbmcgPSA2NTsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBtYXBfc3RyaW5nX3N0cmluZyA9IDY2OworICBtYXA8c3RyaW5nLCBUZXN0TWVzc2FnZT4gbWFwX3N0cmluZ19tc2cgPSA2NzsKKyAgbWFwPHN0cmluZywgVGVzdEVudW0+IG1hcF9zdHJpbmdfZW51bSA9IDY4OworICBtYXA8c3RyaW5nLCBpbnQzMj4gbWFwX3N0cmluZ19pbnQzMiA9IDY5OworICBtYXA8c3RyaW5nLCBib29sPiBtYXBfc3RyaW5nX2Jvb2wgPSA3MDsKKworICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICAgIGludDMyIGZvbyA9IDE7CisgIH0KKworICBOZXN0ZWRNZXNzYWdlIG5lc3RlZF9tZXNzYWdlID0gODA7Cit9CisKK2VudW0gVGVzdEVudW0geworICBEZWZhdWx0ID0gMDsKKyAgQSA9IDE7CisgIEIgPSAyOworICBDID0gMzsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9jb2RlX3BiLnJiIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX2NvZGVfcGIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2YWM3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9jb2RlX3BiLnJiCkBAIC0wLDAgKzEsNzkgQEAKKyMgR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKyMgc291cmNlOiBydWJ5X2dlbmVyYXRlZF9jb2RlLnByb3RvCisKK3JlcXVpcmUgJ2dvb2dsZS9wcm90b2J1ZicKKworcmVxdWlyZSAncnVieV9nZW5lcmF0ZWRfY29kZV9wcm90bzJfaW1wb3J0X3BiJworCitHb29nbGU6OlByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbC5nZW5lcmF0ZWRfcG9vbC5idWlsZCBkbworICBhZGRfZmlsZSgicnVieV9nZW5lcmF0ZWRfY29kZS5wcm90byIsIDpzeW50YXggPT4gOnByb3RvMykgZG8KKyAgICBhZGRfbWVzc2FnZSAiQS5CLkMuVGVzdE1lc3NhZ2UiIGRvCisgICAgICBvcHRpb25hbCA6b3B0aW9uYWxfaW50MzIsIDppbnQzMiwgMQorICAgICAgb3B0aW9uYWwgOm9wdGlvbmFsX2ludDY0LCA6aW50NjQsIDIKKyAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF91aW50MzIsIDp1aW50MzIsIDMKKyAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF91aW50NjQsIDp1aW50NjQsIDQKKyAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9ib29sLCA6Ym9vbCwgNQorICAgICAgb3B0aW9uYWwgOm9wdGlvbmFsX2RvdWJsZSwgOmRvdWJsZSwgNgorICAgICAgb3B0aW9uYWwgOm9wdGlvbmFsX2Zsb2F0LCA6ZmxvYXQsIDcKKyAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9zdHJpbmcsIDpzdHJpbmcsIDgKKyAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9ieXRlcywgOmJ5dGVzLCA5CisgICAgICBvcHRpb25hbCA6b3B0aW9uYWxfZW51bSwgOmVudW0sIDEwLCAiQS5CLkMuVGVzdEVudW0iCisgICAgICBvcHRpb25hbCA6b3B0aW9uYWxfbXNnLCA6bWVzc2FnZSwgMTEsICJBLkIuQy5UZXN0TWVzc2FnZSIKKyAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9wcm90bzJfc3VibWVzc2FnZSwgOm1lc3NhZ2UsIDEyLCAiQS5CLkMuVGVzdEltcG9ydGVkTWVzc2FnZSIKKyAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF9pbnQzMiwgOmludDMyLCAyMQorICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX2ludDY0LCA6aW50NjQsIDIyCisgICAgICByZXBlYXRlZCA6cmVwZWF0ZWRfdWludDMyLCA6dWludDMyLCAyMworICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX3VpbnQ2NCwgOnVpbnQ2NCwgMjQKKyAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF9ib29sLCA6Ym9vbCwgMjUKKyAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF9kb3VibGUsIDpkb3VibGUsIDI2CisgICAgICByZXBlYXRlZCA6cmVwZWF0ZWRfZmxvYXQsIDpmbG9hdCwgMjcKKyAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF9zdHJpbmcsIDpzdHJpbmcsIDI4CisgICAgICByZXBlYXRlZCA6cmVwZWF0ZWRfYnl0ZXMsIDpieXRlcywgMjkKKyAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF9lbnVtLCA6ZW51bSwgMzAsICJBLkIuQy5UZXN0RW51bSIKKyAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF9tc2csIDptZXNzYWdlLCAzMSwgIkEuQi5DLlRlc3RNZXNzYWdlIgorICAgICAgbWFwIDptYXBfaW50MzJfc3RyaW5nLCA6aW50MzIsIDpzdHJpbmcsIDYxCisgICAgICBtYXAgOm1hcF9pbnQ2NF9zdHJpbmcsIDppbnQ2NCwgOnN0cmluZywgNjIKKyAgICAgIG1hcCA6bWFwX3VpbnQzMl9zdHJpbmcsIDp1aW50MzIsIDpzdHJpbmcsIDYzCisgICAgICBtYXAgOm1hcF91aW50NjRfc3RyaW5nLCA6dWludDY0LCA6c3RyaW5nLCA2NAorICAgICAgbWFwIDptYXBfYm9vbF9zdHJpbmcsIDpib29sLCA6c3RyaW5nLCA2NQorICAgICAgbWFwIDptYXBfc3RyaW5nX3N0cmluZywgOnN0cmluZywgOnN0cmluZywgNjYKKyAgICAgIG1hcCA6bWFwX3N0cmluZ19tc2csIDpzdHJpbmcsIDptZXNzYWdlLCA2NywgIkEuQi5DLlRlc3RNZXNzYWdlIgorICAgICAgbWFwIDptYXBfc3RyaW5nX2VudW0sIDpzdHJpbmcsIDplbnVtLCA2OCwgIkEuQi5DLlRlc3RFbnVtIgorICAgICAgbWFwIDptYXBfc3RyaW5nX2ludDMyLCA6c3RyaW5nLCA6aW50MzIsIDY5CisgICAgICBtYXAgOm1hcF9zdHJpbmdfYm9vbCwgOnN0cmluZywgOmJvb2wsIDcwCisgICAgICBvcHRpb25hbCA6bmVzdGVkX21lc3NhZ2UsIDptZXNzYWdlLCA4MCwgIkEuQi5DLlRlc3RNZXNzYWdlLk5lc3RlZE1lc3NhZ2UiCisgICAgICBvbmVvZiA6bXlfb25lb2YgZG8KKyAgICAgICAgb3B0aW9uYWwgOm9uZW9mX2ludDMyLCA6aW50MzIsIDQxCisgICAgICAgIG9wdGlvbmFsIDpvbmVvZl9pbnQ2NCwgOmludDY0LCA0MgorICAgICAgICBvcHRpb25hbCA6b25lb2ZfdWludDMyLCA6dWludDMyLCA0MworICAgICAgICBvcHRpb25hbCA6b25lb2ZfdWludDY0LCA6dWludDY0LCA0NAorICAgICAgICBvcHRpb25hbCA6b25lb2ZfYm9vbCwgOmJvb2wsIDQ1CisgICAgICAgIG9wdGlvbmFsIDpvbmVvZl9kb3VibGUsIDpkb3VibGUsIDQ2CisgICAgICAgIG9wdGlvbmFsIDpvbmVvZl9mbG9hdCwgOmZsb2F0LCA0NworICAgICAgICBvcHRpb25hbCA6b25lb2Zfc3RyaW5nLCA6c3RyaW5nLCA0OAorICAgICAgICBvcHRpb25hbCA6b25lb2ZfYnl0ZXMsIDpieXRlcywgNDkKKyAgICAgICAgb3B0aW9uYWwgOm9uZW9mX2VudW0sIDplbnVtLCA1MCwgIkEuQi5DLlRlc3RFbnVtIgorICAgICAgICBvcHRpb25hbCA6b25lb2ZfbXNnLCA6bWVzc2FnZSwgNTEsICJBLkIuQy5UZXN0TWVzc2FnZSIKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGFkZF9tZXNzYWdlICJBLkIuQy5UZXN0TWVzc2FnZS5OZXN0ZWRNZXNzYWdlIiBkbworICAgICAgb3B0aW9uYWwgOmZvbywgOmludDMyLCAxCisgICAgZW5kCisgICAgYWRkX2VudW0gIkEuQi5DLlRlc3RFbnVtIiBkbworICAgICAgdmFsdWUgOkRlZmF1bHQsIDAKKyAgICAgIHZhbHVlIDpBLCAxCisgICAgICB2YWx1ZSA6QiwgMgorICAgICAgdmFsdWUgOkMsIDMKKyAgICBlbmQKKyAgZW5kCitlbmQKKworbW9kdWxlIEEKKyAgbW9kdWxlIEIKKyAgICBtb2R1bGUgQworICAgICAgVGVzdE1lc3NhZ2UgPSA6Okdvb2dsZTo6UHJvdG9idWY6OkRlc2NyaXB0b3JQb29sLmdlbmVyYXRlZF9wb29sLmxvb2t1cCgiQS5CLkMuVGVzdE1lc3NhZ2UiKS5tc2djbGFzcworICAgICAgVGVzdE1lc3NhZ2U6Ok5lc3RlZE1lc3NhZ2UgPSA6Okdvb2dsZTo6UHJvdG9idWY6OkRlc2NyaXB0b3JQb29sLmdlbmVyYXRlZF9wb29sLmxvb2t1cCgiQS5CLkMuVGVzdE1lc3NhZ2UuTmVzdGVkTWVzc2FnZSIpLm1zZ2NsYXNzCisgICAgICBUZXN0RW51bSA9IDo6R29vZ2xlOjpQcm90b2J1Zjo6RGVzY3JpcHRvclBvb2wuZ2VuZXJhdGVkX3Bvb2wubG9va3VwKCJBLkIuQy5UZXN0RW51bSIpLmVudW1tb2R1bGUKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9jb2RlX3Byb3RvMi5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9jb2RlX3Byb3RvMi5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTdmNzgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX2NvZGVfcHJvdG8yLnByb3RvCkBAIC0wLDAgKzEsNzEgQEAKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIEEuQi5DOworCitpbXBvcnQgInJ1YnlfZ2VuZXJhdGVkX2NvZGVfcHJvdG8yX2ltcG9ydC5wcm90byI7CisKK21lc3NhZ2UgVGVzdE1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiBvcHRpb25hbF9pbnQzMiA9IDEgW2RlZmF1bHQgPSAxXTsKKyAgb3B0aW9uYWwgaW50NjQgb3B0aW9uYWxfaW50NjQgPSAyIFtkZWZhdWx0ID0gMl07CisgIG9wdGlvbmFsIHVpbnQzMiBvcHRpb25hbF91aW50MzIgPSAzIFtkZWZhdWx0ID0gM107CisgIG9wdGlvbmFsIHVpbnQ2NCBvcHRpb25hbF91aW50NjQgPSA0IFtkZWZhdWx0ID0gNF07CisgIG9wdGlvbmFsIGJvb2wgb3B0aW9uYWxfYm9vbCA9IDUgW2RlZmF1bHQgPSB0cnVlXTsKKyAgb3B0aW9uYWwgZG91YmxlIG9wdGlvbmFsX2RvdWJsZSA9IDYgW2RlZmF1bHQgPSA2LjBdOworICBvcHRpb25hbCBmbG9hdCBvcHRpb25hbF9mbG9hdCA9IDcgW2RlZmF1bHQgPSA3LjBdOworICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nID0gOCBbZGVmYXVsdCA9ICJkZWZhdWx0IHN0ciJdOworICBvcHRpb25hbCBieXRlcyBvcHRpb25hbF9ieXRlcyA9IDkgW2RlZmF1bHQgPSAiXDBcMVwyXDEwMGZ1YmFyIl07CisgIG9wdGlvbmFsIFRlc3RFbnVtIG9wdGlvbmFsX2VudW0gPSAxMCBbZGVmYXVsdCA9IEFdOworICBvcHRpb25hbCBUZXN0TWVzc2FnZSBvcHRpb25hbF9tc2cgPSAxMTsKKyAgb3B0aW9uYWwgVGVzdEltcG9ydGVkTWVzc2FnZSBvcHRpb25hbF9wcm90bzJfc3VibWVzc2FnZSA9IDEyOworCisgIHJlcGVhdGVkIGludDMyIHJlcGVhdGVkX2ludDMyID0gMjE7CisgIHJlcGVhdGVkIGludDY0IHJlcGVhdGVkX2ludDY0ID0gMjI7CisgIHJlcGVhdGVkIHVpbnQzMiByZXBlYXRlZF91aW50MzIgPSAyMzsKKyAgcmVwZWF0ZWQgdWludDY0IHJlcGVhdGVkX3VpbnQ2NCA9IDI0OworICByZXBlYXRlZCBib29sIHJlcGVhdGVkX2Jvb2wgPSAyNTsKKyAgcmVwZWF0ZWQgZG91YmxlIHJlcGVhdGVkX2RvdWJsZSA9IDI2OworICByZXBlYXRlZCBmbG9hdCByZXBlYXRlZF9mbG9hdCA9IDI3OworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nID0gMjg7CisgIHJlcGVhdGVkIGJ5dGVzIHJlcGVhdGVkX2J5dGVzID0gMjk7CisgIHJlcGVhdGVkIFRlc3RFbnVtIHJlcGVhdGVkX2VudW0gPSAzMDsKKyAgcmVwZWF0ZWQgVGVzdE1lc3NhZ2UgcmVwZWF0ZWRfbXNnID0gMzE7CisKKyAgcmVxdWlyZWQgaW50MzIgcmVxdWlyZWRfaW50MzIgPSA0MTsKKyAgcmVxdWlyZWQgaW50NjQgcmVxdWlyZWRfaW50NjQgPSA0MjsKKyAgcmVxdWlyZWQgdWludDMyIHJlcXVpcmVkX3VpbnQzMiA9IDQzOworICByZXF1aXJlZCB1aW50NjQgcmVxdWlyZWRfdWludDY0ID0gNDQ7CisgIHJlcXVpcmVkIGJvb2wgcmVxdWlyZWRfYm9vbCA9IDQ1OworICByZXF1aXJlZCBkb3VibGUgcmVxdWlyZWRfZG91YmxlID0gNDY7CisgIHJlcXVpcmVkIGZsb2F0IHJlcXVpcmVkX2Zsb2F0ID0gNDc7CisgIHJlcXVpcmVkIHN0cmluZyByZXF1aXJlZF9zdHJpbmcgPSA0ODsKKyAgcmVxdWlyZWQgYnl0ZXMgcmVxdWlyZWRfYnl0ZXMgPSA0OTsKKyAgcmVxdWlyZWQgVGVzdEVudW0gcmVxdWlyZWRfZW51bSA9IDUwOworICByZXF1aXJlZCBUZXN0TWVzc2FnZSByZXF1aXJlZF9tc2cgPSA1MTsKKworICBvbmVvZiBteV9vbmVvZiB7CisgICAgaW50MzIgb25lb2ZfaW50MzIgPSA2MTsKKyAgICBpbnQ2NCBvbmVvZl9pbnQ2NCA9IDYyOworICAgIHVpbnQzMiBvbmVvZl91aW50MzIgPSA2MzsKKyAgICB1aW50NjQgb25lb2ZfdWludDY0ID0gNjQ7CisgICAgYm9vbCBvbmVvZl9ib29sID0gNjU7CisgICAgZG91YmxlIG9uZW9mX2RvdWJsZSA9IDY2OworICAgIGZsb2F0IG9uZW9mX2Zsb2F0ID0gNjc7CisgICAgc3RyaW5nIG9uZW9mX3N0cmluZyA9IDY4OworICAgIGJ5dGVzIG9uZW9mX2J5dGVzID0gNjk7CisgICAgVGVzdEVudW0gb25lb2ZfZW51bSA9IDcwOworICAgIFRlc3RNZXNzYWdlIG9uZW9mX21zZyA9IDcxOworICB9CisKKyAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKKyAgICBvcHRpb25hbCBpbnQzMiBmb28gPSAxOworICB9CisKKyAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSBuZXN0ZWRfbWVzc2FnZSA9IDgwOworfQorCitlbnVtIFRlc3RFbnVtIHsKKyAgRGVmYXVsdCA9IDA7CisgIEEgPSAxOworICBCID0gMjsKKyAgQyA9IDM7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfY29kZV9wcm90bzJfaW1wb3J0LnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX2NvZGVfcHJvdG8yX2ltcG9ydC5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWMwNzM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX2NvZGVfcHJvdG8yX2ltcG9ydC5wcm90bwpAQCAtMCwwICsxLDUgQEAKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIEEuQi5DOworCittZXNzYWdlIFRlc3RJbXBvcnRlZE1lc3NhZ2Uge30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9jb2RlX3Byb3RvMl9wYi5yYiBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9jb2RlX3Byb3RvMl9wYi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGQzMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX2NvZGVfcHJvdG8yX3BiLnJiCkBAIC0wLDAgKzEsODAgQEAKKyMgR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKyMgc291cmNlOiBydWJ5X2dlbmVyYXRlZF9jb2RlX3Byb3RvMi5wcm90bworCityZXF1aXJlICdnb29nbGUvcHJvdG9idWYnCisKK3JlcXVpcmUgJ3J1YnlfZ2VuZXJhdGVkX2NvZGVfcHJvdG8yX2ltcG9ydF9wYicKKworR29vZ2xlOjpQcm90b2J1Zjo6RGVzY3JpcHRvclBvb2wuZ2VuZXJhdGVkX3Bvb2wuYnVpbGQgZG8KKyAgYWRkX2ZpbGUoInJ1YnlfZ2VuZXJhdGVkX2NvZGVfcHJvdG8yLnByb3RvIiwgOnN5bnRheCA9PiA6cHJvdG8yKSBkbworICAgIGFkZF9tZXNzYWdlICJBLkIuQy5UZXN0TWVzc2FnZSIgZG8KKyAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9pbnQzMiwgOmludDMyLCAxLCBkZWZhdWx0OiAxCisgICAgICBvcHRpb25hbCA6b3B0aW9uYWxfaW50NjQsIDppbnQ2NCwgMiwgZGVmYXVsdDogMgorICAgICAgb3B0aW9uYWwgOm9wdGlvbmFsX3VpbnQzMiwgOnVpbnQzMiwgMywgZGVmYXVsdDogMworICAgICAgb3B0aW9uYWwgOm9wdGlvbmFsX3VpbnQ2NCwgOnVpbnQ2NCwgNCwgZGVmYXVsdDogNAorICAgICAgb3B0aW9uYWwgOm9wdGlvbmFsX2Jvb2wsIDpib29sLCA1LCBkZWZhdWx0OiB0cnVlCisgICAgICBvcHRpb25hbCA6b3B0aW9uYWxfZG91YmxlLCA6ZG91YmxlLCA2LCBkZWZhdWx0OiA2CisgICAgICBvcHRpb25hbCA6b3B0aW9uYWxfZmxvYXQsIDpmbG9hdCwgNywgZGVmYXVsdDogNworICAgICAgb3B0aW9uYWwgOm9wdGlvbmFsX3N0cmluZywgOnN0cmluZywgOCwgZGVmYXVsdDogImRlZmF1bHQgc3RyIgorICAgICAgb3B0aW9uYWwgOm9wdGlvbmFsX2J5dGVzLCA6Ynl0ZXMsIDksIGRlZmF1bHQ6ICJceDAwXHgwMVx4MDJceDQwXHg2Nlx4NzVceDYyXHg2MVx4NzIiLmZvcmNlX2VuY29kaW5nKCJBU0NJSS04QklUIikKKyAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9lbnVtLCA6ZW51bSwgMTAsICJBLkIuQy5UZXN0RW51bSIsIGRlZmF1bHQ6IDEKKyAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9tc2csIDptZXNzYWdlLCAxMSwgIkEuQi5DLlRlc3RNZXNzYWdlIgorICAgICAgb3B0aW9uYWwgOm9wdGlvbmFsX3Byb3RvMl9zdWJtZXNzYWdlLCA6bWVzc2FnZSwgMTIsICJBLkIuQy5UZXN0SW1wb3J0ZWRNZXNzYWdlIgorICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX2ludDMyLCA6aW50MzIsIDIxCisgICAgICByZXBlYXRlZCA6cmVwZWF0ZWRfaW50NjQsIDppbnQ2NCwgMjIKKyAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF91aW50MzIsIDp1aW50MzIsIDIzCisgICAgICByZXBlYXRlZCA6cmVwZWF0ZWRfdWludDY0LCA6dWludDY0LCAyNAorICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX2Jvb2wsIDpib29sLCAyNQorICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX2RvdWJsZSwgOmRvdWJsZSwgMjYKKyAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF9mbG9hdCwgOmZsb2F0LCAyNworICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX3N0cmluZywgOnN0cmluZywgMjgKKyAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF9ieXRlcywgOmJ5dGVzLCAyOQorICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX2VudW0sIDplbnVtLCAzMCwgIkEuQi5DLlRlc3RFbnVtIgorICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX21zZywgOm1lc3NhZ2UsIDMxLCAiQS5CLkMuVGVzdE1lc3NhZ2UiCisgICAgICByZXF1aXJlZCA6cmVxdWlyZWRfaW50MzIsIDppbnQzMiwgNDEKKyAgICAgIHJlcXVpcmVkIDpyZXF1aXJlZF9pbnQ2NCwgOmludDY0LCA0MgorICAgICAgcmVxdWlyZWQgOnJlcXVpcmVkX3VpbnQzMiwgOnVpbnQzMiwgNDMKKyAgICAgIHJlcXVpcmVkIDpyZXF1aXJlZF91aW50NjQsIDp1aW50NjQsIDQ0CisgICAgICByZXF1aXJlZCA6cmVxdWlyZWRfYm9vbCwgOmJvb2wsIDQ1CisgICAgICByZXF1aXJlZCA6cmVxdWlyZWRfZG91YmxlLCA6ZG91YmxlLCA0NgorICAgICAgcmVxdWlyZWQgOnJlcXVpcmVkX2Zsb2F0LCA6ZmxvYXQsIDQ3CisgICAgICByZXF1aXJlZCA6cmVxdWlyZWRfc3RyaW5nLCA6c3RyaW5nLCA0OAorICAgICAgcmVxdWlyZWQgOnJlcXVpcmVkX2J5dGVzLCA6Ynl0ZXMsIDQ5CisgICAgICByZXF1aXJlZCA6cmVxdWlyZWRfZW51bSwgOmVudW0sIDUwLCAiQS5CLkMuVGVzdEVudW0iCisgICAgICByZXF1aXJlZCA6cmVxdWlyZWRfbXNnLCA6bWVzc2FnZSwgNTEsICJBLkIuQy5UZXN0TWVzc2FnZSIKKyAgICAgIG9wdGlvbmFsIDpuZXN0ZWRfbWVzc2FnZSwgOm1lc3NhZ2UsIDgwLCAiQS5CLkMuVGVzdE1lc3NhZ2UuTmVzdGVkTWVzc2FnZSIKKyAgICAgIG9uZW9mIDpteV9vbmVvZiBkbworICAgICAgICBvcHRpb25hbCA6b25lb2ZfaW50MzIsIDppbnQzMiwgNjEKKyAgICAgICAgb3B0aW9uYWwgOm9uZW9mX2ludDY0LCA6aW50NjQsIDYyCisgICAgICAgIG9wdGlvbmFsIDpvbmVvZl91aW50MzIsIDp1aW50MzIsIDYzCisgICAgICAgIG9wdGlvbmFsIDpvbmVvZl91aW50NjQsIDp1aW50NjQsIDY0CisgICAgICAgIG9wdGlvbmFsIDpvbmVvZl9ib29sLCA6Ym9vbCwgNjUKKyAgICAgICAgb3B0aW9uYWwgOm9uZW9mX2RvdWJsZSwgOmRvdWJsZSwgNjYKKyAgICAgICAgb3B0aW9uYWwgOm9uZW9mX2Zsb2F0LCA6ZmxvYXQsIDY3CisgICAgICAgIG9wdGlvbmFsIDpvbmVvZl9zdHJpbmcsIDpzdHJpbmcsIDY4CisgICAgICAgIG9wdGlvbmFsIDpvbmVvZl9ieXRlcywgOmJ5dGVzLCA2OQorICAgICAgICBvcHRpb25hbCA6b25lb2ZfZW51bSwgOmVudW0sIDcwLCAiQS5CLkMuVGVzdEVudW0iCisgICAgICAgIG9wdGlvbmFsIDpvbmVvZl9tc2csIDptZXNzYWdlLCA3MSwgIkEuQi5DLlRlc3RNZXNzYWdlIgorICAgICAgZW5kCisgICAgZW5kCisgICAgYWRkX21lc3NhZ2UgIkEuQi5DLlRlc3RNZXNzYWdlLk5lc3RlZE1lc3NhZ2UiIGRvCisgICAgICBvcHRpb25hbCA6Zm9vLCA6aW50MzIsIDEKKyAgICBlbmQKKyAgICBhZGRfZW51bSAiQS5CLkMuVGVzdEVudW0iIGRvCisgICAgICB2YWx1ZSA6RGVmYXVsdCwgMAorICAgICAgdmFsdWUgOkEsIDEKKyAgICAgIHZhbHVlIDpCLCAyCisgICAgICB2YWx1ZSA6QywgMworICAgIGVuZAorICBlbmQKK2VuZAorCittb2R1bGUgQQorICBtb2R1bGUgQgorICAgIG1vZHVsZSBDCisgICAgICBUZXN0TWVzc2FnZSA9IDo6R29vZ2xlOjpQcm90b2J1Zjo6RGVzY3JpcHRvclBvb2wuZ2VuZXJhdGVkX3Bvb2wubG9va3VwKCJBLkIuQy5UZXN0TWVzc2FnZSIpLm1zZ2NsYXNzCisgICAgICBUZXN0TWVzc2FnZTo6TmVzdGVkTWVzc2FnZSA9IDo6R29vZ2xlOjpQcm90b2J1Zjo6RGVzY3JpcHRvclBvb2wuZ2VuZXJhdGVkX3Bvb2wubG9va3VwKCJBLkIuQy5UZXN0TWVzc2FnZS5OZXN0ZWRNZXNzYWdlIikubXNnY2xhc3MKKyAgICAgIFRlc3RFbnVtID0gOjpHb29nbGU6OlByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbC5nZW5lcmF0ZWRfcG9vbC5sb29rdXAoIkEuQi5DLlRlc3RFbnVtIikuZW51bW1vZHVsZQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX3BrZ19leHBsaWNpdC5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9wa2dfZXhwbGljaXQucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3Yzk0OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9wa2dfZXhwbGljaXQucHJvdG8KQEAgLTAsMCArMSw5IEBACitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBvbmUudHdvLmFfdGhyZWU7CisKK29wdGlvbiBydWJ5X3BhY2thZ2UgPSAiQTo6Qjo6QyI7CisKK21lc3NhZ2UgRm91ciB7CisgIHN0cmluZyBhX3N0cmluZyA9IDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfcGtnX2V4cGxpY2l0X2xlZ2FjeS5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9wa2dfZXhwbGljaXRfbGVnYWN5LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMGQyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfcGtnX2V4cGxpY2l0X2xlZ2FjeS5wcm90bwpAQCAtMCwwICsxLDkgQEAKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIG9uZS50d28uYV90aHJlZS5hbmQ7CisKK29wdGlvbiBydWJ5X3BhY2thZ2UgPSAiQUEuQkIuQ0MiOworCittZXNzYWdlIEZvdXIgeworICBzdHJpbmcgYW5vdGhlcl9zdHJpbmcgPSAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX3BrZ19leHBsaWNpdF9sZWdhY3lfcGIucmIgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfcGtnX2V4cGxpY2l0X2xlZ2FjeV9wYi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGJiZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX3BrZ19leHBsaWNpdF9sZWdhY3lfcGIucmIKQEAgLTAsMCArMSwyMCBAQAorIyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorIyBzb3VyY2U6IHJ1YnlfZ2VuZXJhdGVkX3BrZ19leHBsaWNpdF9sZWdhY3kucHJvdG8KKworcmVxdWlyZSAnZ29vZ2xlL3Byb3RvYnVmJworCitHb29nbGU6OlByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbC5nZW5lcmF0ZWRfcG9vbC5idWlsZCBkbworICBhZGRfZmlsZSgicnVieV9nZW5lcmF0ZWRfcGtnX2V4cGxpY2l0X2xlZ2FjeS5wcm90byIsIDpzeW50YXggPT4gOnByb3RvMykgZG8KKyAgICBhZGRfbWVzc2FnZSAib25lLnR3by5hX3RocmVlLmFuZC5Gb3VyIiBkbworICAgICAgb3B0aW9uYWwgOmFub3RoZXJfc3RyaW5nLCA6c3RyaW5nLCAxCisgICAgZW5kCisgIGVuZAorZW5kCisKK21vZHVsZSBBQQorICBtb2R1bGUgQkIKKyAgICBtb2R1bGUgQ0MKKyAgICAgIEZvdXIgPSA6Okdvb2dsZTo6UHJvdG9idWY6OkRlc2NyaXB0b3JQb29sLmdlbmVyYXRlZF9wb29sLmxvb2t1cCgib25lLnR3by5hX3RocmVlLmFuZC5Gb3VyIikubXNnY2xhc3MKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9wa2dfZXhwbGljaXRfcGIucmIgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfcGtnX2V4cGxpY2l0X3BiLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZDQ3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfcGtnX2V4cGxpY2l0X3BiLnJiCkBAIC0wLDAgKzEsMjAgQEAKKyMgR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKyMgc291cmNlOiBydWJ5X2dlbmVyYXRlZF9wa2dfZXhwbGljaXQucHJvdG8KKworcmVxdWlyZSAnZ29vZ2xlL3Byb3RvYnVmJworCitHb29nbGU6OlByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbC5nZW5lcmF0ZWRfcG9vbC5idWlsZCBkbworICBhZGRfZmlsZSgicnVieV9nZW5lcmF0ZWRfcGtnX2V4cGxpY2l0LnByb3RvIiwgOnN5bnRheCA9PiA6cHJvdG8zKSBkbworICAgIGFkZF9tZXNzYWdlICJvbmUudHdvLmFfdGhyZWUuRm91ciIgZG8KKyAgICAgIG9wdGlvbmFsIDphX3N0cmluZywgOnN0cmluZywgMQorICAgIGVuZAorICBlbmQKK2VuZAorCittb2R1bGUgQQorICBtb2R1bGUgQgorICAgIG1vZHVsZSBDCisgICAgICBGb3VyID0gOjpHb29nbGU6OlByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbC5nZW5lcmF0ZWRfcG9vbC5sb29rdXAoIm9uZS50d28uYV90aHJlZS5Gb3VyIikubXNnY2xhc3MKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9wa2dfaW1wbGljaXQucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfcGtnX2ltcGxpY2l0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NGRiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfcGtnX2ltcGxpY2l0LnByb3RvCkBAIC0wLDAgKzEsNyBAQAorc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2Ugb25lLnR3by5hX3RocmVlOworCittZXNzYWdlIEZvdXIgeworICBzdHJpbmcgYV9zdHJpbmcgPSAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX3BrZ19pbXBsaWNpdF9wYi5yYiBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9wa2dfaW1wbGljaXRfcGIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjMGVmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9wa2dfaW1wbGljaXRfcGIucmIKQEAgLTAsMCArMSwyMCBAQAorIyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorIyBzb3VyY2U6IHJ1YnlfZ2VuZXJhdGVkX3BrZ19pbXBsaWNpdC5wcm90bworCityZXF1aXJlICdnb29nbGUvcHJvdG9idWYnCisKK0dvb2dsZTo6UHJvdG9idWY6OkRlc2NyaXB0b3JQb29sLmdlbmVyYXRlZF9wb29sLmJ1aWxkIGRvCisgIGFkZF9maWxlKCJydWJ5X2dlbmVyYXRlZF9wa2dfaW1wbGljaXQucHJvdG8iLCA6c3ludGF4ID0+IDpwcm90bzMpIGRvCisgICAgYWRkX21lc3NhZ2UgIm9uZS50d28uYV90aHJlZS5Gb3VyIiBkbworICAgICAgb3B0aW9uYWwgOmFfc3RyaW5nLCA6c3RyaW5nLCAxCisgICAgZW5kCisgIGVuZAorZW5kCisKK21vZHVsZSBPbmUKKyAgbW9kdWxlIFR3bworICAgIG1vZHVsZSBBVGhyZWUKKyAgICAgIEZvdXIgPSA6Okdvb2dsZTo6UHJvdG9idWY6OkRlc2NyaXB0b3JQb29sLmdlbmVyYXRlZF9wb29sLmxvb2t1cCgib25lLnR3by5hX3RocmVlLkZvdXIiKS5tc2djbGFzcworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdG9yLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YTUzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw1NzUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIHJ1YnkgeworCisvLyBGb3J3YXJkIGRlY2xzLgordGVtcGxhdGUgPGNsYXNzIG51bWVyaWNfdHlwZT4KK3N0ZDo6c3RyaW5nIE51bWJlclRvU3RyaW5nKG51bWVyaWNfdHlwZSB2YWx1ZSk7CitzdGQ6OnN0cmluZyBHZXRSZXF1aXJlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcHJvdG9fZmlsZSk7CitzdGQ6OnN0cmluZyBMYWJlbEZvckZpZWxkKEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworc3RkOjpzdHJpbmcgVHlwZU5hbWUoRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7Citib29sIEdlbmVyYXRlTWVzc2FnZShjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlLCBpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcik7Cit2b2lkIEdlbmVyYXRlRW51bShjb25zdCBFbnVtRGVzY3JpcHRvciogZW4sIGlvOjpQcmludGVyKiBwcmludGVyKTsKK3ZvaWQgR2VuZXJhdGVNZXNzYWdlQXNzaWdubWVudChjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UsIGlvOjpQcmludGVyKiBwcmludGVyKTsKK3ZvaWQgR2VuZXJhdGVFbnVtQXNzaWdubWVudChjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LCBjb25zdCBFbnVtRGVzY3JpcHRvciogZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpOworc3RkOjpzdHJpbmcgRGVmYXVsdFZhbHVlRm9yRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKK3RlbXBsYXRlPGNsYXNzIG51bWVyaWNfdHlwZT4KK3N0ZDo6c3RyaW5nIE51bWJlclRvU3RyaW5nKG51bWVyaWNfdHlwZSB2YWx1ZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgIG9zIDw8IHZhbHVlOworICByZXR1cm4gb3Muc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIEdldFJlcXVpcmVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm90b19maWxlKSB7CisgIGludCBsYXN0aW5kZXggPSBwcm90b19maWxlLmZpbmRfbGFzdF9vZigiLiIpOworICByZXR1cm4gcHJvdG9fZmlsZS5zdWJzdHIoMCwgbGFzdGluZGV4KSArICJfcGIiOworfQorCitzdGQ6OnN0cmluZyBHZXRPdXRwdXRGaWxlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcHJvdG9fZmlsZSkgeworICByZXR1cm4gR2V0UmVxdWlyZU5hbWUocHJvdG9fZmlsZSkgKyAiLnJiIjsKK30KKworc3RkOjpzdHJpbmcgTGFiZWxGb3JGaWVsZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGlmIChmaWVsZC0+aGFzX29wdGlvbmFsX2tleXdvcmQoKSAmJgorICAgICAgZmllbGQtPmZpbGUoKS0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzMpIHsKKyAgICByZXR1cm4gInByb3RvM19vcHRpb25hbCI7CisgIH0KKyAgc3dpdGNoIChmaWVsZC0+bGFiZWwoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTDogcmV0dXJuICJvcHRpb25hbCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUVVJUkVEOiByZXR1cm4gInJlcXVpcmVkIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQ6IHJldHVybiAicmVwZWF0ZWQiOworICAgIGRlZmF1bHQ6IGFzc2VydChmYWxzZSk7IHJldHVybiAiIjsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBUeXBlTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHN3aXRjaCAoZmllbGQtPnR5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyOiByZXR1cm4gImludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NDogcmV0dXJuICJpbnQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyOiByZXR1cm4gInVpbnQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0OiByZXR1cm4gInVpbnQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOiByZXR1cm4gInNpbnQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0OiByZXR1cm4gInNpbnQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMjogcmV0dXJuICJmaXhlZDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0OiByZXR1cm4gImZpeGVkNjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOiByZXR1cm4gInNmaXhlZDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDogcmV0dXJuICJzZml4ZWQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFOiByZXR1cm4gImRvdWJsZSI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQ6IHJldHVybiAiZmxvYXQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0w6IHJldHVybiAiYm9vbCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTTogcmV0dXJuICJlbnVtIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6IHJldHVybiAic3RyaW5nIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzogcmV0dXJuICJieXRlcyI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRTogcmV0dXJuICJtZXNzYWdlIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDogcmV0dXJuICJncm91cCI7CisgICAgZGVmYXVsdDogYXNzZXJ0KGZhbHNlKTsgcmV0dXJuICIiOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIFN0cmluZ2lmeVN5bnRheChGaWxlRGVzY3JpcHRvcjo6U3ludGF4IHN5bnRheCkgeworICBzd2l0Y2ggKHN5bnRheCkgeworICAgIGNhc2UgRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzI6CisgICAgICByZXR1cm4gInByb3RvMiI7CisgICAgY2FzZSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMzoKKyAgICAgIHJldHVybiAicHJvdG8zIjsKKyAgICBjYXNlIEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuc3VwcG9ydGVkIHN5bnRheDsgdGhpcyBnZW5lcmF0b3Igb25seSBzdXBwb3J0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvdG8yIGFuZCBwcm90bzMgc3ludGF4LiI7CisgICAgICByZXR1cm4gIiI7CisgIH0KK30KKworc3RkOjpzdHJpbmcgRGVmYXVsdFZhbHVlRm9yRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBzd2l0Y2goZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgIHJldHVybiBOdW1iZXJUb1N0cmluZyhmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQzMigpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiBOdW1iZXJUb1N0cmluZyhmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCgpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6CisgICAgICByZXR1cm4gTnVtYmVyVG9TdHJpbmcoZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDMyKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiBOdW1iZXJUb1N0cmluZyhmaWVsZC0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICByZXR1cm4gTnVtYmVyVG9TdHJpbmcoZmllbGQtPmRlZmF1bHRfdmFsdWVfZmxvYXQoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIE51bWJlclRvU3RyaW5nKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2RvdWJsZSgpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2Jvb2woKSA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgIHJldHVybiBOdW1iZXJUb1N0cmluZyhmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtKCktPm51bWJlcigpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRfc3RyID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCk7CisKKyAgICAgIGlmIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKKyAgICAgICAgb3MgPDwgIlwiIiA8PCBkZWZhdWx0X3N0ciA8PCAiXCIiOworICAgICAgfSBlbHNlIGlmIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUykgeworICAgICAgICBvcyA8PCAiXCIiOworCisgICAgICAgIG9zLmZpbGwoJzAnKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0X3N0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgICAgLy8gV3JpdGUgdGhlIGhleCBmb3JtIG9mIGVhY2ggYnl0ZS4KKyAgICAgICAgICBvcyA8PCAiXFx4IiA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldHcoMikKKyAgICAgICAgICAgICA8PCAoKHVpbnQxNl90KSgodW5zaWduZWQgY2hhcilkZWZhdWx0X3N0ci5hdChpKSkpOworICAgICAgICB9CisgICAgICAgIG9zIDw8ICJcIi5mb3JjZV9lbmNvZGluZyhcIkFTQ0lJLThCSVRcIikiOworICAgICAgfQorCisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICAgIGRlZmF1bHQ6IGFzc2VydChmYWxzZSk7IHJldHVybiAiIjsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKGZpZWxkLT5pc19tYXAoKSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5X2ZpZWxkID0KKyAgICAgICAgZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5GaW5kRmllbGRCeU51bWJlcigxKTsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHZhbHVlX2ZpZWxkID0KKyAgICAgICAgZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5GaW5kRmllbGRCeU51bWJlcigyKTsKKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIm1hcCA6JG5hbWUkLCA6JGtleV90eXBlJCwgOiR2YWx1ZV90eXBlJCwgJG51bWJlciQiLAorICAgICAgIm5hbWUiLCBmaWVsZC0+bmFtZSgpLAorICAgICAgImtleV90eXBlIiwgVHlwZU5hbWUoa2V5X2ZpZWxkKSwKKyAgICAgICJ2YWx1ZV90eXBlIiwgVHlwZU5hbWUodmFsdWVfZmllbGQpLAorICAgICAgIm51bWJlciIsIE51bWJlclRvU3RyaW5nKGZpZWxkLT5udW1iZXIoKSkpOworCisgICAgaWYgKHZhbHVlX2ZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiwgXCIkc3VidHlwZSRcIlxuIiwKKyAgICAgICAgInN1YnR5cGUiLCB2YWx1ZV9maWVsZC0+bWVzc2FnZV90eXBlKCktPmZ1bGxfbmFtZSgpKTsKKyAgICB9IGVsc2UgaWYgKHZhbHVlX2ZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiwgXCIkc3VidHlwZSRcIlxuIiwKKyAgICAgICAgInN1YnR5cGUiLCB2YWx1ZV9maWVsZC0+ZW51bV90eXBlKCktPmZ1bGxfbmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgfQorICB9IGVsc2UgeworCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiJGxhYmVsJCA6JG5hbWUkLCAiLAorICAgICAgImxhYmVsIiwgTGFiZWxGb3JGaWVsZChmaWVsZCksCisgICAgICAibmFtZSIsIGZpZWxkLT5uYW1lKCkpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIjokdHlwZSQsICRudW1iZXIkIiwKKyAgICAgICJ0eXBlIiwgVHlwZU5hbWUoZmllbGQpLAorICAgICAgIm51bWJlciIsIE51bWJlclRvU3RyaW5nKGZpZWxkLT5udW1iZXIoKSkpOworCisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiwgXCIkc3VidHlwZSRcIiIsCisgICAgICAgInN1YnR5cGUiLCBmaWVsZC0+bWVzc2FnZV90eXBlKCktPmZ1bGxfbmFtZSgpKTsKKyAgICB9IGVsc2UgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiwgXCIkc3VidHlwZSRcIiIsCisgICAgICAgICJzdWJ0eXBlIiwgZmllbGQtPmVudW1fdHlwZSgpLT5mdWxsX25hbWUoKSk7CisgICAgfQorCisgICAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgiLCBkZWZhdWx0OiAkZGVmYXVsdCQiLCAiZGVmYXVsdCIsCisgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWVGb3JGaWVsZChmaWVsZCkpOworICAgIH0KKworICAgIGlmIChmaWVsZC0+aGFzX2pzb25fbmFtZSgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgiLCBqc29uX25hbWU6IFwiJGpzb25fbmFtZSRcIiIsICJqc29uX25hbWUiLAorICAgICAgICAgICAgICAgICAgICBmaWVsZC0+anNvbl9uYW1lKCkpOworICAgIH0KKworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdGVPbmVvZihjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mLCBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICJvbmVvZiA6JG5hbWUkIGRvXG4iLAorICAgICAgIm5hbWUiLCBvbmVvZi0+bmFtZSgpKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBvbmVvZi0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG9uZW9mLT5maWVsZChpKTsKKyAgICBHZW5lcmF0ZUZpZWxkKGZpZWxkLCBwcmludGVyKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoImVuZFxuIik7Cit9CisKK2Jvb2wgR2VuZXJhdGVNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UsIGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yKSB7CisgIGlmIChtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDAgfHwgbWVzc2FnZS0+ZXh0ZW5zaW9uX2NvdW50KCkgPiAwKSB7CisgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiRXh0ZW5zaW9ucyBhcmUgbm90IHlldCBzdXBwb3J0ZWQgZm9yIHByb3RvMiAucHJvdG8gZmlsZXMuIjsKKyAgfQorCisgIC8vIERvbid0IGdlbmVyYXRlIE1hcEVudHJ5IG1lc3NhZ2VzIC0tIHdlIHVzZSB0aGUgUnVieSBleHRlbnNpb24ncyBuYXRpdmUKKyAgLy8gc3VwcG9ydCBmb3IgbWFwIGZpZWxkcyBpbnN0ZWFkLgorICBpZiAobWVzc2FnZS0+b3B0aW9ucygpLm1hcF9lbnRyeSgpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiYWRkX21lc3NhZ2UgXCIkbmFtZSRcIiBkb1xuIiwKKyAgICAibmFtZSIsIG1lc3NhZ2UtPmZ1bGxfbmFtZSgpKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gbWVzc2FnZS0+ZmllbGQoaSk7CisgICAgaWYgKCFmaWVsZC0+cmVhbF9jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgIEdlbmVyYXRlRmllbGQoZmllbGQsIHByaW50ZXIpOworICAgIH0KKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+cmVhbF9vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2YgPSBtZXNzYWdlLT5vbmVvZl9kZWNsKGkpOworICAgIEdlbmVyYXRlT25lb2Yob25lb2YsIHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgiZW5kXG4iKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGlmICghR2VuZXJhdGVNZXNzYWdlKG1lc3NhZ2UtPm5lc3RlZF90eXBlKGkpLCBwcmludGVyLCBlcnJvcikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgR2VuZXJhdGVFbnVtKG1lc3NhZ2UtPmVudW1fdHlwZShpKSwgcHJpbnRlcik7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBHZW5lcmF0ZUVudW0oY29uc3QgRW51bURlc2NyaXB0b3IqIGVuLCBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAiYWRkX2VudW0gXCIkbmFtZSRcIiBkb1xuIiwKKyAgICAibmFtZSIsIGVuLT5mdWxsX25hbWUoKSk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW4tPnZhbHVlX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlID0gZW4tPnZhbHVlKGkpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInZhbHVlIDokbmFtZSQsICRudW1iZXIkXG4iLAorICAgICAgIm5hbWUiLCB2YWx1ZS0+bmFtZSgpLAorICAgICAgIm51bWJlciIsIE51bWJlclRvU3RyaW5nKHZhbHVlLT5udW1iZXIoKSkpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAiZW5kXG4iKTsKK30KKworLy8gTG9jYWxlLWFnbm9zdGljIHV0aWxpdHkgZnVuY3Rpb25zLgorYm9vbCBJc0xvd2VyKGNoYXIgY2gpIHsgcmV0dXJuIGNoID49ICdhJyAmJiBjaCA8PSAneic7IH0KKworYm9vbCBJc1VwcGVyKGNoYXIgY2gpIHsgcmV0dXJuIGNoID49ICdBJyAmJiBjaCA8PSAnWic7IH0KKworYm9vbCBJc0FscGhhKGNoYXIgY2gpIHsgcmV0dXJuIElzTG93ZXIoY2gpIHx8IElzVXBwZXIoY2gpOyB9CisKK2NoYXIgVXBwZXJDaGFyKGNoYXIgY2gpIHsgcmV0dXJuIElzTG93ZXIoY2gpID8gKGNoIC0gJ2EnICsgJ0EnKSA6IGNoOyB9CisKKworLy8gUGFja2FnZSBuYW1lcyBpbiBwcm90b2J1ZiBhcmUgc25ha2VfY2FzZSBieSBjb252ZW50aW9uLCBidXQgUnVieSBtb2R1bGUKKy8vIG5hbWVzIG11c3QgYmUgUGFzY2FsQ2FzZWQuCisvLworLy8gICBmb29fYmFyX2JheiAtPiBGb29CYXJCYXoKK3N0ZDo6c3RyaW5nIFBhY2thZ2VUb01vZHVsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICBib29sIG5leHRfdXBwZXIgPSB0cnVlOworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5yZXNlcnZlKG5hbWUuc2l6ZSgpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAobmFtZVtpXSA9PSAnXycpIHsKKyAgICAgIG5leHRfdXBwZXIgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobmV4dF91cHBlcikgeworICAgICAgICByZXN1bHQucHVzaF9iYWNrKFVwcGVyQ2hhcihuYW1lW2ldKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQucHVzaF9iYWNrKG5hbWVbaV0pOworICAgICAgfQorICAgICAgbmV4dF91cHBlciA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIENsYXNzIGFuZCBlbnVtIG5hbWVzIGluIHByb3RvYnVmIHNob3VsZCBiZSBQYXNjYWxDYXNlZCBieSBjb252ZW50aW9uLCBidXQKKy8vIHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgZW5mb3JjaW5nIHRoaXMgd2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGV5IGFyZSB2YWxpZAorLy8gUnVieSBjb25zdGFudHMuICBUaGF0IG1haW5seSBtZWFucyBtYWtpbmcgc3VyZSB0aGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMKKy8vIGFuIHVwcGVyLWNhc2UgbGV0dGVyLgorc3RkOjpzdHJpbmcgUnViaWZ5Q29uc3RhbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgc3RkOjpzdHJpbmcgcmV0ID0gbmFtZTsKKyAgaWYgKCFyZXQuZW1wdHkoKSkgeworICAgIGlmIChJc0xvd2VyKHJldFswXSkpIHsKKyAgICAgIC8vIElmIGl0IHN0YXJ0cyB3aXRoIGEgbG93ZXJjYXNlIGxldHRlciwgY2FwaXRhbGl6ZSBpdC4KKyAgICAgIHJldFswXSA9IFVwcGVyQ2hhcihyZXRbMF0pOworICAgIH0gZWxzZSBpZiAoIUlzQWxwaGEocmV0WzBdKSkgeworICAgICAgLy8gT3RoZXJ3aXNlIChlLmcuIGlmIGl0IGJlZ2lucyB3aXRoIGFuIHVuZGVyc2NvcmUpLCB3ZSBuZWVkIHRvIGNvbWUgdXAKKyAgICAgIC8vIHdpdGggc29tZSBwcmVmaXggdGhhdCBzdGFydHMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLiBXZSBjb3VsZCBiZSBzbWFydGVyCisgICAgICAvLyBoZXJlLCBlLmcuIHRyeSB0byBzdHJpcCBsZWFkaW5nIHVuZGVyc2NvcmVzLCBidXQgdGhpcyBtYXkgY2F1c2Ugb3RoZXIKKyAgICAgIC8vIHByb2JsZW1zIGlmIHRoZSB1c2VyIHJlYWxseSBpbnRlbmRlZCB0aGUgbmFtZS4gU28gbGV0J3MganVzdCBwcmVwZW5kIGEKKyAgICAgIC8vIHdlbGwta25vd24gc3VmZml4LgorICAgICAgcmV0ID0gIlBCXyIgKyByZXQ7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBHZW5lcmF0ZU1lc3NhZ2VBc3NpZ25tZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBEb24ndCBnZW5lcmF0ZSBNYXBFbnRyeSBtZXNzYWdlcyAtLSB3ZSB1c2UgdGhlIFJ1YnkgZXh0ZW5zaW9uJ3MgbmF0aXZlCisgIC8vIHN1cHBvcnQgZm9yIG1hcCBmaWVsZHMgaW5zdGVhZC4KKyAgaWYgKG1lc3NhZ2UtPm9wdGlvbnMoKS5tYXBfZW50cnkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICIkcHJlZml4JCRuYW1lJCA9ICIsCisgICAgInByZWZpeCIsIHByZWZpeCwKKyAgICAibmFtZSIsIFJ1YmlmeUNvbnN0YW50KG1lc3NhZ2UtPm5hbWUoKSkpOworICBwcmludGVyLT5QcmludCgKKyAgICAiOjpHb29nbGU6OlByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbC5nZW5lcmF0ZWRfcG9vbC4iCisgICAgImxvb2t1cChcIiRmdWxsX25hbWUkXCIpLm1zZ2NsYXNzXG4iLAorICAgICJmdWxsX25hbWUiLCBtZXNzYWdlLT5mdWxsX25hbWUoKSk7CisKKyAgc3RkOjpzdHJpbmcgbmVzdGVkX3ByZWZpeCA9IHByZWZpeCArIFJ1YmlmeUNvbnN0YW50KG1lc3NhZ2UtPm5hbWUoKSkgKyAiOjoiOworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIEdlbmVyYXRlTWVzc2FnZUFzc2lnbm1lbnQobmVzdGVkX3ByZWZpeCwgbWVzc2FnZS0+bmVzdGVkX3R5cGUoaSksIHByaW50ZXIpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIEdlbmVyYXRlRW51bUFzc2lnbm1lbnQobmVzdGVkX3ByZWZpeCwgbWVzc2FnZS0+ZW51bV90eXBlKGkpLCBwcmludGVyKTsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlRW51bUFzc2lnbm1lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCwgY29uc3QgRW51bURlc2NyaXB0b3IqIGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICIkcHJlZml4JCRuYW1lJCA9ICIsCisgICAgInByZWZpeCIsIHByZWZpeCwKKyAgICAibmFtZSIsIFJ1YmlmeUNvbnN0YW50KGVuLT5uYW1lKCkpKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIjo6R29vZ2xlOjpQcm90b2J1Zjo6RGVzY3JpcHRvclBvb2wuZ2VuZXJhdGVkX3Bvb2wuIgorICAgICJsb29rdXAoXCIkZnVsbF9uYW1lJFwiKS5lbnVtbW9kdWxlXG4iLAorICAgICJmdWxsX25hbWUiLCBlbi0+ZnVsbF9uYW1lKCkpOworfQorCitpbnQgR2VuZXJhdGVQYWNrYWdlTW9kdWxlcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaW50IGxldmVscyA9IDA7CisgIGJvb2wgbmVlZF9jaGFuZ2VfdG9fbW9kdWxlID0gdHJ1ZTsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lOworCisgIC8vIERldGVybWluZSB0aGUgbmFtZSB0byB1c2UgaW4gZWl0aGVyIGZvcm1hdDoKKyAgLy8gICBwcm90byBwYWNrYWdlOiAgICAgICAgIG9uZS50d28udGhyZWUKKyAgLy8gICBvcHRpb24gcnVieV9wYWNrYWdlOiAgIE9uZTo6VHdvOjpUaHJlZQorICBpZiAoZmlsZS0+b3B0aW9ucygpLmhhc19ydWJ5X3BhY2thZ2UoKSkgeworICAgIHBhY2thZ2VfbmFtZSA9IGZpbGUtPm9wdGlvbnMoKS5ydWJ5X3BhY2thZ2UoKTsKKworICAgIC8vIElmIDo6IGlzIGluIHRoZSBwYWNrYWdlIHVzZSB0aGUgUnVieSBmb3JtYXR0ZWQgbmFtZSBhcy1pcworICAgIC8vICAgIC0+IEE6OkI6OkMKKyAgICAvLyBvdGhlcndpc2UsIHVzZSB0aGUgZG90IHNlcGFyYXRvcgorICAgIC8vICAgIC0+IEEuQi5DCisgICAgaWYgKHBhY2thZ2VfbmFtZS5maW5kKCI6OiIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBuZWVkX2NoYW5nZV90b19tb2R1bGUgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHBhY2thZ2VfbmFtZS5maW5kKCIuIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgInJ1YnlfcGFja2FnZSBvcHRpb24gc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAnQTo6Qjo6QycgYW5kIG5vdCAnQS5CLkMnIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcGFja2FnZV9uYW1lID0gZmlsZS0+cGFja2FnZSgpOworICB9CisKKyAgLy8gVXNlIHRoZSBhcHByb3ByaWF0ZSBkZWxpbWl0ZXIKKyAgc3RkOjpzdHJpbmcgZGVsaW1pdGVyID0gbmVlZF9jaGFuZ2VfdG9fbW9kdWxlID8gIi4iIDogIjo6IjsKKyAgaW50IGRlbGltaXRlcl9zaXplID0gbmVlZF9jaGFuZ2VfdG9fbW9kdWxlID8gMSA6IDI7CisKKyAgLy8gRXh0cmFjdCBlYWNoIG1vZHVsZSBuYW1lIGFuZCBpbmRlbnQKKyAgd2hpbGUgKCFwYWNrYWdlX25hbWUuZW1wdHkoKSkgeworICAgIHNpemVfdCBkb3RfaW5kZXggPSBwYWNrYWdlX25hbWUuZmluZChkZWxpbWl0ZXIpOworICAgIHN0ZDo6c3RyaW5nIGNvbXBvbmVudDsKKyAgICBpZiAoZG90X2luZGV4ID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBjb21wb25lbnQgPSBwYWNrYWdlX25hbWU7CisgICAgICBwYWNrYWdlX25hbWUgPSAiIjsKKyAgICB9IGVsc2UgeworICAgICAgY29tcG9uZW50ID0gcGFja2FnZV9uYW1lLnN1YnN0cigwLCBkb3RfaW5kZXgpOworICAgICAgcGFja2FnZV9uYW1lID0gcGFja2FnZV9uYW1lLnN1YnN0cihkb3RfaW5kZXggKyBkZWxpbWl0ZXJfc2l6ZSk7CisgICAgfQorICAgIGlmIChuZWVkX2NoYW5nZV90b19tb2R1bGUpIHsKKyAgICAgIGNvbXBvbmVudCA9IFBhY2thZ2VUb01vZHVsZShjb21wb25lbnQpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJtb2R1bGUgJG5hbWUkXG4iLAorICAgICAgIm5hbWUiLCBjb21wb25lbnQpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIGxldmVscysrOworICB9CisgIHJldHVybiBsZXZlbHM7Cit9CisKK3ZvaWQgRW5kUGFja2FnZU1vZHVsZXMoaW50IGxldmVscywgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgd2hpbGUgKGxldmVscyA+IDApIHsKKyAgICBsZXZlbHMtLTsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiZW5kXG4iKTsKKyAgfQorfQorCitib29sIEdlbmVyYXRlRHNsRGVzY3JpcHRvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZXJyb3IpIHsKKyAgcHJpbnRlci0+UHJpbnQoIkdvb2dsZTo6UHJvdG9idWY6OkRlc2NyaXB0b3JQb29sLmdlbmVyYXRlZF9wb29sLmJ1aWxkIGRvXG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPlByaW50KCJhZGRfZmlsZShcIiRmaWxlbmFtZSRcIiwgOnN5bnRheCA9PiA6JHN5bnRheCQpIGRvXG4iLAorICAgICAgICAgICAgICAgICAiZmlsZW5hbWUiLCBmaWxlLT5uYW1lKCksICJzeW50YXgiLAorICAgICAgICAgICAgICAgICBTdHJpbmdpZnlTeW50YXgoZmlsZS0+c3ludGF4KCkpKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGlmICghR2VuZXJhdGVNZXNzYWdlKGZpbGUtPm1lc3NhZ2VfdHlwZShpKSwgcHJpbnRlciwgZXJyb3IpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIEdlbmVyYXRlRW51bShmaWxlLT5lbnVtX3R5cGUoaSksIHByaW50ZXIpOworICB9CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoImVuZFxuIik7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImVuZFxuXG4iKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR2VuZXJhdGVCaW5hcnlEZXNjcmlwdG9yKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAgIFIiKGRlc2NyaXB0b3JfZGF0YSA9IEZpbGUuYmlucmVhZChfX0ZJTEVfXykuc3BsaXQoIlxuX19FTkRfX1xuIiwgMilbMV0pIik7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIlxuR29vZ2xlOjpQcm90b2J1Zjo6RGVzY3JpcHRvclBvb2wuZ2VuZXJhdGVkX3Bvb2wuYWRkX3NlcmlhbGl6ZWRfZmlsZSgiCisgICAgICAiZGVzY3JpcHRvcl9kYXRhKVxuXG4iKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR2VuZXJhdGVGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAiIyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIVxuIgorICAgICIjIHNvdXJjZTogJGZpbGVuYW1lJFxuIgorICAgICJcbiIsCisgICAgImZpbGVuYW1lIiwgZmlsZS0+bmFtZSgpKTsKKworICBwcmludGVyLT5QcmludCgicmVxdWlyZSAnZ29vZ2xlL3Byb3RvYnVmJ1xuXG4iKTsKKworICBpZiAoZmlsZS0+ZGVwZW5kZW5jeV9jb3VudCgpICE9IDApIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgICBwcmludGVyLT5QcmludCgicmVxdWlyZSAnJG5hbWUkJ1xuIiwgIm5hbWUiLCBHZXRSZXF1aXJlTmFtZShmaWxlLT5kZXBlbmRlbmN5KGkpLT5uYW1lKCkpKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgIH0KKworICAvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIHJ1Ynkgc3VwcG9ydHMgZXh0ZW5zaW9ucyBmb3IgcHJvdG8yIHN5bnRheC4KKyAgaWYgKGZpbGUtPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8yICYmCisgICAgICBmaWxlLT5leHRlbnNpb25fY291bnQoKSA+IDApIHsKKyAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJFeHRlbnNpb25zIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBmb3IgcHJvdG8yIC5wcm90byBmaWxlcy4iOworICB9CisKKyAgYm9vbCB1c2VfcmF3X2Rlc2NyaXB0b3IgPSBmaWxlLT5uYW1lKCkgPT0gImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKKworICBpZiAodXNlX3Jhd19kZXNjcmlwdG9yKSB7CisgICAgR2VuZXJhdGVCaW5hcnlEZXNjcmlwdG9yKGZpbGUsIHByaW50ZXIsIGVycm9yKTsKKyAgfSBlbHNlIHsKKyAgICBHZW5lcmF0ZURzbERlc2NyaXB0b3IoZmlsZSwgcHJpbnRlciwgZXJyb3IpOworICB9CisKKyAgaW50IGxldmVscyA9IEdlbmVyYXRlUGFja2FnZU1vZHVsZXMoZmlsZSwgcHJpbnRlcik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIEdlbmVyYXRlTWVzc2FnZUFzc2lnbm1lbnQoIiIsIGZpbGUtPm1lc3NhZ2VfdHlwZShpKSwgcHJpbnRlcik7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgR2VuZXJhdGVFbnVtQXNzaWdubWVudCgiIiwgZmlsZS0+ZW51bV90eXBlKGkpLCBwcmludGVyKTsKKyAgfQorICBFbmRQYWNrYWdlTW9kdWxlcyhsZXZlbHMsIHByaW50ZXIpOworCisgIGlmICh1c2VfcmF3X2Rlc2NyaXB0b3IpIHsKKyAgICBwcmludGVyLT5QcmludCgiXG5fX0VORF9fXG4iKTsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgICAgZmlsZS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKyAgICBzdGQ6OnN0cmluZyBmaWxlX2RhdGE7CisgICAgZmlsZV9wcm90by5TZXJpYWxpemVUb1N0cmluZygmZmlsZV9kYXRhKTsKKyAgICBwcmludGVyLT5QcmludCgiJHJhd19kZXNjcmlwdG9yJCIsICJyYXdfZGVzY3JpcHRvciIsIGZpbGVfZGF0YSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR2VuZXJhdG9yOjpHZW5lcmF0ZSgKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLAorICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0LAorICAgIHN0ZDo6c3RyaW5nKiBlcnJvcikgY29uc3QgeworCisgIGlmIChmaWxlLT5zeW50YXgoKSAhPSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMyAmJgorICAgICAgZmlsZS0+c3ludGF4KCkgIT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzIpIHsKKyAgICAqZXJyb3IgPSAiSW52YWxpZCBvciB1bnN1cHBvcnRlZCBwcm90byBzeW50YXgiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgIGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKEdldE91dHB1dEZpbGVuYW1lKGZpbGUtPm5hbWUoKSkpKTsKKyAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisKKyAgcmV0dXJuIEdlbmVyYXRlRmlsZShmaWxlLCAmcHJpbnRlciwgZXJyb3IpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcnVieQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3YmI4MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsNjcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBHZW5lcmF0ZXMgUnVieSBjb2RlIGZvciBhIGdpdmVuIC5wcm90byBmaWxlLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9SVUJZX0dFTkVSQVRPUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1JVQllfR0VORVJBVE9SX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIHJ1YnkgeworCisvLyBDb2RlR2VuZXJhdG9yIGltcGxlbWVudGF0aW9uIGZvciBnZW5lcmF0ZWQgUnVieSBwcm90b2NvbCBidWZmZXIgY2xhc3Nlcy4KKy8vIElmIHlvdSBjcmVhdGUgeW91ciBvd24gcHJvdG9jb2wgY29tcGlsZXIgYmluYXJ5IGFuZCB5b3Ugd2FudCBpdCB0byBzdXBwb3J0CisvLyBSdWJ5IG91dHB1dCwgeW91IGNhbiBkbyBzbyBieSByZWdpc3RlcmluZyBhbiBpbnN0YW5jZSBvZiB0aGlzCisvLyBDb2RlR2VuZXJhdG9yIHdpdGggdGhlIENvbW1hbmRMaW5lSW50ZXJmYWNlIGluIHlvdXIgbWFpbigpIGZ1bmN0aW9uLgorY2xhc3MgUFJPVE9DX0VYUE9SVCBHZW5lcmF0b3IgOiBwdWJsaWMgQ29kZUdlbmVyYXRvciB7CisgIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgR2V0U3VwcG9ydGVkRmVhdHVyZXMoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEZFQVRVUkVfUFJPVE8zX09QVElPTkFMOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcnVieQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUlVCWV9HRU5FUkFUT1JfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3JfdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3JfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjZTFkMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDE0NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgcnVieSB7CituYW1lc3BhY2UgeworCitzdGQ6OnN0cmluZyBGaW5kUnVieVRlc3REaXIoKSB7CisgIHJldHVybiBUZXN0U291cmNlRGlyKCkgKyAiL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5IjsKK30KKworLy8gVGhpcyB0ZXN0IGlzIGEgc2ltcGxlIGdvbGRlbi1maWxlIHRlc3Qgb3ZlciB0aGUgb3V0cHV0IG9mIHRoZSBSdWJ5IGNvZGUKKy8vIGdlbmVyYXRvci4gV2hlbiB3ZSBtYWtlIGNoYW5nZXMgdG8gdGhlIFJ1YnkgZXh0ZW5zaW9uIGFuZCBhbHRlciB0aGUgUnVieSBjb2RlCisvLyBnZW5lcmF0b3IgdG8gdXNlIHRob3NlIGNoYW5nZXMsIHdlIHNob3VsZCAoaSkgbWFudWFsbHkgdGVzdCB0aGUgb3V0cHV0IG9mIHRoZQorLy8gY29kZSBnZW5lcmF0b3Igd2l0aCB0aGUgZXh0ZW5zaW9uLCBhbmQgKGlpKSB1cGRhdGUgdGhlIGdvbGRlbiBvdXRwdXQgYWJvdmUuCisvLyBTb21lIGRheSwgd2UgbWF5IGludGVncmF0ZSBidWlsZCBzeXN0ZW1zIGJldHdlZW4gcHJvdG9jIGFuZCB0aGUgbGFuZ3VhZ2UKKy8vIGV4dGVuc2lvbnMgdG8gdGhlIHBvaW50IHdoZXJlIHdlIGNhbiBkbyB0aGlzIHRlc3QgaW4gYSBtb3JlIGF1dG9tYXRlZCB3YXkuCisKK3ZvaWQgUnVieVRlc3Qoc3RkOjpzdHJpbmcgcHJvdG9fZmlsZSwgc3RkOjpzdHJpbmcgaW1wb3J0X3Byb3RvX2ZpbGUgPSAiIikgeworICBzdGQ6OnN0cmluZyBydWJ5X3Rlc3RzID0gRmluZFJ1YnlUZXN0RGlyKCk7CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvbW1hbmRMaW5lSW50ZXJmYWNlIGNsaTsKKyAgY2xpLlNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKHRydWUpOworCisgIHJ1Ynk6OkdlbmVyYXRvciBydWJ5X2dlbmVyYXRvcjsKKyAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLXJ1Ynlfb3V0IiwgJnJ1YnlfZ2VuZXJhdG9yLCAiIik7CisKKyAgLy8gQ29weSBnZW5lcmF0ZWRfY29kZS5wcm90byB0byB0aGUgdGVtcG9yYXJ5IHRlc3QgZGlyZWN0b3J5LgorICBzdGQ6OnN0cmluZyB0ZXN0X2lucHV0OworICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6R2V0Q29udGVudHMoCisgICAgICBydWJ5X3Rlc3RzICsgcHJvdG9fZmlsZSArICIucHJvdG8iLAorICAgICAgJnRlc3RfaW5wdXQsCisgICAgICB0cnVlKSk7CisgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpTZXRDb250ZW50cygKKyAgICAgIFRlc3RUZW1wRGlyKCkgKyBwcm90b19maWxlICsgIi5wcm90byIsCisgICAgICB0ZXN0X2lucHV0LAorICAgICAgdHJ1ZSkpOworCisgIC8vIENvcHkgZ2VuZXJhdGVkX2NvZGVfaW1wb3J0LnByb3RvIHRvIHRoZSB0ZW1wb3JhcnkgdGVzdCBkaXJlY3RvcnkuCisgIHN0ZDo6c3RyaW5nIHRlc3RfaW1wb3J0OworICBpZiAoIWltcG9ydF9wcm90b19maWxlLmVtcHR5KCkpIHsKKyAgICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6R2V0Q29udGVudHMoCisgICAgICAgIHJ1YnlfdGVzdHMgKyBpbXBvcnRfcHJvdG9fZmlsZSArICIucHJvdG8iLAorICAgICAgICAmdGVzdF9pbXBvcnQsCisgICAgICAgIHRydWUpKTsKKyAgICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6U2V0Q29udGVudHMoCisgICAgICAgIFRlc3RUZW1wRGlyKCkgKyBpbXBvcnRfcHJvdG9fZmlsZSArICIucHJvdG8iLAorICAgICAgICB0ZXN0X2ltcG9ydCwKKyAgICAgICAgdHJ1ZSkpOworICB9CisKKyAgLy8gSW52b2tlIHRoZSBwcm90byBjb21waWxlciAod2Ugd2lsbCBiZSBpbnNpZGUgVGVzdFRlbXBEaXIoKSBhdCB0aGlzIHBvaW50KS4KKyAgc3RkOjpzdHJpbmcgcnVieV9vdXQgPSAiLS1ydWJ5X291dD0iICsgVGVzdFRlbXBEaXIoKTsKKyAgc3RkOjpzdHJpbmcgcHJvdG9fcGF0aCA9ICItLXByb3RvX3BhdGg9IiArIFRlc3RUZW1wRGlyKCk7CisKKyAgc3RkOjpzdHJpbmcgcHJvdG9fdGFyZ2V0ID0gVGVzdFRlbXBEaXIoKSArIHByb3RvX2ZpbGUgKyAiLnByb3RvIjsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJwcm90b2MiLAorICAgIHJ1Ynlfb3V0LmNfc3RyKCksCisgICAgcHJvdG9fcGF0aC5jX3N0cigpLAorICAgIHByb3RvX3RhcmdldC5jX3N0cigpLAorICB9OworCisgIEVYUEVDVF9FUSgwLCBjbGkuUnVuKDQsIGFyZ3YpKTsKKworICAvLyBMb2FkIHRoZSBnZW5lcmF0ZWQgb3V0cHV0IGFuZCBjb21wYXJlIHRvIHRoZSBleHBlY3RlZCByZXN1bHQuCisgIHN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkdldENvbnRlbnRzQXNUZXh0KAorICAgICAgVGVzdFRlbXBEaXIoKSArIHByb3RvX2ZpbGUgKyAiX3BiLnJiIiwKKyAgICAgICZvdXRwdXQsCisgICAgICB0cnVlKSk7CisgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkX291dHB1dDsKKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkdldENvbnRlbnRzQXNUZXh0KAorICAgICAgcnVieV90ZXN0cyArIHByb3RvX2ZpbGUgKyAiX3BiLnJiIiwKKyAgICAgICZleHBlY3RlZF9vdXRwdXQsCisgICAgICB0cnVlKSk7CisgIEVYUEVDVF9FUShleHBlY3RlZF9vdXRwdXQsIG91dHB1dCk7Cit9CisKK1RFU1QoUnVieUdlbmVyYXRvclRlc3QsIFByb3RvM0dlbmVyYXRvclRlc3QpIHsKKyAgUnVieVRlc3QoIi9ydWJ5X2dlbmVyYXRlZF9jb2RlIiwgIi9ydWJ5X2dlbmVyYXRlZF9jb2RlX3Byb3RvMl9pbXBvcnQiKTsKK30KKworVEVTVChSdWJ5R2VuZXJhdG9yVGVzdCwgUHJvdG8yR2VuZXJhdG9yVGVzdCkgeworICAgIFJ1YnlUZXN0KCIvcnVieV9nZW5lcmF0ZWRfY29kZV9wcm90bzIiLCAiL3J1YnlfZ2VuZXJhdGVkX2NvZGVfcHJvdG8yX2ltcG9ydCIpOworfQorCitURVNUKFJ1YnlHZW5lcmF0b3JUZXN0LCBQcm90bzNJbXBsaWNpdFBhY2thZ2VUZXN0KSB7CisgICAgUnVieVRlc3QoIi9ydWJ5X2dlbmVyYXRlZF9wa2dfaW1wbGljaXQiKTsKK30KKworVEVTVChSdWJ5R2VuZXJhdG9yVGVzdCwgUHJvdG8zRXhwbGljdFBhY2thZ2VUZXN0KSB7CisgICAgUnVieVRlc3QoIi9ydWJ5X2dlbmVyYXRlZF9wa2dfZXhwbGljaXQiKTsKK30KKworVEVTVChSdWJ5R2VuZXJhdG9yVGVzdCwgUHJvdG8zRXhwbGljdExlZ2FjeVBhY2thZ2VUZXN0KSB7CisgICAgUnVieVRlc3QoIi9ydWJ5X2dlbmVyYXRlZF9wa2dfZXhwbGljaXRfbGVnYWN5Iik7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHJ1YnkKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3NjYy5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk1Njg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zY2MuaApAQCAtMCwwICsxLDE2NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1NDQ19IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1NDQ19IX18KKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCisvLyBEZXNjcmlwdGlvbiBvZiBlYWNoIHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnQuIE5vdGUgdGhhdCB0aGUgb3JkZXIKKy8vIG9mIGJvdGggdGhlIGRlc2NyaXB0b3JzIGluIHRoaXMgU0NDIGFuZCB0aGUgb3JkZXIgb2YgY2hpbGRyZW4gaXMKKy8vIGRldGVybWluaXN0aWMuCitzdHJ1Y3QgU0NDIHsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+IGRlc2NyaXB0b3JzOworICBzdGQ6OnZlY3Rvcjxjb25zdCBTQ0MqPiBjaGlsZHJlbjsKKworICBjb25zdCBEZXNjcmlwdG9yKiBHZXRSZXByZXNlbnRhdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIGRlc2NyaXB0b3JzWzBdOyB9CisKKyAgLy8gQWxsIG1lc3NhZ2VzIG11c3QgbmVjZXNzYXJpbHkgYmUgaW4gdGhlIHNhbWUgZmlsZS4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIEdldEZpbGUoKSBjb25zdCB7IHJldHVybiBkZXNjcmlwdG9yc1swXS0+ZmlsZSgpOyB9Cit9OworCisvLyBUaGlzIGNsYXNzIGlzIHVzZWQgZm9yIGFuYWx5emluZyB0aGUgU0NDIGZvciBlYWNoIG1lc3NhZ2UsIHRvIGVuc3VyZSBsaW5lYXIKKy8vIGluc3RlYWQgb2YgcXVhZHJhdGljIHBlcmZvcm1hbmNlLCBpZiB3ZSBkbyB0aGlzIHBlciBtZXNzYWdlIHdlIHdvdWxkIGdldAorLy8gTyhWKihWK0UpKS4KK3RlbXBsYXRlIDxjbGFzcyBEZXBzR2VuZXJhdG9yPgorY2xhc3MgUFJPVE9DX0VYUE9SVCBTQ0NBbmFseXplciB7CisgcHVibGljOgorICBleHBsaWNpdCBTQ0NBbmFseXplcigpIDogaW5kZXhfKDApIHt9CisKKyAgY29uc3QgU0NDKiBHZXRTQ0MoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICAgIGlmIChjYWNoZV8uY291bnQoZGVzY3JpcHRvcikpIHJldHVybiBjYWNoZV9bZGVzY3JpcHRvcl0uc2NjOworICAgIHJldHVybiBERlMoZGVzY3JpcHRvcikuc2NjOworICB9CisKKyBwcml2YXRlOgorICBzdHJ1Y3QgTm9kZURhdGEgeworICAgIGNvbnN0IFNDQyogc2NjOyAgLy8gaWYgbnVsbCBpdCBtZWFucyBpdHMgc3RpbGwgb24gdGhlIHN0YWNrCisgICAgaW50IGluZGV4OworICAgIGludCBsb3dsaW5rOworICB9OworCisgIHN0ZDo6bWFwPGNvbnN0IERlc2NyaXB0b3IqLCBOb2RlRGF0YT4gY2FjaGVfOworICBzdGQ6OnZlY3Rvcjxjb25zdCBEZXNjcmlwdG9yKj4gc3RhY2tfOworICBpbnQgaW5kZXhfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U0NDPj4gZ2FyYmFnZV9iaW5fOworCisgIFNDQyogQ3JlYXRlU0NDKCkgeworICAgIGdhcmJhZ2VfYmluXy5lbXBsYWNlX2JhY2sobmV3IFNDQygpKTsKKyAgICByZXR1cm4gZ2FyYmFnZV9iaW5fLmJhY2soKS5nZXQoKTsKKyAgfQorCisgIC8vIFRhcmphbidzIFN0cm9uZ2x5IENvbm5lY3RlZCBDb21wb25lbnRzIGFsZ28KKyAgTm9kZURhdGEgREZTKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgICAvLyBNdXN0IG5vdCBoYXZlIHZpc2l0ZWQgYWxyZWFkeS4KKyAgICBHT09HTEVfRENIRUNLX0VRKGNhY2hlXy5jb3VudChkZXNjcmlwdG9yKSwgMCk7CisKKyAgICAvLyBNYXJrIHZpc2l0ZWQgYnkgaW5zZXJ0aW5nIGluIG1hcC4KKyAgICBOb2RlRGF0YSYgcmVzdWx0ID0gY2FjaGVfW2Rlc2NyaXB0b3JdOworICAgIC8vIEluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmVzLgorICAgIHJlc3VsdC5pbmRleCA9IHJlc3VsdC5sb3dsaW5rID0gaW5kZXhfKys7CisgICAgc3RhY2tfLnB1c2hfYmFjayhkZXNjcmlwdG9yKTsKKworICAgIC8vIFJlY3Vyc2UgdGhlIGZpZWxkcyAvIG5vZGVzIGluIGdyYXBoCisgICAgZm9yIChhdXRvIGRlcCA6IERlcHNHZW5lcmF0b3IoKShkZXNjcmlwdG9yKSkgeworICAgICAgR09PR0xFX0NIRUNLKGRlcCk7CisgICAgICBpZiAoY2FjaGVfLmNvdW50KGRlcCkgPT0gMCkgeworICAgICAgICAvLyB1bmV4cGxvcmVkIG5vZGUKKyAgICAgICAgTm9kZURhdGEgY2hpbGRfZGF0YSA9IERGUyhkZXApOworICAgICAgICByZXN1bHQubG93bGluayA9IHN0ZDo6bWluKHJlc3VsdC5sb3dsaW5rLCBjaGlsZF9kYXRhLmxvd2xpbmspOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTm9kZURhdGEgY2hpbGRfZGF0YSA9IGNhY2hlX1tkZXBdOworICAgICAgICBpZiAoY2hpbGRfZGF0YS5zY2MgPT0gbnVsbHB0cikgeworICAgICAgICAgIC8vIFN0aWxsIGluIHRoZSBzdGFja18gc28gd2UgZm91bmQgYSBiYWNrIGVkZ2UKKyAgICAgICAgICByZXN1bHQubG93bGluayA9IHN0ZDo6bWluKHJlc3VsdC5sb3dsaW5rLCBjaGlsZF9kYXRhLmluZGV4KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzdWx0LmluZGV4ID09IHJlc3VsdC5sb3dsaW5rKSB7CisgICAgICAvLyBUaGlzIGlzIHRoZSByb290IG9mIGEgc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmVudAorICAgICAgU0NDKiBzY2MgPSBDcmVhdGVTQ0MoKTsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIHNjY19kZXNjID0gc3RhY2tfLmJhY2soKTsKKyAgICAgICAgc2NjLT5kZXNjcmlwdG9ycy5wdXNoX2JhY2soc2NjX2Rlc2MpOworICAgICAgICAvLyBSZW1vdmUgZnJvbSBzdGFjaworICAgICAgICBzdGFja18ucG9wX2JhY2soKTsKKyAgICAgICAgY2FjaGVfW3NjY19kZXNjXS5zY2MgPSBzY2M7CisKKyAgICAgICAgaWYgKHNjY19kZXNjID09IGRlc2NyaXB0b3IpIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBUaGUgb3JkZXIgb2YgZGVzY3JpcHRvcnMgaXMgcmFuZG9tIGFuZCBkZXBlbmRzIGhvdyB0aGlzIFNDQyB3YXMKKyAgICAgIC8vIGRpc2NvdmVyZWQuIEluLW9yZGVyIHRvIGVuc3VyZSBtYXhpbXVtIHN0YWJpbGl0eSB3ZSBzb3J0IGl0IGJ5IG5hbWUuCisgICAgICBzdGQ6OnNvcnQoc2NjLT5kZXNjcmlwdG9ycy5iZWdpbigpLCBzY2MtPmRlc2NyaXB0b3JzLmVuZCgpLAorICAgICAgICAgICAgICAgIFtdKGNvbnN0IERlc2NyaXB0b3IqIGEsIGNvbnN0IERlc2NyaXB0b3IqIGIpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBhLT5mdWxsX25hbWUoKSA8IGItPmZ1bGxfbmFtZSgpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgQWRkQ2hpbGRyZW4oc2NjKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIEFkZCB0aGUgU0NDJ3MgdGhhdCBhcmUgY2hpbGRyZW4gb2YgdGhpcyBTQ0MgdG8gaXRzIGNoaWxkcmVuLgorICB2b2lkIEFkZENoaWxkcmVuKFNDQyogc2NjKSB7CisgICAgc3RkOjpzZXQ8Y29uc3QgU0NDKj4gc2VlbjsKKyAgICBmb3IgKGF1dG8gZGVzY3JpcHRvciA6IHNjYy0+ZGVzY3JpcHRvcnMpIHsKKyAgICAgIGZvciAoYXV0byBjaGlsZF9tc2cgOiBEZXBzR2VuZXJhdG9yKCkoZGVzY3JpcHRvcikpIHsKKyAgICAgICAgR09PR0xFX0NIRUNLKGNoaWxkX21zZyk7CisgICAgICAgIGNvbnN0IFNDQyogY2hpbGQgPSBHZXRTQ0MoY2hpbGRfbXNnKTsKKyAgICAgICAgaWYgKGNoaWxkID09IHNjYykgY29udGludWU7CisgICAgICAgIGlmIChzZWVuLmluc2VydChjaGlsZCkuc2Vjb25kKSB7CisgICAgICAgICAgc2NjLT5jaGlsZHJlbi5wdXNoX2JhY2soY2hpbGQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGNvbXBpbGVyIGJ1ZyBpbiBtc3ZjMjAxNS4KKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNDQ0FuYWx5emVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1NDQ19IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjU0N2RiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmNjCkBAIC0wLDAgKzEsNDk4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vaW9fd2luMzIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworbmFtZXNwYWNlIHsKK2NoYXIqIHBvcnRhYmxlX3N0cmR1cChjb25zdCBjaGFyKiBzKSB7CisgIGNoYXIqIG5zID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4ocykgKyAxKTsKKyAgaWYgKG5zICE9IG51bGxwdHIpIHsKKyAgICBzdHJjcHkobnMsIHMpOworICB9CisgIHJldHVybiBuczsKK30KK30gIC8vIG5hbWVzcGFjZQorCisjaWZkZWYgX1dJTjMyCisKK3N0YXRpYyB2b2lkIENsb3NlSGFuZGxlT3JEaWUoSEFORExFIGhhbmRsZSkgeworICBpZiAoIUNsb3NlSGFuZGxlKGhhbmRsZSkpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2xvc2VIYW5kbGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBTdWJwcm9jZXNzOjpXaW4zMkVycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IoKSk7CisgIH0KK30KKworU3VicHJvY2Vzczo6U3VicHJvY2VzcygpCisgICAgOiBwcm9jZXNzX3N0YXJ0X2Vycm9yXyhFUlJPUl9TVUNDRVNTKSwKKyAgICAgIGNoaWxkX2hhbmRsZV8obnVsbHB0ciksCisgICAgICBjaGlsZF9zdGRpbl8obnVsbHB0ciksCisgICAgICBjaGlsZF9zdGRvdXRfKG51bGxwdHIpIHt9CisKK1N1YnByb2Nlc3M6On5TdWJwcm9jZXNzKCkgeworICBpZiAoY2hpbGRfc3RkaW5fICE9IG51bGxwdHIpIHsKKyAgICBDbG9zZUhhbmRsZU9yRGllKGNoaWxkX3N0ZGluXyk7CisgIH0KKyAgaWYgKGNoaWxkX3N0ZG91dF8gIT0gbnVsbHB0cikgeworICAgIENsb3NlSGFuZGxlT3JEaWUoY2hpbGRfc3Rkb3V0Xyk7CisgIH0KK30KKwordm9pZCBTdWJwcm9jZXNzOjpTdGFydChjb25zdCBzdGQ6OnN0cmluZyYgcHJvZ3JhbSwgU2VhcmNoTW9kZSBzZWFyY2hfbW9kZSkgeworICAvLyBDcmVhdGUgdGhlIHBpcGVzLgorICBIQU5ETEUgc3RkaW5fcGlwZV9yZWFkOworICBIQU5ETEUgc3RkaW5fcGlwZV93cml0ZTsKKyAgSEFORExFIHN0ZG91dF9waXBlX3JlYWQ7CisgIEhBTkRMRSBzdGRvdXRfcGlwZV93cml0ZTsKKworICBpZiAoIUNyZWF0ZVBpcGUoJnN0ZGluX3BpcGVfcmVhZCwgJnN0ZGluX3BpcGVfd3JpdGUsIG51bGxwdHIsIDApKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNyZWF0ZVBpcGU6ICIgPDwgV2luMzJFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKCkpOworICB9CisgIGlmICghQ3JlYXRlUGlwZSgmc3Rkb3V0X3BpcGVfcmVhZCwgJnN0ZG91dF9waXBlX3dyaXRlLCBudWxscHRyLCAwKSkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDcmVhdGVQaXBlOiAiIDw8IFdpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKKyAgfQorCisgIC8vIE1ha2UgY2hpbGQgc2lkZSBvZiB0aGUgcGlwZXMgaW5oZXJpdGFibGUuCisgIGlmICghU2V0SGFuZGxlSW5mb3JtYXRpb24oc3RkaW5fcGlwZV9yZWFkLCBIQU5ETEVfRkxBR19JTkhFUklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GTEFHX0lOSEVSSVQpKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlNldEhhbmRsZUluZm9ybWF0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgV2luMzJFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKCkpOworICB9CisgIGlmICghU2V0SGFuZGxlSW5mb3JtYXRpb24oc3Rkb3V0X3BpcGVfd3JpdGUsIEhBTkRMRV9GTEFHX0lOSEVSSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZMQUdfSU5IRVJJVCkpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiU2V0SGFuZGxlSW5mb3JtYXRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBXaW4zMkVycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IoKSk7CisgIH0KKworICAvLyBTZXR1cCBTVEFSVFVQSU5GTyB0byByZWRpcmVjdCBoYW5kbGVzLgorICBTVEFSVFVQSU5GT1cgc3RhcnR1cF9pbmZvOworICBaZXJvTWVtb3J5KCZzdGFydHVwX2luZm8sIHNpemVvZihzdGFydHVwX2luZm8pKTsKKyAgc3RhcnR1cF9pbmZvLmNiID0gc2l6ZW9mKHN0YXJ0dXBfaW5mbyk7CisgIHN0YXJ0dXBfaW5mby5kd0ZsYWdzID0gU1RBUlRGX1VTRVNUREhBTkRMRVM7CisgIHN0YXJ0dXBfaW5mby5oU3RkSW5wdXQgPSBzdGRpbl9waXBlX3JlYWQ7CisgIHN0YXJ0dXBfaW5mby5oU3RkT3V0cHV0ID0gc3Rkb3V0X3BpcGVfd3JpdGU7CisgIHN0YXJ0dXBfaW5mby5oU3RkRXJyb3IgPSBHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSk7CisKKyAgaWYgKHN0YXJ0dXBfaW5mby5oU3RkRXJyb3IgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiR2V0U3RkSGFuZGxlOiAiIDw8IFdpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKKyAgfQorCisgIC8vIGdldCB3aWRlIHN0cmluZyB2ZXJzaW9uIG9mIHByb2dyYW0gYXMgdGhlIHBhdGggbWF5IGNvbnRhaW4gbm9uLWFzY2lpIGNoYXJhY3RlcnMKKyAgc3RkOjp3c3RyaW5nIHdwcm9ncmFtOworICBpZiAoIWlvOjp3aW4zMjo6c3RyaW5nczo6dXRmOF90b193Y3MocHJvZ3JhbS5jX3N0cigpLCAmd3Byb2dyYW0pKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgInV0ZjhfdG9fd2NzOiAiIDw8IFdpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKKyAgfQorCisgIC8vIEludm9raW5nIGNtZC5leGUgYWxsb3dzIGZvciAnLmJhdCcgZmlsZXMgZnJvbSB0aGUgcGF0aCBhcyB3ZWxsIGFzICcuZXhlJy4KKyAgc3RkOjpzdHJpbmcgY29tbWFuZF9saW5lID0gImNtZC5leGUgL2MgXCIiICsgcHJvZ3JhbSArICJcIiI7CisKKyAgLy8gZ2V0IHdpZGUgc3RyaW5nIHZlcnNpb24gb2YgY29tbWFuZCBsaW5lIGFzIHRoZSBwYXRoIG1heSBjb250YWluIG5vbi1hc2NpaSBjaGFyYWN0ZXJzCisgIHN0ZDo6d3N0cmluZyB3Y29tbWFuZF9saW5lOworICBpZiAoIWlvOjp3aW4zMjo6c3RyaW5nczo6dXRmOF90b193Y3MoY29tbWFuZF9saW5lLmNfc3RyKCksICZ3Y29tbWFuZF9saW5lKSkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJ1dGY4X3RvX3djczogIiA8PCBXaW4zMkVycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IoKSk7CisgIH0KKworICAvLyBVc2luZyBhIG1hbGxvYydlZCBzdHJpbmcgYmVjYXVzZSBDcmVhdGVQcm9jZXNzKCkgY2FuIG11dGF0ZSBpdHMgc2Vjb25kCisgIC8vIHBhcmFtZXRlci4KKyAgd2NoYXJfdCAqd2NvbW1hbmRfbGluZV9jb3B5ID0gX3djc2R1cCh3Y29tbWFuZF9saW5lLmNfc3RyKCkpOworCisgIC8vIENyZWF0ZSB0aGUgcHJvY2Vzcy4KKyAgUFJPQ0VTU19JTkZPUk1BVElPTiBwcm9jZXNzX2luZm87CisKKyAgaWYgKENyZWF0ZVByb2Nlc3NXKChzZWFyY2hfbW9kZSA9PSBTRUFSQ0hfUEFUSCkgPyBudWxscHRyIDogd3Byb2dyYW0uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgIChzZWFyY2hfbW9kZSA9PSBTRUFSQ0hfUEFUSCkgPyB3Y29tbWFuZF9saW5lX2NvcHkgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgIC8vIHByb2Nlc3Mgc2VjdXJpdHkgYXR0cmlidXRlcworICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgIC8vIHRocmVhZCBzZWN1cml0eSBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAgICBUUlVFLCAgICAgLy8gaW5oZXJpdCBoYW5kbGVzPworICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgIC8vIG9ic2N1cmUgY3JlYXRpb24gZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICAvLyBlbnZpcm9ubWVudCAoaW5oZXJpdCBmcm9tIHBhcmVudCkKKyAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICAvLyBjdXJyZW50IGRpcmVjdG9yeSAoaW5oZXJpdCBmcm9tIHBhcmVudCkKKyAgICAgICAgICAgICAgICAgICAgICZzdGFydHVwX2luZm8sICZwcm9jZXNzX2luZm8pKSB7CisgICAgY2hpbGRfaGFuZGxlXyA9IHByb2Nlc3NfaW5mby5oUHJvY2VzczsKKyAgICBDbG9zZUhhbmRsZU9yRGllKHByb2Nlc3NfaW5mby5oVGhyZWFkKTsKKyAgICBjaGlsZF9zdGRpbl8gPSBzdGRpbl9waXBlX3dyaXRlOworICAgIGNoaWxkX3N0ZG91dF8gPSBzdGRvdXRfcGlwZV9yZWFkOworICB9IGVsc2UgeworICAgIHByb2Nlc3Nfc3RhcnRfZXJyb3JfID0gR2V0TGFzdEVycm9yKCk7CisgICAgQ2xvc2VIYW5kbGVPckRpZShzdGRpbl9waXBlX3dyaXRlKTsKKyAgICBDbG9zZUhhbmRsZU9yRGllKHN0ZG91dF9waXBlX3JlYWQpOworICB9CisKKyAgQ2xvc2VIYW5kbGVPckRpZShzdGRpbl9waXBlX3JlYWQpOworICBDbG9zZUhhbmRsZU9yRGllKHN0ZG91dF9waXBlX3dyaXRlKTsKKyAgZnJlZSh3Y29tbWFuZF9saW5lX2NvcHkpOworfQorCitib29sIFN1YnByb2Nlc3M6OkNvbW11bmljYXRlKGNvbnN0IE1lc3NhZ2UmIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcikgeworICBpZiAocHJvY2Vzc19zdGFydF9lcnJvcl8gIT0gRVJST1JfU1VDQ0VTUykgeworICAgICplcnJvciA9IFdpbjMyRXJyb3JNZXNzYWdlKHByb2Nlc3Nfc3RhcnRfZXJyb3JfKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBHT09HTEVfQ0hFQ0soY2hpbGRfaGFuZGxlXyAhPSBudWxscHRyKSA8PCAiTXVzdCBjYWxsIFN0YXJ0KCkgZmlyc3QuIjsKKworICBzdGQ6OnN0cmluZyBpbnB1dF9kYXRhOworICBpZiAoIWlucHV0LlNlcmlhbGl6ZVRvU3RyaW5nKCZpbnB1dF9kYXRhKSkgeworICAgICplcnJvciA9ICJGYWlsZWQgdG8gc2VyaWFsaXplIHJlcXVlc3QuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RkOjpzdHJpbmcgb3V0cHV0X2RhdGE7CisKKyAgaW50IGlucHV0X3BvcyA9IDA7CisKKyAgd2hpbGUgKGNoaWxkX3N0ZG91dF8gIT0gbnVsbHB0cikgeworICAgIEhBTkRMRSBoYW5kbGVzWzJdOworICAgIGludCBoYW5kbGVfY291bnQgPSAwOworCisgICAgaWYgKGNoaWxkX3N0ZGluXyAhPSBudWxscHRyKSB7CisgICAgICBoYW5kbGVzW2hhbmRsZV9jb3VudCsrXSA9IGNoaWxkX3N0ZGluXzsKKyAgICB9CisgICAgaWYgKGNoaWxkX3N0ZG91dF8gIT0gbnVsbHB0cikgeworICAgICAgaGFuZGxlc1toYW5kbGVfY291bnQrK10gPSBjaGlsZF9zdGRvdXRfOworICAgIH0KKworICAgIERXT1JEIHdhaXRfcmVzdWx0ID0KKyAgICAgICAgV2FpdEZvck11bHRpcGxlT2JqZWN0cyhoYW5kbGVfY291bnQsIGhhbmRsZXMsIEZBTFNFLCBJTkZJTklURSk7CisKKyAgICBIQU5ETEUgc2lnbmFsZWRfaGFuZGxlID0gbnVsbHB0cjsKKyAgICBpZiAod2FpdF9yZXN1bHQgPj0gV0FJVF9PQkpFQ1RfMCAmJgorICAgICAgICB3YWl0X3Jlc3VsdCA8IFdBSVRfT0JKRUNUXzAgKyBoYW5kbGVfY291bnQpIHsKKyAgICAgIHNpZ25hbGVkX2hhbmRsZSA9IGhhbmRsZXNbd2FpdF9yZXN1bHQgLSBXQUlUX09CSkVDVF8wXTsKKyAgICB9IGVsc2UgaWYgKHdhaXRfcmVzdWx0ID09IFdBSVRfRkFJTEVEKSB7CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiV2FpdEZvck11bHRpcGxlT2JqZWN0czogIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgV2luMzJFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKCkpOworICAgIH0gZWxzZSB7CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiV2FpdEZvck11bHRpcGxlT2JqZWN0czogVW5leHBlY3RlZCByZXR1cm4gY29kZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgd2FpdF9yZXN1bHQ7CisgICAgfQorCisgICAgaWYgKHNpZ25hbGVkX2hhbmRsZSA9PSBjaGlsZF9zdGRpbl8pIHsKKyAgICAgIERXT1JEIG47CisgICAgICBpZiAoIVdyaXRlRmlsZShjaGlsZF9zdGRpbl8sIGlucHV0X2RhdGEuZGF0YSgpICsgaW5wdXRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZGF0YS5zaXplKCkgLSBpbnB1dF9wb3MsICZuLCBudWxscHRyKSkgeworICAgICAgICAvLyBDaGlsZCBjbG9zZWQgcGlwZS4gIFByZXN1bWFibHkgaXQgd2lsbCByZXBvcnQgYW4gZXJyb3IgbGF0ZXIuCisgICAgICAgIC8vIFByZXRlbmQgd2UncmUgZG9uZSBmb3Igbm93LgorICAgICAgICBpbnB1dF9wb3MgPSBpbnB1dF9kYXRhLnNpemUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlucHV0X3BvcyArPSBuOworICAgICAgfQorCisgICAgICBpZiAoaW5wdXRfcG9zID09IGlucHV0X2RhdGEuc2l6ZSgpKSB7CisgICAgICAgIC8vIFdlJ3JlIGRvbmUgd3JpdGluZy4gIENsb3NlLgorICAgICAgICBDbG9zZUhhbmRsZU9yRGllKGNoaWxkX3N0ZGluXyk7CisgICAgICAgIGNoaWxkX3N0ZGluXyA9IG51bGxwdHI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzaWduYWxlZF9oYW5kbGUgPT0gY2hpbGRfc3Rkb3V0XykgeworICAgICAgY2hhciBidWZmZXJbNDA5Nl07CisgICAgICBEV09SRCBuOworCisgICAgICBpZiAoIVJlYWRGaWxlKGNoaWxkX3N0ZG91dF8sIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZuLCBudWxscHRyKSkgeworICAgICAgICAvLyBXZSdyZSBkb25lIHJlYWRpbmcuICBDbG9zZS4KKyAgICAgICAgQ2xvc2VIYW5kbGVPckRpZShjaGlsZF9zdGRvdXRfKTsKKyAgICAgICAgY2hpbGRfc3Rkb3V0XyA9IG51bGxwdHI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXRfZGF0YS5hcHBlbmQoYnVmZmVyLCBuKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoY2hpbGRfc3RkaW5fICE9IG51bGxwdHIpIHsKKyAgICAvLyBDaGlsZCBkaWQgbm90IGZpbmlzaCByZWFkaW5nIGlucHV0IGJlZm9yZSBpdCBjbG9zZWQgdGhlIG91dHB1dC4KKyAgICAvLyBQcmVzdW1hYmx5IGl0IGV4aXRlZCB3aXRoIGFuIGVycm9yLgorICAgIENsb3NlSGFuZGxlT3JEaWUoY2hpbGRfc3RkaW5fKTsKKyAgICBjaGlsZF9zdGRpbl8gPSBudWxscHRyOworICB9CisKKyAgRFdPUkQgd2FpdF9yZXN1bHQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KGNoaWxkX2hhbmRsZV8sIElORklOSVRFKTsKKworICBpZiAod2FpdF9yZXN1bHQgPT0gV0FJVF9GQUlMRUQpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiV2FpdEZvclNpbmdsZU9iamVjdDogIgorICAgICAgICAgICAgICAgICAgICAgIDw8IFdpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKKyAgfSBlbHNlIGlmICh3YWl0X3Jlc3VsdCAhPSBXQUlUX09CSkVDVF8wKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIldhaXRGb3JTaW5nbGVPYmplY3Q6IFVuZXhwZWN0ZWQgcmV0dXJuIGNvZGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCB3YWl0X3Jlc3VsdDsKKyAgfQorCisgIERXT1JEIGV4aXRfY29kZTsKKyAgaWYgKCFHZXRFeGl0Q29kZVByb2Nlc3MoY2hpbGRfaGFuZGxlXywgJmV4aXRfY29kZSkpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiR2V0RXhpdENvZGVQcm9jZXNzOiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgV2luMzJFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKCkpOworICB9CisKKyAgQ2xvc2VIYW5kbGVPckRpZShjaGlsZF9oYW5kbGVfKTsKKyAgY2hpbGRfaGFuZGxlXyA9IG51bGxwdHI7CisKKyAgaWYgKGV4aXRfY29kZSAhPSAwKSB7CisgICAgKmVycm9yID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgiUGx1Z2luIGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICQwLiIsIGV4aXRfY29kZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFvdXRwdXQtPlBhcnNlRnJvbVN0cmluZyhvdXRwdXRfZGF0YSkpIHsKKyAgICAqZXJyb3IgPSAiUGx1Z2luIG91dHB1dCBpcyB1bnBhcnNlYWJsZTogIiArIENFc2NhcGUob3V0cHV0X2RhdGEpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnN0cmluZyBTdWJwcm9jZXNzOjpXaW4zMkVycm9yTWVzc2FnZShEV09SRCBlcnJvcl9jb2RlKSB7CisgIGNoYXIqIG1lc3NhZ2U7CisKKyAgLy8gV1RGPworICBGb3JtYXRNZXNzYWdlQShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8CisgICAgICAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywKKyAgICAgICAgICAgICAgICAgbnVsbHB0ciwgZXJyb3JfY29kZSwKKyAgICAgICAgICAgICAgICAgTUFLRUxBTkdJRChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUyksCisgICAgICAgICAgICAgICAgIChMUFNUUikmbWVzc2FnZSwgIC8vIE5PVCBBIEJVRyEKKyAgICAgICAgICAgICAgICAgMCwgbnVsbHB0cik7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gbWVzc2FnZTsKKyAgTG9jYWxGcmVlKG1lc3NhZ2UpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNlbHNlICAvLyBfV0lOMzIKKworU3VicHJvY2Vzczo6U3VicHJvY2VzcygpCisgICAgOiBjaGlsZF9waWRfKC0xKSwgY2hpbGRfc3RkaW5fKC0xKSwgY2hpbGRfc3Rkb3V0XygtMSkge30KKworU3VicHJvY2Vzczo6flN1YnByb2Nlc3MoKSB7CisgIGlmIChjaGlsZF9zdGRpbl8gIT0gLTEpIHsKKyAgICBjbG9zZShjaGlsZF9zdGRpbl8pOworICB9CisgIGlmIChjaGlsZF9zdGRvdXRfICE9IC0xKSB7CisgICAgY2xvc2UoY2hpbGRfc3Rkb3V0Xyk7CisgIH0KK30KKwordm9pZCBTdWJwcm9jZXNzOjpTdGFydChjb25zdCBzdGQ6OnN0cmluZyYgcHJvZ3JhbSwgU2VhcmNoTW9kZSBzZWFyY2hfbW9kZSkgeworICAvLyBOb3RlIHRoYXQgd2UgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyIHRocmVhZHMsIHRodXMgd2UgZG9uJ3QgaGF2ZSB0bworICAvLyBkbyBjcmF6eSBzdHVmZiBsaWtlIHVzaW5nIHNvY2tldCBwYWlycyBvciBhdm9pZGluZyBsaWJjIGxvY2tzLgorCisgIC8vIFswXSBpcyByZWFkIGVuZCwgWzFdIGlzIHdyaXRlIGVuZC4KKyAgaW50IHN0ZGluX3BpcGVbMl07CisgIGludCBzdGRvdXRfcGlwZVsyXTsKKworICBHT09HTEVfQ0hFQ0socGlwZShzdGRpbl9waXBlKSAhPSAtMSk7CisgIEdPT0dMRV9DSEVDSyhwaXBlKHN0ZG91dF9waXBlKSAhPSAtMSk7CisKKyAgY2hhciogYXJndlsyXSA9IHtwb3J0YWJsZV9zdHJkdXAocHJvZ3JhbS5jX3N0cigpKSwgbnVsbHB0cn07CisKKyAgY2hpbGRfcGlkXyA9IGZvcmsoKTsKKyAgaWYgKGNoaWxkX3BpZF8gPT0gLTEpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiZm9yazogIiA8PCBzdHJlcnJvcihlcnJubyk7CisgIH0gZWxzZSBpZiAoY2hpbGRfcGlkXyA9PSAwKSB7CisgICAgLy8gV2UgYXJlIHRoZSBjaGlsZC4KKyAgICBkdXAyKHN0ZGluX3BpcGVbMF0sIFNURElOX0ZJTEVOTyk7CisgICAgZHVwMihzdGRvdXRfcGlwZVsxXSwgU1RET1VUX0ZJTEVOTyk7CisKKyAgICBjbG9zZShzdGRpbl9waXBlWzBdKTsKKyAgICBjbG9zZShzdGRpbl9waXBlWzFdKTsKKyAgICBjbG9zZShzdGRvdXRfcGlwZVswXSk7CisgICAgY2xvc2Uoc3Rkb3V0X3BpcGVbMV0pOworCisgICAgc3dpdGNoIChzZWFyY2hfbW9kZSkgeworICAgICAgY2FzZSBTRUFSQ0hfUEFUSDoKKyAgICAgICAgZXhlY3ZwKGFyZ3ZbMF0sIGFyZ3YpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRVhBQ1RfTkFNRToKKyAgICAgICAgZXhlY3YoYXJndlswXSwgYXJndik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFdyaXRlIGRpcmVjdGx5IHRvIFNUREVSUl9GSUxFTk8gdG8gYXZvaWQgc3RkaW8gY29kZSBwYXRocyB0aGF0IG1heSBkbworICAgIC8vIHN0dWZmIHRoYXQgaXMgdW5zYWZlIGhlcmUuCisgICAgaW50IGlnbm9yZWQ7CisgICAgaWdub3JlZCA9IHdyaXRlKFNUREVSUl9GSUxFTk8sIGFyZ3ZbMF0sIHN0cmxlbihhcmd2WzBdKSk7CisgICAgY29uc3QgY2hhciogbWVzc2FnZSA9CisgICAgICAgICI6IHByb2dyYW0gbm90IGZvdW5kIG9yIGlzIG5vdCBleGVjdXRhYmxlXG4iCisgICAgICAgICJQbGVhc2Ugc3BlY2lmeSBhIHByb2dyYW0gdXNpbmcgYWJzb2x1dGUgcGF0aCBvciBtYWtlIHN1cmUgIgorICAgICAgICAidGhlIHByb2dyYW0gaXMgYXZhaWxhYmxlIGluIHlvdXIgUEFUSCBzeXN0ZW0gdmFyaWFibGVcbiI7CisgICAgaWdub3JlZCA9IHdyaXRlKFNUREVSUl9GSUxFTk8sIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSk7CisgICAgKHZvaWQpaWdub3JlZDsKKworICAgIC8vIE11c3QgdXNlIF9leGl0KCkgcmF0aGVyIHRoYW4gZXhpdCgpIHRvIGF2b2lkIGZsdXNoaW5nIG91dHB1dCBidWZmZXJzCisgICAgLy8gdGhhdCB3aWxsIGFsc28gYmUgZmx1c2hlZCBieSB0aGUgcGFyZW50LgorICAgIF9leGl0KDEpOworICB9IGVsc2UgeworICAgIGZyZWUoYXJndlswXSk7CisKKyAgICBjbG9zZShzdGRpbl9waXBlWzBdKTsKKyAgICBjbG9zZShzdGRvdXRfcGlwZVsxXSk7CisKKyAgICBjaGlsZF9zdGRpbl8gPSBzdGRpbl9waXBlWzFdOworICAgIGNoaWxkX3N0ZG91dF8gPSBzdGRvdXRfcGlwZVswXTsKKyAgfQorfQorCitib29sIFN1YnByb2Nlc3M6OkNvbW11bmljYXRlKGNvbnN0IE1lc3NhZ2UmIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcikgeworICBHT09HTEVfQ0hFQ0tfTkUoY2hpbGRfc3RkaW5fLCAtMSkgPDwgIk11c3QgY2FsbCBTdGFydCgpIGZpcnN0LiI7CisKKyAgLy8gVGhlICJzaWdoYW5kbGVyX3QiIHR5cGVkZWYgaXMgR05VLXNwZWNpZmljLCBzbyBkZWZpbmUgb3VyIG93bi4KKyAgdHlwZWRlZiB2b2lkIFNpZ25hbEhhbmRsZXIoaW50KTsKKworICAvLyBNYWtlIHN1cmUgU0lHUElQRSBpcyBkaXNhYmxlZCBzbyB0aGF0IGlmIHRoZSBjaGlsZCBkaWVzIGl0IGRvZXNuJ3Qga2lsbCB1cy4KKyAgU2lnbmFsSGFuZGxlciogb2xkX3BpcGVfaGFuZGxlciA9IHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKworICBzdGQ6OnN0cmluZyBpbnB1dF9kYXRhOworICBpZiAoIWlucHV0LlNlcmlhbGl6ZVRvU3RyaW5nKCZpbnB1dF9kYXRhKSkgeworICAgICplcnJvciA9ICJGYWlsZWQgdG8gc2VyaWFsaXplIHJlcXVlc3QuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RkOjpzdHJpbmcgb3V0cHV0X2RhdGE7CisKKyAgaW50IGlucHV0X3BvcyA9IDA7CisgIGludCBtYXhfZmQgPSBzdGQ6Om1heChjaGlsZF9zdGRpbl8sIGNoaWxkX3N0ZG91dF8pOworCisgIHdoaWxlIChjaGlsZF9zdGRvdXRfICE9IC0xKSB7CisgICAgZmRfc2V0IHJlYWRfZmRzOworICAgIGZkX3NldCB3cml0ZV9mZHM7CisgICAgRkRfWkVSTygmcmVhZF9mZHMpOworICAgIEZEX1pFUk8oJndyaXRlX2Zkcyk7CisgICAgaWYgKGNoaWxkX3N0ZG91dF8gIT0gLTEpIHsKKyAgICAgIEZEX1NFVChjaGlsZF9zdGRvdXRfLCAmcmVhZF9mZHMpOworICAgIH0KKyAgICBpZiAoY2hpbGRfc3RkaW5fICE9IC0xKSB7CisgICAgICBGRF9TRVQoY2hpbGRfc3RkaW5fLCAmd3JpdGVfZmRzKTsKKyAgICB9CisKKyAgICBpZiAoc2VsZWN0KG1heF9mZCArIDEsICZyZWFkX2ZkcywgJndyaXRlX2ZkcywgbnVsbHB0ciwgbnVsbHB0cikgPCAwKSB7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgLy8gSW50ZXJydXB0ZWQgYnkgc2lnbmFsLiAgVHJ5IGFnYWluLgorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJzZWxlY3Q6ICIgPDwgc3RyZXJyb3IoZXJybm8pOworICAgICAgfQorICAgIH0KKworICAgIGlmIChjaGlsZF9zdGRpbl8gIT0gLTEgJiYgRkRfSVNTRVQoY2hpbGRfc3RkaW5fLCAmd3JpdGVfZmRzKSkgeworICAgICAgaW50IG4gPSB3cml0ZShjaGlsZF9zdGRpbl8sIGlucHV0X2RhdGEuZGF0YSgpICsgaW5wdXRfcG9zLAorICAgICAgICAgICAgICAgICAgICBpbnB1dF9kYXRhLnNpemUoKSAtIGlucHV0X3Bvcyk7CisgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgLy8gQ2hpbGQgY2xvc2VkIHBpcGUuICBQcmVzdW1hYmx5IGl0IHdpbGwgcmVwb3J0IGFuIGVycm9yIGxhdGVyLgorICAgICAgICAvLyBQcmV0ZW5kIHdlJ3JlIGRvbmUgZm9yIG5vdy4KKyAgICAgICAgaW5wdXRfcG9zID0gaW5wdXRfZGF0YS5zaXplKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnB1dF9wb3MgKz0gbjsKKyAgICAgIH0KKworICAgICAgaWYgKGlucHV0X3BvcyA9PSBpbnB1dF9kYXRhLnNpemUoKSkgeworICAgICAgICAvLyBXZSdyZSBkb25lIHdyaXRpbmcuICBDbG9zZS4KKyAgICAgICAgY2xvc2UoY2hpbGRfc3RkaW5fKTsKKyAgICAgICAgY2hpbGRfc3RkaW5fID0gLTE7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNoaWxkX3N0ZG91dF8gIT0gLTEgJiYgRkRfSVNTRVQoY2hpbGRfc3Rkb3V0XywgJnJlYWRfZmRzKSkgeworICAgICAgY2hhciBidWZmZXJbNDA5Nl07CisgICAgICBpbnQgbiA9IHJlYWQoY2hpbGRfc3Rkb3V0XywgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisKKyAgICAgIGlmIChuID4gMCkgeworICAgICAgICBvdXRwdXRfZGF0YS5hcHBlbmQoYnVmZmVyLCBuKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdlJ3JlIGRvbmUgcmVhZGluZy4gIENsb3NlLgorICAgICAgICBjbG9zZShjaGlsZF9zdGRvdXRfKTsKKyAgICAgICAgY2hpbGRfc3Rkb3V0XyA9IC0xOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChjaGlsZF9zdGRpbl8gIT0gLTEpIHsKKyAgICAvLyBDaGlsZCBkaWQgbm90IGZpbmlzaCByZWFkaW5nIGlucHV0IGJlZm9yZSBpdCBjbG9zZWQgdGhlIG91dHB1dC4KKyAgICAvLyBQcmVzdW1hYmx5IGl0IGV4aXRlZCB3aXRoIGFuIGVycm9yLgorICAgIGNsb3NlKGNoaWxkX3N0ZGluXyk7CisgICAgY2hpbGRfc3RkaW5fID0gLTE7CisgIH0KKworICBpbnQgc3RhdHVzOworICB3aGlsZSAod2FpdHBpZChjaGlsZF9waWRfLCAmc3RhdHVzLCAwKSA9PSAtMSkgeworICAgIGlmIChlcnJubyAhPSBFSU5UUikgeworICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIndhaXRwaWQ6ICIgPDwgc3RyZXJyb3IoZXJybm8pOworICAgIH0KKyAgfQorCisgIC8vIFJlc3RvcmUgU0lHUElQRSBoYW5kbGluZy4KKyAgc2lnbmFsKFNJR1BJUEUsIG9sZF9waXBlX2hhbmRsZXIpOworCisgIGlmIChXSUZFWElURUQoc3RhdHVzKSkgeworICAgIGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IDApIHsKKyAgICAgIGludCBlcnJvcl9jb2RlID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKyAgICAgICplcnJvciA9CisgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiUGx1Z2luIGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICQwLiIsIGVycm9yX2NvZGUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7CisgICAgaW50IHNpZ25hbCA9IFdURVJNU0lHKHN0YXR1cyk7CisgICAgKmVycm9yID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgiUGx1Z2luIGtpbGxlZCBieSBzaWduYWwgJDAuIiwgc2lnbmFsKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgKmVycm9yID0gIk5laXRoZXIgV0VYSVRTVEFUVVMgbm9yIFdURVJNU0lHIGlzIHRydWU/IjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIW91dHB1dC0+UGFyc2VGcm9tU3RyaW5nKG91dHB1dF9kYXRhKSkgeworICAgICplcnJvciA9ICJQbHVnaW4gb3V0cHV0IGlzIHVucGFyc2VhYmxlOiAiICsgQ0VzY2FwZShvdXRwdXRfZGF0YSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZiAgLy8gIV9XSU4zMgorCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2I3ODRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1NVQlBST0NFU1NfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9TVUJQUk9DRVNTX0hfXworCisjaWZkZWYgX1dJTjMyCisjaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAgLy8gcmlnaHQuLi4KKyNlbmRpZgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlICAvLyBfV0lOMzIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAgLy8gIV9XSU4zMgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgTWVzc2FnZTsKKworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworLy8gVXRpbGl0eSBjbGFzcyBmb3IgbGF1bmNoaW5nIHN1Yi1wcm9jZXNzZXMuCitjbGFzcyBQUk9UT0NfRVhQT1JUIFN1YnByb2Nlc3MgeworIHB1YmxpYzoKKyAgU3VicHJvY2VzcygpOworICB+U3VicHJvY2VzcygpOworCisgIGVudW0gU2VhcmNoTW9kZSB7CisgICAgU0VBUkNIX1BBVEgsICAvLyBVc2UgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICBFWEFDVF9OQU1FICAgIC8vIFByb2dyYW0gaXMgYW4gZXhhY3QgZmlsZSBuYW1lOyBkb24ndCB1c2UgdGhlIFBBVEguCisgIH07CisKKyAgLy8gU3RhcnQgdGhlIHN1YnByb2Nlc3MuICBDdXJyZW50bHkgd2UgZG9uJ3QgcHJvdmlkZSBhIHdheSB0byBzcGVjaWZ5CisgIC8vIGFyZ3VtZW50cyBhcyBwcm90b2MgcGx1Z2lucyBkb24ndCBoYXZlIGFueS4KKyAgdm9pZCBTdGFydChjb25zdCBzdGQ6OnN0cmluZyYgcHJvZ3JhbSwgU2VhcmNoTW9kZSBzZWFyY2hfbW9kZSk7CisKKyAgLy8gU2VyaWFsaXplIHRoZSBpbnB1dCBtZXNzYWdlIGFuZCBwaXBlIGl0IHRvIHRoZSBzdWJwcm9jZXNzJ3Mgc3RkaW4sIHRoZW4KKyAgLy8gY2xvc2UgdGhlIHBpcGUuICBNZWFud2hpbGUsIHJlYWQgZnJvbSB0aGUgc3VicHJvY2VzcydzIHN0ZG91dCBhbmQgcGFyc2UKKyAgLy8gdGhlIGRhdGEgaW50byAqb3V0cHV0LiAgQWxsIHRoaXMgaXMgZG9uZSBjYXJlZnVsbHkgdG8gYXZvaWQgZGVhZGxvY2tzLgorICAvLyBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bC4gIE9uIGFueSBzb3J0IG9mIGVycm9yLCByZXR1cm5zIGZhbHNlIGFuZCBzZXRzCisgIC8vICplcnJvciB0byBhIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtLgorICBib29sIENvbW11bmljYXRlKGNvbnN0IE1lc3NhZ2UmIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQsIHN0ZDo6c3RyaW5nKiBlcnJvcik7CisKKyNpZmRlZiBfV0lOMzIKKyAgLy8gR2l2ZW4gYW4gZXJyb3IgY29kZSwgcmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuICBUaGlzIGlzCisgIC8vIGRlZmluZWQgaGVyZSBzbyB0aGF0IENvbW1hbmRMaW5lSW50ZXJmYWNlIGNhbiBzaGFyZSBpdC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFdpbjMyRXJyb3JNZXNzYWdlKERXT1JEIGVycm9yX2NvZGUpOworI2VuZGlmCisKKyBwcml2YXRlOgorI2lmZGVmIF9XSU4zMgorICBEV09SRCBwcm9jZXNzX3N0YXJ0X2Vycm9yXzsKKyAgSEFORExFIGNoaWxkX2hhbmRsZV87CisKKyAgLy8gVGhlIGZpbGUgaGFuZGxlcyBmb3Igb3VyIGVuZCBvZiB0aGUgY2hpbGQncyBwaXBlcy4gIFdlIGNsb3NlIGVhY2ggYW5kCisgIC8vIHNldCBpdCB0byBOVUxMIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KKyAgSEFORExFIGNoaWxkX3N0ZGluXzsKKyAgSEFORExFIGNoaWxkX3N0ZG91dF87CisKKyNlbHNlICAvLyBfV0lOMzIKKyAgcGlkX3QgY2hpbGRfcGlkXzsKKworICAvLyBUaGUgZmlsZSBkZXNjcmlwdG9ycyBmb3Igb3VyIGVuZCBvZiB0aGUgY2hpbGQncyBwaXBlcy4gIFdlIGNsb3NlIGVhY2ggYW5kCisgIC8vIHNldCBpdCB0byAtMSB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCisgIGludCBjaGlsZF9zdGRpbl87CisgIGludCBjaGlsZF9zdGRvdXRfOworCisjZW5kaWYgIC8vICFfV0lOMzIKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1NVQlBST0NFU1NfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTU2MDc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYwpAQCAtMCwwICsxLDYzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIFRoaXMgaXMgYSBkdW1teSBjb2RlIGdlbmVyYXRvciBwbHVnaW4gdXNlZCBieQorLy8gY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKK2ludCBQcm90b2J1Zk1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICBNb2NrQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IoInRlc3RfcGx1Z2luIik7CisgIHJldHVybiBQbHVnaW5NYWluKGFyZ2MsIGFyZ3YsICZnZW5lcmF0b3IpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisjaWZkZWYgX01TQ19WRVIKKyAgLy8gRG9uJ3QgcHJpbnQgYSBzaWxseSBtZXNzYWdlIG9yIHN0aWNrIGEgbW9kYWwgZGlhbG9nIGJveCBpbiBteSBmYWNlLAorICAvLyBwbGVhc2UuCisgIF9zZXRfYWJvcnRfYmVoYXZpb3IoMCwgfjApOworI2VuZGlmICAvLyAhX01TQ19WRVIKKyAgcmV0dXJuIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpQcm90b2J1Zk1haW4oYXJnYywgYXJndik7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2ggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjg1OTc5MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX291dHB1dF91bml0dGVzdC5zaApAQCAtMCwwICsxLDEwMCBAQAorIyEvYmluL3NoCisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorIworIyBUZXN0IHByb3RvYydzIHppcCBvdXRwdXQgbW9kZS4KKworZmFpbCgpIHsKKyAgZWNobyAiJEAiID4mMgorICBleGl0IDEKK30KKworVEVTVF9UTVBESVI9LgorUFJPVE9DPS4vcHJvdG9jCitKQVI9amFyCitVTlpJUD11bnppcAorCitlY2hvICcKKyAgc3ludGF4ID0gInByb3RvMiI7CisgIG9wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKKyAgb3B0aW9uIGphdmFfcGFja2FnZSA9ICJ0ZXN0LmphciI7CisgIG9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJPdXRlciI7CisgIG1lc3NhZ2UgRm9vIHt9CisgIG1lc3NhZ2UgQmFyIHt9CisnID4gJFRFU1RfVE1QRElSL3Rlc3R6aXAucHJvdG8KKworJFBST1RPQyBcCisgICAgLS1jcHBfb3V0PSRURVNUX1RNUERJUi90ZXN0emlwLnppcCAtLXB5dGhvbl9vdXQ9JFRFU1RfVE1QRElSL3Rlc3R6aXAuemlwIFwKKyAgICAtLWphdmFfb3V0PSRURVNUX1RNUERJUi90ZXN0emlwLmphciAtSSRURVNUX1RNUERJUiB0ZXN0emlwLnByb3RvIFwKKyAgICB8fCBmYWlsICdwcm90b2MgZmFpbGVkLicKKworZWNobyAiVGVzdGluZyBvdXRwdXQgdG8gemlwLi4uIgoraWYgJFVOWklQIC1oID4gL2Rldi9udWxsOyB0aGVuCisgICRVTlpJUCAtdCAkVEVTVF9UTVBESVIvdGVzdHppcC56aXAgPiAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0IFwKKyAgICB8fCBmYWlsICd1bnppcCBmYWlsZWQuJworCisgIGdyZXAgJ3Rlc3Rpbmc6IHRlc3R6aXBcLnBiXC5jYyAqT0skJyAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0ID4gL2Rldi9udWxsIFwKKyAgICB8fCBmYWlsICd0ZXN0emlwLnBiLmNjIG5vdCBmb3VuZCBpbiBvdXRwdXQgemlwLicKKyAgZ3JlcCAndGVzdGluZzogdGVzdHppcFwucGJcLmggKk9LJCcgJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCA+IC9kZXYvbnVsbCBcCisgICAgfHwgZmFpbCAndGVzdHppcC5wYi5oIG5vdCBmb3VuZCBpbiBvdXRwdXQgemlwLicKKyAgZ3JlcCAndGVzdGluZzogdGVzdHppcF9wYjJcLnB5ICpPSyQnICRURVNUX1RNUERJUi90ZXN0emlwLmxpc3QgPiAvZGV2L251bGwgXAorICAgIHx8IGZhaWwgJ3Rlc3R6aXBfcGIyLnB5IG5vdCBmb3VuZCBpbiBvdXRwdXQgemlwLicKKyAgZ3JlcCAtaSAnbWFuaWZlc3QnICRURVNUX1RNUERJUi90ZXN0emlwLmxpc3QgPiAvZGV2L251bGwgXAorICAgICYmIGZhaWwgJ1ppcCBmaWxlIGNvbnRhaW5lZCBtYW5pZmVzdC4nCitlbHNlCisgIGVjaG8gIldhcm5pbmc6ICAndW56aXAnIGNvbW1hbmQgbm90IGF2YWlsYWJsZS4gIFNraXBwaW5nIHRlc3QuIgorZmkKKworZWNobyAiVGVzdGluZyBvdXRwdXQgdG8gamFyLi4uIgoraWYgJEpBUiBjICRURVNUX1RNUERJUi90ZXN0emlwLnByb3RvID4gL2Rldi9udWxsOyB0aGVuCisgICRKQVIgdGYgJFRFU1RfVE1QRElSL3Rlc3R6aXAuamFyID4gJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCBcCisgICAgfHwgZmFpbCAnamFyIGZhaWxlZC4nCisKKyAgIyBDaGVjayB0aGF0IC1pbnRlcmZhY2UuamFyIHRpbWVzdGFtcHMgYXJlIG5vcm1hbGl6ZWQ6CisgIGlmIFtbICIkKFRaPVVUQyAkSkFSIHR2ZiAkVEVTVF9UTVBESVIvdGVzdHppcC5qYXIpIiAhPSAqJ1R1ZSBKYW4gMDEgMDA6MDA6MDAgVVRDIDE5ODAnKiBdXTsgdGhlbgorICAgIGZhaWwgJ1ppcCBkaWQgbm90IGNvbnRhaW4gbm9ybWFsaXplZCB0aW1lc3RhbXBzJworICBmaQorCisgIGdyZXAgJ150ZXN0L2phci9Gb29cLmphdmEkJyAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0ID4gL2Rldi9udWxsIFwKKyAgICB8fCBmYWlsICdGb28uamF2YSBub3QgZm91bmQgaW4gb3V0cHV0IGphci4nCisgIGdyZXAgJ150ZXN0L2phci9CYXJcLmphdmEkJyAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0ID4gL2Rldi9udWxsIFwKKyAgICB8fCBmYWlsICdCYXIuamF2YSBub3QgZm91bmQgaW4gb3V0cHV0IGphci4nCisgIGdyZXAgJ150ZXN0L2phci9PdXRlclwuamF2YSQnICRURVNUX1RNUERJUi90ZXN0emlwLmxpc3QgPiAvZGV2L251bGwgXAorICAgIHx8IGZhaWwgJ091dGVyLmphdmEgbm90IGZvdW5kIGluIG91dHB1dCBqYXIuJworICBncmVwICdeTUVUQS1JTkYvTUFOSUZFU1RcLk1GJCcgJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCA+IC9kZXYvbnVsbCBcCisgICAgfHwgZmFpbCAnTWFuaWZlc3Qgbm90IGZvdW5kIGluIG91dHB1dCBqYXIuJworZWxzZQorICBlY2hvICJXYXJuaW5nOiAgJ2phcicgY29tbWFuZCBub3QgYXZhaWxhYmxlLiAgU2tpcHBpbmcgdGVzdC4iCitmaQorCitlY2hvIFBBU1MKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmUxZDcxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmNjCkBAIC0wLDAgKzEsMTk1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBhbWJyb3NlQGdvb2dsZS5jb20gKEFtYnJvc2UgRmVpbnN0ZWluKSwKKy8vICAgICAgICAga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vCisvLyBCYXNlZCBvbiBodHRwOi8vd3d3LnBrd2FyZS5jb20vZG9jdW1lbnRzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworLy8gSmFudWFyeSAxLCAxOTgwIGFzIGEgRE9TIGRhdGUuCisvLyBzZWUgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS85a2tmOXRhaC5hc3B4CitzdGF0aWMgY29uc3QgdWludDE2X3Qga0Rvc0Vwb2NoID0gMSA8PCA1IHwgMTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtDUkMzMlRhYmxlWzI1Nl0gPSB7CisgICAgMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhlZTBlNjEyYywgMHg5OTA5NTFiYSwgMHgwNzZkYzQxOSwgMHg3MDZhZjQ4ZiwKKyAgICAweGU5NjNhNTM1LCAweDllNjQ5NWEzLCAweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LAorICAgIDB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsIDB4MWRiNzEwNjQsIDB4NmFiMDIwZjIsCisgICAgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwgMHgxYWRhZDQ3ZCwgMHg2ZGRkZTRlYiwgMHhmNGQ0YjU1MSwgMHg4M2QzODVjNywKKyAgICAweDEzNmM5ODU2LCAweDY0NmJhOGMwLCAweGZkNjJmOTdhLCAweDhhNjVjOWVjLCAweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LAorICAgIDB4ZmEwZjNkNjMsIDB4OGQwODBkZjUsIDB4M2I2ZTIwYzgsIDB4NGM2OTEwNWUsIDB4ZDU2MDQxZTQsIDB4YTI2NzcxNzIsCisgICAgMHgzYzAzZTRkMSwgMHg0YjA0ZDQ0NywgMHhkMjBkODVmZCwgMHhhNTBhYjU2YiwgMHgzNWI1YThmYSwgMHg0MmIyOTg2YywKKyAgICAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLCAweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LAorICAgIDB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsIDB4MjFiNGY0YjUsIDB4NTZiM2M0MjMsCisgICAgMHhjZmJhOTU5OSwgMHhiOGJkYTUwZiwgMHgyODAyYjg5ZSwgMHg1ZjA1ODgwOCwgMHhjNjBjZDliMiwgMHhiMTBiZTkyNCwKKyAgICAweDJmNmY3Yzg3LCAweDU4Njg0YzExLCAweGMxNjExZGFiLCAweGI2NjYyZDNkLCAweDc2ZGM0MTkwLCAweDAxZGI3MTA2LAorICAgIDB4OThkMjIwYmMsIDB4ZWZkNTEwMmEsIDB4NzFiMTg1ODksIDB4MDZiNmI1MWYsIDB4OWZiZmU0YTUsIDB4ZThiOGQ0MzMsCisgICAgMHg3ODA3YzlhMiwgMHgwZjAwZjkzNCwgMHg5NjA5YTg4ZSwgMHhlMTBlOTgxOCwgMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwKKyAgICAweDkxNjQ2Yzk3LCAweGU2NjM1YzAxLCAweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLAorICAgIDB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsIDB4NjViMGQ5YzYsIDB4MTJiN2U5NTAsCisgICAgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywgMHg2MmRkMWRkZiwgMHgxNWRhMmQ0OSwgMHg4Y2QzN2NmMywgMHhmYmQ0NGM2NSwKKyAgICAweDRkYjI2MTU4LCAweDNhYjU1MWNlLCAweGEzYmMwMDc0LCAweGQ0YmIzMGUyLCAweDRhZGZhNTQxLCAweDNkZDg5NWQ3LAorICAgIDB4YTRkMWM0NmQsIDB4ZDNkNmY0ZmIsIDB4NDM2OWU5NmEsIDB4MzQ2ZWQ5ZmMsIDB4YWQ2Nzg4NDYsIDB4ZGE2MGI4ZDAsCisgICAgMHg0NDA0MmQ3MywgMHgzMzAzMWRlNSwgMHhhYTBhNGM1ZiwgMHhkZDBkN2NjOSwgMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwKKyAgICAweGJlMGIxMDEwLCAweGM5MGMyMDg2LCAweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAorICAgIDB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsIDB4NTliMzNkMTcsIDB4MmViNDBkODEsCisgICAgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwgMHhlZGI4ODMyMCwgMHg5YWJmYjNiNiwgMHgwM2I2ZTIwYywgMHg3NGIxZDI5YSwKKyAgICAweGVhZDU0NzM5LCAweDlkZDI3N2FmLCAweDA0ZGIyNjE1LCAweDczZGMxNjgzLCAweGUzNjMwYjEyLCAweDk0NjQzYjg0LAorICAgIDB4MGQ2ZDZhM2UsIDB4N2E2YTVhYTgsIDB4ZTQwZWNmMGIsIDB4OTMwOWZmOWQsIDB4MGEwMGFlMjcsIDB4N2QwNzllYjEsCisgICAgMHhmMDBmOTM0NCwgMHg4NzA4YTNkMiwgMHgxZTAxZjI2OCwgMHg2OTA2YzJmZSwgMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYiwKKyAgICAweDE5NmMzNjcxLCAweDZlNmIwNmU3LCAweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLAorICAgIDB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsIDB4ZDZkNmEzZTgsIDB4YTFkMTkzN2UsCisgICAgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwgMHhkMWJiNjdmMSwgMHhhNmJjNTc2NywgMHgzZmI1MDZkZCwgMHg0OGIyMzY0YiwKKyAgICAweGQ4MGQyYmRhLCAweGFmMGExYjRjLCAweDM2MDM0YWY2LCAweDQxMDQ3YTYwLCAweGRmNjBlZmMzLCAweGE4NjdkZjU1LAorICAgIDB4MzE2ZThlZWYsIDB4NDY2OWJlNzksIDB4Y2I2MWIzOGMsIDB4YmM2NjgzMWEsIDB4MjU2ZmQyYTAsIDB4NTI2OGUyMzYsCisgICAgMHhjYzBjNzc5NSwgMHhiYjBiNDcwMywgMHgyMjAyMTZiOSwgMHg1NTA1MjYyZiwgMHhjNWJhM2JiZSwgMHhiMmJkMGIyOCwKKyAgICAweDJiYjQ1YTkyLCAweDVjYjM2YTA0LCAweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLAorICAgIDB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsIDB4OWMwOTA2YTksIDB4ZWIwZTM2M2YsCisgICAgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywgMHg5NWJmNGE4MiwgMHhlMmI4N2ExNCwgMHg3YmIxMmJhZSwgMHgwY2I2MWIzOCwKKyAgICAweDkyZDI4ZTliLCAweGU1ZDViZTBkLCAweDdjZGNlZmI3LCAweDBiZGJkZjIxLCAweDg2ZDNkMmQ0LCAweGYxZDRlMjQyLAorICAgIDB4NjhkZGIzZjgsIDB4MWZkYTgzNmUsIDB4ODFiZTE2Y2QsIDB4ZjZiOTI2NWIsIDB4NmZiMDc3ZTEsIDB4MThiNzQ3NzcsCisgICAgMHg4ODA4NWFlNiwgMHhmZjBmNmE3MCwgMHg2NjA2M2JjYSwgMHgxMTAxMGI1YywgMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwKKyAgICAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LCAweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLAorICAgIDB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsIDB4YWVkMTZhNGEsIDB4ZDlkNjVhZGMsCisgICAgMHg0MGRmMGI2NiwgMHgzN2Q4M2JmMCwgMHhhOWJjYWU1MywgMHhkZWJiOWVjNSwgMHg0N2IyY2Y3ZiwgMHgzMGI1ZmZlOSwKKyAgICAweGJkYmRmMjFjLCAweGNhYmFjMjhhLCAweDUzYjM5MzMwLCAweDI0YjRhM2E2LCAweGJhZDAzNjA1LCAweGNkZDcwNjkzLAorICAgIDB4NTRkZTU3MjksIDB4MjNkOTY3YmYsIDB4YjM2NjdhMmUsIDB4YzQ2MTRhYjgsIDB4NWQ2ODFiMDIsIDB4MmE2ZjJiOTQsCisgICAgMHhiNDBiYmUzNywgMHhjMzBjOGVhMSwgMHg1YTA1ZGYxYiwgMHgyZDAyZWY4ZH07CisKK3N0YXRpYyB1aW50MzJfdCBDb21wdXRlQ1JDMzIoY29uc3Qgc3RkOjpzdHJpbmcmIGJ1ZikgeworICB1aW50MzJfdCB4ID0gfjBVOworICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5zaXplKCk7ICsraSkgeworICAgIHVuc2lnbmVkIGNoYXIgYyA9IGJ1ZltpXTsKKyAgICB4ID0ga0NSQzMyVGFibGVbKHggXiBjKSAmIDB4ZmZdIF4gKHggPj4gOCk7CisgIH0KKyAgcmV0dXJuIH54OworfQorCitzdGF0aWMgdm9pZCBXcml0ZVNob3J0KGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0LCB1aW50MTZfdCB2YWwpIHsKKyAgdWludDhfdCBwWzJdOworICBwWzBdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmFsKTsKKyAgcFsxXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHZhbCA+PiA4KTsKKyAgb3V0LT5Xcml0ZVJhdyhwLCAyKTsKK30KKworWmlwV3JpdGVyOjpaaXBXcml0ZXIoaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiByYXdfb3V0cHV0KQorICAgIDogcmF3X291dHB1dF8ocmF3X291dHB1dCkge30KK1ppcFdyaXRlcjo6flppcFdyaXRlcigpIHt9CisKK2Jvb2wgWmlwV3JpdGVyOjpXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRzKSB7CisgIEZpbGVJbmZvIGluZm87CisKKyAgaW5mby5uYW1lID0gZmlsZW5hbWU7CisgIHVpbnQxNl90IGZpbGVuYW1lX3NpemUgPSBmaWxlbmFtZS5zaXplKCk7CisgIGluZm8ub2Zmc2V0ID0gcmF3X291dHB1dF8tPkJ5dGVDb3VudCgpOworICBpbmZvLnNpemUgPSBjb250ZW50cy5zaXplKCk7CisgIGluZm8uY3JjMzIgPSBDb21wdXRlQ1JDMzIoY29udGVudHMpOworCisgIGZpbGVzXy5wdXNoX2JhY2soaW5mbyk7CisKKyAgLy8gd3JpdGUgZmlsZSBoZWFkZXIKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dChyYXdfb3V0cHV0Xyk7CisgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKDB4MDQwMzRiNTApOyAgLy8gbWFnaWMKKyAgV3JpdGVTaG9ydCgmb3V0cHV0LCAxMCk7ICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0CisgIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAgICAgICAgICAgICAgICAgLy8gZmxhZ3MKKyAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgICAgICAgICAgICAgICAgICAvLyBjb21wcmVzc2lvbiBtZXRob2Q6IHN0b3JlZAorICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgICAgICAgICAgICAgICAgIC8vIGxhc3QgbW9kaWZpZWQgdGltZQorICBXcml0ZVNob3J0KCZvdXRwdXQsIGtEb3NFcG9jaCk7ICAgICAgICAgIC8vIGxhc3QgbW9kaWZpZWQgZGF0ZQorICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMihpbmZvLmNyYzMyKTsgIC8vIGNyYy0zMgorICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMihpbmZvLnNpemUpOyAgIC8vIGNvbXByZXNzZWQgc2l6ZQorICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMihpbmZvLnNpemUpOyAgIC8vIHVuY29tcHJlc3NlZCBzaXplCisgIFdyaXRlU2hvcnQoJm91dHB1dCwgZmlsZW5hbWVfc2l6ZSk7ICAgICAgLy8gZmlsZSBuYW1lIGxlbmd0aAorICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgICAgICAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGxlbmd0aAorICBvdXRwdXQuV3JpdGVTdHJpbmcoZmlsZW5hbWUpOyAgICAgICAgICAgIC8vIGZpbGUgbmFtZQorICBvdXRwdXQuV3JpdGVTdHJpbmcoY29udGVudHMpOyAgICAgICAgICAgIC8vIGZpbGUgZGF0YQorCisgIHJldHVybiAhb3V0cHV0LkhhZEVycm9yKCk7Cit9CisKK2Jvb2wgWmlwV3JpdGVyOjpXcml0ZURpcmVjdG9yeSgpIHsKKyAgdWludDE2X3QgbnVtX2VudHJpZXMgPSBmaWxlc18uc2l6ZSgpOworICB1aW50MzJfdCBkaXJfb2ZzID0gcmF3X291dHB1dF8tPkJ5dGVDb3VudCgpOworCisgIC8vIHdyaXRlIGNlbnRyYWwgZGlyZWN0b3J5CisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQocmF3X291dHB1dF8pOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9lbnRyaWVzOyArK2kpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUgPSBmaWxlc19baV0ubmFtZTsKKyAgICB1aW50MTZfdCBmaWxlbmFtZV9zaXplID0gZmlsZW5hbWUuc2l6ZSgpOworICAgIHVpbnQzMl90IGNyYzMyID0gZmlsZXNfW2ldLmNyYzMyOworICAgIHVpbnQzMl90IHNpemUgPSBmaWxlc19baV0uc2l6ZTsKKyAgICB1aW50MzJfdCBvZmZzZXQgPSBmaWxlc19baV0ub2Zmc2V0OworCisgICAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoMHgwMjAxNGI1MCk7ICAvLyBtYWdpYworICAgIFdyaXRlU2hvcnQoJm91dHB1dCwgMTApOyAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbiBtYWRlIGJ5CisgICAgV3JpdGVTaG9ydCgmb3V0cHV0LCAxMCk7ICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0CisgICAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgICAgICAgICAgICAgICAgICAvLyBmbGFncworICAgIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAgICAgICAgICAgICAgICAgLy8gY29tcHJlc3Npb24gbWV0aG9kOiBzdG9yZWQKKyAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgICAgICAgICAgICAgICAgIC8vIGxhc3QgbW9kaWZpZWQgdGltZQorICAgIFdyaXRlU2hvcnQoJm91dHB1dCwga0Rvc0Vwb2NoKTsgICAgICAgICAgLy8gbGFzdCBtb2RpZmllZCBkYXRlCisgICAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoY3JjMzIpOyAgICAgICAvLyBjcmMtMzIKKyAgICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMihzaXplKTsgICAgICAgIC8vIGNvbXByZXNzZWQgc2l6ZQorICAgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKHNpemUpOyAgICAgICAgLy8gdW5jb21wcmVzc2VkIHNpemUKKyAgICBXcml0ZVNob3J0KCZvdXRwdXQsIGZpbGVuYW1lX3NpemUpOyAgICAgIC8vIGZpbGUgbmFtZSBsZW5ndGgKKyAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgICAgICAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGxlbmd0aAorICAgIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAgICAgICAgICAgICAgICAgLy8gZmlsZSBjb21tZW50IGxlbmd0aAorICAgIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAgICAgICAgICAgICAgICAgLy8gc3RhcnRpbmcgZGlzayBudW1iZXIKKyAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgICAgICAgICAgICAgICAgIC8vIGludGVybmFsIGZpbGUgYXR0cmlidXRlcworICAgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKDApOyAgICAgICAgICAgLy8gZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzCisgICAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIob2Zmc2V0KTsgICAgICAvLyBsb2NhbCBoZWFkZXIgb2Zmc2V0CisgICAgb3V0cHV0LldyaXRlU3RyaW5nKGZpbGVuYW1lKTsgICAgICAgICAgICAvLyBmaWxlIG5hbWUKKyAgfQorICB1aW50MzJfdCBkaXJfbGVuID0gb3V0cHV0LkJ5dGVDb3VudCgpOworCisgIC8vIHdyaXRlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBtYXJrZXIKKyAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoMHgwNjA1NGI1MCk7ICAvLyBtYWdpYworICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgICAgICAgICAgICAgICAgIC8vIGRpc2sgbnVtYmVyCisgIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAgICAgICAgICAgICAgLy8gZGlzayB3aXRoIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5CisgIFdyaXRlU2hvcnQoJm91dHB1dCwgbnVtX2VudHJpZXMpOyAgICAgLy8gY2VudHJhbCBkaXJlY3RvcnkgZW50cmllcyAodGhpcyBkaXNrKQorICBXcml0ZVNob3J0KCZvdXRwdXQsIG51bV9lbnRyaWVzKTsgICAgIC8vIGNlbnRyYWwgZGlyZWN0b3J5IGVudHJpZXMgKHRvdGFsKQorICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMihkaXJfbGVuKTsgIC8vIGNlbnRyYWwgZGlyZWN0b3J5IGJ5dGUgc2l6ZQorICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMihkaXJfb2ZzKTsgIC8vIGNlbnRyYWwgZGlyZWN0b3J5IG9mZnNldAorICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgICAgICAgICAgICAgIC8vIGNvbW1lbnQgbGVuZ3RoCisKKyAgcmV0dXJuIG91dHB1dC5IYWRFcnJvcigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDdmNjlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmgKQEAgLTAsMCArMSw2OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1pJUF9XUklURVJfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9aSVBfV1JJVEVSX0hfXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworY2xhc3MgWmlwV3JpdGVyIHsKKyBwdWJsaWM6CisgIFppcFdyaXRlcihpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIHJhd19vdXRwdXQpOworICB+WmlwV3JpdGVyKCk7CisKKyAgYm9vbCBXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50cyk7CisgIGJvb2wgV3JpdGVEaXJlY3RvcnkoKTsKKworIHByaXZhdGU6CisgIHN0cnVjdCBGaWxlSW5mbyB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB1aW50MzJfdCBjcmMzMjsKKyAgfTsKKworICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIHJhd19vdXRwdXRfOworICBzdGQ6OnZlY3RvcjxGaWxlSW5mbz4gZmlsZXNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfWklQX1dSSVRFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjM0MjdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmNjCkBAIC0wLDAgKzEsODM0MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hbnkuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KKworI3VuZGVmIFBBQ0tBR0UgIC8vIGF1dG9oZWFkZXIgI2RlZmluZXMgdGhpcy4gIDooCisKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIHsKK2NvbnN0IGludCBrUGFja2FnZUxpbWl0ID0gMTAwOworCisvLyBOb3RlOiAgSSBkaXN0cnVzdCBjdHlwZS5oIGR1ZSB0byBsb2NhbGVzLgorY2hhciBUb1VwcGVyKGNoYXIgY2gpIHsKKyAgcmV0dXJuIChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSA/IChjaCAtICdhJyArICdBJykgOiBjaDsKK30KKworY2hhciBUb0xvd2VyKGNoYXIgY2gpIHsKKyAgcmV0dXJuIChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKSA/IChjaCAtICdBJyArICdhJykgOiBjaDsKK30KKworc3RkOjpzdHJpbmcgVG9DYW1lbENhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0LCBib29sIGxvd2VyX2ZpcnN0KSB7CisgIGJvb2wgY2FwaXRhbGl6ZV9uZXh0ID0gIWxvd2VyX2ZpcnN0OworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5yZXNlcnZlKGlucHV0LnNpemUoKSk7CisKKyAgZm9yIChjaGFyIGNoYXJhY3RlciA6IGlucHV0KSB7CisgICAgaWYgKGNoYXJhY3RlciA9PSAnXycpIHsKKyAgICAgIGNhcGl0YWxpemVfbmV4dCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChjYXBpdGFsaXplX25leHQpIHsKKyAgICAgIHJlc3VsdC5wdXNoX2JhY2soVG9VcHBlcihjaGFyYWN0ZXIpKTsKKyAgICAgIGNhcGl0YWxpemVfbmV4dCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQucHVzaF9iYWNrKGNoYXJhY3Rlcik7CisgICAgfQorICB9CisKKyAgLy8gTG93ZXItY2FzZSB0aGUgZmlyc3QgbGV0dGVyLgorICBpZiAobG93ZXJfZmlyc3QgJiYgIXJlc3VsdC5lbXB0eSgpKSB7CisgICAgcmVzdWx0WzBdID0gVG9Mb3dlcihyZXN1bHRbMF0pOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgVG9Kc29uTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQpIHsKKyAgYm9vbCBjYXBpdGFsaXplX25leHQgPSBmYWxzZTsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzZXJ2ZShpbnB1dC5zaXplKCkpOworCisgIGZvciAoY2hhciBjaGFyYWN0ZXIgOiBpbnB1dCkgeworICAgIGlmIChjaGFyYWN0ZXIgPT0gJ18nKSB7CisgICAgICBjYXBpdGFsaXplX25leHQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoY2FwaXRhbGl6ZV9uZXh0KSB7CisgICAgICByZXN1bHQucHVzaF9iYWNrKFRvVXBwZXIoY2hhcmFjdGVyKSk7CisgICAgICBjYXBpdGFsaXplX25leHQgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0LnB1c2hfYmFjayhjaGFyYWN0ZXIpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEJhY2twb3J0IG9mIGZvbGQgZXhwcmVzc2lvbnMgZm9yIHRoZSBjb21tYSBvcGVyYXRvciB0byBDKysxMS4KKy8vIFVzYWdlOiAgRm9sZCh7ZXhwci4uLn0pOworLy8gR3VhcmFudGVlZCB0byBldmFsdWF0ZSBsZWZ0LXRvLXJpZ2h0CitzdHJ1Y3QgRXhwcmVzc2lvbkVhdGVyIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEV4cHJlc3Npb25FYXRlcihUJiYpIHt9ICAvLyBOT0xJTlQKK307Cit2b2lkIEZvbGQoc3RkOjppbml0aWFsaXplcl9saXN0PEV4cHJlc3Npb25FYXRlcj4pIHt9CisKK3RlbXBsYXRlIDxpbnQgUj4KK2NvbnN0ZXhwciBzaXplX3QgUm91bmRVcFRvKHNpemVfdCBuKSB7CisgIHN0YXRpY19hc3NlcnQoKFIgJiAoUiAtIDEpKSA9PSAwLCAiTXVzdCBiZSBwb3dlciBvZiB0d28iKTsKKyAgcmV0dXJuIChuICsgKFIgLSAxKSkgJiB+KFIgLSAxKTsKK30KKworY29uc3RleHByIHNpemVfdCBNYXgoc2l6ZV90IGEsIHNpemVfdCBiKSB7IHJldHVybiBhID4gYiA/IGEgOiBiOyB9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gVHM+Citjb25zdGV4cHIgc2l6ZV90IE1heChUIGEsIFRzLi4uIGIpIHsKKyAgcmV0dXJuIE1heChhLCBNYXgoYi4uLikpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NvbnN0ZXhwciBzaXplX3QgRWZmZWN0aXZlQWxpZ25vZigpIHsKKyAgLy8gYGNoYXJgIGlzIHNwZWNpYWwgaW4gdGhhdCBpdCBnZXRzIGFsaWduZWQgdG8gOC4gSXQgaXMgd2hlcmUgd2UgZHJvcCB0aGUKKyAgLy8gdHJpdmlhbCBzdHJ1Y3RzLgorICByZXR1cm4gc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSA/IDggOiBhbGlnbm9mKFQpOworfQorCit0ZW1wbGF0ZSA8aW50IGFsaWduLCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBUPgordXNpbmcgQXBwZW5kSWZBbGlnbiA9CisgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxFZmZlY3RpdmVBbGlnbm9mPFU+KCkgPT0gYWxpZ24sIHZvaWQgKCopKFQuLi4sIFUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKikoVC4uLik+Ojp0eXBlOworCisvLyBNZXRhZnVuY3Rpb24gdG8gc29ydCB0eXBlcyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIGFsaWdubWVudC4KKy8vIFVzZWZ1bCBmb3IgdGhlIGZsYXQgYWxsb2NhdG9yIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IG9mIGFsbCBlbGVtZW50cworLy8gd2l0aG91dCBoYXZpbmcgdG8gYWRkIHBhZGRpbmcuCisvLyBJbnN0ZWFkIG9mIGltcGxlbWVudGluZyBhIHByb3BlciBzb3J0IG1ldGFmdW5jdGlvbiB3ZSBqdXN0IGRvIGEKKy8vIGZpbHRlcittZXJnZSwgd2hpY2ggaXMgbXVjaCBzaW1wbGVyIHRvIHdyaXRlIGFzIGEgbWV0YWZ1bmN0aW9uLgorLy8gV2UgaGF2ZSBhIGZpeGVkIHNldCBvZiBhbGlnbm1lbnRzIHdlIGNhbiBmaWx0ZXIgb24uCisvLyBGb3Igc2ltcGxpY2l0eSB3ZSB1c2UgYSBmdW5jdGlvbiBwb2ludGVyIGFzIGEgdHlwZSBsaXN0LgordGVtcGxhdGUgPHR5cGVuYW1lIEluLCB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDIsCisgICAgICAgICAgdHlwZW5hbWUgVDE+CitzdHJ1Y3QgVHlwZUxpc3RTb3J0SW1wbDsKKwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIFQxNiwgdHlwZW5hbWUuLi4gVDgsIHR5cGVuYW1lLi4uIFQ0LCB0eXBlbmFtZS4uLiBUMiwKKyAgICAgICAgICB0eXBlbmFtZS4uLiBUMT4KK3N0cnVjdCBUeXBlTGlzdFNvcnRJbXBsPHZvaWQgKCopKCksIHZvaWQgKCopKFQxNi4uLiksIHZvaWQgKCopKFQ4Li4uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCopKFQ0Li4uKSwgdm9pZCAoKikoVDIuLi4pLCB2b2lkICgqKShUMS4uLik+IHsKKyAgdXNpbmcgdHlwZSA9IHZvaWQgKCopKFQxNi4uLiwgVDguLi4sIFQ0Li4uLCBUMi4uLiwgVDEuLi4pOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0LCB0eXBlbmFtZS4uLiBSZXN0LCB0eXBlbmFtZS4uLiBUMTYsIHR5cGVuYW1lLi4uIFQ4LAorICAgICAgICAgIHR5cGVuYW1lLi4uIFQ0LCB0eXBlbmFtZS4uLiBUMiwgdHlwZW5hbWUuLi4gVDE+CitzdHJ1Y3QgVHlwZUxpc3RTb3J0SW1wbDx2b2lkICgqKShGaXJzdCwgUmVzdC4uLiksIHZvaWQgKCopKFQxNi4uLiksCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqKShUOC4uLiksIHZvaWQgKCopKFQ0Li4uKSwgdm9pZCAoKikoVDIuLi4pLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKikoVDEuLi4pPiB7CisgIHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBUeXBlTGlzdFNvcnRJbXBsPAorICAgICAgdm9pZCAoKikoUmVzdC4uLiksIEFwcGVuZElmQWxpZ248MTYsIEZpcnN0LCBUMTYuLi4+LAorICAgICAgQXBwZW5kSWZBbGlnbjw4LCBGaXJzdCwgVDguLi4+LCBBcHBlbmRJZkFsaWduPDQsIEZpcnN0LCBUNC4uLj4sCisgICAgICBBcHBlbmRJZkFsaWduPDIsIEZpcnN0LCBUMi4uLj4sIEFwcGVuZElmQWxpZ248MSwgRmlyc3QsIFQxLi4uPj46OnR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4KK3VzaW5nIFNvcnRCeUFsaWdubWVudCA9CisgICAgdHlwZW5hbWUgVHlwZUxpc3RTb3J0SW1wbDx2b2lkICgqKShULi4uKSwgdm9pZCAoKikoKSwgdm9pZCAoKikoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCopKCksIHZvaWQgKCopKCksIHZvaWQgKCopKCk+Ojp0eXBlOworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lLi4uPiBjbGFzcyBDLCB0eXBlbmFtZS4uLiBUPgorYXV0byBBcHBseVR5cGVMaXN0KHZvaWQgKCopKFQuLi4pKSAtPiBDPFQuLi4+OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NvbnN0ZXhwciBpbnQgRmluZFR5cGVJbmRleCgpIHsKKyAgcmV0dXJuIC0xOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lLi4uIFRzPgorY29uc3RleHByIGludCBGaW5kVHlwZUluZGV4KCkgeworICByZXR1cm4gc3RkOjppc19zYW1lPFQsIFQxPjo6dmFsdWUgPyAwIDogRmluZFR5cGVJbmRleDxULCBUcy4uLj4oKSArIDE7Cit9CisKKy8vIEEgdHlwZSB0byB2YWx1ZSBtYXAsIHdoZXJlIHRoZSBwb3NzaWJsZSBrZXlzIGFzIHNwZWNpZmllZCBpbiBgS2V5cy4uLmAuCisvLyBUaGUgdmFsdWVzIGZvciBrZXkgYEtgIGlzIGBWYWx1ZVQ8Sz5gCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBWYWx1ZVQsIHR5cGVuYW1lLi4uIEtleXM+CitjbGFzcyBUeXBlTWFwIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLPgorICBWYWx1ZVQ8Sz4mIEdldCgpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QmFzZTxLPiY+KHBheWxvYWRfKS52YWx1ZTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLPgorICBjb25zdCBWYWx1ZVQ8Sz4mIEdldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgQmFzZTxLPiY+KHBheWxvYWRfKS52YWx1ZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEs+CisgIHN0cnVjdCBCYXNlIHsKKyAgICBWYWx1ZVQ8Sz4gdmFsdWV7fTsKKyAgfTsKKyAgc3RydWN0IFBheWxvYWQgOiBCYXNlPEtleXM+Li4uIHt9OworICBQYXlsb2FkIHBheWxvYWRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit1c2luZyBJbnRUID0gaW50OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit1c2luZyBQb2ludGVyVCA9IFQqOworCisvLyBNYW5hZ2VzIGFuIGFsbG9jYXRpb24gb2Ygc2VxdWVudGlhbCBhcnJheXMgb2YgdHlwZSBgVC4uLmAuCisvLyBJdCBpcyBtb3JlIHNwYWNlIGVmZmljaWVudCB0aGFuIHN0b3JpbmcgTiAocHRyLCBzaXplKSBwYWlycywgYnkgc3RvcmluZyBvbmx5CisvLyB0aGUgcG9pbnRlciB0byB0aGUgaGVhZCBhbmQgdGhlIGJvdW5kYXJpZXMgYmV0d2VlbiB0aGUgYXJyYXlzLgordGVtcGxhdGUgPHR5cGVuYW1lLi4uIFQ+CitjbGFzcyBGbGF0QWxsb2NhdGlvbiB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4QWxpZ24gPSBNYXgoYWxpZ25vZihUKS4uLik7CisKKyAgRmxhdEFsbG9jYXRpb24oY29uc3QgVHlwZU1hcDxJbnRULCBULi4uPiYgZW5kcykgOiBlbmRzXyhlbmRzKSB7CisgICAgLy8gVGhlIGFycmF5cyBzdGFydCBqdXN0IGFmdGVyIEZsYXRBbGxvY2F0aW9uLCBzbyBhZGp1c3QgdGhlIGVuZHMuCisgICAgRm9sZCh7KGVuZHNfLnRlbXBsYXRlIEdldDxUPigpICs9CisgICAgICAgICAgIFJvdW5kVXBUbzxrTWF4QWxpZ24+KHNpemVvZihGbGF0QWxsb2NhdGlvbikpKS4uLn0pOworICAgIEZvbGQoe0luaXQ8VD4oKS4uLn0pOworICB9CisKKyAgdm9pZCBEZXN0cm95KCkgeworICAgIEZvbGQoe0Rlc3Ryb3k8VD4oKS4uLn0pOworICAgIGludGVybmFsOjpTaXplZERlbGV0ZSh0aGlzLCB0b3RhbF9ieXRlcygpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxpbnQgST4KKyAgdXNpbmcgdHlwZSA9IHR5cGVuYW1lIHN0ZDo6dHVwbGVfZWxlbWVudDxJLCBzdGQ6OnR1cGxlPFQuLi4+Pjo6dHlwZTsKKworICAvLyBHZXRzIGEgdHVwbGUgb2YgdGhlIGhlYWQgcG9pbnRlcnMgZm9yIHRoZSBhcnJheXMKKyAgVHlwZU1hcDxQb2ludGVyVCwgVC4uLj4gUG9pbnRlcnMoKSBjb25zdCB7CisgICAgVHlwZU1hcDxQb2ludGVyVCwgVC4uLj4gb3V0OworICAgIEZvbGQoeyhvdXQudGVtcGxhdGUgR2V0PFQ+KCkgPSBCZWdpbjxUPigpKS4uLn0pOworICAgIHJldHVybiBvdXQ7CisgIH0KKworCisgcHJpdmF0ZToKKyAgLy8gVG90YWwgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgYnkgYWxsIGFycmF5cy4KKyAgaW50IHRvdGFsX2J5dGVzKCkgY29uc3QgeworICAgIC8vIEdldCB0aGUgbGFzdCBlbmQuCisgICAgcmV0dXJuIGVuZHNfLnRlbXBsYXRlIEdldDx0eXBlbmFtZSBzdGQ6OnR1cGxlX2VsZW1lbnQ8CisgICAgICAgIHNpemVvZi4uLihUKSAtIDEsIHN0ZDo6dHVwbGU8VC4uLj4+Ojp0eXBlPigpOworICB9CisKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgaW50IEJlZ2luT2Zmc2V0KCkgY29uc3QgeworICAgIGNvbnN0ZXhwciBpbnQgdHlwZV9pbmRleCA9IEZpbmRUeXBlSW5kZXg8VSwgVC4uLj4oKTsKKyAgICAvLyBBdm9pZCBhIG5lZ2F0aXZlIHZhbHVlIGhlcmUgdG8ga2VlcCBpdCBjb21waWxpbmcgd2hlbiB0eXBlX2luZGV4ID09IDAKKyAgICBjb25zdGV4cHIgaW50IHByZXZfdHlwZV9pbmRleCA9IHR5cGVfaW5kZXggPT0gMCA/IDAgOiB0eXBlX2luZGV4IC0gMTsKKyAgICB1c2luZyBQcmV2VHlwZSA9CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6dHVwbGVfZWxlbWVudDxwcmV2X3R5cGVfaW5kZXgsIHN0ZDo6dHVwbGU8VC4uLj4+Ojp0eXBlOworICAgIC8vIEVuc3VyZSB0aGUgdHlwZXMgYXJlIHByb3Blcmx5IGFsaWduZWQuCisgICAgc3RhdGljX2Fzc2VydChFZmZlY3RpdmVBbGlnbm9mPFByZXZUeXBlPigpID49IEVmZmVjdGl2ZUFsaWdub2Y8VT4oKSwgIiIpOworICAgIHJldHVybiB0eXBlX2luZGV4ID09IDAgPyBSb3VuZFVwVG88a01heEFsaWduPihzaXplb2YoRmxhdEFsbG9jYXRpb24pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBlbmRzXy50ZW1wbGF0ZSBHZXQ8UHJldlR5cGU+KCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgaW50IEVuZE9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZW5kc18udGVtcGxhdGUgR2V0PFU+KCk7CisgIH0KKworICAvLyBBdm9pZCB0aGUgcmVpbnRlcnByZXRfY2FzdCBpZiB0aGUgYXJyYXkgaXMgZW1wdHkuCisgIC8vIENsYW5nJ3MgQ29udHJvbCBGbG93IEludGVncml0eSBkb2VzIG5vdCBsaWtlIHRoZSBjYXN0IHBvaW50aW5nIHRvIG1lbW9yeQorICAvLyB0aGF0IGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgdG8gYmUgb2YgdGhhdCB0eXBlLgorICAvLyAoZnJvbSAtZnNhbml0aXplPWNmaS11bnJlbGF0ZWQtY2FzdCkKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIFUqIEJlZ2luKCkgY29uc3QgeworICAgIGludCBiZWdpbiA9IEJlZ2luT2Zmc2V0PFU+KCksIGVuZCA9IEVuZE9mZnNldDxVPigpOworICAgIGlmIChiZWdpbiA9PSBlbmQpIHJldHVybiBudWxscHRyOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFUqPihkYXRhKCkgKyBiZWdpbik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgVSogRW5kKCkgY29uc3QgeworICAgIGludCBiZWdpbiA9IEJlZ2luT2Zmc2V0PFU+KCksIGVuZCA9IEVuZE9mZnNldDxVPigpOworICAgIGlmIChiZWdpbiA9PSBlbmQpIHJldHVybiBudWxscHRyOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFUqPihkYXRhKCkgKyBlbmQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIGJvb2wgSW5pdCgpIHsKKyAgICAvLyBTa2lwIGZvciB0aGUgYGNoYXJgIGJsb2NrLiBObyBuZWVkIHRvIHplcm8gaW5pdGlhbGl6ZSBpdC4KKyAgICBpZiAoc3RkOjppc19zYW1lPFUsIGNoYXI+Ojp2YWx1ZSkgcmV0dXJuIHRydWU7CisgICAgZm9yIChjaGFyICpwID0gZGF0YSgpICsgQmVnaW5PZmZzZXQ8VT4oKSwgKmVuZCA9IGRhdGEoKSArIEVuZE9mZnNldDxVPigpOworICAgICAgICAgcCAhPSBlbmQ7IHAgKz0gc2l6ZW9mKFUpKSB7CisgICAgICA6Om5ldyAocCkgVXt9OworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBib29sIERlc3Ryb3koKSB7CisgICAgaWYgKHN0ZDo6aXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZTxVPjo6dmFsdWUpIHJldHVybiB0cnVlOworICAgIGZvciAoVSogaXQgPSBCZWdpbjxVPigpLCAqZW5kID0gRW5kPFU+KCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgaXQtPn5VKCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2hhciogZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odGhpcykpOworICB9CisKKyAgVHlwZU1hcDxJbnRULCBULi4uPiBlbmRzXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgorVHlwZU1hcDxJbnRULCBULi4uPiBDYWxjdWxhdGVFbmRzKGNvbnN0IFR5cGVNYXA8SW50VCwgVC4uLj4mIHNpemVzKSB7CisgIGludCB0b3RhbCA9IDA7CisgIFR5cGVNYXA8SW50VCwgVC4uLj4gb3V0OworICBGb2xkKHsob3V0LnRlbXBsYXRlIEdldDxUPigpID0gdG90YWwgKz0KKyAgICAgICAgIHNpemVvZihUKSAqIHNpemVzLnRlbXBsYXRlIEdldDxUPigpKS4uLn0pOworICByZXR1cm4gb3V0OworfQorCisvLyBUaGUgaW1wbGVtZW50YXRpb24gZm9yIEZsYXRBbGxvY2F0b3IgYmVsb3cuCisvLyBUaGlzIHNlcGFyYXRlIGNsYXNzIHRlbXBsYXRlIG1ha2VzIGl0IGVhc2llciB0byBoYXZlIG1ldGhvZHMgdGhhdCBmb2xkIG9uCisvLyBgVC4uLmAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4KK2NsYXNzIEZsYXRBbGxvY2F0b3JJbXBsIHsKKyBwdWJsaWM6CisgIHVzaW5nIEFsbG9jYXRpb24gPSBGbGF0QWxsb2NhdGlvbjxULi4uPjsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgdm9pZCBQbGFuQXJyYXkoaW50IGFycmF5X3NpemUpIHsKKyAgICAvLyBXZSBjYW4ndCBjYWxsIFBsYW5BcnJheSBhZnRlciBGaW5hbGl6ZVBsYW5uaW5nIGhhcyBiZWVuIGNhbGxlZC4KKyAgICBHT09HTEVfQ0hFQ0soIWhhc19hbGxvY2F0ZWQoKSk7CisgICAgaWYgKHN0ZDo6aXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZTxVPjo6dmFsdWUpIHsKKyAgICAgIC8vIFRyaXZpYWwgdHlwZXMgYXJlIGFsaWduZWQgdG8gOCBieXRlcy4KKyAgICAgIHN0YXRpY19hc3NlcnQoYWxpZ25vZihVKSA8PSA4LCAiIik7CisgICAgICB0b3RhbF8udGVtcGxhdGUgR2V0PGNoYXI+KCkgKz0gUm91bmRVcFRvPDg+KGFycmF5X3NpemUgKiBzaXplb2YoVSkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTaW5jZSB3ZSBjYW4ndCB1c2UgYGlmIGNvbnN0ZXhwcmAsIGp1c3QgbWFrZSB0aGUgZXhwcmVzc2lvbiBjb21waWxlCisgICAgICAvLyB3aGVuIHRoaXMgcGF0aCBpcyBub3QgdGFrZW4uCisgICAgICB1c2luZyBUeXBlVG9Vc2UgPQorICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8c3RkOjppc190cml2aWFsbHlfZGVzdHJ1Y3RpYmxlPFU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIsIFU+Ojp0eXBlOworICAgICAgdG90YWxfLnRlbXBsYXRlIEdldDxUeXBlVG9Vc2U+KCkgKz0gYXJyYXlfc2l6ZTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgVSogQWxsb2NhdGVBcnJheShpbnQgYXJyYXlfc2l6ZSkgeworICAgIGNvbnN0ZXhwciBib29sIHRyaXZpYWwgPSBzdGQ6OmlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGU8VT46OnZhbHVlOworICAgIHVzaW5nIFR5cGVUb1VzZSA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8dHJpdmlhbCwgY2hhciwgVT46OnR5cGU7CisKKyAgICAvLyBXZSBjYW4gb25seSBhbGxvY2F0ZSBhZnRlciBGaW5hbGl6ZVBsYW5uaW5nIGhhcyBiZWVuIGNhbGxlZC4KKyAgICBHT09HTEVfQ0hFQ0soaGFzX2FsbG9jYXRlZCgpKTsKKworICAgIFR5cGVUb1VzZSomIGRhdGEgPSBwb2ludGVyc18udGVtcGxhdGUgR2V0PFR5cGVUb1VzZT4oKTsKKyAgICBpbnQmIHVzZWQgPSB1c2VkXy50ZW1wbGF0ZSBHZXQ8VHlwZVRvVXNlPigpOworICAgIFUqIHJlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8VSo+KGRhdGEgKyB1c2VkKTsKKyAgICB1c2VkICs9IHRyaXZpYWwgPyBSb3VuZFVwVG88OD4oYXJyYXlfc2l6ZSAqIHNpemVvZihVKSkgOiBhcnJheV9zaXplOworICAgIEdPT0dMRV9DSEVDS19MRSh1c2VkLCB0b3RhbF8udGVtcGxhdGUgR2V0PFR5cGVUb1VzZT4oKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBJbj4KKyAgY29uc3Qgc3RkOjpzdHJpbmcqIEFsbG9jYXRlU3RyaW5ncyhJbiYmLi4uIGluKSB7CisgICAgc3RkOjpzdHJpbmcqIHN0cmluZ3MgPSBBbGxvY2F0ZUFycmF5PHN0ZDo6c3RyaW5nPihzaXplb2YuLi4oaW4pKTsKKyAgICBzdGQ6OnN0cmluZyogcmVzID0gc3RyaW5nczsKKyAgICBGb2xkKHsoKnN0cmluZ3MrKyA9IHN0ZDo6c3RyaW5nKHN0ZDo6Zm9yd2FyZDxJbj4oaW4pKSkuLi59KTsKKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgLy8gQWxsb2NhdGUgYWxsIDUgbmFtZXMgb2YgdGhlIGZpZWxkOgorICAvLyBuYW1lLCBmdWxsIG5hbWUsIGxvd2VyY2FzZSwgY2FtZWxjYXNlIGFuZCBqc29uLgorICAvLyBJdCB3aWxsIGRlZHVwIHRoZSBzdHJpbmdzIHdoZW4gcG9zc2libGUuCisgIC8vIFRoZSByZXN1bHRpbmcgYXJyYXkgY29udGFpbnMgYG5hbWVgIGF0IGluZGV4IDAsIGBmdWxsX25hbWVgIGF0IGluZGV4IDEKKyAgLy8gYW5kIHRoZSBvdGhlciAzIGluZGljZXMgYXJlIHNwZWNpZmllZCBpbiB0aGUgcmVzdWx0LgorICB2b2lkIFBsYW5GaWVsZE5hbWVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nKiBvcHRfanNvbl9uYW1lKSB7CisgICAgR09PR0xFX0NIRUNLKCFoYXNfYWxsb2NhdGVkKCkpOworCisgICAgLy8gRmFzdCBwYXRoIGZvciBzbmFrZV9jYXNlIG5hbWVzLCB3aGljaCBmb2xsb3cgdGhlIHN0eWxlIGd1aWRlLgorICAgIGlmIChvcHRfanNvbl9uYW1lID09IG51bGxwdHIpIHsKKyAgICAgIHN3aXRjaCAoR2V0RmllbGROYW1lQ2FzZShuYW1lKSkgeworICAgICAgICBjYXNlIEZpZWxkTmFtZUNhc2U6OmtBbGxMb3dlcjoKKyAgICAgICAgICAvLyBDYXNlIDE6IHRoZXkgYXJlIGFsbCB0aGUgc2FtZS4KKyAgICAgICAgICByZXR1cm4gUGxhbkFycmF5PHN0ZDo6c3RyaW5nPigyKTsKKyAgICAgICAgY2FzZSBGaWVsZE5hbWVDYXNlOjprU25ha2VDYXNlOgorICAgICAgICAgIC8vIENhc2UgMjogbmFtZT09bG93ZXIsIGNhbWVsPT1qc29uCisgICAgICAgICAgcmV0dXJuIFBsYW5BcnJheTxzdGQ6OnN0cmluZz4oMyk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgbG93ZXJjYXNlX25hbWUgPSBuYW1lOworICAgIExvd2VyU3RyaW5nKCZsb3dlcmNhc2VfbmFtZSk7CisKKyAgICBzdGQ6OnN0cmluZyBjYW1lbGNhc2VfbmFtZSA9IFRvQ2FtZWxDYXNlKG5hbWUsIC8qIGxvd2VyX2ZpcnN0ID0gKi8gdHJ1ZSk7CisgICAgc3RkOjpzdHJpbmcganNvbl9uYW1lID0KKyAgICAgICAgb3B0X2pzb25fbmFtZSAhPSBudWxscHRyID8gKm9wdF9qc29uX25hbWUgOiBUb0pzb25OYW1lKG5hbWUpOworCisgICAgU3RyaW5nUGllY2UgYWxsX25hbWVzW10gPSB7bmFtZSwgbG93ZXJjYXNlX25hbWUsIGNhbWVsY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25fbmFtZX07CisgICAgc3RkOjpzb3J0KGFsbF9uYW1lcywgYWxsX25hbWVzICsgNCk7CisgICAgaW50IHVuaXF1ZSA9CisgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RkOjp1bmlxdWUoYWxsX25hbWVzLCBhbGxfbmFtZXMgKyA0KSAtIGFsbF9uYW1lcyk7CisKKyAgICBQbGFuQXJyYXk8c3RkOjpzdHJpbmc+KHVuaXF1ZSArIDEpOworICB9CisKKyAgc3RydWN0IEZpZWxkTmFtZXNSZXN1bHQgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nKiBhcnJheTsKKyAgICBpbnQgbG93ZXJjYXNlX2luZGV4OworICAgIGludCBjYW1lbGNhc2VfaW5kZXg7CisgICAgaW50IGpzb25faW5kZXg7CisgIH07CisgIEZpZWxkTmFtZXNSZXN1bHQgQWxsb2NhdGVGaWVsZE5hbWVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nKiBvcHRfanNvbl9uYW1lKSB7CisgICAgR09PR0xFX0NIRUNLKGhhc19hbGxvY2F0ZWQoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBmdWxsX25hbWUgPQorICAgICAgICBzY29wZS5lbXB0eSgpID8gbmFtZSA6IFN0ckNhdChzY29wZSwgIi4iLCBuYW1lKTsKKworICAgIC8vIEZhc3QgcGF0aCBmb3Igc25ha2VfY2FzZSBuYW1lcywgd2hpY2ggZm9sbG93IHRoZSBzdHlsZSBndWlkZS4KKyAgICBpZiAob3B0X2pzb25fbmFtZSA9PSBudWxscHRyKSB7CisgICAgICBzd2l0Y2ggKEdldEZpZWxkTmFtZUNhc2UobmFtZSkpIHsKKyAgICAgICAgY2FzZSBGaWVsZE5hbWVDYXNlOjprQWxsTG93ZXI6CisgICAgICAgICAgLy8gQ2FzZSAxOiB0aGV5IGFyZSBhbGwgdGhlIHNhbWUuCisgICAgICAgICAgcmV0dXJuIHtBbGxvY2F0ZVN0cmluZ3MobmFtZSwgc3RkOjptb3ZlKGZ1bGxfbmFtZSkpLCAwLCAwLCAwfTsKKyAgICAgICAgY2FzZSBGaWVsZE5hbWVDYXNlOjprU25ha2VDYXNlOgorICAgICAgICAgIC8vIENhc2UgMjogbmFtZT09bG93ZXIsIGNhbWVsPT1qc29uCisgICAgICAgICAgcmV0dXJuIHtBbGxvY2F0ZVN0cmluZ3MobmFtZSwgc3RkOjptb3ZlKGZ1bGxfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9DYW1lbENhc2UobmFtZSwgLyogbG93ZXJfZmlyc3QgPSAqLyB0cnVlKSksCisgICAgICAgICAgICAgICAgICAwLCAyLCAyfTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZXM7CisgICAgbmFtZXMucHVzaF9iYWNrKG5hbWUpOworICAgIG5hbWVzLnB1c2hfYmFjayhzdGQ6Om1vdmUoZnVsbF9uYW1lKSk7CisKKyAgICBjb25zdCBhdXRvIHB1c2hfbmFtZSA9IFsmXShzdGQ6OnN0cmluZyBuZXdfbmFtZSkgeworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICAvLyBEbyBub3QgY29tcGFyZSB0aGUgZnVsbF9uYW1lLiBJdCBpcyB1bmxpa2VseSB0byBtYXRjaCwgZXhjZXB0IGluCisgICAgICAgIC8vIGN1c3RvbSBqc29uX25hbWUuIFdlIGFyZSBub3QgdGFraW5nIHRoaXMgaW50byBhY2NvdW50IGluCisgICAgICAgIC8vIFBsYW5GaWVsZE5hbWVzIHNvIGJldHRlciB0byBub3QgdHJ5IGl0LgorICAgICAgICBpZiAoaSA9PSAxKSBjb250aW51ZTsKKyAgICAgICAgaWYgKG5hbWVzW2ldID09IG5ld19uYW1lKSByZXR1cm4gaTsKKyAgICAgIH0KKyAgICAgIG5hbWVzLnB1c2hfYmFjayhzdGQ6Om1vdmUobmV3X25hbWUpKTsKKyAgICAgIHJldHVybiBuYW1lcy5zaXplKCkgLSAxOworICAgIH07CisKKyAgICBGaWVsZE5hbWVzUmVzdWx0IHJlc3VsdHtudWxscHRyLCAwLCAwLCAwfTsKKworICAgIHN0ZDo6c3RyaW5nIGxvd2VyY2FzZV9uYW1lID0gbmFtZTsKKyAgICBMb3dlclN0cmluZygmbG93ZXJjYXNlX25hbWUpOworICAgIHJlc3VsdC5sb3dlcmNhc2VfaW5kZXggPSBwdXNoX25hbWUoc3RkOjptb3ZlKGxvd2VyY2FzZV9uYW1lKSk7CisgICAgcmVzdWx0LmNhbWVsY2FzZV9pbmRleCA9CisgICAgICAgIHB1c2hfbmFtZShUb0NhbWVsQ2FzZShuYW1lLCAvKiBsb3dlcl9maXJzdCA9ICovIHRydWUpKTsKKyAgICByZXN1bHQuanNvbl9pbmRleCA9CisgICAgICAgIHB1c2hfbmFtZShvcHRfanNvbl9uYW1lICE9IG51bGxwdHIgPyAqb3B0X2pzb25fbmFtZSA6IFRvSnNvbk5hbWUobmFtZSkpOworCisgICAgc3RkOjpzdHJpbmcqIGFsbF9uYW1lcyA9IEFsbG9jYXRlQXJyYXk8c3RkOjpzdHJpbmc+KG5hbWVzLnNpemUoKSk7CisgICAgcmVzdWx0LmFycmF5ID0gYWxsX25hbWVzOworICAgIHN0ZDo6bW92ZShuYW1lcy5iZWdpbigpLCBuYW1lcy5lbmQoKSwgYWxsX25hbWVzKTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2M+CisgIHZvaWQgRmluYWxpemVQbGFubmluZyhBbGxvYyYgYWxsb2MpIHsKKyAgICBHT09HTEVfQ0hFQ0soIWhhc19hbGxvY2F0ZWQoKSk7CisKKyAgICBwb2ludGVyc18gPSBhbGxvYy0+Q3JlYXRlRmxhdEFsbG9jKHRvdGFsXyktPlBvaW50ZXJzKCk7CisKKyAgICBHT09HTEVfQ0hFQ0soaGFzX2FsbG9jYXRlZCgpKTsKKyAgfQorCisgIHZvaWQgRXhwZWN0Q29uc3VtZWQoKSBjb25zdCB7CisgICAgLy8gV2UgdmVyaWZ5IHRoYXQgd2UgY29uc3VtZWQgYWxsIHRoZSBtZW1vcnkgcmVxdWVzdGVkIGlmIHRoZXJlIHdhcyBubworICAgIC8vIGVycm9yIGluIHByb2Nlc3NpbmcuCisgICAgRm9sZCh7RXhwZWN0Q29uc3VtZWQ8VD4oKS4uLn0pOworICB9CisKKyBwcml2YXRlOgorICBib29sIGhhc19hbGxvY2F0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIHBvaW50ZXJzXy50ZW1wbGF0ZSBHZXQ8Y2hhcj4oKSAhPSBudWxscHRyOworICB9CisKKyAgc3RhdGljIGJvb2wgSXNMb3dlcihjaGFyIGMpIHsgcmV0dXJuICdhJyA8PSBjICYmIGMgPD0gJ3onOyB9CisgIHN0YXRpYyBib29sIElzRGlnaXQoY2hhciBjKSB7IHJldHVybiAnMCcgPD0gYyAmJiBjIDw9ICc5JzsgfQorICBzdGF0aWMgYm9vbCBJc0xvd2VyT3JEaWdpdChjaGFyIGMpIHsgcmV0dXJuIElzTG93ZXIoYykgfHwgSXNEaWdpdChjKTsgfQorCisgIGVudW0gY2xhc3MgRmllbGROYW1lQ2FzZSB7IGtBbGxMb3dlciwga1NuYWtlQ2FzZSwga090aGVyIH07CisgIEZpZWxkTmFtZUNhc2UgR2V0RmllbGROYW1lQ2FzZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIGlmICghSXNMb3dlcihuYW1lWzBdKSkgcmV0dXJuIEZpZWxkTmFtZUNhc2U6OmtPdGhlcjsKKyAgICBGaWVsZE5hbWVDYXNlIGJlc3QgPSBGaWVsZE5hbWVDYXNlOjprQWxsTG93ZXI7CisgICAgZm9yIChjaGFyIGMgOiBuYW1lKSB7CisgICAgICBpZiAoSXNMb3dlck9yRGlnaXQoYykpIHsKKyAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgfSBlbHNlIGlmIChjID09ICdfJykgeworICAgICAgICBiZXN0ID0gRmllbGROYW1lQ2FzZTo6a1NuYWtlQ2FzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBGaWVsZE5hbWVDYXNlOjprT3RoZXI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBiZXN0OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIGJvb2wgRXhwZWN0Q29uc3VtZWQoKSBjb25zdCB7CisgICAgR09PR0xFX0NIRUNLX0VRKHRvdGFsXy50ZW1wbGF0ZSBHZXQ8VT4oKSwgdXNlZF8udGVtcGxhdGUgR2V0PFU+KCkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgVHlwZU1hcDxQb2ludGVyVCwgVC4uLj4gcG9pbnRlcnNfOworICBUeXBlTWFwPEludFQsIFQuLi4+IHRvdGFsXzsKKyAgVHlwZU1hcDxJbnRULCBULi4uPiB1c2VkXzsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBTeW1ib2wgeworIHB1YmxpYzoKKyAgZW51bSBUeXBlIHsKKyAgICBOVUxMX1NZTUJPTCwKKyAgICBNRVNTQUdFLAorICAgIEZJRUxELAorICAgIE9ORU9GLAorICAgIEVOVU0sCisgICAgRU5VTV9WQUxVRSwKKyAgICBFTlVNX1ZBTFVFX09USEVSX1BBUkVOVCwKKyAgICBTRVJWSUNFLAorICAgIE1FVEhPRCwKKyAgICBGVUxMX1BBQ0tBR0UsCisgICAgU1VCX1BBQ0tBR0UsCisgICAgUVVFUllfS0VZCisgIH07CisKKyAgU3ltYm9sKCkgeworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50ZXJuYWw6OlN5bWJvbEJhc2UgbnVsbF9zeW1ib2x7fTsKKyAgICBzdGF0aWNfYXNzZXJ0KG51bGxfc3ltYm9sLnN5bWJvbF90eXBlXyA9PSBOVUxMX1NZTUJPTCwgIiIpOworICAgIC8vIEluaXRpYWxpemUgd2l0aCBhIHNlbnRpbmVsIHRvIG1ha2Ugc3VyZSBgcHRyX2AgaXMgbmV2ZXIgbnVsbC4KKyAgICBwdHJfID0gJm51bGxfc3ltYm9sOworICB9CisKKyAgLy8gRXZlcnkgb2JqZWN0IHdlIHN0b3JlIGRlcml2ZXMgZnJvbSBpbnRlcm5hbDo6U3ltYm9sQmFzZSwgd2hlcmUgd2Ugc3RvcmUgdGhlCisgIC8vIHN5bWJvbCB0eXBlIGVudW0uCisgIC8vIFN0b3JpbmcgaW4gdGhlIG9iamVjdCBjYW4gYmUgZG9uZSB3aXRob3V0IHVzaW5nIG1vcmUgc3BhY2UgaW4gbW9zdCBjYXNlcywKKyAgLy8gd2hpbGUgc3RvcmluZyBpdCBpbiB0aGUgU3ltYm9sIHR5cGUgd291bGQgcmVxdWlyZSA4IGJ5dGVzLgorI2RlZmluZSBERUZJTkVfTUVNQkVSUyhUWVBFLCBUWVBFX0NPTlNUQU5ULCBGSUVMRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZXhwbGljaXQgU3ltYm9sKFRZUEUqIHZhbHVlKSA6IHB0cl8odmFsdWUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUtPnN5bWJvbF90eXBlXyA9IFRZUEVfQ09OU1RBTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgVFlQRSogRklFTEQoKSBjb25zdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHR5cGUoKSA9PSBUWVBFX0NPTlNUQU5UID8gc3RhdGljX2Nhc3Q8Y29uc3QgVFlQRSo+KHB0cl8pIDogbnVsbHB0cjsgXAorICB9CisKKyAgREVGSU5FX01FTUJFUlMoRGVzY3JpcHRvciwgTUVTU0FHRSwgZGVzY3JpcHRvcikKKyAgREVGSU5FX01FTUJFUlMoRmllbGREZXNjcmlwdG9yLCBGSUVMRCwgZmllbGRfZGVzY3JpcHRvcikKKyAgREVGSU5FX01FTUJFUlMoT25lb2ZEZXNjcmlwdG9yLCBPTkVPRiwgb25lb2ZfZGVzY3JpcHRvcikKKyAgREVGSU5FX01FTUJFUlMoRW51bURlc2NyaXB0b3IsIEVOVU0sIGVudW1fZGVzY3JpcHRvcikKKyAgREVGSU5FX01FTUJFUlMoU2VydmljZURlc2NyaXB0b3IsIFNFUlZJQ0UsIHNlcnZpY2VfZGVzY3JpcHRvcikKKyAgREVGSU5FX01FTUJFUlMoTWV0aG9kRGVzY3JpcHRvciwgTUVUSE9ELCBtZXRob2RfZGVzY3JpcHRvcikKKyAgREVGSU5FX01FTUJFUlMoRmlsZURlc2NyaXB0b3IsIEZVTExfUEFDS0FHRSwgZmlsZV9kZXNjcmlwdG9yKQorCisgIC8vIFdlIHVzZSBhIHNwZWNpYWwgbm9kZSBmb3Igc3VicGFja2FnZSBGaWxlRGVzY3JpcHRvci4KKyAgLy8gSXQgaXMgcG90ZW50aWFsbHkgYWRkZWQgdG8gdGhlIHRhYmxlIHdpdGggbXVsdGlwbGUgZGlmZmVyZW50IG5hbWVzLCBzbyB3ZQorICAvLyBuZWVkIGEgc2VwYXJhdGUgcGxhY2UgdG8gcHV0IHRoZSBuYW1lLgorICBzdHJ1Y3QgU3VicGFja2FnZSA6IGludGVybmFsOjpTeW1ib2xCYXNlIHsKKyAgICBpbnQgbmFtZV9zaXplOworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlOworICB9OworICBERUZJTkVfTUVNQkVSUyhTdWJwYWNrYWdlLCBTVUJfUEFDS0FHRSwgc3ViX3BhY2thZ2VfZmlsZV9kZXNjcmlwdG9yKQorCisgIC8vIEVudW0gdmFsdWVzIGhhdmUgdHdvIGRpZmZlcmVudCBwYXJlbnRzLgorICAvLyBXZSB1c2UgdHdvIGRpZmZlcmVudCBpZGVudGl0aWVkIGZvciB0aGUgc2FtZSBvYmplY3QgdG8gZGV0ZXJtaW5lIHRoZSB0d28KKyAgLy8gZGlmZmVyZW50IGluc2VydGlvbnMgaW4gdGhlIG1hcC4KKyAgc3RhdGljIFN5bWJvbCBFbnVtVmFsdWUoRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUsIGludCBuKSB7CisgICAgU3ltYm9sIHM7CisgICAgaW50ZXJuYWw6OlN5bWJvbEJhc2UqIHB0cjsKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICBwdHIgPSBzdGF0aWNfY2FzdDxpbnRlcm5hbDo6U3ltYm9sQmFzZU48MD4qPih2YWx1ZSk7CisgICAgICBwdHItPnN5bWJvbF90eXBlXyA9IEVOVU1fVkFMVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIHB0ciA9IHN0YXRpY19jYXN0PGludGVybmFsOjpTeW1ib2xCYXNlTjwxPio+KHZhbHVlKTsKKyAgICAgIHB0ci0+c3ltYm9sX3R5cGVfID0gRU5VTV9WQUxVRV9PVEhFUl9QQVJFTlQ7CisgICAgfQorICAgIHMucHRyXyA9IHB0cjsKKyAgICByZXR1cm4gczsKKyAgfQorCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWVfZGVzY3JpcHRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSgpID09IEVOVU1fVkFMVUUKKyAgICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8Y29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcio+KAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgaW50ZXJuYWw6OlN5bWJvbEJhc2VOPDA+Kj4ocHRyXykpCisgICAgICAgICAgIDogdHlwZSgpID09IEVOVU1fVkFMVUVfT1RIRVJfUEFSRU5UCisgICAgICAgICAgICAgICA/IHN0YXRpY19jYXN0PGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqPigKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGludGVybmFsOjpTeW1ib2xCYXNlTjwxPio+KHB0cl8pKQorICAgICAgICAgICAgICAgOiBudWxscHRyOworICB9CisKKyAgLy8gTm90IGEgcmVhbCBzeW1ib2wuCisgIC8vIE9ubHkgdXNlZCBmb3IgaGV0ZXJvZ2VuZW91cyBsb29rdXBzIGFuZCBuZXZlciBhY3R1YWxseSBpbnNlcnRlZCBpbiB0aGUKKyAgLy8gdGFibGVzLgorICAvLyBUT0RPKGIvMjE1NTU3NjU4KTogSWYgd2UgdGVtcGxldGl6ZSBRdWVyeUtleSBvbiB0aGUgZXhwZWN0ZWQgb2JqZWN0IHR5cGUgd2UKKyAgLy8gY2FuIHNraXAgdGhlIHN3aXRjaGVzIGZvciB0aGUgZXEgZnVuY3Rpb24gYWx0b2dldGhlci4KKyAgc3RydWN0IFF1ZXJ5S2V5IDogaW50ZXJuYWw6OlN5bWJvbEJhc2UgeworICAgIFN0cmluZ1BpZWNlIG5hbWU7CisgICAgY29uc3Qgdm9pZCogcGFyZW50OworICAgIGludCBmaWVsZF9udW1iZXI7CisKKyAgICAvLyBBZGFwdG9yIGZ1bmN0aW9ucyB0byBsb29rIGxpa2UgYSBTeW1ib2wgdG8gdGhlIGNvbXBhcmF0b3JzLgorICAgIFN0cmluZ1BpZWNlIGZ1bGxfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWU7IH0KKyAgICBzdGQ6OnBhaXI8Y29uc3Qgdm9pZCosIGludD4gcGFyZW50X251bWJlcl9rZXkoKSBjb25zdCB7CisgICAgICByZXR1cm4ge3BhcmVudCwgZmllbGRfbnVtYmVyfTsKKyAgICB9CisgICAgc3RkOjpwYWlyPGNvbnN0IHZvaWQqLCBTdHJpbmdQaWVjZT4gcGFyZW50X25hbWVfa2V5KCkgY29uc3QgeworICAgICAgcmV0dXJuIHtwYXJlbnQsIG5hbWV9OworICAgIH0KKyAgfTsKKyAgLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyBpbXBsaWNpdCB0byBhbGxvdyBmb3Igbm9uLXRyYW5zcGFyZW50IGxvb2t1cHMgd2hlbgorICAvLyBuZWNlc3NhcnkuCisgIC8vIEZvciB0cmFuc3BhcmVudCBsb29rdXAgY2FzZXMgd2UgcXVlcnkgZGlyZWN0bHkgd2l0aCB0aGUgb2JqZWN0IHdpdGhvdXQgdGhlCisgIC8vIHR5cGUgZXJhc3VyZSBsYXllci4KKyAgU3ltYm9sKFF1ZXJ5S2V5JiB2YWx1ZSkgOiBwdHJfKCZ2YWx1ZSkgeyAgLy8gTk9MSU5UCisgICAgdmFsdWUuc3ltYm9sX3R5cGVfID0gUVVFUllfS0VZOworICB9CisgIGNvbnN0IFF1ZXJ5S2V5KiBxdWVyeV9rZXkoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUoKSA9PSBRVUVSWV9LRVkgPyBzdGF0aWNfY2FzdDxjb25zdCBRdWVyeUtleSo+KHB0cl8pIDogbnVsbHB0cjsKKyAgfQorI3VuZGVmIERFRklORV9NRU1CRVJTCisKKyAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZT4ocHRyXy0+c3ltYm9sX3R5cGVfKTsgfQorICBib29sIElzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBOVUxMX1NZTUJPTDsgfQorICBib29sIElzVHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBNRVNTQUdFIHx8IHR5cGUoKSA9PSBFTlVNOyB9CisgIGJvb2wgSXNBZ2dyZWdhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIElzVHlwZSgpIHx8IElzUGFja2FnZSgpIHx8IHR5cGUoKSA9PSBTRVJWSUNFOworICB9CisgIGJvb2wgSXNQYWNrYWdlKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlKCkgPT0gRlVMTF9QQUNLQUdFIHx8IHR5cGUoKSA9PSBTVUJfUEFDS0FHRTsKKyAgfQorCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBHZXRGaWxlKCkgY29uc3QgeworICAgIHN3aXRjaCAodHlwZSgpKSB7CisgICAgICBjYXNlIE1FU1NBR0U6CisgICAgICAgIHJldHVybiBkZXNjcmlwdG9yKCktPmZpbGUoKTsKKyAgICAgIGNhc2UgRklFTEQ6CisgICAgICAgIHJldHVybiBmaWVsZF9kZXNjcmlwdG9yKCktPmZpbGUoKTsKKyAgICAgIGNhc2UgT05FT0Y6CisgICAgICAgIHJldHVybiBvbmVvZl9kZXNjcmlwdG9yKCktPmNvbnRhaW5pbmdfdHlwZSgpLT5maWxlKCk7CisgICAgICBjYXNlIEVOVU06CisgICAgICAgIHJldHVybiBlbnVtX2Rlc2NyaXB0b3IoKS0+ZmlsZSgpOworICAgICAgY2FzZSBFTlVNX1ZBTFVFOgorICAgICAgICByZXR1cm4gZW51bV92YWx1ZV9kZXNjcmlwdG9yKCktPnR5cGUoKS0+ZmlsZSgpOworICAgICAgY2FzZSBTRVJWSUNFOgorICAgICAgICByZXR1cm4gc2VydmljZV9kZXNjcmlwdG9yKCktPmZpbGUoKTsKKyAgICAgIGNhc2UgTUVUSE9EOgorICAgICAgICByZXR1cm4gbWV0aG9kX2Rlc2NyaXB0b3IoKS0+c2VydmljZSgpLT5maWxlKCk7CisgICAgICBjYXNlIEZVTExfUEFDS0FHRToKKyAgICAgICAgcmV0dXJuIGZpbGVfZGVzY3JpcHRvcigpOworICAgICAgY2FzZSBTVUJfUEFDS0FHRToKKyAgICAgICAgcmV0dXJuIHN1Yl9wYWNrYWdlX2ZpbGVfZGVzY3JpcHRvcigpLT5maWxlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICB9CisKKyAgU3RyaW5nUGllY2UgZnVsbF9uYW1lKCkgY29uc3QgeworICAgIHN3aXRjaCAodHlwZSgpKSB7CisgICAgICBjYXNlIE1FU1NBR0U6CisgICAgICAgIHJldHVybiBkZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpOworICAgICAgY2FzZSBGSUVMRDoKKyAgICAgICAgcmV0dXJuIGZpZWxkX2Rlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCk7CisgICAgICBjYXNlIE9ORU9GOgorICAgICAgICByZXR1cm4gb25lb2ZfZGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKTsKKyAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgcmV0dXJuIGVudW1fZGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKTsKKyAgICAgIGNhc2UgRU5VTV9WQUxVRToKKyAgICAgICAgcmV0dXJuIGVudW1fdmFsdWVfZGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKTsKKyAgICAgIGNhc2UgU0VSVklDRToKKyAgICAgICAgcmV0dXJuIHNlcnZpY2VfZGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKTsKKyAgICAgIGNhc2UgTUVUSE9EOgorICAgICAgICByZXR1cm4gbWV0aG9kX2Rlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCk7CisgICAgICBjYXNlIEZVTExfUEFDS0FHRToKKyAgICAgICAgcmV0dXJuIGZpbGVfZGVzY3JpcHRvcigpLT5wYWNrYWdlKCk7CisgICAgICBjYXNlIFNVQl9QQUNLQUdFOgorICAgICAgICByZXR1cm4gU3RyaW5nUGllY2Uoc3ViX3BhY2thZ2VfZmlsZV9kZXNjcmlwdG9yKCktPmZpbGUtPnBhY2thZ2UoKSkKKyAgICAgICAgICAgIC5zdWJzdHIoMCwgc3ViX3BhY2thZ2VfZmlsZV9kZXNjcmlwdG9yKCktPm5hbWVfc2l6ZSk7CisgICAgICBjYXNlIFFVRVJZX0tFWToKKyAgICAgICAgcmV0dXJuIHF1ZXJ5X2tleSgpLT5mdWxsX25hbWUoKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdPT0dMRV9DSEVDSyhmYWxzZSk7CisgICAgfQorICAgIHJldHVybiAiIjsKKyAgfQorCisgIHN0ZDo6cGFpcjxjb25zdCB2b2lkKiwgU3RyaW5nUGllY2U+IHBhcmVudF9uYW1lX2tleSgpIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvIG9yX2ZpbGUgPSBbJl0oY29uc3Qgdm9pZCogcCkgeyByZXR1cm4gcCA/IHAgOiBHZXRGaWxlKCk7IH07CisgICAgc3dpdGNoICh0eXBlKCkpIHsKKyAgICAgIGNhc2UgTUVTU0FHRToKKyAgICAgICAgcmV0dXJuIHtvcl9maWxlKGRlc2NyaXB0b3IoKS0+Y29udGFpbmluZ190eXBlKCkpLCBkZXNjcmlwdG9yKCktPm5hbWUoKX07CisgICAgICBjYXNlIEZJRUxEOiB7CisgICAgICAgIGF1dG8qIGZpZWxkID0gZmllbGRfZGVzY3JpcHRvcigpOworICAgICAgICByZXR1cm4ge29yX2ZpbGUoZmllbGQtPmlzX2V4dGVuc2lvbigpID8gZmllbGQtPmV4dGVuc2lvbl9zY29wZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWVsZC0+Y29udGFpbmluZ190eXBlKCkpLAorICAgICAgICAgICAgICAgIGZpZWxkLT5uYW1lKCl9OworICAgICAgfQorICAgICAgY2FzZSBPTkVPRjoKKyAgICAgICAgcmV0dXJuIHtvbmVvZl9kZXNjcmlwdG9yKCktPmNvbnRhaW5pbmdfdHlwZSgpLAorICAgICAgICAgICAgICAgIG9uZW9mX2Rlc2NyaXB0b3IoKS0+bmFtZSgpfTsKKyAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgcmV0dXJuIHtvcl9maWxlKGVudW1fZGVzY3JpcHRvcigpLT5jb250YWluaW5nX3R5cGUoKSksCisgICAgICAgICAgICAgICAgZW51bV9kZXNjcmlwdG9yKCktPm5hbWUoKX07CisgICAgICBjYXNlIEVOVU1fVkFMVUU6CisgICAgICAgIHJldHVybiB7b3JfZmlsZShlbnVtX3ZhbHVlX2Rlc2NyaXB0b3IoKS0+dHlwZSgpLT5jb250YWluaW5nX3R5cGUoKSksCisgICAgICAgICAgICAgICAgZW51bV92YWx1ZV9kZXNjcmlwdG9yKCktPm5hbWUoKX07CisgICAgICBjYXNlIEVOVU1fVkFMVUVfT1RIRVJfUEFSRU5UOgorICAgICAgICByZXR1cm4ge2VudW1fdmFsdWVfZGVzY3JpcHRvcigpLT50eXBlKCksCisgICAgICAgICAgICAgICAgZW51bV92YWx1ZV9kZXNjcmlwdG9yKCktPm5hbWUoKX07CisgICAgICBjYXNlIFNFUlZJQ0U6CisgICAgICAgIHJldHVybiB7R2V0RmlsZSgpLCBzZXJ2aWNlX2Rlc2NyaXB0b3IoKS0+bmFtZSgpfTsKKyAgICAgIGNhc2UgTUVUSE9EOgorICAgICAgICByZXR1cm4ge21ldGhvZF9kZXNjcmlwdG9yKCktPnNlcnZpY2UoKSwgbWV0aG9kX2Rlc2NyaXB0b3IoKS0+bmFtZSgpfTsKKyAgICAgIGNhc2UgUVVFUllfS0VZOgorICAgICAgICByZXR1cm4gcXVlcnlfa2V5KCktPnBhcmVudF9uYW1lX2tleSgpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR09PR0xFX0NIRUNLKGZhbHNlKTsKKyAgICB9CisgICAgcmV0dXJuIHt9OworICB9CisKKyAgc3RkOjpwYWlyPGNvbnN0IHZvaWQqLCBpbnQ+IHBhcmVudF9udW1iZXJfa2V5KCkgY29uc3QgeworICAgIHN3aXRjaCAodHlwZSgpKSB7CisgICAgICBjYXNlIEZJRUxEOgorICAgICAgICByZXR1cm4ge2ZpZWxkX2Rlc2NyaXB0b3IoKS0+Y29udGFpbmluZ190eXBlKCksCisgICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvcigpLT5udW1iZXIoKX07CisgICAgICBjYXNlIEVOVU1fVkFMVUU6CisgICAgICAgIHJldHVybiB7ZW51bV92YWx1ZV9kZXNjcmlwdG9yKCktPnR5cGUoKSwKKyAgICAgICAgICAgICAgICBlbnVtX3ZhbHVlX2Rlc2NyaXB0b3IoKS0+bnVtYmVyKCl9OworICAgICAgY2FzZSBRVUVSWV9LRVk6CisgICAgICAgIHJldHVybiBxdWVyeV9rZXkoKS0+cGFyZW50X251bWJlcl9rZXkoKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdPT0dMRV9DSEVDSyhmYWxzZSk7CisgICAgfQorICAgIHJldHVybiB7fTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgaW50ZXJuYWw6OlN5bWJvbEJhc2UqIHB0cl87Cit9OworCitjb25zdCBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUKKyAgICBGaWVsZERlc2NyaXB0b3I6OmtUeXBlVG9DcHBUeXBlTWFwW01BWF9UWVBFICsgMV0gPSB7CisgICAgICAgIHN0YXRpY19jYXN0PENwcFR5cGU+KDApLCAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzCisKKyAgICAgICAgQ1BQVFlQRV9ET1VCTEUsICAgLy8gVFlQRV9ET1VCTEUKKyAgICAgICAgQ1BQVFlQRV9GTE9BVCwgICAgLy8gVFlQRV9GTE9BVAorICAgICAgICBDUFBUWVBFX0lOVDY0LCAgICAvLyBUWVBFX0lOVDY0CisgICAgICAgIENQUFRZUEVfVUlOVDY0LCAgIC8vIFRZUEVfVUlOVDY0CisgICAgICAgIENQUFRZUEVfSU5UMzIsICAgIC8vIFRZUEVfSU5UMzIKKyAgICAgICAgQ1BQVFlQRV9VSU5UNjQsICAgLy8gVFlQRV9GSVhFRDY0CisgICAgICAgIENQUFRZUEVfVUlOVDMyLCAgIC8vIFRZUEVfRklYRUQzMgorICAgICAgICBDUFBUWVBFX0JPT0wsICAgICAvLyBUWVBFX0JPT0wKKyAgICAgICAgQ1BQVFlQRV9TVFJJTkcsICAgLy8gVFlQRV9TVFJJTkcKKyAgICAgICAgQ1BQVFlQRV9NRVNTQUdFLCAgLy8gVFlQRV9HUk9VUAorICAgICAgICBDUFBUWVBFX01FU1NBR0UsICAvLyBUWVBFX01FU1NBR0UKKyAgICAgICAgQ1BQVFlQRV9TVFJJTkcsICAgLy8gVFlQRV9CWVRFUworICAgICAgICBDUFBUWVBFX1VJTlQzMiwgICAvLyBUWVBFX1VJTlQzMgorICAgICAgICBDUFBUWVBFX0VOVU0sICAgICAvLyBUWVBFX0VOVU0KKyAgICAgICAgQ1BQVFlQRV9JTlQzMiwgICAgLy8gVFlQRV9TRklYRUQzMgorICAgICAgICBDUFBUWVBFX0lOVDY0LCAgICAvLyBUWVBFX1NGSVhFRDY0CisgICAgICAgIENQUFRZUEVfSU5UMzIsICAgIC8vIFRZUEVfU0lOVDMyCisgICAgICAgIENQUFRZUEVfSU5UNjQsICAgIC8vIFRZUEVfU0lOVDY0Cit9OworCitjb25zdCBjaGFyKiBjb25zdCBGaWVsZERlc2NyaXB0b3I6OmtUeXBlVG9OYW1lW01BWF9UWVBFICsgMV0gPSB7CisgICAgIkVSUk9SIiwgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycworCisgICAgImRvdWJsZSIsICAgIC8vIFRZUEVfRE9VQkxFCisgICAgImZsb2F0IiwgICAgIC8vIFRZUEVfRkxPQVQKKyAgICAiaW50NjQiLCAgICAgLy8gVFlQRV9JTlQ2NAorICAgICJ1aW50NjQiLCAgICAvLyBUWVBFX1VJTlQ2NAorICAgICJpbnQzMiIsICAgICAvLyBUWVBFX0lOVDMyCisgICAgImZpeGVkNjQiLCAgIC8vIFRZUEVfRklYRUQ2NAorICAgICJmaXhlZDMyIiwgICAvLyBUWVBFX0ZJWEVEMzIKKyAgICAiYm9vbCIsICAgICAgLy8gVFlQRV9CT09MCisgICAgInN0cmluZyIsICAgIC8vIFRZUEVfU1RSSU5HCisgICAgImdyb3VwIiwgICAgIC8vIFRZUEVfR1JPVVAKKyAgICAibWVzc2FnZSIsICAgLy8gVFlQRV9NRVNTQUdFCisgICAgImJ5dGVzIiwgICAgIC8vIFRZUEVfQllURVMKKyAgICAidWludDMyIiwgICAgLy8gVFlQRV9VSU5UMzIKKyAgICAiZW51bSIsICAgICAgLy8gVFlQRV9FTlVNCisgICAgInNmaXhlZDMyIiwgIC8vIFRZUEVfU0ZJWEVEMzIKKyAgICAic2ZpeGVkNjQiLCAgLy8gVFlQRV9TRklYRUQ2NAorICAgICJzaW50MzIiLCAgICAvLyBUWVBFX1NJTlQzMgorICAgICJzaW50NjQiLCAgICAvLyBUWVBFX1NJTlQ2NAorfTsKKworY29uc3QgY2hhciogY29uc3QgRmllbGREZXNjcmlwdG9yOjprQ3BwVHlwZVRvTmFtZVtNQVhfQ1BQVFlQRSArIDFdID0geworICAgICJFUlJPUiIsICAvLyAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMKKworICAgICJpbnQzMiIsICAgIC8vIENQUFRZUEVfSU5UMzIKKyAgICAiaW50NjQiLCAgICAvLyBDUFBUWVBFX0lOVDY0CisgICAgInVpbnQzMiIsICAgLy8gQ1BQVFlQRV9VSU5UMzIKKyAgICAidWludDY0IiwgICAvLyBDUFBUWVBFX1VJTlQ2NAorICAgICJkb3VibGUiLCAgIC8vIENQUFRZUEVfRE9VQkxFCisgICAgImZsb2F0IiwgICAgLy8gQ1BQVFlQRV9GTE9BVAorICAgICJib29sIiwgICAgIC8vIENQUFRZUEVfQk9PTAorICAgICJlbnVtIiwgICAgIC8vIENQUFRZUEVfRU5VTQorICAgICJzdHJpbmciLCAgIC8vIENQUFRZUEVfU1RSSU5HCisgICAgIm1lc3NhZ2UiLCAgLy8gQ1BQVFlQRV9NRVNTQUdFCit9OworCitjb25zdCBjaGFyKiBjb25zdCBGaWVsZERlc2NyaXB0b3I6OmtMYWJlbFRvTmFtZVtNQVhfTEFCRUwgKyAxXSA9IHsKKyAgICAiRVJST1IiLCAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzCisKKyAgICAib3B0aW9uYWwiLCAgLy8gTEFCRUxfT1BUSU9OQUwKKyAgICAicmVxdWlyZWQiLCAgLy8gTEFCRUxfUkVRVUlSRUQKKyAgICAicmVwZWF0ZWQiLCAgLy8gTEFCRUxfUkVQRUFURUQKK307CisKK2NvbnN0IGNoYXIqIEZpbGVEZXNjcmlwdG9yOjpTeW50YXhOYW1lKEZpbGVEZXNjcmlwdG9yOjpTeW50YXggc3ludGF4KSB7CisgIHN3aXRjaCAoc3ludGF4KSB7CisgICAgY2FzZSBTWU5UQVhfUFJPVE8yOgorICAgICAgcmV0dXJuICJwcm90bzIiOworICAgIGNhc2UgU1lOVEFYX1BST1RPMzoKKyAgICAgIHJldHVybiAicHJvdG8zIjsKKyAgICBjYXNlIFNZTlRBWF9VTktOT1dOOgorICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgfQorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiY2FuJ3QgcmVhY2ggaGVyZS4iOworICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtOb25MaW5rZWRXZWFrTWVzc2FnZVJlcGxhY2VtZW50TmFtZSA9ICJnb29nbGUucHJvdG9idWYuRW1wdHkiOworCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IChfTVNDX1ZFUiA+PSAxOTAwICYmIF9NU0NfVkVSIDwgMTkxMikKK2NvbnN0IGludCBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXI7Citjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yOjprRmlyc3RSZXNlcnZlZE51bWJlcjsKK2NvbnN0IGludCBGaWVsZERlc2NyaXB0b3I6OmtMYXN0UmVzZXJ2ZWROdW1iZXI7CisjZW5kaWYKKworbmFtZXNwYWNlIHsKKworc3RkOjpzdHJpbmcgRW51bVZhbHVlVG9QYXNjYWxDYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCkgeworICBib29sIG5leHRfdXBwZXIgPSB0cnVlOworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5yZXNlcnZlKGlucHV0LnNpemUoKSk7CisKKyAgZm9yIChjaGFyIGNoYXJhY3RlciA6IGlucHV0KSB7CisgICAgaWYgKGNoYXJhY3RlciA9PSAnXycpIHsKKyAgICAgIG5leHRfdXBwZXIgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobmV4dF91cHBlcikgeworICAgICAgICByZXN1bHQucHVzaF9iYWNrKFRvVXBwZXIoY2hhcmFjdGVyKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQucHVzaF9iYWNrKFRvTG93ZXIoY2hhcmFjdGVyKSk7CisgICAgICB9CisgICAgICBuZXh0X3VwcGVyID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gQ2xhc3MgdG8gcmVtb3ZlIGFuIGVudW0gcHJlZml4IGZyb20gZW51bSB2YWx1ZXMuCitjbGFzcyBQcmVmaXhSZW1vdmVyIHsKKyBwdWJsaWM6CisgIFByZWZpeFJlbW92ZXIoU3RyaW5nUGllY2UgcHJlZml4KSB7CisgICAgLy8gU3RyaXAgdW5kZXJzY29yZXMgYW5kIGxvd2VyLWNhc2UgdGhlIHByZWZpeC4KKyAgICBmb3IgKGNoYXIgY2hhcmFjdGVyIDogcHJlZml4KSB7CisgICAgICBpZiAoY2hhcmFjdGVyICE9ICdfJykgeworICAgICAgICBwcmVmaXhfICs9IGFzY2lpX3RvbG93ZXIoY2hhcmFjdGVyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBUcmllcyB0byByZW1vdmUgdGhlIGVudW0gcHJlZml4IGZyb20gdGhpcyBlbnVtIHZhbHVlLgorICAvLyBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgcmV0dXJucyB0aGUgaW5wdXQgdmVyYmF0aW0uCisgIHN0ZDo6c3RyaW5nIE1heWJlUmVtb3ZlKFN0cmluZ1BpZWNlIHN0cikgeworICAgIC8vIFdlIGNhbid0IGp1c3QgbG93ZXJjYXNlIGFuZCBzdHJpcCBzdHIgYW5kIGxvb2sgZm9yIGEgcHJlZml4LgorICAgIC8vIFdlIG5lZWQgdG8gcHJvcGVybHkgcmVjb2duaXplIHRoZSBkaWZmZXJlbmNlIGJldHdlZW46CisgICAgLy8KKyAgICAvLyAgIGVudW0gRm9vIHsKKyAgICAvLyAgICAgRk9PX0JBUl9CQVogPSAwOworICAgIC8vICAgICBGT09fQkFSQkFaID0gMTsKKyAgICAvLyAgIH0KKyAgICAvLworICAgIC8vIFRoaXMgaXMgYWNjZXB0YWJsZSAodGhvdWdoIHBlcmhhcHMgbm90IGFkdmlzYWJsZSkgYmVjYXVzZSBldmVuIHdoZW4KKyAgICAvLyB3ZSBQYXNjYWxDYXNlLCB0aGVzZSB0d28gd2lsbCBzdGlsbCBiZSBkaXN0aW5jdCAoQmFyQmF6IHZzLiBCYXJiYXopLgorICAgIHNpemVfdCBpLCBqOworCisgICAgLy8gU2tpcCBwYXN0IHByZWZpeF8gaW4gc3RyIGlmIHdlIGNhbi4KKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHN0ci5zaXplKCkgJiYgaiA8IHByZWZpeF8uc2l6ZSgpOyBpKyspIHsKKyAgICAgIGlmIChzdHJbaV0gPT0gJ18nKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoYXNjaWlfdG9sb3dlcihzdHJbaV0pICE9IHByZWZpeF9baisrXSkgeworICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoc3RyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB3ZSBkaWRuJ3QgbWFrZSBpdCB0aHJvdWdoIHRoZSBwcmVmaXgsIHdlJ3ZlIGZhaWxlZCB0byBzdHJpcCB0aGUKKyAgICAvLyBwcmVmaXguCisgICAgaWYgKGogPCBwcmVmaXhfLnNpemUoKSkgeworICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHN0cik7CisgICAgfQorCisgICAgLy8gU2tpcCB1bmRlcnNjb3JlcyBiZXR3ZWVuIHByZWZpeCBhbmQgZnVydGhlciBjaGFyYWN0ZXJzLgorICAgIHdoaWxlIChpIDwgc3RyLnNpemUoKSAmJiBzdHJbaV0gPT0gJ18nKSB7CisgICAgICBpKys7CisgICAgfQorCisgICAgLy8gRW51bSBsYWJlbCBjYW4ndCBiZSB0aGUgZW1wdHkgc3RyaW5nLgorICAgIGlmIChpID09IHN0ci5zaXplKCkpIHsKKyAgICAgIHJldHVybiBzdGQ6OnN0cmluZyhzdHIpOworICAgIH0KKworICAgIC8vIFdlIHN1Y2Nlc3NmdWxseSBzdHJpcHBlZCB0aGUgcHJlZml4LgorICAgIHN0ci5yZW1vdmVfcHJlZml4KGkpOworICAgIHJldHVybiBzdGQ6OnN0cmluZyhzdHIpOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBwcmVmaXhfOworfTsKKworLy8gQSBEZXNjcmlwdG9yUG9vbCBjb250YWlucyBhIGJ1bmNoIG9mIGhhc2gtbWFwcyB0byBpbXBsZW1lbnQgdGhlCisvLyB2YXJpb3VzIEZpbmQqQnkqKCkgbWV0aG9kcy4gIFNpbmNlIGhhc2h0YWJsZSBsb29rdXBzIGFyZSBPKDEpLCBpdCdzCisvLyBtb3N0IGVmZmljaWVudCB0byBjb25zdHJ1Y3QgYSBmaXhlZCBzZXQgb2YgbGFyZ2UgaGFzaC1tYXBzIHVzZWQgYnkKKy8vIGFsbCBvYmplY3RzIGluIHRoZSBwb29sIHJhdGhlciB0aGFuIGNvbnN0cnVjdCBvbmUgb3IgbW9yZSBzbWFsbAorLy8gaGFzaC1tYXBzIGZvciBlYWNoIG9iamVjdC4KKy8vCisvLyBUaGUga2V5cyB0byB0aGVzZSBoYXNoLW1hcHMgYXJlIChwYXJlbnQsIG5hbWUpIG9yIChwYXJlbnQsIG51bWJlcikgcGFpcnMuCisKK3R5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IHZvaWQqLCBTdHJpbmdQaWVjZT4gUG9pbnRlclN0cmluZ1BhaXI7CisKK3R5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IERlc2NyaXB0b3IqLCBpbnQ+IERlc2NyaXB0b3JJbnRQYWlyOworCisjZGVmaW5lIEhBU0hfTUFQIHN0ZDo6dW5vcmRlcmVkX21hcAorI2RlZmluZSBIQVNIX1NFVCBzdGQ6OnVub3JkZXJlZF9zZXQKKyNkZWZpbmUgSEFTSF9GWE4gaGFzaAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFpclR5cGU+CitzdHJ1Y3QgUG9pbnRlckludGVnZXJQYWlySGFzaCB7CisgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IFBhaXJUeXBlJiBwKSBjb25zdCB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBwcmltZTEgPSAxNjc3NzQ5OTsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IHByaW1lMiA9IDE2Nzc3NjE5OworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHNpemVfdD4ocC5maXJzdCkgKiBwcmltZTEgXgorICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KHAuc2Vjb25kKSAqIHByaW1lMjsKKyAgfQorCisjaWZkZWYgX01TQ19WRVIKKyAgLy8gVXNlZCBvbmx5IGJ5IE1TVkMgYW5kIHBsYXRmb3JtcyB3aGVyZSBoYXNoX21hcCBpcyBub3QgYXZhaWxhYmxlLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGJ1Y2tldF9zaXplID0gNDsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBtaW5fYnVja2V0cyA9IDg7CisjZW5kaWYKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBQYWlyVHlwZSYgYSwgY29uc3QgUGFpclR5cGUmIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gYSA8IGI7CisgIH0KK307CisKK3N0cnVjdCBQb2ludGVyU3RyaW5nUGFpckhhc2ggeworICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBQb2ludGVyU3RyaW5nUGFpciYgcCkgY29uc3QgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgcHJpbWUgPSAxNjc3NzYxOTsKKyAgICBoYXNoPFN0cmluZ1BpZWNlPiBzdHJpbmdfaGFzaDsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KHAuZmlyc3QpICogcHJpbWUgXgorICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KHN0cmluZ19oYXNoKHAuc2Vjb25kKSk7CisgIH0KKworI2lmZGVmIF9NU0NfVkVSCisgIC8vIFVzZWQgb25seSBieSBNU1ZDIGFuZCBwbGF0Zm9ybXMgd2hlcmUgaGFzaF9tYXAgaXMgbm90IGF2YWlsYWJsZS4KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBidWNrZXRfc2l6ZSA9IDQ7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgbWluX2J1Y2tldHMgPSA4OworI2VuZGlmCisgIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgUG9pbnRlclN0cmluZ1BhaXImIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9pbnRlclN0cmluZ1BhaXImIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gYSA8IGI7CisgIH0KK307CisKKworc3RydWN0IFN5bWJvbEJ5RnVsbE5hbWVIYXNoIHsKKyAgdXNpbmcgaXNfdHJhbnNwYXJlbnQgPSB2b2lkOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBUJiBzKSBjb25zdCB7CisgICAgcmV0dXJuIEhBU0hfRlhOPFN0cmluZ1BpZWNlPnt9KHMuZnVsbF9uYW1lKCkpOworICB9Cit9Oworc3RydWN0IFN5bWJvbEJ5RnVsbE5hbWVFcSB7CisgIHVzaW5nIGlzX3RyYW5zcGFyZW50ID0gdm9pZDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQmIGEsIGNvbnN0IFUmIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gYS5mdWxsX25hbWUoKSA9PSBiLmZ1bGxfbmFtZSgpOworICB9Cit9OwordXNpbmcgU3ltYm9sc0J5TmFtZVNldCA9CisgICAgSEFTSF9TRVQ8U3ltYm9sLCBTeW1ib2xCeUZ1bGxOYW1lSGFzaCwgU3ltYm9sQnlGdWxsTmFtZUVxPjsKKworc3RydWN0IFN5bWJvbEJ5UGFyZW50SGFzaCB7CisgIHVzaW5nIGlzX3RyYW5zcGFyZW50ID0gdm9pZDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgVCYgcykgY29uc3QgeworICAgIHJldHVybiBQb2ludGVyU3RyaW5nUGFpckhhc2h7fShzLnBhcmVudF9uYW1lX2tleSgpKTsKKyAgfQorfTsKK3N0cnVjdCBTeW1ib2xCeVBhcmVudEVxIHsKKyAgdXNpbmcgaXNfdHJhbnNwYXJlbnQgPSB2b2lkOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCYgYSwgY29uc3QgVSYgYikgY29uc3QgeworICAgIHJldHVybiBhLnBhcmVudF9uYW1lX2tleSgpID09IGIucGFyZW50X25hbWVfa2V5KCk7CisgIH0KK307Cit1c2luZyBTeW1ib2xzQnlQYXJlbnRTZXQgPQorICAgIEhBU0hfU0VUPFN5bWJvbCwgU3ltYm9sQnlQYXJlbnRIYXNoLCBTeW1ib2xCeVBhcmVudEVxPjsKKwordHlwZWRlZiBIQVNIX01BUDxTdHJpbmdQaWVjZSwgY29uc3QgRmlsZURlc2NyaXB0b3IqLAorICAgICAgICAgICAgICAgICBIQVNIX0ZYTjxTdHJpbmdQaWVjZT4+CisgICAgRmlsZXNCeU5hbWVNYXA7CisKK3R5cGVkZWYgSEFTSF9NQVA8UG9pbnRlclN0cmluZ1BhaXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciosCisgICAgICAgICAgICAgICAgIFBvaW50ZXJTdHJpbmdQYWlySGFzaD4KKyAgICBGaWVsZHNCeU5hbWVNYXA7CisKK3N0cnVjdCBGaWVsZHNCeU51bWJlckhhc2ggeworICB1c2luZyBpc190cmFuc3BhcmVudCA9IHZvaWQ7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IFQmIHMpIGNvbnN0IHsKKyAgICByZXR1cm4gUG9pbnRlckludGVnZXJQYWlySGFzaDxzdGQ6OnBhaXI8Y29uc3Qgdm9pZCosIGludD4+e30oCisgICAgICAgIHMucGFyZW50X251bWJlcl9rZXkoKSk7CisgIH0KK307CitzdHJ1Y3QgRmllbGRzQnlOdW1iZXJFcSB7CisgIHVzaW5nIGlzX3RyYW5zcGFyZW50ID0gdm9pZDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQmIGEsIGNvbnN0IFUmIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gYS5wYXJlbnRfbnVtYmVyX2tleSgpID09IGIucGFyZW50X251bWJlcl9rZXkoKTsKKyAgfQorfTsKK3VzaW5nIEZpZWxkc0J5TnVtYmVyU2V0ID0KKyAgICBIQVNIX1NFVDxTeW1ib2wsIEZpZWxkc0J5TnVtYmVySGFzaCwgRmllbGRzQnlOdW1iZXJFcT47Cit1c2luZyBFbnVtVmFsdWVzQnlOdW1iZXJTZXQgPSBGaWVsZHNCeU51bWJlclNldDsKKworLy8gVGhpcyBpcyBhIG1hcCByYXRoZXIgdGhhbiBhIGhhc2gtbWFwLCBzaW5jZSB3ZSB1c2UgaXQgdG8gaXRlcmF0ZQorLy8gdGhyb3VnaCBhbGwgdGhlIGV4dGVuc2lvbnMgdGhhdCBleHRlbmQgYSBnaXZlbiBEZXNjcmlwdG9yLCBhbmQgYW4KKy8vIG9yZGVyZWQgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBpbXBsZW1lbnRzIGxvd2VyX2JvdW5kIGlzIGNvbnZlbmllbnQKKy8vIGZvciB0aGF0LgordHlwZWRlZiBzdGQ6Om1hcDxEZXNjcmlwdG9ySW50UGFpciwgY29uc3QgRmllbGREZXNjcmlwdG9yKj4KKyAgICBFeHRlbnNpb25zR3JvdXBlZEJ5RGVzY3JpcHRvck1hcDsKK3R5cGVkZWYgSEFTSF9NQVA8c3RkOjpzdHJpbmcsIGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKj4KKyAgICBMb2NhdGlvbnNCeVBhdGhNYXA7CisKK3N0ZDo6c2V0PHN0ZDo6c3RyaW5nPiogTmV3QWxsb3dlZFByb3RvM0V4dGVuZGVlKCkgeworICBhdXRvIGFsbG93ZWRfcHJvdG8zX2V4dGVuZGVlcyA9IG5ldyBzdGQ6OnNldDxzdGQ6OnN0cmluZz47CisgIGNvbnN0IGNoYXIqIGtPcHRpb25OYW1lc1tdID0geworICAgICAgIkZpbGVPcHRpb25zIiwgICAiTWVzc2FnZU9wdGlvbnMiLCAgICJGaWVsZE9wdGlvbnMiLAorICAgICAgIkVudW1PcHRpb25zIiwgICAiRW51bVZhbHVlT3B0aW9ucyIsICJTZXJ2aWNlT3B0aW9ucyIsCisgICAgICAiTWV0aG9kT3B0aW9ucyIsICJPbmVvZk9wdGlvbnMiLCAgICAgIkV4dGVuc2lvblJhbmdlT3B0aW9ucyJ9OworICBmb3IgKGNvbnN0IGNoYXIqIG9wdGlvbl9uYW1lIDoga09wdGlvbk5hbWVzKSB7CisgICAgLy8gZGVzY3JpcHRvci5wcm90byBoYXMgYSBkaWZmZXJlbnQgcGFja2FnZSBuYW1lIGluIG9wZW5zb3VyY2UuIFdlIGFsbG93CisgICAgLy8gYm90aCBzbyB0aGUgb3BlbnNvdXJjZSBwcm90b2NvbCBjb21waWxlciBjYW4gYWxzbyBjb21waWxlIGludGVybmFsCisgICAgLy8gcHJvdG8zIGZpbGVzIHdpdGggY3VzdG9tIG9wdGlvbnMuIFNlZTogYi8yNzU2NzkxMgorICAgIGFsbG93ZWRfcHJvdG8zX2V4dGVuZGVlcy0+aW5zZXJ0KHN0ZDo6c3RyaW5nKCJnb29nbGUucHJvdG9idWYuIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9uYW1lKTsKKyAgICAvLyBTcGxpdCB0aGUgd29yZCB0byB0cmljayB0aGUgb3BlbnNvdXJjZSBwcm9jZXNzaW5nIHNjcmlwdHMgc28gdGhleQorICAgIC8vIHdpbGwga2VlcCB0aGUgb3JpZ2luYWwgcGFja2FnZSBuYW1lLgorICAgIGFsbG93ZWRfcHJvdG8zX2V4dGVuZGVlcy0+aW5zZXJ0KHN0ZDo6c3RyaW5nKCJwcm90byIpICsgIjIuIiArIG9wdGlvbl9uYW1lKTsKKyAgfQorICByZXR1cm4gYWxsb3dlZF9wcm90bzNfZXh0ZW5kZWVzOworfQorCisvLyBDaGVja3Mgd2hldGhlciB0aGUgZXh0ZW5kZWUgdHlwZSBpcyBhbGxvd2VkIGluIHByb3RvMy4KKy8vIE9ubHkgZXh0ZW5zaW9ucyB0byBkZXNjcmlwdG9yIG9wdGlvbnMgYXJlIGFsbG93ZWQuIFdlIHVzZSBuYW1lIGNvbXBhcmlzb24KKy8vIGluc3RlYWQgb2YgY29tcGFyaW5nIHRoZSBkZXNjcmlwdG9yIGRpcmVjdGx5IGJlY2F1c2UgdGhlIGV4dGVuc2lvbnMgbWF5IGJlCisvLyBkZWZpbmVkIGluIGEgZGlmZmVyZW50IHBvb2wuCitib29sIEFsbG93ZWRFeHRlbmRlZUluUHJvdG8zKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIHN0YXRpYyBhdXRvIGFsbG93ZWRfcHJvdG8zX2V4dGVuZGVlcyA9CisgICAgICBpbnRlcm5hbDo6T25TaHV0ZG93bkRlbGV0ZShOZXdBbGxvd2VkUHJvdG8zRXh0ZW5kZWUoKSk7CisgIHJldHVybiBhbGxvd2VkX3Byb3RvM19leHRlbmRlZXMtPmZpbmQobmFtZSkgIT0KKyAgICAgICAgIGFsbG93ZWRfcHJvdG8zX2V4dGVuZGVlcy0+ZW5kKCk7Cit9Cit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vIENvbnRhaW5zIHRhYmxlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgZmlsZS4gIFRoZXNlIHRhYmxlcyBhcmUgbm90CisvLyBtb2RpZmllZCBvbmNlIHRoZSBmaWxlIGhhcyBiZWVuIGNvbnN0cnVjdGVkLCBzbyB0aGV5IG5lZWQgbm90IGJlCisvLyBwcm90ZWN0ZWQgYnkgYSBtdXRleC4gIFRoaXMgbWFrZXMgb3BlcmF0aW9ucyB0aGF0IGRlcGVuZCBvbmx5IG9uIHRoZQorLy8gY29udGVudHMgb2YgYSBzaW5nbGUgZmlsZSAtLSBlLmcuIERlc2NyaXB0b3I6OkZpbmRGaWVsZEJ5TmFtZSgpIC0tCisvLyBsb2NrLWZyZWUuCisvLworLy8gRm9yIGhpc3RvcmljYWwgcmVhc29ucywgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBtZXRob2RzIG9mCisvLyBGaWxlRGVzY3JpcHRvclRhYmxlcyBhbmQgRGVzY3JpcHRvclBvb2w6OlRhYmxlcyBhcmUgaW50ZXJsZWF2ZWQgYmVsb3cuCisvLyBUaGVzZSB1c2VkIHRvIGJlIGEgc2luZ2xlIGNsYXNzLgorY2xhc3MgRmlsZURlc2NyaXB0b3JUYWJsZXMgeworIHB1YmxpYzoKKyAgRmlsZURlc2NyaXB0b3JUYWJsZXMoKTsKKyAgfkZpbGVEZXNjcmlwdG9yVGFibGVzKCk7CisKKyAgLy8gRW1wdHkgdGFibGUsIHVzZWQgd2l0aCBwbGFjZWhvbGRlciBmaWxlcy4KKyAgaW5saW5lIHN0YXRpYyBjb25zdCBGaWxlRGVzY3JpcHRvclRhYmxlcyYgR2V0RW1wdHlJbnN0YW5jZSgpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEZpbmRpbmcgaXRlbXMuCisKKyAgLy8gUmV0dXJucyBhIG51bGwgU3ltYm9sIChzeW1ib2wuSXNOdWxsKCkgaXMgdHJ1ZSkgaWYgbm90IGZvdW5kLgorICBpbmxpbmUgU3ltYm9sIEZpbmROZXN0ZWRTeW1ib2woY29uc3Qgdm9pZCogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgbmFtZSkgY29uc3Q7CisKKyAgLy8gVGhlc2UgcmV0dXJuIG51bGxwdHIgaWYgbm90IGZvdW5kLgorICBpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRmllbGRCeU51bWJlcihjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIGNvbnN0OworICBpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUoCisgICAgICBjb25zdCB2b2lkKiBwYXJlbnQsIFN0cmluZ1BpZWNlIGxvd2VyY2FzZV9uYW1lKSBjb25zdDsKKyAgaW5saW5lIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKAorICAgICAgY29uc3Qgdm9pZCogcGFyZW50LCBTdHJpbmdQaWVjZSBjYW1lbGNhc2VfbmFtZSkgY29uc3Q7CisgIGlubGluZSBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kRW51bVZhbHVlQnlOdW1iZXIoCisgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogcGFyZW50LCBpbnQgbnVtYmVyKSBjb25zdDsKKyAgLy8gVGhpcyBjcmVhdGVzIGEgbmV3IEVudW1WYWx1ZURlc2NyaXB0b3IgaWYgbm90IGZvdW5kLCBpbiBhIHRocmVhZC1zYWZlIHdheS4KKyAgaW5saW5lIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEZpbmRFbnVtVmFsdWVCeU51bWJlckNyZWF0aW5nSWZVbmtub3duKAorICAgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIHBhcmVudCwgaW50IG51bWJlcikgY29uc3Q7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gQWRkaW5nIGl0ZW1zLgorCisgIC8vIFRoZXNlIGFkZCBpdGVtcyB0byB0aGUgY29ycmVzcG9uZGluZyB0YWJsZXMuICBUaGV5IHJldHVybiBmYWxzZSBpZgorICAvLyB0aGUga2V5IGFscmVhZHkgZXhpc3RzIGluIHRoZSB0YWJsZS4KKyAgYm9vbCBBZGRBbGlhc1VuZGVyUGFyZW50KGNvbnN0IHZvaWQqIHBhcmVudCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2wgc3ltYm9sKTsKKyAgYm9vbCBBZGRGaWVsZEJ5TnVtYmVyKEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworICBib29sIEFkZEVudW1WYWx1ZUJ5TnVtYmVyKEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKTsKKworICAvLyBQb3B1bGF0ZXMgcC0+Zmlyc3QtPmxvY2F0aW9uc19ieV9wYXRoXyBmcm9tIHAtPnNlY29uZC4KKyAgLy8gVW51c3VhbCBzaWduYXR1cmUgZGljdGF0ZWQgYnkgaW50ZXJuYWw6OmNhbGxfb25jZS4KKyAgc3RhdGljIHZvaWQgQnVpbGRMb2NhdGlvbnNCeVBhdGgoCisgICAgICBzdGQ6OnBhaXI8Y29uc3QgRmlsZURlc2NyaXB0b3JUYWJsZXMqLCBjb25zdCBTb3VyY2VDb2RlSW5mbyo+KiBwKTsKKworICAvLyBSZXR1cm5zIHRoZSBsb2NhdGlvbiBkZW5vdGVkIGJ5IHRoZSBzcGVjaWZpZWQgcGF0aCB0aHJvdWdoIGluZm8sCisgIC8vIG9yIG51bGxwdHIgaWYgbm90IGZvdW5kLgorICAvLyBUaGUgdmFsdWUgb2YgaW5mbyBtdXN0IGJlIHRoYXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgRmlsZURlc2NyaXB0b3IuCisgIC8vIChDb25jZXB0dWFsbHkgYSBwdXJlIGZ1bmN0aW9uLCBidXQgc3RhdGVmdWwgYXMgYW4gb3B0aW1pc2F0aW9uLikKKyAgY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIEdldFNvdXJjZUxvY2F0aW9uKAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgcGF0aCwgY29uc3QgU291cmNlQ29kZUluZm8qIGluZm8pIGNvbnN0OworCisgIC8vIE11c3QgYmUgY2FsbGVkIGFmdGVyIEJ1aWxkRmlsZUltcGwoKSwgZXZlbiBpZiB0aGUgYnVpbGQgZmFpbGVkIGFuZAorICAvLyB3ZSBhcmUgZ29pbmcgdG8gcm9sbCBiYWNrIHRvIHRoZSBsYXN0IGNoZWNrcG9pbnQuCisgIHZvaWQgRmluYWxpemVUYWJsZXMoKTsKKworIHByaXZhdGU6CisgIGNvbnN0IHZvaWQqIEZpbmRQYXJlbnRGb3JGaWVsZHNCeU1hcChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgc3RhdGljIHZvaWQgRmllbGRzQnlMb3dlcmNhc2VOYW1lc0xhenlJbml0U3RhdGljKAorICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JUYWJsZXMqIHRhYmxlcyk7CisgIHZvaWQgRmllbGRzQnlMb3dlcmNhc2VOYW1lc0xhenlJbml0SW50ZXJuYWwoKSBjb25zdDsKKyAgc3RhdGljIHZvaWQgRmllbGRzQnlDYW1lbGNhc2VOYW1lc0xhenlJbml0U3RhdGljKAorICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JUYWJsZXMqIHRhYmxlcyk7CisgIHZvaWQgRmllbGRzQnlDYW1lbGNhc2VOYW1lc0xhenlJbml0SW50ZXJuYWwoKSBjb25zdDsKKworICBTeW1ib2xzQnlQYXJlbnRTZXQgc3ltYm9sc19ieV9wYXJlbnRfOworICBtdXRhYmxlIGludGVybmFsOjpvbmNlX2ZsYWcgZmllbGRzX2J5X2xvd2VyY2FzZV9uYW1lX29uY2VfOworICBtdXRhYmxlIGludGVybmFsOjpvbmNlX2ZsYWcgZmllbGRzX2J5X2NhbWVsY2FzZV9uYW1lX29uY2VfOworICAvLyBNYWtlIHRoZXNlIGZpZWxkcyBhdG9taWMgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdpdGgKKyAgLy8gR2V0RXN0aW1hdGVkT3duZWRNZW1vcnlCeXRlc1NpemUuIE9uY2UgdGhlIHBvaW50ZXIgaXMgc2V0IHRoZSBtYXAgd29uJ3QKKyAgLy8gY2hhbmdlIGFueW1vcmUuCisgIG11dGFibGUgc3RkOjphdG9taWM8Y29uc3QgRmllbGRzQnlOYW1lTWFwKj4gZmllbGRzX2J5X2xvd2VyY2FzZV9uYW1lX3t9OworICBtdXRhYmxlIHN0ZDo6YXRvbWljPGNvbnN0IEZpZWxkc0J5TmFtZU1hcCo+IGZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZV97fTsKKyAgRmllbGRzQnlOdW1iZXJTZXQgZmllbGRzX2J5X251bWJlcl87ICAvLyBOb3QgaW5jbHVkaW5nIGV4dGVuc2lvbnMuCisgIEVudW1WYWx1ZXNCeU51bWJlclNldCBlbnVtX3ZhbHVlc19ieV9udW1iZXJfOworICBtdXRhYmxlIEVudW1WYWx1ZXNCeU51bWJlclNldCB1bmtub3duX2VudW1fdmFsdWVzX2J5X251bWJlcl8KKyAgICAgIFBST1RPQlVGX0dVQVJERURfQlkodW5rbm93bl9lbnVtX3ZhbHVlc19tdV8pOworCisgIC8vIFBvcHVsYXRlZCBvbiBmaXJzdCByZXF1ZXN0IHRvIHNhdmUgc3BhY2UsIGhlbmNlIGNvbnN0bmVzcyBnYW1lcy4KKyAgbXV0YWJsZSBpbnRlcm5hbDo6b25jZV9mbGFnIGxvY2F0aW9uc19ieV9wYXRoX29uY2VfOworICBtdXRhYmxlIExvY2F0aW9uc0J5UGF0aE1hcCBsb2NhdGlvbnNfYnlfcGF0aF87CisKKyAgLy8gTXV0ZXggdG8gcHJvdGVjdCB0aGUgdW5rbm93bi1lbnVtLXZhbHVlIG1hcCBkdWUgdG8gZHluYW1pYworICAvLyBFbnVtVmFsdWVEZXNjcmlwdG9yIGNyZWF0aW9uIG9uIHVua25vd24gdmFsdWVzLgorICBtdXRhYmxlIGludGVybmFsOjpXcmFwcGVkTXV0ZXggdW5rbm93bl9lbnVtX3ZhbHVlc19tdV87Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBTbWFsbCBzZXF1ZW50aWFsIGFsbG9jYXRvciB0byBiZSB1c2VkIHdpdGhpbiBhIHNpbmdsZSBmaWxlLgorLy8gTW9zdCBvZiB0aGUgbWVtb3J5IGZvciBhIHNpbmdsZSBGaWxlRGVzY3JpcHRvciBhbmQgZXZlcnl0aGluZyB1bmRlciBpdCBpcworLy8gYWxsb2NhdGVkIGluIGEgc2luZ2xlIGJsb2NrIG9mIG1lbW9yeSwgd2l0aCB0aGUgRmxhdEFsbG9jYXRvciBnaXZpbmcgaXQgb3V0CisvLyBpbiBwYXJ0cyBsYXRlci4KKy8vIFRoZSBjb2RlIGZpcnN0IHBsYW5zIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIGJ5IGNhbGxpbmcgUGxhbkFycmF5CisvLyB3aXRoIGFsbCB0aGUgYWxsb2NhdGlvbnMgdGhhdCB3aWxsIGhhcHBlbiBhZnRlcndhcmRzLCB0aGVuIGNhbGxzCisvLyBGaW5hbGl6ZVBsYW5uaW5nIHBhc3NpbmcgdGhlIHVuZGVybHlpbmcgYWxsb2NhdG9yICh0aGUgRGVzY3JpcHRvclBvb2w6OlRhYmxlcworLy8gaW5zdGFuY2UpLCBhbmQgdGhlbiBwcm9jZWVkcyB0byBnZXQgdGhlIG1lbW9yeSB2aWEKKy8vIGBBbGxvY2F0ZUFycmF5YC9gQWxsb2NhdGVTdHJpbmdgIGNhbGxzLiBUaGUgY2FsbHMgdG8gUGxhbkFycmF5IGFuZAorLy8gVGhlIGNhbGxzIGhhdmUgdG8gbWF0Y2ggYmV0d2VlbiBwbGFubmluZyBhbmQgYWxsb2NhdGluZywgdGhvdWdoIG5vdAorLy8gbmVjZXNzYXJpbHkgaW4gdGhlIHNhbWUgb3JkZXIuCitjbGFzcyBGbGF0QWxsb2NhdG9yCisgICAgOiBwdWJsaWMgZGVjbHR5cGUoQXBwbHlUeXBlTGlzdDxGbGF0QWxsb2NhdG9ySW1wbD4oCisgICAgICAgICAgU29ydEJ5QWxpZ25tZW50PGNoYXIsIHN0ZDo6c3RyaW5nLCBTb3VyY2VDb2RlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JUYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wdGlvbiB0eXBlcworICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlT3B0aW9ucywgRmllbGRPcHRpb25zLCBFbnVtT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bVZhbHVlT3B0aW9ucywgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLCBPbmVvZk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VPcHRpb25zLCBNZXRob2RPcHRpb25zLCBGaWxlT3B0aW9ucz4oKSkpIHt9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRGVzY3JpcHRvclBvb2w6OlRhYmxlcworCitjbGFzcyBEZXNjcmlwdG9yUG9vbDo6VGFibGVzIHsKKyBwdWJsaWM6CisgIFRhYmxlcygpOworICB+VGFibGVzKCk7CisKKyAgLy8gUmVjb3JkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB0YWJsZXMgdG8gdGhlIHN0YWNrIG9mIGNoZWNrcG9pbnRzLgorICAvLyBFYWNoIGNhbGwgdG8gQWRkQ2hlY2twb2ludCgpIG11c3QgYmUgcGFpcmVkIHdpdGggZXhhY3RseSBvbmUgY2FsbCB0byBlaXRoZXIKKyAgLy8gQ2xlYXJMYXN0Q2hlY2twb2ludCgpIG9yIFJvbGxiYWNrVG9MYXN0Q2hlY2twb2ludCgpLgorICAvLworICAvLyBUaGlzIGlzIHVzZWQgd2hlbiBidWlsZGluZyBmaWxlcywgc2luY2Ugc29tZSBraW5kcyBvZiB2YWxpZGF0aW9uIGVycm9ycworICAvLyBjYW5ub3QgYmUgZGV0ZWN0ZWQgdW50aWwgdGhlIGZpbGUncyBkZXNjcmlwdG9ycyBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0bworICAvLyB0aGUgdGFibGVzLgorICAvLworICAvLyBUaGlzIHN1cHBvcnRzIHJlY3Vyc2l2ZSBjaGVja3BvaW50cywgc2luY2UgYnVpbGRpbmcgYSBmaWxlIG1heSB0cmlnZ2VyCisgIC8vIHJlY3Vyc2l2ZSBidWlsZGluZyBvZiBvdGhlciBmaWxlcy4gTm90ZSB0aGF0IHJlY3Vyc2l2ZSBjaGVja3BvaW50cyBhcmUgbm90CisgIC8vIG5vcm1hbGx5IG5lY2Vzc2FyeTsgZXhwbGljaXQgZGVwZW5kZW5jaWVzIGFyZSBidWlsdCBwcmlvciB0byBjaGVja3BvaW50aW5nLgorICAvLyBTbyBhbHRob3VnaCB3ZSByZWN1cnNpdmVseSBidWlsZCB0cmFuc2l0aXZlIGltcG9ydHMsIHRoZXJlIGlzIGF0IG1vc3Qgb25lCisgIC8vIGNoZWNrcG9pbnQgaW4gdGhlIHN0YWNrIGR1cmluZyBkZXBlbmRlbmN5IGJ1aWxkaW5nLgorICAvLworICAvLyBSZWN1cnNpdmUgY2hlY2twb2ludHMgb25seSBhcmlzZSBkdXJpbmcgY3Jvc3MtbGlua2luZyBvZiB0aGUgZGVzY3JpcHRvcnMuCisgIC8vIFN5bWJvbCByZWZlcmVuY2VzIG11c3QgYmUgcmVzb2x2ZWQsIHZpYSBEZXNjcmlwdG9yQnVpbGRlcjo6RmluZFN5bWJvbCBhbmQKKyAgLy8gZnJpZW5kcy4gSWYgdGhlIHBlbmRpbmcgZmlsZSByZWZlcmVuY2VzIGFuIHVua25vd24gc3ltYm9sCisgIC8vIChlLmcuLCBpdCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgcGVuZGluZyBmaWxlJ3MgZXhwbGljaXQgZGVwZW5kZW5jaWVzKSwgYW5kCisgIC8vIHRoZSBwb29sIGlzIHVzaW5nIGEgZmFsbGJhY2sgZGF0YWJhc2UsIGFuZCB0aGF0IGRhdGFiYXNlIGNvbnRhaW5zIGEgZmlsZQorICAvLyBkZWZpbmluZyB0aGF0IHN5bWJvbCwgYW5kIHRoYXQgZmlsZSBoYXMgbm90IHlldCBiZWVuIGJ1aWx0IGJ5IHRoZSBwb29sLAorICAvLyB0aGUgcG9vbCBidWlsZHMgdGhlIGZpbGUgZHVyaW5nIGNyb3NzLWxpbmtpbmcsIGxlYWRpbmcgdG8gYW5vdGhlcgorICAvLyBjaGVja3BvaW50LgorICB2b2lkIEFkZENoZWNrcG9pbnQoKTsKKworICAvLyBNYXJrIHRoZSBsYXN0IGNoZWNrcG9pbnQgYXMgaGF2aW5nIGNsZWFyZWQgc3VjY2Vzc2Z1bGx5LCByZW1vdmluZyBpdCBmcm9tCisgIC8vIHRoZSBzdGFjay4gSWYgdGhlIHN0YWNrIGlzIGVtcHR5LCBhbGwgcGVuZGluZyBzeW1ib2xzIHdpbGwgYmUgY29tbWl0dGVkLgorICAvLworICAvLyBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUgc3ltYm9scyBhZGRlZCBzaW5jZSB0aGUgbGFzdAorICAvLyBjaGVja3BvaW50IHdvbid0IGJlIHJvbGxlZCBiYWNrOiBpZiBhIGNoZWNrcG9pbnQgZ2V0cyByb2xsZWQgYmFjaywKKyAgLy8gZXZlcnl0aGluZyBwYXN0IHRoYXQgcG9pbnQgZ2V0cyByb2xsZWQgYmFjaywgaW5jbHVkaW5nIHN5bWJvbHMgYWRkZWQgYWZ0ZXIKKyAgLy8gY2hlY2twb2ludHMgdGhhdCB3ZXJlIHB1c2hlZCBvbnRvIHRoZSBzdGFjayBhZnRlciBpdCBhbmQgbWFya2VkIGFzIGNsZWFyZWQuCisgIHZvaWQgQ2xlYXJMYXN0Q2hlY2twb2ludCgpOworCisgIC8vIFJvbGwgYmFjayB0aGUgVGFibGVzIHRvIHRoZSBzdGF0ZSBvZiB0aGUgY2hlY2twb2ludCBhdCB0aGUgdG9wIG9mIHRoZQorICAvLyBzdGFjaywgcmVtb3ZpbmcgZXZlcnl0aGluZyB0aGF0IHdhcyBhZGRlZCBhZnRlciB0aGF0IHBvaW50LgorICB2b2lkIFJvbGxiYWNrVG9MYXN0Q2hlY2twb2ludCgpOworCisgIC8vIFRoZSBzdGFjayBvZiBmaWxlcyB3aGljaCBhcmUgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVXNlZCB0byBkZXRlY3QKKyAgLy8gY3ljbGljIGRlcGVuZGVuY2llcyB3aGVuIGxvYWRpbmcgZmlsZXMgZnJvbSBhIERlc2NyaXB0b3JEYXRhYmFzZS4gIE5vdAorICAvLyB1c2VkIHdoZW4gZmFsbGJhY2tfZGF0YWJhc2VfID09IG51bGxwdHIuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwZW5kaW5nX2ZpbGVzXzsKKworICAvLyBBIHNldCBvZiBmaWxlcyB3aGljaCB3ZSBoYXZlIHRyaWVkIHRvIGxvYWQgZnJvbSB0aGUgZmFsbGJhY2sgZGF0YWJhc2UKKyAgLy8gYW5kIGVuY291bnRlcmVkIGVycm9ycy4gIFdlIHdpbGwgbm90IGF0dGVtcHQgdG8gbG9hZCB0aGVtIGFnYWluIGR1cmluZworICAvLyBleGVjdXRpb24gb2YgdGhlIGN1cnJlbnQgcHVibGljIEFQSSBjYWxsLCBidXQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorICAvLyBsZWdhY3kgY2xpZW50cywgdGhpcyBpcyBjbGVhcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwdWJsaWMgQVBJIGNhbGwuCisgIC8vIE5vdCB1c2VkIHdoZW4gZmFsbGJhY2tfZGF0YWJhc2VfID09IG51bGxwdHIuCisgIEhBU0hfU0VUPHN0ZDo6c3RyaW5nPiBrbm93bl9iYWRfZmlsZXNfOworCisgIC8vIEEgc2V0IG9mIHN5bWJvbHMgd2hpY2ggd2UgaGF2ZSB0cmllZCB0byBsb2FkIGZyb20gdGhlIGZhbGxiYWNrIGRhdGFiYXNlCisgIC8vIGFuZCBlbmNvdW50ZXJlZCBlcnJvcnMuIFdlIHdpbGwgbm90IGF0dGVtcHQgdG8gbG9hZCB0aGVtIGFnYWluIGR1cmluZworICAvLyBleGVjdXRpb24gb2YgdGhlIGN1cnJlbnQgcHVibGljIEFQSSBjYWxsLCBidXQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorICAvLyBsZWdhY3kgY2xpZW50cywgdGhpcyBpcyBjbGVhcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwdWJsaWMgQVBJIGNhbGwuCisgIEhBU0hfU0VUPHN0ZDo6c3RyaW5nPiBrbm93bl9iYWRfc3ltYm9sc187CisKKyAgLy8gVGhlIHNldCBvZiBkZXNjcmlwdG9ycyBmb3Igd2hpY2ggd2UndmUgYWxyZWFkeSBsb2FkZWQgdGhlIGZ1bGwKKyAgLy8gc2V0IG9mIGV4dGVuc2lvbnMgbnVtYmVycyBmcm9tIGZhbGxiYWNrX2RhdGFiYXNlXy4KKyAgSEFTSF9TRVQ8Y29uc3QgRGVzY3JpcHRvcio+IGV4dGVuc2lvbnNfbG9hZGVkX2Zyb21fZGJfOworCisgIC8vIE1hcHMgdHlwZSBuYW1lIHRvIERlc2NyaXB0b3I6OldlbGxLbm93blR5cGUuICBUaGlzIGlzIGxvZ2ljYWxseSBnbG9iYWwKKyAgLy8gYW5kIGNvbnN0LCBidXQgd2UgbWFrZSBpdCBhIG1lbWJlciBoZXJlIHRvIHNpbXBsaWZ5IGl0cyBjb25zdHJ1Y3Rpb24gYW5kCisgIC8vIGRlc3RydWN0aW9uLiAgVGhpcyBvbmx5IGhhcyAyMC1pc2ggZW50cmllcyBhbmQgaXMgb25lIHBlciBEZXNjcmlwdG9yUG9vbCwKKyAgLy8gc28gdGhlIG92ZXJoZWFkIGlzIHNtYWxsLgorICBIQVNIX01BUDxzdGQ6OnN0cmluZywgRGVzY3JpcHRvcjo6V2VsbEtub3duVHlwZT4gd2VsbF9rbm93bl90eXBlc187CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRmluZGluZyBpdGVtcy4KKworICAvLyBGaW5kIHN5bWJvbHMuICBUaGlzIHJldHVybnMgYSBudWxsIFN5bWJvbCAoc3ltYm9sLklzTnVsbCgpIGlzIHRydWUpCisgIC8vIGlmIG5vdCBmb3VuZC4KKyAgaW5saW5lIFN5bWJvbCBGaW5kU3ltYm9sKFN0cmluZ1BpZWNlIGtleSkgY29uc3Q7CisKKyAgLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBib2R5IG9mIERlc2NyaXB0b3JQb29sOjpGaW5kKkJ5TmFtZSgpLiAgSXQgc2hvdWxkCisgIC8vIHJlYWxseSBiZSBhIHByaXZhdGUgbWV0aG9kIG9mIERlc2NyaXB0b3JQb29sLCBidXQgdGhhdCB3b3VsZCByZXF1aXJlCisgIC8vIGRlY2xhcmluZyBTeW1ib2wgaW4gZGVzY3JpcHRvci5oLCB3aGljaCB3b3VsZCBkcmFnIGFsbCBraW5kcyBvZiBvdGhlcgorICAvLyBzdHVmZiBpbnRvIHRoZSBoZWFkZXIuICBZYXkgQysrLgorICBTeW1ib2wgRmluZEJ5TmFtZUhlbHBlcihjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwgU3RyaW5nUGllY2UgbmFtZSk7CisKKyAgLy8gVGhlc2UgcmV0dXJuIG51bGxwdHIgaWYgbm90IGZvdW5kLgorICBpbmxpbmUgY29uc3QgRmlsZURlc2NyaXB0b3IqIEZpbmRGaWxlKFN0cmluZ1BpZWNlIGtleSkgY29uc3Q7CisgIGlubGluZSBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb24oY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgY29uc3Q7CisgIGlubGluZSB2b2lkIEZpbmRBbGxFeHRlbnNpb25zKGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogb3V0KSBjb25zdDsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBBZGRpbmcgaXRlbXMuCisKKyAgLy8gVGhlc2UgYWRkIGl0ZW1zIHRvIHRoZSBjb3JyZXNwb25kaW5nIHRhYmxlcy4gIFRoZXkgcmV0dXJuIGZhbHNlIGlmCisgIC8vIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHRhYmxlLiAgRm9yIEFkZFN5bWJvbCgpLCB0aGUgc3RyaW5nIHBhc3NlZAorICAvLyBpbiBtdXN0IGJlIG9uZSB0aGF0IHdhcyBjb25zdHJ1Y3RlZCB1c2luZyBBbGxvY2F0ZVN0cmluZygpLCBhcyBpdCB3aWxsCisgIC8vIGJlIHVzZWQgYXMgYSBrZXkgaW4gdGhlIHN5bWJvbHNfYnlfbmFtZV8gbWFwIHdpdGhvdXQgY29weWluZy4KKyAgYm9vbCBBZGRTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxfbmFtZSwgU3ltYm9sIHN5bWJvbCk7CisgIGJvb2wgQWRkRmlsZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisgIGJvb2wgQWRkRXh0ZW5zaW9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEFsbG9jYXRpbmcgbWVtb3J5LgorCisgIC8vIEFsbG9jYXRlIGFuIG9iamVjdCB3aGljaCB3aWxsIGJlIHJlY2xhaW1lZCB3aGVuIHRoZSBwb29sIGlzCisgIC8vIGRlc3Ryb3llZC4gIE5vdGUgdGhhdCB0aGUgb2JqZWN0J3MgZGVzdHJ1Y3RvciB3aWxsIG5ldmVyIGJlIGNhbGxlZCwKKyAgLy8gc28gaXRzIGZpZWxkcyBtdXN0IGJlIHBsYWluIG9sZCBkYXRhIChwcmltaXRpdmUgZGF0YSB0eXBlcyBhbmQKKyAgLy8gcG9pbnRlcnMpLiAgQWxsIG9mIHRoZSBkZXNjcmlwdG9yIHR5cGVzIGFyZSBzdWNoIG9iamVjdHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBUeXBlKiBBbGxvY2F0ZSgpOworCisgIC8vIEFsbG9jYXRlIHNvbWUgYnl0ZXMgd2hpY2ggd2lsbCBiZSByZWNsYWltZWQgd2hlbiB0aGUgcG9vbCBpcworICAvLyBkZXN0cm95ZWQuIE1lbW9yeSBpcyBhbGlnbmVkIHRvIDggYnl0ZXMuCisgIHZvaWQqIEFsbG9jYXRlQnl0ZXMoaW50IHNpemUpOworCisgIC8vIENyZWF0ZSBhIEZsYXRBbGxvY2F0aW9uIGZvciB0aGUgY29ycmVzcG9uZGluZyBzaXplcy4KKyAgLy8gQWxsIG9iamVjdHMgd2l0aGluIGl0IHdpbGwgYmUgZGVmYXVsdCBjb25zdHJ1Y3RlZC4KKyAgLy8gVGhlIHdob2xlIGFsbG9jYXRpb24sIGluY2x1ZGluZyB0aGUgbm9uLXRyaXZpYWwgb2JqZWN0cyB3aXRoaW4sIHdpbGwgYmUKKyAgLy8gZGVzdHJveWVkIHdpdGggdGhlIHBvb2wuCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgorICBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvcjo6QWxsb2NhdGlvbiogQ3JlYXRlRmxhdEFsbG9jKAorICAgICAgY29uc3QgVHlwZU1hcDxJbnRULCBULi4uPiYgc2l6ZXMpOworCisKKyBwcml2YXRlOgorICAvLyBBbGwgbWVtb3J5IGFsbG9jYXRlZCBpbiB0aGUgcG9vbC4gIE11c3QgYmUgZmlyc3QgYXMgb3RoZXIgb2JqZWN0cyBjYW4KKyAgLy8gcG9pbnQgaW50byB0aGVzZS4KKyAgc3RydWN0IE1pc2NEZWxldGVyIHsKKyAgICB2b2lkIG9wZXJhdG9yKCkoaW50KiBwKSBjb25zdCB7IGludGVybmFsOjpTaXplZERlbGV0ZShwLCAqcCArIDgpOyB9CisgIH07CisgIC8vIE1pc2NlbGxhbmVvdXMgYWxsb2NhdGlvbnMgYXJlIGxlbmd0aCBwcmVmaXhlZC4gVGhlIHBheWxhb2QgaXMgOCBieXRlcyBhZnRlcgorICAvLyB0aGUgYGludGAgdGhhdCBjb250YWlucyB0aGUgc2l6ZS4gVGhpcyBrZWVwcyB0aGUgcGF5bG9hZCBhbGlnbmVkLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8aW50LCBNaXNjRGVsZXRlcj4+IG1pc2NfYWxsb2NzXzsKKyAgc3RydWN0IEZsYXRBbGxvY0RlbGV0ZXIgeworICAgIHZvaWQgb3BlcmF0b3IoKShpbnRlcm5hbDo6RmxhdEFsbG9jYXRvcjo6QWxsb2NhdGlvbiogcCkgY29uc3QgeworICAgICAgcC0+RGVzdHJveSgpOworICAgIH0KKyAgfTsKKyAgc3RkOjp2ZWN0b3I8CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50ZXJuYWw6OkZsYXRBbGxvY2F0b3I6OkFsbG9jYXRpb24sIEZsYXRBbGxvY0RlbGV0ZXI+PgorICAgICAgZmxhdF9hbGxvY3NfOworCisgIFN5bWJvbHNCeU5hbWVTZXQgc3ltYm9sc19ieV9uYW1lXzsKKyAgRmlsZXNCeU5hbWVNYXAgZmlsZXNfYnlfbmFtZV87CisgIEV4dGVuc2lvbnNHcm91cGVkQnlEZXNjcmlwdG9yTWFwIGV4dGVuc2lvbnNfOworCisgIHN0cnVjdCBDaGVja1BvaW50IHsKKyAgICBleHBsaWNpdCBDaGVja1BvaW50KGNvbnN0IFRhYmxlcyogdGFibGVzKQorICAgICAgICA6IGZsYXRfYWxsb2NhdGlvbnNfYmVmb3JlX2NoZWNrcG9pbnQoCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odGFibGVzLT5mbGF0X2FsbG9jc18uc2l6ZSgpKSksCisgICAgICAgICAgbWlzY19hbGxvY2F0aW9uc19iZWZvcmVfY2hlY2twb2ludCgKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih0YWJsZXMtPm1pc2NfYWxsb2NzXy5zaXplKCkpKSwKKyAgICAgICAgICBwZW5kaW5nX3N5bWJvbHNfYmVmb3JlX2NoZWNrcG9pbnQoCisgICAgICAgICAgICAgIHRhYmxlcy0+c3ltYm9sc19hZnRlcl9jaGVja3BvaW50Xy5zaXplKCkpLAorICAgICAgICAgIHBlbmRpbmdfZmlsZXNfYmVmb3JlX2NoZWNrcG9pbnQoCisgICAgICAgICAgICAgIHRhYmxlcy0+ZmlsZXNfYWZ0ZXJfY2hlY2twb2ludF8uc2l6ZSgpKSwKKyAgICAgICAgICBwZW5kaW5nX2V4dGVuc2lvbnNfYmVmb3JlX2NoZWNrcG9pbnQoCisgICAgICAgICAgICAgIHRhYmxlcy0+ZXh0ZW5zaW9uc19hZnRlcl9jaGVja3BvaW50Xy5zaXplKCkpIHt9CisgICAgaW50IGZsYXRfYWxsb2NhdGlvbnNfYmVmb3JlX2NoZWNrcG9pbnQ7CisgICAgaW50IG1pc2NfYWxsb2NhdGlvbnNfYmVmb3JlX2NoZWNrcG9pbnQ7CisgICAgaW50IHBlbmRpbmdfc3ltYm9sc19iZWZvcmVfY2hlY2twb2ludDsKKyAgICBpbnQgcGVuZGluZ19maWxlc19iZWZvcmVfY2hlY2twb2ludDsKKyAgICBpbnQgcGVuZGluZ19leHRlbnNpb25zX2JlZm9yZV9jaGVja3BvaW50OworICB9OworICBzdGQ6OnZlY3RvcjxDaGVja1BvaW50PiBjaGVja3BvaW50c187CisgIHN0ZDo6dmVjdG9yPFN5bWJvbD4gc3ltYm9sc19hZnRlcl9jaGVja3BvaW50XzsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBmaWxlc19hZnRlcl9jaGVja3BvaW50XzsKKyAgc3RkOjp2ZWN0b3I8RGVzY3JpcHRvckludFBhaXI+IGV4dGVuc2lvbnNfYWZ0ZXJfY2hlY2twb2ludF87Cit9OworCitEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpUYWJsZXMoKSB7CisgIHdlbGxfa25vd25fdHlwZXNfLmluc2VydCh7CisgICAgICB7Imdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSIsIERlc2NyaXB0b3I6OldFTExLTk9XTlRZUEVfRE9VQkxFVkFMVUV9LAorICAgICAgeyJnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZSIsIERlc2NyaXB0b3I6OldFTExLTk9XTlRZUEVfRkxPQVRWQUxVRX0sCisgICAgICB7Imdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlIiwgRGVzY3JpcHRvcjo6V0VMTEtOT1dOVFlQRV9JTlQ2NFZBTFVFfSwKKyAgICAgIHsiZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlIiwgRGVzY3JpcHRvcjo6V0VMTEtOT1dOVFlQRV9VSU5UNjRWQUxVRX0sCisgICAgICB7Imdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIiwgRGVzY3JpcHRvcjo6V0VMTEtOT1dOVFlQRV9JTlQzMlZBTFVFfSwKKyAgICAgIHsiZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlIiwgRGVzY3JpcHRvcjo6V0VMTEtOT1dOVFlQRV9VSU5UMzJWQUxVRX0sCisgICAgICB7Imdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZSIsIERlc2NyaXB0b3I6OldFTExLTk9XTlRZUEVfU1RSSU5HVkFMVUV9LAorICAgICAgeyJnb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZSIsIERlc2NyaXB0b3I6OldFTExLTk9XTlRZUEVfQllURVNWQUxVRX0sCisgICAgICB7Imdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUiLCBEZXNjcmlwdG9yOjpXRUxMS05PV05UWVBFX0JPT0xWQUxVRX0sCisgICAgICB7Imdvb2dsZS5wcm90b2J1Zi5BbnkiLCBEZXNjcmlwdG9yOjpXRUxMS05PV05UWVBFX0FOWX0sCisgICAgICB7Imdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2siLCBEZXNjcmlwdG9yOjpXRUxMS05PV05UWVBFX0ZJRUxETUFTS30sCisgICAgICB7Imdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiIsIERlc2NyaXB0b3I6OldFTExLTk9XTlRZUEVfRFVSQVRJT059LAorICAgICAgeyJnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIiwgRGVzY3JpcHRvcjo6V0VMTEtOT1dOVFlQRV9USU1FU1RBTVB9LAorICAgICAgeyJnb29nbGUucHJvdG9idWYuVmFsdWUiLCBEZXNjcmlwdG9yOjpXRUxMS05PV05UWVBFX1ZBTFVFfSwKKyAgICAgIHsiZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZSIsIERlc2NyaXB0b3I6OldFTExLTk9XTlRZUEVfTElTVFZBTFVFfSwKKyAgICAgIHsiZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCIsIERlc2NyaXB0b3I6OldFTExLTk9XTlRZUEVfU1RSVUNUfSwKKyAgfSk7Cit9CisKK0Rlc2NyaXB0b3JQb29sOjpUYWJsZXM6On5UYWJsZXMoKSB7IEdPT0dMRV9EQ0hFQ0soY2hlY2twb2ludHNfLmVtcHR5KCkpOyB9CisKK0ZpbGVEZXNjcmlwdG9yVGFibGVzOjpGaWxlRGVzY3JpcHRvclRhYmxlcygpIHt9CisKK0ZpbGVEZXNjcmlwdG9yVGFibGVzOjp+RmlsZURlc2NyaXB0b3JUYWJsZXMoKSB7CisgIGRlbGV0ZSBmaWVsZHNfYnlfbG93ZXJjYXNlX25hbWVfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgIGRlbGV0ZSBmaWVsZHNfYnlfY2FtZWxjYXNlX25hbWVfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7Cit9CisKK2lubGluZSBjb25zdCBGaWxlRGVzY3JpcHRvclRhYmxlcyYgRmlsZURlc2NyaXB0b3JUYWJsZXM6OkdldEVtcHR5SW5zdGFuY2UoKSB7CisgIHN0YXRpYyBhdXRvIGZpbGVfZGVzY3JpcHRvcl90YWJsZXMgPQorICAgICAgaW50ZXJuYWw6Ok9uU2h1dGRvd25EZWxldGUobmV3IEZpbGVEZXNjcmlwdG9yVGFibGVzKCkpOworICByZXR1cm4gKmZpbGVfZGVzY3JpcHRvcl90YWJsZXM7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6QWRkQ2hlY2twb2ludCgpIHsKKyAgY2hlY2twb2ludHNfLnB1c2hfYmFjayhDaGVja1BvaW50KHRoaXMpKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpDbGVhckxhc3RDaGVja3BvaW50KCkgeworICBHT09HTEVfRENIRUNLKCFjaGVja3BvaW50c18uZW1wdHkoKSk7CisgIGNoZWNrcG9pbnRzXy5wb3BfYmFjaygpOworICBpZiAoY2hlY2twb2ludHNfLmVtcHR5KCkpIHsKKyAgICAvLyBBbGwgY2hlY2twb2ludHMgaGF2ZSBiZWVuIGNsZWFyZWQ6IHdlIGNhbiBub3cgY29tbWl0IGFsbCBvZiB0aGUgcGVuZGluZworICAgIC8vIGRhdGEuCisgICAgc3ltYm9sc19hZnRlcl9jaGVja3BvaW50Xy5jbGVhcigpOworICAgIGZpbGVzX2FmdGVyX2NoZWNrcG9pbnRfLmNsZWFyKCk7CisgICAgZXh0ZW5zaW9uc19hZnRlcl9jaGVja3BvaW50Xy5jbGVhcigpOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6Um9sbGJhY2tUb0xhc3RDaGVja3BvaW50KCkgeworICBHT09HTEVfRENIRUNLKCFjaGVja3BvaW50c18uZW1wdHkoKSk7CisgIGNvbnN0IENoZWNrUG9pbnQmIGNoZWNrcG9pbnQgPSBjaGVja3BvaW50c18uYmFjaygpOworCisgIGZvciAoc2l6ZV90IGkgPSBjaGVja3BvaW50LnBlbmRpbmdfc3ltYm9sc19iZWZvcmVfY2hlY2twb2ludDsKKyAgICAgICBpIDwgc3ltYm9sc19hZnRlcl9jaGVja3BvaW50Xy5zaXplKCk7IGkrKykgeworICAgIHN5bWJvbHNfYnlfbmFtZV8uZXJhc2Uoc3ltYm9sc19hZnRlcl9jaGVja3BvaW50X1tpXSk7CisgIH0KKyAgZm9yIChzaXplX3QgaSA9IGNoZWNrcG9pbnQucGVuZGluZ19maWxlc19iZWZvcmVfY2hlY2twb2ludDsKKyAgICAgICBpIDwgZmlsZXNfYWZ0ZXJfY2hlY2twb2ludF8uc2l6ZSgpOyBpKyspIHsKKyAgICBmaWxlc19ieV9uYW1lXy5lcmFzZShmaWxlc19hZnRlcl9jaGVja3BvaW50X1tpXS0+bmFtZSgpKTsKKyAgfQorICBmb3IgKHNpemVfdCBpID0gY2hlY2twb2ludC5wZW5kaW5nX2V4dGVuc2lvbnNfYmVmb3JlX2NoZWNrcG9pbnQ7CisgICAgICAgaSA8IGV4dGVuc2lvbnNfYWZ0ZXJfY2hlY2twb2ludF8uc2l6ZSgpOyBpKyspIHsKKyAgICBleHRlbnNpb25zXy5lcmFzZShleHRlbnNpb25zX2FmdGVyX2NoZWNrcG9pbnRfW2ldKTsKKyAgfQorCisgIHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF8ucmVzaXplKAorICAgICAgY2hlY2twb2ludC5wZW5kaW5nX3N5bWJvbHNfYmVmb3JlX2NoZWNrcG9pbnQpOworICBmaWxlc19hZnRlcl9jaGVja3BvaW50Xy5yZXNpemUoY2hlY2twb2ludC5wZW5kaW5nX2ZpbGVzX2JlZm9yZV9jaGVja3BvaW50KTsKKyAgZXh0ZW5zaW9uc19hZnRlcl9jaGVja3BvaW50Xy5yZXNpemUoCisgICAgICBjaGVja3BvaW50LnBlbmRpbmdfZXh0ZW5zaW9uc19iZWZvcmVfY2hlY2twb2ludCk7CisKKyAgZmxhdF9hbGxvY3NfLnJlc2l6ZShjaGVja3BvaW50LmZsYXRfYWxsb2NhdGlvbnNfYmVmb3JlX2NoZWNrcG9pbnQpOworICBtaXNjX2FsbG9jc18ucmVzaXplKGNoZWNrcG9pbnQubWlzY19hbGxvY2F0aW9uc19iZWZvcmVfY2hlY2twb2ludCk7CisgIGNoZWNrcG9pbnRzXy5wb3BfYmFjaygpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lubGluZSBTeW1ib2wgRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6RmluZFN5bWJvbChTdHJpbmdQaWVjZSBrZXkpIGNvbnN0IHsKKyAgU3ltYm9sOjpRdWVyeUtleSBuYW1lOworICBuYW1lLm5hbWUgPSBrZXk7CisgIGF1dG8gaXQgPSBzeW1ib2xzX2J5X25hbWVfLmZpbmQobmFtZSk7CisgIHJldHVybiBpdCA9PSBzeW1ib2xzX2J5X25hbWVfLmVuZCgpID8gU3ltYm9sKCkgOiAqaXQ7Cit9CisKK2lubGluZSBTeW1ib2wgRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbmROZXN0ZWRTeW1ib2woCisgICAgY29uc3Qgdm9pZCogcGFyZW50LCBTdHJpbmdQaWVjZSBuYW1lKSBjb25zdCB7CisgIFN5bWJvbDo6UXVlcnlLZXkgcXVlcnk7CisgIHF1ZXJ5Lm5hbWUgPSBuYW1lOworICBxdWVyeS5wYXJlbnQgPSBwYXJlbnQ7CisgIGF1dG8gaXQgPSBzeW1ib2xzX2J5X3BhcmVudF8uZmluZChxdWVyeSk7CisgIHJldHVybiBpdCA9PSBzeW1ib2xzX2J5X3BhcmVudF8uZW5kKCkgPyBTeW1ib2woKSA6ICppdDsKK30KKworU3ltYm9sIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkZpbmRCeU5hbWVIZWxwZXIoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBuYW1lKSB7CisgIGlmIChwb29sLT5tdXRleF8gIT0gbnVsbHB0cikgeworICAgIC8vIEZhc3QgcGF0aDogdGhlIFN5bWJvbCBpcyBhbHJlYWR5IGNhY2hlZC4gIFRoaXMgaXMganVzdCBhIGhhc2ggbG9va3VwLgorICAgIFJlYWRlck11dGV4TG9jayBsb2NrKHBvb2wtPm11dGV4Xyk7CisgICAgaWYgKGtub3duX2JhZF9zeW1ib2xzXy5lbXB0eSgpICYmIGtub3duX2JhZF9maWxlc18uZW1wdHkoKSkgeworICAgICAgU3ltYm9sIHJlc3VsdCA9IEZpbmRTeW1ib2wobmFtZSk7CisgICAgICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0KKyAgTXV0ZXhMb2NrTWF5YmUgbG9jayhwb29sLT5tdXRleF8pOworICBpZiAocG9vbC0+ZmFsbGJhY2tfZGF0YWJhc2VfICE9IG51bGxwdHIpIHsKKyAgICBrbm93bl9iYWRfc3ltYm9sc18uY2xlYXIoKTsKKyAgICBrbm93bl9iYWRfZmlsZXNfLmNsZWFyKCk7CisgIH0KKyAgU3ltYm9sIHJlc3VsdCA9IEZpbmRTeW1ib2wobmFtZSk7CisKKyAgaWYgKHJlc3VsdC5Jc051bGwoKSAmJiBwb29sLT51bmRlcmxheV8gIT0gbnVsbHB0cikgeworICAgIC8vIFN5bWJvbCBub3QgZm91bmQ7IGNoZWNrIHRoZSB1bmRlcmxheS4KKyAgICByZXN1bHQgPSBwb29sLT51bmRlcmxheV8tPnRhYmxlc18tPkZpbmRCeU5hbWVIZWxwZXIocG9vbC0+dW5kZXJsYXlfLCBuYW1lKTsKKyAgfQorCisgIGlmIChyZXN1bHQuSXNOdWxsKCkpIHsKKyAgICAvLyBTeW1ib2wgc3RpbGwgbm90IGZvdW5kLCBzbyBjaGVjayBmYWxsYmFjayBkYXRhYmFzZS4KKyAgICBpZiAocG9vbC0+VHJ5RmluZFN5bWJvbEluRmFsbGJhY2tEYXRhYmFzZShuYW1lKSkgeworICAgICAgcmVzdWx0ID0gRmluZFN5bWJvbChuYW1lKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitpbmxpbmUgY29uc3QgRmlsZURlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkZpbmRGaWxlKAorICAgIFN0cmluZ1BpZWNlIGtleSkgY29uc3QgeworICByZXR1cm4gRmluZFB0ck9yTnVsbChmaWxlc19ieV9uYW1lXywga2V5KTsKK30KKworaW5saW5lIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbmRGaWVsZEJ5TnVtYmVyKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwgaW50IG51bWJlcikgY29uc3QgeworICAvLyBJZiBgbnVtYmVyYCBpcyB3aXRoaW4gdGhlIHNlcXVlbnRpYWwgcmFuZ2UsIGp1c3QgaW5kZXggaW50byB0aGUgcGFyZW50CisgIC8vIHdpdGhvdXQgZG9pbmcgYSB0YWJsZSBsb29rdXAuCisgIGlmIChwYXJlbnQgIT0gbnVsbHB0ciAmJiAgLy8KKyAgICAgIDEgPD0gbnVtYmVyICYmIG51bWJlciA8PSBwYXJlbnQtPnNlcXVlbnRpYWxfZmllbGRfbGltaXRfKSB7CisgICAgcmV0dXJuIHBhcmVudC0+ZmllbGQobnVtYmVyIC0gMSk7CisgIH0KKworICBTeW1ib2w6OlF1ZXJ5S2V5IHF1ZXJ5OworICBxdWVyeS5wYXJlbnQgPSBwYXJlbnQ7CisgIHF1ZXJ5LmZpZWxkX251bWJlciA9IG51bWJlcjsKKworICBhdXRvIGl0ID0gZmllbGRzX2J5X251bWJlcl8uZmluZChxdWVyeSk7CisgIHJldHVybiBpdCA9PSBmaWVsZHNfYnlfbnVtYmVyXy5lbmQoKSA/IG51bGxwdHIgOiBpdC0+ZmllbGRfZGVzY3JpcHRvcigpOworfQorCitjb25zdCB2b2lkKiBGaWxlRGVzY3JpcHRvclRhYmxlczo6RmluZFBhcmVudEZvckZpZWxkc0J5TWFwKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIGlmIChmaWVsZC0+ZXh0ZW5zaW9uX3Njb3BlKCkgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIGZpZWxkLT5maWxlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmaWVsZC0+ZXh0ZW5zaW9uX3Njb3BlKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBmaWVsZC0+Y29udGFpbmluZ190eXBlKCk7CisgIH0KK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclRhYmxlczo6RmllbGRzQnlMb3dlcmNhc2VOYW1lc0xhenlJbml0U3RhdGljKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yVGFibGVzKiB0YWJsZXMpIHsKKyAgdGFibGVzLT5GaWVsZHNCeUxvd2VyY2FzZU5hbWVzTGF6eUluaXRJbnRlcm5hbCgpOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpGaWVsZHNCeUxvd2VyY2FzZU5hbWVzTGF6eUluaXRJbnRlcm5hbCgpIGNvbnN0IHsKKyAgYXV0byogbWFwID0gbmV3IEZpZWxkc0J5TmFtZU1hcDsKKyAgZm9yIChTeW1ib2wgc3ltYm9sIDogc3ltYm9sc19ieV9wYXJlbnRfKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IHN5bWJvbC5maWVsZF9kZXNjcmlwdG9yKCk7CisgICAgaWYgKCFmaWVsZCkgY29udGludWU7CisgICAgKCptYXApW3tGaW5kUGFyZW50Rm9yRmllbGRzQnlNYXAoZmllbGQpLCBmaWVsZC0+bG93ZXJjYXNlX25hbWUoKS5jX3N0cigpfV0gPQorICAgICAgICBmaWVsZDsKKyAgfQorICBmaWVsZHNfYnlfbG93ZXJjYXNlX25hbWVfLnN0b3JlKG1hcCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7Cit9CisKK2lubGluZSBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpGaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUoCisgICAgY29uc3Qgdm9pZCogcGFyZW50LCBTdHJpbmdQaWVjZSBsb3dlcmNhc2VfbmFtZSkgY29uc3QgeworICBpbnRlcm5hbDo6Y2FsbF9vbmNlKAorICAgICAgZmllbGRzX2J5X2xvd2VyY2FzZV9uYW1lX29uY2VfLAorICAgICAgJkZpbGVEZXNjcmlwdG9yVGFibGVzOjpGaWVsZHNCeUxvd2VyY2FzZU5hbWVzTGF6eUluaXRTdGF0aWMsIHRoaXMpOworICByZXR1cm4gRmluZFB0ck9yTnVsbCgKKyAgICAgICpmaWVsZHNfYnlfbG93ZXJjYXNlX25hbWVfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSksCisgICAgICBQb2ludGVyU3RyaW5nUGFpcihwYXJlbnQsIGxvd2VyY2FzZV9uYW1lKSk7Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpZWxkc0J5Q2FtZWxjYXNlTmFtZXNMYXp5SW5pdFN0YXRpYygKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvclRhYmxlcyogdGFibGVzKSB7CisgIHRhYmxlcy0+RmllbGRzQnlDYW1lbGNhc2VOYW1lc0xhenlJbml0SW50ZXJuYWwoKTsKK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclRhYmxlczo6RmllbGRzQnlDYW1lbGNhc2VOYW1lc0xhenlJbml0SW50ZXJuYWwoKSBjb25zdCB7CisgIGF1dG8qIG1hcCA9IG5ldyBGaWVsZHNCeU5hbWVNYXA7CisgIGZvciAoU3ltYm9sIHN5bWJvbCA6IHN5bWJvbHNfYnlfcGFyZW50XykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBzeW1ib2wuZmllbGRfZGVzY3JpcHRvcigpOworICAgIGlmICghZmllbGQpIGNvbnRpbnVlOworICAgICgqbWFwKVt7RmluZFBhcmVudEZvckZpZWxkc0J5TWFwKGZpZWxkKSwgZmllbGQtPmNhbWVsY2FzZV9uYW1lKCkuY19zdHIoKX1dID0KKyAgICAgICAgZmllbGQ7CisgIH0KKyAgZmllbGRzX2J5X2NhbWVsY2FzZV9uYW1lXy5zdG9yZShtYXAsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworfQorCitpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaWxlRGVzY3JpcHRvclRhYmxlczo6RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKAorICAgIGNvbnN0IHZvaWQqIHBhcmVudCwgU3RyaW5nUGllY2UgY2FtZWxjYXNlX25hbWUpIGNvbnN0IHsKKyAgaW50ZXJuYWw6OmNhbGxfb25jZSgKKyAgICAgIGZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZV9vbmNlXywKKyAgICAgIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpGaWVsZHNCeUNhbWVsY2FzZU5hbWVzTGF6eUluaXRTdGF0aWMsIHRoaXMpOworICByZXR1cm4gRmluZFB0ck9yTnVsbCgKKyAgICAgICpmaWVsZHNfYnlfY2FtZWxjYXNlX25hbWVfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSksCisgICAgICBQb2ludGVyU3RyaW5nUGFpcihwYXJlbnQsIGNhbWVsY2FzZV9uYW1lKSk7Cit9CisKK2lubGluZSBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaWxlRGVzY3JpcHRvclRhYmxlczo6RmluZEVudW1WYWx1ZUJ5TnVtYmVyKAorICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBwYXJlbnQsIGludCBudW1iZXIpIGNvbnN0IHsKKyAgLy8gSWYgYG51bWJlcmAgaXMgd2l0aGluIHRoZSBzZXF1ZW50aWFsIHJhbmdlLCBqdXN0IGluZGV4IGludG8gdGhlIHBhcmVudAorICAvLyB3aXRob3V0IGRvaW5nIGEgdGFibGUgbG9va3VwLgorICBjb25zdCBpbnQgYmFzZSA9IHBhcmVudC0+dmFsdWUoMCktPm51bWJlcigpOworICBpZiAoYmFzZSA8PSBudW1iZXIgJiYKKyAgICAgIG51bWJlciA8PSBzdGF0aWNfY2FzdDxpbnQ2NF90PihiYXNlKSArIHBhcmVudC0+c2VxdWVudGlhbF92YWx1ZV9saW1pdF8pIHsKKyAgICByZXR1cm4gcGFyZW50LT52YWx1ZShudW1iZXIgLSBiYXNlKTsKKyAgfQorCisgIFN5bWJvbDo6UXVlcnlLZXkgcXVlcnk7CisgIHF1ZXJ5LnBhcmVudCA9IHBhcmVudDsKKyAgcXVlcnkuZmllbGRfbnVtYmVyID0gbnVtYmVyOworCisgIGF1dG8gaXQgPSBlbnVtX3ZhbHVlc19ieV9udW1iZXJfLmZpbmQocXVlcnkpOworICByZXR1cm4gaXQgPT0gZW51bV92YWx1ZXNfYnlfbnVtYmVyXy5lbmQoKSA/IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpdC0+ZW51bV92YWx1ZV9kZXNjcmlwdG9yKCk7Cit9CisKK2lubGluZSBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKgorRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbmRFbnVtVmFsdWVCeU51bWJlckNyZWF0aW5nSWZVbmtub3duKAorICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBwYXJlbnQsIGludCBudW1iZXIpIGNvbnN0IHsKKyAgLy8gRmlyc3QgdHJ5LCB3aXRoIG1hcCBvZiBjb21waWxlZC1pbiB2YWx1ZXMuCisgIHsKKyAgICBjb25zdCBhdXRvKiB2YWx1ZSA9IEZpbmRFbnVtVmFsdWVCeU51bWJlcihwYXJlbnQsIG51bWJlcik7CisgICAgaWYgKHZhbHVlICE9IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgIH0KKworICBTeW1ib2w6OlF1ZXJ5S2V5IHF1ZXJ5OworICBxdWVyeS5wYXJlbnQgPSBwYXJlbnQ7CisgIHF1ZXJ5LmZpZWxkX251bWJlciA9IG51bWJlcjsKKworICAvLyBTZWNvbmQgdHJ5LCB3aXRoIHJlYWRlciBsb2NrIGhlbGQgb24gdW5rbm93biBlbnVtIHZhbHVlczogY29tbW9uIGNhc2UuCisgIHsKKyAgICBSZWFkZXJNdXRleExvY2sgbCgmdW5rbm93bl9lbnVtX3ZhbHVlc19tdV8pOworICAgIGF1dG8gaXQgPSB1bmtub3duX2VudW1fdmFsdWVzX2J5X251bWJlcl8uZmluZChxdWVyeSk7CisgICAgaWYgKGl0ICE9IHVua25vd25fZW51bV92YWx1ZXNfYnlfbnVtYmVyXy5lbmQoKSAmJgorICAgICAgICBpdC0+ZW51bV92YWx1ZV9kZXNjcmlwdG9yKCkgIT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIGl0LT5lbnVtX3ZhbHVlX2Rlc2NyaXB0b3IoKTsKKyAgICB9CisgIH0KKyAgLy8gSWYgbm90IGZvdW5kLCB0cnkgYWdhaW4gd2l0aCB3cml0ZXIgbG9jayBoZWxkLCBhbmQgY3JlYXRlIG5ldyBkZXNjcmlwdG9yIGlmCisgIC8vIG5lY2Vzc2FyeS4KKyAgeworICAgIFdyaXRlck11dGV4TG9jayBsKCZ1bmtub3duX2VudW1fdmFsdWVzX211Xyk7CisgICAgYXV0byBpdCA9IHVua25vd25fZW51bV92YWx1ZXNfYnlfbnVtYmVyXy5maW5kKHF1ZXJ5KTsKKyAgICBpZiAoaXQgIT0gdW5rbm93bl9lbnVtX3ZhbHVlc19ieV9udW1iZXJfLmVuZCgpICYmCisgICAgICAgIGl0LT5lbnVtX3ZhbHVlX2Rlc2NyaXB0b3IoKSAhPSBudWxscHRyKSB7CisgICAgICByZXR1cm4gaXQtPmVudW1fdmFsdWVfZGVzY3JpcHRvcigpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhbiBFbnVtVmFsdWVEZXNjcmlwdG9yIGR5bmFtaWNhbGx5LiBXZSBkb24ndCBpbnNlcnQgaXQgaW50byB0aGUKKyAgICAvLyBFbnVtRGVzY3JpcHRvciAoaXQncyBub3QgYSBwYXJ0IG9mIHRoZSBlbnVtIGFzIG9yaWdpbmFsbHkgZGVmaW5lZCksIGJ1dAorICAgIC8vIHdlIGRvIGluc2VydCBpdCBpbnRvIHRoZSB0YWJsZSBzbyB0aGF0IHdlIGNhbiByZXR1cm4gdGhlIHNhbWUgcG9pbnRlcgorICAgIC8vIGxhdGVyLgorICAgIHN0ZDo6c3RyaW5nIGVudW1fdmFsdWVfbmFtZSA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgIlVOS05PV05fRU5VTV9WQUxVRV8lc18lZCIsIHBhcmVudC0+bmFtZSgpLmNfc3RyKCksIG51bWJlcik7CisgICAgYXV0byogcG9vbCA9IERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpOworICAgIGF1dG8qIHRhYmxlcyA9IGNvbnN0X2Nhc3Q8RGVzY3JpcHRvclBvb2w6OlRhYmxlcyo+KHBvb2wtPnRhYmxlc18uZ2V0KCkpOworICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yIGFsbG9jOworICAgIGFsbG9jLlBsYW5BcnJheTxFbnVtVmFsdWVEZXNjcmlwdG9yPigxKTsKKyAgICBhbGxvYy5QbGFuQXJyYXk8c3RkOjpzdHJpbmc+KDIpOworCisgICAgeworICAgICAgLy8gTXVzdCBsb2NrIHRoZSBwb29sIGJlY2F1c2Ugd2Ugd2lsbCBkbyBhbGxvY2F0aW9ucyBpbiB0aGUgc2hhcmVkIGFyZW5hLgorICAgICAgTXV0ZXhMb2NrTWF5YmUgbDIocG9vbC0+bXV0ZXhfKTsKKyAgICAgIGFsbG9jLkZpbmFsaXplUGxhbm5pbmcodGFibGVzKTsKKyAgICB9CisgICAgRW51bVZhbHVlRGVzY3JpcHRvciogcmVzdWx0ID0gYWxsb2MuQWxsb2NhdGVBcnJheTxFbnVtVmFsdWVEZXNjcmlwdG9yPigxKTsKKyAgICByZXN1bHQtPmFsbF9uYW1lc18gPSBhbGxvYy5BbGxvY2F0ZVN0cmluZ3MoCisgICAgICAgIGVudW1fdmFsdWVfbmFtZSwKKyAgICAgICAgU3RyQ2F0KHBhcmVudC0+ZnVsbF9uYW1lKCksICIuIiwgZW51bV92YWx1ZV9uYW1lKSk7CisgICAgcmVzdWx0LT5udW1iZXJfID0gbnVtYmVyOworICAgIHJlc3VsdC0+dHlwZV8gPSBwYXJlbnQ7CisgICAgcmVzdWx0LT5vcHRpb25zXyA9ICZFbnVtVmFsdWVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgICAgdW5rbm93bl9lbnVtX3ZhbHVlc19ieV9udW1iZXJfLmluc2VydChTeW1ib2w6OkVudW1WYWx1ZShyZXN1bHQsIDApKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK2lubGluZSBjb25zdCBGaWVsZERlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkZpbmRFeHRlbnNpb24oCisgICAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUsIGludCBudW1iZXIpIGNvbnN0IHsKKyAgcmV0dXJuIEZpbmRQdHJPck51bGwoZXh0ZW5zaW9uc18sIHN0ZDo6bWFrZV9wYWlyKGV4dGVuZGVlLCBudW1iZXIpKTsKK30KKworaW5saW5lIHZvaWQgRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6RmluZEFsbEV4dGVuc2lvbnMoCisgICAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUsCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dCkgY29uc3QgeworICBFeHRlbnNpb25zR3JvdXBlZEJ5RGVzY3JpcHRvck1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPQorICAgICAgZXh0ZW5zaW9uc18ubG93ZXJfYm91bmQoc3RkOjptYWtlX3BhaXIoZXh0ZW5kZWUsIDApKTsKKyAgZm9yICg7IGl0ICE9IGV4dGVuc2lvbnNfLmVuZCgpICYmIGl0LT5maXJzdC5maXJzdCA9PSBleHRlbmRlZTsgKytpdCkgeworICAgIG91dC0+cHVzaF9iYWNrKGl0LT5zZWNvbmQpOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYm9vbCBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpBZGRTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbCBzeW1ib2wpIHsKKyAgR09PR0xFX0RDSEVDS19FUShmdWxsX25hbWUsIHN5bWJvbC5mdWxsX25hbWUoKSk7CisgIGlmIChzeW1ib2xzX2J5X25hbWVfLmluc2VydChzeW1ib2wpLnNlY29uZCkgeworICAgIHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF8ucHVzaF9iYWNrKHN5bWJvbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgRmlsZURlc2NyaXB0b3JUYWJsZXM6OkFkZEFsaWFzVW5kZXJQYXJlbnQoY29uc3Qgdm9pZCogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sIHN5bWJvbCkgeworICBHT09HTEVfRENIRUNLX0VRKG5hbWUsIHN5bWJvbC5wYXJlbnRfbmFtZV9rZXkoKS5zZWNvbmQpOworICBHT09HTEVfRENIRUNLX0VRKHBhcmVudCwgc3ltYm9sLnBhcmVudF9uYW1lX2tleSgpLmZpcnN0KTsKKyAgcmV0dXJuIHN5bWJvbHNfYnlfcGFyZW50Xy5pbnNlcnQoc3ltYm9sKS5zZWNvbmQ7Cit9CisKK2Jvb2wgRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6QWRkRmlsZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICBpZiAoSW5zZXJ0SWZOb3RQcmVzZW50KCZmaWxlc19ieV9uYW1lXywgZmlsZS0+bmFtZSgpLCBmaWxlKSkgeworICAgIGZpbGVzX2FmdGVyX2NoZWNrcG9pbnRfLnB1c2hfYmFjayhmaWxlKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclRhYmxlczo6RmluYWxpemVUYWJsZXMoKSB7fQorCitib29sIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpBZGRGaWVsZEJ5TnVtYmVyKEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgLy8gU2tpcCBmaWVsZHMgdGhhdCBhcmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZXF1ZW5jZS4KKyAgaWYgKGZpZWxkLT5jb250YWluaW5nX3R5cGUoKSAhPSBudWxscHRyICYmIGZpZWxkLT5udW1iZXIoKSA+PSAxICYmCisgICAgICBmaWVsZC0+bnVtYmVyKCkgPD0gZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5zZXF1ZW50aWFsX2ZpZWxkX2xpbWl0XykgeworICAgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAgIC8vIENvbmZsaWN0cyB3aXRoIHRoZSBmaWVsZCB0aGF0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBzZXF1ZW50aWFsIHJhbmdlLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBPbmx5IHJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBhdCB0aGF0IGluZGV4IG1hdGNoZXMuIE90aGVyd2lzZSBpdAorICAgIC8vIGNvbmZsaWN0cyB3aXRoIHRoZSBleGlzdGluZyBmaWVsZCBpbiB0aGUgc2VxdWVudGlhbCByYW5nZS4KKyAgICByZXR1cm4gZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5maWVsZChmaWVsZC0+bnVtYmVyKCkgLSAxKSA9PSBmaWVsZDsKKyAgfQorCisgIHJldHVybiBmaWVsZHNfYnlfbnVtYmVyXy5pbnNlcnQoU3ltYm9sKGZpZWxkKSkuc2Vjb25kOworfQorCitib29sIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpBZGRFbnVtVmFsdWVCeU51bWJlcihFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgeworICAvLyBTa2lwIHZhbHVlcyB0aGF0IGFyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHNlcXVlbmNlLgorICBjb25zdCBpbnQgYmFzZSA9IHZhbHVlLT50eXBlKCktPnZhbHVlKDApLT5udW1iZXIoKTsKKyAgaWYgKGJhc2UgPD0gdmFsdWUtPm51bWJlcigpICYmCisgICAgICB2YWx1ZS0+bnVtYmVyKCkgPD0KKyAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihiYXNlKSArIHZhbHVlLT50eXBlKCktPnNlcXVlbnRpYWxfdmFsdWVfbGltaXRfKQorICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZW51bV92YWx1ZXNfYnlfbnVtYmVyXy5pbnNlcnQoU3ltYm9sOjpFbnVtVmFsdWUodmFsdWUsIDApKS5zZWNvbmQ7Cit9CisKK2Jvb2wgRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6QWRkRXh0ZW5zaW9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgRGVzY3JpcHRvckludFBhaXIga2V5KGZpZWxkLT5jb250YWluaW5nX3R5cGUoKSwgZmllbGQtPm51bWJlcigpKTsKKyAgaWYgKEluc2VydElmTm90UHJlc2VudCgmZXh0ZW5zaW9uc18sIGtleSwgZmllbGQpKSB7CisgICAgZXh0ZW5zaW9uc19hZnRlcl9jaGVja3BvaW50Xy5wdXNoX2JhY2soa2V5KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK1R5cGUqIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFsbG9jYXRlKCkgeworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZTxUeXBlPjo6dmFsdWUsICIiKTsKKyAgc3RhdGljX2Fzc2VydChhbGlnbm9mKFR5cGUpIDw9IDgsICIiKTsKKyAgcmV0dXJuIDo6bmV3IChBbGxvY2F0ZUJ5dGVzKHNpemVvZihUeXBlKSkpIFR5cGV7fTsKK30KKwordm9pZCogRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6QWxsb2NhdGVCeXRlcyhpbnQgc2l6ZSkgeworICBpZiAoc2l6ZSA9PSAwKSByZXR1cm4gbnVsbHB0cjsKKyAgdm9pZCogcCA9IDo6b3BlcmF0b3IgbmV3KHNpemUgKyBSb3VuZFVwVG88OD4oc2l6ZW9mKGludCkpKTsKKyAgaW50KiBzaXplcCA9IHN0YXRpY19jYXN0PGludCo+KHApOworICBtaXNjX2FsbG9jc18uZW1wbGFjZV9iYWNrKHNpemVwKTsKKyAgKnNpemVwID0gc2l6ZTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXIqPihwKSArIFJvdW5kVXBUbzw4PihzaXplb2YoaW50KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgoraW50ZXJuYWw6OkZsYXRBbGxvY2F0b3I6OkFsbG9jYXRpb24qIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkNyZWF0ZUZsYXRBbGxvYygKKyAgICBjb25zdCBUeXBlTWFwPEludFQsIFQuLi4+JiBzaXplcykgeworICBhdXRvIGVuZHMgPSBDYWxjdWxhdGVFbmRzKHNpemVzKTsKKyAgdXNpbmcgRmxhdEFsbG9jID0gaW50ZXJuYWw6OkZsYXRBbGxvY2F0b3I6OkFsbG9jYXRpb247CisKKyAgaW50IGxhc3RfZW5kID0gZW5kcy50ZW1wbGF0ZSBHZXQ8CisgICAgICB0eXBlbmFtZSBzdGQ6OnR1cGxlX2VsZW1lbnQ8c2l6ZW9mLi4uKFQpIC0gMSwgc3RkOjp0dXBsZTxULi4uPj46OnR5cGU+KCk7CisgIHNpemVfdCB0b3RhbF9zaXplID0KKyAgICAgIGxhc3RfZW5kICsgUm91bmRVcFRvPEZsYXRBbGxvYzo6a01heEFsaWduPihzaXplb2YoRmxhdEFsbG9jKSk7CisgIGNoYXIqIGRhdGEgPSBzdGF0aWNfY2FzdDxjaGFyKj4oOjpvcGVyYXRvciBuZXcodG90YWxfc2l6ZSkpOworICBhdXRvKiByZXMgPSA6Om5ldyAoZGF0YSkgRmxhdEFsbG9jKGVuZHMpOworICBmbGF0X2FsbG9jc18uZW1wbGFjZV9iYWNrKHJlcyk7CisKKyAgcmV0dXJuIHJlczsKK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclRhYmxlczo6QnVpbGRMb2NhdGlvbnNCeVBhdGgoCisgICAgc3RkOjpwYWlyPGNvbnN0IEZpbGVEZXNjcmlwdG9yVGFibGVzKiwgY29uc3QgU291cmNlQ29kZUluZm8qPiogcCkgeworICBmb3IgKGludCBpID0gMCwgbGVuID0gcC0+c2Vjb25kLT5sb2NhdGlvbl9zaXplKCk7IGkgPCBsZW47ICsraSkgeworICAgIGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBsb2MgPSAmcC0+c2Vjb25kLT5sb2NhdGlvbigpLkdldChpKTsKKyAgICBwLT5maXJzdC0+bG9jYXRpb25zX2J5X3BhdGhfW0pvaW4obG9jLT5wYXRoKCksICIsIildID0gbG9jOworICB9Cit9CisKK2NvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBGaWxlRGVzY3JpcHRvclRhYmxlczo6R2V0U291cmNlTG9jYXRpb24oCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgcGF0aCwgY29uc3QgU291cmNlQ29kZUluZm8qIGluZm8pIGNvbnN0IHsKKyAgc3RkOjpwYWlyPGNvbnN0IEZpbGVEZXNjcmlwdG9yVGFibGVzKiwgY29uc3QgU291cmNlQ29kZUluZm8qPiBwKAorICAgICAgc3RkOjptYWtlX3BhaXIodGhpcywgaW5mbykpOworICBpbnRlcm5hbDo6Y2FsbF9vbmNlKGxvY2F0aW9uc19ieV9wYXRoX29uY2VfLAorICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpCdWlsZExvY2F0aW9uc0J5UGF0aCwgJnApOworICByZXR1cm4gRmluZFB0ck9yTnVsbChsb2NhdGlvbnNfYnlfcGF0aF8sIEpvaW4ocGF0aCwgIiwiKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERlc2NyaXB0b3JQb29sCisKK0Rlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6fkVycm9yQ29sbGVjdG9yKCkge30KKworRGVzY3JpcHRvclBvb2w6OkRlc2NyaXB0b3JQb29sKCkKKyAgICA6IG11dGV4XyhudWxscHRyKSwKKyAgICAgIGZhbGxiYWNrX2RhdGFiYXNlXyhudWxscHRyKSwKKyAgICAgIGRlZmF1bHRfZXJyb3JfY29sbGVjdG9yXyhudWxscHRyKSwKKyAgICAgIHVuZGVybGF5XyhudWxscHRyKSwKKyAgICAgIHRhYmxlc18obmV3IFRhYmxlcyksCisgICAgICBlbmZvcmNlX2RlcGVuZGVuY2llc18odHJ1ZSksCisgICAgICBsYXppbHlfYnVpbGRfZGVwZW5kZW5jaWVzXyhmYWxzZSksCisgICAgICBhbGxvd191bmtub3duXyhmYWxzZSksCisgICAgICBlbmZvcmNlX3dlYWtfKGZhbHNlKSwKKyAgICAgIGRpc2FsbG93X2VuZm9yY2VfdXRmOF8oZmFsc2UpIHt9CisKK0Rlc2NyaXB0b3JQb29sOjpEZXNjcmlwdG9yUG9vbChEZXNjcmlwdG9yRGF0YWJhc2UqIGZhbGxiYWNrX2RhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpCisgICAgOiBtdXRleF8obmV3IGludGVybmFsOjpXcmFwcGVkTXV0ZXgpLAorICAgICAgZmFsbGJhY2tfZGF0YWJhc2VfKGZhbGxiYWNrX2RhdGFiYXNlKSwKKyAgICAgIGRlZmF1bHRfZXJyb3JfY29sbGVjdG9yXyhlcnJvcl9jb2xsZWN0b3IpLAorICAgICAgdW5kZXJsYXlfKG51bGxwdHIpLAorICAgICAgdGFibGVzXyhuZXcgVGFibGVzKSwKKyAgICAgIGVuZm9yY2VfZGVwZW5kZW5jaWVzXyh0cnVlKSwKKyAgICAgIGxhemlseV9idWlsZF9kZXBlbmRlbmNpZXNfKGZhbHNlKSwKKyAgICAgIGFsbG93X3Vua25vd25fKGZhbHNlKSwKKyAgICAgIGVuZm9yY2Vfd2Vha18oZmFsc2UpLAorICAgICAgZGlzYWxsb3dfZW5mb3JjZV91dGY4XyhmYWxzZSkge30KKworRGVzY3JpcHRvclBvb2w6OkRlc2NyaXB0b3JQb29sKGNvbnN0IERlc2NyaXB0b3JQb29sKiB1bmRlcmxheSkKKyAgICA6IG11dGV4XyhudWxscHRyKSwKKyAgICAgIGZhbGxiYWNrX2RhdGFiYXNlXyhudWxscHRyKSwKKyAgICAgIGRlZmF1bHRfZXJyb3JfY29sbGVjdG9yXyhudWxscHRyKSwKKyAgICAgIHVuZGVybGF5Xyh1bmRlcmxheSksCisgICAgICB0YWJsZXNfKG5ldyBUYWJsZXMpLAorICAgICAgZW5mb3JjZV9kZXBlbmRlbmNpZXNfKHRydWUpLAorICAgICAgbGF6aWx5X2J1aWxkX2RlcGVuZGVuY2llc18oZmFsc2UpLAorICAgICAgYWxsb3dfdW5rbm93bl8oZmFsc2UpLAorICAgICAgZW5mb3JjZV93ZWFrXyhmYWxzZSksCisgICAgICBkaXNhbGxvd19lbmZvcmNlX3V0ZjhfKGZhbHNlKSB7fQorCitEZXNjcmlwdG9yUG9vbDo6fkRlc2NyaXB0b3JQb29sKCkgeworICBpZiAobXV0ZXhfICE9IG51bGxwdHIpIGRlbGV0ZSBtdXRleF87Cit9CisKKy8vIERlc2NyaXB0b3JQb29sOjpCdWlsZEZpbGUoKSBkZWZpbmVkIGxhdGVyLgorLy8gRGVzY3JpcHRvclBvb2w6OkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoKSBkZWZpbmVkIGxhdGVyLgorCit2b2lkIERlc2NyaXB0b3JQb29sOjpJbnRlcm5hbERvbnRFbmZvcmNlRGVwZW5kZW5jaWVzKCkgeworICBlbmZvcmNlX2RlcGVuZGVuY2llc18gPSBmYWxzZTsKK30KKwordm9pZCBEZXNjcmlwdG9yUG9vbDo6QWRkVW51c2VkSW1wb3J0VHJhY2tGaWxlKENvbnN0U3RyaW5nUGFyYW0gZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXJyb3IpIHsKKyAgdW51c2VkX2ltcG9ydF90cmFja19maWxlc19bc3RkOjpzdHJpbmcoZmlsZV9uYW1lKV0gPSBpc19lcnJvcjsKK30KKwordm9pZCBEZXNjcmlwdG9yUG9vbDo6Q2xlYXJVbnVzZWRJbXBvcnRUcmFja0ZpbGVzKCkgeworICB1bnVzZWRfaW1wb3J0X3RyYWNrX2ZpbGVzXy5jbGVhcigpOworfQorCitib29sIERlc2NyaXB0b3JQb29sOjpJbnRlcm5hbElzRmlsZUxvYWRlZChDb25zdFN0cmluZ1BhcmFtIGZpbGVuYW1lKSBjb25zdCB7CisgIE11dGV4TG9ja01heWJlIGxvY2sobXV0ZXhfKTsKKyAgcmV0dXJuIHRhYmxlc18tPkZpbmRGaWxlKGZpbGVuYW1lKSAhPSBudWxscHRyOworfQorCisvLyBnZW5lcmF0ZWRfcG9vbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK25hbWVzcGFjZSB7CisKKworRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZSogR2VuZXJhdGVkRGF0YWJhc2UoKSB7CisgIHN0YXRpYyBhdXRvIGdlbmVyYXRlZF9kYXRhYmFzZSA9CisgICAgICBpbnRlcm5hbDo6T25TaHV0ZG93bkRlbGV0ZShuZXcgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZSgpKTsKKyAgcmV0dXJuIGdlbmVyYXRlZF9kYXRhYmFzZTsKK30KKworRGVzY3JpcHRvclBvb2wqIE5ld0dlbmVyYXRlZFBvb2woKSB7CisgIGF1dG8gZ2VuZXJhdGVkX3Bvb2wgPSBuZXcgRGVzY3JpcHRvclBvb2woR2VuZXJhdGVkRGF0YWJhc2UoKSk7CisgIGdlbmVyYXRlZF9wb29sLT5JbnRlcm5hbFNldExhemlseUJ1aWxkRGVwZW5kZW5jaWVzKCk7CisgIHJldHVybiBnZW5lcmF0ZWRfcG9vbDsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitEZXNjcmlwdG9yRGF0YWJhc2UqIERlc2NyaXB0b3JQb29sOjppbnRlcm5hbF9nZW5lcmF0ZWRfZGF0YWJhc2UoKSB7CisgIHJldHVybiBHZW5lcmF0ZWREYXRhYmFzZSgpOworfQorCitEZXNjcmlwdG9yUG9vbCogRGVzY3JpcHRvclBvb2w6OmludGVybmFsX2dlbmVyYXRlZF9wb29sKCkgeworICBzdGF0aWMgRGVzY3JpcHRvclBvb2wqIGdlbmVyYXRlZF9wb29sID0KKyAgICAgIGludGVybmFsOjpPblNodXRkb3duRGVsZXRlKE5ld0dlbmVyYXRlZFBvb2woKSk7CisgIHJldHVybiBnZW5lcmF0ZWRfcG9vbDsKK30KKworY29uc3QgRGVzY3JpcHRvclBvb2wqIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpIHsKKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wgPSBpbnRlcm5hbF9nZW5lcmF0ZWRfcG9vbCgpOworICAvLyBFbnN1cmUgdGhhdCBkZXNjcmlwdG9yLnByb3RvIGhhcyBiZWVuIHJlZ2lzdGVyZWQgaW4gdGhlIGdlbmVyYXRlZCBwb29sLgorICBEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKTsKKyAgcmV0dXJuIHBvb2w7Cit9CisKKwordm9pZCBEZXNjcmlwdG9yUG9vbDo6SW50ZXJuYWxBZGRHZW5lcmF0ZWRGaWxlKAorICAgIGNvbnN0IHZvaWQqIGVuY29kZWRfZmlsZV9kZXNjcmlwdG9yLCBpbnQgc2l6ZSkgeworICAvLyBTbywgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIHByb2Nlc3Mgb2YgaW5pdGlhbGl6aW5nIHRoZQorICAvLyBkZXNjcmlwdG9ycyBmb3IgZ2VuZXJhdGVkIHByb3RvIGNsYXNzZXMuICBFYWNoIGdlbmVyYXRlZCAucGIuY2MgZmlsZQorICAvLyBoYXMgYW4gaW50ZXJuYWwgcHJvY2VkdXJlIGNhbGxlZCBBZGREZXNjcmlwdG9ycygpIHdoaWNoIGlzIGNhbGxlZCBhdAorICAvLyBwcm9jZXNzIHN0YXJ0dXAsIGFuZCB0aGF0IGZ1bmN0aW9uIGNhbGxzIHRoaXMgb25lIGluIG9yZGVyIHRvIHJlZ2lzdGVyCisgIC8vIHRoZSByYXcgYnl0ZXMgb2YgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gcmVwcmVzZW50aW5nIHRoZSBmaWxlLgorICAvLworICAvLyBXZSBkbyBub3QgYWN0dWFsbHkgY29uc3RydWN0IHRoZSBkZXNjcmlwdG9yIG9iamVjdHMgcmlnaHQgYXdheS4gIFdlIGp1c3QKKyAgLy8gaGFuZyBvbiB0byB0aGUgYnl0ZXMgdW50aWwgdGhleSBhcmUgYWN0dWFsbHkgbmVlZGVkLiAgV2UgYWN0dWFsbHkgY29uc3RydWN0CisgIC8vIHRoZSBkZXNjcmlwdG9yIHRoZSBmaXJzdCB0aW1lIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRoaW5ncyBoYXBwZW5zOgorICAvLyAqIFNvbWVvbmUgY2FsbHMgYSBtZXRob2QgbGlrZSBkZXNjcmlwdG9yKCksIEdldERlc2NyaXB0b3IoKSwgb3IKKyAgLy8gICBHZXRSZWZsZWN0aW9uKCkgb24gdGhlIGdlbmVyYXRlZCB0eXBlcywgd2hpY2ggcmVxdWlyZXMgcmV0dXJuaW5nIHRoZQorICAvLyAgIGRlc2NyaXB0b3Igb3IgYW4gb2JqZWN0IGJhc2VkIG9uIGl0LgorICAvLyAqIFNvbWVvbmUgbG9va3MgdXAgdGhlIGRlc2NyaXB0b3IgaW4gRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkuCisgIC8vCisgIC8vIE9uY2Ugb25lIG9mIHRoZXNlIGhhcHBlbnMsIHRoZSBEZXNjcmlwdG9yUG9vbCBhY3R1YWxseSBwYXJzZXMgdGhlCisgIC8vIEZpbGVEZXNjcmlwdG9yUHJvdG8gYW5kIGdlbmVyYXRlcyBhIEZpbGVEZXNjcmlwdG9yIChhbmQgYWxsIGl0cyBjaGlsZHJlbikKKyAgLy8gYmFzZWQgb24gaXQuCisgIC8vCisgIC8vIE5vdGUgdGhhdCBGaWxlRGVzY3JpcHRvclByb3RvIGlzIGl0c2VsZiBhIGdlbmVyYXRlZCBwcm90b2NvbCBtZXNzYWdlLgorICAvLyBUaGVyZWZvcmUsIHdoZW4gd2UgcGFyc2Ugb25lLCB3ZSBoYXZlIHRvIGJlIHZlcnkgY2FyZWZ1bCB0byBhdm9pZCB1c2luZworICAvLyBhbnkgZGVzY3JpcHRvci1iYXNlZCBvcGVyYXRpb25zLCBzaW5jZSB0aGlzIG1pZ2h0IGNhdXNlIGluZmluaXRlIHJlY3Vyc2lvbgorICAvLyBvciBkZWFkbG9jay4KKyAgR09PR0xFX0NIRUNLKEdlbmVyYXRlZERhdGFiYXNlKCktPkFkZChlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgc2l6ZSkpOworfQorCisKKy8vIEZpbmQqQnkqIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVE9ETyhrZW50b24pOiAgVGhlcmUncyBhIGxvdCBvZiByZXBlYXRlZCBjb2RlIGhlcmUsIGJ1dCBJJ20gbm90IHN1cmUgaWYKKy8vICAgdGhlcmUncyBhbnkgZ29vZCB3YXkgdG8gZmFjdG9yIGl0IG91dC4gIFRoaW5rIGFib3V0IHRoaXMgc29tZSB0aW1lIHdoZW4KKy8vICAgdGhlcmUncyBub3RoaW5nIG1vcmUgaW1wb3J0YW50IHRvIGRvIChyZWFkOiBuZXZlcikuCisKK2NvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZEZpbGVCeU5hbWUoCisgICAgQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSBjb25zdCB7CisgIE11dGV4TG9ja01heWJlIGxvY2sobXV0ZXhfKTsKKyAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyAhPSBudWxscHRyKSB7CisgICAgdGFibGVzXy0+a25vd25fYmFkX3N5bWJvbHNfLmNsZWFyKCk7CisgICAgdGFibGVzXy0+a25vd25fYmFkX2ZpbGVzXy5jbGVhcigpOworICB9CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiByZXN1bHQgPSB0YWJsZXNfLT5GaW5kRmlsZShuYW1lKTsKKyAgaWYgKHJlc3VsdCAhPSBudWxscHRyKSByZXR1cm4gcmVzdWx0OworICBpZiAodW5kZXJsYXlfICE9IG51bGxwdHIpIHsKKyAgICByZXN1bHQgPSB1bmRlcmxheV8tPkZpbmRGaWxlQnlOYW1lKG5hbWUpOworICAgIGlmIChyZXN1bHQgIT0gbnVsbHB0cikgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBpZiAoVHJ5RmluZEZpbGVJbkZhbGxiYWNrRGF0YWJhc2UobmFtZSkpIHsKKyAgICByZXN1bHQgPSB0YWJsZXNfLT5GaW5kRmlsZShuYW1lKTsKKyAgICBpZiAocmVzdWx0ICE9IG51bGxwdHIpIHJldHVybiByZXN1bHQ7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgIENvbnN0U3RyaW5nUGFyYW0gc3ltYm9sX25hbWUpIGNvbnN0IHsKKyAgTXV0ZXhMb2NrTWF5YmUgbG9jayhtdXRleF8pOworICBpZiAoZmFsbGJhY2tfZGF0YWJhc2VfICE9IG51bGxwdHIpIHsKKyAgICB0YWJsZXNfLT5rbm93bl9iYWRfc3ltYm9sc18uY2xlYXIoKTsKKyAgICB0YWJsZXNfLT5rbm93bl9iYWRfZmlsZXNfLmNsZWFyKCk7CisgIH0KKyAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRTeW1ib2woc3ltYm9sX25hbWUpOworICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgcmV0dXJuIHJlc3VsdC5HZXRGaWxlKCk7CisgIGlmICh1bmRlcmxheV8gIT0gbnVsbHB0cikgeworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlX3Jlc3VsdCA9CisgICAgICAgIHVuZGVybGF5Xy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKHN5bWJvbF9uYW1lKTsKKyAgICBpZiAoZmlsZV9yZXN1bHQgIT0gbnVsbHB0cikgcmV0dXJuIGZpbGVfcmVzdWx0OworICB9CisgIGlmIChUcnlGaW5kU3ltYm9sSW5GYWxsYmFja0RhdGFiYXNlKHN5bWJvbF9uYW1lKSkgeworICAgIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRTeW1ib2woc3ltYm9sX25hbWUpOworICAgIGlmICghcmVzdWx0LklzTnVsbCgpKSByZXR1cm4gcmVzdWx0LkdldEZpbGUoKTsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKworY29uc3QgRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICBDb25zdFN0cmluZ1BhcmFtIG5hbWUpIGNvbnN0IHsKKyAgcmV0dXJuIHRhYmxlc18tPkZpbmRCeU5hbWVIZWxwZXIodGhpcywgbmFtZSkuZGVzY3JpcHRvcigpOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kRmllbGRCeU5hbWUoCisgICAgQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSBjb25zdCB7CisgIGlmIChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KKyAgICAgICAgICB0YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHRoaXMsIG5hbWUpLmZpZWxkX2Rlc2NyaXB0b3IoKSkgeworICAgIGlmICghZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgICByZXR1cm4gZmllbGQ7CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgIENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgY29uc3QgeworICBpZiAoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9CisgICAgICAgICAgdGFibGVzXy0+RmluZEJ5TmFtZUhlbHBlcih0aGlzLCBuYW1lKS5maWVsZF9kZXNjcmlwdG9yKCkpIHsKKyAgICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgICByZXR1cm4gZmllbGQ7CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCitjb25zdCBPbmVvZkRlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kT25lb2ZCeU5hbWUoCisgICAgQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSBjb25zdCB7CisgIHJldHVybiB0YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHRoaXMsIG5hbWUpLm9uZW9mX2Rlc2NyaXB0b3IoKTsKK30KKworY29uc3QgRW51bURlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kRW51bVR5cGVCeU5hbWUoCisgICAgQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSBjb25zdCB7CisgIHJldHVybiB0YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHRoaXMsIG5hbWUpLmVudW1fZGVzY3JpcHRvcigpOworfQorCitjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZEVudW1WYWx1ZUJ5TmFtZSgKKyAgICBDb25zdFN0cmluZ1BhcmFtIG5hbWUpIGNvbnN0IHsKKyAgcmV0dXJuIHRhYmxlc18tPkZpbmRCeU5hbWVIZWxwZXIodGhpcywgbmFtZSkuZW51bV92YWx1ZV9kZXNjcmlwdG9yKCk7Cit9CisKK2NvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZFNlcnZpY2VCeU5hbWUoCisgICAgQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSBjb25zdCB7CisgIHJldHVybiB0YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHRoaXMsIG5hbWUpLnNlcnZpY2VfZGVzY3JpcHRvcigpOworfQorCitjb25zdCBNZXRob2REZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZE1ldGhvZEJ5TmFtZSgKKyAgICBDb25zdFN0cmluZ1BhcmFtIG5hbWUpIGNvbnN0IHsKKyAgcmV0dXJuIHRhYmxlc18tPkZpbmRCeU5hbWVIZWxwZXIodGhpcywgbmFtZSkubWV0aG9kX2Rlc2NyaXB0b3IoKTsKK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZEV4dGVuc2lvbkJ5TnVtYmVyKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLCBpbnQgbnVtYmVyKSBjb25zdCB7CisgIGlmIChleHRlbmRlZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPT0gMCkgcmV0dXJuIG51bGxwdHI7CisgIC8vIEEgZmFzdGVyIHBhdGggdG8gcmVkdWNlIGxvY2sgY29udGVudGlvbiBpbiBmaW5kaW5nIGV4dGVuc2lvbnMsIGFzc3VtaW5nCisgIC8vIG1vc3QgZXh0ZW5zaW9ucyB3aWxsIGJlIGNhY2hlIGhpdC4KKyAgaWYgKG11dGV4XyAhPSBudWxscHRyKSB7CisgICAgUmVhZGVyTXV0ZXhMb2NrIGxvY2sobXV0ZXhfKTsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRFeHRlbnNpb24oZXh0ZW5kZWUsIG51bWJlcik7CisgICAgaWYgKHJlc3VsdCAhPSBudWxscHRyKSB7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgfQorICBNdXRleExvY2tNYXliZSBsb2NrKG11dGV4Xyk7CisgIGlmIChmYWxsYmFja19kYXRhYmFzZV8gIT0gbnVsbHB0cikgeworICAgIHRhYmxlc18tPmtub3duX2JhZF9zeW1ib2xzXy5jbGVhcigpOworICAgIHRhYmxlc18tPmtub3duX2JhZF9maWxlc18uY2xlYXIoKTsKKyAgfQorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRFeHRlbnNpb24oZXh0ZW5kZWUsIG51bWJlcik7CisgIGlmIChyZXN1bHQgIT0gbnVsbHB0cikgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgaWYgKHVuZGVybGF5XyAhPSBudWxscHRyKSB7CisgICAgcmVzdWx0ID0gdW5kZXJsYXlfLT5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZXh0ZW5kZWUsIG51bWJlcik7CisgICAgaWYgKHJlc3VsdCAhPSBudWxscHRyKSByZXR1cm4gcmVzdWx0OworICB9CisgIGlmIChUcnlGaW5kRXh0ZW5zaW9uSW5GYWxsYmFja0RhdGFiYXNlKGV4dGVuZGVlLCBudW1iZXIpKSB7CisgICAgcmVzdWx0ID0gdGFibGVzXy0+RmluZEV4dGVuc2lvbihleHRlbmRlZSwgbnVtYmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpJbnRlcm5hbEZpbmRFeHRlbnNpb25CeU51bWJlck5vTG9jaygKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwgaW50IG51bWJlcikgY29uc3QgeworICBpZiAoZXh0ZW5kZWUtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID09IDApIHJldHVybiBudWxscHRyOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0gdGFibGVzXy0+RmluZEV4dGVuc2lvbihleHRlbmRlZSwgbnVtYmVyKTsKKyAgaWYgKHJlc3VsdCAhPSBudWxscHRyKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGlmICh1bmRlcmxheV8gIT0gbnVsbHB0cikgeworICAgIHJlc3VsdCA9IHVuZGVybGF5Xy0+SW50ZXJuYWxGaW5kRXh0ZW5zaW9uQnlOdW1iZXJOb0xvY2soZXh0ZW5kZWUsIG51bWJlcik7CisgICAgaWYgKHJlc3VsdCAhPSBudWxscHRyKSByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkZpbmRFeHRlbnNpb25CeVByaW50YWJsZU5hbWUoCisgICAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUsIENvbnN0U3RyaW5nUGFyYW0gcHJpbnRhYmxlX25hbWUpIGNvbnN0IHsKKyAgaWYgKGV4dGVuZGVlLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA9PSAwKSByZXR1cm4gbnVsbHB0cjsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPSBGaW5kRXh0ZW5zaW9uQnlOYW1lKHByaW50YWJsZV9uYW1lKTsKKyAgaWYgKHJlc3VsdCAhPSBudWxscHRyICYmIHJlc3VsdC0+Y29udGFpbmluZ190eXBlKCkgPT0gZXh0ZW5kZWUpIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIGlmIChleHRlbmRlZS0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICAvLyBNZXNzYWdlU2V0IGV4dGVuc2lvbnMgbWF5IGJlIGlkZW50aWZpZWQgYnkgdHlwZSBuYW1lLgorICAgIGNvbnN0IERlc2NyaXB0b3IqIHR5cGUgPSBGaW5kTWVzc2FnZVR5cGVCeU5hbWUocHJpbnRhYmxlX25hbWUpOworICAgIGlmICh0eXBlICE9IG51bGxwdHIpIHsKKyAgICAgIC8vIExvb2sgZm9yIGEgbWF0Y2hpbmcgZXh0ZW5zaW9uIGluIHRoZSBmb3JlaWduIHR5cGUncyBzY29wZS4KKyAgICAgIGNvbnN0IGludCB0eXBlX2V4dGVuc2lvbl9jb3VudCA9IHR5cGUtPmV4dGVuc2lvbl9jb3VudCgpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlX2V4dGVuc2lvbl9jb3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uID0gdHlwZS0+ZXh0ZW5zaW9uKGkpOworICAgICAgICBpZiAoZXh0ZW5zaW9uLT5jb250YWluaW5nX3R5cGUoKSA9PSBleHRlbmRlZSAmJgorICAgICAgICAgICAgZXh0ZW5zaW9uLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgJiYKKyAgICAgICAgICAgIGV4dGVuc2lvbi0+aXNfb3B0aW9uYWwoKSAmJiBleHRlbnNpb24tPm1lc3NhZ2VfdHlwZSgpID09IHR5cGUpIHsKKyAgICAgICAgICAvLyBGb3VuZCBpdC4KKyAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIERlc2NyaXB0b3JQb29sOjpGaW5kQWxsRXh0ZW5zaW9ucygKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogb3V0KSBjb25zdCB7CisgIE11dGV4TG9ja01heWJlIGxvY2sobXV0ZXhfKTsKKyAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyAhPSBudWxscHRyKSB7CisgICAgdGFibGVzXy0+a25vd25fYmFkX3N5bWJvbHNfLmNsZWFyKCk7CisgICAgdGFibGVzXy0+a25vd25fYmFkX2ZpbGVzXy5jbGVhcigpOworICB9CisKKyAgLy8gSW5pdGlhbGl6ZSB0YWJsZXNfLT5leHRlbnNpb25zXyBmcm9tIHRoZSBmYWxsYmFjayBkYXRhYmFzZSBmaXJzdAorICAvLyAoYnV0IGRvIHRoaXMgb25seSBvbmNlIHBlciBkZXNjcmlwdG9yKS4KKyAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyAhPSBudWxscHRyICYmCisgICAgICB0YWJsZXNfLT5leHRlbnNpb25zX2xvYWRlZF9mcm9tX2RiXy5jb3VudChleHRlbmRlZSkgPT0gMCkgeworICAgIHN0ZDo6dmVjdG9yPGludD4gbnVtYmVyczsKKyAgICBpZiAoZmFsbGJhY2tfZGF0YWJhc2VfLT5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhleHRlbmRlZS0+ZnVsbF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlcnMpKSB7CisgICAgICBmb3IgKGludCBudW1iZXIgOiBudW1iZXJzKSB7CisgICAgICAgIGlmICh0YWJsZXNfLT5GaW5kRXh0ZW5zaW9uKGV4dGVuZGVlLCBudW1iZXIpID09IG51bGxwdHIpIHsKKyAgICAgICAgICBUcnlGaW5kRXh0ZW5zaW9uSW5GYWxsYmFja0RhdGFiYXNlKGV4dGVuZGVlLCBudW1iZXIpOworICAgICAgICB9CisgICAgICB9CisgICAgICB0YWJsZXNfLT5leHRlbnNpb25zX2xvYWRlZF9mcm9tX2RiXy5pbnNlcnQoZXh0ZW5kZWUpOworICAgIH0KKyAgfQorCisgIHRhYmxlc18tPkZpbmRBbGxFeHRlbnNpb25zKGV4dGVuZGVlLCBvdXQpOworICBpZiAodW5kZXJsYXlfICE9IG51bGxwdHIpIHsKKyAgICB1bmRlcmxheV8tPkZpbmRBbGxFeHRlbnNpb25zKGV4dGVuZGVlLCBvdXQpOworICB9Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIERlc2NyaXB0b3I6OkZpbmRGaWVsZEJ5TnVtYmVyKGludCBrZXkpIGNvbnN0IHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPSBmaWxlKCktPnRhYmxlc18tPkZpbmRGaWVsZEJ5TnVtYmVyKHRoaXMsIGtleSk7CisgIGlmIChyZXN1bHQgPT0gbnVsbHB0ciB8fCByZXN1bHQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIERlc2NyaXB0b3I6OkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgKKyAgICBDb25zdFN0cmluZ1BhcmFtIGtleSkgY29uc3QgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9CisgICAgICBmaWxlKCktPnRhYmxlc18tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSh0aGlzLCBrZXkpOworICBpZiAocmVzdWx0ID09IG51bGxwdHIgfHwgcmVzdWx0LT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9IGVsc2UgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKiBEZXNjcmlwdG9yOjpGaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoCisgICAgQ29uc3RTdHJpbmdQYXJhbSBrZXkpIGNvbnN0IHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPQorICAgICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUodGhpcywga2V5KTsKKyAgaWYgKHJlc3VsdCA9PSBudWxscHRyIHx8IHJlc3VsdC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvciogRGVzY3JpcHRvcjo6RmluZEZpZWxkQnlOYW1lKENvbnN0U3RyaW5nUGFyYW0ga2V5KSBjb25zdCB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPQorICAgICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sKHRoaXMsIGtleSkuZmllbGRfZGVzY3JpcHRvcigpOworICByZXR1cm4gZmllbGQgIT0gbnVsbHB0ciAmJiAhZmllbGQtPmlzX2V4dGVuc2lvbigpID8gZmllbGQgOiBudWxscHRyOworfQorCitjb25zdCBPbmVvZkRlc2NyaXB0b3IqIERlc2NyaXB0b3I6OkZpbmRPbmVvZkJ5TmFtZShDb25zdFN0cmluZ1BhcmFtIGtleSkgY29uc3QgeworICByZXR1cm4gZmlsZSgpLT50YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sKHRoaXMsIGtleSkub25lb2ZfZGVzY3JpcHRvcigpOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIERlc2NyaXB0b3I6OkZpbmRFeHRlbnNpb25CeU5hbWUoCisgICAgQ29uc3RTdHJpbmdQYXJhbSBrZXkpIGNvbnN0IHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9CisgICAgICBmaWxlKCktPnRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2wodGhpcywga2V5KS5maWVsZF9kZXNjcmlwdG9yKCk7CisgIHJldHVybiBmaWVsZCAhPSBudWxscHRyICYmIGZpZWxkLT5pc19leHRlbnNpb24oKSA/IGZpZWxkIDogbnVsbHB0cjsKK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKiBEZXNjcmlwdG9yOjpGaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKAorICAgIENvbnN0U3RyaW5nUGFyYW0ga2V5KSBjb25zdCB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0KKyAgICAgIGZpbGUoKS0+dGFibGVzXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKHRoaXMsIGtleSk7CisgIGlmIChyZXN1bHQgPT0gbnVsbHB0ciB8fCAhcmVzdWx0LT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9IGVsc2UgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKiBEZXNjcmlwdG9yOjpGaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKAorICAgIENvbnN0U3RyaW5nUGFyYW0ga2V5KSBjb25zdCB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0KKyAgICAgIGZpbGUoKS0+dGFibGVzXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKHRoaXMsIGtleSk7CisgIGlmIChyZXN1bHQgPT0gbnVsbHB0ciB8fCAhcmVzdWx0LT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9IGVsc2UgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworY29uc3QgRGVzY3JpcHRvciogRGVzY3JpcHRvcjo6RmluZE5lc3RlZFR5cGVCeU5hbWUoQ29uc3RTdHJpbmdQYXJhbSBrZXkpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGUoKS0+dGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbCh0aGlzLCBrZXkpLmRlc2NyaXB0b3IoKTsKK30KKworY29uc3QgRW51bURlc2NyaXB0b3IqIERlc2NyaXB0b3I6OkZpbmRFbnVtVHlwZUJ5TmFtZSgKKyAgICBDb25zdFN0cmluZ1BhcmFtIGtleSkgY29uc3QgeworICByZXR1cm4gZmlsZSgpLT50YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sKHRoaXMsIGtleSkuZW51bV9kZXNjcmlwdG9yKCk7Cit9CisKK2NvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIERlc2NyaXB0b3I6OkZpbmRFbnVtVmFsdWVCeU5hbWUoCisgICAgQ29uc3RTdHJpbmdQYXJhbSBrZXkpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGUoKS0+dGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbCh0aGlzLCBrZXkpLmVudW1fdmFsdWVfZGVzY3JpcHRvcigpOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIERlc2NyaXB0b3I6Om1hcF9rZXkoKSBjb25zdCB7CisgIGlmICghb3B0aW9ucygpLm1hcF9lbnRyeSgpKSByZXR1cm4gbnVsbHB0cjsKKyAgR09PR0xFX0RDSEVDS19FUShmaWVsZF9jb3VudCgpLCAyKTsKKyAgcmV0dXJuIGZpZWxkKDApOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIERlc2NyaXB0b3I6Om1hcF92YWx1ZSgpIGNvbnN0IHsKKyAgaWYgKCFvcHRpb25zKCkubWFwX2VudHJ5KCkpIHJldHVybiBudWxscHRyOworICBHT09HTEVfRENIRUNLX0VRKGZpZWxkX2NvdW50KCksIDIpOworICByZXR1cm4gZmllbGQoMSk7Cit9CisKK2NvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEVudW1EZXNjcmlwdG9yOjpGaW5kVmFsdWVCeU5hbWUoCisgICAgQ29uc3RTdHJpbmdQYXJhbSBrZXkpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGUoKS0+dGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbCh0aGlzLCBrZXkpLmVudW1fdmFsdWVfZGVzY3JpcHRvcigpOworfQorCitjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBFbnVtRGVzY3JpcHRvcjo6RmluZFZhbHVlQnlOdW1iZXIoaW50IGtleSkgY29uc3QgeworICByZXR1cm4gZmlsZSgpLT50YWJsZXNfLT5GaW5kRW51bVZhbHVlQnlOdW1iZXIodGhpcywga2V5KTsKK30KKworY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogRW51bURlc2NyaXB0b3I6OkZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24oCisgICAgaW50IGtleSkgY29uc3QgeworICByZXR1cm4gZmlsZSgpLT50YWJsZXNfLT5GaW5kRW51bVZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bih0aGlzLCBrZXkpOworfQorCitjb25zdCBNZXRob2REZXNjcmlwdG9yKiBTZXJ2aWNlRGVzY3JpcHRvcjo6RmluZE1ldGhvZEJ5TmFtZSgKKyAgICBDb25zdFN0cmluZ1BhcmFtIGtleSkgY29uc3QgeworICByZXR1cm4gZmlsZSgpLT50YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sKHRoaXMsIGtleSkubWV0aG9kX2Rlc2NyaXB0b3IoKTsKK30KKworY29uc3QgRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3I6OkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICBDb25zdFN0cmluZ1BhcmFtIGtleSkgY29uc3QgeworICByZXR1cm4gdGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbCh0aGlzLCBrZXkpLmRlc2NyaXB0b3IoKTsKK30KKworY29uc3QgRW51bURlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yOjpGaW5kRW51bVR5cGVCeU5hbWUoCisgICAgQ29uc3RTdHJpbmdQYXJhbSBrZXkpIGNvbnN0IHsKKyAgcmV0dXJuIHRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2wodGhpcywga2V5KS5lbnVtX2Rlc2NyaXB0b3IoKTsKK30KKworY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3I6OkZpbmRFbnVtVmFsdWVCeU5hbWUoCisgICAgQ29uc3RTdHJpbmdQYXJhbSBrZXkpIGNvbnN0IHsKKyAgcmV0dXJuIHRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2wodGhpcywga2V5KS5lbnVtX3ZhbHVlX2Rlc2NyaXB0b3IoKTsKK30KKworY29uc3QgU2VydmljZURlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yOjpGaW5kU2VydmljZUJ5TmFtZSgKKyAgICBDb25zdFN0cmluZ1BhcmFtIGtleSkgY29uc3QgeworICByZXR1cm4gdGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbCh0aGlzLCBrZXkpLnNlcnZpY2VfZGVzY3JpcHRvcigpOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yOjpGaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgIENvbnN0U3RyaW5nUGFyYW0ga2V5KSBjb25zdCB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPQorICAgICAgdGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbCh0aGlzLCBrZXkpLmZpZWxkX2Rlc2NyaXB0b3IoKTsKKyAgcmV0dXJuIGZpZWxkICE9IG51bGxwdHIgJiYgZmllbGQtPmlzX2V4dGVuc2lvbigpID8gZmllbGQgOiBudWxscHRyOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yOjpGaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKAorICAgIENvbnN0U3RyaW5nUGFyYW0ga2V5KSBjb25zdCB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0gdGFibGVzXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKHRoaXMsIGtleSk7CisgIGlmIChyZXN1bHQgPT0gbnVsbHB0ciB8fCAhcmVzdWx0LT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9IGVsc2UgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaWxlRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgKKyAgICBDb25zdFN0cmluZ1BhcmFtIGtleSkgY29uc3QgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSh0aGlzLCBrZXkpOworICBpZiAocmVzdWx0ID09IG51bGxwdHIgfHwgIXJlc3VsdC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2U6OkNvcHlUbygKKyAgICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIHByb3RvKSBjb25zdCB7CisgIHByb3RvLT5zZXRfc3RhcnQodGhpcy0+c3RhcnQpOworICBwcm90by0+c2V0X2VuZCh0aGlzLT5lbmQpOworICBpZiAob3B0aW9uc18gIT0gJkV4dGVuc2lvblJhbmdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgKnByb3RvLT5tdXRhYmxlX29wdGlvbnMoKSA9ICpvcHRpb25zXzsKKyAgfQorfQorCitjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSoKK0Rlc2NyaXB0b3I6OkZpbmRFeHRlbnNpb25SYW5nZUNvbnRhaW5pbmdOdW1iZXIoaW50IG51bWJlcikgY29uc3QgeworICAvLyBMaW5lYXIgc2VhcmNoIHNob3VsZCBiZSBmaW5lIGJlY2F1c2Ugd2UgZG9uJ3QgZXhwZWN0IGEgbWVzc2FnZSB0byBoYXZlCisgIC8vIG1vcmUgdGhhbiBhIGNvdXBsZSBleHRlbnNpb24gcmFuZ2VzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAobnVtYmVyID49IGV4dGVuc2lvbl9yYW5nZShpKS0+c3RhcnQgJiYKKyAgICAgICAgbnVtYmVyIDwgZXh0ZW5zaW9uX3JhbmdlKGkpLT5lbmQpIHsKKyAgICAgIHJldHVybiBleHRlbnNpb25fcmFuZ2UoaSk7CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCitjb25zdCBEZXNjcmlwdG9yOjpSZXNlcnZlZFJhbmdlKiBEZXNjcmlwdG9yOjpGaW5kUmVzZXJ2ZWRSYW5nZUNvbnRhaW5pbmdOdW1iZXIoCisgICAgaW50IG51bWJlcikgY29uc3QgeworICAvLyBUT0RPKGNocmlzbik6IENvbnNpZGVyIGEgbm9uLWxpbmVhciBzZWFyY2guCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzZXJ2ZWRfcmFuZ2VfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKG51bWJlciA+PSByZXNlcnZlZF9yYW5nZShpKS0+c3RhcnQgJiYgbnVtYmVyIDwgcmVzZXJ2ZWRfcmFuZ2UoaSktPmVuZCkgeworICAgICAgcmV0dXJuIHJlc2VydmVkX3JhbmdlKGkpOworICAgIH0KKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKworY29uc3QgRW51bURlc2NyaXB0b3I6OlJlc2VydmVkUmFuZ2UqCitFbnVtRGVzY3JpcHRvcjo6RmluZFJlc2VydmVkUmFuZ2VDb250YWluaW5nTnVtYmVyKGludCBudW1iZXIpIGNvbnN0IHsKKyAgLy8gVE9ETyhjaHJpc24pOiBDb25zaWRlciBhIG5vbi1saW5lYXIgc2VhcmNoLgorICBmb3IgKGludCBpID0gMDsgaSA8IHJlc2VydmVkX3JhbmdlX2NvdW50KCk7IGkrKykgeworICAgIGlmIChudW1iZXIgPj0gcmVzZXJ2ZWRfcmFuZ2UoaSktPnN0YXJ0ICYmCisgICAgICAgIG51bWJlciA8PSByZXNlcnZlZF9yYW5nZShpKS0+ZW5kKSB7CisgICAgICByZXR1cm4gcmVzZXJ2ZWRfcmFuZ2UoaSk7CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Jvb2wgRGVzY3JpcHRvclBvb2w6OlRyeUZpbmRGaWxlSW5GYWxsYmFja0RhdGFiYXNlKAorICAgIFN0cmluZ1BpZWNlIG5hbWUpIGNvbnN0IHsKKyAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CisKKyAgYXV0byBuYW1lX3N0cmluZyA9IHN0ZDo6c3RyaW5nKG5hbWUpOworICBpZiAodGFibGVzXy0+a25vd25fYmFkX2ZpbGVzXy5jb3VudChuYW1lX3N0cmluZykgPiAwKSByZXR1cm4gZmFsc2U7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBpZiAoIWZhbGxiYWNrX2RhdGFiYXNlXy0+RmluZEZpbGVCeU5hbWUobmFtZV9zdHJpbmcsICZmaWxlX3Byb3RvKSB8fAorICAgICAgQnVpbGRGaWxlRnJvbURhdGFiYXNlKGZpbGVfcHJvdG8pID09IG51bGxwdHIpIHsKKyAgICB0YWJsZXNfLT5rbm93bl9iYWRfZmlsZXNfLmluc2VydChzdGQ6Om1vdmUobmFtZV9zdHJpbmcpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGVzY3JpcHRvclBvb2w6OklzU3ViU3ltYm9sT2ZCdWlsdFR5cGUoU3RyaW5nUGllY2UgbmFtZSkgY29uc3QgeworICBhdXRvIHByZWZpeCA9IHN0ZDo6c3RyaW5nKG5hbWUpOworICBmb3IgKDs7KSB7CisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gcHJlZml4LmZpbmRfbGFzdF9vZignLicpOworICAgIGlmIChkb3RfcG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcHJlZml4ID0gcHJlZml4LnN1YnN0cigwLCBkb3RfcG9zKTsKKyAgICBTeW1ib2wgc3ltYm9sID0gdGFibGVzXy0+RmluZFN5bWJvbChwcmVmaXgpOworICAgIC8vIElmIHRoZSBzeW1ib2wgdHlwZSBpcyBhbnl0aGluZyBvdGhlciB0aGFuIFBBQ0tBR0UsIHRoZW4gaXRzIGNvbXBsZXRlCisgICAgLy8gZGVmaW5pdGlvbiBpcyBhbHJlYWR5IGtub3duLgorICAgIGlmICghc3ltYm9sLklzTnVsbCgpICYmICFzeW1ib2wuSXNQYWNrYWdlKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICBpZiAodW5kZXJsYXlfICE9IG51bGxwdHIpIHsKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgYW55IHByZWZpeCBvZiB0aGlzIHN5bWJvbCBleGlzdHMgaW4gdGhlIHVuZGVybGF5LgorICAgIHJldHVybiB1bmRlcmxheV8tPklzU3ViU3ltYm9sT2ZCdWlsdFR5cGUobmFtZSk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIERlc2NyaXB0b3JQb29sOjpUcnlGaW5kU3ltYm9sSW5GYWxsYmFja0RhdGFiYXNlKAorICAgIFN0cmluZ1BpZWNlIG5hbWUpIGNvbnN0IHsKKyAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CisKKyAgYXV0byBuYW1lX3N0cmluZyA9IHN0ZDo6c3RyaW5nKG5hbWUpOworICBpZiAodGFibGVzXy0+a25vd25fYmFkX3N5bWJvbHNfLmNvdW50KG5hbWVfc3RyaW5nKSA+IDApIHJldHVybiBmYWxzZTsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIGlmICggIC8vIFdlIHNraXAgbG9va2luZyBpbiB0aGUgZmFsbGJhY2sgZGF0YWJhc2UgaWYgdGhlIG5hbWUgaXMgYSBzdWItc3ltYm9sCisgICAgICAgIC8vIG9mIGFueSBkZXNjcmlwdG9yIHRoYXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGRlc2NyaXB0b3IgcG9vbCAoZXhjZXB0CisgICAgICAgIC8vIGZvciBwYWNrYWdlIGRlc2NyaXB0b3JzKS4gIFRoaXMgaXMgdmFsaWQgYmVjYXVzZSBhbGwgc3ltYm9scyBleGNlcHQKKyAgICAgICAgLy8gZm9yIHBhY2thZ2VzIGFyZSBkZWZpbmVkIGluIGEgc2luZ2xlIGZpbGUsIHNvIGlmIHRoZSBzeW1ib2wgZXhpc3RzCisgICAgICAgIC8vIHRoZW4gd2Ugc2hvdWxkIGFscmVhZHkgaGF2ZSBpdHMgZGVmaW5pdGlvbi4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIG90aGVyIHJlYXNvbiB0byBkbyB0aGlzIGlzIHRvIHN1cHBvcnQgIm92ZXJyaWRpbmciIHR5cGUKKyAgICAgICAgLy8gZGVmaW5pdGlvbnMgYnkgbWVyZ2luZyB0d28gZGF0YWJhc2VzIHRoYXQgZGVmaW5lIHRoZSBzYW1lIHR5cGUuIChZZXMsCisgICAgICAgIC8vIHBlb3BsZSBkbyB0aGlzLikgIFRoZSBtYWluIGRpZmZpY3VsdHkgd2l0aCBtYWtpbmcgdGhpcyB3b3JrIGlzIHRoYXQKKyAgICAgICAgLy8gRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCkgaXMgYWxsb3dlZCB0byByZXR1cm4gYm90aCBmYWxzZSBwb3NpdGl2ZXMKKyAgICAgICAgLy8gKGUuZy4sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSwgVXBncmFkZWREZXNjcmlwdG9yRGF0YWJhc2UpIGFuZAorICAgICAgICAvLyBmYWxzZSBuZWdhdGl2ZXMgKGUuZy4gUHJvdG9GaWxlUGFyc2VyLCBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlKS4KKyAgICAgICAgLy8gV2hlbiB0d28gc3VjaCBkYXRhYmFzZXMgYXJlIG1lcmdlZCwgbG9va2luZyB1cCBhIG5vbi1leGlzdGVudAorICAgICAgICAvLyBzdWItc3ltYm9sIG9mIGEgdHlwZSB0aGF0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBkZXNjcmlwdG9yIHBvb2wgY2FuCisgICAgICAgIC8vIHJlc3VsdCBpbiBhbiBhdHRlbXB0IHRvIGxvYWQgbXVsdGlwbGUgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgdHlwZS4KKyAgICAgICAgLy8gVGhlIGNoZWNrIGJlbG93IGF2b2lkcyB0aGlzLgorICAgICAgSXNTdWJTeW1ib2xPZkJ1aWx0VHlwZShuYW1lKQorCisgICAgICAvLyBMb29rIHVwIGZpbGUgY29udGFpbmluZyB0aGlzIHN5bWJvbCBpbiBmYWxsYmFjayBkYXRhYmFzZS4KKyAgICAgIHx8ICFmYWxsYmFja19kYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChuYW1lX3N0cmluZywgJmZpbGVfcHJvdG8pCisKKyAgICAgIC8vIENoZWNrIGlmIHdlJ3ZlIGFscmVhZHkgYnVpbHQgdGhpcyBmaWxlLiBJZiBzbywgaXQgYXBwYXJlbnRseSBkb2Vzbid0CisgICAgICAvLyBjb250YWluIHRoZSBzeW1ib2wgd2UncmUgbG9va2luZyBmb3IuICBTb21lIERlc2NyaXB0b3JEYXRhYmFzZXMKKyAgICAgIC8vIHJldHVybiBmYWxzZSBwb3NpdGl2ZXMuCisgICAgICB8fCB0YWJsZXNfLT5GaW5kRmlsZShmaWxlX3Byb3RvLm5hbWUoKSkgIT0gbnVsbHB0cgorCisgICAgICAvLyBCdWlsZCB0aGUgZmlsZS4KKyAgICAgIHx8IEJ1aWxkRmlsZUZyb21EYXRhYmFzZShmaWxlX3Byb3RvKSA9PSBudWxscHRyKSB7CisgICAgdGFibGVzXy0+a25vd25fYmFkX3N5bWJvbHNfLmluc2VydChzdGQ6Om1vdmUobmFtZV9zdHJpbmcpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXNjcmlwdG9yUG9vbDo6VHJ5RmluZEV4dGVuc2lvbkluRmFsbGJhY2tEYXRhYmFzZSgKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsIGludCBmaWVsZF9udW1iZXIpIGNvbnN0IHsKKyAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBpZiAoIWZhbGxiYWNrX2RhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKAorICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZS0+ZnVsbF9uYW1lKCksIGZpZWxkX251bWJlciwgJmZpbGVfcHJvdG8pKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKHRhYmxlc18tPkZpbmRGaWxlKGZpbGVfcHJvdG8ubmFtZSgpKSAhPSBudWxscHRyKSB7CisgICAgLy8gV2UndmUgYWxyZWFkeSBsb2FkZWQgdGhpcyBmaWxlLCBhbmQgaXQgYXBwYXJlbnRseSBkb2Vzbid0IGNvbnRhaW4gdGhlCisgICAgLy8gZXh0ZW5zaW9uIHdlJ3JlIGxvb2tpbmcgZm9yLiAgU29tZSBEZXNjcmlwdG9yRGF0YWJhc2VzIHJldHVybiBmYWxzZQorICAgIC8vIHBvc2l0aXZlcy4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoQnVpbGRGaWxlRnJvbURhdGFiYXNlKGZpbGVfcHJvdG8pID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitib29sIEZpZWxkRGVzY3JpcHRvcjo6aXNfbWFwX21lc3NhZ2VfdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHR5cGVfZGVzY3JpcHRvcl8ubWVzc2FnZV90eXBlLT5vcHRpb25zKCkubWFwX2VudHJ5KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEZpZWxkRGVzY3JpcHRvcjo6RGVmYXVsdFZhbHVlQXNTdHJpbmcoCisgICAgYm9vbCBxdW90ZV9zdHJpbmdfdHlwZSkgY29uc3QgeworICBHT09HTEVfQ0hFQ0soaGFzX2RlZmF1bHRfdmFsdWUoKSkgPDwgIk5vIGRlZmF1bHQgdmFsdWUiOworICBzd2l0Y2ggKGNwcF90eXBlKCkpIHsKKyAgICBjYXNlIENQUFRZUEVfSU5UMzI6CisgICAgICByZXR1cm4gU3RyQ2F0KGRlZmF1bHRfdmFsdWVfaW50MzJfdCgpKTsKKyAgICBjYXNlIENQUFRZUEVfSU5UNjQ6CisgICAgICByZXR1cm4gU3RyQ2F0KGRlZmF1bHRfdmFsdWVfaW50NjRfdCgpKTsKKyAgICBjYXNlIENQUFRZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuIFN0ckNhdChkZWZhdWx0X3ZhbHVlX3VpbnQzMl90KCkpOworICAgIGNhc2UgQ1BQVFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gU3RyQ2F0KGRlZmF1bHRfdmFsdWVfdWludDY0X3QoKSk7CisgICAgY2FzZSBDUFBUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuIFNpbXBsZUZ0b2EoZGVmYXVsdF92YWx1ZV9mbG9hdCgpKTsKKyAgICBjYXNlIENQUFRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIFNpbXBsZUR0b2EoZGVmYXVsdF92YWx1ZV9kb3VibGUoKSk7CisgICAgY2FzZSBDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZV9ib29sKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworICAgIGNhc2UgQ1BQVFlQRV9TVFJJTkc6CisgICAgICBpZiAocXVvdGVfc3RyaW5nX3R5cGUpIHsKKyAgICAgICAgcmV0dXJuICJcIiIgKyBDRXNjYXBlKGRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpICsgIlwiIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0eXBlKCkgPT0gVFlQRV9CWVRFUykgeworICAgICAgICAgIHJldHVybiBDRXNjYXBlKGRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlX3N0cmluZygpOworICAgICAgICB9CisgICAgICB9CisgICAgY2FzZSBDUFBUWVBFX0VOVU06CisgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZV9lbnVtKCktPm5hbWUoKTsKKyAgICBjYXNlIENQUFRZUEVfTUVTU0FHRToKKyAgICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiTWVzc2FnZXMgY2FuJ3QgaGF2ZSBkZWZhdWx0IHZhbHVlcyEiOworICAgICAgYnJlYWs7CisgIH0KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlOiBmYWlsZWQgdG8gZ2V0IGRlZmF1bHQgdmFsdWUgYXMgc3RyaW5nIjsKKyAgcmV0dXJuICIiOworfQorCisvLyBDb3B5VG8gbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRmlsZURlc2NyaXB0b3I6OkNvcHlUbyhGaWxlRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3QgeworICBwcm90by0+c2V0X25hbWUobmFtZSgpKTsKKyAgaWYgKCFwYWNrYWdlKCkuZW1wdHkoKSkgcHJvdG8tPnNldF9wYWNrYWdlKHBhY2thZ2UoKSk7CisgIC8vIFRPRE8obGl1amlzaSk6IEFsc28gcG9wdWxhdGUgd2hlbiBzeW50YXg9InByb3RvMiIuCisgIGlmIChzeW50YXgoKSA9PSBTWU5UQVhfUFJPVE8zKSBwcm90by0+c2V0X3N5bnRheChTeW50YXhOYW1lKHN5bnRheCgpKSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIHByb3RvLT5hZGRfZGVwZW5kZW5jeShkZXBlbmRlbmN5KGkpLT5uYW1lKCkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdWJsaWNfZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICBwcm90by0+YWRkX3B1YmxpY19kZXBlbmRlbmN5KHB1YmxpY19kZXBlbmRlbmNpZXNfW2ldKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgd2Vha19kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIHByb3RvLT5hZGRfd2Vha19kZXBlbmRlbmN5KHdlYWtfZGVwZW5kZW5jaWVzX1tpXSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBtZXNzYWdlX3R5cGUoaSktPkNvcHlUbyhwcm90by0+YWRkX21lc3NhZ2VfdHlwZSgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX3R5cGUoaSktPkNvcHlUbyhwcm90by0+YWRkX2VudW1fdHlwZSgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgc2VydmljZShpKS0+Q29weVRvKHByb3RvLT5hZGRfc2VydmljZSgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb24oaSktPkNvcHlUbyhwcm90by0+YWRkX2V4dGVuc2lvbigpKTsKKyAgfQorCisgIGlmICgmb3B0aW9ucygpICE9ICZGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOworICB9Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3I6OkNvcHlKc29uTmFtZVRvKEZpbGVEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7CisgIGlmIChtZXNzYWdlX3R5cGVfY291bnQoKSAhPSBwcm90by0+bWVzc2FnZV90eXBlX3NpemUoKSB8fAorICAgICAgZXh0ZW5zaW9uX2NvdW50KCkgIT0gcHJvdG8tPmV4dGVuc2lvbl9zaXplKCkpIHsKKyAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNvcHkganNvbl9uYW1lIHRvIGEgcHJvdG8gb2YgYSBkaWZmZXJlbnQgc2l6ZS4iOworICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBtZXNzYWdlX3R5cGUoaSktPkNvcHlKc29uTmFtZVRvKHByb3RvLT5tdXRhYmxlX21lc3NhZ2VfdHlwZShpKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgZXh0ZW5zaW9uKGkpLT5Db3B5SnNvbk5hbWVUbyhwcm90by0+bXV0YWJsZV9leHRlbnNpb24oaSkpOworICB9Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3I6OkNvcHlTb3VyY2VDb2RlSW5mb1RvKEZpbGVEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7CisgIGlmIChzb3VyY2VfY29kZV9pbmZvXyAmJgorICAgICAgc291cmNlX2NvZGVfaW5mb18gIT0gJlNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlKCkpIHsKKyAgICBwcm90by0+bXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCktPkNvcHlGcm9tKCpzb3VyY2VfY29kZV9pbmZvXyk7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yOjpDb3B5VG8oRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3QgeworICBwcm90by0+c2V0X25hbWUobmFtZSgpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkKGkpLT5Db3B5VG8ocHJvdG8tPmFkZF9maWVsZCgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgb25lb2ZfZGVjbChpKS0+Q29weVRvKHByb3RvLT5hZGRfb25lb2ZfZGVjbCgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG5lc3RlZF90eXBlKGkpLT5Db3B5VG8ocHJvdG8tPmFkZF9uZXN0ZWRfdHlwZSgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX3R5cGUoaSktPkNvcHlUbyhwcm90by0+YWRkX2VudW1fdHlwZSgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb25fcmFuZ2UoaSktPkNvcHlUbyhwcm90by0+YWRkX2V4dGVuc2lvbl9yYW5nZSgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb24oaSktPkNvcHlUbyhwcm90by0+YWRkX2V4dGVuc2lvbigpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IHJlc2VydmVkX3JhbmdlX2NvdW50KCk7IGkrKykgeworICAgIERlc2NyaXB0b3JQcm90bzo6UmVzZXJ2ZWRSYW5nZSogcmFuZ2UgPSBwcm90by0+YWRkX3Jlc2VydmVkX3JhbmdlKCk7CisgICAgcmFuZ2UtPnNldF9zdGFydChyZXNlcnZlZF9yYW5nZShpKS0+c3RhcnQpOworICAgIHJhbmdlLT5zZXRfZW5kKHJlc2VydmVkX3JhbmdlKGkpLT5lbmQpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzZXJ2ZWRfbmFtZV9jb3VudCgpOyBpKyspIHsKKyAgICBwcm90by0+YWRkX3Jlc2VydmVkX25hbWUocmVzZXJ2ZWRfbmFtZShpKSk7CisgIH0KKworICBpZiAoJm9wdGlvbnMoKSAhPSAmTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSkgeworICAgIHByb3RvLT5tdXRhYmxlX29wdGlvbnMoKS0+Q29weUZyb20ob3B0aW9ucygpKTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3I6OkNvcHlKc29uTmFtZVRvKERlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKKyAgaWYgKGZpZWxkX2NvdW50KCkgIT0gcHJvdG8tPmZpZWxkX3NpemUoKSB8fAorICAgICAgbmVzdGVkX3R5cGVfY291bnQoKSAhPSBwcm90by0+bmVzdGVkX3R5cGVfc2l6ZSgpIHx8CisgICAgICBleHRlbnNpb25fY291bnQoKSAhPSBwcm90by0+ZXh0ZW5zaW9uX3NpemUoKSkgeworICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJDYW5ub3QgY29weSBqc29uX25hbWUgdG8gYSBwcm90byBvZiBhIGRpZmZlcmVudCBzaXplLiI7CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGQoaSktPkNvcHlKc29uTmFtZVRvKHByb3RvLT5tdXRhYmxlX2ZpZWxkKGkpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG5lc3RlZF90eXBlKGkpLT5Db3B5SnNvbk5hbWVUbyhwcm90by0+bXV0YWJsZV9uZXN0ZWRfdHlwZShpKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgZXh0ZW5zaW9uKGkpLT5Db3B5SnNvbk5hbWVUbyhwcm90by0+bXV0YWJsZV9leHRlbnNpb24oaSkpOworICB9Cit9CisKK3ZvaWQgRmllbGREZXNjcmlwdG9yOjpDb3B5VG8oRmllbGREZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7CisgIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOworICBwcm90by0+c2V0X251bWJlcihudW1iZXIoKSk7CisgIGlmIChoYXNfanNvbl9uYW1lXykgeworICAgIHByb3RvLT5zZXRfanNvbl9uYW1lKGpzb25fbmFtZSgpKTsKKyAgfQorICBpZiAocHJvdG8zX29wdGlvbmFsXykgeworICAgIHByb3RvLT5zZXRfcHJvdG8zX29wdGlvbmFsKHRydWUpOworICB9CisgIC8vIFNvbWUgY29tcGlsZXJzIGRvIG5vdCBhbGxvdyBzdGF0aWNfY2FzdCBkaXJlY3RseSBiZXR3ZWVuIHR3byBlbnVtIHR5cGVzLAorICAvLyBzbyB3ZSBtdXN0IGNhc3QgdG8gaW50IGZpcnN0LgorICBwcm90by0+c2V0X2xhYmVsKHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbD4oCisgICAgICBpbXBsaWNpdF9jYXN0PGludD4obGFiZWwoKSkpKTsKKyAgcHJvdG8tPnNldF90eXBlKHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlPigKKyAgICAgIGltcGxpY2l0X2Nhc3Q8aW50Pih0eXBlKCkpKSk7CisKKyAgaWYgKGlzX2V4dGVuc2lvbigpKSB7CisgICAgaWYgKCFjb250YWluaW5nX3R5cGUoKS0+aXNfdW5xdWFsaWZpZWRfcGxhY2Vob2xkZXJfKSB7CisgICAgICBwcm90by0+c2V0X2V4dGVuZGVlKCIuIik7CisgICAgfQorICAgIHByb3RvLT5tdXRhYmxlX2V4dGVuZGVlKCktPmFwcGVuZChjb250YWluaW5nX3R5cGUoKS0+ZnVsbF9uYW1lKCkpOworICB9CisKKyAgaWYgKGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9NRVNTQUdFKSB7CisgICAgaWYgKG1lc3NhZ2VfdHlwZSgpLT5pc19wbGFjZWhvbGRlcl8pIHsKKyAgICAgIC8vIFdlIGRvbid0IGFjdHVhbGx5IGtub3cgaWYgdGhlIHR5cGUgaXMgYSBtZXNzYWdlIHR5cGUuICBJdCBjb3VsZCBiZQorICAgICAgLy8gYW4gZW51bS4KKyAgICAgIHByb3RvLT5jbGVhcl90eXBlKCk7CisgICAgfQorCisgICAgaWYgKCFtZXNzYWdlX3R5cGUoKS0+aXNfdW5xdWFsaWZpZWRfcGxhY2Vob2xkZXJfKSB7CisgICAgICBwcm90by0+c2V0X3R5cGVfbmFtZSgiLiIpOworICAgIH0KKyAgICBwcm90by0+bXV0YWJsZV90eXBlX25hbWUoKS0+YXBwZW5kKG1lc3NhZ2VfdHlwZSgpLT5mdWxsX25hbWUoKSk7CisgIH0gZWxzZSBpZiAoY3BwX3R5cGUoKSA9PSBDUFBUWVBFX0VOVU0pIHsKKyAgICBpZiAoIWVudW1fdHlwZSgpLT5pc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8pIHsKKyAgICAgIHByb3RvLT5zZXRfdHlwZV9uYW1lKCIuIik7CisgICAgfQorICAgIHByb3RvLT5tdXRhYmxlX3R5cGVfbmFtZSgpLT5hcHBlbmQoZW51bV90eXBlKCktPmZ1bGxfbmFtZSgpKTsKKyAgfQorCisgIGlmIChoYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgcHJvdG8tPnNldF9kZWZhdWx0X3ZhbHVlKERlZmF1bHRWYWx1ZUFzU3RyaW5nKGZhbHNlKSk7CisgIH0KKworICBpZiAoY29udGFpbmluZ19vbmVvZigpICE9IG51bGxwdHIgJiYgIWlzX2V4dGVuc2lvbigpKSB7CisgICAgcHJvdG8tPnNldF9vbmVvZl9pbmRleChjb250YWluaW5nX29uZW9mKCktPmluZGV4KCkpOworICB9CisKKyAgaWYgKCZvcHRpb25zKCkgIT0gJkZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOworICB9Cit9CisKK3ZvaWQgRmllbGREZXNjcmlwdG9yOjpDb3B5SnNvbk5hbWVUbyhGaWVsZERlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKKyAgcHJvdG8tPnNldF9qc29uX25hbWUoanNvbl9uYW1lKCkpOworfQorCit2b2lkIE9uZW9mRGVzY3JpcHRvcjo6Q29weVRvKE9uZW9mRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3QgeworICBwcm90by0+c2V0X25hbWUobmFtZSgpKTsKKyAgaWYgKCZvcHRpb25zKCkgIT0gJk9uZW9mT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOworICB9Cit9CisKK3ZvaWQgRW51bURlc2NyaXB0b3I6OkNvcHlUbyhFbnVtRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3QgeworICBwcm90by0+c2V0X25hbWUobmFtZSgpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlX2NvdW50KCk7IGkrKykgeworICAgIHZhbHVlKGkpLT5Db3B5VG8ocHJvdG8tPmFkZF92YWx1ZSgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IHJlc2VydmVkX3JhbmdlX2NvdW50KCk7IGkrKykgeworICAgIEVudW1EZXNjcmlwdG9yUHJvdG86OkVudW1SZXNlcnZlZFJhbmdlKiByYW5nZSA9IHByb3RvLT5hZGRfcmVzZXJ2ZWRfcmFuZ2UoKTsKKyAgICByYW5nZS0+c2V0X3N0YXJ0KHJlc2VydmVkX3JhbmdlKGkpLT5zdGFydCk7CisgICAgcmFuZ2UtPnNldF9lbmQocmVzZXJ2ZWRfcmFuZ2UoaSktPmVuZCk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNlcnZlZF9uYW1lX2NvdW50KCk7IGkrKykgeworICAgIHByb3RvLT5hZGRfcmVzZXJ2ZWRfbmFtZShyZXNlcnZlZF9uYW1lKGkpKTsKKyAgfQorCisgIGlmICgmb3B0aW9ucygpICE9ICZFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOworICB9Cit9CisKK3ZvaWQgRW51bVZhbHVlRGVzY3JpcHRvcjo6Q29weVRvKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKKyAgcHJvdG8tPnNldF9uYW1lKG5hbWUoKSk7CisgIHByb3RvLT5zZXRfbnVtYmVyKG51bWJlcigpKTsKKworICBpZiAoJm9wdGlvbnMoKSAhPSAmRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOworICB9Cit9CisKK3ZvaWQgU2VydmljZURlc2NyaXB0b3I6OkNvcHlUbyhTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3QgeworICBwcm90by0+c2V0X25hbWUobmFtZSgpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBtZXRob2QoaSktPkNvcHlUbyhwcm90by0+YWRkX21ldGhvZCgpKTsKKyAgfQorCisgIGlmICgmb3B0aW9ucygpICE9ICZTZXJ2aWNlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOworICB9Cit9CisKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvcjo6Q29weVRvKE1ldGhvZERlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKKyAgcHJvdG8tPnNldF9uYW1lKG5hbWUoKSk7CisKKyAgaWYgKCFpbnB1dF90eXBlKCktPmlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXykgeworICAgIHByb3RvLT5zZXRfaW5wdXRfdHlwZSgiLiIpOworICB9CisgIHByb3RvLT5tdXRhYmxlX2lucHV0X3R5cGUoKS0+YXBwZW5kKGlucHV0X3R5cGUoKS0+ZnVsbF9uYW1lKCkpOworCisgIGlmICghb3V0cHV0X3R5cGUoKS0+aXNfdW5xdWFsaWZpZWRfcGxhY2Vob2xkZXJfKSB7CisgICAgcHJvdG8tPnNldF9vdXRwdXRfdHlwZSgiLiIpOworICB9CisgIHByb3RvLT5tdXRhYmxlX291dHB1dF90eXBlKCktPmFwcGVuZChvdXRwdXRfdHlwZSgpLT5mdWxsX25hbWUoKSk7CisKKyAgaWYgKCZvcHRpb25zKCkgIT0gJk1ldGhvZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSkgeworICAgIHByb3RvLT5tdXRhYmxlX29wdGlvbnMoKS0+Q29weUZyb20ob3B0aW9ucygpKTsKKyAgfQorCisgIGlmIChjbGllbnRfc3RyZWFtaW5nXykgeworICAgIHByb3RvLT5zZXRfY2xpZW50X3N0cmVhbWluZyh0cnVlKTsKKyAgfQorICBpZiAoc2VydmVyX3N0cmVhbWluZ18pIHsKKyAgICBwcm90by0+c2V0X3NlcnZlcl9zdHJlYW1pbmcodHJ1ZSk7CisgIH0KK30KKworLy8gRGVidWdTdHJpbmcgbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCituYW1lc3BhY2UgeworCitib29sIFJldHJpZXZlT3B0aW9uc0Fzc3VtaW5nUmlnaHRQb29sKAorICAgIGludCBkZXB0aCwgY29uc3QgTWVzc2FnZSYgb3B0aW9ucywKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG9wdGlvbl9lbnRyaWVzKSB7CisgIG9wdGlvbl9lbnRyaWVzLT5jbGVhcigpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gb3B0aW9ucy5HZXRSZWZsZWN0aW9uKCk7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhvcHRpb25zLCAmZmllbGRzKTsKKyAgZm9yIChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkIDogZmllbGRzKSB7CisgICAgaW50IGNvdW50ID0gMTsKKyAgICBib29sIHJlcGVhdGVkID0gZmFsc2U7CisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBjb3VudCA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShvcHRpb25zLCBmaWVsZCk7CisgICAgICByZXBlYXRlZCA9IHRydWU7CisgICAgfQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgeworICAgICAgc3RkOjpzdHJpbmcgZmllbGR2YWw7CisgICAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdG1wOworICAgICAgICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgICAgICAgIHByaW50ZXIuU2V0RXhwYW5kQW55KHRydWUpOworICAgICAgICBwcmludGVyLlNldEluaXRpYWxJbmRlbnRMZXZlbChkZXB0aCArIDEpOworICAgICAgICBwcmludGVyLlByaW50RmllbGRWYWx1ZVRvU3RyaW5nKG9wdGlvbnMsIGZpZWxkLCByZXBlYXRlZCA/IGogOiAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wKTsKKyAgICAgICAgZmllbGR2YWwuYXBwZW5kKCJ7XG4iKTsKKyAgICAgICAgZmllbGR2YWwuYXBwZW5kKHRtcCk7CisgICAgICAgIGZpZWxkdmFsLmFwcGVuZChkZXB0aCAqIDIsICcgJyk7CisgICAgICAgIGZpZWxkdmFsLmFwcGVuZCgifSIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgVGV4dEZvcm1hdDo6UHJpbnRGaWVsZFZhbHVlVG9TdHJpbmcob3B0aW9ucywgZmllbGQsIHJlcGVhdGVkID8gaiA6IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGR2YWwpOworICAgICAgfQorICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgbmFtZSA9ICIoLiIgKyBmaWVsZC0+ZnVsbF9uYW1lKCkgKyAiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBuYW1lID0gZmllbGQtPm5hbWUoKTsKKyAgICAgIH0KKyAgICAgIG9wdGlvbl9lbnRyaWVzLT5wdXNoX2JhY2sobmFtZSArICIgPSAiICsgZmllbGR2YWwpOworICAgIH0KKyAgfQorICByZXR1cm4gIW9wdGlvbl9lbnRyaWVzLT5lbXB0eSgpOworfQorCisvLyBVc2VkIGJ5IGVhY2ggb2YgdGhlIG9wdGlvbiBmb3JtYXR0ZXJzLgorYm9vbCBSZXRyaWV2ZU9wdGlvbnMoaW50IGRlcHRoLCBjb25zdCBNZXNzYWdlJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG9wdGlvbl9lbnRyaWVzKSB7CisgIC8vIFdoZW4gcHJpbnRpbmcgY3VzdG9tIG9wdGlvbnMgZm9yIGEgZGVzY3JpcHRvciwgd2UgbXVzdCB1c2UgYW4gb3B0aW9ucworICAvLyBtZXNzYWdlIGJ1aWx0IG9uIHRvcCBvZiB0aGUgc2FtZSBEZXNjcmlwdG9yUG9vbCB3aGVyZSB0aGUgZGVzY3JpcHRvcgorICAvLyBpcyBjb21pbmcgZnJvbS4gVGhpcyBpcyB0byBlbnN1cmUgd2UgYXJlIGludGVycHJldGluZyBjdXN0b20gb3B0aW9ucworICAvLyBhZ2FpbnN0IHRoZSByaWdodCBwb29sLgorICBpZiAob3B0aW9ucy5HZXREZXNjcmlwdG9yKCktPmZpbGUoKS0+cG9vbCgpID09IHBvb2wpIHsKKyAgICByZXR1cm4gUmV0cmlldmVPcHRpb25zQXNzdW1pbmdSaWdodFBvb2woZGVwdGgsIG9wdGlvbnMsIG9wdGlvbl9lbnRyaWVzKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBvcHRpb25fZGVzY3JpcHRvciA9CisgICAgICAgIHBvb2wtPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShvcHRpb25zLkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkpOworICAgIGlmIChvcHRpb25fZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgICAvLyBkZXNjcmlwdG9yLnByb3RvIGlzIG5vdCBpbiB0aGUgcG9vbC4gVGhpcyBtZWFucyBubyBjdXN0b20gb3B0aW9ucyBhcmUKKyAgICAgIC8vIHVzZWQgc28gd2UgYXJlIHNhZmUgdG8gcHJvY2VlZCB3aXRoIHRoZSBjb21waWxlZCBvcHRpb25zIG1lc3NhZ2UgdHlwZS4KKyAgICAgIHJldHVybiBSZXRyaWV2ZU9wdGlvbnNBc3N1bWluZ1JpZ2h0UG9vbChkZXB0aCwgb3B0aW9ucywgb3B0aW9uX2VudHJpZXMpOworICAgIH0KKyAgICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZmFjdG9yeTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gZHluYW1pY19vcHRpb25zKAorICAgICAgICBmYWN0b3J5LkdldFByb3RvdHlwZShvcHRpb25fZGVzY3JpcHRvciktPk5ldygpKTsKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkID0gb3B0aW9ucy5TZXJpYWxpemVBc1N0cmluZygpOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KAorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzZXJpYWxpemVkLmNfc3RyKCkpLAorICAgICAgICBzZXJpYWxpemVkLnNpemUoKSk7CisgICAgaW5wdXQuU2V0RXh0ZW5zaW9uUmVnaXN0cnkocG9vbCwgJmZhY3RvcnkpOworICAgIGlmIChkeW5hbWljX29wdGlvbnMtPlBhcnNlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCkpIHsKKyAgICAgIHJldHVybiBSZXRyaWV2ZU9wdGlvbnNBc3N1bWluZ1JpZ2h0UG9vbChkZXB0aCwgKmR5bmFtaWNfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZW50cmllcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJGb3VuZCBpbnZhbGlkIHByb3RvIG9wdGlvbiBkYXRhIGZvcjogIgorICAgICAgICAgICAgICAgICA8PCBvcHRpb25zLkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCk7CisgICAgICByZXR1cm4gUmV0cmlldmVPcHRpb25zQXNzdW1pbmdSaWdodFBvb2woZGVwdGgsIG9wdGlvbnMsIG9wdGlvbl9lbnRyaWVzKTsKKyAgICB9CisgIH0KK30KKworLy8gRm9ybWF0cyBvcHRpb25zIHRoYXQgYWxsIGFwcGVhciB0b2dldGhlciBpbiBicmFja2V0cy4gRG9lcyBub3QgaW5jbHVkZQorLy8gYnJhY2tldHMuCitib29sIEZvcm1hdEJyYWNrZXRlZE9wdGlvbnMoaW50IGRlcHRoLCBjb25zdCBNZXNzYWdlJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLCBzdGQ6OnN0cmluZyogb3V0cHV0KSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhbGxfb3B0aW9uczsKKyAgaWYgKFJldHJpZXZlT3B0aW9ucyhkZXB0aCwgb3B0aW9ucywgcG9vbCwgJmFsbF9vcHRpb25zKSkgeworICAgIG91dHB1dC0+YXBwZW5kKEpvaW4oYWxsX29wdGlvbnMsICIsICIpKTsKKyAgfQorICByZXR1cm4gIWFsbF9vcHRpb25zLmVtcHR5KCk7Cit9CisKKy8vIEZvcm1hdHMgb3B0aW9ucyBvbmUgcGVyIGxpbmUKK2Jvb2wgRm9ybWF0TGluZU9wdGlvbnMoaW50IGRlcHRoLCBjb25zdCBNZXNzYWdlJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwgc3RkOjpzdHJpbmcqIG91dHB1dCkgeworICBzdGQ6OnN0cmluZyBwcmVmaXgoZGVwdGggKiAyLCAnICcpOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYWxsX29wdGlvbnM7CisgIGlmIChSZXRyaWV2ZU9wdGlvbnMoZGVwdGgsIG9wdGlvbnMsIHBvb2wsICZhbGxfb3B0aW9ucykpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb24gOiBhbGxfb3B0aW9ucykgeworICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChvdXRwdXQsICIkMG9wdGlvbiAkMTtcbiIsIHByZWZpeCwgb3B0aW9uKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFhbGxfb3B0aW9ucy5lbXB0eSgpOworfQorCitjbGFzcyBTb3VyY2VMb2NhdGlvbkNvbW1lbnRQcmludGVyIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXNjVHlwZT4KKyAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlcihjb25zdCBEZXNjVHlwZSogZGVzYywgY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpCisgICAgICA6IG9wdGlvbnNfKG9wdGlvbnMpLCBwcmVmaXhfKHByZWZpeCkgeworICAgIC8vIFBlcmZvcm0gdGhlIFNvdXJjZUxvY2F0aW9uIGxvb2t1cCBvbmx5IGlmIHdlJ3JlIGluY2x1ZGluZyB1c2VyIGNvbW1lbnRzLAorICAgIC8vIGJlY2F1c2UgdGhlIGxvb2t1cCBpcyBmYWlybHkgZXhwZW5zaXZlLgorICAgIGhhdmVfc291cmNlX2xvY18gPQorICAgICAgICBvcHRpb25zLmluY2x1ZGVfY29tbWVudHMgJiYgZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJnNvdXJjZV9sb2NfKTsKKyAgfQorICBTb3VyY2VMb2NhdGlvbkNvbW1lbnRQcmludGVyKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpCisgICAgICA6IG9wdGlvbnNfKG9wdGlvbnMpLCBwcmVmaXhfKHByZWZpeCkgeworICAgIC8vIFBlcmZvcm0gdGhlIFNvdXJjZUxvY2F0aW9uIGxvb2t1cCBvbmx5IGlmIHdlJ3JlIGluY2x1ZGluZyB1c2VyIGNvbW1lbnRzLAorICAgIC8vIGJlY2F1c2UgdGhlIGxvb2t1cCBpcyBmYWlybHkgZXhwZW5zaXZlLgorICAgIGhhdmVfc291cmNlX2xvY18gPQorICAgICAgICBvcHRpb25zLmluY2x1ZGVfY29tbWVudHMgJiYgZmlsZS0+R2V0U291cmNlTG9jYXRpb24ocGF0aCwgJnNvdXJjZV9sb2NfKTsKKyAgfQorICB2b2lkIEFkZFByZUNvbW1lbnQoc3RkOjpzdHJpbmcqIG91dHB1dCkgeworICAgIGlmIChoYXZlX3NvdXJjZV9sb2NfKSB7CisgICAgICAvLyBEZXRhY2hlZCBsZWFkaW5nIGNvbW1lbnRzLgorICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyYgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50IDoKKyAgICAgICAgICAgc291cmNlX2xvY18ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykgeworICAgICAgICAqb3V0cHV0ICs9IEZvcm1hdENvbW1lbnQobGVhZGluZ19kZXRhY2hlZF9jb21tZW50KTsKKyAgICAgICAgKm91dHB1dCArPSAiXG4iOworICAgICAgfQorICAgICAgLy8gQXR0YWNoZWQgbGVhZGluZyBjb21tZW50cy4KKyAgICAgIGlmICghc291cmNlX2xvY18ubGVhZGluZ19jb21tZW50cy5lbXB0eSgpKSB7CisgICAgICAgICpvdXRwdXQgKz0gRm9ybWF0Q29tbWVudChzb3VyY2VfbG9jXy5sZWFkaW5nX2NvbW1lbnRzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdm9pZCBBZGRQb3N0Q29tbWVudChzdGQ6OnN0cmluZyogb3V0cHV0KSB7CisgICAgaWYgKGhhdmVfc291cmNlX2xvY18gJiYgc291cmNlX2xvY18udHJhaWxpbmdfY29tbWVudHMuc2l6ZSgpID4gMCkgeworICAgICAgKm91dHB1dCArPSBGb3JtYXRDb21tZW50KHNvdXJjZV9sb2NfLnRyYWlsaW5nX2NvbW1lbnRzKTsKKyAgICB9CisgIH0KKworICAvLyBGb3JtYXQgY29tbWVudCBzdWNoIHRoYXQgZWFjaCBsaW5lIGJlY29tZXMgYSBmdWxsLWxpbmUgQysrLXN0eWxlIGNvbW1lbnQgaW4KKyAgLy8gdGhlIERlYnVnU3RyaW5nKCkgb3V0cHV0LgorICBzdGQ6OnN0cmluZyBGb3JtYXRDb21tZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tZW50X3RleHQpIHsKKyAgICBzdGQ6OnN0cmluZyBzdHJpcHBlZF9jb21tZW50ID0gY29tbWVudF90ZXh0OworICAgIFN0cmlwV2hpdGVzcGFjZSgmc3RyaXBwZWRfY29tbWVudCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzID0gU3BsaXQoc3RyaXBwZWRfY29tbWVudCwgIlxuIik7CisgICAgc3RkOjpzdHJpbmcgb3V0cHV0OworICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmUgOiBsaW5lcykgeworICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmb3V0cHV0LCAiJDAvLyAkMVxuIiwgcHJlZml4XywgbGluZSk7CisgICAgfQorICAgIHJldHVybiBvdXRwdXQ7CisgIH0KKworIHByaXZhdGU6CisKKyAgYm9vbCBoYXZlX3NvdXJjZV9sb2NfOworICBTb3VyY2VMb2NhdGlvbiBzb3VyY2VfbG9jXzsKKyAgRGVidWdTdHJpbmdPcHRpb25zIG9wdGlvbnNfOworICBzdGQ6OnN0cmluZyBwcmVmaXhfOworfTsKKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitzdGQ6OnN0cmluZyBGaWxlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSBjb25zdCB7CisgIERlYnVnU3RyaW5nT3B0aW9ucyBvcHRpb25zOyAgLy8gZGVmYXVsdCBvcHRpb25zCisgIHJldHVybiBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKG9wdGlvbnMpOworfQorCitzdGQ6OnN0cmluZyBGaWxlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmdXaXRoT3B0aW9ucygKKyAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIGRlYnVnX3N0cmluZ19vcHRpb25zKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzOworICB7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBwYXRoOworICAgIHBhdGgucHVzaF9iYWNrKEZpbGVEZXNjcmlwdG9yUHJvdG86OmtTeW50YXhGaWVsZE51bWJlcik7CisgICAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlciBzeW50YXhfY29tbWVudCh0aGlzLCBwYXRoLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKKyAgICBzeW50YXhfY29tbWVudC5BZGRQcmVDb21tZW50KCZjb250ZW50cyk7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJzeW50YXggPSBcIiQwXCI7XG5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhOYW1lKHN5bnRheCgpKSk7CisgICAgc3ludGF4X2NvbW1lbnQuQWRkUG9zdENvbW1lbnQoJmNvbnRlbnRzKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uQ29tbWVudFByaW50ZXIgY29tbWVudF9wcmludGVyKHRoaXMsICIiLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7CisgIGNvbW1lbnRfcHJpbnRlci5BZGRQcmVDb21tZW50KCZjb250ZW50cyk7CisKKyAgc3RkOjpzZXQ8aW50PiBwdWJsaWNfZGVwZW5kZW5jaWVzOworICBzdGQ6OnNldDxpbnQ+IHdlYWtfZGVwZW5kZW5jaWVzOworICBwdWJsaWNfZGVwZW5kZW5jaWVzLmluc2VydChwdWJsaWNfZGVwZW5kZW5jaWVzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljX2RlcGVuZGVuY2llc18gKyBwdWJsaWNfZGVwZW5kZW5jeV9jb3VudF8pOworICB3ZWFrX2RlcGVuZGVuY2llcy5pbnNlcnQod2Vha19kZXBlbmRlbmNpZXNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vha19kZXBlbmRlbmNpZXNfICsgd2Vha19kZXBlbmRlbmN5X2NvdW50Xyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIGlmIChwdWJsaWNfZGVwZW5kZW5jaWVzLmNvdW50KGkpID4gMCkgeworICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJpbXBvcnQgcHVibGljIFwiJDBcIjtcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3koaSktPm5hbWUoKSk7CisgICAgfSBlbHNlIGlmICh3ZWFrX2RlcGVuZGVuY2llcy5jb3VudChpKSA+IDApIHsKKyAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJmNvbnRlbnRzLCAiaW1wb3J0IHdlYWsgXCIkMFwiO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeShpKS0+bmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJpbXBvcnQgXCIkMFwiO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeShpKS0+bmFtZSgpKTsKKyAgICB9CisgIH0KKworICBpZiAoIXBhY2thZ2UoKS5lbXB0eSgpKSB7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBwYXRoOworICAgIHBhdGgucHVzaF9iYWNrKEZpbGVEZXNjcmlwdG9yUHJvdG86OmtQYWNrYWdlRmllbGROdW1iZXIpOworICAgIFNvdXJjZUxvY2F0aW9uQ29tbWVudFByaW50ZXIgcGFja2FnZV9jb21tZW50KHRoaXMsIHBhdGgsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKKyAgICBwYWNrYWdlX2NvbW1lbnQuQWRkUHJlQ29tbWVudCgmY29udGVudHMpOworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJmNvbnRlbnRzLCAicGFja2FnZSAkMDtcblxuIiwgcGFja2FnZSgpKTsKKyAgICBwYWNrYWdlX2NvbW1lbnQuQWRkUG9zdENvbW1lbnQoJmNvbnRlbnRzKTsKKyAgfQorCisgIGlmIChGb3JtYXRMaW5lT3B0aW9ucygwLCBvcHRpb25zKCksIHBvb2woKSwgJmNvbnRlbnRzKSkgeworICAgIGNvbnRlbnRzLmFwcGVuZCgiXG4iKTsgIC8vIGFkZCBzb21lIHNwYWNlIGlmIHdlIGhhZCBvcHRpb25zCisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX3R5cGUoaSktPkRlYnVnU3RyaW5nKDAsICZjb250ZW50cywgZGVidWdfc3RyaW5nX29wdGlvbnMpOworICAgIGNvbnRlbnRzLmFwcGVuZCgiXG4iKTsKKyAgfQorCisgIC8vIEZpbmQgYWxsIHRoZSAnZ3JvdXAnIHR5cGUgZXh0ZW5zaW9uczsgd2Ugd2lsbCBub3Qgb3V0cHV0IHRoZWlyIG5lc3RlZAorICAvLyBkZWZpbml0aW9ucyAodGhvc2Ugd2lsbCBiZSBkb25lIHdpdGggdGhlaXIgZ3JvdXAgZmllbGQgZGVzY3JpcHRvcikuCisgIHN0ZDo6c2V0PGNvbnN0IERlc2NyaXB0b3IqPiBncm91cHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGlmIChleHRlbnNpb24oaSktPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICAgIGdyb3Vwcy5pbnNlcnQoZXh0ZW5zaW9uKGkpLT5tZXNzYWdlX3R5cGUoKSk7CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGdyb3Vwcy5jb3VudChtZXNzYWdlX3R5cGUoaSkpID09IDApIHsKKyAgICAgIG1lc3NhZ2VfdHlwZShpKS0+RGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5jbHVkZV9vcGVuaW5nX2NsYXVzZSAqLyB0cnVlKTsKKyAgICAgIGNvbnRlbnRzLmFwcGVuZCgiXG4iKTsKKyAgICB9CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgc2VydmljZShpKS0+RGVidWdTdHJpbmcoJmNvbnRlbnRzLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7CisgICAgY29udGVudHMuYXBwZW5kKCJcbiIpOworICB9CisKKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlID0gbnVsbHB0cjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGV4dGVuc2lvbihpKS0+Y29udGFpbmluZ190eXBlKCkgIT0gY29udGFpbmluZ190eXBlKSB7CisgICAgICBpZiAoaSA+IDApIGNvbnRlbnRzLmFwcGVuZCgifVxuXG4iKTsKKyAgICAgIGNvbnRhaW5pbmdfdHlwZSA9IGV4dGVuc2lvbihpKS0+Y29udGFpbmluZ190eXBlKCk7CisgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZjb250ZW50cywgImV4dGVuZCAuJDAge1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlLT5mdWxsX25hbWUoKSk7CisgICAgfQorICAgIGV4dGVuc2lvbihpKS0+RGVidWdTdHJpbmcoMSwgJmNvbnRlbnRzLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7CisgIH0KKyAgaWYgKGV4dGVuc2lvbl9jb3VudCgpID4gMCkgY29udGVudHMuYXBwZW5kKCJ9XG5cbiIpOworCisgIGNvbW1lbnRfcHJpbnRlci5BZGRQb3N0Q29tbWVudCgmY29udGVudHMpOworCisgIHJldHVybiBjb250ZW50czsKK30KKworc3RkOjpzdHJpbmcgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSBjb25zdCB7CisgIERlYnVnU3RyaW5nT3B0aW9ucyBvcHRpb25zOyAgLy8gZGVmYXVsdCBvcHRpb25zCisgIHJldHVybiBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKG9wdGlvbnMpOworfQorCitzdGQ6OnN0cmluZyBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKAorICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3QgeworICBzdGQ6OnN0cmluZyBjb250ZW50czsKKyAgRGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzLCBvcHRpb25zLCAvKiBpbmNsdWRlX29wZW5pbmdfY2xhdXNlICovIHRydWUpOworICByZXR1cm4gY29udGVudHM7Cit9CisKK3ZvaWQgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdGQ6OnN0cmluZyogY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgZGVidWdfc3RyaW5nX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV9vcGVuaW5nX2NsYXVzZSkgY29uc3QgeworICBpZiAob3B0aW9ucygpLm1hcF9lbnRyeSgpKSB7CisgICAgLy8gRG8gbm90IGdlbmVyYXRlIGRlYnVnIHN0cmluZyBmb3IgYXV0by1nZW5lcmF0ZWQgbWFwLWVudHJ5IHR5cGUuCisgICAgcmV0dXJuOworICB9CisgIHN0ZDo6c3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CisgICsrZGVwdGg7CisKKyAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlciBjb21tZW50X3ByaW50ZXIodGhpcywgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7CisgIGNvbW1lbnRfcHJpbnRlci5BZGRQcmVDb21tZW50KGNvbnRlbnRzKTsKKworICBpZiAoaW5jbHVkZV9vcGVuaW5nX2NsYXVzZSkgeworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMG1lc3NhZ2UgJDEiLCBwcmVmaXgsIG5hbWUoKSk7CisgIH0KKyAgY29udGVudHMtPmFwcGVuZCgiIHtcbiIpOworCisgIEZvcm1hdExpbmVPcHRpb25zKGRlcHRoLCBvcHRpb25zKCksIGZpbGUoKS0+cG9vbCgpLCBjb250ZW50cyk7CisKKyAgLy8gRmluZCBhbGwgdGhlICdncm91cCcgdHlwZXMgZm9yIGZpZWxkcyBhbmQgZXh0ZW5zaW9uczsgd2Ugd2lsbCBub3Qgb3V0cHV0CisgIC8vIHRoZWlyIG5lc3RlZCBkZWZpbml0aW9ucyAodGhvc2Ugd2lsbCBiZSBkb25lIHdpdGggdGhlaXIgZ3JvdXAgZmllbGQKKyAgLy8gZGVzY3JpcHRvcikuCisgIHN0ZDo6c2V0PGNvbnN0IERlc2NyaXB0b3IqPiBncm91cHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGZpZWxkKGkpLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgICBncm91cHMuaW5zZXJ0KGZpZWxkKGkpLT5tZXNzYWdlX3R5cGUoKSk7CisgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGlmIChleHRlbnNpb24oaSktPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICAgIGdyb3Vwcy5pbnNlcnQoZXh0ZW5zaW9uKGkpLT5tZXNzYWdlX3R5cGUoKSk7CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoZ3JvdXBzLmNvdW50KG5lc3RlZF90eXBlKGkpKSA9PSAwKSB7CisgICAgICBuZXN0ZWRfdHlwZShpKS0+RGVidWdTdHJpbmcoZGVwdGgsIGNvbnRlbnRzLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNsdWRlX29wZW5pbmdfY2xhdXNlICovIHRydWUpOworICAgIH0KKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX3R5cGUoaSktPkRlYnVnU3RyaW5nKGRlcHRoLCBjb250ZW50cywgZGVidWdfc3RyaW5nX29wdGlvbnMpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGZpZWxkKGkpLT5yZWFsX2NvbnRhaW5pbmdfb25lb2YoKSA9PSBudWxscHRyKSB7CisgICAgICBmaWVsZChpKS0+RGVidWdTdHJpbmcoZGVwdGgsIGNvbnRlbnRzLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7CisgICAgfSBlbHNlIGlmIChmaWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpLT5maWVsZCgwKSA9PSBmaWVsZChpKSkgeworICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgaW4gdGhpcyBvbmVvZiwgc28gcHJpbnQgdGhlIHdob2xlIG9uZW9mLgorICAgICAgZmllbGQoaSktPmNvbnRhaW5pbmdfb25lb2YoKS0+RGVidWdTdHJpbmcoZGVwdGgsIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfc3RyaW5nX29wdGlvbnMpOworICAgIH0KKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7IGkrKykgeworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCAgZXh0ZW5zaW9ucyAkMSB0byAkMjtcbiIsIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9yYW5nZShpKS0+c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25fcmFuZ2UoaSktPmVuZCAtIDEpOworICB9CisKKyAgLy8gR3JvdXAgZXh0ZW5zaW9ucyBieSB3aGF0IHRoZXkgZXh0ZW5kLCBzbyB0aGV5IGNhbiBiZSBwcmludGVkIG91dCB0b2dldGhlci4KKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlID0gbnVsbHB0cjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGV4dGVuc2lvbihpKS0+Y29udGFpbmluZ190eXBlKCkgIT0gY29udGFpbmluZ190eXBlKSB7CisgICAgICBpZiAoaSA+IDApIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCAgfVxuIiwgcHJlZml4KTsKKyAgICAgIGNvbnRhaW5pbmdfdHlwZSA9IGV4dGVuc2lvbihpKS0+Y29udGFpbmluZ190eXBlKCk7CisgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDAgIGV4dGVuZCAuJDEge1xuIiwgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGUtPmZ1bGxfbmFtZSgpKTsKKyAgICB9CisgICAgZXh0ZW5zaW9uKGkpLT5EZWJ1Z1N0cmluZyhkZXB0aCArIDEsIGNvbnRlbnRzLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7CisgIH0KKyAgaWYgKGV4dGVuc2lvbl9jb3VudCgpID4gMCkKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDAgIH1cbiIsIHByZWZpeCk7CisKKyAgaWYgKHJlc2VydmVkX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwICByZXNlcnZlZCAiLCBwcmVmaXgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzZXJ2ZWRfcmFuZ2VfY291bnQoKTsgaSsrKSB7CisgICAgICBjb25zdCBEZXNjcmlwdG9yOjpSZXNlcnZlZFJhbmdlKiByYW5nZSA9IHJlc2VydmVkX3JhbmdlKGkpOworICAgICAgaWYgKHJhbmdlLT5lbmQgPT0gcmFuZ2UtPnN0YXJ0ICsgMSkgeworICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDAsICIsIHJhbmdlLT5zdGFydCk7CisgICAgICB9IGVsc2UgaWYgKHJhbmdlLT5lbmQgPiBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIpIHsKKyAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwIHRvIG1heCwgIiwgcmFuZ2UtPnN0YXJ0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCB0byAkMSwgIiwgcmFuZ2UtPnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLT5lbmQgLSAxKTsKKyAgICAgIH0KKyAgICB9CisgICAgY29udGVudHMtPnJlcGxhY2UoY29udGVudHMtPnNpemUoKSAtIDIsIDIsICI7XG4iKTsKKyAgfQorCisgIGlmIChyZXNlcnZlZF9uYW1lX2NvdW50KCkgPiAwKSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwICByZXNlcnZlZCAiLCBwcmVmaXgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzZXJ2ZWRfbmFtZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICJcIiQwXCIsICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFc2NhcGUocmVzZXJ2ZWRfbmFtZShpKSkpOworICAgIH0KKyAgICBjb250ZW50cy0+cmVwbGFjZShjb250ZW50cy0+c2l6ZSgpIC0gMiwgMiwgIjtcbiIpOworICB9CisKKyAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwfVxuIiwgcHJlZml4KTsKKyAgY29tbWVudF9wcmludGVyLkFkZFBvc3RDb21tZW50KGNvbnRlbnRzKTsKK30KKworc3RkOjpzdHJpbmcgRmllbGREZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsKKyAgRGVidWdTdHJpbmdPcHRpb25zIG9wdGlvbnM7ICAvLyBkZWZhdWx0IG9wdGlvbnMKKyAgcmV0dXJuIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMob3B0aW9ucyk7Cit9CisKK3N0ZDo6c3RyaW5nIEZpZWxkRGVzY3JpcHRvcjo6RGVidWdTdHJpbmdXaXRoT3B0aW9ucygKKyAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIGRlYnVnX3N0cmluZ19vcHRpb25zKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzOworICBpbnQgZGVwdGggPSAwOworICBpZiAoaXNfZXh0ZW5zaW9uKCkpIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZjb250ZW50cywgImV4dGVuZCAuJDAge1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZSgpLT5mdWxsX25hbWUoKSk7CisgICAgZGVwdGggPSAxOworICB9CisgIERlYnVnU3RyaW5nKGRlcHRoLCAmY29udGVudHMsIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKKyAgaWYgKGlzX2V4dGVuc2lvbigpKSB7CisgICAgY29udGVudHMuYXBwZW5kKCJ9XG4iKTsKKyAgfQorICByZXR1cm4gY29udGVudHM7Cit9CisKKy8vIFRoZSBmaWVsZCB0eXBlIHN0cmluZyB1c2VkIGluIEZpZWxkRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKQorc3RkOjpzdHJpbmcgRmllbGREZXNjcmlwdG9yOjpGaWVsZFR5cGVOYW1lRGVidWdTdHJpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAodHlwZSgpKSB7CisgICAgY2FzZSBUWVBFX01FU1NBR0U6CisgICAgICByZXR1cm4gIi4iICsgbWVzc2FnZV90eXBlKCktPmZ1bGxfbmFtZSgpOworICAgIGNhc2UgVFlQRV9FTlVNOgorICAgICAgcmV0dXJuICIuIiArIGVudW1fdHlwZSgpLT5mdWxsX25hbWUoKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGtUeXBlVG9OYW1lW3R5cGUoKV07CisgIH0KK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKAorICAgIGludCBkZXB0aCwgc3RkOjpzdHJpbmcqIGNvbnRlbnRzLAorICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgZGVidWdfc3RyaW5nX29wdGlvbnMpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgcHJlZml4KGRlcHRoICogMiwgJyAnKTsKKyAgc3RkOjpzdHJpbmcgZmllbGRfdHlwZTsKKworICAvLyBTcGVjaWFsIGNhc2UgbWFwIGZpZWxkcy4KKyAgaWYgKGlzX21hcCgpKSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgKKyAgICAgICAgJmZpZWxkX3R5cGUsICJtYXA8JDAsICQxPiIsCisgICAgICAgIG1lc3NhZ2VfdHlwZSgpLT5maWVsZCgwKS0+RmllbGRUeXBlTmFtZURlYnVnU3RyaW5nKCksCisgICAgICAgIG1lc3NhZ2VfdHlwZSgpLT5maWVsZCgxKS0+RmllbGRUeXBlTmFtZURlYnVnU3RyaW5nKCkpOworICB9IGVsc2UgeworICAgIGZpZWxkX3R5cGUgPSBGaWVsZFR5cGVOYW1lRGVidWdTdHJpbmcoKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGxhYmVsID0gU3RyQ2F0KGtMYWJlbFRvTmFtZVt0aGlzLT5sYWJlbCgpXSwgIiAiKTsKKworICAvLyBMYWJlbCBpcyBvbWl0dGVkIGZvciBtYXBzLCBvbmVvZiwgYW5kIHBsYWluIHByb3RvMyBmaWVsZHMuCisgIGlmIChpc19tYXAoKSB8fCByZWFsX2NvbnRhaW5pbmdfb25lb2YoKSB8fAorICAgICAgKGlzX29wdGlvbmFsKCkgJiYgIWhhc19vcHRpb25hbF9rZXl3b3JkKCkpKSB7CisgICAgbGFiZWwuY2xlYXIoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uQ29tbWVudFByaW50ZXIgY29tbWVudF9wcmludGVyKHRoaXMsIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfc3RyaW5nX29wdGlvbnMpOworICBjb21tZW50X3ByaW50ZXIuQWRkUHJlQ29tbWVudChjb250ZW50cyk7CisKKyAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgKKyAgICAgIGNvbnRlbnRzLCAiJDAkMSQyICQzID0gJDQiLCBwcmVmaXgsIGxhYmVsLCBmaWVsZF90eXBlLAorICAgICAgdHlwZSgpID09IFRZUEVfR1JPVVAgPyBtZXNzYWdlX3R5cGUoKS0+bmFtZSgpIDogbmFtZSgpLCBudW1iZXIoKSk7CisKKyAgYm9vbCBicmFja2V0ZWQgPSBmYWxzZTsKKyAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKKyAgICBicmFja2V0ZWQgPSB0cnVlOworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIgW2RlZmF1bHQgPSAkMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWVBc1N0cmluZyh0cnVlKSk7CisgIH0KKyAgaWYgKGhhc19qc29uX25hbWVfKSB7CisgICAgaWYgKCFicmFja2V0ZWQpIHsKKyAgICAgIGJyYWNrZXRlZCA9IHRydWU7CisgICAgICBjb250ZW50cy0+YXBwZW5kKCIgWyIpOworICAgIH0gZWxzZSB7CisgICAgICBjb250ZW50cy0+YXBwZW5kKCIsICIpOworICAgIH0KKyAgICBjb250ZW50cy0+YXBwZW5kKCJqc29uX25hbWUgPSBcIiIpOworICAgIGNvbnRlbnRzLT5hcHBlbmQoQ0VzY2FwZShqc29uX25hbWUoKSkpOworICAgIGNvbnRlbnRzLT5hcHBlbmQoIlwiIik7CisgIH0KKworICBzdGQ6OnN0cmluZyBmb3JtYXR0ZWRfb3B0aW9uczsKKyAgaWYgKEZvcm1hdEJyYWNrZXRlZE9wdGlvbnMoZGVwdGgsIG9wdGlvbnMoKSwgZmlsZSgpLT5wb29sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXR0ZWRfb3B0aW9ucykpIHsKKyAgICBjb250ZW50cy0+YXBwZW5kKGJyYWNrZXRlZCA/ICIsICIgOiAiIFsiKTsKKyAgICBicmFja2V0ZWQgPSB0cnVlOworICAgIGNvbnRlbnRzLT5hcHBlbmQoZm9ybWF0dGVkX29wdGlvbnMpOworICB9CisKKyAgaWYgKGJyYWNrZXRlZCkgeworICAgIGNvbnRlbnRzLT5hcHBlbmQoIl0iKTsKKyAgfQorCisgIGlmICh0eXBlKCkgPT0gVFlQRV9HUk9VUCkgeworICAgIGlmIChkZWJ1Z19zdHJpbmdfb3B0aW9ucy5lbGlkZV9ncm91cF9ib2R5KSB7CisgICAgICBjb250ZW50cy0+YXBwZW5kKCIgeyAuLi4gfTtcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlX3R5cGUoKS0+RGVidWdTdHJpbmcoZGVwdGgsIGNvbnRlbnRzLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNsdWRlX29wZW5pbmdfY2xhdXNlICovIGZhbHNlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29udGVudHMtPmFwcGVuZCgiO1xuIik7CisgIH0KKworICBjb21tZW50X3ByaW50ZXIuQWRkUG9zdENvbW1lbnQoY29udGVudHMpOworfQorCitzdGQ6OnN0cmluZyBPbmVvZkRlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgeworICBEZWJ1Z1N0cmluZ09wdGlvbnMgb3B0aW9uczsgIC8vIGRlZmF1bHQgdmFsdWVzCisgIHJldHVybiBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKG9wdGlvbnMpOworfQorCitzdGQ6OnN0cmluZyBPbmVvZkRlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoCisgICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzOworICBEZWJ1Z1N0cmluZygwLCAmY29udGVudHMsIG9wdGlvbnMpOworICByZXR1cm4gY29udGVudHM7Cit9CisKK3ZvaWQgT25lb2ZEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygKKyAgICBpbnQgZGVwdGgsIHN0ZDo6c3RyaW5nKiBjb250ZW50cywKKyAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIGRlYnVnX3N0cmluZ19vcHRpb25zKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CisgICsrZGVwdGg7CisgIFNvdXJjZUxvY2F0aW9uQ29tbWVudFByaW50ZXIgY29tbWVudF9wcmludGVyKHRoaXMsIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfc3RyaW5nX29wdGlvbnMpOworICBjb21tZW50X3ByaW50ZXIuQWRkUHJlQ29tbWVudChjb250ZW50cyk7CisgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMG9uZW9mICQxIHsiLCBwcmVmaXgsIG5hbWUoKSk7CisKKyAgRm9ybWF0TGluZU9wdGlvbnMoZGVwdGgsIG9wdGlvbnMoKSwgY29udGFpbmluZ190eXBlKCktPmZpbGUoKS0+cG9vbCgpLAorICAgICAgICAgICAgICAgICAgICBjb250ZW50cyk7CisKKyAgaWYgKGRlYnVnX3N0cmluZ19vcHRpb25zLmVsaWRlX29uZW9mX2JvZHkpIHsKKyAgICBjb250ZW50cy0+YXBwZW5kKCIgLi4uIH1cbiIpOworICB9IGVsc2UgeworICAgIGNvbnRlbnRzLT5hcHBlbmQoIlxuIik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGZpZWxkKGkpLT5EZWJ1Z1N0cmluZyhkZXB0aCwgY29udGVudHMsIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKKyAgICB9CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwfVxuIiwgcHJlZml4KTsKKyAgfQorICBjb21tZW50X3ByaW50ZXIuQWRkUG9zdENvbW1lbnQoY29udGVudHMpOworfQorCitzdGQ6OnN0cmluZyBFbnVtRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSBjb25zdCB7CisgIERlYnVnU3RyaW5nT3B0aW9ucyBvcHRpb25zOyAgLy8gZGVmYXVsdCB2YWx1ZXMKKyAgcmV0dXJuIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMob3B0aW9ucyk7Cit9CisKK3N0ZDo6c3RyaW5nIEVudW1EZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKAorICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3QgeworICBzdGQ6OnN0cmluZyBjb250ZW50czsKKyAgRGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzLCBvcHRpb25zKTsKKyAgcmV0dXJuIGNvbnRlbnRzOworfQorCit2b2lkIEVudW1EZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygKKyAgICBpbnQgZGVwdGgsIHN0ZDo6c3RyaW5nKiBjb250ZW50cywKKyAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIGRlYnVnX3N0cmluZ19vcHRpb25zKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CisgICsrZGVwdGg7CisKKyAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlciBjb21tZW50X3ByaW50ZXIodGhpcywgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7CisgIGNvbW1lbnRfcHJpbnRlci5BZGRQcmVDb21tZW50KGNvbnRlbnRzKTsKKworICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDBlbnVtICQxIHtcbiIsIHByZWZpeCwgbmFtZSgpKTsKKworICBGb3JtYXRMaW5lT3B0aW9ucyhkZXB0aCwgb3B0aW9ucygpLCBmaWxlKCktPnBvb2woKSwgY29udGVudHMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVfY291bnQoKTsgaSsrKSB7CisgICAgdmFsdWUoaSktPkRlYnVnU3RyaW5nKGRlcHRoLCBjb250ZW50cywgZGVidWdfc3RyaW5nX29wdGlvbnMpOworICB9CisKKyAgaWYgKHJlc2VydmVkX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwICByZXNlcnZlZCAiLCBwcmVmaXgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzZXJ2ZWRfcmFuZ2VfY291bnQoKTsgaSsrKSB7CisgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvcjo6UmVzZXJ2ZWRSYW5nZSogcmFuZ2UgPSByZXNlcnZlZF9yYW5nZShpKTsKKyAgICAgIGlmIChyYW5nZS0+ZW5kID09IHJhbmdlLT5zdGFydCkgeworICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDAsICIsIHJhbmdlLT5zdGFydCk7CisgICAgICB9IGVsc2UgaWYgKHJhbmdlLT5lbmQgPT0gSU5UX01BWCkgeworICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDAgdG8gbWF4LCAiLCByYW5nZS0+c3RhcnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwIHRvICQxLCAiLCByYW5nZS0+c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UtPmVuZCk7CisgICAgICB9CisgICAgfQorICAgIGNvbnRlbnRzLT5yZXBsYWNlKGNvbnRlbnRzLT5zaXplKCkgLSAyLCAyLCAiO1xuIik7CisgIH0KKworICBpZiAocmVzZXJ2ZWRfbmFtZV9jb3VudCgpID4gMCkgeworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCAgcmVzZXJ2ZWQgIiwgcHJlZml4KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc2VydmVkX25hbWVfY291bnQoKTsgaSsrKSB7CisgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiXCIkMFwiLCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRXNjYXBlKHJlc2VydmVkX25hbWUoaSkpKTsKKyAgICB9CisgICAgY29udGVudHMtPnJlcGxhY2UoY29udGVudHMtPnNpemUoKSAtIDIsIDIsICI7XG4iKTsKKyAgfQorCisgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMH1cbiIsIHByZWZpeCk7CisKKyAgY29tbWVudF9wcmludGVyLkFkZFBvc3RDb21tZW50KGNvbnRlbnRzKTsKK30KKworc3RkOjpzdHJpbmcgRW51bVZhbHVlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSBjb25zdCB7CisgIERlYnVnU3RyaW5nT3B0aW9ucyBvcHRpb25zOyAgLy8gZGVmYXVsdCB2YWx1ZXMKKyAgcmV0dXJuIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMob3B0aW9ucyk7Cit9CisKK3N0ZDo6c3RyaW5nIEVudW1WYWx1ZURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoCisgICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzOworICBEZWJ1Z1N0cmluZygwLCAmY29udGVudHMsIG9wdGlvbnMpOworICByZXR1cm4gY29udGVudHM7Cit9CisKK3ZvaWQgRW51bVZhbHVlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoCisgICAgaW50IGRlcHRoLCBzdGQ6OnN0cmluZyogY29udGVudHMsCisgICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBkZWJ1Z19zdHJpbmdfb3B0aW9ucykgY29uc3QgeworICBzdGQ6OnN0cmluZyBwcmVmaXgoZGVwdGggKiAyLCAnICcpOworCisgIFNvdXJjZUxvY2F0aW9uQ29tbWVudFByaW50ZXIgY29tbWVudF9wcmludGVyKHRoaXMsIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfc3RyaW5nX29wdGlvbnMpOworICBjb21tZW50X3ByaW50ZXIuQWRkUHJlQ29tbWVudChjb250ZW50cyk7CisKKyAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwJDEgPSAkMiIsIHByZWZpeCwgbmFtZSgpLCBudW1iZXIoKSk7CisKKyAgc3RkOjpzdHJpbmcgZm9ybWF0dGVkX29wdGlvbnM7CisgIGlmIChGb3JtYXRCcmFja2V0ZWRPcHRpb25zKGRlcHRoLCBvcHRpb25zKCksIHR5cGUoKS0+ZmlsZSgpLT5wb29sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXR0ZWRfb3B0aW9ucykpIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiIFskMF0iLCBmb3JtYXR0ZWRfb3B0aW9ucyk7CisgIH0KKyAgY29udGVudHMtPmFwcGVuZCgiO1xuIik7CisKKyAgY29tbWVudF9wcmludGVyLkFkZFBvc3RDb21tZW50KGNvbnRlbnRzKTsKK30KKworc3RkOjpzdHJpbmcgU2VydmljZURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgeworICBEZWJ1Z1N0cmluZ09wdGlvbnMgb3B0aW9uczsgIC8vIGRlZmF1bHQgdmFsdWVzCisgIHJldHVybiBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKG9wdGlvbnMpOworfQorCitzdGQ6OnN0cmluZyBTZXJ2aWNlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmdXaXRoT3B0aW9ucygKKyAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgY29udGVudHM7CisgIERlYnVnU3RyaW5nKCZjb250ZW50cywgb3B0aW9ucyk7CisgIHJldHVybiBjb250ZW50czsKK30KKwordm9pZCBTZXJ2aWNlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoCisgICAgc3RkOjpzdHJpbmcqIGNvbnRlbnRzLAorICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgZGVidWdfc3RyaW5nX29wdGlvbnMpIGNvbnN0IHsKKyAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlciBjb21tZW50X3ByaW50ZXIodGhpcywgLyogcHJlZml4ICovICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7CisgIGNvbW1lbnRfcHJpbnRlci5BZGRQcmVDb21tZW50KGNvbnRlbnRzKTsKKworICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAic2VydmljZSAkMCB7XG4iLCBuYW1lKCkpOworCisgIEZvcm1hdExpbmVPcHRpb25zKDEsIG9wdGlvbnMoKSwgZmlsZSgpLT5wb29sKCksIGNvbnRlbnRzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBtZXRob2QoaSktPkRlYnVnU3RyaW5nKDEsIGNvbnRlbnRzLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7CisgIH0KKworICBjb250ZW50cy0+YXBwZW5kKCJ9XG4iKTsKKworICBjb21tZW50X3ByaW50ZXIuQWRkUG9zdENvbW1lbnQoY29udGVudHMpOworfQorCitzdGQ6OnN0cmluZyBNZXRob2REZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsKKyAgRGVidWdTdHJpbmdPcHRpb25zIG9wdGlvbnM7ICAvLyBkZWZhdWx0IHZhbHVlcworICByZXR1cm4gRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhvcHRpb25zKTsKK30KKworc3RkOjpzdHJpbmcgTWV0aG9kRGVzY3JpcHRvcjo6RGVidWdTdHJpbmdXaXRoT3B0aW9ucygKKyAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgY29udGVudHM7CisgIERlYnVnU3RyaW5nKDAsICZjb250ZW50cywgb3B0aW9ucyk7CisgIHJldHVybiBjb250ZW50czsKK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygKKyAgICBpbnQgZGVwdGgsIHN0ZDo6c3RyaW5nKiBjb250ZW50cywKKyAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIGRlYnVnX3N0cmluZ19vcHRpb25zKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CisgICsrZGVwdGg7CisKKyAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlciBjb21tZW50X3ByaW50ZXIodGhpcywgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7CisgIGNvbW1lbnRfcHJpbnRlci5BZGRQcmVDb21tZW50KGNvbnRlbnRzKTsKKworICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKAorICAgICAgY29udGVudHMsICIkMHJwYyAkMSgkNC4kMikgcmV0dXJucyAoJDUuJDMpIiwgcHJlZml4LCBuYW1lKCksCisgICAgICBpbnB1dF90eXBlKCktPmZ1bGxfbmFtZSgpLCBvdXRwdXRfdHlwZSgpLT5mdWxsX25hbWUoKSwKKyAgICAgIGNsaWVudF9zdHJlYW1pbmcoKSA/ICJzdHJlYW0gIiA6ICIiLCBzZXJ2ZXJfc3RyZWFtaW5nKCkgPyAic3RyZWFtICIgOiAiIik7CisKKyAgc3RkOjpzdHJpbmcgZm9ybWF0dGVkX29wdGlvbnM7CisgIGlmIChGb3JtYXRMaW5lT3B0aW9ucyhkZXB0aCwgb3B0aW9ucygpLCBzZXJ2aWNlKCktPmZpbGUoKS0+cG9vbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdHRlZF9vcHRpb25zKSkgeworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIge1xuJDAkMX1cbiIsIGZvcm1hdHRlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4KTsKKyAgfSBlbHNlIHsKKyAgICBjb250ZW50cy0+YXBwZW5kKCI7XG4iKTsKKyAgfQorCisgIGNvbW1lbnRfcHJpbnRlci5BZGRQb3N0Q29tbWVudChjb250ZW50cyk7Cit9CisKKy8vIExvY2F0aW9uIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYm9vbCBGaWxlRGVzY3JpcHRvcjo6R2V0U291cmNlTG9jYXRpb24oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKG91dF9sb2NhdGlvbiAhPSBudWxscHRyKTsKKyAgaWYgKHNvdXJjZV9jb2RlX2luZm9fKSB7CisgICAgaWYgKGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBsb2MgPQorICAgICAgICAgICAgdGFibGVzXy0+R2V0U291cmNlTG9jYXRpb24ocGF0aCwgc291cmNlX2NvZGVfaW5mb18pKSB7CisgICAgICBjb25zdCBSZXBlYXRlZEZpZWxkPGludDMyX3Q+JiBzcGFuID0gbG9jLT5zcGFuKCk7CisgICAgICBpZiAoc3Bhbi5zaXplKCkgPT0gMyB8fCBzcGFuLnNpemUoKSA9PSA0KSB7CisgICAgICAgIG91dF9sb2NhdGlvbi0+c3RhcnRfbGluZSA9IHNwYW4uR2V0KDApOworICAgICAgICBvdXRfbG9jYXRpb24tPnN0YXJ0X2NvbHVtbiA9IHNwYW4uR2V0KDEpOworICAgICAgICBvdXRfbG9jYXRpb24tPmVuZF9saW5lID0gc3Bhbi5HZXQoc3Bhbi5zaXplKCkgPT0gMyA/IDAgOiAyKTsKKyAgICAgICAgb3V0X2xvY2F0aW9uLT5lbmRfY29sdW1uID0gc3Bhbi5HZXQoc3Bhbi5zaXplKCkgLSAxKTsKKworICAgICAgICBvdXRfbG9jYXRpb24tPmxlYWRpbmdfY29tbWVudHMgPSBsb2MtPmxlYWRpbmdfY29tbWVudHMoKTsKKyAgICAgICAgb3V0X2xvY2F0aW9uLT50cmFpbGluZ19jb21tZW50cyA9IGxvYy0+dHJhaWxpbmdfY29tbWVudHMoKTsKKyAgICAgICAgb3V0X2xvY2F0aW9uLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzLmFzc2lnbigKKyAgICAgICAgICAgIGxvYy0+bGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpLmJlZ2luKCksCisgICAgICAgICAgICBsb2MtPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKS5lbmQoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRmlsZURlc2NyaXB0b3I6OkdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0IHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBwYXRoOyAgLy8gZW1wdHkgcGF0aCBmb3Igcm9vdCBGaWxlRGVzY3JpcHRvcgorICByZXR1cm4gR2V0U291cmNlTG9jYXRpb24ocGF0aCwgb3V0X2xvY2F0aW9uKTsKK30KKworYm9vbCBGaWVsZERlc2NyaXB0b3I6OmlzX3BhY2tlZCgpIGNvbnN0IHsKKyAgaWYgKCFpc19wYWNrYWJsZSgpKSByZXR1cm4gZmFsc2U7CisgIGlmIChmaWxlXy0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzIpIHsKKyAgICByZXR1cm4gKG9wdGlvbnNfICE9IG51bGxwdHIpICYmIG9wdGlvbnNfLT5wYWNrZWQoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gb3B0aW9uc18gPT0gbnVsbHB0ciB8fCAhb3B0aW9uc18tPmhhc19wYWNrZWQoKSB8fCBvcHRpb25zXy0+cGFja2VkKCk7CisgIH0KK30KKworYm9vbCBEZXNjcmlwdG9yOjpHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdCB7CisgIHN0ZDo6dmVjdG9yPGludD4gcGF0aDsKKyAgR2V0TG9jYXRpb25QYXRoKCZwYXRoKTsKKyAgcmV0dXJuIGZpbGUoKS0+R2V0U291cmNlTG9jYXRpb24ocGF0aCwgb3V0X2xvY2F0aW9uKTsKK30KKworYm9vbCBGaWVsZERlc2NyaXB0b3I6OkdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0IHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBwYXRoOworICBHZXRMb2NhdGlvblBhdGgoJnBhdGgpOworICByZXR1cm4gZmlsZSgpLT5HZXRTb3VyY2VMb2NhdGlvbihwYXRoLCBvdXRfbG9jYXRpb24pOworfQorCitib29sIE9uZW9mRGVzY3JpcHRvcjo6R2V0U291cmNlTG9jYXRpb24oU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3QgeworICBzdGQ6OnZlY3RvcjxpbnQ+IHBhdGg7CisgIEdldExvY2F0aW9uUGF0aCgmcGF0aCk7CisgIHJldHVybiBjb250YWluaW5nX3R5cGUoKS0+ZmlsZSgpLT5HZXRTb3VyY2VMb2NhdGlvbihwYXRoLCBvdXRfbG9jYXRpb24pOworfQorCitib29sIEVudW1EZXNjcmlwdG9yOjpHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdCB7CisgIHN0ZDo6dmVjdG9yPGludD4gcGF0aDsKKyAgR2V0TG9jYXRpb25QYXRoKCZwYXRoKTsKKyAgcmV0dXJuIGZpbGUoKS0+R2V0U291cmNlTG9jYXRpb24ocGF0aCwgb3V0X2xvY2F0aW9uKTsKK30KKworYm9vbCBNZXRob2REZXNjcmlwdG9yOjpHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdCB7CisgIHN0ZDo6dmVjdG9yPGludD4gcGF0aDsKKyAgR2V0TG9jYXRpb25QYXRoKCZwYXRoKTsKKyAgcmV0dXJuIHNlcnZpY2UoKS0+ZmlsZSgpLT5HZXRTb3VyY2VMb2NhdGlvbihwYXRoLCBvdXRfbG9jYXRpb24pOworfQorCitib29sIFNlcnZpY2VEZXNjcmlwdG9yOjpHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdCB7CisgIHN0ZDo6dmVjdG9yPGludD4gcGF0aDsKKyAgR2V0TG9jYXRpb25QYXRoKCZwYXRoKTsKKyAgcmV0dXJuIGZpbGUoKS0+R2V0U291cmNlTG9jYXRpb24ocGF0aCwgb3V0X2xvY2F0aW9uKTsKK30KKworYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yOjpHZXRTb3VyY2VMb2NhdGlvbigKKyAgICBTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdCB7CisgIHN0ZDo6dmVjdG9yPGludD4gcGF0aDsKKyAgR2V0TG9jYXRpb25QYXRoKCZwYXRoKTsKKyAgcmV0dXJuIHR5cGUoKS0+ZmlsZSgpLT5HZXRTb3VyY2VMb2NhdGlvbihwYXRoLCBvdXRfbG9jYXRpb24pOworfQorCit2b2lkIERlc2NyaXB0b3I6OkdldExvY2F0aW9uUGF0aChzdGQ6OnZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0IHsKKyAgaWYgKGNvbnRhaW5pbmdfdHlwZSgpKSB7CisgICAgY29udGFpbmluZ190eXBlKCktPkdldExvY2F0aW9uUGF0aChvdXRwdXQpOworICAgIG91dHB1dC0+cHVzaF9iYWNrKERlc2NyaXB0b3JQcm90bzo6a05lc3RlZFR5cGVGaWVsZE51bWJlcik7CisgICAgb3V0cHV0LT5wdXNoX2JhY2soaW5kZXgoKSk7CisgIH0gZWxzZSB7CisgICAgb3V0cHV0LT5wdXNoX2JhY2soRmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXIpOworICAgIG91dHB1dC0+cHVzaF9iYWNrKGluZGV4KCkpOworICB9Cit9CisKK3ZvaWQgRmllbGREZXNjcmlwdG9yOjpHZXRMb2NhdGlvblBhdGgoc3RkOjp2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdCB7CisgIGlmIChpc19leHRlbnNpb24oKSkgeworICAgIGlmIChleHRlbnNpb25fc2NvcGUoKSA9PSBudWxscHRyKSB7CisgICAgICBvdXRwdXQtPnB1c2hfYmFjayhGaWxlRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXIpOworICAgICAgb3V0cHV0LT5wdXNoX2JhY2soaW5kZXgoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV4dGVuc2lvbl9zY29wZSgpLT5HZXRMb2NhdGlvblBhdGgob3V0cHV0KTsKKyAgICAgIG91dHB1dC0+cHVzaF9iYWNrKERlc2NyaXB0b3JQcm90bzo6a0V4dGVuc2lvbkZpZWxkTnVtYmVyKTsKKyAgICAgIG91dHB1dC0+cHVzaF9iYWNrKGluZGV4KCkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb250YWluaW5nX3R5cGUoKS0+R2V0TG9jYXRpb25QYXRoKG91dHB1dCk7CisgICAgb3V0cHV0LT5wdXNoX2JhY2soRGVzY3JpcHRvclByb3RvOjprRmllbGRGaWVsZE51bWJlcik7CisgICAgb3V0cHV0LT5wdXNoX2JhY2soaW5kZXgoKSk7CisgIH0KK30KKwordm9pZCBPbmVvZkRlc2NyaXB0b3I6OkdldExvY2F0aW9uUGF0aChzdGQ6OnZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0IHsKKyAgY29udGFpbmluZ190eXBlKCktPkdldExvY2F0aW9uUGF0aChvdXRwdXQpOworICBvdXRwdXQtPnB1c2hfYmFjayhEZXNjcmlwdG9yUHJvdG86OmtPbmVvZkRlY2xGaWVsZE51bWJlcik7CisgIG91dHB1dC0+cHVzaF9iYWNrKGluZGV4KCkpOworfQorCit2b2lkIEVudW1EZXNjcmlwdG9yOjpHZXRMb2NhdGlvblBhdGgoc3RkOjp2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdCB7CisgIGlmIChjb250YWluaW5nX3R5cGUoKSkgeworICAgIGNvbnRhaW5pbmdfdHlwZSgpLT5HZXRMb2NhdGlvblBhdGgob3V0cHV0KTsKKyAgICBvdXRwdXQtPnB1c2hfYmFjayhEZXNjcmlwdG9yUHJvdG86OmtFbnVtVHlwZUZpZWxkTnVtYmVyKTsKKyAgICBvdXRwdXQtPnB1c2hfYmFjayhpbmRleCgpKTsKKyAgfSBlbHNlIHsKKyAgICBvdXRwdXQtPnB1c2hfYmFjayhGaWxlRGVzY3JpcHRvclByb3RvOjprRW51bVR5cGVGaWVsZE51bWJlcik7CisgICAgb3V0cHV0LT5wdXNoX2JhY2soaW5kZXgoKSk7CisgIH0KK30KKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yOjpHZXRMb2NhdGlvblBhdGgoc3RkOjp2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdCB7CisgIHR5cGUoKS0+R2V0TG9jYXRpb25QYXRoKG91dHB1dCk7CisgIG91dHB1dC0+cHVzaF9iYWNrKEVudW1EZXNjcmlwdG9yUHJvdG86OmtWYWx1ZUZpZWxkTnVtYmVyKTsKKyAgb3V0cHV0LT5wdXNoX2JhY2soaW5kZXgoKSk7Cit9CisKK3ZvaWQgU2VydmljZURlc2NyaXB0b3I6OkdldExvY2F0aW9uUGF0aChzdGQ6OnZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0IHsKKyAgb3V0cHV0LT5wdXNoX2JhY2soRmlsZURlc2NyaXB0b3JQcm90bzo6a1NlcnZpY2VGaWVsZE51bWJlcik7CisgIG91dHB1dC0+cHVzaF9iYWNrKGluZGV4KCkpOworfQorCit2b2lkIE1ldGhvZERlc2NyaXB0b3I6OkdldExvY2F0aW9uUGF0aChzdGQ6OnZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0IHsKKyAgc2VydmljZSgpLT5HZXRMb2NhdGlvblBhdGgob3V0cHV0KTsKKyAgb3V0cHV0LT5wdXNoX2JhY2soU2VydmljZURlc2NyaXB0b3JQcm90bzo6a01ldGhvZEZpZWxkTnVtYmVyKTsKKyAgb3V0cHV0LT5wdXNoX2JhY2soaW5kZXgoKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworbmFtZXNwYWNlIHsKKworLy8gUmVwcmVzZW50cyBhbiBvcHRpb25zIG1lc3NhZ2UgdG8gaW50ZXJwcmV0LiBFeHRlbnNpb24gbmFtZXMgaW4gdGhlIG9wdGlvbgorLy8gbmFtZSBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gbmFtZV9zY29wZS4gZWxlbWVudF9uYW1lIGFuZCBvcmlnX29wdCBhcmUKKy8vIHVzZWQgb25seSBmb3IgZXJyb3IgcmVwb3J0aW5nIChzaW5jZSB0aGUgcGFyc2VyIHJlY29yZHMgbG9jYXRpb25zIGFnYWluc3QKKy8vIHBvaW50ZXJzIGluIHRoZSBvcmlnaW5hbCBvcHRpb25zLCBub3QgdGhlIG11dGFibGUgY29weSkuIFRoZSBNZXNzYWdlIG11c3QgYmUKKy8vIG9uZSBvZiB0aGUgT3B0aW9ucyBtZXNzYWdlcyBpbiBkZXNjcmlwdG9yLnByb3RvLgorc3RydWN0IE9wdGlvbnNUb0ludGVycHJldCB7CisgIE9wdGlvbnNUb0ludGVycHJldChjb25zdCBzdGQ6OnN0cmluZyYgbnMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHBhdGgsIGNvbnN0IE1lc3NhZ2UqIG9yaWdfb3B0LAorICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3B0KQorICAgICAgOiBuYW1lX3Njb3BlKG5zKSwKKyAgICAgICAgZWxlbWVudF9uYW1lKGVsKSwKKyAgICAgICAgZWxlbWVudF9wYXRoKHBhdGgpLAorICAgICAgICBvcmlnaW5hbF9vcHRpb25zKG9yaWdfb3B0KSwKKyAgICAgICAgb3B0aW9ucyhvcHQpIHt9CisgIHN0ZDo6c3RyaW5nIG5hbWVfc2NvcGU7CisgIHN0ZDo6c3RyaW5nIGVsZW1lbnRfbmFtZTsKKyAgc3RkOjp2ZWN0b3I8aW50PiBlbGVtZW50X3BhdGg7CisgIGNvbnN0IE1lc3NhZ2UqIG9yaWdpbmFsX29wdGlvbnM7CisgIE1lc3NhZ2UqIG9wdGlvbnM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgRGVzY3JpcHRvckJ1aWxkZXIgeworIHB1YmxpYzoKKyAgRGVzY3JpcHRvckJ1aWxkZXIoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsIERlc2NyaXB0b3JQb29sOjpUYWJsZXMqIHRhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpOworICB+RGVzY3JpcHRvckJ1aWxkZXIoKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogQnVpbGRGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBPcHRpb25JbnRlcnByZXRlcjsKKworICAvLyBOb24tcmVjdXJzaXZlIHBhcnQgb2YgQnVpbGRGaWxlIGZ1bmN0aW9uYWxpdHkuCisgIEZpbGVEZXNjcmlwdG9yKiBCdWlsZEZpbGVJbXBsKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpOworCisgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sXzsKKyAgRGVzY3JpcHRvclBvb2w6OlRhYmxlcyogdGFibGVzXzsgIC8vIGZvciBjb252ZW5pZW5jZQorICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3Rvcl87CisKKyAgLy8gQXMgd2UgYnVpbGQgZGVzY3JpcHRvcnMgd2Ugc3RvcmUgY29waWVzIG9mIHRoZSBvcHRpb25zIG1lc3NhZ2VzIGluCisgIC8vIHRoZW0uIFdlIHB1dCBwb2ludGVycyB0byB0aG9zZSBjb3BpZXMgaW4gdGhpcyB2ZWN0b3IsIGFzIHdlIGJ1aWxkLCBzbyB3ZQorICAvLyBjYW4gbGF0ZXIgKGFmdGVyIGNyb3NzLWxpbmtpbmcpIGludGVycHJldCB0aG9zZSBvcHRpb25zLgorICBzdGQ6OnZlY3RvcjxPcHRpb25zVG9JbnRlcnByZXQ+IG9wdGlvbnNfdG9faW50ZXJwcmV0XzsKKworICBib29sIGhhZF9lcnJvcnNfOworICBzdGQ6OnN0cmluZyBmaWxlbmFtZV87CisgIEZpbGVEZXNjcmlwdG9yKiBmaWxlXzsKKyAgRmlsZURlc2NyaXB0b3JUYWJsZXMqIGZpbGVfdGFibGVzXzsKKyAgc3RkOjpzZXQ8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBkZXBlbmRlbmNpZXNfOworCisgIHN0cnVjdCBNZXNzYWdlSGludHMgeworICAgIGludCBmaWVsZHNfdG9fc3VnZ2VzdCA9IDA7CisgICAgY29uc3QgTWVzc2FnZSogZmlyc3RfcmVhc29uID0gbnVsbHB0cjsKKyAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gZmlyc3RfcmVhc29uX2xvY2F0aW9uID0KKyAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uOjpPVEhFUjsKKworICAgIHZvaWQgUmVxdWVzdEhpbnRPbkZpZWxkTnVtYmVycygKKyAgICAgICAgY29uc3QgTWVzc2FnZSYgcmVhc29uLAorICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gcmVhc29uX2xvY2F0aW9uLAorICAgICAgICBpbnQgcmFuZ2Vfc3RhcnQgPSAwLCBpbnQgcmFuZ2VfZW5kID0gMSkgeworICAgICAgYXV0byBmaXQgPSBbXShpbnQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWluKHN0ZDo6bWF4KHZhbHVlLCAwKSwgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyKTsKKyAgICAgIH07CisgICAgICBmaWVsZHNfdG9fc3VnZ2VzdCA9CisgICAgICAgICAgZml0KGZpZWxkc190b19zdWdnZXN0ICsgZml0KGZpdChyYW5nZV9lbmQpIC0gZml0KHJhbmdlX3N0YXJ0KSkpOworICAgICAgaWYgKGZpcnN0X3JlYXNvbikgcmV0dXJuOworICAgICAgZmlyc3RfcmVhc29uID0gJnJlYXNvbjsKKyAgICAgIGZpcnN0X3JlYXNvbl9sb2NhdGlvbiA9IHJlYXNvbl9sb2NhdGlvbjsKKyAgICB9CisgIH07CisKKyAgc3RkOjp1bm9yZGVyZWRfbWFwPGNvbnN0IERlc2NyaXB0b3IqLCBNZXNzYWdlSGludHM+IG1lc3NhZ2VfaGludHNfOworCisgIC8vIHVudXNlZF9kZXBlbmRlbmN5XyBpcyB1c2VkIHRvIHJlY29yZCB0aGUgdW51c2VkIGltcG9ydGVkIGZpbGVzLgorICAvLyBOb3RlOiBwdWJsaWMgaW1wb3J0IGlzIG5vdCBjb25zaWRlcmVkLgorICBzdGQ6OnNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IHVudXNlZF9kZXBlbmRlbmN5XzsKKworICAvLyBJZiBMb29rdXBTeW1ib2woKSBmaW5kcyBhIHN5bWJvbCB0aGF0IGlzIGluIGEgZmlsZSB3aGljaCBpcyBub3QgYSBkZWNsYXJlZAorICAvLyBkZXBlbmRlbmN5IG9mIHRoaXMgZmlsZSwgaXQgd2lsbCBmYWlsLCBidXQgd2lsbCBzZXQKKyAgLy8gcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5XyB0byBwb2ludCBhdCB0aGF0IGZpbGUuICBUaGlzIGlzIG9ubHkgdXNlZAorICAvLyBieSBBZGROb3REZWZpbmVkRXJyb3IoKSB0byByZXBvcnQgYSBtb3JlIHVzZWZ1bCBlcnJvciBtZXNzYWdlLgorICAvLyBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfbmFtZV8gaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0aGF0IHdhcworICAvLyBhY3R1YWxseSBmb3VuZCBpbiBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfLCB3aGljaCBtYXkgYmUgYSBwYXJlbnQKKyAgLy8gb2YgdGhlIHN5bWJvbCBhY3R1YWxseSBsb29rZWQgZm9yLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5XzsKKyAgc3RkOjpzdHJpbmcgcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5X25hbWVfOworCisgIC8vIElmIExvb2t1cFN5bWJvbCgpIGNvdWxkIHJlc29sdmUgYSBzeW1ib2wgd2hpY2ggaXMgbm90IGRlZmluZWQsCisgIC8vIHJlY29yZCB0aGUgcmVzb2x2ZWQgbmFtZS4gIFRoaXMgaXMgb25seSB1c2VkIGJ5IEFkZE5vdERlZmluZWRFcnJvcigpCisgIC8vIHRvIHJlcG9ydCBhIG1vcmUgdXNlZnVsIGVycm9yIG1lc3NhZ2UuCisgIHN0ZDo6c3RyaW5nIHVuZGVmaW5lX3Jlc29sdmVkX25hbWVfOworCisgIC8vIFRyYWNrZXIgZm9yIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoIHRvIGltcGxlbWVudCByZWN1cnNpb24gcHJvdGVjdGlvbi4KKyAgLy8KKyAgLy8gQ291bnRzIGRvd24gdG8gMCB3aGVuIHRoZXJlIGlzIG5vIGRlcHRoIHJlbWFpbmluZy4KKyAgLy8KKyAgLy8gTWF4aW11bSByZWN1cnNpb24gZGVwdGggY29ycmVzcG9uZHMgdG8gMzIgbmVzdGVkIG1lc3NhZ2UgZGVjbGFyYXRpb25zLgorICBpbnQgcmVjdXJzaW9uX2RlcHRoXyA9IDMyOworCisgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIGVsZW1lbnRfbmFtZSwgY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yKTsKKyAgdm9pZCBBZGRFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgZWxlbWVudF9uYW1lLCBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcik7CisgIHZvaWQgQWRkUmVjdXJzaXZlSW1wb3J0RXJyb3IoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sIGludCBmcm9tX2hlcmUpOworICB2b2lkIEFkZFR3aWNlTGlzdGVkRXJyb3IoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sIGludCBpbmRleCk7CisgIHZvaWQgQWRkSW1wb3J0RXJyb3IoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sIGludCBpbmRleCk7CisKKyAgLy8gQWRkcyBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgdW5kZWZpbmVkX3N5bWJvbCB3YXMgbm90IGRlZmluZWQuICBNdXN0CisgIC8vIG9ubHkgYmUgY2FsbGVkIGFmdGVyIExvb2t1cFN5bWJvbCgpIGZhaWxzLgorICB2b2lkIEFkZE5vdERlZmluZWRFcnJvcigKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbGVtZW50X25hbWUsIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3IsCisgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdW5kZWZpbmVkX3N5bWJvbCk7CisKKyAgdm9pZCBBZGRXYXJuaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBlbGVtZW50X25hbWUsIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IpOworCisgIC8vIFNpbGx5IGhlbHBlciB3aGljaCBkZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGluIHRoZSBnaXZlbiBwYWNrYWdlLgorICAvLyBJLmUuLCBlaXRoZXIgZmlsZS0+cGFja2FnZSgpID09IHBhY2thZ2VfbmFtZSBvciBmaWxlLT5wYWNrYWdlKCkgaXMgYQorICAvLyBuZXN0ZWQgcGFja2FnZSB3aXRoaW4gcGFja2FnZV9uYW1lLgorICBib29sIElzSW5QYWNrYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZV9uYW1lKTsKKworICAvLyBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggZmluZHMgYWxsIHB1YmxpYyBkZXBlbmRlbmNpZXMgb2YgdGhlIGdpdmVuIGZpbGUsIGFuZAorICAvLyBzdG9yZXMgdGhlIHRoZW0gaW4gdGhlIGRlcGVuZGVuY2llc18gc2V0IGluIHRoZSBidWlsZGVyLgorICB2b2lkIFJlY29yZFB1YmxpY0RlcGVuZGVuY2llcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisKKyAgLy8gTGlrZSB0YWJsZXNfLT5GaW5kU3ltYm9sKCksIGJ1dCBhZGRpdGlvbmFsbHk6CisgIC8vIC0gU2VhcmNoIHRoZSBwb29sJ3MgdW5kZXJsYXkgaWYgbm90IGZvdW5kIGluIHRhYmxlc18uCisgIC8vIC0gSW5zdXJlIHRoYXQgdGhlIHJlc3VsdGluZyBTeW1ib2wgaXMgZnJvbSBvbmUgb2YgdGhlIGZpbGUncyBkZWNsYXJlZAorICAvLyAgIGRlcGVuZGVuY2llcy4KKyAgU3ltYm9sIEZpbmRTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGJvb2wgYnVpbGRfaXQgPSB0cnVlKTsKKworICAvLyBMaWtlIEZpbmRTeW1ib2woKSBidXQgZG9lcyBub3QgcmVxdWlyZSB0aGF0IHRoZSBzeW1ib2wgaXMgaW4gb25lIG9mIHRoZQorICAvLyBmaWxlJ3MgZGVjbGFyZWQgZGVwZW5kZW5jaWVzLgorICBTeW1ib2wgRmluZFN5bWJvbE5vdEVuZm9yY2luZ0RlcHMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJ1aWxkX2l0ID0gdHJ1ZSk7CisKKyAgLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBib2R5IG9mIEZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKCkuCisgIFN5bWJvbCBGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwc0hlbHBlcihjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBidWlsZF9pdCA9IHRydWUpOworCisgIC8vIExpa2UgRmluZFN5bWJvbCgpLCBidXQgbG9va3MgdXAgdGhlIG5hbWUgcmVsYXRpdmUgdG8gc29tZSBvdGhlciBzeW1ib2wKKyAgLy8gbmFtZS4gIFRoaXMgZmlyc3Qgc2VhcmNoZXMgc2libGluZ3Mgb2YgcmVsYXRpdmVfdG8sIHRoZW4gc2libGluZ3Mgb2YgaXRzCisgIC8vIHBhcmVudHMsIGV0Yy4gIEZvciBleGFtcGxlLCBMb29rdXBTeW1ib2woImZvby5iYXIiLCAiYmF6Lm1vby5jb3JnZSIpIG1ha2VzCisgIC8vIHRoZSBmb2xsb3dpbmcgY2FsbHMsIHJldHVybmluZyB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0OgorICAvLyBGaW5kU3ltYm9sKCJiYXoubW9vLmZvby5iYXIiKSwgRmluZFN5bWJvbCgiYmF6LmZvby5iYXIiKSwKKyAgLy8gRmluZFN5bWJvbCgiZm9vLmJhciIpLiAgSWYgQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgaGFzIGJlZW4gY2FsbGVkCisgIC8vIG9uIHRoZSBEZXNjcmlwdG9yUG9vbCwgdGhpcyB3aWxsIGdlbmVyYXRlIGEgcGxhY2Vob2xkZXIgdHlwZSBpZgorICAvLyB0aGUgbmFtZSBpcyBub3QgZm91bmQgKHVubGVzcyB0aGUgbmFtZSBpdHNlbGYgaXMgbWFsZm9ybWVkKS4gIFRoZQorICAvLyBwbGFjZWhvbGRlcl90eXBlIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hhdCBraW5kIG9mIHBsYWNlaG9sZGVyIHNob3VsZCBiZQorICAvLyBjb25zdHJ1Y3RlZCBpbiB0aGlzIGNhc2UuICBUaGUgcmVzb2x2ZV9tb2RlIHBhcmFtZXRlciBkZXRlcm1pbmVzIHdoZXRoZXIKKyAgLy8gYW55IHN5bWJvbCBpcyByZXR1cm5lZCwgb3Igb25seSBzeW1ib2xzIHRoYXQgYXJlIHR5cGVzLiAgTm90ZSwgaG93ZXZlciwKKyAgLy8gdGhhdCBMb29rdXBTeW1ib2wgbWF5IHN0aWxsIHJldHVybiBhIG5vbi10eXBlIHN5bWJvbCBpbiBMT09LVVBfVFlQRVMgbW9kZSwKKyAgLy8gaWYgaXQgYmVsaWV2ZXMgdGhhdCdzIGFsbCBpdCBjb3VsZCByZWZlciB0by4gIFRoZSBjYWxsZXIgc2hvdWxkIGFsd2F5cworICAvLyBjaGVjayB0aGF0IGl0IHJlY2VpdmVzIHRoZSB0eXBlIG9mIHN5bWJvbCBpdCB3YXMgZXhwZWN0aW5nLgorICBlbnVtIFJlc29sdmVNb2RlIHsgTE9PS1VQX0FMTCwgTE9PS1VQX1RZUEVTIH07CisgIFN5bWJvbCBMb29rdXBTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiByZWxhdGl2ZV90bywKKyAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6UGxhY2Vob2xkZXJUeXBlIHBsYWNlaG9sZGVyX3R5cGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6UExBQ0VIT0xERVJfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlTW9kZSByZXNvbHZlX21vZGUgPSBMT09LVVBfQUxMLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYnVpbGRfaXQgPSB0cnVlKTsKKworICAvLyBMaWtlIExvb2t1cFN5bWJvbCgpIGJ1dCB3aWxsIG5vdCByZXR1cm4gYSBwbGFjZWhvbGRlciBldmVuIGlmCisgIC8vIEFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpIGhhcyBiZWVuIHVzZWQuCisgIFN5bWJvbCBMb29rdXBTeW1ib2xOb1BsYWNlaG9sZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmVsYXRpdmVfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVNb2RlIHJlc29sdmVfbW9kZSA9IExPT0tVUF9BTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYnVpbGRfaXQgPSB0cnVlKTsKKworICAvLyBDYWxscyB0YWJsZXNfLT5BZGRTeW1ib2woKSBhbmQgcmVjb3JkcyBhbiBlcnJvciBpZiBpdCBmYWlscy4gIFJldHVybnMKKyAgLy8gdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yIGZhbHNlIGlmIGZhaWxlZCwgdGhvdWdoIG1vc3QgY2FsbGVycyBjYW4gaWdub3JlCisgIC8vIHRoZSByZXR1cm4gdmFsdWUgc2luY2UgYW4gZXJyb3IgaGFzIGFscmVhZHkgYmVlbiByZWNvcmRlZC4KKyAgYm9vbCBBZGRTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxfbmFtZSwgY29uc3Qgdm9pZCogcGFyZW50LAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgTWVzc2FnZSYgcHJvdG8sIFN5bWJvbCBzeW1ib2wpOworCisgIC8vIExpa2UgQWRkU3ltYm9sKCksIGJ1dCBzdWNjZWVkcyBpZiB0aGUgc3ltYm9sIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBsb25nCisgIC8vIGFzIHRoZSBleGlzdGluZyBkZWZpbml0aW9uIGlzIGFsc28gYSBwYWNrYWdlIChiZWNhdXNlIGl0J3MgT0sgdG8gZGVmaW5lCisgIC8vIHRoZSBzYW1lIHBhY2thZ2UgaW4gdHdvIGRpZmZlcmVudCBmaWxlcykuICBBbHNvIGFkZHMgYWxsIHBhcmVudHMgb2YgdGhlCisgIC8vIHBhY2thZ2UgdG8gdGhlIHN5bWJvbCB0YWJsZSAoZS5nLiBBZGRQYWNrYWdlKCJmb28uYmFyIiwgLi4uKSB3aWxsIGFkZAorICAvLyAiZm9vLmJhciIgYW5kICJmb28iIHRvIHRoZSB0YWJsZSkuCisgIHZvaWQgQWRkUGFja2FnZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgTWVzc2FnZSYgcHJvdG8sCisgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisKKyAgLy8gQ2hlY2tzIHRoYXQgdGhlIHN5bWJvbCBuYW1lIGNvbnRhaW5zIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kCisgIC8vIHVuZGVyc2NvcmVzLiAgUmVjb3JkcyBhbiBlcnJvciBvdGhlcndpc2UuCisgIHZvaWQgVmFsaWRhdGVTeW1ib2xOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZnVsbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBwcm90byk7CisKKyAgLy8gQWxsb2NhdGVzIGEgY29weSBvZiBvcmlnX29wdGlvbnMgaW4gdGFibGVzXyBhbmQgc3RvcmVzIGl0IGluIHRoZQorICAvLyBkZXNjcmlwdG9yLiBSZW1lbWJlcnMgaXRzIHVuaW50ZXJwcmV0ZWQgb3B0aW9ucywgdG8gYmUgaW50ZXJwcmV0ZWQKKyAgLy8gbGF0ZXIuIERlc2NyaXB0b3JUIG11c3QgYmUgb25lIG9mIHRoZSBEZXNjcmlwdG9yIG1lc3NhZ2VzIGZyb20KKyAgLy8gZGVzY3JpcHRvci5wcm90by4KKyAgdGVtcGxhdGUgPGNsYXNzIERlc2NyaXB0b3JUPgorICB2b2lkIEFsbG9jYXRlT3B0aW9ucyhjb25zdCB0eXBlbmFtZSBEZXNjcmlwdG9yVDo6T3B0aW9uc1R5cGUmIG9yaWdfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclQqIGRlc2NyaXB0b3IsIGludCBvcHRpb25zX2ZpZWxkX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpOworICAvLyBTcGVjaWFsaXphdGlvbiBmb3IgRmlsZU9wdGlvbnMuCisgIHZvaWQgQWxsb2NhdGVPcHRpb25zKGNvbnN0IEZpbGVPcHRpb25zJiBvcmlnX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpOworCisgIC8vIEltcGxlbWVudGF0aW9uIGZvciBBbGxvY2F0ZU9wdGlvbnMoKS4gRG9uJ3QgY2FsbCB0aGlzIGRpcmVjdGx5LgorICB0ZW1wbGF0ZSA8Y2xhc3MgRGVzY3JpcHRvclQ+CisgIHZvaWQgQWxsb2NhdGVPcHRpb25zSW1wbCgKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lX3Njb3BlLCBjb25zdCBzdGQ6OnN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgICAgY29uc3QgdHlwZW5hbWUgRGVzY3JpcHRvclQ6Ok9wdGlvbnNUeXBlJiBvcmlnX29wdGlvbnMsCisgICAgICBEZXNjcmlwdG9yVCogZGVzY3JpcHRvciwgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgb3B0aW9uc19wYXRoLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9uYW1lLCBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpOworCisgIC8vIEFsbG9jYXRlcyBhbiBhcnJheSBvZiB0d28gc3RyaW5ncywgdGhlIGZpcnN0IG9uZSBpcyBhIGNvcHkgb2YgYHByb3RvX25hbWVgLAorICAvLyBhbmQgdGhlIHNlY29uZCBvbmUgaXMgdGhlIGZ1bGwgbmFtZS4KKyAgLy8gRnVsbCBwcm90byBuYW1lIGlzICJzY29wZS5wcm90b19uYW1lIiBpZiBzY29wZSBpcyBub24tZW1wdHkgYW5kCisgIC8vICJwcm90b19uYW1lIiBvdGhlcndpc2UuCisgIGNvbnN0IHN0ZDo6c3RyaW5nKiBBbGxvY2F0ZU5hbWVTdHJpbmdzKGNvbnN0IHN0ZDo6c3RyaW5nJiBzY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3RvX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYyk7CisKKyAgLy8gVGhlc2UgbWV0aG9kcyBhbGwgaGF2ZSB0aGUgc2FtZSBzaWduYXR1cmUgZm9yIHRoZSBzYWtlIG9mIHRoZSBCVUlMRF9BUlJBWQorICAvLyBtYWNybywgYmVsb3cuCisgIHZvaWQgQnVpbGRNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8sIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciogcmVzdWx0LCBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpOworICB2b2lkIEJ1aWxkRmllbGRPckV4dGVuc2lvbihjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IqIHBhcmVudCwgRmllbGREZXNjcmlwdG9yKiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXh0ZW5zaW9uLCBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpOworICB2b2lkIEJ1aWxkRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvLCBEZXNjcmlwdG9yKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCwgaW50ZXJuYWw6OkZsYXRBbGxvY2F0b3ImIGFsbG9jKSB7CisgICAgQnVpbGRGaWVsZE9yRXh0ZW5zaW9uKHByb3RvLCBwYXJlbnQsIHJlc3VsdCwgZmFsc2UsIGFsbG9jKTsKKyAgfQorICB2b2lkIEJ1aWxkRXh0ZW5zaW9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBwcm90bywgRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciogcmVzdWx0LCBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpIHsKKyAgICBCdWlsZEZpZWxkT3JFeHRlbnNpb24ocHJvdG8sIHBhcmVudCwgcmVzdWx0LCB0cnVlLCBhbGxvYyk7CisgIH0KKyAgdm9pZCBCdWlsZEV4dGVuc2lvblJhbmdlKGNvbnN0IERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2UmIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYyk7CisgIHZvaWQgQnVpbGRSZXNlcnZlZFJhbmdlKGNvbnN0IERlc2NyaXB0b3JQcm90bzo6UmVzZXJ2ZWRSYW5nZSYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcjo6UmVzZXJ2ZWRSYW5nZSogcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpOworICB2b2lkIEJ1aWxkUmVzZXJ2ZWRSYW5nZShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvOjpFbnVtUmVzZXJ2ZWRSYW5nZSYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yOjpSZXNlcnZlZFJhbmdlKiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYyk7CisgIHZvaWQgQnVpbGRPbmVvZihjb25zdCBPbmVvZkRlc2NyaXB0b3JQcm90byYgcHJvdG8sIERlc2NyaXB0b3IqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgIE9uZW9mRGVzY3JpcHRvciogcmVzdWx0LCBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpOworICB2b2lkIENoZWNrRW51bVZhbHVlVW5pcXVlbmVzcyhjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIHJlc3VsdCk7CisgIHZvaWQgQnVpbGRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvLCBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yKiByZXN1bHQsIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYyk7CisgIHZvaWQgQnVpbGRFbnVtVmFsdWUoY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogcGFyZW50LCBFbnVtVmFsdWVEZXNjcmlwdG9yKiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OkZsYXRBbGxvY2F0b3ImIGFsbG9jKTsKKyAgdm9pZCBCdWlsZFNlcnZpY2UoY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgcHJvdG8sIGNvbnN0IHZvaWQqIGR1bW15LAorICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRvciogcmVzdWx0LCBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpOworICB2b2lkIEJ1aWxkTWV0aG9kKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHBhcmVudCwgTWV0aG9kRGVzY3JpcHRvciogcmVzdWx0LAorICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYyk7CisKKyAgdm9pZCBMb2dVbnVzZWREZXBlbmRlbmN5KGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIHJlc3VsdCk7CisKKyAgLy8gTXVzdCBiZSBydW4gb25seSBhZnRlciBidWlsZGluZy4KKyAgLy8KKyAgLy8gTk9URTogT3B0aW9ucyB3aWxsIG5vdCBiZSBhdmFpbGFibGUgZHVyaW5nIGNyb3NzLWxpbmtpbmcsIGFzIHRoZXkKKyAgLy8gaGF2ZSBub3QgeWV0IGJlZW4gaW50ZXJwcmV0ZWQuIERlZmVyIGFueSBoYW5kbGluZyBvZiBvcHRpb25zIHRvIHRoZQorICAvLyBWYWxpZGF0ZSpPcHRpb25zIG1ldGhvZHMuCisgIHZvaWQgQ3Jvc3NMaW5rRmlsZShGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIENyb3NzTGlua01lc3NhZ2UoRGVzY3JpcHRvciogbWVzc2FnZSwgY29uc3QgRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgQ3Jvc3NMaW5rRmllbGQoRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIENyb3NzTGlua0V4dGVuc2lvblJhbmdlKERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlJiBwcm90byk7CisgIHZvaWQgQ3Jvc3NMaW5rRW51bShFbnVtRGVzY3JpcHRvciogZW51bV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIENyb3NzTGlua0VudW1WYWx1ZShFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKyAgdm9pZCBDcm9zc0xpbmtTZXJ2aWNlKFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIENyb3NzTGlua01ldGhvZChNZXRob2REZXNjcmlwdG9yKiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIFN1Z2dlc3RGaWVsZE51bWJlcnMoRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisKKyAgLy8gTXVzdCBiZSBydW4gb25seSBhZnRlciBjcm9zcy1saW5raW5nLgorICB2b2lkIEludGVycHJldE9wdGlvbnMoKTsKKworICAvLyBBIGhlbHBlciBjbGFzcyBmb3IgaW50ZXJwcmV0aW5nIG9wdGlvbnMuCisgIGNsYXNzIE9wdGlvbkludGVycHJldGVyIHsKKyAgIHB1YmxpYzoKKyAgICAvLyBDcmVhdGVzIGFuIGludGVycHJldGVyIHRoYXQgb3BlcmF0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHBvb2wgb2YgdGhlCisgICAgLy8gc3BlY2lmaWVkIGJ1aWxkZXIsIHdoaWNoIG11c3Qgbm90IGJlIG51bGxwdHIuIFdlIGRvbid0IHRha2Ugb3duZXJzaGlwIG9mCisgICAgLy8gdGhlIGJ1aWxkZXIuCisgICAgZXhwbGljaXQgT3B0aW9uSW50ZXJwcmV0ZXIoRGVzY3JpcHRvckJ1aWxkZXIqIGJ1aWxkZXIpOworCisgICAgfk9wdGlvbkludGVycHJldGVyKCk7CisKKyAgICAvLyBJbnRlcnByZXRzIHRoZSB1bmludGVycHJldGVkIG9wdGlvbnMgaW4gdGhlIHNwZWNpZmllZCBPcHRpb25zIG1lc3NhZ2UuCisgICAgLy8gT24gZXJyb3IsIGNhbGxzIEFkZEVycm9yKCkgb24gdGhlIHVuZGVybHlpbmcgYnVpbGRlciBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICAvLyBPdGhlcndpc2UgcmV0dXJucyB0cnVlLgorICAgIGJvb2wgSW50ZXJwcmV0T3B0aW9ucyhPcHRpb25zVG9JbnRlcnByZXQqIG9wdGlvbnNfdG9faW50ZXJwcmV0KTsKKworICAgIC8vIFVwZGF0ZXMgdGhlIGdpdmVuIHNvdXJjZSBjb2RlIGluZm8gYnkgcmUtd3JpdGluZyB1bmludGVycHJldGVkIG9wdGlvbgorICAgIC8vIGxvY2F0aW9ucyB0byByZWZlciB0byB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnByZXRlZCBvcHRpb24uCisgICAgdm9pZCBVcGRhdGVTb3VyY2VDb2RlSW5mbyhTb3VyY2VDb2RlSW5mbyogaW5mbyk7CisKKyAgICBjbGFzcyBBZ2dyZWdhdGVPcHRpb25GaW5kZXI7CisKKyAgIHByaXZhdGU6CisgICAgLy8gSW50ZXJwcmV0cyB1bmludGVycHJldGVkX29wdGlvbl8gb24gdGhlIHNwZWNpZmllZCBtZXNzYWdlLCB3aGljaAorICAgIC8vIG11c3QgYmUgdGhlIG11dGFibGUgY29weSBvZiB0aGUgb3JpZ2luYWwgb3B0aW9ucyBtZXNzYWdlIHRvIHdoaWNoCisgICAgLy8gdW5pbnRlcnByZXRlZF9vcHRpb25fIGJlbG9uZ3MuIFRoZSBnaXZlbiBzcmNfcGF0aCBpcyB0aGUgc291cmNlCisgICAgLy8gbG9jYXRpb24gcGF0aCB0byB0aGUgdW5pbnRlcnByZXRlZCBvcHRpb24sIGFuZCBvcHRpb25zX3BhdGggaXMgdGhlCisgICAgLy8gc291cmNlIGxvY2F0aW9uIHBhdGggdG8gdGhlIG9wdGlvbnMgbWVzc2FnZS4gVGhlIGxvY2F0aW9uIHBhdGhzIGFyZQorICAgIC8vIHJlY29yZGVkIGFuZCB0aGVuIHVzZWQgaW4gVXBkYXRlU291cmNlQ29kZUluZm8uCisgICAgYm9vbCBJbnRlcnByZXRTaW5nbGVPcHRpb24oTWVzc2FnZSogb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzcmNfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBvcHRpb25zX3BhdGgpOworCisgICAgLy8gQWRkcyB0aGUgdW5pbnRlcnByZXRlZF9vcHRpb24gdG8gdGhlIGdpdmVuIG9wdGlvbnMgbWVzc2FnZSB2ZXJiYXRpbS4KKyAgICAvLyBVc2VkIHdoZW4gQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgaXMgaW4gZWZmZWN0IGFuZCB3ZSBjYW4ndCBmaW5kCisgICAgLy8gdGhlIG9wdGlvbidzIGRlZmluaXRpb24uCisgICAgdm9pZCBBZGRXaXRob3V0SW50ZXJwcmV0aW5nKGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBvcHRpb25zKTsKKworICAgIC8vIEEgcmVjdXJzaXZlIGhlbHBlciBmdW5jdGlvbiB0aGF0IGRyaWxscyBpbnRvIHRoZSBpbnRlcm1lZGlhdGUgZmllbGRzCisgICAgLy8gaW4gdW5rbm93bl9maWVsZHMgdG8gY2hlY2sgaWYgZmllbGQgaW5uZXJtb3N0X2ZpZWxkIGlzIHNldCBvbiB0aGUKKyAgICAvLyBpbm5lcm1vc3QgbWVzc2FnZS4gUmV0dXJucyBmYWxzZSBhbmQgc2V0cyBhbiBlcnJvciBpZiBzby4KKyAgICBib29sIEV4YW1pbmVJZk9wdGlvbklzU2V0KAorICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgIGludGVybWVkaWF0ZV9maWVsZHNfaXRlciwKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICBpbnRlcm1lZGlhdGVfZmllbGRzX2VuZCwKKyAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBpbm5lcm1vc3RfZmllbGQsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWJ1Z19tc2dfbmFtZSwKKyAgICAgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcyk7CisKKyAgICAvLyBWYWxpZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgb3B0aW9uIGZpZWxkIG9mIHRoZSBjdXJyZW50bHkgaW50ZXJwcmV0ZWQKKyAgICAvLyBvcHRpb24gYW5kIHRoZW4gc2V0cyBpdCBvbiB0aGUgdW5rbm93bl9maWVsZC4KKyAgICBib29sIFNldE9wdGlvblZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogb3B0aW9uX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7CisKKyAgICAvLyBQYXJzZXMgYW4gYWdncmVnYXRlIHZhbHVlIGZvciBhIENQUFRZUEVfTUVTU0FHRSBvcHRpb24gYW5kCisgICAgLy8gc2F2ZXMgaXQgaW50byAqdW5rbm93bl9maWVsZHMuCisgICAgYm9vbCBTZXRBZ2dyZWdhdGVPcHRpb24oY29uc3QgRmllbGREZXNjcmlwdG9yKiBvcHRpb25fZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7CisKKyAgICAvLyBDb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gc2V0IGFuIGludCBmaWVsZCB0aGUgcmlnaHQgd2F5LCBkZXBlbmRpbmcgb24KKyAgICAvLyBpdHMgd2lyZSB0eXBlIChhIHNpbmdsZSBpbnQgQ3BwVHlwZSBjYW4gcmVwcmVzZW50IG11bHRpcGxlIHdpcmUgdHlwZXMpLgorICAgIHZvaWQgU2V0SW50MzIoaW50IG51bWJlciwgaW50MzJfdCB2YWx1ZSwgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKKyAgICB2b2lkIFNldEludDY0KGludCBudW1iZXIsIGludDY0X3QgdmFsdWUsIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7CisgICAgdm9pZCBTZXRVSW50MzIoaW50IG51bWJlciwgdWludDMyX3QgdmFsdWUsIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpOworICAgIHZvaWQgU2V0VUludDY0KGludCBudW1iZXIsIHVpbnQ2NF90IHZhbHVlLCBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKKworICAgIC8vIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgYWRkcyBhbiBlcnJvciBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIG9mIHRoZQorICAgIC8vIG9wdGlvbiB3ZSdyZSBjdXJyZW50bHkgaW50ZXJwcmV0aW5nLCBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIEFkZE9wdGlvbkVycm9yKERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKKyAgICAgIGJ1aWxkZXJfLT5BZGRFcnJvcihvcHRpb25zX3RvX2ludGVycHJldF8tPmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqdW5pbnRlcnByZXRlZF9vcHRpb25fLCBsb2NhdGlvbiwgbXNnKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBBIGhlbHBlciBmdW5jdGlvbiB0aGF0IGFkZHMgYW4gZXJyb3IgYXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBvcHRpb24gbmFtZQorICAgIC8vIGFuZCByZXR1cm5zIGZhbHNlLgorICAgIGJvb2wgQWRkTmFtZUVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKKyNpZmRlZiBQUk9UT0JVRl9JTlRFUk5BTF9JR05PUkVfRklFTERfTkFNRV9FUlJPUlNfCisgICAgICByZXR1cm4gdHJ1ZTsKKyNlbHNlICAgLy8gUFJPVE9CVUZfSU5URVJOQUxfSUdOT1JFX0ZJRUxEX05BTUVfRVJST1JTXworICAgICAgcmV0dXJuIEFkZE9wdGlvbkVycm9yKERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1BUSU9OX05BTUUsIG1zZyk7CisjZW5kaWYgIC8vIFBST1RPQlVGX0lOVEVSTkFMX0lHTk9SRV9GSUVMRF9OQU1FX0VSUk9SU18KKyAgICB9CisKKyAgICAvLyBBIGhlbHBlciBmdW5jdGlvbiB0aGF0IGFkZHMgYW4gZXJyb3IgYXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBvcHRpb24gbmFtZQorICAgIC8vIGFuZCByZXR1cm5zIGZhbHNlLgorICAgIGJvb2wgQWRkVmFsdWVFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7CisgICAgICByZXR1cm4gQWRkT3B0aW9uRXJyb3IoRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPUFRJT05fVkFMVUUsIG1zZyk7CisgICAgfQorCisgICAgLy8gV2UgaW50ZXJwcmV0IGFnYWluc3QgdGhpcyBidWlsZGVyJ3MgcG9vbC4gSXMgbmV2ZXIgbnVsbHB0ci4gV2UgZG9uJ3Qgb3duCisgICAgLy8gdGhpcyBwb2ludGVyLgorICAgIERlc2NyaXB0b3JCdWlsZGVyKiBidWlsZGVyXzsKKworICAgIC8vIFRoZSBvcHRpb25zIHdlJ3JlIGN1cnJlbnRseSBpbnRlcnByZXRpbmcsIG9yIG51bGxwdHIgaWYgd2UncmUgbm90IGluIGEKKyAgICAvLyBjYWxsIHRvIEludGVycHJldE9wdGlvbnMuCisgICAgY29uc3QgT3B0aW9uc1RvSW50ZXJwcmV0KiBvcHRpb25zX3RvX2ludGVycHJldF87CisKKyAgICAvLyBUaGUgb3B0aW9uIHdlJ3JlIGN1cnJlbnRseSBpbnRlcnByZXRpbmcgd2l0aGluIG9wdGlvbnNfdG9faW50ZXJwcmV0Xywgb3IKKyAgICAvLyBudWxscHRyIGlmIHdlJ3JlIG5vdCBpbiBhIGNhbGwgdG8gSW50ZXJwcmV0T3B0aW9ucygpLiBUaGlzIHBvaW50cyB0byBhCisgICAgLy8gc3VibWVzc2FnZSBvZiB0aGUgb3JpZ2luYWwgb3B0aW9uLCBub3QgdGhlIG11dGFibGUgY29weS4gVGhlcmVmb3JlIHdlCisgICAgLy8gY2FuIHVzZSBpdCB0byBmaW5kIGxvY2F0aW9ucyByZWNvcmRlZCBieSB0aGUgcGFyc2VyLgorICAgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24qIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKKworICAgIC8vIFRoaXMgbWFwcyB0aGUgZWxlbWVudCBwYXRoIG9mIHVuaW50ZXJwcmV0ZWQgb3B0aW9ucyB0byB0aGUgZWxlbWVudCBwYXRoCisgICAgLy8gb2YgdGhlIHJlc3VsdGluZyBpbnRlcnByZXRlZCBvcHRpb24uIFRoaXMgaXMgdXNlZCB0byBtb2RpZnkgYSBmaWxlJ3MKKyAgICAvLyBzb3VyY2UgY29kZSBpbmZvIHRvIGFjY291bnQgZm9yIG9wdGlvbiBpbnRlcnByZXRhdGlvbi4KKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3RvcjxpbnQ+LCBzdGQ6OnZlY3RvcjxpbnQ+PiBpbnRlcnByZXRlZF9wYXRoc187CisKKyAgICAvLyBUaGlzIG1hcHMgdGhlIHBhdGggdG8gYSByZXBlYXRlZCBvcHRpb24gZmllbGQgdG8gdGhlIGtub3duIG51bWJlciBvZgorICAgIC8vIGVsZW1lbnRzIHRoZSBmaWVsZCBjb250YWlucy4gVGhpcyBpcyB1c2VkIHRvIHRyYWNrIHRoZSBjb21wdXRlIHRoZQorICAgIC8vIGluZGV4IHBvcnRpb24gb2YgdGhlIGVsZW1lbnQgcGF0aCB3aGVuIGludGVycHJldGluZyBhIHNpbmdsZSBvcHRpb24uCisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8aW50PiwgaW50PiByZXBlYXRlZF9vcHRpb25fY291bnRzXzsKKworICAgIC8vIEZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIGR5bmFtaWMgbWVzc2FnZXMgd2UgbmVlZCB0byBwYXJzZQorICAgIC8vIGFueSBhZ2dyZWdhdGUgb3B0aW9uIHZhbHVlcyB3ZSBlbmNvdW50ZXIuCisgICAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGR5bmFtaWNfZmFjdG9yeV87CisKKyAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoT3B0aW9uSW50ZXJwcmV0ZXIpOworICB9OworCisgIC8vIFdvcmstYXJvdW5kIGZvciBicm9rZW4gY29tcGlsZXJzOiAgQWNjb3JkaW5nIHRvIHRoZSBDKysgc3RhbmRhcmQsCisgIC8vIE9wdGlvbkludGVycHJldGVyIHNob3VsZCBoYXZlIGFjY2VzcyB0byB0aGUgcHJpdmF0ZSBtZW1iZXJzIG9mIGFueSBjbGFzcworICAvLyB3aGljaCBoYXMgZGVjbGFyZWQgRGVzY3JpcHRvckJ1aWxkZXIgYXMgYSBmcmllbmQuICBVbmZvcnR1bmF0ZWx5IHNvbWUgb2xkCisgIC8vIHZlcnNpb25zIG9mIEdDQyBhbmQgb3RoZXIgY29tcGlsZXJzIGRvIG5vdCBpbXBsZW1lbnQgdGhpcyBjb3JyZWN0bHkuICBTbywKKyAgLy8gd2UgaGF2ZSB0byBoYXZlIHRoZXNlIGludGVybWVkaWF0ZSBtZXRob2RzIHRvIHByb3ZpZGUgYWNjZXNzLiAgV2UgYWxzbworICAvLyByZWR1bmRhbnRseSBkZWNsYXJlIE9wdGlvbkludGVycHJldGVyIGEgZnJpZW5kIGp1c3QgdG8gbWFrZSB0aGluZ3MgZXh0cmEKKyAgLy8gY2xlYXIgZm9yIHRoZXNlIGJhZCBjb21waWxlcnMuCisgIGZyaWVuZCBjbGFzcyBPcHRpb25JbnRlcnByZXRlcjsKKyAgZnJpZW5kIGNsYXNzIE9wdGlvbkludGVycHJldGVyOjpBZ2dyZWdhdGVPcHRpb25GaW5kZXI7CisKKyAgc3RhdGljIGlubGluZSBib29sIGdldF9hbGxvd191bmtub3duKGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKSB7CisgICAgcmV0dXJuIHBvb2wtPmFsbG93X3Vua25vd25fOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBnZXRfZW5mb3JjZV93ZWFrKGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKSB7CisgICAgcmV0dXJuIHBvb2wtPmVuZm9yY2Vfd2Vha187CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGdldF9pc19wbGFjZWhvbGRlcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgICAgcmV0dXJuIGRlc2NyaXB0b3IgIT0gbnVsbHB0ciAmJiBkZXNjcmlwdG9yLT5pc19wbGFjZWhvbGRlcl87CisgIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIGFzc2VydF9tdXRleF9oZWxkKGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKSB7CisgICAgaWYgKHBvb2wtPm11dGV4XyAhPSBudWxscHRyKSB7CisgICAgICBwb29sLT5tdXRleF8tPkFzc2VydEhlbGQoKTsKKyAgICB9CisgIH0KKworICAvLyBNdXN0IGJlIHJ1biBvbmx5IGFmdGVyIG9wdGlvbnMgaGF2ZSBiZWVuIGludGVycHJldGVkLgorICAvLworICAvLyBOT1RFOiBWYWxpZGF0aW9uIGNvZGUgbXVzdCBvbmx5IHJlZmVyZW5jZSB0aGUgb3B0aW9ucyBpbiB0aGUgbXV0YWJsZQorICAvLyBkZXNjcmlwdG9ycywgd2hpY2ggYXJlIHRoZSBvbmVzIHRoYXQgaGF2ZSBiZWVuIGludGVycHJldGVkLiBUaGUgY29uc3QKKyAgLy8gcHJvdG8gcmVmZXJlbmNlcyBhcmUgcGFzc2VkIGluIG9ubHkgc28gdGhleSBjYW4gYmUgcHJvdmlkZWQgdG8gY2FsbHMgdG8KKyAgLy8gQWRkRXJyb3IoKS4gRG8gbm90IGxvb2sgYXQgdGhlaXIgb3B0aW9ucywgd2hpY2ggaGF2ZSBub3QgYmVlbiBpbnRlcnByZXRlZC4KKyAgdm9pZCBWYWxpZGF0ZUZpbGVPcHRpb25zKEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIFZhbGlkYXRlTWVzc2FnZU9wdGlvbnMoRGVzY3JpcHRvciogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIFZhbGlkYXRlRmllbGRPcHRpb25zKEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKyAgdm9pZCBWYWxpZGF0ZUVudW1PcHRpb25zKEVudW1EZXNjcmlwdG9yKiBlbm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgVmFsaWRhdGVFbnVtVmFsdWVPcHRpb25zKEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIFZhbGlkYXRlRXh0ZW5zaW9uUmFuZ2VPcHRpb25zKAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxfbmFtZSwgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIGV4dGVuc2lvbl9yYW5nZSwKKyAgICAgIGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgcHJvdG8pOworICB2b2lkIFZhbGlkYXRlU2VydmljZU9wdGlvbnMoU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgVmFsaWRhdGVNZXRob2RPcHRpb25zKE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgVmFsaWRhdGVQcm90bzMoRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKyAgdm9pZCBWYWxpZGF0ZVByb3RvM01lc3NhZ2UoRGVzY3JpcHRvciogbWVzc2FnZSwgY29uc3QgRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgVmFsaWRhdGVQcm90bzNGaWVsZChGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKyAgdm9pZCBWYWxpZGF0ZVByb3RvM0VudW0oRW51bURlc2NyaXB0b3IqIGVubSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgcHJvdG8pOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFwIGVudHJ5IG1lc3NhZ2UgaXMgY29tcGF0aWJsZSB3aXRoIHRoZQorICAvLyBhdXRvLWdlbmVyYXRlZCBlbnRyeSBtZXNzYWdlIGZyb20gbWFwIGZpZWxkcyBzeW50YXguCisgIGJvb2wgVmFsaWRhdGVNYXBFbnRyeShGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKworICAvLyBSZWN1cnNpdmVseSBkZXRlY3RzIG5hbWluZyBjb25mbGljdHMgd2l0aCBtYXAgZW50cnkgdHlwZXMgZm9yIGEKKyAgLy8gYmV0dGVyIGVycm9yIG1lc3NhZ2UuCisgIHZvaWQgRGV0ZWN0TWFwQ29uZmxpY3RzKGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8pOworCisgIHZvaWQgVmFsaWRhdGVKU1R5cGUoRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8pOworfTsKKworY29uc3QgRmlsZURlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpCdWlsZEZpbGUoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgR09PR0xFX0NIRUNLKGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBudWxscHRyKQorICAgICAgPDwgIkNhbm5vdCBjYWxsIEJ1aWxkRmlsZSBvbiBhIERlc2NyaXB0b3JQb29sIHRoYXQgdXNlcyBhICIKKyAgICAgICAgICJEZXNjcmlwdG9yRGF0YWJhc2UuICBZb3UgbXVzdCBpbnN0ZWFkIGZpbmQgYSB3YXkgdG8gZ2V0IHlvdXIgZmlsZSAiCisgICAgICAgICAiaW50byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS4iOworICBHT09HTEVfQ0hFQ0sobXV0ZXhfID09IG51bGxwdHIpOyAgLy8gSW1wbGllZCBieSB0aGUgYWJvdmUgR09PR0xFX0NIRUNLLgorICB0YWJsZXNfLT5rbm93bl9iYWRfc3ltYm9sc18uY2xlYXIoKTsKKyAgdGFibGVzXy0+a25vd25fYmFkX2ZpbGVzXy5jbGVhcigpOworICByZXR1cm4gRGVzY3JpcHRvckJ1aWxkZXIodGhpcywgdGFibGVzXy5nZXQoKSwgbnVsbHB0cikuQnVpbGRGaWxlKHByb3RvKTsKK30KKworY29uc3QgRmlsZURlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpCdWlsZEZpbGVDb2xsZWN0aW5nRXJyb3JzKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvLCBFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKSB7CisgIEdPT0dMRV9DSEVDSyhmYWxsYmFja19kYXRhYmFzZV8gPT0gbnVsbHB0cikKKyAgICAgIDw8ICJDYW5ub3QgY2FsbCBCdWlsZEZpbGUgb24gYSBEZXNjcmlwdG9yUG9vbCB0aGF0IHVzZXMgYSAiCisgICAgICAgICAiRGVzY3JpcHRvckRhdGFiYXNlLiAgWW91IG11c3QgaW5zdGVhZCBmaW5kIGEgd2F5IHRvIGdldCB5b3VyIGZpbGUgIgorICAgICAgICAgImludG8gdGhlIHVuZGVybHlpbmcgZGF0YWJhc2UuIjsKKyAgR09PR0xFX0NIRUNLKG11dGV4XyA9PSBudWxscHRyKTsgIC8vIEltcGxpZWQgYnkgdGhlIGFib3ZlIEdPT0dMRV9DSEVDSy4KKyAgdGFibGVzXy0+a25vd25fYmFkX3N5bWJvbHNfLmNsZWFyKCk7CisgIHRhYmxlc18tPmtub3duX2JhZF9maWxlc18uY2xlYXIoKTsKKyAgcmV0dXJuIERlc2NyaXB0b3JCdWlsZGVyKHRoaXMsIHRhYmxlc18uZ2V0KCksIGVycm9yX2NvbGxlY3RvcikKKyAgICAgIC5CdWlsZEZpbGUocHJvdG8pOworfQorCitjb25zdCBGaWxlRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkJ1aWxkRmlsZUZyb21EYXRhYmFzZSgKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgY29uc3QgeworICBtdXRleF8tPkFzc2VydEhlbGQoKTsKKyAgaWYgKHRhYmxlc18tPmtub3duX2JhZF9maWxlc18uY291bnQocHJvdG8ubmFtZSgpKSA+IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBjb25zdCBGaWxlRGVzY3JpcHRvciogcmVzdWx0ID0KKyAgICAgIERlc2NyaXB0b3JCdWlsZGVyKHRoaXMsIHRhYmxlc18uZ2V0KCksIGRlZmF1bHRfZXJyb3JfY29sbGVjdG9yXykKKyAgICAgICAgICAuQnVpbGRGaWxlKHByb3RvKTsKKyAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgdGFibGVzXy0+a25vd25fYmFkX2ZpbGVzXy5pbnNlcnQocHJvdG8ubmFtZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitEZXNjcmlwdG9yQnVpbGRlcjo6RGVzY3JpcHRvckJ1aWxkZXIoCisgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsIERlc2NyaXB0b3JQb29sOjpUYWJsZXMqIHRhYmxlcywKKyAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3RvcikKKyAgICA6IHBvb2xfKHBvb2wpLAorICAgICAgdGFibGVzXyh0YWJsZXMpLAorICAgICAgZXJyb3JfY29sbGVjdG9yXyhlcnJvcl9jb2xsZWN0b3IpLAorICAgICAgaGFkX2Vycm9yc18oZmFsc2UpLAorICAgICAgcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5XyhudWxscHRyKSwKKyAgICAgIHVuZGVmaW5lX3Jlc29sdmVkX25hbWVfKCIiKSB7fQorCitEZXNjcmlwdG9yQnVpbGRlcjo6fkRlc2NyaXB0b3JCdWlsZGVyKCkge30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWRkRXJyb3IoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVsZW1lbnRfbmFtZSwgY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvciwKKyAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yKSB7CisgIGlmIChlcnJvcl9jb2xsZWN0b3JfID09IG51bGxwdHIpIHsKKyAgICBpZiAoIWhhZF9lcnJvcnNfKSB7CisgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBwcm90byBkZXNjcmlwdG9yIGZvciBmaWxlIFwiIiA8PCBmaWxlbmFtZV8KKyAgICAgICAgICAgICAgICAgPDwgIlwiOiI7CisgICAgfQorICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICIgICIgPDwgZWxlbWVudF9uYW1lIDw8ICI6ICIgPDwgZXJyb3I7CisgIH0gZWxzZSB7CisgICAgZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IoZmlsZW5hbWVfLCBlbGVtZW50X25hbWUsICZkZXNjcmlwdG9yLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgIH0KKyAgaGFkX2Vycm9yc18gPSB0cnVlOworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpBZGRFcnJvcigKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZWxlbWVudF9uYW1lLCBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yLAorICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwgY29uc3QgY2hhciogZXJyb3IpIHsKKyAgQWRkRXJyb3IoZWxlbWVudF9uYW1lLCBkZXNjcmlwdG9yLCBsb2NhdGlvbiwgc3RkOjpzdHJpbmcoZXJyb3IpKTsKK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWRkTm90RGVmaW5lZEVycm9yKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbGVtZW50X25hbWUsIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3IsCisgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1bmRlZmluZWRfc3ltYm9sKSB7CisgIGlmIChwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfID09IG51bGxwdHIgJiYKKyAgICAgIHVuZGVmaW5lX3Jlc29sdmVkX25hbWVfLmVtcHR5KCkpIHsKKyAgICBBZGRFcnJvcihlbGVtZW50X25hbWUsIGRlc2NyaXB0b3IsIGxvY2F0aW9uLAorICAgICAgICAgICAgICJcIiIgKyB1bmRlZmluZWRfc3ltYm9sICsgIlwiIGlzIG5vdCBkZWZpbmVkLiIpOworICB9IGVsc2UgeworICAgIGlmIChwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfICE9IG51bGxwdHIpIHsKKyAgICAgIEFkZEVycm9yKGVsZW1lbnRfbmFtZSwgZGVzY3JpcHRvciwgbG9jYXRpb24sCisgICAgICAgICAgICAgICAiXCIiICsgcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5X25hbWVfICsKKyAgICAgICAgICAgICAgICAgICAiXCIgc2VlbXMgdG8gYmUgZGVmaW5lZCBpbiBcIiIgKworICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV8tPm5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgIlwiLCB3aGljaCBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICJpbXBvcnRlZCBieSBcIiIgKworICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lXyArCisgICAgICAgICAgICAgICAgICAgIlwiLiAgVG8gdXNlIGl0IGhlcmUsIHBsZWFzZSAiCisgICAgICAgICAgICAgICAgICAgImFkZCB0aGUgbmVjZXNzYXJ5IGltcG9ydC4iKTsKKyAgICB9CisgICAgaWYgKCF1bmRlZmluZV9yZXNvbHZlZF9uYW1lXy5lbXB0eSgpKSB7CisgICAgICBBZGRFcnJvcihlbGVtZW50X25hbWUsIGRlc2NyaXB0b3IsIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgIlwiIiArIHVuZGVmaW5lZF9zeW1ib2wgKyAiXCIgaXMgcmVzb2x2ZWQgdG8gXCIiICsKKyAgICAgICAgICAgICAgICAgICB1bmRlZmluZV9yZXNvbHZlZF9uYW1lXyArCisgICAgICAgICAgICAgICAgICAgIlwiLCB3aGljaCBpcyBub3QgZGVmaW5lZC4gIgorICAgICAgICAgICAgICAgICAgICJUaGUgaW5uZXJtb3N0IHNjb3BlIGlzIHNlYXJjaGVkIGZpcnN0IGluIG5hbWUgcmVzb2x1dGlvbi4gIgorICAgICAgICAgICAgICAgICAgICJDb25zaWRlciB1c2luZyBhIGxlYWRpbmcgJy4nKGkuZS4sIFwiLiIgKworICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZF9zeW1ib2wgKyAiXCIpIHRvIHN0YXJ0IGZyb20gdGhlIG91dGVybW9zdCBzY29wZS4iKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWRkV2FybmluZygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZWxlbWVudF9uYW1lLCBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yLAorICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IpIHsKKyAgaWYgKGVycm9yX2NvbGxlY3Rvcl8gPT0gbnVsbHB0cikgeworICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgZmlsZW5hbWVfIDw8ICIgIiA8PCBlbGVtZW50X25hbWUgPDwgIjogIiA8PCBlcnJvcjsKKyAgfSBlbHNlIHsKKyAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRXYXJuaW5nKGZpbGVuYW1lXywgZWxlbWVudF9uYW1lLCAmZGVzY3JpcHRvciwgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgIH0KK30KKworYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6SXNJblBhY2thZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZV9uYW1lKSB7CisgIHJldHVybiBIYXNQcmVmaXhTdHJpbmcoZmlsZS0+cGFja2FnZSgpLCBwYWNrYWdlX25hbWUpICYmCisgICAgICAgICAoZmlsZS0+cGFja2FnZSgpLnNpemUoKSA9PSBwYWNrYWdlX25hbWUuc2l6ZSgpIHx8CisgICAgICAgICAgZmlsZS0+cGFja2FnZSgpW3BhY2thZ2VfbmFtZS5zaXplKCldID09ICcuJyk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlJlY29yZFB1YmxpY0RlcGVuZGVuY2llcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICBpZiAoZmlsZSA9PSBudWxscHRyIHx8ICFkZXBlbmRlbmNpZXNfLmluc2VydChmaWxlKS5zZWNvbmQpIHJldHVybjsKKyAgZm9yIChpbnQgaSA9IDA7IGZpbGUgIT0gbnVsbHB0ciAmJiBpIDwgZmlsZS0+cHVibGljX2RlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgUmVjb3JkUHVibGljRGVwZW5kZW5jaWVzKGZpbGUtPnB1YmxpY19kZXBlbmRlbmN5KGkpKTsKKyAgfQorfQorCitTeW1ib2wgRGVzY3JpcHRvckJ1aWxkZXI6OkZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzSGVscGVyKAorICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgYm9vbCBidWlsZF9pdCkgeworICAvLyBJZiB3ZSBhcmUgbG9va2luZyBhdCBhbiB1bmRlcmxheSwgd2UgbXVzdCBsb2NrIGl0cyBtdXRleF8sIHNpbmNlIHdlIGFyZQorICAvLyBhY2Nlc3NpbmcgdGhlIHVuZGVybGF5J3MgdGFibGVzXyBkaXJlY3RseS4KKyAgTXV0ZXhMb2NrTWF5YmUgbG9jaygocG9vbCA9PSBwb29sXykgPyBudWxscHRyIDogcG9vbC0+bXV0ZXhfKTsKKworICBTeW1ib2wgcmVzdWx0ID0gcG9vbC0+dGFibGVzXy0+RmluZFN5bWJvbChuYW1lKTsKKyAgaWYgKHJlc3VsdC5Jc051bGwoKSAmJiBwb29sLT51bmRlcmxheV8gIT0gbnVsbHB0cikgeworICAgIC8vIFN5bWJvbCBub3QgZm91bmQ7IGNoZWNrIHRoZSB1bmRlcmxheS4KKyAgICByZXN1bHQgPSBGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwc0hlbHBlcihwb29sLT51bmRlcmxheV8sIG5hbWUpOworICB9CisKKyAgaWYgKHJlc3VsdC5Jc051bGwoKSkgeworICAgIC8vIFdpdGggbGF6aWx5X2J1aWxkX2RlcGVuZGVuY2llc18sIGEgc3ltYm9sIGxvb2t1cCBhdCBjcm9zcyBsaW5rIHRpbWUgaXMKKyAgICAvLyBub3QgZ3VhcmFudGVlZCB0byBiZSBzdWNjZXNzZnVsLiBJbiBtb3N0IGNhc2VzLCBidWlsZF9pdCB3aWxsIGJlIGZhbHNlLAorICAgIC8vIHdoaWNoIGludGVudGlvbmFsbHkgcHJldmVudHMgdXMgZnJvbSBidWlsZGluZyBhbiBpbXBvcnQgdW50aWwgaXQncworICAgIC8vIGFjdHVhbGx5IG5lZWRlZC4gSW4gc29tZSBjYXNlcywgbGlrZSByZWdpc3RlcmluZyBhbiBleHRlbnNpb24sIHdlIHdhbnQKKyAgICAvLyB0byBidWlsZCB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzeW1ib2wsIGFuZCBidWlsZF9pdCB3aWxsIGJlIHNldC4KKyAgICAvLyBBbHNvLCBidWlsZF9pdCB3aWxsIGJlIHRydWUgd2hlbiAhbGF6aWx5X2J1aWxkX2RlcGVuZGVuY2llc18sIHRvIHByb3ZpZGUKKyAgICAvLyBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIG9mIG1pc3NpbmcgZGVwZW5kZW5jaWVzLgorICAgIGlmIChidWlsZF9pdCAmJiBwb29sLT5UcnlGaW5kU3ltYm9sSW5GYWxsYmFja0RhdGFiYXNlKG5hbWUpKSB7CisgICAgICByZXN1bHQgPSBwb29sLT50YWJsZXNfLT5GaW5kU3ltYm9sKG5hbWUpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK1N5bWJvbCBEZXNjcmlwdG9yQnVpbGRlcjo6RmluZFN5bWJvbE5vdEVuZm9yY2luZ0RlcHMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYnVpbGRfaXQpIHsKKyAgU3ltYm9sIHJlc3VsdCA9IEZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzSGVscGVyKHBvb2xfLCBuYW1lLCBidWlsZF9pdCk7CisgIC8vIE9ubHkgZmluZCBzeW1ib2xzIHdoaWNoIHdlcmUgZGVmaW5lZCBpbiB0aGlzIGZpbGUgb3Igb25lIG9mIGl0cworICAvLyBkZXBlbmRlbmNpZXMuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcmVzdWx0LkdldEZpbGUoKTsKKyAgaWYgKGZpbGUgPT0gZmlsZV8gfHwgZGVwZW5kZW5jaWVzXy5jb3VudChmaWxlKSA+IDApIHsKKyAgICB1bnVzZWRfZGVwZW5kZW5jeV8uZXJhc2UoZmlsZSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworU3ltYm9sIERlc2NyaXB0b3JCdWlsZGVyOjpGaW5kU3ltYm9sKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBib29sIGJ1aWxkX2l0KSB7CisgIFN5bWJvbCByZXN1bHQgPSBGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcyhuYW1lLCBidWlsZF9pdCk7CisKKyAgaWYgKHJlc3VsdC5Jc051bGwoKSkgcmV0dXJuIHJlc3VsdDsKKworICBpZiAoIXBvb2xfLT5lbmZvcmNlX2RlcGVuZGVuY2llc18pIHsKKyAgICAvLyBIYWNrIGZvciBDb21waWxlclVwZ3JhZGVyLCBhbmQgYWxzbyB1c2VkIGZvciBsYXppbHlfYnVpbGRfZGVwZW5kZW5jaWVzXworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvLyBPbmx5IGZpbmQgc3ltYm9scyB3aGljaCB3ZXJlIGRlZmluZWQgaW4gdGhpcyBmaWxlIG9yIG9uZSBvZiBpdHMKKyAgLy8gZGVwZW5kZW5jaWVzLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHJlc3VsdC5HZXRGaWxlKCk7CisgIGlmIChmaWxlID09IGZpbGVfIHx8IGRlcGVuZGVuY2llc18uY291bnQoZmlsZSkgPiAwKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGlmIChyZXN1bHQuSXNQYWNrYWdlKCkpIHsKKyAgICAvLyBBcmcsIHRoaXMgaXMgb3ZlcmNvbXBsaWNhdGVkLiAgVGhlIHN5bWJvbCBpcyBhIHBhY2thZ2UgbmFtZS4gIEl0IGNvdWxkCisgICAgLy8gYmUgdGhhdCB0aGUgcGFja2FnZSB3YXMgZGVmaW5lZCBpbiBtdWx0aXBsZSBmaWxlcy4gIHJlc3VsdC5HZXRGaWxlKCkKKyAgICAvLyByZXR1cm5zIHRoZSBmaXJzdCBmaWxlIHdlIHNhdyB0aGF0IHVzZWQgdGhpcyBwYWNrYWdlLiAgV2UndmUgZGV0ZXJtaW5lZAorICAgIC8vIHRoYXQgdGhhdCBmaWxlIGlzIG5vdCBhIGRpcmVjdCBkZXBlbmRlbmN5IG9mIHRoZSBmaWxlIHdlIGFyZSBjdXJyZW50bHkKKyAgICAvLyBidWlsZGluZywgYnV0IGl0IGNvdWxkIGJlIHRoYXQgc29tZSBvdGhlciBmaWxlIHdoaWNoICppcyogYSBkaXJlY3QKKyAgICAvLyBkZXBlbmRlbmN5IGFsc28gZGVmaW5lcyB0aGUgc2FtZSBwYWNrYWdlLiAgV2UgY2FuJ3QgcmVhbGx5IHJ1bGUgb3V0IHRoaXMKKyAgICAvLyBzeW1ib2wgdW5sZXNzIG5vbmUgb2YgdGhlIGRlcGVuZGVuY2llcyBkZWZpbmUgaXQuCisgICAgaWYgKElzSW5QYWNrYWdlKGZpbGVfLCBuYW1lKSkgcmV0dXJuIHJlc3VsdDsKKyAgICBmb3IgKHN0ZDo6c2V0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICBkZXBlbmRlbmNpZXNfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBkZXBlbmRlbmNpZXNfLmVuZCgpOyArK2l0KSB7CisgICAgICAvLyBOb3RlOiAgQSBkZXBlbmRlbmN5IG1heSBiZSBudWxscHRyIGlmIGl0IHdhcyBub3QgZm91bmQgb3IgaGFkIGVycm9ycy4KKyAgICAgIGlmICgqaXQgIT0gbnVsbHB0ciAmJiBJc0luUGFja2FnZSgqaXQsIG5hbWUpKSByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgfQorCisgIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV8gPSBmaWxlOworICBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfbmFtZV8gPSBuYW1lOworICByZXR1cm4gU3ltYm9sKCk7Cit9CisKK1N5bWJvbCBEZXNjcmlwdG9yQnVpbGRlcjo6TG9va3VwU3ltYm9sTm9QbGFjZWhvbGRlcigKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJlbGF0aXZlX3RvLAorICAgIFJlc29sdmVNb2RlIHJlc29sdmVfbW9kZSwgYm9vbCBidWlsZF9pdCkgeworICBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfID0gbnVsbHB0cjsKKyAgdW5kZWZpbmVfcmVzb2x2ZWRfbmFtZV8uY2xlYXIoKTsKKworICBpZiAoIW5hbWUuZW1wdHkoKSAmJiBuYW1lWzBdID09ICcuJykgeworICAgIC8vIEZ1bGx5LXF1YWxpZmllZCBuYW1lLgorICAgIHJldHVybiBGaW5kU3ltYm9sKG5hbWUuc3Vic3RyKDEpLCBidWlsZF9pdCk7CisgIH0KKworICAvLyBJZiBuYW1lIGlzIHNvbWV0aGluZyBsaWtlICJGb28uQmFyLmJheiIsIGFuZCBzeW1ib2xzIG5hbWVkICJGb28iIGFyZQorICAvLyBkZWZpbmVkIGluIG11bHRpcGxlIHBhcmVudCBzY29wZXMsIHdlIG9ubHkgd2FudCB0byBmaW5kICJCYXIuYmF6IiBpbiB0aGUKKyAgLy8gaW5uZXJtb3N0IG9uZS4gIEUuZy4sIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHByb2R1Y2UgYW4gZXJyb3I6CisgIC8vICAgbWVzc2FnZSBCYXIgeyBtZXNzYWdlIEJheiB7fSB9CisgIC8vICAgbWVzc2FnZSBGb28geworICAvLyAgICAgbWVzc2FnZSBCYXIgeworICAvLyAgICAgfQorICAvLyAgICAgb3B0aW9uYWwgQmFyLkJheiBiYXogPSAxOworICAvLyAgIH0KKyAgLy8gU28sIHdlIGxvb2sgZm9yIGp1c3QgIkZvbyIgZmlyc3QsIHRoZW4gbG9vayBmb3IgIkJhci5iYXoiIHdpdGhpbiBpdCBpZgorICAvLyBmb3VuZC4KKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBuYW1lX2RvdF9wb3MgPSBuYW1lLmZpbmRfZmlyc3Rfb2YoJy4nKTsKKyAgc3RkOjpzdHJpbmcgZmlyc3RfcGFydF9vZl9uYW1lOworICBpZiAobmFtZV9kb3RfcG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgZmlyc3RfcGFydF9vZl9uYW1lID0gbmFtZTsKKyAgfSBlbHNlIHsKKyAgICBmaXJzdF9wYXJ0X29mX25hbWUgPSBuYW1lLnN1YnN0cigwLCBuYW1lX2RvdF9wb3MpOworICB9CisKKyAgc3RkOjpzdHJpbmcgc2NvcGVfdG9fdHJ5KHJlbGF0aXZlX3RvKTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIENob3Agb2ZmIHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGUgc2NvcGUuCisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gc2NvcGVfdG9fdHJ5LmZpbmRfbGFzdF9vZignLicpOworICAgIGlmIChkb3RfcG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICByZXR1cm4gRmluZFN5bWJvbChuYW1lLCBidWlsZF9pdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNjb3BlX3RvX3RyeS5lcmFzZShkb3RfcG9zKTsKKyAgICB9CisKKyAgICAvLyBBcHBlbmQgIi5maXJzdF9wYXJ0X29mX25hbWUiIGFuZCB0cnkgdG8gZmluZC4KKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIG9sZF9zaXplID0gc2NvcGVfdG9fdHJ5LnNpemUoKTsKKyAgICBzY29wZV90b190cnkuYXBwZW5kKDEsICcuJyk7CisgICAgc2NvcGVfdG9fdHJ5LmFwcGVuZChmaXJzdF9wYXJ0X29mX25hbWUpOworICAgIFN5bWJvbCByZXN1bHQgPSBGaW5kU3ltYm9sKHNjb3BlX3RvX3RyeSwgYnVpbGRfaXQpOworICAgIGlmICghcmVzdWx0LklzTnVsbCgpKSB7CisgICAgICBpZiAoZmlyc3RfcGFydF9vZl9uYW1lLnNpemUoKSA8IG5hbWUuc2l6ZSgpKSB7CisgICAgICAgIC8vIG5hbWUgaXMgYSBjb21wb3VuZCBzeW1ib2wsIG9mIHdoaWNoIHdlIG9ubHkgZm91bmQgdGhlIGZpcnN0IHBhcnQuCisgICAgICAgIC8vIE5vdyB0cnkgdG8gbG9vayB1cCB0aGUgcmVzdCBvZiBpdC4KKyAgICAgICAgaWYgKHJlc3VsdC5Jc0FnZ3JlZ2F0ZSgpKSB7CisgICAgICAgICAgc2NvcGVfdG9fdHJ5LmFwcGVuZChuYW1lLCBmaXJzdF9wYXJ0X29mX25hbWUuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5zaXplKCkgLSBmaXJzdF9wYXJ0X29mX25hbWUuc2l6ZSgpKTsKKyAgICAgICAgICByZXN1bHQgPSBGaW5kU3ltYm9sKHNjb3BlX3RvX3RyeSwgYnVpbGRfaXQpOworICAgICAgICAgIGlmIChyZXN1bHQuSXNOdWxsKCkpIHsKKyAgICAgICAgICAgIHVuZGVmaW5lX3Jlc29sdmVkX25hbWVfID0gc2NvcGVfdG9fdHJ5OworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFdlIGZvdW5kIGEgc3ltYm9sIGJ1dCBpdCdzIG5vdCBhbiBhZ2dyZWdhdGUuICBDb250aW51ZSB0aGUgbG9vcC4KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJlc29sdmVfbW9kZSA9PSBMT09LVVBfVFlQRVMgJiYgIXJlc3VsdC5Jc1R5cGUoKSkgeworICAgICAgICAgIC8vIFdlIGZvdW5kIGEgc3ltYm9sIGJ1dCBpdCdzIG5vdCBhIHR5cGUuICBDb250aW51ZSB0aGUgbG9vcC4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gTm90IGZvdW5kLiAgUmVtb3ZlIHRoZSBuYW1lIHNvIHdlIGNhbiB0cnkgYWdhaW4uCisgICAgc2NvcGVfdG9fdHJ5LmVyYXNlKG9sZF9zaXplKTsKKyAgfQorfQorCitTeW1ib2wgRGVzY3JpcHRvckJ1aWxkZXI6Okxvb2t1cFN5bWJvbCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJlbGF0aXZlX3RvLAorICAgIERlc2NyaXB0b3JQb29sOjpQbGFjZWhvbGRlclR5cGUgcGxhY2Vob2xkZXJfdHlwZSwgUmVzb2x2ZU1vZGUgcmVzb2x2ZV9tb2RlLAorICAgIGJvb2wgYnVpbGRfaXQpIHsKKyAgU3ltYm9sIHJlc3VsdCA9CisgICAgICBMb29rdXBTeW1ib2xOb1BsYWNlaG9sZGVyKG5hbWUsIHJlbGF0aXZlX3RvLCByZXNvbHZlX21vZGUsIGJ1aWxkX2l0KTsKKyAgaWYgKHJlc3VsdC5Jc051bGwoKSAmJiBwb29sXy0+YWxsb3dfdW5rbm93bl8pIHsKKyAgICAvLyBOb3QgZm91bmQsIGJ1dCBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKSBpcyBlbmFibGVkLiAgUmV0dXJuIGEKKyAgICAvLyBwbGFjZWhvbGRlciBpbnN0ZWFkLgorICAgIHJlc3VsdCA9IHBvb2xfLT5OZXdQbGFjZWhvbGRlcldpdGhNdXRleEhlbGQobmFtZSwgcGxhY2Vob2xkZXJfdHlwZSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGJvb2wgVmFsaWRhdGVRdWFsaWZpZWROYW1lKFN0cmluZ1BpZWNlIG5hbWUpIHsKKyAgYm9vbCBsYXN0X3dhc19wZXJpb2QgPSBmYWxzZTsKKworICBmb3IgKGNoYXIgY2hhcmFjdGVyIDogbmFtZSkgeworICAgIC8vIEkgZG9uJ3QgdHJ1c3QgaXNhbG51bSgpIGR1ZSB0byBsb2NhbGVzLiAgOigKKyAgICBpZiAoKCdhJyA8PSBjaGFyYWN0ZXIgJiYgY2hhcmFjdGVyIDw9ICd6JykgfHwKKyAgICAgICAgKCdBJyA8PSBjaGFyYWN0ZXIgJiYgY2hhcmFjdGVyIDw9ICdaJykgfHwKKyAgICAgICAgKCcwJyA8PSBjaGFyYWN0ZXIgJiYgY2hhcmFjdGVyIDw9ICc5JykgfHwgKGNoYXJhY3RlciA9PSAnXycpKSB7CisgICAgICBsYXN0X3dhc19wZXJpb2QgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PSAnLicpIHsKKyAgICAgIGlmIChsYXN0X3dhc19wZXJpb2QpIHJldHVybiBmYWxzZTsKKyAgICAgIGxhc3Rfd2FzX3BlcmlvZCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gIW5hbWUuZW1wdHkoKSAmJiAhbGFzdF93YXNfcGVyaW9kOworfQorCitTeW1ib2wgRGVzY3JpcHRvclBvb2w6Ok5ld1BsYWNlaG9sZGVyKFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYWNlaG9sZGVyVHlwZSBwbGFjZWhvbGRlcl90eXBlKSBjb25zdCB7CisgIE11dGV4TG9ja01heWJlIGxvY2sobXV0ZXhfKTsKKyAgcmV0dXJuIE5ld1BsYWNlaG9sZGVyV2l0aE11dGV4SGVsZChuYW1lLCBwbGFjZWhvbGRlcl90eXBlKTsKK30KKworU3ltYm9sIERlc2NyaXB0b3JQb29sOjpOZXdQbGFjZWhvbGRlcldpdGhNdXRleEhlbGQoCisgICAgU3RyaW5nUGllY2UgbmFtZSwgUGxhY2Vob2xkZXJUeXBlIHBsYWNlaG9sZGVyX3R5cGUpIGNvbnN0IHsKKyAgaWYgKG11dGV4XykgeworICAgIG11dGV4Xy0+QXNzZXJ0SGVsZCgpOworICB9CisgIC8vIENvbXB1dGUgbmFtZXMuCisgIFN0cmluZ1BpZWNlIHBsYWNlaG9sZGVyX2Z1bGxfbmFtZTsKKyAgU3RyaW5nUGllY2UgcGxhY2Vob2xkZXJfbmFtZTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcqIHBsYWNlaG9sZGVyX3BhY2thZ2U7CisKKyAgaWYgKCFWYWxpZGF0ZVF1YWxpZmllZE5hbWUobmFtZSkpIHJldHVybiBTeW1ib2woKTsKKyAgaWYgKG5hbWVbMF0gPT0gJy4nKSB7CisgICAgLy8gRnVsbHktcXVhbGlmaWVkLgorICAgIHBsYWNlaG9sZGVyX2Z1bGxfbmFtZSA9IG5hbWUuc3Vic3RyKDEpOworICB9IGVsc2UgeworICAgIHBsYWNlaG9sZGVyX2Z1bGxfbmFtZSA9IG5hbWU7CisgIH0KKworICAvLyBDcmVhdGUgdGhlIHBsYWNlaG9sZGVycy4KKyAgaW50ZXJuYWw6OkZsYXRBbGxvY2F0b3IgYWxsb2M7CisgIGFsbG9jLlBsYW5BcnJheTxGaWxlRGVzY3JpcHRvcj4oMSk7CisgIGFsbG9jLlBsYW5BcnJheTxzdGQ6OnN0cmluZz4oMik7CisgIGlmIChwbGFjZWhvbGRlcl90eXBlID09IFBMQUNFSE9MREVSX0VOVU0pIHsKKyAgICBhbGxvYy5QbGFuQXJyYXk8RW51bURlc2NyaXB0b3I+KDEpOworICAgIGFsbG9jLlBsYW5BcnJheTxFbnVtVmFsdWVEZXNjcmlwdG9yPigxKTsKKyAgICBhbGxvYy5QbGFuQXJyYXk8c3RkOjpzdHJpbmc+KDIpOyAgLy8gbmFtZXMgZm9yIHRoZSBkZXNjcmlwdG9yLgorICAgIGFsbG9jLlBsYW5BcnJheTxzdGQ6OnN0cmluZz4oMik7ICAvLyBuYW1lcyBmb3IgdGhlIHZhbHVlLgorICB9IGVsc2UgeworICAgIGFsbG9jLlBsYW5BcnJheTxEZXNjcmlwdG9yPigxKTsKKyAgICBhbGxvYy5QbGFuQXJyYXk8c3RkOjpzdHJpbmc+KDIpOyAgLy8gbmFtZXMgZm9yIHRoZSBkZXNjcmlwdG9yLgorICAgIGlmIChwbGFjZWhvbGRlcl90eXBlID09IFBMQUNFSE9MREVSX0VYVEVOREFCTEVfTUVTU0FHRSkgeworICAgICAgYWxsb2MuUGxhbkFycmF5PERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlPigxKTsKKyAgICB9CisgIH0KKyAgYWxsb2MuRmluYWxpemVQbGFubmluZyh0YWJsZXNfKTsKKworICBjb25zdCBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGRvdHBvcyA9IHBsYWNlaG9sZGVyX2Z1bGxfbmFtZS5maW5kX2xhc3Rfb2YoJy4nKTsKKyAgaWYgKGRvdHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgIHBsYWNlaG9sZGVyX3BhY2thZ2UgPQorICAgICAgICBhbGxvYy5BbGxvY2F0ZVN0cmluZ3MocGxhY2Vob2xkZXJfZnVsbF9uYW1lLnN1YnN0cigwLCBkb3Rwb3MpKTsKKyAgICBwbGFjZWhvbGRlcl9uYW1lID0gcGxhY2Vob2xkZXJfZnVsbF9uYW1lLnN1YnN0cihkb3Rwb3MgKyAxKTsKKyAgfSBlbHNlIHsKKyAgICBwbGFjZWhvbGRlcl9wYWNrYWdlID0gYWxsb2MuQWxsb2NhdGVTdHJpbmdzKCIiKTsKKyAgICBwbGFjZWhvbGRlcl9uYW1lID0gcGxhY2Vob2xkZXJfZnVsbF9uYW1lOworICB9CisKKyAgRmlsZURlc2NyaXB0b3IqIHBsYWNlaG9sZGVyX2ZpbGUgPSBOZXdQbGFjZWhvbGRlckZpbGVXaXRoTXV0ZXhIZWxkKAorICAgICAgU3RyQ2F0KHBsYWNlaG9sZGVyX2Z1bGxfbmFtZSwgIi5wbGFjZWhvbGRlci5wcm90byIpLCBhbGxvYyk7CisgIHBsYWNlaG9sZGVyX2ZpbGUtPnBhY2thZ2VfID0gcGxhY2Vob2xkZXJfcGFja2FnZTsKKworICBpZiAocGxhY2Vob2xkZXJfdHlwZSA9PSBQTEFDRUhPTERFUl9FTlVNKSB7CisgICAgcGxhY2Vob2xkZXJfZmlsZS0+ZW51bV90eXBlX2NvdW50XyA9IDE7CisgICAgcGxhY2Vob2xkZXJfZmlsZS0+ZW51bV90eXBlc18gPSBhbGxvYy5BbGxvY2F0ZUFycmF5PEVudW1EZXNjcmlwdG9yPigxKTsKKworICAgIEVudW1EZXNjcmlwdG9yKiBwbGFjZWhvbGRlcl9lbnVtID0gJnBsYWNlaG9sZGVyX2ZpbGUtPmVudW1fdHlwZXNfWzBdOworICAgIG1lbXNldChzdGF0aWNfY2FzdDx2b2lkKj4ocGxhY2Vob2xkZXJfZW51bSksIDAsIHNpemVvZigqcGxhY2Vob2xkZXJfZW51bSkpOworCisgICAgcGxhY2Vob2xkZXJfZW51bS0+YWxsX25hbWVzXyA9CisgICAgICAgIGFsbG9jLkFsbG9jYXRlU3RyaW5ncyhwbGFjZWhvbGRlcl9uYW1lLCBwbGFjZWhvbGRlcl9mdWxsX25hbWUpOworICAgIHBsYWNlaG9sZGVyX2VudW0tPmZpbGVfID0gcGxhY2Vob2xkZXJfZmlsZTsKKyAgICBwbGFjZWhvbGRlcl9lbnVtLT5vcHRpb25zXyA9ICZFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpOworICAgIHBsYWNlaG9sZGVyX2VudW0tPmlzX3BsYWNlaG9sZGVyXyA9IHRydWU7CisgICAgcGxhY2Vob2xkZXJfZW51bS0+aXNfdW5xdWFsaWZpZWRfcGxhY2Vob2xkZXJfID0gKG5hbWVbMF0gIT0gJy4nKTsKKworICAgIC8vIEVudW1zIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdmFsdWUuCisgICAgcGxhY2Vob2xkZXJfZW51bS0+dmFsdWVfY291bnRfID0gMTsKKyAgICBwbGFjZWhvbGRlcl9lbnVtLT52YWx1ZXNfID0gYWxsb2MuQWxsb2NhdGVBcnJheTxFbnVtVmFsdWVEZXNjcmlwdG9yPigxKTsKKyAgICAvLyBEaXNhYmxlIGZhc3QtcGF0aCBsb29rdXAgZm9yIHRoaXMgZW51bS4KKyAgICBwbGFjZWhvbGRlcl9lbnVtLT5zZXF1ZW50aWFsX3ZhbHVlX2xpbWl0XyA9IC0xOworCisgICAgRW51bVZhbHVlRGVzY3JpcHRvciogcGxhY2Vob2xkZXJfdmFsdWUgPSAmcGxhY2Vob2xkZXJfZW51bS0+dmFsdWVzX1swXTsKKyAgICBtZW1zZXQoc3RhdGljX2Nhc3Q8dm9pZCo+KHBsYWNlaG9sZGVyX3ZhbHVlKSwgMCwKKyAgICAgICAgICAgc2l6ZW9mKCpwbGFjZWhvbGRlcl92YWx1ZSkpOworCisgICAgLy8gTm90ZSB0aGF0IGVudW0gdmFsdWUgbmFtZXMgYXJlIHNpYmxpbmdzIG9mIHRoZWlyIHR5cGUsIG5vdCBjaGlsZHJlbi4KKyAgICBwbGFjZWhvbGRlcl92YWx1ZS0+YWxsX25hbWVzXyA9IGFsbG9jLkFsbG9jYXRlU3RyaW5ncygKKyAgICAgICAgIlBMQUNFSE9MREVSX1ZBTFVFIiwgcGxhY2Vob2xkZXJfcGFja2FnZS0+ZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiUExBQ0VIT0xERVJfVkFMVUUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICpwbGFjZWhvbGRlcl9wYWNrYWdlICsgIi5QTEFDRUhPTERFUl9WQUxVRSIpOworCisgICAgcGxhY2Vob2xkZXJfdmFsdWUtPm51bWJlcl8gPSAwOworICAgIHBsYWNlaG9sZGVyX3ZhbHVlLT50eXBlXyA9IHBsYWNlaG9sZGVyX2VudW07CisgICAgcGxhY2Vob2xkZXJfdmFsdWUtPm9wdGlvbnNfID0gJkVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKworICAgIHJldHVybiBTeW1ib2wocGxhY2Vob2xkZXJfZW51bSk7CisgIH0gZWxzZSB7CisgICAgcGxhY2Vob2xkZXJfZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50XyA9IDE7CisgICAgcGxhY2Vob2xkZXJfZmlsZS0+bWVzc2FnZV90eXBlc18gPSBhbGxvYy5BbGxvY2F0ZUFycmF5PERlc2NyaXB0b3I+KDEpOworCisgICAgRGVzY3JpcHRvciogcGxhY2Vob2xkZXJfbWVzc2FnZSA9ICZwbGFjZWhvbGRlcl9maWxlLT5tZXNzYWdlX3R5cGVzX1swXTsKKyAgICBtZW1zZXQoc3RhdGljX2Nhc3Q8dm9pZCo+KHBsYWNlaG9sZGVyX21lc3NhZ2UpLCAwLAorICAgICAgICAgICBzaXplb2YoKnBsYWNlaG9sZGVyX21lc3NhZ2UpKTsKKworICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPmFsbF9uYW1lc18gPQorICAgICAgICBhbGxvYy5BbGxvY2F0ZVN0cmluZ3MocGxhY2Vob2xkZXJfbmFtZSwgcGxhY2Vob2xkZXJfZnVsbF9uYW1lKTsKKyAgICBwbGFjZWhvbGRlcl9tZXNzYWdlLT5maWxlXyA9IHBsYWNlaG9sZGVyX2ZpbGU7CisgICAgcGxhY2Vob2xkZXJfbWVzc2FnZS0+b3B0aW9uc18gPSAmTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgICBwbGFjZWhvbGRlcl9tZXNzYWdlLT5pc19wbGFjZWhvbGRlcl8gPSB0cnVlOworICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPmlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXyA9IChuYW1lWzBdICE9ICcuJyk7CisKKyAgICBpZiAocGxhY2Vob2xkZXJfdHlwZSA9PSBQTEFDRUhPTERFUl9FWFRFTkRBQkxFX01FU1NBR0UpIHsKKyAgICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZV9jb3VudF8gPSAxOworICAgICAgcGxhY2Vob2xkZXJfbWVzc2FnZS0+ZXh0ZW5zaW9uX3Jhbmdlc18gPQorICAgICAgICAgIGFsbG9jLkFsbG9jYXRlQXJyYXk8RGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2U+KDEpOworICAgICAgcGxhY2Vob2xkZXJfbWVzc2FnZS0+ZXh0ZW5zaW9uX3Jhbmdlc19bMF0uc3RhcnQgPSAxOworICAgICAgLy8ga01heE51bWJlciArIDEgYmVjYXVzZSBFeHRlbnNpb25SYW5nZTo6ZW5kIGlzIGV4Y2x1c2l2ZS4KKyAgICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZXNfWzBdLmVuZCA9CisgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyICsgMTsKKyAgICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZXNfWzBdLm9wdGlvbnNfID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gU3ltYm9sKHBsYWNlaG9sZGVyX21lc3NhZ2UpOworICB9Cit9CisKK0ZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6TmV3UGxhY2Vob2xkZXJGaWxlKAorICAgIFN0cmluZ1BpZWNlIG5hbWUpIGNvbnN0IHsKKyAgTXV0ZXhMb2NrTWF5YmUgbG9jayhtdXRleF8pOworICBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciBhbGxvYzsKKyAgYWxsb2MuUGxhbkFycmF5PEZpbGVEZXNjcmlwdG9yPigxKTsKKyAgYWxsb2MuUGxhbkFycmF5PHN0ZDo6c3RyaW5nPigxKTsKKyAgYWxsb2MuRmluYWxpemVQbGFubmluZyh0YWJsZXNfKTsKKworICByZXR1cm4gTmV3UGxhY2Vob2xkZXJGaWxlV2l0aE11dGV4SGVsZChuYW1lLCBhbGxvYyk7Cit9CisKK0ZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6TmV3UGxhY2Vob2xkZXJGaWxlV2l0aE11dGV4SGVsZCgKKyAgICBTdHJpbmdQaWVjZSBuYW1lLCBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpIGNvbnN0IHsKKyAgaWYgKG11dGV4XykgeworICAgIG11dGV4Xy0+QXNzZXJ0SGVsZCgpOworICB9CisgIEZpbGVEZXNjcmlwdG9yKiBwbGFjZWhvbGRlciA9IGFsbG9jLkFsbG9jYXRlQXJyYXk8RmlsZURlc2NyaXB0b3I+KDEpOworICBtZW1zZXQoc3RhdGljX2Nhc3Q8dm9pZCo+KHBsYWNlaG9sZGVyKSwgMCwgc2l6ZW9mKCpwbGFjZWhvbGRlcikpOworCisgIHBsYWNlaG9sZGVyLT5uYW1lXyA9IGFsbG9jLkFsbG9jYXRlU3RyaW5ncyhuYW1lKTsKKyAgcGxhY2Vob2xkZXItPnBhY2thZ2VfID0gJmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOworICBwbGFjZWhvbGRlci0+cG9vbF8gPSB0aGlzOworICBwbGFjZWhvbGRlci0+b3B0aW9uc18gPSAmRmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgcGxhY2Vob2xkZXItPnRhYmxlc18gPSAmRmlsZURlc2NyaXB0b3JUYWJsZXM6OkdldEVtcHR5SW5zdGFuY2UoKTsKKyAgcGxhY2Vob2xkZXItPnNvdXJjZV9jb2RlX2luZm9fID0gJlNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgIHBsYWNlaG9sZGVyLT5pc19wbGFjZWhvbGRlcl8gPSB0cnVlOworICBwbGFjZWhvbGRlci0+c3ludGF4XyA9IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfVU5LTk9XTjsKKyAgcGxhY2Vob2xkZXItPmZpbmlzaGVkX2J1aWxkaW5nXyA9IHRydWU7CisgIC8vIEFsbCBvdGhlciBmaWVsZHMgYXJlIHplcm8gb3IgbnVsbHB0ci4KKworICByZXR1cm4gcGxhY2Vob2xkZXI7Cit9CisKK2Jvb2wgRGVzY3JpcHRvckJ1aWxkZXI6OkFkZFN5bWJvbChjb25zdCBzdGQ6OnN0cmluZyYgZnVsbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHBhcmVudCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgcHJvdG8sIFN5bWJvbCBzeW1ib2wpIHsKKyAgLy8gSWYgdGhlIGNhbGxlciBwYXNzZWQgbnVsbHB0ciBmb3IgdGhlIHBhcmVudCwgdGhlIHN5bWJvbCBpcyBhdCBmaWxlIHNjb3BlLgorICAvLyBVc2UgaXRzIGZpbGUgYXMgdGhlIHBhcmVudCBpbnN0ZWFkLgorICBpZiAocGFyZW50ID09IG51bGxwdHIpIHBhcmVudCA9IGZpbGVfOworCisgIGlmIChmdWxsX25hbWUuZmluZCgnXDAnKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgIEFkZEVycm9yKGZ1bGxfbmFtZSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAiXCIiICsgZnVsbF9uYW1lICsgIlwiIGNvbnRhaW5zIG51bGwgY2hhcmFjdGVyLiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAodGFibGVzXy0+QWRkU3ltYm9sKGZ1bGxfbmFtZSwgc3ltYm9sKSkgeworICAgIGlmICghZmlsZV90YWJsZXNfLT5BZGRBbGlhc1VuZGVyUGFyZW50KHBhcmVudCwgbmFtZSwgc3ltYm9sKSkgeworICAgICAgLy8gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZXJlIHdhcyBhbHJlYWR5IGFuIGVycm9yIGFkZGluZyBzb21ldGhpbmcgb2YKKyAgICAgIC8vIHRoZSBzYW1lIG5hbWUuCisgICAgICBpZiAoIWhhZF9lcnJvcnNfKSB7CisgICAgICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiXCIiIDw8IGZ1bGxfbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiXCIgbm90IHByZXZpb3VzbHkgZGVmaW5lZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJzeW1ib2xzX2J5X25hbWVfLCBidXQgd2FzIGRlZmluZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAic3ltYm9sc19ieV9wYXJlbnRfOyB0aGlzIHNob3VsZG4ndCBiZSBwb3NzaWJsZS4iOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogb3RoZXJfZmlsZSA9IHRhYmxlc18tPkZpbmRTeW1ib2woZnVsbF9uYW1lKS5HZXRGaWxlKCk7CisgICAgaWYgKG90aGVyX2ZpbGUgPT0gZmlsZV8pIHsKKyAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZG90X3BvcyA9IGZ1bGxfbmFtZS5maW5kX2xhc3Rfb2YoJy4nKTsKKyAgICAgIGlmIChkb3RfcG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFkZEVycm9yKGZ1bGxfbmFtZSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICAgIlwiIiArIGZ1bGxfbmFtZSArICJcIiBpcyBhbHJlYWR5IGRlZmluZWQuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBBZGRFcnJvcihmdWxsX25hbWUsIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgICAgICJcIiIgKyBmdWxsX25hbWUuc3Vic3RyKGRvdF9wb3MgKyAxKSArCisgICAgICAgICAgICAgICAgICAgICAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIFwiIiArCisgICAgICAgICAgICAgICAgICAgICBmdWxsX25hbWUuc3Vic3RyKDAsIGRvdF9wb3MpICsgIlwiLiIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBTeW1ib2wgc2VlbXMgdG8gaGF2ZSBiZWVuIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgZmlsZS4KKyAgICAgIEFkZEVycm9yKGZ1bGxfbmFtZSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICJcIiIgKyBmdWxsX25hbWUgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIGZpbGUgXCIiICsKKyAgICAgICAgICAgICAgICAgICAob3RoZXJfZmlsZSA9PSBudWxscHRyID8gIm51bGwiIDogb3RoZXJfZmlsZS0+bmFtZSgpKSArCisgICAgICAgICAgICAgICAgICAgIlwiLiIpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWRkUGFja2FnZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgcHJvdG8sIEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIGlmIChuYW1lLmZpbmQoJ1wwJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBBZGRFcnJvcihuYW1lLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAorICAgICAgICAgICAgICJcIiIgKyBuYW1lICsgIlwiIGNvbnRhaW5zIG51bGwgY2hhcmFjdGVyLiIpOworICAgIHJldHVybjsKKyAgfQorCisgIFN5bWJvbCBleGlzdGluZ19zeW1ib2wgPSB0YWJsZXNfLT5GaW5kU3ltYm9sKG5hbWUpOworICAvLyBJdCdzIE9LIHRvIHJlZGVmaW5lIGEgcGFja2FnZS4KKyAgaWYgKGV4aXN0aW5nX3N5bWJvbC5Jc051bGwoKSkgeworICAgIGlmICgmbmFtZSA9PSAmZmlsZS0+cGFja2FnZSgpKSB7CisgICAgICAvLyBJdCBpcyB0aGUgdG9wbGV2ZWwgcGFja2FnZSBuYW1lLCBzbyBpbnNlcnQgdGhlIGRlc2NyaXB0b3IgZGlyZWN0bHkuCisgICAgICB0YWJsZXNfLT5BZGRTeW1ib2woZmlsZS0+cGFja2FnZSgpLCBTeW1ib2woZmlsZSkpOworICAgIH0gZWxzZSB7CisgICAgICBhdXRvKiBwYWNrYWdlID0gdGFibGVzXy0+QWxsb2NhdGU8U3ltYm9sOjpTdWJwYWNrYWdlPigpOworICAgICAgLy8gSWYgdGhlIG5hbWUgaXMgdGhlIHBhY2thZ2UgbmFtZSwgdGhlbiBpdCBpcyBhbHJlYWR5IGluIHRoZSBhcmVuYS4KKyAgICAgIC8vIElmIG5vdCwgY29weSBpdCB0aGVyZS4gSXQgY2FtZSBmcm9tIHRoZSBjYWxsIHRvIEFkZFBhY2thZ2UgYmVsb3cuCisgICAgICBwYWNrYWdlLT5uYW1lX3NpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KG5hbWUuc2l6ZSgpKTsKKyAgICAgIHBhY2thZ2UtPmZpbGUgPSBmaWxlOworICAgICAgdGFibGVzXy0+QWRkU3ltYm9sKG5hbWUsIFN5bWJvbChwYWNrYWdlKSk7CisgICAgfQorICAgIC8vIEFsc28gYWRkIHBhcmVudCBwYWNrYWdlLCBpZiBhbnkuCisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gbmFtZS5maW5kX2xhc3Rfb2YoJy4nKTsKKyAgICBpZiAoZG90X3BvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgLy8gTm8gcGFyZW50cy4KKyAgICAgIFZhbGlkYXRlU3ltYm9sTmFtZShuYW1lLCBuYW1lLCBwcm90byk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEhhcyBwYXJlbnQuCisgICAgICBBZGRQYWNrYWdlKG5hbWUuc3Vic3RyKDAsIGRvdF9wb3MpLCBwcm90bywgZmlsZSk7CisgICAgICBWYWxpZGF0ZVN5bWJvbE5hbWUobmFtZS5zdWJzdHIoZG90X3BvcyArIDEpLCBuYW1lLCBwcm90byk7CisgICAgfQorICB9IGVsc2UgaWYgKCFleGlzdGluZ19zeW1ib2wuSXNQYWNrYWdlKCkpIHsKKyAgICAvLyBTeW1ib2wgc2VlbXMgdG8gaGF2ZSBiZWVuIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgZmlsZS4KKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogb3RoZXJfZmlsZSA9IGV4aXN0aW5nX3N5bWJvbC5HZXRGaWxlKCk7CisgICAgQWRkRXJyb3IobmFtZSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAiXCIiICsgbmFtZSArCisgICAgICAgICAgICAgICAgICJcIiBpcyBhbHJlYWR5IGRlZmluZWQgKGFzIHNvbWV0aGluZyBvdGhlciB0aGFuICIKKyAgICAgICAgICAgICAgICAgImEgcGFja2FnZSkgaW4gZmlsZSBcIiIgKworICAgICAgICAgICAgICAgICAob3RoZXJfZmlsZSA9PSBudWxscHRyID8gIm51bGwiIDogb3RoZXJfZmlsZS0+bmFtZSgpKSArICJcIi4iKTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZVN5bWJvbE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBwcm90bykgeworICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgQWRkRXJyb3IoZnVsbF9uYW1lLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAorICAgICAgICAgICAgICJNaXNzaW5nIG5hbWUuIik7CisgIH0gZWxzZSB7CisgICAgZm9yIChjaGFyIGNoYXJhY3RlciA6IG5hbWUpIHsKKyAgICAgIC8vIEkgZG9uJ3QgdHJ1c3QgaXNhbG51bSgpIGR1ZSB0byBsb2NhbGVzLiAgOigKKyAgICAgIGlmICgoY2hhcmFjdGVyIDwgJ2EnIHx8ICd6JyA8IGNoYXJhY3RlcikgJiYKKyAgICAgICAgICAoY2hhcmFjdGVyIDwgJ0EnIHx8ICdaJyA8IGNoYXJhY3RlcikgJiYKKyAgICAgICAgICAoY2hhcmFjdGVyIDwgJzAnIHx8ICc5JyA8IGNoYXJhY3RlcikgJiYgKGNoYXJhY3RlciAhPSAnXycpKSB7CisgICAgICAgIEFkZEVycm9yKGZ1bGxfbmFtZSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICAgIlwiIiArIG5hbWUgKyAiXCIgaXMgbm90IGEgdmFsaWQgaWRlbnRpZmllci4iKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBpcyBnb29kIGZvciBhbGwgZGVzY3JpcHRvcnMgZXhjZXB0CisvLyBGaWxlRGVzY3JpcHRvci4KK3RlbXBsYXRlIDxjbGFzcyBEZXNjcmlwdG9yVD4KK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkFsbG9jYXRlT3B0aW9ucygKKyAgICBjb25zdCB0eXBlbmFtZSBEZXNjcmlwdG9yVDo6T3B0aW9uc1R5cGUmIG9yaWdfb3B0aW9ucywKKyAgICBEZXNjcmlwdG9yVCogZGVzY3JpcHRvciwgaW50IG9wdGlvbnNfZmllbGRfdGFnLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fbmFtZSwgaW50ZXJuYWw6OkZsYXRBbGxvY2F0b3ImIGFsbG9jKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gb3B0aW9uc19wYXRoOworICBkZXNjcmlwdG9yLT5HZXRMb2NhdGlvblBhdGgoJm9wdGlvbnNfcGF0aCk7CisgIG9wdGlvbnNfcGF0aC5wdXNoX2JhY2sob3B0aW9uc19maWVsZF90YWcpOworICBBbGxvY2F0ZU9wdGlvbnNJbXBsKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLCBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBvcmlnX29wdGlvbnMsIGRlc2NyaXB0b3IsIG9wdGlvbnNfcGF0aCwgb3B0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgYWxsb2MpOworfQorCisvLyBXZSBzcGVjaWFsaXplIGZvciBGaWxlRGVzY3JpcHRvci4KK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkFsbG9jYXRlT3B0aW9ucyhjb25zdCBGaWxlT3B0aW9ucyYgb3JpZ19vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYykgeworICBzdGQ6OnZlY3RvcjxpbnQ+IG9wdGlvbnNfcGF0aDsKKyAgb3B0aW9uc19wYXRoLnB1c2hfYmFjayhGaWxlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyKTsKKyAgLy8gV2UgYWRkIHRoZSBkdW1teSB0b2tlbiBzbyB0aGF0IExvb2t1cFN5bWJvbCBkb2VzIHRoZSByaWdodCB0aGluZy4KKyAgQWxsb2NhdGVPcHRpb25zSW1wbChkZXNjcmlwdG9yLT5wYWNrYWdlKCkgKyAiLmR1bW15IiwgZGVzY3JpcHRvci0+bmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIG9yaWdfb3B0aW9ucywgZGVzY3JpcHRvciwgb3B0aW9uc19wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMiLCBhbGxvYyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBEZXNjcmlwdG9yVD4KK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkFsbG9jYXRlT3B0aW9uc0ltcGwoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWVfc2NvcGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbGVtZW50X25hbWUsCisgICAgY29uc3QgdHlwZW5hbWUgRGVzY3JpcHRvclQ6Ok9wdGlvbnNUeXBlJiBvcmlnX29wdGlvbnMsCisgICAgRGVzY3JpcHRvclQqIGRlc2NyaXB0b3IsIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIG9wdGlvbnNfcGF0aCwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX25hbWUsIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYykgeworICBhdXRvKiBvcHRpb25zID0gYWxsb2MuQWxsb2NhdGVBcnJheTx0eXBlbmFtZSBEZXNjcmlwdG9yVDo6T3B0aW9uc1R5cGU+KDEpOworCisgIGlmICghb3JpZ19vcHRpb25zLklzSW5pdGlhbGl6ZWQoKSkgeworICAgIEFkZEVycm9yKG5hbWVfc2NvcGUgKyAiLiIgKyBlbGVtZW50X25hbWUsIG9yaWdfb3B0aW9ucywKKyAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9QVElPTl9OQU1FLAorICAgICAgICAgICAgICJVbmludGVycHJldGVkIG9wdGlvbiBpcyBtaXNzaW5nIG5hbWUgb3IgdmFsdWUuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQXZvaWQgdXNpbmcgTWVyZ2VGcm9tKCkvQ29weUZyb20oKSBpbiB0aGlzIGNsYXNzIHRvIG1ha2UgaXQgLWZuby1ydHRpCisgIC8vIGZyaWVuZGx5LiBXaXRob3V0IFJUVEksIE1lcmdlRnJvbSgpIGFuZCBDb3B5RnJvbSgpIHdpbGwgZmFsbGJhY2sgdG8gdGhlCisgIC8vIHJlZmxlY3Rpb24gYmFzZWQgbWV0aG9kLCB3aGljaCByZXF1aXJlcyB0aGUgRGVzY3JpcHRvci4gSG93ZXZlciwgd2UgYXJlIGluCisgIC8vIHRoZSBtaWRkbGUgb2YgYnVpbGRpbmcgdGhlIGRlc2NyaXB0b3JzLCB0aHVzIHRoZSBkZWFkbG9jay4KKyAgb3B0aW9ucy0+UGFyc2VGcm9tU3RyaW5nKG9yaWdfb3B0aW9ucy5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgZGVzY3JpcHRvci0+b3B0aW9uc18gPSBvcHRpb25zOworCisgIC8vIERvbid0IGFkZCB0byBvcHRpb25zX3RvX2ludGVycHJldF8gdW5sZXNzIHRoZXJlIHdlcmUgdW5pbnRlcnByZXRlZAorICAvLyBvcHRpb25zLiAgVGhpcyBub3Qgb25seSBhdm9pZHMgdW5uZWNlc3Nhcnkgd29yaywgYnV0IHByZXZlbnRzIGEKKyAgLy8gYm9vdHN0cmFwcGluZyBwcm9ibGVtIHdoZW4gYnVpbGRpbmcgZGVzY3JpcHRvcnMgZm9yIGRlc2NyaXB0b3IucHJvdG8uCisgIC8vIGRlc2NyaXB0b3IucHJvdG8gZG9lcyBub3QgY29udGFpbiBhbnkgdW5pbnRlcnByZXRlZCBvcHRpb25zLCBidXQKKyAgLy8gYXR0ZW1wdGluZyB0byBpbnRlcnByZXQgb3B0aW9ucyBhbnl3YXkgd2lsbCBjYXVzZQorICAvLyBPcHRpb25zVHlwZTo6R2V0RGVzY3JpcHRvcigpIHRvIGJlIGNhbGxlZCB3aGljaCBtYXkgdGhlbiBkZWFkbG9jayBzaW5jZQorICAvLyB3ZSdyZSBzdGlsbCB0cnlpbmcgdG8gYnVpbGQgaXQuCisgIGlmIChvcHRpb25zLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgPiAwKSB7CisgICAgb3B0aW9uc190b19pbnRlcnByZXRfLnB1c2hfYmFjayhPcHRpb25zVG9JbnRlcnByZXQoCisgICAgICAgIG5hbWVfc2NvcGUsIGVsZW1lbnRfbmFtZSwgb3B0aW9uc19wYXRoLCAmb3JpZ19vcHRpb25zLCBvcHRpb25zKSk7CisgIH0KKworICAvLyBJZiB0aGUgY3VzdG9tIG9wdGlvbiBpcyBpbiB1bmtub3duIGZpZWxkcywgbm8gbmVlZCB0byBpbnRlcnByZXQgaXQuCisgIC8vIFJlbW92ZSB0aGUgZGVwZW5kZW5jeSBmaWxlIGZyb20gdW51c2VkX2RlcGVuZGVuY3kuCisgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMgPSBvcmlnX29wdGlvbnMudW5rbm93bl9maWVsZHMoKTsKKyAgaWYgKCF1bmtub3duX2ZpZWxkcy5lbXB0eSgpKSB7CisgICAgLy8gQ2FuIG5vdCB1c2Ugb3B0aW9ucy0+R2V0RGVzY3JpcHRvcigpIHdoaWNoIG1heSBjYXNlIGRlYWRsb2NrLgorICAgIFN5bWJvbCBtc2dfc3ltYm9sID0gdGFibGVzXy0+RmluZFN5bWJvbChvcHRpb25fbmFtZSk7CisgICAgaWYgKG1zZ19zeW1ib2wudHlwZSgpID09IFN5bWJvbDo6TUVTU0FHRSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyArK2kpIHsKKyAgICAgICAgYXNzZXJ0X211dGV4X2hlbGQocG9vbF8pOworICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KKyAgICAgICAgICAgIHBvb2xfLT5JbnRlcm5hbEZpbmRFeHRlbnNpb25CeU51bWJlck5vTG9jaygKKyAgICAgICAgICAgICAgICBtc2dfc3ltYm9sLmRlc2NyaXB0b3IoKSwgdW5rbm93bl9maWVsZHMuZmllbGQoaSkubnVtYmVyKCkpOworICAgICAgICBpZiAoZmllbGQpIHsKKyAgICAgICAgICB1bnVzZWRfZGVwZW5kZW5jeV8uZXJhc2UoZmllbGQtPmZpbGUoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gQSBjb21tb24gcGF0dGVybjogIFdlIHdhbnQgdG8gY29udmVydCBhIHJlcGVhdGVkIGZpZWxkIGluIHRoZSBkZXNjcmlwdG9yCisvLyB0byBhbiBhcnJheSBvZiB2YWx1ZXMsIGNhbGxpbmcgc29tZSBtZXRob2QgdG8gYnVpbGQgZWFjaCB2YWx1ZS4KKyNkZWZpbmUgQlVJTERfQVJSQVkoSU5QVVQsIE9VVFBVVCwgTkFNRSwgTUVUSE9ELCBQQVJFTlQpICAgICAgICAgICAgICAgXAorICBPVVRQVVQtPk5BTUUjI19jb3VudF8gPSBJTlBVVC5OQU1FIyNfc2l6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9VVFBVVC0+TkFNRSMjc18gPSBhbGxvYy5BbGxvY2F0ZUFycmF5PCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3BvaW50ZXI8ZGVjbHR5cGUoT1VUUFVULT5OQU1FIyNzXyk+Ojp0eXBlPiggXAorICAgICAgSU5QVVQuTkFNRSMjX3NpemUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5QVVQuTkFNRSMjX3NpemUoKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNRVRIT0QoSU5QVVQuTkFNRShpKSwgUEFSRU5ULCBPVVRQVVQtPk5BTUUjI3NfICsgaSwgYWxsb2MpOyAgICAgICAgXAorICB9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkFkZFJlY3Vyc2l2ZUltcG9ydEVycm9yKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvLCBpbnQgZnJvbV9oZXJlKSB7CisgIHN0ZDo6c3RyaW5nIGVycm9yX21lc3NhZ2UoIkZpbGUgcmVjdXJzaXZlbHkgaW1wb3J0cyBpdHNlbGY6ICIpOworICBmb3IgKHNpemVfdCBpID0gZnJvbV9oZXJlOyBpIDwgdGFibGVzXy0+cGVuZGluZ19maWxlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBlcnJvcl9tZXNzYWdlLmFwcGVuZCh0YWJsZXNfLT5wZW5kaW5nX2ZpbGVzX1tpXSk7CisgICAgZXJyb3JfbWVzc2FnZS5hcHBlbmQoIiAtPiAiKTsKKyAgfQorICBlcnJvcl9tZXNzYWdlLmFwcGVuZChwcm90by5uYW1lKCkpOworCisgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGZyb21faGVyZSkgPCB0YWJsZXNfLT5wZW5kaW5nX2ZpbGVzXy5zaXplKCkgLSAxKSB7CisgICAgQWRkRXJyb3IodGFibGVzXy0+cGVuZGluZ19maWxlc19bZnJvbV9oZXJlICsgMV0sIHByb3RvLAorICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6SU1QT1JULCBlcnJvcl9tZXNzYWdlKTsKKyAgfSBlbHNlIHsKKyAgICBBZGRFcnJvcihwcm90by5uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OklNUE9SVCwKKyAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlKTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpBZGRUd2ljZUxpc3RlZEVycm9yKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKKyAgQWRkRXJyb3IocHJvdG8uZGVwZW5kZW5jeShpbmRleCksIHByb3RvLAorICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OklNUE9SVCwKKyAgICAgICAgICAgIkltcG9ydCBcIiIgKyBwcm90by5kZXBlbmRlbmN5KGluZGV4KSArICJcIiB3YXMgbGlzdGVkIHR3aWNlLiIpOworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpBZGRJbXBvcnRFcnJvcihjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICBzdGQ6OnN0cmluZyBtZXNzYWdlOworICBpZiAocG9vbF8tPmZhbGxiYWNrX2RhdGFiYXNlXyA9PSBudWxscHRyKSB7CisgICAgbWVzc2FnZSA9ICJJbXBvcnQgXCIiICsgcHJvdG8uZGVwZW5kZW5jeShpbmRleCkgKyAiXCIgaGFzIG5vdCBiZWVuIGxvYWRlZC4iOworICB9IGVsc2UgeworICAgIG1lc3NhZ2UgPSAiSW1wb3J0IFwiIiArIHByb3RvLmRlcGVuZGVuY3koaW5kZXgpICsKKyAgICAgICAgICAgICAgIlwiIHdhcyBub3QgZm91bmQgb3IgaGFkIGVycm9ycy4iOworICB9CisgIEFkZEVycm9yKHByb3RvLmRlcGVuZGVuY3koaW5kZXgpLCBwcm90bywKKyAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpJTVBPUlQsIG1lc3NhZ2UpOworfQorCitzdGF0aWMgYm9vbCBFeGlzdGluZ0ZpbGVNYXRjaGVzUHJvdG8oY29uc3QgRmlsZURlc2NyaXB0b3IqIGV4aXN0aW5nX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBleGlzdGluZ19wcm90bzsKKyAgZXhpc3RpbmdfZmlsZS0+Q29weVRvKCZleGlzdGluZ19wcm90byk7CisgIC8vIFRPRE8obGl1amlzaSk6IFJlbW92ZSBpdCB3aGVuIENvcHlUbyBzdXBwb3J0cyBjb3B5aW5nIHN5bnRheCBwYXJhbXMgd2hlbgorICAvLyBzeW50YXg9InByb3RvMiIuCisgIGlmIChleGlzdGluZ19maWxlLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMiAmJgorICAgICAgcHJvdG8uaGFzX3N5bnRheCgpKSB7CisgICAgZXhpc3RpbmdfcHJvdG8uc2V0X3N5bnRheCgKKyAgICAgICAgZXhpc3RpbmdfZmlsZS0+U3ludGF4TmFtZShleGlzdGluZ19maWxlLT5zeW50YXgoKSkpOworICB9CisKKyAgcmV0dXJuIGV4aXN0aW5nX3Byb3RvLlNlcmlhbGl6ZUFzU3RyaW5nKCkgPT0gcHJvdG8uU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworLy8gVGhlc2UgUGxhbkFsbG9jYXRpb25TaXplIGZ1bmN0aW9ucyB3aWxsIGdhdGhlciBpbnRvIHRoZSBGbGF0QWxsb2NhdG9yIGFsbCB0aGUKKy8vIG5lY2Vzc2FyeSBtZW1vcnkgYWxsb2NhdGlvbnMgdGhhdCBCdWlsZFhYWCBmdW5jdGlvbnMgYmVsb3cgd2lsbCBkbyBvbiB0aGUKKy8vIFRhYmxlcyBvYmplY3QuCisvLyBUaGV5ICptdXN0KiBiZSBrZXB0IGluIHN5bmMuIElmIHdlIG1pc3Mgc29tZSBQbGFuQXJyYXkgY2FsbCB3ZSB3b24ndCBoYXZlCisvLyBlbm91Z2ggbWVtb3J5IGFuZCB3aWxsIEdPT0dMRV9DSEVDSy1mYWlsLgorc3RhdGljIHZvaWQgUGxhbkFsbG9jYXRpb25TaXplKAorICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8RW51bVZhbHVlRGVzY3JpcHRvclByb3RvPiYgdmFsdWVzLAorICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYykgeworICBhbGxvYy5QbGFuQXJyYXk8RW51bVZhbHVlRGVzY3JpcHRvcj4odmFsdWVzLnNpemUoKSk7CisgIGFsbG9jLlBsYW5BcnJheTxzdGQ6OnN0cmluZz4oMiAqIHZhbHVlcy5zaXplKCkpOyAgLy8gbmFtZSArIGZ1bGxfbmFtZQorICBmb3IgKGNvbnN0IGF1dG8mIHYgOiB2YWx1ZXMpIHsKKyAgICBpZiAodi5oYXNfb3B0aW9ucygpKSBhbGxvYy5QbGFuQXJyYXk8RW51bVZhbHVlT3B0aW9ucz4oMSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgUGxhbkFsbG9jYXRpb25TaXplKAorICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8RW51bURlc2NyaXB0b3JQcm90bz4mIGVudW1zLAorICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYykgeworICBhbGxvYy5QbGFuQXJyYXk8RW51bURlc2NyaXB0b3I+KGVudW1zLnNpemUoKSk7CisgIGFsbG9jLlBsYW5BcnJheTxzdGQ6OnN0cmluZz4oMiAqIGVudW1zLnNpemUoKSk7ICAvLyBuYW1lICsgZnVsbF9uYW1lCisgIGZvciAoY29uc3QgYXV0byYgZSA6IGVudW1zKSB7CisgICAgaWYgKGUuaGFzX29wdGlvbnMoKSkgYWxsb2MuUGxhbkFycmF5PEVudW1PcHRpb25zPigxKTsKKyAgICBQbGFuQWxsb2NhdGlvblNpemUoZS52YWx1ZSgpLCBhbGxvYyk7CisgICAgYWxsb2MuUGxhbkFycmF5PEVudW1EZXNjcmlwdG9yOjpSZXNlcnZlZFJhbmdlPihlLnJlc2VydmVkX3JhbmdlX3NpemUoKSk7CisgICAgYWxsb2MuUGxhbkFycmF5PGNvbnN0IHN0ZDo6c3RyaW5nKj4oZS5yZXNlcnZlZF9uYW1lX3NpemUoKSk7CisgICAgYWxsb2MuUGxhbkFycmF5PHN0ZDo6c3RyaW5nPihlLnJlc2VydmVkX25hbWVfc2l6ZSgpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBQbGFuQWxsb2NhdGlvblNpemUoCisgICAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxPbmVvZkRlc2NyaXB0b3JQcm90bz4mIG9uZW9mcywKKyAgICBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpIHsKKyAgYWxsb2MuUGxhbkFycmF5PE9uZW9mRGVzY3JpcHRvcj4ob25lb2ZzLnNpemUoKSk7CisgIGFsbG9jLlBsYW5BcnJheTxzdGQ6OnN0cmluZz4oMiAqIG9uZW9mcy5zaXplKCkpOyAgLy8gbmFtZSArIGZ1bGxfbmFtZQorICBmb3IgKGNvbnN0IGF1dG8mIG9uZW9mIDogb25lb2ZzKSB7CisgICAgaWYgKG9uZW9mLmhhc19vcHRpb25zKCkpIGFsbG9jLlBsYW5BcnJheTxPbmVvZk9wdGlvbnM+KDEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFBsYW5BbGxvY2F0aW9uU2l6ZSgKKyAgICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPEZpZWxkRGVzY3JpcHRvclByb3RvPiYgZmllbGRzLAorICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYykgeworICBhbGxvYy5QbGFuQXJyYXk8RmllbGREZXNjcmlwdG9yPihmaWVsZHMuc2l6ZSgpKTsKKyAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IGZpZWxkcykgeworICAgIGlmIChmaWVsZC5oYXNfb3B0aW9ucygpKSBhbGxvYy5QbGFuQXJyYXk8RmllbGRPcHRpb25zPigxKTsKKyAgICBhbGxvYy5QbGFuRmllbGROYW1lcyhmaWVsZC5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGFzX2pzb25fbmFtZSgpID8gJmZpZWxkLmpzb25fbmFtZSgpIDogbnVsbHB0cik7CisgICAgaWYgKGZpZWxkLmhhc19kZWZhdWx0X3ZhbHVlKCkgJiYgZmllbGQuaGFzX3R5cGUoKSAmJgorICAgICAgICAoZmllbGQudHlwZSgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORyB8fAorICAgICAgICAgZmllbGQudHlwZSgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0JZVEVTKSkgeworICAgICAgLy8gRm9yIHRoZSBkZWZhdWx0IHN0cmluZyB2YWx1ZS4KKyAgICAgIGFsbG9jLlBsYW5BcnJheTxzdGQ6OnN0cmluZz4oMSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFBsYW5BbGxvY2F0aW9uU2l6ZSgKKyAgICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2U+JiByYW5nZXMsCisgICAgaW50ZXJuYWw6OkZsYXRBbGxvY2F0b3ImIGFsbG9jKSB7CisgIGFsbG9jLlBsYW5BcnJheTxEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZT4ocmFuZ2VzLnNpemUoKSk7CisgIGZvciAoY29uc3QgYXV0byYgciA6IHJhbmdlcykgeworICAgIGlmIChyLmhhc19vcHRpb25zKCkpIGFsbG9jLlBsYW5BcnJheTxFeHRlbnNpb25SYW5nZU9wdGlvbnM+KDEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFBsYW5BbGxvY2F0aW9uU2l6ZSgKKyAgICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz4mIG1lc3NhZ2VzLAorICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYykgeworICBhbGxvYy5QbGFuQXJyYXk8RGVzY3JpcHRvcj4obWVzc2FnZXMuc2l6ZSgpKTsKKyAgYWxsb2MuUGxhbkFycmF5PHN0ZDo6c3RyaW5nPigyICogbWVzc2FnZXMuc2l6ZSgpKTsgIC8vIG5hbWUgKyBmdWxsX25hbWUKKworICBmb3IgKGNvbnN0IGF1dG8mIG1lc3NhZ2UgOiBtZXNzYWdlcykgeworICAgIGlmIChtZXNzYWdlLmhhc19vcHRpb25zKCkpIGFsbG9jLlBsYW5BcnJheTxNZXNzYWdlT3B0aW9ucz4oMSk7CisgICAgUGxhbkFsbG9jYXRpb25TaXplKG1lc3NhZ2UubmVzdGVkX3R5cGUoKSwgYWxsb2MpOworICAgIFBsYW5BbGxvY2F0aW9uU2l6ZShtZXNzYWdlLmZpZWxkKCksIGFsbG9jKTsKKyAgICBQbGFuQWxsb2NhdGlvblNpemUobWVzc2FnZS5leHRlbnNpb24oKSwgYWxsb2MpOworICAgIFBsYW5BbGxvY2F0aW9uU2l6ZShtZXNzYWdlLmV4dGVuc2lvbl9yYW5nZSgpLCBhbGxvYyk7CisgICAgYWxsb2MuUGxhbkFycmF5PERlc2NyaXB0b3I6OlJlc2VydmVkUmFuZ2U+KG1lc3NhZ2UucmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpKTsKKyAgICBhbGxvYy5QbGFuQXJyYXk8Y29uc3Qgc3RkOjpzdHJpbmcqPihtZXNzYWdlLnJlc2VydmVkX25hbWVfc2l6ZSgpKTsKKyAgICBhbGxvYy5QbGFuQXJyYXk8c3RkOjpzdHJpbmc+KG1lc3NhZ2UucmVzZXJ2ZWRfbmFtZV9zaXplKCkpOworICAgIFBsYW5BbGxvY2F0aW9uU2l6ZShtZXNzYWdlLmVudW1fdHlwZSgpLCBhbGxvYyk7CisgICAgUGxhbkFsbG9jYXRpb25TaXplKG1lc3NhZ2Uub25lb2ZfZGVjbCgpLCBhbGxvYyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgUGxhbkFsbG9jYXRpb25TaXplKAorICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8TWV0aG9kRGVzY3JpcHRvclByb3RvPiYgbWV0aG9kcywKKyAgICBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpIHsKKyAgYWxsb2MuUGxhbkFycmF5PE1ldGhvZERlc2NyaXB0b3I+KG1ldGhvZHMuc2l6ZSgpKTsKKyAgYWxsb2MuUGxhbkFycmF5PHN0ZDo6c3RyaW5nPigyICogbWV0aG9kcy5zaXplKCkpOyAgLy8gbmFtZSArIGZ1bGxfbmFtZQorICBmb3IgKGNvbnN0IGF1dG8mIG0gOiBtZXRob2RzKSB7CisgICAgaWYgKG0uaGFzX29wdGlvbnMoKSkgYWxsb2MuUGxhbkFycmF5PE1ldGhvZE9wdGlvbnM+KDEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFBsYW5BbGxvY2F0aW9uU2l6ZSgKKyAgICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8+JiBzZXJ2aWNlcywKKyAgICBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpIHsKKyAgYWxsb2MuUGxhbkFycmF5PFNlcnZpY2VEZXNjcmlwdG9yPihzZXJ2aWNlcy5zaXplKCkpOworICBhbGxvYy5QbGFuQXJyYXk8c3RkOjpzdHJpbmc+KDIgKiBzZXJ2aWNlcy5zaXplKCkpOyAgLy8gbmFtZSArIGZ1bGxfbmFtZQorICBmb3IgKGNvbnN0IGF1dG8mIHNlcnZpY2UgOiBzZXJ2aWNlcykgeworICAgIGlmIChzZXJ2aWNlLmhhc19vcHRpb25zKCkpIGFsbG9jLlBsYW5BcnJheTxTZXJ2aWNlT3B0aW9ucz4oMSk7CisgICAgUGxhbkFsbG9jYXRpb25TaXplKHNlcnZpY2UubWV0aG9kKCksIGFsbG9jKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBQbGFuQWxsb2NhdGlvblNpemUoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OkZsYXRBbGxvY2F0b3ImIGFsbG9jKSB7CisgIGFsbG9jLlBsYW5BcnJheTxGaWxlRGVzY3JpcHRvcj4oMSk7CisgIGFsbG9jLlBsYW5BcnJheTxGaWxlRGVzY3JpcHRvclRhYmxlcz4oMSk7CisgIGFsbG9jLlBsYW5BcnJheTxzdGQ6OnN0cmluZz4oMik7ICAvLyBuYW1lICsgcGFja2FnZQorICBpZiAocHJvdG8uaGFzX29wdGlvbnMoKSkgYWxsb2MuUGxhbkFycmF5PEZpbGVPcHRpb25zPigxKTsKKyAgaWYgKHByb3RvLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpIGFsbG9jLlBsYW5BcnJheTxTb3VyY2VDb2RlSW5mbz4oMSk7CisKKyAgUGxhbkFsbG9jYXRpb25TaXplKHByb3RvLnNlcnZpY2UoKSwgYWxsb2MpOworICBQbGFuQWxsb2NhdGlvblNpemUocHJvdG8ubWVzc2FnZV90eXBlKCksIGFsbG9jKTsKKyAgUGxhbkFsbG9jYXRpb25TaXplKHByb3RvLmVudW1fdHlwZSgpLCBhbGxvYyk7CisgIFBsYW5BbGxvY2F0aW9uU2l6ZShwcm90by5leHRlbnNpb24oKSwgYWxsb2MpOworCisgIGFsbG9jLlBsYW5BcnJheTxpbnQ+KHByb3RvLndlYWtfZGVwZW5kZW5jeV9zaXplKCkpOworICBhbGxvYy5QbGFuQXJyYXk8aW50Pihwcm90by5wdWJsaWNfZGVwZW5kZW5jeV9zaXplKCkpOworICBhbGxvYy5QbGFuQXJyYXk8Y29uc3QgRmlsZURlc2NyaXB0b3IqPihwcm90by5kZXBlbmRlbmN5X3NpemUoKSk7Cit9CisKK2NvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRGaWxlKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIGZpbGVuYW1lXyA9IHByb3RvLm5hbWUoKTsKKworICAvLyBDaGVjayBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgYmVpbmcgYnVpbHQuCisgIC8vIE5vdGU6ICBUaGlzIG9ubHkgd29ya3MgaWYgdGhlIGlucHV0IGlzIGNhbm9uaWNhbCAtLSB0aGF0IGlzLCBpdAorICAvLyAgIGZ1bGx5LXF1YWxpZmllcyBhbGwgdHlwZSBuYW1lcywgaGFzIG5vIFVuaW50ZXJwcmV0ZWRPcHRpb25zLCBldGMuCisgIC8vICAgVGhpcyBpcyBmaW5lLCBiZWNhdXNlIHRoaXMgaWRlbXBvdGVuY3kgImZlYXR1cmUiIHJlYWxseSBvbmx5IGV4aXN0cyB0bworICAvLyAgIGFjY29tbW9kYXRlIG9uZSBoYWNrIGluIHRoZSBwcm90bzEtPnByb3RvMiBtaWdyYXRpb24gbGF5ZXIuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBleGlzdGluZ19maWxlID0gdGFibGVzXy0+RmluZEZpbGUoZmlsZW5hbWVfKTsKKyAgaWYgKGV4aXN0aW5nX2ZpbGUgIT0gbnVsbHB0cikgeworICAgIC8vIEZpbGUgYWxyZWFkeSBpbiBwb29sLiAgQ29tcGFyZSB0aGUgZXhpc3Rpbmcgb25lIHRvIHRoZSBpbnB1dC4KKyAgICBpZiAoRXhpc3RpbmdGaWxlTWF0Y2hlc1Byb3RvKGV4aXN0aW5nX2ZpbGUsIHByb3RvKSkgeworICAgICAgLy8gVGhleSdyZSBpZGVudGljYWwuICBSZXR1cm4gdGhlIGV4aXN0aW5nIGRlc2NyaXB0b3IuCisgICAgICByZXR1cm4gZXhpc3RpbmdfZmlsZTsKKyAgICB9CisKKyAgICAvLyBOb3QgYSBtYXRjaC4gIFRoZSBlcnJvciB3aWxsIGJlIGRldGVjdGVkIGFuZCBoYW5kbGVkIGxhdGVyLgorICB9CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgZmlsZSBpcyBhbHJlYWR5IG9uIHRoZSBwZW5kaW5nIGZpbGVzIGxpc3QuCisgIC8vIFRPRE8oa2VudG9uKTogIEFsbG93IHJlY3Vyc2l2ZSBpbXBvcnRzPyAgSXQgbWF5IG5vdCB3b3JrIHdpdGggc29tZQorICAvLyAgIChtb3N0PykgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiAgRS5nLiwgaW4gQysrLCBhIGZvcndhcmQgZGVjbGFyYXRpb24KKyAgLy8gICBvZiBhIHR5cGUgaXMgbm90IHN1ZmZpY2llbnQgdG8gYWxsb3cgaXQgdG8gYmUgdXNlZCBldmVuIGluIGEKKyAgLy8gICBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUgZHVlIHRvIGlubGluaW5nLiAgVGhpcyBjb3VsZCBwZXJoYXBzIGJlCisgIC8vICAgd29ya2VkIGFyb3VuZCB1c2luZyB0cmlja3MgaW52b2x2aW5nIGluc2VydGluZyAjaW5jbHVkZSBzdGF0ZW1lbnRzCisgIC8vICAgbWlkLWZpbGUsIGJ1dCB0aGF0J3MgcHJldHR5IHVnbHksIGFuZCBJJ20gcHJldHR5IHN1cmUgdGhlcmUgYXJlCisgIC8vICAgc29tZSBsYW5ndWFnZXMgb3V0IHRoZXJlIHRoYXQgZG8gbm90IGFsbG93IHJlY3Vyc2l2ZSBkZXBlbmRlbmNpZXMKKyAgLy8gICBhdCBhbGwuCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFibGVzXy0+cGVuZGluZ19maWxlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAodGFibGVzXy0+cGVuZGluZ19maWxlc19baV0gPT0gcHJvdG8ubmFtZSgpKSB7CisgICAgICBBZGRSZWN1cnNpdmVJbXBvcnRFcnJvcihwcm90bywgaSk7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY29uc3QgaW50IGtNYXhpbXVtUGFja2FnZUxlbmd0aCA9IDUxMTsKKyAgaWYgKHByb3RvLnBhY2thZ2UoKS5zaXplKCkgPiBrTWF4aW11bVBhY2thZ2VMZW5ndGgpIHsKKyAgICBBZGRFcnJvcihwcm90by5wYWNrYWdlKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgIlBhY2thZ2UgbmFtZSBpcyB0b28gbG9uZyIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gSWYgd2UgaGF2ZSBhIGZhbGxiYWNrX2RhdGFiYXNlXywgYW5kIHdlIGFyZW4ndCBkb2luZyBsYXp5IGltcG9ydCBidWlsZGluZywKKyAgLy8gYXR0ZW1wdCB0byBsb2FkIGFsbCBkZXBlbmRlbmNpZXMgbm93LCBiZWZvcmUgY2hlY2twb2ludGluZyB0YWJsZXNfLiAgVGhpcworICAvLyBhdm9pZHMgY29uZnVzaW9uIHdpdGggcmVjdXJzaXZlIGNoZWNrcG9pbnRzLgorICBpZiAoIXBvb2xfLT5sYXppbHlfYnVpbGRfZGVwZW5kZW5jaWVzXykgeworICAgIGlmIChwb29sXy0+ZmFsbGJhY2tfZGF0YWJhc2VfICE9IG51bGxwdHIpIHsKKyAgICAgIHRhYmxlc18tPnBlbmRpbmdfZmlsZXNfLnB1c2hfYmFjayhwcm90by5uYW1lKCkpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7CisgICAgICAgIGlmICh0YWJsZXNfLT5GaW5kRmlsZShwcm90by5kZXBlbmRlbmN5KGkpKSA9PSBudWxscHRyICYmCisgICAgICAgICAgICAocG9vbF8tPnVuZGVybGF5XyA9PSBudWxscHRyIHx8CisgICAgICAgICAgICAgcG9vbF8tPnVuZGVybGF5Xy0+RmluZEZpbGVCeU5hbWUocHJvdG8uZGVwZW5kZW5jeShpKSkgPT0KKyAgICAgICAgICAgICAgICAgbnVsbHB0cikpIHsKKyAgICAgICAgICAvLyBXZSBkb24ndCBjYXJlIHdoYXQgdGhpcyByZXR1cm5zIHNpbmNlIHdlJ2xsIGZpbmQgb3V0IGJlbG93IGFueXdheS4KKyAgICAgICAgICBwb29sXy0+VHJ5RmluZEZpbGVJbkZhbGxiYWNrRGF0YWJhc2UocHJvdG8uZGVwZW5kZW5jeShpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRhYmxlc18tPnBlbmRpbmdfZmlsZXNfLnBvcF9iYWNrKCk7CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2twb2ludCB0aGUgdGFibGVzIHNvIHRoYXQgd2UgY2FuIHJvbGwgYmFjayBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAgdGFibGVzXy0+QWRkQ2hlY2twb2ludCgpOworCisgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yIGFsbG9jOworICBQbGFuQWxsb2NhdGlvblNpemUocHJvdG8sIGFsbG9jKTsKKyAgYWxsb2MuRmluYWxpemVQbGFubmluZyh0YWJsZXNfKTsKKyAgRmlsZURlc2NyaXB0b3IqIHJlc3VsdCA9IEJ1aWxkRmlsZUltcGwocHJvdG8sIGFsbG9jKTsKKworICBmaWxlX3RhYmxlc18tPkZpbmFsaXplVGFibGVzKCk7CisgIGlmIChyZXN1bHQpIHsKKyAgICB0YWJsZXNfLT5DbGVhckxhc3RDaGVja3BvaW50KCk7CisgICAgcmVzdWx0LT5maW5pc2hlZF9idWlsZGluZ18gPSB0cnVlOworICAgIGFsbG9jLkV4cGVjdENvbnN1bWVkKCk7CisgIH0gZWxzZSB7CisgICAgdGFibGVzXy0+Um9sbGJhY2tUb0xhc3RDaGVja3BvaW50KCk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitGaWxlRGVzY3JpcHRvciogRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkRmlsZUltcGwoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYykgeworICBGaWxlRGVzY3JpcHRvciogcmVzdWx0ID0gYWxsb2MuQWxsb2NhdGVBcnJheTxGaWxlRGVzY3JpcHRvcj4oMSk7CisgIGZpbGVfID0gcmVzdWx0OworCisgIHJlc3VsdC0+aXNfcGxhY2Vob2xkZXJfID0gZmFsc2U7CisgIHJlc3VsdC0+ZmluaXNoZWRfYnVpbGRpbmdfID0gZmFsc2U7CisgIFNvdXJjZUNvZGVJbmZvKiBpbmZvID0gbnVsbHB0cjsKKyAgaWYgKHByb3RvLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpIHsKKyAgICBpbmZvID0gYWxsb2MuQWxsb2NhdGVBcnJheTxTb3VyY2VDb2RlSW5mbz4oMSk7CisgICAgaW5mby0+Q29weUZyb20ocHJvdG8uc291cmNlX2NvZGVfaW5mbygpKTsKKyAgICByZXN1bHQtPnNvdXJjZV9jb2RlX2luZm9fID0gaW5mbzsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQtPnNvdXJjZV9jb2RlX2luZm9fID0gJlNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKworICBmaWxlX3RhYmxlc18gPSBhbGxvYy5BbGxvY2F0ZUFycmF5PEZpbGVEZXNjcmlwdG9yVGFibGVzPigxKTsKKyAgZmlsZV8tPnRhYmxlc18gPSBmaWxlX3RhYmxlc187CisKKyAgaWYgKCFwcm90by5oYXNfbmFtZSgpKSB7CisgICAgQWRkRXJyb3IoIiIsIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAorICAgICAgICAgICAgICJNaXNzaW5nIGZpZWxkOiBGaWxlRGVzY3JpcHRvclByb3RvLm5hbWUuIik7CisgIH0KKworICAvLyBUT0RPKGxpdWppc2kpOiBSZXBvcnQgZXJyb3Igd2hlbiB0aGUgc3ludGF4IGlzIGVtcHR5IGFmdGVyIGFsbCB0aGUgcHJvdG9zCisgIC8vIGhhdmUgYWRkZWQgdGhlIHN5bnRheCBzdGF0ZW1lbnQuCisgIGlmIChwcm90by5zeW50YXgoKS5lbXB0eSgpIHx8IHByb3RvLnN5bnRheCgpID09ICJwcm90bzIiKSB7CisgICAgZmlsZV8tPnN5bnRheF8gPSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMjsKKyAgfSBlbHNlIGlmIChwcm90by5zeW50YXgoKSA9PSAicHJvdG8zIikgeworICAgIGZpbGVfLT5zeW50YXhfID0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzM7CisgIH0gZWxzZSB7CisgICAgZmlsZV8tPnN5bnRheF8gPSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1VOS05PV047CisgICAgQWRkRXJyb3IocHJvdG8ubmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKKyAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIHN5bnRheDogIiArIHByb3RvLnN5bnRheCgpKTsKKyAgfQorCisgIHJlc3VsdC0+bmFtZV8gPSBhbGxvYy5BbGxvY2F0ZVN0cmluZ3MocHJvdG8ubmFtZSgpKTsKKyAgaWYgKHByb3RvLmhhc19wYWNrYWdlKCkpIHsKKyAgICByZXN1bHQtPnBhY2thZ2VfID0gYWxsb2MuQWxsb2NhdGVTdHJpbmdzKHByb3RvLnBhY2thZ2UoKSk7CisgIH0gZWxzZSB7CisgICAgLy8gV2UgY2Fubm90IHJlbHkgb24gcHJvdG8ucGFja2FnZSgpIHJldHVybmluZyBhIHZhbGlkIHN0cmluZyBpZgorICAgIC8vIHByb3RvLmhhc19wYWNrYWdlKCkgaXMgZmFsc2UsIGJlY2F1c2Ugd2UgbWlnaHQgYmUgcnVubmluZyBhdCBzdGF0aWMKKyAgICAvLyBpbml0aWFsaXphdGlvbiB0aW1lLCBpbiB3aGljaCBjYXNlIGRlZmF1bHQgdmFsdWVzIGhhdmUgbm90IHlldCBiZWVuCisgICAgLy8gaW5pdGlhbGl6ZWQuCisgICAgcmVzdWx0LT5wYWNrYWdlXyA9IGFsbG9jLkFsbG9jYXRlU3RyaW5ncygiIik7CisgIH0KKyAgcmVzdWx0LT5wb29sXyA9IHBvb2xfOworCisgIGlmIChyZXN1bHQtPm5hbWUoKS5maW5kKCdcMCcpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgQWRkRXJyb3IocmVzdWx0LT5uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgIlwiIiArIHJlc3VsdC0+bmFtZSgpICsgIlwiIGNvbnRhaW5zIG51bGwgY2hhcmFjdGVyLiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gQWRkIHRvIHRhYmxlcy4KKyAgaWYgKCF0YWJsZXNfLT5BZGRGaWxlKHJlc3VsdCkpIHsKKyAgICBBZGRFcnJvcihwcm90by5uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAorICAgICAgICAgICAgICJBIGZpbGUgd2l0aCB0aGlzIG5hbWUgaXMgYWxyZWFkeSBpbiB0aGUgcG9vbC4iKTsKKyAgICAvLyBCYWlsIG91dCBlYXJseSBzbyB0aGF0IGlmIHRoaXMgaXMgYWN0dWFsbHkgdGhlIGV4YWN0IHNhbWUgZmlsZSwgd2UKKyAgICAvLyBkb24ndCBlbmQgdXAgcmVwb3J0aW5nIHRoYXQgZXZlcnkgc2luZ2xlIHN5bWJvbCBpcyBhbHJlYWR5IGRlZmluZWQuCisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKCFyZXN1bHQtPnBhY2thZ2UoKS5lbXB0eSgpKSB7CisgICAgaWYgKHN0ZDo6Y291bnQocmVzdWx0LT5wYWNrYWdlKCkuYmVnaW4oKSwgcmVzdWx0LT5wYWNrYWdlKCkuZW5kKCksICcuJykgPgorICAgICAgICBrUGFja2FnZUxpbWl0KSB7CisgICAgICBBZGRFcnJvcihyZXN1bHQtPnBhY2thZ2UoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICJFeGNlZWRzIE1heGltdW0gUGFja2FnZSBEZXB0aCIpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIEFkZFBhY2thZ2UocmVzdWx0LT5wYWNrYWdlKCksIHByb3RvLCByZXN1bHQpOworICB9CisKKyAgLy8gTWFrZSBzdXJlIGFsbCBkZXBlbmRlbmNpZXMgYXJlIGxvYWRlZC4KKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHNlZW5fZGVwZW5kZW5jaWVzOworICByZXN1bHQtPmRlcGVuZGVuY3lfY291bnRfID0gcHJvdG8uZGVwZW5kZW5jeV9zaXplKCk7CisgIHJlc3VsdC0+ZGVwZW5kZW5jaWVzXyA9CisgICAgICBhbGxvYy5BbGxvY2F0ZUFycmF5PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4ocHJvdG8uZGVwZW5kZW5jeV9zaXplKCkpOworICByZXN1bHQtPmRlcGVuZGVuY2llc19vbmNlXyA9IG51bGxwdHI7CisgIHVudXNlZF9kZXBlbmRlbmN5Xy5jbGVhcigpOworICBzdGQ6OnNldDxpbnQ+IHdlYWtfZGVwczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by53ZWFrX2RlcGVuZGVuY3lfc2l6ZSgpOyArK2kpIHsKKyAgICB3ZWFrX2RlcHMuaW5zZXJ0KHByb3RvLndlYWtfZGVwZW5kZW5jeShpKSk7CisgIH0KKworICBib29sIG5lZWRfbGF6eV9kZXBzID0gZmFsc2U7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgeworICAgIGlmICghc2Vlbl9kZXBlbmRlbmNpZXMuaW5zZXJ0KHByb3RvLmRlcGVuZGVuY3koaSkpLnNlY29uZCkgeworICAgICAgQWRkVHdpY2VMaXN0ZWRFcnJvcihwcm90bywgaSk7CisgICAgfQorCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlcGVuZGVuY3kgPSB0YWJsZXNfLT5GaW5kRmlsZShwcm90by5kZXBlbmRlbmN5KGkpKTsKKyAgICBpZiAoZGVwZW5kZW5jeSA9PSBudWxscHRyICYmIHBvb2xfLT51bmRlcmxheV8gIT0gbnVsbHB0cikgeworICAgICAgZGVwZW5kZW5jeSA9IHBvb2xfLT51bmRlcmxheV8tPkZpbmRGaWxlQnlOYW1lKHByb3RvLmRlcGVuZGVuY3koaSkpOworICAgIH0KKworICAgIGlmIChkZXBlbmRlbmN5ID09IHJlc3VsdCkgeworICAgICAgLy8gUmVjdXJzaXZlIGltcG9ydC4gIGRlcGVuZGVuY3kvcmVzdWx0IGlzIG5vdCBmdWxseSBpbml0aWFsaXplZCwgYW5kIGl0J3MKKyAgICAgIC8vIGRhbmdlcm91cyB0byB0cnkgdG8gZG8gYW55dGhpbmcgd2l0aCBpdC4gIFRoZSByZWN1cnNpdmUgaW1wb3J0IGVycm9yCisgICAgICAvLyB3aWxsIGJlIGRldGVjdGVkIGFuZCByZXBvcnRlZCBpbiBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRGaWxlKCkuCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAoZGVwZW5kZW5jeSA9PSBudWxscHRyKSB7CisgICAgICBpZiAoIXBvb2xfLT5sYXppbHlfYnVpbGRfZGVwZW5kZW5jaWVzXykgeworICAgICAgICBpZiAocG9vbF8tPmFsbG93X3Vua25vd25fIHx8CisgICAgICAgICAgICAoIXBvb2xfLT5lbmZvcmNlX3dlYWtfICYmIHdlYWtfZGVwcy5maW5kKGkpICE9IHdlYWtfZGVwcy5lbmQoKSkpIHsKKyAgICAgICAgICBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciBsYXp5X2RlcF9hbGxvYzsKKyAgICAgICAgICBsYXp5X2RlcF9hbGxvYy5QbGFuQXJyYXk8RmlsZURlc2NyaXB0b3I+KDEpOworICAgICAgICAgIGxhenlfZGVwX2FsbG9jLlBsYW5BcnJheTxzdGQ6OnN0cmluZz4oMSk7CisgICAgICAgICAgbGF6eV9kZXBfYWxsb2MuRmluYWxpemVQbGFubmluZyh0YWJsZXNfKTsKKyAgICAgICAgICBkZXBlbmRlbmN5ID0gcG9vbF8tPk5ld1BsYWNlaG9sZGVyRmlsZVdpdGhNdXRleEhlbGQoCisgICAgICAgICAgICAgIHByb3RvLmRlcGVuZGVuY3koaSksIGxhenlfZGVwX2FsbG9jKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBBZGRJbXBvcnRFcnJvcihwcm90bywgaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gQWRkIHRvIHVudXNlZF9kZXBlbmRlbmN5XyB0byB0cmFjayB1bnVzZWQgaW1wb3J0ZWQgZmlsZXMuCisgICAgICAvLyBOb3RlOiBkbyBub3QgdHJhY2sgdW51c2VkIGltcG9ydGVkIGZpbGVzIGZvciBwdWJsaWMgaW1wb3J0LgorICAgICAgaWYgKHBvb2xfLT5lbmZvcmNlX2RlcGVuZGVuY2llc18gJiYKKyAgICAgICAgICAocG9vbF8tPnVudXNlZF9pbXBvcnRfdHJhY2tfZmlsZXNfLmZpbmQocHJvdG8ubmFtZSgpKSAhPQorICAgICAgICAgICBwb29sXy0+dW51c2VkX2ltcG9ydF90cmFja19maWxlc18uZW5kKCkpICYmCisgICAgICAgICAgKGRlcGVuZGVuY3ktPnB1YmxpY19kZXBlbmRlbmN5X2NvdW50KCkgPT0gMCkpIHsKKyAgICAgICAgdW51c2VkX2RlcGVuZGVuY3lfLmluc2VydChkZXBlbmRlbmN5KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQtPmRlcGVuZGVuY2llc19baV0gPSBkZXBlbmRlbmN5OworICAgIGlmIChwb29sXy0+bGF6aWx5X2J1aWxkX2RlcGVuZGVuY2llc18gJiYgIWRlcGVuZGVuY3kpIHsKKyAgICAgIG5lZWRfbGF6eV9kZXBzID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgaWYgKG5lZWRfbGF6eV9kZXBzKSB7CisgICAgaW50IHRvdGFsX2NoYXJfc2l6ZSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7CisgICAgICBpZiAocmVzdWx0LT5kZXBlbmRlbmNpZXNfW2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgdG90YWxfY2hhcl9zaXplICs9IHN0YXRpY19jYXN0PGludD4ocHJvdG8uZGVwZW5kZW5jeShpKS5zaXplKCkpOworICAgICAgfQorICAgICAgKyt0b3RhbF9jaGFyX3NpemU7ICAvLyBGb3IgTlVMIGNoYXIKKyAgICB9CisKKyAgICB2b2lkKiBkYXRhID0gdGFibGVzXy0+QWxsb2NhdGVCeXRlcygKKyAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoaW50ZXJuYWw6Om9uY2VfZmxhZykgKyB0b3RhbF9jaGFyX3NpemUpKTsKKyAgICByZXN1bHQtPmRlcGVuZGVuY2llc19vbmNlXyA9IDo6bmV3IChkYXRhKSBpbnRlcm5hbDo6b25jZV9mbGFne307CisgICAgY2hhciogbmFtZV9kYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocmVzdWx0LT5kZXBlbmRlbmNpZXNfb25jZV8gKyAxKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgeworICAgICAgaWYgKHJlc3VsdC0+ZGVwZW5kZW5jaWVzX1tpXSA9PSBudWxscHRyKSB7CisgICAgICAgIG1lbWNweShuYW1lX2RhdGEsIHByb3RvLmRlcGVuZGVuY3koaSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgIHByb3RvLmRlcGVuZGVuY3koaSkuc2l6ZSgpKTsKKyAgICAgICAgbmFtZV9kYXRhICs9IHByb3RvLmRlcGVuZGVuY3koaSkuc2l6ZSgpOworICAgICAgfQorICAgICAgKm5hbWVfZGF0YSsrID0gJ1wwJzsKKyAgICB9CisgIH0KKworICAvLyBDaGVjayBwdWJsaWMgZGVwZW5kZW5jaWVzLgorICBpbnQgcHVibGljX2RlcGVuZGVuY3lfY291bnQgPSAwOworICByZXN1bHQtPnB1YmxpY19kZXBlbmRlbmNpZXNfID0KKyAgICAgIGFsbG9jLkFsbG9jYXRlQXJyYXk8aW50Pihwcm90by5wdWJsaWNfZGVwZW5kZW5jeV9zaXplKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLnB1YmxpY19kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7CisgICAgLy8gT25seSBwdXQgdmFsaWQgcHVibGljIGRlcGVuZGVuY3kgaW5kZXhlcy4KKyAgICBpbnQgaW5kZXggPSBwcm90by5wdWJsaWNfZGVwZW5kZW5jeShpKTsKKyAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHByb3RvLmRlcGVuZGVuY3lfc2l6ZSgpKSB7CisgICAgICByZXN1bHQtPnB1YmxpY19kZXBlbmRlbmNpZXNfW3B1YmxpY19kZXBlbmRlbmN5X2NvdW50KytdID0gaW5kZXg7CisgICAgICAvLyBEbyBub3QgdHJhY2sgdW51c2VkIGltcG9ydGVkIGZpbGVzIGZvciBwdWJsaWMgaW1wb3J0LgorICAgICAgLy8gQ2FsbGluZyBkZXBlbmRlbmN5KGkpIGJ1aWxkcyB0aGF0IGZpbGUgd2hlbiBkb2luZyBsYXp5IGltcG9ydHMsCisgICAgICAvLyBuZWVkIHRvIGF2b2lkIGRvaW5nIHRoaXMuIFVudXNlZCBkZXBlbmRlbmN5IGRldGVjdGlvbiBpc24ndCBkb25lCisgICAgICAvLyB3aGVuIGJ1aWxkaW5nIGxhemlseSwgYW55d2F5cy4KKyAgICAgIGlmICghcG9vbF8tPmxhemlseV9idWlsZF9kZXBlbmRlbmNpZXNfKSB7CisgICAgICAgIHVudXNlZF9kZXBlbmRlbmN5Xy5lcmFzZShyZXN1bHQtPmRlcGVuZGVuY3koaW5kZXgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgQWRkRXJyb3IocHJvdG8ubmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIHB1YmxpYyBkZXBlbmRlbmN5IGluZGV4LiIpOworICAgIH0KKyAgfQorICByZXN1bHQtPnB1YmxpY19kZXBlbmRlbmN5X2NvdW50XyA9IHB1YmxpY19kZXBlbmRlbmN5X2NvdW50OworCisgIC8vIEJ1aWxkIGRlcGVuZGVuY3kgc2V0CisgIGRlcGVuZGVuY2llc18uY2xlYXIoKTsKKyAgLy8gV2UgZG9uJ3QvY2FuJ3QgZG8gcHJvcGVyIGRlcGVuZGVuY3kgZXJyb3IgY2hlY2tpbmcgd2hlbgorICAvLyBsYXppbHlfYnVpbGRfZGVwZW5kZW5jaWVzXywgYW5kIGNhbGxpbmcgZGVwZW5kZW5jeShpKSB3aWxsIGZvcmNlCisgIC8vIGEgZGVwZW5kZW5jeSB0byBiZSBidWlsdCwgd2hpY2ggd2UgZG9uJ3Qgd2FudC4KKyAgaWYgKCFwb29sXy0+bGF6aWx5X2J1aWxkX2RlcGVuZGVuY2llc18pIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICAgIFJlY29yZFB1YmxpY0RlcGVuZGVuY2llcyhyZXN1bHQtPmRlcGVuZGVuY3koaSkpOworICAgIH0KKyAgfQorCisgIC8vIENoZWNrIHdlYWsgZGVwZW5kZW5jaWVzLgorICBpbnQgd2Vha19kZXBlbmRlbmN5X2NvdW50ID0gMDsKKyAgcmVzdWx0LT53ZWFrX2RlcGVuZGVuY2llc18gPQorICAgICAgYWxsb2MuQWxsb2NhdGVBcnJheTxpbnQ+KHByb3RvLndlYWtfZGVwZW5kZW5jeV9zaXplKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLndlYWtfZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgeworICAgIGludCBpbmRleCA9IHByb3RvLndlYWtfZGVwZW5kZW5jeShpKTsKKyAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHByb3RvLmRlcGVuZGVuY3lfc2l6ZSgpKSB7CisgICAgICByZXN1bHQtPndlYWtfZGVwZW5kZW5jaWVzX1t3ZWFrX2RlcGVuZGVuY3lfY291bnQrK10gPSBpbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgQWRkRXJyb3IocHJvdG8ubmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIHdlYWsgZGVwZW5kZW5jeSBpbmRleC4iKTsKKyAgICB9CisgIH0KKyAgcmVzdWx0LT53ZWFrX2RlcGVuZGVuY3lfY291bnRfID0gd2Vha19kZXBlbmRlbmN5X2NvdW50OworCisgIC8vIENvbnZlcnQgY2hpbGRyZW4uCisgIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIG1lc3NhZ2VfdHlwZSwgQnVpbGRNZXNzYWdlLCBudWxscHRyKTsKKyAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgZW51bV90eXBlLCBCdWlsZEVudW0sIG51bGxwdHIpOworICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBzZXJ2aWNlLCBCdWlsZFNlcnZpY2UsIG51bGxwdHIpOworICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBleHRlbnNpb24sIEJ1aWxkRXh0ZW5zaW9uLCBudWxscHRyKTsKKworICAvLyBDb3B5IG9wdGlvbnMuCisgIHJlc3VsdC0+b3B0aW9uc18gPSBudWxscHRyOyAgLy8gU2V0IHRvIGRlZmF1bHRfaW5zdGFuY2UgbGF0ZXIgaWYgbmVjZXNzYXJ5LgorICBpZiAocHJvdG8uaGFzX29wdGlvbnMoKSkgeworICAgIEFsbG9jYXRlT3B0aW9ucyhwcm90by5vcHRpb25zKCksIHJlc3VsdCwgYWxsb2MpOworICB9CisKKyAgLy8gTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgc3RlcHMgbXVzdCBvY2N1ciBpbiBleGFjdGx5IHRoZSBzcGVjaWZpZWQgb3JkZXIuCisKKyAgLy8gQ3Jvc3MtbGluay4KKyAgQ3Jvc3NMaW5rRmlsZShyZXN1bHQsIHByb3RvKTsKKworICBpZiAoIW1lc3NhZ2VfaGludHNfLmVtcHR5KCkpIHsKKyAgICBTdWdnZXN0RmllbGROdW1iZXJzKHJlc3VsdCwgcHJvdG8pOworICB9CisKKyAgLy8gSW50ZXJwcmV0IGFueSByZW1haW5pbmcgdW5pbnRlcnByZXRlZCBvcHRpb25zIGdhdGhlcmVkIGludG8KKyAgLy8gb3B0aW9uc190b19pbnRlcnByZXRfIGR1cmluZyBkZXNjcmlwdG9yIGJ1aWxkaW5nLiAgQ3Jvc3MtbGlua2luZyBoYXMgbWFkZQorICAvLyBleHRlbnNpb24gb3B0aW9ucyBrbm93biwgc28gYWxsIGludGVycHJldGF0aW9ucyBzaG91bGQgbm93IHN1Y2NlZWQuCisgIGlmICghaGFkX2Vycm9yc18pIHsKKyAgICBPcHRpb25JbnRlcnByZXRlciBvcHRpb25faW50ZXJwcmV0ZXIodGhpcyk7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxPcHRpb25zVG9JbnRlcnByZXQ+OjppdGVyYXRvciBpdGVyID0KKyAgICAgICAgICAgICBvcHRpb25zX3RvX2ludGVycHJldF8uYmVnaW4oKTsKKyAgICAgICAgIGl0ZXIgIT0gb3B0aW9uc190b19pbnRlcnByZXRfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIG9wdGlvbl9pbnRlcnByZXRlci5JbnRlcnByZXRPcHRpb25zKCYoKml0ZXIpKTsKKyAgICB9CisgICAgb3B0aW9uc190b19pbnRlcnByZXRfLmNsZWFyKCk7CisgICAgaWYgKGluZm8gIT0gbnVsbHB0cikgeworICAgICAgb3B0aW9uX2ludGVycHJldGVyLlVwZGF0ZVNvdXJjZUNvZGVJbmZvKGluZm8pOworICAgIH0KKyAgfQorCisgIC8vIFZhbGlkYXRlIG9wdGlvbnMuIFNlZSBjb21tZW50cyBhdCBJbnRlcm5hbFNldExhemlseUJ1aWxkRGVwZW5kZW5jaWVzIGFib3V0CisgIC8vIGVycm9yIGNoZWNraW5nIGFuZCBsYXp5IGltcG9ydCBidWlsZGluZy4KKyAgaWYgKCFoYWRfZXJyb3JzXyAmJiAhcG9vbF8tPmxhemlseV9idWlsZF9kZXBlbmRlbmNpZXNfKSB7CisgICAgVmFsaWRhdGVGaWxlT3B0aW9ucyhyZXN1bHQsIHByb3RvKTsKKyAgfQorCisgIC8vIEFkZGl0aW9uYWwgbmFtaW5nIGNvbmZsaWN0IGNoZWNrIGZvciBtYXAgZW50cnkgdHlwZXMuIE9ubHkgbmVlZCB0byBjaGVjaworICAvLyB0aGlzIGlmIHRoZXJlIGFyZSBhbHJlYWR5IGVycm9ycy4KKyAgaWYgKGhhZF9lcnJvcnNfKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5tZXNzYWdlX3R5cGVfc2l6ZSgpOyArK2kpIHsKKyAgICAgIERldGVjdE1hcENvbmZsaWN0cyhyZXN1bHQtPm1lc3NhZ2VfdHlwZShpKSwgcHJvdG8ubWVzc2FnZV90eXBlKGkpKTsKKyAgICB9CisgIH0KKworCisgIC8vIEFnYWluLCBzZWUgY29tbWVudHMgYXQgSW50ZXJuYWxTZXRMYXppbHlCdWlsZERlcGVuZGVuY2llcyBhYm91dCBlcnJvcgorICAvLyBjaGVja2luZy4gQWxzbywgZG9uJ3QgbG9nIHVudXNlZCBkZXBlbmRlbmNpZXMgaWYgdGhlcmUgd2VyZSBwcmV2aW91cworICAvLyBlcnJvcnMsIHNpbmNlIHRoZSByZXN1bHRzIG1pZ2h0IGJlIGluYWNjdXJhdGUuCisgIGlmICghaGFkX2Vycm9yc18gJiYgIXVudXNlZF9kZXBlbmRlbmN5Xy5lbXB0eSgpICYmCisgICAgICAhcG9vbF8tPmxhemlseV9idWlsZF9kZXBlbmRlbmNpZXNfKSB7CisgICAgTG9nVW51c2VkRGVwZW5kZW5jeShwcm90bywgcmVzdWx0KTsKKyAgfQorCisgIGlmIChoYWRfZXJyb3JzXykgeworICAgIHJldHVybiBudWxscHRyOworICB9IGVsc2UgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworCitjb25zdCBzdGQ6OnN0cmluZyogRGVzY3JpcHRvckJ1aWxkZXI6OkFsbG9jYXRlTmFtZVN0cmluZ3MoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNjb3BlLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvdG9fbmFtZSwKKyAgICBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpIHsKKyAgaWYgKHNjb3BlLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gYWxsb2MuQWxsb2NhdGVTdHJpbmdzKHByb3RvX25hbWUsIHByb3RvX25hbWUpOworICB9IGVsc2UgeworICAgIHJldHVybiBhbGxvYy5BbGxvY2F0ZVN0cmluZ3MocHJvdG9fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ckNhdChzY29wZSwgIi4iLCBwcm90b19uYW1lKSk7CisgIH0KK30KKworbmFtZXNwYWNlIHsKKworLy8gSGVscGVyIGZvciBCdWlsZE1lc3NhZ2UgYmVsb3cuCitzdHJ1Y3QgSW5jcmVtZW50V2hlbkRlc3Ryb3llZCB7CisgIH5JbmNyZW1lbnRXaGVuRGVzdHJveWVkKCkgeyArK3RvX2luY3JlbWVudDsgfQorICBpbnQmIHRvX2luY3JlbWVudDsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpCdWlsZE1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciogcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYykgeworICBjb25zdCBzdGQ6OnN0cmluZyYgc2NvcGUgPQorICAgICAgKHBhcmVudCA9PSBudWxscHRyKSA/IGZpbGVfLT5wYWNrYWdlKCkgOiBwYXJlbnQtPmZ1bGxfbmFtZSgpOworICByZXN1bHQtPmFsbF9uYW1lc18gPSBBbGxvY2F0ZU5hbWVTdHJpbmdzKHNjb3BlLCBwcm90by5uYW1lKCksIGFsbG9jKTsKKyAgVmFsaWRhdGVTeW1ib2xOYW1lKHByb3RvLm5hbWUoKSwgcmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8pOworCisgIHJlc3VsdC0+ZmlsZV8gPSBmaWxlXzsKKyAgcmVzdWx0LT5jb250YWluaW5nX3R5cGVfID0gcGFyZW50OworICByZXN1bHQtPmlzX3BsYWNlaG9sZGVyXyA9IGZhbHNlOworICByZXN1bHQtPmlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXyA9IGZhbHNlOworICByZXN1bHQtPndlbGxfa25vd25fdHlwZV8gPSBEZXNjcmlwdG9yOjpXRUxMS05PV05UWVBFX1VOU1BFQ0lGSUVEOworICByZXN1bHQtPm9wdGlvbnNfID0gbnVsbHB0cjsgIC8vIFNldCB0byBkZWZhdWx0X2luc3RhbmNlIGxhdGVyIGlmIG5lY2Vzc2FyeS4KKworICBhdXRvIGl0ID0gcG9vbF8tPnRhYmxlc18tPndlbGxfa25vd25fdHlwZXNfLmZpbmQocmVzdWx0LT5mdWxsX25hbWUoKSk7CisgIGlmIChpdCAhPSBwb29sXy0+dGFibGVzXy0+d2VsbF9rbm93bl90eXBlc18uZW5kKCkpIHsKKyAgICByZXN1bHQtPndlbGxfa25vd25fdHlwZV8gPSBpdC0+c2Vjb25kOworICB9CisKKyAgLy8gQ2FsY3VsYXRlIHRoZSBjb250aW51b3VzIHNlcXVlbmNlIG9mIGZpZWxkcy4KKyAgLy8gVGhlc2UgY2FuIGJlIGZhc3QtcGF0aCdkIGR1cmluZyBsb29rdXAgYW5kIGRvbid0IG5lZWQgdG8gYmUgYWRkZWQgdG8gdGhlCisgIC8vIHRhYmxlcy4KKyAgLy8gV2UgdXNlIHVpbnQxNl90IHRvIHNhdmUgc3BhY2UgZm9yIHNlcXVlbnRpYWxfZmllbGRfbGltaXRfLCBzbyBzdG9wIGJlZm9yZQorICAvLyBvdmVyZmxvd2luZyBpdC4gV29yc3QgY2FzZSwgd2UgYXJlIG5vdCB0YWtpbmcgZnVsbCBhZHZhbnRhZ2Ugb24gaHVnZQorICAvLyBtZXNzYWdlcywgYnV0IGl0IGlzIHVubGlrZWx5LgorICByZXN1bHQtPnNlcXVlbnRpYWxfZmllbGRfbGltaXRfID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KCkgJiYKKyAgICAgICAgICAgICAgICAgIGkgPCBwcm90by5maWVsZF9zaXplKCkgJiYgcHJvdG8uZmllbGQoaSkubnVtYmVyKCkgPT0gaSArIDE7CisgICAgICAgKytpKSB7CisgICAgcmVzdWx0LT5zZXF1ZW50aWFsX2ZpZWxkX2xpbWl0XyA9IGkgKyAxOworICB9CisKKyAgLy8gQnVpbGQgb25lb2ZzIGZpcnN0IHNvIHRoYXQgZmllbGRzIGFuZCBleHRlbnNpb24gcmFuZ2VzIGNhbiByZWZlciB0byB0aGVtLgorICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBvbmVvZl9kZWNsLCBCdWlsZE9uZW9mLCByZXN1bHQpOworICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBmaWVsZCwgQnVpbGRGaWVsZCwgcmVzdWx0KTsKKyAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgZW51bV90eXBlLCBCdWlsZEVudW0sIHJlc3VsdCk7CisgIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIGV4dGVuc2lvbl9yYW5nZSwgQnVpbGRFeHRlbnNpb25SYW5nZSwgcmVzdWx0KTsKKyAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgZXh0ZW5zaW9uLCBCdWlsZEV4dGVuc2lvbiwgcmVzdWx0KTsKKyAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgcmVzZXJ2ZWRfcmFuZ2UsIEJ1aWxkUmVzZXJ2ZWRSYW5nZSwgcmVzdWx0KTsKKworICAvLyBCZWZvcmUgYnVpbGRpbmcgc3VibWVzc2FnZXMsIGNoZWNrIHJlY3Vyc2lvbiBsaW1pdC4KKyAgLS1yZWN1cnNpb25fZGVwdGhfOworICBJbmNyZW1lbnRXaGVuRGVzdHJveWVkIHJldmVydHtyZWN1cnNpb25fZGVwdGhffTsKKyAgaWYgKHJlY3Vyc2lvbl9kZXB0aF8gPD0gMCkgeworICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAorICAgICAgICAgICAgICJSZWFjaGVkIG1heGltdW0gcmVjdXJzaW9uIGxpbWl0IGZvciBuZXN0ZWQgbWVzc2FnZXMuIik7CisgICAgcmVzdWx0LT5uZXN0ZWRfdHlwZXNfID0gbnVsbHB0cjsKKyAgICByZXN1bHQtPm5lc3RlZF90eXBlX2NvdW50XyA9IDA7CisgICAgcmV0dXJuOworICB9CisgIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIG5lc3RlZF90eXBlLCBCdWlsZE1lc3NhZ2UsIHJlc3VsdCk7CisKKyAgLy8gQ29weSByZXNlcnZlZCBuYW1lcy4KKyAgaW50IHJlc2VydmVkX25hbWVfY291bnQgPSBwcm90by5yZXNlcnZlZF9uYW1lX3NpemUoKTsKKyAgcmVzdWx0LT5yZXNlcnZlZF9uYW1lX2NvdW50XyA9IHJlc2VydmVkX25hbWVfY291bnQ7CisgIHJlc3VsdC0+cmVzZXJ2ZWRfbmFtZXNfID0KKyAgICAgIGFsbG9jLkFsbG9jYXRlQXJyYXk8Y29uc3Qgc3RkOjpzdHJpbmcqPihyZXNlcnZlZF9uYW1lX2NvdW50KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNlcnZlZF9uYW1lX2NvdW50OyArK2kpIHsKKyAgICByZXN1bHQtPnJlc2VydmVkX25hbWVzX1tpXSA9CisgICAgICAgIGFsbG9jLkFsbG9jYXRlU3RyaW5ncyhwcm90by5yZXNlcnZlZF9uYW1lKGkpKTsKKyAgfQorCisgIC8vIENvcHkgb3B0aW9ucy4KKyAgaWYgKHByb3RvLmhhc19vcHRpb25zKCkpIHsKKyAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyIsIGFsbG9jKTsKKyAgfQorCisgIEFkZFN5bWJvbChyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwYXJlbnQsIHJlc3VsdC0+bmFtZSgpLCBwcm90bywgU3ltYm9sKHJlc3VsdCkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8ucmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgcmFuZ2UxID0gcHJvdG8ucmVzZXJ2ZWRfcmFuZ2UoaSk7CisgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgcHJvdG8ucmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpOyBqKyspIHsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiByYW5nZTIgPSBwcm90by5yZXNlcnZlZF9yYW5nZShqKTsKKyAgICAgIGlmIChyYW5nZTEuZW5kKCkgPiByYW5nZTIuc3RhcnQoKSAmJiByYW5nZTIuZW5kKCkgPiByYW5nZTEuc3RhcnQoKSkgeworICAgICAgICBBZGRFcnJvcihyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90by5yZXNlcnZlZF9yYW5nZShpKSwKKyAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIlJlc2VydmVkIHJhbmdlICQwIHRvICQxIG92ZXJsYXBzIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHJlYWR5LWRlZmluZWQgcmFuZ2UgJDIgdG8gJDMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTIuc3RhcnQoKSwgcmFuZ2UyLmVuZCgpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTEuc3RhcnQoKSwgcmFuZ2UxLmVuZCgpIC0gMSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEhBU0hfU0VUPHN0ZDo6c3RyaW5nPiByZXNlcnZlZF9uYW1lX3NldDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5yZXNlcnZlZF9uYW1lX3NpemUoKTsgaSsrKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgPSBwcm90by5yZXNlcnZlZF9uYW1lKGkpOworICAgIGlmIChyZXNlcnZlZF9uYW1lX3NldC5maW5kKG5hbWUpID09IHJlc2VydmVkX25hbWVfc2V0LmVuZCgpKSB7CisgICAgICByZXNlcnZlZF9uYW1lX3NldC5pbnNlcnQobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZEVycm9yKG5hbWUsIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKCJGaWVsZCBuYW1lIFwiJDBcIiBpcyByZXNlcnZlZCBtdWx0aXBsZSB0aW1lcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKSk7CisgICAgfQorICB9CisKKworICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IHJlc3VsdC0+ZmllbGQoaSk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCByZXN1bHQtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyBqKyspIHsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByYW5nZSA9IHJlc3VsdC0+ZXh0ZW5zaW9uX3JhbmdlKGopOworICAgICAgaWYgKHJhbmdlLT5zdGFydCA8PSBmaWVsZC0+bnVtYmVyKCkgJiYgZmllbGQtPm51bWJlcigpIDwgcmFuZ2UtPmVuZCkgeworICAgICAgICBtZXNzYWdlX2hpbnRzX1tyZXN1bHRdLlJlcXVlc3RIaW50T25GaWVsZE51bWJlcnMoCisgICAgICAgICAgICBwcm90by5leHRlbnNpb25fcmFuZ2UoaiksIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSKTsKKyAgICAgICAgQWRkRXJyb3IoCisgICAgICAgICAgICBmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLmV4dGVuc2lvbl9yYW5nZShqKSwKKyAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICAgICAgICAgICAiRXh0ZW5zaW9uIHJhbmdlICQwIHRvICQxIGluY2x1ZGVzIGZpZWxkIFwiJDJcIiAoJDMpLiIsCisgICAgICAgICAgICAgICAgcmFuZ2UtPnN0YXJ0LCByYW5nZS0+ZW5kIC0gMSwgZmllbGQtPm5hbWUoKSwgZmllbGQtPm51bWJlcigpKSk7CisgICAgICB9CisgICAgfQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVzdWx0LT5yZXNlcnZlZF9yYW5nZV9jb3VudCgpOyBqKyspIHsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3I6OlJlc2VydmVkUmFuZ2UqIHJhbmdlID0gcmVzdWx0LT5yZXNlcnZlZF9yYW5nZShqKTsKKyAgICAgIGlmIChyYW5nZS0+c3RhcnQgPD0gZmllbGQtPm51bWJlcigpICYmIGZpZWxkLT5udW1iZXIoKSA8IHJhbmdlLT5lbmQpIHsKKyAgICAgICAgbWVzc2FnZV9oaW50c19bcmVzdWx0XS5SZXF1ZXN0SGludE9uRmllbGROdW1iZXJzKAorICAgICAgICAgICAgcHJvdG8ucmVzZXJ2ZWRfcmFuZ2UoaiksIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSKTsKKyAgICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90by5yZXNlcnZlZF9yYW5nZShqKSwKKyAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkZpZWxkIFwiJDBcIiB1c2VzIHJlc2VydmVkIG51bWJlciAkMS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5uYW1lKCksIGZpZWxkLT5udW1iZXIoKSkpOworICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzZXJ2ZWRfbmFtZV9zZXQuZmluZChmaWVsZC0+bmFtZSgpKSAhPSByZXNlcnZlZF9uYW1lX3NldC5lbmQoKSkgeworICAgICAgQWRkRXJyb3IoCisgICAgICAgICAgZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90by5maWVsZChpKSwKKyAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiRmllbGQgbmFtZSBcIiQwXCIgaXMgcmVzZXJ2ZWQuIiwgZmllbGQtPm5hbWUoKSkpOworICAgIH0KKworICB9CisKKyAgLy8gQ2hlY2sgdGhhdCBleHRlbnNpb24gcmFuZ2VzIGRvbid0IG92ZXJsYXAgYW5kIGRvbid0IGluY2x1ZGUKKyAgLy8gcmVzZXJ2ZWQgZmllbGQgbnVtYmVycyBvciBuYW1lcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UxID0gcmVzdWx0LT5leHRlbnNpb25fcmFuZ2UoaSk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCByZXN1bHQtPnJlc2VydmVkX3JhbmdlX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRGVzY3JpcHRvcjo6UmVzZXJ2ZWRSYW5nZSogcmFuZ2UyID0gcmVzdWx0LT5yZXNlcnZlZF9yYW5nZShqKTsKKyAgICAgIGlmIChyYW5nZTEtPmVuZCA+IHJhbmdlMi0+c3RhcnQgJiYgcmFuZ2UyLT5lbmQgPiByYW5nZTEtPnN0YXJ0KSB7CisgICAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLmV4dGVuc2lvbl9yYW5nZShpKSwKKyAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkV4dGVuc2lvbiByYW5nZSAkMCB0byAkMSBvdmVybGFwcyB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXJ2ZWQgcmFuZ2UgJDIgdG8gJDMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTEtPnN0YXJ0LCByYW5nZTEtPmVuZCAtIDEsIHJhbmdlMi0+c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UyLT5lbmQgLSAxKSk7CisgICAgICB9CisgICAgfQorICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IHJlc3VsdC0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlMiA9IHJlc3VsdC0+ZXh0ZW5zaW9uX3JhbmdlKGopOworICAgICAgaWYgKHJhbmdlMS0+ZW5kID4gcmFuZ2UyLT5zdGFydCAmJiByYW5nZTItPmVuZCA+IHJhbmdlMS0+c3RhcnQpIHsKKyAgICAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8uZXh0ZW5zaW9uX3JhbmdlKGkpLAorICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKKyAgICAgICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiRXh0ZW5zaW9uIHJhbmdlICQwIHRvICQxIG92ZXJsYXBzIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHJlYWR5LWRlZmluZWQgcmFuZ2UgJDIgdG8gJDMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTItPnN0YXJ0LCByYW5nZTItPmVuZCAtIDEsIHJhbmdlMS0+c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UxLT5lbmQgLSAxKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkRmllbGRPckV4dGVuc2lvbihjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciogcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYykgeworICBjb25zdCBzdGQ6OnN0cmluZyYgc2NvcGUgPQorICAgICAgKHBhcmVudCA9PSBudWxscHRyKSA/IGZpbGVfLT5wYWNrYWdlKCkgOiBwYXJlbnQtPmZ1bGxfbmFtZSgpOworCisgIC8vIFdlIGFsbG9jYXRlIGFsbCBuYW1lcyBpbiBhIHNpbmdsZSBhcnJheSwgYW5kIGRlZHVwIHRoZW0uCisgIC8vIFdlIHJlbWVtYmVyIHRoZSBpbmRpY2VzIGZvciB0aGUgcG90ZW50aWFsbHkgZGVkdXBlZCB2YWx1ZXMuCisgIGF1dG8gYWxsX25hbWVzID0gYWxsb2MuQWxsb2NhdGVGaWVsZE5hbWVzKAorICAgICAgcHJvdG8ubmFtZSgpLCBzY29wZSwKKyAgICAgIHByb3RvLmhhc19qc29uX25hbWUoKSA/ICZwcm90by5qc29uX25hbWUoKSA6IG51bGxwdHIpOworICByZXN1bHQtPmFsbF9uYW1lc18gPSBhbGxfbmFtZXMuYXJyYXk7CisgIHJlc3VsdC0+bG93ZXJjYXNlX25hbWVfaW5kZXhfID0gYWxsX25hbWVzLmxvd2VyY2FzZV9pbmRleDsKKyAgcmVzdWx0LT5jYW1lbGNhc2VfbmFtZV9pbmRleF8gPSBhbGxfbmFtZXMuY2FtZWxjYXNlX2luZGV4OworICByZXN1bHQtPmpzb25fbmFtZV9pbmRleF8gPSBhbGxfbmFtZXMuanNvbl9pbmRleDsKKworICBWYWxpZGF0ZVN5bWJvbE5hbWUocHJvdG8ubmFtZSgpLCByZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90byk7CisKKyAgcmVzdWx0LT5maWxlXyA9IGZpbGVfOworICByZXN1bHQtPm51bWJlcl8gPSBwcm90by5udW1iZXIoKTsKKyAgcmVzdWx0LT5pc19leHRlbnNpb25fID0gaXNfZXh0ZW5zaW9uOworICByZXN1bHQtPmlzX29uZW9mXyA9IGZhbHNlOworICByZXN1bHQtPnByb3RvM19vcHRpb25hbF8gPSBwcm90by5wcm90bzNfb3B0aW9uYWwoKTsKKworICBpZiAocHJvdG8ucHJvdG8zX29wdGlvbmFsKCkgJiYKKyAgICAgIGZpbGVfLT5zeW50YXgoKSAhPSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMykgeworICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgIlRoZSBbcHJvdG8zX29wdGlvbmFsPXRydWVdIG9wdGlvbiBtYXkgb25seSBiZSBzZXQgb24gcHJvdG8zIgorICAgICAgICAgICAgICJmaWVsZHMsIG5vdCAiICsKKyAgICAgICAgICAgICAgICAgcmVzdWx0LT5mdWxsX25hbWUoKSk7CisgIH0KKworICByZXN1bHQtPmhhc19qc29uX25hbWVfID0gcHJvdG8uaGFzX2pzb25fbmFtZSgpOworCisgIC8vIFNvbWUgY29tcGlsZXJzIGRvIG5vdCBhbGxvdyBzdGF0aWNfY2FzdCBkaXJlY3RseSBiZXR3ZWVuIHR3byBlbnVtIHR5cGVzLAorICAvLyBzbyB3ZSBtdXN0IGNhc3QgdG8gaW50IGZpcnN0LgorICByZXN1bHQtPnR5cGVfID0gc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yOjpUeXBlPigKKyAgICAgIGltcGxpY2l0X2Nhc3Q8aW50Pihwcm90by50eXBlKCkpKTsKKyAgcmVzdWx0LT5sYWJlbF8gPSBzdGF0aWNfY2FzdDxGaWVsZERlc2NyaXB0b3I6OkxhYmVsPigKKyAgICAgIGltcGxpY2l0X2Nhc3Q8aW50Pihwcm90by5sYWJlbCgpKSk7CisKKyAgaWYgKHJlc3VsdC0+bGFiZWxfID09IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVRVUlSRUQpIHsKKyAgICAvLyBBbiBleHRlbnNpb24gY2Fubm90IGhhdmUgYSByZXF1aXJlZCBmaWVsZCAoYi8xMzM2NTgzNikuCisgICAgaWYgKHJlc3VsdC0+aXNfZXh0ZW5zaW9uXykgeworICAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAvLyBFcnJvciBsb2NhdGlvbiBgVFlQRWA6IHdlIHdvdWxkIHJlYWxseSBsaWtlIHRvIGluZGljYXRlCisgICAgICAgICAgICAgICAvLyBgTEFCRUxgLCBidXQgdGhlIGBFcnJvckxvY2F0aW9uYCBlbnVtIGhhcyBubyBlbnRyeSBmb3IgdGhpcywKKyAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBkb24ndCBuZWNlc3NhcmlseSBrbm93IGFib3V0IGFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCisgICAgICAgICAgICAgICAvLyBgRXJyb3JDb2xsZWN0b3JgIGludGVyZmFjZSB0byBleHRlbmQgdGhlbSB0byBoYW5kbGUgdGhlIG5ldworICAgICAgICAgICAgICAgLy8gZXJyb3IgbG9jYXRpb24gdHlwZSBwcm9wZXJseS4KKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAgICJUaGUgZXh0ZW5zaW9uICIgKyByZXN1bHQtPmZ1bGxfbmFtZSgpICsgIiBjYW5ub3QgYmUgcmVxdWlyZWQuIik7CisgICAgfQorICB9CisKKyAgLy8gU29tZSBvZiB0aGVzZSBtYXkgYmUgZmlsbGVkIGluIHdoZW4gY3Jvc3MtbGlua2luZy4KKyAgcmVzdWx0LT5jb250YWluaW5nX3R5cGVfID0gbnVsbHB0cjsKKyAgcmVzdWx0LT50eXBlX29uY2VfID0gbnVsbHB0cjsKKyAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2VudW1fID0gbnVsbHB0cjsKKworICByZXN1bHQtPmhhc19kZWZhdWx0X3ZhbHVlXyA9IHByb3RvLmhhc19kZWZhdWx0X3ZhbHVlKCk7CisgIGlmIChwcm90by5oYXNfZGVmYXVsdF92YWx1ZSgpICYmIHJlc3VsdC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6REVGQVVMVF9WQUxVRSwKKyAgICAgICAgICAgICAiUmVwZWF0ZWQgZmllbGRzIGNhbid0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuIik7CisgIH0KKworICBpZiAocHJvdG8uaGFzX3R5cGUoKSkgeworICAgIGlmIChwcm90by5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgICBjaGFyKiBlbmRfcG9zID0gbnVsbHB0cjsKKyAgICAgIHN3aXRjaCAocmVzdWx0LT5jcHBfdHlwZSgpKSB7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9pbnQzMl90XyA9CisgICAgICAgICAgICAgIHN0cnRvbChwcm90by5kZWZhdWx0X3ZhbHVlKCkuY19zdHIoKSwgJmVuZF9wb3MsIDApOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfaW50NjRfdF8gPQorICAgICAgICAgICAgICBzdHJ0bzY0KHByb3RvLmRlZmF1bHRfdmFsdWUoKS5jX3N0cigpLCAmZW5kX3BvcywgMCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfdWludDMyX3RfID0KKyAgICAgICAgICAgICAgc3RydG91bChwcm90by5kZWZhdWx0X3ZhbHVlKCkuY19zdHIoKSwgJmVuZF9wb3MsIDApOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX3VpbnQ2NF90XyA9CisgICAgICAgICAgICAgIHN0cnRvdTY0KHByb3RvLmRlZmF1bHRfdmFsdWUoKS5jX3N0cigpLCAmZW5kX3BvcywgMCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgICAgIGlmIChwcm90by5kZWZhdWx0X3ZhbHVlKCkgPT0gImluZiIpIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9mbG9hdF8gPQorICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG8uZGVmYXVsdF92YWx1ZSgpID09ICItaW5mIikgeworICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2Zsb2F0XyA9CisgICAgICAgICAgICAgICAgLXN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG8uZGVmYXVsdF92YWx1ZSgpID09ICJuYW4iKSB7CisgICAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfZmxvYXRfID0KKyAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6cXVpZXRfTmFOKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9mbG9hdF8gPSBpbzo6U2FmZURvdWJsZVRvRmxvYXQoCisgICAgICAgICAgICAgICAgaW86Ok5vTG9jYWxlU3RydG9kKHByb3RvLmRlZmF1bHRfdmFsdWUoKS5jX3N0cigpLCAmZW5kX3BvcykpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgICAgICAgIGlmIChwcm90by5kZWZhdWx0X3ZhbHVlKCkgPT0gImluZiIpIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9kb3VibGVfID0KKyAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgICAgICAgICAgfSBlbHNlIGlmIChwcm90by5kZWZhdWx0X3ZhbHVlKCkgPT0gIi1pbmYiKSB7CisgICAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfZG91YmxlXyA9CisgICAgICAgICAgICAgICAgLXN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvLmRlZmF1bHRfdmFsdWUoKSA9PSAibmFuIikgeworICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2RvdWJsZV8gPQorICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9kb3VibGVfID0KKyAgICAgICAgICAgICAgICBpbzo6Tm9Mb2NhbGVTdHJ0b2QocHJvdG8uZGVmYXVsdF92YWx1ZSgpLmNfc3RyKCksICZlbmRfcG9zKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICAgICAgaWYgKHByb3RvLmRlZmF1bHRfdmFsdWUoKSA9PSAidHJ1ZSIpIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9ib29sXyA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIGlmIChwcm90by5kZWZhdWx0X3ZhbHVlKCkgPT0gImZhbHNlIikgeworICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2Jvb2xfID0gZmFsc2U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgIkJvb2xlYW4gZGVmYXVsdCBtdXN0IGJlIHRydWUgb3IgZmFsc2UuIik7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBmaWxsZWQgaW4gd2hlbiBjcm9zcy1saW5raW5nLgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9lbnVtXyA9IG51bGxwdHI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgICBpZiAocmVzdWx0LT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTKSB7CisgICAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nXyA9IGFsbG9jLkFsbG9jYXRlU3RyaW5ncygKKyAgICAgICAgICAgICAgICBVbmVzY2FwZUNFc2NhcGVTdHJpbmcocHJvdG8uZGVmYXVsdF92YWx1ZSgpKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmdfID0KKyAgICAgICAgICAgICAgICBhbGxvYy5BbGxvY2F0ZVN0cmluZ3MocHJvdG8uZGVmYXVsdF92YWx1ZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICJNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHQgdmFsdWVzLiIpOworICAgICAgICAgIHJlc3VsdC0+aGFzX2RlZmF1bHRfdmFsdWVfID0gZmFsc2U7CisgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X2dlbmVyYXRlZF9pbnN0YW5jZV8gPSBudWxscHRyOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoZW5kX3BvcyAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIGVuZF9wb3MgaXMgb25seSBzZXQgbm9uLW51bGwgYnkgdGhlIHBhcnNlcnMgZm9yIG51bWVyaWMgdHlwZXMsCisgICAgICAgIC8vIGFib3ZlLiBUaGlzIGNoZWNrcyB0aGF0IHRoZSBkZWZhdWx0IHdhcyBub24tZW1wdHkgYW5kIGhhZCBubyBleHRyYQorICAgICAgICAvLyBqdW5rIGFmdGVyIHRoZSBlbmQgb2YgdGhlIG51bWJlci4KKyAgICAgICAgaWYgKHByb3RvLmRlZmF1bHRfdmFsdWUoKS5lbXB0eSgpIHx8ICplbmRfcG9zICE9ICdcMCcpIHsKKyAgICAgICAgICBBZGRFcnJvcihyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkRFRkFVTFRfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IHBhcnNlIGRlZmF1bHQgdmFsdWUgXCIiICsgcHJvdG8uZGVmYXVsdF92YWx1ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIlwiLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5vIGV4cGxpY2l0IGRlZmF1bHQgdmFsdWUKKyAgICAgIHN3aXRjaCAocmVzdWx0LT5jcHBfdHlwZSgpKSB7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9pbnQzMl90XyA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9pbnQ2NF90XyA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfdWludDMyX3RfID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV91aW50NjRfdF8gPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDoKKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfZmxvYXRfID0gMC4wZjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9kb3VibGVfID0gMC4wOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9ib29sXyA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBmaWxsZWQgaW4gd2hlbiBjcm9zcy1saW5raW5nLgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9lbnVtXyA9IG51bGxwdHI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nXyA9ICZpbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfZ2VuZXJhdGVkX2luc3RhbmNlXyA9IG51bGxwdHI7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHJlc3VsdC0+bnVtYmVyKCkgPD0gMCkgeworICAgIG1lc3NhZ2VfaGludHNfW3BhcmVudF0uUmVxdWVzdEhpbnRPbkZpZWxkTnVtYmVycygKKyAgICAgICAgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSKTsKKyAgICBBZGRFcnJvcihyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgIkZpZWxkIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2Vycy4iKTsKKyAgfSBlbHNlIGlmICghaXNfZXh0ZW5zaW9uICYmIHJlc3VsdC0+bnVtYmVyKCkgPiBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIpIHsKKyAgICAvLyBPbmx5IHZhbGlkYXRlIHRoYXQgdGhlIG51bWJlciBpcyB3aXRoaW4gdGhlIHZhbGlkIGZpZWxkIHJhbmdlIGlmIGl0IGlzCisgICAgLy8gbm90IGFuIGV4dGVuc2lvbi4gU2luY2UgZXh0ZW5zaW9uIG51bWJlcnMgYXJlIHZhbGlkYXRlZCB3aXRoIHRoZQorICAgIC8vIGV4dGVuZGVlJ3MgdmFsaWQgc2V0IG9mIGV4dGVuc2lvbiBudW1iZXJzLCBhbmQgdGhvc2UgYXJlIGluIHR1cm4KKyAgICAvLyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbWF4IGFsbG93ZWQgbnVtYmVyLCB0aGUgY2hlY2sgaXMgdW5uZWNlc3NhcnkgZm9yCisgICAgLy8gZXh0ZW5zaW9uIGZpZWxkcy4KKyAgICAvLyBUaGlzIGF2b2lkcyBjcm9zcy1saW5raW5nIGlzc3VlcyB0aGF0IGFyaXNlIHdoZW4gYXR0ZW1wdGluZyB0byBjaGVjayBpZgorICAgIC8vIHRoZSBleHRlbmRlZSBpcyBhIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IG1lc3NhZ2UsIHdoaWNoIGhhcyBhIGhpZ2hlciBtYXgKKyAgICAvLyBvbiBleHRlbnNpb24gbnVtYmVycy4KKyAgICBtZXNzYWdlX2hpbnRzX1twYXJlbnRdLlJlcXVlc3RIaW50T25GaWVsZE51bWJlcnMoCisgICAgICAgIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUik7CisgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkZpZWxkIG51bWJlcnMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAkMC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyKSk7CisgIH0gZWxzZSBpZiAocmVzdWx0LT5udW1iZXIoKSA+PSBGaWVsZERlc2NyaXB0b3I6OmtGaXJzdFJlc2VydmVkTnVtYmVyICYmCisgICAgICAgICAgICAgcmVzdWx0LT5udW1iZXIoKSA8PSBGaWVsZERlc2NyaXB0b3I6OmtMYXN0UmVzZXJ2ZWROdW1iZXIpIHsKKyAgICBtZXNzYWdlX2hpbnRzX1twYXJlbnRdLlJlcXVlc3RIaW50T25GaWVsZE51bWJlcnMoCisgICAgICAgIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUik7CisgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICAgICAgICAgICJGaWVsZCBudW1iZXJzICQwIHRocm91Z2ggJDEgYXJlIHJlc2VydmVkIGZvciB0aGUgcHJvdG9jb2wgIgorICAgICAgICAgICAgICAgICAiYnVmZmVyIGxpYnJhcnkgaW1wbGVtZW50YXRpb24uIiwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjprRmlyc3RSZXNlcnZlZE51bWJlciwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjprTGFzdFJlc2VydmVkTnVtYmVyKSk7CisgIH0KKworICBpZiAoaXNfZXh0ZW5zaW9uKSB7CisgICAgaWYgKCFwcm90by5oYXNfZXh0ZW5kZWUoKSkgeworICAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVYVEVOREVFLAorICAgICAgICAgICAgICAgIkZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlIG5vdCBzZXQgZm9yIGV4dGVuc2lvbiBmaWVsZC4iKTsKKyAgICB9CisKKyAgICByZXN1bHQtPnNjb3BlXy5leHRlbnNpb25fc2NvcGUgPSBwYXJlbnQ7CisKKyAgICBpZiAocHJvdG8uaGFzX29uZW9mX2luZGV4KCkpIHsKKyAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgICAiRmllbGREZXNjcmlwdG9yUHJvdG8ub25lb2ZfaW5kZXggc2hvdWxkIG5vdCBiZSBzZXQgZm9yICIKKyAgICAgICAgICAgICAgICJleHRlbnNpb25zLiIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocHJvdG8uaGFzX2V4dGVuZGVlKCkpIHsKKyAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFWFRFTkRFRSwKKyAgICAgICAgICAgICAgICJGaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSBzZXQgZm9yIG5vbi1leHRlbnNpb24gZmllbGQuIik7CisgICAgfQorCisgICAgcmVzdWx0LT5jb250YWluaW5nX3R5cGVfID0gcGFyZW50OworCisgICAgaWYgKHByb3RvLmhhc19vbmVvZl9pbmRleCgpKSB7CisgICAgICBpZiAocHJvdG8ub25lb2ZfaW5kZXgoKSA8IDAgfHwKKyAgICAgICAgICBwcm90by5vbmVvZl9pbmRleCgpID49IHBhcmVudC0+b25lb2ZfZGVjbF9jb3VudCgpKSB7CisgICAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkZpZWxkRGVzY3JpcHRvclByb3RvLm9uZW9mX2luZGV4ICQwIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0IG9mIHJhbmdlIGZvciB0eXBlIFwiJDFcIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLm9uZW9mX2luZGV4KCksIHBhcmVudC0+bmFtZSgpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQtPmlzX29uZW9mXyA9IHRydWU7CisgICAgICAgIHJlc3VsdC0+c2NvcGVfLmNvbnRhaW5pbmdfb25lb2YgPQorICAgICAgICAgICAgcGFyZW50LT5vbmVvZl9kZWNsKHByb3RvLm9uZW9mX2luZGV4KCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENvcHkgb3B0aW9ucy4KKyAgcmVzdWx0LT5vcHRpb25zXyA9IG51bGxwdHI7ICAvLyBTZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlciBpZiBuZWNlc3NhcnkuCisgIGlmIChwcm90by5oYXNfb3B0aW9ucygpKSB7CisgICAgQWxsb2NhdGVPcHRpb25zKHByb3RvLm9wdGlvbnMoKSwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMiLCBhbGxvYyk7CisgIH0KKworICBBZGRTeW1ib2wocmVzdWx0LT5mdWxsX25hbWUoKSwgcGFyZW50LCByZXN1bHQtPm5hbWUoKSwgcHJvdG8sIFN5bWJvbChyZXN1bHQpKTsKK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRFeHRlbnNpb25SYW5nZSgKKyAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlJiBwcm90bywgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAorICAgIERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByZXN1bHQsIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYykgeworICByZXN1bHQtPnN0YXJ0ID0gcHJvdG8uc3RhcnQoKTsKKyAgcmVzdWx0LT5lbmQgPSBwcm90by5lbmQoKTsKKyAgaWYgKHJlc3VsdC0+c3RhcnQgPD0gMCkgeworICAgIG1lc3NhZ2VfaGludHNfW3BhcmVudF0uUmVxdWVzdEhpbnRPbkZpZWxkTnVtYmVycygKKyAgICAgICAgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLCByZXN1bHQtPnN0YXJ0LAorICAgICAgICByZXN1bHQtPmVuZCk7CisgICAgQWRkRXJyb3IocGFyZW50LT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICJFeHRlbnNpb24gbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzLiIpOworICB9CisKKyAgLy8gQ2hlY2tpbmcgb2YgdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSBleHRlbnNpb24gcmFuZ2UgaXMgZGVmZXJyZWQgdW50aWwgYWZ0ZXIKKyAgLy8gb3B0aW9ucyBpbnRlcnByZXRpbmcuIFRoaXMgYWxsb3dzIG1lc3NhZ2VzIHdpdGggbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgdG8KKyAgLy8gaGF2ZSBleHRlbnNpb25zIGJleW9uZCBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIsIHNpbmNlIHRoZSBleHRlbnNpb24KKyAgLy8gbnVtYmVycyBhcmUgYWN0dWFsbHkgdXNlZCBhcyBpbnQzMnMgaW4gdGhlIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0LgorCisgIGlmIChyZXN1bHQtPnN0YXJ0ID49IHJlc3VsdC0+ZW5kKSB7CisgICAgQWRkRXJyb3IocGFyZW50LT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICJFeHRlbnNpb24gcmFuZ2UgZW5kIG51bWJlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBzdGFydCBudW1iZXIuIik7CisgIH0KKworICByZXN1bHQtPm9wdGlvbnNfID0gbnVsbHB0cjsgIC8vIFNldCB0byBkZWZhdWx0X2luc3RhbmNlIGxhdGVyIGlmIG5lY2Vzc2FyeS4KKyAgaWYgKHByb3RvLmhhc19vcHRpb25zKCkpIHsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IG9wdGlvbnNfcGF0aDsKKyAgICBwYXJlbnQtPkdldExvY2F0aW9uUGF0aCgmb3B0aW9uc19wYXRoKTsKKyAgICBvcHRpb25zX3BhdGgucHVzaF9iYWNrKERlc2NyaXB0b3JQcm90bzo6a0V4dGVuc2lvblJhbmdlRmllbGROdW1iZXIpOworICAgIC8vIGZpbmQgaW5kZXggb2YgdGhpcyBleHRlbnNpb24gcmFuZ2UgaW4gb3JkZXIgdG8gY29tcHV0ZSBwYXRoCisgICAgaW50IGluZGV4OworICAgIGZvciAoaW5kZXggPSAwOyBwYXJlbnQtPmV4dGVuc2lvbl9yYW5nZXNfICsgaW5kZXggIT0gcmVzdWx0OyBpbmRleCsrKSB7CisgICAgfQorICAgIG9wdGlvbnNfcGF0aC5wdXNoX2JhY2soaW5kZXgpOworICAgIG9wdGlvbnNfcGF0aC5wdXNoX2JhY2soRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjprT3B0aW9uc0ZpZWxkTnVtYmVyKTsKKyAgICBBbGxvY2F0ZU9wdGlvbnNJbXBsKHBhcmVudC0+ZnVsbF9uYW1lKCksIHBhcmVudC0+ZnVsbF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBwcm90by5vcHRpb25zKCksIHJlc3VsdCwgb3B0aW9uc19wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMiLCBhbGxvYyk7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRSZXNlcnZlZFJhbmdlKAorICAgIGNvbnN0IERlc2NyaXB0b3JQcm90bzo6UmVzZXJ2ZWRSYW5nZSYgcHJvdG8sIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKKyAgICBEZXNjcmlwdG9yOjpSZXNlcnZlZFJhbmdlKiByZXN1bHQsIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJikgeworICByZXN1bHQtPnN0YXJ0ID0gcHJvdG8uc3RhcnQoKTsKKyAgcmVzdWx0LT5lbmQgPSBwcm90by5lbmQoKTsKKyAgaWYgKHJlc3VsdC0+c3RhcnQgPD0gMCkgeworICAgIG1lc3NhZ2VfaGludHNfW3BhcmVudF0uUmVxdWVzdEhpbnRPbkZpZWxkTnVtYmVycygKKyAgICAgICAgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLCByZXN1bHQtPnN0YXJ0LAorICAgICAgICByZXN1bHQtPmVuZCk7CisgICAgQWRkRXJyb3IocGFyZW50LT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICJSZXNlcnZlZCBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMuIik7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRSZXNlcnZlZFJhbmdlKAorICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG86OkVudW1SZXNlcnZlZFJhbmdlJiBwcm90bywKKyAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogcGFyZW50LCBFbnVtRGVzY3JpcHRvcjo6UmVzZXJ2ZWRSYW5nZSogcmVzdWx0LAorICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJikgeworICByZXN1bHQtPnN0YXJ0ID0gcHJvdG8uc3RhcnQoKTsKKyAgcmVzdWx0LT5lbmQgPSBwcm90by5lbmQoKTsKKworICBpZiAocmVzdWx0LT5zdGFydCA+IHJlc3VsdC0+ZW5kKSB7CisgICAgQWRkRXJyb3IocGFyZW50LT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICJSZXNlcnZlZCByYW5nZSBlbmQgbnVtYmVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIHN0YXJ0IG51bWJlci4iKTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpCdWlsZE9uZW9mKGNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciogcGFyZW50LCBPbmVvZkRlc2NyaXB0b3IqIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OkZsYXRBbGxvY2F0b3ImIGFsbG9jKSB7CisgIHJlc3VsdC0+YWxsX25hbWVzXyA9CisgICAgICBBbGxvY2F0ZU5hbWVTdHJpbmdzKHBhcmVudC0+ZnVsbF9uYW1lKCksIHByb3RvLm5hbWUoKSwgYWxsb2MpOworICBWYWxpZGF0ZVN5bWJvbE5hbWUocHJvdG8ubmFtZSgpLCByZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90byk7CisKKyAgcmVzdWx0LT5jb250YWluaW5nX3R5cGVfID0gcGFyZW50OworCisgIC8vIFdlIG5lZWQgdG8gZmlsbCB0aGVzZSBpbiBsYXRlci4KKyAgcmVzdWx0LT5maWVsZF9jb3VudF8gPSAwOworICByZXN1bHQtPmZpZWxkc18gPSBudWxscHRyOworICByZXN1bHQtPm9wdGlvbnNfID0gbnVsbHB0cjsKKworICAvLyBDb3B5IG9wdGlvbnMuCisgIGlmIChwcm90by5oYXNfb3B0aW9ucygpKSB7CisgICAgQWxsb2NhdGVPcHRpb25zKHByb3RvLm9wdGlvbnMoKSwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICBPbmVvZkRlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMiLCBhbGxvYyk7CisgIH0KKworICBBZGRTeW1ib2wocmVzdWx0LT5mdWxsX25hbWUoKSwgcGFyZW50LCByZXN1bHQtPm5hbWUoKSwgcHJvdG8sIFN5bWJvbChyZXN1bHQpKTsKK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6Q2hlY2tFbnVtVmFsdWVVbmlxdWVuZXNzKAorICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvLCBjb25zdCBFbnVtRGVzY3JpcHRvciogcmVzdWx0KSB7CisKKyAgLy8gQ2hlY2sgdGhhdCBlbnVtIGxhYmVscyBhcmUgc3RpbGwgdW5pcXVlIHdoZW4gd2UgcmVtb3ZlIHRoZSBlbnVtIHByZWZpeCBmcm9tCisgIC8vIHZhbHVlcyB0aGF0IGhhdmUgaXQuCisgIC8vCisgIC8vIFRoaXMgd2lsbCBmYWlsIGZvciBzb21ldGhpbmcgbGlrZToKKyAgLy8KKyAgLy8gICBlbnVtIE15RW51bSB7CisgIC8vICAgICBNWV9FTlVNX0ZPTyA9IDA7CisgIC8vICAgICBGT08gPSAxOworICAvLyAgIH0KKyAgLy8KKyAgLy8gQnkgZW5mb3JjaW5nIHRoaXMgcmVhc29uYWJsZSBjb25zdHJhaW50LCB3ZSBhbGxvdyBjb2RlIGdlbmVyYXRvcnMgdG8gc3RyaXAKKyAgLy8gdGhlIHByZWZpeCBhbmQvb3IgUGFzY2FsQ2FzZSBpdCB3aXRob3V0IGNyZWF0aW5nIGNvbmZsaWN0cy4gIFRoaXMgY2FuIGxlYWQKKyAgLy8gdG8gbXVjaCBuaWNlciBsYW5ndWFnZS1zcGVjaWZpYyBlbnVtcyBsaWtlOgorICAvLworICAvLyAgIGVudW0gTmFtZVR5cGUgeworICAvLyAgICAgRmlyc3ROYW1lID0gMSwKKyAgLy8gICAgIExhc3ROYW1lID0gMiwKKyAgLy8gICB9CisgIC8vCisgIC8vIEluc3RlYWQgb2Y6CisgIC8vCisgIC8vICAgZW51bSBOYW1lVHlwZSB7CisgIC8vICAgICBOQU1FX1RZUEVfRklSU1RfTkFNRSA9IDEsCisgIC8vICAgICBOQU1FX1RZUEVfTEFTVF9OQU1FID0gMiwKKyAgLy8gICB9CisgIFByZWZpeFJlbW92ZXIgcmVtb3ZlcihyZXN1bHQtPm5hbWUoKSk7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKj4gdmFsdWVzOworICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC0+dmFsdWVfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUgPSByZXN1bHQtPnZhbHVlKGkpOworICAgIHN0ZDo6c3RyaW5nIHN0cmlwcGVkID0KKyAgICAgICAgRW51bVZhbHVlVG9QYXNjYWxDYXNlKHJlbW92ZXIuTWF5YmVSZW1vdmUodmFsdWUtPm5hbWUoKSkpOworICAgIHN0ZDo6cGFpcjxzdGQ6Om1hcDxzdGQ6OnN0cmluZywgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcio+OjppdGVyYXRvciwgYm9vbD4KKyAgICAgICAgaW5zZXJ0X3Jlc3VsdCA9IHZhbHVlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc3RyaXBwZWQsIHZhbHVlKSk7CisgICAgYm9vbCBpbnNlcnRlZCA9IGluc2VydF9yZXN1bHQuc2Vjb25kOworCisgICAgLy8gV2UgZG9uJ3QgdGhyb3cgdGhlIGVycm9yIGlmIHRoZSB0d28gY29uZmxpY3Rpbmcgc3ltYm9scyBhcmUgaWRlbnRpY2FsLCBvcgorICAgIC8vIGlmIHRoZXkgbWFwIHRvIHRoZSBzYW1lIG51bWJlci4gIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlIG5vcm1hbCBzeW1ib2wKKyAgICAvLyBkdXBsaWNhdGlvbiBlcnJvciB3aWxsIGZpcmUgc28gd2UgZG9uJ3QgbmVlZCB0byAoYW5kIGl0cyBlcnJvciBtZXNzYWdlCisgICAgLy8gd2lsbCBtYWtlIG1vcmUgc2Vuc2UpLiBXZSBhbGxvdyB0aGUgbGF0dGVyIGNhc2Ugc28gdXNlcnMgY2FuIGNyZWF0ZQorICAgIC8vIGFsaWFzZXMgd2hpY2ggYWRkIG9yIHJlbW92ZSB0aGUgcHJlZml4IChjb2RlIGdlbmVyYXRvcnMgdGhhdCBkbyBwcmVmaXgKKyAgICAvLyBzdHJpcHBpbmcgc2hvdWxkIGRlLWR1cCB0aGUgbGFiZWxzIGluIHRoaXMgY2FzZSkuCisgICAgaWYgKCFpbnNlcnRlZCAmJiBpbnNlcnRfcmVzdWx0LmZpcnN0LT5zZWNvbmQtPm5hbWUoKSAhPSB2YWx1ZS0+bmFtZSgpICYmCisgICAgICAgIGluc2VydF9yZXN1bHQuZmlyc3QtPnNlY29uZC0+bnVtYmVyKCkgIT0gdmFsdWUtPm51bWJlcigpKSB7CisgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9tZXNzYWdlID0KKyAgICAgICAgICAiRW51bSBuYW1lICIgKyB2YWx1ZS0+bmFtZSgpICsgIiBoYXMgdGhlIHNhbWUgbmFtZSBhcyAiICsKKyAgICAgICAgICB2YWx1ZXNbc3RyaXBwZWRdLT5uYW1lKCkgKworICAgICAgICAgICIgaWYgeW91IGlnbm9yZSBjYXNlIGFuZCBzdHJpcCBvdXQgdGhlIGVudW0gbmFtZSBwcmVmaXggKGlmIGFueSkuICIKKyAgICAgICAgICAiVGhpcyBpcyBlcnJvci1wcm9uZSBhbmQgY2FuIGxlYWQgdG8gdW5kZWZpbmVkIGJlaGF2aW9yLiAiCisgICAgICAgICAgIlBsZWFzZSBhdm9pZCBkb2luZyB0aGlzLiBJZiB5b3UgYXJlIHVzaW5nIGFsbG93X2FsaWFzLCBwbGVhc2UgIgorICAgICAgICAgICJhc3NpZ24gdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSB0byBib3RoIGVudW1zLiI7CisgICAgICAvLyBUaGVyZSBhcmUgcHJvdG8yIGVudW1zIG91dCB0aGVyZSB3aXRoIGNvbmZsaWN0aW5nIG5hbWVzLCBzbyB0byBwcmVzZXJ2ZQorICAgICAgLy8gY29tcGF0aWJpbGl0eSB3ZSBpc3N1ZSBvbmx5IGEgd2FybmluZyBmb3IgcHJvdG8yLgorICAgICAgaWYgKHJlc3VsdC0+ZmlsZSgpLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMikgeworICAgICAgICBBZGRXYXJuaW5nKHZhbHVlLT5mdWxsX25hbWUoKSwgcHJvdG8udmFsdWUoaSksCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLCBlcnJvcl9tZXNzYWdlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFkZEVycm9yKHZhbHVlLT5mdWxsX25hbWUoKSwgcHJvdG8udmFsdWUoaSksCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwgZXJyb3JfbWVzc2FnZSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkRW51bShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bURlc2NyaXB0b3IqIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHNjb3BlID0KKyAgICAgIChwYXJlbnQgPT0gbnVsbHB0cikgPyBmaWxlXy0+cGFja2FnZSgpIDogcGFyZW50LT5mdWxsX25hbWUoKTsKKworICByZXN1bHQtPmFsbF9uYW1lc18gPSBBbGxvY2F0ZU5hbWVTdHJpbmdzKHNjb3BlLCBwcm90by5uYW1lKCksIGFsbG9jKTsKKyAgVmFsaWRhdGVTeW1ib2xOYW1lKHByb3RvLm5hbWUoKSwgcmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8pOworICByZXN1bHQtPmZpbGVfID0gZmlsZV87CisgIHJlc3VsdC0+Y29udGFpbmluZ190eXBlXyA9IHBhcmVudDsKKyAgcmVzdWx0LT5pc19wbGFjZWhvbGRlcl8gPSBmYWxzZTsKKyAgcmVzdWx0LT5pc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8gPSBmYWxzZTsKKworICBpZiAocHJvdG8udmFsdWVfc2l6ZSgpID09IDApIHsKKyAgICAvLyBXZSBjYW5ub3QgYWxsb3cgZW51bXMgd2l0aCBubyB2YWx1ZXMgYmVjYXVzZSB0aGlzIHdvdWxkIG1lYW4gdGhlcmUKKyAgICAvLyB3b3VsZCBiZSBubyB2YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBmaWVsZHMgb2YgdGhpcyB0eXBlLgorICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgIkVudW1zIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgdmFsdWUuIik7CisgIH0KKworICAvLyBDYWxjdWxhdGUgdGhlIGNvbnRpbnVvdXMgc2VxdWVuY2Ugb2YgdGhlIGxhYmVscy4KKyAgLy8gVGhlc2UgY2FuIGJlIGZhc3QtcGF0aCdkIGR1cmluZyBsb29rdXAgYW5kIGRvbid0IG5lZWQgdG8gYmUgYWRkZWQgdG8gdGhlCisgIC8vIHRhYmxlcy4KKyAgLy8gV2UgdXNlIHVpbnQxNl90IHRvIHNhdmUgc3BhY2UgZm9yIHNlcXVlbnRpYWxfdmFsdWVfbGltaXRfLCBzbyBzdG9wIGJlZm9yZQorICAvLyBvdmVyZmxvd2luZyBpdC4gV29yc3QgY2FzZSwgd2UgYXJlIG5vdCB0YWtpbmcgZnVsbCBhZHZhbnRhZ2Ugb24gaHVnZQorICAvLyBlbnVtcywgYnV0IGl0IGlzIHVubGlrZWx5LgorICBmb3IgKGludCBpID0gMDsKKyAgICAgICBpIDwgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCgpICYmIGkgPCBwcm90by52YWx1ZV9zaXplKCkgJiYKKyAgICAgICAvLyBXZSBkbyB0aGUgbWF0aCBpbiBpbnQ2NF90IHRvIGF2b2lkIG92ZXJmbG93cy4KKyAgICAgICBwcm90by52YWx1ZShpKS5udW1iZXIoKSA9PQorICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihpKSArIHByb3RvLnZhbHVlKDApLm51bWJlcigpOworICAgICAgICsraSkgeworICAgIHJlc3VsdC0+c2VxdWVudGlhbF92YWx1ZV9saW1pdF8gPSBpOworICB9CisKKyAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgdmFsdWUsIEJ1aWxkRW51bVZhbHVlLCByZXN1bHQpOworICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCByZXNlcnZlZF9yYW5nZSwgQnVpbGRSZXNlcnZlZFJhbmdlLCByZXN1bHQpOworCisgIC8vIENvcHkgcmVzZXJ2ZWQgbmFtZXMuCisgIGludCByZXNlcnZlZF9uYW1lX2NvdW50ID0gcHJvdG8ucmVzZXJ2ZWRfbmFtZV9zaXplKCk7CisgIHJlc3VsdC0+cmVzZXJ2ZWRfbmFtZV9jb3VudF8gPSByZXNlcnZlZF9uYW1lX2NvdW50OworICByZXN1bHQtPnJlc2VydmVkX25hbWVzXyA9CisgICAgICBhbGxvYy5BbGxvY2F0ZUFycmF5PGNvbnN0IHN0ZDo6c3RyaW5nKj4ocmVzZXJ2ZWRfbmFtZV9jb3VudCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzZXJ2ZWRfbmFtZV9jb3VudDsgKytpKSB7CisgICAgcmVzdWx0LT5yZXNlcnZlZF9uYW1lc19baV0gPQorICAgICAgICBhbGxvYy5BbGxvY2F0ZVN0cmluZ3MocHJvdG8ucmVzZXJ2ZWRfbmFtZShpKSk7CisgIH0KKworICBDaGVja0VudW1WYWx1ZVVuaXF1ZW5lc3MocHJvdG8sIHJlc3VsdCk7CisKKyAgLy8gQ29weSBvcHRpb25zLgorICByZXN1bHQtPm9wdGlvbnNfID0gbnVsbHB0cjsgIC8vIFNldCB0byBkZWZhdWx0X2luc3RhbmNlIGxhdGVyIGlmIG5lY2Vzc2FyeS4KKyAgaWYgKHByb3RvLmhhc19vcHRpb25zKCkpIHsKKyAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMiLCBhbGxvYyk7CisgIH0KKworICBBZGRTeW1ib2wocmVzdWx0LT5mdWxsX25hbWUoKSwgcGFyZW50LCByZXN1bHQtPm5hbWUoKSwgcHJvdG8sIFN5bWJvbChyZXN1bHQpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLnJlc2VydmVkX3JhbmdlX3NpemUoKTsgaSsrKSB7CisgICAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSYgcmFuZ2UxID0KKyAgICAgICAgcHJvdG8ucmVzZXJ2ZWRfcmFuZ2UoaSk7CisgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgcHJvdG8ucmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpOyBqKyspIHsKKyAgICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UmIHJhbmdlMiA9CisgICAgICAgICAgcHJvdG8ucmVzZXJ2ZWRfcmFuZ2Uoaik7CisgICAgICBpZiAocmFuZ2UxLmVuZCgpID49IHJhbmdlMi5zdGFydCgpICYmIHJhbmdlMi5lbmQoKSA+PSByYW5nZTEuc3RhcnQoKSkgeworICAgICAgICBBZGRFcnJvcihyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90by5yZXNlcnZlZF9yYW5nZShpKSwKKyAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIlJlc2VydmVkIHJhbmdlICQwIHRvICQxIG92ZXJsYXBzIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHJlYWR5LWRlZmluZWQgcmFuZ2UgJDIgdG8gJDMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTIuc3RhcnQoKSwgcmFuZ2UyLmVuZCgpLCByYW5nZTEuc3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTEuZW5kKCkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBIQVNIX1NFVDxzdGQ6OnN0cmluZz4gcmVzZXJ2ZWRfbmFtZV9zZXQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8ucmVzZXJ2ZWRfbmFtZV9zaXplKCk7IGkrKykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lID0gcHJvdG8ucmVzZXJ2ZWRfbmFtZShpKTsKKyAgICBpZiAocmVzZXJ2ZWRfbmFtZV9zZXQuZmluZChuYW1lKSA9PSByZXNlcnZlZF9uYW1lX3NldC5lbmQoKSkgeworICAgICAgcmVzZXJ2ZWRfbmFtZV9zZXQuaW5zZXJ0KG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBBZGRFcnJvcihuYW1lLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAorICAgICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiRW51bSB2YWx1ZSBcIiQwXCIgaXMgcmVzZXJ2ZWQgbXVsdGlwbGUgdGltZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkpOworICAgIH0KKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSA9IHJlc3VsdC0+dmFsdWUoaSk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCByZXN1bHQtPnJlc2VydmVkX3JhbmdlX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRW51bURlc2NyaXB0b3I6OlJlc2VydmVkUmFuZ2UqIHJhbmdlID0gcmVzdWx0LT5yZXNlcnZlZF9yYW5nZShqKTsKKyAgICAgIGlmIChyYW5nZS0+c3RhcnQgPD0gdmFsdWUtPm51bWJlcigpICYmIHZhbHVlLT5udW1iZXIoKSA8PSByYW5nZS0+ZW5kKSB7CisgICAgICAgIEFkZEVycm9yKHZhbHVlLT5mdWxsX25hbWUoKSwgcHJvdG8ucmVzZXJ2ZWRfcmFuZ2UoaiksCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKCJFbnVtIHZhbHVlIFwiJDBcIiB1c2VzIHJlc2VydmVkIG51bWJlciAkMS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5uYW1lKCksIHZhbHVlLT5udW1iZXIoKSkpOworICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzZXJ2ZWRfbmFtZV9zZXQuZmluZCh2YWx1ZS0+bmFtZSgpKSAhPSByZXNlcnZlZF9uYW1lX3NldC5lbmQoKSkgeworICAgICAgQWRkRXJyb3IoCisgICAgICAgICAgdmFsdWUtPmZ1bGxfbmFtZSgpLCBwcm90by52YWx1ZShpKSwKKyAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiRW51bSB2YWx1ZSBcIiQwXCIgaXMgcmVzZXJ2ZWQuIiwgdmFsdWUtPm5hbWUoKSkpOworICAgIH0KKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpCdWlsZEVudW1WYWx1ZShjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3IqIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYykgeworICAvLyBOb3RlOiAgZnVsbF9uYW1lIGZvciBlbnVtIHZhbHVlcyBpcyBhIHNpYmxpbmcgdG8gdGhlIHBhcmVudCdzIG5hbWUsIG5vdCBhCisgIC8vICAgY2hpbGQgb2YgaXQuCisgIHN0ZDo6c3RyaW5nIGZ1bGxfbmFtZTsKKyAgc2l6ZV90IHNjb3BlX2xlbiA9IHBhcmVudC0+ZnVsbF9uYW1lKCkuc2l6ZSgpIC0gcGFyZW50LT5uYW1lKCkuc2l6ZSgpOworICBmdWxsX25hbWUucmVzZXJ2ZShzY29wZV9sZW4gKyBwcm90by5uYW1lKCkuc2l6ZSgpKTsKKyAgZnVsbF9uYW1lLmFwcGVuZChwYXJlbnQtPmZ1bGxfbmFtZSgpLmRhdGEoKSwgc2NvcGVfbGVuKTsKKyAgZnVsbF9uYW1lLmFwcGVuZChwcm90by5uYW1lKCkpOworCisgIHJlc3VsdC0+YWxsX25hbWVzXyA9CisgICAgICBhbGxvYy5BbGxvY2F0ZVN0cmluZ3MocHJvdG8ubmFtZSgpLCBzdGQ6Om1vdmUoZnVsbF9uYW1lKSk7CisgIHJlc3VsdC0+bnVtYmVyXyA9IHByb3RvLm51bWJlcigpOworICByZXN1bHQtPnR5cGVfID0gcGFyZW50OworCisgIFZhbGlkYXRlU3ltYm9sTmFtZShwcm90by5uYW1lKCksIHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvKTsKKworICAvLyBDb3B5IG9wdGlvbnMuCisgIHJlc3VsdC0+b3B0aW9uc18gPSBudWxscHRyOyAgLy8gU2V0IHRvIGRlZmF1bHRfaW5zdGFuY2UgbGF0ZXIgaWYgbmVjZXNzYXJ5LgorICBpZiAocHJvdG8uaGFzX29wdGlvbnMoKSkgeworICAgIEFsbG9jYXRlT3B0aW9ucyhwcm90by5vcHRpb25zKCksIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMiLCBhbGxvYyk7CisgIH0KKworICAvLyBBZ2FpbiwgZW51bSB2YWx1ZXMgYXJlIHdlaXJkIGJlY2F1c2Ugd2UgbWFrZXMgdGhlbSBhcHBlYXIgYXMgc2libGluZ3MKKyAgLy8gb2YgdGhlIGVudW0gdHlwZSBpbnN0ZWFkIG9mIGNoaWxkcmVuIG9mIGl0LiAgU28sIHdlIHVzZQorICAvLyBwYXJlbnQtPmNvbnRhaW5pbmdfdHlwZSgpIGFzIHRoZSB2YWx1ZSdzIHBhcmVudC4KKyAgYm9vbCBhZGRlZF90b19vdXRlcl9zY29wZSA9CisgICAgICBBZGRTeW1ib2wocmVzdWx0LT5mdWxsX25hbWUoKSwgcGFyZW50LT5jb250YWluaW5nX3R5cGUoKSwgcmVzdWx0LT5uYW1lKCksCisgICAgICAgICAgICAgICAgcHJvdG8sIFN5bWJvbDo6RW51bVZhbHVlKHJlc3VsdCwgMCkpOworCisgIC8vIEhvd2V2ZXIsIHdlIGFsc28gd2FudCB0byBiZSBhYmxlIHRvIHNlYXJjaCBmb3IgdmFsdWVzIHdpdGhpbiBhIHNpbmdsZQorICAvLyBlbnVtIHR5cGUsIHNvIHdlIGFkZCBpdCBhcyBhIGNoaWxkIG9mIHRoZSBlbnVtIHR5cGUgaXRzZWxmLCB0b28uCisgIC8vIE5vdGU6ICBUaGlzIGNvdWxkIGZhaWwsIGJ1dCBpZiBpdCBkb2VzLCB0aGUgZXJyb3IgaGFzIGFscmVhZHkgYmVlbgorICAvLyAgIHJlcG9ydGVkIGJ5IHRoZSBhYm92ZSBBZGRTeW1ib2woKSBjYWxsLCBzbyB3ZSBpZ25vcmUgdGhlIHJldHVybiBjb2RlLgorICBib29sIGFkZGVkX3RvX2lubmVyX3Njb3BlID0gZmlsZV90YWJsZXNfLT5BZGRBbGlhc1VuZGVyUGFyZW50KAorICAgICAgcGFyZW50LCByZXN1bHQtPm5hbWUoKSwgU3ltYm9sOjpFbnVtVmFsdWUocmVzdWx0LCAxKSk7CisKKyAgaWYgKGFkZGVkX3RvX2lubmVyX3Njb3BlICYmICFhZGRlZF90b19vdXRlcl9zY29wZSkgeworICAgIC8vIFRoaXMgdmFsdWUgZGlkIG5vdCBjb25mbGljdCB3aXRoIGFueSB2YWx1ZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBlbnVtLAorICAgIC8vIGJ1dCBpdCBkaWQgY29uZmxpY3Qgd2l0aCBzb21lIG90aGVyIHN5bWJvbCBkZWZpbmVkIGluIHRoZSBlbnVtIHR5cGUncworICAgIC8vIHNjb3BlLiAgTGV0J3MgcHJpbnQgYW4gYWRkaXRpb25hbCBlcnJvciB0byBleHBsYWluIHRoaXMuCisgICAgc3RkOjpzdHJpbmcgb3V0ZXJfc2NvcGU7CisgICAgaWYgKHBhcmVudC0+Y29udGFpbmluZ190eXBlKCkgPT0gbnVsbHB0cikgeworICAgICAgb3V0ZXJfc2NvcGUgPSBmaWxlXy0+cGFja2FnZSgpOworICAgIH0gZWxzZSB7CisgICAgICBvdXRlcl9zY29wZSA9IHBhcmVudC0+Y29udGFpbmluZ190eXBlKCktPmZ1bGxfbmFtZSgpOworICAgIH0KKworICAgIGlmIChvdXRlcl9zY29wZS5lbXB0eSgpKSB7CisgICAgICBvdXRlcl9zY29wZSA9ICJ0aGUgZ2xvYmFsIHNjb3BlIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0ZXJfc2NvcGUgPSAiXCIiICsgb3V0ZXJfc2NvcGUgKyAiXCIiOworICAgIH0KKworICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgIk5vdGUgdGhhdCBlbnVtIHZhbHVlcyB1c2UgQysrIHNjb3BpbmcgcnVsZXMsIG1lYW5pbmcgdGhhdCAiCisgICAgICAgICAgICAgImVudW0gdmFsdWVzIGFyZSBzaWJsaW5ncyBvZiB0aGVpciB0eXBlLCBub3QgY2hpbGRyZW4gb2YgaXQuICAiCisgICAgICAgICAgICAgIlRoZXJlZm9yZSwgXCIiICsKKyAgICAgICAgICAgICAgICAgcmVzdWx0LT5uYW1lKCkgKyAiXCIgbXVzdCBiZSB1bmlxdWUgd2l0aGluICIgKyBvdXRlcl9zY29wZSArCisgICAgICAgICAgICAgICAgICIsIG5vdCBqdXN0IHdpdGhpbiBcIiIgKyBwYXJlbnQtPm5hbWUoKSArICJcIi4iKTsKKyAgfQorCisgIC8vIEFuIGVudW0gaXMgYWxsb3dlZCB0byBkZWZpbmUgdHdvIG51bWJlcnMgdGhhdCByZWZlciB0byB0aGUgc2FtZSB2YWx1ZS4KKyAgLy8gRmluZFZhbHVlQnlOdW1iZXIoKSBzaG91bGQgcmV0dXJuIHRoZSBmaXJzdCBzdWNoIHZhbHVlLCBzbyB3ZSBzaW1wbHkKKyAgLy8gaWdub3JlIEFkZEVudW1WYWx1ZUJ5TnVtYmVyKCkncyByZXR1cm4gY29kZS4KKyAgZmlsZV90YWJsZXNfLT5BZGRFbnVtVmFsdWVCeU51bWJlcihyZXN1bHQpOworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpCdWlsZFNlcnZpY2UoY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogLyogZHVtbXkgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0b3IqIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpIHsKKyAgcmVzdWx0LT5hbGxfbmFtZXNfID0KKyAgICAgIEFsbG9jYXRlTmFtZVN0cmluZ3MoZmlsZV8tPnBhY2thZ2UoKSwgcHJvdG8ubmFtZSgpLCBhbGxvYyk7CisgIHJlc3VsdC0+ZmlsZV8gPSBmaWxlXzsKKyAgVmFsaWRhdGVTeW1ib2xOYW1lKHByb3RvLm5hbWUoKSwgcmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8pOworCisgIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIG1ldGhvZCwgQnVpbGRNZXRob2QsIHJlc3VsdCk7CisKKyAgLy8gQ29weSBvcHRpb25zLgorICByZXN1bHQtPm9wdGlvbnNfID0gbnVsbHB0cjsgIC8vIFNldCB0byBkZWZhdWx0X2luc3RhbmNlIGxhdGVyIGlmIG5lY2Vzc2FyeS4KKyAgaWYgKHByb3RvLmhhc19vcHRpb25zKCkpIHsKKyAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMiLCBhbGxvYyk7CisgIH0KKworICBBZGRTeW1ib2wocmVzdWx0LT5mdWxsX25hbWUoKSwgbnVsbHB0ciwgcmVzdWx0LT5uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgU3ltYm9sKHJlc3VsdCkpOworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpCdWlsZE1ldGhvZChjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0b3IqIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpGbGF0QWxsb2NhdG9yJiBhbGxvYykgeworICByZXN1bHQtPnNlcnZpY2VfID0gcGFyZW50OworICByZXN1bHQtPmFsbF9uYW1lc18gPQorICAgICAgQWxsb2NhdGVOYW1lU3RyaW5ncyhwYXJlbnQtPmZ1bGxfbmFtZSgpLCBwcm90by5uYW1lKCksIGFsbG9jKTsKKworICBWYWxpZGF0ZVN5bWJvbE5hbWUocHJvdG8ubmFtZSgpLCByZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90byk7CisKKyAgLy8gVGhlc2Ugd2lsbCBiZSBmaWxsZWQgaW4gd2hlbiBjcm9zcy1saW5raW5nLgorICByZXN1bHQtPmlucHV0X3R5cGVfLkluaXQoKTsKKyAgcmVzdWx0LT5vdXRwdXRfdHlwZV8uSW5pdCgpOworCisgIC8vIENvcHkgb3B0aW9ucy4KKyAgcmVzdWx0LT5vcHRpb25zXyA9IG51bGxwdHI7ICAvLyBTZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlciBpZiBuZWNlc3NhcnkuCisgIGlmIChwcm90by5oYXNfb3B0aW9ucygpKSB7CisgICAgQWxsb2NhdGVPcHRpb25zKHByb3RvLm9wdGlvbnMoKSwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyIsIGFsbG9jKTsKKyAgfQorCisgIHJlc3VsdC0+Y2xpZW50X3N0cmVhbWluZ18gPSBwcm90by5jbGllbnRfc3RyZWFtaW5nKCk7CisgIHJlc3VsdC0+c2VydmVyX3N0cmVhbWluZ18gPSBwcm90by5zZXJ2ZXJfc3RyZWFtaW5nKCk7CisKKyAgQWRkU3ltYm9sKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHBhcmVudCwgcmVzdWx0LT5uYW1lKCksIHByb3RvLCBTeW1ib2wocmVzdWx0KSk7Cit9CisKKyN1bmRlZiBCVUlMRF9BUlJBWQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkNyb3NzTGlua0ZpbGUoRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIGlmIChmaWxlLT5vcHRpb25zXyA9PSBudWxscHRyKSB7CisgICAgZmlsZS0+b3B0aW9uc18gPSAmRmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIENyb3NzTGlua01lc3NhZ2UoJmZpbGUtPm1lc3NhZ2VfdHlwZXNfW2ldLCBwcm90by5tZXNzYWdlX3R5cGUoaSkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgQ3Jvc3NMaW5rRmllbGQoJmZpbGUtPmV4dGVuc2lvbnNfW2ldLCBwcm90by5leHRlbnNpb24oaSkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgQ3Jvc3NMaW5rRW51bSgmZmlsZS0+ZW51bV90eXBlc19baV0sIHByb3RvLmVudW1fdHlwZShpKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPnNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgQ3Jvc3NMaW5rU2VydmljZSgmZmlsZS0+c2VydmljZXNfW2ldLCBwcm90by5zZXJ2aWNlKGkpKTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpDcm9zc0xpbmtNZXNzYWdlKERlc2NyaXB0b3IqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgaWYgKG1lc3NhZ2UtPm9wdGlvbnNfID09IG51bGxwdHIpIHsKKyAgICBtZXNzYWdlLT5vcHRpb25zXyA9ICZNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBDcm9zc0xpbmtNZXNzYWdlKCZtZXNzYWdlLT5uZXN0ZWRfdHlwZXNfW2ldLCBwcm90by5uZXN0ZWRfdHlwZShpKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBDcm9zc0xpbmtFbnVtKCZtZXNzYWdlLT5lbnVtX3R5cGVzX1tpXSwgcHJvdG8uZW51bV90eXBlKGkpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgQ3Jvc3NMaW5rRmllbGQoJm1lc3NhZ2UtPmZpZWxkc19baV0sIHByb3RvLmZpZWxkKGkpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIENyb3NzTGlua0ZpZWxkKCZtZXNzYWdlLT5leHRlbnNpb25zX1tpXSwgcHJvdG8uZXh0ZW5zaW9uKGkpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7IGkrKykgeworICAgIENyb3NzTGlua0V4dGVuc2lvblJhbmdlKCZtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2VzX1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by5leHRlbnNpb25fcmFuZ2UoaSkpOworICB9CisKKyAgLy8gU2V0IHVwIGZpZWxkIGFycmF5IGZvciBlYWNoIG9uZW9mLgorCisgIC8vIEZpcnN0IGNvdW50IHRoZSBudW1iZXIgb2YgZmllbGRzIHBlciBvbmVvZi4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2RlY2wgPSBtZXNzYWdlLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpOworICAgIGlmIChvbmVvZl9kZWNsICE9IG51bGxwdHIpIHsKKyAgICAgIC8vIE1ha2Ugc3VyZSBmaWVsZHMgYmVsb25naW5nIHRvIHRoZSBzYW1lIG9uZW9mIGFyZSBkZWZpbmVkIGNvbnNlY3V0aXZlbHkuCisgICAgICAvLyBUaGlzIGVuYWJsZXMgb3B0aW1pemF0aW9ucyBpbiBjb2RlZ2VucyBhbmQgcmVmbGVjdGlvbiBsaWJyYXJpZXMgdG8KKyAgICAgIC8vIHNraXAgZmllbGRzIGluIHRoZSBvbmVvZiBncm91cCwgYXMgb25seSBvbmUgb2YgdGhlIGZpZWxkIGNhbiBiZSBzZXQuCisgICAgICAvLyBOb3RlIHRoYXQgZmllbGRfY291bnQoKSByZXR1cm5zIGhvdyBtYW55IGZpZWxkcyBpbiB0aGlzIG9uZW9mIHdlIGhhdmUKKyAgICAgIC8vIHNlZW4gc28gZmFyLiBmaWVsZF9jb3VudCgpID4gMCBndWFyYW50ZWVzIHRoYXQgaSA+IDAsIHNvIGZpZWxkKGktMSkgaXMKKyAgICAgIC8vIHNhZmUuCisgICAgICBpZiAob25lb2ZfZGVjbC0+ZmllbGRfY291bnQoKSA+IDAgJiYKKyAgICAgICAgICBtZXNzYWdlLT5maWVsZChpIC0gMSktPmNvbnRhaW5pbmdfb25lb2YoKSAhPSBvbmVvZl9kZWNsKSB7CisgICAgICAgIEFkZEVycm9yKG1lc3NhZ2UtPmZ1bGxfbmFtZSgpICsgIi4iICsgbWVzc2FnZS0+ZmllbGQoaSAtIDEpLT5uYW1lKCksCisgICAgICAgICAgICAgICAgIHByb3RvLmZpZWxkKGkgLSAxKSwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKAorICAgICAgICAgICAgICAgICAgICAgIkZpZWxkcyBpbiB0aGUgc2FtZSBvbmVvZiBtdXN0IGJlIGRlZmluZWQgY29uc2VjdXRpdmVseS4gIgorICAgICAgICAgICAgICAgICAgICAgIlwiJDBcIiBjYW5ub3QgYmUgZGVmaW5lZCBiZWZvcmUgdGhlIGNvbXBsZXRpb24gb2YgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICJcIiQxXCIgb25lb2YgZGVmaW5pdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+ZmllbGQoaSAtIDEpLT5uYW1lKCksIG9uZW9mX2RlY2wtPm5hbWUoKSkpOworICAgICAgfQorICAgICAgLy8gTXVzdCBnbyB0aHJvdWdoIG9uZW9mX2RlY2xzXyBhcnJheSB0byBnZXQgYSBub24tY29uc3QgdmVyc2lvbiBvZiB0aGUKKyAgICAgIC8vIE9uZW9mRGVzY3JpcHRvci4KKyAgICAgIGF1dG8mIG91dF9vbmVvZl9kZWNsID0gbWVzc2FnZS0+b25lb2ZfZGVjbHNfW29uZW9mX2RlY2wtPmluZGV4KCldOworICAgICAgaWYgKG91dF9vbmVvZl9kZWNsLmZpZWxkX2NvdW50XyA9PSAwKSB7CisgICAgICAgIG91dF9vbmVvZl9kZWNsLmZpZWxkc18gPSBtZXNzYWdlLT5maWVsZChpKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFoYWRfZXJyb3JzXykgeworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGV5IGFyZSBjb250aWd1b3VzLgorICAgICAgICAvLyBUaGlzIGlzIGFzc3VtZWQgYnkgT25lb2ZEZXNjcmlwdG9yOjpmaWVsZChpKS4KKyAgICAgICAgLy8gQnV0IG9ubHkgaWYgdGhlcmUgYXJlIG5vIGVycm9ycy4KKyAgICAgICAgR09PR0xFX0NIRUNLX0VRKG91dF9vbmVvZl9kZWNsLmZpZWxkc18gKyBvdXRfb25lb2ZfZGVjbC5maWVsZF9jb3VudF8sCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPmZpZWxkKGkpKTsKKyAgICAgIH0KKyAgICAgICsrb3V0X29uZW9mX2RlY2wuZmllbGRfY291bnRfOworICAgIH0KKyAgfQorCisgIC8vIFRoZW4gdmVyaWZ5IHRoZSBzaXplcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgeworICAgIE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVjbCA9ICZtZXNzYWdlLT5vbmVvZl9kZWNsc19baV07CisKKyAgICBpZiAob25lb2ZfZGVjbC0+ZmllbGRfY291bnQoKSA9PSAwKSB7CisgICAgICBBZGRFcnJvcihtZXNzYWdlLT5mdWxsX25hbWUoKSArICIuIiArIG9uZW9mX2RlY2wtPm5hbWUoKSwKKyAgICAgICAgICAgICAgIHByb3RvLm9uZW9mX2RlY2woaSksIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICJPbmVvZiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGZpZWxkLiIpOworICAgIH0KKworICAgIGlmIChvbmVvZl9kZWNsLT5vcHRpb25zXyA9PSBudWxscHRyKSB7CisgICAgICBvbmVvZl9kZWNsLT5vcHRpb25zXyA9ICZPbmVvZk9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgICB9CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBtZXNzYWdlLT5maWVsZChpKTsKKyAgICBpZiAoZmllbGQtPnByb3RvM19vcHRpb25hbF8pIHsKKyAgICAgIGlmICghZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSB8fAorICAgICAgICAgICFmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpLT5pc19zeW50aGV0aWMoKSkgeworICAgICAgICBBZGRFcnJvcihtZXNzYWdlLT5mdWxsX25hbWUoKSwgcHJvdG8uZmllbGQoaSksCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCisgICAgICAgICAgICAgICAgICJGaWVsZHMgd2l0aCBwcm90bzNfb3B0aW9uYWwgc2V0IG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAiYSBtZW1iZXIgb2YgYSBvbmUtZmllbGQgb25lb2YiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBTeW50aGV0aWMgb25lb2ZzIG11c3QgYmUgbGFzdC4KKyAgaW50IGZpcnN0X3N5bnRoZXRpYyA9IC0xOworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZiA9IG1lc3NhZ2UtPm9uZW9mX2RlY2woaSk7CisgICAgaWYgKG9uZW9mLT5pc19zeW50aGV0aWMoKSkgeworICAgICAgaWYgKGZpcnN0X3N5bnRoZXRpYyA9PSAtMSkgeworICAgICAgICBmaXJzdF9zeW50aGV0aWMgPSBpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoZmlyc3Rfc3ludGhldGljICE9IC0xKSB7CisgICAgICAgIEFkZEVycm9yKG1lc3NhZ2UtPmZ1bGxfbmFtZSgpLCBwcm90by5vbmVvZl9kZWNsKGkpLAorICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAorICAgICAgICAgICAgICAgICAiU3ludGhldGljIG9uZW9mcyBtdXN0IGJlIGFmdGVyIGFsbCBvdGhlciBvbmVvZnMiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZmlyc3Rfc3ludGhldGljID09IC0xKSB7CisgICAgbWVzc2FnZS0+cmVhbF9vbmVvZl9kZWNsX2NvdW50XyA9IG1lc3NhZ2UtPm9uZW9mX2RlY2xfY291bnRfOworICB9IGVsc2UgeworICAgIG1lc3NhZ2UtPnJlYWxfb25lb2ZfZGVjbF9jb3VudF8gPSBmaXJzdF9zeW50aGV0aWM7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6Q3Jvc3NMaW5rRXh0ZW5zaW9uUmFuZ2UoCisgICAgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlLAorICAgIGNvbnN0IERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2UmIC8qcHJvdG8qLykgeworICBpZiAocmFuZ2UtPm9wdGlvbnNfID09IG51bGxwdHIpIHsKKyAgICByYW5nZS0+b3B0aW9uc18gPSAmRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6Q3Jvc3NMaW5rRmllbGQoRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBpZiAoZmllbGQtPm9wdGlvbnNfID09IG51bGxwdHIpIHsKKyAgICBmaWVsZC0+b3B0aW9uc18gPSAmRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKworICBpZiAocHJvdG8uaGFzX2V4dGVuZGVlKCkpIHsKKyAgICBTeW1ib2wgZXh0ZW5kZWUgPQorICAgICAgICBMb29rdXBTeW1ib2wocHJvdG8uZXh0ZW5kZWUoKSwgZmllbGQtPmZ1bGxfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OlBMQUNFSE9MREVSX0VYVEVOREFCTEVfTUVTU0FHRSk7CisgICAgaWYgKGV4dGVuZGVlLklzTnVsbCgpKSB7CisgICAgICBBZGROb3REZWZpbmVkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVYVEVOREVFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLmV4dGVuZGVlKCkpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoZXh0ZW5kZWUudHlwZSgpICE9IFN5bWJvbDo6TUVTU0FHRSkgeworICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RVhURU5ERUUsCisgICAgICAgICAgICAgICAiXCIiICsgcHJvdG8uZXh0ZW5kZWUoKSArICJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuIik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGVfID0gZXh0ZW5kZWUuZGVzY3JpcHRvcigpOworCisgICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIGV4dGVuc2lvbl9yYW5nZSA9CisgICAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+RmluZEV4dGVuc2lvblJhbmdlQ29udGFpbmluZ051bWJlcigKKyAgICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSk7CisKKyAgICBpZiAoZXh0ZW5zaW9uX3JhbmdlID09IG51bGxwdHIpIHsKKyAgICAgIC8vIFNldCBvZiB2YWxpZCBleHRlbnNpb24gbnVtYmVycyBmb3IgTWVzc2FnZVNldCBpcyBkaWZmZXJlbnQgKDwgMl4zMikKKyAgICAgIC8vIGZyb20gb3RoZXIgZXh0ZW5kZWVzICg8IDJeMjkpLiBJZiB1bmtub3duIGRlcHMgYXJlIGFsbG93ZWQsIHdlIG1heSBub3QKKyAgICAgIC8vIGhhdmUgdGhhdCBpbmZvcm1hdGlvbiwgYW5kIHdyb25nbHkgZGVlbSB0aGUgZXh0ZW5zaW9uIGFzIGludmFsaWQuCisgICAgICBhdXRvIHNraXBfY2hlY2sgPSBnZXRfYWxsb3dfdW5rbm93bihwb29sXykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLmV4dGVuZGVlKCkgPT0gImdvb2dsZS5wcm90b2J1Zi5icmlkZ2UuTWVzc2FnZVNldCI7CisgICAgICBpZiAoIXNraXBfY2hlY2spIHsKKyAgICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIlwiJDBcIiBkb2VzIG5vdCBkZWNsYXJlICQxIGFzIGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIG51bWJlci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+ZnVsbF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPm51bWJlcigpKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgIT0gbnVsbHB0cikgeworICAgIGlmIChmaWVsZC0+bGFiZWwoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMKSB7CisgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBlcnJvciB3aWxsIG5ldmVyIGhhcHBlbiB3aGVuIHBhcnNpbmcgLnByb3RvIGZpbGVzLgorICAgICAgLy8gSXQgY2FuIG9ubHkgaGFwcGVuIGlmIHlvdSBtYW51YWxseSBjb25zdHJ1Y3QgYSBGaWxlRGVzY3JpcHRvclByb3RvCisgICAgICAvLyB0aGF0IGlzIGluY29ycmVjdC4KKyAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICJGaWVsZHMgb2Ygb25lb2ZzIG11c3QgdGhlbXNlbHZlcyBoYXZlIGxhYmVsIExBQkVMX09QVElPTkFMLiIpOworICAgIH0KKyAgfQorCisgIGlmIChwcm90by5oYXNfdHlwZV9uYW1lKCkpIHsKKyAgICAvLyBBc3N1bWUgd2UgYXJlIGV4cGVjdGluZyBhIG1lc3NhZ2UgdHlwZSB1bmxlc3MgdGhlIHByb3RvIGNvbnRhaW5zIHNvbWUKKyAgICAvLyBldmlkZW5jZSB0aGF0IGl0IGV4cGVjdHMgYW4gZW51bSB0eXBlLiAgVGhpcyBvbmx5IG1ha2VzIGEgZGlmZmVyZW5jZSBpZgorICAgIC8vIHdlIGVuZCB1cCBjcmVhdGluZyBhIHBsYWNlaG9sZGVyLgorICAgIGJvb2wgZXhwZWN0aW5nX2VudW0gPSAocHJvdG8udHlwZSgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0VOVU0pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLmhhc19kZWZhdWx0X3ZhbHVlKCk7CisKKyAgICAvLyBJbiBjYXNlIG9mIHdlYWsgZmllbGRzIHdlIGZvcmNlIGJ1aWxkaW5nIHRoZSBkZXBlbmRlbmN5LiBXZSBuZWVkIHRvIGtub3cKKyAgICAvLyBpZiB0aGUgdHlwZSBleGlzdCBvciBub3QuIElmIGl0IGRvZXNuJ3QgZXhpc3Qgd2Ugc3Vic3RpdHV0ZSBFbXB0eSB3aGljaAorICAgIC8vIHNob3VsZCBvbmx5IGJlIGRvbmUgaWYgdGhlIHR5cGUgY2FuJ3QgYmUgZm91bmQgaW4gdGhlIGdlbmVyYXRlZCBwb29sLgorICAgIC8vIFRPRE8oZ2VyYmVucykgSWRlYWxseSB3ZSBzaG91bGQgcXVlcnkgdGhlIGRhdGFiYXNlIGRpcmVjdGx5IHRvIGNoZWNrCisgICAgLy8gaWYgd2VhayBmaWVsZHMgZXhpc3Qgb3Igbm90IHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBmb3JjZSBidWlsZGluZworICAgIC8vIHdlYWsgZGVwZW5kZW5jaWVzLiBIb3dldmVyIHRoZSBuYW1lIGxvb2t1cCBydWxlcyBmb3Igc3ltYm9scyBhcmUKKyAgICAvLyBzb21ld2hhdCBjb21wbGljYXRlZCwgc28gSSBkZWZlciBpdCB0b28gYW5vdGhlciBDTC4KKyAgICBib29sIGlzX3dlYWsgPSAhcG9vbF8tPmVuZm9yY2Vfd2Vha18gJiYgcHJvdG8ub3B0aW9ucygpLndlYWsoKTsKKyAgICBib29sIGlzX2xhenkgPSBwb29sXy0+bGF6aWx5X2J1aWxkX2RlcGVuZGVuY2llc18gJiYgIWlzX3dlYWs7CisKKyAgICBTeW1ib2wgdHlwZSA9CisgICAgICAgIExvb2t1cFN5bWJvbChwcm90by50eXBlX25hbWUoKSwgZmllbGQtPmZ1bGxfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgZXhwZWN0aW5nX2VudW0gPyBEZXNjcmlwdG9yUG9vbDo6UExBQ0VIT0xERVJfRU5VTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBEZXNjcmlwdG9yUG9vbDo6UExBQ0VIT0xERVJfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgIExPT0tVUF9UWVBFUywgIWlzX2xhenkpOworCisgICAgaWYgKHR5cGUuSXNOdWxsKCkpIHsKKyAgICAgIGlmIChpc19sYXp5KSB7CisgICAgICAgIC8vIFNhdmUgdGhlIHN5bWJvbCBuYW1lcyBmb3IgbGF0ZXIgZm9yIGxvb2t1cCwgYW5kIGFsbG9jYXRlIHRoZSBvbmNlCisgICAgICAgIC8vIG9iamVjdCBuZWVkZWQgZm9yIHRoZSBhY2Nlc3NvcnMuCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lID0gcHJvdG8udHlwZV9uYW1lKCk7CisKKyAgICAgICAgaW50IG5hbWVfc2l6ZXMgPSBzdGF0aWNfY2FzdDxpbnQ+KG5hbWUuc2l6ZSgpICsgMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by5kZWZhdWx0X3ZhbHVlKCkuc2l6ZSgpICsgMSk7CisKKyAgICAgICAgZmllbGQtPnR5cGVfb25jZV8gPSA6Om5ldyAodGFibGVzXy0+QWxsb2NhdGVCeXRlcyhzdGF0aWNfY2FzdDxpbnQ+KAorICAgICAgICAgICAgc2l6ZW9mKGludGVybmFsOjpvbmNlX2ZsYWcpICsgbmFtZV9zaXplcykpKSBpbnRlcm5hbDo6b25jZV9mbGFne307CisgICAgICAgIGNoYXIqIG5hbWVzID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZmllbGQtPnR5cGVfb25jZV8gKyAxKTsKKworICAgICAgICBtZW1jcHkobmFtZXMsIG5hbWUuY19zdHIoKSwgbmFtZS5zaXplKCkgKyAxKTsKKyAgICAgICAgbWVtY3B5KG5hbWVzICsgbmFtZS5zaXplKCkgKyAxLCBwcm90by5kZWZhdWx0X3ZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgIHByb3RvLmRlZmF1bHRfdmFsdWUoKS5zaXplKCkgKyAxKTsKKworICAgICAgICAvLyBBZGRGaWVsZEJ5TnVtYmVyIGFuZCBBZGRFeHRlbnNpb24gYXJlIGRvbmUgbGF0ZXIgaW4gdGhpcyBmdW5jdGlvbiwKKyAgICAgICAgLy8gYW5kIGNhbi9tdXN0IGJlIGRvbmUgaWYgdGhlIGZpZWxkIHR5cGUgd2FzIG5vdCBmb3VuZC4gVGhlIHJlbGF0ZWQKKyAgICAgICAgLy8gZXJyb3IgY2hlY2tpbmcgaXMgbm90IG5lY2Vzc2FyeSB3aGVuIGluIGxhemlseV9idWlsZF9kZXBlbmRlbmNpZXNfCisgICAgICAgIC8vIG1vZGUsIGFuZCBjYW4ndCBiZSBkb25lIHdpdGhvdXQgYnVpbGRpbmcgdGhlIHR5cGUncyBkZXNjcmlwdG9yLAorICAgICAgICAvLyB3aGljaCB3ZSBkb24ndCB3YW50IHRvIGRvLgorICAgICAgICBmaWxlX3RhYmxlc18tPkFkZEZpZWxkQnlOdW1iZXIoZmllbGQpOworICAgICAgICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgICAgICAgdGFibGVzXy0+QWRkRXh0ZW5zaW9uKGZpZWxkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiB0aGUgdHlwZSBpcyBhIHdlYWsgdHlwZSwgd2UgY2hhbmdlIHRoZSB0eXBlIHRvIGEgZ29vZ2xlLnByb3RvYnVmLkVtcHR5CisgICAgICAgIC8vIGZpZWxkLgorICAgICAgICBpZiAoaXNfd2VhaykgeworICAgICAgICAgIHR5cGUgPSBGaW5kU3ltYm9sKGtOb25MaW5rZWRXZWFrTWVzc2FnZVJlcGxhY2VtZW50TmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUuSXNOdWxsKCkpIHsKKyAgICAgICAgICBBZGROb3REZWZpbmVkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by50eXBlX25hbWUoKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFwcm90by5oYXNfdHlwZSgpKSB7CisgICAgICAvLyBDaG9vc2UgZmllbGQgdHlwZSBiYXNlZCBvbiBzeW1ib2wuCisgICAgICBpZiAodHlwZS50eXBlKCkgPT0gU3ltYm9sOjpNRVNTQUdFKSB7CisgICAgICAgIGZpZWxkLT50eXBlXyA9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOworICAgICAgfSBlbHNlIGlmICh0eXBlLnR5cGUoKSA9PSBTeW1ib2w6OkVOVU0pIHsKKyAgICAgICAgZmllbGQtPnR5cGVfID0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU07CisgICAgICB9IGVsc2UgeworICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgICAgICJcIiIgKyBwcm90by50eXBlX25hbWUoKSArICJcIiBpcyBub3QgYSB0eXBlLiIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBmaWVsZC0+dHlwZV9kZXNjcmlwdG9yXy5tZXNzYWdlX3R5cGUgPSB0eXBlLmRlc2NyaXB0b3IoKTsKKyAgICAgIGlmIChmaWVsZC0+dHlwZV9kZXNjcmlwdG9yXy5tZXNzYWdlX3R5cGUgPT0gbnVsbHB0cikgeworICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgICAgICJcIiIgKyBwcm90by50eXBlX25hbWUoKSArICJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6REVGQVVMVF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgIk1lc3NhZ2VzIGNhbid0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuIik7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTSkgeworICAgICAgZmllbGQtPnR5cGVfZGVzY3JpcHRvcl8uZW51bV90eXBlID0gdHlwZS5lbnVtX2Rlc2NyaXB0b3IoKTsKKyAgICAgIGlmIChmaWVsZC0+dHlwZV9kZXNjcmlwdG9yXy5lbnVtX3R5cGUgPT0gbnVsbHB0cikgeworICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgICAgICJcIiIgKyBwcm90by50eXBlX25hbWUoKSArICJcIiBpcyBub3QgYW4gZW51bSB0eXBlLiIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChmaWVsZC0+ZW51bV90eXBlKCktPmlzX3BsYWNlaG9sZGVyXykgeworICAgICAgICAvLyBXZSBjYW4ndCBsb29rIHVwIGRlZmF1bHQgdmFsdWVzIGZvciBwbGFjZWhvbGRlciB0eXBlcy4gIFdlJ2xsIGhhdmUKKyAgICAgICAgLy8gdG8ganVzdCBkcm9wIHRoZW0uCisgICAgICAgIGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZV8gPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIGlkZW50aWZpZXIuIFBhcnNlciBjYW5ub3QgYWx3YXlzCisgICAgICAgIC8vIHZlcmlmeSB0aGlzIGJlY2F1c2UgaXQgZG9lcyBub3QgaGF2ZSBjb21wbGV0ZSB0eXBlIGluZm9ybWF0aW9uLgorICAgICAgICAvLyBOLkIuIHRoYXQgdGhpcyBjaGVjayB5aWVsZHMgYmV0dGVyIGVycm9yIG1lc3NhZ2VzIGJ1dCBpcyBub3QKKyAgICAgICAgLy8gbmVjZXNzYXJ5IGZvciBjb3JyZWN0bmVzcyAoYW4gZW51bSBzeW1ib2wgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKKyAgICAgICAgLy8gYW55d2F5KSwgb25seSBmb3IgYmV0dGVyIGVycm9ycy4KKyAgICAgICAgaWYgKCFpbzo6VG9rZW5pemVyOjpJc0lkZW50aWZpZXIocHJvdG8uZGVmYXVsdF92YWx1ZSgpKSkgeworICAgICAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICJEZWZhdWx0IHZhbHVlIGZvciBhbiBlbnVtIGZpZWxkIG11c3QgYmUgYW4gaWRlbnRpZmllci4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBXZSBjYW4ndCBqdXN0IHVzZSBmaWVsZC0+ZW51bV90eXBlKCktPkZpbmRWYWx1ZUJ5TmFtZSgpIGhlcmUKKyAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgbG9ja3MgdGhlIHBvb2wncyBtdXRleCwgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IGxvY2tlZAorICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQuCisgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZGVmYXVsdF92YWx1ZSA9CisgICAgICAgICAgICAgIExvb2t1cFN5bWJvbE5vUGxhY2Vob2xkZXIocHJvdG8uZGVmYXVsdF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+ZnVsbF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAuZW51bV92YWx1ZV9kZXNjcmlwdG9yKCk7CisKKyAgICAgICAgICBpZiAoZGVmYXVsdF92YWx1ZSAhPSBudWxscHRyICYmCisgICAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUtPnR5cGUoKSA9PSBmaWVsZC0+ZW51bV90eXBlKCkpIHsKKyAgICAgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW1fID0gZGVmYXVsdF92YWx1ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6REVGQVVMVF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICJFbnVtIHR5cGUgXCIiICsgZmllbGQtPmVudW1fdHlwZSgpLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGhhcyBubyB2YWx1ZSBuYW1lZCBcIiIgKyBwcm90by5kZWZhdWx0X3ZhbHVlKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICJcIi4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmVudW1fdHlwZSgpLT52YWx1ZV9jb3VudCgpID4gMCkgeworICAgICAgICAvLyBBbGwgZW51bXMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB2YWx1ZSwgb3Igd2Ugd291bGQgaGF2ZSByZXBvcnRlZAorICAgICAgICAvLyBhbiBlcnJvciBlbHNld2hlcmUuICBXZSB1c2UgdGhlIGZpcnN0IGRlZmluZWQgdmFsdWUgYXMgdGhlIGRlZmF1bHQKKyAgICAgICAgLy8gaWYgYSBkZWZhdWx0IGlzIG5vdCBleHBsaWNpdGx5IGRlZmluZWQuCisgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW1fID0gZmllbGQtPmVudW1fdHlwZSgpLT52YWx1ZSgwKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICAgIkZpZWxkIHdpdGggcHJpbWl0aXZlIHR5cGUgaGFzIHR5cGVfbmFtZS4iKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFIHx8CisgICAgICAgIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNKSB7CisgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgICAiRmllbGQgd2l0aCBtZXNzYWdlIG9yIGVudW0gdHlwZSBtaXNzaW5nIHR5cGVfbmFtZS4iKTsKKyAgICB9CisgIH0KKworICAvLyBBZGQgdGhlIGZpZWxkIHRvIHRoZSBmaWVsZHMtYnktbnVtYmVyIHRhYmxlLgorICAvLyBOb3RlOiAgV2UgaGF2ZSB0byBkbyB0aGlzICphZnRlciogY3Jvc3MtbGlua2luZyBiZWNhdXNlIGV4dGVuc2lvbnMgZG8gbm90CisgIC8vIGtub3cgdGhlaXIgY29udGFpbmluZyB0eXBlIHVudGlsIG5vdy4gSWYgd2UncmUgaW4KKyAgLy8gbGF6aWx5X2J1aWxkX2RlcGVuZGVuY2llc18gbW9kZSwgd2UncmUgZ3VhcmFudGVlZCB0aGVyZSdzIG5vIGVycm9ycywgc28gbm8KKyAgLy8gcmlzayB0byBjYWxsaW5nIGNvbnRhaW5pbmdfdHlwZSgpIG9yIG90aGVyIGFjY2Vzc29ycyB0aGF0IHdpbGwgYnVpbGQKKyAgLy8gZGVwZW5kZW5jaWVzLgorICBpZiAoIWZpbGVfdGFibGVzXy0+QWRkRmllbGRCeU51bWJlcihmaWVsZCkpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGNvbmZsaWN0aW5nX2ZpZWxkID0gZmlsZV90YWJsZXNfLT5GaW5kRmllbGRCeU51bWJlcigKKyAgICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLCBmaWVsZC0+bnVtYmVyKCkpOworICAgIHN0ZDo6c3RyaW5nIGNvbnRhaW5pbmdfdHlwZV9uYW1lID0KKyAgICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpID09IG51bGxwdHIKKyAgICAgICAgICAgID8gInVua25vd24iCisgICAgICAgICAgICA6IGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+ZnVsbF9uYW1lKCk7CisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiRXh0ZW5zaW9uIG51bWJlciAkMCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gXCIkMVwiIGJ5IGV4dGVuc2lvbiBcIiQyXCIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPm51bWJlcigpLCBjb250YWluaW5nX3R5cGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RpbmdfZmllbGQtPmZ1bGxfbmFtZSgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKKyAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkZpZWxkIG51bWJlciAkMCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIkMVwiIGJ5IGZpZWxkIFwiJDJcIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGNvbnRhaW5pbmdfdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdGluZ19maWVsZC0+bmFtZSgpKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAgIGlmICghdGFibGVzXy0+QWRkRXh0ZW5zaW9uKGZpZWxkKSkgeworICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGNvbmZsaWN0aW5nX2ZpZWxkID0KKyAgICAgICAgICAgIHRhYmxlc18tPkZpbmRFeHRlbnNpb24oZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLCBmaWVsZC0+bnVtYmVyKCkpOworICAgICAgICBzdGQ6OnN0cmluZyBjb250YWluaW5nX3R5cGVfbmFtZSA9CisgICAgICAgICAgICBmaWVsZC0+Y29udGFpbmluZ190eXBlKCkgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgID8gInVua25vd24iCisgICAgICAgICAgICAgICAgOiBmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPmZ1bGxfbmFtZSgpOworICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9tc2cgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKAorICAgICAgICAgICAgIkV4dGVuc2lvbiBudW1iZXIgJDAgaGFzIGFscmVhZHkgYmVlbiB1c2VkIGluIFwiJDFcIiBieSBleHRlbnNpb24gIgorICAgICAgICAgICAgIlwiJDJcIiBkZWZpbmVkIGluICQzLiIsCisgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGNvbnRhaW5pbmdfdHlwZV9uYW1lLAorICAgICAgICAgICAgY29uZmxpY3RpbmdfZmllbGQtPmZ1bGxfbmFtZSgpLCBjb25mbGljdGluZ19maWVsZC0+ZmlsZSgpLT5uYW1lKCkpOworICAgICAgICAvLyBDb25mbGljdGluZyBleHRlbnNpb24gbnVtYmVycyBzaG91bGQgYmUgYW4gZXJyb3IuIEhvd2V2ZXIsIGJlZm9yZQorICAgICAgICAvLyB0dXJuaW5nIHRoaXMgaW50byBhbiBlcnJvciB3ZSBuZWVkIHRvIGZpeCBhbGwgZXhpc3RpbmcgYnJva2VuCisgICAgICAgIC8vIHByb3RvcyBmaXJzdC4KKyAgICAgICAgLy8gVE9ETyh4aWFvZmVuZyk6IENoYW5nZSB0aGlzIHRvIGFuIGVycm9yLgorICAgICAgICBBZGRXYXJuaW5nKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsIGVycm9yX21zZyk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkNyb3NzTGlua0VudW0oRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgaWYgKGVudW1fdHlwZS0+b3B0aW9uc18gPT0gbnVsbHB0cikgeworICAgIGVudW1fdHlwZS0+b3B0aW9uc18gPSAmRW51bU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV90eXBlLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICBDcm9zc0xpbmtFbnVtVmFsdWUoJmVudW1fdHlwZS0+dmFsdWVzX1tpXSwgcHJvdG8udmFsdWUoaSkpOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkNyb3NzTGlua0VudW1WYWx1ZSgKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlLAorICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgLyogcHJvdG8gKi8pIHsKKyAgaWYgKGVudW1fdmFsdWUtPm9wdGlvbnNfID09IG51bGxwdHIpIHsKKyAgICBlbnVtX3ZhbHVlLT5vcHRpb25zXyA9ICZFbnVtVmFsdWVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6Q3Jvc3NMaW5rU2VydmljZShTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgaWYgKHNlcnZpY2UtPm9wdGlvbnNfID09IG51bGxwdHIpIHsKKyAgICBzZXJ2aWNlLT5vcHRpb25zXyA9ICZTZXJ2aWNlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgQ3Jvc3NMaW5rTWV0aG9kKCZzZXJ2aWNlLT5tZXRob2RzX1tpXSwgcHJvdG8ubWV0aG9kKGkpKTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpDcm9zc0xpbmtNZXRob2QoTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgaWYgKG1ldGhvZC0+b3B0aW9uc18gPT0gbnVsbHB0cikgeworICAgIG1ldGhvZC0+b3B0aW9uc18gPSAmTWV0aG9kT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisKKyAgU3ltYm9sIGlucHV0X3R5cGUgPQorICAgICAgTG9va3VwU3ltYm9sKHByb3RvLmlucHV0X3R5cGUoKSwgbWV0aG9kLT5mdWxsX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6UExBQ0VIT0xERVJfTUVTU0FHRSwgTE9PS1VQX0FMTCwKKyAgICAgICAgICAgICAgICAgICAhcG9vbF8tPmxhemlseV9idWlsZF9kZXBlbmRlbmNpZXNfKTsKKyAgaWYgKGlucHV0X3R5cGUuSXNOdWxsKCkpIHsKKyAgICBpZiAoIXBvb2xfLT5sYXppbHlfYnVpbGRfZGVwZW5kZW5jaWVzXykgeworICAgICAgQWRkTm90RGVmaW5lZEVycm9yKG1ldGhvZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6SU5QVVRfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by5pbnB1dF90eXBlKCkpOworICAgIH0gZWxzZSB7CisgICAgICBtZXRob2QtPmlucHV0X3R5cGVfLlNldExhenkocHJvdG8uaW5wdXRfdHlwZSgpLCBmaWxlXyk7CisgICAgfQorICB9IGVsc2UgaWYgKGlucHV0X3R5cGUudHlwZSgpICE9IFN5bWJvbDo6TUVTU0FHRSkgeworICAgIEFkZEVycm9yKG1ldGhvZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6SU5QVVRfVFlQRSwKKyAgICAgICAgICAgICAiXCIiICsgcHJvdG8uaW5wdXRfdHlwZSgpICsgIlwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS4iKTsKKyAgfSBlbHNlIHsKKyAgICBtZXRob2QtPmlucHV0X3R5cGVfLlNldChpbnB1dF90eXBlLmRlc2NyaXB0b3IoKSk7CisgIH0KKworICBTeW1ib2wgb3V0cHV0X3R5cGUgPQorICAgICAgTG9va3VwU3ltYm9sKHByb3RvLm91dHB1dF90eXBlKCksIG1ldGhvZC0+ZnVsbF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OlBMQUNFSE9MREVSX01FU1NBR0UsIExPT0tVUF9BTEwsCisgICAgICAgICAgICAgICAgICAgIXBvb2xfLT5sYXppbHlfYnVpbGRfZGVwZW5kZW5jaWVzXyk7CisgIGlmIChvdXRwdXRfdHlwZS5Jc051bGwoKSkgeworICAgIGlmICghcG9vbF8tPmxhemlseV9idWlsZF9kZXBlbmRlbmNpZXNfKSB7CisgICAgICBBZGROb3REZWZpbmVkRXJyb3IobWV0aG9kLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVVRQVVRfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by5vdXRwdXRfdHlwZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgbWV0aG9kLT5vdXRwdXRfdHlwZV8uU2V0TGF6eShwcm90by5vdXRwdXRfdHlwZSgpLCBmaWxlXyk7CisgICAgfQorICB9IGVsc2UgaWYgKG91dHB1dF90eXBlLnR5cGUoKSAhPSBTeW1ib2w6Ok1FU1NBR0UpIHsKKyAgICBBZGRFcnJvcihtZXRob2QtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9VVFBVVF9UWVBFLAorICAgICAgICAgICAgICJcIiIgKyBwcm90by5vdXRwdXRfdHlwZSgpICsgIlwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS4iKTsKKyAgfSBlbHNlIHsKKyAgICBtZXRob2QtPm91dHB1dF90eXBlXy5TZXQob3V0cHV0X3R5cGUuZGVzY3JpcHRvcigpKTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpTdWdnZXN0RmllbGROdW1iZXJzKEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBmb3IgKGludCBtZXNzYWdlX2luZGV4ID0gMDsgbWVzc2FnZV9pbmRleCA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOworICAgICAgIG1lc3NhZ2VfaW5kZXgrKykgeworICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UgPSAmZmlsZS0+bWVzc2FnZV90eXBlc19bbWVzc2FnZV9pbmRleF07CisgICAgYXV0byogaGludHMgPSBGaW5kT3JOdWxsKG1lc3NhZ2VfaGludHNfLCBtZXNzYWdlKTsKKyAgICBpZiAoIWhpbnRzKSBjb250aW51ZTsKKyAgICBjb25zdGV4cHIgaW50IGtNYXhTdWdnZXN0aW9ucyA9IDM7CisgICAgaW50IGZpZWxkc190b19zdWdnZXN0ID0gc3RkOjptaW4oa01heFN1Z2dlc3Rpb25zLCBoaW50cy0+ZmllbGRzX3RvX3N1Z2dlc3QpOworICAgIGlmIChmaWVsZHNfdG9fc3VnZ2VzdCA8PSAwKSBjb250aW51ZTsKKyAgICBzdHJ1Y3QgUmFuZ2UgeworICAgICAgaW50IGZyb207CisgICAgICBpbnQgdG87CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxSYW5nZT4gdXNlZF9vcmRpbmFsczsKKyAgICBhdXRvIGFkZF9vcmRpbmFsID0gWyZdKGludCBvcmRpbmFsKSB7CisgICAgICBpZiAob3JkaW5hbCA8PSAwIHx8IG9yZGluYWwgPiBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIpIHJldHVybjsKKyAgICAgIGlmICghdXNlZF9vcmRpbmFscy5lbXB0eSgpICYmCisgICAgICAgICAgb3JkaW5hbCA9PSB1c2VkX29yZGluYWxzLmJhY2soKS50bykgeworICAgICAgICB1c2VkX29yZGluYWxzLmJhY2soKS50byA9IG9yZGluYWwgKyAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdXNlZF9vcmRpbmFscy5wdXNoX2JhY2soe29yZGluYWwsIG9yZGluYWwgKyAxfSk7CisgICAgICB9CisgICAgfTsKKyAgICBhdXRvIGFkZF9yYW5nZSA9IFsmXShpbnQgZnJvbSwgaW50IHRvKSB7CisgICAgICBmcm9tID0gc3RkOjptYXgoMCwgc3RkOjptaW4oRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyICsgMSwgZnJvbSkpOworICAgICAgdG8gPSBzdGQ6Om1heCgwLCBzdGQ6Om1pbihGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIgKyAxLCB0bykpOworICAgICAgaWYgKGZyb20gPj0gdG8pIHJldHVybjsKKyAgICAgIHVzZWRfb3JkaW5hbHMucHVzaF9iYWNrKHtmcm9tLCB0b30pOworICAgIH07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGFkZF9vcmRpbmFsKG1lc3NhZ2UtPmZpZWxkKGkpLT5udW1iZXIoKSk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgICAgYWRkX29yZGluYWwobWVzc2FnZS0+ZXh0ZW5zaW9uKGkpLT5udW1iZXIoKSk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+cmVzZXJ2ZWRfcmFuZ2VfY291bnQoKTsgaSsrKSB7CisgICAgICBhdXRvIHJhbmdlID0gbWVzc2FnZS0+cmVzZXJ2ZWRfcmFuZ2UoaSk7CisgICAgICBhZGRfcmFuZ2UocmFuZ2UtPnN0YXJ0LCByYW5nZS0+ZW5kKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKTsgaSsrKSB7CisgICAgICBhdXRvIHJhbmdlID0gbWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlKGkpOworICAgICAgYWRkX3JhbmdlKHJhbmdlLT5zdGFydCwgcmFuZ2UtPmVuZCk7CisgICAgfQorICAgIHVzZWRfb3JkaW5hbHMucHVzaF9iYWNrKAorICAgICAgICB7RmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyLCBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIgKyAxfSk7CisgICAgdXNlZF9vcmRpbmFscy5wdXNoX2JhY2soe0ZpZWxkRGVzY3JpcHRvcjo6a0ZpcnN0UmVzZXJ2ZWROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6a0xhc3RSZXNlcnZlZE51bWJlcn0pOworICAgIHN0ZDo6c29ydCh1c2VkX29yZGluYWxzLmJlZ2luKCksIHVzZWRfb3JkaW5hbHMuZW5kKCksCisgICAgICAgICAgICAgIFtdKFJhbmdlIGxocywgUmFuZ2UgcmhzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dGllKGxocy5mcm9tLCBsaHMudG8pIDwgc3RkOjp0aWUocmhzLmZyb20sIHJocy50byk7CisgICAgICAgICAgICAgIH0pOworICAgIGludCBjdXJyZW50X29yZGluYWwgPSAxOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGlkX2xpc3Q7CisgICAgaWRfbGlzdCA8PCAiU3VnZ2VzdGVkIGZpZWxkIG51bWJlcnMgZm9yICIgPDwgbWVzc2FnZS0+ZnVsbF9uYW1lKCkgPDwgIjogIjsKKyAgICBjb25zdCBjaGFyKiBzZXBhcmF0b3IgPSAiIjsKKyAgICBmb3IgKGF1dG8mIGN1cnJlbnRfcmFuZ2UgOiB1c2VkX29yZGluYWxzKSB7CisgICAgICB3aGlsZSAoY3VycmVudF9vcmRpbmFsIDwgY3VycmVudF9yYW5nZS5mcm9tICYmIGZpZWxkc190b19zdWdnZXN0ID4gMCkgeworICAgICAgICBpZF9saXN0IDw8IHNlcGFyYXRvciA8PCBjdXJyZW50X29yZGluYWwrKzsKKyAgICAgICAgc2VwYXJhdG9yID0gIiwgIjsKKyAgICAgICAgZmllbGRzX3RvX3N1Z2dlc3QtLTsKKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZHNfdG9fc3VnZ2VzdCA9PSAwKSBicmVhazsKKyAgICAgIGN1cnJlbnRfb3JkaW5hbCA9IHN0ZDo6bWF4KGN1cnJlbnRfb3JkaW5hbCwgY3VycmVudF9yYW5nZS50byk7CisgICAgfQorICAgIGlmIChoaW50cy0+Zmlyc3RfcmVhc29uKSB7CisgICAgICBBZGRFcnJvcihtZXNzYWdlLT5mdWxsX25hbWUoKSwgKmhpbnRzLT5maXJzdF9yZWFzb24sCisgICAgICAgICAgICAgICBoaW50cy0+Zmlyc3RfcmVhc29uX2xvY2F0aW9uLCBpZF9saXN0LnN0cigpKTsKKyAgICB9CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShkZXNjcmlwdG9yLCBhcnJheV9uYW1lLCB0eXBlKSBcCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+YXJyYXlfbmFtZSMjX2NvdW50KCk7ICsraSkgeyAgICBcCisgICAgVmFsaWRhdGUjI3R5cGUjI09wdGlvbnMoZGVzY3JpcHRvci0+YXJyYXlfbmFtZSMjc18gKyBpLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG8uYXJyYXlfbmFtZShpKSk7ICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gRGV0ZXJtaW5lIGlmIHRoZSBmaWxlIHVzZXMgb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FLCBiZWluZyBjYXJlZnVsIHRvCisvLyBhdm9pZCBwcm9ibGVtcyB0aGF0IGV4aXN0IGF0IGluaXQgdGltZS4KK3N0YXRpYyBib29sIElzTGl0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICAvLyBUT0RPKGtlbnRvbik6ICBJIGRvbid0IGV2ZW4gcmVtZW1iZXIgaG93IG1hbnkgb2YgdGhlc2UgY29uZGl0aW9ucyBhcmUKKyAgLy8gICBhY3R1YWxseSBwb3NzaWJsZS4gIEknbSBqdXN0IGJlaW5nIHN1cGVyLXNhZmUuCisgIHJldHVybiBmaWxlICE9IG51bGxwdHIgJiYKKyAgICAgICAgICZmaWxlLT5vcHRpb25zKCkgIT0gJkZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkgJiYKKyAgICAgICAgIGZpbGUtPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSA9PSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZUZpbGVPcHRpb25zKEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkoZmlsZSwgbWVzc2FnZV90eXBlLCBNZXNzYWdlKTsKKyAgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKGZpbGUsIGVudW1fdHlwZSwgRW51bSk7CisgIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShmaWxlLCBzZXJ2aWNlLCBTZXJ2aWNlKTsKKyAgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKGZpbGUsIGV4dGVuc2lvbiwgRmllbGQpOworCisgIC8vIExpdGUgZmlsZXMgY2FuIG9ubHkgYmUgaW1wb3J0ZWQgYnkgb3RoZXIgTGl0ZSBmaWxlcy4KKyAgaWYgKCFJc0xpdGUoZmlsZSkpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgICBpZiAoSXNMaXRlKGZpbGUtPmRlcGVuZGVuY3koaSkpKSB7CisgICAgICAgIEFkZEVycm9yKAorICAgICAgICAgICAgZmlsZS0+ZGVwZW5kZW5jeShpKS0+bmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6SU1QT1JULAorICAgICAgICAgICAgIkZpbGVzIHRoYXQgZG8gbm90IHVzZSBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUUgY2Fubm90IGltcG9ydCAiCisgICAgICAgICAgICAiZmlsZXMgd2hpY2ggZG8gdXNlIHRoaXMgb3B0aW9uLiAgVGhpcyBmaWxlIGlzIG5vdCBsaXRlLCBidXQgaXQgIgorICAgICAgICAgICAgImltcG9ydHMgXCIiICsKKyAgICAgICAgICAgICAgICBmaWxlLT5kZXBlbmRlbmN5KGkpLT5uYW1lKCkgKyAiXCIgd2hpY2ggaXMuIik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoZmlsZS0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzMpIHsKKyAgICBWYWxpZGF0ZVByb3RvMyhmaWxlLCBwcm90byk7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVQcm90bzMoRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKKyAgICBWYWxpZGF0ZVByb3RvM0ZpZWxkKGZpbGUtPmV4dGVuc2lvbnNfICsgaSwgcHJvdG8uZXh0ZW5zaW9uKGkpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBWYWxpZGF0ZVByb3RvM01lc3NhZ2UoZmlsZS0+bWVzc2FnZV90eXBlc18gKyBpLCBwcm90by5tZXNzYWdlX3R5cGUoaSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+ZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIFZhbGlkYXRlUHJvdG8zRW51bShmaWxlLT5lbnVtX3R5cGVzXyArIGksIHByb3RvLmVudW1fdHlwZShpKSk7CisgIH0KK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIFRvTG93ZXJjYXNlV2l0aG91dFVuZGVyc2NvcmVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgZm9yIChjaGFyIGNoYXJhY3RlciA6IG5hbWUpIHsKKyAgICBpZiAoY2hhcmFjdGVyICE9ICdfJykgeworICAgICAgaWYgKGNoYXJhY3RlciA+PSAnQScgJiYgY2hhcmFjdGVyIDw9ICdaJykgeworICAgICAgICByZXN1bHQucHVzaF9iYWNrKGNoYXJhY3RlciAtICdBJyArICdhJyk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQucHVzaF9iYWNrKGNoYXJhY3Rlcik7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlUHJvdG8zTWVzc2FnZShEZXNjcmlwdG9yKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBWYWxpZGF0ZVByb3RvM01lc3NhZ2UobWVzc2FnZS0+bmVzdGVkX3R5cGVzXyArIGksIHByb3RvLm5lc3RlZF90eXBlKGkpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmVudW1fdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBWYWxpZGF0ZVByb3RvM0VudW0obWVzc2FnZS0+ZW51bV90eXBlc18gKyBpLCBwcm90by5lbnVtX3R5cGUoaSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgVmFsaWRhdGVQcm90bzNGaWVsZChtZXNzYWdlLT5maWVsZHNfICsgaSwgcHJvdG8uZmllbGQoaSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZXh0ZW5zaW9uX2NvdW50KCk7ICsraSkgeworICAgIFZhbGlkYXRlUHJvdG8zRmllbGQobWVzc2FnZS0+ZXh0ZW5zaW9uc18gKyBpLCBwcm90by5leHRlbnNpb24oaSkpOworICB9CisgIGlmIChtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBBZGRFcnJvcihtZXNzYWdlLT5mdWxsX25hbWUoKSwgcHJvdG8uZXh0ZW5zaW9uX3JhbmdlKDApLAorICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICJFeHRlbnNpb24gcmFuZ2VzIGFyZSBub3QgYWxsb3dlZCBpbiBwcm90bzMuIik7CisgIH0KKyAgaWYgKG1lc3NhZ2UtPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CisgICAgLy8gVXNpbmcgTWVzc2FnZVNldCBkb2Vzbid0IG1ha2Ugc2Vuc2Ugc2luY2Ugd2UgZGlzYWxsb3cgZXh0ZW5zaW9ucy4KKyAgICBBZGRFcnJvcihtZXNzYWdlLT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAiTWVzc2FnZVNldCBpcyBub3Qgc3VwcG9ydGVkIGluIHByb3RvMy4iKTsKKyAgfQorCisgIC8vIEluIHByb3RvMywgd2UgcmVqZWN0IGZpZWxkIG5hbWVzIGlmIHRoZXkgY29uZmxpY3QgaW4gY2FtZWxDYXNlLgorICAvLyBOb3RlIHRoYXQgd2UgY3VycmVudGx5IGVuZm9yY2UgYSBzdHJpY3RlciBydWxlOiBGaWVsZCBuYW1lcyBtdXN0IGJlCisgIC8vIHVuaXF1ZSBhZnRlciBiZWluZyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIHdpdGggdW5kZXJzY29yZXMgcmVtb3ZlZC4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IG5hbWVfdG9fZmllbGQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgc3RkOjpzdHJpbmcgbG93ZXJjYXNlX25hbWUgPQorICAgICAgICBUb0xvd2VyY2FzZVdpdGhvdXRVbmRlcnNjb3JlcyhtZXNzYWdlLT5maWVsZChpKS0+bmFtZSgpKTsKKyAgICBpZiAobmFtZV90b19maWVsZC5maW5kKGxvd2VyY2FzZV9uYW1lKSAhPSBuYW1lX3RvX2ZpZWxkLmVuZCgpKSB7CisgICAgICBBZGRFcnJvcihtZXNzYWdlLT5mdWxsX25hbWUoKSwgcHJvdG8uZmllbGQoaSksCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgICAiVGhlIEpTT04gY2FtZWwtY2FzZSBuYW1lIG9mIGZpZWxkIFwiIiArCisgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+ZmllbGQoaSktPm5hbWUoKSArICJcIiBjb25mbGljdHMgd2l0aCBmaWVsZCBcIiIgKworICAgICAgICAgICAgICAgICAgIG5hbWVfdG9fZmllbGRbbG93ZXJjYXNlX25hbWVdLT5uYW1lKCkgKyAiXCIuIFRoaXMgaXMgbm90ICIgKworICAgICAgICAgICAgICAgICAgICJhbGxvd2VkIGluIHByb3RvMy4iKTsKKyAgICB9IGVsc2UgeworICAgICAgbmFtZV90b19maWVsZFtsb3dlcmNhc2VfbmFtZV0gPSBtZXNzYWdlLT5maWVsZChpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVQcm90bzNGaWVsZChGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSAmJgorICAgICAgIUFsbG93ZWRFeHRlbmRlZUluUHJvdG8zKGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+ZnVsbF9uYW1lKCkpKSB7CisgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVYVEVOREVFLAorICAgICAgICAgICAgICJFeHRlbnNpb25zIGluIHByb3RvMyBhcmUgb25seSBhbGxvd2VkIGZvciBkZWZpbmluZyBvcHRpb25zLiIpOworICB9CisgIGlmIChmaWVsZC0+aXNfcmVxdWlyZWQoKSkgeworICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAiUmVxdWlyZWQgZmllbGRzIGFyZSBub3QgYWxsb3dlZCBpbiBwcm90bzMuIik7CisgIH0KKyAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkRFRkFVTFRfVkFMVUUsCisgICAgICAgICAgICAgIkV4cGxpY2l0IGRlZmF1bHQgdmFsdWVzIGFyZSBub3QgYWxsb3dlZCBpbiBwcm90bzMuIik7CisgIH0KKyAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNICYmCisgICAgICBmaWVsZC0+ZW51bV90eXBlKCkgJiYKKyAgICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+ZmlsZSgpLT5zeW50YXgoKSAhPSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMyAmJgorICAgICAgZmllbGQtPmVudW1fdHlwZSgpLT5maWxlKCktPnN5bnRheCgpICE9IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfVU5LTk9XTikgeworICAgIC8vIFByb3RvMyBtZXNzYWdlcyBjYW4gb25seSB1c2UgUHJvdG8zIGVudW0gdHlwZXM7IG90aGVyd2lzZSB3ZSBjYW4ndAorICAgIC8vIGd1YXJhbnRlZSB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlIGlzIHplcm8uCisgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICJFbnVtIHR5cGUgXCIiICsgZmllbGQtPmVudW1fdHlwZSgpLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAgICAgICJcIiBpcyBub3QgYSBwcm90bzMgZW51bSwgYnV0IGlzIHVzZWQgaW4gXCIiICsKKyAgICAgICAgICAgICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAgICAgICJcIiB3aGljaCBpcyBhIHByb3RvMyBtZXNzYWdlIHR5cGUuIik7CisgIH0KKyAgaWYgKGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICJHcm91cHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gcHJvdG8zIHN5bnRheC4iKTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZVByb3RvM0VudW0oRW51bURlc2NyaXB0b3IqIGVubSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBpZiAoZW5tLT52YWx1ZV9jb3VudCgpID4gMCAmJiBlbm0tPnZhbHVlKDApLT5udW1iZXIoKSAhPSAwKSB7CisgICAgQWRkRXJyb3IoZW5tLT5mdWxsX25hbWUoKSwgcHJvdG8udmFsdWUoMCksCisgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgIlRoZSBmaXJzdCBlbnVtIHZhbHVlIG11c3QgYmUgemVybyBpbiBwcm90bzMuIik7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVNZXNzYWdlT3B0aW9ucyhEZXNjcmlwdG9yKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShtZXNzYWdlLCBmaWVsZCwgRmllbGQpOworICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkobWVzc2FnZSwgbmVzdGVkX3R5cGUsIE1lc3NhZ2UpOworICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkobWVzc2FnZSwgZW51bV90eXBlLCBFbnVtKTsKKyAgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKG1lc3NhZ2UsIGV4dGVuc2lvbiwgRmllbGQpOworCisgIGNvbnN0IGludDY0X3QgbWF4X2V4dGVuc2lvbl9yYW5nZSA9CisgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihtZXNzYWdlLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlcik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7ICsraSkgeworICAgIGlmIChtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2UoaSktPmVuZCA+IG1heF9leHRlbnNpb25fcmFuZ2UgKyAxKSB7CisgICAgICBBZGRFcnJvcihtZXNzYWdlLT5mdWxsX25hbWUoKSwgcHJvdG8uZXh0ZW5zaW9uX3JhbmdlKGkpLAorICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKCJFeHRlbnNpb24gbnVtYmVycyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICQwLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9leHRlbnNpb25fcmFuZ2UpKTsKKyAgICB9CisKKyAgICBWYWxpZGF0ZUV4dGVuc2lvblJhbmdlT3B0aW9ucyhtZXNzYWdlLT5mdWxsX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2VzXyArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG8uZXh0ZW5zaW9uX3JhbmdlKGkpKTsKKyAgfQorfQorCisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlRmllbGRPcHRpb25zKAorICAgIEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBpZiAocG9vbF8tPmxhemlseV9idWlsZF9kZXBlbmRlbmNpZXNfICYmICghZmllbGQgfHwgIWZpZWxkLT5tZXNzYWdlX3R5cGUoKSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gT25seSBtZXNzYWdlIHR5cGUgZmllbGRzIG1heSBiZSBsYXp5LgorICBpZiAoZmllbGQtPm9wdGlvbnMoKS5sYXp5KCkgfHwgZmllbGQtPm9wdGlvbnMoKS51bnZlcmlmaWVkX2xhenkoKSkgeworICAgIGlmIChmaWVsZC0+dHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFKSB7CisgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgICAiW2xhenkgPSB0cnVlXSBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIHN1Ym1lc3NhZ2UgZmllbGRzLiIpOworICAgIH0KKyAgfQorCisgIC8vIE9ubHkgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkcyBtYXkgYmUgcGFja2VkLgorICBpZiAoZmllbGQtPm9wdGlvbnMoKS5wYWNrZWQoKSAmJiAhZmllbGQtPmlzX3BhY2thYmxlKCkpIHsKKyAgICBBZGRFcnJvcigKKyAgICAgICAgZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAiW3BhY2tlZCA9IHRydWVdIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkcy4iKTsKKyAgfQorCisgIC8vIE5vdGU6ICBEZWZhdWx0IGluc3RhbmNlIG1heSBub3QgeWV0IGJlIGluaXRpYWxpemVkIGhlcmUsIHNvIHdlIGhhdmUgdG8KKyAgLy8gICBhdm9pZCByZWFkaW5nIGZyb20gaXQuCisgIGlmIChmaWVsZC0+Y29udGFpbmluZ190eXBlXyAhPSBudWxscHRyICYmCisgICAgICAmZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5vcHRpb25zKCkgIT0KKyAgICAgICAgICAmTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSAmJgorICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgeworICAgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAgIGlmICghZmllbGQtPmlzX29wdGlvbmFsKCkgfHwKKyAgICAgICAgICBmaWVsZC0+dHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFKSB7CisgICAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAgICAgIkV4dGVuc2lvbnMgb2YgTWVzc2FnZVNldHMgbXVzdCBiZSBvcHRpb25hbCBtZXNzYWdlcy4iKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAorICAgICAgICAgICAgICAgIk1lc3NhZ2VTZXRzIGNhbm5vdCBoYXZlIGZpZWxkcywgb25seSBleHRlbnNpb25zLiIpOworICAgIH0KKyAgfQorCisgIC8vIExpdGUgZXh0ZW5zaW9ucyBjYW4gb25seSBiZSBvZiBMaXRlIHR5cGVzLgorICBpZiAoSXNMaXRlKGZpZWxkLT5maWxlKCkpICYmIGZpZWxkLT5jb250YWluaW5nX3R5cGVfICE9IG51bGxwdHIgJiYKKyAgICAgICFJc0xpdGUoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5maWxlKCkpKSB7CisgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVYVEVOREVFLAorICAgICAgICAgICAgICJFeHRlbnNpb25zIHRvIG5vbi1saXRlIHR5cGVzIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGluIG5vbi1saXRlICIKKyAgICAgICAgICAgICAiZmlsZXMuICBOb3RlIHRoYXQgeW91IGNhbm5vdCBleHRlbmQgYSBub24tbGl0ZSB0eXBlIHRvIGNvbnRhaW4gIgorICAgICAgICAgICAgICJhIGxpdGUgdHlwZSwgYnV0IHRoZSByZXZlcnNlIGlzIGFsbG93ZWQuIik7CisgIH0KKworICAvLyBWYWxpZGF0ZSBtYXAgdHlwZXMuCisgIGlmIChmaWVsZC0+aXNfbWFwKCkpIHsKKyAgICBpZiAoIVZhbGlkYXRlTWFwRW50cnkoZmllbGQsIHByb3RvKSkgeworICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICAgIm1hcF9lbnRyeSBzaG91bGQgbm90IGJlIHNldCBleHBsaWNpdGx5LiBVc2UgbWFwPEtleVR5cGUsICIKKyAgICAgICAgICAgICAgICJWYWx1ZVR5cGU+IGluc3RlYWQuIik7CisgICAgfQorICB9CisKKyAgVmFsaWRhdGVKU1R5cGUoZmllbGQsIHByb3RvKTsKKworICAvLyBqc29uX25hbWUgb3B0aW9uIGlzIG5vdCBhbGxvd2VkIG9uIGV4dGVuc2lvbiBmaWVsZHMuIE5vdGUgdGhhdCB0aGUKKyAgLy8ganNvbl9uYW1lIGZpZWxkIGluIEZpZWxkRGVzY3JpcHRvclByb3RvIGlzIGFsd2F5cyBwb3B1bGF0ZWQgYnkgcHJvdG9jCisgIC8vIHdoZW4gaXQgc2VuZHMgZGVzY3JpcHRvciBkYXRhIHRvIHBsdWdpbnMgKGNhbGN1bGF0ZWQgZnJvbSBmaWVsZCBuYW1lIGlmCisgIC8vIHRoZSBvcHRpb24gaXMgbm90IGV4cGxpY2l0bHkgc2V0KSBzbyB3ZSBjYW4ndCByZWx5IG9uIGl0cyBwcmVzZW5jZSB0bworICAvLyBkZXRlcm1pbmUgd2hldGhlciB0aGUganNvbl9uYW1lIG9wdGlvbiBpcyBzZXQgb24gdGhlIGZpZWxkLiBIZXJlIHdlCisgIC8vIGNvbXBhcmUgaXQgYWdhaW5zdCB0aGUgZGVmYXVsdCBjYWxjdWxhdGVkIGpzb25fbmFtZSB2YWx1ZSBhbmQgY29uc2lkZXIKKyAgLy8gdGhlIG9wdGlvbiBzZXQgaWYgdGhleSBhcmUgZGlmZmVyZW50LiBUaGlzIHdvbid0IGNhdGNoIHRoZSBjYXNlIHdoZW4KKyAgLy8gYW4gdXNlciBleHBsaWNpdGx5IHNldHMganNvbl9uYW1lIHRvIHRoZSBkZWZhdWx0IHZhbHVlLCBidXQgc2hvdWxkIGJlCisgIC8vIGdvb2QgZW5vdWdoIHRvIGNhdGNoIGNvbW1vbiBtaXN1c2VzLgorICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpICYmCisgICAgICAoZmllbGQtPmhhc19qc29uX25hbWUoKSAmJgorICAgICAgIGZpZWxkLT5qc29uX25hbWUoKSAhPSBUb0pzb25OYW1lKGZpZWxkLT5uYW1lKCkpKSkgeworICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPUFRJT05fTkFNRSwKKyAgICAgICAgICAgICAib3B0aW9uIGpzb25fbmFtZSBpcyBub3QgYWxsb3dlZCBvbiBleHRlbnNpb24gZmllbGRzLiIpOworICB9CisKK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVFbnVtT3B0aW9ucyhFbnVtRGVzY3JpcHRvciogZW5tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkoZW5tLCB2YWx1ZSwgRW51bVZhbHVlKTsKKyAgaWYgKCFlbm0tPm9wdGlvbnMoKS5oYXNfYWxsb3dfYWxpYXMoKSB8fCAhZW5tLT5vcHRpb25zKCkuYWxsb3dfYWxpYXMoKSkgeworICAgIHN0ZDo6bWFwPGludCwgc3RkOjpzdHJpbmc+IHVzZWRfdmFsdWVzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5tLT52YWx1ZV9jb3VudCgpOyArK2kpIHsKKyAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUgPSBlbm0tPnZhbHVlKGkpOworICAgICAgaWYgKHVzZWRfdmFsdWVzLmZpbmQoZW51bV92YWx1ZS0+bnVtYmVyKCkpICE9IHVzZWRfdmFsdWVzLmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yID0KKyAgICAgICAgICAgICJcIiIgKyBlbnVtX3ZhbHVlLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAiXCIgdXNlcyB0aGUgc2FtZSBlbnVtIHZhbHVlIGFzIFwiIiArCisgICAgICAgICAgICB1c2VkX3ZhbHVlc1tlbnVtX3ZhbHVlLT5udW1iZXIoKV0gKworICAgICAgICAgICAgIlwiLiBJZiB0aGlzIGlzIGludGVuZGVkLCBzZXQgIgorICAgICAgICAgICAgIidvcHRpb24gYWxsb3dfYWxpYXMgPSB0cnVlOycgdG8gdGhlIGVudW0gZGVmaW5pdGlvbi4iOworICAgICAgICBpZiAoIWVubS0+b3B0aW9ucygpLmFsbG93X2FsaWFzKCkpIHsKKyAgICAgICAgICAvLyBHZW5lcmF0ZSBlcnJvciBpZiBkdXBsaWNhdGVkIGVudW0gdmFsdWVzIGFyZSBleHBsaWNpdGx5IGRpc2FsbG93ZWQuCisgICAgICAgICAgQWRkRXJyb3IoZW5tLT5mdWxsX25hbWUoKSwgcHJvdG8udmFsdWUoaSksCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdXNlZF92YWx1ZXNbZW51bV92YWx1ZS0+bnVtYmVyKCldID0gZW51bV92YWx1ZS0+ZnVsbF9uYW1lKCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlRW51bVZhbHVlT3B0aW9ucygKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKiAvKiBlbnVtX3ZhbHVlICovLAorICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgLyogcHJvdG8gKi8pIHsKKyAgLy8gTm90aGluZyB0byBkbyBzbyBmYXIuCit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlRXh0ZW5zaW9uUmFuZ2VPcHRpb25zKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsX25hbWUsIERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiBleHRlbnNpb25fcmFuZ2UsCisgICAgY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBwcm90bykgeworICAodm9pZClmdWxsX25hbWU7ICAgICAgICAvLyBQYXJhbWV0ZXIgaXMgdXNlZCBieSBHb29nbGUtaW50ZXJuYWwgY29kZS4KKyAgKHZvaWQpZXh0ZW5zaW9uX3JhbmdlOyAgLy8gUGFyYW1ldGVyIGlzIHVzZWQgYnkgR29vZ2xlLWludGVybmFsIGNvZGUuCit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlU2VydmljZU9wdGlvbnMoCisgICAgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UsIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIGlmIChJc0xpdGUoc2VydmljZS0+ZmlsZSgpKSAmJgorICAgICAgKHNlcnZpY2UtPmZpbGUoKS0+b3B0aW9ucygpLmNjX2dlbmVyaWNfc2VydmljZXMoKSB8fAorICAgICAgIHNlcnZpY2UtPmZpbGUoKS0+b3B0aW9ucygpLmphdmFfZ2VuZXJpY19zZXJ2aWNlcygpKSkgeworICAgIEFkZEVycm9yKHNlcnZpY2UtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAorICAgICAgICAgICAgICJGaWxlcyB3aXRoIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSBjYW5ub3QgZGVmaW5lIHNlcnZpY2VzICIKKyAgICAgICAgICAgICAidW5sZXNzIHlvdSBzZXQgYm90aCBvcHRpb25zIGNjX2dlbmVyaWNfc2VydmljZXMgYW5kICIKKyAgICAgICAgICAgICAiamF2YV9nZW5lcmljX3NlcnZpY2VzIHRvIGZhbHNlLiIpOworICB9CisKKyAgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKHNlcnZpY2UsIG1ldGhvZCwgTWV0aG9kKTsKK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVNZXRob2RPcHRpb25zKAorICAgIE1ldGhvZERlc2NyaXB0b3IqIC8qIG1ldGhvZCAqLywgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiAvKiBwcm90byAqLykgeworICAvLyBOb3RoaW5nIHRvIGRvIHNvIGZhci4KK30KKworYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVNYXBFbnRyeShGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKKyAgaWYgKCAgLy8gTXVzdCBub3QgY29udGFpbiBleHRlbnNpb25zLCBleHRlbnNpb24gcmFuZ2Ugb3IgbmVzdGVkIG1lc3NhZ2Ugb3IKKyAgICAgICAgLy8gZW51bXMKKyAgICAgIG1lc3NhZ2UtPmV4dGVuc2lvbl9jb3VudCgpICE9IDAgfHwKKyAgICAgIGZpZWxkLT5sYWJlbCgpICE9IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQgfHwKKyAgICAgIG1lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpICE9IDAgfHwKKyAgICAgIG1lc3NhZ2UtPm5lc3RlZF90eXBlX2NvdW50KCkgIT0gMCB8fCBtZXNzYWdlLT5lbnVtX3R5cGVfY291bnQoKSAhPSAwIHx8CisgICAgICAvLyBNdXN0IGNvbnRhaW4gZXhhY3RseSB0d28gZmllbGRzCisgICAgICBtZXNzYWdlLT5maWVsZF9jb3VudCgpICE9IDIgfHwKKyAgICAgIC8vIEZpZWxkIG5hbWUgYW5kIG1lc3NhZ2UgbmFtZSBtdXN0IG1hdGNoCisgICAgICBtZXNzYWdlLT5uYW1lKCkgIT0gVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgZmFsc2UpICsgIkVudHJ5IiB8fAorICAgICAgLy8gRW50cnkgbWVzc2FnZSBtdXN0IGJlIGluIHRoZSBzYW1lIGNvbnRhaW5pbmcgdHlwZSBvZiB0aGUgZmllbGQuCisgICAgICBmaWVsZC0+Y29udGFpbmluZ190eXBlKCkgIT0gbWVzc2FnZS0+Y29udGFpbmluZ190eXBlKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGtleSA9IG1lc3NhZ2UtPm1hcF9rZXkoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZSA9IG1lc3NhZ2UtPm1hcF92YWx1ZSgpOworICBpZiAoa2V5LT5sYWJlbCgpICE9IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfT1BUSU9OQUwgfHwga2V5LT5udW1iZXIoKSAhPSAxIHx8CisgICAgICBrZXktPm5hbWUoKSAhPSAia2V5IikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAodmFsdWUtPmxhYmVsKCkgIT0gRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTCB8fAorICAgICAgdmFsdWUtPm51bWJlcigpICE9IDIgfHwgdmFsdWUtPm5hbWUoKSAhPSAidmFsdWUiKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQ2hlY2sga2V5IHR5cGVzIGFyZSBsZWdhbC4KKyAgc3dpdGNoIChrZXktPnR5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU06CisgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgICAiS2V5IGluIG1hcCBmaWVsZHMgY2Fubm90IGJlIGVudW0gdHlwZXMuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GTE9BVDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEU6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzoKKyAgICAgIEFkZEVycm9yKAorICAgICAgICAgIGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAiS2V5IGluIG1hcCBmaWVsZHMgY2Fubm90IGJlIGZsb2F0L2RvdWJsZSwgYnl0ZXMgb3IgbWVzc2FnZSB0eXBlcy4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0w6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6CisgICAgICAvLyBMZWdhbCBjYXNlcworICAgICAgYnJlYWs7CisgICAgICAvLyBEbyBub3QgYWRkIGEgZGVmYXVsdCwgc28gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBjb21wbGFpbiB3aGVuIG5ldyB0eXBlcworICAgICAgLy8gYXJlIGFkZGVkLgorICB9CisKKyAgaWYgKHZhbHVlLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU0pIHsKKyAgICBpZiAodmFsdWUtPmVudW1fdHlwZSgpLT52YWx1ZSgwKS0+bnVtYmVyKCkgIT0gMCkgeworICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICAgIkVudW0gdmFsdWUgaW4gbWFwIG11c3QgZGVmaW5lIDAgYXMgdGhlIGZpcnN0IHZhbHVlLiIpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpEZXRlY3RNYXBDb25mbGljdHMoY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBjb25zdCBEZXNjcmlwdG9yKj4gc2Vlbl90eXBlczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBuZXN0ZWQgPSBtZXNzYWdlLT5uZXN0ZWRfdHlwZShpKTsKKyAgICBzdGQ6OnBhaXI8c3RkOjptYXA8c3RkOjpzdHJpbmcsIGNvbnN0IERlc2NyaXB0b3IqPjo6aXRlcmF0b3IsIGJvb2w+IHJlc3VsdCA9CisgICAgICAgIHNlZW5fdHlwZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG5lc3RlZC0+bmFtZSgpLCBuZXN0ZWQpKTsKKyAgICBpZiAoIXJlc3VsdC5zZWNvbmQpIHsKKyAgICAgIGlmIChyZXN1bHQuZmlyc3QtPnNlY29uZC0+b3B0aW9ucygpLm1hcF9lbnRyeSgpIHx8CisgICAgICAgICAgbmVzdGVkLT5vcHRpb25zKCkubWFwX2VudHJ5KCkpIHsKKyAgICAgICAgQWRkRXJyb3IobWVzc2FnZS0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgICAgICJFeHBhbmRlZCBtYXAgZW50cnkgdHlwZSAiICsgbmVzdGVkLT5uYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgIiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBuZXN0ZWQgbWVzc2FnZSB0eXBlLiIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gUmVjdXJzaXZlbHkgdGVzdCBvbiB0aGUgbmVzdGVkIHR5cGVzLgorICAgIERldGVjdE1hcENvbmZsaWN0cyhtZXNzYWdlLT5uZXN0ZWRfdHlwZShpKSwgcHJvdG8ubmVzdGVkX3R5cGUoaSkpOworICB9CisgIC8vIENoZWNrIGZvciBjb25mbGljdGVkIGZpZWxkIG5hbWVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmZpZWxkX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBtZXNzYWdlLT5maWVsZChpKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgY29uc3QgRGVzY3JpcHRvcio+OjppdGVyYXRvciBpdGVyID0KKyAgICAgICAgc2Vlbl90eXBlcy5maW5kKGZpZWxkLT5uYW1lKCkpOworICAgIGlmIChpdGVyICE9IHNlZW5fdHlwZXMuZW5kKCkgJiYgaXRlci0+c2Vjb25kLT5vcHRpb25zKCkubWFwX2VudHJ5KCkpIHsKKyAgICAgIEFkZEVycm9yKG1lc3NhZ2UtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICJFeHBhbmRlZCBtYXAgZW50cnkgdHlwZSAiICsgaXRlci0+c2Vjb25kLT5uYW1lKCkgKworICAgICAgICAgICAgICAgICAgICIgY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgZmllbGQuIik7CisgICAgfQorICB9CisgIC8vIENoZWNrIGZvciBjb25mbGljdGVkIGVudW0gbmFtZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX2Rlc2MgPSBtZXNzYWdlLT5lbnVtX3R5cGUoaSk7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGNvbnN0IERlc2NyaXB0b3IqPjo6aXRlcmF0b3IgaXRlciA9CisgICAgICAgIHNlZW5fdHlwZXMuZmluZChlbnVtX2Rlc2MtPm5hbWUoKSk7CisgICAgaWYgKGl0ZXIgIT0gc2Vlbl90eXBlcy5lbmQoKSAmJiBpdGVyLT5zZWNvbmQtPm9wdGlvbnMoKS5tYXBfZW50cnkoKSkgeworICAgICAgQWRkRXJyb3IobWVzc2FnZS0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAorICAgICAgICAgICAgICAgIkV4cGFuZGVkIG1hcCBlbnRyeSB0eXBlICIgKyBpdGVyLT5zZWNvbmQtPm5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgIiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBlbnVtIHR5cGUuIik7CisgICAgfQorICB9CisgIC8vIENoZWNrIGZvciBjb25mbGljdGVkIG9uZW9mIG5hbWVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPm9uZW9mX2RlY2xfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZXNjID0gbWVzc2FnZS0+b25lb2ZfZGVjbChpKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgY29uc3QgRGVzY3JpcHRvcio+OjppdGVyYXRvciBpdGVyID0KKyAgICAgICAgc2Vlbl90eXBlcy5maW5kKG9uZW9mX2Rlc2MtPm5hbWUoKSk7CisgICAgaWYgKGl0ZXIgIT0gc2Vlbl90eXBlcy5lbmQoKSAmJiBpdGVyLT5zZWNvbmQtPm9wdGlvbnMoKS5tYXBfZW50cnkoKSkgeworICAgICAgQWRkRXJyb3IobWVzc2FnZS0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAorICAgICAgICAgICAgICAgIkV4cGFuZGVkIG1hcCBlbnRyeSB0eXBlICIgKyBpdGVyLT5zZWNvbmQtPm5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgIiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBvbmVvZiB0eXBlLiIpOworICAgIH0KKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZUpTVHlwZShGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIEZpZWxkT3B0aW9uczo6SlNUeXBlIGpzdHlwZSA9IGZpZWxkLT5vcHRpb25zKCkuanN0eXBlKCk7CisgIC8vIFRoZSBkZWZhdWx0IGlzIGFsd2F5cyBhY2NlcHRhYmxlLgorICBpZiAoanN0eXBlID09IEZpZWxkT3B0aW9uczo6SlNfTk9STUFMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7CisgICAgLy8gSW50ZWdyYWwgNjQtYml0IHR5cGVzIG1heSBiZSByZXByZXNlbnRlZCBhcyBKYXZhU2NyaXB0IG51bWJlcnMgb3IKKyAgICAvLyBzdHJpbmdzLgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDoKKyAgICAgIGlmIChqc3R5cGUgPT0gRmllbGRPcHRpb25zOjpKU19TVFJJTkcgfHwKKyAgICAgICAgICBqc3R5cGUgPT0gRmllbGRPcHRpb25zOjpKU19OVU1CRVIpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICAgIklsbGVnYWwganN0eXBlIGZvciBpbnQ2NCwgdWludDY0LCBzaW50NjQsIGZpeGVkNjQgIgorICAgICAgICAgICAgICAgIm9yIHNmaXhlZDY0IGZpZWxkOiAiICsKKyAgICAgICAgICAgICAgICAgICBGaWVsZE9wdGlvbnNfSlNUeXBlX2Rlc2NyaXB0b3IoKS0+dmFsdWUoanN0eXBlKS0+bmFtZSgpKTsKKyAgICAgIGJyZWFrOworCisgICAgLy8gTm8gb3RoZXIgdHlwZXMgcGVybWl0IGEganN0eXBlIG9wdGlvbi4KKyAgICBkZWZhdWx0OgorICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICAgImpzdHlwZSBpcyBvbmx5IGFsbG93ZWQgb24gaW50NjQsIHVpbnQ2NCwgc2ludDY0LCBmaXhlZDY0ICIKKyAgICAgICAgICAgICAgICJvciBzZml4ZWQ2NCBmaWVsZHMuIik7CisgICAgICBicmVhazsKKyAgfQorfQorCisjdW5kZWYgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpPcHRpb25JbnRlcnByZXRlcigKKyAgICBEZXNjcmlwdG9yQnVpbGRlciogYnVpbGRlcikKKyAgICA6IGJ1aWxkZXJfKGJ1aWxkZXIpIHsKKyAgR09PR0xFX0NIRUNLKGJ1aWxkZXJfKTsKK30KKworRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjp+T3B0aW9uSW50ZXJwcmV0ZXIoKSB7fQorCitib29sIERlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6SW50ZXJwcmV0T3B0aW9ucygKKyAgICBPcHRpb25zVG9JbnRlcnByZXQqIG9wdGlvbnNfdG9faW50ZXJwcmV0KSB7CisgIC8vIE5vdGUgdGhhdCB0aGVzZSBtYXkgYmUgaW4gZGlmZmVyZW50IHBvb2xzLCBzbyB3ZSBjYW4ndCB1c2UgdGhlIHNhbWUKKyAgLy8gZGVzY3JpcHRvciBhbmQgcmVmbGVjdGlvbiBvYmplY3RzIG9uIGJvdGguCisgIE1lc3NhZ2UqIG9wdGlvbnMgPSBvcHRpb25zX3RvX2ludGVycHJldC0+b3B0aW9uczsKKyAgY29uc3QgTWVzc2FnZSogb3JpZ2luYWxfb3B0aW9ucyA9IG9wdGlvbnNfdG9faW50ZXJwcmV0LT5vcmlnaW5hbF9vcHRpb25zOworCisgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgIG9wdGlvbnNfdG9faW50ZXJwcmV0XyA9IG9wdGlvbnNfdG9faW50ZXJwcmV0OworCisgIC8vIEZpbmQgdGhlIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIGZpZWxkIGluIHRoZSBtdXRhYmxlIGNvcHkgb2YgdGhlIG9wdGlvbnMKKyAgLy8gYW5kIGNsZWFyIHRoZW0sIHNpbmNlIHdlJ3JlIGFib3V0IHRvIGludGVycHJldCB0aGVtLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHVuaW50ZXJwcmV0ZWRfb3B0aW9uc19maWVsZCA9CisgICAgICBvcHRpb25zLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgidW5pbnRlcnByZXRlZF9vcHRpb24iKTsKKyAgR09PR0xFX0NIRUNLKHVuaW50ZXJwcmV0ZWRfb3B0aW9uc19maWVsZCAhPSBudWxscHRyKQorICAgICAgPDwgIk5vIGZpZWxkIG5hbWVkIFwidW5pbnRlcnByZXRlZF9vcHRpb25cIiBpbiB0aGUgT3B0aW9ucyBwcm90by4iOworICBvcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPkNsZWFyRmllbGQob3B0aW9ucywgdW5pbnRlcnByZXRlZF9vcHRpb25zX2ZpZWxkKTsKKworICBzdGQ6OnZlY3RvcjxpbnQ+IHNyY19wYXRoID0gb3B0aW9uc190b19pbnRlcnByZXQtPmVsZW1lbnRfcGF0aDsKKyAgc3JjX3BhdGgucHVzaF9iYWNrKHVuaW50ZXJwcmV0ZWRfb3B0aW9uc19maWVsZC0+bnVtYmVyKCkpOworCisgIC8vIEZpbmQgdGhlIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIGZpZWxkIGluIHRoZSBvcmlnaW5hbCBvcHRpb25zLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG9yaWdpbmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uc19maWVsZCA9CisgICAgICBvcmlnaW5hbF9vcHRpb25zLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgKKyAgICAgICAgICAidW5pbnRlcnByZXRlZF9vcHRpb24iKTsKKyAgR09PR0xFX0NIRUNLKG9yaWdpbmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uc19maWVsZCAhPSBudWxscHRyKQorICAgICAgPDwgIk5vIGZpZWxkIG5hbWVkIFwidW5pbnRlcnByZXRlZF9vcHRpb25cIiBpbiB0aGUgT3B0aW9ucyBwcm90by4iOworCisgIGNvbnN0IGludCBudW1fdW5pbnRlcnByZXRlZF9vcHRpb25zID0KKyAgICAgIG9yaWdpbmFsX29wdGlvbnMtPkdldFJlZmxlY3Rpb24oKS0+RmllbGRTaXplKAorICAgICAgICAgICpvcmlnaW5hbF9vcHRpb25zLCBvcmlnaW5hbF91bmludGVycHJldGVkX29wdGlvbnNfZmllbGQpOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV91bmludGVycHJldGVkX29wdGlvbnM7ICsraSkgeworICAgIHNyY19wYXRoLnB1c2hfYmFjayhpKTsKKyAgICB1bmludGVycHJldGVkX29wdGlvbl8gPSBkb3duX2Nhc3Q8Y29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbio+KAorICAgICAgICAmb3JpZ2luYWxfb3B0aW9ucy0+R2V0UmVmbGVjdGlvbigpLT5HZXRSZXBlYXRlZE1lc3NhZ2UoCisgICAgICAgICAgICAqb3JpZ2luYWxfb3B0aW9ucywgb3JpZ2luYWxfdW5pbnRlcnByZXRlZF9vcHRpb25zX2ZpZWxkLCBpKSk7CisgICAgaWYgKCFJbnRlcnByZXRTaW5nbGVPcHRpb24ob3B0aW9ucywgc3JjX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc190b19pbnRlcnByZXQtPmVsZW1lbnRfcGF0aCkpIHsKKyAgICAgIC8vIEVycm9yIGFscmVhZHkgYWRkZWQgYnkgSW50ZXJwcmV0U2luZ2xlT3B0aW9uKCkuCisgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHNyY19wYXRoLnBvcF9iYWNrKCk7CisgIH0KKyAgLy8gUmVzZXQgdGhlc2UsIHNvIHdlIGRvbid0IGhhdmUgYW55IGRhbmdsaW5nIHBvaW50ZXJzLgorICB1bmludGVycHJldGVkX29wdGlvbl8gPSBudWxscHRyOworICBvcHRpb25zX3RvX2ludGVycHJldF8gPSBudWxscHRyOworCisgIGlmICghZmFpbGVkKSB7CisgICAgLy8gSW50ZXJwcmV0U2luZ2xlT3B0aW9uKCkgYWRkZWQgdGhlIGludGVycHJldGVkIG9wdGlvbnMgaW4gdGhlCisgICAgLy8gVW5rbm93bkZpZWxkU2V0LCBpbiBjYXNlIHRoZSBvcHRpb24gaXNuJ3QgeWV0IGtub3duIHRvIHVzLiAgTm93IHdlCisgICAgLy8gc2VyaWFsaXplIHRoZSBvcHRpb25zIG1lc3NhZ2UgYW5kIGRlc2VyaWFsaXplIGl0IGJhY2suICBUaGF0IHdheSwgYW55CisgICAgLy8gb3B0aW9uIGZpZWxkcyB0aGF0IHdlIGRvIGhhcHBlbiB0byBrbm93IGFib3V0IHdpbGwgZ2V0IG1vdmVkIGZyb20gdGhlCisgICAgLy8gVW5rbm93bkZpZWxkU2V0IGludG8gdGhlIHJlYWwgZmllbGRzLCBhbmQgdGh1cyBiZSBhdmFpbGFibGUgcmlnaHQgYXdheS4KKyAgICAvLyBJZiB0aGV5IGFyZSBub3Qga25vd24sIHRoYXQncyBPSyB0b28uIFRoZXkgd2lsbCBnZXQgcmVwYXJzZWQgaW50byB0aGUKKyAgICAvLyBVbmtub3duRmllbGRTZXQgYW5kIHdhaXQgdGhlcmUgdW50aWwgdGhlIG1lc3NhZ2UgaXMgcGFyc2VkIGJ5IHNvbWV0aGluZworICAgIC8vIHRoYXQgZG9lcyBrbm93IGFib3V0IHRoZSBvcHRpb25zLgorCisgICAgLy8gS2VlcCB0aGUgdW5wYXJzZWQgb3B0aW9ucyBhcm91bmQgaW4gY2FzZSB0aGUgcmVwYXJzaW5nIGZhaWxzLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlPiB1bnBhcnNlZF9vcHRpb25zKG9wdGlvbnMtPk5ldygpKTsKKyAgICBvcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPlN3YXAodW5wYXJzZWRfb3B0aW9ucy5nZXQoKSwgb3B0aW9ucyk7CisKKyAgICBzdGQ6OnN0cmluZyBidWY7CisgICAgaWYgKCF1bnBhcnNlZF9vcHRpb25zLT5BcHBlbmRUb1N0cmluZygmYnVmKSB8fAorICAgICAgICAhb3B0aW9ucy0+UGFyc2VGcm9tU3RyaW5nKGJ1ZikpIHsKKyAgICAgIGJ1aWxkZXJfLT5BZGRFcnJvcigKKyAgICAgICAgICBvcHRpb25zX3RvX2ludGVycHJldC0+ZWxlbWVudF9uYW1lLCAqb3JpZ2luYWxfb3B0aW9ucywKKyAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAorICAgICAgICAgICJTb21lIG9wdGlvbnMgY291bGQgbm90IGJlIGNvcnJlY3RseSBwYXJzZWQgdXNpbmcgdGhlIHByb3RvICIKKyAgICAgICAgICAiZGVzY3JpcHRvcnMgY29tcGlsZWQgaW50byB0aGlzIGJpbmFyeS5cbiIKKyAgICAgICAgICAiVW5wYXJzZWQgb3B0aW9uczogIiArCisgICAgICAgICAgICAgIHVucGFyc2VkX29wdGlvbnMtPlNob3J0RGVidWdTdHJpbmcoKSArCisgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgIlBhcnNpbmcgYXR0ZW1wdDogICIgKworICAgICAgICAgICAgICBvcHRpb25zLT5TaG9ydERlYnVnU3RyaW5nKCkpOworICAgICAgLy8gUmVzdG9yZSB0aGUgdW5wYXJzZWQgb3B0aW9ucy4KKyAgICAgIG9wdGlvbnMtPkdldFJlZmxlY3Rpb24oKS0+U3dhcCh1bnBhcnNlZF9vcHRpb25zLmdldCgpLCBvcHRpb25zKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gIWZhaWxlZDsKK30KKworYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OkludGVycHJldFNpbmdsZU9wdGlvbigKKyAgICBNZXNzYWdlKiBvcHRpb25zLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzcmNfcGF0aCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBvcHRpb25zX3BhdGgpIHsKKyAgLy8gRmlyc3QgZG8gc29tZSBiYXNpYyB2YWxpZGF0aW9uLgorICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5uYW1lX3NpemUoKSA9PSAwKSB7CisgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIHVubGVzcyB0aGUgcGFyc2VyIGhhcyBnb25lIHNlcmlvdXNseSBhd3J5IG9yCisgICAgLy8gc29tZW9uZSBoYXMgbWFudWFsbHkgY3JlYXRlZCB0aGUgdW5pbnRlcnByZXRlZCBvcHRpb24gYmFkbHkuCisgICAgcmV0dXJuIEFkZE5hbWVFcnJvcigiT3B0aW9uIG11c3QgaGF2ZSBhIG5hbWUuIik7CisgIH0KKyAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmFtZSgwKS5uYW1lX3BhcnQoKSA9PSAidW5pbnRlcnByZXRlZF9vcHRpb24iKSB7CisgICAgcmV0dXJuIEFkZE5hbWVFcnJvcigKKyAgICAgICAgIk9wdGlvbiBtdXN0IG5vdCB1c2UgcmVzZXJ2ZWQgbmFtZSAiCisgICAgICAgICJcInVuaW50ZXJwcmV0ZWRfb3B0aW9uXCIuIik7CisgIH0KKworICBjb25zdCBEZXNjcmlwdG9yKiBvcHRpb25zX2Rlc2NyaXB0b3IgPSBudWxscHRyOworICAvLyBHZXQgdGhlIG9wdGlvbnMgbWVzc2FnZSdzIGRlc2NyaXB0b3IgZnJvbSB0aGUgYnVpbGRlcidzIHBvb2wsIHNvIHRoYXQgd2UKKyAgLy8gZ2V0IHRoZSB2ZXJzaW9uIHRoYXQga25vd3MgYWJvdXQgYW55IGV4dGVuc2lvbiBvcHRpb25zIGRlY2xhcmVkIGluIHRoZSBmaWxlCisgIC8vIHdlJ3JlIGN1cnJlbnRseSBidWlsZGluZy4gVGhlIGRlc2NyaXB0b3Igc2hvdWxkIGJlIHRoZXJlIGFzIGxvbmcgYXMgdGhlCisgIC8vIGZpbGUgd2UncmUgYnVpbGRpbmcgaW1wb3J0ZWQgZGVzY3JpcHRvci5wcm90by4KKworICAvLyBOb3RlIHRoYXQgd2UgdXNlIERlc2NyaXB0b3JCdWlsZGVyOjpGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcygpLCBub3QKKyAgLy8gRGVzY3JpcHRvclBvb2w6OkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgpIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBob2xkaW5nIHRoZQorICAvLyBwb29sJ3MgbXV0ZXgsIGFuZCB0aGUgbGF0dGVyIG1ldGhvZCBsb2NrcyBpdCBhZ2Fpbi4gIFdlIGRvbid0IHVzZQorICAvLyBGaW5kU3ltYm9sKCkgYmVjYXVzZSBmaWxlcyB0aGF0IHVzZSBjdXN0b20gb3B0aW9ucyBvbmx5IG5lZWQgdG8gZGVwZW5kIG9uCisgIC8vIHRoZSBmaWxlIHRoYXQgZGVmaW5lcyB0aGUgb3B0aW9uLCBub3QgZGVzY3JpcHRvci5wcm90byBpdHNlbGYuCisgIFN5bWJvbCBzeW1ib2wgPSBidWlsZGVyXy0+RmluZFN5bWJvbE5vdEVuZm9yY2luZ0RlcHMoCisgICAgICBvcHRpb25zLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpKTsKKyAgb3B0aW9uc19kZXNjcmlwdG9yID0gc3ltYm9sLmRlc2NyaXB0b3IoKTsKKyAgaWYgKG9wdGlvbnNfZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgLy8gVGhlIG9wdGlvbnMgbWVzc2FnZSdzIGRlc2NyaXB0b3Igd2FzIG5vdCBpbiB0aGUgYnVpbGRlcidzIHBvb2wsIHNvIHVzZQorICAgIC8vIHRoZSBzdGFuZGFyZCB2ZXJzaW9uIGZyb20gdGhlIGdlbmVyYXRlZCBwb29sLiBXZSdyZSBub3QgaG9sZGluZyB0aGUKKyAgICAvLyBnZW5lcmF0ZWQgcG9vbCdzIG11dGV4LCBzbyB3ZSBjYW4gc2VhcmNoIGl0IHRoZSBzdHJhaWdodGZvcndhcmQgd2F5LgorICAgIG9wdGlvbnNfZGVzY3JpcHRvciA9IG9wdGlvbnMtPkdldERlc2NyaXB0b3IoKTsKKyAgfQorICBHT09HTEVfQ0hFQ0sob3B0aW9uc19kZXNjcmlwdG9yKTsKKworICAvLyBXZSBpdGVyYXRlIG92ZXIgdGhlIG5hbWUgcGFydHMgdG8gZHJpbGwgaW50byB0aGUgc3VibWVzc2FnZXMgdW50aWwgd2UgZmluZAorICAvLyB0aGUgbGVhZiBmaWVsZCBmb3IgdGhlIG9wdGlvbi4gQXMgd2UgZHJpbGwgZG93biB3ZSByZW1lbWJlciB0aGUgY3VycmVudAorICAvLyBzdWJtZXNzYWdlJ3MgZGVzY3JpcHRvciBpbiB8ZGVzY3JpcHRvcnwgYW5kIHRoZSBuZXh0IGZpZWxkIGluIHRoYXQKKyAgLy8gc3VibWVzc2FnZSBpbiB8ZmllbGR8LiBXZSBhbHNvIHRyYWNrIHRoZSBmaWVsZHMgd2UncmUgZHJpbGxpbmcgZG93bgorICAvLyB0aHJvdWdoIGluIHxpbnRlcm1lZGlhdGVfZmllbGRzfC4gQXMgd2UgZ28sIHdlIHJlY29uc3RydWN0IHRoZSBmdWxsIG9wdGlvbgorICAvLyBuYW1lIGluIHxkZWJ1Z19tc2dfbmFtZXwsIGZvciB1c2UgaW4gZXJyb3IgbWVzc2FnZXMuCisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBvcHRpb25zX2Rlc2NyaXB0b3I7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBudWxscHRyOworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBpbnRlcm1lZGlhdGVfZmllbGRzOworICBzdGQ6OnN0cmluZyBkZWJ1Z19tc2dfbmFtZSA9ICIiOworCisgIHN0ZDo6dmVjdG9yPGludD4gZGVzdF9wYXRoID0gb3B0aW9uc19wYXRoOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pbnRlcnByZXRlZF9vcHRpb25fLT5uYW1lX3NpemUoKTsgKytpKSB7CisgICAgYnVpbGRlcl8tPnVuZGVmaW5lX3Jlc29sdmVkX25hbWVfLmNsZWFyKCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWVfcGFydCA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmFtZShpKS5uYW1lX3BhcnQoKTsKKyAgICBpZiAoZGVidWdfbXNnX25hbWUuc2l6ZSgpID4gMCkgeworICAgICAgZGVidWdfbXNnX25hbWUgKz0gIi4iOworICAgIH0KKyAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5uYW1lKGkpLmlzX2V4dGVuc2lvbigpKSB7CisgICAgICBkZWJ1Z19tc2dfbmFtZSArPSAiKCIgKyBuYW1lX3BhcnQgKyAiKSI7CisgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBleHRlbnNpb24ncyBkZXNjcmlwdG9yIGFzIGFuIGV4dGVuc2lvbiBpbiB0aGUgYnVpbGRlcidzCisgICAgICAvLyBwb29sLiBOb3RlIHRoYXQgd2UgdXNlIERlc2NyaXB0b3JCdWlsZGVyOjpMb29rdXBTeW1ib2woKSwgbm90CisgICAgICAvLyBEZXNjcmlwdG9yUG9vbDo6RmluZEV4dGVuc2lvbkJ5TmFtZSgpLCBmb3IgdHdvIHJlYXNvbnM6IDEpIEl0IGFsbG93cworICAgICAgLy8gcmVsYXRpdmUgbG9va3VwcywgYW5kIDIpIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBob2xkaW5nIHRoZSBwb29sJ3MKKyAgICAgIC8vIG11dGV4LCBhbmQgdGhlIGxhdHRlciBtZXRob2QgbG9ja3MgaXQgYWdhaW4uCisgICAgICBzeW1ib2wgPQorICAgICAgICAgIGJ1aWxkZXJfLT5Mb29rdXBTeW1ib2wobmFtZV9wYXJ0LCBvcHRpb25zX3RvX2ludGVycHJldF8tPm5hbWVfc2NvcGUpOworICAgICAgZmllbGQgPSBzeW1ib2wuZmllbGRfZGVzY3JpcHRvcigpOworICAgICAgLy8gSWYgd2UgZG9uJ3QgZmluZCB0aGUgZmllbGQgdGhlbiB0aGUgZmllbGQncyBkZXNjcmlwdG9yIHdhcyBub3QgaW4gdGhlCisgICAgICAvLyBidWlsZGVyJ3MgcG9vbCwgYnV0IHRoZXJlJ3Mgbm8gcG9pbnQgaW4gbG9va2luZyBpbiB0aGUgZ2VuZXJhdGVkCisgICAgICAvLyBwb29sLiBXZSByZXF1aXJlIHRoYXQgeW91IGltcG9ydCB0aGUgZmlsZSB0aGF0IGRlZmluZXMgYW55IGV4dGVuc2lvbnMKKyAgICAgIC8vIHlvdSB1c2UsIHNvIHRoZXkgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBidWlsZGVyJ3MgcG9vbC4KKyAgICB9IGVsc2UgeworICAgICAgZGVidWdfbXNnX25hbWUgKz0gbmFtZV9wYXJ0OworICAgICAgLy8gU2VhcmNoIGZvciB0aGUgZmllbGQncyBkZXNjcmlwdG9yIGFzIGEgcmVndWxhciBmaWVsZC4KKyAgICAgIGZpZWxkID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKG5hbWVfcGFydCk7CisgICAgfQorCisgICAgaWYgKGZpZWxkID09IG51bGxwdHIpIHsKKyAgICAgIGlmIChnZXRfYWxsb3dfdW5rbm93bihidWlsZGVyXy0+cG9vbF8pKSB7CisgICAgICAgIC8vIFdlIGNhbid0IGZpbmQgdGhlIG9wdGlvbiwgYnV0IEFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpIGlzIGVuYWJsZWQsCisgICAgICAgIC8vIHNvIHdlIHdpbGwganVzdCBsZWF2ZSBpdCBhcyB1bmludGVycHJldGVkLgorICAgICAgICBBZGRXaXRob3V0SW50ZXJwcmV0aW5nKCp1bmludGVycHJldGVkX29wdGlvbl8sIG9wdGlvbnMpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoIShidWlsZGVyXy0+dW5kZWZpbmVfcmVzb2x2ZWRfbmFtZV8pLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gT3B0aW9uIGlzIHJlc29sdmVkIHRvIGEgbmFtZSB3aGljaCBpcyBub3QgZGVmaW5lZC4KKyAgICAgICAgcmV0dXJuIEFkZE5hbWVFcnJvcigKKyAgICAgICAgICAgICJPcHRpb24gXCIiICsgZGVidWdfbXNnX25hbWUgKyAiXCIgaXMgcmVzb2x2ZWQgdG8gXCIoIiArCisgICAgICAgICAgICBidWlsZGVyXy0+dW5kZWZpbmVfcmVzb2x2ZWRfbmFtZV8gKworICAgICAgICAgICAgIilcIiwgd2hpY2ggaXMgbm90IGRlZmluZWQuIFRoZSBpbm5lcm1vc3Qgc2NvcGUgaXMgc2VhcmNoZWQgZmlyc3QgIgorICAgICAgICAgICAgImluIG5hbWUgcmVzb2x1dGlvbi4gQ29uc2lkZXIgdXNpbmcgYSBsZWFkaW5nICcuJyhpLmUuLCBcIiguIiArCisgICAgICAgICAgICBkZWJ1Z19tc2dfbmFtZS5zdWJzdHIoMSkgKworICAgICAgICAgICAgIlwiKSB0byBzdGFydCBmcm9tIHRoZSBvdXRlcm1vc3Qgc2NvcGUuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWRkTmFtZUVycm9yKAorICAgICAgICAgICAgIk9wdGlvbiBcIiIgKyBkZWJ1Z19tc2dfbmFtZSArCisgICAgICAgICAgICAiXCIgdW5rbm93bi4gRW5zdXJlIHRoYXQgeW91ciBwcm90byIgKworICAgICAgICAgICAgIiBkZWZpbml0aW9uIGZpbGUgaW1wb3J0cyB0aGUgcHJvdG8gd2hpY2ggZGVmaW5lcyB0aGUgb3B0aW9uLiIpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpICE9IGRlc2NyaXB0b3IpIHsKKyAgICAgIGlmIChnZXRfaXNfcGxhY2Vob2xkZXIoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICAgICAgICAvLyBUaGUgZmllbGQgaXMgYW4gZXh0ZW5zaW9uIG9mIGEgcGxhY2Vob2xkZXIgdHlwZSwgc28gd2UgY2FuJ3QKKyAgICAgICAgLy8gcmVsaWFibHkgdmVyaWZ5IHdoZXRoZXIgaXQgaXMgYSB2YWxpZCBleHRlbnNpb24gdG8gdXNlIGhlcmUgKGUuZy4KKyAgICAgICAgLy8gd2UgZG9uJ3Qga25vdyBpZiBpdCBpcyBhbiBleHRlbnNpb24gb2YgdGhlIGNvcnJlY3QgKk9wdGlvbnMgbWVzc2FnZSwKKyAgICAgICAgLy8gb3IgaWYgaXQgaGFzIGEgdmFsaWQgZmllbGQgbnVtYmVyLCBldGMuKS4gIEp1c3QgbGVhdmUgaXQgYXMKKyAgICAgICAgLy8gdW5pbnRlcnByZXRlZCBpbnN0ZWFkLgorICAgICAgICBBZGRXaXRob3V0SW50ZXJwcmV0aW5nKCp1bmludGVycHJldGVkX29wdGlvbl8sIG9wdGlvbnMpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmLCBkdWUgdG8gc29tZSBpbnNhbmUgbWlzY29uZmlndXJhdGlvbiBvZiB0aGUKKyAgICAgICAgLy8gcG9vbHMsIHdlIGZpbmQgdGhlIG9wdGlvbnMgbWVzc2FnZSBpbiBvbmUgcG9vbCBidXQgdGhlIGZpZWxkIGluCisgICAgICAgIC8vIGFub3RoZXIuIFRoaXMgd291bGQgcHJvYmFibHkgaW1wbHkgYSBoZWZ0eSBidWcgc29tZXdoZXJlLgorICAgICAgICByZXR1cm4gQWRkTmFtZUVycm9yKCJPcHRpb24gZmllbGQgXCIiICsgZGVidWdfbXNnX25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBpcyBub3QgYSBmaWVsZCBvciBleHRlbnNpb24gb2YgbWVzc2FnZSBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPm5hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gYWNjdW11bGF0ZSBmaWVsZCBudW1iZXJzIHRvIGZvcm0gcGF0aCB0byBpbnRlcnByZXRlZCBvcHRpb24KKyAgICAgIGRlc3RfcGF0aC5wdXNoX2JhY2soZmllbGQtPm51bWJlcigpKTsKKworICAgICAgaWYgKGkgPCB1bmludGVycHJldGVkX29wdGlvbl8tPm5hbWVfc2l6ZSgpIC0gMSkgeworICAgICAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgICAgICByZXR1cm4gQWRkTmFtZUVycm9yKCJPcHRpb24gXCIiICsgZGVidWdfbXNnX25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGlzIGFuIGF0b21pYyB0eXBlLCBub3QgYSBtZXNzYWdlLiIpOworICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgICAgcmV0dXJuIEFkZE5hbWVFcnJvcigiT3B0aW9uIGZpZWxkIFwiIiArIGRlYnVnX21zZ19uYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBpcyBhIHJlcGVhdGVkIG1lc3NhZ2UuIFJlcGVhdGVkIG1lc3NhZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMgbXVzdCBiZSBpbml0aWFsaXplZCB1c2luZyBhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWdncmVnYXRlIHZhbHVlLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIERyaWxsIGRvd24gaW50byB0aGUgc3VibWVzc2FnZS4KKyAgICAgICAgICBpbnRlcm1lZGlhdGVfZmllbGRzLnB1c2hfYmFjayhmaWVsZCk7CisgICAgICAgICAgZGVzY3JpcHRvciA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFdlJ3ZlIGZvdW5kIHRoZSBsZWFmIGZpZWxkLiBOb3cgd2UgdXNlIFVua25vd25GaWVsZFNldHMgdG8gc2V0IGl0cyB2YWx1ZQorICAvLyBvbiB0aGUgb3B0aW9ucyBtZXNzYWdlLiBXZSBkbyBzbyBiZWNhdXNlIHRoZSBtZXNzYWdlIG1heSBub3QgeWV0IGtub3cKKyAgLy8gYWJvdXQgaXRzIGV4dGVuc2lvbiBmaWVsZHMsIHNvIHdlIG1heSBub3QgYmUgYWJsZSB0byBzZXQgdGhlIGZpZWxkcworICAvLyBkaXJlY3RseS4gQnV0IHRoZSBVbmtub3duRmllbGRTZXRzIHdpbGwgc2VyaWFsaXplIHRvIHRoZSBzYW1lIHdpcmUtZm9ybWF0CisgIC8vIG1lc3NhZ2UsIHNvIHJlYWRpbmcgdGhhdCBtZXNzYWdlIGJhY2sgaW4gb25jZSB0aGUgZXh0ZW5zaW9uIGZpZWxkcyBhcmUKKyAgLy8ga25vd24gd2lsbCBwb3B1bGF0ZSB0aGVtIGNvcnJlY3RseS4KKworICAvLyBGaXJzdCBzZWUgaWYgdGhlIG9wdGlvbiBpcyBhbHJlYWR5IHNldC4KKyAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJgorICAgICAgIUV4YW1pbmVJZk9wdGlvbklzU2V0KAorICAgICAgICAgIGludGVybWVkaWF0ZV9maWVsZHMuYmVnaW4oKSwgaW50ZXJtZWRpYXRlX2ZpZWxkcy5lbmQoKSwgZmllbGQsCisgICAgICAgICAgZGVidWdfbXNnX25hbWUsCisgICAgICAgICAgb3B0aW9ucy0+R2V0UmVmbGVjdGlvbigpLT5HZXRVbmtub3duRmllbGRzKCpvcHRpb25zKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7ICAvLyBFeGFtaW5lSWZPcHRpb25Jc1NldCgpIGFscmVhZHkgYWRkZWQgdGhlIGVycm9yLgorICB9CisKKyAgLy8gRmlyc3Qgc2V0IHRoZSB2YWx1ZSBvbiB0aGUgVW5rbm93bkZpZWxkU2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgIC8vIGlubmVybW9zdCBtZXNzYWdlLgorICBzdGQ6OnVuaXF1ZV9wdHI8VW5rbm93bkZpZWxkU2V0PiB1bmtub3duX2ZpZWxkcyhuZXcgVW5rbm93bkZpZWxkU2V0KCkpOworICBpZiAoIVNldE9wdGlvblZhbHVlKGZpZWxkLCB1bmtub3duX2ZpZWxkcy5nZXQoKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7ICAvLyBTZXRPcHRpb25WYWx1ZSgpIGFscmVhZHkgYWRkZWQgdGhlIGVycm9yLgorICB9CisKKyAgLy8gTm93IHdyYXAgdGhlIFVua25vd25GaWVsZFNldCB3aXRoIFVua25vd25GaWVsZFNldHMgY29ycmVzcG9uZGluZyB0byBhbGwKKyAgLy8gdGhlIGludGVybWVkaWF0ZSBtZXNzYWdlcy4KKyAgZm9yIChzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPjo6cmV2ZXJzZV9pdGVyYXRvciBpdGVyID0KKyAgICAgICAgICAgaW50ZXJtZWRpYXRlX2ZpZWxkcy5yYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IGludGVybWVkaWF0ZV9maWVsZHMucmVuZCgpOyArK2l0ZXIpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VW5rbm93bkZpZWxkU2V0PiBwYXJlbnRfdW5rbm93bl9maWVsZHMoCisgICAgICAgIG5ldyBVbmtub3duRmllbGRTZXQoKSk7CisgICAgc3dpdGNoICgoKml0ZXIpLT50eXBlKCkpIHsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6IHsKKyAgICAgICAgc3RkOjpzdHJpbmcqIG91dHN0ciA9CisgICAgICAgICAgICBwYXJlbnRfdW5rbm93bl9maWVsZHMtPkFkZExlbmd0aERlbGltaXRlZCgoKml0ZXIpLT5udW1iZXIoKSk7CisgICAgICAgIEdPT0dMRV9DSEVDSyh1bmtub3duX2ZpZWxkcy0+U2VyaWFsaXplVG9TdHJpbmcob3V0c3RyKSkKKyAgICAgICAgICAgIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmUgd2hpbGUgc2VyaWFsaXppbmcgb3B0aW9uIHN1Ym1lc3NhZ2UgIgorICAgICAgICAgICAgPDwgZGVidWdfbXNnX25hbWUgPDwgIlwiLiI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDogeworICAgICAgICBwYXJlbnRfdW5rbm93bl9maWVsZHMtPkFkZEdyb3VwKCgqaXRlciktPm51bWJlcigpKQorICAgICAgICAgICAgLT5NZXJnZUZyb20oKnVua25vd25fZmllbGRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJJbnZhbGlkIHdpcmUgdHlwZSBmb3IgQ1BQVFlQRV9NRVNTQUdFOiAiCisgICAgICAgICAgICAgICAgICAgPDwgKCppdGVyKS0+dHlwZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHVua25vd25fZmllbGRzLnJlc2V0KHBhcmVudF91bmtub3duX2ZpZWxkcy5yZWxlYXNlKCkpOworICB9CisKKyAgLy8gTm93IG1lcmdlIHRoZSBVbmtub3duRmllbGRTZXQgY29ycmVzcG9uZGluZyB0byB0aGUgdG9wLWxldmVsIG1lc3NhZ2UgaW50bworICAvLyB0aGUgb3B0aW9ucyBtZXNzYWdlLgorICBvcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVVbmtub3duRmllbGRzKG9wdGlvbnMpLT5NZXJnZUZyb20oCisgICAgICAqdW5rbm93bl9maWVsZHMpOworCisgIC8vIHJlY29yZCB0aGUgZWxlbWVudCBwYXRoIG9mIHRoZSBpbnRlcnByZXRlZCBvcHRpb24KKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgaW50IGluZGV4ID0gcmVwZWF0ZWRfb3B0aW9uX2NvdW50c19bZGVzdF9wYXRoXSsrOworICAgIGRlc3RfcGF0aC5wdXNoX2JhY2soaW5kZXgpOworICB9CisgIGludGVycHJldGVkX3BhdGhzX1tzcmNfcGF0aF0gPSBkZXN0X3BhdGg7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpVcGRhdGVTb3VyY2VDb2RlSW5mbygKKyAgICBTb3VyY2VDb2RlSW5mbyogaW5mbykgeworICBpZiAoaW50ZXJwcmV0ZWRfcGF0aHNfLmVtcHR5KCkpIHsKKyAgICAvLyBub3RoaW5nIHRvIGRvIQorICAgIHJldHVybjsKKyAgfQorCisgIC8vIFdlIGZpbmQgbG9jYXRpb25zIHRoYXQgbWF0Y2gga2V5cyBpbiBpbnRlcnByZXRlZF9wYXRoc18gYW5kCisgIC8vIDEpIHJlcGxhY2UgdGhlIHBhdGggd2l0aCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiBpbnRlcnByZXRlZF9wYXRoc18KKyAgLy8gMikgcmVtb3ZlIGFueSBzdWJzZXF1ZW50IHN1Yi1sb2NhdGlvbnMgKHN1Yi1sb2NhdGlvbiBpcyBvbmUgd2hvc2UgcGF0aAorICAvLyAgICBoYXMgdGhlIHBhcmVudCBwYXRoIGFzIGEgcHJlZml4KQorICAvLworICAvLyBUbyBhdm9pZCBxdWFkcmF0aWMgYmVoYXZpb3Igb2YgcmVtb3ZpbmcgaW50ZXJpb3Igcm93cyBhcyB3ZSBnbywKKyAgLy8gd2Uga2VlcCBhIGNvcHkuIEJ1dCB3ZSBkb24ndCBhY3R1YWxseSBjb3B5IGFueXRoaW5nIHVudGlsIHdlJ3ZlCisgIC8vIGZvdW5kIHRoZSBmaXJzdCBtYXRjaCAoc28gaWYgdGhlIHNvdXJjZSBjb2RlIGluZm8gaGFzIG5vIGxvY2F0aW9ucworICAvLyB0aGF0IG5lZWQgdG8gYmUgY2hhbmdlZCwgdGhlcmUgaXMgemVybyBjb3B5IG92ZXJoZWFkKS4KKworICBSZXBlYXRlZFB0ckZpZWxkPFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uPiogbG9jcyA9IGluZm8tPm11dGFibGVfbG9jYXRpb24oKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbj4gbmV3X2xvY3M7CisgIGJvb2wgY29weWluZyA9IGZhbHNlOworCisgIHN0ZDo6dmVjdG9yPGludD4gcGF0aHY7CisgIGJvb2wgbWF0Y2hlZCA9IGZhbHNlOworCisgIGZvciAoUmVwZWF0ZWRQdHJGaWVsZDxTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbj46Oml0ZXJhdG9yIGxvYyA9IGxvY3MtPmJlZ2luKCk7CisgICAgICAgbG9jICE9IGxvY3MtPmVuZCgpOyBsb2MrKykgeworICAgIGlmIChtYXRjaGVkKSB7CisgICAgICAvLyBzZWUgaWYgdGhpcyBsb2NhdGlvbiBpcyBpbiB0aGUgcmFuZ2UgdG8gcmVtb3ZlCisgICAgICBib29sIGxvY19tYXRjaGVzID0gdHJ1ZTsKKyAgICAgIGlmIChsb2MtPnBhdGhfc2l6ZSgpIDwgc3RhdGljX2Nhc3Q8aW50NjRfdD4ocGF0aHYuc2l6ZSgpKSkgeworICAgICAgICBsb2NfbWF0Y2hlcyA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXRodi5zaXplKCk7IGorKykgeworICAgICAgICAgIGlmIChsb2MtPnBhdGgoaikgIT0gcGF0aHZbal0pIHsKKyAgICAgICAgICAgIGxvY19tYXRjaGVzID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGxvY19tYXRjaGVzKSB7CisgICAgICAgIC8vIGRvbid0IGNvcHkgdGhpcyByb3cgc2luY2UgaXQgaXMgYSBzdWItbG9jYXRpb24gdGhhdCB3ZSdyZSByZW1vdmluZworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgbWF0Y2hlZCA9IGZhbHNlOworICAgIH0KKworICAgIHBhdGh2LmNsZWFyKCk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsb2MtPnBhdGhfc2l6ZSgpOyBqKyspIHsKKyAgICAgIHBhdGh2LnB1c2hfYmFjayhsb2MtPnBhdGgoaikpOworICAgIH0KKworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPGludD4sIHN0ZDo6dmVjdG9yPGludD4+OjppdGVyYXRvciBlbnRyeSA9CisgICAgICAgIGludGVycHJldGVkX3BhdGhzXy5maW5kKHBhdGh2KTsKKworICAgIGlmIChlbnRyeSA9PSBpbnRlcnByZXRlZF9wYXRoc18uZW5kKCkpIHsKKyAgICAgIC8vIG5vdCBhIG1hdGNoCisgICAgICBpZiAoY29weWluZykgeworICAgICAgICAqbmV3X2xvY3MuQWRkKCkgPSAqbG9jOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgbWF0Y2hlZCA9IHRydWU7CisKKyAgICBpZiAoIWNvcHlpbmcpIHsKKyAgICAgIC8vIGluaXRpYWxpemUgdGhlIGNvcHkgd2UgYXJlIGJ1aWxkaW5nCisgICAgICBjb3B5aW5nID0gdHJ1ZTsKKyAgICAgIG5ld19sb2NzLlJlc2VydmUobG9jcy0+c2l6ZSgpKTsKKyAgICAgIGZvciAoUmVwZWF0ZWRQdHJGaWVsZDxTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbj46Oml0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICAgIGxvY3MtPmJlZ2luKCk7CisgICAgICAgICAgIGl0ICE9IGxvYzsgaXQrKykgeworICAgICAgICAqbmV3X2xvY3MuQWRkKCkgPSAqaXQ7CisgICAgICB9CisgICAgfQorCisgICAgLy8gYWRkIHJlcGxhY2VtZW50IGFuZCB1cGRhdGUgaXRzIHBhdGgKKyAgICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogcmVwbGFjZW1lbnQgPSBuZXdfbG9jcy5BZGQoKTsKKyAgICAqcmVwbGFjZW1lbnQgPSAqbG9jOworICAgIHJlcGxhY2VtZW50LT5jbGVhcl9wYXRoKCk7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxpbnQ+OjppdGVyYXRvciByaXQgPSBlbnRyeS0+c2Vjb25kLmJlZ2luKCk7CisgICAgICAgICByaXQgIT0gZW50cnktPnNlY29uZC5lbmQoKTsgcml0KyspIHsKKyAgICAgIHJlcGxhY2VtZW50LT5hZGRfcGF0aCgqcml0KTsKKyAgICB9CisgIH0KKworICAvLyBpZiB3ZSBtYWRlIGEgY2hhbmdlZCBjb3B5LCBwdXQgaXQgaW4gcGxhY2UKKyAgaWYgKGNvcHlpbmcpIHsKKyAgICAqbG9jcyA9IG5ld19sb2NzOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpBZGRXaXRob3V0SW50ZXJwcmV0aW5nKAorICAgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLCBNZXNzYWdlKiBvcHRpb25zKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPQorICAgICAgb3B0aW9ucy0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInVuaW50ZXJwcmV0ZWRfb3B0aW9uIik7CisgIEdPT0dMRV9DSEVDSyhmaWVsZCAhPSBudWxscHRyKTsKKworICBvcHRpb25zLT5HZXRSZWZsZWN0aW9uKCkKKyAgICAgIC0+QWRkTWVzc2FnZShvcHRpb25zLCBmaWVsZCkKKyAgICAgIC0+Q29weUZyb20odW5pbnRlcnByZXRlZF9vcHRpb24pOworfQorCitib29sIERlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6RXhhbWluZUlmT3B0aW9uSXNTZXQoCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgIGludGVybWVkaWF0ZV9maWVsZHNfaXRlciwKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPjo6Y29uc3RfaXRlcmF0b3IgaW50ZXJtZWRpYXRlX2ZpZWxkc19lbmQsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBpbm5lcm1vc3RfZmllbGQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWJ1Z19tc2dfbmFtZSwKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKSB7CisgIC8vIFdlIGRvIGxpbmVhciBzZWFyY2hlcyBvZiB0aGUgVW5rbm93bkZpZWxkU2V0IGFuZCBpdHMgc3ViLWdyb3Vwcy4gIFRoaXMKKyAgLy8gc2hvdWxkIGJlIGZpbmUgc2luY2UgaXQncyB1bmxpa2VseSB0aGF0IGFueSBvbmUgb3B0aW9ucyBzdHJ1Y3R1cmUgd2lsbAorICAvLyBjb250YWluIG1vcmUgdGhhbiBhIGhhbmRmdWwgb2Ygb3B0aW9ucy4KKworICBpZiAoaW50ZXJtZWRpYXRlX2ZpZWxkc19pdGVyID09IGludGVybWVkaWF0ZV9maWVsZHNfZW5kKSB7CisgICAgLy8gV2UncmUgYXQgdGhlIGlubmVybW9zdCBzdWJtZXNzYWdlLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZHMuZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICBpZiAodW5rbm93bl9maWVsZHMuZmllbGQoaSkubnVtYmVyKCkgPT0gaW5uZXJtb3N0X2ZpZWxkLT5udW1iZXIoKSkgeworICAgICAgICByZXR1cm4gQWRkTmFtZUVycm9yKCJPcHRpb24gXCIiICsgZGVidWdfbXNnX25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiB3YXMgYWxyZWFkeSBzZXQuIik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAodW5rbm93bl9maWVsZHMuZmllbGQoaSkubnVtYmVyKCkgPT0KKyAgICAgICAgKCppbnRlcm1lZGlhdGVfZmllbGRzX2l0ZXIpLT5udW1iZXIoKSkgeworICAgICAgY29uc3QgVW5rbm93bkZpZWxkKiB1bmtub3duX2ZpZWxkID0gJnVua25vd25fZmllbGRzLmZpZWxkKGkpOworICAgICAgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUgPSAoKmludGVybWVkaWF0ZV9maWVsZHNfaXRlciktPnR5cGUoKTsKKyAgICAgIC8vIFJlY3Vyc2UgaW50byB0aGUgbmV4dCBzdWJtZXNzYWdlLgorICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6CisgICAgICAgICAgaWYgKHVua25vd25fZmllbGQtPnR5cGUoKSA9PSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0IGludGVybWVkaWF0ZV91bmtub3duX2ZpZWxkczsKKyAgICAgICAgICAgIGlmIChpbnRlcm1lZGlhdGVfdW5rbm93bl9maWVsZHMuUGFyc2VGcm9tU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICB1bmtub3duX2ZpZWxkLT5sZW5ndGhfZGVsaW1pdGVkKCkpICYmCisgICAgICAgICAgICAgICAgIUV4YW1pbmVJZk9wdGlvbklzU2V0KGludGVybWVkaWF0ZV9maWVsZHNfaXRlciArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV9maWVsZHNfZW5kLCBpbm5lcm1vc3RfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX21zZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGVfdW5rbm93bl9maWVsZHMpKSB7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIEVycm9yIGFscmVhZHkgYWRkZWQuCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOgorICAgICAgICAgIGlmICh1bmtub3duX2ZpZWxkLT50eXBlKCkgPT0gVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQKSB7CisgICAgICAgICAgICBpZiAoIUV4YW1pbmVJZk9wdGlvbklzU2V0KGludGVybWVkaWF0ZV9maWVsZHNfaXRlciArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV9maWVsZHNfZW5kLCBpbm5lcm1vc3RfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX21zZ19uYW1lLCB1bmtub3duX2ZpZWxkLT5ncm91cCgpKSkgeworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBFcnJvciBhbHJlYWR5IGFkZGVkLgorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJJbnZhbGlkIHdpcmUgdHlwZSBmb3IgQ1BQVFlQRV9NRVNTQUdFOiAiIDw8IHR5cGU7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OlNldE9wdGlvblZhbHVlKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogb3B0aW9uX2ZpZWxkLCBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7CisgIC8vIFdlIHN3aXRjaCBvbiB0aGUgQ3BwVHlwZSB0byB2YWxpZGF0ZS4KKyAgc3dpdGNoIChvcHRpb25fZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5wb3NpdGl2ZV9pbnRfdmFsdWUoKSA+CisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkpKSB7CisgICAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG91dCBvZiByYW5nZSBmb3IgaW50MzIgb3B0aW9uIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTZXRJbnQzMihvcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+cG9zaXRpdmVfaW50X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT50eXBlKCksIHVua25vd25fZmllbGRzKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5uZWdhdGl2ZV9pbnRfdmFsdWUoKSA8CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKSkpIHsKKyAgICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgb3V0IG9mIHJhbmdlIGZvciBpbnQzMiBvcHRpb24gXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFNldEludDMyKG9wdGlvbl9maWVsZC0+bnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLT5uZWdhdGl2ZV9pbnRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPnR5cGUoKSwgdW5rbm93bl9maWVsZHMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgbXVzdCBiZSBpbnRlZ2VyIGZvciBpbnQzMiBvcHRpb24gXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+cG9zaXRpdmVfaW50X3ZhbHVlKCkgPgorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpKSkgeworICAgICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJWYWx1ZSBvdXQgb2YgcmFuZ2UgZm9yIGludDY0IG9wdGlvbiBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgU2V0SW50NjQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbl8tPnBvc2l0aXZlX2ludF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+dHlwZSgpLCB1bmtub3duX2ZpZWxkcyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgU2V0SW50NjQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLT5uZWdhdGl2ZV9pbnRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT50eXBlKCksIHVua25vd25fZmllbGRzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJWYWx1ZSBtdXN0IGJlIGludGVnZXIgZm9yIGludDY0IG9wdGlvbiBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6CisgICAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+cG9zaXRpdmVfaW50X3ZhbHVlKCkgPgorICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSB7CisgICAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG91dCBvZiByYW5nZSBmb3IgdWludDMyIG9wdGlvbiBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+bmFtZSgpICsgIlwiLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFNldFVJbnQzMihvcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbl8tPnBvc2l0aXZlX2ludF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPnR5cGUoKSwgdW5rbm93bl9maWVsZHMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigKKyAgICAgICAgICAgICJWYWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGZvciB1aW50MzIgIgorICAgICAgICAgICAgIm9wdGlvbiBcIiIgKworICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpKSB7CisgICAgICAgIFNldFVJbnQ2NChvcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLT5wb3NpdGl2ZV9pbnRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+dHlwZSgpLCB1bmtub3duX2ZpZWxkcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigKKyAgICAgICAgICAgICJWYWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGZvciB1aW50NjQgIgorICAgICAgICAgICAgIm9wdGlvbiBcIiIgKworICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKKyAgICAgIGZsb2F0IHZhbHVlOworICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX2RvdWJsZV92YWx1ZSgpKSB7CisgICAgICAgIHZhbHVlID0gdW5pbnRlcnByZXRlZF9vcHRpb25fLT5kb3VibGVfdmFsdWUoKTsKKyAgICAgIH0gZWxzZSBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgdmFsdWUgPSB1bmludGVycHJldGVkX29wdGlvbl8tPnBvc2l0aXZlX2ludF92YWx1ZSgpOworICAgICAgfSBlbHNlIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgICB2YWx1ZSA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmVnYXRpdmVfaW50X3ZhbHVlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgbXVzdCBiZSBudW1iZXIgZm9yIGZsb2F0IG9wdGlvbiBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOworICAgICAgfQorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkMzIob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RW5jb2RlRmxvYXQodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRTogeworICAgICAgZG91YmxlIHZhbHVlOworICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX2RvdWJsZV92YWx1ZSgpKSB7CisgICAgICAgIHZhbHVlID0gdW5pbnRlcnByZXRlZF9vcHRpb25fLT5kb3VibGVfdmFsdWUoKTsKKyAgICAgIH0gZWxzZSBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgdmFsdWUgPSB1bmludGVycHJldGVkX29wdGlvbl8tPnBvc2l0aXZlX2ludF92YWx1ZSgpOworICAgICAgfSBlbHNlIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgICB2YWx1ZSA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmVnYXRpdmVfaW50X3ZhbHVlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgbXVzdCBiZSBudW1iZXIgZm9yIGRvdWJsZSBvcHRpb24gXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDY0KG9wdGlvbl9maWVsZC0+bnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVuY29kZURvdWJsZSh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKKyAgICAgIHVpbnQ2NF90IHZhbHVlOworICAgICAgaWYgKCF1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19pZGVudGlmaWVyX3ZhbHVlKCkpIHsKKyAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoCisgICAgICAgICAgICAiVmFsdWUgbXVzdCBiZSBpZGVudGlmaWVyIGZvciBib29sZWFuIG9wdGlvbiAiCisgICAgICAgICAgICAiXCIiICsKKyAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICB9CisgICAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5pZGVudGlmaWVyX3ZhbHVlKCkgPT0gInRydWUiKSB7CisgICAgICAgIHZhbHVlID0gMTsKKyAgICAgIH0gZWxzZSBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5pZGVudGlmaWVyX3ZhbHVlKCkgPT0gImZhbHNlIikgeworICAgICAgICB2YWx1ZSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigKKyAgICAgICAgICAgICJWYWx1ZSBtdXN0IGJlIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIiBmb3IgYm9vbGVhbiAiCisgICAgICAgICAgICAib3B0aW9uIFwiIiArCisgICAgICAgICAgICBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOworICAgICAgfQorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChvcHRpb25fZmllbGQtPm51bWJlcigpLCB2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06IHsKKyAgICAgIGlmICghdW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfaWRlbnRpZmllcl92YWx1ZSgpKSB7CisgICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKAorICAgICAgICAgICAgIlZhbHVlIG11c3QgYmUgaWRlbnRpZmllciBmb3IgZW51bS12YWx1ZWQgb3B0aW9uICIKKyAgICAgICAgICAgICJcIiIgKworICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUgPSBvcHRpb25fZmllbGQtPmVudW1fdHlwZSgpOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlX25hbWUgPSB1bmludGVycHJldGVkX29wdGlvbl8tPmlkZW50aWZpZXJfdmFsdWUoKTsKKyAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUgPSBudWxscHRyOworCisgICAgICBpZiAoZW51bV90eXBlLT5maWxlKCktPnBvb2woKSAhPSBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSkgeworICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGVudW0gdmFsdWUncyBmdWxseS1xdWFsaWZpZWQgbmFtZSBpcyBhIHNpYmxpbmcgb2YgdGhlCisgICAgICAgIC8vIGVudW0ncyBuYW1lLCBub3QgYSBjaGlsZCBvZiBpdC4KKyAgICAgICAgc3RkOjpzdHJpbmcgZnVsbHlfcXVhbGlmaWVkX25hbWUgPSBlbnVtX3R5cGUtPmZ1bGxfbmFtZSgpOworICAgICAgICBmdWxseV9xdWFsaWZpZWRfbmFtZS5yZXNpemUoZnVsbHlfcXVhbGlmaWVkX25hbWUuc2l6ZSgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1fdHlwZS0+bmFtZSgpLnNpemUoKSk7CisgICAgICAgIGZ1bGx5X3F1YWxpZmllZF9uYW1lICs9IHZhbHVlX25hbWU7CisKKyAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgZW51bSB2YWx1ZSdzIGRlc2NyaXB0b3IgaW4gdGhlIGJ1aWxkZXIncyBwb29sLiBOb3RlCisgICAgICAgIC8vIHRoYXQgd2UgdXNlIERlc2NyaXB0b3JCdWlsZGVyOjpGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcygpLCBub3QKKyAgICAgICAgLy8gRGVzY3JpcHRvclBvb2w6OkZpbmRFbnVtVmFsdWVCeU5hbWUoKSBiZWNhdXNlIHdlJ3JlIGFscmVhZHkgaG9sZGluZworICAgICAgICAvLyB0aGUgcG9vbCdzIG11dGV4LCBhbmQgdGhlIGxhdHRlciBtZXRob2QgbG9ja3MgaXQgYWdhaW4uCisgICAgICAgIFN5bWJvbCBzeW1ib2wgPQorICAgICAgICAgICAgYnVpbGRlcl8tPkZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKGZ1bGx5X3F1YWxpZmllZF9uYW1lKTsKKyAgICAgICAgaWYgKGF1dG8qIGNhbmRpY2F0ZV9kZXNjcmlwdG9yID0gc3ltYm9sLmVudW1fdmFsdWVfZGVzY3JpcHRvcigpKSB7CisgICAgICAgICAgaWYgKGNhbmRpY2F0ZV9kZXNjcmlwdG9yLT50eXBlKCkgIT0gZW51bV90eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAiRW51bSB0eXBlIFwiIiArIGVudW1fdHlwZS0+ZnVsbF9uYW1lKCkgKworICAgICAgICAgICAgICAgICJcIiBoYXMgbm8gdmFsdWUgbmFtZWQgXCIiICsgdmFsdWVfbmFtZSArICJcIiBmb3Igb3B0aW9uIFwiIiArCisgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAgICAgIlwiLiBUaGlzIGFwcGVhcnMgdG8gYmUgYSB2YWx1ZSBmcm9tIGEgc2libGluZyB0eXBlLiIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbnVtX3ZhbHVlID0gY2FuZGljYXRlX2Rlc2NyaXB0b3I7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBUaGUgZW51bSB0eXBlIGlzIGluIHRoZSBnZW5lcmF0ZWQgcG9vbCwgc28gd2UgY2FuIHNlYXJjaCBmb3IgdGhlCisgICAgICAgIC8vIHZhbHVlIHRoZXJlLgorICAgICAgICBlbnVtX3ZhbHVlID0gZW51bV90eXBlLT5GaW5kVmFsdWVCeU5hbWUodmFsdWVfbmFtZSk7CisgICAgICB9CisKKyAgICAgIGlmIChlbnVtX3ZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIkVudW0gdHlwZSBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPmVudW1fdHlwZSgpLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBoYXMgbm8gdmFsdWUgbmFtZWQgXCIiICsgdmFsdWVfbmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBTaWduLWV4dGVuc2lvbiBpcyBub3QgYSBwcm9ibGVtLCBzaW5jZSB3ZSBjYXN0IGRpcmVjdGx5IGZyb20gaW50MzJfdAorICAgICAgICAvLyB0byB1aW50NjRfdCwgd2l0aG91dCBmaXJzdCBnb2luZyB0aHJvdWdoIHVpbnQzMl90LgorICAgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KAorICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDxpbnQ2NF90PihlbnVtX3ZhbHVlLT5udW1iZXIoKSkpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgIGlmICghdW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfc3RyaW5nX3ZhbHVlKCkpIHsKKyAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoCisgICAgICAgICAgICAiVmFsdWUgbXVzdCBiZSBxdW90ZWQgc3RyaW5nIGZvciBzdHJpbmcgb3B0aW9uICIKKyAgICAgICAgICAgICJcIiIgKworICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIC8vIFRoZSBzdHJpbmcgaGFzIGFscmVhZHkgYmVlbiB1bnF1b3RlZCBhbmQgdW5lc2NhcGVkIGJ5IHRoZSBwYXJzZXIuCisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkTGVuZ3RoRGVsaW1pdGVkKG9wdGlvbl9maWVsZC0+bnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+c3RyaW5nX3ZhbHVlKCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgaWYgKCFTZXRBZ2dyZWdhdGVPcHRpb24ob3B0aW9uX2ZpZWxkLCB1bmtub3duX2ZpZWxkcykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworY2xhc3MgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpBZ2dyZWdhdGVPcHRpb25GaW5kZXIKKyAgICA6IHB1YmxpYyBUZXh0Rm9ybWF0OjpGaW5kZXIgeworIHB1YmxpYzoKKyAgRGVzY3JpcHRvckJ1aWxkZXIqIGJ1aWxkZXJfOworCisgIGNvbnN0IERlc2NyaXB0b3IqIEZpbmRBbnlUeXBlKGNvbnN0IE1lc3NhZ2UmIC8qbWVzc2FnZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmIChwcmVmaXggIT0gaW50ZXJuYWw6OmtUeXBlR29vZ2xlQXBpc0NvbVByZWZpeCAmJgorICAgICAgICBwcmVmaXggIT0gaW50ZXJuYWw6OmtUeXBlR29vZ2xlUHJvZENvbVByZWZpeCkgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGFzc2VydF9tdXRleF9oZWxkKGJ1aWxkZXJfLT5wb29sXyk7CisgICAgcmV0dXJuIGJ1aWxkZXJfLT5GaW5kU3ltYm9sKG5hbWUpLmRlc2NyaXB0b3IoKTsKKyAgfQorCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbihNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBhc3NlcnRfbXV0ZXhfaGVsZChidWlsZGVyXy0+cG9vbF8pOworICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7CisgICAgU3ltYm9sIHJlc3VsdCA9CisgICAgICAgIGJ1aWxkZXJfLT5Mb29rdXBTeW1ib2xOb1BsYWNlaG9sZGVyKG5hbWUsIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpKTsKKyAgICBpZiAoYXV0byogZmllbGQgPSByZXN1bHQuZmllbGRfZGVzY3JpcHRvcigpKSB7CisgICAgICByZXR1cm4gZmllbGQ7CisgICAgfSBlbHNlIGlmIChyZXN1bHQudHlwZSgpID09IFN5bWJvbDo6TUVTU0FHRSAmJgorICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3IqIGZvcmVpZ25fdHlwZSA9IHJlc3VsdC5kZXNjcmlwdG9yKCk7CisgICAgICAvLyBUaGUgdGV4dCBmb3JtYXQgYWxsb3dzIE1lc3NhZ2VTZXQgaXRlbXMgdG8gYmUgc3BlY2lmaWVkIHVzaW5nCisgICAgICAvLyB0aGUgdHlwZSBuYW1lLCByYXRoZXIgdGhhbiB0aGUgZXh0ZW5zaW9uIGlkZW50aWZpZXIuIElmIHRoZSBzeW1ib2wKKyAgICAgIC8vIGxvb2t1cCByZXR1cm5lZCBhIE1lc3NhZ2UsIGFuZCB0aGUgZW5jbG9zaW5nIE1lc3NhZ2UgaGFzCisgICAgICAvLyBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IHRydWUsIHRoZW4gcmV0dXJuIHRoZSBtZXNzYWdlIHNldAorICAgICAgLy8gZXh0ZW5zaW9uLCBpZiBvbmUgZXhpc3RzLgorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JlaWduX3R5cGUtPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24gPSBmb3JlaWduX3R5cGUtPmV4dGVuc2lvbihpKTsKKyAgICAgICAgaWYgKGV4dGVuc2lvbi0+Y29udGFpbmluZ190eXBlKCkgPT0gZGVzY3JpcHRvciAmJgorICAgICAgICAgICAgZXh0ZW5zaW9uLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgJiYKKyAgICAgICAgICAgIGV4dGVuc2lvbi0+aXNfb3B0aW9uYWwoKSAmJgorICAgICAgICAgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3R5cGUoKSA9PSBmb3JlaWduX3R5cGUpIHsKKyAgICAgICAgICAvLyBGb3VuZCBpdC4KKyAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworICB9Cit9OworCisvLyBBIGN1c3RvbSBlcnJvciBjb2xsZWN0b3IgdG8gcmVjb3JkIGFueSB0ZXh0LWZvcm1hdCBwYXJzaW5nIGVycm9ycworbmFtZXNwYWNlIHsKK2NsYXNzIEFnZ3JlZ2F0ZUVycm9yQ29sbGVjdG9yIDogcHVibGljIGlvOjpFcnJvckNvbGxlY3RvciB7CisgcHVibGljOgorICBzdGQ6OnN0cmluZyBlcnJvcl87CisKKyAgdm9pZCBBZGRFcnJvcihpbnQgLyogbGluZSAqLywgaW50IC8qIGNvbHVtbiAqLywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgb3ZlcnJpZGUgeworICAgIGlmICghZXJyb3JfLmVtcHR5KCkpIHsKKyAgICAgIGVycm9yXyArPSAiOyAiOworICAgIH0KKyAgICBlcnJvcl8gKz0gbWVzc2FnZTsKKyAgfQorCisgIHZvaWQgQWRkV2FybmluZyhpbnQgLyogbGluZSAqLywgaW50IC8qIGNvbHVtbiAqLywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBtZXNzYWdlICovKSBvdmVycmlkZSB7CisgICAgLy8gSWdub3JlIHdhcm5pbmdzCisgIH0KK307Cit9ICAvLyBuYW1lc3BhY2UKKworLy8gV2UgY29uc3RydWN0IGEgZHluYW1pYyBtZXNzYWdlIG9mIHRoZSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8KKy8vIG9wdGlvbl9maWVsZCwgcGFyc2UgdGhlIHN1cHBsaWVkIHRleHQtZm9ybWF0IHN0cmluZyBpbnRvIHRoaXMKKy8vIG1lc3NhZ2UsIGFuZCBzZXJpYWxpemUgdGhlIHJlc3VsdGluZyBtZXNzYWdlIHRvIHByb2R1Y2UgdGhlIHZhbHVlLgorYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OlNldEFnZ3JlZ2F0ZU9wdGlvbigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG9wdGlvbl9maWVsZCwgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgeworICBpZiAoIXVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpKSB7CisgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIk9wdGlvbiBcIiIgKyBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaXMgYSBtZXNzYWdlLiBUbyBzZXQgdGhlIGVudGlyZSBtZXNzYWdlLCB1c2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJzeW50YXggbGlrZSBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+bmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiID0geyA8cHJvdG8gdGV4dCBmb3JtYXQ+IH1cIi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJUbyBzZXQgZmllbGRzIHdpdGhpbiBpdCwgdXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3ludGF4IGxpa2UgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPm5hbWUoKSArICIuZm9vID0gdmFsdWVcIi4iKTsKKyAgfQorCisgIGNvbnN0IERlc2NyaXB0b3IqIHR5cGUgPSBvcHRpb25fZmllbGQtPm1lc3NhZ2VfdHlwZSgpOworICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gZHluYW1pYyhkeW5hbWljX2ZhY3RvcnlfLkdldFByb3RvdHlwZSh0eXBlKS0+TmV3KCkpOworICBHT09HTEVfQ0hFQ0soZHluYW1pYy5nZXQoKSAhPSBudWxscHRyKQorICAgICAgPDwgIkNvdWxkIG5vdCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgIiA8PCBvcHRpb25fZmllbGQtPkRlYnVnU3RyaW5nKCk7CisKKyAgQWdncmVnYXRlRXJyb3JDb2xsZWN0b3IgY29sbGVjdG9yOworICBBZ2dyZWdhdGVPcHRpb25GaW5kZXIgZmluZGVyOworICBmaW5kZXIuYnVpbGRlcl8gPSBidWlsZGVyXzsKKyAgVGV4dEZvcm1hdDo6UGFyc2VyIHBhcnNlcjsKKyAgcGFyc2VyLlJlY29yZEVycm9yc1RvKCZjb2xsZWN0b3IpOworICBwYXJzZXIuU2V0RmluZGVyKCZmaW5kZXIpOworICBpZiAoIXBhcnNlci5QYXJzZUZyb21TdHJpbmcodW5pbnRlcnByZXRlZF9vcHRpb25fLT5hZ2dyZWdhdGVfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMuZ2V0KCkpKSB7CisgICAgQWRkVmFsdWVFcnJvcigiRXJyb3Igd2hpbGUgcGFyc2luZyBvcHRpb24gdmFsdWUgZm9yIFwiIiArCisgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPm5hbWUoKSArICJcIjogIiArIGNvbGxlY3Rvci5lcnJvcl8pOworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWw7CisgICAgZHluYW1pYy0+U2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbCk7ICAvLyBOZXZlciBmYWlscworICAgIGlmIChvcHRpb25fZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSkgeworICAgICAgdW5rbm93bl9maWVsZHMtPkFkZExlbmd0aERlbGltaXRlZChvcHRpb25fZmllbGQtPm51bWJlcigpLCBzZXJpYWwpOworICAgIH0gZWxzZSB7CisgICAgICBHT09HTEVfQ0hFQ0tfRVEob3B0aW9uX2ZpZWxkLT50eXBlKCksIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCk7CisgICAgICBVbmtub3duRmllbGRTZXQqIGdyb3VwID0gdW5rbm93bl9maWVsZHMtPkFkZEdyb3VwKG9wdGlvbl9maWVsZC0+bnVtYmVyKCkpOworICAgICAgZ3JvdXAtPlBhcnNlRnJvbVN0cmluZyhzZXJpYWwpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6U2V0SW50MzIoCisgICAgaW50IG51bWJlciwgaW50MzJfdCB2YWx1ZSwgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUsCisgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMjoKKyAgICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQoCisgICAgICAgICAgbnVtYmVyLCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RhdGljX2Nhc3Q8aW50NjRfdD4odmFsdWUpKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOgorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkMzIobnVtYmVyLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCgKKyAgICAgICAgICBudW1iZXIsIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRW5jb2RlMzIodmFsdWUpKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJJbnZhbGlkIHdpcmUgdHlwZSBmb3IgQ1BQVFlQRV9JTlQzMjogIiA8PCB0eXBlOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OlNldEludDY0KAorICAgIGludCBudW1iZXIsIGludDY0X3QgdmFsdWUsIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlLAorICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQ6CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KG51bWJlciwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHZhbHVlKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OgorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkNjQobnVtYmVyLCBzdGF0aWNfY2FzdDx1aW50NjRfdD4odmFsdWUpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0OgorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCgKKyAgICAgICAgICBudW1iZXIsIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRW5jb2RlNjQodmFsdWUpKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJJbnZhbGlkIHdpcmUgdHlwZSBmb3IgQ1BQVFlQRV9JTlQ2NDogIiA8PCB0eXBlOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OlNldFVJbnQzMigKKyAgICBpbnQgbnVtYmVyLCB1aW50MzJfdCB2YWx1ZSwgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUsCisgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzI6CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KG51bWJlciwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHZhbHVlKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzI6CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkRml4ZWQzMihudW1iZXIsIHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWx1ZSkpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkludmFsaWQgd2lyZSB0eXBlIGZvciBDUFBUWVBFX1VJTlQzMjogIiA8PCB0eXBlOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OlNldFVJbnQ2NCgKKyAgICBpbnQgbnVtYmVyLCB1aW50NjRfdCB2YWx1ZSwgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUsCisgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQ6CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KG51bWJlciwgdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0OgorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkNjQobnVtYmVyLCB2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiSW52YWxpZCB3aXJlIHR5cGUgZm9yIENQUFRZUEVfVUlOVDY0OiAiIDw8IHR5cGU7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpMb2dVbnVzZWREZXBlbmRlbmN5KGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogcmVzdWx0KSB7CisgICh2b2lkKXJlc3VsdDsgIC8vIFBhcmFtZXRlciBpcyB1c2VkIGJ5IEdvb2dsZS1pbnRlcm5hbCBjb2RlLgorCisgIGlmICghdW51c2VkX2RlcGVuZGVuY3lfLmVtcHR5KCkpIHsKKyAgICBhdXRvIGl0ciA9IHBvb2xfLT51bnVzZWRfaW1wb3J0X3RyYWNrX2ZpbGVzXy5maW5kKHByb3RvLm5hbWUoKSk7CisgICAgYm9vbCBpc19lcnJvciA9CisgICAgICAgIGl0ciAhPSBwb29sXy0+dW51c2VkX2ltcG9ydF90cmFja19maWxlc18uZW5kKCkgJiYgaXRyLT5zZWNvbmQ7CisgICAgZm9yIChzdGQ6OnNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgdW51c2VkX2RlcGVuZGVuY3lfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB1bnVzZWRfZGVwZW5kZW5jeV8uZW5kKCk7ICsraXQpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGVycm9yX21lc3NhZ2UgPSAiSW1wb3J0ICIgKyAoKml0KS0+bmFtZSgpICsgIiBpcyB1bnVzZWQuIjsKKyAgICAgIGlmIChpc19lcnJvcikgeworICAgICAgICBBZGRFcnJvcigoKml0KS0+bmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpJTVBPUlQsCisgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQWRkV2FybmluZygoKml0KS0+bmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpJTVBPUlQsCisgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK1N5bWJvbCBEZXNjcmlwdG9yUG9vbDo6Q3Jvc3NMaW5rT25EZW1hbmRIZWxwZXIoU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHBlY3RpbmdfZW51bSkgY29uc3QgeworICAodm9pZClleHBlY3RpbmdfZW51bTsgIC8vIFBhcmFtZXRlciBpcyB1c2VkIGJ5IEdvb2dsZS1pbnRlcm5hbCBjb2RlLgorICBhdXRvIGxvb2t1cF9uYW1lID0gc3RkOjpzdHJpbmcobmFtZSk7CisgIGlmICghbG9va3VwX25hbWUuZW1wdHkoKSAmJiBsb29rdXBfbmFtZVswXSA9PSAnLicpIHsKKyAgICBsb29rdXBfbmFtZSA9IGxvb2t1cF9uYW1lLnN1YnN0cigxKTsKKyAgfQorICBTeW1ib2wgcmVzdWx0ID0gdGFibGVzXy0+RmluZEJ5TmFtZUhlbHBlcih0aGlzLCBsb29rdXBfbmFtZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEhhbmRsZSB0aGUgbGF6eSBpbXBvcnQgYnVpbGRpbmcgZm9yIGEgbWVzc2FnZSBmaWVsZCB3aG9zZSB0eXBlIHdhc24ndCBidWlsdAorLy8gYXQgY3Jvc3MgbGluayB0aW1lLiBJZiB0aGF0IHdhcyB0aGUgY2FzZSwgd2Ugc2F2ZWQgdGhlIG5hbWUgb2YgdGhlIHR5cGUgdG8KKy8vIGJlIGxvb2tlZCB1cCB3aGVuIHRoZSBhY2Nlc3NvciBmb3IgdGhlIHR5cGUgd2FzIGNhbGxlZC4gU2V0IHR5cGVfLAorLy8gZW51bV90eXBlXywgbWVzc2FnZV90eXBlXywgYW5kIGRlZmF1bHRfdmFsdWVfZW51bV8gYXBwcm9wcmlhdGVseS4KK3ZvaWQgRmllbGREZXNjcmlwdG9yOjpJbnRlcm5hbFR5cGVPbmNlSW5pdCgpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKGZpbGUoKS0+ZmluaXNoZWRfYnVpbGRpbmdfID09IHRydWUpOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciogbGF6eV90eXBlX25hbWUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih0eXBlX29uY2VfICsgMSk7CisgIGNvbnN0IGNoYXIqIGxhenlfZGVmYXVsdF92YWx1ZV9lbnVtX25hbWUgPQorICAgICAgbGF6eV90eXBlX25hbWUgKyBzdHJsZW4obGF6eV90eXBlX25hbWUpICsgMTsKKyAgU3ltYm9sIHJlc3VsdCA9IGZpbGUoKS0+cG9vbCgpLT5Dcm9zc0xpbmtPbkRlbWFuZEhlbHBlcigKKyAgICAgIGxhenlfdHlwZV9uYW1lLCB0eXBlXyA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSk7CisgIGlmIChyZXN1bHQudHlwZSgpID09IFN5bWJvbDo6TUVTU0FHRSkgeworICAgIHR5cGVfID0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U7CisgICAgdHlwZV9kZXNjcmlwdG9yXy5tZXNzYWdlX3R5cGUgPSByZXN1bHQuZGVzY3JpcHRvcigpOworICB9IGVsc2UgaWYgKHJlc3VsdC50eXBlKCkgPT0gU3ltYm9sOjpFTlVNKSB7CisgICAgdHlwZV8gPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTTsKKyAgICBlbnVtX3R5cGUgPSB0eXBlX2Rlc2NyaXB0b3JfLmVudW1fdHlwZSA9IHJlc3VsdC5lbnVtX2Rlc2NyaXB0b3IoKTsKKyAgfQorCisgIGlmIChlbnVtX3R5cGUpIHsKKyAgICBpZiAobGF6eV9kZWZhdWx0X3ZhbHVlX2VudW1fbmFtZVswXSAhPSAnXDAnKSB7CisgICAgICAvLyBIYXZlIHRvIGJ1aWxkIHRoZSBmdWxsIG5hbWUgbm93IGluc3RlYWQgb2YgYXQgQ3Jvc3NMaW5rIHRpbWUsCisgICAgICAvLyBiZWNhdXNlIGVudW1fdHlwZSBtYXkgbm90IGJlIGtub3duIGF0IHRoZSB0aW1lLgorICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGVudW1fdHlwZS0+ZnVsbF9uYW1lKCk7CisgICAgICAvLyBFbnVtIHZhbHVlcyByZXNpZGUgaW4gdGhlIHNhbWUgc2NvcGUgYXMgdGhlIGVudW0gdHlwZS4KKyAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdF9kb3QgPSBuYW1lLmZpbmRfbGFzdF9vZignLicpOworICAgICAgaWYgKGxhc3RfZG90ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigwLCBsYXN0X2RvdCkgKyAiLiIgKyBsYXp5X2RlZmF1bHRfdmFsdWVfZW51bV9uYW1lOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmFtZSA9IGxhenlfZGVmYXVsdF92YWx1ZV9lbnVtX25hbWU7CisgICAgICB9CisgICAgICBTeW1ib2wgcmVzdWx0ID0gZmlsZSgpLT5wb29sKCktPkNyb3NzTGlua09uRGVtYW5kSGVscGVyKG5hbWUsIHRydWUpOworICAgICAgZGVmYXVsdF92YWx1ZV9lbnVtXyA9IHJlc3VsdC5lbnVtX3ZhbHVlX2Rlc2NyaXB0b3IoKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVmYXVsdF92YWx1ZV9lbnVtXyA9IG51bGxwdHI7CisgICAgfQorICAgIGlmICghZGVmYXVsdF92YWx1ZV9lbnVtXykgeworICAgICAgLy8gV2UgdXNlIHRoZSBmaXJzdCBkZWZpbmVkIHZhbHVlIGFzIHRoZSBkZWZhdWx0CisgICAgICAvLyBpZiBhIGRlZmF1bHQgaXMgbm90IGV4cGxpY2l0bHkgZGVmaW5lZC4KKyAgICAgIEdPT0dMRV9DSEVDSyhlbnVtX3R5cGUtPnZhbHVlX2NvdW50KCkpOworICAgICAgZGVmYXVsdF92YWx1ZV9lbnVtXyA9IGVudW1fdHlwZS0+dmFsdWUoMCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRmllbGREZXNjcmlwdG9yOjpUeXBlT25jZUluaXQoY29uc3QgRmllbGREZXNjcmlwdG9yKiB0b19pbml0KSB7CisgIHRvX2luaXQtPkludGVybmFsVHlwZU9uY2VJbml0KCk7Cit9CisKKy8vIG1lc3NhZ2VfdHlwZSgpLCBlbnVtX3R5cGUoKSwgZGVmYXVsdF92YWx1ZV9lbnVtKCksIGFuZCB0eXBlKCkKKy8vIGFsbCBzaGFyZSB0aGUgc2FtZSBpbnRlcm5hbDo6Y2FsbF9vbmNlIGluaXQgcGF0aCB0byBkbyBsYXp5CisvLyBpbXBvcnQgYnVpbGRpbmcgYW5kIGNyb3NzIGxpbmtpbmcgb2YgYSBmaWVsZCBvZiBhIG1lc3NhZ2UuCitjb25zdCBEZXNjcmlwdG9yKiBGaWVsZERlc2NyaXB0b3I6Om1lc3NhZ2VfdHlwZSgpIGNvbnN0IHsKKyAgaWYgKHR5cGVfb25jZV8pIHsKKyAgICBpbnRlcm5hbDo6Y2FsbF9vbmNlKCp0eXBlX29uY2VfLCBGaWVsZERlc2NyaXB0b3I6OlR5cGVPbmNlSW5pdCwgdGhpcyk7CisgIH0KKyAgcmV0dXJuIHR5cGVfID09IFRZUEVfTUVTU0FHRSB8fCB0eXBlXyA9PSBUWVBFX0dST1VQCisgICAgICAgICAgICAgPyB0eXBlX2Rlc2NyaXB0b3JfLm1lc3NhZ2VfdHlwZQorICAgICAgICAgICAgIDogbnVsbHB0cjsKK30KKworY29uc3QgRW51bURlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvcjo6ZW51bV90eXBlKCkgY29uc3QgeworICBpZiAodHlwZV9vbmNlXykgeworICAgIGludGVybmFsOjpjYWxsX29uY2UoKnR5cGVfb25jZV8sIEZpZWxkRGVzY3JpcHRvcjo6VHlwZU9uY2VJbml0LCB0aGlzKTsKKyAgfQorICByZXR1cm4gdHlwZV8gPT0gVFlQRV9FTlVNID8gdHlwZV9kZXNjcmlwdG9yXy5lbnVtX3R5cGUgOiBudWxscHRyOworfQorCitjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaWVsZERlc2NyaXB0b3I6OmRlZmF1bHRfdmFsdWVfZW51bSgpIGNvbnN0IHsKKyAgaWYgKHR5cGVfb25jZV8pIHsKKyAgICBpbnRlcm5hbDo6Y2FsbF9vbmNlKCp0eXBlX29uY2VfLCBGaWVsZERlc2NyaXB0b3I6OlR5cGVPbmNlSW5pdCwgdGhpcyk7CisgIH0KKyAgcmV0dXJuIGRlZmF1bHRfdmFsdWVfZW51bV87Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3I6OlByaW50YWJsZU5hbWVGb3JFeHRlbnNpb24oKSBjb25zdCB7CisgIGNvbnN0IGJvb2wgaXNfbWVzc2FnZV9zZXRfZXh0ZW5zaW9uID0KKyAgICAgIGlzX2V4dGVuc2lvbigpICYmCisgICAgICBjb250YWluaW5nX3R5cGUoKS0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgJiYKKyAgICAgIHR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSAmJiBpc19vcHRpb25hbCgpICYmCisgICAgICBleHRlbnNpb25fc2NvcGUoKSA9PSBtZXNzYWdlX3R5cGUoKTsKKyAgcmV0dXJuIGlzX21lc3NhZ2Vfc2V0X2V4dGVuc2lvbiA/IG1lc3NhZ2VfdHlwZSgpLT5mdWxsX25hbWUoKSA6IGZ1bGxfbmFtZSgpOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yOjpJbnRlcm5hbERlcGVuZGVuY2llc09uY2VJbml0KCkgY29uc3QgeworICBHT09HTEVfQ0hFQ0soZmluaXNoZWRfYnVpbGRpbmdfID09IHRydWUpOworICBjb25zdCBjaGFyKiBuYW1lc19wdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkZXBlbmRlbmNpZXNfb25jZV8gKyAxKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBuYW1lc19wdHI7CisgICAgbmFtZXNfcHRyICs9IHN0cmxlbihuYW1lKSArIDE7CisgICAgaWYgKG5hbWVbMF0gIT0gJ1wwJykgeworICAgICAgZGVwZW5kZW5jaWVzX1tpXSA9IHBvb2xfLT5GaW5kRmlsZUJ5TmFtZShuYW1lKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBGaWxlRGVzY3JpcHRvcjo6RGVwZW5kZW5jaWVzT25jZUluaXQoY29uc3QgRmlsZURlc2NyaXB0b3IqIHRvX2luaXQpIHsKKyAgdG9faW5pdC0+SW50ZXJuYWxEZXBlbmRlbmNpZXNPbmNlSW5pdCgpOworfQorCitjb25zdCBGaWxlRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3I6OmRlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdCB7CisgIGlmIChkZXBlbmRlbmNpZXNfb25jZV8pIHsKKyAgICAvLyBEbyBvbmNlIGluaXQgZm9yIGFsbCBpbmRpY2VzLCBhcyBpdCdzIHVubGlrZWx5IG9ubHkgYSBzaW5nbGUgaW5kZXggd291bGQKKyAgICAvLyBiZSBjYWxsZWQsIGFuZCBzYXZlcyBvbiBpbnRlcm5hbDo6Y2FsbF9vbmNlIGFsbG9jYXRpb25zLgorICAgIGludGVybmFsOjpjYWxsX29uY2UoKmRlcGVuZGVuY2llc19vbmNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yOjpEZXBlbmRlbmNpZXNPbmNlSW5pdCwgdGhpcyk7CisgIH0KKyAgcmV0dXJuIGRlcGVuZGVuY2llc19baW5kZXhdOworfQorCitjb25zdCBEZXNjcmlwdG9yKiBNZXRob2REZXNjcmlwdG9yOjppbnB1dF90eXBlKCkgY29uc3QgeworICByZXR1cm4gaW5wdXRfdHlwZV8uR2V0KHNlcnZpY2UoKSk7Cit9CisKK2NvbnN0IERlc2NyaXB0b3IqIE1ldGhvZERlc2NyaXB0b3I6Om91dHB1dF90eXBlKCkgY29uc3QgeworICByZXR1cm4gb3V0cHV0X3R5cGVfLkdldChzZXJ2aWNlKCkpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgewordm9pZCBMYXp5RGVzY3JpcHRvcjo6U2V0KGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgR09PR0xFX0NIRUNLKCFvbmNlXyk7CisgIGRlc2NyaXB0b3JfID0gZGVzY3JpcHRvcjsKK30KKwordm9pZCBMYXp5RGVzY3JpcHRvcjo6U2V0TGF6eShTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICAvLyB2ZXJpZnkgSW5pdCgpIGhhcyBiZWVuIGNhbGxlZCBhbmQgU2V0IGhhc24ndCBiZWVuIGNhbGxlZCB5ZXQuCisgIEdPT0dMRV9DSEVDSyghZGVzY3JpcHRvcl8pOworICBHT09HTEVfQ0hFQ0soIW9uY2VfKTsKKyAgR09PR0xFX0NIRUNLKGZpbGUgJiYgZmlsZS0+cG9vbF8pOworICBHT09HTEVfQ0hFQ0soZmlsZS0+cG9vbF8tPmxhemlseV9idWlsZF9kZXBlbmRlbmNpZXNfKTsKKyAgR09PR0xFX0NIRUNLKCFmaWxlLT5maW5pc2hlZF9idWlsZGluZ18pOworICBvbmNlXyA9IDo6bmV3IChmaWxlLT5wb29sXy0+dGFibGVzXy0+QWxsb2NhdGVCeXRlcyhzdGF0aWNfY2FzdDxpbnQ+KAorICAgICAgc2l6ZW9mKGludGVybmFsOjpvbmNlX2ZsYWcpICsgbmFtZS5zaXplKCkgKyAxKSkpIGludGVybmFsOjpvbmNlX2ZsYWd7fTsKKyAgY2hhciogbGF6eV9uYW1lID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ob25jZV8gKyAxKTsKKyAgbWVtY3B5KGxhenlfbmFtZSwgbmFtZS5kYXRhKCksIG5hbWUuc2l6ZSgpKTsKKyAgbGF6eV9uYW1lW25hbWUuc2l6ZSgpXSA9IDA7Cit9CisKK3ZvaWQgTGF6eURlc2NyaXB0b3I6Ok9uY2UoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UpIHsKKyAgaWYgKG9uY2VfKSB7CisgICAgaW50ZXJuYWw6OmNhbGxfb25jZSgqb25jZV8sIFsmXSB7CisgICAgICBhdXRvKiBmaWxlID0gc2VydmljZS0+ZmlsZSgpOworICAgICAgR09PR0xFX0NIRUNLKGZpbGUtPmZpbmlzaGVkX2J1aWxkaW5nXyk7CisgICAgICBjb25zdCBjaGFyKiBsYXp5X25hbWUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihvbmNlXyArIDEpOworICAgICAgZGVzY3JpcHRvcl8gPQorICAgICAgICAgIGZpbGUtPnBvb2xfLT5Dcm9zc0xpbmtPbkRlbWFuZEhlbHBlcihsYXp5X25hbWUsIGZhbHNlKS5kZXNjcmlwdG9yKCk7CisgICAgfSk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTUzNmU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmgKQEAgLTAsMCArMSwyNDQwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGNsYXNzZXMgd2hpY2ggZGVzY3JpYmUgYSB0eXBlIG9mIHByb3RvY29sIG1lc3NhZ2UuCisvLyBZb3UgY2FuIHVzZSBhIG1lc3NhZ2UncyBkZXNjcmlwdG9yIHRvIGxlYXJuIGF0IHJ1bnRpbWUgd2hhdCBmaWVsZHMKKy8vIGl0IGNvbnRhaW5zIGFuZCB3aGF0IHRoZSB0eXBlcyBvZiB0aG9zZSBmaWVsZHMgYXJlLiAgVGhlIE1lc3NhZ2UKKy8vIGludGVyZmFjZSBhbHNvIGFsbG93cyB5b3UgdG8gZHluYW1pY2FsbHkgYWNjZXNzIGFuZCBtb2RpZnkgaW5kaXZpZHVhbAorLy8gZmllbGRzIGJ5IHBhc3NpbmcgdGhlIEZpZWxkRGVzY3JpcHRvciBvZiB0aGUgZmllbGQgeW91IGFyZSBpbnRlcmVzdGVkCisvLyBpbi4KKy8vCisvLyBNb3N0IHVzZXJzIHdpbGwgbm90IGNhcmUgYWJvdXQgZGVzY3JpcHRvcnMsIGJlY2F1c2UgdGhleSB3aWxsIHdyaXRlCisvLyBjb2RlIHNwZWNpZmljIHRvIGNlcnRhaW4gcHJvdG9jb2wgdHlwZXMgYW5kIHdpbGwgc2ltcGx5IHVzZSB0aGUgY2xhc3NlcworLy8gZ2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBjb21waWxlciBkaXJlY3RseS4gIEFkdmFuY2VkIHVzZXJzIHdobyB3YW50CisvLyB0byBvcGVyYXRlIG9uIGFyYml0cmFyeSB0eXBlcyAobm90IGtub3duIGF0IGNvbXBpbGUgdGltZSkgbWF5IHdhbnQgdG8KKy8vIHJlYWQgZGVzY3JpcHRvcnMgaW4gb3JkZXIgdG8gbGVhcm4gYWJvdXQgdGhlIGNvbnRlbnRzIG9mIGEgbWVzc2FnZS4KKy8vIEEgdmVyeSBzbWFsbCBudW1iZXIgb2YgdXNlcnMgd2lsbCB3YW50IHRvIGNvbnN0cnVjdCB0aGVpciBvd24KKy8vIERlc2NyaXB0b3JzLCBlaXRoZXIgYmVjYXVzZSB0aGV5IGFyZSBpbXBsZW1lbnRpbmcgTWVzc2FnZSBtYW51YWxseSBvcgorLy8gYmVjYXVzZSB0aGV5IGFyZSB3cml0aW5nIHNvbWV0aGluZyBsaWtlIHRoZSBwcm90b2NvbCBjb21waWxlci4KKy8vCisvLyBGb3IgYW4gZXhhbXBsZSBvZiBob3cgeW91IG1pZ2h0IHVzZSBkZXNjcmlwdG9ycywgc2VlIHRoZSBjb2RlIGV4YW1wbGUKKy8vIGF0IHRoZSB0b3Agb2YgbWVzc2FnZS5oLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUl9IX18KKworCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbXV0ZXguaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0Lmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCisvLyBUWVBFX0JPT0wgaXMgZGVmaW5lZCBpbiB0aGUgTWFjT1MncyBDb25kaXRpb25hbE1hY3Jvcy5oLgorI2lmZGVmIFRZUEVfQk9PTAorI3VuZGVmIFRZUEVfQk9PTAorI2VuZGlmICAvLyBUWVBFX0JPT0wKKworI2lmZGVmIFNXSUcKKyNkZWZpbmUgUFJPVE9CVUZfRVhQT1JUCisjZW5kaWYKKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgorY2xhc3MgRGVzY3JpcHRvcjsKK2NsYXNzIEZpZWxkRGVzY3JpcHRvcjsKK2NsYXNzIE9uZW9mRGVzY3JpcHRvcjsKK2NsYXNzIEVudW1EZXNjcmlwdG9yOworY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvcjsKK2NsYXNzIFNlcnZpY2VEZXNjcmlwdG9yOworY2xhc3MgTWV0aG9kRGVzY3JpcHRvcjsKK2NsYXNzIEZpbGVEZXNjcmlwdG9yOworY2xhc3MgRGVzY3JpcHRvckRhdGFiYXNlOworY2xhc3MgRGVzY3JpcHRvclBvb2w7CisKKy8vIERlZmluZWQgaW4gZGVzY3JpcHRvci5wcm90bworY2xhc3MgRGVzY3JpcHRvclByb3RvOworY2xhc3MgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOworY2xhc3MgRmllbGREZXNjcmlwdG9yUHJvdG87CitjbGFzcyBPbmVvZkRlc2NyaXB0b3JQcm90bzsKK2NsYXNzIEVudW1EZXNjcmlwdG9yUHJvdG87CitjbGFzcyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG87CitjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOworY2xhc3MgTWV0aG9kRGVzY3JpcHRvclByb3RvOworY2xhc3MgRmlsZURlc2NyaXB0b3JQcm90bzsKK2NsYXNzIE1lc3NhZ2VPcHRpb25zOworY2xhc3MgRmllbGRPcHRpb25zOworY2xhc3MgT25lb2ZPcHRpb25zOworY2xhc3MgRW51bU9wdGlvbnM7CitjbGFzcyBFbnVtVmFsdWVPcHRpb25zOworY2xhc3MgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOworY2xhc3MgU2VydmljZU9wdGlvbnM7CitjbGFzcyBNZXRob2RPcHRpb25zOworY2xhc3MgRmlsZU9wdGlvbnM7CitjbGFzcyBVbmludGVycHJldGVkT3B0aW9uOworY2xhc3MgU291cmNlQ29kZUluZm87CisKKy8vIERlZmluZWQgaW4gbWVzc2FnZS5oCitjbGFzcyBNZXNzYWdlOworY2xhc3MgUmVmbGVjdGlvbjsKKworLy8gRGVmaW5lZCBpbiBkZXNjcmlwdG9yLmNjCitjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKK2NsYXNzIEZpbGVEZXNjcmlwdG9yVGFibGVzOworY2xhc3MgU3ltYm9sOworCisvLyBEZWZpbmVkIGluIHVua25vd25fZmllbGRfc2V0LmguCitjbGFzcyBVbmtub3duRmllbGQ7CisKKy8vIERlZmluZWQgaW4gY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK2NsYXNzIENvbW1hbmRMaW5lSW50ZXJmYWNlOworbmFtZXNwYWNlIGNwcCB7CisvLyBEZWZpbmVkIGluIGhlbHBlcnMuaAorY2xhc3MgRm9ybWF0dGVyOworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCisKK25hbWVzcGFjZSBkZXNjcmlwdG9yX3VuaXR0ZXN0IHsKK2NsYXNzIERlc2NyaXB0b3JUZXN0OworfSAgLy8gbmFtZXNwYWNlIGRlc2NyaXB0b3JfdW5pdHRlc3QKKworLy8gRGVmaW5lZCBpbiBwcmludGVyLmgKK25hbWVzcGFjZSBpbyB7CitjbGFzcyBQcmludGVyOworfSAgLy8gbmFtZXNwYWNlIGlvCisKKy8vIE5CLCBhbGwgaW5kaWNlcyBhcmUgemVyby1iYXNlZC4KK3N0cnVjdCBTb3VyY2VMb2NhdGlvbiB7CisgIGludCBzdGFydF9saW5lOworICBpbnQgZW5kX2xpbmU7CisgIGludCBzdGFydF9jb2x1bW47CisgIGludCBlbmRfY29sdW1uOworCisgIC8vIERvYyBjb21tZW50cyBmb3VuZCBhdCB0aGUgc291cmNlIGxvY2F0aW9uLgorICAvLyBTZWUgdGhlIGNvbW1lbnRzIGluIFNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIChkZXNjcmlwdG9yLnByb3RvKSBmb3IgZGV0YWlscy4KKyAgc3RkOjpzdHJpbmcgbGVhZGluZ19jb21tZW50czsKKyAgc3RkOjpzdHJpbmcgdHJhaWxpbmdfY29tbWVudHM7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzOworfTsKKworLy8gT3B0aW9ucyB3aGVuIGdlbmVyYXRpbmcgbWFjaGluZS1wYXJzYWJsZSBvdXRwdXQgZnJvbSBhIGRlc2NyaXB0b3Igd2l0aAorLy8gRGVidWdTdHJpbmcoKS4KK3N0cnVjdCBEZWJ1Z1N0cmluZ09wdGlvbnMgeworICAvLyBpbmNsdWRlIG9yaWdpbmFsIHVzZXIgY29tbWVudHMgYXMgcmVjb3JkZWQgaW4gU291cmNlTG9jYXRpb24gZW50cmllcy4gTi5CLgorICAvLyB0aGF0IHRoaXMgbXVzdCBiZSB8ZmFsc2V8IGJ5IGRlZmF1bHQ6IHNldmVyYWwgb3RoZXIgcGllY2VzIG9mIGNvZGUgKGZvcgorICAvLyBleGFtcGxlLCB0aGUgQysrIGNvZGUgZ2VuZXJhdGlvbiBmb3IgZmllbGRzIGluIHRoZSBwcm90byBjb21waWxlcikgcmVseSBvbgorICAvLyBEZWJ1Z1N0cmluZygpIG91dHB1dCBiZWluZyB1bm9ic3RydWN0ZWQgYnkgdXNlciBjb21tZW50cy4KKyAgYm9vbCBpbmNsdWRlX2NvbW1lbnRzOworICAvLyBJZiB0cnVlLCBlbGlkZSB0aGUgYnJhY2VkIGJvZHkgaW4gdGhlIGRlYnVnIHN0cmluZy4KKyAgYm9vbCBlbGlkZV9ncm91cF9ib2R5OworICBib29sIGVsaWRlX29uZW9mX2JvZHk7CisKKyAgRGVidWdTdHJpbmdPcHRpb25zKCkKKyAgICAgIDogaW5jbHVkZV9jb21tZW50cyhmYWxzZSksCisgICAgICAgIGVsaWRlX2dyb3VwX2JvZHkoZmFsc2UpLAorICAgICAgICBlbGlkZV9vbmVvZl9ib2R5KGZhbHNlKSB7CisgIH0KK307CisKKy8vIEEgY2xhc3MgdG8gaGFuZGxlIHRoZSBzaW1wbGVzdCBjYXNlcyBvZiBhIGxhemlseSBsaW5rZWQgZGVzY3JpcHRvcgorLy8gZm9yIGEgbWVzc2FnZSB0eXBlIHRoYXQgaXNuJ3QgYnVpbHQgYXQgdGhlIHRpbWUgb2YgY3Jvc3MgbGlua2luZywKKy8vIHdoaWNoIGlzIG5lZWRlZCB3aGVuIGEgcG9vbCBoYXMgbGF6aWx5X2J1aWxkX2RlcGVuZGVuY2llc18gc2V0LgorLy8gTXVzdCBiZSBpbnN0YW50aWF0ZWQgYXMgbXV0YWJsZSBpbiBhIGRlc2NyaXB0b3IuCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGUgY2xhc3NlcyBpbiB0aGlzIGZpbGUgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgbWVtb3J5IGZvb3RwcmludCBmb3IgdGhlCisvLyBsaWJyYXJ5LiBXZSBtYWtlIHN1cmUgd2UgYXJlIG5vdCBhY2NpZGVudGFsbHkgbWFraW5nIHRoZW0gbGFyZ2VyIGJ5CisvLyBoYXJkY29kaW5nIHRoZSBzdHJ1Y3Qgc2l6ZSBmb3IgYSBzcGVjaWZpYyBwbGF0Zm9ybS4gVXNlIGFzOgorLy8KKy8vICAgUFJPVE9CVUZfSU5URVJOQUxfQ0hFQ0tfQ0xBU1NfU0laRSh0eXBlLCBleHBlY3RlZF9zaXplX2luX3g4NC02NCk7CisvLworCisjaWYgIWRlZmluZWQoUFJPVE9CVUZfSU5URVJOQUxfQ0hFQ0tfQ0xBU1NfU0laRSkKKyNkZWZpbmUgUFJPVE9CVUZfSU5URVJOQUxfQ0hFQ0tfQ0xBU1NfU0laRSh0LCBleHBlY3RlZCkKKyNlbmRpZgorCitjbGFzcyBGbGF0QWxsb2NhdG9yOworCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTGF6eURlc2NyaXB0b3IgeworIHB1YmxpYzoKKyAgLy8gSW5pdCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYXQgaW5pdCB0aW1lIG9mIGEgZGVzY3JpcHRvciBjb250YWluaW5nCisgIC8vIGEgTGF6eURlc2NyaXB0b3IuCisgIHZvaWQgSW5pdCgpIHsKKyAgICBkZXNjcmlwdG9yXyA9IG51bGxwdHI7CisgICAgb25jZV8gPSBudWxscHRyOworICB9CisKKyAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRlc2NyaXB0b3IgaWYgaXQgaXMga25vd24gZHVyaW5nIHRoZSBkZXNjcmlwdG9yCisgIC8vIGJ1aWxkaW5nIHByb2Nlc3MuIE5vdCB0aHJlYWQgc2FmZSwgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyB0aGUKKyAgLy8gZGVzY3JpcHRvciBidWlsZCBwcm9jZXNzLiBTaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciBTZXRMYXp5IGhhcyBiZWVuCisgIC8vIGNhbGxlZC4KKyAgdm9pZCBTZXQoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKKyAgLy8gU2V0cyB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGxhemlseSBjcm9zcyBsaW5rIHRoZSBkZXNjcmlwdG9yIGF0IGEgbGF0ZXIKKyAgLy8gdGltZSwgU2V0TGF6eSBpcyBub3QgdGhyZWFkIHNhZmUsIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlIGF0IGRlc2NyaXB0b3IKKyAgLy8gYnVpbGQgdGltZSBpZiB0aGUgc3ltYm9sIHdhc24ndCBmb3VuZCBhbmQgYnVpbGRpbmcgb2YgdGhlIGZpbGUgY29udGFpbmluZworICAvLyB0aGF0IHR5cGUgaXMgZGVsYXllZCBiZWNhdXNlIGxhemlseV9idWlsZF9kZXBlbmRlbmNpZXNfIGlzIHNldCBvbiB0aGUgcG9vbC4KKyAgLy8gU2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgU2V0KCkgaGFzIGJlZW4gY2FsbGVkLgorICB2b2lkIFNldExhenkoU3RyaW5nUGllY2UgbmFtZSwgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworCisgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGRlc2NyaXB0b3IsIHRocmVhZC1zYWZlLiBJZiBTZXRMYXp5KC4uLikKKyAgLy8gaGFzIGJlZW4gY2FsbGVkLCB3aWxsIGRvIGEgb25lLXRpbWUgY3Jvc3MgbGluayBvZiB0aGUgdHlwZSBzcGVjaWZpZWQsCisgIC8vIGJ1aWxkaW5nIHRoZSBkZXNjcmlwdG9yIGZpbGUgdGhhdCBjb250YWlucyB0aGUgdHlwZSBpZiBuZWNlc3NhcnkuCisgIGlubGluZSBjb25zdCBEZXNjcmlwdG9yKiBHZXQoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UpIHsKKyAgICBPbmNlKHNlcnZpY2UpOworICAgIHJldHVybiBkZXNjcmlwdG9yXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBPbmNlKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlKTsKKworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgLy8gVGhlIG9uY2VfIGZsYWcgaXMgZm9sbG93ZWQgYnkgYSBOVUwgdGVybWluYXRlZCBzdHJpbmcgZm9yIHRoZSB0eXBlIG5hbWUuCisgIGludGVybmFsOjpvbmNlX2ZsYWcqIG9uY2VfOworfTsKKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFN5bWJvbEJhc2UgeworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBnb29nbGU6OnByb3RvYnVmOjpTeW1ib2w7CisgIHVpbnQ4X3Qgc3ltYm9sX3R5cGVfOworfTsKKworLy8gU29tZSB0eXBlcyBoYXZlIG1vcmUgdGhhbiBvbmUgU3ltYm9sQmFzZSBiZWNhdXNlIHRoZXkgaGF2ZSBtdWx0aXBsZQorLy8gaWRlbnRpdGllcyBpbiB0aGUgdGFibGUuIFdlIGNhbid0IGhhdmUgZHVwbGljYXRlIGRpcmVjdCBiYXNlcywgc28gd2UgdXNlIHRoaXMKKy8vIGludGVybWVkaWF0ZSBiYXNlIHRvIGRvIHNvLgorLy8gU2VlIEJ1aWxkRW51bVZhbHVlIGZvciBkZXRhaWxzLgordGVtcGxhdGUgPGludCBOPgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFN5bWJvbEJhc2VOIDogcHVibGljIFN5bWJvbEJhc2Uge307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBEZXNjcmliZXMgYSB0eXBlIG9mIHByb3RvY29sIG1lc3NhZ2UsIG9yIGEgcGFydGljdWxhciBncm91cCB3aXRoaW4gYQorLy8gbWVzc2FnZS4gIFRvIG9idGFpbiB0aGUgRGVzY3JpcHRvciBmb3IgYSBnaXZlbiBtZXNzYWdlIG9iamVjdCwgY2FsbAorLy8gTWVzc2FnZTo6R2V0RGVzY3JpcHRvcigpLiAgR2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3NlcyBhbHNvIGhhdmUgYQorLy8gc3RhdGljIG1ldGhvZCBjYWxsZWQgZGVzY3JpcHRvcigpIHdoaWNoIHJldHVybnMgdGhlIHR5cGUncyBkZXNjcmlwdG9yLgorLy8gVXNlIERlc2NyaXB0b3JQb29sIHRvIGNvbnN0cnVjdCB5b3VyIG93biBkZXNjcmlwdG9ycy4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBEZXNjcmlwdG9yIDogcHJpdmF0ZSBpbnRlcm5hbDo6U3ltYm9sQmFzZSB7CisgcHVibGljOgorICB0eXBlZGVmIERlc2NyaXB0b3JQcm90byBQcm90bzsKKworICAvLyBUaGUgbmFtZSBvZiB0aGUgbWVzc2FnZSB0eXBlLCBub3QgaW5jbHVkaW5nIGl0cyBzY29wZS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKworICAvLyBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG1lc3NhZ2UgdHlwZSwgc2NvcGUgZGVsaW1pdGVkIGJ5CisgIC8vIHBlcmlvZHMuICBGb3IgZXhhbXBsZSwgbWVzc2FnZSB0eXBlICJGb28iIHdoaWNoIGlzIGRlY2xhcmVkIGluIHBhY2thZ2UKKyAgLy8gImJhciIgaGFzIGZ1bGwgbmFtZSAiYmFyLkZvbyIuICBJZiBhIHR5cGUgIkJheiIgaXMgbmVzdGVkIHdpdGhpbgorICAvLyBGb28sIEJheidzIGZ1bGxfbmFtZSBpcyAiYmFyLkZvby5CYXoiLiAgVG8gZ2V0IG9ubHkgdGhlIHBhcnQgdGhhdAorICAvLyBjb21lcyBhZnRlciB0aGUgbGFzdCAnLicsIHVzZSBuYW1lKCkuCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsX25hbWUoKSBjb25zdDsKKworICAvLyBJbmRleCBvZiB0aGlzIGRlc2NyaXB0b3Igd2l0aGluIHRoZSBmaWxlIG9yIGNvbnRhaW5pbmcgdHlwZSdzIG1lc3NhZ2UKKyAgLy8gdHlwZSBhcnJheS4KKyAgaW50IGluZGV4KCkgY29uc3Q7CisKKyAgLy8gVGhlIC5wcm90byBmaWxlIGluIHdoaWNoIHRoaXMgbWVzc2FnZSB0eXBlIHdhcyBkZWZpbmVkLiAgTmV2ZXIgbnVsbHB0ci4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUoKSBjb25zdDsKKworICAvLyBJZiB0aGlzIERlc2NyaXB0b3IgZGVzY3JpYmVzIGEgbmVzdGVkIHR5cGUsIHRoaXMgcmV0dXJucyB0aGUgdHlwZQorICAvLyBpbiB3aGljaCBpdCBpcyBuZXN0ZWQuICBPdGhlcndpc2UsIHJldHVybnMgbnVsbHB0ci4KKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlKCkgY29uc3Q7CisKKyAgLy8gR2V0IG9wdGlvbnMgZm9yIHRoaXMgbWVzc2FnZSB0eXBlLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgLnByb3RvIGZpbGUKKyAgLy8gYnkgcGxhY2luZyBsaW5lcyBsaWtlICJvcHRpb24gZm9vID0gMTIzNDsiIGluIHRoZSBtZXNzYWdlIGRlZmluaXRpb24uCisgIC8vIEFsbG93ZWQgb3B0aW9ucyBhcmUgZGVmaW5lZCBieSBNZXNzYWdlT3B0aW9ucyBpbiBkZXNjcmlwdG9yLnByb3RvLCBhbmQgYW55CisgIC8vIGF2YWlsYWJsZSBleHRlbnNpb25zIG9mIHRoYXQgbWVzc2FnZS4KKyAgY29uc3QgTWVzc2FnZU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKworICAvLyBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhpcyBEZXNjcmlwdG9yIGludG8gdGhlIGdpdmVuIERlc2NyaXB0b3JQcm90by4KKyAgLy8gVGhlIHRhcmdldCBEZXNjcmlwdG9yUHJvdG8gbXVzdCBiZSBjbGVhciBiZWZvcmUgY2FsbGluZyB0aGlzOyBpZiBpdAorICAvLyBpc24ndCwgdGhlIHJlc3VsdCBtYXkgYmUgZ2FyYmFnZS4KKyAgdm9pZCBDb3B5VG8oRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7CisKKyAgLy8gV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZGVzY3JpcHRvciBpbiBhIGh1bWFuLXJlYWRhYmxlIGZvcm0uIE91dHB1dAorICAvLyB3aWxsIGJlIHN1aXRhYmxlIGZvciByZS1wYXJzaW5nLgorICBzdGQ6OnN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OworCisgIC8vIFNpbWlsYXIgdG8gRGVidWdTdHJpbmcoKSwgYnV0IGFkZGl0aW9uYWxseSB0YWtlcyBvcHRpb25zIChlLmcuLAorICAvLyBpbmNsdWRlIG9yaWdpbmFsIHVzZXIgY29tbWVudHMgaW4gb3V0cHV0KS4KKyAgc3RkOjpzdHJpbmcgRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGFuIHVua25vd24gdHlwZS4gVGhpcyB3aWxsCisgIC8vIG9ubHkgYmUgdGhlIGNhc2UgaWYgdGhpcyBkZXNjcmlwdG9yIGNvbWVzIGZyb20gYSBEZXNjcmlwdG9yUG9vbAorICAvLyB3aXRoIEFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpIHNldC4KKyAgYm9vbCBpc19wbGFjZWhvbGRlcigpIGNvbnN0OworCisgIGVudW0gV2VsbEtub3duVHlwZSB7CisgICAgV0VMTEtOT1dOVFlQRV9VTlNQRUNJRklFRCwgIC8vIE5vdCBhIHdlbGwta25vd24gdHlwZS4KKworICAgIC8vIFdyYXBwZXIgdHlwZXMuCisgICAgV0VMTEtOT1dOVFlQRV9ET1VCTEVWQUxVRSwgIC8vIGdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZQorICAgIFdFTExLTk9XTlRZUEVfRkxPQVRWQUxVRSwgICAvLyBnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZQorICAgIFdFTExLTk9XTlRZUEVfSU5UNjRWQUxVRSwgICAvLyBnb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZQorICAgIFdFTExLTk9XTlRZUEVfVUlOVDY0VkFMVUUsICAvLyBnb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUKKyAgICBXRUxMS05PV05UWVBFX0lOVDMyVkFMVUUsICAgLy8gZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUKKyAgICBXRUxMS05PV05UWVBFX1VJTlQzMlZBTFVFLCAgLy8gZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlCisgICAgV0VMTEtOT1dOVFlQRV9TVFJJTkdWQUxVRSwgIC8vIGdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZQorICAgIFdFTExLTk9XTlRZUEVfQllURVNWQUxVRSwgICAvLyBnb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZQorICAgIFdFTExLTk9XTlRZUEVfQk9PTFZBTFVFLCAgICAvLyBnb29nbGUucHJvdG9idWYuQm9vbFZhbHVlCisKKyAgICAvLyBPdGhlciB3ZWxsIGtub3duIHR5cGVzLgorICAgIFdFTExLTk9XTlRZUEVfQU5ZLCAgICAgICAgLy8gZ29vZ2xlLnByb3RvYnVmLkFueQorICAgIFdFTExLTk9XTlRZUEVfRklFTERNQVNLLCAgLy8gZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzaworICAgIFdFTExLTk9XTlRZUEVfRFVSQVRJT04sICAgLy8gZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uCisgICAgV0VMTEtOT1dOVFlQRV9USU1FU1RBTVAsICAvLyBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wCisgICAgV0VMTEtOT1dOVFlQRV9WQUxVRSwgICAgICAvLyBnb29nbGUucHJvdG9idWYuVmFsdWUKKyAgICBXRUxMS05PV05UWVBFX0xJU1RWQUxVRSwgIC8vIGdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUKKyAgICBXRUxMS05PV05UWVBFX1NUUlVDVCwgICAgIC8vIGdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QKKworICAgIC8vIE5ldyB3ZWxsLWtub3duIHR5cGVzIG1heSBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLgorICAgIC8vIFBsZWFzZSBtYWtlIHN1cmUgYW55IHN3aXRjaCgpIHN0YXRlbWVudHMgaGF2ZSBhICdkZWZhdWx0JyBjYXNlLgorICAgIF9fV0VMTEtOT1dOVFlQRV9fRE9fTk9UX1VTRV9fQUREX0RFRkFVTFRfSU5TVEVBRF9fLAorICB9OworCisgIFdlbGxLbm93blR5cGUgd2VsbF9rbm93bl90eXBlKCkgY29uc3Q7CisKKyAgLy8gRmllbGQgc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBUaGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2UgdHlwZS4KKyAgaW50IGZpZWxkX2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYSBmaWVsZCBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8IGZpZWxkX2NvdW50KCkuCisgIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gTG9va3MgdXAgYSBmaWVsZCBieSBkZWNsYXJlZCB0YWcgbnVtYmVyLiAgUmV0dXJucyBudWxscHRyIGlmIG5vIHN1Y2ggZmllbGQKKyAgLy8gZXhpc3RzLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRGaWVsZEJ5TnVtYmVyKGludCBudW1iZXIpIGNvbnN0OworICAvLyBMb29rcyB1cCBhIGZpZWxkIGJ5IG5hbWUuICBSZXR1cm5zIG51bGxwdHIgaWYgbm8gc3VjaCBmaWVsZCBleGlzdHMuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEZpZWxkQnlOYW1lKENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgY29uc3Q7CisKKyAgLy8gTG9va3MgdXAgYSBmaWVsZCBieSBsb3dlcmNhc2VkIG5hbWUgKGFzIHJldHVybmVkIGJ5IGxvd2VyY2FzZV9uYW1lKCkpLgorICAvLyBUaGlzIGxvb2t1cCBtYXkgYmUgYW1iaWd1b3VzIGlmIG11bHRpcGxlIGZpZWxkIG5hbWVzIGRpZmZlciBvbmx5IGJ5IGNhc2UsCisgIC8vIGluIHdoaWNoIGNhc2UgdGhlIGZpZWxkIHJldHVybmVkIGlzIGNob3NlbiBhcmJpdHJhcmlseSBmcm9tIHRoZSBtYXRjaGVzLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgKKyAgICAgIENvbnN0U3RyaW5nUGFyYW0gbG93ZXJjYXNlX25hbWUpIGNvbnN0OworCisgIC8vIExvb2tzIHVwIGEgZmllbGQgYnkgY2FtZWwtY2FzZSBuYW1lIChhcyByZXR1cm5lZCBieSBjYW1lbGNhc2VfbmFtZSgpKS4KKyAgLy8gVGhpcyBsb29rdXAgbWF5IGJlIGFtYmlndW91cyBpZiBtdWx0aXBsZSBmaWVsZCBuYW1lcyBkaWZmZXIgaW4gYSB3YXkgdGhhdAorICAvLyBsZWFkcyB0aGVtIHRvIGhhdmUgaWRlbnRpY2FsIGNhbWVsLWNhc2UgbmFtZXMsIGluIHdoaWNoIGNhc2UgdGhlIGZpZWxkCisgIC8vIHJldHVybmVkIGlzIGNob3NlbiBhcmJpdHJhcmlseSBmcm9tIHRoZSBtYXRjaGVzLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgKKyAgICAgIENvbnN0U3RyaW5nUGFyYW0gY2FtZWxjYXNlX25hbWUpIGNvbnN0OworCisgIC8vIFRoZSBudW1iZXIgb2Ygb25lb2ZzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgorICBpbnQgb25lb2ZfZGVjbF9jb3VudCgpIGNvbnN0OworICAvLyBUaGUgbnVtYmVyIG9mIG9uZW9mcyBpbiB0aGlzIG1lc3NhZ2UgdHlwZSwgZXhjbHVkaW5nIHN5bnRoZXRpYyBvbmVvZnMuCisgIC8vIFJlYWwgb25lb2ZzIGFsd2F5cyBjb21lIGZpcnN0LCBzbyBpdGVyYXRpbmcgdXAgdG8gcmVhbF9vbmVvZl9kZWNsX2NvdXQoKQorICAvLyB3aWxsIHlpZWxkIGFsbCByZWFsIG9uZW9mcy4KKyAgaW50IHJlYWxfb25lb2ZfZGVjbF9jb3VudCgpIGNvbnN0OworICAvLyBHZXQgYSBvbmVvZiBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8IG9uZW9mX2RlY2xfY291bnQoKS4KKyAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVjbChpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIExvb2tzIHVwIGEgb25lb2YgYnkgbmFtZS4gIFJldHVybnMgbnVsbHB0ciBpZiBubyBzdWNoIG9uZW9mIGV4aXN0cy4KKyAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBGaW5kT25lb2ZCeU5hbWUoQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSBjb25zdDsKKworICAvLyBOZXN0ZWQgdHlwZSBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFRoZSBudW1iZXIgb2YgbmVzdGVkIHR5cGVzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgorICBpbnQgbmVzdGVkX3R5cGVfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhIG5lc3RlZCB0eXBlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgbmVzdGVkX3R5cGVfY291bnQoKS4KKyAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IERlc2NyaXB0b3IqIG5lc3RlZF90eXBlKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gTG9va3MgdXAgYSBuZXN0ZWQgdHlwZSBieSBuYW1lLiAgUmV0dXJucyBudWxscHRyIGlmIG5vIHN1Y2ggbmVzdGVkIHR5cGUKKyAgLy8gZXhpc3RzLgorICBjb25zdCBEZXNjcmlwdG9yKiBGaW5kTmVzdGVkVHlwZUJ5TmFtZShDb25zdFN0cmluZ1BhcmFtIG5hbWUpIGNvbnN0OworCisgIC8vIEVudW0gc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gVGhlIG51bWJlciBvZiBlbnVtIHR5cGVzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgorICBpbnQgZW51bV90eXBlX2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYW4gZW51bSB0eXBlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgZW51bV90eXBlX2NvdW50KCkuCisgIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gTG9va3MgdXAgYW4gZW51bSB0eXBlIGJ5IG5hbWUuICBSZXR1cm5zIG51bGxwdHIgaWYgbm8gc3VjaCBlbnVtIHR5cGUKKyAgLy8gZXhpc3RzLgorICBjb25zdCBFbnVtRGVzY3JpcHRvciogRmluZEVudW1UeXBlQnlOYW1lKENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgY29uc3Q7CisKKyAgLy8gTG9va3MgdXAgYW4gZW51bSB2YWx1ZSBieSBuYW1lLCBhbW9uZyBhbGwgZW51bSB0eXBlcyBpbiB0aGlzIG1lc3NhZ2UuCisgIC8vIFJldHVybnMgbnVsbHB0ciBpZiBubyBzdWNoIHZhbHVlIGV4aXN0cy4KKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogRmluZEVudW1WYWx1ZUJ5TmFtZShDb25zdFN0cmluZ1BhcmFtIG5hbWUpIGNvbnN0OworCisgIC8vIEV4dGVuc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gQSByYW5nZSBvZiBmaWVsZCBudW1iZXJzIHdoaWNoIGFyZSBkZXNpZ25hdGVkIGZvciB0aGlyZC1wYXJ0eQorICAvLyBleHRlbnNpb25zLgorICBzdHJ1Y3QgRXh0ZW5zaW9uUmFuZ2UgeworICAgIHR5cGVkZWYgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlIFByb3RvOworCisgICAgdHlwZWRlZiBFeHRlbnNpb25SYW5nZU9wdGlvbnMgT3B0aW9uc1R5cGU7CisKKyAgICAvLyBTZWUgRGVzY3JpcHRvcjo6Q29weVRvKCkuCisgICAgdm9pZCBDb3B5VG8oRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBwcm90bykgY29uc3Q7CisKKyAgICBpbnQgc3RhcnQ7ICAvLyBpbmNsdXNpdmUKKyAgICBpbnQgZW5kOyAgICAvLyBleGNsdXNpdmUKKworICAgIGNvbnN0IEV4dGVuc2lvblJhbmdlT3B0aW9ucyogb3B0aW9uc187CisgIH07CisKKyAgLy8gVGhlIG51bWJlciBvZiBleHRlbnNpb24gcmFuZ2VzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgorICBpbnQgZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYW4gZXh0ZW5zaW9uIHJhbmdlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwKKyAgLy8gZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkuIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQKKyAgLy8gaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBFeHRlbnNpb25SYW5nZSogZXh0ZW5zaW9uX3JhbmdlKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBudW1iZXIgaXMgaW4gb25lIG9mIHRoZSBleHRlbnNpb24gcmFuZ2VzLgorICBib29sIElzRXh0ZW5zaW9uTnVtYmVyKGludCBudW1iZXIpIGNvbnN0OworCisgIC8vIFJldHVybnMgbnVsbHB0ciBpZiBubyBleHRlbnNpb24gcmFuZ2UgY29udGFpbnMgdGhlIGdpdmVuIG51bWJlci4KKyAgY29uc3QgRXh0ZW5zaW9uUmFuZ2UqIEZpbmRFeHRlbnNpb25SYW5nZUNvbnRhaW5pbmdOdW1iZXIoaW50IG51bWJlcikgY29uc3Q7CisKKyAgLy8gVGhlIG51bWJlciBvZiBleHRlbnNpb25zIGRlZmluZWQgbmVzdGVkIHdpdGhpbiB0aGlzIG1lc3NhZ2UgdHlwZSdzIHNjb3BlLgorICAvLyBTZWUgZG9jOgorICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8jbmVzdGVkLWV4dGVuc2lvbnMKKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHRoZSBleHRlbnNpb25zIG1heSBiZSBleHRlbmRpbmcgKm90aGVyKiBtZXNzYWdlcy4KKyAgLy8KKyAgLy8gRm9yIGV4YW1wbGU6CisgIC8vIG1lc3NhZ2UgTTEgeworICAvLyAgIGV4dGVuc2lvbnMgMSB0byBtYXg7CisgIC8vIH0KKyAgLy8KKyAgLy8gbWVzc2FnZSBNMiB7CisgIC8vICAgZXh0ZW5kIE0xIHsKKyAgLy8gICAgIG9wdGlvbmFsIGludDMyIGZvbyA9IDE7CisgIC8vICAgfQorICAvLyB9CisgIC8vCisgIC8vIEluIHRoaXMgY2FzZSwKKyAgLy8gRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkKKyAgLy8gICAgIC0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJNMiIpCisgIC8vICAgICAtPmV4dGVuc2lvbigwKQorICAvLyB3aWxsIHJldHVybiAiZm9vIiwgZXZlbiB0aG91Z2ggImZvbyIgaXMgYW4gZXh0ZW5zaW9uIG9mIE0xLgorICAvLyBUbyBmaW5kIGFsbCBrbm93biBleHRlbnNpb25zIG9mIGEgZ2l2ZW4gbWVzc2FnZSwgaW5zdGVhZCB1c2UKKyAgLy8gRGVzY3JpcHRvclBvb2w6OkZpbmRBbGxFeHRlbnNpb25zLgorICBpbnQgZXh0ZW5zaW9uX2NvdW50KCkgY29uc3Q7CisgIC8vIEdldCBhbiBleHRlbnNpb24gYnkgaW5kZXgsIHdoZXJlIDAgPD0gaW5kZXggPCBleHRlbnNpb25fY291bnQoKS4KKyAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gTG9va3MgdXAgYSBuYW1lZCBleHRlbnNpb24gKHdoaWNoIGV4dGVuZHMgc29tZSAqb3RoZXIqIG1lc3NhZ2UgdHlwZSkKKyAgLy8gZGVmaW5lZCB3aXRoaW4gdGhpcyBtZXNzYWdlIHR5cGUncyBzY29wZS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uQnlOYW1lKENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgY29uc3Q7CisKKyAgLy8gU2ltaWxhciB0byBGaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUoKSwgYnV0IGZpbmRzIGV4dGVuc2lvbnMgZGVmaW5lZCB3aXRoaW4KKyAgLy8gdGhpcyBtZXNzYWdlIHR5cGUncyBzY29wZS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKAorICAgICAgQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSBjb25zdDsKKworICAvLyBTaW1pbGFyIHRvIEZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgpLCBidXQgZmluZHMgZXh0ZW5zaW9ucyBkZWZpbmVkIHdpdGhpbgorICAvLyB0aGlzIG1lc3NhZ2UgdHlwZSdzIHNjb3BlLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoCisgICAgICBDb25zdFN0cmluZ1BhcmFtIG5hbWUpIGNvbnN0OworCisgIC8vIFJlc2VydmVkIGZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gQSByYW5nZSBvZiByZXNlcnZlZCBmaWVsZCBudW1iZXJzLgorICBzdHJ1Y3QgUmVzZXJ2ZWRSYW5nZSB7CisgICAgaW50IHN0YXJ0OyAgLy8gaW5jbHVzaXZlCisgICAgaW50IGVuZDsgICAgLy8gZXhjbHVzaXZlCisgIH07CisKKyAgLy8gVGhlIG51bWJlciBvZiByZXNlcnZlZCByYW5nZXMgaW4gdGhpcyBtZXNzYWdlIHR5cGUuCisgIGludCByZXNlcnZlZF9yYW5nZV9jb3VudCgpIGNvbnN0OworICAvLyBHZXRzIGFuIHJlc2VydmVkIHJhbmdlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwKKyAgLy8gcmVzZXJ2ZWRfcmFuZ2VfY291bnQoKS4gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZAorICAvLyBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IFJlc2VydmVkUmFuZ2UqIHJlc2VydmVkX3JhbmdlKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBudW1iZXIgaXMgaW4gb25lIG9mIHRoZSByZXNlcnZlZCByYW5nZXMuCisgIGJvb2wgSXNSZXNlcnZlZE51bWJlcihpbnQgbnVtYmVyKSBjb25zdDsKKworICAvLyBSZXR1cm5zIG51bGxwdHIgaWYgbm8gcmVzZXJ2ZWQgcmFuZ2UgY29udGFpbnMgdGhlIGdpdmVuIG51bWJlci4KKyAgY29uc3QgUmVzZXJ2ZWRSYW5nZSogRmluZFJlc2VydmVkUmFuZ2VDb250YWluaW5nTnVtYmVyKGludCBudW1iZXIpIGNvbnN0OworCisgIC8vIFRoZSBudW1iZXIgb2YgcmVzZXJ2ZWQgZmllbGQgbmFtZXMgaW4gdGhpcyBtZXNzYWdlIHR5cGUuCisgIGludCByZXNlcnZlZF9uYW1lX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyBhIHJlc2VydmVkIG5hbWUgYnkgaW5kZXgsIHdoZXJlIDAgPD0gaW5kZXggPCByZXNlcnZlZF9uYW1lX2NvdW50KCkuCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXNlcnZlZF9uYW1lKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBuYW1lIGlzIHJlc2VydmVkLgorICBib29sIElzUmVzZXJ2ZWROYW1lKENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgY29uc3Q7CisKKyAgLy8gU291cmNlIExvY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFVwZGF0ZXMgfCpvdXRfbG9jYXRpb258IHRvIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGNvbXBsZXRlCisgIC8vIGV4dGVudCBvZiB0aGlzIG1lc3NhZ2UgZGVjbGFyYXRpb24uICBSZXR1cm5zIGZhbHNlIGFuZCBsZWF2ZXMKKyAgLy8gfCpvdXRfbG9jYXRpb258IHVuY2hhbmdlZCBpZmYgbG9jYXRpb24gaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUuCisgIGJvb2wgR2V0U291cmNlTG9jYXRpb24oU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3Q7CisKKyAgLy8gTWFwcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFJldHVybnMgdGhlIEZpZWxkRGVzY3JpcHRvciBmb3IgdGhlICJrZXkiIGZpZWxkLiBJZiB0aGlzIGlzbid0IGEgbWFwIGVudHJ5CisgIC8vIGZpZWxkLCByZXR1cm5zIG51bGxwdHIuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX2tleSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIEZpZWxkRGVzY3JpcHRvciBmb3IgdGhlICJ2YWx1ZSIgZmllbGQuIElmIHRoaXMgaXNuJ3QgYSBtYXAKKyAgLy8gZW50cnkgZmllbGQsIHJldHVybnMgbnVsbHB0ci4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtYXBfdmFsdWUoKSBjb25zdDsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBTeW1ib2w7CisgIHR5cGVkZWYgTWVzc2FnZU9wdGlvbnMgT3B0aW9uc1R5cGU7CisKKyAgLy8gQWxsb3dzIHRlc3RzIHRvIHRlc3QgQ29weVRvKHByb3RvLCB0cnVlKS4KKyAgZnJpZW5kIGNsYXNzIGRlc2NyaXB0b3JfdW5pdHRlc3Q6OkRlc2NyaXB0b3JUZXN0OworCisgIC8vIEFsbG93cyBhY2Nlc3MgdG8gR2V0TG9jYXRpb25QYXRoIGZvciBhbm5vdGF0aW9ucy4KKyAgZnJpZW5kIGNsYXNzIGlvOjpQcmludGVyOworICBmcmllbmQgY2xhc3MgY29tcGlsZXI6OmNwcDo6Rm9ybWF0dGVyOworCisgIC8vIEZpbGwgdGhlIGpzb25fbmFtZSBmaWVsZCBvZiBGaWVsZERlc2NyaXB0b3JQcm90by4KKyAgdm9pZCBDb3B5SnNvbk5hbWVUbyhEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdDsKKworICAvLyBJbnRlcm5hbCB2ZXJzaW9uIG9mIERlYnVnU3RyaW5nOyBjb250cm9scyB0aGUgbGV2ZWwgb2YgaW5kZW50aW5nIGZvcgorICAvLyBjb3JyZWN0IGRlcHRoLiBUYWtlcyB8b3B0aW9uc3wgdG8gY29udHJvbCBkZWJ1Zy1zdHJpbmcgb3B0aW9ucywgYW5kCisgIC8vIHxpbmNsdWRlX29wZW5pbmdfY2xhdXNlfCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSAibWVzc2FnZSAuLi4gIiBwYXJ0IG9mIHRoZQorICAvLyBjbGF1c2UgaGFzIGFscmVhZHkgYmVlbiBnZW5lcmF0ZWQgKHRoaXMgdmFyaWVzIGRlcGVuZGluZyBvbiBjb250ZXh0KS4KKyAgdm9pZCBEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0ZDo6c3RyaW5nKiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX29wZW5pbmdfY2xhdXNlKSBjb25zdDsKKworICAvLyBXYWxrcyB1cCB0aGUgZGVzY3JpcHRvciB0cmVlIHRvIGdlbmVyYXRlIHRoZSBzb3VyY2UgbG9jYXRpb24gcGF0aAorICAvLyB0byB0aGlzIGRlc2NyaXB0b3IgZnJvbSB0aGUgZmlsZSByb290LgorICB2b2lkIEdldExvY2F0aW9uUGF0aChzdGQ6OnZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0OworCisgIC8vIFRydWUgaWYgdGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciBhbiB1bmtub3duIHR5cGUuCisgIGJvb2wgaXNfcGxhY2Vob2xkZXJfIDogMTsKKyAgLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgcGxhY2Vob2xkZXIgYW5kIHRoZSB0eXBlIG5hbWUgd2Fzbid0IGZ1bGx5LXF1YWxpZmllZC4KKyAgYm9vbCBpc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8gOiAxOworICAvLyBXZWxsIGtub3duIHR5cGUuICBTdG9yZWQgbGlrZSB0aGlzIHRvIGNvbnNlcnZlIHNwYWNlLgorICB1aW50OF90IHdlbGxfa25vd25fdHlwZV8gOiA1OworCisgIC8vIFRoaXMgcG9pbnRzIHRvIHRoZSBsYXN0IGZpZWxkIF9udW1iZXJfIHRoYXQgaXMgcGFydCBvZiB0aGUgc2VxdWVuY2UKKyAgLy8gc3RhcnRpbmcgYXQgMSwgd2hlcmUKKyAgLy8gICAgIGBkZXNjLT5maWVsZChpKS0+bnVtYmVyKCkgPT0gaSArIDFgCisgIC8vIEEgdmFsdWUgb2YgYDBgIG1lYW5zIG5vIGZpZWxkIG1hdGNoZXMuIFRoYXQgaXMsIHRoZXJlIGFyZSBubyBmaWVsZHMgb3IgdGhlCisgIC8vIGZpcnN0IGZpZWxkIGlzIG5vdCBmaWVsZCBgMWAuCisgIC8vIFVzZXMgMTYtYml0IHRvIGF2b2lkIGV4dHJhIHBhZGRpbmcuIFVubGlrZWx5IHRvIGhhdmUgbW9yZSB0aGFuIDJeMTYKKyAgLy8gc2VxdWVudGlhbGx5IG51bWJlcmVkIGZpZWxkcyBpbiBhIG1lc3NhZ2UuCisgIHVpbnQxNl90IHNlcXVlbnRpYWxfZmllbGRfbGltaXRfOworCisgIGludCBmaWVsZF9jb3VudF87CisKKyAgLy8gYWxsX25hbWVzXyA9IFtuYW1lLCBmdWxsX25hbWVdCisgIGNvbnN0IHN0ZDo6c3RyaW5nKiBhbGxfbmFtZXNfOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZV87CisgIGNvbnN0IE1lc3NhZ2VPcHRpb25zKiBvcHRpb25zXzsKKworICAvLyBUaGVzZSBhcnJheXMgYXJlIHNlcGFyYXRlZCBmcm9tIHRoZWlyIHNpemVzIHRvIG1pbmltaXplIHBhZGRpbmcgb24gNjQtYml0LgorICBGaWVsZERlc2NyaXB0b3IqIGZpZWxkc187CisgIE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVjbHNfOworICBEZXNjcmlwdG9yKiBuZXN0ZWRfdHlwZXNfOworICBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlc187CisgIEV4dGVuc2lvblJhbmdlKiBleHRlbnNpb25fcmFuZ2VzXzsKKyAgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb25zXzsKKyAgUmVzZXJ2ZWRSYW5nZSogcmVzZXJ2ZWRfcmFuZ2VzXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcqKiByZXNlcnZlZF9uYW1lc187CisKKyAgaW50IG9uZW9mX2RlY2xfY291bnRfOworICBpbnQgcmVhbF9vbmVvZl9kZWNsX2NvdW50XzsKKyAgaW50IG5lc3RlZF90eXBlX2NvdW50XzsKKyAgaW50IGVudW1fdHlwZV9jb3VudF87CisgIGludCBleHRlbnNpb25fcmFuZ2VfY291bnRfOworICBpbnQgZXh0ZW5zaW9uX2NvdW50XzsKKyAgaW50IHJlc2VydmVkX3JhbmdlX2NvdW50XzsKKyAgaW50IHJlc2VydmVkX25hbWVfY291bnRfOworCisgIC8vIElNUE9SVEFOVDogIElmIHlvdSBhZGQgYSBuZXcgZmllbGQsIG1ha2Ugc3VyZSB0byBzZWFyY2ggZm9yIGFsbCBpbnN0YW5jZXMKKyAgLy8gb2YgQWxsb2NhdGU8RGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxEZXNjcmlwdG9yPigpIGluIGRlc2NyaXB0b3IuY2MKKyAgLy8gYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgorCisgIC8vIE11c3QgYmUgY29uc3RydWN0ZWQgdXNpbmcgRGVzY3JpcHRvclBvb2wuCisgIERlc2NyaXB0b3IoKSB7fQorICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvckJ1aWxkZXI7CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yUG9vbDsKKyAgZnJpZW5kIGNsYXNzIEVudW1EZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRmllbGREZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRmlsZURlc2NyaXB0b3JUYWJsZXM7CisgIGZyaWVuZCBjbGFzcyBPbmVvZkRlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBNZXRob2REZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRmlsZURlc2NyaXB0b3I7CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZXNjcmlwdG9yKTsKK307CisKK1BST1RPQlVGX0lOVEVSTkFMX0NIRUNLX0NMQVNTX1NJWkUoRGVzY3JpcHRvciwgMTM2KTsKKworLy8gRGVzY3JpYmVzIGEgc2luZ2xlIGZpZWxkIG9mIGEgbWVzc2FnZS4gIFRvIGdldCB0aGUgZGVzY3JpcHRvciBmb3IgYSBnaXZlbgorLy8gZmllbGQsIGZpcnN0IGdldCB0aGUgRGVzY3JpcHRvciBmb3IgdGhlIG1lc3NhZ2UgaW4gd2hpY2ggaXQgaXMgZGVmaW5lZCwKKy8vIHRoZW4gY2FsbCBEZXNjcmlwdG9yOjpGaW5kRmllbGRCeU5hbWUoKS4gIFRvIGdldCBhIEZpZWxkRGVzY3JpcHRvciBmb3IKKy8vIGFuIGV4dGVuc2lvbiwgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisvLyAtIEdldCB0aGUgRGVzY3JpcHRvciBvciBGaWxlRGVzY3JpcHRvciBmb3IgaXRzIGNvbnRhaW5pbmcgc2NvcGUsIHRoZW4KKy8vICAgY2FsbCBEZXNjcmlwdG9yOjpGaW5kRXh0ZW5zaW9uQnlOYW1lKCkgb3IKKy8vICAgRmlsZURlc2NyaXB0b3I6OkZpbmRFeHRlbnNpb25CeU5hbWUoKS4KKy8vIC0gR2l2ZW4gYSBEZXNjcmlwdG9yUG9vbCwgY2FsbCBEZXNjcmlwdG9yUG9vbDo6RmluZEV4dGVuc2lvbkJ5TnVtYmVyKCkgb3IKKy8vICAgRGVzY3JpcHRvclBvb2w6OkZpbmRFeHRlbnNpb25CeVByaW50YWJsZU5hbWUoKS4KKy8vIFVzZSBEZXNjcmlwdG9yUG9vbCB0byBjb25zdHJ1Y3QgeW91ciBvd24gZGVzY3JpcHRvcnMuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRmllbGREZXNjcmlwdG9yIDogcHJpdmF0ZSBpbnRlcm5hbDo6U3ltYm9sQmFzZSB7CisgcHVibGljOgorICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvclByb3RvIFByb3RvOworCisgIC8vIElkZW50aWZpZXMgYSBmaWVsZCB0eXBlLiAgMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzLiAgVGhlIG9yZGVyIGlzIHdlaXJkCisgIC8vIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuICBUeXBlcyAxMiBhbmQgdXAgYXJlIG5ldyBpbiBwcm90bzIuCisgIGVudW0gVHlwZSB7CisgICAgVFlQRV9ET1VCTEUgPSAxLCAgICAvLyBkb3VibGUsIGV4YWN0bHkgZWlnaHQgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgVFlQRV9GTE9BVCA9IDIsICAgICAvLyBmbG9hdCwgZXhhY3RseSBmb3VyIGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgIFRZUEVfSU5UNjQgPSAzLCAgICAgLy8gaW50NjQsIHZhcmludCBvbiB0aGUgd2lyZS4gIE5lZ2F0aXZlIG51bWJlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgMTAgYnl0ZXMuICBVc2UgVFlQRV9TSU5UNjQgaWYgbmVnYXRpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBhcmUgbGlrZWx5LgorICAgIFRZUEVfVUlOVDY0ID0gNCwgICAgLy8gdWludDY0LCB2YXJpbnQgb24gdGhlIHdpcmUuCisgICAgVFlQRV9JTlQzMiA9IDUsICAgICAvLyBpbnQzMiwgdmFyaW50IG9uIHRoZSB3aXJlLiAgTmVnYXRpdmUgbnVtYmVycworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSAxMCBieXRlcy4gIFVzZSBUWVBFX1NJTlQzMiBpZiBuZWdhdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIGFyZSBsaWtlbHkuCisgICAgVFlQRV9GSVhFRDY0ID0gNiwgICAvLyB1aW50NjQsIGV4YWN0bHkgZWlnaHQgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgVFlQRV9GSVhFRDMyID0gNywgICAvLyB1aW50MzIsIGV4YWN0bHkgZm91ciBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICBUWVBFX0JPT0wgPSA4LCAgICAgIC8vIGJvb2wsIHZhcmludCBvbiB0aGUgd2lyZS4KKyAgICBUWVBFX1NUUklORyA9IDksICAgIC8vIFVURi04IHRleHQuCisgICAgVFlQRV9HUk9VUCA9IDEwLCAgICAvLyBUYWctZGVsaW1pdGVkIG1lc3NhZ2UuICBEZXByZWNhdGVkLgorICAgIFRZUEVfTUVTU0FHRSA9IDExLCAgLy8gTGVuZ3RoLWRlbGltaXRlZCBtZXNzYWdlLgorCisgICAgVFlQRV9CWVRFUyA9IDEyLCAgICAgLy8gQXJiaXRyYXJ5IGJ5dGUgYXJyYXkuCisgICAgVFlQRV9VSU5UMzIgPSAxMywgICAgLy8gdWludDMyLCB2YXJpbnQgb24gdGhlIHdpcmUKKyAgICBUWVBFX0VOVU0gPSAxNCwgICAgICAvLyBFbnVtLCB2YXJpbnQgb24gdGhlIHdpcmUKKyAgICBUWVBFX1NGSVhFRDMyID0gMTUsICAvLyBpbnQzMiwgZXhhY3RseSBmb3VyIGJ5dGVzIG9uIHRoZSB3aXJlCisgICAgVFlQRV9TRklYRUQ2NCA9IDE2LCAgLy8gaW50NjQsIGV4YWN0bHkgZWlnaHQgYnl0ZXMgb24gdGhlIHdpcmUKKyAgICBUWVBFX1NJTlQzMiA9IDE3LCAgICAvLyBpbnQzMiwgWmlnWmFnLWVuY29kZWQgdmFyaW50IG9uIHRoZSB3aXJlCisgICAgVFlQRV9TSU5UNjQgPSAxOCwgICAgLy8gaW50NjQsIFppZ1phZy1lbmNvZGVkIHZhcmludCBvbiB0aGUgd2lyZQorCisgICAgTUFYX1RZUEUgPSAxOCwgIC8vIENvbnN0YW50IHVzZWZ1bCBmb3IgZGVmaW5pbmcgbG9va3VwIHRhYmxlcworICAgICAgICAgICAgICAgICAgICAvLyBpbmRleGVkIGJ5IFR5cGUuCisgIH07CisKKyAgLy8gU3BlY2lmaWVzIHRoZSBDKysgZGF0YSB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBmaWVsZC4gIFRoZXJlIGlzIGEKKyAgLy8gZml4ZWQgbWFwcGluZyBmcm9tIFR5cGUgdG8gQ3BwVHlwZSB3aGVyZSBlYWNoIFR5cGUgbWFwcyB0byBleGFjdGx5IG9uZQorICAvLyBDcHBUeXBlLiAgMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzLgorICBlbnVtIENwcFR5cGUgeworICAgIENQUFRZUEVfSU5UMzIgPSAxLCAgICAgLy8gVFlQRV9JTlQzMiwgVFlQRV9TSU5UMzIsIFRZUEVfU0ZJWEVEMzIKKyAgICBDUFBUWVBFX0lOVDY0ID0gMiwgICAgIC8vIFRZUEVfSU5UNjQsIFRZUEVfU0lOVDY0LCBUWVBFX1NGSVhFRDY0CisgICAgQ1BQVFlQRV9VSU5UMzIgPSAzLCAgICAvLyBUWVBFX1VJTlQzMiwgVFlQRV9GSVhFRDMyCisgICAgQ1BQVFlQRV9VSU5UNjQgPSA0LCAgICAvLyBUWVBFX1VJTlQ2NCwgVFlQRV9GSVhFRDY0CisgICAgQ1BQVFlQRV9ET1VCTEUgPSA1LCAgICAvLyBUWVBFX0RPVUJMRQorICAgIENQUFRZUEVfRkxPQVQgPSA2LCAgICAgLy8gVFlQRV9GTE9BVAorICAgIENQUFRZUEVfQk9PTCA9IDcsICAgICAgLy8gVFlQRV9CT09MCisgICAgQ1BQVFlQRV9FTlVNID0gOCwgICAgICAvLyBUWVBFX0VOVU0KKyAgICBDUFBUWVBFX1NUUklORyA9IDksICAgIC8vIFRZUEVfU1RSSU5HLCBUWVBFX0JZVEVTCisgICAgQ1BQVFlQRV9NRVNTQUdFID0gMTAsICAvLyBUWVBFX01FU1NBR0UsIFRZUEVfR1JPVVAKKworICAgIE1BWF9DUFBUWVBFID0gMTAsICAvLyBDb25zdGFudCB1c2VmdWwgZm9yIGRlZmluaW5nIGxvb2t1cCB0YWJsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXhlZCBieSBDcHBUeXBlLgorICB9OworCisgIC8vIElkZW50aWZpZXMgd2hldGhlciB0aGUgZmllbGQgaXMgb3B0aW9uYWwsIHJlcXVpcmVkLCBvciByZXBlYXRlZC4gIDAgaXMKKyAgLy8gcmVzZXJ2ZWQgZm9yIGVycm9ycy4KKyAgZW51bSBMYWJlbCB7CisgICAgTEFCRUxfT1BUSU9OQUwgPSAxLCAgLy8gb3B0aW9uYWwKKyAgICBMQUJFTF9SRVFVSVJFRCA9IDIsICAvLyByZXF1aXJlZAorICAgIExBQkVMX1JFUEVBVEVEID0gMywgIC8vIHJlcGVhdGVkCisKKyAgICBNQVhfTEFCRUwgPSAzLCAgLy8gQ29uc3RhbnQgdXNlZnVsIGZvciBkZWZpbmluZyBsb29rdXAgdGFibGVzCisgICAgICAgICAgICAgICAgICAgIC8vIGluZGV4ZWQgYnkgTGFiZWwuCisgIH07CisKKyAgLy8gVmFsaWQgZmllbGQgbnVtYmVycyBhcmUgcG9zaXRpdmUgaW50ZWdlcnMgdXAgdG8ga01heE51bWJlci4KKyAgc3RhdGljIGNvbnN0IGludCBrTWF4TnVtYmVyID0gKDEgPDwgMjkpIC0gMTsKKworICAvLyBGaXJzdCBmaWVsZCBudW1iZXIgcmVzZXJ2ZWQgZm9yIHRoZSBwcm90b2NvbCBidWZmZXIgbGlicmFyeSBpbXBsZW1lbnRhdGlvbi4KKyAgLy8gVXNlcnMgbWF5IG5vdCBkZWNsYXJlIGZpZWxkcyB0aGF0IHVzZSByZXNlcnZlZCBudW1iZXJzLgorICBzdGF0aWMgY29uc3QgaW50IGtGaXJzdFJlc2VydmVkTnVtYmVyID0gMTkwMDA7CisgIC8vIExhc3QgZmllbGQgbnVtYmVyIHJlc2VydmVkIGZvciB0aGUgcHJvdG9jb2wgYnVmZmVyIGxpYnJhcnkgaW1wbGVtZW50YXRpb24uCisgIC8vIFVzZXJzIG1heSBub3QgZGVjbGFyZSBmaWVsZHMgdGhhdCB1c2UgcmVzZXJ2ZWQgbnVtYmVycy4KKyAgc3RhdGljIGNvbnN0IGludCBrTGFzdFJlc2VydmVkTnVtYmVyID0gMTk5OTk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsgIC8vIE5hbWUgb2YgdGhpcyBmaWVsZCB3aXRoaW4gdGhlIG1lc3NhZ2UuCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsX25hbWUoKSBjb25zdDsgIC8vIEZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBmaWVsZC4KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25fbmFtZSgpIGNvbnN0OyAgLy8gSlNPTiBuYW1lIG9mIHRoaXMgZmllbGQuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKCkgY29uc3Q7ICAvLyBGaWxlIGluIHdoaWNoIHRoaXMgZmllbGQgd2FzIGRlZmluZWQuCisgIGJvb2wgaXNfZXh0ZW5zaW9uKCkgY29uc3Q7ICAgICAgICAgICAvLyBJcyB0aGlzIGFuIGV4dGVuc2lvbiBmaWVsZD8KKyAgaW50IG51bWJlcigpIGNvbnN0OyAgICAgICAgICAgICAgICAgIC8vIERlY2xhcmVkIHRhZyBudW1iZXIuCisKKyAgLy8gU2FtZSBhcyBuYW1lKCkgZXhjZXB0IGNvbnZlcnRlZCB0byBsb3dlci1jYXNlLiAgVGhpcyAoYW5kIGVzcGVjaWFsbHkgdGhlCisgIC8vIEZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgpIG1ldGhvZCkgY2FuIGJlIHVzZWZ1bCB3aGVuIHBhcnNpbmcgZm9ybWF0cworICAvLyB3aGljaCBwcmVmZXIgdG8gdXNlIGxvd2VyY2FzZSBuYW1pbmcgc3R5bGUuICAoQWx0aG91Z2gsIHRlY2huaWNhbGx5CisgIC8vIGZpZWxkIG5hbWVzIHNob3VsZCBiZSBsb3dlcmNhc2VkIGFueXdheSBhY2NvcmRpbmcgdG8gdGhlIHByb3RvYnVmIHN0eWxlCisgIC8vIGd1aWRlLCBzbyB0aGlzIG9ubHkgbWFrZXMgYSBkaWZmZXJlbmNlIHdoZW4gZGVhbGluZyB3aXRoIG9sZCAucHJvdG8gZmlsZXMKKyAgLy8gd2hpY2ggZG8gbm90IGZvbGxvdyB0aGUgZ3VpZGUuKQorICBjb25zdCBzdGQ6OnN0cmluZyYgbG93ZXJjYXNlX25hbWUoKSBjb25zdDsKKworICAvLyBTYW1lIGFzIG5hbWUoKSBleGNlcHQgY29udmVydGVkIHRvIGNhbWVsLWNhc2UuICBJbiB0aGlzIGNvbnZlcnNpb24sIGFueQorICAvLyB0aW1lIGFuIHVuZGVyc2NvcmUgYXBwZWFycyBpbiB0aGUgbmFtZSwgaXQgaXMgcmVtb3ZlZCBhbmQgdGhlIG5leHQKKyAgLy8gbGV0dGVyIGlzIGNhcGl0YWxpemVkLiAgRnVydGhlcm1vcmUsIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIG5hbWUgaXMKKyAgLy8gbG93ZXItY2FzZWQuICBFeGFtcGxlczoKKyAgLy8gICBGb29CYXIgLT4gZm9vQmFyCisgIC8vICAgZm9vX2JhciAtPiBmb29CYXIKKyAgLy8gICBmb29CYXIgLT4gZm9vQmFyCisgIC8vIFRoaXMgKGFuZCBlc3BlY2lhbGx5IHRoZSBGaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoKSBtZXRob2QpIGNhbiBiZSB1c2VmdWwKKyAgLy8gd2hlbiBwYXJzaW5nIGZvcm1hdHMgd2hpY2ggcHJlZmVyIHRvIHVzZSBjYW1lbC1jYXNlIG5hbWluZyBzdHlsZS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVsY2FzZV9uYW1lKCkgY29uc3Q7CisKKyAgVHlwZSB0eXBlKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgLy8gRGVjbGFyZWQgdHlwZSBvZiB0aGlzIGZpZWxkLgorICBjb25zdCBjaGFyKiB0eXBlX25hbWUoKSBjb25zdDsgICAgICAvLyBOYW1lIG9mIHRoZSBkZWNsYXJlZCB0eXBlLgorICBDcHBUeXBlIGNwcF90eXBlKCkgY29uc3Q7ICAgICAgICAgICAvLyBDKysgdHlwZSBvZiB0aGlzIGZpZWxkLgorICBjb25zdCBjaGFyKiBjcHBfdHlwZV9uYW1lKCkgY29uc3Q7ICAvLyBOYW1lIG9mIHRoZSBDKysgdHlwZS4KKyAgTGFiZWwgbGFiZWwoKSBjb25zdDsgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwvcmVxdWlyZWQvcmVwZWF0ZWQKKworICBib29sIGlzX3JlcXVpcmVkKCkgY29uc3Q7ICAvLyBzaG9ydGhhbmQgZm9yIGxhYmVsKCkgPT0gTEFCRUxfUkVRVUlSRUQKKyAgYm9vbCBpc19vcHRpb25hbCgpIGNvbnN0OyAgLy8gc2hvcnRoYW5kIGZvciBsYWJlbCgpID09IExBQkVMX09QVElPTkFMCisgIGJvb2wgaXNfcmVwZWF0ZWQoKSBjb25zdDsgIC8vIHNob3J0aGFuZCBmb3IgbGFiZWwoKSA9PSBMQUJFTF9SRVBFQVRFRAorICBib29sIGlzX3BhY2thYmxlKCkgY29uc3Q7ICAvLyBzaG9ydGhhbmQgZm9yIGlzX3JlcGVhdGVkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBJc1R5cGVQYWNrYWJsZSh0eXBlKCkpCisgIGJvb2wgaXNfcGFja2VkKCkgY29uc3Q7ICAgIC8vIHNob3J0aGFuZCBmb3IgaXNfcGFja2FibGUoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIG9wdGlvbnMoKS5wYWNrZWQoKQorICBib29sIGlzX21hcCgpIGNvbnN0OyAgICAgICAvLyBzaG9ydGhhbmQgZm9yIHR5cGUoKSA9PSBUWVBFX01FU1NBR0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZV90eXBlKCktPm9wdGlvbnMoKS5tYXBfZW50cnkoKQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZpZWxkIHdhcyBzeW50YWN0aWNhbGx5IHdyaXR0ZW4gd2l0aCAib3B0aW9uYWwiIGluIHRoZQorICAvLyAucHJvdG8gZmlsZS4gRXhjbHVkZXMgc2luZ3VsYXIgcHJvdG8zIGZpZWxkcyB0aGF0IGRvIG5vdCBoYXZlIGEgbGFiZWwuCisgIGJvb2wgaGFzX29wdGlvbmFsX2tleXdvcmQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBmaWVsZCB0cmFja3MgcHJlc2VuY2UsIGllLiBkb2VzIHRoZSBmaWVsZAorICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuICJ1bnNldCIgYW5kICJwcmVzZW50IHdpdGggZGVmYXVsdCB2YWx1ZS4iCisgIC8vIFRoaXMgaW5jbHVkZXMgcmVxdWlyZWQsIG9wdGlvbmFsLCBhbmQgb25lb2YgZmllbGRzLiBJdCBleGNsdWRlcyBtYXBzLAorICAvLyByZXBlYXRlZCBmaWVsZHMsIGFuZCBzaW5ndWxhciBwcm90bzMgZmllbGRzIHdpdGhvdXQgIm9wdGlvbmFsIi4KKyAgLy8KKyAgLy8gRm9yIGZpZWxkcyB3aGVyZSBoYXNfcHJlc2VuY2UoKSA9PSB0cnVlLCB0aGUgcmV0dXJuIHZhbHVlIG9mCisgIC8vIFJlZmxlY3Rpb246Okhhc0ZpZWxkKCkgaXMgc2VtYW50aWNhbGx5IG1lYW5pbmdmdWwuCisgIGJvb2wgaGFzX3ByZXNlbmNlKCkgY29uc3Q7CisKKyAgLy8gSW5kZXggb2YgdGhpcyBmaWVsZCB3aXRoaW4gdGhlIG1lc3NhZ2UncyBmaWVsZCBhcnJheSwgb3IgdGhlIGZpbGUgb3IKKyAgLy8gZXh0ZW5zaW9uIHNjb3BlJ3MgZXh0ZW5zaW9ucyBhcnJheS4KKyAgaW50IGluZGV4KCkgY29uc3Q7CisKKyAgLy8gRG9lcyB0aGlzIGZpZWxkIGhhdmUgYW4gZXhwbGljaXRseS1kZWNsYXJlZCBkZWZhdWx0IHZhbHVlPworICBib29sIGhhc19kZWZhdWx0X3ZhbHVlKCkgY29uc3Q7CisKKyAgLy8gV2hldGhlciB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIHRoZSBqc29uX25hbWUgZmllbGQgb3B0aW9uIGluIHRoZSAucHJvdG8KKyAgLy8gZmlsZS4KKyAgYm9vbCBoYXNfanNvbl9uYW1lKCkgY29uc3Q7CisKKyAgLy8gR2V0IHRoZSBmaWVsZCBkZWZhdWx0IHZhbHVlIGlmIGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9JTlQzMi4gIElmIG5vCisgIC8vIGV4cGxpY2l0IGRlZmF1bHQgd2FzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIDAuCisgIGludDMyX3QgZGVmYXVsdF92YWx1ZV9pbnQzMl90KCkgY29uc3Q7CisgIGludDMyX3QgZGVmYXVsdF92YWx1ZV9pbnQzMigpIGNvbnN0IHsgcmV0dXJuIGRlZmF1bHRfdmFsdWVfaW50MzJfdCgpOyB9CisgIC8vIEdldCB0aGUgZmllbGQgZGVmYXVsdCB2YWx1ZSBpZiBjcHBfdHlwZSgpID09IENQUFRZUEVfSU5UNjQuICBJZiBubworICAvLyBleHBsaWNpdCBkZWZhdWx0IHdhcyBkZWZpbmVkLCB0aGUgZGVmYXVsdCBpcyAwLgorICBpbnQ2NF90IGRlZmF1bHRfdmFsdWVfaW50NjRfdCgpIGNvbnN0OworICBpbnQ2NF90IGRlZmF1bHRfdmFsdWVfaW50NjQoKSBjb25zdCB7IHJldHVybiBkZWZhdWx0X3ZhbHVlX2ludDY0X3QoKTsgfQorICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX1VJTlQzMi4gIElmIG5vCisgIC8vIGV4cGxpY2l0IGRlZmF1bHQgd2FzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIDAuCisgIHVpbnQzMl90IGRlZmF1bHRfdmFsdWVfdWludDMyX3QoKSBjb25zdDsKKyAgdWludDMyX3QgZGVmYXVsdF92YWx1ZV91aW50MzIoKSBjb25zdCB7IHJldHVybiBkZWZhdWx0X3ZhbHVlX3VpbnQzMl90KCk7IH0KKyAgLy8gR2V0IHRoZSBmaWVsZCBkZWZhdWx0IHZhbHVlIGlmIGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9VSU5UNjQuICBJZiBubworICAvLyBleHBsaWNpdCBkZWZhdWx0IHdhcyBkZWZpbmVkLCB0aGUgZGVmYXVsdCBpcyAwLgorICB1aW50NjRfdCBkZWZhdWx0X3ZhbHVlX3VpbnQ2NF90KCkgY29uc3Q7CisgIHVpbnQ2NF90IGRlZmF1bHRfdmFsdWVfdWludDY0KCkgY29uc3QgeyByZXR1cm4gZGVmYXVsdF92YWx1ZV91aW50NjRfdCgpOyB9CisgIC8vIEdldCB0aGUgZmllbGQgZGVmYXVsdCB2YWx1ZSBpZiBjcHBfdHlwZSgpID09IENQUFRZUEVfRkxPQVQuICBJZiBubworICAvLyBleHBsaWNpdCBkZWZhdWx0IHdhcyBkZWZpbmVkLCB0aGUgZGVmYXVsdCBpcyAwLjAuCisgIGZsb2F0IGRlZmF1bHRfdmFsdWVfZmxvYXQoKSBjb25zdDsKKyAgLy8gR2V0IHRoZSBmaWVsZCBkZWZhdWx0IHZhbHVlIGlmIGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9ET1VCTEUuICBJZiBubworICAvLyBleHBsaWNpdCBkZWZhdWx0IHdhcyBkZWZpbmVkLCB0aGUgZGVmYXVsdCBpcyAwLjAuCisgIGRvdWJsZSBkZWZhdWx0X3ZhbHVlX2RvdWJsZSgpIGNvbnN0OworICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX0JPT0wuICBJZiBubworICAvLyBleHBsaWNpdCBkZWZhdWx0IHdhcyBkZWZpbmVkLCB0aGUgZGVmYXVsdCBpcyBmYWxzZS4KKyAgYm9vbCBkZWZhdWx0X3ZhbHVlX2Jvb2woKSBjb25zdDsKKyAgLy8gR2V0IHRoZSBmaWVsZCBkZWZhdWx0IHZhbHVlIGlmIGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9FTlVNLiAgSWYgbm8KKyAgLy8gZXhwbGljaXQgZGVmYXVsdCB3YXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaXMgdGhlIGZpcnN0IHZhbHVlIGRlZmluZWQKKyAgLy8gaW4gdGhlIGVudW0gdHlwZSAoYWxsIGVudW0gdHlwZXMgYXJlIHJlcXVpcmVkIHRvIGhhdmUgYXQgbGVhc3Qgb25lIHZhbHVlKS4KKyAgLy8gVGhpcyBuZXZlciByZXR1cm5zIG51bGxwdHIuCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGRlZmF1bHRfdmFsdWVfZW51bSgpIGNvbnN0OworICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX1NUUklORy4gIElmIG5vCisgIC8vIGV4cGxpY2l0IGRlZmF1bHQgd2FzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcuCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0X3ZhbHVlX3N0cmluZygpIGNvbnN0OworCisgIC8vIFRoZSBEZXNjcmlwdG9yIGZvciB0aGUgbWVzc2FnZSBvZiB3aGljaCB0aGlzIGlzIGEgZmllbGQuICBGb3IgZXh0ZW5zaW9ucywKKyAgLy8gdGhpcyBpcyB0aGUgZXh0ZW5kZWQgdHlwZS4gIE5ldmVyIG51bGxwdHIuCisgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSgpIGNvbnN0OworCisgIC8vIElmIHRoZSBmaWVsZCBpcyBhIG1lbWJlciBvZiBhIG9uZW9mLCB0aGlzIGlzIHRoZSBvbmUsIG90aGVyd2lzZSB0aGlzIGlzCisgIC8vIG51bGxwdHIuCisgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogY29udGFpbmluZ19vbmVvZigpIGNvbnN0OworCisgIC8vIElmIHRoZSBmaWVsZCBpcyBhIG1lbWJlciBvZiBhIG5vbi1zeW50aGV0aWMgb25lb2YsIHJldHVybnMgdGhlIGRlc2NyaXB0b3IKKyAgLy8gZm9yIHRoZSBvbmVvZiwgb3RoZXJ3aXNlIHJldHVybnMgbnVsbHB0ci4KKyAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiByZWFsX2NvbnRhaW5pbmdfb25lb2YoKSBjb25zdDsKKworICAvLyBJZiB0aGUgZmllbGQgaXMgYSBtZW1iZXIgb2YgYSBvbmVvZiwgcmV0dXJucyB0aGUgaW5kZXggaW4gdGhhdCBvbmVvZi4KKyAgaW50IGluZGV4X2luX29uZW9mKCkgY29uc3Q7CisKKyAgLy8gQW4gZXh0ZW5zaW9uIG1heSBiZSBkZWNsYXJlZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFub3RoZXIgbWVzc2FnZS4gIElmIHRoaXMKKyAgLy8gZmllbGQgaXMgYW4gZXh0ZW5zaW9uIChpc19leHRlbnNpb24oKSBpcyB0cnVlKSwgdGhlbiBleHRlbnNpb25fc2NvcGUoKQorICAvLyByZXR1cm5zIHRoYXQgbWVzc2FnZSwgb3IgbnVsbHB0ciBpZiB0aGUgZXh0ZW5zaW9uIHdhcyBkZWNsYXJlZCBhdCBnbG9iYWwKKyAgLy8gc2NvcGUuICBJZiB0aGlzIGlzIG5vdCBhbiBleHRlbnNpb24sIGV4dGVuc2lvbl9zY29wZSgpIGlzIHVuZGVmaW5lZCAobWF5CisgIC8vIGFzc2VydC1mYWlsKS4KKyAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5zaW9uX3Njb3BlKCkgY29uc3Q7CisKKyAgLy8gSWYgdHlwZSBpcyBUWVBFX01FU1NBR0Ugb3IgVFlQRV9HUk9VUCwgcmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRoZQorICAvLyBtZXNzYWdlIG9yIHRoZSBncm91cCB0eXBlLiAgT3RoZXJ3aXNlLCByZXR1cm5zIG51bGwuCisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSgpIGNvbnN0OworICAvLyBJZiB0eXBlIGlzIFRZUEVfRU5VTSwgcmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRoZSBlbnVtLiAgT3RoZXJ3aXNlLAorICAvLyByZXR1cm5zIG51bGwuCisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUoKSBjb25zdDsKKworICAvLyBHZXQgdGhlIEZpZWxkT3B0aW9ucyBmb3IgdGhpcyBmaWVsZC4gIFRoaXMgaW5jbHVkZXMgdGhpbmdzIGxpc3RlZCBpbgorICAvLyBzcXVhcmUgYnJhY2tldHMgYWZ0ZXIgdGhlIGZpZWxkIGRlZmluaXRpb24uICBFLmcuLCB0aGUgZmllbGQ6CisgIC8vICAgb3B0aW9uYWwgc3RyaW5nIHRleHQgPSAxIFtjdHlwZT1DT1JEXTsKKyAgLy8gaGFzIHRoZSAiY3R5cGUiIG9wdGlvbiBzZXQuICBBbGxvd2VkIG9wdGlvbnMgYXJlIGRlZmluZWQgYnkgRmllbGRPcHRpb25zIGluCisgIC8vIGRlc2NyaXB0b3IucHJvdG8sIGFuZCBhbnkgYXZhaWxhYmxlIGV4dGVuc2lvbnMgb2YgdGhhdCBtZXNzYWdlLgorICBjb25zdCBGaWVsZE9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6Q29weVRvKCkuCisgIHZvaWQgQ29weVRvKEZpZWxkRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCisgIHN0ZDo6c3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoKS4KKyAgc3RkOjpzdHJpbmcgRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OworCisgIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBDcHBUeXBlIGZvciBhIHBhcnRpY3VsYXIgVHlwZS4KKyAgc3RhdGljIENwcFR5cGUgVHlwZVRvQ3BwVHlwZShUeXBlIHR5cGUpOworCisgIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBuYW1lIG9mIGEgVHlwZS4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVOYW1lKFR5cGUgdHlwZSk7CisKKyAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIG5hbWUgb2YgYSBDcHBUeXBlLgorICBzdGF0aWMgY29uc3QgY2hhciogQ3BwVHlwZU5hbWUoQ3BwVHlwZSBjcHBfdHlwZSk7CisKKyAgLy8gUmV0dXJuIHRydWUgaWZmIFtwYWNrZWQgPSB0cnVlXSBpcyB2YWxpZCBmb3IgZmllbGRzIG9mIHRoaXMgdHlwZS4KKyAgc3RhdGljIGlubGluZSBib29sIElzVHlwZVBhY2thYmxlKFR5cGUgZmllbGRfdHlwZSk7CisKKyAgLy8gUmV0dXJucyBmdWxsX25hbWUoKSBleGNlcHQgaWYgdGhlIGZpZWxkIGlzIGEgTWVzc2FnZVNldCBleHRlbnNpb24sCisgIC8vIGluIHdoaWNoIGNhc2UgaXQgcmV0dXJucyB0aGUgZnVsbF9uYW1lKCkgb2YgdGhlIGNvbnRhaW5pbmcgbWVzc2FnZSB0eXBlCisgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHByb3RvMS4KKyAgLy8KKyAgLy8gQSBNZXNzYWdlU2V0IGV4dGVuc2lvbiBpcyBkZWZpbmVkIGFzIGFuIG9wdGlvbmFsIG1lc3NhZ2UgZXh0ZW5zaW9uCisgIC8vIHdob3NlIGNvbnRhaW5pbmcgdHlwZSBoYXMgdGhlIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IG9wdGlvbiBzZXQuCisgIC8vIFRoaXMgc2hvdWxkIGJlIHRydWUgb2YgZXh0ZW5zaW9ucyBvZiBnb29nbGUucHJvdG9idWYuYnJpZGdlLk1lc3NhZ2VTZXQ7CisgIC8vIGJ5IGNvbnZlbnRpb24sIHN1Y2ggZXh0ZW5zaW9ucyBhcmUgbmFtZWQgIm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiIuCisgIC8vCisgIC8vIFRoZSBvcHBvc2l0ZSBvcGVyYXRpb24gKGxvb2tpbmcgdXAgYW4gZXh0ZW5zaW9uJ3MgRmllbGREZXNjcmlwdG9yIGdpdmVuCisgIC8vIGl0cyBwcmludGFibGUgbmFtZSkgY2FuIGJlIGFjY29tcGxpc2hlZCB3aXRoCisgIC8vICAgICBtZXNzYWdlLT5maWxlKCktPnBvb2woKS0+RmluZEV4dGVuc2lvbkJ5UHJpbnRhYmxlTmFtZShtZXNzYWdlLCBuYW1lKQorICAvLyB3aGVyZSB0aGUgZXh0ZW5zaW9uIGV4dGVuZHMgIm1lc3NhZ2UiLgorICBjb25zdCBzdGQ6OnN0cmluZyYgUHJpbnRhYmxlTmFtZUZvckV4dGVuc2lvbigpIGNvbnN0OworCisgIC8vIFNvdXJjZSBMb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBVcGRhdGVzIHwqb3V0X2xvY2F0aW9ufCB0byB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjb21wbGV0ZQorICAvLyBleHRlbnQgb2YgdGhpcyBmaWVsZCBkZWNsYXJhdGlvbi4gIFJldHVybnMgZmFsc2UgYW5kIGxlYXZlcworICAvLyB8Km91dF9sb2NhdGlvbnwgdW5jaGFuZ2VkIGlmZiBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZS4KKyAgYm9vbCBHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdDsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBTeW1ib2w7CisgIHR5cGVkZWYgRmllbGRPcHRpb25zIE9wdGlvbnNUeXBlOworCisgIC8vIEFsbG93cyBhY2Nlc3MgdG8gR2V0TG9jYXRpb25QYXRoIGZvciBhbm5vdGF0aW9ucy4KKyAgZnJpZW5kIGNsYXNzIGlvOjpQcmludGVyOworICBmcmllbmQgY2xhc3MgY29tcGlsZXI6OmNwcDo6Rm9ybWF0dGVyOworICBmcmllbmQgY2xhc3MgUmVmbGVjdGlvbjsKKworICAvLyBGaWxsIHRoZSBqc29uX25hbWUgZmllbGQgb2YgRmllbGREZXNjcmlwdG9yUHJvdG8uCisgIHZvaWQgQ29weUpzb25OYW1lVG8oRmllbGREZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdDsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KKyAgdm9pZCBEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0ZDo6c3RyaW5nKiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OworCisgIC8vIGZvcm1hdHMgdGhlIGRlZmF1bHQgdmFsdWUgYXBwcm9wcmlhdGVseSBhbmQgcmV0dXJucyBpdCBhcyBhIHN0cmluZy4KKyAgLy8gTXVzdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSB0byBjYWxsIHRoaXMuIElmIHF1b3RlX3N0cmluZ190eXBlIGlzIHRydWUsIHRoZW4KKyAgLy8gdHlwZXMgb2YgQ1BQVFlQRV9TVFJJTkcgd2lsbCBiZSBzdXJyb3VuZGVkIGJ5IHF1b3RlcyBhbmQgQ0VzY2FwZWQuCisgIHN0ZDo6c3RyaW5nIERlZmF1bHRWYWx1ZUFzU3RyaW5nKGJvb2wgcXVvdGVfc3RyaW5nX3R5cGUpIGNvbnN0OworCisgIC8vIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGZpZWxkIHR5cGUgbmFtZSBmb3IgRGVidWdTdHJpbmcuCisgIHN0ZDo6c3RyaW5nIEZpZWxkVHlwZU5hbWVEZWJ1Z1N0cmluZygpIGNvbnN0OworCisgIC8vIFdhbGtzIHVwIHRoZSBkZXNjcmlwdG9yIHRyZWUgdG8gZ2VuZXJhdGUgdGhlIHNvdXJjZSBsb2NhdGlvbiBwYXRoCisgIC8vIHRvIHRoaXMgZGVzY3JpcHRvciBmcm9tIHRoZSBmaWxlIHJvb3QuCisgIHZvaWQgR2V0TG9jYXRpb25QYXRoKHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBtYXAgbWVzc2FnZSB0eXBlLgorICBib29sIGlzX21hcF9tZXNzYWdlX3R5cGUoKSBjb25zdDsKKworICBib29sIGhhc19kZWZhdWx0X3ZhbHVlXyA6IDE7CisgIGJvb2wgcHJvdG8zX29wdGlvbmFsXyA6IDE7CisgIC8vIFdoZXRoZXIgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB0aGUganNvbl9uYW1lIGZpZWxkIG9wdGlvbiBpbiB0aGUgLnByb3RvCisgIC8vIGZpbGUuCisgIGJvb2wgaGFzX2pzb25fbmFtZV8gOiAxOworICBib29sIGlzX2V4dGVuc2lvbl8gOiAxOworICBib29sIGlzX29uZW9mXyA6IDE7CisKKyAgLy8gQWN0dWFsbHkgYSBgTGFiZWxgIGJ1dCBzdG9yZWQgYXMgdWludDhfdCB0byBzYXZlIHNwYWNlLgorICB1aW50OF90IGxhYmVsXyA6IDI7CisKKyAgLy8gQWN0dWFsbHkgYSBgVHlwZWAsIGJ1dCBzdG9yZWQgYXMgdWludDhfdCB0byBzYXZlIHNwYWNlLgorICBtdXRhYmxlIHVpbnQ4X3QgdHlwZV87CisKKyAgLy8gTG9naWNhbGx5OgorICAvLyAgIGFsbF9uYW1lc18gPSBbbmFtZSwgZnVsbF9uYW1lLCBsb3dlciwgY2FtZWwsIGpzb25dCisgIC8vIEhvd2V2ZXI6CisgIC8vICAgZHVwbGljYXRlcyB3aWxsIGJlIG9taXR0ZWQsIHNvIGxvd2VyL2NhbWVsL2pzb24gbWlnaHQgYmUgaW4gdGhlIHNhbWUKKyAgLy8gICBwb3NpdGlvbi4KKyAgLy8gV2Ugc3RvcmUgdGhlIHRydWUgb2Zmc2V0IGZvciBlYWNoIG5hbWUgaGVyZSwgYW5kIHRoZSBiaXQgd2lkdGggbXVzdCBiZQorICAvLyBsYXJnZSBlbm91Z2ggdG8gYWNjb3VudCBmb3IgdGhlIHdvcnN0IGNhc2Ugd2hlcmUgYWxsIG5hbWVzIGFyZSBwcmVzZW50LgorICB1aW50OF90IGxvd2VyY2FzZV9uYW1lX2luZGV4XyA6IDI7CisgIHVpbnQ4X3QgY2FtZWxjYXNlX25hbWVfaW5kZXhfIDogMjsKKyAgdWludDhfdCBqc29uX25hbWVfaW5kZXhfIDogMzsKKyAgLy8gU2FkbHksIGBudW1iZXJfYCBsb2NhdGVkIGhlcmUgdG8gcmVkdWNlIHBhZGRpbmcuIFVucmVsYXRlZCB0byBhbGxfbmFtZXNfCisgIC8vIGFuZCBpdHMgaW5kaWNlcyBhYm92ZS4KKyAgaW50IG51bWJlcl87CisgIGNvbnN0IHN0ZDo6c3RyaW5nKiBhbGxfbmFtZXNfOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisKKyAgLy8gVGhlIG9uY2VfZmxhZyBpcyBmb2xsb3dlZCBieSBhIE5VTCB0ZXJtaW5hdGVkIHN0cmluZyBmb3IgdGhlIHR5cGUgbmFtZSBhbmQKKyAgLy8gZW51bSBkZWZhdWx0IHZhbHVlIChvciBlbXB0eSBzdHJpbmcgaWYgbm8gZGVmYXVsdCBlbnVtKS4KKyAgaW50ZXJuYWw6Om9uY2VfZmxhZyogdHlwZV9vbmNlXzsKKyAgc3RhdGljIHZvaWQgVHlwZU9uY2VJbml0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdG9faW5pdCk7CisgIHZvaWQgSW50ZXJuYWxUeXBlT25jZUluaXQoKSBjb25zdDsKKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlXzsKKyAgdW5pb24geworICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogY29udGFpbmluZ19vbmVvZjsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbnNpb25fc2NvcGU7CisgIH0gc2NvcGVfOworICB1bmlvbiB7CisgICAgbXV0YWJsZSBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGU7CisgICAgbXV0YWJsZSBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlOworICB9IHR5cGVfZGVzY3JpcHRvcl87CisgIGNvbnN0IEZpZWxkT3B0aW9ucyogb3B0aW9uc187CisgIC8vIElNUE9SVEFOVDogIElmIHlvdSBhZGQgYSBuZXcgZmllbGQsIG1ha2Ugc3VyZSB0byBzZWFyY2ggZm9yIGFsbCBpbnN0YW5jZXMKKyAgLy8gb2YgQWxsb2NhdGU8RmllbGREZXNjcmlwdG9yPigpIGFuZCBBbGxvY2F0ZUFycmF5PEZpZWxkRGVzY3JpcHRvcj4oKSBpbgorICAvLyBkZXNjcmlwdG9yLmNjIGFuZCB1cGRhdGUgdGhlbSB0byBpbml0aWFsaXplIHRoZSBmaWVsZC4KKworICB1bmlvbiB7CisgICAgaW50MzJfdCBkZWZhdWx0X3ZhbHVlX2ludDMyX3RfOworICAgIGludDY0X3QgZGVmYXVsdF92YWx1ZV9pbnQ2NF90XzsKKyAgICB1aW50MzJfdCBkZWZhdWx0X3ZhbHVlX3VpbnQzMl90XzsKKyAgICB1aW50NjRfdCBkZWZhdWx0X3ZhbHVlX3VpbnQ2NF90XzsKKyAgICBmbG9hdCBkZWZhdWx0X3ZhbHVlX2Zsb2F0XzsKKyAgICBkb3VibGUgZGVmYXVsdF92YWx1ZV9kb3VibGVfOworICAgIGJvb2wgZGVmYXVsdF92YWx1ZV9ib29sXzsKKworICAgIG11dGFibGUgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZGVmYXVsdF92YWx1ZV9lbnVtXzsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyogZGVmYXVsdF92YWx1ZV9zdHJpbmdfOworICAgIG11dGFibGUgc3RkOjphdG9taWM8Y29uc3QgTWVzc2FnZSo+IGRlZmF1bHRfZ2VuZXJhdGVkX2luc3RhbmNlXzsKKyAgfTsKKworICBzdGF0aWMgY29uc3QgQ3BwVHlwZSBrVHlwZVRvQ3BwVHlwZU1hcFtNQVhfVFlQRSArIDFdOworCisgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrVHlwZVRvTmFtZVtNQVhfVFlQRSArIDFdOworCisgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrQ3BwVHlwZVRvTmFtZVtNQVhfQ1BQVFlQRSArIDFdOworCisgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrTGFiZWxUb05hbWVbTUFYX0xBQkVMICsgMV07CisKKyAgLy8gTXVzdCBiZSBjb25zdHJ1Y3RlZCB1c2luZyBEZXNjcmlwdG9yUG9vbC4KKyAgRmllbGREZXNjcmlwdG9yKCkge30KKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOworICBmcmllbmQgY2xhc3MgRmlsZURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgT25lb2ZEZXNjcmlwdG9yOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmllbGREZXNjcmlwdG9yKTsKK307CisKK1BST1RPQlVGX0lOVEVSTkFMX0NIRUNLX0NMQVNTX1NJWkUoRmllbGREZXNjcmlwdG9yLCA3Mik7CisKKy8vIERlc2NyaWJlcyBhIG9uZW9mIGRlZmluZWQgaW4gYSBtZXNzYWdlIHR5cGUuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgT25lb2ZEZXNjcmlwdG9yIDogcHJpdmF0ZSBpbnRlcm5hbDo6U3ltYm9sQmFzZSB7CisgcHVibGljOgorICB0eXBlZGVmIE9uZW9mRGVzY3JpcHRvclByb3RvIFByb3RvOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7ICAgICAgIC8vIE5hbWUgb2YgdGhpcyBvbmVvZi4KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxfbmFtZSgpIGNvbnN0OyAgLy8gRnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG9uZW9mLgorCisgIC8vIEluZGV4IG9mIHRoaXMgb25lb2Ygd2l0aGluIHRoZSBtZXNzYWdlJ3Mgb25lb2YgYXJyYXkuCisgIGludCBpbmRleCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgd2hldGhlciB0aGlzIG9uZW9mIHdhcyBpbnNlcnRlZCBieSB0aGUgY29tcGlsZXIgdG8gd3JhcCBhIHByb3RvMworICAvLyBvcHRpb25hbCBmaWVsZC4gSWYgdGhpcyByZXR1cm5zIHRydWUsIGNvZGUgZ2VuZXJhdG9ycyBzaG91bGQgKm5vdCogZW1pdCBpdC4KKyAgYm9vbCBpc19zeW50aGV0aWMoKSBjb25zdDsKKworICAvLyBUaGUgLnByb3RvIGZpbGUgaW4gd2hpY2ggdGhpcyBvbmVvZiB3YXMgZGVmaW5lZC4gIE5ldmVyIG51bGxwdHIuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKCkgY29uc3Q7CisgIC8vIFRoZSBEZXNjcmlwdG9yIGZvciB0aGUgbWVzc2FnZSBjb250YWluaW5nIHRoaXMgb25lb2YuCisgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSgpIGNvbnN0OworCisgIC8vIFRoZSBudW1iZXIgb2YgKG5vbi1leHRlbnNpb24pIGZpZWxkcyB3aGljaCBhcmUgbWVtYmVycyBvZiB0aGlzIG9uZW9mLgorICBpbnQgZmllbGRfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0IGEgbWVtYmVyIG9mIHRoaXMgb25lb2YsIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgZGVjbGFyZWQgaW4gdGhlCisgIC8vIC5wcm90byBmaWxlLiAgRG9lcyBub3QgaW5jbHVkZSBleHRlbnNpb25zLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKGludCBpbmRleCkgY29uc3Q7CisKKyAgY29uc3QgT25lb2ZPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkNvcHlUbygpLgorICB2b2lkIENvcHlUbyhPbmVvZkRlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgorICBzdGQ6OnN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKCkuCisgIHN0ZDo6c3RyaW5nIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMoY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdDsKKworICAvLyBTb3VyY2UgTG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUKKyAgLy8gZXh0ZW50IG9mIHRoaXMgb25lb2YgZGVjbGFyYXRpb24uICBSZXR1cm5zIGZhbHNlIGFuZCBsZWF2ZXMKKyAgLy8gfCpvdXRfbG9jYXRpb258IHVuY2hhbmdlZCBpZmYgbG9jYXRpb24gaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUuCisgIGJvb2wgR2V0U291cmNlTG9jYXRpb24oU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3Q7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU3ltYm9sOworICB0eXBlZGVmIE9uZW9mT3B0aW9ucyBPcHRpb25zVHlwZTsKKworICAvLyBBbGxvd3MgYWNjZXNzIHRvIEdldExvY2F0aW9uUGF0aCBmb3IgYW5ub3RhdGlvbnMuCisgIGZyaWVuZCBjbGFzcyBpbzo6UHJpbnRlcjsKKyAgZnJpZW5kIGNsYXNzIGNvbXBpbGVyOjpjcHA6OkZvcm1hdHRlcjsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KKyAgdm9pZCBEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0ZDo6c3RyaW5nKiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OworCisgIC8vIFdhbGtzIHVwIHRoZSBkZXNjcmlwdG9yIHRyZWUgdG8gZ2VuZXJhdGUgdGhlIHNvdXJjZSBsb2NhdGlvbiBwYXRoCisgIC8vIHRvIHRoaXMgZGVzY3JpcHRvciBmcm9tIHRoZSBmaWxlIHJvb3QuCisgIHZvaWQgR2V0TG9jYXRpb25QYXRoKHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgY29uc3Q7CisKKyAgaW50IGZpZWxkX2NvdW50XzsKKworICAvLyBhbGxfbmFtZXNfID0gW25hbWUsIGZ1bGxfbmFtZV0KKyAgY29uc3Qgc3RkOjpzdHJpbmcqIGFsbF9uYW1lc187CisgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZV87CisgIGNvbnN0IE9uZW9mT3B0aW9ucyogb3B0aW9uc187CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRzXzsKKworICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCisgIC8vIG9mIEFsbG9jYXRlPE9uZW9mRGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxPbmVvZkRlc2NyaXB0b3I+KCkKKyAgLy8gaW4gZGVzY3JpcHRvci5jYyBhbmQgdXBkYXRlIHRoZW0gdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQuCisKKyAgLy8gTXVzdCBiZSBjb25zdHJ1Y3RlZCB1c2luZyBEZXNjcmlwdG9yUG9vbC4KKyAgT25lb2ZEZXNjcmlwdG9yKCkge30KKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOworICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvcjsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE9uZW9mRGVzY3JpcHRvcik7Cit9OworCitQUk9UT0JVRl9JTlRFUk5BTF9DSEVDS19DTEFTU19TSVpFKE9uZW9mRGVzY3JpcHRvciwgNDApOworCisvLyBEZXNjcmliZXMgYW4gZW51bSB0eXBlIGRlZmluZWQgaW4gYSAucHJvdG8gZmlsZS4gIFRvIGdldCB0aGUgRW51bURlc2NyaXB0b3IKKy8vIGZvciBhIGdlbmVyYXRlZCBlbnVtIHR5cGUsIGNhbGwgVHlwZU5hbWVfZGVzY3JpcHRvcigpLiAgVXNlIERlc2NyaXB0b3JQb29sCisvLyB0byBjb25zdHJ1Y3QgeW91ciBvd24gZGVzY3JpcHRvcnMuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRW51bURlc2NyaXB0b3IgOiBwcml2YXRlIGludGVybmFsOjpTeW1ib2xCYXNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgRW51bURlc2NyaXB0b3JQcm90byBQcm90bzsKKworICAvLyBUaGUgbmFtZSBvZiB0aGlzIGVudW0gdHlwZSBpbiB0aGUgY29udGFpbmluZyBzY29wZS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKworICAvLyBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudW0gdHlwZSwgc2NvcGUgZGVsaW1pdGVkIGJ5IHBlcmlvZHMuCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsX25hbWUoKSBjb25zdDsKKworICAvLyBJbmRleCBvZiB0aGlzIGVudW0gd2l0aGluIHRoZSBmaWxlIG9yIGNvbnRhaW5pbmcgbWVzc2FnZSdzIGVudW0gYXJyYXkuCisgIGludCBpbmRleCgpIGNvbnN0OworCisgIC8vIFRoZSAucHJvdG8gZmlsZSBpbiB3aGljaCB0aGlzIGVudW0gdHlwZSB3YXMgZGVmaW5lZC4gIE5ldmVyIG51bGxwdHIuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKCkgY29uc3Q7CisKKyAgLy8gVGhlIG51bWJlciBvZiB2YWx1ZXMgZm9yIHRoaXMgRW51bURlc2NyaXB0b3IuICBHdWFyYW50ZWVkIHRvIGJlIGdyZWF0ZXIKKyAgLy8gdGhhbiB6ZXJvLgorICBpbnQgdmFsdWVfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhIHZhbHVlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgdmFsdWVfY291bnQoKS4KKyAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gTG9va3MgdXAgYSB2YWx1ZSBieSBuYW1lLiAgUmV0dXJucyBudWxscHRyIGlmIG5vIHN1Y2ggdmFsdWUgZXhpc3RzLgorICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kVmFsdWVCeU5hbWUoQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSBjb25zdDsKKyAgLy8gTG9va3MgdXAgYSB2YWx1ZSBieSBudW1iZXIuICBSZXR1cm5zIG51bGxwdHIgaWYgbm8gc3VjaCB2YWx1ZSBleGlzdHMuICBJZgorICAvLyBtdWx0aXBsZSB2YWx1ZXMgaGF2ZSB0aGlzIG51bWJlciwgdGhlIGZpcnN0IG9uZSBkZWZpbmVkIGlzIHJldHVybmVkLgorICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kVmFsdWVCeU51bWJlcihpbnQgbnVtYmVyKSBjb25zdDsKKworICAvLyBJZiB0aGlzIGVudW0gdHlwZSBpcyBuZXN0ZWQgaW4gYSBtZXNzYWdlIHR5cGUsIHRoaXMgaXMgdGhhdCBtZXNzYWdlIHR5cGUuCisgIC8vIE90aGVyd2lzZSwgbnVsbHB0ci4KKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlKCkgY29uc3Q7CisKKyAgLy8gR2V0IG9wdGlvbnMgZm9yIHRoaXMgZW51bSB0eXBlLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgLnByb3RvIGZpbGUgYnkKKyAgLy8gcGxhY2luZyBsaW5lcyBsaWtlICJvcHRpb24gZm9vID0gMTIzNDsiIGluIHRoZSBlbnVtIGRlZmluaXRpb24uICBBbGxvd2VkCisgIC8vIG9wdGlvbnMgYXJlIGRlZmluZWQgYnkgRW51bU9wdGlvbnMgaW4gZGVzY3JpcHRvci5wcm90bywgYW5kIGFueSBhdmFpbGFibGUKKyAgLy8gZXh0ZW5zaW9ucyBvZiB0aGF0IG1lc3NhZ2UuCisgIGNvbnN0IEVudW1PcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkNvcHlUbygpLgorICB2b2lkIENvcHlUbyhFbnVtRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCisgIHN0ZDo6c3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoKS4KKyAgc3RkOjpzdHJpbmcgRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGFuIHVua25vd24gZW51bS4gVGhpcyB3aWxsCisgIC8vIG9ubHkgYmUgdGhlIGNhc2UgaWYgdGhpcyBkZXNjcmlwdG9yIGNvbWVzIGZyb20gYSBEZXNjcmlwdG9yUG9vbAorICAvLyB3aXRoIEFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpIHNldC4KKyAgYm9vbCBpc19wbGFjZWhvbGRlcigpIGNvbnN0OworCisgIC8vIFJlc2VydmVkIGZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gQSByYW5nZSBvZiByZXNlcnZlZCBmaWVsZCBudW1iZXJzLgorICBzdHJ1Y3QgUmVzZXJ2ZWRSYW5nZSB7CisgICAgaW50IHN0YXJ0OyAgLy8gaW5jbHVzaXZlCisgICAgaW50IGVuZDsgICAgLy8gaW5jbHVzaXZlCisgIH07CisKKyAgLy8gVGhlIG51bWJlciBvZiByZXNlcnZlZCByYW5nZXMgaW4gdGhpcyBtZXNzYWdlIHR5cGUuCisgIGludCByZXNlcnZlZF9yYW5nZV9jb3VudCgpIGNvbnN0OworICAvLyBHZXRzIGFuIHJlc2VydmVkIHJhbmdlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwKKyAgLy8gcmVzZXJ2ZWRfcmFuZ2VfY291bnQoKS4gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZAorICAvLyBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IEVudW1EZXNjcmlwdG9yOjpSZXNlcnZlZFJhbmdlKiByZXNlcnZlZF9yYW5nZShpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbnVtYmVyIGlzIGluIG9uZSBvZiB0aGUgcmVzZXJ2ZWQgcmFuZ2VzLgorICBib29sIElzUmVzZXJ2ZWROdW1iZXIoaW50IG51bWJlcikgY29uc3Q7CisKKyAgLy8gUmV0dXJucyBudWxscHRyIGlmIG5vIHJlc2VydmVkIHJhbmdlIGNvbnRhaW5zIHRoZSBnaXZlbiBudW1iZXIuCisgIGNvbnN0IEVudW1EZXNjcmlwdG9yOjpSZXNlcnZlZFJhbmdlKiBGaW5kUmVzZXJ2ZWRSYW5nZUNvbnRhaW5pbmdOdW1iZXIoCisgICAgICBpbnQgbnVtYmVyKSBjb25zdDsKKworICAvLyBUaGUgbnVtYmVyIG9mIHJlc2VydmVkIGZpZWxkIG5hbWVzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgorICBpbnQgcmVzZXJ2ZWRfbmFtZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgYSByZXNlcnZlZCBuYW1lIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgcmVzZXJ2ZWRfbmFtZV9jb3VudCgpLgorICBjb25zdCBzdGQ6OnN0cmluZyYgcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmllbGQgbmFtZSBpcyByZXNlcnZlZC4KKyAgYm9vbCBJc1Jlc2VydmVkTmFtZShDb25zdFN0cmluZ1BhcmFtIG5hbWUpIGNvbnN0OworCisgIC8vIFNvdXJjZSBMb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBVcGRhdGVzIHwqb3V0X2xvY2F0aW9ufCB0byB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjb21wbGV0ZQorICAvLyBleHRlbnQgb2YgdGhpcyBlbnVtIGRlY2xhcmF0aW9uLiAgUmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzCisgIC8vIHwqb3V0X2xvY2F0aW9ufCB1bmNoYW5nZWQgaWZmIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlLgorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbDsKKyAgdHlwZWRlZiBFbnVtT3B0aW9ucyBPcHRpb25zVHlwZTsKKworICAvLyBBbGxvd3MgYWNjZXNzIHRvIEdldExvY2F0aW9uUGF0aCBmb3IgYW5ub3RhdGlvbnMuCisgIGZyaWVuZCBjbGFzcyBpbzo6UHJpbnRlcjsKKyAgZnJpZW5kIGNsYXNzIGNvbXBpbGVyOjpjcHA6OkZvcm1hdHRlcjsKKworICAvLyBBbGxvdyBhY2Nlc3MgdG8gRmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bi4KKyAgZnJpZW5kIGNsYXNzIGRlc2NyaXB0b3JfdW5pdHRlc3Q6OkRlc2NyaXB0b3JUZXN0OworCisgIC8vIExvb2tzIHVwIGEgdmFsdWUgYnkgbnVtYmVyLiAgSWYgdGhlIHZhbHVlIGRvZXMgbm90IGV4aXN0LCBkeW5hbWljYWxseQorICAvLyBjcmVhdGVzIGEgbmV3IEVudW1WYWx1ZURlc2NyaXB0b3IgZm9yIHRoYXQgdmFsdWUsIGFzc3VtaW5nIHRoYXQgaXQgd2FzCisgIC8vIHVua25vd24uIElmIGEgbmV3IGRlc2NyaXB0b3IgaXMgY3JlYXRlZCwgdGhpcyBpcyBkb25lIGluIGEgdGhyZWFkLXNhZmUgd2F5LAorICAvLyBhbmQgZnV0dXJlIGNhbGxzIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGRlc2NyaXB0b3IgcG9pbnRlci4KKyAgLy8KKyAgLy8gVGhpcyBpcyBwcml2YXRlIGJ1dCBpcyB1c2VkIGJ5IFJlZmxlY3Rpb24gKHdoaWNoIGlzIGZyaWVuZGVkIGJlbG93KSB0bworICAvLyByZXR1cm4gYSB2YWxpZCBFbnVtVmFsdWVEZXNjcmlwdG9yIGZyb20gR2V0RW51bSgpIHdoZW4gdGhpcyBmZWF0dXJlIGlzCisgIC8vIGVuYWJsZWQuCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24oCisgICAgICBpbnQgbnVtYmVyKSBjb25zdDsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KKyAgdm9pZCBEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0ZDo6c3RyaW5nKiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OworCisgIC8vIFdhbGtzIHVwIHRoZSBkZXNjcmlwdG9yIHRyZWUgdG8gZ2VuZXJhdGUgdGhlIHNvdXJjZSBsb2NhdGlvbiBwYXRoCisgIC8vIHRvIHRoaXMgZGVzY3JpcHRvciBmcm9tIHRoZSBmaWxlIHJvb3QuCisgIHZvaWQgR2V0TG9jYXRpb25QYXRoKHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgY29uc3Q7CisKKyAgLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGFuIHVua25vd24gdHlwZS4KKyAgYm9vbCBpc19wbGFjZWhvbGRlcl8gOiAxOworICAvLyBUcnVlIGlmIHRoaXMgaXMgYSBwbGFjZWhvbGRlciBhbmQgdGhlIHR5cGUgbmFtZSB3YXNuJ3QgZnVsbHktcXVhbGlmaWVkLgorICBib29sIGlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXyA6IDE7CisKKyAgLy8gVGhpcyBwb2ludHMgdG8gdGhlIGxhc3QgdmFsdWUgX2luZGV4XyB0aGF0IGlzIHBhcnQgb2YgdGhlIHNlcXVlbmNlIHN0YXJ0aW5nCisgIC8vIHdpdGggdGhlIGZpcnN0IGxhYmVsLCB3aGVyZQorICAvLyAgIGBlbnVtLT52YWx1ZShpKS0+bnVtYmVyKCkgPT0gZW51bS0+dmFsdWUoMCktPm51bWJlcigpICsgaWAKKyAgLy8gV2UgbWVhc3VyZSByZWxhdGl2ZSB0byB0aGUgZmlyc3QgbGFiZWwgdG8gYWRhcHQgdG8gZW51bSBsYWJlbHMgc3RhcnRpbmcgYXQKKyAgLy8gMCBvciAxLgorICAvLyBVc2VzIDE2LWJpdCB0byBhdm9pZCBleHRyYSBwYWRkaW5nLiBVbmxpa2VseSB0byBoYXZlIG1vcmUgdGhhbiAyXjE1CisgIC8vIHNlcXVlbnRpYWxseSBudW1iZXJlZCBsYWJlbHMgaW4gYW4gZW51bS4KKyAgaW50MTZfdCBzZXF1ZW50aWFsX3ZhbHVlX2xpbWl0XzsKKworICBpbnQgdmFsdWVfY291bnRfOworCisgIC8vIGFsbF9uYW1lc18gPSBbbmFtZSwgZnVsbF9uYW1lXQorICBjb25zdCBzdGQ6OnN0cmluZyogYWxsX25hbWVzXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfOworICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGVfOworICBjb25zdCBFbnVtT3B0aW9ucyogb3B0aW9uc187CisgIEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlc187CisKKyAgaW50IHJlc2VydmVkX3JhbmdlX2NvdW50XzsKKyAgaW50IHJlc2VydmVkX25hbWVfY291bnRfOworICBFbnVtRGVzY3JpcHRvcjo6UmVzZXJ2ZWRSYW5nZSogcmVzZXJ2ZWRfcmFuZ2VzXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcqKiByZXNlcnZlZF9uYW1lc187CisKKyAgLy8gSU1QT1JUQU5UOiAgSWYgeW91IGFkZCBhIG5ldyBmaWVsZCwgbWFrZSBzdXJlIHRvIHNlYXJjaCBmb3IgYWxsIGluc3RhbmNlcworICAvLyBvZiBBbGxvY2F0ZTxFbnVtRGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxFbnVtRGVzY3JpcHRvcj4oKSBpbgorICAvLyBkZXNjcmlwdG9yLmNjIGFuZCB1cGRhdGUgdGhlbSB0byBpbml0aWFsaXplIHRoZSBmaWVsZC4KKworICAvLyBNdXN0IGJlIGNvbnN0cnVjdGVkIHVzaW5nIERlc2NyaXB0b3JQb29sLgorICBFbnVtRGVzY3JpcHRvcigpIHt9CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBGaWVsZERlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBGaWxlRGVzY3JpcHRvclRhYmxlczsKKyAgZnJpZW5kIGNsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBGaWxlRGVzY3JpcHRvcjsKKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JQb29sOworICBmcmllbmQgY2xhc3MgUmVmbGVjdGlvbjsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1EZXNjcmlwdG9yKTsKK307CisKK1BST1RPQlVGX0lOVEVSTkFMX0NIRUNLX0NMQVNTX1NJWkUoRW51bURlc2NyaXB0b3IsIDcyKTsKKworLy8gRGVzY3JpYmVzIGFuIGluZGl2aWR1YWwgZW51bSBjb25zdGFudCBvZiBhIHBhcnRpY3VsYXIgdHlwZS4gIFRvIGdldCB0aGUKKy8vIEVudW1WYWx1ZURlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4gZW51bSB2YWx1ZSwgZmlyc3QgZ2V0IHRoZSBFbnVtRGVzY3JpcHRvcgorLy8gZm9yIGl0cyB0eXBlLCB0aGVuIHVzZSBFbnVtRGVzY3JpcHRvcjo6RmluZFZhbHVlQnlOYW1lKCkgb3IKKy8vIEVudW1EZXNjcmlwdG9yOjpGaW5kVmFsdWVCeU51bWJlcigpLiAgVXNlIERlc2NyaXB0b3JQb29sIHRvIGNvbnN0cnVjdAorLy8geW91ciBvd24gZGVzY3JpcHRvcnMuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRW51bVZhbHVlRGVzY3JpcHRvciA6IHByaXZhdGUgaW50ZXJuYWw6OlN5bWJvbEJhc2VOPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGludGVybmFsOjpTeW1ib2xCYXNlTjwxPiB7CisgcHVibGljOgorICB0eXBlZGVmIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBQcm90bzsKKworICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OyAgLy8gTmFtZSBvZiB0aGlzIGVudW0gY29uc3RhbnQuCisgIGludCBpbmRleCgpIGNvbnN0OyAgICAgICAgICAgICAgICAvLyBJbmRleCB3aXRoaW4gdGhlIGVudW1zJ3MgRGVzY3JpcHRvci4KKyAgaW50IG51bWJlcigpIGNvbnN0OyAgICAgICAgICAgICAgIC8vIE51bWVyaWMgdmFsdWUgb2YgdGhpcyBlbnVtIGNvbnN0YW50LgorCisgIC8vIFRoZSBmdWxsX25hbWUgb2YgYW4gZW51bSB2YWx1ZSBpcyBhIHNpYmxpbmcgc3ltYm9sIG9mIHRoZSBlbnVtIHR5cGUuCisgIC8vIGUuZy4gdGhlIGZ1bGwgbmFtZSBvZiBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMiBpcyBhY3R1YWxseQorICAvLyAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlRZUEVfSU5UMzIiLCBOT1QKKyAgLy8gImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlLlRZUEVfSU5UMzIiLiAgVGhpcyBpcyB0byBjb25mb3JtCisgIC8vIHdpdGggQysrIHNjb3BpbmcgcnVsZXMgZm9yIGVudW1zLgorICBjb25zdCBzdGQ6OnN0cmluZyYgZnVsbF9uYW1lKCkgY29uc3Q7CisKKyAgLy8gVGhlIC5wcm90byBmaWxlIGluIHdoaWNoIHRoaXMgdmFsdWUgd2FzIGRlZmluZWQuICBOZXZlciBudWxscHRyLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSgpIGNvbnN0OworICAvLyBUaGUgdHlwZSBvZiB0aGlzIHZhbHVlLiAgTmV2ZXIgbnVsbHB0ci4KKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIHR5cGUoKSBjb25zdDsKKworICAvLyBHZXQgb3B0aW9ucyBmb3IgdGhpcyBlbnVtIHZhbHVlLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgLnByb3RvIGZpbGUgYnkKKyAgLy8gYWRkaW5nIHRleHQgbGlrZSAiW2ZvbyA9IDEyMzRdIiBhZnRlciBhbiBlbnVtIHZhbHVlIGRlZmluaXRpb24uICBBbGxvd2VkCisgIC8vIG9wdGlvbnMgYXJlIGRlZmluZWQgYnkgRW51bVZhbHVlT3B0aW9ucyBpbiBkZXNjcmlwdG9yLnByb3RvLCBhbmQgYW55CisgIC8vIGF2YWlsYWJsZSBleHRlbnNpb25zIG9mIHRoYXQgbWVzc2FnZS4KKyAgY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpDb3B5VG8oKS4KKyAgdm9pZCBDb3B5VG8oRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCisgIHN0ZDo6c3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoKS4KKyAgc3RkOjpzdHJpbmcgRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OworCisgIC8vIFNvdXJjZSBMb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBVcGRhdGVzIHwqb3V0X2xvY2F0aW9ufCB0byB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjb21wbGV0ZQorICAvLyBleHRlbnQgb2YgdGhpcyBlbnVtIHZhbHVlIGRlY2xhcmF0aW9uLiAgUmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzCisgIC8vIHwqb3V0X2xvY2F0aW9ufCB1bmNoYW5nZWQgaWZmIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlLgorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbDsKKyAgdHlwZWRlZiBFbnVtVmFsdWVPcHRpb25zIE9wdGlvbnNUeXBlOworCisgIC8vIEFsbG93cyBhY2Nlc3MgdG8gR2V0TG9jYXRpb25QYXRoIGZvciBhbm5vdGF0aW9ucy4KKyAgZnJpZW5kIGNsYXNzIGlvOjpQcmludGVyOworICBmcmllbmQgY2xhc3MgY29tcGlsZXI6OmNwcDo6Rm9ybWF0dGVyOworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgorICB2b2lkIERlYnVnU3RyaW5nKGludCBkZXB0aCwgc3RkOjpzdHJpbmcqIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3Q7CisKKyAgLy8gV2Fsa3MgdXAgdGhlIGRlc2NyaXB0b3IgdHJlZSB0byBnZW5lcmF0ZSB0aGUgc291cmNlIGxvY2F0aW9uIHBhdGgKKyAgLy8gdG8gdGhpcyBkZXNjcmlwdG9yIGZyb20gdGhlIGZpbGUgcm9vdC4KKyAgdm9pZCBHZXRMb2NhdGlvblBhdGgoc3RkOjp2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdDsKKworICBpbnQgbnVtYmVyXzsKKyAgLy8gYWxsX25hbWVzXyA9IFtuYW1lLCBmdWxsX25hbWVdCisgIGNvbnN0IHN0ZDo6c3RyaW5nKiBhbGxfbmFtZXNfOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogdHlwZV87CisgIGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMqIG9wdGlvbnNfOworICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCisgIC8vIG9mIEFsbG9jYXRlPEVudW1WYWx1ZURlc2NyaXB0b3I+KCkgYW5kIEFsbG9jYXRlQXJyYXk8RW51bVZhbHVlRGVzY3JpcHRvcj4oKQorICAvLyBpbiBkZXNjcmlwdG9yLmNjIGFuZCB1cGRhdGUgdGhlbSB0byBpbml0aWFsaXplIHRoZSBmaWVsZC4KKworICAvLyBNdXN0IGJlIGNvbnN0cnVjdGVkIHVzaW5nIERlc2NyaXB0b3JQb29sLgorICBFbnVtVmFsdWVEZXNjcmlwdG9yKCkge30KKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOworICBmcmllbmQgY2xhc3MgRW51bURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yUG9vbDsKKyAgZnJpZW5kIGNsYXNzIEZpbGVEZXNjcmlwdG9yVGFibGVzOworICBmcmllbmQgY2xhc3MgUmVmbGVjdGlvbjsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1WYWx1ZURlc2NyaXB0b3IpOworfTsKKworUFJPVE9CVUZfSU5URVJOQUxfQ0hFQ0tfQ0xBU1NfU0laRShFbnVtVmFsdWVEZXNjcmlwdG9yLCAzMik7CisKKy8vIERlc2NyaWJlcyBhbiBSUEMgc2VydmljZS4gVXNlIERlc2NyaXB0b3JQb29sIHRvIGNvbnN0cnVjdCB5b3VyIG93bgorLy8gZGVzY3JpcHRvcnMuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgU2VydmljZURlc2NyaXB0b3IgOiBwcml2YXRlIGludGVybmFsOjpTeW1ib2xCYXNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgU2VydmljZURlc2NyaXB0b3JQcm90byBQcm90bzsKKworICAvLyBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSwgbm90IGluY2x1ZGluZyBpdHMgY29udGFpbmluZyBzY29wZS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgLy8gVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZXJ2aWNlLCBzY29wZSBkZWxpbWl0ZWQgYnkgcGVyaW9kcy4KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxfbmFtZSgpIGNvbnN0OworICAvLyBJbmRleCBvZiB0aGlzIHNlcnZpY2Ugd2l0aGluIHRoZSBmaWxlJ3Mgc2VydmljZXMgYXJyYXkuCisgIGludCBpbmRleCgpIGNvbnN0OworCisgIC8vIFRoZSAucHJvdG8gZmlsZSBpbiB3aGljaCB0aGlzIHNlcnZpY2Ugd2FzIGRlZmluZWQuICBOZXZlciBudWxscHRyLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSgpIGNvbnN0OworCisgIC8vIEdldCBvcHRpb25zIGZvciB0aGlzIHNlcnZpY2UgdHlwZS4gIFRoZXNlIGFyZSBzcGVjaWZpZWQgaW4gdGhlIC5wcm90byBmaWxlCisgIC8vIGJ5IHBsYWNpbmcgbGluZXMgbGlrZSAib3B0aW9uIGZvbyA9IDEyMzQ7IiBpbiB0aGUgc2VydmljZSBkZWZpbml0aW9uLgorICAvLyBBbGxvd2VkIG9wdGlvbnMgYXJlIGRlZmluZWQgYnkgU2VydmljZU9wdGlvbnMgaW4gZGVzY3JpcHRvci5wcm90bywgYW5kIGFueQorICAvLyBhdmFpbGFibGUgZXh0ZW5zaW9ucyBvZiB0aGF0IG1lc3NhZ2UuCisgIGNvbnN0IFNlcnZpY2VPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisKKyAgLy8gVGhlIG51bWJlciBvZiBtZXRob2RzIHRoaXMgc2VydmljZSBkZWZpbmVzLgorICBpbnQgbWV0aG9kX2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYSBNZXRob2REZXNjcmlwdG9yIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgbWV0aG9kX2NvdW50KCkuCisgIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QoaW50IGluZGV4KSBjb25zdDsKKworICAvLyBMb29rIHVwIGEgTWV0aG9kRGVzY3JpcHRvciBieSBuYW1lLgorICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBGaW5kTWV0aG9kQnlOYW1lKENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkNvcHlUbygpLgorICB2b2lkIENvcHlUbyhTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCisgIHN0ZDo6c3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoKS4KKyAgc3RkOjpzdHJpbmcgRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OworCisgIC8vIFNvdXJjZSBMb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBVcGRhdGVzIHwqb3V0X2xvY2F0aW9ufCB0byB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjb21wbGV0ZQorICAvLyBleHRlbnQgb2YgdGhpcyBzZXJ2aWNlIGRlY2xhcmF0aW9uLiAgUmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzCisgIC8vIHwqb3V0X2xvY2F0aW9ufCB1bmNoYW5nZWQgaWZmIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlLgorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbDsKKyAgdHlwZWRlZiBTZXJ2aWNlT3B0aW9ucyBPcHRpb25zVHlwZTsKKworICAvLyBBbGxvd3MgYWNjZXNzIHRvIEdldExvY2F0aW9uUGF0aCBmb3IgYW5ub3RhdGlvbnMuCisgIGZyaWVuZCBjbGFzcyBpbzo6UHJpbnRlcjsKKyAgZnJpZW5kIGNsYXNzIGNvbXBpbGVyOjpjcHA6OkZvcm1hdHRlcjsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KKyAgdm9pZCBEZWJ1Z1N0cmluZyhzdGQ6OnN0cmluZyogY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdDsKKworICAvLyBXYWxrcyB1cCB0aGUgZGVzY3JpcHRvciB0cmVlIHRvIGdlbmVyYXRlIHRoZSBzb3VyY2UgbG9jYXRpb24gcGF0aAorICAvLyB0byB0aGlzIGRlc2NyaXB0b3IgZnJvbSB0aGUgZmlsZSByb290LgorICB2b2lkIEdldExvY2F0aW9uUGF0aChzdGQ6OnZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0OworCisgIC8vIGFsbF9uYW1lc18gPSBbbmFtZSwgZnVsbF9uYW1lXQorICBjb25zdCBzdGQ6OnN0cmluZyogYWxsX25hbWVzXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfOworICBjb25zdCBTZXJ2aWNlT3B0aW9ucyogb3B0aW9uc187CisgIE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZHNfOworICBpbnQgbWV0aG9kX2NvdW50XzsKKyAgLy8gSU1QT1JUQU5UOiAgSWYgeW91IGFkZCBhIG5ldyBmaWVsZCwgbWFrZSBzdXJlIHRvIHNlYXJjaCBmb3IgYWxsIGluc3RhbmNlcworICAvLyBvZiBBbGxvY2F0ZTxTZXJ2aWNlRGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxTZXJ2aWNlRGVzY3JpcHRvcj4oKSBpbgorICAvLyBkZXNjcmlwdG9yLmNjIGFuZCB1cGRhdGUgdGhlbSB0byBpbml0aWFsaXplIHRoZSBmaWVsZC4KKworICAvLyBNdXN0IGJlIGNvbnN0cnVjdGVkIHVzaW5nIERlc2NyaXB0b3JQb29sLgorICBTZXJ2aWNlRGVzY3JpcHRvcigpIHt9CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKKyAgZnJpZW5kIGNsYXNzIEZpbGVEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgTWV0aG9kRGVzY3JpcHRvcjsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNlcnZpY2VEZXNjcmlwdG9yKTsKK307CisKK1BST1RPQlVGX0lOVEVSTkFMX0NIRUNLX0NMQVNTX1NJWkUoU2VydmljZURlc2NyaXB0b3IsIDQ4KTsKKworLy8gRGVzY3JpYmVzIGFuIGluZGl2aWR1YWwgc2VydmljZSBtZXRob2QuICBUbyBvYnRhaW4gYSBNZXRob2REZXNjcmlwdG9yIGdpdmVuCisvLyBhIHNlcnZpY2UsIGZpcnN0IGdldCBpdHMgU2VydmljZURlc2NyaXB0b3IsIHRoZW4gY2FsbAorLy8gU2VydmljZURlc2NyaXB0b3I6OkZpbmRNZXRob2RCeU5hbWUoKS4gIFVzZSBEZXNjcmlwdG9yUG9vbCB0byBjb25zdHJ1Y3QgeW91cgorLy8gb3duIGRlc2NyaXB0b3JzLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIE1ldGhvZERlc2NyaXB0b3IgOiBwcml2YXRlIGludGVybmFsOjpTeW1ib2xCYXNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgTWV0aG9kRGVzY3JpcHRvclByb3RvIFByb3RvOworCisgIC8vIE5hbWUgb2YgdGhpcyBtZXRob2QsIG5vdCBpbmNsdWRpbmcgY29udGFpbmluZyBzY29wZS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgLy8gVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBtZXRob2QsIHNjb3BlIGRlbGltaXRlZCBieSBwZXJpb2RzLgorICBjb25zdCBzdGQ6OnN0cmluZyYgZnVsbF9uYW1lKCkgY29uc3Q7CisgIC8vIEluZGV4IHdpdGhpbiB0aGUgc2VydmljZSdzIERlc2NyaXB0b3IuCisgIGludCBpbmRleCgpIGNvbnN0OworCisgIC8vIFRoZSAucHJvdG8gZmlsZSBpbiB3aGljaCB0aGlzIG1ldGhvZCB3YXMgZGVmaW5lZC4gIE5ldmVyIG51bGxwdHIuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKCkgY29uc3Q7CisgIC8vIEdldHMgdGhlIHNlcnZpY2UgdG8gd2hpY2ggdGhpcyBtZXRob2QgYmVsb25ncy4gIE5ldmVyIG51bGxwdHIuCisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlKCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgdHlwZSBvZiBwcm90b2NvbCBtZXNzYWdlIHdoaWNoIHRoaXMgbWV0aG9kIGFjY2VwdHMgYXMgaW5wdXQuCisgIGNvbnN0IERlc2NyaXB0b3IqIGlucHV0X3R5cGUoKSBjb25zdDsKKyAgLy8gR2V0cyB0aGUgdHlwZSBvZiBwcm90b2NvbCBtZXNzYWdlIHdoaWNoIHRoaXMgbWVzc2FnZSBwcm9kdWNlcyBhcyBvdXRwdXQuCisgIGNvbnN0IERlc2NyaXB0b3IqIG91dHB1dF90eXBlKCkgY29uc3Q7CisKKyAgLy8gR2V0cyB3aGV0aGVyIHRoZSBjbGllbnQgc3RyZWFtcyBtdWx0aXBsZSByZXF1ZXN0cy4KKyAgYm9vbCBjbGllbnRfc3RyZWFtaW5nKCkgY29uc3Q7CisgIC8vIEdldHMgd2hldGhlciB0aGUgc2VydmVyIHN0cmVhbXMgbXVsdGlwbGUgcmVzcG9uc2VzLgorICBib29sIHNlcnZlcl9zdHJlYW1pbmcoKSBjb25zdDsKKworICAvLyBHZXQgb3B0aW9ucyBmb3IgdGhpcyBtZXRob2QuICBUaGVzZSBhcmUgc3BlY2lmaWVkIGluIHRoZSAucHJvdG8gZmlsZSBieQorICAvLyBwbGFjaW5nIGxpbmVzIGxpa2UgIm9wdGlvbiBmb28gPSAxMjM0OyIgaW4gY3VybHktYnJhY2VzIGFmdGVyIGEgbWV0aG9kCisgIC8vIGRlY2xhcmF0aW9uLiAgQWxsb3dlZCBvcHRpb25zIGFyZSBkZWZpbmVkIGJ5IE1ldGhvZE9wdGlvbnMgaW4KKyAgLy8gZGVzY3JpcHRvci5wcm90bywgYW5kIGFueSBhdmFpbGFibGUgZXh0ZW5zaW9ucyBvZiB0aGF0IG1lc3NhZ2UuCisgIGNvbnN0IE1ldGhvZE9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6Q29weVRvKCkuCisgIHZvaWQgQ29weVRvKE1ldGhvZERlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgorICBzdGQ6OnN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKCkuCisgIHN0ZDo6c3RyaW5nIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMoY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdDsKKworICAvLyBTb3VyY2UgTG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUKKyAgLy8gZXh0ZW50IG9mIHRoaXMgbWV0aG9kIGRlY2xhcmF0aW9uLiAgUmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzCisgIC8vIHwqb3V0X2xvY2F0aW9ufCB1bmNoYW5nZWQgaWZmIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlLgorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbDsKKyAgdHlwZWRlZiBNZXRob2RPcHRpb25zIE9wdGlvbnNUeXBlOworCisgIC8vIEFsbG93cyBhY2Nlc3MgdG8gR2V0TG9jYXRpb25QYXRoIGZvciBhbm5vdGF0aW9ucy4KKyAgZnJpZW5kIGNsYXNzIGlvOjpQcmludGVyOworICBmcmllbmQgY2xhc3MgY29tcGlsZXI6OmNwcDo6Rm9ybWF0dGVyOworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgorICB2b2lkIERlYnVnU3RyaW5nKGludCBkZXB0aCwgc3RkOjpzdHJpbmcqIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3Q7CisKKyAgLy8gV2Fsa3MgdXAgdGhlIGRlc2NyaXB0b3IgdHJlZSB0byBnZW5lcmF0ZSB0aGUgc291cmNlIGxvY2F0aW9uIHBhdGgKKyAgLy8gdG8gdGhpcyBkZXNjcmlwdG9yIGZyb20gdGhlIGZpbGUgcm9vdC4KKyAgdm9pZCBHZXRMb2NhdGlvblBhdGgoc3RkOjp2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdDsKKworICBib29sIGNsaWVudF9zdHJlYW1pbmdfOworICBib29sIHNlcnZlcl9zdHJlYW1pbmdfOworICAvLyBhbGxfbmFtZXNfID0gW25hbWUsIGZ1bGxfbmFtZV0KKyAgY29uc3Qgc3RkOjpzdHJpbmcqIGFsbF9uYW1lc187CisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlXzsKKyAgbXV0YWJsZSBpbnRlcm5hbDo6TGF6eURlc2NyaXB0b3IgaW5wdXRfdHlwZV87CisgIG11dGFibGUgaW50ZXJuYWw6OkxhenlEZXNjcmlwdG9yIG91dHB1dF90eXBlXzsKKyAgY29uc3QgTWV0aG9kT3B0aW9ucyogb3B0aW9uc187CisgIC8vIElNUE9SVEFOVDogIElmIHlvdSBhZGQgYSBuZXcgZmllbGQsIG1ha2Ugc3VyZSB0byBzZWFyY2ggZm9yIGFsbCBpbnN0YW5jZXMKKyAgLy8gb2YgQWxsb2NhdGU8TWV0aG9kRGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxNZXRob2REZXNjcmlwdG9yPigpIGluCisgIC8vIGRlc2NyaXB0b3IuY2MgYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgorCisgIC8vIE11c3QgYmUgY29uc3RydWN0ZWQgdXNpbmcgRGVzY3JpcHRvclBvb2wuCisgIE1ldGhvZERlc2NyaXB0b3IoKSB7fQorICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvckJ1aWxkZXI7CisgIGZyaWVuZCBjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1ldGhvZERlc2NyaXB0b3IpOworfTsKKworUFJPVE9CVUZfSU5URVJOQUxfQ0hFQ0tfQ0xBU1NfU0laRShNZXRob2REZXNjcmlwdG9yLCA2NCk7CisKKy8vIERlc2NyaWJlcyBhIHdob2xlIC5wcm90byBmaWxlLiAgVG8gZ2V0IHRoZSBGaWxlRGVzY3JpcHRvciBmb3IgYSBjb21waWxlZC1pbgorLy8gZmlsZSwgZ2V0IHRoZSBkZXNjcmlwdG9yIGZvciBzb21ldGhpbmcgZGVmaW5lZCBpbiB0aGF0IGZpbGUgYW5kIGNhbGwKKy8vIGRlc2NyaXB0b3ItPmZpbGUoKS4gIFVzZSBEZXNjcmlwdG9yUG9vbCB0byBjb25zdHJ1Y3QgeW91ciBvd24gZGVzY3JpcHRvcnMuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRmlsZURlc2NyaXB0b3IgOiBwcml2YXRlIGludGVybmFsOjpTeW1ib2xCYXNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgRmlsZURlc2NyaXB0b3JQcm90byBQcm90bzsKKworICAvLyBUaGUgZmlsZW5hbWUsIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgdHJlZS4KKyAgLy8gZS5nLiAiZm9vL2Jhci9iYXoucHJvdG8iCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisKKyAgLy8gVGhlIHBhY2thZ2UsIGUuZy4gImdvb2dsZS5wcm90b2J1Zi5jb21waWxlciIuCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlKCkgY29uc3Q7CisKKyAgLy8gVGhlIERlc2NyaXB0b3JQb29sIGluIHdoaWNoIHRoaXMgRmlsZURlc2NyaXB0b3IgYW5kIGFsbCBpdHMgY29udGVudHMgd2VyZQorICAvLyBhbGxvY2F0ZWQuICBOZXZlciBudWxscHRyLgorICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCgpIGNvbnN0OworCisgIC8vIFRoZSBudW1iZXIgb2YgZmlsZXMgaW1wb3J0ZWQgYnkgdGhpcyBvbmUuCisgIGludCBkZXBlbmRlbmN5X2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYW4gaW1wb3J0ZWQgZmlsZSBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8IGRlcGVuZGVuY3lfY291bnQoKS4KKyAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gVGhlIG51bWJlciBvZiBmaWxlcyBwdWJsaWMgaW1wb3J0ZWQgYnkgdGhpcyBvbmUuCisgIC8vIFRoZSBwdWJsaWMgZGVwZW5kZW5jeSBsaXN0IGlzIGEgc3Vic2V0IG9mIHRoZSBkZXBlbmRlbmN5IGxpc3QuCisgIGludCBwdWJsaWNfZGVwZW5kZW5jeV9jb3VudCgpIGNvbnN0OworICAvLyBHZXRzIGEgcHVibGljIGltcG9ydGVkIGZpbGUgYnkgaW5kZXgsIHdoZXJlIDAgPD0gaW5kZXggPAorICAvLyBwdWJsaWNfZGVwZW5kZW5jeV9jb3VudCgpLgorICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIHB1YmxpY19kZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gVGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IGFyZSBpbXBvcnRlZCBmb3Igd2VhayBmaWVsZHMuCisgIC8vIFRoZSB3ZWFrIGRlcGVuZGVuY3kgbGlzdCBpcyBhIHN1YnNldCBvZiB0aGUgZGVwZW5kZW5jeSBsaXN0LgorICBpbnQgd2Vha19kZXBlbmRlbmN5X2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYSB3ZWFrIGltcG9ydGVkIGZpbGUgYnkgaW5kZXgsIHdoZXJlIDAgPD0gaW5kZXggPAorICAvLyB3ZWFrX2RlcGVuZGVuY3lfY291bnQoKS4KKyAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiB3ZWFrX2RlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdDsKKworICAvLyBOdW1iZXIgb2YgdG9wLWxldmVsIG1lc3NhZ2UgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUuICAoVGhpcyBkb2VzIG5vdAorICAvLyBpbmNsdWRlIG5lc3RlZCB0eXBlcy4pCisgIGludCBtZXNzYWdlX3R5cGVfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhIHRvcC1sZXZlbCBtZXNzYWdlIHR5cGUsIHdoZXJlIDAgPD0gaW5kZXggPCBtZXNzYWdlX3R5cGVfY291bnQoKS4KKyAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZShpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIE51bWJlciBvZiB0b3AtbGV2ZWwgZW51bSB0eXBlcyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gIChUaGlzIGRvZXMgbm90CisgIC8vIGluY2x1ZGUgbmVzdGVkIHR5cGVzLikKKyAgaW50IGVudW1fdHlwZV9jb3VudCgpIGNvbnN0OworICAvLyBHZXRzIGEgdG9wLWxldmVsIGVudW0gdHlwZSwgd2hlcmUgMCA8PSBpbmRleCA8IGVudW1fdHlwZV9jb3VudCgpLgorICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZShpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIE51bWJlciBvZiBzZXJ2aWNlcyBkZWZpbmVkIGluIHRoaXMgZmlsZS4KKyAgaW50IHNlcnZpY2VfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhIHNlcnZpY2UsIHdoZXJlIDAgPD0gaW5kZXggPCBzZXJ2aWNlX2NvdW50KCkuCisgIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZShpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIE51bWJlciBvZiBleHRlbnNpb25zIGRlZmluZWQgYXQgZmlsZSBzY29wZS4gIChUaGlzIGRvZXMgbm90IGluY2x1ZGUKKyAgLy8gZXh0ZW5zaW9ucyBuZXN0ZWQgd2l0aGluIG1lc3NhZ2UgdHlwZXMuKQorICBpbnQgZXh0ZW5zaW9uX2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYW4gZXh0ZW5zaW9uJ3MgZGVzY3JpcHRvciwgd2hlcmUgMCA8PSBpbmRleCA8IGV4dGVuc2lvbl9jb3VudCgpLgorICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24oaW50IGluZGV4KSBjb25zdDsKKworICAvLyBHZXQgb3B0aW9ucyBmb3IgdGhpcyBmaWxlLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgLnByb3RvIGZpbGUgYnkKKyAgLy8gcGxhY2luZyBsaW5lcyBsaWtlICJvcHRpb24gZm9vID0gMTIzNDsiIGF0IHRoZSB0b3AgbGV2ZWwsIG91dHNpZGUgb2YgYW55CisgIC8vIG90aGVyIGRlZmluaXRpb25zLiAgQWxsb3dlZCBvcHRpb25zIGFyZSBkZWZpbmVkIGJ5IEZpbGVPcHRpb25zIGluCisgIC8vIGRlc2NyaXB0b3IucHJvdG8sIGFuZCBhbnkgYXZhaWxhYmxlIGV4dGVuc2lvbnMgb2YgdGhhdCBtZXNzYWdlLgorICBjb25zdCBGaWxlT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworCisgIC8vIFN5bnRheCBvZiB0aGlzIGZpbGUuCisgIGVudW0gU3ludGF4IHsKKyAgICBTWU5UQVhfVU5LTk9XTiA9IDAsCisgICAgU1lOVEFYX1BST1RPMiA9IDIsCisgICAgU1lOVEFYX1BST1RPMyA9IDMsCisgIH07CisgIFN5bnRheCBzeW50YXgoKSBjb25zdDsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIFN5bnRheE5hbWUoU3ludGF4IHN5bnRheCk7CisKKyAgLy8gRmluZCBhIHRvcC1sZXZlbCBtZXNzYWdlIHR5cGUgYnkgbmFtZSAobm90IGZ1bGxfbmFtZSkuICBSZXR1cm5zIG51bGxwdHIgaWYKKyAgLy8gbm90IGZvdW5kLgorICBjb25zdCBEZXNjcmlwdG9yKiBGaW5kTWVzc2FnZVR5cGVCeU5hbWUoQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSBjb25zdDsKKyAgLy8gRmluZCBhIHRvcC1sZXZlbCBlbnVtIHR5cGUgYnkgbmFtZS4gIFJldHVybnMgbnVsbHB0ciBpZiBub3QgZm91bmQuCisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBGaW5kRW51bVR5cGVCeU5hbWUoQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSBjb25zdDsKKyAgLy8gRmluZCBhbiBlbnVtIHZhbHVlIGRlZmluZWQgaW4gYW55IHRvcC1sZXZlbCBlbnVtIGJ5IG5hbWUuICBSZXR1cm5zIG51bGxwdHIKKyAgLy8gaWYgbm90IGZvdW5kLgorICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kRW51bVZhbHVlQnlOYW1lKENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgY29uc3Q7CisgIC8vIEZpbmQgYSBzZXJ2aWNlIGRlZmluaXRpb24gYnkgbmFtZS4gIFJldHVybnMgbnVsbHB0ciBpZiBub3QgZm91bmQuCisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBGaW5kU2VydmljZUJ5TmFtZShDb25zdFN0cmluZ1BhcmFtIG5hbWUpIGNvbnN0OworICAvLyBGaW5kIGEgdG9wLWxldmVsIGV4dGVuc2lvbiBkZWZpbml0aW9uIGJ5IG5hbWUuICBSZXR1cm5zIG51bGxwdHIgaWYgbm90CisgIC8vIGZvdW5kLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeU5hbWUoQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSBjb25zdDsKKyAgLy8gU2ltaWxhciB0byBGaW5kRXh0ZW5zaW9uQnlOYW1lKCksIGJ1dCBzZWFyY2hlcyBieSBsb3dlcmNhc2VkLW5hbWUuICBTZWUKKyAgLy8gRGVzY3JpcHRvcjo6RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKCkuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZSgKKyAgICAgIENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgY29uc3Q7CisgIC8vIFNpbWlsYXIgdG8gRmluZEV4dGVuc2lvbkJ5TmFtZSgpLCBidXQgc2VhcmNoZXMgYnkgY2FtZWxjYXNlZC1uYW1lLiAgU2VlCisgIC8vIERlc2NyaXB0b3I6OkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgpLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoCisgICAgICBDb25zdFN0cmluZ1BhcmFtIG5hbWUpIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpDb3B5VG8oKS4KKyAgLy8gTm90ZXM6CisgIC8vIC0gVGhpcyBtZXRob2QgZG9lcyBOT1QgY29weSBzb3VyY2UgY29kZSBpbmZvcm1hdGlvbiBzaW5jZSBpdCBpcyByZWxhdGl2ZWx5CisgIC8vICAgbGFyZ2UgYW5kIHJhcmVseSBuZWVkZWQuICBTZWUgQ29weVNvdXJjZUNvZGVJbmZvVG8oKSBiZWxvdy4KKyAgdm9pZCBDb3B5VG8oRmlsZURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0OworICAvLyBXcml0ZSB0aGUgc291cmNlIGNvZGUgaW5mb3JtYXRpb24gb2YgdGhpcyBGaWxlRGVzY3JpcHRvciBpbnRvIHRoZSBnaXZlbgorICAvLyBGaWxlRGVzY3JpcHRvclByb3RvLiAgU2VlIENvcHlUbygpIGFib3ZlLgorICB2b2lkIENvcHlTb3VyY2VDb2RlSW5mb1RvKEZpbGVEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdDsKKyAgLy8gRmlsbCB0aGUganNvbl9uYW1lIGZpZWxkIG9mIEZpZWxkRGVzY3JpcHRvclByb3RvIGZvciBhbGwgZmllbGRzLiBDYW4gb25seQorICAvLyBiZSBjYWxsZWQgYWZ0ZXIgQ29weVRvKCkuCisgIHZvaWQgQ29weUpzb25OYW1lVG8oRmlsZURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgorICBzdGQ6OnN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKCkuCisgIHN0ZDo6c3RyaW5nIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMoY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciBhbiB1bmtub3duIGZpbGUuIFRoaXMgd2lsbAorICAvLyBvbmx5IGJlIHRoZSBjYXNlIGlmIHRoaXMgZGVzY3JpcHRvciBjb21lcyBmcm9tIGEgRGVzY3JpcHRvclBvb2wKKyAgLy8gd2l0aCBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKSBzZXQuCisgIGJvb2wgaXNfcGxhY2Vob2xkZXIoKSBjb25zdDsKKworICAvLyBVcGRhdGVzIHwqb3V0X2xvY2F0aW9ufCB0byB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjb21wbGV0ZSBleHRlbnQgb2YKKyAgLy8gdGhpcyBmaWxlIGRlY2xhcmF0aW9uIChuYW1lbHksIHRoZSBlbXB0eSBwYXRoKS4KKyAgYm9vbCBHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdDsKKworICAvLyBVcGRhdGVzIHwqb3V0X2xvY2F0aW9ufCB0byB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjb21wbGV0ZQorICAvLyBleHRlbnQgb2YgdGhlIGRlY2xhcmF0aW9uIG9yIGRlY2xhcmF0aW9uLXBhcnQgZGVub3RlZCBieSB8cGF0aHwuCisgIC8vIFJldHVybnMgZmFsc2UgYW5kIGxlYXZlcyB8Km91dF9sb2NhdGlvbnwgdW5jaGFuZ2VkIGlmZiBsb2NhdGlvbgorICAvLyBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZS4gIChTZWUgU291cmNlQ29kZUluZm8gZm9yCisgIC8vIGRlc2NyaXB0aW9uIG9mIHBhdGggZW5jb2RpbmcuKQorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3Q7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU3ltYm9sOworICB0eXBlZGVmIEZpbGVPcHRpb25zIE9wdGlvbnNUeXBlOworCisgIGJvb2wgaXNfcGxhY2Vob2xkZXJfOworICAvLyBJbmRpY2F0ZXMgdGhlIEZpbGVEZXNjcmlwdG9yIGlzIGNvbXBsZXRlZCBidWlsZGluZy4gVXNlZCB0byB2ZXJpZnkKKyAgLy8gdGhhdCB0eXBlIGFjY2Vzc29yIGZ1bmN0aW9ucyB0aGF0IGNhbiBwb3NzaWJseSBidWlsZCBhIGRlcGVuZGVudCBmaWxlCisgIC8vIGFyZW4ndCBjYWxsZWQgZHVyaW5nIHRoZSBwcm9jZXNzIG9mIGJ1aWxkaW5nIHRoZSBmaWxlLgorICBib29sIGZpbmlzaGVkX2J1aWxkaW5nXzsKKyAgLy8gQWN0dWFsbHkgYSBgU3ludGF4YCBidXQgc3RvcmVkIGFzIHVpbnQ4X3QgdG8gc2F2ZSBzcGFjZS4KKyAgdWludDhfdCBzeW50YXhfOworICAvLyBUaGlzIG9uZSBpcyBoZXJlIHRvIGZpbGwgdGhlIHBhZGRpbmcuCisgIGludCBleHRlbnNpb25fY291bnRfOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nKiBuYW1lXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcqIHBhY2thZ2VfOworICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbF87CisKKyAgLy8gZGVwZW5kZW5jaWVzX29uY2VfIGNvbnRhaW4gYSBvbmNlX2ZsYWcgZm9sbG93ZWQgYnkgTiBOVUwgdGVybWluYXRlZAorICAvLyBzdHJpbmdzLiBEZXBlbmRlbmNpZXMgdGhhdCBkbyBub3QgbmVlZCB0byBiZSBsb2FkZWQgd2lsbCBiZSBlbXB0eS4gaWUganVzdAorICAvLyB7J1wwJ30KKyAgaW50ZXJuYWw6Om9uY2VfZmxhZyogZGVwZW5kZW5jaWVzX29uY2VfOworICBzdGF0aWMgdm9pZCBEZXBlbmRlbmNpZXNPbmNlSW5pdChjb25zdCBGaWxlRGVzY3JpcHRvciogdG9faW5pdCk7CisgIHZvaWQgSW50ZXJuYWxEZXBlbmRlbmNpZXNPbmNlSW5pdCgpIGNvbnN0OworCisgIC8vIFRoZXNlIGFyZSBhcnJhbmdlZCB0byBtaW5pbWl6ZSBwYWRkaW5nIG9uIDY0LWJpdC4KKyAgaW50IGRlcGVuZGVuY3lfY291bnRfOworICBpbnQgcHVibGljX2RlcGVuZGVuY3lfY291bnRfOworICBpbnQgd2Vha19kZXBlbmRlbmN5X2NvdW50XzsKKyAgaW50IG1lc3NhZ2VfdHlwZV9jb3VudF87CisgIGludCBlbnVtX3R5cGVfY291bnRfOworICBpbnQgc2VydmljZV9jb3VudF87CisKKyAgbXV0YWJsZSBjb25zdCBGaWxlRGVzY3JpcHRvcioqIGRlcGVuZGVuY2llc187CisgIGludCogcHVibGljX2RlcGVuZGVuY2llc187CisgIGludCogd2Vha19kZXBlbmRlbmNpZXNfOworICBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGVzXzsKKyAgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZXNfOworICBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZXNfOworICBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbnNfOworICBjb25zdCBGaWxlT3B0aW9ucyogb3B0aW9uc187CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3JUYWJsZXMqIHRhYmxlc187CisgIGNvbnN0IFNvdXJjZUNvZGVJbmZvKiBzb3VyY2VfY29kZV9pbmZvXzsKKworICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCisgIC8vIG9mIEFsbG9jYXRlPEZpbGVEZXNjcmlwdG9yPigpIGFuZCBBbGxvY2F0ZUFycmF5PEZpbGVEZXNjcmlwdG9yPigpIGluCisgIC8vIGRlc2NyaXB0b3IuY2MgYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgorCisgIEZpbGVEZXNjcmlwdG9yKCkge30KKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOworICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvclBvb2w7CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRmllbGREZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkxhenlEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgT25lb2ZEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRW51bURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBFbnVtVmFsdWVEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgTWV0aG9kRGVzY3JpcHRvcjsKKyAgZnJpZW5kIGNsYXNzIFNlcnZpY2VEZXNjcmlwdG9yOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmlsZURlc2NyaXB0b3IpOworfTsKKworUFJPVE9CVUZfSU5URVJOQUxfQ0hFQ0tfQ0xBU1NfU0laRShGaWxlRGVzY3JpcHRvciwgMTQ0KTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBVc2VkIHRvIGNvbnN0cnVjdCBkZXNjcmlwdG9ycy4KKy8vCisvLyBOb3JtYWxseSB5b3Ugd29uJ3Qgd2FudCB0byBidWlsZCB5b3VyIG93biBkZXNjcmlwdG9ycy4gIE1lc3NhZ2UgY2xhc3NlcworLy8gY29uc3RydWN0ZWQgYnkgdGhlIHByb3RvY29sIGNvbXBpbGVyIHdpbGwgcHJvdmlkZSB0aGVtIGZvciB5b3UuICBIb3dldmVyLAorLy8gaWYgeW91IGFyZSBpbXBsZW1lbnRpbmcgTWVzc2FnZSBvbiB5b3VyIG93biwgb3IgaWYgeW91IGFyZSB3cml0aW5nIGEKKy8vIHByb2dyYW0gd2hpY2ggY2FuIG9wZXJhdGUgb24gdG90YWxseSBhcmJpdHJhcnkgdHlwZXMgYW5kIG5lZWRzIHRvIGxvYWQKKy8vIHRoZW0gZnJvbSBzb21lIHNvcnQgb2YgZGF0YWJhc2UsIHlvdSBtaWdodCBuZWVkIHRvLgorLy8KKy8vIFNpbmNlIERlc2NyaXB0b3JzIGFyZSBjb21wb3NlZCBvZiBhIHdob2xlIGxvdCBvZiBjcm9zcy1saW5rZWQgYml0cyBvZgorLy8gZGF0YSB0aGF0IHdvdWxkIGJlIGEgcGFpbiB0byBwdXQgdG9nZXRoZXIgbWFudWFsbHksIHRoZQorLy8gRGVzY3JpcHRvclBvb2wgY2xhc3MgaXMgcHJvdmlkZWQgdG8gbWFrZSB0aGUgcHJvY2VzcyBlYXNpZXIuICBJdCBjYW4KKy8vIHRha2UgYSBGaWxlRGVzY3JpcHRvclByb3RvIChkZWZpbmVkIGluIGRlc2NyaXB0b3IucHJvdG8pLCB2YWxpZGF0ZSBpdCwKKy8vIGFuZCBjb252ZXJ0IGl0IHRvIGEgc2V0IG9mIG5pY2VseSBjcm9zcy1saW5rZWQgRGVzY3JpcHRvcnMuCisvLworLy8gRGVzY3JpcHRvclBvb2wgYWxzbyBoZWxwcyB3aXRoIG1lbW9yeSBtYW5hZ2VtZW50LiAgRGVzY3JpcHRvcnMgYXJlCisvLyBjb21wb3NlZCBvZiBtYW55IG9iamVjdHMgY29udGFpbmluZyBzdGF0aWMgZGF0YSBhbmQgcG9pbnRlcnMgdG8gZWFjaAorLy8gb3RoZXIuICBJbiBhbGwgbGlrZWxpaG9vZCwgd2hlbiBpdCBjb21lcyB0aW1lIHRvIGRlbGV0ZSB0aGlzIGRhdGEsCisvLyB5b3UnbGwgd2FudCB0byBkZWxldGUgaXQgYWxsIGF0IG9uY2UuICBJbiBmYWN0LCBpdCBpcyBub3QgdW5jb21tb24gdG8KKy8vIGhhdmUgYSB3aG9sZSBwb29sIG9mIGRlc2NyaXB0b3JzIGFsbCBjcm9zcy1saW5rZWQgd2l0aCBlYWNoIG90aGVyIHdoaWNoCisvLyB5b3Ugd2lzaCB0byBkZWxldGUgYWxsIGF0IG9uY2UuICBUaGlzIGNsYXNzIHJlcHJlc2VudHMgc3VjaCBhIHBvb2wsIGFuZAorLy8gaGFuZGxlcyB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgZm9yIHlvdS4KKy8vCisvLyBZb3UgY2FuIGFsc28gc2VhcmNoIGZvciBkZXNjcmlwdG9ycyB3aXRoaW4gYSBEZXNjcmlwdG9yUG9vbCBieSBuYW1lLCBhbmQKKy8vIGV4dGVuc2lvbnMgYnkgbnVtYmVyLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIERlc2NyaXB0b3JQb29sIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZSBhIG5vcm1hbCwgZW1wdHkgRGVzY3JpcHRvclBvb2wuCisgIERlc2NyaXB0b3JQb29sKCk7CisKKyAgLy8gQ29uc3RydWN0cyBhIERlc2NyaXB0b3JQb29sIHRoYXQsIHdoZW4gaXQgY2FuJ3QgZmluZCBzb21ldGhpbmcgYW1vbmcgdGhlCisgIC8vIGRlc2NyaXB0b3JzIGFscmVhZHkgaW4gdGhlIHBvb2wsIGxvb2tzIGZvciBpdCBpbiB0aGUgZ2l2ZW4KKyAgLy8gRGVzY3JpcHRvckRhdGFiYXNlLgorICAvLyBOb3RlczoKKyAgLy8gLSBJZiBhIERlc2NyaXB0b3JQb29sIGlzIGNvbnN0cnVjdGVkIHRoaXMgd2F5LCBpdHMgQnVpbGRGaWxlKigpIG1ldGhvZHMKKyAgLy8gICBtdXN0IG5vdCBiZSBjYWxsZWQgKHRoZXkgd2lsbCBhc3NlcnQtZmFpbCkuICBUaGUgb25seSB3YXkgdG8gcG9wdWxhdGUKKyAgLy8gICB0aGUgcG9vbCB3aXRoIGRlc2NyaXB0b3JzIGlzIHRvIGNhbGwgdGhlIEZpbmQqQnkqKCkgbWV0aG9kcy4KKyAgLy8gLSBUaGUgRmluZCpCeSooKSBtZXRob2RzIG1heSBibG9jayB0aGUgY2FsbGluZyB0aHJlYWQgaWYgdGhlCisgIC8vICAgRGVzY3JpcHRvckRhdGFiYXNlIGJsb2Nrcy4gIFRoaXMgaW4gdHVybiBtZWFucyB0aGF0IHBhcnNpbmcgbWVzc2FnZXMKKyAgLy8gICBtYXkgYmxvY2sgaWYgdGhleSBuZWVkIHRvIGxvb2sgdXAgZXh0ZW5zaW9ucy4KKyAgLy8gLSBUaGUgRmluZCpCeSooKSBtZXRob2RzIHdpbGwgdXNlIG11dGV4ZXMgZm9yIHRocmVhZC1zYWZldHksIHRodXMgbWFraW5nCisgIC8vICAgdGhlbSBzbG93ZXIgZXZlbiB3aGVuIHRoZXkgZG9uJ3QgaGF2ZSB0byBmYWxsIGJhY2sgdG8gdGhlIGRhdGFiYXNlLgorICAvLyAgIEluIGZhY3QsIGV2ZW4gdGhlIEZpbmQqQnkqKCkgbWV0aG9kcyBvZiBkZXNjcmlwdG9yIG9iamVjdHMgb3duZWQgYnkKKyAgLy8gICB0aGlzIHBvb2wgd2lsbCBiZSBzbG93ZXIsIHNpbmNlIHRoZXkgd2lsbCBoYXZlIHRvIG9idGFpbiBsb2NrcyB0b28uCisgIC8vIC0gQW4gRXJyb3JDb2xsZWN0b3IgbWF5IG9wdGlvbmFsbHkgYmUgZ2l2ZW4gdG8gY29sbGVjdCB2YWxpZGF0aW9uIGVycm9ycworICAvLyAgIGluIGZpbGVzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gIElmIG5vdCBnaXZlbiwgZXJyb3JzIHdpbGwgYmUgcHJpbnRlZAorICAvLyAgIHRvIEdPT0dMRV9MT0coRVJST1IpLiAgUmVtZW1iZXIgdGhhdCBmaWxlcyBhcmUgYnVpbHQgb24tZGVtYW5kLCBzbyB0aGlzCisgIC8vICAgRXJyb3JDb2xsZWN0b3IgbWF5IGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQgdGhhdCBjYWxscyBvbmUgb2YgdGhlCisgIC8vICAgRmluZCpCeSooKSBtZXRob2RzLgorICAvLyAtIFRoZSBEZXNjcmlwdG9yRGF0YWJhc2UgbXVzdCBub3QgYmUgbXV0YXRlZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mCisgIC8vICAgdGhlIERlc2NyaXB0b3JQb29sLiBFdmVuIGlmIHRoZSBjbGllbnQgdGFrZXMgY2FyZSB0byBhdm9pZCBkYXRhIHJhY2VzLAorICAvLyAgIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIERlc2NyaXB0b3JEYXRhYmFzZSBtYXkgbm90IGJlIHJlZmxlY3RlZAorICAvLyAgIGluIHN1YnNlcXVlbnQgbG9va3VwcyBpbiB0aGUgRGVzY3JpcHRvclBvb2wuCisgIGNsYXNzIEVycm9yQ29sbGVjdG9yOworICBleHBsaWNpdCBEZXNjcmlwdG9yUG9vbChEZXNjcmlwdG9yRGF0YWJhc2UqIGZhbGxiYWNrX2RhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yID0gbnVsbHB0cik7CisKKyAgfkRlc2NyaXB0b3JQb29sKCk7CisKKyAgLy8gR2V0IGEgcG9pbnRlciB0byB0aGUgZ2VuZXJhdGVkIHBvb2wuICBHZW5lcmF0ZWQgcHJvdG9jb2wgbWVzc2FnZSBjbGFzc2VzCisgIC8vIHdoaWNoIGFyZSBjb21waWxlZCBpbnRvIHRoZSBiaW5hcnkgd2lsbCBhbGxvY2F0ZSB0aGVpciBkZXNjcmlwdG9ycyBpbgorICAvLyB0aGlzIHBvb2wuICBEbyBub3QgYWRkIHlvdXIgb3duIGRlc2NyaXB0b3JzIHRvIHRoaXMgcG9vbC4KKyAgc3RhdGljIGNvbnN0IERlc2NyaXB0b3JQb29sKiBnZW5lcmF0ZWRfcG9vbCgpOworCisKKyAgLy8gRmluZCBhIEZpbGVEZXNjcmlwdG9yIGluIHRoZSBwb29sIGJ5IGZpbGUgbmFtZS4gIFJldHVybnMgbnVsbHB0ciBpZiBub3QKKyAgLy8gZm91bmQuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBGaW5kRmlsZUJ5TmFtZShDb25zdFN0cmluZ1BhcmFtIG5hbWUpIGNvbnN0OworCisgIC8vIEZpbmQgdGhlIEZpbGVEZXNjcmlwdG9yIGluIHRoZSBwb29sIHdoaWNoIGRlZmluZXMgdGhlIGdpdmVuIHN5bWJvbC4KKyAgLy8gSWYgYW55IG9mIHRoZSBGaW5kKkJ5TmFtZSgpIG1ldGhvZHMgYmVsb3cgd291bGQgc3VjY2VlZCwgdGhlbiB0aGlzIGlzCisgIC8vIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGF0IG1ldGhvZCBhbmQgY2FsbGluZyB0aGUgcmVzdWx0J3MgZmlsZSgpIG1ldGhvZC4KKyAgLy8gT3RoZXJ3aXNlIHRoaXMgcmV0dXJucyBudWxscHRyLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgICAgQ29uc3RTdHJpbmdQYXJhbSBzeW1ib2xfbmFtZSkgY29uc3Q7CisKKyAgLy8gTG9va2luZyB1cCBkZXNjcmlwdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlc2UgZmluZCBkZXNjcmlwdG9ycyBieSBmdWxseS1xdWFsaWZpZWQgbmFtZS4gIFRoZXNlIHdpbGwgZmluZCBib3RoCisgIC8vIHRvcC1sZXZlbCBkZXNjcmlwdG9ycyBhbmQgbmVzdGVkIGRlc2NyaXB0b3JzLiAgVGhleSByZXR1cm4gbnVsbHB0ciBpZiBub3QKKyAgLy8gZm91bmQuCisKKyAgY29uc3QgRGVzY3JpcHRvciogRmluZE1lc3NhZ2VUeXBlQnlOYW1lKENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgY29uc3Q7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEZpZWxkQnlOYW1lKENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgY29uc3Q7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbkJ5TmFtZShDb25zdFN0cmluZ1BhcmFtIG5hbWUpIGNvbnN0OworICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIEZpbmRPbmVvZkJ5TmFtZShDb25zdFN0cmluZ1BhcmFtIG5hbWUpIGNvbnN0OworICBjb25zdCBFbnVtRGVzY3JpcHRvciogRmluZEVudW1UeXBlQnlOYW1lKENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgY29uc3Q7CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEZpbmRFbnVtVmFsdWVCeU5hbWUoQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSBjb25zdDsKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIEZpbmRTZXJ2aWNlQnlOYW1lKENvbnN0U3RyaW5nUGFyYW0gbmFtZSkgY29uc3Q7CisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIEZpbmRNZXRob2RCeU5hbWUoQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSBjb25zdDsKKworICAvLyBGaW5kcyBhbiBleHRlbnNpb24gb2YgdGhlIGdpdmVuIHR5cGUgYnkgbnVtYmVyLiAgVGhlIGV4dGVuZGVlIG11c3QgYmUKKyAgLy8gYSBtZW1iZXIgb2YgdGhpcyBEZXNjcmlwdG9yUG9vbCBvciBvbmUgb2YgaXRzIHVuZGVybGF5cy4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uQnlOdW1iZXIoY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIGNvbnN0OworCisgIC8vIEZpbmRzIGFuIGV4dGVuc2lvbiBvZiB0aGUgZ2l2ZW4gdHlwZSBieSBpdHMgcHJpbnRhYmxlIG5hbWUuCisgIC8vIFNlZSBjb21tZW50cyBhYm92ZSBQcmludGFibGVOYW1lRm9yRXh0ZW5zaW9uKCkgZm9yIHRoZSBkZWZpbml0aW9uIG9mCisgIC8vICJwcmludGFibGUgbmFtZSIuICBUaGUgZXh0ZW5kZWUgbXVzdCBiZSBhIG1lbWJlciBvZiB0aGlzIERlc2NyaXB0b3JQb29sCisgIC8vIG9yIG9uZSBvZiBpdHMgdW5kZXJsYXlzLiAgUmV0dXJucyBudWxscHRyIGlmIHRoZXJlIGlzIG5vIGtub3duIG1lc3NhZ2UKKyAgLy8gZXh0ZW5zaW9uIHdpdGggdGhlIGdpdmVuIHByaW50YWJsZSBuYW1lLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeVByaW50YWJsZU5hbWUoCisgICAgICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwgQ29uc3RTdHJpbmdQYXJhbSBwcmludGFibGVfbmFtZSkgY29uc3Q7CisKKyAgLy8gRmluZHMgZXh0ZW5zaW9ucyBvZiBleHRlbmRlZS4gVGhlIGV4dGVuc2lvbnMgd2lsbCBiZSBhcHBlbmRlZCB0bworICAvLyBvdXQgaW4gYW4gdW5kZWZpbmVkIG9yZGVyLiBPbmx5IGV4dGVuc2lvbnMgZGVmaW5lZCBkaXJlY3RseSBpbgorICAvLyB0aGlzIERlc2NyaXB0b3JQb29sIG9yIG9uZSBvZiBpdHMgdW5kZXJsYXlzIGFyZSBndWFyYW50ZWVkIHRvIGJlCisgIC8vIGZvdW5kOiBleHRlbnNpb25zIGRlZmluZWQgaW4gdGhlIGZhbGxiYWNrIGRhdGFiYXNlIG1pZ2h0IG5vdCBiZSBmb3VuZAorICAvLyBkZXBlbmRpbmcgb24gdGhlIGRhdGFiYXNlIGltcGxlbWVudGF0aW9uLgorICB2b2lkIEZpbmRBbGxFeHRlbnNpb25zKGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXQpIGNvbnN0OworCisgIC8vIEJ1aWxkaW5nIGRlc2NyaXB0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gV2hlbiBjb252ZXJ0aW5nIGEgRmlsZURlc2NyaXB0b3JQcm90byB0byBhIEZpbGVEZXNjcmlwdG9yLCB2YXJpb3VzCisgIC8vIGVycm9ycyBtaWdodCBiZSBkZXRlY3RlZCBpbiB0aGUgaW5wdXQuICBUaGUgY2FsbGVyIG1heSBoYW5kbGUgdGhlc2UKKyAgLy8gcHJvZ3JhbW1hdGljYWxseSBieSBpbXBsZW1lbnRpbmcgYW4gRXJyb3JDb2xsZWN0b3IuCisgIGNsYXNzIFBST1RPQlVGX0VYUE9SVCBFcnJvckNvbGxlY3RvciB7CisgICBwdWJsaWM6CisgICAgaW5saW5lIEVycm9yQ29sbGVjdG9yKCkge30KKyAgICB2aXJ0dWFsIH5FcnJvckNvbGxlY3RvcigpOworCisgICAgLy8gVGhlc2UgY29uc3RhbnRzIHNwZWNpZnkgd2hhdCBleGFjdCBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3QgaXMgYnJva2VuLgorICAgIC8vIFRoaXMgaXMgdXNlZnVsIGUuZy4gZm9yIG1hcHBpbmcgdGhlIGVycm9yIGJhY2sgdG8gYW4gZXhhY3QgbG9jYXRpb24KKyAgICAvLyBpbiBhIC5wcm90byBmaWxlLgorICAgIGVudW0gRXJyb3JMb2NhdGlvbiB7CisgICAgICBOQU1FLCAgICAgICAgICAgLy8gdGhlIHN5bWJvbCBuYW1lLCBvciB0aGUgcGFja2FnZSBuYW1lIGZvciBmaWxlcworICAgICAgTlVNQkVSLCAgICAgICAgIC8vIGZpZWxkIG9yIGV4dGVuc2lvbiByYW5nZSBudW1iZXIKKyAgICAgIFRZUEUsICAgICAgICAgICAvLyBmaWVsZCB0eXBlCisgICAgICBFWFRFTkRFRSwgICAgICAgLy8gZmllbGQgZXh0ZW5kZWUKKyAgICAgIERFRkFVTFRfVkFMVUUsICAvLyBmaWVsZCBkZWZhdWx0IHZhbHVlCisgICAgICBJTlBVVF9UWVBFLCAgICAgLy8gbWV0aG9kIGlucHV0IHR5cGUKKyAgICAgIE9VVFBVVF9UWVBFLCAgICAvLyBtZXRob2Qgb3V0cHV0IHR5cGUKKyAgICAgIE9QVElPTl9OQU1FLCAgICAvLyBuYW1lIGluIGFzc2lnbm1lbnQKKyAgICAgIE9QVElPTl9WQUxVRSwgICAvLyB2YWx1ZSBpbiBvcHRpb24gYXNzaWdubWVudAorICAgICAgSU1QT1JULCAgICAgICAgIC8vIGltcG9ydCBlcnJvcgorICAgICAgT1RIRVIgICAgICAgICAgIC8vIHNvbWUgb3RoZXIgcHJvYmxlbQorICAgIH07CisKKyAgICAvLyBSZXBvcnRzIGFuIGVycm9yIGluIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvLiBVc2UgdGhpcyBmdW5jdGlvbiBpZiB0aGUKKyAgICAvLyBwcm9ibGVtIG9jY3VycmVkIHNob3VsZCBpbnRlcnJ1cHQgYnVpbGRpbmcgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8uCisgICAgdmlydHVhbCB2b2lkIEFkZEVycm9yKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsICAvLyBGaWxlIG5hbWUgaW4gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkLgorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZWxlbWVudF9uYW1lLCAgLy8gRnVsbCBuYW1lIG9mIHRoZSBlcnJvbmVvdXMgZWxlbWVudC4KKyAgICAgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwgIC8vIERlc2NyaXB0b3Igb2YgdGhlIGVycm9uZW91cyBlbGVtZW50LgorICAgICAgICBFcnJvckxvY2F0aW9uIGxvY2F0aW9uLCAgICAgLy8gT25lIG9mIHRoZSBsb2NhdGlvbiBjb25zdGFudHMsIGFib3ZlLgorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSAgLy8gSHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgKSA9IDA7CisKKyAgICAvLyBSZXBvcnRzIGEgd2FybmluZyBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90by4gVXNlIHRoaXMgZnVuY3Rpb24gaWYgdGhlCisgICAgLy8gcHJvYmxlbSBvY2N1cnJlZCBzaG91bGQgTk9UIGludGVycnVwdCBidWlsZGluZyB0aGUgRmlsZURlc2NyaXB0b3JQcm90by4KKyAgICB2aXJ0dWFsIHZvaWQgQWRkV2FybmluZygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIC8qZmlsZW5hbWUqLywgICAgICAvLyBGaWxlIG5hbWUgaW4gd2hpY2ggdGhlIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2NjdXJyZWQuCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmVsZW1lbnRfbmFtZSovLCAgLy8gRnVsbCBuYW1lIG9mIHRoZSBlcnJvbmVvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50LgorICAgICAgICBjb25zdCBNZXNzYWdlKiAvKmRlc2NyaXB0b3IqLywgIC8vIERlc2NyaXB0b3Igb2YgdGhlIGVycm9uZW91cyBlbGVtZW50LgorICAgICAgICBFcnJvckxvY2F0aW9uIC8qbG9jYXRpb24qLywgICAgIC8vIE9uZSBvZiB0aGUgbG9jYXRpb24gY29uc3RhbnRzLCBhYm92ZS4KKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIC8qbWVzc2FnZSovICAvLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorICAgICkge30KKworICAgcHJpdmF0ZToKKyAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRXJyb3JDb2xsZWN0b3IpOworICB9OworCisgIC8vIENvbnZlcnQgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gcmVhbCBkZXNjcmlwdG9ycyBhbmQgcGxhY2UgdGhlbSBpbgorICAvLyB0aGlzIERlc2NyaXB0b3JQb29sLiAgQWxsIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSBtdXN0IGFscmVhZHkgYmUgaW4KKyAgLy8gdGhlIHBvb2wuICBSZXR1cm5zIHRoZSByZXN1bHRpbmcgRmlsZURlc2NyaXB0b3IsIG9yIG51bGxwdHIgaWYgdGhlcmUgd2VyZQorICAvLyBwcm9ibGVtcyB3aXRoIHRoZSBpbnB1dCAoZS5nLiB0aGUgbWVzc2FnZSB3YXMgaW52YWxpZCwgb3IgZGVwZW5kZW5jaWVzCisgIC8vIHdlcmUgbWlzc2luZykuICBEZXRhaWxzIGFib3V0IHRoZSBlcnJvcnMgYXJlIHdyaXR0ZW4gdG8gR09PR0xFX0xPRyhFUlJPUikuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBCdWlsZEZpbGUoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8pOworCisgIC8vIFNhbWUgYXMgQnVpbGRGaWxlKCkgZXhjZXB0IGVycm9ycyBhcmUgc2VudCB0byB0aGUgZ2l2ZW4gRXJyb3JDb2xsZWN0b3IuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBCdWlsZEZpbGVDb2xsZWN0aW5nRXJyb3JzKAorICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sIEVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpOworCisgIC8vIEJ5IGRlZmF1bHQsIGl0IGlzIGFuIGVycm9yIGlmIGEgRmlsZURlc2NyaXB0b3JQcm90byBjb250YWlucyByZWZlcmVuY2VzCisgIC8vIHRvIHR5cGVzIG9yIG90aGVyIGZpbGVzIHRoYXQgYXJlIG5vdCBmb3VuZCBpbiB0aGUgRGVzY3JpcHRvclBvb2wgKG9yIGl0cworICAvLyBiYWNraW5nIERlc2NyaXB0b3JEYXRhYmFzZSwgaWYgYW55KS4gIElmIHlvdSBjYWxsCisgIC8vIEFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpLCBob3dldmVyLCB0aGVuIHVua25vd24gdHlwZXMgYW5kIGZpbGVzCisgIC8vIHdpbGwgYmUgcmVwbGFjZWQgYnkgcGxhY2Vob2xkZXIgZGVzY3JpcHRvcnMgKHdoaWNoIGNhbiBiZSBpZGVudGlmaWVkIGJ5CisgIC8vIHRoZSBpc19wbGFjZWhvbGRlcigpIG1ldGhvZCkuICBUaGlzIGNhbiBhbGxvdyB5b3UgdG8KKyAgLy8gcGVyZm9ybSBzb21lIHVzZWZ1bCBvcGVyYXRpb25zIHdpdGggYSAucHJvdG8gZmlsZSBldmVuIGlmIHlvdSBkbyBub3QKKyAgLy8gaGF2ZSBhY2Nlc3MgdG8gb3RoZXIgLnByb3RvIGZpbGVzIG9uIHdoaWNoIGl0IGRlcGVuZHMuICBIb3dldmVyLCBzb21lCisgIC8vIGhldXJpc3RpY3MgbXVzdCBiZSB1c2VkIHRvIGZpbGwgaW4gdGhlIGdhcHMgaW4gaW5mb3JtYXRpb24sIGFuZCB0aGVzZQorICAvLyBjYW4gbGVhZCB0byBkZXNjcmlwdG9ycyB3aGljaCBhcmUgaW5hY2N1cmF0ZS4gIEZvciBleGFtcGxlLCB0aGUKKyAgLy8gRGVzY3JpcHRvclBvb2wgbWF5IGJlIGZvcmNlZCB0byBndWVzcyB3aGV0aGVyIGFuIHVua25vd24gdHlwZSBpcyBhIG1lc3NhZ2UKKyAgLy8gb3IgYW4gZW51bSwgYXMgd2VsbCBhcyB3aGF0IHBhY2thZ2UgaXQgcmVzaWRlcyBpbi4gIEZ1cnRoZXJtb3JlLAorICAvLyBwbGFjZWhvbGRlciB0eXBlcyB3aWxsIG5vdCBiZSBkaXNjb3ZlcmFibGUgdmlhIEZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgpCisgIC8vIGFuZCBzaW1pbGFyIG1ldGhvZHMsIHdoaWNoIGNvdWxkIGNvbmZ1c2Ugc29tZSBkZXNjcmlwdG9yLWJhc2VkIGFsZ29yaXRobXMuCisgIC8vIEdlbmVyYWxseSwgdGhlIHJlc3VsdHMgb2YgdGhpcyBvcHRpb24gc2hvdWxkIGJlIGhhbmRsZWQgd2l0aCBleHRyZW1lIGNhcmUuCisgIHZvaWQgQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgeyBhbGxvd191bmtub3duXyA9IHRydWU7IH0KKworICAvLyBCeSBkZWZhdWx0LCB3ZWFrIGltcG9ydHMgYXJlIGFsbG93ZWQgdG8gYmUgbWlzc2luZywgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsCisgIC8vIHVzZSBhIHBsYWNlaG9sZGVyIGZvciB0aGUgZGVwZW5kZW5jeSBhbmQgY29udmVydCB0aGUgZmllbGQgdG8gYmUgYW4gRW1wdHkKKyAgLy8gbWVzc2FnZSBmaWVsZC4gSWYgeW91IGNhbGwgRW5mb3JjZVdlYWtEZXBlbmRlbmNpZXModHJ1ZSksIGhvd2V2ZXIsIHRoZQorICAvLyBEZXNjcmlwdG9yUG9vbCB3aWxsIHJlcG9ydCBhIGltcG9ydCBub3QgZm91bmQgZXJyb3IuCisgIHZvaWQgRW5mb3JjZVdlYWtEZXBlbmRlbmNpZXMoYm9vbCBlbmZvcmNlKSB7IGVuZm9yY2Vfd2Vha18gPSBlbmZvcmNlOyB9CisKKyAgLy8gSW50ZXJuYWwgc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlc2UgbWV0aG9kcyBNVVNUIE5PVCBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIHRoZSBwcm90bzIgbGlicmFyeS4KKyAgLy8gVGhlc2UgbWV0aG9kcyBtYXkgY29udGFpbiBoaWRkZW4gcGl0ZmFsbHMgYW5kIG1heSBiZSByZW1vdmVkIGluIGEKKyAgLy8gZnV0dXJlIGxpYnJhcnkgdmVyc2lvbi4KKworICAvLyBDcmVhdGUgYSBEZXNjcmlwdG9yUG9vbCB3aGljaCBpcyBvdmVybGFpZCBvbiB0b3Agb2Ygc29tZSBvdGhlciBwb29sLgorICAvLyBJZiB5b3Ugc2VhcmNoIGZvciBhIGRlc2NyaXB0b3IgaW4gdGhlIG92ZXJsYXkgYW5kIGl0IGlzIG5vdCBmb3VuZCwgdGhlCisgIC8vIHVuZGVybGF5IHdpbGwgYmUgc2VhcmNoZWQgYXMgYSBiYWNrdXAuICBJZiB0aGUgdW5kZXJsYXkgaGFzIGl0cyBvd24KKyAgLy8gdW5kZXJsYXksIHRoYXQgd2lsbCBiZSBzZWFyY2hlZCBuZXh0LCBhbmQgc28gb24uICBUaGlzIGFsc28gbWVhbnMgdGhhdAorICAvLyBmaWxlcyBidWlsdCBpbiB0aGUgb3ZlcmxheSB3aWxsIGJlIGNyb3NzLWxpbmtlZCB3aXRoIHRoZSB1bmRlcmxheSdzCisgIC8vIGRlc2NyaXB0b3JzIGlmIG5lY2Vzc2FyeS4gIFRoZSB1bmRlcmxheSByZW1haW5zIHByb3BlcnR5IG9mIHRoZSBjYWxsZXI7CisgIC8vIGl0IG11c3QgcmVtYWluIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIG5ld2x5LWNvbnN0cnVjdGVkIHBvb2wuCisgIC8vCisgIC8vIEV4YW1wbGU6ICBTYXkgeW91IHdhbnQgdG8gcGFyc2UgYSAucHJvdG8gZmlsZSBhdCBydW50aW1lIGluIG9yZGVyIHRvIHVzZQorICAvLyBpdHMgdHlwZSB3aXRoIGEgRHluYW1pY01lc3NhZ2UuICBTYXkgdGhpcyAucHJvdG8gZmlsZSBoYXMgZGVwZW5kZW5jaWVzLAorICAvLyBidXQgeW91IGtub3cgdGhhdCBhbGwgdGhlIGRlcGVuZGVuY2llcyB3aWxsIGJlIHRoaW5ncyB0aGF0IGFyZSBhbHJlYWR5CisgIC8vIGNvbXBpbGVkIGludG8gdGhlIGJpbmFyeS4gIEZvciBlYXNlIG9mIHVzZSwgeW91J2QgbGlrZSB0byBsb2FkIHRoZSB0eXBlcworICAvLyByaWdodCBvdXQgb2YgZ2VuZXJhdGVkX3Bvb2woKSByYXRoZXIgdGhhbiBoYXZlIHRvIHBhcnNlIHJlZHVuZGFudCBjb3BpZXMKKyAgLy8gb2YgYWxsIHRoZXNlIC5wcm90b3MgYW5kIHJ1bnRpbWUuICBCdXQsIHlvdSBkb24ndCB3YW50IHRvIGFkZCB0aGUgcGFyc2VkCisgIC8vIHR5cGVzIGRpcmVjdGx5IGludG8gZ2VuZXJhdGVkX3Bvb2woKTogdGhpcyBpcyBub3QgYWxsb3dlZCwgYW5kIHdvdWxkIGJlCisgIC8vIGJhZCBkZXNpZ24gYW55d2F5LiAgU28sIGluc3RlYWQsIHlvdSBjb3VsZCB1c2UgZ2VuZXJhdGVkX3Bvb2woKSBhcyBhbgorICAvLyB1bmRlcmxheSBmb3IgYSBuZXcgRGVzY3JpcHRvclBvb2wgaW4gd2hpY2ggeW91IGFkZCBvbmx5IHRoZSBuZXcgZmlsZS4KKyAgLy8KKyAgLy8gV0FSTklORzogIFVzZSBvZiB1bmRlcmxheXMgY2FuIGxlYWQgdG8gbWFueSBzdWJ0bGUgZ290Y2hhcy4gIEluc3RlYWQsCisgIC8vICAgdHJ5IHRvIGZvcm11bGF0ZSB3aGF0IHlvdSB3YW50IHRvIGRvIGluIHRlcm1zIG9mIERlc2NyaXB0b3JEYXRhYmFzZXMuCisgIGV4cGxpY2l0IERlc2NyaXB0b3JQb29sKGNvbnN0IERlc2NyaXB0b3JQb29sKiB1bmRlcmxheSk7CisKKyAgLy8gQ2FsbGVkIGJ5IGdlbmVyYXRlZCBjbGFzc2VzIGF0IGluaXQgdGltZSB0byBhZGQgdGhlaXIgZGVzY3JpcHRvcnMgdG8KKyAgLy8gZ2VuZXJhdGVkX3Bvb2wuICBEbyBOT1QgY2FsbCB0aGlzIGluIHlvdXIgb3duIGNvZGUhICBmaWxlbmFtZSBtdXN0IGJlIGEKKyAgLy8gcGVybWFuZW50IHN0cmluZyAoZS5nLiBhIHN0cmluZyBsaXRlcmFsKS4KKyAgc3RhdGljIHZvaWQgSW50ZXJuYWxBZGRHZW5lcmF0ZWRGaWxlKGNvbnN0IHZvaWQqIGVuY29kZWRfZmlsZV9kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpOworCisgIC8vIERpc2FsbG93IFtlbmZvcmNlX3V0ZjggPSBmYWxzZV0gaW4gLnByb3RvIGZpbGVzLgorICB2b2lkIERpc2FsbG93RW5mb3JjZVV0ZjgoKSB7IGRpc2FsbG93X2VuZm9yY2VfdXRmOF8gPSB0cnVlOyB9CisKKworICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHk6ICBHZXRzIGEgbm9uLWNvbnN0IHBvaW50ZXIgdG8gdGhlIGdlbmVyYXRlZCBwb29sLgorICAvLyBUaGlzIGlzIGNhbGxlZCBhdCBzdGF0aWMtaW5pdGlhbGl6YXRpb24gdGltZSBvbmx5LCBzbyB0aHJlYWQtc2FmZXR5IGlzCisgIC8vIG5vdCBhIGNvbmNlcm4uICBJZiBib3RoIGFuIHVuZGVybGF5IGFuZCBhIGZhbGxiYWNrIGRhdGFiYXNlIGFyZSBwcmVzZW50LAorICAvLyB0aGUgdW5kZXJsYXkgdGFrZXMgcHJlY2VkZW5jZS4KKyAgc3RhdGljIERlc2NyaXB0b3JQb29sKiBpbnRlcm5hbF9nZW5lcmF0ZWRfcG9vbCgpOworCisgIC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seTogIEdldHMgYSBub24tY29uc3QgcG9pbnRlciB0byB0aGUgZ2VuZXJhdGVkCisgIC8vIGRlc2NyaXB0b3IgZGF0YWJhc2UuCisgIC8vIE9ubHkgdXNlZCBmb3IgdGVzdGluZy4KKyAgc3RhdGljIERlc2NyaXB0b3JEYXRhYmFzZSogaW50ZXJuYWxfZ2VuZXJhdGVkX2RhdGFiYXNlKCk7CisKKyAgLy8gRm9yIGludGVybmFsIHVzZSBvbmx5OiAgQ2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YgQnVpbGRGaWxlKCkgc3VjaCB0aGF0IGl0CisgIC8vIGFsbG93cyB0aGUgZmlsZSB0byBtYWtlIHJlZmVyZW5jZSB0byBtZXNzYWdlIHR5cGVzIGRlY2xhcmVkIGluIG90aGVyIGZpbGVzCisgIC8vIHdoaWNoIGl0IGRpZCBub3Qgb2ZmaWNpYWxseSBkZWNsYXJlIGFzIGRlcGVuZGVuY2llcy4KKyAgdm9pZCBJbnRlcm5hbERvbnRFbmZvcmNlRGVwZW5kZW5jaWVzKCk7CisKKyAgLy8gRm9yIGludGVybmFsIHVzZSBvbmx5OiBFbmFibGVzIGxhenkgYnVpbGRpbmcgb2YgZGVwZW5kZW5jaWVzIG9mIGEgZmlsZS4KKyAgLy8gRGVsYXkgdGhlIGJ1aWxkaW5nIG9mIGRlcGVuZGVuY2llcyBvZiBhIGZpbGUgZGVzY3JpcHRvciB1bnRpbCBhYnNvbHV0ZWx5CisgIC8vIG5lY2Vzc2FyeSwgbGlrZSB3aGVuIG1lc3NhZ2VfdHlwZSgpIGlzIGNhbGxlZCBvbiBhIGZpZWxkIHRoYXQgaXMgZGVmaW5lZAorICAvLyBpbiB0aGF0IGRlcGVuZGVuY3kncyBmaWxlLiBUaGlzIHdpbGwgY2F1c2UgZnVuY3Rpb25hbCBpc3N1ZXMgaWYgYSBwcm90bworICAvLyBvciBvbmUgb2YgaXRzIGRlcGVuZGVuY2llcyBoYXMgZXJyb3JzLiBTaG91bGQgb25seSBiZSBlbmFibGVkIGZvciB0aGUKKyAgLy8gZ2VuZXJhdGVkX3Bvb2xfIChiZWNhdXNlIG5vIGRlc2NyaXB0b3IgYnVpbGQgZXJyb3JzIGFyZSBndWFyYW50ZWVkIGJ5CisgIC8vIHRoZSBjb21waWxhdGlvbiBnZW5lcmF0aW9uIHByb2Nlc3MpLCB0ZXN0aW5nLCBvciBpZiBhIGxhY2sgb2YgZGVzY3JpcHRvcgorICAvLyBidWlsZCBlcnJvcnMgY2FuIGJlIGd1YXJhbnRlZWQgZm9yIGEgcG9vbC4KKyAgdm9pZCBJbnRlcm5hbFNldExhemlseUJ1aWxkRGVwZW5kZW5jaWVzKCkgeworICAgIGxhemlseV9idWlsZF9kZXBlbmRlbmNpZXNfID0gdHJ1ZTsKKyAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIHNldCB3aGVuIGxhemlseSBidWlsZGluZyBkZXBlbmRlbmNpZXMsIGFzIGl0IGJyZWFrcworICAgIC8vIGRlcGVuZGVuY3kgY2hlY2tpbmcuCisgICAgSW50ZXJuYWxEb250RW5mb3JjZURlcGVuZGVuY2llcygpOworICB9CisKKyAgLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgorICB2b2lkIGludGVybmFsX3NldF91bmRlcmxheShjb25zdCBEZXNjcmlwdG9yUG9vbCogdW5kZXJsYXkpIHsKKyAgICB1bmRlcmxheV8gPSB1bmRlcmxheTsKKyAgfQorCisgIC8vIEZvciBpbnRlcm5hbCAodW5pdCB0ZXN0KSB1c2Ugb25seTogIFJldHVybnMgdHJ1ZSBpZiBhIEZpbGVEZXNjcmlwdG9yIGhhcworICAvLyBiZWVuIGNvbnN0cnVjdGVkIGZvciB0aGUgZ2l2ZW4gZmlsZSwgZmFsc2Ugb3RoZXJ3aXNlLiAgVXNlZnVsIGZvciB0ZXN0aW5nCisgIC8vIGxhenkgZGVzY3JpcHRvciBpbml0aWFsaXphdGlvbiBiZWhhdmlvci4KKyAgYm9vbCBJbnRlcm5hbElzRmlsZUxvYWRlZChDb25zdFN0cmluZ1BhcmFtIGZpbGVuYW1lKSBjb25zdDsKKworICAvLyBBZGQgYSBmaWxlIHRvIHVudXNlZF9pbXBvcnRfdHJhY2tfZmlsZXNfLiBEZXNjcmlwdG9yQnVpbGRlciB3aWxsIGxvZworICAvLyB3YXJuaW5ncyBvciBlcnJvcnMgZm9yIHRob3NlIGZpbGVzIGlmIHRoZXJlIGlzIGFueSB1bnVzZWQgaW1wb3J0LgorICB2b2lkIEFkZFVudXNlZEltcG9ydFRyYWNrRmlsZShDb25zdFN0cmluZ1BhcmFtIGZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19lcnJvciA9IGZhbHNlKTsKKyAgdm9pZCBDbGVhclVudXNlZEltcG9ydFRyYWNrRmlsZXMoKTsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkxhenlEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRmllbGREZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRW51bURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsKKyAgZnJpZW5kIGNsYXNzIE1ldGhvZERlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBGaWxlRGVzY3JpcHRvcjsKKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOworICBmcmllbmQgY2xhc3MgRmlsZURlc2NyaXB0b3JUYWJsZXM7CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG5hbWUgaXMgYSBzdWItc3ltYm9sIG9mIGFueSBub24tcGFja2FnZQorICAvLyBkZXNjcmlwdG9yIHRoYXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGRlc2NyaXB0b3IgcG9vbC4gIChUaGUgZnVsbAorICAvLyBkZWZpbml0aW9uIG9mIHN1Y2ggdHlwZXMgaXMgYWxyZWFkeSBrbm93bi4pCisgIGJvb2wgSXNTdWJTeW1ib2xPZkJ1aWx0VHlwZShTdHJpbmdQaWVjZSBuYW1lKSBjb25zdDsKKworICAvLyBUcmllcyB0byBmaW5kIHNvbWV0aGluZyBpbiB0aGUgZmFsbGJhY2sgZGF0YWJhc2UgYW5kIGxpbmsgaW4gdGhlCisgIC8vIGNvcnJlc3BvbmRpbmcgcHJvdG8gZmlsZS4gIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCBpbiB3aGljaCBjYXNlCisgIC8vIHRoZSBjYWxsZXIgc2hvdWxkIHNlYXJjaCBmb3IgdGhlIHRoaW5nIGFnYWluLiAgVGhlc2UgYXJlIGRlY2xhcmVkCisgIC8vIGNvbnN0IGJlY2F1c2UgdGhleSBhcmUgY2FsbGVkIGJ5IChzZW1hbnRpY2FsbHkpIGNvbnN0IG1ldGhvZHMuCisgIGJvb2wgVHJ5RmluZEZpbGVJbkZhbGxiYWNrRGF0YWJhc2UoU3RyaW5nUGllY2UgbmFtZSkgY29uc3Q7CisgIGJvb2wgVHJ5RmluZFN5bWJvbEluRmFsbGJhY2tEYXRhYmFzZShTdHJpbmdQaWVjZSBuYW1lKSBjb25zdDsKKyAgYm9vbCBUcnlGaW5kRXh0ZW5zaW9uSW5GYWxsYmFja0RhdGFiYXNlKGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIpIGNvbnN0OworCisgIC8vIFRoaXMgaW50ZXJuYWwgZmluZCBleHRlbnNpb24gbWV0aG9kIG9ubHkgY2hlY2sgd2l0aCBpdHMgdGFibGUgYW5kIHVuZGVybGF5CisgIC8vIGRlc2NyaXB0b3JfcG9vbCdzIHRhYmxlLiBJdCBkb2VzIG5vdCBjaGVjayB3aXRoIGZhbGxiYWNrIERCIGFuZCBubworICAvLyBhZGRpdGlvbmFsIHByb3RvIGZpbGUgd2lsbCBiZSBidWlsZCBpbiB0aGlzIG1ldGhvZC4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBJbnRlcm5hbEZpbmRFeHRlbnNpb25CeU51bWJlck5vTG9jaygKKyAgICAgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLCBpbnQgbnVtYmVyKSBjb25zdDsKKworICAvLyBMaWtlIEJ1aWxkRmlsZSgpIGJ1dCBjYWxsZWQgaW50ZXJuYWxseSB3aGVuIHRoZSBmaWxlIGhhcyBiZWVuIGxvYWRlZCBmcm9tCisgIC8vIGZhbGxiYWNrX2RhdGFiYXNlXy4gIERlY2xhcmVkIGNvbnN0IGJlY2F1c2UgaXQgaXMgY2FsbGVkIGJ5IChzZW1hbnRpY2FsbHkpCisgIC8vIGNvbnN0IG1ldGhvZHMuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBCdWlsZEZpbGVGcm9tRGF0YWJhc2UoCisgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgY29uc3Q7CisKKyAgLy8gSGVscGVyIGZvciB3aGVuIGxhemlseV9idWlsZF9kZXBlbmRlbmNpZXNfIGlzIHNldCwgY2FuIGxvb2sgdXAgYSBzeW1ib2wKKyAgLy8gYWZ0ZXIgdGhlIGZpbGUncyBkZXNjcmlwdG9yIGlzIGJ1aWx0LCBhbmQgY2FuIGJ1aWxkIHRoZSBmaWxlIHdoZXJlIHRoYXQKKyAgLy8gc3ltYm9sIGlzIGRlZmluZWQgaWYgbmVjZXNzYXJ5LiBXaWxsIGNyZWF0ZSBhIHBsYWNlaG9sZGVyIGlmIHRoZSB0eXBlCisgIC8vIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGZhbGxiYWNrIGRhdGFiYXNlLCBvciB0aGUgZmlsZSBkb2Vzbid0IGJ1aWxkCisgIC8vIHN1Y2Nlc3NmdWxseS4KKyAgU3ltYm9sIENyb3NzTGlua09uRGVtYW5kSGVscGVyKFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4cGVjdGluZ19lbnVtKSBjb25zdDsKKworICAvLyBDcmVhdGUgYSBwbGFjZWhvbGRlciBGaWxlRGVzY3JpcHRvciBvZiB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgRmlsZURlc2NyaXB0b3IqIE5ld1BsYWNlaG9sZGVyRmlsZShTdHJpbmdQaWVjZSBuYW1lKSBjb25zdDsKKyAgRmlsZURlc2NyaXB0b3IqIE5ld1BsYWNlaG9sZGVyRmlsZVdpdGhNdXRleEhlbGQoCisgICAgICBTdHJpbmdQaWVjZSBuYW1lLCBpbnRlcm5hbDo6RmxhdEFsbG9jYXRvciYgYWxsb2MpIGNvbnN0OworCisgIGVudW0gUGxhY2Vob2xkZXJUeXBlIHsKKyAgICBQTEFDRUhPTERFUl9NRVNTQUdFLAorICAgIFBMQUNFSE9MREVSX0VOVU0sCisgICAgUExBQ0VIT0xERVJfRVhURU5EQUJMRV9NRVNTQUdFCisgIH07CisgIC8vIENyZWF0ZSBhIHBsYWNlaG9sZGVyIERlc2NyaXB0b3Igb2YgdGhlIHNwZWNpZmllZCBuYW1lCisgIFN5bWJvbCBOZXdQbGFjZWhvbGRlcihTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgUGxhY2Vob2xkZXJUeXBlIHBsYWNlaG9sZGVyX3R5cGUpIGNvbnN0OworICBTeW1ib2wgTmV3UGxhY2Vob2xkZXJXaXRoTXV0ZXhIZWxkKFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhY2Vob2xkZXJUeXBlIHBsYWNlaG9sZGVyX3R5cGUpIGNvbnN0OworCisgIC8vIElmIGZhbGxiYWNrX2RhdGFiYXNlXyBpcyBudWxscHRyLCB0aGlzIGlzIG51bGxwdHIuICBPdGhlcndpc2UsIHRoaXMgaXMgYQorICAvLyBtdXRleCB3aGljaCBtdXN0IGJlIGxvY2tlZCB3aGlsZSBhY2Nlc3NpbmcgdGFibGVzXy4KKyAgaW50ZXJuYWw6OldyYXBwZWRNdXRleCogbXV0ZXhfOworCisgIC8vIFNlZSBjb25zdHJ1Y3Rvci4KKyAgRGVzY3JpcHRvckRhdGFiYXNlKiBmYWxsYmFja19kYXRhYmFzZV87CisgIEVycm9yQ29sbGVjdG9yKiBkZWZhdWx0X2Vycm9yX2NvbGxlY3Rvcl87CisgIGNvbnN0IERlc2NyaXB0b3JQb29sKiB1bmRlcmxheV87CisKKyAgLy8gVGhpcyBjbGFzcyBjb250YWlucyBhIGxvdCBvZiBoYXNoIG1hcHMgd2l0aCBjb21wbGljYXRlZCB0eXBlcyB0aGF0CisgIC8vIHdlJ2QgbGlrZSB0byBrZWVwIG91dCBvZiB0aGUgaGVhZGVyLgorICBjbGFzcyBUYWJsZXM7CisgIHN0ZDo6dW5pcXVlX3B0cjxUYWJsZXM+IHRhYmxlc187CisKKyAgYm9vbCBlbmZvcmNlX2RlcGVuZGVuY2llc187CisgIGJvb2wgbGF6aWx5X2J1aWxkX2RlcGVuZGVuY2llc187CisgIGJvb2wgYWxsb3dfdW5rbm93bl87CisgIGJvb2wgZW5mb3JjZV93ZWFrXzsKKyAgYm9vbCBkaXNhbGxvd19lbmZvcmNlX3V0ZjhfOworCisgIC8vIFNldCBvZiBmaWxlcyB0byB0cmFjayBmb3IgdW51c2VkIGltcG9ydHMuIFRoZSBib29sIHZhbHVlIHdoZW4gdHJ1ZSBtZWFucworICAvLyB1bnVzZWQgaW1wb3J0cyBhcmUgdHJlYXRlZCBhcyBlcnJvcnMgKGFuZCBhcyB3YXJuaW5ncyB3aGVuIGZhbHNlKS4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGJvb2w+IHVudXNlZF9pbXBvcnRfdHJhY2tfZmlsZXNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZXNjcmlwdG9yUG9vbCk7Cit9OworCisKKy8vIGlubGluZSBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVGhlc2UgbWFjcm9zIG1ha2VzIHRoaXMgcmVwZXRpdGl2ZSBjb2RlIG1vcmUgcmVhZGFibGUuCisjZGVmaW5lIFBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihDTEFTUywgRklFTEQsIFRZUEUpIFwKKyAgaW5saW5lIFRZUEUgQ0xBU1M6OkZJRUxEKCkgY29uc3QgeyByZXR1cm4gRklFTEQjI187IH0KKworLy8gU3RyaW5ncyBmaWVsZHMgYXJlIHN0b3JlZCBhcyBwb2ludGVycyBidXQgcmV0dXJuZWQgYXMgY29uc3QgcmVmZXJlbmNlcy4KKyNkZWZpbmUgUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihDTEFTUywgRklFTEQpIFwKKyAgaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBDTEFTUzo6RklFTEQoKSBjb25zdCB7IHJldHVybiAqRklFTEQjI187IH0KKworLy8gTmFtZSBhbmQgZnVsbCBuYW1lIGFyZSBzdG9yZWQgaW4gYSBzaW5nbGUgYXJyYXkgdG8gc2F2ZSBzcGFjZS4KKyNkZWZpbmUgUFJPVE9CVUZfREVGSU5FX05BTUVfQUNDRVNTT1IoQ0xBU1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIENMQVNTOjpuYW1lKCkgY29uc3QgeyByZXR1cm4gYWxsX25hbWVzX1swXTsgfSBcCisgIGlubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgQ0xBU1M6OmZ1bGxfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGFsbF9uYW1lc19bMV07IH0KKworLy8gQXJyYXlzIHRha2UgYW4gaW5kZXggcGFyYW1ldGVyLCBvYnZpb3VzbHkuCisjZGVmaW5lIFBST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihDTEFTUywgRklFTEQsIFRZUEUpIFwKKyAgaW5saW5lIFRZUEUgQ0xBU1M6OkZJRUxEKGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gRklFTEQjI3NfICsgaW5kZXg7IH0KKworI2RlZmluZSBQUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihDTEFTUywgVFlQRSkgXAorICBpbmxpbmUgY29uc3QgVFlQRSYgQ0xBU1M6Om9wdGlvbnMoKSBjb25zdCB7IHJldHVybiAqb3B0aW9uc187IH0KKworUFJPVE9CVUZfREVGSU5FX05BTUVfQUNDRVNTT1IoRGVzY3JpcHRvcikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBmaWxlLCBjb25zdCBGaWxlRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgY29udGFpbmluZ190eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKKworUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIGZpZWxkX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgb25lb2ZfZGVjbF9jb3VudCwgaW50KQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIHJlYWxfb25lb2ZfZGVjbF9jb3VudCwgaW50KQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIG5lc3RlZF90eXBlX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgZW51bV90eXBlX2NvdW50LCBpbnQpCisKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBmaWVsZCwgY29uc3QgRmllbGREZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBvbmVvZl9kZWNsLCBjb25zdCBPbmVvZkRlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKERlc2NyaXB0b3IsIG5lc3RlZF90eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBlbnVtX3R5cGUsIGNvbnN0IEVudW1EZXNjcmlwdG9yKikKKworUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIGV4dGVuc2lvbl9yYW5nZV9jb3VudCwgaW50KQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIGV4dGVuc2lvbl9jb3VudCwgaW50KQorUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKERlc2NyaXB0b3IsIGV4dGVuc2lvbl9yYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSopCitQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRGVzY3JpcHRvciwgZXh0ZW5zaW9uLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqKQorCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgcmVzZXJ2ZWRfcmFuZ2VfY291bnQsIGludCkKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihEZXNjcmlwdG9yLCByZXNlcnZlZF9yYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yOjpSZXNlcnZlZFJhbmdlKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihEZXNjcmlwdG9yLCByZXNlcnZlZF9uYW1lX2NvdW50LCBpbnQpCisKK1BST1RPQlVGX0RFRklORV9PUFRJT05TX0FDQ0VTU09SKERlc2NyaXB0b3IsIE1lc3NhZ2VPcHRpb25zKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIGlzX3BsYWNlaG9sZGVyLCBib29sKQorCitQUk9UT0JVRl9ERUZJTkVfTkFNRV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBmaWxlLCBjb25zdCBGaWxlRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBudW1iZXIsIGludCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGlzX2V4dGVuc2lvbiwgYm9vbCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGNvbnRhaW5pbmdfdHlwZSwgY29uc3QgRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIEZpZWxkT3B0aW9ucykKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGhhc19kZWZhdWx0X3ZhbHVlLCBib29sKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgaGFzX2pzb25fbmFtZSwgYm9vbCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGRlZmF1bHRfdmFsdWVfaW50MzJfdCwgaW50MzJfdCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGRlZmF1bHRfdmFsdWVfaW50NjRfdCwgaW50NjRfdCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGRlZmF1bHRfdmFsdWVfdWludDMyX3QsIHVpbnQzMl90KQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZGVmYXVsdF92YWx1ZV91aW50NjRfdCwgdWludDY0X3QpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBkZWZhdWx0X3ZhbHVlX2Zsb2F0LCBmbG9hdCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGRlZmF1bHRfdmFsdWVfZG91YmxlLCBkb3VibGUpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBkZWZhdWx0X3ZhbHVlX2Jvb2wsIGJvb2wpCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZGVmYXVsdF92YWx1ZV9zdHJpbmcpCisKK1BST1RPQlVGX0RFRklORV9OQU1FX0FDQ0VTU09SKE9uZW9mRGVzY3JpcHRvcikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihPbmVvZkRlc2NyaXB0b3IsIGNvbnRhaW5pbmdfdHlwZSwgY29uc3QgRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoT25lb2ZEZXNjcmlwdG9yLCBmaWVsZF9jb3VudCwgaW50KQorUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKE9uZW9mRGVzY3JpcHRvciwgZmllbGQsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihPbmVvZkRlc2NyaXB0b3IsIE9uZW9mT3B0aW9ucykKKworUFJPVE9CVUZfREVGSU5FX05BTUVfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IsIGZpbGUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgY29udGFpbmluZ190eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgdmFsdWVfY291bnQsIGludCkKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgRW51bU9wdGlvbnMpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IsIGlzX3BsYWNlaG9sZGVyLCBib29sKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEVudW1EZXNjcmlwdG9yLCByZXNlcnZlZF9yYW5nZV9jb3VudCwgaW50KQorUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKEVudW1EZXNjcmlwdG9yLCByZXNlcnZlZF9yYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvcjo6UmVzZXJ2ZWRSYW5nZSopCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IsIHJlc2VydmVkX25hbWVfY291bnQsIGludCkKKworUFJPVE9CVUZfREVGSU5FX05BTUVfQUNDRVNTT1IoRW51bVZhbHVlRGVzY3JpcHRvcikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihFbnVtVmFsdWVEZXNjcmlwdG9yLCBudW1iZXIsIGludCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihFbnVtVmFsdWVEZXNjcmlwdG9yLCB0eXBlLCBjb25zdCBFbnVtRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihFbnVtVmFsdWVEZXNjcmlwdG9yLCBFbnVtVmFsdWVPcHRpb25zKQorCitQUk9UT0JVRl9ERUZJTkVfTkFNRV9BQ0NFU1NPUihTZXJ2aWNlRGVzY3JpcHRvcikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihTZXJ2aWNlRGVzY3JpcHRvciwgZmlsZSwgY29uc3QgRmlsZURlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKFNlcnZpY2VEZXNjcmlwdG9yLCBtZXRob2RfY291bnQsIGludCkKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihTZXJ2aWNlRGVzY3JpcHRvciwgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX09QVElPTlNfQUNDRVNTT1IoU2VydmljZURlc2NyaXB0b3IsIFNlcnZpY2VPcHRpb25zKQorCitQUk9UT0JVRl9ERUZJTkVfTkFNRV9BQ0NFU1NPUihNZXRob2REZXNjcmlwdG9yKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKE1ldGhvZERlc2NyaXB0b3IsIHNlcnZpY2UsIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9PUFRJT05TX0FDQ0VTU09SKE1ldGhvZERlc2NyaXB0b3IsIE1ldGhvZE9wdGlvbnMpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoTWV0aG9kRGVzY3JpcHRvciwgY2xpZW50X3N0cmVhbWluZywgYm9vbCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihNZXRob2REZXNjcmlwdG9yLCBzZXJ2ZXJfc3RyZWFtaW5nLCBib29sKQorCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBuYW1lKQorUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgcGFja2FnZSkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgcG9vbCwgY29uc3QgRGVzY3JpcHRvclBvb2wqKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBkZXBlbmRlbmN5X2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIHB1YmxpY19kZXBlbmRlbmN5X2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIHdlYWtfZGVwZW5kZW5jeV9jb3VudCwgaW50KQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBtZXNzYWdlX3R5cGVfY291bnQsIGludCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgZW51bV90eXBlX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIHNlcnZpY2VfY291bnQsIGludCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgZXh0ZW5zaW9uX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgRmlsZU9wdGlvbnMpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIGlzX3BsYWNlaG9sZGVyLCBib29sKQorCitQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIG1lc3NhZ2VfdHlwZSwgY29uc3QgRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIGVudW1fdHlwZSwgY29uc3QgRW51bURlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciopCisKKyN1bmRlZiBQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IKKyN1bmRlZiBQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SCisjdW5kZWYgUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SCisKKy8vIEEgZmV3IGFjY2Vzc29ycyBkaWZmZXIgZnJvbSB0aGUgbWFjcm9zLi4uCisKK2lubGluZSBEZXNjcmlwdG9yOjpXZWxsS25vd25UeXBlIERlc2NyaXB0b3I6OndlbGxfa25vd25fdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PERlc2NyaXB0b3I6OldlbGxLbm93blR5cGU+KHdlbGxfa25vd25fdHlwZV8pOworfQorCitpbmxpbmUgYm9vbCBEZXNjcmlwdG9yOjpJc0V4dGVuc2lvbk51bWJlcihpbnQgbnVtYmVyKSBjb25zdCB7CisgIHJldHVybiBGaW5kRXh0ZW5zaW9uUmFuZ2VDb250YWluaW5nTnVtYmVyKG51bWJlcikgIT0gbnVsbHB0cjsKK30KKworaW5saW5lIGJvb2wgRGVzY3JpcHRvcjo6SXNSZXNlcnZlZE51bWJlcihpbnQgbnVtYmVyKSBjb25zdCB7CisgIHJldHVybiBGaW5kUmVzZXJ2ZWRSYW5nZUNvbnRhaW5pbmdOdW1iZXIobnVtYmVyKSAhPSBudWxscHRyOworfQorCitpbmxpbmUgYm9vbCBEZXNjcmlwdG9yOjpJc1Jlc2VydmVkTmFtZShDb25zdFN0cmluZ1BhcmFtIG5hbWUpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNlcnZlZF9uYW1lX2NvdW50KCk7IGkrKykgeworICAgIGlmIChuYW1lID09IHN0YXRpY19jYXN0PENvbnN0U3RyaW5nUGFyYW0+KHJlc2VydmVkX25hbWUoaSkpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBDYW4ndCB1c2UgUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SIGJlY2F1c2UgcmVzZXJ2ZWRfbmFtZXNfIGlzIGFjdHVhbGx5CisvLyBhbiBhcnJheSBvZiBwb2ludGVycyByYXRoZXIgdGhhbiB0aGUgdXN1YWwgYXJyYXkgb2Ygb2JqZWN0cy4KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRGVzY3JpcHRvcjo6cmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuICpyZXNlcnZlZF9uYW1lc19baW5kZXhdOworfQorCitpbmxpbmUgYm9vbCBFbnVtRGVzY3JpcHRvcjo6SXNSZXNlcnZlZE51bWJlcihpbnQgbnVtYmVyKSBjb25zdCB7CisgIHJldHVybiBGaW5kUmVzZXJ2ZWRSYW5nZUNvbnRhaW5pbmdOdW1iZXIobnVtYmVyKSAhPSBudWxscHRyOworfQorCitpbmxpbmUgYm9vbCBFbnVtRGVzY3JpcHRvcjo6SXNSZXNlcnZlZE5hbWUoQ29uc3RTdHJpbmdQYXJhbSBuYW1lKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzZXJ2ZWRfbmFtZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAobmFtZSA9PSBzdGF0aWNfY2FzdDxDb25zdFN0cmluZ1BhcmFtPihyZXNlcnZlZF9uYW1lKGkpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gQ2FuJ3QgdXNlIFBST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUiBiZWNhdXNlIHJlc2VydmVkX25hbWVzXyBpcyBhY3R1YWxseQorLy8gYW4gYXJyYXkgb2YgcG9pbnRlcnMgcmF0aGVyIHRoYW4gdGhlIHVzdWFsIGFycmF5IG9mIG9iamVjdHMuCitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEVudW1EZXNjcmlwdG9yOjpyZXNlcnZlZF9uYW1lKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gKnJlc2VydmVkX25hbWVzX1tpbmRleF07Cit9CisKK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmllbGREZXNjcmlwdG9yOjpsb3dlcmNhc2VfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGFsbF9uYW1lc19bbG93ZXJjYXNlX25hbWVfaW5kZXhfXTsKK30KKworaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3I6OmNhbWVsY2FzZV9uYW1lKCkgY29uc3QgeworICByZXR1cm4gYWxsX25hbWVzX1tjYW1lbGNhc2VfbmFtZV9pbmRleF9dOworfQorCitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvcjo6anNvbl9uYW1lKCkgY29uc3QgeworICByZXR1cm4gYWxsX25hbWVzX1tqc29uX25hbWVfaW5kZXhfXTsKK30KKworaW5saW5lIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogRmllbGREZXNjcmlwdG9yOjpjb250YWluaW5nX29uZW9mKCkgY29uc3QgeworICByZXR1cm4gaXNfb25lb2ZfID8gc2NvcGVfLmNvbnRhaW5pbmdfb25lb2YgOiBudWxscHRyOworfQorCitpbmxpbmUgaW50IEZpZWxkRGVzY3JpcHRvcjo6aW5kZXhfaW5fb25lb2YoKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0soaXNfb25lb2ZfKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIHNjb3BlXy5jb250YWluaW5nX29uZW9mLT5maWVsZCgwKSk7Cit9CisKK2lubGluZSBjb25zdCBEZXNjcmlwdG9yKiBGaWVsZERlc2NyaXB0b3I6OmV4dGVuc2lvbl9zY29wZSgpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKGlzX2V4dGVuc2lvbl8pOworICByZXR1cm4gc2NvcGVfLmV4dGVuc2lvbl9zY29wZTsKK30KKworaW5saW5lIEZpZWxkRGVzY3JpcHRvcjo6TGFiZWwgRmllbGREZXNjcmlwdG9yOjpsYWJlbCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PExhYmVsPihsYWJlbF8pOworfQorCitpbmxpbmUgRmllbGREZXNjcmlwdG9yOjpUeXBlIEZpZWxkRGVzY3JpcHRvcjo6dHlwZSgpIGNvbnN0IHsKKyAgaWYgKHR5cGVfb25jZV8pIHsKKyAgICBpbnRlcm5hbDo6Y2FsbF9vbmNlKCp0eXBlX29uY2VfLCAmRmllbGREZXNjcmlwdG9yOjpUeXBlT25jZUluaXQsIHRoaXMpOworICB9CisgIHJldHVybiBzdGF0aWNfY2FzdDxUeXBlPih0eXBlXyk7Cit9CisKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvcjo6aXNfcmVxdWlyZWQoKSBjb25zdCB7CisgIHJldHVybiBsYWJlbCgpID09IExBQkVMX1JFUVVJUkVEOworfQorCitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3I6OmlzX29wdGlvbmFsKCkgY29uc3QgeworICByZXR1cm4gbGFiZWwoKSA9PSBMQUJFTF9PUFRJT05BTDsKK30KKworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yOjppc19yZXBlYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGxhYmVsKCkgPT0gTEFCRUxfUkVQRUFURUQ7Cit9CisKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvcjo6aXNfcGFja2FibGUoKSBjb25zdCB7CisgIHJldHVybiBpc19yZXBlYXRlZCgpICYmIElzVHlwZVBhY2thYmxlKHR5cGUoKSk7Cit9CisKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvcjo6aXNfbWFwKCkgY29uc3QgeworICByZXR1cm4gdHlwZSgpID09IFRZUEVfTUVTU0FHRSAmJiBpc19tYXBfbWVzc2FnZV90eXBlKCk7Cit9CisKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvcjo6aGFzX29wdGlvbmFsX2tleXdvcmQoKSBjb25zdCB7CisgIHJldHVybiBwcm90bzNfb3B0aW9uYWxfIHx8CisgICAgICAgICAoZmlsZSgpLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMiAmJiBpc19vcHRpb25hbCgpICYmCisgICAgICAgICAgIWNvbnRhaW5pbmdfb25lb2YoKSk7Cit9CisKK2lubGluZSBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvcjo6cmVhbF9jb250YWluaW5nX29uZW9mKCkgY29uc3QgeworICBhdXRvKiBvbmVvZiA9IGNvbnRhaW5pbmdfb25lb2YoKTsKKyAgcmV0dXJuIG9uZW9mICYmICFvbmVvZi0+aXNfc3ludGhldGljKCkgPyBvbmVvZiA6IG51bGxwdHI7Cit9CisKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvcjo6aGFzX3ByZXNlbmNlKCkgY29uc3QgeworICBpZiAoaXNfcmVwZWF0ZWQoKSkgcmV0dXJuIGZhbHNlOworICByZXR1cm4gY3BwX3R5cGUoKSA9PSBDUFBUWVBFX01FU1NBR0UgfHwgY29udGFpbmluZ19vbmVvZigpIHx8CisgICAgICAgICBmaWxlKCktPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8yOworfQorCisvLyBUbyBzYXZlIHNwYWNlLCBpbmRleCgpIGlzIGNvbXB1dGVkIGJ5IGxvb2tpbmcgYXQgdGhlIGRlc2NyaXB0b3IncyBwb3NpdGlvbgorLy8gaW4gdGhlIHBhcmVudCdzIGFycmF5IG9mIGNoaWxkcmVuLgoraW5saW5lIGludCBGaWVsZERlc2NyaXB0b3I6OmluZGV4KCkgY29uc3QgeworICBpZiAoIWlzX2V4dGVuc2lvbl8pIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0aGlzIC0gY29udGFpbmluZ190eXBlKCktPmZpZWxkc18pOworICB9IGVsc2UgaWYgKGV4dGVuc2lvbl9zY29wZSgpICE9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0aGlzIC0gZXh0ZW5zaW9uX3Njb3BlKCktPmV4dGVuc2lvbnNfKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0aGlzIC0gZmlsZV8tPmV4dGVuc2lvbnNfKTsKKyAgfQorfQorCitpbmxpbmUgaW50IERlc2NyaXB0b3I6OmluZGV4KCkgY29uc3QgeworICBpZiAoY29udGFpbmluZ190eXBlXyA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIGZpbGVfLT5tZXNzYWdlX3R5cGVzXyk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIGNvbnRhaW5pbmdfdHlwZV8tPm5lc3RlZF90eXBlc18pOworICB9Cit9CisKK2lubGluZSBjb25zdCBGaWxlRGVzY3JpcHRvciogT25lb2ZEZXNjcmlwdG9yOjpmaWxlKCkgY29uc3QgeworICByZXR1cm4gY29udGFpbmluZ190eXBlKCktPmZpbGUoKTsKK30KKworaW5saW5lIGludCBPbmVvZkRlc2NyaXB0b3I6OmluZGV4KCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0aGlzIC0gY29udGFpbmluZ190eXBlXy0+b25lb2ZfZGVjbHNfKTsKK30KKworaW5saW5lIGJvb2wgT25lb2ZEZXNjcmlwdG9yOjppc19zeW50aGV0aWMoKSBjb25zdCB7CisgIHJldHVybiBmaWVsZF9jb3VudCgpID09IDEgJiYgZmllbGQoMCktPnByb3RvM19vcHRpb25hbF87Cit9CisKK2lubGluZSBpbnQgRW51bURlc2NyaXB0b3I6OmluZGV4KCkgY29uc3QgeworICBpZiAoY29udGFpbmluZ190eXBlXyA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIGZpbGVfLT5lbnVtX3R5cGVzXyk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIGNvbnRhaW5pbmdfdHlwZV8tPmVudW1fdHlwZXNfKTsKKyAgfQorfQorCitpbmxpbmUgY29uc3QgRmlsZURlc2NyaXB0b3IqIEVudW1WYWx1ZURlc2NyaXB0b3I6OmZpbGUoKSBjb25zdCB7CisgIHJldHVybiB0eXBlKCktPmZpbGUoKTsKK30KKworaW5saW5lIGludCBFbnVtVmFsdWVEZXNjcmlwdG9yOjppbmRleCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIHR5cGVfLT52YWx1ZXNfKTsKK30KKworaW5saW5lIGludCBTZXJ2aWNlRGVzY3JpcHRvcjo6aW5kZXgoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMgLSBmaWxlXy0+c2VydmljZXNfKTsKK30KKworaW5saW5lIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBNZXRob2REZXNjcmlwdG9yOjpmaWxlKCkgY29uc3QgeworICByZXR1cm4gc2VydmljZSgpLT5maWxlKCk7Cit9CisKK2lubGluZSBpbnQgTWV0aG9kRGVzY3JpcHRvcjo6aW5kZXgoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMgLSBzZXJ2aWNlXy0+bWV0aG9kc18pOworfQorCitpbmxpbmUgY29uc3QgY2hhciogRmllbGREZXNjcmlwdG9yOjp0eXBlX25hbWUoKSBjb25zdCB7CisgIHJldHVybiBrVHlwZVRvTmFtZVt0eXBlKCldOworfQorCitpbmxpbmUgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIEZpZWxkRGVzY3JpcHRvcjo6Y3BwX3R5cGUoKSBjb25zdCB7CisgIHJldHVybiBrVHlwZVRvQ3BwVHlwZU1hcFt0eXBlKCldOworfQorCitpbmxpbmUgY29uc3QgY2hhciogRmllbGREZXNjcmlwdG9yOjpjcHBfdHlwZV9uYW1lKCkgY29uc3QgeworICByZXR1cm4ga0NwcFR5cGVUb05hbWVba1R5cGVUb0NwcFR5cGVNYXBbdHlwZSgpXV07Cit9CisKK2lubGluZSBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgRmllbGREZXNjcmlwdG9yOjpUeXBlVG9DcHBUeXBlKFR5cGUgdHlwZSkgeworICByZXR1cm4ga1R5cGVUb0NwcFR5cGVNYXBbdHlwZV07Cit9CisKK2lubGluZSBjb25zdCBjaGFyKiBGaWVsZERlc2NyaXB0b3I6OlR5cGVOYW1lKFR5cGUgdHlwZSkgeworICByZXR1cm4ga1R5cGVUb05hbWVbdHlwZV07Cit9CisKK2lubGluZSBjb25zdCBjaGFyKiBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGVOYW1lKENwcFR5cGUgY3BwX3R5cGUpIHsKKyAgcmV0dXJuIGtDcHBUeXBlVG9OYW1lW2NwcF90eXBlXTsKK30KKworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yOjpJc1R5cGVQYWNrYWJsZShUeXBlIGZpZWxkX3R5cGUpIHsKKyAgcmV0dXJuIChmaWVsZF90eXBlICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgJiYKKyAgICAgICAgICBmaWVsZF90eXBlICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCAmJgorICAgICAgICAgIGZpZWxkX3R5cGUgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgJiYKKyAgICAgICAgICBmaWVsZF90eXBlICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyk7Cit9CisKK2lubGluZSBjb25zdCBGaWxlRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3I6OnB1YmxpY19kZXBlbmRlbmN5KAorICAgIGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gZGVwZW5kZW5jeShwdWJsaWNfZGVwZW5kZW5jaWVzX1tpbmRleF0pOworfQorCitpbmxpbmUgY29uc3QgRmlsZURlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yOjp3ZWFrX2RlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBkZXBlbmRlbmN5KHdlYWtfZGVwZW5kZW5jaWVzX1tpbmRleF0pOworfQorCitpbmxpbmUgRmlsZURlc2NyaXB0b3I6OlN5bnRheCBGaWxlRGVzY3JpcHRvcjo6c3ludGF4KCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8U3ludGF4PihzeW50YXhfKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyN1bmRlZiBQUk9UT0JVRl9JTlRFUk5BTF9DSEVDS19DTEFTU19TSVpFCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYmZiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MKQEAgLTAsMCArMSwxMTM1MSBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCitQUk9UT0JVRl9QUkFHTUFfSU5JVF9TRUcKKworbmFtZXNwYWNlIF9wYiA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOworbmFtZXNwYWNlIF9wYmkgPSBfcGI6OmludGVybmFsOworCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorUFJPVE9CVUZfQ09OU1RFWFBSIEZpbGVEZXNjcmlwdG9yU2V0OjpGaWxlRGVzY3JpcHRvclNldCgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uZmlsZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX0ge30KK3N0cnVjdCBGaWxlRGVzY3JpcHRvclNldERlZmF1bHRUeXBlSW50ZXJuYWwgeworICBQUk9UT0JVRl9DT05TVEVYUFIgRmlsZURlc2NyaXB0b3JTZXREZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+RmlsZURlc2NyaXB0b3JTZXREZWZhdWx0VHlwZUludGVybmFsKCkge30KKyAgdW5pb24geworICAgIEZpbGVEZXNjcmlwdG9yU2V0IF9pbnN0YW5jZTsKKyAgfTsKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIEZpbGVEZXNjcmlwdG9yU2V0RGVmYXVsdFR5cGVJbnRlcm5hbCBfRmlsZURlc2NyaXB0b3JTZXRfZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9DT05TVEVYUFIgRmlsZURlc2NyaXB0b3JQcm90bzo6RmlsZURlc2NyaXB0b3JQcm90bygKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uZGVwZW5kZW5jeV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm1lc3NhZ2VfdHlwZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmVudW1fdHlwZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnNlcnZpY2VfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5leHRlbnNpb25fKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5wdWJsaWNfZGVwZW5kZW5jeV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLndlYWtfZGVwZW5kZW5jeV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm5hbWVfKSoveyY6Ol9wYmk6OmZpeGVkX2FkZHJlc3NfZW1wdHlfc3RyaW5nLCA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fX0KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5wYWNrYWdlXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uc3ludGF4XykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8ub3B0aW9uc18pKi9udWxscHRyCisgICwgLypkZWNsdHlwZShfaW1wbF8uc291cmNlX2NvZGVfaW5mb18pKi9udWxscHRyfSB7fQorc3RydWN0IEZpbGVEZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIEZpbGVEZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+RmlsZURlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBGaWxlRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbCBfRmlsZURlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8ub3B0aW9uc18pKi9udWxscHRyCisgICwgLypkZWNsdHlwZShfaW1wbF8uc3RhcnRfKSovMAorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmVuZF8pKi8wfSB7fQorc3RydWN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZURlZmF1bHRUeXBlSW50ZXJuYWwgeworICBQUk9UT0JVRl9DT05TVEVYUFIgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgfkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZURlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlIF9pbnN0YW5jZTsKKyAgfTsKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZURlZmF1bHRUeXBlSW50ZXJuYWwgX0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UoCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnN0YXJ0XykqLzAKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5lbmRfKSovMH0ge30KK3N0cnVjdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZURlZmF1bHRUeXBlSW50ZXJuYWwgeworICBQUk9UT0JVRl9DT05TVEVYUFIgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VEZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VEZWZhdWx0VHlwZUludGVybmFsKCkge30KKyAgdW5pb24geworICAgIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlIF9pbnN0YW5jZTsKKyAgfTsKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlRGVmYXVsdFR5cGVJbnRlcm5hbCBfRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9DT05TVEVYUFIgRGVzY3JpcHRvclByb3RvOjpEZXNjcmlwdG9yUHJvdG8oCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmZpZWxkXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8ubmVzdGVkX3R5cGVfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5lbnVtX3R5cGVfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5leHRlbnNpb25fcmFuZ2VfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5leHRlbnNpb25fKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5vbmVvZl9kZWNsXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8ucmVzZXJ2ZWRfcmFuZ2VfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5yZXNlcnZlZF9uYW1lXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8ubmFtZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKSovbnVsbHB0cn0ge30KK3N0cnVjdCBEZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIERlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5EZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsKCkge30KKyAgdW5pb24geworICAgIERlc2NyaXB0b3JQcm90byBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBEZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsIF9EZXNjcmlwdG9yUHJvdG9fZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9DT05TVEVYUFIgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjpFeHRlbnNpb25SYW5nZU9wdGlvbnMoCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLl9leHRlbnNpb25zXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319IHt9CitzdHJ1Y3QgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBFeHRlbnNpb25SYW5nZU9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+RXh0ZW5zaW9uUmFuZ2VPcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBFeHRlbnNpb25SYW5nZU9wdGlvbnMgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbCBfRXh0ZW5zaW9uUmFuZ2VPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIEZpZWxkRGVzY3JpcHRvclByb3RvOjpGaWVsZERlc2NyaXB0b3JQcm90bygKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8ubmFtZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmV4dGVuZGVlXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8udHlwZV9uYW1lXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uZGVmYXVsdF92YWx1ZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmpzb25fbmFtZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKSovbnVsbHB0cgorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm51bWJlcl8pKi8wCisgICwgLypkZWNsdHlwZShfaW1wbF8ub25lb2ZfaW5kZXhfKSovMAorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnByb3RvM19vcHRpb25hbF8pKi9mYWxzZQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmxhYmVsXykqLzEKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy50eXBlXykqLzF9IHt9CitzdHJ1Y3QgRmllbGREZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIEZpZWxkRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgfkZpZWxkRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBGaWVsZERlc2NyaXB0b3JQcm90byBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBGaWVsZERlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWwgX0ZpZWxkRGVzY3JpcHRvclByb3RvX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIE9uZW9mRGVzY3JpcHRvclByb3RvOjpPbmVvZkRlc2NyaXB0b3JQcm90bygKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8ubmFtZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKSovbnVsbHB0cn0ge30KK3N0cnVjdCBPbmVvZkRlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWwgeworICBQUk9UT0JVRl9DT05TVEVYUFIgT25lb2ZEZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+T25lb2ZEZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsKCkge30KKyAgdW5pb24geworICAgIE9uZW9mRGVzY3JpcHRvclByb3RvIF9pbnN0YW5jZTsKKyAgfTsKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIE9uZW9mRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbCBfT25lb2ZEZXNjcmlwdG9yUHJvdG9fZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9DT05TVEVYUFIgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZTo6RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uc3RhcnRfKSovMAorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmVuZF8pKi8wfSB7fQorc3RydWN0IEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2VEZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2VEZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZURlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlRGVmYXVsdFR5cGVJbnRlcm5hbCBfRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZV9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBFbnVtRGVzY3JpcHRvclByb3RvOjpFbnVtRGVzY3JpcHRvclByb3RvKAorICAgIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZCk6IF9pbXBsX3sKKyAgICAvKmRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy52YWx1ZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnJlc2VydmVkX3JhbmdlXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8ucmVzZXJ2ZWRfbmFtZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm5hbWVfKSoveyY6Ol9wYmk6OmZpeGVkX2FkZHJlc3NfZW1wdHlfc3RyaW5nLCA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fX0KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXykqL251bGxwdHJ9IHt9CitzdHJ1Y3QgRW51bURlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWwgeworICBQUk9UT0JVRl9DT05TVEVYUFIgRW51bURlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5FbnVtRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBFbnVtRGVzY3JpcHRvclByb3RvIF9pbnN0YW5jZTsKKyAgfTsKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIEVudW1EZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsIF9FbnVtRGVzY3JpcHRvclByb3RvX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKAorICAgIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZCk6IF9pbXBsX3sKKyAgICAvKmRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5uYW1lXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8ub3B0aW9uc18pKi9udWxscHRyCisgICwgLypkZWNsdHlwZShfaW1wbF8ubnVtYmVyXykqLzB9IHt9CitzdHJ1Y3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+RW51bVZhbHVlRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbCBfRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8oCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm1ldGhvZF8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm5hbWVfKSoveyY6Ol9wYmk6OmZpeGVkX2FkZHJlc3NfZW1wdHlfc3RyaW5nLCA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fX0KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXykqL251bGxwdHJ9IHt9CitzdHJ1Y3QgU2VydmljZURlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWwgeworICBQUk9UT0JVRl9DT05TVEVYUFIgU2VydmljZURlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5TZXJ2aWNlRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIF9pbnN0YW5jZTsKKyAgfTsKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsIF9TZXJ2aWNlRGVzY3JpcHRvclByb3RvX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6TWV0aG9kRGVzY3JpcHRvclByb3RvKAorICAgIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZCk6IF9pbXBsX3sKKyAgICAvKmRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5uYW1lXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uaW5wdXRfdHlwZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm91dHB1dF90eXBlXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8ub3B0aW9uc18pKi9udWxscHRyCisgICwgLypkZWNsdHlwZShfaW1wbF8uY2xpZW50X3N0cmVhbWluZ18pKi9mYWxzZQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnNlcnZlcl9zdHJlYW1pbmdfKSovZmFsc2V9IHt9CitzdHJ1Y3QgTWV0aG9kRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBNZXRob2REZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+TWV0aG9kRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBNZXRob2REZXNjcmlwdG9yUHJvdG8gX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgTWV0aG9kRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbCBfTWV0aG9kRGVzY3JpcHRvclByb3RvX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIEZpbGVPcHRpb25zOjpGaWxlT3B0aW9ucygKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uX2V4dGVuc2lvbnNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmphdmFfcGFja2FnZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmphdmFfb3V0ZXJfY2xhc3NuYW1lXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uZ29fcGFja2FnZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm9iamNfY2xhc3NfcHJlZml4XykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uY3NoYXJwX25hbWVzcGFjZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnN3aWZ0X3ByZWZpeF8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnBocF9jbGFzc19wcmVmaXhfKSoveyY6Ol9wYmk6OmZpeGVkX2FkZHJlc3NfZW1wdHlfc3RyaW5nLCA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fX0KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5waHBfbmFtZXNwYWNlXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8ucGhwX21ldGFkYXRhX25hbWVzcGFjZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnJ1YnlfcGFja2FnZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmphdmFfbXVsdGlwbGVfZmlsZXNfKSovZmFsc2UKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8pKi9mYWxzZQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmphdmFfc3RyaW5nX2NoZWNrX3V0ZjhfKSovZmFsc2UKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5jY19nZW5lcmljX3NlcnZpY2VzXykqL2ZhbHNlCisgICwgLypkZWNsdHlwZShfaW1wbF8uamF2YV9nZW5lcmljX3NlcnZpY2VzXykqL2ZhbHNlCisgICwgLypkZWNsdHlwZShfaW1wbF8ucHlfZ2VuZXJpY19zZXJ2aWNlc18pKi9mYWxzZQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnBocF9nZW5lcmljX3NlcnZpY2VzXykqL2ZhbHNlCisgICwgLypkZWNsdHlwZShfaW1wbF8uZGVwcmVjYXRlZF8pKi9mYWxzZQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm9wdGltaXplX2Zvcl8pKi8xCisgICwgLypkZWNsdHlwZShfaW1wbF8uY2NfZW5hYmxlX2FyZW5hc18pKi90cnVlfSB7fQorc3RydWN0IEZpbGVPcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBGaWxlT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5GaWxlT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgRmlsZU9wdGlvbnMgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgRmlsZU9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsIF9GaWxlT3B0aW9uc19kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBNZXNzYWdlT3B0aW9uczo6TWVzc2FnZU9wdGlvbnMoCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLl9leHRlbnNpb25zXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8pKi9mYWxzZQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfKSovZmFsc2UKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5kZXByZWNhdGVkXykqL2ZhbHNlCisgICwgLypkZWNsdHlwZShfaW1wbF8ubWFwX2VudHJ5XykqL2ZhbHNlfSB7fQorc3RydWN0IE1lc3NhZ2VPcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBNZXNzYWdlT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5NZXNzYWdlT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgTWVzc2FnZU9wdGlvbnMgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgTWVzc2FnZU9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsIF9NZXNzYWdlT3B0aW9uc19kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBGaWVsZE9wdGlvbnM6OkZpZWxkT3B0aW9ucygKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uX2V4dGVuc2lvbnNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmN0eXBlXykqLzAKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5qc3R5cGVfKSovMAorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnBhY2tlZF8pKi9mYWxzZQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmxhenlfKSovZmFsc2UKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy51bnZlcmlmaWVkX2xhenlfKSovZmFsc2UKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5kZXByZWNhdGVkXykqL2ZhbHNlCisgICwgLypkZWNsdHlwZShfaW1wbF8ud2Vha18pKi9mYWxzZX0ge30KK3N0cnVjdCBGaWVsZE9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIEZpZWxkT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5GaWVsZE9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsKCkge30KKyAgdW5pb24geworICAgIEZpZWxkT3B0aW9ucyBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBGaWVsZE9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsIF9GaWVsZE9wdGlvbnNfZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9DT05TVEVYUFIgT25lb2ZPcHRpb25zOjpPbmVvZk9wdGlvbnMoCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLl9leHRlbnNpb25zXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319IHt9CitzdHJ1Y3QgT25lb2ZPcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBPbmVvZk9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+T25lb2ZPcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBPbmVvZk9wdGlvbnMgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgT25lb2ZPcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbCBfT25lb2ZPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIEVudW1PcHRpb25zOjpFbnVtT3B0aW9ucygKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uX2V4dGVuc2lvbnNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmFsbG93X2FsaWFzXykqL2ZhbHNlCisgICwgLypkZWNsdHlwZShfaW1wbF8uZGVwcmVjYXRlZF8pKi9mYWxzZX0ge30KK3N0cnVjdCBFbnVtT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwgeworICBQUk9UT0JVRl9DT05TVEVYUFIgRW51bU9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+RW51bU9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsKCkge30KKyAgdW5pb24geworICAgIEVudW1PcHRpb25zIF9pbnN0YW5jZTsKKyAgfTsKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIEVudW1PcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbCBfRW51bU9wdGlvbnNfZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9DT05TVEVYUFIgRW51bVZhbHVlT3B0aW9uczo6RW51bVZhbHVlT3B0aW9ucygKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uX2V4dGVuc2lvbnNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmRlcHJlY2F0ZWRfKSovZmFsc2V9IHt9CitzdHJ1Y3QgRW51bVZhbHVlT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwgeworICBQUk9UT0JVRl9DT05TVEVYUFIgRW51bVZhbHVlT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5FbnVtVmFsdWVPcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBFbnVtVmFsdWVPcHRpb25zIF9pbnN0YW5jZTsKKyAgfTsKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIEVudW1WYWx1ZU9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsIF9FbnVtVmFsdWVPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIFNlcnZpY2VPcHRpb25zOjpTZXJ2aWNlT3B0aW9ucygKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uX2V4dGVuc2lvbnNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmRlcHJlY2F0ZWRfKSovZmFsc2V9IHt9CitzdHJ1Y3QgU2VydmljZU9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIFNlcnZpY2VPcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgflNlcnZpY2VPcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBTZXJ2aWNlT3B0aW9ucyBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBTZXJ2aWNlT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwgX1NlcnZpY2VPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIE1ldGhvZE9wdGlvbnM6Ok1ldGhvZE9wdGlvbnMoCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLl9leHRlbnNpb25zXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5kZXByZWNhdGVkXykqL2ZhbHNlCisgICwgLypkZWNsdHlwZShfaW1wbF8uaWRlbXBvdGVuY3lfbGV2ZWxfKSovMH0ge30KK3N0cnVjdCBNZXRob2RPcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBNZXRob2RPcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgfk1ldGhvZE9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsKCkge30KKyAgdW5pb24geworICAgIE1ldGhvZE9wdGlvbnMgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgTWV0aG9kT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwgX01ldGhvZE9wdGlvbnNfZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9DT05TVEVYUFIgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8ubmFtZV9wYXJ0XykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uaXNfZXh0ZW5zaW9uXykqL2ZhbHNlfSB7fQorc3RydWN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnREZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnREZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydERlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0RGVmYXVsdFR5cGVJbnRlcm5hbCBfVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBVbmludGVycHJldGVkT3B0aW9uOjpVbmludGVycHJldGVkT3B0aW9uKAorICAgIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZCk6IF9pbXBsX3sKKyAgICAvKmRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5uYW1lXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uaWRlbnRpZmllcl92YWx1ZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnN0cmluZ192YWx1ZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmFnZ3JlZ2F0ZV92YWx1ZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnBvc2l0aXZlX2ludF92YWx1ZV8pKi91aW50NjRfdHswdX0KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5uZWdhdGl2ZV9pbnRfdmFsdWVfKSovaW50NjRfdHswfQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmRvdWJsZV92YWx1ZV8pKi8wfSB7fQorc3RydWN0IFVuaW50ZXJwcmV0ZWRPcHRpb25EZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIFVuaW50ZXJwcmV0ZWRPcHRpb25EZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+VW5pbnRlcnByZXRlZE9wdGlvbkRlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgVW5pbnRlcnByZXRlZE9wdGlvbiBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBVbmludGVycHJldGVkT3B0aW9uRGVmYXVsdFR5cGVJbnRlcm5hbCBfVW5pbnRlcnByZXRlZE9wdGlvbl9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24oCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnBhdGhfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fcGF0aF9jYWNoZWRfYnl0ZV9zaXplXykqL3swfQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnNwYW5fKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fc3Bhbl9jYWNoZWRfYnl0ZV9zaXplXykqL3swfQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5sZWFkaW5nX2NvbW1lbnRzXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8udHJhaWxpbmdfY29tbWVudHNfKSoveyY6Ol9wYmk6OmZpeGVkX2FkZHJlc3NfZW1wdHlfc3RyaW5nLCA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fX19IHt9CitzdHJ1Y3QgU291cmNlQ29kZUluZm9fTG9jYXRpb25EZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgflNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbkRlZmF1bHRUeXBlSW50ZXJuYWwgX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIFNvdXJjZUNvZGVJbmZvOjpTb3VyY2VDb2RlSW5mbygKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8ubG9jYXRpb25fKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319IHt9CitzdHJ1Y3QgU291cmNlQ29kZUluZm9EZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIFNvdXJjZUNvZGVJbmZvRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgflNvdXJjZUNvZGVJbmZvRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBTb3VyY2VDb2RlSW5mbyBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBTb3VyY2VDb2RlSW5mb0RlZmF1bHRUeXBlSW50ZXJuYWwgX1NvdXJjZUNvZGVJbmZvX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24oCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnBhdGhfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fcGF0aF9jYWNoZWRfYnl0ZV9zaXplXykqL3swfQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnNvdXJjZV9maWxlXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uYmVnaW5fKSovMAorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmVuZF8pKi8wfSB7fQorc3RydWN0IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb25EZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb25EZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbkRlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uRGVmYXVsdFR5cGVJbnRlcm5hbCBfR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBHZW5lcmF0ZWRDb2RlSW5mbzo6R2VuZXJhdGVkQ29kZUluZm8oCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLmFubm90YXRpb25fKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319IHt9CitzdHJ1Y3QgR2VuZXJhdGVkQ29kZUluZm9EZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIEdlbmVyYXRlZENvZGVJbmZvRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgfkdlbmVyYXRlZENvZGVJbmZvRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBHZW5lcmF0ZWRDb2RlSW5mbyBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBHZW5lcmF0ZWRDb2RlSW5mb0RlZmF1bHRUeXBlSW50ZXJuYWwgX0dlbmVyYXRlZENvZGVJbmZvX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitzdGF0aWMgOjpfcGI6Ok1ldGFkYXRhIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9bMjddOworc3RhdGljIGNvbnN0IDo6X3BiOjpFbnVtRGVzY3JpcHRvciogZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzZdOworc3RhdGljIGNvbnN0ZXhwciA6Ol9wYjo6U2VydmljZURlc2NyaXB0b3IgY29uc3QqKiBmaWxlX2xldmVsX3NlcnZpY2VfZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8gPSBudWxscHRyOworCitjb25zdCB1aW50MzJfdCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bzo6b2Zmc2V0c1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0geworICB+MHUsICAvLyBubyBfaGFzX2JpdHNfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JTZXQsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JTZXQsIF9pbXBsXy5maWxlXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90bywgX2ltcGxfLl9oYXNfYml0c18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yUHJvdG8sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90bywgX2ltcGxfLm5hbWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvLCBfaW1wbF8ucGFja2FnZV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5kZXBlbmRlbmN5XyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90bywgX2ltcGxfLnB1YmxpY19kZXBlbmRlbmN5XyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90bywgX2ltcGxfLndlYWtfZGVwZW5kZW5jeV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5tZXNzYWdlX3R5cGVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvLCBfaW1wbF8uZW51bV90eXBlXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90bywgX2ltcGxfLnNlcnZpY2VfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvLCBfaW1wbF8uZXh0ZW5zaW9uXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90bywgX2ltcGxfLm9wdGlvbnNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvLCBfaW1wbF8uc291cmNlX2NvZGVfaW5mb18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5zeW50YXhfKSwKKyAgMCwKKyAgMSwKKyAgfjB1LAorICB+MHUsCisgIH4wdSwKKyAgfjB1LAorICB+MHUsCisgIH4wdSwKKyAgfjB1LAorICAzLAorICA0LAorICAyLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSwgX2ltcGxfLl9oYXNfYml0c18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSwgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UsIF9pbXBsXy5zdGFydF8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSwgX2ltcGxfLmVuZF8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSwgX2ltcGxfLm9wdGlvbnNfKSwKKyAgMSwKKyAgMiwKKyAgMCwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSwgX2ltcGxfLl9oYXNfYml0c18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgfjB1LCAgLy8gbm8gX2V4dGVuc2lvbnNfCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlLCBfaW1wbF8uc3RhcnRfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSwgX2ltcGxfLmVuZF8pLAorICAwLAorICAxLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90bywgX2ltcGxfLl9oYXNfYml0c18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90bywgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5uYW1lXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvLCBfaW1wbF8uZmllbGRfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5leHRlbnNpb25fKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5uZXN0ZWRfdHlwZV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90bywgX2ltcGxfLmVudW1fdHlwZV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90bywgX2ltcGxfLmV4dGVuc2lvbl9yYW5nZV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90bywgX2ltcGxfLm9uZW9mX2RlY2xfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5vcHRpb25zXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvLCBfaW1wbF8ucmVzZXJ2ZWRfcmFuZ2VfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5yZXNlcnZlZF9uYW1lXyksCisgIDAsCisgIH4wdSwKKyAgfjB1LAorICB+MHUsCisgIH4wdSwKKyAgfjB1LAorICB+MHUsCisgIDEsCisgIH4wdSwKKyAgfjB1LAorICB+MHUsICAvLyBubyBfaGFzX2JpdHNfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFeHRlbnNpb25SYW5nZU9wdGlvbnMsIF9pbXBsXy5fZXh0ZW5zaW9uc18pLAorICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFeHRlbnNpb25SYW5nZU9wdGlvbnMsIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvLCBfaW1wbF8uX2hhc19iaXRzXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5uYW1lXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5udW1iZXJfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90bywgX2ltcGxfLmxhYmVsXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy50eXBlXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy50eXBlX25hbWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90bywgX2ltcGxfLmV4dGVuZGVlXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5kZWZhdWx0X3ZhbHVlXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5vbmVvZl9pbmRleF8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvLCBfaW1wbF8uanNvbl9uYW1lXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5vcHRpb25zXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5wcm90bzNfb3B0aW9uYWxfKSwKKyAgMCwKKyAgNiwKKyAgOSwKKyAgMTAsCisgIDIsCisgIDEsCisgIDMsCisgIDcsCisgIDQsCisgIDUsCisgIDgsCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZEZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5faGFzX2JpdHNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZkRlc2NyaXB0b3JQcm90bywgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZkRlc2NyaXB0b3JQcm90bywgX2ltcGxfLm5hbWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZkRlc2NyaXB0b3JQcm90bywgX2ltcGxfLm9wdGlvbnNfKSwKKyAgMCwKKyAgMSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlLCBfaW1wbF8uX2hhc19iaXRzXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSwgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlLCBfaW1wbF8uc3RhcnRfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlLCBfaW1wbF8uZW5kXyksCisgIDAsCisgIDEsCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90bywgX2ltcGxfLl9oYXNfYml0c18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG8sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90bywgX2ltcGxfLm5hbWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvLCBfaW1wbF8udmFsdWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvLCBfaW1wbF8ub3B0aW9uc18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5yZXNlcnZlZF9yYW5nZV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5yZXNlcnZlZF9uYW1lXyksCisgIDAsCisgIH4wdSwKKyAgMSwKKyAgfjB1LAorICB+MHUsCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBfaW1wbF8uX2hhc19iaXRzXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgfjB1LCAgLy8gbm8gX2V4dGVuc2lvbnNfCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bywgX2ltcGxfLm5hbWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5udW1iZXJfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5vcHRpb25zXyksCisgIDAsCisgIDIsCisgIDEsCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZURlc2NyaXB0b3JQcm90bywgX2ltcGxfLl9oYXNfYml0c18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZURlc2NyaXB0b3JQcm90bywgX2ltcGxfLm5hbWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvLCBfaW1wbF8ubWV0aG9kXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZURlc2NyaXB0b3JQcm90bywgX2ltcGxfLm9wdGlvbnNfKSwKKyAgMCwKKyAgfjB1LAorICAxLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZERlc2NyaXB0b3JQcm90bywgX2ltcGxfLl9oYXNfYml0c18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZERlc2NyaXB0b3JQcm90bywgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2REZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5uYW1lXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kRGVzY3JpcHRvclByb3RvLCBfaW1wbF8uaW5wdXRfdHlwZV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZERlc2NyaXB0b3JQcm90bywgX2ltcGxfLm91dHB1dF90eXBlXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kRGVzY3JpcHRvclByb3RvLCBfaW1wbF8ub3B0aW9uc18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZERlc2NyaXB0b3JQcm90bywgX2ltcGxfLmNsaWVudF9zdHJlYW1pbmdfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2REZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5zZXJ2ZXJfc3RyZWFtaW5nXyksCisgIDAsCisgIDEsCisgIDIsCisgIDMsCisgIDQsCisgIDUsCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMsIF9pbXBsXy5faGFzX2JpdHNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucywgX2ludGVybmFsX21ldGFkYXRhXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMsIF9pbXBsXy5fZXh0ZW5zaW9uc18pLAorICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucywgX2ltcGxfLmphdmFfcGFja2FnZV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVPcHRpb25zLCBfaW1wbF8uamF2YV9vdXRlcl9jbGFzc25hbWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucywgX2ltcGxfLmphdmFfbXVsdGlwbGVfZmlsZXNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucywgX2ltcGxfLmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMsIF9pbXBsXy5qYXZhX3N0cmluZ19jaGVja191dGY4XyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMsIF9pbXBsXy5vcHRpbWl6ZV9mb3JfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucywgX2ltcGxfLmdvX3BhY2thZ2VfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucywgX2ltcGxfLmNjX2dlbmVyaWNfc2VydmljZXNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucywgX2ltcGxfLmphdmFfZ2VuZXJpY19zZXJ2aWNlc18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVPcHRpb25zLCBfaW1wbF8ucHlfZ2VuZXJpY19zZXJ2aWNlc18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVPcHRpb25zLCBfaW1wbF8ucGhwX2dlbmVyaWNfc2VydmljZXNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucywgX2ltcGxfLmRlcHJlY2F0ZWRfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucywgX2ltcGxfLmNjX2VuYWJsZV9hcmVuYXNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucywgX2ltcGxfLm9iamNfY2xhc3NfcHJlZml4XyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMsIF9pbXBsXy5jc2hhcnBfbmFtZXNwYWNlXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMsIF9pbXBsXy5zd2lmdF9wcmVmaXhfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucywgX2ltcGxfLnBocF9jbGFzc19wcmVmaXhfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucywgX2ltcGxfLnBocF9uYW1lc3BhY2VfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucywgX2ltcGxfLnBocF9tZXRhZGF0YV9uYW1lc3BhY2VfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucywgX2ltcGxfLnJ1YnlfcGFja2FnZV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVPcHRpb25zLCBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKSwKKyAgMCwKKyAgMSwKKyAgMTAsCisgIDExLAorICAxMiwKKyAgMTgsCisgIDIsCisgIDEzLAorICAxNCwKKyAgMTUsCisgIDE2LAorICAxNywKKyAgMTksCisgIDMsCisgIDQsCisgIDUsCisgIDYsCisgIDcsCisgIDgsCisgIDksCisgIH4wdSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlT3B0aW9ucywgX2ltcGxfLl9oYXNfYml0c18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlT3B0aW9ucywgX2ltcGxfLl9leHRlbnNpb25zXyksCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zLCBfaW1wbF8ubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlT3B0aW9ucywgX2ltcGxfLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlT3B0aW9ucywgX2ltcGxfLmRlcHJlY2F0ZWRfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlT3B0aW9ucywgX2ltcGxfLm1hcF9lbnRyeV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zLCBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKSwKKyAgMCwKKyAgMSwKKyAgMiwKKyAgMywKKyAgfjB1LAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucywgX2ltcGxfLl9oYXNfYml0c18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucywgX2ludGVybmFsX21ldGFkYXRhXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zLCBfaW1wbF8uX2V4dGVuc2lvbnNfKSwKKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zLCBfaW1wbF8uY3R5cGVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnMsIF9pbXBsXy5wYWNrZWRfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnMsIF9pbXBsXy5qc3R5cGVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnMsIF9pbXBsXy5sYXp5XyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zLCBfaW1wbF8udW52ZXJpZmllZF9sYXp5XyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zLCBfaW1wbF8uZGVwcmVjYXRlZF8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucywgX2ltcGxfLndlYWtfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnMsIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pLAorICAwLAorICAyLAorICAxLAorICAzLAorICA0LAorICA1LAorICA2LAorICB+MHUsCisgIH4wdSwgIC8vIG5vIF9oYXNfYml0c18KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZk9wdGlvbnMsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mT3B0aW9ucywgX2ltcGxfLl9leHRlbnNpb25zXyksCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mT3B0aW9ucywgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bU9wdGlvbnMsIF9pbXBsXy5faGFzX2JpdHNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucywgX2ludGVybmFsX21ldGFkYXRhXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bU9wdGlvbnMsIF9pbXBsXy5fZXh0ZW5zaW9uc18pLAorICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucywgX2ltcGxfLmFsbG93X2FsaWFzXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bU9wdGlvbnMsIF9pbXBsXy5kZXByZWNhdGVkXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bU9wdGlvbnMsIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pLAorICAwLAorICAxLAorICB+MHUsCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlT3B0aW9ucywgX2ltcGxfLl9oYXNfYml0c18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZU9wdGlvbnMsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZU9wdGlvbnMsIF9pbXBsXy5fZXh0ZW5zaW9uc18pLAorICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVPcHRpb25zLCBfaW1wbF8uZGVwcmVjYXRlZF8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZU9wdGlvbnMsIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pLAorICAwLAorICB+MHUsCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZU9wdGlvbnMsIF9pbXBsXy5faGFzX2JpdHNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlT3B0aW9ucywgX2ludGVybmFsX21ldGFkYXRhXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZU9wdGlvbnMsIF9pbXBsXy5fZXh0ZW5zaW9uc18pLAorICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlT3B0aW9ucywgX2ltcGxfLmRlcHJlY2F0ZWRfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlT3B0aW9ucywgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyksCisgIDAsCisgIH4wdSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zLCBfaW1wbF8uX2hhc19iaXRzXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9ucywgX2ludGVybmFsX21ldGFkYXRhXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9ucywgX2ltcGxfLl9leHRlbnNpb25zXyksCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnMsIF9pbXBsXy5kZXByZWNhdGVkXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9ucywgX2ltcGxfLmlkZW1wb3RlbmN5X2xldmVsXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9ucywgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyksCisgIDAsCisgIDEsCisgIH4wdSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0LCBfaW1wbF8uX2hhc19iaXRzXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCwgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0LCBfaW1wbF8ubmFtZV9wYXJ0XyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCwgX2ltcGxfLmlzX2V4dGVuc2lvbl8pLAorICAwLAorICAxLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24sIF9pbXBsXy5faGFzX2JpdHNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgfjB1LCAgLy8gbm8gX2V4dGVuc2lvbnNfCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24sIF9pbXBsXy5uYW1lXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiwgX2ltcGxfLmlkZW50aWZpZXJfdmFsdWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uLCBfaW1wbF8ucG9zaXRpdmVfaW50X3ZhbHVlXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiwgX2ltcGxfLm5lZ2F0aXZlX2ludF92YWx1ZV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24sIF9pbXBsXy5kb3VibGVfdmFsdWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uLCBfaW1wbF8uc3RyaW5nX3ZhbHVlXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiwgX2ltcGxfLmFnZ3JlZ2F0ZV92YWx1ZV8pLAorICB+MHUsCisgIDAsCisgIDMsCisgIDQsCisgIDUsCisgIDEsCisgIDIsCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm9fTG9jYXRpb24sIF9pbXBsXy5faGFzX2JpdHNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiwgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiwgX2ltcGxfLnBhdGhfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiwgX2ltcGxfLnNwYW5fKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiwgX2ltcGxfLmxlYWRpbmdfY29tbWVudHNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiwgX2ltcGxfLnRyYWlsaW5nX2NvbW1lbnRzXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm9fTG9jYXRpb24sIF9pbXBsXy5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXyksCisgIH4wdSwKKyAgfjB1LAorICAwLAorICAxLAorICB+MHUsCisgIH4wdSwgIC8vIG5vIF9oYXNfYml0c18KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbywgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbywgX2ltcGxfLmxvY2F0aW9uXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiwgX2ltcGxfLl9oYXNfYml0c18pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiwgX2ltcGxfLnBhdGhfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uLCBfaW1wbF8uc291cmNlX2ZpbGVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uLCBfaW1wbF8uYmVnaW5fKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uLCBfaW1wbF8uZW5kXyksCisgIH4wdSwKKyAgMCwKKyAgMSwKKyAgMiwKKyAgfjB1LCAgLy8gbm8gX2hhc19iaXRzXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgfjB1LCAgLy8gbm8gX2V4dGVuc2lvbnNfCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvLCBfaW1wbF8uYW5ub3RhdGlvbl8pLAorfTsKK3N0YXRpYyBjb25zdCA6Ol9wYmk6Ok1pZ3JhdGlvblNjaGVtYSBzY2hlbWFzW10gUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRShwcm90b2Rlc2NfY29sZCkgPSB7CisgIHsgMCwgLTEsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yU2V0KX0sCisgIHsgNywgMjUsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yUHJvdG8pfSwKKyAgeyAzNywgNDYsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSl9LAorICB7IDQ5LCA1NywgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UpfSwKKyAgeyA1OSwgNzUsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90byl9LAorICB7IDg1LCAtMSwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zKX0sCisgIHsgOTIsIDEwOSwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8pfSwKKyAgeyAxMjAsIDEyOCwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZEZXNjcmlwdG9yUHJvdG8pfSwKKyAgeyAxMzAsIDEzOCwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSl9LAorICB7IDE0MCwgMTUxLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvKX0sCisgIHsgMTU2LCAxNjUsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byl9LAorICB7IDE2OCwgMTc3LCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKX0sCisgIHsgMTgwLCAxOTIsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZERlc2NyaXB0b3JQcm90byl9LAorICB7IDE5OCwgMjI1LCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucyl9LAorICB7IDI0NiwgMjU3LCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlT3B0aW9ucyl9LAorICB7IDI2MiwgMjc2LCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnMpfSwKKyAgeyAyODQsIC0xLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZk9wdGlvbnMpfSwKKyAgeyAyOTEsIDMwMCwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bU9wdGlvbnMpfSwKKyAgeyAzMDMsIDMxMSwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlT3B0aW9ucyl9LAorICB7IDMxMywgMzIxLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlT3B0aW9ucyl9LAorICB7IDMyMywgMzMyLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zKX0sCisgIHsgMzM1LCAzNDMsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQpfSwKKyAgeyAzNDUsIDM1OCwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbil9LAorICB7IDM2NSwgMzc2LCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbil9LAorICB7IDM4MSwgLTEsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvZGVJbmZvKX0sCisgIHsgMzg4LCAzOTgsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24pfSwKKyAgeyA0MDIsIC0xLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpHZW5lcmF0ZWRDb2RlSW5mbyl9LAorfTsKKworc3RhdGljIGNvbnN0IDo6X3BiOjpNZXNzYWdlKiBjb25zdCBmaWxlX2RlZmF1bHRfaW5zdGFuY2VzW10gPSB7CisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X0ZpbGVEZXNjcmlwdG9yU2V0X2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfRmlsZURlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X0Rlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfRGVzY3JpcHRvclByb3RvX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfRXh0ZW5zaW9uUmFuZ2VPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfRmllbGREZXNjcmlwdG9yUHJvdG9fZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9PbmVvZkRlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X0VudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2VfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9FbnVtRGVzY3JpcHRvclByb3RvX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfU2VydmljZURlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X01ldGhvZERlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X0ZpbGVPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfTWVzc2FnZU9wdGlvbnNfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9GaWVsZE9wdGlvbnNfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9PbmVvZk9wdGlvbnNfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9FbnVtT3B0aW9uc19kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X0VudW1WYWx1ZU9wdGlvbnNfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9TZXJ2aWNlT3B0aW9uc19kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X01ldGhvZE9wdGlvbnNfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9VbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfVW5pbnRlcnByZXRlZE9wdGlvbl9kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfU291cmNlQ29kZUluZm9fZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9HZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfR2VuZXJhdGVkQ29kZUluZm9fZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorfTsKKworY29uc3QgY2hhciBkZXNjcmlwdG9yX3RhYmxlX3Byb3RvZGVmX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvW10gUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRShwcm90b2Rlc2NfY29sZCkgPQorICAiXG4gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cMDIyXDAxN2dvb2ciCisgICJsZS5wcm90b2J1ZlwiR1xuXDAyMUZpbGVEZXNjcmlwdG9yU2V0XDAyMjJcblwwMDRmaWxlIgorICAiXDAzMFwwMDEgXDAwMyhcMDEzMiQuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUCIKKyAgInJvdG9cIlwzMzNcMDAzXG5cMDIzRmlsZURlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEiCisgICIoXHRcMDIyXDAxN1xuXDAwN3BhY2thZ2VcMDMwXDAwMiBcMDAxKFx0XDAyMlwwMjJcblxuZGVwZW5kZW5jeVwwMzBcMDAzIFwwMDMoXHRcMDIyIgorICAiXDAzMVxuXDAyMXB1YmxpY19kZXBlbmRlbmN5XDAzMFxuIFwwMDMoXDAwNVwwMjJcMDI3XG5cMDE3d2Vha19kZXBlbiIKKyAgImRlbmN5XDAzMFwwMTMgXDAwMyhcMDA1XDAyMjZcblwwMTRtZXNzYWdlX3R5cGVcMDMwXDAwNCBcMDAzKFwwMTMyIC5nb29nIgorICAibGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvXDAyMjdcblx0ZW51bV90eXBlIgorICAiXDAzMFwwMDUgXDAwMyhcMDEzMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUCIKKyAgInJvdG9cMDIyOFxuXDAwN3NlcnZpY2VcMDMwXDAwNiBcMDAzKFwwMTMyXCcuZ29vZ2xlLnByb3RvYnVmLiIKKyAgIlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9cMDIyOFxuXHRleHRlbnNpb25cMDMwXDAwNyBcMDAzKCIKKyAgIlwwMTMyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8iCisgICJcMDIyLVxuXDAwN29wdGlvbnNcMDMwXDAxMCBcMDAxKFwwMTMyXDAzNC5nb29nbGUucHJvdG9idWYuRmlsZSIKKyAgIk9wdGlvbnNcMDIyOVxuXDAyMHNvdXJjZV9jb2RlX2luZm9cMDMwXHQgXDAwMShcMDEzMlwwMzcuZ29vZyIKKyAgImxlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvXDAyMlwwMTZcblwwMDZzeW50YXhcMDMwXDAxNCBcMDAxIgorICAiKFx0XCJcMjUxXDAwNVxuXDAxN0Rlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyNFxuXDAwNSIKKyAgImZpZWxkXDAzMFwwMDIgXDAwMyhcMDEzMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3IiCisgICJpcHRvclByb3RvXDAyMjhcblx0ZXh0ZW5zaW9uXDAzMFwwMDYgXDAwMyhcMDEzMiUuZ29vZ2xlLnAiCisgICJyb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvXDAyMjVcblwwMTNuZXN0ZWRfdCIKKyAgInlwZVwwMzBcMDAzIFwwMDMoXDAxMzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHIiCisgICJvdG9cMDIyN1xuXHRlbnVtX3R5cGVcMDMwXDAwNCBcMDAzKFwwMTMyJC5nb29nbGUucHJvdG9idWYiCisgICIuRW51bURlc2NyaXB0b3JQcm90b1wwMjJIXG5cMDE3ZXh0ZW5zaW9uX3JhbmdlXDAzMCIKKyAgIlwwMDUgXDAwMyhcMDEzMi8uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by4iCisgICJFeHRlbnNpb25SYW5nZVwwMjI5XG5cbm9uZW9mX2RlY2xcMDMwXDAxMCBcMDAzKFwwMTMyJS5nb28iCisgICJnbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9cMDIyMFxuXDAwN29wdCIKKyAgImlvbnNcMDMwXDAwNyBcMDAxKFwwMTMyXDAzNy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGkiCisgICJvbnNcMDIyRlxuXDAxNnJlc2VydmVkX3JhbmdlXDAzMFx0IFwwMDMoXDAxMzIuLmdvb2dsZS5wcm8iCisgICJ0b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZVwwMjJcMDI1XG5ccnIiCisgICJlc2VydmVkX25hbWVcMDMwXG4gXDAwMyhcdFwwMzJlXG5cMDE2RXh0ZW5zaW9uUmFuZ2VcMDIyXHJcblwwMDUiCisgICJzdGFydFwwMzBcMDAxIFwwMDEoXDAwNVwwMjJcMDEzXG5cMDAzZW5kXDAzMFwwMDIgXDAwMShcMDA1XDAyMjdcblwwMDdvcHRpb25zXDAzMFwwMDMgXDAwMSgiCisgICJcMDEzMiYuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9uIgorICAic1wwMzIrXG5cclJlc2VydmVkUmFuZ2VcMDIyXHJcblwwMDVzdGFydFwwMzBcMDAxIFwwMDEoXDAwNVwwMjJcMDEzXG5cMDAzZW5kIgorICAiXDAzMFwwMDIgXDAwMShcMDA1XCJnXG5cMDI1RXh0ZW5zaW9uUmFuZ2VPcHRpb25zXDAyMkNcblwwMjR1bmludCIKKyAgImVycHJldGVkX29wdGlvblwwMzBcMzQ3XDAwNyBcMDAzKFwwMTMyJC5nb29nbGUucHJvdG9idWYiCisgICIuVW5pbnRlcnByZXRlZE9wdGlvbipcdFwwMTBcMzUwXDAwN1wwMjBcMjAwXDIwMFwyMDBcMjAwXDAwMlwiXDMyNVwwMDVcblwwMjRGaWVsIgorICAiZERlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyXDAxNlxuXDAwNm51bWJlciIKKyAgIlwwMzBcMDAzIFwwMDEoXDAwNVwwMjI6XG5cMDA1bGFiZWxcMDMwXDAwNCBcMDAxKFwwMTYyKy5nb29nbGUucHJvdG9idWYuIgorICAiRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWxcMDIyOFxuXDAwNHR5cGVcMDMwXDAwNSBcMDAxKFwwMTYiCisgICIyKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uIgorICAiVHlwZVwwMjJcMDIxXG5cdHR5cGVfbmFtZVwwMzBcMDA2IFwwMDEoXHRcMDIyXDAyMFxuXDAxMGV4dGVuZGVlXDAzMFwwMDIgXDAwMSgiCisgICJcdFwwMjJcMDI1XG5ccmRlZmF1bHRfdmFsdWVcMDMwXDAwNyBcMDAxKFx0XDAyMlwwMjNcblwwMTNvbmVvZl9pbmRleFwwMzAiCisgICJcdCBcMDAxKFwwMDVcMDIyXDAyMVxuXHRqc29uX25hbWVcMDMwXG4gXDAwMShcdFwwMjIuXG5cMDA3b3B0aW9uc1wwMzBcMDEwIFwwMDEoIgorICAiXDAxMzJcMDM1Lmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnNcMDIyXDAyN1xuXDAxN3Byb3QiCisgICJvM19vcHRpb25hbFwwMzBcMDIxIFwwMDEoXDAxMFwiXDI2NlwwMDJcblwwMDRUeXBlXDAyMlwwMTdcblwwMTNUWVBFX0RPVUJMIgorICAiRVwwMjBcMDAxXDAyMlwwMTZcblxuVFlQRV9GTE9BVFwwMjBcMDAyXDAyMlwwMTZcblxuVFlQRV9JTlQ2NFwwMjBcMDAzXDAyMlwwMTdcblwwMTNUIgorICAiWVBFX1VJTlQ2NFwwMjBcMDA0XDAyMlwwMTZcblxuVFlQRV9JTlQzMlwwMjBcMDA1XDAyMlwwMjBcblwwMTRUWVBFX0ZJWCIKKyAgIkVENjRcMDIwXDAwNlwwMjJcMDIwXG5cMDE0VFlQRV9GSVhFRDMyXDAyMFwwMDdcMDIyXHJcblx0VFlQRV9CT09MXDAyMFwwMTBcMDIyIgorICAiXDAxN1xuXDAxM1RZUEVfU1RSSU5HXDAyMFx0XDAyMlwwMTZcblxuVFlQRV9HUk9VUFwwMjBcblwwMjJcMDIwXG5cMDE0VFlQRSIKKyAgIl9NRVNTQUdFXDAyMFwwMTNcMDIyXDAxNlxuXG5UWVBFX0JZVEVTXDAyMFwwMTRcMDIyXDAxN1xuXDAxM1RZUEVfVUlOVDMiCisgICIyXDAyMFxyXDAyMlxyXG5cdFRZUEVfRU5VTVwwMjBcMDE2XDAyMlwwMjFcblxyVFlQRV9TRklYRUQzMlwwMjBcMDE3XDAyMlwwMjFcbiIKKyAgIlxyVFlQRV9TRklYRUQ2NFwwMjBcMDIwXDAyMlwwMTdcblwwMTNUWVBFX1NJTlQzMlwwMjBcMDIxXDAyMlwwMTdcblwwMTNUWVAiCisgICJFX1NJTlQ2NFwwMjBcMDIyXCJDXG5cMDA1TGFiZWxcMDIyXDAyMlxuXDAxNkxBQkVMX09QVElPTkFMXDAyMFwwMDFcMDIyIgorICAiXDAyMlxuXDAxNkxBQkVMX1JFUVVJUkVEXDAyMFwwMDJcMDIyXDAyMlxuXDAxNkxBQkVMX1JFUEVBVEVEXDAyMFwwMDNcIiIKKyAgIlRcblwwMjRPbmVvZkRlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyLlxuIgorICAiXDAwN29wdGlvbnNcMDMwXDAwMiBcMDAxKFwwMTMyXDAzNS5nb29nbGUucHJvdG9idWYuT25lb2ZPcCIKKyAgInRpb25zXCJcMjQ0XDAwMlxuXDAyM0VudW1EZXNjcmlwdG9yUHJvdG9cMDIyXDAxNFxuXDAwNG5hbWVcMDMwXDAwMSAiCisgICJcMDAxKFx0XDAyMjhcblwwMDV2YWx1ZVwwMzBcMDAyIFwwMDMoXDAxMzIpLmdvb2dsZS5wcm90b2J1Zi5FbnUiCisgICJtVmFsdWVEZXNjcmlwdG9yUHJvdG9cMDIyLVxuXDAwN29wdGlvbnNcMDMwXDAwMyBcMDAxKFwwMTMyXDAzNCIKKyAgIi5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNcMDIyTlxuXDAxNnJlc2VydmVkIgorICAiX3JhbmdlXDAzMFwwMDQgXDAwMyhcMDEzMjYuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjciIKKyAgImlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2VcMDIyXDAyNVxuXHJyZXNlcnZlZCIKKyAgIl9uYW1lXDAzMFwwMDUgXDAwMyhcdFwwMzIvXG5cMDIxRW51bVJlc2VydmVkUmFuZ2VcMDIyXHJcblwwMDVzdGFyIgorICAidFwwMzBcMDAxIFwwMDEoXDAwNVwwMjJcMDEzXG5cMDAzZW5kXDAzMFwwMDIgXDAwMShcMDA1XCJsXG5cMDMwRW51bVZhbHVlRGVzY3JpcCIKKyAgInRvclByb3RvXDAyMlwwMTRcblwwMDRuYW1lXDAzMFwwMDEgXDAwMShcdFwwMjJcMDE2XG5cMDA2bnVtYmVyXDAzMFwwMDIgXDAwMShcMDA1XDAyMjIiCisgICJcblwwMDdvcHRpb25zXDAzMFwwMDMgXDAwMShcMDEzMiEuZ29vZ2xlLnByb3RvYnVmLkVudW1WYSIKKyAgImx1ZU9wdGlvbnNcIlwyMjBcMDAxXG5cMDI2U2VydmljZURlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG4iCisgICJcMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyNlxuXDAwNm1ldGhvZFwwMzBcMDAyIFwwMDMoXDAxMzImLmdvb2dsZS5wcm8iCisgICJ0b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG9cMDIyMFxuXDAwN29wdGlvbnNcMDMwXDAwMyIKKyAgIiBcMDAxKFwwMTMyXDAzNy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNcIlwzMDFcMDAxIgorICAiXG5cMDI1TWV0aG9kRGVzY3JpcHRvclByb3RvXDAyMlwwMTRcblwwMDRuYW1lXDAzMFwwMDEgXDAwMShcdFwwMjJcMDIyXG4iCisgICJcbmlucHV0X3R5cGVcMDMwXDAwMiBcMDAxKFx0XDAyMlwwMjNcblwwMTNvdXRwdXRfdHlwZVwwMzBcMDAzIFwwMDEoXHRcMDIyLyIKKyAgIlxuXDAwN29wdGlvbnNcMDMwXDAwNCBcMDAxKFwwMTMyXDAzNi5nb29nbGUucHJvdG9idWYuTWV0aG9kIgorICAiT3B0aW9uc1wwMjJcMDM3XG5cMDIwY2xpZW50X3N0cmVhbWluZ1wwMzBcMDA1IFwwMDEoXDAxMDpcMDA1ZmFsc2UiCisgICJcMDIyXDAzN1xuXDAyMHNlcnZlcl9zdHJlYW1pbmdcMDMwXDAwNiBcMDAxKFwwMTA6XDAwNWZhbHNlXCJcMjQ1XDAwNlxuXDAxM0ZpIgorICAibGVPcHRpb25zXDAyMlwwMjRcblwwMTRqYXZhX3BhY2thZ2VcMDMwXDAwMSBcMDAxKFx0XDAyMlwwMzRcblwwMjRqYXZhXyIKKyAgIm91dGVyX2NsYXNzbmFtZVwwMzBcMDEwIFwwMDEoXHRcMDIyXCJcblwwMjNqYXZhX211bHRpcGxlX2YiCisgICJpbGVzXDAzMFxuIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyKVxuXDAzNWphdmFfZ2VuZXJhdGVfZXF1YWwiCisgICJzX2FuZF9oYXNoXDAzMFwwMjQgXDAwMShcMDEwQlwwMDJcMDMwXDAwMVwwMjIlXG5cMDI2amF2YV9zdHJpbmdfY2hlYyIKKyAgImtfdXRmOFwwMzBcMDMzIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyRlxuXDAxNG9wdGltaXplX2ZvclwwMzBcdCBcMDAxKCIKKyAgIlwwMTYyKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemUiCisgICJNb2RlOlwwMDVTUEVFRFwwMjJcMDIyXG5cbmdvX3BhY2thZ2VcMDMwXDAxMyBcMDAxKFx0XDAyMlwiXG5cMDIzY2NfZ2UiCisgICJuZXJpY19zZXJ2aWNlc1wwMzBcMDIwIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyJFxuXDAyNWphdmFfZ2VuZSIKKyAgInJpY19zZXJ2aWNlc1wwMzBcMDIxIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyXCJcblwwMjNweV9nZW5lcmljXyIKKyAgInNlcnZpY2VzXDAzMFwwMjIgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjIjXG5cMDI0cGhwX2dlbmVyaWNfc2VyIgorICAidmljZXNcMDMwKiBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMlwwMzFcblxuZGVwcmVjYXRlZFwwMzBcMDI3IFwwMDEoXDAxMDpcMDA1IgorICAiZmFsc2VcMDIyXDAzNlxuXDAyMGNjX2VuYWJsZV9hcmVuYXNcMDMwXDAzNyBcMDAxKFwwMTA6XDAwNHRydWVcMDIyXDAzMVxuIgorICAiXDAyMW9iamNfY2xhc3NfcHJlZml4XDAzMCQgXDAwMShcdFwwMjJcMDMwXG5cMDIwY3NoYXJwX25hbWVzIgorICAicGFjZVwwMzAlIFwwMDEoXHRcMDIyXDAyNFxuXDAxNHN3aWZ0X3ByZWZpeFwwMzBcJyBcMDAxKFx0XDAyMlwwMzBcblwwMjBwaHBfIgorICAiY2xhc3NfcHJlZml4XDAzMCggXDAwMShcdFwwMjJcMDI1XG5ccnBocF9uYW1lc3BhY2VcMDMwKSBcMDAxKCIKKyAgIlx0XDAyMlwwMzZcblwwMjZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlXDAzMCwgXDAwMShcdFwwMjJcMDI0XG5cMDE0cnViIgorICAieV9wYWNrYWdlXDAzMC0gXDAwMShcdFwwMjJDXG5cMDI0dW5pbnRlcnByZXRlZF9vcHRpb25cMDMwIgorICAiXDM0N1wwMDcgXDAwMyhcMDEzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcCIKKyAgInRpb25cIjpcblwwMTRPcHRpbWl6ZU1vZGVcMDIyXHRcblwwMDVTUEVFRFwwMjBcMDAxXDAyMlxyXG5cdENPREVfIgorICAiU0laRVwwMjBcMDAyXDAyMlwwMjBcblwwMTRMSVRFX1JVTlRJTUVcMDIwXDAwMypcdFwwMTBcMzUwXDAwN1wwMjBcMjAwXDIwMFwyMDBcMjAwXDAwMkpcMDA0XDAxMCZcMDIwIgorICAiXCdcIlwyMDRcMDAyXG5cMDE2TWVzc2FnZU9wdGlvbnNcMDIyJlxuXDAyN21lc3NhZ2Vfc2V0X3dpcmUiCisgICJfZm9ybWF0XDAzMFwwMDEgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjIuXG5cMDM3bm9fc3RhbmRhcmRfZGVzYyIKKyAgInJpcHRvcl9hY2Nlc3NvclwwMzBcMDAyIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyXDAzMVxuXG5kZXByZWNhdCIKKyAgImVkXDAzMFwwMDMgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJcMDIxXG5cdG1hcF9lbnRyeVwwMzBcMDA3IFwwMDEoXDAxMFwwMjJDXG5cMDI0dW4iCisgICJpbnRlcnByZXRlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuZ29vZ2xlLnByb3RvIgorICAiYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24qXHRcMDEwXDM1MFwwMDdcMDIwXDIwMFwyMDBcMjAwXDIwMFwwMDJKXDAwNFwwMTBcMDA0XDAyMFwwMDUiCisgICJKXDAwNFwwMTBcMDA1XDAyMFwwMDZKXDAwNFwwMTBcMDA2XDAyMFwwMDdKXDAwNFwwMTBcMDEwXDAyMFx0SlwwMDRcMDEwXHRcMDIwXG5cIlwyNzZcMDAzXG5cMDE0RmllbGRPcHRpb24iCisgICJzXDAyMjpcblwwMDVjdHlwZVwwMzBcMDAxIFwwMDEoXDAxNjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZCIKKyAgIk9wdGlvbnMuQ1R5cGU6XDAwNlNUUklOR1wwMjJcMDE2XG5cMDA2cGFja2VkXDAzMFwwMDIgXDAwMShcMDEwXDAyMlw/XG4iCisgICJcMDA2anN0eXBlXDAzMFwwMDYgXDAwMShcMDE2MiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0IgorICAiaW9ucy5KU1R5cGU6XHRKU19OT1JNQUxcMDIyXDAyM1xuXDAwNGxhenlcMDMwXDAwNSBcMDAxKFwwMTA6XDAwNWZhIgorICAibHNlXDAyMlwwMzZcblwwMTd1bnZlcmlmaWVkX2xhenlcMDMwXDAxNyBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMlwwMzFcblxuZCIKKyAgImVwcmVjYXRlZFwwMzBcMDAzIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyXDAyM1xuXDAwNHdlYWtcMDMwXG4gXDAwMShcMDEwOlwwMDVmYSIKKyAgImxzZVwwMjJDXG5cMDI0dW5pbnRlcnByZXRlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuZ29vIgorICAiZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25cIi9cblwwMDVDVHlwIgorICAiZVwwMjJcblxuXDAwNlNUUklOR1wwMjBcMDAwXDAyMlwwMTBcblwwMDRDT1JEXDAyMFwwMDFcMDIyXDAyMFxuXDAxNFNUUklOR19QSUVDRVwwMjAiCisgICJcMDAyXCI1XG5cMDA2SlNUeXBlXDAyMlxyXG5cdEpTX05PUk1BTFwwMjBcMDAwXDAyMlxyXG5cdEpTX1NUUklOR1wwMjAiCisgICJcMDAxXDAyMlxyXG5cdEpTX05VTUJFUlwwMjBcMDAyKlx0XDAxMFwzNTBcMDA3XDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAySlwwMDRcMDEwXDAwNFwwMjBcMDA1XCJeXG5cMDE0T25lIgorICAib2ZPcHRpb25zXDAyMkNcblwwMjR1bmludGVycHJldGVkX29wdGlvblwwMzBcMzQ3XDAwNyBcMDAzKFwwMTMiCisgICIyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdCIKKyAgIlwwMTBcMzUwXDAwN1wwMjBcMjAwXDIwMFwyMDBcMjAwXDAwMlwiXDIyM1wwMDFcblwwMTNFbnVtT3B0aW9uc1wwMjJcMDIzXG5cMDEzYWxsb3dfYWxpYXMiCisgICJcMDMwXDAwMiBcMDAxKFwwMTBcMDIyXDAzMVxuXG5kZXByZWNhdGVkXDAzMFwwMDMgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJDXG5cMDI0dW5pIgorICAibnRlcnByZXRlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuZ29vZ2xlLnByb3RvYiIKKyAgInVmLlVuaW50ZXJwcmV0ZWRPcHRpb24qXHRcMDEwXDM1MFwwMDdcMDIwXDIwMFwyMDBcMjAwXDIwMFwwMDJKXDAwNFwwMTBcMDA1XDAyMFwwMDZcIiIKKyAgIn1cblwwMjBFbnVtVmFsdWVPcHRpb25zXDAyMlwwMzFcblxuZGVwcmVjYXRlZFwwMzBcMDAxIFwwMDEoXDAxMDoiCisgICJcMDA1ZmFsc2VcMDIyQ1xuXDAyNHVuaW50ZXJwcmV0ZWRfb3B0aW9uXDAzMFwzNDdcMDA3IFwwMDMoXDAxMzIkLiIKKyAgImdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKlx0XDAxMFwzNTBcMDA3IgorICAiXDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJ7XG5cMDE2U2VydmljZU9wdGlvbnNcMDIyXDAzMVxuXG5kZXByZWNhdGVkXDAzMCEiCisgICIgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJDXG5cMDI0dW5pbnRlcnByZXRlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyIKKyAgIihcMDEzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24iCisgICIqXHRcMDEwXDM1MFwwMDdcMDIwXDIwMFwyMDBcMjAwXDIwMFwwMDJcIlwyNTVcMDAyXG5cck1ldGhvZE9wdGlvbnNcMDIyXDAzMVxuXG5kZXByZWNhIgorICAidGVkXDAzMCEgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJfXG5cMDIxaWRlbXBvdGVuY3lfbGV2ZWxcMDMwXCIgIgorICAiXDAwMShcMDE2Mi8uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuSWRlbSIKKyAgInBvdGVuY3lMZXZlbDpcMDIzSURFTVBPVEVOQ1lfVU5LTk9XTlwwMjJDXG5cMDI0dW5pIgorICAibnRlcnByZXRlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuZ29vZ2xlLnByb3RvYiIKKyAgInVmLlVuaW50ZXJwcmV0ZWRPcHRpb25cIlBcblwwMjBJZGVtcG90ZW5jeUxldiIKKyAgImVsXDAyMlwwMjdcblwwMjNJREVNUE9URU5DWV9VTktOT1dOXDAyMFwwMDBcMDIyXDAyM1xuXDAxN05PX1NJREVfRSIKKyAgIkZGRUNUU1wwMjBcMDAxXDAyMlwwMTZcblxuSURFTVBPVEVOVFwwMjBcMDAyKlx0XDAxMFwzNTBcMDA3XDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJcMjM2XDAwMlxuXDAyMyIKKyAgIlVuaW50ZXJwcmV0ZWRPcHRpb25cMDIyO1xuXDAwNG5hbWVcMDMwXDAwMiBcMDAzKFwwMTMyLS5nb29nIgorICAibGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCIKKyAgIlwwMjJcMDMwXG5cMDIwaWRlbnRpZmllcl92YWx1ZVwwMzBcMDAzIFwwMDEoXHRcMDIyXDAzMlxuXDAyMnBvc2l0aXZlX2kiCisgICJudF92YWx1ZVwwMzBcMDA0IFwwMDEoXDAwNFwwMjJcMDMyXG5cMDIybmVnYXRpdmVfaW50X3ZhbHVlXDAzMFwwMDUgXDAwMSIKKyAgIihcMDAzXDAyMlwwMjRcblwwMTRkb3VibGVfdmFsdWVcMDMwXDAwNiBcMDAxKFwwMDFcMDIyXDAyNFxuXDAxNHN0cmluZ192YWx1ZSIKKyAgIlwwMzBcMDA3IFwwMDEoXDAxNFwwMjJcMDI3XG5cMDE3YWdncmVnYXRlX3ZhbHVlXDAzMFwwMTAgXDAwMShcdFwwMzIzXG5cMDEwTmFtZVAiCisgICJhcnRcMDIyXDAyMVxuXHRuYW1lX3BhcnRcMDMwXDAwMSBcMDAyKFx0XDAyMlwwMjRcblwwMTRpc19leHRlbnNpb25cMDMwXDAwMiIKKyAgIiBcMDAyKFwwMTBcIlwzMjVcMDAxXG5cMDE2U291cmNlQ29kZUluZm9cMDIyOlxuXDAxMGxvY2F0aW9uXDAzMFwwMDEgXDAwMygiCisgICJcMDEzMiguZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0IgorICAiaW9uXDAzMlwyMDZcMDAxXG5cMDEwTG9jYXRpb25cMDIyXDAyMFxuXDAwNHBhdGhcMDMwXDAwMSBcMDAzKFwwMDVCXDAwMlwwMjBcMDAxXDAyMlwwMjBcblwwMDRzcCIKKyAgImFuXDAzMFwwMDIgXDAwMyhcMDA1QlwwMDJcMDIwXDAwMVwwMjJcMDMwXG5cMDIwbGVhZGluZ19jb21tZW50c1wwMzBcMDAzIFwwMDEoXHRcMDIyXDAzMSIKKyAgIlxuXDAyMXRyYWlsaW5nX2NvbW1lbnRzXDAzMFwwMDQgXDAwMShcdFwwMjIhXG5cMDMxbGVhZGluZ19kZXQiCisgICJhY2hlZF9jb21tZW50c1wwMzBcMDA2IFwwMDMoXHRcIlwyNDdcMDAxXG5cMDIxR2VuZXJhdGVkQ29kZUluIgorICAiZm9cMDIyQVxuXG5hbm5vdGF0aW9uXDAzMFwwMDEgXDAwMyhcMDEzMi0uZ29vZ2xlLnByb3RvYnVmIgorICAiLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25cMDMyT1xuXG5Bbm5vdGF0IgorICAiaW9uXDAyMlwwMjBcblwwMDRwYXRoXDAzMFwwMDEgXDAwMyhcMDA1QlwwMDJcMDIwXDAwMVwwMjJcMDIzXG5cMDEzc291cmNlX2ZpbGVcMDMwXDAwMiBcMDAxIgorICAiKFx0XDAyMlxyXG5cMDA1YmVnaW5cMDMwXDAwMyBcMDAxKFwwMDVcMDIyXDAxM1xuXDAwM2VuZFwwMzBcMDA0IFwwMDEoXDAwNUJ+XG5cMDIzY29tLmdvIgorICAib2dsZS5wcm90b2J1ZkJcMDIwRGVzY3JpcHRvclByb3Rvc0hcMDAxWi1nb29nbCIKKyAgImUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9kZXNjcmlwdG9ycGIiCisgICJcMzcwXDAwMVwwMDFcMjQyXDAwMlwwMDNHUEJcMjUyXDAwMlwwMzJHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbiIKKyAgOworc3RhdGljIDo6X3BiaTo6b25jZV9mbGFnIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fb25jZTsKK2NvbnN0IDo6X3BiaTo6RGVzY3JpcHRvclRhYmxlIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8gPSB7CisgICAgZmFsc2UsIGZhbHNlLCA2MDc4LCBkZXNjcmlwdG9yX3RhYmxlX3Byb3RvZGVmX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvLAorICAgICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIsCisgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fb25jZSwgbnVsbHB0ciwgMCwgMjcsCisgICAgc2NoZW1hcywgZmlsZV9kZWZhdWx0X2luc3RhbmNlcywgVGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG86Om9mZnNldHMsCisgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bywgZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvLAorICAgIGZpbGVfbGV2ZWxfc2VydmljZV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bywKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfV0VBSyBjb25zdCA6Ol9wYmk6OkRlc2NyaXB0b3JUYWJsZSogZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19nZXR0ZXIoKSB7CisgIHJldHVybiAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bzsKK30KKworLy8gRm9yY2UgcnVubmluZyBBZGREZXNjcmlwdG9ycygpIGF0IGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gdGltZS4KK1BST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMiBzdGF0aWMgOjpfcGJpOjpBZGREZXNjcmlwdG9yc1J1bm5lciBkeW5hbWljX2luaXRfZHVtbXlfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8pOworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvciogRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9kZXNjcmlwdG9yKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFzc2lnbkRlc2NyaXB0b3JzKCZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKTsKKyAgcmV0dXJuIGZpbGVfbGV2ZWxfZW51bV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b1swXTsKK30KK2Jvb2wgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICBjYXNlIDM6CisgICAgY2FzZSA0OgorICAgIGNhc2UgNToKKyAgICBjYXNlIDY6CisgICAgY2FzZSA3OgorICAgIGNhc2UgODoKKyAgICBjYXNlIDk6CisgICAgY2FzZSAxMDoKKyAgICBjYXNlIDExOgorICAgIGNhc2UgMTI6CisgICAgY2FzZSAxMzoKKyAgICBjYXNlIDE0OgorICAgIGNhc2UgMTU6CisgICAgY2FzZSAxNjoKKyAgICBjYXNlIDE3OgorICAgIGNhc2UgMTg6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZiAoX19jcGx1c3BsdXMgPCAyMDE3MDMpICYmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDE5MDAgJiYgX01TQ19WRVIgPCAxOTEyKSkKK2NvbnN0ZXhwciBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0RPVUJMRTsKK2NvbnN0ZXhwciBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZMT0FUOworY29uc3RleHByIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UNjQ7Citjb25zdGV4cHIgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9VSU5UNjQ7Citjb25zdGV4cHIgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMjsKK2NvbnN0ZXhwciBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZJWEVENjQ7Citjb25zdGV4cHIgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9GSVhFRDMyOworY29uc3RleHByIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfQk9PTDsKK2NvbnN0ZXhwciBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORzsKK2NvbnN0ZXhwciBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0dST1VQOworY29uc3RleHByIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfTUVTU0FHRTsKK2NvbnN0ZXhwciBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0JZVEVTOworY29uc3RleHByIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfVUlOVDMyOworY29uc3RleHByIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTTsKK2NvbnN0ZXhwciBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NGSVhFRDMyOworY29uc3RleHByIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0ZJWEVENjQ7Citjb25zdGV4cHIgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TSU5UMzI7Citjb25zdGV4cHIgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TSU5UNjQ7Citjb25zdGV4cHIgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZV9NSU47Citjb25zdGV4cHIgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZV9NQVg7Citjb25zdGV4cHIgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlX0FSUkFZU0laRTsKKyNlbmRpZiAgLy8gKF9fY3BsdXNwbHVzIDwgMjAxNzAzKSAmJiAoIWRlZmluZWQoX01TQ19WRVIpIHx8IChfTVNDX1ZFUiA+PSAxOTAwICYmIF9NU0NfVkVSIDwgMTkxMikpCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2Rlc2NyaXB0b3IoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXNzaWduRGVzY3JpcHRvcnMoJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8pOworICByZXR1cm4gZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzFdOworfQorYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICBjYXNlIDM6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZiAoX19jcGx1c3BsdXMgPCAyMDE3MDMpICYmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDE5MDAgJiYgX01TQ19WRVIgPCAxOTEyKSkKK2NvbnN0ZXhwciBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUw7Citjb25zdGV4cHIgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUVVJUkVEOworY29uc3RleHByIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRDsKK2NvbnN0ZXhwciBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWxfTUlOOworY29uc3RleHByIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbF9NQVg7Citjb25zdGV4cHIgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbF9BUlJBWVNJWkU7CisjZW5kaWYgIC8vIChfX2NwbHVzcGx1cyA8IDIwMTcwMykgJiYgKCFkZWZpbmVkKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPj0gMTkwMCAmJiBfTVNDX1ZFUiA8IDE5MTIpKQorY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yKiBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfZGVzY3JpcHRvcigpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBc3NpZ25EZXNjcmlwdG9ycygmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90byk7CisgIHJldHVybiBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9bMl07Cit9Citib29sIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICBjYXNlIDM6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZiAoX19jcGx1c3BsdXMgPCAyMDE3MDMpICYmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDE5MDAgJiYgX01TQ19WRVIgPCAxOTEyKSkKK2NvbnN0ZXhwciBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnM6OlNQRUVEOworY29uc3RleHByIEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uczo6Q09ERV9TSVpFOworY29uc3RleHByIEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOworY29uc3RleHByIEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uczo6T3B0aW1pemVNb2RlX01JTjsKK2NvbnN0ZXhwciBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnM6Ok9wdGltaXplTW9kZV9NQVg7Citjb25zdGV4cHIgaW50IEZpbGVPcHRpb25zOjpPcHRpbWl6ZU1vZGVfQVJSQVlTSVpFOworI2VuZGlmICAvLyAoX19jcGx1c3BsdXMgPCAyMDE3MDMpICYmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDE5MDAgJiYgX01TQ19WRVIgPCAxOTEyKSkKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvciogRmllbGRPcHRpb25zX0NUeXBlX2Rlc2NyaXB0b3IoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXNzaWduRGVzY3JpcHRvcnMoJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8pOworICByZXR1cm4gZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzNdOworfQorYm9vbCBGaWVsZE9wdGlvbnNfQ1R5cGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKKyAgc3dpdGNoICh2YWx1ZSkgeworICAgIGNhc2UgMDoKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisjaWYgKF9fY3BsdXNwbHVzIDwgMjAxNzAzKSAmJiAoIWRlZmluZWQoX01TQ19WRVIpIHx8IChfTVNDX1ZFUiA+PSAxOTAwICYmIF9NU0NfVkVSIDwgMTkxMikpCitjb25zdGV4cHIgRmllbGRPcHRpb25zX0NUeXBlIEZpZWxkT3B0aW9uczo6U1RSSU5HOworY29uc3RleHByIEZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnM6OkNPUkQ7Citjb25zdGV4cHIgRmllbGRPcHRpb25zX0NUeXBlIEZpZWxkT3B0aW9uczo6U1RSSU5HX1BJRUNFOworY29uc3RleHByIEZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnM6OkNUeXBlX01JTjsKK2NvbnN0ZXhwciBGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zOjpDVHlwZV9NQVg7Citjb25zdGV4cHIgaW50IEZpZWxkT3B0aW9uczo6Q1R5cGVfQVJSQVlTSVpFOworI2VuZGlmICAvLyAoX19jcGx1c3BsdXMgPCAyMDE3MDMpICYmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDE5MDAgJiYgX01TQ19WRVIgPCAxOTEyKSkKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvciogRmllbGRPcHRpb25zX0pTVHlwZV9kZXNjcmlwdG9yKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFzc2lnbkRlc2NyaXB0b3JzKCZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKTsKKyAgcmV0dXJuIGZpbGVfbGV2ZWxfZW51bV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b1s0XTsKK30KK2Jvb2wgRmllbGRPcHRpb25zX0pTVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZiAoX19jcGx1c3BsdXMgPCAyMDE3MDMpICYmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDE5MDAgJiYgX01TQ19WRVIgPCAxOTEyKSkKK2NvbnN0ZXhwciBGaWVsZE9wdGlvbnNfSlNUeXBlIEZpZWxkT3B0aW9uczo6SlNfTk9STUFMOworY29uc3RleHByIEZpZWxkT3B0aW9uc19KU1R5cGUgRmllbGRPcHRpb25zOjpKU19TVFJJTkc7Citjb25zdGV4cHIgRmllbGRPcHRpb25zX0pTVHlwZSBGaWVsZE9wdGlvbnM6OkpTX05VTUJFUjsKK2NvbnN0ZXhwciBGaWVsZE9wdGlvbnNfSlNUeXBlIEZpZWxkT3B0aW9uczo6SlNUeXBlX01JTjsKK2NvbnN0ZXhwciBGaWVsZE9wdGlvbnNfSlNUeXBlIEZpZWxkT3B0aW9uczo6SlNUeXBlX01BWDsKK2NvbnN0ZXhwciBpbnQgRmllbGRPcHRpb25zOjpKU1R5cGVfQVJSQVlTSVpFOworI2VuZGlmICAvLyAoX19jcGx1c3BsdXMgPCAyMDE3MDMpICYmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDE5MDAgJiYgX01TQ19WRVIgPCAxOTEyKSkKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvciogTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsX2Rlc2NyaXB0b3IoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXNzaWduRGVzY3JpcHRvcnMoJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8pOworICByZXR1cm4gZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzVdOworfQorYm9vbCBNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWxfSXNWYWxpZChpbnQgdmFsdWUpIHsKKyAgc3dpdGNoICh2YWx1ZSkgeworICAgIGNhc2UgMDoKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisjaWYgKF9fY3BsdXNwbHVzIDwgMjAxNzAzKSAmJiAoIWRlZmluZWQoX01TQ19WRVIpIHx8IChfTVNDX1ZFUiA+PSAxOTAwICYmIF9NU0NfVkVSIDwgMTkxMikpCitjb25zdGV4cHIgTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsIE1ldGhvZE9wdGlvbnM6OklERU1QT1RFTkNZX1VOS05PV047Citjb25zdGV4cHIgTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsIE1ldGhvZE9wdGlvbnM6Ok5PX1NJREVfRUZGRUNUUzsKK2NvbnN0ZXhwciBNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWwgTWV0aG9kT3B0aW9uczo6SURFTVBPVEVOVDsKK2NvbnN0ZXhwciBNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWwgTWV0aG9kT3B0aW9uczo6SWRlbXBvdGVuY3lMZXZlbF9NSU47Citjb25zdGV4cHIgTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsIE1ldGhvZE9wdGlvbnM6OklkZW1wb3RlbmN5TGV2ZWxfTUFYOworY29uc3RleHByIGludCBNZXRob2RPcHRpb25zOjpJZGVtcG90ZW5jeUxldmVsX0FSUkFZU0laRTsKKyNlbmRpZiAgLy8gKF9fY3BsdXNwbHVzIDwgMjAxNzAzKSAmJiAoIWRlZmluZWQoX01TQ19WRVIpIHx8IChfTVNDX1ZFUiA+PSAxOTAwICYmIF9NU0NfVkVSIDwgMTkxMikpCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgRmlsZURlc2NyaXB0b3JTZXQ6Ol9JbnRlcm5hbCB7CisgcHVibGljOgorfTsKKworRmlsZURlc2NyaXB0b3JTZXQ6OkZpbGVEZXNjcmlwdG9yU2V0KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQorfQorRmlsZURlc2NyaXB0b3JTZXQ6OkZpbGVEZXNjcmlwdG9yU2V0KGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBGaWxlRGVzY3JpcHRvclNldCogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5maWxlXyl7ZnJvbS5faW1wbF8uZmlsZV99CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKK30KKworaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLmZpbGVfKXthcmVuYX0KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICB9OworfQorCitGaWxlRGVzY3JpcHRvclNldDo6fkZpbGVEZXNjcmlwdG9yU2V0KCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclNldDo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKKyAgX2ltcGxfLmZpbGVfLn5SZXBlYXRlZFB0ckZpZWxkKCk7Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLmZpbGVfLkNsZWFyKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogRmlsZURlc2NyaXB0b3JTZXQ6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTApKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfYWRkX2ZpbGUoKSwgcHRyKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDEwPihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBGaWxlRGVzY3JpcHRvclNldDo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfZmlsZV9zaXplKCkpOyBpIDwgbjsgaSsrKSB7CisgICAgY29uc3QgYXV0byYgcmVwZmllbGQgPSB0aGlzLT5faW50ZXJuYWxfZmlsZShpKTsKKyAgICB0YXJnZXQgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoMSwgcmVwZmllbGQsIHJlcGZpZWxkLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgRmlsZURlc2NyaXB0b3JTZXQ6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZSA9IDE7CisgIHRvdGFsX3NpemUgKz0gMVVMICogdGhpcy0+X2ludGVybmFsX2ZpbGVfc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy5maWxlXykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKG1zZyk7CisgIH0KKworICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBGaWxlRGVzY3JpcHRvclNldDo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIEZpbGVEZXNjcmlwdG9yU2V0OjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkZpbGVEZXNjcmlwdG9yU2V0OjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBGaWxlRGVzY3JpcHRvclNldDo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PEZpbGVEZXNjcmlwdG9yU2V0Kj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBGaWxlRGVzY3JpcHRvclNldCY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX3RoaXMtPl9pbXBsXy5maWxlXy5NZXJnZUZyb20oZnJvbS5faW1wbF8uZmlsZV8pOworICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclNldDo6Q29weUZyb20oY29uc3QgRmlsZURlc2NyaXB0b3JTZXQmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRmlsZURlc2NyaXB0b3JTZXQ6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIGlmICghOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZChfaW1wbF8uZmlsZV8pKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OkludGVybmFsU3dhcChGaWxlRGVzY3JpcHRvclNldCogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8uZmlsZV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLmZpbGVfKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEZpbGVEZXNjcmlwdG9yU2V0OjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzBdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBGaWxlRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKKyAgdXNpbmcgSGFzQml0cyA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxGaWxlRGVzY3JpcHRvclByb3RvPigpLl9pbXBsXy5faGFzX2JpdHNfKTsKKyAgc3RhdGljIHZvaWQgc2V0X2hhc19uYW1lKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMXU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19wYWNrYWdlKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMnU7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucyYgb3B0aW9ucyhjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBtc2cpOworICBzdGF0aWMgdm9pZCBzZXRfaGFzX29wdGlvbnMoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSA4dTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvZGVJbmZvJiBzb3VyY2VfY29kZV9pbmZvKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIG1zZyk7CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfc291cmNlX2NvZGVfaW5mbyhIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDE2dTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX3N5bnRheChIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDR1OworICB9Cit9OworCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMmCitGaWxlRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWw6Om9wdGlvbnMoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogbXNnKSB7CisgIHJldHVybiAqbXNnLT5faW1wbF8ub3B0aW9uc187Cit9Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm8mCitGaWxlRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWw6OnNvdXJjZV9jb2RlX2luZm8oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogbXNnKSB7CisgIHJldHVybiAqbXNnLT5faW1wbF8uc291cmNlX2NvZGVfaW5mb187Cit9CitGaWxlRGVzY3JpcHRvclByb3RvOjpGaWxlRGVzY3JpcHRvclByb3RvKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCit9CitGaWxlRGVzY3JpcHRvclByb3RvOjpGaWxlRGVzY3JpcHRvclByb3RvKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnN0IF90aGlzID0gdGhpczsgKHZvaWQpX3RoaXM7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXyl7ZnJvbS5faW1wbF8uX2hhc19iaXRzX30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmRlcGVuZGVuY3lfKXtmcm9tLl9pbXBsXy5kZXBlbmRlbmN5X30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5tZXNzYWdlX3R5cGVfKXtmcm9tLl9pbXBsXy5tZXNzYWdlX3R5cGVffQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmVudW1fdHlwZV8pe2Zyb20uX2ltcGxfLmVudW1fdHlwZV99CisgICAgLCBkZWNsdHlwZShfaW1wbF8uc2VydmljZV8pe2Zyb20uX2ltcGxfLnNlcnZpY2VffQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmV4dGVuc2lvbl8pe2Zyb20uX2ltcGxfLmV4dGVuc2lvbl99CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucHVibGljX2RlcGVuZGVuY3lfKXtmcm9tLl9pbXBsXy5wdWJsaWNfZGVwZW5kZW5jeV99CisgICAgLCBkZWNsdHlwZShfaW1wbF8ud2Vha19kZXBlbmRlbmN5Xyl7ZnJvbS5faW1wbF8ud2Vha19kZXBlbmRlbmN5X30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnBhY2thZ2VfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uc3ludGF4Xyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKXtudWxscHRyfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnNvdXJjZV9jb2RlX2luZm9fKXtudWxscHRyfX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX2ltcGxfLm5hbWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX25hbWUoKSkgeworICAgIF90aGlzLT5faW1wbF8ubmFtZV8uU2V0KGZyb20uX2ludGVybmFsX25hbWUoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIF9pbXBsXy5wYWNrYWdlXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5wYWNrYWdlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19wYWNrYWdlKCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLnBhY2thZ2VfLlNldChmcm9tLl9pbnRlcm5hbF9wYWNrYWdlKCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICBfaW1wbF8uc3ludGF4Xy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5zeW50YXhfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX3N5bnRheCgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5zeW50YXhfLlNldChmcm9tLl9pbnRlcm5hbF9zeW50YXgoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfb3B0aW9ucygpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5vcHRpb25zXyA9IG5ldyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMoKmZyb20uX2ltcGxfLm9wdGlvbnNfKTsKKyAgfQorICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX3NvdXJjZV9jb2RlX2luZm8oKSkgeworICAgIF90aGlzLT5faW1wbF8uc291cmNlX2NvZGVfaW5mb18gPSBuZXcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvZGVJbmZvKCpmcm9tLl9pbXBsXy5zb3VyY2VfY29kZV9pbmZvXyk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCit9CisKK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmRlcGVuZGVuY3lfKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5tZXNzYWdlX3R5cGVfKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5lbnVtX3R5cGVfKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zZXJ2aWNlXyl7YXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZXh0ZW5zaW9uXyl7YXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucHVibGljX2RlcGVuZGVuY3lfKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy53ZWFrX2RlcGVuZGVuY3lfKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnBhY2thZ2VfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uc3ludGF4Xyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKXtudWxscHRyfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnNvdXJjZV9jb2RlX2luZm9fKXtudWxscHRyfQorICB9OworICBfaW1wbF8ubmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIF9pbXBsXy5wYWNrYWdlXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5wYWNrYWdlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgX2ltcGxfLnN5bnRheF8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8uc3ludGF4Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKK30KKworRmlsZURlc2NyaXB0b3JQcm90bzo6fkZpbGVEZXNjcmlwdG9yUHJvdG8oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKKyAgX2ltcGxfLmRlcGVuZGVuY3lfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5tZXNzYWdlX3R5cGVfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5lbnVtX3R5cGVfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5zZXJ2aWNlXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworICBfaW1wbF8uZXh0ZW5zaW9uXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworICBfaW1wbF8ucHVibGljX2RlcGVuZGVuY3lfLn5SZXBlYXRlZEZpZWxkKCk7CisgIF9pbXBsXy53ZWFrX2RlcGVuZGVuY3lfLn5SZXBlYXRlZEZpZWxkKCk7CisgIF9pbXBsXy5uYW1lXy5EZXN0cm95KCk7CisgIF9pbXBsXy5wYWNrYWdlXy5EZXN0cm95KCk7CisgIF9pbXBsXy5zeW50YXhfLkRlc3Ryb3koKTsKKyAgaWYgKHRoaXMgIT0gaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpKSBkZWxldGUgX2ltcGxfLm9wdGlvbnNfOworICBpZiAodGhpcyAhPSBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkpIGRlbGV0ZSBfaW1wbF8uc291cmNlX2NvZGVfaW5mb187Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLmRlcGVuZGVuY3lfLkNsZWFyKCk7CisgIF9pbXBsXy5tZXNzYWdlX3R5cGVfLkNsZWFyKCk7CisgIF9pbXBsXy5lbnVtX3R5cGVfLkNsZWFyKCk7CisgIF9pbXBsXy5zZXJ2aWNlXy5DbGVhcigpOworICBfaW1wbF8uZXh0ZW5zaW9uXy5DbGVhcigpOworICBfaW1wbF8ucHVibGljX2RlcGVuZGVuY3lfLkNsZWFyKCk7CisgIF9pbXBsXy53ZWFrX2RlcGVuZGVuY3lfLkNsZWFyKCk7CisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAxZnUpIHsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIF9pbXBsXy5uYW1lXy5DbGVhck5vbkRlZmF1bHRUb0VtcHR5KCk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgICAgX2ltcGxfLnBhY2thZ2VfLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICBfaW1wbF8uc3ludGF4Xy5DbGVhck5vbkRlZmF1bHRUb0VtcHR5KCk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA4dSkgeworICAgICAgR09PR0xFX0RDSEVDSyhfaW1wbF8ub3B0aW9uc18gIT0gbnVsbHB0cik7CisgICAgICBfaW1wbF8ub3B0aW9uc18tPkNsZWFyKCk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDEwdSkgeworICAgICAgR09PR0xFX0RDSEVDSyhfaW1wbF8uc291cmNlX2NvZGVfaW5mb18gIT0gbnVsbHB0cik7CisgICAgICBfaW1wbF8uc291cmNlX2NvZGVfaW5mb18tPkNsZWFyKCk7CisgICAgfQorICB9CisgIF9pbXBsXy5faGFzX2JpdHNfLkNsZWFyKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogRmlsZURlc2NyaXB0b3JQcm90bzo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICBfSW50ZXJuYWw6Okhhc0JpdHMgaGFzX2JpdHN7fTsKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTApKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxOCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX3BhY2thZ2UoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICA6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZSIpOworICAgICAgICAgICNlbmRpZiAgLy8gIU5ERUJVRworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHJlcGVhdGVkIHN0cmluZyBkZXBlbmRlbmN5ID0gMzsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDI2KSkgeworICAgICAgICAgIHB0ciAtPSAxOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfYWRkX2RlcGVuZGVuY3koKTsKKyAgICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5Iik7CisgICAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDI2PihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OworICAgICAgY2FzZSA0OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMzQpKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfYWRkX21lc3NhZ2VfdHlwZSgpLCBwdHIpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8MzQ+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OworICAgICAgY2FzZSA1OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNDIpKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfYWRkX2VudW1fdHlwZSgpLCBwdHIpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8NDI+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90byBzZXJ2aWNlID0gNjsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDUwKSkgeworICAgICAgICAgIHB0ciAtPSAxOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX2FkZF9zZXJ2aWNlKCksIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzw1MD4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA3OworICAgICAgY2FzZSA3OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNTgpKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfYWRkX2V4dGVuc2lvbigpLCBwdHIpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8NTg+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgb3B0aW9ucyA9IDg7CisgICAgICBjYXNlIDg6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA2NikpIHsKKyAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCksIHB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7CisgICAgICBjYXNlIDk6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA3NCkpIHsKKyAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfbXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCksIHB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHJlcGVhdGVkIGludDMyIHB1YmxpY19kZXBlbmRlbmN5ID0gMTA7CisgICAgICBjYXNlIDEwOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gODApKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBfaW50ZXJuYWxfYWRkX3B1YmxpY19kZXBlbmRlbmN5KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDMyKCZwdHIpKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDgwPihwdHIpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDgyKSB7CisgICAgICAgICAgcHRyID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYWNrZWRJbnQzMlBhcnNlcihfaW50ZXJuYWxfbXV0YWJsZV9wdWJsaWNfZGVwZW5kZW5jeSgpLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHJlcGVhdGVkIGludDMyIHdlYWtfZGVwZW5kZW5jeSA9IDExOworICAgICAgY2FzZSAxMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDg4KSkgeworICAgICAgICAgIHB0ciAtPSAxOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgX2ludGVybmFsX2FkZF93ZWFrX2RlcGVuZGVuY3koOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50MzIoJnB0cikpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8ODg+KHB0cikpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gOTApIHsKKyAgICAgICAgICBwdHIgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhY2tlZEludDMyUGFyc2VyKF9pbnRlcm5hbF9tdXRhYmxlX3dlYWtfZGVwZW5kZW5jeSgpLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBzeW50YXggPSAxMjsKKyAgICAgIGNhc2UgMTI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA5OCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX3N5bnRheCgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAjaWZuZGVmIE5ERUJVRworICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zeW50YXgiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICBfaW1wbF8uX2hhc19iaXRzXy5PcihoYXNfYml0cyk7CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDEsIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICB0aGlzLT5faW50ZXJuYWxfcGFja2FnZSgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pih0aGlzLT5faW50ZXJuYWxfcGFja2FnZSgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICAyLCB0aGlzLT5faW50ZXJuYWxfcGFja2FnZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOworICBmb3IgKGludCBpID0gMCwgbiA9IHRoaXMtPl9pbnRlcm5hbF9kZXBlbmRlbmN5X3NpemUoKTsgaSA8IG47IGkrKykgeworICAgIGNvbnN0IGF1dG8mIHMgPSB0aGlzLT5faW50ZXJuYWxfZGVwZW5kZW5jeShpKTsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgcy5kYXRhKCksIHN0YXRpY19jYXN0PGludD4ocy5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5Iik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZygzLCBzLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwKKyAgICAgIG4gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4odGhpcy0+X2ludGVybmFsX21lc3NhZ2VfdHlwZV9zaXplKCkpOyBpIDwgbjsgaSsrKSB7CisgICAgY29uc3QgYXV0byYgcmVwZmllbGQgPSB0aGlzLT5faW50ZXJuYWxfbWVzc2FnZV90eXBlKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg0LCByZXBmaWVsZCwgcmVwZmllbGQuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwKKyAgICAgIG4gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4odGhpcy0+X2ludGVybmFsX2VudW1fdHlwZV9zaXplKCkpOyBpIDwgbjsgaSsrKSB7CisgICAgY29uc3QgYXV0byYgcmVwZmllbGQgPSB0aGlzLT5faW50ZXJuYWxfZW51bV90eXBlKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg1LCByZXBmaWVsZCwgcmVwZmllbGQuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2VydmljZSA9IDY7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9zZXJ2aWNlX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9zZXJ2aWNlKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg2LCByZXBmaWVsZCwgcmVwZmllbGQuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDc7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9leHRlbnNpb25fc2l6ZSgpKTsgaSA8IG47IGkrKykgeworICAgIGNvbnN0IGF1dG8mIHJlcGZpZWxkID0gdGhpcy0+X2ludGVybmFsX2V4dGVuc2lvbihpKTsKKyAgICB0YXJnZXQgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoNywgcmVwZmllbGQsIHJlcGZpZWxkLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyBvcHRpb25zID0gODsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg4LCBfSW50ZXJuYWw6Om9wdGlvbnModGhpcyksCisgICAgICAgIF9JbnRlcm5hbDo6b3B0aW9ucyh0aGlzKS5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDEwdSkgeworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoOSwgX0ludGVybmFsOjpzb3VyY2VfY29kZV9pbmZvKHRoaXMpLAorICAgICAgICBfSW50ZXJuYWw6OnNvdXJjZV9jb2RlX2luZm8odGhpcykuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICAvLyByZXBlYXRlZCBpbnQzMiBwdWJsaWNfZGVwZW5kZW5jeSA9IDEwOworICBmb3IgKGludCBpID0gMCwgbiA9IHRoaXMtPl9pbnRlcm5hbF9wdWJsaWNfZGVwZW5kZW5jeV9zaXplKCk7IGkgPCBuOyBpKyspIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMTAsIHRoaXMtPl9pbnRlcm5hbF9wdWJsaWNfZGVwZW5kZW5jeShpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIGludDMyIHdlYWtfZGVwZW5kZW5jeSA9IDExOworICBmb3IgKGludCBpID0gMCwgbiA9IHRoaXMtPl9pbnRlcm5hbF93ZWFrX2RlcGVuZGVuY3lfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDExLCB0aGlzLT5faW50ZXJuYWxfd2Vha19kZXBlbmRlbmN5KGkpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHN5bnRheCA9IDEyOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwNHUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX3N5bnRheCgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pih0aGlzLT5faW50ZXJuYWxfc3ludGF4KCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4Iik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgMTIsIHRoaXMtPl9pbnRlcm5hbF9zeW50YXgoKSwgdGFyZ2V0KTsKKyAgfQorCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSkgeworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdDo6SW50ZXJuYWxTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgRmlsZURlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQorICBzaXplX3QgdG90YWxfc2l6ZSA9IDA7CisKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOworICB0b3RhbF9zaXplICs9IDEgKgorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGcm9tSW50U2l6ZShfaW1wbF8uZGVwZW5kZW5jeV8uc2l6ZSgpKTsKKyAgZm9yIChpbnQgaSA9IDAsIG4gPSBfaW1wbF8uZGVwZW5kZW5jeV8uc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgX2ltcGxfLmRlcGVuZGVuY3lfLkdldChpKSk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OworICB0b3RhbF9zaXplICs9IDFVTCAqIHRoaXMtPl9pbnRlcm5hbF9tZXNzYWdlX3R5cGVfc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy5tZXNzYWdlX3R5cGVfKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUobXNnKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OworICB0b3RhbF9zaXplICs9IDFVTCAqIHRoaXMtPl9pbnRlcm5hbF9lbnVtX3R5cGVfc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy5lbnVtX3R5cGVfKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUobXNnKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90byBzZXJ2aWNlID0gNjsKKyAgdG90YWxfc2l6ZSArPSAxVUwgKiB0aGlzLT5faW50ZXJuYWxfc2VydmljZV9zaXplKCk7CisgIGZvciAoY29uc3QgYXV0byYgbXNnIDogdGhpcy0+X2ltcGxfLnNlcnZpY2VfKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUobXNnKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNzsKKyAgdG90YWxfc2l6ZSArPSAxVUwgKiB0aGlzLT5faW50ZXJuYWxfZXh0ZW5zaW9uX3NpemUoKTsKKyAgZm9yIChjb25zdCBhdXRvJiBtc2cgOiB0aGlzLT5faW1wbF8uZXh0ZW5zaW9uXykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKG1zZyk7CisgIH0KKworICAvLyByZXBlYXRlZCBpbnQzMiBwdWJsaWNfZGVwZW5kZW5jeSA9IDEwOworICB7CisgICAgc2l6ZV90IGRhdGFfc2l6ZSA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgSW50MzJTaXplKHRoaXMtPl9pbXBsXy5wdWJsaWNfZGVwZW5kZW5jeV8pOworICAgIHRvdGFsX3NpemUgKz0gMSAqCisgICAgICAgICAgICAgICAgICA6Ol9wYmk6OkZyb21JbnRTaXplKHRoaXMtPl9pbnRlcm5hbF9wdWJsaWNfZGVwZW5kZW5jeV9zaXplKCkpOworICAgIHRvdGFsX3NpemUgKz0gZGF0YV9zaXplOworICB9CisKKyAgLy8gcmVwZWF0ZWQgaW50MzIgd2Vha19kZXBlbmRlbmN5ID0gMTE7CisgIHsKKyAgICBzaXplX3QgZGF0YV9zaXplID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBJbnQzMlNpemUodGhpcy0+X2ltcGxfLndlYWtfZGVwZW5kZW5jeV8pOworICAgIHRvdGFsX3NpemUgKz0gMSAqCisgICAgICAgICAgICAgICAgICA6Ol9wYmk6OkZyb21JbnRTaXplKHRoaXMtPl9pbnRlcm5hbF93ZWFrX2RlcGVuZGVuY3lfc2l6ZSgpKTsKKyAgICB0b3RhbF9zaXplICs9IGRhdGFfc2l6ZTsKKyAgfQorCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAxZnUpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMjsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+X2ludGVybmFsX3BhY2thZ2UoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHN5bnRheCA9IDEyOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA0dSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5faW50ZXJuYWxfc3ludGF4KCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgb3B0aW9ucyA9IDg7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZSgKKyAgICAgICAgICAqX2ltcGxfLm9wdGlvbnNfKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm8gPSA5OworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDEwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUoCisgICAgICAgICAgKl9pbXBsXy5zb3VyY2VfY29kZV9pbmZvXyk7CisgICAgfQorCisgIH0KKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgRmlsZURlc2NyaXB0b3JQcm90bzo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqRmlsZURlc2NyaXB0b3JQcm90bzo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PEZpbGVEZXNjcmlwdG9yUHJvdG8qPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX3RoaXMtPl9pbXBsXy5kZXBlbmRlbmN5Xy5NZXJnZUZyb20oZnJvbS5faW1wbF8uZGVwZW5kZW5jeV8pOworICBfdGhpcy0+X2ltcGxfLm1lc3NhZ2VfdHlwZV8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLm1lc3NhZ2VfdHlwZV8pOworICBfdGhpcy0+X2ltcGxfLmVudW1fdHlwZV8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLmVudW1fdHlwZV8pOworICBfdGhpcy0+X2ltcGxfLnNlcnZpY2VfLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5zZXJ2aWNlXyk7CisgIF90aGlzLT5faW1wbF8uZXh0ZW5zaW9uXy5NZXJnZUZyb20oZnJvbS5faW1wbF8uZXh0ZW5zaW9uXyk7CisgIF90aGlzLT5faW1wbF8ucHVibGljX2RlcGVuZGVuY3lfLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5wdWJsaWNfZGVwZW5kZW5jeV8pOworICBfdGhpcy0+X2ltcGxfLndlYWtfZGVwZW5kZW5jeV8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLndlYWtfZGVwZW5kZW5jeV8pOworICBjYWNoZWRfaGFzX2JpdHMgPSBmcm9tLl9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAxZnUpIHsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X25hbWUoZnJvbS5faW50ZXJuYWxfbmFtZSgpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9wYWNrYWdlKGZyb20uX2ludGVybmFsX3BhY2thZ2UoKSk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA0dSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfc3ludGF4KGZyb20uX2ludGVybmFsX3N5bnRheCgpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX211dGFibGVfb3B0aW9ucygpLT46OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnM6Ok1lcmdlRnJvbSgKKyAgICAgICAgICBmcm9tLl9pbnRlcm5hbF9vcHRpb25zKCkpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAxMHUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfbXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCktPjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbzo6TWVyZ2VGcm9tKAorICAgICAgICAgIGZyb20uX2ludGVybmFsX3NvdXJjZV9jb2RlX2luZm8oKSk7CisgICAgfQorICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICBpZiAoITo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQoX2ltcGxfLm1lc3NhZ2VfdHlwZV8pKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCE6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKF9pbXBsXy5lbnVtX3R5cGVfKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZChfaW1wbF8uc2VydmljZV8pKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCE6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKF9pbXBsXy5leHRlbnNpb25fKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChfaW50ZXJuYWxfaGFzX29wdGlvbnMoKSkgeworICAgIGlmICghX2ltcGxfLm9wdGlvbnNfLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpJbnRlcm5hbFN3YXAoRmlsZURlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBhdXRvKiBsaHNfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgYXV0byogcmhzX2FyZW5hID0gb3RoZXItPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzd2FwKF9pbXBsXy5faGFzX2JpdHNfWzBdLCBvdGhlci0+X2ltcGxfLl9oYXNfYml0c19bMF0pOworICBfaW1wbF8uZGVwZW5kZW5jeV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLmRlcGVuZGVuY3lfKTsKKyAgX2ltcGxfLm1lc3NhZ2VfdHlwZV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLm1lc3NhZ2VfdHlwZV8pOworICBfaW1wbF8uZW51bV90eXBlXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8uZW51bV90eXBlXyk7CisgIF9pbXBsXy5zZXJ2aWNlXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8uc2VydmljZV8pOworICBfaW1wbF8uZXh0ZW5zaW9uXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8uZXh0ZW5zaW9uXyk7CisgIF9pbXBsXy5wdWJsaWNfZGVwZW5kZW5jeV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLnB1YmxpY19kZXBlbmRlbmN5Xyk7CisgIF9pbXBsXy53ZWFrX2RlcGVuZGVuY3lfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy53ZWFrX2RlcGVuZGVuY3lfKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5uYW1lXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8ubmFtZV8sIHJoc19hcmVuYQorICApOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLnBhY2thZ2VfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5wYWNrYWdlXywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8uc3ludGF4XywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8uc3ludGF4XywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6bWVtc3dhcDwKKyAgICAgIFBST1RPQlVGX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBfaW1wbF8uc291cmNlX2NvZGVfaW5mb18pCisgICAgICArIHNpemVvZihGaWxlRGVzY3JpcHRvclByb3RvOjpfaW1wbF8uc291cmNlX2NvZGVfaW5mb18pCisgICAgICAtIFBST1RPQlVGX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBfaW1wbF8ub3B0aW9uc18pPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLm9wdGlvbnNfKSwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmb3RoZXItPl9pbXBsXy5vcHRpb25zXykpOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgRmlsZURlc2NyaXB0b3JQcm90bzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19vbmNlLAorICAgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b1sxXSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKKyAgdXNpbmcgSGFzQml0cyA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U+KCkuX2ltcGxfLl9oYXNfYml0c18pOworICBzdGF0aWMgdm9pZCBzZXRfaGFzX3N0YXJ0KEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMnU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19lbmQoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSA0dTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkV4dGVuc2lvblJhbmdlT3B0aW9ucyYgb3B0aW9ucyhjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIG1zZyk7CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfb3B0aW9ucyhIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDF1OworICB9Cit9OworCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zJgorRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpfSW50ZXJuYWw6Om9wdGlvbnMoY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBtc2cpIHsKKyAgcmV0dXJuICptc2ctPl9pbXBsXy5vcHRpb25zXzsKK30KK0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKK30KK0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe2Zyb20uX2ltcGxfLl9oYXNfYml0c199CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXyl7bnVsbHB0cn0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zdGFydF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5lbmRfKXt9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX29wdGlvbnMoKSkgeworICAgIF90aGlzLT5faW1wbF8ub3B0aW9uc18gPSBuZXcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkV4dGVuc2lvblJhbmdlT3B0aW9ucygqZnJvbS5faW1wbF8ub3B0aW9uc18pOworICB9CisgIDo6bWVtY3B5KCZfaW1wbF8uc3RhcnRfLCAmZnJvbS5faW1wbF8uc3RhcnRfLAorICAgIHN0YXRpY19jYXN0PHNpemVfdD4ocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5lbmRfKSAtCisgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5zdGFydF8pKSArIHNpemVvZihfaW1wbF8uZW5kXykpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQorfQorCitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKXtudWxscHRyfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnN0YXJ0Xyl7MH0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5lbmRfKXswfQorICB9OworfQorCitEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6On5EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIGlmICh0aGlzICE9IGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSkgZGVsZXRlIF9pbXBsXy5vcHRpb25zXzsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgR09PR0xFX0RDSEVDSyhfaW1wbF8ub3B0aW9uc18gIT0gbnVsbHB0cik7CisgICAgX2ltcGxfLm9wdGlvbnNfLT5DbGVhcigpOworICB9CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA2dSkgeworICAgIDo6bWVtc2V0KCZfaW1wbF8uc3RhcnRfLCAwLCBzdGF0aWNfY2FzdDxzaXplX3Q+KAorICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLmVuZF8pIC0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5zdGFydF8pKSArIHNpemVvZihfaW1wbF8uZW5kXykpOworICB9CisgIF9pbXBsXy5faGFzX2JpdHNfLkNsZWFyKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIF9JbnRlcm5hbDo6SGFzQml0cyBoYXNfYml0c3t9OworICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA4KSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19zdGFydCgmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy5zdGFydF8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQzMigmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDE2KSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19lbmQoJmhhc19iaXRzKTsKKyAgICAgICAgICBfaW1wbF8uZW5kXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDMyKCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDI2KSkgeworICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKSwgcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICB9ICAvLyBzd2l0Y2gKKyAgaGFuZGxlX3VudXN1YWw6CisgICAgaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkgeworICAgICAgQ0hLXyhwdHIpOworICAgICAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7CisgICAgICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgX2ltcGxfLl9oYXNfYml0c18uT3IoaGFzX2JpdHMpOworICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMSwgdGhpcy0+X2ludGVybmFsX3N0YXJ0KCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwNHUpIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMiwgdGhpcy0+X2ludGVybmFsX2VuZCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMgb3B0aW9ucyA9IDM7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoMywgX0ludGVybmFsOjpvcHRpb25zKHRoaXMpLAorICAgICAgICBfSW50ZXJuYWw6Om9wdGlvbnModGhpcykuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwN3UpIHsKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKAorICAgICAgICAgICpfaW1wbF8ub3B0aW9uc18pOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplUGx1c09uZSh0aGlzLT5faW50ZXJuYWxfc3RhcnQoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwNHUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplUGx1c09uZSh0aGlzLT5faW50ZXJuYWxfZW5kKCkpOworICAgIH0KKworICB9CisgIHJldHVybiBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCAmX2ltcGxfLl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH0KKworCit2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJj4oZnJvbV9tc2cpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgY2FjaGVkX2hhc19iaXRzID0gZnJvbS5faW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDd1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX211dGFibGVfb3B0aW9ucygpLT46OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjpNZXJnZUZyb20oCisgICAgICAgICAgZnJvbS5faW50ZXJuYWxfb3B0aW9ucygpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLnN0YXJ0XyA9IGZyb20uX2ltcGxfLnN0YXJ0XzsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLmVuZF8gPSBmcm9tLl9pbXBsXy5lbmRfOworICAgIH0KKyAgICBfdGhpcy0+X2ltcGxfLl9oYXNfYml0c19bMF0gfD0gY2FjaGVkX2hhc19iaXRzOworICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Q29weUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIGlmIChfaW50ZXJuYWxfaGFzX29wdGlvbnMoKSkgeworICAgIGlmICghX2ltcGxfLm9wdGlvbnNfLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OkludGVybmFsU3dhcChEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3dhcChfaW1wbF8uX2hhc19iaXRzX1swXSwgb3RoZXItPl9pbXBsXy5faGFzX2JpdHNfWzBdKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjptZW1zd2FwPAorICAgICAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSwgX2ltcGxfLmVuZF8pCisgICAgICArIHNpemVvZihEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Ol9pbXBsXy5lbmRfKQorICAgICAgLSBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlLCBfaW1wbF8ub3B0aW9uc18pPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLm9wdGlvbnNfKSwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmb3RoZXItPl9pbXBsXy5vcHRpb25zXykpOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzJdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6X0ludGVybmFsIHsKKyBwdWJsaWM6CisgIHVzaW5nIEhhc0JpdHMgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U+KCkuX2ltcGxfLl9oYXNfYml0c18pOworICBzdGF0aWMgdm9pZCBzZXRfaGFzX3N0YXJ0KEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMXU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19lbmQoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAydTsKKyAgfQorfTsKKworRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQorfQorRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKGNvbnN0IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXtmcm9tLl9pbXBsXy5faGFzX2JpdHNffQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uc3RhcnRfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZW5kXyl7fX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgOjptZW1jcHkoJl9pbXBsXy5zdGFydF8sICZmcm9tLl9pbXBsXy5zdGFydF8sCisgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLmVuZF8pIC0KKyAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLnN0YXJ0XykpICsgc2l6ZW9mKF9pbXBsXy5lbmRfKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKK30KKworaW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnN0YXJ0Xyl7MH0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5lbmRfKXswfQorICB9OworfQorCitEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6fkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDN1KSB7CisgICAgOjptZW1zZXQoJl9pbXBsXy5zdGFydF8sIDAsIHN0YXRpY19jYXN0PHNpemVfdD4oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uZW5kXykgLQorICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLnN0YXJ0XykpICsgc2l6ZW9mKF9pbXBsXy5lbmRfKSk7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c18uQ2xlYXIoKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5DbGVhcjw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworfQorCitjb25zdCBjaGFyKiBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICBfSW50ZXJuYWw6Okhhc0JpdHMgaGFzX2JpdHN7fTsKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gOCkpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfc3RhcnQoJmhhc19iaXRzKTsKKyAgICAgICAgICBfaW1wbF8uc3RhcnRfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50MzIoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxNikpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfZW5kKCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLmVuZF8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQzMigmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICB9ICAvLyBzd2l0Y2gKKyAgaGFuZGxlX3VudXN1YWw6CisgICAgaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkgeworICAgICAgQ0hLXyhwdHIpOworICAgICAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7CisgICAgICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgX2ltcGxfLl9oYXNfYml0c18uT3IoaGFzX2JpdHMpOworICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDEsIHRoaXMtPl9pbnRlcm5hbF9zdGFydCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDIsIHRoaXMtPl9pbnRlcm5hbF9lbmQoKSwgdGFyZ2V0KTsKKyAgfQorCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSkgeworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdDo6SW50ZXJuYWxTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQorICBzaXplX3QgdG90YWxfc2l6ZSA9IDA7CisKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAzdSkgeworICAgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplUGx1c09uZSh0aGlzLT5faW50ZXJuYWxfc3RhcnQoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplUGx1c09uZSh0aGlzLT5faW50ZXJuYWxfZW5kKCkpOworICAgIH0KKworICB9CisgIHJldHVybiBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCAmX2ltcGxfLl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH0KKworCit2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJj4oZnJvbV9tc2cpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBmcm9tLl9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwM3UpIHsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8uc3RhcnRfID0gZnJvbS5faW1wbF8uc3RhcnRfOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8uZW5kXyA9IGZyb20uX2ltcGxfLmVuZF87CisgICAgfQorICAgIF90aGlzLT5faW1wbF8uX2hhc19iaXRzX1swXSB8PSBjYWNoZWRfaGFzX2JpdHM7CisgIH0KKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OkNvcHlGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6SW50ZXJuYWxTd2FwKERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN3YXAoX2ltcGxfLl9oYXNfYml0c19bMF0sIG90aGVyLT5faW1wbF8uX2hhc19iaXRzX1swXSk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6bWVtc3dhcDwKKyAgICAgIFBST1RPQlVGX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSwgX2ltcGxfLmVuZF8pCisgICAgICArIHNpemVvZihEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6X2ltcGxfLmVuZF8pCisgICAgICAtIFBST1RPQlVGX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSwgX2ltcGxfLnN0YXJ0Xyk+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uc3RhcnRfKSwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmb3RoZXItPl9pbXBsXy5zdGFydF8pKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzNdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBEZXNjcmlwdG9yUHJvdG86Ol9JbnRlcm5hbCB7CisgcHVibGljOgorICB1c2luZyBIYXNCaXRzID0gZGVjbHR5cGUoc3RkOjpkZWNsdmFsPERlc2NyaXB0b3JQcm90bz4oKS5faW1wbF8uX2hhc19iaXRzXyk7CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfbmFtZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDF1OworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZU9wdGlvbnMmIG9wdGlvbnMoY29uc3QgRGVzY3JpcHRvclByb3RvKiBtc2cpOworICBzdGF0aWMgdm9pZCBzZXRfaGFzX29wdGlvbnMoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAydTsKKyAgfQorfTsKKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zJgorRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWw6Om9wdGlvbnMoY29uc3QgRGVzY3JpcHRvclByb3RvKiBtc2cpIHsKKyAgcmV0dXJuICptc2ctPl9pbXBsXy5vcHRpb25zXzsKK30KK0Rlc2NyaXB0b3JQcm90bzo6RGVzY3JpcHRvclByb3RvKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKK30KK0Rlc2NyaXB0b3JQcm90bzo6RGVzY3JpcHRvclByb3RvKGNvbnN0IERlc2NyaXB0b3JQcm90byYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgRGVzY3JpcHRvclByb3RvKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe2Zyb20uX2ltcGxfLl9oYXNfYml0c199CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5maWVsZF8pe2Zyb20uX2ltcGxfLmZpZWxkX30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uZXN0ZWRfdHlwZV8pe2Zyb20uX2ltcGxfLm5lc3RlZF90eXBlX30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5lbnVtX3R5cGVfKXtmcm9tLl9pbXBsXy5lbnVtX3R5cGVffQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmV4dGVuc2lvbl9yYW5nZV8pe2Zyb20uX2ltcGxfLmV4dGVuc2lvbl9yYW5nZV99CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZXh0ZW5zaW9uXyl7ZnJvbS5faW1wbF8uZXh0ZW5zaW9uX30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5vbmVvZl9kZWNsXyl7ZnJvbS5faW1wbF8ub25lb2ZfZGVjbF99CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucmVzZXJ2ZWRfcmFuZ2VfKXtmcm9tLl9pbXBsXy5yZXNlcnZlZF9yYW5nZV99CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucmVzZXJ2ZWRfbmFtZV8pe2Zyb20uX2ltcGxfLnJlc2VydmVkX25hbWVffQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm5hbWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ub3B0aW9uc18pe251bGxwdHJ9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8ubmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfbmFtZSgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5uYW1lXy5TZXQoZnJvbS5faW50ZXJuYWxfbmFtZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19vcHRpb25zKCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLm9wdGlvbnNfID0gbmV3IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlT3B0aW9ucygqZnJvbS5faW1wbF8ub3B0aW9uc18pOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCit9CisKK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZmllbGRfKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uZXN0ZWRfdHlwZV8pe2FyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmVudW1fdHlwZV8pe2FyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmV4dGVuc2lvbl9yYW5nZV8pe2FyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmV4dGVuc2lvbl8pe2FyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm9uZW9mX2RlY2xfKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5yZXNlcnZlZF9yYW5nZV8pe2FyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnJlc2VydmVkX25hbWVfKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKXtudWxscHRyfQorICB9OworICBfaW1wbF8ubmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCit9CisKK0Rlc2NyaXB0b3JQcm90bzo6fkRlc2NyaXB0b3JQcm90bygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKKyAgX2ltcGxfLmZpZWxkXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworICBfaW1wbF8ubmVzdGVkX3R5cGVfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5lbnVtX3R5cGVfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5leHRlbnNpb25fcmFuZ2VfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5leHRlbnNpb25fLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5vbmVvZl9kZWNsXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworICBfaW1wbF8ucmVzZXJ2ZWRfcmFuZ2VfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworICBfaW1wbF8ubmFtZV8uRGVzdHJveSgpOworICBpZiAodGhpcyAhPSBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkpIGRlbGV0ZSBfaW1wbF8ub3B0aW9uc187Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIF9pbXBsXy5fY2FjaGVkX3NpemVfLlNldChzaXplKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG86OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLmZpZWxkXy5DbGVhcigpOworICBfaW1wbF8ubmVzdGVkX3R5cGVfLkNsZWFyKCk7CisgIF9pbXBsXy5lbnVtX3R5cGVfLkNsZWFyKCk7CisgIF9pbXBsXy5leHRlbnNpb25fcmFuZ2VfLkNsZWFyKCk7CisgIF9pbXBsXy5leHRlbnNpb25fLkNsZWFyKCk7CisgIF9pbXBsXy5vbmVvZl9kZWNsXy5DbGVhcigpOworICBfaW1wbF8ucmVzZXJ2ZWRfcmFuZ2VfLkNsZWFyKCk7CisgIF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5DbGVhcigpOworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDN1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfaW1wbF8ubmFtZV8uQ2xlYXJOb25EZWZhdWx0VG9FbXB0eSgpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIEdPT0dMRV9EQ0hFQ0soX2ltcGxfLm9wdGlvbnNfICE9IG51bGxwdHIpOworICAgICAgX2ltcGxfLm9wdGlvbnNfLT5DbGVhcigpOworICAgIH0KKyAgfQorICBfaW1wbF8uX2hhc19iaXRzXy5DbGVhcigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIERlc2NyaXB0b3JQcm90bzo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICBfSW50ZXJuYWw6Okhhc0JpdHMgaGFzX2JpdHN7fTsKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTApKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmFtZSIpOworICAgICAgICAgICNlbmRpZiAgLy8gIU5ERUJVRworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTgpKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfYWRkX2ZpZWxkKCksIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzwxOD4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbmVzdGVkX3R5cGUgPSAzOworICAgICAgY2FzZSAzOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMjYpKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfYWRkX25lc3RlZF90eXBlKCksIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzwyNj4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDQ7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAzNCkpIHsKKyAgICAgICAgICBwdHIgLT0gMTsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9hZGRfZW51bV90eXBlKCksIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzwzND4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UgZXh0ZW5zaW9uX3JhbmdlID0gNTsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDQyKSkgeworICAgICAgICAgIHB0ciAtPSAxOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX2FkZF9leHRlbnNpb25fcmFuZ2UoKSwgcHRyKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDQyPihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7CisgICAgICBjYXNlIDY6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA1MCkpIHsKKyAgICAgICAgICBwdHIgLT0gMTsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9hZGRfZXh0ZW5zaW9uKCksIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzw1MD4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyBvcHRpb25zID0gNzsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDU4KSkgeworICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKSwgcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90byBvbmVvZl9kZWNsID0gODsKKyAgICAgIGNhc2UgODoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDY2KSkgeworICAgICAgICAgIHB0ciAtPSAxOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX2FkZF9vbmVvZl9kZWNsKCksIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzw2Nj4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSByZXNlcnZlZF9yYW5nZSA9IDk7CisgICAgICBjYXNlIDk6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA3NCkpIHsKKyAgICAgICAgICBwdHIgLT0gMTsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9hZGRfcmVzZXJ2ZWRfcmFuZ2UoKSwgcHRyKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDc0PihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyByZXBlYXRlZCBzdHJpbmcgcmVzZXJ2ZWRfbmFtZSA9IDEwOworICAgICAgY2FzZSAxMDoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDgyKSkgeworICAgICAgICAgIHB0ciAtPSAxOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfYWRkX3Jlc2VydmVkX25hbWUoKTsKKyAgICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUiKTsKKyAgICAgICAgICAgICNlbmRpZiAgLy8gIU5ERUJVRworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8ODI+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIF9pbXBsXy5faGFzX2JpdHNfLk9yKGhhc19iaXRzKTsKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgMSwgdGhpcy0+X2ludGVybmFsX25hbWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfZmllbGRfc2l6ZSgpKTsgaSA8IG47IGkrKykgeworICAgIGNvbnN0IGF1dG8mIHJlcGZpZWxkID0gdGhpcy0+X2ludGVybmFsX2ZpZWxkKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSgyLCByZXBmaWVsZCwgcmVwZmllbGQuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9uZXN0ZWRfdHlwZV9zaXplKCkpOyBpIDwgbjsgaSsrKSB7CisgICAgY29uc3QgYXV0byYgcmVwZmllbGQgPSB0aGlzLT5faW50ZXJuYWxfbmVzdGVkX3R5cGUoaSk7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICAgIEludGVybmFsV3JpdGVNZXNzYWdlKDMsIHJlcGZpZWxkLCByZXBmaWVsZC5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfZW51bV90eXBlX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9lbnVtX3R5cGUoaSk7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICAgIEludGVybmFsV3JpdGVNZXNzYWdlKDQsIHJlcGZpZWxkLCByZXBmaWVsZC5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9leHRlbnNpb25fcmFuZ2Vfc2l6ZSgpKTsgaSA8IG47IGkrKykgeworICAgIGNvbnN0IGF1dG8mIHJlcGZpZWxkID0gdGhpcy0+X2ludGVybmFsX2V4dGVuc2lvbl9yYW5nZShpKTsKKyAgICB0YXJnZXQgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoNSwgcmVwZmllbGQsIHJlcGZpZWxkLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA2OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfZXh0ZW5zaW9uX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9leHRlbnNpb24oaSk7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICAgIEludGVybmFsV3JpdGVNZXNzYWdlKDYsIHJlcGZpZWxkLCByZXBmaWVsZC5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoNywgX0ludGVybmFsOjpvcHRpb25zKHRoaXMpLAorICAgICAgICBfSW50ZXJuYWw6Om9wdGlvbnModGhpcykuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvIG9uZW9mX2RlY2wgPSA4OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfb25lb2ZfZGVjbF9zaXplKCkpOyBpIDwgbjsgaSsrKSB7CisgICAgY29uc3QgYXV0byYgcmVwZmllbGQgPSB0aGlzLT5faW50ZXJuYWxfb25lb2ZfZGVjbChpKTsKKyAgICB0YXJnZXQgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoOCwgcmVwZmllbGQsIHJlcGZpZWxkLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSByZXNlcnZlZF9yYW5nZSA9IDk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9yZXNlcnZlZF9yYW5nZV9zaXplKCkpOyBpIDwgbjsgaSsrKSB7CisgICAgY29uc3QgYXV0byYgcmVwZmllbGQgPSB0aGlzLT5faW50ZXJuYWxfcmVzZXJ2ZWRfcmFuZ2UoaSk7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICAgIEludGVybmFsV3JpdGVNZXNzYWdlKDksIHJlcGZpZWxkLCByZXBmaWVsZC5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIHN0cmluZyByZXNlcnZlZF9uYW1lID0gMTA7CisgIGZvciAoaW50IGkgPSAwLCBuID0gdGhpcy0+X2ludGVybmFsX3Jlc2VydmVkX25hbWVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CisgICAgY29uc3QgYXV0byYgcyA9IHRoaXMtPl9pbnRlcm5hbF9yZXNlcnZlZF9uYW1lKGkpOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICBzLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihzLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmcoMTAsIHMsIHRhcmdldCk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgRGVzY3JpcHRvclByb3RvOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOworICB0b3RhbF9zaXplICs9IDFVTCAqIHRoaXMtPl9pbnRlcm5hbF9maWVsZF9zaXplKCk7CisgIGZvciAoY29uc3QgYXV0byYgbXNnIDogdGhpcy0+X2ltcGxfLmZpZWxkXykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKG1zZyk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7CisgIHRvdGFsX3NpemUgKz0gMVVMICogdGhpcy0+X2ludGVybmFsX25lc3RlZF90eXBlX3NpemUoKTsKKyAgZm9yIChjb25zdCBhdXRvJiBtc2cgOiB0aGlzLT5faW1wbF8ubmVzdGVkX3R5cGVfKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUobXNnKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OworICB0b3RhbF9zaXplICs9IDFVTCAqIHRoaXMtPl9pbnRlcm5hbF9lbnVtX3R5cGVfc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy5lbnVtX3R5cGVfKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUobXNnKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7CisgIHRvdGFsX3NpemUgKz0gMVVMICogdGhpcy0+X2ludGVybmFsX2V4dGVuc2lvbl9yYW5nZV9zaXplKCk7CisgIGZvciAoY29uc3QgYXV0byYgbXNnIDogdGhpcy0+X2ltcGxfLmV4dGVuc2lvbl9yYW5nZV8pIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZShtc2cpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA2OworICB0b3RhbF9zaXplICs9IDFVTCAqIHRoaXMtPl9pbnRlcm5hbF9leHRlbnNpb25fc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy5leHRlbnNpb25fKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUobXNnKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8gb25lb2ZfZGVjbCA9IDg7CisgIHRvdGFsX3NpemUgKz0gMVVMICogdGhpcy0+X2ludGVybmFsX29uZW9mX2RlY2xfc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy5vbmVvZl9kZWNsXykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKG1zZyk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlIHJlc2VydmVkX3JhbmdlID0gOTsKKyAgdG90YWxfc2l6ZSArPSAxVUwgKiB0aGlzLT5faW50ZXJuYWxfcmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy5yZXNlcnZlZF9yYW5nZV8pIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZShtc2cpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIHJlc2VydmVkX25hbWUgPSAxMDsKKyAgdG90YWxfc2l6ZSArPSAxICoKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RnJvbUludFNpemUoX2ltcGxfLnJlc2VydmVkX25hbWVfLnNpemUoKSk7CisgIGZvciAoaW50IGkgPSAwLCBuID0gX2ltcGxfLnJlc2VydmVkX25hbWVfLnNpemUoKTsgaSA8IG47IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgIF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5HZXQoaSkpOworICB9CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAzdSkgeworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+X2ludGVybmFsX25hbWUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyBvcHRpb25zID0gNzsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKAorICAgICAgICAgICpfaW1wbF8ub3B0aW9uc18pOworICAgIH0KKworICB9CisgIHJldHVybiBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCAmX2ltcGxfLl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhIERlc2NyaXB0b3JQcm90bzo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIERlc2NyaXB0b3JQcm90bzo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpEZXNjcmlwdG9yUHJvdG86OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH0KKworCit2b2lkIERlc2NyaXB0b3JQcm90bzo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PERlc2NyaXB0b3JQcm90byo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgRGVzY3JpcHRvclByb3RvJj4oZnJvbV9tc2cpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX3RoaXMtPl9pbXBsXy5maWVsZF8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLmZpZWxkXyk7CisgIF90aGlzLT5faW1wbF8ubmVzdGVkX3R5cGVfLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5uZXN0ZWRfdHlwZV8pOworICBfdGhpcy0+X2ltcGxfLmVudW1fdHlwZV8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLmVudW1fdHlwZV8pOworICBfdGhpcy0+X2ltcGxfLmV4dGVuc2lvbl9yYW5nZV8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLmV4dGVuc2lvbl9yYW5nZV8pOworICBfdGhpcy0+X2ltcGxfLmV4dGVuc2lvbl8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLmV4dGVuc2lvbl8pOworICBfdGhpcy0+X2ltcGxfLm9uZW9mX2RlY2xfLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5vbmVvZl9kZWNsXyk7CisgIF90aGlzLT5faW1wbF8ucmVzZXJ2ZWRfcmFuZ2VfLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5yZXNlcnZlZF9yYW5nZV8pOworICBfdGhpcy0+X2ltcGxfLnJlc2VydmVkX25hbWVfLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5yZXNlcnZlZF9uYW1lXyk7CisgIGNhY2hlZF9oYXNfYml0cyA9IGZyb20uX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAzdSkgeworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfbmFtZShmcm9tLl9pbnRlcm5hbF9uYW1lKCkpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCktPjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlT3B0aW9uczo6TWVyZ2VGcm9tKAorICAgICAgICAgIGZyb20uX2ludGVybmFsX29wdGlvbnMoKSk7CisgICAgfQorICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBEZXNjcmlwdG9yUHJvdG86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIGlmICghOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZChfaW1wbF8uZmllbGRfKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZChfaW1wbF8ubmVzdGVkX3R5cGVfKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZChfaW1wbF8uZW51bV90eXBlXykpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoITo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQoX2ltcGxfLmV4dGVuc2lvbl9yYW5nZV8pKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCE6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKF9pbXBsXy5leHRlbnNpb25fKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZChfaW1wbF8ub25lb2ZfZGVjbF8pKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKF9pbnRlcm5hbF9oYXNfb3B0aW9ucygpKSB7CisgICAgaWYgKCFfaW1wbF8ub3B0aW9uc18tPklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90bzo6SW50ZXJuYWxTd2FwKERlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBhdXRvKiBsaHNfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgYXV0byogcmhzX2FyZW5hID0gb3RoZXItPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzd2FwKF9pbXBsXy5faGFzX2JpdHNfWzBdLCBvdGhlci0+X2ltcGxfLl9oYXNfYml0c19bMF0pOworICBfaW1wbF8uZmllbGRfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5maWVsZF8pOworICBfaW1wbF8ubmVzdGVkX3R5cGVfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5uZXN0ZWRfdHlwZV8pOworICBfaW1wbF8uZW51bV90eXBlXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8uZW51bV90eXBlXyk7CisgIF9pbXBsXy5leHRlbnNpb25fcmFuZ2VfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5leHRlbnNpb25fcmFuZ2VfKTsKKyAgX2ltcGxfLmV4dGVuc2lvbl8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLmV4dGVuc2lvbl8pOworICBfaW1wbF8ub25lb2ZfZGVjbF8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLm9uZW9mX2RlY2xfKTsKKyAgX2ltcGxfLnJlc2VydmVkX3JhbmdlXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8ucmVzZXJ2ZWRfcmFuZ2VfKTsKKyAgX2ltcGxfLnJlc2VydmVkX25hbWVfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5yZXNlcnZlZF9uYW1lXyk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8ubmFtZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLm5hbWVfLCByaHNfYXJlbmEKKyAgKTsKKyAgc3dhcChfaW1wbF8ub3B0aW9uc18sIG90aGVyLT5faW1wbF8ub3B0aW9uc18pOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgRGVzY3JpcHRvclByb3RvOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzRdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBFeHRlbnNpb25SYW5nZU9wdGlvbnM6Ol9JbnRlcm5hbCB7CisgcHVibGljOgorfTsKKworRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjpFeHRlbnNpb25SYW5nZU9wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQpCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgU2hhcmVkQ3RvcihhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zKQorfQorRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjpFeHRlbnNpb25SYW5nZU9wdGlvbnMoY29uc3QgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBFeHRlbnNpb25SYW5nZU9wdGlvbnMqIGNvbnN0IF90aGlzID0gdGhpczsgKHZvaWQpX3RoaXM7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICAvKmRlY2x0eXBlKF9pbXBsXy5fZXh0ZW5zaW9uc18pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyl7ZnJvbS5faW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25ffQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8uX2V4dGVuc2lvbnNfLk1lcmdlRnJvbShpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCksIGZyb20uX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMpCit9CisKK2lubGluZSB2b2lkIEV4dGVuc2lvblJhbmdlT3B0aW9uczo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICAvKmRlY2x0eXBlKF9pbXBsXy5fZXh0ZW5zaW9uc18pKi97OjpfcGJpOjpBcmVuYUluaXRpYWxpemVkKCksIGFyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyl7YXJlbmF9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgfTsKK30KKworRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjp+RXh0ZW5zaW9uUmFuZ2VPcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8uX2V4dGVuc2lvbnNfLn5FeHRlbnNpb25TZXQoKTsKKyAgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworfQorCit2b2lkIEV4dGVuc2lvblJhbmdlT3B0aW9uczo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy5fZXh0ZW5zaW9uc18uQ2xlYXIoKTsKKyAgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIEV4dGVuc2lvblJhbmdlT3B0aW9uczo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgICAgICBjYXNlIDk5OToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDU4KSkgeworICAgICAgICAgIHB0ciAtPSAyOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAyOworICAgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX2FkZF91bmludGVycHJldGVkX29wdGlvbigpLCBwdHIpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8Nzk5ND4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICB9ICAvLyBzd2l0Y2gKKyAgaGFuZGxlX3VudXN1YWw6CisgICAgaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkgeworICAgICAgQ0hLXyhwdHIpOworICAgICAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7CisgICAgICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyAgICB9CisgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7CisgICAgICBwdHIgPSBfaW1wbF8uX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBwdHIsIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgJl9pbnRlcm5hbF9tZXRhZGF0YV8sIGN0eCk7CisgICAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBFeHRlbnNpb25SYW5nZU9wdGlvbnM6Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbl9zaXplKCkpOyBpIDwgbjsgaSsrKSB7CisgICAgY29uc3QgYXV0byYgcmVwZmllbGQgPSB0aGlzLT5faW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb24oaSk7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICAgIEludGVybmFsV3JpdGVNZXNzYWdlKDk5OSwgcmVwZmllbGQsIHJlcGZpZWxkLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCisgIHRhcmdldCA9IF9pbXBsXy5fZXh0ZW5zaW9uc18uX0ludGVybmFsU2VyaWFsaXplKAorICBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCksIDEwMDAsIDUzNjg3MDkxMiwgdGFyZ2V0LCBzdHJlYW0pOworCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSkgeworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdDo6SW50ZXJuYWxTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMpCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBFeHRlbnNpb25SYW5nZU9wdGlvbnM6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zKQorICBzaXplX3QgdG90YWxfc2l6ZSA9IDA7CisKKyAgdG90YWxfc2l6ZSArPSBfaW1wbF8uX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7CisKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICB0b3RhbF9zaXplICs9IDJVTCAqIHRoaXMtPl9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7CisgIGZvciAoY29uc3QgYXV0byYgbXNnIDogdGhpcy0+X2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKG1zZyk7CisgIH0KKworICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBFeHRlbnNpb25SYW5nZU9wdGlvbnM6Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBFeHRlbnNpb25SYW5nZU9wdGlvbnM6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBFeHRlbnNpb25SYW5nZU9wdGlvbnM6Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxFeHRlbnNpb25SYW5nZU9wdGlvbnMqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IEV4dGVuc2lvblJhbmdlT3B0aW9ucyY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucykKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF90aGlzLT5faW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLk1lcmdlRnJvbShmcm9tLl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pOworICBfdGhpcy0+X2ltcGxfLl9leHRlbnNpb25zXy5NZXJnZUZyb20oaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCBmcm9tLl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBFeHRlbnNpb25SYW5nZU9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IEV4dGVuc2lvblJhbmdlT3B0aW9ucyYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICBpZiAoIV9pbXBsXy5fZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCE6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjpJbnRlcm5hbFN3YXAoRXh0ZW5zaW9uUmFuZ2VPcHRpb25zKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIF9pbXBsXy5fZXh0ZW5zaW9uc18uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLl9leHRlbnNpb25zXyk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBFeHRlbnNpb25SYW5nZU9wdGlvbnM6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9bNV0pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKKyAgdXNpbmcgSGFzQml0cyA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxGaWVsZERlc2NyaXB0b3JQcm90bz4oKS5faW1wbF8uX2hhc19iaXRzXyk7CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfbmFtZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDF1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfbnVtYmVyKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gNjR1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfbGFiZWwoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSA1MTJ1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfdHlwZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDEwMjR1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfdHlwZV9uYW1lKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gNHU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19leHRlbmRlZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDJ1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfZGVmYXVsdF92YWx1ZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDh1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfb25lb2ZfaW5kZXgoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAxMjh1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfanNvbl9uYW1lKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMTZ1OworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zJiBvcHRpb25zKGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvKiBtc2cpOworICBzdGF0aWMgdm9pZCBzZXRfaGFzX29wdGlvbnMoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAzMnU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19wcm90bzNfb3B0aW9uYWwoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAyNTZ1OworICB9Cit9OworCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zJgorRmllbGREZXNjcmlwdG9yUHJvdG86Ol9JbnRlcm5hbDo6b3B0aW9ucyhjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byogbXNnKSB7CisgIHJldHVybiAqbXNnLT5faW1wbF8ub3B0aW9uc187Cit9CitGaWVsZERlc2NyaXB0b3JQcm90bzo6RmllbGREZXNjcmlwdG9yUHJvdG8oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQpCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgU2hhcmVkQ3RvcihhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCit9CitGaWVsZERlc2NyaXB0b3JQcm90bzo6RmllbGREZXNjcmlwdG9yUHJvdG8oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe2Zyb20uX2ltcGxfLl9oYXNfYml0c199CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmV4dGVuZGVlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnR5cGVfbmFtZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5kZWZhdWx0X3ZhbHVlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmpzb25fbmFtZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXyl7bnVsbHB0cn0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5udW1iZXJfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ub25lb2ZfaW5kZXhfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucHJvdG8zX29wdGlvbmFsXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmxhYmVsXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnR5cGVfKXt9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8ubmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfbmFtZSgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5uYW1lXy5TZXQoZnJvbS5faW50ZXJuYWxfbmFtZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgX2ltcGxfLmV4dGVuZGVlXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5leHRlbmRlZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfZXh0ZW5kZWUoKSkgeworICAgIF90aGlzLT5faW1wbF8uZXh0ZW5kZWVfLlNldChmcm9tLl9pbnRlcm5hbF9leHRlbmRlZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgX2ltcGxfLnR5cGVfbmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8udHlwZV9uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc190eXBlX25hbWUoKSkgeworICAgIF90aGlzLT5faW1wbF8udHlwZV9uYW1lXy5TZXQoZnJvbS5faW50ZXJuYWxfdHlwZV9uYW1lKCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICBfaW1wbF8uZGVmYXVsdF92YWx1ZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8uZGVmYXVsdF92YWx1ZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5kZWZhdWx0X3ZhbHVlXy5TZXQoZnJvbS5faW50ZXJuYWxfZGVmYXVsdF92YWx1ZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgX2ltcGxfLmpzb25fbmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8uanNvbl9uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19qc29uX25hbWUoKSkgeworICAgIF90aGlzLT5faW1wbF8uanNvbl9uYW1lXy5TZXQoZnJvbS5faW50ZXJuYWxfanNvbl9uYW1lKCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX29wdGlvbnMoKSkgeworICAgIF90aGlzLT5faW1wbF8ub3B0aW9uc18gPSBuZXcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucygqZnJvbS5faW1wbF8ub3B0aW9uc18pOworICB9CisgIDo6bWVtY3B5KCZfaW1wbF8ubnVtYmVyXywgJmZyb20uX2ltcGxfLm51bWJlcl8sCisgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLnR5cGVfKSAtCisgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5udW1iZXJfKSkgKyBzaXplb2YoX2ltcGxfLnR5cGVfKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKK30KKworaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm5hbWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZXh0ZW5kZWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8udHlwZV9uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmRlZmF1bHRfdmFsdWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uanNvbl9uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKXtudWxscHRyfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm51bWJlcl8pezB9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ub25lb2ZfaW5kZXhfKXswfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnByb3RvM19vcHRpb25hbF8pe2ZhbHNlfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmxhYmVsXyl7MX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy50eXBlXyl7MX0KKyAgfTsKKyAgX2ltcGxfLm5hbWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBfaW1wbF8uZXh0ZW5kZWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLmV4dGVuZGVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgX2ltcGxfLnR5cGVfbmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8udHlwZV9uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgX2ltcGxfLmRlZmF1bHRfdmFsdWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLmRlZmF1bHRfdmFsdWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBfaW1wbF8uanNvbl9uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5qc29uX25hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworfQorCitGaWVsZERlc2NyaXB0b3JQcm90bzo6fkZpZWxkRGVzY3JpcHRvclByb3RvKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKKyAgX2ltcGxfLm5hbWVfLkRlc3Ryb3koKTsKKyAgX2ltcGxfLmV4dGVuZGVlXy5EZXN0cm95KCk7CisgIF9pbXBsXy50eXBlX25hbWVfLkRlc3Ryb3koKTsKKyAgX2ltcGxfLmRlZmF1bHRfdmFsdWVfLkRlc3Ryb3koKTsKKyAgX2ltcGxfLmpzb25fbmFtZV8uRGVzdHJveSgpOworICBpZiAodGhpcyAhPSBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkpIGRlbGV0ZSBfaW1wbF8ub3B0aW9uc187Cit9CisKK3ZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDNmdSkgeworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgX2ltcGxfLm5hbWVfLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICBfaW1wbF8uZXh0ZW5kZWVfLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICBfaW1wbF8udHlwZV9uYW1lXy5DbGVhck5vbkRlZmF1bHRUb0VtcHR5KCk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA4dSkgeworICAgICAgX2ltcGxfLmRlZmF1bHRfdmFsdWVfLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMTB1KSB7CisgICAgICBfaW1wbF8uanNvbl9uYW1lXy5DbGVhck5vbkRlZmF1bHRUb0VtcHR5KCk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDIwdSkgeworICAgICAgR09PR0xFX0RDSEVDSyhfaW1wbF8ub3B0aW9uc18gIT0gbnVsbHB0cik7CisgICAgICBfaW1wbF8ub3B0aW9uc18tPkNsZWFyKCk7CisgICAgfQorICB9CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMGMwdSkgeworICAgIDo6bWVtc2V0KCZfaW1wbF8ubnVtYmVyXywgMCwgc3RhdGljX2Nhc3Q8c2l6ZV90PigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5vbmVvZl9pbmRleF8pIC0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5udW1iZXJfKSkgKyBzaXplb2YoX2ltcGxfLm9uZW9mX2luZGV4XykpOworICB9CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwNzAwdSkgeworICAgIF9pbXBsXy5wcm90bzNfb3B0aW9uYWxfID0gZmFsc2U7CisgICAgX2ltcGxfLmxhYmVsXyA9IDE7CisgICAgX2ltcGxfLnR5cGVfID0gMTsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzXy5DbGVhcigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIF9JbnRlcm5hbDo6SGFzQml0cyBoYXNfYml0c3t9OworICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxMCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICA6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgZXh0ZW5kZWUgPSAyOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTgpKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9leHRlbmRlZSgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAjaWZuZGVmIE5ERUJVRworICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAzOworICAgICAgY2FzZSAzOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMjQpKSB7CisgICAgICAgICAgX0ludGVybmFsOjpzZXRfaGFzX251bWJlcigmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy5udW1iZXJfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50MzIoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwgbGFiZWwgPSA0OworICAgICAgY2FzZSA0OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMzIpKSB7CisgICAgICAgICAgdWludDY0X3QgdmFsID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0lzVmFsaWQodmFsKSkpIHsKKyAgICAgICAgICAgIF9pbnRlcm5hbF9zZXRfbGFiZWwoc3RhdGljX2Nhc3Q8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsPih2YWwpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXcml0ZVZhcmludCg0LCB2YWwsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSB0eXBlID0gNTsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDQwKSkgeworICAgICAgICAgIHVpbnQ2NF90IHZhbCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX0lzVmFsaWQodmFsKSkpIHsKKyAgICAgICAgICAgIF9pbnRlcm5hbF9zZXRfdHlwZShzdGF0aWNfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZT4odmFsKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V3JpdGVWYXJpbnQoNSwgdmFsLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgdHlwZV9uYW1lID0gNjsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDUwKSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfdHlwZV9uYW1lKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWx1ZSA9IDc7CisgICAgICBjYXNlIDc6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA1OCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX2RlZmF1bHRfdmFsdWUoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICA6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyBvcHRpb25zID0gODsKKyAgICAgIGNhc2UgODoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDY2KSkgeworICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKSwgcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgaW50MzIgb25lb2ZfaW5kZXggPSA5OworICAgICAgY2FzZSA5OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNzIpKSB7CisgICAgICAgICAgX0ludGVybmFsOjpzZXRfaGFzX29uZW9mX2luZGV4KCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLm9uZW9mX2luZGV4XyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDMyKCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcganNvbl9uYW1lID0gMTA7CisgICAgICBjYXNlIDEwOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gODIpKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9qc29uX25hbWUoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICA6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSIpOworICAgICAgICAgICNlbmRpZiAgLy8gIU5ERUJVRworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgcHJvdG8zX29wdGlvbmFsID0gMTc7CisgICAgICBjYXNlIDE3OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTM2KSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19wcm90bzNfb3B0aW9uYWwoJmhhc19iaXRzKTsKKyAgICAgICAgICBfaW1wbF8ucHJvdG8zX29wdGlvbmFsXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICBfaW1wbF8uX2hhc19iaXRzXy5PcihoYXNfYml0cyk7CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX25hbWUoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX25hbWUoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDEsIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgZXh0ZW5kZWUgPSAyOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX2V4dGVuZGVlKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9leHRlbmRlZSgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDIsIHRoaXMtPl9pbnRlcm5hbF9leHRlbmRlZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMzsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwNDB1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDMsIHRoaXMtPl9pbnRlcm5hbF9udW1iZXIoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwgbGFiZWwgPSA0OworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDIwMHUpIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKKyAgICAgIDQsIHRoaXMtPl9pbnRlcm5hbF9sYWJlbCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHR5cGUgPSA1OworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDQwMHUpIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKKyAgICAgIDUsIHRoaXMtPl9pbnRlcm5hbF90eXBlKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgdHlwZV9uYW1lID0gNjsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF90eXBlX25hbWUoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX3R5cGVfbmFtZSgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICA2LCB0aGlzLT5faW50ZXJuYWxfdHlwZV9uYW1lKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWx1ZSA9IDc7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA4dSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICB0aGlzLT5faW50ZXJuYWxfZGVmYXVsdF92YWx1ZSgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pih0aGlzLT5faW50ZXJuYWxfZGVmYXVsdF92YWx1ZSgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgNywgdGhpcy0+X2ludGVybmFsX2RlZmF1bHRfdmFsdWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAyMHUpIHsKKyAgICB0YXJnZXQgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIEludGVybmFsV3JpdGVNZXNzYWdlKDgsIF9JbnRlcm5hbDo6b3B0aW9ucyh0aGlzKSwKKyAgICAgICAgX0ludGVybmFsOjpvcHRpb25zKHRoaXMpLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgLy8gb3B0aW9uYWwgaW50MzIgb25lb2ZfaW5kZXggPSA5OworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDA4MHUpIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoOSwgdGhpcy0+X2ludGVybmFsX29uZW9mX2luZGV4KCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcganNvbl9uYW1lID0gMTA7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDEwdSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICB0aGlzLT5faW50ZXJuYWxfanNvbl9uYW1lKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9qc29uX25hbWUoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uanNvbl9uYW1lIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgMTAsIHRoaXMtPl9pbnRlcm5hbF9qc29uX25hbWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgcHJvdG8zX29wdGlvbmFsID0gMTc7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMTAwdSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDE3LCB0aGlzLT5faW50ZXJuYWxfcHJvdG8zX29wdGlvbmFsKCksIHRhcmdldCk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDBmZnUpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBleHRlbmRlZSA9IDI7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9leHRlbmRlZSgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgdHlwZV9uYW1lID0gNjsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwNHUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+X2ludGVybmFsX3R5cGVfbmFtZSgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWx1ZSA9IDc7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9kZWZhdWx0X3ZhbHVlKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBqc29uX25hbWUgPSAxMDsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAxMHUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+X2ludGVybmFsX2pzb25fbmFtZSgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyBvcHRpb25zID0gODsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAyMHUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKAorICAgICAgICAgICpfaW1wbF8ub3B0aW9uc18pOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDM7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwNDB1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZVBsdXNPbmUodGhpcy0+X2ludGVybmFsX251bWJlcigpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBpbnQzMiBvbmVvZl9pbmRleCA9IDk7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwODB1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZVBsdXNPbmUodGhpcy0+X2ludGVybmFsX29uZW9mX2luZGV4KCkpOworICAgIH0KKworICB9CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwNzAwdSkgeworICAgIC8vIG9wdGlvbmFsIGJvb2wgcHJvdG8zX29wdGlvbmFsID0gMTc7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAxMDB1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDIgKyAxOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwgbGFiZWwgPSA0OworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMjAwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodGhpcy0+X2ludGVybmFsX2xhYmVsKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSB0eXBlID0gNTsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDQwMHUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPl9pbnRlcm5hbF90eXBlKCkpOworICAgIH0KKworICB9CisgIHJldHVybiBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCAmX2ltcGxfLl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgRmllbGREZXNjcmlwdG9yUHJvdG86Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqRmllbGREZXNjcmlwdG9yUHJvdG86OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH0KKworCit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yUHJvdG8qPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJj4oZnJvbV9tc2cpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBmcm9tLl9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDBmZnUpIHsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X25hbWUoZnJvbS5faW50ZXJuYWxfbmFtZSgpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9leHRlbmRlZShmcm9tLl9pbnRlcm5hbF9leHRlbmRlZSgpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF90eXBlX25hbWUoZnJvbS5faW50ZXJuYWxfdHlwZV9uYW1lKCkpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwOHUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X2RlZmF1bHRfdmFsdWUoZnJvbS5faW50ZXJuYWxfZGVmYXVsdF92YWx1ZSgpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMTB1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9qc29uX25hbWUoZnJvbS5faW50ZXJuYWxfanNvbl9uYW1lKCkpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAyMHUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCktPjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnM6Ok1lcmdlRnJvbSgKKyAgICAgICAgICBmcm9tLl9pbnRlcm5hbF9vcHRpb25zKCkpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDA0MHUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8ubnVtYmVyXyA9IGZyb20uX2ltcGxfLm51bWJlcl87CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDgwdSkgeworICAgICAgX3RoaXMtPl9pbXBsXy5vbmVvZl9pbmRleF8gPSBmcm9tLl9pbXBsXy5vbmVvZl9pbmRleF87CisgICAgfQorICAgIF90aGlzLT5faW1wbF8uX2hhc19iaXRzX1swXSB8PSBjYWNoZWRfaGFzX2JpdHM7CisgIH0KKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDA3MDB1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAxMDB1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLnByb3RvM19vcHRpb25hbF8gPSBmcm9tLl9pbXBsXy5wcm90bzNfb3B0aW9uYWxfOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDIwMHUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8ubGFiZWxfID0gZnJvbS5faW1wbF8ubGFiZWxfOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDQwMHUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8udHlwZV8gPSBmcm9tLl9pbXBsXy50eXBlXzsKKyAgICB9CisgICAgX3RoaXMtPl9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IGNhY2hlZF9oYXNfYml0czsKKyAgfQorICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIGlmIChfaW50ZXJuYWxfaGFzX29wdGlvbnMoKSkgeworICAgIGlmICghX2ltcGxfLm9wdGlvbnNfLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6SW50ZXJuYWxTd2FwKEZpZWxkRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIGF1dG8qIGxoc19hcmVuYSA9IEdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBhdXRvKiByaHNfYXJlbmEgPSBvdGhlci0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN3YXAoX2ltcGxfLl9oYXNfYml0c19bMF0sIG90aGVyLT5faW1wbF8uX2hhc19iaXRzX1swXSk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8ubmFtZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLm5hbWVfLCByaHNfYXJlbmEKKyAgKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5leHRlbmRlZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLmV4dGVuZGVlXywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8udHlwZV9uYW1lXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8udHlwZV9uYW1lXywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8uZGVmYXVsdF92YWx1ZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLmRlZmF1bHRfdmFsdWVfLCByaHNfYXJlbmEKKyAgKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5qc29uX25hbWVfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5qc29uX25hbWVfLCByaHNfYXJlbmEKKyAgKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjptZW1zd2FwPAorICAgICAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCBfaW1wbF8ucHJvdG8zX29wdGlvbmFsXykKKyAgICAgICsgc2l6ZW9mKEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW1wbF8ucHJvdG8zX29wdGlvbmFsXykKKyAgICAgIC0gUFJPVE9CVUZfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCBfaW1wbF8ub3B0aW9uc18pPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLm9wdGlvbnNfKSwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmb3RoZXItPl9pbXBsXy5vcHRpb25zXykpOworICBzd2FwKF9pbXBsXy5sYWJlbF8sIG90aGVyLT5faW1wbF8ubGFiZWxfKTsKKyAgc3dhcChfaW1wbF8udHlwZV8sIG90aGVyLT5faW1wbF8udHlwZV8pOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgRmllbGREZXNjcmlwdG9yUHJvdG86OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9bNl0pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIE9uZW9mRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKKyAgdXNpbmcgSGFzQml0cyA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxPbmVvZkRlc2NyaXB0b3JQcm90bz4oKS5faW1wbF8uX2hhc19iaXRzXyk7CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfbmFtZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDF1OworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZPcHRpb25zJiBvcHRpb25zKGNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvKiBtc2cpOworICBzdGF0aWMgdm9pZCBzZXRfaGFzX29wdGlvbnMoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAydTsKKyAgfQorfTsKKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mT3B0aW9ucyYKK09uZW9mRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWw6Om9wdGlvbnMoY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8qIG1zZykgeworICByZXR1cm4gKm1zZy0+X2ltcGxfLm9wdGlvbnNfOworfQorT25lb2ZEZXNjcmlwdG9yUHJvdG86Ok9uZW9mRGVzY3JpcHRvclByb3RvKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQorfQorT25lb2ZEZXNjcmlwdG9yUHJvdG86Ok9uZW9mRGVzY3JpcHRvclByb3RvKGNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBPbmVvZkRlc2NyaXB0b3JQcm90byogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXtmcm9tLl9pbXBsXy5faGFzX2JpdHNffQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubmFtZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXyl7bnVsbHB0cn19OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19uYW1lKCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLm5hbWVfLlNldChmcm9tLl9pbnRlcm5hbF9uYW1lKCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX29wdGlvbnMoKSkgeworICAgIF90aGlzLT5faW1wbF8ub3B0aW9uc18gPSBuZXcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mT3B0aW9ucygqZnJvbS5faW1wbF8ub3B0aW9uc18pOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKK30KKworaW5saW5lIHZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm5hbWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ub3B0aW9uc18pe251bGxwdHJ9CisgIH07CisgIF9pbXBsXy5uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKK30KKworT25lb2ZEZXNjcmlwdG9yUHJvdG86On5PbmVvZkRlc2NyaXB0b3JQcm90bygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy5uYW1lXy5EZXN0cm95KCk7CisgIGlmICh0aGlzICE9IGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSkgZGVsZXRlIF9pbXBsXy5vcHRpb25zXzsKK30KKwordm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDN1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfaW1wbF8ubmFtZV8uQ2xlYXJOb25EZWZhdWx0VG9FbXB0eSgpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIEdPT0dMRV9EQ0hFQ0soX2ltcGxfLm9wdGlvbnNfICE9IG51bGxwdHIpOworICAgICAgX2ltcGxfLm9wdGlvbnNfLT5DbGVhcigpOworICAgIH0KKyAgfQorICBfaW1wbF8uX2hhc19iaXRzXy5DbGVhcigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIE9uZW9mRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIF9JbnRlcm5hbDo6SGFzQml0cyBoYXNfYml0c3t9OworICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxMCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICA6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucyBvcHRpb25zID0gMjsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDE4KSkgeworICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKSwgcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICB9ICAvLyBzd2l0Y2gKKyAgaGFuZGxlX3VudXN1YWw6CisgICAgaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkgeworICAgICAgQ0hLXyhwdHIpOworICAgICAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7CisgICAgICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgX2ltcGxfLl9oYXNfYml0c18uT3IoaGFzX2JpdHMpOworICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBPbmVvZkRlc2NyaXB0b3JQcm90bzo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICAxLCB0aGlzLT5faW50ZXJuYWxfbmFtZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMgb3B0aW9ucyA9IDI7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoMiwgX0ludGVybmFsOjpvcHRpb25zKHRoaXMpLAorICAgICAgICBfSW50ZXJuYWw6Om9wdGlvbnModGhpcykuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwM3UpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zIG9wdGlvbnMgPSAyOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUoCisgICAgICAgICAgKl9pbXBsXy5vcHRpb25zXyk7CisgICAgfQorCisgIH0KKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgT25lb2ZEZXNjcmlwdG9yUHJvdG86Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBPbmVvZkRlc2NyaXB0b3JQcm90bzo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpPbmVvZkRlc2NyaXB0b3JQcm90bzo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxPbmVvZkRlc2NyaXB0b3JQcm90byo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8mPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IGZyb20uX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAzdSkgeworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfbmFtZShmcm9tLl9pbnRlcm5hbF9uYW1lKCkpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCktPjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZk9wdGlvbnM6Ok1lcmdlRnJvbSgKKyAgICAgICAgICBmcm9tLl9pbnRlcm5hbF9vcHRpb25zKCkpOworICAgIH0KKyAgfQorICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgT25lb2ZEZXNjcmlwdG9yUHJvdG86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIGlmIChfaW50ZXJuYWxfaGFzX29wdGlvbnMoKSkgeworICAgIGlmICghX2ltcGxfLm9wdGlvbnNfLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6SW50ZXJuYWxTd2FwKE9uZW9mRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIGF1dG8qIGxoc19hcmVuYSA9IEdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBhdXRvKiByaHNfYXJlbmEgPSBvdGhlci0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN3YXAoX2ltcGxfLl9oYXNfYml0c19bMF0sIG90aGVyLT5faW1wbF8uX2hhc19iaXRzX1swXSk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8ubmFtZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLm5hbWVfLCByaHNfYXJlbmEKKyAgKTsKKyAgc3dhcChfaW1wbF8ub3B0aW9uc18sIG90aGVyLT5faW1wbF8ub3B0aW9uc18pOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgT25lb2ZEZXNjcmlwdG9yUHJvdG86OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9bN10pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2U6Ol9JbnRlcm5hbCB7CisgcHVibGljOgorICB1c2luZyBIYXNCaXRzID0gZGVjbHR5cGUoc3RkOjpkZWNsdmFsPEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2U+KCkuX2ltcGxfLl9oYXNfYml0c18pOworICBzdGF0aWMgdm9pZCBzZXRfaGFzX3N0YXJ0KEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMXU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19lbmQoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAydTsKKyAgfQorfTsKKworRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZTo6RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlKQorfQorRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZTo6RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe2Zyb20uX2ltcGxfLl9oYXNfYml0c199CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zdGFydF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5lbmRfKXt9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICA6Om1lbWNweSgmX2ltcGxfLnN0YXJ0XywgJmZyb20uX2ltcGxfLnN0YXJ0XywKKyAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uZW5kXykgLQorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uc3RhcnRfKSkgKyBzaXplb2YoX2ltcGxfLmVuZF8pKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2UpCit9CisKK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2U6OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnN0YXJ0Xyl7MH0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5lbmRfKXswfQorICB9OworfQorCitFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlOjp+RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2UpCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworfQorCit2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2U6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2U6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2UpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwM3UpIHsKKyAgICA6Om1lbXNldCgmX2ltcGxfLnN0YXJ0XywgMCwgc3RhdGljX2Nhc3Q8c2l6ZV90PigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5lbmRfKSAtCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uc3RhcnRfKSkgKyBzaXplb2YoX2ltcGxfLmVuZF8pKTsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzXy5DbGVhcigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2U6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgX0ludGVybmFsOjpIYXNCaXRzIGhhc19iaXRze307CisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDgpKSB7CisgICAgICAgICAgX0ludGVybmFsOjpzZXRfaGFzX3N0YXJ0KCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLnN0YXJ0XyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDMyKCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTYpKSB7CisgICAgICAgICAgX0ludGVybmFsOjpzZXRfaGFzX2VuZCgmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy5lbmRfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50MzIoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIF9pbXBsXy5faGFzX2JpdHNfLk9yKGhhc19iaXRzKTsKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZTo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZSkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMSwgdGhpcy0+X2ludGVybmFsX3N0YXJ0KCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMiwgdGhpcy0+X2ludGVybmFsX2VuZCgpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2UpCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2UpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDN1KSB7CisgICAgLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgdG90YWxfc2l6ZSArPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemVQbHVzT25lKHRoaXMtPl9pbnRlcm5hbF9zdGFydCgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgICAgdG90YWxfc2l6ZSArPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemVQbHVzT25lKHRoaXMtPl9pbnRlcm5hbF9lbmQoKSk7CisgICAgfQorCisgIH0KKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZTo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2U6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZTo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZTo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgY2FjaGVkX2hhc19iaXRzID0gZnJvbS5faW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDN1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLnN0YXJ0XyA9IGZyb20uX2ltcGxfLnN0YXJ0XzsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLmVuZF8gPSBmcm9tLl9pbXBsXy5lbmRfOworICAgIH0KKyAgICBfdGhpcy0+X2ltcGxfLl9oYXNfYml0c19bMF0gfD0gY2FjaGVkX2hhc19iaXRzOworICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2U6OkNvcHlGcm9tKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2UpCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlOjpJbnRlcm5hbFN3YXAoRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzd2FwKF9pbXBsXy5faGFzX2JpdHNfWzBdLCBvdGhlci0+X2ltcGxfLl9oYXNfYml0c19bMF0pOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Om1lbXN3YXA8CisgICAgICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSwgX2ltcGxfLmVuZF8pCisgICAgICArIHNpemVvZihFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlOjpfaW1wbF8uZW5kXykKKyAgICAgIC0gUFJPVE9CVUZfRklFTERfT0ZGU0VUKEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UsIF9pbXBsXy5zdGFydF8pPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLnN0YXJ0XyksCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm90aGVyLT5faW1wbF8uc3RhcnRfKSk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzhdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBFbnVtRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKKyAgdXNpbmcgSGFzQml0cyA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxFbnVtRGVzY3JpcHRvclByb3RvPigpLl9pbXBsXy5faGFzX2JpdHNfKTsKKyAgc3RhdGljIHZvaWQgc2V0X2hhc19uYW1lKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMXU7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucyYgb3B0aW9ucyhjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvKiBtc2cpOworICBzdGF0aWMgdm9pZCBzZXRfaGFzX29wdGlvbnMoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAydTsKKyAgfQorfTsKKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1PcHRpb25zJgorRW51bURlc2NyaXB0b3JQcm90bzo6X0ludGVybmFsOjpvcHRpb25zKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8qIG1zZykgeworICByZXR1cm4gKm1zZy0+X2ltcGxfLm9wdGlvbnNfOworfQorRW51bURlc2NyaXB0b3JQcm90bzo6RW51bURlc2NyaXB0b3JQcm90byg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQorfQorRW51bURlc2NyaXB0b3JQcm90bzo6RW51bURlc2NyaXB0b3JQcm90byhjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBFbnVtRGVzY3JpcHRvclByb3RvKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe2Zyb20uX2ltcGxfLl9oYXNfYml0c199CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy52YWx1ZV8pe2Zyb20uX2ltcGxfLnZhbHVlX30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5yZXNlcnZlZF9yYW5nZV8pe2Zyb20uX2ltcGxfLnJlc2VydmVkX3JhbmdlX30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5yZXNlcnZlZF9uYW1lXyl7ZnJvbS5faW1wbF8ucmVzZXJ2ZWRfbmFtZV99CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubmFtZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXyl7bnVsbHB0cn19OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19uYW1lKCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLm5hbWVfLlNldChmcm9tLl9pbnRlcm5hbF9uYW1lKCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX29wdGlvbnMoKSkgeworICAgIF90aGlzLT5faW1wbF8ub3B0aW9uc18gPSBuZXcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1PcHRpb25zKCpmcm9tLl9pbXBsXy5vcHRpb25zXyk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCit9CisKK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnZhbHVlXyl7YXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucmVzZXJ2ZWRfcmFuZ2VfKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5yZXNlcnZlZF9uYW1lXyl7YXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubmFtZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXyl7bnVsbHB0cn0KKyAgfTsKKyAgX2ltcGxfLm5hbWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworfQorCitFbnVtRGVzY3JpcHRvclByb3RvOjp+RW51bURlc2NyaXB0b3JQcm90bygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8udmFsdWVfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5yZXNlcnZlZF9yYW5nZV8uflJlcGVhdGVkUHRyRmllbGQoKTsKKyAgX2ltcGxfLnJlc2VydmVkX25hbWVfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5uYW1lXy5EZXN0cm95KCk7CisgIGlmICh0aGlzICE9IGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSkgZGVsZXRlIF9pbXBsXy5vcHRpb25zXzsKK30KKwordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIF9pbXBsXy5fY2FjaGVkX3NpemVfLlNldChzaXplKTsKK30KKwordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfaW1wbF8udmFsdWVfLkNsZWFyKCk7CisgIF9pbXBsXy5yZXNlcnZlZF9yYW5nZV8uQ2xlYXIoKTsKKyAgX2ltcGxfLnJlc2VydmVkX25hbWVfLkNsZWFyKCk7CisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwM3UpIHsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIF9pbXBsXy5uYW1lXy5DbGVhck5vbkRlZmF1bHRUb0VtcHR5KCk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgICAgR09PR0xFX0RDSEVDSyhfaW1wbF8ub3B0aW9uc18gIT0gbnVsbHB0cik7CisgICAgICBfaW1wbF8ub3B0aW9uc18tPkNsZWFyKCk7CisgICAgfQorICB9CisgIF9pbXBsXy5faGFzX2JpdHNfLkNsZWFyKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogRW51bURlc2NyaXB0b3JQcm90bzo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICBfSW50ZXJuYWw6Okhhc0JpdHMgaGFzX2JpdHN7fTsKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTApKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byB2YWx1ZSA9IDI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxOCkpIHsKKyAgICAgICAgICBwdHIgLT0gMTsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9hZGRfdmFsdWUoKSwgcHRyKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDE4PihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zIG9wdGlvbnMgPSAzOworICAgICAgY2FzZSAzOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMjYpKSB7CisgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX211dGFibGVfb3B0aW9ucygpLCBwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2UgcmVzZXJ2ZWRfcmFuZ2UgPSA0OworICAgICAgY2FzZSA0OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMzQpKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfYWRkX3Jlc2VydmVkX3JhbmdlKCksIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzwzND4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgc3RyaW5nIHJlc2VydmVkX25hbWUgPSA1OworICAgICAgY2FzZSA1OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNDIpKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9hZGRfcmVzZXJ2ZWRfbmFtZSgpOworICAgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICAjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUiKTsKKyAgICAgICAgICAgICNlbmRpZiAgLy8gIU5ERUJVRworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8NDI+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIF9pbXBsXy5faGFzX2JpdHNfLk9yKGhhc19iaXRzKTsKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogRW51bURlc2NyaXB0b3JQcm90bzo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX25hbWUoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX25hbWUoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5uYW1lIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgMSwgdGhpcy0+X2ludGVybmFsX25hbWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHZhbHVlID0gMjsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwKKyAgICAgIG4gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4odGhpcy0+X2ludGVybmFsX3ZhbHVlX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF92YWx1ZShpKTsKKyAgICB0YXJnZXQgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoMiwgcmVwZmllbGQsIHJlcGZpZWxkLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSgzLCBfSW50ZXJuYWw6Om9wdGlvbnModGhpcyksCisgICAgICAgIF9JbnRlcm5hbDo6b3B0aW9ucyh0aGlzKS5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZSByZXNlcnZlZF9yYW5nZSA9IDQ7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9yZXNlcnZlZF9yYW5nZV9zaXplKCkpOyBpIDwgbjsgaSsrKSB7CisgICAgY29uc3QgYXV0byYgcmVwZmllbGQgPSB0aGlzLT5faW50ZXJuYWxfcmVzZXJ2ZWRfcmFuZ2UoaSk7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICAgIEludGVybmFsV3JpdGVNZXNzYWdlKDQsIHJlcGZpZWxkLCByZXBmaWVsZC5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIHN0cmluZyByZXNlcnZlZF9uYW1lID0gNTsKKyAgZm9yIChpbnQgaSA9IDAsIG4gPSB0aGlzLT5faW50ZXJuYWxfcmVzZXJ2ZWRfbmFtZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiBzID0gdGhpcy0+X2ludGVybmFsX3Jlc2VydmVkX25hbWUoaSk7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHMuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHMubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmcoNSwgcywgdGFyZ2V0KTsKKyAgfQorCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSkgeworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdDo6SW50ZXJuYWxTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgRW51bURlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQorICBzaXplX3QgdG90YWxfc2l6ZSA9IDA7CisKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdmFsdWUgPSAyOworICB0b3RhbF9zaXplICs9IDFVTCAqIHRoaXMtPl9pbnRlcm5hbF92YWx1ZV9zaXplKCk7CisgIGZvciAoY29uc3QgYXV0byYgbXNnIDogdGhpcy0+X2ltcGxfLnZhbHVlXykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKG1zZyk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2UgcmVzZXJ2ZWRfcmFuZ2UgPSA0OworICB0b3RhbF9zaXplICs9IDFVTCAqIHRoaXMtPl9pbnRlcm5hbF9yZXNlcnZlZF9yYW5nZV9zaXplKCk7CisgIGZvciAoY29uc3QgYXV0byYgbXNnIDogdGhpcy0+X2ltcGxfLnJlc2VydmVkX3JhbmdlXykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKG1zZyk7CisgIH0KKworICAvLyByZXBlYXRlZCBzdHJpbmcgcmVzZXJ2ZWRfbmFtZSA9IDU7CisgIHRvdGFsX3NpemUgKz0gMSAqCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZyb21JbnRTaXplKF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5zaXplKCkpOworICBmb3IgKGludCBpID0gMCwgbiA9IF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5zaXplKCk7IGkgPCBuOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICBfaW1wbF8ucmVzZXJ2ZWRfbmFtZV8uR2V0KGkpKTsKKyAgfQorCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwM3UpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgb3B0aW9ucyA9IDM7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZSgKKyAgICAgICAgICAqX2ltcGxfLm9wdGlvbnNfKTsKKyAgICB9CisKKyAgfQorICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBFbnVtRGVzY3JpcHRvclByb3RvOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgRW51bURlc2NyaXB0b3JQcm90bzo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpFbnVtRGVzY3JpcHRvclByb3RvOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8RW51bURlc2NyaXB0b3JQcm90byo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgRW51bURlc2NyaXB0b3JQcm90byY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfdGhpcy0+X2ltcGxfLnZhbHVlXy5NZXJnZUZyb20oZnJvbS5faW1wbF8udmFsdWVfKTsKKyAgX3RoaXMtPl9pbXBsXy5yZXNlcnZlZF9yYW5nZV8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLnJlc2VydmVkX3JhbmdlXyk7CisgIF90aGlzLT5faW1wbF8ucmVzZXJ2ZWRfbmFtZV8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLnJlc2VydmVkX25hbWVfKTsKKyAgY2FjaGVkX2hhc19iaXRzID0gZnJvbS5faW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDN1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9uYW1lKGZyb20uX2ludGVybmFsX25hbWUoKSk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKS0+OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1PcHRpb25zOjpNZXJnZUZyb20oCisgICAgICAgICAgZnJvbS5faW50ZXJuYWxfb3B0aW9ucygpKTsKKyAgICB9CisgIH0KKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIEVudW1EZXNjcmlwdG9yUHJvdG86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIGlmICghOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZChfaW1wbF8udmFsdWVfKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChfaW50ZXJuYWxfaGFzX29wdGlvbnMoKSkgeworICAgIGlmICghX2ltcGxfLm9wdGlvbnNfLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpJbnRlcm5hbFN3YXAoRW51bURlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBhdXRvKiBsaHNfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgYXV0byogcmhzX2FyZW5hID0gb3RoZXItPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzd2FwKF9pbXBsXy5faGFzX2JpdHNfWzBdLCBvdGhlci0+X2ltcGxfLl9oYXNfYml0c19bMF0pOworICBfaW1wbF8udmFsdWVfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy52YWx1ZV8pOworICBfaW1wbF8ucmVzZXJ2ZWRfcmFuZ2VfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5yZXNlcnZlZF9yYW5nZV8pOworICBfaW1wbF8ucmVzZXJ2ZWRfbmFtZV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLnJlc2VydmVkX25hbWVfKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5uYW1lXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8ubmFtZV8sIHJoc19hcmVuYQorICApOworICBzd2FwKF9pbXBsXy5vcHRpb25zXywgb3RoZXItPl9pbXBsXy5vcHRpb25zXyk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBFbnVtRGVzY3JpcHRvclByb3RvOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzldKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ol9JbnRlcm5hbCB7CisgcHVibGljOgorICB1c2luZyBIYXNCaXRzID0gZGVjbHR5cGUoc3RkOjpkZWNsdmFsPEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bz4oKS5faW1wbF8uX2hhc19iaXRzXyk7CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfbmFtZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDF1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfbnVtYmVyKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gNHU7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVPcHRpb25zJiBvcHRpb25zKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogbXNnKTsKKyAgc3RhdGljIHZvaWQgc2V0X2hhc19vcHRpb25zKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMnU7CisgIH0KK307CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVPcHRpb25zJgorRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWw6Om9wdGlvbnMoY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBtc2cpIHsKKyAgcmV0dXJuICptc2ctPl9pbXBsXy5vcHRpb25zXzsKK30KK0VudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykKK30KK0VudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe2Zyb20uX2ltcGxfLl9oYXNfYml0c199CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKXtudWxscHRyfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm51bWJlcl8pe319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19uYW1lKCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLm5hbWVfLlNldChmcm9tLl9pbnRlcm5hbF9uYW1lKCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX29wdGlvbnMoKSkgeworICAgIF90aGlzLT5faW1wbF8ub3B0aW9uc18gPSBuZXcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZU9wdGlvbnMoKmZyb20uX2ltcGxfLm9wdGlvbnNfKTsKKyAgfQorICBfdGhpcy0+X2ltcGxfLm51bWJlcl8gPSBmcm9tLl9pbXBsXy5udW1iZXJfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQorfQorCitpbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm5hbWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ub3B0aW9uc18pe251bGxwdHJ9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubnVtYmVyXyl7MH0KKyAgfTsKKyAgX2ltcGxfLm5hbWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworfQorCitFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86On5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy5uYW1lXy5EZXN0cm95KCk7CisgIGlmICh0aGlzICE9IGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSkgZGVsZXRlIF9pbXBsXy5vcHRpb25zXzsKK30KKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDN1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfaW1wbF8ubmFtZV8uQ2xlYXJOb25EZWZhdWx0VG9FbXB0eSgpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIEdPT0dMRV9EQ0hFQ0soX2ltcGxfLm9wdGlvbnNfICE9IG51bGxwdHIpOworICAgICAgX2ltcGxfLm9wdGlvbnNfLT5DbGVhcigpOworICAgIH0KKyAgfQorICBfaW1wbF8ubnVtYmVyXyA9IDA7CisgIF9pbXBsXy5faGFzX2JpdHNfLkNsZWFyKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIF9JbnRlcm5hbDo6SGFzQml0cyBoYXNfYml0c3t9OworICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxMCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICA6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lIik7CisgICAgICAgICAgI2VuZGlmICAvLyAhTkRFQlVHCisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMjsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDE2KSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19udW1iZXIoJmhhc19iaXRzKTsKKyAgICAgICAgICBfaW1wbF8ubnVtYmVyXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDMyKCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMgb3B0aW9ucyA9IDM7CisgICAgICBjYXNlIDM6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAyNikpIHsKKyAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCksIHB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIF9pbXBsXy5faGFzX2JpdHNfLk9yKGhhc19iaXRzKTsKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgMSwgdGhpcy0+X2ludGVybmFsX25hbWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA0dSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgyLCB0aGlzLT5faW50ZXJuYWxfbnVtYmVyKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMgb3B0aW9ucyA9IDM7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoMywgX0ludGVybmFsOjpvcHRpb25zKHRoaXMpLAorICAgICAgICBfSW50ZXJuYWw6Om9wdGlvbnModGhpcykuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwN3UpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKAorICAgICAgICAgICpfaW1wbF8ub3B0aW9uc18pOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZVBsdXNPbmUodGhpcy0+X2ludGVybmFsX251bWJlcigpKTsKKyAgICB9CisKKyAgfQorICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IGZyb20uX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA3dSkgeworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfbmFtZShmcm9tLl9pbnRlcm5hbF9uYW1lKCkpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCktPjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVPcHRpb25zOjpNZXJnZUZyb20oCisgICAgICAgICAgZnJvbS5faW50ZXJuYWxfb3B0aW9ucygpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLm51bWJlcl8gPSBmcm9tLl9pbXBsXy5udW1iZXJfOworICAgIH0KKyAgICBfdGhpcy0+X2ltcGxfLl9oYXNfYml0c19bMF0gfD0gY2FjaGVkX2hhc19iaXRzOworICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIGlmIChfaW50ZXJuYWxfaGFzX29wdGlvbnMoKSkgeworICAgIGlmICghX2ltcGxfLm9wdGlvbnNfLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OkludGVybmFsU3dhcChFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgYXV0byogbGhzX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGF1dG8qIHJoc19hcmVuYSA9IG90aGVyLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3dhcChfaW1wbF8uX2hhc19iaXRzX1swXSwgb3RoZXItPl9pbXBsXy5faGFzX2JpdHNfWzBdKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5uYW1lXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8ubmFtZV8sIHJoc19hcmVuYQorICApOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Om1lbXN3YXA8CisgICAgICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBfaW1wbF8ubnVtYmVyXykKKyAgICAgICsgc2l6ZW9mKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6X2ltcGxfLm51bWJlcl8pCisgICAgICAtIFBST1RPQlVGX0ZJRUxEX09GRlNFVChFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5vcHRpb25zXyk+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8ub3B0aW9uc18pLAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZvdGhlci0+X2ltcGxfLm9wdGlvbnNfKSk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9bMTBdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKKyAgdXNpbmcgSGFzQml0cyA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxTZXJ2aWNlRGVzY3JpcHRvclByb3RvPigpLl9pbXBsXy5faGFzX2JpdHNfKTsKKyAgc3RhdGljIHZvaWQgc2V0X2hhc19uYW1lKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMXU7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlT3B0aW9ucyYgb3B0aW9ucyhjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBtc2cpOworICBzdGF0aWMgdm9pZCBzZXRfaGFzX29wdGlvbnMoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAydTsKKyAgfQorfTsKKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VPcHRpb25zJgorU2VydmljZURlc2NyaXB0b3JQcm90bzo6X0ludGVybmFsOjpvcHRpb25zKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIG1zZykgeworICByZXR1cm4gKm1zZy0+X2ltcGxfLm9wdGlvbnNfOworfQorU2VydmljZURlc2NyaXB0b3JQcm90bzo6U2VydmljZURlc2NyaXB0b3JQcm90byg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQorfQorU2VydmljZURlc2NyaXB0b3JQcm90bzo6U2VydmljZURlc2NyaXB0b3JQcm90byhjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe2Zyb20uX2ltcGxfLl9oYXNfYml0c199CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5tZXRob2RfKXtmcm9tLl9pbXBsXy5tZXRob2RffQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm5hbWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ub3B0aW9uc18pe251bGxwdHJ9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8ubmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfbmFtZSgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5uYW1lXy5TZXQoZnJvbS5faW50ZXJuYWxfbmFtZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19vcHRpb25zKCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLm9wdGlvbnNfID0gbmV3IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlT3B0aW9ucygqZnJvbS5faW1wbF8ub3B0aW9uc18pOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQorfQorCitpbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5tZXRob2RfKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKXtudWxscHRyfQorICB9OworICBfaW1wbF8ubmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCit9CisKK1NlcnZpY2VEZXNjcmlwdG9yUHJvdG86On5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bykKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy5tZXRob2RfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5uYW1lXy5EZXN0cm95KCk7CisgIGlmICh0aGlzICE9IGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSkgZGVsZXRlIF9pbXBsXy5vcHRpb25zXzsKK30KKwordm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIF9pbXBsXy5fY2FjaGVkX3NpemVfLlNldChzaXplKTsKK30KKwordm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfaW1wbF8ubWV0aG9kXy5DbGVhcigpOworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDN1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfaW1wbF8ubmFtZV8uQ2xlYXJOb25EZWZhdWx0VG9FbXB0eSgpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIEdPT0dMRV9EQ0hFQ0soX2ltcGxfLm9wdGlvbnNfICE9IG51bGxwdHIpOworICAgICAgX2ltcGxfLm9wdGlvbnNfLT5DbGVhcigpOworICAgIH0KKyAgfQorICBfaW1wbF8uX2hhc19iaXRzXy5DbGVhcigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgX0ludGVybmFsOjpIYXNCaXRzIGhhc19iaXRze307CisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDEwKSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAjaWZuZGVmIE5ERUJVRworICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5uYW1lIik7CisgICAgICAgICAgI2VuZGlmICAvLyAhTkRFQlVHCisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8gbWV0aG9kID0gMjsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDE4KSkgeworICAgICAgICAgIHB0ciAtPSAxOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX2FkZF9tZXRob2QoKSwgcHRyKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDE4PihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOworICAgICAgY2FzZSAzOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMjYpKSB7CisgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX211dGFibGVfb3B0aW9ucygpLCBwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICBfaW1wbF8uX2hhc19iaXRzXy5PcihoYXNfYml0cyk7CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDEsIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCksIHRhcmdldCk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90byBtZXRob2QgPSAyOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfbWV0aG9kX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9tZXRob2QoaSk7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICAgIEludGVybmFsV3JpdGVNZXNzYWdlKDIsIHJlcGZpZWxkLCByZXBmaWVsZC5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMgb3B0aW9ucyA9IDM7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoMywgX0ludGVybmFsOjpvcHRpb25zKHRoaXMpLAorICAgICAgICBfSW50ZXJuYWw6Om9wdGlvbnModGhpcykuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bykKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bykKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7CisgIHRvdGFsX3NpemUgKz0gMVVMICogdGhpcy0+X2ludGVybmFsX21ldGhvZF9zaXplKCk7CisgIGZvciAoY29uc3QgYXV0byYgbXNnIDogdGhpcy0+X2ltcGxfLm1ldGhvZF8pIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZShtc2cpOworICB9CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAzdSkgeworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+X2ludGVybmFsX25hbWUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKAorICAgICAgICAgICpfaW1wbF8ub3B0aW9uc18pOworICAgIH0KKworICB9CisgIHJldHVybiBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCAmX2ltcGxfLl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKlNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH0KKworCit2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxTZXJ2aWNlRGVzY3JpcHRvclByb3RvKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJj4oZnJvbV9tc2cpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bykKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF90aGlzLT5faW1wbF8ubWV0aG9kXy5NZXJnZUZyb20oZnJvbS5faW1wbF8ubWV0aG9kXyk7CisgIGNhY2hlZF9oYXNfYml0cyA9IGZyb20uX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAzdSkgeworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfbmFtZShmcm9tLl9pbnRlcm5hbF9uYW1lKCkpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCktPjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlT3B0aW9uczo6TWVyZ2VGcm9tKAorICAgICAgICAgIGZyb20uX2ludGVybmFsX29wdGlvbnMoKSk7CisgICAgfQorICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICBpZiAoITo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQoX2ltcGxfLm1ldGhvZF8pKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKF9pbnRlcm5hbF9oYXNfb3B0aW9ucygpKSB7CisgICAgaWYgKCFfaW1wbF8ub3B0aW9uc18tPklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkludGVybmFsU3dhcChTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIGF1dG8qIGxoc19hcmVuYSA9IEdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBhdXRvKiByaHNfYXJlbmEgPSBvdGhlci0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN3YXAoX2ltcGxfLl9oYXNfYml0c19bMF0sIG90aGVyLT5faW1wbF8uX2hhc19iaXRzX1swXSk7CisgIF9pbXBsXy5tZXRob2RfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5tZXRob2RfKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5uYW1lXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8ubmFtZV8sIHJoc19hcmVuYQorICApOworICBzd2FwKF9pbXBsXy5vcHRpb25zXywgb3RoZXItPl9pbXBsXy5vcHRpb25zXyk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzExXSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKKyAgdXNpbmcgSGFzQml0cyA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxNZXRob2REZXNjcmlwdG9yUHJvdG8+KCkuX2ltcGxfLl9oYXNfYml0c18pOworICBzdGF0aWMgdm9pZCBzZXRfaGFzX25hbWUoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAxdTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX2lucHV0X3R5cGUoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAydTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX291dHB1dF90eXBlKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gNHU7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zJiBvcHRpb25zKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byogbXNnKTsKKyAgc3RhdGljIHZvaWQgc2V0X2hhc19vcHRpb25zKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gOHU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19jbGllbnRfc3RyZWFtaW5nKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMTZ1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfc2VydmVyX3N0cmVhbWluZyhIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDMydTsKKyAgfQorfTsKKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnMmCitNZXRob2REZXNjcmlwdG9yUHJvdG86Ol9JbnRlcm5hbDo6b3B0aW9ucyhjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8qIG1zZykgeworICByZXR1cm4gKm1zZy0+X2ltcGxfLm9wdGlvbnNfOworfQorTWV0aG9kRGVzY3JpcHRvclByb3RvOjpNZXRob2REZXNjcmlwdG9yUHJvdG8oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQpCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgU2hhcmVkQ3RvcihhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQorfQorTWV0aG9kRGVzY3JpcHRvclByb3RvOjpNZXRob2REZXNjcmlwdG9yUHJvdG8oY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBNZXRob2REZXNjcmlwdG9yUHJvdG8qIGNvbnN0IF90aGlzID0gdGhpczsgKHZvaWQpX3RoaXM7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXyl7ZnJvbS5faW1wbF8uX2hhc19iaXRzX30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm5hbWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uaW5wdXRfdHlwZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5vdXRwdXRfdHlwZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXyl7bnVsbHB0cn0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5jbGllbnRfc3RyZWFtaW5nXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnNlcnZlcl9zdHJlYW1pbmdfKXt9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8ubmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfbmFtZSgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5uYW1lXy5TZXQoZnJvbS5faW50ZXJuYWxfbmFtZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgX2ltcGxfLmlucHV0X3R5cGVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLmlucHV0X3R5cGVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX2lucHV0X3R5cGUoKSkgeworICAgIF90aGlzLT5faW1wbF8uaW5wdXRfdHlwZV8uU2V0KGZyb20uX2ludGVybmFsX2lucHV0X3R5cGUoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIF9pbXBsXy5vdXRwdXRfdHlwZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ub3V0cHV0X3R5cGVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX291dHB1dF90eXBlKCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLm91dHB1dF90eXBlXy5TZXQoZnJvbS5faW50ZXJuYWxfb3V0cHV0X3R5cGUoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfb3B0aW9ucygpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5vcHRpb25zXyA9IG5ldyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9ucygqZnJvbS5faW1wbF8ub3B0aW9uc18pOworICB9CisgIDo6bWVtY3B5KCZfaW1wbF8uY2xpZW50X3N0cmVhbWluZ18sICZmcm9tLl9pbXBsXy5jbGllbnRfc3RyZWFtaW5nXywKKyAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uc2VydmVyX3N0cmVhbWluZ18pIC0KKyAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLmNsaWVudF9zdHJlYW1pbmdfKSkgKyBzaXplb2YoX2ltcGxfLnNlcnZlcl9zdHJlYW1pbmdfKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCit9CisKK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubmFtZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5pbnB1dF90eXBlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm91dHB1dF90eXBlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKXtudWxscHRyfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmNsaWVudF9zdHJlYW1pbmdfKXtmYWxzZX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zZXJ2ZXJfc3RyZWFtaW5nXyl7ZmFsc2V9CisgIH07CisgIF9pbXBsXy5uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgX2ltcGxfLmlucHV0X3R5cGVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLmlucHV0X3R5cGVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBfaW1wbF8ub3V0cHV0X3R5cGVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLm91dHB1dF90eXBlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKK30KKworTWV0aG9kRGVzY3JpcHRvclByb3RvOjp+TWV0aG9kRGVzY3JpcHRvclByb3RvKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8ubmFtZV8uRGVzdHJveSgpOworICBfaW1wbF8uaW5wdXRfdHlwZV8uRGVzdHJveSgpOworICBfaW1wbF8ub3V0cHV0X3R5cGVfLkRlc3Ryb3koKTsKKyAgaWYgKHRoaXMgIT0gaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpKSBkZWxldGUgX2ltcGxfLm9wdGlvbnNfOworfQorCit2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwZnUpIHsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIF9pbXBsXy5uYW1lXy5DbGVhck5vbkRlZmF1bHRUb0VtcHR5KCk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgICAgX2ltcGxfLmlucHV0X3R5cGVfLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICBfaW1wbF8ub3V0cHV0X3R5cGVfLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgICBHT09HTEVfRENIRUNLKF9pbXBsXy5vcHRpb25zXyAhPSBudWxscHRyKTsKKyAgICAgIF9pbXBsXy5vcHRpb25zXy0+Q2xlYXIoKTsKKyAgICB9CisgIH0KKyAgOjptZW1zZXQoJl9pbXBsXy5jbGllbnRfc3RyZWFtaW5nXywgMCwgc3RhdGljX2Nhc3Q8c2l6ZV90PigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uc2VydmVyX3N0cmVhbWluZ18pIC0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uY2xpZW50X3N0cmVhbWluZ18pKSArIHNpemVvZihfaW1wbF8uc2VydmVyX3N0cmVhbWluZ18pKTsKKyAgX2ltcGxfLl9oYXNfYml0c18uQ2xlYXIoKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5DbGVhcjw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworfQorCitjb25zdCBjaGFyKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgX0ludGVybmFsOjpIYXNCaXRzIGhhc19iaXRze307CisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDEwKSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAjaWZuZGVmIE5ERUJVRworICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgaW5wdXRfdHlwZSA9IDI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxOCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX2lucHV0X3R5cGUoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICA6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5pbnB1dF90eXBlIik7CisgICAgICAgICAgI2VuZGlmICAvLyAhTkRFQlVHCisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG91dHB1dF90eXBlID0gMzsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDI2KSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfb3V0cHV0X3R5cGUoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICA6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vdXRwdXRfdHlwZSIpOworICAgICAgICAgICNlbmRpZiAgLy8gIU5ERUJVRworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDM0KSkgeworICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKSwgcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBjbGllbnRfc3RyZWFtaW5nID0gNSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDQwKSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19jbGllbnRfc3RyZWFtaW5nKCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLmNsaWVudF9zdHJlYW1pbmdfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgc2VydmVyX3N0cmVhbWluZyA9IDYgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDY6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA0OCkpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfc2VydmVyX3N0cmVhbWluZygmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy5zZXJ2ZXJfc3RyZWFtaW5nXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICBfaW1wbF8uX2hhc19iaXRzXy5PcihoYXNfYml0cyk7CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICB0aGlzLT5faW50ZXJuYWxfbmFtZSgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pih0aGlzLT5faW50ZXJuYWxfbmFtZSgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDEsIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgaW5wdXRfdHlwZSA9IDI7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICB0aGlzLT5faW50ZXJuYWxfaW5wdXRfdHlwZSgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pih0aGlzLT5faW50ZXJuYWxfaW5wdXRfdHlwZSgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDIsIHRoaXMtPl9pbnRlcm5hbF9pbnB1dF90eXBlKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgb3V0cHV0X3R5cGUgPSAzOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwNHUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX291dHB1dF90eXBlKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9vdXRwdXRfdHlwZSgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICAzLCB0aGlzLT5faW50ZXJuYWxfb3V0cHV0X3R5cGUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg0LCBfSW50ZXJuYWw6Om9wdGlvbnModGhpcyksCisgICAgICAgIF9JbnRlcm5hbDo6b3B0aW9ucyh0aGlzKS5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgY2xpZW50X3N0cmVhbWluZyA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDEwdSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDUsIHRoaXMtPl9pbnRlcm5hbF9jbGllbnRfc3RyZWFtaW5nKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBib29sIHNlcnZlcl9zdHJlYW1pbmcgPSA2IFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAyMHUpIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSg2LCB0aGlzLT5faW50ZXJuYWxfc2VydmVyX3N0cmVhbWluZygpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwM2Z1KSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5faW50ZXJuYWxfbmFtZSgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgaW5wdXRfdHlwZSA9IDI7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9pbnB1dF90eXBlKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBvdXRwdXRfdHlwZSA9IDM7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9vdXRwdXRfdHlwZSgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMgb3B0aW9ucyA9IDQ7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZSgKKyAgICAgICAgICAqX2ltcGxfLm9wdGlvbnNfKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIGNsaWVudF9zdHJlYW1pbmcgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDEwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIHNlcnZlcl9zdHJlYW1pbmcgPSA2IFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDIwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKKyAgfQorICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBNZXRob2REZXNjcmlwdG9yUHJvdG86Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBNZXRob2REZXNjcmlwdG9yUHJvdG86Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqTWV0aG9kRGVzY3JpcHRvclByb3RvOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxNZXRob2REZXNjcmlwdG9yUHJvdG8qPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IGZyb20uX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDNmdSkgeworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfbmFtZShmcm9tLl9pbnRlcm5hbF9uYW1lKCkpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X2lucHV0X3R5cGUoZnJvbS5faW50ZXJuYWxfaW5wdXRfdHlwZSgpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9vdXRwdXRfdHlwZShmcm9tLl9pbnRlcm5hbF9vdXRwdXRfdHlwZSgpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX211dGFibGVfb3B0aW9ucygpLT46OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9uczo6TWVyZ2VGcm9tKAorICAgICAgICAgIGZyb20uX2ludGVybmFsX29wdGlvbnMoKSk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDEwdSkgeworICAgICAgX3RoaXMtPl9pbXBsXy5jbGllbnRfc3RyZWFtaW5nXyA9IGZyb20uX2ltcGxfLmNsaWVudF9zdHJlYW1pbmdfOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAyMHUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8uc2VydmVyX3N0cmVhbWluZ18gPSBmcm9tLl9pbXBsXy5zZXJ2ZXJfc3RyZWFtaW5nXzsKKyAgICB9CisgICAgX3RoaXMtPl9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IGNhY2hlZF9oYXNfYml0czsKKyAgfQorICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICBpZiAoX2ludGVybmFsX2hhc19vcHRpb25zKCkpIHsKKyAgICBpZiAoIV9pbXBsXy5vcHRpb25zXy0+SXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpJbnRlcm5hbFN3YXAoTWV0aG9kRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIGF1dG8qIGxoc19hcmVuYSA9IEdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBhdXRvKiByaHNfYXJlbmEgPSBvdGhlci0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN3YXAoX2ltcGxfLl9oYXNfYml0c19bMF0sIG90aGVyLT5faW1wbF8uX2hhc19iaXRzX1swXSk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8ubmFtZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLm5hbWVfLCByaHNfYXJlbmEKKyAgKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5pbnB1dF90eXBlXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8uaW5wdXRfdHlwZV8sIHJoc19hcmVuYQorICApOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLm91dHB1dF90eXBlXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8ub3V0cHV0X3R5cGVfLCByaHNfYXJlbmEKKyAgKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjptZW1zd2FwPAorICAgICAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKE1ldGhvZERlc2NyaXB0b3JQcm90bywgX2ltcGxfLnNlcnZlcl9zdHJlYW1pbmdfKQorICAgICAgKyBzaXplb2YoTWV0aG9kRGVzY3JpcHRvclByb3RvOjpfaW1wbF8uc2VydmVyX3N0cmVhbWluZ18pCisgICAgICAtIFBST1RPQlVGX0ZJRUxEX09GRlNFVChNZXRob2REZXNjcmlwdG9yUHJvdG8sIF9pbXBsXy5vcHRpb25zXyk+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8ub3B0aW9uc18pLAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZvdGhlci0+X2ltcGxfLm9wdGlvbnNfKSk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBNZXRob2REZXNjcmlwdG9yUHJvdG86OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9bMTJdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBGaWxlT3B0aW9uczo6X0ludGVybmFsIHsKKyBwdWJsaWM6CisgIHVzaW5nIEhhc0JpdHMgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8RmlsZU9wdGlvbnM+KCkuX2ltcGxfLl9oYXNfYml0c18pOworICBzdGF0aWMgdm9pZCBzZXRfaGFzX2phdmFfcGFja2FnZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDF1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAydTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAxMDI0dTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMjA0OHU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19qYXZhX3N0cmluZ19jaGVja191dGY4KEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gNDA5NnU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19vcHRpbWl6ZV9mb3IoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAyNjIxNDR1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfZ29fcGFja2FnZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDR1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcyhIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDgxOTJ1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMTYzODR1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcyhIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDMyNzY4dTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX3BocF9nZW5lcmljX3NlcnZpY2VzKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gNjU1MzZ1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfZGVwcmVjYXRlZChIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDEzMTA3MnU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19jY19lbmFibGVfYXJlbmFzKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gNTI0Mjg4dTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX29iamNfY2xhc3NfcHJlZml4KEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gOHU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19jc2hhcnBfbmFtZXNwYWNlKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMTZ1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfc3dpZnRfcHJlZml4KEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMzJ1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfcGhwX2NsYXNzX3ByZWZpeChIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDY0dTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX3BocF9uYW1lc3BhY2UoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAxMjh1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfcGhwX21ldGFkYXRhX25hbWVzcGFjZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDI1NnU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19ydWJ5X3BhY2thZ2UoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSA1MTJ1OworICB9Cit9OworCitGaWxlT3B0aW9uczo6RmlsZU9wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQpCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgU2hhcmVkQ3RvcihhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCit9CitGaWxlT3B0aW9uczo6RmlsZU9wdGlvbnMoY29uc3QgRmlsZU9wdGlvbnMmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIEZpbGVPcHRpb25zKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgLypkZWNsdHlwZShfaW1wbF8uX2V4dGVuc2lvbnNfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXtmcm9tLl9pbXBsXy5faGFzX2JpdHNffQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKXtmcm9tLl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl99CisgICAgLCBkZWNsdHlwZShfaW1wbF8uamF2YV9wYWNrYWdlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmphdmFfb3V0ZXJfY2xhc3NuYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmdvX3BhY2thZ2VfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ub2JqY19jbGFzc19wcmVmaXhfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uY3NoYXJwX25hbWVzcGFjZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zd2lmdF9wcmVmaXhfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucGhwX2NsYXNzX3ByZWZpeF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5waHBfbmFtZXNwYWNlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnBocF9tZXRhZGF0YV9uYW1lc3BhY2VfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucnVieV9wYWNrYWdlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmphdmFfbXVsdGlwbGVfZmlsZXNfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uamF2YV9zdHJpbmdfY2hlY2tfdXRmOF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5jY19nZW5lcmljX3NlcnZpY2VzXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmphdmFfZ2VuZXJpY19zZXJ2aWNlc18pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5weV9nZW5lcmljX3NlcnZpY2VzXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnBocF9nZW5lcmljX3NlcnZpY2VzXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmRlcHJlY2F0ZWRfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ub3B0aW1pemVfZm9yXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmNjX2VuYWJsZV9hcmVuYXNfKXt9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8uX2V4dGVuc2lvbnNfLk1lcmdlRnJvbShpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCksIGZyb20uX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIF9pbXBsXy5qYXZhX3BhY2thZ2VfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLmphdmFfcGFja2FnZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfamF2YV9wYWNrYWdlKCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLmphdmFfcGFja2FnZV8uU2V0KGZyb20uX2ludGVybmFsX2phdmFfcGFja2FnZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgX2ltcGxfLmphdmFfb3V0ZXJfY2xhc3NuYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5qYXZhX291dGVyX2NsYXNzbmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSkgeworICAgIF90aGlzLT5faW1wbF8uamF2YV9vdXRlcl9jbGFzc25hbWVfLlNldChmcm9tLl9pbnRlcm5hbF9qYXZhX291dGVyX2NsYXNzbmFtZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgX2ltcGxfLmdvX3BhY2thZ2VfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLmdvX3BhY2thZ2VfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX2dvX3BhY2thZ2UoKSkgeworICAgIF90aGlzLT5faW1wbF8uZ29fcGFja2FnZV8uU2V0KGZyb20uX2ludGVybmFsX2dvX3BhY2thZ2UoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIF9pbXBsXy5vYmpjX2NsYXNzX3ByZWZpeF8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ub2JqY19jbGFzc19wcmVmaXhfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX29iamNfY2xhc3NfcHJlZml4KCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLm9iamNfY2xhc3NfcHJlZml4Xy5TZXQoZnJvbS5faW50ZXJuYWxfb2JqY19jbGFzc19wcmVmaXgoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIF9pbXBsXy5jc2hhcnBfbmFtZXNwYWNlXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5jc2hhcnBfbmFtZXNwYWNlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19jc2hhcnBfbmFtZXNwYWNlKCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLmNzaGFycF9uYW1lc3BhY2VfLlNldChmcm9tLl9pbnRlcm5hbF9jc2hhcnBfbmFtZXNwYWNlKCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICBfaW1wbF8uc3dpZnRfcHJlZml4Xy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5zd2lmdF9wcmVmaXhfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX3N3aWZ0X3ByZWZpeCgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5zd2lmdF9wcmVmaXhfLlNldChmcm9tLl9pbnRlcm5hbF9zd2lmdF9wcmVmaXgoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIF9pbXBsXy5waHBfY2xhc3NfcHJlZml4Xy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5waHBfY2xhc3NfcHJlZml4Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19waHBfY2xhc3NfcHJlZml4KCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLnBocF9jbGFzc19wcmVmaXhfLlNldChmcm9tLl9pbnRlcm5hbF9waHBfY2xhc3NfcHJlZml4KCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICBfaW1wbF8ucGhwX25hbWVzcGFjZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ucGhwX25hbWVzcGFjZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfcGhwX25hbWVzcGFjZSgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5waHBfbmFtZXNwYWNlXy5TZXQoZnJvbS5faW50ZXJuYWxfcGhwX25hbWVzcGFjZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgX2ltcGxfLnBocF9tZXRhZGF0YV9uYW1lc3BhY2VfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLnBocF9tZXRhZGF0YV9uYW1lc3BhY2VfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX3BocF9tZXRhZGF0YV9uYW1lc3BhY2UoKSkgeworICAgIF90aGlzLT5faW1wbF8ucGhwX21ldGFkYXRhX25hbWVzcGFjZV8uU2V0KGZyb20uX2ludGVybmFsX3BocF9tZXRhZGF0YV9uYW1lc3BhY2UoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIF9pbXBsXy5ydWJ5X3BhY2thZ2VfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLnJ1YnlfcGFja2FnZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfcnVieV9wYWNrYWdlKCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLnJ1YnlfcGFja2FnZV8uU2V0KGZyb20uX2ludGVybmFsX3J1YnlfcGFja2FnZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgOjptZW1jcHkoJl9pbXBsXy5qYXZhX211bHRpcGxlX2ZpbGVzXywgJmZyb20uX2ltcGxfLmphdmFfbXVsdGlwbGVfZmlsZXNfLAorICAgIHN0YXRpY19jYXN0PHNpemVfdD4ocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5jY19lbmFibGVfYXJlbmFzXykgLQorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uamF2YV9tdWx0aXBsZV9maWxlc18pKSArIHNpemVvZihfaW1wbF8uY2NfZW5hYmxlX2FyZW5hc18pKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQorfQorCitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICAvKmRlY2x0eXBlKF9pbXBsXy5fZXh0ZW5zaW9uc18pKi97OjpfcGJpOjpBcmVuYUluaXRpYWxpemVkKCksIGFyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyl7YXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uamF2YV9wYWNrYWdlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmphdmFfb3V0ZXJfY2xhc3NuYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmdvX3BhY2thZ2VfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ub2JqY19jbGFzc19wcmVmaXhfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uY3NoYXJwX25hbWVzcGFjZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zd2lmdF9wcmVmaXhfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucGhwX2NsYXNzX3ByZWZpeF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5waHBfbmFtZXNwYWNlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnBocF9tZXRhZGF0YV9uYW1lc3BhY2VfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucnVieV9wYWNrYWdlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmphdmFfbXVsdGlwbGVfZmlsZXNfKXtmYWxzZX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8pe2ZhbHNlfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmphdmFfc3RyaW5nX2NoZWNrX3V0ZjhfKXtmYWxzZX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5jY19nZW5lcmljX3NlcnZpY2VzXyl7ZmFsc2V9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uamF2YV9nZW5lcmljX3NlcnZpY2VzXyl7ZmFsc2V9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucHlfZ2VuZXJpY19zZXJ2aWNlc18pe2ZhbHNlfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnBocF9nZW5lcmljX3NlcnZpY2VzXyl7ZmFsc2V9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZGVwcmVjYXRlZF8pe2ZhbHNlfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm9wdGltaXplX2Zvcl8pezF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uY2NfZW5hYmxlX2FyZW5hc18pe3RydWV9CisgIH07CisgIF9pbXBsXy5qYXZhX3BhY2thZ2VfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLmphdmFfcGFja2FnZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIF9pbXBsXy5qYXZhX291dGVyX2NsYXNzbmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8uamF2YV9vdXRlcl9jbGFzc25hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBfaW1wbF8uZ29fcGFja2FnZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8uZ29fcGFja2FnZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIF9pbXBsXy5vYmpjX2NsYXNzX3ByZWZpeF8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ub2JqY19jbGFzc19wcmVmaXhfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBfaW1wbF8uY3NoYXJwX25hbWVzcGFjZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8uY3NoYXJwX25hbWVzcGFjZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIF9pbXBsXy5zd2lmdF9wcmVmaXhfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLnN3aWZ0X3ByZWZpeF8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIF9pbXBsXy5waHBfY2xhc3NfcHJlZml4Xy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5waHBfY2xhc3NfcHJlZml4Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgX2ltcGxfLnBocF9uYW1lc3BhY2VfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLnBocF9uYW1lc3BhY2VfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBfaW1wbF8ucGhwX21ldGFkYXRhX25hbWVzcGFjZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ucGhwX21ldGFkYXRhX25hbWVzcGFjZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIF9pbXBsXy5ydWJ5X3BhY2thZ2VfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLnJ1YnlfcGFja2FnZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCit9CisKK0ZpbGVPcHRpb25zOjp+RmlsZU9wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8uX2V4dGVuc2lvbnNfLn5FeHRlbnNpb25TZXQoKTsKKyAgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworICBfaW1wbF8uamF2YV9wYWNrYWdlXy5EZXN0cm95KCk7CisgIF9pbXBsXy5qYXZhX291dGVyX2NsYXNzbmFtZV8uRGVzdHJveSgpOworICBfaW1wbF8uZ29fcGFja2FnZV8uRGVzdHJveSgpOworICBfaW1wbF8ub2JqY19jbGFzc19wcmVmaXhfLkRlc3Ryb3koKTsKKyAgX2ltcGxfLmNzaGFycF9uYW1lc3BhY2VfLkRlc3Ryb3koKTsKKyAgX2ltcGxfLnN3aWZ0X3ByZWZpeF8uRGVzdHJveSgpOworICBfaW1wbF8ucGhwX2NsYXNzX3ByZWZpeF8uRGVzdHJveSgpOworICBfaW1wbF8ucGhwX25hbWVzcGFjZV8uRGVzdHJveSgpOworICBfaW1wbF8ucGhwX21ldGFkYXRhX25hbWVzcGFjZV8uRGVzdHJveSgpOworICBfaW1wbF8ucnVieV9wYWNrYWdlXy5EZXN0cm95KCk7Cit9CisKK3ZvaWQgRmlsZU9wdGlvbnM6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIEZpbGVPcHRpb25zOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLl9leHRlbnNpb25zXy5DbGVhcigpOworICBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7CisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDBmZnUpIHsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIF9pbXBsXy5qYXZhX3BhY2thZ2VfLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICBfaW1wbF8uamF2YV9vdXRlcl9jbGFzc25hbWVfLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICBfaW1wbF8uZ29fcGFja2FnZV8uQ2xlYXJOb25EZWZhdWx0VG9FbXB0eSgpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwOHUpIHsKKyAgICAgIF9pbXBsXy5vYmpjX2NsYXNzX3ByZWZpeF8uQ2xlYXJOb25EZWZhdWx0VG9FbXB0eSgpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAxMHUpIHsKKyAgICAgIF9pbXBsXy5jc2hhcnBfbmFtZXNwYWNlXy5DbGVhck5vbkRlZmF1bHRUb0VtcHR5KCk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDIwdSkgeworICAgICAgX2ltcGxfLnN3aWZ0X3ByZWZpeF8uQ2xlYXJOb25EZWZhdWx0VG9FbXB0eSgpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDA0MHUpIHsKKyAgICAgIF9pbXBsXy5waHBfY2xhc3NfcHJlZml4Xy5DbGVhck5vbkRlZmF1bHRUb0VtcHR5KCk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDgwdSkgeworICAgICAgX2ltcGxfLnBocF9uYW1lc3BhY2VfLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTsKKyAgICB9CisgIH0KKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAzMDB1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAxMDB1KSB7CisgICAgICBfaW1wbF8ucGhwX21ldGFkYXRhX25hbWVzcGFjZV8uQ2xlYXJOb25EZWZhdWx0VG9FbXB0eSgpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDIwMHUpIHsKKyAgICAgIF9pbXBsXy5ydWJ5X3BhY2thZ2VfLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTsKKyAgICB9CisgIH0KKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMGZjMDB1KSB7CisgICAgOjptZW1zZXQoJl9pbXBsXy5qYXZhX211bHRpcGxlX2ZpbGVzXywgMCwgc3RhdGljX2Nhc3Q8c2l6ZV90PigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5weV9nZW5lcmljX3NlcnZpY2VzXykgLQorICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLmphdmFfbXVsdGlwbGVfZmlsZXNfKSkgKyBzaXplb2YoX2ltcGxfLnB5X2dlbmVyaWNfc2VydmljZXNfKSk7CisgIH0KKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwZjAwMDB1KSB7CisgICAgOjptZW1zZXQoJl9pbXBsXy5waHBfZ2VuZXJpY19zZXJ2aWNlc18sIDAsIHN0YXRpY19jYXN0PHNpemVfdD4oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uZGVwcmVjYXRlZF8pIC0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5waHBfZ2VuZXJpY19zZXJ2aWNlc18pKSArIHNpemVvZihfaW1wbF8uZGVwcmVjYXRlZF8pKTsKKyAgICBfaW1wbF8ub3B0aW1pemVfZm9yXyA9IDE7CisgICAgX2ltcGxfLmNjX2VuYWJsZV9hcmVuYXNfID0gdHJ1ZTsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzXy5DbGVhcigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIEZpbGVPcHRpb25zOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIF9JbnRlcm5hbDo6SGFzQml0cyBoYXNfYml0c3t9OworICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9wYWNrYWdlID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDEwKSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfamF2YV9wYWNrYWdlKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9vdXRlcl9jbGFzc25hbWUgPSA4OworICAgICAgY2FzZSA4OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNjYpKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAjaWZuZGVmIE5ERUJVRworICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IgPSA5IFtkZWZhdWx0ID0gU1BFRURdOworICAgICAgY2FzZSA5OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNzIpKSB7CisgICAgICAgICAgdWludDY0X3QgdmFsID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZV9Jc1ZhbGlkKHZhbCkpKSB7CisgICAgICAgICAgICBfaW50ZXJuYWxfc2V0X29wdGltaXplX2ZvcihzdGF0aWNfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlPih2YWwpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXcml0ZVZhcmludCg5LCB2YWwsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlcyA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAxMDoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDgwKSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19qYXZhX211bHRpcGxlX2ZpbGVzKCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLmphdmFfbXVsdGlwbGVfZmlsZXNfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBnb19wYWNrYWdlID0gMTE7CisgICAgICBjYXNlIDExOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gOTApKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9nb19wYWNrYWdlKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5nb19wYWNrYWdlIik7CisgICAgICAgICAgI2VuZGlmICAvLyAhTkRFQlVHCisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDE2OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTI4KSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19jY19nZW5lcmljX3NlcnZpY2VzKCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLmNjX2dlbmVyaWNfc2VydmljZXNfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzID0gMTcgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDE3OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTM2KSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoJmhhc19iaXRzKTsKKyAgICAgICAgICBfaW1wbF8uamF2YV9nZW5lcmljX3NlcnZpY2VzXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICAgIGNhc2UgMTg6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxNDQpKSB7CisgICAgICAgICAgX0ludGVybmFsOjpzZXRfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoJmhhc19iaXRzKTsKKyAgICAgICAgICBfaW1wbF8ucHlfZ2VuZXJpY19zZXJ2aWNlc18gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IDIwIFtkZXByZWNhdGVkID0gdHJ1ZV07CisgICAgICBjYXNlIDIwOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTYwKSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMjMgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDIzOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTg0KSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19kZXByZWNhdGVkKCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLmRlcHJlY2F0ZWRfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9zdHJpbmdfY2hlY2tfdXRmOCA9IDI3IFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAyNzoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDIxNikpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy5qYXZhX3N0cmluZ19jaGVja191dGY4XyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBib29sIGNjX2VuYWJsZV9hcmVuYXMgPSAzMSBbZGVmYXVsdCA9IHRydWVdOworICAgICAgY2FzZSAzMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDI0OCkpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfY2NfZW5hYmxlX2FyZW5hcygmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy5jY19lbmFibGVfYXJlbmFzXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgb2JqY19jbGFzc19wcmVmaXggPSAzNjsKKyAgICAgIGNhc2UgMzY6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAzNCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX29iamNfY2xhc3NfcHJlZml4KCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5vYmpjX2NsYXNzX3ByZWZpeCIpOworICAgICAgICAgICNlbmRpZiAgLy8gIU5ERUJVRworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBjc2hhcnBfbmFtZXNwYWNlID0gMzc7CisgICAgICBjYXNlIDM3OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNDIpKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9jc2hhcnBfbmFtZXNwYWNlKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jc2hhcnBfbmFtZXNwYWNlIik7CisgICAgICAgICAgI2VuZGlmICAvLyAhTkRFQlVHCisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHN3aWZ0X3ByZWZpeCA9IDM5OworICAgICAgY2FzZSAzOToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDU4KSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfc3dpZnRfcHJlZml4KCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5zd2lmdF9wcmVmaXgiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgcGhwX2NsYXNzX3ByZWZpeCA9IDQwOworICAgICAgY2FzZSA0MDoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDY2KSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfcGhwX2NsYXNzX3ByZWZpeCgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAjaWZuZGVmIE5ERUJVRworICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucGhwX2NsYXNzX3ByZWZpeCIpOworICAgICAgICAgICNlbmRpZiAgLy8gIU5ERUJVRworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBwaHBfbmFtZXNwYWNlID0gNDE7CisgICAgICBjYXNlIDQxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNzQpKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9waHBfbmFtZXNwYWNlKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5waHBfbmFtZXNwYWNlIik7CisgICAgICAgICAgI2VuZGlmICAvLyAhTkRFQlVHCisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBwaHBfZ2VuZXJpY19zZXJ2aWNlcyA9IDQyIFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSA0MjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDgwKSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19waHBfZ2VuZXJpY19zZXJ2aWNlcygmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy5waHBfZ2VuZXJpY19zZXJ2aWNlc18gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHBocF9tZXRhZGF0YV9uYW1lc3BhY2UgPSA0NDsKKyAgICAgIGNhc2UgNDQ6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA5OCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX3BocF9tZXRhZGF0YV9uYW1lc3BhY2UoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICA6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnBocF9tZXRhZGF0YV9uYW1lc3BhY2UiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgcnVieV9wYWNrYWdlID0gNDU7CisgICAgICBjYXNlIDQ1OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTA2KSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfcnVieV9wYWNrYWdlKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5ydWJ5X3BhY2thZ2UiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgICAgICBjYXNlIDk5OToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDU4KSkgeworICAgICAgICAgIHB0ciAtPSAyOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAyOworICAgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX2FkZF91bmludGVycHJldGVkX29wdGlvbigpLCBwdHIpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8Nzk5ND4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICB9ICAvLyBzd2l0Y2gKKyAgaGFuZGxlX3VudXN1YWw6CisgICAgaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkgeworICAgICAgQ0hLXyhwdHIpOworICAgICAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7CisgICAgICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyAgICB9CisgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7CisgICAgICBwdHIgPSBfaW1wbF8uX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBwdHIsIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgJl9pbnRlcm5hbF9tZXRhZGF0YV8sIGN0eCk7CisgICAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICBfaW1wbF8uX2hhc19iaXRzXy5PcihoYXNfYml0cyk7CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIEZpbGVPcHRpb25zOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfcGFja2FnZSA9IDE7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICB0aGlzLT5faW50ZXJuYWxfamF2YV9wYWNrYWdlKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9qYXZhX3BhY2thZ2UoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgMSwgdGhpcy0+X2ludGVybmFsX2phdmFfcGFja2FnZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gODsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9qYXZhX291dGVyX2NsYXNzbmFtZSgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pih0aGlzLT5faW50ZXJuYWxfamF2YV9vdXRlcl9jbGFzc25hbWUoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICA4LCB0aGlzLT5faW50ZXJuYWxfamF2YV9vdXRlcl9jbGFzc25hbWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQgPSBTUEVFRF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDQwMDAwdSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAorICAgICAgOSwgdGhpcy0+X2ludGVybmFsX29wdGltaXplX2ZvcigpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwNDAwdSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDEwLCB0aGlzLT5faW50ZXJuYWxfamF2YV9tdWx0aXBsZV9maWxlcygpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9nb19wYWNrYWdlKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9nb19wYWNrYWdlKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmdvX3BhY2thZ2UiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICAxMSwgdGhpcy0+X2ludGVybmFsX2dvX3BhY2thZ2UoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IDE2IFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMjAwMHUpIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgxNiwgdGhpcy0+X2ludGVybmFsX2NjX2dlbmVyaWNfc2VydmljZXMoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzID0gMTcgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDA0MDAwdSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDE3LCB0aGlzLT5faW50ZXJuYWxfamF2YV9nZW5lcmljX3NlcnZpY2VzKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDgwMDB1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMTgsIHRoaXMtPl9pbnRlcm5hbF9weV9nZW5lcmljX3NlcnZpY2VzKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gMjAgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDA4MDB1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMjAsIHRoaXMtPl9pbnRlcm5hbF9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMjMgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDIwMDAwdSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDIzLCB0aGlzLT5faW50ZXJuYWxfZGVwcmVjYXRlZCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX3N0cmluZ19jaGVja191dGY4ID0gMjcgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAxMDAwdSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDI3LCB0aGlzLT5faW50ZXJuYWxfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBjY19lbmFibGVfYXJlbmFzID0gMzEgW2RlZmF1bHQgPSB0cnVlXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwODAwMDB1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMzEsIHRoaXMtPl9pbnRlcm5hbF9jY19lbmFibGVfYXJlbmFzKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgb2JqY19jbGFzc19wcmVmaXggPSAzNjsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9vYmpjX2NsYXNzX3ByZWZpeCgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pih0aGlzLT5faW50ZXJuYWxfb2JqY19jbGFzc19wcmVmaXgoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICAzNiwgdGhpcy0+X2ludGVybmFsX29iamNfY2xhc3NfcHJlZml4KCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgY3NoYXJwX25hbWVzcGFjZSA9IDM3OworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAxMHUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX2NzaGFycF9uYW1lc3BhY2UoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX2NzaGFycF9uYW1lc3BhY2UoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDM3LCB0aGlzLT5faW50ZXJuYWxfY3NoYXJwX25hbWVzcGFjZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHN3aWZ0X3ByZWZpeCA9IDM5OworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAyMHUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX3N3aWZ0X3ByZWZpeCgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pih0aGlzLT5faW50ZXJuYWxfc3dpZnRfcHJlZml4KCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnN3aWZ0X3ByZWZpeCIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDM5LCB0aGlzLT5faW50ZXJuYWxfc3dpZnRfcHJlZml4KCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgcGhwX2NsYXNzX3ByZWZpeCA9IDQwOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDA0MHUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX3BocF9jbGFzc19wcmVmaXgoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX3BocF9jbGFzc19wcmVmaXgoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucGhwX2NsYXNzX3ByZWZpeCIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDQwLCB0aGlzLT5faW50ZXJuYWxfcGhwX2NsYXNzX3ByZWZpeCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHBocF9uYW1lc3BhY2UgPSA0MTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwODB1KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9waHBfbmFtZXNwYWNlKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9waHBfbmFtZXNwYWNlKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnBocF9uYW1lc3BhY2UiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICA0MSwgdGhpcy0+X2ludGVybmFsX3BocF9uYW1lc3BhY2UoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgcGhwX2dlbmVyaWNfc2VydmljZXMgPSA0MiBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMTAwMDB1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoNDIsIHRoaXMtPl9pbnRlcm5hbF9waHBfZ2VuZXJpY19zZXJ2aWNlcygpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHBocF9tZXRhZGF0YV9uYW1lc3BhY2UgPSA0NDsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAxMDB1KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9waHBfbWV0YWRhdGFfbmFtZXNwYWNlKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9waHBfbWV0YWRhdGFfbmFtZXNwYWNlKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnBocF9tZXRhZGF0YV9uYW1lc3BhY2UiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICA0NCwgdGhpcy0+X2ludGVybmFsX3BocF9tZXRhZGF0YV9uYW1lc3BhY2UoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBydWJ5X3BhY2thZ2UgPSA0NTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAyMDB1KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9ydWJ5X3BhY2thZ2UoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX3J1YnlfcGFja2FnZSgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5ydWJ5X3BhY2thZ2UiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICA0NSwgdGhpcy0+X2ludGVybmFsX3J1YnlfcGFja2FnZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpKTsgaSA8IG47IGkrKykgeworICAgIGNvbnN0IGF1dG8mIHJlcGZpZWxkID0gdGhpcy0+X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg5OTksIHJlcGZpZWxkLCByZXBmaWVsZC5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQorICB0YXJnZXQgPSBfaW1wbF8uX2V4dGVuc2lvbnNfLl9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCwgc3RyZWFtKTsKKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBGaWxlT3B0aW9uczo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHRvdGFsX3NpemUgKz0gX2ltcGxfLl9leHRlbnNpb25zXy5CeXRlU2l6ZSgpOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgdG90YWxfc2l6ZSArPSAyVUwgKiB0aGlzLT5faW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZShtc2cpOworICB9CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMGZmdSkgeworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX3BhY2thZ2UgPSAxOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5faW50ZXJuYWxfamF2YV9wYWNrYWdlKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDg7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9qYXZhX291dGVyX2NsYXNzbmFtZSgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgZ29fcGFja2FnZSA9IDExOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA0dSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5faW50ZXJuYWxfZ29fcGFja2FnZSgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgb2JqY19jbGFzc19wcmVmaXggPSAzNjsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwOHUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMiArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+X2ludGVybmFsX29iamNfY2xhc3NfcHJlZml4KCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBjc2hhcnBfbmFtZXNwYWNlID0gMzc7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMTB1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDIgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9jc2hhcnBfbmFtZXNwYWNlKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBzd2lmdF9wcmVmaXggPSAzOTsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAyMHUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMiArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+X2ludGVybmFsX3N3aWZ0X3ByZWZpeCgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgcGhwX2NsYXNzX3ByZWZpeCA9IDQwOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDQwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAyICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5faW50ZXJuYWxfcGhwX2NsYXNzX3ByZWZpeCgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgcGhwX25hbWVzcGFjZSA9IDQxOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDgwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAyICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5faW50ZXJuYWxfcGhwX25hbWVzcGFjZSgpKTsKKyAgICB9CisKKyAgfQorICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwZmYwMHUpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgcGhwX21ldGFkYXRhX25hbWVzcGFjZSA9IDQ0OworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMTAwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAyICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5faW50ZXJuYWxfcGhwX21ldGFkYXRhX25hbWVzcGFjZSgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgcnVieV9wYWNrYWdlID0gNDU7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAyMDB1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDIgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9ydWJ5X3BhY2thZ2UoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDA0MDB1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggPSAyMCBbZGVwcmVjYXRlZCA9IHRydWVdOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwODAwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAyICsgMTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjggPSAyNyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMTAwMHUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMiArIDE7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDIwMDB1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDIgKyAxOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzID0gMTcgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDQwMDB1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDIgKyAxOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGJvb2wgcHlfZ2VuZXJpY19zZXJ2aWNlcyA9IDE4IFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDA4MDAwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAyICsgMTsKKyAgICB9CisKKyAgfQorICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDBmMDAwMHUpIHsKKyAgICAvLyBvcHRpb25hbCBib29sIHBocF9nZW5lcmljX3NlcnZpY2VzID0gNDIgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMTAwMDB1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDIgKyAxOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDIzIFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDIwMDAwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAyICsgMTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IgPSA5IFtkZWZhdWx0ID0gU1BFRURdOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDQwMDAwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodGhpcy0+X2ludGVybmFsX29wdGltaXplX2ZvcigpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIGNjX2VuYWJsZV9hcmVuYXMgPSAzMSBbZGVmYXVsdCA9IHRydWVdOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDgwMDAwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAyICsgMTsKKyAgICB9CisKKyAgfQorICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBGaWxlT3B0aW9uczo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIEZpbGVPcHRpb25zOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkZpbGVPcHRpb25zOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBGaWxlT3B0aW9uczo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PEZpbGVPcHRpb25zKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBGaWxlT3B0aW9ucyY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX3RoaXMtPl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgIGNhY2hlZF9oYXNfYml0cyA9IGZyb20uX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMGZmdSkgeworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfamF2YV9wYWNrYWdlKGZyb20uX2ludGVybmFsX2phdmFfcGFja2FnZSgpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9qYXZhX291dGVyX2NsYXNzbmFtZShmcm9tLl9pbnRlcm5hbF9qYXZhX291dGVyX2NsYXNzbmFtZSgpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9nb19wYWNrYWdlKGZyb20uX2ludGVybmFsX2dvX3BhY2thZ2UoKSk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA4dSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfb2JqY19jbGFzc19wcmVmaXgoZnJvbS5faW50ZXJuYWxfb2JqY19jbGFzc19wcmVmaXgoKSk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDEwdSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfY3NoYXJwX25hbWVzcGFjZShmcm9tLl9pbnRlcm5hbF9jc2hhcnBfbmFtZXNwYWNlKCkpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAyMHUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X3N3aWZ0X3ByZWZpeChmcm9tLl9pbnRlcm5hbF9zd2lmdF9wcmVmaXgoKSk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDQwdSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfcGhwX2NsYXNzX3ByZWZpeChmcm9tLl9pbnRlcm5hbF9waHBfY2xhc3NfcHJlZml4KCkpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDA4MHUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X3BocF9uYW1lc3BhY2UoZnJvbS5faW50ZXJuYWxfcGhwX25hbWVzcGFjZSgpKTsKKyAgICB9CisgIH0KKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMGZmMDB1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAxMDB1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9waHBfbWV0YWRhdGFfbmFtZXNwYWNlKGZyb20uX2ludGVybmFsX3BocF9tZXRhZGF0YV9uYW1lc3BhY2UoKSk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMjAwdSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfcnVieV9wYWNrYWdlKGZyb20uX2ludGVybmFsX3J1YnlfcGFja2FnZSgpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDA0MDB1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLmphdmFfbXVsdGlwbGVfZmlsZXNfID0gZnJvbS5faW1wbF8uamF2YV9tdWx0aXBsZV9maWxlc187CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwODAwdSkgeworICAgICAgX3RoaXMtPl9pbXBsXy5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8gPSBmcm9tLl9pbXBsXy5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF87CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAxMDAwdSkgeworICAgICAgX3RoaXMtPl9pbXBsXy5qYXZhX3N0cmluZ19jaGVja191dGY4XyA9IGZyb20uX2ltcGxfLmphdmFfc3RyaW5nX2NoZWNrX3V0ZjhfOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMjAwMHUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8uY2NfZ2VuZXJpY19zZXJ2aWNlc18gPSBmcm9tLl9pbXBsXy5jY19nZW5lcmljX3NlcnZpY2VzXzsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDQwMDB1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLmphdmFfZ2VuZXJpY19zZXJ2aWNlc18gPSBmcm9tLl9pbXBsXy5qYXZhX2dlbmVyaWNfc2VydmljZXNfOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwODAwMHUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8ucHlfZ2VuZXJpY19zZXJ2aWNlc18gPSBmcm9tLl9pbXBsXy5weV9nZW5lcmljX3NlcnZpY2VzXzsKKyAgICB9CisgICAgX3RoaXMtPl9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IGNhY2hlZF9oYXNfYml0czsKKyAgfQorICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDBmMDAwMHUpIHsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAxMDAwMHUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8ucGhwX2dlbmVyaWNfc2VydmljZXNfID0gZnJvbS5faW1wbF8ucGhwX2dlbmVyaWNfc2VydmljZXNfOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAyMDAwMHUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8uZGVwcmVjYXRlZF8gPSBmcm9tLl9pbXBsXy5kZXByZWNhdGVkXzsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwNDAwMDB1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLm9wdGltaXplX2Zvcl8gPSBmcm9tLl9pbXBsXy5vcHRpbWl6ZV9mb3JfOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDA4MDAwMHUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8uY2NfZW5hYmxlX2FyZW5hc18gPSBmcm9tLl9pbXBsXy5jY19lbmFibGVfYXJlbmFzXzsKKyAgICB9CisgICAgX3RoaXMtPl9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IGNhY2hlZF9oYXNfYml0czsKKyAgfQorICBfdGhpcy0+X2ltcGxfLl9leHRlbnNpb25zXy5NZXJnZUZyb20oaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCBmcm9tLl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBGaWxlT3B0aW9uczo6Q29weUZyb20oY29uc3QgRmlsZU9wdGlvbnMmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRmlsZU9wdGlvbnM6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIGlmICghX2ltcGxfLl9leHRlbnNpb25zXy5Jc0luaXRpYWxpemVkKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoITo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQoX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXykpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGaWxlT3B0aW9uczo6SW50ZXJuYWxTd2FwKEZpbGVPcHRpb25zKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIF9pbXBsXy5fZXh0ZW5zaW9uc18uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLl9leHRlbnNpb25zXyk7CisgIGF1dG8qIGxoc19hcmVuYSA9IEdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBhdXRvKiByaHNfYXJlbmEgPSBvdGhlci0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN3YXAoX2ltcGxfLl9oYXNfYml0c19bMF0sIG90aGVyLT5faW1wbF8uX2hhc19iaXRzX1swXSk7CisgIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8uamF2YV9wYWNrYWdlXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8uamF2YV9wYWNrYWdlXywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8uamF2YV9vdXRlcl9jbGFzc25hbWVfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5qYXZhX291dGVyX2NsYXNzbmFtZV8sIHJoc19hcmVuYQorICApOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLmdvX3BhY2thZ2VfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5nb19wYWNrYWdlXywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8ub2JqY19jbGFzc19wcmVmaXhfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5vYmpjX2NsYXNzX3ByZWZpeF8sIHJoc19hcmVuYQorICApOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLmNzaGFycF9uYW1lc3BhY2VfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5jc2hhcnBfbmFtZXNwYWNlXywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8uc3dpZnRfcHJlZml4XywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8uc3dpZnRfcHJlZml4XywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8ucGhwX2NsYXNzX3ByZWZpeF8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLnBocF9jbGFzc19wcmVmaXhfLCByaHNfYXJlbmEKKyAgKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5waHBfbmFtZXNwYWNlXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8ucGhwX25hbWVzcGFjZV8sIHJoc19hcmVuYQorICApOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLnBocF9tZXRhZGF0YV9uYW1lc3BhY2VfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5waHBfbWV0YWRhdGFfbmFtZXNwYWNlXywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8ucnVieV9wYWNrYWdlXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8ucnVieV9wYWNrYWdlXywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6bWVtc3dhcDwKKyAgICAgIFBST1RPQlVGX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgX2ltcGxfLmRlcHJlY2F0ZWRfKQorICAgICAgKyBzaXplb2YoRmlsZU9wdGlvbnM6Ol9pbXBsXy5kZXByZWNhdGVkXykKKyAgICAgIC0gUFJPVE9CVUZfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBfaW1wbF8uamF2YV9tdWx0aXBsZV9maWxlc18pPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLmphdmFfbXVsdGlwbGVfZmlsZXNfKSwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmb3RoZXItPl9pbXBsXy5qYXZhX211bHRpcGxlX2ZpbGVzXykpOworICBzd2FwKF9pbXBsXy5vcHRpbWl6ZV9mb3JfLCBvdGhlci0+X2ltcGxfLm9wdGltaXplX2Zvcl8pOworICBzd2FwKF9pbXBsXy5jY19lbmFibGVfYXJlbmFzXywgb3RoZXItPl9pbXBsXy5jY19lbmFibGVfYXJlbmFzXyk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBGaWxlT3B0aW9uczo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19vbmNlLAorICAgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b1sxM10pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIE1lc3NhZ2VPcHRpb25zOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKKyAgdXNpbmcgSGFzQml0cyA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxNZXNzYWdlT3B0aW9ucz4oKS5faW1wbF8uX2hhc19iaXRzXyk7CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAxdTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAydTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX2RlcHJlY2F0ZWQoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSA0dTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX21hcF9lbnRyeShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDh1OworICB9Cit9OworCitNZXNzYWdlT3B0aW9uczo6TWVzc2FnZU9wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQpCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgU2hhcmVkQ3RvcihhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCit9CitNZXNzYWdlT3B0aW9uczo6TWVzc2FnZU9wdGlvbnMoY29uc3QgTWVzc2FnZU9wdGlvbnMmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIE1lc3NhZ2VPcHRpb25zKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgLypkZWNsdHlwZShfaW1wbF8uX2V4dGVuc2lvbnNfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXtmcm9tLl9pbXBsXy5faGFzX2JpdHNffQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKXtmcm9tLl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl99CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5kZXByZWNhdGVkXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm1hcF9lbnRyeV8pe319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5fZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgZnJvbS5faW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgOjptZW1jcHkoJl9pbXBsXy5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8sICZmcm9tLl9pbXBsXy5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8sCisgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLm1hcF9lbnRyeV8pIC0KKyAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XykpICsgc2l6ZW9mKF9pbXBsXy5tYXBfZW50cnlfKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKK30KKworaW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgLypkZWNsdHlwZShfaW1wbF8uX2V4dGVuc2lvbnNfKSovezo6X3BiaTo6QXJlbmFJbml0aWFsaXplZCgpLCBhcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pe2FyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0Xyl7ZmFsc2V9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl8pe2ZhbHNlfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmRlcHJlY2F0ZWRfKXtmYWxzZX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5tYXBfZW50cnlfKXtmYWxzZX0KKyAgfTsKK30KKworTWVzc2FnZU9wdGlvbnM6On5NZXNzYWdlT3B0aW9ucygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy5fZXh0ZW5zaW9uc18ufkV4dGVuc2lvblNldCgpOworICBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLn5SZXBlYXRlZFB0ckZpZWxkKCk7Cit9CisKK3ZvaWQgTWVzc2FnZU9wdGlvbnM6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIE1lc3NhZ2VPcHRpb25zOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLl9leHRlbnNpb25zXy5DbGVhcigpOworICBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7CisgIDo6bWVtc2V0KCZfaW1wbF8ubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfLCAwLCBzdGF0aWNfY2FzdDxzaXplX3Q+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5tYXBfZW50cnlfKSAtCisgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XykpICsgc2l6ZW9mKF9pbXBsXy5tYXBfZW50cnlfKSk7CisgIF9pbXBsXy5faGFzX2JpdHNfLkNsZWFyKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogTWVzc2FnZU9wdGlvbnM6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgX0ludGVybmFsOjpIYXNCaXRzIGhhc19iaXRze307CisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gOCkpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoJmhhc19iaXRzKTsKKyAgICAgICAgICBfaW1wbF8ubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxNikpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAzOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMjQpKSB7CisgICAgICAgICAgX0ludGVybmFsOjpzZXRfaGFzX2RlcHJlY2F0ZWQoJmhhc19iaXRzKTsKKyAgICAgICAgICBfaW1wbF8uZGVwcmVjYXRlZF8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBtYXBfZW50cnkgPSA3OworICAgICAgY2FzZSA3OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNTYpKSB7CisgICAgICAgICAgX0ludGVybmFsOjpzZXRfaGFzX21hcF9lbnRyeSgmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy5tYXBfZW50cnlfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgICAgIGNhc2UgOTk5OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNTgpKSB7CisgICAgICAgICAgcHRyIC09IDI7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDI7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCksIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzw3OTk0PihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBpZiAoKDgwMDB1IDw9IHRhZykpIHsKKyAgICAgIHB0ciA9IF9pbXBsXy5fZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIHB0ciwgaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCAmX2ludGVybmFsX21ldGFkYXRhXywgY3R4KTsKKyAgICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIF9pbXBsXy5faGFzX2JpdHNfLk9yKGhhc19iaXRzKTsKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogTWVzc2FnZU9wdGlvbnM6Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICAvLyBvcHRpb25hbCBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMSwgdGhpcy0+X2ludGVybmFsX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgyLCB0aGlzLT5faW50ZXJuYWxfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMywgdGhpcy0+X2ludGVybmFsX2RlcHJlY2F0ZWQoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgbWFwX2VudHJ5ID0gNzsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoNywgdGhpcy0+X2ludGVybmFsX21hcF9lbnRyeSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpKTsgaSA8IG47IGkrKykgeworICAgIGNvbnN0IGF1dG8mIHJlcGZpZWxkID0gdGhpcy0+X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg5OTksIHJlcGZpZWxkLCByZXBmaWVsZC5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQorICB0YXJnZXQgPSBfaW1wbF8uX2V4dGVuc2lvbnNfLl9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCwgc3RyZWFtKTsKKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBNZXNzYWdlT3B0aW9uczo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHRvdGFsX3NpemUgKz0gX2ltcGxfLl9leHRlbnNpb25zXy5CeXRlU2l6ZSgpOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgdG90YWxfc2l6ZSArPSAyVUwgKiB0aGlzLT5faW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZShtc2cpOworICB9CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDBmdSkgeworICAgIC8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA0dSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIG1hcF9lbnRyeSA9IDc7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICAgIH0KKworICB9CisgIHJldHVybiBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCAmX2ltcGxfLl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhIE1lc3NhZ2VPcHRpb25zOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgTWVzc2FnZU9wdGlvbnM6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqTWVzc2FnZU9wdGlvbnM6OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH0KKworCit2b2lkIE1lc3NhZ2VPcHRpb25zOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8TWVzc2FnZU9wdGlvbnMqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IE1lc3NhZ2VPcHRpb25zJj4oZnJvbV9tc2cpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfdGhpcy0+X2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NZXJnZUZyb20oZnJvbS5faW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgY2FjaGVkX2hhc19iaXRzID0gZnJvbS5faW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMGZ1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XyA9IGZyb20uX2ltcGxfLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XzsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfID0gZnJvbS5faW1wbF8ubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl87CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA0dSkgeworICAgICAgX3RoaXMtPl9pbXBsXy5kZXByZWNhdGVkXyA9IGZyb20uX2ltcGxfLmRlcHJlY2F0ZWRfOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwOHUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8ubWFwX2VudHJ5XyA9IGZyb20uX2ltcGxfLm1hcF9lbnRyeV87CisgICAgfQorICAgIF90aGlzLT5faW1wbF8uX2hhc19iaXRzX1swXSB8PSBjYWNoZWRfaGFzX2JpdHM7CisgIH0KKyAgX3RoaXMtPl9pbXBsXy5fZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgZnJvbS5faW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgTWVzc2FnZU9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIE1lc3NhZ2VPcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICBpZiAoIV9pbXBsXy5fZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCE6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWVzc2FnZU9wdGlvbnM6OkludGVybmFsU3dhcChNZXNzYWdlT3B0aW9ucyogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBfaW1wbF8uX2V4dGVuc2lvbnNfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzd2FwKF9pbXBsXy5faGFzX2JpdHNfWzBdLCBvdGhlci0+X2ltcGxfLl9oYXNfYml0c19bMF0pOworICBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Om1lbXN3YXA8CisgICAgICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoTWVzc2FnZU9wdGlvbnMsIF9pbXBsXy5tYXBfZW50cnlfKQorICAgICAgKyBzaXplb2YoTWVzc2FnZU9wdGlvbnM6Ol9pbXBsXy5tYXBfZW50cnlfKQorICAgICAgLSBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoTWVzc2FnZU9wdGlvbnMsIF9pbXBsXy5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8pPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XyksCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm90aGVyLT5faW1wbF8ubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfKSk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBNZXNzYWdlT3B0aW9uczo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19vbmNlLAorICAgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b1sxNF0pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIEZpZWxkT3B0aW9uczo6X0ludGVybmFsIHsKKyBwdWJsaWM6CisgIHVzaW5nIEhhc0JpdHMgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8RmllbGRPcHRpb25zPigpLl9pbXBsXy5faGFzX2JpdHNfKTsKKyAgc3RhdGljIHZvaWQgc2V0X2hhc19jdHlwZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDF1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfcGFja2VkKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gNHU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19qc3R5cGUoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAydTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX2xhenkoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSA4dTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX3VudmVyaWZpZWRfbGF6eShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDE2dTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX2RlcHJlY2F0ZWQoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAzMnU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc193ZWFrKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gNjR1OworICB9Cit9OworCitGaWVsZE9wdGlvbnM6OkZpZWxkT3B0aW9ucyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCit9CitGaWVsZE9wdGlvbnM6OkZpZWxkT3B0aW9ucyhjb25zdCBGaWVsZE9wdGlvbnMmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIEZpZWxkT3B0aW9ucyogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIC8qZGVjbHR5cGUoX2ltcGxfLl9leHRlbnNpb25zXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXyl7ZnJvbS5faW1wbF8uX2hhc19iaXRzX30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyl7ZnJvbS5faW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25ffQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmN0eXBlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmpzdHlwZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5wYWNrZWRfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubGF6eV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy51bnZlcmlmaWVkX2xhenlfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZGVwcmVjYXRlZF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy53ZWFrXyl7fX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX2ltcGxfLl9leHRlbnNpb25zXy5NZXJnZUZyb20oaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCBmcm9tLl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICA6Om1lbWNweSgmX2ltcGxfLmN0eXBlXywgJmZyb20uX2ltcGxfLmN0eXBlXywKKyAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8ud2Vha18pIC0KKyAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLmN0eXBlXykpICsgc2l6ZW9mKF9pbXBsXy53ZWFrXykpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQorfQorCitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgLypkZWNsdHlwZShfaW1wbF8uX2V4dGVuc2lvbnNfKSovezo6X3BiaTo6QXJlbmFJbml0aWFsaXplZCgpLCBhcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pe2FyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmN0eXBlXyl7MH0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5qc3R5cGVfKXswfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnBhY2tlZF8pe2ZhbHNlfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmxhenlfKXtmYWxzZX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy51bnZlcmlmaWVkX2xhenlfKXtmYWxzZX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5kZXByZWNhdGVkXyl7ZmFsc2V9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ud2Vha18pe2ZhbHNlfQorICB9OworfQorCitGaWVsZE9wdGlvbnM6On5GaWVsZE9wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy5fZXh0ZW5zaW9uc18ufkV4dGVuc2lvblNldCgpOworICBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLn5SZXBlYXRlZFB0ckZpZWxkKCk7Cit9CisKK3ZvaWQgRmllbGRPcHRpb25zOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIF9pbXBsXy5fY2FjaGVkX3NpemVfLlNldChzaXplKTsKK30KKwordm9pZCBGaWVsZE9wdGlvbnM6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLl9leHRlbnNpb25zXy5DbGVhcigpOworICBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7CisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDA3ZnUpIHsKKyAgICA6Om1lbXNldCgmX2ltcGxfLmN0eXBlXywgMCwgc3RhdGljX2Nhc3Q8c2l6ZV90PigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy53ZWFrXykgLQorICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLmN0eXBlXykpICsgc2l6ZW9mKF9pbXBsXy53ZWFrXykpOworICB9CisgIF9pbXBsXy5faGFzX2JpdHNfLkNsZWFyKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogRmllbGRPcHRpb25zOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIF9JbnRlcm5hbDo6SGFzQml0cyBoYXNfYml0c3t9OworICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZSBjdHlwZSA9IDEgW2RlZmF1bHQgPSBTVFJJTkddOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gOCkpIHsKKyAgICAgICAgICB1aW50NjRfdCB2YWwgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zX0NUeXBlX0lzVmFsaWQodmFsKSkpIHsKKyAgICAgICAgICAgIF9pbnRlcm5hbF9zZXRfY3R5cGUoc3RhdGljX2Nhc3Q8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9uc19DVHlwZT4odmFsKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V3JpdGVWYXJpbnQoMSwgdmFsLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBib29sIHBhY2tlZCA9IDI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxNikpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfcGFja2VkKCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLnBhY2tlZF8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDI0KSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19kZXByZWNhdGVkKCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLmRlcHJlY2F0ZWRfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgbGF6eSA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDU6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA0MCkpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfbGF6eSgmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy5sYXp5XyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGUganN0eXBlID0gNiBbZGVmYXVsdCA9IEpTX05PUk1BTF07CisgICAgICBjYXNlIDY6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA0OCkpIHsKKyAgICAgICAgICB1aW50NjRfdCB2YWwgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zX0pTVHlwZV9Jc1ZhbGlkKHZhbCkpKSB7CisgICAgICAgICAgICBfaW50ZXJuYWxfc2V0X2pzdHlwZShzdGF0aWNfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zX0pTVHlwZT4odmFsKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V3JpdGVWYXJpbnQoNiwgdmFsLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICAgIGNhc2UgMTA6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA4MCkpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfd2VhaygmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy53ZWFrXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBib29sIHVudmVyaWZpZWRfbGF6eSA9IDE1IFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAxNToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDEyMCkpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfdW52ZXJpZmllZF9sYXp5KCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLnVudmVyaWZpZWRfbGF6eV8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICAgICAgY2FzZSA5OTk6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA1OCkpIHsKKyAgICAgICAgICBwdHIgLT0gMjsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSwgcHRyKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDc5OTQ+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIGlmICgoODAwMHUgPD0gdGFnKSkgeworICAgICAgcHRyID0gX2ltcGxfLl9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgcHRyLCBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCksICZfaW50ZXJuYWxfbWV0YWRhdGFfLCBjdHgpOworICAgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgX2ltcGxfLl9oYXNfYml0c18uT3IoaGFzX2JpdHMpOworICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBGaWVsZE9wdGlvbnM6Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bVRvQXJyYXkoCisgICAgICAxLCB0aGlzLT5faW50ZXJuYWxfY3R5cGUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMiwgdGhpcy0+X2ludGVybmFsX3BhY2tlZCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMjB1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMywgdGhpcy0+X2ludGVybmFsX2RlcHJlY2F0ZWQoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgbGF6eSA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA4dSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDUsIHRoaXMtPl9pbnRlcm5hbF9sYXp5KCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGUganN0eXBlID0gNiBbZGVmYXVsdCA9IEpTX05PUk1BTF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAorICAgICAgNiwgdGhpcy0+X2ludGVybmFsX2pzdHlwZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCB3ZWFrID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDQwdSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDEwLCB0aGlzLT5faW50ZXJuYWxfd2VhaygpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCB1bnZlcmlmaWVkX2xhenkgPSAxNSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMTB1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMTUsIHRoaXMtPl9pbnRlcm5hbF91bnZlcmlmaWVkX2xhenkoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwKKyAgICAgIG4gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4odGhpcy0+X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbihpKTsKKyAgICB0YXJnZXQgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoOTk5LCByZXBmaWVsZCwgcmVwZmllbGQuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKKyAgdGFyZ2V0ID0gX2ltcGxfLl9leHRlbnNpb25zXy5fSW50ZXJuYWxTZXJpYWxpemUoCisgIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgMTAwMCwgNTM2ODcwOTEyLCB0YXJnZXQsIHN0cmVhbSk7CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IEZpZWxkT3B0aW9uczo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB0b3RhbF9zaXplICs9IF9pbXBsXy5fZXh0ZW5zaW9uc18uQnl0ZVNpemUoKTsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIHRvdGFsX3NpemUgKz0gMlVMICogdGhpcy0+X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKKyAgZm9yIChjb25zdCBhdXRvJiBtc2cgOiB0aGlzLT5faW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUobXNnKTsKKyAgfQorCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDA3ZnUpIHsKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZSBjdHlwZSA9IDEgW2RlZmF1bHQgPSBTVFJJTkddOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodGhpcy0+X2ludGVybmFsX2N0eXBlKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZSBqc3R5cGUgPSA2IFtkZWZhdWx0ID0gSlNfTk9STUFMXTsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPl9pbnRlcm5hbF9qc3R5cGUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgYm9vbCBwYWNrZWQgPSAyOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA0dSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIGxhenkgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA4dSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIHVudmVyaWZpZWRfbGF6eSA9IDE1IFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDEwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDIwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDA0MHUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7CisgICAgfQorCisgIH0KKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgRmllbGRPcHRpb25zOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgRmllbGRPcHRpb25zOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkZpZWxkT3B0aW9uczo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgRmllbGRPcHRpb25zOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8RmllbGRPcHRpb25zKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBGaWVsZE9wdGlvbnMmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfdGhpcy0+X2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NZXJnZUZyb20oZnJvbS5faW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgY2FjaGVkX2hhc19iaXRzID0gZnJvbS5faW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwN2Z1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLmN0eXBlXyA9IGZyb20uX2ltcGxfLmN0eXBlXzsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLmpzdHlwZV8gPSBmcm9tLl9pbXBsXy5qc3R5cGVfOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwNHUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8ucGFja2VkXyA9IGZyb20uX2ltcGxfLnBhY2tlZF87CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA4dSkgeworICAgICAgX3RoaXMtPl9pbXBsXy5sYXp5XyA9IGZyb20uX2ltcGxfLmxhenlfOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAxMHUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8udW52ZXJpZmllZF9sYXp5XyA9IGZyb20uX2ltcGxfLnVudmVyaWZpZWRfbGF6eV87CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDIwdSkgeworICAgICAgX3RoaXMtPl9pbXBsXy5kZXByZWNhdGVkXyA9IGZyb20uX2ltcGxfLmRlcHJlY2F0ZWRfOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDA0MHUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8ud2Vha18gPSBmcm9tLl9pbXBsXy53ZWFrXzsKKyAgICB9CisgICAgX3RoaXMtPl9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IGNhY2hlZF9oYXNfYml0czsKKyAgfQorICBfdGhpcy0+X2ltcGxfLl9leHRlbnNpb25zXy5NZXJnZUZyb20oaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCBmcm9tLl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBGaWVsZE9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IEZpZWxkT3B0aW9ucyYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRmllbGRPcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICBpZiAoIV9pbXBsXy5fZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCE6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRmllbGRPcHRpb25zOjpJbnRlcm5hbFN3YXAoRmllbGRPcHRpb25zKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIF9pbXBsXy5fZXh0ZW5zaW9uc18uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLl9leHRlbnNpb25zXyk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN3YXAoX2ltcGxfLl9oYXNfYml0c19bMF0sIG90aGVyLT5faW1wbF8uX2hhc19iaXRzX1swXSk7CisgIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6bWVtc3dhcDwKKyAgICAgIFBST1RPQlVGX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIF9pbXBsXy53ZWFrXykKKyAgICAgICsgc2l6ZW9mKEZpZWxkT3B0aW9uczo6X2ltcGxfLndlYWtfKQorICAgICAgLSBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoRmllbGRPcHRpb25zLCBfaW1wbF8uY3R5cGVfKT4oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5jdHlwZV8pLAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZvdGhlci0+X2ltcGxfLmN0eXBlXykpOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgRmllbGRPcHRpb25zOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzE1XSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgT25lb2ZPcHRpb25zOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKK307CisKK09uZW9mT3B0aW9uczo6T25lb2ZPcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucykKK30KK09uZW9mT3B0aW9uczo6T25lb2ZPcHRpb25zKGNvbnN0IE9uZW9mT3B0aW9ucyYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgT25lb2ZPcHRpb25zKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgLypkZWNsdHlwZShfaW1wbF8uX2V4dGVuc2lvbnNfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pe2Zyb20uX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uX30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX2ltcGxfLl9leHRlbnNpb25zXy5NZXJnZUZyb20oaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCBmcm9tLl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zKQorfQorCitpbmxpbmUgdm9pZCBPbmVvZk9wdGlvbnM6OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgLypkZWNsdHlwZShfaW1wbF8uX2V4dGVuc2lvbnNfKSovezo6X3BiaTo6QXJlbmFJbml0aWFsaXplZCgpLCBhcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pe2FyZW5hfQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgIH07Cit9CisKK09uZW9mT3B0aW9uczo6fk9uZW9mT3B0aW9ucygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucykKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIE9uZW9mT3B0aW9uczo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKKyAgX2ltcGxfLl9leHRlbnNpb25zXy5+RXh0ZW5zaW9uU2V0KCk7CisgIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uflJlcGVhdGVkUHRyRmllbGQoKTsKK30KKwordm9pZCBPbmVvZk9wdGlvbnM6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIE9uZW9mT3B0aW9uczo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfaW1wbF8uX2V4dGVuc2lvbnNfLkNsZWFyKCk7CisgIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5DbGVhcjw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworfQorCitjb25zdCBjaGFyKiBPbmVvZk9wdGlvbnM6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICAgICAgY2FzZSA5OTk6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA1OCkpIHsKKyAgICAgICAgICBwdHIgLT0gMjsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSwgcHRyKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDc5OTQ+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIGlmICgoODAwMHUgPD0gdGFnKSkgeworICAgICAgcHRyID0gX2ltcGxfLl9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgcHRyLCBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCksICZfaW50ZXJuYWxfbWV0YWRhdGFfLCBjdHgpOworICAgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogT25lb2ZPcHRpb25zOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpKTsgaSA8IG47IGkrKykgeworICAgIGNvbnN0IGF1dG8mIHJlcGZpZWxkID0gdGhpcy0+X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg5OTksIHJlcGZpZWxkLCByZXBmaWVsZC5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQorICB0YXJnZXQgPSBfaW1wbF8uX2V4dGVuc2lvbnNfLl9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCwgc3RyZWFtKTsKKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zKQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgT25lb2ZPcHRpb25zOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucykKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHRvdGFsX3NpemUgKz0gX2ltcGxfLl9leHRlbnNpb25zXy5CeXRlU2l6ZSgpOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgdG90YWxfc2l6ZSArPSAyVUwgKiB0aGlzLT5faW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZShtc2cpOworICB9CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgT25lb2ZPcHRpb25zOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgT25lb2ZPcHRpb25zOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKk9uZW9mT3B0aW9uczo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgT25lb2ZPcHRpb25zOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8T25lb2ZPcHRpb25zKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBPbmVvZk9wdGlvbnMmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMpCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfdGhpcy0+X2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NZXJnZUZyb20oZnJvbS5faW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgX3RoaXMtPl9pbXBsXy5fZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgZnJvbS5faW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgT25lb2ZPcHRpb25zOjpDb3B5RnJvbShjb25zdCBPbmVvZk9wdGlvbnMmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucykKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIE9uZW9mT3B0aW9uczo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgaWYgKCFfaW1wbF8uX2V4dGVuc2lvbnNfLklzSW5pdGlhbGl6ZWQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZChfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIE9uZW9mT3B0aW9uczo6SW50ZXJuYWxTd2FwKE9uZW9mT3B0aW9ucyogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBfaW1wbF8uX2V4dGVuc2lvbnNfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgT25lb2ZPcHRpb25zOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzE2XSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgRW51bU9wdGlvbnM6Ol9JbnRlcm5hbCB7CisgcHVibGljOgorICB1c2luZyBIYXNCaXRzID0gZGVjbHR5cGUoc3RkOjpkZWNsdmFsPEVudW1PcHRpb25zPigpLl9pbXBsXy5faGFzX2JpdHNfKTsKKyAgc3RhdGljIHZvaWQgc2V0X2hhc19hbGxvd19hbGlhcyhIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDF1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfZGVwcmVjYXRlZChIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDJ1OworICB9Cit9OworCitFbnVtT3B0aW9uczo6RW51bU9wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQpCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgU2hhcmVkQ3RvcihhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCit9CitFbnVtT3B0aW9uczo6RW51bU9wdGlvbnMoY29uc3QgRW51bU9wdGlvbnMmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIEVudW1PcHRpb25zKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgLypkZWNsdHlwZShfaW1wbF8uX2V4dGVuc2lvbnNfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXtmcm9tLl9pbXBsXy5faGFzX2JpdHNffQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKXtmcm9tLl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl99CisgICAgLCBkZWNsdHlwZShfaW1wbF8uYWxsb3dfYWxpYXNfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZGVwcmVjYXRlZF8pe319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5fZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgZnJvbS5faW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgOjptZW1jcHkoJl9pbXBsXy5hbGxvd19hbGlhc18sICZmcm9tLl9pbXBsXy5hbGxvd19hbGlhc18sCisgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLmRlcHJlY2F0ZWRfKSAtCisgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5hbGxvd19hbGlhc18pKSArIHNpemVvZihfaW1wbF8uZGVwcmVjYXRlZF8pKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQorfQorCitpbmxpbmUgdm9pZCBFbnVtT3B0aW9uczo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICAvKmRlY2x0eXBlKF9pbXBsXy5fZXh0ZW5zaW9uc18pKi97OjpfcGJpOjpBcmVuYUluaXRpYWxpemVkKCksIGFyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyl7YXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uYWxsb3dfYWxpYXNfKXtmYWxzZX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5kZXByZWNhdGVkXyl7ZmFsc2V9CisgIH07Cit9CisKK0VudW1PcHRpb25zOjp+RW51bU9wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucykKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIEVudW1PcHRpb25zOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8uX2V4dGVuc2lvbnNfLn5FeHRlbnNpb25TZXQoKTsKKyAgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworfQorCit2b2lkIEVudW1PcHRpb25zOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIF9pbXBsXy5fY2FjaGVkX3NpemVfLlNldChzaXplKTsKK30KKwordm9pZCBFbnVtT3B0aW9uczo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy5fZXh0ZW5zaW9uc18uQ2xlYXIoKTsKKyAgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworICA6Om1lbXNldCgmX2ltcGxfLmFsbG93X2FsaWFzXywgMCwgc3RhdGljX2Nhc3Q8c2l6ZV90PigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uZGVwcmVjYXRlZF8pIC0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uYWxsb3dfYWxpYXNfKSkgKyBzaXplb2YoX2ltcGxfLmRlcHJlY2F0ZWRfKSk7CisgIF9pbXBsXy5faGFzX2JpdHNfLkNsZWFyKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogRW51bU9wdGlvbnM6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgX0ludGVybmFsOjpIYXNCaXRzIGhhc19iaXRze307CisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgYWxsb3dfYWxpYXMgPSAyOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTYpKSB7CisgICAgICAgICAgX0ludGVybmFsOjpzZXRfaGFzX2FsbG93X2FsaWFzKCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLmFsbG93X2FsaWFzXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAzOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMjQpKSB7CisgICAgICAgICAgX0ludGVybmFsOjpzZXRfaGFzX2RlcHJlY2F0ZWQoJmhhc19iaXRzKTsKKyAgICAgICAgICBfaW1wbF8uZGVwcmVjYXRlZF8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICAgICAgY2FzZSA5OTk6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA1OCkpIHsKKyAgICAgICAgICBwdHIgLT0gMjsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSwgcHRyKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDc5OTQ+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIGlmICgoODAwMHUgPD0gdGFnKSkgeworICAgICAgcHRyID0gX2ltcGxfLl9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgcHRyLCBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCksICZfaW50ZXJuYWxfbWV0YWRhdGFfLCBjdHgpOworICAgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgX2ltcGxfLl9oYXNfYml0c18uT3IoaGFzX2JpdHMpOworICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBFbnVtT3B0aW9uczo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIC8vIG9wdGlvbmFsIGJvb2wgYWxsb3dfYWxpYXMgPSAyOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgyLCB0aGlzLT5faW50ZXJuYWxfYWxsb3dfYWxpYXMoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDMsIHRoaXMtPl9pbnRlcm5hbF9kZXByZWNhdGVkKCksIHRhcmdldCk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbl9zaXplKCkpOyBpIDwgbjsgaSsrKSB7CisgICAgY29uc3QgYXV0byYgcmVwZmllbGQgPSB0aGlzLT5faW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb24oaSk7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICAgIEludGVybmFsV3JpdGVNZXNzYWdlKDk5OSwgcmVwZmllbGQsIHJlcGZpZWxkLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCisgIHRhcmdldCA9IF9pbXBsXy5fZXh0ZW5zaW9uc18uX0ludGVybmFsU2VyaWFsaXplKAorICBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCksIDEwMDAsIDUzNjg3MDkxMiwgdGFyZ2V0LCBzdHJlYW0pOworCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSkgeworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdDo6SW50ZXJuYWxTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucykKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IEVudW1PcHRpb25zOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQorICBzaXplX3QgdG90YWxfc2l6ZSA9IDA7CisKKyAgdG90YWxfc2l6ZSArPSBfaW1wbF8uX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7CisKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICB0b3RhbF9zaXplICs9IDJVTCAqIHRoaXMtPl9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7CisgIGZvciAoY29uc3QgYXV0byYgbXNnIDogdGhpcy0+X2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKG1zZyk7CisgIH0KKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDN1KSB7CisgICAgLy8gb3B0aW9uYWwgYm9vbCBhbGxvd19hbGlhcyA9IDI7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICAgIH0KKworICB9CisgIHJldHVybiBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCAmX2ltcGxfLl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhIEVudW1PcHRpb25zOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgRW51bU9wdGlvbnM6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqRW51bU9wdGlvbnM6OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH0KKworCit2b2lkIEVudW1PcHRpb25zOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8RW51bU9wdGlvbnMqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IEVudW1PcHRpb25zJj4oZnJvbV9tc2cpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfdGhpcy0+X2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NZXJnZUZyb20oZnJvbS5faW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgY2FjaGVkX2hhc19iaXRzID0gZnJvbS5faW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDN1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLmFsbG93X2FsaWFzXyA9IGZyb20uX2ltcGxfLmFsbG93X2FsaWFzXzsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLmRlcHJlY2F0ZWRfID0gZnJvbS5faW1wbF8uZGVwcmVjYXRlZF87CisgICAgfQorICAgIF90aGlzLT5faW1wbF8uX2hhc19iaXRzX1swXSB8PSBjYWNoZWRfaGFzX2JpdHM7CisgIH0KKyAgX3RoaXMtPl9pbXBsXy5fZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgZnJvbS5faW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgRW51bU9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IEVudW1PcHRpb25zJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucykKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIEVudW1PcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICBpZiAoIV9pbXBsXy5fZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCE6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRW51bU9wdGlvbnM6OkludGVybmFsU3dhcChFbnVtT3B0aW9ucyogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBfaW1wbF8uX2V4dGVuc2lvbnNfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzd2FwKF9pbXBsXy5faGFzX2JpdHNfWzBdLCBvdGhlci0+X2ltcGxfLl9oYXNfYml0c19bMF0pOworICBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Om1lbXN3YXA8CisgICAgICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoRW51bU9wdGlvbnMsIF9pbXBsXy5kZXByZWNhdGVkXykKKyAgICAgICsgc2l6ZW9mKEVudW1PcHRpb25zOjpfaW1wbF8uZGVwcmVjYXRlZF8pCisgICAgICAtIFBST1RPQlVGX0ZJRUxEX09GRlNFVChFbnVtT3B0aW9ucywgX2ltcGxfLmFsbG93X2FsaWFzXyk+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uYWxsb3dfYWxpYXNfKSwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmb3RoZXItPl9pbXBsXy5hbGxvd19hbGlhc18pKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEVudW1PcHRpb25zOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzE3XSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgRW51bVZhbHVlT3B0aW9uczo6X0ludGVybmFsIHsKKyBwdWJsaWM6CisgIHVzaW5nIEhhc0JpdHMgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8RW51bVZhbHVlT3B0aW9ucz4oKS5faW1wbF8uX2hhc19iaXRzXyk7CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfZGVwcmVjYXRlZChIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDF1OworICB9Cit9OworCitFbnVtVmFsdWVPcHRpb25zOjpFbnVtVmFsdWVPcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCit9CitFbnVtVmFsdWVPcHRpb25zOjpFbnVtVmFsdWVPcHRpb25zKGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIEVudW1WYWx1ZU9wdGlvbnMqIGNvbnN0IF90aGlzID0gdGhpczsgKHZvaWQpX3RoaXM7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICAvKmRlY2x0eXBlKF9pbXBsXy5fZXh0ZW5zaW9uc18pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe2Zyb20uX2ltcGxfLl9oYXNfYml0c199CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pe2Zyb20uX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uX30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5kZXByZWNhdGVkXyl7fX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX2ltcGxfLl9leHRlbnNpb25zXy5NZXJnZUZyb20oaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCBmcm9tLl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICBfdGhpcy0+X2ltcGxfLmRlcHJlY2F0ZWRfID0gZnJvbS5faW1wbF8uZGVwcmVjYXRlZF87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQorfQorCitpbmxpbmUgdm9pZCBFbnVtVmFsdWVPcHRpb25zOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIC8qZGVjbHR5cGUoX2ltcGxfLl9leHRlbnNpb25zXykqL3s6Ol9wYmk6OkFyZW5hSW5pdGlhbGl6ZWQoKSwgYXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5kZXByZWNhdGVkXyl7ZmFsc2V9CisgIH07Cit9CisKK0VudW1WYWx1ZU9wdGlvbnM6On5FbnVtVmFsdWVPcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy5fZXh0ZW5zaW9uc18ufkV4dGVuc2lvblNldCgpOworICBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLn5SZXBlYXRlZFB0ckZpZWxkKCk7Cit9CisKK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLl9leHRlbnNpb25zXy5DbGVhcigpOworICBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7CisgIF9pbXBsXy5kZXByZWNhdGVkXyA9IGZhbHNlOworICBfaW1wbF8uX2hhc19iaXRzXy5DbGVhcigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIEVudW1WYWx1ZU9wdGlvbnM6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgX0ludGVybmFsOjpIYXNCaXRzIGhhc19iaXRze307CisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDEgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA4KSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19kZXByZWNhdGVkKCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLmRlcHJlY2F0ZWRfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgICAgIGNhc2UgOTk5OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNTgpKSB7CisgICAgICAgICAgcHRyIC09IDI7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDI7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCksIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzw3OTk0PihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBpZiAoKDgwMDB1IDw9IHRhZykpIHsKKyAgICAgIHB0ciA9IF9pbXBsXy5fZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIHB0ciwgaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCAmX2ludGVybmFsX21ldGFkYXRhXywgY3R4KTsKKyAgICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIF9pbXBsXy5faGFzX2JpdHNfLk9yKGhhc19iaXRzKTsKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogRW51bVZhbHVlT3B0aW9uczo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMSwgdGhpcy0+X2ludGVybmFsX2RlcHJlY2F0ZWQoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwKKyAgICAgIG4gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4odGhpcy0+X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbihpKTsKKyAgICB0YXJnZXQgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoOTk5LCByZXBmaWVsZCwgcmVwZmllbGQuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKKyAgdGFyZ2V0ID0gX2ltcGxfLl9leHRlbnNpb25zXy5fSW50ZXJuYWxTZXJpYWxpemUoCisgIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgMTAwMCwgNTM2ODcwOTEyLCB0YXJnZXQsIHN0cmVhbSk7CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBFbnVtVmFsdWVPcHRpb25zOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB0b3RhbF9zaXplICs9IF9pbXBsXy5fZXh0ZW5zaW9uc18uQnl0ZVNpemUoKTsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIHRvdGFsX3NpemUgKz0gMlVMICogdGhpcy0+X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKKyAgZm9yIChjb25zdCBhdXRvJiBtc2cgOiB0aGlzLT5faW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUobXNnKTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDEgW2RlZmF1bHQgPSBmYWxzZV07CisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICB9CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgRW51bVZhbHVlT3B0aW9uczo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIEVudW1WYWx1ZU9wdGlvbnM6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqRW51bVZhbHVlT3B0aW9uczo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PEVudW1WYWx1ZU9wdGlvbnMqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX3RoaXMtPl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfZGVwcmVjYXRlZCgpKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfZGVwcmVjYXRlZChmcm9tLl9pbnRlcm5hbF9kZXByZWNhdGVkKCkpOworICB9CisgIF90aGlzLT5faW1wbF8uX2V4dGVuc2lvbnNfLk1lcmdlRnJvbShpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCksIGZyb20uX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBFbnVtVmFsdWVPcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICBpZiAoIV9pbXBsXy5fZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCE6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6SW50ZXJuYWxTd2FwKEVudW1WYWx1ZU9wdGlvbnMqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgX2ltcGxfLl9leHRlbnNpb25zXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3dhcChfaW1wbF8uX2hhc19iaXRzX1swXSwgb3RoZXItPl9pbXBsXy5faGFzX2JpdHNfWzBdKTsKKyAgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgc3dhcChfaW1wbF8uZGVwcmVjYXRlZF8sIG90aGVyLT5faW1wbF8uZGVwcmVjYXRlZF8pOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgRW51bVZhbHVlT3B0aW9uczo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19vbmNlLAorICAgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b1sxOF0pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFNlcnZpY2VPcHRpb25zOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKKyAgdXNpbmcgSGFzQml0cyA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxTZXJ2aWNlT3B0aW9ucz4oKS5faW1wbF8uX2hhc19iaXRzXyk7CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfZGVwcmVjYXRlZChIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDF1OworICB9Cit9OworCitTZXJ2aWNlT3B0aW9uczo6U2VydmljZU9wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQpCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgU2hhcmVkQ3RvcihhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCit9CitTZXJ2aWNlT3B0aW9uczo6U2VydmljZU9wdGlvbnMoY29uc3QgU2VydmljZU9wdGlvbnMmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIFNlcnZpY2VPcHRpb25zKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgLypkZWNsdHlwZShfaW1wbF8uX2V4dGVuc2lvbnNfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXtmcm9tLl9pbXBsXy5faGFzX2JpdHNffQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKXtmcm9tLl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl99CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZGVwcmVjYXRlZF8pe319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5fZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgZnJvbS5faW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgX3RoaXMtPl9pbXBsXy5kZXByZWNhdGVkXyA9IGZyb20uX2ltcGxfLmRlcHJlY2F0ZWRfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCit9CisKK2lubGluZSB2b2lkIFNlcnZpY2VPcHRpb25zOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIC8qZGVjbHR5cGUoX2ltcGxfLl9leHRlbnNpb25zXykqL3s6Ol9wYmk6OkFyZW5hSW5pdGlhbGl6ZWQoKSwgYXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5kZXByZWNhdGVkXyl7ZmFsc2V9CisgIH07Cit9CisKK1NlcnZpY2VPcHRpb25zOjp+U2VydmljZU9wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIFNlcnZpY2VPcHRpb25zOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8uX2V4dGVuc2lvbnNfLn5FeHRlbnNpb25TZXQoKTsKKyAgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworfQorCit2b2lkIFNlcnZpY2VPcHRpb25zOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIF9pbXBsXy5fY2FjaGVkX3NpemVfLlNldChzaXplKTsKK30KKwordm9pZCBTZXJ2aWNlT3B0aW9uczo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy5fZXh0ZW5zaW9uc18uQ2xlYXIoKTsKKyAgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworICBfaW1wbF8uZGVwcmVjYXRlZF8gPSBmYWxzZTsKKyAgX2ltcGxfLl9oYXNfYml0c18uQ2xlYXIoKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5DbGVhcjw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworfQorCitjb25zdCBjaGFyKiBTZXJ2aWNlT3B0aW9uczo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICBfSW50ZXJuYWw6Okhhc0JpdHMgaGFzX2JpdHN7fTsKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDMzOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gOCkpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfZGVwcmVjYXRlZCgmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy5kZXByZWNhdGVkXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgICAgICBjYXNlIDk5OToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDU4KSkgeworICAgICAgICAgIHB0ciAtPSAyOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAyOworICAgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX2FkZF91bmludGVycHJldGVkX29wdGlvbigpLCBwdHIpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8Nzk5ND4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICB9ICAvLyBzd2l0Y2gKKyAgaGFuZGxlX3VudXN1YWw6CisgICAgaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkgeworICAgICAgQ0hLXyhwdHIpOworICAgICAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7CisgICAgICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyAgICB9CisgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7CisgICAgICBwdHIgPSBfaW1wbF8uX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBwdHIsIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgJl9pbnRlcm5hbF9tZXRhZGF0YV8sIGN0eCk7CisgICAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICBfaW1wbF8uX2hhc19iaXRzXy5PcihoYXNfYml0cyk7CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIFNlcnZpY2VPcHRpb25zOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDMzLCB0aGlzLT5faW50ZXJuYWxfZGVwcmVjYXRlZCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpKTsgaSA8IG47IGkrKykgeworICAgIGNvbnN0IGF1dG8mIHJlcGZpZWxkID0gdGhpcy0+X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg5OTksIHJlcGZpZWxkLCByZXBmaWVsZC5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQorICB0YXJnZXQgPSBfaW1wbF8uX2V4dGVuc2lvbnNfLl9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCwgc3RyZWFtKTsKKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBTZXJ2aWNlT3B0aW9uczo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHRvdGFsX3NpemUgKz0gX2ltcGxfLl9leHRlbnNpb25zXy5CeXRlU2l6ZSgpOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgdG90YWxfc2l6ZSArPSAyVUwgKiB0aGlzLT5faW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZShtc2cpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQgPSBmYWxzZV07CisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICB0b3RhbF9zaXplICs9IDIgKyAxOworICB9CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgU2VydmljZU9wdGlvbnM6Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBTZXJ2aWNlT3B0aW9uczo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpTZXJ2aWNlT3B0aW9uczo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgU2VydmljZU9wdGlvbnM6Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxTZXJ2aWNlT3B0aW9ucyo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgU2VydmljZU9wdGlvbnMmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF90aGlzLT5faW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLk1lcmdlRnJvbShmcm9tLl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pOworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X2RlcHJlY2F0ZWQoZnJvbS5faW50ZXJuYWxfZGVwcmVjYXRlZCgpKTsKKyAgfQorICBfdGhpcy0+X2ltcGxfLl9leHRlbnNpb25zXy5NZXJnZUZyb20oaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCBmcm9tLl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBTZXJ2aWNlT3B0aW9uczo6Q29weUZyb20oY29uc3QgU2VydmljZU9wdGlvbnMmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgU2VydmljZU9wdGlvbnM6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIGlmICghX2ltcGxfLl9leHRlbnNpb25zXy5Jc0luaXRpYWxpemVkKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoITo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQoX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXykpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTZXJ2aWNlT3B0aW9uczo6SW50ZXJuYWxTd2FwKFNlcnZpY2VPcHRpb25zKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIF9pbXBsXy5fZXh0ZW5zaW9uc18uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLl9leHRlbnNpb25zXyk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN3YXAoX2ltcGxfLl9oYXNfYml0c19bMF0sIG90aGVyLT5faW1wbF8uX2hhc19iaXRzX1swXSk7CisgIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgIHN3YXAoX2ltcGxfLmRlcHJlY2F0ZWRfLCBvdGhlci0+X2ltcGxfLmRlcHJlY2F0ZWRfKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIFNlcnZpY2VPcHRpb25zOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzE5XSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgTWV0aG9kT3B0aW9uczo6X0ludGVybmFsIHsKKyBwdWJsaWM6CisgIHVzaW5nIEhhc0JpdHMgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8TWV0aG9kT3B0aW9ucz4oKS5faW1wbF8uX2hhc19iaXRzXyk7CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfZGVwcmVjYXRlZChIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDF1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfaWRlbXBvdGVuY3lfbGV2ZWwoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAydTsKKyAgfQorfTsKKworTWV0aG9kT3B0aW9uczo6TWV0aG9kT3B0aW9ucyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQorfQorTWV0aG9kT3B0aW9uczo6TWV0aG9kT3B0aW9ucyhjb25zdCBNZXRob2RPcHRpb25zJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBNZXRob2RPcHRpb25zKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgLypkZWNsdHlwZShfaW1wbF8uX2V4dGVuc2lvbnNfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXtmcm9tLl9pbXBsXy5faGFzX2JpdHNffQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKXtmcm9tLl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl99CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZGVwcmVjYXRlZF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5pZGVtcG90ZW5jeV9sZXZlbF8pe319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5fZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSwgZnJvbS5faW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgOjptZW1jcHkoJl9pbXBsXy5kZXByZWNhdGVkXywgJmZyb20uX2ltcGxfLmRlcHJlY2F0ZWRfLAorICAgIHN0YXRpY19jYXN0PHNpemVfdD4ocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5pZGVtcG90ZW5jeV9sZXZlbF8pIC0KKyAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLmRlcHJlY2F0ZWRfKSkgKyBzaXplb2YoX2ltcGxfLmlkZW1wb3RlbmN5X2xldmVsXykpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKK30KKworaW5saW5lIHZvaWQgTWV0aG9kT3B0aW9uczo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICAvKmRlY2x0eXBlKF9pbXBsXy5fZXh0ZW5zaW9uc18pKi97OjpfcGJpOjpBcmVuYUluaXRpYWxpemVkKCksIGFyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyl7YXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZGVwcmVjYXRlZF8pe2ZhbHNlfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmlkZW1wb3RlbmN5X2xldmVsXyl7MH0KKyAgfTsKK30KKworTWV0aG9kT3B0aW9uczo6fk1ldGhvZE9wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgTWV0aG9kT3B0aW9uczo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKKyAgX2ltcGxfLl9leHRlbnNpb25zXy5+RXh0ZW5zaW9uU2V0KCk7CisgIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uflJlcGVhdGVkUHRyRmllbGQoKTsKK30KKwordm9pZCBNZXRob2RPcHRpb25zOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIF9pbXBsXy5fY2FjaGVkX3NpemVfLlNldChzaXplKTsKK30KKwordm9pZCBNZXRob2RPcHRpb25zOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfaW1wbF8uX2V4dGVuc2lvbnNfLkNsZWFyKCk7CisgIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAzdSkgeworICAgIDo6bWVtc2V0KCZfaW1wbF8uZGVwcmVjYXRlZF8sIDAsIHN0YXRpY19jYXN0PHNpemVfdD4oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uaWRlbXBvdGVuY3lfbGV2ZWxfKSAtCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uZGVwcmVjYXRlZF8pKSArIHNpemVvZihfaW1wbF8uaWRlbXBvdGVuY3lfbGV2ZWxfKSk7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c18uQ2xlYXIoKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5DbGVhcjw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworfQorCitjb25zdCBjaGFyKiBNZXRob2RPcHRpb25zOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIF9JbnRlcm5hbDo6SGFzQml0cyBoYXNfYml0c3t9OworICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICAgIGNhc2UgMzM6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA4KSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19kZXByZWNhdGVkKCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLmRlcHJlY2F0ZWRfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5JZGVtcG90ZW5jeUxldmVsIGlkZW1wb3RlbmN5X2xldmVsID0gMzQgW2RlZmF1bHQgPSBJREVNUE9URU5DWV9VTktOT1dOXTsKKyAgICAgIGNhc2UgMzQ6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxNikpIHsKKyAgICAgICAgICB1aW50NjRfdCB2YWwgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsX0lzVmFsaWQodmFsKSkpIHsKKyAgICAgICAgICAgIF9pbnRlcm5hbF9zZXRfaWRlbXBvdGVuY3lfbGV2ZWwoc3RhdGljX2Nhc3Q8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbD4odmFsKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V3JpdGVWYXJpbnQoMzQsIHZhbCwgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICAgICAgY2FzZSA5OTk6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA1OCkpIHsKKyAgICAgICAgICBwdHIgLT0gMjsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSwgcHRyKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDc5OTQ+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIGlmICgoODAwMHUgPD0gdGFnKSkgeworICAgICAgcHRyID0gX2ltcGxfLl9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgcHRyLCBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCksICZfaW50ZXJuYWxfbWV0YWRhdGFfLCBjdHgpOworICAgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgX2ltcGxfLl9oYXNfYml0c18uT3IoaGFzX2JpdHMpOworICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBNZXRob2RPcHRpb25zOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMzMsIHRoaXMtPl9pbnRlcm5hbF9kZXByZWNhdGVkKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuSWRlbXBvdGVuY3lMZXZlbCBpZGVtcG90ZW5jeV9sZXZlbCA9IDM0IFtkZWZhdWx0ID0gSURFTVBPVEVOQ1lfVU5LTk9XTl07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAorICAgICAgMzQsIHRoaXMtPl9pbnRlcm5hbF9pZGVtcG90ZW5jeV9sZXZlbCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpKTsgaSA8IG47IGkrKykgeworICAgIGNvbnN0IGF1dG8mIHJlcGZpZWxkID0gdGhpcy0+X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg5OTksIHJlcGZpZWxkLCByZXBmaWVsZC5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQorICB0YXJnZXQgPSBfaW1wbF8uX2V4dGVuc2lvbnNfLl9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLCAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCwgc3RyZWFtKTsKKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IE1ldGhvZE9wdGlvbnM6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHRvdGFsX3NpemUgKz0gX2ltcGxfLl9leHRlbnNpb25zXy5CeXRlU2l6ZSgpOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgdG90YWxfc2l6ZSArPSAyVUwgKiB0aGlzLT5faW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZShtc2cpOworICB9CisKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAzdSkgeworICAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMzIFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAyICsgMTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuSWRlbXBvdGVuY3lMZXZlbCBpZGVtcG90ZW5jeV9sZXZlbCA9IDM0IFtkZWZhdWx0ID0gSURFTVBPVEVOQ1lfVU5LTk9XTl07CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDIgKworICAgICAgICA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5faW50ZXJuYWxfaWRlbXBvdGVuY3lfbGV2ZWwoKSk7CisgICAgfQorCisgIH0KKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgTWV0aG9kT3B0aW9uczo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIE1ldGhvZE9wdGlvbnM6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqTWV0aG9kT3B0aW9uczo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgTWV0aG9kT3B0aW9uczo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PE1ldGhvZE9wdGlvbnMqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IE1ldGhvZE9wdGlvbnMmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX3RoaXMtPl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgIGNhY2hlZF9oYXNfYml0cyA9IGZyb20uX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAzdSkgeworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgX3RoaXMtPl9pbXBsXy5kZXByZWNhdGVkXyA9IGZyb20uX2ltcGxfLmRlcHJlY2F0ZWRfOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8uaWRlbXBvdGVuY3lfbGV2ZWxfID0gZnJvbS5faW1wbF8uaWRlbXBvdGVuY3lfbGV2ZWxfOworICAgIH0KKyAgICBfdGhpcy0+X2ltcGxfLl9oYXNfYml0c19bMF0gfD0gY2FjaGVkX2hhc19iaXRzOworICB9CisgIF90aGlzLT5faW1wbF8uX2V4dGVuc2lvbnNfLk1lcmdlRnJvbShpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCksIGZyb20uX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIE1ldGhvZE9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IE1ldGhvZE9wdGlvbnMmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBNZXRob2RPcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICBpZiAoIV9pbXBsXy5fZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCE6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8pKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWV0aG9kT3B0aW9uczo6SW50ZXJuYWxTd2FwKE1ldGhvZE9wdGlvbnMqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgX2ltcGxfLl9leHRlbnNpb25zXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3dhcChfaW1wbF8uX2hhc19iaXRzX1swXSwgb3RoZXItPl9pbXBsXy5faGFzX2JpdHNfWzBdKTsKKyAgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjptZW1zd2FwPAorICAgICAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKE1ldGhvZE9wdGlvbnMsIF9pbXBsXy5pZGVtcG90ZW5jeV9sZXZlbF8pCisgICAgICArIHNpemVvZihNZXRob2RPcHRpb25zOjpfaW1wbF8uaWRlbXBvdGVuY3lfbGV2ZWxfKQorICAgICAgLSBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoTWV0aG9kT3B0aW9ucywgX2ltcGxfLmRlcHJlY2F0ZWRfKT4oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5kZXByZWNhdGVkXyksCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm90aGVyLT5faW1wbF8uZGVwcmVjYXRlZF8pKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIE1ldGhvZE9wdGlvbnM6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9bMjBdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpfSW50ZXJuYWwgeworIHB1YmxpYzoKKyAgdXNpbmcgSGFzQml0cyA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0PigpLl9pbXBsXy5faGFzX2JpdHNfKTsKKyAgc3RhdGljIHZvaWQgc2V0X2hhc19uYW1lX3BhcnQoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAxdTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX2lzX2V4dGVuc2lvbihIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDJ1OworICB9CisgIHN0YXRpYyBib29sIE1pc3NpbmdSZXF1aXJlZEZpZWxkcyhjb25zdCBIYXNCaXRzJiBoYXNfYml0cykgeworICAgIHJldHVybiAoKGhhc19iaXRzWzBdICYgMHgwMDAwMDAwMykgXiAweDAwMDAwMDAzKSAhPSAwOworICB9Cit9OworCitVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCit9CitVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIGNvbnN0IF90aGlzID0gdGhpczsgKHZvaWQpX3RoaXM7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXyl7ZnJvbS5faW1wbF8uX2hhc19iaXRzX30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm5hbWVfcGFydF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5pc19leHRlbnNpb25fKXt9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8ubmFtZV9wYXJ0Xy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5uYW1lX3BhcnRfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX25hbWVfcGFydCgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5uYW1lX3BhcnRfLlNldChmcm9tLl9pbnRlcm5hbF9uYW1lX3BhcnQoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIF90aGlzLT5faW1wbF8uaXNfZXh0ZW5zaW9uXyA9IGZyb20uX2ltcGxfLmlzX2V4dGVuc2lvbl87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQorfQorCitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW1lX3BhcnRfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uaXNfZXh0ZW5zaW9uXyl7ZmFsc2V9CisgIH07CisgIF9pbXBsXy5uYW1lX3BhcnRfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLm5hbWVfcGFydF8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCit9CisKK1VuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6On5VbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy5uYW1lX3BhcnRfLkRlc3Ryb3koKTsKK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIF9pbXBsXy5fY2FjaGVkX3NpemVfLlNldChzaXplKTsKK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgX2ltcGxfLm5hbWVfcGFydF8uQ2xlYXJOb25EZWZhdWx0VG9FbXB0eSgpOworICB9CisgIF9pbXBsXy5pc19leHRlbnNpb25fID0gZmFsc2U7CisgIF9pbXBsXy5faGFzX2JpdHNfLkNsZWFyKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICBfSW50ZXJuYWw6Okhhc0JpdHMgaGFzX2JpdHN7fTsKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxMCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWVfcGFydCgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAjaWZuZGVmIE5ERUJVRworICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5uYW1lX3BhcnQiKTsKKyAgICAgICAgICAjZW5kaWYgIC8vICFOREVCVUcKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyByZXF1aXJlZCBib29sIGlzX2V4dGVuc2lvbiA9IDI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxNikpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfaXNfZXh0ZW5zaW9uKCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLmlzX2V4dGVuc2lvbl8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICB9ICAvLyBzd2l0Y2gKKyAgaGFuZGxlX3VudXN1YWw6CisgICAgaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkgeworICAgICAgQ0hLXyhwdHIpOworICAgICAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7CisgICAgICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgX2ltcGxfLl9oYXNfYml0c18uT3IoaGFzX2JpdHMpOworICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICAvLyByZXF1aXJlZCBzdHJpbmcgbmFtZV9wYXJ0ID0gMTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lX3BhcnQoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX25hbWVfcGFydCgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDEsIHRoaXMtPl9pbnRlcm5hbF9uYW1lX3BhcnQoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcXVpcmVkIGJvb2wgaXNfZXh0ZW5zaW9uID0gMjsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMiwgdGhpcy0+X2ludGVybmFsX2lzX2V4dGVuc2lvbigpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpSZXF1aXJlZEZpZWxkc0J5dGVTaXplRmFsbGJhY2soKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocmVxdWlyZWRfZmllbGRzX2J5dGVfc2l6ZV9mYWxsYmFja19zdGFydDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIGlmIChfaW50ZXJuYWxfaGFzX25hbWVfcGFydCgpKSB7CisgICAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lX3BhcnQoKSk7CisgIH0KKworICBpZiAoX2ludGVybmFsX2hhc19pc19leHRlbnNpb24oKSkgeworICAgIC8vIHJlcXVpcmVkIGJvb2wgaXNfZXh0ZW5zaW9uID0gMjsKKyAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICB9CisKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CitzaXplX3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQorICBzaXplX3QgdG90YWxfc2l6ZSA9IDA7CisKKyAgaWYgKCgoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAzKSBeIDB4MDAwMDAwMDMpID09IDApIHsgIC8vIEFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQuCisgICAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lX3BhcnQoKSk7CisKKyAgICAvLyByZXF1aXJlZCBib29sIGlzX2V4dGVuc2lvbiA9IDI7CisgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKworICB9IGVsc2UgeworICAgIHRvdGFsX3NpemUgKz0gUmVxdWlyZWRGaWVsZHNCeXRlU2l6ZUZhbGxiYWNrKCk7CisgIH0KKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgY2FjaGVkX2hhc19iaXRzID0gZnJvbS5faW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDN1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9uYW1lX3BhcnQoZnJvbS5faW50ZXJuYWxfbmFtZV9wYXJ0KCkpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8uaXNfZXh0ZW5zaW9uXyA9IGZyb20uX2ltcGxfLmlzX2V4dGVuc2lvbl87CisgICAgfQorICAgIF90aGlzLT5faW1wbF8uX2hhc19iaXRzX1swXSB8PSBjYWNoZWRfaGFzX2JpdHM7CisgIH0KKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Q29weUZyb20oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIGlmIChfSW50ZXJuYWw6Ok1pc3NpbmdSZXF1aXJlZEZpZWxkcyhfaW1wbF8uX2hhc19iaXRzXykpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6SW50ZXJuYWxTd2FwKFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgYXV0byogbGhzX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGF1dG8qIHJoc19hcmVuYSA9IG90aGVyLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3dhcChfaW1wbF8uX2hhc19iaXRzX1swXSwgb3RoZXItPl9pbXBsXy5faGFzX2JpdHNfWzBdKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5uYW1lX3BhcnRfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5uYW1lX3BhcnRfLCByaHNfYXJlbmEKKyAgKTsKKyAgc3dhcChfaW1wbF8uaXNfZXh0ZW5zaW9uXywgb3RoZXItPl9pbXBsXy5pc19leHRlbnNpb25fKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9bMjFdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBVbmludGVycHJldGVkT3B0aW9uOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKKyAgdXNpbmcgSGFzQml0cyA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxVbmludGVycHJldGVkT3B0aW9uPigpLl9pbXBsXy5faGFzX2JpdHNfKTsKKyAgc3RhdGljIHZvaWQgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMXU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc19wb3NpdGl2ZV9pbnRfdmFsdWUoSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSA4dTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX25lZ2F0aXZlX2ludF92YWx1ZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDE2dTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX2RvdWJsZV92YWx1ZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDMydTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX3N0cmluZ192YWx1ZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDJ1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gNHU7CisgIH0KK307CisKK1VuaW50ZXJwcmV0ZWRPcHRpb246OlVuaW50ZXJwcmV0ZWRPcHRpb24oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQpCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgU2hhcmVkQ3RvcihhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbikKK30KK1VuaW50ZXJwcmV0ZWRPcHRpb246OlVuaW50ZXJwcmV0ZWRPcHRpb24oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgVW5pbnRlcnByZXRlZE9wdGlvbiogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXtmcm9tLl9pbXBsXy5faGFzX2JpdHNffQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubmFtZV8pe2Zyb20uX2ltcGxfLm5hbWVffQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmlkZW50aWZpZXJfdmFsdWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uc3RyaW5nX3ZhbHVlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmFnZ3JlZ2F0ZV92YWx1ZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5wb3NpdGl2ZV9pbnRfdmFsdWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubmVnYXRpdmVfaW50X3ZhbHVlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmRvdWJsZV92YWx1ZV8pe319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5pZGVudGlmaWVyX3ZhbHVlXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5pZGVudGlmaWVyX3ZhbHVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19pZGVudGlmaWVyX3ZhbHVlKCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLmlkZW50aWZpZXJfdmFsdWVfLlNldChmcm9tLl9pbnRlcm5hbF9pZGVudGlmaWVyX3ZhbHVlKCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICBfaW1wbF8uc3RyaW5nX3ZhbHVlXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5zdHJpbmdfdmFsdWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoZnJvbS5faW50ZXJuYWxfaGFzX3N0cmluZ192YWx1ZSgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5zdHJpbmdfdmFsdWVfLlNldChmcm9tLl9pbnRlcm5hbF9zdHJpbmdfdmFsdWUoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIF9pbXBsXy5hZ2dyZWdhdGVfdmFsdWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLmFnZ3JlZ2F0ZV92YWx1ZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfYWdncmVnYXRlX3ZhbHVlKCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLmFnZ3JlZ2F0ZV92YWx1ZV8uU2V0KGZyb20uX2ludGVybmFsX2FnZ3JlZ2F0ZV92YWx1ZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgOjptZW1jcHkoJl9pbXBsXy5wb3NpdGl2ZV9pbnRfdmFsdWVfLCAmZnJvbS5faW1wbF8ucG9zaXRpdmVfaW50X3ZhbHVlXywKKyAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uZG91YmxlX3ZhbHVlXykgLQorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8ucG9zaXRpdmVfaW50X3ZhbHVlXykpICsgc2l6ZW9mKF9pbXBsXy5kb3VibGVfdmFsdWVfKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQorfQorCitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW1lXyl7YXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uaWRlbnRpZmllcl92YWx1ZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zdHJpbmdfdmFsdWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uYWdncmVnYXRlX3ZhbHVlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnBvc2l0aXZlX2ludF92YWx1ZV8pe3VpbnQ2NF90ezB1fX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uZWdhdGl2ZV9pbnRfdmFsdWVfKXtpbnQ2NF90ezB9fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmRvdWJsZV92YWx1ZV8pezB9CisgIH07CisgIF9pbXBsXy5pZGVudGlmaWVyX3ZhbHVlXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5pZGVudGlmaWVyX3ZhbHVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgX2ltcGxfLnN0cmluZ192YWx1ZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8uc3RyaW5nX3ZhbHVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgX2ltcGxfLmFnZ3JlZ2F0ZV92YWx1ZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8uYWdncmVnYXRlX3ZhbHVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKK30KKworVW5pbnRlcnByZXRlZE9wdGlvbjo6flVuaW50ZXJwcmV0ZWRPcHRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKKyAgX2ltcGxfLm5hbWVfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5pZGVudGlmaWVyX3ZhbHVlXy5EZXN0cm95KCk7CisgIF9pbXBsXy5zdHJpbmdfdmFsdWVfLkRlc3Ryb3koKTsKKyAgX2ltcGxfLmFnZ3JlZ2F0ZV92YWx1ZV8uRGVzdHJveSgpOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy5uYW1lXy5DbGVhcigpOworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDd1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfaW1wbF8uaWRlbnRpZmllcl92YWx1ZV8uQ2xlYXJOb25EZWZhdWx0VG9FbXB0eSgpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIF9pbXBsXy5zdHJpbmdfdmFsdWVfLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICBfaW1wbF8uYWdncmVnYXRlX3ZhbHVlXy5DbGVhck5vbkRlZmF1bHRUb0VtcHR5KCk7CisgICAgfQorICB9CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDM4dSkgeworICAgIDo6bWVtc2V0KCZfaW1wbF8ucG9zaXRpdmVfaW50X3ZhbHVlXywgMCwgc3RhdGljX2Nhc3Q8c2l6ZV90PigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5kb3VibGVfdmFsdWVfKSAtCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8ucG9zaXRpdmVfaW50X3ZhbHVlXykpICsgc2l6ZW9mKF9pbXBsXy5kb3VibGVfdmFsdWVfKSk7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c18uQ2xlYXIoKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5DbGVhcjw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworfQorCitjb25zdCBjaGFyKiBVbmludGVycHJldGVkT3B0aW9uOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIF9JbnRlcm5hbDo6SGFzQml0cyBoYXNfYml0c3t9OworICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxOCkpIHsKKyAgICAgICAgICBwdHIgLT0gMTsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9hZGRfbmFtZSgpLCBwdHIpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8MTg+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBpZGVudGlmaWVyX3ZhbHVlID0gMzsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDI2KSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfaWRlbnRpZmllcl92YWx1ZSgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAjaWZuZGVmIE5ERUJVRworICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlIik7CisgICAgICAgICAgI2VuZGlmICAvLyAhTkRFQlVHCisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAzMikpIHsKKyAgICAgICAgICBfSW50ZXJuYWw6OnNldF9oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCZoYXNfYml0cyk7CisgICAgICAgICAgX2ltcGxfLnBvc2l0aXZlX2ludF92YWx1ZV8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDQwKSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19uZWdhdGl2ZV9pbnRfdmFsdWUoJmhhc19iaXRzKTsKKyAgICAgICAgICBfaW1wbF8ubmVnYXRpdmVfaW50X3ZhbHVlXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDQ5KSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19kb3VibGVfdmFsdWUoJmhhc19iaXRzKTsKKyAgICAgICAgICBfaW1wbF8uZG91YmxlX3ZhbHVlXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6VW5hbGlnbmVkTG9hZDxkb3VibGU+KHB0cik7CisgICAgICAgICAgcHRyICs9IHNpemVvZihkb3VibGUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIGJ5dGVzIHN0cmluZ192YWx1ZSA9IDc7CisgICAgICBjYXNlIDc6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA1OCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX3N0cmluZ192YWx1ZSgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgYWdncmVnYXRlX3ZhbHVlID0gODsKKyAgICAgIGNhc2UgODoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDY2KSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfYWdncmVnYXRlX3ZhbHVlKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmFnZ3JlZ2F0ZV92YWx1ZSIpOworICAgICAgICAgICNlbmRpZiAgLy8gIU5ERUJVRworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIF9pbXBsXy5faGFzX2JpdHNfLk9yKGhhc19iaXRzKTsKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogVW5pbnRlcnByZXRlZE9wdGlvbjo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbikKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9uYW1lX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9uYW1lKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSgyLCByZXBmaWVsZCwgcmVwZmllbGQuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGlkZW50aWZpZXJfdmFsdWUgPSAzOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX2lkZW50aWZpZXJfdmFsdWUoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX2lkZW50aWZpZXJfdmFsdWUoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgMywgdGhpcy0+X2ludGVybmFsX2lkZW50aWZpZXJfdmFsdWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHVpbnQ2NCBwb3NpdGl2ZV9pbnRfdmFsdWUgPSA0OworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwOHUpIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjRUb0FycmF5KDQsIHRoaXMtPl9pbnRlcm5hbF9wb3NpdGl2ZV9pbnRfdmFsdWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGludDY0IG5lZ2F0aXZlX2ludF92YWx1ZSA9IDU7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDEwdSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0VG9BcnJheSg1LCB0aGlzLT5faW50ZXJuYWxfbmVnYXRpdmVfaW50X3ZhbHVlKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMjB1KSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlRG91YmxlVG9BcnJheSg2LCB0aGlzLT5faW50ZXJuYWxfZG91YmxlX3ZhbHVlKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBieXRlcyBzdHJpbmdfdmFsdWUgPSA3OworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlQnl0ZXNNYXliZUFsaWFzZWQoCisgICAgICAgIDcsIHRoaXMtPl9pbnRlcm5hbF9zdHJpbmdfdmFsdWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBhZ2dyZWdhdGVfdmFsdWUgPSA4OworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwNHUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX2FnZ3JlZ2F0ZV92YWx1ZSgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pih0aGlzLT5faW50ZXJuYWxfYWdncmVnYXRlX3ZhbHVlKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uYWdncmVnYXRlX3ZhbHVlIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgOCwgdGhpcy0+X2ludGVybmFsX2FnZ3JlZ2F0ZV92YWx1ZSgpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBVbmludGVycHJldGVkT3B0aW9uOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7CisgIHRvdGFsX3NpemUgKz0gMVVMICogdGhpcy0+X2ludGVybmFsX25hbWVfc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy5uYW1lXykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKG1zZyk7CisgIH0KKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwM2Z1KSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGlkZW50aWZpZXJfdmFsdWUgPSAzOworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5faW50ZXJuYWxfaWRlbnRpZmllcl92YWx1ZSgpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBieXRlcyBzdHJpbmdfdmFsdWUgPSA3OworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Qnl0ZXNTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9zdHJpbmdfdmFsdWUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGFnZ3JlZ2F0ZV92YWx1ZSA9IDg7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9hZ2dyZWdhdGVfdmFsdWUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OlVJbnQ2NFNpemVQbHVzT25lKHRoaXMtPl9pbnRlcm5hbF9wb3NpdGl2ZV9pbnRfdmFsdWUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAxMHUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6SW50NjRTaXplUGx1c09uZSh0aGlzLT5faW50ZXJuYWxfbmVnYXRpdmVfaW50X3ZhbHVlKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGRvdWJsZSBkb3VibGVfdmFsdWUgPSA2OworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDIwdSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgODsKKyAgICB9CisKKyAgfQorICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBVbmludGVycHJldGVkT3B0aW9uOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgVW5pbnRlcnByZXRlZE9wdGlvbjo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpVbmludGVycHJldGVkT3B0aW9uOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8VW5pbnRlcnByZXRlZE9wdGlvbio+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfdGhpcy0+X2ltcGxfLm5hbWVfLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5uYW1lXyk7CisgIGNhY2hlZF9oYXNfYml0cyA9IGZyb20uX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDNmdSkgeworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfaWRlbnRpZmllcl92YWx1ZShmcm9tLl9pbnRlcm5hbF9pZGVudGlmaWVyX3ZhbHVlKCkpOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X3N0cmluZ192YWx1ZShmcm9tLl9pbnRlcm5hbF9zdHJpbmdfdmFsdWUoKSk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA0dSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfYWdncmVnYXRlX3ZhbHVlKGZyb20uX2ludGVybmFsX2FnZ3JlZ2F0ZV92YWx1ZSgpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDh1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLnBvc2l0aXZlX2ludF92YWx1ZV8gPSBmcm9tLl9pbXBsXy5wb3NpdGl2ZV9pbnRfdmFsdWVfOworICAgIH0KKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAxMHUpIHsKKyAgICAgIF90aGlzLT5faW1wbF8ubmVnYXRpdmVfaW50X3ZhbHVlXyA9IGZyb20uX2ltcGxfLm5lZ2F0aXZlX2ludF92YWx1ZV87CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDIwdSkgeworICAgICAgX3RoaXMtPl9pbXBsXy5kb3VibGVfdmFsdWVfID0gZnJvbS5faW1wbF8uZG91YmxlX3ZhbHVlXzsKKyAgICB9CisgICAgX3RoaXMtPl9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IGNhY2hlZF9oYXNfYml0czsKKyAgfQorICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpDb3B5RnJvbShjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgVW5pbnRlcnByZXRlZE9wdGlvbjo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgaWYgKCE6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKF9pbXBsXy5uYW1lXykpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpJbnRlcm5hbFN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbiogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBhdXRvKiBsaHNfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgYXV0byogcmhzX2FyZW5hID0gb3RoZXItPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzd2FwKF9pbXBsXy5faGFzX2JpdHNfWzBdLCBvdGhlci0+X2ltcGxfLl9oYXNfYml0c19bMF0pOworICBfaW1wbF8ubmFtZV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLm5hbWVfKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5pZGVudGlmaWVyX3ZhbHVlXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8uaWRlbnRpZmllcl92YWx1ZV8sIHJoc19hcmVuYQorICApOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLnN0cmluZ192YWx1ZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLnN0cmluZ192YWx1ZV8sIHJoc19hcmVuYQorICApOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLmFnZ3JlZ2F0ZV92YWx1ZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLmFnZ3JlZ2F0ZV92YWx1ZV8sIHJoc19hcmVuYQorICApOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Om1lbXN3YXA8CisgICAgICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbiwgX2ltcGxfLmRvdWJsZV92YWx1ZV8pCisgICAgICArIHNpemVvZihVbmludGVycHJldGVkT3B0aW9uOjpfaW1wbF8uZG91YmxlX3ZhbHVlXykKKyAgICAgIC0gUFJPVE9CVUZfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIF9pbXBsXy5wb3NpdGl2ZV9pbnRfdmFsdWVfKT4oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5wb3NpdGl2ZV9pbnRfdmFsdWVfKSwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmb3RoZXItPl9pbXBsXy5wb3NpdGl2ZV9pbnRfdmFsdWVfKSk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBVbmludGVycHJldGVkT3B0aW9uOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzIyXSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgU291cmNlQ29kZUluZm9fTG9jYXRpb246Ol9JbnRlcm5hbCB7CisgcHVibGljOgorICB1c2luZyBIYXNCaXRzID0gZGVjbHR5cGUoc3RkOjpkZWNsdmFsPFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uPigpLl9pbXBsXy5faGFzX2JpdHNfKTsKKyAgc3RhdGljIHZvaWQgc2V0X2hhc19sZWFkaW5nX2NvbW1lbnRzKEhhc0JpdHMqIGhhc19iaXRzKSB7CisgICAgKCpoYXNfYml0cylbMF0gfD0gMXU7CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2hhc190cmFpbGluZ19jb21tZW50cyhIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDJ1OworICB9Cit9OworCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQpCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgU2hhcmVkQ3RvcihhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCit9CitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24oY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24mIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLl9oYXNfYml0c18pe2Zyb20uX2ltcGxfLl9oYXNfYml0c199CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5wYXRoXyl7ZnJvbS5faW1wbF8ucGF0aF99CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fcGF0aF9jYWNoZWRfYnl0ZV9zaXplXykqL3swfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnNwYW5fKXtmcm9tLl9pbXBsXy5zcGFuX30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9zcGFuX2NhY2hlZF9ieXRlX3NpemVfKSovezB9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18pe2Zyb20uX2ltcGxfLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNffQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmxlYWRpbmdfY29tbWVudHNfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8udHJhaWxpbmdfY29tbWVudHNfKXt9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8ubGVhZGluZ19jb21tZW50c18uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ubGVhZGluZ19jb21tZW50c18uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfbGVhZGluZ19jb21tZW50cygpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5sZWFkaW5nX2NvbW1lbnRzXy5TZXQoZnJvbS5faW50ZXJuYWxfbGVhZGluZ19jb21tZW50cygpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgX2ltcGxfLnRyYWlsaW5nX2NvbW1lbnRzXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy50cmFpbGluZ19jb21tZW50c18uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfdHJhaWxpbmdfY29tbWVudHMoKSkgeworICAgIF90aGlzLT5faW1wbF8udHJhaWxpbmdfY29tbWVudHNfLlNldChmcm9tLl9pbnRlcm5hbF90cmFpbGluZ19jb21tZW50cygpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQorfQorCitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucGF0aF8pe2FyZW5hfQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX3BhdGhfY2FjaGVkX2J5dGVfc2l6ZV8pKi97MH0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zcGFuXyl7YXJlbmF9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fc3Bhbl9jYWNoZWRfYnl0ZV9zaXplXykqL3swfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5sZWFkaW5nX2NvbW1lbnRzXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnRyYWlsaW5nX2NvbW1lbnRzXyl7fQorICB9OworICBfaW1wbF8ubGVhZGluZ19jb21tZW50c18uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ubGVhZGluZ19jb21tZW50c18uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIF9pbXBsXy50cmFpbGluZ19jb21tZW50c18uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8udHJhaWxpbmdfY29tbWVudHNfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworfQorCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6flNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKKyAgX2ltcGxfLnBhdGhfLn5SZXBlYXRlZEZpZWxkKCk7CisgIF9pbXBsXy5zcGFuXy5+UmVwZWF0ZWRGaWVsZCgpOworICBfaW1wbF8ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uflJlcGVhdGVkUHRyRmllbGQoKTsKKyAgX2ltcGxfLmxlYWRpbmdfY29tbWVudHNfLkRlc3Ryb3koKTsKKyAgX2ltcGxfLnRyYWlsaW5nX2NvbW1lbnRzXy5EZXN0cm95KCk7Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLnBhdGhfLkNsZWFyKCk7CisgIF9pbXBsXy5zcGFuXy5DbGVhcigpOworICBfaW1wbF8ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uQ2xlYXIoKTsKKyAgY2FjaGVkX2hhc19iaXRzID0gX2ltcGxfLl9oYXNfYml0c19bMF07CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAzdSkgeworICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAxdSkgeworICAgICAgX2ltcGxfLmxlYWRpbmdfY29tbWVudHNfLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICBfaW1wbF8udHJhaWxpbmdfY29tbWVudHNfLkNsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKTsKKyAgICB9CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c18uQ2xlYXIoKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5DbGVhcjw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworfQorCitjb25zdCBjaGFyKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICBfSW50ZXJuYWw6Okhhc0JpdHMgaGFzX2JpdHN7fTsKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTApKSB7CisgICAgICAgICAgcHRyID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYWNrZWRJbnQzMlBhcnNlcihfaW50ZXJuYWxfbXV0YWJsZV9wYXRoKCksIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA4KSB7CisgICAgICAgICAgX2ludGVybmFsX2FkZF9wYXRoKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDMyKCZwdHIpKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgaW50MzIgc3BhbiA9IDIgW3BhY2tlZCA9IHRydWVdOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTgpKSB7CisgICAgICAgICAgcHRyID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYWNrZWRJbnQzMlBhcnNlcihfaW50ZXJuYWxfbXV0YWJsZV9zcGFuKCksIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxNikgeworICAgICAgICAgIF9pbnRlcm5hbF9hZGRfc3Bhbig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQzMigmcHRyKSk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBsZWFkaW5nX2NvbW1lbnRzID0gMzsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDI2KSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfbGVhZGluZ19jb21tZW50cygpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAjaWZuZGVmIE5ERUJVRworICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cyIpOworICAgICAgICAgICNlbmRpZiAgLy8gIU5ERUJVRworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyB0cmFpbGluZ19jb21tZW50cyA9IDQ7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAzNCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX3RyYWlsaW5nX2NvbW1lbnRzKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cyIpOworICAgICAgICAgICNlbmRpZiAgLy8gIU5ERUJVRworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHJlcGVhdGVkIHN0cmluZyBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzID0gNjsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDUwKSkgeworICAgICAgICAgIHB0ciAtPSAxOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfYWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKTsKKyAgICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyIpOworICAgICAgICAgICAgI2VuZGlmICAvLyAhTkRFQlVHCisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzw1MD4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICB9ICAvLyBzd2l0Y2gKKyAgaGFuZGxlX3VudXN1YWw6CisgICAgaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkgeworICAgICAgQ0hLXyhwdHIpOworICAgICAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7CisgICAgICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgX2ltcGxfLl9oYXNfYml0c18uT3IoaGFzX2JpdHMpOworICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworICB7CisgICAgaW50IGJ5dGVfc2l6ZSA9IF9pbXBsXy5fcGF0aF9jYWNoZWRfYnl0ZV9zaXplXy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGlmIChieXRlX3NpemUgPiAwKSB7CisgICAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlSW50MzJQYWNrZWQoCisgICAgICAgICAgMSwgX2ludGVybmFsX3BhdGgoKSwgYnl0ZV9zaXplLCB0YXJnZXQpOworICAgIH0KKyAgfQorCisgIC8vIHJlcGVhdGVkIGludDMyIHNwYW4gPSAyIFtwYWNrZWQgPSB0cnVlXTsKKyAgeworICAgIGludCBieXRlX3NpemUgPSBfaW1wbF8uX3NwYW5fY2FjaGVkX2J5dGVfc2l6ZV8ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBpZiAoYnl0ZV9zaXplID4gMCkgeworICAgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZUludDMyUGFja2VkKAorICAgICAgICAgIDIsIF9pbnRlcm5hbF9zcGFuKCksIGJ5dGVfc2l6ZSwgdGFyZ2V0KTsKKyAgICB9CisgIH0KKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGxlYWRpbmdfY29tbWVudHMgPSAzOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX2xlYWRpbmdfY29tbWVudHMoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX2xlYWRpbmdfY29tbWVudHMoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cyIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDMsIHRoaXMtPl9pbnRlcm5hbF9sZWFkaW5nX2NvbW1lbnRzKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgdHJhaWxpbmdfY29tbWVudHMgPSA0OworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX3RyYWlsaW5nX2NvbW1lbnRzKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF90cmFpbGluZ19jb21tZW50cygpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cyIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDQsIHRoaXMtPl9pbnRlcm5hbF90cmFpbGluZ19jb21tZW50cygpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMgPSA2OworICBmb3IgKGludCBpID0gMCwgbiA9IHRoaXMtPl9pbnRlcm5hbF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzX3NpemUoKTsgaSA8IG47IGkrKykgeworICAgIGNvbnN0IGF1dG8mIHMgPSB0aGlzLT5faW50ZXJuYWxfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpKTsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgcy5kYXRhKCksIHN0YXRpY19jYXN0PGludD4ocy5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmcoNiwgcywgdGFyZ2V0KTsKKyAgfQorCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSkgeworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdDo6SW50ZXJuYWxTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQorICBzaXplX3QgdG90YWxfc2l6ZSA9IDA7CisKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworICB7CisgICAgc2l6ZV90IGRhdGFfc2l6ZSA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgSW50MzJTaXplKHRoaXMtPl9pbXBsXy5wYXRoXyk7CisgICAgaWYgKGRhdGFfc2l6ZSA+IDApIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZShzdGF0aWNfY2FzdDxpbnQzMl90PihkYXRhX3NpemUpKTsKKyAgICB9CisgICAgaW50IGNhY2hlZF9zaXplID0gOjpfcGJpOjpUb0NhY2hlZFNpemUoZGF0YV9zaXplKTsKKyAgICBfaW1wbF8uX3BhdGhfY2FjaGVkX2J5dGVfc2l6ZV8uc3RvcmUoY2FjaGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICB0b3RhbF9zaXplICs9IGRhdGFfc2l6ZTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIGludDMyIHNwYW4gPSAyIFtwYWNrZWQgPSB0cnVlXTsKKyAgeworICAgIHNpemVfdCBkYXRhX3NpemUgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIEludDMyU2l6ZSh0aGlzLT5faW1wbF8uc3Bhbl8pOworICAgIGlmIChkYXRhX3NpemUgPiAwKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoc3RhdGljX2Nhc3Q8aW50MzJfdD4oZGF0YV9zaXplKSk7CisgICAgfQorICAgIGludCBjYWNoZWRfc2l6ZSA9IDo6X3BiaTo6VG9DYWNoZWRTaXplKGRhdGFfc2l6ZSk7CisgICAgX2ltcGxfLl9zcGFuX2NhY2hlZF9ieXRlX3NpemVfLnN0b3JlKGNhY2hlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgdG90YWxfc2l6ZSArPSBkYXRhX3NpemU7CisgIH0KKworICAvLyByZXBlYXRlZCBzdHJpbmcgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyA9IDY7CisgIHRvdGFsX3NpemUgKz0gMSAqCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZyb21JbnRTaXplKF9pbXBsXy5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5zaXplKCkpOworICBmb3IgKGludCBpID0gMCwgbiA9IF9pbXBsXy5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5zaXplKCk7IGkgPCBuOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICBfaW1wbF8ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uR2V0KGkpKTsKKyAgfQorCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwM3UpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgbGVhZGluZ19jb21tZW50cyA9IDM7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9sZWFkaW5nX2NvbW1lbnRzKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyB0cmFpbGluZ19jb21tZW50cyA9IDQ7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPl9pbnRlcm5hbF90cmFpbGluZ19jb21tZW50cygpKTsKKyAgICB9CisKKyAgfQorICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX3RoaXMtPl9pbXBsXy5wYXRoXy5NZXJnZUZyb20oZnJvbS5faW1wbF8ucGF0aF8pOworICBfdGhpcy0+X2ltcGxfLnNwYW5fLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5zcGFuXyk7CisgIF90aGlzLT5faW1wbF8ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfKTsKKyAgY2FjaGVkX2hhc19iaXRzID0gZnJvbS5faW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDN1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9sZWFkaW5nX2NvbW1lbnRzKGZyb20uX2ludGVybmFsX2xlYWRpbmdfY29tbWVudHMoKSk7CisgICAgfQorICAgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfdHJhaWxpbmdfY29tbWVudHMoZnJvbS5faW50ZXJuYWxfdHJhaWxpbmdfY29tbWVudHMoKSk7CisgICAgfQorICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpDb3B5RnJvbShjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OkludGVybmFsU3dhcChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBhdXRvKiBsaHNfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgYXV0byogcmhzX2FyZW5hID0gb3RoZXItPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzd2FwKF9pbXBsXy5faGFzX2JpdHNfWzBdLCBvdGhlci0+X2ltcGxfLl9oYXNfYml0c19bMF0pOworICBfaW1wbF8ucGF0aF8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLnBhdGhfKTsKKyAgX2ltcGxfLnNwYW5fLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5zcGFuXyk7CisgIF9pbXBsXy5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18pOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLmxlYWRpbmdfY29tbWVudHNfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5sZWFkaW5nX2NvbW1lbnRzXywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8udHJhaWxpbmdfY29tbWVudHNfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy50cmFpbGluZ19jb21tZW50c18sIHJoc19hcmVuYQorICApOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgU291cmNlQ29kZUluZm9fTG9jYXRpb246OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9bMjNdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBTb3VyY2VDb2RlSW5mbzo6X0ludGVybmFsIHsKKyBwdWJsaWM6Cit9OworCitTb3VyY2VDb2RlSW5mbzo6U291cmNlQ29kZUluZm8oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQpCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgU2hhcmVkQ3RvcihhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCit9CitTb3VyY2VDb2RlSW5mbzo6U291cmNlQ29kZUluZm8oY29uc3QgU291cmNlQ29kZUluZm8mIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIFNvdXJjZUNvZGVJbmZvKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLmxvY2F0aW9uXyl7ZnJvbS5faW1wbF8ubG9jYXRpb25ffQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCit9CisKK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5sb2NhdGlvbl8pe2FyZW5hfQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgIH07Cit9CisKK1NvdXJjZUNvZGVJbmZvOjp+U291cmNlQ29kZUluZm8oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8ubG9jYXRpb25fLn5SZXBlYXRlZFB0ckZpZWxkKCk7Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm86OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLmxvY2F0aW9uXy5DbGVhcigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIFNvdXJjZUNvZGVJbmZvOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24gbG9jYXRpb24gPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTApKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfYWRkX2xvY2F0aW9uKCksIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzwxMD4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICB9ICAvLyBzd2l0Y2gKKyAgaGFuZGxlX3VudXN1YWw6CisgICAgaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkgeworICAgICAgQ0hLXyhwdHIpOworICAgICAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7CisgICAgICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogU291cmNlQ29kZUluZm86Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24gbG9jYXRpb24gPSAxOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfbG9jYXRpb25fc2l6ZSgpKTsgaSA8IG47IGkrKykgeworICAgIGNvbnN0IGF1dG8mIHJlcGZpZWxkID0gdGhpcy0+X2ludGVybmFsX2xvY2F0aW9uKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSgxLCByZXBmaWVsZCwgcmVwZmllbGQuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBTb3VyY2VDb2RlSW5mbzo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24gbG9jYXRpb24gPSAxOworICB0b3RhbF9zaXplICs9IDFVTCAqIHRoaXMtPl9pbnRlcm5hbF9sb2NhdGlvbl9zaXplKCk7CisgIGZvciAoY29uc3QgYXV0byYgbXNnIDogdGhpcy0+X2ltcGxfLmxvY2F0aW9uXykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKG1zZyk7CisgIH0KKworICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBTb3VyY2VDb2RlSW5mbzo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIFNvdXJjZUNvZGVJbmZvOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKlNvdXJjZUNvZGVJbmZvOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBTb3VyY2VDb2RlSW5mbzo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PFNvdXJjZUNvZGVJbmZvKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBTb3VyY2VDb2RlSW5mbyY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX3RoaXMtPl9pbXBsXy5sb2NhdGlvbl8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLmxvY2F0aW9uXyk7CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvOjpDb3B5RnJvbShjb25zdCBTb3VyY2VDb2RlSW5mbyYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBTb3VyY2VDb2RlSW5mbzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm86OkludGVybmFsU3dhcChTb3VyY2VDb2RlSW5mbyogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8ubG9jYXRpb25fLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5sb2NhdGlvbl8pOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgU291cmNlQ29kZUluZm86OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9bMjRdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKKyAgdXNpbmcgSGFzQml0cyA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uPigpLl9pbXBsXy5faGFzX2JpdHNfKTsKKyAgc3RhdGljIHZvaWQgc2V0X2hhc19zb3VyY2VfZmlsZShIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDF1OworICB9CisgIHN0YXRpYyB2b2lkIHNldF9oYXNfYmVnaW4oSGFzQml0cyogaGFzX2JpdHMpIHsKKyAgICAoKmhhc19iaXRzKVswXSB8PSAydTsKKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfaGFzX2VuZChIYXNCaXRzKiBoYXNfYml0cykgeworICAgICgqaGFzX2JpdHMpWzBdIHw9IDR1OworICB9Cit9OworCitHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCit9CitHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIGNvbnN0IF90aGlzID0gdGhpczsgKHZvaWQpX3RoaXM7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8uX2hhc19iaXRzXyl7ZnJvbS5faW1wbF8uX2hhc19iaXRzX30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnBhdGhfKXtmcm9tLl9pbXBsXy5wYXRoX30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9wYXRoX2NhY2hlZF9ieXRlX3NpemVfKSovezB9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uc291cmNlX2ZpbGVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uYmVnaW5fKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uZW5kXyl7fX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX2ltcGxfLnNvdXJjZV9maWxlXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5zb3VyY2VfZmlsZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfc291cmNlX2ZpbGUoKSkgeworICAgIF90aGlzLT5faW1wbF8uc291cmNlX2ZpbGVfLlNldChmcm9tLl9pbnRlcm5hbF9zb3VyY2VfZmlsZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgOjptZW1jcHkoJl9pbXBsXy5iZWdpbl8sICZmcm9tLl9pbXBsXy5iZWdpbl8sCisgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLmVuZF8pIC0KKyAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLmJlZ2luXykpICsgc2l6ZW9mKF9pbXBsXy5lbmRfKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uKQorfQorCitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5faGFzX2JpdHNfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5wYXRoXyl7YXJlbmF9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fcGF0aF9jYWNoZWRfYnl0ZV9zaXplXykqL3swfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnNvdXJjZV9maWxlXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmJlZ2luXyl7MH0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5lbmRfKXswfQorICB9OworICBfaW1wbF8uc291cmNlX2ZpbGVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLnNvdXJjZV9maWxlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKK30KKworR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6fkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKKyAgX2ltcGxfLnBhdGhfLn5SZXBlYXRlZEZpZWxkKCk7CisgIF9pbXBsXy5zb3VyY2VfZmlsZV8uRGVzdHJveSgpOworfQorCit2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy5wYXRoXy5DbGVhcigpOworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgX2ltcGxfLnNvdXJjZV9maWxlXy5DbGVhck5vbkRlZmF1bHRUb0VtcHR5KCk7CisgIH0KKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDZ1KSB7CisgICAgOjptZW1zZXQoJl9pbXBsXy5iZWdpbl8sIDAsIHN0YXRpY19jYXN0PHNpemVfdD4oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uZW5kXykgLQorICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLmJlZ2luXykpICsgc2l6ZW9mKF9pbXBsXy5lbmRfKSk7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c18uQ2xlYXIoKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5DbGVhcjw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworfQorCitjb25zdCBjaGFyKiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIF9JbnRlcm5hbDo6SGFzQml0cyBoYXNfYml0c3t9OworICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkID0gdHJ1ZV07CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxMCkpIHsKKyAgICAgICAgICBwdHIgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhY2tlZEludDMyUGFyc2VyKF9pbnRlcm5hbF9tdXRhYmxlX3BhdGgoKSwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDgpIHsKKyAgICAgICAgICBfaW50ZXJuYWxfYWRkX3BhdGgoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50MzIoJnB0cikpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgc291cmNlX2ZpbGUgPSAyOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTgpKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9zb3VyY2VfZmlsZSgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAjaWZuZGVmIE5ERUJVRworICAgICAgICAgIDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5zb3VyY2VfZmlsZSIpOworICAgICAgICAgICNlbmRpZiAgLy8gIU5ERUJVRworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIG9wdGlvbmFsIGludDMyIGJlZ2luID0gMzsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDI0KSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19iZWdpbigmaGFzX2JpdHMpOworICAgICAgICAgIF9pbXBsXy5iZWdpbl8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQzMigmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gNDsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDMyKSkgeworICAgICAgICAgIF9JbnRlcm5hbDo6c2V0X2hhc19lbmQoJmhhc19iaXRzKTsKKyAgICAgICAgICBfaW1wbF8uZW5kXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDMyKCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICBfaW1wbF8uX2hhc19iaXRzXy5PcihoYXNfYml0cyk7CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworICB7CisgICAgaW50IGJ5dGVfc2l6ZSA9IF9pbXBsXy5fcGF0aF9jYWNoZWRfYnl0ZV9zaXplXy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGlmIChieXRlX3NpemUgPiAwKSB7CisgICAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlSW50MzJQYWNrZWQoCisgICAgICAgICAgMSwgX2ludGVybmFsX3BhdGgoKSwgYnl0ZV9zaXplLCB0YXJnZXQpOworICAgIH0KKyAgfQorCisgIGNhY2hlZF9oYXNfYml0cyA9IF9pbXBsXy5faGFzX2JpdHNfWzBdOworICAvLyBvcHRpb25hbCBzdHJpbmcgc291cmNlX2ZpbGUgPSAyOworICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+X2ludGVybmFsX3NvdXJjZV9maWxlKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9zb3VyY2VfZmlsZSgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgMiwgdGhpcy0+X2ludGVybmFsX3NvdXJjZV9maWxlKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBpbnQzMiBiZWdpbiA9IDM7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDAydSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgzLCB0aGlzLT5faW50ZXJuYWxfYmVnaW4oKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDQ7CisgIGlmIChjYWNoZWRfaGFzX2JpdHMgJiAweDAwMDAwMDA0dSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSg0LCB0aGlzLT5faW50ZXJuYWxfZW5kKCksIHRhcmdldCk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKKyAgeworICAgIHNpemVfdCBkYXRhX3NpemUgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIEludDMyU2l6ZSh0aGlzLT5faW1wbF8ucGF0aF8pOworICAgIGlmIChkYXRhX3NpemUgPiAwKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoc3RhdGljX2Nhc3Q8aW50MzJfdD4oZGF0YV9zaXplKSk7CisgICAgfQorICAgIGludCBjYWNoZWRfc2l6ZSA9IDo6X3BiaTo6VG9DYWNoZWRTaXplKGRhdGFfc2l6ZSk7CisgICAgX2ltcGxfLl9wYXRoX2NhY2hlZF9ieXRlX3NpemVfLnN0b3JlKGNhY2hlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgdG90YWxfc2l6ZSArPSBkYXRhX3NpemU7CisgIH0KKworICBjYWNoZWRfaGFzX2JpdHMgPSBfaW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDd1KSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHNvdXJjZV9maWxlID0gMjsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMXUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+X2ludGVybmFsX3NvdXJjZV9maWxlKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGludDMyIGJlZ2luID0gMzsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwMnUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplUGx1c09uZSh0aGlzLT5faW50ZXJuYWxfYmVnaW4oKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gNDsKKyAgICBpZiAoY2FjaGVkX2hhc19iaXRzICYgMHgwMDAwMDAwNHUpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplUGx1c09uZSh0aGlzLT5faW50ZXJuYWxfZW5kKCkpOworICAgIH0KKworICB9CisgIHJldHVybiBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCAmX2ltcGxfLl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH0KKworCit2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJj4oZnJvbV9tc2cpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF90aGlzLT5faW1wbF8ucGF0aF8uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLnBhdGhfKTsKKyAgY2FjaGVkX2hhc19iaXRzID0gZnJvbS5faW1wbF8uX2hhc19iaXRzX1swXTsKKyAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDd1KSB7CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDF1KSB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9zb3VyY2VfZmlsZShmcm9tLl9pbnRlcm5hbF9zb3VyY2VfZmlsZSgpKTsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDJ1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLmJlZ2luXyA9IGZyb20uX2ltcGxfLmJlZ2luXzsKKyAgICB9CisgICAgaWYgKGNhY2hlZF9oYXNfYml0cyAmIDB4MDAwMDAwMDR1KSB7CisgICAgICBfdGhpcy0+X2ltcGxfLmVuZF8gPSBmcm9tLl9pbXBsXy5lbmRfOworICAgIH0KKyAgICBfdGhpcy0+X2ltcGxfLl9oYXNfYml0c19bMF0gfD0gY2FjaGVkX2hhc19iaXRzOworICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OkNvcHlGcm9tKGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpJbnRlcm5hbFN3YXAoR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBhdXRvKiBsaHNfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgYXV0byogcmhzX2FyZW5hID0gb3RoZXItPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzd2FwKF9pbXBsXy5faGFzX2JpdHNfWzBdLCBvdGhlci0+X2ltcGxfLl9oYXNfYml0c19bMF0pOworICBfaW1wbF8ucGF0aF8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLnBhdGhfKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5zb3VyY2VfZmlsZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLnNvdXJjZV9maWxlXywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6bWVtc3dhcDwKKyAgICAgIFBST1RPQlVGX0ZJRUxEX09GRlNFVChHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uLCBfaW1wbF8uZW5kXykKKyAgICAgICsgc2l6ZW9mKEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Ol9pbXBsXy5lbmRfKQorICAgICAgLSBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiwgX2ltcGxfLmJlZ2luXyk+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uYmVnaW5fKSwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmb3RoZXItPl9pbXBsXy5iZWdpbl8pKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9bMjVdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBHZW5lcmF0ZWRDb2RlSW5mbzo6X0ludGVybmFsIHsKKyBwdWJsaWM6Cit9OworCitHZW5lcmF0ZWRDb2RlSW5mbzo6R2VuZXJhdGVkQ29kZUluZm8oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQpCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgU2hhcmVkQ3RvcihhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCit9CitHZW5lcmF0ZWRDb2RlSW5mbzo6R2VuZXJhdGVkQ29kZUluZm8oY29uc3QgR2VuZXJhdGVkQ29kZUluZm8mIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIEdlbmVyYXRlZENvZGVJbmZvKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLmFubm90YXRpb25fKXtmcm9tLl9pbXBsXy5hbm5vdGF0aW9uX30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQorfQorCitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mbzo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8uYW5ub3RhdGlvbl8pe2FyZW5hfQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgIH07Cit9CisKK0dlbmVyYXRlZENvZGVJbmZvOjp+R2VuZXJhdGVkQ29kZUluZm8oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8uYW5ub3RhdGlvbl8uflJlcGVhdGVkUHRyRmllbGQoKTsKK30KKwordm9pZCBHZW5lcmF0ZWRDb2RlSW5mbzo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm86OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfaW1wbF8uYW5ub3RhdGlvbl8uQ2xlYXIoKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5DbGVhcjw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworfQorCitjb25zdCBjaGFyKiBHZW5lcmF0ZWRDb2RlSW5mbzo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24gYW5ub3RhdGlvbiA9IDE7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxMCkpIHsKKyAgICAgICAgICBwdHIgLT0gMTsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9hZGRfYW5ub3RhdGlvbigpLCBwdHIpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8MTA+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIEdlbmVyYXRlZENvZGVJbmZvOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24gYW5ub3RhdGlvbiA9IDE7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9hbm5vdGF0aW9uX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9hbm5vdGF0aW9uKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSgxLCByZXBmaWVsZCwgcmVwZmllbGQuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBHZW5lcmF0ZWRDb2RlSW5mbzo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gMTsKKyAgdG90YWxfc2l6ZSArPSAxVUwgKiB0aGlzLT5faW50ZXJuYWxfYW5ub3RhdGlvbl9zaXplKCk7CisgIGZvciAoY29uc3QgYXV0byYgbXNnIDogdGhpcy0+X2ltcGxfLmFubm90YXRpb25fKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUobXNnKTsKKyAgfQorCisgIHJldHVybiBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCAmX2ltcGxfLl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhIEdlbmVyYXRlZENvZGVJbmZvOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgR2VuZXJhdGVkQ29kZUluZm86Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2VuZXJhdGVkQ29kZUluZm86OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH0KKworCit2b2lkIEdlbmVyYXRlZENvZGVJbmZvOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8R2VuZXJhdGVkQ29kZUluZm8qPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvJj4oZnJvbV9tc2cpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfdGhpcy0+X2ltcGxfLmFubm90YXRpb25fLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5hbm5vdGF0aW9uXyk7CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIEdlbmVyYXRlZENvZGVJbmZvOjpDb3B5RnJvbShjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbyYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBHZW5lcmF0ZWRDb2RlSW5mbzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm86OkludGVybmFsU3dhcChHZW5lcmF0ZWRDb2RlSW5mbyogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8uYW5ub3RhdGlvbl8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLmFubm90YXRpb25fKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdlbmVyYXRlZENvZGVJbmZvOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvWzI2XSk7Cit9CisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclNldCoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclNldCA+KEFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yU2V0ID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSA+KEFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90byA+KEFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90byA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkV4dGVuc2lvblJhbmdlT3B0aW9ucyoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFeHRlbnNpb25SYW5nZU9wdGlvbnMgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFeHRlbnNpb25SYW5nZU9wdGlvbnMgPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byA+KEFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZEZXNjcmlwdG9yUHJvdG8qCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZEZXNjcmlwdG9yUHJvdG8gPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZkRlc2NyaXB0b3JQcm90byA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UqCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSA+KEFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UgPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG8gPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byA+KEFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZURlc2NyaXB0b3JQcm90byA+KEFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2REZXNjcmlwdG9yUHJvdG8qCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kRGVzY3JpcHRvclByb3RvID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kRGVzY3JpcHRvclByb3RvID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMqCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucyA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZU9wdGlvbnMgPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnMqCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZPcHRpb25zKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mT3B0aW9ucyA+KEFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mT3B0aW9ucyA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1PcHRpb25zKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1PcHRpb25zID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bU9wdGlvbnMgPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVPcHRpb25zKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZU9wdGlvbnMgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVPcHRpb25zID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZU9wdGlvbnMqCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZU9wdGlvbnMgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlT3B0aW9ucyA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnMqCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9ucyA+KEFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnMgPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0ID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbioKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbyoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbyA+KEFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvZGVJbmZvID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbioKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm8gPihhcmVuYSk7Cit9CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MjgyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaApAQCAtMCwwICsxLDE0ODIxIEBACisvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bworCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorI2lmIFBST1RPQlVGX1ZFUlNJT04gPCAzMDIxMDAwCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcworI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuIFBsZWFzZSB1cGRhdGUKKyNlcnJvciB5b3VyIGhlYWRlcnMuCisjZW5kaWYKKyNpZiAzMDIxMDA5IDwgUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiBQbGVhc2UKKyNlcnJvciByZWdlbmVyYXRlIHRoaXMgZmlsZSB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2MuCisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGFfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKyNkZWZpbmUgUFJPVE9CVUZfSU5URVJOQUxfRVhQT1JUX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvIFBST1RPQlVGX0VYUE9SVAorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBBbnlNZXRhZGF0YTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCisKKy8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCAtLSBkbyBub3QgdXNlIHRoZXNlIG1lbWJlcnMuCitzdHJ1Y3QgUFJPVE9CVUZfRVhQT1JUIFRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvIHsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG9mZnNldHNbXTsKK307CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RGVzY3JpcHRvclRhYmxlIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG87CitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorY2xhc3MgRGVzY3JpcHRvclByb3RvOworc3RydWN0IERlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIERlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWwgX0Rlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXzsKK2NsYXNzIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTsKK3N0cnVjdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VEZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VEZWZhdWx0VHlwZUludGVybmFsIF9EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfZGVmYXVsdF9pbnN0YW5jZV87CitjbGFzcyBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTsKK3N0cnVjdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZURlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlRGVmYXVsdFR5cGVJbnRlcm5hbCBfRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfZGVmYXVsdF9pbnN0YW5jZV87CitjbGFzcyBFbnVtRGVzY3JpcHRvclByb3RvOworc3RydWN0IEVudW1EZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBFbnVtRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbCBfRW51bURlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXzsKK2NsYXNzIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2U7CitzdHJ1Y3QgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZURlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2VEZWZhdWx0VHlwZUludGVybmFsIF9FbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgRW51bU9wdGlvbnM7CitzdHJ1Y3QgRW51bU9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBFbnVtT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwgX0VudW1PcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOworc3RydWN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWwgX0VudW1WYWx1ZURlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXzsKK2NsYXNzIEVudW1WYWx1ZU9wdGlvbnM7CitzdHJ1Y3QgRW51bVZhbHVlT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIEVudW1WYWx1ZU9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsIF9FbnVtVmFsdWVPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOworc3RydWN0IEV4dGVuc2lvblJhbmdlT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIEV4dGVuc2lvblJhbmdlT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwgX0V4dGVuc2lvblJhbmdlT3B0aW9uc19kZWZhdWx0X2luc3RhbmNlXzsKK2NsYXNzIEZpZWxkRGVzY3JpcHRvclByb3RvOworc3RydWN0IEZpZWxkRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gRmllbGREZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsIF9GaWVsZERlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXzsKK2NsYXNzIEZpZWxkT3B0aW9uczsKK3N0cnVjdCBGaWVsZE9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBGaWVsZE9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsIF9GaWVsZE9wdGlvbnNfZGVmYXVsdF9pbnN0YW5jZV87CitjbGFzcyBGaWxlRGVzY3JpcHRvclByb3RvOworc3RydWN0IEZpbGVEZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBGaWxlRGVzY3JpcHRvclByb3RvRGVmYXVsdFR5cGVJbnRlcm5hbCBfRmlsZURlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXzsKK2NsYXNzIEZpbGVEZXNjcmlwdG9yU2V0Oworc3RydWN0IEZpbGVEZXNjcmlwdG9yU2V0RGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gRmlsZURlc2NyaXB0b3JTZXREZWZhdWx0VHlwZUludGVybmFsIF9GaWxlRGVzY3JpcHRvclNldF9kZWZhdWx0X2luc3RhbmNlXzsKK2NsYXNzIEZpbGVPcHRpb25zOworc3RydWN0IEZpbGVPcHRpb25zRGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gRmlsZU9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsIF9GaWxlT3B0aW9uc19kZWZhdWx0X2luc3RhbmNlXzsKK2NsYXNzIEdlbmVyYXRlZENvZGVJbmZvOworc3RydWN0IEdlbmVyYXRlZENvZGVJbmZvRGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gR2VuZXJhdGVkQ29kZUluZm9EZWZhdWx0VHlwZUludGVybmFsIF9HZW5lcmF0ZWRDb2RlSW5mb19kZWZhdWx0X2luc3RhbmNlXzsKK2NsYXNzIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb247CitzdHJ1Y3QgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbkRlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb25EZWZhdWx0VHlwZUludGVybmFsIF9HZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgTWVzc2FnZU9wdGlvbnM7CitzdHJ1Y3QgTWVzc2FnZU9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBNZXNzYWdlT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwgX01lc3NhZ2VPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgTWV0aG9kRGVzY3JpcHRvclByb3RvOworc3RydWN0IE1ldGhvZERlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIE1ldGhvZERlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWwgX01ldGhvZERlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXzsKK2NsYXNzIE1ldGhvZE9wdGlvbnM7CitzdHJ1Y3QgTWV0aG9kT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIE1ldGhvZE9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsIF9NZXRob2RPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgT25lb2ZEZXNjcmlwdG9yUHJvdG87CitzdHJ1Y3QgT25lb2ZEZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBPbmVvZkRlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWwgX09uZW9mRGVzY3JpcHRvclByb3RvX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgT25lb2ZPcHRpb25zOworc3RydWN0IE9uZW9mT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIE9uZW9mT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwgX09uZW9mT3B0aW9uc19kZWZhdWx0X2luc3RhbmNlXzsKK2NsYXNzIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG87CitzdHJ1Y3QgU2VydmljZURlc2NyaXB0b3JQcm90b0RlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG9EZWZhdWx0VHlwZUludGVybmFsIF9TZXJ2aWNlRGVzY3JpcHRvclByb3RvX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgU2VydmljZU9wdGlvbnM7CitzdHJ1Y3QgU2VydmljZU9wdGlvbnNEZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBTZXJ2aWNlT3B0aW9uc0RlZmF1bHRUeXBlSW50ZXJuYWwgX1NlcnZpY2VPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgU291cmNlQ29kZUluZm87CitzdHJ1Y3QgU291cmNlQ29kZUluZm9EZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBTb3VyY2VDb2RlSW5mb0RlZmF1bHRUeXBlSW50ZXJuYWwgX1NvdXJjZUNvZGVJbmZvX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgU291cmNlQ29kZUluZm9fTG9jYXRpb247CitzdHJ1Y3QgU291cmNlQ29kZUluZm9fTG9jYXRpb25EZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbkRlZmF1bHRUeXBlSW50ZXJuYWwgX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgVW5pbnRlcnByZXRlZE9wdGlvbjsKK3N0cnVjdCBVbmludGVycHJldGVkT3B0aW9uRGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gVW5pbnRlcnByZXRlZE9wdGlvbkRlZmF1bHRUeXBlSW50ZXJuYWwgX1VuaW50ZXJwcmV0ZWRPcHRpb25fZGVmYXVsdF9pbnN0YW5jZV87CitjbGFzcyBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0Oworc3RydWN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnREZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0RGVmYXVsdFR5cGVJbnRlcm5hbCBfVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8qIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90bz4oQXJlbmEqKTsKK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZT4oQXJlbmEqKTsKK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U+KEFyZW5hKik7Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90byogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90bz4oQXJlbmEqKTsKK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1PcHRpb25zKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucz4oQXJlbmEqKTsKK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bz4oQXJlbmEqKTsKK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVPcHRpb25zKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVPcHRpb25zPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkV4dGVuc2lvblJhbmdlT3B0aW9ucyogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90bz4oQXJlbmEqKTsKK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnMqIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucz4oQXJlbmEqKTsKK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yU2V0KiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclNldD4oQXJlbmEqKTsKK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucyogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnM+KEFyZW5hKik7Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm8qIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24+KEFyZW5hKik7Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZU9wdGlvbnMqIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZERlc2NyaXB0b3JQcm90byogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kRGVzY3JpcHRvclByb3RvPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnMqIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnM+KEFyZW5hKik7Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZEZXNjcmlwdG9yUHJvdG8qIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mRGVzY3JpcHRvclByb3RvPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mT3B0aW9ucyogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZPcHRpb25zPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8+KEFyZW5hKik7Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZU9wdGlvbnMqIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VPcHRpb25zPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvZGVJbmZvKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbz4oQXJlbmEqKTsKK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm9fTG9jYXRpb24+KEFyZW5hKik7Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbj4oQXJlbmEqKTsKK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0PihBcmVuYSopOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorCitlbnVtIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgOiBpbnQgeworICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRE9VQkxFID0gMSwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZMT0FUID0gMiwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0lOVDY0ID0gMywKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1VJTlQ2NCA9IDQsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9JTlQzMiA9IDUsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GSVhFRDY0ID0gNiwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZJWEVEMzIgPSA3LAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfQk9PTCA9IDgsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TVFJJTkcgPSA5LAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfR1JPVVAgPSAxMCwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX01FU1NBR0UgPSAxMSwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0JZVEVTID0gMTIsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9VSU5UMzIgPSAxMywKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0VOVU0gPSAxNCwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NGSVhFRDMyID0gMTUsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TRklYRUQ2NCA9IDE2LAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0lOVDMyID0gMTcsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TSU5UNjQgPSAxOAorfTsKK1BST1RPQlVGX0VYUE9SVCBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfSXNWYWxpZChpbnQgdmFsdWUpOworY29uc3RleHByIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UeXBlX01JTiA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9ET1VCTEU7Citjb25zdGV4cHIgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1R5cGVfTUFYID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NJTlQ2NDsKK2NvbnN0ZXhwciBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UeXBlX0FSUkFZU0laRSA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVHlwZV9NQVggKyAxOworCitQUk9UT0JVRl9FWFBPUlQgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yKiBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2Rlc2NyaXB0b3IoKTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfTmFtZShUIGVudW1fdF92YWx1ZSkgeworICBzdGF0aWNfYXNzZXJ0KDo6c3RkOjppc19zYW1lPFQsIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGU+Ojp2YWx1ZSB8fAorICAgIDo6c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsCisgICAgIkluY29ycmVjdCB0eXBlIHBhc3NlZCB0byBmdW5jdGlvbiBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX05hbWUuIik7CisgIHJldHVybiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Ok5hbWVPZkVudW0oCisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9kZXNjcmlwdG9yKCksIGVudW1fdF92YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1BhcnNlKAorICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpDb25zdFN0cmluZ1BhcmFtIG5hbWUsIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUqIHZhbHVlKSB7CisgIHJldHVybiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGU+KAorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Cit9CitlbnVtIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIDogaW50IHsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxfT1BUSU9OQUwgPSAxLAorICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9SRVFVSVJFRCA9IDIsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX1JFUEVBVEVEID0gMworfTsKK1BST1RPQlVGX0VYUE9SVCBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0lzVmFsaWQoaW50IHZhbHVlKTsKK2NvbnN0ZXhwciBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MYWJlbF9NSU4gPSBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9PUFRJT05BTDsKK2NvbnN0ZXhwciBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MYWJlbF9NQVggPSBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9SRVBFQVRFRDsKK2NvbnN0ZXhwciBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTGFiZWxfQVJSQVlTSVpFID0gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTGFiZWxfTUFYICsgMTsKKworUFJPVE9CVUZfRVhQT1JUIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvciogRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcigpOwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTmFtZShUIGVudW1fdF92YWx1ZSkgeworICBzdGF0aWNfYXNzZXJ0KDo6c3RkOjppc19zYW1lPFQsIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsPjo6dmFsdWUgfHwKKyAgICA6OnN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLAorICAgICJJbmNvcnJlY3QgdHlwZSBwYXNzZWQgdG8gZnVuY3Rpb24gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTmFtZS4iKTsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6TmFtZU9mRW51bSgKKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9kZXNjcmlwdG9yKCksIGVudW1fdF92YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9QYXJzZSgKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Q29uc3RTdHJpbmdQYXJhbSBuYW1lLCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCogdmFsdWUpIHsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VOYW1lZEVudW08RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWw+KAorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpOworfQorZW51bSBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgOiBpbnQgeworICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfU1BFRUQgPSAxLAorICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfQ09ERV9TSVpFID0gMiwKKyAgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX0xJVEVfUlVOVElNRSA9IDMKK307CitQUk9UT0JVRl9FWFBPUlQgYm9vbCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfSXNWYWxpZChpbnQgdmFsdWUpOworY29uc3RleHByIEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfT3B0aW1pemVNb2RlX01JTiA9IEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9TUEVFRDsKK2NvbnN0ZXhwciBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX09wdGltaXplTW9kZV9NQVggPSBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfTElURV9SVU5USU1FOworY29uc3RleHByIGludCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfT3B0aW1pemVNb2RlX0FSUkFZU0laRSA9IEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9PcHRpbWl6ZU1vZGVfTUFYICsgMTsKKworUFJPVE9CVUZfRVhQT1JUIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvciogRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3IoKTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9OYW1lKFQgZW51bV90X3ZhbHVlKSB7CisgIHN0YXRpY19hc3NlcnQoOjpzdGQ6OmlzX3NhbWU8VCwgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlPjo6dmFsdWUgfHwKKyAgICA6OnN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLAorICAgICJJbmNvcnJlY3QgdHlwZSBwYXNzZWQgdG8gZnVuY3Rpb24gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX05hbWUuIik7CisgIHJldHVybiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Ok5hbWVPZkVudW0oCisgICAgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3IoKSwgZW51bV90X3ZhbHVlKTsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9QYXJzZSgKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Q29uc3RTdHJpbmdQYXJhbSBuYW1lLCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUqIHZhbHVlKSB7CisgIHJldHVybiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPEZpbGVPcHRpb25zX09wdGltaXplTW9kZT4oCisgICAgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpOworfQorZW51bSBGaWVsZE9wdGlvbnNfQ1R5cGUgOiBpbnQgeworICBGaWVsZE9wdGlvbnNfQ1R5cGVfU1RSSU5HID0gMCwKKyAgRmllbGRPcHRpb25zX0NUeXBlX0NPUkQgPSAxLAorICBGaWVsZE9wdGlvbnNfQ1R5cGVfU1RSSU5HX1BJRUNFID0gMgorfTsKK1BST1RPQlVGX0VYUE9SVCBib29sIEZpZWxkT3B0aW9uc19DVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSk7Citjb25zdGV4cHIgRmllbGRPcHRpb25zX0NUeXBlIEZpZWxkT3B0aW9uc19DVHlwZV9DVHlwZV9NSU4gPSBGaWVsZE9wdGlvbnNfQ1R5cGVfU1RSSU5HOworY29uc3RleHByIEZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnNfQ1R5cGVfQ1R5cGVfTUFYID0gRmllbGRPcHRpb25zX0NUeXBlX1NUUklOR19QSUVDRTsKK2NvbnN0ZXhwciBpbnQgRmllbGRPcHRpb25zX0NUeXBlX0NUeXBlX0FSUkFZU0laRSA9IEZpZWxkT3B0aW9uc19DVHlwZV9DVHlwZV9NQVggKyAxOworCitQUk9UT0JVRl9FWFBPUlQgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yKiBGaWVsZE9wdGlvbnNfQ1R5cGVfZGVzY3JpcHRvcigpOwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmllbGRPcHRpb25zX0NUeXBlX05hbWUoVCBlbnVtX3RfdmFsdWUpIHsKKyAgc3RhdGljX2Fzc2VydCg6OnN0ZDo6aXNfc2FtZTxULCBGaWVsZE9wdGlvbnNfQ1R5cGU+Ojp2YWx1ZSB8fAorICAgIDo6c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsCisgICAgIkluY29ycmVjdCB0eXBlIHBhc3NlZCB0byBmdW5jdGlvbiBGaWVsZE9wdGlvbnNfQ1R5cGVfTmFtZS4iKTsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6TmFtZU9mRW51bSgKKyAgICBGaWVsZE9wdGlvbnNfQ1R5cGVfZGVzY3JpcHRvcigpLCBlbnVtX3RfdmFsdWUpOworfQoraW5saW5lIGJvb2wgRmllbGRPcHRpb25zX0NUeXBlX1BhcnNlKAorICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpDb25zdFN0cmluZ1BhcmFtIG5hbWUsIEZpZWxkT3B0aW9uc19DVHlwZSogdmFsdWUpIHsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VOYW1lZEVudW08RmllbGRPcHRpb25zX0NUeXBlPigKKyAgICBGaWVsZE9wdGlvbnNfQ1R5cGVfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Cit9CitlbnVtIEZpZWxkT3B0aW9uc19KU1R5cGUgOiBpbnQgeworICBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTX05PUk1BTCA9IDAsCisgIEZpZWxkT3B0aW9uc19KU1R5cGVfSlNfU1RSSU5HID0gMSwKKyAgRmllbGRPcHRpb25zX0pTVHlwZV9KU19OVU1CRVIgPSAyCit9OworUFJPVE9CVUZfRVhQT1JUIGJvb2wgRmllbGRPcHRpb25zX0pTVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSk7Citjb25zdGV4cHIgRmllbGRPcHRpb25zX0pTVHlwZSBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTVHlwZV9NSU4gPSBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTX05PUk1BTDsKK2NvbnN0ZXhwciBGaWVsZE9wdGlvbnNfSlNUeXBlIEZpZWxkT3B0aW9uc19KU1R5cGVfSlNUeXBlX01BWCA9IEZpZWxkT3B0aW9uc19KU1R5cGVfSlNfTlVNQkVSOworY29uc3RleHByIGludCBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTVHlwZV9BUlJBWVNJWkUgPSBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTVHlwZV9NQVggKyAxOworCitQUk9UT0JVRl9FWFBPUlQgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yKiBGaWVsZE9wdGlvbnNfSlNUeXBlX2Rlc2NyaXB0b3IoKTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpZWxkT3B0aW9uc19KU1R5cGVfTmFtZShUIGVudW1fdF92YWx1ZSkgeworICBzdGF0aWNfYXNzZXJ0KDo6c3RkOjppc19zYW1lPFQsIEZpZWxkT3B0aW9uc19KU1R5cGU+Ojp2YWx1ZSB8fAorICAgIDo6c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsCisgICAgIkluY29ycmVjdCB0eXBlIHBhc3NlZCB0byBmdW5jdGlvbiBGaWVsZE9wdGlvbnNfSlNUeXBlX05hbWUuIik7CisgIHJldHVybiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Ok5hbWVPZkVudW0oCisgICAgRmllbGRPcHRpb25zX0pTVHlwZV9kZXNjcmlwdG9yKCksIGVudW1fdF92YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnNfSlNUeXBlX1BhcnNlKAorICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpDb25zdFN0cmluZ1BhcmFtIG5hbWUsIEZpZWxkT3B0aW9uc19KU1R5cGUqIHZhbHVlKSB7CisgIHJldHVybiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPEZpZWxkT3B0aW9uc19KU1R5cGU+KAorICAgIEZpZWxkT3B0aW9uc19KU1R5cGVfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Cit9CitlbnVtIE1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbCA6IGludCB7CisgIE1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbF9JREVNUE9URU5DWV9VTktOT1dOID0gMCwKKyAgTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsX05PX1NJREVfRUZGRUNUUyA9IDEsCisgIE1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbF9JREVNUE9URU5UID0gMgorfTsKK1BST1RPQlVGX0VYUE9SVCBib29sIE1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbF9Jc1ZhbGlkKGludCB2YWx1ZSk7Citjb25zdGV4cHIgTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsIE1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbF9JZGVtcG90ZW5jeUxldmVsX01JTiA9IE1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbF9JREVNUE9URU5DWV9VTktOT1dOOworY29uc3RleHByIE1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbCBNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWxfSWRlbXBvdGVuY3lMZXZlbF9NQVggPSBNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWxfSURFTVBPVEVOVDsKK2NvbnN0ZXhwciBpbnQgTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsX0lkZW1wb3RlbmN5TGV2ZWxfQVJSQVlTSVpFID0gTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsX0lkZW1wb3RlbmN5TGV2ZWxfTUFYICsgMTsKKworUFJPVE9CVUZfRVhQT1JUIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvciogTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsX2Rlc2NyaXB0b3IoKTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIE1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbF9OYW1lKFQgZW51bV90X3ZhbHVlKSB7CisgIHN0YXRpY19hc3NlcnQoOjpzdGQ6OmlzX3NhbWU8VCwgTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsPjo6dmFsdWUgfHwKKyAgICA6OnN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLAorICAgICJJbmNvcnJlY3QgdHlwZSBwYXNzZWQgdG8gZnVuY3Rpb24gTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsX05hbWUuIik7CisgIHJldHVybiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Ok5hbWVPZkVudW0oCisgICAgTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsX2Rlc2NyaXB0b3IoKSwgZW51bV90X3ZhbHVlKTsKK30KK2lubGluZSBib29sIE1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbF9QYXJzZSgKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Q29uc3RTdHJpbmdQYXJhbSBuYW1lLCBNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWwqIHZhbHVlKSB7CisgIHJldHVybiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPE1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbD4oCisgICAgTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsX2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpOworfQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRmlsZURlc2NyaXB0b3JTZXQgZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBGaWxlRGVzY3JpcHRvclNldCgpIDogRmlsZURlc2NyaXB0b3JTZXQobnVsbHB0cikge30KKyAgfkZpbGVEZXNjcmlwdG9yU2V0KCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBGaWxlRGVzY3JpcHRvclNldCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIEZpbGVEZXNjcmlwdG9yU2V0KGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKTsKKyAgRmlsZURlc2NyaXB0b3JTZXQoRmlsZURlc2NyaXB0b3JTZXQmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogRmlsZURlc2NyaXB0b3JTZXQoKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBGaWxlRGVzY3JpcHRvclNldCYgb3BlcmF0b3I9KGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBGaWxlRGVzY3JpcHRvclNldCYgb3BlcmF0b3I9KEZpbGVEZXNjcmlwdG9yU2V0JiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKTsKKyAgfQorICBpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBGaWxlRGVzY3JpcHRvclNldCYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gKmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0KiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0Kj4oCisgICAgICAgICAgICAgICAmX0ZpbGVEZXNjcmlwdG9yU2V0X2RlZmF1bHRfaW5zdGFuY2VfKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9CisgICAgMDsKKworICBmcmllbmQgdm9pZCBzd2FwKEZpbGVEZXNjcmlwdG9yU2V0JiBhLCBGaWxlRGVzY3JpcHRvclNldCYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChGaWxlRGVzY3JpcHRvclNldCogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICBHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICAjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdlbmVyaWNTd2FwKHRoaXMsIG90aGVyKTsKKyAgICB9CisgIH0KKyAgdm9pZCBVbnNhZmVBcmVuYVN3YXAoRmlsZURlc2NyaXB0b3JTZXQqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZpbGVEZXNjcmlwdG9yU2V0KiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPEZpbGVEZXNjcmlwdG9yU2V0PihhcmVuYSk7CisgIH0KKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlGcm9tOworICB2b2lkIENvcHlGcm9tKGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKSB7CisgICAgRmlsZURlc2NyaXB0b3JTZXQ6Ok1lcmdlSW1wbCgqdGhpcywgZnJvbSk7CisgIH0KKyAgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgTWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZyk7CisgIHB1YmxpYzoKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IGZpbmFsOworICB2b2lkIEludGVybmFsU3dhcChGaWxlRGVzY3JpcHRvclNldCogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBGaWxlRGVzY3JpcHRvclNldCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXzsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDsKKworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga0ZpbGVGaWVsZE51bWJlciA9IDEsCisgIH07CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBmaWxlID0gMTsKKyAgaW50IGZpbGVfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX2ZpbGVfc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfZmlsZSgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byogbXV0YWJsZV9maWxlKGludCBpbmRleCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9maWxlKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvJiBfaW50ZXJuYWxfZmlsZShpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byogX2ludGVybmFsX2FkZF9maWxlKCk7CisgIHB1YmxpYzoKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIGFkZF9maWxlKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byA+JgorICAgICAgZmlsZSgpIGNvbnN0OworCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byA+IGZpbGVfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRmlsZURlc2NyaXB0b3JQcm90byBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgRmlsZURlc2NyaXB0b3JQcm90bygpIDogRmlsZURlc2NyaXB0b3JQcm90byhudWxscHRyKSB7fQorICB+RmlsZURlc2NyaXB0b3JQcm90bygpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgRmlsZURlc2NyaXB0b3JQcm90byg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8oRmlsZURlc2NyaXB0b3JQcm90byYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBGaWxlRGVzY3JpcHRvclByb3RvKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgRmlsZURlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIEZpbGVEZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShGaWxlRGVzY3JpcHRvclByb3RvJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKTsKKyAgfQorICBpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKj4oCisgICAgICAgICAgICAgICAmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAxOworCisgIGZyaWVuZCB2b2lkIHN3YXAoRmlsZURlc2NyaXB0b3JQcm90byYgYSwgRmlsZURlc2NyaXB0b3JQcm90byYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChGaWxlRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChGaWxlRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGaWxlRGVzY3JpcHRvclByb3RvKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPEZpbGVEZXNjcmlwdG9yUHJvdG8+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKEZpbGVEZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBGaWxlRGVzY3JpcHRvclByb3RvKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrRGVwZW5kZW5jeUZpZWxkTnVtYmVyID0gMywKKyAgICBrTWVzc2FnZVR5cGVGaWVsZE51bWJlciA9IDQsCisgICAga0VudW1UeXBlRmllbGROdW1iZXIgPSA1LAorICAgIGtTZXJ2aWNlRmllbGROdW1iZXIgPSA2LAorICAgIGtFeHRlbnNpb25GaWVsZE51bWJlciA9IDcsCisgICAga1B1YmxpY0RlcGVuZGVuY3lGaWVsZE51bWJlciA9IDEwLAorICAgIGtXZWFrRGVwZW5kZW5jeUZpZWxkTnVtYmVyID0gMTEsCisgICAga05hbWVGaWVsZE51bWJlciA9IDEsCisgICAga1BhY2thZ2VGaWVsZE51bWJlciA9IDIsCisgICAga1N5bnRheEZpZWxkTnVtYmVyID0gMTIsCisgICAga09wdGlvbnNGaWVsZE51bWJlciA9IDgsCisgICAga1NvdXJjZUNvZGVJbmZvRmllbGROdW1iZXIgPSA5LAorICB9OworICAvLyByZXBlYXRlZCBzdHJpbmcgZGVwZW5kZW5jeSA9IDM7CisgIGludCBkZXBlbmRlbmN5X3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9kZXBlbmRlbmN5X3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2RlcGVuZGVuY3koKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGRlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdDsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfZGVwZW5kZW5jeShpbnQgaW5kZXgpOworICB2b2lkIHNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfZGVwZW5kZW5jeShpbnQgaW5kZXgsIHN0ZDo6c3RyaW5nJiYgdmFsdWUpOworICB2b2lkIHNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgc3RkOjpzdHJpbmcqIGFkZF9kZXBlbmRlbmN5KCk7CisgIHZvaWQgYWRkX2RlcGVuZGVuY3koY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBhZGRfZGVwZW5kZW5jeShzdGQ6OnN0cmluZyYmIHZhbHVlKTsKKyAgdm9pZCBhZGRfZGVwZW5kZW5jeShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgYWRkX2RlcGVuZGVuY3koY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+JiBkZXBlbmRlbmN5KCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiogbXV0YWJsZV9kZXBlbmRlbmN5KCk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0OworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX2FkZF9kZXBlbmRlbmN5KCk7CisgIHB1YmxpYzoKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OworICBpbnQgbWVzc2FnZV90eXBlX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9tZXNzYWdlX3R5cGVfc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfbWVzc2FnZV90eXBlKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfbWVzc2FnZV90eXBlKGludCBpbmRleCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvID4qCisgICAgICBtdXRhYmxlX21lc3NhZ2VfdHlwZSgpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvJiBfaW50ZXJuYWxfbWVzc2FnZV90eXBlKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8qIF9pbnRlcm5hbF9hZGRfbWVzc2FnZV90eXBlKCk7CisgIHB1YmxpYzoKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90byYgbWVzc2FnZV90eXBlKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8qIGFkZF9tZXNzYWdlX3R5cGUoKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIG1lc3NhZ2VfdHlwZSgpIGNvbnN0OworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OworICBpbnQgZW51bV90eXBlX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9lbnVtX3R5cGVfc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfZW51bV90eXBlKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX2VudW1fdHlwZShpbnQgaW5kZXgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG8gPioKKyAgICAgIG11dGFibGVfZW51bV90eXBlKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvJiBfaW50ZXJuYWxfZW51bV90eXBlKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvKiBfaW50ZXJuYWxfYWRkX2VudW1fdHlwZSgpOworICBwdWJsaWM6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvJiBlbnVtX3R5cGUoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG8qIGFkZF9lbnVtX3R5cGUoKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvID4mCisgICAgICBlbnVtX3R5cGUoKSBjb25zdDsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2VydmljZSA9IDY7CisgIGludCBzZXJ2aWNlX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9zZXJ2aWNlX3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3NlcnZpY2UoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfc2VydmljZShpbnQgaW5kZXgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPioKKyAgICAgIG11dGFibGVfc2VydmljZSgpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZURlc2NyaXB0b3JQcm90byYgX2ludGVybmFsX3NlcnZpY2UoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIF9pbnRlcm5hbF9hZGRfc2VydmljZSgpOworICBwdWJsaWM6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBzZXJ2aWNlKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBhZGRfc2VydmljZSgpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIHNlcnZpY2UoKSBjb25zdDsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDc7CisgIGludCBleHRlbnNpb25fc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX2V4dGVuc2lvbl9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9leHRlbnNpb24oKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX2V4dGVuc2lvbihpbnQgaW5kZXgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCisgICAgICBtdXRhYmxlX2V4dGVuc2lvbigpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8mIF9pbnRlcm5hbF9leHRlbnNpb24oaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBfaW50ZXJuYWxfYWRkX2V4dGVuc2lvbigpOworICBwdWJsaWM6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byYgZXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byogYWRkX2V4dGVuc2lvbigpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvID4mCisgICAgICBleHRlbnNpb24oKSBjb25zdDsKKworICAvLyByZXBlYXRlZCBpbnQzMiBwdWJsaWNfZGVwZW5kZW5jeSA9IDEwOworICBpbnQgcHVibGljX2RlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX3B1YmxpY19kZXBlbmRlbmN5X3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3B1YmxpY19kZXBlbmRlbmN5KCk7CisgIHByaXZhdGU6CisgIGludDMyX3QgX2ludGVybmFsX3B1YmxpY19kZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3Q7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZEZpZWxkPCBpbnQzMl90ID4mCisgICAgICBfaW50ZXJuYWxfcHVibGljX2RlcGVuZGVuY3koKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfYWRkX3B1YmxpY19kZXBlbmRlbmN5KGludDMyX3QgdmFsdWUpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+KgorICAgICAgX2ludGVybmFsX211dGFibGVfcHVibGljX2RlcGVuZGVuY3koKTsKKyAgcHVibGljOgorICBpbnQzMl90IHB1YmxpY19kZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3Q7CisgIHZvaWQgc2V0X3B1YmxpY19kZXBlbmRlbmN5KGludCBpbmRleCwgaW50MzJfdCB2YWx1ZSk7CisgIHZvaWQgYWRkX3B1YmxpY19kZXBlbmRlbmN5KGludDMyX3QgdmFsdWUpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+JgorICAgICAgcHVibGljX2RlcGVuZGVuY3koKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPioKKyAgICAgIG11dGFibGVfcHVibGljX2RlcGVuZGVuY3koKTsKKworICAvLyByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKKyAgaW50IHdlYWtfZGVwZW5kZW5jeV9zaXplKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGludCBfaW50ZXJuYWxfd2Vha19kZXBlbmRlbmN5X3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3dlYWtfZGVwZW5kZW5jeSgpOworICBwcml2YXRlOgorICBpbnQzMl90IF9pbnRlcm5hbF93ZWFrX2RlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdDsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPiYKKyAgICAgIF9pbnRlcm5hbF93ZWFrX2RlcGVuZGVuY3koKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfYWRkX3dlYWtfZGVwZW5kZW5jeShpbnQzMl90IHZhbHVlKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPioKKyAgICAgIF9pbnRlcm5hbF9tdXRhYmxlX3dlYWtfZGVwZW5kZW5jeSgpOworICBwdWJsaWM6CisgIGludDMyX3Qgd2Vha19kZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3Q7CisgIHZvaWQgc2V0X3dlYWtfZGVwZW5kZW5jeShpbnQgaW5kZXgsIGludDMyX3QgdmFsdWUpOworICB2b2lkIGFkZF93ZWFrX2RlcGVuZGVuY3koaW50MzJfdCB2YWx1ZSk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZEZpZWxkPCBpbnQzMl90ID4mCisgICAgICB3ZWFrX2RlcGVuZGVuY3koKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPioKKyAgICAgIG11dGFibGVfd2Vha19kZXBlbmRlbmN5KCk7CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBib29sIGhhc19uYW1lKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19uYW1lKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9uYW1lKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX25hbWUoc3RkOjpzdHJpbmcqIG5hbWUpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX25hbWUoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMjsKKyAgYm9vbCBoYXNfcGFja2FnZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfcGFja2FnZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfcGFja2FnZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X3BhY2thZ2UoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9wYWNrYWdlKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9wYWNrYWdlKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9wYWNrYWdlKHN0ZDo6c3RyaW5nKiBwYWNrYWdlKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9wYWNrYWdlKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9wYWNrYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9wYWNrYWdlKCk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBzdHJpbmcgc3ludGF4ID0gMTI7CisgIGJvb2wgaGFzX3N5bnRheCgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfc3ludGF4KCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9zeW50YXgoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHN5bnRheCgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X3N5bnRheChBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX3N5bnRheCgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2Vfc3ludGF4KCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9zeW50YXgoc3RkOjpzdHJpbmcqIHN5bnRheCk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfc3ludGF4KCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9zeW50YXgoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX3N5bnRheCgpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyBvcHRpb25zID0gODsKKyAgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfb3B0aW9ucygpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfb3B0aW9ucygpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucyogcmVsZWFzZV9vcHRpb25zKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucyogb3B0aW9ucyk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucyYgX2ludGVybmFsX29wdGlvbnMoKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVPcHRpb25zKiBfaW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCk7CisgIHB1YmxpYzoKKyAgdm9pZCB1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF9vcHRpb25zKAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVPcHRpb25zKiBvcHRpb25zKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVPcHRpb25zKiB1bnNhZmVfYXJlbmFfcmVsZWFzZV9vcHRpb25zKCk7CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbyBzb3VyY2VfY29kZV9pbmZvID0gOTsKKyAgYm9vbCBoYXNfc291cmNlX2NvZGVfaW5mbygpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfc291cmNlX2NvZGVfaW5mbygpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfc291cmNlX2NvZGVfaW5mbygpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm8mIHNvdXJjZV9jb2RlX2luZm8oKSBjb25zdDsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbyogcmVsZWFzZV9zb3VyY2VfY29kZV9pbmZvKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbyogbXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9zb3VyY2VfY29kZV9pbmZvKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbyogc291cmNlX2NvZGVfaW5mbyk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbyYgX2ludGVybmFsX3NvdXJjZV9jb2RlX2luZm8oKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvZGVJbmZvKiBfaW50ZXJuYWxfbXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCk7CisgIHB1YmxpYzoKKyAgdm9pZCB1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF9zb3VyY2VfY29kZV9pbmZvKAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvZGVJbmZvKiBzb3VyY2VfY29kZV9pbmZvKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvZGVJbmZvKiB1bnNhZmVfYXJlbmFfcmVsZWFzZV9zb3VyY2VfY29kZV9pbmZvKCk7CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Okhhc0JpdHM8MT4gX2hhc19iaXRzXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBkZXBlbmRlbmN5XzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90byA+IG1lc3NhZ2VfdHlwZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvID4gZW51bV90eXBlXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPiBzZXJ2aWNlXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvID4gZXh0ZW5zaW9uXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+IHB1YmxpY19kZXBlbmRlbmN5XzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+IHdlYWtfZGVwZW5kZW5jeV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHBhY2thZ2VfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgc3ludGF4XzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMqIG9wdGlvbnNfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbyogc291cmNlX2NvZGVfaW5mb187CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSgpIDogRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKG51bGxwdHIpIHt9CisgIH5EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZShjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGZyb20pOworICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSgpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgb3BlcmF0b3I9KGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBvcGVyYXRvcj0oRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKTsKKyAgfQorICBpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKj4oCisgICAgICAgICAgICAgICAmX0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDI7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGEsIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZT4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBmcm9tKSB7CisgICAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtPcHRpb25zRmllbGROdW1iZXIgPSAzLAorICAgIGtTdGFydEZpZWxkTnVtYmVyID0gMSwKKyAgICBrRW5kRmllbGROdW1iZXIgPSAyLAorICB9OworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfb3B0aW9ucygpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfb3B0aW9ucygpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisgIFBST1RPQlVGX05PRElTQ0FSRCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkV4dGVuc2lvblJhbmdlT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFeHRlbnNpb25SYW5nZU9wdGlvbnMqIG9wdGlvbnMpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zJiBfaW50ZXJuYWxfb3B0aW9ucygpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zKiBfaW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCk7CisgIHB1YmxpYzoKKyAgdm9pZCB1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF9vcHRpb25zKAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkV4dGVuc2lvblJhbmdlT3B0aW9ucyogb3B0aW9ucyk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFeHRlbnNpb25SYW5nZU9wdGlvbnMqIHVuc2FmZV9hcmVuYV9yZWxlYXNlX29wdGlvbnMoKTsKKworICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7CisgIGJvb2wgaGFzX3N0YXJ0KCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19zdGFydCgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfc3RhcnQoKTsKKyAgaW50MzJfdCBzdGFydCgpIGNvbnN0OworICB2b2lkIHNldF9zdGFydChpbnQzMl90IHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgaW50MzJfdCBfaW50ZXJuYWxfc3RhcnQoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X3N0YXJ0KGludDMyX3QgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKKyAgYm9vbCBoYXNfZW5kKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19lbmQoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2VuZCgpOworICBpbnQzMl90IGVuZCgpIGNvbnN0OworICB2b2lkIHNldF9lbmQoaW50MzJfdCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGludDMyX3QgX2ludGVybmFsX2VuZCgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfZW5kKGludDMyX3QgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6SGFzQml0czwxPiBfaGFzX2JpdHNfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkV4dGVuc2lvblJhbmdlT3B0aW9ucyogb3B0aW9uc187CisgICAgaW50MzJfdCBzdGFydF87CisgICAgaW50MzJfdCBlbmRfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UoKSA6IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKG51bGxwdHIpIHt9CisgIH5EZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSgpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZShjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgZnJvbSk7CisgIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIG9wZXJhdG9yPShjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIG9wZXJhdG9yPShEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSk7CisgIH0KKyAgaW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSo+KAorICAgICAgICAgICAgICAgJl9EZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZV9kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDM7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgYSwgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZT4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgZnJvbSkgeworICAgIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UiOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtTdGFydEZpZWxkTnVtYmVyID0gMSwKKyAgICBrRW5kRmllbGROdW1iZXIgPSAyLAorICB9OworICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7CisgIGJvb2wgaGFzX3N0YXJ0KCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19zdGFydCgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfc3RhcnQoKTsKKyAgaW50MzJfdCBzdGFydCgpIGNvbnN0OworICB2b2lkIHNldF9zdGFydChpbnQzMl90IHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgaW50MzJfdCBfaW50ZXJuYWxfc3RhcnQoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X3N0YXJ0KGludDMyX3QgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKKyAgYm9vbCBoYXNfZW5kKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19lbmQoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2VuZCgpOworICBpbnQzMl90IGVuZCgpIGNvbnN0OworICB2b2lkIHNldF9lbmQoaW50MzJfdCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGludDMyX3QgX2ludGVybmFsX2VuZCgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfZW5kKGludDMyX3QgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpIYXNCaXRzPDE+IF9oYXNfYml0c187CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgICBpbnQzMl90IHN0YXJ0XzsKKyAgICBpbnQzMl90IGVuZF87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRGVzY3JpcHRvclByb3RvIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIERlc2NyaXB0b3JQcm90bygpIDogRGVzY3JpcHRvclByb3RvKG51bGxwdHIpIHt9CisgIH5EZXNjcmlwdG9yUHJvdG8oKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIERlc2NyaXB0b3JQcm90byg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIERlc2NyaXB0b3JQcm90byhjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICBEZXNjcmlwdG9yUHJvdG8oRGVzY3JpcHRvclByb3RvJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IERlc2NyaXB0b3JQcm90bygpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIERlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KGNvbnN0IERlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oRGVzY3JpcHRvclByb3RvJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKTsKKyAgfQorICBpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBEZXNjcmlwdG9yUHJvdG8qIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRGVzY3JpcHRvclByb3RvKj4oCisgICAgICAgICAgICAgICAmX0Rlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDQ7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChEZXNjcmlwdG9yUHJvdG8mIGEsIERlc2NyaXB0b3JQcm90byYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChEZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKERlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRGVzY3JpcHRvclByb3RvKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPERlc2NyaXB0b3JQcm90bz4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgICAgRGVzY3JpcHRvclByb3RvOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoRGVzY3JpcHRvclByb3RvKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBEZXNjcmlwdG9yUHJvdG8oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB0eXBlZGVmIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSBFeHRlbnNpb25SYW5nZTsKKyAgdHlwZWRlZiBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSBSZXNlcnZlZFJhbmdlOworCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga0ZpZWxkRmllbGROdW1iZXIgPSAyLAorICAgIGtOZXN0ZWRUeXBlRmllbGROdW1iZXIgPSAzLAorICAgIGtFbnVtVHlwZUZpZWxkTnVtYmVyID0gNCwKKyAgICBrRXh0ZW5zaW9uUmFuZ2VGaWVsZE51bWJlciA9IDUsCisgICAga0V4dGVuc2lvbkZpZWxkTnVtYmVyID0gNiwKKyAgICBrT25lb2ZEZWNsRmllbGROdW1iZXIgPSA4LAorICAgIGtSZXNlcnZlZFJhbmdlRmllbGROdW1iZXIgPSA5LAorICAgIGtSZXNlcnZlZE5hbWVGaWVsZE51bWJlciA9IDEwLAorICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtPcHRpb25zRmllbGROdW1iZXIgPSA3LAorICB9OworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGZpZWxkID0gMjsKKyAgaW50IGZpZWxkX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9maWVsZF9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9maWVsZCgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfZmllbGQoaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9maWVsZCgpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8mIF9pbnRlcm5hbF9maWVsZChpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8qIF9pbnRlcm5hbF9hZGRfZmllbGQoKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byogYWRkX2ZpZWxkKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIGZpZWxkKCkgY29uc3Q7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbmVzdGVkX3R5cGUgPSAzOworICBpbnQgbmVzdGVkX3R5cGVfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX25lc3RlZF90eXBlX3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX25lc3RlZF90eXBlKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfbmVzdGVkX3R5cGUoaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8gPioKKyAgICAgIG11dGFibGVfbmVzdGVkX3R5cGUoKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90byYgX2ludGVybmFsX25lc3RlZF90eXBlKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8qIF9pbnRlcm5hbF9hZGRfbmVzdGVkX3R5cGUoKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvJiBuZXN0ZWRfdHlwZShpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvKiBhZGRfbmVzdGVkX3R5cGUoKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIG5lc3RlZF90eXBlKCkgY29uc3Q7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDQ7CisgIGludCBlbnVtX3R5cGVfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX2VudW1fdHlwZV9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9lbnVtX3R5cGUoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfZW51bV90eXBlKGludCBpbmRleCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9lbnVtX3R5cGUoKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG8mIF9pbnRlcm5hbF9lbnVtX3R5cGUoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG8qIF9pbnRlcm5hbF9hZGRfZW51bV90eXBlKCk7CisgIHB1YmxpYzoKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG8mIGVudW1fdHlwZShpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90byogYWRkX2VudW1fdHlwZSgpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIGVudW1fdHlwZSgpIGNvbnN0OworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7CisgIGludCBleHRlbnNpb25fcmFuZ2Vfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX2V4dGVuc2lvbl9yYW5nZV9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9leHRlbnNpb25fcmFuZ2UoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogbXV0YWJsZV9leHRlbnNpb25fcmFuZ2UoaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgPioKKyAgICAgIG11dGFibGVfZXh0ZW5zaW9uX3JhbmdlKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIF9pbnRlcm5hbF9leHRlbnNpb25fcmFuZ2UoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogX2ludGVybmFsX2FkZF9leHRlbnNpb25fcmFuZ2UoKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBleHRlbnNpb25fcmFuZ2UoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogYWRkX2V4dGVuc2lvbl9yYW5nZSgpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSA+JgorICAgICAgZXh0ZW5zaW9uX3JhbmdlKCkgY29uc3Q7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA2OworICBpbnQgZXh0ZW5zaW9uX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9leHRlbnNpb25fc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfZXh0ZW5zaW9uKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byogbXV0YWJsZV9leHRlbnNpb24oaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9leHRlbnNpb24oKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvJiBfaW50ZXJuYWxfZXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byogX2ludGVybmFsX2FkZF9leHRlbnNpb24oKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8mIGV4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8qIGFkZF9leHRlbnNpb24oKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byA+JgorICAgICAgZXh0ZW5zaW9uKCkgY29uc3Q7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90byBvbmVvZl9kZWNsID0gODsKKyAgaW50IG9uZW9mX2RlY2xfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX29uZW9mX2RlY2xfc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfb25lb2ZfZGVjbCgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfb25lb2ZfZGVjbChpbnQgaW5kZXgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mRGVzY3JpcHRvclByb3RvID4qCisgICAgICBtdXRhYmxlX29uZW9mX2RlY2woKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mRGVzY3JpcHRvclByb3RvJiBfaW50ZXJuYWxfb25lb2ZfZGVjbChpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZEZXNjcmlwdG9yUHJvdG8qIF9pbnRlcm5hbF9hZGRfb25lb2ZfZGVjbCgpOworICBwdWJsaWM6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZkRlc2NyaXB0b3JQcm90byYgb25lb2ZfZGVjbChpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZEZXNjcmlwdG9yUHJvdG8qIGFkZF9vbmVvZl9kZWNsKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZEZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIG9uZW9mX2RlY2woKSBjb25zdDsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlIHJlc2VydmVkX3JhbmdlID0gOTsKKyAgaW50IHJlc2VydmVkX3JhbmdlX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9yZXNlcnZlZF9yYW5nZV9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9yZXNlcnZlZF9yYW5nZSgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIG11dGFibGVfcmVzZXJ2ZWRfcmFuZ2UoaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSA+KgorICAgICAgbXV0YWJsZV9yZXNlcnZlZF9yYW5nZSgpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIF9pbnRlcm5hbF9yZXNlcnZlZF9yYW5nZShpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIF9pbnRlcm5hbF9hZGRfcmVzZXJ2ZWRfcmFuZ2UoKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIHJlc2VydmVkX3JhbmdlKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogYWRkX3Jlc2VydmVkX3JhbmdlKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UgPiYKKyAgICAgIHJlc2VydmVkX3JhbmdlKCkgY29uc3Q7CisKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIHJlc2VydmVkX25hbWUgPSAxMDsKKyAgaW50IHJlc2VydmVkX25hbWVfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX3Jlc2VydmVkX25hbWVfc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfcmVzZXJ2ZWRfbmFtZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgpIGNvbnN0OworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9yZXNlcnZlZF9uYW1lKGludCBpbmRleCk7CisgIHZvaWQgc2V0X3Jlc2VydmVkX25hbWUoaW50IGluZGV4LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9yZXNlcnZlZF9uYW1lKGludCBpbmRleCwgc3RkOjpzdHJpbmcmJiB2YWx1ZSk7CisgIHZvaWQgc2V0X3Jlc2VydmVkX25hbWUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X3Jlc2VydmVkX25hbWUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBzdGQ6OnN0cmluZyogYWRkX3Jlc2VydmVkX25hbWUoKTsKKyAgdm9pZCBhZGRfcmVzZXJ2ZWRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIGFkZF9yZXNlcnZlZF9uYW1lKHN0ZDo6c3RyaW5nJiYgdmFsdWUpOworICB2b2lkIGFkZF9yZXNlcnZlZF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBhZGRfcmVzZXJ2ZWRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4mIHJlc2VydmVkX25hbWUoKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KiBtdXRhYmxlX3Jlc2VydmVkX25hbWUoKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9yZXNlcnZlZF9uYW1lKGludCBpbmRleCkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfYWRkX3Jlc2VydmVkX25hbWUoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfbmFtZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfbmFtZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X25hbWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9uYW1lKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIG9wdGlvbnMgPSA3OworICBib29sIGhhc19vcHRpb25zKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19vcHRpb25zKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9vcHRpb25zKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworICBQUk9UT0JVRl9OT0RJU0NBUkQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zKiBvcHRpb25zKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zJiBfaW50ZXJuYWxfb3B0aW9ucygpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZU9wdGlvbnMqIF9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKTsKKyAgcHVibGljOgorICB2b2lkIHVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkX29wdGlvbnMoCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZU9wdGlvbnMqIG9wdGlvbnMpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZU9wdGlvbnMqIHVuc2FmZV9hcmVuYV9yZWxlYXNlX29wdGlvbnMoKTsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpIYXNCaXRzPDE+IF9oYXNfYml0c187CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvID4gZmllbGRfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvID4gbmVzdGVkX3R5cGVfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90byA+IGVudW1fdHlwZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgPiBleHRlbnNpb25fcmFuZ2VfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiBleHRlbnNpb25fOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZEZXNjcmlwdG9yUHJvdG8gPiBvbmVvZl9kZWNsXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlID4gcmVzZXJ2ZWRfcmFuZ2VfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiByZXNlcnZlZF9uYW1lXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIG5hbWVfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlT3B0aW9ucyogb3B0aW9uc187CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucykgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIEV4dGVuc2lvblJhbmdlT3B0aW9ucygpIDogRXh0ZW5zaW9uUmFuZ2VPcHRpb25zKG51bGxwdHIpIHt9CisgIH5FeHRlbnNpb25SYW5nZU9wdGlvbnMoKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIEV4dGVuc2lvblJhbmdlT3B0aW9ucyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIEV4dGVuc2lvblJhbmdlT3B0aW9ucyhjb25zdCBFeHRlbnNpb25SYW5nZU9wdGlvbnMmIGZyb20pOworICBFeHRlbnNpb25SYW5nZU9wdGlvbnMoRXh0ZW5zaW9uUmFuZ2VPcHRpb25zJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IEV4dGVuc2lvblJhbmdlT3B0aW9ucygpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIEV4dGVuc2lvblJhbmdlT3B0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IEV4dGVuc2lvblJhbmdlT3B0aW9ucyYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zJiBvcGVyYXRvcj0oRXh0ZW5zaW9uUmFuZ2VPcHRpb25zJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKTsKKyAgfQorICBpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBFeHRlbnNpb25SYW5nZU9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBFeHRlbnNpb25SYW5nZU9wdGlvbnMqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zKj4oCisgICAgICAgICAgICAgICAmX0V4dGVuc2lvblJhbmdlT3B0aW9uc19kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDU7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChFeHRlbnNpb25SYW5nZU9wdGlvbnMmIGEsIEV4dGVuc2lvblJhbmdlT3B0aW9ucyYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChFeHRlbnNpb25SYW5nZU9wdGlvbnMqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKEV4dGVuc2lvblJhbmdlT3B0aW9ucyogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPEV4dGVuc2lvblJhbmdlT3B0aW9ucz4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBFeHRlbnNpb25SYW5nZU9wdGlvbnMmIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zJiBmcm9tKSB7CisgICAgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoRXh0ZW5zaW9uUmFuZ2VPcHRpb25zKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucyI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBFeHRlbnNpb25SYW5nZU9wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTksCisgIH07CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgaW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKKyAgICAgIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIF9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogX2ludGVybmFsX2FkZF91bmludGVycHJldGVkX29wdGlvbigpOworICBwdWJsaWM6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKKworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgYm9vbCBIYXNFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9pbXBsXy5fZXh0ZW5zaW9uc18uSGFzKGlkLm51bWJlcigpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBDbGVhckV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFeHRlbnNpb25SYW5nZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisgICAgX2ltcGxfLl9leHRlbnNpb25zXy5DbGVhckV4dGVuc2lvbihpZC5udW1iZXIoKSk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgaW50IEV4dGVuc2lvblNpemUoCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9pbXBsXy5fZXh0ZW5zaW9uc18uRXh0ZW5zaW9uU2l6ZShpZC5udW1iZXIoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6Q29uc3RUeXBlIEdldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFeHRlbnNpb25SYW5nZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkdldChpZC5udW1iZXIoKSwgX2ltcGxfLl9leHRlbnNpb25zXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC5kZWZhdWx0X3ZhbHVlKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFeHRlbnNpb25SYW5nZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpDb25zdFR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6U2V0KGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgdmFsdWUsICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEFsbG9jYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFeHRlbnNpb25SYW5nZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXRBbGxvY2F0ZWQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBVbnNhZmVBcmVuYVNldEFsbG9jYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFeHRlbnNpb25SYW5nZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpVbnNhZmVBcmVuYVNldEFsbG9jYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgUFJPVE9CVUZfTk9ESVNDQVJEIGlubGluZQorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZQorICAgICAgUmVsZWFzZUV4dGVuc2lvbigKKyAgICAgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgICAgIEV4dGVuc2lvblJhbmdlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6UmVsZWFzZShpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUKKyAgVW5zYWZlQXJlbmFSZWxlYXNlRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEV4dGVuc2lvblJhbmdlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6VW5zYWZlQXJlbmFSZWxlYXNlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6Q29uc3RUeXBlIEdldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFeHRlbnNpb25SYW5nZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgaW50IGluZGV4KSBjb25zdCB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkdldChpZC5udW1iZXIoKSwgX2ltcGxfLl9leHRlbnNpb25zXywgaW5kZXgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIGludCBpbmRleCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBpbmRleCwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFeHRlbnNpb25SYW5nZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgaW50IGluZGV4LCB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OkNvbnN0VHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXQoaWQubnVtYmVyKCksIGluZGV4LCB2YWx1ZSwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6TXV0YWJsZVR5cGUgQWRkRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEV4dGVuc2lvblJhbmdlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKyAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIHRvX2FkZCA9CisgICAgICAgIF9wcm90b19UeXBlVHJhaXRzOjpBZGQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgICByZXR1cm4gdG9fYWRkOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIEFkZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFeHRlbnNpb25SYW5nZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6QWRkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpSZXBlYXRlZEZpZWxkVHlwZSYKKyAgR2V0UmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXRSZXBlYXRlZChpZC5udW1iZXIoKSwgX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6UmVwZWF0ZWRGaWVsZFR5cGUqCisgIE11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFeHRlbnNpb25SYW5nZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGVSZXBlYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lzX3BhY2tlZCwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0IF9leHRlbnNpb25zXzsKKworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEZpZWxkRGVzY3JpcHRvclByb3RvIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgRmllbGREZXNjcmlwdG9yUHJvdG8oKSA6IEZpZWxkRGVzY3JpcHRvclByb3RvKG51bGxwdHIpIHt9CisgIH5GaWVsZERlc2NyaXB0b3JQcm90bygpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgRmllbGREZXNjcmlwdG9yUHJvdG8oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBGaWVsZERlc2NyaXB0b3JQcm90byhjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKEZpZWxkRGVzY3JpcHRvclByb3RvJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IEZpZWxkRGVzY3JpcHRvclByb3RvKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgRmllbGREZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgRmllbGREZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShGaWVsZERlc2NyaXB0b3JQcm90byYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSk7CisgIH0KKyAgaW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byo+KAorICAgICAgICAgICAgICAgJl9GaWVsZERlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDY7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChGaWVsZERlc2NyaXB0b3JQcm90byYgYSwgRmllbGREZXNjcmlwdG9yUHJvdG8mIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoRmllbGREZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKEZpZWxkRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGaWVsZERlc2NyaXB0b3JQcm90byogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxGaWVsZERlc2NyaXB0b3JQcm90bz4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoRmllbGREZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8iOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgRmllbGREZXNjcmlwdG9yUHJvdG8oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgVHlwZTsKKyAgc3RhdGljIGNvbnN0ZXhwciBUeXBlIFRZUEVfRE9VQkxFID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRE9VQkxFOworICBzdGF0aWMgY29uc3RleHByIFR5cGUgVFlQRV9GTE9BVCA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZMT0FUOworICBzdGF0aWMgY29uc3RleHByIFR5cGUgVFlQRV9JTlQ2NCA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0lOVDY0OworICBzdGF0aWMgY29uc3RleHByIFR5cGUgVFlQRV9VSU5UNjQgPQorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9VSU5UNjQ7CisgIHN0YXRpYyBjb25zdGV4cHIgVHlwZSBUWVBFX0lOVDMyID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfSU5UMzI7CisgIHN0YXRpYyBjb25zdGV4cHIgVHlwZSBUWVBFX0ZJWEVENjQgPQorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GSVhFRDY0OworICBzdGF0aWMgY29uc3RleHByIFR5cGUgVFlQRV9GSVhFRDMyID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRklYRUQzMjsKKyAgc3RhdGljIGNvbnN0ZXhwciBUeXBlIFRZUEVfQk9PTCA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0JPT0w7CisgIHN0YXRpYyBjb25zdGV4cHIgVHlwZSBUWVBFX1NUUklORyA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NUUklORzsKKyAgc3RhdGljIGNvbnN0ZXhwciBUeXBlIFRZUEVfR1JPVVAgPQorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9HUk9VUDsKKyAgc3RhdGljIGNvbnN0ZXhwciBUeXBlIFRZUEVfTUVTU0FHRSA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX01FU1NBR0U7CisgIHN0YXRpYyBjb25zdGV4cHIgVHlwZSBUWVBFX0JZVEVTID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfQllURVM7CisgIHN0YXRpYyBjb25zdGV4cHIgVHlwZSBUWVBFX1VJTlQzMiA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1VJTlQzMjsKKyAgc3RhdGljIGNvbnN0ZXhwciBUeXBlIFRZUEVfRU5VTSA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0VOVU07CisgIHN0YXRpYyBjb25zdGV4cHIgVHlwZSBUWVBFX1NGSVhFRDMyID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0ZJWEVEMzI7CisgIHN0YXRpYyBjb25zdGV4cHIgVHlwZSBUWVBFX1NGSVhFRDY0ID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0ZJWEVENjQ7CisgIHN0YXRpYyBjb25zdGV4cHIgVHlwZSBUWVBFX1NJTlQzMiA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NJTlQzMjsKKyAgc3RhdGljIGNvbnN0ZXhwciBUeXBlIFRZUEVfU0lOVDY0ID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0lOVDY0OworICBzdGF0aWMgaW5saW5lIGJvb2wgVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICAgIHJldHVybiBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX0lzVmFsaWQodmFsdWUpOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgVHlwZSBUeXBlX01JTiA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UeXBlX01JTjsKKyAgc3RhdGljIGNvbnN0ZXhwciBUeXBlIFR5cGVfTUFYID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1R5cGVfTUFYOworICBzdGF0aWMgY29uc3RleHByIGludCBUeXBlX0FSUkFZU0laRSA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UeXBlX0FSUkFZU0laRTsKKyAgc3RhdGljIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3IqCisgIFR5cGVfZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9kZXNjcmlwdG9yKCk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgc3RhdGljIGlubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgVHlwZV9OYW1lKFQgZW51bV90X3ZhbHVlKSB7CisgICAgc3RhdGljX2Fzc2VydCg6OnN0ZDo6aXNfc2FtZTxULCBUeXBlPjo6dmFsdWUgfHwKKyAgICAgIDo6c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsCisgICAgICAiSW5jb3JyZWN0IHR5cGUgcGFzc2VkIHRvIGZ1bmN0aW9uIFR5cGVfTmFtZS4iKTsKKyAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9OYW1lKGVudW1fdF92YWx1ZSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIFR5cGVfUGFyc2UoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkNvbnN0U3RyaW5nUGFyYW0gbmFtZSwKKyAgICAgIFR5cGUqIHZhbHVlKSB7CisgICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfUGFyc2UobmFtZSwgdmFsdWUpOworICB9CisKKyAgdHlwZWRlZiBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBMYWJlbDsKKyAgc3RhdGljIGNvbnN0ZXhwciBMYWJlbCBMQUJFTF9PUFRJT05BTCA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxfT1BUSU9OQUw7CisgIHN0YXRpYyBjb25zdGV4cHIgTGFiZWwgTEFCRUxfUkVRVUlSRUQgPQorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX1JFUVVJUkVEOworICBzdGF0aWMgY29uc3RleHByIExhYmVsIExBQkVMX1JFUEVBVEVEID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9SRVBFQVRFRDsKKyAgc3RhdGljIGlubGluZSBib29sIExhYmVsX0lzVmFsaWQoaW50IHZhbHVlKSB7CisgICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0lzVmFsaWQodmFsdWUpOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgTGFiZWwgTGFiZWxfTUlOID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MYWJlbF9NSU47CisgIHN0YXRpYyBjb25zdGV4cHIgTGFiZWwgTGFiZWxfTUFYID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MYWJlbF9NQVg7CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IExhYmVsX0FSUkFZU0laRSA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTGFiZWxfQVJSQVlTSVpFOworICBzdGF0aWMgaW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvcioKKyAgTGFiZWxfZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcigpOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIExhYmVsX05hbWUoVCBlbnVtX3RfdmFsdWUpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KDo6c3RkOjppc19zYW1lPFQsIExhYmVsPjo6dmFsdWUgfHwKKyAgICAgIDo6c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsCisgICAgICAiSW5jb3JyZWN0IHR5cGUgcGFzc2VkIHRvIGZ1bmN0aW9uIExhYmVsX05hbWUuIik7CisgICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX05hbWUoZW51bV90X3ZhbHVlKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgTGFiZWxfUGFyc2UoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkNvbnN0U3RyaW5nUGFyYW0gbmFtZSwKKyAgICAgIExhYmVsKiB2YWx1ZSkgeworICAgIHJldHVybiBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9QYXJzZShuYW1lLCB2YWx1ZSk7CisgIH0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtFeHRlbmRlZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrVHlwZU5hbWVGaWVsZE51bWJlciA9IDYsCisgICAga0RlZmF1bHRWYWx1ZUZpZWxkTnVtYmVyID0gNywKKyAgICBrSnNvbk5hbWVGaWVsZE51bWJlciA9IDEwLAorICAgIGtPcHRpb25zRmllbGROdW1iZXIgPSA4LAorICAgIGtOdW1iZXJGaWVsZE51bWJlciA9IDMsCisgICAga09uZW9mSW5kZXhGaWVsZE51bWJlciA9IDksCisgICAga1Byb3RvM09wdGlvbmFsRmllbGROdW1iZXIgPSAxNywKKyAgICBrTGFiZWxGaWVsZE51bWJlciA9IDQsCisgICAga1R5cGVGaWVsZE51bWJlciA9IDUsCisgIH07CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfbmFtZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfbmFtZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X25hbWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9uYW1lKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBzdHJpbmcgZXh0ZW5kZWUgPSAyOworICBib29sIGhhc19leHRlbmRlZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfZXh0ZW5kZWUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2V4dGVuZGVlKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHRlbmRlZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X2V4dGVuZGVlKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfZXh0ZW5kZWUoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX2V4dGVuZGVlKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9leHRlbmRlZShzdGQ6OnN0cmluZyogZXh0ZW5kZWUpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX2V4dGVuZGVlKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9leHRlbmRlZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfZXh0ZW5kZWUoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OworICBib29sIGhhc190eXBlX25hbWUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX3R5cGVfbmFtZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfdHlwZV9uYW1lKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlX25hbWUoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF90eXBlX25hbWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV90eXBlX25hbWUoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX3R5cGVfbmFtZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfdHlwZV9uYW1lKHN0ZDo6c3RyaW5nKiB0eXBlX25hbWUpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX3R5cGVfbmFtZSgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfdHlwZV9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV90eXBlX25hbWUoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gNzsKKyAgYm9vbCBoYXNfZGVmYXVsdF92YWx1ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfZGVmYXVsdF92YWx1ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfZGVmYXVsdF92YWx1ZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgZGVmYXVsdF92YWx1ZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X2RlZmF1bHRfdmFsdWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9kZWZhdWx0X3ZhbHVlKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9kZWZhdWx0X3ZhbHVlKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9kZWZhdWx0X3ZhbHVlKHN0ZDo6c3RyaW5nKiBkZWZhdWx0X3ZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9kZWZhdWx0X3ZhbHVlKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9kZWZhdWx0X3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9kZWZhdWx0X3ZhbHVlKCk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBzdHJpbmcganNvbl9uYW1lID0gMTA7CisgIGJvb2wgaGFzX2pzb25fbmFtZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfanNvbl9uYW1lKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9qc29uX25hbWUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25fbmFtZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X2pzb25fbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX2pzb25fbmFtZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2VfanNvbl9uYW1lKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9qc29uX25hbWUoc3RkOjpzdHJpbmcqIGpzb25fbmFtZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfanNvbl9uYW1lKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9qc29uX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX2pzb25fbmFtZSgpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgb3B0aW9ucyA9IDg7CisgIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX29wdGlvbnMoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX29wdGlvbnMoKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworICBQUk9UT0JVRl9OT0RJU0NBUkQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucyogcmVsZWFzZV9vcHRpb25zKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnMqIG11dGFibGVfb3B0aW9ucygpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zKiBvcHRpb25zKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucyYgX2ludGVybmFsX29wdGlvbnMoKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucyogX2ludGVybmFsX211dGFibGVfb3B0aW9ucygpOworICBwdWJsaWM6CisgIHZvaWQgdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfb3B0aW9ucygKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnMqIG9wdGlvbnMpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zKiB1bnNhZmVfYXJlbmFfcmVsZWFzZV9vcHRpb25zKCk7CisKKyAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMzsKKyAgYm9vbCBoYXNfbnVtYmVyKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19udW1iZXIoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX251bWJlcigpOworICBpbnQzMl90IG51bWJlcigpIGNvbnN0OworICB2b2lkIHNldF9udW1iZXIoaW50MzJfdCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGludDMyX3QgX2ludGVybmFsX251bWJlcigpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfbnVtYmVyKGludDMyX3QgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgaW50MzIgb25lb2ZfaW5kZXggPSA5OworICBib29sIGhhc19vbmVvZl9pbmRleCgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfb25lb2ZfaW5kZXgoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX29uZW9mX2luZGV4KCk7CisgIGludDMyX3Qgb25lb2ZfaW5kZXgoKSBjb25zdDsKKyAgdm9pZCBzZXRfb25lb2ZfaW5kZXgoaW50MzJfdCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGludDMyX3QgX2ludGVybmFsX29uZW9mX2luZGV4KCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9vbmVvZl9pbmRleChpbnQzMl90IHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIGJvb2wgcHJvdG8zX29wdGlvbmFsID0gMTc7CisgIGJvb2wgaGFzX3Byb3RvM19vcHRpb25hbCgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfcHJvdG8zX29wdGlvbmFsKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9wcm90bzNfb3B0aW9uYWwoKTsKKyAgYm9vbCBwcm90bzNfb3B0aW9uYWwoKSBjb25zdDsKKyAgdm9pZCBzZXRfcHJvdG8zX29wdGlvbmFsKGJvb2wgdmFsdWUpOworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9wcm90bzNfb3B0aW9uYWwoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X3Byb3RvM19vcHRpb25hbChib29sIHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwgbGFiZWwgPSA0OworICBib29sIGhhc19sYWJlbCgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfbGFiZWwoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2xhYmVsKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBsYWJlbCgpIGNvbnN0OworICB2b2lkIHNldF9sYWJlbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgdmFsdWUpOworICBwcml2YXRlOgorICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgX2ludGVybmFsX2xhYmVsKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9sYWJlbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHR5cGUgPSA1OworICBib29sIGhhc190eXBlKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc190eXBlKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl90eXBlKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIHR5cGUoKSBjb25zdDsKKyAgdm9pZCBzZXRfdHlwZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSB2YWx1ZSk7CisgIHByaXZhdGU6CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIF9pbnRlcm5hbF90eXBlKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF90eXBlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6SGFzQml0czwxPiBfaGFzX2JpdHNfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIGV4dGVuZGVlXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHR5cGVfbmFtZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBkZWZhdWx0X3ZhbHVlXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIGpzb25fbmFtZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucyogb3B0aW9uc187CisgICAgaW50MzJfdCBudW1iZXJfOworICAgIGludDMyX3Qgb25lb2ZfaW5kZXhfOworICAgIGJvb2wgcHJvdG8zX29wdGlvbmFsXzsKKyAgICBpbnQgbGFiZWxfOworICAgIGludCB0eXBlXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBPbmVvZkRlc2NyaXB0b3JQcm90byBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIE9uZW9mRGVzY3JpcHRvclByb3RvKCkgOiBPbmVvZkRlc2NyaXB0b3JQcm90byhudWxscHRyKSB7fQorICB+T25lb2ZEZXNjcmlwdG9yUHJvdG8oKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIE9uZW9mRGVzY3JpcHRvclByb3RvKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgT25lb2ZEZXNjcmlwdG9yUHJvdG8oY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICBPbmVvZkRlc2NyaXB0b3JQcm90byhPbmVvZkRlc2NyaXB0b3JQcm90byYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBPbmVvZkRlc2NyaXB0b3JQcm90bygpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIE9uZW9mRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIE9uZW9mRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oT25lb2ZEZXNjcmlwdG9yUHJvdG8mJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpOworICB9CisgIGlubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8qIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8qPigKKyAgICAgICAgICAgICAgICZfT25lb2ZEZXNjcmlwdG9yUHJvdG9fZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICA3OworCisgIGZyaWVuZCB2b2lkIHN3YXAoT25lb2ZEZXNjcmlwdG9yUHJvdG8mIGEsIE9uZW9mRGVzY3JpcHRvclByb3RvJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKE9uZW9mRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChPbmVvZkRlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgT25lb2ZEZXNjcmlwdG9yUHJvdG8qIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8T25lb2ZEZXNjcmlwdG9yUHJvdG8+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgICBPbmVvZkRlc2NyaXB0b3JQcm90bzo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKE9uZW9mRGVzY3JpcHRvclByb3RvKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IE9uZW9mRGVzY3JpcHRvclByb3RvKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrT3B0aW9uc0ZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBib29sIGhhc19uYW1lKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19uYW1lKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9uYW1lKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX25hbWUoc3RkOjpzdHJpbmcqIG5hbWUpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX25hbWUoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zIG9wdGlvbnMgPSAyOworICBib29sIGhhc19vcHRpb25zKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19vcHRpb25zKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9vcHRpb25zKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZk9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZk9wdGlvbnMqIHJlbGVhc2Vfb3B0aW9ucygpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mT3B0aW9ucyogb3B0aW9ucyk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZk9wdGlvbnMmIF9pbnRlcm5hbF9vcHRpb25zKCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZk9wdGlvbnMqIF9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKTsKKyAgcHVibGljOgorICB2b2lkIHVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkX29wdGlvbnMoCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZPcHRpb25zKiBvcHRpb25zKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mT3B0aW9ucyogdW5zYWZlX2FyZW5hX3JlbGVhc2Vfb3B0aW9ucygpOworCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6SGFzQml0czwxPiBfaGFzX2JpdHNfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZPcHRpb25zKiBvcHRpb25zXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2UpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlKCkgOiBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlKG51bGxwdHIpIHt9CisgIH5FbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlJiBmcm9tKTsKKyAgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZShFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UoKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlJiBvcGVyYXRvcj0oY29uc3QgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSYgb3BlcmF0b3I9KEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpOworICB9CisgIGlubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UqPigKKyAgICAgICAgICAgICAgICZfRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZV9kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDg7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlJiBhLCBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UqIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZT4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlJiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UmIGZyb20pIHsKKyAgICBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtTdGFydEZpZWxkTnVtYmVyID0gMSwKKyAgICBrRW5kRmllbGROdW1iZXIgPSAyLAorICB9OworICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7CisgIGJvb2wgaGFzX3N0YXJ0KCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19zdGFydCgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfc3RhcnQoKTsKKyAgaW50MzJfdCBzdGFydCgpIGNvbnN0OworICB2b2lkIHNldF9zdGFydChpbnQzMl90IHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgaW50MzJfdCBfaW50ZXJuYWxfc3RhcnQoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X3N0YXJ0KGludDMyX3QgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKKyAgYm9vbCBoYXNfZW5kKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19lbmQoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2VuZCgpOworICBpbnQzMl90IGVuZCgpIGNvbnN0OworICB2b2lkIHNldF9lbmQoaW50MzJfdCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGludDMyX3QgX2ludGVybmFsX2VuZCgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfZW5kKGludDMyX3QgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Okhhc0JpdHM8MT4gX2hhc19iaXRzXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICAgIGludDMyX3Qgc3RhcnRfOworICAgIGludDMyX3QgZW5kXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBFbnVtRGVzY3JpcHRvclByb3RvIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBFbnVtRGVzY3JpcHRvclByb3RvKCkgOiBFbnVtRGVzY3JpcHRvclByb3RvKG51bGxwdHIpIHt9CisgIH5FbnVtRGVzY3JpcHRvclByb3RvKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBFbnVtRGVzY3JpcHRvclByb3RvKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgRW51bURlc2NyaXB0b3JQcm90byhjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKyAgRW51bURlc2NyaXB0b3JQcm90byhFbnVtRGVzY3JpcHRvclByb3RvJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IEVudW1EZXNjcmlwdG9yUHJvdG8oKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBFbnVtRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgRW51bURlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KEVudW1EZXNjcmlwdG9yUHJvdG8mJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpOworICB9CisgIGlubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8qPigKKyAgICAgICAgICAgICAgICZfRW51bURlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDk7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChFbnVtRGVzY3JpcHRvclByb3RvJiBhLCBFbnVtRGVzY3JpcHRvclByb3RvJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKEVudW1EZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKEVudW1EZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEVudW1EZXNjcmlwdG9yUHJvdG8qIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8RW51bURlc2NyaXB0b3JQcm90bz4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgICBFbnVtRGVzY3JpcHRvclByb3RvOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoRW51bURlc2NyaXB0b3JQcm90byogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEVudW1EZXNjcmlwdG9yUHJvdG8oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB0eXBlZGVmIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UgRW51bVJlc2VydmVkUmFuZ2U7CisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrVmFsdWVGaWVsZE51bWJlciA9IDIsCisgICAga1Jlc2VydmVkUmFuZ2VGaWVsZE51bWJlciA9IDQsCisgICAga1Jlc2VydmVkTmFtZUZpZWxkTnVtYmVyID0gNSwKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrT3B0aW9uc0ZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdmFsdWUgPSAyOworICBpbnQgdmFsdWVfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX3ZhbHVlX3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3ZhbHVlKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfdmFsdWUoaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gPioKKyAgICAgIG11dGFibGVfdmFsdWUoKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgX2ludGVybmFsX3ZhbHVlKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIF9pbnRlcm5hbF9hZGRfdmFsdWUoKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiB2YWx1ZShpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBhZGRfdmFsdWUoKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIHZhbHVlKCkgY29uc3Q7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlIHJlc2VydmVkX3JhbmdlID0gNDsKKyAgaW50IHJlc2VydmVkX3JhbmdlX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9yZXNlcnZlZF9yYW5nZV9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9yZXNlcnZlZF9yYW5nZSgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSogbXV0YWJsZV9yZXNlcnZlZF9yYW5nZShpbnQgaW5kZXgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UgPioKKyAgICAgIG11dGFibGVfcmVzZXJ2ZWRfcmFuZ2UoKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UmIF9pbnRlcm5hbF9yZXNlcnZlZF9yYW5nZShpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSogX2ludGVybmFsX2FkZF9yZXNlcnZlZF9yYW5nZSgpOworICBwdWJsaWM6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlJiByZXNlcnZlZF9yYW5nZShpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSogYWRkX3Jlc2VydmVkX3JhbmdlKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSA+JgorICAgICAgcmVzZXJ2ZWRfcmFuZ2UoKSBjb25zdDsKKworICAvLyByZXBlYXRlZCBzdHJpbmcgcmVzZXJ2ZWRfbmFtZSA9IDU7CisgIGludCByZXNlcnZlZF9uYW1lX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9yZXNlcnZlZF9uYW1lX3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3Jlc2VydmVkX25hbWUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHJlc2VydmVkX25hbWUoaW50IGluZGV4KSBjb25zdDsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgpOworICB2b2lkIHNldF9yZXNlcnZlZF9uYW1lKGludCBpbmRleCwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgsIHN0ZDo6c3RyaW5nJiYgdmFsdWUpOworICB2b2lkIHNldF9yZXNlcnZlZF9uYW1lKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9yZXNlcnZlZF9uYW1lKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgc3RkOjpzdHJpbmcqIGFkZF9yZXNlcnZlZF9uYW1lKCk7CisgIHZvaWQgYWRkX3Jlc2VydmVkX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBhZGRfcmVzZXJ2ZWRfbmFtZShzdGQ6OnN0cmluZyYmIHZhbHVlKTsKKyAgdm9pZCBhZGRfcmVzZXJ2ZWRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgYWRkX3Jlc2VydmVkX25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+JiByZXNlcnZlZF9uYW1lKCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiogbXV0YWJsZV9yZXNlcnZlZF9uYW1lKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgpIGNvbnN0OworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX2FkZF9yZXNlcnZlZF9uYW1lKCk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX25hbWUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX25hbWUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF9uYW1lKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZShzdGQ6OnN0cmluZyogbmFtZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfbmFtZSgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfb3B0aW9ucygpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfb3B0aW9ucygpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucyogcmVsZWFzZV9vcHRpb25zKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucyogb3B0aW9ucyk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucyYgX2ludGVybmFsX29wdGlvbnMoKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1PcHRpb25zKiBfaW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCk7CisgIHB1YmxpYzoKKyAgdm9pZCB1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF9vcHRpb25zKAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1PcHRpb25zKiBvcHRpb25zKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1PcHRpb25zKiB1bnNhZmVfYXJlbmFfcmVsZWFzZV9vcHRpb25zKCk7CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Okhhc0JpdHM8MT4gX2hhc19iaXRzXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvID4gdmFsdWVfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSA+IHJlc2VydmVkX3JhbmdlXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gcmVzZXJ2ZWRfbmFtZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bU9wdGlvbnMqIG9wdGlvbnNfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oKSA6IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byhudWxscHRyKSB7fQorICB+RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSk7CisgIH0KKyAgaW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byo+KAorICAgICAgICAgICAgICAgJl9FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAxMDsKKworICBmcmllbmQgdm9pZCBzd2FwKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgYSwgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICBHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICAjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdlbmVyaWNTd2FwKHRoaXMsIG90aGVyKTsKKyAgICB9CisgIH0KKyAgdm9pZCBVbnNhZmVBcmVuYVN3YXAoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8RW51bVZhbHVlRGVzY3JpcHRvclByb3RvPihhcmVuYSk7CisgIH0KKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlGcm9tOworICB2b2lkIENvcHlGcm9tKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ok1lcmdlSW1wbCgqdGhpcywgZnJvbSk7CisgIH0KKyAgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgTWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZyk7CisgIHB1YmxpYzoKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IGZpbmFsOworICB2b2lkIEludGVybmFsU3dhcChFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXzsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDsKKworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga05hbWVGaWVsZE51bWJlciA9IDEsCisgICAga09wdGlvbnNGaWVsZE51bWJlciA9IDMsCisgICAga051bWJlckZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBib29sIGhhc19uYW1lKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19uYW1lKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9uYW1lKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX25hbWUoc3RkOjpzdHJpbmcqIG5hbWUpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX25hbWUoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfb3B0aW9ucygpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfb3B0aW9ucygpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworICBQUk9UT0JVRl9OT0RJU0NBUkQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZU9wdGlvbnMqIHJlbGVhc2Vfb3B0aW9ucygpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVPcHRpb25zKiBvcHRpb25zKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZU9wdGlvbnMmIF9pbnRlcm5hbF9vcHRpb25zKCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVPcHRpb25zKiBfaW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCk7CisgIHB1YmxpYzoKKyAgdm9pZCB1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF9vcHRpb25zKAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZU9wdGlvbnMqIG9wdGlvbnMpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlT3B0aW9ucyogdW5zYWZlX2FyZW5hX3JlbGVhc2Vfb3B0aW9ucygpOworCisgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7CisgIGJvb2wgaGFzX251bWJlcigpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfbnVtYmVyKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9udW1iZXIoKTsKKyAgaW50MzJfdCBudW1iZXIoKSBjb25zdDsKKyAgdm9pZCBzZXRfbnVtYmVyKGludDMyX3QgdmFsdWUpOworICBwcml2YXRlOgorICBpbnQzMl90IF9pbnRlcm5hbF9udW1iZXIoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X251bWJlcihpbnQzMl90IHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Okhhc0JpdHM8MT4gX2hhc19iaXRzXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgbmFtZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZU9wdGlvbnMqIG9wdGlvbnNfOworICAgIGludDMyX3QgbnVtYmVyXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKCkgOiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKG51bGxwdHIpIHt9CisgIH5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgU2VydmljZURlc2NyaXB0b3JQcm90byhjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKyAgU2VydmljZURlc2NyaXB0b3JQcm90byhTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8oKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgU2VydmljZURlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpOworICB9CisgIGlubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qPigKKyAgICAgICAgICAgICAgICZfU2VydmljZURlc2NyaXB0b3JQcm90b19kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDExOworCisgIGZyaWVuZCB2b2lkIHN3YXAoU2VydmljZURlc2NyaXB0b3JQcm90byYgYSwgU2VydmljZURlc2NyaXB0b3JQcm90byYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgICAgU2VydmljZURlc2NyaXB0b3JQcm90bzo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90byI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrTWV0aG9kRmllbGROdW1iZXIgPSAyLAorICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtPcHRpb25zRmllbGROdW1iZXIgPSAzLAorICB9OworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90byBtZXRob2QgPSAyOworICBpbnQgbWV0aG9kX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9tZXRob2Rfc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfbWV0aG9kKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2REZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfbWV0aG9kKGludCBpbmRleCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kRGVzY3JpcHRvclByb3RvID4qCisgICAgICBtdXRhYmxlX21ldGhvZCgpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kRGVzY3JpcHRvclByb3RvJiBfaW50ZXJuYWxfbWV0aG9kKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2REZXNjcmlwdG9yUHJvdG8qIF9pbnRlcm5hbF9hZGRfbWV0aG9kKCk7CisgIHB1YmxpYzoKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZERlc2NyaXB0b3JQcm90byYgbWV0aG9kKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2REZXNjcmlwdG9yUHJvdG8qIGFkZF9tZXRob2QoKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2REZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIG1ldGhvZCgpIGNvbnN0OworCisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfbmFtZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfbmFtZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X25hbWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9uYW1lKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOworICBib29sIGhhc19vcHRpb25zKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19vcHRpb25zKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9vcHRpb25zKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworICBQUk9UT0JVRl9OT0RJU0NBUkQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VPcHRpb25zKiBvcHRpb25zKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VPcHRpb25zJiBfaW50ZXJuYWxfb3B0aW9ucygpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZU9wdGlvbnMqIF9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKTsKKyAgcHVibGljOgorICB2b2lkIHVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkX29wdGlvbnMoCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZU9wdGlvbnMqIG9wdGlvbnMpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZU9wdGlvbnMqIHVuc2FmZV9hcmVuYV9yZWxlYXNlX29wdGlvbnMoKTsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6SGFzQml0czwxPiBfaGFzX2JpdHNfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2REZXNjcmlwdG9yUHJvdG8gPiBtZXRob2RfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgbmFtZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VPcHRpb25zKiBvcHRpb25zXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBNZXRob2REZXNjcmlwdG9yUHJvdG8gZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgTWV0aG9kRGVzY3JpcHRvclByb3RvKCkgOiBNZXRob2REZXNjcmlwdG9yUHJvdG8obnVsbHB0cikge30KKyAgfk1ldGhvZERlc2NyaXB0b3JQcm90bygpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgTWV0aG9kRGVzY3JpcHRvclByb3RvKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgTWV0aG9kRGVzY3JpcHRvclByb3RvKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIE1ldGhvZERlc2NyaXB0b3JQcm90byhNZXRob2REZXNjcmlwdG9yUHJvdG8mJiBmcm9tKSBub2V4Y2VwdAorICAgIDogTWV0aG9kRGVzY3JpcHRvclByb3RvKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBNZXRob2REZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShNZXRob2REZXNjcmlwdG9yUHJvdG8mJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpOworICB9CisgIGlubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gKmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8qPigKKyAgICAgICAgICAgICAgICZfTWV0aG9kRGVzY3JpcHRvclByb3RvX2RlZmF1bHRfaW5zdGFuY2VfKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9CisgICAgMTI7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChNZXRob2REZXNjcmlwdG9yUHJvdG8mIGEsIE1ldGhvZERlc2NyaXB0b3JQcm90byYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChNZXRob2REZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKE1ldGhvZERlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgTWV0aG9kRGVzY3JpcHRvclByb3RvKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPE1ldGhvZERlc2NyaXB0b3JQcm90bz4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgICAgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoTWV0aG9kRGVzY3JpcHRvclByb3RvKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90byI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBNZXRob2REZXNjcmlwdG9yUHJvdG8oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtJbnB1dFR5cGVGaWVsZE51bWJlciA9IDIsCisgICAga091dHB1dFR5cGVGaWVsZE51bWJlciA9IDMsCisgICAga09wdGlvbnNGaWVsZE51bWJlciA9IDQsCisgICAga0NsaWVudFN0cmVhbWluZ0ZpZWxkTnVtYmVyID0gNSwKKyAgICBrU2VydmVyU3RyZWFtaW5nRmllbGROdW1iZXIgPSA2LAorICB9OworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX25hbWUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX25hbWUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF9uYW1lKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZShzdGQ6OnN0cmluZyogbmFtZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfbmFtZSgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGlucHV0X3R5cGUgPSAyOworICBib29sIGhhc19pbnB1dF90eXBlKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19pbnB1dF90eXBlKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9pbnB1dF90eXBlKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dF90eXBlKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfaW5wdXRfdHlwZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX2lucHV0X3R5cGUoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX2lucHV0X3R5cGUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2lucHV0X3R5cGUoc3RkOjpzdHJpbmcqIGlucHV0X3R5cGUpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX2lucHV0X3R5cGUoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X2lucHV0X3R5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX2lucHV0X3R5cGUoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBvdXRwdXRfdHlwZSA9IDM7CisgIGJvb2wgaGFzX291dHB1dF90eXBlKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19vdXRwdXRfdHlwZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfb3V0cHV0X3R5cGUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG91dHB1dF90eXBlKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfb3V0cHV0X3R5cGUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9vdXRwdXRfdHlwZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2Vfb3V0cHV0X3R5cGUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX291dHB1dF90eXBlKHN0ZDo6c3RyaW5nKiBvdXRwdXRfdHlwZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfb3V0cHV0X3R5cGUoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X291dHB1dF90eXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9vdXRwdXRfdHlwZSgpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zIG9wdGlvbnMgPSA0OworICBib29sIGhhc19vcHRpb25zKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19vcHRpb25zKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9vcHRpb25zKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisgIFBST1RPQlVGX05PRElTQ0FSRCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9ucyogcmVsZWFzZV9vcHRpb25zKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnMqIG9wdGlvbnMpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9ucyYgX2ludGVybmFsX29wdGlvbnMoKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnMqIF9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKTsKKyAgcHVibGljOgorICB2b2lkIHVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkX29wdGlvbnMoCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9ucyogb3B0aW9ucyk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zKiB1bnNhZmVfYXJlbmFfcmVsZWFzZV9vcHRpb25zKCk7CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBjbGllbnRfc3RyZWFtaW5nID0gNSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgYm9vbCBoYXNfY2xpZW50X3N0cmVhbWluZygpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfY2xpZW50X3N0cmVhbWluZygpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfY2xpZW50X3N0cmVhbWluZygpOworICBib29sIGNsaWVudF9zdHJlYW1pbmcoKSBjb25zdDsKKyAgdm9pZCBzZXRfY2xpZW50X3N0cmVhbWluZyhib29sIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfY2xpZW50X3N0cmVhbWluZygpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfY2xpZW50X3N0cmVhbWluZyhib29sIHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIGJvb2wgc2VydmVyX3N0cmVhbWluZyA9IDYgW2RlZmF1bHQgPSBmYWxzZV07CisgIGJvb2wgaGFzX3NlcnZlcl9zdHJlYW1pbmcoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX3NlcnZlcl9zdHJlYW1pbmcoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3NlcnZlcl9zdHJlYW1pbmcoKTsKKyAgYm9vbCBzZXJ2ZXJfc3RyZWFtaW5nKCkgY29uc3Q7CisgIHZvaWQgc2V0X3NlcnZlcl9zdHJlYW1pbmcoYm9vbCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX3NlcnZlcl9zdHJlYW1pbmcoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X3NlcnZlcl9zdHJlYW1pbmcoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpIYXNCaXRzPDE+IF9oYXNfYml0c187CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIG5hbWVfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgaW5wdXRfdHlwZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBvdXRwdXRfdHlwZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnMqIG9wdGlvbnNfOworICAgIGJvb2wgY2xpZW50X3N0cmVhbWluZ187CisgICAgYm9vbCBzZXJ2ZXJfc3RyZWFtaW5nXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBGaWxlT3B0aW9ucyBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIEZpbGVPcHRpb25zKCkgOiBGaWxlT3B0aW9ucyhudWxscHRyKSB7fQorICB+RmlsZU9wdGlvbnMoKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIEZpbGVPcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgRmlsZU9wdGlvbnMoY29uc3QgRmlsZU9wdGlvbnMmIGZyb20pOworICBGaWxlT3B0aW9ucyhGaWxlT3B0aW9ucyYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBGaWxlT3B0aW9ucygpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIEZpbGVPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgRmlsZU9wdGlvbnMmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIEZpbGVPcHRpb25zJiBvcGVyYXRvcj0oRmlsZU9wdGlvbnMmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpOworICB9CisgIGlubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IEZpbGVPcHRpb25zJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgRmlsZU9wdGlvbnMqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRmlsZU9wdGlvbnMqPigKKyAgICAgICAgICAgICAgICZfRmlsZU9wdGlvbnNfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAxMzsKKworICBmcmllbmQgdm9pZCBzd2FwKEZpbGVPcHRpb25zJiBhLCBGaWxlT3B0aW9ucyYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChGaWxlT3B0aW9ucyogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICBHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICAjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdlbmVyaWNTd2FwKHRoaXMsIG90aGVyKTsKKyAgICB9CisgIH0KKyAgdm9pZCBVbnNhZmVBcmVuYVN3YXAoRmlsZU9wdGlvbnMqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZpbGVPcHRpb25zKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPEZpbGVPcHRpb25zPihhcmVuYSk7CisgIH0KKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlGcm9tOworICB2b2lkIENvcHlGcm9tKGNvbnN0IEZpbGVPcHRpb25zJiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IEZpbGVPcHRpb25zJiBmcm9tKSB7CisgICAgRmlsZU9wdGlvbnM6Ok1lcmdlSW1wbCgqdGhpcywgZnJvbSk7CisgIH0KKyAgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgTWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZyk7CisgIHB1YmxpYzoKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IGZpbmFsOworICB2b2lkIEludGVybmFsU3dhcChGaWxlT3B0aW9ucyogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBGaWxlT3B0aW9ucyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXzsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDsKKworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIHR5cGVkZWYgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIE9wdGltaXplTW9kZTsKKyAgc3RhdGljIGNvbnN0ZXhwciBPcHRpbWl6ZU1vZGUgU1BFRUQgPQorICAgIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9TUEVFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBPcHRpbWl6ZU1vZGUgQ09ERV9TSVpFID0KKyAgICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfQ09ERV9TSVpFOworICBzdGF0aWMgY29uc3RleHByIE9wdGltaXplTW9kZSBMSVRFX1JVTlRJTUUgPQorICAgIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9MSVRFX1JVTlRJTUU7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBPcHRpbWl6ZU1vZGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX0lzVmFsaWQodmFsdWUpOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgT3B0aW1pemVNb2RlIE9wdGltaXplTW9kZV9NSU4gPQorICAgIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9PcHRpbWl6ZU1vZGVfTUlOOworICBzdGF0aWMgY29uc3RleHByIE9wdGltaXplTW9kZSBPcHRpbWl6ZU1vZGVfTUFYID0KKyAgICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfT3B0aW1pemVNb2RlX01BWDsKKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQgT3B0aW1pemVNb2RlX0FSUkFZU0laRSA9CisgICAgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX09wdGltaXplTW9kZV9BUlJBWVNJWkU7CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yKgorICBPcHRpbWl6ZU1vZGVfZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3IoKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBzdGF0aWMgaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBPcHRpbWl6ZU1vZGVfTmFtZShUIGVudW1fdF92YWx1ZSkgeworICAgIHN0YXRpY19hc3NlcnQoOjpzdGQ6OmlzX3NhbWU8VCwgT3B0aW1pemVNb2RlPjo6dmFsdWUgfHwKKyAgICAgIDo6c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsCisgICAgICAiSW5jb3JyZWN0IHR5cGUgcGFzc2VkIHRvIGZ1bmN0aW9uIE9wdGltaXplTW9kZV9OYW1lLiIpOworICAgIHJldHVybiBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfTmFtZShlbnVtX3RfdmFsdWUpOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBPcHRpbWl6ZU1vZGVfUGFyc2UoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkNvbnN0U3RyaW5nUGFyYW0gbmFtZSwKKyAgICAgIE9wdGltaXplTW9kZSogdmFsdWUpIHsKKyAgICByZXR1cm4gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX1BhcnNlKG5hbWUsIHZhbHVlKTsKKyAgfQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OSwKKyAgICBrSmF2YVBhY2thZ2VGaWVsZE51bWJlciA9IDEsCisgICAga0phdmFPdXRlckNsYXNzbmFtZUZpZWxkTnVtYmVyID0gOCwKKyAgICBrR29QYWNrYWdlRmllbGROdW1iZXIgPSAxMSwKKyAgICBrT2JqY0NsYXNzUHJlZml4RmllbGROdW1iZXIgPSAzNiwKKyAgICBrQ3NoYXJwTmFtZXNwYWNlRmllbGROdW1iZXIgPSAzNywKKyAgICBrU3dpZnRQcmVmaXhGaWVsZE51bWJlciA9IDM5LAorICAgIGtQaHBDbGFzc1ByZWZpeEZpZWxkTnVtYmVyID0gNDAsCisgICAga1BocE5hbWVzcGFjZUZpZWxkTnVtYmVyID0gNDEsCisgICAga1BocE1ldGFkYXRhTmFtZXNwYWNlRmllbGROdW1iZXIgPSA0NCwKKyAgICBrUnVieVBhY2thZ2VGaWVsZE51bWJlciA9IDQ1LAorICAgIGtKYXZhTXVsdGlwbGVGaWxlc0ZpZWxkTnVtYmVyID0gMTAsCisgICAga0phdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2hGaWVsZE51bWJlciA9IDIwLAorICAgIGtKYXZhU3RyaW5nQ2hlY2tVdGY4RmllbGROdW1iZXIgPSAyNywKKyAgICBrQ2NHZW5lcmljU2VydmljZXNGaWVsZE51bWJlciA9IDE2LAorICAgIGtKYXZhR2VuZXJpY1NlcnZpY2VzRmllbGROdW1iZXIgPSAxNywKKyAgICBrUHlHZW5lcmljU2VydmljZXNGaWVsZE51bWJlciA9IDE4LAorICAgIGtQaHBHZW5lcmljU2VydmljZXNGaWVsZE51bWJlciA9IDQyLAorICAgIGtEZXByZWNhdGVkRmllbGROdW1iZXIgPSAyMywKKyAgICBrT3B0aW1pemVGb3JGaWVsZE51bWJlciA9IDksCisgICAga0NjRW5hYmxlQXJlbmFzRmllbGROdW1iZXIgPSAzMSwKKyAgfTsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorICAgICAgbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiYgX2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBfaW50ZXJuYWxfYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIHB1YmxpYzoKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uID4mCisgICAgICB1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0OworCisgIC8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX3BhY2thZ2UgPSAxOworICBib29sIGhhc19qYXZhX3BhY2thZ2UoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX2phdmFfcGFja2FnZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfamF2YV9wYWNrYWdlKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBqYXZhX3BhY2thZ2UoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF9qYXZhX3BhY2thZ2UoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9qYXZhX3BhY2thZ2UoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX2phdmFfcGFja2FnZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfamF2YV9wYWNrYWdlKHN0ZDo6c3RyaW5nKiBqYXZhX3BhY2thZ2UpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX2phdmFfcGFja2FnZSgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfamF2YV9wYWNrYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9qYXZhX3BhY2thZ2UoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDg7CisgIGJvb2wgaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGphdmFfb3V0ZXJfY2xhc3NuYW1lKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfamF2YV9vdXRlcl9jbGFzc25hbWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2VfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2phdmFfb3V0ZXJfY2xhc3NuYW1lKHN0ZDo6c3RyaW5nKiBqYXZhX291dGVyX2NsYXNzbmFtZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfamF2YV9vdXRlcl9jbGFzc25hbWUoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKKyAgYm9vbCBoYXNfZ29fcGFja2FnZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfZ29fcGFja2FnZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfZ29fcGFja2FnZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgZ29fcGFja2FnZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X2dvX3BhY2thZ2UoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9nb19wYWNrYWdlKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9nb19wYWNrYWdlKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9nb19wYWNrYWdlKHN0ZDo6c3RyaW5nKiBnb19wYWNrYWdlKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9nb19wYWNrYWdlKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9nb19wYWNrYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9nb19wYWNrYWdlKCk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBzdHJpbmcgb2JqY19jbGFzc19wcmVmaXggPSAzNjsKKyAgYm9vbCBoYXNfb2JqY19jbGFzc19wcmVmaXgoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX29iamNfY2xhc3NfcHJlZml4KCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9vYmpjX2NsYXNzX3ByZWZpeCgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgb2JqY19jbGFzc19wcmVmaXgoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF9vYmpjX2NsYXNzX3ByZWZpeChBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX29iamNfY2xhc3NfcHJlZml4KCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9vYmpjX2NsYXNzX3ByZWZpeCgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfb2JqY19jbGFzc19wcmVmaXgoc3RkOjpzdHJpbmcqIG9iamNfY2xhc3NfcHJlZml4KTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9vYmpjX2NsYXNzX3ByZWZpeCgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfb2JqY19jbGFzc19wcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX29iamNfY2xhc3NfcHJlZml4KCk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBzdHJpbmcgY3NoYXJwX25hbWVzcGFjZSA9IDM3OworICBib29sIGhhc19jc2hhcnBfbmFtZXNwYWNlKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19jc2hhcnBfbmFtZXNwYWNlKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9jc2hhcnBfbmFtZXNwYWNlKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjc2hhcnBfbmFtZXNwYWNlKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfY3NoYXJwX25hbWVzcGFjZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX2NzaGFycF9uYW1lc3BhY2UoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX2NzaGFycF9uYW1lc3BhY2UoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2NzaGFycF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcqIGNzaGFycF9uYW1lc3BhY2UpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX2NzaGFycF9uYW1lc3BhY2UoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X2NzaGFycF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX2NzaGFycF9uYW1lc3BhY2UoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBzd2lmdF9wcmVmaXggPSAzOTsKKyAgYm9vbCBoYXNfc3dpZnRfcHJlZml4KCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19zd2lmdF9wcmVmaXgoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3N3aWZ0X3ByZWZpeCgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgc3dpZnRfcHJlZml4KCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfc3dpZnRfcHJlZml4KEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfc3dpZnRfcHJlZml4KCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9zd2lmdF9wcmVmaXgoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX3N3aWZ0X3ByZWZpeChzdGQ6OnN0cmluZyogc3dpZnRfcHJlZml4KTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9zd2lmdF9wcmVmaXgoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X3N3aWZ0X3ByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfc3dpZnRfcHJlZml4KCk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBzdHJpbmcgcGhwX2NsYXNzX3ByZWZpeCA9IDQwOworICBib29sIGhhc19waHBfY2xhc3NfcHJlZml4KCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19waHBfY2xhc3NfcHJlZml4KCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9waHBfY2xhc3NfcHJlZml4KCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHBfY2xhc3NfcHJlZml4KCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfcGhwX2NsYXNzX3ByZWZpeChBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX3BocF9jbGFzc19wcmVmaXgoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX3BocF9jbGFzc19wcmVmaXgoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX3BocF9jbGFzc19wcmVmaXgoc3RkOjpzdHJpbmcqIHBocF9jbGFzc19wcmVmaXgpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX3BocF9jbGFzc19wcmVmaXgoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X3BocF9jbGFzc19wcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX3BocF9jbGFzc19wcmVmaXgoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBwaHBfbmFtZXNwYWNlID0gNDE7CisgIGJvb2wgaGFzX3BocF9uYW1lc3BhY2UoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX3BocF9uYW1lc3BhY2UoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3BocF9uYW1lc3BhY2UoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHBocF9uYW1lc3BhY2UoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF9waHBfbmFtZXNwYWNlKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfcGhwX25hbWVzcGFjZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2VfcGhwX25hbWVzcGFjZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfcGhwX25hbWVzcGFjZShzdGQ6OnN0cmluZyogcGhwX25hbWVzcGFjZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfcGhwX25hbWVzcGFjZSgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfcGhwX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfcGhwX25hbWVzcGFjZSgpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHBocF9tZXRhZGF0YV9uYW1lc3BhY2UgPSA0NDsKKyAgYm9vbCBoYXNfcGhwX21ldGFkYXRhX25hbWVzcGFjZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfcGhwX21ldGFkYXRhX25hbWVzcGFjZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfcGhwX21ldGFkYXRhX25hbWVzcGFjZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgcGhwX21ldGFkYXRhX25hbWVzcGFjZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X3BocF9tZXRhZGF0YV9uYW1lc3BhY2UoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9waHBfbWV0YWRhdGFfbmFtZXNwYWNlKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9waHBfbWV0YWRhdGFfbmFtZXNwYWNlKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9waHBfbWV0YWRhdGFfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nKiBwaHBfbWV0YWRhdGFfbmFtZXNwYWNlKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9waHBfbWV0YWRhdGFfbmFtZXNwYWNlKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9waHBfbWV0YWRhdGFfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9waHBfbWV0YWRhdGFfbmFtZXNwYWNlKCk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBzdHJpbmcgcnVieV9wYWNrYWdlID0gNDU7CisgIGJvb2wgaGFzX3J1YnlfcGFja2FnZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfcnVieV9wYWNrYWdlKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9ydWJ5X3BhY2thZ2UoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHJ1YnlfcGFja2FnZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X3J1YnlfcGFja2FnZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX3J1YnlfcGFja2FnZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2VfcnVieV9wYWNrYWdlKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9ydWJ5X3BhY2thZ2Uoc3RkOjpzdHJpbmcqIHJ1YnlfcGFja2FnZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfcnVieV9wYWNrYWdlKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9ydWJ5X3BhY2thZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX3J1YnlfcGFja2FnZSgpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07CisgIGJvb2wgaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2phdmFfbXVsdGlwbGVfZmlsZXMoKTsKKyAgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzKCkgY29uc3Q7CisgIHZvaWQgc2V0X2phdmFfbXVsdGlwbGVfZmlsZXMoYm9vbCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2phdmFfbXVsdGlwbGVfZmlsZXMoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X2phdmFfbXVsdGlwbGVfZmlsZXMoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gMjAgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKKyAgUFJPVE9CVUZfREVQUkVDQVRFRCBib29sIGhhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSBjb25zdDsKKyAgcHVibGljOgorICBQUk9UT0JVRl9ERVBSRUNBVEVEIHZvaWQgY2xlYXJfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKTsKKyAgUFJPVE9CVUZfREVQUkVDQVRFRCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgY29uc3Q7CisgIFBST1RPQlVGX0RFUFJFQ0FURUQgdm9pZCBzZXRfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goYm9vbCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaChib29sIHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9zdHJpbmdfY2hlY2tfdXRmOCA9IDI3IFtkZWZhdWx0ID0gZmFsc2VdOworICBib29sIGhhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9qYXZhX3N0cmluZ19jaGVja191dGY4KCk7CisgIGJvb2wgamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpIGNvbnN0OworICB2b2lkIHNldF9qYXZhX3N0cmluZ19jaGVja191dGY4KGJvb2wgdmFsdWUpOworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9qYXZhX3N0cmluZ19jaGVja191dGY4KCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9qYXZhX3N0cmluZ19jaGVja191dGY4KGJvb2wgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07CisgIGJvb2wgaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKKyAgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIHZvaWQgc2V0X2NjX2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2NjX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X2NjX2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0ID0gZmFsc2VdOworICBib29sIGhhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfamF2YV9nZW5lcmljX3NlcnZpY2VzKCk7CisgIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIHZvaWQgc2V0X2phdmFfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9qYXZhX2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgYm9vbCBoYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfcHlfZ2VuZXJpY19zZXJ2aWNlcygpOworICBib29sIHB5X2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKKyAgdm9pZCBzZXRfcHlfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfcHlfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfcHlfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIGJvb2wgcGhwX2dlbmVyaWNfc2VydmljZXMgPSA0MiBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgYm9vbCBoYXNfcGhwX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX3BocF9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9waHBfZ2VuZXJpY19zZXJ2aWNlcygpOworICBib29sIHBocF9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIHZvaWQgc2V0X3BocF9nZW5lcmljX3NlcnZpY2VzKGJvb2wgdmFsdWUpOworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9waHBfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfcGhwX2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAyMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgYm9vbCBoYXNfZGVwcmVjYXRlZCgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfZGVwcmVjYXRlZCgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfZGVwcmVjYXRlZCgpOworICBib29sIGRlcHJlY2F0ZWQoKSBjb25zdDsKKyAgdm9pZCBzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfZGVwcmVjYXRlZCgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQgPSBTUEVFRF07CisgIGJvb2wgaGFzX29wdGltaXplX2ZvcigpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfb3B0aW1pemVfZm9yKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9vcHRpbWl6ZV9mb3IoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IoKSBjb25zdDsKKyAgdm9pZCBzZXRfb3B0aW1pemVfZm9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgdmFsdWUpOworICBwcml2YXRlOgorICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIF9pbnRlcm5hbF9vcHRpbWl6ZV9mb3IoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X29wdGltaXplX2Zvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIGJvb2wgY2NfZW5hYmxlX2FyZW5hcyA9IDMxIFtkZWZhdWx0ID0gdHJ1ZV07CisgIGJvb2wgaGFzX2NjX2VuYWJsZV9hcmVuYXMoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX2NjX2VuYWJsZV9hcmVuYXMoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2NjX2VuYWJsZV9hcmVuYXMoKTsKKyAgYm9vbCBjY19lbmFibGVfYXJlbmFzKCkgY29uc3Q7CisgIHZvaWQgc2V0X2NjX2VuYWJsZV9hcmVuYXMoYm9vbCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2NjX2VuYWJsZV9hcmVuYXMoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X2NjX2VuYWJsZV9hcmVuYXMoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgYm9vbCBIYXNFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRmlsZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CisKKyAgICByZXR1cm4gX2ltcGxfLl9leHRlbnNpb25zXy5IYXMoaWQubnVtYmVyKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIENsZWFyRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEZpbGVPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworICAgIF9pbXBsXy5fZXh0ZW5zaW9uc18uQ2xlYXJFeHRlbnNpb24oaWQubnVtYmVyKCkpOworCisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIGludCBFeHRlbnNpb25TaXplKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEZpbGVPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9pbXBsXy5fZXh0ZW5zaW9uc18uRXh0ZW5zaW9uU2l6ZShpZC5udW1iZXIoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6Q29uc3RUeXBlIEdldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBGaWxlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6R2V0KGlkLm51bWJlcigpLCBfaW1wbF8uX2V4dGVuc2lvbnNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLmRlZmF1bHRfdmFsdWUoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUgTXV0YWJsZUV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBGaWxlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6TXV0YWJsZShpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBTZXRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRmlsZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpDb25zdFR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6U2V0KGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgdmFsdWUsICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEFsbG9jYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBGaWxlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6Ok11dGFibGVUeXBlIHZhbHVlKSB7CisgICAgX3Byb3RvX1R5cGVUcmFpdHM6OlNldEFsbG9jYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEZpbGVPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6VW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIFBST1RPQlVGX05PRElTQ0FSRCBpbmxpbmUKKyAgICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUKKyAgICAgIFJlbGVhc2VFeHRlbnNpb24oCisgICAgICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgICAgICBGaWxlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6UmVsZWFzZShpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUKKyAgVW5zYWZlQXJlbmFSZWxlYXNlRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEZpbGVPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpVbnNhZmVBcmVuYVJlbGVhc2UoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgR2V0RXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEZpbGVPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIGludCBpbmRleCkgY29uc3QgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXQoaWQubnVtYmVyKCksIF9pbXBsXy5fZXh0ZW5zaW9uc18sIGluZGV4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpNdXRhYmxlVHlwZSBNdXRhYmxlRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEZpbGVPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIGludCBpbmRleCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBpbmRleCwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBGaWxlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgICBpbnQgaW5kZXgsIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6Q29uc3RUeXBlIHZhbHVlKSB7CisgICAgX3Byb3RvX1R5cGVUcmFpdHM6OlNldChpZC5udW1iZXIoKSwgaW5kZXgsIHZhbHVlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpNdXRhYmxlVHlwZSBBZGRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRmlsZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpNdXRhYmxlVHlwZSB0b19hZGQgPQorICAgICAgICBfcHJvdG9fVHlwZVRyYWl0czo6QWRkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgICAgcmV0dXJuIHRvX2FkZDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBBZGRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRmlsZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6QWRkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpSZXBlYXRlZEZpZWxkVHlwZSYKKyAgR2V0UmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRmlsZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkdldFJlcGVhdGVkKGlkLm51bWJlcigpLCBfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpSZXBlYXRlZEZpZWxkVHlwZSoKKyAgTXV0YWJsZVJlcGVhdGVkRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEZpbGVPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlUmVwZWF0ZWQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pc19wYWNrZWQsICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0IF9leHRlbnNpb25zXzsKKworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6SGFzQml0czwxPiBfaGFzX2JpdHNfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgamF2YV9wYWNrYWdlXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIGphdmFfb3V0ZXJfY2xhc3NuYW1lXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIGdvX3BhY2thZ2VfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgb2JqY19jbGFzc19wcmVmaXhfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgY3NoYXJwX25hbWVzcGFjZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBzd2lmdF9wcmVmaXhfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgcGhwX2NsYXNzX3ByZWZpeF87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBwaHBfbmFtZXNwYWNlXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHBocF9tZXRhZGF0YV9uYW1lc3BhY2VfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgcnVieV9wYWNrYWdlXzsKKyAgICBib29sIGphdmFfbXVsdGlwbGVfZmlsZXNfOworICAgIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfOworICAgIGJvb2wgamF2YV9zdHJpbmdfY2hlY2tfdXRmOF87CisgICAgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzXzsKKyAgICBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlc187CisgICAgYm9vbCBweV9nZW5lcmljX3NlcnZpY2VzXzsKKyAgICBib29sIHBocF9nZW5lcmljX3NlcnZpY2VzXzsKKyAgICBib29sIGRlcHJlY2F0ZWRfOworICAgIGludCBvcHRpbWl6ZV9mb3JfOworICAgIGJvb2wgY2NfZW5hYmxlX2FyZW5hc187CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTWVzc2FnZU9wdGlvbnMgZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBNZXNzYWdlT3B0aW9ucygpIDogTWVzc2FnZU9wdGlvbnMobnVsbHB0cikge30KKyAgfk1lc3NhZ2VPcHRpb25zKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBNZXNzYWdlT3B0aW9ucyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIE1lc3NhZ2VPcHRpb25zKGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBmcm9tKTsKKyAgTWVzc2FnZU9wdGlvbnMoTWVzc2FnZU9wdGlvbnMmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogTWVzc2FnZU9wdGlvbnMoKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBNZXNzYWdlT3B0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBNZXNzYWdlT3B0aW9ucyYgb3BlcmF0b3I9KE1lc3NhZ2VPcHRpb25zJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKTsKKyAgfQorICBpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBNZXNzYWdlT3B0aW9ucyYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gKmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IE1lc3NhZ2VPcHRpb25zKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IE1lc3NhZ2VPcHRpb25zKj4oCisgICAgICAgICAgICAgICAmX01lc3NhZ2VPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9CisgICAgMTQ7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChNZXNzYWdlT3B0aW9ucyYgYSwgTWVzc2FnZU9wdGlvbnMmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoTWVzc2FnZU9wdGlvbnMqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKE1lc3NhZ2VPcHRpb25zKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBNZXNzYWdlT3B0aW9ucyogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxNZXNzYWdlT3B0aW9ucz4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSkgeworICAgIE1lc3NhZ2VPcHRpb25zOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoTWVzc2FnZU9wdGlvbnMqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMiOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgTWVzc2FnZU9wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTksCisgICAga01lc3NhZ2VTZXRXaXJlRm9ybWF0RmllbGROdW1iZXIgPSAxLAorICAgIGtOb1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yRmllbGROdW1iZXIgPSAyLAorICAgIGtEZXByZWNhdGVkRmllbGROdW1iZXIgPSAzLAorICAgIGtNYXBFbnRyeUZpZWxkTnVtYmVyID0gNywKKyAgfTsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorICAgICAgbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiYgX2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBfaW50ZXJuYWxfYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIHB1YmxpYzoKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uID4mCisgICAgICB1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0OworCisgIC8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOworICBib29sIGhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCk7CisgIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSBjb25zdDsKKyAgdm9pZCBzZXRfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoYm9vbCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9tZXNzYWdlX3NldF93aXJlX2Zvcm1hdChib29sIHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CisgIGJvb2wgaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKTsKKyAgYm9vbCBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgY29uc3Q7CisgIHZvaWQgc2V0X25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoYm9vbCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICBib29sIGhhc19kZXByZWNhdGVkKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19kZXByZWNhdGVkKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9kZXByZWNhdGVkKCk7CisgIGJvb2wgZGVwcmVjYXRlZCgpIGNvbnN0OworICB2b2lkIHNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpOworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9kZXByZWNhdGVkKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBtYXBfZW50cnkgPSA3OworICBib29sIGhhc19tYXBfZW50cnkoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX21hcF9lbnRyeSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfbWFwX2VudHJ5KCk7CisgIGJvb2wgbWFwX2VudHJ5KCkgY29uc3Q7CisgIHZvaWQgc2V0X21hcF9lbnRyeShib29sIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfbWFwX2VudHJ5KCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9tYXBfZW50cnkoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgYm9vbCBIYXNFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgTWVzc2FnZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CisKKyAgICByZXR1cm4gX2ltcGxfLl9leHRlbnNpb25zXy5IYXMoaWQubnVtYmVyKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIENsZWFyRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE1lc3NhZ2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworICAgIF9pbXBsXy5fZXh0ZW5zaW9uc18uQ2xlYXJFeHRlbnNpb24oaWQubnVtYmVyKCkpOworCisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIGludCBFeHRlbnNpb25TaXplKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE1lc3NhZ2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9pbXBsXy5fZXh0ZW5zaW9uc18uRXh0ZW5zaW9uU2l6ZShpZC5udW1iZXIoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6Q29uc3RUeXBlIEdldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBNZXNzYWdlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6R2V0KGlkLm51bWJlcigpLCBfaW1wbF8uX2V4dGVuc2lvbnNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLmRlZmF1bHRfdmFsdWUoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUgTXV0YWJsZUV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBNZXNzYWdlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6TXV0YWJsZShpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBTZXRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgTWVzc2FnZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpDb25zdFR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6U2V0KGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgdmFsdWUsICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEFsbG9jYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBNZXNzYWdlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6Ok11dGFibGVUeXBlIHZhbHVlKSB7CisgICAgX3Byb3RvX1R5cGVUcmFpdHM6OlNldEFsbG9jYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE1lc3NhZ2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6VW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIFBST1RPQlVGX05PRElTQ0FSRCBpbmxpbmUKKyAgICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUKKyAgICAgIFJlbGVhc2VFeHRlbnNpb24oCisgICAgICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgICAgICBNZXNzYWdlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6UmVsZWFzZShpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUKKyAgVW5zYWZlQXJlbmFSZWxlYXNlRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE1lc3NhZ2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpVbnNhZmVBcmVuYVJlbGVhc2UoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgR2V0RXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE1lc3NhZ2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIGludCBpbmRleCkgY29uc3QgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXQoaWQubnVtYmVyKCksIF9pbXBsXy5fZXh0ZW5zaW9uc18sIGluZGV4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpNdXRhYmxlVHlwZSBNdXRhYmxlRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE1lc3NhZ2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIGludCBpbmRleCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBpbmRleCwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBNZXNzYWdlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgICBpbnQgaW5kZXgsIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6Q29uc3RUeXBlIHZhbHVlKSB7CisgICAgX3Byb3RvX1R5cGVUcmFpdHM6OlNldChpZC5udW1iZXIoKSwgaW5kZXgsIHZhbHVlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpNdXRhYmxlVHlwZSBBZGRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgTWVzc2FnZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpNdXRhYmxlVHlwZSB0b19hZGQgPQorICAgICAgICBfcHJvdG9fVHlwZVRyYWl0czo6QWRkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgICAgcmV0dXJuIHRvX2FkZDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBBZGRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgTWVzc2FnZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6QWRkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpSZXBlYXRlZEZpZWxkVHlwZSYKKyAgR2V0UmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgTWVzc2FnZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkdldFJlcGVhdGVkKGlkLm51bWJlcigpLCBfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpSZXBlYXRlZEZpZWxkVHlwZSoKKyAgTXV0YWJsZVJlcGVhdGVkRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE1lc3NhZ2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlUmVwZWF0ZWQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pc19wYWNrZWQsICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0IF9leHRlbnNpb25zXzsKKworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6SGFzQml0czwxPiBfaGFzX2JpdHNfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworICAgIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfOworICAgIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl87CisgICAgYm9vbCBkZXByZWNhdGVkXzsKKyAgICBib29sIG1hcF9lbnRyeV87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRmllbGRPcHRpb25zIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIEZpZWxkT3B0aW9ucygpIDogRmllbGRPcHRpb25zKG51bGxwdHIpIHt9CisgIH5GaWVsZE9wdGlvbnMoKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIEZpZWxkT3B0aW9ucyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIEZpZWxkT3B0aW9ucyhjb25zdCBGaWVsZE9wdGlvbnMmIGZyb20pOworICBGaWVsZE9wdGlvbnMoRmllbGRPcHRpb25zJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IEZpZWxkT3B0aW9ucygpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIEZpZWxkT3B0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IEZpZWxkT3B0aW9ucyYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgRmllbGRPcHRpb25zJiBvcGVyYXRvcj0oRmllbGRPcHRpb25zJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKTsKKyAgfQorICBpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBGaWVsZE9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBGaWVsZE9wdGlvbnMqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRmllbGRPcHRpb25zKj4oCisgICAgICAgICAgICAgICAmX0ZpZWxkT3B0aW9uc19kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDE1OworCisgIGZyaWVuZCB2b2lkIHN3YXAoRmllbGRPcHRpb25zJiBhLCBGaWVsZE9wdGlvbnMmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoRmllbGRPcHRpb25zKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChGaWVsZE9wdGlvbnMqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZpZWxkT3B0aW9ucyogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxGaWVsZE9wdGlvbnM+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgRmllbGRPcHRpb25zJiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IEZpZWxkT3B0aW9ucyYgZnJvbSkgeworICAgIEZpZWxkT3B0aW9uczo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKEZpZWxkT3B0aW9ucyogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMiOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgRmllbGRPcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdHlwZWRlZiBGaWVsZE9wdGlvbnNfQ1R5cGUgQ1R5cGU7CisgIHN0YXRpYyBjb25zdGV4cHIgQ1R5cGUgU1RSSU5HID0KKyAgICBGaWVsZE9wdGlvbnNfQ1R5cGVfU1RSSU5HOworICBzdGF0aWMgY29uc3RleHByIENUeXBlIENPUkQgPQorICAgIEZpZWxkT3B0aW9uc19DVHlwZV9DT1JEOworICBzdGF0aWMgY29uc3RleHByIENUeXBlIFNUUklOR19QSUVDRSA9CisgICAgRmllbGRPcHRpb25zX0NUeXBlX1NUUklOR19QSUVDRTsKKyAgc3RhdGljIGlubGluZSBib29sIENUeXBlX0lzVmFsaWQoaW50IHZhbHVlKSB7CisgICAgcmV0dXJuIEZpZWxkT3B0aW9uc19DVHlwZV9Jc1ZhbGlkKHZhbHVlKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIENUeXBlIENUeXBlX01JTiA9CisgICAgRmllbGRPcHRpb25zX0NUeXBlX0NUeXBlX01JTjsKKyAgc3RhdGljIGNvbnN0ZXhwciBDVHlwZSBDVHlwZV9NQVggPQorICAgIEZpZWxkT3B0aW9uc19DVHlwZV9DVHlwZV9NQVg7CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IENUeXBlX0FSUkFZU0laRSA9CisgICAgRmllbGRPcHRpb25zX0NUeXBlX0NUeXBlX0FSUkFZU0laRTsKKyAgc3RhdGljIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3IqCisgIENUeXBlX2Rlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEZpZWxkT3B0aW9uc19DVHlwZV9kZXNjcmlwdG9yKCk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgc3RhdGljIGlubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgQ1R5cGVfTmFtZShUIGVudW1fdF92YWx1ZSkgeworICAgIHN0YXRpY19hc3NlcnQoOjpzdGQ6OmlzX3NhbWU8VCwgQ1R5cGU+Ojp2YWx1ZSB8fAorICAgICAgOjpzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSwKKyAgICAgICJJbmNvcnJlY3QgdHlwZSBwYXNzZWQgdG8gZnVuY3Rpb24gQ1R5cGVfTmFtZS4iKTsKKyAgICByZXR1cm4gRmllbGRPcHRpb25zX0NUeXBlX05hbWUoZW51bV90X3ZhbHVlKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgQ1R5cGVfUGFyc2UoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkNvbnN0U3RyaW5nUGFyYW0gbmFtZSwKKyAgICAgIENUeXBlKiB2YWx1ZSkgeworICAgIHJldHVybiBGaWVsZE9wdGlvbnNfQ1R5cGVfUGFyc2UobmFtZSwgdmFsdWUpOworICB9CisKKyAgdHlwZWRlZiBGaWVsZE9wdGlvbnNfSlNUeXBlIEpTVHlwZTsKKyAgc3RhdGljIGNvbnN0ZXhwciBKU1R5cGUgSlNfTk9STUFMID0KKyAgICBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTX05PUk1BTDsKKyAgc3RhdGljIGNvbnN0ZXhwciBKU1R5cGUgSlNfU1RSSU5HID0KKyAgICBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTX1NUUklORzsKKyAgc3RhdGljIGNvbnN0ZXhwciBKU1R5cGUgSlNfTlVNQkVSID0KKyAgICBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTX05VTUJFUjsKKyAgc3RhdGljIGlubGluZSBib29sIEpTVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICAgIHJldHVybiBGaWVsZE9wdGlvbnNfSlNUeXBlX0lzVmFsaWQodmFsdWUpOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgSlNUeXBlIEpTVHlwZV9NSU4gPQorICAgIEZpZWxkT3B0aW9uc19KU1R5cGVfSlNUeXBlX01JTjsKKyAgc3RhdGljIGNvbnN0ZXhwciBKU1R5cGUgSlNUeXBlX01BWCA9CisgICAgRmllbGRPcHRpb25zX0pTVHlwZV9KU1R5cGVfTUFYOworICBzdGF0aWMgY29uc3RleHByIGludCBKU1R5cGVfQVJSQVlTSVpFID0KKyAgICBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTVHlwZV9BUlJBWVNJWkU7CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yKgorICBKU1R5cGVfZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gRmllbGRPcHRpb25zX0pTVHlwZV9kZXNjcmlwdG9yKCk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgc3RhdGljIGlubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgSlNUeXBlX05hbWUoVCBlbnVtX3RfdmFsdWUpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KDo6c3RkOjppc19zYW1lPFQsIEpTVHlwZT46OnZhbHVlIHx8CisgICAgICA6OnN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLAorICAgICAgIkluY29ycmVjdCB0eXBlIHBhc3NlZCB0byBmdW5jdGlvbiBKU1R5cGVfTmFtZS4iKTsKKyAgICByZXR1cm4gRmllbGRPcHRpb25zX0pTVHlwZV9OYW1lKGVudW1fdF92YWx1ZSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIEpTVHlwZV9QYXJzZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Q29uc3RTdHJpbmdQYXJhbSBuYW1lLAorICAgICAgSlNUeXBlKiB2YWx1ZSkgeworICAgIHJldHVybiBGaWVsZE9wdGlvbnNfSlNUeXBlX1BhcnNlKG5hbWUsIHZhbHVlKTsKKyAgfQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OSwKKyAgICBrQ3R5cGVGaWVsZE51bWJlciA9IDEsCisgICAga0pzdHlwZUZpZWxkTnVtYmVyID0gNiwKKyAgICBrUGFja2VkRmllbGROdW1iZXIgPSAyLAorICAgIGtMYXp5RmllbGROdW1iZXIgPSA1LAorICAgIGtVbnZlcmlmaWVkTGF6eUZpZWxkTnVtYmVyID0gMTUsCisgICAga0RlcHJlY2F0ZWRGaWVsZE51bWJlciA9IDMsCisgICAga1dlYWtGaWVsZE51bWJlciA9IDEwLAorICB9OworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGludCBfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uID4qCisgICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiBfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIF9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIGFkZF91bmludGVycHJldGVkX29wdGlvbigpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKKyAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7CisKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKKyAgYm9vbCBoYXNfY3R5cGUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX2N0eXBlKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9jdHlwZSgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zX0NUeXBlIGN0eXBlKCkgY29uc3Q7CisgIHZvaWQgc2V0X2N0eXBlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnNfQ1R5cGUgdmFsdWUpOworICBwcml2YXRlOgorICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zX0NUeXBlIF9pbnRlcm5hbF9jdHlwZSgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfY3R5cGUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9uc19DVHlwZSB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGUganN0eXBlID0gNiBbZGVmYXVsdCA9IEpTX05PUk1BTF07CisgIGJvb2wgaGFzX2pzdHlwZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfanN0eXBlKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9qc3R5cGUoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9uc19KU1R5cGUganN0eXBlKCkgY29uc3Q7CisgIHZvaWQgc2V0X2pzdHlwZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zX0pTVHlwZSB2YWx1ZSk7CisgIHByaXZhdGU6CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnNfSlNUeXBlIF9pbnRlcm5hbF9qc3R5cGUoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X2pzdHlwZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zX0pTVHlwZSB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBib29sIHBhY2tlZCA9IDI7CisgIGJvb2wgaGFzX3BhY2tlZCgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfcGFja2VkKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9wYWNrZWQoKTsKKyAgYm9vbCBwYWNrZWQoKSBjb25zdDsKKyAgdm9pZCBzZXRfcGFja2VkKGJvb2wgdmFsdWUpOworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9wYWNrZWQoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X3BhY2tlZChib29sIHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIGJvb2wgbGF6eSA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CisgIGJvb2wgaGFzX2xhenkoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX2xhenkoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2xhenkoKTsKKyAgYm9vbCBsYXp5KCkgY29uc3Q7CisgIHZvaWQgc2V0X2xhenkoYm9vbCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2xhenkoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X2xhenkoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBib29sIHVudmVyaWZpZWRfbGF6eSA9IDE1IFtkZWZhdWx0ID0gZmFsc2VdOworICBib29sIGhhc191bnZlcmlmaWVkX2xhenkoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX3VudmVyaWZpZWRfbGF6eSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfdW52ZXJpZmllZF9sYXp5KCk7CisgIGJvb2wgdW52ZXJpZmllZF9sYXp5KCkgY29uc3Q7CisgIHZvaWQgc2V0X3VudmVyaWZpZWRfbGF6eShib29sIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfdW52ZXJpZmllZF9sYXp5KCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF91bnZlcmlmaWVkX2xhenkoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICBib29sIGhhc19kZXByZWNhdGVkKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19kZXByZWNhdGVkKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9kZXByZWNhdGVkKCk7CisgIGJvb2wgZGVwcmVjYXRlZCgpIGNvbnN0OworICB2b2lkIHNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpOworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9kZXByZWNhdGVkKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgYm9vbCB3ZWFrID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07CisgIGJvb2wgaGFzX3dlYWsoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX3dlYWsoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3dlYWsoKTsKKyAgYm9vbCB3ZWFrKCkgY29uc3Q7CisgIHZvaWQgc2V0X3dlYWsoYm9vbCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX3dlYWsoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X3dlYWsoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgYm9vbCBIYXNFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRmllbGRPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9pbXBsXy5fZXh0ZW5zaW9uc18uSGFzKGlkLm51bWJlcigpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBDbGVhckV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBGaWVsZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisgICAgX2ltcGxfLl9leHRlbnNpb25zXy5DbGVhckV4dGVuc2lvbihpZC5udW1iZXIoKSk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgaW50IEV4dGVuc2lvblNpemUoCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRmllbGRPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9pbXBsXy5fZXh0ZW5zaW9uc18uRXh0ZW5zaW9uU2l6ZShpZC5udW1iZXIoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6Q29uc3RUeXBlIEdldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBGaWVsZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkdldChpZC5udW1iZXIoKSwgX2ltcGxfLl9leHRlbnNpb25zXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC5kZWZhdWx0X3ZhbHVlKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRmllbGRPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBGaWVsZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpDb25zdFR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6U2V0KGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgdmFsdWUsICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEFsbG9jYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBGaWVsZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXRBbGxvY2F0ZWQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBVbnNhZmVBcmVuYVNldEFsbG9jYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBGaWVsZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpVbnNhZmVBcmVuYVNldEFsbG9jYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgUFJPVE9CVUZfTk9ESVNDQVJEIGlubGluZQorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZQorICAgICAgUmVsZWFzZUV4dGVuc2lvbigKKyAgICAgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgICAgIEZpZWxkT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6UmVsZWFzZShpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUKKyAgVW5zYWZlQXJlbmFSZWxlYXNlRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEZpZWxkT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6VW5zYWZlQXJlbmFSZWxlYXNlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6Q29uc3RUeXBlIEdldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBGaWVsZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgaW50IGluZGV4KSBjb25zdCB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkdldChpZC5udW1iZXIoKSwgX2ltcGxfLl9leHRlbnNpb25zXywgaW5kZXgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRmllbGRPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIGludCBpbmRleCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBpbmRleCwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBGaWVsZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgaW50IGluZGV4LCB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OkNvbnN0VHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXQoaWQubnVtYmVyKCksIGluZGV4LCB2YWx1ZSwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6TXV0YWJsZVR5cGUgQWRkRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEZpZWxkT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKyAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIHRvX2FkZCA9CisgICAgICAgIF9wcm90b19UeXBlVHJhaXRzOjpBZGQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgICByZXR1cm4gdG9fYWRkOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIEFkZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBGaWVsZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6QWRkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpSZXBlYXRlZEZpZWxkVHlwZSYKKyAgR2V0UmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRmllbGRPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXRSZXBlYXRlZChpZC5udW1iZXIoKSwgX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6UmVwZWF0ZWRGaWVsZFR5cGUqCisgIE11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBGaWVsZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGVSZXBlYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lzX3BhY2tlZCwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0IF9leHRlbnNpb25zXzsKKworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6SGFzQml0czwxPiBfaGFzX2JpdHNfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworICAgIGludCBjdHlwZV87CisgICAgaW50IGpzdHlwZV87CisgICAgYm9vbCBwYWNrZWRfOworICAgIGJvb2wgbGF6eV87CisgICAgYm9vbCB1bnZlcmlmaWVkX2xhenlfOworICAgIGJvb2wgZGVwcmVjYXRlZF87CisgICAgYm9vbCB3ZWFrXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBPbmVvZk9wdGlvbnMgZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgT25lb2ZPcHRpb25zKCkgOiBPbmVvZk9wdGlvbnMobnVsbHB0cikge30KKyAgfk9uZW9mT3B0aW9ucygpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgT25lb2ZPcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgT25lb2ZPcHRpb25zKGNvbnN0IE9uZW9mT3B0aW9ucyYgZnJvbSk7CisgIE9uZW9mT3B0aW9ucyhPbmVvZk9wdGlvbnMmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogT25lb2ZPcHRpb25zKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgT25lb2ZPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgT25lb2ZPcHRpb25zJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBPbmVvZk9wdGlvbnMmIG9wZXJhdG9yPShPbmVvZk9wdGlvbnMmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpOworICB9CisgIGlubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IE9uZW9mT3B0aW9ucyYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gKmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IE9uZW9mT3B0aW9ucyogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBPbmVvZk9wdGlvbnMqPigKKyAgICAgICAgICAgICAgICZfT25lb2ZPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9CisgICAgMTY7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChPbmVvZk9wdGlvbnMmIGEsIE9uZW9mT3B0aW9ucyYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChPbmVvZk9wdGlvbnMqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKE9uZW9mT3B0aW9ucyogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgT25lb2ZPcHRpb25zKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPE9uZW9mT3B0aW9ucz4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBPbmVvZk9wdGlvbnMmIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgT25lb2ZPcHRpb25zJiBmcm9tKSB7CisgICAgT25lb2ZPcHRpb25zOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoT25lb2ZPcHRpb25zKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucyI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBPbmVvZk9wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTksCisgIH07CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgaW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKKyAgICAgIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIF9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogX2ludGVybmFsX2FkZF91bmludGVycHJldGVkX29wdGlvbigpOworICBwdWJsaWM6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKKworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgYm9vbCBIYXNFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgT25lb2ZPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9pbXBsXy5fZXh0ZW5zaW9uc18uSGFzKGlkLm51bWJlcigpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBDbGVhckV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBPbmVvZk9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisgICAgX2ltcGxfLl9leHRlbnNpb25zXy5DbGVhckV4dGVuc2lvbihpZC5udW1iZXIoKSk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgaW50IEV4dGVuc2lvblNpemUoCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgT25lb2ZPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9pbXBsXy5fZXh0ZW5zaW9uc18uRXh0ZW5zaW9uU2l6ZShpZC5udW1iZXIoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6Q29uc3RUeXBlIEdldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBPbmVvZk9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkdldChpZC5udW1iZXIoKSwgX2ltcGxfLl9leHRlbnNpb25zXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC5kZWZhdWx0X3ZhbHVlKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgT25lb2ZPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBPbmVvZk9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpDb25zdFR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6U2V0KGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgdmFsdWUsICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEFsbG9jYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBPbmVvZk9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXRBbGxvY2F0ZWQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBVbnNhZmVBcmVuYVNldEFsbG9jYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBPbmVvZk9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpVbnNhZmVBcmVuYVNldEFsbG9jYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgUFJPVE9CVUZfTk9ESVNDQVJEIGlubGluZQorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZQorICAgICAgUmVsZWFzZUV4dGVuc2lvbigKKyAgICAgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgICAgIE9uZW9mT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6UmVsZWFzZShpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUKKyAgVW5zYWZlQXJlbmFSZWxlYXNlRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE9uZW9mT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6VW5zYWZlQXJlbmFSZWxlYXNlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6Q29uc3RUeXBlIEdldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBPbmVvZk9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgaW50IGluZGV4KSBjb25zdCB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkdldChpZC5udW1iZXIoKSwgX2ltcGxfLl9leHRlbnNpb25zXywgaW5kZXgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgT25lb2ZPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIGludCBpbmRleCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBpbmRleCwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBPbmVvZk9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgaW50IGluZGV4LCB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OkNvbnN0VHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXQoaWQubnVtYmVyKCksIGluZGV4LCB2YWx1ZSwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6TXV0YWJsZVR5cGUgQWRkRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE9uZW9mT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKyAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIHRvX2FkZCA9CisgICAgICAgIF9wcm90b19UeXBlVHJhaXRzOjpBZGQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgICByZXR1cm4gdG9fYWRkOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIEFkZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBPbmVvZk9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6QWRkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpSZXBlYXRlZEZpZWxkVHlwZSYKKyAgR2V0UmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgT25lb2ZPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXRSZXBlYXRlZChpZC5udW1iZXIoKSwgX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6UmVwZWF0ZWRGaWVsZFR5cGUqCisgIE11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBPbmVvZk9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGVSZXBlYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lzX3BhY2tlZCwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0IF9leHRlbnNpb25zXzsKKworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEVudW1PcHRpb25zIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgRW51bU9wdGlvbnMoKSA6IEVudW1PcHRpb25zKG51bGxwdHIpIHt9CisgIH5FbnVtT3B0aW9ucygpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgRW51bU9wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBFbnVtT3B0aW9ucyhjb25zdCBFbnVtT3B0aW9ucyYgZnJvbSk7CisgIEVudW1PcHRpb25zKEVudW1PcHRpb25zJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IEVudW1PcHRpb25zKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgRW51bU9wdGlvbnMmIG9wZXJhdG9yPShjb25zdCBFbnVtT3B0aW9ucyYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgRW51bU9wdGlvbnMmIG9wZXJhdG9yPShFbnVtT3B0aW9ucyYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSk7CisgIH0KKyAgaW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgRW51bU9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBFbnVtT3B0aW9ucyogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbnVtT3B0aW9ucyo+KAorICAgICAgICAgICAgICAgJl9FbnVtT3B0aW9uc19kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDE3OworCisgIGZyaWVuZCB2b2lkIHN3YXAoRW51bU9wdGlvbnMmIGEsIEVudW1PcHRpb25zJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKEVudW1PcHRpb25zKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChFbnVtT3B0aW9ucyogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRW51bU9wdGlvbnMqIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8RW51bU9wdGlvbnM+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgRW51bU9wdGlvbnMmIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgRW51bU9wdGlvbnMmIGZyb20pIHsKKyAgICBFbnVtT3B0aW9uczo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKEVudW1PcHRpb25zKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEVudW1PcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyID0gOTk5LAorICAgIGtBbGxvd0FsaWFzRmllbGROdW1iZXIgPSAyLAorICAgIGtEZXByZWNhdGVkRmllbGROdW1iZXIgPSAzLAorICB9OworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGludCBfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uID4qCisgICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiBfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIF9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIGFkZF91bmludGVycHJldGVkX29wdGlvbigpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKKyAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBhbGxvd19hbGlhcyA9IDI7CisgIGJvb2wgaGFzX2FsbG93X2FsaWFzKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19hbGxvd19hbGlhcygpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfYWxsb3dfYWxpYXMoKTsKKyAgYm9vbCBhbGxvd19hbGlhcygpIGNvbnN0OworICB2b2lkIHNldF9hbGxvd19hbGlhcyhib29sIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfYWxsb3dfYWxpYXMoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X2FsbG93X2FsaWFzKGJvb2wgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgYm9vbCBoYXNfZGVwcmVjYXRlZCgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfZGVwcmVjYXRlZCgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfZGVwcmVjYXRlZCgpOworICBib29sIGRlcHJlY2F0ZWQoKSBjb25zdDsKKyAgdm9pZCBzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfZGVwcmVjYXRlZCgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKTsKKyAgcHVibGljOgorCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSBib29sIEhhc0V4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFbnVtT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsKKworICAgIHJldHVybiBfaW1wbF8uX2V4dGVuc2lvbnNfLkhhcyhpZC5udW1iZXIoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHZvaWQgQ2xlYXJFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRW51bU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisgICAgX2ltcGxfLl9leHRlbnNpb25zXy5DbGVhckV4dGVuc2lvbihpZC5udW1iZXIoKSk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgaW50IEV4dGVuc2lvblNpemUoCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRW51bU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CisKKyAgICByZXR1cm4gX2ltcGxfLl9leHRlbnNpb25zXy5FeHRlbnNpb25TaXplKGlkLm51bWJlcigpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpDb25zdFR5cGUgR2V0RXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEVudW1PcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXQoaWQubnVtYmVyKCksIF9pbXBsXy5fZXh0ZW5zaW9uc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQuZGVmYXVsdF92YWx1ZSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZSBNdXRhYmxlRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEVudW1PcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFbnVtT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6OkNvbnN0VHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCB2YWx1ZSwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHZvaWQgU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEVudW1PcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6U2V0QWxsb2NhdGVkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHZvaWQgVW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRW51bU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpVbnNhZmVBcmVuYVNldEFsbG9jYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgUFJPVE9CVUZfTk9ESVNDQVJEIGlubGluZQorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZQorICAgICAgUmVsZWFzZUV4dGVuc2lvbigKKyAgICAgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgICAgIEVudW1PcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpSZWxlYXNlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZQorICBVbnNhZmVBcmVuYVJlbGVhc2VFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRW51bU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OlVuc2FmZUFyZW5hUmVsZWFzZShpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OkNvbnN0VHlwZSBHZXRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRW51bU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgaW50IGluZGV4KSBjb25zdCB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkdldChpZC5udW1iZXIoKSwgX2ltcGxfLl9leHRlbnNpb25zXywgaW5kZXgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRW51bU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgaW50IGluZGV4KSB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGUoaWQubnVtYmVyKCksIGluZGV4LCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHZvaWQgU2V0RXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEVudW1PcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIGludCBpbmRleCwgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6U2V0KGlkLm51bWJlcigpLCBpbmRleCwgdmFsdWUsICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIEFkZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFbnVtT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKyAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIHRvX2FkZCA9CisgICAgICAgIF9wcm90b19UeXBlVHJhaXRzOjpBZGQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgICByZXR1cm4gdG9fYWRkOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIEFkZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFbnVtT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OkNvbnN0VHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpBZGQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCBfaXNfcGFja2VkLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSBjb25zdCB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OlJlcGVhdGVkRmllbGRUeXBlJgorICBHZXRSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFbnVtT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6R2V0UmVwZWF0ZWQoaWQubnVtYmVyKCksIF9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OlJlcGVhdGVkRmllbGRUeXBlKgorICBNdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRW51bU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGVSZXBlYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lzX3BhY2tlZCwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucykKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25TZXQgX2V4dGVuc2lvbnNfOworCisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpIYXNCaXRzPDE+IF9oYXNfYml0c187CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiB1bmludGVycHJldGVkX29wdGlvbl87CisgICAgYm9vbCBhbGxvd19hbGlhc187CisgICAgYm9vbCBkZXByZWNhdGVkXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBFbnVtVmFsdWVPcHRpb25zIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBFbnVtVmFsdWVPcHRpb25zKCkgOiBFbnVtVmFsdWVPcHRpb25zKG51bGxwdHIpIHt9CisgIH5FbnVtVmFsdWVPcHRpb25zKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBFbnVtVmFsdWVPcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgRW51bVZhbHVlT3B0aW9ucyhjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBmcm9tKTsKKyAgRW51bVZhbHVlT3B0aW9ucyhFbnVtVmFsdWVPcHRpb25zJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IEVudW1WYWx1ZU9wdGlvbnMoKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBFbnVtVmFsdWVPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgRW51bVZhbHVlT3B0aW9ucyYgb3BlcmF0b3I9KEVudW1WYWx1ZU9wdGlvbnMmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpOworICB9CisgIGlubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBFbnVtVmFsdWVPcHRpb25zKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMqPigKKyAgICAgICAgICAgICAgICZfRW51bVZhbHVlT3B0aW9uc19kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDE4OworCisgIGZyaWVuZCB2b2lkIHN3YXAoRW51bVZhbHVlT3B0aW9ucyYgYSwgRW51bVZhbHVlT3B0aW9ucyYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChFbnVtVmFsdWVPcHRpb25zKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChFbnVtVmFsdWVPcHRpb25zKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBFbnVtVmFsdWVPcHRpb25zKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPEVudW1WYWx1ZU9wdGlvbnM+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBmcm9tKSB7CisgICAgRW51bVZhbHVlT3B0aW9uczo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKEVudW1WYWx1ZU9wdGlvbnMqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBFbnVtVmFsdWVPcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyID0gOTk5LAorICAgIGtEZXByZWNhdGVkRmllbGROdW1iZXIgPSAxLAorICB9OworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGludCBfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uID4qCisgICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiBfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIF9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIGFkZF91bmludGVycHJldGVkX29wdGlvbigpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKKyAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgYm9vbCBoYXNfZGVwcmVjYXRlZCgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfZGVwcmVjYXRlZCgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfZGVwcmVjYXRlZCgpOworICBib29sIGRlcHJlY2F0ZWQoKSBjb25zdDsKKyAgdm9pZCBzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfZGVwcmVjYXRlZCgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKTsKKyAgcHVibGljOgorCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSBib29sIEhhc0V4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFbnVtVmFsdWVPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9pbXBsXy5fZXh0ZW5zaW9uc18uSGFzKGlkLm51bWJlcigpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBDbGVhckV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFbnVtVmFsdWVPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworICAgIF9pbXBsXy5fZXh0ZW5zaW9uc18uQ2xlYXJFeHRlbnNpb24oaWQubnVtYmVyKCkpOworCisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIGludCBFeHRlbnNpb25TaXplKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEVudW1WYWx1ZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CisKKyAgICByZXR1cm4gX2ltcGxfLl9leHRlbnNpb25zXy5FeHRlbnNpb25TaXplKGlkLm51bWJlcigpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpDb25zdFR5cGUgR2V0RXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEVudW1WYWx1ZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkdldChpZC5udW1iZXIoKSwgX2ltcGxfLl9leHRlbnNpb25zXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC5kZWZhdWx0X3ZhbHVlKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRW51bVZhbHVlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6TXV0YWJsZShpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBTZXRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRW51bVZhbHVlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6OkNvbnN0VHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCB2YWx1ZSwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHZvaWQgU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEVudW1WYWx1ZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXRBbGxvY2F0ZWQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBVbnNhZmVBcmVuYVNldEFsbG9jYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFbnVtVmFsdWVPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6VW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIFBST1RPQlVGX05PRElTQ0FSRCBpbmxpbmUKKyAgICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUKKyAgICAgIFJlbGVhc2VFeHRlbnNpb24oCisgICAgICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgICAgICBFbnVtVmFsdWVPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpSZWxlYXNlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZQorICBVbnNhZmVBcmVuYVJlbGVhc2VFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRW51bVZhbHVlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6VW5zYWZlQXJlbmFSZWxlYXNlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6Q29uc3RUeXBlIEdldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFbnVtVmFsdWVPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIGludCBpbmRleCkgY29uc3QgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXQoaWQubnVtYmVyKCksIF9pbXBsXy5fZXh0ZW5zaW9uc18sIGluZGV4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpNdXRhYmxlVHlwZSBNdXRhYmxlRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEVudW1WYWx1ZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgaW50IGluZGV4KSB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGUoaWQubnVtYmVyKCksIGluZGV4LCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHZvaWQgU2V0RXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEVudW1WYWx1ZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgaW50IGluZGV4LCB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OkNvbnN0VHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXQoaWQubnVtYmVyKCksIGluZGV4LCB2YWx1ZSwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6TXV0YWJsZVR5cGUgQWRkRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIEVudW1WYWx1ZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpNdXRhYmxlVHlwZSB0b19hZGQgPQorICAgICAgICBfcHJvdG9fVHlwZVRyYWl0czo6QWRkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgICAgcmV0dXJuIHRvX2FkZDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBBZGRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgRW51bVZhbHVlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OkNvbnN0VHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpBZGQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCBfaXNfcGFja2VkLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSBjb25zdCB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OlJlcGVhdGVkRmllbGRUeXBlJgorICBHZXRSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFbnVtVmFsdWVPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXRSZXBlYXRlZChpZC5udW1iZXIoKSwgX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6UmVwZWF0ZWRGaWVsZFR5cGUqCisgIE11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBFbnVtVmFsdWVPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlUmVwZWF0ZWQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pc19wYWNrZWQsICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25TZXQgX2V4dGVuc2lvbnNfOworCisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpIYXNCaXRzPDE+IF9oYXNfYml0c187CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiB1bmludGVycHJldGVkX29wdGlvbl87CisgICAgYm9vbCBkZXByZWNhdGVkXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBTZXJ2aWNlT3B0aW9ucyBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIFNlcnZpY2VPcHRpb25zKCkgOiBTZXJ2aWNlT3B0aW9ucyhudWxscHRyKSB7fQorICB+U2VydmljZU9wdGlvbnMoKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIFNlcnZpY2VPcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgU2VydmljZU9wdGlvbnMoY29uc3QgU2VydmljZU9wdGlvbnMmIGZyb20pOworICBTZXJ2aWNlT3B0aW9ucyhTZXJ2aWNlT3B0aW9ucyYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBTZXJ2aWNlT3B0aW9ucygpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIFNlcnZpY2VPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgU2VydmljZU9wdGlvbnMmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIFNlcnZpY2VPcHRpb25zJiBvcGVyYXRvcj0oU2VydmljZU9wdGlvbnMmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpOworICB9CisgIGlubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IFNlcnZpY2VPcHRpb25zJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgU2VydmljZU9wdGlvbnMqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2VydmljZU9wdGlvbnMqPigKKyAgICAgICAgICAgICAgICZfU2VydmljZU9wdGlvbnNfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAxOTsKKworICBmcmllbmQgdm9pZCBzd2FwKFNlcnZpY2VPcHRpb25zJiBhLCBTZXJ2aWNlT3B0aW9ucyYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChTZXJ2aWNlT3B0aW9ucyogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICBHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICAjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdlbmVyaWNTd2FwKHRoaXMsIG90aGVyKTsKKyAgICB9CisgIH0KKyAgdm9pZCBVbnNhZmVBcmVuYVN3YXAoU2VydmljZU9wdGlvbnMqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFNlcnZpY2VPcHRpb25zKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPFNlcnZpY2VPcHRpb25zPihhcmVuYSk7CisgIH0KKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlGcm9tOworICB2b2lkIENvcHlGcm9tKGNvbnN0IFNlcnZpY2VPcHRpb25zJiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IFNlcnZpY2VPcHRpb25zJiBmcm9tKSB7CisgICAgU2VydmljZU9wdGlvbnM6Ok1lcmdlSW1wbCgqdGhpcywgZnJvbSk7CisgIH0KKyAgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgTWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZyk7CisgIHB1YmxpYzoKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IGZpbmFsOworICB2b2lkIEludGVybmFsU3dhcChTZXJ2aWNlT3B0aW9ucyogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBTZXJ2aWNlT3B0aW9ucyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXzsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDsKKworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OSwKKyAgICBrRGVwcmVjYXRlZEZpZWxkTnVtYmVyID0gMzMsCisgIH07CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgaW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKKyAgICAgIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIF9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogX2ludGVybmFsX2FkZF91bmludGVycHJldGVkX29wdGlvbigpOworICBwdWJsaWM6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKKworICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgYm9vbCBoYXNfZGVwcmVjYXRlZCgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfZGVwcmVjYXRlZCgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfZGVwcmVjYXRlZCgpOworICBib29sIGRlcHJlY2F0ZWQoKSBjb25zdDsKKyAgdm9pZCBzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfZGVwcmVjYXRlZCgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKTsKKyAgcHVibGljOgorCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSBib29sIEhhc0V4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBTZXJ2aWNlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsKKworICAgIHJldHVybiBfaW1wbF8uX2V4dGVuc2lvbnNfLkhhcyhpZC5udW1iZXIoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHZvaWQgQ2xlYXJFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgU2VydmljZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisgICAgX2ltcGxfLl9leHRlbnNpb25zXy5DbGVhckV4dGVuc2lvbihpZC5udW1iZXIoKSk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgaW50IEV4dGVuc2lvblNpemUoCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgU2VydmljZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CisKKyAgICByZXR1cm4gX2ltcGxfLl9leHRlbnNpb25zXy5FeHRlbnNpb25TaXplKGlkLm51bWJlcigpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpDb25zdFR5cGUgR2V0RXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIFNlcnZpY2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXQoaWQubnVtYmVyKCksIF9pbXBsXy5fZXh0ZW5zaW9uc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQuZGVmYXVsdF92YWx1ZSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZSBNdXRhYmxlRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIFNlcnZpY2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBTZXJ2aWNlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6OkNvbnN0VHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCB2YWx1ZSwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHZvaWQgU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIFNlcnZpY2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6U2V0QWxsb2NhdGVkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHZvaWQgVW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgU2VydmljZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpVbnNhZmVBcmVuYVNldEFsbG9jYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgUFJPVE9CVUZfTk9ESVNDQVJEIGlubGluZQorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZQorICAgICAgUmVsZWFzZUV4dGVuc2lvbigKKyAgICAgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgICAgIFNlcnZpY2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpSZWxlYXNlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZQorICBVbnNhZmVBcmVuYVJlbGVhc2VFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgU2VydmljZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OlVuc2FmZUFyZW5hUmVsZWFzZShpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OkNvbnN0VHlwZSBHZXRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgU2VydmljZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgaW50IGluZGV4KSBjb25zdCB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkdldChpZC5udW1iZXIoKSwgX2ltcGxfLl9leHRlbnNpb25zXywgaW5kZXgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgU2VydmljZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgaW50IGluZGV4KSB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGUoaWQubnVtYmVyKCksIGluZGV4LCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHZvaWQgU2V0RXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIFNlcnZpY2VPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIGludCBpbmRleCwgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgdmFsdWUpIHsKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6U2V0KGlkLm51bWJlcigpLCBpbmRleCwgdmFsdWUsICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIEFkZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBTZXJ2aWNlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKyAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIHRvX2FkZCA9CisgICAgICAgIF9wcm90b19UeXBlVHJhaXRzOjpBZGQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgICByZXR1cm4gdG9fYWRkOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIEFkZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBTZXJ2aWNlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OkNvbnN0VHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpBZGQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCBfaXNfcGFja2VkLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSBjb25zdCB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OlJlcGVhdGVkRmllbGRUeXBlJgorICBHZXRSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBTZXJ2aWNlT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6R2V0UmVwZWF0ZWQoaWQubnVtYmVyKCksIF9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OlJlcGVhdGVkRmllbGRUeXBlKgorICBNdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgU2VydmljZU9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGVSZXBlYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lzX3BhY2tlZCwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25TZXQgX2V4dGVuc2lvbnNfOworCisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpIYXNCaXRzPDE+IF9oYXNfYml0c187CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiB1bmludGVycHJldGVkX29wdGlvbl87CisgICAgYm9vbCBkZXByZWNhdGVkXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBNZXRob2RPcHRpb25zIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBNZXRob2RPcHRpb25zKCkgOiBNZXRob2RPcHRpb25zKG51bGxwdHIpIHt9CisgIH5NZXRob2RPcHRpb25zKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBNZXRob2RPcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgTWV0aG9kT3B0aW9ucyhjb25zdCBNZXRob2RPcHRpb25zJiBmcm9tKTsKKyAgTWV0aG9kT3B0aW9ucyhNZXRob2RPcHRpb25zJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IE1ldGhvZE9wdGlvbnMoKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBNZXRob2RPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgTWV0aG9kT3B0aW9ucyYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgTWV0aG9kT3B0aW9ucyYgb3BlcmF0b3I9KE1ldGhvZE9wdGlvbnMmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpOworICB9CisgIGlubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IE1ldGhvZE9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBNZXRob2RPcHRpb25zKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IE1ldGhvZE9wdGlvbnMqPigKKyAgICAgICAgICAgICAgICZfTWV0aG9kT3B0aW9uc19kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDIwOworCisgIGZyaWVuZCB2b2lkIHN3YXAoTWV0aG9kT3B0aW9ucyYgYSwgTWV0aG9kT3B0aW9ucyYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChNZXRob2RPcHRpb25zKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChNZXRob2RPcHRpb25zKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBNZXRob2RPcHRpb25zKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPE1ldGhvZE9wdGlvbnM+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgTWV0aG9kT3B0aW9ucyYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBNZXRob2RPcHRpb25zJiBmcm9tKSB7CisgICAgTWV0aG9kT3B0aW9uczo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKE1ldGhvZE9wdGlvbnMqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBNZXRob2RPcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdHlwZWRlZiBNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWwgSWRlbXBvdGVuY3lMZXZlbDsKKyAgc3RhdGljIGNvbnN0ZXhwciBJZGVtcG90ZW5jeUxldmVsIElERU1QT1RFTkNZX1VOS05PV04gPQorICAgIE1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbF9JREVNUE9URU5DWV9VTktOT1dOOworICBzdGF0aWMgY29uc3RleHByIElkZW1wb3RlbmN5TGV2ZWwgTk9fU0lERV9FRkZFQ1RTID0KKyAgICBNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWxfTk9fU0lERV9FRkZFQ1RTOworICBzdGF0aWMgY29uc3RleHByIElkZW1wb3RlbmN5TGV2ZWwgSURFTVBPVEVOVCA9CisgICAgTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsX0lERU1QT1RFTlQ7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBJZGVtcG90ZW5jeUxldmVsX0lzVmFsaWQoaW50IHZhbHVlKSB7CisgICAgcmV0dXJuIE1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbF9Jc1ZhbGlkKHZhbHVlKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIElkZW1wb3RlbmN5TGV2ZWwgSWRlbXBvdGVuY3lMZXZlbF9NSU4gPQorICAgIE1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbF9JZGVtcG90ZW5jeUxldmVsX01JTjsKKyAgc3RhdGljIGNvbnN0ZXhwciBJZGVtcG90ZW5jeUxldmVsIElkZW1wb3RlbmN5TGV2ZWxfTUFYID0KKyAgICBNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWxfSWRlbXBvdGVuY3lMZXZlbF9NQVg7CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IElkZW1wb3RlbmN5TGV2ZWxfQVJSQVlTSVpFID0KKyAgICBNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWxfSWRlbXBvdGVuY3lMZXZlbF9BUlJBWVNJWkU7CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yKgorICBJZGVtcG90ZW5jeUxldmVsX2Rlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIE1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbF9kZXNjcmlwdG9yKCk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgc3RhdGljIGlubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgSWRlbXBvdGVuY3lMZXZlbF9OYW1lKFQgZW51bV90X3ZhbHVlKSB7CisgICAgc3RhdGljX2Fzc2VydCg6OnN0ZDo6aXNfc2FtZTxULCBJZGVtcG90ZW5jeUxldmVsPjo6dmFsdWUgfHwKKyAgICAgIDo6c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsCisgICAgICAiSW5jb3JyZWN0IHR5cGUgcGFzc2VkIHRvIGZ1bmN0aW9uIElkZW1wb3RlbmN5TGV2ZWxfTmFtZS4iKTsKKyAgICByZXR1cm4gTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsX05hbWUoZW51bV90X3ZhbHVlKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgSWRlbXBvdGVuY3lMZXZlbF9QYXJzZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Q29uc3RTdHJpbmdQYXJhbSBuYW1lLAorICAgICAgSWRlbXBvdGVuY3lMZXZlbCogdmFsdWUpIHsKKyAgICByZXR1cm4gTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsX1BhcnNlKG5hbWUsIHZhbHVlKTsKKyAgfQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OSwKKyAgICBrRGVwcmVjYXRlZEZpZWxkTnVtYmVyID0gMzMsCisgICAga0lkZW1wb3RlbmN5TGV2ZWxGaWVsZE51bWJlciA9IDM0LAorICB9OworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGludCBfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uID4qCisgICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiBfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIF9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIGFkZF91bmludGVycHJldGVkX29wdGlvbigpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKKyAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQgPSBmYWxzZV07CisgIGJvb2wgaGFzX2RlcHJlY2F0ZWQoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX2RlcHJlY2F0ZWQoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2RlcHJlY2F0ZWQoKTsKKyAgYm9vbCBkZXByZWNhdGVkKCkgY29uc3Q7CisgIHZvaWQgc2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2RlcHJlY2F0ZWQoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuSWRlbXBvdGVuY3lMZXZlbCBpZGVtcG90ZW5jeV9sZXZlbCA9IDM0IFtkZWZhdWx0ID0gSURFTVBPVEVOQ1lfVU5LTk9XTl07CisgIGJvb2wgaGFzX2lkZW1wb3RlbmN5X2xldmVsKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19pZGVtcG90ZW5jeV9sZXZlbCgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfaWRlbXBvdGVuY3lfbGV2ZWwoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbCBpZGVtcG90ZW5jeV9sZXZlbCgpIGNvbnN0OworICB2b2lkIHNldF9pZGVtcG90ZW5jeV9sZXZlbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbCBfaW50ZXJuYWxfaWRlbXBvdGVuY3lfbGV2ZWwoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X2lkZW1wb3RlbmN5X2xldmVsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWwgdmFsdWUpOworICBwdWJsaWM6CisKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIGJvb2wgSGFzRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE1ldGhvZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CisKKyAgICByZXR1cm4gX2ltcGxfLl9leHRlbnNpb25zXy5IYXMoaWQubnVtYmVyKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIENsZWFyRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE1ldGhvZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisgICAgX2ltcGxfLl9leHRlbnNpb25zXy5DbGVhckV4dGVuc2lvbihpZC5udW1iZXIoKSk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgaW50IEV4dGVuc2lvblNpemUoCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgTWV0aG9kT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsKKworICAgIHJldHVybiBfaW1wbF8uX2V4dGVuc2lvbnNfLkV4dGVuc2lvblNpemUoaWQubnVtYmVyKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6OkNvbnN0VHlwZSBHZXRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgTWV0aG9kT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6R2V0KGlkLm51bWJlcigpLCBfaW1wbF8uX2V4dGVuc2lvbnNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLmRlZmF1bHRfdmFsdWUoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUgTXV0YWJsZUV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBNZXRob2RPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBNZXRob2RPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6Q29uc3RUeXBlIHZhbHVlKSB7CisgICAgX3Byb3RvX1R5cGVUcmFpdHM6OlNldChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsIHZhbHVlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBTZXRBbGxvY2F0ZWRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgTWV0aG9kT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6Ok11dGFibGVUeXBlIHZhbHVlKSB7CisgICAgX3Byb3RvX1R5cGVUcmFpdHM6OlNldEFsbG9jYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE1ldGhvZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZSB2YWx1ZSkgeworICAgIF9wcm90b19UeXBlVHJhaXRzOjpVbnNhZmVBcmVuYVNldEFsbG9jYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgUFJPVE9CVUZfTk9ESVNDQVJEIGlubGluZQorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZQorICAgICAgUmVsZWFzZUV4dGVuc2lvbigKKyAgICAgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgICAgIE1ldGhvZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OlJlbGVhc2UoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6Ok11dGFibGVUeXBlCisgIFVuc2FmZUFyZW5hUmVsZWFzZUV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBNZXRob2RPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeworCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpVbnNhZmVBcmVuYVJlbGVhc2UoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgR2V0RXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE1ldGhvZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLAorICAgICAgaW50IGluZGV4KSBjb25zdCB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkdldChpZC5udW1iZXIoKSwgX2ltcGxfLl9leHRlbnNpb25zXywgaW5kZXgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgTWV0aG9kT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgICBpbnQgaW5kZXgpIHsKKworICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6TXV0YWJsZShpZC5udW1iZXIoKSwgaW5kZXgsICZfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdm9pZCBTZXRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgTWV0aG9kT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsCisgICAgICBpbnQgaW5kZXgsIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6Q29uc3RUeXBlIHZhbHVlKSB7CisgICAgX3Byb3RvX1R5cGVUcmFpdHM6OlNldChpZC5udW1iZXIoKSwgaW5kZXgsIHZhbHVlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpNdXRhYmxlVHlwZSBBZGRFeHRlbnNpb24oCisgICAgICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgICAgTWV0aG9kT3B0aW9ucywgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsKKyAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIHRvX2FkZCA9CisgICAgICAgIF9wcm90b19UeXBlVHJhaXRzOjpBZGQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCAmX2ltcGxfLl9leHRlbnNpb25zXyk7CisKKyAgICByZXR1cm4gdG9fYWRkOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLAorICAgICAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+CisgIGlubGluZSB2b2lkIEFkZEV4dGVuc2lvbigKKyAgICAgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwKKyAgICAgICAgICBNZXRob2RPcHRpb25zLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwKKyAgICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6Q29uc3RUeXBlIHZhbHVlKSB7CisgICAgX3Byb3RvX1R5cGVUcmFpdHM6OkFkZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworCisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsCisgICAgICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4KKyAgaW5saW5lIGNvbnN0IHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6UmVwZWF0ZWRGaWVsZFR5cGUmCisgIEdldFJlcGVhdGVkRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE1ldGhvZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkdldFJlcGVhdGVkKGlkLm51bWJlcigpLCBfaW1wbF8uX2V4dGVuc2lvbnNfKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywKKyAgICAgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPgorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpSZXBlYXRlZEZpZWxkVHlwZSoKKyAgTXV0YWJsZVJlcGVhdGVkRXh0ZW5zaW9uKAorICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPAorICAgICAgICAgIE1ldGhvZE9wdGlvbnMsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7CisKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGVSZXBlYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lzX3BhY2tlZCwgJl9pbXBsXy5fZXh0ZW5zaW9uc18pOworICB9CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187CisKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Okhhc0JpdHM8MT4gX2hhc19iaXRzXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKKyAgICBib29sIGRlcHJlY2F0ZWRfOworICAgIGludCBpZGVtcG90ZW5jeV9sZXZlbF87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCgpIDogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydChudWxscHRyKSB7fQorICB+VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCgpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQoY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZnJvbSk7CisgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgb3BlcmF0b3I9KGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIG9wZXJhdG9yPShVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKTsKKyAgfQorICBpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0Kj4oCisgICAgICAgICAgICAgICAmX1VuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAyMTsKKworICBmcmllbmQgdm9pZCBzd2FwKFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGEsIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICBHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICAjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdlbmVyaWNTd2FwKHRoaXMsIG90aGVyKTsKKyAgICB9CisgIH0KKyAgdm9pZCBVbnNhZmVBcmVuYVN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0PihhcmVuYSk7CisgIH0KKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlGcm9tOworICB2b2lkIENvcHlGcm9tKGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZnJvbSkgeworICAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Ok1lcmdlSW1wbCgqdGhpcywgZnJvbSk7CisgIH0KKyAgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgTWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZyk7CisgIHB1YmxpYzoKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IGZpbmFsOworICB2b2lkIEludGVybmFsU3dhcChVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQiOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXzsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDsKKworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga05hbWVQYXJ0RmllbGROdW1iZXIgPSAxLAorICAgIGtJc0V4dGVuc2lvbkZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7CisgIGJvb2wgaGFzX25hbWVfcGFydCgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfbmFtZV9wYXJ0KCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9uYW1lX3BhcnQoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWVfcGFydCgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X25hbWVfcGFydChBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWVfcGFydCgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZV9wYXJ0KCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lX3BhcnQoc3RkOjpzdHJpbmcqIG5hbWVfcGFydCk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfbmFtZV9wYXJ0KCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9uYW1lX3BhcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX25hbWVfcGFydCgpOworICBwdWJsaWM6CisKKyAgLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOworICBib29sIGhhc19pc19leHRlbnNpb24oKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX2lzX2V4dGVuc2lvbigpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfaXNfZXh0ZW5zaW9uKCk7CisgIGJvb2wgaXNfZXh0ZW5zaW9uKCkgY29uc3Q7CisgIHZvaWQgc2V0X2lzX2V4dGVuc2lvbihib29sIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaXNfZXh0ZW5zaW9uKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9pc19leHRlbnNpb24oYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIC8vIGhlbHBlciBmb3IgQnl0ZVNpemVMb25nKCkKKyAgc2l6ZV90IFJlcXVpcmVkRmllbGRzQnl0ZVNpemVGYWxsYmFjaygpIGNvbnN0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6SGFzQml0czwxPiBfaGFzX2JpdHNfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lX3BhcnRfOworICAgIGJvb2wgaXNfZXh0ZW5zaW9uXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBVbmludGVycHJldGVkT3B0aW9uIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBVbmludGVycHJldGVkT3B0aW9uKCkgOiBVbmludGVycHJldGVkT3B0aW9uKG51bGxwdHIpIHt9CisgIH5VbmludGVycHJldGVkT3B0aW9uKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBVbmludGVycHJldGVkT3B0aW9uKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgVW5pbnRlcnByZXRlZE9wdGlvbihjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKTsKKyAgVW5pbnRlcnByZXRlZE9wdGlvbihVbmludGVycHJldGVkT3B0aW9uJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IFVuaW50ZXJwcmV0ZWRPcHRpb24oKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBVbmludGVycHJldGVkT3B0aW9uJiBvcGVyYXRvcj0oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3BlcmF0b3I9KFVuaW50ZXJwcmV0ZWRPcHRpb24mJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpOworICB9CisgIGlubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBVbmludGVycHJldGVkT3B0aW9uKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24qPigKKyAgICAgICAgICAgICAgICZfVW5pbnRlcnByZXRlZE9wdGlvbl9kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDIyOworCisgIGZyaWVuZCB2b2lkIHN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbiYgYSwgVW5pbnRlcnByZXRlZE9wdGlvbiYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChVbmludGVycHJldGVkT3B0aW9uKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChVbmludGVycHJldGVkT3B0aW9uKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBVbmludGVycHJldGVkT3B0aW9uKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPFVuaW50ZXJwcmV0ZWRPcHRpb24+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKSB7CisgICAgVW5pbnRlcnByZXRlZE9wdGlvbjo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKFVuaW50ZXJwcmV0ZWRPcHRpb24qIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBVbmludGVycHJldGVkT3B0aW9uKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdHlwZWRlZiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0IE5hbWVQYXJ0OworCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga05hbWVGaWVsZE51bWJlciA9IDIsCisgICAga0lkZW50aWZpZXJWYWx1ZUZpZWxkTnVtYmVyID0gMywKKyAgICBrU3RyaW5nVmFsdWVGaWVsZE51bWJlciA9IDcsCisgICAga0FnZ3JlZ2F0ZVZhbHVlRmllbGROdW1iZXIgPSA4LAorICAgIGtQb3NpdGl2ZUludFZhbHVlRmllbGROdW1iZXIgPSA0LAorICAgIGtOZWdhdGl2ZUludFZhbHVlRmllbGROdW1iZXIgPSA1LAorICAgIGtEb3VibGVWYWx1ZUZpZWxkTnVtYmVyID0gNiwKKyAgfTsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0IG5hbWUgPSAyOworICBpbnQgbmFtZV9zaXplKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGludCBfaW50ZXJuYWxfbmFtZV9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9uYW1lKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBtdXRhYmxlX25hbWUoaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0ID4qCisgICAgICBtdXRhYmxlX25hbWUoKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIF9pbnRlcm5hbF9uYW1lKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBfaW50ZXJuYWxfYWRkX25hbWUoKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgbmFtZShpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogYWRkX25hbWUoKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0ID4mCisgICAgICBuYW1lKCkgY29uc3Q7CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGlkZW50aWZpZXJfdmFsdWUgPSAzOworICBib29sIGhhc19pZGVudGlmaWVyX3ZhbHVlKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19pZGVudGlmaWVyX3ZhbHVlKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9pZGVudGlmaWVyX3ZhbHVlKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZGVudGlmaWVyX3ZhbHVlKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfaWRlbnRpZmllcl92YWx1ZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2lkZW50aWZpZXJfdmFsdWUoc3RkOjpzdHJpbmcqIGlkZW50aWZpZXJfdmFsdWUpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX2lkZW50aWZpZXJfdmFsdWUoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X2lkZW50aWZpZXJfdmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIGJ5dGVzIHN0cmluZ192YWx1ZSA9IDc7CisgIGJvb2wgaGFzX3N0cmluZ192YWx1ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfc3RyaW5nX3ZhbHVlKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9zdHJpbmdfdmFsdWUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZ192YWx1ZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X3N0cmluZ192YWx1ZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX3N0cmluZ192YWx1ZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2Vfc3RyaW5nX3ZhbHVlKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9zdHJpbmdfdmFsdWUoc3RkOjpzdHJpbmcqIHN0cmluZ192YWx1ZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfc3RyaW5nX3ZhbHVlKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9zdHJpbmdfdmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX3N0cmluZ192YWx1ZSgpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGFnZ3JlZ2F0ZV92YWx1ZSA9IDg7CisgIGJvb2wgaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfYWdncmVnYXRlX3ZhbHVlKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9hZ2dyZWdhdGVfdmFsdWUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGFnZ3JlZ2F0ZV92YWx1ZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X2FnZ3JlZ2F0ZV92YWx1ZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX2FnZ3JlZ2F0ZV92YWx1ZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2VfYWdncmVnYXRlX3ZhbHVlKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9hZ2dyZWdhdGVfdmFsdWUoc3RkOjpzdHJpbmcqIGFnZ3JlZ2F0ZV92YWx1ZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfYWdncmVnYXRlX3ZhbHVlKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9hZ2dyZWdhdGVfdmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX2FnZ3JlZ2F0ZV92YWx1ZSgpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7CisgIGJvb2wgaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9wb3NpdGl2ZV9pbnRfdmFsdWUoKTsKKyAgdWludDY0X3QgcG9zaXRpdmVfaW50X3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgc2V0X3Bvc2l0aXZlX2ludF92YWx1ZSh1aW50NjRfdCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIHVpbnQ2NF90IF9pbnRlcm5hbF9wb3NpdGl2ZV9pbnRfdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X3Bvc2l0aXZlX2ludF92YWx1ZSh1aW50NjRfdCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBpbnQ2NCBuZWdhdGl2ZV9pbnRfdmFsdWUgPSA1OworICBib29sIGhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfbmVnYXRpdmVfaW50X3ZhbHVlKCk7CisgIGludDY0X3QgbmVnYXRpdmVfaW50X3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgc2V0X25lZ2F0aXZlX2ludF92YWx1ZShpbnQ2NF90IHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgaW50NjRfdCBfaW50ZXJuYWxfbmVnYXRpdmVfaW50X3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9uZWdhdGl2ZV9pbnRfdmFsdWUoaW50NjRfdCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKKyAgYm9vbCBoYXNfZG91YmxlX3ZhbHVlKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19kb3VibGVfdmFsdWUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2RvdWJsZV92YWx1ZSgpOworICBkb3VibGUgZG91YmxlX3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgc2V0X2RvdWJsZV92YWx1ZShkb3VibGUgdmFsdWUpOworICBwcml2YXRlOgorICBkb3VibGUgX2ludGVybmFsX2RvdWJsZV92YWx1ZSgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfZG91YmxlX3ZhbHVlKGRvdWJsZSB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6SGFzQml0czwxPiBfaGFzX2JpdHNfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0ID4gbmFtZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBpZGVudGlmaWVyX3ZhbHVlXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHN0cmluZ192YWx1ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBhZ2dyZWdhdGVfdmFsdWVfOworICAgIHVpbnQ2NF90IHBvc2l0aXZlX2ludF92YWx1ZV87CisgICAgaW50NjRfdCBuZWdhdGl2ZV9pbnRfdmFsdWVfOworICAgIGRvdWJsZSBkb3VibGVfdmFsdWVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgU291cmNlQ29kZUluZm9fTG9jYXRpb24oKSA6IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKG51bGxwdHIpIHt9CisgIH5Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbigpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgU291cmNlQ29kZUluZm9fTG9jYXRpb24oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbihjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZnJvbSk7CisgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgU291cmNlQ29kZUluZm9fTG9jYXRpb24mIG9wZXJhdG9yPShjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgU291cmNlQ29kZUluZm9fTG9jYXRpb24mIG9wZXJhdG9yPShTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSk7CisgIH0KKyAgaW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24mIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbio+KAorICAgICAgICAgICAgICAgJl9Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDIzOworCisgIGZyaWVuZCB2b2lkIHN3YXAoU291cmNlQ29kZUluZm9fTG9jYXRpb24mIGEsIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8U291cmNlQ29kZUluZm9fTG9jYXRpb24+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24mIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24mIGZyb20pIHsKKyAgICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrUGF0aEZpZWxkTnVtYmVyID0gMSwKKyAgICBrU3BhbkZpZWxkTnVtYmVyID0gMiwKKyAgICBrTGVhZGluZ0RldGFjaGVkQ29tbWVudHNGaWVsZE51bWJlciA9IDYsCisgICAga0xlYWRpbmdDb21tZW50c0ZpZWxkTnVtYmVyID0gMywKKyAgICBrVHJhaWxpbmdDb21tZW50c0ZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKyAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworICBpbnQgcGF0aF9zaXplKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGludCBfaW50ZXJuYWxfcGF0aF9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9wYXRoKCk7CisgIHByaXZhdGU6CisgIGludDMyX3QgX2ludGVybmFsX3BhdGgoaW50IGluZGV4KSBjb25zdDsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPiYKKyAgICAgIF9pbnRlcm5hbF9wYXRoKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX2FkZF9wYXRoKGludDMyX3QgdmFsdWUpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+KgorICAgICAgX2ludGVybmFsX211dGFibGVfcGF0aCgpOworICBwdWJsaWM6CisgIGludDMyX3QgcGF0aChpbnQgaW5kZXgpIGNvbnN0OworICB2b2lkIHNldF9wYXRoKGludCBpbmRleCwgaW50MzJfdCB2YWx1ZSk7CisgIHZvaWQgYWRkX3BhdGgoaW50MzJfdCB2YWx1ZSk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZEZpZWxkPCBpbnQzMl90ID4mCisgICAgICBwYXRoKCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZEZpZWxkPCBpbnQzMl90ID4qCisgICAgICBtdXRhYmxlX3BhdGgoKTsKKworICAvLyByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkID0gdHJ1ZV07CisgIGludCBzcGFuX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9zcGFuX3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3NwYW4oKTsKKyAgcHJpdmF0ZToKKyAgaW50MzJfdCBfaW50ZXJuYWxfc3BhbihpbnQgaW5kZXgpIGNvbnN0OworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+JgorICAgICAgX2ludGVybmFsX3NwYW4oKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfYWRkX3NwYW4oaW50MzJfdCB2YWx1ZSk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZEZpZWxkPCBpbnQzMl90ID4qCisgICAgICBfaW50ZXJuYWxfbXV0YWJsZV9zcGFuKCk7CisgIHB1YmxpYzoKKyAgaW50MzJfdCBzcGFuKGludCBpbmRleCkgY29uc3Q7CisgIHZvaWQgc2V0X3NwYW4oaW50IGluZGV4LCBpbnQzMl90IHZhbHVlKTsKKyAgdm9pZCBhZGRfc3BhbihpbnQzMl90IHZhbHVlKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPiYKKyAgICAgIHNwYW4oKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPioKKyAgICAgIG11dGFibGVfc3BhbigpOworCisgIC8vIHJlcGVhdGVkIHN0cmluZyBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzID0gNjsKKyAgaW50IGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpOworICBjb25zdCBzdGQ6OnN0cmluZyYgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpbnQgaW5kZXgpIGNvbnN0OworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCk7CisgIHZvaWQgc2V0X2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCwgc3RkOjpzdHJpbmcmJiB2YWx1ZSk7CisgIHZvaWQgc2V0X2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBzdGQ6OnN0cmluZyogYWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKTsKKyAgdm9pZCBhZGRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIGFkZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKHN0ZDo6c3RyaW5nJiYgdmFsdWUpOworICB2b2lkIGFkZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBhZGRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4mIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KiBtdXRhYmxlX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfYWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBsZWFkaW5nX2NvbW1lbnRzID0gMzsKKyAgYm9vbCBoYXNfbGVhZGluZ19jb21tZW50cygpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfbGVhZGluZ19jb21tZW50cygpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfbGVhZGluZ19jb21tZW50cygpOworICBjb25zdCBzdGQ6OnN0cmluZyYgbGVhZGluZ19jb21tZW50cygpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X2xlYWRpbmdfY29tbWVudHMoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9sZWFkaW5nX2NvbW1lbnRzKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9sZWFkaW5nX2NvbW1lbnRzKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9sZWFkaW5nX2NvbW1lbnRzKHN0ZDo6c3RyaW5nKiBsZWFkaW5nX2NvbW1lbnRzKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9sZWFkaW5nX2NvbW1lbnRzKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9sZWFkaW5nX2NvbW1lbnRzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9sZWFkaW5nX2NvbW1lbnRzKCk7CisgIHB1YmxpYzoKKworICAvLyBvcHRpb25hbCBzdHJpbmcgdHJhaWxpbmdfY29tbWVudHMgPSA0OworICBib29sIGhhc190cmFpbGluZ19jb21tZW50cygpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfdHJhaWxpbmdfY29tbWVudHMoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3RyYWlsaW5nX2NvbW1lbnRzKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0cmFpbGluZ19jb21tZW50cygpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X3RyYWlsaW5nX2NvbW1lbnRzKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX3RyYWlsaW5nX2NvbW1lbnRzKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF90cmFpbGluZ19jb21tZW50cyhzdGQ6OnN0cmluZyogdHJhaWxpbmdfY29tbWVudHMpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX3RyYWlsaW5nX2NvbW1lbnRzKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF90cmFpbGluZ19jb21tZW50cyhjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgcHVibGljOgorCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6SGFzQml0czwxPiBfaGFzX2JpdHNfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPiBwYXRoXzsKKyAgICBtdXRhYmxlIHN0ZDo6YXRvbWljPGludD4gX3BhdGhfY2FjaGVkX2J5dGVfc2l6ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPiBzcGFuXzsKKyAgICBtdXRhYmxlIHN0ZDo6YXRvbWljPGludD4gX3NwYW5fY2FjaGVkX2J5dGVfc2l6ZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+IGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgbGVhZGluZ19jb21tZW50c187CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciB0cmFpbGluZ19jb21tZW50c187CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgU291cmNlQ29kZUluZm8gZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBTb3VyY2VDb2RlSW5mbygpIDogU291cmNlQ29kZUluZm8obnVsbHB0cikge30KKyAgflNvdXJjZUNvZGVJbmZvKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBTb3VyY2VDb2RlSW5mbyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIFNvdXJjZUNvZGVJbmZvKGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBmcm9tKTsKKyAgU291cmNlQ29kZUluZm8oU291cmNlQ29kZUluZm8mJiBmcm9tKSBub2V4Y2VwdAorICAgIDogU291cmNlQ29kZUluZm8oKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBTb3VyY2VDb2RlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBTb3VyY2VDb2RlSW5mbyYgb3BlcmF0b3I9KFNvdXJjZUNvZGVJbmZvJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKTsKKyAgfQorICBpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBTb3VyY2VDb2RlSW5mbyYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gKmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IFNvdXJjZUNvZGVJbmZvKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFNvdXJjZUNvZGVJbmZvKj4oCisgICAgICAgICAgICAgICAmX1NvdXJjZUNvZGVJbmZvX2RlZmF1bHRfaW5zdGFuY2VfKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9CisgICAgMjQ7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChTb3VyY2VDb2RlSW5mbyYgYSwgU291cmNlQ29kZUluZm8mIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoU291cmNlQ29kZUluZm8qIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKFNvdXJjZUNvZGVJbmZvKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBTb3VyY2VDb2RlSW5mbyogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxTb3VyY2VDb2RlSW5mbz4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBTb3VyY2VDb2RlSW5mbyYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBTb3VyY2VDb2RlSW5mbyYgZnJvbSkgeworICAgIFNvdXJjZUNvZGVJbmZvOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoU291cmNlQ29kZUluZm8qIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8iOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgU291cmNlQ29kZUluZm8oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB0eXBlZGVmIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uIExvY2F0aW9uOworCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga0xvY2F0aW9uRmllbGROdW1iZXIgPSAxLAorICB9OworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIGxvY2F0aW9uID0gMTsKKyAgaW50IGxvY2F0aW9uX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9sb2NhdGlvbl9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9sb2NhdGlvbigpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm9fTG9jYXRpb24qIG11dGFibGVfbG9jYXRpb24oaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiA+KgorICAgICAgbXV0YWJsZV9sb2NhdGlvbigpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm9fTG9jYXRpb24mIF9pbnRlcm5hbF9sb2NhdGlvbihpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm9fTG9jYXRpb24qIF9pbnRlcm5hbF9hZGRfbG9jYXRpb24oKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm9fTG9jYXRpb24mIGxvY2F0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogYWRkX2xvY2F0aW9uKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPiYKKyAgICAgIGxvY2F0aW9uKCkgY29uc3Q7CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiA+IGxvY2F0aW9uXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24gZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24oKSA6IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24obnVsbHB0cikge30KKyAgfkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24oKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIGZyb20pOworICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mJiBmcm9tKSBub2V4Y2VwdAorICAgIDogR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbigpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIG9wZXJhdG9yPShjb25zdCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJiBvcGVyYXRvcj0oR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSk7CisgIH0KKyAgaW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gKmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbio+KAorICAgICAgICAgICAgICAgJl9HZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX2RlZmF1bHRfaW5zdGFuY2VfKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9CisgICAgMjU7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJiBhLCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbj4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIGZyb20pIHsKKyAgICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtQYXRoRmllbGROdW1iZXIgPSAxLAorICAgIGtTb3VyY2VGaWxlRmllbGROdW1iZXIgPSAyLAorICAgIGtCZWdpbkZpZWxkTnVtYmVyID0gMywKKyAgICBrRW5kRmllbGROdW1iZXIgPSA0LAorICB9OworICAvLyByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkID0gdHJ1ZV07CisgIGludCBwYXRoX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9wYXRoX3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3BhdGgoKTsKKyAgcHJpdmF0ZToKKyAgaW50MzJfdCBfaW50ZXJuYWxfcGF0aChpbnQgaW5kZXgpIGNvbnN0OworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+JgorICAgICAgX2ludGVybmFsX3BhdGgoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfYWRkX3BhdGgoaW50MzJfdCB2YWx1ZSk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZEZpZWxkPCBpbnQzMl90ID4qCisgICAgICBfaW50ZXJuYWxfbXV0YWJsZV9wYXRoKCk7CisgIHB1YmxpYzoKKyAgaW50MzJfdCBwYXRoKGludCBpbmRleCkgY29uc3Q7CisgIHZvaWQgc2V0X3BhdGgoaW50IGluZGV4LCBpbnQzMl90IHZhbHVlKTsKKyAgdm9pZCBhZGRfcGF0aChpbnQzMl90IHZhbHVlKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPiYKKyAgICAgIHBhdGgoKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPioKKyAgICAgIG11dGFibGVfcGF0aCgpOworCisgIC8vIG9wdGlvbmFsIHN0cmluZyBzb3VyY2VfZmlsZSA9IDI7CisgIGJvb2wgaGFzX3NvdXJjZV9maWxlKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19zb3VyY2VfZmlsZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfc291cmNlX2ZpbGUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV9maWxlKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfc291cmNlX2ZpbGUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9zb3VyY2VfZmlsZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2Vfc291cmNlX2ZpbGUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX3NvdXJjZV9maWxlKHN0ZDo6c3RyaW5nKiBzb3VyY2VfZmlsZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfc291cmNlX2ZpbGUoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X3NvdXJjZV9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9zb3VyY2VfZmlsZSgpOworICBwdWJsaWM6CisKKyAgLy8gb3B0aW9uYWwgaW50MzIgYmVnaW4gPSAzOworICBib29sIGhhc19iZWdpbigpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfYmVnaW4oKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2JlZ2luKCk7CisgIGludDMyX3QgYmVnaW4oKSBjb25zdDsKKyAgdm9pZCBzZXRfYmVnaW4oaW50MzJfdCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGludDMyX3QgX2ludGVybmFsX2JlZ2luKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9iZWdpbihpbnQzMl90IHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDQ7CisgIGJvb2wgaGFzX2VuZCgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfZW5kKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9lbmQoKTsKKyAgaW50MzJfdCBlbmQoKSBjb25zdDsKKyAgdm9pZCBzZXRfZW5kKGludDMyX3QgdmFsdWUpOworICBwcml2YXRlOgorICBpbnQzMl90IF9pbnRlcm5hbF9lbmQoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X2VuZChpbnQzMl90IHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpIYXNCaXRzPDE+IF9oYXNfYml0c187CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+IHBhdGhfOworICAgIG11dGFibGUgc3RkOjphdG9taWM8aW50PiBfcGF0aF9jYWNoZWRfYnl0ZV9zaXplXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHNvdXJjZV9maWxlXzsKKyAgICBpbnQzMl90IGJlZ2luXzsKKyAgICBpbnQzMl90IGVuZF87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgR2VuZXJhdGVkQ29kZUluZm8gZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBHZW5lcmF0ZWRDb2RlSW5mbygpIDogR2VuZXJhdGVkQ29kZUluZm8obnVsbHB0cikge30KKyAgfkdlbmVyYXRlZENvZGVJbmZvKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBHZW5lcmF0ZWRDb2RlSW5mbyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIEdlbmVyYXRlZENvZGVJbmZvKGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvJiBmcm9tKTsKKyAgR2VuZXJhdGVkQ29kZUluZm8oR2VuZXJhdGVkQ29kZUluZm8mJiBmcm9tKSBub2V4Y2VwdAorICAgIDogR2VuZXJhdGVkQ29kZUluZm8oKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBHZW5lcmF0ZWRDb2RlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBHZW5lcmF0ZWRDb2RlSW5mbyYgb3BlcmF0b3I9KEdlbmVyYXRlZENvZGVJbmZvJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKTsKKyAgfQorICBpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbyYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gKmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvKj4oCisgICAgICAgICAgICAgICAmX0dlbmVyYXRlZENvZGVJbmZvX2RlZmF1bHRfaW5zdGFuY2VfKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9CisgICAgMjY7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChHZW5lcmF0ZWRDb2RlSW5mbyYgYSwgR2VuZXJhdGVkQ29kZUluZm8mIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoR2VuZXJhdGVkQ29kZUluZm8qIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKEdlbmVyYXRlZENvZGVJbmZvKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBHZW5lcmF0ZWRDb2RlSW5mbyogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxHZW5lcmF0ZWRDb2RlSW5mbz4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbyYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbyYgZnJvbSkgeworICAgIEdlbmVyYXRlZENvZGVJbmZvOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoR2VuZXJhdGVkQ29kZUluZm8qIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8iOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgR2VuZXJhdGVkQ29kZUluZm8oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB0eXBlZGVmIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24gQW5ub3RhdGlvbjsKKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtBbm5vdGF0aW9uRmllbGROdW1iZXIgPSAxLAorICB9OworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24gYW5ub3RhdGlvbiA9IDE7CisgIGludCBhbm5vdGF0aW9uX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9hbm5vdGF0aW9uX3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2Fubm90YXRpb24oKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIG11dGFibGVfYW5ub3RhdGlvbihpbnQgaW5kZXgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24gPioKKyAgICAgIG11dGFibGVfYW5ub3RhdGlvbigpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiYgX2ludGVybmFsX2Fubm90YXRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIF9pbnRlcm5hbF9hZGRfYW5ub3RhdGlvbigpOworICBwdWJsaWM6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJiBhbm5vdGF0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKiBhZGRfYW5ub3RhdGlvbigpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24gPiYKKyAgICAgIGFubm90YXRpb24oKSBjb25zdDsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24gPiBhbm5vdGF0aW9uXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvOworfTsKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfX0dOVUNfXworICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3N0cmljdC1hbGlhc2luZyIKKyNlbmRpZiAgLy8gX19HTlVDX18KKy8vIEZpbGVEZXNjcmlwdG9yU2V0CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBmaWxlID0gMTsKK2lubGluZSBpbnQgRmlsZURlc2NyaXB0b3JTZXQ6Ol9pbnRlcm5hbF9maWxlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZmlsZV8uc2l6ZSgpOworfQoraW5saW5lIGludCBGaWxlRGVzY3JpcHRvclNldDo6ZmlsZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2ZpbGVfc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OmNsZWFyX2ZpbGUoKSB7CisgIF9pbXBsXy5maWxlXy5DbGVhcigpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclNldDo6bXV0YWJsZV9maWxlKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQuZmlsZSkKKyAgcmV0dXJuIF9pbXBsXy5maWxlXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPioKK0ZpbGVEZXNjcmlwdG9yU2V0OjptdXRhYmxlX2ZpbGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0LmZpbGUpCisgIHJldHVybiAmX2ltcGxfLmZpbGVfOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclNldDo6X2ludGVybmFsX2ZpbGUoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZmlsZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZURlc2NyaXB0b3JQcm90byYgRmlsZURlc2NyaXB0b3JTZXQ6OmZpbGUoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0LmZpbGUpCisgIHJldHVybiBfaW50ZXJuYWxfZmlsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yU2V0OjpfaW50ZXJuYWxfYWRkX2ZpbGUoKSB7CisgIHJldHVybiBfaW1wbF8uZmlsZV8uQWRkKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yU2V0OjphZGRfZmlsZSgpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIF9hZGQgPSBfaW50ZXJuYWxfYWRkX2ZpbGUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQuZmlsZSkKKyAgcmV0dXJuIF9hZGQ7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlRGVzY3JpcHRvclByb3RvID4mCitGaWxlRGVzY3JpcHRvclNldDo6ZmlsZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0LmZpbGUpCisgIHJldHVybiBfaW1wbF8uZmlsZV87Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRmlsZURlc2NyaXB0b3JQcm90bworCisvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CitpbmxpbmUgYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfaGFzX25hbWUoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmlsZURlc2NyaXB0b3JQcm90bzo6aGFzX25hbWUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX25hbWUoKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIF9pbXBsXy5uYW1lXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBfaW50ZXJuYWxfbmFtZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyBfaW1wbF8ubmFtZV8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9uYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm5hbWVfLkdldCgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3NldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgX2ltcGxfLm5hbWVfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQorICBpZiAoIV9pbnRlcm5hbF9oYXNfbmFtZSgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworICBhdXRvKiBwID0gX2ltcGxfLm5hbWVfLlJlbGVhc2UoKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ubmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIHJldHVybiBwOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIH0KKyAgX2ltcGxfLm5hbWVfLlNldEFsbG9jYXRlZChuYW1lLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLm5hbWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7CitpbmxpbmUgYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfaGFzX3BhY2thZ2UoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmlsZURlc2NyaXB0b3JQcm90bzo6aGFzX3BhY2thZ2UoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX3BhY2thZ2UoKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX3BhY2thZ2UoKSB7CisgIF9pbXBsXy5wYWNrYWdlXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpwYWNrYWdlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UpCisgIHJldHVybiBfaW50ZXJuYWxfcGFja2FnZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X3BhY2thZ2UoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyBfaW1wbF8ucGFja2FnZV8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfcGFja2FnZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfcGFja2FnZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wYWNrYWdlKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9wYWNrYWdlKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnBhY2thZ2VfLkdldCgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3NldF9wYWNrYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgX2ltcGxfLnBhY2thZ2VfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfbXV0YWJsZV9wYWNrYWdlKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgcmV0dXJuIF9pbXBsXy5wYWNrYWdlXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9wYWNrYWdlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wYWNrYWdlKQorICBpZiAoIV9pbnRlcm5hbF9oYXNfcGFja2FnZSgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICBhdXRvKiBwID0gX2ltcGxfLnBhY2thZ2VfLlJlbGVhc2UoKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ucGFja2FnZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ucGFja2FnZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIHJldHVybiBwOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9wYWNrYWdlKHN0ZDo6c3RyaW5nKiBwYWNrYWdlKSB7CisgIGlmIChwYWNrYWdlICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CisgIH0KKyAgX2ltcGxfLnBhY2thZ2VfLlNldEFsbG9jYXRlZChwYWNrYWdlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnBhY2thZ2VfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLnBhY2thZ2VfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wYWNrYWdlKQorfQorCisvLyByZXBlYXRlZCBzdHJpbmcgZGVwZW5kZW5jeSA9IDM7CitpbmxpbmUgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9kZXBlbmRlbmN5X3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZGVwZW5kZW5jeV8uc2l6ZSgpOworfQoraW5saW5lIGludCBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXBlbmRlbmN5X3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfZGVwZW5kZW5jeV9zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9kZXBlbmRlbmN5KCkgeworICBfaW1wbF8uZGVwZW5kZW5jeV8uQ2xlYXIoKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX2RlcGVuZGVuY3koKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9hZGRfZGVwZW5kZW5jeSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5kZXBlbmRlbmN5Xy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCisgIHJldHVybiBfaW50ZXJuYWxfZGVwZW5kZW5jeShpbmRleCk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZGVwZW5kZW5jeShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKKyAgcmV0dXJuIF9pbXBsXy5kZXBlbmRlbmN5Xy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5kZXBlbmRlbmN5Xy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQorfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2RlcGVuZGVuY3koaW50IGluZGV4LCBzdGQ6OnN0cmluZyYmIHZhbHVlKSB7CisgIF9pbXBsXy5kZXBlbmRlbmN5Xy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHN0ZDo6bW92ZSh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfZGVwZW5kZW5jeShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0sodmFsdWUgIT0gbnVsbHB0cik7CisgIF9pbXBsXy5kZXBlbmRlbmN5Xy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfZGVwZW5kZW5jeShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBfaW1wbF8uZGVwZW5kZW5jeV8uTXV0YWJsZShpbmRleCktPmFzc2lnbigKKyAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2FkZF9kZXBlbmRlbmN5KCkgeworICByZXR1cm4gX2ltcGxfLmRlcGVuZGVuY3lfLkFkZCgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX2RlcGVuZGVuY3koY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5kZXBlbmRlbmN5Xy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQorfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX2RlcGVuZGVuY3koc3RkOjpzdHJpbmcmJiB2YWx1ZSkgeworICBfaW1wbF8uZGVwZW5kZW5jeV8uQWRkKHN0ZDo6bW92ZSh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfZGVwZW5kZW5jeShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBHT09HTEVfRENIRUNLKHZhbHVlICE9IG51bGxwdHIpOworICBfaW1wbF8uZGVwZW5kZW5jeV8uQWRkKCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQorfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX2RlcGVuZGVuY3koY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIF9pbXBsXy5kZXBlbmRlbmN5Xy5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQorfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OmRlcGVuZGVuY3koKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCisgIHJldHVybiBfaW1wbF8uZGVwZW5kZW5jeV87Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KgorRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9kZXBlbmRlbmN5KCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCisgIHJldHVybiAmX2ltcGxfLmRlcGVuZGVuY3lfOworfQorCisvLyByZXBlYXRlZCBpbnQzMiBwdWJsaWNfZGVwZW5kZW5jeSA9IDEwOworaW5saW5lIGludCBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfcHVibGljX2RlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5wdWJsaWNfZGVwZW5kZW5jeV8uc2l6ZSgpOworfQoraW5saW5lIGludCBGaWxlRGVzY3JpcHRvclByb3RvOjpwdWJsaWNfZGVwZW5kZW5jeV9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX3B1YmxpY19kZXBlbmRlbmN5X3NpemUoKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX3B1YmxpY19kZXBlbmRlbmN5KCkgeworICBfaW1wbF8ucHVibGljX2RlcGVuZGVuY3lfLkNsZWFyKCk7Cit9CitpbmxpbmUgaW50MzJfdCBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfcHVibGljX2RlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ucHVibGljX2RlcGVuZGVuY3lfLkdldChpbmRleCk7Cit9CitpbmxpbmUgaW50MzJfdCBGaWxlRGVzY3JpcHRvclByb3RvOjpwdWJsaWNfZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wdWJsaWNfZGVwZW5kZW5jeSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9wdWJsaWNfZGVwZW5kZW5jeShpbmRleCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfcHVibGljX2RlcGVuZGVuY3koaW50IGluZGV4LCBpbnQzMl90IHZhbHVlKSB7CisgIF9pbXBsXy5wdWJsaWNfZGVwZW5kZW5jeV8uU2V0KGluZGV4LCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucHVibGljX2RlcGVuZGVuY3kpCit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfYWRkX3B1YmxpY19kZXBlbmRlbmN5KGludDMyX3QgdmFsdWUpIHsKKyAgX2ltcGxfLnB1YmxpY19kZXBlbmRlbmN5Xy5BZGQodmFsdWUpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX3B1YmxpY19kZXBlbmRlbmN5KGludDMyX3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX2FkZF9wdWJsaWNfZGVwZW5kZW5jeSh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucHVibGljX2RlcGVuZGVuY3kpCit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9wdWJsaWNfZGVwZW5kZW5jeSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5wdWJsaWNfZGVwZW5kZW5jeV87Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OnB1YmxpY19kZXBlbmRlbmN5KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wdWJsaWNfZGVwZW5kZW5jeSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9wdWJsaWNfZGVwZW5kZW5jeSgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZEZpZWxkPCBpbnQzMl90ID4qCitGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfbXV0YWJsZV9wdWJsaWNfZGVwZW5kZW5jeSgpIHsKKyAgcmV0dXJuICZfaW1wbF8ucHVibGljX2RlcGVuZGVuY3lfOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZEZpZWxkPCBpbnQzMl90ID4qCitGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3B1YmxpY19kZXBlbmRlbmN5KCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnB1YmxpY19kZXBlbmRlbmN5KQorICByZXR1cm4gX2ludGVybmFsX211dGFibGVfcHVibGljX2RlcGVuZGVuY3koKTsKK30KKworLy8gcmVwZWF0ZWQgaW50MzIgd2Vha19kZXBlbmRlbmN5ID0gMTE7CitpbmxpbmUgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF93ZWFrX2RlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy53ZWFrX2RlcGVuZGVuY3lfLnNpemUoKTsKK30KK2lubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6d2Vha19kZXBlbmRlbmN5X3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfd2Vha19kZXBlbmRlbmN5X3NpemUoKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX3dlYWtfZGVwZW5kZW5jeSgpIHsKKyAgX2ltcGxfLndlYWtfZGVwZW5kZW5jeV8uQ2xlYXIoKTsKK30KK2lubGluZSBpbnQzMl90IEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF93ZWFrX2RlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ud2Vha19kZXBlbmRlbmN5Xy5HZXQoaW5kZXgpOworfQoraW5saW5lIGludDMyX3QgRmlsZURlc2NyaXB0b3JQcm90bzo6d2Vha19kZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLndlYWtfZGVwZW5kZW5jeSkKKyAgcmV0dXJuIF9pbnRlcm5hbF93ZWFrX2RlcGVuZGVuY3koaW5kZXgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X3dlYWtfZGVwZW5kZW5jeShpbnQgaW5kZXgsIGludDMyX3QgdmFsdWUpIHsKKyAgX2ltcGxfLndlYWtfZGVwZW5kZW5jeV8uU2V0KGluZGV4LCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ud2Vha19kZXBlbmRlbmN5KQorfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2FkZF93ZWFrX2RlcGVuZGVuY3koaW50MzJfdCB2YWx1ZSkgeworICBfaW1wbF8ud2Vha19kZXBlbmRlbmN5Xy5BZGQodmFsdWUpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX3dlYWtfZGVwZW5kZW5jeShpbnQzMl90IHZhbHVlKSB7CisgIF9pbnRlcm5hbF9hZGRfd2Vha19kZXBlbmRlbmN5KHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by53ZWFrX2RlcGVuZGVuY3kpCit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF93ZWFrX2RlcGVuZGVuY3koKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ud2Vha19kZXBlbmRlbmN5XzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+JgorRmlsZURlc2NyaXB0b3JQcm90bzo6d2Vha19kZXBlbmRlbmN5KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by53ZWFrX2RlcGVuZGVuY3kpCisgIHJldHVybiBfaW50ZXJuYWxfd2Vha19kZXBlbmRlbmN5KCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPioKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX3dlYWtfZGVwZW5kZW5jeSgpIHsKKyAgcmV0dXJuICZfaW1wbF8ud2Vha19kZXBlbmRlbmN5XzsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+KgorRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV93ZWFrX2RlcGVuZGVuY3koKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ud2Vha19kZXBlbmRlbmN5KQorICByZXR1cm4gX2ludGVybmFsX211dGFibGVfd2Vha19kZXBlbmRlbmN5KCk7Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7CitpbmxpbmUgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tZXNzYWdlX3R5cGVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5tZXNzYWdlX3R5cGVfLnNpemUoKTsKK30KK2lubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6bWVzc2FnZV90eXBlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfbWVzc2FnZV90eXBlX3NpemUoKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX21lc3NhZ2VfdHlwZSgpIHsKKyAgX2ltcGxfLm1lc3NhZ2VfdHlwZV8uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21lc3NhZ2VfdHlwZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlKQorICByZXR1cm4gX2ltcGxfLm1lc3NhZ2VfdHlwZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8gPioKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbWVzc2FnZV90eXBlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm1lc3NhZ2VfdHlwZSkKKyAgcmV0dXJuICZfaW1wbF8ubWVzc2FnZV90eXBlXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfbWVzc2FnZV90eXBlKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm1lc3NhZ2VfdHlwZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjptZXNzYWdlX3R5cGUoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlKQorICByZXR1cm4gX2ludGVybmFsX21lc3NhZ2VfdHlwZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2FkZF9tZXNzYWdlX3R5cGUoKSB7CisgIHJldHVybiBfaW1wbF8ubWVzc2FnZV90eXBlXy5BZGQoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfbWVzc2FnZV90eXBlKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvKiBfYWRkID0gX2ludGVybmFsX2FkZF9tZXNzYWdlX3R5cGUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5tZXNzYWdlX3R5cGUpCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvID4mCitGaWxlRGVzY3JpcHRvclByb3RvOjptZXNzYWdlX3R5cGUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm1lc3NhZ2VfdHlwZSkKKyAgcmV0dXJuIF9pbXBsXy5tZXNzYWdlX3R5cGVfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNTsKK2lubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2VudW1fdHlwZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmVudW1fdHlwZV8uc2l6ZSgpOworfQoraW5saW5lIGludCBGaWxlRGVzY3JpcHRvclByb3RvOjplbnVtX3R5cGVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9lbnVtX3R5cGVfc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZW51bV90eXBlKCkgeworICBfaW1wbF8uZW51bV90eXBlXy5DbGVhcigpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2VudW1fdHlwZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQorICByZXR1cm4gX2ltcGxfLmVudW1fdHlwZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvID4qCitGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2VudW1fdHlwZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCisgIHJldHVybiAmX2ltcGxfLmVudW1fdHlwZV87Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG8mIEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9lbnVtX3R5cGUoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZW51bV90eXBlXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjplbnVtX3R5cGUoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQorICByZXR1cm4gX2ludGVybmFsX2VudW1fdHlwZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9hZGRfZW51bV90eXBlKCkgeworICByZXR1cm4gX2ltcGxfLmVudW1fdHlwZV8uQWRkKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9lbnVtX3R5cGUoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvKiBfYWRkID0gX2ludGVybmFsX2FkZF9lbnVtX3R5cGUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90byA+JgorRmlsZURlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCisgIHJldHVybiBfaW1wbF8uZW51bV90eXBlXzsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvIHNlcnZpY2UgPSA2OworaW5saW5lIGludCBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfc2VydmljZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnNlcnZpY2VfLnNpemUoKTsKK30KK2lubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2VydmljZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX3NlcnZpY2Vfc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfc2VydmljZSgpIHsKKyAgX2ltcGxfLnNlcnZpY2VfLkNsZWFyKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfc2VydmljZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc2VydmljZSkKKyAgcmV0dXJuIF9pbXBsXy5zZXJ2aWNlXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPioKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfc2VydmljZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zZXJ2aWNlKQorICByZXR1cm4gJl9pbXBsXy5zZXJ2aWNlXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZURlc2NyaXB0b3JQcm90byYgRmlsZURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3NlcnZpY2UoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uc2VydmljZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZURlc2NyaXB0b3JQcm90byYgRmlsZURlc2NyaXB0b3JQcm90bzo6c2VydmljZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zZXJ2aWNlKQorICByZXR1cm4gX2ludGVybmFsX3NlcnZpY2UoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfYWRkX3NlcnZpY2UoKSB7CisgIHJldHVybiBfaW1wbF8uc2VydmljZV8uQWRkKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9zZXJ2aWNlKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZURlc2NyaXB0b3JQcm90byogX2FkZCA9IF9pbnRlcm5hbF9hZGRfc2VydmljZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNlcnZpY2UpCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZURlc2NyaXB0b3JQcm90byA+JgorRmlsZURlc2NyaXB0b3JQcm90bzo6c2VydmljZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc2VydmljZSkKKyAgcmV0dXJuIF9pbXBsXy5zZXJ2aWNlXzsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA3OworaW5saW5lIGludCBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfZXh0ZW5zaW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZXh0ZW5zaW9uXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2V4dGVuc2lvbl9zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9leHRlbnNpb24oKSB7CisgIF9pbXBsXy5leHRlbnNpb25fLkNsZWFyKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2V4dGVuc2lvbihpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQorICByZXR1cm4gX2ltcGxfLmV4dGVuc2lvbl8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byA+KgorRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbnNpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQorICByZXR1cm4gJl9pbXBsXy5leHRlbnNpb25fOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRmlsZURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2V4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5leHRlbnNpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb24oaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQorICByZXR1cm4gX2ludGVybmFsX2V4dGVuc2lvbihpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfYWRkX2V4dGVuc2lvbigpIHsKKyAgcmV0dXJuIF9pbXBsXy5leHRlbnNpb25fLkFkZCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX2V4dGVuc2lvbigpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBfYWRkID0gX2ludGVybmFsX2FkZF9leHRlbnNpb24oKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQorICByZXR1cm4gX2ltcGxfLmV4dGVuc2lvbl87Cit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgb3B0aW9ucyA9IDg7CitpbmxpbmUgYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfaGFzX29wdGlvbnMoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKKyAgUFJPVE9CVUZfQVNTVU1FKCF2YWx1ZSB8fCBfaW1wbF8ub3B0aW9uc18gIT0gbnVsbHB0cik7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86Omhhc19vcHRpb25zKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19vcHRpb25zKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgeworICBpZiAoX2ltcGxfLm9wdGlvbnNfICE9IG51bGxwdHIpIF9pbXBsXy5vcHRpb25zXy0+Q2xlYXIoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucyYgRmlsZURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX29wdGlvbnMoKSBjb25zdCB7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucyogcCA9IF9pbXBsXy5vcHRpb25zXzsKKyAgcmV0dXJuIHAgIT0gbnVsbHB0ciA/ICpwIDogcmVpbnRlcnByZXRfY2FzdDxjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMmPigKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfRmlsZU9wdGlvbnNfZGVmYXVsdF9pbnN0YW5jZV8pOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucyYgRmlsZURlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICByZXR1cm4gX2ludGVybmFsX29wdGlvbnMoKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkX29wdGlvbnMoCisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVPcHRpb25zKiBvcHRpb25zKSB7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7CisgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VMaXRlKj4oX2ltcGxfLm9wdGlvbnNfKTsKKyAgfQorICBfaW1wbF8ub3B0aW9uc18gPSBvcHRpb25zOworICBpZiAob3B0aW9ucykgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMqIEZpbGVEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3B0aW9ucygpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMqIHRlbXAgPSBfaW1wbF8ub3B0aW9uc187CisgIF9pbXBsXy5vcHRpb25zXyA9IG51bGxwdHI7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGF1dG8qIG9sZCA9ICByZWludGVycHJldF9jYXN0PDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSo+KHRlbXApOworICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7IGRlbGV0ZSBvbGQ7IH0KKyNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpICE9IG51bGxwdHIpIHsKKyAgICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIH0KKyNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICByZXR1cm4gdGVtcDsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMqIEZpbGVEZXNjcmlwdG9yUHJvdG86OnVuc2FmZV9hcmVuYV9yZWxlYXNlX29wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVPcHRpb25zKiB0ZW1wID0gX2ltcGxfLm9wdGlvbnNfOworICBfaW1wbF8ub3B0aW9uc18gPSBudWxscHRyOworICByZXR1cm4gdGVtcDsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMqIEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworICBpZiAoX2ltcGxfLm9wdGlvbnNfID09IG51bGxwdHIpIHsKKyAgICBhdXRvKiBwID0gQ3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9ucz4oR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAgIF9pbXBsXy5vcHRpb25zXyA9IHA7CisgIH0KKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXzsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVPcHRpb25zKiBfbXNnID0gX2ludGVybmFsX211dGFibGVfb3B0aW9ucygpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICByZXR1cm4gX21zZzsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBtZXNzYWdlX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGlmIChtZXNzYWdlX2FyZW5hID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgX2ltcGxfLm9wdGlvbnNfOworICB9CisgIGlmIChvcHRpb25zKSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBzdWJtZXNzYWdlX2FyZW5hID0KKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEdldE93bmluZ0FyZW5hKG9wdGlvbnMpOworICAgIGlmIChtZXNzYWdlX2FyZW5hICE9IHN1Ym1lc3NhZ2VfYXJlbmEpIHsKKyAgICAgIG9wdGlvbnMgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdldE93bmVkTWVzc2FnZSgKKyAgICAgICAgICBtZXNzYWdlX2FyZW5hLCBvcHRpb25zLCBzdWJtZXNzYWdlX2FyZW5hKTsKKyAgICB9CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworICB9CisgIF9pbXBsXy5vcHRpb25zXyA9IG9wdGlvbnM7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7CitpbmxpbmUgYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfaGFzX3NvdXJjZV9jb2RlX2luZm8oKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDEwdSkgIT0gMDsKKyAgUFJPVE9CVUZfQVNTVU1FKCF2YWx1ZSB8fCBfaW1wbF8uc291cmNlX2NvZGVfaW5mb18gIT0gbnVsbHB0cik7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86Omhhc19zb3VyY2VfY29kZV9pbmZvKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19zb3VyY2VfY29kZV9pbmZvKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9zb3VyY2VfY29kZV9pbmZvKCkgeworICBpZiAoX2ltcGxfLnNvdXJjZV9jb2RlX2luZm9fICE9IG51bGxwdHIpIF9pbXBsXy5zb3VyY2VfY29kZV9pbmZvXy0+Q2xlYXIoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbyYgRmlsZURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3NvdXJjZV9jb2RlX2luZm8oKSBjb25zdCB7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbyogcCA9IF9pbXBsXy5zb3VyY2VfY29kZV9pbmZvXzsKKyAgcmV0dXJuIHAgIT0gbnVsbHB0ciA/ICpwIDogcmVpbnRlcnByZXRfY2FzdDxjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm8mPigKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfU291cmNlQ29kZUluZm9fZGVmYXVsdF9pbnN0YW5jZV8pOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbyYgRmlsZURlc2NyaXB0b3JQcm90bzo6c291cmNlX2NvZGVfaW5mbygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zb3VyY2VfY29kZV9pbmZvKQorICByZXR1cm4gX2ludGVybmFsX3NvdXJjZV9jb2RlX2luZm8oKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkX3NvdXJjZV9jb2RlX2luZm8oCisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvZGVJbmZvKiBzb3VyY2VfY29kZV9pbmZvKSB7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7CisgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VMaXRlKj4oX2ltcGxfLnNvdXJjZV9jb2RlX2luZm9fKTsKKyAgfQorICBfaW1wbF8uc291cmNlX2NvZGVfaW5mb18gPSBzb3VyY2VfY29kZV9pbmZvOworICBpZiAoc291cmNlX2NvZGVfaW5mbykgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMTB1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc291cmNlX2NvZGVfaW5mbykKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm8qIEZpbGVEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfc291cmNlX2NvZGVfaW5mbygpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm8qIHRlbXAgPSBfaW1wbF8uc291cmNlX2NvZGVfaW5mb187CisgIF9pbXBsXy5zb3VyY2VfY29kZV9pbmZvXyA9IG51bGxwdHI7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGF1dG8qIG9sZCA9ICByZWludGVycHJldF9jYXN0PDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSo+KHRlbXApOworICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7IGRlbGV0ZSBvbGQ7IH0KKyNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpICE9IG51bGxwdHIpIHsKKyAgICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIH0KKyNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICByZXR1cm4gdGVtcDsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm8qIEZpbGVEZXNjcmlwdG9yUHJvdG86OnVuc2FmZV9hcmVuYV9yZWxlYXNlX3NvdXJjZV9jb2RlX2luZm8oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNvdXJjZV9jb2RlX2luZm8pCisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvZGVJbmZvKiB0ZW1wID0gX2ltcGxfLnNvdXJjZV9jb2RlX2luZm9fOworICBfaW1wbF8uc291cmNlX2NvZGVfaW5mb18gPSBudWxscHRyOworICByZXR1cm4gdGVtcDsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX3NvdXJjZV9jb2RlX2luZm8oKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMTB1OworICBpZiAoX2ltcGxfLnNvdXJjZV9jb2RlX2luZm9fID09IG51bGxwdHIpIHsKKyAgICBhdXRvKiBwID0gQ3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mbz4oR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAgIF9pbXBsXy5zb3VyY2VfY29kZV9pbmZvXyA9IHA7CisgIH0KKyAgcmV0dXJuIF9pbXBsXy5zb3VyY2VfY29kZV9pbmZvXzsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfc291cmNlX2NvZGVfaW5mbygpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvZGVJbmZvKiBfbXNnID0gX2ludGVybmFsX211dGFibGVfc291cmNlX2NvZGVfaW5mbygpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zb3VyY2VfY29kZV9pbmZvKQorICByZXR1cm4gX21zZzsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfc291cmNlX2NvZGVfaW5mbyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm8qIHNvdXJjZV9jb2RlX2luZm8pIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBtZXNzYWdlX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGlmIChtZXNzYWdlX2FyZW5hID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgX2ltcGxfLnNvdXJjZV9jb2RlX2luZm9fOworICB9CisgIGlmIChzb3VyY2VfY29kZV9pbmZvKSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBzdWJtZXNzYWdlX2FyZW5hID0KKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEdldE93bmluZ0FyZW5hKHNvdXJjZV9jb2RlX2luZm8pOworICAgIGlmIChtZXNzYWdlX2FyZW5hICE9IHN1Ym1lc3NhZ2VfYXJlbmEpIHsKKyAgICAgIHNvdXJjZV9jb2RlX2luZm8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdldE93bmVkTWVzc2FnZSgKKyAgICAgICAgICBtZXNzYWdlX2FyZW5hLCBzb3VyY2VfY29kZV9pbmZvLCBzdWJtZXNzYWdlX2FyZW5hKTsKKyAgICB9CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OworICB9CisgIF9pbXBsXy5zb3VyY2VfY29kZV9pbmZvXyA9IHNvdXJjZV9jb2RlX2luZm87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNvdXJjZV9jb2RlX2luZm8pCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBzeW50YXggPSAxMjsKK2lubGluZSBib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9oYXNfc3ludGF4KCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86Omhhc19zeW50YXgoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX3N5bnRheCgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfc3ludGF4KCkgeworICBfaW1wbF8uc3ludGF4Xy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpzeW50YXgoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4KQorICByZXR1cm4gX2ludGVybmFsX3N5bnRheCgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X3N5bnRheChBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworIF9pbXBsXy5zeW50YXhfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zeW50YXgpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfc3ludGF4KCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9zeW50YXgoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4KQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9zeW50YXgoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uc3ludGF4Xy5HZXQoKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9zZXRfc3ludGF4KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKKyAgX2ltcGxfLnN5bnRheF8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX3N5bnRheCgpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7CisgIHJldHVybiBfaW1wbF8uc3ludGF4Xy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9zeW50YXgoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCkKKyAgaWYgKCFfaW50ZXJuYWxfaGFzX3N5bnRheCgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworICBhdXRvKiBwID0gX2ltcGxfLnN5bnRheF8uUmVsZWFzZSgpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5zeW50YXhfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLnN5bnRheF8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIHJldHVybiBwOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9zeW50YXgoc3RkOjpzdHJpbmcqIHN5bnRheCkgeworICBpZiAoc3ludGF4ICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7CisgIH0KKyAgX2ltcGxfLnN5bnRheF8uU2V0QWxsb2NhdGVkKHN5bnRheCwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5zeW50YXhfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLnN5bnRheF8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCkKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UKKworLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOworaW5saW5lIGJvb2wgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpfaW50ZXJuYWxfaGFzX3N0YXJ0KCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6aGFzX3N0YXJ0KCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19zdGFydCgpOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpjbGVhcl9zdGFydCgpIHsKKyAgX2ltcGxfLnN0YXJ0XyA9IDA7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSBpbnQzMl90IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6X2ludGVybmFsX3N0YXJ0KCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnN0YXJ0XzsKK30KK2lubGluZSBpbnQzMl90IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6c3RhcnQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZS5zdGFydCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9zdGFydCgpOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpfaW50ZXJuYWxfc2V0X3N0YXJ0KGludDMyX3QgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIF9pbXBsXy5zdGFydF8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6c2V0X3N0YXJ0KGludDMyX3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9zdGFydCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZS5zdGFydCkKK30KKworLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKK2lubGluZSBib29sIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6X2ludGVybmFsX2hhc19lbmQoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpoYXNfZW5kKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19lbmQoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Y2xlYXJfZW5kKCkgeworICBfaW1wbF8uZW5kXyA9IDA7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK2lubGluZSBpbnQzMl90IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6X2ludGVybmFsX2VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5lbmRfOworfQoraW5saW5lIGludDMyX3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjplbmQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZS5lbmQpCisgIHJldHVybiBfaW50ZXJuYWxfZW5kKCk7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Ol9pbnRlcm5hbF9zZXRfZW5kKGludDMyX3QgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7CisgIF9pbXBsXy5lbmRfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OnNldF9lbmQoaW50MzJfdCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X2VuZCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZS5lbmQpCit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zIG9wdGlvbnMgPSAzOworaW5saW5lIGJvb2wgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpfaW50ZXJuYWxfaGFzX29wdGlvbnMoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKKyAgUFJPVE9CVUZfQVNTVU1FKCF2YWx1ZSB8fCBfaW1wbF8ub3B0aW9uc18gIT0gbnVsbHB0cik7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6aGFzX29wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX29wdGlvbnMoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Y2xlYXJfb3B0aW9ucygpIHsKKyAgaWYgKF9pbXBsXy5vcHRpb25zXyAhPSBudWxscHRyKSBfaW1wbF8ub3B0aW9uc18tPkNsZWFyKCk7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zJiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Ol9pbnRlcm5hbF9vcHRpb25zKCkgY29uc3QgeworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zKiBwID0gX2ltcGxfLm9wdGlvbnNfOworICByZXR1cm4gcCAhPSBudWxscHRyID8gKnAgOiByZWludGVycHJldF9jYXN0PGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFeHRlbnNpb25SYW5nZU9wdGlvbnMmPigKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfRXh0ZW5zaW9uUmFuZ2VPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfKTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zJiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Om9wdGlvbnMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZS5vcHRpb25zKQorICByZXR1cm4gX2ludGVybmFsX29wdGlvbnMoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6dW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfb3B0aW9ucygKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zKiBvcHRpb25zKSB7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7CisgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VMaXRlKj4oX2ltcGxfLm9wdGlvbnNfKTsKKyAgfQorICBfaW1wbF8ub3B0aW9uc18gPSBvcHRpb25zOworICBpZiAob3B0aW9ucykgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZS5vcHRpb25zKQorfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFeHRlbnNpb25SYW5nZU9wdGlvbnMqIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6cmVsZWFzZV9vcHRpb25zKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFeHRlbnNpb25SYW5nZU9wdGlvbnMqIHRlbXAgPSBfaW1wbF8ub3B0aW9uc187CisgIF9pbXBsXy5vcHRpb25zXyA9IG51bGxwdHI7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGF1dG8qIG9sZCA9ICByZWludGVycHJldF9jYXN0PDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSo+KHRlbXApOworICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7IGRlbGV0ZSBvbGQ7IH0KKyNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpICE9IG51bGxwdHIpIHsKKyAgICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIH0KKyNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICByZXR1cm4gdGVtcDsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zKiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OnVuc2FmZV9hcmVuYV9yZWxlYXNlX29wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2Uub3B0aW9ucykKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zKiB0ZW1wID0gX2ltcGxfLm9wdGlvbnNfOworICBfaW1wbF8ub3B0aW9uc18gPSBudWxscHRyOworICByZXR1cm4gdGVtcDsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zKiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Ol9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICBpZiAoX2ltcGxfLm9wdGlvbnNfID09IG51bGxwdHIpIHsKKyAgICBhdXRvKiBwID0gQ3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFeHRlbnNpb25SYW5nZU9wdGlvbnM+KEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgICBfaW1wbF8ub3B0aW9uc18gPSBwOworICB9CisgIHJldHVybiBfaW1wbF8ub3B0aW9uc187Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkV4dGVuc2lvblJhbmdlT3B0aW9ucyogRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjptdXRhYmxlX29wdGlvbnMoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFeHRlbnNpb25SYW5nZU9wdGlvbnMqIF9tc2cgPSBfaW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2Uub3B0aW9ucykKKyAgcmV0dXJuIF9tc2c7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RXh0ZW5zaW9uUmFuZ2VPcHRpb25zKiBvcHRpb25zKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogbWVzc2FnZV9hcmVuYSA9IEdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBpZiAobWVzc2FnZV9hcmVuYSA9PSBudWxscHRyKSB7CisgICAgZGVsZXRlIF9pbXBsXy5vcHRpb25zXzsKKyAgfQorICBpZiAob3B0aW9ucykgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogc3VibWVzc2FnZV9hcmVuYSA9CisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxHZXRPd25pbmdBcmVuYShvcHRpb25zKTsKKyAgICBpZiAobWVzc2FnZV9hcmVuYSAhPSBzdWJtZXNzYWdlX2FyZW5hKSB7CisgICAgICBvcHRpb25zID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZXRPd25lZE1lc3NhZ2UoCisgICAgICAgICAgbWVzc2FnZV9hcmVuYSwgb3B0aW9ucywgc3VibWVzc2FnZV9hcmVuYSk7CisgICAgfQorICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKKyAgfQorICBfaW1wbF8ub3B0aW9uc18gPSBvcHRpb25zOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlLm9wdGlvbnMpCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UKKworLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOworaW5saW5lIGJvb2wgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6Ol9pbnRlcm5hbF9oYXNfc3RhcnQoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6Omhhc19zdGFydCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfc3RhcnQoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpjbGVhcl9zdGFydCgpIHsKKyAgX2ltcGxfLnN0YXJ0XyA9IDA7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK2lubGluZSBpbnQzMl90IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpfaW50ZXJuYWxfc3RhcnQoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uc3RhcnRfOworfQoraW5saW5lIGludDMyX3QgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OnN0YXJ0KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZS5zdGFydCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9zdGFydCgpOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6Ol9pbnRlcm5hbF9zZXRfc3RhcnQoaW50MzJfdCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgX2ltcGxfLnN0YXJ0XyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OnNldF9zdGFydChpbnQzMl90IHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfc3RhcnQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZS5zdGFydCkKK30KKworLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKK2lubGluZSBib29sIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpfaW50ZXJuYWxfaGFzX2VuZCgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6aGFzX2VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfZW5kKCk7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6Y2xlYXJfZW5kKCkgeworICBfaW1wbF8uZW5kXyA9IDA7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSBpbnQzMl90IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpfaW50ZXJuYWxfZW5kKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmVuZF87Cit9CitpbmxpbmUgaW50MzJfdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6ZW5kKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZS5lbmQpCisgIHJldHVybiBfaW50ZXJuYWxfZW5kKCk7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6X2ludGVybmFsX3NldF9lbmQoaW50MzJfdCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgX2ltcGxfLmVuZF8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpzZXRfZW5kKGludDMyX3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9lbmQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZS5lbmQpCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRGVzY3JpcHRvclByb3RvCisKKy8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKK2lubGluZSBib29sIERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2hhc19uYW1lKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIERlc2NyaXB0b3JQcm90bzo6aGFzX25hbWUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX25hbWUoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKKyAgX2ltcGxfLm5hbWVfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIERlc2NyaXB0b3JQcm90bzo6bmFtZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBfaW50ZXJuYWxfbmFtZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworIF9pbXBsXy5uYW1lXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3NldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgX2ltcGxfLm5hbWVfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICByZXR1cm4gX2ltcGxfLm5hbWVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQorICBpZiAoIV9pbnRlcm5hbF9oYXNfbmFtZSgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworICBhdXRvKiBwID0gX2ltcGxfLm5hbWVfLlJlbGVhc2UoKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ubmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIHJldHVybiBwOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoc3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWUgIT0gbnVsbHB0cikgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKKyAgfQorICBfaW1wbF8ubmFtZV8uU2V0QWxsb2NhdGVkKG5hbWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ubmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CitpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2ZpZWxkX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZmllbGRfLnNpemUoKTsKK30KK2lubGluZSBpbnQgRGVzY3JpcHRvclByb3RvOjpmaWVsZF9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2ZpZWxkX3NpemUoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZmllbGQoKSB7CisgIF9pbXBsXy5maWVsZF8uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9maWVsZChpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5maWVsZCkKKyAgcmV0dXJuIF9pbXBsXy5maWVsZF8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byA+KgorRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2ZpZWxkKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZmllbGQpCisgIHJldHVybiAmX2ltcGxfLmZpZWxkXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8mIERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2ZpZWxkKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmZpZWxkXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjpmaWVsZChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmZpZWxkKQorICByZXR1cm4gX2ludGVybmFsX2ZpZWxkKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2FkZF9maWVsZCgpIHsKKyAgcmV0dXJuIF9pbXBsXy5maWVsZF8uQWRkKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86OmFkZF9maWVsZCgpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBfYWRkID0gX2ludGVybmFsX2FkZF9maWVsZCgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZmllbGQpCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKK0Rlc2NyaXB0b3JQcm90bzo6ZmllbGQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZmllbGQpCisgIHJldHVybiBfaW1wbF8uZmllbGRfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7CitpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2V4dGVuc2lvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmV4dGVuc2lvbl8uc2l6ZSgpOworfQoraW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2V4dGVuc2lvbl9zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2V4dGVuc2lvbigpIHsKKyAgX2ltcGxfLmV4dGVuc2lvbl8uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbnNpb24oaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQorICByZXR1cm4gX2ltcGxfLmV4dGVuc2lvbl8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byA+KgorRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2V4dGVuc2lvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbikKKyAgcmV0dXJuICZfaW1wbF8uZXh0ZW5zaW9uXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8mIERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2V4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5leHRlbnNpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvJiBEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbikKKyAgcmV0dXJuIF9pbnRlcm5hbF9leHRlbnNpb24oaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfYWRkX2V4dGVuc2lvbigpIHsKKyAgcmV0dXJuIF9pbXBsXy5leHRlbnNpb25fLkFkZCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjphZGRfZXh0ZW5zaW9uKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG8qIF9hZGQgPSBfaW50ZXJuYWxfYWRkX2V4dGVuc2lvbigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQorICByZXR1cm4gX2FkZDsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvID4mCitEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCisgIHJldHVybiBfaW1wbF8uZXh0ZW5zaW9uXzsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbmVzdGVkX3R5cGUgPSAzOworaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9uZXN0ZWRfdHlwZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm5lc3RlZF90eXBlXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6bmVzdGVkX3R5cGVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9uZXN0ZWRfdHlwZV9zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25lc3RlZF90eXBlKCkgeworICBfaW1wbF8ubmVzdGVkX3R5cGVfLkNsZWFyKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25lc3RlZF90eXBlKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5lc3RlZF90eXBlKQorICByZXR1cm4gX2ltcGxfLm5lc3RlZF90eXBlXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90byA+KgorRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25lc3RlZF90eXBlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmVzdGVkX3R5cGUpCisgIHJldHVybiAmX2ltcGxfLm5lc3RlZF90eXBlXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvJiBEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9uZXN0ZWRfdHlwZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5uZXN0ZWRfdHlwZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvJiBEZXNjcmlwdG9yUHJvdG86Om5lc3RlZF90eXBlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmVzdGVkX3R5cGUpCisgIHJldHVybiBfaW50ZXJuYWxfbmVzdGVkX3R5cGUoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2FkZF9uZXN0ZWRfdHlwZSgpIHsKKyAgcmV0dXJuIF9pbXBsXy5uZXN0ZWRfdHlwZV8uQWRkKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjphZGRfbmVzdGVkX3R5cGUoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8qIF9hZGQgPSBfaW50ZXJuYWxfYWRkX25lc3RlZF90eXBlKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uZXN0ZWRfdHlwZSkKKyAgcmV0dXJuIF9hZGQ7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG8gPiYKK0Rlc2NyaXB0b3JQcm90bzo6bmVzdGVkX3R5cGUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmVzdGVkX3R5cGUpCisgIHJldHVybiBfaW1wbF8ubmVzdGVkX3R5cGVfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNDsKK2lubGluZSBpbnQgRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfZW51bV90eXBlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZW51bV90eXBlXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfZW51bV90eXBlX3NpemUoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZW51bV90eXBlKCkgeworICBfaW1wbF8uZW51bV90eXBlXy5DbGVhcigpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZW51bV90eXBlKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmVudW1fdHlwZSkKKyAgcmV0dXJuIF9pbXBsXy5lbnVtX3R5cGVfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90byA+KgorRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2VudW1fdHlwZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmVudW1fdHlwZSkKKyAgcmV0dXJuICZfaW1wbF8uZW51bV90eXBlXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfZW51bV90eXBlKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmVudW1fdHlwZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjplbnVtX3R5cGUoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCisgIHJldHVybiBfaW50ZXJuYWxfZW51bV90eXBlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfYWRkX2VudW1fdHlwZSgpIHsKKyAgcmV0dXJuIF9pbXBsXy5lbnVtX3R5cGVfLkFkZCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86OmFkZF9lbnVtX3R5cGUoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvKiBfYWRkID0gX2ludGVybmFsX2FkZF9lbnVtX3R5cGUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmVudW1fdHlwZSkKKyAgcmV0dXJuIF9hZGQ7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvID4mCitEZXNjcmlwdG9yUHJvdG86OmVudW1fdHlwZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCisgIHJldHVybiBfaW1wbF8uZW51bV90eXBlXzsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UgZXh0ZW5zaW9uX3JhbmdlID0gNTsKK2lubGluZSBpbnQgRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfZXh0ZW5zaW9uX3JhbmdlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZXh0ZW5zaW9uX3JhbmdlXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfZXh0ZW5zaW9uX3JhbmdlX3NpemUoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZXh0ZW5zaW9uX3JhbmdlKCkgeworICBfaW1wbF8uZXh0ZW5zaW9uX3JhbmdlXy5DbGVhcigpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbnNpb25fcmFuZ2UoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uX3JhbmdlKQorICByZXR1cm4gX2ltcGxfLmV4dGVuc2lvbl9yYW5nZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgPioKK0Rlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbnNpb25fcmFuZ2UoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb25fcmFuZ2UpCisgIHJldHVybiAmX2ltcGxfLmV4dGVuc2lvbl9yYW5nZV87Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfZXh0ZW5zaW9uX3JhbmdlKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmV4dGVuc2lvbl9yYW5nZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9yYW5nZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbl9yYW5nZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9leHRlbnNpb25fcmFuZ2UoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2FkZF9leHRlbnNpb25fcmFuZ2UoKSB7CisgIHJldHVybiBfaW1wbF8uZXh0ZW5zaW9uX3JhbmdlXy5BZGQoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBEZXNjcmlwdG9yUHJvdG86OmFkZF9leHRlbnNpb25fcmFuZ2UoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIF9hZGQgPSBfaW50ZXJuYWxfYWRkX2V4dGVuc2lvbl9yYW5nZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uX3JhbmdlKQorICByZXR1cm4gX2FkZDsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSA+JgorRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb25fcmFuZ2UoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uX3JhbmdlKQorICByZXR1cm4gX2ltcGxfLmV4dGVuc2lvbl9yYW5nZV87Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8gb25lb2ZfZGVjbCA9IDg7CitpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX29uZW9mX2RlY2xfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5vbmVvZl9kZWNsXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6b25lb2ZfZGVjbF9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX29uZW9mX2RlY2xfc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vbmVvZl9kZWNsKCkgeworICBfaW1wbF8ub25lb2ZfZGVjbF8uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZEZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vbmVvZl9kZWNsKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9uZW9mX2RlY2wpCisgIHJldHVybiBfaW1wbF8ub25lb2ZfZGVjbF8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZkRlc2NyaXB0b3JQcm90byA+KgorRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29uZW9mX2RlY2woKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5vbmVvZl9kZWNsKQorICByZXR1cm4gJl9pbXBsXy5vbmVvZl9kZWNsXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZEZXNjcmlwdG9yUHJvdG8mIERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX29uZW9mX2RlY2woaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ub25lb2ZfZGVjbF8uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZEZXNjcmlwdG9yUHJvdG8mIERlc2NyaXB0b3JQcm90bzo6b25lb2ZfZGVjbChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9uZW9mX2RlY2wpCisgIHJldHVybiBfaW50ZXJuYWxfb25lb2ZfZGVjbChpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9hZGRfb25lb2ZfZGVjbCgpIHsKKyAgcmV0dXJuIF9pbXBsXy5vbmVvZl9kZWNsXy5BZGQoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZEZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6YWRkX29uZW9mX2RlY2woKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZkRlc2NyaXB0b3JQcm90byogX2FkZCA9IF9pbnRlcm5hbF9hZGRfb25lb2ZfZGVjbCgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub25lb2ZfZGVjbCkKKyAgcmV0dXJuIF9hZGQ7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZkRlc2NyaXB0b3JQcm90byA+JgorRGVzY3JpcHRvclByb3RvOjpvbmVvZl9kZWNsKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9uZW9mX2RlY2wpCisgIHJldHVybiBfaW1wbF8ub25lb2ZfZGVjbF87Cit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7CitpbmxpbmUgYm9vbCBEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9oYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworICBQUk9UT0JVRl9BU1NVTUUoIXZhbHVlIHx8IF9pbXBsXy5vcHRpb25zXyAhPSBudWxscHRyKTsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfb3B0aW9ucygpOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgeworICBpZiAoX2ltcGxfLm9wdGlvbnNfICE9IG51bGxwdHIpIF9pbXBsXy5vcHRpb25zXy0+Q2xlYXIoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlT3B0aW9ucyYgRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfb3B0aW9ucygpIGNvbnN0IHsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zKiBwID0gX2ltcGxfLm9wdGlvbnNfOworICByZXR1cm4gcCAhPSBudWxscHRyID8gKnAgOiByZWludGVycHJldF9jYXN0PGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlT3B0aW9ucyY+KAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9NZXNzYWdlT3B0aW9uc19kZWZhdWx0X2luc3RhbmNlXyk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zJiBEZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICByZXR1cm4gX2ludGVybmFsX29wdGlvbnMoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6dW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfb3B0aW9ucygKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPihfaW1wbF8ub3B0aW9uc18pOworICB9CisgIF9pbXBsXy5vcHRpb25zXyA9IG9wdGlvbnM7CisgIGlmIChvcHRpb25zKSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zKiBEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3B0aW9ucygpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZU9wdGlvbnMqIHRlbXAgPSBfaW1wbF8ub3B0aW9uc187CisgIF9pbXBsXy5vcHRpb25zXyA9IG51bGxwdHI7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGF1dG8qIG9sZCA9ICByZWludGVycHJldF9jYXN0PDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSo+KHRlbXApOworICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7IGRlbGV0ZSBvbGQ7IH0KKyNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpICE9IG51bGxwdHIpIHsKKyAgICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIH0KKyNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICByZXR1cm4gdGVtcDsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZU9wdGlvbnMqIERlc2NyaXB0b3JQcm90bzo6dW5zYWZlX2FyZW5hX3JlbGVhc2Vfb3B0aW9ucygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlT3B0aW9ucyogdGVtcCA9IF9pbXBsXy5vcHRpb25zXzsKKyAgX2ltcGxfLm9wdGlvbnNfID0gbnVsbHB0cjsKKyAgcmV0dXJuIHRlbXA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VPcHRpb25zKiBEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworICBpZiAoX2ltcGxfLm9wdGlvbnNfID09IG51bGxwdHIpIHsKKyAgICBhdXRvKiBwID0gQ3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlT3B0aW9ucz4oR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAgIF9pbXBsXy5vcHRpb25zXyA9IHA7CisgIH0KKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXzsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZU9wdGlvbnMqIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZU9wdGlvbnMqIF9tc2cgPSBfaW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKKyAgcmV0dXJuIF9tc2c7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBtZXNzYWdlX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGlmIChtZXNzYWdlX2FyZW5hID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgX2ltcGxfLm9wdGlvbnNfOworICB9CisgIGlmIChvcHRpb25zKSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBzdWJtZXNzYWdlX2FyZW5hID0KKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEdldE93bmluZ0FyZW5hKG9wdGlvbnMpOworICAgIGlmIChtZXNzYWdlX2FyZW5hICE9IHN1Ym1lc3NhZ2VfYXJlbmEpIHsKKyAgICAgIG9wdGlvbnMgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdldE93bmVkTWVzc2FnZSgKKyAgICAgICAgICBtZXNzYWdlX2FyZW5hLCBvcHRpb25zLCBzdWJtZXNzYWdlX2FyZW5hKTsKKyAgICB9CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICB9CisgIF9pbXBsXy5vcHRpb25zXyA9IG9wdGlvbnM7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSByZXNlcnZlZF9yYW5nZSA9IDk7CitpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3Jlc2VydmVkX3JhbmdlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ucmVzZXJ2ZWRfcmFuZ2VfLnNpemUoKTsKK30KK2lubGluZSBpbnQgRGVzY3JpcHRvclByb3RvOjpyZXNlcnZlZF9yYW5nZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX3Jlc2VydmVkX3JhbmdlX3NpemUoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfcmVzZXJ2ZWRfcmFuZ2UoKSB7CisgIF9pbXBsXy5yZXNlcnZlZF9yYW5nZV8uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9yZXNlcnZlZF9yYW5nZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9yYW5nZSkKKyAgcmV0dXJuIF9pbXBsXy5yZXNlcnZlZF9yYW5nZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSA+KgorRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3Jlc2VydmVkX3JhbmdlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfcmFuZ2UpCisgIHJldHVybiAmX2ltcGxfLnJlc2VydmVkX3JhbmdlXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3Jlc2VydmVkX3JhbmdlKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnJlc2VydmVkX3JhbmdlXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgRGVzY3JpcHRvclByb3RvOjpyZXNlcnZlZF9yYW5nZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX3JhbmdlKQorICByZXR1cm4gX2ludGVybmFsX3Jlc2VydmVkX3JhbmdlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2FkZF9yZXNlcnZlZF9yYW5nZSgpIHsKKyAgcmV0dXJuIF9pbXBsXy5yZXNlcnZlZF9yYW5nZV8uQWRkKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBEZXNjcmlwdG9yUHJvdG86OmFkZF9yZXNlcnZlZF9yYW5nZSgpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBfYWRkID0gX2ludGVybmFsX2FkZF9yZXNlcnZlZF9yYW5nZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfcmFuZ2UpCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UgPiYKK0Rlc2NyaXB0b3JQcm90bzo6cmVzZXJ2ZWRfcmFuZ2UoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfcmFuZ2UpCisgIHJldHVybiBfaW1wbF8ucmVzZXJ2ZWRfcmFuZ2VfOworfQorCisvLyByZXBlYXRlZCBzdHJpbmcgcmVzZXJ2ZWRfbmFtZSA9IDEwOworaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9yZXNlcnZlZF9uYW1lX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ucmVzZXJ2ZWRfbmFtZV8uc2l6ZSgpOworfQoraW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86OnJlc2VydmVkX25hbWVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9yZXNlcnZlZF9uYW1lX3NpemUoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfcmVzZXJ2ZWRfbmFtZSgpIHsKKyAgX2ltcGxfLnJlc2VydmVkX25hbWVfLkNsZWFyKCk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIERlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX25hbWUoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9hZGRfcmVzZXJ2ZWRfbmFtZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3Jlc2VydmVkX25hbWUoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ucmVzZXJ2ZWRfbmFtZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRGVzY3JpcHRvclByb3RvOjpyZXNlcnZlZF9uYW1lKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9yZXNlcnZlZF9uYW1lKGluZGV4KTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3Jlc2VydmVkX25hbWUoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKKyAgcmV0dXJuIF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X3Jlc2VydmVkX25hbWUoaW50IGluZGV4LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgX2ltcGxfLnJlc2VydmVkX25hbWVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X3Jlc2VydmVkX25hbWUoaW50IGluZGV4LCBzdGQ6OnN0cmluZyYmIHZhbHVlKSB7CisgIF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHN0ZDo6bW92ZSh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X3Jlc2VydmVkX25hbWUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICBHT09HTEVfRENIRUNLKHZhbHVlICE9IG51bGxwdHIpOworICBfaW1wbF8ucmVzZXJ2ZWRfbmFtZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9yZXNlcnZlZF9uYW1lKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKAorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2FkZF9yZXNlcnZlZF9uYW1lKCkgeworICByZXR1cm4gX2ltcGxfLnJlc2VydmVkX25hbWVfLkFkZCgpOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjphZGRfcmVzZXJ2ZWRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgX2ltcGxfLnJlc2VydmVkX25hbWVfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX25hbWUoc3RkOjpzdHJpbmcmJiB2YWx1ZSkgeworICBfaW1wbF8ucmVzZXJ2ZWRfbmFtZV8uQWRkKHN0ZDo6bW92ZSh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgR09PR0xFX0RDSEVDSyh2YWx1ZSAhPSBudWxscHRyKTsKKyAgX2ltcGxfLnJlc2VydmVkX25hbWVfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX2NoYXI6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQorfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjphZGRfcmVzZXJ2ZWRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgX2ltcGxfLnJlc2VydmVkX25hbWVfLkFkZCgpLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4mCitEZXNjcmlwdG9yUHJvdG86OnJlc2VydmVkX25hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKKyAgcmV0dXJuIF9pbXBsXy5yZXNlcnZlZF9uYW1lXzsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4qCitEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfcmVzZXJ2ZWRfbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCisgIHJldHVybiAmX2ltcGxfLnJlc2VydmVkX25hbWVfOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEV4dGVuc2lvblJhbmdlT3B0aW9ucworCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CitpbmxpbmUgaW50IEV4dGVuc2lvblJhbmdlT3B0aW9uczo6X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKK30KK2lubGluZSBpbnQgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKK30KK2lubGluZSB2b2lkIEV4dGVuc2lvblJhbmdlT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKK0V4dGVuc2lvblJhbmdlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gJl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl87Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIEV4dGVuc2lvblJhbmdlT3B0aW9uczo6X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiBFeHRlbnNpb25SYW5nZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiBfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb24oaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBFeHRlbnNpb25SYW5nZU9wdGlvbnM6Ol9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBFeHRlbnNpb25SYW5nZU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIF9hZGQgPSBfaW50ZXJuYWxfYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIF9hZGQ7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uID4mCitFeHRlbnNpb25SYW5nZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBGaWVsZERlc2NyaXB0b3JQcm90bworCisvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2hhc19uYW1lKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfbmFtZSgpOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIF9pbXBsXy5uYW1lXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bmFtZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9uYW1lKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyBfaW1wbF8ubmFtZV8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5uYW1lKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICBfaW1wbF8ubmFtZV8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIGlmICghX2ludGVybmFsX2hhc19uYW1lKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIGF1dG8qIHAgPSBfaW1wbF8ubmFtZV8uUmVsZWFzZSgpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5uYW1lXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIH0KKyAgX2ltcGxfLm5hbWVfLlNldEFsbG9jYXRlZChuYW1lLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLm5hbWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KKworLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMzsKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfaGFzX251bWJlcigpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwNDB1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX251bWJlcigpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfbnVtYmVyKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbnVtYmVyKCkgeworICBfaW1wbF8ubnVtYmVyXyA9IDA7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDQwdTsKK30KK2lubGluZSBpbnQzMl90IEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfbnVtYmVyKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm51bWJlcl87Cit9CitpbmxpbmUgaW50MzJfdCBGaWVsZERlc2NyaXB0b3JQcm90bzo6bnVtYmVyKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5udW1iZXIpCisgIHJldHVybiBfaW50ZXJuYWxfbnVtYmVyKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3NldF9udW1iZXIoaW50MzJfdCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDQwdTsKKyAgX2ltcGxfLm51bWJlcl8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfbnVtYmVyKGludDMyX3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9udW1iZXIodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5udW1iZXIpCit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwgbGFiZWwgPSA0OworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9oYXNfbGFiZWwoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMjAwdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19sYWJlbCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfbGFiZWwoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9sYWJlbCgpIHsKKyAgX2ltcGxfLmxhYmVsXyA9IDE7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMjAwdTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgRmllbGREZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9sYWJlbCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgPihfaW1wbF8ubGFiZWxfKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgRmllbGREZXNjcmlwdG9yUHJvdG86OmxhYmVsKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5sYWJlbCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9sYWJlbCgpOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9zZXRfbGFiZWwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIHZhbHVlKSB7CisgIGFzc2VydCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfSXNWYWxpZCh2YWx1ZSkpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMjAwdTsKKyAgX2ltcGxfLmxhYmVsXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9sYWJlbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9sYWJlbCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmxhYmVsKQorfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSA9IDU7CitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2hhc190eXBlKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDQwMHUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfdHlwZSgpOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX3R5cGUoKSB7CisgIF9pbXBsXy50eXBlXyA9IDE7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwNDAwdTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3R5cGUoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgPihfaW1wbF8udHlwZV8pOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjp0eXBlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlKQorICByZXR1cm4gX2ludGVybmFsX3R5cGUoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfc2V0X3R5cGUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgdmFsdWUpIHsKKyAgYXNzZXJ0KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX0lzVmFsaWQodmFsdWUpKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDQwMHU7CisgIF9pbXBsXy50eXBlXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF90eXBlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfdHlwZSh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGUpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9oYXNfdHlwZV9uYW1lKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfdHlwZV9uYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc190eXBlX25hbWUoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl90eXBlX25hbWUoKSB7CisgIF9pbXBsXy50eXBlX25hbWVfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvOjp0eXBlX25hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF90eXBlX25hbWUoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCwgdHlwZW5hbWUuLi4gQXJnVD4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfdHlwZV9uYW1lKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7CisgX2ltcGxfLnR5cGVfbmFtZV8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3R5cGVfbmFtZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfdHlwZV9uYW1lKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmllbGREZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF90eXBlX25hbWUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8udHlwZV9uYW1lXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfc2V0X3R5cGVfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7CisgIF9pbXBsXy50eXBlX25hbWVfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX211dGFibGVfdHlwZV9uYW1lKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKKyAgcmV0dXJuIF9pbXBsXy50eXBlX25hbWVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV90eXBlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUpCisgIGlmICghX2ludGVybmFsX2hhc190eXBlX25hbWUoKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKKyAgYXV0byogcCA9IF9pbXBsXy50eXBlX25hbWVfLlJlbGVhc2UoKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8udHlwZV9uYW1lXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy50eXBlX25hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICByZXR1cm4gcDsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX3R5cGVfbmFtZShzdGQ6OnN0cmluZyogdHlwZV9uYW1lKSB7CisgIGlmICh0eXBlX25hbWUgIT0gbnVsbHB0cikgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKKyAgfQorICBfaW1wbF8udHlwZV9uYW1lXy5TZXRBbGxvY2F0ZWQodHlwZV9uYW1lLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnR5cGVfbmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8udHlwZV9uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSkKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGV4dGVuZGVlID0gMjsKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfaGFzX2V4dGVuZGVlKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfZXh0ZW5kZWUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2V4dGVuZGVlKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZXh0ZW5kZWUoKSB7CisgIF9pbXBsXy5leHRlbmRlZV8uQ2xlYXJUb0VtcHR5KCk7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmllbGREZXNjcmlwdG9yUHJvdG86OmV4dGVuZGVlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9leHRlbmRlZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9leHRlbmRlZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworIF9pbXBsXy5leHRlbmRlZV8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5kZWUoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX2V4dGVuZGVlKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2V4dGVuZGVlKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmV4dGVuZGVlXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfc2V0X2V4dGVuZGVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgX2ltcGxfLmV4dGVuZGVlXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX2V4dGVuZGVlKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgcmV0dXJuIF9pbXBsXy5leHRlbmRlZV8uTXV0YWJsZShHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX2V4dGVuZGVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUpCisgIGlmICghX2ludGVybmFsX2hhc19leHRlbmRlZSgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICBhdXRvKiBwID0gX2ltcGxfLmV4dGVuZGVlXy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLmV4dGVuZGVlXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5leHRlbmRlZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIHJldHVybiBwOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfZXh0ZW5kZWUoc3RkOjpzdHJpbmcqIGV4dGVuZGVlKSB7CisgIGlmIChleHRlbmRlZSAhPSBudWxscHRyKSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICB9CisgIF9pbXBsXy5leHRlbmRlZV8uU2V0QWxsb2NhdGVkKGV4dGVuZGVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLmV4dGVuZGVlXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5leHRlbmRlZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSA3OworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9oYXNfZGVmYXVsdF92YWx1ZSgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDh1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX2RlZmF1bHRfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2RlZmF1bHRfdmFsdWUoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9kZWZhdWx0X3ZhbHVlKCkgeworICBfaW1wbF8uZGVmYXVsdF92YWx1ZV8uQ2xlYXJUb0VtcHR5KCk7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmllbGREZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfdmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUpCisgIHJldHVybiBfaW50ZXJuYWxfZGVmYXVsdF92YWx1ZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9kZWZhdWx0X3ZhbHVlKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7CisgX2ltcGxfLmRlZmF1bHRfdmFsdWVfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZSkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZGVmYXVsdF92YWx1ZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfZGVmYXVsdF92YWx1ZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZSkKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2RlZmF1bHRfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZGVmYXVsdF92YWx1ZV8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3NldF9kZWZhdWx0X3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKKyAgX2ltcGxfLmRlZmF1bHRfdmFsdWVfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX211dGFibGVfZGVmYXVsdF92YWx1ZSgpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7CisgIHJldHVybiBfaW1wbF8uZGVmYXVsdF92YWx1ZV8uTXV0YWJsZShHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX2RlZmF1bHRfdmFsdWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlKQorICBpZiAoIV9pbnRlcm5hbF9oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworICBhdXRvKiBwID0gX2ltcGxfLmRlZmF1bHRfdmFsdWVfLlJlbGVhc2UoKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8uZGVmYXVsdF92YWx1ZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uZGVmYXVsdF92YWx1ZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIHJldHVybiBwOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfZGVmYXVsdF92YWx1ZShzdGQ6OnN0cmluZyogZGVmYXVsdF92YWx1ZSkgeworICBpZiAoZGVmYXVsdF92YWx1ZSAhPSBudWxscHRyKSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworICB9CisgIF9pbXBsXy5kZWZhdWx0X3ZhbHVlXy5TZXRBbGxvY2F0ZWQoZGVmYXVsdF92YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5kZWZhdWx0X3ZhbHVlXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5kZWZhdWx0X3ZhbHVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUpCit9CisKKy8vIG9wdGlvbmFsIGludDMyIG9uZW9mX2luZGV4ID0gOTsKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfaGFzX29uZW9mX2luZGV4KCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDA4MHUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfb25lb2ZfaW5kZXgoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX29uZW9mX2luZGV4KCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb25lb2ZfaW5kZXgoKSB7CisgIF9pbXBsXy5vbmVvZl9pbmRleF8gPSAwOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA4MHU7Cit9CitpbmxpbmUgaW50MzJfdCBGaWVsZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX29uZW9mX2luZGV4KCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm9uZW9mX2luZGV4XzsKK30KK2lubGluZSBpbnQzMl90IEZpZWxkRGVzY3JpcHRvclByb3RvOjpvbmVvZl9pbmRleCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub25lb2ZfaW5kZXgpCisgIHJldHVybiBfaW50ZXJuYWxfb25lb2ZfaW5kZXgoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfc2V0X29uZW9mX2luZGV4KGludDMyX3QgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA4MHU7CisgIF9pbXBsXy5vbmVvZl9pbmRleF8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfb25lb2ZfaW5kZXgoaW50MzJfdCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X29uZW9mX2luZGV4KHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub25lb2ZfaW5kZXgpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBqc29uX25hbWUgPSAxMDsKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfaGFzX2pzb25fbmFtZSgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMTB1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX2pzb25fbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfanNvbl9uYW1lKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfanNvbl9uYW1lKCkgeworICBfaW1wbF8uanNvbl9uYW1lXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6anNvbl9uYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUpCisgIHJldHVybiBfaW50ZXJuYWxfanNvbl9uYW1lKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2pzb25fbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMTB1OworIF9pbXBsXy5qc29uX25hbWVfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uanNvbl9uYW1lKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9qc29uX25hbWUoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX2pzb25fbmFtZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uanNvbl9uYW1lKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfanNvbl9uYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmpzb25fbmFtZV8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3NldF9qc29uX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMTB1OworICBfaW1wbF8uanNvbl9uYW1lXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX2pzb25fbmFtZSgpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7CisgIHJldHVybiBfaW1wbF8uanNvbl9uYW1lXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfanNvbl9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uanNvbl9uYW1lKQorICBpZiAoIV9pbnRlcm5hbF9oYXNfanNvbl9uYW1lKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAxMHU7CisgIGF1dG8qIHAgPSBfaW1wbF8uanNvbl9uYW1lXy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLmpzb25fbmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uanNvbl9uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9qc29uX25hbWUoc3RkOjpzdHJpbmcqIGpzb25fbmFtZSkgeworICBpZiAoanNvbl9uYW1lICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDEwdTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAxMHU7CisgIH0KKyAgX2ltcGxfLmpzb25fbmFtZV8uU2V0QWxsb2NhdGVkKGpzb25fbmFtZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5qc29uX25hbWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLmpzb25fbmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUpCit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9oYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMjB1KSAhPSAwOworICBQUk9UT0JVRl9BU1NVTUUoIXZhbHVlIHx8IF9pbXBsXy5vcHRpb25zXyAhPSBudWxscHRyKTsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19vcHRpb25zKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19vcHRpb25zKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKKyAgaWYgKF9pbXBsXy5vcHRpb25zXyAhPSBudWxscHRyKSBfaW1wbF8ub3B0aW9uc18tPkNsZWFyKCk7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDIwdTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX29wdGlvbnMoKSBjb25zdCB7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnMqIHAgPSBfaW1wbF8ub3B0aW9uc187CisgIHJldHVybiBwICE9IG51bGxwdHIgPyAqcCA6IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucyY+KAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9GaWVsZE9wdGlvbnNfZGVmYXVsdF9pbnN0YW5jZV8pOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnMmIEZpZWxkRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICByZXR1cm4gX2ludGVybmFsX29wdGlvbnMoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjp1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF9vcHRpb25zKAorICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPihfaW1wbF8ub3B0aW9uc18pOworICB9CisgIF9pbXBsXy5vcHRpb25zXyA9IG9wdGlvbnM7CisgIGlmIChvcHRpb25zKSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAyMHU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMjB1OworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAyMHU7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnMqIHRlbXAgPSBfaW1wbF8ub3B0aW9uc187CisgIF9pbXBsXy5vcHRpb25zXyA9IG51bGxwdHI7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGF1dG8qIG9sZCA9ICByZWludGVycHJldF9jYXN0PDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSo+KHRlbXApOworICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7IGRlbGV0ZSBvbGQ7IH0KKyNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpICE9IG51bGxwdHIpIHsKKyAgICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIH0KKyNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICByZXR1cm4gdGVtcDsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6dW5zYWZlX2FyZW5hX3JlbGVhc2Vfb3B0aW9ucygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDIwdTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucyogdGVtcCA9IF9pbXBsXy5vcHRpb25zXzsKKyAgX2ltcGxfLm9wdGlvbnNfID0gbnVsbHB0cjsKKyAgcmV0dXJuIHRlbXA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucyogRmllbGREZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMjB1OworICBpZiAoX2ltcGxfLm9wdGlvbnNfID09IG51bGxwdHIpIHsKKyAgICBhdXRvKiBwID0gQ3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnM+KEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgICBfaW1wbF8ub3B0aW9uc18gPSBwOworICB9CisgIHJldHVybiBfaW1wbF8ub3B0aW9uc187Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucyogRmllbGREZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9ucyogX21zZyA9IF9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIHJldHVybiBfbXNnOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zKiBvcHRpb25zKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogbWVzc2FnZV9hcmVuYSA9IEdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBpZiAobWVzc2FnZV9hcmVuYSA9PSBudWxscHRyKSB7CisgICAgZGVsZXRlIF9pbXBsXy5vcHRpb25zXzsKKyAgfQorICBpZiAob3B0aW9ucykgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogc3VibWVzc2FnZV9hcmVuYSA9CisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxHZXRPd25pbmdBcmVuYShvcHRpb25zKTsKKyAgICBpZiAobWVzc2FnZV9hcmVuYSAhPSBzdWJtZXNzYWdlX2FyZW5hKSB7CisgICAgICBvcHRpb25zID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZXRPd25lZE1lc3NhZ2UoCisgICAgICAgICAgbWVzc2FnZV9hcmVuYSwgb3B0aW9ucywgc3VibWVzc2FnZV9hcmVuYSk7CisgICAgfQorICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMjB1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDIwdTsKKyAgfQorICBfaW1wbF8ub3B0aW9uc18gPSBvcHRpb25zOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKK30KKworLy8gb3B0aW9uYWwgYm9vbCBwcm90bzNfb3B0aW9uYWwgPSAxNzsKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfaGFzX3Byb3RvM19vcHRpb25hbCgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAxMDB1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX3Byb3RvM19vcHRpb25hbCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfcHJvdG8zX29wdGlvbmFsKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfcHJvdG8zX29wdGlvbmFsKCkgeworICBfaW1wbF8ucHJvdG8zX29wdGlvbmFsXyA9IGZhbHNlOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDEwMHU7Cit9CitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3Byb3RvM19vcHRpb25hbCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5wcm90bzNfb3B0aW9uYWxfOworfQoraW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86OnByb3RvM19vcHRpb25hbCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ucHJvdG8zX29wdGlvbmFsKQorICByZXR1cm4gX2ludGVybmFsX3Byb3RvM19vcHRpb25hbCgpOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9zZXRfcHJvdG8zX29wdGlvbmFsKGJvb2wgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDEwMHU7CisgIF9pbXBsXy5wcm90bzNfb3B0aW9uYWxfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X3Byb3RvM19vcHRpb25hbChib29sIHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfcHJvdG8zX29wdGlvbmFsKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ucHJvdG8zX29wdGlvbmFsKQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE9uZW9mRGVzY3JpcHRvclByb3RvCisKKy8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKK2lubGluZSBib29sIE9uZW9mRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfaGFzX25hbWUoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgT25lb2ZEZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19uYW1lKCk7Cit9CitpbmxpbmUgdm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKKyAgX2ltcGxfLm5hbWVfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIE9uZW9mRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gX2ludGVybmFsX25hbWUoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCwgdHlwZW5hbWUuLi4gQXJnVD4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCit2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworIF9pbXBsXy5uYW1lXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIE9uZW9mRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgT25lb2ZEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9uYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm5hbWVfLkdldCgpOworfQoraW5saW5lIHZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9zZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7CisgIF9pbXBsXy5uYW1lXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogT25lb2ZEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICByZXR1cm4gX2ltcGxfLm5hbWVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBPbmVvZkRlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgaWYgKCFfaW50ZXJuYWxfaGFzX25hbWUoKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKKyAgYXV0byogcCA9IF9pbXBsXy5uYW1lXy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLm5hbWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICByZXR1cm4gcDsKK30KK2lubGluZSB2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoc3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWUgIT0gbnVsbHB0cikgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKKyAgfQorICBfaW1wbF8ubmFtZV8uU2V0QWxsb2NhdGVkKG5hbWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ubmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lKQorfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucyBvcHRpb25zID0gMjsKK2lubGluZSBib29sIE9uZW9mRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfaGFzX29wdGlvbnMoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKKyAgUFJPVE9CVUZfQVNTVU1FKCF2YWx1ZSB8fCBfaW1wbF8ub3B0aW9uc18gIT0gbnVsbHB0cik7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIE9uZW9mRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfb3B0aW9ucygpOworfQoraW5saW5lIHZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OmNsZWFyX29wdGlvbnMoKSB7CisgIGlmIChfaW1wbF8ub3B0aW9uc18gIT0gbnVsbHB0cikgX2ltcGxfLm9wdGlvbnNfLT5DbGVhcigpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mT3B0aW9ucyYgT25lb2ZEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9vcHRpb25zKCkgY29uc3QgeworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZPcHRpb25zKiBwID0gX2ltcGxfLm9wdGlvbnNfOworICByZXR1cm4gcCAhPSBudWxscHRyID8gKnAgOiByZWludGVycHJldF9jYXN0PGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZk9wdGlvbnMmPigKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfT25lb2ZPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfKTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZPcHRpb25zJiBPbmVvZkRlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKKyAgcmV0dXJuIF9pbnRlcm5hbF9vcHRpb25zKCk7Cit9CitpbmxpbmUgdm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6dW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfb3B0aW9ucygKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZPcHRpb25zKiBvcHRpb25zKSB7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7CisgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VMaXRlKj4oX2ltcGxfLm9wdGlvbnNfKTsKKyAgfQorICBfaW1wbF8ub3B0aW9uc18gPSBvcHRpb25zOworICBpZiAob3B0aW9ucykgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mT3B0aW9ucyogT25lb2ZEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3B0aW9ucygpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZPcHRpb25zKiB0ZW1wID0gX2ltcGxfLm9wdGlvbnNfOworICBfaW1wbF8ub3B0aW9uc18gPSBudWxscHRyOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICBhdXRvKiBvbGQgPSAgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPih0ZW1wKTsKKyAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikgeyBkZWxldGUgb2xkOyB9CisjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSAhPSBudWxscHRyKSB7CisgICAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICB9CisjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgcmV0dXJuIHRlbXA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mT3B0aW9ucyogT25lb2ZEZXNjcmlwdG9yUHJvdG86OnVuc2FmZV9hcmVuYV9yZWxlYXNlX29wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZk9wdGlvbnMqIHRlbXAgPSBfaW1wbF8ub3B0aW9uc187CisgIF9pbXBsXy5vcHRpb25zXyA9IG51bGxwdHI7CisgIHJldHVybiB0ZW1wOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZk9wdGlvbnMqIE9uZW9mRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgaWYgKF9pbXBsXy5vcHRpb25zXyA9PSBudWxscHRyKSB7CisgICAgYXV0byogcCA9IENyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T25lb2ZPcHRpb25zPihHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICAgX2ltcGxfLm9wdGlvbnNfID0gcDsKKyAgfQorICByZXR1cm4gX2ltcGxfLm9wdGlvbnNfOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZk9wdGlvbnMqIE9uZW9mRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPbmVvZk9wdGlvbnMqIF9tc2cgPSBfaW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICByZXR1cm4gX21zZzsKK30KK2lubGluZSB2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9uZW9mT3B0aW9ucyogb3B0aW9ucykgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIG1lc3NhZ2VfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgaWYgKG1lc3NhZ2VfYXJlbmEgPT0gbnVsbHB0cikgeworICAgIGRlbGV0ZSBfaW1wbF8ub3B0aW9uc187CisgIH0KKyAgaWYgKG9wdGlvbnMpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIHN1Ym1lc3NhZ2VfYXJlbmEgPQorICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEob3B0aW9ucyk7CisgICAgaWYgKG1lc3NhZ2VfYXJlbmEgIT0gc3VibWVzc2FnZV9hcmVuYSkgeworICAgICAgb3B0aW9ucyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2V0T3duZWRNZXNzYWdlKAorICAgICAgICAgIG1lc3NhZ2VfYXJlbmEsIG9wdGlvbnMsIHN1Ym1lc3NhZ2VfYXJlbmEpOworICAgIH0KKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CisgIH0KKyAgX2ltcGxfLm9wdGlvbnNfID0gb3B0aW9uczsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZQorCisvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7CitpbmxpbmUgYm9vbCBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlOjpfaW50ZXJuYWxfaGFzX3N0YXJ0KCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2U6Omhhc19zdGFydCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfc3RhcnQoKTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2U6OmNsZWFyX3N0YXJ0KCkgeworICBfaW1wbF8uc3RhcnRfID0gMDsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIGludDMyX3QgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZTo6X2ludGVybmFsX3N0YXJ0KCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnN0YXJ0XzsKK30KK2lubGluZSBpbnQzMl90IEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2U6OnN0YXJ0KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlLnN0YXJ0KQorICByZXR1cm4gX2ludGVybmFsX3N0YXJ0KCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlOjpfaW50ZXJuYWxfc2V0X3N0YXJ0KGludDMyX3QgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7CisgIF9pbXBsXy5zdGFydF8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2U6OnNldF9zdGFydChpbnQzMl90IHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfc3RhcnQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlLnN0YXJ0KQorfQorCisvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworaW5saW5lIGJvb2wgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZTo6X2ludGVybmFsX2hhc19lbmQoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZTo6aGFzX2VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfZW5kKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlOjpjbGVhcl9lbmQoKSB7CisgIF9pbXBsXy5lbmRfID0gMDsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIGludDMyX3QgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZTo6X2ludGVybmFsX2VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5lbmRfOworfQoraW5saW5lIGludDMyX3QgRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZTo6ZW5kKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlLmVuZCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9lbmQoKTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2U6Ol9pbnRlcm5hbF9zZXRfZW5kKGludDMyX3QgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIF9pbXBsXy5lbmRfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlOjpzZXRfZW5kKGludDMyX3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9lbmQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlLmVuZCkKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFbnVtRGVzY3JpcHRvclByb3RvCisKKy8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKK2lubGluZSBib29sIEVudW1EZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9oYXNfbmFtZSgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBFbnVtRGVzY3JpcHRvclByb3RvOjpoYXNfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfbmFtZSgpOworfQoraW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKKyAgX2ltcGxfLm5hbWVfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEVudW1EZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9uYW1lKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworIF9pbXBsXy5uYW1lXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRW51bURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRW51bURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX25hbWUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubmFtZV8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICBfaW1wbF8ubmFtZV8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEVudW1EZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICByZXR1cm4gX2ltcGxfLm5hbWVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBFbnVtRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIGlmICghX2ludGVybmFsX2hhc19uYW1lKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIGF1dG8qIHAgPSBfaW1wbF8ubmFtZV8uUmVsZWFzZSgpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5uYW1lXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoc3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWUgIT0gbnVsbHB0cikgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKKyAgfQorICBfaW1wbF8ubmFtZV8uU2V0QWxsb2NhdGVkKG5hbWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ubmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUpCit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHZhbHVlID0gMjsKK2lubGluZSBpbnQgRW51bURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3ZhbHVlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8udmFsdWVfLnNpemUoKTsKK30KK2lubGluZSBpbnQgRW51bURlc2NyaXB0b3JQcm90bzo6dmFsdWVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF92YWx1ZV9zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpjbGVhcl92YWx1ZSgpIHsKKyAgX2ltcGxfLnZhbHVlXy5DbGVhcigpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIEVudW1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfdmFsdWUoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnZhbHVlKQorICByZXR1cm4gX2ltcGxfLnZhbHVlXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byA+KgorRW51bURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV92YWx1ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by52YWx1ZSkKKyAgcmV0dXJuICZfaW1wbF8udmFsdWVfOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIEVudW1EZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF92YWx1ZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy52YWx1ZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBFbnVtRGVzY3JpcHRvclByb3RvOjp2YWx1ZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by52YWx1ZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF92YWx1ZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogRW51bURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2FkZF92YWx1ZSgpIHsKKyAgcmV0dXJuIF9pbXBsXy52YWx1ZV8uQWRkKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogRW51bURlc2NyaXB0b3JQcm90bzo6YWRkX3ZhbHVlKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBfYWRkID0gX2ludGVybmFsX2FkZF92YWx1ZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnZhbHVlKQorICByZXR1cm4gX2FkZDsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byA+JgorRW51bURlc2NyaXB0b3JQcm90bzo6dmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnZhbHVlKQorICByZXR1cm4gX2ltcGxfLnZhbHVlXzsKK30KKworLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyBvcHRpb25zID0gMzsKK2lubGluZSBib29sIEVudW1EZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9oYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworICBQUk9UT0JVRl9BU1NVTUUoIXZhbHVlIHx8IF9pbXBsXy5vcHRpb25zXyAhPSBudWxscHRyKTsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRW51bURlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX29wdGlvbnMoKTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OmNsZWFyX29wdGlvbnMoKSB7CisgIGlmIChfaW1wbF8ub3B0aW9uc18gIT0gbnVsbHB0cikgX2ltcGxfLm9wdGlvbnNfLT5DbGVhcigpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1PcHRpb25zJiBFbnVtRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfb3B0aW9ucygpIGNvbnN0IHsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1PcHRpb25zKiBwID0gX2ltcGxfLm9wdGlvbnNfOworICByZXR1cm4gcCAhPSBudWxscHRyID8gKnAgOiByZWludGVycHJldF9jYXN0PGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucyY+KAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9FbnVtT3B0aW9uc19kZWZhdWx0X2luc3RhbmNlXyk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1PcHRpb25zJiBFbnVtRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIHJldHVybiBfaW50ZXJuYWxfb3B0aW9ucygpOworfQoraW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6dW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfb3B0aW9ucygKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPihfaW1wbF8ub3B0aW9uc18pOworICB9CisgIF9pbXBsXy5vcHRpb25zXyA9IG9wdGlvbnM7CisgIGlmIChvcHRpb25zKSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucyogRW51bURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucyogdGVtcCA9IF9pbXBsXy5vcHRpb25zXzsKKyAgX2ltcGxfLm9wdGlvbnNfID0gbnVsbHB0cjsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgYXV0byogb2xkID0gIHJlaW50ZXJwcmV0X2Nhc3Q8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VMaXRlKj4odGVtcCk7CisgIHRlbXAgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkR1cGxpY2F0ZUlmTm9uTnVsbCh0ZW1wKTsKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpIHsgZGVsZXRlIG9sZDsgfQorI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgIT0gbnVsbHB0cikgeworICAgIHRlbXAgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkR1cGxpY2F0ZUlmTm9uTnVsbCh0ZW1wKTsKKyAgfQorI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIHJldHVybiB0ZW1wOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucyogRW51bURlc2NyaXB0b3JQcm90bzo6dW5zYWZlX2FyZW5hX3JlbGVhc2Vfb3B0aW9ucygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bU9wdGlvbnMqIHRlbXAgPSBfaW1wbF8ub3B0aW9uc187CisgIF9pbXBsXy5vcHRpb25zXyA9IG51bGxwdHI7CisgIHJldHVybiB0ZW1wOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucyogRW51bURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX211dGFibGVfb3B0aW9ucygpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIGlmIChfaW1wbF8ub3B0aW9uc18gPT0gbnVsbHB0cikgeworICAgIGF1dG8qIHAgPSBDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1PcHRpb25zPihHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICAgX2ltcGxfLm9wdGlvbnNfID0gcDsKKyAgfQorICByZXR1cm4gX2ltcGxfLm9wdGlvbnNfOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucyogRW51bURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bU9wdGlvbnMqIF9tc2cgPSBfaW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIHJldHVybiBfbXNnOworfQoraW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtT3B0aW9ucyogb3B0aW9ucykgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIG1lc3NhZ2VfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgaWYgKG1lc3NhZ2VfYXJlbmEgPT0gbnVsbHB0cikgeworICAgIGRlbGV0ZSBfaW1wbF8ub3B0aW9uc187CisgIH0KKyAgaWYgKG9wdGlvbnMpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIHN1Ym1lc3NhZ2VfYXJlbmEgPQorICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEob3B0aW9ucyk7CisgICAgaWYgKG1lc3NhZ2VfYXJlbmEgIT0gc3VibWVzc2FnZV9hcmVuYSkgeworICAgICAgb3B0aW9ucyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2V0T3duZWRNZXNzYWdlKAorICAgICAgICAgIG1lc3NhZ2VfYXJlbmEsIG9wdGlvbnMsIHN1Ym1lc3NhZ2VfYXJlbmEpOworICAgIH0KKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CisgIH0KKyAgX2ltcGxfLm9wdGlvbnNfID0gb3B0aW9uczsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlIHJlc2VydmVkX3JhbmdlID0gNDsKK2lubGluZSBpbnQgRW51bURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3Jlc2VydmVkX3JhbmdlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ucmVzZXJ2ZWRfcmFuZ2VfLnNpemUoKTsKK30KK2lubGluZSBpbnQgRW51bURlc2NyaXB0b3JQcm90bzo6cmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9yZXNlcnZlZF9yYW5nZV9zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpjbGVhcl9yZXNlcnZlZF9yYW5nZSgpIHsKKyAgX2ltcGxfLnJlc2VydmVkX3JhbmdlXy5DbGVhcigpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlKiBFbnVtRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3Jlc2VydmVkX3JhbmdlKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9yYW5nZSkKKyAgcmV0dXJuIF9pbXBsXy5yZXNlcnZlZF9yYW5nZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlID4qCitFbnVtRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3Jlc2VydmVkX3JhbmdlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX3JhbmdlKQorICByZXR1cm4gJl9pbXBsXy5yZXNlcnZlZF9yYW5nZV87Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yUHJvdG9fRW51bVJlc2VydmVkUmFuZ2UmIEVudW1EZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9yZXNlcnZlZF9yYW5nZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5yZXNlcnZlZF9yYW5nZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSYgRW51bURlc2NyaXB0b3JQcm90bzo6cmVzZXJ2ZWRfcmFuZ2UoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfcmFuZ2UpCisgIHJldHVybiBfaW50ZXJuYWxfcmVzZXJ2ZWRfcmFuZ2UoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlKiBFbnVtRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfYWRkX3Jlc2VydmVkX3JhbmdlKCkgeworICByZXR1cm4gX2ltcGxfLnJlc2VydmVkX3JhbmdlXy5BZGQoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSogRW51bURlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX3JhbmdlKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZSogX2FkZCA9IF9pbnRlcm5hbF9hZGRfcmVzZXJ2ZWRfcmFuZ2UoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9yYW5nZSkKKyAgcmV0dXJuIF9hZGQ7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlID4mCitFbnVtRGVzY3JpcHRvclByb3RvOjpyZXNlcnZlZF9yYW5nZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfcmFuZ2UpCisgIHJldHVybiBfaW1wbF8ucmVzZXJ2ZWRfcmFuZ2VfOworfQorCisvLyByZXBlYXRlZCBzdHJpbmcgcmVzZXJ2ZWRfbmFtZSA9IDU7CitpbmxpbmUgaW50IEVudW1EZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9yZXNlcnZlZF9uYW1lX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ucmVzZXJ2ZWRfbmFtZV8uc2l6ZSgpOworfQoraW5saW5lIGludCBFbnVtRGVzY3JpcHRvclByb3RvOjpyZXNlcnZlZF9uYW1lX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfcmVzZXJ2ZWRfbmFtZV9zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpjbGVhcl9yZXNlcnZlZF9uYW1lKCkgeworICBfaW1wbF8ucmVzZXJ2ZWRfbmFtZV8uQ2xlYXIoKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRW51bURlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX25hbWUoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9hZGRfcmVzZXJ2ZWRfbmFtZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBFbnVtRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBFbnVtRGVzY3JpcHRvclByb3RvOjpyZXNlcnZlZF9uYW1lKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCisgIHJldHVybiBfaW50ZXJuYWxfcmVzZXJ2ZWRfbmFtZShpbmRleCk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEVudW1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKKyAgcmV0dXJuIF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9yZXNlcnZlZF9uYW1lKGludCBpbmRleCwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQorfQoraW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6c2V0X3Jlc2VydmVkX25hbWUoaW50IGluZGV4LCBzdGQ6OnN0cmluZyYmIHZhbHVlKSB7CisgIF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHN0ZDo6bW92ZSh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0sodmFsdWUgIT0gbnVsbHB0cik7CisgIF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBfaW1wbF8ucmVzZXJ2ZWRfbmFtZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbigKKyAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRW51bURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2FkZF9yZXNlcnZlZF9uYW1lKCkgeworICByZXR1cm4gX2ltcGxfLnJlc2VydmVkX25hbWVfLkFkZCgpOworfQoraW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQorfQoraW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX25hbWUoc3RkOjpzdHJpbmcmJiB2YWx1ZSkgeworICBfaW1wbF8ucmVzZXJ2ZWRfbmFtZV8uQWRkKHN0ZDo6bW92ZSh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjphZGRfcmVzZXJ2ZWRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBHT09HTEVfRENIRUNLKHZhbHVlICE9IG51bGxwdHIpOworICBfaW1wbF8ucmVzZXJ2ZWRfbmFtZV8uQWRkKCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfY2hhcjpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQorfQoraW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIF9pbXBsXy5yZXNlcnZlZF9uYW1lXy5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQorfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiYKK0VudW1EZXNjcmlwdG9yUHJvdG86OnJlc2VydmVkX25hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCisgIHJldHVybiBfaW1wbF8ucmVzZXJ2ZWRfbmFtZV87Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KgorRW51bURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9yZXNlcnZlZF9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCisgIHJldHVybiAmX2ltcGxfLnJlc2VydmVkX25hbWVfOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bworCisvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CitpbmxpbmUgYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9oYXNfbmFtZSgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19uYW1lKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIF9pbXBsXy5uYW1lXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gX2ludGVybmFsX25hbWUoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCwgdHlwZW5hbWUuLi4gQXJnVD4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyBfaW1wbF8ubmFtZV8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX25hbWUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubmFtZV8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9zZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7CisgIF9pbXBsXy5uYW1lXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgaWYgKCFfaW50ZXJuYWxfaGFzX25hbWUoKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKKyAgYXV0byogcCA9IF9pbXBsXy5uYW1lXy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLm5hbWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICByZXR1cm4gcDsKK30KK2lubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIH0KKyAgX2ltcGxfLm5hbWVfLlNldEFsbG9jYXRlZChuYW1lLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLm5hbWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUpCit9CisKKy8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7CitpbmxpbmUgYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9oYXNfbnVtYmVyKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6aGFzX251bWJlcigpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfbnVtYmVyKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX251bWJlcigpIHsKKyAgX2ltcGxfLm51bWJlcl8gPSAwOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgaW50MzJfdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9udW1iZXIoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubnVtYmVyXzsKK30KK2lubGluZSBpbnQzMl90IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6bnVtYmVyKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubnVtYmVyKQorICByZXR1cm4gX2ludGVybmFsX251bWJlcigpOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfc2V0X251bWJlcihpbnQzMl90IHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworICBfaW1wbF8ubnVtYmVyXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfbnVtYmVyKGludDMyX3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9udW1iZXIodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubnVtYmVyKQorfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMgb3B0aW9ucyA9IDM7CitpbmxpbmUgYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9oYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworICBQUk9UT0JVRl9BU1NVTUUoIXZhbHVlIHx8IF9pbXBsXy5vcHRpb25zXyAhPSBudWxscHRyKTsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfb3B0aW9ucygpOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgeworICBpZiAoX2ltcGxfLm9wdGlvbnNfICE9IG51bGxwdHIpIF9pbXBsXy5vcHRpb25zXy0+Q2xlYXIoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVPcHRpb25zJiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9vcHRpb25zKCkgY29uc3QgeworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlT3B0aW9ucyogcCA9IF9pbXBsXy5vcHRpb25zXzsKKyAgcmV0dXJuIHAgIT0gbnVsbHB0ciA/ICpwIDogcmVpbnRlcnByZXRfY2FzdDxjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlT3B0aW9ucyY+KAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9FbnVtVmFsdWVPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfKTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlT3B0aW9ucyYgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKKyAgcmV0dXJuIF9pbnRlcm5hbF9vcHRpb25zKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkX29wdGlvbnMoCisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPihfaW1wbF8ub3B0aW9uc18pOworICB9CisgIF9pbXBsXy5vcHRpb25zXyA9IG9wdGlvbnM7CisgIGlmIChvcHRpb25zKSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZU9wdGlvbnMqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVPcHRpb25zKiB0ZW1wID0gX2ltcGxfLm9wdGlvbnNfOworICBfaW1wbF8ub3B0aW9uc18gPSBudWxscHRyOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICBhdXRvKiBvbGQgPSAgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPih0ZW1wKTsKKyAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikgeyBkZWxldGUgb2xkOyB9CisjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSAhPSBudWxscHRyKSB7CisgICAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICB9CisjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgcmV0dXJuIHRlbXA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZU9wdGlvbnMqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6dW5zYWZlX2FyZW5hX3JlbGVhc2Vfb3B0aW9ucygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVPcHRpb25zKiB0ZW1wID0gX2ltcGxfLm9wdGlvbnNfOworICBfaW1wbF8ub3B0aW9uc18gPSBudWxscHRyOworICByZXR1cm4gdGVtcDsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlT3B0aW9ucyogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgaWYgKF9pbXBsXy5vcHRpb25zXyA9PSBudWxscHRyKSB7CisgICAgYXV0byogcCA9IENyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlT3B0aW9ucz4oR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAgIF9pbXBsXy5vcHRpb25zXyA9IHA7CisgIH0KKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXzsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlT3B0aW9ucyogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWVPcHRpb25zKiBfbXNnID0gX2ludGVybmFsX211dGFibGVfb3B0aW9ucygpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIHJldHVybiBfbXNnOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBtZXNzYWdlX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGlmIChtZXNzYWdlX2FyZW5hID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgX2ltcGxfLm9wdGlvbnNfOworICB9CisgIGlmIChvcHRpb25zKSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBzdWJtZXNzYWdlX2FyZW5hID0KKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEdldE93bmluZ0FyZW5hKG9wdGlvbnMpOworICAgIGlmIChtZXNzYWdlX2FyZW5hICE9IHN1Ym1lc3NhZ2VfYXJlbmEpIHsKKyAgICAgIG9wdGlvbnMgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdldE93bmVkTWVzc2FnZSgKKyAgICAgICAgICBtZXNzYWdlX2FyZW5hLCBvcHRpb25zLCBzdWJtZXNzYWdlX2FyZW5hKTsKKyAgICB9CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICB9CisgIF9pbXBsXy5vcHRpb25zXyA9IG9wdGlvbnM7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvCisKKy8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKK2lubGluZSBib29sIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9oYXNfbmFtZSgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpoYXNfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfbmFtZSgpOworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKKyAgX2ltcGxfLm5hbWVfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9uYW1lKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworIF9pbXBsXy5uYW1lXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogU2VydmljZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgU2VydmljZURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX25hbWUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubmFtZV8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICBfaW1wbF8ubmFtZV8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICByZXR1cm4gX2ltcGxfLm5hbWVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIGlmICghX2ludGVybmFsX2hhc19uYW1lKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIGF1dG8qIHAgPSBfaW1wbF8ubmFtZV8uUmVsZWFzZSgpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5uYW1lXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoc3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWUgIT0gbnVsbHB0cikgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKKyAgfQorICBfaW1wbF8ubmFtZV8uU2V0QWxsb2NhdGVkKG5hbWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ubmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7CitpbmxpbmUgaW50IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tZXRob2Rfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5tZXRob2RfLnNpemUoKTsKK30KK2lubGluZSBpbnQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6bWV0aG9kX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfbWV0aG9kX3NpemUoKTsKK30KK2lubGluZSB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmNsZWFyX21ldGhvZCgpIHsKKyAgX2ltcGxfLm1ldGhvZF8uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kRGVzY3JpcHRvclByb3RvKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21ldGhvZChpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubWV0aG9kKQorICByZXR1cm4gX2ltcGxfLm1ldGhvZF8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2REZXNjcmlwdG9yUHJvdG8gPioKK1NlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbWV0aG9kKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm1ldGhvZCkKKyAgcmV0dXJuICZfaW1wbF8ubWV0aG9kXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kRGVzY3JpcHRvclByb3RvJiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfbWV0aG9kKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm1ldGhvZF8uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kRGVzY3JpcHRvclByb3RvJiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptZXRob2QoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubWV0aG9kKQorICByZXR1cm4gX2ludGVybmFsX21ldGhvZChpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZERlc2NyaXB0b3JQcm90byogU2VydmljZURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2FkZF9tZXRob2QoKSB7CisgIHJldHVybiBfaW1wbF8ubWV0aG9kXy5BZGQoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kRGVzY3JpcHRvclByb3RvKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjphZGRfbWV0aG9kKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kRGVzY3JpcHRvclByb3RvKiBfYWRkID0gX2ludGVybmFsX2FkZF9tZXRob2QoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5tZXRob2QpCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kRGVzY3JpcHRvclByb3RvID4mCitTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptZXRob2QoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm1ldGhvZCkKKyAgcmV0dXJuIF9pbXBsXy5tZXRob2RfOworfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOworaW5saW5lIGJvb2wgU2VydmljZURlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2hhc19vcHRpb25zKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7CisgIFBST1RPQlVGX0FTU1VNRSghdmFsdWUgfHwgX2ltcGxfLm9wdGlvbnNfICE9IG51bGxwdHIpOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfb3B0aW9ucygpOworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKKyAgaWYgKF9pbXBsXy5vcHRpb25zXyAhPSBudWxscHRyKSBfaW1wbF8ub3B0aW9uc18tPkNsZWFyKCk7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZU9wdGlvbnMmIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9vcHRpb25zKCkgY29uc3QgeworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZU9wdGlvbnMqIHAgPSBfaW1wbF8ub3B0aW9uc187CisgIHJldHVybiBwICE9IG51bGxwdHIgPyAqcCA6IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VPcHRpb25zJj4oCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X1NlcnZpY2VPcHRpb25zX2RlZmF1bHRfaW5zdGFuY2VfKTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZU9wdGlvbnMmIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKKyAgcmV0dXJuIF9pbnRlcm5hbF9vcHRpb25zKCk7Cit9CitpbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjp1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF9vcHRpb25zKAorICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlT3B0aW9ucyogb3B0aW9ucykgeworICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikgeworICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSo+KF9pbXBsXy5vcHRpb25zXyk7CisgIH0KKyAgX2ltcGxfLm9wdGlvbnNfID0gb3B0aW9uczsKKyAgaWYgKG9wdGlvbnMpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3Vuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VPcHRpb25zKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VPcHRpb25zKiB0ZW1wID0gX2ltcGxfLm9wdGlvbnNfOworICBfaW1wbF8ub3B0aW9uc18gPSBudWxscHRyOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICBhdXRvKiBvbGQgPSAgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPih0ZW1wKTsKKyAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikgeyBkZWxldGUgb2xkOyB9CisjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSAhPSBudWxscHRyKSB7CisgICAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICB9CisjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgcmV0dXJuIHRlbXA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VPcHRpb25zKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjp1bnNhZmVfYXJlbmFfcmVsZWFzZV9vcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlT3B0aW9ucyogdGVtcCA9IF9pbXBsXy5vcHRpb25zXzsKKyAgX2ltcGxfLm9wdGlvbnNfID0gbnVsbHB0cjsKKyAgcmV0dXJuIHRlbXA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VPcHRpb25zKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgaWYgKF9pbXBsXy5vcHRpb25zXyA9PSBudWxscHRyKSB7CisgICAgYXV0byogcCA9IENyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U2VydmljZU9wdGlvbnM+KEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgICBfaW1wbF8ub3B0aW9uc18gPSBwOworICB9CisgIHJldHVybiBfaW1wbF8ub3B0aW9uc187Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VPcHRpb25zKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTZXJ2aWNlT3B0aW9ucyogX21zZyA9IF9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKKyAgcmV0dXJuIF9tc2c7Cit9CitpbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNlcnZpY2VPcHRpb25zKiBvcHRpb25zKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogbWVzc2FnZV9hcmVuYSA9IEdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBpZiAobWVzc2FnZV9hcmVuYSA9PSBudWxscHRyKSB7CisgICAgZGVsZXRlIF9pbXBsXy5vcHRpb25zXzsKKyAgfQorICBpZiAob3B0aW9ucykgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogc3VibWVzc2FnZV9hcmVuYSA9CisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxHZXRPd25pbmdBcmVuYShvcHRpb25zKTsKKyAgICBpZiAobWVzc2FnZV9hcmVuYSAhPSBzdWJtZXNzYWdlX2FyZW5hKSB7CisgICAgICBvcHRpb25zID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZXRPd25lZE1lc3NhZ2UoCisgICAgICAgICAgbWVzc2FnZV9hcmVuYSwgb3B0aW9ucywgc3VibWVzc2FnZV9hcmVuYSk7CisgICAgfQorICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKKyAgfQorICBfaW1wbF8ub3B0aW9uc18gPSBvcHRpb25zOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE1ldGhvZERlc2NyaXB0b3JQcm90bworCisvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CitpbmxpbmUgYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9oYXNfbmFtZSgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19uYW1lKCk7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIF9pbXBsXy5uYW1lXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gX2ludGVybmFsX25hbWUoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCwgdHlwZW5hbWUuLi4gQXJnVD4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCit2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyBfaW1wbF8ubmFtZV8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX25hbWUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubmFtZV8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9zZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7CisgIF9pbXBsXy5uYW1lXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgaWYgKCFfaW50ZXJuYWxfaGFzX25hbWUoKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKKyAgYXV0byogcCA9IF9pbXBsXy5uYW1lXy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLm5hbWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICByZXR1cm4gcDsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIH0KKyAgX2ltcGxfLm5hbWVfLlNldEFsbG9jYXRlZChuYW1lLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLm5hbWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm5hbWUpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBpbnB1dF90eXBlID0gMjsKK2lubGluZSBib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2hhc19pbnB1dF90eXBlKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6aGFzX2lucHV0X3R5cGUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2lucHV0X3R5cGUoKTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaW5wdXRfdHlwZSgpIHsKKyAgX2ltcGxfLmlucHV0X3R5cGVfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6aW5wdXRfdHlwZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCisgIHJldHVybiBfaW50ZXJuYWxfaW5wdXRfdHlwZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfaW5wdXRfdHlwZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworIF9pbXBsXy5pbnB1dF90eXBlXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5pbnB1dF90eXBlKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om11dGFibGVfaW5wdXRfdHlwZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfaW5wdXRfdHlwZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfaW5wdXRfdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5pbnB1dF90eXBlXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX3NldF9pbnB1dF90eXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgX2ltcGxfLmlucHV0X3R5cGVfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX2lucHV0X3R5cGUoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworICByZXR1cm4gX2ltcGxfLmlucHV0X3R5cGVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfaW5wdXRfdHlwZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5pbnB1dF90eXBlKQorICBpZiAoIV9pbnRlcm5hbF9oYXNfaW5wdXRfdHlwZSgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICBhdXRvKiBwID0gX2ltcGxfLmlucHV0X3R5cGVfLlJlbGVhc2UoKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8uaW5wdXRfdHlwZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uaW5wdXRfdHlwZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIHJldHVybiBwOworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX2lucHV0X3R5cGUoc3RkOjpzdHJpbmcqIGlucHV0X3R5cGUpIHsKKyAgaWYgKGlucHV0X3R5cGUgIT0gbnVsbHB0cikgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKKyAgfQorICBfaW1wbF8uaW5wdXRfdHlwZV8uU2V0QWxsb2NhdGVkKGlucHV0X3R5cGUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8uaW5wdXRfdHlwZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uaW5wdXRfdHlwZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSkKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIG91dHB1dF90eXBlID0gMzsKK2lubGluZSBib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2hhc19vdXRwdXRfdHlwZSgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Omhhc19vdXRwdXRfdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfb3V0cHV0X3R5cGUoKTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3V0cHV0X3R5cGUoKSB7CisgIF9pbXBsXy5vdXRwdXRfdHlwZV8uQ2xlYXJUb0VtcHR5KCk7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpvdXRwdXRfdHlwZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlKQorICByZXR1cm4gX2ludGVybmFsX291dHB1dF90eXBlKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9vdXRwdXRfdHlwZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworIF9pbXBsXy5vdXRwdXRfdHlwZV8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vdXRwdXRfdHlwZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfb3V0cHV0X3R5cGUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vdXRwdXRfdHlwZSkKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBNZXRob2REZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9vdXRwdXRfdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5vdXRwdXRfdHlwZV8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9zZXRfb3V0cHV0X3R5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworICBfaW1wbF8ub3V0cHV0X3R5cGVfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX291dHB1dF90eXBlKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKKyAgcmV0dXJuIF9pbXBsXy5vdXRwdXRfdHlwZV8uTXV0YWJsZShHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vdXRwdXRfdHlwZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vdXRwdXRfdHlwZSkKKyAgaWYgKCFfaW50ZXJuYWxfaGFzX291dHB1dF90eXBlKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7CisgIGF1dG8qIHAgPSBfaW1wbF8ub3V0cHV0X3R5cGVfLlJlbGVhc2UoKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ub3V0cHV0X3R5cGVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLm91dHB1dF90eXBlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3V0cHV0X3R5cGUoc3RkOjpzdHJpbmcqIG91dHB1dF90eXBlKSB7CisgIGlmIChvdXRwdXRfdHlwZSAhPSBudWxscHRyKSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworICB9CisgIF9pbXBsXy5vdXRwdXRfdHlwZV8uU2V0QWxsb2NhdGVkKG91dHB1dF90eXBlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLm91dHB1dF90eXBlXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5vdXRwdXRfdHlwZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUpCit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKK2lubGluZSBib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX2hhc19vcHRpb25zKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7CisgIFBST1RPQlVGX0FTU1VNRSghdmFsdWUgfHwgX2ltcGxfLm9wdGlvbnNfICE9IG51bGxwdHIpOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Omhhc19vcHRpb25zKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19vcHRpb25zKCk7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX29wdGlvbnMoKSB7CisgIGlmIChfaW1wbF8ub3B0aW9uc18gIT0gbnVsbHB0cikgX2ltcGxfLm9wdGlvbnNfLT5DbGVhcigpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnMmIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6X2ludGVybmFsX29wdGlvbnMoKSBjb25zdCB7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zKiBwID0gX2ltcGxfLm9wdGlvbnNfOworICByZXR1cm4gcCAhPSBudWxscHRyID8gKnAgOiByZWludGVycHJldF9jYXN0PGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zJj4oCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X01ldGhvZE9wdGlvbnNfZGVmYXVsdF9pbnN0YW5jZV8pOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zJiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICByZXR1cm4gX2ludGVybmFsX29wdGlvbnMoKTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6dW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfb3B0aW9ucygKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9ucyogb3B0aW9ucykgeworICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikgeworICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSo+KF9pbXBsXy5vcHRpb25zXyk7CisgIH0KKyAgX2ltcGxfLm9wdGlvbnNfID0gb3B0aW9uczsKKyAgaWYgKG9wdGlvbnMpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3Vuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9ucyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnMqIHRlbXAgPSBfaW1wbF8ub3B0aW9uc187CisgIF9pbXBsXy5vcHRpb25zXyA9IG51bGxwdHI7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGF1dG8qIG9sZCA9ICByZWludGVycHJldF9jYXN0PDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSo+KHRlbXApOworICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7IGRlbGV0ZSBvbGQ7IH0KKyNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpICE9IG51bGxwdHIpIHsKKyAgICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIH0KKyNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICByZXR1cm4gdGVtcDsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9ucyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjp1bnNhZmVfYXJlbmFfcmVsZWFzZV9vcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnMqIHRlbXAgPSBfaW1wbF8ub3B0aW9uc187CisgIF9pbXBsXy5vcHRpb25zXyA9IG51bGxwdHI7CisgIHJldHVybiB0ZW1wOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9tdXRhYmxlX29wdGlvbnMoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworICBpZiAoX2ltcGxfLm9wdGlvbnNfID09IG51bGxwdHIpIHsKKyAgICBhdXRvKiBwID0gQ3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zPihHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICAgX2ltcGxfLm9wdGlvbnNfID0gcDsKKyAgfQorICByZXR1cm4gX2ltcGxfLm9wdGlvbnNfOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnMqIF9tc2cgPSBfaW50ZXJuYWxfbXV0YWJsZV9vcHRpb25zKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKKyAgcmV0dXJuIF9tc2c7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9ucyogb3B0aW9ucykgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIG1lc3NhZ2VfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgaWYgKG1lc3NhZ2VfYXJlbmEgPT0gbnVsbHB0cikgeworICAgIGRlbGV0ZSBfaW1wbF8ub3B0aW9uc187CisgIH0KKyAgaWYgKG9wdGlvbnMpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIHN1Ym1lc3NhZ2VfYXJlbmEgPQorICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEob3B0aW9ucyk7CisgICAgaWYgKG1lc3NhZ2VfYXJlbmEgIT0gc3VibWVzc2FnZV9hcmVuYSkgeworICAgICAgb3B0aW9ucyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2V0T3duZWRNZXNzYWdlKAorICAgICAgICAgIG1lc3NhZ2VfYXJlbmEsIG9wdGlvbnMsIHN1Ym1lc3NhZ2VfYXJlbmEpOworICAgIH0KKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7CisgIH0KKyAgX2ltcGxfLm9wdGlvbnNfID0gb3B0aW9uczsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vcHRpb25zKQorfQorCisvLyBvcHRpb25hbCBib29sIGNsaWVudF9zdHJlYW1pbmcgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfaGFzX2NsaWVudF9zdHJlYW1pbmcoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDEwdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpoYXNfY2xpZW50X3N0cmVhbWluZygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfY2xpZW50X3N0cmVhbWluZygpOworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9jbGllbnRfc3RyZWFtaW5nKCkgeworICBfaW1wbF8uY2xpZW50X3N0cmVhbWluZ18gPSBmYWxzZTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OworfQoraW5saW5lIGJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfY2xpZW50X3N0cmVhbWluZygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5jbGllbnRfc3RyZWFtaW5nXzsKK30KK2lubGluZSBib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xpZW50X3N0cmVhbWluZygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmNsaWVudF9zdHJlYW1pbmcpCisgIHJldHVybiBfaW50ZXJuYWxfY2xpZW50X3N0cmVhbWluZygpOworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpfaW50ZXJuYWxfc2V0X2NsaWVudF9zdHJlYW1pbmcoYm9vbCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDEwdTsKKyAgX2ltcGxfLmNsaWVudF9zdHJlYW1pbmdfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9jbGllbnRfc3RyZWFtaW5nKGJvb2wgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9jbGllbnRfc3RyZWFtaW5nKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmNsaWVudF9zdHJlYW1pbmcpCit9CisKKy8vIG9wdGlvbmFsIGJvb2wgc2VydmVyX3N0cmVhbWluZyA9IDYgW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9oYXNfc2VydmVyX3N0cmVhbWluZygpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMjB1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Omhhc19zZXJ2ZXJfc3RyZWFtaW5nKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19zZXJ2ZXJfc3RyZWFtaW5nKCk7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX3NlcnZlcl9zdHJlYW1pbmcoKSB7CisgIF9pbXBsXy5zZXJ2ZXJfc3RyZWFtaW5nXyA9IGZhbHNlOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAyMHU7Cit9CitpbmxpbmUgYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9zZXJ2ZXJfc3RyZWFtaW5nKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnNlcnZlcl9zdHJlYW1pbmdfOworfQoraW5saW5lIGJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXJ2ZXJfc3RyZWFtaW5nKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uc2VydmVyX3N0cmVhbWluZykKKyAgcmV0dXJuIF9pbnRlcm5hbF9zZXJ2ZXJfc3RyZWFtaW5nKCk7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86Ol9pbnRlcm5hbF9zZXRfc2VydmVyX3N0cmVhbWluZyhib29sIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMjB1OworICBfaW1wbF8uc2VydmVyX3N0cmVhbWluZ18gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X3NlcnZlcl9zdHJlYW1pbmcoYm9vbCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X3NlcnZlcl9zdHJlYW1pbmcodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uc2VydmVyX3N0cmVhbWluZykKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBGaWxlT3B0aW9ucworCisvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9wYWNrYWdlID0gMTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfaGFzX2phdmFfcGFja2FnZSgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfcGFja2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfamF2YV9wYWNrYWdlKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfamF2YV9wYWNrYWdlKCkgeworICBfaW1wbF8uamF2YV9wYWNrYWdlXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6amF2YV9wYWNrYWdlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UpCisgIHJldHVybiBfaW50ZXJuYWxfamF2YV9wYWNrYWdlKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfcGFja2FnZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworIF9pbXBsXy5qYXZhX3BhY2thZ2VfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6bXV0YWJsZV9qYXZhX3BhY2thZ2UoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX2phdmFfcGFja2FnZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfamF2YV9wYWNrYWdlKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmphdmFfcGFja2FnZV8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6X2ludGVybmFsX3NldF9qYXZhX3BhY2thZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICBfaW1wbF8uamF2YV9wYWNrYWdlXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9tdXRhYmxlX2phdmFfcGFja2FnZSgpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7CisgIHJldHVybiBfaW1wbF8uamF2YV9wYWNrYWdlXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2VfamF2YV9wYWNrYWdlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlKQorICBpZiAoIV9pbnRlcm5hbF9oYXNfamF2YV9wYWNrYWdlKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIGF1dG8qIHAgPSBfaW1wbF8uamF2YV9wYWNrYWdlXy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLmphdmFfcGFja2FnZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uamF2YV9wYWNrYWdlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9qYXZhX3BhY2thZ2Uoc3RkOjpzdHJpbmcqIGphdmFfcGFja2FnZSkgeworICBpZiAoamF2YV9wYWNrYWdlICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIH0KKyAgX2ltcGxfLmphdmFfcGFja2FnZV8uU2V0QWxsb2NhdGVkKGphdmFfcGFja2FnZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5qYXZhX3BhY2thZ2VfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLmphdmFfcGFja2FnZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDg7CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6X2ludGVybmFsX2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgeworICBfaW1wbF8uamF2YV9vdXRlcl9jbGFzc25hbWVfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpqYXZhX291dGVyX2NsYXNzbmFtZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUpCisgIHJldHVybiBfaW50ZXJuYWxfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCwgdHlwZW5hbWUuLi4gQXJnVD4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCit2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9vdXRlcl9jbGFzc25hbWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyBfaW1wbF8uamF2YV9vdXRlcl9jbGFzc25hbWVfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjptdXRhYmxlX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9qYXZhX291dGVyX2NsYXNzbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5qYXZhX291dGVyX2NsYXNzbmFtZV8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6X2ludGVybmFsX3NldF9qYXZhX291dGVyX2NsYXNzbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIF9pbXBsXy5qYXZhX291dGVyX2NsYXNzbmFtZV8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfbXV0YWJsZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIHJldHVybiBfaW1wbF8uamF2YV9vdXRlcl9jbGFzc25hbWVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6cmVsZWFzZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lKQorICBpZiAoIV9pbnRlcm5hbF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKKyAgYXV0byogcCA9IF9pbXBsXy5qYXZhX291dGVyX2NsYXNzbmFtZV8uUmVsZWFzZSgpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5qYXZhX291dGVyX2NsYXNzbmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uamF2YV9vdXRlcl9jbGFzc25hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICByZXR1cm4gcDsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfYWxsb2NhdGVkX2phdmFfb3V0ZXJfY2xhc3NuYW1lKHN0ZDo6c3RyaW5nKiBqYXZhX291dGVyX2NsYXNzbmFtZSkgeworICBpZiAoamF2YV9vdXRlcl9jbGFzc25hbWUgIT0gbnVsbHB0cikgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKKyAgfQorICBfaW1wbF8uamF2YV9vdXRlcl9jbGFzc25hbWVfLlNldEFsbG9jYXRlZChqYXZhX291dGVyX2NsYXNzbmFtZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5qYXZhX291dGVyX2NsYXNzbmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uamF2YV9vdXRlcl9jbGFzc25hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUpCit9CisKKy8vIG9wdGlvbmFsIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlcyA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDA0MDB1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9qYXZhX211bHRpcGxlX2ZpbGVzKCkgeworICBfaW1wbF8uamF2YV9tdWx0aXBsZV9maWxlc18gPSBmYWxzZTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDA0MDB1OworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9qYXZhX211bHRpcGxlX2ZpbGVzKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmphdmFfbXVsdGlwbGVfZmlsZXNfOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OmphdmFfbXVsdGlwbGVfZmlsZXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfbXVsdGlwbGVfZmlsZXMpCisgIHJldHVybiBfaW50ZXJuYWxfamF2YV9tdWx0aXBsZV9maWxlcygpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9zZXRfamF2YV9tdWx0aXBsZV9maWxlcyhib29sIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDA0MDB1OworICBfaW1wbF8uamF2YV9tdWx0aXBsZV9maWxlc18gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9tdWx0aXBsZV9maWxlcyhib29sIHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfamF2YV9tdWx0aXBsZV9maWxlcyh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfbXVsdGlwbGVfZmlsZXMpCit9CisKKy8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggPSAyMCBbZGVwcmVjYXRlZCA9IHRydWVdOworaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwODAwdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIHsKKyAgX2ltcGxfLmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXyA9IGZhbHNlOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDgwMHU7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6X2ludGVybmFsX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXzsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2gpCisgIHJldHVybiBfaW50ZXJuYWxfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfc2V0X2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKGJvb2wgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDgwMHU7CisgIF9pbXBsXy5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goYm9vbCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2gpCit9CisKKy8vIG9wdGlvbmFsIGJvb2wgamF2YV9zdHJpbmdfY2hlY2tfdXRmOCA9IDI3IFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9oYXNfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDEwMDB1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9qYXZhX3N0cmluZ19jaGVja191dGY4KCkgeworICBfaW1wbF8uamF2YV9zdHJpbmdfY2hlY2tfdXRmOF8gPSBmYWxzZTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDEwMDB1OworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9qYXZhX3N0cmluZ19jaGVja191dGY4KCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmphdmFfc3RyaW5nX2NoZWNrX3V0ZjhfOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgpCisgIHJldHVybiBfaW50ZXJuYWxfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9zZXRfamF2YV9zdHJpbmdfY2hlY2tfdXRmOChib29sIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDEwMDB1OworICBfaW1wbF8uamF2YV9zdHJpbmdfY2hlY2tfdXRmOF8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9zdHJpbmdfY2hlY2tfdXRmOChib29sIHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgpCit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQgPSBTUEVFRF07CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6X2ludGVybmFsX2hhc19vcHRpbWl6ZV9mb3IoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDQwMDAwdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19vcHRpbWl6ZV9mb3IoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX29wdGltaXplX2ZvcigpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX29wdGltaXplX2ZvcigpIHsKKyAgX2ltcGxfLm9wdGltaXplX2Zvcl8gPSAxOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDA0MDAwMHU7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uczo6X2ludGVybmFsX29wdGltaXplX2ZvcigpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlID4oX2ltcGxfLm9wdGltaXplX2Zvcl8pOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnM6Om9wdGltaXplX2ZvcigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub3B0aW1pemVfZm9yKQorICByZXR1cm4gX2ludGVybmFsX29wdGltaXplX2ZvcigpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9zZXRfb3B0aW1pemVfZm9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgdmFsdWUpIHsKKyAgYXNzZXJ0KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfSXNWYWxpZCh2YWx1ZSkpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDQwMDAwdTsKKyAgX2ltcGxfLm9wdGltaXplX2Zvcl8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfb3B0aW1pemVfZm9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9vcHRpbWl6ZV9mb3IodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5vcHRpbWl6ZV9mb3IpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBnb19wYWNrYWdlID0gMTE7CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6X2ludGVybmFsX2hhc19nb19wYWNrYWdlKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfZ29fcGFja2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfZ29fcGFja2FnZSgpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2dvX3BhY2thZ2UoKSB7CisgIF9pbXBsXy5nb19wYWNrYWdlXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6Z29fcGFja2FnZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9nb19wYWNrYWdlKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBGaWxlT3B0aW9uczo6c2V0X2dvX3BhY2thZ2UoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKKyBfaW1wbF8uZ29fcGFja2FnZV8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5nb19wYWNrYWdlKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6bXV0YWJsZV9nb19wYWNrYWdlKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9nb19wYWNrYWdlKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5nb19wYWNrYWdlKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfZ29fcGFja2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5nb19wYWNrYWdlXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfc2V0X2dvX3BhY2thZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworICBfaW1wbF8uZ29fcGFja2FnZV8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfbXV0YWJsZV9nb19wYWNrYWdlKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKKyAgcmV0dXJuIF9pbXBsXy5nb19wYWNrYWdlXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2VfZ29fcGFja2FnZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmdvX3BhY2thZ2UpCisgIGlmICghX2ludGVybmFsX2hhc19nb19wYWNrYWdlKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7CisgIGF1dG8qIHAgPSBfaW1wbF8uZ29fcGFja2FnZV8uUmVsZWFzZSgpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5nb19wYWNrYWdlXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5nb19wYWNrYWdlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9nb19wYWNrYWdlKHN0ZDo6c3RyaW5nKiBnb19wYWNrYWdlKSB7CisgIGlmIChnb19wYWNrYWdlICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7CisgIH0KKyAgX2ltcGxfLmdvX3BhY2thZ2VfLlNldEFsbG9jYXRlZChnb19wYWNrYWdlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLmdvX3BhY2thZ2VfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLmdvX3BhY2thZ2VfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKK30KKworLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6X2ludGVybmFsX2hhc19jY19nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMjAwMHUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2NjX2dlbmVyaWNfc2VydmljZXMoKSB7CisgIF9pbXBsXy5jY19nZW5lcmljX3NlcnZpY2VzXyA9IGZhbHNlOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMjAwMHU7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6X2ludGVybmFsX2NjX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uY2NfZ2VuZXJpY19zZXJ2aWNlc187Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6Y2NfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY2NfZ2VuZXJpY19zZXJ2aWNlcykKKyAgcmV0dXJuIF9pbnRlcm5hbF9jY19nZW5lcmljX3NlcnZpY2VzKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6X2ludGVybmFsX3NldF9jY19nZW5lcmljX3NlcnZpY2VzKGJvb2wgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMjAwMHU7CisgIF9pbXBsXy5jY19nZW5lcmljX3NlcnZpY2VzXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9jY19nZW5lcmljX3NlcnZpY2VzKGJvb2wgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9jY19nZW5lcmljX3NlcnZpY2VzKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY2NfZ2VuZXJpY19zZXJ2aWNlcykKK30KKworLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSAxNyBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDQwMDB1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgeworICBfaW1wbF8uamF2YV9nZW5lcmljX3NlcnZpY2VzXyA9IGZhbHNlOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwNDAwMHU7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6X2ludGVybmFsX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5qYXZhX2dlbmVyaWNfc2VydmljZXNfOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OmphdmFfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9nZW5lcmljX3NlcnZpY2VzKQorICByZXR1cm4gX2ludGVybmFsX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9zZXRfamF2YV9nZW5lcmljX3NlcnZpY2VzKGJvb2wgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwNDAwMHU7CisgIF9pbXBsXy5qYXZhX2dlbmVyaWNfc2VydmljZXNfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfamF2YV9nZW5lcmljX3NlcnZpY2VzKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9nZW5lcmljX3NlcnZpY2VzKQorfQorCisvLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDA4MDAwdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19weV9nZW5lcmljX3NlcnZpY2VzKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfcHlfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgX2ltcGxfLnB5X2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDA4MDAwdTsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfcHlfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5weV9nZW5lcmljX3NlcnZpY2VzXzsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpweV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5weV9nZW5lcmljX3NlcnZpY2VzKQorICByZXR1cm4gX2ludGVybmFsX3B5X2dlbmVyaWNfc2VydmljZXMoKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfc2V0X3B5X2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDA4MDAwdTsKKyAgX2ltcGxfLnB5X2dlbmVyaWNfc2VydmljZXNfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X3B5X2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X3B5X2dlbmVyaWNfc2VydmljZXModmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5weV9nZW5lcmljX3NlcnZpY2VzKQorfQorCisvLyBvcHRpb25hbCBib29sIHBocF9nZW5lcmljX3NlcnZpY2VzID0gNDIgW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6X2ludGVybmFsX2hhc19waHBfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMTAwMDB1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX3BocF9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19waHBfZ2VuZXJpY19zZXJ2aWNlcygpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX3BocF9nZW5lcmljX3NlcnZpY2VzKCkgeworICBfaW1wbF8ucGhwX2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDEwMDAwdTsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfcGhwX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ucGhwX2dlbmVyaWNfc2VydmljZXNfOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OnBocF9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5waHBfZ2VuZXJpY19zZXJ2aWNlcykKKyAgcmV0dXJuIF9pbnRlcm5hbF9waHBfZ2VuZXJpY19zZXJ2aWNlcygpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9zZXRfcGhwX2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDEwMDAwdTsKKyAgX2ltcGxfLnBocF9nZW5lcmljX3NlcnZpY2VzXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9waHBfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfcGhwX2dlbmVyaWNfc2VydmljZXModmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5waHBfZ2VuZXJpY19zZXJ2aWNlcykKK30KKworLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMjMgW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6X2ludGVybmFsX2hhc19kZXByZWNhdGVkKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAyMDAwMHUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfZGVwcmVjYXRlZCgpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2RlcHJlY2F0ZWQoKSB7CisgIF9pbXBsXy5kZXByZWNhdGVkXyA9IGZhbHNlOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAyMDAwMHU7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6X2ludGVybmFsX2RlcHJlY2F0ZWQoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZGVwcmVjYXRlZF87Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6ZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZGVwcmVjYXRlZCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9kZXByZWNhdGVkKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6X2ludGVybmFsX3NldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAyMDAwMHU7CisgIF9pbXBsXy5kZXByZWNhdGVkXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9kZXByZWNhdGVkKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZGVwcmVjYXRlZCkKK30KKworLy8gb3B0aW9uYWwgYm9vbCBjY19lbmFibGVfYXJlbmFzID0gMzEgW2RlZmF1bHQgPSB0cnVlXTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfaGFzX2NjX2VuYWJsZV9hcmVuYXMoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDgwMDAwdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19jY19lbmFibGVfYXJlbmFzKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19jY19lbmFibGVfYXJlbmFzKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfY2NfZW5hYmxlX2FyZW5hcygpIHsKKyAgX2ltcGxfLmNjX2VuYWJsZV9hcmVuYXNfID0gdHJ1ZTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwODAwMDB1OworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9jY19lbmFibGVfYXJlbmFzKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmNjX2VuYWJsZV9hcmVuYXNfOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OmNjX2VuYWJsZV9hcmVuYXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNjX2VuYWJsZV9hcmVuYXMpCisgIHJldHVybiBfaW50ZXJuYWxfY2NfZW5hYmxlX2FyZW5hcygpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9zZXRfY2NfZW5hYmxlX2FyZW5hcyhib29sIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwODAwMDB1OworICBfaW1wbF8uY2NfZW5hYmxlX2FyZW5hc18gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfY2NfZW5hYmxlX2FyZW5hcyhib29sIHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfY2NfZW5hYmxlX2FyZW5hcyh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNjX2VuYWJsZV9hcmVuYXMpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBvYmpjX2NsYXNzX3ByZWZpeCA9IDM2OworaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9oYXNfb2JqY19jbGFzc19wcmVmaXgoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19vYmpjX2NsYXNzX3ByZWZpeCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9vYmpjX2NsYXNzX3ByZWZpeCgpIHsKKyAgX2ltcGxfLm9iamNfY2xhc3NfcHJlZml4Xy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6b2JqY19jbGFzc19wcmVmaXgoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4KQorICByZXR1cm4gX2ludGVybmFsX29iamNfY2xhc3NfcHJlZml4KCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBGaWxlT3B0aW9uczo6c2V0X29iamNfY2xhc3NfcHJlZml4KEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7CisgX2ltcGxfLm9iamNfY2xhc3NfcHJlZml4Xy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4KQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6bXV0YWJsZV9vYmpjX2NsYXNzX3ByZWZpeCgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfb2JqY19jbGFzc19wcmVmaXgoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4KQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfb2JqY19jbGFzc19wcmVmaXgoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ub2JqY19jbGFzc19wcmVmaXhfLkdldCgpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9zZXRfb2JqY19jbGFzc19wcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworICBfaW1wbF8ub2JqY19jbGFzc19wcmVmaXhfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6X2ludGVybmFsX211dGFibGVfb2JqY19jbGFzc19wcmVmaXgoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworICByZXR1cm4gX2ltcGxfLm9iamNfY2xhc3NfcHJlZml4Xy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2Vfb2JqY19jbGFzc19wcmVmaXgoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5vYmpjX2NsYXNzX3ByZWZpeCkKKyAgaWYgKCFfaW50ZXJuYWxfaGFzX29iamNfY2xhc3NfcHJlZml4KCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7CisgIGF1dG8qIHAgPSBfaW1wbF8ub2JqY19jbGFzc19wcmVmaXhfLlJlbGVhc2UoKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ub2JqY19jbGFzc19wcmVmaXhfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLm9iamNfY2xhc3NfcHJlZml4Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9vYmpjX2NsYXNzX3ByZWZpeChzdGQ6OnN0cmluZyogb2JqY19jbGFzc19wcmVmaXgpIHsKKyAgaWYgKG9iamNfY2xhc3NfcHJlZml4ICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7CisgIH0KKyAgX2ltcGxfLm9iamNfY2xhc3NfcHJlZml4Xy5TZXRBbGxvY2F0ZWQob2JqY19jbGFzc19wcmVmaXgsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ub2JqY19jbGFzc19wcmVmaXhfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLm9iamNfY2xhc3NfcHJlZml4Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4KQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgY3NoYXJwX25hbWVzcGFjZSA9IDM3OworaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9oYXNfY3NoYXJwX25hbWVzcGFjZSgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMTB1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2NzaGFycF9uYW1lc3BhY2UoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2NzaGFycF9uYW1lc3BhY2UoKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9jc2hhcnBfbmFtZXNwYWNlKCkgeworICBfaW1wbF8uY3NoYXJwX25hbWVzcGFjZV8uQ2xlYXJUb0VtcHR5KCk7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmlsZU9wdGlvbnM6OmNzaGFycF9uYW1lc3BhY2UoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UpCisgIHJldHVybiBfaW50ZXJuYWxfY3NoYXJwX25hbWVzcGFjZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgRmlsZU9wdGlvbnM6OnNldF9jc2hhcnBfbmFtZXNwYWNlKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7CisgX2ltcGxfLmNzaGFycF9uYW1lc3BhY2VfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Om11dGFibGVfY3NoYXJwX25hbWVzcGFjZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfY3NoYXJwX25hbWVzcGFjZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSkKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6X2ludGVybmFsX2NzaGFycF9uYW1lc3BhY2UoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uY3NoYXJwX25hbWVzcGFjZV8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6X2ludGVybmFsX3NldF9jc2hhcnBfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDEwdTsKKyAgX2ltcGxfLmNzaGFycF9uYW1lc3BhY2VfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6X2ludGVybmFsX211dGFibGVfY3NoYXJwX25hbWVzcGFjZSgpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7CisgIHJldHVybiBfaW1wbF8uY3NoYXJwX25hbWVzcGFjZV8uTXV0YWJsZShHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjpyZWxlYXNlX2NzaGFycF9uYW1lc3BhY2UoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jc2hhcnBfbmFtZXNwYWNlKQorICBpZiAoIV9pbnRlcm5hbF9oYXNfY3NoYXJwX25hbWVzcGFjZSgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OworICBhdXRvKiBwID0gX2ltcGxfLmNzaGFycF9uYW1lc3BhY2VfLlJlbGVhc2UoKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8uY3NoYXJwX25hbWVzcGFjZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uY3NoYXJwX25hbWVzcGFjZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIHJldHVybiBwOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9hbGxvY2F0ZWRfY3NoYXJwX25hbWVzcGFjZShzdGQ6OnN0cmluZyogY3NoYXJwX25hbWVzcGFjZSkgeworICBpZiAoY3NoYXJwX25hbWVzcGFjZSAhPSBudWxscHRyKSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OworICB9CisgIF9pbXBsXy5jc2hhcnBfbmFtZXNwYWNlXy5TZXRBbGxvY2F0ZWQoY3NoYXJwX25hbWVzcGFjZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5jc2hhcnBfbmFtZXNwYWNlXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5jc2hhcnBfbmFtZXNwYWNlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBzd2lmdF9wcmVmaXggPSAzOTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfaGFzX3N3aWZ0X3ByZWZpeCgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMjB1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX3N3aWZ0X3ByZWZpeCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfc3dpZnRfcHJlZml4KCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfc3dpZnRfcHJlZml4KCkgeworICBfaW1wbF8uc3dpZnRfcHJlZml4Xy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMjB1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6c3dpZnRfcHJlZml4KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5zd2lmdF9wcmVmaXgpCisgIHJldHVybiBfaW50ZXJuYWxfc3dpZnRfcHJlZml4KCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBGaWxlT3B0aW9uczo6c2V0X3N3aWZ0X3ByZWZpeChBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMjB1OworIF9pbXBsXy5zd2lmdF9wcmVmaXhfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuc3dpZnRfcHJlZml4KQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6bXV0YWJsZV9zd2lmdF9wcmVmaXgoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX3N3aWZ0X3ByZWZpeCgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuc3dpZnRfcHJlZml4KQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfc3dpZnRfcHJlZml4KCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnN3aWZ0X3ByZWZpeF8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6X2ludGVybmFsX3NldF9zd2lmdF9wcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMjB1OworICBfaW1wbF8uc3dpZnRfcHJlZml4Xy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9tdXRhYmxlX3N3aWZ0X3ByZWZpeCgpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAyMHU7CisgIHJldHVybiBfaW1wbF8uc3dpZnRfcHJlZml4Xy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2Vfc3dpZnRfcHJlZml4KCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuc3dpZnRfcHJlZml4KQorICBpZiAoIV9pbnRlcm5hbF9oYXNfc3dpZnRfcHJlZml4KCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAyMHU7CisgIGF1dG8qIHAgPSBfaW1wbF8uc3dpZnRfcHJlZml4Xy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnN3aWZ0X3ByZWZpeF8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uc3dpZnRfcHJlZml4Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9zd2lmdF9wcmVmaXgoc3RkOjpzdHJpbmcqIHN3aWZ0X3ByZWZpeCkgeworICBpZiAoc3dpZnRfcHJlZml4ICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDIwdTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAyMHU7CisgIH0KKyAgX2ltcGxfLnN3aWZ0X3ByZWZpeF8uU2V0QWxsb2NhdGVkKHN3aWZ0X3ByZWZpeCwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5zd2lmdF9wcmVmaXhfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLnN3aWZ0X3ByZWZpeF8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5zd2lmdF9wcmVmaXgpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBwaHBfY2xhc3NfcHJlZml4ID0gNDA7CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6X2ludGVybmFsX2hhc19waHBfY2xhc3NfcHJlZml4KCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDA0MHUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfcGhwX2NsYXNzX3ByZWZpeCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfcGhwX2NsYXNzX3ByZWZpeCgpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX3BocF9jbGFzc19wcmVmaXgoKSB7CisgIF9pbXBsXy5waHBfY2xhc3NfcHJlZml4Xy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwNDB1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6cGhwX2NsYXNzX3ByZWZpeCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucGhwX2NsYXNzX3ByZWZpeCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9waHBfY2xhc3NfcHJlZml4KCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBGaWxlT3B0aW9uczo6c2V0X3BocF9jbGFzc19wcmVmaXgoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDQwdTsKKyBfaW1wbF8ucGhwX2NsYXNzX3ByZWZpeF8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5waHBfY2xhc3NfcHJlZml4KQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6bXV0YWJsZV9waHBfY2xhc3NfcHJlZml4KCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9waHBfY2xhc3NfcHJlZml4KCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5waHBfY2xhc3NfcHJlZml4KQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfcGhwX2NsYXNzX3ByZWZpeCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5waHBfY2xhc3NfcHJlZml4Xy5HZXQoKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfc2V0X3BocF9jbGFzc19wcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwNDB1OworICBfaW1wbF8ucGhwX2NsYXNzX3ByZWZpeF8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfbXV0YWJsZV9waHBfY2xhc3NfcHJlZml4KCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDQwdTsKKyAgcmV0dXJuIF9pbXBsXy5waHBfY2xhc3NfcHJlZml4Xy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2VfcGhwX2NsYXNzX3ByZWZpeCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnBocF9jbGFzc19wcmVmaXgpCisgIGlmICghX2ludGVybmFsX2hhc19waHBfY2xhc3NfcHJlZml4KCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA0MHU7CisgIGF1dG8qIHAgPSBfaW1wbF8ucGhwX2NsYXNzX3ByZWZpeF8uUmVsZWFzZSgpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5waHBfY2xhc3NfcHJlZml4Xy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5waHBfY2xhc3NfcHJlZml4Xy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9waHBfY2xhc3NfcHJlZml4KHN0ZDo6c3RyaW5nKiBwaHBfY2xhc3NfcHJlZml4KSB7CisgIGlmIChwaHBfY2xhc3NfcHJlZml4ICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDQwdTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA0MHU7CisgIH0KKyAgX2ltcGxfLnBocF9jbGFzc19wcmVmaXhfLlNldEFsbG9jYXRlZChwaHBfY2xhc3NfcHJlZml4LCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnBocF9jbGFzc19wcmVmaXhfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLnBocF9jbGFzc19wcmVmaXhfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucGhwX2NsYXNzX3ByZWZpeCkKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIHBocF9uYW1lc3BhY2UgPSA0MTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfaGFzX3BocF9uYW1lc3BhY2UoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDgwdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19waHBfbmFtZXNwYWNlKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19waHBfbmFtZXNwYWNlKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfcGhwX25hbWVzcGFjZSgpIHsKKyAgX2ltcGxfLnBocF9uYW1lc3BhY2VfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA4MHU7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpwaHBfbmFtZXNwYWNlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5waHBfbmFtZXNwYWNlKQorICByZXR1cm4gX2ludGVybmFsX3BocF9uYW1lc3BhY2UoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCwgdHlwZW5hbWUuLi4gQXJnVD4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCit2b2lkIEZpbGVPcHRpb25zOjpzZXRfcGhwX25hbWVzcGFjZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwODB1OworIF9pbXBsXy5waHBfbmFtZXNwYWNlXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnBocF9uYW1lc3BhY2UpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjptdXRhYmxlX3BocF9uYW1lc3BhY2UoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX3BocF9uYW1lc3BhY2UoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnBocF9uYW1lc3BhY2UpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9waHBfbmFtZXNwYWNlKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnBocF9uYW1lc3BhY2VfLkdldCgpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9zZXRfcGhwX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA4MHU7CisgIF9pbXBsXy5waHBfbmFtZXNwYWNlXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9tdXRhYmxlX3BocF9uYW1lc3BhY2UoKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwODB1OworICByZXR1cm4gX2ltcGxfLnBocF9uYW1lc3BhY2VfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6cmVsZWFzZV9waHBfbmFtZXNwYWNlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucGhwX25hbWVzcGFjZSkKKyAgaWYgKCFfaW50ZXJuYWxfaGFzX3BocF9uYW1lc3BhY2UoKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDgwdTsKKyAgYXV0byogcCA9IF9pbXBsXy5waHBfbmFtZXNwYWNlXy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnBocF9uYW1lc3BhY2VfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLnBocF9uYW1lc3BhY2VfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICByZXR1cm4gcDsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfYWxsb2NhdGVkX3BocF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcqIHBocF9uYW1lc3BhY2UpIHsKKyAgaWYgKHBocF9uYW1lc3BhY2UgIT0gbnVsbHB0cikgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwODB1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDgwdTsKKyAgfQorICBfaW1wbF8ucGhwX25hbWVzcGFjZV8uU2V0QWxsb2NhdGVkKHBocF9uYW1lc3BhY2UsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ucGhwX25hbWVzcGFjZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ucGhwX25hbWVzcGFjZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5waHBfbmFtZXNwYWNlKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgcGhwX21ldGFkYXRhX25hbWVzcGFjZSA9IDQ0OworaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9oYXNfcGhwX21ldGFkYXRhX25hbWVzcGFjZSgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAxMDB1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX3BocF9tZXRhZGF0YV9uYW1lc3BhY2UoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX3BocF9tZXRhZGF0YV9uYW1lc3BhY2UoKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9waHBfbWV0YWRhdGFfbmFtZXNwYWNlKCkgeworICBfaW1wbF8ucGhwX21ldGFkYXRhX25hbWVzcGFjZV8uQ2xlYXJUb0VtcHR5KCk7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMTAwdTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmlsZU9wdGlvbnM6OnBocF9tZXRhZGF0YV9uYW1lc3BhY2UoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnBocF9tZXRhZGF0YV9uYW1lc3BhY2UpCisgIHJldHVybiBfaW50ZXJuYWxfcGhwX21ldGFkYXRhX25hbWVzcGFjZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgRmlsZU9wdGlvbnM6OnNldF9waHBfbWV0YWRhdGFfbmFtZXNwYWNlKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDEwMHU7CisgX2ltcGxfLnBocF9tZXRhZGF0YV9uYW1lc3BhY2VfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucGhwX21ldGFkYXRhX25hbWVzcGFjZSkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Om11dGFibGVfcGhwX21ldGFkYXRhX25hbWVzcGFjZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfcGhwX21ldGFkYXRhX25hbWVzcGFjZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucGhwX21ldGFkYXRhX25hbWVzcGFjZSkKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6X2ludGVybmFsX3BocF9tZXRhZGF0YV9uYW1lc3BhY2UoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ucGhwX21ldGFkYXRhX25hbWVzcGFjZV8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6X2ludGVybmFsX3NldF9waHBfbWV0YWRhdGFfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMTAwdTsKKyAgX2ltcGxfLnBocF9tZXRhZGF0YV9uYW1lc3BhY2VfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6X2ludGVybmFsX211dGFibGVfcGhwX21ldGFkYXRhX25hbWVzcGFjZSgpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDEwMHU7CisgIHJldHVybiBfaW1wbF8ucGhwX21ldGFkYXRhX25hbWVzcGFjZV8uTXV0YWJsZShHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjpyZWxlYXNlX3BocF9tZXRhZGF0YV9uYW1lc3BhY2UoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5waHBfbWV0YWRhdGFfbmFtZXNwYWNlKQorICBpZiAoIV9pbnRlcm5hbF9oYXNfcGhwX21ldGFkYXRhX25hbWVzcGFjZSgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAxMDB1OworICBhdXRvKiBwID0gX2ltcGxfLnBocF9tZXRhZGF0YV9uYW1lc3BhY2VfLlJlbGVhc2UoKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ucGhwX21ldGFkYXRhX25hbWVzcGFjZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ucGhwX21ldGFkYXRhX25hbWVzcGFjZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIHJldHVybiBwOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9hbGxvY2F0ZWRfcGhwX21ldGFkYXRhX25hbWVzcGFjZShzdGQ6OnN0cmluZyogcGhwX21ldGFkYXRhX25hbWVzcGFjZSkgeworICBpZiAocGhwX21ldGFkYXRhX25hbWVzcGFjZSAhPSBudWxscHRyKSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDEwMHU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAxMDB1OworICB9CisgIF9pbXBsXy5waHBfbWV0YWRhdGFfbmFtZXNwYWNlXy5TZXRBbGxvY2F0ZWQocGhwX21ldGFkYXRhX25hbWVzcGFjZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5waHBfbWV0YWRhdGFfbmFtZXNwYWNlXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5waHBfbWV0YWRhdGFfbmFtZXNwYWNlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnBocF9tZXRhZGF0YV9uYW1lc3BhY2UpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBydWJ5X3BhY2thZ2UgPSA0NTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfaGFzX3J1YnlfcGFja2FnZSgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAyMDB1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX3J1YnlfcGFja2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfcnVieV9wYWNrYWdlKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfcnVieV9wYWNrYWdlKCkgeworICBfaW1wbF8ucnVieV9wYWNrYWdlXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAyMDB1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6cnVieV9wYWNrYWdlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5ydWJ5X3BhY2thZ2UpCisgIHJldHVybiBfaW50ZXJuYWxfcnVieV9wYWNrYWdlKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBGaWxlT3B0aW9uczo6c2V0X3J1YnlfcGFja2FnZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAyMDB1OworIF9pbXBsXy5ydWJ5X3BhY2thZ2VfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucnVieV9wYWNrYWdlKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6bXV0YWJsZV9ydWJ5X3BhY2thZ2UoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX3J1YnlfcGFja2FnZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucnVieV9wYWNrYWdlKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpfaW50ZXJuYWxfcnVieV9wYWNrYWdlKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnJ1YnlfcGFja2FnZV8uR2V0KCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6X2ludGVybmFsX3NldF9ydWJ5X3BhY2thZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAyMDB1OworICBfaW1wbF8ucnVieV9wYWNrYWdlXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9tdXRhYmxlX3J1YnlfcGFja2FnZSgpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDIwMHU7CisgIHJldHVybiBfaW1wbF8ucnVieV9wYWNrYWdlXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2VfcnVieV9wYWNrYWdlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucnVieV9wYWNrYWdlKQorICBpZiAoIV9pbnRlcm5hbF9oYXNfcnVieV9wYWNrYWdlKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDIwMHU7CisgIGF1dG8qIHAgPSBfaW1wbF8ucnVieV9wYWNrYWdlXy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnJ1YnlfcGFja2FnZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ucnVieV9wYWNrYWdlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9ydWJ5X3BhY2thZ2Uoc3RkOjpzdHJpbmcqIHJ1YnlfcGFja2FnZSkgeworICBpZiAocnVieV9wYWNrYWdlICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMjAwdTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDIwMHU7CisgIH0KKyAgX2ltcGxfLnJ1YnlfcGFja2FnZV8uU2V0QWxsb2NhdGVkKHJ1YnlfcGFja2FnZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5ydWJ5X3BhY2thZ2VfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLnJ1YnlfcGFja2FnZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5ydWJ5X3BhY2thZ2UpCit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKK2lubGluZSBpbnQgRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IEZpbGVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBGaWxlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKK0ZpbGVPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuICZfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiBGaWxlT3B0aW9uczo6X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiBGaWxlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogRmlsZU9wdGlvbnM6Ol9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBGaWxlT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogX2FkZCA9IF9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorRmlsZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE1lc3NhZ2VPcHRpb25zCisKKy8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgTWVzc2FnZU9wdGlvbnM6Ol9pbnRlcm5hbF9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgTWVzc2FnZU9wdGlvbnM6Omhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKTsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpjbGVhcl9tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIHsKKyAgX2ltcGxfLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XyA9IGZhbHNlOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgYm9vbCBNZXNzYWdlT3B0aW9uczo6X2ludGVybmFsX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XzsKK30KK2lubGluZSBib29sIE1lc3NhZ2VPcHRpb25zOjptZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQpCisgIHJldHVybiBfaW50ZXJuYWxfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKTsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpfaW50ZXJuYWxfc2V0X21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KGJvb2wgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7CisgIF9pbXBsXy5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpzZXRfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoYm9vbCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQpCit9CisKKy8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBNZXNzYWdlT3B0aW9uczo6X2ludGVybmFsX2hhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIE1lc3NhZ2VPcHRpb25zOjpoYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpOworfQoraW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSB7CisgIF9pbXBsXy5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyA9IGZhbHNlOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgYm9vbCBNZXNzYWdlT3B0aW9uczo6X2ludGVybmFsX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl87Cit9CitpbmxpbmUgYm9vbCBNZXNzYWdlT3B0aW9uczo6bm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcikKKyAgcmV0dXJuIF9pbnRlcm5hbF9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCk7Cit9CitpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6X2ludGVybmFsX3NldF9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKGJvb2wgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIF9pbXBsXy5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OnNldF9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKGJvb2wgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcikKK30KKworLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIE1lc3NhZ2VPcHRpb25zOjpfaW50ZXJuYWxfaGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgTWVzc2FnZU9wdGlvbnM6Omhhc19kZXByZWNhdGVkKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19kZXByZWNhdGVkKCk7Cit9CitpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6Y2xlYXJfZGVwcmVjYXRlZCgpIHsKKyAgX2ltcGxfLmRlcHJlY2F0ZWRfID0gZmFsc2U7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK2lubGluZSBib29sIE1lc3NhZ2VPcHRpb25zOjpfaW50ZXJuYWxfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5kZXByZWNhdGVkXzsKK30KK2lubGluZSBib29sIE1lc3NhZ2VPcHRpb25zOjpkZXByZWNhdGVkKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5kZXByZWNhdGVkKQorICByZXR1cm4gX2ludGVybmFsX2RlcHJlY2F0ZWQoKTsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpfaW50ZXJuYWxfc2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKKyAgX2ltcGxfLmRlcHJlY2F0ZWRfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X2RlcHJlY2F0ZWQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5kZXByZWNhdGVkKQorfQorCisvLyBvcHRpb25hbCBib29sIG1hcF9lbnRyeSA9IDc7CitpbmxpbmUgYm9vbCBNZXNzYWdlT3B0aW9uczo6X2ludGVybmFsX2hhc19tYXBfZW50cnkoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgTWVzc2FnZU9wdGlvbnM6Omhhc19tYXBfZW50cnkoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX21hcF9lbnRyeSgpOworfQoraW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX21hcF9lbnRyeSgpIHsKKyAgX2ltcGxfLm1hcF9lbnRyeV8gPSBmYWxzZTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworfQoraW5saW5lIGJvb2wgTWVzc2FnZU9wdGlvbnM6Ol9pbnRlcm5hbF9tYXBfZW50cnkoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubWFwX2VudHJ5XzsKK30KK2lubGluZSBib29sIE1lc3NhZ2VPcHRpb25zOjptYXBfZW50cnkoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1hcF9lbnRyeSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9tYXBfZW50cnkoKTsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpfaW50ZXJuYWxfc2V0X21hcF9lbnRyeShib29sIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworICBfaW1wbF8ubWFwX2VudHJ5XyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OnNldF9tYXBfZW50cnkoYm9vbCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X21hcF9lbnRyeSh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1hcF9lbnRyeSkKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworaW5saW5lIGludCBNZXNzYWdlT3B0aW9uczo6X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKK30KK2lubGluZSBpbnQgTWVzc2FnZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOworfQoraW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIE1lc3NhZ2VPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorTWVzc2FnZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gJl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl87Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIE1lc3NhZ2VPcHRpb25zOjpfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIE1lc3NhZ2VPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiBfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb24oaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBNZXNzYWdlT3B0aW9uczo6X2ludGVybmFsX2FkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgcmV0dXJuIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIE1lc3NhZ2VPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBfYWRkID0gX2ludGVybmFsX2FkZF91bmludGVycHJldGVkX29wdGlvbigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIF9hZGQ7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uID4mCitNZXNzYWdlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl87Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRmllbGRPcHRpb25zCisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlIGN0eXBlID0gMSBbZGVmYXVsdCA9IFNUUklOR107CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnM6Ol9pbnRlcm5hbF9oYXNfY3R5cGUoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpoYXNfY3R5cGUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2N0eXBlKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2N0eXBlKCkgeworICBfaW1wbF8uY3R5cGVfID0gMDsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zOjpfaW50ZXJuYWxfY3R5cGUoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9uc19DVHlwZSA+KF9pbXBsXy5jdHlwZV8pOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zOjpjdHlwZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmN0eXBlKQorICByZXR1cm4gX2ludGVybmFsX2N0eXBlKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6Ol9pbnRlcm5hbF9zZXRfY3R5cGUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9uc19DVHlwZSB2YWx1ZSkgeworICBhc3NlcnQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9uc19DVHlwZV9Jc1ZhbGlkKHZhbHVlKSk7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICBfaW1wbF8uY3R5cGVfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9jdHlwZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zX0NUeXBlIHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfY3R5cGUodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuY3R5cGUpCit9CisKKy8vIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKK2lubGluZSBib29sIEZpZWxkT3B0aW9uczo6X2ludGVybmFsX2hhc19wYWNrZWQoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpoYXNfcGFja2VkKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19wYWNrZWQoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfcGFja2VkKCkgeworICBfaW1wbF8ucGFja2VkXyA9IGZhbHNlOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnM6Ol9pbnRlcm5hbF9wYWNrZWQoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ucGFja2VkXzsKK30KK2lubGluZSBib29sIEZpZWxkT3B0aW9uczo6cGFja2VkKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMucGFja2VkKQorICByZXR1cm4gX2ludGVybmFsX3BhY2tlZCgpOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpfaW50ZXJuYWxfc2V0X3BhY2tlZChib29sIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworICBfaW1wbF8ucGFja2VkXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfcGFja2VkKGJvb2wgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9wYWNrZWQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMucGFja2VkKQorfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGUganN0eXBlID0gNiBbZGVmYXVsdCA9IEpTX05PUk1BTF07CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnM6Ol9pbnRlcm5hbF9oYXNfanN0eXBlKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEZpZWxkT3B0aW9uczo6aGFzX2pzdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfanN0eXBlKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2pzdHlwZSgpIHsKKyAgX2ltcGxfLmpzdHlwZV8gPSAwOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9uc19KU1R5cGUgRmllbGRPcHRpb25zOjpfaW50ZXJuYWxfanN0eXBlKCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnNfSlNUeXBlID4oX2ltcGxfLmpzdHlwZV8pOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnNfSlNUeXBlIEZpZWxkT3B0aW9uczo6anN0eXBlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuanN0eXBlKQorICByZXR1cm4gX2ludGVybmFsX2pzdHlwZSgpOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpfaW50ZXJuYWxfc2V0X2pzdHlwZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zX0pTVHlwZSB2YWx1ZSkgeworICBhc3NlcnQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9uc19KU1R5cGVfSXNWYWxpZCh2YWx1ZSkpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgX2ltcGxfLmpzdHlwZV8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2pzdHlwZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zX0pTVHlwZSB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X2pzdHlwZSh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5qc3R5cGUpCit9CisKKy8vIG9wdGlvbmFsIGJvb2wgbGF6eSA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnM6Ol9pbnRlcm5hbF9oYXNfbGF6eSgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDh1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnM6Omhhc19sYXp5KCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19sYXp5KCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2xhenkoKSB7CisgIF9pbXBsXy5sYXp5XyA9IGZhbHNlOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Cit9CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnM6Ol9pbnRlcm5hbF9sYXp5KCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmxhenlfOworfQoraW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpsYXp5KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMubGF6eSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9sYXp5KCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6Ol9pbnRlcm5hbF9zZXRfbGF6eShib29sIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworICBfaW1wbF8ubGF6eV8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2xhenkoYm9vbCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X2xhenkodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMubGF6eSkKK30KKworLy8gb3B0aW9uYWwgYm9vbCB1bnZlcmlmaWVkX2xhenkgPSAxNSBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIEZpZWxkT3B0aW9uczo6X2ludGVybmFsX2hhc191bnZlcmlmaWVkX2xhenkoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDEwdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpoYXNfdW52ZXJpZmllZF9sYXp5KCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc191bnZlcmlmaWVkX2xhenkoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfdW52ZXJpZmllZF9sYXp5KCkgeworICBfaW1wbF8udW52ZXJpZmllZF9sYXp5XyA9IGZhbHNlOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAxMHU7Cit9CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnM6Ol9pbnRlcm5hbF91bnZlcmlmaWVkX2xhenkoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8udW52ZXJpZmllZF9sYXp5XzsKK30KK2lubGluZSBib29sIEZpZWxkT3B0aW9uczo6dW52ZXJpZmllZF9sYXp5KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMudW52ZXJpZmllZF9sYXp5KQorICByZXR1cm4gX2ludGVybmFsX3VudmVyaWZpZWRfbGF6eSgpOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpfaW50ZXJuYWxfc2V0X3VudmVyaWZpZWRfbGF6eShib29sIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMTB1OworICBfaW1wbF8udW52ZXJpZmllZF9sYXp5XyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfdW52ZXJpZmllZF9sYXp5KGJvb2wgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF91bnZlcmlmaWVkX2xhenkodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMudW52ZXJpZmllZF9sYXp5KQorfQorCisvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpfaW50ZXJuYWxfaGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDIwdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfZGVwcmVjYXRlZCgpOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgeworICBfaW1wbF8uZGVwcmVjYXRlZF8gPSBmYWxzZTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMjB1OworfQoraW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpfaW50ZXJuYWxfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5kZXByZWNhdGVkXzsKK30KK2lubGluZSBib29sIEZpZWxkT3B0aW9uczo6ZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmRlcHJlY2F0ZWQpCisgIHJldHVybiBfaW50ZXJuYWxfZGVwcmVjYXRlZCgpOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpfaW50ZXJuYWxfc2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDIwdTsKKyAgX2ltcGxfLmRlcHJlY2F0ZWRfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9kZXByZWNhdGVkKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmRlcHJlY2F0ZWQpCit9CisKKy8vIG9wdGlvbmFsIGJvb2wgd2VhayA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpfaW50ZXJuYWxfaGFzX3dlYWsoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDQwdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpoYXNfd2VhaygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfd2VhaygpOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl93ZWFrKCkgeworICBfaW1wbF8ud2Vha18gPSBmYWxzZTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwNDB1OworfQoraW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpfaW50ZXJuYWxfd2VhaygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy53ZWFrXzsKK30KK2lubGluZSBib29sIEZpZWxkT3B0aW9uczo6d2VhaygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLndlYWspCisgIHJldHVybiBfaW50ZXJuYWxfd2VhaygpOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpfaW50ZXJuYWxfc2V0X3dlYWsoYm9vbCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDQwdTsKKyAgX2ltcGxfLndlYWtfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF93ZWFrKGJvb2wgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF93ZWFrKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLndlYWspCit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKK2lubGluZSBpbnQgRmllbGRPcHRpb25zOjpfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uc2l6ZSgpOworfQoraW5saW5lIGludCBGaWVsZE9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBGaWVsZE9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorRmllbGRPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiAmX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiYgRmllbGRPcHRpb25zOjpfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIEZpZWxkT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIF9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbihpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEZpZWxkT3B0aW9uczo6X2ludGVybmFsX2FkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgcmV0dXJuIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEZpZWxkT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogX2FkZCA9IF9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2FkZDsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKK0ZpZWxkT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE9uZW9mT3B0aW9ucworCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CitpbmxpbmUgaW50IE9uZW9mT3B0aW9uczo6X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKK30KK2lubGluZSBpbnQgT25lb2ZPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKK30KK2lubGluZSB2b2lkIE9uZW9mT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogT25lb2ZPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKK09uZW9mT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gJl9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl87Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIE9uZW9mT3B0aW9uczo6X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiBPbmVvZk9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiBfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb24oaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBPbmVvZk9wdGlvbnM6Ol9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBPbmVvZk9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIF9hZGQgPSBfaW50ZXJuYWxfYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIF9hZGQ7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uID4mCitPbmVvZk9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFbnVtT3B0aW9ucworCisvLyBvcHRpb25hbCBib29sIGFsbG93X2FsaWFzID0gMjsKK2lubGluZSBib29sIEVudW1PcHRpb25zOjpfaW50ZXJuYWxfaGFzX2FsbG93X2FsaWFzKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEVudW1PcHRpb25zOjpoYXNfYWxsb3dfYWxpYXMoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2FsbG93X2FsaWFzKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtT3B0aW9uczo6Y2xlYXJfYWxsb3dfYWxpYXMoKSB7CisgIF9pbXBsXy5hbGxvd19hbGlhc18gPSBmYWxzZTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIGJvb2wgRW51bU9wdGlvbnM6Ol9pbnRlcm5hbF9hbGxvd19hbGlhcygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5hbGxvd19hbGlhc187Cit9CitpbmxpbmUgYm9vbCBFbnVtT3B0aW9uczo6YWxsb3dfYWxpYXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLmFsbG93X2FsaWFzKQorICByZXR1cm4gX2ludGVybmFsX2FsbG93X2FsaWFzKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtT3B0aW9uczo6X2ludGVybmFsX3NldF9hbGxvd19hbGlhcyhib29sIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICBfaW1wbF8uYWxsb3dfYWxpYXNfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBFbnVtT3B0aW9uczo6c2V0X2FsbG93X2FsaWFzKGJvb2wgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9hbGxvd19hbGlhcyh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLmFsbG93X2FsaWFzKQorfQorCisvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgRW51bU9wdGlvbnM6Ol9pbnRlcm5hbF9oYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBFbnVtT3B0aW9uczo6aGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2RlcHJlY2F0ZWQoKTsKK30KK2lubGluZSB2b2lkIEVudW1PcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgeworICBfaW1wbF8uZGVwcmVjYXRlZF8gPSBmYWxzZTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIGJvb2wgRW51bU9wdGlvbnM6Ol9pbnRlcm5hbF9kZXByZWNhdGVkKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmRlcHJlY2F0ZWRfOworfQoraW5saW5lIGJvb2wgRW51bU9wdGlvbnM6OmRlcHJlY2F0ZWQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLmRlcHJlY2F0ZWQpCisgIHJldHVybiBfaW50ZXJuYWxfZGVwcmVjYXRlZCgpOworfQoraW5saW5lIHZvaWQgRW51bU9wdGlvbnM6Ol9pbnRlcm5hbF9zZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworICBfaW1wbF8uZGVwcmVjYXRlZF8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEVudW1PcHRpb25zOjpzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfZGVwcmVjYXRlZCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLmRlcHJlY2F0ZWQpCit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKK2lubGluZSBpbnQgRW51bU9wdGlvbnM6Ol9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IEVudW1PcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKK30KK2lubGluZSB2b2lkIEVudW1PcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBFbnVtT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKK0VudW1PcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuICZfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiBFbnVtT3B0aW9uczo6X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiBFbnVtT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogRW51bU9wdGlvbnM6Ol9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBFbnVtT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogX2FkZCA9IF9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorRW51bU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEVudW1WYWx1ZU9wdGlvbnMKKworLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIEVudW1WYWx1ZU9wdGlvbnM6Ol9pbnRlcm5hbF9oYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBFbnVtVmFsdWVPcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfZGVwcmVjYXRlZCgpOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlT3B0aW9uczo6Y2xlYXJfZGVwcmVjYXRlZCgpIHsKKyAgX2ltcGxfLmRlcHJlY2F0ZWRfID0gZmFsc2U7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK2lubGluZSBib29sIEVudW1WYWx1ZU9wdGlvbnM6Ol9pbnRlcm5hbF9kZXByZWNhdGVkKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmRlcHJlY2F0ZWRfOworfQoraW5saW5lIGJvb2wgRW51bVZhbHVlT3B0aW9uczo6ZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy5kZXByZWNhdGVkKQorICByZXR1cm4gX2ludGVybmFsX2RlcHJlY2F0ZWQoKTsKK30KK2lubGluZSB2b2lkIEVudW1WYWx1ZU9wdGlvbnM6Ol9pbnRlcm5hbF9zZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICBfaW1wbF8uZGVwcmVjYXRlZF8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OnNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9kZXByZWNhdGVkKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy5kZXByZWNhdGVkKQorfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CitpbmxpbmUgaW50IEVudW1WYWx1ZU9wdGlvbnM6Ol9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IEVudW1WYWx1ZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogRW51bVZhbHVlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorRW51bVZhbHVlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuICZfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiBFbnVtVmFsdWVPcHRpb25zOjpfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIEVudW1WYWx1ZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogRW51bVZhbHVlT3B0aW9uczo6X2ludGVybmFsX2FkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgcmV0dXJuIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEVudW1WYWx1ZU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIF9hZGQgPSBfaW50ZXJuYWxfYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorRW51bVZhbHVlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBTZXJ2aWNlT3B0aW9ucworCisvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIFNlcnZpY2VPcHRpb25zOjpfaW50ZXJuYWxfaGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgU2VydmljZU9wdGlvbnM6Omhhc19kZXByZWNhdGVkKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19kZXByZWNhdGVkKCk7Cit9CitpbmxpbmUgdm9pZCBTZXJ2aWNlT3B0aW9uczo6Y2xlYXJfZGVwcmVjYXRlZCgpIHsKKyAgX2ltcGxfLmRlcHJlY2F0ZWRfID0gZmFsc2U7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK2lubGluZSBib29sIFNlcnZpY2VPcHRpb25zOjpfaW50ZXJuYWxfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5kZXByZWNhdGVkXzsKK30KK2lubGluZSBib29sIFNlcnZpY2VPcHRpb25zOjpkZXByZWNhdGVkKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy5kZXByZWNhdGVkKQorICByZXR1cm4gX2ludGVybmFsX2RlcHJlY2F0ZWQoKTsKK30KK2lubGluZSB2b2lkIFNlcnZpY2VPcHRpb25zOjpfaW50ZXJuYWxfc2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgX2ltcGxfLmRlcHJlY2F0ZWRfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBTZXJ2aWNlT3B0aW9uczo6c2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X2RlcHJlY2F0ZWQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy5kZXByZWNhdGVkKQorfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CitpbmxpbmUgaW50IFNlcnZpY2VPcHRpb25zOjpfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uc2l6ZSgpOworfQoraW5saW5lIGludCBTZXJ2aWNlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBTZXJ2aWNlT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogU2VydmljZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uID4qCitTZXJ2aWNlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiAmX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiYgU2VydmljZU9wdGlvbnM6Ol9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiYgU2VydmljZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIF9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbihpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIFNlcnZpY2VPcHRpb25zOjpfaW50ZXJuYWxfYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5BZGQoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiogU2VydmljZU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIF9hZGQgPSBfaW50ZXJuYWxfYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2FkZDsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKK1NlcnZpY2VPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBNZXRob2RPcHRpb25zCisKKy8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMzIFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgTWV0aG9kT3B0aW9uczo6X2ludGVybmFsX2hhc19kZXByZWNhdGVkKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIE1ldGhvZE9wdGlvbnM6Omhhc19kZXByZWNhdGVkKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19kZXByZWNhdGVkKCk7Cit9CitpbmxpbmUgdm9pZCBNZXRob2RPcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgeworICBfaW1wbF8uZGVwcmVjYXRlZF8gPSBmYWxzZTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIGJvb2wgTWV0aG9kT3B0aW9uczo6X2ludGVybmFsX2RlcHJlY2F0ZWQoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZGVwcmVjYXRlZF87Cit9CitpbmxpbmUgYm9vbCBNZXRob2RPcHRpb25zOjpkZXByZWNhdGVkKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLmRlcHJlY2F0ZWQpCisgIHJldHVybiBfaW50ZXJuYWxfZGVwcmVjYXRlZCgpOworfQoraW5saW5lIHZvaWQgTWV0aG9kT3B0aW9uczo6X2ludGVybmFsX3NldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7CisgIF9pbXBsXy5kZXByZWNhdGVkXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgTWV0aG9kT3B0aW9uczo6c2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X2RlcHJlY2F0ZWQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLmRlcHJlY2F0ZWQpCit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5JZGVtcG90ZW5jeUxldmVsIGlkZW1wb3RlbmN5X2xldmVsID0gMzQgW2RlZmF1bHQgPSBJREVNUE9URU5DWV9VTktOT1dOXTsKK2lubGluZSBib29sIE1ldGhvZE9wdGlvbnM6Ol9pbnRlcm5hbF9oYXNfaWRlbXBvdGVuY3lfbGV2ZWwoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgTWV0aG9kT3B0aW9uczo6aGFzX2lkZW1wb3RlbmN5X2xldmVsKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19pZGVtcG90ZW5jeV9sZXZlbCgpOworfQoraW5saW5lIHZvaWQgTWV0aG9kT3B0aW9uczo6Y2xlYXJfaWRlbXBvdGVuY3lfbGV2ZWwoKSB7CisgIF9pbXBsXy5pZGVtcG90ZW5jeV9sZXZlbF8gPSAwOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbCBNZXRob2RPcHRpb25zOjpfaW50ZXJuYWxfaWRlbXBvdGVuY3lfbGV2ZWwoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbCA+KF9pbXBsXy5pZGVtcG90ZW5jeV9sZXZlbF8pOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWwgTWV0aG9kT3B0aW9uczo6aWRlbXBvdGVuY3lfbGV2ZWwoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuaWRlbXBvdGVuY3lfbGV2ZWwpCisgIHJldHVybiBfaW50ZXJuYWxfaWRlbXBvdGVuY3lfbGV2ZWwoKTsKK30KK2lubGluZSB2b2lkIE1ldGhvZE9wdGlvbnM6Ol9pbnRlcm5hbF9zZXRfaWRlbXBvdGVuY3lfbGV2ZWwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbCB2YWx1ZSkgeworICBhc3NlcnQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbF9Jc1ZhbGlkKHZhbHVlKSk7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworICBfaW1wbF8uaWRlbXBvdGVuY3lfbGV2ZWxfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBNZXRob2RPcHRpb25zOjpzZXRfaWRlbXBvdGVuY3lfbGV2ZWwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGhvZE9wdGlvbnNfSWRlbXBvdGVuY3lMZXZlbCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X2lkZW1wb3RlbmN5X2xldmVsKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5pZGVtcG90ZW5jeV9sZXZlbCkKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworaW5saW5lIGludCBNZXRob2RPcHRpb25zOjpfaW50ZXJuYWxfdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl8uc2l6ZSgpOworfQoraW5saW5lIGludCBNZXRob2RPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKK30KK2lubGluZSB2b2lkIE1ldGhvZE9wdGlvbnM6OmNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIE1ldGhvZE9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKK01ldGhvZE9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiAmX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbiYgTWV0aG9kT3B0aW9uczo6X2ludGVybmFsX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uJiBNZXRob2RPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIF9pbnRlcm5hbF91bmludGVycHJldGVkX29wdGlvbihpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIE1ldGhvZE9wdGlvbnM6Ol9pbnRlcm5hbF9hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiBfaW1wbF8udW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBNZXRob2RPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uKiBfYWRkID0gX2ludGVybmFsX2FkZF91bmludGVycHJldGVkX29wdGlvbigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gX2FkZDsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKK01ldGhvZE9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIF9pbXBsXy51bmludGVycHJldGVkX29wdGlvbl87Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydAorCisvLyByZXF1aXJlZCBzdHJpbmcgbmFtZV9wYXJ0ID0gMTsKK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Ol9pbnRlcm5hbF9oYXNfbmFtZV9wYXJ0KCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Omhhc19uYW1lX3BhcnQoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX25hbWVfcGFydCgpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Y2xlYXJfbmFtZV9wYXJ0KCkgeworICBfaW1wbF8ubmFtZV9wYXJ0Xy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpuYW1lX3BhcnQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQubmFtZV9wYXJ0KQorICByZXR1cm4gX2ludGVybmFsX25hbWVfcGFydCgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6c2V0X25hbWVfcGFydChBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworIF9pbXBsXy5uYW1lX3BhcnRfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5uYW1lX3BhcnQpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Om11dGFibGVfbmFtZV9wYXJ0KCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lX3BhcnQoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQubmFtZV9wYXJ0KQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Ol9pbnRlcm5hbF9uYW1lX3BhcnQoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubmFtZV9wYXJ0Xy5HZXQoKTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Ol9pbnRlcm5hbF9zZXRfbmFtZV9wYXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgX2ltcGxfLm5hbWVfcGFydF8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Ol9pbnRlcm5hbF9tdXRhYmxlX25hbWVfcGFydCgpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7CisgIHJldHVybiBfaW1wbF8ubmFtZV9wYXJ0Xy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6cmVsZWFzZV9uYW1lX3BhcnQoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCkKKyAgaWYgKCFfaW50ZXJuYWxfaGFzX25hbWVfcGFydCgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworICBhdXRvKiBwID0gX2ltcGxfLm5hbWVfcGFydF8uUmVsZWFzZSgpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5uYW1lX3BhcnRfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLm5hbWVfcGFydF8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIHJldHVybiBwOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6c2V0X2FsbG9jYXRlZF9uYW1lX3BhcnQoc3RkOjpzdHJpbmcqIG5hbWVfcGFydCkgeworICBpZiAobmFtZV9wYXJ0ICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIH0KKyAgX2ltcGxfLm5hbWVfcGFydF8uU2V0QWxsb2NhdGVkKG5hbWVfcGFydCwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5uYW1lX3BhcnRfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLm5hbWVfcGFydF8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCkKK30KKworLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOworaW5saW5lIGJvb2wgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6X2ludGVybmFsX2hhc19pc19leHRlbnNpb24oKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6aGFzX2lzX2V4dGVuc2lvbigpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfaXNfZXh0ZW5zaW9uKCk7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpjbGVhcl9pc19leHRlbnNpb24oKSB7CisgIF9pbXBsXy5pc19leHRlbnNpb25fID0gZmFsc2U7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Ol9pbnRlcm5hbF9pc19leHRlbnNpb24oKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uaXNfZXh0ZW5zaW9uXzsKK30KK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmlzX2V4dGVuc2lvbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5pc19leHRlbnNpb24pCisgIHJldHVybiBfaW50ZXJuYWxfaXNfZXh0ZW5zaW9uKCk7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpfaW50ZXJuYWxfc2V0X2lzX2V4dGVuc2lvbihib29sIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworICBfaW1wbF8uaXNfZXh0ZW5zaW9uXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6c2V0X2lzX2V4dGVuc2lvbihib29sIHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfaXNfZXh0ZW5zaW9uKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5pc19leHRlbnNpb24pCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVW5pbnRlcnByZXRlZE9wdGlvbgorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7CitpbmxpbmUgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb246Ol9pbnRlcm5hbF9uYW1lX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubmFtZV8uc2l6ZSgpOworfQoraW5saW5lIGludCBVbmludGVycHJldGVkT3B0aW9uOjpuYW1lX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfbmFtZV9zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9uYW1lKCkgeworICBfaW1wbF8ubmFtZV8uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9uYW1lKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uYW1lKQorICByZXR1cm4gX2ltcGxfLm5hbWVfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCA+KgorVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLm5hbWUpCisgIHJldHVybiAmX2ltcGxfLm5hbWVfOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBVbmludGVycHJldGVkT3B0aW9uOjpfaW50ZXJuYWxfbmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBVbmludGVycHJldGVkT3B0aW9uOjpuYW1lKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLm5hbWUpCisgIHJldHVybiBfaW50ZXJuYWxfbmFtZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIFVuaW50ZXJwcmV0ZWRPcHRpb246Ol9pbnRlcm5hbF9hZGRfbmFtZSgpIHsKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5BZGQoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogVW5pbnRlcnByZXRlZE9wdGlvbjo6YWRkX25hbWUoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBfYWRkID0gX2ludGVybmFsX2FkZF9uYW1lKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ubmFtZSkKKyAgcmV0dXJuIF9hZGQ7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0ID4mCitVbmludGVycHJldGVkT3B0aW9uOjpuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uYW1lKQorICByZXR1cm4gX2ltcGxfLm5hbWVfOworfQorCisvLyBvcHRpb25hbCBzdHJpbmcgaWRlbnRpZmllcl92YWx1ZSA9IDM7CitpbmxpbmUgYm9vbCBVbmludGVycHJldGVkT3B0aW9uOjpfaW50ZXJuYWxfaGFzX2lkZW50aWZpZXJfdmFsdWUoKSBjb25zdCB7CisgIGJvb2wgdmFsdWUgPSAoX2ltcGxfLl9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgVW5pbnRlcnByZXRlZE9wdGlvbjo6aGFzX2lkZW50aWZpZXJfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2lkZW50aWZpZXJfdmFsdWUoKSB7CisgIF9pbXBsXy5pZGVudGlmaWVyX3ZhbHVlXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBVbmludGVycHJldGVkT3B0aW9uOjppZGVudGlmaWVyX3ZhbHVlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUpCisgIHJldHVybiBfaW50ZXJuYWxfaWRlbnRpZmllcl92YWx1ZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2lkZW50aWZpZXJfdmFsdWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyBfaW1wbF8uaWRlbnRpZmllcl92YWx1ZV8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246Om11dGFibGVfaWRlbnRpZmllcl92YWx1ZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfaWRlbnRpZmllcl92YWx1ZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIFVuaW50ZXJwcmV0ZWRPcHRpb246Ol9pbnRlcm5hbF9pZGVudGlmaWVyX3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmlkZW50aWZpZXJfdmFsdWVfLkdldCgpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6X2ludGVybmFsX3NldF9pZGVudGlmaWVyX3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgX2ltcGxfLmlkZW50aWZpZXJfdmFsdWVfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBVbmludGVycHJldGVkT3B0aW9uOjpfaW50ZXJuYWxfbXV0YWJsZV9pZGVudGlmaWVyX3ZhbHVlKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgcmV0dXJuIF9pbXBsXy5pZGVudGlmaWVyX3ZhbHVlXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6cmVsZWFzZV9pZGVudGlmaWVyX3ZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKQorICBpZiAoIV9pbnRlcm5hbF9oYXNfaWRlbnRpZmllcl92YWx1ZSgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworICBhdXRvKiBwID0gX2ltcGxfLmlkZW50aWZpZXJfdmFsdWVfLlJlbGVhc2UoKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8uaWRlbnRpZmllcl92YWx1ZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uaWRlbnRpZmllcl92YWx1ZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIHJldHVybiBwOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2FsbG9jYXRlZF9pZGVudGlmaWVyX3ZhbHVlKHN0ZDo6c3RyaW5nKiBpZGVudGlmaWVyX3ZhbHVlKSB7CisgIGlmIChpZGVudGlmaWVyX3ZhbHVlICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIH0KKyAgX2ltcGxfLmlkZW50aWZpZXJfdmFsdWVfLlNldEFsbG9jYXRlZChpZGVudGlmaWVyX3ZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLmlkZW50aWZpZXJfdmFsdWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLmlkZW50aWZpZXJfdmFsdWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKQorfQorCisvLyBvcHRpb25hbCB1aW50NjQgcG9zaXRpdmVfaW50X3ZhbHVlID0gNDsKK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Ol9pbnRlcm5hbF9oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfcG9zaXRpdmVfaW50X3ZhbHVlKCkgeworICBfaW1wbF8ucG9zaXRpdmVfaW50X3ZhbHVlXyA9IHVpbnQ2NF90ezB1fTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworfQoraW5saW5lIHVpbnQ2NF90IFVuaW50ZXJwcmV0ZWRPcHRpb246Ol9pbnRlcm5hbF9wb3NpdGl2ZV9pbnRfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ucG9zaXRpdmVfaW50X3ZhbHVlXzsKK30KK2lubGluZSB1aW50NjRfdCBVbmludGVycHJldGVkT3B0aW9uOjpwb3NpdGl2ZV9pbnRfdmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ucG9zaXRpdmVfaW50X3ZhbHVlKQorICByZXR1cm4gX2ludGVybmFsX3Bvc2l0aXZlX2ludF92YWx1ZSgpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6X2ludGVybmFsX3NldF9wb3NpdGl2ZV9pbnRfdmFsdWUodWludDY0X3QgdmFsdWUpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7CisgIF9pbXBsXy5wb3NpdGl2ZV9pbnRfdmFsdWVfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfcG9zaXRpdmVfaW50X3ZhbHVlKHVpbnQ2NF90IHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfcG9zaXRpdmVfaW50X3ZhbHVlKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5wb3NpdGl2ZV9pbnRfdmFsdWUpCit9CisKKy8vIG9wdGlvbmFsIGludDY0IG5lZ2F0aXZlX2ludF92YWx1ZSA9IDU7CitpbmxpbmUgYm9vbCBVbmludGVycHJldGVkT3B0aW9uOjpfaW50ZXJuYWxfaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMTB1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBVbmludGVycHJldGVkT3B0aW9uOjpoYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX25lZ2F0aXZlX2ludF92YWx1ZSgpIHsKKyAgX2ltcGxfLm5lZ2F0aXZlX2ludF92YWx1ZV8gPSBpbnQ2NF90ezB9OworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAxMHU7Cit9CitpbmxpbmUgaW50NjRfdCBVbmludGVycHJldGVkT3B0aW9uOjpfaW50ZXJuYWxfbmVnYXRpdmVfaW50X3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm5lZ2F0aXZlX2ludF92YWx1ZV87Cit9CitpbmxpbmUgaW50NjRfdCBVbmludGVycHJldGVkT3B0aW9uOjpuZWdhdGl2ZV9pbnRfdmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ubmVnYXRpdmVfaW50X3ZhbHVlKQorICByZXR1cm4gX2ludGVybmFsX25lZ2F0aXZlX2ludF92YWx1ZSgpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6X2ludGVybmFsX3NldF9uZWdhdGl2ZV9pbnRfdmFsdWUoaW50NjRfdCB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDEwdTsKKyAgX2ltcGxfLm5lZ2F0aXZlX2ludF92YWx1ZV8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9uZWdhdGl2ZV9pbnRfdmFsdWUoaW50NjRfdCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X25lZ2F0aXZlX2ludF92YWx1ZSh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ubmVnYXRpdmVfaW50X3ZhbHVlKQorfQorCisvLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Ol9pbnRlcm5hbF9oYXNfZG91YmxlX3ZhbHVlKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAyMHUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19kb3VibGVfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2RvdWJsZV92YWx1ZSgpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfZG91YmxlX3ZhbHVlKCkgeworICBfaW1wbF8uZG91YmxlX3ZhbHVlXyA9IDA7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDIwdTsKK30KK2lubGluZSBkb3VibGUgVW5pbnRlcnByZXRlZE9wdGlvbjo6X2ludGVybmFsX2RvdWJsZV92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5kb3VibGVfdmFsdWVfOworfQoraW5saW5lIGRvdWJsZSBVbmludGVycHJldGVkT3B0aW9uOjpkb3VibGVfdmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uZG91YmxlX3ZhbHVlKQorICByZXR1cm4gX2ludGVybmFsX2RvdWJsZV92YWx1ZSgpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6X2ludGVybmFsX3NldF9kb3VibGVfdmFsdWUoZG91YmxlIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMjB1OworICBfaW1wbF8uZG91YmxlX3ZhbHVlXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2RvdWJsZV92YWx1ZShkb3VibGUgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9kb3VibGVfdmFsdWUodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmRvdWJsZV92YWx1ZSkKK30KKworLy8gb3B0aW9uYWwgYnl0ZXMgc3RyaW5nX3ZhbHVlID0gNzsKK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Ol9pbnRlcm5hbF9oYXNfc3RyaW5nX3ZhbHVlKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19zdHJpbmdfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX3N0cmluZ192YWx1ZSgpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfc3RyaW5nX3ZhbHVlKCkgeworICBfaW1wbF8uc3RyaW5nX3ZhbHVlXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBVbmludGVycHJldGVkT3B0aW9uOjpzdHJpbmdfdmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlKQorICByZXR1cm4gX2ludGVybmFsX3N0cmluZ192YWx1ZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X3N0cmluZ192YWx1ZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworIF9pbXBsXy5zdHJpbmdfdmFsdWVfLlNldEJ5dGVzKHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLnN0cmluZ192YWx1ZSkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9zdHJpbmdfdmFsdWUoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX3N0cmluZ192YWx1ZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5zdHJpbmdfdmFsdWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgVW5pbnRlcnByZXRlZE9wdGlvbjo6X2ludGVybmFsX3N0cmluZ192YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5zdHJpbmdfdmFsdWVfLkdldCgpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6X2ludGVybmFsX3NldF9zdHJpbmdfdmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworICBfaW1wbF8uc3RyaW5nX3ZhbHVlXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6X2ludGVybmFsX211dGFibGVfc3RyaW5nX3ZhbHVlKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgcmV0dXJuIF9pbXBsXy5zdHJpbmdfdmFsdWVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBVbmludGVycHJldGVkT3B0aW9uOjpyZWxlYXNlX3N0cmluZ192YWx1ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlKQorICBpZiAoIV9pbnRlcm5hbF9oYXNfc3RyaW5nX3ZhbHVlKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CisgIGF1dG8qIHAgPSBfaW1wbF8uc3RyaW5nX3ZhbHVlXy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnN0cmluZ192YWx1ZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uc3RyaW5nX3ZhbHVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfYWxsb2NhdGVkX3N0cmluZ192YWx1ZShzdGQ6OnN0cmluZyogc3RyaW5nX3ZhbHVlKSB7CisgIGlmIChzdHJpbmdfdmFsdWUgIT0gbnVsbHB0cikgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKKyAgfQorICBfaW1wbF8uc3RyaW5nX3ZhbHVlXy5TZXRBbGxvY2F0ZWQoc3RyaW5nX3ZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnN0cmluZ192YWx1ZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uc3RyaW5nX3ZhbHVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgYWdncmVnYXRlX3ZhbHVlID0gODsKK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Ol9pbnRlcm5hbF9oYXNfYWdncmVnYXRlX3ZhbHVlKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19hZ2dyZWdhdGVfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfYWdncmVnYXRlX3ZhbHVlKCkgeworICBfaW1wbF8uYWdncmVnYXRlX3ZhbHVlXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBVbmludGVycHJldGVkT3B0aW9uOjphZ2dyZWdhdGVfdmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uYWdncmVnYXRlX3ZhbHVlKQorICByZXR1cm4gX2ludGVybmFsX2FnZ3JlZ2F0ZV92YWx1ZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2FnZ3JlZ2F0ZV92YWx1ZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworIF9pbXBsXy5hZ2dyZWdhdGVfdmFsdWVfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246Om11dGFibGVfYWdncmVnYXRlX3ZhbHVlKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9hZ2dyZWdhdGVfdmFsdWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uYWdncmVnYXRlX3ZhbHVlKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIFVuaW50ZXJwcmV0ZWRPcHRpb246Ol9pbnRlcm5hbF9hZ2dyZWdhdGVfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uYWdncmVnYXRlX3ZhbHVlXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246Ol9pbnRlcm5hbF9zZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKKyAgX2ltcGxfLmFnZ3JlZ2F0ZV92YWx1ZV8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246Ol9pbnRlcm5hbF9tdXRhYmxlX2FnZ3JlZ2F0ZV92YWx1ZSgpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7CisgIHJldHVybiBfaW1wbF8uYWdncmVnYXRlX3ZhbHVlXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6cmVsZWFzZV9hZ2dyZWdhdGVfdmFsdWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmFnZ3JlZ2F0ZV92YWx1ZSkKKyAgaWYgKCFfaW50ZXJuYWxfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworICBhdXRvKiBwID0gX2ltcGxfLmFnZ3JlZ2F0ZV92YWx1ZV8uUmVsZWFzZSgpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5hZ2dyZWdhdGVfdmFsdWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLmFnZ3JlZ2F0ZV92YWx1ZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIHJldHVybiBwOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2FsbG9jYXRlZF9hZ2dyZWdhdGVfdmFsdWUoc3RkOjpzdHJpbmcqIGFnZ3JlZ2F0ZV92YWx1ZSkgeworICBpZiAoYWdncmVnYXRlX3ZhbHVlICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7CisgIH0KKyAgX2ltcGxfLmFnZ3JlZ2F0ZV92YWx1ZV8uU2V0QWxsb2NhdGVkKGFnZ3JlZ2F0ZV92YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5hZ2dyZWdhdGVfdmFsdWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLmFnZ3JlZ2F0ZV92YWx1ZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmFnZ3JlZ2F0ZV92YWx1ZSkKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbgorCisvLyByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkID0gdHJ1ZV07CitpbmxpbmUgaW50IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpfaW50ZXJuYWxfcGF0aF9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnBhdGhfLnNpemUoKTsKK30KK2lubGluZSBpbnQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnBhdGhfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9wYXRoX3NpemUoKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl9wYXRoKCkgeworICBfaW1wbF8ucGF0aF8uQ2xlYXIoKTsKK30KK2lubGluZSBpbnQzMl90IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpfaW50ZXJuYWxfcGF0aChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5wYXRoXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGludDMyX3QgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnBhdGgoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnBhdGgpCisgIHJldHVybiBfaW50ZXJuYWxfcGF0aChpbmRleCk7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X3BhdGgoaW50IGluZGV4LCBpbnQzMl90IHZhbHVlKSB7CisgIF9pbXBsXy5wYXRoXy5TZXQoaW5kZXgsIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aCkKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpfaW50ZXJuYWxfYWRkX3BhdGgoaW50MzJfdCB2YWx1ZSkgeworICBfaW1wbF8ucGF0aF8uQWRkKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjphZGRfcGF0aChpbnQzMl90IHZhbHVlKSB7CisgIF9pbnRlcm5hbF9hZGRfcGF0aCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnBhdGgpCit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPiYKK1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpfaW50ZXJuYWxfcGF0aCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5wYXRoXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+JgorU291cmNlQ29kZUluZm9fTG9jYXRpb246OnBhdGgoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5wYXRoKQorICByZXR1cm4gX2ludGVybmFsX3BhdGgoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+KgorU291cmNlQ29kZUluZm9fTG9jYXRpb246Ol9pbnRlcm5hbF9tdXRhYmxlX3BhdGgoKSB7CisgIHJldHVybiAmX2ltcGxfLnBhdGhfOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZEZpZWxkPCBpbnQzMl90ID4qCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9wYXRoKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5wYXRoKQorICByZXR1cm4gX2ludGVybmFsX211dGFibGVfcGF0aCgpOworfQorCisvLyByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkID0gdHJ1ZV07CitpbmxpbmUgaW50IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpfaW50ZXJuYWxfc3Bhbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnNwYW5fLnNpemUoKTsKK30KK2lubGluZSBpbnQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNwYW5fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9zcGFuX3NpemUoKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl9zcGFuKCkgeworICBfaW1wbF8uc3Bhbl8uQ2xlYXIoKTsKK30KK2lubGluZSBpbnQzMl90IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpfaW50ZXJuYWxfc3BhbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5zcGFuXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGludDMyX3QgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNwYW4oaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnNwYW4pCisgIHJldHVybiBfaW50ZXJuYWxfc3BhbihpbmRleCk7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X3NwYW4oaW50IGluZGV4LCBpbnQzMl90IHZhbHVlKSB7CisgIF9pbXBsXy5zcGFuXy5TZXQoaW5kZXgsIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24uc3BhbikKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpfaW50ZXJuYWxfYWRkX3NwYW4oaW50MzJfdCB2YWx1ZSkgeworICBfaW1wbF8uc3Bhbl8uQWRkKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjphZGRfc3BhbihpbnQzMl90IHZhbHVlKSB7CisgIF9pbnRlcm5hbF9hZGRfc3Bhbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnNwYW4pCit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPiYKK1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpfaW50ZXJuYWxfc3BhbigpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5zcGFuXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+JgorU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNwYW4oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuKQorICByZXR1cm4gX2ludGVybmFsX3NwYW4oKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+KgorU291cmNlQ29kZUluZm9fTG9jYXRpb246Ol9pbnRlcm5hbF9tdXRhYmxlX3NwYW4oKSB7CisgIHJldHVybiAmX2ltcGxfLnNwYW5fOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZEZpZWxkPCBpbnQzMl90ID4qCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9zcGFuKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuKQorICByZXR1cm4gX2ludGVybmFsX211dGFibGVfc3BhbigpOworfQorCisvLyBvcHRpb25hbCBzdHJpbmcgbGVhZGluZ19jb21tZW50cyA9IDM7CitpbmxpbmUgYm9vbCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6X2ludGVybmFsX2hhc19sZWFkaW5nX2NvbW1lbnRzKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpoYXNfbGVhZGluZ19jb21tZW50cygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfbGVhZGluZ19jb21tZW50cygpOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmNsZWFyX2xlYWRpbmdfY29tbWVudHMoKSB7CisgIF9pbXBsXy5sZWFkaW5nX2NvbW1lbnRzXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bGVhZGluZ19jb21tZW50cygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cykKKyAgcmV0dXJuIF9pbnRlcm5hbF9sZWFkaW5nX2NvbW1lbnRzKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2xlYWRpbmdfY29tbWVudHMoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyBfaW1wbF8ubGVhZGluZ19jb21tZW50c18uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9sZWFkaW5nX2NvbW1lbnRzKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9sZWFkaW5nX2NvbW1lbnRzKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpfaW50ZXJuYWxfbGVhZGluZ19jb21tZW50cygpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5sZWFkaW5nX2NvbW1lbnRzXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpfaW50ZXJuYWxfc2V0X2xlYWRpbmdfY29tbWVudHMoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICBfaW1wbF8ubGVhZGluZ19jb21tZW50c18uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpfaW50ZXJuYWxfbXV0YWJsZV9sZWFkaW5nX2NvbW1lbnRzKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgcmV0dXJuIF9pbXBsXy5sZWFkaW5nX2NvbW1lbnRzXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246OnJlbGVhc2VfbGVhZGluZ19jb21tZW50cygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMpCisgIGlmICghX2ludGVybmFsX2hhc19sZWFkaW5nX2NvbW1lbnRzKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIGF1dG8qIHAgPSBfaW1wbF8ubGVhZGluZ19jb21tZW50c18uUmVsZWFzZSgpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5sZWFkaW5nX2NvbW1lbnRzXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5sZWFkaW5nX2NvbW1lbnRzXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2FsbG9jYXRlZF9sZWFkaW5nX2NvbW1lbnRzKHN0ZDo6c3RyaW5nKiBsZWFkaW5nX2NvbW1lbnRzKSB7CisgIGlmIChsZWFkaW5nX2NvbW1lbnRzICE9IG51bGxwdHIpIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyAgfSBlbHNlIHsKKyAgICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIH0KKyAgX2ltcGxfLmxlYWRpbmdfY29tbWVudHNfLlNldEFsbG9jYXRlZChsZWFkaW5nX2NvbW1lbnRzLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLmxlYWRpbmdfY29tbWVudHNfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLmxlYWRpbmdfY29tbWVudHNfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cykKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIHRyYWlsaW5nX2NvbW1lbnRzID0gNDsKK2lubGluZSBib29sIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpfaW50ZXJuYWxfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpoYXNfdHJhaWxpbmdfY29tbWVudHMoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Y2xlYXJfdHJhaWxpbmdfY29tbWVudHMoKSB7CisgIF9pbXBsXy50cmFpbGluZ19jb21tZW50c18uQ2xlYXJUb0VtcHR5KCk7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnRyYWlsaW5nX2NvbW1lbnRzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cykKKyAgcmV0dXJuIF9pbnRlcm5hbF90cmFpbGluZ19jb21tZW50cygpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF90cmFpbGluZ19jb21tZW50cyhBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworIF9pbXBsXy50cmFpbGluZ19jb21tZW50c18uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cykKK30KK2lubGluZSBzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246Om11dGFibGVfdHJhaWxpbmdfY29tbWVudHMoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX3RyYWlsaW5nX2NvbW1lbnRzKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cykKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6X2ludGVybmFsX3RyYWlsaW5nX2NvbW1lbnRzKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnRyYWlsaW5nX2NvbW1lbnRzXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpfaW50ZXJuYWxfc2V0X3RyYWlsaW5nX2NvbW1lbnRzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgX2ltcGxfLnRyYWlsaW5nX2NvbW1lbnRzXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246Ol9pbnRlcm5hbF9tdXRhYmxlX3RyYWlsaW5nX2NvbW1lbnRzKCkgeworICBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKKyAgcmV0dXJuIF9pbXBsXy50cmFpbGluZ19jb21tZW50c18uTXV0YWJsZShHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpyZWxlYXNlX3RyYWlsaW5nX2NvbW1lbnRzKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMpCisgIGlmICghX2ludGVybmFsX2hhc190cmFpbGluZ19jb21tZW50cygpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICBhdXRvKiBwID0gX2ltcGxfLnRyYWlsaW5nX2NvbW1lbnRzXy5SZWxlYXNlKCk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnRyYWlsaW5nX2NvbW1lbnRzXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy50cmFpbGluZ19jb21tZW50c18uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIHJldHVybiBwOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9hbGxvY2F0ZWRfdHJhaWxpbmdfY29tbWVudHMoc3RkOjpzdHJpbmcqIHRyYWlsaW5nX2NvbW1lbnRzKSB7CisgIGlmICh0cmFpbGluZ19jb21tZW50cyAhPSBudWxscHRyKSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7CisgIH0gZWxzZSB7CisgICAgX2ltcGxfLl9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworICB9CisgIF9pbXBsXy50cmFpbGluZ19jb21tZW50c18uU2V0QWxsb2NhdGVkKHRyYWlsaW5nX2NvbW1lbnRzLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnRyYWlsaW5nX2NvbW1lbnRzXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy50cmFpbGluZ19jb21tZW50c18uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cykKK30KKworLy8gcmVwZWF0ZWQgc3RyaW5nIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMgPSA2OworaW5saW5lIGludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6X2ludGVybmFsX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c19zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Y2xlYXJfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpIHsKKyAgX2ltcGxfLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLkNsZWFyKCk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjphZGRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX2FkZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6X2ludGVybmFsX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCisgIHJldHVybiBfaW50ZXJuYWxfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpbmRleCk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjptdXRhYmxlX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQorICByZXR1cm4gX2ltcGxfLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpbnQgaW5kZXgsIHN0ZDo6c3RyaW5nJiYgdmFsdWUpIHsKKyAgX2ltcGxfLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24oc3RkOjptb3ZlKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICBHT09HTEVfRENIRUNLKHZhbHVlICE9IG51bGxwdHIpOworICBfaW1wbF8ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBfaW1wbF8ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uTXV0YWJsZShpbmRleCktPmFzc2lnbigKKyAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpfaW50ZXJuYWxfYWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKSB7CisgIHJldHVybiBfaW1wbF8ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uQWRkKCk7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6YWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjphZGRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhzdGQ6OnN0cmluZyYmIHZhbHVlKSB7CisgIF9pbXBsXy5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5BZGQoc3RkOjptb3ZlKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6YWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgR09PR0xFX0RDSEVDSyh2YWx1ZSAhPSBudWxscHRyKTsKKyAgX2ltcGxfLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX2NoYXI6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6YWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIF9pbXBsXy5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4mCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCisgIHJldHVybiBfaW1wbF8ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50c187Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KgorU291cmNlQ29kZUluZm9fTG9jYXRpb246Om11dGFibGVfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKKyAgcmV0dXJuICZfaW1wbF8ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50c187Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU291cmNlQ29kZUluZm8KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbiBsb2NhdGlvbiA9IDE7CitpbmxpbmUgaW50IFNvdXJjZUNvZGVJbmZvOjpfaW50ZXJuYWxfbG9jYXRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5sb2NhdGlvbl8uc2l6ZSgpOworfQoraW5saW5lIGludCBTb3VyY2VDb2RlSW5mbzo6bG9jYXRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9sb2NhdGlvbl9zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mbzo6Y2xlYXJfbG9jYXRpb24oKSB7CisgIF9pbXBsXy5sb2NhdGlvbl8uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm9fTG9jYXRpb24qIFNvdXJjZUNvZGVJbmZvOjptdXRhYmxlX2xvY2F0aW9uKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8ubG9jYXRpb24pCisgIHJldHVybiBfaW1wbF8ubG9jYXRpb25fLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPioKK1NvdXJjZUNvZGVJbmZvOjptdXRhYmxlX2xvY2F0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5sb2NhdGlvbikKKyAgcmV0dXJuICZfaW1wbF8ubG9jYXRpb25fOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgU291cmNlQ29kZUluZm86Ol9pbnRlcm5hbF9sb2NhdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5sb2NhdGlvbl8uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29kZUluZm9fTG9jYXRpb24mIFNvdXJjZUNvZGVJbmZvOjpsb2NhdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8ubG9jYXRpb24pCisgIHJldHVybiBfaW50ZXJuYWxfbG9jYXRpb24oaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogU291cmNlQ29kZUluZm86Ol9pbnRlcm5hbF9hZGRfbG9jYXRpb24oKSB7CisgIHJldHVybiBfaW1wbF8ubG9jYXRpb25fLkFkZCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogU291cmNlQ29kZUluZm86OmFkZF9sb2NhdGlvbigpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBfYWRkID0gX2ludGVybmFsX2FkZF9sb2NhdGlvbigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5sb2NhdGlvbikKKyAgcmV0dXJuIF9hZGQ7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiA+JgorU291cmNlQ29kZUluZm86OmxvY2F0aW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8ubG9jYXRpb24pCisgIHJldHVybiBfaW1wbF8ubG9jYXRpb25fOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24KKworLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworaW5saW5lIGludCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpfaW50ZXJuYWxfcGF0aF9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnBhdGhfLnNpemUoKTsKK30KK2lubGluZSBpbnQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6cGF0aF9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX3BhdGhfc2l6ZSgpOworfQoraW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Y2xlYXJfcGF0aCgpIHsKKyAgX2ltcGxfLnBhdGhfLkNsZWFyKCk7Cit9CitpbmxpbmUgaW50MzJfdCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpfaW50ZXJuYWxfcGF0aChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5wYXRoXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGludDMyX3QgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6cGF0aChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5wYXRoKQorICByZXR1cm4gX2ludGVybmFsX3BhdGgoaW5kZXgpOworfQoraW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X3BhdGgoaW50IGluZGV4LCBpbnQzMl90IHZhbHVlKSB7CisgIF9pbXBsXy5wYXRoXy5TZXQoaW5kZXgsIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5wYXRoKQorfQoraW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6X2ludGVybmFsX2FkZF9wYXRoKGludDMyX3QgdmFsdWUpIHsKKyAgX2ltcGxfLnBhdGhfLkFkZCh2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjphZGRfcGF0aChpbnQzMl90IHZhbHVlKSB7CisgIF9pbnRlcm5hbF9hZGRfcGF0aCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24ucGF0aCkKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+JgorR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6X2ludGVybmFsX3BhdGgoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ucGF0aF87Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkRmllbGQ8IGludDMyX3QgPiYKK0dlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnBhdGgoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnBhdGgpCisgIHJldHVybiBfaW50ZXJuYWxfcGF0aCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZEZpZWxkPCBpbnQzMl90ID4qCitHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpfaW50ZXJuYWxfbXV0YWJsZV9wYXRoKCkgeworICByZXR1cm4gJl9pbXBsXy5wYXRoXzsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRGaWVsZDwgaW50MzJfdCA+KgorR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6bXV0YWJsZV9wYXRoKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnBhdGgpCisgIHJldHVybiBfaW50ZXJuYWxfbXV0YWJsZV9wYXRoKCk7Cit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBzb3VyY2VfZmlsZSA9IDI7CitpbmxpbmUgYm9vbCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpfaW50ZXJuYWxfaGFzX3NvdXJjZV9maWxlKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Omhhc19zb3VyY2VfZmlsZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfc291cmNlX2ZpbGUoKTsKK30KK2lubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmNsZWFyX3NvdXJjZV9maWxlKCkgeworICBfaW1wbF8uc291cmNlX2ZpbGVfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnNvdXJjZV9maWxlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlKQorICByZXR1cm4gX2ludGVybmFsX3NvdXJjZV9maWxlKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfc291cmNlX2ZpbGUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyBfaW1wbF8uX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKKyBfaW1wbF8uc291cmNlX2ZpbGVfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5zb3VyY2VfZmlsZSkKK30KK2lubGluZSBzdGQ6OnN0cmluZyogR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6bXV0YWJsZV9zb3VyY2VfZmlsZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfc291cmNlX2ZpbGUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6X2ludGVybmFsX3NvdXJjZV9maWxlKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnNvdXJjZV9maWxlXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Ol9pbnRlcm5hbF9zZXRfc291cmNlX2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICBfaW1wbF8uc291cmNlX2ZpbGVfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpfaW50ZXJuYWxfbXV0YWJsZV9zb3VyY2VfZmlsZSgpIHsKKyAgX2ltcGxfLl9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7CisgIHJldHVybiBfaW1wbF8uc291cmNlX2ZpbGVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpyZWxlYXNlX3NvdXJjZV9maWxlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5zb3VyY2VfZmlsZSkKKyAgaWYgKCFfaW50ZXJuYWxfaGFzX3NvdXJjZV9maWxlKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBfaW1wbF8uX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CisgIGF1dG8qIHAgPSBfaW1wbF8uc291cmNlX2ZpbGVfLlJlbGVhc2UoKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8uc291cmNlX2ZpbGVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLnNvdXJjZV9maWxlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgcmV0dXJuIHA7Cit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfYWxsb2NhdGVkX3NvdXJjZV9maWxlKHN0ZDo6c3RyaW5nKiBzb3VyY2VfZmlsZSkgeworICBpZiAoc291cmNlX2ZpbGUgIT0gbnVsbHB0cikgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworICB9IGVsc2UgeworICAgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKKyAgfQorICBfaW1wbF8uc291cmNlX2ZpbGVfLlNldEFsbG9jYXRlZChzb3VyY2VfZmlsZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5zb3VyY2VfZmlsZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uc291cmNlX2ZpbGVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5zb3VyY2VfZmlsZSkKK30KKworLy8gb3B0aW9uYWwgaW50MzIgYmVnaW4gPSAzOworaW5saW5lIGJvb2wgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6X2ludGVybmFsX2hhc19iZWdpbigpIGNvbnN0IHsKKyAgYm9vbCB2YWx1ZSA9IChfaW1wbF8uX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworICByZXR1cm4gdmFsdWU7Cit9CitpbmxpbmUgYm9vbCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpoYXNfYmVnaW4oKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2JlZ2luKCk7Cit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpjbGVhcl9iZWdpbigpIHsKKyAgX2ltcGxfLmJlZ2luXyA9IDA7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSBpbnQzMl90IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Ol9pbnRlcm5hbF9iZWdpbigpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5iZWdpbl87Cit9CitpbmxpbmUgaW50MzJfdCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpiZWdpbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5iZWdpbikKKyAgcmV0dXJuIF9pbnRlcm5hbF9iZWdpbigpOworfQoraW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6X2ludGVybmFsX3NldF9iZWdpbihpbnQzMl90IHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworICBfaW1wbF8uYmVnaW5fID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfYmVnaW4oaW50MzJfdCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X2JlZ2luKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5iZWdpbikKK30KKworLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gNDsKK2lubGluZSBib29sIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Ol9pbnRlcm5hbF9oYXNfZW5kKCkgY29uc3QgeworICBib29sIHZhbHVlID0gKF9pbXBsXy5faGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7CisgIHJldHVybiB2YWx1ZTsKK30KK2lubGluZSBib29sIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Omhhc19lbmQoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX2VuZCgpOworfQoraW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Y2xlYXJfZW5kKCkgeworICBfaW1wbF8uZW5kXyA9IDA7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK2lubGluZSBpbnQzMl90IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Ol9pbnRlcm5hbF9lbmQoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZW5kXzsKK30KK2lubGluZSBpbnQzMl90IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmVuZCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5lbmQpCisgIHJldHVybiBfaW50ZXJuYWxfZW5kKCk7Cit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpfaW50ZXJuYWxfc2V0X2VuZChpbnQzMl90IHZhbHVlKSB7CisgIF9pbXBsXy5faGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworICBfaW1wbF8uZW5kXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X2VuZChpbnQzMl90IHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfZW5kKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5lbmQpCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gR2VuZXJhdGVkQ29kZUluZm8KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uIGFubm90YXRpb24gPSAxOworaW5saW5lIGludCBHZW5lcmF0ZWRDb2RlSW5mbzo6X2ludGVybmFsX2Fubm90YXRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5hbm5vdGF0aW9uXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IEdlbmVyYXRlZENvZGVJbmZvOjphbm5vdGF0aW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfYW5ub3RhdGlvbl9zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mbzo6Y2xlYXJfYW5ub3RhdGlvbigpIHsKKyAgX2ltcGxfLmFubm90YXRpb25fLkNsZWFyKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIEdlbmVyYXRlZENvZGVJbmZvOjptdXRhYmxlX2Fubm90YXRpb24oaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5hbm5vdGF0aW9uKQorICByZXR1cm4gX2ltcGxfLmFubm90YXRpb25fLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiA+KgorR2VuZXJhdGVkQ29kZUluZm86Om11dGFibGVfYW5ub3RhdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uYW5ub3RhdGlvbikKKyAgcmV0dXJuICZfaW1wbF8uYW5ub3RhdGlvbl87Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIEdlbmVyYXRlZENvZGVJbmZvOjpfaW50ZXJuYWxfYW5ub3RhdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5hbm5vdGF0aW9uXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJiBHZW5lcmF0ZWRDb2RlSW5mbzo6YW5ub3RhdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uYW5ub3RhdGlvbikKKyAgcmV0dXJuIF9pbnRlcm5hbF9hbm5vdGF0aW9uKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogR2VuZXJhdGVkQ29kZUluZm86Ol9pbnRlcm5hbF9hZGRfYW5ub3RhdGlvbigpIHsKKyAgcmV0dXJuIF9pbXBsXy5hbm5vdGF0aW9uXy5BZGQoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogR2VuZXJhdGVkQ29kZUluZm86OmFkZF9hbm5vdGF0aW9uKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogX2FkZCA9IF9pbnRlcm5hbF9hZGRfYW5ub3RhdGlvbigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5hbm5vdGF0aW9uKQorICByZXR1cm4gX2FkZDsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24gPiYKK0dlbmVyYXRlZENvZGVJbmZvOjphbm5vdGF0aW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uYW5ub3RhdGlvbikKKyAgcmV0dXJuIF9pbXBsXy5hbm5vdGF0aW9uXzsKK30KKworI2lmZGVmIF9fR05VQ19fCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYgIC8vIF9fR05VQ19fCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KKwordGVtcGxhdGUgPD4gc3RydWN0IGlzX3Byb3RvX2VudW08IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlPiA6IDo6c3RkOjp0cnVlX3R5cGUge307Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvcjwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGU+KCkgeworICByZXR1cm4gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZGVzY3JpcHRvcigpOworfQordGVtcGxhdGUgPD4gc3RydWN0IGlzX3Byb3RvX2VudW08IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbD4gOiA6OnN0ZDo6dHJ1ZV90eXBlIHt9OwordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3I8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbD4oKSB7CisgIHJldHVybiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcigpOworfQordGVtcGxhdGUgPD4gc3RydWN0IGlzX3Byb3RvX2VudW08IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGU+IDogOjpzdGQ6OnRydWVfdHlwZSB7fTsKK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlPigpIHsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfZGVzY3JpcHRvcigpOworfQordGVtcGxhdGUgPD4gc3RydWN0IGlzX3Byb3RvX2VudW08IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnNfQ1R5cGU+IDogOjpzdGQ6OnRydWVfdHlwZSB7fTsKK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRPcHRpb25zX0NUeXBlPigpIHsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnNfQ1R5cGVfZGVzY3JpcHRvcigpOworfQordGVtcGxhdGUgPD4gc3RydWN0IGlzX3Byb3RvX2VudW08IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE9wdGlvbnNfSlNUeXBlPiA6IDo6c3RkOjp0cnVlX3R5cGUge307Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvcjwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9uc19KU1R5cGU+KCkgeworICByZXR1cm4gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkT3B0aW9uc19KU1R5cGVfZGVzY3JpcHRvcigpOworfQordGVtcGxhdGUgPD4gc3RydWN0IGlzX3Byb3RvX2VudW08IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWw+IDogOjpzdGQ6OnRydWVfdHlwZSB7fTsKK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsPigpIHsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWxfZGVzY3JpcHRvcigpOworfQorCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX0dPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZWIyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8KQEAgLTAsMCArMSw5MjEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGUgbWVzc2FnZXMgaW4gdGhpcyBmaWxlIGRlc2NyaWJlIHRoZSBkZWZpbml0aW9ucyBmb3VuZCBpbiAucHJvdG8gZmlsZXMuCisvLyBBIHZhbGlkIC5wcm90byBmaWxlIGNhbiBiZSB0cmFuc2xhdGVkIGRpcmVjdGx5IHRvIGEgRmlsZURlc2NyaXB0b3JQcm90bworLy8gd2l0aG91dCBhbnkgb3RoZXIgaW5mb3JtYXRpb24gKGUuZy4gd2l0aG91dCByZWFkaW5nIGl0cyBpbXBvcnRzKS4KKworCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBnb29nbGUucHJvdG9idWY7CisKK29wdGlvbiBnb19wYWNrYWdlID0gImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYiI7CitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkRlc2NyaXB0b3JQcm90b3MiOworb3B0aW9uIGNzaGFycF9uYW1lc3BhY2UgPSAiR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24iOworb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gIkdQQiI7CitvcHRpb24gY2NfZW5hYmxlX2FyZW5hcyA9IHRydWU7CisKKy8vIGRlc2NyaXB0b3IucHJvdG8gbXVzdCBiZSBvcHRpbWl6ZWQgZm9yIHNwZWVkIGJlY2F1c2UgcmVmbGVjdGlvbi1iYXNlZAorLy8gYWxnb3JpdGhtcyBkb24ndCB3b3JrIGR1cmluZyBib290c3RyYXBwaW5nLgorb3B0aW9uIG9wdGltaXplX2ZvciA9IFNQRUVEOworCisvLyBUaGUgcHJvdG9jb2wgY29tcGlsZXIgY2FuIG91dHB1dCBhIEZpbGVEZXNjcmlwdG9yU2V0IGNvbnRhaW5pbmcgdGhlIC5wcm90bworLy8gZmlsZXMgaXQgcGFyc2VzLgorbWVzc2FnZSBGaWxlRGVzY3JpcHRvclNldCB7CisgIHJlcGVhdGVkIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZSA9IDE7Cit9CisKKy8vIERlc2NyaWJlcyBhIGNvbXBsZXRlIC5wcm90byBmaWxlLgorbWVzc2FnZSBGaWxlRGVzY3JpcHRvclByb3RvIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOyAgICAgLy8gZmlsZSBuYW1lLCByZWxhdGl2ZSB0byByb290IG9mIHNvdXJjZSB0cmVlCisgIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMjsgIC8vIGUuZy4gImZvbyIsICJmb28uYmFyIiwgZXRjLgorCisgIC8vIE5hbWVzIG9mIGZpbGVzIGltcG9ydGVkIGJ5IHRoaXMgZmlsZS4KKyAgcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOworICAvLyBJbmRleGVzIG9mIHRoZSBwdWJsaWMgaW1wb3J0ZWQgZmlsZXMgaW4gdGhlIGRlcGVuZGVuY3kgbGlzdCBhYm92ZS4KKyAgcmVwZWF0ZWQgaW50MzIgcHVibGljX2RlcGVuZGVuY3kgPSAxMDsKKyAgLy8gSW5kZXhlcyBvZiB0aGUgd2VhayBpbXBvcnRlZCBmaWxlcyBpbiB0aGUgZGVwZW5kZW5jeSBsaXN0LgorICAvLyBGb3IgR29vZ2xlLWludGVybmFsIG1pZ3JhdGlvbiBvbmx5LiBEbyBub3QgdXNlLgorICByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKKworICAvLyBBbGwgdG9wLWxldmVsIGRlZmluaXRpb25zIGluIHRoaXMgZmlsZS4KKyAgcmVwZWF0ZWQgRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7CisgIHJlcGVhdGVkIEVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNTsKKyAgcmVwZWF0ZWQgU2VydmljZURlc2NyaXB0b3JQcm90byBzZXJ2aWNlID0gNjsKKyAgcmVwZWF0ZWQgRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNzsKKworICBvcHRpb25hbCBGaWxlT3B0aW9ucyBvcHRpb25zID0gODsKKworICAvLyBUaGlzIGZpZWxkIGNvbnRhaW5zIG9wdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZS4KKyAgLy8gWW91IG1heSBzYWZlbHkgcmVtb3ZlIHRoaXMgZW50aXJlIGZpZWxkIHdpdGhvdXQgaGFybWluZyBydW50aW1lCisgIC8vIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGRlc2NyaXB0b3JzIC0tIHRoZSBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgb25seSBieQorICAvLyBkZXZlbG9wbWVudCB0b29scy4KKyAgb3B0aW9uYWwgU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7CisKKyAgLy8gVGhlIHN5bnRheCBvZiB0aGUgcHJvdG8gZmlsZS4KKyAgLy8gVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlICJwcm90bzIiIGFuZCAicHJvdG8zIi4KKyAgb3B0aW9uYWwgc3RyaW5nIHN5bnRheCA9IDEyOworfQorCisvLyBEZXNjcmliZXMgYSBtZXNzYWdlIHR5cGUuCittZXNzYWdlIERlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKworICByZXBlYXRlZCBGaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CisgIHJlcGVhdGVkIEZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7CisKKyAgcmVwZWF0ZWQgRGVzY3JpcHRvclByb3RvIG5lc3RlZF90eXBlID0gMzsKKyAgcmVwZWF0ZWQgRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OworCisgIG1lc3NhZ2UgRXh0ZW5zaW9uUmFuZ2UgeworICAgIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsgIC8vIEluY2x1c2l2ZS4KKyAgICBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOyAgICAvLyBFeGNsdXNpdmUuCisKKyAgICBvcHRpb25hbCBFeHRlbnNpb25SYW5nZU9wdGlvbnMgb3B0aW9ucyA9IDM7CisgIH0KKyAgcmVwZWF0ZWQgRXh0ZW5zaW9uUmFuZ2UgZXh0ZW5zaW9uX3JhbmdlID0gNTsKKworICByZXBlYXRlZCBPbmVvZkRlc2NyaXB0b3JQcm90byBvbmVvZl9kZWNsID0gODsKKworICBvcHRpb25hbCBNZXNzYWdlT3B0aW9ucyBvcHRpb25zID0gNzsKKworICAvLyBSYW5nZSBvZiByZXNlcnZlZCB0YWcgbnVtYmVycy4gUmVzZXJ2ZWQgdGFnIG51bWJlcnMgbWF5IG5vdCBiZSB1c2VkIGJ5CisgIC8vIGZpZWxkcyBvciBleHRlbnNpb24gcmFuZ2VzIGluIHRoZSBzYW1lIG1lc3NhZ2UuIFJlc2VydmVkIHJhbmdlcyBtYXkKKyAgLy8gbm90IG92ZXJsYXAuCisgIG1lc3NhZ2UgUmVzZXJ2ZWRSYW5nZSB7CisgICAgb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOyAgLy8gSW5jbHVzaXZlLgorICAgIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7ICAgIC8vIEV4Y2x1c2l2ZS4KKyAgfQorICByZXBlYXRlZCBSZXNlcnZlZFJhbmdlIHJlc2VydmVkX3JhbmdlID0gOTsKKyAgLy8gUmVzZXJ2ZWQgZmllbGQgbmFtZXMsIHdoaWNoIG1heSBub3QgYmUgdXNlZCBieSBmaWVsZHMgaW4gdGhlIHNhbWUgbWVzc2FnZS4KKyAgLy8gQSBnaXZlbiBuYW1lIG1heSBvbmx5IGJlIHJlc2VydmVkIG9uY2UuCisgIHJlcGVhdGVkIHN0cmluZyByZXNlcnZlZF9uYW1lID0gMTA7Cit9CisKK21lc3NhZ2UgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zIHsKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKworICAvLyBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKK30KKworLy8gRGVzY3JpYmVzIGEgZmllbGQgd2l0aGluIGEgbWVzc2FnZS4KK21lc3NhZ2UgRmllbGREZXNjcmlwdG9yUHJvdG8geworICBlbnVtIFR5cGUgeworICAgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycy4KKyAgICAvLyBPcmRlciBpcyB3ZWlyZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLgorICAgIFRZUEVfRE9VQkxFID0gMTsKKyAgICBUWVBFX0ZMT0FUID0gMjsKKyAgICAvLyBOb3QgWmlnWmFnIGVuY29kZWQuICBOZWdhdGl2ZSBudW1iZXJzIHRha2UgMTAgYnl0ZXMuICBVc2UgVFlQRV9TSU5UNjQgaWYKKyAgICAvLyBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGxpa2VseS4KKyAgICBUWVBFX0lOVDY0ID0gMzsKKyAgICBUWVBFX1VJTlQ2NCA9IDQ7CisgICAgLy8gTm90IFppZ1phZyBlbmNvZGVkLiAgTmVnYXRpdmUgbnVtYmVycyB0YWtlIDEwIGJ5dGVzLiAgVXNlIFRZUEVfU0lOVDMyIGlmCisgICAgLy8gbmVnYXRpdmUgdmFsdWVzIGFyZSBsaWtlbHkuCisgICAgVFlQRV9JTlQzMiA9IDU7CisgICAgVFlQRV9GSVhFRDY0ID0gNjsKKyAgICBUWVBFX0ZJWEVEMzIgPSA3OworICAgIFRZUEVfQk9PTCA9IDg7CisgICAgVFlQRV9TVFJJTkcgPSA5OworICAgIC8vIFRhZy1kZWxpbWl0ZWQgYWdncmVnYXRlLgorICAgIC8vIEdyb3VwIHR5cGUgaXMgZGVwcmVjYXRlZCBhbmQgbm90IHN1cHBvcnRlZCBpbiBwcm90bzMuIEhvd2V2ZXIsIFByb3RvMworICAgIC8vIGltcGxlbWVudGF0aW9ucyBzaG91bGQgc3RpbGwgYmUgYWJsZSB0byBwYXJzZSB0aGUgZ3JvdXAgd2lyZSBmb3JtYXQgYW5kCisgICAgLy8gdHJlYXQgZ3JvdXAgZmllbGRzIGFzIHVua25vd24gZmllbGRzLgorICAgIFRZUEVfR1JPVVAgPSAxMDsKKyAgICBUWVBFX01FU1NBR0UgPSAxMTsgIC8vIExlbmd0aC1kZWxpbWl0ZWQgYWdncmVnYXRlLgorCisgICAgLy8gTmV3IGluIHZlcnNpb24gMi4KKyAgICBUWVBFX0JZVEVTID0gMTI7CisgICAgVFlQRV9VSU5UMzIgPSAxMzsKKyAgICBUWVBFX0VOVU0gPSAxNDsKKyAgICBUWVBFX1NGSVhFRDMyID0gMTU7CisgICAgVFlQRV9TRklYRUQ2NCA9IDE2OworICAgIFRZUEVfU0lOVDMyID0gMTc7ICAvLyBVc2VzIFppZ1phZyBlbmNvZGluZy4KKyAgICBUWVBFX1NJTlQ2NCA9IDE4OyAgLy8gVXNlcyBaaWdaYWcgZW5jb2RpbmcuCisgIH0KKworICBlbnVtIExhYmVsIHsKKyAgICAvLyAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMKKyAgICBMQUJFTF9PUFRJT05BTCA9IDE7CisgICAgTEFCRUxfUkVRVUlSRUQgPSAyOworICAgIExBQkVMX1JFUEVBVEVEID0gMzsKKyAgfQorCisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMzsKKyAgb3B0aW9uYWwgTGFiZWwgbGFiZWwgPSA0OworCisgIC8vIElmIHR5cGVfbmFtZSBpcyBzZXQsIHRoaXMgbmVlZCBub3QgYmUgc2V0LiAgSWYgYm90aCB0aGlzIGFuZCB0eXBlX25hbWUKKyAgLy8gYXJlIHNldCwgdGhpcyBtdXN0IGJlIG9uZSBvZiBUWVBFX0VOVU0sIFRZUEVfTUVTU0FHRSBvciBUWVBFX0dST1VQLgorICBvcHRpb25hbCBUeXBlIHR5cGUgPSA1OworCisgIC8vIEZvciBtZXNzYWdlIGFuZCBlbnVtIHR5cGVzLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlLiAgSWYgdGhlIG5hbWUKKyAgLy8gc3RhcnRzIHdpdGggYSAnLicsIGl0IGlzIGZ1bGx5LXF1YWxpZmllZC4gIE90aGVyd2lzZSwgQysrLWxpa2Ugc2NvcGluZworICAvLyBydWxlcyBhcmUgdXNlZCB0byBmaW5kIHRoZSB0eXBlIChpLmUuIGZpcnN0IHRoZSBuZXN0ZWQgdHlwZXMgd2l0aGluIHRoaXMKKyAgLy8gbWVzc2FnZSBhcmUgc2VhcmNoZWQsIHRoZW4gd2l0aGluIHRoZSBwYXJlbnQsIG9uIHVwIHRvIHRoZSByb290CisgIC8vIG5hbWVzcGFjZSkuCisgIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OworCisgIC8vIEZvciBleHRlbnNpb25zLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIGJlaW5nIGV4dGVuZGVkLiAgSXQgaXMKKyAgLy8gcmVzb2x2ZWQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHR5cGVfbmFtZS4KKyAgb3B0aW9uYWwgc3RyaW5nIGV4dGVuZGVlID0gMjsKKworICAvLyBGb3IgbnVtZXJpYyB0eXBlcywgY29udGFpbnMgdGhlIG9yaWdpbmFsIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLgorICAvLyBGb3IgYm9vbGVhbnMsICJ0cnVlIiBvciAiZmFsc2UiLgorICAvLyBGb3Igc3RyaW5ncywgY29udGFpbnMgdGhlIGRlZmF1bHQgdGV4dCBjb250ZW50cyAobm90IGVzY2FwZWQgaW4gYW55IHdheSkuCisgIC8vIEZvciBieXRlcywgY29udGFpbnMgdGhlIEMgZXNjYXBlZCB2YWx1ZS4gIEFsbCBieXRlcyA+PSAxMjggYXJlIGVzY2FwZWQuCisgIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gNzsKKworICAvLyBJZiBzZXQsIGdpdmVzIHRoZSBpbmRleCBvZiBhIG9uZW9mIGluIHRoZSBjb250YWluaW5nIHR5cGUncyBvbmVvZl9kZWNsCisgIC8vIGxpc3QuICBUaGlzIGZpZWxkIGlzIGEgbWVtYmVyIG9mIHRoYXQgb25lb2YuCisgIG9wdGlvbmFsIGludDMyIG9uZW9mX2luZGV4ID0gOTsKKworICAvLyBKU09OIG5hbWUgb2YgdGhpcyBmaWVsZC4gVGhlIHZhbHVlIGlzIHNldCBieSBwcm90b2NvbCBjb21waWxlci4gSWYgdGhlCisgIC8vIHVzZXIgaGFzIHNldCBhICJqc29uX25hbWUiIG9wdGlvbiBvbiB0aGlzIGZpZWxkLCB0aGF0IG9wdGlvbidzIHZhbHVlCisgIC8vIHdpbGwgYmUgdXNlZC4gT3RoZXJ3aXNlLCBpdCdzIGRlZHVjZWQgZnJvbSB0aGUgZmllbGQncyBuYW1lIGJ5IGNvbnZlcnRpbmcKKyAgLy8gaXQgdG8gY2FtZWxDYXNlLgorICBvcHRpb25hbCBzdHJpbmcganNvbl9uYW1lID0gMTA7CisKKyAgb3B0aW9uYWwgRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OworCisgIC8vIElmIHRydWUsIHRoaXMgaXMgYSBwcm90bzMgIm9wdGlvbmFsIi4gV2hlbiBhIHByb3RvMyBmaWVsZCBpcyBvcHRpb25hbCwgaXQKKyAgLy8gdHJhY2tzIHByZXNlbmNlIHJlZ2FyZGxlc3Mgb2YgZmllbGQgdHlwZS4KKyAgLy8KKyAgLy8gV2hlbiBwcm90bzNfb3B0aW9uYWwgaXMgdHJ1ZSwgdGhpcyBmaWVsZCBtdXN0IGJlIGJlbG9uZyB0byBhIG9uZW9mIHRvCisgIC8vIHNpZ25hbCB0byBvbGQgcHJvdG8zIGNsaWVudHMgdGhhdCBwcmVzZW5jZSBpcyB0cmFja2VkIGZvciB0aGlzIGZpZWxkLiBUaGlzCisgIC8vIG9uZW9mIGlzIGtub3duIGFzIGEgInN5bnRoZXRpYyIgb25lb2YsIGFuZCB0aGlzIGZpZWxkIG11c3QgYmUgaXRzIHNvbGUKKyAgLy8gbWVtYmVyIChlYWNoIHByb3RvMyBvcHRpb25hbCBmaWVsZCBnZXRzIGl0cyBvd24gc3ludGhldGljIG9uZW9mKS4gU3ludGhldGljCisgIC8vIG9uZW9mcyBleGlzdCBpbiB0aGUgZGVzY3JpcHRvciBvbmx5LCBhbmQgZG8gbm90IGdlbmVyYXRlIGFueSBBUEkuIFN5bnRoZXRpYworICAvLyBvbmVvZnMgbXVzdCBiZSBvcmRlcmVkIGFmdGVyIGFsbCAicmVhbCIgb25lb2ZzLgorICAvLworICAvLyBGb3IgbWVzc2FnZSBmaWVsZHMsIHByb3RvM19vcHRpb25hbCBkb2Vzbid0IGNyZWF0ZSBhbnkgc2VtYW50aWMgY2hhbmdlLAorICAvLyBzaW5jZSBub24tcmVwZWF0ZWQgbWVzc2FnZSBmaWVsZHMgYWx3YXlzIHRyYWNrIHByZXNlbmNlLiBIb3dldmVyIGl0IHN0aWxsCisgIC8vIGluZGljYXRlcyB0aGUgc2VtYW50aWMgZGV0YWlsIG9mIHdoZXRoZXIgdGhlIHVzZXIgd3JvdGUgIm9wdGlvbmFsIiBvciBub3QuCisgIC8vIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3Igcm91bmQtdHJpcHBpbmcgdGhlIC5wcm90byBmaWxlLiBGb3IgY29uc2lzdGVuY3kgd2UKKyAgLy8gZ2l2ZSBtZXNzYWdlIGZpZWxkcyBhIHN5bnRoZXRpYyBvbmVvZiBhbHNvLCBldmVuIHRob3VnaCBpdCBpcyBub3QgcmVxdWlyZWQKKyAgLy8gdG8gdHJhY2sgcHJlc2VuY2UuIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgYmVjYXVzZSB0aGUgcGFyc2VyIGNhbid0CisgIC8vIHRlbGwgaWYgYSBmaWVsZCBpcyBhIG1lc3NhZ2Ugb3IgYW4gZW51bSwgc28gaXQgbXVzdCBhbHdheXMgY3JlYXRlIGEKKyAgLy8gc3ludGhldGljIG9uZW9mLgorICAvLworICAvLyBQcm90bzIgb3B0aW9uYWwgZmllbGRzIGRvIG5vdCBzZXQgdGhpcyBmbGFnLCBiZWNhdXNlIHRoZXkgYWxyZWFkeSBpbmRpY2F0ZQorICAvLyBvcHRpb25hbCB3aXRoIGBMQUJFTF9PUFRJT05BTGAuCisgIG9wdGlvbmFsIGJvb2wgcHJvdG8zX29wdGlvbmFsID0gMTc7Cit9CisKKy8vIERlc2NyaWJlcyBhIG9uZW9mLgorbWVzc2FnZSBPbmVvZkRlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgb3B0aW9uYWwgT25lb2ZPcHRpb25zIG9wdGlvbnMgPSAyOworfQorCisvLyBEZXNjcmliZXMgYW4gZW51bSB0eXBlLgorbWVzc2FnZSBFbnVtRGVzY3JpcHRvclByb3RvIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworCisgIHJlcGVhdGVkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byB2YWx1ZSA9IDI7CisKKyAgb3B0aW9uYWwgRW51bU9wdGlvbnMgb3B0aW9ucyA9IDM7CisKKyAgLy8gUmFuZ2Ugb2YgcmVzZXJ2ZWQgbnVtZXJpYyB2YWx1ZXMuIFJlc2VydmVkIHZhbHVlcyBtYXkgbm90IGJlIHVzZWQgYnkKKyAgLy8gZW50cmllcyBpbiB0aGUgc2FtZSBlbnVtLiBSZXNlcnZlZCByYW5nZXMgbWF5IG5vdCBvdmVybGFwLgorICAvLworICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBkaXN0aW5jdCBmcm9tIERlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlIGluIHRoYXQgaXQKKyAgLy8gaXMgaW5jbHVzaXZlIHN1Y2ggdGhhdCBpdCBjYW4gYXBwcm9wcmlhdGVseSByZXByZXNlbnQgdGhlIGVudGlyZSBpbnQzMgorICAvLyBkb21haW4uCisgIG1lc3NhZ2UgRW51bVJlc2VydmVkUmFuZ2UgeworICAgIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsgIC8vIEluY2x1c2l2ZS4KKyAgICBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOyAgICAvLyBJbmNsdXNpdmUuCisgIH0KKworICAvLyBSYW5nZSBvZiByZXNlcnZlZCBudW1lcmljIHZhbHVlcy4gUmVzZXJ2ZWQgbnVtZXJpYyB2YWx1ZXMgbWF5IG5vdCBiZSB1c2VkCisgIC8vIGJ5IGVudW0gdmFsdWVzIGluIHRoZSBzYW1lIGVudW0gZGVjbGFyYXRpb24uIFJlc2VydmVkIHJhbmdlcyBtYXkgbm90CisgIC8vIG92ZXJsYXAuCisgIHJlcGVhdGVkIEVudW1SZXNlcnZlZFJhbmdlIHJlc2VydmVkX3JhbmdlID0gNDsKKworICAvLyBSZXNlcnZlZCBlbnVtIHZhbHVlIG5hbWVzLCB3aGljaCBtYXkgbm90IGJlIHJldXNlZC4gQSBnaXZlbiBuYW1lIG1heSBvbmx5CisgIC8vIGJlIHJlc2VydmVkIG9uY2UuCisgIHJlcGVhdGVkIHN0cmluZyByZXNlcnZlZF9uYW1lID0gNTsKK30KKworLy8gRGVzY3JpYmVzIGEgdmFsdWUgd2l0aGluIGFuIGVudW0uCittZXNzYWdlIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMjsKKworICBvcHRpb25hbCBFbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOworfQorCisvLyBEZXNjcmliZXMgYSBzZXJ2aWNlLgorbWVzc2FnZSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICByZXBlYXRlZCBNZXRob2REZXNjcmlwdG9yUHJvdG8gbWV0aG9kID0gMjsKKworICBvcHRpb25hbCBTZXJ2aWNlT3B0aW9ucyBvcHRpb25zID0gMzsKK30KKworLy8gRGVzY3JpYmVzIGEgbWV0aG9kIG9mIGEgc2VydmljZS4KK21lc3NhZ2UgTWV0aG9kRGVzY3JpcHRvclByb3RvIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworCisgIC8vIElucHV0IGFuZCBvdXRwdXQgdHlwZSBuYW1lcy4gIFRoZXNlIGFyZSByZXNvbHZlZCBpbiB0aGUgc2FtZSB3YXkgYXMKKyAgLy8gRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lLCBidXQgbXVzdCByZWZlciB0byBhIG1lc3NhZ2UgdHlwZS4KKyAgb3B0aW9uYWwgc3RyaW5nIGlucHV0X3R5cGUgPSAyOworICBvcHRpb25hbCBzdHJpbmcgb3V0cHV0X3R5cGUgPSAzOworCisgIG9wdGlvbmFsIE1ldGhvZE9wdGlvbnMgb3B0aW9ucyA9IDQ7CisKKyAgLy8gSWRlbnRpZmllcyBpZiBjbGllbnQgc3RyZWFtcyBtdWx0aXBsZSBjbGllbnQgbWVzc2FnZXMKKyAgb3B0aW9uYWwgYm9vbCBjbGllbnRfc3RyZWFtaW5nID0gNSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgLy8gSWRlbnRpZmllcyBpZiBzZXJ2ZXIgc3RyZWFtcyBtdWx0aXBsZSBzZXJ2ZXIgbWVzc2FnZXMKKyAgb3B0aW9uYWwgYm9vbCBzZXJ2ZXJfc3RyZWFtaW5nID0gNiBbZGVmYXVsdCA9IGZhbHNlXTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBPcHRpb25zCisKKy8vIEVhY2ggb2YgdGhlIGRlZmluaXRpb25zIGFib3ZlIG1heSBoYXZlICJvcHRpb25zIiBhdHRhY2hlZC4gIFRoZXNlIGFyZQorLy8ganVzdCBhbm5vdGF0aW9ucyB3aGljaCBtYXkgY2F1c2UgY29kZSB0byBiZSBnZW5lcmF0ZWQgc2xpZ2h0bHkgZGlmZmVyZW50bHkKKy8vIG9yIG1heSBjb250YWluIGhpbnRzIGZvciBjb2RlIHRoYXQgbWFuaXB1bGF0ZXMgcHJvdG9jb2wgbWVzc2FnZXMuCisvLworLy8gQ2xpZW50cyBtYXkgZGVmaW5lIGN1c3RvbSBvcHRpb25zIGFzIGV4dGVuc2lvbnMgb2YgdGhlICpPcHRpb25zIG1lc3NhZ2VzLgorLy8gVGhlc2UgZXh0ZW5zaW9ucyBtYXkgbm90IHlldCBiZSBrbm93biBhdCBwYXJzaW5nIHRpbWUsIHNvIHRoZSBwYXJzZXIgY2Fubm90CisvLyBzdG9yZSB0aGUgdmFsdWVzIGluIHRoZW0uICBJbnN0ZWFkIGl0IHN0b3JlcyB0aGVtIGluIGEgZmllbGQgaW4gdGhlICpPcHRpb25zCisvLyBtZXNzYWdlIGNhbGxlZCB1bmludGVycHJldGVkX29wdGlvbi4gVGhpcyBmaWVsZCBtdXN0IGhhdmUgdGhlIHNhbWUgbmFtZQorLy8gYWNyb3NzIGFsbCAqT3B0aW9ucyBtZXNzYWdlcy4gV2UgdGhlbiB1c2UgdGhpcyBmaWVsZCB0byBwb3B1bGF0ZSB0aGUKKy8vIGV4dGVuc2lvbnMgd2hlbiB3ZSBidWlsZCBhIGRlc2NyaXB0b3IsIGF0IHdoaWNoIHBvaW50IGFsbCBwcm90b3MgaGF2ZSBiZWVuCisvLyBwYXJzZWQgYW5kIHNvIGFsbCBleHRlbnNpb25zIGFyZSBrbm93bi4KKy8vCisvLyBFeHRlbnNpb24gbnVtYmVycyBmb3IgY3VzdG9tIG9wdGlvbnMgbWF5IGJlIGNob3NlbiBhcyBmb2xsb3dzOgorLy8gKiBGb3Igb3B0aW9ucyB3aGljaCB3aWxsIG9ubHkgYmUgdXNlZCB3aXRoaW4gYSBzaW5nbGUgYXBwbGljYXRpb24gb3IKKy8vICAgb3JnYW5pemF0aW9uLCBvciBmb3IgZXhwZXJpbWVudGFsIG9wdGlvbnMsIHVzZSBmaWVsZCBudW1iZXJzIDUwMDAwCisvLyAgIHRocm91Z2ggOTk5OTkuICBJdCBpcyB1cCB0byB5b3UgdG8gZW5zdXJlIHRoYXQgeW91IGRvIG5vdCB1c2UgdGhlCisvLyAgIHNhbWUgbnVtYmVyIGZvciBtdWx0aXBsZSBvcHRpb25zLgorLy8gKiBGb3Igb3B0aW9ucyB3aGljaCB3aWxsIGJlIHB1Ymxpc2hlZCBhbmQgdXNlZCBwdWJsaWNseSBieSBtdWx0aXBsZQorLy8gICBpbmRlcGVuZGVudCBlbnRpdGllcywgZS1tYWlsIHByb3RvYnVmLWdsb2JhbC1leHRlbnNpb24tcmVnaXN0cnlAZ29vZ2xlLmNvbQorLy8gICB0byByZXNlcnZlIGV4dGVuc2lvbiBudW1iZXJzLiBTaW1wbHkgcHJvdmlkZSB5b3VyIHByb2plY3QgbmFtZSAoZS5nLgorLy8gICBPYmplY3RpdmUtQyBwbHVnaW4pIGFuZCB5b3VyIHByb2plY3Qgd2Vic2l0ZSAoaWYgYXZhaWxhYmxlKSAtLSB0aGVyZSdzIG5vCisvLyAgIG5lZWQgdG8gZXhwbGFpbiBob3cgeW91IGludGVuZCB0byB1c2UgdGhlbS4gVXN1YWxseSB5b3Ugb25seSBuZWVkIG9uZQorLy8gICBleHRlbnNpb24gbnVtYmVyLiBZb3UgY2FuIGRlY2xhcmUgbXVsdGlwbGUgb3B0aW9ucyB3aXRoIG9ubHkgb25lIGV4dGVuc2lvbgorLy8gICBudW1iZXIgYnkgcHV0dGluZyB0aGVtIGluIGEgc3ViLW1lc3NhZ2UuIFNlZSB0aGUgQ3VzdG9tIE9wdGlvbnMgc2VjdGlvbiBvZgorLy8gICB0aGUgZG9jcyBmb3IgZXhhbXBsZXM6CisvLyAgIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90byNvcHRpb25zCisvLyAgIElmIHRoaXMgdHVybnMgb3V0IHRvIGJlIHBvcHVsYXIsIGEgd2ViIHNlcnZpY2Ugd2lsbCBiZSBzZXQgdXAKKy8vICAgdG8gYXV0b21hdGljYWxseSBhc3NpZ24gb3B0aW9uIG51bWJlcnMuCisKK21lc3NhZ2UgRmlsZU9wdGlvbnMgeworCisgIC8vIFNldHMgdGhlIEphdmEgcGFja2FnZSB3aGVyZSBjbGFzc2VzIGdlbmVyYXRlZCBmcm9tIHRoaXMgLnByb3RvIHdpbGwgYmUKKyAgLy8gcGxhY2VkLiAgQnkgZGVmYXVsdCwgdGhlIHByb3RvIHBhY2thZ2UgaXMgdXNlZCwgYnV0IHRoaXMgaXMgb2Z0ZW4KKyAgLy8gaW5hcHByb3ByaWF0ZSBiZWNhdXNlIHByb3RvIHBhY2thZ2VzIGRvIG5vdCBub3JtYWxseSBzdGFydCB3aXRoIGJhY2t3YXJkcworICAvLyBkb21haW4gbmFtZXMuCisgIG9wdGlvbmFsIHN0cmluZyBqYXZhX3BhY2thZ2UgPSAxOworCisKKyAgLy8gQ29udHJvbHMgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgSmF2YSBjbGFzcyBnZW5lcmF0ZWQgZm9yIHRoZSAucHJvdG8gZmlsZS4KKyAgLy8gVGhhdCBjbGFzcyB3aWxsIGFsd2F5cyBjb250YWluIHRoZSAucHJvdG8gZmlsZSdzIGdldERlc2NyaXB0b3IoKSBtZXRob2QgYXMKKyAgLy8gd2VsbCBhcyBhbnkgdG9wLWxldmVsIGV4dGVuc2lvbnMgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIC8vIElmIGphdmFfbXVsdGlwbGVfZmlsZXMgaXMgZGlzYWJsZWQsIHRoZW4gYWxsIHRoZSBvdGhlciBjbGFzc2VzIGZyb20gdGhlCisgIC8vIC5wcm90byBmaWxlIHdpbGwgYmUgbmVzdGVkIGluc2lkZSB0aGUgc2luZ2xlIHdyYXBwZXIgb3V0ZXIgY2xhc3MuCisgIG9wdGlvbmFsIHN0cmluZyBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDg7CisKKyAgLy8gSWYgZW5hYmxlZCwgdGhlbiB0aGUgSmF2YSBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGEgc2VwYXJhdGUgLmphdmEKKyAgLy8gZmlsZSBmb3IgZWFjaCB0b3AtbGV2ZWwgbWVzc2FnZSwgZW51bSwgYW5kIHNlcnZpY2UgZGVmaW5lZCBpbiB0aGUgLnByb3RvCisgIC8vIGZpbGUuICBUaHVzLCB0aGVzZSB0eXBlcyB3aWxsICpub3QqIGJlIG5lc3RlZCBpbnNpZGUgdGhlIHdyYXBwZXIgY2xhc3MKKyAgLy8gbmFtZWQgYnkgamF2YV9vdXRlcl9jbGFzc25hbWUuICBIb3dldmVyLCB0aGUgd3JhcHBlciBjbGFzcyB3aWxsIHN0aWxsIGJlCisgIC8vIGdlbmVyYXRlZCB0byBjb250YWluIHRoZSBmaWxlJ3MgZ2V0RGVzY3JpcHRvcigpIG1ldGhvZCBhcyB3ZWxsIGFzIGFueQorICAvLyB0b3AtbGV2ZWwgZXh0ZW5zaW9ucyBkZWZpbmVkIGluIHRoZSBmaWxlLgorICBvcHRpb25hbCBib29sIGphdmFfbXVsdGlwbGVfZmlsZXMgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKworICAvLyBUaGlzIG9wdGlvbiBkb2VzIG5vdGhpbmcuCisgIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggPSAyMCBbZGVwcmVjYXRlZD10cnVlXTsKKworICAvLyBJZiBzZXQgdHJ1ZSwgdGhlbiB0aGUgSmF2YTIgY29kZSBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZSBjb2RlIHRoYXQKKyAgLy8gdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuZXZlciBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYXNzaWduIGEgbm9uLVVURi04CisgIC8vIGJ5dGUgc2VxdWVuY2UgdG8gYSBzdHJpbmcgZmllbGQuCisgIC8vIE1lc3NhZ2UgcmVmbGVjdGlvbiB3aWxsIGRvIHRoZSBzYW1lLgorICAvLyBIb3dldmVyLCBhbiBleHRlbnNpb24gZmllbGQgc3RpbGwgYWNjZXB0cyBub24tVVRGLTggYnl0ZSBzZXF1ZW5jZXMuCisgIC8vIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gd2hlbiB1c2VkIHdpdGggdGhlIGxpdGUgcnVudGltZS4KKyAgb3B0aW9uYWwgYm9vbCBqYXZhX3N0cmluZ19jaGVja191dGY4ID0gMjcgW2RlZmF1bHQgPSBmYWxzZV07CisKKworICAvLyBHZW5lcmF0ZWQgY2xhc3NlcyBjYW4gYmUgb3B0aW1pemVkIGZvciBzcGVlZCBvciBjb2RlIHNpemUuCisgIGVudW0gT3B0aW1pemVNb2RlIHsKKyAgICBTUEVFRCA9IDE7ICAgICAgICAgLy8gR2VuZXJhdGUgY29tcGxldGUgY29kZSBmb3IgcGFyc2luZywgc2VyaWFsaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXRjLgorICAgIENPREVfU0laRSA9IDI7ICAgICAvLyBVc2UgUmVmbGVjdGlvbk9wcyB0byBpbXBsZW1lbnQgdGhlc2UgbWV0aG9kcy4KKyAgICBMSVRFX1JVTlRJTUUgPSAzOyAgLy8gR2VuZXJhdGUgY29kZSB1c2luZyBNZXNzYWdlTGl0ZSBhbmQgdGhlIGxpdGUgcnVudGltZS4KKyAgfQorICBvcHRpb25hbCBPcHRpbWl6ZU1vZGUgb3B0aW1pemVfZm9yID0gOSBbZGVmYXVsdCA9IFNQRUVEXTsKKworICAvLyBTZXRzIHRoZSBHbyBwYWNrYWdlIHdoZXJlIHN0cnVjdHMgZ2VuZXJhdGVkIGZyb20gdGhpcyAucHJvdG8gd2lsbCBiZQorICAvLyBwbGFjZWQuIElmIG9taXR0ZWQsIHRoZSBHbyBwYWNrYWdlIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZSBmb2xsb3dpbmc6CisgIC8vICAgLSBUaGUgYmFzZW5hbWUgb2YgdGhlIHBhY2thZ2UgaW1wb3J0IHBhdGgsIGlmIHByb3ZpZGVkLgorICAvLyAgIC0gT3RoZXJ3aXNlLCB0aGUgcGFja2FnZSBzdGF0ZW1lbnQgaW4gdGhlIC5wcm90byBmaWxlLCBpZiBwcmVzZW50LgorICAvLyAgIC0gT3RoZXJ3aXNlLCB0aGUgYmFzZW5hbWUgb2YgdGhlIC5wcm90byBmaWxlLCB3aXRob3V0IGV4dGVuc2lvbi4KKyAgb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKKworCisKKworICAvLyBTaG91bGQgZ2VuZXJpYyBzZXJ2aWNlcyBiZSBnZW5lcmF0ZWQgaW4gZWFjaCBsYW5ndWFnZT8gICJHZW5lcmljIiBzZXJ2aWNlcworICAvLyBhcmUgbm90IHNwZWNpZmljIHRvIGFueSBwYXJ0aWN1bGFyIFJQQyBzeXN0ZW0uICBUaGV5IGFyZSBnZW5lcmF0ZWQgYnkgdGhlCisgIC8vIG1haW4gY29kZSBnZW5lcmF0b3JzIGluIGVhY2ggbGFuZ3VhZ2UgKHdpdGhvdXQgYWRkaXRpb25hbCBwbHVnaW5zKS4KKyAgLy8gR2VuZXJpYyBzZXJ2aWNlcyB3ZXJlIHRoZSBvbmx5IGtpbmQgb2Ygc2VydmljZSBnZW5lcmF0aW9uIHN1cHBvcnRlZCBieQorICAvLyBlYXJseSB2ZXJzaW9ucyBvZiBnb29nbGUucHJvdG9idWYuCisgIC8vCisgIC8vIEdlbmVyaWMgc2VydmljZXMgYXJlIG5vdyBjb25zaWRlcmVkIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdXNpbmcgcGx1Z2lucworICAvLyB0aGF0IGdlbmVyYXRlIGNvZGUgc3BlY2lmaWMgdG8geW91ciBwYXJ0aWN1bGFyIFJQQyBzeXN0ZW0uICBUaGVyZWZvcmUsCisgIC8vIHRoZXNlIGRlZmF1bHQgdG8gZmFsc2UuICBPbGQgY29kZSB3aGljaCBkZXBlbmRzIG9uIGdlbmVyaWMgc2VydmljZXMgc2hvdWxkCisgIC8vIGV4cGxpY2l0bHkgc2V0IHRoZW0gdG8gdHJ1ZS4KKyAgb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07CisgIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzID0gMTcgW2RlZmF1bHQgPSBmYWxzZV07CisgIG9wdGlvbmFsIGJvb2wgcHlfZ2VuZXJpY19zZXJ2aWNlcyA9IDE4IFtkZWZhdWx0ID0gZmFsc2VdOworICBvcHRpb25hbCBib29sIHBocF9nZW5lcmljX3NlcnZpY2VzID0gNDIgW2RlZmF1bHQgPSBmYWxzZV07CisKKyAgLy8gSXMgdGhpcyBmaWxlIGRlcHJlY2F0ZWQ/CisgIC8vIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKKyAgLy8gZm9yIGV2ZXJ5dGhpbmcgaW4gdGhlIGZpbGUsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeQorICAvLyBsZWFzdCwgdGhpcyBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIGZpbGVzLgorICBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAyMyBbZGVmYXVsdCA9IGZhbHNlXTsKKworICAvLyBFbmFibGVzIHRoZSB1c2Ugb2YgYXJlbmFzIGZvciB0aGUgcHJvdG8gbWVzc2FnZXMgaW4gdGhpcyBmaWxlLiBUaGlzIGFwcGxpZXMKKyAgLy8gb25seSB0byBnZW5lcmF0ZWQgY2xhc3NlcyBmb3IgQysrLgorICBvcHRpb25hbCBib29sIGNjX2VuYWJsZV9hcmVuYXMgPSAzMSBbZGVmYXVsdCA9IHRydWVdOworCisKKyAgLy8gU2V0cyB0aGUgb2JqZWN0aXZlIGMgY2xhc3MgcHJlZml4IHdoaWNoIGlzIHByZXBlbmRlZCB0byBhbGwgb2JqZWN0aXZlIGMKKyAgLy8gZ2VuZXJhdGVkIGNsYXNzZXMgZnJvbSB0aGlzIC5wcm90by4gVGhlcmUgaXMgbm8gZGVmYXVsdC4KKyAgb3B0aW9uYWwgc3RyaW5nIG9iamNfY2xhc3NfcHJlZml4ID0gMzY7CisKKyAgLy8gTmFtZXNwYWNlIGZvciBnZW5lcmF0ZWQgY2xhc3NlczsgZGVmYXVsdHMgdG8gdGhlIHBhY2thZ2UuCisgIG9wdGlvbmFsIHN0cmluZyBjc2hhcnBfbmFtZXNwYWNlID0gMzc7CisKKyAgLy8gQnkgZGVmYXVsdCBTd2lmdCBnZW5lcmF0b3JzIHdpbGwgdGFrZSB0aGUgcHJvdG8gcGFja2FnZSBhbmQgQ2FtZWxDYXNlIGl0CisgIC8vIHJlcGxhY2luZyAnLicgd2l0aCB1bmRlcnNjb3JlIGFuZCB1c2UgdGhhdCB0byBwcmVmaXggdGhlIHR5cGVzL3N5bWJvbHMKKyAgLy8gZGVmaW5lZC4gV2hlbiB0aGlzIG9wdGlvbnMgaXMgcHJvdmlkZWQsIHRoZXkgd2lsbCB1c2UgdGhpcyB2YWx1ZSBpbnN0ZWFkCisgIC8vIHRvIHByZWZpeCB0aGUgdHlwZXMvc3ltYm9scyBkZWZpbmVkLgorICBvcHRpb25hbCBzdHJpbmcgc3dpZnRfcHJlZml4ID0gMzk7CisKKyAgLy8gU2V0cyB0aGUgcGhwIGNsYXNzIHByZWZpeCB3aGljaCBpcyBwcmVwZW5kZWQgdG8gYWxsIHBocCBnZW5lcmF0ZWQgY2xhc3NlcworICAvLyBmcm9tIHRoaXMgLnByb3RvLiBEZWZhdWx0IGlzIGVtcHR5LgorICBvcHRpb25hbCBzdHJpbmcgcGhwX2NsYXNzX3ByZWZpeCA9IDQwOworCisgIC8vIFVzZSB0aGlzIG9wdGlvbiB0byBjaGFuZ2UgdGhlIG5hbWVzcGFjZSBvZiBwaHAgZ2VuZXJhdGVkIGNsYXNzZXMuIERlZmF1bHQKKyAgLy8gaXMgZW1wdHkuIFdoZW4gdGhpcyBvcHRpb24gaXMgZW1wdHksIHRoZSBwYWNrYWdlIG5hbWUgd2lsbCBiZSB1c2VkIGZvcgorICAvLyBkZXRlcm1pbmluZyB0aGUgbmFtZXNwYWNlLgorICBvcHRpb25hbCBzdHJpbmcgcGhwX25hbWVzcGFjZSA9IDQxOworCisgIC8vIFVzZSB0aGlzIG9wdGlvbiB0byBjaGFuZ2UgdGhlIG5hbWVzcGFjZSBvZiBwaHAgZ2VuZXJhdGVkIG1ldGFkYXRhIGNsYXNzZXMuCisgIC8vIERlZmF1bHQgaXMgZW1wdHkuIFdoZW4gdGhpcyBvcHRpb24gaXMgZW1wdHksIHRoZSBwcm90byBmaWxlIG5hbWUgd2lsbCBiZQorICAvLyB1c2VkIGZvciBkZXRlcm1pbmluZyB0aGUgbmFtZXNwYWNlLgorICBvcHRpb25hbCBzdHJpbmcgcGhwX21ldGFkYXRhX25hbWVzcGFjZSA9IDQ0OworCisgIC8vIFVzZSB0aGlzIG9wdGlvbiB0byBjaGFuZ2UgdGhlIHBhY2thZ2Ugb2YgcnVieSBnZW5lcmF0ZWQgY2xhc3Nlcy4gRGVmYXVsdAorICAvLyBpcyBlbXB0eS4gV2hlbiB0aGlzIG9wdGlvbiBpcyBub3Qgc2V0LCB0aGUgcGFja2FnZSBuYW1lIHdpbGwgYmUgdXNlZCBmb3IKKyAgLy8gZGV0ZXJtaW5pbmcgdGhlIHJ1YnkgcGFja2FnZS4KKyAgb3B0aW9uYWwgc3RyaW5nIHJ1YnlfcGFja2FnZSA9IDQ1OworCisKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLgorICAvLyBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSAiT3B0aW9ucyIgc2VjdGlvbiBhYm92ZS4KKyAgcmVwZWF0ZWQgVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKworICAvLyBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuCisgIC8vIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJPcHRpb25zIiBzZWN0aW9uIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworCisgIHJlc2VydmVkIDM4OworfQorCittZXNzYWdlIE1lc3NhZ2VPcHRpb25zIHsKKyAgLy8gU2V0IHRydWUgdG8gdXNlIHRoZSBvbGQgcHJvdG8xIE1lc3NhZ2VTZXQgd2lyZSBmb3JtYXQgZm9yIGV4dGVuc2lvbnMuCisgIC8vIFRoaXMgaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggdGhlIE1lc3NhZ2VTZXQgd2lyZQorICAvLyBmb3JtYXQuICBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBmb3IgYW55IG90aGVyIHJlYXNvbjogIEl0J3MgbGVzcworICAvLyBlZmZpY2llbnQsIGhhcyBmZXdlciBmZWF0dXJlcywgYW5kIGlzIG1vcmUgY29tcGxpY2F0ZWQuCisgIC8vCisgIC8vIFRoZSBtZXNzYWdlIG11c3QgYmUgZGVmaW5lZCBleGFjdGx5IGFzIGZvbGxvd3M6CisgIC8vICAgbWVzc2FnZSBGb28geworICAvLyAgICAgb3B0aW9uIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gdHJ1ZTsKKyAgLy8gICAgIGV4dGVuc2lvbnMgNCB0byBtYXg7CisgIC8vICAgfQorICAvLyBOb3RlIHRoYXQgdGhlIG1lc3NhZ2UgY2Fubm90IGhhdmUgYW55IGRlZmluZWQgZmllbGRzOyBNZXNzYWdlU2V0cyBvbmx5CisgIC8vIGhhdmUgZXh0ZW5zaW9ucy4KKyAgLy8KKyAgLy8gQWxsIGV4dGVuc2lvbnMgb2YgeW91ciB0eXBlIG11c3QgYmUgc2luZ3VsYXIgbWVzc2FnZXM7IGUuZy4gdGhleSBjYW5ub3QKKyAgLy8gYmUgaW50MzJzLCBlbnVtcywgb3IgcmVwZWF0ZWQgbWVzc2FnZXMuCisgIC8vCisgIC8vIEJlY2F1c2UgdGhpcyBpcyBhbiBvcHRpb24sIHRoZSBhYm92ZSB0d28gcmVzdHJpY3Rpb25zIGFyZSBub3QgZW5mb3JjZWQgYnkKKyAgLy8gdGhlIHByb3RvY29sIGNvbXBpbGVyLgorICBvcHRpb25hbCBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKKworICAvLyBEaXNhYmxlcyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgc3RhbmRhcmQgImRlc2NyaXB0b3IoKSIgYWNjZXNzb3IsIHdoaWNoIGNhbgorICAvLyBjb25mbGljdCB3aXRoIGEgZmllbGQgb2YgdGhlIHNhbWUgbmFtZS4gIFRoaXMgaXMgbWVhbnQgdG8gbWFrZSBtaWdyYXRpb24KKyAgLy8gZnJvbSBwcm90bzEgZWFzaWVyOyBuZXcgY29kZSBzaG91bGQgYXZvaWQgZmllbGRzIG5hbWVkICJkZXNjcmlwdG9yIi4KKyAgb3B0aW9uYWwgYm9vbCBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKKworICAvLyBJcyB0aGlzIG1lc3NhZ2UgZGVwcmVjYXRlZD8KKyAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucworICAvLyBmb3IgdGhlIG1lc3NhZ2UsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwKKyAgLy8gdGhpcyBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIG1lc3NhZ2VzLgorICBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworCisgIHJlc2VydmVkIDQsIDUsIDY7CisKKyAgLy8gV2hldGhlciB0aGUgbWVzc2FnZSBpcyBhbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYXAgZW50cnkgdHlwZSBmb3IgdGhlCisgIC8vIG1hcHMgZmllbGQuCisgIC8vCisgIC8vIEZvciBtYXBzIGZpZWxkczoKKyAgLy8gICAgIG1hcDxLZXlUeXBlLCBWYWx1ZVR5cGU+IG1hcF9maWVsZCA9IDE7CisgIC8vIFRoZSBwYXJzZWQgZGVzY3JpcHRvciBsb29rcyBsaWtlOgorICAvLyAgICAgbWVzc2FnZSBNYXBGaWVsZEVudHJ5IHsKKyAgLy8gICAgICAgICBvcHRpb24gbWFwX2VudHJ5ID0gdHJ1ZTsKKyAgLy8gICAgICAgICBvcHRpb25hbCBLZXlUeXBlIGtleSA9IDE7CisgIC8vICAgICAgICAgb3B0aW9uYWwgVmFsdWVUeXBlIHZhbHVlID0gMjsKKyAgLy8gICAgIH0KKyAgLy8gICAgIHJlcGVhdGVkIE1hcEZpZWxkRW50cnkgbWFwX2ZpZWxkID0gMTsKKyAgLy8KKyAgLy8gSW1wbGVtZW50YXRpb25zIG1heSBjaG9vc2Ugbm90IHRvIGdlbmVyYXRlIHRoZSBtYXBfZW50cnk9dHJ1ZSBtZXNzYWdlLCBidXQKKyAgLy8gdXNlIGEgbmF0aXZlIG1hcCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlIHRvIGhvbGQgdGhlIGtleXMgYW5kIHZhbHVlcy4KKyAgLy8gVGhlIHJlZmxlY3Rpb24gQVBJcyBpbiBzdWNoIGltcGxlbWVudGF0aW9ucyBzdGlsbCBuZWVkIHRvIHdvcmsgYXMKKyAgLy8gaWYgdGhlIGZpZWxkIGlzIGEgcmVwZWF0ZWQgbWVzc2FnZSBmaWVsZC4KKyAgLy8KKyAgLy8gTk9URTogRG8gbm90IHNldCB0aGUgb3B0aW9uIGluIC5wcm90byBmaWxlcy4gQWx3YXlzIHVzZSB0aGUgbWFwcyBzeW50YXgKKyAgLy8gaW5zdGVhZC4gVGhlIG9wdGlvbiBzaG91bGQgb25seSBiZSBpbXBsaWNpdGx5IHNldCBieSB0aGUgcHJvdG8gY29tcGlsZXIKKyAgLy8gcGFyc2VyLgorICBvcHRpb25hbCBib29sIG1hcF9lbnRyeSA9IDc7CisKKyAgcmVzZXJ2ZWQgODsgIC8vIGphdmFsaXRlX3NlcmlhbGl6YWJsZQorICByZXNlcnZlZCA5OyAgLy8gamF2YW5hbm9fYXNfbGl0ZQorCisKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgRmllbGRPcHRpb25zIHsKKyAgLy8gVGhlIGN0eXBlIG9wdGlvbiBpbnN0cnVjdHMgdGhlIEMrKyBjb2RlIGdlbmVyYXRvciB0byB1c2UgYSBkaWZmZXJlbnQKKyAgLy8gcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpZWxkIHRoYW4gaXQgbm9ybWFsbHkgd291bGQuICBTZWUgdGhlIHNwZWNpZmljCisgIC8vIG9wdGlvbnMgYmVsb3cuICBUaGlzIG9wdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIHRoZSBvcGVuIHNvdXJjZQorICAvLyByZWxlYXNlIC0tIHNvcnJ5LCB3ZSdsbCB0cnkgdG8gaW5jbHVkZSBpdCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIQorICBvcHRpb25hbCBDVHlwZSBjdHlwZSA9IDEgW2RlZmF1bHQgPSBTVFJJTkddOworICBlbnVtIENUeXBlIHsKKyAgICAvLyBEZWZhdWx0IG1vZGUuCisgICAgU1RSSU5HID0gMDsKKworICAgIENPUkQgPSAxOworCisgICAgU1RSSU5HX1BJRUNFID0gMjsKKyAgfQorICAvLyBUaGUgcGFja2VkIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCBmb3IgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkcyB0byBlbmFibGUKKyAgLy8gYSBtb3JlIGVmZmljaWVudCByZXByZXNlbnRhdGlvbiBvbiB0aGUgd2lyZS4gUmF0aGVyIHRoYW4gcmVwZWF0ZWRseQorICAvLyB3cml0aW5nIHRoZSB0YWcgYW5kIHR5cGUgZm9yIGVhY2ggZWxlbWVudCwgdGhlIGVudGlyZSBhcnJheSBpcyBlbmNvZGVkIGFzCisgIC8vIGEgc2luZ2xlIGxlbmd0aC1kZWxpbWl0ZWQgYmxvYi4gSW4gcHJvdG8zLCBvbmx5IGV4cGxpY2l0IHNldHRpbmcgaXQgdG8KKyAgLy8gZmFsc2Ugd2lsbCBhdm9pZCB1c2luZyBwYWNrZWQgZW5jb2RpbmcuCisgIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKKworICAvLyBUaGUganN0eXBlIG9wdGlvbiBkZXRlcm1pbmVzIHRoZSBKYXZhU2NyaXB0IHR5cGUgdXNlZCBmb3IgdmFsdWVzIG9mIHRoZQorICAvLyBmaWVsZC4gIFRoZSBvcHRpb24gaXMgcGVybWl0dGVkIG9ubHkgZm9yIDY0IGJpdCBpbnRlZ3JhbCBhbmQgZml4ZWQgdHlwZXMKKyAgLy8gKGludDY0LCB1aW50NjQsIHNpbnQ2NCwgZml4ZWQ2NCwgc2ZpeGVkNjQpLiAgQSBmaWVsZCB3aXRoIGpzdHlwZSBKU19TVFJJTkcKKyAgLy8gaXMgcmVwcmVzZW50ZWQgYXMgSmF2YVNjcmlwdCBzdHJpbmcsIHdoaWNoIGF2b2lkcyBsb3NzIG9mIHByZWNpc2lvbiB0aGF0CisgIC8vIGNhbiBoYXBwZW4gd2hlbiBhIGxhcmdlIHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIGZsb2F0aW5nIHBvaW50IEphdmFTY3JpcHQuCisgIC8vIFNwZWNpZnlpbmcgSlNfTlVNQkVSIGZvciB0aGUganN0eXBlIGNhdXNlcyB0aGUgZ2VuZXJhdGVkIEphdmFTY3JpcHQgY29kZSB0bworICAvLyB1c2UgdGhlIEphdmFTY3JpcHQgIm51bWJlciIgdHlwZS4gIFRoZSBiZWhhdmlvciBvZiB0aGUgZGVmYXVsdCBvcHRpb24KKyAgLy8gSlNfTk9STUFMIGlzIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudC4KKyAgLy8KKyAgLy8gVGhpcyBvcHRpb24gaXMgYW4gZW51bSB0byBwZXJtaXQgYWRkaXRpb25hbCB0eXBlcyB0byBiZSBhZGRlZCwgZS5nLgorICAvLyBnb29nLm1hdGguSW50ZWdlci4KKyAgb3B0aW9uYWwgSlNUeXBlIGpzdHlwZSA9IDYgW2RlZmF1bHQgPSBKU19OT1JNQUxdOworICBlbnVtIEpTVHlwZSB7CisgICAgLy8gVXNlIHRoZSBkZWZhdWx0IHR5cGUuCisgICAgSlNfTk9STUFMID0gMDsKKworICAgIC8vIFVzZSBKYXZhU2NyaXB0IHN0cmluZ3MuCisgICAgSlNfU1RSSU5HID0gMTsKKworICAgIC8vIFVzZSBKYXZhU2NyaXB0IG51bWJlcnMuCisgICAgSlNfTlVNQkVSID0gMjsKKyAgfQorCisgIC8vIFNob3VsZCB0aGlzIGZpZWxkIGJlIHBhcnNlZCBsYXppbHk/ICBMYXp5IGFwcGxpZXMgb25seSB0byBtZXNzYWdlLXR5cGUKKyAgLy8gZmllbGRzLiAgSXQgbWVhbnMgdGhhdCB3aGVuIHRoZSBvdXRlciBtZXNzYWdlIGlzIGluaXRpYWxseSBwYXJzZWQsIHRoZQorICAvLyBpbm5lciBtZXNzYWdlJ3MgY29udGVudHMgd2lsbCBub3QgYmUgcGFyc2VkIGJ1dCBpbnN0ZWFkIHN0b3JlZCBpbiBlbmNvZGVkCisgIC8vIGZvcm0uICBUaGUgaW5uZXIgbWVzc2FnZSB3aWxsIGFjdHVhbGx5IGJlIHBhcnNlZCB3aGVuIGl0IGlzIGZpcnN0IGFjY2Vzc2VkLgorICAvLworICAvLyBUaGlzIGlzIG9ubHkgYSBoaW50LiAgSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIGNob29zZSB3aGV0aGVyIHRvIHVzZQorICAvLyBlYWdlciBvciBsYXp5IHBhcnNpbmcgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhpcyBvcHRpb24uICBIb3dldmVyLAorICAvLyBzZXR0aW5nIHRoaXMgb3B0aW9uIHRydWUgc3VnZ2VzdHMgdGhhdCB0aGUgcHJvdG9jb2wgYXV0aG9yIGJlbGlldmVzIHRoYXQKKyAgLy8gdXNpbmcgbGF6eSBwYXJzaW5nIG9uIHRoaXMgZmllbGQgaXMgd29ydGggdGhlIGFkZGl0aW9uYWwgYm9va2tlZXBpbmcKKyAgLy8gb3ZlcmhlYWQgdHlwaWNhbGx5IG5lZWRlZCB0byBpbXBsZW1lbnQgaXQuCisgIC8vCisgIC8vIFRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgcHVibGljIGludGVyZmFjZSBvZiBhbnkgZ2VuZXJhdGVkIGNvZGU7CisgIC8vIGFsbCBtZXRob2Qgc2lnbmF0dXJlcyByZW1haW4gdGhlIHNhbWUuICBGdXJ0aGVybW9yZSwgdGhyZWFkLXNhZmV0eSBvZiB0aGUKKyAgLy8gaW50ZXJmYWNlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGlzIG9wdGlvbjsgY29uc3QgbWV0aG9kcyByZW1haW4gc2FmZSB0bworICAvLyBjYWxsIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBjb25jdXJyZW50bHksIHdoaWxlIG5vbi1jb25zdCBtZXRob2RzIGNvbnRpbnVlCisgIC8vIHRvIHJlcXVpcmUgZXhjbHVzaXZlIGFjY2Vzcy4KKyAgLy8KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IGltcGxlbWVudGF0aW9ucyBtYXkgY2hvb3NlIG5vdCB0byBjaGVjayByZXF1aXJlZCBmaWVsZHMgd2l0aGluCisgIC8vIGEgbGF6eSBzdWItbWVzc2FnZS4gIFRoYXQgaXMsIGNhbGxpbmcgSXNJbml0aWFsaXplZCgpIG9uIHRoZSBvdXRlciBtZXNzYWdlCisgIC8vIG1heSByZXR1cm4gdHJ1ZSBldmVuIGlmIHRoZSBpbm5lciBtZXNzYWdlIGhhcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGlubmVyIG1lc3NhZ2Ugd291bGQgaGF2ZSB0byBiZQorICAvLyBwYXJzZWQgaW4gb3JkZXIgdG8gcGVyZm9ybSB0aGUgY2hlY2ssIGRlZmVhdGluZyB0aGUgcHVycG9zZSBvZiBsYXp5CisgIC8vIHBhcnNpbmcuICBBbiBpbXBsZW1lbnRhdGlvbiB3aGljaCBjaG9vc2VzIG5vdCB0byBjaGVjayByZXF1aXJlZCBmaWVsZHMKKyAgLy8gbXVzdCBiZSBjb25zaXN0ZW50IGFib3V0IGl0LiAgVGhhdCBpcywgZm9yIGFueSBwYXJ0aWN1bGFyIHN1Yi1tZXNzYWdlLCB0aGUKKyAgLy8gaW1wbGVtZW50YXRpb24gbXVzdCBlaXRoZXIgKmFsd2F5cyogY2hlY2sgaXRzIHJlcXVpcmVkIGZpZWxkcywgb3IgKm5ldmVyKgorICAvLyBjaGVjayBpdHMgcmVxdWlyZWQgZmllbGRzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBtZXNzYWdlIGhhcworICAvLyBiZWVuIHBhcnNlZC4KKyAgLy8KKyAgLy8gQXMgb2YgMjAyMSwgbGF6eSBkb2VzIG5vIGNvcnJlY3RuZXNzIGNoZWNrcyBvbiB0aGUgYnl0ZSBzdHJlYW0gZHVyaW5nCisgIC8vIHBhcnNpbmcuICBUaGlzIG1heSBsZWFkIHRvIGNyYXNoZXMgaWYgYW5kIHdoZW4gYW4gaW52YWxpZCBieXRlIHN0cmVhbSBpcworICAvLyBmaW5hbGx5IHBhcnNlZCB1cG9uIGFjY2Vzcy4KKyAgLy8KKyAgLy8gVE9ETyhiLzIxMTkwNjExMyk6ICBFbmFibGUgdmFsaWRhdGlvbiBvbiBsYXp5IGZpZWxkcy4KKyAgb3B0aW9uYWwgYm9vbCBsYXp5ID0gNSBbZGVmYXVsdCA9IGZhbHNlXTsKKworICAvLyB1bnZlcmlmaWVkX2xhenkgZG9lcyBubyBjb3JyZWN0bmVzcyBjaGVja3Mgb24gdGhlIGJ5dGUgc3RyZWFtLiBUaGlzIHNob3VsZAorICAvLyBvbmx5IGJlIHVzZWQgd2hlcmUgbGF6eSB3aXRoIHZlcmlmaWNhdGlvbiBpcyBwcm9oaWJpdGl2ZSBmb3IgcGVyZm9ybWFuY2UKKyAgLy8gcmVhc29ucy4KKyAgb3B0aW9uYWwgYm9vbCB1bnZlcmlmaWVkX2xhenkgPSAxNSBbZGVmYXVsdCA9IGZhbHNlXTsKKworICAvLyBJcyB0aGlzIGZpZWxkIGRlcHJlY2F0ZWQ/CisgIC8vIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKKyAgLy8gZm9yIGFjY2Vzc29ycywgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5IGxlYXN0LCB0aGlzCisgIC8vIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgZmllbGRzLgorICBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworCisgIC8vIEZvciBHb29nbGUtaW50ZXJuYWwgbWlncmF0aW9uIG9ubHkuIERvIG5vdCB1c2UuCisgIG9wdGlvbmFsIGJvb2wgd2VhayA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOworCisKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7CisKKyAgcmVzZXJ2ZWQgNDsgIC8vIHJlbW92ZWQganR5cGUKK30KKworbWVzc2FnZSBPbmVvZk9wdGlvbnMgeworICAvLyBUaGUgcGFyc2VyIHN0b3JlcyBvcHRpb25zIGl0IGRvZXNuJ3QgcmVjb2duaXplIGhlcmUuIFNlZSBhYm92ZS4KKyAgcmVwZWF0ZWQgVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKworICAvLyBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKK30KKworbWVzc2FnZSBFbnVtT3B0aW9ucyB7CisKKyAgLy8gU2V0IHRoaXMgb3B0aW9uIHRvIHRydWUgdG8gYWxsb3cgbWFwcGluZyBkaWZmZXJlbnQgdGFnIG5hbWVzIHRvIHRoZSBzYW1lCisgIC8vIHZhbHVlLgorICBvcHRpb25hbCBib29sIGFsbG93X2FsaWFzID0gMjsKKworICAvLyBJcyB0aGlzIGVudW0gZGVwcmVjYXRlZD8KKyAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucworICAvLyBmb3IgdGhlIGVudW0sIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwgdGhpcworICAvLyBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIGVudW1zLgorICBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworCisgIHJlc2VydmVkIDU7ICAvLyBqYXZhbmFub19hc19saXRlCisKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgRW51bVZhbHVlT3B0aW9ucyB7CisgIC8vIElzIHRoaXMgZW51bSB2YWx1ZSBkZXByZWNhdGVkPworICAvLyBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCisgIC8vIGZvciB0aGUgZW51bSB2YWx1ZSwgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5IGxlYXN0LAorICAvLyB0aGlzIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgZW51bSB2YWx1ZXMuCisgIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDEgW2RlZmF1bHQgPSBmYWxzZV07CisKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgU2VydmljZU9wdGlvbnMgeworCisgIC8vIE5vdGU6ICBGaWVsZCBudW1iZXJzIDEgdGhyb3VnaCAzMiBhcmUgcmVzZXJ2ZWQgZm9yIEdvb2dsZSdzIGludGVybmFsIFJQQworICAvLyAgIGZyYW1ld29yay4gIFdlIGFwb2xvZ2l6ZSBmb3IgaG9hcmRpbmcgdGhlc2UgbnVtYmVycyB0byBvdXJzZWx2ZXMsIGJ1dAorICAvLyAgIHdlIHdlcmUgYWxyZWFkeSB1c2luZyB0aGVtIGxvbmcgYmVmb3JlIHdlIGRlY2lkZWQgdG8gcmVsZWFzZSBQcm90b2NvbAorICAvLyAgIEJ1ZmZlcnMuCisKKyAgLy8gSXMgdGhpcyBzZXJ2aWNlIGRlcHJlY2F0ZWQ/CisgIC8vIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKKyAgLy8gZm9yIHRoZSBzZXJ2aWNlLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsCisgIC8vIHRoaXMgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBzZXJ2aWNlcy4KKyAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQgPSBmYWxzZV07CisKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgTWV0aG9kT3B0aW9ucyB7CisKKyAgLy8gTm90ZTogIEZpZWxkIG51bWJlcnMgMSB0aHJvdWdoIDMyIGFyZSByZXNlcnZlZCBmb3IgR29vZ2xlJ3MgaW50ZXJuYWwgUlBDCisgIC8vICAgZnJhbWV3b3JrLiAgV2UgYXBvbG9naXplIGZvciBob2FyZGluZyB0aGVzZSBudW1iZXJzIHRvIG91cnNlbHZlcywgYnV0CisgIC8vICAgd2Ugd2VyZSBhbHJlYWR5IHVzaW5nIHRoZW0gbG9uZyBiZWZvcmUgd2UgZGVjaWRlZCB0byByZWxlYXNlIFByb3RvY29sCisgIC8vICAgQnVmZmVycy4KKworICAvLyBJcyB0aGlzIG1ldGhvZCBkZXByZWNhdGVkPworICAvLyBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCisgIC8vIGZvciB0aGUgbWV0aG9kLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsCisgIC8vIHRoaXMgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBtZXRob2RzLgorICBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKKworICAvLyBJcyB0aGlzIG1ldGhvZCBzaWRlLWVmZmVjdC1mcmVlIChvciBzYWZlIGluIEhUVFAgcGFybGFuY2UpLCBvciBpZGVtcG90ZW50LAorICAvLyBvciBuZWl0aGVyPyBIVFRQIGJhc2VkIFJQQyBpbXBsZW1lbnRhdGlvbiBtYXkgY2hvb3NlIEdFVCB2ZXJiIGZvciBzYWZlCisgIC8vIG1ldGhvZHMsIGFuZCBQVVQgdmVyYiBmb3IgaWRlbXBvdGVudCBtZXRob2RzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgUE9TVC4KKyAgZW51bSBJZGVtcG90ZW5jeUxldmVsIHsKKyAgICBJREVNUE9URU5DWV9VTktOT1dOID0gMDsKKyAgICBOT19TSURFX0VGRkVDVFMgPSAxOyAgLy8gaW1wbGllcyBpZGVtcG90ZW50CisgICAgSURFTVBPVEVOVCA9IDI7ICAgICAgIC8vIGlkZW1wb3RlbnQsIGJ1dCBtYXkgaGF2ZSBzaWRlIGVmZmVjdHMKKyAgfQorICBvcHRpb25hbCBJZGVtcG90ZW5jeUxldmVsIGlkZW1wb3RlbmN5X2xldmVsID0gMzQKKyAgICAgIFtkZWZhdWx0ID0gSURFTVBPVEVOQ1lfVU5LTk9XTl07CisKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKKworLy8gQSBtZXNzYWdlIHJlcHJlc2VudGluZyBhIG9wdGlvbiB0aGUgcGFyc2VyIGRvZXMgbm90IHJlY29nbml6ZS4gVGhpcyBvbmx5CisvLyBhcHBlYXJzIGluIG9wdGlvbnMgcHJvdG9zIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyOjpQYXJzZXIgY2xhc3MuCisvLyBEZXNjcmlwdG9yUG9vbCByZXNvbHZlcyB0aGVzZSB3aGVuIGJ1aWxkaW5nIERlc2NyaXB0b3Igb2JqZWN0cy4gVGhlcmVmb3JlLAorLy8gb3B0aW9ucyBwcm90b3MgaW4gZGVzY3JpcHRvciBvYmplY3RzIChlLmcuIHJldHVybmVkIGJ5IERlc2NyaXB0b3I6Om9wdGlvbnMoKSwKKy8vIG9yIHByb2R1Y2VkIGJ5IERlc2NyaXB0b3I6OkNvcHlUbygpKSB3aWxsIG5ldmVyIGhhdmUgVW5pbnRlcnByZXRlZE9wdGlvbnMKKy8vIGluIHRoZW0uCittZXNzYWdlIFVuaW50ZXJwcmV0ZWRPcHRpb24geworICAvLyBUaGUgbmFtZSBvZiB0aGUgdW5pbnRlcnByZXRlZCBvcHRpb24uICBFYWNoIHN0cmluZyByZXByZXNlbnRzIGEgc2VnbWVudCBpbgorICAvLyBhIGRvdC1zZXBhcmF0ZWQgbmFtZS4gIGlzX2V4dGVuc2lvbiBpcyB0cnVlIGlmZiBhIHNlZ21lbnQgcmVwcmVzZW50cyBhbgorICAvLyBleHRlbnNpb24gKGRlbm90ZWQgd2l0aCBwYXJlbnRoZXNlcyBpbiBvcHRpb25zIHNwZWNzIGluIC5wcm90byBmaWxlcykuCisgIC8vIEUuZy4seyBbImZvbyIsIGZhbHNlXSwgWyJiYXIuYmF6IiwgdHJ1ZV0sIFsibW9vIiwgZmFsc2VdIH0gcmVwcmVzZW50cworICAvLyAiZm9vLihiYXIuYmF6KS5tb28iLgorICBtZXNzYWdlIE5hbWVQYXJ0IHsKKyAgICByZXF1aXJlZCBzdHJpbmcgbmFtZV9wYXJ0ID0gMTsKKyAgICByZXF1aXJlZCBib29sIGlzX2V4dGVuc2lvbiA9IDI7CisgIH0KKyAgcmVwZWF0ZWQgTmFtZVBhcnQgbmFtZSA9IDI7CisKKyAgLy8gVGhlIHZhbHVlIG9mIHRoZSB1bmludGVycHJldGVkIG9wdGlvbiwgaW4gd2hhdGV2ZXIgdHlwZSB0aGUgdG9rZW5pemVyCisgIC8vIGlkZW50aWZpZWQgaXQgYXMgZHVyaW5nIHBhcnNpbmcuIEV4YWN0bHkgb25lIG9mIHRoZXNlIHNob3VsZCBiZSBzZXQuCisgIG9wdGlvbmFsIHN0cmluZyBpZGVudGlmaWVyX3ZhbHVlID0gMzsKKyAgb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7CisgIG9wdGlvbmFsIGludDY0IG5lZ2F0aXZlX2ludF92YWx1ZSA9IDU7CisgIG9wdGlvbmFsIGRvdWJsZSBkb3VibGVfdmFsdWUgPSA2OworICBvcHRpb25hbCBieXRlcyBzdHJpbmdfdmFsdWUgPSA3OworICBvcHRpb25hbCBzdHJpbmcgYWdncmVnYXRlX3ZhbHVlID0gODsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gT3B0aW9uYWwgc291cmNlIGNvZGUgaW5mbworCisvLyBFbmNhcHN1bGF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIGZyb20gd2hpY2ggYQorLy8gRmlsZURlc2NyaXB0b3JQcm90byB3YXMgZ2VuZXJhdGVkLgorbWVzc2FnZSBTb3VyY2VDb2RlSW5mbyB7CisgIC8vIEEgTG9jYXRpb24gaWRlbnRpZmllcyBhIHBpZWNlIG9mIHNvdXJjZSBjb2RlIGluIGEgLnByb3RvIGZpbGUgd2hpY2gKKyAgLy8gY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGRlZmluaXRpb24uICBUaGlzIGluZm9ybWF0aW9uIGlzIGludGVuZGVkCisgIC8vIHRvIGJlIHVzZWZ1bCB0byBJREVzLCBjb2RlIGluZGV4ZXJzLCBkb2N1bWVudGF0aW9uIGdlbmVyYXRvcnMsIGFuZCBzaW1pbGFyCisgIC8vIHRvb2xzLgorICAvLworICAvLyBGb3IgZXhhbXBsZSwgc2F5IHdlIGhhdmUgYSBmaWxlIGxpa2U6CisgIC8vICAgbWVzc2FnZSBGb28geworICAvLyAgICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDE7CisgIC8vICAgfQorICAvLyBMZXQncyBsb29rIGF0IGp1c3QgdGhlIGZpZWxkIGRlZmluaXRpb246CisgIC8vICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDE7CisgIC8vICAgXiAgICAgICBeXiAgICAgXl4gIF4gIF5eXgorICAvLyAgIGEgICAgICAgYmMgICAgIGRlICBmICBnaGkKKyAgLy8gV2UgaGF2ZSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAgLy8gICBzcGFuICAgcGF0aCAgICAgICAgICAgICAgIHJlcHJlc2VudHMKKyAgLy8gICBbYSxpKSAgWyA0LCAwLCAyLCAwIF0gICAgIFRoZSB3aG9sZSBmaWVsZCBkZWZpbml0aW9uLgorICAvLyAgIFthLGIpICBbIDQsIDAsIDIsIDAsIDQgXSAgVGhlIGxhYmVsIChvcHRpb25hbCkuCisgIC8vICAgW2MsZCkgIFsgNCwgMCwgMiwgMCwgNSBdICBUaGUgdHlwZSAoc3RyaW5nKS4KKyAgLy8gICBbZSxmKSAgWyA0LCAwLCAyLCAwLCAxIF0gIFRoZSBuYW1lIChmb28pLgorICAvLyAgIFtnLGgpICBbIDQsIDAsIDIsIDAsIDMgXSAgVGhlIG51bWJlciAoMSkuCisgIC8vCisgIC8vIE5vdGVzOgorICAvLyAtIEEgbG9jYXRpb24gbWF5IHJlZmVyIHRvIGEgcmVwZWF0ZWQgZmllbGQgaXRzZWxmIChpLmUuIG5vdCB0byBhbnkKKyAgLy8gICBwYXJ0aWN1bGFyIGluZGV4IHdpdGhpbiBpdCkuICBUaGlzIGlzIHVzZWQgd2hlbmV2ZXIgYSBzZXQgb2YgZWxlbWVudHMgYXJlCisgIC8vICAgbG9naWNhbGx5IGVuY2xvc2VkIGluIGEgc2luZ2xlIGNvZGUgc2VnbWVudC4gIEZvciBleGFtcGxlLCBhbiBlbnRpcmUKKyAgLy8gICBleHRlbmQgYmxvY2sgKHBvc3NpYmx5IGNvbnRhaW5pbmcgbXVsdGlwbGUgZXh0ZW5zaW9uIGRlZmluaXRpb25zKSB3aWxsCisgIC8vICAgaGF2ZSBhbiBvdXRlciBsb2NhdGlvbiB3aG9zZSBwYXRoIHJlZmVycyB0byB0aGUgImV4dGVuc2lvbnMiIHJlcGVhdGVkCisgIC8vICAgZmllbGQgd2l0aG91dCBhbiBpbmRleC4KKyAgLy8gLSBNdWx0aXBsZSBsb2NhdGlvbnMgbWF5IGhhdmUgdGhlIHNhbWUgcGF0aC4gIFRoaXMgaGFwcGVucyB3aGVuIGEgc2luZ2xlCisgIC8vICAgbG9naWNhbCBkZWNsYXJhdGlvbiBpcyBzcHJlYWQgb3V0IGFjcm9zcyBtdWx0aXBsZSBwbGFjZXMuICBUaGUgbW9zdAorICAvLyAgIG9idmlvdXMgZXhhbXBsZSBpcyB0aGUgImV4dGVuZCIgYmxvY2sgYWdhaW4gLS0gdGhlcmUgbWF5IGJlIG11bHRpcGxlCisgIC8vICAgZXh0ZW5kIGJsb2NrcyBpbiB0aGUgc2FtZSBzY29wZSwgZWFjaCBvZiB3aGljaCB3aWxsIGhhdmUgdGhlIHNhbWUgcGF0aC4KKyAgLy8gLSBBIGxvY2F0aW9uJ3Mgc3BhbiBpcyBub3QgYWx3YXlzIGEgc3Vic2V0IG9mIGl0cyBwYXJlbnQncyBzcGFuLiAgRm9yCisgIC8vICAgZXhhbXBsZSwgdGhlICJleHRlbmRlZSIgb2YgYW4gZXh0ZW5zaW9uIGRlY2xhcmF0aW9uIGFwcGVhcnMgYXQgdGhlCisgIC8vICAgYmVnaW5uaW5nIG9mIHRoZSAiZXh0ZW5kIiBibG9jayBhbmQgaXMgc2hhcmVkIGJ5IGFsbCBleHRlbnNpb25zIHdpdGhpbgorICAvLyAgIHRoZSBibG9jay4KKyAgLy8gLSBKdXN0IGJlY2F1c2UgYSBsb2NhdGlvbidzIHNwYW4gaXMgYSBzdWJzZXQgb2Ygc29tZSBvdGhlciBsb2NhdGlvbidzIHNwYW4KKyAgLy8gICBkb2VzIG5vdCBtZWFuIHRoYXQgaXQgaXMgYSBkZXNjZW5kYW50LiAgRm9yIGV4YW1wbGUsIGEgImdyb3VwIiBkZWZpbmVzCisgIC8vICAgYm90aCBhIHR5cGUgYW5kIGEgZmllbGQgaW4gYSBzaW5nbGUgZGVjbGFyYXRpb24uICBUaHVzLCB0aGUgbG9jYXRpb25zCisgIC8vICAgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBhbmQgZmllbGQgYW5kIHRoZWlyIGNvbXBvbmVudHMgd2lsbCBvdmVybGFwLgorICAvLyAtIENvZGUgd2hpY2ggdHJpZXMgdG8gaW50ZXJwcmV0IGxvY2F0aW9ucyBzaG91bGQgcHJvYmFibHkgYmUgZGVzaWduZWQgdG8KKyAgLy8gICBpZ25vcmUgdGhvc2UgdGhhdCBpdCBkb2Vzbid0IHVuZGVyc3RhbmQsIGFzIG1vcmUgdHlwZXMgb2YgbG9jYXRpb25zIGNvdWxkCisgIC8vICAgYmUgcmVjb3JkZWQgaW4gdGhlIGZ1dHVyZS4KKyAgcmVwZWF0ZWQgTG9jYXRpb24gbG9jYXRpb24gPSAxOworICBtZXNzYWdlIExvY2F0aW9uIHsKKyAgICAvLyBJZGVudGlmaWVzIHdoaWNoIHBhcnQgb2YgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gd2FzIGRlZmluZWQgYXQgdGhpcworICAgIC8vIGxvY2F0aW9uLgorICAgIC8vCisgICAgLy8gRWFjaCBlbGVtZW50IGlzIGEgZmllbGQgbnVtYmVyIG9yIGFuIGluZGV4LiAgVGhleSBmb3JtIGEgcGF0aCBmcm9tCisgICAgLy8gdGhlIHJvb3QgRmlsZURlc2NyaXB0b3JQcm90byB0byB0aGUgcGxhY2Ugd2hlcmUgdGhlIGRlZmluaXRpb24gb2NjdXJzLgorICAgIC8vIEZvciBleGFtcGxlLCB0aGlzIHBhdGg6CisgICAgLy8gICBbIDQsIDMsIDIsIDcsIDEgXQorICAgIC8vIHJlZmVycyB0bzoKKyAgICAvLyAgIGZpbGUubWVzc2FnZV90eXBlKDMpICAvLyA0LCAzCisgICAgLy8gICAgICAgLmZpZWxkKDcpICAgICAgICAgLy8gMiwgNworICAgIC8vICAgICAgIC5uYW1lKCkgICAgICAgICAgIC8vIDEKKyAgICAvLyBUaGlzIGlzIGJlY2F1c2UgRmlsZURlc2NyaXB0b3JQcm90by5tZXNzYWdlX3R5cGUgaGFzIGZpZWxkIG51bWJlciA0OgorICAgIC8vICAgcmVwZWF0ZWQgRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7CisgICAgLy8gYW5kIERlc2NyaXB0b3JQcm90by5maWVsZCBoYXMgZmllbGQgbnVtYmVyIDI6CisgICAgLy8gICByZXBlYXRlZCBGaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CisgICAgLy8gYW5kIEZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUgaGFzIGZpZWxkIG51bWJlciAxOgorICAgIC8vICAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgIC8vCisgICAgLy8gVGh1cywgdGhlIGFib3ZlIHBhdGggZ2l2ZXMgdGhlIGxvY2F0aW9uIG9mIGEgZmllbGQgbmFtZS4gIElmIHdlIHJlbW92ZWQKKyAgICAvLyB0aGUgbGFzdCBlbGVtZW50OgorICAgIC8vICAgWyA0LCAzLCAyLCA3IF0KKyAgICAvLyB0aGlzIHBhdGggcmVmZXJzIHRvIHRoZSB3aG9sZSBmaWVsZCBkZWNsYXJhdGlvbiAoZnJvbSB0aGUgYmVnaW5uaW5nCisgICAgLy8gb2YgdGhlIGxhYmVsIHRvIHRoZSB0ZXJtaW5hdGluZyBzZW1pY29sb24pLgorICAgIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKKworICAgIC8vIEFsd2F5cyBoYXMgZXhhY3RseSB0aHJlZSBvciBmb3VyIGVsZW1lbnRzOiBzdGFydCBsaW5lLCBzdGFydCBjb2x1bW4sCisgICAgLy8gZW5kIGxpbmUgKG9wdGlvbmFsLCBvdGhlcndpc2UgYXNzdW1lZCBzYW1lIGFzIHN0YXJ0IGxpbmUpLCBlbmQgY29sdW1uLgorICAgIC8vIFRoZXNlIGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSBmaWVsZCBmb3IgZWZmaWNpZW5jeS4gIE5vdGUgdGhhdCBsaW5lCisgICAgLy8gYW5kIGNvbHVtbiBudW1iZXJzIGFyZSB6ZXJvLWJhc2VkIC0tIHR5cGljYWxseSB5b3Ugd2lsbCB3YW50IHRvIGFkZAorICAgIC8vIDEgdG8gZWFjaCBiZWZvcmUgZGlzcGxheWluZyB0byBhIHVzZXIuCisgICAgcmVwZWF0ZWQgaW50MzIgc3BhbiA9IDIgW3BhY2tlZCA9IHRydWVdOworCisgICAgLy8gSWYgdGhpcyBTb3VyY2VDb2RlSW5mbyByZXByZXNlbnRzIGEgY29tcGxldGUgZGVjbGFyYXRpb24sIHRoZXNlIGFyZSBhbnkKKyAgICAvLyBjb21tZW50cyBhcHBlYXJpbmcgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGVjbGFyYXRpb24gd2hpY2ggYXBwZWFyIHRvIGJlCisgICAgLy8gYXR0YWNoZWQgdG8gdGhlIGRlY2xhcmF0aW9uLgorICAgIC8vCisgICAgLy8gQSBzZXJpZXMgb2YgbGluZSBjb21tZW50cyBhcHBlYXJpbmcgb24gY29uc2VjdXRpdmUgbGluZXMsIHdpdGggbm8gb3RoZXIKKyAgICAvLyB0b2tlbnMgYXBwZWFyaW5nIG9uIHRob3NlIGxpbmVzLCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBzaW5nbGUgY29tbWVudC4KKyAgICAvLworICAgIC8vIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMgd2lsbCBrZWVwIHBhcmFncmFwaHMgb2YgY29tbWVudHMgdGhhdCBhcHBlYXIKKyAgICAvLyBiZWZvcmUgKGJ1dCBub3QgY29ubmVjdGVkIHRvKSB0aGUgY3VycmVudCBlbGVtZW50LiBFYWNoIHBhcmFncmFwaCwKKyAgICAvLyBzZXBhcmF0ZWQgYnkgZW1wdHkgbGluZXMsIHdpbGwgYmUgb25lIGNvbW1lbnQgZWxlbWVudCBpbiB0aGUgcmVwZWF0ZWQKKyAgICAvLyBmaWVsZC4KKyAgICAvLworICAgIC8vIE9ubHkgdGhlIGNvbW1lbnQgY29udGVudCBpcyBwcm92aWRlZDsgY29tbWVudCBtYXJrZXJzIChlLmcuIC8vKSBhcmUKKyAgICAvLyBzdHJpcHBlZCBvdXQuICBGb3IgYmxvY2sgY29tbWVudHMsIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgYW4gYXN0ZXJpc2sKKyAgICAvLyB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgb3RoZXIgdGhhbiB0aGUgZmlyc3QuCisgICAgLy8gTmV3bGluZXMgYXJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCisgICAgLy8KKyAgICAvLyBFeGFtcGxlczoKKyAgICAvLworICAgIC8vICAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gZm9vLgorICAgIC8vICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBiYXIuCisgICAgLy8gICBvcHRpb25hbCBpbnQzMiBiYXIgPSAyOworICAgIC8vCisgICAgLy8gICBvcHRpb25hbCBzdHJpbmcgYmF6ID0gMzsKKyAgICAvLyAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gYmF6LgorICAgIC8vICAgLy8gQW5vdGhlciBsaW5lIGF0dGFjaGVkIHRvIGJhei4KKyAgICAvLworICAgIC8vICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBtb28uCisgICAgLy8gICAvLworICAgIC8vICAgLy8gQW5vdGhlciBsaW5lIGF0dGFjaGVkIHRvIG1vby4KKyAgICAvLyAgIG9wdGlvbmFsIGRvdWJsZSBtb28gPSA0OworICAgIC8vCisgICAgLy8gICAvLyBEZXRhY2hlZCBjb21tZW50IGZvciBjb3JnZS4gVGhpcyBpcyBub3QgbGVhZGluZyBvciB0cmFpbGluZyBjb21tZW50cworICAgIC8vICAgLy8gdG8gbW9vIG9yIGNvcmdlIGJlY2F1c2UgdGhlcmUgYXJlIGJsYW5rIGxpbmVzIHNlcGFyYXRpbmcgaXQgZnJvbQorICAgIC8vICAgLy8gYm90aC4KKyAgICAvLworICAgIC8vICAgLy8gRGV0YWNoZWQgY29tbWVudCBmb3IgY29yZ2UgcGFyYWdyYXBoIDIuCisgICAgLy8KKyAgICAvLyAgIG9wdGlvbmFsIHN0cmluZyBjb3JnZSA9IDU7CisgICAgLy8gICAvKiBCbG9jayBjb21tZW50IGF0dGFjaGVkCisgICAgLy8gICAgKiB0byBjb3JnZS4gIExlYWRpbmcgYXN0ZXJpc2tzCisgICAgLy8gICAgKiB3aWxsIGJlIHJlbW92ZWQuICovCisgICAgLy8gICAvKiBCbG9jayBjb21tZW50IGF0dGFjaGVkIHRvCisgICAgLy8gICAgKiBncmF1bHQuICovCisgICAgLy8gICBvcHRpb25hbCBpbnQzMiBncmF1bHQgPSA2OworICAgIC8vCisgICAgLy8gICAvLyBpZ25vcmVkIGRldGFjaGVkIGNvbW1lbnRzLgorICAgIG9wdGlvbmFsIHN0cmluZyBsZWFkaW5nX2NvbW1lbnRzID0gMzsKKyAgICBvcHRpb25hbCBzdHJpbmcgdHJhaWxpbmdfY29tbWVudHMgPSA0OworICAgIHJlcGVhdGVkIHN0cmluZyBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzID0gNjsKKyAgfQorfQorCisvLyBEZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGdlbmVyYXRlZCBjb2RlIGFuZCBpdHMgb3JpZ2luYWwgc291cmNlCisvLyBmaWxlLiBBIEdlbmVyYXRlZENvZGVJbmZvIG1lc3NhZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIG9ubHkgb25lIGdlbmVyYXRlZAorLy8gc291cmNlIGZpbGUsIGJ1dCBtYXkgY29udGFpbiByZWZlcmVuY2VzIHRvIGRpZmZlcmVudCBzb3VyY2UgLnByb3RvIGZpbGVzLgorbWVzc2FnZSBHZW5lcmF0ZWRDb2RlSW5mbyB7CisgIC8vIEFuIEFubm90YXRpb24gY29ubmVjdHMgc29tZSBzcGFuIG9mIHRleHQgaW4gZ2VuZXJhdGVkIGNvZGUgdG8gYW4gZWxlbWVudAorICAvLyBvZiBpdHMgZ2VuZXJhdGluZyAucHJvdG8gZmlsZS4KKyAgcmVwZWF0ZWQgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gMTsKKyAgbWVzc2FnZSBBbm5vdGF0aW9uIHsKKyAgICAvLyBJZGVudGlmaWVzIHRoZSBlbGVtZW50IGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgLnByb3RvIGZpbGUuIFRoaXMgZmllbGQKKyAgICAvLyBpcyBmb3JtYXR0ZWQgdGhlIHNhbWUgYXMgU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aC4KKyAgICByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkID0gdHJ1ZV07CisKKyAgICAvLyBJZGVudGlmaWVzIHRoZSBmaWxlc3lzdGVtIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSAucHJvdG8uCisgICAgb3B0aW9uYWwgc3RyaW5nIHNvdXJjZV9maWxlID0gMjsKKworICAgIC8vIElkZW50aWZpZXMgdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiBieXRlcyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUKKyAgICAvLyB0aGF0IHJlbGF0ZXMgdG8gdGhlIGlkZW50aWZpZWQgb2JqZWN0LgorICAgIG9wdGlvbmFsIGludDMyIGJlZ2luID0gMzsKKworICAgIC8vIElkZW50aWZpZXMgdGhlIGVuZGluZyBvZmZzZXQgaW4gYnl0ZXMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIHRoYXQKKyAgICAvLyByZWxhdGVzIHRvIHRoZSBpZGVudGlmaWVkIG9mZnNldC4gVGhlIGVuZCBvZmZzZXQgc2hvdWxkIGJlIG9uZSBwYXN0CisgICAgLy8gdGhlIGxhc3QgcmVsZXZhbnQgYnl0ZSAoc28gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCA9IGVuZCAtIGJlZ2luKS4KKyAgICBvcHRpb25hbCBpbnQzMiBlbmQgPSA0OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzMDAwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5jYwpAQCAtMCwwICsxLDEwNDggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK25hbWVzcGFjZSB7Cit2b2lkIFJlY29yZE1lc3NhZ2VOYW1lcyhjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGRlc2NfcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBvdXRwdXQpIHsKKyAgR09PR0xFX0NIRUNLKGRlc2NfcHJvdG8uaGFzX25hbWUoKSk7CisgIHN0ZDo6c3RyaW5nIGZ1bGxfbmFtZSA9IHByZWZpeC5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlc2NfcHJvdG8ubmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN0ckNhdChwcmVmaXgsICIuIiwgZGVzY19wcm90by5uYW1lKCkpOworICBvdXRwdXQtPmluc2VydChmdWxsX25hbWUpOworCisgIGZvciAoY29uc3QgYXV0byYgZCA6IGRlc2NfcHJvdG8ubmVzdGVkX3R5cGUoKSkgeworICAgIFJlY29yZE1lc3NhZ2VOYW1lcyhkLCBmdWxsX25hbWUsIG91dHB1dCk7CisgIH0KK30KKwordm9pZCBSZWNvcmRNZXNzYWdlTmFtZXMoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZmlsZV9wcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiogb3V0cHV0KSB7CisgIGZvciAoY29uc3QgYXV0byYgZCA6IGZpbGVfcHJvdG8ubWVzc2FnZV90eXBlKCkpIHsKKyAgICBSZWNvcmRNZXNzYWdlTmFtZXMoZCwgZmlsZV9wcm90by5wYWNrYWdlKCksIG91dHB1dCk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEZuPgorYm9vbCBGb3JBbGxGaWxlUHJvdG9zKERlc2NyaXB0b3JEYXRhYmFzZSogZGIsIEZuIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0cHV0KSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWxlX25hbWVzOworICBpZiAoIWRiLT5GaW5kQWxsRmlsZU5hbWVzKCZmaWxlX25hbWVzKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gc2V0OworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIGZvciAoY29uc3QgYXV0byYgZiA6IGZpbGVfbmFtZXMpIHsKKyAgICBmaWxlX3Byb3RvLkNsZWFyKCk7CisgICAgaWYgKCFkYi0+RmluZEZpbGVCeU5hbWUoZiwgJmZpbGVfcHJvdG8pKSB7CisgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRmlsZSBub3QgZm91bmQgaW4gZGF0YWJhc2UgKHVuZXhwZWN0ZWQpOiAiIDw8IGY7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNhbGxiYWNrKGZpbGVfcHJvdG8sICZzZXQpOworICB9CisgIG91dHB1dC0+aW5zZXJ0KG91dHB1dC0+ZW5kKCksIHNldC5iZWdpbigpLCBzZXQuZW5kKCkpOworICByZXR1cm4gdHJ1ZTsKK30KK30gIC8vIG5hbWVzcGFjZQorCitEZXNjcmlwdG9yRGF0YWJhc2U6On5EZXNjcmlwdG9yRGF0YWJhc2UoKSB7fQorCitib29sIERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEFsbFBhY2thZ2VOYW1lcyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dHB1dCkgeworICByZXR1cm4gRm9yQWxsRmlsZVByb3RvcygKKyAgICAgIHRoaXMsCisgICAgICBbXShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlX3Byb3RvLCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIHNldCkgeworICAgICAgICBzZXQtPmluc2VydChmaWxlX3Byb3RvLnBhY2thZ2UoKSk7CisgICAgICB9LAorICAgICAgb3V0cHV0KTsKK30KKworYm9vbCBEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRBbGxNZXNzYWdlTmFtZXMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRwdXQpIHsKKyAgcmV0dXJuIEZvckFsbEZpbGVQcm90b3MoCisgICAgICB0aGlzLAorICAgICAgW10oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZmlsZV9wcm90bywgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBzZXQpIHsKKyAgICAgICAgUmVjb3JkTWVzc2FnZU5hbWVzKGZpbGVfcHJvdG8sIHNldCk7CisgICAgICB9LAorICAgICAgb3V0cHV0KTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OlNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSgpIHt9CitTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6On5TaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UoKSB7fQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+Citib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6QWRkRmlsZSgKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlLCBWYWx1ZSB2YWx1ZSkgeworICBpZiAoIUluc2VydElmTm90UHJlc2VudCgmYnlfbmFtZV8sIGZpbGUubmFtZSgpLCB2YWx1ZSkpIHsKKyAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRmlsZSBhbHJlYWR5IGV4aXN0cyBpbiBkYXRhYmFzZTogIiA8PCBmaWxlLm5hbWUoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBXZSBtdXN0IGJlIGNhcmVmdWwgaGVyZSAtLSBjYWxsaW5nIGZpbGUucGFja2FnZSgpIGlmIGZpbGUuaGFzX3BhY2thZ2UoKSBpcworICAvLyBmYWxzZSBjb3VsZCBhY2Nlc3MgYW4gdW5pbml0aWFsaXplZCBzdGF0aWMtc3RvcmFnZSB2YXJpYWJsZSBpZiB3ZSBhcmUgYmVpbmcKKyAgLy8gcnVuIGF0IHN0YXJ0dXAgdGltZS4KKyAgc3RkOjpzdHJpbmcgcGF0aCA9IGZpbGUuaGFzX3BhY2thZ2UoKSA/IGZpbGUucGFja2FnZSgpIDogc3RkOjpzdHJpbmcoKTsKKyAgaWYgKCFwYXRoLmVtcHR5KCkpIHBhdGggKz0gJy4nOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS5tZXNzYWdlX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIUFkZFN5bWJvbChwYXRoICsgZmlsZS5tZXNzYWdlX3R5cGUoaSkubmFtZSgpLCB2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIUFkZE5lc3RlZEV4dGVuc2lvbnMoZmlsZS5uYW1lKCksIGZpbGUubWVzc2FnZV90eXBlKGkpLCB2YWx1ZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLmVudW1fdHlwZV9zaXplKCk7IGkrKykgeworICAgIGlmICghQWRkU3ltYm9sKHBhdGggKyBmaWxlLmVudW1fdHlwZShpKS5uYW1lKCksIHZhbHVlKSkgcmV0dXJuIGZhbHNlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS5leHRlbnNpb25fc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIUFkZFN5bWJvbChwYXRoICsgZmlsZS5leHRlbnNpb24oaSkubmFtZSgpLCB2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIUFkZEV4dGVuc2lvbihmaWxlLm5hbWUoKSwgZmlsZS5leHRlbnNpb24oaSksIHZhbHVlKSkgcmV0dXJuIGZhbHNlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS5zZXJ2aWNlX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCFBZGRTeW1ib2wocGF0aCArIGZpbGUuc2VydmljZShpKS5uYW1lKCksIHZhbHVlKSkgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK25hbWVzcGFjZSB7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgbmFtZSBhcmUgYWxwaGFudW1lcmljcywKKy8vIHVuZGVyc2NvcmVzLCBvciBwZXJpb2RzLgorYm9vbCBWYWxpZGF0ZVN5bWJvbE5hbWUoU3RyaW5nUGllY2UgbmFtZSkgeworICBmb3IgKGNoYXIgYyA6IG5hbWUpIHsKKyAgICAvLyBJIGRvbid0IHRydXN0IGN0eXBlLmggZHVlIHRvIGxvY2FsZXMuICA6KAorICAgIGlmIChjICE9ICcuJyAmJiBjICE9ICdfJyAmJiAoYyA8ICcwJyB8fCBjID4gJzknKSAmJiAoYyA8ICdBJyB8fCBjID4gJ1onKSAmJgorICAgICAgICAoYyA8ICdhJyB8fCBjID4gJ3onKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmluZCB0aGUgbGFzdCBrZXkgaW4gdGhlIGNvbnRhaW5lciB3aGljaCBzb3J0cyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlCisvLyBzeW1ib2wgbmFtZS4gIFNpbmNlIHVwcGVyX2JvdW5kKCkgcmV0dXJucyB0aGUgKmZpcnN0KiBrZXkgdGhhdCBzb3J0cworLy8gKmdyZWF0ZXIqIHRoYW4gdGhlIGlucHV0LCB3ZSB3YW50IHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGF0LgordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lciwgdHlwZW5hbWUgS2V5PgordHlwZW5hbWUgQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBGaW5kTGFzdExlc3NPckVxdWFsKAorICAgIGNvbnN0IENvbnRhaW5lciogY29udGFpbmVyLCBjb25zdCBLZXkmIGtleSkgeworICBhdXRvIGl0ZXIgPSBjb250YWluZXItPnVwcGVyX2JvdW5kKGtleSk7CisgIGlmIChpdGVyICE9IGNvbnRhaW5lci0+YmVnaW4oKSkgLS1pdGVyOworICByZXR1cm4gaXRlcjsKK30KKworLy8gQXMgYWJvdmUsIGJ1dCB1c2luZyBzdGQ6OnVwcGVyX2JvdW5kIGluc3RlYWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyLCB0eXBlbmFtZSBLZXksIHR5cGVuYW1lIENtcD4KK3R5cGVuYW1lIENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgRmluZExhc3RMZXNzT3JFcXVhbCgKKyAgICBjb25zdCBDb250YWluZXIqIGNvbnRhaW5lciwgY29uc3QgS2V5JiBrZXksIGNvbnN0IENtcCYgY21wKSB7CisgIGF1dG8gaXRlciA9IHN0ZDo6dXBwZXJfYm91bmQoY29udGFpbmVyLT5iZWdpbigpLCBjb250YWluZXItPmVuZCgpLCBrZXksIGNtcCk7CisgIGlmIChpdGVyICE9IGNvbnRhaW5lci0+YmVnaW4oKSkgLS1pdGVyOworICByZXR1cm4gaXRlcjsKK30KKworLy8gVHJ1ZSBpZiBlaXRoZXIgdGhlIGFyZ3VtZW50cyBhcmUgZXF1YWwgb3Igc3VwZXJfc3ltYm9sIGlkZW50aWZpZXMgYQorLy8gcGFyZW50IHN5bWJvbCBvZiBzdWJfc3ltYm9sIChlLmcuICJmb28uYmFyIiBpcyBhIHBhcmVudCBvZgorLy8gImZvby5iYXIuYmF6IiwgYnV0IG5vdCBhIHBhcmVudCBvZiAiZm9vLmJhcmJheiIpLgorYm9vbCBJc1N1YlN5bWJvbChTdHJpbmdQaWVjZSBzdWJfc3ltYm9sLCBTdHJpbmdQaWVjZSBzdXBlcl9zeW1ib2wpIHsKKyAgcmV0dXJuIHN1Yl9zeW1ib2wgPT0gc3VwZXJfc3ltYm9sIHx8CisgICAgICAgICAoSGFzUHJlZml4U3RyaW5nKHN1cGVyX3N5bWJvbCwgc3ViX3N5bWJvbCkgJiYKKyAgICAgICAgICBzdXBlcl9zeW1ib2xbc3ViX3N5bWJvbC5zaXplKCldID09ICcuJyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+Citib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6QWRkU3ltYm9sKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBWYWx1ZSB2YWx1ZSkgeworICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSBub3QgdG8gdmlvbGF0ZSBvdXIgbWFwIGludmFyaWFudC4KKworICAvLyBJZiB0aGUgc3ltYm9sIG5hbWUgaXMgaW52YWxpZCBpdCBjb3VsZCBicmVhayBvdXIgbG9va3VwIGFsZ29yaXRobSAod2hpY2gKKyAgLy8gcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgJy4nIHNvcnRzIGJlZm9yZSBhbGwgb3RoZXIgY2hhcmFjdGVycyB0aGF0IGFyZQorICAvLyB2YWxpZCBpbiBzeW1ib2wgbmFtZXMpLgorICBpZiAoIVZhbGlkYXRlU3ltYm9sTmFtZShuYW1lKSkgeworICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJJbnZhbGlkIHN5bWJvbCBuYW1lOiAiIDw8IG5hbWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gVHJ5IHRvIGxvb2sgdXAgdGhlIHN5bWJvbCB0byBtYWtlIHN1cmUgYSBzdXBlci1zeW1ib2wgZG9lc24ndCBhbHJlYWR5CisgIC8vIGV4aXN0LgorICBhdXRvIGl0ZXIgPSBGaW5kTGFzdExlc3NPckVxdWFsKCZieV9zeW1ib2xfLCBuYW1lKTsKKworICBpZiAoaXRlciA9PSBieV9zeW1ib2xfLmVuZCgpKSB7CisgICAgLy8gQXBwYXJlbnRseSB0aGUgbWFwIGlzIGN1cnJlbnRseSBlbXB0eS4gIEp1c3QgaW5zZXJ0IGFuZCBiZSBkb25lIHdpdGggaXQuCisgICAgYnlfc3ltYm9sXy5pbnNlcnQoCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBWYWx1ZT46OnZhbHVlX3R5cGUobmFtZSwgdmFsdWUpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmIChJc1N1YlN5bWJvbChpdGVyLT5maXJzdCwgbmFtZSkpIHsKKyAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiU3ltYm9sIG5hbWUgXCIiIDw8IG5hbWUKKyAgICAgICAgICAgICAgIDw8ICJcIiBjb25mbGljdHMgd2l0aCB0aGUgZXhpc3RpbmcgIgorICAgICAgICAgICAgICAgICAgInN5bWJvbCBcIiIKKyAgICAgICAgICAgICAgIDw8IGl0ZXItPmZpcnN0IDw8ICJcIi4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIE9LLCB0aGF0IHdvcmtlZC4gIE5vdyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IG5vIHN5bWJvbCBpbiB0aGUgbWFwIGlzCisgIC8vIGEgc3ViLXN5bWJvbCBvZiB0aGUgb25lIHdlIGFyZSBpbnNlcnRpbmcuICBUaGUgb25seSBzeW1ib2wgd2hpY2ggY291bGQKKyAgLy8gYmUgc28gaXMgdGhlIGZpcnN0IHN5bWJvbCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbmV3IHN5bWJvbC4gIFNpbmNlCisgIC8vIHxpdGVyfCBwb2ludHMgYXQgdGhlIGxhc3Qgc3ltYm9sIHRoYXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsLCB3ZSBqdXN0IGhhdmUKKyAgLy8gdG8gaW5jcmVtZW50IGl0LgorICArK2l0ZXI7CisKKyAgaWYgKGl0ZXIgIT0gYnlfc3ltYm9sXy5lbmQoKSAmJiBJc1N1YlN5bWJvbChuYW1lLCBpdGVyLT5maXJzdCkpIHsKKyAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiU3ltYm9sIG5hbWUgXCIiIDw8IG5hbWUKKyAgICAgICAgICAgICAgIDw8ICJcIiBjb25mbGljdHMgd2l0aCB0aGUgZXhpc3RpbmcgIgorICAgICAgICAgICAgICAgICAgInN5bWJvbCBcIiIKKyAgICAgICAgICAgICAgIDw8IGl0ZXItPmZpcnN0IDw8ICJcIi4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIE9LLCBubyBjb25mbGljdHMuCisKKyAgLy8gSW5zZXJ0IHRoZSBuZXcgc3ltYm9sIHVzaW5nIHRoZSBpdGVyYXRvciBhcyBhIGhpbnQsIHRoZSBuZXcgZW50cnkgd2lsbAorICAvLyBhcHBlYXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBvbmUgdGhlIGl0ZXJhdG9yIGlzIHBvaW50aW5nIGF0LgorICBieV9zeW1ib2xfLmluc2VydCgKKyAgICAgIGl0ZXIsIHR5cGVuYW1lIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBWYWx1ZT46OnZhbHVlX3R5cGUobmFtZSwgdmFsdWUpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgorYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDxWYWx1ZT46OkFkZE5lc3RlZEV4dGVuc2lvbnMoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIG1lc3NhZ2VfdHlwZSwKKyAgICBWYWx1ZSB2YWx1ZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfdHlwZS5uZXN0ZWRfdHlwZV9zaXplKCk7IGkrKykgeworICAgIGlmICghQWRkTmVzdGVkRXh0ZW5zaW9ucyhmaWxlbmFtZSwgbWVzc2FnZV90eXBlLm5lc3RlZF90eXBlKGkpLCB2YWx1ZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX3R5cGUuZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCFBZGRFeHRlbnNpb24oZmlsZW5hbWUsIG1lc3NhZ2VfdHlwZS5leHRlbnNpb24oaSksIHZhbHVlKSkgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+Citib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6QWRkRXh0ZW5zaW9uKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkLAorICAgIFZhbHVlIHZhbHVlKSB7CisgIGlmICghZmllbGQuZXh0ZW5kZWUoKS5lbXB0eSgpICYmIGZpZWxkLmV4dGVuZGVlKClbMF0gPT0gJy4nKSB7CisgICAgLy8gVGhlIGV4dGVuc2lvbiBpcyBmdWxseS1xdWFsaWZpZWQuICBXZSBjYW4gdXNlIGl0IGFzIGEgbG9va3VwIGtleSBpbgorICAgIC8vIHRoZSBieV9zeW1ib2xfIHRhYmxlLgorICAgIGlmICghSW5zZXJ0SWZOb3RQcmVzZW50KAorICAgICAgICAgICAgJmJ5X2V4dGVuc2lvbl8sCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihmaWVsZC5leHRlbmRlZSgpLnN1YnN0cigxKSwgZmllbGQubnVtYmVyKCkpLAorICAgICAgICAgICAgdmFsdWUpKSB7CisgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRXh0ZW5zaW9uIGNvbmZsaWN0cyB3aXRoIGV4dGVuc2lvbiBhbHJlYWR5IGluIGRhdGFiYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICJleHRlbmQgIgorICAgICAgICAgICAgICAgICA8PCBmaWVsZC5leHRlbmRlZSgpIDw8ICIgeyAiIDw8IGZpZWxkLm5hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCBmaWVsZC5udW1iZXIoKSA8PCAiIH0gZnJvbToiIDw8IGZpbGVuYW1lOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBOb3QgZnVsbHktcXVhbGlmaWVkLiAgV2UgY2FuJ3QgcmVhbGx5IGRvIGFueXRoaW5nIGhlcmUsIHVuZm9ydHVuYXRlbHkuCisgICAgLy8gV2UgZG9uJ3QgY29uc2lkZXIgdGhpcyBhbiBlcnJvciwgdGhvdWdoLCBiZWNhdXNlIHRoZSBkZXNjcmlwdG9yIGlzCisgICAgLy8gdmFsaWQuCisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KK1ZhbHVlIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6RmluZEZpbGUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHJldHVybiBGaW5kV2l0aERlZmF1bHQoYnlfbmFtZV8sIGZpbGVuYW1lLCBWYWx1ZSgpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgorVmFsdWUgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8VmFsdWU+OjpGaW5kU3ltYm9sKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIGF1dG8gaXRlciA9IEZpbmRMYXN0TGVzc09yRXF1YWwoJmJ5X3N5bWJvbF8sIG5hbWUpOworCisgIHJldHVybiAoaXRlciAhPSBieV9zeW1ib2xfLmVuZCgpICYmIElzU3ViU3ltYm9sKGl0ZXItPmZpcnN0LCBuYW1lKSkKKyAgICAgICAgICAgICA/IGl0ZXItPnNlY29uZAorICAgICAgICAgICAgIDogVmFsdWUoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgorVmFsdWUgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8VmFsdWU+OjpGaW5kRXh0ZW5zaW9uKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250YWluaW5nX3R5cGUsIGludCBmaWVsZF9udW1iZXIpIHsKKyAgcmV0dXJuIEZpbmRXaXRoRGVmYXVsdCgKKyAgICAgIGJ5X2V4dGVuc2lvbl8sIHN0ZDo6bWFrZV9wYWlyKGNvbnRhaW5pbmdfdHlwZSwgZmllbGRfbnVtYmVyKSwgVmFsdWUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KK2Jvb2wgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8VmFsdWU+OjpGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGFpbmluZ190eXBlLCBzdGQ6OnZlY3RvcjxpbnQ+KiBvdXRwdXQpIHsKKyAgdHlwZW5hbWUgc3RkOjptYXA8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBpbnQ+LCBWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgIGJ5X2V4dGVuc2lvbl8ubG93ZXJfYm91bmQoc3RkOjptYWtlX3BhaXIoY29udGFpbmluZ190eXBlLCAwKSk7CisgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworCisgIGZvciAoOyBpdCAhPSBieV9leHRlbnNpb25fLmVuZCgpICYmIGl0LT5maXJzdC5maXJzdCA9PSBjb250YWluaW5nX3R5cGU7CisgICAgICAgKytpdCkgeworICAgIG91dHB1dC0+cHVzaF9iYWNrKGl0LT5maXJzdC5zZWNvbmQpOworICAgIHN1Y2Nlc3MgPSB0cnVlOworICB9CisKKyAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KK3ZvaWQgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8VmFsdWU+OjpGaW5kQWxsRmlsZU5hbWVzKAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0cHV0KSB7CisgIG91dHB1dC0+cmVzaXplKGJ5X25hbWVfLnNpemUoKSk7CisgIGludCBpID0gMDsKKyAgZm9yIChjb25zdCBhdXRvJiBrdiA6IGJ5X25hbWVfKSB7CisgICAgKCpvdXRwdXQpW2ldID0ga3YuZmlyc3Q7CisgICAgaSsrOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkFkZChjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG5ld19maWxlID0gbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG87CisgIG5ld19maWxlLT5Db3B5RnJvbShmaWxlKTsKKyAgcmV0dXJuIEFkZEFuZE93bihuZXdfZmlsZSk7Cit9CisKK2Jvb2wgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpBZGRBbmRPd24oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSkgeworICBmaWxlc190b19kZWxldGVfLmVtcGxhY2VfYmFjayhmaWxlKTsKKyAgcmV0dXJuIGluZGV4Xy5BZGRGaWxlKCpmaWxlLCBmaWxlKTsKK30KKworYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgcmV0dXJuIE1heWJlQ29weShpbmRleF8uRmluZEZpbGUoZmlsZW5hbWUpLCBvdXRwdXQpOworfQorCitib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzeW1ib2xfbmFtZSwgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIHJldHVybiBNYXliZUNvcHkoaW5kZXhfLkZpbmRTeW1ib2woc3ltYm9sX25hbWUpLCBvdXRwdXQpOworfQorCitib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250YWluaW5nX3R5cGUsIGludCBmaWVsZF9udW1iZXIsCisgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIHJldHVybiBNYXliZUNvcHkoaW5kZXhfLkZpbmRFeHRlbnNpb24oY29udGFpbmluZ190eXBlLCBmaWVsZF9udW1iZXIpLCBvdXRwdXQpOworfQorCitib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4dGVuZGVlX3R5cGUsIHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgeworICByZXR1cm4gaW5kZXhfLkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGV4dGVuZGVlX3R5cGUsIG91dHB1dCk7Cit9CisKKworYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRBbGxGaWxlTmFtZXMoCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRwdXQpIHsKKyAgaW5kZXhfLkZpbmRBbGxGaWxlTmFtZXMob3V0cHV0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpNYXliZUNvcHkoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIGlmIChmaWxlID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKyAgb3V0cHV0LT5Db3B5RnJvbSgqZmlsZSk7CisgIHJldHVybiB0cnVlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleCB7CisgcHVibGljOgorICB1c2luZyBWYWx1ZSA9IHN0ZDo6cGFpcjxjb25zdCB2b2lkKiwgaW50PjsKKyAgLy8gSGVscGVycyB0byByZWN1cnNpdmVseSBhZGQgcGFydGljdWxhciBkZXNjcmlwdG9ycyBhbmQgYWxsIHRoZWlyIGNvbnRlbnRzCisgIC8vIHRvIHRoZSBpbmRleC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZpbGVQcm90bz4KKyAgYm9vbCBBZGRGaWxlKGNvbnN0IEZpbGVQcm90byYgZmlsZSwgVmFsdWUgdmFsdWUpOworCisgIFZhbHVlIEZpbmRGaWxlKFN0cmluZ1BpZWNlIGZpbGVuYW1lKTsKKyAgVmFsdWUgRmluZFN5bWJvbChTdHJpbmdQaWVjZSBuYW1lKTsKKyAgVmFsdWUgRmluZFN5bWJvbE9ubHlGbGF0KFN0cmluZ1BpZWNlIG5hbWUpIGNvbnN0OworICBWYWx1ZSBGaW5kRXh0ZW5zaW9uKFN0cmluZ1BpZWNlIGNvbnRhaW5pbmdfdHlwZSwgaW50IGZpZWxkX251bWJlcik7CisgIGJvb2wgRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoU3RyaW5nUGllY2UgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCk7CisgIHZvaWQgRmluZEFsbEZpbGVOYW1lcyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dHB1dCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTsKKworICBib29sIEFkZFN5bWJvbChTdHJpbmdQaWVjZSBzeW1ib2wpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXNjUHJvdG8+CisgIGJvb2wgQWRkTmVzdGVkRXh0ZW5zaW9ucyhTdHJpbmdQaWVjZSBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NQcm90byYgbWVzc2FnZV90eXBlKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZpZWxkUHJvdG8+CisgIGJvb2wgQWRkRXh0ZW5zaW9uKFN0cmluZ1BpZWNlIGZpbGVuYW1lLCBjb25zdCBGaWVsZFByb3RvJiBmaWVsZCk7CisKKyAgLy8gQWxsIHRoZSBtYXBzIGJlbG93IGhhdmUgdHdvIHJlcHJlc2VudGF0aW9uczoKKyAgLy8gIC0gYSBzdGQ6OnNldDw+IHdoZXJlIHdlIGluc2VydCBpbml0aWFsbHkuCisgIC8vICAtIGEgc3RkOjp2ZWN0b3I8PiB3aGVyZSB3ZSBmbGF0dGVuIHRoZSBzdHJ1Y3R1cmUgb24gZGVtYW5kLgorICAvLyBUaGUgaW5pdGlhbCB0cmVlIGhlbHBzIGF2b2lkIE8oTikgYmVoYXZpb3Igb2YgaW5zZXJ0aW5nIGludG8gYSBzb3J0ZWQKKyAgLy8gdmVjdG9yLCB3aGlsZSB0aGUgdmVjdG9yIHJlZHVjZXMgdGhlIGhlYXAgcmVxdWlyZW1lbnRzIG9mIHRoZSBkYXRhCisgIC8vIHN0cnVjdHVyZS4KKworICB2b2lkIEVuc3VyZUZsYXQoKTsKKworICB1c2luZyBTdHJpbmcgPSBzdGQ6OnN0cmluZzsKKworICBTdHJpbmcgRW5jb2RlU3RyaW5nKFN0cmluZ1BpZWNlIHN0cikgY29uc3QgeyByZXR1cm4gU3RyaW5nKHN0cik7IH0KKyAgU3RyaW5nUGllY2UgRGVjb2RlU3RyaW5nKGNvbnN0IFN0cmluZyYgc3RyLCBpbnQpIGNvbnN0IHsgcmV0dXJuIHN0cjsgfQorCisgIHN0cnVjdCBFbmNvZGVkRW50cnkgeworICAgIC8vIERvIG5vdCB1c2UgYFZhbHVlYCBoZXJlIHRvIGF2b2lkIHRoZSBwYWRkaW5nIG9mIHRoYXQgb2JqZWN0LgorICAgIGNvbnN0IHZvaWQqIGRhdGE7CisgICAgaW50IHNpemU7CisgICAgLy8gS2VlcCB0aGUgcGFja2FnZSBoZXJlIGluc3RlYWQgb2YgZWFjaCBTeW1ib2xFbnRyeSB0byBzYXZlIHNwYWNlLgorICAgIFN0cmluZyBlbmNvZGVkX3BhY2thZ2U7CisKKyAgICBWYWx1ZSB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHtkYXRhLCBzaXplfTsgfQorICB9OworICBzdGQ6OnZlY3RvcjxFbmNvZGVkRW50cnk+IGFsbF92YWx1ZXNfOworCisgIHN0cnVjdCBGaWxlRW50cnkgeworICAgIGludCBkYXRhX29mZnNldDsKKyAgICBTdHJpbmcgZW5jb2RlZF9uYW1lOworCisgICAgU3RyaW5nUGllY2UgbmFtZShjb25zdCBEZXNjcmlwdG9ySW5kZXgmIGluZGV4KSBjb25zdCB7CisgICAgICByZXR1cm4gaW5kZXguRGVjb2RlU3RyaW5nKGVuY29kZWRfbmFtZSwgZGF0YV9vZmZzZXQpOworICAgIH0KKyAgfTsKKyAgc3RydWN0IEZpbGVDb21wYXJlIHsKKyAgICBjb25zdCBEZXNjcmlwdG9ySW5kZXgmIGluZGV4OworCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEZpbGVFbnRyeSYgYSwgY29uc3QgRmlsZUVudHJ5JiBiKSBjb25zdCB7CisgICAgICByZXR1cm4gYS5uYW1lKGluZGV4KSA8IGIubmFtZShpbmRleCk7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBGaWxlRW50cnkmIGEsIFN0cmluZ1BpZWNlIGIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBhLm5hbWUoaW5kZXgpIDwgYjsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvcigpKFN0cmluZ1BpZWNlIGEsIGNvbnN0IEZpbGVFbnRyeSYgYikgY29uc3QgeworICAgICAgcmV0dXJuIGEgPCBiLm5hbWUoaW5kZXgpOworICAgIH0KKyAgfTsKKyAgc3RkOjpzZXQ8RmlsZUVudHJ5LCBGaWxlQ29tcGFyZT4gYnlfbmFtZV97RmlsZUNvbXBhcmV7KnRoaXN9fTsKKyAgc3RkOjp2ZWN0b3I8RmlsZUVudHJ5PiBieV9uYW1lX2ZsYXRfOworCisgIHN0cnVjdCBTeW1ib2xFbnRyeSB7CisgICAgaW50IGRhdGFfb2Zmc2V0OworICAgIFN0cmluZyBlbmNvZGVkX3N5bWJvbDsKKworICAgIFN0cmluZ1BpZWNlIHBhY2thZ2UoY29uc3QgRGVzY3JpcHRvckluZGV4JiBpbmRleCkgY29uc3QgeworICAgICAgcmV0dXJuIGluZGV4LkRlY29kZVN0cmluZyhpbmRleC5hbGxfdmFsdWVzX1tkYXRhX29mZnNldF0uZW5jb2RlZF9wYWNrYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCk7CisgICAgfQorICAgIFN0cmluZ1BpZWNlIHN5bWJvbChjb25zdCBEZXNjcmlwdG9ySW5kZXgmIGluZGV4KSBjb25zdCB7CisgICAgICByZXR1cm4gaW5kZXguRGVjb2RlU3RyaW5nKGVuY29kZWRfc3ltYm9sLCBkYXRhX29mZnNldCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgQXNTdHJpbmcoY29uc3QgRGVzY3JpcHRvckluZGV4JiBpbmRleCkgY29uc3QgeworICAgICAgYXV0byBwID0gcGFja2FnZShpbmRleCk7CisgICAgICByZXR1cm4gU3RyQ2F0KHAsIHAuZW1wdHkoKSA/ICIiIDogIi4iLCBzeW1ib2woaW5kZXgpKTsKKyAgICB9CisgIH07CisKKyAgc3RydWN0IFN5bWJvbENvbXBhcmUgeworICAgIGNvbnN0IERlc2NyaXB0b3JJbmRleCYgaW5kZXg7CisKKyAgICBzdGQ6OnN0cmluZyBBc1N0cmluZyhjb25zdCBTeW1ib2xFbnRyeSYgZW50cnkpIGNvbnN0IHsKKyAgICAgIHJldHVybiBlbnRyeS5Bc1N0cmluZyhpbmRleCk7CisgICAgfQorICAgIHN0YXRpYyBTdHJpbmdQaWVjZSBBc1N0cmluZyhTdHJpbmdQaWVjZSBzdHIpIHsgcmV0dXJuIHN0cjsgfQorCisgICAgc3RkOjpwYWlyPFN0cmluZ1BpZWNlLCBTdHJpbmdQaWVjZT4gR2V0UGFydHMoCisgICAgICAgIGNvbnN0IFN5bWJvbEVudHJ5JiBlbnRyeSkgY29uc3QgeworICAgICAgYXV0byBwYWNrYWdlID0gZW50cnkucGFja2FnZShpbmRleCk7CisgICAgICBpZiAocGFja2FnZS5lbXB0eSgpKSByZXR1cm4ge2VudHJ5LnN5bWJvbChpbmRleCksIFN0cmluZ1BpZWNle319OworICAgICAgcmV0dXJuIHtwYWNrYWdlLCBlbnRyeS5zeW1ib2woaW5kZXgpfTsKKyAgICB9CisgICAgc3RkOjpwYWlyPFN0cmluZ1BpZWNlLCBTdHJpbmdQaWVjZT4gR2V0UGFydHMoCisgICAgICAgIFN0cmluZ1BpZWNlIHN0cikgY29uc3QgeworICAgICAgcmV0dXJuIHtzdHIsIHt9fTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCYgbGhzLCBjb25zdCBVJiByaHMpIGNvbnN0IHsKKyAgICAgIGF1dG8gbGhzX3BhcnRzID0gR2V0UGFydHMobGhzKTsKKyAgICAgIGF1dG8gcmhzX3BhcnRzID0gR2V0UGFydHMocmhzKTsKKworICAgICAgLy8gRmFzdCBwYXRoIHRvIGF2b2lkIG1ha2luZyB0aGUgd2hvbGUgc3RyaW5nIGZvciBjb21tb24gY2FzZXMuCisgICAgICBpZiAoaW50IHJlcyA9CisgICAgICAgICAgICAgIGxoc19wYXJ0cy5maXJzdC5zdWJzdHIoMCwgcmhzX3BhcnRzLmZpcnN0LnNpemUoKSkKKyAgICAgICAgICAgICAgICAgIC5jb21wYXJlKHJoc19wYXJ0cy5maXJzdC5zdWJzdHIoMCwgbGhzX3BhcnRzLmZpcnN0LnNpemUoKSkpKSB7CisgICAgICAgIC8vIElmIHRoZSBwYWNrYWdlcyBhbHJlYWR5IGRpZmZlciwgZXhpdCBlYXJseS4KKyAgICAgICAgcmV0dXJuIHJlcyA8IDA7CisgICAgICB9IGVsc2UgaWYgKGxoc19wYXJ0cy5maXJzdC5zaXplKCkgPT0gcmhzX3BhcnRzLmZpcnN0LnNpemUoKSkgeworICAgICAgICByZXR1cm4gbGhzX3BhcnRzLnNlY29uZCA8IHJoc19wYXJ0cy5zZWNvbmQ7CisgICAgICB9CisgICAgICByZXR1cm4gQXNTdHJpbmcobGhzKSA8IEFzU3RyaW5nKHJocyk7CisgICAgfQorICB9OworICBzdGQ6OnNldDxTeW1ib2xFbnRyeSwgU3ltYm9sQ29tcGFyZT4gYnlfc3ltYm9sX3tTeW1ib2xDb21wYXJleyp0aGlzfX07CisgIHN0ZDo6dmVjdG9yPFN5bWJvbEVudHJ5PiBieV9zeW1ib2xfZmxhdF87CisKKyAgc3RydWN0IEV4dGVuc2lvbkVudHJ5IHsKKyAgICBpbnQgZGF0YV9vZmZzZXQ7CisgICAgU3RyaW5nIGVuY29kZWRfZXh0ZW5kZWU7CisgICAgU3RyaW5nUGllY2UgZXh0ZW5kZWUoY29uc3QgRGVzY3JpcHRvckluZGV4JiBpbmRleCkgY29uc3QgeworICAgICAgcmV0dXJuIGluZGV4LkRlY29kZVN0cmluZyhlbmNvZGVkX2V4dGVuZGVlLCBkYXRhX29mZnNldCkuc3Vic3RyKDEpOworICAgIH0KKyAgICBpbnQgZXh0ZW5zaW9uX251bWJlcjsKKyAgfTsKKyAgc3RydWN0IEV4dGVuc2lvbkNvbXBhcmUgeworICAgIGNvbnN0IERlc2NyaXB0b3JJbmRleCYgaW5kZXg7CisKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgRXh0ZW5zaW9uRW50cnkmIGEsIGNvbnN0IEV4dGVuc2lvbkVudHJ5JiBiKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3R1cGxlKGEuZXh0ZW5kZWUoaW5kZXgpLCBhLmV4dGVuc2lvbl9udW1iZXIpIDwKKyAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoYi5leHRlbmRlZShpbmRleCksIGIuZXh0ZW5zaW9uX251bWJlcik7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBFeHRlbnNpb25FbnRyeSYgYSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp0dXBsZTxTdHJpbmdQaWVjZSwgaW50PiBiKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3R1cGxlKGEuZXh0ZW5kZWUoaW5kZXgpLCBhLmV4dGVuc2lvbl9udW1iZXIpIDwgYjsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvcigpKHN0ZDo6dHVwbGU8U3RyaW5nUGllY2UsIGludD4gYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5zaW9uRW50cnkmIGIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBhIDwgc3RkOjptYWtlX3R1cGxlKGIuZXh0ZW5kZWUoaW5kZXgpLCBiLmV4dGVuc2lvbl9udW1iZXIpOworICAgIH0KKyAgfTsKKyAgc3RkOjpzZXQ8RXh0ZW5zaW9uRW50cnksIEV4dGVuc2lvbkNvbXBhcmU+IGJ5X2V4dGVuc2lvbl97CisgICAgICBFeHRlbnNpb25Db21wYXJleyp0aGlzfX07CisgIHN0ZDo6dmVjdG9yPEV4dGVuc2lvbkVudHJ5PiBieV9leHRlbnNpb25fZmxhdF87Cit9OworCitib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkFkZChjb25zdCB2b2lkKiBlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgaWYgKGZpbGUuUGFyc2VGcm9tQXJyYXkoZW5jb2RlZF9maWxlX2Rlc2NyaXB0b3IsIHNpemUpKSB7CisgICAgcmV0dXJuIGluZGV4Xy0+QWRkRmlsZShmaWxlLCBzdGQ6Om1ha2VfcGFpcihlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgc2l6ZSkpOworICB9IGVsc2UgeworICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJJbnZhbGlkIGZpbGUgZGVzY3JpcHRvciBkYXRhIHBhc3NlZCB0byAiCisgICAgICAgICAgICAgICAgICAiRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6QWRkKCkuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpBZGRDb3B5KGNvbnN0IHZvaWQqIGVuY29kZWRfZmlsZV9kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSB7CisgIHZvaWQqIGNvcHkgPSBvcGVyYXRvciBuZXcoc2l6ZSk7CisgIG1lbWNweShjb3B5LCBlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgc2l6ZSk7CisgIGZpbGVzX3RvX2RlbGV0ZV8ucHVzaF9iYWNrKGNvcHkpOworICByZXR1cm4gQWRkKGNvcHksIHNpemUpOworfQorCitib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIHJldHVybiBNYXliZVBhcnNlKGluZGV4Xy0+RmluZEZpbGUoZmlsZW5hbWUpLCBvdXRwdXQpOworfQorCitib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9sX25hbWUsIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICByZXR1cm4gTWF5YmVQYXJzZShpbmRleF8tPkZpbmRTeW1ib2woc3ltYm9sX25hbWUpLCBvdXRwdXQpOworfQorCitib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmROYW1lT2ZGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9sX25hbWUsIHN0ZDo6c3RyaW5nKiBvdXRwdXQpIHsKKyAgYXV0byBlbmNvZGVkX2ZpbGUgPSBpbmRleF8tPkZpbmRTeW1ib2woc3ltYm9sX25hbWUpOworICBpZiAoZW5jb2RlZF9maWxlLmZpcnN0ID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKworICAvLyBPcHRpbWl6YXRpb246ICBUaGUgbmFtZSBzaG91bGQgYmUgdGhlIGZpcnN0IGZpZWxkIGluIHRoZSBlbmNvZGVkIG1lc3NhZ2UuCisgIC8vICAgVHJ5IHRvIGp1c3QgcmVhZCBpdCBkaXJlY3RseS4KKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGVuY29kZWRfZmlsZS5maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRfZmlsZS5zZWNvbmQpOworCisgIGNvbnN0IHVpbnQzMl90IGtOYW1lVGFnID0gaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlciwKKyAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisKKyAgaWYgKGlucHV0LlJlYWRUYWdOb0xhc3RUYWcoKSA9PSBrTmFtZVRhZykgeworICAgIC8vIFN1Y2Nlc3MhCisgICAgcmV0dXJuIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygmaW5wdXQsIG91dHB1dCk7CisgIH0gZWxzZSB7CisgICAgLy8gU2xvdyBwYXRoLiAgUGFyc2Ugd2hvbGUgbWVzc2FnZS4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgICAgaWYgKCFmaWxlX3Byb3RvLlBhcnNlRnJvbUFycmF5KGVuY29kZWRfZmlsZS5maXJzdCwgZW5jb2RlZF9maWxlLnNlY29uZCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgKm91dHB1dCA9IGZpbGVfcHJvdG8ubmFtZSgpOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK2Jvb2wgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250YWluaW5nX3R5cGUsIGludCBmaWVsZF9udW1iZXIsCisgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIHJldHVybiBNYXliZVBhcnNlKGluZGV4Xy0+RmluZEV4dGVuc2lvbihjb250YWluaW5nX3R5cGUsIGZpZWxkX251bWJlciksCisgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7Cit9CisKK2Jvb2wgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4dGVuZGVlX3R5cGUsIHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgeworICByZXR1cm4gaW5kZXhfLT5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhleHRlbmRlZV90eXBlLCBvdXRwdXQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmlsZVByb3RvPgorYm9vbCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg6OkFkZEZpbGUoY29uc3QgRmlsZVByb3RvJiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgdmFsdWUpIHsKKyAgLy8gV2UgcHVzaCBgdmFsdWVgIGludG8gdGhlIGFycmF5IGZpcnN0LiBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHRoZSBBZGRYWFgKKyAgLy8gZnVuY3Rpb25zIGJlbG93IHdpbGwgZXhwZWN0IGl0IHRvIGJlIHRoZXJlLgorICBhbGxfdmFsdWVzXy5wdXNoX2JhY2soe3ZhbHVlLmZpcnN0LCB2YWx1ZS5zZWNvbmQsIHt9fSk7CisKKyAgaWYgKCFWYWxpZGF0ZVN5bWJvbE5hbWUoZmlsZS5wYWNrYWdlKCkpKSB7CisgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkludmFsaWQgcGFja2FnZSBuYW1lOiAiIDw8IGZpbGUucGFja2FnZSgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBhbGxfdmFsdWVzXy5iYWNrKCkuZW5jb2RlZF9wYWNrYWdlID0gRW5jb2RlU3RyaW5nKGZpbGUucGFja2FnZSgpKTsKKworICBpZiAoIUluc2VydElmTm90UHJlc2VudCgKKyAgICAgICAgICAmYnlfbmFtZV8sIEZpbGVFbnRyeXtzdGF0aWNfY2FzdDxpbnQ+KGFsbF92YWx1ZXNfLnNpemUoKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZVN0cmluZyhmaWxlLm5hbWUoKSl9KSB8fAorICAgICAgc3RkOjpiaW5hcnlfc2VhcmNoKGJ5X25hbWVfZmxhdF8uYmVnaW4oKSwgYnlfbmFtZV9mbGF0Xy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUoKSwgYnlfbmFtZV8ua2V5X2NvbXAoKSkpIHsKKyAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRmlsZSBhbHJlYWR5IGV4aXN0cyBpbiBkYXRhYmFzZTogIiA8PCBmaWxlLm5hbWUoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmb3IgKGNvbnN0IGF1dG8mIG1lc3NhZ2VfdHlwZSA6IGZpbGUubWVzc2FnZV90eXBlKCkpIHsKKyAgICBpZiAoIUFkZFN5bWJvbChtZXNzYWdlX3R5cGUubmFtZSgpKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICghQWRkTmVzdGVkRXh0ZW5zaW9ucyhmaWxlLm5hbWUoKSwgbWVzc2FnZV90eXBlKSkgcmV0dXJuIGZhbHNlOworICB9CisgIGZvciAoY29uc3QgYXV0byYgZW51bV90eXBlIDogZmlsZS5lbnVtX3R5cGUoKSkgeworICAgIGlmICghQWRkU3ltYm9sKGVudW1fdHlwZS5uYW1lKCkpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChjb25zdCBhdXRvJiBleHRlbnNpb24gOiBmaWxlLmV4dGVuc2lvbigpKSB7CisgICAgaWYgKCFBZGRTeW1ib2woZXh0ZW5zaW9uLm5hbWUoKSkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIUFkZEV4dGVuc2lvbihmaWxlLm5hbWUoKSwgZXh0ZW5zaW9uKSkgcmV0dXJuIGZhbHNlOworICB9CisgIGZvciAoY29uc3QgYXV0byYgc2VydmljZSA6IGZpbGUuc2VydmljZSgpKSB7CisgICAgaWYgKCFBZGRTeW1ib2woc2VydmljZS5uYW1lKCkpKSByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXIsIHR5cGVuYW1lIEl0ZXIyLCB0eXBlbmFtZSBJbmRleD4KK3N0YXRpYyBib29sIENoZWNrRm9yTXV0dWFsU3Vic3ltYm9scyhTdHJpbmdQaWVjZSBzeW1ib2xfbmFtZSwgSXRlciogaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyMiBlbmQsIGNvbnN0IEluZGV4JiBpbmRleCkgeworICBpZiAoKml0ZXIgIT0gZW5kKSB7CisgICAgaWYgKElzU3ViU3ltYm9sKCgqaXRlciktPkFzU3RyaW5nKGluZGV4KSwgc3ltYm9sX25hbWUpKSB7CisgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiU3ltYm9sIG5hbWUgXCIiIDw8IHN5bWJvbF9uYW1lCisgICAgICAgICAgICAgICAgIDw8ICJcIiBjb25mbGljdHMgd2l0aCB0aGUgZXhpc3Rpbmcgc3ltYm9sIFwiIgorICAgICAgICAgICAgICAgICA8PCAoKml0ZXIpLT5Bc1N0cmluZyhpbmRleCkgPDwgIlwiLiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gT0ssIHRoYXQgd29ya2VkLiAgTm93IHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgbm8gc3ltYm9sIGluIHRoZSBtYXAgaXMKKyAgICAvLyBhIHN1Yi1zeW1ib2wgb2YgdGhlIG9uZSB3ZSBhcmUgaW5zZXJ0aW5nLiAgVGhlIG9ubHkgc3ltYm9sIHdoaWNoIGNvdWxkCisgICAgLy8gYmUgc28gaXMgdGhlIGZpcnN0IHN5bWJvbCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbmV3IHN5bWJvbC4gIFNpbmNlCisgICAgLy8gfGl0ZXJ8IHBvaW50cyBhdCB0aGUgbGFzdCBzeW1ib2wgdGhhdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwsIHdlIGp1c3QgaGF2ZQorICAgIC8vIHRvIGluY3JlbWVudCBpdC4KKyAgICArKyppdGVyOworCisgICAgaWYgKCppdGVyICE9IGVuZCAmJiBJc1N1YlN5bWJvbChzeW1ib2xfbmFtZSwgKCppdGVyKS0+QXNTdHJpbmcoaW5kZXgpKSkgeworICAgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIlN5bWJvbCBuYW1lIFwiIiA8PCBzeW1ib2xfbmFtZQorICAgICAgICAgICAgICAgICA8PCAiXCIgY29uZmxpY3RzIHdpdGggdGhlIGV4aXN0aW5nIHN5bWJvbCBcIiIKKyAgICAgICAgICAgICAgICAgPDwgKCppdGVyKS0+QXNTdHJpbmcoaW5kZXgpIDw8ICJcIi4iOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg6OkFkZFN5bWJvbCgKKyAgICBTdHJpbmdQaWVjZSBzeW1ib2wpIHsKKyAgU3ltYm9sRW50cnkgZW50cnkgPSB7c3RhdGljX2Nhc3Q8aW50PihhbGxfdmFsdWVzXy5zaXplKCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RlU3RyaW5nKHN5bWJvbCl9OworICBzdGQ6OnN0cmluZyBlbnRyeV9hc19zdHJpbmcgPSBlbnRyeS5Bc1N0cmluZygqdGhpcyk7CisKKyAgLy8gV2UgbmVlZCB0byBtYWtlIHN1cmUgbm90IHRvIHZpb2xhdGUgb3VyIG1hcCBpbnZhcmlhbnQuCisKKyAgLy8gSWYgdGhlIHN5bWJvbCBuYW1lIGlzIGludmFsaWQgaXQgY291bGQgYnJlYWsgb3VyIGxvb2t1cCBhbGdvcml0aG0gKHdoaWNoCisgIC8vIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0ICcuJyBzb3J0cyBiZWZvcmUgYWxsIG90aGVyIGNoYXJhY3RlcnMgdGhhdCBhcmUKKyAgLy8gdmFsaWQgaW4gc3ltYm9sIG5hbWVzKS4KKyAgaWYgKCFWYWxpZGF0ZVN5bWJvbE5hbWUoc3ltYm9sKSkgeworICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJJbnZhbGlkIHN5bWJvbCBuYW1lOiAiIDw8IGVudHJ5X2FzX3N0cmluZzsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBhdXRvIGl0ZXIgPSBGaW5kTGFzdExlc3NPckVxdWFsKCZieV9zeW1ib2xfLCBlbnRyeSk7CisgIGlmICghQ2hlY2tGb3JNdXR1YWxTdWJzeW1ib2xzKGVudHJ5X2FzX3N0cmluZywgJml0ZXIsIGJ5X3N5bWJvbF8uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aGlzKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFNhbWUsIGJ1dCBvbiBieV9zeW1ib2xfZmxhdF8KKyAgYXV0byBmbGF0X2l0ZXIgPQorICAgICAgRmluZExhc3RMZXNzT3JFcXVhbCgmYnlfc3ltYm9sX2ZsYXRfLCBlbnRyeSwgYnlfc3ltYm9sXy5rZXlfY29tcCgpKTsKKyAgaWYgKCFDaGVja0Zvck11dHVhbFN1YnN5bWJvbHMoZW50cnlfYXNfc3RyaW5nLCAmZmxhdF9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieV9zeW1ib2xfZmxhdF8uZW5kKCksICp0aGlzKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIE9LLCBubyBjb25mbGljdHMuCisKKyAgLy8gSW5zZXJ0IHRoZSBuZXcgc3ltYm9sIHVzaW5nIHRoZSBpdGVyYXRvciBhcyBhIGhpbnQsIHRoZSBuZXcgZW50cnkgd2lsbAorICAvLyBhcHBlYXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBvbmUgdGhlIGl0ZXJhdG9yIGlzIHBvaW50aW5nIGF0LgorICBieV9zeW1ib2xfLmluc2VydChpdGVyLCBlbnRyeSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXNjUHJvdG8+Citib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDo6QWRkTmVzdGVkRXh0ZW5zaW9ucygKKyAgICBTdHJpbmdQaWVjZSBmaWxlbmFtZSwgY29uc3QgRGVzY1Byb3RvJiBtZXNzYWdlX3R5cGUpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBuZXN0ZWRfdHlwZSA6IG1lc3NhZ2VfdHlwZS5uZXN0ZWRfdHlwZSgpKSB7CisgICAgaWYgKCFBZGROZXN0ZWRFeHRlbnNpb25zKGZpbGVuYW1lLCBuZXN0ZWRfdHlwZSkpIHJldHVybiBmYWxzZTsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIGV4dGVuc2lvbiA6IG1lc3NhZ2VfdHlwZS5leHRlbnNpb24oKSkgeworICAgIGlmICghQWRkRXh0ZW5zaW9uKGZpbGVuYW1lLCBleHRlbnNpb24pKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGaWVsZFByb3RvPgorYm9vbCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg6OkFkZEV4dGVuc2lvbigKKyAgICBTdHJpbmdQaWVjZSBmaWxlbmFtZSwgY29uc3QgRmllbGRQcm90byYgZmllbGQpIHsKKyAgaWYgKCFmaWVsZC5leHRlbmRlZSgpLmVtcHR5KCkgJiYgZmllbGQuZXh0ZW5kZWUoKVswXSA9PSAnLicpIHsKKyAgICAvLyBUaGUgZXh0ZW5zaW9uIGlzIGZ1bGx5LXF1YWxpZmllZC4gIFdlIGNhbiB1c2UgaXQgYXMgYSBsb29rdXAga2V5IGluCisgICAgLy8gdGhlIGJ5X3N5bWJvbF8gdGFibGUuCisgICAgaWYgKCFJbnNlcnRJZk5vdFByZXNlbnQoCisgICAgICAgICAgICAmYnlfZXh0ZW5zaW9uXywKKyAgICAgICAgICAgIEV4dGVuc2lvbkVudHJ5e3N0YXRpY19jYXN0PGludD4oYWxsX3ZhbHVlc18uc2l6ZSgpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGVTdHJpbmcoZmllbGQuZXh0ZW5kZWUoKSksIGZpZWxkLm51bWJlcigpfSkgfHwKKyAgICAgICAgc3RkOjpiaW5hcnlfc2VhcmNoKAorICAgICAgICAgICAgYnlfZXh0ZW5zaW9uX2ZsYXRfLmJlZ2luKCksIGJ5X2V4dGVuc2lvbl9mbGF0Xy5lbmQoKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGZpZWxkLmV4dGVuZGVlKCkuc3Vic3RyKDEpLCBmaWVsZC5udW1iZXIoKSksCisgICAgICAgICAgICBieV9leHRlbnNpb25fLmtleV9jb21wKCkpKSB7CisgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRXh0ZW5zaW9uIGNvbmZsaWN0cyB3aXRoIGV4dGVuc2lvbiBhbHJlYWR5IGluIGRhdGFiYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICJleHRlbmQgIgorICAgICAgICAgICAgICAgICA8PCBmaWVsZC5leHRlbmRlZSgpIDw8ICIgeyAiIDw8IGZpZWxkLm5hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCBmaWVsZC5udW1iZXIoKSA8PCAiIH0gZnJvbToiIDw8IGZpbGVuYW1lOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBOb3QgZnVsbHktcXVhbGlmaWVkLiAgV2UgY2FuJ3QgcmVhbGx5IGRvIGFueXRoaW5nIGhlcmUsIHVuZm9ydHVuYXRlbHkuCisgICAgLy8gV2UgZG9uJ3QgY29uc2lkZXIgdGhpcyBhbiBlcnJvciwgdGhvdWdoLCBiZWNhdXNlIHRoZSBkZXNjcmlwdG9yIGlzCisgICAgLy8gdmFsaWQuCisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0ZDo6cGFpcjxjb25zdCB2b2lkKiwgaW50PgorRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4OjpGaW5kU3ltYm9sKFN0cmluZ1BpZWNlIG5hbWUpIHsKKyAgRW5zdXJlRmxhdCgpOworICByZXR1cm4gRmluZFN5bWJvbE9ubHlGbGF0KG5hbWUpOworfQorCitzdGQ6OnBhaXI8Y29uc3Qgdm9pZCosIGludD4KK0VuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDo6RmluZFN5bWJvbE9ubHlGbGF0KAorICAgIFN0cmluZ1BpZWNlIG5hbWUpIGNvbnN0IHsKKyAgYXV0byBpdGVyID0KKyAgICAgIEZpbmRMYXN0TGVzc09yRXF1YWwoJmJ5X3N5bWJvbF9mbGF0XywgbmFtZSwgYnlfc3ltYm9sXy5rZXlfY29tcCgpKTsKKworICByZXR1cm4gaXRlciAhPSBieV9zeW1ib2xfZmxhdF8uZW5kKCkgJiYKKyAgICAgICAgICAgICAgICAgSXNTdWJTeW1ib2woaXRlci0+QXNTdHJpbmcoKnRoaXMpLCBuYW1lKQorICAgICAgICAgICAgID8gYWxsX3ZhbHVlc19baXRlci0+ZGF0YV9vZmZzZXRdLnZhbHVlKCkKKyAgICAgICAgICAgICA6IFZhbHVlKCk7Cit9CisKK3N0ZDo6cGFpcjxjb25zdCB2b2lkKiwgaW50PgorRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4OjpGaW5kRXh0ZW5zaW9uKAorICAgIFN0cmluZ1BpZWNlIGNvbnRhaW5pbmdfdHlwZSwgaW50IGZpZWxkX251bWJlcikgeworICBFbnN1cmVGbGF0KCk7CisKKyAgYXV0byBpdCA9IHN0ZDo6bG93ZXJfYm91bmQoCisgICAgICBieV9leHRlbnNpb25fZmxhdF8uYmVnaW4oKSwgYnlfZXh0ZW5zaW9uX2ZsYXRfLmVuZCgpLAorICAgICAgc3RkOjptYWtlX3R1cGxlKGNvbnRhaW5pbmdfdHlwZSwgZmllbGRfbnVtYmVyKSwgYnlfZXh0ZW5zaW9uXy5rZXlfY29tcCgpKTsKKyAgcmV0dXJuIGl0ID09IGJ5X2V4dGVuc2lvbl9mbGF0Xy5lbmQoKSB8fAorICAgICAgICAgICAgICAgICBpdC0+ZXh0ZW5kZWUoKnRoaXMpICE9IGNvbnRhaW5pbmdfdHlwZSB8fAorICAgICAgICAgICAgICAgICBpdC0+ZXh0ZW5zaW9uX251bWJlciAhPSBmaWVsZF9udW1iZXIKKyAgICAgICAgICAgICA/IHN0ZDo6bWFrZV9wYWlyKG51bGxwdHIsIDApCisgICAgICAgICAgICAgOiBhbGxfdmFsdWVzX1tpdC0+ZGF0YV9vZmZzZXRdLnZhbHVlKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBMZXNzPgorc3RhdGljIHZvaWQgTWVyZ2VJbnRvRmxhdChzdGQ6OnNldDxULCBMZXNzPiogcywgc3RkOjp2ZWN0b3I8VD4qIGZsYXQpIHsKKyAgaWYgKHMtPmVtcHR5KCkpIHJldHVybjsKKyAgc3RkOjp2ZWN0b3I8VD4gbmV3X2ZsYXQocy0+c2l6ZSgpICsgZmxhdC0+c2l6ZSgpKTsKKyAgc3RkOjptZXJnZShzLT5iZWdpbigpLCBzLT5lbmQoKSwgZmxhdC0+YmVnaW4oKSwgZmxhdC0+ZW5kKCksICZuZXdfZmxhdFswXSwKKyAgICAgICAgICAgICBzLT5rZXlfY29tcCgpKTsKKyAgKmZsYXQgPSBzdGQ6Om1vdmUobmV3X2ZsYXQpOworICBzLT5jbGVhcigpOworfQorCit2b2lkIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDo6RW5zdXJlRmxhdCgpIHsKKyAgYWxsX3ZhbHVlc18uc2hyaW5rX3RvX2ZpdCgpOworICAvLyBNZXJnZSBlYWNoIG9mIHRoZSBzZXRzIGludG8gdGhlaXIgZmxhdCBjb3VudGVycGFydC4KKyAgTWVyZ2VJbnRvRmxhdCgmYnlfbmFtZV8sICZieV9uYW1lX2ZsYXRfKTsKKyAgTWVyZ2VJbnRvRmxhdCgmYnlfc3ltYm9sXywgJmJ5X3N5bWJvbF9mbGF0Xyk7CisgIE1lcmdlSW50b0ZsYXQoJmJ5X2V4dGVuc2lvbl8sICZieV9leHRlbnNpb25fZmxhdF8pOworfQorCitib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDo6RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoCisgICAgU3RyaW5nUGllY2UgY29udGFpbmluZ190eXBlLCBzdGQ6OnZlY3RvcjxpbnQ+KiBvdXRwdXQpIHsKKyAgRW5zdXJlRmxhdCgpOworCisgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICBhdXRvIGl0ID0gc3RkOjpsb3dlcl9ib3VuZCgKKyAgICAgIGJ5X2V4dGVuc2lvbl9mbGF0Xy5iZWdpbigpLCBieV9leHRlbnNpb25fZmxhdF8uZW5kKCksCisgICAgICBzdGQ6Om1ha2VfdHVwbGUoY29udGFpbmluZ190eXBlLCAwKSwgYnlfZXh0ZW5zaW9uXy5rZXlfY29tcCgpKTsKKyAgZm9yICg7CisgICAgICAgaXQgIT0gYnlfZXh0ZW5zaW9uX2ZsYXRfLmVuZCgpICYmIGl0LT5leHRlbmRlZSgqdGhpcykgPT0gY29udGFpbmluZ190eXBlOworICAgICAgICsraXQpIHsKKyAgICBvdXRwdXQtPnB1c2hfYmFjayhpdC0+ZXh0ZW5zaW9uX251bWJlcik7CisgICAgc3VjY2VzcyA9IHRydWU7CisgIH0KKworICByZXR1cm4gc3VjY2VzczsKK30KKwordm9pZCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg6OkZpbmRBbGxGaWxlTmFtZXMoCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRwdXQpIGNvbnN0IHsKKyAgb3V0cHV0LT5yZXNpemUoYnlfbmFtZV8uc2l6ZSgpICsgYnlfbmFtZV9mbGF0Xy5zaXplKCkpOworICBpbnQgaSA9IDA7CisgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBieV9uYW1lXykgeworICAgICgqb3V0cHV0KVtpXSA9IHN0ZDo6c3RyaW5nKGVudHJ5Lm5hbWUoKnRoaXMpKTsKKyAgICBpKys7CisgIH0KKyAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGJ5X25hbWVfZmxhdF8pIHsKKyAgICAoKm91dHB1dClbaV0gPSBzdGQ6OnN0cmluZyhlbnRyeS5uYW1lKCp0aGlzKSk7CisgICAgaSsrOworICB9Cit9CisKK3N0ZDo6cGFpcjxjb25zdCB2b2lkKiwgaW50PgorRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4OjpGaW5kRmlsZSgKKyAgICBTdHJpbmdQaWVjZSBmaWxlbmFtZSkgeworICBFbnN1cmVGbGF0KCk7CisKKyAgYXV0byBpdCA9IHN0ZDo6bG93ZXJfYm91bmQoYnlfbmFtZV9mbGF0Xy5iZWdpbigpLCBieV9uYW1lX2ZsYXRfLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgYnlfbmFtZV8ua2V5X2NvbXAoKSk7CisgIHJldHVybiBpdCA9PSBieV9uYW1lX2ZsYXRfLmVuZCgpIHx8IGl0LT5uYW1lKCp0aGlzKSAhPSBmaWxlbmFtZQorICAgICAgICAgICAgID8gc3RkOjptYWtlX3BhaXIobnVsbHB0ciwgMCkKKyAgICAgICAgICAgICA6IGFsbF92YWx1ZXNfW2l0LT5kYXRhX29mZnNldF0udmFsdWUoKTsKK30KKworCitib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRBbGxGaWxlTmFtZXMoCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRwdXQpIHsKKyAgaW5kZXhfLT5GaW5kQWxsRmlsZU5hbWVzKG91dHB1dCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6Ok1heWJlUGFyc2UoCisgICAgc3RkOjpwYWlyPGNvbnN0IHZvaWQqLCBpbnQ+IGVuY29kZWRfZmlsZSwgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIGlmIChlbmNvZGVkX2ZpbGUuZmlyc3QgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworICByZXR1cm4gb3V0cHV0LT5QYXJzZUZyb21BcnJheShlbmNvZGVkX2ZpbGUuZmlyc3QsIGVuY29kZWRfZmlsZS5zZWNvbmQpOworfQorCitFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlKCkKKyAgICA6IGluZGV4XyhuZXcgRGVzY3JpcHRvckluZGV4KCkpIHt9CisKK0VuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6On5FbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlKCkgeworICBmb3IgKHZvaWQqIHAgOiBmaWxlc190b19kZWxldGVfKSB7CisgICAgb3BlcmF0b3IgZGVsZXRlKHApOworICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRGVzY3JpcHRvclBvb2xEYXRhYmFzZTo6RGVzY3JpcHRvclBvb2xEYXRhYmFzZShjb25zdCBEZXNjcmlwdG9yUG9vbCYgcG9vbCkKKyAgICA6IHBvb2xfKHBvb2wpIHt9CitEZXNjcmlwdG9yUG9vbERhdGFiYXNlOjp+RGVzY3JpcHRvclBvb2xEYXRhYmFzZSgpIHt9CisKK2Jvb2wgRGVzY3JpcHRvclBvb2xEYXRhYmFzZTo6RmluZEZpbGVCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sXy5GaW5kRmlsZUJ5TmFtZShmaWxlbmFtZSk7CisgIGlmIChmaWxlID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKyAgb3V0cHV0LT5DbGVhcigpOworICBmaWxlLT5Db3B5VG8ob3V0cHV0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGVzY3JpcHRvclBvb2xEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzeW1ib2xfbmFtZSwgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbF8uRmluZEZpbGVDb250YWluaW5nU3ltYm9sKHN5bWJvbF9uYW1lKTsKKyAgaWYgKGZpbGUgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworICBvdXRwdXQtPkNsZWFyKCk7CisgIGZpbGUtPkNvcHlUbyhvdXRwdXQpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXNjcmlwdG9yUG9vbERhdGFiYXNlOjpGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwgaW50IGZpZWxkX251bWJlciwKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUgPSBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoY29udGFpbmluZ190eXBlKTsKKyAgaWYgKGV4dGVuZGVlID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbiA9CisgICAgICBwb29sXy5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZXh0ZW5kZWUsIGZpZWxkX251bWJlcik7CisgIGlmIChleHRlbnNpb24gPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworCisgIG91dHB1dC0+Q2xlYXIoKTsKKyAgZXh0ZW5zaW9uLT5maWxlKCktPkNvcHlUbyhvdXRwdXQpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXNjcmlwdG9yUG9vbERhdGFiYXNlOjpGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXh0ZW5kZWVfdHlwZSwgc3RkOjp2ZWN0b3I8aW50Piogb3V0cHV0KSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlID0gcG9vbF8uRmluZE1lc3NhZ2VUeXBlQnlOYW1lKGV4dGVuZGVlX3R5cGUpOworICBpZiAoZXh0ZW5kZWUgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGV4dGVuc2lvbnM7CisgIHBvb2xfLkZpbmRBbGxFeHRlbnNpb25zKGV4dGVuZGVlLCAmZXh0ZW5zaW9ucyk7CisKKyAgZm9yIChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbiA6IGV4dGVuc2lvbnMpIHsKKyAgICBvdXRwdXQtPnB1c2hfYmFjayhleHRlbnNpb24tPm51bWJlcigpKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK01lcmdlZERlc2NyaXB0b3JEYXRhYmFzZTo6TWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlKAorICAgIERlc2NyaXB0b3JEYXRhYmFzZSogc291cmNlMSwgRGVzY3JpcHRvckRhdGFiYXNlKiBzb3VyY2UyKSB7CisgIHNvdXJjZXNfLnB1c2hfYmFjayhzb3VyY2UxKTsKKyAgc291cmNlc18ucHVzaF9iYWNrKHNvdXJjZTIpOworfQorTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlOjpNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RGVzY3JpcHRvckRhdGFiYXNlKj4mIHNvdXJjZXMpCisgICAgOiBzb3VyY2VzXyhzb3VyY2VzKSB7fQorTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlOjp+TWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlKCkge30KKworYm9vbCBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgZm9yIChEZXNjcmlwdG9yRGF0YWJhc2UqIHNvdXJjZSA6IHNvdXJjZXNfKSB7CisgICAgaWYgKHNvdXJjZS0+RmluZEZpbGVCeU5hbWUoZmlsZW5hbWUsIG91dHB1dCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbF9uYW1lLCBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzb3VyY2VzXy5zaXplKCk7IGkrKykgeworICAgIGlmIChzb3VyY2VzX1tpXS0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKHN5bWJvbF9uYW1lLCBvdXRwdXQpKSB7CisgICAgICAvLyBUaGUgc3ltYm9sIHdhcyBmb3VuZCBpbiBzb3VyY2UgaS4gIEhvd2V2ZXIsIGlmIG9uZSBvZiB0aGUgcHJldmlvdXMKKyAgICAgIC8vIHNvdXJjZXMgZGVmaW5lcyBhIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lICh3aGljaCBwcmVzdW1hYmx5IGRvZXNuJ3QKKyAgICAgIC8vIGNvbnRhaW4gdGhlIHN5bWJvbCwgc2luY2UgaXQgd2Fzbid0IGZvdW5kIGluIHRoYXQgc291cmNlKSwgdGhlbiB3ZQorICAgICAgLy8gbXVzdCBoaWRlIGl0IGZyb20gdGhlIGNhbGxlci4KKyAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gdGVtcDsKKyAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgIGlmIChzb3VyY2VzX1tqXS0+RmluZEZpbGVCeU5hbWUob3V0cHV0LT5uYW1lKCksICZ0ZW1wKSkgeworICAgICAgICAgIC8vIEZvdW5kIGNvbmZsaWN0aW5nIGZpbGUgaW4gYSBwcmV2aW91cyBzb3VyY2UuCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250YWluaW5nX3R5cGUsIGludCBmaWVsZF9udW1iZXIsCisgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc291cmNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoc291cmNlc19baV0tPkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb250YWluaW5nX3R5cGUsIGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpKSB7CisgICAgICAvLyBUaGUgc3ltYm9sIHdhcyBmb3VuZCBpbiBzb3VyY2UgaS4gIEhvd2V2ZXIsIGlmIG9uZSBvZiB0aGUgcHJldmlvdXMKKyAgICAgIC8vIHNvdXJjZXMgZGVmaW5lcyBhIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lICh3aGljaCBwcmVzdW1hYmx5IGRvZXNuJ3QKKyAgICAgIC8vIGNvbnRhaW4gdGhlIHN5bWJvbCwgc2luY2UgaXQgd2Fzbid0IGZvdW5kIGluIHRoYXQgc291cmNlKSwgdGhlbiB3ZQorICAgICAgLy8gbXVzdCBoaWRlIGl0IGZyb20gdGhlIGNhbGxlci4KKyAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gdGVtcDsKKyAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgIGlmIChzb3VyY2VzX1tqXS0+RmluZEZpbGVCeU5hbWUob3V0cHV0LT5uYW1lKCksICZ0ZW1wKSkgeworICAgICAgICAgIC8vIEZvdW5kIGNvbmZsaWN0aW5nIGZpbGUgaW4gYSBwcmV2aW91cyBzb3VyY2UuCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4dGVuZGVlX3R5cGUsIHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgeworICBzdGQ6OnNldDxpbnQ+IG1lcmdlZF9yZXN1bHRzOworICBzdGQ6OnZlY3RvcjxpbnQ+IHJlc3VsdHM7CisgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworCisgIGZvciAoRGVzY3JpcHRvckRhdGFiYXNlKiBzb3VyY2UgOiBzb3VyY2VzXykgeworICAgIGlmIChzb3VyY2UtPkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGV4dGVuZGVlX3R5cGUsICZyZXN1bHRzKSkgeworICAgICAgc3RkOjpjb3B5KHJlc3VsdHMuYmVnaW4oKSwgcmVzdWx0cy5lbmQoKSwKKyAgICAgICAgICAgICAgICBzdGQ6Omluc2VydF9pdGVyYXRvcjxzdGQ6OnNldDxpbnQ+ID4obWVyZ2VkX3Jlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlZF9yZXN1bHRzLmJlZ2luKCkpKTsKKyAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgIH0KKyAgICByZXN1bHRzLmNsZWFyKCk7CisgIH0KKworICBzdGQ6OmNvcHkobWVyZ2VkX3Jlc3VsdHMuYmVnaW4oKSwgbWVyZ2VkX3Jlc3VsdHMuZW5kKCksCisgICAgICAgICAgICBzdGQ6Omluc2VydF9pdGVyYXRvcjxzdGQ6OnZlY3RvcjxpbnQ+ID4oKm91dHB1dCwgb3V0cHV0LT5lbmQoKSkpOworCisgIHJldHVybiBzdWNjZXNzOworfQorCisKK2Jvb2wgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kQWxsRmlsZU5hbWVzKAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0cHV0KSB7CisgIGJvb2wgaW1wbGVtZW50ZWQgPSBmYWxzZTsKKyAgZm9yIChEZXNjcmlwdG9yRGF0YWJhc2UqIHNvdXJjZSA6IHNvdXJjZXNfKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNvdXJjZV9vdXRwdXQ7CisgICAgaWYgKHNvdXJjZS0+RmluZEFsbEZpbGVOYW1lcygmc291cmNlX291dHB1dCkpIHsKKyAgICAgIG91dHB1dC0+cmVzZXJ2ZShvdXRwdXQtPnNpemUoKSArIHNvdXJjZV9vdXRwdXQuc2l6ZSgpKTsKKyAgICAgIGZvciAoYXV0byYgc291cmNlIDogc291cmNlX291dHB1dCkgeworICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhzdGQ6Om1vdmUoc291cmNlKSk7CisgICAgICB9CisgICAgICBpbXBsZW1lbnRlZCA9IHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBpbXBsZW1lbnRlZDsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjA2YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuaApAQCAtMCwwICsxLDM5OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIEludGVyZmFjZSBmb3IgbWFuaXB1bGF0aW5nIGRhdGFiYXNlcyBvZiBkZXNjcmlwdG9ycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUl9EQVRBQkFTRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JfREFUQUJBU0VfSF9fCisKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKKyNpZmRlZiBTV0lHCisjZXJyb3IgIllvdSBjYW5ub3QgU1dJRyBwcm90byBoZWFkZXJzIgorI2VuZGlmCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gRGVmaW5lZCBpbiB0aGlzIGZpbGUuCitjbGFzcyBEZXNjcmlwdG9yRGF0YWJhc2U7CitjbGFzcyBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U7CitjbGFzcyBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOworY2xhc3MgRGVzY3JpcHRvclBvb2xEYXRhYmFzZTsKK2NsYXNzIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZTsKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhIGRhdGFiYXNlIG9mIGRlc2NyaXB0b3JzLgorLy8KKy8vIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIERlc2NyaXB0b3JQb29sIHdoaWNoIGxvYWRzCisvLyBkZXNjcmlwdG9ycyBvbi1kZW1hbmQgZnJvbSBzb21lIHNvcnQgb2YgbGFyZ2UgZGF0YWJhc2UuICBJZiB0aGUgZGF0YWJhc2UKKy8vIGlzIGxhcmdlLCBpdCBtYXkgYmUgaW5lZmZpY2llbnQgdG8gZW51bWVyYXRlIGV2ZXJ5IC5wcm90byBmaWxlIGluc2lkZSBpdAorLy8gY2FsbGluZyBEZXNjcmlwdG9yUG9vbDo6QnVpbGRGaWxlKCkgZm9yIGVhY2ggb25lLiAgSW5zdGVhZCwgYSBEZXNjcmlwdG9yUG9vbAorLy8gY2FuIGJlIGNyZWF0ZWQgd2hpY2ggd3JhcHMgYSBEZXNjcmlwdG9yRGF0YWJhc2UgYW5kIG9ubHkgYnVpbGRzIHBhcnRpY3VsYXIKKy8vIGRlc2NyaXB0b3JzIHdoZW4gdGhleSBhcmUgbmVlZGVkLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIERlc2NyaXB0b3JEYXRhYmFzZSB7CisgcHVibGljOgorICBpbmxpbmUgRGVzY3JpcHRvckRhdGFiYXNlKCkge30KKyAgdmlydHVhbCB+RGVzY3JpcHRvckRhdGFiYXNlKCk7CisKKyAgLy8gRmluZCBhIGZpbGUgYnkgZmlsZSBuYW1lLiAgRmlsbHMgaW4gaW4gKm91dHB1dCBhbmQgcmV0dXJucyB0cnVlIGlmIGZvdW5kLgorICAvLyBPdGhlcndpc2UsIHJldHVybnMgZmFsc2UsIGxlYXZpbmcgdGhlIGNvbnRlbnRzIG9mICpvdXRwdXQgdW5kZWZpbmVkLgorICB2aXJ0dWFsIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSA9IDA7CisKKyAgLy8gRmluZCB0aGUgZmlsZSB0aGF0IGRlY2xhcmVzIHRoZSBnaXZlbiBmdWxseS1xdWFsaWZpZWQgc3ltYm9sIG5hbWUuCisgIC8vIElmIGZvdW5kLCBmaWxscyBpbiAqb3V0cHV0IGFuZCByZXR1cm5zIHRydWUsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlCisgIC8vIGFuZCBsZWF2ZXMgKm91dHB1dCB1bmRlZmluZWQuCisgIHZpcnR1YWwgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgPSAwOworCisgIC8vIEZpbmQgdGhlIGZpbGUgd2hpY2ggZGVmaW5lcyBhbiBleHRlbnNpb24gZXh0ZW5kaW5nIHRoZSBnaXZlbiBtZXNzYWdlIHR5cGUKKyAgLy8gd2l0aCB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyLiAgSWYgZm91bmQsIGZpbGxzIGluICpvdXRwdXQgYW5kIHJldHVybnMgdHJ1ZSwKKyAgLy8gb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UgYW5kIGxlYXZlcyAqb3V0cHV0IHVuZGVmaW5lZC4gIGNvbnRhaW5pbmdfdHlwZQorICAvLyBtdXN0IGJlIGEgZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZS4KKyAgdmlydHVhbCBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSA9IDA7CisKKyAgLy8gRmluZHMgdGhlIHRhZyBudW1iZXJzIHVzZWQgYnkgYWxsIGtub3duIGV4dGVuc2lvbnMgb2YKKyAgLy8gZXh0ZW5kZWVfdHlwZSwgYW5kIGFwcGVuZHMgdGhlbSB0byBvdXRwdXQgaW4gYW4gdW5kZWZpbmVkCisgIC8vIG9yZGVyLiBUaGlzIG1ldGhvZCBpcyBiZXN0LWVmZm9ydDogaXQncyBub3QgZ3VhcmFudGVlZCB0aGF0IHRoZQorICAvLyBkYXRhYmFzZSB3aWxsIGZpbmQgYWxsIGV4dGVuc2lvbnMsIGFuZCBpdCdzIG5vdCBndWFyYW50ZWVkIHRoYXQKKyAgLy8gRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uIHdpbGwgcmV0dXJuIHRydWUgb24gYWxsIG9mIHRoZSBmb3VuZAorICAvLyBudW1iZXJzLiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlYXJjaCB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlCisgIC8vIHJldHVybnMgZmFsc2UgYW5kIGxlYXZlcyBvdXRwdXQgdW5jaGFuZ2VkLgorICAvLworICAvLyBUaGlzIG1ldGhvZCBoYXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMKKyAgLy8gZmFsc2UuCisgIHZpcnR1YWwgYm9vbCBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhjb25zdCBzdGQ6OnN0cmluZyYgLyogZXh0ZW5kZWVfdHlwZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4qIC8qIG91dHB1dCAqLykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisKKyAgLy8gRmluZHMgdGhlIGZpbGUgbmFtZXMgYW5kIGFwcGVuZHMgdGhlbSB0byB0aGUgb3V0cHV0IGluIGFuCisgIC8vIHVuZGVmaW5lZCBvcmRlci4gVGhpcyBtZXRob2QgaXMgYmVzdC1lZmZvcnQ6IGl0J3Mgbm90IGd1YXJhbnRlZWQgdGhhdCB0aGUKKyAgLy8gZGF0YWJhc2Ugd2lsbCBmaW5kIGFsbCBmaWxlcy4gUmV0dXJucyB0cnVlIGlmIHRoZSBkYXRhYmFzZSBzdXBwb3J0cworICAvLyBzZWFyY2hpbmcgYWxsIGZpbGUgbmFtZXMsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlIGFuZCBsZWF2ZXMgb3V0cHV0CisgIC8vIHVuY2hhbmdlZC4KKyAgLy8KKyAgLy8gVGhpcyBtZXRob2QgaGFzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zCisgIC8vIGZhbHNlLgorICB2aXJ0dWFsIGJvb2wgRmluZEFsbEZpbGVOYW1lcyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIC8qb3V0cHV0Ki8pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBGaW5kcyB0aGUgcGFja2FnZSBuYW1lcyBhbmQgYXBwZW5kcyB0aGVtIHRvIHRoZSBvdXRwdXQgaW4gYW4KKyAgLy8gdW5kZWZpbmVkIG9yZGVyLiBUaGlzIG1ldGhvZCBpcyBiZXN0LWVmZm9ydDogaXQncyBub3QgZ3VhcmFudGVlZCB0aGF0IHRoZQorICAvLyBkYXRhYmFzZSB3aWxsIGZpbmQgYWxsIHBhY2thZ2VzLiBSZXR1cm5zIHRydWUgaWYgdGhlIGRhdGFiYXNlIHN1cHBvcnRzCisgIC8vIHNlYXJjaGluZyBhbGwgcGFja2FnZSBuYW1lcywgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UgYW5kIGxlYXZlcyBvdXRwdXQKKyAgLy8gdW5jaGFuZ2VkLgorICBib29sIEZpbmRBbGxQYWNrYWdlTmFtZXMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRwdXQpOworCisgIC8vIEZpbmRzIHRoZSBtZXNzYWdlIG5hbWVzIGFuZCBhcHBlbmRzIHRoZW0gdG8gdGhlIG91dHB1dCBpbiBhbgorICAvLyB1bmRlZmluZWQgb3JkZXIuIFRoaXMgbWV0aG9kIGlzIGJlc3QtZWZmb3J0OiBpdCdzIG5vdCBndWFyYW50ZWVkIHRoYXQgdGhlCisgIC8vIGRhdGFiYXNlIHdpbGwgZmluZCBhbGwgbWVzc2FnZXMuIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMKKyAgLy8gc2VhcmNoaW5nIGFsbCBtZXNzYWdlIG5hbWVzLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzIG91dHB1dAorICAvLyB1bmNoYW5nZWQuCisgIGJvb2wgRmluZEFsbE1lc3NhZ2VOYW1lcyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dHB1dCk7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVzY3JpcHRvckRhdGFiYXNlKTsKK307CisKKy8vIEEgRGVzY3JpcHRvckRhdGFiYXNlIGludG8gd2hpY2ggeW91IGNhbiBpbnNlcnQgZmlsZXMgbWFudWFsbHkuCisvLworLy8gRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCkgaXMgZnVsbHktaW1wbGVtZW50ZWQuICBXaGVuIHlvdSBhZGQgYSBmaWxlLCBpdHMKKy8vIHN5bWJvbHMgd2lsbCBiZSBpbmRleGVkIGZvciB0aGlzIHB1cnBvc2UuICBOb3RlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uCisvLyBtYXkgcmV0dXJuIGZhbHNlIHBvc2l0aXZlcywgYnV0IG9ubHkgaWYgaXQgaXNuJ3QgcG9zc2libGUgZm9yIHRoZSBzeW1ib2wKKy8vIHRvIGJlIGRlZmluZWQgaW4gYW55IG90aGVyIGZpbGUuICBJbiBwYXJ0aWN1bGFyLCBpZiBhIGZpbGUgZGVmaW5lcyBhIHN5bWJvbAorLy8gIkZvbyIsIHRoZW4gc2VhcmNoaW5nIGZvciAiRm9vLlthbnl0aGluZ10iIHdpbGwgbWF0Y2ggdGhhdCBmaWxlLiAgVGhpcyB3YXksCisvLyB0aGUgZGF0YWJhc2UgZG9lcyBub3QgbmVlZCB0byBhZ2dyZXNzaXZlbHkgaW5kZXggYWxsIGNoaWxkcmVuIG9mIGEgc3ltYm9sLgorLy8KKy8vIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigpIGlzIG1vc3RseS1pbXBsZW1lbnRlZC4gIEl0IHdvcmtzIGlmIGFuZCBvbmx5CisvLyBpZiB0aGUgb3JpZ2luYWwgRmllbGREZXNjcmlwdG9yUHJvdG8gZGVmaW5pbmcgdGhlIGV4dGVuc2lvbiBoYXMgYQorLy8gZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZSBpbiBpdHMgImV4dGVuZGVlIiBmaWVsZCAoaS5lLiBzdGFydHMgd2l0aCBhICcuJykuCisvLyBJZiB0aGUgZXh0ZW5kZWUgaXMgYSByZWxhdGl2ZSBuYW1lLCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2Ugd2lsbCBub3QKKy8vIGF0dGVtcHQgdG8gcmVzb2x2ZSB0aGUgdHlwZSwgc28gaXQgd2lsbCBub3Qga25vdyB3aGF0IHR5cGUgdGhlIGV4dGVuc2lvbiBpcworLy8gZXh0ZW5kaW5nLiAgVGhlcmVmb3JlLCBjYWxsaW5nIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigpIHdpdGggdGhlCisvLyBleHRlbnNpb24ncyBjb250YWluaW5nIHR5cGUgd2lsbCBuZXZlciBhY3R1YWxseSBmaW5kIHRoYXQgZXh0ZW5zaW9uLiAgTm90ZQorLy8gdGhhdCB0aGlzIGlzIGFuIHVubGlrZWx5IHByb2JsZW0sIGFzIGFsbCBGaWxlRGVzY3JpcHRvclByb3RvcyBjcmVhdGVkIGJ5IHRoZQorLy8gcHJvdG9jb2wgY29tcGlsZXIgKGFzIHdlbGwgYXMgb25lcyBjcmVhdGVkIGJ5IGNhbGxpbmcKKy8vIEZpbGVEZXNjcmlwdG9yOjpDb3B5VG8oKSkgd2lsbCBhbHdheXMgdXNlIGZ1bGx5LXF1YWxpZmllZCBuYW1lcyBmb3IgYWxsCisvLyB0eXBlcy4gIFlvdSBvbmx5IG5lZWQgdG8gd29ycnkgaWYgeW91IGFyZSBjb25zdHJ1Y3RpbmcgRmlsZURlc2NyaXB0b3JQcm90b3MKKy8vIHlvdXJzZWxmLCBvciBhcmUgY2FsbGluZyBjb21waWxlcjo6UGFyc2VyIGRpcmVjdGx5LgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgeworIHB1YmxpYzoKKyAgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlKCk7CisgIH5TaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UoKSBvdmVycmlkZTsKKworICAvLyBBZGRzIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHRvIHRoZSBkYXRhYmFzZSwgbWFraW5nIGEgY29weS4gIFRoZSBvYmplY3QKKyAgLy8gY2FuIGJlIGRlbGV0ZWQgYWZ0ZXIgQWRkKCkgcmV0dXJucy4gIFJldHVybnMgZmFsc2UgaWYgdGhlIGZpbGUgY29uZmxpY3RlZAorICAvLyB3aXRoIGEgZmlsZSBhbHJlYWR5IGluIHRoZSBkYXRhYmFzZSwgaW4gd2hpY2ggY2FzZSBhbiBlcnJvciB3aWxsIGhhdmUKKyAgLy8gYmVlbiB3cml0dGVuIHRvIEdPT0dMRV9MT0coRVJST1IpLgorICBib29sIEFkZChjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlKTsKKworICAvLyBBZGRzIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHRvIHRoZSBkYXRhYmFzZSBhbmQgdGFrZXMgb3duZXJzaGlwIG9mIGl0LgorICBib29sIEFkZEFuZE93bihjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlKTsKKworICAvLyBpbXBsZW1lbnRzIERlc2NyaXB0b3JEYXRhYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIEZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIG92ZXJyaWRlOworICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgb3ZlcnJpZGU7CisgIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgb3ZlcnJpZGU7CisgIGJvb2wgRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIGV4dGVuZGVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50Piogb3V0cHV0KSBvdmVycmlkZTsKKworICBib29sIEZpbmRBbGxGaWxlTmFtZXMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRwdXQpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgLy8gQW4gaW5kZXggbWFwcGluZyBmaWxlIG5hbWVzLCBzeW1ib2wgbmFtZXMsIGFuZCBleHRlbnNpb24gbnVtYmVycyB0bworICAvLyBzb21lIHNvcnQgb2YgdmFsdWVzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+CisgIGNsYXNzIERlc2NyaXB0b3JJbmRleCB7CisgICBwdWJsaWM6CisgICAgLy8gSGVscGVycyB0byByZWN1cnNpdmVseSBhZGQgcGFydGljdWxhciBkZXNjcmlwdG9ycyBhbmQgYWxsIHRoZWlyIGNvbnRlbnRzCisgICAgLy8gdG8gdGhlIGluZGV4LgorICAgIGJvb2wgQWRkRmlsZShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlLCBWYWx1ZSB2YWx1ZSk7CisgICAgYm9vbCBBZGRTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIFZhbHVlIHZhbHVlKTsKKyAgICBib29sIEFkZE5lc3RlZEV4dGVuc2lvbnMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIG1lc3NhZ2VfdHlwZSwgVmFsdWUgdmFsdWUpOworICAgIGJvb2wgQWRkRXh0ZW5zaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQsIFZhbHVlIHZhbHVlKTsKKworICAgIFZhbHVlIEZpbmRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSk7CisgICAgVmFsdWUgRmluZFN5bWJvbChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisgICAgVmFsdWUgRmluZEV4dGVuc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgY29udGFpbmluZ190eXBlLCBpbnQgZmllbGRfbnVtYmVyKTsKKyAgICBib29sIEZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+KiBvdXRwdXQpOworICAgIHZvaWQgRmluZEFsbEZpbGVOYW1lcyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dHB1dCk7CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFZhbHVlPiBieV9uYW1lXzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVmFsdWU+IGJ5X3N5bWJvbF87CisgICAgc3RkOjptYXA8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBpbnQ+LCBWYWx1ZT4gYnlfZXh0ZW5zaW9uXzsKKworICAgIC8vIEludmFyaWFudDogIFRoZSBieV9zeW1ib2xfIG1hcCBkb2VzIG5vdCBjb250YWluIGFueSBzeW1ib2xzIHdoaWNoIGFyZQorICAgIC8vIHByZWZpeGVzIG9mIG90aGVyIHN5bWJvbHMgaW4gdGhlIG1hcC4gIEZvciBleGFtcGxlLCAiZm9vLmJhciIgaXMgYQorICAgIC8vIHByZWZpeCBvZiAiZm9vLmJhci5iYXoiIChidXQgaXMgbm90IGEgcHJlZml4IG9mICJmb28uYmFyYmF6IikuCisgICAgLy8KKyAgICAvLyBUaGlzIGludmFyaWFudCBpcyBpbXBvcnRhbnQgYmVjYXVzZSBpdCBtZWFucyB0aGF0IGdpdmVuIGEgc3ltYm9sIG5hbWUsCisgICAgLy8gd2UgY2FuIGZpbmQgYSBrZXkgaW4gdGhlIG1hcCB3aGljaCBpcyBhIHByZWZpeCBvZiB0aGUgc3ltYm9sIGluIE8obGcgbikKKyAgICAvLyB0aW1lLCBhbmQgd2Uga25vdyB0aGF0IHRoZXJlIGlzIGF0IG1vc3Qgb25lIHN1Y2gga2V5LgorICAgIC8vCisgICAgLy8gVGhlIHByZWZpeCBsb29rdXAgYWxnb3JpdGhtIHdvcmtzIGxpa2Ugc286CisgICAgLy8gMSkgRmluZCB0aGUgbGFzdCBrZXkgaW4gdGhlIG1hcCB3aGljaCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlCisgICAgLy8gICAgc2VhcmNoIGtleS4KKyAgICAvLyAyKSBJZiB0aGUgZm91bmQga2V5IGlzIGEgcHJlZml4IG9mIHRoZSBzZWFyY2gga2V5LCB0aGVuIHJldHVybiBpdC4KKyAgICAvLyAgICBPdGhlcndpc2UsIHRoZXJlIGlzIG5vIG1hdGNoLgorICAgIC8vCisgICAgLy8gSSBhbSBzdXJlIHRoaXMgYWxnb3JpdGhtIGhhcyBiZWVuIGRlc2NyaWJlZCBlbHNld2hlcmUsIGJ1dCBzaW5jZSBJCisgICAgLy8gd2Fzbid0IGFibGUgdG8gZmluZCBpdCBxdWlja2x5IEkgd2lsbCBpbnN0ZWFkIHByb3ZlIHRoYXQgaXQgd29ya3MKKyAgICAvLyBteXNlbGYuICBUaGUga2V5IHRvIHRoZSBhbGdvcml0aG0gaXMgdGhhdCBpZiBhIG1hdGNoIGV4aXN0cywgc3RlcCAoMSkKKyAgICAvLyB3aWxsIGZpbmQgaXQuICBQcm9vZjoKKyAgICAvLyAxKSBEZWZpbmUgdGhlICJzZWFyY2gga2V5IiB0byBiZSB0aGUga2V5IHdlIGFyZSBsb29raW5nIGZvciwgdGhlICJmb3VuZAorICAgIC8vICAgIGtleSIgdG8gYmUgdGhlIGtleSBmb3VuZCBpbiBzdGVwICgxKSwgYW5kIHRoZSAibWF0Y2gga2V5IiB0byBiZSB0aGUKKyAgICAvLyAgICBrZXkgd2hpY2ggYWN0dWFsbHkgbWF0Y2hlcyB0aGUgc2VhcmNoIGtleSAoaS5lLiB0aGUga2V5IHdlJ3JlIHRyeWluZworICAgIC8vICAgIHRvIGZpbmQpLgorICAgIC8vIDIpIFRoZSBmb3VuZCBrZXkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlYXJjaCBrZXkgYnkKKyAgICAvLyAgICBkZWZpbml0aW9uLgorICAgIC8vIDMpIFRoZSBtYXRjaCBrZXkgbXVzdCBhbHNvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2VhcmNoIGtleQorICAgIC8vICAgIChiZWNhdXNlIGl0IGlzIGEgcHJlZml4KS4KKyAgICAvLyA0KSBUaGUgbWF0Y2gga2V5IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIGZvdW5kIGtleSwgYmVjYXVzZSBpZiBpdAorICAgIC8vICAgIHdlcmUsIHRoZW4gc3RlcCAoMSkgb2YgdGhlIGFsZ29yaXRobSB3b3VsZCBoYXZlIHJldHVybmVkIHRoZSBtYXRjaAorICAgIC8vICAgIGtleSBpbnN0ZWFkIChzaW5jZSBpdCBmaW5kcyB0aGUgKmdyZWF0ZXN0KiBrZXkgd2hpY2ggaXMgbGVzcyB0aGFuIG9yCisgICAgLy8gICAgZXF1YWwgdG8gdGhlIHNlYXJjaCBrZXkpLgorICAgIC8vIDUpIFRoZXJlZm9yZSwgdGhlIGZvdW5kIGtleSBtdXN0IGJlIGJldHdlZW4gdGhlIG1hdGNoIGtleSBhbmQgdGhlIHNlYXJjaAorICAgIC8vICAgIGtleSwgaW5jbHVzaXZlLgorICAgIC8vIDYpIFNpbmNlIHRoZSBzZWFyY2gga2V5IG11c3QgYmUgYSBzdWItc3ltYm9sIG9mIHRoZSBtYXRjaCBrZXksIGlmIGl0IGlzCisgICAgLy8gICAgbm90IGVxdWFsIHRvIHRoZSBtYXRjaCBrZXksIHRoZW4gc2VhcmNoX2tleVttYXRjaF9rZXkuc2l6ZSgpXSBtdXN0CisgICAgLy8gICAgYmUgJy4nLgorICAgIC8vIDcpIFNpbmNlICcuJyBzb3J0cyBiZWZvcmUgYW55IG90aGVyIGNoYXJhY3RlciB0aGF0IGlzIHZhbGlkIGluIGEgc3ltYm9sCisgICAgLy8gICAgbmFtZSwgdGhlbiBpZiB0aGUgZm91bmQga2V5IGlzIG5vdCBlcXVhbCB0byB0aGUgbWF0Y2gga2V5LCB0aGVuCisgICAgLy8gICAgZm91bmRfa2V5W21hdGNoX2tleS5zaXplKCldIG11c3QgYWxzbyBiZSAnLicsIGJlY2F1c2UgYW55IG90aGVyIHZhbHVlCisgICAgLy8gICAgd291bGQgbWFrZSBpdCBzb3J0IGFmdGVyIHRoZSBzZWFyY2gga2V5LgorICAgIC8vIDgpIFRoZXJlZm9yZSwgaWYgdGhlIGZvdW5kIGtleSBpcyBub3QgZXF1YWwgdG8gdGhlIG1hdGNoIGtleSwgdGhlbiB0aGUKKyAgICAvLyAgICBmb3VuZCBrZXkgbXVzdCBiZSBhIHN1Yi1zeW1ib2wgb2YgdGhlIG1hdGNoIGtleS4gIEhvd2V2ZXIsIHRoaXMgd291bGQKKyAgICAvLyAgICBjb250cmFkaWN0IG91ciBtYXAgaW52YXJpYW50IHdoaWNoIHNheXMgdGhhdCBubyBzeW1ib2wgaW4gdGhlIG1hcCBpcworICAgIC8vICAgIGEgc3ViLXN5bWJvbCBvZiBhbnkgb3RoZXIuCisgICAgLy8gOSkgVGhlcmVmb3JlLCB0aGUgZm91bmQga2V5IG11c3QgbWF0Y2ggdGhlIG1hdGNoIGtleS4KKyAgICAvLworICAgIC8vIFRoZSBhYm92ZSBwcm9vZiBhc3N1bWVzIHRoZSBtYXRjaCBrZXkgZXhpc3RzLiAgSW4gdGhlIGNhc2UgdGhhdCB0aGUKKyAgICAvLyBtYXRjaCBrZXkgZG9lcyBub3QgZXhpc3QsIHRoZW4gc3RlcCAoMSkgd2lsbCByZXR1cm4gc29tZSBvdGhlciBzeW1ib2wuCisgICAgLy8gVGhhdCBzeW1ib2wgY2Fubm90IGJlIGEgc3VwZXItc3ltYm9sIG9mIHRoZSBzZWFyY2gga2V5IHNpbmNlIGlmIGl0IHdlcmUsCisgICAgLy8gdGhlbiBpdCB3b3VsZCBiZSBhIG1hdGNoLCBhbmQgd2UncmUgYXNzdW1pbmcgdGhlIG1hdGNoIGtleSBkb2Vzbid0IGV4aXN0LgorICAgIC8vIFRoZXJlZm9yZSwgc3RlcCAyIHdpbGwgY29ycmVjdGx5IHJldHVybiBubyBtYXRjaC4KKyAgfTsKKworICBEZXNjcmlwdG9ySW5kZXg8Y29uc3QgRmlsZURlc2NyaXB0b3JQcm90byo+IGluZGV4XzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8+PiBmaWxlc190b19kZWxldGVfOworCisgIC8vIElmIGZpbGUgaXMgbm9uLW51bGxwdHIsIGNvcHkgaXQgaW50byAqb3V0cHV0IGFuZCByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlCisgIC8vIHJldHVybiBmYWxzZS4KKyAgYm9vbCBNYXliZUNvcHkoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlKTsKK307CisKKy8vIFZlcnkgc2ltaWxhciB0byBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UsIGJ1dCBzdG9yZXMgYWxsIHRoZSBkZXNjcmlwdG9ycworLy8gYXMgcmF3IGJ5dGVzIGFuZCBnZW5lcmFsbHkgdHJpZXMgdG8gdXNlIGFzIGxpdHRsZSBtZW1vcnkgYXMgcG9zc2libGUuCisvLworLy8gVGhlIHNhbWUgY2F2ZWF0cyByZWdhcmRpbmcgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCkgYXBwbHkgYXMgd2l0aAorLy8gU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UgOiBwdWJsaWMgRGVzY3JpcHRvckRhdGFiYXNlIHsKKyBwdWJsaWM6CisgIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UoKTsKKyAgfkVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UoKSBvdmVycmlkZTsKKworICAvLyBBZGRzIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHRvIHRoZSBkYXRhYmFzZS4gIFRoZSBkZXNjcmlwdG9yIGlzIHByb3ZpZGVkCisgIC8vIGluIGVuY29kZWQgZm9ybS4gIFRoZSBkYXRhYmFzZSBkb2VzIG5vdCBtYWtlIGEgY29weSBvZiB0aGUgYnl0ZXMsIG5vcgorICAvLyBkb2VzIGl0IHRha2Ugb3duZXJzaGlwOyBpdCdzIHVwIHRvIHRoZSBjYWxsZXIgdG8gbWFrZSBzdXJlIHRoZSBieXRlcworICAvLyByZW1haW4gdmFsaWQgZm9yIHRoZSBsaWZlIG9mIHRoZSBkYXRhYmFzZS4gIFJldHVybnMgZmFsc2UgYW5kIGxvZ3MgYW4gZXJyb3IKKyAgLy8gaWYgdGhlIGJ5dGVzIGFyZSBub3QgYSB2YWxpZCBGaWxlRGVzY3JpcHRvclByb3RvIG9yIGlmIHRoZSBmaWxlIGNvbmZsaWN0ZWQKKyAgLy8gd2l0aCBhIGZpbGUgYWxyZWFkeSBpbiB0aGUgZGF0YWJhc2UuCisgIGJvb2wgQWRkKGNvbnN0IHZvaWQqIGVuY29kZWRfZmlsZV9kZXNjcmlwdG9yLCBpbnQgc2l6ZSk7CisKKyAgLy8gTGlrZSBBZGQoKSwgYnV0IG1ha2VzIGEgY29weSBvZiB0aGUgZGF0YSwgc28gdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90CisgIC8vIG5lZWQgdG8ga2VlcCBpdCBhcm91bmQuCisgIGJvb2wgQWRkQ29weShjb25zdCB2b2lkKiBlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgaW50IHNpemUpOworCisgIC8vIExpa2UgRmluZEZpbGVDb250YWluaW5nU3ltYm9sIGJ1dCByZXR1cm5zIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgIGJvb2wgRmluZE5hbWVPZkZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0ZDo6c3RyaW5nJiBzeW1ib2xfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dHB1dCk7CisKKyAgLy8gaW1wbGVtZW50cyBEZXNjcmlwdG9yRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSBvdmVycmlkZTsKKyAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIG92ZXJyaWRlOworICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIG92ZXJyaWRlOworICBib29sIEZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBleHRlbmRlZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgb3ZlcnJpZGU7CisgIGJvb2wgRmluZEFsbEZpbGVOYW1lcyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dHB1dCkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBjbGFzcyBEZXNjcmlwdG9ySW5kZXg7CisgIC8vIEtlZXAgRGVzY3JpcHRvckluZGV4IGJ5IHBvaW50ZXIgdG8gaGlkZSB0aGUgaW1wbGVtZW50YXRpb24gdG8ga2VlcCBhCisgIC8vIGNsZWFuZXIgaGVhZGVyLgorICBzdGQ6OnVuaXF1ZV9wdHI8RGVzY3JpcHRvckluZGV4PiBpbmRleF87CisgIHN0ZDo6dmVjdG9yPHZvaWQqPiBmaWxlc190b19kZWxldGVfOworCisgIC8vIElmIGVuY29kZWRfZmlsZS5maXJzdCBpcyBub24tbnVsbHB0ciwgcGFyc2UgdGhlIGRhdGEgaW50byAqb3V0cHV0IGFuZAorICAvLyByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAgYm9vbCBNYXliZVBhcnNlKHN0ZDo6cGFpcjxjb25zdCB2b2lkKiwgaW50PiBlbmNvZGVkX2ZpbGUsCisgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlKTsKK307CisKKy8vIEEgRGVzY3JpcHRvckRhdGFiYXNlIHRoYXQgZmV0Y2hlcyBmaWxlcyBmcm9tIGEgZ2l2ZW4gcG9vbC4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBEZXNjcmlwdG9yUG9vbERhdGFiYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZSB7CisgcHVibGljOgorICBleHBsaWNpdCBEZXNjcmlwdG9yUG9vbERhdGFiYXNlKGNvbnN0IERlc2NyaXB0b3JQb29sJiBwb29sKTsKKyAgfkRlc2NyaXB0b3JQb29sRGF0YWJhc2UoKSBvdmVycmlkZTsKKworICAvLyBpbXBsZW1lbnRzIERlc2NyaXB0b3JEYXRhYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIEZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIG92ZXJyaWRlOworICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgb3ZlcnJpZGU7CisgIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgb3ZlcnJpZGU7CisgIGJvb2wgRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIGV4dGVuZGVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50Piogb3V0cHV0KSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIGNvbnN0IERlc2NyaXB0b3JQb29sJiBwb29sXzsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlc2NyaXB0b3JQb29sRGF0YWJhc2UpOworfTsKKworLy8gQSBEZXNjcmlwdG9yRGF0YWJhc2UgdGhhdCB3cmFwcyB0d28gb3IgbW9yZSBvdGhlcnMuICBJdCBmaXJzdCBzZWFyY2hlcyB0aGUKKy8vIGZpcnN0IGRhdGFiYXNlIGFuZCwgaWYgdGhhdCBmYWlscywgdHJpZXMgdGhlIHNlY29uZCwgYW5kIHNvIG9uLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgeworIHB1YmxpYzoKKyAgLy8gTWVyZ2UganVzdCB0d28gZGF0YWJhc2VzLiAgVGhlIHNvdXJjZXMgcmVtYWluIHByb3BlcnR5IG9mIHRoZSBjYWxsZXIuCisgIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZShEZXNjcmlwdG9yRGF0YWJhc2UqIHNvdXJjZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yRGF0YWJhc2UqIHNvdXJjZTIpOworICAvLyBNZXJnZSBtb3JlIHRoYW4gdHdvIGRhdGFiYXNlcy4gIFRoZSBzb3VyY2VzIHJlbWFpbiBwcm9wZXJ0eSBvZiB0aGUgY2FsbGVyLgorICAvLyBUaGUgdmVjdG9yIG1heSBiZSBkZWxldGVkIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciByZXR1cm5zIGJ1dCB0aGUKKyAgLy8gRGVzY3JpcHRvckRhdGFiYXNlcyBuZWVkIHRvIHN0aWNrIGFyb3VuZC4KKyAgZXhwbGljaXQgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlKAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RGVzY3JpcHRvckRhdGFiYXNlKj4mIHNvdXJjZXMpOworICB+TWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlKCkgb3ZlcnJpZGU7CisKKyAgLy8gaW1wbGVtZW50cyBEZXNjcmlwdG9yRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSBvdmVycmlkZTsKKyAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIG92ZXJyaWRlOworICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIG92ZXJyaWRlOworICAvLyBNZXJnZXMgdGhlIHJlc3VsdHMgb2YgY2FsbGluZyBhbGwgZGF0YWJhc2VzLiBSZXR1cm5zIHRydWUgaWZmIGFueQorICAvLyBvZiB0aGUgZGF0YWJhc2VzIHJldHVybmVkIHRydWUuCisgIGJvb2wgRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIGV4dGVuZGVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50Piogb3V0cHV0KSBvdmVycmlkZTsKKworCisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYmVzdC1lZmZvcnQuIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgdW5kZXJseWluZworICAvLyBEZXNjcmlwdG9yRGF0YWJhc2UgcmV0dXJucyB0cnVlLgorICBib29sIEZpbmRBbGxGaWxlTmFtZXMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRwdXQpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8RGVzY3JpcHRvckRhdGFiYXNlKj4gc291cmNlc187CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JfREFUQUJBU0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4MjQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDgxMiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBtYWtlcyBleHRlbnNpdmUgdXNlIG9mIFJGQyAzMDkyLiAgOikKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHsKKworc3RhdGljIHZvaWQgQWRkVG9EYXRhYmFzZShTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UqIGRhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX3RleHQpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoZmlsZV90ZXh0LCAmZmlsZV9wcm90bykpOworICBkYXRhYmFzZS0+QWRkKGZpbGVfcHJvdG8pOworfQorCitzdGF0aWMgdm9pZCBFeHBlY3RDb250YWluc1R5cGUoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfbmFtZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLm1lc3NhZ2VfdHlwZV9zaXplKCk7IGkrKykgeworICAgIGlmIChwcm90by5tZXNzYWdlX3R5cGUoaSkubmFtZSgpID09IHR5cGVfbmFtZSkgcmV0dXJuOworICB9CisgIEFERF9GQUlMVVJFKCkgPDwgIlwiIiA8PCBwcm90by5uYW1lKCkgPDwgIlwiIGRpZCBub3QgY29udGFpbiBleHBlY3RlZCB0eXBlIFwiIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSA8PCAiXCIuIjsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworLy8gU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlLCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlLCBhbmQKKy8vIERlc2NyaXB0b3JQb29sRGF0YWJhc2UgY2FsbCBmb3IgdmVyeSBzaW1pbGFyIHRlc3RzLiAgSW5zdGVhZCBvZiB3cml0aW5nCisvLyB0aHJlZSBuZWFybHktaWRlbnRpY2FsIHNldHMgb2YgdGVzdHMsIHdlIHVzZSBwYXJhbWV0ZXJpemVkIHRlc3RzIHRvIGFwcGx5CisvLyB0aGUgc2FtZSBjb2RlIHRvIGFsbCB0aHJlZS4KKworLy8gVGhlIHBhcmFtZXRlcml6ZWQgdGVzdCBydW5zIGFnYWluc3QgYSBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZS4gIFdlIGhhdmUKKy8vIGltcGxlbWVudGF0aW9ucyBmb3IgZWFjaCBvZiB0aGUgdGhyZWUgY2xhc3NlcyB3ZSB3YW50IHRvIHRlc3QuCitjbGFzcyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5EZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSgpIHt9CisKKyAgdmlydHVhbCBEZXNjcmlwdG9yRGF0YWJhc2UqIEdldERhdGFiYXNlKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgQWRkVG9EYXRhYmFzZShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlKSA9IDA7Cit9OworCisvLyBGYWN0b3J5IGZ1bmN0aW9uIHR5cGUuCit0eXBlZGVmIERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlKiBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZUZhY3RvcnkoKTsKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZS4KK2NsYXNzIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSogTmV3KCkgeworICAgIHJldHVybiBuZXcgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2U7CisgIH0KKworICB2aXJ0dWFsIH5TaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSgpIHt9CisKKyAgdmlydHVhbCBEZXNjcmlwdG9yRGF0YWJhc2UqIEdldERhdGFiYXNlKCkgeyByZXR1cm4gJmRhdGFiYXNlXzsgfQorICB2aXJ0dWFsIGJvb2wgQWRkVG9EYXRhYmFzZShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlKSB7CisgICAgcmV0dXJuIGRhdGFiYXNlXy5BZGQoZmlsZSk7CisgIH0KKworIHByaXZhdGU6CisgIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSBkYXRhYmFzZV87Cit9OworCisvLyBTcGVjaWFsaXphdGlvbiBmb3IgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZS4KK2NsYXNzIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSB7CisgcHVibGljOgorICBzdGF0aWMgRGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2UqIE5ldygpIHsKKyAgICByZXR1cm4gbmV3IEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZTsKKyAgfQorCisgIHZpcnR1YWwgfkVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSgpIHt9CisKKyAgdmlydHVhbCBEZXNjcmlwdG9yRGF0YWJhc2UqIEdldERhdGFiYXNlKCkgeyByZXR1cm4gJmRhdGFiYXNlXzsgfQorICB2aXJ0dWFsIGJvb2wgQWRkVG9EYXRhYmFzZShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlKSB7CisgICAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgICBmaWxlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgICByZXR1cm4gZGF0YWJhc2VfLkFkZENvcHkoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZSBkYXRhYmFzZV87Cit9OworCisvLyBTcGVjaWFsaXphdGlvbiBmb3IgRGVzY3JpcHRvclBvb2xEYXRhYmFzZS4KK2NsYXNzIERlc2NyaXB0b3JQb29sRGF0YWJhc2VUZXN0Q2FzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSB7CisgcHVibGljOgorICBzdGF0aWMgRGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2UqIE5ldygpIHsKKyAgICByZXR1cm4gbmV3IEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sRGF0YWJhc2VUZXN0Q2FzZSgpIDogZGF0YWJhc2VfKHBvb2xfKSB7fQorICB2aXJ0dWFsIH5EZXNjcmlwdG9yUG9vbERhdGFiYXNlVGVzdENhc2UoKSB7fQorCisgIHZpcnR1YWwgRGVzY3JpcHRvckRhdGFiYXNlKiBHZXREYXRhYmFzZSgpIHsgcmV0dXJuICZkYXRhYmFzZV87IH0KKyAgdmlydHVhbCBib29sIEFkZFRvRGF0YWJhc2UoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZmlsZSkgeworICAgIHJldHVybiBwb29sXy5CdWlsZEZpbGUoZmlsZSk7CisgIH0KKworIHByaXZhdGU6CisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworICBEZXNjcmlwdG9yUG9vbERhdGFiYXNlIGRhdGFiYXNlXzsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgRGVzY3JpcHRvckRhdGFiYXNlVGVzdAorICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08RGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2VGYWN0b3J5Kj4geworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHRlc3RfY2FzZV8ucmVzZXQoR2V0UGFyYW0oKSgpKTsKKyAgICBkYXRhYmFzZV8gPSB0ZXN0X2Nhc2VfLT5HZXREYXRhYmFzZSgpOworICB9CisKKyAgdm9pZCBBZGRUb0RhdGFiYXNlKGNvbnN0IGNoYXIqIGZpbGVfZGVzY3JpcHRvcl90ZXh0KSB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICAgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhmaWxlX2Rlc2NyaXB0b3JfdGV4dCwgJmZpbGVfcHJvdG8pKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0X2Nhc2VfLT5BZGRUb0RhdGFiYXNlKGZpbGVfcHJvdG8pKTsKKyAgfQorCisgIHZvaWQgQWRkVG9EYXRhYmFzZVdpdGhFcnJvcihjb25zdCBjaGFyKiBmaWxlX2Rlc2NyaXB0b3JfdGV4dCkgeworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoZmlsZV9kZXNjcmlwdG9yX3RleHQsICZmaWxlX3Byb3RvKSk7CisgICAgRVhQRUNUX0ZBTFNFKHRlc3RfY2FzZV8tPkFkZFRvRGF0YWJhc2UoZmlsZV9wcm90bykpOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlPiB0ZXN0X2Nhc2VfOworICBEZXNjcmlwdG9yRGF0YWJhc2UqIGRhdGFiYXNlXzsKK307CisKK1RFU1RfUChEZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBGaW5kRmlsZUJ5TmFtZSkgeworICBBZGRUb0RhdGFiYXNlKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6XCJGb29cIiB9Iik7CisgIEFkZFRvRGF0YWJhc2UoCisgICAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkJhclwiIH0iKTsKKworICB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVCeU5hbWUoImZvby5wcm90byIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGb28iKTsKKyAgfQorCisgIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUJ5TmFtZSgiYmFyLnByb3RvIiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkJhciIpOworICB9CisKKyAgeworICAgIC8vIEZhaWxzIHRvIGZpbmQgdW5kZWZpbmVkIGZpbGVzLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfRkFMU0UoZGF0YWJhc2VfLT5GaW5kRmlsZUJ5TmFtZSgiYmF6LnByb3RvIiwgJmZpbGUpKTsKKyAgfQorfQorCitURVNUX1AoRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKSB7CisgIEFkZFRvRGF0YWJhc2UoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogXCJGb29cIiAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJxdXhcIiB9IgorICAgICAgIiAgbmVzdGVkX3R5cGUgeyBuYW1lOiBcIkdyYXVsdFwiIH0gIgorICAgICAgIiAgZW51bV90eXBlIHsgbmFtZTogXCJHYXJwbHlcIiB9ICIKKyAgICAgICJ9ICIKKyAgICAgICJlbnVtX3R5cGUgeyAiCisgICAgICAiICBuYW1lOiBcIldhbGRvXCIgIgorICAgICAgIiAgdmFsdWUgeyBuYW1lOlwiRlJFRFwiIH0gIgorICAgICAgIn0gIgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwicGx1Z2hcIiB9ICIKKyAgICAgICJzZXJ2aWNlIHsgIgorICAgICAgIiAgbmFtZTogXCJYeXp6eVwiICIKKyAgICAgICIgIG1ldGhvZCB7IG5hbWU6IFwiVGh1ZFwiIH0gIgorICAgICAgIn0iKTsKKyAgQWRkVG9EYXRhYmFzZSgKKyAgICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAgICJwYWNrYWdlOiBcImNvcmdlXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSIpOworCisgIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvbyIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuIGZpbmQgZmllbGRzLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiRm9vLnF1eCIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgLy8gTm9uLWV4aXN0ZW50IGZpZWxkIHVuZGVyIGEgdmFsaWQgdG9wIGxldmVsIHN5bWJvbCBjYW4gYWxzbyBiZQorICAgIC8vIGZvdW5kLgorICAgIEVYUEVDVF9UUlVFKAorICAgICAgICBkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiRm9vLm5vbmVfZmllbGQubm9uZSIsICZmaWxlKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuIGZpbmQgbmVzdGVkIHR5cGVzLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiRm9vLkdyYXVsdCIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuIGZpbmQgbmVzdGVkIGVudW1zLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiRm9vLkdhcnBseSIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuIGZpbmQgZW51bSB0eXBlcy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIldhbGRvIiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBlbnVtIHZhbHVlcy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIldhbGRvLkZSRUQiLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICB9CisKKyAgeworICAgIC8vIENhbiBmaW5kIGV4dGVuc2lvbnMuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJwbHVnaCIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuIGZpbmQgc2VydmljZXMuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJYeXp6eSIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuIGZpbmQgbWV0aG9kcy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIlh5enp5LlRodWQiLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICB9CisKKyAgeworICAgIC8vIENhbiBmaW5kIHRoaW5ncyBpbiBwYWNrYWdlcy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woImNvcmdlLkJhciIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgIH0KKworICB7CisgICAgLy8gRmFpbHMgdG8gZmluZCB1bmRlZmluZWQgc3ltYm9scy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX0ZBTFNFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJCYXoiLCAmZmlsZSkpOworICB9CisKKyAgeworICAgIC8vIE5hbWVzIG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfRkFMU0UoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkJhciIsICZmaWxlKSk7CisgIH0KK30KKworVEVTVF9QKERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbikgeworICBBZGRUb0RhdGFiYXNlKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIgIgorICAgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAxMDAwIH0gIgorICAgICAgIiAgZXh0ZW5zaW9uIHsgbmFtZTpcInF1eFwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCisgICAgICAibnVtYmVyOjUgIgorICAgICAgIiAgICAgICAgICAgICAgZXh0ZW5kZWU6IFwiLkZvb1wiIH0iCisgICAgICAifSIpOworICBBZGRUb0RhdGFiYXNlKAorICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICAgInBhY2thZ2U6IFwiY29yZ2VcIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogXCJCYXJcIiAiCisgICAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMDAgfSAiCisgICAgICAifSAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImdyYXVsdFwiIGV4dGVuZGVlOiBcIi5Gb29cIiAgICAgICBudW1iZXI6MzIgfSAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImdhcnBseVwiIGV4dGVuZGVlOiBcIi5jb3JnZS5CYXJcIiBudW1iZXI6NzAgfSAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcIndhbGRvXCIgIGV4dGVuZGVlOiBcIkJhclwiICAgICAgICBudW1iZXI6NTYgfSAiKTsKKworICB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJGb28iLCA1LCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICB9CisKKyAgeworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigiRm9vIiwgMzIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuIGZpbmQgZXh0ZW5zaW9ucyBmb3IgcXVhbGlmaWVkIHR5cGUgbmFtZXMuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJjb3JnZS5CYXIiLCA3MCwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4ndCBmaW5kIGV4dGVuc2lvbnMgd2hvc2UgZXh0ZW5kZWUgd2FzIG5vdCBmdWxseS1xdWFsaWZpZWQgaW4gdGhlCisgICAgLy8gRmlsZURlc2NyaXB0b3JQcm90by4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX0ZBTFNFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJCYXIiLCA1NiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRkFMU0UoCisgICAgICAgIGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJjb3JnZS5CYXIiLCA1NiwgJmZpbGUpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4ndCBmaW5kIG5vbi1leGlzdGVudCBleHRlbnNpb24gbnVtYmVycy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX0ZBTFNFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJGb28iLCAxMiwgJmZpbGUpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4ndCBmaW5kIGV4dGVuc2lvbnMgZm9yIG5vbi1leGlzdGVudCB0eXBlcy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX0ZBTFNFKAorICAgICAgICBkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigiTm9TdWNoVHlwZSIsIDUsICZmaWxlKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuJ3QgZmluZCBleHRlbnNpb25zIGZvciB1bnF1YWxpZmllZCB0eXBlIG5hbWVzLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfRkFMU0UoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkJhciIsIDcwLCAmZmlsZSkpOworICB9Cit9CisKK1RFU1RfUChEZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycykgeworICBBZGRUb0RhdGFiYXNlKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIgIgorICAgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAxMDAwIH0gIgorICAgICAgIiAgZXh0ZW5zaW9uIHsgbmFtZTpcInF1eFwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCisgICAgICAibnVtYmVyOjUgIgorICAgICAgIiAgICAgICAgICAgICAgZXh0ZW5kZWU6IFwiLkZvb1wiIH0iCisgICAgICAifSIpOworICBBZGRUb0RhdGFiYXNlKAorICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICAgInBhY2thZ2U6IFwiY29yZ2VcIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogXCJCYXJcIiAiCisgICAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMDAgfSAiCisgICAgICAifSAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImdyYXVsdFwiIGV4dGVuZGVlOiBcIi5Gb29cIiAgICAgICBudW1iZXI6MzIgfSAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImdhcnBseVwiIGV4dGVuZGVlOiBcIi5jb3JnZS5CYXJcIiBudW1iZXI6NzAgfSAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcIndhbGRvXCIgIGV4dGVuZGVlOiBcIkJhclwiICAgICAgICBudW1iZXI6NTYgfSAiKTsKKworICB7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBudW1iZXJzOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIkZvbyIsICZudW1iZXJzKSk7CisgICAgQVNTRVJUX0VRKDIsIG51bWJlcnMuc2l6ZSgpKTsKKyAgICBzdGQ6OnNvcnQobnVtYmVycy5iZWdpbigpLCBudW1iZXJzLmVuZCgpKTsKKyAgICBFWFBFQ1RfRVEoNSwgbnVtYmVyc1swXSk7CisgICAgRVhQRUNUX0VRKDMyLCBudW1iZXJzWzFdKTsKKyAgfQorCisgIHsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IG51bWJlcnM7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygiY29yZ2UuQmFyIiwgJm51bWJlcnMpKTsKKyAgICAvLyBOb3RlOiB3b24ndCBmaW5kIGV4dGVuc2lvbiA1NiBkdWUgdG8gdGhlIG5hbWUgbm90IGJlaW5nIGZ1bGx5IHF1YWxpZmllZC4KKyAgICBBU1NFUlRfRVEoMSwgbnVtYmVycy5zaXplKCkpOworICAgIEVYUEVDVF9FUSg3MCwgbnVtYmVyc1swXSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuJ3QgZmluZCBleHRlbnNpb25zIGZvciBub24tZXhpc3RlbnQgdHlwZXMuCisgICAgc3RkOjp2ZWN0b3I8aW50PiBudW1iZXJzOworICAgIEVYUEVDVF9GQUxTRShkYXRhYmFzZV8tPkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKCJOb1N1Y2hUeXBlIiwgJm51bWJlcnMpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4ndCBmaW5kIGV4dGVuc2lvbnMgZm9yIHVucXVhbGlmaWVkIHR5cGVzLgorICAgIHN0ZDo6dmVjdG9yPGludD4gbnVtYmVyczsKKyAgICBFWFBFQ1RfRkFMU0UoZGF0YWJhc2VfLT5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygiQmFyIiwgJm51bWJlcnMpKTsKKyAgfQorfQorCitURVNUX1AoRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwgQ29uZmxpY3RpbmdGaWxlRXJyb3IpIHsKKyAgQWRkVG9EYXRhYmFzZSgKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOiBcIkZvb1wiICIKKyAgICAgICJ9Iik7CisgIEFkZFRvRGF0YWJhc2VXaXRoRXJyb3IoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogXCJCYXJcIiAiCisgICAgICAifSIpOworfQorCitURVNUX1AoRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwgQ29uZmxpY3RpbmdUeXBlRXJyb3IpIHsKKyAgQWRkVG9EYXRhYmFzZSgKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOiBcIkZvb1wiICIKKyAgICAgICJ9Iik7CisgIEFkZFRvRGF0YWJhc2VXaXRoRXJyb3IoCisgICAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogXCJGb29cIiAiCisgICAgICAifSIpOworfQorCitURVNUX1AoRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwgQ29uZmxpY3RpbmdFeHRlbnNpb25FcnJvcikgeworICBBZGRUb0RhdGFiYXNlKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjUgIgorICAgICAgIiAgICAgICAgICAgIGV4dGVuZGVlOiBcIi5Gb29cIiB9Iik7CisgIEFkZFRvRGF0YWJhc2VXaXRoRXJyb3IoCisgICAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImJhclwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6NSAiCisgICAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiLkZvb1wiIH0iKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgU2ltcGxlLCBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0LAorICAgIHRlc3Rpbmc6OlZhbHVlcygmU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2U6Ok5ldykpOworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgTWVtb3J5Q29uc2VydmluZywgRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwKKyAgICB0ZXN0aW5nOjpWYWx1ZXMoJkVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZTo6TmV3KSk7CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChQb29sLCBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzKCZEZXNjcmlwdG9yUG9vbERhdGFiYXNlVGVzdENhc2U6Ok5ldykpOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKK1RFU1QoRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZUV4dHJhVGVzdCwgRmluZE5hbWVPZkZpbGVDb250YWluaW5nU3ltYm9sKSB7CisgIC8vIENyZWF0ZSB0d28gZmlsZXMsIG9uZSBvZiB3aGljaCBpcyBpbiB0d28gcGFydHMuCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTEsIGZpbGUyYSwgZmlsZTJiOworICBmaWxlMS5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisgIGZpbGUxLnNldF9wYWNrYWdlKCJmb28iKTsKKyAgZmlsZTEuYWRkX21lc3NhZ2VfdHlwZSgpLT5zZXRfbmFtZSgiRm9vIik7CisgIGZpbGUyYS5zZXRfbmFtZSgiYmFyLnByb3RvIik7CisgIGZpbGUyYi5zZXRfcGFja2FnZSgiYmFyIik7CisgIGZpbGUyYi5hZGRfbWVzc2FnZV90eXBlKCktPnNldF9uYW1lKCJCYXIiKTsKKworICAvLyBOb3JtYWwgc2VyaWFsaXphdGlvbiBhbGxvd3Mgb3VyIG9wdGltaXphdGlvbiB0byBraWNrIGluLgorICBzdGQ6OnN0cmluZyBkYXRhMSA9IGZpbGUxLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisKKyAgLy8gRm9yY2Ugb3V0LW9mLW9yZGVyIHNlcmlhbGl6YXRpb24gdG8gdGVzdCBzbG93IHBhdGguCisgIHN0ZDo6c3RyaW5nIGRhdGEyID0gZmlsZTJiLlNlcmlhbGl6ZUFzU3RyaW5nKCkgKyBmaWxlMmEuU2VyaWFsaXplQXNTdHJpbmcoKTsKKworICAvLyBDcmVhdGUgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZSBjb250YWluaW5nIGJvdGggZmlsZXMuCisgIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UgZGI7CisgIGRiLkFkZChkYXRhMS5kYXRhKCksIGRhdGExLnNpemUoKSk7CisgIGRiLkFkZChkYXRhMi5kYXRhKCksIGRhdGEyLnNpemUoKSk7CisKKyAgLy8gVGVzdCEKKyAgc3RkOjpzdHJpbmcgZmlsZW5hbWU7CisgIEVYUEVDVF9UUlVFKGRiLkZpbmROYW1lT2ZGaWxlQ29udGFpbmluZ1N5bWJvbCgiZm9vLkZvbyIsICZmaWxlbmFtZSkpOworICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGVuYW1lKTsKKyAgRVhQRUNUX1RSVUUoZGIuRmluZE5hbWVPZkZpbGVDb250YWluaW5nU3ltYm9sKCJmb28uRm9vLkJsYWgiLCAmZmlsZW5hbWUpKTsKKyAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlbmFtZSk7CisgIEVYUEVDVF9UUlVFKGRiLkZpbmROYW1lT2ZGaWxlQ29udGFpbmluZ1N5bWJvbCgiYmFyLkJhciIsICZmaWxlbmFtZSkpOworICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGZpbGVuYW1lKTsKKyAgRVhQRUNUX0ZBTFNFKGRiLkZpbmROYW1lT2ZGaWxlQ29udGFpbmluZ1N5bWJvbCgiZm9vIiwgJmZpbGVuYW1lKSk7CisgIEVYUEVDVF9GQUxTRShkYi5GaW5kTmFtZU9mRmlsZUNvbnRhaW5pbmdTeW1ib2woImJhciIsICZmaWxlbmFtZSkpOworICBFWFBFQ1RfRkFMU0UoZGIuRmluZE5hbWVPZkZpbGVDb250YWluaW5nU3ltYm9sKCJiYXouQmF6IiwgJmZpbGVuYW1lKSk7Cit9CisKK1RFU1QoU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlRXh0cmFUZXN0LCBGaW5kQWxsRmlsZU5hbWVzKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZjsKKyAgZi5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisgIGYuc2V0X3BhY2thZ2UoImZvbyIpOworICBmLmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkZvbyIpOworCisgIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSBkYjsKKyAgZGIuQWRkKGYpOworCisgIC8vIFRlc3QhCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhbGxfZmlsZXM7CisgIGRiLkZpbmRBbGxGaWxlTmFtZXMoJmFsbF9maWxlcyk7CisgIEVYUEVDVF9USEFUKGFsbF9maWxlcywgdGVzdGluZzo6RWxlbWVudHNBcmUoImZvby5wcm90byIpKTsKK30KKworVEVTVChTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2VFeHRyYVRlc3QsIEZpbmRBbGxQYWNrYWdlTmFtZXMpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmOworICBmLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgZi5zZXRfcGFja2FnZSgiZm9vIik7CisgIGYuYWRkX21lc3NhZ2VfdHlwZSgpLT5zZXRfbmFtZSgiRm9vIik7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBiOworICBiLnNldF9uYW1lKCJiYXIucHJvdG8iKTsKKyAgYi5zZXRfcGFja2FnZSgiIik7CisgIGIuYWRkX21lc3NhZ2VfdHlwZSgpLT5zZXRfbmFtZSgiQmFyIik7CisKKyAgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlIGRiOworICBkYi5BZGQoZik7CisgIGRiLkFkZChiKTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGFja2FnZXM7CisgIEVYUEVDVF9UUlVFKGRiLkZpbmRBbGxQYWNrYWdlTmFtZXMoJnBhY2thZ2VzKSk7CisgIEVYUEVDVF9USEFUKHBhY2thZ2VzLCA6OnRlc3Rpbmc6OlVub3JkZXJlZEVsZW1lbnRzQXJlKCJmb28iLCAiIikpOworfQorCitURVNUKFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZUV4dHJhVGVzdCwgRmluZEFsbE1lc3NhZ2VOYW1lcykgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGY7CisgIGYuc2V0X25hbWUoImZvby5wcm90byIpOworICBmLnNldF9wYWNrYWdlKCJmb28iKTsKKyAgZi5hZGRfbWVzc2FnZV90eXBlKCktPnNldF9uYW1lKCJGb28iKTsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIGI7CisgIGIuc2V0X25hbWUoImJhci5wcm90byIpOworICBiLnNldF9wYWNrYWdlKCIiKTsKKyAgYi5hZGRfbWVzc2FnZV90eXBlKCktPnNldF9uYW1lKCJCYXIiKTsKKworICBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UgZGI7CisgIGRiLkFkZChmKTsKKyAgZGIuQWRkKGIpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtZXNzYWdlczsKKyAgRVhQRUNUX1RSVUUoZGIuRmluZEFsbE1lc3NhZ2VOYW1lcygmbWVzc2FnZXMpKTsKKyAgRVhQRUNUX1RIQVQobWVzc2FnZXMsIDo6dGVzdGluZzo6VW5vcmRlcmVkRWxlbWVudHNBcmUoImZvby5Gb28iLCAiQmFyIikpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0KCkKKyAgICAgIDogZm9yd2FyZF9tZXJnZWRfKCZkYXRhYmFzZTFfLCAmZGF0YWJhc2UyXyksCisgICAgICAgIHJldmVyc2VfbWVyZ2VkXygmZGF0YWJhc2UyXywgJmRhdGFiYXNlMV8pIHt9CisKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBBZGRUb0RhdGFiYXNlKAorICAgICAgICAmZGF0YWJhc2UxXywKKyAgICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkZvb1wiIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwIH0gfSAiCisgICAgICAgICJleHRlbnNpb24geyBuYW1lOlwiZm9vX2V4dFwiIGV4dGVuZGVlOiBcIi5Gb29cIiBudW1iZXI6MyAiCisgICAgICAgICIgICAgICAgICAgICBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSAiKTsKKyAgICBBZGRUb0RhdGFiYXNlKAorICAgICAgICAmZGF0YWJhc2UyXywKKyAgICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkJhclwiIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwIH0gfSAiCisgICAgICAgICJleHRlbnNpb24geyBuYW1lOlwiYmFyX2V4dFwiIGV4dGVuZGVlOiBcIi5CYXJcIiBudW1iZXI6NSAiCisgICAgICAgICIgICAgICAgICAgICBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSAiKTsKKworICAgIC8vIGJhei5wcm90byBleGlzdHMgaW4gYm90aCBwb29scywgd2l0aCBkaWZmZXJlbnQgZGVmaW5pdGlvbnMuCisgICAgQWRkVG9EYXRhYmFzZSgKKyAgICAgICAgJmRhdGFiYXNlMV8sCisgICAgICAgICJuYW1lOiBcImJhei5wcm90b1wiICIKKyAgICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6XCJCYXpcIiBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMCB9IH0gIgorICAgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkZyb21Qb29sMVwiIH0gIgorICAgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImJhel9leHRcIiBleHRlbmRlZTogXCIuQmF6XCIgbnVtYmVyOjEyICIKKyAgICAgICAgIiAgICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9ICIKKyAgICAgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJkYXRhYmFzZTFfb25seV9leHRcIiBleHRlbmRlZTogXCIuQmF6XCIgbnVtYmVyOjEzICIKKyAgICAgICAgIiAgICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9ICIpOworICAgIEFkZFRvRGF0YWJhc2UoCisgICAgICAgICZkYXRhYmFzZTJfLAorICAgICAgICAibmFtZTogXCJiYXoucHJvdG9cIiAiCisgICAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOlwiQmF6XCIgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAxMDAgfSB9ICIKKyAgICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6XCJGcm9tUG9vbDJcIiB9ICIKKyAgICAgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJiYXpfZXh0XCIgZXh0ZW5kZWU6IFwiLkJhelwiIG51bWJlcjoxMiAiCisgICAgICAgICIgICAgICAgICAgICBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSAiKTsKKyAgfQorCisgIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSBkYXRhYmFzZTFfOworICBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UgZGF0YWJhc2UyXzsKKworICBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UgZm9yd2FyZF9tZXJnZWRfOworICBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UgcmV2ZXJzZV9tZXJnZWRfOworfTsKKworVEVTVF9GKE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsIEZpbmRGaWxlQnlOYW1lKSB7CisgIHsKKyAgICAvLyBDYW4gZmluZCBmaWxlIHRoYXQgaXMgb25seSBpbiBkYXRhYmFzZTFfLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGb28iKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBmaWxlIHRoYXQgaXMgb25seSBpbiBkYXRhYmFzZTJfLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVCeU5hbWUoImJhci5wcm90byIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJCYXIiKTsKKyAgfQorCisgIHsKKyAgICAvLyBJbiBmb3J3YXJkX21lcmdlZF8sIGRhdGFiYXNlMV8ncyBiYXoucHJvdG8gdGFrZXMgcHJlY2VkZW5jZS4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQnlOYW1lKCJiYXoucHJvdG8iLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiYmF6LnByb3RvIiwgZmlsZS5uYW1lKCkpOworICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiRnJvbVBvb2wxIik7CisgIH0KKworICB7CisgICAgLy8gSW4gcmV2ZXJzZV9tZXJnZWRfLCBkYXRhYmFzZTJfJ3MgYmF6LnByb3RvIHRha2VzIHByZWNlZGVuY2UuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKHJldmVyc2VfbWVyZ2VkXy5GaW5kRmlsZUJ5TmFtZSgiYmF6LnByb3RvIiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImJhei5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkZyb21Qb29sMiIpOworICB9CisKKyAgeworICAgIC8vIENhbid0IGZpbmQgbm9uLWV4aXN0ZW50IGZpbGUuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9GQUxTRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVCeU5hbWUoIm5vX3N1Y2gucHJvdG8iLCAmZmlsZSkpOworICB9Cit9CisKK1RFU1RfRihNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2wpIHsKKyAgeworICAgIC8vIENhbiBmaW5kIGZpbGUgdGhhdCBpcyBvbmx5IGluIGRhdGFiYXNlMV8uCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvbyIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGb28iKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBmaWxlIHRoYXQgaXMgb25seSBpbiBkYXRhYmFzZTJfLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJCYXIiLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiQmFyIik7CisgIH0KKworICB7CisgICAgLy8gSW4gZm9yd2FyZF9tZXJnZWRfLCBkYXRhYmFzZTFfJ3MgYmF6LnByb3RvIHRha2VzIHByZWNlZGVuY2UuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkJheiIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJiYXoucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGcm9tUG9vbDEiKTsKKyAgfQorCisgIHsKKyAgICAvLyBJbiByZXZlcnNlX21lcmdlZF8sIGRhdGFiYXNlMl8ncyBiYXoucHJvdG8gdGFrZXMgcHJlY2VkZW5jZS4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUocmV2ZXJzZV9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiQmF6IiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImJhei5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkZyb21Qb29sMiIpOworICB9CisKKyAgeworICAgIC8vIEZyb21Qb29sMSBvbmx5IHNob3dzIHVwIGluIGZvcndhcmRfbWVyZ2VkXyBiZWNhdXNlIGl0IGlzIG1hc2tlZCBieQorICAgIC8vIGRhdGFiYXNlMl8ncyBiYXoucHJvdG8gaW4gcmV2ZXJzZV9tZXJnZWRfLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJGcm9tUG9vbDEiLCAmZmlsZSkpOworICAgIEVYUEVDVF9GQUxTRShyZXZlcnNlX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJGcm9tUG9vbDEiLCAmZmlsZSkpOworICB9CisKKyAgeworICAgIC8vIENhbid0IGZpbmQgbm9uLWV4aXN0ZW50IHN5bWJvbC4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX0ZBTFNFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIk5vU3VjaFR5cGUiLCAmZmlsZSkpOworICB9Cit9CisKK1RFU1RfRihNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24pIHsKKyAgeworICAgIC8vIENhbiBmaW5kIGZpbGUgdGhhdCBpcyBvbmx5IGluIGRhdGFiYXNlMV8uCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkZvbyIsIDMsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGb28iKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBmaWxlIHRoYXQgaXMgb25seSBpbiBkYXRhYmFzZTJfLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJCYXIiLCA1LCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiQmFyIik7CisgIH0KKworICB7CisgICAgLy8gSW4gZm9yd2FyZF9tZXJnZWRfLCBkYXRhYmFzZTFfJ3MgYmF6LnByb3RvIHRha2VzIHByZWNlZGVuY2UuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkJheiIsIDEyLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiYmF6LnByb3RvIiwgZmlsZS5uYW1lKCkpOworICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiRnJvbVBvb2wxIik7CisgIH0KKworICB7CisgICAgLy8gSW4gcmV2ZXJzZV9tZXJnZWRfLCBkYXRhYmFzZTJfJ3MgYmF6LnByb3RvIHRha2VzIHByZWNlZGVuY2UuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKHJldmVyc2VfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkJheiIsIDEyLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiYmF6LnByb3RvIiwgZmlsZS5uYW1lKCkpOworICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiRnJvbVBvb2wyIik7CisgIH0KKworICB7CisgICAgLy8gQmF6J3MgZXh0ZW5zaW9uIDEzIG9ubHkgc2hvd3MgdXAgaW4gZm9yd2FyZF9tZXJnZWRfIGJlY2F1c2UgaXQgaXMKKyAgICAvLyBtYXNrZWQgYnkgZGF0YWJhc2UyXydzIGJhei5wcm90byBpbiByZXZlcnNlX21lcmdlZF8uCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkJheiIsIDEzLCAmZmlsZSkpOworICAgIEVYUEVDVF9GQUxTRShyZXZlcnNlX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJCYXoiLCAxMywgJmZpbGUpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4ndCBmaW5kIG5vbi1leGlzdGVudCBleHRlbnNpb24uCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9GQUxTRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJGb28iLCA2LCAmZmlsZSkpOworICB9Cit9CisKK1RFU1RfRihNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycykgeworICB7CisgICAgLy8gTWVzc2FnZSBvbmx5IGhhcyBleHRlbnNpb24gaW4gZGF0YWJhc2UxXworICAgIHN0ZDo6dmVjdG9yPGludD4gbnVtYmVyczsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIkZvbyIsICZudW1iZXJzKSk7CisgICAgQVNTRVJUX0VRKDEsIG51bWJlcnMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoMywgbnVtYmVyc1swXSk7CisgIH0KKworICB7CisgICAgLy8gTWVzc2FnZSBvbmx5IGhhcyBleHRlbnNpb24gaW4gZGF0YWJhc2UyXworICAgIHN0ZDo6dmVjdG9yPGludD4gbnVtYmVyczsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIkJhciIsICZudW1iZXJzKSk7CisgICAgQVNTRVJUX0VRKDEsIG51bWJlcnMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoNSwgbnVtYmVyc1swXSk7CisgIH0KKworICB7CisgICAgLy8gTWVyZ2UgcmVzdWx0cyBmcm9tIHRoZSB0d28gZGF0YWJhc2VzLgorICAgIHN0ZDo6dmVjdG9yPGludD4gbnVtYmVyczsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIkJheiIsICZudW1iZXJzKSk7CisgICAgQVNTRVJUX0VRKDIsIG51bWJlcnMuc2l6ZSgpKTsKKyAgICBzdGQ6OnNvcnQobnVtYmVycy5iZWdpbigpLCBudW1iZXJzLmVuZCgpKTsKKyAgICBFWFBFQ1RfRVEoMTIsIG51bWJlcnNbMF0pOworICAgIEVYUEVDVF9FUSgxMywgbnVtYmVyc1sxXSk7CisgIH0KKworICB7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBudW1iZXJzOworICAgIEVYUEVDVF9UUlVFKHJldmVyc2VfbWVyZ2VkXy5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygiQmF6IiwgJm51bWJlcnMpKTsKKyAgICBBU1NFUlRfRVEoMiwgbnVtYmVycy5zaXplKCkpOworICAgIHN0ZDo6c29ydChudW1iZXJzLmJlZ2luKCksIG51bWJlcnMuZW5kKCkpOworICAgIEVYUEVDVF9FUSgxMiwgbnVtYmVyc1swXSk7CisgICAgRVhQRUNUX0VRKDEzLCBudW1iZXJzWzFdKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4ndCBmaW5kIGV4dGVuc2lvbnMgZm9yIGEgbm9uLWV4aXN0ZW50IG1lc3NhZ2UuCisgICAgc3RkOjp2ZWN0b3I8aW50PiBudW1iZXJzOworICAgIEVYUEVDVF9GQUxTRShyZXZlcnNlX21lcmdlZF8uRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIkJsYWgiLCAmbnVtYmVycykpOworICB9Cit9CisKK1RFU1RfRihNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBGaW5kQWxsRmlsZU5hbWVzKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWxlczsKKyAgRVhQRUNUX1RSVUUoZm9yd2FyZF9tZXJnZWRfLkZpbmRBbGxGaWxlTmFtZXMoJmZpbGVzKSk7CisgIEVYUEVDVF9USEFUKGZpbGVzLCA6OnRlc3Rpbmc6OlVub3JkZXJlZEVsZW1lbnRzQXJlKCJmb28ucHJvdG8iLCAiYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhei5wcm90byIsICJiYXoucHJvdG8iKSk7Cit9CisKKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0NzUzMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDg0MzAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgbWFrZXMgZXh0ZW5zaXZlIHVzZSBvZiBSRkMgMzA5Mi4gIDopCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hbnkucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorCisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCit1c2luZyA6OnRlc3Rpbmc6OkFueU9mOworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vIENhbid0IHVzZSBhbiBhbm9ueW1vdXMgbmFtZXNwYWNlIGhlcmUgZHVlIHRvIGJyb2tlbm5lc3Mgb2YgVHJ1NjQgY29tcGlsZXIuCituYW1lc3BhY2UgZGVzY3JpcHRvcl91bml0dGVzdCB7CisKKy8vIFNvbWUgaGVscGVycyB0byBtYWtlIGFzc2VtYmxpbmcgZGVzY3JpcHRvcnMgZmFzdGVyLgorRGVzY3JpcHRvclByb3RvKiBBZGRNZXNzYWdlKEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgRGVzY3JpcHRvclByb3RvKiByZXN1bHQgPSBmaWxlLT5hZGRfbWVzc2FnZV90eXBlKCk7CisgIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0Rlc2NyaXB0b3JQcm90byogQWRkTmVzdGVkTWVzc2FnZShEZXNjcmlwdG9yUHJvdG8qIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICBEZXNjcmlwdG9yUHJvdG8qIHJlc3VsdCA9IHBhcmVudC0+YWRkX25lc3RlZF90eXBlKCk7CisgIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0VudW1EZXNjcmlwdG9yUHJvdG8qIEFkZEVudW0oRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgRW51bURlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gZmlsZS0+YWRkX2VudW1fdHlwZSgpOworICByZXN1bHQtPnNldF9uYW1lKG5hbWUpOworICByZXR1cm4gcmVzdWx0OworfQorCitFbnVtRGVzY3JpcHRvclByb3RvKiBBZGROZXN0ZWRFbnVtKERlc2NyaXB0b3JQcm90byogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICBFbnVtRGVzY3JpcHRvclByb3RvKiByZXN1bHQgPSBwYXJlbnQtPmFkZF9lbnVtX3R5cGUoKTsKKyAgcmVzdWx0LT5zZXRfbmFtZShuYW1lKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworU2VydmljZURlc2NyaXB0b3JQcm90byogQWRkU2VydmljZShGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiByZXN1bHQgPSBmaWxlLT5hZGRfc2VydmljZSgpOworICByZXN1bHQtPnNldF9uYW1lKG5hbWUpOworICByZXR1cm4gcmVzdWx0OworfQorCitGaWVsZERlc2NyaXB0b3JQcm90byogQWRkRmllbGQoRGVzY3JpcHRvclByb3RvKiBwYXJlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbCBsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZSB0eXBlKSB7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiByZXN1bHQgPSBwYXJlbnQtPmFkZF9maWVsZCgpOworICByZXN1bHQtPnNldF9uYW1lKG5hbWUpOworICByZXN1bHQtPnNldF9udW1iZXIobnVtYmVyKTsKKyAgcmVzdWx0LT5zZXRfbGFiZWwobGFiZWwpOworICByZXN1bHQtPnNldF90eXBlKHR5cGUpOworICByZXR1cm4gcmVzdWx0OworfQorCitGaWVsZERlc2NyaXB0b3JQcm90byogQWRkRXh0ZW5zaW9uKEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbCBsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGUgdHlwZSkgeworICBGaWVsZERlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gZmlsZS0+YWRkX2V4dGVuc2lvbigpOworICByZXN1bHQtPnNldF9uYW1lKG5hbWUpOworICByZXN1bHQtPnNldF9udW1iZXIobnVtYmVyKTsKKyAgcmVzdWx0LT5zZXRfbGFiZWwobGFiZWwpOworICByZXN1bHQtPnNldF90eXBlKHR5cGUpOworICByZXN1bHQtPnNldF9leHRlbmRlZShleHRlbmRlZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0ZpZWxkRGVzY3JpcHRvclByb3RvKiBBZGROZXN0ZWRFeHRlbnNpb24oRGVzY3JpcHRvclByb3RvKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbCBsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGUgdHlwZSkgeworICBGaWVsZERlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gcGFyZW50LT5hZGRfZXh0ZW5zaW9uKCk7CisgIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7CisgIHJlc3VsdC0+c2V0X251bWJlcihudW1iZXIpOworICByZXN1bHQtPnNldF9sYWJlbChsYWJlbCk7CisgIHJlc3VsdC0+c2V0X3R5cGUodHlwZSk7CisgIHJlc3VsdC0+c2V0X2V4dGVuZGVlKGV4dGVuZGVlKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSogQWRkRXh0ZW5zaW9uUmFuZ2UoRGVzY3JpcHRvclByb3RvKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSogcmVzdWx0ID0gcGFyZW50LT5hZGRfZXh0ZW5zaW9uX3JhbmdlKCk7CisgIHJlc3VsdC0+c2V0X3N0YXJ0KHN0YXJ0KTsKKyAgcmVzdWx0LT5zZXRfZW5kKGVuZCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0Rlc2NyaXB0b3JQcm90bzo6UmVzZXJ2ZWRSYW5nZSogQWRkUmVzZXJ2ZWRSYW5nZShEZXNjcmlwdG9yUHJvdG8qIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgRGVzY3JpcHRvclByb3RvOjpSZXNlcnZlZFJhbmdlKiByZXN1bHQgPSBwYXJlbnQtPmFkZF9yZXNlcnZlZF9yYW5nZSgpOworICByZXN1bHQtPnNldF9zdGFydChzdGFydCk7CisgIHJlc3VsdC0+c2V0X2VuZChlbmQpOworICByZXR1cm4gcmVzdWx0OworfQorCitFbnVtRGVzY3JpcHRvclByb3RvOjpFbnVtUmVzZXJ2ZWRSYW5nZSogQWRkUmVzZXJ2ZWRSYW5nZSgKKyAgICBFbnVtRGVzY3JpcHRvclByb3RvKiBwYXJlbnQsIGludCBzdGFydCwgaW50IGVuZCkgeworICBFbnVtRGVzY3JpcHRvclByb3RvOjpFbnVtUmVzZXJ2ZWRSYW5nZSogcmVzdWx0ID0gcGFyZW50LT5hZGRfcmVzZXJ2ZWRfcmFuZ2UoKTsKKyAgcmVzdWx0LT5zZXRfc3RhcnQoc3RhcnQpOworICByZXN1bHQtPnNldF9lbmQoZW5kKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBBZGRFbnVtVmFsdWUoRW51bURlc2NyaXB0b3JQcm90byogZW51bV9wcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQgbnVtYmVyKSB7CisgIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gZW51bV9wcm90by0+YWRkX3ZhbHVlKCk7CisgIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7CisgIHJlc3VsdC0+c2V0X251bWJlcihudW1iZXIpOworICByZXR1cm4gcmVzdWx0OworfQorCitNZXRob2REZXNjcmlwdG9yUHJvdG8qIEFkZE1ldGhvZChTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRfdHlwZSkgeworICBNZXRob2REZXNjcmlwdG9yUHJvdG8qIHJlc3VsdCA9IHNlcnZpY2UtPmFkZF9tZXRob2QoKTsKKyAgcmVzdWx0LT5zZXRfbmFtZShuYW1lKTsKKyAgcmVzdWx0LT5zZXRfaW5wdXRfdHlwZShpbnB1dF90eXBlKTsKKyAgcmVzdWx0LT5zZXRfb3V0cHV0X3R5cGUob3V0cHV0X3R5cGUpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBFbXB0eSBlbnVtcyB0ZWNobmljYWxseSBhcmVuJ3QgYWxsb3dlZC4gIFdlIG5lZWQgdG8gaW5zZXJ0IGEgZHVtbXkgdmFsdWUKKy8vIGludG8gdGhlbS4KK3ZvaWQgQWRkRW1wdHlFbnVtKEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIEFkZEVudW1WYWx1ZShBZGRFbnVtKGZpbGUsIG5hbWUpLCBuYW1lICsgIl9EVU1NWSIsIDEpOworfQorCitjbGFzcyBNb2NrRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIE1vY2tFcnJvckNvbGxlY3RvcigpIHt9CisgIH5Nb2NrRXJyb3JDb2xsZWN0b3IoKSBvdmVycmlkZSB7fQorCisgIHN0ZDo6c3RyaW5nIHRleHRfOworICBzdGQ6OnN0cmluZyB3YXJuaW5nX3RleHRfOworCisgIC8vIGltcGxlbWVudHMgRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsIEVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIG92ZXJyaWRlIHsKKyAgICBjb25zdCBjaGFyKiBsb2NhdGlvbl9uYW1lID0gbnVsbHB0cjsKKyAgICBzd2l0Y2ggKGxvY2F0aW9uKSB7CisgICAgICBjYXNlIE5BTUU6CisgICAgICAgIGxvY2F0aW9uX25hbWUgPSAiTkFNRSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBOVU1CRVI6CisgICAgICAgIGxvY2F0aW9uX25hbWUgPSAiTlVNQkVSIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRZUEU6CisgICAgICAgIGxvY2F0aW9uX25hbWUgPSAiVFlQRSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFWFRFTkRFRToKKyAgICAgICAgbG9jYXRpb25fbmFtZSA9ICJFWFRFTkRFRSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBERUZBVUxUX1ZBTFVFOgorICAgICAgICBsb2NhdGlvbl9uYW1lID0gIkRFRkFVTFRfVkFMVUUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BUSU9OX05BTUU6CisgICAgICAgIGxvY2F0aW9uX25hbWUgPSAiT1BUSU9OX05BTUUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BUSU9OX1ZBTFVFOgorICAgICAgICBsb2NhdGlvbl9uYW1lID0gIk9QVElPTl9WQUxVRSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJTlBVVF9UWVBFOgorICAgICAgICBsb2NhdGlvbl9uYW1lID0gIklOUFVUX1RZUEUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1VUUFVUX1RZUEU6CisgICAgICAgIGxvY2F0aW9uX25hbWUgPSAiT1VUUFVUX1RZUEUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSU1QT1JUOgorICAgICAgICBsb2NhdGlvbl9uYW1lID0gIklNUE9SVCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPVEhFUjoKKyAgICAgICAgbG9jYXRpb25fbmFtZSA9ICJPVEhFUiI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJnRleHRfLCAiJDA6ICQxOiAkMjogJDNcbiIsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lLCBsb2NhdGlvbl9uYW1lLCBtZXNzYWdlKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkV2FybmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLCBFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIG92ZXJyaWRlIHsKKyAgICBjb25zdCBjaGFyKiBsb2NhdGlvbl9uYW1lID0gbnVsbHB0cjsKKyAgICBzd2l0Y2ggKGxvY2F0aW9uKSB7CisgICAgICBjYXNlIE5BTUU6CisgICAgICAgIGxvY2F0aW9uX25hbWUgPSAiTkFNRSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBOVU1CRVI6CisgICAgICAgIGxvY2F0aW9uX25hbWUgPSAiTlVNQkVSIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRZUEU6CisgICAgICAgIGxvY2F0aW9uX25hbWUgPSAiVFlQRSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFWFRFTkRFRToKKyAgICAgICAgbG9jYXRpb25fbmFtZSA9ICJFWFRFTkRFRSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBERUZBVUxUX1ZBTFVFOgorICAgICAgICBsb2NhdGlvbl9uYW1lID0gIkRFRkFVTFRfVkFMVUUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BUSU9OX05BTUU6CisgICAgICAgIGxvY2F0aW9uX25hbWUgPSAiT1BUSU9OX05BTUUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BUSU9OX1ZBTFVFOgorICAgICAgICBsb2NhdGlvbl9uYW1lID0gIk9QVElPTl9WQUxVRSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJTlBVVF9UWVBFOgorICAgICAgICBsb2NhdGlvbl9uYW1lID0gIklOUFVUX1RZUEUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1VUUFVUX1RZUEU6CisgICAgICAgIGxvY2F0aW9uX25hbWUgPSAiT1VUUFVUX1RZUEUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSU1QT1JUOgorICAgICAgICBsb2NhdGlvbl9uYW1lID0gIklNUE9SVCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPVEhFUjoKKyAgICAgICAgbG9jYXRpb25fbmFtZSA9ICJPVEhFUiI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJndhcm5pbmdfdGV4dF8sICIkMDogJDE6ICQyOiAkM1xuIiwgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUsIGxvY2F0aW9uX25hbWUsIG1lc3NhZ2UpOworICB9Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFRlc3Qgc2ltcGxlIGZpbGVzLgorY2xhc3MgRmlsZURlc2NyaXB0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKyAgICAvLworICAgIC8vICAgLy8gaW4gImZvby5wcm90byIKKyAgICAvLyAgIG1lc3NhZ2UgRm9vTWVzc2FnZSB7IGV4dGVuc2lvbnMgMTsgfQorICAgIC8vICAgZW51bSBGb29FbnVtIHtGT09fRU5VTV9WQUxVRSA9IDE7fQorICAgIC8vICAgc2VydmljZSBGb29TZXJ2aWNlIHt9CisgICAgLy8gICBleHRlbmQgRm9vTWVzc2FnZSB7IG9wdGlvbmFsIGludDMyIGZvb19leHRlbnNpb24gPSAxOyB9CisgICAgLy8KKyAgICAvLyAgIC8vIGluICJiYXIucHJvdG8iCisgICAgLy8gICBwYWNrYWdlIGJhcl9wYWNrYWdlOworICAgIC8vICAgbWVzc2FnZSBCYXJNZXNzYWdlIHsgZXh0ZW5zaW9ucyAxOyB9CisgICAgLy8gICBlbnVtIEJhckVudW0ge0JBUl9FTlVNX1ZBTFVFID0gMTt9CisgICAgLy8gICBzZXJ2aWNlIEJhclNlcnZpY2Uge30KKyAgICAvLyAgIGV4dGVuZCBCYXJNZXNzYWdlIHsgb3B0aW9uYWwgaW50MzIgYmFyX2V4dGVuc2lvbiA9IDE7IH0KKyAgICAvLworICAgIC8vIEFsc28sIHdlIGhhdmUgYW4gZW1wdHkgZmlsZSAiYmF6LnByb3RvIi4gIFRoaXMgZmlsZSdzIHB1cnBvc2UgaXMgdG8KKyAgICAvLyBtYWtlIHN1cmUgdGhhdCBldmVuIHRob3VnaCBpdCBoYXMgdGhlIHNhbWUgcGFja2FnZSBhcyBmb28ucHJvdG8sCisgICAgLy8gc2VhcmNoaW5nIGl0IGZvciBtZW1iZXJzIG9mIGZvby5wcm90byB3b24ndCB3b3JrLgorCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fZmlsZTsKKyAgICBmb29fZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisgICAgQWRkRXh0ZW5zaW9uUmFuZ2UoQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJGb29NZXNzYWdlIiksIDEsIDIpOworICAgIEFkZEVudW1WYWx1ZShBZGRFbnVtKCZmb29fZmlsZSwgIkZvb0VudW0iKSwgIkZPT19FTlVNX1ZBTFVFIiwgMSk7CisgICAgQWRkU2VydmljZSgmZm9vX2ZpbGUsICJGb29TZXJ2aWNlIik7CisgICAgQWRkRXh0ZW5zaW9uKCZmb29fZmlsZSwgIkZvb01lc3NhZ2UiLCAiZm9vX2V4dGVuc2lvbiIsIDEsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXJfZmlsZTsKKyAgICBiYXJfZmlsZS5zZXRfbmFtZSgiYmFyLnByb3RvIik7CisgICAgYmFyX2ZpbGUuc2V0X3BhY2thZ2UoImJhcl9wYWNrYWdlIik7CisgICAgYmFyX2ZpbGUuYWRkX2RlcGVuZGVuY3koImZvby5wcm90byIpOworICAgIEFkZEV4dGVuc2lvblJhbmdlKEFkZE1lc3NhZ2UoJmJhcl9maWxlLCAiQmFyTWVzc2FnZSIpLCAxLCAyKTsKKyAgICBBZGRFbnVtVmFsdWUoQWRkRW51bSgmYmFyX2ZpbGUsICJCYXJFbnVtIiksICJCQVJfRU5VTV9WQUxVRSIsIDEpOworICAgIEFkZFNlcnZpY2UoJmJhcl9maWxlLCAiQmFyU2VydmljZSIpOworICAgIEFkZEV4dGVuc2lvbigmYmFyX2ZpbGUsICJiYXJfcGFja2FnZS5CYXJNZXNzYWdlIiwgImJhcl9leHRlbnNpb24iLCAxLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gYmF6X2ZpbGU7CisgICAgYmF6X2ZpbGUuc2V0X25hbWUoImJhei5wcm90byIpOworCisgICAgLy8gQnVpbGQgdGhlIGRlc2NyaXB0b3JzIGFuZCBnZXQgdGhlIHBvaW50ZXJzLgorICAgIGZvb19maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShmb29fZmlsZSk7CisgICAgQVNTRVJUX1RSVUUoZm9vX2ZpbGVfICE9IG51bGxwdHIpOworCisgICAgYmFyX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGJhcl9maWxlKTsKKyAgICBBU1NFUlRfVFJVRShiYXJfZmlsZV8gIT0gbnVsbHB0cik7CisKKyAgICBiYXpfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmF6X2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGJhel9maWxlXyAhPSBudWxscHRyKTsKKworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBmb29fbWVzc2FnZV8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgwKTsKKyAgICBBU1NFUlRfRVEoMSwgZm9vX2ZpbGVfLT5lbnVtX3R5cGVfY291bnQoKSk7CisgICAgZm9vX2VudW1fID0gZm9vX2ZpbGVfLT5lbnVtX3R5cGUoMCk7CisgICAgQVNTRVJUX0VRKDEsIGZvb19lbnVtXy0+dmFsdWVfY291bnQoKSk7CisgICAgZm9vX2VudW1fdmFsdWVfID0gZm9vX2VudW1fLT52YWx1ZSgwKTsKKyAgICBBU1NFUlRfRVEoMSwgZm9vX2ZpbGVfLT5zZXJ2aWNlX2NvdW50KCkpOworICAgIGZvb19zZXJ2aWNlXyA9IGZvb19maWxlXy0+c2VydmljZSgwKTsKKyAgICBBU1NFUlRfRVEoMSwgZm9vX2ZpbGVfLT5leHRlbnNpb25fY291bnQoKSk7CisgICAgZm9vX2V4dGVuc2lvbl8gPSBmb29fZmlsZV8tPmV4dGVuc2lvbigwKTsKKworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBiYXJfbWVzc2FnZV8gPSBiYXJfZmlsZV8tPm1lc3NhZ2VfdHlwZSgwKTsKKyAgICBBU1NFUlRfRVEoMSwgYmFyX2ZpbGVfLT5lbnVtX3R5cGVfY291bnQoKSk7CisgICAgYmFyX2VudW1fID0gYmFyX2ZpbGVfLT5lbnVtX3R5cGUoMCk7CisgICAgQVNTRVJUX0VRKDEsIGJhcl9lbnVtXy0+dmFsdWVfY291bnQoKSk7CisgICAgYmFyX2VudW1fdmFsdWVfID0gYmFyX2VudW1fLT52YWx1ZSgwKTsKKyAgICBBU1NFUlRfRVEoMSwgYmFyX2ZpbGVfLT5zZXJ2aWNlX2NvdW50KCkpOworICAgIGJhcl9zZXJ2aWNlXyA9IGJhcl9maWxlXy0+c2VydmljZSgwKTsKKyAgICBBU1NFUlRfRVEoMSwgYmFyX2ZpbGVfLT5leHRlbnNpb25fY291bnQoKSk7CisgICAgYmFyX2V4dGVuc2lvbl8gPSBiYXJfZmlsZV8tPmV4dGVuc2lvbigwKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXJfZmlsZV87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXpfZmlsZV87CisKKyAgY29uc3QgRGVzY3JpcHRvciogZm9vX21lc3NhZ2VfOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogZm9vX2VudW1fOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBmb29fZW51bV92YWx1ZV87CisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBmb29fc2VydmljZV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZm9vX2V4dGVuc2lvbl87CisKKyAgY29uc3QgRGVzY3JpcHRvciogYmFyX21lc3NhZ2VfOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogYmFyX2VudW1fOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBiYXJfZW51bV92YWx1ZV87CisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBiYXJfc2VydmljZV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYmFyX2V4dGVuc2lvbl87Cit9OworCitURVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBOYW1lKSB7CisgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZm9vX2ZpbGVfLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGJhcl9maWxlXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXoucHJvdG8iLCBiYXpfZmlsZV8tPm5hbWUoKSk7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIFBhY2thZ2UpIHsKKyAgRVhQRUNUX0VRKCIiLCBmb29fZmlsZV8tPnBhY2thZ2UoKSk7CisgIEVYUEVDVF9FUSgiYmFyX3BhY2thZ2UiLCBiYXJfZmlsZV8tPnBhY2thZ2UoKSk7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIERlcGVuZGVuY2llcykgeworICBFWFBFQ1RfRVEoMCwgZm9vX2ZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwgYmFyX2ZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCkpOworICBFWFBFQ1RfRVEoZm9vX2ZpbGVfLCBiYXJfZmlsZV8tPmRlcGVuZGVuY3koMCkpOworfQorCitURVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBGaW5kTWVzc2FnZVR5cGVCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGZvb19tZXNzYWdlXywgZm9vX2ZpbGVfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkZvb01lc3NhZ2UiKSk7CisgIEVYUEVDVF9FUShiYXJfbWVzc2FnZV8sIGJhcl9maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJCYXJNZXNzYWdlIikpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJCYXJNZXNzYWdlIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGJhcl9maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb29NZXNzYWdlIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGJhel9maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb29NZXNzYWdlIikgPT0gbnVsbHB0cik7CisKKyAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIk5vU3VjaE1lc3NhZ2UiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkZvb0VudW0iKSA9PSBudWxscHRyKTsKK30KKworVEVTVF9GKEZpbGVEZXNjcmlwdG9yVGVzdCwgRmluZEVudW1UeXBlQnlOYW1lKSB7CisgIEVYUEVDVF9FUShmb29fZW51bV8sIGZvb19maWxlXy0+RmluZEVudW1UeXBlQnlOYW1lKCJGb29FbnVtIikpOworICBFWFBFQ1RfRVEoYmFyX2VudW1fLCBiYXJfZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiQmFyRW51bSIpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiQmFyRW51bSIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShiYXJfZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiRm9vRW51bSIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShiYXpfZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiRm9vRW51bSIpID09IG51bGxwdHIpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZEVudW1UeXBlQnlOYW1lKCJOb1N1Y2hFbnVtIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZEVudW1UeXBlQnlOYW1lKCJGb29NZXNzYWdlIikgPT0gbnVsbHB0cik7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIEZpbmRFbnVtVmFsdWVCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGZvb19lbnVtX3ZhbHVlXywgZm9vX2ZpbGVfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJGT09fRU5VTV9WQUxVRSIpKTsKKyAgRVhQRUNUX0VRKGJhcl9lbnVtX3ZhbHVlXywgYmFyX2ZpbGVfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJCQVJfRU5VTV9WQUxVRSIpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIkJBUl9FTlVNX1ZBTFVFIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGJhcl9maWxlXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiRk9PX0VOVU1fVkFMVUUiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoYmF6X2ZpbGVfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJGT09fRU5VTV9WQUxVRSIpID09IG51bGxwdHIpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiTk9fU1VDSF9WQUxVRSIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIkZvb01lc3NhZ2UiKSA9PSBudWxscHRyKTsKK30KKworVEVTVF9GKEZpbGVEZXNjcmlwdG9yVGVzdCwgRmluZFNlcnZpY2VCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGZvb19zZXJ2aWNlXywgZm9vX2ZpbGVfLT5GaW5kU2VydmljZUJ5TmFtZSgiRm9vU2VydmljZSIpKTsKKyAgRVhQRUNUX0VRKGJhcl9zZXJ2aWNlXywgYmFyX2ZpbGVfLT5GaW5kU2VydmljZUJ5TmFtZSgiQmFyU2VydmljZSIpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRTZXJ2aWNlQnlOYW1lKCJCYXJTZXJ2aWNlIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGJhcl9maWxlXy0+RmluZFNlcnZpY2VCeU5hbWUoIkZvb1NlcnZpY2UiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoYmF6X2ZpbGVfLT5GaW5kU2VydmljZUJ5TmFtZSgiRm9vU2VydmljZSIpID09IG51bGxwdHIpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZFNlcnZpY2VCeU5hbWUoIk5vU3VjaFNlcnZpY2UiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kU2VydmljZUJ5TmFtZSgiRm9vTWVzc2FnZSIpID09IG51bGxwdHIpOworfQorCitURVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBGaW5kRXh0ZW5zaW9uQnlOYW1lKSB7CisgIEVYUEVDVF9FUShmb29fZXh0ZW5zaW9uXywgZm9vX2ZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJmb29fZXh0ZW5zaW9uIikpOworICBFWFBFQ1RfRVEoYmFyX2V4dGVuc2lvbl8sIGJhcl9maWxlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiYmFyX2V4dGVuc2lvbiIpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFeHRlbnNpb25CeU5hbWUoImJhcl9leHRlbnNpb24iKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoYmFyX2ZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJmb29fZXh0ZW5zaW9uIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGJhel9maWxlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiZm9vX2V4dGVuc2lvbiIpID09IG51bGxwdHIpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgibm9fc3VjaF9leHRlbnNpb24iKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJGb29NZXNzYWdlIikgPT0gbnVsbHB0cik7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIEZpbmRFeHRlbnNpb25CeU51bWJlcikgeworICBFWFBFQ1RfRVEoZm9vX2V4dGVuc2lvbl8sIHBvb2xfLkZpbmRFeHRlbnNpb25CeU51bWJlcihmb29fbWVzc2FnZV8sIDEpKTsKKyAgRVhQRUNUX0VRKGJhcl9leHRlbnNpb25fLCBwb29sXy5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoYmFyX21lc3NhZ2VfLCAxKSk7CisKKyAgRVhQRUNUX1RSVUUocG9vbF8uRmluZEV4dGVuc2lvbkJ5TnVtYmVyKGZvb19tZXNzYWdlXywgMikgPT0gbnVsbHB0cik7Cit9CisKKworVEVTVF9GKEZpbGVEZXNjcmlwdG9yVGVzdCwgQnVpbGRBZ2FpbikgeworICAvLyBUZXN0IHRoYXQgaWYgd2UgY2FsbCBCdWlsZEZpbGUgYWdhaW4gb24gdGhlIHNhbWUgaW5wdXQgd2UgZ2V0IHRoZSBzYW1lCisgIC8vIEZpbGVEZXNjcmlwdG9yIGJhY2suCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgZm9vX2ZpbGVfLT5Db3B5VG8oJmZpbGUpOworICBFWFBFQ1RfRVEoZm9vX2ZpbGVfLCBwb29sXy5CdWlsZEZpbGUoZmlsZSkpOworCisgIC8vIEJ1dCBpZiB3ZSBjaGFuZ2UgdGhlIGZpbGUgdGhlbiBpdCB3b24ndCB3b3JrLgorICBmaWxlLnNldF9wYWNrYWdlKCJzb21lLm90aGVyLnBhY2thZ2UiKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8uQnVpbGRGaWxlKGZpbGUpID09IG51bGxwdHIpOworfQorCitURVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBCdWlsZEFnYWluV2l0aFN5bnRheCkgeworICAvLyBUZXN0IHRoYXQgaWYgd2UgY2FsbCBCdWlsZEZpbGUgYWdhaW4gb24gdGhlIHNhbWUgaW5wdXQgd2UgZ2V0IHRoZSBzYW1lCisgIC8vIEZpbGVEZXNjcmlwdG9yIGJhY2sgZXZlbiBpZiBzeW50YXggcGFyYW0gaXMgc3BlY2lmaWVkLgorICBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvX3N5bnRheDI7CisgIHByb3RvX3N5bnRheDIuc2V0X25hbWUoImZvb19zeW50YXgyIik7CisgIHByb3RvX3N5bnRheDIuc2V0X3N5bnRheCgicHJvdG8yIik7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIHByb3RvMl9kZXNjcmlwdG9yID0gcG9vbF8uQnVpbGRGaWxlKHByb3RvX3N5bnRheDIpOworICBFWFBFQ1RfVFJVRShwcm90bzJfZGVzY3JpcHRvciAhPSBudWxscHRyKTsKKyAgRVhQRUNUX0VRKHByb3RvMl9kZXNjcmlwdG9yLCBwb29sXy5CdWlsZEZpbGUocHJvdG9fc3ludGF4MikpOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gaW1wbGljaXRfcHJvdG8yOworICBpbXBsaWNpdF9wcm90bzIuc2V0X25hbWUoImZvb19pbXBsaWNpdF9zeW50YXgyIik7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGltcGxpY2l0X3Byb3RvMl9kZXNjcmlwdG9yID0KKyAgICAgIHBvb2xfLkJ1aWxkRmlsZShpbXBsaWNpdF9wcm90bzIpOworICBFWFBFQ1RfVFJVRShpbXBsaWNpdF9wcm90bzJfZGVzY3JpcHRvciAhPSBudWxscHRyKTsKKyAgLy8gV2UgZ2V0IHRoZSBzYW1lIEZpbGVEZXNjcmlwdG9yIGJhY2sgaWYgc3ludGF4IHBhcmFtIGlzIGV4cGxpY2l0bHkKKyAgLy8gc3BlY2lmaWVkLgorICBpbXBsaWNpdF9wcm90bzIuc2V0X3N5bnRheCgicHJvdG8yIik7CisgIEVYUEVDVF9FUShpbXBsaWNpdF9wcm90bzJfZGVzY3JpcHRvciwgcG9vbF8uQnVpbGRGaWxlKGltcGxpY2l0X3Byb3RvMikpOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG9fc3ludGF4MzsKKyAgcHJvdG9fc3ludGF4My5zZXRfbmFtZSgiZm9vX3N5bnRheDMiKTsKKyAgcHJvdG9fc3ludGF4My5zZXRfc3ludGF4KCJwcm90bzMiKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogcHJvdG8zX2Rlc2NyaXB0b3IgPSBwb29sXy5CdWlsZEZpbGUocHJvdG9fc3ludGF4Myk7CisgIEVYUEVDVF9UUlVFKHByb3RvM19kZXNjcmlwdG9yICE9IG51bGxwdHIpOworICBFWFBFQ1RfRVEocHJvdG8zX2Rlc2NyaXB0b3IsIHBvb2xfLkJ1aWxkRmlsZShwcm90b19zeW50YXgzKSk7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIFN5bnRheCkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvOworICBwcm90by5zZXRfbmFtZSgiZm9vIik7CisgIC8vIEVuYWJsZSB0aGUgdGVzdCB3aGVuIHdlIGFsc28gcG9wdWxhdGUgdGhlIHN5bnRheCBmb3IgcHJvdG8yLgorI2lmIDAKKyAgeworICAgIHByb3RvLnNldF9zeW50YXgoInByb3RvMiIpOworICAgIERlc2NyaXB0b3JQb29sIHBvb2w7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkJ1aWxkRmlsZShwcm90byk7CisgICAgRVhQRUNUX1RSVUUoZmlsZSAhPSBudWxscHRyKTsKKyAgICBFWFBFQ1RfRVEoRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzIsIGZpbGUtPnN5bnRheCgpKTsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIG90aGVyOworICAgIGZpbGUtPkNvcHlUbygmb3RoZXIpOworICAgIEVYUEVDVF9FUSgicHJvdG8yIiwgb3RoZXIuc3ludGF4KCkpOworICB9CisjZW5kaWYKKyAgeworICAgIHByb3RvLnNldF9zeW50YXgoInByb3RvMyIpOworICAgIERlc2NyaXB0b3JQb29sIHBvb2w7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkJ1aWxkRmlsZShwcm90byk7CisgICAgRVhQRUNUX1RSVUUoZmlsZSAhPSBudWxscHRyKTsKKyAgICBFWFBFQ1RfRVEoRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzMsIGZpbGUtPnN5bnRheCgpKTsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIG90aGVyOworICAgIGZpbGUtPkNvcHlUbygmb3RoZXIpOworICAgIEVYUEVDVF9FUSgicHJvdG8zIiwgb3RoZXIuc3ludGF4KCkpOworICB9Cit9CisKK3ZvaWQgRXh0cmFjdERlYnVnU3RyaW5nKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIHZpc2l0ZWQsCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+KiBkZWJ1Z19zdHJpbmdzKSB7CisgIGlmICghdmlzaXRlZC0+aW5zZXJ0KGZpbGUtPm5hbWUoKSkuc2Vjb25kKSB7CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+ZGVwZW5kZW5jeV9jb3VudCgpOyArK2kpIHsKKyAgICBFeHRyYWN0RGVidWdTdHJpbmcoZmlsZS0+ZGVwZW5kZW5jeShpKSwgdmlzaXRlZCwgZGVidWdfc3RyaW5ncyk7CisgIH0KKyAgZGVidWdfc3RyaW5ncy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGZpbGUtPm5hbWUoKSwgZmlsZS0+RGVidWdTdHJpbmcoKSkpOworfQorCitjbGFzcyBTaW1wbGVFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBpbzo6RXJyb3JDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBBZGRFcnJvcihpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIG92ZXJyaWRlIHsKKyAgICBsYXN0X2Vycm9yXyA9IFN0cmluZ1ByaW50ZigiJWQ6JWQ6IiwgbGluZSwgY29sdW1uKSArIG1lc3NhZ2U7CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgbGFzdF9lcnJvcigpIHsgcmV0dXJuIGxhc3RfZXJyb3JfOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBsYXN0X2Vycm9yXzsKK307CisvLyBUZXN0IHRoYXQgdGhlIHJlc3VsdCBvZiBGaWxlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSBjYW4gYmUgdXNlZCB0byBjcmVhdGUKKy8vIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9ycy4KK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIERlYnVnU3RyaW5nUm91bmRUcmlwKSB7CisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB2aXNpdGVkOworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gZGVidWdfc3RyaW5nczsKKyAgRXh0cmFjdERlYnVnU3RyaW5nKHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgJnZpc2l0ZWQsICZkZWJ1Z19zdHJpbmdzKTsKKyAgRXh0cmFjdERlYnVnU3RyaW5nKAorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLAorICAgICAgJnZpc2l0ZWQsICZkZWJ1Z19zdHJpbmdzKTsKKyAgRXh0cmFjdERlYnVnU3RyaW5nKHByb3RvM19hcmVuYV91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPmZpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICZ2aXNpdGVkLCAmZGVidWdfc3RyaW5ncyk7CisgIEFTU0VSVF9HRShkZWJ1Z19zdHJpbmdzLnNpemUoKSwgMyk7CisKKyAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWJ1Z19zdHJpbmdzLnNpemUoKTsgKytpKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgPSBkZWJ1Z19zdHJpbmdzW2ldLmZpcnN0OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50ID0gZGVidWdfc3RyaW5nc1tpXS5zZWNvbmQ7CisgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXRfc3RyZWFtKGNvbnRlbnQuZGF0YSgpLCBjb250ZW50LnNpemUoKSk7CisgICAgU2ltcGxlRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICAgIGlvOjpUb2tlbml6ZXIgdG9rZW5pemVyKCZpbnB1dF9zdHJlYW0sICZlcnJvcl9jb2xsZWN0b3IpOworICAgIGNvbXBpbGVyOjpQYXJzZXIgcGFyc2VyOworICAgIHBhcnNlci5SZWNvcmRFcnJvcnNUbygmZXJyb3JfY29sbGVjdG9yKTsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvOworICAgIEFTU0VSVF9UUlVFKHBhcnNlci5QYXJzZSgmdG9rZW5pemVyLCAmcHJvdG8pKQorICAgICAgICA8PCBlcnJvcl9jb2xsZWN0b3IubGFzdF9lcnJvcigpIDw8ICJcbiIKKyAgICAgICAgPDwgY29udGVudDsKKyAgICBBU1NFUlRfRVEoIiIsIGVycm9yX2NvbGxlY3Rvci5sYXN0X2Vycm9yKCkpOworICAgIHByb3RvLnNldF9uYW1lKG5hbWUpOworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gcG9vbC5CdWlsZEZpbGUocHJvdG8pOworICAgIEFTU0VSVF9UUlVFKGRlc2NyaXB0b3IgIT0gbnVsbHB0cikgPDwgcHJvdG8uRGVidWdTdHJpbmcoKTsKKyAgICBFWFBFQ1RfRVEoY29udGVudCwgZGVzY3JpcHRvci0+RGVidWdTdHJpbmcoKSk7CisgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBUZXN0IHNpbXBsZSBmbGF0IG1lc3NhZ2VzIGFuZCBmaWVsZHMuCitjbGFzcyBEZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgLy8gQnVpbGQgZGVzY3JpcHRvcnMgZm9yIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnM6CisgICAgLy8KKyAgICAvLyAgIC8vIGluICJmb28ucHJvdG8iCisgICAgLy8gICBtZXNzYWdlIFRlc3RGb3JlaWduIHt9CisgICAgLy8gICBlbnVtIFRlc3RFbnVtIHt9CisgICAgLy8KKyAgICAvLyAgIG1lc3NhZ2UgVGVzdE1lc3NhZ2UgeworICAgIC8vICAgICByZXF1aXJlZCBzdHJpbmcgICAgICBmb28gPSAxOworICAgIC8vICAgICBvcHRpb25hbCBUZXN0RW51bSAgICBiYXIgPSA2OworICAgIC8vICAgICByZXBlYXRlZCBUZXN0Rm9yZWlnbiBiYXogPSA1MDAwMDAwMDA7CisgICAgLy8gICAgIG9wdGlvbmFsIGdyb3VwICAgICAgIG1vbyA9IDE1IHt9CisgICAgLy8gICB9CisgICAgLy8KKyAgICAvLyAgIC8vIGluICJiYXIucHJvdG8iCisgICAgLy8gICBwYWNrYWdlIGNvcmdlLmdyYXVsdDsKKyAgICAvLyAgIG1lc3NhZ2UgVGVzdE1lc3NhZ2UyIHsKKyAgICAvLyAgICAgcmVxdWlyZWQgc3RyaW5nIGZvbyA9IDE7CisgICAgLy8gICAgIHJlcXVpcmVkIHN0cmluZyBiYXIgPSAyOworICAgIC8vICAgICByZXF1aXJlZCBzdHJpbmcgbW9vbyA9IDY7CisgICAgLy8gICB9CisgICAgLy8KKyAgICAvLyAgIC8vIGluICJtYXAucHJvdG8iCisgICAgLy8gICBtZXNzYWdlIFRlc3RNZXNzYWdlMyB7CisgICAgLy8gICAgIG1hcDxpbnQzMiwgaW50MzI+IG1hcF9pbnQzMl9pbnQzMiA9IDE7CisgICAgLy8gICB9CisgICAgLy8KKyAgICAvLyAgIC8vIGluICJqc29uLnByb3RvIgorICAgIC8vICAgbWVzc2FnZSBUZXN0TWVzc2FnZTQgeworICAgIC8vICAgICBvcHRpb25hbCBpbnQzMiBmaWVsZF9uYW1lMSA9IDE7CisgICAgLy8gICAgIG9wdGlvbmFsIGludDMyIGZpZWxkTmFtZTIgPSAyOworICAgIC8vICAgICBvcHRpb25hbCBpbnQzMiBGaWVsZE5hbWUzID0gMzsKKyAgICAvLyAgICAgb3B0aW9uYWwgaW50MzIgX2ZpZWxkX25hbWU0ID0gNDsKKyAgICAvLyAgICAgb3B0aW9uYWwgaW50MzIgRklFTERfTkFNRTUgPSA1OworICAgIC8vICAgICBvcHRpb25hbCBpbnQzMiBmaWVsZF9uYW1lNiA9IDYgW2pzb25fbmFtZSA9ICJAdHlwZSJdOworICAgIC8vICAgfQorICAgIC8vCisgICAgLy8gV2UgY2hlYXQgYW5kIHVzZSBUZXN0Rm9yZWlnbiBhcyB0aGUgdHlwZSBmb3IgbW9vIHJhdGhlciB0aGFuIGNyZWF0ZQorICAgIC8vIGFuIGFjdHVhbCBuZXN0ZWQgdHlwZS4KKyAgICAvLworICAgIC8vIFNpbmNlIGFsbCBwcmltaXRpdmUgdHlwZXMgKGluY2x1ZGluZyBzdHJpbmcpIHVzZSB0aGUgc2FtZSBidWlsZGluZworICAgIC8vIGNvZGUsIHRoZXJlJ3Mgbm8gbmVlZCB0byB0ZXN0IGVhY2ggb25lIGluZGl2aWR1YWxseS4KKyAgICAvLworICAgIC8vIFRlc3RNZXNzYWdlMiBpcyBwcmltYXJpbHkgaGVyZSB0byB0ZXN0IEZpbmRGaWVsZEJ5TmFtZSBhbmQgZnJpZW5kcy4KKyAgICAvLyBBbGwgbWVzc2FnZXMgY3JlYXRlZCBmcm9tIHRoZSBzYW1lIERlc2NyaXB0b3JQb29sIHNoYXJlIHRoZSBzYW1lIGxvb2t1cAorICAgIC8vIHRhYmxlLCBzbyB3ZSBuZWVkIHRvIGluc3VyZSB0aGF0IHRoZXkgZG9uJ3QgaW50ZXJmZXJlLgorCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fZmlsZTsKKyAgICBmb29fZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisgICAgQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJUZXN0Rm9yZWlnbiIpOworICAgIEFkZEVtcHR5RW51bSgmZm9vX2ZpbGUsICJUZXN0RW51bSIpOworCisgICAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlID0gQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJUZXN0TWVzc2FnZSIpOworICAgIEFkZEZpZWxkKG1lc3NhZ2UsICJmb28iLCAxLCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVRVUlSRUQsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlLCAiYmFyIiwgNiwgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0VOVU0pCisgICAgICAgIC0+c2V0X3R5cGVfbmFtZSgiVGVzdEVudW0iKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlLCAiYmF6IiwgNTAwMDAwMDAwLCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVQRUFURUQsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfTUVTU0FHRSkKKyAgICAgICAgLT5zZXRfdHlwZV9uYW1lKCJUZXN0Rm9yZWlnbiIpOworICAgIEFkZEZpZWxkKG1lc3NhZ2UsICJtb28iLCAxNSwgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0dST1VQKQorICAgICAgICAtPnNldF90eXBlX25hbWUoIlRlc3RGb3JlaWduIik7CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGJhcl9maWxlOworICAgIGJhcl9maWxlLnNldF9uYW1lKCJiYXIucHJvdG8iKTsKKyAgICBiYXJfZmlsZS5zZXRfcGFja2FnZSgiY29yZ2UuZ3JhdWx0Iik7CisKKyAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UyID0gQWRkTWVzc2FnZSgmYmFyX2ZpbGUsICJUZXN0TWVzc2FnZTIiKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlMiwgImZvbyIsIDEsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVFVSVJFRCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkcpOworICAgIEFkZEZpZWxkKG1lc3NhZ2UyLCAiYmFyIiwgMiwgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUVVJUkVELAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORyk7CisgICAgQWRkRmllbGQobWVzc2FnZTIsICJtb29vIiwgNiwgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUVVJUkVELAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORyk7CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIG1hcF9maWxlOworICAgIG1hcF9maWxlLnNldF9uYW1lKCJtYXAucHJvdG8iKTsKKyAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UzID0gQWRkTWVzc2FnZSgmbWFwX2ZpbGUsICJUZXN0TWVzc2FnZTMiKTsKKworICAgIERlc2NyaXB0b3JQcm90byogZW50cnkgPSBBZGROZXN0ZWRNZXNzYWdlKG1lc3NhZ2UzLCAiTWFwSW50MzJJbnQzMkVudHJ5Iik7CisgICAgQWRkRmllbGQoZW50cnksICJrZXkiLCAxLCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZEZpZWxkKGVudHJ5LCAidmFsdWUiLCAyLCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIGVudHJ5LT5tdXRhYmxlX29wdGlvbnMoKS0+c2V0X21hcF9lbnRyeSh0cnVlKTsKKworICAgIEFkZEZpZWxkKG1lc3NhZ2UzLCAibWFwX2ludDMyX2ludDMyIiwgMSwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVQRUFURUQsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfTUVTU0FHRSkKKyAgICAgICAgLT5zZXRfdHlwZV9uYW1lKCJNYXBJbnQzMkludDMyRW50cnkiKTsKKworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8ganNvbl9maWxlOworICAgIGpzb25fZmlsZS5zZXRfbmFtZSgianNvbi5wcm90byIpOworICAgIGpzb25fZmlsZS5zZXRfc3ludGF4KCJwcm90bzMiKTsKKyAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2U0ID0gQWRkTWVzc2FnZSgmanNvbl9maWxlLCAiVGVzdE1lc3NhZ2U0Iik7CisgICAgQWRkRmllbGQobWVzc2FnZTQsICJmaWVsZF9uYW1lMSIsIDEsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRmllbGQobWVzc2FnZTQsICJmaWVsZE5hbWUyIiwgMiwgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlNCwgIkZpZWxkTmFtZTMiLCAzLCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZEZpZWxkKG1lc3NhZ2U0LCAiX2ZpZWxkX25hbWU0IiwgNCwgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlNCwgIkZJRUxEX05BTUU1IiwgNSwgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlNCwgImZpZWxkX25hbWU2IiwgNiwgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKQorICAgICAgICAtPnNldF9qc29uX25hbWUoIkB0eXBlIik7CisgICAgQWRkRmllbGQobWVzc2FnZTQsICJmaWVsZG5hbWU3IiwgNywgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKworICAgIC8vIEJ1aWxkIHRoZSBkZXNjcmlwdG9ycyBhbmQgZ2V0IHRoZSBwb2ludGVycy4KKyAgICBmb29fZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoZm9vX2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGZvb19maWxlXyAhPSBudWxscHRyKTsKKworICAgIGJhcl9maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShiYXJfZmlsZSk7CisgICAgQVNTRVJUX1RSVUUoYmFyX2ZpbGVfICE9IG51bGxwdHIpOworCisgICAgbWFwX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKG1hcF9maWxlKTsKKyAgICBBU1NFUlRfVFJVRShtYXBfZmlsZV8gIT0gbnVsbHB0cik7CisKKyAgICBqc29uX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGpzb25fZmlsZSk7CisgICAgQVNTRVJUX1RSVUUoanNvbl9maWxlXyAhPSBudWxscHRyKTsKKworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICBlbnVtXyA9IGZvb19maWxlXy0+ZW51bV90eXBlKDApOworCisgICAgQVNTRVJUX0VRKDIsIGZvb19maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGZvcmVpZ25fID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7CisgICAgbWVzc2FnZV8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgxKTsKKworICAgIEFTU0VSVF9FUSg0LCBtZXNzYWdlXy0+ZmllbGRfY291bnQoKSk7CisgICAgZm9vXyA9IG1lc3NhZ2VfLT5maWVsZCgwKTsKKyAgICBiYXJfID0gbWVzc2FnZV8tPmZpZWxkKDEpOworICAgIGJhel8gPSBtZXNzYWdlXy0+ZmllbGQoMik7CisgICAgbW9vXyA9IG1lc3NhZ2VfLT5maWVsZCgzKTsKKworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBtZXNzYWdlMl8gPSBiYXJfZmlsZV8tPm1lc3NhZ2VfdHlwZSgwKTsKKworICAgIEFTU0VSVF9FUSgzLCBtZXNzYWdlMl8tPmZpZWxkX2NvdW50KCkpOworICAgIGZvbzJfID0gbWVzc2FnZTJfLT5maWVsZCgwKTsKKyAgICBiYXIyXyA9IG1lc3NhZ2UyXy0+ZmllbGQoMSk7CisgICAgbW9vbzJfID0gbWVzc2FnZTJfLT5maWVsZCgyKTsKKworICAgIEFTU0VSVF9FUSgxLCBtYXBfZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBtZXNzYWdlM18gPSBtYXBfZmlsZV8tPm1lc3NhZ2VfdHlwZSgwKTsKKworICAgIEFTU0VSVF9FUSgxLCBtZXNzYWdlM18tPmZpZWxkX2NvdW50KCkpOworICAgIG1hcF8gPSBtZXNzYWdlM18tPmZpZWxkKDApOworCisgICAgQVNTRVJUX0VRKDEsIGpzb25fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBtZXNzYWdlNF8gPSBqc29uX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7CisgIH0KKworICB2b2lkIENvcHlXaXRoSnNvbk5hbWUoY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSwgRGVzY3JpcHRvclByb3RvKiBwcm90bykgeworICAgIG1lc3NhZ2UtPkNvcHlUbyhwcm90byk7CisgICAgbWVzc2FnZS0+Q29weUpzb25OYW1lVG8ocHJvdG8pOworICB9CisKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogRmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bigKKyAgICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjLCBpbnQgbnVtYmVyKSB7CisgICAgcmV0dXJuIGRlc2MtPkZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24obnVtYmVyKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXJfZmlsZV87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBtYXBfZmlsZV87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBqc29uX2ZpbGVfOworCisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfOworICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlMl87CisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UzXzsKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZTRfOworICBjb25zdCBEZXNjcmlwdG9yKiBmb3JlaWduXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZm9vXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBiYXJfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGJhel87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbW9vXzsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZvbzJfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGJhcjJfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1vb28yXzsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF87Cit9OworCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIE5hbWUpIHsKKyAgRVhQRUNUX0VRKCJUZXN0TWVzc2FnZSIsIG1lc3NhZ2VfLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlIiwgbWVzc2FnZV8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKGZvb19maWxlXywgbWVzc2FnZV8tPmZpbGUoKSk7CisKKyAgRVhQRUNUX0VRKCJUZXN0TWVzc2FnZTIiLCBtZXNzYWdlMl8tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RNZXNzYWdlMiIsIG1lc3NhZ2UyXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoYmFyX2ZpbGVfLCBtZXNzYWdlMl8tPmZpbGUoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgQ29udGFpbmluZ1R5cGUpIHsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPmNvbnRhaW5pbmdfdHlwZSgpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMl8tPmNvbnRhaW5pbmdfdHlwZSgpID09IG51bGxwdHIpOworfQorCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkTmFtZXNEZWR1cCkgeworICBjb25zdCBhdXRvIGNvbGxlY3RfdW5pcXVlX25hbWVzID0gW10oY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBuYW1lc3tmaWVsZC0+bmFtZSgpLCBmaWVsZC0+bG93ZXJjYXNlX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmNhbWVsY2FzZV9uYW1lKCksIGZpZWxkLT5qc29uX25hbWUoKX07CisgICAgLy8gVmVyaWZ5IHRoYXQgd2UgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygc3RyaW5nIG9iamVjdHMgYXMgd2UgaGF2ZSBzdHJpbmcKKyAgICAvLyB2YWx1ZXMuIFRoYXQgaXMsIGR1cGxpY2F0ZSBuYW1lcyB1c2UgdGhlIHNhbWUgc3RkOjpzdHJpbmcgb2JqZWN0LgorICAgIC8vIFRoaXMgaXMgZm9yIG1lbW9yeSBlZmZpY2llbmN5LgorICAgIEVYUEVDVF9FUShuYW1lcy5zaXplKCksIChzdGQ6OnNldDxjb25zdCBzdGQ6OnN0cmluZyo+eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGQtPm5hbWUoKSwgJmZpZWxkLT5sb3dlcmNhc2VfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGQtPmNhbWVsY2FzZV9uYW1lKCksICZmaWVsZC0+anNvbl9uYW1lKCl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSgpKSkKKyAgICAgICAgPDwgdGVzdGluZzo6UHJpbnRUb1N0cmluZyhuYW1lcyk7CisgICAgcmV0dXJuIG5hbWVzOworICB9OworCisgIHVzaW5nIHRlc3Rpbmc6OkVsZW1lbnRzQXJlOworICAvLyBmaWVsZF9uYW1lMQorICBFWFBFQ1RfVEhBVChjb2xsZWN0X3VuaXF1ZV9uYW1lcyhtZXNzYWdlNF8tPmZpZWxkKDApKSwKKyAgICAgICAgICAgICAgRWxlbWVudHNBcmUoImZpZWxkTmFtZTEiLCAiZmllbGRfbmFtZTEiKSk7CisgIC8vIGZpZWxkTmFtZTIKKyAgRVhQRUNUX1RIQVQoY29sbGVjdF91bmlxdWVfbmFtZXMobWVzc2FnZTRfLT5maWVsZCgxKSksCisgICAgICAgICAgICAgIEVsZW1lbnRzQXJlKCJmaWVsZE5hbWUyIiwgImZpZWxkbmFtZTIiKSk7CisgIC8vIEZpZWxkTmFtZTMKKyAgRVhQRUNUX1RIQVQoY29sbGVjdF91bmlxdWVfbmFtZXMobWVzc2FnZTRfLT5maWVsZCgyKSksCisgICAgICAgICAgICAgIEVsZW1lbnRzQXJlKCJGaWVsZE5hbWUzIiwgImZpZWxkTmFtZTMiLCAiZmllbGRuYW1lMyIpKTsKKyAgLy8gX2ZpZWxkX25hbWU0CisgIEVYUEVDVF9USEFUKGNvbGxlY3RfdW5pcXVlX25hbWVzKG1lc3NhZ2U0Xy0+ZmllbGQoMykpLAorICAgICAgICAgICAgICBFbGVtZW50c0FyZSgiRmllbGROYW1lNCIsICJfZmllbGRfbmFtZTQiLCAiZmllbGROYW1lNCIpKTsKKyAgLy8gRklFTERfTkFNRTUKKyAgRVhQRUNUX1RIQVQoCisgICAgICBjb2xsZWN0X3VuaXF1ZV9uYW1lcyhtZXNzYWdlNF8tPmZpZWxkKDQpKSwKKyAgICAgIEVsZW1lbnRzQXJlKCJGSUVMRE5BTUU1IiwgIkZJRUxEX05BTUU1IiwgImZJRUxETkFNRTUiLCAiZmllbGRfbmFtZTUiKSk7CisgIC8vIGZpZWxkX25hbWU2LCB3aXRoIGpzb24gbmFtZSBAdHlwZQorICBFWFBFQ1RfVEhBVChjb2xsZWN0X3VuaXF1ZV9uYW1lcyhtZXNzYWdlNF8tPmZpZWxkKDUpKSwKKyAgICAgICAgICAgICAgRWxlbWVudHNBcmUoIkB0eXBlIiwgImZpZWxkTmFtZTYiLCAiZmllbGRfbmFtZTYiKSk7CisgIC8vIGZpZWxkbmFtZTcKKyAgRVhQRUNUX1RIQVQoY29sbGVjdF91bmlxdWVfbmFtZXMobWVzc2FnZTRfLT5maWVsZCg2KSksCisgICAgICAgICAgICAgIEVsZW1lbnRzQXJlKCJmaWVsZG5hbWU3IikpOworfQorCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkTmFtZURlZHVwSnNvbkVxRnVsbCkgeworICAvLyBUZXN0IGEgcmVncmVzc2lvbiB3aGVyZSBqc29uX25hbWUgPT0gZnVsbF9uYW1lCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG87CisgIHByb3RvLnNldF9uYW1lKCJmaWxlIik7CisgIGF1dG8qIG1lc3NhZ2UgPSBBZGRNZXNzYWdlKCZwcm90bywgIk5hbWUxIik7CisgIGF1dG8qIGZpZWxkID0KKyAgICAgIEFkZEZpZWxkKG1lc3NhZ2UsICJOYW1lMiIsIDEsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgZmllbGQtPnNldF9qc29uX25hbWUoIk5hbWUxLk5hbWUyIik7CisgIGF1dG8qIGZpbGUgPSBwb29sXy5CdWlsZEZpbGUocHJvdG8pOworICBFWFBFQ1RfRVEoZmlsZS0+bWVzc2FnZV90eXBlKDApLT5uYW1lKCksICJOYW1lMSIpOworICBFWFBFQ1RfRVEoZmlsZS0+bWVzc2FnZV90eXBlKDApLT5maWVsZCgwKS0+bmFtZSgpLCAiTmFtZTIiKTsKKyAgRVhQRUNUX0VRKGZpbGUtPm1lc3NhZ2VfdHlwZSgwKS0+ZmllbGQoMCktPmZ1bGxfbmFtZSgpLCAiTmFtZTEuTmFtZTIiKTsKKyAgRVhQRUNUX0VRKGZpbGUtPm1lc3NhZ2VfdHlwZSgwKS0+ZmllbGQoMCktPmpzb25fbmFtZSgpLCAiTmFtZTEuTmFtZTIiKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaWVsZHNCeUluZGV4KSB7CisgIEFTU0VSVF9FUSg0LCBtZXNzYWdlXy0+ZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUShmb29fLCBtZXNzYWdlXy0+ZmllbGQoMCkpOworICBFWFBFQ1RfRVEoYmFyXywgbWVzc2FnZV8tPmZpZWxkKDEpKTsKKyAgRVhQRUNUX0VRKGJhel8sIG1lc3NhZ2VfLT5maWVsZCgyKSk7CisgIEVYUEVDVF9FUShtb29fLCBtZXNzYWdlXy0+ZmllbGQoMykpOworfQorCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpbmRGaWVsZEJ5TmFtZSkgeworICAvLyBBbGwgbWVzc2FnZXMgaW4gdGhlIHNhbWUgRGVzY3JpcHRvclBvb2wgc2hhcmUgYSBzaW5nbGUgbG9va3VwIHRhYmxlIGZvcgorICAvLyBmaWVsZHMuICBTbywgaW4gYWRkaXRpb24gdG8gdGVzdGluZyB0aGF0IEZpbmRGaWVsZEJ5TmFtZSBmaW5kcyB0aGUgZmllbGRzCisgIC8vIG9mIHRoZSBtZXNzYWdlLCB3ZSBuZWVkIHRvIHRlc3QgdGhhdCBpdCBkb2VzICpub3QqIGZpbmQgdGhlIGZpZWxkcyBvZgorICAvLyAqb3RoZXIqIG1lc3NhZ2VzLgorCisgIEVYUEVDVF9FUShmb29fLCBtZXNzYWdlXy0+RmluZEZpZWxkQnlOYW1lKCJmb28iKSk7CisgIEVYUEVDVF9FUShiYXJfLCBtZXNzYWdlXy0+RmluZEZpZWxkQnlOYW1lKCJiYXIiKSk7CisgIEVYUEVDVF9FUShiYXpfLCBtZXNzYWdlXy0+RmluZEZpZWxkQnlOYW1lKCJiYXoiKSk7CisgIEVYUEVDVF9FUShtb29fLCBtZXNzYWdlXy0+RmluZEZpZWxkQnlOYW1lKCJtb28iKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeU5hbWUoIm5vX3N1Y2hfZmllbGQiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgibW9vbyIpID09IG51bGxwdHIpOworCisgIEVYUEVDVF9FUShmb28yXywgbWVzc2FnZTJfLT5GaW5kRmllbGRCeU5hbWUoImZvbyIpKTsKKyAgRVhQRUNUX0VRKGJhcjJfLCBtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TmFtZSgiYmFyIikpOworICBFWFBFQ1RfRVEobW9vbzJfLCBtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TmFtZSgibW9vbyIpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTJfLT5GaW5kRmllbGRCeU5hbWUoImJheiIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TmFtZSgibW9vIikgPT0gbnVsbHB0cik7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmluZEZpZWxkQnlOdW1iZXIpIHsKKyAgRVhQRUNUX0VRKGZvb18sIG1lc3NhZ2VfLT5GaW5kRmllbGRCeU51bWJlcigxKSk7CisgIEVYUEVDVF9FUShiYXJfLCBtZXNzYWdlXy0+RmluZEZpZWxkQnlOdW1iZXIoNikpOworICBFWFBFQ1RfRVEoYmF6XywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TnVtYmVyKDUwMDAwMDAwMCkpOworICBFWFBFQ1RfRVEobW9vXywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TnVtYmVyKDE1KSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeU51bWJlcig4Mzc1OTIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlOdW1iZXIoMikgPT0gbnVsbHB0cik7CisKKyAgRVhQRUNUX0VRKGZvbzJfLCBtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TnVtYmVyKDEpKTsKKyAgRVhQRUNUX0VRKGJhcjJfLCBtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TnVtYmVyKDIpKTsKKyAgRVhQRUNUX0VRKG1vb28yXywgbWVzc2FnZTJfLT5GaW5kRmllbGRCeU51bWJlcig2KSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyXy0+RmluZEZpZWxkQnlOdW1iZXIoMTUpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TnVtYmVyKDUwMDAwMDAwMCkgPT0gbnVsbHB0cik7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGROYW1lKSB7CisgIEVYUEVDVF9FUSgiZm9vIiwgZm9vXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXIiLCBiYXJfLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoImJheiIsIGJhel8tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgibW9vIiwgbW9vXy0+bmFtZSgpKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaWVsZEZ1bGxOYW1lKSB7CisgIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UuZm9vIiwgZm9vXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlLmJhciIsIGJhcl8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJUZXN0TWVzc2FnZS5iYXoiLCBiYXpfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UubW9vIiwgbW9vXy0+ZnVsbF9uYW1lKCkpOworCisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RNZXNzYWdlMi5mb28iLCBmb28yXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0TWVzc2FnZTIuYmFyIiwgYmFyMl8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLm1vb28iLCBtb29vMl8tPmZ1bGxfbmFtZSgpKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBQcmludGFibGVOYW1lSXNGdWxsTmFtZUZvck5vbkV4dGVuc2lvbkZpZWxkcykgeworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlLmZvbyIsIGZvb18tPlByaW50YWJsZU5hbWVGb3JFeHRlbnNpb24oKSk7CisgIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UuYmFyIiwgYmFyXy0+UHJpbnRhYmxlTmFtZUZvckV4dGVuc2lvbigpKTsKKyAgRVhQRUNUX0VRKCJUZXN0TWVzc2FnZS5iYXoiLCBiYXpfLT5QcmludGFibGVOYW1lRm9yRXh0ZW5zaW9uKCkpOworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlLm1vbyIsIG1vb18tPlByaW50YWJsZU5hbWVGb3JFeHRlbnNpb24oKSk7CisKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLmZvbyIsCisgICAgICAgICAgICBmb28yXy0+UHJpbnRhYmxlTmFtZUZvckV4dGVuc2lvbigpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLmJhciIsCisgICAgICAgICAgICBiYXIyXy0+UHJpbnRhYmxlTmFtZUZvckV4dGVuc2lvbigpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLm1vb28iLAorICAgICAgICAgICAgbW9vbzJfLT5QcmludGFibGVOYW1lRm9yRXh0ZW5zaW9uKCkpOworfQorCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIFByaW50YWJsZU5hbWVJc0Z1bGxOYW1lRm9yTm9uTWVzc2FnZVNldEV4dGVuc2lvbikgeworICBFWFBFQ1RfRVEoInByb3RvYnVmX3VuaXR0ZXN0LkFnZ3JlZ2F0ZS5uZXN0ZWQiLAorICAgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkFnZ3JlZ2F0ZTo6ZGVzY3JpcHRvcigpCisgICAgICAgICAgICAgICAgLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJuZXN0ZWQiKQorICAgICAgICAgICAgICAgIC0+UHJpbnRhYmxlTmFtZUZvckV4dGVuc2lvbigpKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBQcmludGFibGVOYW1lSXNFeHRlbmRpbmdUeXBlRm9yTWVzc2FnZVNldEV4dGVuc2lvbikgeworICBFWFBFQ1RfRVEoInByb3RvYnVmX3VuaXR0ZXN0LkFnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50IiwKKyAgICAgICAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudDo6ZGVzY3JpcHRvcigpCisgICAgICAgICAgICAgICAgLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJtZXNzYWdlX3NldF9leHRlbnNpb24iKQorICAgICAgICAgICAgICAgIC0+UHJpbnRhYmxlTmFtZUZvckV4dGVuc2lvbigpKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaWVsZEpzb25OYW1lKSB7CisgIEVYUEVDVF9FUSgiZmllbGROYW1lMSIsIG1lc3NhZ2U0Xy0+ZmllbGQoMCktPmpzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmaWVsZE5hbWUyIiwgbWVzc2FnZTRfLT5maWVsZCgxKS0+anNvbl9uYW1lKCkpOworICBFWFBFQ1RfRVEoIkZpZWxkTmFtZTMiLCBtZXNzYWdlNF8tPmZpZWxkKDIpLT5qc29uX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiRmllbGROYW1lNCIsIG1lc3NhZ2U0Xy0+ZmllbGQoMyktPmpzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJGSUVMRE5BTUU1IiwgbWVzc2FnZTRfLT5maWVsZCg0KS0+anNvbl9uYW1lKCkpOworICBFWFBFQ1RfRVEoIkB0eXBlIiwgbWVzc2FnZTRfLT5maWVsZCg1KS0+anNvbl9uYW1lKCkpOworCisgIERlc2NyaXB0b3JQcm90byBwcm90bzsKKyAgbWVzc2FnZTRfLT5Db3B5VG8oJnByb3RvKTsKKyAgQVNTRVJUX0VRKDcsIHByb3RvLmZpZWxkX3NpemUoKSk7CisgIEVYUEVDVF9GQUxTRShwcm90by5maWVsZCgwKS5oYXNfanNvbl9uYW1lKCkpOworICBFWFBFQ1RfRkFMU0UocHJvdG8uZmllbGQoMSkuaGFzX2pzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHByb3RvLmZpZWxkKDIpLmhhc19qc29uX25hbWUoKSk7CisgIEVYUEVDVF9GQUxTRShwcm90by5maWVsZCgzKS5oYXNfanNvbl9uYW1lKCkpOworICBFWFBFQ1RfRkFMU0UocHJvdG8uZmllbGQoNCkuaGFzX2pzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJAdHlwZSIsIHByb3RvLmZpZWxkKDUpLmpzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHByb3RvLmZpZWxkKDYpLmhhc19qc29uX25hbWUoKSk7CisKKyAgcHJvdG8uQ2xlYXIoKTsKKyAgQ29weVdpdGhKc29uTmFtZShtZXNzYWdlNF8sICZwcm90byk7CisgIEFTU0VSVF9FUSg3LCBwcm90by5maWVsZF9zaXplKCkpOworICBFWFBFQ1RfRVEoImZpZWxkTmFtZTEiLCBwcm90by5maWVsZCgwKS5qc29uX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiZmllbGROYW1lMiIsIHByb3RvLmZpZWxkKDEpLmpzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJGaWVsZE5hbWUzIiwgcHJvdG8uZmllbGQoMikuanNvbl9uYW1lKCkpOworICBFWFBFQ1RfRVEoIkZpZWxkTmFtZTQiLCBwcm90by5maWVsZCgzKS5qc29uX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiRklFTEROQU1FNSIsIHByb3RvLmZpZWxkKDQpLmpzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJAdHlwZSIsIHByb3RvLmZpZWxkKDUpLmpzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmaWVsZG5hbWU3IiwgcHJvdG8uZmllbGQoNikuanNvbl9uYW1lKCkpOworCisgIC8vIFRlc3QgZ2VuZXJhdGVkIGRlc2NyaXB0b3IuCisgIGNvbnN0IERlc2NyaXB0b3IqIGdlbmVyYXRlZCA9IHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0SnNvbk5hbWU6OmRlc2NyaXB0b3IoKTsKKyAgQVNTRVJUX0VRKDcsIGdlbmVyYXRlZC0+ZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgiZmllbGROYW1lMSIsIGdlbmVyYXRlZC0+ZmllbGQoMCktPmpzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmaWVsZE5hbWUyIiwgZ2VuZXJhdGVkLT5maWVsZCgxKS0+anNvbl9uYW1lKCkpOworICBFWFBFQ1RfRVEoIkZpZWxkTmFtZTMiLCBnZW5lcmF0ZWQtPmZpZWxkKDIpLT5qc29uX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiRmllbGROYW1lNCIsIGdlbmVyYXRlZC0+ZmllbGQoMyktPmpzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJGSUVMRE5BTUU1IiwgZ2VuZXJhdGVkLT5maWVsZCg0KS0+anNvbl9uYW1lKCkpOworICBFWFBFQ1RfRVEoIkB0eXBlIiwgZ2VuZXJhdGVkLT5maWVsZCg1KS0+anNvbl9uYW1lKCkpOworICBFWFBFQ1RfRVEoImZpZWxkbmFtZTciLCBnZW5lcmF0ZWQtPmZpZWxkKDYpLT5qc29uX25hbWUoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRGaWxlKSB7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIGZvb18tPmZpbGUoKSk7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIGJhcl8tPmZpbGUoKSk7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIGJhel8tPmZpbGUoKSk7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIG1vb18tPmZpbGUoKSk7CisKKyAgRVhQRUNUX0VRKGJhcl9maWxlXywgZm9vMl8tPmZpbGUoKSk7CisgIEVYUEVDVF9FUShiYXJfZmlsZV8sIGJhcjJfLT5maWxlKCkpOworICBFWFBFQ1RfRVEoYmFyX2ZpbGVfLCBtb29vMl8tPmZpbGUoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRJbmRleCkgeworICBFWFBFQ1RfRVEoMCwgZm9vXy0+aW5kZXgoKSk7CisgIEVYUEVDVF9FUSgxLCBiYXJfLT5pbmRleCgpKTsKKyAgRVhQRUNUX0VRKDIsIGJhel8tPmluZGV4KCkpOworICBFWFBFQ1RfRVEoMywgbW9vXy0+aW5kZXgoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGROdW1iZXIpIHsKKyAgRVhQRUNUX0VRKDEsIGZvb18tPm51bWJlcigpKTsKKyAgRVhQRUNUX0VRKDYsIGJhcl8tPm51bWJlcigpKTsKKyAgRVhQRUNUX0VRKDUwMDAwMDAwMCwgYmF6Xy0+bnVtYmVyKCkpOworICBFWFBFQ1RfRVEoMTUsIG1vb18tPm51bWJlcigpKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaWVsZFR5cGUpIHsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcsIGZvb18tPnR5cGUoKSk7CisgIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSwgYmFyXy0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBiYXpfLT50eXBlKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQLCBtb29fLT50eXBlKCkpOworfQorCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkTGFiZWwpIHsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVRVUlSRUQsIGZvb18tPmxhYmVsKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTCwgYmFyXy0+bGFiZWwoKSk7CisgIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVELCBiYXpfLT5sYWJlbCgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfT1BUSU9OQUwsIG1vb18tPmxhYmVsKCkpOworCisgIEVYUEVDVF9UUlVFKGZvb18tPmlzX3JlcXVpcmVkKCkpOworICBFWFBFQ1RfRkFMU0UoZm9vXy0+aXNfb3B0aW9uYWwoKSk7CisgIEVYUEVDVF9GQUxTRShmb29fLT5pc19yZXBlYXRlZCgpKTsKKworICBFWFBFQ1RfRkFMU0UoYmFyXy0+aXNfcmVxdWlyZWQoKSk7CisgIEVYUEVDVF9UUlVFKGJhcl8tPmlzX29wdGlvbmFsKCkpOworICBFWFBFQ1RfRkFMU0UoYmFyXy0+aXNfcmVwZWF0ZWQoKSk7CisKKyAgRVhQRUNUX0ZBTFNFKGJhel8tPmlzX3JlcXVpcmVkKCkpOworICBFWFBFQ1RfRkFMU0UoYmF6Xy0+aXNfb3B0aW9uYWwoKSk7CisgIEVYUEVDVF9UUlVFKGJhel8tPmlzX3JlcGVhdGVkKCkpOworfQorCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIElzTWFwKSB7CisgIEVYUEVDVF9UUlVFKG1hcF8tPmlzX21hcCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGJhel8tPmlzX21hcCgpKTsKKyAgRVhQRUNUX1RSVUUobWFwXy0+bWVzc2FnZV90eXBlKCktPm9wdGlvbnMoKS5tYXBfZW50cnkoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgR2V0TWFwKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIG1hcF9kZXNjID0gbWFwXy0+bWVzc2FnZV90eXBlKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX2tleSA9IG1hcF9kZXNjLT5tYXBfa2V5KCk7CisgIEFTU0VSVF9UUlVFKG1hcF9rZXkgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9FUShtYXBfa2V5LT5uYW1lKCksICJrZXkiKTsKKyAgRVhQRUNUX0VRKG1hcF9rZXktPm51bWJlcigpLCAxKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF92YWx1ZSA9IG1hcF9kZXNjLT5tYXBfdmFsdWUoKTsKKyAgQVNTRVJUX1RSVUUobWFwX3ZhbHVlICE9IG51bGxwdHIpOworICBFWFBFQ1RfRVEobWFwX3ZhbHVlLT5uYW1lKCksICJ2YWx1ZSIpOworICBFWFBFQ1RfRVEobWFwX3ZhbHVlLT5udW1iZXIoKSwgMik7CisKKyAgRVhQRUNUX0VRKG1lc3NhZ2VfLT5tYXBfa2V5KCksIG51bGxwdHIpOworICBFWFBFQ1RfRVEobWVzc2FnZV8tPm1hcF92YWx1ZSgpLCBudWxscHRyKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaWVsZEhhc0RlZmF1bHQpIHsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBFWFBFQ1RfRkFMU0UoYmFyXy0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShiYXpfLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1vb18tPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworfQorCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkQ29udGFpbmluZ1R5cGUpIHsKKyAgRVhQRUNUX0VRKG1lc3NhZ2VfLCBmb29fLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXywgYmFyXy0+Y29udGFpbmluZ190eXBlKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZV8sIGJhel8tPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2VfLCBtb29fLT5jb250YWluaW5nX3R5cGUoKSk7CisKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyXywgZm9vMl8tPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyXywgYmFyMl8tPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyXywgbW9vbzJfLT5jb250YWluaW5nX3R5cGUoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRNZXNzYWdlVHlwZSkgeworICBFWFBFQ1RfVFJVRShmb29fLT5tZXNzYWdlX3R5cGUoKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoYmFyXy0+bWVzc2FnZV90eXBlKCkgPT0gbnVsbHB0cik7CisKKyAgRVhQRUNUX0VRKGZvcmVpZ25fLCBiYXpfLT5tZXNzYWdlX3R5cGUoKSk7CisgIEVYUEVDVF9FUShmb3JlaWduXywgbW9vXy0+bWVzc2FnZV90eXBlKCkpOworfQorCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkRW51bVR5cGUpIHsKKyAgRVhQRUNUX1RSVUUoZm9vXy0+ZW51bV90eXBlKCkgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGJhel8tPmVudW1fdHlwZSgpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShtb29fLT5lbnVtX3R5cGUoKSA9PSBudWxscHRyKTsKKworICBFWFBFQ1RfRVEoZW51bV8sIGJhcl8tPmVudW1fdHlwZSgpKTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFRlc3Qgc2ltcGxlIGZsYXQgbWVzc2FnZXMgYW5kIGZpZWxkcy4KK2NsYXNzIE9uZW9mRGVzY3JpcHRvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIC8vIEJ1aWxkIGRlc2NyaXB0b3JzIGZvciB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zOgorICAgIC8vCisgICAgLy8gICBwYWNrYWdlIGdhcnBseTsKKyAgICAvLyAgIG1lc3NhZ2UgVGVzdE9uZW9mIHsKKyAgICAvLyAgICAgb3B0aW9uYWwgaW50MzIgYSA9IDE7CisgICAgLy8gICAgIG9uZW9mIGZvbyB7CisgICAgLy8gICAgICAgc3RyaW5nIGIgPSAyOworICAgIC8vICAgICAgIFRlc3RPbmVvZiBjID0gMzsKKyAgICAvLyAgICAgfQorICAgIC8vICAgICBvbmVvZiBiYXIgeworICAgIC8vICAgICAgIGZsb2F0IGQgPSA0OworICAgIC8vICAgICB9CisgICAgLy8gICB9CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGJhel9maWxlOworICAgIGJhel9maWxlLnNldF9uYW1lKCJiYXoucHJvdG8iKTsKKyAgICBiYXpfZmlsZS5zZXRfcGFja2FnZSgiZ2FycGx5Iik7CisKKyAgICBEZXNjcmlwdG9yUHJvdG8qIG9uZW9mX21lc3NhZ2UgPSBBZGRNZXNzYWdlKCZiYXpfZmlsZSwgIlRlc3RPbmVvZiIpOworICAgIG9uZW9mX21lc3NhZ2UtPmFkZF9vbmVvZl9kZWNsKCktPnNldF9uYW1lKCJmb28iKTsKKyAgICBvbmVvZl9tZXNzYWdlLT5hZGRfb25lb2ZfZGVjbCgpLT5zZXRfbmFtZSgiYmFyIik7CisKKyAgICBBZGRGaWVsZChvbmVvZl9tZXNzYWdlLCAiYSIsIDEsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRmllbGQob25lb2ZfbWVzc2FnZSwgImIiLCAyLCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HKTsKKyAgICBvbmVvZl9tZXNzYWdlLT5tdXRhYmxlX2ZpZWxkKDEpLT5zZXRfb25lb2ZfaW5kZXgoMCk7CisgICAgQWRkRmllbGQob25lb2ZfbWVzc2FnZSwgImMiLCAzLCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfTUVTU0FHRSk7CisgICAgb25lb2ZfbWVzc2FnZS0+bXV0YWJsZV9maWVsZCgyKS0+c2V0X29uZW9mX2luZGV4KDApOworICAgIG9uZW9mX21lc3NhZ2UtPm11dGFibGVfZmllbGQoMiktPnNldF90eXBlX25hbWUoIlRlc3RPbmVvZiIpOworCisgICAgQWRkRmllbGQob25lb2ZfbWVzc2FnZSwgImQiLCA0LCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRkxPQVQpOworICAgIG9uZW9mX21lc3NhZ2UtPm11dGFibGVfZmllbGQoMyktPnNldF9vbmVvZl9pbmRleCgxKTsKKworICAgIC8vIEJ1aWxkIHRoZSBkZXNjcmlwdG9ycyBhbmQgZ2V0IHRoZSBwb2ludGVycy4KKyAgICBiYXpfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmF6X2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGJhel9maWxlXyAhPSBudWxscHRyKTsKKworICAgIEFTU0VSVF9FUSgxLCBiYXpfZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBvbmVvZl9tZXNzYWdlXyA9IGJhel9maWxlXy0+bWVzc2FnZV90eXBlKDApOworCisgICAgQVNTRVJUX0VRKDIsIG9uZW9mX21lc3NhZ2VfLT5vbmVvZl9kZWNsX2NvdW50KCkpOworICAgIG9uZW9mXyA9IG9uZW9mX21lc3NhZ2VfLT5vbmVvZl9kZWNsKDApOworICAgIG9uZW9mMl8gPSBvbmVvZl9tZXNzYWdlXy0+b25lb2ZfZGVjbCgxKTsKKworICAgIEFTU0VSVF9FUSg0LCBvbmVvZl9tZXNzYWdlXy0+ZmllbGRfY291bnQoKSk7CisgICAgYV8gPSBvbmVvZl9tZXNzYWdlXy0+ZmllbGQoMCk7CisgICAgYl8gPSBvbmVvZl9tZXNzYWdlXy0+ZmllbGQoMSk7CisgICAgY18gPSBvbmVvZl9tZXNzYWdlXy0+ZmllbGQoMik7CisgICAgZF8gPSBvbmVvZl9tZXNzYWdlXy0+ZmllbGQoMyk7CisgIH0KKworICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogYmF6X2ZpbGVfOworCisgIGNvbnN0IERlc2NyaXB0b3IqIG9uZW9mX21lc3NhZ2VfOworCisgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfOworICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mMl87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYl87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogY187CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZF87Cit9OworCitURVNUX0YoT25lb2ZEZXNjcmlwdG9yVGVzdCwgTm9ybWFsKSB7CisgIEVYUEVDVF9FUSgiZm9vIiwgb25lb2ZfLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoImdhcnBseS5UZXN0T25lb2YuZm9vIiwgb25lb2ZfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgwLCBvbmVvZl8tPmluZGV4KCkpOworICBBU1NFUlRfRVEoMiwgb25lb2ZfLT5maWVsZF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKGJfLCBvbmVvZl8tPmZpZWxkKDApKTsKKyAgRVhQRUNUX0VRKGNfLCBvbmVvZl8tPmZpZWxkKDEpKTsKKyAgRVhQRUNUX1RSVUUoYV8tPmNvbnRhaW5pbmdfb25lb2YoKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0VRKG9uZW9mXywgYl8tPmNvbnRhaW5pbmdfb25lb2YoKSk7CisgIEVYUEVDVF9FUShvbmVvZl8sIGNfLT5jb250YWluaW5nX29uZW9mKCkpOworfQorCitURVNUX0YoT25lb2ZEZXNjcmlwdG9yVGVzdCwgRmluZEJ5TmFtZSkgeworICBFWFBFQ1RfRVEob25lb2ZfLCBvbmVvZl9tZXNzYWdlXy0+RmluZE9uZW9mQnlOYW1lKCJmb28iKSk7CisgIEVYUEVDVF9FUShvbmVvZjJfLCBvbmVvZl9tZXNzYWdlXy0+RmluZE9uZW9mQnlOYW1lKCJiYXIiKSk7CisgIEVYUEVDVF9UUlVFKG9uZW9mX21lc3NhZ2VfLT5GaW5kT25lb2ZCeU5hbWUoIm5vX3N1Y2hfb25lb2YiKSA9PSBudWxscHRyKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBTdHlsaXplZEZpZWxkTmFtZXNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisKKyAgICBBZGRFeHRlbnNpb25SYW5nZShBZGRNZXNzYWdlKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiKSwgMSwgMTAwMCk7CisKKyAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UgPSBBZGRNZXNzYWdlKCZmaWxlLCAiVGVzdE1lc3NhZ2UiKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlLCAiZm9vX2ZvbyIsIDEsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRmllbGQobWVzc2FnZSwgIkZvb0JhciIsIDIsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRmllbGQobWVzc2FnZSwgImZvb0JheiIsIDMsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRmllbGQobWVzc2FnZSwgImZvb0ZvbyIsIDQsICAvLyBDYW1lbC1jYXNlIGNvbmZsaWN0IHdpdGggZm9vX2Zvby4KKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZEZpZWxkKG1lc3NhZ2UsICJmb29iYXIiLCA1LCAgLy8gTG93ZXItY2FzZSBjb25mbGljdCB3aXRoIEZvb0Jhci4KKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworCisgICAgQWRkTmVzdGVkRXh0ZW5zaW9uKG1lc3NhZ2UsICJFeHRlbmRhYmxlTWVzc2FnZSIsICJiYXJfZm9vIiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkTmVzdGVkRXh0ZW5zaW9uKG1lc3NhZ2UsICJFeHRlbmRhYmxlTWVzc2FnZSIsICJCYXJCYXIiLCAyLAorICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGROZXN0ZWRFeHRlbnNpb24obWVzc2FnZSwgIkV4dGVuZGFibGVNZXNzYWdlIiwgIkJhckJheiIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZE5lc3RlZEV4dGVuc2lvbihtZXNzYWdlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmFyRm9vIiwgNCwgIC8vIENvbmZsaWN0CisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZE5lc3RlZEV4dGVuc2lvbihtZXNzYWdlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmFyYmFyIiwgNSwgIC8vIENvbmZsaWN0CisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworCisgICAgQWRkRXh0ZW5zaW9uKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmF6X2ZvbyIsIDExLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGRFeHRlbnNpb24oJmZpbGUsICJFeHRlbmRhYmxlTWVzc2FnZSIsICJCYXpCYXIiLCAxMiwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRXh0ZW5zaW9uKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiQmF6QmF6IiwgMTMsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZEV4dGVuc2lvbigmZmlsZSwgIkV4dGVuZGFibGVNZXNzYWdlIiwgImJhekZvbyIsIDE0LCAgLy8gQ29uZmxpY3QKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRXh0ZW5zaW9uKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmF6YmFyIiwgMTUsICAvLyBDb25mbGljdAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKworICAgIGZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZpbGUpOworICAgIEFTU0VSVF9UUlVFKGZpbGVfICE9IG51bGxwdHIpOworICAgIEFTU0VSVF9FUSgyLCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIG1lc3NhZ2VfID0gZmlsZV8tPm1lc3NhZ2VfdHlwZSgxKTsKKyAgICBBU1NFUlRfRVEoIlRlc3RNZXNzYWdlIiwgbWVzc2FnZV8tPm5hbWUoKSk7CisgICAgQVNTRVJUX0VRKDUsIG1lc3NhZ2VfLT5maWVsZF9jb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoNSwgbWVzc2FnZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoNSwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfOworfTsKKworVEVTVF9GKFN0eWxpemVkRmllbGROYW1lc1Rlc3QsIExvd2VyY2FzZU5hbWUpIHsKKyAgRVhQRUNUX0VRKCJmb29fZm9vIiwgbWVzc2FnZV8tPmZpZWxkKDApLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29iYXIiLCBtZXNzYWdlXy0+ZmllbGQoMSktPmxvd2VyY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImZvb2JheiIsIG1lc3NhZ2VfLT5maWVsZCgyKS0+bG93ZXJjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vZm9vIiwgbWVzc2FnZV8tPmZpZWxkKDMpLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29iYXIiLCBtZXNzYWdlXy0+ZmllbGQoNCktPmxvd2VyY2FzZV9uYW1lKCkpOworCisgIEVYUEVDVF9FUSgiYmFyX2ZvbyIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMCktPmxvd2VyY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhcmJhciIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMSktPmxvd2VyY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhcmJheiIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMiktPmxvd2VyY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhcmZvbyIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMyktPmxvd2VyY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhcmJhciIsIG1lc3NhZ2VfLT5leHRlbnNpb24oNCktPmxvd2VyY2FzZV9uYW1lKCkpOworCisgIEVYUEVDVF9FUSgiYmF6X2ZvbyIsIGZpbGVfLT5leHRlbnNpb24oMCktPmxvd2VyY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhemJhciIsIGZpbGVfLT5leHRlbnNpb24oMSktPmxvd2VyY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhemJheiIsIGZpbGVfLT5leHRlbnNpb24oMiktPmxvd2VyY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhemZvbyIsIGZpbGVfLT5leHRlbnNpb24oMyktPmxvd2VyY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhemJhciIsIGZpbGVfLT5leHRlbnNpb24oNCktPmxvd2VyY2FzZV9uYW1lKCkpOworfQorCitURVNUX0YoU3R5bGl6ZWRGaWVsZE5hbWVzVGVzdCwgQ2FtZWxjYXNlTmFtZSkgeworICBFWFBFQ1RfRVEoImZvb0ZvbyIsIG1lc3NhZ2VfLT5maWVsZCgwKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vQmFyIiwgbWVzc2FnZV8tPmZpZWxkKDEpLT5jYW1lbGNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29CYXoiLCBtZXNzYWdlXy0+ZmllbGQoMiktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImZvb0ZvbyIsIG1lc3NhZ2VfLT5maWVsZCgzKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vYmFyIiwgbWVzc2FnZV8tPmZpZWxkKDQpLT5jYW1lbGNhc2VfbmFtZSgpKTsKKworICBFWFBFQ1RfRVEoImJhckZvbyIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMCktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhckJhciIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMSktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhckJheiIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMiktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhckZvbyIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMyktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhcmJhciIsIG1lc3NhZ2VfLT5leHRlbnNpb24oNCktPmNhbWVsY2FzZV9uYW1lKCkpOworCisgIEVYUEVDVF9FUSgiYmF6Rm9vIiwgZmlsZV8tPmV4dGVuc2lvbigwKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6QmFyIiwgZmlsZV8tPmV4dGVuc2lvbigxKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6QmF6IiwgZmlsZV8tPmV4dGVuc2lvbigyKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6Rm9vIiwgZmlsZV8tPmV4dGVuc2lvbigzKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6YmFyIiwgZmlsZV8tPmV4dGVuc2lvbig0KS0+Y2FtZWxjYXNlX25hbWUoKSk7Cit9CisKK1RFU1RfRihTdHlsaXplZEZpZWxkTmFtZXNUZXN0LCBGaW5kQnlMb3dlcmNhc2VOYW1lKSB7CisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZmllbGQoMCksIG1lc3NhZ2VfLT5GaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUoImZvb19mb28iKSk7CisgIEVYUEVDVF9USEFUKG1lc3NhZ2VfLT5GaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUoImZvb2JhciIpLAorICAgICAgICAgICAgICBBbnlPZihtZXNzYWdlXy0+ZmllbGQoMSksIG1lc3NhZ2VfLT5maWVsZCg0KSkpOworICBFWFBFQ1RfRVEobWVzc2FnZV8tPmZpZWxkKDIpLCBtZXNzYWdlXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKCJmb29iYXoiKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUoIkZvb0JhciIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKCJmb29CYXoiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgiYmFyX2ZvbyIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKCJub3N1Y2hmaWVsZCIpID09IG51bGxwdHIpOworCisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZXh0ZW5zaW9uKDApLAorICAgICAgICAgICAgbWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoImJhcl9mb28iKSk7CisgIEVYUEVDVF9USEFUKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJiYXJiYXIiKSwKKyAgICAgICAgICAgICAgQW55T2YobWVzc2FnZV8tPmV4dGVuc2lvbigxKSwgbWVzc2FnZV8tPmV4dGVuc2lvbig0KSkpOworICBFWFBFQ1RfRVEobWVzc2FnZV8tPmV4dGVuc2lvbigyKSwKKyAgICAgICAgICAgIG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJiYXJiYXoiKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJCYXJCYXIiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoImJhckJheiIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZSgiZm9vX2ZvbyIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZSgibm9zdWNoZmllbGQiKSA9PSBudWxscHRyKTsKKworICBFWFBFQ1RfRVEoZmlsZV8tPmV4dGVuc2lvbigwKSwKKyAgICAgICAgICAgIGZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJiYXpfZm9vIikpOworICBFWFBFQ1RfVEhBVChmaWxlXy0+RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZSgiYmF6YmFyIiksCisgICAgICAgICAgICAgIEFueU9mKGZpbGVfLT5leHRlbnNpb24oMSksIGZpbGVfLT5leHRlbnNpb24oNCkpKTsKKyAgRVhQRUNUX0VRKGZpbGVfLT5leHRlbnNpb24oMiksIGZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJiYXpiYXoiKSk7CisgIEVYUEVDVF9UUlVFKGZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJCYXpCYXIiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoZmlsZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoImJhekJheiIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShmaWxlXy0+RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZSgibm9zdWNoZmllbGQiKSA9PSBudWxscHRyKTsKK30KKworVEVTVF9GKFN0eWxpemVkRmllbGROYW1lc1Rlc3QsIEZpbmRCeUNhbWVsY2FzZU5hbWUpIHsKKyAgRVhQRUNUX1RIQVQobWVzc2FnZV8tPkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgiZm9vRm9vIiksCisgICAgICAgICAgICAgIEFueU9mKG1lc3NhZ2VfLT5maWVsZCgwKSwgbWVzc2FnZV8tPmZpZWxkKDMpKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZmllbGQoMSksIG1lc3NhZ2VfLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoImZvb0JhciIpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2VfLT5maWVsZCgyKSwgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgiZm9vQmF6IikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCJmb29fZm9vIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoIkZvb0JhciIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCJiYXJGb28iKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgibm9zdWNoZmllbGQiKSA9PSBudWxscHRyKTsKKworICBFWFBFQ1RfVEhBVChtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiYmFyRm9vIiksCisgICAgICAgICAgICAgIEFueU9mKG1lc3NhZ2VfLT5leHRlbnNpb24oMCksIG1lc3NhZ2VfLT5leHRlbnNpb24oMykpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2VfLT5leHRlbnNpb24oMSksCisgICAgICAgICAgICBtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiYmFyQmFyIikpOworICBFWFBFQ1RfRVEobWVzc2FnZV8tPmV4dGVuc2lvbigyKSwKKyAgICAgICAgICAgIG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJiYXJCYXoiKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJiYXJfZm9vIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJCYXJCYXIiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoImZvb0ZvbyIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgibm9zdWNoZmllbGQiKSA9PSBudWxscHRyKTsKKworICBFWFBFQ1RfVEhBVChmaWxlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiYmF6Rm9vIiksCisgICAgICAgICAgICAgIEFueU9mKGZpbGVfLT5leHRlbnNpb24oMCksIGZpbGVfLT5leHRlbnNpb24oMykpKTsKKyAgRVhQRUNUX0VRKGZpbGVfLT5leHRlbnNpb24oMSksIGZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJiYXpCYXIiKSk7CisgIEVYUEVDVF9FUShmaWxlXy0+ZXh0ZW5zaW9uKDIpLCBmaWxlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiYmF6QmF6IikpOworICBFWFBFQ1RfVFJVRShmaWxlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiYmF6X2ZvbyIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShmaWxlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiQmF6QmFyIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJub3N1Y2hmaWVsZCIpID09IG51bGxwdHIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFRlc3QgZW51bSBkZXNjcmlwdG9ycy4KK2NsYXNzIEVudW1EZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgLy8gQnVpbGQgZGVzY3JpcHRvcnMgZm9yIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnM6CisgICAgLy8KKyAgICAvLyAgIC8vIGluICJmb28ucHJvdG8iCisgICAgLy8gICBlbnVtIFRlc3RFbnVtIHsKKyAgICAvLyAgICAgRk9PID0gMTsKKyAgICAvLyAgICAgQkFSID0gMjsKKyAgICAvLyAgIH0KKyAgICAvLworICAgIC8vICAgLy8gaW4gImJhci5wcm90byIKKyAgICAvLyAgIHBhY2thZ2UgY29yZ2UuZ3JhdWx0OworICAgIC8vICAgZW51bSBUZXN0RW51bTIgeworICAgIC8vICAgICBGT08gPSAxOworICAgIC8vICAgICBCQVogPSAzOworICAgIC8vICAgfQorICAgIC8vCisgICAgLy8gVGVzdEVudW0yIGlzIHByaW1hcmlseSBoZXJlIHRvIHRlc3QgRmluZFZhbHVlQnlOYW1lIGFuZCBmcmllbmRzLgorICAgIC8vIEFsbCBlbnVtcyBjcmVhdGVkIGZyb20gdGhlIHNhbWUgRGVzY3JpcHRvclBvb2wgc2hhcmUgdGhlIHNhbWUgbG9va3VwCisgICAgLy8gdGFibGUsIHNvIHdlIG5lZWQgdG8gaW5zdXJlIHRoYXQgdGhleSBkb24ndCBpbnRlcmZlcmUuCisKKyAgICAvLyBUZXN0RW51bQorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZm9vX2ZpbGU7CisgICAgZm9vX2ZpbGUuc2V0X25hbWUoImZvby5wcm90byIpOworCisgICAgRW51bURlc2NyaXB0b3JQcm90byogZW51bV9wcm90byA9IEFkZEVudW0oJmZvb19maWxlLCAiVGVzdEVudW0iKTsKKyAgICBBZGRFbnVtVmFsdWUoZW51bV9wcm90bywgIkZPTyIsIDEpOworICAgIEFkZEVudW1WYWx1ZShlbnVtX3Byb3RvLCAiQkFSIiwgMik7CisKKyAgICAvLyBUZXN0RW51bTIKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGJhcl9maWxlOworICAgIGJhcl9maWxlLnNldF9uYW1lKCJiYXIucHJvdG8iKTsKKyAgICBiYXJfZmlsZS5zZXRfcGFja2FnZSgiY29yZ2UuZ3JhdWx0Iik7CisKKyAgICBFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtMl9wcm90byA9IEFkZEVudW0oJmJhcl9maWxlLCAiVGVzdEVudW0yIik7CisgICAgQWRkRW51bVZhbHVlKGVudW0yX3Byb3RvLCAiRk9PIiwgMSk7CisgICAgQWRkRW51bVZhbHVlKGVudW0yX3Byb3RvLCAiQkFaIiwgMyk7CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19maWxlKTsKKyAgICBBU1NFUlRfVFJVRShmb29fZmlsZV8gIT0gbnVsbHB0cik7CisKKyAgICBiYXJfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmFyX2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGJhcl9maWxlXyAhPSBudWxscHRyKTsKKworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICBlbnVtXyA9IGZvb19maWxlXy0+ZW51bV90eXBlKDApOworCisgICAgQVNTRVJUX0VRKDIsIGVudW1fLT52YWx1ZV9jb3VudCgpKTsKKyAgICBmb29fID0gZW51bV8tPnZhbHVlKDApOworICAgIGJhcl8gPSBlbnVtXy0+dmFsdWUoMSk7CisKKyAgICBBU1NFUlRfRVEoMSwgYmFyX2ZpbGVfLT5lbnVtX3R5cGVfY291bnQoKSk7CisgICAgZW51bTJfID0gYmFyX2ZpbGVfLT5lbnVtX3R5cGUoMCk7CisKKyAgICBBU1NFUlRfRVEoMiwgZW51bTJfLT52YWx1ZV9jb3VudCgpKTsKKyAgICBmb28yXyA9IGVudW0yXy0+dmFsdWUoMCk7CisgICAgYmF6Ml8gPSBlbnVtMl8tPnZhbHVlKDEpOworICB9CisKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvb19maWxlXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhcl9maWxlXzsKKworICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV87CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtMl87CisKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZm9vXzsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogYmFyXzsKKworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBmb28yXzsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogYmF6Ml87Cit9OworCitURVNUX0YoRW51bURlc2NyaXB0b3JUZXN0LCBOYW1lKSB7CisgIEVYUEVDVF9FUSgiVGVzdEVudW0iLCBlbnVtXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJUZXN0RW51bSIsIGVudW1fLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIGVudW1fLT5maWxlKCkpOworCisgIEVYUEVDVF9FUSgiVGVzdEVudW0yIiwgZW51bTJfLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0RW51bTIiLCBlbnVtMl8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKGJhcl9maWxlXywgZW51bTJfLT5maWxlKCkpOworfQorCitURVNUX0YoRW51bURlc2NyaXB0b3JUZXN0LCBDb250YWluaW5nVHlwZSkgeworICBFWFBFQ1RfVFJVRShlbnVtXy0+Y29udGFpbmluZ190eXBlKCkgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGVudW0yXy0+Y29udGFpbmluZ190eXBlKCkgPT0gbnVsbHB0cik7Cit9CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIFZhbHVlc0J5SW5kZXgpIHsKKyAgQVNTRVJUX0VRKDIsIGVudW1fLT52YWx1ZV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKGZvb18sIGVudW1fLT52YWx1ZSgwKSk7CisgIEVYUEVDVF9FUShiYXJfLCBlbnVtXy0+dmFsdWUoMSkpOworfQorCitURVNUX0YoRW51bURlc2NyaXB0b3JUZXN0LCBGaW5kVmFsdWVCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGZvb18sIGVudW1fLT5GaW5kVmFsdWVCeU5hbWUoIkZPTyIpKTsKKyAgRVhQRUNUX0VRKGJhcl8sIGVudW1fLT5GaW5kVmFsdWVCeU5hbWUoIkJBUiIpKTsKKyAgRVhQRUNUX0VRKGZvbzJfLCBlbnVtMl8tPkZpbmRWYWx1ZUJ5TmFtZSgiRk9PIikpOworICBFWFBFQ1RfRVEoYmF6Ml8sIGVudW0yXy0+RmluZFZhbHVlQnlOYW1lKCJCQVoiKSk7CisKKyAgRVhQRUNUX1RSVUUoZW51bV8tPkZpbmRWYWx1ZUJ5TmFtZSgiTk9fU1VDSF9WQUxVRSIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShlbnVtXy0+RmluZFZhbHVlQnlOYW1lKCJCQVoiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoZW51bTJfLT5GaW5kVmFsdWVCeU5hbWUoIkJBUiIpID09IG51bGxwdHIpOworfQorCitURVNUX0YoRW51bURlc2NyaXB0b3JUZXN0LCBGaW5kVmFsdWVCeU51bWJlcikgeworICBFWFBFQ1RfRVEoZm9vXywgZW51bV8tPkZpbmRWYWx1ZUJ5TnVtYmVyKDEpKTsKKyAgRVhQRUNUX0VRKGJhcl8sIGVudW1fLT5GaW5kVmFsdWVCeU51bWJlcigyKSk7CisgIEVYUEVDVF9FUShmb28yXywgZW51bTJfLT5GaW5kVmFsdWVCeU51bWJlcigxKSk7CisgIEVYUEVDVF9FUShiYXoyXywgZW51bTJfLT5GaW5kVmFsdWVCeU51bWJlcigzKSk7CisKKyAgRVhQRUNUX1RSVUUoZW51bV8tPkZpbmRWYWx1ZUJ5TnVtYmVyKDQxNikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGVudW1fLT5GaW5kVmFsdWVCeU51bWJlcigzKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoZW51bTJfLT5GaW5kVmFsdWVCeU51bWJlcigyKSA9PSBudWxscHRyKTsKK30KKworVEVTVF9GKEVudW1EZXNjcmlwdG9yVGVzdCwgVmFsdWVOYW1lKSB7CisgIEVYUEVDVF9FUSgiRk9PIiwgZm9vXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJCQVIiLCBiYXJfLT5uYW1lKCkpOworfQorCitURVNUX0YoRW51bURlc2NyaXB0b3JUZXN0LCBWYWx1ZUZ1bGxOYW1lKSB7CisgIEVYUEVDVF9FUSgiRk9PIiwgZm9vXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoIkJBUiIsIGJhcl8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuRk9PIiwgZm9vMl8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuQkFaIiwgYmF6Ml8tPmZ1bGxfbmFtZSgpKTsKK30KKworVEVTVF9GKEVudW1EZXNjcmlwdG9yVGVzdCwgVmFsdWVJbmRleCkgeworICBFWFBFQ1RfRVEoMCwgZm9vXy0+aW5kZXgoKSk7CisgIEVYUEVDVF9FUSgxLCBiYXJfLT5pbmRleCgpKTsKK30KKworVEVTVF9GKEVudW1EZXNjcmlwdG9yVGVzdCwgVmFsdWVOdW1iZXIpIHsKKyAgRVhQRUNUX0VRKDEsIGZvb18tPm51bWJlcigpKTsKKyAgRVhQRUNUX0VRKDIsIGJhcl8tPm51bWJlcigpKTsKK30KKworVEVTVF9GKEVudW1EZXNjcmlwdG9yVGVzdCwgVmFsdWVUeXBlKSB7CisgIEVYUEVDVF9FUShlbnVtXywgZm9vXy0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKGVudW1fLCBiYXJfLT50eXBlKCkpOworICBFWFBFQ1RfRVEoZW51bTJfLCBmb28yXy0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKGVudW0yXywgYmF6Ml8tPnR5cGUoKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVGVzdCBzZXJ2aWNlIGRlc2NyaXB0b3JzLgorY2xhc3MgU2VydmljZURlc2NyaXB0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBtZXNzYWdlcyBhbmQgc2VydmljZToKKyAgICAvLyAgICAvLyBpbiAiZm9vLnByb3RvIgorICAgIC8vICAgIG1lc3NhZ2UgRm9vUmVxdWVzdCAge30KKyAgICAvLyAgICBtZXNzYWdlIEZvb1Jlc3BvbnNlIHt9CisgICAgLy8gICAgbWVzc2FnZSBCYXJSZXF1ZXN0ICB7fQorICAgIC8vICAgIG1lc3NhZ2UgQmFyUmVzcG9uc2Uge30KKyAgICAvLyAgICBtZXNzYWdlIEJhelJlcXVlc3QgIHt9CisgICAgLy8gICAgbWVzc2FnZSBCYXpSZXNwb25zZSB7fQorICAgIC8vCisgICAgLy8gICAgc2VydmljZSBUZXN0U2VydmljZSB7CisgICAgLy8gICAgICBycGMgRm9vKEZvb1JlcXVlc3QpIHJldHVybnMgKEZvb1Jlc3BvbnNlKTsKKyAgICAvLyAgICAgIHJwYyBCYXIoQmFyUmVxdWVzdCkgcmV0dXJucyAoQmFyUmVzcG9uc2UpOworICAgIC8vICAgIH0KKyAgICAvLworICAgIC8vICAgIC8vIGluICJiYXIucHJvdG8iCisgICAgLy8gICAgcGFja2FnZSBjb3JnZS5ncmF1bHQKKyAgICAvLyAgICBzZXJ2aWNlIFRlc3RTZXJ2aWNlMiB7CisgICAgLy8gICAgICBycGMgRm9vKEZvb1JlcXVlc3QpIHJldHVybnMgKEZvb1Jlc3BvbnNlKTsKKyAgICAvLyAgICAgIHJwYyBCYXooQmF6UmVxdWVzdCkgcmV0dXJucyAoQmF6UmVzcG9uc2UpOworICAgIC8vICAgIH0KKworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZm9vX2ZpbGU7CisgICAgZm9vX2ZpbGUuc2V0X25hbWUoImZvby5wcm90byIpOworCisgICAgQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJGb29SZXF1ZXN0Iik7CisgICAgQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJGb29SZXNwb25zZSIpOworICAgIEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiQmFyUmVxdWVzdCIpOworICAgIEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiQmFyUmVzcG9uc2UiKTsKKyAgICBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkJhelJlcXVlc3QiKTsKKyAgICBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkJhelJlc3BvbnNlIik7CisKKyAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBzZXJ2aWNlID0gQWRkU2VydmljZSgmZm9vX2ZpbGUsICJUZXN0U2VydmljZSIpOworICAgIEFkZE1ldGhvZChzZXJ2aWNlLCAiRm9vIiwgIkZvb1JlcXVlc3QiLCAiRm9vUmVzcG9uc2UiKTsKKyAgICBBZGRNZXRob2Qoc2VydmljZSwgIkJhciIsICJCYXJSZXF1ZXN0IiwgIkJhclJlc3BvbnNlIik7CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGJhcl9maWxlOworICAgIGJhcl9maWxlLnNldF9uYW1lKCJiYXIucHJvdG8iKTsKKyAgICBiYXJfZmlsZS5zZXRfcGFja2FnZSgiY29yZ2UuZ3JhdWx0Iik7CisgICAgYmFyX2ZpbGUuYWRkX2RlcGVuZGVuY3koImZvby5wcm90byIpOworCisgICAgU2VydmljZURlc2NyaXB0b3JQcm90byogc2VydmljZTIgPSBBZGRTZXJ2aWNlKCZiYXJfZmlsZSwgIlRlc3RTZXJ2aWNlMiIpOworICAgIEFkZE1ldGhvZChzZXJ2aWNlMiwgIkZvbyIsICJGb29SZXF1ZXN0IiwgIkZvb1Jlc3BvbnNlIik7CisgICAgQWRkTWV0aG9kKHNlcnZpY2UyLCAiQmF6IiwgIkJhelJlcXVlc3QiLCAiQmF6UmVzcG9uc2UiKTsKKworICAgIC8vIEJ1aWxkIHRoZSBkZXNjcmlwdG9ycyBhbmQgZ2V0IHRoZSBwb2ludGVycy4KKyAgICBmb29fZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoZm9vX2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGZvb19maWxlXyAhPSBudWxscHRyKTsKKworICAgIGJhcl9maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShiYXJfZmlsZSk7CisgICAgQVNTRVJUX1RSVUUoYmFyX2ZpbGVfICE9IG51bGxwdHIpOworCisgICAgQVNTRVJUX0VRKDYsIGZvb19maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGZvb19yZXF1ZXN0XyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDApOworICAgIGZvb19yZXNwb25zZV8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgxKTsKKyAgICBiYXJfcmVxdWVzdF8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgyKTsKKyAgICBiYXJfcmVzcG9uc2VfID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMyk7CisgICAgYmF6X3JlcXVlc3RfID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoNCk7CisgICAgYmF6X3Jlc3BvbnNlXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDUpOworCisgICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+c2VydmljZV9jb3VudCgpKTsKKyAgICBzZXJ2aWNlXyA9IGZvb19maWxlXy0+c2VydmljZSgwKTsKKworICAgIEFTU0VSVF9FUSgyLCBzZXJ2aWNlXy0+bWV0aG9kX2NvdW50KCkpOworICAgIGZvb18gPSBzZXJ2aWNlXy0+bWV0aG9kKDApOworICAgIGJhcl8gPSBzZXJ2aWNlXy0+bWV0aG9kKDEpOworCisgICAgQVNTRVJUX0VRKDEsIGJhcl9maWxlXy0+c2VydmljZV9jb3VudCgpKTsKKyAgICBzZXJ2aWNlMl8gPSBiYXJfZmlsZV8tPnNlcnZpY2UoMCk7CisKKyAgICBBU1NFUlRfRVEoMiwgc2VydmljZTJfLT5tZXRob2RfY291bnQoKSk7CisgICAgZm9vMl8gPSBzZXJ2aWNlMl8tPm1ldGhvZCgwKTsKKyAgICBiYXoyXyA9IHNlcnZpY2UyXy0+bWV0aG9kKDEpOworICB9CisKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvb19maWxlXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhcl9maWxlXzsKKworICBjb25zdCBEZXNjcmlwdG9yKiBmb29fcmVxdWVzdF87CisgIGNvbnN0IERlc2NyaXB0b3IqIGZvb19yZXNwb25zZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIGJhcl9yZXF1ZXN0XzsKKyAgY29uc3QgRGVzY3JpcHRvciogYmFyX3Jlc3BvbnNlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogYmF6X3JlcXVlc3RfOworICBjb25zdCBEZXNjcmlwdG9yKiBiYXpfcmVzcG9uc2VfOworCisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlXzsKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UyXzsKKworICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBmb29fOworICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBiYXJfOworCisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIGZvbzJfOworICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBiYXoyXzsKK307CisKK1RFU1RfRihTZXJ2aWNlRGVzY3JpcHRvclRlc3QsIE5hbWUpIHsKKyAgRVhQRUNUX0VRKCJUZXN0U2VydmljZSIsIHNlcnZpY2VfLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoIlRlc3RTZXJ2aWNlIiwgc2VydmljZV8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKGZvb19maWxlXywgc2VydmljZV8tPmZpbGUoKSk7CisKKyAgRVhQRUNUX0VRKCJUZXN0U2VydmljZTIiLCBzZXJ2aWNlMl8tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RTZXJ2aWNlMiIsIHNlcnZpY2UyXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoYmFyX2ZpbGVfLCBzZXJ2aWNlMl8tPmZpbGUoKSk7Cit9CisKK1RFU1RfRihTZXJ2aWNlRGVzY3JpcHRvclRlc3QsIE1ldGhvZHNCeUluZGV4KSB7CisgIEFTU0VSVF9FUSgyLCBzZXJ2aWNlXy0+bWV0aG9kX2NvdW50KCkpOworICBFWFBFQ1RfRVEoZm9vXywgc2VydmljZV8tPm1ldGhvZCgwKSk7CisgIEVYUEVDVF9FUShiYXJfLCBzZXJ2aWNlXy0+bWV0aG9kKDEpKTsKK30KKworVEVTVF9GKFNlcnZpY2VEZXNjcmlwdG9yVGVzdCwgRmluZE1ldGhvZEJ5TmFtZSkgeworICBFWFBFQ1RfRVEoZm9vXywgc2VydmljZV8tPkZpbmRNZXRob2RCeU5hbWUoIkZvbyIpKTsKKyAgRVhQRUNUX0VRKGJhcl8sIHNlcnZpY2VfLT5GaW5kTWV0aG9kQnlOYW1lKCJCYXIiKSk7CisgIEVYUEVDVF9FUShmb28yXywgc2VydmljZTJfLT5GaW5kTWV0aG9kQnlOYW1lKCJGb28iKSk7CisgIEVYUEVDVF9FUShiYXoyXywgc2VydmljZTJfLT5GaW5kTWV0aG9kQnlOYW1lKCJCYXoiKSk7CisKKyAgRVhQRUNUX1RSVUUoc2VydmljZV8tPkZpbmRNZXRob2RCeU5hbWUoIk5vU3VjaE1ldGhvZCIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShzZXJ2aWNlXy0+RmluZE1ldGhvZEJ5TmFtZSgiQmF6IikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKHNlcnZpY2UyXy0+RmluZE1ldGhvZEJ5TmFtZSgiQmFyIikgPT0gbnVsbHB0cik7Cit9CisKK1RFU1RfRihTZXJ2aWNlRGVzY3JpcHRvclRlc3QsIE1ldGhvZE5hbWUpIHsKKyAgRVhQRUNUX0VRKCJGb28iLCBmb29fLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoIkJhciIsIGJhcl8tPm5hbWUoKSk7Cit9CitURVNUX0YoU2VydmljZURlc2NyaXB0b3JUZXN0LCBNZXRob2RGdWxsTmFtZSkgeworICBFWFBFQ1RfRVEoIlRlc3RTZXJ2aWNlLkZvbyIsIGZvb18tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJUZXN0U2VydmljZS5CYXIiLCBiYXJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RTZXJ2aWNlMi5Gb28iLCBmb28yXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0U2VydmljZTIuQmF6IiwgYmF6Ml8tPmZ1bGxfbmFtZSgpKTsKK30KKworVEVTVF9GKFNlcnZpY2VEZXNjcmlwdG9yVGVzdCwgTWV0aG9kSW5kZXgpIHsKKyAgRVhQRUNUX0VRKDAsIGZvb18tPmluZGV4KCkpOworICBFWFBFQ1RfRVEoMSwgYmFyXy0+aW5kZXgoKSk7Cit9CisKK1RFU1RfRihTZXJ2aWNlRGVzY3JpcHRvclRlc3QsIE1ldGhvZFBhcmVudCkgeworICBFWFBFQ1RfRVEoc2VydmljZV8sIGZvb18tPnNlcnZpY2UoKSk7CisgIEVYUEVDVF9FUShzZXJ2aWNlXywgYmFyXy0+c2VydmljZSgpKTsKK30KKworVEVTVF9GKFNlcnZpY2VEZXNjcmlwdG9yVGVzdCwgTWV0aG9kSW5wdXRUeXBlKSB7CisgIEVYUEVDVF9FUShmb29fcmVxdWVzdF8sIGZvb18tPmlucHV0X3R5cGUoKSk7CisgIEVYUEVDVF9FUShiYXJfcmVxdWVzdF8sIGJhcl8tPmlucHV0X3R5cGUoKSk7Cit9CisKK1RFU1RfRihTZXJ2aWNlRGVzY3JpcHRvclRlc3QsIE1ldGhvZE91dHB1dFR5cGUpIHsKKyAgRVhQRUNUX0VRKGZvb19yZXNwb25zZV8sIGZvb18tPm91dHB1dF90eXBlKCkpOworICBFWFBFQ1RfRVEoYmFyX3Jlc3BvbnNlXywgYmFyXy0+b3V0cHV0X3R5cGUoKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVGVzdCBuZXN0ZWQgdHlwZXMuCitjbGFzcyBOZXN0ZWREZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgLy8gQnVpbGQgZGVzY3JpcHRvcnMgZm9yIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnM6CisgICAgLy8KKyAgICAvLyAgIC8vIGluICJmb28ucHJvdG8iCisgICAgLy8gICBtZXNzYWdlIFRlc3RNZXNzYWdlIHsKKyAgICAvLyAgICAgbWVzc2FnZSBGb28ge30KKyAgICAvLyAgICAgbWVzc2FnZSBCYXIge30KKyAgICAvLyAgICAgZW51bSBCYXogeyBBID0gMTsgfQorICAgIC8vICAgICBlbnVtIE1vbyB7IEIgPSAxOyB9CisgICAgLy8gICB9CisgICAgLy8KKyAgICAvLyAgIC8vIGluICJiYXIucHJvdG8iCisgICAgLy8gICBwYWNrYWdlIGNvcmdlLmdyYXVsdDsKKyAgICAvLyAgIG1lc3NhZ2UgVGVzdE1lc3NhZ2UyIHsKKyAgICAvLyAgICAgbWVzc2FnZSBGb28ge30KKyAgICAvLyAgICAgbWVzc2FnZSBCYXoge30KKyAgICAvLyAgICAgZW51bSBNb28gIHsgQSA9IDE7IH0KKyAgICAvLyAgICAgZW51bSBNb29vIHsgQyA9IDE7IH0KKyAgICAvLyAgIH0KKyAgICAvLworICAgIC8vIFRlc3RNZXNzYWdlMiBpcyBwcmltYXJpbHkgaGVyZSB0byB0ZXN0IEZpbmROZXN0ZWRUeXBlQnlOYW1lIGFuZCBmcmllbmRzLgorICAgIC8vIEFsbCBtZXNzYWdlcyBjcmVhdGVkIGZyb20gdGhlIHNhbWUgRGVzY3JpcHRvclBvb2wgc2hhcmUgdGhlIHNhbWUgbG9va3VwCisgICAgLy8gdGFibGUsIHNvIHdlIG5lZWQgdG8gaW5zdXJlIHRoYXQgdGhleSBkb24ndCBpbnRlcmZlcmUuCisgICAgLy8KKyAgICAvLyBXZSBhZGQgZW51bSB2YWx1ZXMgdG8gdGhlIGVudW1zIGluIG9yZGVyIHRvIHRlc3Qgc2VhcmNoaW5nIGZvciBlbnVtCisgICAgLy8gdmFsdWVzIGFjcm9zcyBhIG1lc3NhZ2UncyBzY29wZS4KKworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZm9vX2ZpbGU7CisgICAgZm9vX2ZpbGUuc2V0X25hbWUoImZvby5wcm90byIpOworCisgICAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlID0gQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJUZXN0TWVzc2FnZSIpOworICAgIEFkZE5lc3RlZE1lc3NhZ2UobWVzc2FnZSwgIkZvbyIpOworICAgIEFkZE5lc3RlZE1lc3NhZ2UobWVzc2FnZSwgIkJhciIpOworICAgIEVudW1EZXNjcmlwdG9yUHJvdG8qIGJheiA9IEFkZE5lc3RlZEVudW0obWVzc2FnZSwgIkJheiIpOworICAgIEFkZEVudW1WYWx1ZShiYXosICJBIiwgMSk7CisgICAgRW51bURlc2NyaXB0b3JQcm90byogbW9vID0gQWRkTmVzdGVkRW51bShtZXNzYWdlLCAiTW9vIik7CisgICAgQWRkRW51bVZhbHVlKG1vbywgIkIiLCAxKTsKKworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gYmFyX2ZpbGU7CisgICAgYmFyX2ZpbGUuc2V0X25hbWUoImJhci5wcm90byIpOworICAgIGJhcl9maWxlLnNldF9wYWNrYWdlKCJjb3JnZS5ncmF1bHQiKTsKKworICAgIERlc2NyaXB0b3JQcm90byogbWVzc2FnZTIgPSBBZGRNZXNzYWdlKCZiYXJfZmlsZSwgIlRlc3RNZXNzYWdlMiIpOworICAgIEFkZE5lc3RlZE1lc3NhZ2UobWVzc2FnZTIsICJGb28iKTsKKyAgICBBZGROZXN0ZWRNZXNzYWdlKG1lc3NhZ2UyLCAiQmF6Iik7CisgICAgRW51bURlc2NyaXB0b3JQcm90byogbW9vMiA9IEFkZE5lc3RlZEVudW0obWVzc2FnZTIsICJNb28iKTsKKyAgICBBZGRFbnVtVmFsdWUobW9vMiwgIkEiLCAxKTsKKyAgICBFbnVtRGVzY3JpcHRvclByb3RvKiBtb29vMiA9IEFkZE5lc3RlZEVudW0obWVzc2FnZTIsICJNb29vIik7CisgICAgQWRkRW51bVZhbHVlKG1vb28yLCAiQyIsIDEpOworCisgICAgLy8gQnVpbGQgdGhlIGRlc2NyaXB0b3JzIGFuZCBnZXQgdGhlIHBvaW50ZXJzLgorICAgIGZvb19maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShmb29fZmlsZSk7CisgICAgQVNTRVJUX1RSVUUoZm9vX2ZpbGVfICE9IG51bGxwdHIpOworCisgICAgYmFyX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGJhcl9maWxlKTsKKyAgICBBU1NFUlRfVFJVRShiYXJfZmlsZV8gIT0gbnVsbHB0cik7CisKKyAgICBBU1NFUlRfRVEoMSwgZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgICAgbWVzc2FnZV8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgwKTsKKworICAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGVfY291bnQoKSk7CisgICAgZm9vXyA9IG1lc3NhZ2VfLT5uZXN0ZWRfdHlwZSgwKTsKKyAgICBiYXJfID0gbWVzc2FnZV8tPm5lc3RlZF90eXBlKDEpOworCisgICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2VfLT5lbnVtX3R5cGVfY291bnQoKSk7CisgICAgYmF6XyA9IG1lc3NhZ2VfLT5lbnVtX3R5cGUoMCk7CisgICAgbW9vXyA9IG1lc3NhZ2VfLT5lbnVtX3R5cGUoMSk7CisKKyAgICBBU1NFUlRfRVEoMSwgYmF6Xy0+dmFsdWVfY291bnQoKSk7CisgICAgYV8gPSBiYXpfLT52YWx1ZSgwKTsKKyAgICBBU1NFUlRfRVEoMSwgbW9vXy0+dmFsdWVfY291bnQoKSk7CisgICAgYl8gPSBtb29fLT52YWx1ZSgwKTsKKworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBtZXNzYWdlMl8gPSBiYXJfZmlsZV8tPm1lc3NhZ2VfdHlwZSgwKTsKKworICAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlMl8tPm5lc3RlZF90eXBlX2NvdW50KCkpOworICAgIGZvbzJfID0gbWVzc2FnZTJfLT5uZXN0ZWRfdHlwZSgwKTsKKyAgICBiYXoyXyA9IG1lc3NhZ2UyXy0+bmVzdGVkX3R5cGUoMSk7CisKKyAgICBBU1NFUlRfRVEoMiwgbWVzc2FnZTJfLT5lbnVtX3R5cGVfY291bnQoKSk7CisgICAgbW9vMl8gPSBtZXNzYWdlMl8tPmVudW1fdHlwZSgwKTsKKyAgICBtb29vMl8gPSBtZXNzYWdlMl8tPmVudW1fdHlwZSgxKTsKKworICAgIEFTU0VSVF9FUSgxLCBtb28yXy0+dmFsdWVfY291bnQoKSk7CisgICAgYTJfID0gbW9vMl8tPnZhbHVlKDApOworICAgIEFTU0VSVF9FUSgxLCBtb29vMl8tPnZhbHVlX2NvdW50KCkpOworICAgIGMyXyA9IG1vb28yXy0+dmFsdWUoMCk7CisgIH0KKworICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZm9vX2ZpbGVfOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogYmFyX2ZpbGVfOworCisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfOworICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlMl87CisKKyAgY29uc3QgRGVzY3JpcHRvciogZm9vXzsKKyAgY29uc3QgRGVzY3JpcHRvciogYmFyXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGJhel87CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBtb29fOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBhXzsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogYl87CisKKyAgY29uc3QgRGVzY3JpcHRvciogZm9vMl87CisgIGNvbnN0IERlc2NyaXB0b3IqIGJhejJfOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogbW9vMl87CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBtb29vMl87CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGEyXzsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogYzJfOworfTsKKworVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBNZXNzYWdlTmFtZSkgeworICBFWFBFQ1RfRVEoIkZvbyIsIGZvb18tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiQmFyIiwgYmFyXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJGb28iLCBmb28yXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJCYXoiLCBiYXoyXy0+bmFtZSgpKTsKKworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlLkZvbyIsIGZvb18tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJUZXN0TWVzc2FnZS5CYXIiLCBiYXJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RNZXNzYWdlMi5Gb28iLCBmb28yXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0TWVzc2FnZTIuQmF6IiwgYmF6Ml8tPmZ1bGxfbmFtZSgpKTsKK30KKworVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBNZXNzYWdlQ29udGFpbmluZ1R5cGUpIHsKKyAgRVhQRUNUX0VRKG1lc3NhZ2VfLCBmb29fLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXywgYmFyXy0+Y29udGFpbmluZ190eXBlKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTJfLCBmb28yXy0+Y29udGFpbmluZ190eXBlKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTJfLCBiYXoyXy0+Y29udGFpbmluZ190eXBlKCkpOworfQorCitURVNUX0YoTmVzdGVkRGVzY3JpcHRvclRlc3QsIE5lc3RlZE1lc3NhZ2VzQnlJbmRleCkgeworICBBU1NFUlRfRVEoMiwgbWVzc2FnZV8tPm5lc3RlZF90eXBlX2NvdW50KCkpOworICBFWFBFQ1RfRVEoZm9vXywgbWVzc2FnZV8tPm5lc3RlZF90eXBlKDApKTsKKyAgRVhQRUNUX0VRKGJhcl8sIG1lc3NhZ2VfLT5uZXN0ZWRfdHlwZSgxKSk7Cit9CisKK1RFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgRmluZEZpZWxkQnlOYW1lRG9lc250RmluZE5lc3RlZFR5cGVzKSB7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeU5hbWUoIkZvbyIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlOYW1lKCJNb28iKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeU5hbWUoIkZvbyIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiTW9vIikgPT0gbnVsbHB0cik7Cit9CisKK1RFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgRmluZE5lc3RlZFR5cGVCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGZvb18sIG1lc3NhZ2VfLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiRm9vIikpOworICBFWFBFQ1RfRVEoYmFyXywgbWVzc2FnZV8tPkZpbmROZXN0ZWRUeXBlQnlOYW1lKCJCYXIiKSk7CisgIEVYUEVDVF9FUShmb28yXywgbWVzc2FnZTJfLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiRm9vIikpOworICBFWFBFQ1RfRVEoYmF6Ml8sIG1lc3NhZ2UyXy0+RmluZE5lc3RlZFR5cGVCeU5hbWUoIkJheiIpKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZE5lc3RlZFR5cGVCeU5hbWUoIk5vU3VjaFR5cGUiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmROZXN0ZWRUeXBlQnlOYW1lKCJCYXoiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTJfLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiQmFyIikgPT0gbnVsbHB0cik7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmROZXN0ZWRUeXBlQnlOYW1lKCJNb28iKSA9PSBudWxscHRyKTsKK30KKworVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBFbnVtTmFtZSkgeworICBFWFBFQ1RfRVEoIkJheiIsIGJhel8tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiTW9vIiwgbW9vXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJNb28iLCBtb28yXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJNb29vIiwgbW9vbzJfLT5uYW1lKCkpOworCisgIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UuQmF6IiwgYmF6Xy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlLk1vbyIsIG1vb18tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLk1vbyIsIG1vbzJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RNZXNzYWdlMi5Nb29vIiwgbW9vbzJfLT5mdWxsX25hbWUoKSk7Cit9CisKK1RFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgRW51bUNvbnRhaW5pbmdUeXBlKSB7CisgIEVYUEVDVF9FUShtZXNzYWdlXywgYmF6Xy0+Y29udGFpbmluZ190eXBlKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZV8sIG1vb18tPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyXywgbW9vMl8tPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyXywgbW9vbzJfLT5jb250YWluaW5nX3R5cGUoKSk7Cit9CisKK1RFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgTmVzdGVkRW51bXNCeUluZGV4KSB7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGVfY291bnQoKSk7CisgIEVYUEVDVF9FUShmb29fLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGUoMCkpOworICBFWFBFQ1RfRVEoYmFyXywgbWVzc2FnZV8tPm5lc3RlZF90eXBlKDEpKTsKK30KKworVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBGaW5kRW51bVR5cGVCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGJhel8sIG1lc3NhZ2VfLT5GaW5kRW51bVR5cGVCeU5hbWUoIkJheiIpKTsKKyAgRVhQRUNUX0VRKG1vb18sIG1lc3NhZ2VfLT5GaW5kRW51bVR5cGVCeU5hbWUoIk1vbyIpKTsKKyAgRVhQRUNUX0VRKG1vbzJfLCBtZXNzYWdlMl8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiTW9vIikpOworICBFWFBFQ1RfRVEobW9vbzJfLCBtZXNzYWdlMl8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiTW9vbyIpKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEVudW1UeXBlQnlOYW1lKCJOb1N1Y2hUeXBlIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRW51bVR5cGVCeU5hbWUoIk1vb28iKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTJfLT5GaW5kRW51bVR5cGVCeU5hbWUoIkJheiIpID09IG51bGxwdHIpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRW51bVR5cGVCeU5hbWUoIkZvbyIpID09IG51bGxwdHIpOworfQorCitURVNUX0YoTmVzdGVkRGVzY3JpcHRvclRlc3QsIEZpbmRFbnVtVmFsdWVCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGFfLCBtZXNzYWdlXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiQSIpKTsKKyAgRVhQRUNUX0VRKGJfLCBtZXNzYWdlXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiQiIpKTsKKyAgRVhQRUNUX0VRKGEyXywgbWVzc2FnZTJfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJBIikpOworICBFWFBFQ1RfRVEoYzJfLCBtZXNzYWdlMl8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIkMiKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIk5PX1NVQ0hfVkFMVUUiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIkMiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTJfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJCIikgPT0gbnVsbHB0cik7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIkZvbyIpID09IG51bGxwdHIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFRlc3QgZXh0ZW5zaW9ucy4KK2NsYXNzIEV4dGVuc2lvbkRlc2NyaXB0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKyAgICAvLworICAgIC8vICAgZW51bSBCYXoge30KKyAgICAvLyAgIG1lc3NhZ2UgTW9vIHt9CisgICAgLy8KKyAgICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgICAvLyAgICAgZXh0ZW5zaW9ucyAxMCB0byAxOTsKKyAgICAvLyAgICAgZXh0ZW5zaW9ucyAzMCB0byAzOTsKKyAgICAvLyAgIH0KKyAgICAvLyAgIGV4dGVuZCBGb28geworICAgIC8vICAgICBvcHRpb25hbCBpbnQzMiBmb29faW50MzIgPSAxMDsKKyAgICAvLyAgIH0KKyAgICAvLyAgIGV4dGVuZCBGb28geworICAgIC8vICAgICByZXBlYXRlZCBUZXN0RW51bSBmb29fZW51bSA9IDE5OworICAgIC8vICAgfQorICAgIC8vICAgbWVzc2FnZSBCYXIgeworICAgIC8vICAgICBvcHRpb25hbCBpbnQzMiBub25fZXh0X2ludDMyID0gMTsKKyAgICAvLyAgICAgZXh0ZW5kIEZvbyB7CisgICAgLy8gICAgICAgb3B0aW9uYWwgTW9vIGZvb19tZXNzYWdlID0gMzA7CisgICAgLy8gICAgICAgcmVwZWF0ZWQgTW9vIGZvb19ncm91cCA9IDM5OyAgLy8gKGJ1dCBpbnRlcm5hbGx5IHNldCB0byBUWVBFX0dST1VQKQorICAgIC8vICAgICB9CisgICAgLy8gICB9CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb19maWxlOworICAgIGZvb19maWxlLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKworICAgIEFkZEVtcHR5RW51bSgmZm9vX2ZpbGUsICJCYXoiKTsKKyAgICBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIk1vbyIpOworCisgICAgRGVzY3JpcHRvclByb3RvKiBmb28gPSBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkZvbyIpOworICAgIEFkZEV4dGVuc2lvblJhbmdlKGZvbywgMTAsIDIwKTsKKyAgICBBZGRFeHRlbnNpb25SYW5nZShmb28sIDMwLCA0MCk7CisKKyAgICBBZGRFeHRlbnNpb24oJmZvb19maWxlLCAiRm9vIiwgImZvb19pbnQzMiIsIDEwLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGRFeHRlbnNpb24oJmZvb19maWxlLCAiRm9vIiwgImZvb19lbnVtIiwgMTksCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRCwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTSkKKyAgICAgICAgLT5zZXRfdHlwZV9uYW1lKCJCYXoiKTsKKworICAgIERlc2NyaXB0b3JQcm90byogYmFyID0gQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJCYXIiKTsKKyAgICBBZGRGaWVsZChiYXIsICJub25fZXh0X2ludDMyIiwgMSwgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGROZXN0ZWRFeHRlbnNpb24oYmFyLCAiRm9vIiwgImZvb19tZXNzYWdlIiwgMzAsCisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfTUVTU0FHRSkKKyAgICAgICAgLT5zZXRfdHlwZV9uYW1lKCJNb28iKTsKKyAgICBBZGROZXN0ZWRFeHRlbnNpb24oYmFyLCAiRm9vIiwgImZvb19ncm91cCIsIDM5LAorICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVQRUFURUQsCisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0dST1VQKQorICAgICAgICAtPnNldF90eXBlX25hbWUoIk1vbyIpOworCisgICAgLy8gQnVpbGQgdGhlIGRlc2NyaXB0b3JzIGFuZCBnZXQgdGhlIHBvaW50ZXJzLgorICAgIGZvb19maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShmb29fZmlsZSk7CisgICAgQVNTRVJUX1RSVUUoZm9vX2ZpbGVfICE9IG51bGxwdHIpOworCisgICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+ZW51bV90eXBlX2NvdW50KCkpOworICAgIGJhel8gPSBmb29fZmlsZV8tPmVudW1fdHlwZSgwKTsKKworICAgIEFTU0VSVF9FUSgzLCBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBtb29fID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7CisgICAgZm9vXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDEpOworICAgIGJhcl8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgyKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87CisKKyAgY29uc3QgRGVzY3JpcHRvciogZm9vXzsKKyAgY29uc3QgRGVzY3JpcHRvciogYmFyXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGJhel87CisgIGNvbnN0IERlc2NyaXB0b3IqIG1vb187Cit9OworCitURVNUX0YoRXh0ZW5zaW9uRGVzY3JpcHRvclRlc3QsIEV4dGVuc2lvblJhbmdlcykgeworICBFWFBFQ1RfRVEoMCwgYmFyXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkpOworICBBU1NFUlRfRVEoMiwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkpOworCisgIEVYUEVDVF9FUSgxMCwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlKDApLT5zdGFydCk7CisgIEVYUEVDVF9FUSgzMCwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlKDEpLT5zdGFydCk7CisKKyAgRVhQRUNUX0VRKDIwLCBmb29fLT5leHRlbnNpb25fcmFuZ2UoMCktPmVuZCk7CisgIEVYUEVDVF9FUSg0MCwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlKDEpLT5lbmQpOworfQorCitURVNUX0YoRXh0ZW5zaW9uRGVzY3JpcHRvclRlc3QsIEV4dGVuc2lvbnMpIHsKKyAgRVhQRUNUX0VRKDAsIGZvb18tPmV4dGVuc2lvbl9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKDIsIGZvb19maWxlXy0+ZXh0ZW5zaW9uX2NvdW50KCkpOworICBBU1NFUlRfRVEoMiwgYmFyXy0+ZXh0ZW5zaW9uX2NvdW50KCkpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+ZXh0ZW5zaW9uKDApLT5pc19leHRlbnNpb24oKSk7CisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+ZXh0ZW5zaW9uKDEpLT5pc19leHRlbnNpb24oKSk7CisgIEVYUEVDVF9UUlVFKGJhcl8tPmV4dGVuc2lvbigwKS0+aXNfZXh0ZW5zaW9uKCkpOworICBFWFBFQ1RfVFJVRShiYXJfLT5leHRlbnNpb24oMSktPmlzX2V4dGVuc2lvbigpKTsKKworICBFWFBFQ1RfRVEoImZvb19pbnQzMiIsIGZvb19maWxlXy0+ZXh0ZW5zaW9uKDApLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoImZvb19lbnVtIiwgZm9vX2ZpbGVfLT5leHRlbnNpb24oMSktPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vX21lc3NhZ2UiLCBiYXJfLT5leHRlbnNpb24oMCktPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vX2dyb3VwIiwgYmFyXy0+ZXh0ZW5zaW9uKDEpLT5uYW1lKCkpOworCisgIEVYUEVDVF9FUSgxMCwgZm9vX2ZpbGVfLT5leHRlbnNpb24oMCktPm51bWJlcigpKTsKKyAgRVhQRUNUX0VRKDE5LCBmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+bnVtYmVyKCkpOworICBFWFBFQ1RfRVEoMzAsIGJhcl8tPmV4dGVuc2lvbigwKS0+bnVtYmVyKCkpOworICBFWFBFQ1RfRVEoMzksIGJhcl8tPmV4dGVuc2lvbigxKS0+bnVtYmVyKCkpOworCisgIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzIsIGZvb19maWxlXy0+ZXh0ZW5zaW9uKDApLT50eXBlKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU0sIGZvb19maWxlXy0+ZXh0ZW5zaW9uKDEpLT50eXBlKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UsIGJhcl8tPmV4dGVuc2lvbigwKS0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCwgYmFyXy0+ZXh0ZW5zaW9uKDEpLT50eXBlKCkpOworCisgIEVYUEVDVF9FUShiYXpfLCBmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+ZW51bV90eXBlKCkpOworICBFWFBFQ1RfRVEobW9vXywgYmFyXy0+ZXh0ZW5zaW9uKDApLT5tZXNzYWdlX3R5cGUoKSk7CisgIEVYUEVDVF9FUShtb29fLCBiYXJfLT5leHRlbnNpb24oMSktPm1lc3NhZ2VfdHlwZSgpKTsKKworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTCwgZm9vX2ZpbGVfLT5leHRlbnNpb24oMCktPmxhYmVsKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCwgZm9vX2ZpbGVfLT5leHRlbnNpb24oMSktPmxhYmVsKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTCwgYmFyXy0+ZXh0ZW5zaW9uKDApLT5sYWJlbCgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQsIGJhcl8tPmV4dGVuc2lvbigxKS0+bGFiZWwoKSk7CisKKyAgRVhQRUNUX0VRKGZvb18sIGZvb19maWxlXy0+ZXh0ZW5zaW9uKDApLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShmb29fLCBmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+Y29udGFpbmluZ190eXBlKCkpOworICBFWFBFQ1RfRVEoZm9vXywgYmFyXy0+ZXh0ZW5zaW9uKDApLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShmb29fLCBiYXJfLT5leHRlbnNpb24oMSktPmNvbnRhaW5pbmdfdHlwZSgpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPmV4dGVuc2lvbigwKS0+ZXh0ZW5zaW9uX3Njb3BlKCkgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+ZXh0ZW5zaW9uKDEpLT5leHRlbnNpb25fc2NvcGUoKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0VRKGJhcl8sIGJhcl8tPmV4dGVuc2lvbigwKS0+ZXh0ZW5zaW9uX3Njb3BlKCkpOworICBFWFBFQ1RfRVEoYmFyXywgYmFyXy0+ZXh0ZW5zaW9uKDEpLT5leHRlbnNpb25fc2NvcGUoKSk7Cit9CisKK1RFU1RfRihFeHRlbnNpb25EZXNjcmlwdG9yVGVzdCwgSXNFeHRlbnNpb25OdW1iZXIpIHsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzRXh0ZW5zaW9uTnVtYmVyKDkpKTsKKyAgRVhQRUNUX1RSVUUoZm9vXy0+SXNFeHRlbnNpb25OdW1iZXIoMTApKTsKKyAgRVhQRUNUX1RSVUUoZm9vXy0+SXNFeHRlbnNpb25OdW1iZXIoMTkpKTsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzRXh0ZW5zaW9uTnVtYmVyKDIwKSk7CisgIEVYUEVDVF9GQUxTRShmb29fLT5Jc0V4dGVuc2lvbk51bWJlcigyOSkpOworICBFWFBFQ1RfVFJVRShmb29fLT5Jc0V4dGVuc2lvbk51bWJlcigzMCkpOworICBFWFBFQ1RfVFJVRShmb29fLT5Jc0V4dGVuc2lvbk51bWJlcigzOSkpOworICBFWFBFQ1RfRkFMU0UoZm9vXy0+SXNFeHRlbnNpb25OdW1iZXIoNDApKTsKK30KKworVEVTVF9GKEV4dGVuc2lvbkRlc2NyaXB0b3JUZXN0LCBGaW5kRXh0ZW5zaW9uQnlOYW1lKSB7CisgIC8vIE5vdGUgdGhhdCBGaWxlRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5TmFtZSgpIGlzIHRlc3RlZCBieQorICAvLyBGaWxlRGVzY3JpcHRvclRlc3QuCisgIEFTU0VSVF9FUSgyLCBiYXJfLT5leHRlbnNpb25fY291bnQoKSk7CisKKyAgRVhQRUNUX0VRKGJhcl8tPmV4dGVuc2lvbigwKSwgYmFyXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiZm9vX21lc3NhZ2UiKSk7CisgIEVYUEVDVF9FUShiYXJfLT5leHRlbnNpb24oMSksIGJhcl8tPkZpbmRFeHRlbnNpb25CeU5hbWUoImZvb19ncm91cCIpKTsKKworICBFWFBFQ1RfVFJVRShiYXJfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJub19zdWNoX2V4dGVuc2lvbiIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShmb29fLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJmb29faW50MzIiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoZm9vXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiZm9vX21lc3NhZ2UiKSA9PSBudWxscHRyKTsKK30KKworVEVTVF9GKEV4dGVuc2lvbkRlc2NyaXB0b3JUZXN0LCBGaWVsZFZzRXh0ZW5zaW9uKSB7CisgIEVYUEVDVF9FUShmb29fLT5GaW5kRmllbGRCeU5hbWUoImZvb19tZXNzYWdlIiksIG51bGxwdHIpOworICBFWFBFQ1RfRVEoYmFyXy0+RmluZEZpZWxkQnlOYW1lKCJmb29fbWVzc2FnZSIpLCBudWxscHRyKTsKKyAgRVhQRUNUX05FKGJhcl8tPkZpbmRGaWVsZEJ5TmFtZSgibm9uX2V4dF9pbnQzMiIpLCBudWxscHRyKTsKKyAgRVhQRUNUX0VRKGZvb18tPkZpbmRFeHRlbnNpb25CeU5hbWUoImZvb19tZXNzYWdlIiksIG51bGxwdHIpOworICBFWFBFQ1RfTkUoYmFyXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiZm9vX21lc3NhZ2UiKSwgbnVsbHB0cik7CisgIEVYUEVDVF9FUShiYXJfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJub25fZXh0X2ludDMyIiksIG51bGxwdHIpOworfQorCitURVNUX0YoRXh0ZW5zaW9uRGVzY3JpcHRvclRlc3QsIEZpbmRFeHRlbnNpb25CeVByaW50YWJsZU5hbWUpIHsKKyAgRVhQRUNUX1RSVUUocG9vbF8uRmluZEV4dGVuc2lvbkJ5UHJpbnRhYmxlTmFtZShmb29fLCAibm9fc3VjaF9leHRlbnNpb24iKSA9PQorICAgICAgICAgICAgICBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8uRmluZEV4dGVuc2lvbkJ5UHJpbnRhYmxlTmFtZShiYXJfLCAibm9fc3VjaF9leHRlbnNpb24iKSA9PQorICAgICAgICAgICAgICBudWxscHRyKTsKKworICBBU1NFUlRfRkFMU0UocG9vbF8uRmluZEV4dGVuc2lvbkJ5UHJpbnRhYmxlTmFtZShmb29fLCAiQmFyLmZvb19tZXNzYWdlIikgPT0KKyAgICAgICAgICAgICAgIG51bGxwdHIpOworICBBU1NFUlRfRkFMU0UocG9vbF8uRmluZEV4dGVuc2lvbkJ5UHJpbnRhYmxlTmFtZShmb29fLCAiQmFyLmZvb19ncm91cCIpID09CisgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8uRmluZEV4dGVuc2lvbkJ5UHJpbnRhYmxlTmFtZShiYXJfLCAiZm9vX21lc3NhZ2UiKSA9PQorICAgICAgICAgICAgICBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8uRmluZEV4dGVuc2lvbkJ5UHJpbnRhYmxlTmFtZShiYXJfLCAiZm9vX2dyb3VwIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9FUShiYXJfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJmb29fbWVzc2FnZSIpLAorICAgICAgICAgICAgcG9vbF8uRmluZEV4dGVuc2lvbkJ5UHJpbnRhYmxlTmFtZShmb29fLCAiQmFyLmZvb19tZXNzYWdlIikpOworICBFWFBFQ1RfRVEoYmFyXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiZm9vX2dyb3VwIiksCisgICAgICAgICAgICBwb29sXy5GaW5kRXh0ZW5zaW9uQnlQcmludGFibGVOYW1lKGZvb18sICJCYXIuZm9vX2dyb3VwIikpOworCisgIEFTU0VSVF9GQUxTRShwb29sXy5GaW5kRXh0ZW5zaW9uQnlQcmludGFibGVOYW1lKGZvb18sICJmb29faW50MzIiKSA9PQorICAgICAgICAgICAgICAgbnVsbHB0cik7CisgIEFTU0VSVF9GQUxTRShwb29sXy5GaW5kRXh0ZW5zaW9uQnlQcmludGFibGVOYW1lKGZvb18sICJmb29fZW51bSIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShwb29sXy5GaW5kRXh0ZW5zaW9uQnlQcmludGFibGVOYW1lKGJhcl8sICJmb29faW50MzIiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8uRmluZEV4dGVuc2lvbkJ5UHJpbnRhYmxlTmFtZShiYXJfLCAiZm9vX2VudW0iKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0VRKGZvb19maWxlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiZm9vX2ludDMyIiksCisgICAgICAgICAgICBwb29sXy5GaW5kRXh0ZW5zaW9uQnlQcmludGFibGVOYW1lKGZvb18sICJmb29faW50MzIiKSk7CisgIEVYUEVDVF9FUShmb29fZmlsZV8tPkZpbmRFeHRlbnNpb25CeU5hbWUoImZvb19lbnVtIiksCisgICAgICAgICAgICBwb29sXy5GaW5kRXh0ZW5zaW9uQnlQcmludGFibGVOYW1lKGZvb18sICJmb29fZW51bSIpKTsKK30KKworVEVTVF9GKEV4dGVuc2lvbkRlc2NyaXB0b3JUZXN0LCBGaW5kQWxsRXh0ZW5zaW9ucykgeworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBleHRlbnNpb25zOworICBwb29sXy5GaW5kQWxsRXh0ZW5zaW9ucyhmb29fLCAmZXh0ZW5zaW9ucyk7CisgIEFTU0VSVF9FUSg0LCBleHRlbnNpb25zLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxMCwgZXh0ZW5zaW9uc1swXS0+bnVtYmVyKCkpOworICBFWFBFQ1RfRVEoMTksIGV4dGVuc2lvbnNbMV0tPm51bWJlcigpKTsKKyAgRVhQRUNUX0VRKDMwLCBleHRlbnNpb25zWzJdLT5udW1iZXIoKSk7CisgIEVYUEVDVF9FUSgzOSwgZXh0ZW5zaW9uc1szXS0+bnVtYmVyKCkpOworfQorCisKK1RFU1RfRihFeHRlbnNpb25EZXNjcmlwdG9yVGVzdCwgRHVwbGljYXRlRmllbGROdW1iZXIpIHsKKyAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICAvLyBBZGQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIi4KKyAgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IG51bGxwdHIpOworICAvLyBBZGQgImZvby5wcm90byI6CisgIC8vICAgaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byI7CisgIC8vICAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgeworICAvLyAgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uMSA9IDEwMDA7CisgIC8vICAgfQorICBmaWxlX3Byb3RvLkNsZWFyKCk7CisgIGZpbGVfcHJvdG8uc2V0X25hbWUoImZvby5wcm90byIpOworICBmaWxlX3Byb3RvLmFkZF9kZXBlbmRlbmN5KCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIpOworICBBZGRFeHRlbnNpb24oJmZpbGVfcHJvdG8sICJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIiwgIm9wdGlvbjEiLCAxMDAwLAorICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBudWxscHRyKTsKKyAgLy8gQWRkICJiYXIucHJvdG8iOgorICAvLyAgIGltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iOworICAvLyAgIGV4dGVuZCBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIHsKKyAgLy8gICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbjIgPSAxMDAwOworICAvLyAgIH0KKyAgZmlsZV9wcm90by5DbGVhcigpOworICBmaWxlX3Byb3RvLnNldF9uYW1lKCJiYXIucHJvdG8iKTsKKyAgZmlsZV9wcm90by5hZGRfZGVwZW5kZW5jeSgiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iKTsKKyAgQWRkRXh0ZW5zaW9uKCZmaWxlX3Byb3RvLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyIsICJvcHRpb24yIiwgMTAwMCwKKyAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgLy8gQ3VycmVudGx5IHdlIG9ubHkgZ2VuZXJhdGUgYSB3YXJuaW5nIGZvciBjb25mbGljdGluZyBleHRlbnNpb24gbnVtYmVycy4KKyAgLy8gVE9ETyh4aWFvZmVuZyk6IENoYW5nZSBpdCB0byBhbiBlcnJvci4KKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gbnVsbHB0cik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gRW5zdXJlIHRoYXQgb3ZlcmxhcHBpbmcgZXh0ZW5zaW9uIHJhbmdlcyBhcmUgbm90IGFsbG93ZWQuCitURVNUKE92ZXJsYXBwaW5nRXh0ZW5zaW9uUmFuZ2VUZXN0LCBFeHRlbnNpb25SYW5nZUludGVybmFsKSB7CisgIC8vIEJ1aWxkIGRlc2NyaXB0b3JzIGZvciB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zOgorICAvLworICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICAgIGV4dGVuc2lvbnMgMTAgdG8gMTk7CisgIC8vICAgICBleHRlbnNpb25zIDE1OworICAvLyAgIH0KKyAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fZmlsZTsKKyAgZm9vX2ZpbGUuc2V0X25hbWUoImZvby5wcm90byIpOworCisgIERlc2NyaXB0b3JQcm90byogZm9vID0gQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJGb28iKTsKKyAgQWRkRXh0ZW5zaW9uUmFuZ2UoZm9vLCAxMCwgMjApOworICBBZGRFeHRlbnNpb25SYW5nZShmb28sIDE1LCAxNik7CisKKyAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgTW9ja0Vycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKKyAgLy8gVGhlIGV4dGVuc2lvbnMgcmFuZ2VzIGFyZSBpbnZhbGlkLCBzbyB0aGUgcHJvdG8gc2hvdWxkbid0IGJ1aWxkLgorICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoZm9vX2ZpbGUsICZlcnJvcl9jb2xsZWN0b3IpID09CisgICAgICAgICAgICAgIG51bGxwdHIpOworICBBU1NFUlRfRVEoCisgICAgICAiZm9vLnByb3RvOiBGb286IE5VTUJFUjogRXh0ZW5zaW9uIHJhbmdlIDE1IHRvIDE1IG92ZXJsYXBzIHdpdGggIgorICAgICAgImFscmVhZHktZGVmaW5lZCByYW5nZSAxMCB0byAxOS5cbiIsCisgICAgICBlcnJvcl9jb2xsZWN0b3IudGV4dF8pOworfQorCitURVNUKE92ZXJsYXBwaW5nRXh0ZW5zaW9uUmFuZ2VUZXN0LCBFeHRlbnNpb25SYW5nZUFmdGVyKSB7CisgIC8vIEJ1aWxkIGRlc2NyaXB0b3JzIGZvciB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zOgorICAvLworICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICAgIGV4dGVuc2lvbnMgMTAgdG8gMTk7CisgIC8vICAgICBleHRlbnNpb25zIDE1IHRvIDI0OworICAvLyAgIH0KKyAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fZmlsZTsKKyAgZm9vX2ZpbGUuc2V0X25hbWUoImZvby5wcm90byIpOworCisgIERlc2NyaXB0b3JQcm90byogZm9vID0gQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJGb28iKTsKKyAgQWRkRXh0ZW5zaW9uUmFuZ2UoZm9vLCAxMCwgMjApOworICBBZGRFeHRlbnNpb25SYW5nZShmb28sIDE1LCAyNSk7CisKKyAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgTW9ja0Vycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKKyAgLy8gVGhlIGV4dGVuc2lvbnMgcmFuZ2VzIGFyZSBpbnZhbGlkLCBzbyB0aGUgcHJvdG8gc2hvdWxkbid0IGJ1aWxkLgorICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoZm9vX2ZpbGUsICZlcnJvcl9jb2xsZWN0b3IpID09CisgICAgICAgICAgICAgIG51bGxwdHIpOworICBBU1NFUlRfRVEoCisgICAgICAiZm9vLnByb3RvOiBGb286IE5VTUJFUjogRXh0ZW5zaW9uIHJhbmdlIDE1IHRvIDI0IG92ZXJsYXBzIHdpdGggIgorICAgICAgImFscmVhZHktZGVmaW5lZCByYW5nZSAxMCB0byAxOS5cbiIsCisgICAgICBlcnJvcl9jb2xsZWN0b3IudGV4dF8pOworfQorCitURVNUKE92ZXJsYXBwaW5nRXh0ZW5zaW9uUmFuZ2VUZXN0LCBFeHRlbnNpb25SYW5nZUJlZm9yZSkgeworICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKyAgLy8KKyAgLy8gICBtZXNzYWdlIEZvbyB7CisgIC8vICAgICBleHRlbnNpb25zIDEwIHRvIDE5OworICAvLyAgICAgZXh0ZW5zaW9ucyA1IHRvIDE0OworICAvLyAgIH0KKyAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fZmlsZTsKKyAgZm9vX2ZpbGUuc2V0X25hbWUoImZvby5wcm90byIpOworCisgIERlc2NyaXB0b3JQcm90byogZm9vID0gQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJGb28iKTsKKyAgQWRkRXh0ZW5zaW9uUmFuZ2UoZm9vLCAxMCwgMjApOworICBBZGRFeHRlbnNpb25SYW5nZShmb28sIDUsIDE1KTsKKworICBEZXNjcmlwdG9yUG9vbCBwb29sOworICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICAvLyBUaGUgZXh0ZW5zaW9ucyByYW5nZXMgYXJlIGludmFsaWQsIHNvIHRoZSBwcm90byBzaG91bGRuJ3QgYnVpbGQuCisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlQ29sbGVjdGluZ0Vycm9ycyhmb29fZmlsZSwgJmVycm9yX2NvbGxlY3RvcikgPT0KKyAgICAgICAgICAgICAgbnVsbHB0cik7CisgIEFTU0VSVF9FUSgKKyAgICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBFeHRlbnNpb24gcmFuZ2UgNSB0byAxNCBvdmVybGFwcyB3aXRoICIKKyAgICAgICJhbHJlYWR5LWRlZmluZWQgcmFuZ2UgMTAgdG8gMTkuXG4iLAorICAgICAgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBUZXN0IHJlc2VydmVkIGZpZWxkcy4KK2NsYXNzIFJlc2VydmVkRGVzY3JpcHRvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIC8vIEJ1aWxkIGRlc2NyaXB0b3JzIGZvciB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zOgorICAgIC8vCisgICAgLy8gICBtZXNzYWdlIEZvbyB7CisgICAgLy8gICAgIHJlc2VydmVkIDIsIDkgdG8gMTEsIDE1OworICAgIC8vICAgICByZXNlcnZlZCAiZm9vIiwgImJhciI7CisgICAgLy8gICB9CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb19maWxlOworICAgIGZvb19maWxlLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKworICAgIERlc2NyaXB0b3JQcm90byogZm9vID0gQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJGb28iKTsKKyAgICBBZGRSZXNlcnZlZFJhbmdlKGZvbywgMiwgMyk7CisgICAgQWRkUmVzZXJ2ZWRSYW5nZShmb28sIDksIDEyKTsKKyAgICBBZGRSZXNlcnZlZFJhbmdlKGZvbywgMTUsIDE2KTsKKworICAgIGZvby0+YWRkX3Jlc2VydmVkX25hbWUoImZvbyIpOworICAgIGZvby0+YWRkX3Jlc2VydmVkX25hbWUoImJhciIpOworCisgICAgLy8gQnVpbGQgdGhlIGRlc2NyaXB0b3JzIGFuZCBnZXQgdGhlIHBvaW50ZXJzLgorICAgIGZvb19maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShmb29fZmlsZSk7CisgICAgQVNTRVJUX1RSVUUoZm9vX2ZpbGVfICE9IG51bGxwdHIpOworCisgICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGZvb18gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgwKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZm9vX2ZpbGVfOworICBjb25zdCBEZXNjcmlwdG9yKiBmb29fOworfTsKKworVEVTVF9GKFJlc2VydmVkRGVzY3JpcHRvclRlc3QsIFJlc2VydmVkUmFuZ2VzKSB7CisgIEFTU0VSVF9FUSgzLCBmb29fLT5yZXNlcnZlZF9yYW5nZV9jb3VudCgpKTsKKworICBFWFBFQ1RfRVEoMiwgZm9vXy0+cmVzZXJ2ZWRfcmFuZ2UoMCktPnN0YXJ0KTsKKyAgRVhQRUNUX0VRKDMsIGZvb18tPnJlc2VydmVkX3JhbmdlKDApLT5lbmQpOworCisgIEVYUEVDVF9FUSg5LCBmb29fLT5yZXNlcnZlZF9yYW5nZSgxKS0+c3RhcnQpOworICBFWFBFQ1RfRVEoMTIsIGZvb18tPnJlc2VydmVkX3JhbmdlKDEpLT5lbmQpOworCisgIEVYUEVDVF9FUSgxNSwgZm9vXy0+cmVzZXJ2ZWRfcmFuZ2UoMiktPnN0YXJ0KTsKKyAgRVhQRUNUX0VRKDE2LCBmb29fLT5yZXNlcnZlZF9yYW5nZSgyKS0+ZW5kKTsKK30KKworVEVTVF9GKFJlc2VydmVkRGVzY3JpcHRvclRlc3QsIElzUmVzZXJ2ZWROdW1iZXIpIHsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMSkpOworICBFWFBFQ1RfVFJVRShmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDIpKTsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMykpOworICBFWFBFQ1RfRkFMU0UoZm9vXy0+SXNSZXNlcnZlZE51bWJlcig4KSk7CisgIEVYUEVDVF9UUlVFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoOSkpOworICBFWFBFQ1RfVFJVRShmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDEwKSk7CisgIEVYUEVDVF9UUlVFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTEpKTsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTIpKTsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTMpKTsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTQpKTsKKyAgRVhQRUNUX1RSVUUoZm9vXy0+SXNSZXNlcnZlZE51bWJlcigxNSkpOworICBFWFBFQ1RfRkFMU0UoZm9vXy0+SXNSZXNlcnZlZE51bWJlcigxNikpOworfQorCitURVNUX0YoUmVzZXJ2ZWREZXNjcmlwdG9yVGVzdCwgUmVzZXJ2ZWROYW1lcykgeworICBBU1NFUlRfRVEoMiwgZm9vXy0+cmVzZXJ2ZWRfbmFtZV9jb3VudCgpKTsKKworICBFWFBFQ1RfRVEoImZvbyIsIGZvb18tPnJlc2VydmVkX25hbWUoMCkpOworICBFWFBFQ1RfRVEoImJhciIsIGZvb18tPnJlc2VydmVkX25hbWUoMSkpOworfQorCitURVNUX0YoUmVzZXJ2ZWREZXNjcmlwdG9yVGVzdCwgSXNSZXNlcnZlZE5hbWUpIHsKKyAgRVhQRUNUX1RSVUUoZm9vXy0+SXNSZXNlcnZlZE5hbWUoImZvbyIpKTsKKyAgRVhQRUNUX1RSVUUoZm9vXy0+SXNSZXNlcnZlZE5hbWUoImJhciIpKTsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROYW1lKCJiYXoiKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVGVzdCByZXNlcnZlZCBlbnVtIGZpZWxkcy4KK2NsYXNzIFJlc2VydmVkRW51bURlc2NyaXB0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKyAgICAvLworICAgIC8vICAgZW51bSBGb28geworICAgIC8vICAgICBCQVIgPSAxOworICAgIC8vICAgICByZXNlcnZlZCAyLCA5IHRvIDExLCAxNTsKKyAgICAvLyAgICAgcmVzZXJ2ZWQgImZvbyIsICJiYXIiOworICAgIC8vICAgfQorCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fZmlsZTsKKyAgICBmb29fZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisKKyAgICBFbnVtRGVzY3JpcHRvclByb3RvKiBmb28gPSBBZGRFbnVtKCZmb29fZmlsZSwgIkZvbyIpOworICAgIEVudW1EZXNjcmlwdG9yUHJvdG8qIGVkZ2UxID0gQWRkRW51bSgmZm9vX2ZpbGUsICJFZGdlMSIpOworICAgIEVudW1EZXNjcmlwdG9yUHJvdG8qIGVkZ2UyID0gQWRkRW51bSgmZm9vX2ZpbGUsICJFZGdlMiIpOworCisgICAgQWRkRW51bVZhbHVlKGZvbywgIkJBUiIsIDQpOworICAgIEFkZFJlc2VydmVkUmFuZ2UoZm9vLCAtNSwgLTMpOworICAgIEFkZFJlc2VydmVkUmFuZ2UoZm9vLCAtMiwgMSk7CisgICAgQWRkUmVzZXJ2ZWRSYW5nZShmb28sIDIsIDMpOworICAgIEFkZFJlc2VydmVkUmFuZ2UoZm9vLCA5LCAxMik7CisgICAgQWRkUmVzZXJ2ZWRSYW5nZShmb28sIDE1LCAxNik7CisKKyAgICBmb28tPmFkZF9yZXNlcnZlZF9uYW1lKCJmb28iKTsKKyAgICBmb28tPmFkZF9yZXNlcnZlZF9uYW1lKCJiYXIiKTsKKworICAgIC8vIFNvbWUgYWRkaXRpb25hbCBlZGdlIGNhc2VzIHRoYXQgY292ZXIgbW9zdCBvciBhbGwgb2YgdGhlIHJhbmdlIG9mIGVudW0KKyAgICAvLyB2YWx1ZXMKKworICAgIC8vIE5vdGU6IFdlIHVzZSBJTlRfTUFYIGFzIHRoZSBtYXhpbXVtIHJlc2VydmVkIHJhbmdlIHVwcGVyIGJvdW5kLAorICAgIC8vIGluY2x1c2l2ZS4KKyAgICBBZGRFbnVtVmFsdWUoZWRnZTEsICJFREdFMSIsIDEpOworICAgIEFkZFJlc2VydmVkUmFuZ2UoZWRnZTEsIDEwLCBJTlRfTUFYKTsKKyAgICBBZGRFbnVtVmFsdWUoZWRnZTIsICJFREdFMiIsIDE1KTsKKyAgICBBZGRSZXNlcnZlZFJhbmdlKGVkZ2UyLCBJTlRfTUlOLCAxMCk7CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19maWxlKTsKKyAgICBBU1NFUlRfVFJVRShmb29fZmlsZV8gIT0gbnVsbHB0cik7CisKKyAgICBBU1NFUlRfRVEoMywgZm9vX2ZpbGVfLT5lbnVtX3R5cGVfY291bnQoKSk7CisgICAgZm9vXyA9IGZvb19maWxlXy0+ZW51bV90eXBlKDApOworICAgIGVkZ2UxXyA9IGZvb19maWxlXy0+ZW51bV90eXBlKDEpOworICAgIGVkZ2UyXyA9IGZvb19maWxlXy0+ZW51bV90eXBlKDIpOworICB9CisKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBmb29fOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogZWRnZTFfOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogZWRnZTJfOworfTsKKworVEVTVF9GKFJlc2VydmVkRW51bURlc2NyaXB0b3JUZXN0LCBSZXNlcnZlZFJhbmdlcykgeworICBBU1NFUlRfRVEoNSwgZm9vXy0+cmVzZXJ2ZWRfcmFuZ2VfY291bnQoKSk7CisKKyAgRVhQRUNUX0VRKC01LCBmb29fLT5yZXNlcnZlZF9yYW5nZSgwKS0+c3RhcnQpOworICBFWFBFQ1RfRVEoLTMsIGZvb18tPnJlc2VydmVkX3JhbmdlKDApLT5lbmQpOworCisgIEVYUEVDVF9FUSgtMiwgZm9vXy0+cmVzZXJ2ZWRfcmFuZ2UoMSktPnN0YXJ0KTsKKyAgRVhQRUNUX0VRKDEsIGZvb18tPnJlc2VydmVkX3JhbmdlKDEpLT5lbmQpOworCisgIEVYUEVDVF9FUSgyLCBmb29fLT5yZXNlcnZlZF9yYW5nZSgyKS0+c3RhcnQpOworICBFWFBFQ1RfRVEoMywgZm9vXy0+cmVzZXJ2ZWRfcmFuZ2UoMiktPmVuZCk7CisKKyAgRVhQRUNUX0VRKDksIGZvb18tPnJlc2VydmVkX3JhbmdlKDMpLT5zdGFydCk7CisgIEVYUEVDVF9FUSgxMiwgZm9vXy0+cmVzZXJ2ZWRfcmFuZ2UoMyktPmVuZCk7CisKKyAgRVhQRUNUX0VRKDE1LCBmb29fLT5yZXNlcnZlZF9yYW5nZSg0KS0+c3RhcnQpOworICBFWFBFQ1RfRVEoMTYsIGZvb18tPnJlc2VydmVkX3JhbmdlKDQpLT5lbmQpOworCisgIEFTU0VSVF9FUSgxLCBlZGdlMV8tPnJlc2VydmVkX3JhbmdlX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMTAsIGVkZ2UxXy0+cmVzZXJ2ZWRfcmFuZ2UoMCktPnN0YXJ0KTsKKyAgRVhQRUNUX0VRKElOVF9NQVgsIGVkZ2UxXy0+cmVzZXJ2ZWRfcmFuZ2UoMCktPmVuZCk7CisKKyAgQVNTRVJUX0VRKDEsIGVkZ2UyXy0+cmVzZXJ2ZWRfcmFuZ2VfY291bnQoKSk7CisgIEVYUEVDVF9FUShJTlRfTUlOLCBlZGdlMl8tPnJlc2VydmVkX3JhbmdlKDApLT5zdGFydCk7CisgIEVYUEVDVF9FUSgxMCwgZWRnZTJfLT5yZXNlcnZlZF9yYW5nZSgwKS0+ZW5kKTsKK30KKworVEVTVF9GKFJlc2VydmVkRW51bURlc2NyaXB0b3JUZXN0LCBJc1Jlc2VydmVkTnVtYmVyKSB7CisgIEVYUEVDVF9UUlVFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoLTUpKTsKKyAgRVhQRUNUX1RSVUUoZm9vXy0+SXNSZXNlcnZlZE51bWJlcigtNCkpOworICBFWFBFQ1RfVFJVRShmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKC0zKSk7CisgIEVYUEVDVF9UUlVFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoLTIpKTsKKyAgRVhQRUNUX1RSVUUoZm9vXy0+SXNSZXNlcnZlZE51bWJlcigtMSkpOworICBFWFBFQ1RfVFJVRShmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDApKTsKKyAgRVhQRUNUX1RSVUUoZm9vXy0+SXNSZXNlcnZlZE51bWJlcigxKSk7CisgIEVYUEVDVF9UUlVFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMikpOworICBFWFBFQ1RfVFJVRShmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDMpKTsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoOCkpOworICBFWFBFQ1RfVFJVRShmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDkpKTsKKyAgRVhQRUNUX1RSVUUoZm9vXy0+SXNSZXNlcnZlZE51bWJlcigxMCkpOworICBFWFBFQ1RfVFJVRShmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDExKSk7CisgIEVYUEVDVF9UUlVFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTIpKTsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTMpKTsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTMpKTsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTQpKTsKKyAgRVhQRUNUX1RSVUUoZm9vXy0+SXNSZXNlcnZlZE51bWJlcigxNSkpOworICBFWFBFQ1RfVFJVRShmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDE2KSk7CisgIEVYUEVDVF9GQUxTRShmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDE3KSk7CisKKyAgRVhQRUNUX0ZBTFNFKGVkZ2UxXy0+SXNSZXNlcnZlZE51bWJlcig5KSk7CisgIEVYUEVDVF9UUlVFKGVkZ2UxXy0+SXNSZXNlcnZlZE51bWJlcigxMCkpOworICBFWFBFQ1RfVFJVRShlZGdlMV8tPklzUmVzZXJ2ZWROdW1iZXIoSU5UX01BWCAtIDEpKTsKKyAgRVhQRUNUX1RSVUUoZWRnZTFfLT5Jc1Jlc2VydmVkTnVtYmVyKElOVF9NQVgpKTsKKworICBFWFBFQ1RfVFJVRShlZGdlMl8tPklzUmVzZXJ2ZWROdW1iZXIoSU5UX01JTikpOworICBFWFBFQ1RfVFJVRShlZGdlMl8tPklzUmVzZXJ2ZWROdW1iZXIoOSkpOworICBFWFBFQ1RfVFJVRShlZGdlMl8tPklzUmVzZXJ2ZWROdW1iZXIoMTApKTsKKyAgRVhQRUNUX0ZBTFNFKGVkZ2UyXy0+SXNSZXNlcnZlZE51bWJlcigxMSkpOworfQorCitURVNUX0YoUmVzZXJ2ZWRFbnVtRGVzY3JpcHRvclRlc3QsIFJlc2VydmVkTmFtZXMpIHsKKyAgQVNTRVJUX0VRKDIsIGZvb18tPnJlc2VydmVkX25hbWVfY291bnQoKSk7CisKKyAgRVhQRUNUX0VRKCJmb28iLCBmb29fLT5yZXNlcnZlZF9uYW1lKDApKTsKKyAgRVhQRUNUX0VRKCJiYXIiLCBmb29fLT5yZXNlcnZlZF9uYW1lKDEpKTsKK30KKworVEVTVF9GKFJlc2VydmVkRW51bURlc2NyaXB0b3JUZXN0LCBJc1Jlc2VydmVkTmFtZSkgeworICBFWFBFQ1RfVFJVRShmb29fLT5Jc1Jlc2VydmVkTmFtZSgiZm9vIikpOworICBFWFBFQ1RfVFJVRShmb29fLT5Jc1Jlc2VydmVkTmFtZSgiYmFyIikpOworICBFWFBFQ1RfRkFMU0UoZm9vXy0+SXNSZXNlcnZlZE5hbWUoImJheiIpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBNaXNjVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIEZ1bmN0aW9uIHdoaWNoIG1ha2VzIGEgZmllbGQgZGVzY3JpcHRvciBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBHZXRGaWVsZERlc2NyaXB0b3JPZlR5cGUoRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgICAgZmlsZV9wcm90by5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisgICAgQWRkRW1wdHlFbnVtKCZmaWxlX3Byb3RvLCAiRHVtbXlFbnVtIik7CisKKyAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UgPSBBZGRNZXNzYWdlKCZmaWxlX3Byb3RvLCAiVGVzdE1lc3NhZ2UiKTsKKyAgICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQgPSBBZGRGaWVsZCgKKyAgICAgICAgbWVzc2FnZSwgImZvbyIsIDEsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGU+KHN0YXRpY19jYXN0PGludD4odHlwZSkpKTsKKworICAgIGlmICh0eXBlID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFIHx8CisgICAgICAgIHR5cGUgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgICBmaWVsZC0+c2V0X3R5cGVfbmFtZSgiVGVzdE1lc3NhZ2UiKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU0pIHsKKyAgICAgIGZpZWxkLT5zZXRfdHlwZV9uYW1lKCJEdW1teUVudW0iKTsKKyAgICB9CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgcG9vbF8ucmVzZXQobmV3IERlc2NyaXB0b3JQb29sKCkpOworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbF8tPkJ1aWxkRmlsZShmaWxlX3Byb3RvKTsKKworICAgIGlmIChmaWxlICE9IG51bGxwdHIgJiYgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkgPT0gMSAmJgorICAgICAgICBmaWxlLT5tZXNzYWdlX3R5cGUoMCktPmZpZWxkX2NvdW50KCkgPT0gMSkgeworICAgICAgcmV0dXJuIGZpbGUtPm1lc3NhZ2VfdHlwZSgwKS0+ZmllbGQoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgfQorCisgIGNvbnN0IGNoYXIqIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IEdldEZpZWxkRGVzY3JpcHRvck9mVHlwZSh0eXBlKTsKKyAgICByZXR1cm4gZmllbGQgIT0gbnVsbHB0ciA/IGZpZWxkLT50eXBlX25hbWUoKSA6ICIiOworICB9CisKKyAgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gR2V0RmllbGREZXNjcmlwdG9yT2ZUeXBlKHR5cGUpOworICAgIHJldHVybiBmaWVsZCAhPSBudWxscHRyID8gZmllbGQtPmNwcF90eXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZT4oMCk7CisgIH0KKworICBjb25zdCBjaGFyKiBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBHZXRGaWVsZERlc2NyaXB0b3JPZlR5cGUodHlwZSk7CisgICAgcmV0dXJuIGZpZWxkICE9IG51bGxwdHIgPyBmaWVsZC0+Y3BwX3R5cGVfbmFtZSgpIDogIiI7CisgIH0KKworICBjb25zdCBEZXNjcmlwdG9yKiBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZSgKKyAgICAgIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IEdldEZpZWxkRGVzY3JpcHRvck9mVHlwZSh0eXBlKTsKKyAgICByZXR1cm4gZmllbGQgIT0gbnVsbHB0ciA/IGZpZWxkLT5tZXNzYWdlX3R5cGUoKSA6IG51bGxwdHI7CisgIH0KKworICBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoCisgICAgICBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBHZXRGaWVsZERlc2NyaXB0b3JPZlR5cGUodHlwZSk7CisgICAgcmV0dXJuIGZpZWxkICE9IG51bGxwdHIgPyBmaWVsZC0+ZW51bV90eXBlKCkgOiBudWxscHRyOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPERlc2NyaXB0b3JQb29sPiBwb29sXzsKK307CisKK1RFU1RfRihNaXNjVGVzdCwgVHlwZU5hbWVzKSB7CisgIC8vIFRlc3QgdGhhdCBjb3JyZWN0IHR5cGUgbmFtZXMgYXJlIHJldHVybmVkLgorCisgIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgdWdseSBsaW5lIHdyYXBwaW5nCisKKyAgRVhQRUNUX1NUUkVRKCJkb3VibGUiLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9ET1VCTEUpKTsKKyAgRVhQRUNUX1NUUkVRKCJmbG9hdCIsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0ZMT0FUKSk7CisgIEVYUEVDVF9TVFJFUSgiaW50NjQiLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9JTlQ2NCkpOworICBFWFBFQ1RfU1RSRVEoInVpbnQ2NCIsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX1VJTlQ2NCkpOworICBFWFBFQ1RfU1RSRVEoImludDMyIiwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UMzIpKTsKKyAgRVhQRUNUX1NUUkVRKCJmaXhlZDY0IiwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQ2NCkpOworICBFWFBFQ1RfU1RSRVEoImZpeGVkMzIiLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9GSVhFRDMyKSk7CisgIEVYUEVDVF9TVFJFUSgiYm9vbCIsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0JPT0wpKTsKKyAgRVhQRUNUX1NUUkVRKCJzdHJpbmciLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TVFJJTkcpKTsKKyAgRVhQRUNUX1NUUkVRKCJncm91cCIsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0dST1VQKSk7CisgIEVYUEVDVF9TVFJFUSgibWVzc2FnZSIsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX01FU1NBR0UpKTsKKyAgRVhQRUNUX1NUUkVRKCJieXRlcyIsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0JZVEVTKSk7CisgIEVYUEVDVF9TVFJFUSgidWludDMyIiwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDMyKSk7CisgIEVYUEVDVF9TVFJFUSgiZW51bSIsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0VOVU0pKTsKKyAgRVhQRUNUX1NUUkVRKCJzZml4ZWQzMiIsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NGSVhFRDMyKSk7CisgIEVYUEVDVF9TVFJFUSgic2ZpeGVkNjQiLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TRklYRUQ2NCkpOworICBFWFBFQ1RfU1RSRVEoInNpbnQzMiIsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NJTlQzMikpOworICBFWFBFQ1RfU1RSRVEoInNpbnQ2NCIsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NJTlQ2NCkpOworfQorCitURVNUX0YoTWlzY1Rlc3QsIFN0YXRpY1R5cGVOYW1lcykgeworICAvLyBUZXN0IHRoYXQgY29ycmVjdCB0eXBlIG5hbWVzIGFyZSByZXR1cm5lZC4KKworICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvciBGRDsgIC8vIGF2b2lkIHVnbHkgbGluZSB3cmFwcGluZworCisgIEVYUEVDVF9TVFJFUSgiZG91YmxlIiwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX0RPVUJMRSkpOworICBFWFBFQ1RfU1RSRVEoImZsb2F0IiwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX0ZMT0FUKSk7CisgIEVYUEVDVF9TVFJFUSgiaW50NjQiLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfSU5UNjQpKTsKKyAgRVhQRUNUX1NUUkVRKCJ1aW50NjQiLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfVUlOVDY0KSk7CisgIEVYUEVDVF9TVFJFUSgiaW50MzIiLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfSU5UMzIpKTsKKyAgRVhQRUNUX1NUUkVRKCJmaXhlZDY0IiwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX0ZJWEVENjQpKTsKKyAgRVhQRUNUX1NUUkVRKCJmaXhlZDMyIiwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX0ZJWEVEMzIpKTsKKyAgRVhQRUNUX1NUUkVRKCJib29sIiwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX0JPT0wpKTsKKyAgRVhQRUNUX1NUUkVRKCJzdHJpbmciLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfU1RSSU5HKSk7CisgIEVYUEVDVF9TVFJFUSgiZ3JvdXAiLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfR1JPVVApKTsKKyAgRVhQRUNUX1NUUkVRKCJtZXNzYWdlIiwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX01FU1NBR0UpKTsKKyAgRVhQRUNUX1NUUkVRKCJieXRlcyIsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9CWVRFUykpOworICBFWFBFQ1RfU1RSRVEoInVpbnQzMiIsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9VSU5UMzIpKTsKKyAgRVhQRUNUX1NUUkVRKCJlbnVtIiwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX0VOVU0pKTsKKyAgRVhQRUNUX1NUUkVRKCJzZml4ZWQzMiIsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9TRklYRUQzMikpOworICBFWFBFQ1RfU1RSRVEoInNmaXhlZDY0IiwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX1NGSVhFRDY0KSk7CisgIEVYUEVDVF9TVFJFUSgic2ludDMyIiwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX1NJTlQzMikpOworICBFWFBFQ1RfU1RSRVEoInNpbnQ2NCIsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9TSU5UNjQpKTsKK30KKworVEVTVF9GKE1pc2NUZXN0LCBDcHBUeXBlcykgeworICAvLyBUZXN0IHRoYXQgQ1BQIHR5cGVzIGFyZSBhc3NpZ25lZCBjb3JyZWN0bHkuCisKKyAgdHlwZWRlZiBGaWVsZERlc2NyaXB0b3IgRkQ7ICAvLyBhdm9pZCB1Z2x5IGxpbmUgd3JhcHBpbmcKKworICBFWFBFQ1RfRVEoRkQ6OkNQUFRZUEVfRE9VQkxFLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0RPVUJMRSkpOworICBFWFBFQ1RfRVEoRkQ6OkNQUFRZUEVfRkxPQVQsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRkxPQVQpKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0lOVDY0LCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0lOVDY0KSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9VSU5UNjQsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDY0KSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9JTlQzMiwgR2V0Q3BwVHlwZUZvckZpZWxkVHlwZShGRDo6VFlQRV9JTlQzMikpOworICBFWFBFQ1RfRVEoRkQ6OkNQUFRZUEVfVUlOVDY0LCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0ZJWEVENjQpKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX1VJTlQzMiwgR2V0Q3BwVHlwZUZvckZpZWxkVHlwZShGRDo6VFlQRV9GSVhFRDMyKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9CT09MLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0JPT0wpKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX1NUUklORywgR2V0Q3BwVHlwZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TVFJJTkcpKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX01FU1NBR0UsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfR1JPVVApKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX01FU1NBR0UsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfTUVTU0FHRSkpOworICBFWFBFQ1RfRVEoRkQ6OkNQUFRZUEVfU1RSSU5HLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0JZVEVTKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9VSU5UMzIsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDMyKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9FTlVNLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0VOVU0pKTsKKyAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0lOVDMyLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NGSVhFRDMyKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9JTlQ2NCwgR2V0Q3BwVHlwZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TRklYRUQ2NCkpOworICBFWFBFQ1RfRVEoRkQ6OkNQUFRZUEVfSU5UMzIsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDMyKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9JTlQ2NCwgR2V0Q3BwVHlwZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TSU5UNjQpKTsKK30KKworVEVTVF9GKE1pc2NUZXN0LCBDcHBUeXBlTmFtZXMpIHsKKyAgLy8gVGVzdCB0aGF0IGNvcnJlY3QgQ1BQIHR5cGUgbmFtZXMgYXJlIHJldHVybmVkLgorCisgIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgdWdseSBsaW5lIHdyYXBwaW5nCisKKyAgRVhQRUNUX1NUUkVRKCJkb3VibGUiLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9ET1VCTEUpKTsKKyAgRVhQRUNUX1NUUkVRKCJmbG9hdCIsIEdldENwcFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0ZMT0FUKSk7CisgIEVYUEVDVF9TVFJFUSgiaW50NjQiLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9JTlQ2NCkpOworICBFWFBFQ1RfU1RSRVEoInVpbnQ2NCIsIEdldENwcFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX1VJTlQ2NCkpOworICBFWFBFQ1RfU1RSRVEoImludDMyIiwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UMzIpKTsKKyAgRVhQRUNUX1NUUkVRKCJ1aW50NjQiLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9GSVhFRDY0KSk7CisgIEVYUEVDVF9TVFJFUSgidWludDMyIiwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQzMikpOworICBFWFBFQ1RfU1RSRVEoImJvb2wiLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9CT09MKSk7CisgIEVYUEVDVF9TVFJFUSgic3RyaW5nIiwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU1RSSU5HKSk7CisgIEVYUEVDVF9TVFJFUSgibWVzc2FnZSIsIEdldENwcFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0dST1VQKSk7CisgIEVYUEVDVF9TVFJFUSgibWVzc2FnZSIsIEdldENwcFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX01FU1NBR0UpKTsKKyAgRVhQRUNUX1NUUkVRKCJzdHJpbmciLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9CWVRFUykpOworICBFWFBFQ1RfU1RSRVEoInVpbnQzMiIsIEdldENwcFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX1VJTlQzMikpOworICBFWFBFQ1RfU1RSRVEoImVudW0iLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9FTlVNKSk7CisgIEVYUEVDVF9TVFJFUSgiaW50MzIiLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TRklYRUQzMikpOworICBFWFBFQ1RfU1RSRVEoImludDY0IiwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0ZJWEVENjQpKTsKKyAgRVhQRUNUX1NUUkVRKCJpbnQzMiIsIEdldENwcFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NJTlQzMikpOworICBFWFBFQ1RfU1RSRVEoImludDY0IiwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDY0KSk7Cit9CisKK1RFU1RfRihNaXNjVGVzdCwgU3RhdGljQ3BwVHlwZU5hbWVzKSB7CisgIC8vIFRlc3QgdGhhdCBjb3JyZWN0IENQUCB0eXBlIG5hbWVzIGFyZSByZXR1cm5lZC4KKworICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvciBGRDsgIC8vIGF2b2lkIHVnbHkgbGluZSB3cmFwcGluZworCisgIEVYUEVDVF9TVFJFUSgiaW50MzIiLCBGRDo6Q3BwVHlwZU5hbWUoRkQ6OkNQUFRZUEVfSU5UMzIpKTsKKyAgRVhQRUNUX1NUUkVRKCJpbnQ2NCIsIEZEOjpDcHBUeXBlTmFtZShGRDo6Q1BQVFlQRV9JTlQ2NCkpOworICBFWFBFQ1RfU1RSRVEoInVpbnQzMiIsIEZEOjpDcHBUeXBlTmFtZShGRDo6Q1BQVFlQRV9VSU5UMzIpKTsKKyAgRVhQRUNUX1NUUkVRKCJ1aW50NjQiLCBGRDo6Q3BwVHlwZU5hbWUoRkQ6OkNQUFRZUEVfVUlOVDY0KSk7CisgIEVYUEVDVF9TVFJFUSgiZG91YmxlIiwgRkQ6OkNwcFR5cGVOYW1lKEZEOjpDUFBUWVBFX0RPVUJMRSkpOworICBFWFBFQ1RfU1RSRVEoImZsb2F0IiwgRkQ6OkNwcFR5cGVOYW1lKEZEOjpDUFBUWVBFX0ZMT0FUKSk7CisgIEVYUEVDVF9TVFJFUSgiYm9vbCIsIEZEOjpDcHBUeXBlTmFtZShGRDo6Q1BQVFlQRV9CT09MKSk7CisgIEVYUEVDVF9TVFJFUSgiZW51bSIsIEZEOjpDcHBUeXBlTmFtZShGRDo6Q1BQVFlQRV9FTlVNKSk7CisgIEVYUEVDVF9TVFJFUSgic3RyaW5nIiwgRkQ6OkNwcFR5cGVOYW1lKEZEOjpDUFBUWVBFX1NUUklORykpOworICBFWFBFQ1RfU1RSRVEoIm1lc3NhZ2UiLCBGRDo6Q3BwVHlwZU5hbWUoRkQ6OkNQUFRZUEVfTUVTU0FHRSkpOworfQorCitURVNUX0YoTWlzY1Rlc3QsIE1lc3NhZ2VUeXBlKSB7CisgIC8vIFRlc3QgdGhhdCBtZXNzYWdlX3R5cGUoKSBpcyBudWxscHRyIGZvciBub24tYWdncmVnYXRlIGZpZWxkcworCisgIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgdWdseSBsaW5lIHdyYXBwaW5nCisKKyAgRVhQRUNUX1RSVUUobnVsbHB0ciA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9ET1VCTEUpKTsKKyAgRVhQRUNUX1RSVUUobnVsbHB0ciA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9GTE9BVCkpOworICBFWFBFQ1RfVFJVRShudWxscHRyID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0lOVDY0KSk7CisgIEVYUEVDVF9UUlVFKG51bGxwdHIgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDY0KSk7CisgIEVYUEVDVF9UUlVFKG51bGxwdHIgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UMzIpKTsKKyAgRVhQRUNUX1RSVUUobnVsbHB0ciA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9GSVhFRDY0KSk7CisgIEVYUEVDVF9UUlVFKG51bGxwdHIgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQzMikpOworICBFWFBFQ1RfVFJVRShudWxscHRyID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0JPT0wpKTsKKyAgRVhQRUNUX1RSVUUobnVsbHB0ciA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9TVFJJTkcpKTsKKyAgRVhQRUNUX1RSVUUobnVsbHB0ciAhPSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9HUk9VUCkpOworICBFWFBFQ1RfVFJVRShudWxscHRyICE9IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX01FU1NBR0UpKTsKKyAgRVhQRUNUX1RSVUUobnVsbHB0ciA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9CWVRFUykpOworICBFWFBFQ1RfVFJVRShudWxscHRyID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX1VJTlQzMikpOworICBFWFBFQ1RfVFJVRShudWxscHRyID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0VOVU0pKTsKKyAgRVhQRUNUX1RSVUUobnVsbHB0ciA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9TRklYRUQzMikpOworICBFWFBFQ1RfVFJVRShudWxscHRyID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NGSVhFRDY0KSk7CisgIEVYUEVDVF9UUlVFKG51bGxwdHIgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDMyKSk7CisgIEVYUEVDVF9UUlVFKG51bGxwdHIgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDY0KSk7Cit9CisKK1RFU1RfRihNaXNjVGVzdCwgRW51bVR5cGUpIHsKKyAgLy8gVGVzdCB0aGF0IGVudW1fdHlwZSgpIGlzIG51bGxwdHIgZm9yIG5vbi1lbnVtIGZpZWxkcworCisgIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgdWdseSBsaW5lIHdyYXBwaW5nCisKKyAgRVhQRUNUX1RSVUUobnVsbHB0ciA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9ET1VCTEUpKTsKKyAgRVhQRUNUX1RSVUUobnVsbHB0ciA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9GTE9BVCkpOworICBFWFBFQ1RfVFJVRShudWxscHRyID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0lOVDY0KSk7CisgIEVYUEVDVF9UUlVFKG51bGxwdHIgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDY0KSk7CisgIEVYUEVDVF9UUlVFKG51bGxwdHIgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UMzIpKTsKKyAgRVhQRUNUX1RSVUUobnVsbHB0ciA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9GSVhFRDY0KSk7CisgIEVYUEVDVF9UUlVFKG51bGxwdHIgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQzMikpOworICBFWFBFQ1RfVFJVRShudWxscHRyID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0JPT0wpKTsKKyAgRVhQRUNUX1RSVUUobnVsbHB0ciA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9TVFJJTkcpKTsKKyAgRVhQRUNUX1RSVUUobnVsbHB0ciA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9HUk9VUCkpOworICBFWFBFQ1RfVFJVRShudWxscHRyID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX01FU1NBR0UpKTsKKyAgRVhQRUNUX1RSVUUobnVsbHB0ciA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9CWVRFUykpOworICBFWFBFQ1RfVFJVRShudWxscHRyID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX1VJTlQzMikpOworICBFWFBFQ1RfVFJVRShudWxscHRyICE9IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0VOVU0pKTsKKyAgRVhQRUNUX1RSVUUobnVsbHB0ciA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9TRklYRUQzMikpOworICBFWFBFQ1RfVFJVRShudWxscHRyID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NGSVhFRDY0KSk7CisgIEVYUEVDVF9UUlVFKG51bGxwdHIgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDMyKSk7CisgIEVYUEVDVF9UUlVFKG51bGxwdHIgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDY0KSk7Cit9CisKK1RFU1RfRihNaXNjVGVzdCwgRGVmYXVsdFZhbHVlcykgeworICAvLyBUZXN0IHRoYXQgc2V0dGluZyBkZWZhdWx0IHZhbHVlcyB3b3Jrcy4KKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBmaWxlX3Byb3RvLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKworICBFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3R5cGVfcHJvdG8gPSBBZGRFbnVtKCZmaWxlX3Byb3RvLCAiRHVtbXlFbnVtIik7CisgIEFkZEVudW1WYWx1ZShlbnVtX3R5cGVfcHJvdG8sICJBIiwgMSk7CisgIEFkZEVudW1WYWx1ZShlbnVtX3R5cGVfcHJvdG8sICJCIiwgMik7CisKKyAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlX3Byb3RvID0gQWRkTWVzc2FnZSgmZmlsZV9wcm90bywgIlRlc3RNZXNzYWdlIik7CisKKyAgdHlwZWRlZiBGaWVsZERlc2NyaXB0b3JQcm90byBGRDsgIC8vIGF2b2lkIHVnbHkgbGluZSB3cmFwcGluZworICBjb25zdCBGRDo6TGFiZWwgbGFiZWwgPSBGRDo6TEFCRUxfT1BUSU9OQUw7CisKKyAgLy8gQ3JlYXRlIGZpZWxkcyBvZiBldmVyeSBDUFAgdHlwZSB3aXRoIGRlZmF1bHQgdmFsdWVzLgorICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW50MzIiLCAxLCBsYWJlbCwgRkQ6OlRZUEVfSU5UMzIpCisgICAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCItMSIpOworICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW50NjQiLCAyLCBsYWJlbCwgRkQ6OlRZUEVfSU5UNjQpCisgICAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCItMTAwMDAwMDAwMDAwMCIpOworICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAidWludDMyIiwgMywgbGFiZWwsIEZEOjpUWVBFX1VJTlQzMikKKyAgICAgIC0+c2V0X2RlZmF1bHRfdmFsdWUoIjQyIik7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJ1aW50NjQiLCA0LCBsYWJlbCwgRkQ6OlRZUEVfVUlOVDY0KQorICAgICAgLT5zZXRfZGVmYXVsdF92YWx1ZSgiMjAwMDAwMDAwMDAwMCIpOworICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiZmxvYXQiLCA1LCBsYWJlbCwgRkQ6OlRZUEVfRkxPQVQpCisgICAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCI0LjUiKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImRvdWJsZSIsIDYsIGxhYmVsLCBGRDo6VFlQRV9ET1VCTEUpCisgICAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCIxMGUxMDAiKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImJvb2wiLCA3LCBsYWJlbCwgRkQ6OlRZUEVfQk9PTCkKKyAgICAgIC0+c2V0X2RlZmF1bHRfdmFsdWUoInRydWUiKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgInN0cmluZyIsIDgsIGxhYmVsLCBGRDo6VFlQRV9TVFJJTkcpCisgICAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCJoZWxsbyIpOworICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiZGF0YSIsIDksIGxhYmVsLCBGRDo6VFlQRV9CWVRFUykKKyAgICAgIC0+c2V0X2RlZmF1bHRfdmFsdWUoIlxcMDAxXFwwMDJcXDAwMyIpOworCisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBlbnVtX2ZpZWxkID0KKyAgICAgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJlbnVtIiwgMTAsIGxhYmVsLCBGRDo6VFlQRV9FTlVNKTsKKyAgZW51bV9maWVsZC0+c2V0X3R5cGVfbmFtZSgiRHVtbXlFbnVtIik7CisgIGVudW1fZmllbGQtPnNldF9kZWZhdWx0X3ZhbHVlKCJCIik7CisKKyAgLy8gU3RyaW5ncyBhcmUgYWxsb3dlZCB0byBoYXZlIGVtcHR5IGRlZmF1bHRzLiAgKEF0IG9uZSBwb2ludCwgZHVlIHRvCisgIC8vIGEgYnVnLCBlbXB0eSBkZWZhdWx0cyBmb3Igc3RyaW5ncyB3ZXJlIHJlamVjdGVkLiAgT29wcy4pCisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJlbXB0eV9zdHJpbmciLCAxMSwgbGFiZWwsIEZEOjpUWVBFX1NUUklORykKKyAgICAgIC0+c2V0X2RlZmF1bHRfdmFsdWUoIiIpOworCisgIC8vIEFkZCBhIHNlY29uZCBzZXQgb2YgZmllbGRzIHdpdGggaW1wbGljaXQgZGVmYXVsdCB2YWx1ZXMuCisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbXBsaWNpdF9pbnQzMiIsIDIxLCBsYWJlbCwgRkQ6OlRZUEVfSU5UMzIpOworICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW1wbGljaXRfaW50NjQiLCAyMiwgbGFiZWwsIEZEOjpUWVBFX0lOVDY0KTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X3VpbnQzMiIsIDIzLCBsYWJlbCwgRkQ6OlRZUEVfVUlOVDMyKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X3VpbnQ2NCIsIDI0LCBsYWJlbCwgRkQ6OlRZUEVfVUlOVDY0KTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X2Zsb2F0IiwgMjUsIGxhYmVsLCBGRDo6VFlQRV9GTE9BVCk7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbXBsaWNpdF9kb3VibGUiLCAyNiwgbGFiZWwsIEZEOjpUWVBFX0RPVUJMRSk7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbXBsaWNpdF9ib29sIiwgMjcsIGxhYmVsLCBGRDo6VFlQRV9CT09MKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X3N0cmluZyIsIDI4LCBsYWJlbCwgRkQ6OlRZUEVfU1RSSU5HKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X2RhdGEiLCAyOSwgbGFiZWwsIEZEOjpUWVBFX0JZVEVTKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImltcGxpY2l0X2VudW0iLCAzMCwgbGFiZWwsIEZEOjpUWVBFX0VOVU0pCisgICAgICAtPnNldF90eXBlX25hbWUoIkR1bW15RW51bSIpOworCisgIC8vIEJ1aWxkIGl0LgorICBEZXNjcmlwdG9yUG9vbCBwb29sOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pOworICBBU1NFUlRfVFJVRShmaWxlICE9IG51bGxwdHIpOworCisgIEFTU0VSVF9FUSgxLCBmaWxlLT5lbnVtX3R5cGVfY291bnQoKSk7CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUgPSBmaWxlLT5lbnVtX3R5cGUoMCk7CisgIEFTU0VSVF9FUSgyLCBlbnVtX3R5cGUtPnZhbHVlX2NvdW50KCkpOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlX2EgPSBlbnVtX3R5cGUtPnZhbHVlKDApOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlX2IgPSBlbnVtX3R5cGUtPnZhbHVlKDEpOworCisgIEFTU0VSVF9FUSgxLCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UgPSBmaWxlLT5tZXNzYWdlX3R5cGUoMCk7CisKKyAgQVNTRVJUX0VRKDIxLCBtZXNzYWdlLT5maWVsZF9jb3VudCgpKTsKKworICAvLyBDaGVjayB0aGUgZGVmYXVsdCB2YWx1ZXMuCisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDApLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoMSktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfVFJVRShtZXNzYWdlLT5maWVsZCgyKS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDMpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoNCktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfVFJVRShtZXNzYWdlLT5maWVsZCg1KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDYpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoNyktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfVFJVRShtZXNzYWdlLT5maWVsZCg4KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDkpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoMTApLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKworICBFWFBFQ1RfRVEoLTEsIG1lc3NhZ2UtPmZpZWxkKDApLT5kZWZhdWx0X3ZhbHVlX2ludDMyKCkpOworICBFWFBFQ1RfRVEoaW50NjRfdHstMTAwMDAwMDAwMDAwMH0sIG1lc3NhZ2UtPmZpZWxkKDEpLT5kZWZhdWx0X3ZhbHVlX2ludDY0KCkpOworICBFWFBFQ1RfRVEoNDIsIG1lc3NhZ2UtPmZpZWxkKDIpLT5kZWZhdWx0X3ZhbHVlX3VpbnQzMigpKTsKKyAgRVhQRUNUX0VRKHVpbnQ2NF90ezIwMDAwMDAwMDAwMDB9LCBtZXNzYWdlLT5maWVsZCgzKS0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKSk7CisgIEVYUEVDVF9FUSg0LjUsIG1lc3NhZ2UtPmZpZWxkKDQpLT5kZWZhdWx0X3ZhbHVlX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoMTBlMTAwLCBtZXNzYWdlLT5maWVsZCg1KS0+ZGVmYXVsdF92YWx1ZV9kb3VibGUoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDYpLT5kZWZhdWx0X3ZhbHVlX2Jvb2woKSk7CisgIEVYUEVDVF9FUSgiaGVsbG8iLCBtZXNzYWdlLT5maWVsZCg3KS0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiXDAwMVwwMDJcMDAzIiwgbWVzc2FnZS0+ZmllbGQoOCktPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoZW51bV92YWx1ZV9iLCBtZXNzYWdlLT5maWVsZCg5KS0+ZGVmYXVsdF92YWx1ZV9lbnVtKCkpOworICBFWFBFQ1RfRVEoIiIsIG1lc3NhZ2UtPmZpZWxkKDEwKS0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSk7CisKKyAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2UtPmZpZWxkKDExKS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9GQUxTRShtZXNzYWdlLT5maWVsZCgxMiktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfRkFMU0UobWVzc2FnZS0+ZmllbGQoMTMpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2UtPmZpZWxkKDE0KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9GQUxTRShtZXNzYWdlLT5maWVsZCgxNSktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfRkFMU0UobWVzc2FnZS0+ZmllbGQoMTYpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2UtPmZpZWxkKDE3KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9GQUxTRShtZXNzYWdlLT5maWVsZCgxOCktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfRkFMU0UobWVzc2FnZS0+ZmllbGQoMTkpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2UtPmZpZWxkKDIwKS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UtPmZpZWxkKDExKS0+ZGVmYXVsdF92YWx1ZV9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UtPmZpZWxkKDEyKS0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UtPmZpZWxkKDEzKS0+ZGVmYXVsdF92YWx1ZV91aW50MzIoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLT5maWVsZCgxNCktPmRlZmF1bHRfdmFsdWVfdWludDY0KCkpOworICBFWFBFQ1RfRVEoMC4wZiwgbWVzc2FnZS0+ZmllbGQoMTUpLT5kZWZhdWx0X3ZhbHVlX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoMC4wLCBtZXNzYWdlLT5maWVsZCgxNiktPmRlZmF1bHRfdmFsdWVfZG91YmxlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS0+ZmllbGQoMTcpLT5kZWZhdWx0X3ZhbHVlX2Jvb2woKSk7CisgIEVYUEVDVF9FUSgiIiwgbWVzc2FnZS0+ZmllbGQoMTgpLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCIiLCBtZXNzYWdlLT5maWVsZCgxOSktPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoZW51bV92YWx1ZV9hLCBtZXNzYWdlLT5maWVsZCgyMCktPmRlZmF1bHRfdmFsdWVfZW51bSgpKTsKK30KKworVEVTVF9GKE1pc2NUZXN0LCBGaWVsZE9wdGlvbnMpIHsKKyAgLy8gVHJ5IHNldHRpbmcgZmllbGQgb3B0aW9ucy4KKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIGZpbGVfcHJvdG8uc2V0X25hbWUoImZvby5wcm90byIpOworCisgIERlc2NyaXB0b3JQcm90byogbWVzc2FnZV9wcm90byA9IEFkZE1lc3NhZ2UoJmZpbGVfcHJvdG8sICJUZXN0TWVzc2FnZSIpOworICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiZm9vIiwgMSwgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBiYXJfcHJvdG8gPQorICAgICAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImJhciIsIDIsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKworICBGaWVsZE9wdGlvbnMqIG9wdGlvbnMgPSBiYXJfcHJvdG8tPm11dGFibGVfb3B0aW9ucygpOworICBvcHRpb25zLT5zZXRfY3R5cGUoRmllbGRPcHRpb25zOjpDT1JEKTsKKworICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgIERlc2NyaXB0b3JQb29sIHBvb2w7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gbnVsbHB0cik7CisKKyAgQVNTRVJUX0VRKDEsIGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgwKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS0+ZmllbGRfY291bnQoKSk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZm9vID0gbWVzc2FnZS0+ZmllbGQoMCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYmFyID0gbWVzc2FnZS0+ZmllbGQoMSk7CisKKyAgLy8gImZvbyIgaGFkIG5vIG9wdGlvbnMgc2V0LCBzbyBpdCBzaG91bGQgcmV0dXJuIHRoZSBkZWZhdWx0IG9wdGlvbnMuCisgIEVYUEVDVF9FUSgmRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCksICZmb28tPm9wdGlvbnMoKSk7CisKKyAgLy8gImJhciIgaGFkIG9wdGlvbnMgc2V0LgorICBFWFBFQ1RfTkUoJkZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpLCBvcHRpb25zKTsKKyAgRVhQRUNUX1RSVUUoYmFyLT5vcHRpb25zKCkuaGFzX2N0eXBlKCkpOworICBFWFBFQ1RfRVEoRmllbGRPcHRpb25zOjpDT1JELCBiYXItPm9wdGlvbnMoKS5jdHlwZSgpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZW51bSBEZXNjcmlwdG9yUG9vbE1vZGUgeyBOT19EQVRBQkFTRSwgRkFMTEJBQ0tfREFUQUJBU0UgfTsKKworY2xhc3MgQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzVGVzdAorICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgc3RkOjp0dXBsZTxEZXNjcmlwdG9yUG9vbE1vZGUsIGNvbnN0IGNoYXIqPj4geworIHByb3RlY3RlZDoKKyAgRGVzY3JpcHRvclBvb2xNb2RlIG1vZGUoKSB7IHJldHVybiBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsgfQorICBjb25zdCBjaGFyKiBzeW50YXgoKSB7IHJldHVybiBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsgfQorCisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fcHJvdG8sIGJhcl9wcm90bzsKKworICAgIHN3aXRjaCAobW9kZSgpKSB7CisgICAgICBjYXNlIE5PX0RBVEFCQVNFOgorICAgICAgICBwb29sXy5yZXNldChuZXcgRGVzY3JpcHRvclBvb2wpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRkFMTEJBQ0tfREFUQUJBU0U6CisgICAgICAgIHBvb2xfLnJlc2V0KG5ldyBEZXNjcmlwdG9yUG9vbCgmZGJfKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHBvb2xfLT5BbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKTsKKworICAgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKKyAgICAgICAgIm5hbWU6ICdmb28ucHJvdG8nIgorICAgICAgICAiZGVwZW5kZW5jeTogJ2Jhci5wcm90byciCisgICAgICAgICJkZXBlbmRlbmN5OiAnYmF6LnByb3RvJyIKKyAgICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgICAiICBuYW1lOiAnRm9vJyIKKyAgICAgICAgIiAgZmllbGQgeyBuYW1lOidiYXInIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTonQmFyJyB9IgorICAgICAgICAiICBmaWVsZCB7IG5hbWU6J2JheicgbnVtYmVyOjIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOidCYXonIH0iCisgICAgICAgICIgIGZpZWxkIHsgbmFtZTonbW9vJyBudW1iZXI6MyBsYWJlbDpMQUJFTF9PUFRJT05BTCIKKyAgICAgICAgIiAgICB0eXBlX25hbWU6ICcuY29yZ2UuTW9vJyIKKyAgICAgICAgIiAgICB0eXBlOiBUWVBFX0VOVU0iCisgICAgICAgICIgICAgb3B0aW9ucyB7IgorICAgICAgICAiICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyIKKyAgICAgICAgIiAgICAgICAgbmFtZSB7IgorICAgICAgICAiICAgICAgICAgIG5hbWVfcGFydDogJ2dyYXVsdCciCisgICAgICAgICIgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIgorICAgICAgICAiICAgICAgICB9IgorICAgICAgICAiICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEyMzQiCisgICAgICAgICIgICAgICB9IgorICAgICAgICAiICAgIH0iCisgICAgICAgICIgIH0iCisgICAgICAgICJ9IiwKKyAgICAgICAgJmZvb19wcm90bykpOworICAgIGZvb19wcm90by5zZXRfc3ludGF4KHN5bnRheCgpKTsKKworICAgIEFTU0VSVF9UUlVFKAorICAgICAgICBUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoIm5hbWU6ICdiYXIucHJvdG8nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6ICdCYXInIH0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhcl9wcm90bykpOworICAgIGJhcl9wcm90by5zZXRfc3ludGF4KHN5bnRheCgpKTsKKworICAgIC8vIENvbGxlY3QgcG9pbnRlcnMgdG8gc3R1ZmYuCisgICAgYmFyX2ZpbGVfID0gQnVpbGRGaWxlKGJhcl9wcm90byk7CisgICAgQVNTRVJUX1RSVUUoYmFyX2ZpbGVfICE9IG51bGxwdHIpOworCisgICAgQVNTRVJUX0VRKDEsIGJhcl9maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGJhcl90eXBlXyA9IGJhcl9maWxlXy0+bWVzc2FnZV90eXBlKDApOworCisgICAgZm9vX2ZpbGVfID0gQnVpbGRGaWxlKGZvb19wcm90byk7CisgICAgQVNTRVJUX1RSVUUoZm9vX2ZpbGVfICE9IG51bGxwdHIpOworCisgICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGZvb190eXBlXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDApOworCisgICAgQVNTRVJUX0VRKDMsIGZvb190eXBlXy0+ZmllbGRfY291bnQoKSk7CisgICAgYmFyX2ZpZWxkXyA9IGZvb190eXBlXy0+ZmllbGQoMCk7CisgICAgYmF6X2ZpZWxkXyA9IGZvb190eXBlXy0+ZmllbGQoMSk7CisgICAgbW9vX2ZpZWxkXyA9IGZvb190eXBlXy0+ZmllbGQoMik7CisgIH0KKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogQnVpbGRGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgICAgc3dpdGNoIChtb2RlKCkpIHsKKyAgICAgIGNhc2UgTk9fREFUQUJBU0U6CisgICAgICAgIHJldHVybiBwb29sXy0+QnVpbGRGaWxlKHByb3RvKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZBTExCQUNLX0RBVEFCQVNFOiB7CisgICAgICAgIEVYUEVDVF9UUlVFKGRiXy5BZGQocHJvdG8pKTsKKyAgICAgICAgcmV0dXJuIHBvb2xfLT5GaW5kRmlsZUJ5TmFtZShwcm90by5uYW1lKCkpOworICAgICAgfQorICAgIH0KKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXJfZmlsZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIGJhcl90eXBlXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvb19maWxlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogZm9vX3R5cGVfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGJhcl9maWVsZF87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYmF6X2ZpZWxkXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtb29fZmllbGRfOworCisgIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSBkYl87ICAvLyB1c2VkIGlmIGluIEZBTExCQUNLX0RBVEFCQVNFIG1vZGUuCisgIHN0ZDo6dW5pcXVlX3B0cjxEZXNjcmlwdG9yUG9vbD4gcG9vbF87Cit9OworCitURVNUX1AoQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzVGVzdCwgUGxhY2Vob2xkZXJGaWxlKSB7CisgIEFTU0VSVF9FUSgyLCBmb29fZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKSk7CisgIEVYUEVDVF9FUShiYXJfZmlsZV8sIGZvb19maWxlXy0+ZGVwZW5kZW5jeSgwKSk7CisgIEVYUEVDVF9GQUxTRShiYXJfZmlsZV8tPmlzX3BsYWNlaG9sZGVyKCkpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXpfZmlsZSA9IGZvb19maWxlXy0+ZGVwZW5kZW5jeSgxKTsKKyAgRVhQRUNUX0VRKCJiYXoucHJvdG8iLCBiYXpfZmlsZS0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKDAsIGJhel9maWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIEVYUEVDVF9UUlVFKGJhel9maWxlLT5pc19wbGFjZWhvbGRlcigpKTsKKworICAvLyBQbGFjZWhvbGRlciBmaWxlcyBzaG91bGQgbm90IGJlIGZpbmRhYmxlLgorICBFWFBFQ1RfRVEoYmFyX2ZpbGVfLCBwb29sXy0+RmluZEZpbGVCeU5hbWUoYmFyX2ZpbGVfLT5uYW1lKCkpKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8tPkZpbmRGaWxlQnlOYW1lKGJhel9maWxlLT5uYW1lKCkpID09IG51bGxwdHIpOworCisgIC8vIENvcHkqVG8gc2hvdWxkIG5vdCBjcmFzaCBmb3IgcGxhY2Vob2xkZXIgZmlsZXMuCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gYmF6X2ZpbGVfcHJvdG87CisgIGJhel9maWxlLT5Db3B5VG8oJmJhel9maWxlX3Byb3RvKTsKKyAgYmF6X2ZpbGUtPkNvcHlTb3VyY2VDb2RlSW5mb1RvKCZiYXpfZmlsZV9wcm90byk7CisgIEVYUEVDVF9GQUxTRShiYXpfZmlsZV9wcm90by5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKK30KKworVEVTVF9QKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIFBsYWNlaG9sZGVyVHlwZXMpIHsKKyAgQVNTRVJUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBiYXJfZmllbGRfLT50eXBlKCkpOworICBFWFBFQ1RfRVEoYmFyX3R5cGVfLCBiYXJfZmllbGRfLT5tZXNzYWdlX3R5cGUoKSk7CisgIEVYUEVDVF9GQUxTRShiYXJfdHlwZV8tPmlzX3BsYWNlaG9sZGVyKCkpOworCisgIEFTU0VSVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSwgYmF6X2ZpZWxkXy0+dHlwZSgpKTsKKyAgY29uc3QgRGVzY3JpcHRvciogYmF6X3R5cGUgPSBiYXpfZmllbGRfLT5tZXNzYWdlX3R5cGUoKTsKKyAgRVhQRUNUX0VRKCJCYXoiLCBiYXpfdHlwZS0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJCYXoiLCBiYXpfdHlwZS0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoMCwgYmF6X3R5cGUtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpKTsKKyAgRVhQRUNUX1RSVUUoYmF6X3R5cGUtPmlzX3BsYWNlaG9sZGVyKCkpOworCisgIEFTU0VSVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSwgbW9vX2ZpZWxkXy0+dHlwZSgpKTsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIG1vb190eXBlID0gbW9vX2ZpZWxkXy0+ZW51bV90eXBlKCk7CisgIEVYUEVDVF9FUSgiTW9vIiwgbW9vX3R5cGUtPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuTW9vIiwgbW9vX3R5cGUtPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUobW9vX3R5cGUtPmlzX3BsYWNlaG9sZGVyKCkpOworICAvLyBQbGFjZWhvbGRlciBlbnVtIHZhbHVlcyBzaG91bGQgbm90IGJlIGZpbmRhYmxlLgorICBFWFBFQ1RfRVEobW9vX3R5cGUtPkZpbmRWYWx1ZUJ5TnVtYmVyKDApLCBudWxscHRyKTsKKworICAvLyBQbGFjZWhvbGRlciB0eXBlcyBzaG91bGQgbm90IGJlIGZpbmRhYmxlLgorICBFWFBFQ1RfRVEoYmFyX3R5cGVfLCBwb29sXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKGJhcl90eXBlXy0+ZnVsbF9uYW1lKCkpKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8tPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShiYXpfdHlwZS0+ZnVsbF9uYW1lKCkpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShwb29sXy0+RmluZEVudW1UeXBlQnlOYW1lKG1vb190eXBlLT5mdWxsX25hbWUoKSkgPT0gbnVsbHB0cik7Cit9CisKK1RFU1RfUChBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0LCBDb3B5VG8pIHsKKyAgLy8gRmllbGREZXNjcmlwdG9yOjpDb3B5VG8oKSBzaG91bGQgd3JpdGUgbm9uLWZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWVzCisgIC8vIGZvciBwbGFjZWhvbGRlciB0eXBlcyB3aGljaCB3ZXJlIG5vdCBvcmlnaW5hbGx5IGZ1bGx5LXF1YWxpZmllZC4KKyAgRmllbGREZXNjcmlwdG9yUHJvdG8gcHJvdG87CisKKyAgLy8gQmFyIGlzIG5vdCBhIHBsYWNlaG9sZGVyLCBzbyBpdCBpcyBmdWxseS1xdWFsaWZpZWQuCisgIGJhcl9maWVsZF8tPkNvcHlUbygmcHJvdG8pOworICBFWFBFQ1RfRVEoIi5CYXIiLCBwcm90by50eXBlX25hbWUoKSk7CisgIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9NRVNTQUdFLCBwcm90by50eXBlKCkpOworCisgIC8vIEJheiBpcyBhbiB1bnF1YWxpZmllZCBwbGFjZWhvbGRlci4KKyAgcHJvdG8uQ2xlYXIoKTsKKyAgYmF6X2ZpZWxkXy0+Q29weVRvKCZwcm90byk7CisgIEVYUEVDVF9FUSgiQmF6IiwgcHJvdG8udHlwZV9uYW1lKCkpOworICBFWFBFQ1RfRkFMU0UocHJvdG8uaGFzX3R5cGUoKSk7CisKKyAgLy8gTW9vIGlzIGEgZnVsbHktcXVhbGlmaWVkIHBsYWNlaG9sZGVyLgorICBwcm90by5DbGVhcigpOworICBtb29fZmllbGRfLT5Db3B5VG8oJnByb3RvKTsKKyAgRVhQRUNUX0VRKCIuY29yZ2UuTW9vIiwgcHJvdG8udHlwZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTSwgcHJvdG8udHlwZSgpKTsKK30KKworVEVTVF9QKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIEN1c3RvbU9wdGlvbnMpIHsKKyAgLy8gTW9vIHNob3VsZCBzdGlsbCBoYXZlIHRoZSB1bmludGVycHJldGVkIG9wdGlvbiBhdHRhY2hlZC4KKyAgQVNTRVJUX0VRKDEsIG1vb19maWVsZF8tPm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbl9zaXplKCkpOworICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24gPQorICAgICAgbW9vX2ZpZWxkXy0+b3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApOworICBBU1NFUlRfRVEoMSwgb3B0aW9uLm5hbWVfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJncmF1bHQiLCBvcHRpb24ubmFtZSgwKS5uYW1lX3BhcnQoKSk7Cit9CisKK1RFU1RfUChBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0LCBVbmtub3duRXh0ZW5kZWUpIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGNhbiBleHRlbmQgYW4gdW5rbm93biB0eXBlLiAgVGhpcyBpcyBzbGlnaHRseSB0cmlja3kgYmVjYXVzZQorICAvLyBpdCBtZWFucyB0aGF0IHRoZSBwbGFjZWhvbGRlciB0eXBlIG11c3QgaGF2ZSBhbiBleHRlbnNpb24gcmFuZ2UuCisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBleHRlbnNpb25fcHJvdG87CisKKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAorICAgICAgIm5hbWU6ICdleHRlbnNpb24ucHJvdG8nIgorICAgICAgImV4dGVuc2lvbiB7IGV4dGVuZGVlOiAnVW5rbm93blR5cGUnIG5hbWU6J3NvbWVfZXh0ZW5zaW9uJyBudW1iZXI6MTIzIgorICAgICAgIiAgICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IiwKKyAgICAgICZleHRlbnNpb25fcHJvdG8pKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBCdWlsZEZpbGUoZXh0ZW5zaW9uX3Byb3RvKTsKKworICBBU1NFUlRfVFJVRShmaWxlICE9IG51bGxwdHIpOworCisgIEFTU0VSVF9FUSgxLCBmaWxlLT5leHRlbnNpb25fY291bnQoKSk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlID0gZmlsZS0+ZXh0ZW5zaW9uKDApLT5jb250YWluaW5nX3R5cGUoKTsKKyAgRVhQRUNUX0VRKCJVbmtub3duVHlwZSIsIGV4dGVuZGVlLT5uYW1lKCkpOworICBFWFBFQ1RfVFJVRShleHRlbmRlZS0+aXNfcGxhY2Vob2xkZXIoKSk7CisgIEFTU0VSVF9FUSgxLCBleHRlbmRlZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwgZXh0ZW5kZWUtPmV4dGVuc2lvbl9yYW5nZSgwKS0+c3RhcnQpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyICsgMSwgZXh0ZW5kZWUtPmV4dGVuc2lvbl9yYW5nZSgwKS0+ZW5kKTsKK30KKworVEVTVF9QKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIEN1c3RvbU9wdGlvbikgeworICAvLyBUZXN0IHRoYXQgd2UgY2FuIHVzZSBhIGN1c3RvbSBvcHRpb24gd2l0aG91dCBoYXZpbmcgcGFyc2VkCisgIC8vIGRlc2NyaXB0b3IucHJvdG8uCisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBvcHRpb25fcHJvdG87CisKKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAorICAgICAgIm5hbWU6IFwidW5rbm93bl9jdXN0b21fb3B0aW9ucy5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICAgImV4dGVuc2lvbiB7ICIKKyAgICAgICIgIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiICIKKyAgICAgICIgIG5hbWU6IFwic29tZV9vcHRpb25cIiAiCisgICAgICAiICBudW1iZXI6IDEyMzQ1NiAiCisgICAgICAiICBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgdHlwZTogVFlQRV9JTlQzMiAiCisgICAgICAifSAiCisgICAgICAib3B0aW9ucyB7ICIKKyAgICAgICIgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICAgIiAgICBuYW1lIHsgIgorICAgICAgIiAgICAgIG5hbWVfcGFydDogXCJzb21lX29wdGlvblwiICIKKyAgICAgICIgICAgICBpc19leHRlbnNpb246IHRydWUgIgorICAgICAgIiAgICB9ICIKKyAgICAgICIgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxMjM0ICIKKyAgICAgICIgIH0gIgorICAgICAgIiAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgICAiICAgIG5hbWUgeyAiCisgICAgICAiICAgICAgbmFtZV9wYXJ0OiBcInVua25vd25fb3B0aW9uXCIgIgorICAgICAgIiAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgICAiICAgIH0gIgorICAgICAgIiAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEyMzQgIgorICAgICAgIiAgfSAiCisgICAgICAiICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAgICIgICAgbmFtZSB7ICIKKyAgICAgICIgICAgICBuYW1lX3BhcnQ6IFwib3B0aW1pemVfZm9yXCIgIgorICAgICAgIiAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgIgorICAgICAgIiAgICB9ICIKKyAgICAgICIgICAgaWRlbnRpZmllcl92YWx1ZTogXCJTUEVFRFwiICIKKyAgICAgICIgIH0gIgorICAgICAgIn0iLAorICAgICAgJm9wdGlvbl9wcm90bykpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gQnVpbGRGaWxlKG9wdGlvbl9wcm90byk7CisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gbnVsbHB0cik7CisKKyAgLy8gVmVyaWZ5IHRoYXQgbm8gZXh0ZW5zaW9uIG9wdGlvbnMgd2VyZSBzZXQsIGJ1dCB0aGV5IHdlcmUgbGVmdCBhcworICAvLyB1bmludGVycHJldGVkX29wdGlvbnMuCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgZmlsZS0+b3B0aW9ucygpLkdldFJlZmxlY3Rpb24oKS0+TGlzdEZpZWxkcyhmaWxlLT5vcHRpb25zKCksICZmaWVsZHMpOworICBBU1NFUlRfRVEoMiwgZmllbGRzLnNpemUoKSk7CisgIEVYUEVDVF9UUlVFKGZpbGUtPm9wdGlvbnMoKS5oYXNfb3B0aW1pemVfZm9yKCkpOworICBFWFBFQ1RfRVEoMiwgZmlsZS0+b3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSk7Cit9CisKK1RFU1RfUChBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0LAorICAgICAgIFVuZGVjbGFyZWREZXBlbmRlbmN5VHJpZ2dlcnNCdWlsZE9mRGVwZW5kZW5jeSkgeworICAvLyBDcmF6eSBjYXNlOiBzdXBwb3NlIGZvby5wcm90byByZWZlcnMgdG8gYSBzeW1ib2wgd2l0aG91dCBkZWNsYXJpbmcgdGhlCisgIC8vIGRlcGVuZGVuY3kgdGhhdCBmaW5kcyBpdC4gSW4gdGhlIGV2ZW50IHRoYXQgdGhlIHBvb2wgaXMgYmFja2VkIGJ5IGEKKyAgLy8gRGVzY3JpcHRvckRhdGFiYXNlLCB0aGUgcG9vbCB3aWxsIGF0dGVtcHQgdG8gZmluZCB0aGUgc3ltYm9sIGluIHRoZQorICAvLyBkYXRhYmFzZS4gSWYgc3VjY2Vzc2Z1bCwgaXQgd2lsbCBidWlsZCB0aGUgdW5kZWNsYXJlZCBkZXBlbmRlbmN5IHRvIHZlcmlmeQorICAvLyB0aGF0IHRoZSBmaWxlIGRvZXMgaW5kZWVkIGNvbnRhaW4gdGhlIHN5bWJvbC4gSWYgdGhhdCBmaWxlIGZhaWxzIHRvIGJ1aWxkLAorICAvLyB0aGVuIGl0cyBkZXNjcmlwdG9ycyBtdXN0IGJlIHJvbGxlZCBiYWNrLiBIb3dldmVyLCB3ZSBzdGlsbCB3YW50IGZvby5wcm90bworICAvLyB0byBidWlsZCBzdWNjZXNzZnVsbHksIHNpbmNlIHdlIGFyZSBhbGxvd2luZyB1bmtub3duIGRlcGVuZGVuY2llcy4KKworICBGaWxlRGVzY3JpcHRvclByb3RvIHVuZGVjbGFyZWRfZGVwX3Byb3RvOworICAvLyBXZSBtYWtlIHRoaXMgZmlsZSBmYWlsIHRvIGJ1aWxkIGJ5IGdpdmluZyBpdCB0d28gZmllbGRzIHdpdGggdGFnIDEuCisgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKKyAgICAgICJuYW1lOiBcImludmFsaWRfZmlsZV9hc191bmRlY2xhcmVkX2RlcC5wcm90b1wiICIKKyAgICAgICJwYWNrYWdlOiBcInVuZGVjbGFyZWRcIiAiCisgICAgICAibWVzc2FnZV90eXBlOiB7ICAiCisgICAgICAiICBuYW1lOiBcIk1vb29cIiAgIgorICAgICAgIiAgZmllbGQgeyAiCisgICAgICAiICAgIG5hbWU6J21vbycgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTogVFlQRV9JTlQzMiAiCisgICAgICAiICB9IgorICAgICAgIiAgZmllbGQgeyAiCisgICAgICAiICAgIG5hbWU6J21vb28nIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6IFRZUEVfSU5UNjQgIgorICAgICAgIiAgfSIKKyAgICAgICJ9IiwKKyAgICAgICZ1bmRlY2xhcmVkX2RlcF9wcm90bykpOworICAvLyBXZSBjYW4ndCB1c2UgdGhlIEJ1aWxkRmlsZSgpIGhlbHBlciBiZWNhdXNlIHdlIGRvbid0IGFjdHVhbGx5IHdhbnQgdG8gYnVpbGQKKyAgLy8gaXQgaW50byB0aGUgZGVzY3JpcHRvciBwb29sIGluIHRoZSBmYWxsYmFjayBkYXRhYmFzZSBjYXNlOiBpdCBqdXN0IG5lZWRzIHRvCisgIC8vIGJlIHNpdHRpbmcgaW4gdGhlIGRhdGFiYXNlIHNvIHRoYXQgaXQgZ2V0cyBidWlsdCBkdXJpbmcgdGhlIGJ1aWxkaW5nIG9mCisgIC8vIHRlc3QucHJvdG8gYmVsb3cuCisgIHN3aXRjaCAobW9kZSgpKSB7CisgICAgY2FzZSBOT19EQVRBQkFTRTogeworICAgICAgQVNTRVJUX1RSVUUocG9vbF8tPkJ1aWxkRmlsZSh1bmRlY2xhcmVkX2RlcF9wcm90bykgPT0gbnVsbHB0cik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGQUxMQkFDS19EQVRBQkFTRTogeworICAgICAgQVNTRVJUX1RSVUUoZGJfLkFkZCh1bmRlY2xhcmVkX2RlcF9wcm90bykpOworICAgIH0KKyAgfQorCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gdGVzdF9wcm90bzsKKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAorICAgICAgIm5hbWU6IFwidGVzdC5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGU6IHsgIgorICAgICAgIiAgbmFtZTogXCJDb3JnZVwiICIKKyAgICAgICIgIGZpZWxkIHsgIgorICAgICAgIiAgICBuYW1lOidtb29vJyBudW1iZXI6MSBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICB0eXBlX25hbWU6J3VuZGVjbGFyZWQuTW9vbycgdHlwZTogVFlQRV9NRVNTQUdFICIKKyAgICAgICIgIH0iCisgICAgICAifSIsCisgICAgICAmdGVzdF9wcm90bykpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gQnVpbGRGaWxlKHRlc3RfcHJvdG8pOworICBBU1NFUlRfVFJVRShmaWxlICE9IG51bGxwdHIpOworICBHT09HTEVfTE9HKElORk8pIDw8IGZpbGUtPkRlYnVnU3RyaW5nKCk7CisKKyAgRVhQRUNUX0VRKDAsIGZpbGUtPmRlcGVuZGVuY3lfY291bnQoKSk7CisgIEFTU0VSVF9FUSgxLCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGNvcmdlX2Rlc2MgPSBmaWxlLT5tZXNzYWdlX3R5cGUoMCk7CisgIEFTU0VSVF9FUSgiQ29yZ2UiLCBjb3JnZV9kZXNjLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgY29yZ2VfZGVzYy0+ZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9GQUxTRShjb3JnZV9kZXNjLT5pc19wbGFjZWhvbGRlcigpKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1vb29fZmllbGQgPSBjb3JnZV9kZXNjLT5maWVsZCgwKTsKKyAgQVNTRVJUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBtb29vX2ZpZWxkLT50eXBlKCkpOworICBBU1NFUlRfRVEoIk1vb28iLCBtb29vX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+bmFtZSgpKTsKKyAgQVNTRVJUX0VRKCJ1bmRlY2xhcmVkLk1vb28iLCBtb29vX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfVFJVRShtb29vX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+aXNfcGxhY2Vob2xkZXIoKSk7CisgIC8vIFRoZSBwbGFjZSBob2xkZXIgdHlwZSBzaG91bGQgbm90IGJlIGZpbmRhYmxlLgorICBBU1NFUlRfVFJVRShwb29sXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJ1bmRlY2xhcmVkLk1vb28iKSA9PSBudWxscHRyKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKERhdGFiYXNlU291cmNlLCBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OkNvbWJpbmUodGVzdGluZzo6VmFsdWVzKE5PX0RBVEFCQVNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTExCQUNLX0RBVEFCQVNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcygicHJvdG8yIiwgInByb3RvMyIpKSk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVEVTVChDdXN0b21PcHRpb25zLCBPcHRpb25Mb2NhdGlvbnMpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSA9CisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uczo6ZGVzY3JpcHRvcigpOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IG1lc3NhZ2UtPmZpbGUoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG1lc3NhZ2UtPkZpbmRGaWVsZEJ5TmFtZSgiZmllbGQxIik7CisgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2YgPSBtZXNzYWdlLT5GaW5kT25lb2ZCeU5hbWUoIkFuT25lb2YiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtYXBfZmllbGQgPSBtZXNzYWdlLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9maWVsZCIpOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW5tID0gbWVzc2FnZS0+RmluZEVudW1UeXBlQnlOYW1lKCJBbkVudW0iKTsKKyAgLy8gVE9ETyhiZW5qeSk6IFN1cHBvcnQgRW51bVZhbHVlIG9wdGlvbnMsIG9uY2UgdGhlIGNvbXBpbGVyIGRvZXMuCisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlID0KKyAgICAgIGZpbGUtPkZpbmRTZXJ2aWNlQnlOYW1lKCJUZXN0U2VydmljZVdpdGhDdXN0b21PcHRpb25zIik7CisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IHNlcnZpY2UtPkZpbmRNZXRob2RCeU5hbWUoIkZvbyIpOworCisgIEVYUEVDVF9FUShpbnQ2NF90ezk4NzY1NDMyMTB9LAorICAgICAgICAgICAgZmlsZS0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZmlsZV9vcHQxKSk7CisgIEVYUEVDVF9FUSgtNTYsCisgICAgICAgICAgICBtZXNzYWdlLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjptZXNzYWdlX29wdDEpKTsKKyAgRVhQRUNUX0VRKGludDY0X3R7ODc2NTQzMjEwOX0sCisgICAgICAgICAgICBmaWVsZC0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZmllbGRfb3B0MSkpOworICBFWFBFQ1RfRVEoNDIsICAvLyBDaGVjayB0aGF0IHdlIGdldCB0aGUgZGVmYXVsdCBmb3IgYW4gb3B0aW9uIHdlIGRvbid0IHNldC4KKyAgICAgICAgICAgIGZpZWxkLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmaWVsZF9vcHQyKSk7CisgIEVYUEVDVF9FUSgtOTksIG9uZW9mLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpvbmVvZl9vcHQxKSk7CisgIEVYUEVDVF9FUShpbnQ2NF90ezEyMzQ1fSwKKyAgICAgICAgICAgIG1hcF9maWVsZC0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZmllbGRfb3B0MSkpOworICBFWFBFQ1RfRVEoLTc4OSwgZW5tLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjplbnVtX29wdDEpKTsKKyAgRVhQRUNUX0VRKDEyMywgZW5tLT52YWx1ZSgxKS0+b3B0aW9ucygpLkdldEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjplbnVtX3ZhbHVlX29wdDEpKTsKKyAgRVhQRUNUX0VRKGludDY0X3R7LTk4NzY1NDMyMTB9LAorICAgICAgICAgICAgc2VydmljZS0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c2VydmljZV9vcHQxKSk7CisgIEVYUEVDVF9FUShwcm90b2J1Zl91bml0dGVzdDo6TUVUSE9ET1BUMV9WQUwyLAorICAgICAgICAgICAgbWV0aG9kLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjptZXRob2Rfb3B0MSkpOworCisgIC8vIFNlZSB0aGF0IHRoZSByZWd1bGFyIG9wdGlvbnMgd2VudCB0aHJvdWdoIHVuc2NhdGhlZC4KKyAgRVhQRUNUX1RSVUUobWVzc2FnZS0+b3B0aW9ucygpLmhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkT3B0aW9uczo6Q09SRCwgZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKTsKK30KKworVEVTVChDdXN0b21PcHRpb25zLCBPcHRpb25UeXBlcykgeworICBjb25zdCBNZXNzYWdlT3B0aW9ucyogb3B0aW9ucyA9IG51bGxwdHI7CisKKyAgY29uc3RleHByIGludDMyX3Qga2ludDMybWluID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKCk7CisgIGNvbnN0ZXhwciBpbnQzMl90IGtpbnQzMm1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpOworICBjb25zdGV4cHIgdWludDMyX3Qga3VpbnQzMm1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKTsKKyAgY29uc3RleHByIGludDY0X3Qga2ludDY0bWluID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKCk7CisgIGNvbnN0ZXhwciBpbnQ2NF90IGtpbnQ2NG1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpOworICBjb25zdGV4cHIgdWludDY0X3Qga3VpbnQ2NG1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKTsKKworICBvcHRpb25zID0KKyAgICAgICZwcm90b2J1Zl91bml0dGVzdDo6Q3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlczo6ZGVzY3JpcHRvcigpLT5vcHRpb25zKCk7CisgIEVYUEVDVF9FUShmYWxzZSwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpib29sX29wdCkpOworICBFWFBFQ1RfRVEoa2ludDMybWluLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmludDMyX29wdCkpOworICBFWFBFQ1RfRVEoa2ludDY0bWluLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmludDY0X29wdCkpOworICBFWFBFQ1RfRVEoMCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojp1aW50MzJfb3B0KSk7CisgIEVYUEVDVF9FUSgwLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnVpbnQ2NF9vcHQpKTsKKyAgRVhQRUNUX0VRKGtpbnQzMm1pbiwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpzaW50MzJfb3B0KSk7CisgIEVYUEVDVF9FUShraW50NjRtaW4sIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c2ludDY0X29wdCkpOworICBFWFBFQ1RfRVEoMCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmaXhlZDMyX29wdCkpOworICBFWFBFQ1RfRVEoMCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmaXhlZDY0X29wdCkpOworICBFWFBFQ1RfRVEoa2ludDMybWluLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnNmaXhlZDMyX29wdCkpOworICBFWFBFQ1RfRVEoa2ludDY0bWluLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnNmaXhlZDY0X29wdCkpOworCisgIG9wdGlvbnMgPQorICAgICAgJnByb3RvYnVmX3VuaXR0ZXN0OjpDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzOjpkZXNjcmlwdG9yKCktPm9wdGlvbnMoKTsKKyAgRVhQRUNUX0VRKHRydWUsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Ym9vbF9vcHQpKTsKKyAgRVhQRUNUX0VRKGtpbnQzMm1heCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjppbnQzMl9vcHQpKTsKKyAgRVhQRUNUX0VRKGtpbnQ2NG1heCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjppbnQ2NF9vcHQpKTsKKyAgRVhQRUNUX0VRKGt1aW50MzJtYXgsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6dWludDMyX29wdCkpOworICBFWFBFQ1RfRVEoa3VpbnQ2NG1heCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojp1aW50NjRfb3B0KSk7CisgIEVYUEVDVF9FUShraW50MzJtYXgsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c2ludDMyX29wdCkpOworICBFWFBFQ1RfRVEoa2ludDY0bWF4LCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnNpbnQ2NF9vcHQpKTsKKyAgRVhQRUNUX0VRKGt1aW50MzJtYXgsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Zml4ZWQzMl9vcHQpKTsKKyAgRVhQRUNUX0VRKGt1aW50NjRtYXgsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Zml4ZWQ2NF9vcHQpKTsKKyAgRVhQRUNUX0VRKGtpbnQzMm1heCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpzZml4ZWQzMl9vcHQpKTsKKyAgRVhQRUNUX0VRKGtpbnQ2NG1heCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpzZml4ZWQ2NF9vcHQpKTsKKworICBvcHRpb25zID0gJnByb3RvYnVmX3VuaXR0ZXN0OjpDdXN0b21PcHRpb25PdGhlclZhbHVlczo6ZGVzY3JpcHRvcigpLT5vcHRpb25zKCk7CisgIEVYUEVDVF9FUSgtMTAwLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmludDMyX29wdCkpOworICBFWFBFQ1RfRkxPQVRfRVEoMTIuMzQ1Njc4OSwKKyAgICAgICAgICAgICAgICAgIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZmxvYXRfb3B0KSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMS4yMzQ1Njc4OTAxMjM0NTY3ODksCisgICAgICAgICAgICAgICAgICAgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpkb3VibGVfb3B0KSk7CisgIEVYUEVDVF9FUSgiSGVsbG8sIFwiV29ybGRcIiIsCisgICAgICAgICAgICBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnN0cmluZ19vcHQpKTsKKworICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcoIkhlbGxvXDBXb3JsZCIsIDExKSwKKyAgICAgICAgICAgIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Ynl0ZXNfb3B0KSk7CisKKyAgRVhQRUNUX0VRKHByb3RvYnVmX3VuaXR0ZXN0OjpEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bTo6VEVTVF9PUFRJT05fRU5VTV9UWVBFMiwKKyAgICAgICAgICAgIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZW51bV9vcHQpKTsKKworICBvcHRpb25zID0KKyAgICAgICZwcm90b2J1Zl91bml0dGVzdDo6U2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50czo6ZGVzY3JpcHRvcigpLT5vcHRpb25zKCk7CisgIEVYUEVDVF9GTE9BVF9FUSgxMiwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmbG9hdF9vcHQpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgxNTQsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZG91YmxlX29wdCkpOworCisgIG9wdGlvbnMgPQorICAgICAgJnByb3RvYnVmX3VuaXR0ZXN0OjpTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzOjpkZXNjcmlwdG9yKCktPm9wdGlvbnMoKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC0xMiwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmbG9hdF9vcHQpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgtMTU0LCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmRvdWJsZV9vcHQpKTsKK30KKworVEVTVChDdXN0b21PcHRpb25zLCBDb21wbGV4RXh0ZW5zaW9uT3B0aW9ucykgeworICBjb25zdCBNZXNzYWdlT3B0aW9ucyogb3B0aW9ucyA9CisgICAgICAmcHJvdG9idWZfdW5pdHRlc3Q6OlZhcmlvdXNDb21wbGV4T3B0aW9uczo6ZGVzY3JpcHRvcigpLT5vcHRpb25zKCk7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MSkuZm9vKCksIDQyKTsKKyAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQxKQorICAgICAgICAgICAgICAgIC5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6Om1vb28pLAorICAgICAgICAgICAgMzI0KTsKKyAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQxKQorICAgICAgICAgICAgICAgIC5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvcmdlKQorICAgICAgICAgICAgICAgIC5tb28oKSwKKyAgICAgICAgICAgIDg3Nik7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikuYmF6KCksIDk4Nyk7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikKKyAgICAgICAgICAgICAgICAuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpncmF1bHQpLAorICAgICAgICAgICAgNjU0KTsKKyAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQyKS5iYXIoKS5mb28oKSwKKyAgICAgICAgICAgIDc0Myk7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikKKyAgICAgICAgICAgICAgICAuYmFyKCkKKyAgICAgICAgICAgICAgICAuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojptb29vKSwKKyAgICAgICAgICAgIDE5OTkpOworICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpCisgICAgICAgICAgICAgICAgLmJhcigpCisgICAgICAgICAgICAgICAgLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29yZ2UpCisgICAgICAgICAgICAgICAgLm1vbygpLAorICAgICAgICAgICAgMjAwOCk7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikKKyAgICAgICAgICAgICAgICAuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpnYXJwbHkpCisgICAgICAgICAgICAgICAgLmZvbygpLAorICAgICAgICAgICAgNzQxKTsKKyAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQyKQorICAgICAgICAgICAgICAgIC5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmdhcnBseSkKKyAgICAgICAgICAgICAgICAuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojptb29vKSwKKyAgICAgICAgICAgIDE5OTgpOworICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpCisgICAgICAgICAgICAgICAgLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Z2FycGx5KQorICAgICAgICAgICAgICAgIC5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvcmdlKQorICAgICAgICAgICAgICAgIC5tb28oKSwKKyAgICAgICAgICAgIDIxMjEpOworICBFWFBFQ1RfRVEob3B0aW9ucworICAgICAgICAgICAgICAgIC0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpDb21wbGV4T3B0aW9uVHlwZTI6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV4T3B0aW9uVHlwZTQ6OmNvbXBsZXhfb3B0NCkKKyAgICAgICAgICAgICAgICAud2FsZG8oKSwKKyAgICAgICAgICAgIDE5NzEpOworICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLmZyZWQoKS53YWxkbygpLAorICAgICAgICAgICAgMzIxKTsKKyAgRVhQRUNUX0VRKDksIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQzKS5tb28oKSk7CisgIEVYUEVDVF9FUSgyMiwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDMpCisgICAgICAgICAgICAgICAgICAgIC5jb21wbGV4b3B0aW9udHlwZTUoKQorICAgICAgICAgICAgICAgICAgICAucGx1Z2goKSk7CisgIEVYUEVDVF9FUSgyNCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4b3B0NikueHl6enkoKSk7Cit9CisKK1RFU1QoQ3VzdG9tT3B0aW9ucywgT3B0aW9uc0Zyb21PdGhlckZpbGUpIHsKKyAgLy8gVGVzdCB0aGF0IHRvIHVzZSBhIGN1c3RvbSBvcHRpb24sIHdlIG9ubHkgbmVlZCB0byBpbXBvcnQgdGhlIGZpbGUKKyAgLy8gZGVmaW5pbmcgdGhlIG9wdGlvbjsgd2UgZG8gbm90IGFsc28gaGF2ZSB0byBpbXBvcnQgZGVzY3JpcHRvci5wcm90by4KKyAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oJmZpbGVfcHJvdG8pOworICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBudWxscHRyKTsKKworICAvLyBXZSBoYXZlIHRvIGltcG9ydCB0aGUgQW55IGRlcGVuZGVuY3kuCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gYW55X3Byb3RvOworICBnb29nbGU6OnByb3RvYnVmOjpBbnk6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oJmFueV9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGFueV9wcm90bykgIT0gbnVsbHB0cik7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oCisgICAgICAmZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IG51bGxwdHIpOworCisgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKKyAgICAgICJuYW1lOiBcImN1c3RvbV9vcHRpb25zX2ltcG9ydC5wcm90b1wiICIKKyAgICAgICJwYWNrYWdlOiBcInByb3RvYnVmX3VuaXR0ZXN0XCIgIgorICAgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvXCIgIgorICAgICAgIm9wdGlvbnMgeyAiCisgICAgICAiICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAgICIgICAgbmFtZSB7ICIKKyAgICAgICIgICAgICBuYW1lX3BhcnQ6IFwiZmlsZV9vcHQxXCIgIgorICAgICAgIiAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgICAiICAgIH0gIgorICAgICAgIiAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEyMzQgIgorICAgICAgIiAgfSAiCisgICAgICAvLyBUZXN0IGEgbm9uLWV4dGVuc2lvbiBvcHRpb24gdG9vLiAgKEF0IG9uZSBwb2ludCB0aGlzIGZhaWxlZCBkdWUgdG8gYQorICAgICAgLy8gYnVnLikKKyAgICAgICIgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICAgIiAgICBuYW1lIHsgIgorICAgICAgIiAgICAgIG5hbWVfcGFydDogXCJqYXZhX3BhY2thZ2VcIiAiCisgICAgICAiICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgICAiICAgIH0gIgorICAgICAgIiAgICBzdHJpbmdfdmFsdWU6IFwiZm9vXCIgIgorICAgICAgIiAgfSAiCisgICAgICAvLyBUZXN0IHRoYXQgZW51bS10eXBlZCBvcHRpb25zIHN0aWxsIHdvcmsgdG9vLiAgKEF0IG9uZSBwb2ludCB0aGlzIGFsc28KKyAgICAgIC8vIGZhaWxlZCBkdWUgdG8gYSBidWcuKQorICAgICAgIiAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgICAiICAgIG5hbWUgeyAiCisgICAgICAiICAgICAgbmFtZV9wYXJ0OiBcIm9wdGltaXplX2ZvclwiICIKKyAgICAgICIgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKKyAgICAgICIgICAgfSAiCisgICAgICAiICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiU1BFRURcIiAiCisgICAgICAiICB9ICIKKyAgICAgICJ9IiwKKyAgICAgICZmaWxlX3Byb3RvKSk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUoZmlsZSAhPSBudWxscHRyKTsKKyAgRVhQRUNUX0VRKDEyMzQsIGZpbGUtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpbGVfb3B0MSkpOworICBFWFBFQ1RfVFJVRShmaWxlLT5vcHRpb25zKCkuaGFzX2phdmFfcGFja2FnZSgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBmaWxlLT5vcHRpb25zKCkuamF2YV9wYWNrYWdlKCkpOworICBFWFBFQ1RfVFJVRShmaWxlLT5vcHRpb25zKCkuaGFzX29wdGltaXplX2ZvcigpKTsKKyAgRVhQRUNUX0VRKEZpbGVPcHRpb25zOjpTUEVFRCwgZmlsZS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpKTsKK30KKworVEVTVChDdXN0b21PcHRpb25zLCBNZXNzYWdlT3B0aW9uVGhyZWVGaWVsZHNTZXQpIHsKKyAgLy8gVGhpcyB0ZXN0cyBhIGJ1ZyB3aGljaCBwcmV2aW91c2x5IGV4aXN0ZWQgaW4gY3VzdG9tIG9wdGlvbnMgcGFyc2luZy4gIFRoZQorICAvLyBidWcgb2NjdXJyZWQgd2hlbiB5b3UgZGVmaW5lZCBhIGN1c3RvbSBvcHRpb24gd2l0aCBtZXNzYWdlIHR5cGUgYW5kIHRoZW4KKyAgLy8gc2V0IHRocmVlIGZpZWxkcyBvZiB0aGF0IG9wdGlvbiBvbiBhIHNpbmdsZSBkZWZpbml0aW9uIChzZWUgdGhlIGV4YW1wbGUKKyAgLy8gYmVsb3cpLiAgVGhlIGJ1ZyBpcyBhIGJpdCBoYXJkIHRvIGV4cGxhaW4sIHNvIGNoZWNrIHRoZSBjaGFuZ2UgaGlzdG9yeSBpZgorICAvLyB5b3Ugd2FudCB0byBrbm93IG1vcmUuCisgIERlc2NyaXB0b3JQb29sIHBvb2w7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gbnVsbHB0cik7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBhbnlfcHJvdG87CisgIGdvb2dsZTo6cHJvdG9idWY6OkFueTo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmYW55X3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoYW55X3Byb3RvKSAhPSBudWxscHRyKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uczo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygKKyAgICAgICZmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gbnVsbHB0cik7CisKKyAgLy8gVGhlIGZvbGxvd2luZyByZXByZXNlbnRzIHRoZSBkZWZpbml0aW9uOgorICAvLworICAvLyAgIGltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIgorICAvLyAgIHBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisgIC8vICAgbWVzc2FnZSBGb28geworICAvLyAgICAgb3B0aW9uIChjb21wbGV4X29wdDEpLmZvbyAgPSAxMjM0OworICAvLyAgICAgb3B0aW9uIChjb21wbGV4X29wdDEpLmZvbzIgPSAxMjM0OworICAvLyAgICAgb3B0aW9uIChjb21wbGV4X29wdDEpLmZvbzMgPSAxMjM0OworICAvLyAgIH0KKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAorICAgICAgIm5hbWU6IFwiY3VzdG9tX29wdGlvbnNfaW1wb3J0LnByb3RvXCIgIgorICAgICAgInBhY2thZ2U6IFwicHJvdG9idWZfdW5pdHRlc3RcIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogXCJGb29cIiAiCisgICAgICAiICBvcHRpb25zIHsgIgorICAgICAgIiAgICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAgICIgICAgICBuYW1lIHsgIgorICAgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MVwiICIKKyAgICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgICAgbmFtZSB7ICIKKyAgICAgICIgICAgICAgIG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgICAiICAgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKKyAgICAgICIgICAgICB9ICIKKyAgICAgICIgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEyMzQgIgorICAgICAgIiAgICB9ICIKKyAgICAgICIgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgICAiICAgICAgbmFtZSB7ICIKKyAgICAgICIgICAgICAgIG5hbWVfcGFydDogXCJjb21wbGV4X29wdDFcIiAiCisgICAgICAiICAgICAgICBpc19leHRlbnNpb246IHRydWUgIgorICAgICAgIiAgICAgIH0gIgorICAgICAgIiAgICAgIG5hbWUgeyAiCisgICAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiZm9vMlwiICIKKyAgICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgIgorICAgICAgIiAgICAgIH0gIgorICAgICAgIiAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMTIzNCAiCisgICAgICAiICAgIH0gIgorICAgICAgIiAgICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAgICIgICAgICBuYW1lIHsgIgorICAgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MVwiICIKKyAgICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgICAgbmFtZSB7ICIKKyAgICAgICIgICAgICAgIG5hbWVfcGFydDogXCJmb28zXCIgIgorICAgICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxMjM0ICIKKyAgICAgICIgICAgfSAiCisgICAgICAiICB9ICIKKyAgICAgICJ9IiwKKyAgICAgICZmaWxlX3Byb3RvKSk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUoZmlsZSAhPSBudWxscHRyKTsKKyAgQVNTRVJUX0VRKDEsIGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKworICBjb25zdCBNZXNzYWdlT3B0aW9ucyYgb3B0aW9ucyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgwKS0+b3B0aW9ucygpOworICBFWFBFQ1RfRVEoMTIzNCwgb3B0aW9ucy5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MSkuZm9vKCkpOworfQorCitURVNUKEN1c3RvbU9wdGlvbnMsIE1lc3NhZ2VPcHRpb25SZXBlYXRlZExlYWZGaWVsZFNldCkgeworICAvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCByZXBlYXRlZCBmaWVsZHMgaW4gY3VzdG9tIG9wdGlvbnMgY2FuIGJlCisgIC8vIGdpdmVuIG11bHRpcGxlIHZhbHVlcyBieSByZXBlYXRpbmcgdGhlIG9wdGlvbiB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLgorICAvLyBUaGlzIHRlc3QgY2hlY2tzIHJlcGVhdGVkIGxlYWYgdmFsdWVzLiBFYWNoIHJlcGVhdGVkIGN1c3RvbSB2YWx1ZQorICAvLyBhcHBlYXJzIGluIGEgZGlmZmVyZW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uLCB3aGljaCB3aWxsIGJlIGNvbmNhdGVuYXRlZAorICAvLyB3aGVuIHRoZXkgYXJlIG1lcmdlZCBpbnRvIHRoZSBmaW5hbCBvcHRpb24gdmFsdWUuCisgIERlc2NyaXB0b3JQb29sIHBvb2w7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gbnVsbHB0cik7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBhbnlfcHJvdG87CisgIGdvb2dsZTo6cHJvdG9idWY6OkFueTo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmYW55X3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoYW55X3Byb3RvKSAhPSBudWxscHRyKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uczo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygKKyAgICAgICZmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gbnVsbHB0cik7CisKKyAgLy8gVGhlIGZvbGxvd2luZyByZXByZXNlbnRzIHRoZSBkZWZpbml0aW9uOgorICAvLworICAvLyAgIGltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIgorICAvLyAgIHBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisgIC8vICAgbWVzc2FnZSBGb28geworICAvLyAgICAgb3B0aW9uIChjb21wbGV4X29wdDEpLmZvbzQgPSAxMjsKKyAgLy8gICAgIG9wdGlvbiAoY29tcGxleF9vcHQxKS5mb280ID0gMzQ7CisgIC8vICAgICBvcHRpb24gKGNvbXBsZXhfb3B0MSkuZm9vNCA9IDU2OworICAvLyAgIH0KKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAorICAgICAgIm5hbWU6IFwiY3VzdG9tX29wdGlvbnNfaW1wb3J0LnByb3RvXCIgIgorICAgICAgInBhY2thZ2U6IFwicHJvdG9idWZfdW5pdHRlc3RcIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogXCJGb29cIiAiCisgICAgICAiICBvcHRpb25zIHsgIgorICAgICAgIiAgICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAgICIgICAgICBuYW1lIHsgIgorICAgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MVwiICIKKyAgICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgICAgbmFtZSB7ICIKKyAgICAgICIgICAgICAgIG5hbWVfcGFydDogXCJmb280XCIgIgorICAgICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxMiAiCisgICAgICAiICAgIH0gIgorICAgICAgIiAgICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAgICIgICAgICBuYW1lIHsgIgorICAgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MVwiICIKKyAgICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgICAgbmFtZSB7ICIKKyAgICAgICIgICAgICAgIG5hbWVfcGFydDogXCJmb280XCIgIgorICAgICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAzNCAiCisgICAgICAiICAgIH0gIgorICAgICAgIiAgICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAgICIgICAgICBuYW1lIHsgIgorICAgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MVwiICIKKyAgICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgICAgbmFtZSB7ICIKKyAgICAgICIgICAgICAgIG5hbWVfcGFydDogXCJmb280XCIgIgorICAgICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiA1NiAiCisgICAgICAiICAgIH0gIgorICAgICAgIiAgfSAiCisgICAgICAifSIsCisgICAgICAmZmlsZV9wcm90bykpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gbnVsbHB0cik7CisgIEFTU0VSVF9FUSgxLCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisKKyAgY29uc3QgTWVzc2FnZU9wdGlvbnMmIG9wdGlvbnMgPSBmaWxlLT5tZXNzYWdlX3R5cGUoMCktPm9wdGlvbnMoKTsKKyAgRVhQRUNUX0VRKDMsIG9wdGlvbnMuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDEpLmZvbzRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEyLCBvcHRpb25zLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQxKS5mb280KDApKTsKKyAgRVhQRUNUX0VRKDM0LCBvcHRpb25zLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQxKS5mb280KDEpKTsKKyAgRVhQRUNUX0VRKDU2LCBvcHRpb25zLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQxKS5mb280KDIpKTsKK30KKworVEVTVChDdXN0b21PcHRpb25zLCBNZXNzYWdlT3B0aW9uUmVwZWF0ZWRNc2dGaWVsZFNldCkgeworICAvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCByZXBlYXRlZCBmaWVsZHMgaW4gY3VzdG9tIG9wdGlvbnMgY2FuIGJlCisgIC8vIGdpdmVuIG11bHRpcGxlIHZhbHVlcyBieSByZXBlYXRpbmcgdGhlIG9wdGlvbiB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLgorICAvLyBUaGlzIHRlc3QgY2hlY2tzIHJlcGVhdGVkIG1lc3NhZ2UgdmFsdWVzLiBFYWNoIHJlcGVhdGVkIGN1c3RvbSB2YWx1ZQorICAvLyBhcHBlYXJzIGluIGEgZGlmZmVyZW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uLCB3aGljaCB3aWxsIGJlIGNvbmNhdGVuYXRlZAorICAvLyB3aGVuIHRoZXkgYXJlIG1lcmdlZCBpbnRvIHRoZSBmaW5hbCBvcHRpb24gdmFsdWUuCisgIERlc2NyaXB0b3JQb29sIHBvb2w7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gbnVsbHB0cik7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBhbnlfcHJvdG87CisgIGdvb2dsZTo6cHJvdG9idWY6OkFueTo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmYW55X3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoYW55X3Byb3RvKSAhPSBudWxscHRyKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uczo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygKKyAgICAgICZmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gbnVsbHB0cik7CisKKyAgLy8gVGhlIGZvbGxvd2luZyByZXByZXNlbnRzIHRoZSBkZWZpbml0aW9uOgorICAvLworICAvLyAgIGltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIgorICAvLyAgIHBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisgIC8vICAgbWVzc2FnZSBGb28geworICAvLyAgICAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJhcm5leSA9IHt3YWxkbzogMX07CisgIC8vICAgICBvcHRpb24gKGNvbXBsZXhfb3B0MikuYmFybmV5ID0ge3dhbGRvOiAxMH07CisgIC8vICAgICBvcHRpb24gKGNvbXBsZXhfb3B0MikuYmFybmV5ID0ge3dhbGRvOiAxMDB9OworICAvLyAgIH0KKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAorICAgICAgIm5hbWU6IFwiY3VzdG9tX29wdGlvbnNfaW1wb3J0LnByb3RvXCIgIgorICAgICAgInBhY2thZ2U6IFwicHJvdG9idWZfdW5pdHRlc3RcIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogXCJGb29cIiAiCisgICAgICAiICBvcHRpb25zIHsgIgorICAgICAgIiAgICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAgICIgICAgICBuYW1lIHsgIgorICAgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MlwiICIKKyAgICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgICAgbmFtZSB7ICIKKyAgICAgICIgICAgICAgIG5hbWVfcGFydDogXCJiYXJuZXlcIiAiCisgICAgICAiICAgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKKyAgICAgICIgICAgICB9ICIKKyAgICAgICIgICAgICBhZ2dyZWdhdGVfdmFsdWU6IFwid2FsZG86IDFcIiAiCisgICAgICAiICAgIH0gIgorICAgICAgIiAgICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAgICIgICAgICBuYW1lIHsgIgorICAgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MlwiICIKKyAgICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgICAgbmFtZSB7ICIKKyAgICAgICIgICAgICAgIG5hbWVfcGFydDogXCJiYXJuZXlcIiAiCisgICAgICAiICAgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKKyAgICAgICIgICAgICB9ICIKKyAgICAgICIgICAgICBhZ2dyZWdhdGVfdmFsdWU6IFwid2FsZG86IDEwXCIgIgorICAgICAgIiAgICB9ICIKKyAgICAgICIgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgICAiICAgICAgbmFtZSB7ICIKKyAgICAgICIgICAgICAgIG5hbWVfcGFydDogXCJjb21wbGV4X29wdDJcIiAiCisgICAgICAiICAgICAgICBpc19leHRlbnNpb246IHRydWUgIgorICAgICAgIiAgICAgIH0gIgorICAgICAgIiAgICAgIG5hbWUgeyAiCisgICAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiYmFybmV5XCIgIgorICAgICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgICAiICAgICAgfSAiCisgICAgICAiICAgICAgYWdncmVnYXRlX3ZhbHVlOiBcIndhbGRvOiAxMDBcIiAiCisgICAgICAiICAgIH0gIgorICAgICAgIiAgfSAiCisgICAgICAifSIsCisgICAgICAmZmlsZV9wcm90bykpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gbnVsbHB0cik7CisgIEFTU0VSVF9FUSgxLCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisKKyAgY29uc3QgTWVzc2FnZU9wdGlvbnMmIG9wdGlvbnMgPSBmaWxlLT5tZXNzYWdlX3R5cGUoMCktPm9wdGlvbnMoKTsKKyAgRVhQRUNUX0VRKDMsCisgICAgICAgICAgICBvcHRpb25zLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQyKS5iYXJuZXlfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMSwgb3B0aW9ucy5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikuYmFybmV5KDApLndhbGRvKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAxMCwKKyAgICAgIG9wdGlvbnMuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLmJhcm5leSgxKS53YWxkbygpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMTAwLAorICAgICAgb3B0aW9ucy5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikuYmFybmV5KDIpLndhbGRvKCkpOworfQorCisvLyBDaGVjayB0aGF0IGFnZ3JlZ2F0ZSBvcHRpb25zIHdlcmUgcGFyc2VkIGFuZCBzYXZlZCBjb3JyZWN0bHkgaW4KKy8vIHRoZSBhcHByb3ByaWF0ZSBkZXNjcmlwdG9ycy4KK1RFU1QoQ3VzdG9tT3B0aW9ucywgQWdncmVnYXRlT3B0aW9ucykgeworICBjb25zdCBEZXNjcmlwdG9yKiBtc2cgPSBwcm90b2J1Zl91bml0dGVzdDo6QWdncmVnYXRlTWVzc2FnZTo6ZGVzY3JpcHRvcigpOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IG1zZy0+ZmlsZSgpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gbXNnLT5GaW5kRmllbGRCeU5hbWUoImZpZWxkbmFtZSIpOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bWQgPSBmaWxlLT5GaW5kRW51bVR5cGVCeU5hbWUoIkFnZ3JlZ2F0ZUVudW0iKTsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bXYgPSBlbnVtZC0+RmluZFZhbHVlQnlOYW1lKCJWQUxVRSIpOworICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZSA9CisgICAgICBmaWxlLT5GaW5kU2VydmljZUJ5TmFtZSgiQWdncmVnYXRlU2VydmljZSIpOworICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBzZXJ2aWNlLT5GaW5kTWV0aG9kQnlOYW1lKCJNZXRob2QiKTsKKworICAvLyBUZXN0cyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhIGVtYmVkZGVkIGluIGZpbGVvcHQKKyAgY29uc3QgcHJvdG9idWZfdW5pdHRlc3Q6OkFnZ3JlZ2F0ZSYgZmlsZV9vcHRpb25zID0KKyAgICAgIGZpbGUtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpbGVvcHQpOworICBFWFBFQ1RfRVEoMTAwLCBmaWxlX29wdGlvbnMuaSgpKTsKKyAgRVhQRUNUX0VRKCJGaWxlQW5ub3RhdGlvbiIsIGZpbGVfb3B0aW9ucy5zKCkpOworICBFWFBFQ1RfRVEoIk5lc3RlZEZpbGVBbm5vdGF0aW9uIiwgZmlsZV9vcHRpb25zLnN1YigpLnMoKSk7CisgIEVYUEVDVF9FUSgiRmlsZUV4dGVuc2lvbkFubm90YXRpb24iLAorICAgICAgICAgICAgZmlsZV9vcHRpb25zLmZpbGUoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpbGVvcHQpLnMoKSk7CisgIEVYUEVDVF9FUSgiRW1iZWRkZWRNZXNzYWdlU2V0RWxlbWVudCIsCisgICAgICAgICAgICBmaWxlX29wdGlvbnMubXNldCgpCisgICAgICAgICAgICAgICAgLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6QWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQgOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3NldF9leHRlbnNpb24pCisgICAgICAgICAgICAgICAgLnMoKSk7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OkFnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50IGFueV9wYXlsb2FkOworICBBU1NFUlRfVFJVRShmaWxlX29wdGlvbnMuYW55KCkuVW5wYWNrVG8oJmFueV9wYXlsb2FkKSk7CisgIEVYUEVDVF9FUSgiRW1iZWRkZWRNZXNzYWdlU2V0RWxlbWVudCIsIGFueV9wYXlsb2FkLnMoKSk7CisKKyAgLy8gU2ltcGxlIHRlc3RzIGZvciBhbGwgdGhlIG90aGVyIHR5cGVzIG9mIGFubm90YXRpb25zCisgIEVYUEVDVF9FUSgiTWVzc2FnZUFubm90YXRpb24iLAorICAgICAgICAgICAgbXNnLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojptc2dvcHQpLnMoKSk7CisgIEVYUEVDVF9FUSgiRmllbGRBbm5vdGF0aW9uIiwKKyAgICAgICAgICAgIGZpZWxkLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmaWVsZG9wdCkucygpKTsKKyAgRVhQRUNUX0VRKCJFbnVtQW5ub3RhdGlvbiIsCisgICAgICAgICAgICBlbnVtZC0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZW51bW9wdCkucygpKTsKKyAgRVhQRUNUX0VRKCJFbnVtVmFsdWVBbm5vdGF0aW9uIiwKKyAgICAgICAgICAgIGVudW12LT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjplbnVtdmFsb3B0KS5zKCkpOworICBFWFBFQ1RfRVEoIlNlcnZpY2VBbm5vdGF0aW9uIiwKKyAgICAgICAgICAgIHNlcnZpY2UtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnNlcnZpY2VvcHQpLnMoKSk7CisgIEVYUEVDVF9FUSgiTWV0aG9kQW5ub3RhdGlvbiIsCisgICAgICAgICAgICBtZXRob2QtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6Om1ldGhvZG9wdCkucygpKTsKK30KKworVEVTVChDdXN0b21PcHRpb25zLCBVbnVzZWRJbXBvcnRFcnJvcikgeworICBEZXNjcmlwdG9yUG9vbCBwb29sOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IG51bGxwdHIpOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gYW55X3Byb3RvOworICBnb29nbGU6OnByb3RvYnVmOjpBbnk6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oJmFueV9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGFueV9wcm90bykgIT0gbnVsbHB0cik7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oCisgICAgICAmZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IG51bGxwdHIpOworCisgIHBvb2wuQWRkVW51c2VkSW1wb3J0VHJhY2tGaWxlKCJjdXN0b21fb3B0aW9uc19pbXBvcnQucHJvdG8iLCB0cnVlKTsKKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAorICAgICAgIm5hbWU6IFwiY3VzdG9tX29wdGlvbnNfaW1wb3J0LnByb3RvXCIgIgorICAgICAgInBhY2thZ2U6IFwicHJvdG9idWZfdW5pdHRlc3RcIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG9cIiAiLAorICAgICAgJmZpbGVfcHJvdG8pKTsKKworICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICBFWFBFQ1RfRkFMU0UocG9vbC5CdWlsZEZpbGVDb2xsZWN0aW5nRXJyb3JzKGZpbGVfcHJvdG8sICZlcnJvcl9jb2xsZWN0b3IpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgImN1c3RvbV9vcHRpb25zX2ltcG9ydC5wcm90bzogIgorICAgICAgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90bzogSU1QT1JUOiBJbXBvcnQgIgorICAgICAgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byBpcyB1bnVzZWQuXG4iLAorICAgICAgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCBwcm90byBmaWxlcyBjYW4gY29ycmVjdGx5IGJlIHBhcnNlZCwgZXZlbiBpZiB0aGUKKy8vIGN1c3RvbSBvcHRpb25zIGRlZmluZWQgaW4gdGhlIGZpbGUgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRob3NlCisvLyBjb21waWxlZCBpbiB0aGUgYmluYXJ5LiBTZWUgaHR0cDovL2IvMTkyNzYyNTAuCitURVNUKEN1c3RvbU9wdGlvbnMsIE9wdGlvbnNXaXRoSW5jb21wYXRpYmxlRGVzY3JpcHRvcnMpIHsKKyAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIE1lc3NhZ2VPcHRpb25zOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gbnVsbHB0cik7CisKKyAgLy8gQ3JlYXRlIGEgbmV3IGZpbGUgZGVzY3JpcHRvciBwcm90byBjb250YWluaW5nIGEgc3Vic2V0IG9mIHRoZQorICAvLyBtZXNzYWdlcyBkZWZpbmVkIGluIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90by4KKyAgZmlsZV9wcm90by5DbGVhcigpOworICBmaWxlX3Byb3RvLnNldF9uYW1lKCJ1bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byIpOworICBmaWxlX3Byb3RvLnNldF9wYWNrYWdlKCJwcm90b2J1Zl91bml0dGVzdCIpOworICBmaWxlX3Byb3RvLmFkZF9kZXBlbmRlbmN5KCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIpOworCisgIC8vIEFkZCB0aGUgInJlcXVpcmVkX2VudW1fb3B0IiBleHRlbnNpb24uCisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBleHRlbnNpb24gPSBmaWxlX3Byb3RvLmFkZF9leHRlbnNpb24oKTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6Ok9sZE9wdGlvblR5cGU6OmRlc2NyaXB0b3IoKQorICAgICAgLT5maWxlKCkKKyAgICAgIC0+RmluZEV4dGVuc2lvbkJ5TmFtZSgicmVxdWlyZWRfZW51bV9vcHQiKQorICAgICAgLT5Db3B5VG8oZXh0ZW5zaW9uKTsKKworICAvLyBBZGQgYSB0ZXN0IG1lc3NhZ2UgdGhhdCB1c2VzIHRoZSAicmVxdWlyZWRfZW51bV9vcHQiIG9wdGlvbi4KKyAgRGVzY3JpcHRvclByb3RvKiB0ZXN0X21lc3NhZ2VfdHlwZSA9IGZpbGVfcHJvdG8uYWRkX21lc3NhZ2VfdHlwZSgpOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VXaXRoUmVxdWlyZWRFbnVtT3B0aW9uOjpkZXNjcmlwdG9yKCktPkNvcHlUbygKKyAgICAgIHRlc3RfbWVzc2FnZV90eXBlKTsKKworICAvLyBJbnN0cnVjdCB0aGUgZXh0ZW5zaW9uIHRvIHVzZSBOZXdPcHRpb25UeXBlIGluc3RlYWQgb2YKKyAgLy8gT2xkT3B0aW9uVHlwZSwgYW5kIGFkZCB0aGUgZGVzY3JpcHRvciBvZiBOZXdPcHRpb25UeXBlLgorICBleHRlbnNpb24tPnNldF90eXBlX25hbWUoIi5wcm90b2J1Zl91bml0dGVzdC5OZXdPcHRpb25UeXBlIik7CisgIERlc2NyaXB0b3JQcm90byogbmV3X29wdGlvbl90eXBlID0gZmlsZV9wcm90by5hZGRfbWVzc2FnZV90eXBlKCk7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpOZXdPcHRpb25UeXBlOjpkZXNjcmlwdG9yKCktPkNvcHlUbyhuZXdfb3B0aW9uX3R5cGUpOworCisgIC8vIFJlcGxhY2UgdGhlIHZhbHVlIG9mIHRoZSAicmVxdWlyZWRfZW51bV9vcHQiIG9wdGlvbiB1c2VkIGluIHRoZQorICAvLyB0ZXN0IG1lc3NhZ2Ugd2l0aCBhbiBlbnVtIHZhbHVlIHRoYXQgb25seSBleGlzdHMgaW4gTmV3T3B0aW9uVHlwZS4KKyAgQVNTRVJUX1RSVUUoCisgICAgICBUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoInVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIG5hbWUgeyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBuYW1lX3BhcnQ6ICdyZXF1aXJlZF9lbnVtX29wdCcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgaXNfZXh0ZW5zaW9uOiB0cnVlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBhZ2dyZWdhdGVfdmFsdWU6ICd2YWx1ZTogTkVXX1ZBTFVFJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9tZXNzYWdlX3R5cGUtPm11dGFibGVfb3B0aW9ucygpKSk7CisKKyAgLy8gQWRkaW5nIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIHBvb2wgc2hvdWxkIGZhaWwuCisgIEVYUEVDVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pID09IG51bGxwdHIpOworfQorCisvLyBUZXN0IHRoYXQgRmlsZURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgZm9ybWF0cyBjdXN0b20gb3B0aW9ucyBjb3JyZWN0bHkuCitURVNUKEN1c3RvbU9wdGlvbnMsIERlYnVnU3RyaW5nKSB7CisgIERlc2NyaXB0b3JQb29sIHBvb2w7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBNZXNzYWdlT3B0aW9uczo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IG51bGxwdHIpOworCisgIC8vIEFkZCAiZm9vLnByb3RvIjoKKyAgLy8gICBpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKKyAgLy8gICBwYWNrYWdlICJwcm90b2J1Zl91bml0dGVzdCI7CisgIC8vICAgb3B0aW9uIChwcm90b2J1Zl91bml0dGVzdC5jY19vcHRpb24xKSA9IDE7CisgIC8vICAgb3B0aW9uIChwcm90b2J1Zl91bml0dGVzdC5jY19vcHRpb24yKSA9IDI7CisgIC8vICAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgeworICAvLyAgICAgb3B0aW9uYWwgaW50MzIgY2Nfb3B0aW9uMSA9IDc3MzY5NzQ7CisgIC8vICAgICBvcHRpb25hbCBpbnQzMiBjY19vcHRpb24yID0gNzczNjk3NTsKKyAgLy8gICB9CisgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJwYWNrYWdlOiBcInByb3RvYnVmX3VuaXR0ZXN0XCIgIgorICAgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgICAib3B0aW9ucyB7ICIKKyAgICAgICIgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICAgIiAgICBuYW1lIHsgIgorICAgICAgIiAgICAgIG5hbWVfcGFydDogXCJwcm90b2J1Zl91bml0dGVzdC5jY19vcHRpb24xXCIgIgorICAgICAgIiAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgICAiICAgIH0gIgorICAgICAgIiAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEgIgorICAgICAgIiAgfSAiCisgICAgICAiICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAgICIgICAgbmFtZSB7ICIKKyAgICAgICIgICAgICBuYW1lX3BhcnQ6IFwicHJvdG9idWZfdW5pdHRlc3QuY2Nfb3B0aW9uMlwiICIKKyAgICAgICIgICAgICBpc19leHRlbnNpb246IHRydWUgIgorICAgICAgIiAgICB9ICIKKyAgICAgICIgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAyICIKKyAgICAgICIgIH0gIgorICAgICAgIn0gIgorICAgICAgImV4dGVuc2lvbiB7ICIKKyAgICAgICIgIG5hbWU6IFwiY2Nfb3B0aW9uMVwiICIKKyAgICAgICIgIGV4dGVuZGVlOiBcIi5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiAiCisgICAgICAvLyBUaGlzIGZpZWxkIG51bWJlciBpcyBpbnRlbnRpb25hbGx5IGNob3NlbiB0byBiZSB0aGUgc2FtZSBhcworICAgICAgLy8gKC5maWxlb3B0MSkgZGVmaW5lZCBpbiB1bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byAobGlua2VkCisgICAgICAvLyBpbiB0aGlzIHRlc3QgYmluYXJ5KS4gVGhpcyBpcyB0byB0ZXN0IHdoZXRoZXIgd2UgYXJlIG1lc3NpbmcKKyAgICAgIC8vIGdlbmVyYXRlZCBwb29sIHdpdGggY3VzdG9tIGRlc2NyaXB0b3IgcG9vbHMgd2hlbiBkZWFsaW5nIHdpdGgKKyAgICAgIC8vIGN1c3RvbSBvcHRpb25zLgorICAgICAgIiAgbnVtYmVyOiA3NzM2OTc0ICIKKyAgICAgICIgIGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgICAiICB0eXBlOiBUWVBFX0lOVDMyICIKKyAgICAgICJ9IgorICAgICAgImV4dGVuc2lvbiB7ICIKKyAgICAgICIgIG5hbWU6IFwiY2Nfb3B0aW9uMlwiICIKKyAgICAgICIgIGV4dGVuZGVlOiBcIi5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiAiCisgICAgICAiICBudW1iZXI6IDc3MzY5NzUgIgorICAgICAgIiAgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAgICIgIHR5cGU6IFRZUEVfSU5UMzIgIgorICAgICAgIn0iLAorICAgICAgJmZpbGVfcHJvdG8pKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUoZGVzY3JpcHRvciAhPSBudWxscHRyKTsKKworICBFWFBFQ1RfRVEoMiwgZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX2NvdW50KCkpOworCisgIEFTU0VSVF9FUSgKKyAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgIlxuIgorICAgICAgImltcG9ydCBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCI7XG4iCisgICAgICAicGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDtcbiIKKyAgICAgICJcbiIKKyAgICAgICJvcHRpb24gKC5wcm90b2J1Zl91bml0dGVzdC5jY19vcHRpb24xKSA9IDE7XG4iCisgICAgICAib3B0aW9uICgucHJvdG9idWZfdW5pdHRlc3QuY2Nfb3B0aW9uMikgPSAyO1xuIgorICAgICAgIlxuIgorICAgICAgImV4dGVuZCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIHtcbiIKKyAgICAgICIgIG9wdGlvbmFsIGludDMyIGNjX29wdGlvbjEgPSA3NzM2OTc0O1xuIgorICAgICAgIiAgb3B0aW9uYWwgaW50MzIgY2Nfb3B0aW9uMiA9IDc3MzY5NzU7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgIGRlc2NyaXB0b3ItPkRlYnVnU3RyaW5nKCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFZhbGlkYXRpb25FcnJvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBQYXJzZSBmaWxlX3RleHQgYXMgYSBGaWxlRGVzY3JpcHRvclByb3RvIGluIHRleHQgZm9ybWF0IGFuZCBhZGQgaXQKKyAgLy8gdG8gdGhlIERlc2NyaXB0b3JQb29sLiAgRXhwZWN0IG5vIGVycm9ycy4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIEJ1aWxkRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV90ZXh0KSB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICAgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhmaWxlX3RleHQsICZmaWxlX3Byb3RvKSk7CisgICAgcmV0dXJuIEdPT0dMRV9DSEVDS19OT1ROVUxMKHBvb2xfLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSk7CisgIH0KKworICAvLyBQYXJzZSBmaWxlX3RleHQgYXMgYSBGaWxlRGVzY3JpcHRvclByb3RvIGluIHRleHQgZm9ybWF0IGFuZCBhZGQgaXQKKyAgLy8gdG8gdGhlIERlc2NyaXB0b3JQb29sLiAgRXhwZWN0IGVycm9ycyB0byBiZSBwcm9kdWNlZCB3aGljaCBtYXRjaCB0aGUKKyAgLy8gZ2l2ZW4gZXJyb3IgdGV4dC4KKyAgdm9pZCBCdWlsZEZpbGVXaXRoRXJyb3JzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfZXJyb3JzKSB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICAgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhmaWxlX3RleHQsICZmaWxlX3Byb3RvKSk7CisKKyAgICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICAgIEVYUEVDVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoZmlsZV9wcm90bywgJmVycm9yX2NvbGxlY3RvcikgPT0KKyAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfZXJyb3JzLCBlcnJvcl9jb2xsZWN0b3IudGV4dF8pOworICB9CisKKyAgLy8gUGFyc2UgZmlsZV90ZXh0IGFzIGEgRmlsZURlc2NyaXB0b3JQcm90byBpbiB0ZXh0IGZvcm1hdCBhbmQgYWRkIGl0CisgIC8vIHRvIHRoZSBEZXNjcmlwdG9yUG9vbC4gIEV4cGVjdCBlcnJvcnMgdG8gYmUgcHJvZHVjZWQgd2hpY2ggbWF0Y2ggdGhlCisgIC8vIGdpdmVuIHdhcm5pbmcgdGV4dC4KKyAgdm9pZCBCdWlsZEZpbGVXaXRoV2FybmluZ3MoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkX3dhcm5pbmdzKSB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICAgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhmaWxlX3RleHQsICZmaWxlX3Byb3RvKSk7CisKKyAgICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICAgIEVYUEVDVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoZmlsZV9wcm90bywgJmVycm9yX2NvbGxlY3RvcikpOworICAgIEVYUEVDVF9FUShleHBlY3RlZF93YXJuaW5ncywgZXJyb3JfY29sbGVjdG9yLndhcm5pbmdfdGV4dF8pOworICB9CisKKyAgLy8gQnVpbGRzIHNvbWUgYWxyZWFkeS1wYXJzZWQgZmlsZSBpbiBvdXIgdGVzdCBwb29sLgorICB2b2lkIEJ1aWxkRmlsZUluVGVzdFBvb2woY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgICAgZmlsZS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKyAgICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gbnVsbHB0cik7CisgIH0KKworICAvLyBCdWlsZCBkZXNjcmlwdG9yLnByb3RvIGluIG91ciB0ZXN0IHBvb2wuIFRoaXMgYWxsb3dzIHVzIHRvIGV4dGVuZCBpdCBpbgorICAvLyB0aGUgdGVzdCBwb29sLCBzbyB3ZSBjYW4gdGVzdCBjdXN0b20gb3B0aW9ucy4KKyAgdm9pZCBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKSB7CisgICAgQnVpbGRGaWxlSW5UZXN0UG9vbChEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKS0+ZmlsZSgpKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworfTsKKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEFscmVhZHlEZWZpbmVkKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9IgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvbzogTkFNRTogXCJGb29cIiBpcyBhbHJlYWR5IGRlZmluZWQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEFscmVhZHlEZWZpbmVkSW5QYWNrYWdlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAicGFja2FnZTogXCJmb28uYmFyXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iLAorCisgICAgICAiZm9vLnByb3RvOiBmb28uYmFyLkZvbzogTkFNRTogXCJGb29cIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gIgorICAgICAgIlwiZm9vLmJhclwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBBbHJlYWR5RGVmaW5lZEluT3RoZXJGaWxlKSB7CisgIEJ1aWxkRmlsZSgKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSIsCisKKyAgICAgICJiYXIucHJvdG86IEZvbzogTkFNRTogXCJGb29cIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gZmlsZSAiCisgICAgICAiXCJmb28ucHJvdG9cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUGFja2FnZUFscmVhZHlEZWZpbmVkKSB7CisgIEJ1aWxkRmlsZSgKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcImZvb1wiIH0iKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAgICJwYWNrYWdlOiBcImZvby5iYXJcIiIsCisKKyAgICAgICJiYXIucHJvdG86IGZvbzogTkFNRTogXCJmb29cIiBpcyBhbHJlYWR5IGRlZmluZWQgKGFzIHNvbWV0aGluZyBvdGhlciAiCisgICAgICAidGhhbiBhIHBhY2thZ2UpIGluIGZpbGUgXCJmb28ucHJvdG9cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bVZhbHVlQWxyZWFkeURlZmluZWRJblBhcmVudCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgImVudW1fdHlwZSB7IG5hbWU6IFwiRm9vXCIgdmFsdWUgeyBuYW1lOiBcIkZPT1wiIG51bWJlcjogMSB9IH0gIgorICAgICAgImVudW1fdHlwZSB7IG5hbWU6IFwiQmFyXCIgdmFsdWUgeyBuYW1lOiBcIkZPT1wiIG51bWJlcjogMSB9IH0gIiwKKworICAgICAgImZvby5wcm90bzogRk9POiBOQU1FOiBcIkZPT1wiIGlzIGFscmVhZHkgZGVmaW5lZC5cbiIKKyAgICAgICJmb28ucHJvdG86IEZPTzogTkFNRTogTm90ZSB0aGF0IGVudW0gdmFsdWVzIHVzZSBDKysgc2NvcGluZyBydWxlcywgIgorICAgICAgIm1lYW5pbmcgdGhhdCBlbnVtIHZhbHVlcyBhcmUgc2libGluZ3Mgb2YgdGhlaXIgdHlwZSwgbm90IGNoaWxkcmVuIG9mICIKKyAgICAgICJpdC4gIFRoZXJlZm9yZSwgXCJGT09cIiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGdsb2JhbCBzY29wZSwgbm90ICIKKyAgICAgICJqdXN0IHdpdGhpbiBcIkJhclwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtVmFsdWVBbHJlYWR5RGVmaW5lZEluUGFyZW50Tm9uR2xvYmFsKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAicGFja2FnZTogXCJwa2dcIiAiCisgICAgICAiZW51bV90eXBlIHsgbmFtZTogXCJGb29cIiB2YWx1ZSB7IG5hbWU6IFwiRk9PXCIgbnVtYmVyOiAxIH0gfSAiCisgICAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB2YWx1ZSB7IG5hbWU6IFwiRk9PXCIgbnVtYmVyOiAxIH0gfSAiLAorCisgICAgICAiZm9vLnByb3RvOiBwa2cuRk9POiBOQU1FOiBcIkZPT1wiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBcInBrZ1wiLlxuIgorICAgICAgImZvby5wcm90bzogcGtnLkZPTzogTkFNRTogTm90ZSB0aGF0IGVudW0gdmFsdWVzIHVzZSBDKysgc2NvcGluZyBydWxlcywgIgorICAgICAgIm1lYW5pbmcgdGhhdCBlbnVtIHZhbHVlcyBhcmUgc2libGluZ3Mgb2YgdGhlaXIgdHlwZSwgbm90IGNoaWxkcmVuIG9mICIKKyAgICAgICJpdC4gIFRoZXJlZm9yZSwgXCJGT09cIiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gXCJwa2dcIiwgbm90IGp1c3Qgd2l0aGluICIKKyAgICAgICJcIkJhclwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNaXNzaW5nTmFtZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IH0iLAorCisgICAgICAiZm9vLnByb3RvOiA6IE5BTUU6IE1pc3NpbmcgbmFtZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW52YWxpZE5hbWUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIiRcIiB9IiwKKworICAgICAgImZvby5wcm90bzogJDogTkFNRTogXCIkXCIgaXMgbm90IGEgdmFsaWQgaWRlbnRpZmllci5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW52YWxpZFBhY2thZ2VOYW1lKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAicGFja2FnZTogXCJmb28uJFwiIiwKKworICAgICAgImZvby5wcm90bzogZm9vLiQ6IE5BTUU6IFwiJFwiIGlzIG5vdCBhIHZhbGlkIGlkZW50aWZpZXIuXG4iKTsKK30KKworLy8gJ3N0cicgaXMgYSBzdGF0aWMgQy1zdHlsZSBzdHJpbmcgdGhhdCBtYXkgY29udGFpbiAnXDAnCisjZGVmaW5lIFNUQVRJQ19TVFIoc3RyKSBzdGQ6OnN0cmluZygoc3RyKSwgc2l6ZW9mKHN0cikgLSAxKQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTnVsbENoYXJTeW1ib2xOYW1lKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgICAicGFja2FnZTogXCJmb29cIiIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOiAnXFwwMDBcXDAwMVxcMDEzLkJhcicgIgorICAgICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogIDkgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICJ9ICIKKyAgICAgICJ9IiwKKyAgICAgIFNUQVRJQ19TVFIoImJhci5wcm90bzogZm9vLlwwXHgxXHYuQmFyOiBOQU1FOiBcIlwwXHgxXHYuQmFyXCIgaXMgbm90IGEgIgorICAgICAgICAgICAgICAgICAidmFsaWQgaWRlbnRpZmllci5cbmJhci5wcm90bzogZm9vLlwwXHgxXHYuQmFyLmZvbzogTkFNRTogIgorICAgICAgICAgICAgICAgICAiXCJmb28uXDBceDFcdi5CYXIuZm9vXCIgY29udGFpbnMgbnVsbCBjaGFyYWN0ZXIuXG5iYXIucHJvdG86ICIKKyAgICAgICAgICAgICAgICAgImZvby5cMFx4MVx2LkJhcjogTkFNRTogXCJmb28uXDBceDFcdi5CYXJcIiBjb250YWlucyBudWxsICIKKyAgICAgICAgICAgICAgICAgImNoYXJhY3Rlci5cbiIpKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE51bGxDaGFyRmlsZU5hbWUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImJhclxcMDAwXFwwMDFcXDAxMy5wcm90b1wiICIKKyAgICAgICJwYWNrYWdlOiBcIm91dGVyLmZvb1wiIiwKKyAgICAgIFNUQVRJQ19TVFIoImJhclwwXHgxXHYucHJvdG86IGJhclwwXHgxXHYucHJvdG86IE5BTUU6ICIKKyAgICAgICAgICAgICAgICAgIlwiYmFyXDBceDFcdi5wcm90b1wiIGNvbnRhaW5zIG51bGwgY2hhcmFjdGVyLlxuIikpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTnVsbENoYXJQYWNrYWdlTmFtZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICAgInBhY2thZ2U6IFwiXFwwMDBcXDAwMVxcMDEzLlwiIiwKKyAgICAgIFNUQVRJQ19TVFIoImJhci5wcm90bzogXDBceDFcdi46IE5BTUU6IFwiXDBceDFcdi5cIiBjb250YWlucyBudWxsICIKKyAgICAgICAgICAgICAgICAgImNoYXJhY3Rlci5cbiIpKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1pc3NpbmdGaWxlTmFtZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKCIiLAorCisgICAgICAgICAgICAgICAgICAgICAgIjogOiBPVEhFUjogTWlzc2luZyBmaWVsZDogRmlsZURlc2NyaXB0b3JQcm90by5uYW1lLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBEdXBlRGVwZW5kZW5jeSkgeworICBCdWlsZEZpbGUoIm5hbWU6IFwiZm9vLnByb3RvXCIiKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiICIsCisKKyAgICAgICJiYXIucHJvdG86IGZvby5wcm90bzogSU1QT1JUOiBJbXBvcnQgXCJmb28ucHJvdG9cIiB3YXMgbGlzdGVkIHR3aWNlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbmtub3duRGVwZW5kZW5jeSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICAgImRlcGVuZGVuY3k6IFwiZm9vLnByb3RvXCIgIiwKKworICAgICAgImJhci5wcm90bzogZm9vLnByb3RvOiBJTVBPUlQ6IEltcG9ydCBcImZvby5wcm90b1wiIGhhcyBub3QgYmVlbiAiCisgICAgICAibG9hZGVkLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnZhbGlkUHVibGljRGVwZW5kZW5jeUluZGV4KSB7CisgIEJ1aWxkRmlsZSgibmFtZTogXCJmb28ucHJvdG9cIiIpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICAgImRlcGVuZGVuY3k6IFwiZm9vLnByb3RvXCIgIgorICAgICAgInB1YmxpY19kZXBlbmRlbmN5OiAxIiwKKyAgICAgICJiYXIucHJvdG86IGJhci5wcm90bzogT1RIRVI6IEludmFsaWQgcHVibGljIGRlcGVuZGVuY3kgaW5kZXguXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZvcmVpZ25VbmltcG9ydGVkUGFja2FnZU5vQ3Jhc2gpIHsKKyAgLy8gVXNlZCB0byBjcmFzaDogIElmIHdlIGRlcGVuZCBvbiBhIG5vbi1leGlzdGVudCBmaWxlIGFuZCB0aGVuIHJlZmVyIHRvIGEKKyAgLy8gcGFja2FnZSBkZWZpbmVkIGluIGEgZmlsZSB0aGF0IHdlIGRpZG4ndCBpbXBvcnQsIGFuZCB0aGF0IHBhY2thZ2UgaXMKKyAgLy8gbmVzdGVkIHdpdGhpbiBhIHBhcmVudCBwYWNrYWdlIHdoaWNoIHRoaXMgZmlsZSBpcyBhbHNvIGluLCBhbmQgd2UgZG9uJ3QKKyAgLy8gaW5jbHVkZSB0aGF0IHBhcmVudCBwYWNrYWdlIGluIHRoZSBuYW1lIChpLmUuIHdlIGRvIGEgcmVsYXRpdmUgbG9va3VwKS4uLgorICAvLyBZZXMsIHJlYWxseS4KKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJwYWNrYWdlOiAnb3V0ZXIuZm9vJyAiKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiAnYmFyLnByb3RvJyAiCisgICAgICAiZGVwZW5kZW5jeTogJ2Jhei5wcm90bycgIgorICAgICAgInBhY2thZ2U6ICdvdXRlci5iYXInICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOiAnQmFyJyAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6J2JhcicgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOidmb28uRm9vJyB9IgorICAgICAgIn0iLAorCisgICAgICAiYmFyLnByb3RvOiBiYXoucHJvdG86IElNUE9SVDogSW1wb3J0IFwiYmF6LnByb3RvXCIgaGFzIG5vdCBiZWVuICIKKyAgICAgICJsb2FkZWQuXG4iCisgICAgICAiYmFyLnByb3RvOiBvdXRlci5iYXIuQmFyLmJhcjogVFlQRTogXCJvdXRlci5mb29cIiBzZWVtcyB0byBiZSBkZWZpbmVkICIKKyAgICAgICJpbiAiCisgICAgICAiXCJmb28ucHJvdG9cIiwgd2hpY2ggaXMgbm90IGltcG9ydGVkIGJ5IFwiYmFyLnByb3RvXCIuICBUbyB1c2UgaXQgaGVyZSwgIgorICAgICAgInBsZWFzZSBhZGQgdGhlIG5lY2Vzc2FyeSBpbXBvcnQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIER1cGVGaWxlKSB7CisgIEJ1aWxkRmlsZSgKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iKTsKKyAgLy8gTm90ZTogIFdlIHNob3VsZCAqbm90KiBnZXQgcmVkdW5kYW50IGVycm9ycyBhYm91dCAiRm9vIiBhbHJlYWR5IGJlaW5nCisgIC8vICAgZGVmaW5lZC4KKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0gIgorICAgICAgLy8gQWRkIGFub3RoZXIgdHlwZSBzbyB0aGF0IHRoZSBmaWxlcyBhcmVuJ3QgaWRlbnRpY2FsIChpbiB3aGljaCBjYXNlCisgICAgICAvLyB0aGVyZSB3b3VsZCBiZSBubyBlcnJvcikuCisgICAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB9IiwKKworICAgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPVEhFUjogQSBmaWxlIHdpdGggdGhpcyBuYW1lIGlzIGFscmVhZHkgaW4gdGhlICIKKyAgICAgICJwb29sLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZEluRXh0ZW5zaW9uUmFuZ2UpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAgOSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIn0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6IFwiYmFyXCIgbnVtYmVyOiAxMCBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIn0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6IFwiYmF6XCIgbnVtYmVyOiAxOSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIn0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6IFwibW9vXCIgbnVtYmVyOiAyMCBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIn0iCisgICAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMTAgZW5kOiAyMCB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb28uYmFyOiBOVU1CRVI6IEV4dGVuc2lvbiByYW5nZSAxMCB0byAxOSBpbmNsdWRlcyBmaWVsZCAiCisgICAgICAiXCJiYXJcIiAoMTApLlxuIgorICAgICAgImZvby5wcm90bzogRm9vLmJhejogTlVNQkVSOiBFeHRlbnNpb24gcmFuZ2UgMTAgdG8gMTkgaW5jbHVkZXMgZmllbGQgIgorICAgICAgIlwiYmF6XCIgKDE5KS5cbiIKKyAgICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBTdWdnZXN0ZWQgZmllbGQgbnVtYmVycyBmb3IgRm9vOiAxLCAyXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE92ZXJsYXBwaW5nRXh0ZW5zaW9uUmFuZ2VzKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEwIGVuZDogMjAgfSIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAyMCBlbmQ6IDMwIH0iCisgICAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMTkgZW5kOiAyMSB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb286IE5VTUJFUjogRXh0ZW5zaW9uIHJhbmdlIDE5IHRvIDIwIG92ZXJsYXBzIHdpdGggIgorICAgICAgImFscmVhZHktZGVmaW5lZCByYW5nZSAxMCB0byAxOS5cbiIKKyAgICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBFeHRlbnNpb24gcmFuZ2UgMTkgdG8gMjAgb3ZlcmxhcHMgd2l0aCAiCisgICAgICAiYWxyZWFkeS1kZWZpbmVkIHJhbmdlIDIwIHRvIDI5LlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXNlcnZlZEZpZWxkRXJyb3IpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxNSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIn0iCisgICAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDIwIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IE5VTUJFUjogRmllbGQgXCJmb29cIiB1c2VzIHJlc2VydmVkIG51bWJlciAxNS5cbiIKKyAgICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBTdWdnZXN0ZWQgZmllbGQgbnVtYmVycyBmb3IgRm9vOiAxXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFJlc2VydmVkRXh0ZW5zaW9uUmFuZ2VFcnJvcikgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDIwIH0iCisgICAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0OiA1IGVuZDogMTUgfSIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogRm9vOiBOVU1CRVI6IEV4dGVuc2lvbiByYW5nZSAxMCB0byAxOSIKKyAgICAgICIgb3ZlcmxhcHMgd2l0aCByZXNlcnZlZCByYW5nZSA1IHRvIDE0LlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXNlcnZlZEV4dGVuc2lvblJhbmdlQWRqYWNlbnQpIHsKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDIwIH0iCisgICAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0OiA1IGVuZDogMTAgfSIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXNlcnZlZFJhbmdlT3ZlcmxhcCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDEwIGVuZDogMjAgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDUgZW5kOiAxNSB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb286IE5VTUJFUjogUmVzZXJ2ZWQgcmFuZ2UgNSB0byAxNCIKKyAgICAgICIgb3ZlcmxhcHMgd2l0aCBhbHJlYWR5LWRlZmluZWQgcmFuZ2UgMTAgdG8gMTkuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFJlc2VydmVkTmFtZUVycm9yKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogMTUgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOiBcImJhclwiIG51bWJlcjogMTYgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICJ9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOiBcImJhelwiIG51bWJlcjogMTcgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICJ9IgorICAgICAgIiAgcmVzZXJ2ZWRfbmFtZTogXCJmb29cIiIKKyAgICAgICIgIHJlc2VydmVkX25hbWU6IFwiYmFyXCIiCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IE5BTUU6IEZpZWxkIG5hbWUgXCJmb29cIiBpcyByZXNlcnZlZC5cbiIKKyAgICAgICJmb28ucHJvdG86IEZvby5iYXI6IE5BTUU6IEZpZWxkIG5hbWUgXCJiYXJcIiBpcyByZXNlcnZlZC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUmVzZXJ2ZWROYW1lUmVkdW5kYW50KSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgcmVzZXJ2ZWRfbmFtZTogXCJmb29cIiIKKyAgICAgICIgIHJlc2VydmVkX25hbWU6IFwiZm9vXCIiCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IGZvbzogTkFNRTogRmllbGQgbmFtZSBcImZvb1wiIGlzIHJlc2VydmVkIG11bHRpcGxlIHRpbWVzLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXNlcnZlZEZpZWxkc0RlYnVnU3RyaW5nKSB7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIHJlc2VydmVkX25hbWU6IFwiZm9vXCIiCisgICAgICAiICByZXNlcnZlZF9uYW1lOiBcImJhclwiIgorICAgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDogNSBlbmQ6IDYgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDEwIGVuZDogMjAgfSIKKyAgICAgICJ9Iik7CisKKyAgQVNTRVJUX0VRKAorICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG5cbiIKKyAgICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgICAiICByZXNlcnZlZCA1LCAxMCB0byAxOTtcbiIKKyAgICAgICIgIHJlc2VydmVkIFwiZm9vXCIsIFwiYmFyXCI7XG4iCisgICAgICAifVxuXG4iLAorICAgICAgZmlsZS0+RGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBEZWJ1Z1N0cmluZ1Jlc2VydmVkUmFuZ2VNYXgpIHsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBCdWlsZEZpbGUoc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJlbnVtX3R5cGUgeyAiCisgICAgICAiICBuYW1lOiBcIkJhclwiIgorICAgICAgIiAgdmFsdWUgeyBuYW1lOlwiQkFSXCIgbnVtYmVyOjEgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDUgZW5kOiAkMCB9IgorICAgICAgIn0iCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDogNSBlbmQ6ICQxIH0iCisgICAgICAifSIsCisgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpLCBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIgKyAxKSk7CisKKyAgQVNTRVJUX0VRKAorICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG5cbiIKKyAgICAgICJlbnVtIEJhciB7XG4iCisgICAgICAiICBCQVIgPSAxO1xuIgorICAgICAgIiAgcmVzZXJ2ZWQgNSB0byBtYXg7XG4iCisgICAgICAifVxuXG4iCisgICAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICAgIiAgcmVzZXJ2ZWQgNSB0byBtYXg7XG4iCisgICAgICAifVxuXG4iLAorICAgICAgZmlsZS0+RGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtUmVzZXJ2ZWRGaWVsZEVycm9yKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZW51bV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgdmFsdWUgeyBuYW1lOlwiQkFSXCIgbnVtYmVyOjE1IH0iCisgICAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDIwIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEJBUjogTlVNQkVSOiBFbnVtIHZhbHVlIFwiQkFSXCIgdXNlcyByZXNlcnZlZCBudW1iZXIgMTUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1OZWdhdGl2ZVJlc2VydmVkRmllbGRFcnJvcikgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgImVudW1fdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTpcIkJBUlwiIG51bWJlcjotMTUgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IC0yMCBlbmQ6IC0xMCB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBCQVI6IE5VTUJFUjogRW51bSB2YWx1ZSBcIkJBUlwiIHVzZXMgcmVzZXJ2ZWQgbnVtYmVyIC0xNS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bVJlc2VydmVkUmFuZ2VPdmVybGFwKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZW51bV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgdmFsdWUgeyBuYW1lOlwiQkFSXCIgbnVtYmVyOjAgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDEwIGVuZDogMjAgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDUgZW5kOiAxNSB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb286IE5VTUJFUjogUmVzZXJ2ZWQgcmFuZ2UgNSB0byAxNSIKKyAgICAgICIgb3ZlcmxhcHMgd2l0aCBhbHJlYWR5LWRlZmluZWQgcmFuZ2UgMTAgdG8gMjAuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1SZXNlcnZlZFJhbmdlT3ZlcmxhcEJ5T25lKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZW51bV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgdmFsdWUgeyBuYW1lOlwiQkFSXCIgbnVtYmVyOjAgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDEwIGVuZDogMjAgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDUgZW5kOiAxMCB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb286IE5VTUJFUjogUmVzZXJ2ZWQgcmFuZ2UgNSB0byAxMCIKKyAgICAgICIgb3ZlcmxhcHMgd2l0aCBhbHJlYWR5LWRlZmluZWQgcmFuZ2UgMTAgdG8gMjAuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1OZWdhdGl2ZVJlc2VydmVkUmFuZ2VPdmVybGFwKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZW51bV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgdmFsdWUgeyBuYW1lOlwiQkFSXCIgbnVtYmVyOjAgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IC0yMCBlbmQ6IC0xMCB9IgorICAgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDogLTE1IGVuZDogLTUgfSIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogRm9vOiBOVU1CRVI6IFJlc2VydmVkIHJhbmdlIC0xNSB0byAtNSIKKyAgICAgICIgb3ZlcmxhcHMgd2l0aCBhbHJlYWR5LWRlZmluZWQgcmFuZ2UgLTIwIHRvIC0xMC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bU1peGVkUmVzZXJ2ZWRSYW5nZU92ZXJsYXApIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJlbnVtX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6XCJCQVJcIiBudW1iZXI6MjAgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IC0yMCBlbmQ6IDEwIH0iCisgICAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0OiAtMTUgZW5kOiA1IH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBSZXNlcnZlZCByYW5nZSAtMTUgdG8gNSIKKyAgICAgICIgb3ZlcmxhcHMgd2l0aCBhbHJlYWR5LWRlZmluZWQgcmFuZ2UgLTIwIHRvIDEwLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtTWl4ZWRSZXNlcnZlZFJhbmdlT3ZlcmxhcDIpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJlbnVtX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6XCJCQVJcIiBudW1iZXI6MjAgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IC0yMCBlbmQ6IDEwIH0iCisgICAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDEwIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBSZXNlcnZlZCByYW5nZSAxMCB0byAxMCIKKyAgICAgICIgb3ZlcmxhcHMgd2l0aCBhbHJlYWR5LWRlZmluZWQgcmFuZ2UgLTIwIHRvIDEwLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtUmVzZXJ2ZWRSYW5nZVN0YXJ0R3JlYXRlclRoYW5FbmQpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJlbnVtX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6XCJCQVJcIiBudW1iZXI6MjAgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDExIGVuZDogMTAgfSIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogRm9vOiBOVU1CRVI6IFJlc2VydmVkIHJhbmdlIGVuZCBudW1iZXIgbXVzdCBiZSBncmVhdGVyIgorICAgICAgIiB0aGFuIHN0YXJ0IG51bWJlci5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bVJlc2VydmVkTmFtZUVycm9yKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZW51bV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgdmFsdWUgeyBuYW1lOlwiRk9PXCIgbnVtYmVyOjE1IH0iCisgICAgICAiICB2YWx1ZSB7IG5hbWU6XCJCQVJcIiBudW1iZXI6MTUgfSIKKyAgICAgICIgIHJlc2VydmVkX25hbWU6IFwiRk9PXCIiCisgICAgICAiICByZXNlcnZlZF9uYW1lOiBcIkJBUlwiIgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGT086IE5BTUU6IEVudW0gdmFsdWUgXCJGT09cIiBpcyByZXNlcnZlZC5cbiIKKyAgICAgICJmb28ucHJvdG86IEJBUjogTkFNRTogRW51bSB2YWx1ZSBcIkJBUlwiIGlzIHJlc2VydmVkLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtUmVzZXJ2ZWROYW1lUmVkdW5kYW50KSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZW51bV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgdmFsdWUgeyBuYW1lOlwiRk9PXCIgbnVtYmVyOjE1IH0iCisgICAgICAiICByZXNlcnZlZF9uYW1lOiBcImZvb1wiIgorICAgICAgIiAgcmVzZXJ2ZWRfbmFtZTogXCJmb29cIiIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogZm9vOiBOQU1FOiBFbnVtIHZhbHVlIFwiZm9vXCIgaXMgcmVzZXJ2ZWQgbXVsdGlwbGUgdGltZXMuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1SZXNlcnZlZEZpZWxkc0RlYnVnU3RyaW5nKSB7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgImVudW1fdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTpcIkZPT1wiIG51bWJlcjozIH0iCisgICAgICAiICByZXNlcnZlZF9uYW1lOiBcImZvb1wiIgorICAgICAgIiAgcmVzZXJ2ZWRfbmFtZTogXCJiYXJcIiIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IC02IGVuZDogLTYgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IC01IGVuZDogLTQgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IC0xIGVuZDogMSB9IgorICAgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDogNSBlbmQ6IDUgfSIKKyAgICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDEwIGVuZDogMTkgfSIKKyAgICAgICJ9Iik7CisKKyAgQVNTRVJUX0VRKAorICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG5cbiIKKyAgICAgICJlbnVtIEZvbyB7XG4iCisgICAgICAiICBGT08gPSAzO1xuIgorICAgICAgIiAgcmVzZXJ2ZWQgLTYsIC01IHRvIC00LCAtMSB0byAxLCA1LCAxMCB0byAxOTtcbiIKKyAgICAgICIgIHJlc2VydmVkIFwiZm9vXCIsIFwiYmFyXCI7XG4iCisgICAgICAifVxuXG4iLAorICAgICAgZmlsZS0+RGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnZhbGlkRGVmYXVsdHMpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisKKyAgICAgIC8vIEludmFsaWQgbnVtYmVyLgorICAgICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogMSBsYWJlbDogTEFCRUxfT1BUSU9OQUwgdHlwZTogVFlQRV9JTlQzMiIKKyAgICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTogXCJhYmNcIiB9IgorCisgICAgICAvLyBFbXB0eSBkZWZhdWx0IHZhbHVlLgorICAgICAgIiAgZmllbGQgeyBuYW1lOiBcImJhclwiIG51bWJlcjogMiBsYWJlbDogTEFCRUxfT1BUSU9OQUwgdHlwZTogVFlQRV9JTlQzMiIKKyAgICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTogXCJcIiB9IgorCisgICAgICAvLyBJbnZhbGlkIGJvb2xlYW4uCisgICAgICAiICBmaWVsZCB7IG5hbWU6IFwiYmF6XCIgbnVtYmVyOiAzIGxhYmVsOiBMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX0JPT0wiCisgICAgICAiICAgICAgICAgIGRlZmF1bHRfdmFsdWU6IFwiYWJjXCIgfSIKKworICAgICAgLy8gTWVzc2FnZXMgY2FuJ3QgaGF2ZSBkZWZhdWx0cy4KKyAgICAgICIgIGZpZWxkIHsgbmFtZTogXCJtb29cIiBudW1iZXI6IDQgbGFiZWw6IExBQkVMX09QVElPTkFMIHR5cGU6ICIKKyAgICAgICJUWVBFX01FU1NBR0UiCisgICAgICAiICAgICAgICAgIGRlZmF1bHRfdmFsdWU6IFwiYWJjXCIgdHlwZV9uYW1lOiBcIkZvb1wiIH0iCisKKyAgICAgIC8vIFNhbWUgdGhpbmcsIGJ1dCB3ZSBkb24ndCBrbm93IHRoYXQgdGhpcyBmaWVsZCBoYXMgbWVzc2FnZSB0eXBlIHVudGlsCisgICAgICAvLyB3ZSBsb29rIHVwIHRoZSB0eXBlIG5hbWUuCisgICAgICAiICBmaWVsZCB7IG5hbWU6IFwibW9vb1wiIG51bWJlcjogNSBsYWJlbDogTEFCRUxfT1BUSU9OQUwiCisgICAgICAiICAgICAgICAgIGRlZmF1bHRfdmFsdWU6IFwiYWJjXCIgdHlwZV9uYW1lOiBcIkZvb1wiIH0iCisKKyAgICAgIC8vIFJlcGVhdGVkcyBjYW4ndCBoYXZlIGRlZmF1bHRzLgorICAgICAgIiAgZmllbGQgeyBuYW1lOiBcImNvcmdlXCIgbnVtYmVyOiA2IGxhYmVsOiBMQUJFTF9SRVBFQVRFRCB0eXBlOiAiCisgICAgICAiVFlQRV9JTlQzMiIKKyAgICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTogXCIxXCIgfSIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogRm9vLmZvbzogREVGQVVMVF9WQUxVRTogQ291bGRuJ3QgcGFyc2UgZGVmYXVsdCB2YWx1ZSAiCisgICAgICAiXCJhYmNcIi5cbiIKKyAgICAgICJmb28ucHJvdG86IEZvby5iYXI6IERFRkFVTFRfVkFMVUU6IENvdWxkbid0IHBhcnNlIGRlZmF1bHQgdmFsdWUgXCJcIi5cbiIKKyAgICAgICJmb28ucHJvdG86IEZvby5iYXo6IERFRkFVTFRfVkFMVUU6IEJvb2xlYW4gZGVmYXVsdCBtdXN0IGJlIHRydWUgb3IgIgorICAgICAgImZhbHNlLlxuIgorICAgICAgImZvby5wcm90bzogRm9vLm1vbzogREVGQVVMVF9WQUxVRTogTWVzc2FnZXMgY2FuJ3QgaGF2ZSBkZWZhdWx0IHZhbHVlcy5cbiIKKyAgICAgICJmb28ucHJvdG86IEZvby5jb3JnZTogREVGQVVMVF9WQUxVRTogUmVwZWF0ZWQgZmllbGRzIGNhbid0IGhhdmUgZGVmYXVsdCAiCisgICAgICAidmFsdWVzLlxuIgorICAgICAgLy8gVGhpcyBlbmRzIHVwIGJlaW5nIHJlcG9ydGVkIGxhdGVyIGJlY2F1c2UgdGhlIGVycm9yIGlzIGRldGVjdGVkIGF0CisgICAgICAvLyBjcm9zcy1saW5raW5nIHRpbWUuCisgICAgICAiZm9vLnByb3RvOiBGb28ubW9vbzogREVGQVVMVF9WQUxVRTogTWVzc2FnZXMgY2FuJ3QgaGF2ZSBkZWZhdWx0ICIKKyAgICAgICJ2YWx1ZXMuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5lZ2F0aXZlRmllbGROdW1iZXIpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAtMSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIn0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IE5VTUJFUjogRmllbGQgbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzLlxuIgorICAgICAgImZvby5wcm90bzogRm9vOiBOVU1CRVI6IFN1Z2dlc3RlZCBmaWVsZCBudW1iZXJzIGZvciBGb286IDFcbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSHVnZUZpZWxkTnVtYmVyKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogMHg3MDAwMDAwMCAiCisgICAgICAiICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBOVU1CRVI6IEZpZWxkIG51bWJlcnMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAiCisgICAgICAiNTM2ODcwOTExLlxuIgorICAgICAgImZvby5wcm90bzogRm9vOiBOVU1CRVI6IFN1Z2dlc3RlZCBmaWVsZCBudW1iZXJzIGZvciBGb286IDFcbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUmVzZXJ2ZWRGaWVsZE51bWJlcikgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGZpZWxkIHtuYW1lOlwiZm9vXCIgbnVtYmVyOiAxODk5OSBsYWJlbDpMQUJFTF9PUFRJT05BTCAiCisgICAgICAidHlwZTpUWVBFX0lOVDMyIH0iCisgICAgICAiICBmaWVsZCB7bmFtZTpcImJhclwiIG51bWJlcjogMTkwMDAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgIgorICAgICAgInR5cGU6VFlQRV9JTlQzMiB9IgorICAgICAgIiAgZmllbGQge25hbWU6XCJiYXpcIiBudW1iZXI6IDE5OTk5IGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAgICJ0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAgICIgIGZpZWxkIHtuYW1lOlwibW9vXCIgbnVtYmVyOiAyMDAwMCBsYWJlbDpMQUJFTF9PUFRJT05BTCAiCisgICAgICAidHlwZTpUWVBFX0lOVDMyIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvby5iYXI6IE5VTUJFUjogRmllbGQgbnVtYmVycyAxOTAwMCB0aHJvdWdoIDE5OTk5IGFyZSAiCisgICAgICAicmVzZXJ2ZWQgZm9yIHRoZSBwcm90b2NvbCBidWZmZXIgbGlicmFyeSBpbXBsZW1lbnRhdGlvbi5cbiIKKyAgICAgICJmb28ucHJvdG86IEZvby5iYXo6IE5VTUJFUjogRmllbGQgbnVtYmVycyAxOTAwMCB0aHJvdWdoIDE5OTk5IGFyZSAiCisgICAgICAicmVzZXJ2ZWQgZm9yIHRoZSBwcm90b2NvbCBidWZmZXIgbGlicmFyeSBpbXBsZW1lbnRhdGlvbi5cbiIKKyAgICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBTdWdnZXN0ZWQgZmllbGQgbnVtYmVycyBmb3IgRm9vOiAxLCAyXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEV4dGVuc2lvbk1pc3NpbmdFeHRlbmRlZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxIGxhYmVsOiBMQUJFTF9PUFRJT05BTCIKKyAgICAgICIgICAgICAgICAgICAgIHR5cGVfbmFtZTogXCJGb29cIiB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBFWFRFTkRFRTogRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUgbm90IHNldCBmb3IgIgorICAgICAgImV4dGVuc2lvbiBmaWVsZC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTm9uRXh0ZW5zaW9uV2l0aEV4dGVuZGVlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkJhclwiIgorICAgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAyIH0iCisgICAgICAifSIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxIGxhYmVsOiBMQUJFTF9PUFRJT05BTCIKKyAgICAgICIgICAgICAgICAgdHlwZV9uYW1lOiBcIkZvb1wiIGV4dGVuZGVlOiBcIkJhclwiIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IEVYVEVOREVFOiBGaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSBzZXQgZm9yICIKKyAgICAgICJub24tZXh0ZW5zaW9uIGZpZWxkLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZE9uZW9mSW5kZXhUb29MYXJnZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCisgICAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OiAxIH0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJkdW1teVwiIG51bWJlcjoyIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCisgICAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OiAwIH0iCisgICAgICAiICBvbmVvZl9kZWNsIHsgbmFtZTpcImJhclwiIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IEZpZWxkRGVzY3JpcHRvclByb3RvLm9uZW9mX2luZGV4IDEgaXMgb3V0IG9mICIKKyAgICAgICJyYW5nZSBmb3IgdHlwZSBcIkZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZE9uZW9mSW5kZXhOZWdhdGl2ZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCisgICAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OiAtMSB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZHVtbXlcIiBudW1iZXI6MiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIiAgICAgICAgICBvbmVvZl9pbmRleDogMCB9IgorICAgICAgIiAgb25lb2ZfZGVjbCB7IG5hbWU6XCJiYXJcIiB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBGaWVsZERlc2NyaXB0b3JQcm90by5vbmVvZl9pbmRleCAtMSBpcyBvdXQgIgorICAgICAgIm9mICIKKyAgICAgICJyYW5nZSBmb3IgdHlwZSBcIkZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBPbmVvZkZpZWxkc0NvbnNlY3V0aXZlRGVmaW5pdGlvbikgeworICAvLyBGaWVsZHMgYmVsb25naW5nIHRvIHRoZSBzYW1lIG9uZW9mIG11c3QgYmUgZGVmaW5lZCBjb25zZWN1dGl2ZWx5LgorICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvbzFcIiBudW1iZXI6IDEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDAgfSIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImJhclwiIG51bWJlcjogMiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvbzJcIiBudW1iZXI6IDMgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDAgfSIKKyAgICAgICIgIG9uZW9mX2RlY2wgeyBuYW1lOlwiZm9vc1wiIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvby5iYXI6IFRZUEU6IEZpZWxkcyBpbiB0aGUgc2FtZSBvbmVvZiBtdXN0IGJlIGRlZmluZWQgIgorICAgICAgImNvbnNlY3V0aXZlbHkuIFwiYmFyXCIgY2Fubm90IGJlIGRlZmluZWQgYmVmb3JlIHRoZSBjb21wbGV0aW9uIG9mIHRoZSAiCisgICAgICAiXCJmb29zXCIgb25lb2YgZGVmaW5pdGlvbi5cbiIpOworCisgIC8vIFByZXZlbnQgaW50ZXJsZWF2ZWQgZmllbGRzLCB3aGljaCBiZWxvbmcgdG8gZGlmZmVyZW50IG9uZW9mcy4KKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvbzIucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvbzJcIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvbzFcIiBudW1iZXI6IDEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDAgfSIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImJhcjFcIiBudW1iZXI6IDIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDEgfSIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvbzJcIiBudW1iZXI6IDMgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDAgfSIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImJhcjJcIiBudW1iZXI6IDQgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDEgfSIKKyAgICAgICIgIG9uZW9mX2RlY2wgeyBuYW1lOlwiZm9vc1wiIH0iCisgICAgICAiICBvbmVvZl9kZWNsIHsgbmFtZTpcImJhcnNcIiB9IgorICAgICAgIn0iLAorICAgICAgImZvbzIucHJvdG86IEZvbzIuYmFyMTogVFlQRTogRmllbGRzIGluIHRoZSBzYW1lIG9uZW9mIG11c3QgYmUgZGVmaW5lZCAiCisgICAgICAiY29uc2VjdXRpdmVseS4gXCJiYXIxXCIgY2Fubm90IGJlIGRlZmluZWQgYmVmb3JlIHRoZSBjb21wbGV0aW9uIG9mIHRoZSAiCisgICAgICAiXCJmb29zXCIgb25lb2YgZGVmaW5pdGlvbi5cbiIKKyAgICAgICJmb28yLnByb3RvOiBGb28yLmZvbzI6IFRZUEU6IEZpZWxkcyBpbiB0aGUgc2FtZSBvbmVvZiBtdXN0IGJlIGRlZmluZWQgIgorICAgICAgImNvbnNlY3V0aXZlbHkuIFwiZm9vMlwiIGNhbm5vdCBiZSBkZWZpbmVkIGJlZm9yZSB0aGUgY29tcGxldGlvbiBvZiB0aGUgIgorICAgICAgIlwiYmFyc1wiIG9uZW9mIGRlZmluaXRpb24uXG4iKTsKKworICAvLyBBbm90aGVyIGNhc2UgZm9yIG5vcm1hbCBmaWVsZHMgYW5kIGRpZmZlcmVudCBvbmVvZiBmaWVsZHMgaW50ZXJsZWF2ZS4KKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvbzMucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvbzNcIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvbzFcIiBudW1iZXI6IDEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDAgfSIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImJhcjFcIiBudW1iZXI6IDIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDEgfSIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImJhelwiIG51bWJlcjogMyBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvbzJcIiBudW1iZXI6IDQgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDAgfSIKKyAgICAgICIgIG9uZW9mX2RlY2wgeyBuYW1lOlwiZm9vc1wiIH0iCisgICAgICAiICBvbmVvZl9kZWNsIHsgbmFtZTpcImJhcnNcIiB9IgorICAgICAgIn0iLAorICAgICAgImZvbzMucHJvdG86IEZvbzMuYmF6OiBUWVBFOiBGaWVsZHMgaW4gdGhlIHNhbWUgb25lb2YgbXVzdCBiZSBkZWZpbmVkICIKKyAgICAgICJjb25zZWN1dGl2ZWx5LiBcImJhelwiIGNhbm5vdCBiZSBkZWZpbmVkIGJlZm9yZSB0aGUgY29tcGxldGlvbiBvZiB0aGUgIgorICAgICAgIlwiZm9vc1wiIG9uZW9mIGRlZmluaXRpb24uXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkTnVtYmVyQ29uZmxpY3QpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOiBcImJhclwiIG51bWJlcjogMSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogRm9vLmJhcjogTlVNQkVSOiBGaWVsZCBudW1iZXIgMSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaW4gIgorICAgICAgIlwiRm9vXCIgYnkgZmllbGQgXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgQmFkTWVzc2FnZVNldEV4dGVuc2lvblR5cGUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiTWVzc2FnZVNldFwiIgorICAgICAgIiAgb3B0aW9ucyB7IG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0OiB0cnVlIH0iCisgICAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogNCBlbmQ6IDUgfSIKKyAgICAgICJ9IgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGV4dGVuc2lvbiB7IG5hbWU6XCJmb29cIiBudW1iZXI6NCBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIiCisgICAgICAiICAgICAgICAgICAgICBleHRlbmRlZTogXCJNZXNzYWdlU2V0XCIgfSIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogRXh0ZW5zaW9ucyBvZiBNZXNzYWdlU2V0cyBtdXN0IGJlIG9wdGlvbmFsICIKKyAgICAgICJtZXNzYWdlcy5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgQmFkTWVzc2FnZVNldEV4dGVuc2lvbkxhYmVsKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIk1lc3NhZ2VTZXRcIiIKKyAgICAgICIgIG9wdGlvbnMgeyBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdDogdHJ1ZSB9IgorICAgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDQgZW5kOiA1IH0iCisgICAgICAifSIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBleHRlbnNpb24geyBuYW1lOlwiZm9vXCIgbnVtYmVyOjQgbGFiZWw6TEFCRUxfUkVQRUFURUQgIgorICAgICAgInR5cGU6VFlQRV9NRVNTQUdFIgorICAgICAgIiAgICAgICAgICAgICAgdHlwZV9uYW1lOiBcIkZvb1wiIGV4dGVuZGVlOiBcIk1lc3NhZ2VTZXRcIiB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBFeHRlbnNpb25zIG9mIE1lc3NhZ2VTZXRzIG11c3QgYmUgb3B0aW9uYWwgIgorICAgICAgIm1lc3NhZ2VzLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZEluTWVzc2FnZVNldCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIG9wdGlvbnMgeyBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdDogdHJ1ZSB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogMSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogRm9vLmZvbzogTkFNRTogTWVzc2FnZVNldHMgY2Fubm90IGhhdmUgZmllbGRzLCBvbmx5ICIKKyAgICAgICJleHRlbnNpb25zLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBOZWdhdGl2ZUV4dGVuc2lvblJhbmdlTnVtYmVyKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IC0xMCBlbmQ6IC0xIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBFeHRlbnNpb24gbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBIdWdlRXh0ZW5zaW9uUmFuZ2VOdW1iZXIpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDB4NzAwMDAwMDAgfSIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogRm9vOiBOVU1CRVI6IEV4dGVuc2lvbiBudW1iZXJzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gIgorICAgICAgIjUzNjg3MDkxMS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRXh0ZW5zaW9uUmFuZ2VFbmRCZWZvcmVTdGFydCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDEwIH0iCisgICAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMTAgZW5kOiA1IH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBFeHRlbnNpb24gcmFuZ2UgZW5kIG51bWJlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAiCisgICAgICAic3RhcnQgbnVtYmVyLlxuIgorICAgICAgImZvby5wcm90bzogRm9vOiBOVU1CRVI6IEV4dGVuc2lvbiByYW5nZSBlbmQgbnVtYmVyIG11c3QgYmUgZ3JlYXRlciB0aGFuICIKKyAgICAgICJzdGFydCBudW1iZXIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVtcHR5RW51bSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgImVudW1fdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSIKKyAgICAgIC8vIEFsc28gdXNlIHRoZSBlbXB0eSBlbnVtIGluIGEgbWVzc2FnZSB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGNyYXNoZXMKKyAgICAgIC8vIGR1cmluZyB2YWxpZGF0aW9uIChwb3NzaWJsZSBpZiB0aGUgY29kZSBhdHRlbXB0cyB0byBkZXJpdmUgYSBkZWZhdWx0CisgICAgICAvLyB2YWx1ZSBmb3IgdGhlIGZpZWxkKS4KKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiQmFyXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAgICJ0eXBlX25hbWU6XCJGb29cIiB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOiBcImJhclwiIG51bWJlcjogMiBsYWJlbDpMQUJFTF9PUFRJT05BTCAiCisgICAgICAidHlwZV9uYW1lOlwiRm9vXCIgIgorICAgICAgIiAgICAgICAgICBkZWZhdWx0X3ZhbHVlOiBcIk5PX1NVQ0hfVkFMVUVcIiB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IEVudW1zIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgdmFsdWUuXG4iCisgICAgICAiZm9vLnByb3RvOiBCYXIuYmFyOiBERUZBVUxUX1ZBTFVFOiBFbnVtIHR5cGUgXCJGb29cIiBoYXMgbm8gdmFsdWUgbmFtZWQgIgorICAgICAgIlwiTk9fU1VDSF9WQUxVRVwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbmRlZmluZWRFeHRlbmRlZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGV4dGVuc2lvbiB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIiCisgICAgICAiICAgICAgICAgICAgICBleHRlbmRlZTogXCJCYXJcIiB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBFWFRFTkRFRTogXCJCYXJcIiBpcyBub3QgZGVmaW5lZC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTm9uTWVzc2FnZUV4dGVuZGVlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB2YWx1ZSB7IG5hbWU6XCJEVU1NWVwiIG51bWJlcjowIH0gfSIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBleHRlbnNpb24geyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIgorICAgICAgIiAgICAgICAgICAgICAgZXh0ZW5kZWU6IFwiQmFyXCIgfSIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogRm9vLmZvbzogRVhURU5ERUU6IFwiQmFyXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBOb3RBbkV4dGVuc2lvbk51bWJlcikgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJCYXJcIiIKKyAgICAgICJ9IgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGV4dGVuc2lvbiB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIiCisgICAgICAiICAgICAgICAgICAgICBleHRlbmRlZTogXCJCYXJcIiB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBOVU1CRVI6IFwiQmFyXCIgZG9lcyBub3QgZGVjbGFyZSAxIGFzIGFuIGV4dGVuc2lvbiAiCisgICAgICAibnVtYmVyLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXF1aXJlZEV4dGVuc2lvbikgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJCYXJcIiIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxMDAwIGVuZDogMTAwMDAgfSIKKyAgICAgICJ9IgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGV4dGVuc2lvbiB7IgorICAgICAgIiAgICBuYW1lOlwiZm9vXCIiCisgICAgICAiICAgIG51bWJlcjoxMDAwIgorICAgICAgIiAgICBsYWJlbDpMQUJFTF9SRVFVSVJFRCIKKyAgICAgICIgICAgdHlwZTpUWVBFX0lOVDMyIgorICAgICAgIiAgICBleHRlbmRlZTogXCJCYXJcIiIKKyAgICAgICIgIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFRoZSBleHRlbnNpb24gRm9vLmZvbyBjYW5ub3QgYmUgcmVxdWlyZWQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFVuZGVmaW5lZEZpZWxkVHlwZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhclwiIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiQmFyXCIgaXMgbm90IGRlZmluZWQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFVuZGVmaW5lZEZpZWxkVHlwZVdpdGhEZWZhdWx0KSB7CisgIC8vIFNlZSBiLzEyNTMzNTgyLiBQcmV2aW91c2x5IHRoaXMgZmFpbGVkIGJlY2F1c2UgdGhlIGRlZmF1bHQgdmFsdWUgd2FzIG5vdAorICAvLyBhY2NlcHRlZCBieSB0aGUgcGFyc2VyLCB3aGljaCBhc3N1bWVkIGFuIGVudW0gdHlwZSwgbGVhZGluZyB0byBhbiB1bmNsZWFyCisgIC8vIGVycm9yIG1lc3NhZ2UuIFdlIHdhbnQgdGhpcyBpbnB1dCB0byB5aWVsZCBhIHZhbGlkYXRpb24gZXJyb3IgaW5zdGVhZCwKKyAgLy8gc2luY2UgdGhlIHVua25vd24gdHlwZSBpcyB0aGUgcHJpbWFyeSBwcm9ibGVtLgorICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcImludFwiICIKKyAgICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTpcIjFcIiB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBcImludFwiIGlzIG5vdCBkZWZpbmVkLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbmRlZmluZWROZXN0ZWRGaWVsZFR5cGUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6XCJCYXpcIiB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEiCisgICAgICAiICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIgorICAgICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJGb28uQmF6LkJhclwiIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiRm9vLkJhei5CYXJcIiBpcyBub3QgZGVmaW5lZC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRUeXBlRGVmaW5lZEluVW5kZWNsYXJlZERlcGVuZGVuY3kpIHsKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSAiKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhclwiIH0iCisgICAgICAifSIsCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBcIkJhclwiIHNlZW1zIHRvIGJlIGRlZmluZWQgaW4gXCJiYXIucHJvdG9cIiwgIgorICAgICAgIndoaWNoIGlzIG5vdCBpbXBvcnRlZCBieSBcImZvby5wcm90b1wiLiAgVG8gdXNlIGl0IGhlcmUsIHBsZWFzZSBhZGQgdGhlICIKKyAgICAgICJuZWNlc3NhcnkgaW1wb3J0LlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZFR5cGVEZWZpbmVkSW5JbmRpcmVjdERlcGVuZGVuY3kpIHsKKyAgLy8gVGVzdCBmb3IgaGlkZGVuIGRlcGVuZGVuY2llcy4KKyAgLy8KKyAgLy8gLy8gYmFyLnByb3RvCisgIC8vIG1lc3NhZ2UgQmFye30KKyAgLy8KKyAgLy8gLy8gZm9yd2FyZC5wcm90bworICAvLyBpbXBvcnQgImJhci5wcm90byIKKyAgLy8KKyAgLy8gLy8gZm9vLnByb3RvCisgIC8vIGltcG9ydCAiZm9yd2FyZC5wcm90byIKKyAgLy8gbWVzc2FnZSBGb28geworICAvLyAgIG9wdGlvbmFsIEJhciBmb28gPSAxOyAgLy8gRXJyb3IsIG5lZWRzIHRvIGltcG9ydCBiYXIucHJvdG8gZXhwbGljaXRseS4KKyAgLy8gfQorICAvLworICBCdWlsZEZpbGUoCisgICAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJCYXJcIiB9Iik7CisKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiZm9yd2FyZC5wcm90b1wiIgorICAgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIiKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgImRlcGVuZGVuY3k6IFwiZm9yd2FyZC5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJCYXJcIiB9IgorICAgICAgIn0iLAorICAgICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogXCJCYXJcIiBzZWVtcyB0byBiZSBkZWZpbmVkIGluIFwiYmFyLnByb3RvXCIsICIKKyAgICAgICJ3aGljaCBpcyBub3QgaW1wb3J0ZWQgYnkgXCJmb28ucHJvdG9cIi4gIFRvIHVzZSBpdCBoZXJlLCBwbGVhc2UgYWRkIHRoZSAiCisgICAgICAibmVjZXNzYXJ5IGltcG9ydC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRUeXBlRGVmaW5lZEluUHVibGljRGVwZW5kZW5jeSkgeworICAvLyBUZXN0IGZvciBwdWJsaWMgZGVwZW5kZW5jaWVzLgorICAvLworICAvLyAvLyBiYXIucHJvdG8KKyAgLy8gbWVzc2FnZSBCYXJ7fQorICAvLworICAvLyAvLyBmb3J3YXJkLnByb3RvCisgIC8vIGltcG9ydCBwdWJsaWMgImJhci5wcm90byIKKyAgLy8KKyAgLy8gLy8gZm9vLnByb3RvCisgIC8vIGltcG9ydCAiZm9yd2FyZC5wcm90byIKKyAgLy8gbWVzc2FnZSBGb28geworICAvLyAgIG9wdGlvbmFsIEJhciBmb28gPSAxOyAgLy8gQ29ycmVjdC4gImJhci5wcm90byIgaXMgcHVibGljIGltcG9ydGVkIGludG8KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcndhcmQucHJvdG8sIHNvIHdoZW4gImZvby5wcm90byIgaW1wb3J0cworICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImZvcndhcmQucHJvdG8iLCBpdCBpbXBvcnRzICJiYXIucHJvdG8iIHRvby4KKyAgLy8gfQorICAvLworICBCdWlsZEZpbGUoCisgICAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJCYXJcIiB9Iik7CisKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiZm9yd2FyZC5wcm90b1wiIgorICAgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIgIgorICAgICAgInB1YmxpY19kZXBlbmRlbmN5OiAwIik7CisKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgImRlcGVuZGVuY3k6IFwiZm9yd2FyZC5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJCYXJcIiB9IgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkVHlwZURlZmluZWRJblRyYW5zaXRpdmVQdWJsaWNEZXBlbmRlbmN5KSB7CisgIC8vIFRlc3QgZm9yIHB1YmxpYyBkZXBlbmRlbmNpZXMuCisgIC8vCisgIC8vIC8vIGJhci5wcm90bworICAvLyBtZXNzYWdlIEJhcnt9CisgIC8vCisgIC8vIC8vIGZvcndhcmQucHJvdG8KKyAgLy8gaW1wb3J0IHB1YmxpYyAiYmFyLnByb3RvIgorICAvLworICAvLyAvLyBmb3J3YXJkMi5wcm90bworICAvLyBpbXBvcnQgcHVibGljICJmb3J3YXJkLnByb3RvIgorICAvLworICAvLyAvLyBmb28ucHJvdG8KKyAgLy8gaW1wb3J0ICJmb3J3YXJkMi5wcm90byIKKyAgLy8gbWVzc2FnZSBGb28geworICAvLyAgIG9wdGlvbmFsIEJhciBmb28gPSAxOyAgLy8gQ29ycmVjdCwgcHVibGljIGltcG9ydHMgYXJlIHRyYW5zaXRpdmUuCisgIC8vIH0KKyAgLy8KKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSIpOworCisgIEJ1aWxkRmlsZSgKKyAgICAgICJuYW1lOiBcImZvcndhcmQucHJvdG9cIiIKKyAgICAgICJkZXBlbmRlbmN5OiBcImJhci5wcm90b1wiICIKKyAgICAgICJwdWJsaWNfZGVwZW5kZW5jeTogMCIpOworCisgIEJ1aWxkRmlsZSgKKyAgICAgICJuYW1lOiBcImZvcndhcmQyLnByb3RvXCIiCisgICAgICAiZGVwZW5kZW5jeTogXCJmb3J3YXJkLnByb3RvXCIgIgorICAgICAgInB1YmxpY19kZXBlbmRlbmN5OiAwIik7CisKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgImRlcGVuZGVuY3k6IFwiZm9yd2FyZDIucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiQmFyXCIgfSIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LAorICAgICAgIEZpZWxkVHlwZURlZmluZWRJblByaXZhdGVEZXBlbmRlbmN5T2ZQdWJsaWNEZXBlbmRlbmN5KSB7CisgIC8vIFRlc3QgZm9yIHB1YmxpYyBkZXBlbmRlbmNpZXMuCisgIC8vCisgIC8vIC8vIGJhci5wcm90bworICAvLyBtZXNzYWdlIEJhcnt9CisgIC8vCisgIC8vIC8vIGZvcndhcmQucHJvdG8KKyAgLy8gaW1wb3J0ICJiYXIucHJvdG8iCisgIC8vCisgIC8vIC8vIGZvcndhcmQyLnByb3RvCisgIC8vIGltcG9ydCBwdWJsaWMgImZvcndhcmQucHJvdG8iCisgIC8vCisgIC8vIC8vIGZvby5wcm90bworICAvLyBpbXBvcnQgImZvcndhcmQyLnByb3RvIgorICAvLyBtZXNzYWdlIEZvbyB7CisgIC8vICAgb3B0aW9uYWwgQmFyIGZvbyA9IDE7ICAvLyBFcnJvciwgdGhlICJiYXIucHJvdG8iIGlzIG5vdCBwdWJsaWMgaW1wb3J0ZWQKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludG8gImZvcndhcmQucHJvdG8iLCBzbyB3aWxsIG5vdCBiZSBpbXBvcnRlZAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50byBlaXRoZXIgImZvcndhcmQyLnByb3RvIiBvciAiZm9vLnByb3RvIi4KKyAgLy8gfQorICAvLworICBCdWlsZEZpbGUoCisgICAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJCYXJcIiB9Iik7CisKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiZm9yd2FyZC5wcm90b1wiIgorICAgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIiKTsKKworICBCdWlsZEZpbGUoCisgICAgICAibmFtZTogXCJmb3J3YXJkMi5wcm90b1wiIgorICAgICAgImRlcGVuZGVuY3k6IFwiZm9yd2FyZC5wcm90b1wiICIKKyAgICAgICJwdWJsaWNfZGVwZW5kZW5jeTogMCIpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJmb3J3YXJkMi5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJCYXJcIiB9IgorICAgICAgIn0iLAorICAgICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogXCJCYXJcIiBzZWVtcyB0byBiZSBkZWZpbmVkIGluIFwiYmFyLnByb3RvXCIsICIKKyAgICAgICJ3aGljaCBpcyBub3QgaW1wb3J0ZWQgYnkgXCJmb28ucHJvdG9cIi4gIFRvIHVzZSBpdCBoZXJlLCBwbGVhc2UgYWRkIHRoZSAiCisgICAgICAibmVjZXNzYXJ5IGltcG9ydC5cbiIpOworfQorCisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBTZWFyY2hNb3N0TG9jYWxGaXJzdCkgeworICAvLyBUaGUgZm9sbG93aW5nIHNob3VsZCBwcm9kdWNlIGFuIGVycm9yIHRoYXQgQmFyLkJheiBpcyByZXNvbHZlZCBidXQKKyAgLy8gbm90IGRlZmluZWQ6CisgIC8vICAgbWVzc2FnZSBCYXIgeyBtZXNzYWdlIEJheiB7fSB9CisgIC8vICAgbWVzc2FnZSBGb28geworICAvLyAgICAgbWVzc2FnZSBCYXIgeworICAvLyAgICAgICAvLyBQbGFjaW5nICJtZXNzYWdlIEJhent9IiBoZXJlLCBvciByZW1vdmluZyBGb28uQmFyIGFsdG9nZXRoZXIsCisgIC8vICAgICAgIC8vIHdvdWxkIGZpeCB0aGUgZXJyb3IuCisgIC8vICAgICB9CisgIC8vICAgICBvcHRpb25hbCBCYXIuQmF6IGJheiA9IDE7CisgIC8vICAgfQorICAvLyBBbiBvbmUgcG9pbnQgdGhlIGxvb2t1cCBjb2RlIGluY29ycmVjdGx5IGRpZCBub3QgcHJvZHVjZSBhbiBlcnJvciBpbiB0aGlzCisgIC8vIGNhc2UsIGJlY2F1c2Ugd2hlbiBsb29raW5nIGZvciBCYXIuQmF6LCBpdCB3b3VsZCB0cnkgIkZvby5CYXIuQmF6IiBmaXJzdCwKKyAgLy8gZmFpbCwgYW5kIHRlbiB0cnkgIkJhci5CYXoiIGFuZCBzdWNjZWVkLCBldmVuIHRob3VnaCAiQmFyIiBzaG91bGQgYWN0dWFsbHkKKyAgLy8gcmVmZXIgdG8gdGhlIGlubmVyIEJhciwgbm90IHRoZSBvdXRlciBvbmUuCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkJhclwiIgorICAgICAgIiAgbmVzdGVkX3R5cGUgeyBuYW1lOiBcIkJhelwiIH0iCisgICAgICAifSIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImJhelwiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIgorICAgICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJCYXIuQmF6XCIgfSIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogRm9vLmJhejogVFlQRTogXCJCYXIuQmF6XCIgaXMgcmVzb2x2ZWQgdG8gXCJGb28uQmFyLkJhelwiLCIKKyAgICAgICIgd2hpY2ggaXMgbm90IGRlZmluZWQuIFRoZSBpbm5lcm1vc3Qgc2NvcGUgaXMgc2VhcmNoZWQgZmlyc3QgaW4gbmFtZSAiCisgICAgICAicmVzb2x1dGlvbi4gQ29uc2lkZXIgdXNpbmcgYSBsZWFkaW5nICcuJyhpLmUuLCBcIi5CYXIuQmF6XCIpIHRvIHN0YXJ0ICIKKyAgICAgICJmcm9tIHRoZSBvdXRlcm1vc3Qgc2NvcGUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFNlYXJjaE1vc3RMb2NhbEZpcnN0MikgeworICAvLyBUaGlzIHRlc3Qgd291bGQgZmluZCB0aGUgbW9zdCBsb2NhbCAiQmFyIiBmaXJzdCwgYW5kIGRvZXMsIGJ1dAorICAvLyBwcm9jZWVkcyB0byBmaW5kIHRoZSBvdXRlciBvbmUgYmVjYXVzZSB0aGUgaW5uZXIgb25lJ3Mgbm90IGFuCisgIC8vIGFnZ3JlZ2F0ZS4KKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJCYXJcIiIKKyAgICAgICIgIG5lc3RlZF90eXBlIHsgbmFtZTogXCJCYXpcIiB9IgorICAgICAgIn0iCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOiBcIkJhclwiIG51bWJlcjoxIHR5cGU6VFlQRV9CWVRFUyB9ICIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImJhelwiIG51bWJlcjoyIGxhYmVsOkxBQkVMX09QVElPTkFMIgorICAgICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJCYXIuQmF6XCIgfSIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBQYWNrYWdlT3JpZ2luYWxseURlY2xhcmVkSW5UcmFuc2l0aXZlRGVwZW5kZW50KSB7CisgIC8vIEltYWdpbmUgd2UgaGF2ZSB0aGUgZm9sbG93aW5nOgorICAvLworICAvLyBmb28ucHJvdG86CisgIC8vICAgcGFja2FnZSBmb28uYmFyOworICAvLyBiYXIucHJvdG86CisgIC8vICAgcGFja2FnZSBmb28uYmFyOworICAvLyAgIGltcG9ydCAiZm9vLnByb3RvIjsKKyAgLy8gICBtZXNzYWdlIEJhciB7fQorICAvLyBiYXoucHJvdG86CisgIC8vICAgcGFja2FnZSBmb287CisgIC8vICAgaW1wb3J0ICJiYXIucHJvdG8iCisgIC8vICAgbWVzc2FnZSBCYXogeyBvcHRpb25hbCBiYXIuQmFyIG1vbyA9IDE7IH0KKyAgLy8KKyAgLy8gV2hlbiB2YWxpZGF0aW5nIGJhei5wcm90bywgd2Ugd2lsbCBsb29rIHVwICJiYXIuQmFyIi4gIEFzIHBhcnQgb2YgdGhpcworICAvLyBsb29rdXAsIHdlIGZpcnN0IGxvb2t1cCAiYmFyIiB0aGVuIHRyeSB0byBmaW5kICJCYXIiIHdpdGhpbiBpdC4gICJiYXIiCisgIC8vIHNob3VsZCByZXNvbHZlIHRvICJmb28uYmFyIi4gIE5vdGUsIHRob3VnaCwgdGhhdCAiZm9vLmJhciIgd2FzIG9yaWdpbmFsbHkKKyAgLy8gZGVmaW5lZCBpbiBmb28ucHJvdG8sIHdoaWNoIGlzIG5vdCBhIGRpcmVjdCBkZXBlbmRlbmN5IG9mIGJhei5wcm90by4gIFRoZQorICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBGaW5kU3ltYm9sKCkgbm9ybWFsbHkgb25seSByZXR1cm5zIHN5bWJvbHMgaW4gZGlyZWN0CisgIC8vIGRlcGVuZGVuY2llcywgbm90IGluZGlyZWN0IG9uZXMuICBUaGlzIHRlc3QgaW5zdXJlcyB0aGF0IHRoaXMgZG9lcyBub3QKKyAgLy8gcHJldmVudCBpdCBmcm9tIGZpbmRpbmcgImZvby5iYXIiLgorCisgIEJ1aWxkRmlsZSgKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJwYWNrYWdlOiBcImZvby5iYXJcIiAiKTsKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICAgInBhY2thZ2U6IFwiZm9vLmJhclwiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkJhclwiIH0iKTsKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiYmF6LnByb3RvXCIgIgorICAgICAgInBhY2thZ2U6IFwiZm9vXCIgIgorICAgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6IFwiQmF6XCIgIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwibW9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJiYXIuQmFyXCIgfSIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZFR5cGVOb3RBVHlwZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAgICIgICAgICAgICAgdHlwZV9uYW1lOlwiLkZvby5iYXJcIiB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiYmFyXCIgbnVtYmVyOjIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiLkZvby5iYXJcIiBpcyBub3QgYSB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZWxhdGl2ZUZpZWxkVHlwZU5vdEFUeXBlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuZXN0ZWRfdHlwZSB7IgorICAgICAgIiAgICBuYW1lOiBcIkJhclwiIgorICAgICAgIiAgICBmaWVsZCB7IG5hbWU6XCJCYXpcIiBudW1iZXI6MiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAgICIgIH0iCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJCYXIuQmF6XCIgfSIKKyAgICAgICJ9IiwKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiQmFyLkJhelwiIGlzIG5vdCBhIHR5cGUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkVHlwZU1heUJlSXRzTmFtZSkgeworICBCdWlsZEZpbGUoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkJhclwiIgorICAgICAgIn0iCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiQmFyXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiQmFyXCIgfSIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtRmllbGRUeXBlSXNNZXNzYWdlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJCYXJcIiB9ICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfRU5VTSIKKyAgICAgICIgICAgICAgICAgdHlwZV9uYW1lOlwiQmFyXCIgfSIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogXCJCYXJcIiBpcyBub3QgYW4gZW51bSB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNZXNzYWdlRmllbGRUeXBlSXNFbnVtKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB2YWx1ZSB7IG5hbWU6XCJEVU1NWVwiIG51bWJlcjowIH0gfSAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX01FU1NBR0UiCisgICAgICAiICAgICAgICAgIHR5cGVfbmFtZTpcIkJhclwiIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiQmFyXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBCYWRFbnVtRGVmYXVsdFZhbHVlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB2YWx1ZSB7IG5hbWU6XCJEVU1NWVwiIG51bWJlcjowIH0gfSAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiQmFyXCIiCisgICAgICAiICAgICAgICAgIGRlZmF1bHRfdmFsdWU6XCJOT19TVUNIX1ZBTFVFXCIgfSIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogRm9vLmZvbzogREVGQVVMVF9WQUxVRTogRW51bSB0eXBlIFwiQmFyXCIgaGFzIG5vIHZhbHVlIG5hbWVkICIKKyAgICAgICJcIk5PX1NVQ0hfVkFMVUVcIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bURlZmF1bHRWYWx1ZUlzSW50ZWdlcikgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgImVudW1fdHlwZSB7IG5hbWU6IFwiQmFyXCIgdmFsdWUgeyBuYW1lOlwiRFVNTVlcIiBudW1iZXI6MCB9IH0gIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhclwiIgorICAgICAgIiAgICAgICAgICBkZWZhdWx0X3ZhbHVlOlwiMFwiIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IERFRkFVTFRfVkFMVUU6IERlZmF1bHQgdmFsdWUgZm9yIGFuIGVudW0gZmllbGQgbXVzdCAiCisgICAgICAiYmUgYW4gaWRlbnRpZmllci5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUHJpbWl0aXZlV2l0aFR5cGVOYW1lKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIgorICAgICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJGb29cIiB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBGaWVsZCB3aXRoIHByaW1pdGl2ZSB0eXBlIGhhcyB0eXBlX25hbWUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5vblByaW1pdGl2ZVdpdGhvdXRUeXBlTmFtZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9NRVNTQUdFIH0iCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IEZpZWxkIHdpdGggbWVzc2FnZSBvciBlbnVtIHR5cGUgbWlzc2luZyAiCisgICAgICAidHlwZV9uYW1lLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBPbmVvZldpdGhOb0ZpZWxkcykgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAgICIgIG9uZW9mX2RlY2wgeyBuYW1lOlwiYmFyXCIgfSIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogRm9vLmJhcjogTkFNRTogT25lb2YgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBmaWVsZC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgT25lb2ZMYWJlbE1pc21hdGNoKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfUkVQRUFURUQgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6MCB9IgorICAgICAgIiAgb25lb2ZfZGVjbCB7IG5hbWU6XCJiYXJcIiB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBOQU1FOiBGaWVsZHMgb2Ygb25lb2ZzIG11c3QgdGhlbXNlbHZlcyBoYXZlIGxhYmVsICIKKyAgICAgICJMQUJFTF9PUFRJT05BTC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW5wdXRUeXBlTm90RGVmaW5lZCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSAiCisgICAgICAic2VydmljZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0U2VydmljZVwiIgorICAgICAgIiAgbWV0aG9kIHsgbmFtZTogXCJBXCIgaW5wdXRfdHlwZTogXCJCYXJcIiBvdXRwdXRfdHlwZTogXCJGb29cIiB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBUZXN0U2VydmljZS5BOiBJTlBVVF9UWVBFOiBcIkJhclwiIGlzIG5vdCBkZWZpbmVkLlxuIgorICApOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW5wdXRUeXBlTm90QU1lc3NhZ2UpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0gIgorICAgICAgImVudW1fdHlwZSB7IG5hbWU6IFwiQmFyXCIgdmFsdWUgeyBuYW1lOlwiRFVNTVlcIiBudW1iZXI6MCB9IH0gIgorICAgICAgInNlcnZpY2UgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdFNlcnZpY2VcIiIKKyAgICAgICIgIG1ldGhvZCB7IG5hbWU6IFwiQVwiIGlucHV0X3R5cGU6IFwiQmFyXCIgb3V0cHV0X3R5cGU6IFwiRm9vXCIgfSIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogVGVzdFNlcnZpY2UuQTogSU5QVVRfVFlQRTogXCJCYXJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuXG4iCisgICk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBPdXRwdXRUeXBlTm90RGVmaW5lZCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSAiCisgICAgICAic2VydmljZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0U2VydmljZVwiIgorICAgICAgIiAgbWV0aG9kIHsgbmFtZTogXCJBXCIgaW5wdXRfdHlwZTogXCJGb29cIiBvdXRwdXRfdHlwZTogXCJCYXJcIiB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBUZXN0U2VydmljZS5BOiBPVVRQVVRfVFlQRTogXCJCYXJcIiBpcyBub3QgZGVmaW5lZC5cbiIKKyAgKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE91dHB1dFR5cGVOb3RBTWVzc2FnZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSAiCisgICAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB2YWx1ZSB7IG5hbWU6XCJEVU1NWVwiIG51bWJlcjowIH0gfSAiCisgICAgICAic2VydmljZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0U2VydmljZVwiIgorICAgICAgIiAgbWV0aG9kIHsgbmFtZTogXCJBXCIgaW5wdXRfdHlwZTogXCJGb29cIiBvdXRwdXRfdHlwZTogXCJCYXJcIiB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBUZXN0U2VydmljZS5BOiBPVVRQVVRfVFlQRTogXCJCYXJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuXG4iCisgICk7Cit9CisKKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIElsbGVnYWxQYWNrZWRGaWVsZCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7XG4iCisgICAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwicGFja2VkX3N0cmluZ1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX1JFUEVBVEVEICIKKyAgICAgICIgICAgICAgICAgdHlwZTpUWVBFX1NUUklORyAiCisgICAgICAiICAgICAgICAgIG9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IgorICAgICAgIiAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwicGFja2VkXCIgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9IgorICAgICAgIiAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwidHJ1ZVwiIH19fVxuIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwicGFja2VkX21lc3NhZ2VcIiBudW1iZXI6MyBsYWJlbDpMQUJFTF9SRVBFQVRFRCAiCisgICAgICAiICAgICAgICAgIHR5cGVfbmFtZTogXCJGb29cIiIKKyAgICAgICIgICAgICAgICAgb3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsiCisgICAgICAiICAgICAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJwYWNrZWRcIiBpc19leHRlbnNpb246IGZhbHNlIH0iCisgICAgICAiICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJ0cnVlXCIgfX19XG4iCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJvcHRpb25hbF9pbnQzMlwiIG51bWJlcjogNCBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIiAgICAgICAgICBvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyIKKyAgICAgICIgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcInBhY2tlZFwiIGlzX2V4dGVuc2lvbjogZmFsc2UgfSIKKyAgICAgICIgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcInRydWVcIiB9fX1cbiIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogRm9vLnBhY2tlZF9zdHJpbmc6IFRZUEU6IFtwYWNrZWQgPSB0cnVlXSBjYW4gb25seSBiZSAiCisgICAgICAic3BlY2lmaWVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzLlxuIgorICAgICAgImZvby5wcm90bzogRm9vLnBhY2tlZF9tZXNzYWdlOiBUWVBFOiBbcGFja2VkID0gdHJ1ZV0gY2FuIG9ubHkgYmUgIgorICAgICAgInNwZWNpZmllZCBmb3IgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkcy5cbiIKKyAgICAgICJmb28ucHJvdG86IEZvby5vcHRpb25hbF9pbnQzMjogVFlQRTogW3BhY2tlZCA9IHRydWVdIGNhbiBvbmx5IGJlICIKKyAgICAgICJzcGVjaWZpZWQgZm9yIHJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZHMuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE9wdGlvbldyb25nVHlwZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfU1RSSU5HICIKKyAgICAgICIgICAgICAgICAgb3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJjdHlwZVwiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgfSIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxIH0iCisgICAgICAiICAgICAgICAgIH0iCisgICAgICAiICB9IgorICAgICAgIn1cbiIsCisKKyAgICAgICJmb28ucHJvdG86IFRlc3RNZXNzYWdlLmZvbzogT1BUSU9OX1ZBTFVFOiBWYWx1ZSBtdXN0IGJlIGlkZW50aWZpZXIgZm9yICIKKyAgICAgICJlbnVtLXZhbHVlZCBvcHRpb24gXCJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmN0eXBlXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE9wdGlvbkV4dGVuZHNBdG9taWNUeXBlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiICIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9TVFJJTkcgIgorICAgICAgIiAgICAgICAgICBvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImN0eXBlXCIgIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9IgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9IgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEgfSIKKyAgICAgICIgICAgICAgICAgfSIKKyAgICAgICIgIH0iCisgICAgICAifVxuIiwKKworICAgICAgImZvby5wcm90bzogVGVzdE1lc3NhZ2UuZm9vOiBPUFRJT05fTkFNRTogT3B0aW9uIFwiY3R5cGVcIiBpcyBhbiAiCisgICAgICAiYXRvbWljIHR5cGUsIG5vdCBhIG1lc3NhZ2UuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIER1cE9wdGlvbikgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfVUlOVDMyICIKKyAgICAgICIgICAgICAgICAgb3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJjdHlwZVwiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgfSIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJDT1JEXCIgfSIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJjdHlwZVwiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgfSIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJDT1JEXCIgfSIKKyAgICAgICIgICAgICAgICAgfSIKKyAgICAgICIgIH0iCisgICAgICAifVxuIiwKKworICAgICAgImZvby5wcm90bzogVGVzdE1lc3NhZ2UuZm9vOiBPUFRJT05fTkFNRTogT3B0aW9uIFwiY3R5cGVcIiB3YXMgIgorICAgICAgImFscmVhZHkgc2V0LlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnZhbGlkT3B0aW9uTmFtZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfQk9PTCAiCisgICAgICAiICAgICAgICAgIG9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJ1bmludGVycHJldGVkX29wdGlvblwiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgfSIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgIH0iCisgICAgICAiICAgICAgICAgIH0iCisgICAgICAiICB9IgorICAgICAgIn1cbiIsCisKKyAgICAgICJmb28ucHJvdG86IFRlc3RNZXNzYWdlLmZvbzogT1BUSU9OX05BTUU6IE9wdGlvbiBtdXN0IG5vdCB1c2UgIgorICAgICAgInJlc2VydmVkIG5hbWUgXCJ1bmludGVycHJldGVkX29wdGlvblwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXBlYXRlZE1lc3NhZ2VPcHRpb24pIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZTogeyBuYW1lOiBcIkJhclwiIGZpZWxkOiB7ICIKKyAgICAgICIgIG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxIGxhYmVsOiBMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX0lOVDMyIH0gIgorICAgICAgIn0gIgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiYmFyXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9SRVBFQVRFRCAiCisgICAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9NRVNTQUdFIHR5cGVfbmFtZTogXCJCYXJcIiAiCisgICAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImJhclwiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0gIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMSB9IH0iLAorCisgICAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9OQU1FOiBPcHRpb24gZmllbGQgXCIoYmFyKVwiIGlzIGEgIgorICAgICAgInJlcGVhdGVkIG1lc3NhZ2UuIFJlcGVhdGVkIG1lc3NhZ2Ugb3B0aW9ucyBtdXN0IGJlIGluaXRpYWxpemVkICIKKyAgICAgICJ1c2luZyBhbiBhZ2dyZWdhdGUgdmFsdWUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFJlc29sdmVVbmRlZmluZWRPcHRpb24pIHsKKyAgLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgcHJvZHVjZSBhbiBlcnJvciB0aGF0IGJhei5iYXIgaXMgcmVzb2x2ZWQgYnV0IG5vdAorICAvLyBkZWZpbmVkLgorICAvLyBmb28ucHJvdG86CisgIC8vICAgcGFja2FnZSBiYXoKKyAgLy8gICBpbXBvcnQgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8KKyAgLy8gICBtZXNzYWdlIEJhciB7IG9wdGlvbmFsIGludDMyIGZvbyA9IDE7IH0KKyAgLy8gICBleHRlbmQgRmlsZU9wdGlvbnMgeyBvcHRpb25hbCBCYXIgYmFyID0gNzY3Mjc1NzsgfQorICAvLworICAvLyBtb28ucHJvdG86CisgIC8vICAgcGFja2FnZSBtb28uYmF6CisgIC8vICAgb3B0aW9uIChiYXouYmFyKS5mb28gPSAxOworICAvLworICAvLyBBbHRob3VnaCAiYmF6LmJhciIgaXMgYWxyZWFkeSBkZWZpbmVkLCB0aGUgbG9va3VwIGNvZGUgd2lsbCB0cnkKKyAgLy8gIm1vby5iYXouYmFyIiwgc2luY2UgaXQncyB0aGUgbWF0Y2ggZnJvbSB0aGUgaW5uZXJtb3N0IHNjb3BlLCB3aGljaCB3aWxsCisgIC8vIGNhdXNlIGEgc3ltYm9sIG5vdCBkZWZpbmVkIGVycm9yLgorICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGUoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAicGFja2FnZTogXCJiYXpcIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGU6IHsgbmFtZTogXCJCYXJcIiBmaWVsZDogeyAiCisgICAgICAiICBuYW1lOiBcImZvb1wiIG51bWJlcjogMSBsYWJlbDogTEFCRUxfT1BUSU9OQUwgdHlwZTogVFlQRV9JTlQzMiB9ICIKKyAgICAgICJ9ICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOiBcImJhclwiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfTUVTU0FHRSB0eXBlX25hbWU6IFwiQmFyXCIgIgorICAgICAgIiAgICAgICAgICAgIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwibW9vLnByb3RvXCIgIgorICAgICAgInBhY2thZ2U6IFwibW9vLmJhelwiICIKKyAgICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImJhei5iYXJcIiAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9ICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEgfSB9IiwKKworICAgICAgIm1vby5wcm90bzogbW9vLnByb3RvOiBPUFRJT05fTkFNRTogT3B0aW9uIFwiKGJhei5iYXIpXCIgaXMgcmVzb2x2ZWQgdG8gIgorICAgICAgIlwiKG1vby5iYXouYmFyKVwiLCIKKyAgICAgICIgd2hpY2ggaXMgbm90IGRlZmluZWQuIFRoZSBpbm5lcm1vc3Qgc2NvcGUgaXMgc2VhcmNoZWQgZmlyc3QgaW4gbmFtZSAiCisgICAgICAicmVzb2x1dGlvbi4gQ29uc2lkZXIgdXNpbmcgYSBsZWFkaW5nICcuJyhpLmUuLCBcIiguYmF6LmJhcilcIikgdG8gc3RhcnQgIgorICAgICAgImZyb20gdGhlIG91dGVybW9zdCBzY29wZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgVW5rbm93bk9wdGlvbikgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwibW9vLnByb3RvXCIgIgorICAgICAgInBhY2thZ2U6IFwibW9vLmJhelwiICIKKyAgICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImJhYXouYmFyXCIgIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgfSAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxIH0gfSIsCisKKyAgICAgICJtb28ucHJvdG86IG1vby5wcm90bzogT1BUSU9OX05BTUU6IE9wdGlvbiBcIihiYWF6LmJhcilcIiB1bmtub3duLiAiCisgICAgICAiRW5zdXJlICIKKyAgICAgICJ0aGF0IHlvdXIgcHJvdG8gZGVmaW5pdGlvbiBmaWxlIGltcG9ydHMgdGhlIHByb3RvIHdoaWNoIGRlZmluZXMgdGhlICIKKyAgICAgICJvcHRpb24uXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEN1c3RvbU9wdGlvbkNvbmZsaWN0aW5nRmllbGROdW1iZXIpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vMVwiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfSU5UMzIgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1wiIH0iCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb28yXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9JTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zXCIgfSIsCisKKyAgICAgICJmb28ucHJvdG86IGZvbzI6IE5VTUJFUjogRXh0ZW5zaW9uIG51bWJlciA3NjcyNzU3IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCAiCisgICAgICAiaW4gXCJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zXCIgYnkgZXh0ZW5zaW9uIFwiZm9vMVwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnQzMk9wdGlvblZhbHVlT3V0T2ZQb3NpdGl2ZVJhbmdlKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfSU5UMzIgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMHg4MDAwMDAwMCB9ICIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG91dCBvZiByYW5nZSAiCisgICAgICAiZm9yIGludDMyIG9wdGlvbiBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnQzMk9wdGlvblZhbHVlT3V0T2ZOZWdhdGl2ZVJhbmdlKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfSU5UMzIgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlX2ludF92YWx1ZTogLTB4ODAwMDAwMDEgfSAiCisgICAgICAifSIsCisKKyAgICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBWYWx1ZSBvdXQgb2YgcmFuZ2UgIgorICAgICAgImZvciBpbnQzMiBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW50MzJPcHRpb25WYWx1ZUlzTm90UG9zaXRpdmVJbnQpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9JTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3ZhbHVlOiBcIjVcIiB9IH0iLAorCisgICAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBpbnRlZ2VyICIKKyAgICAgICJmb3IgaW50MzIgb3B0aW9uIFwiZm9vXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEludDY0T3B0aW9uVmFsdWVPdXRPZlJhbmdlKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfSU5UNjQgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMHg4MDAwMDAwMDAwMDAwMDAwICIKKyAgICAgICJ9ICIKKyAgICAgICJ9IiwKKworICAgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG91dCBvZiByYW5nZSAiCisgICAgICAiZm9yIGludDY0IG9wdGlvbiBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnQ2NE9wdGlvblZhbHVlSXNOb3RQb3NpdGl2ZUludCkgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0lOVDY0IGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcIjVcIiB9IH0iLAorCisgICAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBpbnRlZ2VyICIKKyAgICAgICJmb3IgaW50NjQgb3B0aW9uIFwiZm9vXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFVJbnQzMk9wdGlvblZhbHVlT3V0T2ZSYW5nZSkgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX1VJTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAweDEwMDAwMDAwMCB9IH0iLAorCisgICAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgb3V0IG9mIHJhbmdlICIKKyAgICAgICJmb3IgdWludDMyIG9wdGlvbiBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVSW50MzJPcHRpb25WYWx1ZUlzTm90UG9zaXRpdmVJbnQpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9VSU5UMzIgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZV92YWx1ZTogLTUuNiB9IH0iLAorCisgICAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUgaW50ZWdlciAiCisgICAgICAiZm9yIHVpbnQzMiBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgVUludDY0T3B0aW9uVmFsdWVJc05vdFBvc2l0aXZlSW50KSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfVUlOVDY0IGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZV9pbnRfdmFsdWU6IC01IH0gfSIsCisKKyAgICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBWYWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyICIKKyAgICAgICJmb3IgdWludDY0IG9wdGlvbiBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGbG9hdE9wdGlvblZhbHVlSXNOb3ROdW1iZXIpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9GTE9BVCBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3ZhbHVlOiBcImJhclwiIH0gfSIsCisKKyAgICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBWYWx1ZSBtdXN0IGJlIG51bWJlciAiCisgICAgICAiZm9yIGZsb2F0IG9wdGlvbiBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBEb3VibGVPcHRpb25WYWx1ZUlzTm90TnVtYmVyKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfRE9VQkxFIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdmFsdWU6IFwiYmFyXCIgfSB9IiwKKworICAgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG11c3QgYmUgbnVtYmVyICIKKyAgICAgICJmb3IgZG91YmxlIG9wdGlvbiBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBCb29sT3B0aW9uVmFsdWVJc05vdFRydWVPckZhbHNlKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfQk9PTCBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJiYXJcIiB9IH0iLAorCisgICAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBcInRydWVcIiBvciBcImZhbHNlXCIgIgorICAgICAgImZvciBib29sZWFuIG9wdGlvbiBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtT3B0aW9uVmFsdWVJc05vdElkZW50aWZpZXIpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICAgImVudW1fdHlwZSB7IG5hbWU6IFwiRm9vRW51bVwiIHZhbHVlIHsgbmFtZTogXCJCQVJcIiBudW1iZXI6IDEgfSAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgeyBuYW1lOiBcIkJBWlwiIG51bWJlcjogMiB9IH0iCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0VOVU0gdHlwZV9uYW1lOiBcIkZvb0VudW1cIiAiCisgICAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ192YWx1ZTogXCJNT09PXCIgfSB9IiwKKworICAgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG11c3QgYmUgaWRlbnRpZmllciBmb3IgIgorICAgICAgImVudW0tdmFsdWVkIG9wdGlvbiBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtT3B0aW9uVmFsdWVJc05vdEVudW1WYWx1ZU5hbWUpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICAgImVudW1fdHlwZSB7IG5hbWU6IFwiRm9vRW51bVwiIHZhbHVlIHsgbmFtZTogXCJCQVJcIiBudW1iZXI6IDEgfSAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgeyBuYW1lOiBcIkJBWlwiIG51bWJlcjogMiB9IH0iCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0VOVU0gdHlwZV9uYW1lOiBcIkZvb0VudW1cIiAiCisgICAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiTU9PT1wiIH0gfSIsCisKKyAgICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBFbnVtIHR5cGUgXCJGb29FbnVtXCIgaGFzIG5vIHZhbHVlICIKKyAgICAgICJuYW1lZCBcIk1PT09cIiBmb3Igb3B0aW9uIFwiZm9vXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1PcHRpb25WYWx1ZUlzU2libGluZ0VudW1WYWx1ZU5hbWUpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICAgImVudW1fdHlwZSB7IG5hbWU6IFwiRm9vRW51bTFcIiB2YWx1ZSB7IG5hbWU6IFwiQkFSXCIgbnVtYmVyOiAxIH0gIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB7IG5hbWU6IFwiQkFaXCIgbnVtYmVyOiAyIH0gfSIKKyAgICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkZvb0VudW0yXCIgdmFsdWUgeyBuYW1lOiBcIk1PT1wiIG51bWJlcjogMSB9ICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgeyBuYW1lOiBcIk1PT09cIiBudW1iZXI6IDIgfSB9IgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9FTlVNIHR5cGVfbmFtZTogXCJGb29FbnVtMVwiICIKKyAgICAgICIgICAgICAgICAgICBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJNT09PXCIgfSB9IiwKKworICAgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IEVudW0gdHlwZSBcIkZvb0VudW0xXCIgaGFzIG5vIHZhbHVlICIKKyAgICAgICJuYW1lZCBcIk1PT09cIiBmb3Igb3B0aW9uIFwiZm9vXCIuIFRoaXMgYXBwZWFycyB0byBiZSBhIHZhbHVlIGZyb20gYSAiCisgICAgICAic2libGluZyB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBTdHJpbmdPcHRpb25WYWx1ZUlzTm90U3RyaW5nKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfU1RSSU5HIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcIk1PT09cIiB9IH0iLAorCisgICAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBxdW90ZWQgc3RyaW5nICIKKyAgICAgICJmb3IgIgorICAgICAgInN0cmluZyBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSnNvbk5hbWVPcHRpb25PbkV4dGVuc2lvbnMpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJwYWNrYWdlOiBcImZvb1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMTAgZW5kOiAyMCB9IgorICAgICAgIn0iCisgICAgICAiZXh0ZW5zaW9uIHsiCisgICAgICAiICBuYW1lOiBcInZhbHVlXCIiCisgICAgICAiICBudW1iZXI6IDEwIgorICAgICAgIiAgbGFiZWw6IExBQkVMX09QVElPTkFMIgorICAgICAgIiAgdHlwZTogVFlQRV9JTlQzMiIKKyAgICAgICIgIGV4dGVuZGVlOiBcImZvby5Gb29cIiIKKyAgICAgICIgIGpzb25fbmFtZTogXCJteU5hbWVcIiIKKyAgICAgICJ9IiwKKyAgICAgICJmb28ucHJvdG86IGZvby52YWx1ZTogT1BUSU9OX05BTUU6IG9wdGlvbiBqc29uX25hbWUgaXMgbm90IGFsbG93ZWQgb24gIgorICAgICAgImV4dGVuc2lvbiBmaWVsZHMuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIER1cGxpY2F0ZUV4dGVuc2lvbkZpZWxkTnVtYmVyKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZSgKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwib3B0aW9uMVwiIG51bWJlcjogMTAwMCBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfSU5UMzIgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIpOworCisgIEJ1aWxkRmlsZVdpdGhXYXJuaW5ncygKKyAgICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwib3B0aW9uMlwiIG51bWJlcjogMTAwMCBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfSU5UMzIgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIsCisgICAgICAiYmFyLnByb3RvOiBvcHRpb24yOiBOVU1CRVI6IEV4dGVuc2lvbiBudW1iZXIgMTAwMCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgIgorICAgICAgImluIFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgYnkgZXh0ZW5zaW9uIFwib3B0aW9uMVwiIGRlZmluZWQgaW4gIgorICAgICAgImZvby5wcm90by5cbiIpOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHRlc3RzIHRoYXQgY2hlY2sgZm9yIGFnZ3JlZ2F0ZSB2YWx1ZSBwYXJzaW5nCisvLyBlcnJvcnMuICBUaGUgInZhbHVlIiBhcmd1bWVudCBpcyBlbWJlZGRlZCBpbnNpZGUgdGhlCisvLyAidW5pbnRlcnByZXRlZF9vcHRpb24iIHBvcnRpb24gb2YgdGhlIHJlc3VsdC4KK3N0YXRpYyBzdGQ6OnN0cmluZyBFbWJlZEFnZ3JlZ2F0ZVZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHJldHVybiBzdHJpbmdzOjpTdWJzdGl0dXRlKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9ICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfTUVTU0FHRSB0eXBlX25hbWU6IFwiRm9vXCIgIgorICAgICAgIiAgICAgICAgICAgIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMCB9IH0iLAorICAgICAgdmFsdWUpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgQWdncmVnYXRlVmFsdWVOb3RGb3VuZCkgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgRW1iZWRBZ2dyZWdhdGVWYWx1ZSgic3RyaW5nX3ZhbHVlOiBcIlwiIiksCisgICAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogT3B0aW9uIFwiZm9vXCIgaXMgYSBtZXNzYWdlLiAiCisgICAgICAiVG8gc2V0IHRoZSBlbnRpcmUgbWVzc2FnZSwgdXNlIHN5bnRheCBsaWtlICIKKyAgICAgICJcImZvbyA9IHsgPHByb3RvIHRleHQgZm9ybWF0PiB9XCIuIFRvIHNldCBmaWVsZHMgd2l0aGluIGl0LCB1c2UgIgorICAgICAgInN5bnRheCBsaWtlIFwiZm9vLmZvbyA9IHZhbHVlXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEFnZ3JlZ2F0ZVZhbHVlUGFyc2VFcnJvcikgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgRW1iZWRBZ2dyZWdhdGVWYWx1ZSgiYWdncmVnYXRlX3ZhbHVlOiBcIjErMlwiIiksCisgICAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogRXJyb3Igd2hpbGUgcGFyc2luZyBvcHRpb24gIgorICAgICAgInZhbHVlIGZvciBcImZvb1wiOiBFeHBlY3RlZCBpZGVudGlmaWVyLCBnb3Q6IDFcbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgQWdncmVnYXRlVmFsdWVVbmtub3duRmllbGRzKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICBFbWJlZEFnZ3JlZ2F0ZVZhbHVlKCJhZ2dyZWdhdGVfdmFsdWU6IFwieDoxMDBcIiIpLAorICAgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IEVycm9yIHdoaWxlIHBhcnNpbmcgb3B0aW9uICIKKyAgICAgICJ2YWx1ZSBmb3IgXCJmb29cIjogTWVzc2FnZSB0eXBlIFwiRm9vXCIgaGFzIG5vIGZpZWxkIG5hbWVkIFwieFwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBOb3RMaXRlSW1wb3J0c0xpdGUpIHsKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICAgIm9wdGlvbnMgeyBvcHRpbWl6ZV9mb3I6IExJVEVfUlVOVElNRSB9ICIpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJiYXIucHJvdG9cIiAiLAorCisgICAgICAiZm9vLnByb3RvOiBiYXIucHJvdG86IElNUE9SVDogRmlsZXMgdGhhdCBkbyBub3QgdXNlIG9wdGltaXplX2ZvciA9ICIKKyAgICAgICJMSVRFX1JVTlRJTUUgY2Fubm90IGltcG9ydCBmaWxlcyB3aGljaCBkbyB1c2UgdGhpcyBvcHRpb24uICBUaGlzIGZpbGUgIgorICAgICAgImlzIG5vdCBsaXRlLCBidXQgaXQgaW1wb3J0cyBcImJhci5wcm90b1wiIHdoaWNoIGlzLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBMaXRlRXh0ZW5kc05vdExpdGUpIHsKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZTogeyIKKyAgICAgICIgIG5hbWU6IFwiQmFyXCIiCisgICAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMDAgfSIKKyAgICAgICJ9Iik7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImJhci5wcm90b1wiICIKKyAgICAgICJvcHRpb25zIHsgb3B0aW1pemVfZm9yOiBMSVRFX1JVTlRJTUUgfSAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJleHRcIiBudW1iZXI6IDEyMyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfSU5UMzIgZXh0ZW5kZWU6IFwiQmFyXCIgfSIsCisKKyAgICAgICJmb28ucHJvdG86IGV4dDogRVhURU5ERUU6IEV4dGVuc2lvbnMgdG8gbm9uLWxpdGUgdHlwZXMgY2FuIG9ubHkgYmUgIgorICAgICAgImRlY2xhcmVkIGluIG5vbi1saXRlIGZpbGVzLiAgTm90ZSB0aGF0IHlvdSBjYW5ub3QgZXh0ZW5kIGEgbm9uLWxpdGUgIgorICAgICAgInR5cGUgdG8gY29udGFpbiBhIGxpdGUgdHlwZSwgYnV0IHRoZSByZXZlcnNlIGlzIGFsbG93ZWQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5vTGl0ZVNlcnZpY2VzKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAib3B0aW9ucyB7IgorICAgICAgIiAgb3B0aW1pemVfZm9yOiBMSVRFX1JVTlRJTUUiCisgICAgICAiICBjY19nZW5lcmljX3NlcnZpY2VzOiB0cnVlIgorICAgICAgIiAgamF2YV9nZW5lcmljX3NlcnZpY2VzOiB0cnVlIgorICAgICAgIn0gIgorICAgICAgInNlcnZpY2UgeyBuYW1lOiBcIkZvb1wiIH0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IEZpbGVzIHdpdGggb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FIGNhbm5vdCAiCisgICAgICAiZGVmaW5lIHNlcnZpY2VzIHVubGVzcyB5b3Ugc2V0IGJvdGggb3B0aW9ucyBjY19nZW5lcmljX3NlcnZpY2VzIGFuZCAiCisgICAgICAiamF2YV9nZW5lcmljX3NlcnZpY2VzIHRvIGZhbHNlLlxuIik7CisKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICAgIm9wdGlvbnMgeyIKKyAgICAgICIgIG9wdGltaXplX2ZvcjogTElURV9SVU5USU1FIgorICAgICAgIiAgY2NfZ2VuZXJpY19zZXJ2aWNlczogZmFsc2UiCisgICAgICAiICBqYXZhX2dlbmVyaWNfc2VydmljZXM6IGZhbHNlIgorICAgICAgIn0gIgorICAgICAgInNlcnZpY2UgeyBuYW1lOiBcIkJhclwiIH0iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFJvbGxiYWNrQWZ0ZXJFcnJvcikgeworICAvLyBCdWlsZCBhIGZpbGUgd2hpY2ggY29udGFpbnMgZXZlcnkga2luZCBvZiBjb25zdHJ1Y3QgYnV0IHJlZmVyZW5jZXMgYW4KKyAgLy8gdW5kZWZpbmVkIHR5cGUuICBBbGwgdGhlc2UgY29uc3RydWN0cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzeW1ib2wgdGFibGUKKyAgLy8gYmVmb3JlIHRoZSB1bmRlZmluZWQgdHlwZSBlcnJvciBpcyBub3RpY2VkLiAgVGhlIERlc2NyaXB0b3JQb29sIHdpbGwgdGhlbgorICAvLyBoYXZlIHRvIHJvbGwgZXZlcnl0aGluZyBiYWNrLgorICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxIH0iCisgICAgICAifSAiCisgICAgICAiZW51bV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIlRlc3RFbnVtXCIiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6XCJCQVJcIiBudW1iZXI6MSB9IgorICAgICAgIn0gIgorICAgICAgInNlcnZpY2UgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdFNlcnZpY2VcIiIKKyAgICAgICIgIG1ldGhvZCB7IgorICAgICAgIiAgICBuYW1lOiBcIkJhelwiIgorICAgICAgIiAgICBpbnB1dF90eXBlOiBcIk5vU3VjaFR5cGVcIiIgIC8vIGVycm9yCisgICAgICAiICAgIG91dHB1dF90eXBlOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgICAiICB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBUZXN0U2VydmljZS5CYXo6IElOUFVUX1RZUEU6IFwiTm9TdWNoVHlwZVwiIGlzIG5vdCBkZWZpbmVkLlxuIgorICApOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IGlmIHdlIGJ1aWxkIHRoZSBzYW1lIGZpbGUgYWdhaW4gd2l0aCB0aGUgZXJyb3IgZml4ZWQsCisgIC8vIGl0IHdvcmtzLiAgSWYgdGhlIGFib3ZlIHJvbGxiYWNrIHdhcyBpbmNvbXBsZXRlLCB0aGVuIHNvbWUgc3ltYm9scyB3aWxsCisgIC8vIGJlIGxlZnQgZGVmaW5lZCwgYW5kIHRoaXMgc2Vjb25kIGF0dGVtcHQgd2lsbCBmYWlsIHNpbmNlIGl0IHRyaWVzIHRvCisgIC8vIHJlLWRlZmluZSB0aGUgc2FtZSBzeW1ib2xzLgorICBCdWlsZEZpbGUoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgfSIKKyAgICAgICJ9ICIKKyAgICAgICJlbnVtX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiVGVzdEVudW1cIiIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTpcIkJBUlwiIG51bWJlcjoxIH0iCisgICAgICAifSAiCisgICAgICAic2VydmljZSB7IgorICAgICAgIiAgbmFtZTogXCJUZXN0U2VydmljZVwiIgorICAgICAgIiAgbWV0aG9kIHsgbmFtZTpcIkJhelwiIgorICAgICAgIiAgICAgICAgICAgaW5wdXRfdHlwZTpcIlRlc3RNZXNzYWdlXCIiCisgICAgICAiICAgICAgICAgICBvdXRwdXRfdHlwZTpcIlRlc3RNZXNzYWdlXCIgfSIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFcnJvcnNSZXBvcnRlZFRvTG9nRXJyb3IpIHsKKyAgLy8gVGVzdCB0aGF0IGVycm9ycyBhcmUgcmVwb3J0ZWQgdG8gR09PR0xFX0xPRyhFUlJPUikgaWYgbm8gZXJyb3IgY29sbGVjdG9yIGlzCisgIC8vIHByb3ZpZGVkLgorCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgQVNTRVJUX1RSVUUoCisgICAgICBUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZV9wcm90bykpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlcnJvcnM7CisKKyAgeworICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7CisgICAgRVhQRUNUX1RSVUUocG9vbF8uQnVpbGRGaWxlKGZpbGVfcHJvdG8pID09IG51bGxwdHIpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKworICBBU1NFUlRfRVEoMiwgZXJyb3JzLnNpemUoKSk7CisKKyAgRVhQRUNUX0VRKCJJbnZhbGlkIHByb3RvIGRlc2NyaXB0b3IgZm9yIGZpbGUgXCJmb28ucHJvdG9cIjoiLCBlcnJvcnNbMF0pOworICBFWFBFQ1RfRVEoIiAgRm9vOiBcIkZvb1wiIGlzIGFscmVhZHkgZGVmaW5lZC4iLCBlcnJvcnNbMV0pOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRGlzYWxsb3dFbnVtQWxpYXMpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJlbnVtX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiQmFyXCIiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6XCJFTlVNX0FcIiBudW1iZXI6MCB9IgorICAgICAgIiAgdmFsdWUgeyBuYW1lOlwiRU5VTV9CXCIgbnVtYmVyOjAgfSIKKyAgICAgICJ9IiwKKyAgICAgICJmb28ucHJvdG86IEJhcjogTlVNQkVSOiAiCisgICAgICAiXCJFTlVNX0JcIiB1c2VzIHRoZSBzYW1lIGVudW0gdmFsdWUgYXMgXCJFTlVNX0FcIi4gIgorICAgICAgIklmIHRoaXMgaXMgaW50ZW5kZWQsIHNldCAnb3B0aW9uIGFsbG93X2FsaWFzID0gdHJ1ZTsnIHRvIHRoZSBlbnVtICIKKyAgICAgICJkZWZpbml0aW9uLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBBbGxvd0VudW1BbGlhcykgeworICBCdWlsZEZpbGUoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZW51bV90eXBlIHsiCisgICAgICAiICBuYW1lOiBcIkJhclwiIgorICAgICAgIiAgdmFsdWUgeyBuYW1lOlwiRU5VTV9BXCIgbnVtYmVyOjAgfSIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTpcIkVOVU1fQlwiIG51bWJlcjowIH0iCisgICAgICAiICBvcHRpb25zIHsgYWxsb3dfYWxpYXM6IHRydWUgfSIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbnVzZWRJbXBvcnRXYXJuaW5nKSB7CisgIHBvb2xfLkFkZFVudXNlZEltcG9ydFRyYWNrRmlsZSgiYmFyLnByb3RvIik7CisgIEJ1aWxkRmlsZSgKKyAgICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkJhclwiIH0iKTsKKworICBwb29sXy5BZGRVbnVzZWRJbXBvcnRUcmFja0ZpbGUoImJhc2UucHJvdG8iKTsKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiYmFzZS5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkJhc2VcIiB9Iik7CisKKyAgcG9vbF8uQWRkVW51c2VkSW1wb3J0VHJhY2tGaWxlKCJiYXoucHJvdG8iKTsKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiYmF6LnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmF6XCIgfSIpOworCisgIHBvb2xfLkFkZFVudXNlZEltcG9ydFRyYWNrRmlsZSgicHVibGljLnByb3RvIik7CisgIEJ1aWxkRmlsZSgKKyAgICAgICJuYW1lOiBcInB1YmxpYy5wcm90b1wiICIKKyAgICAgICJkZXBlbmRlbmN5OiBcImJhci5wcm90b1wiIgorICAgICAgInB1YmxpY19kZXBlbmRlbmN5OiAwIik7CisKKyAgLy8gLy8gZm9yd2FyZC5wcm90bworICAvLyBpbXBvcnQgImJhc2UucHJvdG8iICAgICAgIC8vIE5vIHdhcm5pbmc6IEJhc2UgbWVzc2FnZSBpcyB1c2VkLgorICAvLyBpbXBvcnQgImJhci5wcm90byIgICAgICAgIC8vIFdpbGwgbG9nIGEgd2FybmluZy4KKyAgLy8gaW1wb3J0IHB1YmxpYyAiYmF6LnByb3RvIiAvLyBObyB3YXJuaW5nOiBEbyBub3QgdHJhY2sgaW1wb3J0IHB1YmxpYy4KKyAgLy8gaW1wb3J0ICJwdWJsaWMucHJvdG8iICAgICAvLyBObyB3YXJuaW5nOiBwdWJsaWMucHJvdG8gaGFzIGltcG9ydCBwdWJsaWMuCisgIC8vIG1lc3NhZ2UgRm9yd2FyZCB7CisgIC8vICAgb3B0aW9uYWwgQmFzZSBiYXNlID0gMTsKKyAgLy8gfQorICAvLworICBwb29sXy5BZGRVbnVzZWRJbXBvcnRUcmFja0ZpbGUoImZvcndhcmQucHJvdG8iKTsKKyAgQnVpbGRGaWxlV2l0aFdhcm5pbmdzKAorICAgICAgIm5hbWU6IFwiZm9yd2FyZC5wcm90b1wiIgorICAgICAgImRlcGVuZGVuY3k6IFwiYmFzZS5wcm90b1wiIgorICAgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIiCisgICAgICAiZGVwZW5kZW5jeTogXCJiYXoucHJvdG9cIiIKKyAgICAgICJkZXBlbmRlbmN5OiBcInB1YmxpYy5wcm90b1wiIgorICAgICAgInB1YmxpY19kZXBlbmRlbmN5OiAyICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9yd2FyZFwiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiYmFzZVwiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAgICJ0eXBlX25hbWU6XCJCYXNlXCIgfSIKKyAgICAgICJ9IiwKKyAgICAgICJmb3J3YXJkLnByb3RvOiBiYXIucHJvdG86IElNUE9SVDogSW1wb3J0IGJhci5wcm90byBpcyB1bnVzZWQuXG4iKTsKK30KKworbmFtZXNwYWNlIHsKK3ZvaWQgRmlsbFZhbGlkTWFwRW50cnkoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZV9wcm90bykgeworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCisgICAgICAibmFtZTogJ2Zvby5wcm90bycgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdGb28nICIKKyAgICAgICIgIGZpZWxkIHsgIgorICAgICAgIiAgICBuYW1lOiAnZm9vX21hcCcgbnVtYmVyOiAxIGxhYmVsOkxBQkVMX1JFUEVBVEVEICIKKyAgICAgICIgICAgdHlwZV9uYW1lOiAnRm9vTWFwRW50cnknICIKKyAgICAgICIgIH0gIgorICAgICAgIiAgbmVzdGVkX3R5cGUgeyAiCisgICAgICAiICAgIG5hbWU6ICdGb29NYXBFbnRyeScgIgorICAgICAgIiAgICBvcHRpb25zIHsgIG1hcF9lbnRyeTogdHJ1ZSB9ICIKKyAgICAgICIgICAgZmllbGQgeyAiCisgICAgICAiICAgICAgbmFtZTogJ2tleScgbnVtYmVyOiAxIHR5cGU6VFlQRV9JTlQzMiBsYWJlbDpMQUJFTF9PUFRJT05BTCAiCisgICAgICAiICAgIH0gIgorICAgICAgIiAgICBmaWVsZCB7ICIKKyAgICAgICIgICAgICBuYW1lOiAndmFsdWUnIG51bWJlcjogMiB0eXBlOlRZUEVfSU5UMzIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICB9ICIKKyAgICAgICIgIH0gIgorICAgICAgIn0gIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdCYXInICIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAgfSIKKyAgICAgICJ9ICIsCisgICAgICBmaWxlX3Byb3RvKSk7Cit9CitzdGF0aWMgY29uc3QgY2hhcioga01hcEVudHJ5RXJyb3JNZXNzYWdlID0KKyAgICAiZm9vLnByb3RvOiBGb28uZm9vX21hcDogVFlQRTogbWFwX2VudHJ5IHNob3VsZCBub3QgYmUgc2V0IGV4cGxpY2l0bHkuICIKKyAgICAiVXNlIG1hcDxLZXlUeXBlLCBWYWx1ZVR5cGU+IGluc3RlYWQuXG4iOworc3RhdGljIGNvbnN0IGNoYXIqIGtNYXBFbnRyeUtleVR5cGVFcnJvck1lc3NhZ2UgPQorICAgICJmb28ucHJvdG86IEZvby5mb29fbWFwOiBUWVBFOiBLZXkgaW4gbWFwIGZpZWxkcyBjYW5ub3QgYmUgZmxvYXQvZG91YmxlLCAiCisgICAgImJ5dGVzIG9yIG1lc3NhZ2UgdHlwZXMuXG4iOworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5QmFzZSkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgQnVpbGRGaWxlKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUV4dGVuc2lvblJhbmdlKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBUZXh0Rm9ybWF0OjpNZXJnZUZyb21TdHJpbmcoCisgICAgICAiZXh0ZW5zaW9uX3JhbmdlIHsgIgorICAgICAgIiAgc3RhcnQ6IDEwIGVuZDogMjAgIgorICAgICAgIn0gIiwKKyAgICAgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfbmVzdGVkX3R5cGUoMCkpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5RXJyb3JNZXNzYWdlKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5RXh0ZW5zaW9uKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBUZXh0Rm9ybWF0OjpNZXJnZUZyb21TdHJpbmcoCisgICAgICAiZXh0ZW5zaW9uIHsgIgorICAgICAgIiAgbmFtZTogJ2Zvb19leHQnIGV4dGVuZGVlOiAnLkJhcicgbnVtYmVyOiA1IgorICAgICAgIn0gIiwKKyAgICAgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfbmVzdGVkX3R5cGUoMCkpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5RXJyb3JNZXNzYWdlKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5TmVzdGVkVHlwZSkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgVGV4dEZvcm1hdDo6TWVyZ2VGcm9tU3RyaW5nKAorICAgICAgIm5lc3RlZF90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0JhcicgIgorICAgICAgIn0gIiwKKyAgICAgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfbmVzdGVkX3R5cGUoMCkpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5RXJyb3JNZXNzYWdlKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5RW51bVR5cGVzKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBUZXh0Rm9ybWF0OjpNZXJnZUZyb21TdHJpbmcoCisgICAgICAiZW51bV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0JhckVudW0nICIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTogJ0JBUl9CQVInIG51bWJlcjowIH0gIgorICAgICAgIn0gIiwKKyAgICAgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfbmVzdGVkX3R5cGUoMCkpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5RXJyb3JNZXNzYWdlKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5RXh0cmFGaWVsZCkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgVGV4dEZvcm1hdDo6TWVyZ2VGcm9tU3RyaW5nKAorICAgICAgImZpZWxkIHsgIgorICAgICAgIiAgbmFtZTogJ290aGVyX2ZpZWxkJyAiCisgICAgICAiICBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgdHlwZTogVFlQRV9JTlQzMiAiCisgICAgICAiICBudW1iZXI6IDMgIgorICAgICAgIn0gIiwKKyAgICAgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfbmVzdGVkX3R5cGUoMCkpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5RXJyb3JNZXNzYWdlKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5TWVzc2FnZU5hbWUpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfbmVzdGVkX3R5cGUoMCktPnNldF9uYW1lKAorICAgICAgIk90aGVyTWFwRW50cnkiKTsKKyAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKS0+bXV0YWJsZV9maWVsZCgwKS0+c2V0X3R5cGVfbmFtZSgKKyAgICAgICJPdGhlck1hcEVudHJ5Iik7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLCBrTWFwRW50cnlFcnJvck1lc3NhZ2UpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlOb25lUmVwZWF0ZWRNYXBFbnRyeSkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKS0+bXV0YWJsZV9maWVsZCgwKS0+c2V0X2xhYmVsKAorICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeURpZmZlcmVudENvbnRhaW5pbmdUeXBlKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICAvLyBNb3ZlIHRoZSBuZXN0ZWQgTWFwRW50cnkgbWVzc2FnZSBpbnRvIHRoZSB0b3AgbGV2ZWwsIHdoaWNoIHNob3VsZCBub3QgcGFzcworICAvLyB0aGUgdmFsaWRhdGlvbi4KKyAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgpLT5BZGRBbGxvY2F0ZWQoCisgICAgICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKCktPlJlbGVhc2VMYXN0KCkpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5RXJyb3JNZXNzYWdlKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5S2V5TmFtZSkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGtleSA9CisgICAgICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKDApLT5tdXRhYmxlX2ZpZWxkKAorICAgICAgICAgIDApOworICBrZXktPnNldF9uYW1lKCJLZXkiKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUtleUxhYmVsKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBGaWVsZERlc2NyaXB0b3JQcm90byoga2V5ID0KKyAgICAgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfbmVzdGVkX3R5cGUoMCktPm11dGFibGVfZmllbGQoCisgICAgICAgICAgMCk7CisgIGtleS0+c2V0X2xhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVFVSVJFRCk7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLCBrTWFwRW50cnlFcnJvck1lc3NhZ2UpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlLZXlOdW1iZXIpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBrZXkgPQorICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKS0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgwKS0+bXV0YWJsZV9maWVsZCgKKyAgICAgICAgICAwKTsKKyAga2V5LT5zZXRfbnVtYmVyKDMpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5RXJyb3JNZXNzYWdlKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5VmFsdWVOYW1lKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBGaWVsZERlc2NyaXB0b3JQcm90byogdmFsdWUgPQorICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKS0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgwKS0+bXV0YWJsZV9maWVsZCgKKyAgICAgICAgICAxKTsKKyAgdmFsdWUtPnNldF9uYW1lKCJWYWx1ZSIpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5RXJyb3JNZXNzYWdlKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5VmFsdWVMYWJlbCkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIHZhbHVlID0KKyAgICAgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfbmVzdGVkX3R5cGUoMCktPm11dGFibGVfZmllbGQoCisgICAgICAgICAgMSk7CisgIHZhbHVlLT5zZXRfbGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUVVJUkVEKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeVZhbHVlTnVtYmVyKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBGaWVsZERlc2NyaXB0b3JQcm90byogdmFsdWUgPQorICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKS0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgwKS0+bXV0YWJsZV9maWVsZCgKKyAgICAgICAgICAxKTsKKyAgdmFsdWUtPnNldF9udW1iZXIoMyk7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLCBrTWFwRW50cnlFcnJvck1lc3NhZ2UpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlLZXlUeXBlRmxvYXQpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBrZXkgPQorICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKS0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgwKS0+bXV0YWJsZV9maWVsZCgKKyAgICAgICAgICAwKTsKKyAga2V5LT5zZXRfdHlwZShGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9GTE9BVCk7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLCBrTWFwRW50cnlLZXlUeXBlRXJyb3JNZXNzYWdlKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5S2V5VHlwZURvdWJsZSkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGtleSA9CisgICAgICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKDApLT5tdXRhYmxlX2ZpZWxkKAorICAgICAgICAgIDApOworICBrZXktPnNldF90eXBlKEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0RPVUJMRSk7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLCBrTWFwRW50cnlLZXlUeXBlRXJyb3JNZXNzYWdlKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5S2V5VHlwZUJ5dGVzKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBGaWVsZERlc2NyaXB0b3JQcm90byoga2V5ID0KKyAgICAgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfbmVzdGVkX3R5cGUoMCktPm11dGFibGVfZmllbGQoCisgICAgICAgICAgMCk7CisgIGtleS0+c2V0X3R5cGUoRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfQllURVMpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5S2V5VHlwZUVycm9yTWVzc2FnZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUtleVR5cGVFbnVtKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBGaWVsZERlc2NyaXB0b3JQcm90byoga2V5ID0KKyAgICAgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfbmVzdGVkX3R5cGUoMCktPm11dGFibGVfZmllbGQoCisgICAgICAgICAgMCk7CisgIGtleS0+Y2xlYXJfdHlwZSgpOworICBrZXktPnNldF90eXBlX25hbWUoIkJhckVudW0iKTsKKyAgRW51bURlc2NyaXB0b3JQcm90byogZW51bV9wcm90byA9IGZpbGVfcHJvdG8uYWRkX2VudW1fdHlwZSgpOworICBlbnVtX3Byb3RvLT5zZXRfbmFtZSgiQmFyRW51bSIpOworICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIGVudW1fdmFsdWVfcHJvdG8gPSBlbnVtX3Byb3RvLT5hZGRfdmFsdWUoKTsKKyAgZW51bV92YWx1ZV9wcm90by0+c2V0X25hbWUoIkJBUl9WQUxVRTAiKTsKKyAgZW51bV92YWx1ZV9wcm90by0+c2V0X251bWJlcigwKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgImZvby5wcm90bzogRm9vLmZvb19tYXA6IFRZUEU6IEtleSBpbiBtYXAgZmllbGRzIGNhbm5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgImJlIGVudW0gdHlwZXMuXG4iKTsKKyAgLy8gRW51bSBrZXlzIGFyZSBub3QgYWxsb3dlZCBpbiBwcm90bzMgYXMgd2VsbC4KKyAgLy8gR2V0IHJpZCBvZiBleHRlbnNpb25zIGZvciBwcm90bzMgdG8gbWFrZSBpdCBwcm90bzMgY29tcGF0aWJsZS4KKyAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgpLT5SZW1vdmVMYXN0KCk7CisgIGZpbGVfcHJvdG8uc2V0X3N5bnRheCgicHJvdG8zIik7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICJmb28ucHJvdG86IEZvby5mb29fbWFwOiBUWVBFOiBLZXkgaW4gbWFwIGZpZWxkcyBjYW5ub3QgIgorICAgICAgICAgICAgICAgICAgICAgICJiZSBlbnVtIHR5cGVzLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUtleVR5cGVNZXNzYWdlKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBGaWVsZERlc2NyaXB0b3JQcm90byoga2V5ID0KKyAgICAgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfbmVzdGVkX3R5cGUoMCktPm11dGFibGVfZmllbGQoCisgICAgICAgICAgMCk7CisgIGtleS0+Y2xlYXJfdHlwZSgpOworICBrZXktPnNldF90eXBlX25hbWUoIi5CYXIiKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUtleVR5cGVFcnJvck1lc3NhZ2UpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlDb25mbGljdHNXaXRoRmllbGQpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZygKKyAgICAgICJmaWVsZCB7ICIKKyAgICAgICIgIG5hbWU6ICdGb29NYXBFbnRyeScgIgorICAgICAgIiAgdHlwZTogVFlQRV9JTlQzMiAiCisgICAgICAiICBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgbnVtYmVyOiAxMDAgIgorICAgICAgIn0iLAorICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKSk7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICBmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksCisgICAgICAiZm9vLnByb3RvOiBGb28uRm9vTWFwRW50cnk6IE5BTUU6IFwiRm9vTWFwRW50cnlcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gIgorICAgICAgIlwiRm9vXCIuXG4iCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vX21hcDogVFlQRTogXCJGb29NYXBFbnRyeVwiIGlzIG5vdCBkZWZpbmVkLlxuIgorICAgICAgImZvby5wcm90bzogRm9vOiBOQU1FOiBFeHBhbmRlZCBtYXAgZW50cnkgdHlwZSBGb29NYXBFbnRyeSBjb25mbGljdHMgIgorICAgICAgIndpdGggYW4gZXhpc3RpbmcgZmllbGQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5Q29uZmxpY3RzV2l0aE1lc3NhZ2UpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZygKKyAgICAgICJuZXN0ZWRfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdGb29NYXBFbnRyeScgIgorICAgICAgIn0iLAorICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKSk7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICBmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksCisgICAgICAiZm9vLnByb3RvOiBGb28uRm9vTWFwRW50cnk6IE5BTUU6IFwiRm9vTWFwRW50cnlcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gIgorICAgICAgIlwiRm9vXCIuXG4iCisgICAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IEV4cGFuZGVkIG1hcCBlbnRyeSB0eXBlIEZvb01hcEVudHJ5IGNvbmZsaWN0cyAiCisgICAgICAid2l0aCBhbiBleGlzdGluZyBuZXN0ZWQgbWVzc2FnZSB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUNvbmZsaWN0c1dpdGhFbnVtKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBUZXh0Rm9ybWF0OjpNZXJnZUZyb21TdHJpbmcoCisgICAgICAiZW51bV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0Zvb01hcEVudHJ5JyAiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6ICdFTlRSWV9GT08nIG51bWJlcjogMCB9IgorICAgICAgIn0iLAorICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKSk7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICBmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksCisgICAgICAiZm9vLnByb3RvOiBGb28uRm9vTWFwRW50cnk6IE5BTUU6IFwiRm9vTWFwRW50cnlcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gIgorICAgICAgIlwiRm9vXCIuXG4iCisgICAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IEV4cGFuZGVkIG1hcCBlbnRyeSB0eXBlIEZvb01hcEVudHJ5IGNvbmZsaWN0cyAiCisgICAgICAid2l0aCBhbiBleGlzdGluZyBlbnVtIHR5cGUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1WYWx1ZXNDb25mbGljdFdpdGhEaWZmZXJlbnRDYXNpbmcpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJzeW50YXg6ICdwcm90bzMnIgorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJlbnVtX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6ICdGb29FbnVtJyAiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6ICdCQVInIG51bWJlcjogMCB9IgorICAgICAgIiAgdmFsdWUgeyBuYW1lOiAnYmFyJyBudW1iZXI6IDEgfSIKKyAgICAgICJ9IiwKKyAgICAgICJmb28ucHJvdG86IGJhcjogTkFNRTogRW51bSBuYW1lIGJhciBoYXMgdGhlIHNhbWUgbmFtZSBhcyBCQVIgIgorICAgICAgImlmIHlvdSBpZ25vcmUgY2FzZSBhbmQgc3RyaXAgb3V0IHRoZSBlbnVtIG5hbWUgcHJlZml4IChpZiBhbnkpLiAiCisgICAgICAiVGhpcyBpcyBlcnJvci1wcm9uZSBhbmQgY2FuIGxlYWQgdG8gdW5kZWZpbmVkIGJlaGF2aW9yLiAiCisgICAgICAiUGxlYXNlIGF2b2lkIGRvaW5nIHRoaXMuIElmIHlvdSBhcmUgdXNpbmcgYWxsb3dfYWxpYXMsIHBsZWFzZSBhc3NpZ24gIgorICAgICAgInRoZSBzYW1lIG51bWVyaWMgdmFsdWUgdG8gYm90aCBlbnVtcy5cbiIpOworCisgIC8vIE5vdCBhbiBlcnJvciBiZWNhdXNlIGJvdGggZW51bXMgYXJlIG1hcHBlZCB0byB0aGUgc2FtZSB2YWx1ZS4KKyAgQnVpbGRGaWxlKAorICAgICAgInN5bnRheDogJ3Byb3RvMyciCisgICAgICAibmFtZTogJ2Zvby5wcm90bycgIgorICAgICAgImVudW1fdHlwZSB7IgorICAgICAgIiAgbmFtZTogJ0Zvb0VudW0nICIKKyAgICAgICIgIG9wdGlvbnMgeyBhbGxvd19hbGlhczogdHJ1ZSB9IgorICAgICAgIiAgdmFsdWUgeyBuYW1lOiAnVU5LTk9XTicgbnVtYmVyOiAwIH0iCisgICAgICAiICB2YWx1ZSB7IG5hbWU6ICdCQVInIG51bWJlcjogMSB9IgorICAgICAgIiAgdmFsdWUgeyBuYW1lOiAnYmFyJyBudW1iZXI6IDEgfSIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtVmFsdWVzQ29uZmxpY3RXaGVuUHJlZml4ZXNTdHJpcHBlZCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgInN5bnRheDogJ3Byb3RvMyciCisgICAgICAibmFtZTogJ2Zvby5wcm90bycgIgorICAgICAgImVudW1fdHlwZSB7IgorICAgICAgIiAgbmFtZTogJ0Zvb0VudW0nICIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTogJ0ZPT19FTlVNX0JBWicgbnVtYmVyOiAwIH0iCisgICAgICAiICB2YWx1ZSB7IG5hbWU6ICdCQVonIG51bWJlcjogMSB9IgorICAgICAgIn0iLAorICAgICAgImZvby5wcm90bzogQkFaOiBOQU1FOiBFbnVtIG5hbWUgQkFaIGhhcyB0aGUgc2FtZSBuYW1lIGFzIEZPT19FTlVNX0JBWiAiCisgICAgICAiaWYgeW91IGlnbm9yZSBjYXNlIGFuZCBzdHJpcCBvdXQgdGhlIGVudW0gbmFtZSBwcmVmaXggKGlmIGFueSkuICIKKyAgICAgICJUaGlzIGlzIGVycm9yLXByb25lIGFuZCBjYW4gbGVhZCB0byB1bmRlZmluZWQgYmVoYXZpb3IuICIKKyAgICAgICJQbGVhc2UgYXZvaWQgZG9pbmcgdGhpcy4gSWYgeW91IGFyZSB1c2luZyBhbGxvd19hbGlhcywgcGxlYXNlIGFzc2lnbiAiCisgICAgICAidGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSB0byBib3RoIGVudW1zLlxuIik7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJzeW50YXg6ICdwcm90bzMnIgorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJlbnVtX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6ICdGb29FbnVtJyAiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6ICdGT09FTlVNX0JBWicgbnVtYmVyOiAwIH0iCisgICAgICAiICB2YWx1ZSB7IG5hbWU6ICdCQVonIG51bWJlcjogMSB9IgorICAgICAgIn0iLAorICAgICAgImZvby5wcm90bzogQkFaOiBOQU1FOiBFbnVtIG5hbWUgQkFaIGhhcyB0aGUgc2FtZSBuYW1lIGFzIEZPT0VOVU1fQkFaICIKKyAgICAgICJpZiB5b3UgaWdub3JlIGNhc2UgYW5kIHN0cmlwIG91dCB0aGUgZW51bSBuYW1lIHByZWZpeCAoaWYgYW55KS4gIgorICAgICAgIlRoaXMgaXMgZXJyb3ItcHJvbmUgYW5kIGNhbiBsZWFkIHRvIHVuZGVmaW5lZCBiZWhhdmlvci4gIgorICAgICAgIlBsZWFzZSBhdm9pZCBkb2luZyB0aGlzLiBJZiB5b3UgYXJlIHVzaW5nIGFsbG93X2FsaWFzLCBwbGVhc2UgYXNzaWduICIKKyAgICAgICJ0aGUgc2FtZSBudW1lcmljIHZhbHVlIHRvIGJvdGggZW51bXMuXG4iKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgInN5bnRheDogJ3Byb3RvMyciCisgICAgICAibmFtZTogJ2Zvby5wcm90bycgIgorICAgICAgImVudW1fdHlwZSB7IgorICAgICAgIiAgbmFtZTogJ0Zvb0VudW0nICIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTogJ0ZPT19FTlVNX0JBUl9CQVonIG51bWJlcjogMCB9IgorICAgICAgIiAgdmFsdWUgeyBuYW1lOiAnQkFSX19CQVonIG51bWJlcjogMSB9IgorICAgICAgIn0iLAorICAgICAgImZvby5wcm90bzogQkFSX19CQVo6IE5BTUU6IEVudW0gbmFtZSBCQVJfX0JBWiBoYXMgdGhlIHNhbWUgbmFtZSBhcyAiCisgICAgICAiRk9PX0VOVU1fQkFSX0JBWiBpZiB5b3UgaWdub3JlIGNhc2UgYW5kIHN0cmlwIG91dCB0aGUgZW51bSBuYW1lIHByZWZpeCAiCisgICAgICAiKGlmIGFueSkuIFRoaXMgaXMgZXJyb3ItcHJvbmUgYW5kIGNhbiBsZWFkIHRvIHVuZGVmaW5lZCBiZWhhdmlvci4gIgorICAgICAgIlBsZWFzZSBhdm9pZCBkb2luZyB0aGlzLiBJZiB5b3UgYXJlIHVzaW5nIGFsbG93X2FsaWFzLCBwbGVhc2UgYXNzaWduICIKKyAgICAgICJ0aGUgc2FtZSBudW1lcmljIHZhbHVlIHRvIGJvdGggZW51bXMuXG4iKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgInN5bnRheDogJ3Byb3RvMyciCisgICAgICAibmFtZTogJ2Zvby5wcm90bycgIgorICAgICAgImVudW1fdHlwZSB7IgorICAgICAgIiAgbmFtZTogJ0Zvb0VudW0nICIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTogJ0ZPT19FTlVNX19CQVJfQkFaJyBudW1iZXI6IDAgfSIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTogJ0JBUl9CQVonIG51bWJlcjogMSB9IgorICAgICAgIn0iLAorICAgICAgImZvby5wcm90bzogQkFSX0JBWjogTkFNRTogRW51bSBuYW1lIEJBUl9CQVogaGFzIHRoZSBzYW1lIG5hbWUgYXMgIgorICAgICAgIkZPT19FTlVNX19CQVJfQkFaIGlmIHlvdSBpZ25vcmUgY2FzZSBhbmQgc3RyaXAgb3V0IHRoZSBlbnVtIG5hbWUgcHJlZml4ICIKKyAgICAgICIoaWYgYW55KS4gVGhpcyBpcyBlcnJvci1wcm9uZSBhbmQgY2FuIGxlYWQgdG8gdW5kZWZpbmVkIGJlaGF2aW9yLiAiCisgICAgICAiUGxlYXNlIGF2b2lkIGRvaW5nIHRoaXMuIElmIHlvdSBhcmUgdXNpbmcgYWxsb3dfYWxpYXMsIHBsZWFzZSBhc3NpZ24gIgorICAgICAgInRoZSBzYW1lIG51bWVyaWMgdmFsdWUgdG8gYm90aCBlbnVtcy5cbiIpOworCisgIC8vIFRoaXMgaXNuJ3QgYW4gZXJyb3IgYmVjYXVzZSB0aGUgdW5kZXJzY29yZSB3aWxsIGNhdXNlIHRoZSBQYXNjYWxDYXNlIHRvCisgIC8vIGRpZmZlciBieSBjYXNlIChCYXJCYXogdnMuIEJhcmJheikuCisgIEJ1aWxkRmlsZSgKKyAgICAgICJzeW50YXg6ICdwcm90bzMnIgorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJlbnVtX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6ICdGb29FbnVtJyAiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6ICdCQVJfQkFaJyBudW1iZXI6IDAgfSIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTogJ0JBUkJBWicgbnVtYmVyOiAxIH0iCisgICAgICAifSIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlDb25mbGljdHNXaXRoT25lb2YpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZygKKyAgICAgICJvbmVvZl9kZWNsIHsgIgorICAgICAgIiAgbmFtZTogJ0Zvb01hcEVudHJ5JyAiCisgICAgICAifSIKKyAgICAgICJmaWVsZCB7ICIKKyAgICAgICIgIG5hbWU6ICdpbnRfZmllbGQnICIKKyAgICAgICIgIHR5cGU6IFRZUEVfSU5UMzIgIgorICAgICAgIiAgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAgICIgIG9uZW9mX2luZGV4OiAwICIKKyAgICAgICIgIG51bWJlcjogMTAwICIKKyAgICAgICJ9ICIsCisgICAgICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgIGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwKKyAgICAgICJmb28ucHJvdG86IEZvby5Gb29NYXBFbnRyeTogTkFNRTogXCJGb29NYXBFbnRyeVwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiAiCisgICAgICAiXCJGb29cIi5cbiIKKyAgICAgICJmb28ucHJvdG86IEZvby5mb29fbWFwOiBUWVBFOiBcIkZvb01hcEVudHJ5XCIgaXMgbm90IGRlZmluZWQuXG4iCisgICAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IEV4cGFuZGVkIG1hcCBlbnRyeSB0eXBlIEZvb01hcEVudHJ5IGNvbmZsaWN0cyAiCisgICAgICAid2l0aCBhbiBleGlzdGluZyBvbmVvZiB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeVVzZXNOb25lWmVyb0VudW1EZWZhdWx0VmFsdWUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJlbnVtX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiQmFyXCIiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6XCJFTlVNX0FcIiBudW1iZXI6MSB9IgorICAgICAgIiAgdmFsdWUgeyBuYW1lOlwiRU5VTV9CXCIgbnVtYmVyOjIgfSIKKyAgICAgICJ9IgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogJ0ZvbycgIgorICAgICAgIiAgZmllbGQgeyAiCisgICAgICAiICAgIG5hbWU6ICdmb29fbWFwJyBudW1iZXI6IDEgbGFiZWw6TEFCRUxfUkVQRUFURUQgIgorICAgICAgIiAgICB0eXBlX25hbWU6ICdGb29NYXBFbnRyeScgIgorICAgICAgIiAgfSAiCisgICAgICAiICBuZXN0ZWRfdHlwZSB7ICIKKyAgICAgICIgICAgbmFtZTogJ0Zvb01hcEVudHJ5JyAiCisgICAgICAiICAgIG9wdGlvbnMgeyAgbWFwX2VudHJ5OiB0cnVlIH0gIgorICAgICAgIiAgICBmaWVsZCB7ICIKKyAgICAgICIgICAgICBuYW1lOiAna2V5JyBudW1iZXI6IDEgdHlwZTpUWVBFX0lOVDMyIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAgICIgICAgfSAiCisgICAgICAiICAgIGZpZWxkIHsgIgorICAgICAgIiAgICAgIG5hbWU6ICd2YWx1ZScgbnVtYmVyOiAyIHR5cGVfbmFtZTpcIkJhclwiIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAgICIgICAgfSAiCisgICAgICAiICB9ICIKKyAgICAgICJ9IiwKKyAgICAgICJmb28ucHJvdG86IEZvby5mb29fbWFwOiAiCisgICAgICAiVFlQRTogRW51bSB2YWx1ZSBpbiBtYXAgbXVzdCBkZWZpbmUgMCBhcyB0aGUgZmlyc3QgdmFsdWUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFByb3RvM1JlcXVpcmVkRmllbGRzKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogJ2Zvby5wcm90bycgIgorICAgICAgInN5bnRheDogJ3Byb3RvMycgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdGb28nICIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTonZm9vJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfSU5UMzIgfSAiCisgICAgICAifSIsCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBSZXF1aXJlZCBmaWVsZHMgYXJlIG5vdCBhbGxvd2VkIGluICIKKyAgICAgICJwcm90bzMuXG4iKTsKKworICAvLyBhcHBsaWVkIHRvIG5lc3RlZCB0eXBlcyBhcyB3ZWxsLgorICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJzeW50YXg6ICdwcm90bzMnICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOiAnRm9vJyAiCisgICAgICAiICBuZXN0ZWRfdHlwZSB7ICIKKyAgICAgICIgICAgbmFtZSA6ICdCYXInICIKKyAgICAgICIgICAgZmllbGQgeyBuYW1lOidiYXInIG51bWJlcjoxIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiB9ICIKKyAgICAgICIgIH0gIgorICAgICAgIn0iLAorICAgICAgImZvby5wcm90bzogRm9vLkJhci5iYXI6IFRZUEU6IFJlcXVpcmVkIGZpZWxkcyBhcmUgbm90IGFsbG93ZWQgaW4gIgorICAgICAgInByb3RvMy5cbiIpOworCisgIC8vIG9wdGlvbmFsIGFuZCByZXBlYXRlZCBmaWVsZHMgYXJlIE9LLgorICBCdWlsZEZpbGUoCisgICAgICAibmFtZTogJ2Zvby5wcm90bycgIgorICAgICAgInN5bnRheDogJ3Byb3RvMycgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdGb28nICIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTonZm9vJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6J2JhcicgbnVtYmVyOjIgbGFiZWw6TEFCRUxfUkVQRUFURUQgdHlwZTpUWVBFX0lOVDMyIH0gIgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFZhbGlkYXRlUHJvdG8zRGVmYXVsdFZhbHVlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogJ2Zvby5wcm90bycgIgorICAgICAgInN5bnRheDogJ3Byb3RvMycgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdGb28nICIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTonZm9vJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIiAgICAgICAgICBkZWZhdWx0X3ZhbHVlOiAnMScgfSIKKyAgICAgICJ9IiwKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IERFRkFVTFRfVkFMVUU6IEV4cGxpY2l0IGRlZmF1bHQgdmFsdWVzIGFyZSBub3QgIgorICAgICAgImFsbG93ZWQgaW4gcHJvdG8zLlxuIik7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAic3ludGF4OiAncHJvdG8zJyAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0ZvbycgIgorICAgICAgIiAgbmVzdGVkX3R5cGUgeyAiCisgICAgICAiICAgIG5hbWUgOiAnQmFyJyAiCisgICAgICAiICAgIGZpZWxkIHsgbmFtZTonYmFyJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIiAgICAgICAgICAgIGRlZmF1bHRfdmFsdWU6ICcxJyB9IgorICAgICAgIiAgfSAiCisgICAgICAifSIsCisgICAgICAiZm9vLnByb3RvOiBGb28uQmFyLmJhcjogREVGQVVMVF9WQUxVRTogRXhwbGljaXQgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCAiCisgICAgICAiYWxsb3dlZCBpbiBwcm90bzMuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFZhbGlkYXRlUHJvdG8zRXh0ZW5zaW9uUmFuZ2UpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAic3ludGF4OiAncHJvdG8zJyAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0ZvbycgIgorICAgICAgIiAgZmllbGQgeyBuYW1lOidmb28nIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9ICIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjEwIGVuZDoxMDAgfSAiCisgICAgICAifSIsCisgICAgICAiZm9vLnByb3RvOiBGb286IE5VTUJFUjogRXh0ZW5zaW9uIHJhbmdlcyBhcmUgbm90IGFsbG93ZWQgaW4gIgorICAgICAgInByb3RvMy5cbiIpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogJ2Zvby5wcm90bycgIgorICAgICAgInN5bnRheDogJ3Byb3RvMycgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdGb28nICIKKyAgICAgICIgIG5lc3RlZF90eXBlIHsgIgorICAgICAgIiAgICBuYW1lIDogJ0JhcicgIgorICAgICAgIiAgICBmaWVsZCB7IG5hbWU6J2JhcicgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0gIgorICAgICAgIiAgICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDoxMCBlbmQ6MTAwIH0gIgorICAgICAgIiAgfSAiCisgICAgICAifSIsCisgICAgICAiZm9vLnByb3RvOiBGb28uQmFyOiBOVU1CRVI6IEV4dGVuc2lvbiByYW5nZXMgYXJlIG5vdCBhbGxvd2VkIGluICIKKyAgICAgICJwcm90bzMuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFZhbGlkYXRlUHJvdG8zTWVzc2FnZVNldFdpcmVGb3JtYXQpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAic3ludGF4OiAncHJvdG8zJyAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0ZvbycgIgorICAgICAgIiAgb3B0aW9ucyB7IG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0OiB0cnVlIH0gIgorICAgICAgIn0iLAorICAgICAgImZvby5wcm90bzogRm9vOiBOQU1FOiBNZXNzYWdlU2V0IGlzIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgImluIHByb3RvMy5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgVmFsaWRhdGVQcm90bzNFbnVtKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogJ2Zvby5wcm90bycgIgorICAgICAgInN5bnRheDogJ3Byb3RvMycgIgorICAgICAgImVudW1fdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdGb29FbnVtJyAiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6ICdGT09fRk9PJyBudW1iZXI6MSB9ICIKKyAgICAgICJ9IiwKKyAgICAgICJmb28ucHJvdG86IEZvb0VudW06IE5VTUJFUjogVGhlIGZpcnN0IGVudW0gdmFsdWUgbXVzdCBiZSAiCisgICAgICAiemVybyBpbiBwcm90bzMuXG4iKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJzeW50YXg6ICdwcm90bzMnICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOiAnRm9vJyAiCisgICAgICAiICBlbnVtX3R5cGUgeyAiCisgICAgICAiICAgIG5hbWU6ICdGb29FbnVtJyAiCisgICAgICAiICAgIHZhbHVlIHsgbmFtZTogJ0ZPT19GT08nIG51bWJlcjoxIH0gIgorICAgICAgIiAgfSAiCisgICAgICAifSIsCisgICAgICAiZm9vLnByb3RvOiBGb28uRm9vRW51bTogTlVNQkVSOiBUaGUgZmlyc3QgZW51bSB2YWx1ZSBtdXN0IGJlICIKKyAgICAgICJ6ZXJvIGluIHByb3RvMy5cbiIpOworCisgIC8vIHZhbGlkIGNhc2UuCisgIEJ1aWxkRmlsZSgKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAic3ludGF4OiAncHJvdG8zJyAiCisgICAgICAiZW51bV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0Zvb0VudW0nICIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTogJ0ZPT19GT08nIG51bWJlcjowIH0gIgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFZhbGlkYXRlUHJvdG8zR3JvdXApIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAic3ludGF4OiAncHJvdG8zJyAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0ZvbycgIgorICAgICAgIiAgbmVzdGVkX3R5cGUgeyAiCisgICAgICAiICAgIG5hbWU6ICdGb29Hcm91cCcgIgorICAgICAgIiAgfSAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6J2Zvb19ncm91cCcgbnVtYmVyOiAxIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAgICIgICAgICAgICAgdHlwZTogVFlQRV9HUk9VUCB0eXBlX25hbWU6J0Zvb0dyb3VwJyB9ICIKKyAgICAgICJ9IiwKKyAgICAgICJmb28ucHJvdG86IEZvby5mb29fZ3JvdXA6IFRZUEU6IEdyb3VwcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBwcm90bzMgIgorICAgICAgInN5bnRheC5cbiIpOworfQorCisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBWYWxpZGF0ZVByb3RvM0VudW1Gcm9tUHJvdG8yKSB7CisgIC8vIERlZmluZSBhbiBlbnVtIGluIGEgcHJvdG8yIGZpbGUuCisgIEJ1aWxkRmlsZSgKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAicGFja2FnZTogJ2ZvbycgIgorICAgICAgInN5bnRheDogJ3Byb3RvMicgIgorICAgICAgImVudW1fdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdGb29FbnVtJyAiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6ICdERUZBVUxUX09QVElPTicgbnVtYmVyOjAgfSAiCisgICAgICAifSIpOworCisgIC8vIE5vdyB0cnkgdG8gcmVmZXIgdG8gaXQuIChBbGwgdGVzdHMgaW4gdGhlIGZpeHR1cmUgdXNlIHRoZSBzYW1lIHBvb2wsIHNvIHdlCisgIC8vIGNhbiByZWZlciB0byB0aGUgZW51bSBhYm92ZSBpbiB0aGlzIGRlZmluaXRpb24uKQorICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6ICdiYXIucHJvdG8nICIKKyAgICAgICJkZXBlbmRlbmN5OiAnZm9vLnByb3RvJyAiCisgICAgICAic3ludGF4OiAncHJvdG8zJyAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0ZvbycgIgorICAgICAgIiAgICBmaWVsZCB7IG5hbWU6J2JhcicgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0VOVU0gIgorICAgICAgIiAgICAgICAgICAgIHR5cGVfbmFtZTogJ2Zvby5Gb29FbnVtJyB9IgorICAgICAgIn0iLAorICAgICAgImJhci5wcm90bzogRm9vLmJhcjogVFlQRTogRW51bSB0eXBlIFwiZm9vLkZvb0VudW1cIiBpcyBub3QgYSBwcm90bzMgIgorICAgICAgImVudW0sIGJ1dCBpcyB1c2VkIGluIFwiRm9vXCIgd2hpY2ggaXMgYSBwcm90bzMgbWVzc2FnZSB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBWYWxpZGF0ZVByb3RvM0V4dGVuc2lvbikgeworICAvLyBWYWxpZCBmb3Igb3B0aW9ucy4KKyAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICAvLyBBZGQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIi4KKyAgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IG51bGxwdHIpOworICAvLyBBZGQgImZvby5wcm90byI6CisgIC8vICAgaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byI7CisgIC8vICAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyB7CisgIC8vICAgICBvcHRpb25hbCBzdHJpbmcgdGVzdF9maWxlX29wdCA9IDEwMDE7CisgIC8vICAgfQorICAvLyAgIGV4dGVuZCBnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgeworICAvLyAgICAgb3B0aW9uYWwgc3RyaW5nIHRlc3RfbXNnX29wdCA9IDEwMDI7CisgIC8vICAgfQorICAvLyAgIGV4dGVuZCBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIHsKKyAgLy8gICAgIG9wdGlvbmFsIHN0cmluZyB0ZXN0X2ZpZWxkX29wdCA9IDEwMDM7CisgIC8vICAgfQorICAvLyAgIGV4dGVuZCBnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgeworICAvLyAgICAgcmVwZWF0ZWQgaW50MzIgdGVzdF9lbnVtX29wdCA9IDEwMDQ7CisgIC8vICAgfQorICAvLyAgIGV4dGVuZCBnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyB7CisgIC8vICAgICBvcHRpb25hbCBpbnQzMiB0ZXN0X2VudW12YWxfb3B0ID0gMTAwNTsKKyAgLy8gICB9CisgIC8vICAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyB7CisgIC8vICAgICByZXBlYXRlZCBpbnQzMiB0ZXN0X3N2Y19vcHQgPSAxMDA2OworICAvLyAgIH0KKyAgLy8gICBleHRlbmQgZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMgeworICAvLyAgICAgb3B0aW9uYWwgc3RyaW5nIHRlc3RfbWV0aG9kX29wdCA9IDEwMDc7CisgIC8vICAgfQorICAvLyAgIGV4dGVuZCBnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zIHsKKyAgLy8gICAgIG9wdGlvbmFsIHN0cmluZyB0ZXN0X29uZW9mX29wdCA9IDEwMDg7CisgIC8vICAgfQorICAvLyAgIGV4dGVuZCBnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zIHsKKyAgLy8gICAgIG9wdGlvbmFsIHN0cmluZyB0ZXN0X2V4dF9vcHQgPSAxMDA5OworICAvLyAgIH0KKyAgZmlsZV9wcm90by5DbGVhcigpOworICBmaWxlX3Byb3RvLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgZmlsZV9wcm90by5zZXRfc3ludGF4KCJwcm90bzMiKTsKKyAgZmlsZV9wcm90by5hZGRfZGVwZW5kZW5jeSgiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iKTsKKyAgQWRkRXh0ZW5zaW9uKCZmaWxlX3Byb3RvLCAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIiwgInRlc3RfZmlsZV9vcHQiLCAxMDAxLAorICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HKTsKKyAgQWRkRXh0ZW5zaW9uKCZmaWxlX3Byb3RvLCAiZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIiwgInRlc3RfbXNnX29wdCIsIDEwMDEsCisgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkcpOworICBBZGRFeHRlbnNpb24oJmZpbGVfcHJvdG8sICJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIiwgInRlc3RfZmllbGRfb3B0IiwgMTAwMywKKyAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORyk7CisgIEFkZEV4dGVuc2lvbigmZmlsZV9wcm90bywgImdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyIsICJ0ZXN0X2VudW1fb3B0IiwgMTAwNCwKKyAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRCwKKyAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgQWRkRXh0ZW5zaW9uKCZmaWxlX3Byb3RvLCAiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMiLCAidGVzdF9lbnVtdmFsX29wdCIsIDEwMDUsCisgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgIEFkZEV4dGVuc2lvbigmZmlsZV9wcm90bywgImdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyIsICJ0ZXN0X3N2Y19vcHQiLCAxMDA2LAorICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUEVBVEVELAorICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICBBZGRFeHRlbnNpb24oJmZpbGVfcHJvdG8sICJnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyIsICJ0ZXN0X21ldGhvZF9vcHQiLCAxMDA3LAorICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HKTsKKyAgQWRkRXh0ZW5zaW9uKCZmaWxlX3Byb3RvLCAiZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucyIsICJ0ZXN0X29uZW9mX29wdCIsIDEwMDgsCisgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkcpOworICBBZGRFeHRlbnNpb24oJmZpbGVfcHJvdG8sICJnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zIiwgInRlc3RfZXh0X29wdCIsCisgICAgICAgICAgICAgICAxMDA5LCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkcpOworICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBudWxscHRyKTsKKworICAvLyBDb3B5IGFuZCBjaGFuZ2UgdGhlIHBhY2thZ2Ugb2YgdGhlIGRlc2NyaXB0b3IucHJvdG8KKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6ICdnb29nbGUucHJvdG9idWYucHJvdG8nICIKKyAgICAgICJzeW50YXg6ICdwcm90bzInICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOiAnQ29udGFpbmVyJyBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMDAgfSAiCisgICAgICAifSIpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6ICdiYXIucHJvdG8nICIKKyAgICAgICJzeW50YXg6ICdwcm90bzMnICIKKyAgICAgICJkZXBlbmRlbmN5OiAnZ29vZ2xlLnByb3RvYnVmLnByb3RvJyAiCisgICAgICAiZXh0ZW5zaW9uIHsgIgorICAgICAgIiAgbmFtZTogJ2JhcicgbnVtYmVyOiAxIGxhYmVsOiBMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX0lOVDMyICIKKyAgICAgICIgIGV4dGVuZGVlOiAnQ29udGFpbmVyJyAiCisgICAgICAifSIsCisgICAgICAiYmFyLnByb3RvOiBiYXI6IEVYVEVOREVFOiBFeHRlbnNpb25zIGluIHByb3RvMyBhcmUgb25seSBhbGxvd2VkIGZvciAiCisgICAgICAiZGVmaW5pbmcgb3B0aW9ucy5cbiIpOworfQorCisvLyBUZXN0IHRoYXQgZmllbGQgbmFtZXMgdGhhdCBtYXkgY29uZmxpY3QgaW4gSlNPTiBpcyBub3QgYWxsb3dlZCBieSBwcm90b2MuCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgVmFsaWRhdGVQcm90bzNKc29uTmFtZSkgeworICAvLyBUaGUgY29tcGFyaXNvbiBpcyBjYXNlLWluc2Vuc2l0aXZlLgorICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJzeW50YXg6ICdwcm90bzMnICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6ICdGb28nIgorICAgICAgIiAgZmllbGQgeyBuYW1lOiduYW1lJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTonTmFtZScgbnVtYmVyOjIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgICAifSIsCisgICAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IFRoZSBKU09OIGNhbWVsLWNhc2UgbmFtZSBvZiBmaWVsZCBcIk5hbWVcIiAiCisgICAgICAiY29uZmxpY3RzIHdpdGggZmllbGQgXCJuYW1lXCIuIFRoaXMgaXMgbm90IGFsbG93ZWQgaW4gcHJvdG8zLlxuIik7CisgIC8vIFVuZGVyc2NvcmVzIGFyZSBpZ25vcmVkLgorICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJzeW50YXg6ICdwcm90bzMnICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6ICdGb28nIgorICAgICAgIiAgZmllbGQgeyBuYW1lOidhYicgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6J19hX19iXycgbnVtYmVyOjIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgICAifSIsCisgICAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IFRoZSBKU09OIGNhbWVsLWNhc2UgbmFtZSBvZiBmaWVsZCBcIl9hX19iX1wiICIKKyAgICAgICJjb25mbGljdHMgd2l0aCBmaWVsZCBcImFiXCIuIFRoaXMgaXMgbm90IGFsbG93ZWQgaW4gcHJvdG8zLlxuIik7Cit9CisKKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFVudXNlZEltcG9ydFdpdGhPdGhlckVycm9yKSB7CisgIEJ1aWxkRmlsZSgKKyAgICAgICJuYW1lOiAnYmFyLnByb3RvJyAiCisgICAgICAibWVzc2FnZV90eXBlIHsiCisgICAgICAiICBuYW1lOiAnQmFyJyIKKyAgICAgICJ9Iik7CisKKyAgcG9vbF8uQWRkVW51c2VkSW1wb3J0VHJhY2tGaWxlKCJmb28ucHJvdG8iLCB0cnVlKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAiZGVwZW5kZW5jeTogJ2Jhci5wcm90bycgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogJ0ZvbyciCisgICAgICAiICBleHRlbnNpb24geyBuYW1lOidmb28nIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiIKKyAgICAgICIgICAgICAgICAgICAgIGV4dGVuZGVlOiAnQmF6JyB9IgorICAgICAgIn0iLAorCisgICAgICAvLyBTaG91bGQgbm90IGFsc28gY29udGFpbiB1bnVzZWQgaW1wb3J0IGVycm9yLgorICAgICAgImZvby5wcm90bzogRm9vLmZvbzogRVhURU5ERUU6IFwiQmF6XCIgaXMgbm90IGRlZmluZWQuXG4iKTsKK30KKworCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUGFja2FnZVRvb0xvbmcpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJzeW50YXg6IFwicHJvdG8zXCIgIgorICAgICAgInBhY2thZ2U6ICIKKyAgICAgICJcImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiCisgICAgICAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIgorICAgICAgImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIKKyAgICAgICJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiCisgICAgICAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIgorICAgICAgImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIKKyAgICAgICJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiCisgICAgICAiYWFhYWFhYWFhYVwiIiwKKyAgICAgICJmb28ucHJvdG86ICIKKyAgICAgICJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiCisgICAgICAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIgorICAgICAgImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIKKyAgICAgICJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiCisgICAgICAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIgorICAgICAgImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIKKyAgICAgICJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiCisgICAgICAiYWFhYWFhYWE6IE5BTUU6IFBhY2thZ2UgbmFtZSBpcyB0b28gbG9uZ1xuIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERlc2NyaXB0b3JEYXRhYmFzZQorCitzdGF0aWMgdm9pZCBBZGRUb0RhdGFiYXNlKFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSogZGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVfdGV4dCkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhmaWxlX3RleHQsICZmaWxlX3Byb3RvKSk7CisgIGRhdGFiYXNlLT5BZGQoZmlsZV9wcm90byk7Cit9CisKK2NsYXNzIERhdGFiYXNlQmFja2VkUG9vbFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBEYXRhYmFzZUJhY2tlZFBvb2xUZXN0KCkge30KKworICBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UgZGF0YWJhc2VfOworCisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgQWRkVG9EYXRhYmFzZSgKKyAgICAgICAgJmRhdGFiYXNlXywKKyAgICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6J0ZvbycgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAxMDAgfSB9ICIKKyAgICAgICAgImVudW1fdHlwZSB7IG5hbWU6J1Rlc3RFbnVtJyB2YWx1ZSB7IG5hbWU6J0RVTU1ZJyBudW1iZXI6MCB9IH0gIgorICAgICAgICAic2VydmljZSB7IG5hbWU6J1Rlc3RTZXJ2aWNlJyB9ICIpOworICAgIEFkZFRvRGF0YWJhc2UoJmRhdGFiYXNlXywKKyAgICAgICAgICAgICAgICAgICJuYW1lOiAnYmFyLnByb3RvJyAiCisgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jeTogJ2Zvby5wcm90bycgIgorICAgICAgICAgICAgICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6J0JhcicgfSAiCisgICAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTonZm9vX2V4dCcgZXh0ZW5kZWU6ICcuRm9vJyBudW1iZXI6NSAiCisgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0gIik7CisgICAgLy8gQmF6IGhhcyBhbiB1bmRlY2xhcmVkIGRlcGVuZGVuY3kgb24gRm9vLgorICAgIEFkZFRvRGF0YWJhc2UoCisgICAgICAgICZkYXRhYmFzZV8sCisgICAgICAgICJuYW1lOiAnYmF6LnByb3RvJyAiCisgICAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAgICIgIG5hbWU6J0JheicgIgorICAgICAgICAiICBmaWVsZCB7IG5hbWU6J2ZvbycgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOidGb28nIH0gIgorICAgICAgICAifSIpOworICB9CisKKyAgLy8gV2UgY2FuJ3QgaW5qZWN0IGEgZmlsZSBjb250YWluaW5nIGVycm9ycyBpbnRvIGEgRGVzY3JpcHRvclBvb2wsIHNvIHdlCisgIC8vIG5lZWQgYW4gYWN0dWFsIG1vY2sgRGVzY3JpcHRvckRhdGFiYXNlIHRvIHRlc3QgZXJyb3JzLgorICBjbGFzcyBFcnJvckRlc2NyaXB0b3JEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgeworICAgcHVibGljOgorICAgIEVycm9yRGVzY3JpcHRvckRhdGFiYXNlKCkge30KKyAgICB+RXJyb3JEZXNjcmlwdG9yRGF0YWJhc2UoKSBvdmVycmlkZSB7fQorCisgICAgLy8gaW1wbGVtZW50cyBEZXNjcmlwdG9yRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgYm9vbCBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIG92ZXJyaWRlIHsKKyAgICAgIC8vIGVycm9yLnByb3RvIGFuZCBlcnJvcjIucHJvdG8gY3ljbGljYWxseSBpbXBvcnQgZWFjaCBvdGhlci4KKyAgICAgIGlmIChmaWxlbmFtZSA9PSAiZXJyb3IucHJvdG8iKSB7CisgICAgICAgIG91dHB1dC0+Q2xlYXIoKTsKKyAgICAgICAgb3V0cHV0LT5zZXRfbmFtZSgiZXJyb3IucHJvdG8iKTsKKyAgICAgICAgb3V0cHV0LT5hZGRfZGVwZW5kZW5jeSgiZXJyb3IyLnByb3RvIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIGlmIChmaWxlbmFtZSA9PSAiZXJyb3IyLnByb3RvIikgeworICAgICAgICBvdXRwdXQtPkNsZWFyKCk7CisgICAgICAgIG91dHB1dC0+c2V0X25hbWUoImVycm9yMi5wcm90byIpOworICAgICAgICBvdXRwdXQtPmFkZF9kZXBlbmRlbmN5KCJlcnJvci5wcm90byIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9OworCisgIC8vIEEgRGVzY3JpcHRvckRhdGFiYXNlIHRoYXQgY291bnRzIGhvdyBtYW55IHRpbWVzIGVhY2ggbWV0aG9kIGhhcyBiZWVuCisgIC8vIGNhbGxlZCBhbmQgZm9yd2FyZHMgdG8gc29tZSBvdGhlciBEZXNjcmlwdG9yRGF0YWJhc2UuCisgIGNsYXNzIENhbGxDb3VudGluZ0RhdGFiYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZSB7CisgICBwdWJsaWM6CisgICAgQ2FsbENvdW50aW5nRGF0YWJhc2UoRGVzY3JpcHRvckRhdGFiYXNlKiB3cmFwcGVkX2RiKQorICAgICAgICA6IHdyYXBwZWRfZGJfKHdyYXBwZWRfZGIpIHsKKyAgICAgIENsZWFyKCk7CisgICAgfQorICAgIH5DYWxsQ291bnRpbmdEYXRhYmFzZSgpIG92ZXJyaWRlIHt9CisKKyAgICBEZXNjcmlwdG9yRGF0YWJhc2UqIHdyYXBwZWRfZGJfOworCisgICAgaW50IGNhbGxfY291bnRfOworCisgICAgdm9pZCBDbGVhcigpIHsgY2FsbF9jb3VudF8gPSAwOyB9CisKKyAgICAvLyBpbXBsZW1lbnRzIERlc2NyaXB0b3JEYXRhYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBib29sIEZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgb3ZlcnJpZGUgeworICAgICAgKytjYWxsX2NvdW50XzsKKyAgICAgIHJldHVybiB3cmFwcGVkX2RiXy0+RmluZEZpbGVCeU5hbWUoZmlsZW5hbWUsIG91dHB1dCk7CisgICAgfQorICAgIGJvb2wgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0ZDo6c3RyaW5nJiBzeW1ib2xfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIG92ZXJyaWRlIHsKKyAgICAgICsrY2FsbF9jb3VudF87CisgICAgICByZXR1cm4gd3JhcHBlZF9kYl8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzeW1ib2xfbmFtZSwgb3V0cHV0KTsKKyAgICB9CisgICAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgb3ZlcnJpZGUgeworICAgICAgKytjYWxsX2NvdW50XzsKKyAgICAgIHJldHVybiB3cmFwcGVkX2RiXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX251bWJlciwgb3V0cHV0KTsKKyAgICB9CisgIH07CisKKyAgLy8gQSBEZXNjcmlwdG9yRGF0YWJhc2Ugd2hpY2ggZmFsc2VseSBhbHdheXMgcmV0dXJucyBmb28ucHJvdG8gd2hlbiBzZWFyY2hpbmcKKyAgLy8gZm9yIGFueSBzeW1ib2wgb3IgZXh0ZW5zaW9uIG51bWJlci4gIFRoaXMgc2hvdWxkbid0IGNhdXNlIHRoZQorICAvLyBEZXNjcmlwdG9yUG9vbCB0byByZWxvYWQgZm9vLnByb3RvIGlmIGl0IGlzIGFscmVhZHkgbG9hZGVkLgorICBjbGFzcyBGYWxzZVBvc2l0aXZlRGF0YWJhc2UgOiBwdWJsaWMgRGVzY3JpcHRvckRhdGFiYXNlIHsKKyAgIHB1YmxpYzoKKyAgICBGYWxzZVBvc2l0aXZlRGF0YWJhc2UoRGVzY3JpcHRvckRhdGFiYXNlKiB3cmFwcGVkX2RiKQorICAgICAgICA6IHdyYXBwZWRfZGJfKHdyYXBwZWRfZGIpIHt9CisgICAgfkZhbHNlUG9zaXRpdmVEYXRhYmFzZSgpIG92ZXJyaWRlIHt9CisKKyAgICBEZXNjcmlwdG9yRGF0YWJhc2UqIHdyYXBwZWRfZGJfOworCisgICAgLy8gaW1wbGVtZW50cyBEZXNjcmlwdG9yRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgYm9vbCBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiB3cmFwcGVkX2RiXy0+RmluZEZpbGVCeU5hbWUoZmlsZW5hbWUsIG91dHB1dCk7CisgICAgfQorICAgIGJvb2wgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0ZDo6c3RyaW5nJiBzeW1ib2xfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBGaW5kRmlsZUJ5TmFtZSgiZm9vLnByb3RvIiwgb3V0cHV0KTsKKyAgICB9CisgICAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIEZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iLCBvdXRwdXQpOworICAgIH0KKyAgfTsKK307CisKK1RFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBGaW5kRmlsZUJ5TmFtZSkgeworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZkYXRhYmFzZV8pOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb28gPSBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKTsKKyAgQVNTRVJUX1RSVUUoZm9vICE9IG51bGxwdHIpOworICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZvby0+bmFtZSgpKTsKKyAgQVNTRVJUX0VRKDEsIGZvby0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICBFWFBFQ1RfRVEoIkZvbyIsIGZvby0+bWVzc2FnZV90eXBlKDApLT5uYW1lKCkpOworCisgIEVYUEVDVF9FUShmb28sIHBvb2wuRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpKTsKKworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJub19zdWNoX2ZpbGUucHJvdG8iKSA9PSBudWxscHRyKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmREZXBlbmRlbmN5QmVmb3JlRGVwZW5kZW50KSB7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXyk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpOworICBBU1NFUlRfVFJVRShmb28gIT0gbnVsbHB0cik7CisgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZm9vLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgZm9vLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIEVYUEVDVF9FUSgiRm9vIiwgZm9vLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhciA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImJhci5wcm90byIpOworICBBU1NFUlRfVFJVRShiYXIgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgYmFyLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgYmFyLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIEVYUEVDVF9FUSgiQmFyIiwgYmFyLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7CisKKyAgQVNTRVJUX0VRKDEsIGJhci0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKGZvbywgYmFyLT5kZXBlbmRlbmN5KDApKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmREZXBlbmRlbnRCZWZvcmVEZXBlbmRlbmN5KSB7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXyk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhciA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImJhci5wcm90byIpOworICBBU1NFUlRfVFJVRShiYXIgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgYmFyLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgYmFyLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIEFTU0VSVF9FUSgiQmFyIiwgYmFyLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpOworICBBU1NFUlRfVFJVRShmb28gIT0gbnVsbHB0cik7CisgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZm9vLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgZm9vLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIEFTU0VSVF9FUSgiRm9vIiwgZm9vLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7CisKKyAgQVNTRVJUX0VRKDEsIGJhci0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKGZvbywgYmFyLT5kZXBlbmRlbmN5KDApKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCkgeworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZkYXRhYmFzZV8pOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvbyIpOworICBBU1NFUlRfVFJVRShmaWxlICE9IG51bGxwdHIpOworICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUtPm5hbWUoKSk7CisgIEVYUEVDVF9FUShmaWxlLCBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKSk7CisKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIk5vU3VjaFN5bWJvbCIpID09IG51bGxwdHIpOworfQorCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRmluZE1lc3NhZ2VUeXBlQnlOYW1lKSB7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXyk7CisKKyAgY29uc3QgRGVzY3JpcHRvciogdHlwZSA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28iKTsKKyAgQVNTRVJUX1RSVUUodHlwZSAhPSBudWxscHRyKTsKKyAgRVhQRUNUX0VRKCJGb28iLCB0eXBlLT5uYW1lKCkpOworICBFWFBFQ1RfRVEodHlwZS0+ZmlsZSgpLCBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKSk7CisKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIk5vU3VjaFR5cGUiKSA9PSBudWxscHRyKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmRFeHRlbnNpb25CeU51bWJlcikgeworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZkYXRhYmFzZV8pOworCisgIGNvbnN0IERlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28iKTsKKyAgQVNTRVJUX1RSVUUoZm9vICE9IG51bGxwdHIpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uID0gcG9vbC5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZm9vLCA1KTsKKyAgQVNTRVJUX1RSVUUoZXh0ZW5zaW9uICE9IG51bGxwdHIpOworICBFWFBFQ1RfRVEoImZvb19leHQiLCBleHRlbnNpb24tPm5hbWUoKSk7CisgIEVYUEVDVF9FUShleHRlbnNpb24tPmZpbGUoKSwgcG9vbC5GaW5kRmlsZUJ5TmFtZSgiYmFyLnByb3RvIikpOworCisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEV4dGVuc2lvbkJ5TnVtYmVyKGZvbywgMTIpID09IG51bGxwdHIpOworfQorCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRmluZEFsbEV4dGVuc2lvbnMpIHsKKyAgRGVzY3JpcHRvclBvb2wgcG9vbCgmZGF0YWJhc2VfKTsKKworICBjb25zdCBEZXNjcmlwdG9yKiBmb28gPSBwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiRm9vIik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAvLyBSZXBlYXQgdGhlIGxvb2t1cCB0d2ljZSwgdG8gY2hlY2sgdGhhdCB3ZSBnZXQgY29uc2lzdGVudAorICAgIC8vIHJlc3VsdHMgZGVzcGl0ZSB0aGUgZmFsbGJhY2sgZGF0YWJhc2UgbG9va3VwIG11dGF0aW5nIHRoZSBwb29sLgorICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGV4dGVuc2lvbnM7CisgICAgcG9vbC5GaW5kQWxsRXh0ZW5zaW9ucyhmb28sICZleHRlbnNpb25zKTsKKyAgICBBU1NFUlRfRVEoMSwgZXh0ZW5zaW9ucy5zaXplKCkpOworICAgIEVYUEVDVF9FUSg1LCBleHRlbnNpb25zWzBdLT5udW1iZXIoKSk7CisgIH0KK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEVycm9yV2l0aG91dEVycm9yQ29sbGVjdG9yKSB7CisgIEVycm9yRGVzY3JpcHRvckRhdGFiYXNlIGVycm9yX2RhdGFiYXNlOworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZlcnJvcl9kYXRhYmFzZSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVycm9yczsKKworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKKyAgICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJlcnJvci5wcm90byIpID09IG51bGxwdHIpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKworICBFWFBFQ1RfRkFMU0UoZXJyb3JzLmVtcHR5KCkpOworfQorCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRXJyb3JXaXRoRXJyb3JDb2xsZWN0b3IpIHsKKyAgRXJyb3JEZXNjcmlwdG9yRGF0YWJhc2UgZXJyb3JfZGF0YWJhc2U7CisgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmVycm9yX2RhdGFiYXNlLCAmZXJyb3JfY29sbGVjdG9yKTsKKworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJlcnJvci5wcm90byIpID09IG51bGxwdHIpOworICBFWFBFQ1RfRVEoCisgICAgICAiZXJyb3IucHJvdG86IGVycm9yMi5wcm90bzogSU1QT1JUOiBGaWxlIHJlY3Vyc2l2ZWx5IGltcG9ydHMgaXRzZWxmOiAiCisgICAgICAiZXJyb3IucHJvdG8gLT4gZXJyb3IyLnByb3RvIC0+IGVycm9yLnByb3RvXG4iCisgICAgICAiZXJyb3IyLnByb3RvOiBlcnJvci5wcm90bzogSU1QT1JUOiBJbXBvcnQgXCJlcnJvci5wcm90b1wiIHdhcyBub3QgIgorICAgICAgImZvdW5kIG9yIGhhZCBlcnJvcnMuXG4iCisgICAgICAiZXJyb3IucHJvdG86IGVycm9yMi5wcm90bzogSU1QT1JUOiBJbXBvcnQgXCJlcnJvcjIucHJvdG9cIiB3YXMgbm90ICIKKyAgICAgICJmb3VuZCBvciBoYWQgZXJyb3JzLlxuIiwKKyAgICAgIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7Cit9CisKK1RFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBVbmRlY2xhcmVkRGVwZW5kZW5jeU9uVW5idWlsdFR5cGUpIHsKKyAgLy8gQ2hlY2sgdGhhdCB3ZSBmaW5kIGFuZCByZXBvcnQgdW5kZWNsYXJlZCBkZXBlbmRlbmNpZXMgb24gdHlwZXMgdGhhdCBleGlzdAorICAvLyBpbiB0aGUgZGVzY3JpcHRvciBkYXRhYmFzZSBidXQgdGhhdCBoYXZlIG5vdCBub3QgYmVlbiBidWlsdCB5ZXQuCisgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXywgJmVycm9yX2NvbGxlY3Rvcik7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJCYXoiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0VRKAorICAgICAgImJhei5wcm90bzogQmF6LmZvbzogVFlQRTogXCJGb29cIiBzZWVtcyB0byBiZSBkZWZpbmVkIGluIFwiZm9vLnByb3RvXCIsICIKKyAgICAgICJ3aGljaCBpcyBub3QgaW1wb3J0ZWQgYnkgXCJiYXoucHJvdG9cIi4gIFRvIHVzZSBpdCBoZXJlLCBwbGVhc2UgYWRkICIKKyAgICAgICJ0aGUgbmVjZXNzYXJ5IGltcG9ydC5cbiIsCisgICAgICBlcnJvcl9jb2xsZWN0b3IudGV4dF8pOworfQorCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgUm9sbGJhY2tBZnRlckVycm9yKSB7CisgIC8vIE1ha2Ugc3VyZSB0aGF0IGFsbCB0cmFjZXMgb2YgYmFkIHR5cGVzIGFyZSByZW1vdmVkIGZyb20gdGhlIHBvb2wuIFRoaXMgdXNlZAorICAvLyB0byBiZSBiLzQ1Mjk0MzYsIGR1ZSB0byB0aGUgZmFjdCB0aGF0IGEgc3ltYm9sIHJlc29sdXRpb24gZmFpbHVyZSBjb3VsZAorICAvLyBwb3RlbnRpYWxseSBjYXVzZSBhbm90aGVyIGZpbGUgdG8gYmUgcmVjdXJzaXZlbHkgYnVpbHQsIHdoaWNoIHdvdWxkIHRyaWdnZXIKKyAgLy8gYSBjaGVja3BvaW50IF9wYXN0XyBwb3NzaWJseSBpbnZhbGlkIHN5bWJvbHMuCisgIC8vIEJheiBpcyBkZWZpbmVkIGluIHRoZSBkYXRhYmFzZSwgYnV0IHRoZSBmaWxlIGlzIGludmFsaWQgYmVjYXVzZSBpdCBpcworICAvLyBtaXNzaW5nIGEgbmVjZXNzYXJ5IGltcG9ydC4KKyAgRGVzY3JpcHRvclBvb2wgcG9vbCgmZGF0YWJhc2VfKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkJheiIpID09IG51bGxwdHIpOworICAvLyBNYWtlIHN1cmUgdGhhdCBzZWFyY2hpbmcgYWdhaW4gZm9yIHRoZSBmaWxlIG9yIHRoZSB0eXBlIGZhaWxzLgorICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJiYXoucHJvdG8iKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkJheiIpID09IG51bGxwdHIpOworfQorCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgVW5pdHRlc3RQcm90bykgeworICAvLyBUcnkgdG8gbG9hZCBhbGwgb2YgdW5pdHRlc3QucHJvdG8gZnJvbSBhIERlc2NyaXB0b3JEYXRhYmFzZS4gIFRoaXMgc2hvdWxkCisgIC8vIHRob3JvdWdobHkgdGVzdCBhbGwgcGF0aHMgdGhyb3VnaCBEZXNjcmlwdG9yQnVpbGRlciB0byBpbnN1cmUgdGhhdCB0aGVyZQorICAvLyBhcmUgbm8gZGVhZGxvY2tpbmcgcHJvYmxlbXMgd2hlbiBwb29sXy0+bXV0ZXhfIGlzIG5vbi1udWxsLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogb3JpZ2luYWxfZmlsZSA9CisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPmZpbGUoKTsKKworICBEZXNjcmlwdG9yUG9vbERhdGFiYXNlIGRhdGFiYXNlKCpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSk7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfZnJvbV9kYXRhYmFzZSA9CisgICAgICBwb29sLkZpbmRGaWxlQnlOYW1lKG9yaWdpbmFsX2ZpbGUtPm5hbWUoKSk7CisKKyAgQVNTRVJUX1RSVUUoZmlsZV9mcm9tX2RhdGFiYXNlICE9IG51bGxwdHIpOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3JpZ2luYWxfZmlsZV9wcm90bzsKKyAgb3JpZ2luYWxfZmlsZS0+Q29weVRvKCZvcmlnaW5hbF9maWxlX3Byb3RvKTsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfZnJvbV9kYXRhYmFzZV9wcm90bzsKKyAgZmlsZV9mcm9tX2RhdGFiYXNlLT5Db3B5VG8oJmZpbGVfZnJvbV9kYXRhYmFzZV9wcm90byk7CisKKyAgRVhQRUNUX0VRKG9yaWdpbmFsX2ZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwKKyAgICAgICAgICAgIGZpbGVfZnJvbV9kYXRhYmFzZV9wcm90by5EZWJ1Z1N0cmluZygpKTsKKworICAvLyBBbHNvIHZlcmlmeSB0aGF0IENvcHlUbygpIGRpZCBub3Qgb21pdCBhbnkgaW5mb3JtYXRpb24uCisgIEVYUEVDVF9FUShvcmlnaW5hbF9maWxlLT5EZWJ1Z1N0cmluZygpLCBmaWxlX2Zyb21fZGF0YWJhc2UtPkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRG9lc250UmV0cnlEYlVubmVjZXNzYXJpbHkpIHsKKyAgLy8gU2VhcmNoaW5nIGZvciBhIGNoaWxkIG9mIGFuIGV4aXN0aW5nIGRlc2NyaXB0b3Igc2hvdWxkIG5ldmVyIGZhbGwgYmFjaworICAvLyB0byB0aGUgRGVzY3JpcHRvckRhdGFiYXNlIGV2ZW4gaWYgaXQgaXNuJ3QgZm91bmQsIGJlY2F1c2Ugd2Uga25vdyBhbGwKKyAgLy8gY2hpbGRyZW4gYXJlIGFscmVhZHkgbG9hZGVkLgorICBDYWxsQ291bnRpbmdEYXRhYmFzZSBjYWxsX2NvdW50ZXIoJmRhdGFiYXNlXyk7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmNhbGxfY291bnRlcik7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKTsKKyAgQVNTRVJUX1RSVUUoZmlsZSAhPSBudWxscHRyKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZm9vID0gcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkZvbyIpOworICBBU1NFUlRfVFJVRShmb28gIT0gbnVsbHB0cik7CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiB0ZXN0X2VudW0gPSBwb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgiVGVzdEVudW0iKTsKKyAgQVNTRVJUX1RSVUUodGVzdF9lbnVtICE9IG51bGxwdHIpOworICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogdGVzdF9zZXJ2aWNlID0gcG9vbC5GaW5kU2VydmljZUJ5TmFtZSgiVGVzdFNlcnZpY2UiKTsKKyAgQVNTRVJUX1RSVUUodGVzdF9zZXJ2aWNlICE9IG51bGxwdHIpOworCisgIEVYUEVDVF9ORSgwLCBjYWxsX2NvdW50ZXIuY2FsbF9jb3VudF8pOworICBjYWxsX2NvdW50ZXIuQ2xlYXIoKTsKKworICBFWFBFQ1RfVFJVRShmb28tPkZpbmRGaWVsZEJ5TmFtZSgibm9fc3VjaF9maWVsZCIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShmb28tPkZpbmRFeHRlbnNpb25CeU5hbWUoIm5vX3N1Y2hfZXh0ZW5zaW9uIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGZvby0+RmluZE5lc3RlZFR5cGVCeU5hbWUoIk5vU3VjaE1lc3NhZ2VUeXBlIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGZvby0+RmluZEVudW1UeXBlQnlOYW1lKCJOb1N1Y2hFbnVtVHlwZSIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShmb28tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIk5PX1NVQ0hfVkFMVUUiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUodGVzdF9lbnVtLT5GaW5kVmFsdWVCeU5hbWUoIk5PX1NVQ0hfVkFMVUUiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUodGVzdF9zZXJ2aWNlLT5GaW5kTWV0aG9kQnlOYW1lKCJOb1N1Y2hNZXRob2QiKSA9PSBudWxscHRyKTsKKworICBFWFBFQ1RfVFJVRShmaWxlLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIk5vU3VjaE1lc3NhZ2VUeXBlIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGZpbGUtPkZpbmRFbnVtVHlwZUJ5TmFtZSgiTm9TdWNoRW51bVR5cGUiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoZmlsZS0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiTk9fU1VDSF9WQUxVRSIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShmaWxlLT5GaW5kU2VydmljZUJ5TmFtZSgiTk9fU1VDSF9WQUxVRSIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShmaWxlLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJub19zdWNoX2V4dGVuc2lvbiIpID09IG51bGxwdHIpOworCisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJGb28ubm8uc3VjaC5maWVsZCIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiRm9vLm5vX3N1Y2hfZmllbGQiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkZvby5Ob1N1Y2hNZXNzYWdlVHlwZSIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWVsZEJ5TmFtZSgiRm9vLm5vX3N1Y2hfZmllbGQiKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJGb28ubm9fc3VjaF9leHRlbnNpb24iKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRW51bVR5cGVCeU5hbWUoIkZvby5Ob1N1Y2hFbnVtVHlwZSIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRFbnVtVmFsdWVCeU5hbWUoIkZvby5OT19TVUNIX1ZBTFVFIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1ldGhvZEJ5TmFtZSgiVGVzdFNlcnZpY2UuTm9TdWNoTWV0aG9kIikgPT0gbnVsbHB0cik7CisKKyAgRVhQRUNUX0VRKDAsIGNhbGxfY291bnRlci5jYWxsX2NvdW50Xyk7Cit9CisKK1RFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBEb2VzbnRSZWxvYWRGaWxlc1VuY2VzZXNzYXJpbHkpIHsKKyAgLy8gSWYgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCkgb3IgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCkgcmV0dXJuIGEKKyAgLy8gZmlsZSB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIERlc2NyaXB0b3JQb29sLCBpdCBzaG91bGQgbm90IGF0dGVtcHQgdG8KKyAgLy8gcmVsb2FkIHRoZSBmaWxlLgorICBGYWxzZVBvc2l0aXZlRGF0YWJhc2UgZmFsc2VfcG9zaXRpdmVfZGF0YWJhc2UoJmRhdGFiYXNlXyk7CisgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmZhbHNlX3Bvc2l0aXZlX2RhdGFiYXNlLCAmZXJyb3JfY29sbGVjdG9yKTsKKworICAvLyBGaXJzdCBtYWtlIHN1cmUgZm9vLnByb3RvIGlzIGxvYWRlZC4KKyAgY29uc3QgRGVzY3JpcHRvciogZm9vID0gcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkZvbyIpOworICBBU1NFUlRfVFJVRShmb28gIT0gbnVsbHB0cik7CisKKyAgLy8gVHJ5IGluZHVjaW5nIGZhbHNlIHBvc2l0aXZlcy4KKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIk5vU3VjaFN5bWJvbCIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRFeHRlbnNpb25CeU51bWJlcihmb28sIDIyKSA9PSBudWxscHRyKTsKKworICAvLyBObyBlcnJvcnMgc2hvdWxkIGhhdmUgYmVlbiByZXBvcnRlZC4gIChJZiBmb28ucHJvdG8gd2FzIGluY29ycmVjdGx5CisgIC8vIGxvYWRlZCBtdWx0aXBsZSB0aW1lcywgZXJyb3JzIHdvdWxkIGhhdmUgYmVlbiByZXBvcnRlZC4pCisgIEVYUEVDVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKK30KKworLy8gRGVzY3JpcHRvckRhdGFiYXNlIHRoYXQgYXR0ZW1wdHMgdG8gaW5kdWNlIGV4cG9uZW50aWFsbHktYmFkIHBlcmZvcm1hbmNlCisvLyBpbiBEZXNjcmlwdG9yUG9vbC4gRm9yIGV2ZXJ5IHBvc2l0aXZlIE4sIHRoZSBkYXRhYmFzZSBjb250YWlucyBhIGZpbGUKKy8vIGZpbGVOLnByb3RvLCB3aGljaCBkZWZpbmVzIGEgbWVzc2FnZSBNZXNzYWdlTiwgd2hpY2ggY29udGFpbnMgZmllbGRzIG9mCisvLyB0eXBlIE1lc3NhZ2VLIGZvciBhbGwgSyBpbiBbMCxOKS4gTWVzc2FnZTAgaXMgbm90IGRlZmluZWQgYW55d2hlcmUKKy8vIChmaWxlMC5wcm90byBleGlzdHMsIGJ1dCBpcyBlbXB0eSksIHNvIGV2ZXJ5IG90aGVyIGZpbGUgYW5kIG1lc3NhZ2UgdHlwZQorLy8gd2lsbCBmYWlsIHRvIGJ1aWxkLgorLy8KKy8vIElmIHRoZSBEZXNjcmlwdG9yUG9vbCBpcyBub3QgY2FyZWZ1bCB0byBtZW1vaXplIGVycm9ycywgYW4gYXR0ZW1wdCB0bworLy8gYnVpbGQgYSBkZXNjcmlwdG9yIGZvciBNZXNzYWdlTiBjYW4gcmVxdWlyZSBPKDJeTikgdGltZS4KK2NsYXNzIEV4cG9uZW50aWFsRXJyb3JEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgeworIHB1YmxpYzoKKyAgRXhwb25lbnRpYWxFcnJvckRhdGFiYXNlKCkge30KKyAgfkV4cG9uZW50aWFsRXJyb3JEYXRhYmFzZSgpIG92ZXJyaWRlIHt9CisKKyAgLy8gaW1wbGVtZW50cyBEZXNjcmlwdG9yRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgb3ZlcnJpZGUgeworICAgIGludCBmaWxlX251bSA9IC0xOworICAgIEZ1bGxNYXRjaChmaWxlbmFtZSwgImZpbGUiLCAiLnByb3RvIiwgJmZpbGVfbnVtKTsKKyAgICBpZiAoZmlsZV9udW0gPiAtMSkgeworICAgICAgcmV0dXJuIFBvcHVsYXRlRmlsZShmaWxlX251bSwgb3V0cHV0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgb3ZlcnJpZGUgeworICAgIGludCBmaWxlX251bSA9IC0xOworICAgIEZ1bGxNYXRjaChzeW1ib2xfbmFtZSwgIk1lc3NhZ2UiLCAiIiwgJmZpbGVfbnVtKTsKKyAgICBpZiAoZmlsZV9udW0gPiAwKSB7CisgICAgICByZXR1cm4gUG9wdWxhdGVGaWxlKGZpbGVfbnVtLCBvdXRwdXQpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBGdWxsTWF0Y2goY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiZWdpbl93aXRoLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZW5kX3dpdGgsIGludCogZmlsZV9udW0pIHsKKyAgICBpbnQgYmVnaW5fc2l6ZSA9IGJlZ2luX3dpdGguc2l6ZSgpOworICAgIGludCBlbmRfc2l6ZSA9IGVuZF93aXRoLnNpemUoKTsKKyAgICBpZiAobmFtZS5zdWJzdHIoMCwgYmVnaW5fc2l6ZSkgIT0gYmVnaW5fd2l0aCB8fAorICAgICAgICBuYW1lLnN1YnN0cihuYW1lLnNpemUoKSAtIGVuZF9zaXplLCBlbmRfc2l6ZSkgIT0gZW5kX3dpdGgpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2FmZV9zdHJ0bzMyKAorICAgICAgICBuYW1lLnN1YnN0cihiZWdpbl9zaXplLCBuYW1lLnNpemUoKSAtIGVuZF9zaXplIC0gYmVnaW5fc2l6ZSksIGZpbGVfbnVtKTsKKyAgfQorCisgIGJvb2wgUG9wdWxhdGVGaWxlKGludCBmaWxlX251bSwgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgICAgR09PR0xFX0NIRUNLX0dFKGZpbGVfbnVtLCAwKTsKKyAgICBvdXRwdXQtPkNsZWFyKCk7CisgICAgb3V0cHV0LT5zZXRfbmFtZShzdHJpbmdzOjpTdWJzdGl0dXRlKCJmaWxlJDAucHJvdG8iLCBmaWxlX251bSkpOworICAgIC8vIGZpbGUwLnByb3RvIGRvZXNuJ3QgZGVmaW5lIE1lc3NhZ2UwCisgICAgaWYgKGZpbGVfbnVtID4gMCkgeworICAgICAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlID0gb3V0cHV0LT5hZGRfbWVzc2FnZV90eXBlKCk7CisgICAgICBtZXNzYWdlLT5zZXRfbmFtZShzdHJpbmdzOjpTdWJzdGl0dXRlKCJNZXNzYWdlJDAiLCBmaWxlX251bSkpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlX251bTsgKytpKSB7CisgICAgICAgIG91dHB1dC0+YWRkX2RlcGVuZGVuY3koc3RyaW5nczo6U3Vic3RpdHV0ZSgiZmlsZSQwLnByb3RvIiwgaSkpOworICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQgPSBtZXNzYWdlLT5hZGRfZmllbGQoKTsKKyAgICAgICAgZmllbGQtPnNldF9uYW1lKHN0cmluZ3M6OlN1YnN0aXR1dGUoImZpZWxkJDAiLCBpKSk7CisgICAgICAgIGZpZWxkLT5zZXRfbnVtYmVyKGkpOworICAgICAgICBmaWVsZC0+c2V0X2xhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCk7CisgICAgICAgIGZpZWxkLT5zZXRfdHlwZShGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9NRVNTQUdFKTsKKyAgICAgICAgZmllbGQtPnNldF90eXBlX25hbWUoc3RyaW5nczo6U3Vic3RpdHV0ZSgiTWVzc2FnZSQwIiwgaSkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIERvZXNudFJlbG9hZEtub3duQmFkRmlsZXMpIHsKKyAgRXhwb25lbnRpYWxFcnJvckRhdGFiYXNlIGVycm9yX2RhdGFiYXNlOworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZlcnJvcl9kYXRhYmFzZSk7CisKKyAgR09PR0xFX0xPRyhJTkZPKSA8PCAiQSB0aW1lb3V0IGluIHRoaXMgdGVzdCBwcm9iYWJseSBpbmRpY2F0ZXMgYSByZWFsIGJ1Zy4iOworCisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEZpbGVCeU5hbWUoImZpbGU0MC5wcm90byIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiTWVzc2FnZTQwIikgPT0gbnVsbHB0cik7Cit9CisKK1RFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBEb2VzbnRGYWxsYmFja09uV3JvbmdUeXBlKSB7CisgIC8vIElmIGEgbG9va3VwIGZpbmRzIGEgc3ltYm9sIG9mIHRoZSB3cm9uZyB0eXBlIChlLmcuIHdlIHBhc3MgYSB0eXBlIG5hbWUKKyAgLy8gdG8gRmluZEZpZWxkQnlOYW1lKCkpLCB3ZSBzaG91bGQgZmFpbCBmYXN0LCB3aXRob3V0IGNoZWNraW5nIHRoZSBmYWxsYmFjaworICAvLyBkYXRhYmFzZS4KKyAgQ2FsbENvdW50aW5nRGF0YWJhc2UgY2FsbF9jb3VudGVyKCZkYXRhYmFzZV8pOworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZjYWxsX2NvdW50ZXIpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5GaW5kRmlsZUJ5TmFtZSgiZm9vLnByb3RvIik7CisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gbnVsbHB0cik7CisgIGNvbnN0IERlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28iKTsKKyAgQVNTRVJUX1RSVUUoZm9vICE9IG51bGxwdHIpOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogdGVzdF9lbnVtID0gcG9vbC5GaW5kRW51bVR5cGVCeU5hbWUoIlRlc3RFbnVtIik7CisgIEFTU0VSVF9UUlVFKHRlc3RfZW51bSAhPSBudWxscHRyKTsKKworICBFWFBFQ1RfTkUoMCwgY2FsbF9jb3VudGVyLmNhbGxfY291bnRfKTsKKyAgY2FsbF9jb3VudGVyLkNsZWFyKCk7CisKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIlRlc3RFbnVtIikgPT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEZpZWxkQnlOYW1lKCJGb28iKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJGb28iKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRW51bVR5cGVCeU5hbWUoIkZvbyIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRFbnVtVmFsdWVCeU5hbWUoIkZvbyIpID09IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRTZXJ2aWNlQnlOYW1lKCJGb28iKSA9PSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kTWV0aG9kQnlOYW1lKCJGb28iKSA9PSBudWxscHRyKTsKKworICBFWFBFQ1RfRVEoMCwgY2FsbF9jb3VudGVyLmNhbGxfY291bnRfKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBBYm9ydGluZ0Vycm9yQ29sbGVjdG9yIDogcHVibGljIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciB7CisgcHVibGljOgorICBBYm9ydGluZ0Vycm9yQ29sbGVjdG9yKCkge30KKworICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBtZXNzYWdlLCBFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlKSBvdmVycmlkZSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkFkZEVycm9yKCkgY2FsbGVkIHVuZXhwZWN0ZWRseTogIiA8PCBmaWxlbmFtZSA8PCAiIFsiCisgICAgICAgICAgICAgICA8PCBlbGVtZW50X25hbWUgPDwgIl06ICIgPDwgZXJyb3JfbWVzc2FnZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFib3J0aW5nRXJyb3JDb2xsZWN0b3IpOworfTsKKworLy8gQSBzb3VyY2UgdHJlZSBjb250YWluaW5nIG9ubHkgb25lIGZpbGUuCitjbGFzcyBTaW5nbGV0b25Tb3VyY2VUcmVlIDogcHVibGljIGNvbXBpbGVyOjpTb3VyY2VUcmVlIHsKKyBwdWJsaWM6CisgIFNpbmdsZXRvblNvdXJjZVRyZWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMpCisgICAgICA6IGZpbGVuYW1lXyhmaWxlbmFtZSksIGNvbnRlbnRzXyhjb250ZW50cykge30KKworICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogT3Blbihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZmlsZW5hbWUgPT0gZmlsZW5hbWVfCisgICAgICAgICAgICAgICA/IG5ldyBpbzo6QXJyYXlJbnB1dFN0cmVhbShjb250ZW50c18uZGF0YSgpLCBjb250ZW50c18uc2l6ZSgpKQorICAgICAgICAgICAgICAgOiBudWxscHRyOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlbmFtZV87CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvbnRlbnRzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2luZ2xldG9uU291cmNlVHJlZSk7Cit9OworCitjb25zdCBjaGFyKiBjb25zdCBrU291cmNlTG9jYXRpb25UZXN0SW5wdXQgPQorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJvcHRpb24gamF2YV9wYWNrYWdlID0gXCJjb20uZm9vLmJhclwiO1xuIgorICAgICJvcHRpb24gKHRlc3RfZmlsZV9vcHQpID0gXCJmb29iYXJcIjtcbiIKKyAgICAibWVzc2FnZSBBIHtcbiIKKyAgICAiICBvcHRpb24gKHRlc3RfbXNnX29wdCkgPSBcImZvb2JhclwiO1xuIgorICAgICIgIG9wdGlvbmFsIGludDMyIGEgPSAxIFtkZXByZWNhdGVkID0gdHJ1ZV07XG4iCisgICAgIiAgbWVzc2FnZSBCIHtcbiIKKyAgICAiICAgIHJlcXVpcmVkIGRvdWJsZSBiID0gMSBbKHRlc3RfZmllbGRfb3B0KSA9IFwiZm9vYmFyXCJdO1xuIgorICAgICIgIH1cbiIKKyAgICAiICBvbmVvZiBjIHtcbiIKKyAgICAiICAgIG9wdGlvbiAodGVzdF9vbmVvZl9vcHQpID0gXCJmb29iYXJcIjtcbiIKKyAgICAiICAgIHN0cmluZyBkID0gMjtcbiIKKyAgICAiICAgIHN0cmluZyBlID0gMztcbiIKKyAgICAiICAgIHN0cmluZyBmID0gNDtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIKKyAgICAiZW51bSBJbmRlY2lzaW9uIHtcbiIKKyAgICAiICBvcHRpb24gKHRlc3RfZW51bV9vcHQpID0gMjE7XG4iCisgICAgIiAgb3B0aW9uICh0ZXN0X2VudW1fb3B0KSA9IDQyO1xuIgorICAgICIgIG9wdGlvbiAodGVzdF9lbnVtX29wdCkgPSA2MztcbiIKKyAgICAiICBZRVMgICA9IDEgWyh0ZXN0X2VudW12YWxfb3B0KS5hID0gMTAwXTtcbiIKKyAgICAiICBOTyAgICA9IDIgWyh0ZXN0X2VudW12YWxfb3B0KSA9IHthOjIwMH1dO1xuIgorICAgICIgIE1BWUJFID0gMztcbiIKKyAgICAifVxuIgorICAgICJzZXJ2aWNlIFMge1xuIgorICAgICIgIG9wdGlvbiAodGVzdF9zdmNfb3B0KSA9IHthOjEwMH07XG4iCisgICAgIiAgb3B0aW9uICh0ZXN0X3N2Y19vcHQpID0ge2E6MjAwfTtcbiIKKyAgICAiICBvcHRpb24gKHRlc3Rfc3ZjX29wdCkgPSB7YTozMDB9O1xuIgorICAgICIgIHJwYyBNZXRob2QoQSkgcmV0dXJucyAoQS5CKTtcbiIKKyAgICAvLyBQdXQgYW4gZW1wdHkgbGluZSBoZXJlIHRvIG1ha2UgdGhlIHNvdXJjZSBsb2NhdGlvbiByYW5nZSBtYXRjaC4KKyAgICAiXG4iCisgICAgIiAgcnBjIE90aGVyTWV0aG9kKEEpIHJldHVybnMgKEEpIHtcbiIKKyAgICAiICAgIG9wdGlvbiBkZXByZWNhdGVkID0gdHJ1ZTtcbiIKKyAgICAiICAgIG9wdGlvbiAodGVzdF9tZXRob2Rfb3B0KSA9IFwiZm9vYmFyXCI7XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iCisgICAgIm1lc3NhZ2UgTWVzc2FnZVdpdGhFeHRlbnNpb25zIHtcbiIKKyAgICAiICBleHRlbnNpb25zIDEwMDAgdG8gMjAwMCwgMjAwMSB0byBtYXggWyh0ZXN0X2V4dF9vcHQpID0gXCJmb29iYXJcIl07XG4iCisgICAgIn1cbiIKKyAgICAiZXh0ZW5kIE1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyB7XG4iCisgICAgIiAgcmVwZWF0ZWQgaW50MzIgaW50MzJfZXh0ZW5zaW9uID0gMTAwMSBbcGFja2VkPXRydWVdO1xuIgorICAgICJ9XG4iCisgICAgIm1lc3NhZ2UgQyB7XG4iCisgICAgIiAgZXh0ZW5kIE1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyB7XG4iCisgICAgIiAgICBvcHRpb25hbCBDIG1lc3NhZ2VfZXh0ZW5zaW9uID0gMTAwMjtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIKKyAgICAiaW1wb3J0IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIjtcbiIKKyAgICAiZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyB7XG4iCisgICAgIiAgb3B0aW9uYWwgc3RyaW5nIHRlc3RfZmlsZV9vcHQgPSAxMDEwMTtcbiIKKyAgICAifVxuIgorICAgICJleHRlbmQgZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIHtcbiIKKyAgICAiICBvcHRpb25hbCBzdHJpbmcgdGVzdF9tc2dfb3B0ID0gMTAxMDE7XG4iCisgICAgIn1cbiIKKyAgICAiZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMge1xuIgorICAgICIgIG9wdGlvbmFsIHN0cmluZyB0ZXN0X2ZpZWxkX29wdCA9IDEwMTAxO1xuIgorICAgICJ9XG4iCisgICAgImV4dGVuZCBnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMge1xuIgorICAgICIgIHJlcGVhdGVkIGludDMyIHRlc3RfZW51bV9vcHQgPSAxMDEwMTtcbiIKKyAgICAifVxuIgorICAgICJleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMge1xuIgorICAgICIgIG9wdGlvbmFsIEEgdGVzdF9lbnVtdmFsX29wdCA9IDEwMTAxO1xuIgorICAgICJ9XG4iCisgICAgImV4dGVuZCBnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMge1xuIgorICAgICIgIHJlcGVhdGVkIEEgdGVzdF9zdmNfb3B0ID0gMTAxMDE7XG4iCisgICAgIn1cbiIKKyAgICAiZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zIHtcbiIKKyAgICAiICBvcHRpb25hbCBzdHJpbmcgdGVzdF9tZXRob2Rfb3B0ID0gMTAxMDE7XG4iCisgICAgIn1cbiIKKyAgICAiZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMge1xuIgorICAgICIgIG9wdGlvbmFsIHN0cmluZyB0ZXN0X29uZW9mX29wdCA9IDEwMTAxO1xuIgorICAgICJ9XG4iCisgICAgImV4dGVuZCBnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zIHtcbiIKKyAgICAiICBvcHRpb25hbCBzdHJpbmcgdGVzdF9leHRfb3B0ID0gMTAxMDE7XG4iCisgICAgIn1cbiI7CisKK2NsYXNzIFNvdXJjZUxvY2F0aW9uVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uVGVzdCgpCisgICAgICA6IHNvdXJjZV90cmVlXygiL3Rlc3QvdGVzdC5wcm90byIsIGtTb3VyY2VMb2NhdGlvblRlc3RJbnB1dCksCisgICAgICAgIHNpbXBsZV9kYl8oKSwKKyAgICAgICAgc291cmNlX3RyZWVfZGJfKCZzb3VyY2VfdHJlZV8pLAorICAgICAgICBtZXJnZWRfZGJfKCZzaW1wbGVfZGJfLCAmc291cmNlX3RyZWVfZGJfKSwKKyAgICAgICAgcG9vbF8oJm1lcmdlZF9kYl8sICZjb2xsZWN0b3JfKSB7CisgICAgLy8gd2UgbmVlZCBkZXNjcmlwdG9yLnByb3RvIHRvIGJlIGFjY2Vzc2libGUgYnkgdGhlIHBvb2wKKyAgICAvLyBzaW5jZSBvdXIgdGVzdCBmaWxlIGltcG9ydHMgaXQKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKCZmaWxlX3Byb3RvXyk7CisgICAgc2ltcGxlX2RiXy5BZGQoZmlsZV9wcm90b18pOworICB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFByaW50U291cmNlTG9jYXRpb24oY29uc3QgU291cmNlTG9jYXRpb24mIGxvYykgeworICAgIHJldHVybiBzdHJpbmdzOjpTdWJzdGl0dXRlKCIkMDokMS0kMjokMyIsIDEgKyBsb2Muc3RhcnRfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICsgbG9jLnN0YXJ0X2NvbHVtbiwgMSArIGxvYy5lbmRfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICsgbG9jLmVuZF9jb2x1bW4pOworICB9CisKKyBwcml2YXRlOgorICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG9fOworICBBYm9ydGluZ0Vycm9yQ29sbGVjdG9yIGNvbGxlY3Rvcl87CisgIFNpbmdsZXRvblNvdXJjZVRyZWUgc291cmNlX3RyZWVfOworICBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2Ugc2ltcGxlX2RiXzsgIC8vIGNvbnRhaW5zIGRlc2NyaXB0b3IucHJvdG8KKyAgY29tcGlsZXI6OlNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2Ugc291cmNlX3RyZWVfZGJfOyAgLy8gbG9hZHMgdGVzdC5wcm90bworICBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UgbWVyZ2VkX2RiXzsgIC8vIGNvbWJpbmVzIGFib3ZlIHR3byBkYnMKKworIHByb3RlY3RlZDoKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisKKyAgLy8gdGFnIG51bWJlciBvZiBhbGwgY3VzdG9tIG9wdGlvbnMgaW4gYWJvdmUgdGVzdCBmaWxlCisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtDdXN0b21PcHRpb25GaWVsZE51bWJlciA9IDEwMTAxOworICAvLyB0YWcgbnVtYmVyIG9mIGZpZWxkICJhIiBpbiBtZXNzYWdlIHR5cGUgIkEiIGluIGFib3ZlIHRlc3QgZmlsZQorICBzdGF0aWMgY29uc3RleHByIGludCBrQUZpZWxkTnVtYmVyID0gMTsKK307CisKKy8vIFRPRE8oYWRvbm92YW4pOiBpbXBsZW1lbnQgc3VwcG9ydCBmb3Igb3B0aW9uIGZpZWxkcyBhbmQgZm9yCisvLyBzdWJwYXJ0cyBvZiBkZWNsYXJhdGlvbnMuCisKK1RFU1RfRihTb3VyY2VMb2NhdGlvblRlc3QsIEdldFNvdXJjZUxvY2F0aW9uKSB7CisgIFNvdXJjZUxvY2F0aW9uIGxvYzsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV9kZXNjID0KKyAgICAgIEdPT0dMRV9DSEVDS19OT1ROVUxMKHBvb2xfLkZpbmRGaWxlQnlOYW1lKCIvdGVzdC90ZXN0LnByb3RvIikpOworCisgIGNvbnN0IERlc2NyaXB0b3IqIGFfZGVzYyA9IGZpbGVfZGVzYy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJBIik7CisgIEVYUEVDVF9UUlVFKGFfZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJmxvYykpOworICBFWFBFQ1RfRVEoIjQ6MS0xNjoyIiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICBjb25zdCBEZXNjcmlwdG9yKiBhX2JfZGVzYyA9IGFfZGVzYy0+RmluZE5lc3RlZFR5cGVCeU5hbWUoIkIiKTsKKyAgRVhQRUNUX1RSVUUoYV9iX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKCZsb2MpKTsKKyAgRVhQRUNUX0VRKCI3OjMtOTo0IiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICBjb25zdCBFbnVtRGVzY3JpcHRvciogZV9kZXNjID0gZmlsZV9kZXNjLT5GaW5kRW51bVR5cGVCeU5hbWUoIkluZGVjaXNpb24iKTsKKyAgRVhQRUNUX1RSVUUoZV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7CisgIEVYUEVDVF9FUSgiMTc6MS0yNDoyIiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB5ZXNfZGVzYyA9IGVfZGVzYy0+RmluZFZhbHVlQnlOYW1lKCJZRVMiKTsKKyAgRVhQRUNUX1RSVUUoeWVzX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKCZsb2MpKTsKKyAgRVhQRUNUX0VRKCIyMTozLTIxOjQyIiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc19kZXNjID0gZmlsZV9kZXNjLT5GaW5kU2VydmljZUJ5TmFtZSgiUyIpOworICBFWFBFQ1RfVFJVRShzX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKCZsb2MpKTsKKyAgRVhQRUNUX0VRKCIyNToxLTM1OjIiLCBQcmludFNvdXJjZUxvY2F0aW9uKGxvYykpOworCisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1fZGVzYyA9IHNfZGVzYy0+RmluZE1ldGhvZEJ5TmFtZSgiTWV0aG9kIik7CisgIEVYUEVDVF9UUlVFKG1fZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJmxvYykpOworICBFWFBFQ1RfRVEoIjI5OjMtMjk6MzEiLCBQcmludFNvdXJjZUxvY2F0aW9uKGxvYykpOworfQorCitURVNUX0YoU291cmNlTG9jYXRpb25UZXN0LCBFeHRlbnNpb25Tb3VyY2VMb2NhdGlvbikgeworICBTb3VyY2VMb2NhdGlvbiBsb2M7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfZGVzYyA9CisgICAgICBHT09HTEVfQ0hFQ0tfTk9UTlVMTChwb29sXy5GaW5kRmlsZUJ5TmFtZSgiL3Rlc3QvdGVzdC5wcm90byIpKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGludDMyX2V4dGVuc2lvbl9kZXNjID0KKyAgICAgIGZpbGVfZGVzYy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiaW50MzJfZXh0ZW5zaW9uIik7CisgIEVYUEVDVF9UUlVFKGludDMyX2V4dGVuc2lvbl9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7CisgIEVYUEVDVF9FUSgiNDA6My00MDo1NSIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKKyAgY29uc3QgRGVzY3JpcHRvciogY19kZXNjID0gZmlsZV9kZXNjLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkMiKTsKKyAgRVhQRUNUX1RSVUUoY19kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7CisgIEVYUEVDVF9FUSgiNDI6MS00NjoyIiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1lc3NhZ2VfZXh0ZW5zaW9uX2Rlc2MgPQorICAgICAgY19kZXNjLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJtZXNzYWdlX2V4dGVuc2lvbiIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlX2V4dGVuc2lvbl9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7CisgIEVYUEVDVF9FUSgiNDQ6NS00NDo0MSIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7Cit9CitURVNUX0YoU291cmNlTG9jYXRpb25UZXN0LCBJbnRlcnByZXRlZE9wdGlvblNvdXJjZUxvY2F0aW9uKSB7CisgIC8vIFRoaXMgb25lJ3MgYSBkb296eS4gSXQgY2hlY2tzIGV2ZXJ5IGtpbmQgb2Ygb3B0aW9uLCBpbmNsdWRpbmcKKyAgLy8gZXh0ZW5zaW9uIHJhbmdlIG9wdGlvbnMuCisKKyAgLy8gV2UgYXJlIHZlcmlmeWluZyB0aGF0IHRoZSBmaWxlJ3Mgc291cmNlIGluZm8gY29udGFpbnMgY29ycmVjdAorICAvLyBpbmZvIGZvciBpbnRlcnByZXRlZCBvcHRpb25zIGFuZCB0aGF0IGl0IGRvZXMgKm5vdCogY29udGFpbgorICAvLyBhbnkgaW5mbyBmb3IgY29ycmVzcG9uZGluZyB1bmludGVycHJldGVkIG9wdGlvbiBwYXRoLgorCisgIFNvdXJjZUxvY2F0aW9uIGxvYzsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV9kZXNjID0KKyAgICAgIEdPT0dMRV9DSEVDS19OT1ROVUxMKHBvb2xfLkZpbmRGaWxlQnlOYW1lKCIvdGVzdC90ZXN0LnByb3RvIikpOworCisgIC8vIEZpbGUgb3B0aW9ucworICB7CisgICAgaW50IHBhdGhbXSA9IHtGaWxlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgRmlsZU9wdGlvbnM6OmtKYXZhUGFja2FnZUZpZWxkTnVtYmVyfTsKKyAgICBpbnQgdW5pbnRbXSA9IHtGaWxlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIEZpbGVPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyLCAwfTsKKworICAgIHN0ZDo6dmVjdG9yPGludD4gdnBhdGgocGF0aCwgcGF0aCArIDIpOworICAgIEVYUEVDVF9UUlVFKGZpbGVfZGVzYy0+R2V0U291cmNlTG9jYXRpb24odnBhdGgsICZsb2MpKTsKKyAgICBFWFBFQ1RfRVEoIjI6MS0yOjM3IiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICAgIHN0ZDo6dmVjdG9yPGludD4gdnVuaW50KHVuaW50LCB1bmludCArIDMpOworICAgIEVYUEVDVF9GQUxTRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZ1bmludCwgJmxvYykpOworICB9CisgIHsKKyAgICBpbnQgcGF0aFtdID0ge0ZpbGVEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICBrQ3VzdG9tT3B0aW9uRmllbGROdW1iZXJ9OworICAgIGludCB1bmludFtdID0ge0ZpbGVEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgRmlsZU9wdGlvbnM6OmtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIsIDF9OworICAgIHN0ZDo6dmVjdG9yPGludD4gdnBhdGgocGF0aCwgcGF0aCArIDIpOworICAgIEVYUEVDVF9UUlVFKGZpbGVfZGVzYy0+R2V0U291cmNlTG9jYXRpb24odnBhdGgsICZsb2MpKTsKKyAgICBFWFBFQ1RfRVEoIjM6MS0zOjM1IiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICAgIHN0ZDo6dmVjdG9yPGludD4gdnVuaW50KHVuaW50LCB1bmludCArIDMpOworICAgIEVYUEVDVF9GQUxTRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZ1bmludCwgJmxvYykpOworICB9CisKKyAgLy8gTWVzc2FnZSBvcHRpb24KKyAgeworICAgIGludCBwYXRoW10gPSB7RmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICBrQ3VzdG9tT3B0aW9uRmllbGROdW1iZXJ9OworICAgIGludCB1bmludFtdID0ge0ZpbGVEZXNjcmlwdG9yUHJvdG86OmtNZXNzYWdlVHlwZUZpZWxkTnVtYmVyLCAwLAorICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICBNZXNzYWdlT3B0aW9uczo6a1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciwgMH07CisgICAgc3RkOjp2ZWN0b3I8aW50PiB2cGF0aChwYXRoLCBwYXRoICsgNCk7CisgICAgRVhQRUNUX1RSVUUoZmlsZV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbih2cGF0aCwgJmxvYykpOworICAgIEVYUEVDVF9FUSgiNTozLTU6MzYiLCBQcmludFNvdXJjZUxvY2F0aW9uKGxvYykpOworCisgICAgc3RkOjp2ZWN0b3I8aW50PiB2dW5pbnQodW5pbnQsIHVuaW50ICsgNSk7CisgICAgRVhQRUNUX0ZBTFNFKGZpbGVfZGVzYy0+R2V0U291cmNlTG9jYXRpb24odnVuaW50LCAmbG9jKSk7CisgIH0KKworICAvLyBGaWVsZCBvcHRpb24KKyAgeworICAgIGludCBwYXRoW10gPSB7RmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprRmllbGRGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgIEZpZWxkT3B0aW9uczo6a0RlcHJlY2F0ZWRGaWVsZE51bWJlcn07CisgICAgaW50IHVuaW50W10gPSB7RmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtGaWVsZEZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgRmllbGRPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIDB9OworICAgIHN0ZDo6dmVjdG9yPGludD4gdnBhdGgocGF0aCwgcGF0aCArIDYpOworICAgIEVYUEVDVF9UUlVFKGZpbGVfZGVzYy0+R2V0U291cmNlTG9jYXRpb24odnBhdGgsICZsb2MpKTsKKyAgICBFWFBFQ1RfRVEoIjY6MjUtNjo0MiIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZ1bmludCh1bmludCwgdW5pbnQgKyA3KTsKKyAgICBFWFBFQ1RfRkFMU0UoZmlsZV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbih2dW5pbnQsICZsb2MpKTsKKyAgfQorCisgIC8vIE5lc3RlZCBtZXNzYWdlIG9wdGlvbgorICB7CisgICAgaW50IHBhdGhbXSA9IHsKKyAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXIsIDAsCisgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a05lc3RlZFR5cGVGaWVsZE51bWJlciwgICAgICAwLAorICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtGaWVsZEZpZWxkTnVtYmVyLCAgICAgICAgICAgMCwKKyAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsICAgIGtDdXN0b21PcHRpb25GaWVsZE51bWJlcn07CisgICAgaW50IHVuaW50W10gPSB7RmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOZXN0ZWRUeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtGaWVsZEZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgRmllbGRPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIDB9OworICAgIHN0ZDo6dmVjdG9yPGludD4gdnBhdGgocGF0aCwgcGF0aCArIDgpOworICAgIEVYUEVDVF9UUlVFKGZpbGVfZGVzYy0+R2V0U291cmNlTG9jYXRpb24odnBhdGgsICZsb2MpKTsKKyAgICBFWFBFQ1RfRVEoIjg6MjgtODo1NSIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZ1bmludCh1bmludCwgdW5pbnQgKyA5KTsKKyAgICBFWFBFQ1RfRkFMU0UoZmlsZV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbih2dW5pbnQsICZsb2MpKTsKKyAgfQorCisgIC8vIE9uZS1vZiBvcHRpb24KKyAgeworICAgIGludCBwYXRoW10gPSB7CisgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtNZXNzYWdlVHlwZUZpZWxkTnVtYmVyLCAwLAorICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtPbmVvZkRlY2xGaWVsZE51bWJlciwgICAgICAgMCwKKyAgICAgICAgT25lb2ZEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsICAgIGtDdXN0b21PcHRpb25GaWVsZE51bWJlcn07CisgICAgaW50IHVuaW50W10gPSB7RmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtPbmVvZkRlY2xGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgIE9uZW9mRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIE9uZW9mT3B0aW9uczo6a1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAwfTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZwYXRoKHBhdGgsIHBhdGggKyA2KTsKKyAgICBFWFBFQ1RfVFJVRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZwYXRoLCAmbG9jKSk7CisgICAgRVhQRUNUX0VRKCIxMTo1LTExOjQwIiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICAgIHN0ZDo6dmVjdG9yPGludD4gdnVuaW50KHVuaW50LCB1bmludCArIDcpOworICAgIEVYUEVDVF9GQUxTRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZ1bmludCwgJmxvYykpOworICB9CisKKyAgLy8gRW51bSBvcHRpb24sIHJlcGVhdGVkIG9wdGlvbnMKKyAgeworICAgIGludCBwYXRoW10gPSB7RmlsZURlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAga0N1c3RvbU9wdGlvbkZpZWxkTnVtYmVyLCAwfTsKKyAgICBpbnQgdW5pbnRbXSA9IHtGaWxlRGVzY3JpcHRvclByb3RvOjprRW51bVR5cGVGaWVsZE51bWJlciwgMCwKKyAgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIEVudW1PcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyLCAwfTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZwYXRoKHBhdGgsIHBhdGggKyA1KTsKKyAgICBFWFBFQ1RfVFJVRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZwYXRoLCAmbG9jKSk7CisgICAgRVhQRUNUX0VRKCIxODozLTE4OjMxIiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICAgIHN0ZDo6dmVjdG9yPGludD4gdnVuaW50KHVuaW50LCB1bmludCArIDUpOworICAgIEVYUEVDVF9GQUxTRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZ1bmludCwgJmxvYykpOworICB9CisgIHsKKyAgICBpbnQgcGF0aFtdID0ge0ZpbGVEZXNjcmlwdG9yUHJvdG86OmtFbnVtVHlwZUZpZWxkTnVtYmVyLCAwLAorICAgICAgICAgICAgICAgICAgRW51bURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgIGtDdXN0b21PcHRpb25GaWVsZE51bWJlciwgMX07CisgICAgaW50IHVuaW50W10gPSB7RmlsZURlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICAgRW51bURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICBFbnVtT3B0aW9uczo6a1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciwgMX07CisgICAgc3RkOjp2ZWN0b3I8aW50PiB2cGF0aChwYXRoLCBwYXRoICsgNSk7CisgICAgRVhQRUNUX1RSVUUoZmlsZV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbih2cGF0aCwgJmxvYykpOworICAgIEVYUEVDVF9FUSgiMTk6My0xOTozMSIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZ1bmludCh1bmludCwgdW5pbnQgKyA1KTsKKyAgICBFWFBFQ1RfRkFMU0UoZmlsZV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbih2dW5pbnQsICZsb2MpKTsKKyAgfQorICB7CisgICAgaW50IHBhdGhbXSA9IHtGaWxlRGVzY3JpcHRvclByb3RvOjprRW51bVR5cGVGaWVsZE51bWJlciwgMCwKKyAgICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICBrQ3VzdG9tT3B0aW9uRmllbGROdW1iZXIsIDJ9OworICAgIGludCB1bmludFtdID0ge0ZpbGVEZXNjcmlwdG9yUHJvdG86OmtFbnVtVHlwZUZpZWxkTnVtYmVyLCAwLAorICAgICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgT25lb2ZPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyLCAyfTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZwYXRoKHBhdGgsIHBhdGggKyA1KTsKKyAgICBFWFBFQ1RfVFJVRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZwYXRoLCAmbG9jKSk7CisgICAgRVhQRUNUX0VRKCIyMDozLTIwOjMxIiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICAgIHN0ZDo6dmVjdG9yPGludD4gdnVuaW50KHVuaW50LCB1bmludCArIDUpOworICAgIEVYUEVDVF9GQUxTRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZ1bmludCwgJmxvYykpOworICB9CisKKyAgLy8gRW51bSB2YWx1ZSBvcHRpb25zCisgIHsKKyAgICAvLyBvcHRpb24gdy8gbWVzc2FnZSB0eXBlIHRoYXQgZGlyZWN0bHkgc2V0cyBmaWVsZAorICAgIGludCBwYXRoW10gPSB7RmlsZURlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgRW51bURlc2NyaXB0b3JQcm90bzo6a1ZhbHVlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAga0N1c3RvbU9wdGlvbkZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAga0FGaWVsZE51bWJlcn07CisgICAgaW50IHVuaW50W10gPSB7RmlsZURlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvclByb3RvOjprVmFsdWVGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIDB9OworICAgIHN0ZDo6dmVjdG9yPGludD4gdnBhdGgocGF0aCwgcGF0aCArIDcpOworICAgIEVYUEVDVF9UUlVFKGZpbGVfZGVzYy0+R2V0U291cmNlTG9jYXRpb24odnBhdGgsICZsb2MpKTsKKyAgICBFWFBFQ1RfRVEoIjIxOjE0LTIxOjQwIiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICAgIHN0ZDo6dmVjdG9yPGludD4gdnVuaW50KHVuaW50LCB1bmludCArIDcpOworICAgIEVYUEVDVF9GQUxTRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZ1bmludCwgJmxvYykpOworICB9CisgIHsKKyAgICBpbnQgcGF0aFtdID0ge0ZpbGVEZXNjcmlwdG9yUHJvdG86OmtFbnVtVHlwZUZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yUHJvdG86OmtWYWx1ZUZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgIGtDdXN0b21PcHRpb25GaWVsZE51bWJlcn07CisgICAgaW50IHVuaW50W10gPSB7RmlsZURlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvclByb3RvOjprVmFsdWVGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIDB9OworICAgIHN0ZDo6dmVjdG9yPGludD4gdnBhdGgocGF0aCwgcGF0aCArIDYpOworICAgIEVYUEVDVF9UUlVFKGZpbGVfZGVzYy0+R2V0U291cmNlTG9jYXRpb24odnBhdGgsICZsb2MpKTsKKyAgICBFWFBFQ1RfRVEoIjIyOjE0LTIyOjQyIiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICAgIHN0ZDo6dmVjdG9yPGludD4gdnVuaW50KHVuaW50LCB1bmludCArIDcpOworICAgIEVYUEVDVF9GQUxTRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZ1bmludCwgJmxvYykpOworICB9CisKKyAgLy8gU2VydmljZSBvcHRpb24sIHJlcGVhdGVkIG9wdGlvbnMKKyAgeworICAgIGludCBwYXRoW10gPSB7RmlsZURlc2NyaXB0b3JQcm90bzo6a1NlcnZpY2VGaWVsZE51bWJlciwgMCwKKyAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICBrQ3VzdG9tT3B0aW9uRmllbGROdW1iZXIsIDB9OworICAgIGludCB1bmludFtdID0ge0ZpbGVEZXNjcmlwdG9yUHJvdG86OmtTZXJ2aWNlRmllbGROdW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICBTZXJ2aWNlT3B0aW9uczo6a1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciwgMH07CisgICAgc3RkOjp2ZWN0b3I8aW50PiB2cGF0aChwYXRoLCBwYXRoICsgNSk7CisgICAgRVhQRUNUX1RSVUUoZmlsZV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbih2cGF0aCwgJmxvYykpOworICAgIEVYUEVDVF9FUSgiMjY6My0yNjozNSIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZ1bmludCh1bmludCwgdW5pbnQgKyA1KTsKKyAgICBFWFBFQ1RfRkFMU0UoZmlsZV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbih2dW5pbnQsICZsb2MpKTsKKyAgfQorICB7CisgICAgaW50IHBhdGhbXSA9IHtGaWxlRGVzY3JpcHRvclByb3RvOjprU2VydmljZUZpZWxkTnVtYmVyLCAwLAorICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgIGtDdXN0b21PcHRpb25GaWVsZE51bWJlciwgMX07CisgICAgaW50IHVuaW50W10gPSB7RmlsZURlc2NyaXB0b3JQcm90bzo6a1NlcnZpY2VGaWVsZE51bWJlciwgMCwKKyAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIFNlcnZpY2VPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyLCAxfTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZwYXRoKHBhdGgsIHBhdGggKyA1KTsKKyAgICBFWFBFQ1RfVFJVRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZwYXRoLCAmbG9jKSk7CisgICAgRVhQRUNUX0VRKCIyNzozLTI3OjM1IiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICAgIHN0ZDo6dmVjdG9yPGludD4gdnVuaW50KHVuaW50LCB1bmludCArIDUpOworICAgIEVYUEVDVF9GQUxTRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZ1bmludCwgJmxvYykpOworICB9CisgIHsKKyAgICBpbnQgcGF0aFtdID0ge0ZpbGVEZXNjcmlwdG9yUHJvdG86OmtTZXJ2aWNlRmllbGROdW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAga0N1c3RvbU9wdGlvbkZpZWxkTnVtYmVyLCAyfTsKKyAgICBpbnQgdW5pbnRbXSA9IHtGaWxlRGVzY3JpcHRvclByb3RvOjprU2VydmljZUZpZWxkTnVtYmVyLCAwLAorICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgU2VydmljZU9wdGlvbnM6OmtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIsIDJ9OworICAgIHN0ZDo6dmVjdG9yPGludD4gdnBhdGgocGF0aCwgcGF0aCArIDUpOworICAgIEVYUEVDVF9UUlVFKGZpbGVfZGVzYy0+R2V0U291cmNlTG9jYXRpb24odnBhdGgsICZsb2MpKTsKKyAgICBFWFBFQ1RfRVEoIjI4OjMtMjg6MzUiLCBQcmludFNvdXJjZUxvY2F0aW9uKGxvYykpOworCisgICAgc3RkOjp2ZWN0b3I8aW50PiB2dW5pbnQodW5pbnQsIHVuaW50ICsgNSk7CisgICAgRVhQRUNUX0ZBTFNFKGZpbGVfZGVzYy0+R2V0U291cmNlTG9jYXRpb24odnVuaW50LCAmbG9jKSk7CisgIH0KKworICAvLyBNZXRob2Qgb3B0aW9ucworICB7CisgICAgaW50IHBhdGhbXSA9IHtGaWxlRGVzY3JpcHRvclByb3RvOjprU2VydmljZUZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmtNZXRob2RGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICBNZXRob2RPcHRpb25zOjprRGVwcmVjYXRlZEZpZWxkTnVtYmVyfTsKKyAgICBpbnQgdW5pbnRbXSA9IHtGaWxlRGVzY3JpcHRvclByb3RvOjprU2VydmljZUZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0b3JQcm90bzo6a01ldGhvZEZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIE1ldGhvZE9wdGlvbnM6OmtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgMH07CisgICAgc3RkOjp2ZWN0b3I8aW50PiB2cGF0aChwYXRoLCBwYXRoICsgNik7CisgICAgRVhQRUNUX1RSVUUoZmlsZV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbih2cGF0aCwgJmxvYykpOworICAgIEVYUEVDVF9FUSgiMzI6NS0zMjozMCIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZ1bmludCh1bmludCwgdW5pbnQgKyA3KTsKKyAgICBFWFBFQ1RfRkFMU0UoZmlsZV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbih2dW5pbnQsICZsb2MpKTsKKyAgfQorICB7CisgICAgaW50IHBhdGhbXSA9IHsKKyAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a1NlcnZpY2VGaWVsZE51bWJlciwgICAwLAorICAgICAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjprTWV0aG9kRmllbGROdW1iZXIsIDEsCisgICAgICAgIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwga0N1c3RvbU9wdGlvbkZpZWxkTnVtYmVyfTsKKyAgICBpbnQgdW5pbnRbXSA9IHtGaWxlRGVzY3JpcHRvclByb3RvOjprU2VydmljZUZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0b3JQcm90bzo6a01ldGhvZEZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIE1ldGhvZE9wdGlvbnM6OmtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgMX07CisgICAgc3RkOjp2ZWN0b3I8aW50PiB2cGF0aChwYXRoLCBwYXRoICsgNik7CisgICAgRVhQRUNUX1RSVUUoZmlsZV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbih2cGF0aCwgJmxvYykpOworICAgIEVYUEVDVF9FUSgiMzM6NS0zMzo0MSIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZ1bmludCh1bmludCwgdW5pbnQgKyA3KTsKKyAgICBFWFBFQ1RfRkFMU0UoZmlsZV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbih2dW5pbnQsICZsb2MpKTsKKyAgfQorCisgIC8vIEV4dGVuc2lvbiByYW5nZSBvcHRpb25zCisgIHsKKyAgICBpbnQgcGF0aFtdID0ge0ZpbGVEZXNjcmlwdG9yUHJvdG86OmtNZXNzYWdlVHlwZUZpZWxkTnVtYmVyLCAxLAorICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uUmFuZ2VGaWVsZE51bWJlciwgMCwKKyAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6a09wdGlvbnNGaWVsZE51bWJlcn07CisgICAgc3RkOjp2ZWN0b3I8aW50PiB2cGF0aChwYXRoLCBwYXRoICsgNSk7CisgICAgRVhQRUNUX1RSVUUoZmlsZV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbih2cGF0aCwgJmxvYykpOworICAgIEVYUEVDVF9FUSgiMzc6NDAtMzc6NjciLCBQcmludFNvdXJjZUxvY2F0aW9uKGxvYykpOworICB9CisgIHsKKyAgICBpbnQgcGF0aFtdID0ge0ZpbGVEZXNjcmlwdG9yUHJvdG86OmtNZXNzYWdlVHlwZUZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a0V4dGVuc2lvblJhbmdlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAga0N1c3RvbU9wdGlvbkZpZWxkTnVtYmVyfTsKKyAgICBpbnQgdW5pbnRbXSA9IHtGaWxlRGVzY3JpcHRvclByb3RvOjprTWVzc2FnZVR5cGVGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a0V4dGVuc2lvblJhbmdlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIDB9OworICAgIHN0ZDo6dmVjdG9yPGludD4gdnBhdGgocGF0aCwgcGF0aCArIDYpOworICAgIEVYUEVDVF9UUlVFKGZpbGVfZGVzYy0+R2V0U291cmNlTG9jYXRpb24odnBhdGgsICZsb2MpKTsKKyAgICBFWFBFQ1RfRVEoIjM3OjQxLTM3OjY2IiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICAgIHN0ZDo6dmVjdG9yPGludD4gdnVuaW50KHVuaW50LCB1bmludCArIDcpOworICAgIEVYUEVDVF9GQUxTRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZ1bmludCwgJmxvYykpOworICB9CisgIHsKKyAgICBpbnQgcGF0aFtdID0ge0ZpbGVEZXNjcmlwdG9yUHJvdG86OmtNZXNzYWdlVHlwZUZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a0V4dGVuc2lvblJhbmdlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAga0N1c3RvbU9wdGlvbkZpZWxkTnVtYmVyfTsKKyAgICBpbnQgdW5pbnRbXSA9IHtGaWxlRGVzY3JpcHRvclByb3RvOjprTWVzc2FnZVR5cGVGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a0V4dGVuc2lvblJhbmdlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIDB9OworICAgIHN0ZDo6dmVjdG9yPGludD4gdnBhdGgocGF0aCwgcGF0aCArIDYpOworICAgIEVYUEVDVF9UUlVFKGZpbGVfZGVzYy0+R2V0U291cmNlTG9jYXRpb24odnBhdGgsICZsb2MpKTsKKyAgICBFWFBFQ1RfRVEoIjM3OjQxLTM3OjY2IiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICAgIHN0ZDo6dmVjdG9yPGludD4gdnVuaW50KHVuaW50LCB1bmludCArIDcpOworICAgIEVYUEVDVF9GQUxTRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZ1bmludCwgJmxvYykpOworICB9CisKKyAgLy8gRmllbGQgb3B0aW9uIG9uIGV4dGVuc2lvbgorICB7CisgICAgaW50IHBhdGhbXSA9IHtGaWxlRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgIEZpZWxkT3B0aW9uczo6a1BhY2tlZEZpZWxkTnVtYmVyfTsKKyAgICBpbnQgdW5pbnRbXSA9IHtGaWxlRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgRmllbGRPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyLCAwfTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZwYXRoKHBhdGgsIHBhdGggKyA0KTsKKyAgICBFWFBFQ1RfVFJVRShmaWxlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKHZwYXRoLCAmbG9jKSk7CisgICAgRVhQRUNUX0VRKCI0MDo0Mi00MDo1MyIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZ1bmludCh1bmludCwgdW5pbnQgKyA1KTsKKyAgICBFWFBFQ1RfRkFMU0UoZmlsZV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbih2dW5pbnQsICZsb2MpKTsKKyAgfQorfQorCisvLyBNaXNzaW5nIFNvdXJjZUNvZGVJbmZvIGRvZXNuJ3QgY2F1c2UgY3Jhc2g6CitURVNUX0YoU291cmNlTG9jYXRpb25UZXN0LCBHZXRTb3VyY2VMb2NhdGlvbl9NaXNzaW5nU291cmNlQ29kZUluZm8pIHsKKyAgU291cmNlTG9jYXRpb24gbG9jOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlX2Rlc2MgPQorICAgICAgR09PR0xFX0NIRUNLX05PVE5VTEwocG9vbF8uRmluZEZpbGVCeU5hbWUoIi90ZXN0L3Rlc3QucHJvdG8iKSk7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bzsKKyAgZmlsZV9kZXNjLT5Db3B5VG8oJnByb3RvKTsgIC8vIE5vdGUsIHRoaXMgZGlzY2FyZHMgdGhlIFNvdXJjZUNvZGVJbmZvLgorICBFWFBFQ1RfRkFMU0UocHJvdG8uaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7CisKKyAgRGVzY3JpcHRvclBvb2wgYmFkMV9wb29sKCZwb29sXyk7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYWQxX2ZpbGVfZGVzYyA9CisgICAgICBHT09HTEVfQ0hFQ0tfTk9UTlVMTChiYWQxX3Bvb2wuQnVpbGRGaWxlKHByb3RvKSk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGJhZDFfYV9kZXNjID0gYmFkMV9maWxlX2Rlc2MtPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiQSIpOworICBFWFBFQ1RfRkFMU0UoYmFkMV9hX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKCZsb2MpKTsKK30KKworLy8gQ29ycnVwdCBTb3VyY2VDb2RlSW5mbyBkb2Vzbid0IGNhdXNlIGNyYXNoOgorVEVTVF9GKFNvdXJjZUxvY2F0aW9uVGVzdCwgR2V0U291cmNlTG9jYXRpb25fQm9ndXNTb3VyY2VDb2RlSW5mbykgeworICBTb3VyY2VMb2NhdGlvbiBsb2M7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfZGVzYyA9CisgICAgICBHT09HTEVfQ0hFQ0tfTk9UTlVMTChwb29sXy5GaW5kRmlsZUJ5TmFtZSgiL3Rlc3QvdGVzdC5wcm90byIpKTsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvOworICBmaWxlX2Rlc2MtPkNvcHlUbygmcHJvdG8pOyAgLy8gTm90ZSwgdGhpcyBkaXNjYXJkcyB0aGUgU291cmNlQ29kZUluZm8uCisgIEVYUEVDVF9GQUxTRShwcm90by5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKKyAgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIGxvY19tc2cgPQorICAgICAgcHJvdG8ubXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCktPmFkZF9sb2NhdGlvbigpOworICBsb2NfbXNnLT5hZGRfcGF0aCgxKTsKKyAgbG9jX21zZy0+YWRkX3BhdGgoMik7CisgIGxvY19tc2ctPmFkZF9wYXRoKDMpOworICBsb2NfbXNnLT5hZGRfc3Bhbig0KTsKKyAgbG9jX21zZy0+YWRkX3NwYW4oNSk7CisgIGxvY19tc2ctPmFkZF9zcGFuKDYpOworCisgIERlc2NyaXB0b3JQb29sIGJhZDJfcG9vbCgmcG9vbF8pOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogYmFkMl9maWxlX2Rlc2MgPQorICAgICAgR09PR0xFX0NIRUNLX05PVE5VTEwoYmFkMl9wb29sLkJ1aWxkRmlsZShwcm90bykpOworICBjb25zdCBEZXNjcmlwdG9yKiBiYWQyX2FfZGVzYyA9IGJhZDJfZmlsZV9kZXNjLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkEiKTsKKyAgRVhQRUNUX0ZBTFNFKGJhZDJfYV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY29uc3QgY2hhciogY29uc3Qga0NvcHlTb3VyY2VDb2RlSW5mb1RvVGVzdElucHV0ID0KKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiI7CisKKy8vIFJlcXVpcmVkIHNpbmNlIHNvdXJjZSBjb2RlIGluZm9ybWF0aW9uIGlzIG5vdCBwcmVzZXJ2ZWQgYnkKKy8vIEZpbGVEZXNjcmlwdG9yVGVzdC4KK2NsYXNzIENvcHlTb3VyY2VDb2RlSW5mb1RvVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIENvcHlTb3VyY2VDb2RlSW5mb1RvVGVzdCgpCisgICAgICA6IHNvdXJjZV90cmVlXygiL3Rlc3QvdGVzdC5wcm90byIsIGtDb3B5U291cmNlQ29kZUluZm9Ub1Rlc3RJbnB1dCksCisgICAgICAgIGRiXygmc291cmNlX3RyZWVfKSwKKyAgICAgICAgcG9vbF8oJmRiXywgJmNvbGxlY3Rvcl8pIHt9CisKKyBwcml2YXRlOgorICBBYm9ydGluZ0Vycm9yQ29sbGVjdG9yIGNvbGxlY3Rvcl87CisgIFNpbmdsZXRvblNvdXJjZVRyZWUgc291cmNlX3RyZWVfOworICBjb21waWxlcjo6U291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSBkYl87CisKKyBwcm90ZWN0ZWQ6CisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworfTsKKworVEVTVF9GKENvcHlTb3VyY2VDb2RlSW5mb1RvVGVzdCwgQ29weVRvX0RvZXNOb3RDb3B5U291cmNlQ29kZUluZm8pIHsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfZGVzYyA9CisgICAgICBHT09HTEVfQ0hFQ0tfTk9UTlVMTChwb29sXy5GaW5kRmlsZUJ5TmFtZSgiL3Rlc3QvdGVzdC5wcm90byIpKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX2Rlc2NfcHJvdG87CisgIEFTU0VSVF9GQUxTRShmaWxlX2Rlc2NfcHJvdG8uaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7CisKKyAgZmlsZV9kZXNjLT5Db3B5VG8oJmZpbGVfZGVzY19wcm90byk7CisgIEVYUEVDVF9GQUxTRShmaWxlX2Rlc2NfcHJvdG8uaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7Cit9CisKK1RFU1RfRihDb3B5U291cmNlQ29kZUluZm9Ub1Rlc3QsIENvcHlTb3VyY2VDb2RlSW5mb1RvKSB7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlX2Rlc2MgPQorICAgICAgR09PR0xFX0NIRUNLX05PVE5VTEwocG9vbF8uRmluZEZpbGVCeU5hbWUoIi90ZXN0L3Rlc3QucHJvdG8iKSk7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9kZXNjX3Byb3RvOworICBBU1NFUlRfRkFMU0UoZmlsZV9kZXNjX3Byb3RvLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOworCisgIGZpbGVfZGVzYy0+Q29weVNvdXJjZUNvZGVJbmZvVG8oJmZpbGVfZGVzY19wcm90byk7CisgIGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBpbmZvID0gZmlsZV9kZXNjX3Byb3RvLnNvdXJjZV9jb2RlX2luZm8oKTsKKyAgQVNTRVJUX0VRKDQsIGluZm8ubG9jYXRpb25fc2l6ZSgpKTsKKyAgLy8gR2V0IHRoZSBGb28gbWVzc2FnZSBsb2NhdGlvbgorICBjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZm9vX2xvY2F0aW9uID0gaW5mby5sb2NhdGlvbigyKTsKKyAgQVNTRVJUX0VRKDIsIGZvb19sb2NhdGlvbi5wYXRoX3NpemUoKSk7CisgIEVYUEVDVF9FUShGaWxlRGVzY3JpcHRvclByb3RvOjprTWVzc2FnZVR5cGVGaWVsZE51bWJlciwgZm9vX2xvY2F0aW9uLnBhdGgoMCkpOworICBFWFBFQ1RfRVEoMCwgZm9vX2xvY2F0aW9uLnBhdGgoMSkpOyAgICAgIC8vIEZvbyBpcyB0aGUgZmlyc3QgbWVzc2FnZSBkZWZpbmVkCisgIEFTU0VSVF9FUSgzLCBmb29fbG9jYXRpb24uc3Bhbl9zaXplKCkpOyAgLy8gRm9vIHNwYW5zIG9uZSBsaW5lCisgIEVYUEVDVF9FUSgxLCBmb29fbG9jYXRpb24uc3BhbigwKSk7ICAgICAgLy8gRm9vIGlzIGRlY2xhcmVkIG9uIGxpbmUgMQorICBFWFBFQ1RfRVEoMCwgZm9vX2xvY2F0aW9uLnNwYW4oMSkpOyAgICAgIC8vIEZvbyBzdGFydHMgYXQgY29sdW1uIDAKKyAgRVhQRUNUX0VRKDE0LCBmb29fbG9jYXRpb24uc3BhbigyKSk7ICAgICAvLyBGb28gZW5kcyBvbiBjb2x1bW4gMTQKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBMYXppbHlCdWlsZERlcGVuZGVuY2llc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBMYXppbHlCdWlsZERlcGVuZGVuY2llc1Rlc3QoKSA6IHBvb2xfKCZkYl8sIG51bGxwdHIpIHsKKyAgICBwb29sXy5JbnRlcm5hbFNldExhemlseUJ1aWxkRGVwZW5kZW5jaWVzKCk7CisgIH0KKworICB2b2lkIFBhcnNlUHJvdG9BbmRBZGRUb0RiKGNvbnN0IGNoYXIqIHByb3RvKSB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byB0bXA7CisgICAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKHByb3RvLCAmdG1wKSk7CisgICAgZGJfLkFkZCh0bXApOworICB9CisKKyAgdm9pZCBQYXJzZVByb3RvQW5kQWRkVG9EYihjb25zdCBzdGQ6OnN0cmluZyYgcHJvdG8pIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIHRtcDsKKyAgICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcocHJvdG8sICZ0bXApKTsKKyAgICBkYl8uQWRkKHRtcCk7CisgIH0KKworICB2b2lkIEFkZFNpbXBsZU1lc3NhZ2VQcm90b0ZpbGVUb0RiKGNvbnN0IGNoYXIqIGZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlX25hbWUpIHsKKyAgICBQYXJzZVByb3RvQW5kQWRkVG9EYigibmFtZTogJyIgKyBzdGQ6OnN0cmluZyhmaWxlX25hbWUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiLnByb3RvJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2U6IFwicHJvdG9idWZfdW5pdHRlc3RcIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICBuYW1lOiciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhtZXNzYWdlX25hbWUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgZmllbGQgeyBuYW1lOidhJyBudW1iZXI6MSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgIHR5cGVfbmFtZTonaW50MzInIH0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisgIH0KKworICB2b2lkIEFkZFNpbXBsZUVudW1Qcm90b0ZpbGVUb0RiKGNvbnN0IGNoYXIqIGZpbGVfbmFtZSwgY29uc3QgY2hhciogZW51bV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVudW1fdmFsdWVfbmFtZSkgeworICAgIFBhcnNlUHJvdG9BbmRBZGRUb0RiKCJuYW1lOiAnIiArIHN0ZDo6c3RyaW5nKGZpbGVfbmFtZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICIucHJvdG8nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZTogJ3Byb3RvYnVmX3VuaXR0ZXN0JyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVudW1fdHlwZSB7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICBuYW1lOiciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhlbnVtX25hbWUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdmFsdWUgeyBuYW1lOiciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhlbnVtX3ZhbHVlX25hbWUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJyBudW1iZXI6MSB9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSBkYl87CisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworfTsKKworVEVTVF9GKExhemlseUJ1aWxkRGVwZW5kZW5jaWVzVGVzdCwgTWVzc2FnZSkgeworICBQYXJzZVByb3RvQW5kQWRkVG9EYigKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAicGFja2FnZTogJ3Byb3RvYnVmX3VuaXR0ZXN0JyAiCisgICAgICAiZGVwZW5kZW5jeTogJ2Jhci5wcm90bycgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6J0ZvbycgIgorICAgICAgIiAgZmllbGQgeyBuYW1lOidiYXInIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAgICJ0eXBlX25hbWU6Jy5wcm90b2J1Zl91bml0dGVzdC5CYXInIH0gIgorICAgICAgIn0iKTsKKyAgQWRkU2ltcGxlTWVzc2FnZVByb3RvRmlsZVRvRGIoImJhciIsICJCYXIiKTsKKworICAvLyBWZXJpZnkgbmVpdGhlciBoYXMgYmVlbiBidWlsdCB5ZXQuCisgIEVYUEVDVF9GQUxTRShwb29sXy5JbnRlcm5hbElzRmlsZUxvYWRlZCgiZm9vLnByb3RvIikpOworICBFWFBFQ1RfRkFMU0UocG9vbF8uSW50ZXJuYWxJc0ZpbGVMb2FkZWQoImJhci5wcm90byIpKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2xfLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKTsKKworICAvLyBWZXJpZnkgb25seSBmb28gZ2V0cyBidWlsdCB3aGVuIGFza2luZyBmb3IgZm9vLnByb3RvCisgIEVYUEVDVF9UUlVFKGZpbGUgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKHBvb2xfLkludGVybmFsSXNGaWxlTG9hZGVkKCJmb28ucHJvdG8iKSk7CisgIEVYUEVDVF9GQUxTRShwb29sXy5JbnRlcm5hbElzRmlsZUxvYWRlZCgiYmFyLnByb3RvIikpOworCisgIC8vIFZlcmlmeSBjYWxsaW5nIEZpbmRGaWVsZEJ5KiB3b3JrcyB3aGVuIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCB3YXMKKyAgLy8gbm90IGJ1aWx0IGF0IGNyb3NzIGxpbmsgdGltZS4gVmVyaWZ5IHRoaXMgZG9lc24ndCBidWlsZCB0aGUgZmlsZQorICAvLyB0aGUgZmllbGQncyB0eXBlIGlzIGRlZmluZWQgaW4sIGFzIHdlbGwuCisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MgPSBmaWxlLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkZvbyIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJiYXIiKTsKKyAgRVhQRUNUX1RSVUUoZmllbGQgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9FUShmaWVsZCwgZGVzYy0+RmluZEZpZWxkQnlOdW1iZXIoMSkpOworICBFWFBFQ1RfRVEoZmllbGQsIGRlc2MtPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgiYmFyIikpOworICBFWFBFQ1RfRVEoZmllbGQsIGRlc2MtPkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgiYmFyIikpOworICBFWFBFQ1RfRkFMU0UocG9vbF8uSW50ZXJuYWxJc0ZpbGVMb2FkZWQoImJhci5wcm90byIpKTsKKworICAvLyBGaW5hbGx5LCB2ZXJpZnkgdGhhdCBpZiB3ZSBjYWxsIG1lc3NhZ2VfdHlwZSgpIG9uIHRoZSBmaWVsZCwgd2Ugd2lsbAorICAvLyBidWlsZCB0aGUgZmlsZSB3aGVyZSB0aGUgbWVzc2FnZSBpcyBkZWZpbmVkLCBhbmQgZ2V0IGEgdmFsaWQgZGVzY3JpcHRvcgorICBFWFBFQ1RfVFJVRShmaWVsZC0+bWVzc2FnZV90eXBlKCkgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKHBvb2xfLkludGVybmFsSXNGaWxlTG9hZGVkKCJiYXIucHJvdG8iKSk7Cit9CisKK1RFU1RfRihMYXppbHlCdWlsZERlcGVuZGVuY2llc1Rlc3QsIEVudW0pIHsKKyAgUGFyc2VQcm90b0FuZEFkZFRvRGIoCisgICAgICAibmFtZTogJ2Zvby5wcm90bycgIgorICAgICAgInBhY2thZ2U6ICdwcm90b2J1Zl91bml0dGVzdCcgIgorICAgICAgImRlcGVuZGVuY3k6ICdlbnVtMS5wcm90bycgIgorICAgICAgImRlcGVuZGVuY3k6ICdlbnVtMi5wcm90bycgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6J0xhenknICIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTonZW51bTEnIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAgICJ0eXBlX25hbWU6Jy5wcm90b2J1Zl91bml0dGVzdC5FbnVtMScgfSAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6J2VudW0yJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCAiCisgICAgICAidHlwZV9uYW1lOicucHJvdG9idWZfdW5pdHRlc3QuRW51bTInIH0gIgorICAgICAgIn0iKTsKKyAgQWRkU2ltcGxlRW51bVByb3RvRmlsZVRvRGIoImVudW0xIiwgIkVudW0xIiwgIkVOVU0xIik7CisgIEFkZFNpbXBsZUVudW1Qcm90b0ZpbGVUb0RiKCJlbnVtMiIsICJFbnVtMiIsICJFTlVNMiIpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbF8uRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpOworCisgIC8vIFZlcmlmeSBjYWxsaW5nIGVudW1fdHlwZSgpIG9uIGEgZmllbGQgd2hvc2UgZGVmaW5pdGlvbiBpcyBub3QKKyAgLy8geWV0IGJ1aWx0IHdpbGwgYnVpbGQgdGhlIGZpbGUgYW5kIHJldHVybiBhIGRlc2NyaXB0b3IuCisgIEVYUEVDVF9GQUxTRShwb29sXy5JbnRlcm5hbElzRmlsZUxvYWRlZCgiZW51bTEucHJvdG8iKSk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MgPSBmaWxlLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkxhenkiKTsKKyAgRVhQRUNUX1RSVUUoZGVzYyAhPSBudWxscHRyKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgiZW51bTEiKTsKKyAgRVhQRUNUX1RSVUUoZmllbGQgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGZpZWxkLT5lbnVtX3R5cGUoKSAhPSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8uSW50ZXJuYWxJc0ZpbGVMb2FkZWQoImVudW0xLnByb3RvIikpOworCisgIC8vIFZlcmlmeSBjYWxsaW5nIGRlZmF1bHRfdmFsdWVfZW51bSgpIG9uIGEgZmllbGQgd2hvc2UgZGVmaW5pdGlvbiBpcyBub3QKKyAgLy8geWV0IGJ1aWx0IHdpbGwgYnVpbGQgdGhlIGZpbGUgYW5kIHJldHVybiBhIGRlc2NyaXB0b3IgdG8gdGhlIHZhbHVlLgorICBFWFBFQ1RfRkFMU0UocG9vbF8uSW50ZXJuYWxJc0ZpbGVMb2FkZWQoImVudW0yLnByb3RvIikpOworICBmaWVsZCA9IGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgiZW51bTIiKTsKKyAgRVhQRUNUX1RSVUUoZmllbGQgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW0oKSAhPSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8uSW50ZXJuYWxJc0ZpbGVMb2FkZWQoImVudW0yLnByb3RvIikpOworfQorCitURVNUX0YoTGF6aWx5QnVpbGREZXBlbmRlbmNpZXNUZXN0LCBUeXBlKSB7CisgIFBhcnNlUHJvdG9BbmRBZGRUb0RiKAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJwYWNrYWdlOiAncHJvdG9idWZfdW5pdHRlc3QnICIKKyAgICAgICJkZXBlbmRlbmN5OiAnbWVzc2FnZTEucHJvdG8nICIKKyAgICAgICJkZXBlbmRlbmN5OiAnbWVzc2FnZTIucHJvdG8nICIKKyAgICAgICJkZXBlbmRlbmN5OiAnZW51bTEucHJvdG8nICIKKyAgICAgICJkZXBlbmRlbmN5OiAnZW51bTIucHJvdG8nICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOidMYXp5JyAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6J21lc3NhZ2UxJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCAiCisgICAgICAidHlwZV9uYW1lOicucHJvdG9idWZfdW5pdHRlc3QuTWVzc2FnZTEnIH0gIgorICAgICAgIiAgZmllbGQgeyBuYW1lOidtZXNzYWdlMicgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgIgorICAgICAgInR5cGVfbmFtZTonLnByb3RvYnVmX3VuaXR0ZXN0Lk1lc3NhZ2UyJyB9ICIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTonZW51bTEnIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAgICJ0eXBlX25hbWU6Jy5wcm90b2J1Zl91bml0dGVzdC5FbnVtMScgfSAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6J2VudW0yJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCAiCisgICAgICAidHlwZV9uYW1lOicucHJvdG9idWZfdW5pdHRlc3QuRW51bTInIH0gIgorICAgICAgIn0iKTsKKyAgQWRkU2ltcGxlTWVzc2FnZVByb3RvRmlsZVRvRGIoIm1lc3NhZ2UxIiwgIk1lc3NhZ2UxIik7CisgIEFkZFNpbXBsZU1lc3NhZ2VQcm90b0ZpbGVUb0RiKCJtZXNzYWdlMiIsICJNZXNzYWdlMiIpOworICBBZGRTaW1wbGVFbnVtUHJvdG9GaWxlVG9EYigiZW51bTEiLCAiRW51bTEiLCAiRU5VTTEiKTsKKyAgQWRkU2ltcGxlRW51bVByb3RvRmlsZVRvRGIoImVudW0yIiwgIkVudW0yIiwgIkVOVU0yIik7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sXy5GaW5kRmlsZUJ5TmFtZSgiZm9vLnByb3RvIik7CisKKyAgLy8gVmVyaWZ5IGNhbGxpbmcgdHlwZSgpIG9uIGEgZmllbGQgdGhhdCBpcyBhIG1lc3NhZ2UgdHlwZSB3aWxsCisgIC8vIGJ1aWxkIHRoZSB0eXBlIGRlZmluZWQgaW4gYW5vdGhlciBmaWxlLgorICBFWFBFQ1RfRkFMU0UocG9vbF8uSW50ZXJuYWxJc0ZpbGVMb2FkZWQoIm1lc3NhZ2UxLnByb3RvIikpOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjID0gZmlsZS0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJMYXp5Iik7CisgIEVYUEVDVF9UUlVFKGRlc2MgIT0gbnVsbHB0cik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjLT5GaW5kRmllbGRCeU5hbWUoIm1lc3NhZ2UxIik7CisgIEVYUEVDVF9UUlVFKGZpZWxkICE9IG51bGxwdHIpOworICBFWFBFQ1RfRVEoZmllbGQtPnR5cGUoKSwgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UpOworICBFWFBFQ1RfVFJVRShwb29sXy5JbnRlcm5hbElzRmlsZUxvYWRlZCgibWVzc2FnZTEucHJvdG8iKSk7CisKKyAgLy8gVmVyaWZ5IGNhbGxpbmcgY3BwX3R5cGUoKSBvbiBhIGZpZWxkIHRoYXQgaXMgYSBtZXNzYWdlIHR5cGUgd2lsbAorICAvLyBidWlsZCB0aGUgdHlwZSBkZWZpbmVkIGluIGFub3RoZXIgZmlsZS4KKyAgRVhQRUNUX0ZBTFNFKHBvb2xfLkludGVybmFsSXNGaWxlTG9hZGVkKCJtZXNzYWdlMi5wcm90byIpKTsKKyAgZmllbGQgPSBkZXNjLT5GaW5kRmllbGRCeU5hbWUoIm1lc3NhZ2UyIik7CisgIEVYUEVDVF9UUlVFKGZpZWxkICE9IG51bGxwdHIpOworICBFWFBFQ1RfRVEoZmllbGQtPmNwcF90eXBlKCksIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8uSW50ZXJuYWxJc0ZpbGVMb2FkZWQoIm1lc3NhZ2UyLnByb3RvIikpOworCisgIC8vIFZlcmlmeSBjYWxsaW5nIHR5cGUoKSBvbiBhIGZpZWxkIHRoYXQgaXMgYW4gZW51bSB0eXBlIHdpbGwKKyAgLy8gYnVpbGQgdGhlIHR5cGUgZGVmaW5lZCBpbiBhbm90aGVyIGZpbGUuCisgIEVYUEVDVF9GQUxTRShwb29sXy5JbnRlcm5hbElzRmlsZUxvYWRlZCgiZW51bTEucHJvdG8iKSk7CisgIGZpZWxkID0gZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJlbnVtMSIpOworICBFWFBFQ1RfVFJVRShmaWVsZCAhPSBudWxscHRyKTsKKyAgRVhQRUNUX0VRKGZpZWxkLT50eXBlKCksIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8uSW50ZXJuYWxJc0ZpbGVMb2FkZWQoImVudW0xLnByb3RvIikpOworCisgIC8vIFZlcmlmeSBjYWxsaW5nIGNwcF90eXBlKCkgb24gYSBmaWVsZCB0aGF0IGlzIGFuIGVudW0gdHlwZSB3aWxsCisgIC8vIGJ1aWxkIHRoZSB0eXBlIGRlZmluZWQgaW4gYW5vdGhlciBmaWxlLgorICBFWFBFQ1RfRkFMU0UocG9vbF8uSW50ZXJuYWxJc0ZpbGVMb2FkZWQoImVudW0yLnByb3RvIikpOworICBmaWVsZCA9IGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgiZW51bTIiKTsKKyAgRVhQRUNUX1RSVUUoZmllbGQgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9FUShmaWVsZC0+Y3BwX3R5cGUoKSwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU0pOworICBFWFBFQ1RfVFJVRShwb29sXy5JbnRlcm5hbElzRmlsZUxvYWRlZCgiZW51bTIucHJvdG8iKSk7Cit9CisKK1RFU1RfRihMYXppbHlCdWlsZERlcGVuZGVuY2llc1Rlc3QsIEV4dGVuc2lvbikgeworICBQYXJzZVByb3RvQW5kQWRkVG9EYigKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAicGFja2FnZTogJ3Byb3RvYnVmX3VuaXR0ZXN0JyAiCisgICAgICAiZGVwZW5kZW5jeTogJ2Jhci5wcm90bycgIgorICAgICAgImRlcGVuZGVuY3k6ICdiYXoucHJvdG8nICIKKyAgICAgICJleHRlbnNpb24geyBleHRlbmRlZTogJy5wcm90b2J1Zl91bml0dGVzdC5CYXInIG5hbWU6J2JhcicgbnVtYmVyOjExIgorICAgICAgIiAgICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTonLnByb3RvYnVmX3VuaXR0ZXN0LkJheicgfSIpOworICBQYXJzZVByb3RvQW5kQWRkVG9EYigKKyAgICAgICJuYW1lOiAnYmFyLnByb3RvJyAiCisgICAgICAicGFja2FnZTogJ3Byb3RvYnVmX3VuaXR0ZXN0JyAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTonQmFyJyAiCisgICAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMTAgZW5kOiAyMCB9IgorICAgICAgIn0iKTsKKyAgQWRkU2ltcGxlTWVzc2FnZVByb3RvRmlsZVRvRGIoImJheiIsICJCYXoiKTsKKworICAvLyBWZXJpZnkgbm9uZSBoYXZlIGJlZW4gYnVpbHQgeWV0LgorICBFWFBFQ1RfRkFMU0UocG9vbF8uSW50ZXJuYWxJc0ZpbGVMb2FkZWQoImZvby5wcm90byIpKTsKKyAgRVhQRUNUX0ZBTFNFKHBvb2xfLkludGVybmFsSXNGaWxlTG9hZGVkKCJiYXIucHJvdG8iKSk7CisgIEVYUEVDVF9GQUxTRShwb29sXy5JbnRlcm5hbElzRmlsZUxvYWRlZCgiYmF6LnByb3RvIikpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbF8uRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpOworCisgIC8vIFZlcmlmeSBmb28uYmFyIGdldHMgbG9hZGVkLCBhbmQgYmFyLnByb3RvIGdldHMgbG9hZGVkCisgIC8vIHRvIHJlZ2lzdGVyIHRoZSBleHRlbnNpb24uIGJhei5wcm90byBzaG91bGQgbm90IGdldCBsb2FkZWQuCisgIEVYUEVDVF9UUlVFKGZpbGUgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKHBvb2xfLkludGVybmFsSXNGaWxlTG9hZGVkKCJmb28ucHJvdG8iKSk7CisgIEVYUEVDVF9UUlVFKHBvb2xfLkludGVybmFsSXNGaWxlTG9hZGVkKCJiYXIucHJvdG8iKSk7CisgIEVYUEVDVF9GQUxTRShwb29sXy5JbnRlcm5hbElzRmlsZUxvYWRlZCgiYmF6LnByb3RvIikpOworfQorCitURVNUX0YoTGF6aWx5QnVpbGREZXBlbmRlbmNpZXNUZXN0LCBTZXJ2aWNlKSB7CisgIFBhcnNlUHJvdG9BbmRBZGRUb0RiKAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJwYWNrYWdlOiAncHJvdG9idWZfdW5pdHRlc3QnICIKKyAgICAgICJkZXBlbmRlbmN5OiAnbWVzc2FnZTEucHJvdG8nICIKKyAgICAgICJkZXBlbmRlbmN5OiAnbWVzc2FnZTIucHJvdG8nICIKKyAgICAgICJkZXBlbmRlbmN5OiAnbWVzc2FnZTMucHJvdG8nICIKKyAgICAgICJkZXBlbmRlbmN5OiAnbWVzc2FnZTQucHJvdG8nICIKKyAgICAgICJzZXJ2aWNlIHsiCisgICAgICAiICBuYW1lOiAnTGF6eVNlcnZpY2UnIgorICAgICAgIiAgbWV0aG9kIHsgbmFtZTogJ0EnIGlucHV0X3R5cGU6ICAnLnByb3RvYnVmX3VuaXR0ZXN0Lk1lc3NhZ2UxJyAiCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3R5cGU6ICcucHJvdG9idWZfdW5pdHRlc3QuTWVzc2FnZTInIH0iCisgICAgICAifSIpOworICBBZGRTaW1wbGVNZXNzYWdlUHJvdG9GaWxlVG9EYigibWVzc2FnZTEiLCAiTWVzc2FnZTEiKTsKKyAgQWRkU2ltcGxlTWVzc2FnZVByb3RvRmlsZVRvRGIoIm1lc3NhZ2UyIiwgIk1lc3NhZ2UyIik7CisgIEFkZFNpbXBsZU1lc3NhZ2VQcm90b0ZpbGVUb0RiKCJtZXNzYWdlMyIsICJNZXNzYWdlMyIpOworICBBZGRTaW1wbGVNZXNzYWdlUHJvdG9GaWxlVG9EYigibWVzc2FnZTQiLCAiTWVzc2FnZTQiKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2xfLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKTsKKworICAvLyBWZXJpZnkgY2FsbGluZyBGaW5kU2VydmljZUJ5TmFtZSBvciBGaW5kTWV0aG9kQnlOYW1lIGRvZXNuJ3QgYnVpbGQgdGhlCisgIC8vIGZpbGVzIGRlZmluaW5nIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHR5cGUsIGFuZCBpbnB1dF90eXBlKCkgYW5kCisgIC8vIG91dHB1dF90eXBlKCkgZG9lcyBpbmRlZWQgYnVpbGQgdGhlIGFwcHJvcHJpYXRlIGZpbGVzLgorICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZSA9IGZpbGUtPkZpbmRTZXJ2aWNlQnlOYW1lKCJMYXp5U2VydmljZSIpOworICBFWFBFQ1RfVFJVRShzZXJ2aWNlICE9IG51bGxwdHIpOworICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBzZXJ2aWNlLT5GaW5kTWV0aG9kQnlOYW1lKCJBIik7CisgIEVYUEVDVF9GQUxTRShwb29sXy5JbnRlcm5hbElzRmlsZUxvYWRlZCgibWVzc2FnZTEucHJvdG8iKSk7CisgIEVYUEVDVF9GQUxTRShwb29sXy5JbnRlcm5hbElzRmlsZUxvYWRlZCgibWVzc2FnZTIucHJvdG8iKSk7CisgIEVYUEVDVF9UUlVFKG1ldGhvZCAhPSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUobWV0aG9kLT5pbnB1dF90eXBlKCkgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKHBvb2xfLkludGVybmFsSXNGaWxlTG9hZGVkKCJtZXNzYWdlMS5wcm90byIpKTsKKyAgRVhQRUNUX0ZBTFNFKHBvb2xfLkludGVybmFsSXNGaWxlTG9hZGVkKCJtZXNzYWdlMi5wcm90byIpKTsKKyAgRVhQRUNUX1RSVUUobWV0aG9kLT5vdXRwdXRfdHlwZSgpICE9IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShwb29sXy5JbnRlcm5hbElzRmlsZUxvYWRlZCgibWVzc2FnZTIucHJvdG8iKSk7Cit9CisKKworVEVTVF9GKExhemlseUJ1aWxkRGVwZW5kZW5jaWVzVGVzdCwgR2VuZXJhdGVkRmlsZSkgeworICAvLyBNb3N0IHRlc3RpbmcgaXMgZG9uZSB3aXRoIGN1c3RvbSBwb29scyB3aXRoIGxhenkgZGVwZW5kZW5jaWVzIGZvcmNlZCBvbiwKKyAgLy8gZG8gc29tZSBzYW5pdHkgY2hlY2tpbmcgdGhhdCBsYXp5IGltcG9ydHMgaXMgb24gYnkgZGVmYXVsdCBmb3IgdGhlCisgIC8vIGdlbmVyYXRlZCBwb29sLCBhbmQgZG8gY3VzdG9tIG9wdGlvbnMgdGVzdGluZyB3aXRoIGdlbmVyYXRlZCB0bworICAvLyBiZSBhYmxlIHRvIHVzZSB0aGUgR2V0RXh0ZW5zaW9uIGlkcyBmb3IgdGhlIGN1c3RvbSBvcHRpb25zLgorCisgIC8vIFZlcmlmeSBub25lIG9mIHRoZSBmaWxlcyBhcmUgbG9hZGVkIHlldC4KKyAgRVhQRUNUX0ZBTFNFKERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLT5JbnRlcm5hbElzRmlsZUxvYWRlZCgKKyAgICAgICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucHJvdG8iKSk7CisgIEVYUEVDVF9GQUxTRShEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS0+SW50ZXJuYWxJc0ZpbGVMb2FkZWQoCisgICAgICAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucHJvdG8iKSk7CisgIEVYUEVDVF9GQUxTRShEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS0+SW50ZXJuYWxJc0ZpbGVMb2FkZWQoCisgICAgICAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucHJvdG8iKSk7CisKKyAgLy8gVmVyaWZ5IGNhbGxpbmcgYXV0b2dlbmVyYXRlZCBmdW5jdGlvbiB0byBnZXQgYSBkZXNjcmlwdG9yIGluIHRoZSBiYXNlCisgIC8vIGZpbGUgd2lsbCBidWlsZCB0aGF0IGZpbGUgYnV0IG5vbmUgb2YgaXQncyBpbXBvcnRzLiBUaGlzIHZlcmlmaWVzIHRoYXQKKyAgLy8gbGF6aWx5X2J1aWxkX2RlcGVuZGVuY2llc18gaXMgc2V0IG9uIHRoZSBnZW5lcmF0ZWQgcG9vbCwgYW5kIGFsc28gdGhhdAorICAvLyB0aGUgZ2VuZXJhdGVkIGZ1bmN0aW9uICJkZXNjcmlwdG9yKCkiIGRvZXNuJ3Qgc29tZWhvdyBzdWJ2ZXJ0IHRoZSBsYXppbmVzcworICAvLyBieSBtYW51YWxseSBsb2FkaW5nIHRoZSBkZXBlbmRlbmNpZXMgb3Igc29tZXRoaW5nLgorICBFWFBFQ1RfVFJVRShwcm90b2J1Zl91bml0dGVzdDo6bGF6eV9pbXBvcnRzOjpJbXBvcnRlZE1lc3NhZ2U6OmRlc2NyaXB0b3IoKSAhPQorICAgICAgICAgICAgICBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCktPkludGVybmFsSXNGaWxlTG9hZGVkKAorICAgICAgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llcy5wcm90byIpKTsKKyAgRVhQRUNUX0ZBTFNFKERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLT5JbnRlcm5hbElzRmlsZUxvYWRlZCgKKyAgICAgICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wcm90byIpKTsKKyAgRVhQRUNUX0ZBTFNFKERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLT5JbnRlcm5hbElzRmlsZUxvYWRlZCgKKyAgICAgICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wcm90byIpKTsKKworICAvLyBWZXJpZnkgY3VzdG9tIG9wdGlvbnMgd29yayB3aGVuIGRlZmluZWQgaW4gYW4gaW1wb3J0IHRoYXQgaXNuJ3QgbG9hZGVkLAorICAvLyBhbmQgdGhhdCBhIG5vbi1kZWZhdWx0IHZhbHVlIG9mIGEgY3VzdG9tIG9wdGlvbiBkb2Vzbid0IGxvYWQgdGhlIGZpbGUKKyAgLy8gd2hlcmUgdGhhdCBlbnVtIGlzIGRlZmluZWQuCisgIGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBvcHRpb25zID0KKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpsYXp5X2ltcG9ydHM6Ok1lc3NhZ2VDdXN0b21PcHRpb246OmRlc2NyaXB0b3IoKQorICAgICAgICAgIC0+b3B0aW9ucygpOworICBwcm90b2J1Zl91bml0dGVzdDo6bGF6eV9pbXBvcnRzOjpMYXp5RW51bSBjdXN0b21fb3B0aW9uX3ZhbHVlID0KKyAgICAgIG9wdGlvbnMuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpsYXp5X2ltcG9ydHM6OmxhenlfZW51bV9vcHRpb24pOworCisgIEVYUEVDVF9GQUxTRShEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS0+SW50ZXJuYWxJc0ZpbGVMb2FkZWQoCisgICAgICAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucHJvdG8iKSk7CisgIEVYUEVDVF9GQUxTRShEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS0+SW50ZXJuYWxJc0ZpbGVMb2FkZWQoCisgICAgICAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucHJvdG8iKSk7CisgIEVYUEVDVF9FUShjdXN0b21fb3B0aW9uX3ZhbHVlLCBwcm90b2J1Zl91bml0dGVzdDo6bGF6eV9pbXBvcnRzOjpMQVpZX0VOVU1fMSk7CisKKyAgY29uc3QgTWVzc2FnZU9wdGlvbnMmIG9wdGlvbnMyID0KKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpsYXp5X2ltcG9ydHM6Ok1lc3NhZ2VDdXN0b21PcHRpb24yOjpkZXNjcmlwdG9yKCkKKyAgICAgICAgICAtPm9wdGlvbnMoKTsKKyAgY3VzdG9tX29wdGlvbl92YWx1ZSA9CisgICAgICBvcHRpb25zMi5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmxhenlfaW1wb3J0czo6bGF6eV9lbnVtX29wdGlvbik7CisKKyAgRVhQRUNUX0ZBTFNFKERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLT5JbnRlcm5hbElzRmlsZUxvYWRlZCgKKyAgICAgICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wcm90byIpKTsKKyAgRVhQRUNUX0ZBTFNFKERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLT5JbnRlcm5hbElzRmlsZUxvYWRlZCgKKyAgICAgICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wcm90byIpKTsKKyAgRVhQRUNUX0VRKGN1c3RvbV9vcHRpb25fdmFsdWUsIHByb3RvYnVmX3VuaXR0ZXN0OjpsYXp5X2ltcG9ydHM6OkxBWllfRU5VTV8wKTsKK30KKworVEVTVF9GKExhemlseUJ1aWxkRGVwZW5kZW5jaWVzVGVzdCwgRGVwZW5kZW5jeSkgeworICBQYXJzZVByb3RvQW5kQWRkVG9EYigKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAicGFja2FnZTogJ3Byb3RvYnVmX3VuaXR0ZXN0JyAiCisgICAgICAiZGVwZW5kZW5jeTogJ2Jhci5wcm90bycgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6J0ZvbycgIgorICAgICAgIiAgZmllbGQgeyBuYW1lOidiYXInIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAgICJ0eXBlX25hbWU6Jy5wcm90b2J1Zl91bml0dGVzdC5CYXInIH0gIgorICAgICAgIn0iKTsKKyAgUGFyc2VQcm90b0FuZEFkZFRvRGIoCisgICAgICAibmFtZTogJ2Jhci5wcm90bycgIgorICAgICAgInBhY2thZ2U6ICdwcm90b2J1Zl91bml0dGVzdCcgIgorICAgICAgImRlcGVuZGVuY3k6ICdiYXoucHJvdG8nICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOidCYXInICIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTonYmF6JyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCAiCisgICAgICAidHlwZV9uYW1lOicucHJvdG9idWZfdW5pdHRlc3QuQmF6JyB9ICIKKyAgICAgICJ9Iik7CisgIEFkZFNpbXBsZU1lc3NhZ2VQcm90b0ZpbGVUb0RiKCJiYXoiLCAiQmF6Iik7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvb19maWxlID0gcG9vbF8uRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpOworICBFWFBFQ1RfVFJVRShmb29fZmlsZSAhPSBudWxscHRyKTsKKyAgLy8gQXMgZXhwZWN0ZWQsIHJlcXVlc3RpbmcgZm9vLnByb3RvIHNob3VsZG4ndCBidWlsZCBpdCdzIGRlcGVuZGVuY2llcworICBFWFBFQ1RfVFJVRShwb29sXy5JbnRlcm5hbElzRmlsZUxvYWRlZCgiZm9vLnByb3RvIikpOworICBFWFBFQ1RfRkFMU0UocG9vbF8uSW50ZXJuYWxJc0ZpbGVMb2FkZWQoImJhci5wcm90byIpKTsKKyAgRVhQRUNUX0ZBTFNFKHBvb2xfLkludGVybmFsSXNGaWxlTG9hZGVkKCJiYXoucHJvdG8iKSk7CisKKyAgLy8gVmVyaWZ5IGNhbGxpbmcgZGVwZW5kZW5jeShOKSB3aWxsIGJ1aWxkIHRoZSBkZXBlbmRlbmN5LCBidXQKKyAgLy8gbm90IHRoYXQgZmlsZSdzIGRlcGVuZGVuY2llcy4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhcl9maWxlID0gZm9vX2ZpbGUtPmRlcGVuZGVuY3koMCk7CisgIEVYUEVDVF9UUlVFKGJhcl9maWxlICE9IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShwb29sXy5JbnRlcm5hbElzRmlsZUxvYWRlZCgiYmFyLnByb3RvIikpOworICBFWFBFQ1RfRkFMU0UocG9vbF8uSW50ZXJuYWxJc0ZpbGVMb2FkZWQoImJhei5wcm90byIpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK30gIC8vIG5hbWVzcGFjZSBkZXNjcmlwdG9yX3VuaXR0ZXN0Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9kcm9wX3Vua25vd25fZmllbGRzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjNmI2NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LmNjCkBAIC0wLDAgKzEsODMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3VzaW5nIHVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHM6OkZvbzsKK3VzaW5nIHVuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHM6OkZvb1dpdGhFeHRyYUZpZWxkczsKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitURVNUKERyb3BVbmtub3duRmllbGRzVGVzdCwgR2VuZXJhdGVkTWVzc2FnZSkgeworICBGb29XaXRoRXh0cmFGaWVsZHMgZm9vX3dpdGhfZXh0cmFfZmllbGRzOworICBmb29fd2l0aF9leHRyYV9maWVsZHMuc2V0X2ludDMyX3ZhbHVlKDEpOworICBmb29fd2l0aF9leHRyYV9maWVsZHMuc2V0X2VudW1fdmFsdWUoRm9vV2l0aEV4dHJhRmllbGRzOjpNT08pOworICBmb29fd2l0aF9leHRyYV9maWVsZHMuc2V0X2V4dHJhX2ludDMyX3ZhbHVlKDIpOworCisgIEZvbyBmb287CisgIEFTU0VSVF9UUlVFKGZvby5QYXJzZUZyb21TdHJpbmcoZm9vX3dpdGhfZXh0cmFfZmllbGRzLlNlcmlhbGl6ZUFzU3RyaW5nKCkpKTsKKyAgRVhQRUNUX0VRKDEsIGZvby5pbnQzMl92YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludD4oRm9vV2l0aEV4dHJhRmllbGRzOjpNT08pLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihmb28uZW51bV92YWx1ZSgpKSk7CisgIEVYUEVDVF9GQUxTRShmb28uR2V0UmVmbGVjdGlvbigpLT5HZXRVbmtub3duRmllbGRzKGZvbykuZW1wdHkoKSk7CisKKyAgQVNTRVJUX1RSVUUoZm9vX3dpdGhfZXh0cmFfZmllbGRzLlBhcnNlRnJvbVN0cmluZyhmb28uU2VyaWFsaXplQXNTdHJpbmcoKSkpOworICBFWFBFQ1RfRVEoMSwgZm9vX3dpdGhfZXh0cmFfZmllbGRzLmludDMyX3ZhbHVlKCkpOworICBFWFBFQ1RfRVEoRm9vV2l0aEV4dHJhRmllbGRzOjpNT08sIGZvb193aXRoX2V4dHJhX2ZpZWxkcy5lbnVtX3ZhbHVlKCkpOworICAvLyBUaGUgImV4dHJhX2ludDMyX3ZhbHVlIiBmaWVsZCBzaG91bGQgbm90IGJlIGxvc3QuCisgIEVYUEVDVF9FUSgyLCBmb29fd2l0aF9leHRyYV9maWVsZHMuZXh0cmFfaW50MzJfdmFsdWUoKSk7Cit9CisKK1RFU1QoRHJvcFVua25vd25GaWVsZHNUZXN0LCBEeW5hbWljTWVzc2FnZSkgeworICBGb29XaXRoRXh0cmFGaWVsZHMgZm9vX3dpdGhfZXh0cmFfZmllbGRzOworICBmb29fd2l0aF9leHRyYV9maWVsZHMuc2V0X2ludDMyX3ZhbHVlKDEpOworICBmb29fd2l0aF9leHRyYV9maWVsZHMuc2V0X2VudW1fdmFsdWUoRm9vV2l0aEV4dHJhRmllbGRzOjpNT08pOworICBmb29fd2l0aF9leHRyYV9maWVsZHMuc2V0X2V4dHJhX2ludDMyX3ZhbHVlKDIpOworCisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OworICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gZm9vKGZhY3RvcnkuR2V0UHJvdG90eXBlKEZvbzo6ZGVzY3JpcHRvcigpKS0+TmV3KCkpOworICBBU1NFUlRfVFJVRShmb28tPlBhcnNlRnJvbVN0cmluZyhmb29fd2l0aF9leHRyYV9maWVsZHMuU2VyaWFsaXplQXNTdHJpbmcoKSkpOworICBFWFBFQ1RfRkFMU0UoZm9vLT5HZXRSZWZsZWN0aW9uKCktPkdldFVua25vd25GaWVsZHMoKmZvbykuZW1wdHkoKSk7CisKKyAgQVNTRVJUX1RSVUUoZm9vX3dpdGhfZXh0cmFfZmllbGRzLlBhcnNlRnJvbVN0cmluZyhmb28tPlNlcmlhbGl6ZUFzU3RyaW5nKCkpKTsKKyAgRVhQRUNUX0VRKDEsIGZvb193aXRoX2V4dHJhX2ZpZWxkcy5pbnQzMl92YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKEZvb1dpdGhFeHRyYUZpZWxkczo6TU9PLCBmb29fd2l0aF9leHRyYV9maWVsZHMuZW51bV92YWx1ZSgpKTsKKyAgLy8gVGhlICJleHRyYV9pbnQzMl92YWx1ZSIgZmllbGQgc2hvdWxkIG5vdCBiZSBsb3N0LgorICBFWFBFQ1RfRVEoMiwgZm9vX3dpdGhfZXh0cmFfZmllbGRzLmV4dHJhX2ludDMyX3ZhbHVlKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucGIuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNzY2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmNjCkBAIC0wLDAgKzEsMzA3IEBACisvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wYi5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworUFJPVE9CVUZfUFJBR01BX0lOSVRfU0VHCisKK25hbWVzcGFjZSBfcGIgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDsKK25hbWVzcGFjZSBfcGJpID0gX3BiOjppbnRlcm5hbDsKKworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK1BST1RPQlVGX0NPTlNURVhQUiBEdXJhdGlvbjo6RHVyYXRpb24oCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLnNlY29uZHNfKSovaW50NjRfdHswfQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm5hbm9zXykqLzAKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319IHt9CitzdHJ1Y3QgRHVyYXRpb25EZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIER1cmF0aW9uRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgfkR1cmF0aW9uRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBEdXJhdGlvbiBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBEdXJhdGlvbkRlZmF1bHRUeXBlSW50ZXJuYWwgX0R1cmF0aW9uX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitzdGF0aWMgOjpfcGI6Ok1ldGFkYXRhIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZkdXJhdGlvbl8yZXByb3RvWzFdOworc3RhdGljIGNvbnN0ZXhwciA6Ol9wYjo6RW51bURlc2NyaXB0b3IgY29uc3QqKiBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZkdXJhdGlvbl8yZXByb3RvID0gbnVsbHB0cjsKK3N0YXRpYyBjb25zdGV4cHIgOjpfcGI6OlNlcnZpY2VEZXNjcmlwdG9yIGNvbnN0KiogZmlsZV9sZXZlbF9zZXJ2aWNlX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmZHVyYXRpb25fMmVwcm90byA9IG51bGxwdHI7CisKK2NvbnN0IHVpbnQzMl90IFRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmZHVyYXRpb25fMmVwcm90bzo6b2Zmc2V0c1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0geworICB+MHUsICAvLyBubyBfaGFzX2JpdHNfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RHVyYXRpb24sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RHVyYXRpb24sIF9pbXBsXy5zZWNvbmRzXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RHVyYXRpb24sIF9pbXBsXy5uYW5vc18pLAorfTsKK3N0YXRpYyBjb25zdCA6Ol9wYmk6Ok1pZ3JhdGlvblNjaGVtYSBzY2hlbWFzW10gUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRShwcm90b2Rlc2NfY29sZCkgPSB7CisgIHsgMCwgLTEsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkR1cmF0aW9uKX0sCit9OworCitzdGF0aWMgY29uc3QgOjpfcGI6Ok1lc3NhZ2UqIGNvbnN0IGZpbGVfZGVmYXVsdF9pbnN0YW5jZXNbXSA9IHsKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfRHVyYXRpb25fZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorfTsKKworY29uc3QgY2hhciBkZXNjcmlwdG9yX3RhYmxlX3Byb3RvZGVmX2dvb2dsZV8yZnByb3RvYnVmXzJmZHVyYXRpb25fMmVwcm90b1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0KKyAgIlxuXDAzNmdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90b1wwMjJcMDE3Z29vZ2xlIgorICAiLnByb3RvYnVmXCIqXG5cMDEwRHVyYXRpb25cMDIyXDAxN1xuXDAwN3NlY29uZHNcMDMwXDAwMSBcMDAxKFwwMDNcMDIyXHIiCisgICJcblwwMDVuYW5vc1wwMzBcMDAyIFwwMDEoXDAwNUJcMjAzXDAwMVxuXDAyM2NvbS5nb29nbGUucHJvdG9idWZCXHJEIgorICAidXJhdGlvblByb3RvUFwwMDFaMWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYiIKKyAgInVmL3R5cGVzL2tub3duL2R1cmF0aW9ucGJcMzcwXDAwMVwwMDFcMjQyXDAwMlwwMDNHUEJcMjUyXDAwMlwwMzZHb28iCisgICJnbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiXDAwNnByb3RvMyIKKyAgOworc3RhdGljIDo6X3BiaTo6b25jZV9mbGFnIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkdXJhdGlvbl8yZXByb3RvX29uY2U7Citjb25zdCA6Ol9wYmk6OkRlc2NyaXB0b3JUYWJsZSBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZHVyYXRpb25fMmVwcm90byA9IHsKKyAgICBmYWxzZSwgZmFsc2UsIDIzNSwgZGVzY3JpcHRvcl90YWJsZV9wcm90b2RlZl9nb29nbGVfMmZwcm90b2J1Zl8yZmR1cmF0aW9uXzJlcHJvdG8sCisgICAgImdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90byIsCisgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkdXJhdGlvbl8yZXByb3RvX29uY2UsIG51bGxwdHIsIDAsIDEsCisgICAgc2NoZW1hcywgZmlsZV9kZWZhdWx0X2luc3RhbmNlcywgVGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZkdXJhdGlvbl8yZXByb3RvOjpvZmZzZXRzLAorICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZkdXJhdGlvbl8yZXByb3RvLCBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZkdXJhdGlvbl8yZXByb3RvLAorICAgIGZpbGVfbGV2ZWxfc2VydmljZV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZmR1cmF0aW9uXzJlcHJvdG8sCit9OworUFJPVE9CVUZfQVRUUklCVVRFX1dFQUsgY29uc3QgOjpfcGJpOjpEZXNjcmlwdG9yVGFibGUqIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkdXJhdGlvbl8yZXByb3RvX2dldHRlcigpIHsKKyAgcmV0dXJuICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZHVyYXRpb25fMmVwcm90bzsKK30KKworLy8gRm9yY2UgcnVubmluZyBBZGREZXNjcmlwdG9ycygpIGF0IGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gdGltZS4KK1BST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMiBzdGF0aWMgOjpfcGJpOjpBZGREZXNjcmlwdG9yc1J1bm5lciBkeW5hbWljX2luaXRfZHVtbXlfZ29vZ2xlXzJmcHJvdG9idWZfMmZkdXJhdGlvbl8yZXByb3RvKCZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZHVyYXRpb25fMmVwcm90byk7CitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIER1cmF0aW9uOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKK307CisKK0R1cmF0aW9uOjpEdXJhdGlvbig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbikKK30KK0R1cmF0aW9uOjpEdXJhdGlvbihjb25zdCBEdXJhdGlvbiYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgRHVyYXRpb24qIGNvbnN0IF90aGlzID0gdGhpczsgKHZvaWQpX3RoaXM7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8uc2Vjb25kc18pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW5vc18pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgOjptZW1jcHkoJl9pbXBsXy5zZWNvbmRzXywgJmZyb20uX2ltcGxfLnNlY29uZHNfLAorICAgIHN0YXRpY19jYXN0PHNpemVfdD4ocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5uYW5vc18pIC0KKyAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLnNlY29uZHNfKSkgKyBzaXplb2YoX2ltcGxfLm5hbm9zXykpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRHVyYXRpb24pCit9CisKK2lubGluZSB2b2lkIER1cmF0aW9uOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5zZWNvbmRzXyl7aW50NjRfdHswfX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW5vc18pezB9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgfTsKK30KKworRHVyYXRpb246On5EdXJhdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgRHVyYXRpb246OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7Cit9CisKK3ZvaWQgRHVyYXRpb246OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIER1cmF0aW9uOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbikKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgOjptZW1zZXQoJl9pbXBsXy5zZWNvbmRzXywgMCwgc3RhdGljX2Nhc3Q8c2l6ZV90PigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8ubmFub3NfKSAtCisgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLnNlY29uZHNfKSkgKyBzaXplb2YoX2ltcGxfLm5hbm9zXykpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIER1cmF0aW9uOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIGludDY0IHNlY29uZHMgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gOCkpIHsKKyAgICAgICAgICBfaW1wbF8uc2Vjb25kc18gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gaW50MzIgbmFub3MgPSAyOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTYpKSB7CisgICAgICAgICAgX2ltcGxfLm5hbm9zXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDMyKCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBEdXJhdGlvbjo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRHVyYXRpb24pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gaW50NjQgc2Vjb25kcyA9IDE7CisgIGlmICh0aGlzLT5faW50ZXJuYWxfc2Vjb25kcygpICE9IDApIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQ2NFRvQXJyYXkoMSwgdGhpcy0+X2ludGVybmFsX3NlY29uZHMoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIGludDMyIG5hbm9zID0gMjsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9uYW5vcygpICE9IDApIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMiwgdGhpcy0+X2ludGVybmFsX25hbm9zKCksIHRhcmdldCk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRHVyYXRpb24pCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBEdXJhdGlvbjo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbikKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIGludDY0IHNlY29uZHMgPSAxOworICBpZiAodGhpcy0+X2ludGVybmFsX3NlY29uZHMoKSAhPSAwKSB7CisgICAgdG90YWxfc2l6ZSArPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpJbnQ2NFNpemVQbHVzT25lKHRoaXMtPl9pbnRlcm5hbF9zZWNvbmRzKCkpOworICB9CisKKyAgLy8gaW50MzIgbmFub3MgPSAyOworICBpZiAodGhpcy0+X2ludGVybmFsX25hbm9zKCkgIT0gMCkgeworICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplUGx1c09uZSh0aGlzLT5faW50ZXJuYWxfbmFub3MoKSk7CisgIH0KKworICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBEdXJhdGlvbjo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIER1cmF0aW9uOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkR1cmF0aW9uOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBEdXJhdGlvbjo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PER1cmF0aW9uKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBEdXJhdGlvbiY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgaWYgKGZyb20uX2ludGVybmFsX3NlY29uZHMoKSAhPSAwKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfc2Vjb25kcyhmcm9tLl9pbnRlcm5hbF9zZWNvbmRzKCkpOworICB9CisgIGlmIChmcm9tLl9pbnRlcm5hbF9uYW5vcygpICE9IDApIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF9uYW5vcyhmcm9tLl9pbnRlcm5hbF9uYW5vcygpKTsKKyAgfQorICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBEdXJhdGlvbjo6Q29weUZyb20oY29uc3QgRHVyYXRpb24mIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRHVyYXRpb246OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIER1cmF0aW9uOjpJbnRlcm5hbFN3YXAoRHVyYXRpb24qIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjptZW1zd2FwPAorICAgICAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKER1cmF0aW9uLCBfaW1wbF8ubmFub3NfKQorICAgICAgKyBzaXplb2YoRHVyYXRpb246Ol9pbXBsXy5uYW5vc18pCisgICAgICAtIFBST1RPQlVGX0ZJRUxEX09GRlNFVChEdXJhdGlvbiwgX2ltcGxfLnNlY29uZHNfKT4oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5zZWNvbmRzXyksCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm90aGVyLT5faW1wbF8uc2Vjb25kc18pKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIER1cmF0aW9uOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmR1cmF0aW9uXzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmR1cmF0aW9uXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZkdXJhdGlvbl8yZXByb3RvWzBdKTsKK30KKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkR1cmF0aW9uKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkR1cmF0aW9uID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RHVyYXRpb24gPihhcmVuYSk7Cit9CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkxMzAyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucGIuaApAQCAtMCwwICsxLDI3OCBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2dvb2dsZV8yZnByb3RvYnVmXzJmZHVyYXRpb25fMmVwcm90bworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfZ29vZ2xlXzJmcHJvdG9idWZfMmZkdXJhdGlvbl8yZXByb3RvCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKyNpZiBQUk9UT0JVRl9WRVJTSU9OIDwgMzAyMTAwMAorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiBQbGVhc2UgdXBkYXRlCisjZXJyb3IgeW91ciBoZWFkZXJzLgorI2VuZGlmCisjaWYgMzAyMTAwOSA8IFBST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTgorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIG9sZGVyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCisjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gUGxlYXNlCisjZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21ldGFkYXRhX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorI2RlZmluZSBQUk9UT0JVRl9JTlRFUk5BTF9FWFBPUlRfZ29vZ2xlXzJmcHJvdG9idWZfMmZkdXJhdGlvbl8yZXByb3RvIFBST1RPQlVGX0VYUE9SVAorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBBbnlNZXRhZGF0YTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCisKKy8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCAtLSBkbyBub3QgdXNlIHRoZXNlIG1lbWJlcnMuCitzdHJ1Y3QgUFJPVE9CVUZfRVhQT1JUIFRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmZHVyYXRpb25fMmVwcm90byB7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBvZmZzZXRzW107Cit9OworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkRlc2NyaXB0b3JUYWJsZSBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZHVyYXRpb25fMmVwcm90bzsKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCitjbGFzcyBEdXJhdGlvbjsKK3N0cnVjdCBEdXJhdGlvbkRlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIER1cmF0aW9uRGVmYXVsdFR5cGVJbnRlcm5hbCBfRHVyYXRpb25fZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCit0ZW1wbGF0ZTw+IFBST1RPQlVGX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RHVyYXRpb24qIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkR1cmF0aW9uPihBcmVuYSopOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBEdXJhdGlvbiBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbikgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIER1cmF0aW9uKCkgOiBEdXJhdGlvbihudWxscHRyKSB7fQorICB+RHVyYXRpb24oKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIER1cmF0aW9uKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgRHVyYXRpb24oY29uc3QgRHVyYXRpb24mIGZyb20pOworICBEdXJhdGlvbihEdXJhdGlvbiYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBEdXJhdGlvbigpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIER1cmF0aW9uJiBvcGVyYXRvcj0oY29uc3QgRHVyYXRpb24mIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIER1cmF0aW9uJiBvcGVyYXRvcj0oRHVyYXRpb24mJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgRHVyYXRpb24mIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBEdXJhdGlvbiogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBEdXJhdGlvbio+KAorICAgICAgICAgICAgICAgJl9EdXJhdGlvbl9kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDA7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChEdXJhdGlvbiYgYSwgRHVyYXRpb24mIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoRHVyYXRpb24qIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKER1cmF0aW9uKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBEdXJhdGlvbiogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxEdXJhdGlvbj4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBEdXJhdGlvbiYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBEdXJhdGlvbiYgZnJvbSkgeworICAgIER1cmF0aW9uOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoRHVyYXRpb24qIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuRHVyYXRpb24iOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgRHVyYXRpb24oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtTZWNvbmRzRmllbGROdW1iZXIgPSAxLAorICAgIGtOYW5vc0ZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgLy8gaW50NjQgc2Vjb25kcyA9IDE7CisgIHZvaWQgY2xlYXJfc2Vjb25kcygpOworICBpbnQ2NF90IHNlY29uZHMoKSBjb25zdDsKKyAgdm9pZCBzZXRfc2Vjb25kcyhpbnQ2NF90IHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgaW50NjRfdCBfaW50ZXJuYWxfc2Vjb25kcygpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfc2Vjb25kcyhpbnQ2NF90IHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIGludDMyIG5hbm9zID0gMjsKKyAgdm9pZCBjbGVhcl9uYW5vcygpOworICBpbnQzMl90IG5hbm9zKCkgY29uc3Q7CisgIHZvaWQgc2V0X25hbm9zKGludDMyX3QgdmFsdWUpOworICBwcml2YXRlOgorICBpbnQzMl90IF9pbnRlcm5hbF9uYW5vcygpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfbmFub3MoaW50MzJfdCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICBpbnQ2NF90IHNlY29uZHNfOworICAgIGludDMyX3QgbmFub3NfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZkdXJhdGlvbl8yZXByb3RvOworfTsKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfX0dOVUNfXworICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3N0cmljdC1hbGlhc2luZyIKKyNlbmRpZiAgLy8gX19HTlVDX18KKy8vIER1cmF0aW9uCisKKy8vIGludDY0IHNlY29uZHMgPSAxOworaW5saW5lIHZvaWQgRHVyYXRpb246OmNsZWFyX3NlY29uZHMoKSB7CisgIF9pbXBsXy5zZWNvbmRzXyA9IGludDY0X3R7MH07Cit9CitpbmxpbmUgaW50NjRfdCBEdXJhdGlvbjo6X2ludGVybmFsX3NlY29uZHMoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uc2Vjb25kc187Cit9CitpbmxpbmUgaW50NjRfdCBEdXJhdGlvbjo6c2Vjb25kcygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRHVyYXRpb24uc2Vjb25kcykKKyAgcmV0dXJuIF9pbnRlcm5hbF9zZWNvbmRzKCk7Cit9CitpbmxpbmUgdm9pZCBEdXJhdGlvbjo6X2ludGVybmFsX3NldF9zZWNvbmRzKGludDY0X3QgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5zZWNvbmRzXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgRHVyYXRpb246OnNldF9zZWNvbmRzKGludDY0X3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9zZWNvbmRzKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRHVyYXRpb24uc2Vjb25kcykKK30KKworLy8gaW50MzIgbmFub3MgPSAyOworaW5saW5lIHZvaWQgRHVyYXRpb246OmNsZWFyX25hbm9zKCkgeworICBfaW1wbF8ubmFub3NfID0gMDsKK30KK2lubGluZSBpbnQzMl90IER1cmF0aW9uOjpfaW50ZXJuYWxfbmFub3MoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubmFub3NfOworfQoraW5saW5lIGludDMyX3QgRHVyYXRpb246Om5hbm9zKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbi5uYW5vcykKKyAgcmV0dXJuIF9pbnRlcm5hbF9uYW5vcygpOworfQoraW5saW5lIHZvaWQgRHVyYXRpb246Ol9pbnRlcm5hbF9zZXRfbmFub3MoaW50MzJfdCB2YWx1ZSkgeworICAKKyAgX2ltcGxfLm5hbm9zXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgRHVyYXRpb246OnNldF9uYW5vcyhpbnQzMl90IHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfbmFub3ModmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbi5uYW5vcykKK30KKworI2lmZGVmIF9fR05VQ19fCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYgIC8vIF9fR05VQ19fCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCisKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2dvb2dsZV8yZnByb3RvYnVmXzJmZHVyYXRpb25fMmVwcm90bwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjM2UzNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8KQEAgLTAsMCArMSwxMTYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBnb29nbGUucHJvdG9idWY7CisKK29wdGlvbiBjc2hhcnBfbmFtZXNwYWNlID0gIkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcyI7CitvcHRpb24gY2NfZW5hYmxlX2FyZW5hcyA9IHRydWU7CitvcHRpb24gZ29fcGFja2FnZSA9ICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9kdXJhdGlvbnBiIjsKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiRHVyYXRpb25Qcm90byI7CitvcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7CitvcHRpb24gb2JqY19jbGFzc19wcmVmaXggPSAiR1BCIjsKKworLy8gQSBEdXJhdGlvbiByZXByZXNlbnRzIGEgc2lnbmVkLCBmaXhlZC1sZW5ndGggc3BhbiBvZiB0aW1lIHJlcHJlc2VudGVkCisvLyBhcyBhIGNvdW50IG9mIHNlY29uZHMgYW5kIGZyYWN0aW9ucyBvZiBzZWNvbmRzIGF0IG5hbm9zZWNvbmQKKy8vIHJlc29sdXRpb24uIEl0IGlzIGluZGVwZW5kZW50IG9mIGFueSBjYWxlbmRhciBhbmQgY29uY2VwdHMgbGlrZSAiZGF5IgorLy8gb3IgIm1vbnRoIi4gSXQgaXMgcmVsYXRlZCB0byBUaW1lc3RhbXAgaW4gdGhhdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisvLyB0d28gVGltZXN0YW1wIHZhbHVlcyBpcyBhIER1cmF0aW9uIGFuZCBpdCBjYW4gYmUgYWRkZWQgb3Igc3VidHJhY3RlZAorLy8gZnJvbSBhIFRpbWVzdGFtcC4gUmFuZ2UgaXMgYXBwcm94aW1hdGVseSArLTEwLDAwMCB5ZWFycy4KKy8vCisvLyAjIEV4YW1wbGVzCisvLworLy8gRXhhbXBsZSAxOiBDb21wdXRlIER1cmF0aW9uIGZyb20gdHdvIFRpbWVzdGFtcHMgaW4gcHNldWRvIGNvZGUuCisvLworLy8gICAgIFRpbWVzdGFtcCBzdGFydCA9IC4uLjsKKy8vICAgICBUaW1lc3RhbXAgZW5kID0gLi4uOworLy8gICAgIER1cmF0aW9uIGR1cmF0aW9uID0gLi4uOworLy8KKy8vICAgICBkdXJhdGlvbi5zZWNvbmRzID0gZW5kLnNlY29uZHMgLSBzdGFydC5zZWNvbmRzOworLy8gICAgIGR1cmF0aW9uLm5hbm9zID0gZW5kLm5hbm9zIC0gc3RhcnQubmFub3M7CisvLworLy8gICAgIGlmIChkdXJhdGlvbi5zZWNvbmRzIDwgMCAmJiBkdXJhdGlvbi5uYW5vcyA+IDApIHsKKy8vICAgICAgIGR1cmF0aW9uLnNlY29uZHMgKz0gMTsKKy8vICAgICAgIGR1cmF0aW9uLm5hbm9zIC09IDEwMDAwMDAwMDA7CisvLyAgICAgfSBlbHNlIGlmIChkdXJhdGlvbi5zZWNvbmRzID4gMCAmJiBkdXJhdGlvbi5uYW5vcyA8IDApIHsKKy8vICAgICAgIGR1cmF0aW9uLnNlY29uZHMgLT0gMTsKKy8vICAgICAgIGR1cmF0aW9uLm5hbm9zICs9IDEwMDAwMDAwMDA7CisvLyAgICAgfQorLy8KKy8vIEV4YW1wbGUgMjogQ29tcHV0ZSBUaW1lc3RhbXAgZnJvbSBUaW1lc3RhbXAgKyBEdXJhdGlvbiBpbiBwc2V1ZG8gY29kZS4KKy8vCisvLyAgICAgVGltZXN0YW1wIHN0YXJ0ID0gLi4uOworLy8gICAgIER1cmF0aW9uIGR1cmF0aW9uID0gLi4uOworLy8gICAgIFRpbWVzdGFtcCBlbmQgPSAuLi47CisvLworLy8gICAgIGVuZC5zZWNvbmRzID0gc3RhcnQuc2Vjb25kcyArIGR1cmF0aW9uLnNlY29uZHM7CisvLyAgICAgZW5kLm5hbm9zID0gc3RhcnQubmFub3MgKyBkdXJhdGlvbi5uYW5vczsKKy8vCisvLyAgICAgaWYgKGVuZC5uYW5vcyA8IDApIHsKKy8vICAgICAgIGVuZC5zZWNvbmRzIC09IDE7CisvLyAgICAgICBlbmQubmFub3MgKz0gMTAwMDAwMDAwMDsKKy8vICAgICB9IGVsc2UgaWYgKGVuZC5uYW5vcyA+PSAxMDAwMDAwMDAwKSB7CisvLyAgICAgICBlbmQuc2Vjb25kcyArPSAxOworLy8gICAgICAgZW5kLm5hbm9zIC09IDEwMDAwMDAwMDA7CisvLyAgICAgfQorLy8KKy8vIEV4YW1wbGUgMzogQ29tcHV0ZSBEdXJhdGlvbiBmcm9tIGRhdGV0aW1lLnRpbWVkZWx0YSBpbiBQeXRob24uCisvLworLy8gICAgIHRkID0gZGF0ZXRpbWUudGltZWRlbHRhKGRheXM9MywgbWludXRlcz0xMCkKKy8vICAgICBkdXJhdGlvbiA9IER1cmF0aW9uKCkKKy8vICAgICBkdXJhdGlvbi5Gcm9tVGltZWRlbHRhKHRkKQorLy8KKy8vICMgSlNPTiBNYXBwaW5nCisvLworLy8gSW4gSlNPTiBmb3JtYXQsIHRoZSBEdXJhdGlvbiB0eXBlIGlzIGVuY29kZWQgYXMgYSBzdHJpbmcgcmF0aGVyIHRoYW4gYW4KKy8vIG9iamVjdCwgd2hlcmUgdGhlIHN0cmluZyBlbmRzIGluIHRoZSBzdWZmaXggInMiIChpbmRpY2F0aW5nIHNlY29uZHMpIGFuZAorLy8gaXMgcHJlY2VkZWQgYnkgdGhlIG51bWJlciBvZiBzZWNvbmRzLCB3aXRoIG5hbm9zZWNvbmRzIGV4cHJlc3NlZCBhcworLy8gZnJhY3Rpb25hbCBzZWNvbmRzLiBGb3IgZXhhbXBsZSwgMyBzZWNvbmRzIHdpdGggMCBuYW5vc2Vjb25kcyBzaG91bGQgYmUKKy8vIGVuY29kZWQgaW4gSlNPTiBmb3JtYXQgYXMgIjNzIiwgd2hpbGUgMyBzZWNvbmRzIGFuZCAxIG5hbm9zZWNvbmQgc2hvdWxkCisvLyBiZSBleHByZXNzZWQgaW4gSlNPTiBmb3JtYXQgYXMgIjMuMDAwMDAwMDAxcyIsIGFuZCAzIHNlY29uZHMgYW5kIDEKKy8vIG1pY3Jvc2Vjb25kIHNob3VsZCBiZSBleHByZXNzZWQgaW4gSlNPTiBmb3JtYXQgYXMgIjMuMDAwMDAxcyIuCisvLworLy8KK21lc3NhZ2UgRHVyYXRpb24geworICAvLyBTaWduZWQgc2Vjb25kcyBvZiB0aGUgc3BhbiBvZiB0aW1lLiBNdXN0IGJlIGZyb20gLTMxNSw1NzYsMDAwLDAwMAorICAvLyB0byArMzE1LDU3NiwwMDAsMDAwIGluY2x1c2l2ZS4gTm90ZTogdGhlc2UgYm91bmRzIGFyZSBjb21wdXRlZCBmcm9tOgorICAvLyA2MCBzZWMvbWluICogNjAgbWluL2hyICogMjQgaHIvZGF5ICogMzY1LjI1IGRheXMveWVhciAqIDEwMDAwIHllYXJzCisgIGludDY0IHNlY29uZHMgPSAxOworCisgIC8vIFNpZ25lZCBmcmFjdGlvbnMgb2YgYSBzZWNvbmQgYXQgbmFub3NlY29uZCByZXNvbHV0aW9uIG9mIHRoZSBzcGFuCisgIC8vIG9mIHRpbWUuIER1cmF0aW9ucyBsZXNzIHRoYW4gb25lIHNlY29uZCBhcmUgcmVwcmVzZW50ZWQgd2l0aCBhIDAKKyAgLy8gYHNlY29uZHNgIGZpZWxkIGFuZCBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGBuYW5vc2AgZmllbGQuIEZvciBkdXJhdGlvbnMKKyAgLy8gb2Ygb25lIHNlY29uZCBvciBtb3JlLCBhIG5vbi16ZXJvIHZhbHVlIGZvciB0aGUgYG5hbm9zYCBmaWVsZCBtdXN0IGJlCisgIC8vIG9mIHRoZSBzYW1lIHNpZ24gYXMgdGhlIGBzZWNvbmRzYCBmaWVsZC4gTXVzdCBiZSBmcm9tIC05OTksOTk5LDk5OQorICAvLyB0byArOTk5LDk5OSw5OTkgaW5jbHVzaXZlLgorICBpbnQzMiBuYW5vcyA9IDI7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTZjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5jYwpAQCAtMCwwICsxLDgyNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIER5bmFtaWNNZXNzYWdlIGlzIGltcGxlbWVudGVkIGJ5IGNvbnN0cnVjdGluZyBhIGRhdGEgc3RydWN0dXJlIHdoaWNoCisvLyBoYXMgcm91Z2hseSB0aGUgc2FtZSBtZW1vcnkgbGF5b3V0IGFzIGEgZ2VuZXJhdGVkIG1lc3NhZ2Ugd291bGQgaGF2ZS4KKy8vIFRoZW4sIHdlIHVzZSBSZWZsZWN0aW9uIHRvIGltcGxlbWVudCBvdXIgcmVmbGVjdGlvbiBpbnRlcmZhY2UuICBBbGwKKy8vIHRoZSBvdGhlciBvcGVyYXRpb25zIHdlIG5lZWQgdG8gaW1wbGVtZW50IChlLmcuICBwYXJzaW5nLCBjb3B5aW5nLAorLy8gZXRjLikgYXJlIGFscmVhZHkgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgUmVmbGVjdGlvbiwgc28gdGhlIHJlc3QgaXMKKy8vIGVhc3kuCisvLworLy8gVGhlIHVwIHNpZGUgb2YgdGhpcyBzdHJhdGVneSBpcyB0aGF0IGl0J3MgdmVyeSBlZmZpY2llbnQuICBXZSBkb24ndAorLy8gbmVlZCB0byB1c2UgaGFzaF9tYXBzIG9yIGdlbmVyaWMgcmVwcmVzZW50YXRpb25zIG9mIGZpZWxkcy4gIFRoZQorLy8gZG93biBzaWRlIGlzIHRoYXQgdGhpcyBpcyBhIGxvdy1sZXZlbCBtZW1vcnkgbWFuYWdlbWVudCBoYWNrIHdoaWNoCisvLyBjYW4gYmUgdHJpY2t5IHRvIGdldCByaWdodC4KKy8vCisvLyBBcyBtZW50aW9uZWQgaW4gdGhlIGhlYWRlciwgd2Ugb25seSBleHBvc2UgYSBEeW5hbWljTWVzc2FnZUZhY3RvcnkKKy8vIHB1YmxpY2x5LCBub3QgdGhlIER5bmFtaWNNZXNzYWdlIGNsYXNzIGl0c2VsZi4gIFRoaXMgaXMgYmVjYXVzZQorLy8gR2VuZXJpY01lc3NhZ2VSZWZsZWN0aW9uIHdhbnRzIHRvIGhhdmUgYSBwb2ludGVyIHRvIGEgImRlZmF1bHQiCisvLyBjb3B5IG9mIHRoZSBjbGFzcywgd2l0aCBhbGwgZmllbGRzIGluaXRpYWxpemVkIHRvIHRoZWlyIGRlZmF1bHQKKy8vIHZhbHVlcy4gIFdlIG9ubHkgd2FudCB0byBjb25zdHJ1Y3Qgb25lIG9mIHRoZXNlIHBlciBtZXNzYWdlIHR5cGUsCisvLyBzbyBEeW5hbWljTWVzc2FnZUZhY3Rvcnkgc3RvcmVzIGEgY2FjaGUgb2YgZGVmYXVsdCBtZXNzYWdlcyBmb3IKKy8vIGVhY2ggdHlwZSBpdCBzZWVzIChlYWNoIHVuaXF1ZSBEZXNjcmlwdG9yIHBvaW50ZXIpLiAgVGhlIGNvZGUKKy8vIHJlZmVycyB0byB0aGUgImRlZmF1bHQiIGNvcHkgb2YgdGhlIGNsYXNzIGFzIHRoZSAicHJvdG90eXBlIi4KKy8vCisvLyBOb3RlIG9uIG1lbW9yeSBhbGxvY2F0aW9uOiAgVGhpcyBtb2R1bGUgb2Z0ZW4gY2FsbHMgIm9wZXJhdG9yIG5ldygpIgorLy8gdG8gYWxsb2NhdGUgdW50eXBlZCBtZW1vcnksIHJhdGhlciB0aGFuIGNhbGxpbmcgc29tZXRoaW5nIGxpa2UKKy8vICJuZXcgdWludDhfdFtdIi4gIFRoaXMgaXMgYmVjYXVzZSAib3BlcmF0b3IgbmV3KCkiIG1lYW5zICJHaXZlIG1lIHNvbWUKKy8vIHNwYWNlIHdoaWNoIEkgY2FuIHVzZSBhcyBJIHBsZWFzZS4iIHdoaWxlICJuZXcgdWludDhfdFtdIiBtZWFucyAiR2l2ZQorLy8gbWUgYW4gYXJyYXkgb2YgOC1iaXQgaW50ZWdlcnMuIi4gIEluIHByYWN0aWNlLCB0aGUgbGF0ZXIgbWF5IHJldHVybgorLy8gYSBwb2ludGVyIHRoYXQgaXMgbm90IGFsaWduZWQgY29ycmVjdGx5IGZvciBnZW5lcmFsIHVzZS4gIEkgYmVsaWV2ZQorLy8gSXRlbSA4IG9mICJNb3JlIEVmZmVjdGl2ZSBDKysiIGRpc2N1c3NlcyB0aGlzIGluIG1vcmUgZGV0YWlsLCB0aG91Z2gKKy8vIEkgZG9uJ3QgaGF2ZSB0aGUgYm9vayBvbiBtZSByaWdodCBub3cgc28gSSdtIG5vdCBzdXJlLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF90eXBlX2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKwordXNpbmcgaW50ZXJuYWw6OkR5bmFtaWNNYXBGaWVsZDsKK3VzaW5nIGludGVybmFsOjpFeHRlbnNpb25TZXQ7Cit1c2luZyBpbnRlcm5hbDo6TWFwRmllbGQ7CisKKwordXNpbmcgaW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBTb21lIGhlbHBlciB0YWJsZXMgYW5kIGZ1bmN0aW9ucy4uLgorCituYW1lc3BhY2UgeworCitib29sIElzTWFwRmllbGRJbkFwaShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7IHJldHVybiBmaWVsZC0+aXNfbWFwKCk7IH0KKworLy8gU3luYyB3aXRoIGhlbHBlcnMuaC4KK2lubGluZSBib29sIEhhc0hhc2JpdChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIC8vIFRoaXMgcHJlZGljYXRlIGluY2x1ZGVzIHByb3RvMyBtZXNzYWdlIGZpZWxkcyBvbmx5IGlmIHRoZXkgaGF2ZSAib3B0aW9uYWwiLgorICAvLyAgIEZvbyBzdWJtc2cxID0gMTsgICAgICAgICAgIC8vIEhhc0hhc2JpdCgpID09IGZhbHNlCisgIC8vICAgb3B0aW9uYWwgRm9vIHN1Ym1zZzIgPSAyOyAgLy8gSGFzSGFzYml0KCkgPT0gdHJ1ZQorICAvLyBUaGlzIGlzIHNsaWdodGx5IG9kZCwgYXMgYWRkaW5nICJvcHRpb25hbCIgdG8gYSBzaW5ndWxhciBwcm90bzMgZmllbGQgZG9lcworICAvLyBub3QgY2hhbmdlIHRoZSBzZW1hbnRpY3Mgb3IgQVBJLiBIb3dldmVyIHdoZW5ldmVyIGFueSBmaWVsZCBpbiBhIG1lc3NhZ2UKKyAgLy8gaGFzIGEgaGFzYml0LCBpdCBmb3JjZXMgcmVmbGVjdGlvbiB0byBpbmNsdWRlIGhhc2JpdCBvZmZzZXRzIGZvciAqYWxsKgorICAvLyBmaWVsZHMsIGV2ZW4gaWYgYWxtb3N0IGFsbCBvZiB0aGVtIGFyZSBzZXQgdG8gLTEgKG5vIGhhc2JpdCkuIFNvIHRvIGF2b2lkCisgIC8vIGNhdXNpbmcgYSBzdWRkZW4gc2l6ZSByZWdyZXNzaW9uIGZvciB+YWxsIHByb3RvMyBtZXNzYWdlcywgd2UgZ2l2ZSBwcm90bzMKKyAgLy8gbWVzc2FnZSBmaWVsZHMgYSBoYXNiaXQgb25seSBpZiAib3B0aW9uYWwiIGlzIHByZXNlbnQuIElmIHRoZSB1c2VyIGlzCisgIC8vIGV4cGxpY2l0bHkgd3JpdGluZyAib3B0aW9uYWwiLCBpdCBpcyBsaWtlbHkgdGhleSBhcmUgd3JpdGluZyBpdCBvbgorICAvLyBwcmltaXRpdmUgZmllbGRzIGFsc28uCisgIHJldHVybiAoZmllbGQtPmhhc19vcHRpb25hbF9rZXl3b3JkKCkgfHwgZmllbGQtPmlzX3JlcXVpcmVkKCkpICYmCisgICAgICAgICAhZmllbGQtPm9wdGlvbnMoKS53ZWFrKCk7Cit9CisKK2lubGluZSBib29sIEluUmVhbE9uZW9mKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgJiYKKyAgICAgICAgICFmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpLT5pc19zeW50aGV0aWMoKTsKK30KKworLy8gQ29tcHV0ZSB0aGUgYnl0ZSBzaXplIG9mIHRoZSBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpZWxkLgoraW50IEZpZWxkU3BhY2VVc2VkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgdHlwZWRlZiBGaWVsZERlc2NyaXB0b3IgRkQ7ICAvLyBhdm9pZCBsaW5lIHdyYXBwaW5nCisgIGlmIChmaWVsZC0+bGFiZWwoKSA9PSBGRDo6TEFCRUxfUkVQRUFURUQpIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX0lOVDMyOgorICAgICAgICByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkRmllbGQ8aW50MzJfdD4pOworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgICAgcmV0dXJuIHNpemVvZihSZXBlYXRlZEZpZWxkPGludDY0X3Q+KTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgICByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkRmllbGQ8dWludDMyX3Q+KTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgICByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkRmllbGQ8dWludDY0X3Q+KTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkRmllbGQ8ZG91YmxlPik7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgICByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkRmllbGQ8ZmxvYXQ+KTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfQk9PTDoKKyAgICAgICAgcmV0dXJuIHNpemVvZihSZXBlYXRlZEZpZWxkPGJvb2w+KTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfRU5VTToKKyAgICAgICAgcmV0dXJuIHNpemVvZihSZXBlYXRlZEZpZWxkPGludD4pOworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgeworICAgICAgICAgIHJldHVybiBzaXplb2YoRHluYW1pY01hcEZpZWxkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4pOworICAgICAgICB9CisKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgICAgcmV0dXJuIHNpemVvZihpbnQzMl90KTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfSU5UNjQ6CisgICAgICAgIHJldHVybiBzaXplb2YoaW50NjRfdCk7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgcmV0dXJuIHNpemVvZih1aW50MzJfdCk7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgICAgcmV0dXJuIHNpemVvZih1aW50NjRfdCk7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX0RPVUJMRToKKyAgICAgICAgcmV0dXJuIHNpemVvZihkb3VibGUpOworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9GTE9BVDoKKyAgICAgICAgcmV0dXJuIHNpemVvZihmbG9hdCk7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX0JPT0w6CisgICAgICAgIHJldHVybiBzaXplb2YoYm9vbCk7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX0VOVU06CisgICAgICAgIHJldHVybiBzaXplb2YoaW50KTsKKworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICByZXR1cm4gc2l6ZW9mKE1lc3NhZ2UqKTsKKworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YoQXJlbmFTdHJpbmdQdHIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIDA7Cit9CisKK2lubGluZSBpbnQgRGl2aWRlUm91bmRpbmdVcChpbnQgaSwgaW50IGopIHsgcmV0dXJuIChpICsgKGogLSAxKSkgLyBqOyB9CisKK3N0YXRpYyBjb25zdCBpbnQga1NhZmVBbGlnbm1lbnQgPSBzaXplb2YodWludDY0X3QpOworc3RhdGljIGNvbnN0IGludCBrTWF4T25lb2ZVbmlvblNpemUgPSBzaXplb2YodWludDY0X3QpOworCitpbmxpbmUgaW50IEFsaWduVG8oaW50IG9mZnNldCwgaW50IGFsaWdubWVudCkgeworICByZXR1cm4gRGl2aWRlUm91bmRpbmdVcChvZmZzZXQsIGFsaWdubWVudCkgKiBhbGlnbm1lbnQ7Cit9CisKKy8vIFJvdW5kcyB0aGUgZ2l2ZW4gYnl0ZSBvZmZzZXQgdXAgdG8gdGhlIG5leHQgb2Zmc2V0IGFsaWduZWQgc3VjaCB0aGF0IGFueQorLy8gdHlwZSBtYXkgYmUgc3RvcmVkIGF0IGl0LgoraW5saW5lIGludCBBbGlnbk9mZnNldChpbnQgb2Zmc2V0KSB7IHJldHVybiBBbGlnblRvKG9mZnNldCwga1NhZmVBbGlnbm1lbnQpOyB9CisKKyNkZWZpbmUgYml0c2l6ZW9mKFQpIChzaXplb2YoVCkgKiA4KQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBEeW5hbWljTWVzc2FnZSA6IHB1YmxpYyBNZXNzYWdlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IER5bmFtaWNNZXNzYWdlKGNvbnN0IER5bmFtaWNNZXNzYWdlRmFjdG9yeTo6VHlwZUluZm8qIHR5cGVfaW5mbyk7CisKKyAgLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IEdldFByb3RvdHlwZU5vTG9jaygpIHRvIGF2b2lkIGRlYWQgbG9jay4KKyAgRHluYW1pY01lc3NhZ2UoRHluYW1pY01lc3NhZ2VGYWN0b3J5OjpUeXBlSW5mbyogdHlwZV9pbmZvLCBib29sIGxvY2tfZmFjdG9yeSk7CisKKyAgfkR5bmFtaWNNZXNzYWdlKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ2FsbGVkIG9uIHRoZSBwcm90b3R5cGUgYWZ0ZXIgY29uc3RydWN0aW9uIHRvIGluaXRpYWxpemUgbWVzc2FnZSBmaWVsZHMuCisgIC8vIENyb3NzIGxpbmtpbmcgdGhlIGRlZmF1bHQgaW5zdGFuY2VzIGFsbG93cyBmb3IgZmFzdCByZWZsZWN0aW9uIGFjY2VzcyBvZgorICAvLyB1bnNldCBtZXNzYWdlIGZpZWxkcy4gV2l0aG91dCBpdCB3ZSB3b3VsZCBoYXZlIHRvIGdvIHRvIHRoZSBNZXNzYWdlRmFjdG9yeQorICAvLyB0byBnZXQgdGhlIHByb3RvdHlwZSwgd2hpY2ggaXMgYSBtdWNoIG1vcmUgZXhwZW5zaXZlIG9wZXJhdGlvbi4KKyAgLy8KKyAgLy8gR2VuZXJhdGVkIG1lc3NhZ2VzIGRvIG5vdCBjcm9zcy1saW5rIHRvIGF2b2lkIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gb2YgdGhlCisgIC8vIGdsb2JhbCBpbnN0YW5jZXMuCisgIC8vIEluc3RlYWQsIHRoZXkga2VlcCB0aGUgZGVmYXVsdCBpbnN0YW5jZXMgaW4gdGhlIEZpZWxkRGVzY3JpcHRvciBvYmplY3RzLgorICB2b2lkIENyb3NzTGlua1Byb3RvdHlwZXMoKTsKKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIE1lc3NhZ2UqIE5ldyhBcmVuYSogYXJlbmEpIGNvbnN0IG92ZXJyaWRlOworCisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgTWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBvdmVycmlkZTsKKworI2lmIGRlZmluZWQoX19jcHBfbGliX2Rlc3Ryb3lpbmdfZGVsZXRlKSAmJiBkZWZpbmVkKF9fY3BwX3NpemVkX2RlYWxsb2NhdGlvbikKKyAgc3RhdGljIHZvaWQgb3BlcmF0b3IgZGVsZXRlKER5bmFtaWNNZXNzYWdlKiBtc2csIHN0ZDo6ZGVzdHJveWluZ19kZWxldGVfdCk7CisjZWxzZQorICAvLyBXZSBhY3R1YWxseSBhbGxvY2F0ZSBtb3JlIG1lbW9yeSB0aGFuIHNpemVvZigqdGhpcykgd2hlbiB0aGlzCisgIC8vIGNsYXNzJ3MgbWVtb3J5IGlzIGFsbG9jYXRlZCB2aWEgdGhlIGdsb2JhbCBvcGVyYXRvciBuZXcuIFRodXMsIHdlIG5lZWQgdG8KKyAgLy8gbWFudWFsbHkgY2FsbCB0aGUgZ2xvYmFsIG9wZXJhdG9yIGRlbGV0ZS4gQ2FsbGluZyB0aGUgZGVzdHJ1Y3RvciBpcyB0YWtlbgorICAvLyBjYXJlIG9mIGZvciB1cy4gVGhpcyBtYWtlcyBEeW5hbWljTWVzc2FnZSBjb21wYXRpYmxlIHdpdGggLWZzaXplZC1kZWxldGUuCisgIC8vIEl0IGRvZXNuJ3Qgd29yayBmb3IgTVNWQyB0aG91Z2guCisjaWZuZGVmIF9NU0NfVkVSCisgIHN0YXRpYyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBwdHIpIHsgOjpvcGVyYXRvciBkZWxldGUocHRyKTsgfQorI2VuZGlmICAvLyAhX01TQ19WRVIKKyNlbmRpZgorCisgcHJpdmF0ZToKKyAgRHluYW1pY01lc3NhZ2UoY29uc3QgRHluYW1pY01lc3NhZ2VGYWN0b3J5OjpUeXBlSW5mbyogdHlwZV9pbmZvLAorICAgICAgICAgICAgICAgICBBcmVuYSogYXJlbmEpOworCisgIHZvaWQgU2hhcmVkQ3Rvcihib29sIGxvY2tfZmFjdG9yeSk7CisKKyAgLy8gTmVlZGVkIHRvIGdldCB0aGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBtZXRhZGF0YSBtZW1iZXIuCisgIGZyaWVuZCBjbGFzcyBEeW5hbWljTWVzc2FnZUZhY3Rvcnk7CisKKyAgYm9vbCBpc19wcm90b3R5cGUoKSBjb25zdDsKKworICBpbmxpbmUgdm9pZCogT2Zmc2V0VG9Qb2ludGVyKGludCBvZmZzZXQpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4odGhpcykgKyBvZmZzZXQ7CisgIH0KKyAgaW5saW5lIGNvbnN0IHZvaWQqIE9mZnNldFRvUG9pbnRlcihpbnQgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRoaXMpICsgb2Zmc2V0OworICB9CisKKyAgdm9pZCogTXV0YWJsZVJhdyhpbnQgaSk7CisgIHZvaWQqIE11dGFibGVFeHRlbnNpb25zUmF3KCk7CisgIHZvaWQqIE11dGFibGVXZWFrRmllbGRNYXBSYXcoKTsKKyAgdm9pZCogTXV0YWJsZU9uZW9mQ2FzZVJhdyhpbnQgaSk7CisgIHZvaWQqIE11dGFibGVPbmVvZkZpZWxkUmF3KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZik7CisKKyAgY29uc3QgRHluYW1pY01lc3NhZ2VGYWN0b3J5OjpUeXBlSW5mbyogdHlwZV9pbmZvXzsKKyAgbXV0YWJsZSBzdGQ6OmF0b21pYzxpbnQ+IGNhY2hlZF9ieXRlX3NpemVfOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHluYW1pY01lc3NhZ2UpOworfTsKKworc3RydWN0IER5bmFtaWNNZXNzYWdlRmFjdG9yeTo6VHlwZUluZm8geworICBpbnQgc2l6ZTsKKyAgaW50IGhhc19iaXRzX29mZnNldDsKKyAgaW50IG9uZW9mX2Nhc2Vfb2Zmc2V0OworICBpbnQgZXh0ZW5zaW9uc19vZmZzZXQ7CisKKyAgLy8gTm90IG93bmVkIGJ5IHRoZSBUeXBlSW5mby4KKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5OyAgLy8gVGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVkIHRoaXMgb2JqZWN0LgorICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbDsgICAgICAvLyBUaGUgZmFjdG9yeSdzIERlc2NyaXB0b3JQb29sLgorICBjb25zdCBEZXNjcmlwdG9yKiB0eXBlOyAgICAgICAgICAvLyBUeXBlIG9mIHRoaXMgRHluYW1pY01lc3NhZ2UuCisKKyAgLy8gV2FybmluZzogIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGFyZSBkZWZpbmVkIGlzCisgIC8vICAgaW1wb3J0YW50ICh0aGUgcHJvdG90eXBlIG11c3QgYmUgZGVsZXRlZCAqYmVmb3JlKiB0aGUgb2Zmc2V0cykuCisgIHN0ZDo6dW5pcXVlX3B0cjx1aW50MzJfdFtdPiBvZmZzZXRzOworICBzdGQ6OnVuaXF1ZV9wdHI8dWludDMyX3RbXT4gaGFzX2JpdHNfaW5kaWNlczsKKyAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IFJlZmxlY3Rpb24+IHJlZmxlY3Rpb247CisgIC8vIERvbid0IHVzZSBhIHVuaXF1ZV9wdHIgdG8gaG9sZCB0aGUgcHJvdG90eXBlOiB0aGUgZGVzdHJ1Y3RvciBmb3IKKyAgLy8gRHluYW1pY01lc3NhZ2UgbmVlZHMgdG8ga25vdyB3aGV0aGVyIGl0IGlzIHRoZSBwcm90b3R5cGUsIGFuZCBkb2VzIHNvIGJ5CisgIC8vIGxvb2tpbmcgYmFjayBhdCB0aGlzIGZpZWxkLiBUaGlzIHdvdWxkIGFzc3VtZSBkZXRhaWxzIGFib3V0IHRoZQorICAvLyBpbXBsZW1lbnRhdGlvbiBvZiB1bmlxdWVfcHRyLgorICBjb25zdCBEeW5hbWljTWVzc2FnZSogcHJvdG90eXBlOworICBpbnQgd2Vha19maWVsZF9tYXBfb2Zmc2V0OyAgLy8gVGhlIG9mZnNldCBmb3IgdGhlIHdlYWtfZmllbGRfbWFwOworCisgIFR5cGVJbmZvKCkgOiBwcm90b3R5cGUobnVsbHB0cikge30KKworICB+VHlwZUluZm8oKSB7IGRlbGV0ZSBwcm90b3R5cGU7IH0KK307CisKK0R5bmFtaWNNZXNzYWdlOjpEeW5hbWljTWVzc2FnZShjb25zdCBEeW5hbWljTWVzc2FnZUZhY3Rvcnk6OlR5cGVJbmZvKiB0eXBlX2luZm8pCisgICAgOiB0eXBlX2luZm9fKHR5cGVfaW5mbyksIGNhY2hlZF9ieXRlX3NpemVfKDApIHsKKyAgU2hhcmVkQ3Rvcih0cnVlKTsKK30KKworRHluYW1pY01lc3NhZ2U6OkR5bmFtaWNNZXNzYWdlKGNvbnN0IER5bmFtaWNNZXNzYWdlRmFjdG9yeTo6VHlwZUluZm8qIHR5cGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmVuYSogYXJlbmEpCisgICAgOiBNZXNzYWdlKGFyZW5hKSwgdHlwZV9pbmZvXyh0eXBlX2luZm8pLCBjYWNoZWRfYnl0ZV9zaXplXygwKSB7CisgIFNoYXJlZEN0b3IodHJ1ZSk7Cit9CisKK0R5bmFtaWNNZXNzYWdlOjpEeW5hbWljTWVzc2FnZShEeW5hbWljTWVzc2FnZUZhY3Rvcnk6OlR5cGVJbmZvKiB0eXBlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NrX2ZhY3RvcnkpCisgICAgOiB0eXBlX2luZm9fKHR5cGVfaW5mbyksIGNhY2hlZF9ieXRlX3NpemVfKDApIHsKKyAgLy8gVGhlIHByb3RvdHlwZSBpbiB0eXBlX2luZm8gaGFzIHRvIGJlIHNldCBiZWZvcmUgY3JlYXRpbmcgdGhlIHByb3RvdHlwZQorICAvLyBpbnN0YW5jZSBvbiBtZW1vcnkuIGUuZy4sIG1lc3NhZ2UgRm9vIHsgbWFwPGludDMyX3QsIEZvbz4gYSA9IDE7IH0uIFdoZW4KKyAgLy8gY3JlYXRpbmcgcHJvdG90eXBlIGZvciBGb28sIHByb3RvdHlwZSBvZiB0aGUgbWFwIGVudHJ5IHdpbGwgYWxzbyBiZQorICAvLyBjcmVhdGVkLCB3aGljaCBuZWVkcyB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvdG90eXBlIG9mIEZvbyAodGhlIHZhbHVlIGluCisgIC8vIG1hcCkuIFRvIGJyZWFrIHRoZSBjeWNsaWMgZGVwZW5kZW5jeSwgd2UgaGF2ZSB0byBhc3NpZ24gdGhlIGFkZHJlc3Mgb2YKKyAgLy8gcHJvdG90eXBlIGludG8gdHlwZV9pbmZvIGZpcnN0LgorICB0eXBlX2luZm8tPnByb3RvdHlwZSA9IHRoaXM7CisgIFNoYXJlZEN0b3IobG9ja19mYWN0b3J5KTsKK30KKworaW5saW5lIHZvaWQqIER5bmFtaWNNZXNzYWdlOjpNdXRhYmxlUmF3KGludCBpKSB7CisgIHJldHVybiBPZmZzZXRUb1BvaW50ZXIodHlwZV9pbmZvXy0+b2Zmc2V0c1tpXSk7Cit9CitpbmxpbmUgdm9pZCogRHluYW1pY01lc3NhZ2U6Ok11dGFibGVFeHRlbnNpb25zUmF3KCkgeworICByZXR1cm4gT2Zmc2V0VG9Qb2ludGVyKHR5cGVfaW5mb18tPmV4dGVuc2lvbnNfb2Zmc2V0KTsKK30KK2lubGluZSB2b2lkKiBEeW5hbWljTWVzc2FnZTo6TXV0YWJsZVdlYWtGaWVsZE1hcFJhdygpIHsKKyAgcmV0dXJuIE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT53ZWFrX2ZpZWxkX21hcF9vZmZzZXQpOworfQoraW5saW5lIHZvaWQqIER5bmFtaWNNZXNzYWdlOjpNdXRhYmxlT25lb2ZDYXNlUmF3KGludCBpKSB7CisgIHJldHVybiBPZmZzZXRUb1BvaW50ZXIodHlwZV9pbmZvXy0+b25lb2ZfY2FzZV9vZmZzZXQgKyBzaXplb2YodWludDMyX3QpICogaSk7Cit9CitpbmxpbmUgdm9pZCogRHluYW1pY01lc3NhZ2U6Ok11dGFibGVPbmVvZkZpZWxkUmF3KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZikgeworICByZXR1cm4gT2Zmc2V0VG9Qb2ludGVyKHR5cGVfaW5mb18tPm9mZnNldHNbdHlwZV9pbmZvXy0+dHlwZS0+ZmllbGRfY291bnQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5jb250YWluaW5nX29uZW9mKCktPmluZGV4KCldKTsKK30KKwordm9pZCBEeW5hbWljTWVzc2FnZTo6U2hhcmVkQ3Rvcihib29sIGxvY2tfZmFjdG9yeSkgeworICAvLyBXZSBuZWVkIHRvIGNhbGwgY29uc3RydWN0b3JzIGZvciB2YXJpb3VzIGZpZWxkcyBtYW51YWxseSBhbmQgc2V0CisgIC8vIGRlZmF1bHQgdmFsdWVzIHdoZXJlIGFwcHJvcHJpYXRlLiAgV2UgdXNlIHBsYWNlbWVudCBuZXcgdG8gY2FsbAorICAvLyBjb25zdHJ1Y3RvcnMuICBJZiB5b3UgaGF2ZW4ndCBoZWFyZCBvZiBwbGFjZW1lbnQgbmV3LCBJIHN1Z2dlc3QgR29vZ2xpbmcKKyAgLy8gaXQgbm93LiAgV2UgdXNlIHBsYWNlbWVudCBuZXcgZXZlbiBmb3IgcHJpbWl0aXZlIHR5cGVzIHRoYXQgZG9uJ3QgaGF2ZQorICAvLyBjb25zdHJ1Y3RvcnMgZm9yIGNvbnNpc3RlbmN5LiAgKEluIHRoZW9yeSwgcGxhY2VtZW50IG5ldyBzaG91bGQgYmUgdXNlZAorICAvLyBhbnkgdGltZSB5b3UgYXJlIHRyeWluZyB0byBjb252ZXJ0IHVudHlwZWQgbWVtb3J5IHRvIHR5cGVkIG1lbW9yeSwgdGhvdWdoCisgIC8vIGluIHByYWN0aWNlIHRoYXQncyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGZvciB0eXBlcyB0aGF0IGRvbid0IGhhdmUgYQorICAvLyBjb25zdHJ1Y3Rvci4pCisKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IHR5cGVfaW5mb18tPnR5cGU7CisgIC8vIEluaXRpYWxpemUgb25lb2YgY2FzZXMuCisgIGludCBvbmVvZl9jb3VudCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+b25lb2ZfZGVjbF9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoZGVzY3JpcHRvci0+b25lb2ZfZGVjbChpKS0+aXNfc3ludGhldGljKCkpIGNvbnRpbnVlOworICAgIG5ldyAoTXV0YWJsZU9uZW9mQ2FzZVJhdyhvbmVvZl9jb3VudCsrKSkgdWludDMyX3R7MH07CisgIH0KKworICBpZiAodHlwZV9pbmZvXy0+ZXh0ZW5zaW9uc19vZmZzZXQgIT0gLTEpIHsKKyAgICBuZXcgKE11dGFibGVFeHRlbnNpb25zUmF3KCkpIEV4dGVuc2lvblNldChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvci0+ZmllbGQoaSk7CisgICAgdm9pZCogZmllbGRfcHRyID0gTXV0YWJsZVJhdyhpKTsKKyAgICBpZiAoSW5SZWFsT25lb2YoZmllbGQpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShDUFBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbmV3IChmaWVsZF9wdHIpIFRZUEUoZmllbGQtPmRlZmF1bHRfdmFsdWVfIyNUWVBFKCkpOyAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG5ldyAoZmllbGRfcHRyKSBSZXBlYXRlZEZpZWxkPFRZUEU+KEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnJlYWs7CisKKyAgICAgIEhBTkRMRV9UWVBFKElOVDMyLCBpbnQzMl90KTsKKyAgICAgIEhBTkRMRV9UWVBFKElOVDY0LCBpbnQ2NF90KTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgdWludDMyX3QpOworICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjRfdCk7CisgICAgICBIQU5ETEVfVFlQRShET1VCTEUsIGRvdWJsZSk7CisgICAgICBIQU5ETEVfVFlQRShGTE9BVCwgZmxvYXQpOworICAgICAgSEFORExFX1RZUEUoQk9PTCwgYm9vbCk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICAgIG5ldyAoZmllbGRfcHRyKSBpbnR7ZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKX07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmV3IChmaWVsZF9wdHIpIFJlcGVhdGVkRmllbGQ8aW50PihHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICAgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICAgICAgICBBcmVuYVN0cmluZ1B0ciogYXNwID0gbmV3IChmaWVsZF9wdHIpIEFyZW5hU3RyaW5nUHRyKCk7CisgICAgICAgICAgICAgIGFzcC0+SW5pdERlZmF1bHQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIG5ldyAoZmllbGRfcHRyKQorICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4oR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6IHsKKyAgICAgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICAgIG5ldyAoZmllbGRfcHRyKSBNZXNzYWdlKihudWxscHRyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgeworICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBsb2NrIGluIG1vc3QgY2FzZXMgdG8gYXZvaWQgZGF0YSByYWNpbmcuIE9ubHkgbm90IGxvY2sKKyAgICAgICAgICAgIC8vIHdoZW4gdGhlIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCBpbnNpZGUgR2V0UHJvdG90eXBlKCksIGluIHdoaWNoCisgICAgICAgICAgICAvLyBjYXNlIHdlIGhhdmUgYWxyZWFkeSBsb2NrZWQgdGhlIGZhY3RvcnkuCisgICAgICAgICAgICBpZiAobG9ja19mYWN0b3J5KSB7CisgICAgICAgICAgICAgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbmV3IChmaWVsZF9wdHIpIER5bmFtaWNNYXBGaWVsZCgKKyAgICAgICAgICAgICAgICAgICAgdHlwZV9pbmZvXy0+ZmFjdG9yeS0+R2V0UHJvdG90eXBlKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSksCisgICAgICAgICAgICAgICAgICAgIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAvLyBOZWVkcyB0byBkZXN0cm95IHRoZSBtdXRleCBtZW1iZXIuCisgICAgICAgICAgICAgICAgICBHZXRPd25pbmdBcmVuYSgpLT5Pd25EZXN0cnVjdG9yKAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PER5bmFtaWNNYXBGaWVsZCo+KGZpZWxkX3B0cikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXcgKGZpZWxkX3B0cikgRHluYW1pY01hcEZpZWxkKAorICAgICAgICAgICAgICAgICAgICB0eXBlX2luZm9fLT5mYWN0b3J5LT5HZXRQcm90b3R5cGUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbmV3IChmaWVsZF9wdHIpCisgICAgICAgICAgICAgICAgICAgIER5bmFtaWNNYXBGaWVsZCh0eXBlX2luZm9fLT5mYWN0b3J5LT5HZXRQcm90b3R5cGVOb0xvY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAvLyBOZWVkcyB0byBkZXN0cm95IHRoZSBtdXRleCBtZW1iZXIuCisgICAgICAgICAgICAgICAgICBHZXRPd25pbmdBcmVuYSgpLT5Pd25EZXN0cnVjdG9yKAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PER5bmFtaWNNYXBGaWVsZCo+KGZpZWxkX3B0cikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXcgKGZpZWxkX3B0cikKKyAgICAgICAgICAgICAgICAgICAgRHluYW1pY01hcEZpZWxkKHR5cGVfaW5mb18tPmZhY3RvcnktPkdldFByb3RvdHlwZU5vTG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5tZXNzYWdlX3R5cGUoKSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ldyAoZmllbGRfcHRyKSBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2Jvb2wgRHluYW1pY01lc3NhZ2U6OmlzX3Byb3RvdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHR5cGVfaW5mb18tPnByb3RvdHlwZSA9PSB0aGlzIHx8CisgICAgICAgICAvLyBJZiB0eXBlX2luZm9fLT5wcm90b3R5cGUgaXMgbnVsbHB0ciwgdGhlbiB3ZSBtdXN0IGJlIGNvbnN0cnVjdGluZworICAgICAgICAgLy8gdGhlIHByb3RvdHlwZSBub3csIHdoaWNoIG1lYW5zIHdlIG11c3QgYmUgdGhlIHByb3RvdHlwZS4KKyAgICAgICAgIHR5cGVfaW5mb18tPnByb3RvdHlwZSA9PSBudWxscHRyOworfQorCisjaWYgZGVmaW5lZChfX2NwcF9saWJfZGVzdHJveWluZ19kZWxldGUpICYmIGRlZmluZWQoX19jcHBfc2l6ZWRfZGVhbGxvY2F0aW9uKQordm9pZCBEeW5hbWljTWVzc2FnZTo6b3BlcmF0b3IgZGVsZXRlKER5bmFtaWNNZXNzYWdlKiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpkZXN0cm95aW5nX2RlbGV0ZV90KSB7CisgIGNvbnN0IHNpemVfdCBzaXplID0gbXNnLT50eXBlX2luZm9fLT5zaXplOworICBtc2ctPn5EeW5hbWljTWVzc2FnZSgpOworICA6Om9wZXJhdG9yIGRlbGV0ZShtc2csIHNpemUpOworfQorI2VuZGlmCisKK0R5bmFtaWNNZXNzYWdlOjp+RHluYW1pY01lc3NhZ2UoKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSB0eXBlX2luZm9fLT50eXBlOworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlPFVua25vd25GaWVsZFNldD4oKTsKKworICBpZiAodHlwZV9pbmZvXy0+ZXh0ZW5zaW9uc19vZmZzZXQgIT0gLTEpIHsKKyAgICByZWludGVycHJldF9jYXN0PEV4dGVuc2lvblNldCo+KE11dGFibGVFeHRlbnNpb25zUmF3KCkpLT5+RXh0ZW5zaW9uU2V0KCk7CisgIH0KKworICAvLyBXZSBuZWVkIHRvIG1hbnVhbGx5IHJ1biB0aGUgZGVzdHJ1Y3RvcnMgZm9yIHJlcGVhdGVkIGZpZWxkcyBhbmQgc3RyaW5ncywKKyAgLy8ganVzdCBhcyB3ZSByYW4gdGhlaXIgY29uc3RydWN0b3JzIGluIHRoZSBEeW5hbWljTWVzc2FnZSBjb25zdHJ1Y3Rvci4KKyAgLy8gV2UgYWxzbyBuZWVkIHRvIG1hbnVhbGx5IGRlbGV0ZSBvbmVvZiBmaWVsZHMgaWYgaXQgaXMgc2V0IGFuZCBpcyBzdHJpbmcKKyAgLy8gb3IgbWVzc2FnZS4KKyAgLy8gQWRkaXRpb25hbGx5LCBpZiBhbnkgc2luZ3VsYXIgZW1iZWRkZWQgbWVzc2FnZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCwgd2UKKyAgLy8gbmVlZCB0byBkZWxldGUgdGhlbSwgVU5MRVNTIHdlIGFyZSB0aGUgcHJvdG90eXBlIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlLAorICAvLyBpbiB3aGljaCBjYXNlIGFueSBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgb3RoZXIgcHJvdG90eXBlcyBhbmQgc2hvdWxkbid0CisgIC8vIGJlIHRvdWNoZWQuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3ItPmZpZWxkKGkpOworICAgIGlmIChJblJlYWxPbmVvZihmaWVsZCkpIHsKKyAgICAgIHZvaWQqIGZpZWxkX3B0ciA9IE11dGFibGVPbmVvZkNhc2VSYXcoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKS0+aW5kZXgoKSk7CisgICAgICBpZiAoKihyZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QqPihmaWVsZF9wdHIpKSA9PSBmaWVsZC0+bnVtYmVyKCkpIHsKKyAgICAgICAgZmllbGRfcHRyID0gTXV0YWJsZU9uZW9mRmllbGRSYXcoZmllbGQpOworICAgICAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORykgeworICAgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzogeworICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFyZW5hU3RyaW5nUHRyKj4oZmllbGRfcHRyKS0+RGVzdHJveSgpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgICAgICAgIGRlbGV0ZSAqcmVpbnRlcnByZXRfY2FzdDxNZXNzYWdlKio+KGZpZWxkX3B0cik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB2b2lkKiBmaWVsZF9wdHIgPSBNdXRhYmxlUmF3KGkpOworCisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgXAorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRGaWVsZDxMT1dFUkNBU0U+Kj4oZmllbGRfcHRyKSBcCisgICAgICAgIC0+flJlcGVhdGVkRmllbGQ8TE9XRVJDQVNFPigpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhaworCisgICAgICAgIEhBTkRMRV9UWVBFKElOVDMyLCBpbnQzMl90KTsKKyAgICAgICAgSEFORExFX1RZUEUoSU5UNjQsIGludDY0X3QpOworICAgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMl90KTsKKyAgICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjRfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlKTsKKyAgICAgICAgSEFORExFX1RZUEUoRkxPQVQsIGZsb2F0KTsKKyAgICAgICAgSEFORExFX1RZUEUoQk9PTCwgYm9vbCk7CisgICAgICAgIEhBTkRMRV9UWVBFKEVOVU0sIGludCk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPio+KGZpZWxkX3B0cikKKyAgICAgICAgICAgICAgICAgIC0+flJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PER5bmFtaWNNYXBGaWVsZCo+KGZpZWxkX3B0ciktPn5EeW5hbWljTWFwRmllbGQoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+Kj4oZmllbGRfcHRyKQorICAgICAgICAgICAgICAgIC0+flJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4oKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7CisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBcmVuYVN0cmluZ1B0cio+KGZpZWxkX3B0ciktPkRlc3Ryb3koKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgICAgICBpZiAoIWlzX3Byb3RvdHlwZSgpKSB7CisgICAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UgPSAqcmVpbnRlcnByZXRfY2FzdDxNZXNzYWdlKio+KGZpZWxkX3B0cik7CisgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICBkZWxldGUgbWVzc2FnZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIER5bmFtaWNNZXNzYWdlOjpDcm9zc0xpbmtQcm90b3R5cGVzKCkgeworICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiB0aGUgcHJvdG90eXBlIG1lc3NhZ2UuCisgIEdPT0dMRV9DSEVDSyhpc19wcm90b3R5cGUoKSk7CisKKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gdHlwZV9pbmZvXy0+ZmFjdG9yeTsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IHR5cGVfaW5mb18tPnR5cGU7CisKKyAgLy8gQ3Jvc3MtbGluayBkZWZhdWx0IG1lc3NhZ2VzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yLT5maWVsZChpKTsKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UgJiYKKyAgICAgICAgIWZpZWxkLT5vcHRpb25zKCkud2VhaygpICYmICFJblJlYWxPbmVvZihmaWVsZCkgJiYKKyAgICAgICAgIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICB2b2lkKiBmaWVsZF9wdHIgPSBNdXRhYmxlUmF3KGkpOworICAgICAgLy8gRm9yIGZpZWxkcyB3aXRoIG1lc3NhZ2UgdHlwZXMsIHdlIG5lZWQgdG8gY3Jvc3MtbGluayB3aXRoIHRoZQorICAgICAgLy8gcHJvdG90eXBlIGZvciB0aGUgZmllbGQncyB0eXBlLgorICAgICAgLy8gRm9yIHNpbmd1bGFyIGZpZWxkcywgdGhlIGZpZWxkIGlzIGp1c3QgYSBwb2ludGVyIHdoaWNoIHNob3VsZAorICAgICAgLy8gcG9pbnQgdG8gdGhlIHByb3RvdHlwZS4KKyAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IE1lc3NhZ2UqKj4oZmllbGRfcHRyKSA9CisgICAgICAgICAgZmFjdG9yeS0+R2V0UHJvdG90eXBlTm9Mb2NrKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSk7CisgICAgfQorICB9Cit9CisKK01lc3NhZ2UqIER5bmFtaWNNZXNzYWdlOjpOZXcoQXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIGlmIChhcmVuYSAhPSBudWxscHRyKSB7CisgICAgdm9pZCogbmV3X2Jhc2UgPSBBcmVuYTo6Q3JlYXRlQXJyYXk8Y2hhcj4oYXJlbmEsIHR5cGVfaW5mb18tPnNpemUpOworICAgIG1lbXNldChuZXdfYmFzZSwgMCwgdHlwZV9pbmZvXy0+c2l6ZSk7CisgICAgcmV0dXJuIG5ldyAobmV3X2Jhc2UpIER5bmFtaWNNZXNzYWdlKHR5cGVfaW5mb18sIGFyZW5hKTsKKyAgfSBlbHNlIHsKKyAgICB2b2lkKiBuZXdfYmFzZSA9IG9wZXJhdG9yIG5ldyh0eXBlX2luZm9fLT5zaXplKTsKKyAgICBtZW1zZXQobmV3X2Jhc2UsIDAsIHR5cGVfaW5mb18tPnNpemUpOworICAgIHJldHVybiBuZXcgKG5ld19iYXNlKSBEeW5hbWljTWVzc2FnZSh0eXBlX2luZm9fKTsKKyAgfQorfQorCitpbnQgRHluYW1pY01lc3NhZ2U6OkdldENhY2hlZFNpemUoKSBjb25zdCB7CisgIHJldHVybiBjYWNoZWRfYnl0ZV9zaXplXy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworfQorCit2b2lkIER5bmFtaWNNZXNzYWdlOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIGNhY2hlZF9ieXRlX3NpemVfLnN0b3JlKHNpemUsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworfQorCitNZXRhZGF0YSBEeW5hbWljTWVzc2FnZTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIE1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gdHlwZV9pbmZvXy0+dHlwZTsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IHR5cGVfaW5mb18tPnJlZmxlY3Rpb24uZ2V0KCk7CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitEeW5hbWljTWVzc2FnZUZhY3Rvcnk6OkR5bmFtaWNNZXNzYWdlRmFjdG9yeSgpCisgICAgOiBwb29sXyhudWxscHRyKSwgZGVsZWdhdGVfdG9fZ2VuZXJhdGVkX2ZhY3RvcnlfKGZhbHNlKSB7fQorCitEeW5hbWljTWVzc2FnZUZhY3Rvcnk6OkR5bmFtaWNNZXNzYWdlRmFjdG9yeShjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCkKKyAgICA6IHBvb2xfKHBvb2wpLCBkZWxlZ2F0ZV90b19nZW5lcmF0ZWRfZmFjdG9yeV8oZmFsc2UpIHt9CisKK0R5bmFtaWNNZXNzYWdlRmFjdG9yeTo6fkR5bmFtaWNNZXNzYWdlRmFjdG9yeSgpIHsKKyAgZm9yIChhdXRvIGl0ZXIgPSBwcm90b3R5cGVzXy5iZWdpbigpOyBpdGVyICE9IHByb3RvdHlwZXNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBkZWxldGUgaXRlci0+c2Vjb25kOworICB9Cit9CisKK2NvbnN0IE1lc3NhZ2UqIER5bmFtaWNNZXNzYWdlRmFjdG9yeTo6R2V0UHJvdG90eXBlKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpIHsKKyAgTXV0ZXhMb2NrIGxvY2soJnByb3RvdHlwZXNfbXV0ZXhfKTsKKyAgcmV0dXJuIEdldFByb3RvdHlwZU5vTG9jayh0eXBlKTsKK30KKworY29uc3QgTWVzc2FnZSogRHluYW1pY01lc3NhZ2VGYWN0b3J5OjpHZXRQcm90b3R5cGVOb0xvY2soCisgICAgY29uc3QgRGVzY3JpcHRvciogdHlwZSkgeworICBpZiAoZGVsZWdhdGVfdG9fZ2VuZXJhdGVkX2ZhY3RvcnlfICYmCisgICAgICB0eXBlLT5maWxlKCktPnBvb2woKSA9PSBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSkgeworICAgIHJldHVybiBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKS0+R2V0UHJvdG90eXBlKHR5cGUpOworICB9CisKKyAgY29uc3QgVHlwZUluZm8qKiB0YXJnZXQgPSAmcHJvdG90eXBlc19bdHlwZV07CisgIGlmICgqdGFyZ2V0ICE9IG51bGxwdHIpIHsKKyAgICAvLyBBbHJlYWR5IGV4aXN0cy4KKyAgICByZXR1cm4gKCp0YXJnZXQpLT5wcm90b3R5cGU7CisgIH0KKworICBUeXBlSW5mbyogdHlwZV9pbmZvID0gbmV3IFR5cGVJbmZvOworICAqdGFyZ2V0ID0gdHlwZV9pbmZvOworCisgIHR5cGVfaW5mby0+dHlwZSA9IHR5cGU7CisgIHR5cGVfaW5mby0+cG9vbCA9IChwb29sXyA9PSBudWxscHRyKSA/IHR5cGUtPmZpbGUoKS0+cG9vbCgpIDogcG9vbF87CisgIHR5cGVfaW5mby0+ZmFjdG9yeSA9IHRoaXM7CisKKyAgLy8gV2UgbmVlZCB0byBjb25zdHJ1Y3QgYWxsIHRoZSBzdHJ1Y3R1cmVzIHBhc3NlZCB0byBSZWZsZWN0aW9uJ3MgY29uc3RydWN0b3IuCisgIC8vIFRoaXMgaW5jbHVkZXM6CisgIC8vIC0gQSBibG9jayBvZiBtZW1vcnkgdGhhdCBjb250YWlucyBzcGFjZSBmb3IgYWxsIHRoZSBtZXNzYWdlJ3MgZmllbGRzLgorICAvLyAtIEFuIGFycmF5IG9mIGludGVnZXJzIGluZGljYXRpbmcgdGhlIGJ5dGUgb2Zmc2V0IG9mIGVhY2ggZmllbGQgd2l0aGluCisgIC8vICAgdGhpcyBibG9jay4KKyAgLy8gLSBBIGJpZyBiaXRmaWVsZCBjb250YWluaW5nIGEgYml0IGZvciBlYWNoIGZpZWxkIGluZGljYXRpbmcgd2hldGhlcgorICAvLyAgIG9yIG5vdCB0aGF0IGZpZWxkIGlzIHNldC4KKyAgaW50IHJlYWxfb25lb2ZfY291bnQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKCF0eXBlLT5vbmVvZl9kZWNsKGkpLT5pc19zeW50aGV0aWMoKSkgeworICAgICAgcmVhbF9vbmVvZl9jb3VudCsrOworICAgIH0KKyAgfQorCisgIC8vIENvbXB1dGUgc2l6ZSBhbmQgb2Zmc2V0cy4KKyAgdWludDMyX3QqIG9mZnNldHMgPSBuZXcgdWludDMyX3RbdHlwZS0+ZmllbGRfY291bnQoKSArIHJlYWxfb25lb2ZfY291bnRdOworICB0eXBlX2luZm8tPm9mZnNldHMucmVzZXQob2Zmc2V0cyk7CisKKyAgLy8gRGVjaWRlIGFsbCBmaWVsZCBvZmZzZXRzIGJ5IHBhY2tpbmcgaW4gb3JkZXIuCisgIC8vIFdlIHBsYWNlIHRoZSBEeW5hbWljTWVzc2FnZSBvYmplY3QgaXRzZWxmIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFsbG9jYXRlZAorICAvLyBzcGFjZS4KKyAgaW50IHNpemUgPSBzaXplb2YoRHluYW1pY01lc3NhZ2UpOworICBzaXplID0gQWxpZ25PZmZzZXQoc2l6ZSk7CisKKyAgLy8gTmV4dCB0aGUgaGFzX2JpdHMsIHdoaWNoIGlzIGFuIGFycmF5IG9mIHVpbnQzMnMuCisgIHR5cGVfaW5mby0+aGFzX2JpdHNfb2Zmc2V0ID0gLTE7CisgIGludCBtYXhfaGFzYml0ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoSGFzSGFzYml0KHR5cGUtPmZpZWxkKGkpKSkgeworICAgICAgaWYgKHR5cGVfaW5mby0+aGFzX2JpdHNfb2Zmc2V0ID09IC0xKSB7CisgICAgICAgIC8vIEF0IGxlYXN0IG9uZSBmaWVsZCBpbiB0aGUgbWVzc2FnZSByZXF1aXJlcyBhIGhhc2JpdCwgc28gYWxsb2NhdGUKKyAgICAgICAgLy8gaGFzYml0cy4KKyAgICAgICAgdHlwZV9pbmZvLT5oYXNfYml0c19vZmZzZXQgPSBzaXplOworICAgICAgICB1aW50MzJfdCogaGFzX2JpdHNfaW5kaWNlcyA9IG5ldyB1aW50MzJfdFt0eXBlLT5maWVsZF9jb3VudCgpXTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlLT5maWVsZF9jb3VudCgpOyBqKyspIHsKKyAgICAgICAgICAvLyBJbml0aWFsaXplIHRvIC0xLCBmaWVsZHMgdGhhdCBuZWVkIGEgaGFzYml0IHdpbGwgb3ZlcndyaXRlLgorICAgICAgICAgIGhhc19iaXRzX2luZGljZXNbal0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLTEpOworICAgICAgICB9CisgICAgICAgIHR5cGVfaW5mby0+aGFzX2JpdHNfaW5kaWNlcy5yZXNldChoYXNfYml0c19pbmRpY2VzKTsKKyAgICAgIH0KKyAgICAgIHR5cGVfaW5mby0+aGFzX2JpdHNfaW5kaWNlc1tpXSA9IG1heF9oYXNiaXQrKzsKKyAgICB9CisgIH0KKworICBpZiAobWF4X2hhc2JpdCA+IDApIHsKKyAgICBpbnQgaGFzX2JpdHNfYXJyYXlfc2l6ZSA9IERpdmlkZVJvdW5kaW5nVXAobWF4X2hhc2JpdCwgYml0c2l6ZW9mKHVpbnQzMl90KSk7CisgICAgc2l6ZSArPSBoYXNfYml0c19hcnJheV9zaXplICogc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBzaXplID0gQWxpZ25PZmZzZXQoc2l6ZSk7CisgIH0KKworICAvLyBUaGUgb25lb2ZfY2FzZSwgaWYgYW55LiBJdCBpcyBhbiBhcnJheSBvZiB1aW50MzJzLgorICBpZiAocmVhbF9vbmVvZl9jb3VudCA+IDApIHsKKyAgICB0eXBlX2luZm8tPm9uZW9mX2Nhc2Vfb2Zmc2V0ID0gc2l6ZTsKKyAgICBzaXplICs9IHJlYWxfb25lb2ZfY291bnQgKiBzaXplb2YodWludDMyX3QpOworICAgIHNpemUgPSBBbGlnbk9mZnNldChzaXplKTsKKyAgfQorCisgIC8vIFRoZSBFeHRlbnNpb25TZXQsIGlmIGFueS4KKyAgaWYgKHR5cGUtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIHR5cGVfaW5mby0+ZXh0ZW5zaW9uc19vZmZzZXQgPSBzaXplOworICAgIHNpemUgKz0gc2l6ZW9mKEV4dGVuc2lvblNldCk7CisgICAgc2l6ZSA9IEFsaWduT2Zmc2V0KHNpemUpOworICB9IGVsc2UgeworICAgIC8vIE5vIGV4dGVuc2lvbnMuCisgICAgdHlwZV9pbmZvLT5leHRlbnNpb25zX29mZnNldCA9IC0xOworICB9CisKKyAgLy8gQWxsIHRoZSBmaWVsZHMuCisgIC8vCisgIC8vIFRPRE8oYi8zMTIyNjI2OSk6ICBPcHRpbWl6ZSB0aGUgb3JkZXIgb2YgZmllbGRzIHRvIG1pbmltaXplIHBhZGRpbmcuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgLy8gTWFrZSBzdXJlIGZpZWxkIGlzIGFsaWduZWQgdG8gYXZvaWQgYnVzIGVycm9ycy4KKyAgICAvLyBPbmVvZiBmaWVsZHMgZG8gbm90IHVzZSBhbnkgc3BhY2UuCisgICAgaWYgKCFJblJlYWxPbmVvZih0eXBlLT5maWVsZChpKSkpIHsKKyAgICAgIGludCBmaWVsZF9zaXplID0gRmllbGRTcGFjZVVzZWQodHlwZS0+ZmllbGQoaSkpOworICAgICAgc2l6ZSA9IEFsaWduVG8oc2l6ZSwgc3RkOjptaW4oa1NhZmVBbGlnbm1lbnQsIGZpZWxkX3NpemUpKTsKKyAgICAgIG9mZnNldHNbaV0gPSBzaXplOworICAgICAgc2l6ZSArPSBmaWVsZF9zaXplOworICAgIH0KKyAgfQorCisgIC8vIFRoZSBvbmVvZnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS0+b25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoIXR5cGUtPm9uZW9mX2RlY2woaSktPmlzX3N5bnRoZXRpYygpKSB7CisgICAgICBzaXplID0gQWxpZ25UbyhzaXplLCBrU2FmZUFsaWdubWVudCk7CisgICAgICBvZmZzZXRzW3R5cGUtPmZpZWxkX2NvdW50KCkgKyBpXSA9IHNpemU7CisgICAgICBzaXplICs9IGtNYXhPbmVvZlVuaW9uU2l6ZTsKKyAgICB9CisgIH0KKworICB0eXBlX2luZm8tPndlYWtfZmllbGRfbWFwX29mZnNldCA9IC0xOworCisgIC8vIEFsaWduIHRoZSBmaW5hbCBzaXplIHRvIG1ha2Ugc3VyZSBubyBjbGV2ZXIgYWxsb2NhdG9ycyB0aGluayB0aGF0CisgIC8vIGFsaWdubWVudCBpcyBub3QgbmVjZXNzYXJ5LgorICB0eXBlX2luZm8tPnNpemUgPSBzaXplOworCisgIC8vIENvbnN0cnVjdCB0aGUgcmVmbGVjdGlvbiBvYmplY3QuCisKKyAgLy8gQ29tcHV0ZSB0aGUgc2l6ZSBvZiBkZWZhdWx0IG9uZW9mIGluc3RhbmNlIGFuZCBvZmZzZXRzIG9mIGRlZmF1bHQKKyAgLy8gb25lb2YgZmllbGRzLgorICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKHR5cGUtPm9uZW9mX2RlY2woaSktPmlzX3N5bnRoZXRpYygpKSBjb250aW51ZTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHR5cGUtPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IHR5cGUtPm9uZW9mX2RlY2woaSktPmZpZWxkKGopOworICAgICAgLy8gb25lb2YgZmllbGRzIGFyZSBub3QgYWNjZXNzZWQgdGhyb3VnaCBvZmZzZXRzLCBidXQgd2Ugc3RpbGwgaGF2ZSB0aGUKKyAgICAgIC8vIGVudHJ5IGZyb20gYSBsZWdhY3kgaW1wbGVtZW50YXRpb24uIFRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgYXQgc29tZQorICAgICAgLy8gcG9pbnQuCisgICAgICAvLyBNYXJrIHRoZSBmaWVsZCB0byBwcmV2ZW50IHVuaW50ZW50aW9uYWwgYWNjZXNzIHRocm91Z2ggcmVmbGVjdGlvbi4KKyAgICAgIC8vIERvbid0IHVzZSB0aGUgdG9wIGJpdCBiZWNhdXNlIHRoYXQgaXMgZm9yIHVudXNlZCBmaWVsZHMuCisgICAgICBvZmZzZXRzW2ZpZWxkLT5pbmRleCgpXSA9IGludGVybmFsOjprSW52YWxpZEZpZWxkT2Zmc2V0VGFnOworICAgIH0KKyAgfQorCisgIC8vIEFsbG9jYXRlIHRoZSBwcm90b3R5cGUgZmllbGRzLgorICB2b2lkKiBiYXNlID0gb3BlcmF0b3IgbmV3KHNpemUpOworICBtZW1zZXQoYmFzZSwgMCwgc2l6ZSk7CisKKyAgLy8gV2UgaGF2ZSBhbHJlYWR5IGxvY2tlZCB0aGUgZmFjdG9yeSBzbyB3ZSBzaG91bGQgbm90IGxvY2sgaW4gdGhlIGNvbnN0cnVjdG9yCisgIC8vIG9mIGR5bmFtaWMgbWVzc2FnZSB0byBhdm9pZCBkZWFkIGxvY2suCisgIER5bmFtaWNNZXNzYWdlKiBwcm90b3R5cGUgPSBuZXcgKGJhc2UpIER5bmFtaWNNZXNzYWdlKHR5cGVfaW5mbywgZmFsc2UpOworCisgIGludGVybmFsOjpSZWZsZWN0aW9uU2NoZW1hIHNjaGVtYSA9IHsKKyAgICAgIHR5cGVfaW5mby0+cHJvdG90eXBlLAorICAgICAgdHlwZV9pbmZvLT5vZmZzZXRzLmdldCgpLAorICAgICAgdHlwZV9pbmZvLT5oYXNfYml0c19pbmRpY2VzLmdldCgpLAorICAgICAgdHlwZV9pbmZvLT5oYXNfYml0c19vZmZzZXQsCisgICAgICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoRHluYW1pY01lc3NhZ2UsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICAgICAgdHlwZV9pbmZvLT5leHRlbnNpb25zX29mZnNldCwKKyAgICAgIHR5cGVfaW5mby0+b25lb2ZfY2FzZV9vZmZzZXQsCisgICAgICB0eXBlX2luZm8tPnNpemUsCisgICAgICB0eXBlX2luZm8tPndlYWtfZmllbGRfbWFwX29mZnNldCwKKyAgICAgIG51bGxwdHIgLyogaW5saW5lZF9zdHJpbmdfaW5kaWNlc18gKi8sCisgICAgICAwIC8qIGlubGluZWRfc3RyaW5nX2RvbmF0ZWRfb2Zmc2V0XyAqL307CisKKyAgdHlwZV9pbmZvLT5yZWZsZWN0aW9uLnJlc2V0KAorICAgICAgbmV3IFJlZmxlY3Rpb24odHlwZV9pbmZvLT50eXBlLCBzY2hlbWEsIHR5cGVfaW5mby0+cG9vbCwgdGhpcykpOworCisgIC8vIENyb3NzIGxpbmsgcHJvdG90eXBlcy4KKyAgcHJvdG90eXBlLT5Dcm9zc0xpbmtQcm90b3R5cGVzKCk7CisKKyAgcmV0dXJuIHByb3RvdHlwZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+ICAvLyBOT0xJTlQKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYTY0MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oCkBAIC0wLDAgKzEsMjI3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gRGVmaW5lcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBNZXNzYWdlIHdoaWNoIGNhbiBlbXVsYXRlIHR5cGVzIHdoaWNoIGFyZSBub3QKKy8vIGtub3duIGF0IGNvbXBpbGUtdGltZS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfRFlOQU1JQ19NRVNTQUdFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfRFlOQU1JQ19NRVNTQUdFX0hfXworCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tdXRleC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKworI2lmZGVmIFNXSUcKKyNlcnJvciAiWW91IGNhbm5vdCBTV0lHIHByb3RvIGhlYWRlcnMiCisjZW5kaWYKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gRGVmaW5lZCBpbiBvdGhlciBmaWxlcy4KK2NsYXNzIERlc2NyaXB0b3I7ICAgICAgLy8gZGVzY3JpcHRvci5oCitjbGFzcyBEZXNjcmlwdG9yUG9vbDsgIC8vIGRlc2NyaXB0b3IuaAorCisvLyBDb25zdHJ1Y3RzIGltcGxlbWVudGF0aW9ucyBvZiBNZXNzYWdlIHdoaWNoIGNhbiBlbXVsYXRlIHR5cGVzIHdoaWNoIGFyZSBub3QKKy8vIGtub3duIGF0IGNvbXBpbGUtdGltZS4KKy8vCisvLyBTb21ldGltZXMgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBtYW5pcHVsYXRlIHByb3RvY29sIHR5cGVzIHRoYXQgeW91IGRvbid0CisvLyBrbm93IGFib3V0IGF0IGNvbXBpbGUgdGltZS4gIEl0IHdvdWxkIGJlIG5pY2UgdG8gYmUgYWJsZSB0byBjb25zdHJ1Y3QKKy8vIGEgTWVzc2FnZSBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUgbWVzc2FnZSB0eXBlIGdpdmVuIGJ5IGFueSBhcmJpdHJhcnkKKy8vIERlc2NyaXB0b3IuICBEeW5hbWljTWVzc2FnZSBwcm92aWRlcyB0aGlzLgorLy8KKy8vIEFzIGl0IHR1cm5zIG91dCwgYSBEeW5hbWljTWVzc2FnZSBuZWVkcyB0byBjb25zdHJ1Y3QgZXh0cmEKKy8vIGluZm9ybWF0aW9uIGFib3V0IGl0cyB0eXBlIGluIG9yZGVyIHRvIG9wZXJhdGUuICBNb3N0IG9mIHRoaXMgaW5mb3JtYXRpb24KKy8vIGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBhbGwgRHluYW1pY01lc3NhZ2VzIG9mIHRoZSBzYW1lIHR5cGUuICBCdXQsIGNhY2hpbmcKKy8vIHRoaXMgaW5mb3JtYXRpb24gaW4gc29tZSBzb3J0IG9mIGdsb2JhbCBtYXAgd291bGQgYmUgYSBiYWQgaWRlYSwgc2luY2UKKy8vIHRoZSBjYWNoZWQgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBkZXNjcmlwdG9yIGNvdWxkIG91dGxpdmUgdGhlCisvLyBkZXNjcmlwdG9yIGl0c2VsZi4gIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgRHluYW1pY01lc3NhZ2VGYWN0b3J5CisvLyBlbmNhcHN1bGF0ZXMgdGhpcyAiY2FjaGUiLiAgQWxsIER5bmFtaWNNZXNzYWdlcyBvZiB0aGUgc2FtZSB0eXBlIGNyZWF0ZWQKKy8vIGZyb20gdGhlIHNhbWUgZmFjdG9yeSB3aWxsIHNoYXJlIHRoZSBzYW1lIHN1cHBvcnQgZGF0YS4gIEFueSBEZXNjcmlwdG9ycworLy8gdXNlZCB3aXRoIGEgcGFydGljdWxhciBmYWN0b3J5IG11c3Qgb3V0bGl2ZSB0aGUgZmFjdG9yeS4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBEeW5hbWljTWVzc2FnZUZhY3RvcnkgOiBwdWJsaWMgTWVzc2FnZUZhY3RvcnkgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0IGEgRHluYW1pY01lc3NhZ2VGYWN0b3J5IHRoYXQgd2lsbCBzZWFyY2ggZm9yIGV4dGVuc2lvbnMgaW4KKyAgLy8gdGhlIERlc2NyaXB0b3JQb29sIGluIHdoaWNoIHRoZSBleHRlbmRlZSBpcyBkZWZpbmVkLgorICBEeW5hbWljTWVzc2FnZUZhY3RvcnkoKTsKKworICAvLyBDb25zdHJ1Y3QgYSBEeW5hbWljTWVzc2FnZUZhY3RvcnkgdGhhdCB3aWxsIHNlYXJjaCBmb3IgZXh0ZW5zaW9ucyBpbgorICAvLyB0aGUgZ2l2ZW4gRGVzY3JpcHRvclBvb2wuCisgIC8vCisgIC8vIERFUFJFQ0FURUQ6ICBVc2UgQ29kZWRJbnB1dFN0cmVhbTo6U2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSB0byB0ZWxsIHRoZQorICAvLyAgIHBhcnNlciB0byBsb29rIGZvciBleHRlbnNpb25zIGluIGFuIGFsdGVybmF0ZSBwb29sLiAgSG93ZXZlciwgbm90ZSB0aGF0CisgIC8vICAgdGhpcyBpcyBhbG1vc3QgbmV2ZXIgd2hhdCB5b3Ugd2FudCB0byBkby4gIEFsbW9zdCBhbGwgdXNlcnMgc2hvdWxkIHVzZQorICAvLyAgIHRoZSB6ZXJvLWFyZyBjb25zdHJ1Y3Rvci4KKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5KGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKTsKKworICB+RHluYW1pY01lc3NhZ2VGYWN0b3J5KCkgb3ZlcnJpZGU7CisKKyAgLy8gQ2FsbCB0aGlzIHRvIHRlbGwgdGhlIER5bmFtaWNNZXNzYWdlRmFjdG9yeSB0aGF0IGlmIGl0IGlzIGdpdmVuIGEKKyAgLy8gRGVzY3JpcHRvciBkIGZvciB3aGljaDoKKyAgLy8gICBkLT5maWxlKCktPnBvb2woKSA9PSBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgLy8gdGhlbiBpdCBzaG91bGQgZGVsZWdhdGUgdG8gTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCkgaW5zdGVhZAorICAvLyBvZiBjb25zdHJ1Y3RpbmcgYSBkeW5hbWljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXNzYWdlLiAgSW4gdGhlb3J5IHRoZXJlCisgIC8vIGlzIG5vIGRvd24gc2lkZSB0byBkb2luZyB0aGlzLCBzbyBpdCBtYXkgYmVjb21lIHRoZSBkZWZhdWx0IGluIHRoZSBmdXR1cmUuCisgIHZvaWQgU2V0RGVsZWdhdGVUb0dlbmVyYXRlZEZhY3RvcnkoYm9vbCBlbmFibGUpIHsKKyAgICBkZWxlZ2F0ZV90b19nZW5lcmF0ZWRfZmFjdG9yeV8gPSBlbmFibGU7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2VGYWN0b3J5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIEdpdmVuIGEgRGVzY3JpcHRvciwgY29uc3RydWN0cyB0aGUgZGVmYXVsdCAocHJvdG90eXBlKSBNZXNzYWdlIG9mIHRoYXQKKyAgLy8gdHlwZS4gIFlvdSBjYW4gdGhlbiBjYWxsIHRoYXQgbWVzc2FnZSdzIE5ldygpIG1ldGhvZCB0byBjb25zdHJ1Y3QgYQorICAvLyBtdXRhYmxlIG1lc3NhZ2Ugb2YgdGhhdCB0eXBlLgorICAvLworICAvLyBDYWxsaW5nIHRoaXMgbWV0aG9kIHR3aWNlIHdpdGggdGhlIHNhbWUgRGVzY3JpcHRvciByZXR1cm5zIHRoZSBzYW1lCisgIC8vIG9iamVjdC4gIFRoZSByZXR1cm5lZCBvYmplY3QgcmVtYWlucyBwcm9wZXJ0eSBvZiB0aGUgZmFjdG9yeSBhbmQgd2lsbAorICAvLyBiZSBkZXN0cm95ZWQgd2hlbiB0aGUgZmFjdG9yeSBpcyBkZXN0cm95ZWQuICBBbHNvLCBhbnkgb2JqZWN0cyBjcmVhdGVkCisgIC8vIGJ5IGNhbGxpbmcgdGhlIHByb3RvdHlwZSdzIE5ldygpIG1ldGhvZCBzaGFyZSBzb21lIGRhdGEgd2l0aCB0aGUKKyAgLy8gcHJvdG90eXBlLCBzbyB0aGVzZSBtdXN0IGJlIGRlc3Ryb3llZCBiZWZvcmUgdGhlIER5bmFtaWNNZXNzYWdlRmFjdG9yeQorICAvLyBpcyBkZXN0cm95ZWQuCisgIC8vCisgIC8vIFRoZSBnaXZlbiBkZXNjcmlwdG9yIG11c3Qgb3V0bGl2ZSB0aGUgcmV0dXJuZWQgbWVzc2FnZSwgYW5kIGhlbmNlIG11c3QKKyAgLy8gb3V0bGl2ZSB0aGUgRHluYW1pY01lc3NhZ2VGYWN0b3J5LgorICAvLworICAvLyBUaGUgbWV0aG9kIGlzIHRocmVhZC1zYWZlLgorICBjb25zdCBNZXNzYWdlKiBHZXRQcm90b3R5cGUoY29uc3QgRGVzY3JpcHRvciogdHlwZSkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbF87CisgIGJvb2wgZGVsZWdhdGVfdG9fZ2VuZXJhdGVkX2ZhY3RvcnlfOworCisgIHN0cnVjdCBUeXBlSW5mbzsKKyAgc3RkOjp1bm9yZGVyZWRfbWFwPGNvbnN0IERlc2NyaXB0b3IqLCBjb25zdCBUeXBlSW5mbyo+IHByb3RvdHlwZXNfOworICBtdXRhYmxlIGludGVybmFsOjpXcmFwcGVkTXV0ZXggcHJvdG90eXBlc19tdXRleF87CisKKyAgZnJpZW5kIGNsYXNzIER5bmFtaWNNZXNzYWdlOworICBjb25zdCBNZXNzYWdlKiBHZXRQcm90b3R5cGVOb0xvY2soY29uc3QgRGVzY3JpcHRvciogdHlwZSk7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKER5bmFtaWNNZXNzYWdlRmFjdG9yeSk7Cit9OworCisvLyBIZWxwZXIgZm9yIGNvbXB1dGluZyBhIHNvcnRlZCBsaXN0IG9mIG1hcCBlbnRyaWVzIHZpYSByZWZsZWN0aW9uLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIER5bmFtaWNNYXBTb3J0ZXIgeworIHB1YmxpYzoKKyAgc3RhdGljIHN0ZDo6dmVjdG9yPGNvbnN0IE1lc3NhZ2UqPiBTb3J0KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGludCBtYXBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgTWVzc2FnZSo+IHJlc3VsdDsKKyAgICByZXN1bHQucmVzZXJ2ZShtYXBfc2l6ZSk7CisgICAgUmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPiBtYXBfZmllbGQgPQorICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEZpZWxkUmVmPE1lc3NhZ2U+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtYXBfZmllbGQuYmVnaW4oKTsgaXQgIT0gbWFwX2ZpZWxkLmVuZCgpOyArK2l0KSB7CisgICAgICByZXN1bHQucHVzaF9iYWNrKCYqaXQpOworICAgIH0KKyAgICBNYXBFbnRyeU1lc3NhZ2VDb21wYXJhdG9yIGNvbXBhcmF0b3IoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKTsKKyAgICBzdGQ6OnN0YWJsZV9zb3J0KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCksIGNvbXBhcmF0b3IpOworICAgIC8vIENvbXBsYWluIGlmIHRoZSBrZXlzIGFyZW4ndCBpbiBhc2NlbmRpbmcgb3JkZXIuCisjaWZuZGVmIE5ERUJVRworICAgIGZvciAoc2l6ZV90IGogPSAxOyBqIDwgc3RhdGljX2Nhc3Q8c2l6ZV90PihtYXBfc2l6ZSk7IGorKykgeworICAgICAgaWYgKCFjb21wYXJhdG9yKHJlc3VsdFtqIC0gMV0sIHJlc3VsdFtqXSkpIHsKKyAgICAgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgKGNvbXBhcmF0b3IocmVzdWx0W2pdLCByZXN1bHRbaiAtIDFdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiaW50ZXJuYWwgZXJyb3IgaW4gbWFwIGtleSBzb3J0aW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAibWFwIGtleXMgYXJlIG5vdCB1bmlxdWUiKTsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTWFwRW50cnlNZXNzYWdlQ29tcGFyYXRvciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgTWFwRW50cnlNZXNzYWdlQ29tcGFyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICAgICAgICA6IGZpZWxkXyhkZXNjcmlwdG9yLT5maWVsZCgwKSkge30KKworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBNZXNzYWdlKiBhLCBjb25zdCBNZXNzYWdlKiBiKSB7CisgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gYS0+R2V0UmVmbGVjdGlvbigpOworICAgICAgc3dpdGNoIChmaWVsZF8tPmNwcF90eXBlKCkpIHsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogeworICAgICAgICAgIGJvb2wgZmlyc3QgPSByZWZsZWN0aW9uLT5HZXRCb29sKCphLCBmaWVsZF8pOworICAgICAgICAgIGJvb2wgc2Vjb25kID0gcmVmbGVjdGlvbi0+R2V0Qm9vbCgqYiwgZmllbGRfKTsKKyAgICAgICAgICByZXR1cm4gZmlyc3QgPCBzZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6IHsKKyAgICAgICAgICBpbnQzMl90IGZpcnN0ID0gcmVmbGVjdGlvbi0+R2V0SW50MzIoKmEsIGZpZWxkXyk7CisgICAgICAgICAgaW50MzJfdCBzZWNvbmQgPSByZWZsZWN0aW9uLT5HZXRJbnQzMigqYiwgZmllbGRfKTsKKyAgICAgICAgICByZXR1cm4gZmlyc3QgPCBzZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKKyAgICAgICAgICBpbnQ2NF90IGZpcnN0ID0gcmVmbGVjdGlvbi0+R2V0SW50NjQoKmEsIGZpZWxkXyk7CisgICAgICAgICAgaW50NjRfdCBzZWNvbmQgPSByZWZsZWN0aW9uLT5HZXRJbnQ2NCgqYiwgZmllbGRfKTsKKyAgICAgICAgICByZXR1cm4gZmlyc3QgPCBzZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7CisgICAgICAgICAgdWludDMyX3QgZmlyc3QgPSByZWZsZWN0aW9uLT5HZXRVSW50MzIoKmEsIGZpZWxkXyk7CisgICAgICAgICAgdWludDMyX3Qgc2Vjb25kID0gcmVmbGVjdGlvbi0+R2V0VUludDMyKCpiLCBmaWVsZF8pOworICAgICAgICAgIHJldHVybiBmaXJzdCA8IHNlY29uZDsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6IHsKKyAgICAgICAgICB1aW50NjRfdCBmaXJzdCA9IHJlZmxlY3Rpb24tPkdldFVJbnQ2NCgqYSwgZmllbGRfKTsKKyAgICAgICAgICB1aW50NjRfdCBzZWNvbmQgPSByZWZsZWN0aW9uLT5HZXRVSW50NjQoKmIsIGZpZWxkXyk7CisgICAgICAgICAgcmV0dXJuIGZpcnN0IDwgc2Vjb25kOworICAgICAgICB9CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpcnN0ID0gcmVmbGVjdGlvbi0+R2V0U3RyaW5nKCphLCBmaWVsZF8pOworICAgICAgICAgIHN0ZDo6c3RyaW5nIHNlY29uZCA9IHJlZmxlY3Rpb24tPkdldFN0cmluZygqYiwgZmllbGRfKTsKKyAgICAgICAgICByZXR1cm4gZmlyc3QgPCBzZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkludmFsaWQga2V5IGZvciBtYXAgZmllbGQuIjsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF87CisgIH07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfRFlOQU1JQ19NRVNTQUdFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWMyMDI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwzMjcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBTaW5jZSB0aGUgcmVmbGVjdGlvbiBpbnRlcmZhY2UgZm9yIER5bmFtaWNNZXNzYWdlIGlzIGltcGxlbWVudGVkIGJ5CisvLyBHZW5lcmljTWVzc2FnZVJlZmxlY3Rpb24sIHRoZSBvbmx5IHRoaW5nIHdlIHJlYWxseSBoYXZlIHRvIHRlc3QgaXMKKy8vIHRoYXQgRHluYW1pY01lc3NhZ2UgY29ycmVjdGx5IHNldHMgdXAgdGhlIGluZm9ybWF0aW9uIHRoYXQKKy8vIEdlbmVyaWNNZXNzYWdlUmVmbGVjdGlvbiBuZWVkcyB0byB1c2UuICBTbywgd2UgZm9jdXMgb24gdGhhdCBpbiB0aGlzCisvLyB0ZXN0LiAgT3RoZXIgdGVzdHMsIHN1Y2ggYXMgZ2VuZXJpY19tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QgYW5kCisvLyByZWZsZWN0aW9uX29wc191bml0dGVzdCwgY292ZXIgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgdXNlZCBieQorLy8gRHluYW1pY01lc3NhZ2UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIER5bmFtaWNNZXNzYWdlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Ym9vbD4geworIHByb3RlY3RlZDoKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5XzsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIGNvbnN0IE1lc3NhZ2UqIHByb3RvdHlwZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuc2lvbnNfZGVzY3JpcHRvcl87CisgIGNvbnN0IE1lc3NhZ2UqIGV4dGVuc2lvbnNfcHJvdG90eXBlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogcGFja2VkX2Rlc2NyaXB0b3JfOworICBjb25zdCBNZXNzYWdlKiBwYWNrZWRfcHJvdG90eXBlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvcl87CisgIGNvbnN0IE1lc3NhZ2UqIG9uZW9mX3Byb3RvdHlwZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIHByb3RvM19kZXNjcmlwdG9yXzsKKyAgY29uc3QgTWVzc2FnZSogcHJvdG8zX3Byb3RvdHlwZV87CisKKyAgRHluYW1pY01lc3NhZ2VUZXN0KCkgOiBmYWN0b3J5XygmcG9vbF8pIHt9CisKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAvLyBXZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IER5bmFtaWNNZXNzYWdlIHdvcmtzIChwYXJ0aWN1bGFybHkgd2l0aAorICAgIC8vIGV4dGVuc2lvbnMpIGV2ZW4gaWYgd2UgdXNlIGRlc2NyaXB0b3JzIHRoYXQgYXJlICpub3QqIGZyb20gY29tcGlsZWQtaW4KKyAgICAvLyB0eXBlcywgc28gd2UgbWFrZSBjb3BpZXMgb2YgdGhlIGRlc2NyaXB0b3JzIGZvciB1bml0dGVzdC5wcm90byBhbmQKKyAgICAvLyB1bml0dGVzdF9pbXBvcnQucHJvdG8uCisgICAgRmlsZURlc2NyaXB0b3JQcm90byB1bml0dGVzdF9maWxlOworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gdW5pdHRlc3RfaW1wb3J0X2ZpbGU7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byB1bml0dGVzdF9pbXBvcnRfcHVibGljX2ZpbGU7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byB1bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZV9maWxlOworCisgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmdW5pdHRlc3RfZmlsZSk7CisgICAgdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKAorICAgICAgICAmdW5pdHRlc3RfaW1wb3J0X2ZpbGUpOworICAgIHVuaXR0ZXN0X2ltcG9ydDo6UHVibGljSW1wb3J0TWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygKKyAgICAgICAgJnVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfZmlsZSk7CisgICAgcHJvdG8yX25vZmllbGRwcmVzZW5jZV91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKAorICAgICAgICAmdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2VfZmlsZSk7CisKKyAgICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUodW5pdHRlc3RfaW1wb3J0X3B1YmxpY19maWxlKSAhPSBudWxscHRyKTsKKyAgICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUodW5pdHRlc3RfaW1wb3J0X2ZpbGUpICE9IG51bGxwdHIpOworICAgIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZSh1bml0dGVzdF9maWxlKSAhPSBudWxscHRyKTsKKyAgICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUodW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2VfZmlsZSkgIT0gbnVsbHB0cik7CisKKyAgICBkZXNjcmlwdG9yXyA9IHBvb2xfLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIik7CisgICAgQVNTRVJUX1RSVUUoZGVzY3JpcHRvcl8gIT0gbnVsbHB0cik7CisgICAgcHJvdG90eXBlXyA9IGZhY3RvcnlfLkdldFByb3RvdHlwZShkZXNjcmlwdG9yXyk7CisKKyAgICBleHRlbnNpb25zX2Rlc2NyaXB0b3JfID0KKyAgICAgICAgcG9vbF8uRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucyIpOworICAgIEFTU0VSVF9UUlVFKGV4dGVuc2lvbnNfZGVzY3JpcHRvcl8gIT0gbnVsbHB0cik7CisgICAgZXh0ZW5zaW9uc19wcm90b3R5cGVfID0gZmFjdG9yeV8uR2V0UHJvdG90eXBlKGV4dGVuc2lvbnNfZGVzY3JpcHRvcl8pOworCisgICAgcGFja2VkX2Rlc2NyaXB0b3JfID0KKyAgICAgICAgcG9vbF8uRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0UGFja2VkVHlwZXMiKTsKKyAgICBBU1NFUlRfVFJVRShwYWNrZWRfZGVzY3JpcHRvcl8gIT0gbnVsbHB0cik7CisgICAgcGFja2VkX3Byb3RvdHlwZV8gPSBmYWN0b3J5Xy5HZXRQcm90b3R5cGUocGFja2VkX2Rlc2NyaXB0b3JfKTsKKworICAgIG9uZW9mX2Rlc2NyaXB0b3JfID0KKyAgICAgICAgcG9vbF8uRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0T25lb2YyIik7CisgICAgQVNTRVJUX1RSVUUob25lb2ZfZGVzY3JpcHRvcl8gIT0gbnVsbHB0cik7CisgICAgb25lb2ZfcHJvdG90eXBlXyA9IGZhY3RvcnlfLkdldFByb3RvdHlwZShvbmVvZl9kZXNjcmlwdG9yXyk7CisKKyAgICBwcm90bzNfZGVzY3JpcHRvcl8gPSBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCisgICAgICAgICJwcm90bzJfbm9maWVsZHByZXNlbmNlX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIpOworICAgIEFTU0VSVF9UUlVFKHByb3RvM19kZXNjcmlwdG9yXyAhPSBudWxscHRyKTsKKyAgICBwcm90bzNfcHJvdG90eXBlXyA9IGZhY3RvcnlfLkdldFByb3RvdHlwZShwcm90bzNfZGVzY3JpcHRvcl8pOworICB9Cit9OworCitURVNUX0YoRHluYW1pY01lc3NhZ2VUZXN0LCBEZXNjcmlwdG9yKSB7CisgIC8vIENoZWNrIHRoYXQgdGhlIGRlc2NyaXB0b3Igb24gdGhlIER5bmFtaWNNZXNzYWdlIG1hdGNoZXMgdGhlIGRlc2NyaXB0b3IKKyAgLy8gcGFzc2VkIHRvIEdldFByb3RvdHlwZSgpLgorICBFWFBFQ1RfRVEocHJvdG90eXBlXy0+R2V0RGVzY3JpcHRvcigpLCBkZXNjcmlwdG9yXyk7Cit9CisKK1RFU1RfRihEeW5hbWljTWVzc2FnZVRlc3QsIE9uZVByb3RvdHlwZSkgeworICAvLyBDaGVjayB0aGF0IHJlcXVlc3RpbmcgdGhlIHNhbWUgcHJvdG90eXBlIHR3aWNlIHByb2R1Y2VzIHRoZSBzYW1lIG9iamVjdC4KKyAgRVhQRUNUX0VRKHByb3RvdHlwZV8sIGZhY3RvcnlfLkdldFByb3RvdHlwZShkZXNjcmlwdG9yXykpOworfQorCitURVNUX0YoRHluYW1pY01lc3NhZ2VUZXN0LCBEZWZhdWx0cykgeworICAvLyBDaGVjayB0aGF0IGFsbCBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IGNvcnJlY3RseSBpbiB0aGUgaW5pdGlhbCBtZXNzYWdlLgorICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihkZXNjcmlwdG9yXyk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdENsZWFyVmlhUmVmbGVjdGlvbigqcHJvdG90eXBlXyk7Cit9CisKK1RFU1RfUChEeW5hbWljTWVzc2FnZVRlc3QsIEluZGVwZW5kZW50T2Zmc2V0cykgeworICAvLyBDaGVjayB0aGF0IGFsbCBmaWVsZHMgaGF2ZSBpbmRlcGVuZGVudCBvZmZzZXRzIGJ5IHNldHRpbmcgZWFjaAorICAvLyBvbmUgdG8gYSB1bmlxdWUgdmFsdWUgdGhlbiBjaGVja2luZyB0aGF0IHRoZXkgYWxsIHN0aWxsIGhhdmUgdGhvc2UKKyAgLy8gdW5pcXVlIHZhbHVlcyAoaS5lLiB0aGV5IGRvbid0IHN0b21wIGVhY2ggb3RoZXIpLgorICBBcmVuYSBhcmVuYTsKKyAgTWVzc2FnZSogbWVzc2FnZSA9IHByb3RvdHlwZV8tPk5ldyhHZXRQYXJhbSgpID8gJmFyZW5hIDogbnVsbHB0cik7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKGRlc2NyaXB0b3JfKTsKKworICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKCptZXNzYWdlKTsKKworICBpZiAoIUdldFBhcmFtKCkpIHsKKyAgICBkZWxldGUgbWVzc2FnZTsKKyAgfQorfQorCitURVNUX1AoRHluYW1pY01lc3NhZ2VUZXN0LCBFeHRlbnNpb25zKSB7CisgIC8vIENoZWNrIHRoYXQgZXh0ZW5zaW9ucyB3b3JrLgorICBBcmVuYSBhcmVuYTsKKyAgTWVzc2FnZSogbWVzc2FnZSA9IGV4dGVuc2lvbnNfcHJvdG90eXBlXy0+TmV3KEdldFBhcmFtKCkgPyAmYXJlbmEgOiBudWxscHRyKTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoZXh0ZW5zaW9uc19kZXNjcmlwdG9yXyk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbigqbWVzc2FnZSk7CisKKyAgaWYgKCFHZXRQYXJhbSgpKSB7CisgICAgZGVsZXRlIG1lc3NhZ2U7CisgIH0KK30KKworVEVTVF9QKER5bmFtaWNNZXNzYWdlVGVzdCwgUGFja2VkRmllbGRzKSB7CisgIC8vIENoZWNrIHRoYXQgcGFja2VkIGZpZWxkcyB3b3JrIHByb3Blcmx5LgorICBBcmVuYSBhcmVuYTsKKyAgTWVzc2FnZSogbWVzc2FnZSA9IHBhY2tlZF9wcm90b3R5cGVfLT5OZXcoR2V0UGFyYW0oKSA/ICZhcmVuYSA6IG51bGxwdHIpOworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihwYWNrZWRfZGVzY3JpcHRvcl8pOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldFBhY2tlZEZpZWxkc1ZpYVJlZmxlY3Rpb24obWVzc2FnZSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdFBhY2tlZEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oKm1lc3NhZ2UpOworCisgIGlmICghR2V0UGFyYW0oKSkgeworICAgIGRlbGV0ZSBtZXNzYWdlOworICB9Cit9CisKK1RFU1RfUChEeW5hbWljTWVzc2FnZVRlc3QsIE9uZW9mKSB7CisgIC8vIENoZWNrIHRoYXQgb25lb2YgZmllbGRzIHdvcmsgcHJvcGVybHkuCisgIEFyZW5hIGFyZW5hOworICBNZXNzYWdlKiBtZXNzYWdlID0gb25lb2ZfcHJvdG90eXBlXy0+TmV3KEdldFBhcmFtKCkgPyAmYXJlbmEgOiBudWxscHRyKTsKKworICAvLyBDaGVjayBkZWZhdWx0IHZhbHVlcy4KKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkdldEludDMyKCptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29faW50IikpKTsKKyAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19zdHJpbmciKSkpOworICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fY29yZCIpKSk7CisgIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAqbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19ieXRlcyIpKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpGT08sCisgICAgICByZWZsZWN0aW9uLT5HZXRFbnVtKCptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19lbnVtIikpCisgICAgICAgICAgLT5udW1iZXIoKSk7CisgIGNvbnN0IERlc2NyaXB0b3IqIG5lc3RlZF9kZXNjcmlwdG9yOworICBjb25zdCBNZXNzYWdlKiBuZXN0ZWRfcHJvdG90eXBlOworICBuZXN0ZWRfZGVzY3JpcHRvciA9CisgICAgICBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RPbmVvZjIuTmVzdGVkTWVzc2FnZSIpOworICBuZXN0ZWRfcHJvdG90eXBlID0gZmFjdG9yeV8uR2V0UHJvdG90eXBlKG5lc3RlZF9kZXNjcmlwdG9yKTsKKyAgRVhQRUNUX0VRKG5lc3RlZF9wcm90b3R5cGUsCisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAqbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbWVzc2FnZSIpKSk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGZvb2dyb3VwX2Rlc2NyaXB0b3I7CisgIGNvbnN0IE1lc3NhZ2UqIGZvb2dyb3VwX3Byb3RvdHlwZTsKKyAgZm9vZ3JvdXBfZGVzY3JpcHRvciA9CisgICAgICBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RPbmVvZjIuRm9vR3JvdXAiKTsKKyAgZm9vZ3JvdXBfcHJvdG90eXBlID0gZmFjdG9yeV8uR2V0UHJvdG90eXBlKGZvb2dyb3VwX2Rlc2NyaXB0b3IpOworICBFWFBFQ1RfRVEoZm9vZ3JvdXBfcHJvdG90eXBlLAorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UoKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb2dyb3VwIikpKTsKKyAgRVhQRUNUX05FKGZvb2dyb3VwX3Byb3RvdHlwZSwKKyAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSkpOworICBFWFBFQ1RfRVEoNSwgcmVmbGVjdGlvbi0+R2V0SW50MzIoKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9pbnQiKSkpOworICBFWFBFQ1RfRVEoIlNUUklORyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX3N0cmluZyIpKSk7CisgIEVYUEVDVF9FUSgiQ09SRCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9jb3JkIikpKTsKKyAgRVhQRUNUX0VRKCJTUElFQ0UiLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9zdHJpbmdfcGllY2UiKSkpOworICBFWFBFQ1RfRVEoIkJZVEVTIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9ieXRlcyIpKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpCQVIsCisgICAgICByZWZsZWN0aW9uLT5HZXRFbnVtKCptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9lbnVtIikpCisgICAgICAgICAgLT5udW1iZXIoKSk7CisKKyAgLy8gQ2hlY2sgc2V0IGZ1bmN0aW9ucy4KKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIob25lb2ZfZGVzY3JpcHRvcl8pOworICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRPbmVvZlZpYVJlZmxlY3Rpb24obWVzc2FnZSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE9uZW9mU2V0VmlhUmVmbGVjdGlvbigqbWVzc2FnZSk7CisKKyAgaWYgKCFHZXRQYXJhbSgpKSB7CisgICAgZGVsZXRlIG1lc3NhZ2U7CisgIH0KK30KKworVEVTVF9QKER5bmFtaWNNZXNzYWdlVGVzdCwgU3BhY2VVc2VkKSB7CisgIC8vIFRlc3QgdGhhdCBTcGFjZVVzZWRMb25nKCkgd29ya3MgcHJvcGVybHkKKworICAvLyBTaW5jZSB3ZSBzaGFyZSB0aGUgaW1wbGVtZW50YXRpb24gd2l0aCBnZW5lcmF0ZWQgbWVzc2FnZXMsIHdlIGRvbid0IG5lZWQKKyAgLy8gdG8gdGVzdCB2ZXJ5IG11Y2ggaGVyZS4gIEp1c3QgbWFrZSBzdXJlIGl0IGFwcGVhcnMgdG8gYmUgd29ya2luZy4KKworICBBcmVuYSBhcmVuYTsKKyAgTWVzc2FnZSogbWVzc2FnZSA9IHByb3RvdHlwZV8tPk5ldyhHZXRQYXJhbSgpID8gJmFyZW5hIDogbnVsbHB0cik7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKGRlc2NyaXB0b3JfKTsKKworICBzaXplX3QgaW5pdGlhbF9zcGFjZV91c2VkID0gbWVzc2FnZS0+U3BhY2VVc2VkTG9uZygpOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24obWVzc2FnZSk7CisgIEVYUEVDVF9MVChpbml0aWFsX3NwYWNlX3VzZWQsIG1lc3NhZ2UtPlNwYWNlVXNlZExvbmcoKSk7CisKKyAgaWYgKCFHZXRQYXJhbSgpKSB7CisgICAgZGVsZXRlIG1lc3NhZ2U7CisgIH0KK30KKworVEVTVF9GKER5bmFtaWNNZXNzYWdlVGVzdCwgQXJlbmEpIHsKKyAgQXJlbmEgYXJlbmE7CisgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBwcm90b3R5cGVfLT5OZXcoJmFyZW5hKTsKKyAgTWVzc2FnZSogZXh0ZW5zaW9uX21lc3NhZ2UgPSBleHRlbnNpb25zX3Byb3RvdHlwZV8tPk5ldygmYXJlbmEpOworICBNZXNzYWdlKiBwYWNrZWRfbWVzc2FnZSA9IHBhY2tlZF9wcm90b3R5cGVfLT5OZXcoJmFyZW5hKTsKKyAgTWVzc2FnZSogb25lb2ZfbWVzc2FnZSA9IG9uZW9mX3Byb3RvdHlwZV8tPk5ldygmYXJlbmEpOworCisgIC8vIGF2b2lkIHVudXNlZC12YXJpYWJsZSBlcnJvci4KKyAgKHZvaWQpbWVzc2FnZTsKKyAgKHZvaWQpZXh0ZW5zaW9uX21lc3NhZ2U7CisgICh2b2lkKXBhY2tlZF9tZXNzYWdlOworICAodm9pZClvbmVvZl9tZXNzYWdlOworICAvLyBSZXR1cm4gd2l0aG91dCBmcmVlaW5nOiBzaG91bGQgbm90IGxlYWsuCit9CisKKworVEVTVF9GKER5bmFtaWNNZXNzYWdlVGVzdCwgUHJvdG8zKSB7CisgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBwcm90bzNfcHJvdG90eXBlXy0+TmV3KCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmwgPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7CisKKyAgLy8gSnVzdCB0ZXN0IGEgc2luZ2xlIHByaW1pdGl2ZSBhbmQgc2luZ2xlIG1lc3NhZ2UgZmllbGQgaGVyZSB0byBtYWtlIHN1cmUgd2UKKyAgLy8gYXJlIGdldHRpbmcgdGhlIG5vLWZpZWxkLXByZXNlbmNlIHNlbWFudGljcyBlbHNld2hlcmUuIER5bmFtaWNNZXNzYWdlIHVzZXMKKyAgLy8gR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24gdW5kZXIgdGhlIGhvb2QsIHNvIHRoZSByZXN0IHNob3VsZCBiZSBmaW5lIGFzCisgIC8vIGxvbmcgYXMgR01SIHJlY29nbml6ZXMgdGhhdCB3ZSdyZSB1c2luZyBhIHByb3RvMyBtZXNzYWdlLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG9wdGlvbmFsX2ludDMyID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50MzIiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBvcHRpb25hbF9tc2cgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpOworICBFWFBFQ1RfVFJVRShvcHRpb25hbF9pbnQzMiAhPSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUob3B0aW9uYWxfbXNnICE9IG51bGxwdHIpOworCisgIEVYUEVDVF9FUShmYWxzZSwgcmVmbC0+SGFzRmllbGQoKm1lc3NhZ2UsIG9wdGlvbmFsX2ludDMyKSk7CisgIHJlZmwtPlNldEludDMyKG1lc3NhZ2UsIG9wdGlvbmFsX2ludDMyLCA0Mik7CisgIEVYUEVDVF9FUSh0cnVlLCByZWZsLT5IYXNGaWVsZCgqbWVzc2FnZSwgb3B0aW9uYWxfaW50MzIpKTsKKyAgcmVmbC0+U2V0SW50MzIobWVzc2FnZSwgb3B0aW9uYWxfaW50MzIsIDApOworICBFWFBFQ1RfRVEoZmFsc2UsIHJlZmwtPkhhc0ZpZWxkKCptZXNzYWdlLCBvcHRpb25hbF9pbnQzMikpOworCisgIEVYUEVDVF9FUShmYWxzZSwgcmVmbC0+SGFzRmllbGQoKm1lc3NhZ2UsIG9wdGlvbmFsX21zZykpOworICByZWZsLT5NdXRhYmxlTWVzc2FnZShtZXNzYWdlLCBvcHRpb25hbF9tc2cpOworICBFWFBFQ1RfRVEodHJ1ZSwgcmVmbC0+SGFzRmllbGQoKm1lc3NhZ2UsIG9wdGlvbmFsX21zZykpOworICBkZWxldGUgcmVmbC0+UmVsZWFzZU1lc3NhZ2UobWVzc2FnZSwgb3B0aW9uYWxfbXNnKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCByZWZsLT5IYXNGaWVsZCgqbWVzc2FnZSwgb3B0aW9uYWxfbXNnKSk7CisKKyAgLy8gQWxzbyBlbnN1cmUgdGhhdCB0aGUgZGVmYXVsdCBpbnN0YW5jZSBoYW5kbGVzIGZpZWxkIHByZXNlbmNlIHByb3Blcmx5LgorICBFWFBFQ1RfRVEoZmFsc2UsIHJlZmwtPkhhc0ZpZWxkKCpwcm90bzNfcHJvdG90eXBlXywgb3B0aW9uYWxfbXNnKSk7CisKKyAgZGVsZXRlIG1lc3NhZ2U7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChVc2VBcmVuYSwgRHluYW1pY01lc3NhZ2VUZXN0LCA6OnRlc3Rpbmc6OkJvb2woKSk7CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wYi5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZW1wdHkucGIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzMDc3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZW1wdHkucGIuY2MKQEAgLTAsMCArMSwxMzAgQEAKKy8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisvLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90bworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2VtcHR5LnBiLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCitQUk9UT0JVRl9QUkFHTUFfSU5JVF9TRUcKKworbmFtZXNwYWNlIF9wYiA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOworbmFtZXNwYWNlIF9wYmkgPSBfcGI6OmludGVybmFsOworCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorUFJPVE9CVUZfQ09OU1RFWFBSIEVtcHR5OjpFbXB0eSgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpIHt9CitzdHJ1Y3QgRW1wdHlEZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIEVtcHR5RGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgfkVtcHR5RGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBFbXB0eSBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBFbXB0eURlZmF1bHRUeXBlSW50ZXJuYWwgX0VtcHR5X2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitzdGF0aWMgOjpfcGI6Ok1ldGFkYXRhIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZlbXB0eV8yZXByb3RvWzFdOworc3RhdGljIGNvbnN0ZXhwciA6Ol9wYjo6RW51bURlc2NyaXB0b3IgY29uc3QqKiBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZlbXB0eV8yZXByb3RvID0gbnVsbHB0cjsKK3N0YXRpYyBjb25zdGV4cHIgOjpfcGI6OlNlcnZpY2VEZXNjcmlwdG9yIGNvbnN0KiogZmlsZV9sZXZlbF9zZXJ2aWNlX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmZW1wdHlfMmVwcm90byA9IG51bGxwdHI7CisKK2NvbnN0IHVpbnQzMl90IFRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmZW1wdHlfMmVwcm90bzo6b2Zmc2V0c1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0geworICB+MHUsICAvLyBubyBfaGFzX2JpdHNfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW1wdHksIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCit9Oworc3RhdGljIGNvbnN0IDo6X3BiaTo6TWlncmF0aW9uU2NoZW1hIHNjaGVtYXNbXSBQUk9UT0JVRl9TRUNUSU9OX1ZBUklBQkxFKHByb3RvZGVzY19jb2xkKSA9IHsKKyAgeyAwLCAtMSwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW1wdHkpfSwKK307CisKK3N0YXRpYyBjb25zdCA6Ol9wYjo6TWVzc2FnZSogY29uc3QgZmlsZV9kZWZhdWx0X2luc3RhbmNlc1tdID0geworICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9FbXB0eV9kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCit9OworCitjb25zdCBjaGFyIGRlc2NyaXB0b3JfdGFibGVfcHJvdG9kZWZfZ29vZ2xlXzJmcHJvdG9idWZfMmZlbXB0eV8yZXByb3RvW10gUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRShwcm90b2Rlc2NfY29sZCkgPQorICAiXG5cMDMzZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvXDAyMlwwMTdnb29nbGUucHIiCisgICJvdG9idWZcIlwwMDdcblwwMDVFbXB0eUJ9XG5cMDIzY29tLmdvb2dsZS5wcm90b2J1ZkJcbiIKKyAgIkVtcHR5UHJvdG9QXDAwMVouZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYiCisgICIvdHlwZXMva25vd24vZW1wdHlwYlwzNzBcMDAxXDAwMVwyNDJcMDAyXDAwM0dQQlwyNTJcMDAyXDAzNkdvb2dsZS5QIgorICAicm90b2J1Zi5XZWxsS25vd25UeXBlc2JcMDA2cHJvdG8zIgorICA7CitzdGF0aWMgOjpfcGJpOjpvbmNlX2ZsYWcgZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmVtcHR5XzJlcHJvdG9fb25jZTsKK2NvbnN0IDo6X3BiaTo6RGVzY3JpcHRvclRhYmxlIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZlbXB0eV8yZXByb3RvID0geworICAgIGZhbHNlLCBmYWxzZSwgMTkwLCBkZXNjcmlwdG9yX3RhYmxlX3Byb3RvZGVmX2dvb2dsZV8yZnByb3RvYnVmXzJmZW1wdHlfMmVwcm90bywKKyAgICAiZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvIiwKKyAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmVtcHR5XzJlcHJvdG9fb25jZSwgbnVsbHB0ciwgMCwgMSwKKyAgICBzY2hlbWFzLCBmaWxlX2RlZmF1bHRfaW5zdGFuY2VzLCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZmVtcHR5XzJlcHJvdG86Om9mZnNldHMsCisgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZmVtcHR5XzJlcHJvdG8sIGZpbGVfbGV2ZWxfZW51bV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZmVtcHR5XzJlcHJvdG8sCisgICAgZmlsZV9sZXZlbF9zZXJ2aWNlX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmZW1wdHlfMmVwcm90bywKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfV0VBSyBjb25zdCA6Ol9wYmk6OkRlc2NyaXB0b3JUYWJsZSogZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmVtcHR5XzJlcHJvdG9fZ2V0dGVyKCkgeworICByZXR1cm4gJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZlbXB0eV8yZXByb3RvOworfQorCisvLyBGb3JjZSBydW5uaW5nIEFkZERlc2NyaXB0b3JzKCkgYXQgZHluYW1pYyBpbml0aWFsaXphdGlvbiB0aW1lLgorUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkyIHN0YXRpYyA6Ol9wYmk6OkFkZERlc2NyaXB0b3JzUnVubmVyIGR5bmFtaWNfaW5pdF9kdW1teV9nb29nbGVfMmZwcm90b2J1Zl8yZmVtcHR5XzJlcHJvdG8oJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZlbXB0eV8yZXByb3RvKTsKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgRW1wdHk6Ol9JbnRlcm5hbCB7CisgcHVibGljOgorfTsKKworRW1wdHk6OkVtcHR5KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6WmVyb0ZpZWxkc0Jhc2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbXB0eSkKK30KK0VtcHR5OjpFbXB0eShjb25zdCBFbXB0eSYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Olplcm9GaWVsZHNCYXNlKCkgeworICBFbXB0eSogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVtcHR5KQorfQorCisKKworCisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgRW1wdHk6Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Olplcm9GaWVsZHNCYXNlOjpDb3B5SW1wbCwKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Olplcm9GaWVsZHNCYXNlOjpNZXJnZUltcGwsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpFbXB0eTo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKKworCisKKworCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgRW1wdHk6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZW1wdHlfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZW1wdHlfMmVwcm90b19vbmNlLAorICAgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZmVtcHR5XzJlcHJvdG9bMF0pOworfQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW1wdHkqCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW1wdHkgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbXB0eSA+KGFyZW5hKTsKK30KK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvZW1wdHkucGIuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvZW1wdHkucGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjllODE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wYi5oCkBAIC0wLDAgKzEsMTk4IEBACisvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfZ29vZ2xlXzJmcHJvdG9idWZfMmZlbXB0eV8yZXByb3RvCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZmVtcHR5XzJlcHJvdG8KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorI2lmIFBST1RPQlVGX1ZFUlNJT04gPCAzMDIxMDAwCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcworI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuIFBsZWFzZSB1cGRhdGUKKyNlcnJvciB5b3VyIGhlYWRlcnMuCisjZW5kaWYKKyNpZiAzMDIxMDA5IDwgUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiBQbGVhc2UKKyNlcnJvciByZWdlbmVyYXRlIHRoaXMgZmlsZSB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2MuCisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX2Jhc2VzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGFfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisjZGVmaW5lIFBST1RPQlVGX0lOVEVSTkFMX0VYUE9SVF9nb29nbGVfMmZwcm90b2J1Zl8yZmVtcHR5XzJlcHJvdG8gUFJPVE9CVUZfRVhQT1JUCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorbmFtZXNwYWNlIGludGVybmFsIHsKK2NsYXNzIEFueU1ldGFkYXRhOworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIC0tIGRvIG5vdCB1c2UgdGhlc2UgbWVtYmVycy4KK3N0cnVjdCBQUk9UT0JVRl9FWFBPUlQgVGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZlbXB0eV8yZXByb3RvIHsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG9mZnNldHNbXTsKK307CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RGVzY3JpcHRvclRhYmxlIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZlbXB0eV8yZXByb3RvOworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK2NsYXNzIEVtcHR5Oworc3RydWN0IEVtcHR5RGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gRW1wdHlEZWZhdWx0VHlwZUludGVybmFsIF9FbXB0eV9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbXB0eSogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW1wdHk+KEFyZW5hKik7CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEVtcHR5IGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpaZXJvRmllbGRzQmFzZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuRW1wdHkpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBFbXB0eSgpIDogRW1wdHkobnVsbHB0cikge30KKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIEVtcHR5KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgRW1wdHkoY29uc3QgRW1wdHkmIGZyb20pOworICBFbXB0eShFbXB0eSYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBFbXB0eSgpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIEVtcHR5JiBvcGVyYXRvcj0oY29uc3QgRW1wdHkmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIEVtcHR5JiBvcGVyYXRvcj0oRW1wdHkmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgRW1wdHkmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBFbXB0eSogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbXB0eSo+KAorICAgICAgICAgICAgICAgJl9FbXB0eV9kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDA7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChFbXB0eSYgYSwgRW1wdHkmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoRW1wdHkqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKEVtcHR5KiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBFbXB0eSogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxFbXB0eT4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6WmVyb0ZpZWxkc0Jhc2U6OkNvcHlGcm9tOworICBpbmxpbmUgdm9pZCBDb3B5RnJvbShjb25zdCBFbXB0eSYgZnJvbSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6WmVyb0ZpZWxkc0Jhc2U6OkNvcHlJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Olplcm9GaWVsZHNCYXNlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEVtcHR5JiBmcm9tKSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpaZXJvRmllbGRzQmFzZTo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwdWJsaWM6CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLkVtcHR5IjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEVtcHR5KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkVtcHR5KQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmZW1wdHlfMmVwcm90bzsKK307CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzdHJpY3QtYWxpYXNpbmciCisjZW5kaWYgIC8vIF9fR05VQ19fCisvLyBFbXB0eQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZiAgLy8gX19HTlVDX18KKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKKworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9HT09HTEVfUFJPVE9CVUZfSU5DTFVERURfZ29vZ2xlXzJmcHJvdG9idWZfMmZlbXB0eV8yZXByb3RvCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjI3NDYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90bwpAQCAtMCwwICsxLDUxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOworCitvcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMiOworb3B0aW9uIGdvX3BhY2thZ2UgPSAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vZW1wdHlwYiI7CitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkVtcHR5UHJvdG8iOworb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOworb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gIkdQQiI7CitvcHRpb24gY2NfZW5hYmxlX2FyZW5hcyA9IHRydWU7CisKKy8vIEEgZ2VuZXJpYyBlbXB0eSBtZXNzYWdlIHRoYXQgeW91IGNhbiByZS11c2UgdG8gYXZvaWQgZGVmaW5pbmcgZHVwbGljYXRlZAorLy8gZW1wdHkgbWVzc2FnZXMgaW4geW91ciBBUElzLiBBIHR5cGljYWwgZXhhbXBsZSBpcyB0byB1c2UgaXQgYXMgdGhlIHJlcXVlc3QKKy8vIG9yIHRoZSByZXNwb25zZSB0eXBlIG9mIGFuIEFQSSBtZXRob2QuIEZvciBpbnN0YW5jZToKKy8vCisvLyAgICAgc2VydmljZSBGb28geworLy8gICAgICAgcnBjIEJhcihnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSk7CisvLyAgICAgfQorLy8KK21lc3NhZ2UgRW1wdHkge30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvZW5kaWFuLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZWU2Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2VuZGlhbi5oCkBAIC0wLDAgKzEsMTk4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfRU5ESUFOX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfRU5ESUFOX0hfXworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2lubGluZSB1aW50NjRfdCBCU3dhcDY0KHVpbnQ2NF90IGhvc3RfaW50KSB7CisjaWYgZGVmaW5lZChQUk9UT0JVRl9CVUlMVElOX0JTV0FQNjQpCisgIHJldHVybiBQUk9UT0JVRl9CVUlMVElOX0JTV0FQNjQoaG9zdF9pbnQpOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgcmV0dXJuIF9ieXRlc3dhcF91aW50NjQoaG9zdF9pbnQpOworI2Vsc2UKKyAgcmV0dXJuICgoKGhvc3RfaW50ICYgdWludDY0X3R7MHhGRn0pIDw8IDU2KSB8CisgICAgICAgICAgKChob3N0X2ludCAmIHVpbnQ2NF90ezB4RkYwMH0pIDw8IDQwKSB8CisgICAgICAgICAgKChob3N0X2ludCAmIHVpbnQ2NF90ezB4RkYwMDAwfSkgPDwgMjQpIHwKKyAgICAgICAgICAoKGhvc3RfaW50ICYgdWludDY0X3R7MHhGRjAwMDAwMH0pIDw8IDgpIHwKKyAgICAgICAgICAoKGhvc3RfaW50ICYgdWludDY0X3R7MHhGRjAwMDAwMDAwfSkgPj4gOCkgfAorICAgICAgICAgICgoaG9zdF9pbnQgJiB1aW50NjRfdHsweEZGMDAwMDAwMDAwMH0pID4+IDI0KSB8CisgICAgICAgICAgKChob3N0X2ludCAmIHVpbnQ2NF90ezB4RkYwMDAwMDAwMDAwMDB9KSA+PiA0MCkgfAorICAgICAgICAgICgoaG9zdF9pbnQgJiB1aW50NjRfdHsweEZGMDAwMDAwMDAwMDAwMDB9KSA+PiA1NikpOworI2VuZGlmCit9CisKK2lubGluZSB1aW50MzJfdCBCU3dhcDMyKHVpbnQzMl90IGhvc3RfaW50KSB7CisjaWYgZGVmaW5lZChQUk9UT0JVRl9CVUlMVElOX0JTV0FQMzIpCisgIHJldHVybiBQUk9UT0JVRl9CVUlMVElOX0JTV0FQMzIoaG9zdF9pbnQpOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgcmV0dXJuIF9ieXRlc3dhcF91bG9uZyhob3N0X2ludCk7CisjZWxzZQorICByZXR1cm4gKCgoaG9zdF9pbnQgJiB1aW50MzJfdHsweEZGfSkgPDwgMjQpIHwKKyAgICAgICAgICAoKGhvc3RfaW50ICYgdWludDMyX3R7MHhGRjAwfSkgPDwgOCkgfAorICAgICAgICAgICgoaG9zdF9pbnQgJiB1aW50MzJfdHsweEZGMDAwMH0pID4+IDgpIHwKKyAgICAgICAgICAoKGhvc3RfaW50ICYgdWludDMyX3R7MHhGRjAwMDAwMH0pID4+IDI0KSk7CisjZW5kaWYKK30KKworaW5saW5lIHVpbnQxNl90IEJTd2FwMTYodWludDE2X3QgaG9zdF9pbnQpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0JVSUxUSU5fQlNXQVAxNikKKyAgcmV0dXJuIFBST1RPQlVGX0JVSUxUSU5fQlNXQVAxNihob3N0X2ludCk7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICByZXR1cm4gX2J5dGVzd2FwX3VzaG9ydChob3N0X2ludCk7CisjZWxzZQorICByZXR1cm4gKCgoaG9zdF9pbnQgJiB1aW50MTZfdHsweEZGfSkgPDwgOCkgfAorICAgICAgICAgICgoaG9zdF9pbnQgJiB1aW50MTZfdHsweEZGMDB9KSA+PiA4KSk7CisjZW5kaWYKK30KKworbmFtZXNwYWNlIGxpdHRsZV9lbmRpYW4geworCitpbmxpbmUgdWludDE2X3QgRnJvbUhvc3QodWludDE2X3QgdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0JJR19FTkRJQU4pCisgIHJldHVybiBCU3dhcDE2KHZhbHVlKTsKKyNlbHNlCisgIHJldHVybiB2YWx1ZTsKKyNlbmRpZgorfQorCitpbmxpbmUgdWludDMyX3QgRnJvbUhvc3QodWludDMyX3QgdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0JJR19FTkRJQU4pCisgIHJldHVybiBCU3dhcDMyKHZhbHVlKTsKKyNlbHNlCisgIHJldHVybiB2YWx1ZTsKKyNlbmRpZgorfQorCitpbmxpbmUgdWludDY0X3QgRnJvbUhvc3QodWludDY0X3QgdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0JJR19FTkRJQU4pCisgIHJldHVybiBCU3dhcDY0KHZhbHVlKTsKKyNlbHNlCisgIHJldHVybiB2YWx1ZTsKKyNlbmRpZgorfQorCitpbmxpbmUgdWludDE2X3QgVG9Ib3N0KHVpbnQxNl90IHZhbHVlKSB7CisjaWYgZGVmaW5lZChQUk9UT0JVRl9CSUdfRU5ESUFOKQorICByZXR1cm4gQlN3YXAxNih2YWx1ZSk7CisjZWxzZQorICByZXR1cm4gdmFsdWU7CisjZW5kaWYKK30KKworaW5saW5lIHVpbnQzMl90IFRvSG9zdCh1aW50MzJfdCB2YWx1ZSkgeworI2lmIGRlZmluZWQoUFJPVE9CVUZfQklHX0VORElBTikKKyAgcmV0dXJuIEJTd2FwMzIodmFsdWUpOworI2Vsc2UKKyAgcmV0dXJuIHZhbHVlOworI2VuZGlmCit9CisKK2lubGluZSB1aW50NjRfdCBUb0hvc3QodWludDY0X3QgdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0JJR19FTkRJQU4pCisgIHJldHVybiBCU3dhcDY0KHZhbHVlKTsKKyNlbHNlCisgIHJldHVybiB2YWx1ZTsKKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UgbGl0dGxlX2VuZGlhbgorCituYW1lc3BhY2UgYmlnX2VuZGlhbiB7CisKK2lubGluZSB1aW50MTZfdCBGcm9tSG9zdCh1aW50MTZfdCB2YWx1ZSkgeworI2lmIGRlZmluZWQoUFJPVE9CVUZfQklHX0VORElBTikKKyAgcmV0dXJuIHZhbHVlOworI2Vsc2UKKyAgcmV0dXJuIEJTd2FwMTYodmFsdWUpOworI2VuZGlmCit9CisKK2lubGluZSB1aW50MzJfdCBGcm9tSG9zdCh1aW50MzJfdCB2YWx1ZSkgeworI2lmIGRlZmluZWQoUFJPVE9CVUZfQklHX0VORElBTikKKyAgcmV0dXJuIHZhbHVlOworI2Vsc2UKKyAgcmV0dXJuIEJTd2FwMzIodmFsdWUpOworI2VuZGlmCit9CisKK2lubGluZSB1aW50NjRfdCBGcm9tSG9zdCh1aW50NjRfdCB2YWx1ZSkgeworI2lmIGRlZmluZWQoUFJPVE9CVUZfQklHX0VORElBTikKKyAgcmV0dXJuIHZhbHVlOworI2Vsc2UKKyAgcmV0dXJuIEJTd2FwNjQodmFsdWUpOworI2VuZGlmCit9CisKK2lubGluZSB1aW50MTZfdCBUb0hvc3QodWludDE2X3QgdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0JJR19FTkRJQU4pCisgIHJldHVybiB2YWx1ZTsKKyNlbHNlCisgIHJldHVybiBCU3dhcDE2KHZhbHVlKTsKKyNlbmRpZgorfQorCitpbmxpbmUgdWludDMyX3QgVG9Ib3N0KHVpbnQzMl90IHZhbHVlKSB7CisjaWYgZGVmaW5lZChQUk9UT0JVRl9CSUdfRU5ESUFOKQorICByZXR1cm4gdmFsdWU7CisjZWxzZQorICByZXR1cm4gQlN3YXAzMih2YWx1ZSk7CisjZW5kaWYKK30KKworaW5saW5lIHVpbnQ2NF90IFRvSG9zdCh1aW50NjRfdCB2YWx1ZSkgeworI2lmIGRlZmluZWQoUFJPVE9CVUZfQklHX0VORElBTikKKyAgcmV0dXJuIHZhbHVlOworI2Vsc2UKKyAgcmV0dXJuIEJTd2FwNjQodmFsdWUpOworI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZSBiaWdfZW5kaWFuCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0VORElBTl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvZXhwbGljaXRseV9jb25zdHJ1Y3RlZC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHBsaWNpdGx5X2NvbnN0cnVjdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc0YzU5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZXhwbGljaXRseV9jb25zdHJ1Y3RlZC5oCkBAIC0wLDAgKzEsOTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9FWFBMSUNJVExZX0NPTlNUUlVDVEVEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfRVhQTElDSVRMWV9DT05TVFJVQ1RFRF9IX18KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKy8vIGNsYW5nLWZvcm1hdCBvbgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBXcmFwcyBhIHZhcmlhYmxlIHdob3NlIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIGFyZSBleHBsaWNpdGx5CisvLyBjYWxsZWQuIEl0IGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGEgZ2xvYmFsIHZhcmlhYmxlLCB3aXRob3V0IGl0cworLy8gY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgcnVuIG9uIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHByb2dyYW0gbGlmZXRpbWUuCisvLyBUaGlzIGNpcmN1bXZlbnRzIHRoZSBpbml0aWFsIGNvbnN0cnVjdGlvbiBvcmRlciBmaWFzY28sIHdoaWxlIGtlZXBpbmcKKy8vIHRoZSBhZGRyZXNzIG9mIHRoZSBlbXB0eSBzdHJpbmcgYSBjb21waWxlIHRpbWUgY29uc3RhbnQuCisvLworLy8gUGF5IHNwZWNpYWwgYXR0ZW50aW9uIHRvIHRoZSBpbml0aWFsaXphdGlvbiBzdGF0ZSBvZiB0aGUgb2JqZWN0LgorLy8gMS4gVGhlIG9iamVjdCBpcyAidW5pbml0aWFsaXplZCIgdG8gYmVnaW4gd2l0aC4KKy8vIDIuIENhbGwgQ29uc3RydWN0KCkgb3IgRGVmYXVsdENvbnN0cnVjdCgpIG9ubHkgaWYgdGhlIG9iamVjdCBpcworLy8gICAgdW5pbml0aWFsaXplZC4gQWZ0ZXIgdGhlIGNhbGwsIHRoZSBvYmplY3QgYmVjb21lcyAiaW5pdGlhbGl6ZWQiLgorLy8gMy4gQ2FsbCBnZXQoKSBhbmQgZ2V0X211dGFibGUoKSBvbmx5IGlmIHRoZSBvYmplY3QgaXMgaW5pdGlhbGl6ZWQuCisvLyA0LiBDYWxsIERlc3RydWN0KCkgb25seSBpZiB0aGUgb2JqZWN0IGlzIGluaXRpYWxpemVkLgorLy8gICAgQWZ0ZXIgdGhlIGNhbGwsIHRoZSBvYmplY3QgYmVjb21lcyB1bmluaXRpYWxpemVkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBtaW5fYWxpZ24gPSAxPgorY2xhc3MgRXhwbGljaXRseUNvbnN0cnVjdGVkIHsKKyBwdWJsaWM6CisgIHZvaWQgRGVmYXVsdENvbnN0cnVjdCgpIHsgbmV3ICgmdW5pb25fKSBUKCk7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KKyAgdm9pZCBDb25zdHJ1Y3QoQXJncyYmLi4uIGFyZ3MpIHsKKyAgICBuZXcgKCZ1bmlvbl8pIFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgfQorCisgIHZvaWQgRGVzdHJ1Y3QoKSB7IGdldF9tdXRhYmxlKCktPn5UKCk7IH0KKworICBjb25zdGV4cHIgY29uc3QgVCYgZ2V0KCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUJj4odW5pb25fKTsgfQorICBUKiBnZXRfbXV0YWJsZSgpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCZ1bmlvbl8pOyB9CisKKyBwcml2YXRlOgorICB1bmlvbiBBbGlnbmVkVW5pb24geworICAgIGFsaWduYXMobWluX2FsaWduID4gYWxpZ25vZihUKSA/IG1pbl9hbGlnbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFsaWdub2YoVCkpIGNoYXIgc3BhY2Vbc2l6ZW9mKFQpXTsKKyAgICBpbnQ2NF90IGFsaWduX3RvX2ludDY0OworICAgIHZvaWQqIGFsaWduX3RvX3B0cjsKKyAgfSB1bmlvbl87Cit9OworCisvLyBBcmVuYVN0cmluZ1B0ciBjb21wYXRpYmxlIGV4cGxpY2l0bHkgY29uc3RydWN0ZWQgc3RyaW5nIHR5cGUuCisvLyBUaGlzIGVtcHR5IHN0cmluZyB0eXBlIGlzIGFsaWduZWQgd2l0aCBhIG1pbmltdW0gYWxpZ25tZW50IG9mIDggYnl0ZXMKKy8vIHdoaWNoIGlzIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50IG9mIEFyZW5hU3RyaW5nUHRyCit1c2luZyBFeHBsaWNpdGx5Q29uc3RydWN0ZWRBcmVuYVN0cmluZyA9IEV4cGxpY2l0bHlDb25zdHJ1Y3RlZDxzdGQ6OnN0cmluZywgOD47CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0VYUExJQ0lUTFlfQ09OU1RSVUNURURfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkYTRmNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5jYwpAQCAtMCwwICsxLDE5NjcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisKKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2lubC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGFfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wYXJzZV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4gIC8vIG11c3QgYmUgbGFzdC4KKy8vIGNsYW5nLWZvcm1hdCBvbgorbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworbmFtZXNwYWNlIHsKKworaW5saW5lIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgcmVhbF90eXBlKEZpZWxkVHlwZSB0eXBlKSB7CisgIEdPT0dMRV9EQ0hFQ0sodHlwZSA+IDAgJiYgdHlwZSA8PSBXaXJlRm9ybWF0TGl0ZTo6TUFYX0ZJRUxEX1RZUEUpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZT4odHlwZSk7Cit9CisKK2lubGluZSBXaXJlRm9ybWF0TGl0ZTo6Q3BwVHlwZSBjcHBfdHlwZShGaWVsZFR5cGUgdHlwZSkgeworICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZVRvQ3BwVHlwZShyZWFsX3R5cGUodHlwZSkpOworfQorCisvLyBSZWdpc3RyeSBzdHVmZi4KKworLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCB1c2UgaGV0ZXJlcm9nZW5lb3VzIGxvb2t1cCBmb3Igc3RkIGNvbnRhaW5lcnMgc2luY2Ugd2UKKy8vIG5lZWQgdG8gc3VwcG9ydCBDKysxMS4KK3N0cnVjdCBFeHRlbnNpb25FcSB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBFeHRlbnNpb25JbmZvJiBsaHMsIGNvbnN0IEV4dGVuc2lvbkluZm8mIHJocykgY29uc3QgeworICAgIHJldHVybiBsaHMubWVzc2FnZSA9PSByaHMubWVzc2FnZSAmJiBsaHMubnVtYmVyID09IHJocy5udW1iZXI7CisgIH0KK307CisKK3N0cnVjdCBFeHRlbnNpb25IYXNoZXIgeworICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IEV4dGVuc2lvbkluZm8mIGluZm8pIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpoYXNoPGNvbnN0IE1lc3NhZ2VMaXRlKj57fShpbmZvLm1lc3NhZ2UpIF4KKyAgICAgICAgICAgc3RkOjpoYXNoPGludD57fShpbmZvLm51bWJlcik7CisgIH0KK307CisKK3VzaW5nIEV4dGVuc2lvblJlZ2lzdHJ5ID0KKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8RXh0ZW5zaW9uSW5mbywgRXh0ZW5zaW9uSGFzaGVyLCBFeHRlbnNpb25FcT47CisKK3N0YXRpYyBjb25zdCBFeHRlbnNpb25SZWdpc3RyeSogZ2xvYmFsX3JlZ2lzdHJ5ID0gbnVsbHB0cjsKKworLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBhdCBzdGFydHVwLCBzbyB0aGVyZSBpcyBubyBuZWVkIGZvciB0aHJlYWQtCisvLyBzYWZldHkuCit2b2lkIFJlZ2lzdGVyKGNvbnN0IEV4dGVuc2lvbkluZm8mIGluZm8pIHsKKyAgc3RhdGljIGF1dG8gbG9jYWxfc3RhdGljX3JlZ2lzdHJ5ID0gT25TaHV0ZG93bkRlbGV0ZShuZXcgRXh0ZW5zaW9uUmVnaXN0cnkpOworICBnbG9iYWxfcmVnaXN0cnkgPSBsb2NhbF9zdGF0aWNfcmVnaXN0cnk7CisgIGlmICghSW5zZXJ0SWZOb3RQcmVzZW50KGxvY2FsX3N0YXRpY19yZWdpc3RyeSwgaW5mbykpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiTXVsdGlwbGUgZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbnMgZm9yIHR5cGUgXCIiCisgICAgICAgICAgICAgICA8PCBpbmZvLm1lc3NhZ2UtPkdldFR5cGVOYW1lKCkgPDwgIlwiLCBmaWVsZCBudW1iZXIgIgorICAgICAgICAgICAgICAgPDwgaW5mby5udW1iZXIgPDwgIi4iOworICB9Cit9CisKK2NvbnN0IEV4dGVuc2lvbkluZm8qIEZpbmRSZWdpc3RlcmVkRXh0ZW5zaW9uKGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIHsKKyAgaWYgKCFnbG9iYWxfcmVnaXN0cnkpIHJldHVybiBudWxscHRyOworCisgIEV4dGVuc2lvbkluZm8gaW5mbzsKKyAgaW5mby5tZXNzYWdlID0gZXh0ZW5kZWU7CisgIGluZm8ubnVtYmVyID0gbnVtYmVyOworCisgIGF1dG8gaXQgPSBnbG9iYWxfcmVnaXN0cnktPmZpbmQoaW5mbyk7CisgIGlmIChpdCA9PSBnbG9iYWxfcmVnaXN0cnktPmVuZCgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICYqaXQ7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgR2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyOjpGaW5kKGludCBudW1iZXIsIEV4dGVuc2lvbkluZm8qIG91dHB1dCkgeworICBjb25zdCBFeHRlbnNpb25JbmZvKiBleHRlbnNpb24gPSBGaW5kUmVnaXN0ZXJlZEV4dGVuc2lvbihleHRlbmRlZV8sIG51bWJlcik7CisgIGlmIChleHRlbnNpb24gPT0gbnVsbHB0cikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICAqb3V0cHV0ID0gKmV4dGVuc2lvbjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCit2b2lkIEV4dGVuc2lvblNldDo6UmVnaXN0ZXJFeHRlbnNpb24oY29uc3QgTWVzc2FnZUxpdGUqIGV4dGVuZGVlLCBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkVHlwZSB0eXBlLCBib29sIGlzX3JlcGVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhenlFYWdlclZlcmlmeUZuVHlwZSB2ZXJpZnlfZnVuYykgeworICBHT09HTEVfQ0hFQ0tfTkUodHlwZSwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTSk7CisgIEdPT0dMRV9DSEVDS19ORSh0eXBlLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFKTsKKyAgR09PR0xFX0NIRUNLX05FKHR5cGUsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0dST1VQKTsKKyAgRXh0ZW5zaW9uSW5mbyBpbmZvKGV4dGVuZGVlLCBudW1iZXIsIHR5cGUsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICB2ZXJpZnlfZnVuYyk7CisgIFJlZ2lzdGVyKGluZm8pOworfQorCitzdGF0aWMgYm9vbCBDYWxsTm9BcmdWYWxpZGl0eUZ1bmMoY29uc3Qgdm9pZCogYXJnLCBpbnQgbnVtYmVyKSB7CisgIC8vIE5vdGU6ICBNdXN0IHVzZSBDLXN0eWxlIGNhc3QgaGVyZSByYXRoZXIgdGhhbiByZWludGVycHJldF9jYXN0IGJlY2F1c2UKKyAgLy8gICB0aGUgQysrIHN0YW5kYXJkIGF0IG9uZSBwb2ludCBkaWQgbm90IGFsbG93IGNhc3RzIGJldHdlZW4gZnVuY3Rpb24gYW5kCisgIC8vICAgZGF0YSBwb2ludGVycyBhbmQgc29tZSBjb21waWxlcnMgZW5mb3JjZSB0aGlzIGZvciBDKystc3R5bGUgY2FzdHMuICBObworICAvLyAgIGNvbXBpbGVyIGVuZm9yY2VzIGl0IGZvciBDLXN0eWxlIGNhc3RzIHNpbmNlIGxvdHMgb2YgQy1zdHlsZSBjb2RlIGhhcworICAvLyAgIHJlbGllZCBvbiB0aGVzZSBraW5kcyBvZiBjYXN0cyBmb3IgYSBsb25nIHRpbWUsIGRlc3BpdGUgYmVpbmcKKyAgLy8gICB0ZWNobmljYWxseSB1bmRlZmluZWQuICBTZWU6CisgIC8vICAgICBodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTk1CisgIC8vIEFsc28gbm90ZTogIFNvbWUgY29tcGlsZXJzIGRvIG5vdCBhbGxvdyBmdW5jdGlvbiBwb2ludGVycyB0byBiZSAiY29uc3QiLgorICAvLyAgIFdoaWNoIG1ha2VzIHNlbnNlLCBJIHN1cHBvc2UsIGJlY2F1c2UgaXQncyBtZWFuaW5nbGVzcy4KKyAgcmV0dXJuICgoRW51bVZhbGlkaXR5RnVuYyopYXJnKShudW1iZXIpOworfQorCit2b2lkIEV4dGVuc2lvblNldDo6UmVnaXN0ZXJFbnVtRXh0ZW5zaW9uKGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVwZWF0ZWQsIGJvb2wgaXNfcGFja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsaWRpdHlGdW5jKiBpc192YWxpZCkgeworICBHT09HTEVfQ0hFQ0tfRVEodHlwZSwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTSk7CisgIEV4dGVuc2lvbkluZm8gaW5mbyhleHRlbmRlZSwgbnVtYmVyLCB0eXBlLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLCBudWxscHRyKTsKKyAgaW5mby5lbnVtX3ZhbGlkaXR5X2NoZWNrLmZ1bmMgPSBDYWxsTm9BcmdWYWxpZGl0eUZ1bmM7CisgIC8vIFNlZSBjb21tZW50IGluIENhbGxOb0FyZ1ZhbGlkaXR5RnVuYygpIGFib3V0IHdoeSB3ZSB1c2UgYSBjLXN0eWxlIGNhc3QuCisgIGluZm8uZW51bV92YWxpZGl0eV9jaGVjay5hcmcgPSAodm9pZCopaXNfdmFsaWQ7CisgIFJlZ2lzdGVyKGluZm8pOworfQorCit2b2lkIEV4dGVuc2lvblNldDo6UmVnaXN0ZXJNZXNzYWdlRXh0ZW5zaW9uKGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVwZWF0ZWQsIGJvb2wgaXNfcGFja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogcHJvdG90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXp5RWFnZXJWZXJpZnlGblR5cGUgdmVyaWZ5X2Z1bmMpIHsKKyAgR09PR0xFX0NIRUNLKHR5cGUgPT0gV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSB8fAorICAgICAgICB0eXBlID09IFdpcmVGb3JtYXRMaXRlOjpUWVBFX0dST1VQKTsKKyAgRXh0ZW5zaW9uSW5mbyBpbmZvKGV4dGVuZGVlLCBudW1iZXIsIHR5cGUsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICB2ZXJpZnlfZnVuYyk7CisgIGluZm8ubWVzc2FnZV9pbmZvID0ge3Byb3RvdHlwZX07CisgIFJlZ2lzdGVyKGluZm8pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb25zdHJ1Y3RvcnMgYW5kIGJhc2ljIG1ldGhvZHMuCisKK0V4dGVuc2lvblNldDo6RXh0ZW5zaW9uU2V0KEFyZW5hKiBhcmVuYSkKKyAgICA6IGFyZW5hXyhhcmVuYSksCisgICAgICBmbGF0X2NhcGFjaXR5XygwKSwKKyAgICAgIGZsYXRfc2l6ZV8oMCksCisgICAgICBtYXBfe2ZsYXRfY2FwYWNpdHlfID09IDAKKyAgICAgICAgICAgICAgID8gbnVsbHB0cgorICAgICAgICAgICAgICAgOiBBcmVuYTo6Q3JlYXRlQXJyYXk8S2V5VmFsdWU+KGFyZW5hXywgZmxhdF9jYXBhY2l0eV8pfSB7fQorCitFeHRlbnNpb25TZXQ6On5FeHRlbnNpb25TZXQoKSB7CisgIC8vIERlbGV0ZXMgYWxsIGFsbG9jYXRlZCBleHRlbnNpb25zLgorICBpZiAoYXJlbmFfID09IG51bGxwdHIpIHsKKyAgICBGb3JFYWNoKFtdKGludCAvKiBudW1iZXIgKi8sIEV4dGVuc2lvbiYgZXh0KSB7IGV4dC5GcmVlKCk7IH0pOworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKGlzX2xhcmdlKCkpKSB7CisgICAgICBkZWxldGUgbWFwXy5sYXJnZTsKKyAgICB9IGVsc2UgeworICAgICAgRGVsZXRlRmxhdE1hcChtYXBfLmZsYXQsIGZsYXRfY2FwYWNpdHlfKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBFeHRlbnNpb25TZXQ6OkRlbGV0ZUZsYXRNYXAoY29uc3QgRXh0ZW5zaW9uU2V0OjpLZXlWYWx1ZSogZmxhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZsYXRfY2FwYWNpdHkpIHsKKyAgLy8gQXJlbmE6OkNyZWF0ZUFycmF5IGFscmVhZHkgcmVxdWlyZXMgYSB0cml2aWFsbHkgZGVzdHJ1Y3RpYmxlIHR5cGUsIGJ1dAorICAvLyBlbnN1cmUgdGhpcyBjb25zdHJhaW50IGlzIG5vdCB2aW9sYXRlZCBpbiB0aGUgZnV0dXJlLgorICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZTxLZXlWYWx1ZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICJDcmVhdGVBcnJheSByZXF1aXJlcyBhIHRyaXZpYWxseSBkZXN0cnVjdGlibGUgdHlwZSIpOworICAvLyBBIGNvbnN0LWNhc3QgaXMgbmVlZGVkLCBidXQgdGhpcyBpcyBzYWZlIGFzIHdlIGFyZSBhYm91dCB0byBkZWFsbG9jYXRlIHRoZQorICAvLyBhcnJheS4KKyAgaW50ZXJuYWw6OlNpemVkQXJyYXlEZWxldGUoY29uc3RfY2FzdDxLZXlWYWx1ZSo+KGZsYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmZsYXQpICogZmxhdF9jYXBhY2l0eSk7Cit9CisKKy8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KKy8vIHZvaWQgRXh0ZW5zaW9uU2V0OjpBcHBlbmRUb0xpc3QoY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dHB1dCkgY29uc3QKKworYm9vbCBFeHRlbnNpb25TZXQ6OkhhcyhpbnQgbnVtYmVyKSBjb25zdCB7CisgIGNvbnN0IEV4dGVuc2lvbiogZXh0ID0gRmluZE9yTnVsbChudW1iZXIpOworICBpZiAoZXh0ID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKyAgR09PR0xFX0RDSEVDSyghZXh0LT5pc19yZXBlYXRlZCk7CisgIHJldHVybiAhZXh0LT5pc19jbGVhcmVkOworfQorCitib29sIEV4dGVuc2lvblNldDo6SGFzTGF6eShpbnQgbnVtYmVyKSBjb25zdCB7CisgIHJldHVybiBIYXMobnVtYmVyKSAmJiBGaW5kT3JOdWxsKG51bWJlciktPmlzX2xhenk7Cit9CisKK2ludCBFeHRlbnNpb25TZXQ6Ok51bUV4dGVuc2lvbnMoKSBjb25zdCB7CisgIGludCByZXN1bHQgPSAwOworICBGb3JFYWNoKFsmcmVzdWx0XShpbnQgLyogbnVtYmVyICovLCBjb25zdCBFeHRlbnNpb24mIGV4dCkgeworICAgIGlmICghZXh0LmlzX2NsZWFyZWQpIHsKKyAgICAgICsrcmVzdWx0OworICAgIH0KKyAgfSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvblNpemUoaW50IG51bWJlcikgY29uc3QgeworICBjb25zdCBFeHRlbnNpb24qIGV4dCA9IEZpbmRPck51bGwobnVtYmVyKTsKKyAgcmV0dXJuIGV4dCA9PSBudWxscHRyID8gMCA6IGV4dC0+R2V0U2l6ZSgpOworfQorCitGaWVsZFR5cGUgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb25UeXBlKGludCBudW1iZXIpIGNvbnN0IHsKKyAgY29uc3QgRXh0ZW5zaW9uKiBleHQgPSBGaW5kT3JOdWxsKG51bWJlcik7CisgIGlmIChleHQgPT0gbnVsbHB0cikgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiRG9uJ3QgbG9va3VwIGV4dGVuc2lvbiB0eXBlcyBpZiB0aGV5IGFyZW4ndCBwcmVzZW50ICgxKS4gIjsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZXh0LT5pc19jbGVhcmVkKSB7CisgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJEb24ndCBsb29rdXAgZXh0ZW5zaW9uIHR5cGVzIGlmIHRoZXkgYXJlbid0IHByZXNlbnQgKDIpLiAiOworICB9CisgIHJldHVybiBleHQtPnR5cGU7Cit9CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpDbGVhckV4dGVuc2lvbihpbnQgbnVtYmVyKSB7CisgIEV4dGVuc2lvbiogZXh0ID0gRmluZE9yTnVsbChudW1iZXIpOworICBpZiAoZXh0ID09IG51bGxwdHIpIHJldHVybjsKKyAgZXh0LT5DbGVhcigpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWVsZCBhY2Nlc3NvcnMKKworbmFtZXNwYWNlIHsKKworZW51bSB7IFJFUEVBVEVEX0ZJRUxELCBPUFRJT05BTF9GSUVMRCB9OworCit9ICAvLyBuYW1lc3BhY2UKKworI2RlZmluZSBHT09HTEVfRENIRUNLX1RZUEUoRVhURU5TSU9OLCBMQUJFTCwgQ1BQVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdPT0dMRV9EQ0hFQ0tfRVEoKEVYVEVOU0lPTikuaXNfcmVwZWF0ZWQgPyBSRVBFQVRFRF9GSUVMRCA6IE9QVElPTkFMX0ZJRUxELCBMQUJFTCk7IFwKKyAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZSgoRVhURU5TSU9OKS50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNDUFBUWVBFKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmltaXRpdmVzCisKKyNkZWZpbmUgUFJJTUlUSVZFX0FDQ0VTU09SUyhVUFBFUkNBU0UsIExPV0VSQ0FTRSwgQ0FNRUxDQVNFKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTE9XRVJDQVNFIEV4dGVuc2lvblNldDo6R2V0IyNDQU1FTENBU0UoaW50IG51bWJlciwgTE9XRVJDQVNFIGRlZmF1bHRfdmFsdWUpIFwKKyAgICAgIGNvbnN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBFeHRlbnNpb24qIGV4dGVuc2lvbiA9IEZpbmRPck51bGwobnVtYmVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZXh0ZW5zaW9uID09IG51bGxwdHIgfHwgZXh0ZW5zaW9uLT5pc19jbGVhcmVkKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBPUFRJT05BTF9GSUVMRCwgVVBQRVJDQVNFKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZXh0ZW5zaW9uLT5MT1dFUkNBU0UjI192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IExPV0VSQ0FTRSYgRXh0ZW5zaW9uU2V0OjpHZXRSZWYjI0NBTUVMQ0FTRSggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgbnVtYmVyLCBjb25zdCBMT1dFUkNBU0UmIGRlZmF1bHRfdmFsdWUpIGNvbnN0IHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgRXh0ZW5zaW9uKiBleHRlbnNpb24gPSBGaW5kT3JOdWxsKG51bWJlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxscHRyIHx8IGV4dGVuc2lvbi0+aXNfY2xlYXJlZCkgeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUxfRklFTEQsIFVQUEVSQ0FTRSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGV4dGVuc2lvbi0+TE9XRVJDQVNFIyNfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEV4dGVuc2lvblNldDo6U2V0IyNDQU1FTENBU0UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9XRVJDQVNFIHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7ICAgICAgXAorICAgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV8jI1VQUEVSQ0FTRSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBPUFRJT05BTF9GSUVMRCwgVVBQRVJDQVNFKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXh0ZW5zaW9uLT5MT1dFUkNBU0UjI192YWx1ZSA9IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIExPV0VSQ0FTRSBFeHRlbnNpb25TZXQ6OkdldFJlcGVhdGVkIyNDQU1FTENBU0UoaW50IG51bWJlciwgaW50IGluZGV4KSAgICAgICBcCisgICAgICBjb25zdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgRXh0ZW5zaW9uKiBleHRlbnNpb24gPSBGaW5kT3JOdWxsKG51bWJlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09PR0xFX0NIRUNLKGV4dGVuc2lvbiAhPSBudWxscHRyKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7ICAgXAorICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBSRVBFQVRFRF9GSUVMRCwgVVBQRVJDQVNFKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZXh0ZW5zaW9uLT5yZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5HZXQoaW5kZXgpOyAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgTE9XRVJDQVNFJiBFeHRlbnNpb25TZXQ6OkdldFJlZlJlcGVhdGVkIyNDQU1FTENBU0UoaW50IG51bWJlciwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdCB7IFwKKyAgICBjb25zdCBFeHRlbnNpb24qIGV4dGVuc2lvbiA9IEZpbmRPck51bGwobnVtYmVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT09HTEVfQ0hFQ0soZXh0ZW5zaW9uICE9IG51bGxwdHIpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsgICBcCisgICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIFJFUEVBVEVEX0ZJRUxELCBVUFBFUkNBU0UpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBleHRlbnNpb24tPnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPkdldChpbmRleCk7ICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEV4dGVuc2lvblNldDo6U2V0UmVwZWF0ZWQjI0NBTUVMQ0FTRShpbnQgbnVtYmVyLCBpbnQgaW5kZXgsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT1dFUkNBU0UgdmFsdWUpIHsgICAgICAgICAgICAgICAgXAorICAgIEV4dGVuc2lvbiogZXh0ZW5zaW9uID0gRmluZE9yTnVsbChudW1iZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPT0dMRV9DSEVDSyhleHRlbnNpb24gIT0gbnVsbHB0cikgPDwgIkluZGV4IG91dC1vZi1ib3VuZHMgKGZpZWxkIGlzIGVtcHR5KS4iOyAgIFwKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURURfRklFTEQsIFVQUEVSQ0FTRSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5TZXQoaW5kZXgsIHZhbHVlKTsgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgRXh0ZW5zaW9uU2V0OjpBZGQjI0NBTUVMQ0FTRShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCBwYWNrZWQsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT1dFUkNBU0UgdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsgICAgICBcCisgICAgRXh0ZW5zaW9uKiBleHRlbnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKG51bWJlciwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICBleHRlbnNpb24tPnR5cGUgPSB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFXyMjVVBQRVJDQVNFKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZXh0ZW5zaW9uLT5pc19wYWNrZWQgPSBwYWNrZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkRmllbGQ8TE9XRVJDQVNFPj4oYXJlbmFfKTsgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIFJFUEVBVEVEX0ZJRUxELCBVUFBFUkNBU0UpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZXh0ZW5zaW9uLT5pc19wYWNrZWQsIHBhY2tlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5BZGQodmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworUFJJTUlUSVZFX0FDQ0VTU09SUyhJTlQzMiwgaW50MzJfdCwgSW50MzIpCitQUklNSVRJVkVfQUNDRVNTT1JTKElOVDY0LCBpbnQ2NF90LCBJbnQ2NCkKK1BSSU1JVElWRV9BQ0NFU1NPUlMoVUlOVDMyLCB1aW50MzJfdCwgVUludDMyKQorUFJJTUlUSVZFX0FDQ0VTU09SUyhVSU5UNjQsIHVpbnQ2NF90LCBVSW50NjQpCitQUklNSVRJVkVfQUNDRVNTT1JTKEZMT0FULCBmbG9hdCwgRmxvYXQpCitQUklNSVRJVkVfQUNDRVNTT1JTKERPVUJMRSwgZG91YmxlLCBEb3VibGUpCitQUklNSVRJVkVfQUNDRVNTT1JTKEJPT0wsIGJvb2wsIEJvb2wpCisKKyN1bmRlZiBQUklNSVRJVkVfQUNDRVNTT1JTCisKK2NvbnN0IHZvaWQqIEV4dGVuc2lvblNldDo6R2V0UmF3UmVwZWF0ZWRGaWVsZChpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRlZmF1bHRfdmFsdWUpIGNvbnN0IHsKKyAgY29uc3QgRXh0ZW5zaW9uKiBleHRlbnNpb24gPSBGaW5kT3JOdWxsKG51bWJlcik7CisgIGlmIChleHRlbnNpb24gPT0gbnVsbHB0cikgeworICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisgIC8vIFdlIGFzc3VtZSB0aGF0IGFsbCB0aGUgUmVwZWF0ZWRGaWVsZDw+KiBwb2ludGVycyBoYXZlIHRoZSBzYW1lCisgIC8vIHNpemUgYW5kIGFsaWdubWVudCB3aXRoaW4gdGhlIGFub255bW91cyB1bmlvbiBpbiBFeHRlbnNpb24uCisgIHJldHVybiBleHRlbnNpb24tPnJlcGVhdGVkX2ludDMyX3RfdmFsdWU7Cit9CisKK3ZvaWQqIEV4dGVuc2lvblNldDo6TXV0YWJsZVJhd1JlcGVhdGVkRmllbGQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcGFja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2MpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247CisKKyAgLy8gV2UgaW5zdGFudGlhdGUgYW4gZW1wdHkgUmVwZWF0ZWR7LFB0cn1GaWVsZCBpZiBvbmUgZG9lc24ndCBleGlzdCBmb3IgdGhpcworICAvLyBleHRlbnNpb24uCisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2MsICZleHRlbnNpb24pKSB7CisgICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IHRydWU7CisgICAgZXh0ZW5zaW9uLT50eXBlID0gZmllbGRfdHlwZTsKKyAgICBleHRlbnNpb24tPmlzX3BhY2tlZCA9IHBhY2tlZDsKKworICAgIHN3aXRjaCAoV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZVRvQ3BwVHlwZSgKKyAgICAgICAgc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZT4oZmllbGRfdHlwZSkpKSB7CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0lOVDMyOgorICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2ludDMyX3RfdmFsdWUgPQorICAgICAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRGaWVsZDxpbnQzMl90Pj4oYXJlbmFfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0lOVDY0OgorICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2ludDY0X3RfdmFsdWUgPQorICAgICAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRGaWVsZDxpbnQ2NF90Pj4oYXJlbmFfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF91aW50MzJfdF92YWx1ZSA9CisgICAgICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPHVpbnQzMl90Pj4oYXJlbmFfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF91aW50NjRfdF92YWx1ZSA9CisgICAgICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPHVpbnQ2NF90Pj4oYXJlbmFfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0RPVUJMRToKKyAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9kb3VibGVfdmFsdWUgPQorICAgICAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRGaWVsZDxkb3VibGU+PihhcmVuYV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRkxPQVQ6CisgICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZmxvYXRfdmFsdWUgPQorICAgICAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRGaWVsZDxmbG9hdD4+KGFyZW5hXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9CT09MOgorICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2Jvb2xfdmFsdWUgPQorICAgICAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRGaWVsZDxib29sPj4oYXJlbmFfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0VOVU06CisgICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZW51bV92YWx1ZSA9CisgICAgICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPGludD4+KGFyZW5hXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfc3RyaW5nX3ZhbHVlID0KKyAgICAgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+PihhcmVuYV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlID0KKyAgICAgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+PihhcmVuYV8pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBXZSBhc3N1bWUgdGhhdCBhbGwgdGhlIFJlcGVhdGVkRmllbGQ8PiogcG9pbnRlcnMgaGF2ZSB0aGUgc2FtZQorICAvLyBzaXplIGFuZCBhbGlnbm1lbnQgd2l0aGluIHRoZSBhbm9ueW1vdXMgdW5pb24gaW4gRXh0ZW5zaW9uLgorICByZXR1cm4gZXh0ZW5zaW9uLT5yZXBlYXRlZF9pbnQzMl90X3ZhbHVlOworfQorCisvLyBDb21wYXRpYmxlIHZlcnNpb24gdXNpbmcgb2xkIGNhbGwgc2lnbmF0dXJlLiBEb2VzIG5vdCBjcmVhdGUgZXh0ZW5zaW9ucyB3aGVuCisvLyB0aGUgZG9uJ3QgYWxyZWFkeSBleGlzdDsgaW5zdGVhZCwganVzdCBHT09HTEVfQ0hFQ0stZmFpbHMuCit2b2lkKiBFeHRlbnNpb25TZXQ6Ok11dGFibGVSYXdSZXBlYXRlZEZpZWxkKGludCBudW1iZXIpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb24gPSBGaW5kT3JOdWxsKG51bWJlcik7CisgIEdPT0dMRV9DSEVDSyhleHRlbnNpb24gIT0gbnVsbHB0cikgPDwgIkV4dGVuc2lvbiBub3QgZm91bmQuIjsKKyAgLy8gV2UgYXNzdW1lIHRoYXQgYWxsIHRoZSBSZXBlYXRlZEZpZWxkPD4qIHBvaW50ZXJzIGhhdmUgdGhlIHNhbWUKKyAgLy8gc2l6ZSBhbmQgYWxpZ25tZW50IHdpdGhpbiB0aGUgYW5vbnltb3VzIHVuaW9uIGluIEV4dGVuc2lvbi4KKyAgcmV0dXJuIGV4dGVuc2lvbi0+cmVwZWF0ZWRfaW50MzJfdF92YWx1ZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW51bXMKKworaW50IEV4dGVuc2lvblNldDo6R2V0RW51bShpbnQgbnVtYmVyLCBpbnQgZGVmYXVsdF92YWx1ZSkgY29uc3QgeworICBjb25zdCBFeHRlbnNpb24qIGV4dGVuc2lvbiA9IEZpbmRPck51bGwobnVtYmVyKTsKKyAgaWYgKGV4dGVuc2lvbiA9PSBudWxscHRyIHx8IGV4dGVuc2lvbi0+aXNfY2xlYXJlZCkgeworICAgIC8vIE5vdCBwcmVzZW50LiAgUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBPUFRJT05BTF9GSUVMRCwgRU5VTSk7CisgICAgcmV0dXJuIGV4dGVuc2lvbi0+ZW51bV92YWx1ZTsKKyAgfQorfQorCitjb25zdCBpbnQmIEV4dGVuc2lvblNldDo6R2V0UmVmRW51bShpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50JiBkZWZhdWx0X3ZhbHVlKSBjb25zdCB7CisgIGNvbnN0IEV4dGVuc2lvbiogZXh0ZW5zaW9uID0gRmluZE9yTnVsbChudW1iZXIpOworICBpZiAoZXh0ZW5zaW9uID09IG51bGxwdHIgfHwgZXh0ZW5zaW9uLT5pc19jbGVhcmVkKSB7CisgICAgLy8gTm90IHByZXNlbnQuICBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIE9QVElPTkFMX0ZJRUxELCBFTlVNKTsKKyAgICByZXR1cm4gZXh0ZW5zaW9uLT5lbnVtX3ZhbHVlOworICB9Cit9CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpTZXRFbnVtKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBpbnQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247CisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7CisgICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsKKyAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0VOVU0pOworICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUxfRklFTEQsIEVOVU0pOworICB9CisgIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOworICBleHRlbnNpb24tPmVudW1fdmFsdWUgPSB2YWx1ZTsKK30KKworaW50IEV4dGVuc2lvblNldDo6R2V0UmVwZWF0ZWRFbnVtKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3QgeworICBjb25zdCBFeHRlbnNpb24qIGV4dGVuc2lvbiA9IEZpbmRPck51bGwobnVtYmVyKTsKKyAgR09PR0xFX0NIRUNLKGV4dGVuc2lvbiAhPSBudWxscHRyKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7CisgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBSRVBFQVRFRF9GSUVMRCwgRU5VTSk7CisgIHJldHVybiBleHRlbnNpb24tPnJlcGVhdGVkX2VudW1fdmFsdWUtPkdldChpbmRleCk7Cit9CisKK2NvbnN0IGludCYgRXh0ZW5zaW9uU2V0OjpHZXRSZWZSZXBlYXRlZEVudW0oaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdCB7CisgIGNvbnN0IEV4dGVuc2lvbiogZXh0ZW5zaW9uID0gRmluZE9yTnVsbChudW1iZXIpOworICBHT09HTEVfQ0hFQ0soZXh0ZW5zaW9uICE9IG51bGxwdHIpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKKyAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIFJFUEVBVEVEX0ZJRUxELCBFTlVNKTsKKyAgcmV0dXJuIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZW51bV92YWx1ZS0+R2V0KGluZGV4KTsKK30KKwordm9pZCBFeHRlbnNpb25TZXQ6OlNldFJlcGVhdGVkRW51bShpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIGludCB2YWx1ZSkgeworICBFeHRlbnNpb24qIGV4dGVuc2lvbiA9IEZpbmRPck51bGwobnVtYmVyKTsKKyAgR09PR0xFX0NIRUNLKGV4dGVuc2lvbiAhPSBudWxscHRyKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7CisgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBSRVBFQVRFRF9GSUVMRCwgRU5VTSk7CisgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZW51bV92YWx1ZS0+U2V0KGluZGV4LCB2YWx1ZSk7Cit9CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpBZGRFbnVtKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sIHBhY2tlZCwgaW50IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICBpZiAoTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgeworICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7CisgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9FTlVNKTsKKyAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKKyAgICBleHRlbnNpb24tPmlzX3BhY2tlZCA9IHBhY2tlZDsKKyAgICBleHRlbnNpb24tPnJlcGVhdGVkX2VudW1fdmFsdWUgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPGludD4+KGFyZW5hXyk7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIFJFUEVBVEVEX0ZJRUxELCBFTlVNKTsKKyAgICBHT09HTEVfRENIRUNLX0VRKGV4dGVuc2lvbi0+aXNfcGFja2VkLCBwYWNrZWQpOworICB9CisgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZW51bV92YWx1ZS0+QWRkKHZhbHVlKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3RyaW5ncworCitjb25zdCBzdGQ6OnN0cmluZyYgRXh0ZW5zaW9uU2V0OjpHZXRTdHJpbmcoCisgICAgaW50IG51bWJlciwgY29uc3Qgc3RkOjpzdHJpbmcmIGRlZmF1bHRfdmFsdWUpIGNvbnN0IHsKKyAgY29uc3QgRXh0ZW5zaW9uKiBleHRlbnNpb24gPSBGaW5kT3JOdWxsKG51bWJlcik7CisgIGlmIChleHRlbnNpb24gPT0gbnVsbHB0ciB8fCBleHRlbnNpb24tPmlzX2NsZWFyZWQpIHsKKyAgICAvLyBOb3QgcHJlc2VudC4gIFJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUxfRklFTEQsIFNUUklORyk7CisgICAgcmV0dXJuICpleHRlbnNpb24tPnN0cmluZ192YWx1ZTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyogRXh0ZW5zaW9uU2V0OjpNdXRhYmxlU3RyaW5nKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247CisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7CisgICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsKKyAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX1NUUklORyk7CisgICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IGZhbHNlOworICAgIGV4dGVuc2lvbi0+c3RyaW5nX3ZhbHVlID0gQXJlbmE6OkNyZWF0ZTxzdGQ6OnN0cmluZz4oYXJlbmFfKTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUxfRklFTEQsIFNUUklORyk7CisgIH0KKyAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7CisgIHJldHVybiBleHRlbnNpb24tPnN0cmluZ192YWx1ZTsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcmIEV4dGVuc2lvblNldDo6R2V0UmVwZWF0ZWRTdHJpbmcoaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QgeworICBjb25zdCBFeHRlbnNpb24qIGV4dGVuc2lvbiA9IEZpbmRPck51bGwobnVtYmVyKTsKKyAgR09PR0xFX0NIRUNLKGV4dGVuc2lvbiAhPSBudWxscHRyKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7CisgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBSRVBFQVRFRF9GSUVMRCwgU1RSSU5HKTsKKyAgcmV0dXJuIGV4dGVuc2lvbi0+cmVwZWF0ZWRfc3RyaW5nX3ZhbHVlLT5HZXQoaW5kZXgpOworfQorCitzdGQ6OnN0cmluZyogRXh0ZW5zaW9uU2V0OjpNdXRhYmxlUmVwZWF0ZWRTdHJpbmcoaW50IG51bWJlciwgaW50IGluZGV4KSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uID0gRmluZE9yTnVsbChudW1iZXIpOworICBHT09HTEVfQ0hFQ0soZXh0ZW5zaW9uICE9IG51bGxwdHIpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKKyAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIFJFUEVBVEVEX0ZJRUxELCBTVFJJTkcpOworICByZXR1cm4gZXh0ZW5zaW9uLT5yZXBlYXRlZF9zdHJpbmdfdmFsdWUtPk11dGFibGUoaW5kZXgpOworfQorCitzdGQ6OnN0cmluZyogRXh0ZW5zaW9uU2V0OjpBZGRTdHJpbmcoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICBpZiAoTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgeworICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7CisgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkcpOworICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSB0cnVlOworICAgIGV4dGVuc2lvbi0+aXNfcGFja2VkID0gZmFsc2U7CisgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9zdHJpbmdfdmFsdWUgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPj4oYXJlbmFfKTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURURfRklFTEQsIFNUUklORyk7CisgIH0KKyAgcmV0dXJuIGV4dGVuc2lvbi0+cmVwZWF0ZWRfc3RyaW5nX3ZhbHVlLT5BZGQoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWVzc2FnZXMKKworY29uc3QgTWVzc2FnZUxpdGUmIEV4dGVuc2lvblNldDo6R2V0TWVzc2FnZSgKKyAgICBpbnQgbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgZGVmYXVsdF92YWx1ZSkgY29uc3QgeworICBjb25zdCBFeHRlbnNpb24qIGV4dGVuc2lvbiA9IEZpbmRPck51bGwobnVtYmVyKTsKKyAgaWYgKGV4dGVuc2lvbiA9PSBudWxscHRyKSB7CisgICAgLy8gTm90IHByZXNlbnQuICBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIE9QVElPTkFMX0ZJRUxELCBNRVNTQUdFKTsKKyAgICBpZiAoZXh0ZW5zaW9uLT5pc19sYXp5KSB7CisgICAgICByZXR1cm4gZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+R2V0TWVzc2FnZShkZWZhdWx0X3ZhbHVlLCBhcmVuYV8pOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gKmV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKKyAgICB9CisgIH0KK30KKworLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgorLy8gY29uc3QgTWVzc2FnZUxpdGUmIEV4dGVuc2lvblNldDo6R2V0TWVzc2FnZShpbnQgbnVtYmVyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KSBjb25zdAorCitNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpNdXRhYmxlTWVzc2FnZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBwcm90b3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247CisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7CisgICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsKKyAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0UpOworICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsKKyAgICBleHRlbnNpb24tPmlzX2xhenkgPSBmYWxzZTsKKyAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBwcm90b3R5cGUuTmV3KGFyZW5hXyk7CisgICAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7CisgICAgcmV0dXJuIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUxfRklFTEQsIE1FU1NBR0UpOworICAgIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOworICAgIGlmIChleHRlbnNpb24tPmlzX2xhenkpIHsKKyAgICAgIHJldHVybiBleHRlbnNpb24tPmxhenltZXNzYWdlX3ZhbHVlLT5NdXRhYmxlTWVzc2FnZShwcm90b3R5cGUsIGFyZW5hXyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWU7CisgICAgfQorICB9Cit9CisKKy8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KKy8vIE1lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6Ok11dGFibGVNZXNzYWdlKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpCisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpTZXRBbGxvY2F0ZWRNZXNzYWdlKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpIHsKKyAgaWYgKG1lc3NhZ2UgPT0gbnVsbHB0cikgeworICAgIENsZWFyRXh0ZW5zaW9uKG51bWJlcik7CisgICAgcmV0dXJuOworICB9CisgIEdPT0dMRV9EQ0hFQ0sobWVzc2FnZS0+R2V0T3duaW5nQXJlbmEoKSA9PSBudWxscHRyIHx8CisgICAgICAgICBtZXNzYWdlLT5HZXRPd25pbmdBcmVuYSgpID09IGFyZW5hXyk7CisgIEFyZW5hKiBtZXNzYWdlX2FyZW5hID0gbWVzc2FnZS0+R2V0T3duaW5nQXJlbmEoKTsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247CisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7CisgICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsKKyAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0UpOworICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsKKyAgICBleHRlbnNpb24tPmlzX2xhenkgPSBmYWxzZTsKKyAgICBpZiAobWVzc2FnZV9hcmVuYSA9PSBhcmVuYV8pIHsKKyAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9IG1lc3NhZ2U7CisgICAgfSBlbHNlIGlmIChtZXNzYWdlX2FyZW5hID09IG51bGxwdHIpIHsKKyAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9IG1lc3NhZ2U7CisgICAgICBhcmVuYV8tPk93bihtZXNzYWdlKTsgIC8vIG5vdCBudWxscHRyIGJlY2F1c2Ugbm90IGVxdWFsIHRvIG1lc3NhZ2VfYXJlbmEKKyAgICB9IGVsc2UgeworICAgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlID0gbWVzc2FnZS0+TmV3KGFyZW5hXyk7CisgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUtPkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgqbWVzc2FnZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBPUFRJT05BTF9GSUVMRCwgTUVTU0FHRSk7CisgICAgaWYgKGV4dGVuc2lvbi0+aXNfbGF6eSkgeworICAgICAgZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+U2V0QWxsb2NhdGVkTWVzc2FnZShtZXNzYWdlLCBhcmVuYV8pOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoYXJlbmFfID09IG51bGxwdHIpIHsKKyAgICAgICAgZGVsZXRlIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChtZXNzYWdlX2FyZW5hID09IGFyZW5hXykgeworICAgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBtZXNzYWdlOworICAgICAgfSBlbHNlIGlmIChtZXNzYWdlX2FyZW5hID09IG51bGxwdHIpIHsKKyAgICAgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlID0gbWVzc2FnZTsKKyAgICAgICAgYXJlbmFfLT5Pd24obWVzc2FnZSk7ICAvLyBub3QgbnVsbHB0ciBiZWNhdXNlIG5vdCBlcXVhbCB0byBtZXNzYWdlX2FyZW5hCisgICAgICB9IGVsc2UgeworICAgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBtZXNzYWdlLT5OZXcoYXJlbmFfKTsKKyAgICAgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oKm1lc3NhZ2UpOworICAgICAgfQorICAgIH0KKyAgfQorICBleHRlbnNpb24tPmlzX2NsZWFyZWQgPSBmYWxzZTsKK30KKwordm9pZCBFeHRlbnNpb25TZXQ6OlVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZSgKKyAgICBpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKSB7CisgIGlmIChtZXNzYWdlID09IG51bGxwdHIpIHsKKyAgICBDbGVhckV4dGVuc2lvbihudW1iZXIpOworICAgIHJldHVybjsKKyAgfQorICBFeHRlbnNpb24qIGV4dGVuc2lvbjsKKyAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKG51bWJlciwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsKKyAgICBleHRlbnNpb24tPnR5cGUgPSB0eXBlOworICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRSk7CisgICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IGZhbHNlOworICAgIGV4dGVuc2lvbi0+aXNfbGF6eSA9IGZhbHNlOworICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9IG1lc3NhZ2U7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIE9QVElPTkFMX0ZJRUxELCBNRVNTQUdFKTsKKyAgICBpZiAoZXh0ZW5zaW9uLT5pc19sYXp5KSB7CisgICAgICBleHRlbnNpb24tPmxhenltZXNzYWdlX3ZhbHVlLT5VbnNhZmVBcmVuYVNldEFsbG9jYXRlZE1lc3NhZ2UobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVuYV8pOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoYXJlbmFfID09IG51bGxwdHIpIHsKKyAgICAgICAgZGVsZXRlIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKKyAgICAgIH0KKyAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9IG1lc3NhZ2U7CisgICAgfQorICB9CisgIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOworfQorCitNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpSZWxlYXNlTWVzc2FnZShpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSkgeworICBFeHRlbnNpb24qIGV4dGVuc2lvbiA9IEZpbmRPck51bGwobnVtYmVyKTsKKyAgaWYgKGV4dGVuc2lvbiA9PSBudWxscHRyKSB7CisgICAgLy8gTm90IHByZXNlbnQuICBSZXR1cm4gbnVsbHB0ci4KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUxfRklFTEQsIE1FU1NBR0UpOworICAgIE1lc3NhZ2VMaXRlKiByZXQgPSBudWxscHRyOworICAgIGlmIChleHRlbnNpb24tPmlzX2xhenkpIHsKKyAgICAgIHJldCA9IGV4dGVuc2lvbi0+bGF6eW1lc3NhZ2VfdmFsdWUtPlJlbGVhc2VNZXNzYWdlKHByb3RvdHlwZSwgYXJlbmFfKTsKKyAgICAgIGlmIChhcmVuYV8gPT0gbnVsbHB0cikgeworICAgICAgICBkZWxldGUgZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGFyZW5hXyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldCA9IGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJlbGVhc2VNZXNzYWdlKCkgYWx3YXlzIHJldHVybnMgYSBoZWFwLWFsbG9jYXRlZCBtZXNzYWdlLCBhbmQgd2UgYXJlCisgICAgICAgIC8vIG9uIGFuIGFyZW5hLCBzbyB3ZSBuZWVkIHRvIG1ha2UgYSBjb3B5IG9mIHRoaXMgbWVzc2FnZSB0byByZXR1cm4uCisgICAgICAgIHJldCA9IGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZS0+TmV3KCk7CisgICAgICAgIHJldC0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKCpleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUpOworICAgICAgfQorICAgIH0KKyAgICBFcmFzZShudW1iZXIpOworICAgIHJldHVybiByZXQ7CisgIH0KK30KKworTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6VW5zYWZlQXJlbmFSZWxlYXNlTWVzc2FnZSgKKyAgICBpbnQgbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlKSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uID0gRmluZE9yTnVsbChudW1iZXIpOworICBpZiAoZXh0ZW5zaW9uID09IG51bGxwdHIpIHsKKyAgICAvLyBOb3QgcHJlc2VudC4gIFJldHVybiBudWxscHRyLgorICAgIHJldHVybiBudWxscHRyOworICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBPUFRJT05BTF9GSUVMRCwgTUVTU0FHRSk7CisgICAgTWVzc2FnZUxpdGUqIHJldCA9IG51bGxwdHI7CisgICAgaWYgKGV4dGVuc2lvbi0+aXNfbGF6eSkgeworICAgICAgcmV0ID0gZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+VW5zYWZlQXJlbmFSZWxlYXNlTWVzc2FnZShwcm90b3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZW5hXyk7CisgICAgICBpZiAoYXJlbmFfID09IG51bGxwdHIpIHsKKyAgICAgICAgZGVsZXRlIGV4dGVuc2lvbi0+bGF6eW1lc3NhZ2VfdmFsdWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKKyAgICB9CisgICAgRXJhc2UobnVtYmVyKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKKy8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KKy8vIE1lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6OlJlbGVhc2VNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KTsKKworY29uc3QgTWVzc2FnZUxpdGUmIEV4dGVuc2lvblNldDo6R2V0UmVwZWF0ZWRNZXNzYWdlKGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdCB7CisgIGNvbnN0IEV4dGVuc2lvbiogZXh0ZW5zaW9uID0gRmluZE9yTnVsbChudW1iZXIpOworICBHT09HTEVfQ0hFQ0soZXh0ZW5zaW9uICE9IG51bGxwdHIpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKKyAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIFJFUEVBVEVEX0ZJRUxELCBNRVNTQUdFKTsKKyAgcmV0dXJuIGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+R2V0KGluZGV4KTsKK30KKworTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6TXV0YWJsZVJlcGVhdGVkTWVzc2FnZShpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb24gPSBGaW5kT3JOdWxsKG51bWJlcik7CisgIEdPT0dMRV9DSEVDSyhleHRlbnNpb24gIT0gbnVsbHB0cikgPDwgIkluZGV4IG91dC1vZi1ib3VuZHMgKGZpZWxkIGlzIGVtcHR5KS4iOworICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURURfRklFTEQsIE1FU1NBR0UpOworICByZXR1cm4gZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5NdXRhYmxlKGluZGV4KTsKK30KKworTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6QWRkTWVzc2FnZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICBpZiAoTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgeworICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7CisgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFKTsKKyAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKKyAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPj4oYXJlbmFfKTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURURfRklFTEQsIE1FU1NBR0UpOworICB9CisKKyAgLy8gUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4gZG9lcyBub3Qga25vdyBob3cgdG8gQWRkKCkgc2luY2UgaXQgY2Fubm90CisgIC8vIGFsbG9jYXRlIGFuIGFic3RyYWN0IG9iamVjdCwgc28gd2UgaGF2ZSB0byBiZSB0cmlja3kuCisgIE1lc3NhZ2VMaXRlKiByZXN1bHQgPSByZWludGVycHJldF9jYXN0PGludGVybmFsOjpSZXBlYXRlZFB0ckZpZWxkQmFzZSo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkFkZEZyb21DbGVhcmVkPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT4+KCk7CisgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgeworICAgIHJlc3VsdCA9IHByb3RvdHlwZS5OZXcoYXJlbmFfKTsKKyAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkFkZEFsbG9jYXRlZChyZXN1bHQpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KKy8vIE1lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6OkFkZE1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpCisKKyN1bmRlZiBHT09HTEVfRENIRUNLX1RZUEUKKwordm9pZCBFeHRlbnNpb25TZXQ6OlJlbW92ZUxhc3QoaW50IG51bWJlcikgeworICBFeHRlbnNpb24qIGV4dGVuc2lvbiA9IEZpbmRPck51bGwobnVtYmVyKTsKKyAgR09PR0xFX0NIRUNLKGV4dGVuc2lvbiAhPSBudWxscHRyKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7CisgIEdPT0dMRV9EQ0hFQ0soZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCk7CisKKyAgc3dpdGNoIChjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpKSB7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfaW50MzJfdF92YWx1ZS0+UmVtb3ZlTGFzdCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfaW50NjRfdF92YWx1ZS0+UmVtb3ZlTGFzdCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9VSU5UMzI6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX3VpbnQzMl90X3ZhbHVlLT5SZW1vdmVMYXN0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfdWludDY0X3RfdmFsdWUtPlJlbW92ZUxhc3QoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRkxPQVQ6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2Zsb2F0X3ZhbHVlLT5SZW1vdmVMYXN0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0RPVUJMRToKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZG91YmxlX3ZhbHVlLT5SZW1vdmVMYXN0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0JPT0w6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2Jvb2xfdmFsdWUtPlJlbW92ZUxhc3QoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRU5VTToKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZW51bV92YWx1ZS0+UmVtb3ZlTGFzdCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX3N0cmluZ192YWx1ZS0+UmVtb3ZlTGFzdCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5SZW1vdmVMYXN0KCk7CisgICAgICBicmVhazsKKyAgfQorfQorCitNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpSZWxlYXNlTGFzdChpbnQgbnVtYmVyKSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uID0gRmluZE9yTnVsbChudW1iZXIpOworICBHT09HTEVfQ0hFQ0soZXh0ZW5zaW9uICE9IG51bGxwdHIpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKKyAgR09PR0xFX0RDSEVDSyhleHRlbnNpb24tPmlzX3JlcGVhdGVkKTsKKyAgR09PR0xFX0RDSEVDSyhjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpID09IFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0UpOworICByZXR1cm4gZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5SZWxlYXNlTGFzdCgpOworfQorCitNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpVbnNhZmVBcmVuYVJlbGVhc2VMYXN0KGludCBudW1iZXIpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb24gPSBGaW5kT3JOdWxsKG51bWJlcik7CisgIEdPT0dMRV9DSEVDSyhleHRlbnNpb24gIT0gbnVsbHB0cikgPDwgIkluZGV4IG91dC1vZi1ib3VuZHMgKGZpZWxkIGlzIGVtcHR5KS4iOworICBHT09HTEVfRENIRUNLKGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQpOworICBHT09HTEVfRENIRUNLKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSkgPT0gV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRSk7CisgIHJldHVybiBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPlVuc2FmZUFyZW5hUmVsZWFzZUxhc3QoKTsKK30KKwordm9pZCBFeHRlbnNpb25TZXQ6OlN3YXBFbGVtZW50cyhpbnQgbnVtYmVyLCBpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uID0gRmluZE9yTnVsbChudW1iZXIpOworICBHT09HTEVfQ0hFQ0soZXh0ZW5zaW9uICE9IG51bGxwdHIpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKKyAgR09PR0xFX0RDSEVDSyhleHRlbnNpb24tPmlzX3JlcGVhdGVkKTsKKworICBzd2l0Y2ggKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSkpIHsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0lOVDMyOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9pbnQzMl90X3ZhbHVlLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfaW50NjRfdF92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF91aW50MzJfdF92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF91aW50NjRfdF92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRkxPQVQ6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2Zsb2F0X3ZhbHVlLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2RvdWJsZV92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfQk9PTDoKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfYm9vbF92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRU5VTToKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZW51bV92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9zdHJpbmdfdmFsdWUtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7CisgICAgICBicmVhazsKKyAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpDbGVhcigpIHsKKyAgRm9yRWFjaChbXShpbnQgLyogbnVtYmVyICovLCBFeHRlbnNpb24mIGV4dCkgeyBleHQuQ2xlYXIoKTsgfSk7Cit9CisKK25hbWVzcGFjZSB7CisvLyBDb21wdXRlcyB0aGUgc2l6ZSBvZiBhbiBFeHRlbnNpb25TZXQgdW5pb24gd2l0aG91dCBhY3R1YWxseSBjb25zdHJ1Y3RpbmcgdGhlCisvLyB1bmlvbi4gTm90ZSB0aGF0IHdlIGRvIG5vdCBjb3VudCBjbGVhcmVkIGV4dGVuc2lvbnMgZnJvbSB0aGUgc291cmNlIHRvIGJlCisvLyBwYXJ0IG9mIHRoZSB0b3RhbCwgYmVjYXVzZSB0aGVyZSBpcyBubyBuZWVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB0aG9zZS4gV2UKKy8vIGRvIGluY2x1ZGUgY2xlYXJlZCBleHRlbnNpb25zIGluIHRoZSBkZXN0aW5hdGlvbiwgdGhvdWdoLCBiZWNhdXNlIHRob3NlIGFyZQorLy8gYWxyZWFkeSBhbGxvY2F0ZWQgYW5kIHdpbGwgbm90IGJlIGdvaW5nIGF3YXkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRYLCB0eXBlbmFtZSBJdFk+CitzaXplX3QgU2l6ZU9mVW5pb24oSXRYIGl0X2Rlc3QsIEl0WCBlbmRfZGVzdCwgSXRZIGl0X3NvdXJjZSwgSXRZIGVuZF9zb3VyY2UpIHsKKyAgc2l6ZV90IHJlc3VsdCA9IDA7CisgIHdoaWxlIChpdF9kZXN0ICE9IGVuZF9kZXN0ICYmIGl0X3NvdXJjZSAhPSBlbmRfc291cmNlKSB7CisgICAgaWYgKGl0X2Rlc3QtPmZpcnN0IDwgaXRfc291cmNlLT5maXJzdCkgeworICAgICAgKytyZXN1bHQ7CisgICAgICArK2l0X2Rlc3Q7CisgICAgfSBlbHNlIGlmIChpdF9kZXN0LT5maXJzdCA9PSBpdF9zb3VyY2UtPmZpcnN0KSB7CisgICAgICArK3Jlc3VsdDsKKyAgICAgICsraXRfZGVzdDsKKyAgICAgICsraXRfc291cmNlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIWl0X3NvdXJjZS0+c2Vjb25kLmlzX2NsZWFyZWQpIHsKKyAgICAgICAgKytyZXN1bHQ7CisgICAgICB9CisgICAgICArK2l0X3NvdXJjZTsKKyAgICB9CisgIH0KKyAgcmVzdWx0ICs9IHN0ZDo6ZGlzdGFuY2UoaXRfZGVzdCwgZW5kX2Rlc3QpOworICBmb3IgKDsgaXRfc291cmNlICE9IGVuZF9zb3VyY2U7ICsraXRfc291cmNlKSB7CisgICAgaWYgKCFpdF9zb3VyY2UtPnNlY29uZC5pc19jbGVhcmVkKSB7CisgICAgICArK3Jlc3VsdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIEV4dGVuc2lvblNldDo6TWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5zaW9uU2V0JiBvdGhlcikgeworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKCFpc19sYXJnZSgpKSkgeworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoIW90aGVyLmlzX2xhcmdlKCkpKSB7CisgICAgICBHcm93Q2FwYWNpdHkoU2l6ZU9mVW5pb24oZmxhdF9iZWdpbigpLCBmbGF0X2VuZCgpLCBvdGhlci5mbGF0X2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuZmxhdF9lbmQoKSkpOworICAgIH0gZWxzZSB7CisgICAgICBHcm93Q2FwYWNpdHkoU2l6ZU9mVW5pb24oZmxhdF9iZWdpbigpLCBmbGF0X2VuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLm1hcF8ubGFyZ2UtPmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIubWFwXy5sYXJnZS0+ZW5kKCkpKTsKKyAgICB9CisgIH0KKyAgb3RoZXIuRm9yRWFjaChbZXh0ZW5kZWUsIHRoaXMsICZvdGhlcl0oaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uJiBleHQpIHsKKyAgICB0aGlzLT5JbnRlcm5hbEV4dGVuc2lvbk1lcmdlRnJvbShleHRlbmRlZSwgbnVtYmVyLCBleHQsIG90aGVyLmFyZW5hXyk7CisgIH0pOworfQorCit2b2lkIEV4dGVuc2lvblNldDo6SW50ZXJuYWxFeHRlbnNpb25NZXJnZUZyb20oY29uc3QgTWVzc2FnZUxpdGUqIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5zaW9uJiBvdGhlcl9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJlbmEqIG90aGVyX2FyZW5hKSB7CisgIGlmIChvdGhlcl9leHRlbnNpb24uaXNfcmVwZWF0ZWQpIHsKKyAgICBFeHRlbnNpb24qIGV4dGVuc2lvbjsKKyAgICBib29sIGlzX25ldyA9CisgICAgICAgIE1heWJlTmV3RXh0ZW5zaW9uKG51bWJlciwgb3RoZXJfZXh0ZW5zaW9uLmRlc2NyaXB0b3IsICZleHRlbnNpb24pOworICAgIGlmIChpc19uZXcpIHsKKyAgICAgIC8vIEV4dGVuc2lvbiBkaWQgbm90IGFscmVhZHkgZXhpc3QgaW4gc2V0LgorICAgICAgZXh0ZW5zaW9uLT50eXBlID0gb3RoZXJfZXh0ZW5zaW9uLnR5cGU7CisgICAgICBleHRlbnNpb24tPmlzX3BhY2tlZCA9IG90aGVyX2V4dGVuc2lvbi5pc19wYWNrZWQ7CisgICAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgR09PR0xFX0RDSEVDS19FUShleHRlbnNpb24tPnR5cGUsIG90aGVyX2V4dGVuc2lvbi50eXBlKTsKKyAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZXh0ZW5zaW9uLT5pc19wYWNrZWQsIG90aGVyX2V4dGVuc2lvbi5pc19wYWNrZWQpOworICAgICAgR09PR0xFX0RDSEVDSyhleHRlbnNpb24tPmlzX3JlcGVhdGVkKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNwcF90eXBlKG90aGVyX2V4dGVuc2lvbi50eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSwgUkVQRUFURURfVFlQRSkgXAorICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgXAorICAgIGlmIChpc19uZXcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlID0gICAgICAgICAgXAorICAgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJFUEVBVEVEX1RZUEU+KGFyZW5hXyk7ICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+TWVyZ2VGcm9tKCAgXAorICAgICAgICAqb3RoZXJfZXh0ZW5zaW9uLnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUpOyAgXAorICAgIGJyZWFrOworCisgICAgICBIQU5ETEVfVFlQRShJTlQzMiwgaW50MzJfdCwgUmVwZWF0ZWRGaWVsZDxpbnQzMl90Pik7CisgICAgICBIQU5ETEVfVFlQRShJTlQ2NCwgaW50NjRfdCwgUmVwZWF0ZWRGaWVsZDxpbnQ2NF90Pik7CisgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMl90LCBSZXBlYXRlZEZpZWxkPHVpbnQzMl90Pik7CisgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIHVpbnQ2NF90LCBSZXBlYXRlZEZpZWxkPHVpbnQ2NF90Pik7CisgICAgICBIQU5ETEVfVFlQRShGTE9BVCwgZmxvYXQsIFJlcGVhdGVkRmllbGQ8ZmxvYXQ+KTsKKyAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlLCBSZXBlYXRlZEZpZWxkPGRvdWJsZT4pOworICAgICAgSEFORExFX1RZUEUoQk9PTCwgYm9vbCwgUmVwZWF0ZWRGaWVsZDxib29sPik7CisgICAgICBIQU5ETEVfVFlQRShFTlVNLCBlbnVtLCBSZXBlYXRlZEZpZWxkPGludD4pOworICAgICAgSEFORExFX1RZUEUoU1RSSU5HLCBzdHJpbmcsIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgIGlmIChpc19uZXcpIHsKKyAgICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUgPQorICAgICAgICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPj4oYXJlbmFfKTsKKyAgICAgICAgfQorICAgICAgICAvLyBXZSBjYW4ndCBjYWxsIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+OjpNZXJnZUZyb20oKSBiZWNhdXNlCisgICAgICAgIC8vIGl0IHdvdWxkIGF0dGVtcHQgdG8gYWxsb2NhdGUgbmV3IG9iamVjdHMuCisgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+KiBvdGhlcl9yZXBlYXRlZF9tZXNzYWdlID0KKyAgICAgICAgICAgIG90aGVyX2V4dGVuc2lvbi5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG90aGVyX3JlcGVhdGVkX21lc3NhZ2UtPnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIG90aGVyX21lc3NhZ2UgPSBvdGhlcl9yZXBlYXRlZF9tZXNzYWdlLT5HZXQoaSk7CisgICAgICAgICAgTWVzc2FnZUxpdGUqIHRhcmdldCA9CisgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50ZXJuYWw6OlJlcGVhdGVkUHRyRmllbGRCYXNlKj4oCisgICAgICAgICAgICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUpCisgICAgICAgICAgICAgICAgICAtPkFkZEZyb21DbGVhcmVkPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT4+KCk7CisgICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICB0YXJnZXQgPSBvdGhlcl9tZXNzYWdlLk5ldyhhcmVuYV8pOworICAgICAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5BZGRBbGxvY2F0ZWQodGFyZ2V0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGFyZ2V0LT5DaGVja1R5cGVBbmRNZXJnZUZyb20ob3RoZXJfbWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghb3RoZXJfZXh0ZW5zaW9uLmlzX2NsZWFyZWQpIHsKKyAgICAgIHN3aXRjaCAoY3BwX3R5cGUob3RoZXJfZXh0ZW5zaW9uLnR5cGUpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFLCBDQU1FTENBU0UpICBcCisgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICBcCisgICAgU2V0IyNDQU1FTENBU0UobnVtYmVyLCBvdGhlcl9leHRlbnNpb24udHlwZSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLkxPV0VSQ0FTRSMjX3ZhbHVlLCBcCisgICAgICAgICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOyAgICAgICBcCisgICAgYnJlYWs7CisKKyAgICAgICAgSEFORExFX1RZUEUoSU5UMzIsIGludDMyX3QsIEludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoSU5UNjQsIGludDY0X3QsIEludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzJfdCwgVUludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjRfdCwgVUludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoRkxPQVQsIGZsb2F0LCBGbG9hdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlLCBEb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRShCT09MLCBib29sLCBCb29sKTsKKyAgICAgICAgSEFORExFX1RZUEUoRU5VTSwgZW51bSwgRW51bSk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgICAgU2V0U3RyaW5nKG51bWJlciwgb3RoZXJfZXh0ZW5zaW9uLnR5cGUsICpvdGhlcl9leHRlbnNpb24uc3RyaW5nX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24uZGVzY3JpcHRvcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRTogeworICAgICAgICAgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICAgICAgICAgIGJvb2wgaXNfbmV3ID0KKyAgICAgICAgICAgICAgTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBvdGhlcl9leHRlbnNpb24uZGVzY3JpcHRvciwgJmV4dGVuc2lvbik7CisgICAgICAgICAgaWYgKGlzX25ldykgeworICAgICAgICAgICAgZXh0ZW5zaW9uLT50eXBlID0gb3RoZXJfZXh0ZW5zaW9uLnR5cGU7CisgICAgICAgICAgICBleHRlbnNpb24tPmlzX3BhY2tlZCA9IG90aGVyX2V4dGVuc2lvbi5pc19wYWNrZWQ7CisgICAgICAgICAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAob3RoZXJfZXh0ZW5zaW9uLmlzX2xhenkpIHsKKyAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5pc19sYXp5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZSA9CisgICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24ubGF6eW1lc3NhZ2VfdmFsdWUtPk5ldyhhcmVuYV8pOworICAgICAgICAgICAgICBleHRlbnNpb24tPmxhenltZXNzYWdlX3ZhbHVlLT5NZXJnZUZyb20oCisgICAgICAgICAgICAgICAgICBHZXRQcm90b3R5cGVGb3JMYXp5TWVzc2FnZShleHRlbmRlZSwgbnVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24ubGF6eW1lc3NhZ2VfdmFsdWUsIGFyZW5hXyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBleHRlbnNpb24tPmlzX2xhenkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlID0KKyAgICAgICAgICAgICAgICAgIG90aGVyX2V4dGVuc2lvbi5tZXNzYWdlX3ZhbHVlLT5OZXcoYXJlbmFfKTsKKyAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oCisgICAgICAgICAgICAgICAgICAqb3RoZXJfZXh0ZW5zaW9uLm1lc3NhZ2VfdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHT09HTEVfRENIRUNLX0VRKGV4dGVuc2lvbi0+dHlwZSwgb3RoZXJfZXh0ZW5zaW9uLnR5cGUpOworICAgICAgICAgICAgR09PR0xFX0RDSEVDS19FUShleHRlbnNpb24tPmlzX3BhY2tlZCwgb3RoZXJfZXh0ZW5zaW9uLmlzX3BhY2tlZCk7CisgICAgICAgICAgICBHT09HTEVfRENIRUNLKCFleHRlbnNpb24tPmlzX3JlcGVhdGVkKTsKKyAgICAgICAgICAgIGlmIChvdGhlcl9leHRlbnNpb24uaXNfbGF6eSkgeworICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLT5pc19sYXp5KSB7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+TWVyZ2VGcm9tKAorICAgICAgICAgICAgICAgICAgICBHZXRQcm90b3R5cGVGb3JMYXp5TWVzc2FnZShleHRlbmRlZSwgbnVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgKm90aGVyX2V4dGVuc2lvbi5sYXp5bWVzc2FnZV92YWx1ZSwgYXJlbmFfKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUtPkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLmxhenltZXNzYWdlX3ZhbHVlLT5HZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSwgb3RoZXJfYXJlbmEpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbi0+aXNfbGF6eSkgeworICAgICAgICAgICAgICAgIGV4dGVuc2lvbi0+bGF6eW1lc3NhZ2VfdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgLT5NdXRhYmxlTWVzc2FnZSgqb3RoZXJfZXh0ZW5zaW9uLm1lc3NhZ2VfdmFsdWUsIGFyZW5hXykKKyAgICAgICAgICAgICAgICAgICAgLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oKm90aGVyX2V4dGVuc2lvbi5tZXNzYWdlX3ZhbHVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUtPkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgKKyAgICAgICAgICAgICAgICAgICAgKm90aGVyX2V4dGVuc2lvbi5tZXNzYWdlX3ZhbHVlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBleHRlbnNpb24tPmlzX2NsZWFyZWQgPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIEV4dGVuc2lvblNldDo6U3dhcChjb25zdCBNZXNzYWdlTGl0ZSogZXh0ZW5kZWUsIEV4dGVuc2lvblNldCogb3RoZXIpIHsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgaWYgKEdldEFyZW5hKCkgIT0gbnVsbHB0ciAmJiBHZXRBcmVuYSgpID09IG90aGVyLT5HZXRBcmVuYSgpKSB7CisjZWxzZSAgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICBpZiAoR2V0QXJlbmEoKSA9PSBvdGhlci0+R2V0QXJlbmEoKSkgeworI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBUT0RPKGNmYWxsaW4sIHJvaGFuYW5pbCk6IFdlIG1heWJlIGFibGUgdG8gb3B0aW1pemUgYSBjYXNlIHdoZXJlIHdlIGFyZQorICAgIC8vIHN3YXBwaW5nIGZyb20gaGVhcCB0byBhcmVuYS1hbGxvY2F0ZWQgZXh0ZW5zaW9uIHNldCwgYnkganVzdCBPd24oKSdpbmcKKyAgICAvLyB0aGUgZXh0ZW5zaW9ucy4KKyAgICBFeHRlbnNpb25TZXQgZXh0ZW5zaW9uX3NldDsKKyAgICBleHRlbnNpb25fc2V0Lk1lcmdlRnJvbShleHRlbmRlZSwgKm90aGVyKTsKKyAgICBvdGhlci0+Q2xlYXIoKTsKKyAgICBvdGhlci0+TWVyZ2VGcm9tKGV4dGVuZGVlLCAqdGhpcyk7CisgICAgQ2xlYXIoKTsKKyAgICBNZXJnZUZyb20oZXh0ZW5kZWUsIGV4dGVuc2lvbl9zZXQpOworICB9Cit9CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpJbnRlcm5hbFN3YXAoRXh0ZW5zaW9uU2V0KiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIHN3YXAoYXJlbmFfLCBvdGhlci0+YXJlbmFfKTsKKyAgc3dhcChmbGF0X2NhcGFjaXR5Xywgb3RoZXItPmZsYXRfY2FwYWNpdHlfKTsKKyAgc3dhcChmbGF0X3NpemVfLCBvdGhlci0+ZmxhdF9zaXplXyk7CisgIHN3YXAobWFwXywgb3RoZXItPm1hcF8pOworfQorCit2b2lkIEV4dGVuc2lvblNldDo6U3dhcEV4dGVuc2lvbihjb25zdCBNZXNzYWdlTGl0ZSogZXh0ZW5kZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25TZXQqIG90aGVyLCBpbnQgbnVtYmVyKSB7CisgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm47CisKKyAgaWYgKEdldEFyZW5hKCkgPT0gb3RoZXItPkdldEFyZW5hKCkpIHsKKyAgICBVbnNhZmVTaGFsbG93U3dhcEV4dGVuc2lvbihvdGhlciwgbnVtYmVyKTsKKyAgICByZXR1cm47CisgIH0KKworICBFeHRlbnNpb24qIHRoaXNfZXh0ID0gRmluZE9yTnVsbChudW1iZXIpOworICBFeHRlbnNpb24qIG90aGVyX2V4dCA9IG90aGVyLT5GaW5kT3JOdWxsKG51bWJlcik7CisKKyAgaWYgKHRoaXNfZXh0ID09IG90aGVyX2V4dCkgcmV0dXJuOworCisgIGlmICh0aGlzX2V4dCAhPSBudWxscHRyICYmIG90aGVyX2V4dCAhPSBudWxscHRyKSB7CisgICAgLy8gVE9ETyhjZmFsbGluLCByb2hhbmFuaWwpOiBXZSBjb3VsZCBmdXJ0aGVyIG9wdGltaXplIHRoZXNlIGNhc2VzLAorICAgIC8vIGVzcGVjaWFsbHkgYXZvaWQgY3JlYXRpb24gb2YgRXh0ZW5zaW9uU2V0LCBhbmQgbW92ZSBNZXJnZUZyb20gbG9naWMKKyAgICAvLyBpbnRvIEV4dGVuc2lvbnMgaXRzZWxmICh3aGljaCB0YWtlcyBhcmVuYSBhcyBhbiBhcmd1bWVudCkuCisgICAgLy8gV2UgZG8gaXQgdGhpcyB3YXkgdG8gcmV1c2UgdGhlIGNvcHktYWNyb3NzLWFyZW5hcyBsb2dpYyBhbHJlYWR5CisgICAgLy8gaW1wbGVtZW50ZWQgaW4gRXh0ZW5zaW9uU2V0J3MgTWVyZ2VGcm9tLgorICAgIEV4dGVuc2lvblNldCB0ZW1wOworICAgIHRlbXAuSW50ZXJuYWxFeHRlbnNpb25NZXJnZUZyb20oZXh0ZW5kZWUsIG51bWJlciwgKm90aGVyX2V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLT5HZXRBcmVuYSgpKTsKKyAgICBFeHRlbnNpb24qIHRlbXBfZXh0ID0gdGVtcC5GaW5kT3JOdWxsKG51bWJlcik7CisKKyAgICBvdGhlcl9leHQtPkNsZWFyKCk7CisgICAgb3RoZXItPkludGVybmFsRXh0ZW5zaW9uTWVyZ2VGcm9tKGV4dGVuZGVlLCBudW1iZXIsICp0aGlzX2V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+R2V0QXJlbmEoKSk7CisgICAgdGhpc19leHQtPkNsZWFyKCk7CisgICAgSW50ZXJuYWxFeHRlbnNpb25NZXJnZUZyb20oZXh0ZW5kZWUsIG51bWJlciwgKnRlbXBfZXh0LCB0ZW1wLkdldEFyZW5hKCkpOworICB9IGVsc2UgaWYgKHRoaXNfZXh0ID09IG51bGxwdHIpIHsKKyAgICBJbnRlcm5hbEV4dGVuc2lvbk1lcmdlRnJvbShleHRlbmRlZSwgbnVtYmVyLCAqb3RoZXJfZXh0LCBvdGhlci0+R2V0QXJlbmEoKSk7CisgICAgaWYgKG90aGVyLT5HZXRBcmVuYSgpID09IG51bGxwdHIpIG90aGVyX2V4dC0+RnJlZSgpOworICAgIG90aGVyLT5FcmFzZShudW1iZXIpOworICB9IGVsc2UgeworICAgIG90aGVyLT5JbnRlcm5hbEV4dGVuc2lvbk1lcmdlRnJvbShleHRlbmRlZSwgbnVtYmVyLCAqdGhpc19leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPkdldEFyZW5hKCkpOworICAgIGlmIChHZXRBcmVuYSgpID09IG51bGxwdHIpIHRoaXNfZXh0LT5GcmVlKCk7CisgICAgRXJhc2UobnVtYmVyKTsKKyAgfQorfQorCit2b2lkIEV4dGVuc2lvblNldDo6VW5zYWZlU2hhbGxvd1N3YXBFeHRlbnNpb24oRXh0ZW5zaW9uU2V0KiBvdGhlciwgaW50IG51bWJlcikgeworICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuOworCisgIEV4dGVuc2lvbiogdGhpc19leHQgPSBGaW5kT3JOdWxsKG51bWJlcik7CisgIEV4dGVuc2lvbiogb3RoZXJfZXh0ID0gb3RoZXItPkZpbmRPck51bGwobnVtYmVyKTsKKworICBpZiAodGhpc19leHQgPT0gb3RoZXJfZXh0KSByZXR1cm47CisKKyAgR09PR0xFX0RDSEVDS19FUShHZXRBcmVuYSgpLCBvdGhlci0+R2V0QXJlbmEoKSk7CisKKyAgaWYgKHRoaXNfZXh0ICE9IG51bGxwdHIgJiYgb3RoZXJfZXh0ICE9IG51bGxwdHIpIHsKKyAgICBzdGQ6OnN3YXAoKnRoaXNfZXh0LCAqb3RoZXJfZXh0KTsKKyAgfSBlbHNlIGlmICh0aGlzX2V4dCA9PSBudWxscHRyKSB7CisgICAgKkluc2VydChudW1iZXIpLmZpcnN0ID0gKm90aGVyX2V4dDsKKyAgICBvdGhlci0+RXJhc2UobnVtYmVyKTsKKyAgfSBlbHNlIHsKKyAgICAqb3RoZXItPkluc2VydChudW1iZXIpLmZpcnN0ID0gKnRoaXNfZXh0OworICAgIEVyYXNlKG51bWJlcik7CisgIH0KK30KKworYm9vbCBFeHRlbnNpb25TZXQ6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIC8vIEV4dGVuc2lvbnMgYXJlIG5ldmVyIHJlcXVpcmVkLiAgSG93ZXZlciwgd2UgbmVlZCB0byBjaGVjayB0aGF0IGFsbAorICAvLyBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKGlzX2xhcmdlKCkpKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBrdiA6ICptYXBfLmxhcmdlKSB7CisgICAgICBpZiAoIWt2LnNlY29uZC5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgZm9yIChjb25zdCBLZXlWYWx1ZSogaXQgPSBmbGF0X2JlZ2luKCk7IGl0ICE9IGZsYXRfZW5kKCk7ICsraXQpIHsKKyAgICBpZiAoIWl0LT5zZWNvbmQuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IGNoYXIqIEV4dGVuc2lvblNldDo6UGFyc2VGaWVsZCh1aW50NjRfdCB0YWcsIGNvbnN0IGNoYXIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogZXh0ZW5kZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGEqIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgeworICBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXIgZmluZGVyKGV4dGVuZGVlKTsKKyAgaW50IG51bWJlciA9IHRhZyA+PiAzOworICBib29sIHdhc19wYWNrZWRfb25fd2lyZTsKKyAgRXh0ZW5zaW9uSW5mbyBleHRlbnNpb247CisgIGlmICghRmluZEV4dGVuc2lvbkluZm9Gcm9tRmllbGROdW1iZXIodGFnICYgNywgbnVtYmVyLCAmZmluZGVyLCAmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNfcGFja2VkX29uX3dpcmUpKSB7CisgICAgcmV0dXJuIFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsIG1ldGFkYXRhLT5tdXRhYmxlX3Vua25vd25fZmllbGRzPHN0ZDo6c3RyaW5nPigpLCBwdHIsIGN0eCk7CisgIH0KKyAgcmV0dXJuIFBhcnNlRmllbGRXaXRoRXh0ZW5zaW9uSW5mbzxzdGQ6OnN0cmluZz4oCisgICAgICBudW1iZXIsIHdhc19wYWNrZWRfb25fd2lyZSwgZXh0ZW5zaW9uLCBtZXRhZGF0YSwgcHRyLCBjdHgpOworfQorCitjb25zdCBjaGFyKiBFeHRlbnNpb25TZXQ6OlBhcnNlTWVzc2FnZVNldEl0ZW0oCisgICAgY29uc3QgY2hhciogcHRyLCBjb25zdCBNZXNzYWdlTGl0ZSogZXh0ZW5kZWUsCisgICAgaW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGEqIG1ldGFkYXRhLCBpbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyAgcmV0dXJuIFBhcnNlTWVzc2FnZVNldEl0ZW1UbXBsPE1lc3NhZ2VMaXRlLCBzdGQ6OnN0cmluZz4ocHRyLCBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsIGN0eCk7Cit9CisKK3VpbnQ4X3QqIEV4dGVuc2lvblNldDo6X0ludGVybmFsU2VyaWFsaXplSW1wbCgKKyAgICBjb25zdCBNZXNzYWdlTGl0ZSogZXh0ZW5kZWUsIGludCBzdGFydF9maWVsZF9udW1iZXIsIGludCBlbmRfZmllbGRfbnVtYmVyLAorICAgIHVpbnQ4X3QqIHRhcmdldCwgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShpc19sYXJnZSgpKSkgeworICAgIGNvbnN0IGF1dG8mIGVuZCA9IG1hcF8ubGFyZ2UtPmVuZCgpOworICAgIGZvciAoYXV0byBpdCA9IG1hcF8ubGFyZ2UtPmxvd2VyX2JvdW5kKHN0YXJ0X2ZpZWxkX251bWJlcik7CisgICAgICAgICBpdCAhPSBlbmQgJiYgaXQtPmZpcnN0IDwgZW5kX2ZpZWxkX251bWJlcjsgKytpdCkgeworICAgICAgdGFyZ2V0ID0gaXQtPnNlY29uZC5JbnRlcm5hbFNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICAgICAgICBleHRlbmRlZSwgdGhpcywgaXQtPmZpcnN0LCB0YXJnZXQsIHN0cmVhbSk7CisgICAgfQorICAgIHJldHVybiB0YXJnZXQ7CisgIH0KKyAgY29uc3QgS2V5VmFsdWUqIGVuZCA9IGZsYXRfZW5kKCk7CisgIGZvciAoY29uc3QgS2V5VmFsdWUqIGl0ID0gc3RkOjpsb3dlcl9ib3VuZCgKKyAgICAgICAgICAgZmxhdF9iZWdpbigpLCBlbmQsIHN0YXJ0X2ZpZWxkX251bWJlciwgS2V5VmFsdWU6OkZpcnN0Q29tcGFyYXRvcigpKTsKKyAgICAgICBpdCAhPSBlbmQgJiYgaXQtPmZpcnN0IDwgZW5kX2ZpZWxkX251bWJlcjsgKytpdCkgeworICAgIHRhcmdldCA9IGl0LT5zZWNvbmQuSW50ZXJuYWxTZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgICAgIGV4dGVuZGVlLCB0aGlzLCBpdC0+Zmlyc3QsIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCit1aW50OF90KiBFeHRlbnNpb25TZXQ6OkludGVybmFsU2VyaWFsaXplTWVzc2FnZVNldFdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgY29uc3QgTWVzc2FnZUxpdGUqIGV4dGVuZGVlLCB1aW50OF90KiB0YXJnZXQsCisgICAgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICBjb25zdCBFeHRlbnNpb25TZXQqIGV4dGVuc2lvbl9zZXQgPSB0aGlzOworICBGb3JFYWNoKFsmdGFyZ2V0LCBleHRlbmRlZSwgc3RyZWFtLCBleHRlbnNpb25fc2V0XShpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHRlbnNpb24mIGV4dCkgeworICAgIHRhcmdldCA9IGV4dC5JbnRlcm5hbFNlcmlhbGl6ZU1lc3NhZ2VTZXRJdGVtV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICAgICAgZXh0ZW5kZWUsIGV4dGVuc2lvbl9zZXQsIG51bWJlciwgdGFyZ2V0LCBzdHJlYW0pOworICB9KTsKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IEV4dGVuc2lvblNldDo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKyAgRm9yRWFjaChbJnRvdGFsX3NpemVdKGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvbiYgZXh0KSB7CisgICAgdG90YWxfc2l6ZSArPSBleHQuQnl0ZVNpemUobnVtYmVyKTsKKyAgfSk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCisvLyBEZWZpbmVkIGluIGV4dGVuc2lvbl9zZXRfaGVhdnkuY2MuCisvLyBpbnQgRXh0ZW5zaW9uU2V0OjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QKKworYm9vbCBFeHRlbnNpb25TZXQ6Ok1heWJlTmV3RXh0ZW5zaW9uKGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbioqIHJlc3VsdCkgeworICBib29sIGV4dGVuc2lvbl9pc19uZXcgPSBmYWxzZTsKKyAgc3RkOjp0aWUoKnJlc3VsdCwgZXh0ZW5zaW9uX2lzX25ldykgPSBJbnNlcnQobnVtYmVyKTsKKyAgKCpyZXN1bHQpLT5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKKyAgcmV0dXJuIGV4dGVuc2lvbl9pc19uZXc7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIE1ldGhvZHMgb2YgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb24KKwordm9pZCBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6Q2xlYXIoKSB7CisgIGlmIChpc19yZXBlYXRlZCkgeworICAgIHN3aXRjaCAoY3BwX3R5cGUodHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgXAorICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFXyMjVVBQRVJDQVNFOiBcCisgICAgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+Q2xlYXIoKTsgIFwKKyAgICBicmVhaworCisgICAgICBIQU5ETEVfVFlQRShJTlQzMiwgaW50MzJfdCk7CisgICAgICBIQU5ETEVfVFlQRShJTlQ2NCwgaW50NjRfdCk7CisgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMl90KTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0X3QpOworICAgICAgSEFORExFX1RZUEUoRkxPQVQsIGZsb2F0KTsKKyAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlKTsKKyAgICAgIEhBTkRMRV9UWVBFKEJPT0wsIGJvb2wpOworICAgICAgSEFORExFX1RZUEUoRU5VTSwgZW51bSk7CisgICAgICBIQU5ETEVfVFlQRShTVFJJTkcsIHN0cmluZyk7CisgICAgICBIQU5ETEVfVFlQRShNRVNTQUdFLCBtZXNzYWdlKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIWlzX2NsZWFyZWQpIHsKKyAgICAgIHN3aXRjaCAoY3BwX3R5cGUodHlwZSkpIHsKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgICAgc3RyaW5nX3ZhbHVlLT5jbGVhcigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgaWYgKGlzX2xhenkpIHsKKyAgICAgICAgICAgIGxhenltZXNzYWdlX3ZhbHVlLT5DbGVhcigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZXNzYWdlX3ZhbHVlLT5DbGVhcigpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAvLyBObyBuZWVkIHRvIGRvIGFueXRoaW5nLiAgR2V0KigpIHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgLy8gYXMgbG9uZyBhcyBpc19jbGVhcmVkIGlzIHRydWUgYW5kIFNldCooKSB3aWxsIG92ZXJ3cml0ZSB0aGUKKyAgICAgICAgICAvLyBwcmV2aW91cyB2YWx1ZS4KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaXNfY2xlYXJlZCA9IHRydWU7CisgICAgfQorICB9Cit9CisKK3NpemVfdCBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6Qnl0ZVNpemUoaW50IG51bWJlcikgY29uc3QgeworICBzaXplX3QgcmVzdWx0ID0gMDsKKworICBpZiAoaXNfcmVwZWF0ZWQpIHsKKyAgICBpZiAoaXNfcGFja2VkKSB7CisgICAgICBzd2l0Y2ggKHJlYWxfdHlwZSh0eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgXAorICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpOyBpKyspIHsgXAorICAgICAgcmVzdWx0ICs9IFdpcmVGb3JtYXRMaXRlOjpDQU1FTENBU0UjI1NpemUoICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPkdldChpKSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJyZWFrCisKKyAgICAgICAgSEFORExFX1RZUEUoSU5UMzIsIEludDMyLCBpbnQzMl90KTsKKyAgICAgICAgSEFORExFX1RZUEUoSU5UNjQsIEludDY0LCBpbnQ2NF90KTsKKyAgICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCBVSW50MzIsIHVpbnQzMl90KTsKKyAgICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCBVSW50NjQsIHVpbnQ2NF90KTsKKyAgICAgICAgSEFORExFX1RZUEUoU0lOVDMyLCBTSW50MzIsIGludDMyX3QpOworICAgICAgICBIQU5ETEVfVFlQRShTSU5UNjQsIFNJbnQ2NCwgaW50NjRfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKEVOVU0sIEVudW0sIGVudW0pOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgICAgLy8gU3R1ZmYgd2l0aCBmaXhlZCBzaXplLgorI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICBcCisgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXN1bHQgKz0gV2lyZUZvcm1hdExpdGU6OmsjI0NBTUVMQ0FTRSMjU2l6ZSAqICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBGcm9tSW50U2l6ZShyZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5zaXplKCkpOyBcCisgICAgYnJlYWsKKyAgICAgICAgSEFORExFX1RZUEUoRklYRUQzMiwgRml4ZWQzMiwgdWludDMyX3QpOworICAgICAgICBIQU5ETEVfVFlQRShGSVhFRDY0LCBGaXhlZDY0LCB1aW50NjRfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCBTRml4ZWQzMiwgaW50MzJfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCBTRml4ZWQ2NCwgaW50NjRfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKEZMT0FULCBGbG9hdCwgZmxvYXQpOworICAgICAgICBIQU5ETEVfVFlQRShET1VCTEUsIERvdWJsZSwgZG91YmxlKTsKKyAgICAgICAgSEFORExFX1RZUEUoQk9PTCwgQm9vbCwgYm9vbCk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NUUklORzoKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CWVRFUzoKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUDoKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFOgorICAgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJOb24tcHJpbWl0aXZlIHR5cGVzIGNhbid0IGJlIHBhY2tlZC4iOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYWNoZWRfc2l6ZSA9IFRvQ2FjaGVkU2l6ZShyZXN1bHQpOworICAgICAgaWYgKHJlc3VsdCA+IDApIHsKKyAgICAgICAgcmVzdWx0ICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKKyAgICAgICAgICAgIG51bWJlciwgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2l6ZV90IHRhZ19zaXplID0gV2lyZUZvcm1hdExpdGU6OlRhZ1NpemUobnVtYmVyLCByZWFsX3R5cGUodHlwZSkpOworCisgICAgICBzd2l0Y2ggKHJlYWxfdHlwZSh0eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVzdWx0ICs9IHRhZ19zaXplICogRnJvbUludFNpemUocmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpKTsgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpOyBpKyspIHsgICAgICAgIFwKKyAgICAgIHJlc3VsdCArPSBXaXJlRm9ybWF0TGl0ZTo6Q0FNRUxDQVNFIyNTaXplKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+R2V0KGkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhaworCisgICAgICAgIEhBTkRMRV9UWVBFKElOVDMyLCBJbnQzMiwgaW50MzJfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKElOVDY0LCBJbnQ2NCwgaW50NjRfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgVUludDMyLCB1aW50MzJfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgVUludDY0LCB1aW50NjRfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKFNJTlQzMiwgU0ludDMyLCBpbnQzMl90KTsKKyAgICAgICAgSEFORExFX1RZUEUoU0lOVDY0LCBTSW50NjQsIGludDY0X3QpOworICAgICAgICBIQU5ETEVfVFlQRShTVFJJTkcsIFN0cmluZywgc3RyaW5nKTsKKyAgICAgICAgSEFORExFX1RZUEUoQllURVMsIEJ5dGVzLCBzdHJpbmcpOworICAgICAgICBIQU5ETEVfVFlQRShFTlVNLCBFbnVtLCBlbnVtKTsKKyAgICAgICAgSEFORExFX1RZUEUoR1JPVVAsIEdyb3VwLCBtZXNzYWdlKTsKKyAgICAgICAgSEFORExFX1RZUEUoTUVTU0FHRSwgTWVzc2FnZSwgbWVzc2FnZSk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgICAvLyBTdHVmZiB3aXRoIGZpeGVkIHNpemUuCisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgIFwKKyAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlc3VsdCArPSAodGFnX3NpemUgKyBXaXJlRm9ybWF0TGl0ZTo6ayMjQ0FNRUxDQVNFIyNTaXplKSAqICBcCisgICAgICAgICAgICAgIEZyb21JbnRTaXplKHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPnNpemUoKSk7IFwKKyAgICBicmVhaworICAgICAgICBIQU5ETEVfVFlQRShGSVhFRDMyLCBGaXhlZDMyLCB1aW50MzJfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKEZJWEVENjQsIEZpeGVkNjQsIHVpbnQ2NF90KTsKKyAgICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsIFNGaXhlZDMyLCBpbnQzMl90KTsKKyAgICAgICAgSEFORExFX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0LCBpbnQ2NF90KTsKKyAgICAgICAgSEFORExFX1RZUEUoRkxPQVQsIEZsb2F0LCBmbG9hdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgRG91YmxlLCBkb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRShCT09MLCBCb29sLCBib29sKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICghaXNfY2xlYXJlZCkgeworICAgIHJlc3VsdCArPSBXaXJlRm9ybWF0TGl0ZTo6VGFnU2l6ZShudW1iZXIsIHJlYWxfdHlwZSh0eXBlKSk7CisgICAgc3dpdGNoIChyZWFsX3R5cGUodHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UsIExPV0VSQ0FTRSkgICAgICBcCisgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgXAorICAgIHJlc3VsdCArPSBXaXJlRm9ybWF0TGl0ZTo6Q0FNRUxDQVNFIyNTaXplKExPV0VSQ0FTRSk7IFwKKyAgICBicmVhaworCisgICAgICBIQU5ETEVfVFlQRShJTlQzMiwgSW50MzIsIGludDMyX3RfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoSU5UNjQsIEludDY0LCBpbnQ2NF90X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgVUludDMyLCB1aW50MzJfdF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIFVJbnQ2NCwgdWludDY0X3RfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoU0lOVDMyLCBTSW50MzIsIGludDMyX3RfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoU0lOVDY0LCBTSW50NjQsIGludDY0X3RfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoU1RSSU5HLCBTdHJpbmcsICpzdHJpbmdfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoQllURVMsIEJ5dGVzLCAqc3RyaW5nX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKEVOVU0sIEVudW0sIGVudW1fdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoR1JPVVAsIEdyb3VwLCAqbWVzc2FnZV92YWx1ZSk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRTogeworICAgICAgICBpZiAoaXNfbGF6eSkgeworICAgICAgICAgIHNpemVfdCBzaXplID0gbGF6eW1lc3NhZ2VfdmFsdWUtPkJ5dGVTaXplTG9uZygpOworICAgICAgICAgIHJlc3VsdCArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihzaXplKSArIHNpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0ICs9IFdpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZSgqbWVzc2FnZV92YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIFN0dWZmIHdpdGggZml4ZWQgc2l6ZS4KKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UpICAgICAgICAgXAorICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICBcCisgICAgcmVzdWx0ICs9IFdpcmVGb3JtYXRMaXRlOjprIyNDQU1FTENBU0UjI1NpemU7IFwKKyAgICBicmVhaworICAgICAgICBIQU5ETEVfVFlQRShGSVhFRDMyLCBGaXhlZDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoRklYRUQ2NCwgRml4ZWQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCBTRml4ZWQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCBTRml4ZWQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKEZMT0FULCBGbG9hdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgRG91YmxlKTsKKyAgICAgICAgSEFORExFX1RZUEUoQk9PTCwgQm9vbCk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246OkdldFNpemUoKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0soaXNfcmVwZWF0ZWQpOworICBzd2l0Y2ggKGNwcF90eXBlKHR5cGUpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgIFwKKyAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV8jI1VQUEVSQ0FTRTogXAorICAgIHJldHVybiByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5zaXplKCkKKworICAgIEhBTkRMRV9UWVBFKElOVDMyLCBpbnQzMl90KTsKKyAgICBIQU5ETEVfVFlQRShJTlQ2NCwgaW50NjRfdCk7CisgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzJfdCk7CisgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjRfdCk7CisgICAgSEFORExFX1RZUEUoRkxPQVQsIGZsb2F0KTsKKyAgICBIQU5ETEVfVFlQRShET1VCTEUsIGRvdWJsZSk7CisgICAgSEFORExFX1RZUEUoQk9PTCwgYm9vbCk7CisgICAgSEFORExFX1RZUEUoRU5VTSwgZW51bSk7CisgICAgSEFORExFX1RZUEUoU1RSSU5HLCBzdHJpbmcpOworICAgIEhBTkRMRV9UWVBFKE1FU1NBR0UsIG1lc3NhZ2UpOworI3VuZGVmIEhBTkRMRV9UWVBFCisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBhbGwgYWxsb2NhdGVkIG9iamVjdHMuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9ubHkKKy8vIGNhbGxlZCBpZiB0aGUgRXh0ZW5zaW9uIHdhcyBjcmVhdGVkIHdpdGhvdXQgYW4gYXJlbmEuCit2b2lkIEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpGcmVlKCkgeworICBpZiAoaXNfcmVwZWF0ZWQpIHsKKyAgICBzd2l0Y2ggKGNwcF90eXBlKHR5cGUpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgIFwKKyAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV8jI1VQUEVSQ0FTRTogXAorICAgIGRlbGV0ZSByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlOyAgICBcCisgICAgYnJlYWsKKworICAgICAgSEFORExFX1RZUEUoSU5UMzIsIGludDMyX3QpOworICAgICAgSEFORExFX1RZUEUoSU5UNjQsIGludDY0X3QpOworICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzJfdCk7CisgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIHVpbnQ2NF90KTsKKyAgICAgIEhBTkRMRV9UWVBFKEZMT0FULCBmbG9hdCk7CisgICAgICBIQU5ETEVfVFlQRShET1VCTEUsIGRvdWJsZSk7CisgICAgICBIQU5ETEVfVFlQRShCT09MLCBib29sKTsKKyAgICAgIEhBTkRMRV9UWVBFKEVOVU0sIGVudW0pOworICAgICAgSEFORExFX1RZUEUoU1RSSU5HLCBzdHJpbmcpOworICAgICAgSEFORExFX1RZUEUoTUVTU0FHRSwgbWVzc2FnZSk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChjcHBfdHlwZSh0eXBlKSkgeworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIGRlbGV0ZSBzdHJpbmdfdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBpZiAoaXNfbGF6eSkgeworICAgICAgICAgIGRlbGV0ZSBsYXp5bWVzc2FnZV92YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkZWxldGUgbWVzc2FnZV92YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisvLyBEZWZpbmVkIGluIGV4dGVuc2lvbl9zZXRfaGVhdnkuY2MuCisvLyBpbnQgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdAorCitib29sIEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICBpZiAoY3BwX3R5cGUodHlwZSkgPT0gV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgIGlmIChpc19yZXBlYXRlZCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoIXJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkdldChpKS5Jc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFpc19jbGVhcmVkKSB7CisgICAgICAgIGlmIChpc19sYXp5KSB7CisgICAgICAgICAgaWYgKCFsYXp5bWVzc2FnZV92YWx1ZS0+SXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCFtZXNzYWdlX3ZhbHVlLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRHVtbXkga2V5IG1ldGhvZCB0byBhdm9pZCB3ZWFrIHZ0YWJsZS4KK3ZvaWQgRXh0ZW5zaW9uU2V0OjpMYXp5TWVzc2FnZUV4dGVuc2lvbjo6VW51c2VkS2V5TWV0aG9kKCkge30KKworY29uc3QgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb24qIEV4dGVuc2lvblNldDo6RmluZE9yTnVsbChpbnQga2V5KSBjb25zdCB7CisgIGlmIChmbGF0X3NpemVfID09IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfSBlbHNlIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoIWlzX2xhcmdlKCkpKSB7CisgICAgYXV0byBpdCA9IHN0ZDo6bG93ZXJfYm91bmQoZmxhdF9iZWdpbigpLCBmbGF0X2VuZCgpIC0gMSwga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleVZhbHVlOjpGaXJzdENvbXBhcmF0b3IoKSk7CisgICAgcmV0dXJuIGl0LT5maXJzdCA9PSBrZXkgPyAmaXQtPnNlY29uZCA6IG51bGxwdHI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZpbmRPck51bGxJbkxhcmdlTWFwKGtleSk7CisgIH0KK30KKworY29uc3QgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb24qIEV4dGVuc2lvblNldDo6RmluZE9yTnVsbEluTGFyZ2VNYXAoCisgICAgaW50IGtleSkgY29uc3QgeworICBhc3NlcnQoaXNfbGFyZ2UoKSk7CisgIExhcmdlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1hcF8ubGFyZ2UtPmZpbmQoa2V5KTsKKyAgaWYgKGl0ICE9IG1hcF8ubGFyZ2UtPmVuZCgpKSB7CisgICAgcmV0dXJuICZpdC0+c2Vjb25kOworICB9CisgIHJldHVybiBudWxscHRyOworfQorCitFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbiogRXh0ZW5zaW9uU2V0OjpGaW5kT3JOdWxsKGludCBrZXkpIHsKKyAgY29uc3QgYXV0byogY29uc3RfdGhpcyA9IHRoaXM7CisgIHJldHVybiBjb25zdF9jYXN0PEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uKj4oY29uc3RfdGhpcy0+RmluZE9yTnVsbChrZXkpKTsKK30KKworRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb24qIEV4dGVuc2lvblNldDo6RmluZE9yTnVsbEluTGFyZ2VNYXAoaW50IGtleSkgeworICBjb25zdCBhdXRvKiBjb25zdF90aGlzID0gdGhpczsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXh0ZW5zaW9uU2V0OjpFeHRlbnNpb24qPigKKyAgICAgIGNvbnN0X3RoaXMtPkZpbmRPck51bGxJbkxhcmdlTWFwKGtleSkpOworfQorCitzdGQ6OnBhaXI8RXh0ZW5zaW9uU2V0OjpFeHRlbnNpb24qLCBib29sPiBFeHRlbnNpb25TZXQ6Okluc2VydChpbnQga2V5KSB7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKGlzX2xhcmdlKCkpKSB7CisgICAgYXV0byBtYXliZSA9IG1hcF8ubGFyZ2UtPmluc2VydCh7a2V5LCBFeHRlbnNpb24oKX0pOworICAgIHJldHVybiB7Jm1heWJlLmZpcnN0LT5zZWNvbmQsIG1heWJlLnNlY29uZH07CisgIH0KKyAgS2V5VmFsdWUqIGVuZCA9IGZsYXRfZW5kKCk7CisgIEtleVZhbHVlKiBpdCA9CisgICAgICBzdGQ6Omxvd2VyX2JvdW5kKGZsYXRfYmVnaW4oKSwgZW5kLCBrZXksIEtleVZhbHVlOjpGaXJzdENvbXBhcmF0b3IoKSk7CisgIGlmIChpdCAhPSBlbmQgJiYgaXQtPmZpcnN0ID09IGtleSkgeworICAgIHJldHVybiB7Jml0LT5zZWNvbmQsIGZhbHNlfTsKKyAgfQorICBpZiAoZmxhdF9zaXplXyA8IGZsYXRfY2FwYWNpdHlfKSB7CisgICAgc3RkOjpjb3B5X2JhY2t3YXJkKGl0LCBlbmQsIGVuZCArIDEpOworICAgICsrZmxhdF9zaXplXzsKKyAgICBpdC0+Zmlyc3QgPSBrZXk7CisgICAgaXQtPnNlY29uZCA9IEV4dGVuc2lvbigpOworICAgIHJldHVybiB7Jml0LT5zZWNvbmQsIHRydWV9OworICB9CisgIEdyb3dDYXBhY2l0eShmbGF0X3NpemVfICsgMSk7CisgIHJldHVybiBJbnNlcnQoa2V5KTsKK30KKwordm9pZCBFeHRlbnNpb25TZXQ6Okdyb3dDYXBhY2l0eShzaXplX3QgbWluaW11bV9uZXdfY2FwYWNpdHkpIHsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoaXNfbGFyZ2UoKSkpIHsKKyAgICByZXR1cm47ICAvLyBMYXJnZU1hcCBkb2VzIG5vdCBoYXZlIGEgInJlc2VydmUiIG1ldGhvZC4KKyAgfQorICBpZiAoZmxhdF9jYXBhY2l0eV8gPj0gbWluaW11bV9uZXdfY2FwYWNpdHkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBhdXRvIG5ld19mbGF0X2NhcGFjaXR5ID0gZmxhdF9jYXBhY2l0eV87CisgIGRvIHsKKyAgICBuZXdfZmxhdF9jYXBhY2l0eSA9IG5ld19mbGF0X2NhcGFjaXR5ID09IDAgPyAxIDogbmV3X2ZsYXRfY2FwYWNpdHkgKiA0OworICB9IHdoaWxlIChuZXdfZmxhdF9jYXBhY2l0eSA8IG1pbmltdW1fbmV3X2NhcGFjaXR5KTsKKworICBjb25zdCBLZXlWYWx1ZSogYmVnaW4gPSBmbGF0X2JlZ2luKCk7CisgIGNvbnN0IEtleVZhbHVlKiBlbmQgPSBmbGF0X2VuZCgpOworICBBbGxvY2F0ZWREYXRhIG5ld19tYXA7CisgIGlmIChuZXdfZmxhdF9jYXBhY2l0eSA+IGtNYXhpbXVtRmxhdENhcGFjaXR5KSB7CisgICAgbmV3X21hcC5sYXJnZSA9IEFyZW5hOjpDcmVhdGU8TGFyZ2VNYXA+KGFyZW5hXyk7CisgICAgTGFyZ2VNYXA6Oml0ZXJhdG9yIGhpbnQgPSBuZXdfbWFwLmxhcmdlLT5iZWdpbigpOworICAgIGZvciAoY29uc3QgS2V5VmFsdWUqIGl0ID0gYmVnaW47IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgaGludCA9IG5ld19tYXAubGFyZ2UtPmluc2VydChoaW50LCB7aXQtPmZpcnN0LCBpdC0+c2Vjb25kfSk7CisgICAgfQorICAgIGZsYXRfc2l6ZV8gPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oLTEpOworICAgIEdPT0dMRV9EQ0hFQ0soaXNfbGFyZ2UoKSk7CisgIH0gZWxzZSB7CisgICAgbmV3X21hcC5mbGF0ID0gQXJlbmE6OkNyZWF0ZUFycmF5PEtleVZhbHVlPihhcmVuYV8sIG5ld19mbGF0X2NhcGFjaXR5KTsKKyAgICBzdGQ6OmNvcHkoYmVnaW4sIGVuZCwgbmV3X21hcC5mbGF0KTsKKyAgfQorCisgIGlmIChhcmVuYV8gPT0gbnVsbHB0cikgeworICAgIERlbGV0ZUZsYXRNYXAoYmVnaW4sIGZsYXRfY2FwYWNpdHlfKTsKKyAgfQorICBmbGF0X2NhcGFjaXR5XyA9IG5ld19mbGF0X2NhcGFjaXR5OworICBtYXBfID0gbmV3X21hcDsKK30KKworI2lmIChfX2NwbHVzcGx1cyA8IDIwMTcwMykgJiYgXAorICAgICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDE5MDAgJiYgX01TQ19WRVIgPCAxOTEyKSkKKy8vIHN0YXRpYworY29uc3RleHByIHVpbnQxNl90IEV4dGVuc2lvblNldDo6a01heGltdW1GbGF0Q2FwYWNpdHk7CisjZW5kaWYgIC8vICAoX19jcGx1c3BsdXMgPCAyMDE3MDMpICYmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDE5MDAKKyAgICAgICAgLy8gICYmIF9NU0NfVkVSIDwgMTkxMikpCisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpFcmFzZShpbnQga2V5KSB7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKGlzX2xhcmdlKCkpKSB7CisgICAgbWFwXy5sYXJnZS0+ZXJhc2Uoa2V5KTsKKyAgICByZXR1cm47CisgIH0KKyAgS2V5VmFsdWUqIGVuZCA9IGZsYXRfZW5kKCk7CisgIEtleVZhbHVlKiBpdCA9CisgICAgICBzdGQ6Omxvd2VyX2JvdW5kKGZsYXRfYmVnaW4oKSwgZW5kLCBrZXksIEtleVZhbHVlOjpGaXJzdENvbXBhcmF0b3IoKSk7CisgIGlmIChpdCAhPSBlbmQgJiYgaXQtPmZpcnN0ID09IGtleSkgeworICAgIHN0ZDo6Y29weShpdCArIDEsIGVuZCwgaXQpOworICAgIC0tZmxhdF9zaXplXzsKKyAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERlZmF1bHQgcmVwZWF0ZWQgZmllbGQgaW5zdGFuY2VzIGZvciBpdGVyYXRvci1jb21wYXRpYmxlIGFjY2Vzc29ycworCitjb25zdCBSZXBlYXRlZFByaW1pdGl2ZURlZmF1bHRzKiBSZXBlYXRlZFByaW1pdGl2ZURlZmF1bHRzOjpkZWZhdWx0X2luc3RhbmNlKCkgeworICBzdGF0aWMgYXV0byBpbnN0YW5jZSA9IE9uU2h1dGRvd25EZWxldGUobmV3IFJlcGVhdGVkUHJpbWl0aXZlRGVmYXVsdHMpOworICByZXR1cm4gaW5zdGFuY2U7Cit9CisKK2NvbnN0IFJlcGVhdGVkU3RyaW5nVHlwZVRyYWl0czo6UmVwZWF0ZWRGaWVsZFR5cGUqCitSZXBlYXRlZFN0cmluZ1R5cGVUcmFpdHM6OkdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCkgeworICBzdGF0aWMgYXV0byBpbnN0YW5jZSA9IE9uU2h1dGRvd25EZWxldGUobmV3IFJlcGVhdGVkRmllbGRUeXBlKTsKKyAgcmV0dXJuIGluc3RhbmNlOworfQorCit1aW50OF90KiBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6SW50ZXJuYWxTZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgY29uc3QgTWVzc2FnZUxpdGUqIGV4dGVuZGVlLCBjb25zdCBFeHRlbnNpb25TZXQqIGV4dGVuc2lvbl9zZXQsIGludCBudW1iZXIsCisgICAgdWludDhfdCogdGFyZ2V0LCBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIGlmIChpc19yZXBlYXRlZCkgeworICAgIGlmIChpc19wYWNrZWQpIHsKKyAgICAgIGlmIChjYWNoZWRfc2l6ZSA9PSAwKSByZXR1cm4gdGFyZ2V0OworCisgICAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgICAgIG51bWJlciwgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIHRhcmdldCk7CisgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMk5vVGFnVG9BcnJheShjYWNoZWRfc2l6ZSwgdGFyZ2V0KTsKKworICAgICAgc3dpdGNoIChyZWFsX3R5cGUodHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPnNpemUoKTsgaSsrKSB7IFwKKyAgICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZSMjQ0FNRUxDQVNFIyNOb1RhZ1RvQXJyYXkoICAgICAgIFwKKyAgICAgICAgICByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5HZXQoaSksIHRhcmdldCk7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhaworCisgICAgICAgIEhBTkRMRV9UWVBFKElOVDMyLCBJbnQzMiwgaW50MzJfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKElOVDY0LCBJbnQ2NCwgaW50NjRfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgVUludDMyLCB1aW50MzJfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgVUludDY0LCB1aW50NjRfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKFNJTlQzMiwgU0ludDMyLCBpbnQzMl90KTsKKyAgICAgICAgSEFORExFX1RZUEUoU0lOVDY0LCBTSW50NjQsIGludDY0X3QpOworICAgICAgICBIQU5ETEVfVFlQRShGSVhFRDMyLCBGaXhlZDMyLCB1aW50MzJfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKEZJWEVENjQsIEZpeGVkNjQsIHVpbnQ2NF90KTsKKyAgICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsIFNGaXhlZDMyLCBpbnQzMl90KTsKKyAgICAgICAgSEFORExFX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0LCBpbnQ2NF90KTsKKyAgICAgICAgSEFORExFX1RZUEUoRkxPQVQsIEZsb2F0LCBmbG9hdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgRG91YmxlLCBkb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRShCT09MLCBCb29sLCBib29sKTsKKyAgICAgICAgSEFORExFX1RZUEUoRU5VTSwgRW51bSwgZW51bSk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NUUklORzoKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CWVRFUzoKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUDoKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFOgorICAgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJOb24tcHJpbWl0aXZlIHR5cGVzIGNhbid0IGJlIHBhY2tlZC4iOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKHJlYWxfdHlwZSh0eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgXAorICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpOyBpKyspIHsgXAorICAgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlIyNDQU1FTENBU0UjI1RvQXJyYXkoICAgICAgICAgICAgXAorICAgICAgICAgIG51bWJlciwgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+R2V0KGkpLCB0YXJnZXQpOyAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJyZWFrCisKKyAgICAgICAgSEFORExFX1RZUEUoSU5UMzIsIEludDMyLCBpbnQzMl90KTsKKyAgICAgICAgSEFORExFX1RZUEUoSU5UNjQsIEludDY0LCBpbnQ2NF90KTsKKyAgICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCBVSW50MzIsIHVpbnQzMl90KTsKKyAgICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCBVSW50NjQsIHVpbnQ2NF90KTsKKyAgICAgICAgSEFORExFX1RZUEUoU0lOVDMyLCBTSW50MzIsIGludDMyX3QpOworICAgICAgICBIQU5ETEVfVFlQRShTSU5UNjQsIFNJbnQ2NCwgaW50NjRfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKEZJWEVEMzIsIEZpeGVkMzIsIHVpbnQzMl90KTsKKyAgICAgICAgSEFORExFX1RZUEUoRklYRUQ2NCwgRml4ZWQ2NCwgdWludDY0X3QpOworICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIsIGludDMyX3QpOworICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgU0ZpeGVkNjQsIGludDY0X3QpOworICAgICAgICBIQU5ETEVfVFlQRShGTE9BVCwgRmxvYXQsIGZsb2F0KTsKKyAgICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBEb3VibGUsIGRvdWJsZSk7CisgICAgICAgIEhBTkRMRV9UWVBFKEJPT0wsIEJvb2wsIGJvb2wpOworICAgICAgICBIQU5ETEVfVFlQRShFTlVNLCBFbnVtLCBlbnVtKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgXAorICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpOyBpKyspIHsgXAorICAgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG51bWJlciwgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+R2V0KGkpLCB0YXJnZXQpOyAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJyZWFrCisgICAgICAgIEhBTkRMRV9UWVBFKFNUUklORywgU3RyaW5nLCBzdHJpbmcpOworICAgICAgICBIQU5ETEVfVFlQRShCWVRFUywgQnl0ZXMsIHN0cmluZyk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUDoKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6SW50ZXJuYWxXcml0ZUdyb3VwKAorICAgICAgICAgICAgICAgIG51bWJlciwgcmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+R2V0KGkpLCB0YXJnZXQsIHN0cmVhbSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0U6CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXV0byYgbXNnID0gcmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+R2V0KGkpOworICAgICAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OkludGVybmFsV3JpdGVNZXNzYWdlKAorICAgICAgICAgICAgICAgIG51bWJlciwgbXNnLCBtc2cuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICghaXNfY2xlYXJlZCkgeworICAgIHN3aXRjaCAocmVhbF90eXBlKHR5cGUpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBWQUxVRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlIyNDQU1FTENBU0UjI1RvQXJyYXkobnVtYmVyLCBWQUxVRSwgdGFyZ2V0KTsgXAorICAgIGJyZWFrCisKKyAgICAgIEhBTkRMRV9UWVBFKElOVDMyLCBJbnQzMiwgaW50MzJfdF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRShJTlQ2NCwgSW50NjQsIGludDY0X3RfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCBVSW50MzIsIHVpbnQzMl90X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgVUludDY0LCB1aW50NjRfdF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRShTSU5UMzIsIFNJbnQzMiwgaW50MzJfdF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRShTSU5UNjQsIFNJbnQ2NCwgaW50NjRfdF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRShGSVhFRDMyLCBGaXhlZDMyLCB1aW50MzJfdF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRShGSVhFRDY0LCBGaXhlZDY0LCB1aW50NjRfdF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIsIGludDMyX3RfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0LCBpbnQ2NF90X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKEZMT0FULCBGbG9hdCwgZmxvYXRfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBEb3VibGUsIGRvdWJsZV92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRShCT09MLCBCb29sLCBib29sX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKEVOVU0sIEVudW0sIGVudW1fdmFsdWUpOworI3VuZGVmIEhBTkRMRV9UWVBFCisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBWQUxVRSkgICAgICAgICBcCisgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICBcCisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOyAgICAgICAgICAgICAgICBcCisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZyhudW1iZXIsIFZBTFVFLCB0YXJnZXQpOyBcCisgICAgYnJlYWsKKyAgICAgIEhBTkRMRV9UWVBFKFNUUklORywgU3RyaW5nLCAqc3RyaW5nX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKEJZVEVTLCBCeXRlcywgKnN0cmluZ192YWx1ZSk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfR1JPVVA6CisgICAgICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OkludGVybmFsV3JpdGVHcm91cChudW1iZXIsICptZXNzYWdlX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCwgc3RyZWFtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0U6CisgICAgICAgIGlmIChpc19sYXp5KSB7CisgICAgICAgICAgY29uc3QgYXV0byogcHJvdG90eXBlID0KKyAgICAgICAgICAgICAgZXh0ZW5zaW9uX3NldC0+R2V0UHJvdG90eXBlRm9yTGF6eU1lc3NhZ2UoZXh0ZW5kZWUsIG51bWJlcik7CisgICAgICAgICAgdGFyZ2V0ID0gbGF6eW1lc3NhZ2VfdmFsdWUtPldyaXRlTWVzc2FnZVRvQXJyYXkocHJvdG90eXBlLCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBzdHJlYW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpJbnRlcm5hbFdyaXRlTWVzc2FnZSgKKyAgICAgICAgICAgICAgbnVtYmVyLCAqbWVzc2FnZV92YWx1ZSwgbWVzc2FnZV92YWx1ZS0+R2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsCisgICAgICAgICAgICAgIHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2NvbnN0IE1lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6OkdldFByb3RvdHlwZUZvckxhenlNZXNzYWdlKAorICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwgaW50IG51bWJlcikgY29uc3QgeworICBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXIgZmluZGVyKGV4dGVuZGVlKTsKKyAgYm9vbCB3YXNfcGFja2VkX29uX3dpcmUgPSBmYWxzZTsKKyAgRXh0ZW5zaW9uSW5mbyBleHRlbnNpb25faW5mbzsKKyAgaWYgKCFGaW5kRXh0ZW5zaW9uSW5mb0Zyb21GaWVsZE51bWJlcigKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIG51bWJlciwgJmZpbmRlciwKKyAgICAgICAgICAmZXh0ZW5zaW9uX2luZm8sICZ3YXNfcGFja2VkX29uX3dpcmUpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIGV4dGVuc2lvbl9pbmZvLm1lc3NhZ2VfaW5mby5wcm90b3R5cGU7Cit9CisKK3VpbnQ4X3QqCitFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6SW50ZXJuYWxTZXJpYWxpemVNZXNzYWdlU2V0SXRlbVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgY29uc3QgTWVzc2FnZUxpdGUqIGV4dGVuZGVlLCBjb25zdCBFeHRlbnNpb25TZXQqIGV4dGVuc2lvbl9zZXQsIGludCBudW1iZXIsCisgICAgdWludDhfdCogdGFyZ2V0LCBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIGlmICh0eXBlICE9IFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UgfHwgaXNfcmVwZWF0ZWQpIHsKKyAgICAvLyBOb3QgYSB2YWxpZCBNZXNzYWdlU2V0IGV4dGVuc2lvbiwgYnV0IHNlcmlhbGl6ZSBpdCB0aGUgbm9ybWFsIHdheS4KKyAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJJbnZhbGlkIG1lc3NhZ2Ugc2V0IGV4dGVuc2lvbi4iOworICAgIHJldHVybiBJbnRlcm5hbFNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzVG9BcnJheShleHRlbmRlZSwgZXh0ZW5zaW9uX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICBpZiAoaXNfY2xlYXJlZCkgcmV0dXJuIHRhcmdldDsKKworICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgIC8vIFN0YXJ0IGdyb3VwLgorICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZywgdGFyZ2V0KTsKKyAgLy8gV3JpdGUgdHlwZSBJRC4KKyAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDMyVG9BcnJheSgKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZE51bWJlciwgbnVtYmVyLCB0YXJnZXQpOworICAvLyBXcml0ZSBtZXNzYWdlLgorICBpZiAoaXNfbGF6eSkgeworICAgIGNvbnN0IGF1dG8qIHByb3RvdHlwZSA9CisgICAgICAgIGV4dGVuc2lvbl9zZXQtPkdldFByb3RvdHlwZUZvckxhenlNZXNzYWdlKGV4dGVuZGVlLCBudW1iZXIpOworICAgIHRhcmdldCA9IGxhenltZXNzYWdlX3ZhbHVlLT5Xcml0ZU1lc3NhZ2VUb0FycmF5KAorICAgICAgICBwcm90b3R5cGUsIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VOdW1iZXIsIHRhcmdldCwgc3RyZWFtKTsKKyAgfSBlbHNlIHsKKyAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6SW50ZXJuYWxXcml0ZU1lc3NhZ2UoCisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VOdW1iZXIsICptZXNzYWdlX3ZhbHVlLAorICAgICAgICBtZXNzYWdlX3ZhbHVlLT5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBFbmQgZ3JvdXAuCisgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVRhZ1RvQXJyYXkoCisgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnLCB0YXJnZXQpOworICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246Ok1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoaW50IG51bWJlcikgY29uc3QgeworICBpZiAodHlwZSAhPSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFIHx8IGlzX3JlcGVhdGVkKSB7CisgICAgLy8gTm90IGEgdmFsaWQgTWVzc2FnZVNldCBleHRlbnNpb24sIGJ1dCBjb21wdXRlIHRoZSBieXRlIHNpemUgZm9yIGl0IHRoZQorICAgIC8vIG5vcm1hbCB3YXkuCisgICAgcmV0dXJuIEJ5dGVTaXplKG51bWJlcik7CisgIH0KKworICBpZiAoaXNfY2xlYXJlZCkgcmV0dXJuIDA7CisKKyAgc2l6ZV90IG91cl9zaXplID0gV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVRhZ3NTaXplOworCisgIC8vIHR5cGVfaWQKKyAgb3VyX3NpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIobnVtYmVyKTsKKworICAvLyBtZXNzYWdlCisgIHNpemVfdCBtZXNzYWdlX3NpemUgPSAwOworICBpZiAoaXNfbGF6eSkgeworICAgIG1lc3NhZ2Vfc2l6ZSA9IGxhenltZXNzYWdlX3ZhbHVlLT5CeXRlU2l6ZUxvbmcoKTsKKyAgfSBlbHNlIHsKKyAgICBtZXNzYWdlX3NpemUgPSBtZXNzYWdlX3ZhbHVlLT5CeXRlU2l6ZUxvbmcoKTsKKyAgfQorCisgIG91cl9zaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKG1lc3NhZ2Vfc2l6ZSk7CisgIG91cl9zaXplICs9IG1lc3NhZ2Vfc2l6ZTsKKworICByZXR1cm4gb3VyX3NpemU7Cit9CisKK3NpemVfdCBFeHRlbnNpb25TZXQ6Ok1lc3NhZ2VTZXRCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworICBGb3JFYWNoKFsmdG90YWxfc2l6ZV0oaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uJiBleHQpIHsKKyAgICB0b3RhbF9zaXplICs9IGV4dC5NZXNzYWdlU2V0SXRlbUJ5dGVTaXplKG51bWJlcik7CisgIH0pOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKworTGF6eUVhZ2VyVmVyaWZ5Rm5UeXBlIEZpbmRFeHRlbnNpb25MYXp5RWFnZXJWZXJpZnlGbigKKyAgICBjb25zdCBNZXNzYWdlTGl0ZSogZXh0ZW5kZWUsIGludCBudW1iZXIpIHsKKyAgY29uc3QgRXh0ZW5zaW9uSW5mbyogcmVnaXN0ZXJlZCA9IEZpbmRSZWdpc3RlcmVkRXh0ZW5zaW9uKGV4dGVuZGVlLCBudW1iZXIpOworICBpZiAocmVnaXN0ZXJlZCAhPSBudWxscHRyKSB7CisgICAgcmV0dXJuIHJlZ2lzdGVyZWQtPmxhenlfZWFnZXJfdmVyaWZ5X2Z1bmM7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2ZDA1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oCkBAIC0wLDAgKzEsMTU2MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgaGVhZGVyIGlzIGxvZ2ljYWxseSBpbnRlcm5hbCwgYnV0IGlzIG1hZGUgcHVibGljIGJlY2F1c2UgaXQgaXMgdXNlZAorLy8gZnJvbSBwcm90b2NvbC1jb21waWxlci1nZW5lcmF0ZWQgY29kZSwgd2hpY2ggbWF5IHJlc2lkZSBpbiBvdGhlciBjb21wb25lbnRzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fU0VUX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX1NFVF9IX18KKworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wYXJzZV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+ICAvLyBNdXN0IGJlIGxhc3QKKy8vIGNsYW5nLWZvcm1hdCBvbgorCisjaWZkZWYgU1dJRworI2Vycm9yICJZb3UgY2Fubm90IFNXSUcgcHJvdG8gaGVhZGVycyIKKyNlbmRpZgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CitjbGFzcyBBcmVuYTsKK2NsYXNzIERlc2NyaXB0b3I7ICAgICAgIC8vIGRlc2NyaXB0b3IuaAorY2xhc3MgRmllbGREZXNjcmlwdG9yOyAgLy8gZGVzY3JpcHRvci5oCitjbGFzcyBEZXNjcmlwdG9yUG9vbDsgICAvLyBkZXNjcmlwdG9yLmgKK2NsYXNzIE1lc3NhZ2VMaXRlOyAgICAgIC8vIG1lc3NhZ2VfbGl0ZS5oCitjbGFzcyBNZXNzYWdlOyAgICAgICAgICAvLyBtZXNzYWdlLmgKK2NsYXNzIE1lc3NhZ2VGYWN0b3J5OyAgIC8vIG1lc3NhZ2UuaAorY2xhc3MgUmVmbGVjdGlvbjsgICAgICAgLy8gbWVzc2FnZS5oCitjbGFzcyBVbmtub3duRmllbGRTZXQ7ICAvLyB1bmtub3duX2ZpZWxkX3NldC5oCituYW1lc3BhY2UgaW50ZXJuYWwgeworY2xhc3MgRmllbGRTa2lwcGVyOyAgLy8gd2lyZV9mb3JtYXRfbGl0ZS5oCitlbnVtIGNsYXNzIExhenlWZXJpZnlPcHRpb247Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjbGFzcyBJbnRlcm5hbE1ldGFkYXRhOworCisvLyBVc2VkIHRvIHN0b3JlIHZhbHVlcyBvZiB0eXBlIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgd2l0aG91dCBoYXZpbmcgdG8KKy8vICNpbmNsdWRlIHdpcmVfZm9ybWF0X2xpdGUuaC4gIEFsc28sIGVuc3VyZXMgdGhhdCB3ZSB1c2Ugb25seSBvbmUgYnl0ZSB0bworLy8gc3RvcmUgdGhlc2UgdmFsdWVzLCB3aGljaCBpcyBpbXBvcnRhbnQgdG8ga2VlcCB0aGUgbGF5b3V0IG9mCisvLyBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbiBzbWFsbC4KK3R5cGVkZWYgdWludDhfdCBGaWVsZFR5cGU7CisKKy8vIEEgZnVuY3Rpb24gd2hpY2gsIGdpdmVuIGFuIGludGVnZXIgdmFsdWUsIHJldHVybnMgdHJ1ZSBpZiB0aGUgbnVtYmVyCisvLyBtYXRjaGVzIG9uZSBvZiB0aGUgZGVmaW5lZCB2YWx1ZXMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGVudW0gdHlwZS4gIFRoaXMKKy8vIGlzIHVzZWQgd2l0aCBSZWdpc3RlckVudW1FeHRlbnNpb24sIGJlbG93LgordHlwZWRlZiBib29sIEVudW1WYWxpZGl0eUZ1bmMoaW50IG51bWJlcik7CisKKy8vIFZlcnNpb24gb2YgdGhlIGFib3ZlIHdoaWNoIHRha2VzIGFuIGFyZ3VtZW50LiAgVGhpcyBpcyBuZWVkZWQgdG8gZGVhbCB3aXRoCisvLyBleHRlbnNpb25zIHRoYXQgYXJlIG5vdCBjb21waWxlZCBpbi4KK3R5cGVkZWYgYm9vbCBFbnVtVmFsaWRpdHlGdW5jV2l0aEFyZyhjb25zdCB2b2lkKiBhcmcsIGludCBudW1iZXIpOworCisvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uLgorc3RydWN0IEV4dGVuc2lvbkluZm8geworICBjb25zdGV4cHIgRXh0ZW5zaW9uSW5mbygpIDogZW51bV92YWxpZGl0eV9jaGVjaygpIHt9CisgIGNvbnN0ZXhwciBFeHRlbnNpb25JbmZvKGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwgaW50IHBhcmFtX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRUeXBlIHR5cGVfcGFyYW0sIGJvb2wgaXNyZXBlYXRlZCwgYm9vbCBpc3BhY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGF6eUVhZ2VyVmVyaWZ5Rm5UeXBlIHZlcmlmeV9mdW5jKQorICAgICAgOiBtZXNzYWdlKGV4dGVuZGVlKSwKKyAgICAgICAgbnVtYmVyKHBhcmFtX251bWJlciksCisgICAgICAgIHR5cGUodHlwZV9wYXJhbSksCisgICAgICAgIGlzX3JlcGVhdGVkKGlzcmVwZWF0ZWQpLAorICAgICAgICBpc19wYWNrZWQoaXNwYWNrZWQpLAorICAgICAgICBlbnVtX3ZhbGlkaXR5X2NoZWNrKCksCisgICAgICAgIGxhenlfZWFnZXJfdmVyaWZ5X2Z1bmModmVyaWZ5X2Z1bmMpIHt9CisKKyAgY29uc3QgTWVzc2FnZUxpdGUqIG1lc3NhZ2UgPSBudWxscHRyOworICBpbnQgbnVtYmVyID0gMDsKKworICBGaWVsZFR5cGUgdHlwZSA9IDA7CisgIGJvb2wgaXNfcmVwZWF0ZWQgPSBmYWxzZTsKKyAgYm9vbCBpc19wYWNrZWQgPSBmYWxzZTsKKworICBzdHJ1Y3QgRW51bVZhbGlkaXR5Q2hlY2sgeworICAgIEVudW1WYWxpZGl0eUZ1bmNXaXRoQXJnKiBmdW5jOworICAgIGNvbnN0IHZvaWQqIGFyZzsKKyAgfTsKKworICBzdHJ1Y3QgTWVzc2FnZUluZm8geworICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBwcm90b3R5cGU7CisgIH07CisKKyAgdW5pb24geworICAgIEVudW1WYWxpZGl0eUNoZWNrIGVudW1fdmFsaWRpdHlfY2hlY2s7CisgICAgTWVzc2FnZUluZm8gbWVzc2FnZV9pbmZvOworICB9OworCisgIC8vIFRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIGV4dGVuc2lvbiwgaWYgb25lIGV4aXN0cyBhbmQgaXMga25vd24uICBNYXkgYmUKKyAgLy8gbnVsbHB0ci4gIE11c3Qgbm90IGJlIG51bGxwdHIgaWYgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBleHRlbnNpb24gZG9lcyBub3QKKyAgLy8gbGl2ZSBpbiB0aGUgc2FtZSBwb29sIGFzIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgY29udGFpbmluZyB0eXBlLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBudWxscHRyOworCisgIC8vIElmIHRoaXMgZmllbGQgaXMgcG90ZW50aWFsbHkgbGF6eSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGFzIGEgY2hlYXAKKyAgLy8gdmVyaWZpY2F0aW9uIG9mIHRoZSByYXcgYnl0ZXMuCisgIC8vIElmIG51bGxwdHIgdGhlbiBubyB2ZXJpZmljYXRpb24gaXMgcGVyZm9ybWVkLgorICBMYXp5RWFnZXJWZXJpZnlGblR5cGUgbGF6eV9lYWdlcl92ZXJpZnlfZnVuYyA9IG51bGxwdHI7Cit9OworCisvLyBBbiBFeHRlbnNpb25GaW5kZXIgaXMgYW4gb2JqZWN0IHdoaWNoIGxvb2tzIHVwIGV4dGVuc2lvbiBkZWZpbml0aW9ucy4gIEl0CisvLyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZDoKKy8vCisvLyBib29sIEZpbmQoaW50IG51bWJlciwgRXh0ZW5zaW9uSW5mbyogb3V0cHV0KTsKKworLy8gR2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyIGlzIGFuIEV4dGVuc2lvbkZpbmRlciB3aGljaCBmaW5kcyBleHRlbnNpb25zCisvLyBkZWZpbmVkIGluIC5wcm90byBmaWxlcyB3aGljaCBoYXZlIGJlZW4gY29tcGlsZWQgaW50byB0aGUgYmluYXJ5LgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEdlbmVyYXRlZEV4dGVuc2lvbkZpbmRlciB7CisgcHVibGljOgorICBleHBsaWNpdCBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXIoY29uc3QgTWVzc2FnZUxpdGUqIGV4dGVuZGVlKQorICAgICAgOiBleHRlbmRlZV8oZXh0ZW5kZWUpIHt9CisKKyAgLy8gUmV0dXJucyB0cnVlIGFuZCBmaWxscyBpbiAqb3V0cHV0IGlmIGZvdW5kLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKyAgYm9vbCBGaW5kKGludCBudW1iZXIsIEV4dGVuc2lvbkluZm8qIG91dHB1dCk7CisKKyBwcml2YXRlOgorICBjb25zdCBNZXNzYWdlTGl0ZSogZXh0ZW5kZWVfOworfTsKKworLy8gTm90ZTogIGV4dGVuc2lvbl9zZXRfaGVhdnkuY2MgZGVmaW5lcyBEZXNjcmlwdG9yUG9vbEV4dGVuc2lvbkZpbmRlciBmb3IKKy8vIGZpbmRpbmcgZXh0ZW5zaW9ucyBmcm9tIGEgRGVzY3JpcHRvclBvb2wuCisKKy8vIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVscGVyIGNsYXNzIGludGVuZGVkIGZvciB1c2Ugd2l0aGluIHRoZSBwcm90b2NvbCBidWZmZXIKKy8vIGxpYnJhcnkgYW5kIGdlbmVyYXRlZCBjbGFzc2VzLiAgQ2xpZW50cyBzaG91bGQgbm90IHVzZSBpdCBkaXJlY3RseS4gIEluc3RlYWQsCisvLyB1c2UgdGhlIGdlbmVyYXRlZCBhY2Nlc3NvcnMgc3VjaCBhcyBHZXRFeHRlbnNpb24oKSBvZiB0aGUgY2xhc3MgYmVpbmcKKy8vIGV4dGVuZGVkLgorLy8KKy8vIFRoaXMgY2xhc3MgbWFuYWdlcyBleHRlbnNpb25zIGZvciBhIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0LiAgVGhlCisvLyBtZXNzYWdlJ3MgSGFzRXh0ZW5zaW9uKCksIEdldEV4dGVuc2lvbigpLCBNdXRhYmxlRXh0ZW5zaW9uKCksIGFuZAorLy8gQ2xlYXJFeHRlbnNpb24oKSBtZXRob2RzIGFyZSBqdXN0IHRoaW4gd3JhcHBlcnMgYXJvdW5kIHRoZSBlbWJlZGRlZAorLy8gRXh0ZW5zaW9uU2V0LiAgV2hlbiBwYXJzaW5nLCBpZiBhIHRhZyBudW1iZXIgaXMgZW5jb3VudGVyZWQgd2hpY2ggaXMKKy8vIGluc2lkZSBvbmUgb2YgdGhlIG1lc3NhZ2UgdHlwZSdzIGV4dGVuc2lvbiByYW5nZXMsIHRoZSB0YWcgaXMgcGFzc2VkCisvLyBvZmYgdG8gdGhlIEV4dGVuc2lvblNldCBmb3IgcGFyc2luZy4gIEV0Yy4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBFeHRlbnNpb25TZXQgeworIHB1YmxpYzoKKyAgY29uc3RleHByIEV4dGVuc2lvblNldCgpOworICBleHBsaWNpdCBFeHRlbnNpb25TZXQoQXJlbmEqIGFyZW5hKTsKKyAgRXh0ZW5zaW9uU2V0KEFyZW5hSW5pdGlhbGl6ZWQsIEFyZW5hKiBhcmVuYSkgOiBFeHRlbnNpb25TZXQoYXJlbmEpIHt9CisgIH5FeHRlbnNpb25TZXQoKTsKKworICAvLyBUaGVzZSBhcmUgY2FsbGVkIGF0IHN0YXJ0dXAgYnkgcHJvdG9jb2wtY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUgdG8KKyAgLy8gcmVnaXN0ZXIga25vd24gZXh0ZW5zaW9ucy4gIFRoZSByZWdpc3RyYXRpb25zIGFyZSB1c2VkIGJ5IFBhcnNlRmllbGQoKQorICAvLyB0byBsb29rIHVwIGV4dGVuc2lvbnMgZm9yIHBhcnNlZCBmaWVsZCBudW1iZXJzLiAgTm90ZSB0aGF0IGR5bmFtaWMgcGFyc2luZworICAvLyBkb2VzIG5vdCB1c2UgUGFyc2VGaWVsZCgpOyBvbmx5IHByb3RvY29sLWNvbXBpbGVyLWdlbmVyYXRlZCBwYXJzaW5nCisgIC8vIG1ldGhvZHMgZG8uCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0ZW5zaW9uKGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwgaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRUeXBlIHR5cGUsIGJvb2wgaXNfcmVwZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXp5RWFnZXJWZXJpZnlGblR5cGUgdmVyaWZ5X2Z1bmMpOworICBzdGF0aWMgdm9pZCBSZWdpc3RlckVudW1FeHRlbnNpb24oY29uc3QgTWVzc2FnZUxpdGUqIGV4dGVuZGVlLCBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRUeXBlIHR5cGUsIGJvb2wgaXNfcmVwZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3BhY2tlZCwgRW51bVZhbGlkaXR5RnVuYyogaXNfdmFsaWQpOworICBzdGF0aWMgdm9pZCBSZWdpc3Rlck1lc3NhZ2VFeHRlbnNpb24oY29uc3QgTWVzc2FnZUxpdGUqIGV4dGVuZGVlLCBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRUeXBlIHR5cGUsIGJvb2wgaXNfcmVwZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3BhY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBwcm90b3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXp5RWFnZXJWZXJpZnlGblR5cGUgdmVyaWZ5X2Z1bmMpOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLy8gQWRkIGFsbCBmaWVsZHMgd2hpY2ggYXJlIGN1cnJlbnRseSBwcmVzZW50IHRvIHRoZSBnaXZlbiB2ZWN0b3IuICBUaGlzCisgIC8vIGlzIHVzZWZ1bCB0byBpbXBsZW1lbnQgUmVmbGVjdGlvbjo6TGlzdEZpZWxkcygpLgorICB2b2lkIEFwcGVuZFRvTGlzdChjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXRwdXQpIGNvbnN0OworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEFjY2Vzc29ycworICAvLworICAvLyBHZW5lcmF0ZWQgbWVzc2FnZSBjbGFzc2VzIGluY2x1ZGUgdHlwZS1zYWZlIHRlbXBsYXRlZCB3cmFwcGVycyBhcm91bmQKKyAgLy8gdGhlc2UgbWV0aG9kcy4gIEdlbmVyYWxseSB5b3Ugc2hvdWxkIHVzZSB0aG9zZSByYXRoZXIgdGhhbiBjYWxsIHRoZXNlCisgIC8vIGRpcmVjdGx5LCB1bmxlc3MgeW91IGFyZSBkb2luZyBsb3ctbGV2ZWwgbWVtb3J5IG1hbmFnZW1lbnQuCisgIC8vCisgIC8vIFdoZW4gY2FsbGluZyBhbnkgb2YgdGhlc2UgYWNjZXNzb3JzLCB0aGUgZXh0ZW5zaW9uIG51bWJlciByZXF1ZXN0ZWQKKyAgLy8gTVVTVCBleGlzdCBpbiB0aGUgRGVzY3JpcHRvclBvb2wgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLiAgT3RoZXJ3aXNlLAorICAvLyB0aGUgbWV0aG9kIHdpbGwgZmFpbCBhbiBhc3NlcnQuICBOb3JtYWxseSwgdGhvdWdoLCB5b3Ugd291bGQgbm90IGNhbGwKKyAgLy8gdGhlc2UgZGlyZWN0bHk7IHlvdSB3b3VsZCBlaXRoZXIgY2FsbCB0aGUgZ2VuZXJhdGVkIGFjY2Vzc29ycyBvZiB5b3VyCisgIC8vIG1lc3NhZ2UgY2xhc3MgKGUuZy4gR2V0RXh0ZW5zaW9uKCkpIG9yIHlvdSB3b3VsZCBjYWxsIHRoZSBhY2Nlc3NvcnMKKyAgLy8gb2YgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlLiAgSW4gYm90aCBjYXNlcywgaXQgaXMgaW1wb3NzaWJsZSB0bworICAvLyB0cmlnZ2VyIHRoaXMgYXNzZXJ0IGZhaWx1cmU6ICB0aGUgZ2VuZXJhdGVkIGFjY2Vzc29ycyBvbmx5IGFjY2VwdAorICAvLyBsaW5rZWQtaW4gZXh0ZW5zaW9uIHR5cGVzIGFzIHBhcmFtZXRlcnMsIHdoaWxlIHRoZSBSZWZsZWN0aW9uIGludGVyZmFjZQorICAvLyByZXF1aXJlcyB5b3UgdG8gcHJvdmlkZSB0aGUgRmllbGREZXNjcmlwdG9yIGRlc2NyaWJpbmcgdGhlIGV4dGVuc2lvbi4KKyAgLy8KKyAgLy8gV2hlbiBjYWxsaW5nIGFueSBvZiB0aGVzZSBhY2Nlc3NvcnMsIGEgcHJvdG9jb2wtY29tcGlsZXItZ2VuZXJhdGVkCisgIC8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlbnNpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbnVtYmVyIE1VU1QKKyAgLy8gYmUgbGlua2VkIGluLCBhbmQgdGhlIEZpZWxkRGVzY3JpcHRvciB1c2VkIHRvIHJlZmVyIHRvIGl0IE1VU1QgYmUKKyAgLy8gdGhlIG9uZSBnZW5lcmF0ZWQgYnkgdGhhdCBsaW5rZWQtaW4gY29kZS4gIE90aGVyd2lzZSwgdGhlIG1ldGhvZCB3aWxsCisgIC8vIGRpZSBvbiBhbiBhc3NlcnQgZmFpbHVyZS4gIFRoZSBtZXNzYWdlIG9iamVjdHMgcmV0dXJuZWQgYnkgdGhlIG1lc3NhZ2UKKyAgLy8gYWNjZXNzb3JzIGFyZSBndWFyYW50ZWVkIHRvIGJlIG9mIHRoZSBjb3JyZWN0IGxpbmtlZC1pbiB0eXBlLgorICAvLworICAvLyBUaGVzZSBtZXRob2RzIHByZXR0eSBtdWNoIG1hdGNoIFJlZmxlY3Rpb24gZXhjZXB0IHRoYXQ6CisgIC8vIC0gVGhleSdyZSBub3QgdmlydHVhbC4KKyAgLy8gLSBUaGV5IGlkZW50aWZ5IGZpZWxkcyBieSBudW1iZXIgcmF0aGVyIHRoYW4gRmllbGREZXNjcmlwdG9ycy4KKyAgLy8gLSBUaGV5IGlkZW50aWZ5IGVudW0gdmFsdWVzIHVzaW5nIGludGVnZXJzIHJhdGhlciB0aGFuIGRlc2NyaXB0b3JzLgorICAvLyAtIFN0cmluZ3MgcHJvdmlkZSBNdXRhYmxlKCkgaW4gYWRkaXRpb24gdG8gU2V0KCkgYWNjZXNzb3JzLgorCisgIGJvb2wgSGFzKGludCBudW1iZXIpIGNvbnN0OworICBpbnQgRXh0ZW5zaW9uU2l6ZShpbnQgbnVtYmVyKSBjb25zdDsgIC8vIFNpemUgb2YgYSByZXBlYXRlZCBleHRlbnNpb24uCisgIGludCBOdW1FeHRlbnNpb25zKCkgY29uc3Q7ICAgICAgICAgICAgLy8gVGhlIG51bWJlciBvZiBleHRlbnNpb25zCisgIEZpZWxkVHlwZSBFeHRlbnNpb25UeXBlKGludCBudW1iZXIpIGNvbnN0OworICB2b2lkIENsZWFyRXh0ZW5zaW9uKGludCBudW1iZXIpOworCisgIC8vIHNpbmd1bGFyIGZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgaW50MzJfdCBHZXRJbnQzMihpbnQgbnVtYmVyLCBpbnQzMl90IGRlZmF1bHRfdmFsdWUpIGNvbnN0OworICBpbnQ2NF90IEdldEludDY0KGludCBudW1iZXIsIGludDY0X3QgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIHVpbnQzMl90IEdldFVJbnQzMihpbnQgbnVtYmVyLCB1aW50MzJfdCBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKKyAgdWludDY0X3QgR2V0VUludDY0KGludCBudW1iZXIsIHVpbnQ2NF90IGRlZmF1bHRfdmFsdWUpIGNvbnN0OworICBmbG9hdCBHZXRGbG9hdChpbnQgbnVtYmVyLCBmbG9hdCBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKKyAgZG91YmxlIEdldERvdWJsZShpbnQgbnVtYmVyLCBkb3VibGUgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIGJvb2wgR2V0Qm9vbChpbnQgbnVtYmVyLCBib29sIGRlZmF1bHRfdmFsdWUpIGNvbnN0OworICBpbnQgR2V0RW51bShpbnQgbnVtYmVyLCBpbnQgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRTdHJpbmcoaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIGNvbnN0IE1lc3NhZ2VMaXRlJiBHZXRNZXNzYWdlKGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKKyAgY29uc3QgTWVzc2FnZUxpdGUmIEdldE1lc3NhZ2UoaW50IG51bWJlciwgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgY29uc3Q7CisKKyAgLy8gfGRlc2NyaXB0b3J8IG1heSBiZSBudWxscHRyIHNvIGxvbmcgYXMgaXQgaXMga25vd24gdGhhdCB0aGUgZGVzY3JpcHRvciBmb3IKKyAgLy8gdGhlIGV4dGVuc2lvbiBsaXZlcyBpbiB0aGUgc2FtZSBwb29sIGFzIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgY29udGFpbmluZworICAvLyB0eXBlLgorI2RlZmluZSBkZXNjIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciAgLy8gYXZvaWQgbGluZSB3cmFwcGluZworICB2b2lkIFNldEludDMyKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBpbnQzMl90IHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBTZXRJbnQ2NChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgaW50NjRfdCB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgU2V0VUludDMyKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCB1aW50MzJfdCB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgU2V0VUludDY0KGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCB1aW50NjRfdCB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgU2V0RmxvYXQoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGZsb2F0IHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBTZXREb3VibGUoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGRvdWJsZSB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgU2V0Qm9vbChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgU2V0RW51bShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgaW50IHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBTZXRTdHJpbmcoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIHN0ZDo6c3RyaW5nIHZhbHVlLCBkZXNjKTsKKyAgc3RkOjpzdHJpbmcqIE11dGFibGVTdHJpbmcoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGRlc2MpOworICBNZXNzYWdlTGl0ZSogTXV0YWJsZU1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlLCBkZXNjKTsKKyAgTWVzc2FnZUxpdGUqIE11dGFibGVNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KTsKKyAgLy8gQWRkcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byB0aGUgRXh0ZW5zaW9uU2V0LCB0YWtpbmcgb3duZXJzaGlwIG9mIHRoZQorICAvLyBtZXNzYWdlIG9iamVjdC4gRXhpc3RpbmcgbWVzc2FnZSB3aXRoIHRoZSBzYW1lIG51bWJlciB3aWxsIGJlIGRlbGV0ZWQuCisgIC8vIElmICJtZXNzYWdlIiBpcyBudWxscHRyLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gIkNsZWFyRXh0ZW5zaW9uKG51bWJlcikiLgorICB2b2lkIFNldEFsbG9jYXRlZE1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSk7CisgIHZvaWQgVW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWRNZXNzYWdlKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIE1lc3NhZ2VMaXRlKiBSZWxlYXNlTWVzc2FnZShpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBwcm90b3R5cGUpOworICBNZXNzYWdlTGl0ZSogVW5zYWZlQXJlbmFSZWxlYXNlTWVzc2FnZShpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlKTsKKworICBQUk9UT0JVRl9OT0RJU0NBUkQgTWVzc2FnZUxpdGUqIFJlbGVhc2VNZXNzYWdlKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSk7CisgIE1lc3NhZ2VMaXRlKiBVbnNhZmVBcmVuYVJlbGVhc2VNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpOworI3VuZGVmIGRlc2MKKyAgQXJlbmEqIEdldEFyZW5hKCkgY29uc3QgeyByZXR1cm4gYXJlbmFfOyB9CisKKyAgLy8gcmVwZWF0ZWQgZmllbGRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBGZXRjaGVzIGEgUmVwZWF0ZWRGaWVsZCBleHRlbnNpb24gYnkgbnVtYmVyOyByZXR1cm5zIHxkZWZhdWx0X3ZhbHVlfAorICAvLyBpZiBubyBzdWNoIGV4dGVuc2lvbiBleGlzdHMuIFVzZXIgc2hvdWxkIG5vdCB0b3VjaCB0aGlzIGRpcmVjdGx5OyBpdCBpcworICAvLyB1c2VkIGJ5IHRoZSBHZXRSZXBlYXRlZEV4dGVuc2lvbigpIG1ldGhvZC4KKyAgY29uc3Qgdm9pZCogR2V0UmF3UmVwZWF0ZWRGaWVsZChpbnQgbnVtYmVyLCBjb25zdCB2b2lkKiBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKKyAgLy8gRmV0Y2hlcyBhIG11dGFibGUgdmVyc2lvbiBvZiBhIFJlcGVhdGVkRmllbGQgZXh0ZW5zaW9uIGJ5IG51bWJlciwKKyAgLy8gaW5zdGFudGlhdGluZyBvbmUgaWYgbm9uZSBleGlzdHMuIFNpbWlsYXIgdG8gYWJvdmUsIHVzZXIgc2hvdWxkIG5vdCB1c2UKKyAgLy8gdGhpcyBkaXJlY3RseTsgaXQgdW5kZXJsaWVzIE11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigpLgorICB2b2lkKiBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwgYm9vbCBwYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzYyk7CisKKyAgLy8gVGhpcyBpcyBhbiBvdmVybG9hZCBvZiBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZCB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggb2xkIGNvZGUgdXNpbmcgYSBwcmV2aW91cyBBUEkuIFRoaXMgdmVyc2lvbiBvZgorICAvLyBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZCgpIHdpbGwgR09PR0xFX0NIRUNLLWZhaWwgb24gYSBtaXNzaW5nIGV4dGVuc2lvbi4KKyAgLy8gKEUuZy46IGJvcmcvY2xpZW50cy9pbnRlcm5hbC9wcm90bzEvcHJvdG8yX3JlZmxlY3Rpb24uY2MuKQorICB2b2lkKiBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChpbnQgbnVtYmVyKTsKKworICBpbnQzMl90IEdldFJlcGVhdGVkSW50MzIoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKKyAgaW50NjRfdCBHZXRSZXBlYXRlZEludDY0KGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIHVpbnQzMl90IEdldFJlcGVhdGVkVUludDMyKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIHVpbnQ2NF90IEdldFJlcGVhdGVkVUludDY0KGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIGZsb2F0IEdldFJlcGVhdGVkRmxvYXQoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKKyAgZG91YmxlIEdldFJlcGVhdGVkRG91YmxlKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIGJvb2wgR2V0UmVwZWF0ZWRCb29sKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIGludCBHZXRSZXBlYXRlZEVudW0oaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldFJlcGVhdGVkU3RyaW5nKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIGNvbnN0IE1lc3NhZ2VMaXRlJiBHZXRSZXBlYXRlZE1lc3NhZ2UoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKKworICB2b2lkIFNldFJlcGVhdGVkSW50MzIoaW50IG51bWJlciwgaW50IGluZGV4LCBpbnQzMl90IHZhbHVlKTsKKyAgdm9pZCBTZXRSZXBlYXRlZEludDY0KGludCBudW1iZXIsIGludCBpbmRleCwgaW50NjRfdCB2YWx1ZSk7CisgIHZvaWQgU2V0UmVwZWF0ZWRVSW50MzIoaW50IG51bWJlciwgaW50IGluZGV4LCB1aW50MzJfdCB2YWx1ZSk7CisgIHZvaWQgU2V0UmVwZWF0ZWRVSW50NjQoaW50IG51bWJlciwgaW50IGluZGV4LCB1aW50NjRfdCB2YWx1ZSk7CisgIHZvaWQgU2V0UmVwZWF0ZWRGbG9hdChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIGZsb2F0IHZhbHVlKTsKKyAgdm9pZCBTZXRSZXBlYXRlZERvdWJsZShpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSk7CisgIHZvaWQgU2V0UmVwZWF0ZWRCb29sKGludCBudW1iZXIsIGludCBpbmRleCwgYm9vbCB2YWx1ZSk7CisgIHZvaWQgU2V0UmVwZWF0ZWRFbnVtKGludCBudW1iZXIsIGludCBpbmRleCwgaW50IHZhbHVlKTsKKyAgdm9pZCBTZXRSZXBlYXRlZFN0cmluZyhpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIHN0ZDo6c3RyaW5nIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIE11dGFibGVSZXBlYXRlZFN0cmluZyhpbnQgbnVtYmVyLCBpbnQgaW5kZXgpOworICBNZXNzYWdlTGl0ZSogTXV0YWJsZVJlcGVhdGVkTWVzc2FnZShpbnQgbnVtYmVyLCBpbnQgaW5kZXgpOworCisjZGVmaW5lIGRlc2MgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yICAvLyBhdm9pZCBsaW5lIHdyYXBwaW5nCisgIHZvaWQgQWRkSW50MzIoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgcGFja2VkLCBpbnQzMl90IHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBBZGRJbnQ2NChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCBwYWNrZWQsIGludDY0X3QgdmFsdWUsIGRlc2MpOworICB2b2lkIEFkZFVJbnQzMihpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCBwYWNrZWQsIHVpbnQzMl90IHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBBZGRVSW50NjQoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgcGFja2VkLCB1aW50NjRfdCB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgQWRkRmxvYXQoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgcGFja2VkLCBmbG9hdCB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgQWRkRG91YmxlKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sIHBhY2tlZCwgZG91YmxlIHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBBZGRCb29sKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sIHBhY2tlZCwgYm9vbCB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgQWRkRW51bShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCBwYWNrZWQsIGludCB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgQWRkU3RyaW5nKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBzdGQ6OnN0cmluZyB2YWx1ZSwgZGVzYyk7CisgIHN0ZDo6c3RyaW5nKiBBZGRTdHJpbmcoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGRlc2MpOworICBNZXNzYWdlTGl0ZSogQWRkTWVzc2FnZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSwgZGVzYyk7CisgIE1lc3NhZ2VMaXRlKiBBZGRNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpOworICB2b2lkIEFkZEFsbG9jYXRlZE1lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG5ld19lbnRyeSk7CisgIHZvaWQgVW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWRNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG5ld19lbnRyeSk7CisjdW5kZWYgZGVzYworCisgIHZvaWQgUmVtb3ZlTGFzdChpbnQgbnVtYmVyKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIE1lc3NhZ2VMaXRlKiBSZWxlYXNlTGFzdChpbnQgbnVtYmVyKTsKKyAgTWVzc2FnZUxpdGUqIFVuc2FmZUFyZW5hUmVsZWFzZUxhc3QoaW50IG51bWJlcik7CisgIHZvaWQgU3dhcEVsZW1lbnRzKGludCBudW1iZXIsIGludCBpbmRleDEsIGludCBpbmRleDIpOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGltcGxlbWVudGluZyBtZXRob2RzIG9mIE1lc3NhZ2UKKyAgLy8KKyAgLy8gVGhlc2UgY291bGQgYWxsIGJlIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHRoZSBvdGhlciBtZXRob2RzIG9mIHRoaXMKKyAgLy8gY2xhc3MsIGJ1dCBwcm92aWRpbmcgdGhlbSBoZXJlIGhlbHBzIGtlZXAgdGhlIGdlbmVyYXRlZCBjb2RlIHNpemUgZG93bi4KKworICB2b2lkIENsZWFyKCk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwgY29uc3QgRXh0ZW5zaW9uU2V0JiBvdGhlcik7CisgIHZvaWQgU3dhcChjb25zdCBNZXNzYWdlTGl0ZSogZXh0ZW5kZWUsIEV4dGVuc2lvblNldCogb3RoZXIpOworICB2b2lkIEludGVybmFsU3dhcChFeHRlbnNpb25TZXQqIG90aGVyKTsKKyAgdm9pZCBTd2FwRXh0ZW5zaW9uKGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwgRXh0ZW5zaW9uU2V0KiBvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpOworICB2b2lkIFVuc2FmZVNoYWxsb3dTd2FwRXh0ZW5zaW9uKEV4dGVuc2lvblNldCogb3RoZXIsIGludCBudW1iZXIpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKworICAvLyBMaXRlIHBhcnNlcgorICBjb25zdCBjaGFyKiBQYXJzZUZpZWxkKHVpbnQ2NF90IHRhZywgY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YSogbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KTsKKyAgLy8gRnVsbCBwYXJzZXIKKyAgY29uc3QgY2hhciogUGFyc2VGaWVsZCh1aW50NjRfdCB0YWcsIGNvbnN0IGNoYXIqIHB0ciwgY29uc3QgTWVzc2FnZSogZXh0ZW5kZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGEqIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNc2c+CisgIGNvbnN0IGNoYXIqIFBhcnNlTWVzc2FnZVNldChjb25zdCBjaGFyKiBwdHIsIGNvbnN0IE1zZyogZXh0ZW5kZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbE1ldGFkYXRhKiBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgeworICAgIHN0cnVjdCBNZXNzYWdlU2V0SXRlbSB7CisgICAgICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIFBhcnNlQ29udGV4dCogY3R4KSB7CisgICAgICAgIHJldHVybiBtZS0+UGFyc2VNZXNzYWdlU2V0SXRlbShwdHIsIGV4dGVuZGVlLCBtZXRhZGF0YSwgY3R4KTsKKyAgICAgIH0KKyAgICAgIEV4dGVuc2lvblNldCogbWU7CisgICAgICBjb25zdCBNc2cqIGV4dGVuZGVlOworICAgICAgSW50ZXJuYWxNZXRhZGF0YSogbWV0YWRhdGE7CisgICAgfSBpdGVte3RoaXMsIGV4dGVuZGVlLCBtZXRhZGF0YX07CisgICAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICAgIHVpbnQzMl90IHRhZzsKKyAgICAgIHB0ciA9IFJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9QQVJTRVJfQVNTRVJUKHB0cik7CisgICAgICBpZiAodGFnID09IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZykgeworICAgICAgICBwdHIgPSBjdHgtPlBhcnNlR3JvdXAoJml0ZW0sIHB0ciwgdGFnKTsKKyAgICAgICAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0YWcgPT0gMCB8fCAodGFnICYgNykgPT0gNCkgeworICAgICAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgICAgIHJldHVybiBwdHI7CisgICAgICAgIH0KKyAgICAgICAgcHRyID0gUGFyc2VGaWVsZCh0YWcsIHB0ciwgZXh0ZW5kZWUsIG1ldGFkYXRhLCBjdHgpOworICAgICAgICBHT09HTEVfUFJPVE9CVUZfUEFSU0VSX0FTU0VSVChwdHIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcHRyOworICB9CisKKyAgLy8gV3JpdGUgYWxsIGV4dGVuc2lvbiBmaWVsZHMgd2l0aCBmaWVsZCBudW1iZXJzIGluIHRoZSByYW5nZQorICAvLyAgIFtzdGFydF9maWVsZF9udW1iZXIsIGVuZF9maWVsZF9udW1iZXIpCisgIC8vIHRvIHRoZSBvdXRwdXQgc3RyZWFtLCB1c2luZyB0aGUgY2FjaGVkIHNpemVzIGNvbXB1dGVkIHdoZW4gQnl0ZVNpemUoKSB3YXMKKyAgLy8gbGFzdCBjYWxsZWQuICBOb3RlIHRoYXQgdGhlIHJhbmdlIGJvdW5kcyBhcmUgaW5jbHVzaXZlLWV4Y2x1c2l2ZS4KKyAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoY29uc3QgTWVzc2FnZUxpdGUqIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfZmllbGRfbnVtYmVyLCBpbnQgZW5kX2ZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgICBvdXRwdXQtPlNldEN1cihfSW50ZXJuYWxTZXJpYWxpemUoZXh0ZW5kZWUsIHN0YXJ0X2ZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2ZpZWxkX251bWJlciwgb3V0cHV0LT5DdXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5FcHNDb3B5KCkpKTsKKyAgfQorCisgIC8vIFNhbWUgYXMgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzLCBidXQgd2l0aG91dCBhbnkgYm91bmRzIGNoZWNraW5nLgorICAvLyBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGFyZ2V0IGhhcyBzdWZmaWNpZW50IGNhcGFjaXR5IGZvciB0aGUKKyAgLy8gc2VyaWFsaXplZCBleHRlbnNpb25zLgorICAvLworICAvLyBSZXR1cm5zIGEgcG9pbnRlciBwYXN0IHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZS4KKworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoY29uc3QgTWVzc2FnZUxpdGUqIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2ZpZWxkX251bWJlciwgaW50IGVuZF9maWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgICAgaWYgKGZsYXRfc2l6ZV8gPT0gMCkgeworICAgICAgYXNzZXJ0KCFpc19sYXJnZSgpKTsKKyAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgfQorICAgIHJldHVybiBfSW50ZXJuYWxTZXJpYWxpemVJbXBsKGV4dGVuZGVlLCBzdGFydF9maWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2ZpZWxkX251bWJlciwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgLy8gTGlrZSBhYm92ZSBidXQgc2VyaWFsaXplcyBpbiBNZXNzYWdlU2V0IGZvcm1hdC4KKyAgdm9pZCBTZXJpYWxpemVNZXNzYWdlU2V0V2l0aENhY2hlZFNpemVzKGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgICAgb3V0cHV0LT5TZXRDdXIoSW50ZXJuYWxTZXJpYWxpemVNZXNzYWdlU2V0V2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICAgICAgZXh0ZW5kZWUsIG91dHB1dC0+Q3VyKCksIG91dHB1dC0+RXBzQ29weSgpKSk7CisgIH0KKyAgdWludDhfdCogSW50ZXJuYWxTZXJpYWxpemVNZXNzYWdlU2V0V2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwgdWludDhfdCogdGFyZ2V0LAorICAgICAgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3Q7CisKKyAgLy8gRm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHksIHZlcnNpb25zIG9mIHR3byBvZiB0aGUgYWJvdmUgbWV0aG9kcyB0aGF0CisgIC8vIHNlcmlhbGl6ZSBkZXRlcm1pbmlzdGljYWxseSBpZmYgU2V0RGVmYXVsdFNlcmlhbGl6YXRpb25EZXRlcm1pbmlzdGljKCkKKyAgLy8gaGFzIGJlZW4gY2FsbGVkLgorICB1aW50OF90KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGludCBzdGFydF9maWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZF9maWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSBjb25zdDsKKyAgdWludDhfdCogU2VyaWFsaXplTWVzc2FnZVNldFdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogZXh0ZW5kZWUsIHVpbnQ4X3QqIHRhcmdldCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgdG90YWwgc2VyaWFsaXplZCBzaXplIG9mIGFsbCB0aGUgZXh0ZW5zaW9ucy4KKyAgc2l6ZV90IEJ5dGVTaXplKCkgY29uc3Q7CisKKyAgLy8gTGlrZSBCeXRlU2l6ZSgpIGJ1dCB1c2VzIE1lc3NhZ2VTZXQgZm9ybWF0LgorICBzaXplX3QgTWVzc2FnZVNldEJ5dGVTaXplKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyAoYW4gZXN0aW1hdGUgb2YpIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdXNlZCBmb3Igc3RvcmluZyB0aGUKKyAgLy8gZXh0ZW5zaW9ucyBpbiBtZW1vcnksIGV4Y2x1ZGluZyBzaXplb2YoKnRoaXMpLiAgSWYgdGhlIEV4dGVuc2lvblNldCBpcworICAvLyBmb3IgYSBsaXRlIG1lc3NhZ2UgKGFuZCB0aHVzIHBvc3NpYmx5IGNvbnRhaW5zIGxpdGUgbWVzc2FnZXMpLCB0aGUgcmVzdWx0cworICAvLyBhcmUgdW5kZWZpbmVkIChtaWdodCB3b3JrLCBtaWdodCBjcmFzaCwgbWlnaHQgY29ycnVwdCBkYXRhLCBtaWdodCBub3QgZXZlbgorICAvLyBiZSBsaW5rZWQgaW4pLiAgSXQncyB1cCB0byB0aGUgcHJvdG9jb2wgY29tcGlsZXIgdG8gYXZvaWQgY2FsbGluZyB0aGlzIG9uCisgIC8vIHN1Y2ggRXh0ZW5zaW9uU2V0cyAoZWFzeSBlbm91Z2ggc2luY2UgbGl0ZSBtZXNzYWdlcyBkb24ndCBpbXBsZW1lbnQKKyAgLy8gU3BhY2VVc2VkKCkpLgorICBzaXplX3QgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKSBjb25zdDsKKworICAvLyBUaGlzIG1ldGhvZCBqdXN0IGNhbGxzIFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKCkgYnV0IGl0IGNhbiBub3QgYmUKKyAgLy8gaW5saW5lZCBiZWNhdXNlIHRoZSBkZWZpbml0aW9uIG9mIFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKCkgaXMgbm90CisgIC8vIGluY2x1ZGVkIGluIGxpdGUgcnVudGltZSBhbmQgd2hlbiBhbiBpbmxpbmUgbWV0aG9kIHJlZmVycyB0byBpdCBNU1ZDCisgIC8vIHdpbGwgY29tcGxhaW4gYWJvdXQgdW5yZXNvbHZlZCBzeW1ib2xzIHdoZW4gYnVpbGRpbmcgdGhlIGxpdGUgcnVudGltZQorICAvLyBhcyAuZGxsLgorICBpbnQgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CisgIGZyaWVuZCBjbGFzcyBQcmltaXRpdmVUeXBlVHJhaXRzOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBmcmllbmQgY2xhc3MgUmVwZWF0ZWRQcmltaXRpdmVUeXBlVHJhaXRzOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlLCBib29sIElzVmFsaWQoaW50KT4KKyAgZnJpZW5kIGNsYXNzIEVudW1UeXBlVHJhaXRzOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlLCBib29sIElzVmFsaWQoaW50KT4KKyAgZnJpZW5kIGNsYXNzIFJlcGVhdGVkRW51bVR5cGVUcmFpdHM7CisKKyAgZnJpZW5kIGNsYXNzIGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb247CisKKyAgY29uc3QgaW50MzJfdCYgR2V0UmVmSW50MzIoaW50IG51bWJlciwgY29uc3QgaW50MzJfdCYgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIGNvbnN0IGludDY0X3QmIEdldFJlZkludDY0KGludCBudW1iZXIsIGNvbnN0IGludDY0X3QmIGRlZmF1bHRfdmFsdWUpIGNvbnN0OworICBjb25zdCB1aW50MzJfdCYgR2V0UmVmVUludDMyKGludCBudW1iZXIsIGNvbnN0IHVpbnQzMl90JiBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKKyAgY29uc3QgdWludDY0X3QmIEdldFJlZlVJbnQ2NChpbnQgbnVtYmVyLCBjb25zdCB1aW50NjRfdCYgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIGNvbnN0IGZsb2F0JiBHZXRSZWZGbG9hdChpbnQgbnVtYmVyLCBjb25zdCBmbG9hdCYgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIGNvbnN0IGRvdWJsZSYgR2V0UmVmRG91YmxlKGludCBudW1iZXIsIGNvbnN0IGRvdWJsZSYgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIGNvbnN0IGJvb2wmIEdldFJlZkJvb2woaW50IG51bWJlciwgY29uc3QgYm9vbCYgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIGNvbnN0IGludCYgR2V0UmVmRW51bShpbnQgbnVtYmVyLCBjb25zdCBpbnQmIGRlZmF1bHRfdmFsdWUpIGNvbnN0OworICBjb25zdCBpbnQzMl90JiBHZXRSZWZSZXBlYXRlZEludDMyKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIGNvbnN0IGludDY0X3QmIEdldFJlZlJlcGVhdGVkSW50NjQoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKKyAgY29uc3QgdWludDMyX3QmIEdldFJlZlJlcGVhdGVkVUludDMyKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIGNvbnN0IHVpbnQ2NF90JiBHZXRSZWZSZXBlYXRlZFVJbnQ2NChpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0OworICBjb25zdCBmbG9hdCYgR2V0UmVmUmVwZWF0ZWRGbG9hdChpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0OworICBjb25zdCBkb3VibGUmIEdldFJlZlJlcGVhdGVkRG91YmxlKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIGNvbnN0IGJvb2wmIEdldFJlZlJlcGVhdGVkQm9vbChpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0OworICBjb25zdCBpbnQmIEdldFJlZlJlcGVhdGVkRW51bShpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIEltcGxlbWVudGF0aW9uIG9mIF9JbnRlcm5hbFNlcmlhbGl6ZSBmb3Igbm9uLWVtcHR5IG1hcF8uCisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZUltcGwoY29uc3QgTWVzc2FnZUxpdGUqIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9maWVsZF9udW1iZXIsIGludCBlbmRfZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdDsKKyAgLy8gSW50ZXJmYWNlIG9mIGEgbGF6aWx5IHBhcnNlZCBzaW5ndWxhciBtZXNzYWdlIGV4dGVuc2lvbi4KKyAgY2xhc3MgUFJPVE9CVUZfRVhQT1JUIExhenlNZXNzYWdlRXh0ZW5zaW9uIHsKKyAgIHB1YmxpYzoKKyAgICBMYXp5TWVzc2FnZUV4dGVuc2lvbigpIHt9CisgICAgdmlydHVhbCB+TGF6eU1lc3NhZ2VFeHRlbnNpb24oKSB7fQorCisgICAgdmlydHVhbCBMYXp5TWVzc2FnZUV4dGVuc2lvbiogTmV3KEFyZW5hKiBhcmVuYSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgY29uc3QgTWVzc2FnZUxpdGUmIEdldE1lc3NhZ2UoY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZW5hKiBhcmVuYSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgTWVzc2FnZUxpdGUqIE11dGFibGVNZXNzYWdlKGNvbnN0IE1lc3NhZ2VMaXRlJiBwcm90b3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJlbmEqIGFyZW5hKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIFNldEFsbG9jYXRlZE1lc3NhZ2UoTWVzc2FnZUxpdGUqIG1lc3NhZ2UsIEFyZW5hKiBhcmVuYSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBVbnNhZmVBcmVuYVNldEFsbG9jYXRlZE1lc3NhZ2UoTWVzc2FnZUxpdGUqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmVuYSogYXJlbmEpID0gMDsKKyAgICBQUk9UT0JVRl9OT0RJU0NBUkQgdmlydHVhbCBNZXNzYWdlTGl0ZSogUmVsZWFzZU1lc3NhZ2UoCisgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBwcm90b3R5cGUsIEFyZW5hKiBhcmVuYSkgPSAwOworICAgIHZpcnR1YWwgTWVzc2FnZUxpdGUqIFVuc2FmZUFyZW5hUmVsZWFzZU1lc3NhZ2UoY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZW5hKiBhcmVuYSkgPSAwOworCisgICAgdmlydHVhbCBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCA9IDA7CisKKyAgICBQUk9UT0JVRl9ERVBSRUNBVEVEX01TRygiUGxlYXNlIHVzZSBCeXRlU2l6ZUxvbmcoKSBpbnN0ZWFkIikKKyAgICB2aXJ0dWFsIGludCBCeXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpUb0ludFNpemUoQnl0ZVNpemVMb25nKCkpOyB9CisgICAgdmlydHVhbCBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90IFNwYWNlVXNlZExvbmcoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2VMaXRlKiBwcm90b3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYXp5TWVzc2FnZUV4dGVuc2lvbiYgb3RoZXIsIEFyZW5hKiBhcmVuYSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBNZXJnZUZyb21NZXNzYWdlKGNvbnN0IE1lc3NhZ2VMaXRlJiBtc2csIEFyZW5hKiBhcmVuYSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBDbGVhcigpID0gMDsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgTWVzc2FnZSYgcHJvdG90eXBlLCBBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXp5VmVyaWZ5T3B0aW9uIG9wdGlvbiwgY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VDb250ZXh0KiBjdHgpID0gMDsKKyAgICB2aXJ0dWFsIHVpbnQ4X3QqIFdyaXRlTWVzc2FnZVRvQXJyYXkoCisgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBwcm90b3R5cGUsIGludCBudW1iZXIsIHVpbnQ4X3QqIHRhcmdldCwKKyAgICAgICAgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgPSAwOworCisgICBwcml2YXRlOgorICAgIHZpcnR1YWwgdm9pZCBVbnVzZWRLZXlNZXRob2QoKTsgIC8vIER1bW15IGtleSBtZXRob2QgdG8gYXZvaWQgd2VhayB2dGFibGUuCisKKyAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTGF6eU1lc3NhZ2VFeHRlbnNpb24pOworICB9OworICAvLyBHaXZlIGFjY2VzcyB0byBmdW5jdGlvbiBkZWZpbmVkIGJlbG93IHRvIHNlZSBMYXp5TWVzc2FnZUV4dGVuc2lvbi4KKyAgZnJpZW5kIExhenlNZXNzYWdlRXh0ZW5zaW9uKiBNYXliZUNyZWF0ZUxhenlFeHRlbnNpb24oQXJlbmEqIGFyZW5hKTsKKyAgc3RydWN0IEV4dGVuc2lvbiB7CisgICAgLy8gVGhlIG9yZGVyIG9mIHRoZXNlIGZpZWxkcyBwYWNrcyBFeHRlbnNpb24gaW50byAyNCBieXRlcyB3aGVuIHVzaW5nIDgKKyAgICAvLyBieXRlIGFsaWdubWVudC4gQ29uc2lkZXIgdGhpcyB3aGVuIGFkZGluZyBvciByZW1vdmluZyBmaWVsZHMgaGVyZS4KKyAgICB1bmlvbiB7CisgICAgICBpbnQzMl90IGludDMyX3RfdmFsdWU7CisgICAgICBpbnQ2NF90IGludDY0X3RfdmFsdWU7CisgICAgICB1aW50MzJfdCB1aW50MzJfdF92YWx1ZTsKKyAgICAgIHVpbnQ2NF90IHVpbnQ2NF90X3ZhbHVlOworICAgICAgZmxvYXQgZmxvYXRfdmFsdWU7CisgICAgICBkb3VibGUgZG91YmxlX3ZhbHVlOworICAgICAgYm9vbCBib29sX3ZhbHVlOworICAgICAgaW50IGVudW1fdmFsdWU7CisgICAgICBzdGQ6OnN0cmluZyogc3RyaW5nX3ZhbHVlOworICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2VfdmFsdWU7CisgICAgICBMYXp5TWVzc2FnZUV4dGVuc2lvbiogbGF6eW1lc3NhZ2VfdmFsdWU7CisKKyAgICAgIFJlcGVhdGVkRmllbGQ8aW50MzJfdD4qIHJlcGVhdGVkX2ludDMyX3RfdmFsdWU7CisgICAgICBSZXBlYXRlZEZpZWxkPGludDY0X3Q+KiByZXBlYXRlZF9pbnQ2NF90X3ZhbHVlOworICAgICAgUmVwZWF0ZWRGaWVsZDx1aW50MzJfdD4qIHJlcGVhdGVkX3VpbnQzMl90X3ZhbHVlOworICAgICAgUmVwZWF0ZWRGaWVsZDx1aW50NjRfdD4qIHJlcGVhdGVkX3VpbnQ2NF90X3ZhbHVlOworICAgICAgUmVwZWF0ZWRGaWVsZDxmbG9hdD4qIHJlcGVhdGVkX2Zsb2F0X3ZhbHVlOworICAgICAgUmVwZWF0ZWRGaWVsZDxkb3VibGU+KiByZXBlYXRlZF9kb3VibGVfdmFsdWU7CisgICAgICBSZXBlYXRlZEZpZWxkPGJvb2w+KiByZXBlYXRlZF9ib29sX3ZhbHVlOworICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQ+KiByZXBlYXRlZF9lbnVtX3ZhbHVlOworICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4qIHJlcGVhdGVkX3N0cmluZ192YWx1ZTsKKyAgICAgIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+KiByZXBlYXRlZF9tZXNzYWdlX3ZhbHVlOworICAgIH07CisKKyAgICBGaWVsZFR5cGUgdHlwZTsKKyAgICBib29sIGlzX3JlcGVhdGVkOworCisgICAgLy8gRm9yIHNpbmd1bGFyIHR5cGVzLCBpbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBpcyAiY2xlYXJlZCIuICBUaGlzCisgICAgLy8gaGFwcGVucyB3aGVuIGFuIGV4dGVuc2lvbiBpcyBzZXQgYW5kIHRoZW4gbGF0ZXIgY2xlYXJlZCBieSB0aGUgY2FsbGVyLgorICAgIC8vIFdlIHdhbnQgdG8ga2VlcCB0aGUgRXh0ZW5zaW9uIG9iamVjdCBhcm91bmQgZm9yIHJldXNlLCBzbyBpbnN0ZWFkIG9mCisgICAgLy8gcmVtb3ZpbmcgaXQgZnJvbSB0aGUgbWFwLCB3ZSBqdXN0IHNldCBpc19jbGVhcmVkID0gdHJ1ZS4gIFRoaXMgaGFzIG5vCisgICAgLy8gbWVhbmluZyBmb3IgcmVwZWF0ZWQgdHlwZXM7IGZvciB0aG9zZSwgdGhlIHNpemUgb2YgdGhlIFJlcGVhdGVkRmllbGQKKyAgICAvLyBzaW1wbHkgYmVjb21lcyB6ZXJvIHdoZW4gY2xlYXJlZC4KKyAgICBib29sIGlzX2NsZWFyZWQgOiA0OworCisgICAgLy8gRm9yIHNpbmd1bGFyIG1lc3NhZ2UgdHlwZXMsIGluZGljYXRlcyB3aGV0aGVyIGxhenkgcGFyc2luZyBpcyBlbmFibGVkCisgICAgLy8gZm9yIHRoaXMgZXh0ZW5zaW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgdmFsaWQgd2hlbiB0eXBlID09IFRZUEVfTUVTU0FHRQorICAgIC8vIGFuZCAhaXNfcmVwZWF0ZWQgYmVjYXVzZSB3ZSBvbmx5IHN1cHBvcnQgbGF6eSBwYXJzaW5nIGZvciBzaW5ndWxhcgorICAgIC8vIG1lc3NhZ2UgdHlwZXMgY3VycmVudGx5LiBJZiBpc19sYXp5ID0gdHJ1ZSwgdGhlIGV4dGVuc2lvbiBpcyBzdG9yZWQgaW4KKyAgICAvLyBsYXp5bWVzc2FnZV92YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgZXh0ZW5zaW9uIHdpbGwgYmUgbWVzc2FnZV92YWx1ZS4KKyAgICBib29sIGlzX2xhenkgOiA0OworCisgICAgLy8gRm9yIHJlcGVhdGVkIHR5cGVzLCB0aGlzIGluZGljYXRlcyBpZiB0aGUgW3BhY2tlZD10cnVlXSBvcHRpb24gaXMgc2V0LgorICAgIGJvb2wgaXNfcGFja2VkOworCisgICAgLy8gRm9yIHBhY2tlZCBmaWVsZHMsIHRoZSBzaXplIG9mIHRoZSBwYWNrZWQgZGF0YSBpcyByZWNvcmRlZCBoZXJlIHdoZW4KKyAgICAvLyBCeXRlU2l6ZSgpIGlzIGNhbGxlZCB0aGVuIHVzZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24uCisgICAgLy8gVE9ETyhrZW50b24pOiAgVXNlIGF0b21pYzxpbnQ+IHdoZW4gQysrIHN1cHBvcnRzIGl0LgorICAgIG11dGFibGUgaW50IGNhY2hlZF9zaXplOworCisgICAgLy8gVGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgZXh0ZW5zaW9uLCBpZiBvbmUgZXhpc3RzIGFuZCBpcyBrbm93bi4gIE1heSBiZQorICAgIC8vIG51bGxwdHIuICBNdXN0IG5vdCBiZSBudWxscHRyIGlmIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgZXh0ZW5zaW9uIGRvZXMKKyAgICAvLyBub3QgbGl2ZSBpbiB0aGUgc2FtZSBwb29sIGFzIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgY29udGFpbmluZyB0eXBlLgorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcjsKKworICAgIC8vIFNvbWUgaGVscGVyIG1ldGhvZHMgZm9yIG9wZXJhdGlvbnMgb24gYSBzaW5nbGUgRXh0ZW5zaW9uLgorICAgIHVpbnQ4X3QqIEludGVybmFsU2VyaWFsaXplRmllbGRXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogZXh0ZW5kZWUsIGNvbnN0IEV4dGVuc2lvblNldCogZXh0ZW5zaW9uX3NldCwKKyAgICAgICAgaW50IG51bWJlciwgdWludDhfdCogdGFyZ2V0LCBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdDsKKyAgICB1aW50OF90KiBJbnRlcm5hbFNlcmlhbGl6ZU1lc3NhZ2VTZXRJdGVtV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIGV4dGVuZGVlLCBjb25zdCBFeHRlbnNpb25TZXQqIGV4dGVuc2lvbl9zZXQsCisgICAgICAgIGludCBudW1iZXIsIHVpbnQ4X3QqIHRhcmdldCwgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3Q7CisgICAgc2l6ZV90IEJ5dGVTaXplKGludCBudW1iZXIpIGNvbnN0OworICAgIHNpemVfdCBNZXNzYWdlU2V0SXRlbUJ5dGVTaXplKGludCBudW1iZXIpIGNvbnN0OworICAgIHZvaWQgQ2xlYXIoKTsKKyAgICBpbnQgR2V0U2l6ZSgpIGNvbnN0OworICAgIHZvaWQgRnJlZSgpOworICAgIHNpemVfdCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZygpIGNvbnN0OworICAgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworICB9OworCisgIC8vIFRoZSBFeHRlbnNpb24gc3RydWN0IGlzIHNtYWxsIGVub3VnaCB0byBiZSBwYXNzZWQgYnkgdmFsdWUsIHNvIHdlIHVzZSBpdAorICAvLyBkaXJlY3RseSBhcyB0aGUgdmFsdWUgdHlwZSBpbiBtYXBwaW5ncyByYXRoZXIgdGhhbiB1c2UgcG9pbnRlcnMuICBXZSB1c2UKKyAgLy8gc29ydGVkIG1hcHMgcmF0aGVyIHRoYW4gaGFzaC1tYXBzIGJlY2F1c2Ugd2UgZXhwZWN0IG1vc3QgRXh0ZW5zaW9uU2V0cyB3aWxsCisgIC8vIG9ubHkgY29udGFpbiBhIHNtYWxsIG51bWJlciBvZiBleHRlbnNpb24uICBBbHNvLCB3ZSB3YW50IEFwcGVuZFRvTGlzdCBhbmQKKyAgLy8gZGV0ZXJtaW5pc3RpYyBzZXJpYWxpemF0aW9uIHRvIG9yZGVyIGZpZWxkcyBieSBmaWVsZCBudW1iZXIuCisKKyAgc3RydWN0IEtleVZhbHVlIHsKKyAgICBpbnQgZmlyc3Q7CisgICAgRXh0ZW5zaW9uIHNlY29uZDsKKworICAgIHN0cnVjdCBGaXJzdENvbXBhcmF0b3IgeworICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEtleVZhbHVlJiBsaHMsIGNvbnN0IEtleVZhbHVlJiByaHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxocy5maXJzdCA8IHJocy5maXJzdDsKKyAgICAgIH0KKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBLZXlWYWx1ZSYgbGhzLCBpbnQga2V5KSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaHMuZmlyc3QgPCBrZXk7CisgICAgICB9CisgICAgICBib29sIG9wZXJhdG9yKCkoaW50IGtleSwgY29uc3QgS2V5VmFsdWUmIHJocykgY29uc3QgeworICAgICAgICByZXR1cm4ga2V5IDwgcmhzLmZpcnN0OworICAgICAgfQorICAgIH07CisgIH07CisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxpbnQsIEV4dGVuc2lvbj4gTGFyZ2VNYXA7CisKKyAgLy8gV3JhcHBlciBBUEkgdGhhdCBzd2l0Y2hlcyBiZXR3ZWVuIGZsYXQtbWFwIGFuZCBMYXJnZU1hcC4KKworICAvLyBGaW5kcyBhIGtleSAoaWYgcHJlc2VudCkgaW4gdGhlIEV4dGVuc2lvblNldC4KKyAgY29uc3QgRXh0ZW5zaW9uKiBGaW5kT3JOdWxsKGludCBrZXkpIGNvbnN0OworICBFeHRlbnNpb24qIEZpbmRPck51bGwoaW50IGtleSk7CisKKyAgLy8gSGVscGVyLWZ1bmN0aW9ucyB0aGF0IG9ubHkgaW5zcGVjdCB0aGUgTGFyZ2VNYXAuCisgIGNvbnN0IEV4dGVuc2lvbiogRmluZE9yTnVsbEluTGFyZ2VNYXAoaW50IGtleSkgY29uc3Q7CisgIEV4dGVuc2lvbiogRmluZE9yTnVsbEluTGFyZ2VNYXAoaW50IGtleSk7CisKKyAgLy8gSW5zZXJ0cyBhIG5ldyAoa2V5LCBFeHRlbnNpb24pIGludG8gdGhlIEV4dGVuc2lvblNldCAoYW5kIHJldHVybnMgdHJ1ZSksIG9yCisgIC8vIGZpbmRzIHRoZSBhbHJlYWR5LWV4aXN0aW5nIEV4dGVuc2lvbiBmb3IgdGhhdCBrZXkgKHJldHVybnMgZmFsc2UpLgorICAvLyBUaGUgRXh0ZW5zaW9uKiB3aWxsIHBvaW50IHRvIHRoZSBuZXctb3ItZm91bmQgRXh0ZW5zaW9uLgorICBzdGQ6OnBhaXI8RXh0ZW5zaW9uKiwgYm9vbD4gSW5zZXJ0KGludCBrZXkpOworCisgIC8vIEdyb3dzIHRoZSBmbGF0X2NhcGFjaXR5Xy4KKyAgLy8gSWYgZmxhdF9jYXBhY2l0eV8gPiBrTWF4aW11bUZsYXRDYXBhY2l0eSwgY29udmVydHMgdG8gTGFyZ2VNYXAuCisgIHZvaWQgR3Jvd0NhcGFjaXR5KHNpemVfdCBtaW5pbXVtX25ld19jYXBhY2l0eSk7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3Qga01heGltdW1GbGF0Q2FwYWNpdHkgPSAyNTY7CisgIGJvb2wgaXNfbGFyZ2UoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQxNl90PihmbGF0X3NpemVfKSA8IDA7IH0KKworICAvLyBSZW1vdmVzIGEga2V5IGZyb20gdGhlIEV4dGVuc2lvblNldC4KKyAgdm9pZCBFcmFzZShpbnQga2V5KTsKKworICBzaXplX3QgU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gUFJPVE9CVUZfUFJFRElDVF9GQUxTRShpc19sYXJnZSgpKSA/IG1hcF8ubGFyZ2UtPnNpemUoKSA6IGZsYXRfc2l6ZV87CisgIH0KKworICAvLyBTaW1pbGFyIHRvIHN0ZDo6Zm9yX2VhY2guCisgIC8vIEVhY2ggSXRlcmF0b3IgaXMgZGVjb21wb3NlZCBpbnRvIC0+Zmlyc3QgYW5kIC0+c2Vjb25kIGZpZWxkcywgc28KKyAgLy8gdGhhdCB0aGUgS2V5VmFsdWVGdW5jdG9yIGNhbiBiZSBhZ25vc3RpYyB2aXMtYS12aXMgS2V5VmFsdWUtdnMtc3RkOjpwYWlyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3IsIHR5cGVuYW1lIEtleVZhbHVlRnVuY3Rvcj4KKyAgc3RhdGljIEtleVZhbHVlRnVuY3RvciBGb3JFYWNoKEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlWYWx1ZUZ1bmN0b3IgZnVuYykgeworICAgIGZvciAoSXRlcmF0b3IgaXQgPSBiZWdpbjsgaXQgIT0gZW5kOyArK2l0KSBmdW5jKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShmdW5jKTsKKyAgfQorCisgIC8vIEFwcGxpZXMgYSBmdW5jdG9yIHRvIHRoZSA8aW50LCBFeHRlbnNpb24mPiBwYWlycyBpbiBzb3J0ZWQgb3JkZXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXlWYWx1ZUZ1bmN0b3I+CisgIEtleVZhbHVlRnVuY3RvciBGb3JFYWNoKEtleVZhbHVlRnVuY3RvciBmdW5jKSB7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoaXNfbGFyZ2UoKSkpIHsKKyAgICAgIHJldHVybiBGb3JFYWNoKG1hcF8ubGFyZ2UtPmJlZ2luKCksIG1hcF8ubGFyZ2UtPmVuZCgpLCBzdGQ6Om1vdmUoZnVuYykpOworICAgIH0KKyAgICByZXR1cm4gRm9yRWFjaChmbGF0X2JlZ2luKCksIGZsYXRfZW5kKCksIHN0ZDo6bW92ZShmdW5jKSk7CisgIH0KKworICAvLyBBcHBsaWVzIGEgZnVuY3RvciB0byB0aGUgPGludCwgY29uc3QgRXh0ZW5zaW9uJj4gcGFpcnMgaW4gc29ydGVkIG9yZGVyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VmFsdWVGdW5jdG9yPgorICBLZXlWYWx1ZUZ1bmN0b3IgRm9yRWFjaChLZXlWYWx1ZUZ1bmN0b3IgZnVuYykgY29uc3QgeworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKGlzX2xhcmdlKCkpKSB7CisgICAgICByZXR1cm4gRm9yRWFjaChtYXBfLmxhcmdlLT5iZWdpbigpLCBtYXBfLmxhcmdlLT5lbmQoKSwgc3RkOjptb3ZlKGZ1bmMpKTsKKyAgICB9CisgICAgcmV0dXJuIEZvckVhY2goZmxhdF9iZWdpbigpLCBmbGF0X2VuZCgpLCBzdGQ6Om1vdmUoZnVuYykpOworICB9CisKKyAgLy8gTWVyZ2VzIGV4aXN0aW5nIEV4dGVuc2lvbiBmcm9tIG90aGVyX2V4dGVuc2lvbgorICB2b2lkIEludGVybmFsRXh0ZW5zaW9uTWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwgaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHRlbnNpb24mIG90aGVyX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmVuYSogb3RoZXJfYXJlbmEpOworCisgIGlubGluZSBzdGF0aWMgYm9vbCBpc19wYWNrYWJsZShXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UOgorICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NDoKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzI6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQOgorICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQOgorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gRG8gbm90IGFkZCBhIGRlZmF1bHQgc3RhdGVtZW50LiBMZXQgdGhlIGNvbXBpbGVyIGNvbXBsYWluIHdoZW4KKyAgICAgICAgLy8gc29tZW9uZQorICAgICAgICAvLyBhZGRzIGEgbmV3IHdpcmUgdHlwZS4KKyAgICB9CisgICAgUFJPVE9CVUZfQVNTVU1FKGZhbHNlKTsgIC8vIHN3aXRjaCBoYW5kbGVzIGFsbCBwb3NzaWJsZSBlbnVtIHZhbHVlcworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBhbmQgZmlsbHMgZmllbGRfbnVtYmVyIGFuZCBleHRlbnNpb24gaWYgZXh0ZW5zaW9uIGlzIGZvdW5kLgorICAvLyBOb3RlIHRvIHN1cHBvcnQgcGFja2VkIHJlcGVhdGVkIGZpZWxkIGNvbXBhdGliaWxpdHksIGl0IGFsc28gZmlsbHMgd2hldGhlcgorICAvLyB0aGUgdGFnIG9uIHdpcmUgaXMgcGFja2VkLCB3aGljaCBjYW4gYmUgZGlmZmVyZW50IGZyb20KKyAgLy8gZXh0ZW5zaW9uLT5pc19wYWNrZWQgKHdoZXRoZXIgcGFja2VkPXRydWUgaXMgc3BlY2lmaWVkKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEV4dGVuc2lvbkZpbmRlcj4KKyAgYm9vbCBGaW5kRXh0ZW5zaW9uSW5mb0Zyb21UYWcodWludDMyX3QgdGFnLCBFeHRlbnNpb25GaW5kZXIqIGV4dGVuc2lvbl9maW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmllbGRfbnVtYmVyLCBFeHRlbnNpb25JbmZvKiBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHdhc19wYWNrZWRfb25fd2lyZSkgeworICAgICpmaWVsZF9udW1iZXIgPSBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKTsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZyk7CisgICAgcmV0dXJuIEZpbmRFeHRlbnNpb25JbmZvRnJvbUZpZWxkTnVtYmVyKHdpcmVfdHlwZSwgKmZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2ZpbmRlciwgZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNfcGFja2VkX29uX3dpcmUpOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGFuZCBmaWxscyBleHRlbnNpb24gaWYgZXh0ZW5zaW9uIGlzIGZvdW5kLgorICAvLyBOb3RlIHRvIHN1cHBvcnQgcGFja2VkIHJlcGVhdGVkIGZpZWxkIGNvbXBhdGliaWxpdHksIGl0IGFsc28gZmlsbHMgd2hldGhlcgorICAvLyB0aGUgdGFnIG9uIHdpcmUgaXMgcGFja2VkLCB3aGljaCBjYW4gYmUgZGlmZmVyZW50IGZyb20KKyAgLy8gZXh0ZW5zaW9uLT5pc19wYWNrZWQgKHdoZXRoZXIgcGFja2VkPXRydWUgaXMgc3BlY2lmaWVkKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEV4dGVuc2lvbkZpbmRlcj4KKyAgYm9vbCBGaW5kRXh0ZW5zaW9uSW5mb0Zyb21GaWVsZE51bWJlcihpbnQgd2lyZV90eXBlLCBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25JbmZvKiBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FzX3BhY2tlZF9vbl93aXJlKSBjb25zdCB7CisgICAgaWYgKCFleHRlbnNpb25fZmluZGVyLT5GaW5kKGZpZWxkX251bWJlciwgZXh0ZW5zaW9uKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEdPT0dMRV9EQ0hFQ0soZXh0ZW5zaW9uLT50eXBlID4gMCAmJgorICAgICAgICAgICBleHRlbnNpb24tPnR5cGUgPD0gV2lyZUZvcm1hdExpdGU6Ok1BWF9GSUVMRF9UWVBFKTsKKyAgICBhdXRvIHJlYWxfdHlwZSA9IHN0YXRpY19jYXN0PFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGU+KGV4dGVuc2lvbi0+dHlwZSk7CisKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgZXhwZWN0ZWRfd2lyZV90eXBlID0KKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlRm9yRmllbGRUeXBlKHJlYWxfdHlwZSk7CisKKyAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgcGFja2VkIGZpZWxkLgorICAgICp3YXNfcGFja2VkX29uX3dpcmUgPSBmYWxzZTsKKyAgICBpZiAoZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCAmJgorICAgICAgICB3aXJlX3R5cGUgPT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQgJiYKKyAgICAgICAgaXNfcGFja2FibGUoZXhwZWN0ZWRfd2lyZV90eXBlKSkgeworICAgICAgKndhc19wYWNrZWRfb25fd2lyZSA9IHRydWU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gT3RoZXJ3aXNlIHRoZSB3aXJlIHR5cGUgbXVzdCBtYXRjaC4KKyAgICByZXR1cm4gZXhwZWN0ZWRfd2lyZV90eXBlID09IHdpcmVfdHlwZTsKKyAgfQorCisgIC8vIEZpbmQgdGhlIHByb3RvdHlwZSBmb3IgYSBMYXp5TWVzc2FnZSBmcm9tIHRoZSBleHRlbnNpb24gcmVnaXN0cnkuIFJldHVybnMKKyAgLy8gbnVsbCBpZiB0aGUgZXh0ZW5zaW9uIGlzIG5vdCBmb3VuZC4KKyAgY29uc3QgTWVzc2FnZUxpdGUqIEdldFByb3RvdHlwZUZvckxhenlNZXNzYWdlKGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBleHRlbnNpb24gaXMgcHJlc2VudCBhbmQgbGF6eS4KKyAgYm9vbCBIYXNMYXp5KGludCBudW1iZXIpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIGV4dGVuc2lvbiB3aXRoIHRoZSBnaXZlbiBudW1iZXIsIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90CisgIC8vIGFscmVhZHkgZXhpc3QuICBSZXR1cm5zIHRydWUgaWYgdGhlIGV4dGVuc2lvbiBkaWQgbm90IGFscmVhZHkgZXhpc3QuCisgIGJvb2wgTWF5YmVOZXdFeHRlbnNpb24oaW50IG51bWJlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbioqIHJlc3VsdCk7CisKKyAgLy8gR2V0cyB0aGUgcmVwZWF0ZWQgZXh0ZW5zaW9uIGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvciwgY3JlYXRpbmcgaXQgaWYKKyAgLy8gaXQgZG9lcyBub3QgZXhpc3QuCisgIEV4dGVuc2lvbiogTWF5YmVOZXdSZXBlYXRlZEV4dGVuc2lvbihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisgIGJvb2wgRmluZEV4dGVuc2lvbihpbnQgd2lyZV90eXBlLCB1aW50MzJfdCBmaWVsZCwgY29uc3QgTWVzc2FnZUxpdGUqIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWw6OlBhcnNlQ29udGV4dCogLypjdHgqLywKKyAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkluZm8qIGV4dGVuc2lvbiwgYm9vbCogd2FzX3BhY2tlZF9vbl93aXJlKSB7CisgICAgR2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyIGZpbmRlcihleHRlbmRlZSk7CisgICAgcmV0dXJuIEZpbmRFeHRlbnNpb25JbmZvRnJvbUZpZWxkTnVtYmVyKHdpcmVfdHlwZSwgZmllbGQsICZmaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwgd2FzX3BhY2tlZF9vbl93aXJlKTsKKyAgfQorICBpbmxpbmUgYm9vbCBGaW5kRXh0ZW5zaW9uKGludCB3aXJlX3R5cGUsIHVpbnQzMl90IGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25JbmZvKiBleHRlbnNpb24sIGJvb2wqIHdhc19wYWNrZWRfb25fd2lyZSk7CisgIC8vIFVzZWQgZm9yIE1lc3NhZ2VTZXQgb25seQorICBjb25zdCBjaGFyKiBQYXJzZUZpZWxkTWF5YmVMYXppbHkodWludDY0X3QgdGFnLCBjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogZXh0ZW5kZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YSogbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyAgICAvLyBMaXRlIE1lc3NhZ2VTZXQgZG9lc24ndCBpbXBsZW1lbnQgbGF6eS4KKyAgICByZXR1cm4gUGFyc2VGaWVsZCh0YWcsIHB0ciwgZXh0ZW5kZWUsIG1ldGFkYXRhLCBjdHgpOworICB9CisgIGNvbnN0IGNoYXIqIFBhcnNlRmllbGRNYXliZUxhemlseSh1aW50NjRfdCB0YWcsIGNvbnN0IGNoYXIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGEqIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KTsKKyAgY29uc3QgY2hhciogUGFyc2VNZXNzYWdlU2V0SXRlbShjb25zdCBjaGFyKiBwdHIsIGNvbnN0IE1lc3NhZ2VMaXRlKiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YSogbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KTsKKyAgY29uc3QgY2hhciogUGFyc2VNZXNzYWdlU2V0SXRlbShjb25zdCBjaGFyKiBwdHIsIGNvbnN0IE1lc3NhZ2UqIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhKiBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpOworCisgIC8vIEltcGxlbWVudGVkIGluIGV4dGVuc2lvbl9zZXRfaW5sLmggdG8ga2VlcCBjb2RlIG91dCBvZiB0aGUgaGVhZGVyIGZpbGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBjb25zdCBjaGFyKiBQYXJzZUZpZWxkV2l0aEV4dGVuc2lvbkluZm8oaW50IG51bWJlciwgYm9vbCB3YXNfcGFja2VkX29uX3dpcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHRlbnNpb25JbmZvJiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGEqIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1zZywgdHlwZW5hbWUgVD4KKyAgY29uc3QgY2hhciogUGFyc2VNZXNzYWdlU2V0SXRlbVRtcGwoY29uc3QgY2hhciogcHRyLCBjb25zdCBNc2cqIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YSogbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCk7CisKKyAgLy8gSGFjazogIFJlcGVhdGVkUHRyRmllbGRCYXNlIGRlY2xhcmVzIEV4dGVuc2lvblNldCBhcyBhIGZyaWVuZC4gIFRoaXMKKyAgLy8gICBmcmllbmRzaGlwIHNob3VsZCBhdXRvbWF0aWNhbGx5IGV4dGVuZCB0byBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbiwgYnV0CisgIC8vICAgdW5mb3J0dW5hdGVseSBzb21lIG9sZGVyIGNvbXBpbGVycyAoZS5nLiBHQ0MgMy40LjQpIGRvIG5vdCBpbXBsZW1lbnQgdGhpcworICAvLyAgIGNvcnJlY3RseS4gIFNvLCB3ZSBtdXN0IHByb3ZpZGUgaGVscGVycyBmb3IgY2FsbGluZyBtZXRob2RzIG9mIHRoYXQKKyAgLy8gICBjbGFzcy4KKworICAvLyBEZWZpbmVkIGluIGV4dGVuc2lvbl9zZXRfaGVhdnkuY2MuCisgIHN0YXRpYyBpbmxpbmUgc2l6ZV90IFJlcGVhdGVkTWVzc2FnZV9TcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZygKKyAgICAgIFJlcGVhdGVkUHRyRmllbGRCYXNlKiBmaWVsZCk7CisKKyAgS2V5VmFsdWUqIGZsYXRfYmVnaW4oKSB7CisgICAgYXNzZXJ0KCFpc19sYXJnZSgpKTsKKyAgICByZXR1cm4gbWFwXy5mbGF0OworICB9CisgIGNvbnN0IEtleVZhbHVlKiBmbGF0X2JlZ2luKCkgY29uc3QgeworICAgIGFzc2VydCghaXNfbGFyZ2UoKSk7CisgICAgcmV0dXJuIG1hcF8uZmxhdDsKKyAgfQorICBLZXlWYWx1ZSogZmxhdF9lbmQoKSB7CisgICAgYXNzZXJ0KCFpc19sYXJnZSgpKTsKKyAgICByZXR1cm4gbWFwXy5mbGF0ICsgZmxhdF9zaXplXzsKKyAgfQorICBjb25zdCBLZXlWYWx1ZSogZmxhdF9lbmQoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc19sYXJnZSgpKTsKKyAgICByZXR1cm4gbWFwXy5mbGF0ICsgZmxhdF9zaXplXzsKKyAgfQorCisgIEFyZW5hKiBhcmVuYV87CisKKyAgLy8gTWFudWFsIG1lbW9yeS1tYW5hZ2VtZW50OgorICAvLyBtYXBfLmZsYXQgaXMgYW4gYWxsb2NhdGVkIGFycmF5IG9mIGZsYXRfY2FwYWNpdHlfIGVsZW1lbnRzLgorICAvLyBbbWFwXy5mbGF0LCBtYXBfLmZsYXQgKyBmbGF0X3NpemVfKSBpcyB0aGUgY3VycmVudGx5LWluLXVzZSBwcmVmaXguCisgIHVpbnQxNl90IGZsYXRfY2FwYWNpdHlfOworICB1aW50MTZfdCBmbGF0X3NpemVfOyAgLy8gbmVnYXRpdmUgaW50MTZfdChmbGF0X3NpemVfKSBpbmRpY2F0ZXMgaXNfbGFyZ2UoKQorICB1bmlvbiBBbGxvY2F0ZWREYXRhIHsKKyAgICBLZXlWYWx1ZSogZmxhdDsKKworICAgIC8vIElmIGZsYXRfY2FwYWNpdHlfID4ga01heGltdW1GbGF0Q2FwYWNpdHksIHN3aXRjaCB0byBMYXJnZU1hcCwKKyAgICAvLyB3aGljaCBndWFyYW50ZWVzIE8obiBsZyBuKSBDUFUgYnV0IGxhcmdlciBjb25zdGFudCBmYWN0b3JzLgorICAgIExhcmdlTWFwKiBsYXJnZTsKKyAgfSBtYXBfOworCisgIHN0YXRpYyB2b2lkIERlbGV0ZUZsYXRNYXAoY29uc3QgS2V5VmFsdWUqIGZsYXQsIHVpbnQxNl90IGZsYXRfY2FwYWNpdHkpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFeHRlbnNpb25TZXQpOworfTsKKworY29uc3RleHByIEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uU2V0KCkKKyAgICA6IGFyZW5hXyhudWxscHRyKSwgZmxhdF9jYXBhY2l0eV8oMCksIGZsYXRfc2l6ZV8oMCksIG1hcF97bnVsbHB0cn0ge30KKworLy8gVGhlc2UgYXJlIGp1c3QgZm9yIGNvbnZlbmllbmNlLi4uCitpbmxpbmUgdm9pZCBFeHRlbnNpb25TZXQ6OlNldFN0cmluZyhpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIE11dGFibGVTdHJpbmcobnVtYmVyLCB0eXBlLCBkZXNjcmlwdG9yKS0+YXNzaWduKHN0ZDo6bW92ZSh2YWx1ZSkpOworfQoraW5saW5lIHZvaWQgRXh0ZW5zaW9uU2V0OjpTZXRSZXBlYXRlZFN0cmluZyhpbnQgbnVtYmVyLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlKSB7CisgIE11dGFibGVSZXBlYXRlZFN0cmluZyhudW1iZXIsIGluZGV4KS0+YXNzaWduKHN0ZDo6bW92ZSh2YWx1ZSkpOworfQoraW5saW5lIHZvaWQgRXh0ZW5zaW9uU2V0OjpBZGRTdHJpbmcoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBBZGRTdHJpbmcobnVtYmVyLCB0eXBlLCBkZXNjcmlwdG9yKS0+YXNzaWduKHN0ZDo6bW92ZSh2YWx1ZSkpOworfQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gR2x1ZSBmb3IgZ2VuZXJhdGVkIGV4dGVuc2lvbiBhY2Nlc3NvcnMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGVtcGxhdGUgbWFnaWMKKworLy8gRmlyc3Qgd2UgaGF2ZSBhIHNldCBvZiBjbGFzc2VzIHJlcHJlc2VudGluZyAidHlwZSB0cmFpdHMiIGZvciBkaWZmZXJlbnQKKy8vIGZpZWxkIHR5cGVzLiAgQSB0eXBlIHRyYWl0cyBjbGFzcyBrbm93cyBob3cgdG8gaW1wbGVtZW50IGJhc2ljIGFjY2Vzc29ycworLy8gZm9yIGV4dGVuc2lvbnMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUgZ2l2ZW4gYW4gRXh0ZW5zaW9uU2V0LiAgVGhlIHNpZ25hdHVyZQorLy8gZm9yIGEgdHlwZSB0cmFpdHMgY2xhc3MgbG9va3MgbGlrZSB0aGlzOgorLy8KKy8vICAgY2xhc3MgVHlwZVRyYWl0cyB7CisvLyAgICBwdWJsaWM6CisvLyAgICAgdHlwZWRlZiA/IENvbnN0VHlwZTsKKy8vICAgICB0eXBlZGVmID8gTXV0YWJsZVR5cGU7CisvLyAgICAgLy8gVHlwZVRyYWl0cyBmb3Igc2luZ3VsYXIgZmllbGRzIGFuZCByZXBlYXRlZCBmaWVsZHMgd2lsbCBkZWZpbmUgdGhlCisvLyAgICAgLy8gc3ltYm9sICJTaW5ndWxhciIgb3IgIlJlcGVhdGVkIiByZXNwZWN0aXZlbHkuIFRoZXNlIHR3byBzeW1ib2xzIHdpbGwKKy8vICAgICAvLyBiZSB1c2VkIGluIGV4dGVuc2lvbiBhY2Nlc3NvcnMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBzaW5ndWxhcgorLy8gICAgIC8vIGV4dGVuc2lvbnMgYW5kIHJlcGVhdGVkIGV4dGVuc2lvbnMuIElmIHRoZSBUeXBlVHJhaXRzIGZvciB0aGUgcGFzc2VkCisvLyAgICAgLy8gaW4gZXh0ZW5zaW9uIGRvZXNuJ3QgaGF2ZSB0aGUgZXhwZWN0ZWQgc3ltYm9sIGRlZmluZWQsIGl0IG1lYW5zIHRoZQorLy8gICAgIC8vIHVzZXIgaXMgcGFzc2luZyBhIHJlcGVhdGVkIGV4dGVuc2lvbiB0byBhIHNpbmd1bGFyIGFjY2Vzc29yLCBvciB0aGUKKy8vICAgICAvLyBvcHBvc2l0ZS4gSW4gdGhhdCBjYXNlIHRoZSBDKysgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSBhbiBlcnJvcgorLy8gICAgIC8vIG1lc3NhZ2UgIm5vIG1hdGNoaW5nIG1lbWJlciBmdW5jdGlvbiIgdG8gaW5mb3JtIHRoZSB1c2VyLgorLy8gICAgIHR5cGVkZWYgPyBTaW5ndWxhcgorLy8gICAgIHR5cGVkZWYgPyBSZXBlYXRlZAorLy8KKy8vICAgICBzdGF0aWMgaW5saW5lIENvbnN0VHlwZSBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQpOworLy8gICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7CisvLyAgICAgc3RhdGljIGlubGluZSBNdXRhYmxlVHlwZSBNdXRhYmxlKGludCBudW1iZXIsIEV4dGVuc2lvblNldCogc2V0KTsKKy8vCisvLyAgICAgLy8gVmFyaWFudHMgZm9yIHJlcGVhdGVkIGZpZWxkcy4KKy8vICAgICBzdGF0aWMgaW5saW5lIENvbnN0VHlwZSBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7CisvLyAgICAgc3RhdGljIGlubGluZSB2b2lkIFNldChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFR5cGUgdmFsdWUsIEV4dGVuc2lvblNldCogc2V0KTsKKy8vICAgICBzdGF0aWMgaW5saW5lIE11dGFibGVUeXBlIE11dGFibGUoaW50IG51bWJlciwgaW50IGluZGV4LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25TZXQqIHNldCk7CisvLyAgICAgc3RhdGljIGlubGluZSB2b2lkIEFkZChpbnQgbnVtYmVyLCBDb25zdFR5cGUgdmFsdWUsIEV4dGVuc2lvblNldCogc2V0KTsKKy8vICAgICBzdGF0aWMgaW5saW5lIE11dGFibGVUeXBlIEFkZChpbnQgbnVtYmVyLCBFeHRlbnNpb25TZXQqIHNldCk7CisvLyAgICAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBFeHRlbnNpb25JZGVudGlmaWVyIGNvbnN0cnVjdG9yIHRvIHJlZ2lzdGVyCisvLyAgICAgdGhlIGV4dGVuc2lvbiBhdCBkeW5hbWljIGluaXRpYWxpemF0aW9uLgorLy8gICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBFeHRlbmRlZVQ+CisvLyAgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXIoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgaXNfcGFja2VkKTsKKy8vICAgfTsKKy8vCisvLyBOb3QgYWxsIG9mIHRoZXNlIG1ldGhvZHMgbWFrZSBzZW5zZSBmb3IgYWxsIGZpZWxkIHR5cGVzLiAgRm9yIGV4YW1wbGUsIHRoZQorLy8gIk11dGFibGUiIG1ldGhvZHMgb25seSBtYWtlIHNlbnNlIGZvciBzdHJpbmdzIGFuZCBtZXNzYWdlcywgYW5kIHRoZQorLy8gcmVwZWF0ZWQgbWV0aG9kcyBvbmx5IG1ha2Ugc2Vuc2UgZm9yIHJlcGVhdGVkIHR5cGVzLiAgU28sIGVhY2ggdHlwZQorLy8gdHJhaXRzIGNsYXNzIGltcGxlbWVudHMgb25seSB0aGUgc2V0IG9mIG1ldGhvZHMgZnJvbSB0aGlzIHNpZ25hdHVyZSB0aGF0IGl0CisvLyBhY3R1YWxseSBzdXBwb3J0cy4gIFRoaXMgd2lsbCBjYXVzZSBhIGNvbXBpbGVyIGVycm9yIGlmIHRoZSB1c2VyIHRyaWVzIHRvCisvLyBhY2Nlc3MgYW4gZXh0ZW5zaW9uIHVzaW5nIGEgbWV0aG9kIHRoYXQgZG9lc24ndCBtYWtlIHNlbnNlIGZvciBpdHMgdHlwZS4KKy8vIEZvciBleGFtcGxlLCBpZiAiZm9vIiBpcyBhbiBleHRlbnNpb24gb2YgdHlwZSAib3B0aW9uYWwgaW50MzIiLCB0aGVuIGlmIHlvdQorLy8gdHJ5IHRvIHdyaXRlIGNvZGUgbGlrZToKKy8vICAgbXlfbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKGZvbykKKy8vIHlvdSB3aWxsIGdldCBhIGNvbXBpbGUgZXJyb3IgYmVjYXVzZSBQcmltaXRpdmVUeXBlVHJhaXRzPGludDMyX3Q+IGRvZXMgbm90CisvLyBoYXZlIGEgIk11dGFibGUoKSIgbWV0aG9kLgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmltaXRpdmVUeXBlVHJhaXRzCisKKy8vIFNpbmNlIHRoZSBFeHRlbnNpb25TZXQgaGFzIGRpZmZlcmVudCBtZXRob2RzIGZvciBlYWNoIHByaW1pdGl2ZSB0eXBlLAorLy8gd2UgbXVzdCBleHBsaWNpdGx5IGRlZmluZSB0aGUgbWV0aG9kcyBvZiB0aGUgdHlwZSB0cmFpdHMgY2xhc3MgZm9yIGVhY2gKKy8vIGtub3duIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2NsYXNzIFByaW1pdGl2ZVR5cGVUcmFpdHMgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUeXBlIENvbnN0VHlwZTsKKyAgdHlwZWRlZiBUeXBlIE11dGFibGVUeXBlOworICB0eXBlZGVmIFByaW1pdGl2ZVR5cGVUcmFpdHM8VHlwZT4gU2luZ3VsYXI7CisKKyAgc3RhdGljIGlubGluZSBDb25zdFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIGRlZmF1bHRfdmFsdWUpOworCisgIHN0YXRpYyBpbmxpbmUgY29uc3QgQ29uc3RUeXBlKiBHZXRQdHIoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uc3RUeXBlJiBkZWZhdWx0X3ZhbHVlKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIFNldChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwgQ29uc3RUeXBlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEV4dGVuZGVlVD4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXIoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgaXNfcGFja2VkLAorICAgICAgICAgICAgICAgICAgICAgICBMYXp5RWFnZXJWZXJpZnlGblR5cGUgdmVyaWZ5X2Z1bmMpIHsKKyAgICBFeHRlbnNpb25TZXQ6OlJlZ2lzdGVyRXh0ZW5zaW9uKCZFeHRlbmRlZVQ6OmRlZmF1bHRfaW5zdGFuY2UoKSwgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgZmFsc2UsIGlzX3BhY2tlZCwgdmVyaWZ5X2Z1bmMpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2NsYXNzIFJlcGVhdGVkUHJpbWl0aXZlVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIFR5cGUgQ29uc3RUeXBlOworICB0eXBlZGVmIFR5cGUgTXV0YWJsZVR5cGU7CisgIHR5cGVkZWYgUmVwZWF0ZWRQcmltaXRpdmVUeXBlVHJhaXRzPFR5cGU+IFJlcGVhdGVkOworCisgIHR5cGVkZWYgUmVwZWF0ZWRGaWVsZDxUeXBlPiBSZXBlYXRlZEZpZWxkVHlwZTsKKworICBzdGF0aWMgaW5saW5lIFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LCBpbnQgaW5kZXgpOworICBzdGF0aWMgaW5saW5lIGNvbnN0IFR5cGUqIEdldFB0cihpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KTsKKyAgc3RhdGljIGlubGluZSBjb25zdCBSZXBlYXRlZEZpZWxkPENvbnN0VHlwZT4qIEdldFJlcGVhdGVkUHRyKAorICAgICAgaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQpOworICBzdGF0aWMgaW5saW5lIHZvaWQgU2V0KGludCBudW1iZXIsIGludCBpbmRleCwgVHlwZSB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpOworICBzdGF0aWMgaW5saW5lIHZvaWQgQWRkKGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLCBib29sIGlzX3BhY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7CisKKyAgc3RhdGljIGlubGluZSBjb25zdCBSZXBlYXRlZEZpZWxkPENvbnN0VHlwZT4mIEdldFJlcGVhdGVkKAorICAgICAgaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQpOworICBzdGF0aWMgaW5saW5lIFJlcGVhdGVkRmllbGQ8VHlwZT4qIE11dGFibGVSZXBlYXRlZChpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KTsKKworICBzdGF0aWMgY29uc3QgUmVwZWF0ZWRGaWVsZFR5cGUqIEdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBFeHRlbmRlZVQ+CisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sIGlzX3BhY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgTGF6eUVhZ2VyVmVyaWZ5Rm5UeXBlIHZlcmlmeV9mdW5jKSB7CisgICAgRXh0ZW5zaW9uU2V0OjpSZWdpc3RlckV4dGVuc2lvbigmRXh0ZW5kZWVUOjpkZWZhdWx0X2luc3RhbmNlKCksIG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHRydWUsIGlzX3BhY2tlZCwgdmVyaWZ5X2Z1bmMpOworICB9Cit9OworCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgUmVwZWF0ZWRQcmltaXRpdmVEZWZhdWx0cyB7CisgcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CisgIGZyaWVuZCBjbGFzcyBSZXBlYXRlZFByaW1pdGl2ZVR5cGVUcmFpdHM7CisgIHN0YXRpYyBjb25zdCBSZXBlYXRlZFByaW1pdGl2ZURlZmF1bHRzKiBkZWZhdWx0X2luc3RhbmNlKCk7CisgIFJlcGVhdGVkRmllbGQ8aW50MzJfdD4gZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9pbnQzMl90XzsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ2NF90PiBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2ludDY0X3RfOworICBSZXBlYXRlZEZpZWxkPHVpbnQzMl90PiBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX3VpbnQzMl90XzsKKyAgUmVwZWF0ZWRGaWVsZDx1aW50NjRfdD4gZGVmYXVsdF9yZXBlYXRlZF9maWVsZF91aW50NjRfdF87CisgIFJlcGVhdGVkRmllbGQ8ZG91YmxlPiBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2RvdWJsZV87CisgIFJlcGVhdGVkRmllbGQ8ZmxvYXQ+IGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfZmxvYXRfOworICBSZXBlYXRlZEZpZWxkPGJvb2w+IGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfYm9vbF87Cit9OworCisjZGVmaW5lIFBST1RPQlVGX0RFRklORV9QUklNSVRJVkVfVFlQRShUWVBFLCBNRVRIT0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIFRZUEUgUHJpbWl0aXZlVHlwZVRyYWl0czxUWVBFPjo6R2V0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwgVFlQRSBkZWZhdWx0X3ZhbHVlKSB7ICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBzZXQuR2V0IyNNRVRIT0QobnVtYmVyLCBkZWZhdWx0X3ZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgY29uc3QgVFlQRSogUHJpbWl0aXZlVHlwZVRyYWl0czxUWVBFPjo6R2V0UHRyKCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LCBjb25zdCBUWVBFJiBkZWZhdWx0X3ZhbHVlKSB7ICAgICAgICBcCisgICAgcmV0dXJuICZzZXQuR2V0UmVmIyNNRVRIT0QobnVtYmVyLCBkZWZhdWx0X3ZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSB2b2lkIFByaW1pdGl2ZVR5cGVUcmFpdHM8VFlQRT46OlNldChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRSB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsgIFwKKyAgICBzZXQtPlNldCMjTUVUSE9EKG51bWJlciwgZmllbGRfdHlwZSwgdmFsdWUsIG51bGxwdHIpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBUWVBFIFJlcGVhdGVkUHJpbWl0aXZlVHlwZVRyYWl0czxUWVBFPjo6R2V0KCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsIGludCBpbmRleCkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc2V0LkdldFJlcGVhdGVkIyNNRVRIT0QobnVtYmVyLCBpbmRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIGNvbnN0IFRZUEUqIFJlcGVhdGVkUHJpbWl0aXZlVHlwZVRyYWl0czxUWVBFPjo6R2V0UHRyKCAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwgaW50IGluZGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAmc2V0LkdldFJlZlJlcGVhdGVkIyNNRVRIT0QobnVtYmVyLCBpbmRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdm9pZCBSZXBlYXRlZFByaW1pdGl2ZVR5cGVUcmFpdHM8VFlQRT46OlNldCggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCBudW1iZXIsIGludCBpbmRleCwgVFlQRSB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsgICAgICAgICAgICAgICAgICBcCisgICAgc2V0LT5TZXRSZXBlYXRlZCMjTUVUSE9EKG51bWJlciwgaW5kZXgsIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSB2b2lkIFJlcGVhdGVkUHJpbWl0aXZlVHlwZVRyYWl0czxUWVBFPjo6QWRkKCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsIGJvb2wgaXNfcGFja2VkLCBUWVBFIHZhbHVlLCAgICAgICAgICAgIFwKKyAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2V0LT5BZGQjI01FVEhPRChudW1iZXIsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZCwgdmFsdWUsIG51bGxwdHIpOyAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBjb25zdCBSZXBlYXRlZEZpZWxkPFRZUEU+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBSZXBlYXRlZFByaW1pdGl2ZVR5cGVUcmFpdHM8VFlQRT46OkdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCkgeyAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gJlJlcGVhdGVkUHJpbWl0aXZlRGVmYXVsdHM6OmRlZmF1bHRfaW5zdGFuY2UoKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgLT5kZWZhdWx0X3JlcGVhdGVkX2ZpZWxkXyMjVFlQRSMjXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBjb25zdCBSZXBlYXRlZEZpZWxkPFRZUEU+JiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBSZXBlYXRlZFByaW1pdGl2ZVR5cGVUcmFpdHM8VFlQRT46OkdldFJlcGVhdGVkKGludCBudW1iZXIsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHRlbnNpb25TZXQmIHNldCkgeyAgICBcCisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFJlcGVhdGVkRmllbGQ8VFlQRT4qPiggICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzZXQuR2V0UmF3UmVwZWF0ZWRGaWVsZChudW1iZXIsIEdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCkpKTsgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgY29uc3QgUmVwZWF0ZWRGaWVsZDxUWVBFPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUmVwZWF0ZWRQcmltaXRpdmVUeXBlVHJhaXRzPFRZUEU+OjpHZXRSZXBlYXRlZFB0cihpbnQgbnVtYmVyLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQpIHsgXAorICAgIHJldHVybiAmR2V0UmVwZWF0ZWQobnVtYmVyLCBzZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgUmVwZWF0ZWRGaWVsZDxUWVBFPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUmVwZWF0ZWRQcmltaXRpdmVUeXBlVHJhaXRzPFRZUEU+OjpNdXRhYmxlUmVwZWF0ZWQoICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwgYm9vbCBpc19wYWNrZWQsIEV4dGVuc2lvblNldCogc2V0KSB7ICAgXAorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFJlcGVhdGVkRmllbGQ8VFlQRT4qPiggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2V0LT5NdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChudW1iZXIsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZCwgbnVsbHB0cikpOyBcCisgIH0KKworUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKGludDMyX3QsIEludDMyKQorUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKGludDY0X3QsIEludDY0KQorUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKHVpbnQzMl90LCBVSW50MzIpCitQUk9UT0JVRl9ERUZJTkVfUFJJTUlUSVZFX1RZUEUodWludDY0X3QsIFVJbnQ2NCkKK1BST1RPQlVGX0RFRklORV9QUklNSVRJVkVfVFlQRShmbG9hdCwgRmxvYXQpCitQUk9UT0JVRl9ERUZJTkVfUFJJTUlUSVZFX1RZUEUoZG91YmxlLCBEb3VibGUpCitQUk9UT0JVRl9ERUZJTkVfUFJJTUlUSVZFX1RZUEUoYm9vbCwgQm9vbCkKKworI3VuZGVmIFBST1RPQlVGX0RFRklORV9QUklNSVRJVkVfVFlQRQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdHJpbmdUeXBlVHJhaXRzCisKKy8vIFN0cmluZ3Mgc3VwcG9ydCBib3RoIFNldCgpIGFuZCBNdXRhYmxlKCkuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgU3RyaW5nVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIGNvbnN0IHN0ZDo6c3RyaW5nJiBDb25zdFR5cGU7CisgIHR5cGVkZWYgc3RkOjpzdHJpbmcqIE11dGFibGVUeXBlOworICB0eXBlZGVmIFN0cmluZ1R5cGVUcmFpdHMgU2luZ3VsYXI7CisKKyAgc3RhdGljIGlubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIGRlZmF1bHRfdmFsdWUpIHsKKyAgICByZXR1cm4gc2V0LkdldFN0cmluZyhudW1iZXIsIGRlZmF1bHRfdmFsdWUpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcqIEdldFB0cihpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0VHlwZSBkZWZhdWx0X3ZhbHVlKSB7CisgICAgcmV0dXJuICZHZXQobnVtYmVyLCBzZXQsIGRlZmF1bHRfdmFsdWUpOworICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCkgeworICAgIHNldC0+U2V0U3RyaW5nKG51bWJlciwgZmllbGRfdHlwZSwgdmFsdWUsIG51bGxwdHIpOworICB9CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcqIE11dGFibGUoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICByZXR1cm4gc2V0LT5NdXRhYmxlU3RyaW5nKG51bWJlciwgZmllbGRfdHlwZSwgbnVsbHB0cik7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEV4dGVuZGVlVD4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXIoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgaXNfcGFja2VkLAorICAgICAgICAgICAgICAgICAgICAgICBMYXp5RWFnZXJWZXJpZnlGblR5cGUgdmVyaWZ5X2Z1bmMpIHsKKyAgICBFeHRlbnNpb25TZXQ6OlJlZ2lzdGVyRXh0ZW5zaW9uKCZFeHRlbmRlZVQ6OmRlZmF1bHRfaW5zdGFuY2UoKSwgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgZmFsc2UsIGlzX3BhY2tlZCwgdmVyaWZ5X2Z1bmMpOworICB9Cit9OworCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgUmVwZWF0ZWRTdHJpbmdUeXBlVHJhaXRzIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgY29uc3Qgc3RkOjpzdHJpbmcmIENvbnN0VHlwZTsKKyAgdHlwZWRlZiBzdGQ6OnN0cmluZyogTXV0YWJsZVR5cGU7CisgIHR5cGVkZWYgUmVwZWF0ZWRTdHJpbmdUeXBlVHJhaXRzIFJlcGVhdGVkOworCisgIHR5cGVkZWYgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gUmVwZWF0ZWRGaWVsZFR5cGU7CisKKyAgc3RhdGljIGlubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7CisgICAgcmV0dXJuIHNldC5HZXRSZXBlYXRlZFN0cmluZyhudW1iZXIsIGluZGV4KTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nKiBHZXRQdHIoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gJkdldChudW1iZXIsIHNldCwgaW5kZXgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4qIEdldFJlcGVhdGVkUHRyKAorICAgICAgaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQpIHsKKyAgICByZXR1cm4gJkdldFJlcGVhdGVkKG51bWJlciwgc2V0KTsKKyAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgU2V0KGludCBudW1iZXIsIGludCBpbmRleCwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgc2V0LT5TZXRSZXBlYXRlZFN0cmluZyhudW1iZXIsIGluZGV4LCB2YWx1ZSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyogTXV0YWJsZShpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgcmV0dXJuIHNldC0+TXV0YWJsZVJlcGVhdGVkU3RyaW5nKG51bWJlciwgaW5kZXgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBBZGQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsIGJvb2wgLyppc19wYWNrZWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgc2V0LT5BZGRTdHJpbmcobnVtYmVyLCBmaWVsZF90eXBlLCB2YWx1ZSwgbnVsbHB0cik7CisgIH0KKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyogQWRkKGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICByZXR1cm4gc2V0LT5BZGRTdHJpbmcobnVtYmVyLCBmaWVsZF90eXBlLCBudWxscHRyKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+JiBHZXRSZXBlYXRlZCgKKyAgICAgIGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0KSB7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Kj4oCisgICAgICAgIHNldC5HZXRSYXdSZXBlYXRlZEZpZWxkKG51bWJlciwgR2V0RGVmYXVsdFJlcGVhdGVkRmllbGQoKSkpOworICB9CisKKyAgc3RhdGljIGlubGluZSBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiogTXV0YWJsZVJlcGVhdGVkKAorICAgICAgaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsIGJvb2wgaXNfcGFja2VkLCBFeHRlbnNpb25TZXQqIHNldCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Kj4oCisgICAgICAgIHNldC0+TXV0YWJsZVJhd1JlcGVhdGVkRmllbGQobnVtYmVyLCBmaWVsZF90eXBlLCBpc19wYWNrZWQsIG51bGxwdHIpKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkVHlwZSogR2V0RGVmYXVsdFJlcGVhdGVkRmllbGQoKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXh0ZW5kZWVUPgorICBzdGF0aWMgdm9pZCBSZWdpc3RlcihpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCBpc19wYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgIExhenlFYWdlclZlcmlmeUZuVHlwZSBmbikgeworICAgIEV4dGVuc2lvblNldDo6UmVnaXN0ZXJFeHRlbnNpb24oJkV4dGVuZGVlVDo6ZGVmYXVsdF9pbnN0YW5jZSgpLCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCB0cnVlLCBpc19wYWNrZWQsIGZuKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZURlZmF1bHRSZXBlYXRlZEZpZWxkcygpOworICBzdGF0aWMgdm9pZCBEZXN0cm95RGVmYXVsdFJlcGVhdGVkRmllbGRzKCk7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnVtVHlwZVRyYWl0cworCisvLyBFeHRlbnNpb25TZXQgcmVwcmVzZW50cyBlbnVtcyB1c2luZyBpbnRlZ2VycyBpbnRlcm5hbGx5LCBzbyB3ZSBoYXZlIHRvCisvLyBzdGF0aWNfY2FzdCBhcm91bmQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZSwgYm9vbCBJc1ZhbGlkKGludCk+CitjbGFzcyBFbnVtVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIFR5cGUgQ29uc3RUeXBlOworICB0eXBlZGVmIFR5cGUgTXV0YWJsZVR5cGU7CisgIHR5cGVkZWYgRW51bVR5cGVUcmFpdHM8VHlwZSwgSXNWYWxpZD4gU2luZ3VsYXI7CisKKyAgc3RhdGljIGlubGluZSBDb25zdFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIGRlZmF1bHRfdmFsdWUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZT4oc2V0LkdldEVudW0obnVtYmVyLCBkZWZhdWx0X3ZhbHVlKSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBDb25zdFR5cGUqIEdldFB0cihpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdFR5cGUmIGRlZmF1bHRfdmFsdWUpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUeXBlKj4oCisgICAgICAgICZzZXQuR2V0UmVmRW51bShudW1iZXIsIGRlZmF1bHRfdmFsdWUpKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgU2V0KGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLCBDb25zdFR5cGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICBHT09HTEVfRENIRUNLKElzVmFsaWQodmFsdWUpKTsKKyAgICBzZXQtPlNldEVudW0obnVtYmVyLCBmaWVsZF90eXBlLCB2YWx1ZSwgbnVsbHB0cik7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEV4dGVuZGVlVD4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXIoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgaXNfcGFja2VkLAorICAgICAgICAgICAgICAgICAgICAgICBMYXp5RWFnZXJWZXJpZnlGblR5cGUgZm4pIHsKKyAgICBFeHRlbnNpb25TZXQ6OlJlZ2lzdGVyRW51bUV4dGVuc2lvbigmRXh0ZW5kZWVUOjpkZWZhdWx0X2luc3RhbmNlKCksIG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBmYWxzZSwgaXNfcGFja2VkLCBJc1ZhbGlkKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGUsIGJvb2wgSXNWYWxpZChpbnQpPgorY2xhc3MgUmVwZWF0ZWRFbnVtVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIFR5cGUgQ29uc3RUeXBlOworICB0eXBlZGVmIFR5cGUgTXV0YWJsZVR5cGU7CisgIHR5cGVkZWYgUmVwZWF0ZWRFbnVtVHlwZVRyYWl0czxUeXBlLCBJc1ZhbGlkPiBSZXBlYXRlZDsKKworICB0eXBlZGVmIFJlcGVhdGVkRmllbGQ8VHlwZT4gUmVwZWF0ZWRGaWVsZFR5cGU7CisKKyAgc3RhdGljIGlubGluZSBDb25zdFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LCBpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZT4oc2V0LkdldFJlcGVhdGVkRW51bShudW1iZXIsIGluZGV4KSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBDb25zdFR5cGUqIEdldFB0cihpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUeXBlKj4oCisgICAgICAgICZzZXQuR2V0UmVmUmVwZWF0ZWRFbnVtKG51bWJlciwgaW5kZXgpKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgU2V0KGludCBudW1iZXIsIGludCBpbmRleCwgQ29uc3RUeXBlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgR09PR0xFX0RDSEVDSyhJc1ZhbGlkKHZhbHVlKSk7CisgICAgc2V0LT5TZXRSZXBlYXRlZEVudW0obnVtYmVyLCBpbmRleCwgdmFsdWUpOworICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBBZGQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsIGJvb2wgaXNfcGFja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0VHlwZSB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICBHT09HTEVfRENIRUNLKElzVmFsaWQodmFsdWUpKTsKKyAgICBzZXQtPkFkZEVudW0obnVtYmVyLCBmaWVsZF90eXBlLCBpc19wYWNrZWQsIHZhbHVlLCBudWxscHRyKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IFJlcGVhdGVkRmllbGQ8VHlwZT4mIEdldFJlcGVhdGVkKAorICAgICAgaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQpIHsKKyAgICAvLyBIYWNrOiB0aGUgYEV4dGVuc2lvbmAgc3RydWN0IHN0b3JlcyBhIFJlcGVhdGVkRmllbGQ8aW50PiBmb3IgZW51bXMuCisgICAgLy8gUmVwZWF0ZWRGaWVsZDxpbnQ+IGNhbm5vdCBpbXBsaWNpdGx5IGNvbnZlcnQgdG8gUmVwZWF0ZWRGaWVsZDxFbnVtVHlwZT4KKyAgICAvLyBzbyB3ZSBuZWVkIHRvIGRvIHNvbWUgY2FzdGluZyBtYWdpYy4gU2VlIG1lc3NhZ2UuaCBmb3Igc2ltaWxhcgorICAgIC8vIGNvbnRvcnRpb25zIGZvciBub24tZXh0ZW5zaW9uIGZpZWxkcy4KKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVwZWF0ZWRGaWVsZDxUeXBlPio+KAorICAgICAgICBzZXQuR2V0UmF3UmVwZWF0ZWRGaWVsZChudW1iZXIsIEdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCkpKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IFJlcGVhdGVkRmllbGQ8VHlwZT4qIEdldFJlcGVhdGVkUHRyKAorICAgICAgaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQpIHsKKyAgICByZXR1cm4gJkdldFJlcGVhdGVkKG51bWJlciwgc2V0KTsKKyAgfQorICBzdGF0aWMgaW5saW5lIFJlcGVhdGVkRmllbGQ8VHlwZT4qIE11dGFibGVSZXBlYXRlZChpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRGaWVsZDxUeXBlPio+KAorICAgICAgICBzZXQtPk11dGFibGVSYXdSZXBlYXRlZEZpZWxkKG51bWJlciwgZmllbGRfdHlwZSwgaXNfcGFja2VkLCBudWxscHRyKSk7CisgIH0KKworICBzdGF0aWMgY29uc3QgUmVwZWF0ZWRGaWVsZFR5cGUqIEdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCkgeworICAgIC8vIEhhY2s6IGFzIG5vdGVkIGFib3ZlLCByZXBlYXRlZCBlbnVtIGZpZWxkcyBhcmUgaW50ZXJuYWxseSBzdG9yZWQgYXMgYQorICAgIC8vIFJlcGVhdGVkRmllbGQ8aW50Pi4gV2UgbmVlZCB0byBiZSBhYmxlIHRvIGluc3RhbnRpYXRlIGdsb2JhbCBzdGF0aWMKKyAgICAvLyBvYmplY3RzIHRvIHJldHVybiBhcyBkZWZhdWx0IChlbXB0eSkgcmVwZWF0ZWQgZmllbGRzIG9uIG5vbi1leGlzdGVudAorICAgIC8vIGV4dGVuc2lvbnMuIFdlIHdvdWxkIG5vdCBiZSBhYmxlIHRvIGtub3cgYS1wcmlvcmkgYWxsIG9mIHRoZSBlbnVtIHR5cGVzCisgICAgLy8gKHZhbHVlcyBvZiB8VHlwZXwpIHRvIGluc3RhbnRpYXRlIGFsbCBvZiB0aGVzZSwgc28gd2UganVzdCByZS11c2UKKyAgICAvLyBpbnQzMl90J3MgZGVmYXVsdCByZXBlYXRlZCBmaWVsZCBvYmplY3QuCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVwZWF0ZWRGaWVsZDxUeXBlPio+KAorICAgICAgICBSZXBlYXRlZFByaW1pdGl2ZVR5cGVUcmFpdHM8aW50MzJfdD46OkdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCkpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBFeHRlbmRlZVQ+CisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sIGlzX3BhY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgTGF6eUVhZ2VyVmVyaWZ5Rm5UeXBlIGZuKSB7CisgICAgRXh0ZW5zaW9uU2V0OjpSZWdpc3RlckVudW1FeHRlbnNpb24oJkV4dGVuZGVlVDo6ZGVmYXVsdF9pbnN0YW5jZSgpLCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgdHJ1ZSwgaXNfcGFja2VkLCBJc1ZhbGlkKTsKKyAgfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWVzc2FnZVR5cGVUcmFpdHMKKworLy8gRXh0ZW5zaW9uU2V0IGd1YXJhbnRlZXMgdGhhdCB3aGVuIG1hbmlwdWxhdGluZyBleHRlbnNpb25zIHdpdGggbWVzc2FnZQorLy8gdHlwZXMsIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIHdpbGwgYmUgdGhlIGNvbXBpbGVkLWluIGNsYXNzIHJlcHJlc2VudGluZworLy8gdGhhdCB0eXBlLiAgU28sIHdlIGNhbiBzdGF0aWNfY2FzdCBkb3duIHRvIHRoZSBleGFjdCB0eXBlIHdlIGV4cGVjdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorY2xhc3MgTWVzc2FnZVR5cGVUcmFpdHMgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBjb25zdCBUeXBlJiBDb25zdFR5cGU7CisgIHR5cGVkZWYgVHlwZSogTXV0YWJsZVR5cGU7CisgIHR5cGVkZWYgTWVzc2FnZVR5cGVUcmFpdHM8VHlwZT4gU2luZ3VsYXI7CisKKyAgc3RhdGljIGlubGluZSBDb25zdFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIGRlZmF1bHRfdmFsdWUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgVHlwZSY+KHNldC5HZXRNZXNzYWdlKG51bWJlciwgZGVmYXVsdF92YWx1ZSkpOworICB9CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpudWxscHRyX3QgR2V0UHRyKGludCAvKiBudW1iZXIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4dGVuc2lvblNldCYgLyogc2V0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFR5cGUgLyogZGVmYXVsdF92YWx1ZSAqLykgeworICAgIC8vIENhbm5vdCBiZSBpbXBsZW1lbnRlZCBiZWNhdXNlIG9mIGZvcndhcmQgZGVjbGFyZWQgbWVzc2FnZXM/CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgc3RhdGljIGlubGluZSBNdXRhYmxlVHlwZSBNdXRhYmxlKGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZSo+KHNldC0+TXV0YWJsZU1lc3NhZ2UoCisgICAgICAgIG51bWJlciwgZmllbGRfdHlwZSwgVHlwZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLCBudWxscHRyKSk7CisgIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIFNldEFsbG9jYXRlZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRhYmxlVHlwZSBtZXNzYWdlLCBFeHRlbnNpb25TZXQqIHNldCkgeworICAgIHNldC0+U2V0QWxsb2NhdGVkTWVzc2FnZShudW1iZXIsIGZpZWxkX3R5cGUsIG51bGxwdHIsIG1lc3NhZ2UpOworICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBVbnNhZmVBcmVuYVNldEFsbG9jYXRlZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11dGFibGVUeXBlIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25TZXQqIHNldCkgeworICAgIHNldC0+VW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWRNZXNzYWdlKG51bWJlciwgZmllbGRfdHlwZSwgbnVsbHB0ciwgbWVzc2FnZSk7CisgIH0KKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0YXRpYyBpbmxpbmUgTXV0YWJsZVR5cGUgUmVsZWFzZSgKKyAgICAgIGludCBudW1iZXIsIEZpZWxkVHlwZSAvKiBmaWVsZF90eXBlICovLCBFeHRlbnNpb25TZXQqIHNldCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUeXBlKj4oCisgICAgICAgIHNldC0+UmVsZWFzZU1lc3NhZ2UobnVtYmVyLCBUeXBlOjpkZWZhdWx0X2luc3RhbmNlKCkpKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIE11dGFibGVUeXBlIFVuc2FmZUFyZW5hUmVsZWFzZShpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFR5cGUgLyogZmllbGRfdHlwZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZSo+KAorICAgICAgICBzZXQtPlVuc2FmZUFyZW5hUmVsZWFzZU1lc3NhZ2UobnVtYmVyLCBUeXBlOjpkZWZhdWx0X2luc3RhbmNlKCkpKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXh0ZW5kZWVUPgorICBzdGF0aWMgdm9pZCBSZWdpc3RlcihpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCBpc19wYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgIExhenlFYWdlclZlcmlmeUZuVHlwZSBmbikgeworICAgIEV4dGVuc2lvblNldDo6UmVnaXN0ZXJNZXNzYWdlRXh0ZW5zaW9uKCZFeHRlbmRlZVQ6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIsIHR5cGUsIGZhbHNlLCBpc19wYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlR5cGU6OmRlZmF1bHRfaW5zdGFuY2UoKSwgZm4pOworICB9Cit9OworCisvLyBVc2VkIGJ5IFdpcmVGb3JtYXRWZXJpZnkgdG8gZXh0cmFjdCB0aGUgdmVyaWZ5IGZ1bmN0aW9uIGZyb20gdGhlIHJlZ2lzdHJ5LgorTGF6eUVhZ2VyVmVyaWZ5Rm5UeXBlIEZpbmRFeHRlbnNpb25MYXp5RWFnZXJWZXJpZnlGbigKKyAgICBjb25zdCBNZXNzYWdlTGl0ZSogZXh0ZW5kZWUsIGludCBudW1iZXIpOworCisvLyBmb3J3YXJkIGRlY2xhcmF0aW9uLgorY2xhc3MgUmVwZWF0ZWRNZXNzYWdlR2VuZXJpY1R5cGVUcmFpdHM7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorY2xhc3MgUmVwZWF0ZWRNZXNzYWdlVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIGNvbnN0IFR5cGUmIENvbnN0VHlwZTsKKyAgdHlwZWRlZiBUeXBlKiBNdXRhYmxlVHlwZTsKKyAgdHlwZWRlZiBSZXBlYXRlZE1lc3NhZ2VUeXBlVHJhaXRzPFR5cGU+IFJlcGVhdGVkOworCisgIHR5cGVkZWYgUmVwZWF0ZWRQdHJGaWVsZDxUeXBlPiBSZXBlYXRlZEZpZWxkVHlwZTsKKworICBzdGF0aWMgaW5saW5lIENvbnN0VHlwZSBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsIGludCBpbmRleCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBUeXBlJj4oc2V0LkdldFJlcGVhdGVkTWVzc2FnZShudW1iZXIsIGluZGV4KSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBzdGQ6Om51bGxwdHJfdCBHZXRQdHIoaW50IC8qIG51bWJlciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5zaW9uU2V0JiAvKiBzZXQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBpbmRleCAqLykgeworICAgIC8vIENhbm5vdCBiZSBpbXBsZW1lbnRlZCBiZWNhdXNlIG9mIGZvcndhcmQgZGVjbGFyZWQgbWVzc2FnZXM/CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgc3RhdGljIGlubGluZSBzdGQ6Om51bGxwdHJfdCBHZXRSZXBlYXRlZFB0cihpbnQgLyogbnVtYmVyICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4dGVuc2lvblNldCYgLyogc2V0ICovKSB7CisgICAgLy8gQ2Fubm90IGJlIGltcGxlbWVudGVkIGJlY2F1c2Ugb2YgZm9yd2FyZCBkZWNsYXJlZCBtZXNzYWdlcz8KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBzdGF0aWMgaW5saW5lIE11dGFibGVUeXBlIE11dGFibGUoaW50IG51bWJlciwgaW50IGluZGV4LCBFeHRlbnNpb25TZXQqIHNldCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUeXBlKj4oc2V0LT5NdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKG51bWJlciwgaW5kZXgpKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIE11dGFibGVUeXBlIEFkZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZSo+KAorICAgICAgICBzZXQtPkFkZE1lc3NhZ2UobnVtYmVyLCBmaWVsZF90eXBlLCBUeXBlOjpkZWZhdWx0X2luc3RhbmNlKCksIG51bGxwdHIpKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4mIEdldFJlcGVhdGVkKAorICAgICAgaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQpIHsKKyAgICAvLyBTZWUgbm90ZXMgYWJvdmUgaW4gUmVwZWF0ZWRFbnVtVHlwZVRyYWl0czo6R2V0UmVwZWF0ZWQoKTogc2FtZQorICAgIC8vIGNhc3RpbmcgaGFjayBhcHBsaWVzIGhlcmUsIGJlY2F1c2UgYSBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPgorICAgIC8vIGNhbm5vdCBuYXR1cmFsbHkgYmVjb21lIGEgUmVwZWF0ZWRQdHJUeXBlPFR5cGU+IGV2ZW4gdGhvdWdoIFR5cGUgaXMKKyAgICAvLyBwcmVzdW1hYmx5IGEgbWVzc2FnZS4gZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSBnb2VzIHRocm91Z2ggc2ltaWxhciBjb250b3J0aW9ucworICAgIC8vIHdpdGggYSByZWludGVycHJldF9jYXN0PD4uCisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4qPigKKyAgICAgICAgc2V0LkdldFJhd1JlcGVhdGVkRmllbGQobnVtYmVyLCBHZXREZWZhdWx0UmVwZWF0ZWRGaWVsZCgpKSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBSZXBlYXRlZFB0ckZpZWxkPFR5cGU+KiBNdXRhYmxlUmVwZWF0ZWQoaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25TZXQqIHNldCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4qPigKKyAgICAgICAgc2V0LT5NdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChudW1iZXIsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZCwgbnVsbHB0cikpOworICB9CisKKyAgc3RhdGljIGNvbnN0IFJlcGVhdGVkRmllbGRUeXBlKiBHZXREZWZhdWx0UmVwZWF0ZWRGaWVsZCgpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXh0ZW5kZWVUPgorICBzdGF0aWMgdm9pZCBSZWdpc3RlcihpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCBpc19wYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgIExhenlFYWdlclZlcmlmeUZuVHlwZSBmbikgeworICAgIEV4dGVuc2lvblNldDo6UmVnaXN0ZXJNZXNzYWdlRXh0ZW5zaW9uKCZFeHRlbmRlZVQ6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIsIHR5cGUsIHRydWUsIGlzX3BhY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmVHlwZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLCBmbik7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIGNvbnN0IHR5cGVuYW1lIFJlcGVhdGVkTWVzc2FnZVR5cGVUcmFpdHM8VHlwZT46OlJlcGVhdGVkRmllbGRUeXBlKgorUmVwZWF0ZWRNZXNzYWdlVHlwZVRyYWl0czxUeXBlPjo6R2V0RGVmYXVsdFJlcGVhdGVkRmllbGQoKSB7CisgIHN0YXRpYyBhdXRvIGluc3RhbmNlID0gT25TaHV0ZG93bkRlbGV0ZShuZXcgUmVwZWF0ZWRGaWVsZFR5cGUpOworICByZXR1cm4gaW5zdGFuY2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEV4dGVuc2lvbklkZW50aWZpZXIKKworLy8gVGhpcyBpcyB0aGUgdHlwZSBvZiBhY3R1YWwgZXh0ZW5zaW9uIG9iamVjdHMuICBFLmcuIGlmIHlvdSBoYXZlOgorLy8gICBleHRlbmQgRm9vIHsKKy8vICAgICBvcHRpb25hbCBpbnQzMiBiYXIgPSAxMjM0OworLy8gICB9CisvLyB0aGVuICJiYXIiIHdpbGwgYmUgZGVmaW5lZCBpbiBDKysgYXM6CisvLyAgIEV4dGVuc2lvbklkZW50aWZpZXI8Rm9vLCBQcmltaXRpdmVUeXBlVHJhaXRzPGludDMyX3Q+LCA1LCBmYWxzZT4gYmFyKDEyMzQpOworLy8KKy8vIE5vdGUgdGhhdCB3ZSBjb3VsZCwgaW4gdGhlb3J5LCBzdXBwbHkgdGhlIGZpZWxkIG51bWJlciBhcyBhIHRlbXBsYXRlCisvLyBwYXJhbWV0ZXIsIGFuZCB0aHVzIG1ha2UgYW4gaW5zdGFuY2Ugb2YgRXh0ZW5zaW9uSWRlbnRpZmllciBoYXZlIG5vCisvLyBhY3R1YWwgY29udGVudHMuICBIb3dldmVyLCBpZiB3ZSBkaWQgdGhhdCwgdGhlbiB1c2luZyBhbiBleHRlbnNpb24KKy8vIGlkZW50aWZpZXIgd291bGQgbm90IG5lY2Vzc2FyaWx5IGNhdXNlIHRoZSBjb21waWxlciB0byBvdXRwdXQgYW55IHNvcnQKKy8vIG9mIHJlZmVyZW5jZSB0byBhbnkgc3ltYm9sIGRlZmluZWQgaW4gdGhlIGV4dGVuc2lvbidzIC5wYi5vIGZpbGUuICBTb21lCisvLyBsaW5rZXJzIHdpbGwgYWN0dWFsbHkgZHJvcCBvYmplY3QgZmlsZXMgdGhhdCBhcmUgbm90IGV4cGxpY2l0bHkgcmVmZXJlbmNlZCwKKy8vIGJ1dCB0aGF0IHdvdWxkIGJlIGJhZCBiZWNhdXNlIGl0IHdvdWxkIGNhdXNlIHRoaXMgZXh0ZW5zaW9uIHRvIG5vdCBiZQorLy8gcmVnaXN0ZXJlZCBhdCBzdGF0aWMgaW5pdGlhbGl6YXRpb24sIGFuZCB0aGVyZWZvcmUgdXNpbmcgaXQgd291bGQgY3Jhc2guCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFeHRlbmRlZVR5cGUsIHR5cGVuYW1lIFR5cGVUcmFpdHNUeXBlLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICBib29sIGlzX3BhY2tlZD4KK2NsYXNzIEV4dGVuc2lvbklkZW50aWZpZXIgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUeXBlVHJhaXRzVHlwZSBUeXBlVHJhaXRzOworICB0eXBlZGVmIEV4dGVuZGVlVHlwZSBFeHRlbmRlZTsKKworICBFeHRlbnNpb25JZGVudGlmaWVyKGludCBudW1iZXIsIHR5cGVuYW1lIFR5cGVUcmFpdHM6OkNvbnN0VHlwZSBkZWZhdWx0X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIExhenlFYWdlclZlcmlmeUZuVHlwZSB2ZXJpZnlfZnVuYyA9IG51bGxwdHIpCisgICAgICA6IG51bWJlcl8obnVtYmVyKSwgZGVmYXVsdF92YWx1ZV8oZGVmYXVsdF92YWx1ZSkgeworICAgIFJlZ2lzdGVyKG51bWJlciwgdmVyaWZ5X2Z1bmMpOworICB9CisgIGlubGluZSBpbnQgbnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbnVtYmVyXzsgfQorICB0eXBlbmFtZSBUeXBlVHJhaXRzOjpDb25zdFR5cGUgZGVmYXVsdF92YWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZV87CisgIH0KKworICBzdGF0aWMgdm9pZCBSZWdpc3RlcihpbnQgbnVtYmVyLCBMYXp5RWFnZXJWZXJpZnlGblR5cGUgdmVyaWZ5X2Z1bmMpIHsKKyAgICBUeXBlVHJhaXRzOjp0ZW1wbGF0ZSBSZWdpc3RlcjxFeHRlbmRlZVR5cGU+KG51bWJlciwgZmllbGRfdHlwZSwgaXNfcGFja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5X2Z1bmMpOworICB9CisKKyAgdHlwZW5hbWUgVHlwZVRyYWl0czo6Q29uc3RUeXBlIGNvbnN0JiBkZWZhdWx0X3ZhbHVlX3JlZigpIGNvbnN0IHsKKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZV87CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IGludCBudW1iZXJfOworICB0eXBlbmFtZSBUeXBlVHJhaXRzOjpDb25zdFR5cGUgZGVmYXVsdF92YWx1ZV87Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHZW5lcmF0ZWQgYWNjZXNzb3JzCisKKworLy8gVXNlZCB0byByZXRyaWV2ZSBhIGxhenkgZXh0ZW5zaW9uLCBtYXkgcmV0dXJuIG51bGxwdHIgaW4gc29tZSBlbnZpcm9ubWVudHMuCitleHRlcm4gUFJPVE9CVUZfQVRUUklCVVRFX1dFQUsgRXh0ZW5zaW9uU2V0OjpMYXp5TWVzc2FnZUV4dGVuc2lvbioKK01heWJlQ3JlYXRlTGF6eUV4dGVuc2lvbihBcmVuYSogYXJlbmEpOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IHRoaXMgZXh0ZW5zaW9ucydzIHJlZmxlY3Rpb24gaXMgbGlua2VkIGludG8KKy8vIHRoZSBiaW5hcnk6CisvLworLy8gICBnb29nbGU6OnByb3RvYnVmOjpMaW5rRXh0ZW5zaW9uUmVmbGVjdGlvbihGb286Om15X2V4dGVuc2lvbik7CisvLworLy8gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBmb2xsb3dpbmcgbG9va3VwIHdpbGwgc3VjY2VlZDoKKy8vCisvLyAgIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJGb28ubXlfZXh0ZW5zaW9uIik7CisvLworLy8gVGhpcyBpcyBvZnRlbiByZWxldmFudCBmb3IgcGFyc2luZyBleHRlbnNpb25zIGluIHRleHQgbW9kZS4KKy8vCisvLyBBcyBhIHNpZGUtZWZmZWN0LCBpdCB3aWxsIGFsc28gZ3VhcmFudGVlIHRoYXQgYW55dGhpbmcgZWxzZSBmcm9tIHRoZSBzYW1lCisvLyAucHJvdG8gZmlsZSB3aWxsIGFsc28gYmUgYXZhaWxhYmxlIGZvciBsb29rdXAgaW4gdGhlIGdlbmVyYXRlZCBwb29sLgorLy8KKy8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWN0dWFsbHkgcmVnaXN0ZXIgdGhlIGV4dGVuc2lvbiwgc28gaXQgZG9lcyBub3QgbmVlZAorLy8gdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgbG9va3VwLiAgSG93ZXZlciBpdCBkb2VzIG5lZWQgdG8gb2NjdXIgaW4gYSBmdW5jdGlvbgorLy8gdGhhdCBjYW5ub3QgYmUgc3RyaXBwZWQgZnJvbSB0aGUgYmluYXJ5IChpZS4gaXQgbXVzdCBiZSByZWFjaGFibGUgZnJvbSBtYWluKS4KKy8vCisvLyBCZXN0IHByYWN0aWNlIGlzIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB3aGVyZSB0aGUKKy8vIHJlZmxlY3Rpb24gaXMgYWN0dWFsbHkgbmVlZGVkLiAgVGhpcyBmdW5jdGlvbiBpcyB2ZXJ5IGNoZWFwIHRvIGNhbGwsIHNvIHlvdQorLy8gc2hvdWxkIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IGl0cyBydW50aW1lIG92ZXJoZWFkIGV4Y2VwdCBpbiB0aWdodCBsb29wcyAob24KKy8vIHg4Ni02NCBpdCBjb21waWxlcyBpbnRvIHR3byAibW92IiBpbnN0cnVjdGlvbnMpLgordGVtcGxhdGUgPHR5cGVuYW1lIEV4dGVuZGVlVHlwZSwgdHlwZW5hbWUgVHlwZVRyYWl0c1R5cGUsCisgICAgICAgICAgaW50ZXJuYWw6OkZpZWxkVHlwZSBmaWVsZF90eXBlLCBib29sIGlzX3BhY2tlZD4KK3ZvaWQgTGlua0V4dGVuc2lvblJlZmxlY3Rpb24oCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8CisgICAgICAgIEV4dGVuZGVlVHlwZSwgVHlwZVRyYWl0c1R5cGUsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZD4mIGV4dGVuc2lvbikgeworICBpbnRlcm5hbDo6U3Ryb25nUmVmZXJlbmNlKGV4dGVuc2lvbik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fU0VUX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2hlYXZ5LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2hlYXZ5LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmI5NDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaGVhdnkuY2MKQEAgLTAsMCArMSw0NDAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBDb250YWlucyBtZXRob2RzIGRlZmluZWQgaW4gZXh0ZW5zaW9uX3NldC5oIHdoaWNoIGNhbm5vdCBiZSBwYXJ0IG9mIHRoZQorLy8gbGl0ZSBsaWJyYXJ5IGJlY2F1c2UgdGhleSB1c2UgZGVzY3JpcHRvcnMgb3IgcmVmbGVjdGlvbi4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF9pbmwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcGFyc2VfY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEltcGxlbWVudGF0aW9uIG9mIEV4dGVuc2lvbkZpbmRlciB3aGljaCBmaW5kcyBleHRlbnNpb25zIGluIGEgZ2l2ZW4KKy8vIERlc2NyaXB0b3JQb29sLCB1c2luZyB0aGUgZ2l2ZW4gTWVzc2FnZUZhY3RvcnkgdG8gY29uc3RydWN0IHN1Yi1vYmplY3RzLgorLy8gVGhpcyBjbGFzcyBpcyBpbXBsZW1lbnRlZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgorY2xhc3MgRGVzY3JpcHRvclBvb2xFeHRlbnNpb25GaW5kZXIgeworIHB1YmxpYzoKKyAgRGVzY3JpcHRvclBvb2xFeHRlbnNpb25GaW5kZXIoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUpCisgICAgICA6IHBvb2xfKHBvb2wpLCBmYWN0b3J5XyhmYWN0b3J5KSwgY29udGFpbmluZ190eXBlXyhjb250YWluaW5nX3R5cGUpIHt9CisKKyAgYm9vbCBGaW5kKGludCBudW1iZXIsIEV4dGVuc2lvbkluZm8qIG91dHB1dCk7CisKKyBwcml2YXRlOgorICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbF87CisgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5XzsKKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlXzsKK307CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpBcHBlbmRUb0xpc3QoCisgICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlLCBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogb3V0cHV0KSBjb25zdCB7CisgIEZvckVhY2goW2NvbnRhaW5pbmdfdHlwZSwgcG9vbCwgJm91dHB1dF0oaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uJiBleHQpIHsKKyAgICBib29sIGhhcyA9IGZhbHNlOworICAgIGlmIChleHQuaXNfcmVwZWF0ZWQpIHsKKyAgICAgIGhhcyA9IGV4dC5HZXRTaXplKCkgPiAwOworICAgIH0gZWxzZSB7CisgICAgICBoYXMgPSAhZXh0LmlzX2NsZWFyZWQ7CisgICAgfQorCisgICAgaWYgKGhhcykgeworICAgICAgLy8gVE9ETyhrZW50b24pOiBMb29raW5nIHVwIGVhY2ggZmllbGQgYnkgbnVtYmVyIGlzIHNvbWV3aGF0IHVuZm9ydHVuYXRlLgorICAgICAgLy8gICBJcyB0aGVyZSBhIGJldHRlciB3YXk/ICBUaGUgcHJvYmxlbSBpcyB0aGF0IGRlc2NyaXB0b3JzIGFyZSBsYXppbHktCisgICAgICAvLyAgIGluaXRpYWxpemVkLCBzbyB0aGV5IG1pZ2h0IG5vdCBldmVuIGJlIGNvbnN0cnVjdGVkIHVudGlsCisgICAgICAvLyAgIEFwcGVuZFRvTGlzdCgpIGlzIGNhbGxlZC4KKworICAgICAgaWYgKGV4dC5kZXNjcmlwdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgb3V0cHV0LT5wdXNoX2JhY2socG9vbC0+RmluZEV4dGVuc2lvbkJ5TnVtYmVyKGNvbnRhaW5pbmdfdHlwZSwgbnVtYmVyKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhleHQuZGVzY3JpcHRvcik7CisgICAgICB9CisgICAgfQorICB9KTsKK30KKworaW5saW5lIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSByZWFsX3R5cGUoRmllbGRUeXBlIHR5cGUpIHsKKyAgR09PR0xFX0RDSEVDSyh0eXBlID4gMCAmJiB0eXBlIDw9IEZpZWxkRGVzY3JpcHRvcjo6TUFYX1RZUEUpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yOjpUeXBlPih0eXBlKTsKK30KKworaW5saW5lIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHBfdHlwZShGaWVsZFR5cGUgdHlwZSkgeworICByZXR1cm4gRmllbGREZXNjcmlwdG9yOjpUeXBlVG9DcHBUeXBlKAorICAgICAgc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yOjpUeXBlPih0eXBlKSk7Cit9CisKK2lubGluZSBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGZpZWxkX3R5cGUoRmllbGRUeXBlIHR5cGUpIHsKKyAgR09PR0xFX0RDSEVDSyh0eXBlID4gMCAmJiB0eXBlIDw9IFdpcmVGb3JtYXRMaXRlOjpNQVhfRklFTERfVFlQRSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlPih0eXBlKTsKK30KKworI2RlZmluZSBHT09HTEVfRENIRUNLX1RZUEUoRVhURU5TSU9OLCBMQUJFTCwgQ1BQVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHT09HTEVfRENIRUNLX0VRKChFWFRFTlNJT04pLmlzX3JlcGVhdGVkID8gRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMLCBcCisgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OkxBQkVMXyMjTEFCRUwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZSgoRVhURU5TSU9OKS50eXBlKSwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRSkKKworY29uc3QgTWVzc2FnZUxpdGUmIEV4dGVuc2lvblNldDo6R2V0TWVzc2FnZShpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KSBjb25zdCB7CisgIGNvbnN0IEV4dGVuc2lvbiogZXh0ZW5zaW9uID0gRmluZE9yTnVsbChudW1iZXIpOworICBpZiAoZXh0ZW5zaW9uID09IG51bGxwdHIgfHwgZXh0ZW5zaW9uLT5pc19jbGVhcmVkKSB7CisgICAgLy8gTm90IHByZXNlbnQuICBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgcmV0dXJuICpmYWN0b3J5LT5HZXRQcm90b3R5cGUobWVzc2FnZV90eXBlKTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUwsIE1FU1NBR0UpOworICAgIGlmIChleHRlbnNpb24tPmlzX2xhenkpIHsKKyAgICAgIHJldHVybiBleHRlbnNpb24tPmxhenltZXNzYWdlX3ZhbHVlLT5HZXRNZXNzYWdlKAorICAgICAgICAgICpmYWN0b3J5LT5HZXRQcm90b3R5cGUobWVzc2FnZV90eXBlKSwgYXJlbmFfKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICpleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWU7CisgICAgfQorICB9Cit9CisKK01lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6Ok11dGFibGVNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICBpZiAoTWF5YmVOZXdFeHRlbnNpb24oZGVzY3JpcHRvci0+bnVtYmVyKCksIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7CisgICAgZXh0ZW5zaW9uLT50eXBlID0gZGVzY3JpcHRvci0+dHlwZSgpOworICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpOworICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsKKyAgICBleHRlbnNpb24tPmlzX3BhY2tlZCA9IGZhbHNlOworICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBwcm90b3R5cGUgPQorICAgICAgICBmYWN0b3J5LT5HZXRQcm90b3R5cGUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAgIGV4dGVuc2lvbi0+aXNfbGF6eSA9IGZhbHNlOworICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9IHByb3RvdHlwZS0+TmV3KGFyZW5hXyk7CisgICAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7CisgICAgcmV0dXJuIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUwsIE1FU1NBR0UpOworICAgIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOworICAgIGlmIChleHRlbnNpb24tPmlzX2xhenkpIHsKKyAgICAgIHJldHVybiBleHRlbnNpb24tPmxhenltZXNzYWdlX3ZhbHVlLT5NdXRhYmxlTWVzc2FnZSgKKyAgICAgICAgICAqZmFjdG9yeS0+R2V0UHJvdG90eXBlKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpKSwgYXJlbmFfKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKKyAgICB9CisgIH0KK30KKworTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6UmVsZWFzZU1lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb24gPSBGaW5kT3JOdWxsKGRlc2NyaXB0b3ItPm51bWJlcigpKTsKKyAgaWYgKGV4dGVuc2lvbiA9PSBudWxscHRyKSB7CisgICAgLy8gTm90IHByZXNlbnQuICBSZXR1cm4gbnVsbHB0ci4KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUwsIE1FU1NBR0UpOworICAgIE1lc3NhZ2VMaXRlKiByZXQgPSBudWxscHRyOworICAgIGlmIChleHRlbnNpb24tPmlzX2xhenkpIHsKKyAgICAgIHJldCA9IGV4dGVuc2lvbi0+bGF6eW1lc3NhZ2VfdmFsdWUtPlJlbGVhc2VNZXNzYWdlKAorICAgICAgICAgICpmYWN0b3J5LT5HZXRQcm90b3R5cGUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpLCBhcmVuYV8pOworICAgICAgaWYgKGFyZW5hXyA9PSBudWxscHRyKSB7CisgICAgICAgIGRlbGV0ZSBleHRlbnNpb24tPmxhenltZXNzYWdlX3ZhbHVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoYXJlbmFfICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0ID0gZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlLT5OZXcoKTsKKyAgICAgICAgcmV0LT5DaGVja1R5cGVBbmRNZXJnZUZyb20oKmV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWU7CisgICAgICB9CisgICAgfQorICAgIEVyYXNlKGRlc2NyaXB0b3ItPm51bWJlcigpKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKK01lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6OlVuc2FmZUFyZW5hUmVsZWFzZU1lc3NhZ2UoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgeworICBFeHRlbnNpb24qIGV4dGVuc2lvbiA9IEZpbmRPck51bGwoZGVzY3JpcHRvci0+bnVtYmVyKCkpOworICBpZiAoZXh0ZW5zaW9uID09IG51bGxwdHIpIHsKKyAgICAvLyBOb3QgcHJlc2VudC4gIFJldHVybiBudWxscHRyLgorICAgIHJldHVybiBudWxscHRyOworICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBPUFRJT05BTCwgTUVTU0FHRSk7CisgICAgTWVzc2FnZUxpdGUqIHJldCA9IG51bGxwdHI7CisgICAgaWYgKGV4dGVuc2lvbi0+aXNfbGF6eSkgeworICAgICAgcmV0ID0gZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+VW5zYWZlQXJlbmFSZWxlYXNlTWVzc2FnZSgKKyAgICAgICAgICAqZmFjdG9yeS0+R2V0UHJvdG90eXBlKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpKSwgYXJlbmFfKTsKKyAgICAgIGlmIChhcmVuYV8gPT0gbnVsbHB0cikgeworICAgICAgICBkZWxldGUgZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlOworICAgIH0KKyAgICBFcmFzZShkZXNjcmlwdG9yLT5udW1iZXIoKSk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorfQorCitFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbiogRXh0ZW5zaW9uU2V0OjpNYXliZU5ld1JlcGVhdGVkRXh0ZW5zaW9uKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBFeHRlbnNpb24qIGV4dGVuc2lvbjsKKyAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKGRlc2NyaXB0b3ItPm51bWJlcigpLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgeworICAgIGV4dGVuc2lvbi0+dHlwZSA9IGRlc2NyaXB0b3ItPnR5cGUoKTsKKyAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKTsKKyAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKKyAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPiA+KGFyZW5hXyk7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIFJFUEVBVEVELCBNRVNTQUdFKTsKKyAgfQorICByZXR1cm4gZXh0ZW5zaW9uOworfQorCitNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpBZGRNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb24gPSBNYXliZU5ld1JlcGVhdGVkRXh0ZW5zaW9uKGRlc2NyaXB0b3IpOworCisgIC8vIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4gZG9lcyBub3Qga25vdyBob3cgdG8gQWRkKCkgc2luY2UgaXQgY2Fubm90CisgIC8vIGFsbG9jYXRlIGFuIGFic3RyYWN0IG9iamVjdCwgc28gd2UgaGF2ZSB0byBiZSB0cmlja3kuCisgIE1lc3NhZ2VMaXRlKiByZXN1bHQgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZEJhc2UqPigKKyAgICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUpCisgICAgICAgICAgLT5BZGRGcm9tQ2xlYXJlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZUxpdGU+ID4oKTsKKyAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgY29uc3QgTWVzc2FnZUxpdGUqIHByb3RvdHlwZTsKKyAgICBpZiAoZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5lbXB0eSgpKSB7CisgICAgICBwcm90b3R5cGUgPSBmYWN0b3J5LT5HZXRQcm90b3R5cGUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAgICAgR09PR0xFX0NIRUNLKHByb3RvdHlwZSAhPSBudWxscHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdG90eXBlID0gJmV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+R2V0KDApOworICAgIH0KKyAgICByZXN1bHQgPSBwcm90b3R5cGUtPk5ldyhhcmVuYV8pOworICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+QWRkQWxsb2NhdGVkKHJlc3VsdCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBFeHRlbnNpb25TZXQ6OkFkZEFsbG9jYXRlZE1lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG5ld19lbnRyeSkgeworICBFeHRlbnNpb24qIGV4dGVuc2lvbiA9IE1heWJlTmV3UmVwZWF0ZWRFeHRlbnNpb24oZGVzY3JpcHRvcik7CisKKyAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5BZGRBbGxvY2F0ZWQobmV3X2VudHJ5KTsKK30KKwordm9pZCBFeHRlbnNpb25TZXQ6OlVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkTWVzc2FnZSgKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIE1lc3NhZ2VMaXRlKiBuZXdfZW50cnkpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb24gPSBNYXliZU5ld1JlcGVhdGVkRXh0ZW5zaW9uKGRlc2NyaXB0b3IpOworCisgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+VW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQobmV3X2VudHJ5KTsKK30KKworc3RhdGljIGJvb2wgVmFsaWRhdGVFbnVtVXNpbmdEZXNjcmlwdG9yKGNvbnN0IHZvaWQqIGFyZywgaW50IG51bWJlcikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbnVtRGVzY3JpcHRvcio+KGFyZyktPkZpbmRWYWx1ZUJ5TnVtYmVyKAorICAgICAgICAgICAgIG51bWJlcikgIT0gbnVsbHB0cjsKK30KKworYm9vbCBEZXNjcmlwdG9yUG9vbEV4dGVuc2lvbkZpbmRlcjo6RmluZChpbnQgbnVtYmVyLCBFeHRlbnNpb25JbmZvKiBvdXRwdXQpIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24gPQorICAgICAgcG9vbF8tPkZpbmRFeHRlbnNpb25CeU51bWJlcihjb250YWluaW5nX3R5cGVfLCBudW1iZXIpOworICBpZiAoZXh0ZW5zaW9uID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgb3V0cHV0LT50eXBlID0gZXh0ZW5zaW9uLT50eXBlKCk7CisgICAgb3V0cHV0LT5pc19yZXBlYXRlZCA9IGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQoKTsKKyAgICBvdXRwdXQtPmlzX3BhY2tlZCA9IGV4dGVuc2lvbi0+b3B0aW9ucygpLnBhY2tlZCgpOworICAgIG91dHB1dC0+ZGVzY3JpcHRvciA9IGV4dGVuc2lvbjsKKyAgICBpZiAoZXh0ZW5zaW9uLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBvdXRwdXQtPm1lc3NhZ2VfaW5mby5wcm90b3R5cGUgPQorICAgICAgICAgIGZhY3RvcnlfLT5HZXRQcm90b3R5cGUoZXh0ZW5zaW9uLT5tZXNzYWdlX3R5cGUoKSk7CisgICAgICBHT09HTEVfQ0hFQ0sob3V0cHV0LT5tZXNzYWdlX2luZm8ucHJvdG90eXBlICE9IG51bGxwdHIpCisgICAgICAgICAgPDwgIkV4dGVuc2lvbiBmYWN0b3J5J3MgR2V0UHJvdG90eXBlKCkgcmV0dXJuZWQgbnVsbHB0cjsgZXh0ZW5zaW9uOiAiCisgICAgICAgICAgPDwgZXh0ZW5zaW9uLT5mdWxsX25hbWUoKTsKKyAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbi0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTSkgeworICAgICAgb3V0cHV0LT5lbnVtX3ZhbGlkaXR5X2NoZWNrLmZ1bmMgPSBWYWxpZGF0ZUVudW1Vc2luZ0Rlc2NyaXB0b3I7CisgICAgICBvdXRwdXQtPmVudW1fdmFsaWRpdHlfY2hlY2suYXJnID0gZXh0ZW5zaW9uLT5lbnVtX3R5cGUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCisKK2Jvb2wgRXh0ZW5zaW9uU2V0OjpGaW5kRXh0ZW5zaW9uKGludCB3aXJlX3R5cGUsIHVpbnQzMl90IGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uSW5mbyogZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FzX3BhY2tlZF9vbl93aXJlKSB7CisgIGlmIChjdHgtPmRhdGEoKS5wb29sID09IG51bGxwdHIpIHsKKyAgICBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXIgZmluZGVyKGNvbnRhaW5pbmdfdHlwZSk7CisgICAgaWYgKCFGaW5kRXh0ZW5zaW9uSW5mb0Zyb21GaWVsZE51bWJlcih3aXJlX3R5cGUsIGZpZWxkLCAmZmluZGVyLCBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNfcGFja2VkX29uX3dpcmUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIERlc2NyaXB0b3JQb29sRXh0ZW5zaW9uRmluZGVyIGZpbmRlcihjdHgtPmRhdGEoKS5wb29sLCBjdHgtPmRhdGEoKS5mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGUtPkdldERlc2NyaXB0b3IoKSk7CisgICAgaWYgKCFGaW5kRXh0ZW5zaW9uSW5mb0Zyb21GaWVsZE51bWJlcih3aXJlX3R5cGUsIGZpZWxkLCAmZmluZGVyLCBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNfcGFja2VkX29uX3dpcmUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBjaGFyKiBFeHRlbnNpb25TZXQ6OlBhcnNlRmllbGQodWludDY0X3QgdGFnLCBjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhKiBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyAgaW50IG51bWJlciA9IHRhZyA+PiAzOworICBib29sIHdhc19wYWNrZWRfb25fd2lyZTsKKyAgRXh0ZW5zaW9uSW5mbyBleHRlbnNpb247CisgIGlmICghRmluZEV4dGVuc2lvbih0YWcgJiA3LCBudW1iZXIsIGNvbnRhaW5pbmdfdHlwZSwgY3R4LCAmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgJndhc19wYWNrZWRfb25fd2lyZSkpIHsKKyAgICByZXR1cm4gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywgbWV0YWRhdGEtPm11dGFibGVfdW5rbm93bl9maWVsZHM8VW5rbm93bkZpZWxkU2V0PigpLCBwdHIsIGN0eCk7CisgIH0KKyAgcmV0dXJuIFBhcnNlRmllbGRXaXRoRXh0ZW5zaW9uSW5mbzxVbmtub3duRmllbGRTZXQ+KAorICAgICAgbnVtYmVyLCB3YXNfcGFja2VkX29uX3dpcmUsIGV4dGVuc2lvbiwgbWV0YWRhdGEsIHB0ciwgY3R4KTsKK30KKworY29uc3QgY2hhciogRXh0ZW5zaW9uU2V0OjpQYXJzZUZpZWxkTWF5YmVMYXppbHkoCisgICAgdWludDY0X3QgdGFnLCBjb25zdCBjaGFyKiBwdHIsIGNvbnN0IE1lc3NhZ2UqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICBpbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YSogbWV0YWRhdGEsIGludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgeworICByZXR1cm4gUGFyc2VGaWVsZCh0YWcsIHB0ciwgY29udGFpbmluZ190eXBlLCBtZXRhZGF0YSwgY3R4KTsKK30KKworY29uc3QgY2hhciogRXh0ZW5zaW9uU2V0OjpQYXJzZU1lc3NhZ2VTZXRJdGVtKAorICAgIGNvbnN0IGNoYXIqIHB0ciwgY29uc3QgTWVzc2FnZSogY29udGFpbmluZ190eXBlLAorICAgIGludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhKiBtZXRhZGF0YSwgaW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSB7CisgIHJldHVybiBQYXJzZU1lc3NhZ2VTZXRJdGVtVG1wbDxNZXNzYWdlLCBVbmtub3duRmllbGRTZXQ+KHB0ciwgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSwgY3R4KTsKK30KKworaW50IEV4dGVuc2lvblNldDo6U3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGNvbnN0IHsKKyAgcmV0dXJuIGludGVybmFsOjpGcm9tSW50U2l6ZShTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZygpKTsKK30KKworc2l6ZV90IEV4dGVuc2lvblNldDo6U3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKSBjb25zdCB7CisgIHNpemVfdCB0b3RhbF9zaXplID0KKyAgICAgIChpc19sYXJnZSgpID8gbWFwXy5sYXJnZS0+c2l6ZSgpIDogZmxhdF9jYXBhY2l0eV8pICogc2l6ZW9mKEtleVZhbHVlKTsKKyAgRm9yRWFjaChbJnRvdGFsX3NpemVdKGludCAvKiBudW1iZXIgKi8sIGNvbnN0IEV4dGVuc2lvbiYgZXh0KSB7CisgICAgdG90YWxfc2l6ZSArPSBleHQuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKTsKKyAgfSk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCitpbmxpbmUgc2l6ZV90IEV4dGVuc2lvblNldDo6UmVwZWF0ZWRNZXNzYWdlX1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKAorICAgIFJlcGVhdGVkUHRyRmllbGRCYXNlKiBmaWVsZCkgeworICByZXR1cm4gZmllbGQtPlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KCk7Cit9CisKK3NpemVfdCBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6U3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKSBjb25zdCB7CisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKyAgaWYgKGlzX3JlcGVhdGVkKSB7CisgICAgc3dpdGNoIChjcHBfdHlwZSh0eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvdGFsX3NpemUgKz0gc2l6ZW9mKCpyZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlKSArICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+U3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKTsgXAorICAgIGJyZWFrCisKKyAgICAgIEhBTkRMRV9UWVBFKElOVDMyLCBpbnQzMl90KTsKKyAgICAgIEhBTkRMRV9UWVBFKElOVDY0LCBpbnQ2NF90KTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgdWludDMyX3QpOworICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjRfdCk7CisgICAgICBIQU5ETEVfVFlQRShGTE9BVCwgZmxvYXQpOworICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOworICAgICAgSEFORExFX1RZUEUoQk9PTCwgYm9vbCk7CisgICAgICBIQU5ETEVfVFlQRShFTlVNLCBlbnVtKTsKKyAgICAgIEhBTkRMRV9UWVBFKFNUUklORywgc3RyaW5nKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICAvLyByZXBlYXRlZF9tZXNzYWdlX3ZhbHVlIGlzIGFjdHVhbGx5IGEgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4sCisgICAgICAgIC8vIGJ1dCBNZXNzYWdlTGl0ZSBoYXMgbm8gU3BhY2VVc2VkTG9uZygpLCBzbyB3ZSBtdXN0IGRpcmVjdGx5IGNhbGwKKyAgICAgICAgLy8gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKCkgd2l0aCBhIGRpZmZlcmVudAorICAgICAgICAvLyB0eXBlIGhhbmRsZXIuCisgICAgICAgIHRvdGFsX3NpemUgKz0gc2l6ZW9mKCpyZXBlYXRlZF9tZXNzYWdlX3ZhbHVlKSArCisgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRNZXNzYWdlX1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludGVybmFsOjpSZXBlYXRlZFB0ckZpZWxkQmFzZSo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfbWVzc2FnZV92YWx1ZSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChjcHBfdHlwZSh0eXBlKSkgeworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICB0b3RhbF9zaXplICs9IHNpemVvZigqc3RyaW5nX3ZhbHVlKSArCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKnN0cmluZ192YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgaWYgKGlzX2xhenkpIHsKKyAgICAgICAgICB0b3RhbF9zaXplICs9IGxhenltZXNzYWdlX3ZhbHVlLT5TcGFjZVVzZWRMb25nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdG90YWxfc2l6ZSArPSBkb3duX2Nhc3Q8TWVzc2FnZSo+KG1lc3NhZ2VfdmFsdWUpLT5TcGFjZVVzZWRMb25nKCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAvLyBObyBleHRyYSBzdG9yYWdlIGNvc3RzIGZvciBwcmltaXRpdmUgdHlwZXMuCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordWludDhfdCogRXh0ZW5zaW9uU2V0OjpTZXJpYWxpemVNZXNzYWdlU2V0V2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICBjb25zdCBNZXNzYWdlTGl0ZSogZXh0ZW5kZWUsIHVpbnQ4X3QqIHRhcmdldCkgY29uc3QgeworICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSBzdHJlYW0oCisgICAgICB0YXJnZXQsIE1lc3NhZ2VTZXRCeXRlU2l6ZSgpLAorICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpJc0RlZmF1bHRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYygpKTsKKyAgcmV0dXJuIEludGVybmFsU2VyaWFsaXplTWVzc2FnZVNldFdpdGhDYWNoZWRTaXplc1RvQXJyYXkoZXh0ZW5kZWUsIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaW5sLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaW5sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlNzExNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF9pbmwuaApAQCAtMCwwICsxLDI4NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9TRVRfSU5MX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX1NFVF9JTkxfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BhcnNlX2NvbnRleHQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citjb25zdCBjaGFyKiBFeHRlbnNpb25TZXQ6OlBhcnNlRmllbGRXaXRoRXh0ZW5zaW9uSW5mbygKKyAgICBpbnQgbnVtYmVyLCBib29sIHdhc19wYWNrZWRfb25fd2lyZSwgY29uc3QgRXh0ZW5zaW9uSW5mbyYgZXh0ZW5zaW9uLAorICAgIEludGVybmFsTWV0YWRhdGEqIG1ldGFkYXRhLCBjb25zdCBjaGFyKiBwdHIsIGludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgeworICBpZiAod2FzX3BhY2tlZF9vbl93aXJlKSB7CisgICAgc3dpdGNoIChleHRlbnNpb24udHlwZSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENQUF9DQU1FTENBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gaW50ZXJuYWw6OlBhY2tlZCMjQ1BQX0NBTUVMQ0FTRSMjUGFyc2VyKCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChudW1iZXIsIGV4dGVuc2lvbi50eXBlLCBleHRlbnNpb24uaXNfcGFja2VkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yKSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHRyLCBjdHgpOworICAgICAgSEFORExFX1RZUEUoSU5UMzIsIEludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKElOVDY0LCBJbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIFVJbnQzMik7CisgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIFVJbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRShTSU5UMzIsIFNJbnQzMik7CisgICAgICBIQU5ETEVfVFlQRShTSU5UNjQsIFNJbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRShGSVhFRDMyLCBGaXhlZDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKEZJWEVENjQsIEZpeGVkNjQpOworICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsIFNGaXhlZDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCBTRml4ZWQ2NCk7CisgICAgICBIQU5ETEVfVFlQRShGTE9BVCwgRmxvYXQpOworICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBEb3VibGUpOworICAgICAgSEFORExFX1RZUEUoQk9PTCwgQm9vbCk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNOgorICAgICAgICByZXR1cm4gaW50ZXJuYWw6OlBhY2tlZEVudW1QYXJzZXJBcmc8VD4oCisgICAgICAgICAgICBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChudW1iZXIsIGV4dGVuc2lvbi50eXBlLCBleHRlbnNpb24uaXNfcGFja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpLAorICAgICAgICAgICAgcHRyLCBjdHgsIGV4dGVuc2lvbi5lbnVtX3ZhbGlkaXR5X2NoZWNrLmZ1bmMsCisgICAgICAgICAgICBleHRlbnNpb24uZW51bV92YWxpZGl0eV9jaGVjay5hcmcsIG1ldGFkYXRhLCBudW1iZXIpOworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TVFJJTkc6CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JZVEVTOgorICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUDoKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRToKKyAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk5vbi1wcmltaXRpdmUgdHlwZXMgY2FuJ3QgYmUgcGFja2VkLiI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGV4dGVuc2lvbi50eXBlKSB7CisjZGVmaW5lIEhBTkRMRV9WQVJJTlRfVFlQRShVUFBFUkNBU0UsIENQUF9DQU1FTENBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHRyID0gVmFyaW50UGFyc2UocHRyLCAmdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPT0dMRV9QUk9UT0JVRl9QQVJTRVJfQVNTRVJUKHB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChleHRlbnNpb24uaXNfcmVwZWF0ZWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFkZCMjQ1BQX0NBTUVMQ0FTRShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmlzX3BhY2tlZCwgdmFsdWUsIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNldCMjQ1BQX0NBTUVMQ0FTRShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFLCB2YWx1ZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBicmVhaworCisgICAgICBIQU5ETEVfVkFSSU5UX1RZUEUoSU5UMzIsIEludDMyKTsKKyAgICAgIEhBTkRMRV9WQVJJTlRfVFlQRShJTlQ2NCwgSW50NjQpOworICAgICAgSEFORExFX1ZBUklOVF9UWVBFKFVJTlQzMiwgVUludDMyKTsKKyAgICAgIEhBTkRMRV9WQVJJTlRfVFlQRShVSU5UNjQsIFVJbnQ2NCk7CisgICAgICBIQU5ETEVfVkFSSU5UX1RZUEUoQk9PTCwgQm9vbCk7CisjdW5kZWYgSEFORExFX1ZBUklOVF9UWVBFCisjZGVmaW5lIEhBTkRMRV9TVkFSSU5UX1RZUEUoVVBQRVJDQVNFLCBDUFBfQ0FNRUxDQVNFLCBTSVpFKSAgICAgICAgICAgICAgICAgXAorICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHRyID0gVmFyaW50UGFyc2UocHRyLCAmdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPT0dMRV9QUk9UT0JVRl9QQVJTRVJfQVNTRVJUKHB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF1dG8gdmFsdWUgPSBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRGVjb2RlIyNTSVpFKHZhbCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZXh0ZW5zaW9uLmlzX3JlcGVhdGVkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBZGQjI0NQUF9DQU1FTENBU0UobnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5pc19wYWNrZWQsIHZhbHVlLCBleHRlbnNpb24uZGVzY3JpcHRvcik7IFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBTZXQjI0NQUF9DQU1FTENBU0UobnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRSwgdmFsdWUsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gYnJlYWsKKworICAgICAgSEFORExFX1NWQVJJTlRfVFlQRShTSU5UMzIsIEludDMyLCAzMik7CisgICAgICBIQU5ETEVfU1ZBUklOVF9UWVBFKFNJTlQ2NCwgSW50NjQsIDY0KTsKKyN1bmRlZiBIQU5ETEVfU1ZBUklOVF9UWVBFCisjZGVmaW5lIEhBTkRMRV9GSVhFRF9UWVBFKFVQUEVSQ0FTRSwgQ1BQX0NBTUVMQ0FTRSwgQ1BQVFlQRSkgICAgICAgICAgICAgICAgXAorICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdXRvIHZhbHVlID0gVW5hbGlnbmVkTG9hZDxDUFBUWVBFPihwdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHRyICs9IHNpemVvZihDUFBUWVBFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChleHRlbnNpb24uaXNfcmVwZWF0ZWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFkZCMjQ1BQX0NBTUVMQ0FTRShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmlzX3BhY2tlZCwgdmFsdWUsIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNldCMjQ1BQX0NBTUVMQ0FTRShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFLCB2YWx1ZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBicmVhaworCisgICAgICBIQU5ETEVfRklYRURfVFlQRShGSVhFRDMyLCBVSW50MzIsIHVpbnQzMl90KTsKKyAgICAgIEhBTkRMRV9GSVhFRF9UWVBFKEZJWEVENjQsIFVJbnQ2NCwgdWludDY0X3QpOworICAgICAgSEFORExFX0ZJWEVEX1RZUEUoU0ZJWEVEMzIsIEludDMyLCBpbnQzMl90KTsKKyAgICAgIEhBTkRMRV9GSVhFRF9UWVBFKFNGSVhFRDY0LCBJbnQ2NCwgaW50NjRfdCk7CisgICAgICBIQU5ETEVfRklYRURfVFlQRShGTE9BVCwgRmxvYXQsIGZsb2F0KTsKKyAgICAgIEhBTkRMRV9GSVhFRF9UWVBFKERPVUJMRSwgRG91YmxlLCBkb3VibGUpOworI3VuZGVmIEhBTkRMRV9GSVhFRF9UWVBFCisKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTTogeworICAgICAgICB1aW50NjRfdCB2YWw7CisgICAgICAgIHB0ciA9IFZhcmludFBhcnNlKHB0ciwgJnZhbCk7CisgICAgICAgIEdPT0dMRV9QUk9UT0JVRl9QQVJTRVJfQVNTRVJUKHB0cik7CisgICAgICAgIGludCB2YWx1ZSA9IHZhbDsKKworICAgICAgICBpZiAoIWV4dGVuc2lvbi5lbnVtX3ZhbGlkaXR5X2NoZWNrLmZ1bmMoCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmVudW1fdmFsaWRpdHlfY2hlY2suYXJnLCB2YWx1ZSkpIHsKKyAgICAgICAgICBXcml0ZVZhcmludChudW1iZXIsIHZhbCwgbWV0YWRhdGEtPm11dGFibGVfdW5rbm93bl9maWVsZHM8VD4oKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uLmlzX3JlcGVhdGVkKSB7CisgICAgICAgICAgQWRkRW51bShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0sIGV4dGVuc2lvbi5pc19wYWNrZWQsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFNldEVudW0obnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CWVRFUzoKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfU1RSSU5HOiB7CisgICAgICAgIHN0ZDo6c3RyaW5nKiB2YWx1ZSA9CisgICAgICAgICAgICBleHRlbnNpb24uaXNfcmVwZWF0ZWQKKyAgICAgICAgICAgICAgICA/IEFkZFN0cmluZyhudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcikKKyAgICAgICAgICAgICAgICA6IE11dGFibGVTdHJpbmcobnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKKyAgICAgICAgaW50IHNpemUgPSBSZWFkU2l6ZSgmcHRyKTsKKyAgICAgICAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgICAgICAgcmV0dXJuIGN0eC0+UmVhZFN0cmluZyhwdHIsIHNpemUsIHZhbHVlKTsKKyAgICAgIH0KKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUDogeworICAgICAgICBNZXNzYWdlTGl0ZSogdmFsdWUgPQorICAgICAgICAgICAgZXh0ZW5zaW9uLmlzX3JlcGVhdGVkCisgICAgICAgICAgICAgICAgPyBBZGRNZXNzYWdlKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfR1JPVVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleHRlbnNpb24ubWVzc2FnZV9pbmZvLnByb3RvdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgOiBNdXRhYmxlTWVzc2FnZShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0dST1VQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVuc2lvbi5tZXNzYWdlX2luZm8ucHJvdG90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgICAgICB1aW50MzJfdCB0YWcgPSAobnVtYmVyIDw8IDMpICsgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQOworICAgICAgICByZXR1cm4gY3R4LT5QYXJzZUdyb3VwKHZhbHVlLCBwdHIsIHRhZyk7CisgICAgICB9CisKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRTogeworICAgICAgICBNZXNzYWdlTGl0ZSogdmFsdWUgPQorICAgICAgICAgICAgZXh0ZW5zaW9uLmlzX3JlcGVhdGVkCisgICAgICAgICAgICAgICAgPyBBZGRNZXNzYWdlKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVuc2lvbi5tZXNzYWdlX2luZm8ucHJvdG90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcikKKyAgICAgICAgICAgICAgICA6IE11dGFibGVNZXNzYWdlKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleHRlbnNpb24ubWVzc2FnZV9pbmZvLnByb3RvdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKKyAgICAgICAgcmV0dXJuIGN0eC0+UGFyc2VNZXNzYWdlKHZhbHVlLCBwdHIpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcHRyOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTXNnLCB0eXBlbmFtZSBUPgorY29uc3QgY2hhciogRXh0ZW5zaW9uU2V0OjpQYXJzZU1lc3NhZ2VTZXRJdGVtVG1wbCgKKyAgICBjb25zdCBjaGFyKiBwdHIsIGNvbnN0IE1zZyogZXh0ZW5kZWUsIGludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhKiBtZXRhZGF0YSwKKyAgICBpbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyAgc3RkOjpzdHJpbmcgcGF5bG9hZDsKKyAgdWludDMyX3QgdHlwZV9pZDsKKyAgZW51bSBjbGFzcyBTdGF0ZSB7IGtOb1RhZywga0hhc1R5cGUsIGtIYXNQYXlsb2FkLCBrRG9uZSB9OworICBTdGF0ZSBzdGF0ZSA9IFN0YXRlOjprTm9UYWc7CisKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWcgPSBzdGF0aWNfY2FzdDx1aW50OF90PigqcHRyKyspOworICAgIGlmICh0YWcgPT0gV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0VHlwZUlkVGFnKSB7CisgICAgICB1aW50NjRfdCB0bXA7CisgICAgICBwdHIgPSBQYXJzZUJpZ1ZhcmludChwdHIsICZ0bXApOworICAgICAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZTo6a05vVGFnKSB7CisgICAgICAgIHR5cGVfaWQgPSB0bXA7CisgICAgICAgIHN0YXRlID0gU3RhdGU6OmtIYXNUeXBlOworICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBTdGF0ZTo6a0hhc1BheWxvYWQpIHsKKyAgICAgICAgdHlwZV9pZCA9IHRtcDsKKyAgICAgICAgRXh0ZW5zaW9uSW5mbyBleHRlbnNpb247CisgICAgICAgIGJvb2wgd2FzX3BhY2tlZF9vbl93aXJlOworICAgICAgICBpZiAoIUZpbmRFeHRlbnNpb24oMiwgdHlwZV9pZCwgZXh0ZW5kZWUsIGN0eCwgJmV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNfcGFja2VkX29uX3dpcmUpKSB7CisgICAgICAgICAgV3JpdGVMZW5ndGhEZWxpbWl0ZWQodHlwZV9pZCwgcGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS0+bXV0YWJsZV91bmtub3duX2ZpZWxkczxUPigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBNZXNzYWdlTGl0ZSogdmFsdWUgPQorICAgICAgICAgICAgICBleHRlbnNpb24uaXNfcmVwZWF0ZWQKKyAgICAgICAgICAgICAgICAgID8gQWRkTWVzc2FnZSh0eXBlX2lkLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleHRlbnNpb24ubWVzc2FnZV9pbmZvLnByb3RvdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcikKKyAgICAgICAgICAgICAgICAgIDogTXV0YWJsZU1lc3NhZ2UodHlwZV9pZCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVuc2lvbi5tZXNzYWdlX2luZm8ucHJvdG90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcik7CisKKyAgICAgICAgICBjb25zdCBjaGFyKiBwOworICAgICAgICAgIC8vIFdlIGNhbid0IHVzZSByZWd1bGFyIHBhcnNlIGZyb20gc3RyaW5nIGFzIHdlIGhhdmUgdG8gdHJhY2sKKyAgICAgICAgICAvLyBwcm9wZXIgcmVjdXJzaW9uIGRlcHRoIGFuZCBkZXNjcmlwdG9yIHBvb2xzLgorICAgICAgICAgIFBhcnNlQ29udGV4dCB0bXBfY3R4KGN0eC0+ZGVwdGgoKSwgZmFsc2UsICZwLCBwYXlsb2FkKTsKKyAgICAgICAgICB0bXBfY3R4LmRhdGEoKS5wb29sID0gY3R4LT5kYXRhKCkucG9vbDsKKyAgICAgICAgICB0bXBfY3R4LmRhdGEoKS5mYWN0b3J5ID0gY3R4LT5kYXRhKCkuZmFjdG9yeTsKKyAgICAgICAgICBHT09HTEVfUFJPVE9CVUZfUEFSU0VSX0FTU0VSVCh2YWx1ZS0+X0ludGVybmFsUGFyc2UocCwgJnRtcF9jdHgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9jdHguRW5kZWRBdExpbWl0KCkpOworICAgICAgICB9CisgICAgICAgIHN0YXRlID0gU3RhdGU6OmtEb25lOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodGFnID09IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VUYWcpIHsKKyAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZTo6a0hhc1R5cGUpIHsKKyAgICAgICAgcHRyID0gUGFyc2VGaWVsZE1heWJlTGF6aWx5KHN0YXRpY19jYXN0PHVpbnQ2NF90Pih0eXBlX2lkKSAqIDggKyAyLCBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZSwgbWV0YWRhdGEsIGN0eCk7CisgICAgICAgIEdPT0dMRV9QUk9UT0JVRl9QQVJTRVJfQVNTRVJUKHB0ciAhPSBudWxscHRyKTsKKyAgICAgICAgc3RhdGUgPSBTdGF0ZTo6a0RvbmU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyB0bXA7CisgICAgICAgIGludDMyX3Qgc2l6ZSA9IFJlYWRTaXplKCZwdHIpOworICAgICAgICBHT09HTEVfUFJPVE9CVUZfUEFSU0VSX0FTU0VSVChwdHIpOworICAgICAgICBwdHIgPSBjdHgtPlJlYWRTdHJpbmcocHRyLCBzaXplLCAmdG1wKTsKKyAgICAgICAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlOjprTm9UYWcpIHsKKyAgICAgICAgICBwYXlsb2FkID0gc3RkOjptb3ZlKHRtcCk7CisgICAgICAgICAgc3RhdGUgPSBTdGF0ZTo6a0hhc1BheWxvYWQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcHRyID0gUmVhZFRhZyhwdHIgLSAxLCAmdGFnKTsKKyAgICAgIGlmICh0YWcgPT0gMCB8fCAodGFnICYgNykgPT0gNCkgeworICAgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgICAgcmV0dXJuIHB0cjsKKyAgICAgIH0KKyAgICAgIHB0ciA9IFBhcnNlRmllbGQodGFnLCBwdHIsIGV4dGVuZGVlLCBtZXRhZGF0YSwgY3R4KTsKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9QQVJTRVJfQVNTRVJUKHB0cik7CisgICAgfQorICB9CisgIHJldHVybiBwdHI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9TRVRfSU5MX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwN2UxMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMzg1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CituYW1lc3BhY2UgeworCit1c2luZyBUZXN0VXRpbDo6RXF1YWxzVG9TZXJpYWxpemVkOworCisvLyBUaGlzIHRlc3QgY2xvc2VseSBtaXJyb3JzIHRoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYworLy8gZXhjZXB0IHRoYXQgaXQgdXNlcyBleHRlbnNpb25zIHJhdGhlciB0aGFuIHJlZ3VsYXIgZmllbGRzLgorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIERlZmF1bHRzKSB7CisgIC8vIENoZWNrIHRoYXQgYWxsIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5IGluIHRoZSBpbml0aWFsIG1lc3NhZ2UuCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworCisgIFRlc3RVdGlsOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZSk7CisKKyAgLy8gTWVzc2FnZXMgc2hvdWxkIHJldHVybiBwb2ludGVycyB0byBkZWZhdWx0IGluc3RhbmNlcyB1bnRpbCBmaXJzdCB1c2UuCisgIC8vIChUaGlzIGlzIG5vdCBjaGVja2VkIGJ5IEV4cGVjdENsZWFyKCkgc2luY2UgaXQgaXMgbm90IGFjdHVhbGx5IHRydWUgYWZ0ZXIKKyAgLy8gdGhlIGZpZWxkcyBoYXZlIGJlZW4gc2V0IGFuZCB0aGVuIGNsZWFyZWQuKQorICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpPcHRpb25hbEdyb3VwX2V4dGVuc2lvbjo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICZ1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoJnVuaXR0ZXN0X2ltcG9ydDo6SW1wb3J0TWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24pKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBBY2Nlc3NvcnMpIHsKKyAgLy8gU2V0IGV2ZXJ5IGZpZWxkIHRvIGEgdW5pcXVlIHZhbHVlIHRoZW4gZ28gYmFjayBhbmQgY2hlY2sgYWxsIHRob3NlCisgIC8vIHZhbHVlcy4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKKworICBUZXN0VXRpbDo6TW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKG1lc3NhZ2UpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIENsZWFyKSB7CisgIC8vIFNldCBldmVyeSBmaWVsZCB0byBhIHVuaXF1ZSB2YWx1ZSwgY2xlYXIgdGhlIG1lc3NhZ2UsIHRoZW4gY2hlY2sgdGhhdAorICAvLyBpdCBpcyBjbGVhcmVkLgorICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlKTsKKworICAvLyBNYWtlIHN1cmUgc2V0dGluZyBzdHVmZiBhZ2FpbiBhZnRlciBjbGVhcmluZyB3b3Jrcy4gIChUaGlzIHRha2VzIHNsaWdodGx5CisgIC8vIGRpZmZlcmVudCBjb2RlIHBhdGhzIHNpbmNlIHRoZSBvYmplY3RzIGFyZSByZXVzZWQuKQorICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIENsZWFyT25lRmllbGQpIHsKKyAgLy8gU2V0IGV2ZXJ5IGZpZWxkIHRvIGEgdW5pcXVlIHZhbHVlLCB0aGVuIGNsZWFyIG9uZSB2YWx1ZSBhbmQgaW5zdXJlIHRoYXQKKyAgLy8gb25seSB0aGF0IG9uZSB2YWx1ZSBpcyBjbGVhcmVkLgorICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgIGludDY0X3Qgb3JpZ2luYWxfdmFsdWUgPQorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbik7CisKKyAgLy8gQ2xlYXIgdGhlIGZpZWxkIGFuZCBtYWtlIHN1cmUgaXQgc2hvd3MgdXAgYXMgY2xlYXJlZC4KKyAgbWVzc2FnZS5DbGVhckV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24pKTsKKworICAvLyBPdGhlciBhZGphY2VudCBmaWVsZHMgc2hvdWxkIG5vdCBiZSBjbGVhcmVkLgorICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uKSk7CisKKyAgLy8gTWFrZSBzdXJlIGlmIHdlIHNldCBpdCBhZ2FpbiwgdGhlbiBhbGwgZmllbGRzIGFyZSBzZXQuCisgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24sIG9yaWdpbmFsX3ZhbHVlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworICAvLyBBZGQgYSBleHRlbnNpb24gdXNpbmcgU2V0QWxsb2NhdGVkRXh0ZW5zaW9uCisgIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSogZm9yZWlnbl9tZXNzYWdlID0gbmV3IHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSgpOworICBtZXNzYWdlLlNldEFsbG9jYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbl9tZXNzYWdlKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoZm9yZWlnbl9tZXNzYWdlLCBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoZm9yZWlnbl9tZXNzYWdlLCAmbWVzc2FnZS5HZXRFeHRlbnNpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworCisgIC8vIFNldEFsbG9jYXRlZEV4dGVuc2lvbiBzaG91bGQgZGVsZXRlIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nIGV4dGVuc2lvbi4KKyAgLy8gKFdlIHJlcGx5IG9uIHVuaXR0ZXN0IHRvIGNoZWNrIG1lbW9yeSBsZWFrcyBmb3IgdGhpcyBjYXNlKQorICBtZXNzYWdlLlNldEFsbG9jYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSgpKTsKKworICAvLyBTZXRBbGxvY2F0ZWRFeHRlbnNpb24gd2l0aCBudWxscHRyIGlzIGVxdWl2YWxlbnQgdG8gQ2xlYXJFeHRlbmlvbi4KKyAgbWVzc2FnZS5TZXRBbGxvY2F0ZWRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFJlbGVhc2VFeHRlbnNpb24pIHsKKyAgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2U7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikpOworICAvLyBBZGQgYSBleHRlbnNpb24gdXNpbmcgU2V0QWxsb2NhdGVkRXh0ZW5zaW9uCisgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEqIGV4dGVuc2lvbiA9CisgICAgICBuZXcgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSgpOworICBtZXNzYWdlLlNldEFsbG9jYXRlZEV4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiwgZXh0ZW5zaW9uKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pKTsKKyAgLy8gUmVsZWFzZSB0aGUgZXh0ZW5zaW9uIHVzaW5nIFJlbGVhc2VFeHRlbnNpb24KKyAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSogcmVsZWFzZWRfZXh0ZW5zaW9uID0KKyAgICAgIG1lc3NhZ2UuUmVsZWFzZUV4dGVuc2lvbigKKyAgICAgICAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pOworICBFWFBFQ1RfRVEoZXh0ZW5zaW9uLCByZWxlYXNlZF9leHRlbnNpb24pOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pKTsKKyAgLy8gUmVsZWFzZUV4dGVuc2lvbiB3aWxsIHJldHVybiB0aGUgdW5kZXJseWluZyBvYmplY3QgZXZlbiBhZnRlcgorICAvLyBDbGVhckV4dGVuc2lvbiBpcyBjYWxsZWQuCisgIG1lc3NhZ2UuU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKAorICAgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uLAorICAgICAgcmVsZWFzZWRfZXh0ZW5zaW9uKTsKKyAgbWVzc2FnZS5DbGVhckV4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbik7CisgIHJlbGVhc2VkX2V4dGVuc2lvbiA9IG1lc3NhZ2UuUmVsZWFzZUV4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbik7CisgIEVYUEVDVF9UUlVFKHJlbGVhc2VkX2V4dGVuc2lvbiAhPSBudWxscHRyKTsKKyAgZGVsZXRlIHJlbGVhc2VkX2V4dGVuc2lvbjsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBBcmVuYVVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkQW5kUmVsZWFzZSkgeworICBBcmVuYSBhcmVuYTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4oJmFyZW5hKTsKKyAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlIGV4dGVuc2lvbjsKKyAgbWVzc2FnZS0+VW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWRFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgJmV4dGVuc2lvbik7CisgIC8vIE5vIGNvcHkgd2hlbiBzZXQuCisgIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSogbXV0YWJsZV9leHRlbnNpb24gPQorICAgICAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbik7CisgIEVYUEVDVF9FUSgmZXh0ZW5zaW9uLCBtdXRhYmxlX2V4dGVuc2lvbik7CisgIC8vIE5vIGNvcHkgd2hlbiB1bnNhZmUgcmVsZWFzZWQuCisgIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSogcmVsZWFzZWRfZXh0ZW5zaW9uID0KKyAgICAgIG1lc3NhZ2UtPlVuc2FmZUFyZW5hUmVsZWFzZUV4dGVuc2lvbigKKyAgICAgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbik7CisgIEVYUEVDVF9FUSgmZXh0ZW5zaW9uLCByZWxlYXNlZF9leHRlbnNpb24pOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLT5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgLy8gU2V0IHRoZSBvd25lcnNoaXAgYmFjayBhbmQgbGV0IHRoZSBkZXN0cnVjdG9ycyBydW4uICBJdCBzaG91bGQgbm90IHRha2UKKyAgLy8gb3duZXJzaGlwLCBzbyB0aGlzIHNob3VsZCBub3QgY3Jhc2guCisgIG1lc3NhZ2UtPlVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKAorICAgICAgdW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sICZleHRlbnNpb24pOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkQW5kUmVsZWFzZSkgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKiBleHRlbnNpb24gPSBuZXcgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKCk7CisgIG1lc3NhZ2UuVW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWRFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgZXh0ZW5zaW9uKTsKKyAgLy8gTm8gY29weSB3aGVuIHNldC4KKyAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKiBtdXRhYmxlX2V4dGVuc2lvbiA9CisgICAgICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pOworICBFWFBFQ1RfRVEoZXh0ZW5zaW9uLCBtdXRhYmxlX2V4dGVuc2lvbik7CisgIC8vIE5vIGNvcHkgd2hlbiB1bnNhZmUgcmVsZWFzZWQuCisgIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSogcmVsZWFzZWRfZXh0ZW5zaW9uID0KKyAgICAgIG1lc3NhZ2UuVW5zYWZlQXJlbmFSZWxlYXNlRXh0ZW5zaW9uKAorICAgICAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKTsKKyAgRVhQRUNUX0VRKGV4dGVuc2lvbiwgcmVsZWFzZWRfZXh0ZW5zaW9uKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgbWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgLy8gU2V0IHRoZSBvd25lcnNoaXAgYmFjayBhbmQgbGV0IHRoZSBkZXN0cnVjdG9ycyBydW4uICBJdCBzaG91bGQgdGFrZQorICAvLyBvd25lcnNoaXAsIHNvIHRoaXMgc2hvdWxkIG5vdCBsZWFrLgorICBtZXNzYWdlLlVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKAorICAgICAgdW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sIGV4dGVuc2lvbik7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgQXJlbmFVbnNhZmVBcmVuYVJlbGVhc2VPZkhlYXBBbGxvYykgeworICBBcmVuYSBhcmVuYTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4oJmFyZW5hKTsKKyAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKiBleHRlbnNpb24gPSBuZXcgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOworICBtZXNzYWdlLT5TZXRBbGxvY2F0ZWRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24pOworICAvLyBUaGUgYXJlbmEgc2hvdWxkIG1haW50YWluIG93bmVyc2hpcCBvZiB0aGUgaGVhcCBhbGxvY2F0ZWQgcHJvdG8gYmVjYXVzZSB3ZQorICAvLyB1c2VkIFVuc2FmZUFyZW5hUmVsZWFzZUV4dGVuc2lvbi4gIFRoZSBsZWFrIGNoZWNrZXIgd2lsbCBlbnN1cmUgdGhpcy4KKyAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKiByZWxlYXNlZF9leHRlbnNpb24gPQorICAgICAgbWVzc2FnZS0+VW5zYWZlQXJlbmFSZWxlYXNlRXh0ZW5zaW9uKAorICAgICAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKTsKKyAgRVhQRUNUX0VRKGV4dGVuc2lvbiwgcmVsZWFzZWRfZXh0ZW5zaW9uKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgbWVzc2FnZS0+SGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7Cit9CisKKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBDb3B5RnJvbSkgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTEsIG1lc3NhZ2UyOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlMSk7CisgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMSk7ICAvLyBleGVyY2lzZSBjb3B5IHdoZW4gZmllbGRzIGFscmVhZHkgZXhpc3QKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIENvcHlGcm9tUGFja2VkKSB7CisgIHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgVGVzdFV0aWw6OlNldFBhY2tlZEV4dGVuc2lvbnMoJm1lc3NhZ2UxKTsKKyAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7CisgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UxKTsgIC8vIGV4ZXJjaXNlIGNvcHkgd2hlbiBmaWVsZHMgYWxyZWFkeSBleGlzdAorICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgQ29weUZyb21VcGNhc3RlZCkgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBjb25zdCBNZXNzYWdlJiB1cGNhc3RlZF9tZXNzYWdlID0gbWVzc2FnZTE7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UxKTsKKyAgbWVzc2FnZTIuQ29weUZyb20odXBjYXN0ZWRfbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKKyAgLy8gZXhlcmNpc2UgY29weSB3aGVuIGZpZWxkcyBhbHJlYWR5IGV4aXN0CisgIG1lc3NhZ2UyLkNvcHlGcm9tKHVwY2FzdGVkX21lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU3dhcFdpdGhFbXB0eSkgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZTEpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlMik7CisgIG1lc3NhZ2UxLlN3YXAoJm1lc3NhZ2UyKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworICBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UxKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTd2FwV2l0aFNlbGYpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKKyAgbWVzc2FnZS5Td2FwKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU3dhcEV4dGVuc2lvbikgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZTEpOworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisKKyAgLy8gU3dhcCBlbXB0eSBmaWVsZHMuCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMoJm1lc3NhZ2UxLCAmbWVzc2FnZTIsIGZpZWxkcyk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlMik7CisKKyAgLy8gU3dhcCB0d28gZXh0ZW5zaW9ucy4KKyAgZmllbGRzLnB1c2hfYmFjayhyZWZsZWN0aW9uLT5GaW5kS25vd25FeHRlbnNpb25CeU51bWJlcigxMikpOworICBmaWVsZHMucHVzaF9iYWNrKHJlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKDI1KSk7CisgIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMoJm1lc3NhZ2UxLCAmbWVzc2FnZTIsIGZpZWxkcyk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTEuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UxLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZTEuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9jb3JkX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlMi5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9jb3JkX2V4dGVuc2lvbikpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFN3YXBFeHRlbnNpb25XaXRoRW1wdHkpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UxOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTI7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMzsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZTMpOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMy5HZXRSZWZsZWN0aW9uKCk7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhtZXNzYWdlMywgJmZpZWxkcyk7CisKKyAgcmVmbGVjdGlvbi0+U3dhcEZpZWxkcygmbWVzc2FnZTEsICZtZXNzYWdlMiwgZmllbGRzKTsKKworICBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlMik7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU3dhcEV4dGVuc2lvbkJvdGhGdWxsKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UyOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlMik7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UxLkdldFJlZmxlY3Rpb24oKTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1lc3NhZ2UxLCAmZmllbGRzKTsKKworICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKCZtZXNzYWdlMSwgJm1lc3NhZ2UyLCBmaWVsZHMpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIEFyZW5hU2V0QWxsRXh0ZW5zaW9uKSB7CisgIEFyZW5hIGFyZW5hMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlMSA9CisgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+KCZhcmVuYTEpOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KCptZXNzYWdlMSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgQXJlbmFDb3B5Q29uc3RydWN0b3IpIHsKKyAgQXJlbmEgYXJlbmExOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UxID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4oJmFyZW5hMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UxKTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UyKCptZXNzYWdlMSk7CisgIGFyZW5hMS5SZXNldCgpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgQXJlbmFNZXJnZUZyb20pIHsKKyAgQXJlbmEgYXJlbmExOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UxID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4oJmFyZW5hMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UxKTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UyOworICBtZXNzYWdlMi5NZXJnZUZyb20oKm1lc3NhZ2UxKTsKKyAgYXJlbmExLlJlc2V0KCk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBBcmVuYU1lcmdlRnJvbVdpdGhDbGVhcmVkRXh0ZW5zaW9ucykgeworICBBcmVuYSBhcmVuYTsKKyAgeworICAgIGF1dG8qIG1lc3NhZ2UxID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmEpOworICAgIGF1dG8qIG1lc3NhZ2UyID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmEpOworCisgICAgLy8gU2V0IGFuIGV4dGVuc2lvbiBhbmQgdGhlbiBjbGVhciBpdAorICAgIG1lc3NhZ2UxLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiwgMSk7CisgICAgbWVzc2FnZTEtPkNsZWFyRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24pOworCisgICAgLy8gU2luY2UgYWxsIGV4dGVuc2lvbnMgaW4gbWVzc2FnZTEgaGF2ZSBiZWVuIGNsZWFyZWQsIHdlIHNob3VsZCBiZSBhYmxlIHRvCisgICAgLy8gbWVyZ2UgaXQgaW50byBtZXNzYWdlMiB3aXRob3V0IGFsbG9jYXRpbmcgYW55IGFkZGl0aW9uYWwgbWVtb3J5LgorICAgIHVpbnQ2NF90IHNwYWNlX3VzZWRfYmVmb3JlX21lcmdlID0gYXJlbmEuU3BhY2VVc2VkKCk7CisgICAgbWVzc2FnZTItPk1lcmdlRnJvbSgqbWVzc2FnZTEpOworICAgIEVYUEVDVF9FUShzcGFjZV91c2VkX2JlZm9yZV9tZXJnZSwgYXJlbmEuU3BhY2VVc2VkKCkpOworICB9CisgIHsKKyAgICAvLyBBcyBtb3JlIGNvbXBsaWNhdGVkIGNhc2UsIGxldCdzIGhhdmUgbWVzc2FnZTEgYW5kIG1lc3NhZ2UyIHNoYXJlIHNvbWUKKyAgICAvLyB1bmNsZWFyZWQgZXh0ZW5zaW9ucyBpbiBjb21tb24uCisgICAgYXV0byogbWVzc2FnZTEgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+KCZhcmVuYSk7CisgICAgYXV0byogbWVzc2FnZTIgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+KCZhcmVuYSk7CisKKyAgICAvLyBTZXQgaW50MzIgYW5kIHVpbnQzMiBvbiBib3RoIG1lc3NhZ2VzLgorICAgIG1lc3NhZ2UxLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiwgMSk7CisgICAgbWVzc2FnZTItPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uLCAyKTsKKyAgICBtZXNzYWdlMS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uLCAxKTsKKyAgICBtZXNzYWdlMi0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uLCAyKTsKKworICAgIC8vIFNldCBhbmQgY2xlYXIgaW50NjQgYW5kIHVpbnQ2NCBvbiBtZXNzYWdlMS4KKyAgICBtZXNzYWdlMS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24sIDApOworICAgIG1lc3NhZ2UxLT5DbGVhckV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uKTsKKyAgICBtZXNzYWdlMS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uLCAwKTsKKyAgICBtZXNzYWdlMS0+Q2xlYXJFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb24pOworCisgICAgdWludDY0X3Qgc3BhY2VfdXNlZF9iZWZvcmVfbWVyZ2UgPSBhcmVuYS5TcGFjZVVzZWQoKTsKKyAgICBtZXNzYWdlMi0+TWVyZ2VGcm9tKCptZXNzYWdlMSk7CisgICAgRVhQRUNUX0VRKHNwYWNlX3VzZWRfYmVmb3JlX21lcmdlLCBhcmVuYS5TcGFjZVVzZWQoKSk7CisgIH0KK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBBcmVuYVNldEFsbG9jYXRlZE1lc3NhZ2VBbmRSZWxlYXNlKSB7CisgIEFyZW5hIGFyZW5hOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmEpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLT5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgLy8gQWRkIGEgZXh0ZW5zaW9uIHVzaW5nIFNldEFsbG9jYXRlZEV4dGVuc2lvbgorICB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UqIGZvcmVpZ25fbWVzc2FnZSA9IG5ldyB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UoKTsKKyAgbWVzc2FnZS0+U2V0QWxsb2NhdGVkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbl9tZXNzYWdlKTsKKyAgLy8gZm9yZWlnbl9tZXNzYWdlIGlzIG5vdyBvd25lZCBieSB0aGUgYXJlbmEuCisgIEVYUEVDVF9FUShmb3JlaWduX21lc3NhZ2UsIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworCisgIC8vIFVuZGVybHlpbmcgbWVzc2FnZSBpcyBjb3BpZWQsIGFuZCByZXR1cm5lZC4KKyAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKiByZWxlYXNlZF9tZXNzYWdlID0KKyAgICAgIG1lc3NhZ2UtPlJlbGVhc2VFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pOworICBkZWxldGUgcmVsZWFzZWRfbWVzc2FnZTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgbWVzc2FnZS0+SGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU3dhcEV4dGVuc2lvbkJvdGhGdWxsV2l0aEFyZW5hKSB7CisgIEFyZW5hIGFyZW5hMTsKKyAgc3RkOjp1bmlxdWVfcHRyPEFyZW5hPiBhcmVuYTIobmV3IEFyZW5hKCkpOworCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZTEgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmExKTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlMiA9CisgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+KGFyZW5hMi5nZXQoKSk7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMobWVzc2FnZTEpOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlMik7CisgIG1lc3NhZ2UxLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiwgMSk7CisgIG1lc3NhZ2UyLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiwgMik7CisgIG1lc3NhZ2UxLT5Td2FwKG1lc3NhZ2UyKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UxLT5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZTItPkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uKSk7CisgIC8vIFJlLXNldCB0aGUgb3JpZ2luYWwgdmFsdWVzIHNvIEV4cGVjdEFsbEV4dGVuc2lvbnNTZXQgaXMgaGFwcHkuCisgIG1lc3NhZ2UxLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiwgMTAxKTsKKyAgbWVzc2FnZTItPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uLCAxMDEpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgqbWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgqbWVzc2FnZTIpOworICBhcmVuYTIucmVzZXQobnVsbHB0cik7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KCptZXNzYWdlMSk7CisgIC8vIFRlc3QgY29ybmVyIGNhc2VzLCB3aGVuIG9uZSBpcyBlbXB0eSBhbmQgb3RoZXIgaXMgbm90LgorICBBcmVuYSBhcmVuYTMsIGFyZW5hNDsKKworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UzID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4oJmFyZW5hMyk7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZTQgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmE0KTsKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMobWVzc2FnZTMpOworICBtZXNzYWdlMy0+U3dhcChtZXNzYWdlNCk7CisgIGFyZW5hMy5SZXNldCgpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgqbWVzc2FnZTQpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFN3YXBGaWVsZHNPZkV4dGVuc2lvbkJvdGhGdWxsV2l0aEFyZW5hKSB7CisgIEFyZW5hIGFyZW5hMTsKKyAgQXJlbmEqIGFyZW5hMiA9IG5ldyBBcmVuYSgpOworCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZTEgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmExKTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlMiA9CisgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+KGFyZW5hMik7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMobWVzc2FnZTEpOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlMik7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UxLT5HZXRSZWZsZWN0aW9uKCk7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZTEsICZmaWVsZHMpOworICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGRzKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQoKm1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQoKm1lc3NhZ2UyKTsKKyAgZGVsZXRlIGFyZW5hMjsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQoKm1lc3NhZ2UxKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTd2FwRXh0ZW5zaW9uV2l0aFNlbGYpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UxOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlMSk7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1lc3NhZ2UxLCAmZmllbGRzKTsKKyAgcmVmbGVjdGlvbi0+U3dhcEZpZWxkcygmbWVzc2FnZTEsICZtZXNzYWdlMSwgZmllbGRzKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU2VyaWFsaXphdGlvblRvQXJyYXkpIHsKKyAgLy8gU2VyaWFsaXplIGFzIFRlc3RBbGxFeHRlbnNpb25zIGFuZCBwYXJzZSBhcyBUZXN0QWxsVHlwZXMgdG8gaW5zdXJlIHdpcmUKKyAgLy8gY29tcGF0aWJpbGl0eSBvZiBleHRlbnNpb25zLgorICAvLworICAvLyBUaGlzIGNoZWNrcyBzZXJpYWxpemF0aW9uIHRvIGEgZmxhdCBhcnJheSBieSBleHBsaWNpdGx5IHJlc2VydmluZyBzcGFjZSBpbgorICAvLyB0aGUgc3RyaW5nIGFuZCBjYWxsaW5nIHRoZSBnZW5lcmF0ZWQgbWVzc2FnZSdzCisgIC8vIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkuCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBzb3VyY2U7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgZGVzdGluYXRpb247CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZzb3VyY2UpOworICBzaXplX3Qgc2l6ZSA9IHNvdXJjZS5CeXRlU2l6ZUxvbmcoKTsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgZGF0YS5yZXNpemUoc2l6ZSk7CisgIHVpbnQ4X3QqIHRhcmdldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KDo6Z29vZ2xlOjpwcm90b2J1Zjo6c3RyaW5nX2FzX2FycmF5KCZkYXRhKSk7CisgIHVpbnQ4X3QqIGVuZCA9IHNvdXJjZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHRhcmdldCk7CisgIEVYUEVDVF9FUShzaXplLCBlbmQgLSB0YXJnZXQpOworICBFWFBFQ1RfVFJVRShkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KGRlc3RpbmF0aW9uKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTZXJpYWxpemF0aW9uVG9TdHJlYW0pIHsKKyAgLy8gU2VyaWFsaXplIGFzIFRlc3RBbGxFeHRlbnNpb25zIGFuZCBwYXJzZSBhcyBUZXN0QWxsVHlwZXMgdG8gaW5zdXJlIHdpcmUKKyAgLy8gY29tcGF0aWJpbGl0eSBvZiBleHRlbnNpb25zLgorICAvLworICAvLyBUaGlzIGNoZWNrcyBzZXJpYWxpemF0aW9uIHRvIGFuIG91dHB1dCBzdHJlYW0gYnkgY3JlYXRpbmcgYW4gYXJyYXkgb3V0cHV0CisgIC8vIHN0cmVhbSB0aGF0IGNhbiBvbmx5IGJ1ZmZlciAxIGJ5dGUgYXQgYSB0aW1lIC0gdGhpcyBwcmV2ZW50cyB0aGUgbWVzc2FnZQorICAvLyBmcm9tIGV2ZXIganVtcGluZyB0byB0aGUgZmFzdCBwYXRoLCBlbnN1cmluZyB0aGF0IHNlcmlhbGl6YXRpb24gaGFwcGVucyB2aWEKKyAgLy8gdGhlIENvZGVkT3V0cHV0U3RyZWFtLgorICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgc291cmNlOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIGRlc3RpbmF0aW9uOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmc291cmNlKTsKKyAgc2l6ZV90IHNpemUgPSBzb3VyY2UuQnl0ZVNpemVMb25nKCk7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIGRhdGEucmVzaXplKHNpemUpOworICB7CisgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbSg6Omdvb2dsZTo6cHJvdG9idWY6OnN0cmluZ19hc19hcnJheSgmZGF0YSksIHNpemUsIDEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZhcnJheV9zdHJlYW0pOworICAgIHNvdXJjZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOworICAgIEFTU0VSVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICB9CisgIEVYUEVDVF9UUlVFKGRlc3RpbmF0aW9uLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoZGVzdGluYXRpb24pOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFBhY2tlZFNlcmlhbGl6YXRpb25Ub0FycmF5KSB7CisgIC8vIFNlcmlhbGl6ZSBhcyBUZXN0UGFja2VkRXh0ZW5zaW9ucyBhbmQgcGFyc2UgYXMgVGVzdFBhY2tlZFR5cGVzIHRvIGluc3VyZQorICAvLyB3aXJlIGNvbXBhdGliaWxpdHkgb2YgZXh0ZW5zaW9ucy4KKyAgLy8KKyAgLy8gVGhpcyBjaGVja3Mgc2VyaWFsaXphdGlvbiB0byBhIGZsYXQgYXJyYXkgYnkgZXhwbGljaXRseSByZXNlcnZpbmcgc3BhY2UgaW4KKyAgLy8gdGhlIHN0cmluZyBhbmQgY2FsbGluZyB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UncworICAvLyBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5LgorICB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMgc291cmNlOworICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIGRlc3RpbmF0aW9uOworICBUZXN0VXRpbDo6U2V0UGFja2VkRXh0ZW5zaW9ucygmc291cmNlKTsKKyAgc2l6ZV90IHNpemUgPSBzb3VyY2UuQnl0ZVNpemVMb25nKCk7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIGRhdGEucmVzaXplKHNpemUpOworICB1aW50OF90KiB0YXJnZXQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPig6Omdvb2dsZTo6cHJvdG9idWY6OnN0cmluZ19hc19hcnJheSgmZGF0YSkpOworICB1aW50OF90KiBlbmQgPSBzb3VyY2UuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSh0YXJnZXQpOworICBFWFBFQ1RfRVEoc2l6ZSwgZW5kIC0gdGFyZ2V0KTsKKyAgRVhQRUNUX1RSVUUoZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChkZXN0aW5hdGlvbik7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgUGFja2VkU2VyaWFsaXphdGlvblRvU3RyZWFtKSB7CisgIC8vIFNlcmlhbGl6ZSBhcyBUZXN0UGFja2VkRXh0ZW5zaW9ucyBhbmQgcGFyc2UgYXMgVGVzdFBhY2tlZFR5cGVzIHRvIGluc3VyZQorICAvLyB3aXJlIGNvbXBhdGliaWxpdHkgb2YgZXh0ZW5zaW9ucy4KKyAgLy8KKyAgLy8gVGhpcyBjaGVja3Mgc2VyaWFsaXphdGlvbiB0byBhbiBvdXRwdXQgc3RyZWFtIGJ5IGNyZWF0aW5nIGFuIGFycmF5IG91dHB1dAorICAvLyBzdHJlYW0gdGhhdCBjYW4gb25seSBidWZmZXIgMSBieXRlIGF0IGEgdGltZSAtIHRoaXMgcHJldmVudHMgdGhlIG1lc3NhZ2UKKyAgLy8gZnJvbSBldmVyIGp1bXBpbmcgdG8gdGhlIGZhc3QgcGF0aCwgZW5zdXJpbmcgdGhhdCBzZXJpYWxpemF0aW9uIGhhcHBlbnMgdmlhCisgIC8vIHRoZSBDb2RlZE91dHB1dFN0cmVhbS4KKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zIHNvdXJjZTsKKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBkZXN0aW5hdGlvbjsKKyAgVGVzdFV0aWw6OlNldFBhY2tlZEV4dGVuc2lvbnMoJnNvdXJjZSk7CisgIHNpemVfdCBzaXplID0gc291cmNlLkJ5dGVTaXplTG9uZygpOworICBzdGQ6OnN0cmluZyBkYXRhOworICBkYXRhLnJlc2l6ZShzaXplKTsKKyAgeworICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oOjpnb29nbGU6OnByb3RvYnVmOjpzdHJpbmdfYXNfYXJyYXkoJmRhdGEpLCBzaXplLCAxKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmYXJyYXlfc3RyZWFtKTsKKyAgICBzb3VyY2UuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKKyAgfQorICBFWFBFQ1RfVFJVRShkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRmllbGRzU2V0KGRlc3RpbmF0aW9uKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBOZXN0ZWRFeHRlbnNpb25Hcm91cCkgeworICAvLyBTZXJpYWxpemUgYXMgVGVzdEdyb3VwIGFuZCBwYXJzZSBhcyBUZXN0R3JvdXBFeHRlbnNpb24uCisgIHVuaXR0ZXN0OjpUZXN0R3JvdXAgc291cmNlOworICB1bml0dGVzdDo6VGVzdEdyb3VwRXh0ZW5zaW9uIGRlc3RpbmF0aW9uOworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHNvdXJjZS5tdXRhYmxlX29wdGlvbmFsZ3JvdXAoKS0+c2V0X2EoMTE3KTsKKyAgc291cmNlLnNldF9vcHRpb25hbF9mb3JlaWduX2VudW0odW5pdHRlc3Q6OkZPUkVJR05fQkFaKTsKKyAgc291cmNlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgRVhQRUNUX1RSVUUoZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBkZXN0aW5hdGlvbgorICAgICAgICAgIC5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3ROZXN0ZWRFeHRlbnNpb246Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uKQorICAgICAgICAgIC5oYXNfYSgpKTsKKyAgRVhQRUNUX0VRKDExNywgZGVzdGluYXRpb24KKyAgICAgICAgICAgICAgICAgICAgIC5HZXRFeHRlbnNpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3ROZXN0ZWRFeHRlbnNpb246Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgICAgICAgLmEoKSk7CisgIEVYUEVDVF9UUlVFKGRlc3RpbmF0aW9uLkhhc0V4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpUZXN0TmVzdGVkRXh0ZW5zaW9uOjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiwKKyAgICAgIGRlc3RpbmF0aW9uLkdldEV4dGVuc2lvbigKKyAgICAgICAgICB1bml0dGVzdDo6VGVzdE5lc3RlZEV4dGVuc2lvbjo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbikpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFBhcnNpbmcpIHsKKyAgLy8gU2VyaWFsaXplIGFzIFRlc3RBbGxUeXBlcyBhbmQgcGFyc2UgYXMgVGVzdEFsbEV4dGVuc2lvbnMuCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgc291cmNlOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgZGVzdGluYXRpb247CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmc291cmNlKTsKKyAgc291cmNlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgRVhQRUNUX1RSVUUoZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgVGVzdFV0aWw6OlNldE9uZW9mRmllbGRzKCZkZXN0aW5hdGlvbik7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KGRlc3RpbmF0aW9uKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBQYWNrZWRQYXJzaW5nKSB7CisgIC8vIFNlcmlhbGl6ZSBhcyBUZXN0UGFja2VkVHlwZXMgYW5kIHBhcnNlIGFzIFRlc3RQYWNrZWRFeHRlbnNpb25zLgorICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIHNvdXJjZTsKKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zIGRlc3RpbmF0aW9uOworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIFRlc3RVdGlsOjpTZXRQYWNrZWRGaWVsZHMoJnNvdXJjZSk7CisgIHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisgIEVYUEVDVF9UUlVFKGRlc3RpbmF0aW9uLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KGRlc3RpbmF0aW9uKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBQYWNrZWRUb1VucGFja2VkUGFyc2luZykgeworICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIHNvdXJjZTsKKyAgdW5pdHRlc3Q6OlRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgZGVzdGluYXRpb247CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgVGVzdFV0aWw6OlNldFBhY2tlZEZpZWxkcygmc291cmNlKTsKKyAgc291cmNlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgRVhQRUNUX1RSVUUoZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdFVucGFja2VkRXh0ZW5zaW9uc1NldChkZXN0aW5hdGlvbik7CisKKyAgLy8gUmVzZXJpYWxpemUKKyAgdW5pdHRlc3Q6OlRlc3RVbnBhY2tlZFR5cGVzIHVucGFja2VkOworICBUZXN0VXRpbDo6U2V0VW5wYWNrZWRGaWVsZHMoJnVucGFja2VkKTsKKyAgLy8gU2VyaWFsaXplZCBwcm90byBoYXMgdG8gYmUgdGhlIHNhbWUgc2l6ZSBhbmQgcGFyc2VkIHRvIHRoZSBzYW1lIG1lc3NhZ2UuCisgIEVYUEVDVF9FUSh1bnBhY2tlZC5TZXJpYWxpemVBc1N0cmluZygpLnNpemUoKSwKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLlNlcmlhbGl6ZUFzU3RyaW5nKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUoRXF1YWxzVG9TZXJpYWxpemVkKHVucGFja2VkLCBkZXN0aW5hdGlvbi5TZXJpYWxpemVBc1N0cmluZygpKSk7CisKKyAgLy8gTWFrZSBzdXJlIHdlIGNhbiBhZGQgZXh0ZW5zaW9ucy4KKyAgZGVzdGluYXRpb24uQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9pbnQzMl9leHRlbnNpb24sIDEpOworICBkZXN0aW5hdGlvbi5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX2VudW1fZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkZPUkVJR05fQkFSKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBVbnBhY2tlZFRvUGFja2VkUGFyc2luZykgeworICB1bml0dGVzdDo6VGVzdFVucGFja2VkVHlwZXMgc291cmNlOworICB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMgZGVzdGluYXRpb247CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgVGVzdFV0aWw6OlNldFVucGFja2VkRmllbGRzKCZzb3VyY2UpOworICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworICBFWFBFQ1RfVFJVRShkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldChkZXN0aW5hdGlvbik7CisKKyAgLy8gUmVzZXJpYWxpemUKKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBwYWNrZWQ7CisgIFRlc3RVdGlsOjpTZXRQYWNrZWRGaWVsZHMoJnBhY2tlZCk7CisgIC8vIFNlcmlhbGl6ZWQgcHJvdG8gaGFzIHRvIGJlIHRoZSBzYW1lIHNpemUgYW5kIHBhcnNlZCB0byB0aGUgc2FtZSBtZXNzYWdlLgorICBFWFBFQ1RfRVEocGFja2VkLlNlcmlhbGl6ZUFzU3RyaW5nKCkuc2l6ZSgpLAorICAgICAgICAgICAgZGVzdGluYXRpb24uU2VyaWFsaXplQXNTdHJpbmcoKS5zaXplKCkpOworICBFWFBFQ1RfVFJVRShFcXVhbHNUb1NlcmlhbGl6ZWQocGFja2VkLCBkZXN0aW5hdGlvbi5TZXJpYWxpemVBc1N0cmluZygpKSk7CisKKyAgLy8gTWFrZSBzdXJlIHdlIGNhbiBhZGQgZXh0ZW5zaW9ucy4KKyAgZGVzdGluYXRpb24uQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uLCAxKTsKKyAgZGVzdGluYXRpb24uQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6Rk9SRUlHTl9CQVIpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIElzSW5pdGlhbGl6ZWQpIHsKKyAgLy8gVGVzdCB0aGF0IElzSW5pdGlhbGl6ZWQoKSByZXR1cm5zIGZhbHNlIGlmIHJlcXVpcmVkIGZpZWxkcyBpbiBuZXN0ZWQKKyAgLy8gZXh0ZW5zaW9ucyBhcmUgbWlzc2luZy4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworCisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjpzaW5nbGUpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworCisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjpzaW5nbGUpLT5zZXRfYSgxKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OnNpbmdsZSktPnNldF9iKDIpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6c2luZ2xlKS0+c2V0X2MoMyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKworICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6Om11bHRpLCAwKS0+c2V0X2EoMSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSwgMCktPnNldF9iKDIpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6bXVsdGksIDApLT5zZXRfYygzKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIE11dGFibGVTdHJpbmcpIHsKKyAgLy8gVGVzdCB0aGUgbXV0YWJsZSBzdHJpbmcgYWNjZXNzb3JzLgorICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKworICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24pLT5hc3NpZ24oImZvbyIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoImZvbyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uKSk7CisKKyAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pLT5hc3NpZ24oImJhciIpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgiYmFyIiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uLCAwKSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZikgeworICAvLyBTY2FsYXIgcHJpbWl0aXZlIGV4dGVuc2lvbnMgc2hvdWxkIGluY3JlYXNlIHRoZSBleHRlbnNpb24gc2V0IHNpemUgYnkgYQorICAvLyBtaW5pbXVtIG9mIHRoZSBzaXplIG9mIHRoZSBwcmltaXRpdmUgdHlwZS4KKyNkZWZpbmUgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKHR5cGUsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgYmFzZV9zaXplID0gbWVzc2FnZS5TcGFjZVVzZWRMb25nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF8jI3R5cGUjI19leHRlbnNpb24sIHZhbHVlKTsgICAgICBcCisgICAgaW50IG1pbl9leHBlY3RlZF9zaXplID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmFzZV9zaXplICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzaXplb2YobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsXyMjdHlwZSMjX2V4dGVuc2lvbikpOyBcCisgICAgRVhQRUNUX0xFKG1pbl9leHBlY3RlZF9zaXplLCBtZXNzYWdlLlNwYWNlVXNlZExvbmcoKSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoaW50MzIsIDEwMSk7CisgIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChpbnQ2NCwgMTAyKTsKKyAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKHVpbnQzMiwgMTAzKTsKKyAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKHVpbnQ2NCwgMTA0KTsKKyAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKHNpbnQzMiwgMTA1KTsKKyAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKHNpbnQ2NCwgMTA2KTsKKyAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKGZpeGVkMzIsIDEwNyk7CisgIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChmaXhlZDY0LCAxMDgpOworICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoc2ZpeGVkMzIsIDEwOSk7CisgIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChzZml4ZWQ2NCwgMTEwKTsKKyAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKGZsb2F0LCAxMTEpOworICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoZG91YmxlLCAxMTIpOworICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoYm9vbCwgdHJ1ZSk7CisjdW5kZWYgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VECisgIHsKKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgICBjb25zdCBpbnQgYmFzZV9zaXplID0gbWVzc2FnZS5TcGFjZVVzZWRMb25nKCk7CisgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08pOworICAgIGludCBtaW5fZXhwZWN0ZWRfc2l6ZSA9CisgICAgICAgIGJhc2Vfc2l6ZSArCisgICAgICAgIHNpemVvZihtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKSk7CisgICAgRVhQRUNUX0xFKG1pbl9leHBlY3RlZF9zaXplLCBtZXNzYWdlLlNwYWNlVXNlZExvbmcoKSk7CisgIH0KKyAgeworICAgIC8vIFN0cmluZ3MgbWF5IGNhdXNlIGV4dHJhIGFsbG9jYXRpb25zIGRlcGVuZGluZyBvbiB0aGVpciBsZW5ndGg7IGVuc3VyZQorICAgIC8vIHRoYXQgZ2V0cyBpbmNsdWRlZCBhcyB3ZWxsLgorICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICAgIGNvbnN0IGludCBiYXNlX3NpemUgPSBtZXNzYWdlLlNwYWNlVXNlZExvbmcoKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzKAorICAgICAgICAidGhpcyBpcyBhIGZhaXJseSBsYXJnZSBzdHJpbmcgdGhhdCB3aWxsIGNhdXNlIHNvbWUgIgorICAgICAgICAiYWxsb2NhdGlvbiBpbiBvcmRlciB0byBzdG9yZSBpdCBpbiB0aGUgZXh0ZW5zaW9uIik7CisgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24sIHMpOworICAgIGludCBtaW5fZXhwZWN0ZWRfc2l6ZSA9IGJhc2Vfc2l6ZSArIHMubGVuZ3RoKCk7CisgICAgRVhQRUNUX0xFKG1pbl9leHBlY3RlZF9zaXplLCBtZXNzYWdlLlNwYWNlVXNlZExvbmcoKSk7CisgIH0KKyAgeworICAgIC8vIE1lc3NhZ2VzIGFsc28gaGF2ZSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gdGhhdCBuZWVkIHRvIGJlIGNvdW50ZWQuCisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgICAgY29uc3QgaW50IGJhc2Vfc2l6ZSA9IG1lc3NhZ2UuU3BhY2VVc2VkTG9uZygpOworICAgIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSBmb3JlaWduOworICAgIGZvcmVpZ24uc2V0X2MoNDIpOworICAgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgICAgLT5Db3B5RnJvbShmb3JlaWduKTsKKyAgICBpbnQgbWluX2V4cGVjdGVkX3NpemUgPSBiYXNlX3NpemUgKyBmb3JlaWduLlNwYWNlVXNlZExvbmcoKTsKKyAgICBFWFBFQ1RfTEUobWluX2V4cGVjdGVkX3NpemUsIG1lc3NhZ2UuU3BhY2VVc2VkTG9uZygpKTsKKyAgfQorCisgIC8vIFJlcGVhdGVkIHByaW1pdGl2ZSBleHRlbnNpb25zIHdpbGwgaW5jcmVhc2Ugc3BhY2UgdXNlZCBieSBhdCBsZWFzdCBhCisgIC8vIFJlcGVhdGVkRmllbGQ8VD4sIGFuZCB3aWxsIGNhdXNlIGFkZGl0aW9uYWwgYWxsb2NhdGlvbnMgd2hlbiB0aGUgYXJyYXkKKyAgLy8gZ2V0cyB0b28gYmlnIGZvciB0aGUgaW5pdGlhbCBzcGFjZS4gIE5vdGUsIHdlIGV4cGxpY2l0bHkgYWxsb2NhdGUgb24gdGhlCisgIC8vIGhlYXAgdG8gYXZvaWQgbWVzc2FnZS1vd25lZCBhcmVuYXMuCisgIC8vIFRoaXMgbWFjcm86CisgIC8vICAgLSBBZGRzIGEgdmFsdWUgdG8gdGhlIHJlcGVhdGVkIGV4dGVuc2lvbiwgdGhlbiBjbGVhcnMgaXQsIGVzdGFibGlzaGluZworICAvLyAgICAgdGhlIGJhc2Ugc2l6ZS4KKyAgLy8gICAtIEFkZHMgYSBzbWFsbCBudW1iZXIgb2YgdmFsdWVzLCB0ZXN0aW5nIHRoYXQgaXQgZG9lc24ndCBpbmNyZWFzZSB0aGUKKyAgLy8gICAgIFNwYWNlVXNlZExvbmcoKQorICAvLyAgIC0gQWRkcyBhIGxhcmdlIG51bWJlciBvZiB2YWx1ZXMgKHJlcXVpcmluZyBhbGxvY2F0aW9uIGluIHRoZSByZXBlYXRlZAorICAvLyAgICAgZmllbGQpLCBhbmQgZW5zdXJlcyB0aGF0IHRoYXQgYWxsb2NhdGlvbiBpcyBpbmNsdWRlZCBpbiBTcGFjZVVzZWRMb25nKCkKKyNkZWZpbmUgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQodHlwZSwgY3BwdHlwZSwgdmFsdWUpICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZDo6dW5pcXVlX3B0cjx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+IG1lc3NhZ2UoICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPihudWxscHRyKSk7ICAgICAgICAgICBcCisgICAgY29uc3Qgc2l6ZV90IGJhc2Vfc2l6ZSA9IG1lc3NhZ2UtPlNwYWNlVXNlZExvbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNpemVfdCBtaW5fZXhwZWN0ZWRfc2l6ZSA9IHNpemVvZihSZXBlYXRlZEZpZWxkPGNwcHR5cGU+KSArIGJhc2Vfc2l6ZTsgICAgIFwKKyAgICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkXyMjdHlwZSMjX2V4dGVuc2lvbiwgdmFsdWUpOyAgICAgICBcCisgICAgbWVzc2FnZS0+Q2xlYXJFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkXyMjdHlwZSMjX2V4dGVuc2lvbik7ICAgICAgICAgICAgXAorICAgIGNvbnN0IHNpemVfdCBlbXB0eV9yZXBlYXRlZF9maWVsZF9zaXplID0gbWVzc2FnZS0+U3BhY2VVc2VkTG9uZygpOyAgICAgICAgIFwKKyAgICBFWFBFQ1RfTEUobWluX2V4cGVjdGVkX3NpemUsIGVtcHR5X3JlcGVhdGVkX2ZpZWxkX3NpemUpIDw8ICN0eXBlOyAgICAgICAgICBcCisgICAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF8jI3R5cGUjI19leHRlbnNpb24sIHZhbHVlKTsgICAgICAgXAorICAgIEVYUEVDVF9FUShlbXB0eV9yZXBlYXRlZF9maWVsZF9zaXplLCBtZXNzYWdlLT5TcGFjZVVzZWRMb25nKCkpIDw8ICN0eXBlOyAgIFwKKyAgICBtZXNzYWdlLT5DbGVhckV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfIyN0eXBlIyNfZXh0ZW5zaW9uKTsgICAgICAgICAgICBcCisgICAgY29uc3Qgc2l6ZV90IG9sZF9jYXBhY2l0eSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtZXNzYWdlLT5HZXRSZXBlYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfIyN0eXBlIyNfZXh0ZW5zaW9uKSAgIFwKKyAgICAgICAgICAgIC5DYXBhY2l0eSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRVhQRUNUX0dFKG9sZF9jYXBhY2l0eSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoUmVwZWF0ZWRGaWVsZExvd2VyQ2xhbXBMaW1pdDxjcHB0eXBlLCBzaXplb2Yodm9pZCopPigpKSk7ICAgICAgIFwKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkXyMjdHlwZSMjX2V4dGVuc2lvbiwgdmFsdWUpOyAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZXhwZWN0ZWRfc2l6ZSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNpemVvZihjcHB0eXBlKSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKG1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgLT5HZXRSZXBlYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfIyN0eXBlIyNfZXh0ZW5zaW9uKSBcCisgICAgICAgICAgICAgICAgIC5DYXBhY2l0eSgpIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIG9sZF9jYXBhY2l0eSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZW1wdHlfcmVwZWF0ZWRfZmllbGRfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRVhQRUNUX0xFKGV4cGVjdGVkX3NpemUsIG1lc3NhZ2UtPlNwYWNlVXNlZExvbmcoKSkgPDwgI3R5cGU7ICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisgIFRFU1RfUkVQRUFURURfRVhURU5TSU9OU19TUEFDRV9VU0VEKGludDMyLCBpbnQzMl90LCAxMDEpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChpbnQ2NCwgaW50NjRfdCwgMTAyKTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQodWludDMyLCB1aW50MzJfdCwgMTAzKTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQodWludDY0LCB1aW50NjRfdCwgMTA0KTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQoc2ludDMyLCBpbnQzMl90LCAxMDUpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChzaW50NjQsIGludDY0X3QsIDEwNik7CisgIFRFU1RfUkVQRUFURURfRVhURU5TSU9OU19TUEFDRV9VU0VEKGZpeGVkMzIsIHVpbnQzMl90LCAxMDcpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChmaXhlZDY0LCB1aW50NjRfdCwgMTA4KTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQoc2ZpeGVkMzIsIGludDMyX3QsIDEwOSk7CisgIFRFU1RfUkVQRUFURURfRVhURU5TSU9OU19TUEFDRV9VU0VEKHNmaXhlZDY0LCBpbnQ2NF90LCAxMTApOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChmbG9hdCwgZmxvYXQsIDExMSk7CisgIFRFU1RfUkVQRUFURURfRVhURU5TSU9OU19TUEFDRV9VU0VEKGRvdWJsZSwgZG91YmxlLCAxMTIpOworICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChib29sLCBib29sLCB0cnVlKTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQobmVzdGVkX2VudW0sIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PKTsKKyN1bmRlZiBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRAorICAvLyBSZXBlYXRlZCBzdHJpbmdzCisgIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPiBtZXNzYWdlKAorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+KG51bGxwdHIpKTsKKyAgICBjb25zdCBzaXplX3QgYmFzZV9zaXplID0gbWVzc2FnZS0+U3BhY2VVc2VkTG9uZygpOworICAgIHNpemVfdCBtaW5fZXhwZWN0ZWRfc2l6ZSA9CisgICAgICAgIHNpemVvZihSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPikgKyBiYXNlX3NpemU7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgdmFsdWUoMjU2LCAneCcpOworICAgIC8vIE9uY2UgaXRlbXMgYXJlIGFsbG9jYXRlZCwgdGhleSBtYXkgc3RpY2sgYXJvdW5kIGV2ZW4gd2hlbiBjbGVhcmVkIHNvCisgICAgLy8gd2l0aG91dCB0aGUgaGFyZGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYWNjZXNzb3JzIHRoZXJlIGlzbid0IGEgbm90aW9uIG9mCisgICAgLy8gdGhlIGVtcHR5IHJlcGVhdGVkIGZpZWxkIG1lbW9yeSB1c2FnZSBhcyB0aGVyZSBpcyB3aXRoIHByaW1pdGl2ZSB0eXBlcy4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiwgdmFsdWUpOworICAgIH0KKyAgICBtaW5fZXhwZWN0ZWRfc2l6ZSArPQorICAgICAgICAoc2l6ZW9mKHZhbHVlKSArIHZhbHVlLnNpemUoKSkgKgorICAgICAgICAoMTYgLSBSZXBlYXRlZEZpZWxkTG93ZXJDbGFtcExpbWl0PHZvaWQqLCBzaXplb2Yodm9pZCopPigpKTsKKyAgICBFWFBFQ1RfTEUobWluX2V4cGVjdGVkX3NpemUsIG1lc3NhZ2UtPlNwYWNlVXNlZExvbmcoKSk7CisgIH0KKyAgLy8gUmVwZWF0ZWQgbWVzc2FnZXMKKyAgeworICAgIHN0ZDo6dW5pcXVlX3B0cjx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+IG1lc3NhZ2UoCisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4obnVsbHB0cikpOworICAgIGNvbnN0IHNpemVfdCBiYXNlX3NpemUgPSBtZXNzYWdlLT5TcGFjZVVzZWRMb25nKCk7CisgICAgc2l6ZV90IG1pbl9leHBlY3RlZF9zaXplID0KKyAgICAgICAgc2l6ZW9mKFJlcGVhdGVkUHRyRmllbGQ8dW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlPikgKyBiYXNlX3NpemU7CisgICAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlIHByb3RvdHlwZTsKKyAgICBwcm90b3R5cGUuc2V0X2MoMik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAqbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSA9CisgICAgICAgICAgcHJvdG90eXBlOworICAgIH0KKyAgICBtaW5fZXhwZWN0ZWRfc2l6ZSArPQorICAgICAgICAoMTYgLSBSZXBlYXRlZEZpZWxkTG93ZXJDbGFtcExpbWl0PHZvaWQqLCBzaXplb2Yodm9pZCopPigpKSAqCisgICAgICAgIHByb3RvdHlwZS5TcGFjZVVzZWRMb25nKCk7CisgICAgRVhQRUNUX0xFKG1pbl9leHBlY3RlZF9zaXplLCBtZXNzYWdlLT5TcGFjZVVzZWRMb25nKCkpOworICB9Cit9CisKKy8vIE4uQi46IFdlIGRvIG5vdCB0ZXN0IHJhbmdlLWJhc2VkIGZvciBoZXJlIGJlY2F1c2Ugd2UgcmVtYWluIEMrKzAzIGNvbXBhdGlibGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgTSwgdHlwZW5hbWUgSUQ+CitpbmxpbmUgVCBTdW1BbGxFeHRlbnNpb25zKGNvbnN0IE0mIG1lc3NhZ2UsIElEIGV4dGVuc2lvbiwgVCB6ZXJvKSB7CisgIFQgc3VtID0gemVybzsKKyAgdHlwZW5hbWUgUmVwZWF0ZWRGaWVsZDxUPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9CisgICAgICBtZXNzYWdlLkdldFJlcGVhdGVkRXh0ZW5zaW9uKGV4dGVuc2lvbikuYmVnaW4oKTsKKyAgdHlwZW5hbWUgUmVwZWF0ZWRGaWVsZDxUPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0KKyAgICAgIG1lc3NhZ2UuR2V0UmVwZWF0ZWRFeHRlbnNpb24oZXh0ZW5zaW9uKS5lbmQoKTsKKyAgZm9yICg7IGl0ZXIgIT0gZW5kOyArK2l0ZXIpIHsKKyAgICBzdW0gKz0gKml0ZXI7CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE0sIHR5cGVuYW1lIElEPgoraW5saW5lIHZvaWQgSW5jQWxsRXh0ZW5zaW9ucyhNKiBtZXNzYWdlLCBJRCBleHRlbnNpb24sIFQgdmFsKSB7CisgIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8VD46Oml0ZXJhdG9yIGl0ZXIgPQorICAgICAgbWVzc2FnZS0+TXV0YWJsZVJlcGVhdGVkRXh0ZW5zaW9uKGV4dGVuc2lvbiktPmJlZ2luKCk7CisgIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8VD46Oml0ZXJhdG9yIGVuZCA9CisgICAgICBtZXNzYWdlLT5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oZXh0ZW5zaW9uKS0+ZW5kKCk7CisgIGZvciAoOyBpdGVyICE9IGVuZDsgKytpdGVyKSB7CisgICAgKml0ZXIgKz0gdmFsOworICB9Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgUmVwZWF0ZWRGaWVsZHMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisKKyAgLy8gVGVzdCBlbXB0eSByZXBlYXRlZC1maWVsZCBjYXNlIChiLzEyOTI2MTYzKQorICBBU1NFUlRfRVEoCisgICAgICAwLAorICAgICAgbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uKS5zaXplKCkpOworICBBU1NFUlRfRVEoCisgICAgICAwLCBtZXNzYWdlLkdldFJlcGVhdGVkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24pCisgICAgICAgICAgICAgLnNpemUoKSk7CisgIEFTU0VSVF9FUSgKKyAgICAgIDAsCisgICAgICBtZXNzYWdlLkdldFJlcGVhdGVkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKS5zaXplKCkpOworICBBU1NFUlRfRVEoCisgICAgICAwLAorICAgICAgbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgICAgIC5zaXplKCkpOworCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UgbmVzdGVkX21lc3NhZ2U7CisgIG5lc3RlZF9tZXNzYWdlLnNldF9iYig0Mik7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW0gbmVzdGVkX2VudW0gPQorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bV9NSU47CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwgMSk7CisgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiwgMik7CisgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24sIDMpOworICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uLCA0KTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiwgNSk7CisgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24sIDYpOworICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiwgNyk7CisgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uLCA4KTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCA3KTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCA4KTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uLCA5LjApOworICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uLCAxMC4wKTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24sIHRydWUpOworICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24sIG5lc3RlZF9lbnVtKTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygidGVzdCIpKTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJ0ZXN0XHhGRiIpKTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgICAtPkNvcHlGcm9tKG5lc3RlZF9tZXNzYWdlKTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uLCBuZXN0ZWRfZW51bSk7CisgIH0KKworICBBU1NFUlRfRVEoMTAsIFN1bUFsbEV4dGVuc2lvbnM8aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24sIDApKTsKKyAgSW5jQWxsRXh0ZW5zaW9uczxpbnQzMl90PigmbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwgMSk7CisgIEFTU0VSVF9FUSgyMCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQzMl90PigKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwgMCkpOworCisgIEFTU0VSVF9FUSgyMCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQ2NF90PigKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiwgMCkpOworICBJbmNBbGxFeHRlbnNpb25zPGludDY0X3Q+KCZtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uLCAxKTsKKyAgQVNTRVJUX0VRKDMwLCBTdW1BbGxFeHRlbnNpb25zPGludDY0X3Q+KAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uLCAwKSk7CisKKyAgQVNTRVJUX0VRKDMwLCBTdW1BbGxFeHRlbnNpb25zPHVpbnQzMl90PigKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24sIDApKTsKKyAgSW5jQWxsRXh0ZW5zaW9uczx1aW50MzJfdD4oJm1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uLCAxKTsKKyAgQVNTRVJUX0VRKDQwLCBTdW1BbGxFeHRlbnNpb25zPHVpbnQzMl90PigKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24sIDApKTsKKworICBBU1NFUlRfRVEoNDAsIFN1bUFsbEV4dGVuc2lvbnM8dWludDY0X3Q+KAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiwgMCkpOworICBJbmNBbGxFeHRlbnNpb25zPHVpbnQ2NF90PigmbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24sIDEpOworICBBU1NFUlRfRVEoNTAsIFN1bUFsbEV4dGVuc2lvbnM8dWludDY0X3Q+KAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiwgMCkpOworCisgIEFTU0VSVF9FUSg1MCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQzMl90PigKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24sIDApKTsKKyAgSW5jQWxsRXh0ZW5zaW9uczxpbnQzMl90PigmbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24sIDEpOworICBBU1NFUlRfRVEoNjAsIFN1bUFsbEV4dGVuc2lvbnM8aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uLCAwKSk7CisKKyAgQVNTRVJUX0VRKDYwLCBTdW1BbGxFeHRlbnNpb25zPGludDY0X3Q+KAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgMCkpOworICBJbmNBbGxFeHRlbnNpb25zPGludDY0X3Q+KCZtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgMSk7CisgIEFTU0VSVF9FUSg3MCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQ2NF90PigKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24sIDApKTsKKworICBBU1NFUlRfRVEoNzAsIFN1bUFsbEV4dGVuc2lvbnM8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24sIDApKTsKKyAgSW5jQWxsRXh0ZW5zaW9uczx1aW50MzJfdD4oJm1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiwgMSk7CisgIEFTU0VSVF9FUSg4MCwgU3VtQWxsRXh0ZW5zaW9uczx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiwgMCkpOworCisgIEFTU0VSVF9FUSg4MCwgU3VtQWxsRXh0ZW5zaW9uczx1aW50NjRfdD4oCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiwgMCkpOworICBJbmNBbGxFeHRlbnNpb25zPHVpbnQ2NF90PigmbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKTsKKyAgQVNTRVJUX0VRKDkwLCBTdW1BbGxFeHRlbnNpb25zPHVpbnQ2NF90PigKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uLCAwKSk7CisKKyAgLy8gVXN1YWxseSwgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYyBjYW5ub3QgYmUgdHJ1c3RlZCB0byBiZSBleGFjdCwgc28gaXQgaXMKKyAgLy8gYSBCYWQgSWRlYSB0byBhc3NlcnQgZXF1YWxpdHkgaW4gYSB0ZXN0IGxpa2UgdGhpcy4gSG93ZXZlciwgd2UncmUgZGVhbGluZworICAvLyB3aXRoIGludGVnZXJzIHdpdGggYSBzbWFsbCBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgbWFudGlzc2EgYml0cywgc28gd2UKKyAgLy8gc2hvdWxkIGFjdHVhbGx5IGhhdmUgZXhhY3QgcHJlY2lzaW9uIGhlcmUuCisgIEFTU0VSVF9FUSg5MCwgU3VtQWxsRXh0ZW5zaW9uczxmbG9hdD4obWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uLCAwKSk7CisgIEluY0FsbEV4dGVuc2lvbnM8ZmxvYXQ+KCZtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uLCAxKTsKKyAgQVNTRVJUX0VRKDEwMCwgU3VtQWxsRXh0ZW5zaW9uczxmbG9hdD4oCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uLCAwKSk7CisKKyAgQVNTRVJUX0VRKDEwMCwgU3VtQWxsRXh0ZW5zaW9uczxkb3VibGU+KAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24sIDApKTsKKyAgSW5jQWxsRXh0ZW5zaW9uczxkb3VibGU+KCZtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiwgMSk7CisgIEFTU0VSVF9FUSgxMTAsIFN1bUFsbEV4dGVuc2lvbnM8ZG91YmxlPigKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uLCAwKSk7CisKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIHN0cmluZ19pdGVyOworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3Igc3RyaW5nX2VuZDsKKyAgZm9yIChzdHJpbmdfaXRlciA9CisgICAgICAgICAgIG1lc3NhZ2UKKyAgICAgICAgICAgICAgIC5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pCisgICAgICAgICAgICAgICAtPmJlZ2luKCksCisgICAgICBzdHJpbmdfZW5kID0KKyAgICAgICAgICAgbWVzc2FnZQorICAgICAgICAgICAgICAgLk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbikKKyAgICAgICAgICAgICAgIC0+ZW5kKCk7CisgICAgICAgc3RyaW5nX2l0ZXIgIT0gc3RyaW5nX2VuZDsgKytzdHJpbmdfaXRlcikgeworICAgICpzdHJpbmdfaXRlciArPSAidGVzdCI7CisgIH0KKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHN0cmluZ19jb25zdF9pdGVyOworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igc3RyaW5nX2NvbnN0X2VuZDsKKyAgZm9yIChzdHJpbmdfY29uc3RfaXRlciA9CisgICAgICAgICAgIG1lc3NhZ2UuR2V0UmVwZWF0ZWRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pCisgICAgICAgICAgICAgICAuYmVnaW4oKSwKKyAgICAgIHN0cmluZ19jb25zdF9lbmQgPQorICAgICAgICAgICBtZXNzYWdlLkdldFJlcGVhdGVkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgLmVuZCgpOworICAgICAgIHN0cmluZ19pdGVyICE9IHN0cmluZ19lbmQ7ICsrc3RyaW5nX2l0ZXIpIHsKKyAgICBBU1NFUlRfVFJVRSgqc3RyaW5nX2l0ZXIgPT0gInRlc3R0ZXN0Iik7CisgIH0KKworICBSZXBlYXRlZEZpZWxkPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNfTmVzdGVkRW51bT46Oml0ZXJhdG9yIGVudW1faXRlcjsKKyAgUmVwZWF0ZWRGaWVsZDx1bml0dGVzdDo6VGVzdEFsbFR5cGVzX05lc3RlZEVudW0+OjppdGVyYXRvciBlbnVtX2VuZDsKKyAgZm9yIChlbnVtX2l0ZXIgPSBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgIC5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAtPmJlZ2luKCksCisgICAgICBlbnVtX2VuZCA9IG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgIC5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbikKKyAgICAgICAgICAgICAgICAgICAgIC0+ZW5kKCk7CisgICAgICAgZW51bV9pdGVyICE9IGVudW1fZW5kOyArK2VudW1faXRlcikgeworICAgICplbnVtX2l0ZXIgPSB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX01BWDsKKyAgfQorICBSZXBlYXRlZEZpZWxkPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNfTmVzdGVkRW51bT46OmNvbnN0X2l0ZXJhdG9yCisgICAgICBlbnVtX2NvbnN0X2l0ZXI7CisgIFJlcGVhdGVkRmllbGQ8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgIGVudW1fY29uc3RfZW5kOworICBmb3IgKGVudW1fY29uc3RfaXRlciA9CisgICAgICAgICAgIG1lc3NhZ2UKKyAgICAgICAgICAgICAgIC5HZXRSZXBlYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgLmJlZ2luKCksCisgICAgICBlbnVtX2NvbnN0X2VuZCA9CisgICAgICAgICAgIG1lc3NhZ2UKKyAgICAgICAgICAgICAgIC5HZXRSZXBlYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgLmVuZCgpOworICAgICAgIGVudW1fY29uc3RfaXRlciAhPSBlbnVtX2NvbnN0X2VuZDsgKytlbnVtX2NvbnN0X2l0ZXIpIHsKKyAgICBBU1NFUlRfRVEoKmVudW1fY29uc3RfaXRlciwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bV9NQVgpOworICB9CisKKyAgUmVwZWF0ZWRQdHJGaWVsZDx1bml0dGVzdDo6VGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2U+OjppdGVyYXRvciBtc2dfaXRlcjsKKyAgUmVwZWF0ZWRQdHJGaWVsZDx1bml0dGVzdDo6VGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2U+OjppdGVyYXRvciBtc2dfZW5kOworICBmb3IgKG1zZ19pdGVyID0gbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgIC5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgLT5iZWdpbigpLAorICAgICAgbXNnX2VuZCA9IG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgLk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pCisgICAgICAgICAgICAgICAgICAgIC0+ZW5kKCk7CisgICAgICAgbXNnX2l0ZXIgIT0gbXNnX2VuZDsgKyttc2dfaXRlcikgeworICAgIG1zZ19pdGVyLT5zZXRfYmIoMTIzNCk7CisgIH0KKyAgUmVwZWF0ZWRQdHJGaWVsZDx1bml0dGVzdDo6VGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2U+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgbXNnX2NvbnN0X2l0ZXI7CisgIFJlcGVhdGVkUHRyRmllbGQ8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgIG1zZ19jb25zdF9lbmQ7CisgIGZvciAobXNnX2NvbnN0X2l0ZXIgPSBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdldFJlcGVhdGVkRXh0ZW5zaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5iZWdpbigpLAorICAgICAgbXNnX2NvbnN0X2VuZCA9IG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLkdldFJlcGVhdGVkRXh0ZW5zaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpOworICAgICAgIG1zZ19jb25zdF9pdGVyICE9IG1zZ19jb25zdF9lbmQ7ICsrbXNnX2NvbnN0X2l0ZXIpIHsKKyAgICBBU1NFUlRfRVEobXNnX2NvbnN0X2l0ZXItPmJiKCksIDEyMzQpOworICB9CisKKyAgLy8gVGVzdCBvbmUgcHJpbWl0aXZlIGZpZWxkLgorICBmb3IgKGF1dG8mIHggOgorICAgICAgICptZXNzYWdlLk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uKSkgeworICAgIHggPSA0MzIxOworICB9CisgIGZvciAoY29uc3QgYXV0byYgeCA6CisgICAgICAgbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uKSkgeworICAgIEFTU0VSVF9FUSh4LCA0MzIxKTsKKyAgfQorICAvLyBUZXN0IG9uZSBzdHJpbmcgZmllbGQuCisgIGZvciAoYXV0byYgeCA6CisgICAgICAgKm1lc3NhZ2UuTXV0YWJsZVJlcGVhdGVkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKSkgeworICAgIHggPSAidGVzdF9yYW5nZV9iYXNlZF9mb3IiOworICB9CisgIGZvciAoY29uc3QgYXV0byYgeCA6CisgICAgICAgbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbikpIHsKKyAgICBBU1NFUlRfVFJVRSh4ID09ICJ0ZXN0X3JhbmdlX2Jhc2VkX2ZvciIpOworICB9CisgIC8vIFRlc3Qgb25lIG1lc3NhZ2UgZmllbGQuCisgIGZvciAoYXV0byYgeCA6ICptZXNzYWdlLk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikpIHsKKyAgICB4LnNldF9iYig0MzIxKTsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIHggOiAqbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pKSB7CisgICAgQVNTRVJUX0VRKHguYmIoKSwgNDMyMSk7CisgIH0KK30KKworLy8gRnJvbSBiLzEyOTI2MTYzCitURVNUKEV4dGVuc2lvblNldFRlc3QsIEFic2VudEV4dGVuc2lvbikgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgIC0+QWRkKCkKKyAgICAgIC0+c2V0X2JiKDEyMyk7CisgIEFTU0VSVF9FUSgxLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDEyMywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24sIDApCisgICAgICAgICAgICAgICAgLmJiKCkpOworfQorCisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBJbnZhbGlkRW51bURlYXRoKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICBFWFBFQ1RfREVCVUdfREVBVEgoCisgICAgICBtZXNzYWdlLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuaXR0ZXN0OjpGb3JlaWduRW51bT4oNTMpKSwKKyAgICAgICJJc1ZhbGlkIik7Cit9CisKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBEeW5hbWljRXh0ZW5zaW9ucykgeworICAvLyBUZXN0IGFkZGluZyBhIGR5bmFtaWMgZXh0ZW5zaW9uIHRvIGEgY29tcGlsZWQtaW4gbWVzc2FnZSBvYmplY3QuCisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBkeW5hbWljX3Byb3RvOworICBkeW5hbWljX3Byb3RvLnNldF9uYW1lKCJkeW5hbWljX2V4dGVuc2lvbnNfdGVzdC5wcm90byIpOworICBkeW5hbWljX3Byb3RvLmFkZF9kZXBlbmRlbmN5KAorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+bmFtZSgpKTsKKyAgZHluYW1pY19wcm90by5zZXRfcGFja2FnZSgiZHluYW1pY19leHRlbnNpb25zIik7CisKKyAgLy8gQ29weSB0aGUgZmllbGRzIGFuZCBuZXN0ZWQgdHlwZXMgZnJvbSBUZXN0RHluYW1pY0V4dGVuc2lvbnMgaW50byBvdXIgbmV3CisgIC8vIHByb3RvLCBjb252ZXJ0aW5nIHRoZSBmaWVsZHMgaW50byBleHRlbnNpb25zLgorICBjb25zdCBEZXNjcmlwdG9yKiB0ZW1wbGF0ZV9kZXNjcmlwdG9yID0KKyAgICAgIHVuaXR0ZXN0OjpUZXN0RHluYW1pY0V4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKTsKKyAgRGVzY3JpcHRvclByb3RvIHRlbXBsYXRlX2Rlc2NyaXB0b3JfcHJvdG87CisgIHRlbXBsYXRlX2Rlc2NyaXB0b3ItPkNvcHlUbygmdGVtcGxhdGVfZGVzY3JpcHRvcl9wcm90byk7CisgIGR5bmFtaWNfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoKS0+TWVyZ2VGcm9tKAorICAgICAgdGVtcGxhdGVfZGVzY3JpcHRvcl9wcm90by5uZXN0ZWRfdHlwZSgpKTsKKyAgZHluYW1pY19wcm90by5tdXRhYmxlX2VudW1fdHlwZSgpLT5NZXJnZUZyb20oCisgICAgICB0ZW1wbGF0ZV9kZXNjcmlwdG9yX3Byb3RvLmVudW1fdHlwZSgpKTsKKyAgZHluYW1pY19wcm90by5tdXRhYmxlX2V4dGVuc2lvbigpLT5NZXJnZUZyb20oCisgICAgICB0ZW1wbGF0ZV9kZXNjcmlwdG9yX3Byb3RvLmZpZWxkKCkpOworCisgIC8vIEZvciBlYWNoIGV4dGVuc2lvbiB0aGF0IHdlIGFkZGVkLi4uCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZHluYW1pY19wcm90by5leHRlbnNpb25fc2l6ZSgpOyBpKyspIHsKKyAgICAvLyBTZXQgaXRzIGV4dGVuZGVlIHRvIFRlc3RBbGxFeHRlbnNpb25zLgorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBleHRlbnNpb24gPSBkeW5hbWljX3Byb3RvLm11dGFibGVfZXh0ZW5zaW9uKGkpOworICAgIGV4dGVuc2lvbi0+c2V0X2V4dGVuZGVlKAorICAgICAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkpOworCisgICAgLy8gSWYgdGhlIGZpZWxkIHJlZmVycyB0byBvbmUgb2YgdGhlIHR5cGVzIG5lc3RlZCBpbiBUZXN0RHluYW1pY0V4dGVuc2lvbnMsCisgICAgLy8gbWFrZSBpdCByZWZlciB0byB0aGUgdHlwZSBpbiBvdXIgZHluYW1pYyBwcm90byBpbnN0ZWFkLgorICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIuIiArIHRlbXBsYXRlX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpICsgIi4iOworICAgIGlmIChleHRlbnNpb24tPmhhc190eXBlX25hbWUoKSkgeworICAgICAgc3RkOjpzdHJpbmcqIHR5cGVfbmFtZSA9IGV4dGVuc2lvbi0+bXV0YWJsZV90eXBlX25hbWUoKTsKKyAgICAgIGlmIChIYXNQcmVmaXhTdHJpbmcoKnR5cGVfbmFtZSwgcHJlZml4KSkgeworICAgICAgICB0eXBlX25hbWUtPnJlcGxhY2UoMCwgcHJlZml4LnNpemUoKSwgIi5keW5hbWljX2V4dGVuc2lvbnMuIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gTm93IGJ1aWxkIHRoZSBmaWxlLCB1c2luZyB0aGUgZ2VuZXJhdGVkIHBvb2wgYXMgYW4gdW5kZXJsYXkuCisgIERlc2NyaXB0b3JQb29sIGR5bmFtaWNfcG9vbChEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSk7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gZHluYW1pY19wb29sLkJ1aWxkRmlsZShkeW5hbWljX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUoZmlsZSAhPSBudWxscHRyKTsKKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGR5bmFtaWNfZmFjdG9yeSgmZHluYW1pY19wb29sKTsKKyAgZHluYW1pY19mYWN0b3J5LlNldERlbGVnYXRlVG9HZW5lcmF0ZWRGYWN0b3J5KHRydWUpOworCisgIC8vIENvbnN0cnVjdCBhIG1lc3NhZ2UgdGhhdCB3ZSBjYW4gcGFyc2Ugd2l0aCB0aGUgZXh0ZW5zaW9ucyB3ZSBkZWZpbmVkLgorICAvLyBTaW5jZSB0aGUgZXh0ZW5zaW9ucyB3ZXJlIGJhc2VkIG9mZiBvZiB0aGUgZmllbGRzIG9mIFRlc3REeW5hbWljRXh0ZW5zaW9ucywKKyAgLy8gd2UgY2FuIHVzZSB0aGF0IG1lc3NhZ2UgdG8gY3JlYXRlIHRoaXMgdGVzdCBtZXNzYWdlLgorICBzdGQ6OnN0cmluZyBkYXRhOworICB1bml0dGVzdDo6VGVzdER5bmFtaWNFeHRlbnNpb25zIGR5bmFtaWNfZXh0ZW5zaW9uOworICB7CisgICAgdW5pdHRlc3Q6OlRlc3REeW5hbWljRXh0ZW5zaW9ucyBtZXNzYWdlOworICAgIG1lc3NhZ2Uuc2V0X3NjYWxhcl9leHRlbnNpb24oMTIzKTsKKyAgICBtZXNzYWdlLnNldF9lbnVtX2V4dGVuc2lvbih1bml0dGVzdDo6Rk9SRUlHTl9CQVIpOworICAgIG1lc3NhZ2Uuc2V0X2R5bmFtaWNfZW51bV9leHRlbnNpb24oCisgICAgICAgIHVuaXR0ZXN0OjpUZXN0RHluYW1pY0V4dGVuc2lvbnM6OkRZTkFNSUNfQkFaKTsKKyAgICBtZXNzYWdlLm11dGFibGVfbWVzc2FnZV9leHRlbnNpb24oKS0+c2V0X2MoNDU2KTsKKyAgICBtZXNzYWdlLm11dGFibGVfZHluYW1pY19tZXNzYWdlX2V4dGVuc2lvbigpLT5zZXRfZHluYW1pY19maWVsZCg3ODkpOworICAgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2V4dGVuc2lvbigiZm9vIik7CisgICAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZXh0ZW5zaW9uKCJiYXIiKTsKKyAgICBtZXNzYWdlLmFkZF9wYWNrZWRfZXh0ZW5zaW9uKDEyKTsKKyAgICBtZXNzYWdlLmFkZF9wYWNrZWRfZXh0ZW5zaW9uKC0zNCk7CisgICAgbWVzc2FnZS5hZGRfcGFja2VkX2V4dGVuc2lvbig1Nik7CisgICAgbWVzc2FnZS5hZGRfcGFja2VkX2V4dGVuc2lvbigtNzgpOworCisgICAgLy8gQWxzbyBhZGQgc29tZSB1bmtub3duIGZpZWxkcy4KKworICAgIC8vIEFuIHVua25vd24gZW51bSB2YWx1ZSAoZm9yIGEga25vd24gZmllbGQpLgorICAgIG1lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoCisgICAgICAgIHVuaXR0ZXN0OjpUZXN0RHluYW1pY0V4dGVuc2lvbnM6OmtEeW5hbWljRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyLAorICAgICAgICAxMjM0NSk7CisgICAgLy8gQSByZWd1bGFyIHVua25vd24gZmllbGQuCisgICAgbWVzc2FnZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZExlbmd0aERlbGltaXRlZCg1NDMyMSwgInVua25vd24iKTsKKworICAgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworICAgIGR5bmFtaWNfZXh0ZW5zaW9uID0gbWVzc2FnZTsKKyAgfQorCisgIC8vIE5vdyB3ZSBjYW4gcGFyc2UgdGhpcyB1c2luZyBvdXIgZHluYW1pYyBleHRlbnNpb24gZGVmaW5pdGlvbnMuLi4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIHsKKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgICBpbnB1dC5TZXRFeHRlbnNpb25SZWdpc3RyeSgmZHluYW1pY19wb29sLCAmZHluYW1pY19mYWN0b3J5KTsKKyAgICBBU1NFUlRfVFJVRShtZXNzYWdlLlBhcnNlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCkpOworICAgIEFTU0VSVF9UUlVFKGlucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKTsKKyAgfQorCisgIC8vIENhbiB3ZSBwcmludCBpdD8KKyAgc3RkOjpzdHJpbmcgbWVzc2FnZV90ZXh0OworICBUZXh0Rm9ybWF0OjpQcmludFRvU3RyaW5nKG1lc3NhZ2UsICZtZXNzYWdlX3RleHQpOworICBFWFBFQ1RfRVEoCisgICAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5zY2FsYXJfZXh0ZW5zaW9uXTogMTIzXG4iCisgICAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5lbnVtX2V4dGVuc2lvbl06IEZPUkVJR05fQkFSXG4iCisgICAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5keW5hbWljX2VudW1fZXh0ZW5zaW9uXTogRFlOQU1JQ19CQVpcbiIKKyAgICAgICJbZHluYW1pY19leHRlbnNpb25zLm1lc3NhZ2VfZXh0ZW5zaW9uXSB7XG4iCisgICAgICAiICBjOiA0NTZcbiIKKyAgICAgICJ9XG4iCisgICAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5keW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uXSB7XG4iCisgICAgICAiICBkeW5hbWljX2ZpZWxkOiA3ODlcbiIKKyAgICAgICJ9XG4iCisgICAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5yZXBlYXRlZF9leHRlbnNpb25dOiBcImZvb1wiXG4iCisgICAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5yZXBlYXRlZF9leHRlbnNpb25dOiBcImJhclwiXG4iCisgICAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5wYWNrZWRfZXh0ZW5zaW9uXTogMTJcbiIKKyAgICAgICJbZHluYW1pY19leHRlbnNpb25zLnBhY2tlZF9leHRlbnNpb25dOiAtMzRcbiIKKyAgICAgICJbZHluYW1pY19leHRlbnNpb25zLnBhY2tlZF9leHRlbnNpb25dOiA1NlxuIgorICAgICAgIltkeW5hbWljX2V4dGVuc2lvbnMucGFja2VkX2V4dGVuc2lvbl06IC03OFxuIgorICAgICAgIjIwMDI6IDEyMzQ1XG4iCisgICAgICAiNTQzMjE6IFwidW5rbm93blwiXG4iLAorICAgICAgbWVzc2FnZV90ZXh0KTsKKworICAvLyBDYW4gd2Ugc2VyaWFsaXplIGl0PworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEVxdWFsc1RvU2VyaWFsaXplZChkeW5hbWljX2V4dGVuc2lvbiwgbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpKSk7CisKKyAgLy8gV2hhdCBpZiB3ZSBwYXJzZSB1c2luZyB0aGUgcmVmbGVjdGlvbi1iYXNlZCBwYXJzZXI/CisgIHsKKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTI7CisgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7CisgICAgaW5wdXQuU2V0RXh0ZW5zaW9uUmVnaXN0cnkoJmR5bmFtaWNfcG9vbCwgJmR5bmFtaWNfZmFjdG9yeSk7CisgICAgQVNTRVJUX1RSVUUoV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmbWVzc2FnZTIpKTsKKyAgICBBU1NFUlRfVFJVRShpbnB1dC5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKSk7CisgICAgRVhQRUNUX0VRKG1lc3NhZ2UuRGVidWdTdHJpbmcoKSwgbWVzc2FnZTIuRGVidWdTdHJpbmcoKSk7CisgIH0KKworICAvLyBBcmUgdGhlIGVtYmVkZGVkIGdlbmVyYXRlZCB0eXBlcyBhY3R1YWxseSB1c2luZyB0aGUgZ2VuZXJhdGVkIG9iamVjdHM/CisgIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1lc3NhZ2VfZXh0ZW5zaW9uID0KKyAgICAgICAgZmlsZS0+RmluZEV4dGVuc2lvbkJ5TmFtZSgibWVzc2FnZV9leHRlbnNpb24iKTsKKyAgICBBU1NFUlRfVFJVRShtZXNzYWdlX2V4dGVuc2lvbiAhPSBudWxscHRyKTsKKyAgICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9CisgICAgICAgIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIG1lc3NhZ2VfZXh0ZW5zaW9uKTsKKyAgICBjb25zdCB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UqIHR5cGVkX3N1Yl9tZXNzYWdlID0KKyNpZiBQUk9UT0JVRl9SVFRJCisgICAgICAgIGR5bmFtaWNfY2FzdDxjb25zdCB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UqPigmc3ViX21lc3NhZ2UpOworI2Vsc2UKKyAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKj4oJnN1Yl9tZXNzYWdlKTsKKyNlbmRpZgorICAgIEFTU0VSVF9UUlVFKHR5cGVkX3N1Yl9tZXNzYWdlICE9IG51bGxwdHIpOworICAgIEVYUEVDVF9FUSg0NTYsIHR5cGVkX3N1Yl9tZXNzYWdlLT5jKCkpOworICB9CisKKyAgLy8gV2hhdCBkb2VzIEdldE1lc3NhZ2UoKSByZXR1cm4gZm9yIHRoZSBlbWJlZGRlZCBkeW5hbWljIHR5cGUgaWYgaXQgaXNuJ3QKKyAgLy8gcHJlc2VudD8KKyAgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZHluYW1pY19tZXNzYWdlX2V4dGVuc2lvbiA9CisgICAgICAgIGZpbGUtPkZpbmRFeHRlbnNpb25CeU5hbWUoImR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24iKTsKKyAgICBBU1NFUlRfVFJVRShkeW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uICE9IG51bGxwdHIpOworICAgIGNvbnN0IE1lc3NhZ2UmIHBhcmVudCA9IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpOworICAgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0gcGFyZW50LkdldFJlZmxlY3Rpb24oKS0+R2V0TWVzc2FnZSgKKyAgICAgICAgcGFyZW50LCBkeW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uLCAmZHluYW1pY19mYWN0b3J5KTsKKyAgICBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGUgPQorICAgICAgICBkeW5hbWljX2ZhY3RvcnkuR2V0UHJvdG90eXBlKGR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24tPm1lc3NhZ2VfdHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEocHJvdG90eXBlLCAmc3ViX21lc3NhZ2UpOworICB9Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgQm9vbEV4dGVuc2lvbikgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbXNnOworICB1aW50OF90IHdpcmVfYnl0ZXNbMl0gPSB7MTMgKiA4LCA0MiAvKiBvdXQgb2YgYm91bmRzIHBheWxvYWQgZm9yIGJvb2wgKi99OworICBFWFBFQ1RfVFJVRShtc2cuUGFyc2VGcm9tQXJyYXkod2lyZV9ieXRlcywgMikpOworICBFWFBFQ1RfVFJVRShtc2cuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbikpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIENvbnN0SW5pdCkgeworICBQUk9UT0JVRl9DT05TVElOSVQgc3RhdGljIEV4dGVuc2lvblNldCBzZXR7fTsKKyAgRVhQRUNUX0VRKHNldC5OdW1FeHRlbnNpb25zKCksIDApOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIEV4dGVuc2lvblNldFNwYWNlVXNlZCkgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbXNnOworICBzaXplX3QgbCA9IG1zZy5TcGFjZVVzZWRMb25nKCk7CisgIG1zZy5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiwgMTAwKTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1zZzIobXNnKTsKKyAgc2l6ZV90IGwyID0gbXNnMi5TcGFjZVVzZWRMb25nKCk7CisgIG1zZy5DbGVhckV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uKTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1zZzMobXNnKTsKKyAgc2l6ZV90IGwzID0gbXNnMy5TcGFjZVVzZWRMb25nKCk7CisgIEVYUEVDVF9UUlVFKChsMiAtIGwpID4gKGwzIC0gbCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX2FjY2Vzc19saXN0ZW5lci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9hY2Nlc3NfbGlzdGVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzQyMmU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9hY2Nlc3NfbGlzdGVuZXIuaApAQCAtMCwwICsxLDE3MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0ZJRUxEX0FDQ0VTU19MSVNURU5FUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0ZJRUxEX0FDQ0VTU19MSVNURU5FUl9IX18KKworI2luY2x1ZGUgPGNzdGRkZWY+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gQSBkZWZhdWx0L25vLW9wIGltcGxlbWVudGF0aW9uIG9mIG1lc3NhZ2UgaG9va3MuCisvLworLy8gU2VlIGdvL3N0YXRpY2FsbHktZGlzcGF0Y2hlZC1tZXNzYWdlLWhvb2tzIGZvciBkZXRhaWxzLgordGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvPgorc3RydWN0IE5vT3BBY2Nlc3NMaXN0ZW5lciB7CisgIC8vIE51bWJlciBvZiBmaWVsZHMgYXJlIHByb3ZpZGVkIGF0IGNvbXBpbGUgdGltZSBmb3IgdGhlIHRyYWNrZXJzIHRvIGJlIGFibGUKKyAgLy8gdG8gaGF2ZSBzdGFjayBhbGxvY2F0ZWQgYml0bWFwcyBmb3IgdGhlIGZpZWxkcy4gVGhpcyBpcyB1c2VmdWwgZm9yCisgIC8vIHBlcmZvcm1hbmNlIGNyaXRpY2FsIHRyYWNrZXJzLiBUaGlzIGlzIGFsc28gdG8gYXZvaWQgY3ljbGljIGRlcGVuZGVuY2llcworICAvLyBpZiB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpcyBuZWVkZWQuCisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtGaWVsZHMgPSBQcm90bzo6X2tJbnRlcm5hbEZpZWxkTnVtYmVyOworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIGlzIGNhbGxlZCBkdXJpbmcgdGhlIHN0YXRpYyBnbG9iYWwgaW5pdGlhbGl6YXRpb24gb2YKKyAgLy8gdGhlIHByb2dyYW0uCisgIC8vIFdlIHByb3ZpZGUgYSBwb2ludGVyIHRvIGV4dHJhY3QgdGhlIG5hbWUgb2YgdGhlIHByb3RvIG5vdCB0byBnZXQgY3ljbGljCisgIC8vIGRlcGVuZGVuY2llcyBvbiBHZXREZXNjcmlwdG9yKCkgYW5kIE9uR2V0TWV0YWRhdGEoKSBjYWxscy4gSWYgeW91IHdhbnQKKyAgLy8gdG8gZGlmZmVyZW50aWF0ZSB0aGUgcHJvdG9zIGR1cmluZyB0aGUgcnVudGltZSBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZQorICAvLyBwcm9ncmFtLCB1c2UgdGhpcyBmdW5jdG9yIHRvIGdldCBpdHMgbmFtZS4gV2UgZWl0aGVyIHdheSBuZWVkIGl0IGZvcgorICAvLyBMSVRFX1JVTlRJTUUgcHJvdG9zIGFzIHRoZXkgZG9uJ3QgaGF2ZSBkZXNjcmlwdG9ycyBhdCBhbGwuCisgIGV4cGxpY2l0IE5vT3BBY2Nlc3NMaXN0ZW5lcihTdHJpbmdQaWVjZSAoKm5hbWVfZXh0cmFjdG9yKSgpKSB7fQorICAvLyBjYWxsZWQgcmVwZWF0ZWRseSBkdXJpbmcgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24vQnl0ZVNpemUgb2YKKyAgLy8gUmVmbGVjdGlvbiBhczoKKyAgLy8gICBBY2Nlc3NMaXN0ZW5lcjxNZXNzYWdlVD46Ok9uU2VyaWFsaXplKHRoaXMpOworICBzdGF0aWMgdm9pZCBPblNlcmlhbGl6ZShjb25zdCBNZXNzYWdlTGl0ZSogbXNnKSB7fQorICBzdGF0aWMgdm9pZCBPbkRlc2VyaWFsaXplKGNvbnN0IE1lc3NhZ2VMaXRlKiBtc2cpIHt9CisgIHN0YXRpYyB2b2lkIE9uQnl0ZVNpemUoY29uc3QgTWVzc2FnZUxpdGUqIG1zZykge30KKyAgc3RhdGljIHZvaWQgT25NZXJnZUZyb20oY29uc3QgTWVzc2FnZUxpdGUqIHRvLCBjb25zdCBNZXNzYWdlTGl0ZSogZnJvbSkge30KKworICAvLyBOT1RFOiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgcHJlLW1haW4uIE1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBtYWtlCisgIC8vIHRoZSBzdGF0ZSBvZiB0aGUgbGlzdGVuZXIgaW52YWxpZC4KKyAgc3RhdGljIHZvaWQgT25HZXRNZXRhZGF0YSgpIHt9CisKKyAgLy8gY2FsbGVkIGZyb20gYWNjZXNzb3JzIGFzOgorICAvLyAgIEFjY2Vzc0xpc3RlbmVyPE1lc3NhZ2VUPjo6T24kb3BlcmF0aW9uKHRoaXMsICZmaWVsZF9zdG9yYWdlXyk7CisgIC8vIElmIHlvdSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgd2l0aCB0eXBlLCBpbiB5b3VyIGhvb2sgaW1wbGVtZW50YXRpb24KKyAgLy8gaW50cm9kdWNlCisgIC8vIHRlbXBsYXRlIDxpbnQga0ZpZWxkTnVtLCB0eXBlbmFtZSBUPgorICAvLyBzdGF0aWMgdm9pZCBPbiRvcGVyYXRpb24oY29uc3QgTWVzc2FnZUxpdGUqIG1zZywKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQqIGZpZWxkKSB7fQorICAvLyBBbmQgb3ZlcmxvYWRzIGZvciBzdGQ6Om51bGxwdHJfdCBmb3IgaW5jb21wbGV0ZSB0eXBlcyBzdWNoIGFzIE1lc3NhZ2VzLAorICAvLyBNYXBzLiBFeHRyYWN0IHRoZW0gdXNpbmcgcmVmbGVjdGlvbiBpZiB5b3UgbmVlZC4gQ29uc2VxdWVudGx5LCBzZWNvbmQKKyAgLy8gYXJndW1lbnQgY2FuIGJlIG51bGwgcG9pbnRlci4KKyAgLy8gRm9yIGFuIGV4YW1wbGUsIHNlZSBwcm90b19ob29rcy90ZXN0aW5nL21lbW9yeV90ZXN0X2ZpZWxkX2xpc3RlbmVyLmgKKyAgLy8gQW5kIGFyZ3VtZW50IHRlbXBsYXRlIGRlZHVjdGlvbiB3aWxsIGRlZHVjZSB0aGUgdHlwZSBpdHNlbGYgd2l0aG91dAorICAvLyBjaGFuZ2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCisKKyAgLy8gYWRkXzxmaWVsZD4oZikKKyAgdGVtcGxhdGUgPGludCBrRmllbGROdW0+CisgIHN0YXRpYyB2b2lkIE9uQWRkKGNvbnN0IE1lc3NhZ2VMaXRlKiBtc2csIGNvbnN0IHZvaWQqIGZpZWxkKSB7fQorCisgIC8vIGFkZF88ZmllbGQ+KCkKKyAgdGVtcGxhdGUgPGludCBrRmllbGROdW0+CisgIHN0YXRpYyB2b2lkIE9uQWRkTXV0YWJsZShjb25zdCBNZXNzYWdlTGl0ZSogbXNnLCBjb25zdCB2b2lkKiBmaWVsZCkge30KKworICAvLyA8ZmllbGQ+KCkgYW5kIDxyZXBlYXRlZF9maWVsZD4oaSkKKyAgdGVtcGxhdGUgPGludCBrRmllbGROdW0+CisgIHN0YXRpYyB2b2lkIE9uR2V0KGNvbnN0IE1lc3NhZ2VMaXRlKiBtc2csIGNvbnN0IHZvaWQqIGZpZWxkKSB7fQorCisgIC8vIGNsZWFyXzxmaWVsZD4oKQorICB0ZW1wbGF0ZSA8aW50IGtGaWVsZE51bT4KKyAgc3RhdGljIHZvaWQgT25DbGVhcihjb25zdCBNZXNzYWdlTGl0ZSogbXNnLCBjb25zdCB2b2lkKiBmaWVsZCkge30KKworICAvLyBoYXNfPGZpZWxkPigpCisgIHRlbXBsYXRlIDxpbnQga0ZpZWxkTnVtPgorICBzdGF0aWMgdm9pZCBPbkhhcyhjb25zdCBNZXNzYWdlTGl0ZSogbXNnLCBjb25zdCB2b2lkKiBmaWVsZCkge30KKworICAvLyA8cmVwZWF0ZWRfZmllbGQ+KCkKKyAgdGVtcGxhdGUgPGludCBrRmllbGROdW0+CisgIHN0YXRpYyB2b2lkIE9uTGlzdChjb25zdCBNZXNzYWdlTGl0ZSogbXNnLCBjb25zdCB2b2lkKiBmaWVsZCkge30KKworICAvLyBtdXRhYmxlXzxmaWVsZD4oKQorICB0ZW1wbGF0ZSA8aW50IGtGaWVsZE51bT4KKyAgc3RhdGljIHZvaWQgT25NdXRhYmxlKGNvbnN0IE1lc3NhZ2VMaXRlKiBtc2csIGNvbnN0IHZvaWQqIGZpZWxkKSB7fQorCisgIC8vIG11dGFibGVfPHJlcGVhdGVkX2ZpZWxkPigpCisgIHRlbXBsYXRlIDxpbnQga0ZpZWxkTnVtPgorICBzdGF0aWMgdm9pZCBPbk11dGFibGVMaXN0KGNvbnN0IE1lc3NhZ2VMaXRlKiBtc2csIGNvbnN0IHZvaWQqIGZpZWxkKSB7fQorCisgIC8vIHJlbGVhc2VfPGZpZWxkPigpCisgIHRlbXBsYXRlIDxpbnQga0ZpZWxkTnVtPgorICBzdGF0aWMgdm9pZCBPblJlbGVhc2UoY29uc3QgTWVzc2FnZUxpdGUqIG1zZywgY29uc3Qgdm9pZCogZmllbGQpIHt9CisKKyAgLy8gc2V0XzxmaWVsZD4oKSBhbmQgc2V0XzxyZXBlYXRlZF9maWVsZD4oaSkKKyAgdGVtcGxhdGUgPGludCBrRmllbGROdW0+CisgIHN0YXRpYyB2b2lkIE9uU2V0KGNvbnN0IE1lc3NhZ2VMaXRlKiBtc2csIGNvbnN0IHZvaWQqIGZpZWxkKSB7fQorCisgIC8vIDxyZXBlYXRlZF9maWVsZD5fc2l6ZSgpCisgIHRlbXBsYXRlIDxpbnQga0ZpZWxkTnVtPgorICBzdGF0aWMgdm9pZCBPblNpemUoY29uc3QgTWVzc2FnZUxpdGUqIG1zZywgY29uc3Qgdm9pZCogZmllbGQpIHt9CisKKyAgc3RhdGljIHZvaWQgT25IYXNFeHRlbnNpb24oY29uc3QgTWVzc2FnZUxpdGUqIG1zZywgaW50IGV4dGVuc2lvbl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGZpZWxkKSB7fQorICAvLyBUT0RPKGIvMTkwNjE0Njc4KTogU3VwcG9ydCBjbGVhciBpbiB0aGUgcHJvdG8gY29tcGlsZXIuCisgIHN0YXRpYyB2b2lkIE9uQ2xlYXJFeHRlbnNpb24oY29uc3QgTWVzc2FnZUxpdGUqIG1zZywgaW50IGV4dGVuc2lvbl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZmllbGQpIHt9CisgIHN0YXRpYyB2b2lkIE9uRXh0ZW5zaW9uU2l6ZShjb25zdCBNZXNzYWdlTGl0ZSogbXNnLCBpbnQgZXh0ZW5zaW9uX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGZpZWxkKSB7fQorICBzdGF0aWMgdm9pZCBPbkdldEV4dGVuc2lvbihjb25zdCBNZXNzYWdlTGl0ZSogbXNnLCBpbnQgZXh0ZW5zaW9uX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZmllbGQpIHt9CisgIHN0YXRpYyB2b2lkIE9uTXV0YWJsZUV4dGVuc2lvbihjb25zdCBNZXNzYWdlTGl0ZSogbXNnLCBpbnQgZXh0ZW5zaW9uX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGZpZWxkKSB7fQorICBzdGF0aWMgdm9pZCBPblNldEV4dGVuc2lvbihjb25zdCBNZXNzYWdlTGl0ZSogbXNnLCBpbnQgZXh0ZW5zaW9uX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZmllbGQpIHt9CisgIHN0YXRpYyB2b2lkIE9uUmVsZWFzZUV4dGVuc2lvbihjb25zdCBNZXNzYWdlTGl0ZSogbXNnLCBpbnQgZXh0ZW5zaW9uX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGZpZWxkKSB7fQorICBzdGF0aWMgdm9pZCBPbkFkZEV4dGVuc2lvbihjb25zdCBNZXNzYWdlTGl0ZSogbXNnLCBpbnQgZXh0ZW5zaW9uX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZmllbGQpIHt9CisgIHN0YXRpYyB2b2lkIE9uQWRkTXV0YWJsZUV4dGVuc2lvbihjb25zdCBNZXNzYWdlTGl0ZSogbXNnLCBpbnQgZXh0ZW5zaW9uX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGZpZWxkKSB7fQorICBzdGF0aWMgdm9pZCBPbkxpc3RFeHRlbnNpb24oY29uc3QgTWVzc2FnZUxpdGUqIG1zZywgaW50IGV4dGVuc2lvbl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBmaWVsZCkge30KKyAgc3RhdGljIHZvaWQgT25NdXRhYmxlTGlzdEV4dGVuc2lvbihjb25zdCBNZXNzYWdlTGl0ZSogbXNnLCBpbnQgZXh0ZW5zaW9uX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBmaWVsZCkge30KK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaWZuZGVmIFJFUExBQ0VfUFJPVE9fTElTVEVORVJfSU1QTAorbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgewordGVtcGxhdGUgPGNsYXNzIFQ+Cit1c2luZyBBY2Nlc3NMaXN0ZW5lciA9IE5vT3BBY2Nlc3NMaXN0ZW5lcjxUPjsKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2Vsc2UKKy8vIFlvdSBjYW4gcHV0IHlvdXIgaW1wbGVtZW50YXRpb25zIG9mIGhvb2tzL2xpc3RlbmVycyBoZXJlLgorLy8gQWxsIGhvb2tzIGFyZSBzdWJqZWN0IHRvIGFwcHJvdmFsIGJ5IHByb3RvYnVmLXRlYW1ALgorCisjZW5kaWYgIC8vICFSRVBMQUNFX1BST1RPX0xJU1RFTkVSX0lNUEwKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfRklFTERfQUNDRVNTX0xJU1RFTkVSX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnBiLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnBiLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NjBiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucGIuY2MKQEAgLTAsMCArMSwyODQgQEAKKy8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisvLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wYi5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworUFJPVE9CVUZfUFJBR01BX0lOSVRfU0VHCisKK25hbWVzcGFjZSBfcGIgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDsKK25hbWVzcGFjZSBfcGJpID0gX3BiOjppbnRlcm5hbDsKKworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK1BST1RPQlVGX0NPTlNURVhQUiBGaWVsZE1hc2s6OkZpZWxkTWFzaygKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8ucGF0aHNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319IHt9CitzdHJ1Y3QgRmllbGRNYXNrRGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBGaWVsZE1hc2tEZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+RmllbGRNYXNrRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBGaWVsZE1hc2sgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgRmllbGRNYXNrRGVmYXVsdFR5cGVJbnRlcm5hbCBfRmllbGRNYXNrX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitzdGF0aWMgOjpfcGI6Ok1ldGFkYXRhIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZmaWVsZF81Zm1hc2tfMmVwcm90b1sxXTsKK3N0YXRpYyBjb25zdGV4cHIgOjpfcGI6OkVudW1EZXNjcmlwdG9yIGNvbnN0KiogZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmZmllbGRfNWZtYXNrXzJlcHJvdG8gPSBudWxscHRyOworc3RhdGljIGNvbnN0ZXhwciA6Ol9wYjo6U2VydmljZURlc2NyaXB0b3IgY29uc3QqKiBmaWxlX2xldmVsX3NlcnZpY2VfZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZmaWVsZF81Zm1hc2tfMmVwcm90byA9IG51bGxwdHI7CisKK2NvbnN0IHVpbnQzMl90IFRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmZmllbGRfNWZtYXNrXzJlcHJvdG86Om9mZnNldHNbXSBQUk9UT0JVRl9TRUNUSU9OX1ZBUklBQkxFKHByb3RvZGVzY19jb2xkKSA9IHsKKyAgfjB1LCAgLy8gbm8gX2hhc19iaXRzXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkTWFzaywgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE1hc2ssIF9pbXBsXy5wYXRoc18pLAorfTsKK3N0YXRpYyBjb25zdCA6Ol9wYmk6Ok1pZ3JhdGlvblNjaGVtYSBzY2hlbWFzW10gUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRShwcm90b2Rlc2NfY29sZCkgPSB7CisgIHsgMCwgLTEsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkTWFzayl9LAorfTsKKworc3RhdGljIGNvbnN0IDo6X3BiOjpNZXNzYWdlKiBjb25zdCBmaWxlX2RlZmF1bHRfaW5zdGFuY2VzW10gPSB7CisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X0ZpZWxkTWFza19kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCit9OworCitjb25zdCBjaGFyIGRlc2NyaXB0b3JfdGFibGVfcHJvdG9kZWZfZ29vZ2xlXzJmcHJvdG9idWZfMmZmaWVsZF81Zm1hc2tfMmVwcm90b1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0KKyAgIlxuIGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvXDAyMlwwMTdnb29nIgorICAibGUucHJvdG9idWZcIlwwMzJcblx0RmllbGRNYXNrXDAyMlxyXG5cMDA1cGF0aHNcMDMwXDAwMSBcMDAzKFx0QiIKKyAgIlwyMDVcMDAxXG5cMDIzY29tLmdvb2dsZS5wcm90b2J1ZkJcMDE2RmllbGRNYXNrUHJvdG9QIgorICAiXDAwMVoyZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vdyIKKyAgIm4vZmllbGRtYXNrcGJcMzcwXDAwMVwwMDFcMjQyXDAwMlwwMDNHUEJcMjUyXDAwMlwwMzZHb29nbGUuUHJvdG9idWYiCisgICIuV2VsbEtub3duVHlwZXNiXDAwNnByb3RvMyIKKyAgOworc3RhdGljIDo6X3BiaTo6b25jZV9mbGFnIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZmaWVsZF81Zm1hc2tfMmVwcm90b19vbmNlOworY29uc3QgOjpfcGJpOjpEZXNjcmlwdG9yVGFibGUgZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmZpZWxkXzVmbWFza18yZXByb3RvID0geworICAgIGZhbHNlLCBmYWxzZSwgMjIzLCBkZXNjcmlwdG9yX3RhYmxlX3Byb3RvZGVmX2dvb2dsZV8yZnByb3RvYnVmXzJmZmllbGRfNWZtYXNrXzJlcHJvdG8sCisgICAgImdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvIiwKKyAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmZpZWxkXzVmbWFza18yZXByb3RvX29uY2UsIG51bGxwdHIsIDAsIDEsCisgICAgc2NoZW1hcywgZmlsZV9kZWZhdWx0X2luc3RhbmNlcywgVGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZmaWVsZF81Zm1hc2tfMmVwcm90bzo6b2Zmc2V0cywKKyAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmZmllbGRfNWZtYXNrXzJlcHJvdG8sIGZpbGVfbGV2ZWxfZW51bV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZmZpZWxkXzVmbWFza18yZXByb3RvLAorICAgIGZpbGVfbGV2ZWxfc2VydmljZV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZmZpZWxkXzVmbWFza18yZXByb3RvLAorfTsKK1BST1RPQlVGX0FUVFJJQlVURV9XRUFLIGNvbnN0IDo6X3BiaTo6RGVzY3JpcHRvclRhYmxlKiBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZmllbGRfNWZtYXNrXzJlcHJvdG9fZ2V0dGVyKCkgeworICByZXR1cm4gJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZmaWVsZF81Zm1hc2tfMmVwcm90bzsKK30KKworLy8gRm9yY2UgcnVubmluZyBBZGREZXNjcmlwdG9ycygpIGF0IGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gdGltZS4KK1BST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMiBzdGF0aWMgOjpfcGJpOjpBZGREZXNjcmlwdG9yc1J1bm5lciBkeW5hbWljX2luaXRfZHVtbXlfZ29vZ2xlXzJmcHJvdG9idWZfMmZmaWVsZF81Zm1hc2tfMmVwcm90bygmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmZpZWxkXzVmbWFza18yZXByb3RvKTsKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgRmllbGRNYXNrOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKK307CisKK0ZpZWxkTWFzazo6RmllbGRNYXNrKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzaykKK30KK0ZpZWxkTWFzazo6RmllbGRNYXNrKGNvbnN0IEZpZWxkTWFzayYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgRmllbGRNYXNrKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLnBhdGhzXyl7ZnJvbS5faW1wbF8ucGF0aHNffQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmllbGRNYXNrKQorfQorCitpbmxpbmUgdm9pZCBGaWVsZE1hc2s6OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLnBhdGhzXyl7YXJlbmF9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgfTsKK30KKworRmllbGRNYXNrOjp+RmllbGRNYXNrKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmllbGRNYXNrKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgRmllbGRNYXNrOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8ucGF0aHNfLn5SZXBlYXRlZFB0ckZpZWxkKCk7Cit9CisKK3ZvaWQgRmllbGRNYXNrOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIF9pbXBsXy5fY2FjaGVkX3NpemVfLlNldChzaXplKTsKK30KKwordm9pZCBGaWVsZE1hc2s6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzaykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLnBhdGhzXy5DbGVhcigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIEZpZWxkTWFzazo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyByZXBlYXRlZCBzdHJpbmcgcGF0aHMgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTApKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9hZGRfcGF0aHMoKTsKKyAgICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgQ0hLXyg6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzay5wYXRocyIpKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDEwPihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBGaWVsZE1hc2s6Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzaykKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCBzdHJpbmcgcGF0aHMgPSAxOworICBmb3IgKGludCBpID0gMCwgbiA9IHRoaXMtPl9pbnRlcm5hbF9wYXRoc19zaXplKCk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiBzID0gdGhpcy0+X2ludGVybmFsX3BhdGhzKGkpOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICBzLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihzLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGRNYXNrLnBhdGhzIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZygxLCBzLCB0YXJnZXQpOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzaykKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IEZpZWxkTWFzazo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2spCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCBzdHJpbmcgcGF0aHMgPSAxOworICB0b3RhbF9zaXplICs9IDEgKgorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpGcm9tSW50U2l6ZShfaW1wbF8ucGF0aHNfLnNpemUoKSk7CisgIGZvciAoaW50IGkgPSAwLCBuID0gX2ltcGxfLnBhdGhzXy5zaXplKCk7IGkgPCBuOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICBfaW1wbF8ucGF0aHNfLkdldChpKSk7CisgIH0KKworICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBGaWVsZE1hc2s6Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBGaWVsZE1hc2s6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqRmllbGRNYXNrOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBGaWVsZE1hc2s6Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxGaWVsZE1hc2sqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IEZpZWxkTWFzayY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzaykKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF90aGlzLT5faW1wbF8ucGF0aHNfLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5wYXRoc18pOworICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBGaWVsZE1hc2s6OkNvcHlGcm9tKGNvbnN0IEZpZWxkTWFzayYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGRNYXNrKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRmllbGRNYXNrOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGaWVsZE1hc2s6OkludGVybmFsU3dhcChGaWVsZE1hc2sqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX2ltcGxfLnBhdGhzXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8ucGF0aHNfKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEZpZWxkTWFzazo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZmaWVsZF81Zm1hc2tfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZmllbGRfNWZtYXNrXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZmaWVsZF81Zm1hc2tfMmVwcm90b1swXSk7Cit9CisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE1hc2sqCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRNYXNrID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRNYXNrID4oYXJlbmEpOworfQorUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnBiLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGEzZDRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnBiLmgKQEAgLTAsMCArMSwzMTcgQEAKKy8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisvLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2dvb2dsZV8yZnByb3RvYnVmXzJmZmllbGRfNWZtYXNrXzJlcHJvdG8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2dvb2dsZV8yZnByb3RvYnVmXzJmZmllbGRfNWZtYXNrXzJlcHJvdG8KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorI2lmIFBST1RPQlVGX1ZFUlNJT04gPCAzMDIxMDAwCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcworI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuIFBsZWFzZSB1cGRhdGUKKyNlcnJvciB5b3VyIGhlYWRlcnMuCisjZW5kaWYKKyNpZiAzMDIxMDA5IDwgUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiBQbGVhc2UKKyNlcnJvciByZWdlbmVyYXRlIHRoaXMgZmlsZSB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2MuCisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGFfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisjZGVmaW5lIFBST1RPQlVGX0lOVEVSTkFMX0VYUE9SVF9nb29nbGVfMmZwcm90b2J1Zl8yZmZpZWxkXzVmbWFza18yZXByb3RvIFBST1RPQlVGX0VYUE9SVAorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBBbnlNZXRhZGF0YTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCisKKy8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCAtLSBkbyBub3QgdXNlIHRoZXNlIG1lbWJlcnMuCitzdHJ1Y3QgUFJPVE9CVUZfRVhQT1JUIFRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmZmllbGRfNWZtYXNrXzJlcHJvdG8geworICBzdGF0aWMgY29uc3QgdWludDMyX3Qgb2Zmc2V0c1tdOworfTsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEZXNjcmlwdG9yVGFibGUgZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmZpZWxkXzVmbWFza18yZXByb3RvOworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK2NsYXNzIEZpZWxkTWFzazsKK3N0cnVjdCBGaWVsZE1hc2tEZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBGaWVsZE1hc2tEZWZhdWx0VHlwZUludGVybmFsIF9GaWVsZE1hc2tfZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCit0ZW1wbGF0ZTw+IFBST1RPQlVGX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRNYXNrKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZE1hc2s+KEFyZW5hKik7CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEZpZWxkTWFzayBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2spICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBGaWVsZE1hc2soKSA6IEZpZWxkTWFzayhudWxscHRyKSB7fQorICB+RmllbGRNYXNrKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBGaWVsZE1hc2soOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBGaWVsZE1hc2soY29uc3QgRmllbGRNYXNrJiBmcm9tKTsKKyAgRmllbGRNYXNrKEZpZWxkTWFzayYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBGaWVsZE1hc2soKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBGaWVsZE1hc2smIG9wZXJhdG9yPShjb25zdCBGaWVsZE1hc2smIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIEZpZWxkTWFzayYgb3BlcmF0b3I9KEZpZWxkTWFzayYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBGaWVsZE1hc2smIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBGaWVsZE1hc2sqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRmllbGRNYXNrKj4oCisgICAgICAgICAgICAgICAmX0ZpZWxkTWFza19kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDA7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChGaWVsZE1hc2smIGEsIEZpZWxkTWFzayYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChGaWVsZE1hc2sqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKEZpZWxkTWFzayogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRmllbGRNYXNrKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPEZpZWxkTWFzaz4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBGaWVsZE1hc2smIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgRmllbGRNYXNrJiBmcm9tKSB7CisgICAgRmllbGRNYXNrOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoRmllbGRNYXNrKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBGaWVsZE1hc2soOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtQYXRoc0ZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIHBhdGhzID0gMTsKKyAgaW50IHBhdGhzX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9wYXRoc19zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9wYXRocygpOworICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aHMoaW50IGluZGV4KSBjb25zdDsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfcGF0aHMoaW50IGluZGV4KTsKKyAgdm9pZCBzZXRfcGF0aHMoaW50IGluZGV4LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9wYXRocyhpbnQgaW5kZXgsIHN0ZDo6c3RyaW5nJiYgdmFsdWUpOworICB2b2lkIHNldF9wYXRocyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfcGF0aHMoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBzdGQ6OnN0cmluZyogYWRkX3BhdGhzKCk7CisgIHZvaWQgYWRkX3BhdGhzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgYWRkX3BhdGhzKHN0ZDo6c3RyaW5nJiYgdmFsdWUpOworICB2b2lkIGFkZF9wYXRocyhjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgYWRkX3BhdGhzKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiYgcGF0aHMoKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KiBtdXRhYmxlX3BhdGhzKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfcGF0aHMoaW50IGluZGV4KSBjb25zdDsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9hZGRfcGF0aHMoKTsKKyAgcHVibGljOgorCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmllbGRNYXNrKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gcGF0aHNfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZmaWVsZF81Zm1hc2tfMmVwcm90bzsKK307CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzdHJpY3QtYWxpYXNpbmciCisjZW5kaWYgIC8vIF9fR05VQ19fCisvLyBGaWVsZE1hc2sKKworLy8gcmVwZWF0ZWQgc3RyaW5nIHBhdGhzID0gMTsKK2lubGluZSBpbnQgRmllbGRNYXNrOjpfaW50ZXJuYWxfcGF0aHNfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5wYXRoc18uc2l6ZSgpOworfQoraW5saW5lIGludCBGaWVsZE1hc2s6OnBhdGhzX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfcGF0aHNfc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRmllbGRNYXNrOjpjbGVhcl9wYXRocygpIHsKKyAgX2ltcGxfLnBhdGhzXy5DbGVhcigpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWVsZE1hc2s6OmFkZF9wYXRocygpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX2FkZF9wYXRocygpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzay5wYXRocykKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWVsZE1hc2s6Ol9pbnRlcm5hbF9wYXRocyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5wYXRoc18uR2V0KGluZGV4KTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmllbGRNYXNrOjpwYXRocyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGRNYXNrLnBhdGhzKQorICByZXR1cm4gX2ludGVybmFsX3BhdGhzKGluZGV4KTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmllbGRNYXNrOjptdXRhYmxlX3BhdGhzKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGRNYXNrLnBhdGhzKQorICByZXR1cm4gX2ltcGxfLnBhdGhzXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSB2b2lkIEZpZWxkTWFzazo6c2V0X3BhdGhzKGludCBpbmRleCwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIF9pbXBsXy5wYXRoc18uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzay5wYXRocykKK30KK2lubGluZSB2b2lkIEZpZWxkTWFzazo6c2V0X3BhdGhzKGludCBpbmRleCwgc3RkOjpzdHJpbmcmJiB2YWx1ZSkgeworICBfaW1wbF8ucGF0aHNfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24oc3RkOjptb3ZlKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzay5wYXRocykKK30KK2lubGluZSB2b2lkIEZpZWxkTWFzazo6c2V0X3BhdGhzKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgR09PR0xFX0RDSEVDSyh2YWx1ZSAhPSBudWxscHRyKTsKKyAgX2ltcGxfLnBhdGhzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2sucGF0aHMpCit9CitpbmxpbmUgdm9pZCBGaWVsZE1hc2s6OnNldF9wYXRocyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBfaW1wbF8ucGF0aHNfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24oCisgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2sucGF0aHMpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpZWxkTWFzazo6X2ludGVybmFsX2FkZF9wYXRocygpIHsKKyAgcmV0dXJuIF9pbXBsXy5wYXRoc18uQWRkKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE1hc2s6OmFkZF9wYXRocyhjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgX2ltcGxfLnBhdGhzXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmllbGRNYXNrLnBhdGhzKQorfQoraW5saW5lIHZvaWQgRmllbGRNYXNrOjphZGRfcGF0aHMoc3RkOjpzdHJpbmcmJiB2YWx1ZSkgeworICBfaW1wbF8ucGF0aHNfLkFkZChzdGQ6Om1vdmUodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmllbGRNYXNrLnBhdGhzKQorfQoraW5saW5lIHZvaWQgRmllbGRNYXNrOjphZGRfcGF0aHMoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgR09PR0xFX0RDSEVDSyh2YWx1ZSAhPSBudWxscHRyKTsKKyAgX2ltcGxfLnBhdGhzXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2sucGF0aHMpCit9CitpbmxpbmUgdm9pZCBGaWVsZE1hc2s6OmFkZF9wYXRocyhjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgX2ltcGxfLnBhdGhzXy5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmllbGRNYXNrLnBhdGhzKQorfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiYKK0ZpZWxkTWFzazo6cGF0aHMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2sucGF0aHMpCisgIHJldHVybiBfaW1wbF8ucGF0aHNfOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPioKK0ZpZWxkTWFzazo6bXV0YWJsZV9wYXRocygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmllbGRNYXNrLnBhdGhzKQorICByZXR1cm4gJl9pbXBsXy5wYXRoc187Cit9CisKKyNpZmRlZiBfX0dOVUNfXworICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorI2VuZGlmICAvLyBfX0dOVUNfXworCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX0dPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZmZpZWxkXzVmbWFza18yZXByb3RvCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1MTA0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90bwpAQCAtMCwwICsxLDI0NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1ZjsKKworb3B0aW9uIGNzaGFycF9uYW1lc3BhY2UgPSAiR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzIjsKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiRmllbGRNYXNrUHJvdG8iOworb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOworb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gIkdQQiI7CitvcHRpb24gZ29fcGFja2FnZSA9ICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9maWVsZG1hc2twYiI7CitvcHRpb24gY2NfZW5hYmxlX2FyZW5hcyA9IHRydWU7CisKKy8vIGBGaWVsZE1hc2tgIHJlcHJlc2VudHMgYSBzZXQgb2Ygc3ltYm9saWMgZmllbGQgcGF0aHMsIGZvciBleGFtcGxlOgorLy8KKy8vICAgICBwYXRoczogImYuYSIKKy8vICAgICBwYXRoczogImYuYi5kIgorLy8KKy8vIEhlcmUgYGZgIHJlcHJlc2VudHMgYSBmaWVsZCBpbiBzb21lIHJvb3QgbWVzc2FnZSwgYGFgIGFuZCBgYmAKKy8vIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBmb3VuZCBpbiBgZmAsIGFuZCBgZGAgYSBmaWVsZCBmb3VuZCBpbiB0aGUKKy8vIG1lc3NhZ2UgaW4gYGYuYmAuCisvLworLy8gRmllbGQgbWFza3MgYXJlIHVzZWQgdG8gc3BlY2lmeSBhIHN1YnNldCBvZiBmaWVsZHMgdGhhdCBzaG91bGQgYmUKKy8vIHJldHVybmVkIGJ5IGEgZ2V0IG9wZXJhdGlvbiBvciBtb2RpZmllZCBieSBhbiB1cGRhdGUgb3BlcmF0aW9uLgorLy8gRmllbGQgbWFza3MgYWxzbyBoYXZlIGEgY3VzdG9tIEpTT04gZW5jb2RpbmcgKHNlZSBiZWxvdykuCisvLworLy8gIyBGaWVsZCBNYXNrcyBpbiBQcm9qZWN0aW9ucworLy8KKy8vIFdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhIHByb2plY3Rpb24sIGEgcmVzcG9uc2UgbWVzc2FnZSBvcgorLy8gc3ViLW1lc3NhZ2UgaXMgZmlsdGVyZWQgYnkgdGhlIEFQSSB0byBvbmx5IGNvbnRhaW4gdGhvc2UgZmllbGRzIGFzCisvLyBzcGVjaWZpZWQgaW4gdGhlIG1hc2suIEZvciBleGFtcGxlLCBpZiB0aGUgbWFzayBpbiB0aGUgcHJldmlvdXMKKy8vIGV4YW1wbGUgaXMgYXBwbGllZCB0byBhIHJlc3BvbnNlIG1lc3NhZ2UgYXMgZm9sbG93czoKKy8vCisvLyAgICAgZiB7CisvLyAgICAgICBhIDogMjIKKy8vICAgICAgIGIgeworLy8gICAgICAgICBkIDogMQorLy8gICAgICAgICB4IDogMgorLy8gICAgICAgfQorLy8gICAgICAgeSA6IDEzCisvLyAgICAgfQorLy8gICAgIHo6IDgKKy8vCisvLyBUaGUgcmVzdWx0IHdpbGwgbm90IGNvbnRhaW4gc3BlY2lmaWMgdmFsdWVzIGZvciBmaWVsZHMgeCx5IGFuZCB6CisvLyAodGhlaXIgdmFsdWUgd2lsbCBiZSBzZXQgdG8gdGhlIGRlZmF1bHQsIGFuZCBvbWl0dGVkIGluIHByb3RvIHRleHQKKy8vIG91dHB1dCk6CisvLworLy8KKy8vICAgICBmIHsKKy8vICAgICAgIGEgOiAyMgorLy8gICAgICAgYiB7CisvLyAgICAgICAgIGQgOiAxCisvLyAgICAgICB9CisvLyAgICAgfQorLy8KKy8vIEEgcmVwZWF0ZWQgZmllbGQgaXMgbm90IGFsbG93ZWQgZXhjZXB0IGF0IHRoZSBsYXN0IHBvc2l0aW9uIG9mIGEKKy8vIHBhdGhzIHN0cmluZy4KKy8vCisvLyBJZiBhIEZpZWxkTWFzayBvYmplY3QgaXMgbm90IHByZXNlbnQgaW4gYSBnZXQgb3BlcmF0aW9uLCB0aGUKKy8vIG9wZXJhdGlvbiBhcHBsaWVzIHRvIGFsbCBmaWVsZHMgKGFzIGlmIGEgRmllbGRNYXNrIG9mIGFsbCBmaWVsZHMKKy8vIGhhZCBiZWVuIHNwZWNpZmllZCkuCisvLworLy8gTm90ZSB0aGF0IGEgZmllbGQgbWFzayBkb2VzIG5vdCBuZWNlc3NhcmlseSBhcHBseSB0byB0aGUKKy8vIHRvcC1sZXZlbCByZXNwb25zZSBtZXNzYWdlLiBJbiBjYXNlIG9mIGEgUkVTVCBnZXQgb3BlcmF0aW9uLCB0aGUKKy8vIGZpZWxkIG1hc2sgYXBwbGllcyBkaXJlY3RseSB0byB0aGUgcmVzcG9uc2UsIGJ1dCBpbiBjYXNlIG9mIGEgUkVTVAorLy8gbGlzdCBvcGVyYXRpb24sIHRoZSBtYXNrIGluc3RlYWQgYXBwbGllcyB0byBlYWNoIGluZGl2aWR1YWwgbWVzc2FnZQorLy8gaW4gdGhlIHJldHVybmVkIHJlc291cmNlIGxpc3QuIEluIGNhc2Ugb2YgYSBSRVNUIGN1c3RvbSBtZXRob2QsCisvLyBvdGhlciBkZWZpbml0aW9ucyBtYXkgYmUgdXNlZC4gV2hlcmUgdGhlIG1hc2sgYXBwbGllcyB3aWxsIGJlCisvLyBjbGVhcmx5IGRvY3VtZW50ZWQgdG9nZXRoZXIgd2l0aCBpdHMgZGVjbGFyYXRpb24gaW4gdGhlIEFQSS4gIEluCisvLyBhbnkgY2FzZSwgdGhlIGVmZmVjdCBvbiB0aGUgcmV0dXJuZWQgcmVzb3VyY2UvcmVzb3VyY2VzIGlzIHJlcXVpcmVkCisvLyBiZWhhdmlvciBmb3IgQVBJcy4KKy8vCisvLyAjIEZpZWxkIE1hc2tzIGluIFVwZGF0ZSBPcGVyYXRpb25zCisvLworLy8gQSBmaWVsZCBtYXNrIGluIHVwZGF0ZSBvcGVyYXRpb25zIHNwZWNpZmllcyB3aGljaCBmaWVsZHMgb2YgdGhlCisvLyB0YXJnZXRlZCByZXNvdXJjZSBhcmUgZ29pbmcgdG8gYmUgdXBkYXRlZC4gVGhlIEFQSSBpcyByZXF1aXJlZAorLy8gdG8gb25seSBjaGFuZ2UgdGhlIHZhbHVlcyBvZiB0aGUgZmllbGRzIGFzIHNwZWNpZmllZCBpbiB0aGUgbWFzaworLy8gYW5kIGxlYXZlIHRoZSBvdGhlcnMgdW50b3VjaGVkLiBJZiBhIHJlc291cmNlIGlzIHBhc3NlZCBpbiB0bworLy8gZGVzY3JpYmUgdGhlIHVwZGF0ZWQgdmFsdWVzLCB0aGUgQVBJIGlnbm9yZXMgdGhlIHZhbHVlcyBvZiBhbGwKKy8vIGZpZWxkcyBub3QgY292ZXJlZCBieSB0aGUgbWFzay4KKy8vCisvLyBJZiBhIHJlcGVhdGVkIGZpZWxkIGlzIHNwZWNpZmllZCBmb3IgYW4gdXBkYXRlIG9wZXJhdGlvbiwgbmV3IHZhbHVlcyB3aWxsCisvLyBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcgcmVwZWF0ZWQgZmllbGQgaW4gdGhlIHRhcmdldCByZXNvdXJjZS4gTm90ZSB0aGF0CisvLyBhIHJlcGVhdGVkIGZpZWxkIGlzIG9ubHkgYWxsb3dlZCBpbiB0aGUgbGFzdCBwb3NpdGlvbiBvZiBhIGBwYXRoc2Agc3RyaW5nLgorLy8KKy8vIElmIGEgc3ViLW1lc3NhZ2UgaXMgc3BlY2lmaWVkIGluIHRoZSBsYXN0IHBvc2l0aW9uIG9mIHRoZSBmaWVsZCBtYXNrIGZvciBhbgorLy8gdXBkYXRlIG9wZXJhdGlvbiwgdGhlbiBuZXcgdmFsdWUgd2lsbCBiZSBtZXJnZWQgaW50byB0aGUgZXhpc3Rpbmcgc3ViLW1lc3NhZ2UKKy8vIGluIHRoZSB0YXJnZXQgcmVzb3VyY2UuCisvLworLy8gRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSB0YXJnZXQgbWVzc2FnZToKKy8vCisvLyAgICAgZiB7CisvLyAgICAgICBiIHsKKy8vICAgICAgICAgZDogMQorLy8gICAgICAgICB4OiAyCisvLyAgICAgICB9CisvLyAgICAgICBjOiBbMV0KKy8vICAgICB9CisvLworLy8gQW5kIGFuIHVwZGF0ZSBtZXNzYWdlOgorLy8KKy8vICAgICBmIHsKKy8vICAgICAgIGIgeworLy8gICAgICAgICBkOiAxMAorLy8gICAgICAgfQorLy8gICAgICAgYzogWzJdCisvLyAgICAgfQorLy8KKy8vIHRoZW4gaWYgdGhlIGZpZWxkIG1hc2sgaXM6CisvLworLy8gIHBhdGhzOiBbImYuYiIsICJmLmMiXQorLy8KKy8vIHRoZW4gdGhlIHJlc3VsdCB3aWxsIGJlOgorLy8KKy8vICAgICBmIHsKKy8vICAgICAgIGIgeworLy8gICAgICAgICBkOiAxMAorLy8gICAgICAgICB4OiAyCisvLyAgICAgICB9CisvLyAgICAgICBjOiBbMSwgMl0KKy8vICAgICB9CisvLworLy8gQW4gaW1wbGVtZW50YXRpb24gbWF5IHByb3ZpZGUgb3B0aW9ucyB0byBvdmVycmlkZSB0aGlzIGRlZmF1bHQgYmVoYXZpb3IgZm9yCisvLyByZXBlYXRlZCBhbmQgbWVzc2FnZSBmaWVsZHMuCisvLworLy8gSW4gb3JkZXIgdG8gcmVzZXQgYSBmaWVsZCdzIHZhbHVlIHRvIHRoZSBkZWZhdWx0LCB0aGUgZmllbGQgbXVzdAorLy8gYmUgaW4gdGhlIG1hc2sgYW5kIHNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgcHJvdmlkZWQgcmVzb3VyY2UuCisvLyBIZW5jZSwgaW4gb3JkZXIgdG8gcmVzZXQgYWxsIGZpZWxkcyBvZiBhIHJlc291cmNlLCBwcm92aWRlIGEgZGVmYXVsdAorLy8gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGFuZCBzZXQgYWxsIGZpZWxkcyBpbiB0aGUgbWFzaywgb3IgZG8KKy8vIG5vdCBwcm92aWRlIGEgbWFzayBhcyBkZXNjcmliZWQgYmVsb3cuCisvLworLy8gSWYgYSBmaWVsZCBtYXNrIGlzIG5vdCBwcmVzZW50IG9uIHVwZGF0ZSwgdGhlIG9wZXJhdGlvbiBhcHBsaWVzIHRvCisvLyBhbGwgZmllbGRzIChhcyBpZiBhIGZpZWxkIG1hc2sgb2YgYWxsIGZpZWxkcyBoYXMgYmVlbiBzcGVjaWZpZWQpLgorLy8gTm90ZSB0aGF0IGluIHRoZSBwcmVzZW5jZSBvZiBzY2hlbWEgZXZvbHV0aW9uLCB0aGlzIG1heSBtZWFuIHRoYXQKKy8vIGZpZWxkcyB0aGUgY2xpZW50IGRvZXMgbm90IGtub3cgYW5kIGhhcyB0aGVyZWZvcmUgbm90IGZpbGxlZCBpbnRvCisvLyB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlc2V0IHRvIHRoZWlyIGRlZmF1bHQuIElmIHRoaXMgaXMgdW53YW50ZWQKKy8vIGJlaGF2aW9yLCBhIHNwZWNpZmljIHNlcnZpY2UgbWF5IHJlcXVpcmUgYSBjbGllbnQgdG8gYWx3YXlzIHNwZWNpZnkKKy8vIGEgZmllbGQgbWFzaywgcHJvZHVjaW5nIGFuIGVycm9yIGlmIG5vdC4KKy8vCisvLyBBcyB3aXRoIGdldCBvcGVyYXRpb25zLCB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIHdoaWNoCisvLyBkZXNjcmliZXMgdGhlIHVwZGF0ZWQgdmFsdWVzIGluIHRoZSByZXF1ZXN0IG1lc3NhZ2UgZGVwZW5kcyBvbiB0aGUKKy8vIG9wZXJhdGlvbiBraW5kLiBJbiBhbnkgY2FzZSwgdGhlIGVmZmVjdCBvZiB0aGUgZmllbGQgbWFzayBpcworLy8gcmVxdWlyZWQgdG8gYmUgaG9ub3JlZCBieSB0aGUgQVBJLgorLy8KKy8vICMjIENvbnNpZGVyYXRpb25zIGZvciBIVFRQIFJFU1QKKy8vCisvLyBUaGUgSFRUUCBraW5kIG9mIGFuIHVwZGF0ZSBvcGVyYXRpb24gd2hpY2ggdXNlcyBhIGZpZWxkIG1hc2sgbXVzdAorLy8gYmUgc2V0IHRvIFBBVENIIGluc3RlYWQgb2YgUFVUIGluIG9yZGVyIHRvIHNhdGlzZnkgSFRUUCBzZW1hbnRpY3MKKy8vIChQVVQgbXVzdCBvbmx5IGJlIHVzZWQgZm9yIGZ1bGwgdXBkYXRlcykuCisvLworLy8gIyBKU09OIEVuY29kaW5nIG9mIEZpZWxkIE1hc2tzCisvLworLy8gSW4gSlNPTiwgYSBmaWVsZCBtYXNrIGlzIGVuY29kZWQgYXMgYSBzaW5nbGUgc3RyaW5nIHdoZXJlIHBhdGhzIGFyZQorLy8gc2VwYXJhdGVkIGJ5IGEgY29tbWEuIEZpZWxkcyBuYW1lIGluIGVhY2ggcGF0aCBhcmUgY29udmVydGVkCisvLyB0by9mcm9tIGxvd2VyLWNhbWVsIG5hbWluZyBjb252ZW50aW9ucy4KKy8vCisvLyBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgZGVjbGFyYXRpb25zOgorLy8KKy8vICAgICBtZXNzYWdlIFByb2ZpbGUgeworLy8gICAgICAgVXNlciB1c2VyID0gMTsKKy8vICAgICAgIFBob3RvIHBob3RvID0gMjsKKy8vICAgICB9CisvLyAgICAgbWVzc2FnZSBVc2VyIHsKKy8vICAgICAgIHN0cmluZyBkaXNwbGF5X25hbWUgPSAxOworLy8gICAgICAgc3RyaW5nIGFkZHJlc3MgPSAyOworLy8gICAgIH0KKy8vCisvLyBJbiBwcm90byBhIGZpZWxkIG1hc2sgZm9yIGBQcm9maWxlYCBtYXkgbG9vayBhcyBzdWNoOgorLy8KKy8vICAgICBtYXNrIHsKKy8vICAgICAgIHBhdGhzOiAidXNlci5kaXNwbGF5X25hbWUiCisvLyAgICAgICBwYXRoczogInBob3RvIgorLy8gICAgIH0KKy8vCisvLyBJbiBKU09OLCB0aGUgc2FtZSBtYXNrIGlzIHJlcHJlc2VudGVkIGFzIGJlbG93OgorLy8KKy8vICAgICB7CisvLyAgICAgICBtYXNrOiAidXNlci5kaXNwbGF5TmFtZSxwaG90byIKKy8vICAgICB9CisvLworLy8gIyBGaWVsZCBNYXNrcyBhbmQgT25lb2YgRmllbGRzCisvLworLy8gRmllbGQgbWFza3MgdHJlYXQgZmllbGRzIGluIG9uZW9mcyBqdXN0IGFzIHJlZ3VsYXIgZmllbGRzLiBDb25zaWRlciB0aGUKKy8vIGZvbGxvd2luZyBtZXNzYWdlOgorLy8KKy8vICAgICBtZXNzYWdlIFNhbXBsZU1lc3NhZ2UgeworLy8gICAgICAgb25lb2YgdGVzdF9vbmVvZiB7CisvLyAgICAgICAgIHN0cmluZyBuYW1lID0gNDsKKy8vICAgICAgICAgU3ViTWVzc2FnZSBzdWJfbWVzc2FnZSA9IDk7CisvLyAgICAgICB9CisvLyAgICAgfQorLy8KKy8vIFRoZSBmaWVsZCBtYXNrIGNhbiBiZToKKy8vCisvLyAgICAgbWFzayB7CisvLyAgICAgICBwYXRoczogIm5hbWUiCisvLyAgICAgfQorLy8KKy8vIE9yOgorLy8KKy8vICAgICBtYXNrIHsKKy8vICAgICAgIHBhdGhzOiAic3ViX21lc3NhZ2UiCisvLyAgICAgfQorLy8KKy8vIE5vdGUgdGhhdCBvbmVvZiB0eXBlIG5hbWVzICgidGVzdF9vbmVvZiIgaW4gdGhpcyBjYXNlKSBjYW5ub3QgYmUgdXNlZCBpbgorLy8gcGF0aHMuCisvLworLy8gIyMgRmllbGQgTWFzayBWZXJpZmljYXRpb24KKy8vCisvLyBUaGUgaW1wbGVtZW50YXRpb24gb2YgYW55IEFQSSBtZXRob2Qgd2hpY2ggaGFzIGEgRmllbGRNYXNrIHR5cGUgZmllbGQgaW4gdGhlCisvLyByZXF1ZXN0IHNob3VsZCB2ZXJpZnkgdGhlIGluY2x1ZGVkIGZpZWxkIHBhdGhzLCBhbmQgcmV0dXJuIGFuCisvLyBgSU5WQUxJRF9BUkdVTUVOVGAgZXJyb3IgaWYgYW55IHBhdGggaXMgdW5tYXBwYWJsZS4KK21lc3NhZ2UgRmllbGRNYXNrIHsKKyAgLy8gVGhlIHNldCBvZiBmaWVsZCBtYXNrIHBhdGhzLgorICByZXBlYXRlZCBzdHJpbmcgcGF0aHMgPSAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV9yZWZsZWN0aW9uLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3JlZmxlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTZhOWM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV9yZWZsZWN0aW9uLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGphc29uaEBnb29nbGUuY29tIChKYXNvbiBIc3VlaCkKKy8vCisvLyBUaGlzIGhlYWRlciBpcyBsb2dpY2FsbHkgaW50ZXJuYWwsIGJ1dCBpcyBtYWRlIHB1YmxpYyBiZWNhdXNlIGl0IGlzIHVzZWQKKy8vIGZyb20gcHJvdG9jb2wtY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUsIHdoaWNoIG1heSByZXNpZGUgaW4gb3RoZXIgY29tcG9uZW50cy4KKy8vIEl0IHByb3ZpZGVzIHJlZmxlY3Rpb24gc3VwcG9ydCBmb3IgZ2VuZXJhdGVkIGVudW1zLCBhbmQgaXMgaW5jbHVkZWQgaW4KKy8vIGdlbmVyYXRlZCAucGIuaCBmaWxlcyBhbmQgc2hvdWxkIGhhdmUgbWluaW1hbCBkZXBlbmRlbmNpZXMuIFRoZSBtZXRob2RzIGFyZQorLy8gaW1wbGVtZW50ZWQgaW4gZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX0VOVU1fUkVGTEVDVElPTl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9FTlVNX1JFRkxFQ1RJT05fSF9fCisKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fdXRpbC5oPgorCisjaWZkZWYgU1dJRworI2Vycm9yICJZb3UgY2Fubm90IFNXSUcgcHJvdG8gaGVhZGVycyIKKyNlbmRpZgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworY2xhc3MgRW51bURlc2NyaXB0b3I7Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBSZXR1cm5zIHRoZSBFbnVtRGVzY3JpcHRvciBmb3IgZW51bSB0eXBlIEUsIHdoaWNoIG11c3QgYmUgYQorLy8gcHJvdG8tZGVjbGFyZWQgZW51bSB0eXBlLiAgQ29kZSBnZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGNvbXBpbGVyCisvLyB3aWxsIGluY2x1ZGUgc3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgdGVtcGxhdGUgZm9yIGVhY2ggZW51bSB0eXBlIGRlY2xhcmVkLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+Citjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3IoKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gSGVscGVyIGZvciBFbnVtVHlwZV9QYXJzZSBmdW5jdGlvbnM6IHRyeSB0byBwYXJzZSB0aGUgc3RyaW5nICduYW1lJyBhcworLy8gYW4gZW51bSBuYW1lIG9mIHRoZSBnaXZlbiB0eXBlLCByZXR1cm5pbmcgdHJ1ZSBhbmQgZmlsbGluZyBpbiB2YWx1ZSBvbgorLy8gc3VjY2Vzcywgb3IgcmV0dXJuaW5nIGZhbHNlIGFuZCBsZWF2aW5nIHZhbHVlIHVuY2hhbmdlZCBvbiBmYWlsdXJlLgorUFJPVE9CVUZfRVhQT1JUIGJvb2wgUGFyc2VOYW1lZEVudW0oY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFN0cmluZ1BhcmFtIG5hbWUsIGludCogdmFsdWUpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRW51bVR5cGU+Citib29sIFBhcnNlTmFtZWRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBDb25zdFN0cmluZ1BhcmFtIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIEVudW1UeXBlKiB2YWx1ZSkgeworICBpbnQgdG1wOworICBpZiAoIVBhcnNlTmFtZWRFbnVtKGRlc2NyaXB0b3IsIG5hbWUsICZ0bXApKSByZXR1cm4gZmFsc2U7CisgICp2YWx1ZSA9IHN0YXRpY19jYXN0PEVudW1UeXBlPih0bXApOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gSnVzdCBhIHdyYXBwZXIgYXJvdW5kIHByaW50aW5nIHRoZSBuYW1lIG9mIGEgdmFsdWUuIFRoZSBtYWluIHBvaW50IG9mIHRoaXMKKy8vIGZ1bmN0aW9uIGlzIG5vdCB0byBiZSBpbmxpbmVkLCBzbyB0aGF0IHlvdSBjYW4gZG8gdGhpcyB3aXRob3V0IGluY2x1ZGluZworLy8gZGVzY3JpcHRvci5oLgorUFJPVE9CVUZfRVhQT1JUIGNvbnN0IHN0ZDo6c3RyaW5nJiBOYW1lT2ZFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSk7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9FTlVNX1JFRkxFQ1RJT05fSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3V0aWwuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3V0aWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3NTgzZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fdXRpbC5jYwpAQCAtMCwwICsxLDk1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV91dGlsLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKworYm9vbCBFbnVtQ29tcGFyZUJ5TmFtZShjb25zdCBFbnVtRW50cnkmIGEsIGNvbnN0IEVudW1FbnRyeSYgYikgeworICByZXR1cm4gU3RyaW5nUGllY2UoYS5uYW1lKSA8IFN0cmluZ1BpZWNlKGIubmFtZSk7Cit9CisKKy8vIEdldHMgdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIEVudW1FbnRyeSBhdCB0aGUgZ2l2ZW4gaW5kZXgsIGJ1dCByZXR1cm5zIGEKKy8vIHNwZWNpYWwgdmFsdWUgZm9yIHRoZSBpbmRleCAtMS4gVGhpcyBnaXZlcyBhIHdheSB0byB1c2Ugc3RkOjpsb3dlcl9ib3VuZCBvbiBhCisvLyBzb3J0ZWQgYXJyYXkgb2YgaW5kaWNlcyB3aGlsZSBzZWFyY2hpbmcgZm9yIHZhbHVlIHRoYXQgd2UgYXNzb2NpYXRlIHdpdGggLTEuCitpbnQgR2V0VmFsdWUoY29uc3QgRW51bUVudHJ5KiBlbnVtcywgaW50IGksIGludCB0YXJnZXQpIHsKKyAgaWYgKGkgPT0gLTEpIHsKKyAgICByZXR1cm4gdGFyZ2V0OworICB9IGVsc2UgeworICAgIHJldHVybiBlbnVtc1tpXS52YWx1ZTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworYm9vbCBMb29rVXBFbnVtVmFsdWUoY29uc3QgRW51bUVudHJ5KiBlbnVtcywgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBuYW1lLCBpbnQqIHZhbHVlKSB7CisgIEVudW1FbnRyeSB0YXJnZXR7bmFtZSwgMH07CisgIGF1dG8gaXQgPSBzdGQ6Omxvd2VyX2JvdW5kKGVudW1zLCBlbnVtcyArIHNpemUsIHRhcmdldCwgRW51bUNvbXBhcmVCeU5hbWUpOworICBpZiAoaXQgIT0gZW51bXMgKyBzaXplICYmIGl0LT5uYW1lID09IG5hbWUpIHsKKyAgICAqdmFsdWUgPSBpdC0+dmFsdWU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitpbnQgTG9va1VwRW51bU5hbWUoY29uc3QgRW51bUVudHJ5KiBlbnVtcywgY29uc3QgaW50KiBzb3J0ZWRfaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwgaW50IHZhbHVlKSB7CisgIGF1dG8gY29tcGFyYXRvciA9IFtlbnVtcywgdmFsdWVdKGludCBhLCBpbnQgYikgeworICAgIHJldHVybiBHZXRWYWx1ZShlbnVtcywgYSwgdmFsdWUpIDwgR2V0VmFsdWUoZW51bXMsIGIsIHZhbHVlKTsKKyAgfTsKKyAgYXV0byBpdCA9CisgICAgICBzdGQ6Omxvd2VyX2JvdW5kKHNvcnRlZF9pbmRpY2VzLCBzb3J0ZWRfaW5kaWNlcyArIHNpemUsIC0xLCBjb21wYXJhdG9yKTsKKyAgaWYgKGl0ICE9IHNvcnRlZF9pbmRpY2VzICsgc2l6ZSAmJiBlbnVtc1sqaXRdLnZhbHVlID09IHZhbHVlKSB7CisgICAgcmV0dXJuIGl0IC0gc29ydGVkX2luZGljZXM7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCitib29sIEluaXRpYWxpemVFbnVtU3RyaW5ncygKKyAgICBjb25zdCBFbnVtRW50cnkqIGVudW1zLCBjb25zdCBpbnQqIHNvcnRlZF9pbmRpY2VzLCBzaXplX3Qgc2l6ZSwKKyAgICBpbnRlcm5hbDo6RXhwbGljaXRseUNvbnN0cnVjdGVkPHN0ZDo6c3RyaW5nPiogZW51bV9zdHJpbmdzKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgZW51bV9zdHJpbmdzW2ldLkNvbnN0cnVjdChlbnVtc1tzb3J0ZWRfaW5kaWNlc1tpXV0ubmFtZSk7CisgICAgaW50ZXJuYWw6Ok9uU2h1dGRvd25EZXN0cm95U3RyaW5nKGVudW1fc3RyaW5nc1tpXS5nZXRfbXV0YWJsZSgpKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fdXRpbC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxMGFjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fdXRpbC5oCkBAIC0wLDAgKzEsODUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfRU5VTV9VVElMX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX0VOVU1fVVRJTF9IX18KKworCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKKyNpZmRlZiBTV0lHCisjZXJyb3IgIllvdSBjYW5ub3QgU1dJRyBwcm90byBoZWFkZXJzIgorI2VuZGlmCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gVGhpcyB0eXBlIHRyYWl0IGNhbiBiZSB1c2VkIHRvIGNhdXNlIHRlbXBsYXRlcyB0byBvbmx5IG1hdGNoIHByb3RvMiBlbnVtCisvLyB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGlzX3Byb3RvX2VudW0gOiA6OnN0ZDo6ZmFsc2VfdHlwZSB7fTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhlIHRhYmxlIGVudHJ5IGZvcm1hdCBmb3Igc3RvcmluZyBlbnVtIG5hbWUtdG8tdmFsdWUgbWFwcGluZyB1c2VkIHdpdGggbGl0ZQorLy8gcHJvdG9zLiBUaGlzIHN0cnVjdCBhbmQgdGhlIGZvbGxvd2luZyByZWxhdGVkIGZ1bmN0aW9ucyBzaG91bGQgb25seSBiZSB1c2VkCisvLyBieSBwcm90b2J1ZiBnZW5lcmF0ZWQgY29kZS4KK3N0cnVjdCBFbnVtRW50cnkgeworICBTdHJpbmdQaWVjZSBuYW1lOworICBpbnQgdmFsdWU7Cit9OworCisvLyBMb29rcyB1cCBhIG51bWVyaWMgZW51bSB2YWx1ZSBnaXZlbiB0aGUgc3RyaW5nIG5hbWUuCitQUk9UT0JVRl9FWFBPUlQgYm9vbCBMb29rVXBFbnVtVmFsdWUoY29uc3QgRW51bUVudHJ5KiBlbnVtcywgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgbmFtZSwgaW50KiB2YWx1ZSk7CisKKy8vIExvb2tzIHVwIGFuIGVudW0gbmFtZSBnaXZlbiB0aGUgbnVtZXJpYyB2YWx1ZS4KK1BST1RPQlVGX0VYUE9SVCBpbnQgTG9va1VwRW51bU5hbWUoY29uc3QgRW51bUVudHJ5KiBlbnVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBzb3J0ZWRfaW5kaWNlcywgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSk7CisKKy8vIEluaXRpYWxpemVzIHRoZSBsaXN0IG9mIGVudW0gbmFtZXMgaW4gc3RkOjpzdHJpbmcgZm9ybS4KK1BST1RPQlVGX0VYUE9SVCBib29sIEluaXRpYWxpemVFbnVtU3RyaW5ncygKKyAgICBjb25zdCBFbnVtRW50cnkqIGVudW1zLCBjb25zdCBpbnQqIHNvcnRlZF9pbmRpY2VzLCBzaXplX3Qgc2l6ZSwKKyAgICBpbnRlcm5hbDo6RXhwbGljaXRseUNvbnN0cnVjdGVkPHN0ZDo6c3RyaW5nPiogZW51bV9zdHJpbmdzKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX0VOVU1fVVRJTF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfYmFzZXMuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX2Jhc2VzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNmEzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX2Jhc2VzLmNjCkBAIC0wLDAgKzEsMTI0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9iYXNlcy5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcGFyc2VfY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisKKy8vIE11c3QgYmUgbGFzdDoKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gWmVyb0ZpZWxkc0Jhc2UKKwordm9pZCBaZXJvRmllbGRzQmFzZTo6Q2xlYXIoKSB7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8VW5rbm93bkZpZWxkU2V0PigpOyAgLy8KK30KKworWmVyb0ZpZWxkc0Jhc2U6On5aZXJvRmllbGRzQmFzZSgpIHsKKyAgKHZvaWQpX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTxVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK3NpemVfdCBaZXJvRmllbGRzQmFzZTo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoMCwgJl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCBjaGFyKiBaZXJvRmllbGRzQmFzZTo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSB7IFwKKyAgICBnb3RvIGZhaWx1cmU7ICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gaW50ZXJuYWw6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLCBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8VW5rbm93bkZpZWxkU2V0PigpLCBwdHIsCisgICAgICAgIGN0eCk7CisgICAgQ0hLXyhwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCis6OnVpbnQ4X3QqIFplcm9GaWVsZHNCYXNlOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgOjp1aW50OF90KiB0YXJnZXQsIGlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gaW50ZXJuYWw6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8VW5rbm93bkZpZWxkU2V0PigKKyAgICAgICAgICAgIFVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksCisgICAgICAgIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCit2b2lkIFplcm9GaWVsZHNCYXNlOjpNZXJnZUltcGwoTWVzc2FnZSYgdG9fcGFyYW0sIGNvbnN0IE1lc3NhZ2UmIGZyb21fcGFyYW0pIHsKKyAgYXV0byogdG8gPSBzdGF0aWNfY2FzdDxaZXJvRmllbGRzQmFzZSo+KCZ0b19wYXJhbSk7CisgIGNvbnN0IGF1dG8qIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBaZXJvRmllbGRzQmFzZSo+KCZmcm9tX3BhcmFtKTsKKyAgR09PR0xFX0RDSEVDS19ORShmcm9tLCB0byk7CisgIHRvLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTxVbmtub3duRmllbGRTZXQ+KGZyb20tPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIFplcm9GaWVsZHNCYXNlOjpDb3B5SW1wbChNZXNzYWdlJiB0b19wYXJhbSwgY29uc3QgTWVzc2FnZSYgZnJvbV9wYXJhbSkgeworICBhdXRvKiB0byA9IHN0YXRpY19jYXN0PFplcm9GaWVsZHNCYXNlKj4oJnRvX3BhcmFtKTsKKyAgY29uc3QgYXV0byogZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IFplcm9GaWVsZHNCYXNlKj4oJmZyb21fcGFyYW0pOworICBpZiAoZnJvbSA9PSB0bykgcmV0dXJuOworICB0by0+X2ludGVybmFsX21ldGFkYXRhXy5DbGVhcjxVbmtub3duRmllbGRTZXQ+KCk7CisgIHRvLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTxVbmtub3duRmllbGRTZXQ+KGZyb20tPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIFplcm9GaWVsZHNCYXNlOjpJbnRlcm5hbFN3YXAoWmVyb0ZpZWxkc0Jhc2UqIG90aGVyKSB7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcDxVbmtub3duRmllbGRTZXQ+KCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX2Jhc2VzLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX2Jhc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5NTIxOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfYmFzZXMuaApAQCAtMCwwICsxLDg3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGhlbHBlcnMgZm9yIGdlbmVyYXRlZCBjb2RlLgorLy8KKy8vICBOb3RoaW5nIGluIHRoaXMgZmlsZSBzaG91bGQgYmUgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSB1c2VycyBvZiBwcm90b2J1ZnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0JBU0VTX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfQkFTRVNfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wYXJzZV9jb250ZXh0Lmg+CisKKy8vIE11c3QgY29tZSBsYXN0OgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRvIHNhdmUgY29kZSBzaXplLCBwcm90b3Mgd2l0aG91dCBhbnkgZmllbGRzIGFyZSBkZXJpdmVkIGZyb20gWmVyb0ZpZWxkc0Jhc2UKKy8vIHJhdGhlciB0aGFuIE1lc3NhZ2UuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgWmVyb0ZpZWxkc0Jhc2UgOiBwdWJsaWMgTWVzc2FnZSB7CisgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICA6OnVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSg6OnVpbnQ4X3QqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0ZXhwciBaZXJvRmllbGRzQmFzZSgpIHt9CisgIGV4cGxpY2l0IFplcm9GaWVsZHNCYXNlKEFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICAgICAgOiBNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7fQorICBaZXJvRmllbGRzQmFzZShjb25zdCBaZXJvRmllbGRzQmFzZSYpID0gZGVsZXRlOworICBaZXJvRmllbGRzQmFzZSYgb3BlcmF0b3I9KGNvbnN0IFplcm9GaWVsZHNCYXNlJikgPSBkZWxldGU7CisgIH5aZXJvRmllbGRzQmFzZSgpIG92ZXJyaWRlOworCisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWwgeyBfY2FjaGVkX3NpemVfLlNldChzaXplKTsgfQorCisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbChNZXNzYWdlJiB0bywgY29uc3QgTWVzc2FnZSYgZnJvbSk7CisgIHN0YXRpYyB2b2lkIENvcHlJbXBsKE1lc3NhZ2UmIHRvLCBjb25zdCBNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoWmVyb0ZpZWxkc0Jhc2UqIG90aGVyKTsKKworICBtdXRhYmxlIGludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9CQVNFU19IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTgwN2UwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjCkBAIC0wLDAgKzEsMzE2OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbXV0ZXguaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lubGluZWRfc3RyaW5nX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisKKworLy8gY2xhbmctZm9ybWF0IG9mZgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisvLyBjbGFuZy1mb3JtYXQgb24KKworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTX09ORU9GCisKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEZXNjcmlwdG9yVGFibGU7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0OwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyaWNUeXBlSGFuZGxlcjsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZzsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbmxpbmVkU3RyaW5nRmllbGQ7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YTsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpMYXp5RmllbGQ7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TWFwRmllbGRCYXNlOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok1pZ3JhdGlvblNjaGVtYTsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpPblNodXRkb3duRGVsZXRlOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25TY2hlbWE7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZEJhc2U7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6U3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmc7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V3JhcHBlZE11dGV4OworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK25hbWVzcGFjZSB7Citib29sIElzTWFwRmllbGRJbkFwaShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7IHJldHVybiBmaWVsZC0+aXNfbWFwKCk7IH0KKworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorTWVzc2FnZSogTWF5YmVGb3JjZUNvcHkoQXJlbmEqIGFyZW5hLCBNZXNzYWdlKiBtc2cpIHsKKyAgaWYgKGFyZW5hICE9IG51bGxwdHIgfHwgbXNnID09IG51bGxwdHIpIHJldHVybiBtc2c7CisKKyAgTWVzc2FnZSogY29weSA9IG1zZy0+TmV3KCk7CisgIGNvcHktPk1lcmdlRnJvbSgqbXNnKTsKKyAgZGVsZXRlIG1zZzsKKyAgcmV0dXJuIGNvcHk7Cit9CisjZW5kaWYgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitib29sIFBhcnNlTmFtZWRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBDb25zdFN0cmluZ1BhcmFtIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGludCogdmFsdWUpIHsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZCA9IGRlc2NyaXB0b3ItPkZpbmRWYWx1ZUJ5TmFtZShuYW1lKTsKKyAgaWYgKGQgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSBkLT5udW1iZXIoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nJiBOYW1lT2ZFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgdmFsdWUpIHsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZCA9IGRlc2NyaXB0b3ItPkZpbmRWYWx1ZUJ5TnVtYmVyKHZhbHVlKTsKKyAgcmV0dXJuIChkID09IG51bGxwdHIgPyBHZXRFbXB0eVN0cmluZygpIDogZC0+bmFtZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEhlbHBlcnMgZm9yIHJlcG9ydGluZyB1c2FnZSBlcnJvcnMgKGUuZy4gdHJ5aW5nIHRvIHVzZSBHZXRJbnQzMigpIG9uCisvLyBhIHN0cmluZyBmaWVsZCkuCisKK25hbWVzcGFjZSB7CisKK3VzaW5nIGludGVybmFsOjpHZXRDb25zdFBvaW50ZXJBdE9mZnNldDsKK3VzaW5nIGludGVybmFsOjpHZXRDb25zdFJlZkF0T2Zmc2V0OwordXNpbmcgaW50ZXJuYWw6OkdldFBvaW50ZXJBdE9mZnNldDsKKwordm9pZCBSZXBvcnRSZWZsZWN0aW9uVXNhZ2VFcnJvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXRob2QsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJQcm90b2NvbCBCdWZmZXIgcmVmbGVjdGlvbiB1c2FnZSBlcnJvcjpcbiIKKyAgICAgICAgICAgICAgICAiICBNZXRob2QgICAgICA6IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb246OiIKKyAgICAgICAgICAgICA8PCBtZXRob2QKKyAgICAgICAgICAgICA8PCAiXG4iCisgICAgICAgICAgICAgICAgIiAgTWVzc2FnZSB0eXBlOiAiCisgICAgICAgICAgICAgPDwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXG4iCisgICAgICAgICAgICAgICAgIiAgRmllbGQgICAgICAgOiAiCisgICAgICAgICAgICAgPDwgZmllbGQtPmZ1bGxfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlxuIgorICAgICAgICAgICAgICAgICIgIFByb2JsZW0gICAgIDogIgorICAgICAgICAgICAgIDw8IGRlc2NyaXB0aW9uOworfQorCitjb25zdCBjaGFyKiBjcHB0eXBlX25hbWVzX1tGaWVsZERlc2NyaXB0b3I6Ok1BWF9DUFBUWVBFICsgMV0gPSB7CisgICAgIklOVkFMSURfQ1BQVFlQRSIsICJDUFBUWVBFX0lOVDMyIiwgICJDUFBUWVBFX0lOVDY0IiwgICJDUFBUWVBFX1VJTlQzMiIsCisgICAgIkNQUFRZUEVfVUlOVDY0IiwgICJDUFBUWVBFX0RPVUJMRSIsICJDUFBUWVBFX0ZMT0FUIiwgICJDUFBUWVBFX0JPT0wiLAorICAgICJDUFBUWVBFX0VOVU0iLCAgICAiQ1BQVFlQRV9TVFJJTkciLCAiQ1BQVFlQRV9NRVNTQUdFIn07CisKK3N0YXRpYyB2b2lkIFJlcG9ydFJlZmxlY3Rpb25Vc2FnZVR5cGVFcnJvcigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGNvbnN0IGNoYXIqIG1ldGhvZCwgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIGV4cGVjdGVkX3R5cGUpIHsKKyAgR09PR0xFX0xPRyhGQVRBTCkKKyAgICAgIDw8ICJQcm90b2NvbCBCdWZmZXIgcmVmbGVjdGlvbiB1c2FnZSBlcnJvcjpcbiIKKyAgICAgICAgICIgIE1ldGhvZCAgICAgIDogZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbjo6IgorICAgICAgPDwgbWV0aG9kCisgICAgICA8PCAiXG4iCisgICAgICAgICAiICBNZXNzYWdlIHR5cGU6ICIKKyAgICAgIDw8IGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpCisgICAgICA8PCAiXG4iCisgICAgICAgICAiICBGaWVsZCAgICAgICA6ICIKKyAgICAgIDw8IGZpZWxkLT5mdWxsX25hbWUoKQorICAgICAgPDwgIlxuIgorICAgICAgICAgIiAgUHJvYmxlbSAgICAgOiBGaWVsZCBpcyBub3QgdGhlIHJpZ2h0IHR5cGUgZm9yIHRoaXMgbWVzc2FnZTpcbiIKKyAgICAgICAgICIgICAgRXhwZWN0ZWQgIDogIgorICAgICAgPDwgY3BwdHlwZV9uYW1lc19bZXhwZWN0ZWRfdHlwZV0KKyAgICAgIDw8ICJcbiIKKyAgICAgICAgICIgICAgRmllbGQgdHlwZTogIgorICAgICAgPDwgY3BwdHlwZV9uYW1lc19bZmllbGQtPmNwcF90eXBlKCldOworfQorCitzdGF0aWMgdm9pZCBSZXBvcnRSZWZsZWN0aW9uVXNhZ2VFbnVtVHlwZUVycm9yKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3QgY2hhciogbWV0aG9kLCBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgeworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiUHJvdG9jb2wgQnVmZmVyIHJlZmxlY3Rpb24gdXNhZ2UgZXJyb3I6XG4iCisgICAgICAgICAgICAgICAgIiAgTWV0aG9kICAgICAgOiBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uOjoiCisgICAgICAgICAgICAgPDwgbWV0aG9kCisgICAgICAgICAgICAgPDwgIlxuIgorICAgICAgICAgICAgICAgICIgIE1lc3NhZ2UgdHlwZTogIgorICAgICAgICAgICAgIDw8IGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlxuIgorICAgICAgICAgICAgICAgICIgIEZpZWxkICAgICAgIDogIgorICAgICAgICAgICAgIDw8IGZpZWxkLT5mdWxsX25hbWUoKQorICAgICAgICAgICAgIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAiICBQcm9ibGVtICAgICA6IEVudW0gdmFsdWUgZGlkIG5vdCBtYXRjaCBmaWVsZCB0eXBlOlxuIgorICAgICAgICAgICAgICAgICIgICAgRXhwZWN0ZWQgIDogIgorICAgICAgICAgICAgIDw8IGZpZWxkLT5lbnVtX3R5cGUoKS0+ZnVsbF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXG4iCisgICAgICAgICAgICAgICAgIiAgICBBY3R1YWwgICAgOiAiCisgICAgICAgICAgICAgPDwgdmFsdWUtPmZ1bGxfbmFtZSgpOworfQorCitpbmxpbmUgdm9pZCBDaGVja0ludmFsaWRBY2Nlc3MoY29uc3QgaW50ZXJuYWw6OlJlZmxlY3Rpb25TY2hlbWEmIHNjaGVtYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIEdPT0dMRV9DSEVDSyghc2NoZW1hLklzRmllbGRTdHJpcHBlZChmaWVsZCkpCisgICAgICA8PCAiaW52YWxpZCBhY2Nlc3MgdG8gYSBzdHJpcHBlZCBmaWVsZCAiIDw8IGZpZWxkLT5mdWxsX25hbWUoKTsKK30KKworI2RlZmluZSBVU0FHRV9DSEVDSyhDT05ESVRJT04sIE1FVEhPRCwgRVJST1JfREVTQ1JJUFRJT04pIFwKKyAgaWYgKCEoQ09ORElUSU9OKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFJlcG9ydFJlZmxlY3Rpb25Vc2FnZUVycm9yKGRlc2NyaXB0b3JfLCBmaWVsZCwgI01FVEhPRCwgRVJST1JfREVTQ1JJUFRJT04pCisjZGVmaW5lIFVTQUdFX0NIRUNLX0VRKEEsIEIsIE1FVEhPRCwgRVJST1JfREVTQ1JJUFRJT04pIFwKKyAgVVNBR0VfQ0hFQ0soKEEpID09IChCKSwgTUVUSE9ELCBFUlJPUl9ERVNDUklQVElPTikKKyNkZWZpbmUgVVNBR0VfQ0hFQ0tfTkUoQSwgQiwgTUVUSE9ELCBFUlJPUl9ERVNDUklQVElPTikgXAorICBVU0FHRV9DSEVDSygoQSkgIT0gKEIpLCBNRVRIT0QsIEVSUk9SX0RFU0NSSVBUSU9OKQorCisjZGVmaW5lIFVTQUdFX0NIRUNLX1RZUEUoTUVUSE9ELCBDUFBUWVBFKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFKSBcCisgIFJlcG9ydFJlZmxlY3Rpb25Vc2FnZVR5cGVFcnJvcihkZXNjcmlwdG9yXywgZmllbGQsICNNRVRIT0QsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFKQorCisjZGVmaW5lIFVTQUdFX0NIRUNLX0VOVU1fVkFMVUUoTUVUSE9EKSAgICAgXAorICBpZiAodmFsdWUtPnR5cGUoKSAhPSBmaWVsZC0+ZW51bV90eXBlKCkpIFwKKyAgUmVwb3J0UmVmbGVjdGlvblVzYWdlRW51bVR5cGVFcnJvcihkZXNjcmlwdG9yXywgZmllbGQsICNNRVRIT0QsIHZhbHVlKQorCisjZGVmaW5lIFVTQUdFX0NIRUNLX01FU1NBR0VfVFlQRShNRVRIT0QpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FHRV9DSEVDS19FUShmaWVsZC0+Y29udGFpbmluZ190eXBlKCksIGRlc2NyaXB0b3JfLCBNRVRIT0QsIFwKKyAgICAgICAgICAgICAgICAgIkZpZWxkIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsKKyNkZWZpbmUgVVNBR0VfQ0hFQ0tfU0lOR1VMQVIoTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FHRV9DSEVDS19ORShmaWVsZC0+bGFiZWwoKSwgRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCwgTUVUSE9ELCBcCisgICAgICAgICAgICAgICAgICJGaWVsZCBpcyByZXBlYXRlZDsgdGhlIG1ldGhvZCByZXF1aXJlcyBhIHNpbmd1bGFyIGZpZWxkLiIpCisjZGVmaW5lIFVTQUdFX0NIRUNLX1JFUEVBVEVEKE1FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVVNBR0VfQ0hFQ0tfRVEoZmllbGQtPmxhYmVsKCksIEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQsIE1FVEhPRCwgXAorICAgICAgICAgICAgICAgICAiRmllbGQgaXMgc2luZ3VsYXI7IHRoZSBtZXRob2QgcmVxdWlyZXMgYSByZXBlYXRlZCBmaWVsZC4iKQorCisjZGVmaW5lIFVTQUdFX0NIRUNLX0FMTChNRVRIT0QsIExBQkVMLCBDUFBUWVBFKSBcCisgIFVTQUdFX0NIRUNLX01FU1NBR0VfVFlQRShNRVRIT0QpOyAgICAgICAgICAgICBcCisgIFVTQUdFX0NIRUNLXyMjTEFCRUwoTUVUSE9EKTsgICAgICAgICAgICAgICAgICBcCisgIFVTQUdFX0NIRUNLX1RZUEUoTUVUSE9ELCBDUFBUWVBFKQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWZsZWN0aW9uOjpSZWZsZWN0aW9uKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsOjpSZWZsZWN0aW9uU2NoZW1hJiBzY2hlbWEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLCBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkKKyAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgICAgc2NoZW1hXyhzY2hlbWEpLAorICAgICAgZGVzY3JpcHRvcl9wb29sXygKKyAgICAgICAgICAocG9vbCA9PSBudWxscHRyKSA/IERlc2NyaXB0b3JQb29sOjppbnRlcm5hbF9nZW5lcmF0ZWRfcG9vbCgpIDogcG9vbCksCisgICAgICBtZXNzYWdlX2ZhY3RvcnlfKGZhY3RvcnkpLAorICAgICAgbGFzdF9ub25fd2Vha19maWVsZF9pbmRleF8oLTEpIHsKKyAgbGFzdF9ub25fd2Vha19maWVsZF9pbmRleF8gPSBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSAtIDE7Cit9CisKK2NvbnN0IFVua25vd25GaWVsZFNldCYgUmVmbGVjdGlvbjo6R2V0VW5rbm93bkZpZWxkcygKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCB7CisgIHJldHVybiBHZXRJbnRlcm5hbE1ldGFkYXRhKG1lc3NhZ2UpLnVua25vd25fZmllbGRzPFVua25vd25GaWVsZFNldD4oCisgICAgICBVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpOworfQorCitVbmtub3duRmllbGRTZXQqIFJlZmxlY3Rpb246Ok11dGFibGVVbmtub3duRmllbGRzKE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0IHsKKyAgcmV0dXJuIE11dGFibGVJbnRlcm5hbE1ldGFkYXRhKG1lc3NhZ2UpCisgICAgICAtPm11dGFibGVfdW5rbm93bl9maWVsZHM8VW5rbm93bkZpZWxkU2V0PigpOworfQorCitib29sIFJlZmxlY3Rpb246OklzTGF6eUV4dGVuc2lvbihjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICByZXR1cm4gZmllbGQtPmlzX2V4dGVuc2lvbigpICYmCisgICAgICAgICBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuSGFzTGF6eShmaWVsZC0+bnVtYmVyKCkpOworfQorCitib29sIFJlZmxlY3Rpb246OklzTGF6aWx5VmVyaWZpZWRMYXp5RmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBpZiAoZmllbGQtPm9wdGlvbnMoKS51bnZlcmlmaWVkX2xhenkoKSkgcmV0dXJuIHRydWU7CisKKyAgLy8gTWVzc2FnZSBmaWVsZHMgd2l0aCBbbGF6eT10cnVlXSB3aWxsIGJlIGVhZ2VybHkgdmVyaWZpZWQKKyAgLy8gKGdvL3ZlcmlmaWVkLWxhenkpLgorICByZXR1cm4gZmllbGQtPm9wdGlvbnMoKS5sYXp5KCkgJiYgIUlzRWFnZXJseVZlcmlmaWVkTGF6eUZpZWxkKGZpZWxkKTsKK30KKworYm9vbCBSZWZsZWN0aW9uOjpJc0VhZ2VybHlWZXJpZmllZExhenlGaWVsZCgKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHJldHVybiAoZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSAmJgorICAgICAgICAgIHNjaGVtYV8uSXNFYWdlcmx5VmVyaWZpZWRMYXp5RmllbGQoZmllbGQpKTsKK30KKworYm9vbCBSZWZsZWN0aW9uOjpJc0lubGluZWQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICByZXR1cm4gc2NoZW1hXy5Jc0ZpZWxkSW5saW5lZChmaWVsZCk7Cit9CisKK3NpemVfdCBSZWZsZWN0aW9uOjpTcGFjZVVzZWRMb25nKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0IHsKKyAgLy8gb2JqZWN0X3NpemVfIGFscmVhZHkgaW5jbHVkZXMgdGhlIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBlYWNoIGZpZWxkCisgIC8vIGluIHRoZSBtZXNzYWdlLCBzbyB3ZSBvbmx5IG5lZWQgdG8gYWNjb3VudCBmb3IgYWRkaXRpb25hbCBtZW1vcnkgdXNlZCBieQorICAvLyB0aGUgZmllbGRzLgorICBzaXplX3QgdG90YWxfc2l6ZSA9IHNjaGVtYV8uR2V0T2JqZWN0U2l6ZSgpOworCisgIHRvdGFsX3NpemUgKz0gR2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKS5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZygpOworCisgIC8vIElmIHRoaXMgbWVzc2FnZSBvd25zIGFuIGFyZW5hLCBhZGQgYW55IHVudXNlZCBzcGFjZSB0aGF0J3MgYmVlbiBhbGxvY2F0ZWQuCisgIGF1dG8qIGFyZW5hID0gQXJlbmE6OkludGVybmFsR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCZtZXNzYWdlKTsKKyAgaWYgKGFyZW5hICE9IG51bGxwdHIgJiYgQXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEoJm1lc3NhZ2UpID09IG51bGxwdHIgJiYKKyAgICAgIGFyZW5hLT5JbnRlcm5hbElzTWVzc2FnZU93bmVkQXJlbmEoKSkgeworICAgIHRvdGFsX3NpemUgKz0gYXJlbmEtPlNwYWNlQWxsb2NhdGVkKCkgLSBhcmVuYS0+U3BhY2VVc2VkKCk7CisgIH0KKworICBpZiAoc2NoZW1hXy5IYXNFeHRlbnNpb25TZXQoKSkgeworICAgIHRvdGFsX3NpemUgKz0gR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKCk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbGFzdF9ub25fd2Vha19maWVsZF9pbmRleF87IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvdGFsX3NpemUgKz0gR2V0UmF3PFJlcGVhdGVkRmllbGQ8TE9XRVJDQVNFPiA+KG1lc3NhZ2UsIGZpZWxkKSBcCisgICAgICAgICAgICAgICAgICAgICAgLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKCk7ICAgICAgICAgICAgICAgIFwKKyAgICBicmVhaworCisgICAgICAgIEhBTkRMRV9UWVBFKElOVDMyLCBpbnQzMl90KTsKKyAgICAgICAgSEFORExFX1RZUEUoSU5UNjQsIGludDY0X3QpOworICAgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMl90KTsKKyAgICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjRfdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlKTsKKyAgICAgICAgSEFORExFX1RZUEUoRkxPQVQsIGZsb2F0KTsKKyAgICAgICAgSEFORExFX1RZUEUoQk9PTCwgYm9vbCk7CisgICAgICAgIEhBTkRMRV9UWVBFKEVOVU0sIGludCk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgICAgdG90YWxfc2l6ZSArPQorICAgICAgICAgICAgICAgICAgR2V0UmF3PFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+ID4obWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgICAgICAgICAgICAgLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7CisgICAgICAgICAgICB0b3RhbF9zaXplICs9IEdldFJhdzxpbnRlcm5hbDo6TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHdoaWNoIHN1YmNsYXNzIG9mIFJlcGVhdGVkUHRyRmllbGRCYXNlIHRoZSB0eXBlIGlzLAorICAgICAgICAgICAgLy8gc28gd2UgdXNlIFJlcGVhdGVkUHRyRmllbGRCYXNlIGRpcmVjdGx5LgorICAgICAgICAgICAgdG90YWxfc2l6ZSArPQorICAgICAgICAgICAgICAgIEdldFJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgICAgICAgICAgIC5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZzxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoc2NoZW1hXy5JblJlYWxPbmVvZihmaWVsZCkgJiYgIUhhc09uZW9mRmllbGQobWVzc2FnZSwgZmllbGQpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgICAgIC8vIEZpZWxkIGlzIGlubGluZSwgc28gd2UndmUgYWxyZWFkeSBjb3VudGVkIGl0LgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CisgICAgICAgICAgICAgIGlmIChJc0lubGluZWQoZmllbGQpKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcqIHB0ciA9CisgICAgICAgICAgICAgICAgICAgICZHZXRGaWVsZDxJbmxpbmVkU3RyaW5nRmllbGQ+KG1lc3NhZ2UsIGZpZWxkKS5HZXROb0FyZW5hKCk7CisgICAgICAgICAgICAgICAgdG90YWxfc2l6ZSArPSBTdHJpbmdTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZygqcHRyKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBJbml0aWFsbHksIHRoZSBzdHJpbmcgcG9pbnRzIHRvIHRoZSBkZWZhdWx0IHZhbHVlIHN0b3JlZAorICAgICAgICAgICAgICAgIC8vIGluIHRoZSBwcm90b3R5cGUuIE9ubHkgY291bnQgdGhlIHN0cmluZyBpZiBpdCBoYXMgYmVlbgorICAgICAgICAgICAgICAgIC8vIGNoYW5nZWQgZnJvbSB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgICAgICAgICAgICAvLyBFeGNlcHQgb25lb2YgZmllbGRzLCB0aG9zZSBuZXZlciBwb2ludCB0byBhIGRlZmF1bHQgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgLy8gYW5kIHRoZXJlIGlzIG5vIGRlZmF1bHQgaW5zdGFuY2UgdG8gcG9pbnQgdG8uCisgICAgICAgICAgICAgICAgY29uc3QgYXV0byYgc3RyID0gR2V0RmllbGQ8QXJlbmFTdHJpbmdQdHI+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0ci5Jc0RlZmF1bHQoKSB8fCBzY2hlbWFfLkluUmVhbE9uZW9mKGZpZWxkKSkgeworICAgICAgICAgICAgICAgICAgLy8gc3RyaW5nIGZpZWxkcyBhcmUgcmVwcmVzZW50ZWQgYnkganVzdCBhIHBvaW50ZXIsIHNvIGFsc28KKyAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgc2l6ZW9mKHN0cmluZykgYXMgd2VsbC4KKyAgICAgICAgICAgICAgICAgIHRvdGFsX3NpemUgKz0gc2l6ZW9mKHN0ZDo6c3RyaW5nKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKHN0ci5HZXQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgaWYgKHNjaGVtYV8uSXNEZWZhdWx0SW5zdGFuY2UobWVzc2FnZSkpIHsKKyAgICAgICAgICAgIC8vIEZvciBzaW5ndWxhciBmaWVsZHMsIHRoZSBwcm90b3R5cGUganVzdCBzdG9yZXMgYSBwb2ludGVyIHRvIHRoZQorICAgICAgICAgICAgLy8gZXh0ZXJuYWwgdHlwZSdzIHByb3RvdHlwZSwgc28gdGhlcmUgaXMgbm8gZXh0cmEgbWVtb3J5IHVzYWdlLgorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBzdWJfbWVzc2FnZSA9IEdldFJhdzxjb25zdCBNZXNzYWdlKj4obWVzc2FnZSwgZmllbGQpOworICAgICAgICAgICAgaWYgKHN1Yl9tZXNzYWdlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgdG90YWxfc2l6ZSArPSBzdWJfbWVzc2FnZS0+U3BhY2VVc2VkTG9uZygpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK25hbWVzcGFjZSB7CisKK3RlbXBsYXRlIDxib29sIHVuc2FmZV9zaGFsbG93X3N3YXA+CitzdHJ1Y3QgT25lb2ZGaWVsZE1vdmVyIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZyb21UeXBlLCB0eXBlbmFtZSBUb1R5cGU+CisgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBGcm9tVHlwZSogZnJvbSwgVG9UeXBlKiB0bykgeworICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgICB0by0+U2V0SW50MzIoZnJvbS0+R2V0SW50MzIoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICAgIHRvLT5TZXRJbnQ2NChmcm9tLT5HZXRJbnQ2NCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6CisgICAgICAgIHRvLT5TZXRVaW50MzIoZnJvbS0+R2V0VWludDMyKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgICAgdG8tPlNldFVpbnQ2NChmcm9tLT5HZXRVaW50NjQoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICAgIHRvLT5TZXRGbG9hdChmcm9tLT5HZXRGbG9hdCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICAgIHRvLT5TZXREb3VibGUoZnJvbS0+R2V0RG91YmxlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICAgIHRvLT5TZXRCb29sKGZyb20tPkdldEJvb2woKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgICAgdG8tPlNldEVudW0oZnJvbS0+R2V0RW51bSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBpZiAoIXVuc2FmZV9zaGFsbG93X3N3YXApIHsKKyAgICAgICAgICB0by0+U2V0TWVzc2FnZShmcm9tLT5HZXRNZXNzYWdlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRvLT5VbnNhZmVTZXRNZXNzYWdlKGZyb20tPlVuc2FmZUdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIGlmICghdW5zYWZlX3NoYWxsb3dfc3dhcCkgeworICAgICAgICAgIHRvLT5TZXRTdHJpbmcoZnJvbS0+R2V0U3RyaW5nKCkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7CisgICAgICAgICAgICB0by0+U2V0QXJlbmFTdHJpbmdQdHIoZnJvbS0+R2V0QXJlbmFTdHJpbmdQdHIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAidW5pbXBsZW1lbnRlZCB0eXBlOiAiIDw8IGZpZWxkLT5jcHBfdHlwZSgpOworICAgIH0KKyAgICBpZiAodW5zYWZlX3NoYWxsb3dfc3dhcCkgeworICAgICAgLy8gTm90IGNsZWFyaW5nIG9uZW9mIGNhc2UgYWZ0ZXIgbW92ZSBtYXkgY2F1c2UgdW53YW50ZWQgIkNsZWFyT25lb2YiCisgICAgICAvLyB3aGVyZSB0aGUgcmVzaWR1YWwgbWVzc2FnZSBvciBzdHJpbmcgdmFsdWUgaXMgZGVsZXRlZCBhbmQgY2F1c2VzCisgICAgICAvLyB1c2UtYWZ0ZXItZnJlZSAob25seSBmb3IgdW5zYWZlIHN3YXApLgorICAgICAgZnJvbS0+Q2xlYXJPbmVvZkNhc2UoKTsKKyAgICB9CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjbGFzcyBTd2FwRmllbGRIZWxwZXIgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGJvb2wgdW5zYWZlX3NoYWxsb3dfc3dhcD4KKyAgc3RhdGljIHZvaWQgU3dhcFJlcGVhdGVkU3RyaW5nRmllbGQoY29uc3QgUmVmbGVjdGlvbiogciwgTWVzc2FnZSogbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIHRlbXBsYXRlIDxib29sIHVuc2FmZV9zaGFsbG93X3N3YXA+CisgIHN0YXRpYyB2b2lkIFN3YXBJbmxpbmVkU3RyaW5ncyhjb25zdCBSZWZsZWN0aW9uKiByLCBNZXNzYWdlKiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiByaHMsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIHRlbXBsYXRlIDxib29sIHVuc2FmZV9zaGFsbG93X3N3YXA+CisgIHN0YXRpYyB2b2lkIFN3YXBOb25JbmxpbmVkU3RyaW5ncyhjb25zdCBSZWZsZWN0aW9uKiByLCBNZXNzYWdlKiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiByaHMsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIHRlbXBsYXRlIDxib29sIHVuc2FmZV9zaGFsbG93X3N3YXA+CisgIHN0YXRpYyB2b2lkIFN3YXBTdHJpbmdGaWVsZChjb25zdCBSZWZsZWN0aW9uKiByLCBNZXNzYWdlKiBsaHMsIE1lc3NhZ2UqIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIHN0YXRpYyB2b2lkIFN3YXBBcmVuYVN0cmluZ1B0cihBcmVuYVN0cmluZ1B0ciogbGhzLCBBcmVuYSogbGhzX2FyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJlbmFTdHJpbmdQdHIqIHJocywgQXJlbmEqIHJoc19hcmVuYSk7CisKKyAgdGVtcGxhdGUgPGJvb2wgdW5zYWZlX3NoYWxsb3dfc3dhcD4KKyAgc3RhdGljIHZvaWQgU3dhcFJlcGVhdGVkTWVzc2FnZUZpZWxkKGNvbnN0IFJlZmxlY3Rpb24qIHIsIE1lc3NhZ2UqIGxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIHRlbXBsYXRlIDxib29sIHVuc2FmZV9zaGFsbG93X3N3YXA+CisgIHN0YXRpYyB2b2lkIFN3YXBNZXNzYWdlRmllbGQoY29uc3QgUmVmbGVjdGlvbiogciwgTWVzc2FnZSogbGhzLCBNZXNzYWdlKiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyAgc3RhdGljIHZvaWQgU3dhcE1lc3NhZ2UoY29uc3QgUmVmbGVjdGlvbiogciwgTWVzc2FnZSogbGhzLCBBcmVuYSogbGhzX2FyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiByaHMsIEFyZW5hKiByaHNfYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIHN0YXRpYyB2b2lkIFN3YXBOb25NZXNzYWdlTm9uU3RyaW5nRmllbGQoY29uc3QgUmVmbGVjdGlvbiogciwgTWVzc2FnZSogbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKK307CisKK3RlbXBsYXRlIDxib29sIHVuc2FmZV9zaGFsbG93X3N3YXA+Cit2b2lkIFN3YXBGaWVsZEhlbHBlcjo6U3dhcFJlcGVhdGVkU3RyaW5nRmllbGQoY29uc3QgUmVmbGVjdGlvbiogciwgTWVzc2FnZSogbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7CisgICAgICBhdXRvKiBsaHNfc3RyaW5nID0gci0+TXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obGhzLCBmaWVsZCk7CisgICAgICBhdXRvKiByaHNfc3RyaW5nID0gci0+TXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4ocmhzLCBmaWVsZCk7CisgICAgICBpZiAodW5zYWZlX3NoYWxsb3dfc3dhcCkgeworICAgICAgICBsaHNfc3RyaW5nLT5JbnRlcm5hbFN3YXAocmhzX3N0cmluZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBsaHNfc3RyaW5nLT5Td2FwPEdlbmVyaWNUeXBlSGFuZGxlcjxzdGQ6OnN0cmluZz4+KHJoc19zdHJpbmcpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDxib29sIHVuc2FmZV9zaGFsbG93X3N3YXA+Cit2b2lkIFN3YXBGaWVsZEhlbHBlcjo6U3dhcElubGluZWRTdHJpbmdzKGNvbnN0IFJlZmxlY3Rpb24qIHIsIE1lc3NhZ2UqIGxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIC8vIElubGluZWQgc3RyaW5nIGZpZWxkLgorICBBcmVuYSogbGhzX2FyZW5hID0gbGhzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgQXJlbmEqIHJoc19hcmVuYSA9IHJocy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGF1dG8qIGxoc19zdHJpbmcgPSByLT5NdXRhYmxlUmF3PElubGluZWRTdHJpbmdGaWVsZD4obGhzLCBmaWVsZCk7CisgIGF1dG8qIHJoc19zdHJpbmcgPSByLT5NdXRhYmxlUmF3PElubGluZWRTdHJpbmdGaWVsZD4ocmhzLCBmaWVsZCk7CisgIHVpbnQzMl90IGluZGV4ID0gci0+c2NoZW1hXy5JbmxpbmVkU3RyaW5nSW5kZXgoZmllbGQpOworICBHT09HTEVfRENIRUNLX0dUKGluZGV4LCAwKTsKKyAgdWludDMyX3QqIGxoc19hcnJheSA9IHItPk11dGFibGVJbmxpbmVkU3RyaW5nRG9uYXRlZEFycmF5KGxocyk7CisgIHVpbnQzMl90KiByaHNfYXJyYXkgPSByLT5NdXRhYmxlSW5saW5lZFN0cmluZ0RvbmF0ZWRBcnJheShyaHMpOworICB1aW50MzJfdCogbGhzX3N0YXRlID0gJmxoc19hcnJheVtpbmRleCAvIDMyXTsKKyAgdWludDMyX3QqIHJoc19zdGF0ZSA9ICZyaHNfYXJyYXlbaW5kZXggLyAzMl07CisgIGJvb2wgbGhzX2FyZW5hX2R0b3JfcmVnaXN0ZXJlZCA9IChsaHNfYXJyYXlbMF0gJiAweDF1KSA9PSAwOworICBib29sIHJoc19hcmVuYV9kdG9yX3JlZ2lzdGVyZWQgPSAocmhzX2FycmF5WzBdICYgMHgxdSkgPT0gMDsKKyAgY29uc3QgdWludDMyX3QgbWFzayA9IH4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDEpIDw8IChpbmRleCAlIDMyKSk7CisgIGlmICh1bnNhZmVfc2hhbGxvd19zd2FwIHx8IGxoc19hcmVuYSA9PSByaHNfYXJlbmEpIHsKKyAgICBJbmxpbmVkU3RyaW5nRmllbGQ6OkludGVybmFsU3dhcChsaHNfc3RyaW5nLCBsaHNfYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGhzX2FyZW5hX2R0b3JfcmVnaXN0ZXJlZCwgbGhzLCByaHNfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJoc19hcmVuYSwgcmhzX2FyZW5hX2R0b3JfcmVnaXN0ZXJlZCwgcmhzKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyB0ZW1wID0gbGhzX3N0cmluZy0+R2V0KCk7CisgICAgbGhzX3N0cmluZy0+U2V0KHJoc19zdHJpbmctPkdldCgpLCBsaHNfYXJlbmEsCisgICAgICAgICAgICAgICAgICAgIHItPklzSW5saW5lZFN0cmluZ0RvbmF0ZWQoKmxocywgZmllbGQpLCBsaHNfc3RhdGUsIG1hc2ssCisgICAgICAgICAgICAgICAgICAgIGxocyk7CisgICAgcmhzX3N0cmluZy0+U2V0KHRlbXAsIHJoc19hcmVuYSwgci0+SXNJbmxpbmVkU3RyaW5nRG9uYXRlZCgqcmhzLCBmaWVsZCksCisgICAgICAgICAgICAgICAgICAgIHJoc19zdGF0ZSwgbWFzaywgcmhzKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Ym9vbCB1bnNhZmVfc2hhbGxvd19zd2FwPgordm9pZCBTd2FwRmllbGRIZWxwZXI6OlN3YXBOb25JbmxpbmVkU3RyaW5ncyhjb25zdCBSZWZsZWN0aW9uKiByLCBNZXNzYWdlKiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBBcmVuYVN0cmluZ1B0ciogbGhzX3N0cmluZyA9IHItPk11dGFibGVSYXc8QXJlbmFTdHJpbmdQdHI+KGxocywgZmllbGQpOworICBBcmVuYVN0cmluZ1B0ciogcmhzX3N0cmluZyA9IHItPk11dGFibGVSYXc8QXJlbmFTdHJpbmdQdHI+KHJocywgZmllbGQpOworICBpZiAodW5zYWZlX3NoYWxsb3dfc3dhcCkgeworICAgIEFyZW5hU3RyaW5nUHRyOjpVbnNhZmVTaGFsbG93U3dhcChsaHNfc3RyaW5nLCByaHNfc3RyaW5nKTsKKyAgfSBlbHNlIHsKKyAgICBTd2FwRmllbGRIZWxwZXI6OlN3YXBBcmVuYVN0cmluZ1B0cigKKyAgICAgICAgbGhzX3N0cmluZywgbGhzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSwgIC8vCisgICAgICAgIHJoc19zdHJpbmcsIHJocy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9Cit9CisKK3RlbXBsYXRlIDxib29sIHVuc2FmZV9zaGFsbG93X3N3YXA+Cit2b2lkIFN3YXBGaWVsZEhlbHBlcjo6U3dhcFN0cmluZ0ZpZWxkKGNvbnN0IFJlZmxlY3Rpb24qIHIsIE1lc3NhZ2UqIGxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7CisgICAgICBpZiAoci0+SXNJbmxpbmVkKGZpZWxkKSkgeworICAgICAgICBTd2FwRmllbGRIZWxwZXI6OlN3YXBJbmxpbmVkU3RyaW5nczx1bnNhZmVfc2hhbGxvd19zd2FwPihyLCBsaHMsIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU3dhcEZpZWxkSGVscGVyOjpTd2FwTm9uSW5saW5lZFN0cmluZ3M8dW5zYWZlX3NoYWxsb3dfc3dhcD4ociwgbGhzLCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit2b2lkIFN3YXBGaWVsZEhlbHBlcjo6U3dhcEFyZW5hU3RyaW5nUHRyKEFyZW5hU3RyaW5nUHRyKiBsaHMsIEFyZW5hKiBsaHNfYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZW5hU3RyaW5nUHRyKiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZW5hKiByaHNfYXJlbmEpIHsKKyAgaWYgKGxoc19hcmVuYSA9PSByaHNfYXJlbmEpIHsKKyAgICBBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKGxocywgbGhzX2FyZW5hLCByaHMsIHJoc19hcmVuYSk7CisgIH0gZWxzZSBpZiAobGhzLT5Jc0RlZmF1bHQoKSAmJiByaHMtPklzRGVmYXVsdCgpKSB7CisgICAgLy8gTm90aGluZyB0byBkby4KKyAgfSBlbHNlIGlmIChsaHMtPklzRGVmYXVsdCgpKSB7CisgICAgbGhzLT5TZXQocmhzLT5HZXQoKSwgbGhzX2FyZW5hKTsKKyAgICAvLyByaHMgbmVlZHMgdG8gYmUgZGVzdHJveWVkIGJlZm9yZSBvdmVyd3JpdHRlbi4KKyAgICByaHMtPkRlc3Ryb3koKTsKKyAgICByaHMtPkluaXREZWZhdWx0KCk7CisgIH0gZWxzZSBpZiAocmhzLT5Jc0RlZmF1bHQoKSkgeworICAgIHJocy0+U2V0KGxocy0+R2V0KCksIHJoc19hcmVuYSk7CisgICAgLy8gbGhzIG5lZWRzIHRvIGJlIGRlc3Ryb3llZCBiZWZvcmUgb3ZlcndyaXR0ZW4uCisgICAgbGhzLT5EZXN0cm95KCk7CisgICAgbGhzLT5Jbml0RGVmYXVsdCgpOworICB9IGVsc2UgeworICAgIHN0ZDo6c3RyaW5nIHRlbXAgPSBsaHMtPkdldCgpOworICAgIGxocy0+U2V0KHJocy0+R2V0KCksIGxoc19hcmVuYSk7CisgICAgcmhzLT5TZXQoc3RkOjptb3ZlKHRlbXApLCByaHNfYXJlbmEpOworICB9Cit9CisKK3RlbXBsYXRlIDxib29sIHVuc2FmZV9zaGFsbG93X3N3YXA+Cit2b2lkIFN3YXBGaWVsZEhlbHBlcjo6U3dhcFJlcGVhdGVkTWVzc2FnZUZpZWxkKGNvbnN0IFJlZmxlY3Rpb24qIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIGxocywgTWVzc2FnZSogcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7CisgICAgYXV0byogbGhzX21hcCA9IHItPk11dGFibGVSYXc8TWFwRmllbGRCYXNlPihsaHMsIGZpZWxkKTsKKyAgICBhdXRvKiByaHNfbWFwID0gci0+TXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KHJocywgZmllbGQpOworICAgIGlmICh1bnNhZmVfc2hhbGxvd19zd2FwKSB7CisgICAgICBsaHNfbWFwLT5VbnNhZmVTaGFsbG93U3dhcChyaHNfbWFwKTsKKyAgICB9IGVsc2UgeworICAgICAgbGhzX21hcC0+U3dhcChyaHNfbWFwKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgYXV0byogbGhzX3JtID0gci0+TXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obGhzLCBmaWVsZCk7CisgICAgYXV0byogcmhzX3JtID0gci0+TXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4ocmhzLCBmaWVsZCk7CisgICAgaWYgKHVuc2FmZV9zaGFsbG93X3N3YXApIHsKKyAgICAgIGxoc19ybS0+SW50ZXJuYWxTd2FwKHJoc19ybSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxoc19ybS0+U3dhcDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4+KHJoc19ybSk7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDxib29sIHVuc2FmZV9zaGFsbG93X3N3YXA+Cit2b2lkIFN3YXBGaWVsZEhlbHBlcjo6U3dhcE1lc3NhZ2VGaWVsZChjb25zdCBSZWZsZWN0aW9uKiByLCBNZXNzYWdlKiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGlmICh1bnNhZmVfc2hhbGxvd19zd2FwKSB7CisgICAgc3RkOjpzd2FwKCpyLT5NdXRhYmxlUmF3PE1lc3NhZ2UqPihsaHMsIGZpZWxkKSwKKyAgICAgICAgICAgICAgKnItPk11dGFibGVSYXc8TWVzc2FnZSo+KHJocywgZmllbGQpKTsKKyAgfSBlbHNlIHsKKyAgICBTd2FwTWVzc2FnZShyLCBsaHMsIGxocy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCksIHJocywKKyAgICAgICAgICAgICAgICByaHMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpLCBmaWVsZCk7CisgIH0KK30KKwordm9pZCBTd2FwRmllbGRIZWxwZXI6OlN3YXBNZXNzYWdlKGNvbnN0IFJlZmxlY3Rpb24qIHIsIE1lc3NhZ2UqIGxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmVuYSogbGhzX2FyZW5hLCBNZXNzYWdlKiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJlbmEqIHJoc19hcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIE1lc3NhZ2UqKiBsaHNfc3ViID0gci0+TXV0YWJsZVJhdzxNZXNzYWdlKj4obGhzLCBmaWVsZCk7CisgIE1lc3NhZ2UqKiByaHNfc3ViID0gci0+TXV0YWJsZVJhdzxNZXNzYWdlKj4ocmhzLCBmaWVsZCk7CisKKyAgaWYgKCpsaHNfc3ViID09ICpyaHNfc3ViKSByZXR1cm47CisKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgaWYgKGxoc19hcmVuYSAhPSBudWxscHRyICYmIGxoc19hcmVuYSA9PSByaHNfYXJlbmEpIHsKKyNlbHNlICAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgIGlmIChsaHNfYXJlbmEgPT0gcmhzX2FyZW5hKSB7CisjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBzdGQ6OnN3YXAoKmxoc19zdWIsICpyaHNfc3ViKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoKmxoc19zdWIgIT0gbnVsbHB0ciAmJiAqcmhzX3N1YiAhPSBudWxscHRyKSB7CisgICAgKCpsaHNfc3ViKS0+R2V0UmVmbGVjdGlvbigpLT5Td2FwKCpsaHNfc3ViLCAqcmhzX3N1Yik7CisgIH0gZWxzZSBpZiAoKmxoc19zdWIgPT0gbnVsbHB0ciAmJiByLT5IYXNCaXQoKnJocywgZmllbGQpKSB7CisgICAgKmxoc19zdWIgPSAoKnJoc19zdWIpLT5OZXcobGhzX2FyZW5hKTsKKyAgICAoKmxoc19zdWIpLT5Db3B5RnJvbSgqKnJoc19zdWIpOworICAgIHItPkNsZWFyRmllbGQocmhzLCBmaWVsZCk7CisgICAgLy8gRW5zdXJlcyBoYXMgYml0IGlzIHVuY2hhbmdlZCBhZnRlciBDbGVhckZpZWxkLgorICAgIHItPlNldEJpdChyaHMsIGZpZWxkKTsKKyAgfSBlbHNlIGlmICgqcmhzX3N1YiA9PSBudWxscHRyICYmIHItPkhhc0JpdCgqbGhzLCBmaWVsZCkpIHsKKyAgICAqcmhzX3N1YiA9ICgqbGhzX3N1YiktPk5ldyhyaHNfYXJlbmEpOworICAgICgqcmhzX3N1YiktPkNvcHlGcm9tKCoqbGhzX3N1Yik7CisgICAgci0+Q2xlYXJGaWVsZChsaHMsIGZpZWxkKTsKKyAgICAvLyBFbnN1cmVzIGhhcyBiaXQgaXMgdW5jaGFuZ2VkIGFmdGVyIENsZWFyRmllbGQuCisgICAgci0+U2V0Qml0KGxocywgZmllbGQpOworICB9Cit9CisKK3ZvaWQgU3dhcEZpZWxkSGVscGVyOjpTd2FwTm9uTWVzc2FnZU5vblN0cmluZ0ZpZWxkKAorICAgIGNvbnN0IFJlZmxlY3Rpb24qIHIsIE1lc3NhZ2UqIGxocywgTWVzc2FnZSogcmhzLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworI2RlZmluZSBTV0FQX1ZBTFVFUyhDUFBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICBcCisgICAgc3RkOjpzd2FwKCpyLT5NdXRhYmxlUmF3PFRZUEU+KGxocywgZmllbGQpLCAgXAorICAgICAgICAgICAgICAqci0+TXV0YWJsZVJhdzxUWVBFPihyaHMsIGZpZWxkKSk7IFwKKyAgICBicmVhazsKKworICAgIFNXQVBfVkFMVUVTKElOVDMyLCBpbnQzMl90KTsKKyAgICBTV0FQX1ZBTFVFUyhJTlQ2NCwgaW50NjRfdCk7CisgICAgU1dBUF9WQUxVRVMoVUlOVDMyLCB1aW50MzJfdCk7CisgICAgU1dBUF9WQUxVRVMoVUlOVDY0LCB1aW50NjRfdCk7CisgICAgU1dBUF9WQUxVRVMoRkxPQVQsIGZsb2F0KTsKKyAgICBTV0FQX1ZBTFVFUyhET1VCTEUsIGRvdWJsZSk7CisgICAgU1dBUF9WQUxVRVMoQk9PTCwgYm9vbCk7CisgICAgU1dBUF9WQUxVRVMoRU5VTSwgaW50KTsKKyN1bmRlZiBTV0FQX1ZBTFVFUworICAgIGRlZmF1bHQ6CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5pbXBsZW1lbnRlZCB0eXBlOiAiIDw8IGZpZWxkLT5jcHBfdHlwZSgpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit2b2lkIFJlZmxlY3Rpb246OlN3YXBGaWVsZChNZXNzYWdlKiBtZXNzYWdlMSwgTWVzc2FnZSogbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgU1dBUF9BUlJBWVMoQ1BQVFlQRSwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE11dGFibGVSYXc8UmVwZWF0ZWRGaWVsZDxUWVBFPiA+KG1lc3NhZ2UxLCBmaWVsZCkgICAgICAgICAgICAgIFwKKyAgICAgICAgLT5Td2FwKE11dGFibGVSYXc8UmVwZWF0ZWRGaWVsZDxUWVBFPiA+KG1lc3NhZ2UyLCBmaWVsZCkpOyBcCisgICAgYnJlYWs7CisKKyAgICAgIFNXQVBfQVJSQVlTKElOVDMyLCBpbnQzMl90KTsKKyAgICAgIFNXQVBfQVJSQVlTKElOVDY0LCBpbnQ2NF90KTsKKyAgICAgIFNXQVBfQVJSQVlTKFVJTlQzMiwgdWludDMyX3QpOworICAgICAgU1dBUF9BUlJBWVMoVUlOVDY0LCB1aW50NjRfdCk7CisgICAgICBTV0FQX0FSUkFZUyhGTE9BVCwgZmxvYXQpOworICAgICAgU1dBUF9BUlJBWVMoRE9VQkxFLCBkb3VibGUpOworICAgICAgU1dBUF9BUlJBWVMoQk9PTCwgYm9vbCk7CisgICAgICBTV0FQX0FSUkFZUyhFTlVNLCBpbnQpOworI3VuZGVmIFNXQVBfQVJSQVlTCisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgaW50ZXJuYWw6OlN3YXBGaWVsZEhlbHBlcjo6U3dhcFJlcGVhdGVkU3RyaW5nRmllbGQ8ZmFsc2U+KAorICAgICAgICAgICAgdGhpcywgbWVzc2FnZTEsIG1lc3NhZ2UyLCBmaWVsZCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgaW50ZXJuYWw6OlN3YXBGaWVsZEhlbHBlcjo6U3dhcFJlcGVhdGVkTWVzc2FnZUZpZWxkPGZhbHNlPigKKyAgICAgICAgICAgIHRoaXMsIG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGQpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgdHlwZTogIiA8PCBmaWVsZC0+Y3BwX3R5cGUoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgaW50ZXJuYWw6OlN3YXBGaWVsZEhlbHBlcjo6U3dhcE1lc3NhZ2VGaWVsZDxmYWxzZT4odGhpcywgbWVzc2FnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UyLCBmaWVsZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIGludGVybmFsOjpTd2FwRmllbGRIZWxwZXI6OlN3YXBTdHJpbmdGaWVsZDxmYWxzZT4odGhpcywgbWVzc2FnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTIsIGZpZWxkKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpbnRlcm5hbDo6U3dhcEZpZWxkSGVscGVyOjpTd2FwTm9uTWVzc2FnZU5vblN0cmluZ0ZpZWxkKAorICAgICAgICAgICAgdGhpcywgbWVzc2FnZTEsIG1lc3NhZ2UyLCBmaWVsZCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgUmVmbGVjdGlvbjo6VW5zYWZlU2hhbGxvd1N3YXBGaWVsZChNZXNzYWdlKiBtZXNzYWdlMSwgTWVzc2FnZSogbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBpbnRlcm5hbDo6U3dhcEZpZWxkSGVscGVyOjpTd2FwTWVzc2FnZUZpZWxkPHRydWU+KHRoaXMsIG1lc3NhZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlMiwgZmllbGQpOworICAgIH0gZWxzZSBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORykgeworICAgICAgaW50ZXJuYWw6OlN3YXBGaWVsZEhlbHBlcjo6U3dhcFN0cmluZ0ZpZWxkPHRydWU+KHRoaXMsIG1lc3NhZ2UxLCBtZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGludGVybmFsOjpTd2FwRmllbGRIZWxwZXI6OlN3YXBOb25NZXNzYWdlTm9uU3RyaW5nRmllbGQodGhpcywgbWVzc2FnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UyLCBmaWVsZCk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgU0hBTExPV19TV0FQX0FSUkFZUyhDUFBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTXV0YWJsZVJhdzxSZXBlYXRlZEZpZWxkPFRZUEU+PihtZXNzYWdlMSwgZmllbGQpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLT5JbnRlcm5hbFN3YXAoTXV0YWJsZVJhdzxSZXBlYXRlZEZpZWxkPFRZUEU+PihtZXNzYWdlMiwgZmllbGQpKTsgXAorICAgIGJyZWFrOworCisgICAgU0hBTExPV19TV0FQX0FSUkFZUyhJTlQzMiwgaW50MzJfdCk7CisgICAgU0hBTExPV19TV0FQX0FSUkFZUyhJTlQ2NCwgaW50NjRfdCk7CisgICAgU0hBTExPV19TV0FQX0FSUkFZUyhVSU5UMzIsIHVpbnQzMl90KTsKKyAgICBTSEFMTE9XX1NXQVBfQVJSQVlTKFVJTlQ2NCwgdWludDY0X3QpOworICAgIFNIQUxMT1dfU1dBUF9BUlJBWVMoRkxPQVQsIGZsb2F0KTsKKyAgICBTSEFMTE9XX1NXQVBfQVJSQVlTKERPVUJMRSwgZG91YmxlKTsKKyAgICBTSEFMTE9XX1NXQVBfQVJSQVlTKEJPT0wsIGJvb2wpOworICAgIFNIQUxMT1dfU1dBUF9BUlJBWVMoRU5VTSwgaW50KTsKKyN1bmRlZiBTSEFMTE9XX1NXQVBfQVJSQVlTCisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICBpbnRlcm5hbDo6U3dhcEZpZWxkSGVscGVyOjpTd2FwUmVwZWF0ZWRTdHJpbmdGaWVsZDx0cnVlPih0aGlzLCBtZXNzYWdlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UyLCBmaWVsZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgaW50ZXJuYWw6OlN3YXBGaWVsZEhlbHBlcjo6U3dhcFJlcGVhdGVkTWVzc2FnZUZpZWxkPHRydWU+KAorICAgICAgICAgIHRoaXMsIG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGQpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgdHlwZTogIiA8PCBmaWVsZC0+Y3BwX3R5cGUoKTsKKyAgfQorfQorCisvLyBTd2FwcyBvbmVvZiBmaWVsZCBiZXR3ZWVuIGxocyBhbmQgcmhzLiBJZiB1bnNhZmVfc2hhbGxvd19zd2FwIGlzIHRydWUsIGl0CisvLyBkaXJlY3RseSBzd2FwcyBvbmVvZiB2YWx1ZXM7IG90aGVyd2lzZSwgaXQgbWF5IGludm9sdmUgY29weS9kZWxldGUuIE5vdGUgdGhhdAorLy8gdHdvIG1lc3NhZ2VzIG1heSBoYXZlIGRpZmZlcmVudCBvbmVvZiBjYXNlcy4gU28sIGl0IGhhcyB0byBiZSBkb25lIGluIHRocmVlCisvLyBzdGVwcyAoaS5lLiBsaHMgLT4gdGVtcCwgcmhzIC0+IGxocywgdGVtcCAtPiByaHMpLgordGVtcGxhdGUgPGJvb2wgdW5zYWZlX3NoYWxsb3dfc3dhcD4KK3ZvaWQgUmVmbGVjdGlvbjo6U3dhcE9uZW9mRmllbGQoTWVzc2FnZSogbGhzLCBNZXNzYWdlKiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvcikgY29uc3QgeworICAvLyBXcmFwcyBhIGxvY2FsIHZhcmlhYmxlIHRvIHRlbXBvcmFyaWx5IHN0b3JlIG9uZW9mIHZhbHVlLgorICBzdHJ1Y3QgTG9jYWxWYXJXcmFwcGVyIHsKKyNkZWZpbmUgTE9DQUxfVkFSX0FDQ0VTU09SKHR5cGUsIHZhciwgbmFtZSkgICAgICAgICAgICAgICBcCisgIHR5cGUgR2V0IyNuYW1lKCkgY29uc3QgeyByZXR1cm4gb25lb2ZfdmFsLnR5cGVfIyN2YXI7IH0gXAorICB2b2lkIFNldCMjbmFtZSh0eXBlIHYpIHsgb25lb2ZfdmFsLnR5cGVfIyN2YXIgPSB2OyB9CisKKyAgICBMT0NBTF9WQVJfQUNDRVNTT1IoaW50MzJfdCwgaW50MzIsIEludDMyKTsKKyAgICBMT0NBTF9WQVJfQUNDRVNTT1IoaW50NjRfdCwgaW50NjQsIEludDY0KTsKKyAgICBMT0NBTF9WQVJfQUNDRVNTT1IodWludDMyX3QsIHVpbnQzMiwgVWludDMyKTsKKyAgICBMT0NBTF9WQVJfQUNDRVNTT1IodWludDY0X3QsIHVpbnQ2NCwgVWludDY0KTsKKyAgICBMT0NBTF9WQVJfQUNDRVNTT1IoZmxvYXQsIGZsb2F0LCBGbG9hdCk7CisgICAgTE9DQUxfVkFSX0FDQ0VTU09SKGRvdWJsZSwgZG91YmxlLCBEb3VibGUpOworICAgIExPQ0FMX1ZBUl9BQ0NFU1NPUihib29sLCBib29sLCBCb29sKTsKKyAgICBMT0NBTF9WQVJfQUNDRVNTT1IoaW50LCBlbnVtLCBFbnVtKTsKKyAgICBMT0NBTF9WQVJfQUNDRVNTT1IoTWVzc2FnZSosIG1lc3NhZ2UsIE1lc3NhZ2UpOworICAgIExPQ0FMX1ZBUl9BQ0NFU1NPUihBcmVuYVN0cmluZ1B0ciwgYXJlbmFfc3RyaW5nX3B0ciwgQXJlbmFTdHJpbmdQdHIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBzdHJpbmdfdmFsOyB9CisgICAgdm9pZCBTZXRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHYpIHsgc3RyaW5nX3ZhbCA9IHY7IH0KKyAgICBNZXNzYWdlKiBVbnNhZmVHZXRNZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gR2V0TWVzc2FnZSgpOyB9CisgICAgdm9pZCBVbnNhZmVTZXRNZXNzYWdlKE1lc3NhZ2UqIHYpIHsgU2V0TWVzc2FnZSh2KTsgfQorICAgIHZvaWQgQ2xlYXJPbmVvZkNhc2UoKSB7fQorCisgICAgdW5pb24geworICAgICAgaW50MzJfdCB0eXBlX2ludDMyOworICAgICAgaW50NjRfdCB0eXBlX2ludDY0OworICAgICAgdWludDMyX3QgdHlwZV91aW50MzI7CisgICAgICB1aW50NjRfdCB0eXBlX3VpbnQ2NDsKKyAgICAgIGZsb2F0IHR5cGVfZmxvYXQ7CisgICAgICBkb3VibGUgdHlwZV9kb3VibGU7CisgICAgICBib29sIHR5cGVfYm9vbDsKKyAgICAgIGludCB0eXBlX2VudW07CisgICAgICBNZXNzYWdlKiB0eXBlX21lc3NhZ2U7CisgICAgICBpbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgdHlwZV9hcmVuYV9zdHJpbmdfcHRyOworICAgIH0gb25lb2ZfdmFsOworCisgICAgLy8gc3RkOjpzdHJpbmcgY2Fubm90IGJlIGluIHVuaW9uLgorICAgIHN0ZDo6c3RyaW5nIHN0cmluZ192YWw7CisgIH07CisKKyAgLy8gV3JhcHMgYSBtZXNzYWdlIHBvaW50ZXIgdG8gcmVhZCBhbmQgd3JpdGUgYSBmaWVsZC4KKyAgc3RydWN0IE1lc3NhZ2VXcmFwcGVyIHsKKyNkZWZpbmUgTUVTU0FHRV9GSUVMRF9BQ0NFU1NPUih0eXBlLCB2YXIsIG5hbWUpICAgICAgICAgXAorICB0eXBlIEdldCMjbmFtZSgpIGNvbnN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHJlZmxlY3Rpb24tPkdldEZpZWxkPHR5cGU+KCptZXNzYWdlLCBmaWVsZCk7IFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIFNldCMjbmFtZSh0eXBlIHYpIHsgcmVmbGVjdGlvbi0+U2V0RmllbGQ8dHlwZT4obWVzc2FnZSwgZmllbGQsIHYpOyB9CisKKyAgICBNRVNTQUdFX0ZJRUxEX0FDQ0VTU09SKGludDMyX3QsIGludDMyLCBJbnQzMik7CisgICAgTUVTU0FHRV9GSUVMRF9BQ0NFU1NPUihpbnQ2NF90LCBpbnQ2NCwgSW50NjQpOworICAgIE1FU1NBR0VfRklFTERfQUNDRVNTT1IodWludDMyX3QsIHVpbnQzMiwgVWludDMyKTsKKyAgICBNRVNTQUdFX0ZJRUxEX0FDQ0VTU09SKHVpbnQ2NF90LCB1aW50NjQsIFVpbnQ2NCk7CisgICAgTUVTU0FHRV9GSUVMRF9BQ0NFU1NPUihmbG9hdCwgZmxvYXQsIEZsb2F0KTsKKyAgICBNRVNTQUdFX0ZJRUxEX0FDQ0VTU09SKGRvdWJsZSwgZG91YmxlLCBEb3VibGUpOworICAgIE1FU1NBR0VfRklFTERfQUNDRVNTT1IoYm9vbCwgYm9vbCwgQm9vbCk7CisgICAgTUVTU0FHRV9GSUVMRF9BQ0NFU1NPUihpbnQsIGVudW0sIEVudW0pOworICAgIE1FU1NBR0VfRklFTERfQUNDRVNTT1IoQXJlbmFTdHJpbmdQdHIsIGFyZW5hX3N0cmluZ19wdHIsIEFyZW5hU3RyaW5nUHRyKTsKKyAgICBzdGQ6OnN0cmluZyBHZXRTdHJpbmcoKSBjb25zdCB7CisgICAgICByZXR1cm4gcmVmbGVjdGlvbi0+R2V0U3RyaW5nKCptZXNzYWdlLCBmaWVsZCk7CisgICAgfQorICAgIHZvaWQgU2V0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiB2KSB7CisgICAgICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgZmllbGQsIHYpOworICAgIH0KKyAgICBNZXNzYWdlKiBHZXRNZXNzYWdlKCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlZmxlY3Rpb24tPlJlbGVhc2VNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkKTsKKyAgICB9CisgICAgdm9pZCBTZXRNZXNzYWdlKE1lc3NhZ2UqIHYpIHsKKyAgICAgIHJlZmxlY3Rpb24tPlNldEFsbG9jYXRlZE1lc3NhZ2UobWVzc2FnZSwgdiwgZmllbGQpOworICAgIH0KKyAgICBNZXNzYWdlKiBVbnNhZmVHZXRNZXNzYWdlKCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlZmxlY3Rpb24tPlVuc2FmZUFyZW5hUmVsZWFzZU1lc3NhZ2UobWVzc2FnZSwgZmllbGQpOworICAgIH0KKyAgICB2b2lkIFVuc2FmZVNldE1lc3NhZ2UoTWVzc2FnZSogdikgeworICAgICAgcmVmbGVjdGlvbi0+VW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWRNZXNzYWdlKG1lc3NhZ2UsIHYsIGZpZWxkKTsKKyAgICB9CisgICAgdm9pZCBDbGVhck9uZW9mQ2FzZSgpIHsKKyAgICAgICpyZWZsZWN0aW9uLT5NdXRhYmxlT25lb2ZDYXNlKG1lc3NhZ2UsIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpID0gMDsKKyAgICB9CisKKyAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uOworICAgIE1lc3NhZ2UqIG1lc3NhZ2U7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZDsKKyAgfTsKKworICBHT09HTEVfRENIRUNLKCFvbmVvZl9kZXNjcmlwdG9yLT5pc19zeW50aGV0aWMoKSk7CisgIHVpbnQzMl90IG9uZW9mX2Nhc2VfbGhzID0gR2V0T25lb2ZDYXNlKCpsaHMsIG9uZW9mX2Rlc2NyaXB0b3IpOworICB1aW50MzJfdCBvbmVvZl9jYXNlX3JocyA9IEdldE9uZW9mQ2FzZSgqcmhzLCBvbmVvZl9kZXNjcmlwdG9yKTsKKworICBMb2NhbFZhcldyYXBwZXIgdGVtcDsKKyAgTWVzc2FnZVdyYXBwZXIgbGhzX3dyYXBwZXIsIHJoc193cmFwcGVyOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2xocyA9IG51bGxwdHI7CisgIE9uZW9mRmllbGRNb3Zlcjx1bnNhZmVfc2hhbGxvd19zd2FwPiBtb3ZlcjsKKyAgLy8gbGhzIC0tPiB0ZW1wCisgIGlmIChvbmVvZl9jYXNlX2xocyA+IDApIHsKKyAgICBmaWVsZF9saHMgPSBkZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOdW1iZXIob25lb2ZfY2FzZV9saHMpOworICAgIGxoc193cmFwcGVyID0ge3RoaXMsIGxocywgZmllbGRfbGhzfTsKKyAgICBtb3ZlcihmaWVsZF9saHMsICZsaHNfd3JhcHBlciwgJnRlbXApOworICB9CisgIC8vIHJocyAtLT4gbGhzCisgIGlmIChvbmVvZl9jYXNlX3JocyA+IDApIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGYgPSBkZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOdW1iZXIob25lb2ZfY2FzZV9yaHMpOworICAgIGxoc193cmFwcGVyID0ge3RoaXMsIGxocywgZn07CisgICAgcmhzX3dyYXBwZXIgPSB7dGhpcywgcmhzLCBmfTsKKyAgICBtb3ZlcihmLCAmcmhzX3dyYXBwZXIsICZsaHNfd3JhcHBlcik7CisgIH0gZWxzZSBpZiAoIXVuc2FmZV9zaGFsbG93X3N3YXApIHsKKyAgICBDbGVhck9uZW9mKGxocywgb25lb2ZfZGVzY3JpcHRvcik7CisgIH0KKyAgLy8gdGVtcCAtLT4gcmhzCisgIGlmIChvbmVvZl9jYXNlX2xocyA+IDApIHsKKyAgICByaHNfd3JhcHBlciA9IHt0aGlzLCByaHMsIGZpZWxkX2xoc307CisgICAgbW92ZXIoZmllbGRfbGhzLCAmdGVtcCwgJnJoc193cmFwcGVyKTsKKyAgfSBlbHNlIGlmICghdW5zYWZlX3NoYWxsb3dfc3dhcCkgeworICAgIENsZWFyT25lb2YocmhzLCBvbmVvZl9kZXNjcmlwdG9yKTsKKyAgfQorCisgIGlmICh1bnNhZmVfc2hhbGxvd19zd2FwKSB7CisgICAgKk11dGFibGVPbmVvZkNhc2UobGhzLCBvbmVvZl9kZXNjcmlwdG9yKSA9IG9uZW9mX2Nhc2VfcmhzOworICAgICpNdXRhYmxlT25lb2ZDYXNlKHJocywgb25lb2ZfZGVzY3JpcHRvcikgPSBvbmVvZl9jYXNlX2xoczsKKyAgfQorfQorCit2b2lkIFJlZmxlY3Rpb246OlN3YXAoTWVzc2FnZSogbWVzc2FnZTEsIE1lc3NhZ2UqIG1lc3NhZ2UyKSBjb25zdCB7CisgIGlmIChtZXNzYWdlMSA9PSBtZXNzYWdlMikgcmV0dXJuOworCisgIC8vIFRPRE8oa2VudG9uKTogIE90aGVyIFJlZmxlY3Rpb24gbWV0aG9kcyBzaG91bGQgcHJvYmFibHkgY2hlY2sgdGhpcyB0b28uCisgIEdPT0dMRV9DSEVDS19FUShtZXNzYWdlMS0+R2V0UmVmbGVjdGlvbigpLCB0aGlzKQorICAgICAgPDwgIkZpcnN0IGFyZ3VtZW50IHRvIFN3YXAoKSAob2YgdHlwZSBcIiIKKyAgICAgIDw8IG1lc3NhZ2UxLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpCisgICAgICA8PCAiXCIpIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyByZWZsZWN0aW9uIG9iamVjdCAod2hpY2ggaXMgZm9yIHR5cGUgIgorICAgICAgICAgIlwiIgorICAgICAgPDwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpCisgICAgICA8PCAiXCIpLiAgTm90ZSB0aGF0IHRoZSBleGFjdCBzYW1lIGNsYXNzIGlzIHJlcXVpcmVkOyBub3QganVzdCB0aGUgc2FtZSAiCisgICAgICAgICAiZGVzY3JpcHRvci4iOworICBHT09HTEVfQ0hFQ0tfRVEobWVzc2FnZTItPkdldFJlZmxlY3Rpb24oKSwgdGhpcykKKyAgICAgIDw8ICJTZWNvbmQgYXJndW1lbnQgdG8gU3dhcCgpIChvZiB0eXBlIFwiIgorICAgICAgPDwgbWVzc2FnZTItPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkKKyAgICAgIDw8ICJcIikgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIHJlZmxlY3Rpb24gb2JqZWN0ICh3aGljaCBpcyBmb3IgdHlwZSAiCisgICAgICAgICAiXCIiCisgICAgICA8PCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkKKyAgICAgIDw8ICJcIikuICBOb3RlIHRoYXQgdGhlIGV4YWN0IHNhbWUgY2xhc3MgaXMgcmVxdWlyZWQ7IG5vdCBqdXN0IHRoZSBzYW1lICIKKyAgICAgICAgICJkZXNjcmlwdG9yLiI7CisKKyAgLy8gQ2hlY2sgdGhhdCBib3RoIG1lc3NhZ2VzIGFyZSBpbiB0aGUgc2FtZSBhcmVuYSAob3IgYm90aCBvbiB0aGUgaGVhcCkuIFdlCisgIC8vIG5lZWQgdG8gY29weSBhbGwgZGF0YSBpZiBub3QsIGR1ZSB0byBvd25lcnNoaXAgc2VtYW50aWNzLgorI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICBpZiAobWVzc2FnZTEtPkdldE93bmluZ0FyZW5hKCkgPT0gbnVsbHB0ciB8fAorICAgICAgbWVzc2FnZTEtPkdldE93bmluZ0FyZW5hKCkgIT0gbWVzc2FnZTItPkdldE93bmluZ0FyZW5hKCkpIHsKKyNlbHNlICAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgIGlmIChtZXNzYWdlMS0+R2V0T3duaW5nQXJlbmEoKSAhPSBtZXNzYWdlMi0+R2V0T3duaW5nQXJlbmEoKSkgeworI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgLy8gT25lIG9mIHRoZSB0d28gaXMgZ3VhcmFudGVlZCB0byBoYXZlIGFuIGFyZW5hLiAgU3dpdGNoIHRoaW5ncyBhcm91bmQKKyAgICAvLyB0byBndWFyYW50ZWUgdGhhdCBtZXNzYWdlMSBoYXMgYW4gYXJlbmEuCisgICAgQXJlbmEqIGFyZW5hID0gbWVzc2FnZTEtPkdldE93bmluZ0FyZW5hKCk7CisgICAgaWYgKGFyZW5hID09IG51bGxwdHIpIHsKKyAgICAgIGFyZW5hID0gbWVzc2FnZTItPkdldE93bmluZ0FyZW5hKCk7CisgICAgICBzdGQ6OnN3YXAobWVzc2FnZTEsIG1lc3NhZ2UyKTsgIC8vIFN3YXBwaW5nIG5hbWVzIGZvciBwb2ludGVycyEKKyAgICB9CisKKyAgICBNZXNzYWdlKiB0ZW1wID0gbWVzc2FnZTEtPk5ldyhhcmVuYSk7CisgICAgdGVtcC0+TWVyZ2VGcm9tKCptZXNzYWdlMik7CisgICAgbWVzc2FnZTItPkNvcHlGcm9tKCptZXNzYWdlMSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgbWVzc2FnZTEtPkNvcHlGcm9tKCp0ZW1wKTsKKyAgICBpZiAoYXJlbmEgPT0gbnVsbHB0cikgZGVsZXRlIHRlbXA7CisjZWxzZSAgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIFN3YXAobWVzc2FnZTEsIHRlbXApOworI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgcmV0dXJuOworICB9CisKKyAgR09PR0xFX0RDSEVDS19FUShtZXNzYWdlMS0+R2V0T3duaW5nQXJlbmEoKSwgbWVzc2FnZTItPkdldE93bmluZ0FyZW5hKCkpOworCisgIFVuc2FmZUFyZW5hU3dhcChtZXNzYWdlMSwgbWVzc2FnZTIpOworfQorCit0ZW1wbGF0ZSA8Ym9vbCB1bnNhZmVfc2hhbGxvd19zd2FwPgordm9pZCBSZWZsZWN0aW9uOjpTd2FwRmllbGRzSW1wbCgKKyAgICBNZXNzYWdlKiBtZXNzYWdlMSwgTWVzc2FnZSogbWVzc2FnZTIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGZpZWxkcykgY29uc3QgeworICBpZiAobWVzc2FnZTEgPT0gbWVzc2FnZTIpIHJldHVybjsKKworICAvLyBUT0RPKGtlbnRvbik6ICBPdGhlciBSZWZsZWN0aW9uIG1ldGhvZHMgc2hvdWxkIHByb2JhYmx5IGNoZWNrIHRoaXMgdG9vLgorICBHT09HTEVfQ0hFQ0tfRVEobWVzc2FnZTEtPkdldFJlZmxlY3Rpb24oKSwgdGhpcykKKyAgICAgIDw8ICJGaXJzdCBhcmd1bWVudCB0byBTd2FwRmllbGRzKCkgKG9mIHR5cGUgXCIiCisgICAgICA8PCBtZXNzYWdlMS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKQorICAgICAgPDwgIlwiKSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgcmVmbGVjdGlvbiBvYmplY3QgKHdoaWNoIGlzIGZvciB0eXBlICIKKyAgICAgICAgICJcIiIKKyAgICAgIDw8IGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKQorICAgICAgPDwgIlwiKS4gIE5vdGUgdGhhdCB0aGUgZXhhY3Qgc2FtZSBjbGFzcyBpcyByZXF1aXJlZDsgbm90IGp1c3QgdGhlIHNhbWUgIgorICAgICAgICAgImRlc2NyaXB0b3IuIjsKKyAgR09PR0xFX0NIRUNLX0VRKG1lc3NhZ2UyLT5HZXRSZWZsZWN0aW9uKCksIHRoaXMpCisgICAgICA8PCAiU2Vjb25kIGFyZ3VtZW50IHRvIFN3YXBGaWVsZHMoKSAob2YgdHlwZSBcIiIKKyAgICAgIDw8IG1lc3NhZ2UyLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpCisgICAgICA8PCAiXCIpIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyByZWZsZWN0aW9uIG9iamVjdCAod2hpY2ggaXMgZm9yIHR5cGUgIgorICAgICAgICAgIlwiIgorICAgICAgPDwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpCisgICAgICA8PCAiXCIpLiAgTm90ZSB0aGF0IHRoZSBleGFjdCBzYW1lIGNsYXNzIGlzIHJlcXVpcmVkOyBub3QganVzdCB0aGUgc2FtZSAiCisgICAgICAgICAiZGVzY3JpcHRvci4iOworCisgIHN0ZDo6c2V0PGludD4gc3dhcHBlZF9vbmVvZjsKKworICBHT09HTEVfRENIRUNLKCF1bnNhZmVfc2hhbGxvd19zd2FwIHx8IG1lc3NhZ2UxLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UyLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisKKyAgY29uc3QgTWVzc2FnZSogcHJvdG90eXBlID0KKyAgICAgIG1lc3NhZ2VfZmFjdG9yeV8tPkdldFByb3RvdHlwZShtZXNzYWdlMS0+R2V0RGVzY3JpcHRvcigpKTsKKyAgZm9yIChjb25zdCBhdXRvKiBmaWVsZCA6IGZpZWxkcykgeworICAgIENoZWNrSW52YWxpZEFjY2VzcyhzY2hlbWFfLCBmaWVsZCk7CisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgICAgaWYgKHVuc2FmZV9zaGFsbG93X3N3YXApIHsKKyAgICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlMSktPlVuc2FmZVNoYWxsb3dTd2FwRXh0ZW5zaW9uKAorICAgICAgICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlMiksIGZpZWxkLT5udW1iZXIoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UxKS0+U3dhcEV4dGVuc2lvbigKKyAgICAgICAgICAgIHByb3RvdHlwZSwgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlMiksIGZpZWxkLT5udW1iZXIoKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzY2hlbWFfLkluUmVhbE9uZW9mKGZpZWxkKSkgeworICAgICAgICBpbnQgb25lb2ZfaW5kZXggPSBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpLT5pbmRleCgpOworICAgICAgICAvLyBPbmx5IHN3YXAgdGhlIG9uZW9mIGZpZWxkIG9uY2UuCisgICAgICAgIGlmIChzd2FwcGVkX29uZW9mLmZpbmQob25lb2ZfaW5kZXgpICE9IHN3YXBwZWRfb25lb2YuZW5kKCkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzd2FwcGVkX29uZW9mLmluc2VydChvbmVvZl9pbmRleCk7CisgICAgICAgIFN3YXBPbmVvZkZpZWxkPHVuc2FmZV9zaGFsbG93X3N3YXA+KG1lc3NhZ2UxLCBtZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBTd2FwIGZpZWxkLgorICAgICAgICBpZiAodW5zYWZlX3NoYWxsb3dfc3dhcCkgeworICAgICAgICAgIFVuc2FmZVNoYWxsb3dTd2FwRmllbGQobWVzc2FnZTEsIG1lc3NhZ2UyLCBmaWVsZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgU3dhcEZpZWxkKG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGQpOworICAgICAgICB9CisgICAgICAgIC8vIFN3YXAgaGFzIGJpdCBmb3Igbm9uLXJlcGVhdGVkIGZpZWxkcy4gIFdlIGhhdmUgYWxyZWFkeSBjaGVja2VkIGZvcgorICAgICAgICAvLyBvbmVvZiBhbHJlYWR5LiBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIFN3YXBGaWVsZCwgYmVjYXVzZSBTd2FwRmllbGQKKyAgICAgICAgLy8gbWF5IGRlcGVuZCBvbiB0aGUgaW5mb3JtYXRpb24gaW4gaGFzIGJpdHMuCisgICAgICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgICBTd2FwQml0KG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGQpOworICAgICAgICAgIGlmIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkgPT0gRmllbGRPcHRpb25zOjpTVFJJTkcgJiYKKyAgICAgICAgICAgICAgSXNJbmxpbmVkKGZpZWxkKSkgeworICAgICAgICAgICAgR09PR0xFX0RDSEVDSyghdW5zYWZlX3NoYWxsb3dfc3dhcCB8fAorICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UxLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PQorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlMi0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAgICAgICAgICAgU3dhcElubGluZWRTdHJpbmdEb25hdGVkKG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIFJlZmxlY3Rpb246OlN3YXBGaWVsZHMoCisgICAgTWVzc2FnZSogbWVzc2FnZTEsIE1lc3NhZ2UqIG1lc3NhZ2UyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+JiBmaWVsZHMpIGNvbnN0IHsKKyAgU3dhcEZpZWxkc0ltcGw8ZmFsc2U+KG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGRzKTsKK30KKwordm9pZCBSZWZsZWN0aW9uOjpVbnNhZmVTaGFsbG93U3dhcEZpZWxkcygKKyAgICBNZXNzYWdlKiBtZXNzYWdlMSwgTWVzc2FnZSogbWVzc2FnZTIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGZpZWxkcykgY29uc3QgeworICBTd2FwRmllbGRzSW1wbDx0cnVlPihtZXNzYWdlMSwgbWVzc2FnZTIsIGZpZWxkcyk7Cit9CisKK3ZvaWQgUmVmbGVjdGlvbjo6VW5zYWZlQXJlbmFTd2FwRmllbGRzKAorICAgIE1lc3NhZ2UqIGxocywgTWVzc2FnZSogcmhzLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+JiBmaWVsZHMpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDS19FUShsaHMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpLCByaHMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgVW5zYWZlU2hhbGxvd1N3YXBGaWVsZHMobGhzLCByaHMsIGZpZWxkcyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYm9vbCBSZWZsZWN0aW9uOjpIYXNGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX01FU1NBR0VfVFlQRShIYXNGaWVsZCk7CisgIFVTQUdFX0NIRUNLX1NJTkdVTEFSKEhhc0ZpZWxkKTsKKyAgQ2hlY2tJbnZhbGlkQWNjZXNzKHNjaGVtYV8sIGZpZWxkKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5IYXMoZmllbGQtPm51bWJlcigpKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoc2NoZW1hXy5JblJlYWxPbmVvZihmaWVsZCkpIHsKKyAgICAgIHJldHVybiBIYXNPbmVvZkZpZWxkKG1lc3NhZ2UsIGZpZWxkKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEhhc0JpdChtZXNzYWdlLCBmaWVsZCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgUmVmbGVjdGlvbjo6VW5zYWZlQXJlbmFTd2FwKE1lc3NhZ2UqIGxocywgTWVzc2FnZSogcmhzKSBjb25zdCB7CisgIGlmIChsaHMgPT0gcmhzKSByZXR1cm47CisKKyAgTXV0YWJsZUludGVybmFsTWV0YWRhdGEobGhzKS0+SW50ZXJuYWxTd2FwKE11dGFibGVJbnRlcm5hbE1ldGFkYXRhKHJocykpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3Rfbm9uX3dlYWtfZmllbGRfaW5kZXhfOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgIGlmIChzY2hlbWFfLkluUmVhbE9uZW9mKGZpZWxkKSkgY29udGludWU7CisgICAgaWYgKHNjaGVtYV8uSXNGaWVsZFN0cmlwcGVkKGZpZWxkKSkgY29udGludWU7CisgICAgVW5zYWZlU2hhbGxvd1N3YXBGaWVsZChsaHMsIHJocywgZmllbGQpOworICB9CisgIGNvbnN0IGludCBvbmVvZl9kZWNsX2NvdW50ID0gZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBvbmVvZl9kZWNsX2NvdW50OyBpKyspIHsKKyAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSk7CisgICAgaWYgKCFvbmVvZi0+aXNfc3ludGhldGljKCkpIHsKKyAgICAgIFN3YXBPbmVvZkZpZWxkPHRydWU+KGxocywgcmhzLCBvbmVvZik7CisgICAgfQorICB9CisKKyAgLy8gU3dhcHBpbmcgYml0cyBuZWVkIHRvIGhhcHBlbiBhZnRlciBzd2FwcGluZyBmaWVsZHMsIGJlY2F1c2UgdGhlIGxhdHRlciBtYXkKKyAgLy8gZGVwZW5kIG9uIHRoZSBoYXMgYml0IGluZm9ybWF0aW9uLgorICBpZiAoc2NoZW1hXy5IYXNIYXNiaXRzKCkpIHsKKyAgICB1aW50MzJfdCogbGhzX2hhc19iaXRzID0gTXV0YWJsZUhhc0JpdHMobGhzKTsKKyAgICB1aW50MzJfdCogcmhzX2hhc19iaXRzID0gTXV0YWJsZUhhc0JpdHMocmhzKTsKKworICAgIGludCBmaWVsZHNfd2l0aF9oYXNfYml0cyA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpIHx8IHNjaGVtYV8uSW5SZWFsT25lb2YoZmllbGQpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZmllbGRzX3dpdGhfaGFzX2JpdHMrKzsKKyAgICB9CisKKyAgICBpbnQgaGFzX2JpdHNfc2l6ZSA9IChmaWVsZHNfd2l0aF9oYXNfYml0cyArIDMxKSAvIDMyOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYXNfYml0c19zaXplOyBpKyspIHsKKyAgICAgIHN0ZDo6c3dhcChsaHNfaGFzX2JpdHNbaV0sIHJoc19oYXNfYml0c1tpXSk7CisgICAgfQorICB9CisKKyAgaWYgKHNjaGVtYV8uSGFzSW5saW5lZFN0cmluZygpKSB7CisgICAgdWludDMyX3QqIGxoc19kb25hdGVkX2FycmF5ID0gTXV0YWJsZUlubGluZWRTdHJpbmdEb25hdGVkQXJyYXkobGhzKTsKKyAgICB1aW50MzJfdCogcmhzX2RvbmF0ZWRfYXJyYXkgPSBNdXRhYmxlSW5saW5lZFN0cmluZ0RvbmF0ZWRBcnJheShyaHMpOworICAgIGludCBpbmxpbmVkX3N0cmluZ19jb3VudCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSB8fCBmaWVsZC0+aXNfcmVwZWF0ZWQoKSB8fAorICAgICAgICAgIHNjaGVtYV8uSW5SZWFsT25lb2YoZmllbGQpIHx8CisgICAgICAgICAgZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpICE9IEZpZWxkT3B0aW9uczo6U1RSSU5HIHx8CisgICAgICAgICAgIUlzSW5saW5lZChmaWVsZCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbmxpbmVkX3N0cmluZ19jb3VudCsrOworICAgIH0KKworICAgIGludCBkb25hdGVkX2FycmF5X3NpemUgPSBpbmxpbmVkX3N0cmluZ19jb3VudCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uZSBleHRyYSBiaXQgZm9yIHRoZSBhcmVuYSBkdG9yIHRyYWNraW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaW5saW5lZF9zdHJpbmdfY291bnQgKyAxICsgMzEpIC8gMzI7CisgICAgR09PR0xFX0NIRUNLX0VRKChsaHNfZG9uYXRlZF9hcnJheVswXSAmIDB4MXUpID09IDAsCisgICAgICAgICAgICAgKHJoc19kb25hdGVkX2FycmF5WzBdICYgMHgxdSkgPT0gMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb25hdGVkX2FycmF5X3NpemU7IGkrKykgeworICAgICAgc3RkOjpzd2FwKGxoc19kb25hdGVkX2FycmF5W2ldLCByaHNfZG9uYXRlZF9hcnJheVtpXSk7CisgICAgfQorICB9CisKKyAgaWYgKHNjaGVtYV8uSGFzRXh0ZW5zaW9uU2V0KCkpIHsKKyAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KGxocyktPkludGVybmFsU3dhcChNdXRhYmxlRXh0ZW5zaW9uU2V0KHJocykpOworICB9Cit9CisKK2ludCBSZWZsZWN0aW9uOjpGaWVsZFNpemUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBVU0FHRV9DSEVDS19NRVNTQUdFX1RZUEUoRmllbGRTaXplKTsKKyAgVVNBR0VfQ0hFQ0tfUkVQRUFURUQoRmllbGRTaXplKTsKKyAgQ2hlY2tJbnZhbGlkQWNjZXNzKHNjaGVtYV8sIGZpZWxkKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5FeHRlbnNpb25TaXplKGZpZWxkLT5udW1iZXIoKSk7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSkgICAgXAorICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI1VQUEVSQ0FTRTogXAorICAgIHJldHVybiBHZXRSYXc8UmVwZWF0ZWRGaWVsZDxMT1dFUkNBU0U+ID4obWVzc2FnZSwgZmllbGQpLnNpemUoKQorCisgICAgICBIQU5ETEVfVFlQRShJTlQzMiwgaW50MzJfdCk7CisgICAgICBIQU5ETEVfVFlQRShJTlQ2NCwgaW50NjRfdCk7CisgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMl90KTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0X3QpOworICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOworICAgICAgSEFORExFX1RZUEUoRkxPQVQsIGZsb2F0KTsKKyAgICAgIEhBTkRMRV9UWVBFKEJPT0wsIGJvb2wpOworICAgICAgSEFORExFX1RZUEUoRU5VTSwgaW50KTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgeworICAgICAgICAgIGNvbnN0IGludGVybmFsOjpNYXBGaWVsZEJhc2UmIG1hcCA9CisgICAgICAgICAgICAgIEdldFJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgICAgICBpZiAobWFwLklzUmVwZWF0ZWRGaWVsZFZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXAuR2V0UmVwZWF0ZWRGaWVsZCgpLnNpemUoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBtYXRlcmlhbGl6ZSB0aGUgcmVwZWF0ZWQgZmllbGQgaWYgaXQgaXMgb3V0IG9mIHN5bmM6CisgICAgICAgICAgICAvLyBpdHMgc2l6ZSB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBtYXAncyBzaXplLgorICAgICAgICAgICAgcmV0dXJuIG1hcC5zaXplKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBHZXRSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKS5zaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCit2b2lkIFJlZmxlY3Rpb246OkNsZWFyRmllbGQoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX01FU1NBR0VfVFlQRShDbGVhckZpZWxkKTsKKyAgQ2hlY2tJbnZhbGlkQWNjZXNzKHNjaGVtYV8sIGZpZWxkKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+Q2xlYXJFeHRlbnNpb24oZmllbGQtPm51bWJlcigpKTsKKyAgfSBlbHNlIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBpZiAoc2NoZW1hXy5JblJlYWxPbmVvZihmaWVsZCkpIHsKKyAgICAgIENsZWFyT25lb2ZGaWVsZChtZXNzYWdlLCBmaWVsZCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChIYXNCaXQoKm1lc3NhZ2UsIGZpZWxkKSkgeworICAgICAgQ2xlYXJCaXQobWVzc2FnZSwgZmllbGQpOworCisgICAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGUgZmllbGQgYmFjayB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KKyAgICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgQ0xFQVJfVFlQRShDUFBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKk11dGFibGVSYXc8VFlQRT4obWVzc2FnZSwgZmllbGQpID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfIyNUWVBFKCk7IFwKKyAgICBicmVhazsKKworICAgICAgICBDTEVBUl9UWVBFKElOVDMyLCBpbnQzMl90KTsKKyAgICAgICAgQ0xFQVJfVFlQRShJTlQ2NCwgaW50NjRfdCk7CisgICAgICAgIENMRUFSX1RZUEUoVUlOVDMyLCB1aW50MzJfdCk7CisgICAgICAgIENMRUFSX1RZUEUoVUlOVDY0LCB1aW50NjRfdCk7CisgICAgICAgIENMRUFSX1RZUEUoRkxPQVQsIGZsb2F0KTsKKyAgICAgICAgQ0xFQVJfVFlQRShET1VCTEUsIGRvdWJsZSk7CisgICAgICAgIENMRUFSX1RZUEUoQk9PTCwgYm9vbCk7CisjdW5kZWYgQ0xFQVJfVFlQRQorCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICAgICAgKk11dGFibGVSYXc8aW50PihtZXNzYWdlLCBmaWVsZCkgPQorICAgICAgICAgICAgICBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtKCktPm51bWJlcigpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CisgICAgICAgICAgICAgIGlmIChJc0lubGluZWQoZmllbGQpKSB7CisgICAgICAgICAgICAgICAgLy8gQ3VycmVudGx5LCBzdHJpbmcgd2l0aCBkZWZhdWx0IHZhbHVlIGNhbid0IGJlIGlubGluZWQuIFNvIHdlCisgICAgICAgICAgICAgICAgLy8gZG9uJ3QgaGF2ZSB0byBoYW5kbGUgZGVmYXVsdCB2YWx1ZSBoZXJlLgorICAgICAgICAgICAgICAgIE11dGFibGVSYXc8SW5saW5lZFN0cmluZ0ZpZWxkPihtZXNzYWdlLCBmaWVsZCktPkNsZWFyVG9FbXB0eSgpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF1dG8qIHN0ciA9IE11dGFibGVSYXc8QXJlbmFTdHJpbmdQdHI+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgICAgICAgICAgICBzdHItPkRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICBzdHItPkluaXREZWZhdWx0KCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICBpZiAoc2NoZW1hXy5IYXNCaXRJbmRleChmaWVsZCkgPT0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC0xKSkgeworICAgICAgICAgICAgLy8gUHJvdG8zIGRvZXMgbm90IGhhdmUgaGFzLWJpdHMgYW5kIHdlIG5lZWQgdG8gc2V0IGEgbWVzc2FnZSBmaWVsZAorICAgICAgICAgICAgLy8gdG8gbnVsbHB0ciBpbiBvcmRlciB0byBpbmRpY2F0ZSBpdHMgdW4tcHJlc2VuY2UuCisgICAgICAgICAgICBpZiAobWVzc2FnZS0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICBkZWxldGUgKk11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCkgPSBudWxscHRyOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAoKk11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKSktPkNsZWFyKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE11dGFibGVSYXc8UmVwZWF0ZWRGaWVsZDxMT1dFUkNBU0U+ID4obWVzc2FnZSwgZmllbGQpLT5DbGVhcigpOyBcCisgICAgYnJlYWsKKworICAgICAgSEFORExFX1RZUEUoSU5UMzIsIGludDMyX3QpOworICAgICAgSEFORExFX1RZUEUoSU5UNjQsIGludDY0X3QpOworICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzJfdCk7CisgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIHVpbnQ2NF90KTsKKyAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlKTsKKyAgICAgIEhBTkRMRV9UWVBFKEZMT0FULCBmbG9hdCk7CisgICAgICBIQU5ETEVfVFlQRShCT09MLCBib29sKTsKKyAgICAgIEhBTkRMRV9UWVBFKEVOVU0sIGludCk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gPihtZXNzYWdlLCBmaWVsZCktPkNsZWFyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTogeworICAgICAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgeworICAgICAgICAgIE11dGFibGVSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCktPkNsZWFyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB3aGljaCBzdWJjbGFzcyBvZiBSZXBlYXRlZFB0ckZpZWxkQmFzZSB0aGUgdHlwZSBpcywKKyAgICAgICAgICAvLyBzbyB3ZSB1c2UgUmVwZWF0ZWRQdHJGaWVsZEJhc2UgZGlyZWN0bHkuCisgICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgICAgIC0+Q2xlYXI8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBSZWZsZWN0aW9uOjpSZW1vdmVMYXN0KE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBVU0FHRV9DSEVDS19NRVNTQUdFX1RZUEUoUmVtb3ZlTGFzdCk7CisgIFVTQUdFX0NIRUNLX1JFUEVBVEVEKFJlbW92ZUxhc3QpOworICBDaGVja0ludmFsaWRBY2Nlc3Moc2NoZW1hXywgZmllbGQpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5SZW1vdmVMYXN0KGZpZWxkLT5udW1iZXIoKSk7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTXV0YWJsZVJhdzxSZXBlYXRlZEZpZWxkPExPV0VSQ0FTRT4gPihtZXNzYWdlLCBmaWVsZCktPlJlbW92ZUxhc3QoKTsgXAorICAgIGJyZWFrCisKKyAgICAgIEhBTkRMRV9UWVBFKElOVDMyLCBpbnQzMl90KTsKKyAgICAgIEhBTkRMRV9UWVBFKElOVDY0LCBpbnQ2NF90KTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgdWludDMyX3QpOworICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjRfdCk7CisgICAgICBIQU5ETEVfVFlQRShET1VCTEUsIGRvdWJsZSk7CisgICAgICBIQU5ETEVfVFlQRShGTE9BVCwgZmxvYXQpOworICAgICAgSEFORExFX1RZUEUoQk9PTCwgYm9vbCk7CisgICAgICBIQU5ETEVfVFlQRShFTlVNLCBpbnQpOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiA+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgICAgICAgIC0+UmVtb3ZlTGFzdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7CisgICAgICAgICAgTXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgICAgICAtPk11dGFibGVSZXBlYXRlZEZpZWxkKCkKKyAgICAgICAgICAgICAgLT5SZW1vdmVMYXN0PEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgICAgIC0+UmVtb3ZlTGFzdDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitNZXNzYWdlKiBSZWZsZWN0aW9uOjpSZWxlYXNlTGFzdChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoUmVsZWFzZUxhc3QsIFJFUEVBVEVELCBNRVNTQUdFKTsKKyAgQ2hlY2tJbnZhbGlkQWNjZXNzKHNjaGVtYV8sIGZpZWxkKTsKKworICBNZXNzYWdlKiByZWxlYXNlZDsKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIHJlbGVhc2VkID0gc3RhdGljX2Nhc3Q8TWVzc2FnZSo+KAorICAgICAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5SZWxlYXNlTGFzdChmaWVsZC0+bnVtYmVyKCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgeworICAgICAgcmVsZWFzZWQgPSBNdXRhYmxlUmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgICAgICAgICAgICAtPk11dGFibGVSZXBlYXRlZEZpZWxkKCkKKyAgICAgICAgICAgICAgICAgICAgIC0+UmVsZWFzZUxhc3Q8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+PigpOworICAgIH0gZWxzZSB7CisgICAgICByZWxlYXNlZCA9IE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgICAgICAgICAgICAgLT5SZWxlYXNlTGFzdDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4+KCk7CisgICAgfQorICB9CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIHJldHVybiBNYXliZUZvcmNlQ29weShtZXNzYWdlLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSwgcmVsZWFzZWQpOworI2Vsc2UgICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgcmV0dXJuIHJlbGVhc2VkOworI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCit9CisKK01lc3NhZ2UqIFJlZmxlY3Rpb246OlVuc2FmZUFyZW5hUmVsZWFzZUxhc3QoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoVW5zYWZlQXJlbmFSZWxlYXNlTGFzdCwgUkVQRUFURUQsIE1FU1NBR0UpOworICBDaGVja0ludmFsaWRBY2Nlc3Moc2NoZW1hXywgZmllbGQpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TWVzc2FnZSo+KAorICAgICAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5VbnNhZmVBcmVuYVJlbGVhc2VMYXN0KGZpZWxkLT5udW1iZXIoKSkpOworICB9IGVsc2UgeworICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7CisgICAgICByZXR1cm4gTXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgIC0+TXV0YWJsZVJlcGVhdGVkRmllbGQoKQorICAgICAgICAgIC0+VW5zYWZlQXJlbmFSZWxlYXNlTGFzdDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4+KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgICAtPlVuc2FmZUFyZW5hUmVsZWFzZUxhc3Q8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+PigpOworICAgIH0KKyAgfQorfQorCit2b2lkIFJlZmxlY3Rpb246OlN3YXBFbGVtZW50cyhNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MSwgaW50IGluZGV4MikgY29uc3QgeworICBVU0FHRV9DSEVDS19NRVNTQUdFX1RZUEUoU3dhcCk7CisgIFVTQUdFX0NIRUNLX1JFUEVBVEVEKFN3YXApOworICBDaGVja0ludmFsaWRBY2Nlc3Moc2NoZW1hXywgZmllbGQpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5Td2FwRWxlbWVudHMoZmllbGQtPm51bWJlcigpLCBpbmRleDEsIGluZGV4Mik7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICBcCisgICAgTXV0YWJsZVJhdzxSZXBlYXRlZEZpZWxkPExPV0VSQ0FTRT4gPihtZXNzYWdlLCBmaWVsZCkgXAorICAgICAgICAtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhaworCisgICAgICBIQU5ETEVfVFlQRShJTlQzMiwgaW50MzJfdCk7CisgICAgICBIQU5ETEVfVFlQRShJTlQ2NCwgaW50NjRfdCk7CisgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMl90KTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0X3QpOworICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOworICAgICAgSEFORExFX1RZUEUoRkxPQVQsIGZsb2F0KTsKKyAgICAgIEhBTkRMRV9UWVBFKEJPT0wsIGJvb2wpOworICAgICAgSEFORExFX1RZUEUoRU5VTSwgaW50KTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgeworICAgICAgICAgIE11dGFibGVSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgICAgICAgLT5NdXRhYmxlUmVwZWF0ZWRGaWVsZCgpCisgICAgICAgICAgICAgIC0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgICAgICAgLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCituYW1lc3BhY2UgeworLy8gQ29tcGFyaXNvbiBmdW5jdG9yIGZvciBzb3J0aW5nIEZpZWxkRGVzY3JpcHRvcnMgYnkgZmllbGQgbnVtYmVyLgorc3RydWN0IEZpZWxkTnVtYmVyU29ydGVyIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbGVmdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmlnaHQpIGNvbnN0IHsKKyAgICByZXR1cm4gbGVmdC0+bnVtYmVyKCkgPCByaWdodC0+bnVtYmVyKCk7CisgIH0KK307CisKK2Jvb2wgSXNJbmRleEluSGFzQml0U2V0KGNvbnN0IHVpbnQzMl90KiBoYXNfYml0X3NldCwgdWludDMyX3QgaGFzX2JpdF9pbmRleCkgeworICBHT09HTEVfRENIRUNLX05FKGhhc19iaXRfaW5kZXgsIH4wdSk7CisgIHJldHVybiAoKGhhc19iaXRfc2V0W2hhc19iaXRfaW5kZXggLyAzMl0gPj4gKGhhc19iaXRfaW5kZXggJSAzMikpICYKKyAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oMSkpICE9IDA7Cit9CisKK2Jvb2wgQ3JlYXRlVW5rbm93bkVudW1WYWx1ZXMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgcmV0dXJuIGZpbGUtPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zOworfQorfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Citib29sIENyZWF0ZVVua25vd25FbnVtVmFsdWVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgYm9vbCBvcGVuX2VudW0gPSBmYWxzZTsKKyAgcmV0dXJuIGZpZWxkLT5maWxlKCktPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zIHx8IG9wZW5fZW51bTsKK30KK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAordXNpbmcgaW50ZXJuYWw6OkNyZWF0ZVVua25vd25FbnVtVmFsdWVzOworCit2b2lkIFJlZmxlY3Rpb246Okxpc3RGaWVsZHNNYXlGYWlsT25TdHJpcHBlZCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBib29sIHNob3VsZF9mYWlsLAorICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXRwdXQpIGNvbnN0IHsKKyAgb3V0cHV0LT5jbGVhcigpOworCisgIC8vIE9wdGltaXphdGlvbjogIFRoZSBkZWZhdWx0IGluc3RhbmNlIG5ldmVyIGhhcyBhbnkgZmllbGRzIHNldC4KKyAgaWYgKHNjaGVtYV8uSXNEZWZhdWx0SW5zdGFuY2UobWVzc2FnZSkpIHJldHVybjsKKworICAvLyBPcHRpbWl6YXRpb246IEF2b2lkIGNhbGxpbmcgR2V0SGFzQml0cygpIGFuZCBIYXNPbmVvZkZpZWxkKCkgbWFueSB0aW1lcworICAvLyB3aXRoaW4gdGhlIGZpZWxkIGxvb3AuICBXZSBhbGxvdyB0aGlzIHZpb2xhdGlvbiBvZiBSZWZsZWN0aW9uU2NoZW1hCisgIC8vIGVuY2Fwc3VsYXRpb24gYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIHRha2VzIGEgbm90aWNlYWJsZSBhYm91dCBvZiBDUFUKKyAgLy8gZmxlZXR3aWRlIGFuZCBwcm9wZXJseSBhbGxvd2luZyB0aGlzIG9wdGltaXphdGlvbiB0aHJvdWdoIHB1YmxpYyBpbnRlcmZhY2VzCisgIC8vIHNlZW1zIG1vcmUgdHJvdWJsZSB0aGFuIGl0IGlzIHdvcnRoLgorICBjb25zdCB1aW50MzJfdCogY29uc3QgaGFzX2JpdHMgPQorICAgICAgc2NoZW1hXy5IYXNIYXNiaXRzKCkgPyBHZXRIYXNCaXRzKG1lc3NhZ2UpIDogbnVsbHB0cjsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IGhhc19iaXRzX2luZGljZXMgPSBzY2hlbWFfLmhhc19iaXRfaW5kaWNlc187CisgIG91dHB1dC0+cmVzZXJ2ZShkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSk7CisgIGNvbnN0IGludCBsYXN0X25vbl93ZWFrX2ZpZWxkX2luZGV4ID0gbGFzdF9ub25fd2Vha19maWVsZF9pbmRleF87CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3Rfbm9uX3dlYWtfZmllbGRfaW5kZXg7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgaWYgKCFzaG91bGRfZmFpbCAmJiBzY2hlbWFfLklzRmllbGRTdHJpcHBlZChmaWVsZCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIGlmIChGaWVsZFNpemUobWVzc2FnZSwgZmllbGQpID4gMCkgeworICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhmaWVsZCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogY29udGFpbmluZ19vbmVvZiA9IGZpZWxkLT5jb250YWluaW5nX29uZW9mKCk7CisgICAgICBpZiAoc2NoZW1hXy5JblJlYWxPbmVvZihmaWVsZCkpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IG9uZW9mX2Nhc2VfYXJyYXkgPQorICAgICAgICAgICAgR2V0Q29uc3RQb2ludGVyQXRPZmZzZXQ8dWludDMyX3Q+KCZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYV8ub25lb2ZfY2FzZV9vZmZzZXRfKTsKKyAgICAgICAgLy8gRXF1aXZhbGVudCB0bzogSGFzT25lb2ZGaWVsZChtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludDY0X3Q+KG9uZW9mX2Nhc2VfYXJyYXlbY29udGFpbmluZ19vbmVvZi0+aW5kZXgoKV0pID09CisgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCkpIHsKKyAgICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhmaWVsZCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoaGFzX2JpdHMgJiYgaGFzX2JpdHNfaW5kaWNlc1tpXSAhPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLTEpKSB7CisgICAgICAgIENoZWNrSW52YWxpZEFjY2VzcyhzY2hlbWFfLCBmaWVsZCk7CisgICAgICAgIC8vIEVxdWl2YWxlbnQgdG86IEhhc0JpdChtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgaWYgKElzSW5kZXhJbkhhc0JpdFNldChoYXNfYml0cywgaGFzX2JpdHNfaW5kaWNlc1tpXSkpIHsKKyAgICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhmaWVsZCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoSGFzQml0KG1lc3NhZ2UsIGZpZWxkKSkgeyAgLy8gRmFsbCBiYWNrIG9uIHByb3RvMy1zdHlsZSBIYXNCaXQuCisgICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHNjaGVtYV8uSGFzRXh0ZW5zaW9uU2V0KCkpIHsKKyAgICBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuQXBwZW5kVG9MaXN0KGRlc2NyaXB0b3JfLCBkZXNjcmlwdG9yX3Bvb2xfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KTsKKyAgfQorCisgIC8vIExpc3RGaWVsZHMoKSBtdXN0IHNvcnQgb3V0cHV0IGJ5IGZpZWxkIG51bWJlci4KKyAgc3RkOjpzb3J0KG91dHB1dC0+YmVnaW4oKSwgb3V0cHV0LT5lbmQoKSwgRmllbGROdW1iZXJTb3J0ZXIoKSk7Cit9CisKK3ZvaWQgUmVmbGVjdGlvbjo6TGlzdEZpZWxkcyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXRwdXQpIGNvbnN0IHsKKyAgTGlzdEZpZWxkc01heUZhaWxPblN0cmlwcGVkKG1lc3NhZ2UsIHRydWUsIG91dHB1dCk7Cit9CisKK3ZvaWQgUmVmbGVjdGlvbjo6TGlzdEZpZWxkc09taXRTdHJpcHBlZCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogb3V0cHV0KSBjb25zdCB7CisgIExpc3RGaWVsZHNNYXlGYWlsT25TdHJpcHBlZChtZXNzYWdlLCBmYWxzZSwgb3V0cHV0KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjdW5kZWYgREVGSU5FX1BSSU1JVElWRV9BQ0NFU1NPUlMKKyNkZWZpbmUgREVGSU5FX1BSSU1JVElWRV9BQ0NFU1NPUlMoVFlQRU5BTUUsIFRZUEUsIFBBU1NUWVBFLCBDUFBUWVBFKSAgICAgICAgICBcCisgIFBBU1NUWVBFIFJlZmxlY3Rpb246OkdldCMjVFlQRU5BTUUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsgICAgIFwKKyAgICBVU0FHRV9DSEVDS19BTEwoR2V0IyNUWVBFTkFNRSwgU0lOR1VMQVIsIENQUFRZUEUpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT5kZWZhdWx0X3ZhbHVlXyMjUEFTU1RZUEUoKSk7ICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIGlmIChzY2hlbWFfLkluUmVhbE9uZW9mKGZpZWxkKSAmJiAhSGFzT25lb2ZGaWVsZChtZXNzYWdlLCBmaWVsZCkpIHsgXAorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlXyMjUEFTU1RZUEUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gR2V0RmllbGQ8VFlQRT4obWVzc2FnZSwgZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIFJlZmxlY3Rpb246OlNldCMjVFlQRU5BTUUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIFBBU1NUWVBFIHZhbHVlKSBjb25zdCB7ICBcCisgICAgVVNBR0VfQ0hFQ0tfQUxMKFNldCMjVFlQRU5BTUUsIFNJTkdVTEFSLCBDUFBUWVBFKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5TZXQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpLCB2YWx1ZSwgZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNldEZpZWxkPFRZUEU+KG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFBBU1NUWVBFIFJlZmxlY3Rpb246OkdldFJlcGVhdGVkIyNUWVBFTkFNRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7IFwKKyAgICBVU0FHRV9DSEVDS19BTEwoR2V0UmVwZWF0ZWQjI1RZUEVOQU1FLCBSRVBFQVRFRCwgQ1BQVFlQRSk7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRSZXBlYXRlZCMjVFlQRU5BTUUoZmllbGQtPm51bWJlcigpLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIEdldFJlcGVhdGVkRmllbGQ8VFlQRT4obWVzc2FnZSwgZmllbGQsIGluZGV4KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBSZWZsZWN0aW9uOjpTZXRSZXBlYXRlZCMjVFlQRU5BTUUoTWVzc2FnZSogbWVzc2FnZSwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIFBBU1NUWVBFIHZhbHVlKSBjb25zdCB7ICAgIFwKKyAgICBVU0FHRV9DSEVDS19BTEwoU2V0UmVwZWF0ZWQjI1RZUEVOQU1FLCBSRVBFQVRFRCwgQ1BQVFlQRSk7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+U2V0UmVwZWF0ZWQjI1RZUEVOQU1FKGZpZWxkLT5udW1iZXIoKSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgdmFsdWUpOyAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgU2V0UmVwZWF0ZWRGaWVsZDxUWVBFPihtZXNzYWdlLCBmaWVsZCwgaW5kZXgsIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBSZWZsZWN0aW9uOjpBZGQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBQQVNTVFlQRSB2YWx1ZSkgY29uc3QgeyAgXAorICAgIFVTQUdFX0NIRUNLX0FMTChBZGQjI1RZUEVOQU1FLCBSRVBFQVRFRCwgQ1BQVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5BZGQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPnR5cGUoKSwgZmllbGQtPm9wdGlvbnMoKS5wYWNrZWQoKSwgdmFsdWUsICAgIFwKKyAgICAgICAgICBmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQWRkRmllbGQ8VFlQRT4obWVzc2FnZSwgZmllbGQsIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworREVGSU5FX1BSSU1JVElWRV9BQ0NFU1NPUlMoSW50MzIsIGludDMyX3QsIGludDMyX3QsIElOVDMyKQorREVGSU5FX1BSSU1JVElWRV9BQ0NFU1NPUlMoSW50NjQsIGludDY0X3QsIGludDY0X3QsIElOVDY0KQorREVGSU5FX1BSSU1JVElWRV9BQ0NFU1NPUlMoVUludDMyLCB1aW50MzJfdCwgdWludDMyX3QsIFVJTlQzMikKK0RFRklORV9QUklNSVRJVkVfQUNDRVNTT1JTKFVJbnQ2NCwgdWludDY0X3QsIHVpbnQ2NF90LCBVSU5UNjQpCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhGbG9hdCwgZmxvYXQsIGZsb2F0LCBGTE9BVCkKK0RFRklORV9QUklNSVRJVkVfQUNDRVNTT1JTKERvdWJsZSwgZG91YmxlLCBkb3VibGUsIERPVUJMRSkKK0RFRklORV9QUklNSVRJVkVfQUNDRVNTT1JTKEJvb2wsIGJvb2wsIGJvb2wsIEJPT0wpCisjdW5kZWYgREVGSU5FX1BSSU1JVElWRV9BQ0NFU1NPUlMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGQ6OnN0cmluZyBSZWZsZWN0aW9uOjpHZXRTdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChHZXRTdHJpbmcsIFNJTkdVTEFSLCBTVFJJTkcpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRTdHJpbmcoZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoc2NoZW1hXy5JblJlYWxPbmVvZihmaWVsZCkgJiYgIUhhc09uZW9mRmllbGQobWVzc2FnZSwgZmllbGQpKSB7CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CisgICAgICAgIGlmIChJc0lubGluZWQoZmllbGQpKSB7CisgICAgICAgICAgcmV0dXJuIEdldEZpZWxkPElubGluZWRTdHJpbmdGaWVsZD4obWVzc2FnZSwgZmllbGQpLkdldE5vQXJlbmEoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25zdCBhdXRvJiBzdHIgPSBHZXRGaWVsZDxBcmVuYVN0cmluZ1B0cj4obWVzc2FnZSwgZmllbGQpOworICAgICAgICAgIHJldHVybiBzdHIuSXNEZWZhdWx0KCkgPyBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSA6IHN0ci5HZXQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgfQorfQorCitjb25zdCBzdGQ6OnN0cmluZyYgUmVmbGVjdGlvbjo6R2V0U3RyaW5nUmVmZXJlbmNlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBzY3JhdGNoKSBjb25zdCB7CisgICh2b2lkKXNjcmF0Y2g7ICAvLyBQYXJhbWV0ZXIgaXMgdXNlZCBieSBHb29nbGUtaW50ZXJuYWwgY29kZS4KKyAgVVNBR0VfQ0hFQ0tfQUxMKEdldFN0cmluZ1JlZmVyZW5jZSwgU0lOR1VMQVIsIFNUUklORyk7CisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLkdldFN0cmluZyhmaWVsZC0+bnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOworICB9IGVsc2UgeworICAgIGlmIChzY2hlbWFfLkluUmVhbE9uZW9mKGZpZWxkKSAmJiAhSGFzT25lb2ZGaWVsZChtZXNzYWdlLCBmaWVsZCkpIHsKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgaWYgKElzSW5saW5lZChmaWVsZCkpIHsKKyAgICAgICAgICByZXR1cm4gR2V0RmllbGQ8SW5saW5lZFN0cmluZ0ZpZWxkPihtZXNzYWdlLCBmaWVsZCkuR2V0Tm9BcmVuYSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnN0IGF1dG8mIHN0ciA9IEdldEZpZWxkPEFyZW5hU3RyaW5nUHRyPihtZXNzYWdlLCBmaWVsZCk7CisgICAgICAgICAgcmV0dXJuIHN0ci5Jc0RlZmF1bHQoKSA/IGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpIDogc3RyLkdldCgpOworICAgICAgICB9CisgICAgfQorICB9Cit9CisKKwordm9pZCBSZWZsZWN0aW9uOjpTZXRTdHJpbmcoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChTZXRTdHJpbmcsIFNJTkdVTEFSLCBTVFJJTkcpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlNldFN0cmluZygKKyAgICAgICAgZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpLCBzdGQ6Om1vdmUodmFsdWUpLCBmaWVsZCk7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzogeworICAgICAgICBpZiAoSXNJbmxpbmVkKGZpZWxkKSkgeworICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGluZGV4ID0gc2NoZW1hXy5JbmxpbmVkU3RyaW5nSW5kZXgoZmllbGQpOworICAgICAgICAgIEdPT0dMRV9EQ0hFQ0tfR1QoaW5kZXgsIDApOworICAgICAgICAgIHVpbnQzMl90KiBzdGF0ZXMgPQorICAgICAgICAgICAgICAmTXV0YWJsZUlubGluZWRTdHJpbmdEb25hdGVkQXJyYXkobWVzc2FnZSlbaW5kZXggLyAzMl07CisgICAgICAgICAgdWludDMyX3QgbWFzayA9IH4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDEpIDw8IChpbmRleCAlIDMyKSk7CisgICAgICAgICAgTXV0YWJsZUZpZWxkPElubGluZWRTdHJpbmdGaWVsZD4obWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgICAgIC0+U2V0KHZhbHVlLCBtZXNzYWdlLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgSXNJbmxpbmVkU3RyaW5nRG9uYXRlZCgqbWVzc2FnZSwgZmllbGQpLCBzdGF0ZXMsIG1hc2ssCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gT25lb2Ygc3RyaW5nIGZpZWxkcyBhcmUgbmV2ZXIgc2V0IGFzIGEgZGVmYXVsdCBpbnN0YW5jZS4KKyAgICAgICAgLy8gV2UganVzdCBuZWVkIHRvIHBhc3Mgc29tZSBhcmJpdHJhcnkgZGVmYXVsdCBzdHJpbmcgdG8gbWFrZSBpdCB3b3JrLgorICAgICAgICAvLyBUaGlzIGFsbG93cyB1cyB0byBub3QgaGF2ZSB0aGUgcmVhbCBkZWZhdWx0IGFjY2Vzc2libGUgZnJvbQorICAgICAgICAvLyByZWZsZWN0aW9uLgorICAgICAgICBpZiAoc2NoZW1hXy5JblJlYWxPbmVvZihmaWVsZCkgJiYgIUhhc09uZW9mRmllbGQoKm1lc3NhZ2UsIGZpZWxkKSkgeworICAgICAgICAgIENsZWFyT25lb2YobWVzc2FnZSwgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSk7CisgICAgICAgICAgTXV0YWJsZUZpZWxkPEFyZW5hU3RyaW5nUHRyPihtZXNzYWdlLCBmaWVsZCktPkluaXREZWZhdWx0KCk7CisgICAgICAgIH0KKyAgICAgICAgTXV0YWJsZUZpZWxkPEFyZW5hU3RyaW5nUHRyPihtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgICAgIC0+U2V0KHN0ZDo6bW92ZSh2YWx1ZSksIG1lc3NhZ2UtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworc3RkOjpzdHJpbmcgUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRTdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKEdldFJlcGVhdGVkU3RyaW5nLCBSRVBFQVRFRCwgU1RSSU5HKTsKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0UmVwZWF0ZWRTdHJpbmcoZmllbGQtPm51bWJlcigpLCBpbmRleCk7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgcmV0dXJuIEdldFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KG1lc3NhZ2UsIGZpZWxkLCBpbmRleCk7CisgICAgfQorICB9Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nJiBSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsCisgICAgc3RkOjpzdHJpbmcqIHNjcmF0Y2gpIGNvbnN0IHsKKyAgKHZvaWQpc2NyYXRjaDsgIC8vIFBhcmFtZXRlciBpcyB1c2VkIGJ5IEdvb2dsZS1pbnRlcm5hbCBjb2RlLgorICBVU0FHRV9DSEVDS19BTEwoR2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UsIFJFUEVBVEVELCBTVFJJTkcpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRSZXBlYXRlZFN0cmluZyhmaWVsZC0+bnVtYmVyKCksIGluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICByZXR1cm4gR2V0UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4obWVzc2FnZSwgZmllbGQsIGluZGV4KTsKKyAgICB9CisgIH0KK30KKworCit2b2lkIFJlZmxlY3Rpb246OlNldFJlcGVhdGVkU3RyaW5nKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWUpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKFNldFJlcGVhdGVkU3RyaW5nLCBSRVBFQVRFRCwgU1RSSU5HKTsKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlNldFJlcGVhdGVkU3RyaW5nKGZpZWxkLT5udW1iZXIoKSwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHZhbHVlKSk7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgTXV0YWJsZVJlcGVhdGVkRmllbGQ8c3RkOjpzdHJpbmc+KG1lc3NhZ2UsIGZpZWxkLCBpbmRleCkKKyAgICAgICAgICAgIC0+YXNzaWduKHN0ZDo6bW92ZSh2YWx1ZSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworCit2b2lkIFJlZmxlY3Rpb246OkFkZFN0cmluZyhNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWUpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKEFkZFN0cmluZywgUkVQRUFURUQsIFNUUklORyk7CisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5BZGRTdHJpbmcoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUodmFsdWUpLCBmaWVsZCk7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgQWRkRmllbGQ8c3RkOjpzdHJpbmc+KG1lc3NhZ2UsIGZpZWxkKS0+YXNzaWduKHN0ZDo6bW92ZSh2YWx1ZSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIFJlZmxlY3Rpb246OkdldEVudW0oCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICAvLyBVc2FnZSBjaGVja2VkIGJ5IEdldEVudW1WYWx1ZS4KKyAgaW50IHZhbHVlID0gR2V0RW51bVZhbHVlKG1lc3NhZ2UsIGZpZWxkKTsKKyAgcmV0dXJuIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bih2YWx1ZSk7Cit9CisKK2ludCBSZWZsZWN0aW9uOjpHZXRFbnVtVmFsdWUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoR2V0RW51bVZhbHVlLCBTSU5HVUxBUiwgRU5VTSk7CisKKyAgaW50MzJfdCB2YWx1ZTsKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIHZhbHVlID0gR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLkdldEVudW0oCisgICAgICAgIGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKSk7CisgIH0gZWxzZSBpZiAoc2NoZW1hXy5JblJlYWxPbmVvZihmaWVsZCkgJiYgIUhhc09uZW9mRmllbGQobWVzc2FnZSwgZmllbGQpKSB7CisgICAgdmFsdWUgPSBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtKCktPm51bWJlcigpOworICB9IGVsc2UgeworICAgIHZhbHVlID0gR2V0RmllbGQ8aW50PihtZXNzYWdlLCBmaWVsZCk7CisgIH0KKyAgcmV0dXJuIHZhbHVlOworfQorCit2b2lkIFJlZmxlY3Rpb246OlNldEVudW0oTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgY29uc3QgeworICAvLyBVc2FnZSBjaGVja2VkIGJ5IFNldEVudW1WYWx1ZS4KKyAgVVNBR0VfQ0hFQ0tfRU5VTV9WQUxVRShTZXRFbnVtKTsKKyAgU2V0RW51bVZhbHVlSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIHZhbHVlLT5udW1iZXIoKSk7Cit9CisKK3ZvaWQgUmVmbGVjdGlvbjo6U2V0RW51bVZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKFNldEVudW1WYWx1ZSwgU0lOR1VMQVIsIEVOVU0pOworICBpZiAoIUNyZWF0ZVVua25vd25FbnVtVmFsdWVzKGZpZWxkKSkgeworICAgIC8vIENoZWNrIHRoYXQgdGhlIHZhbHVlIGlzIHZhbGlkIGlmIHdlIGRvbid0IHN1cHBvcnQgZGlyZWN0IHN0b3JhZ2Ugb2YKKyAgICAvLyB1bmtub3duIGVudW0gdmFsdWVzLgorICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlX2Rlc2MgPQorICAgICAgICBmaWVsZC0+ZW51bV90eXBlKCktPkZpbmRWYWx1ZUJ5TnVtYmVyKHZhbHVlKTsKKyAgICBpZiAodmFsdWVfZGVzYyA9PSBudWxscHRyKSB7CisgICAgICBNdXRhYmxlVW5rbm93bkZpZWxkcyhtZXNzYWdlKS0+QWRkVmFyaW50KGZpZWxkLT5udW1iZXIoKSwgdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBTZXRFbnVtVmFsdWVJbnRlcm5hbChtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOworfQorCit2b2lkIFJlZmxlY3Rpb246OlNldEVudW1WYWx1ZUludGVybmFsKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgY29uc3QgeworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+U2V0RW51bShmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQpOworICB9IGVsc2UgeworICAgIFNldEZpZWxkPGludD4obWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKKyAgfQorfQorCitjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZEVudW0oCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7CisgIC8vIFVzYWdlIGNoZWNrZWQgYnkgR2V0UmVwZWF0ZWRFbnVtVmFsdWUuCisgIGludCB2YWx1ZSA9IEdldFJlcGVhdGVkRW51bVZhbHVlKG1lc3NhZ2UsIGZpZWxkLCBpbmRleCk7CisgIHJldHVybiBmaWVsZC0+ZW51bV90eXBlKCktPkZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24odmFsdWUpOworfQorCitpbnQgUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRFbnVtVmFsdWUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoR2V0UmVwZWF0ZWRFbnVtVmFsdWUsIFJFUEVBVEVELCBFTlVNKTsKKworICBpbnQgdmFsdWU7CisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICB2YWx1ZSA9IEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRSZXBlYXRlZEVudW0oZmllbGQtPm51bWJlcigpLCBpbmRleCk7CisgIH0gZWxzZSB7CisgICAgdmFsdWUgPSBHZXRSZXBlYXRlZEZpZWxkPGludD4obWVzc2FnZSwgZmllbGQsIGluZGV4KTsKKyAgfQorICByZXR1cm4gdmFsdWU7Cit9CisKK3ZvaWQgUmVmbGVjdGlvbjo6U2V0UmVwZWF0ZWRFbnVtKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgY29uc3QgeworICAvLyBVc2FnZSBjaGVja2VkIGJ5IFNldFJlcGVhdGVkRW51bVZhbHVlLgorICBVU0FHRV9DSEVDS19FTlVNX1ZBTFVFKFNldFJlcGVhdGVkRW51bSk7CisgIFNldFJlcGVhdGVkRW51bVZhbHVlSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIGluZGV4LCB2YWx1ZS0+bnVtYmVyKCkpOworfQorCit2b2lkIFJlZmxlY3Rpb246OlNldFJlcGVhdGVkRW51bVZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChTZXRSZXBlYXRlZEVudW0sIFJFUEVBVEVELCBFTlVNKTsKKyAgaWYgKCFDcmVhdGVVbmtub3duRW51bVZhbHVlcyhmaWVsZCkpIHsKKyAgICAvLyBDaGVjayB0aGF0IHRoZSB2YWx1ZSBpcyB2YWxpZCBpZiB3ZSBkb24ndCBzdXBwb3J0IGRpcmVjdCBzdG9yYWdlIG9mCisgICAgLy8gdW5rbm93biBlbnVtIHZhbHVlcy4KKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZV9kZXNjID0KKyAgICAgICAgZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7CisgICAgaWYgKHZhbHVlX2Rlc2MgPT0gbnVsbHB0cikgeworICAgICAgTXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZSktPkFkZFZhcmludChmaWVsZC0+bnVtYmVyKCksIHZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgU2V0UmVwZWF0ZWRFbnVtVmFsdWVJbnRlcm5hbChtZXNzYWdlLCBmaWVsZCwgaW5kZXgsIHZhbHVlKTsKK30KKwordm9pZCBSZWZsZWN0aW9uOjpTZXRSZXBlYXRlZEVudW1WYWx1ZUludGVybmFsKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGludCB2YWx1ZSkgY29uc3QgeworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+U2V0UmVwZWF0ZWRFbnVtKGZpZWxkLT5udW1iZXIoKSwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICBTZXRSZXBlYXRlZEZpZWxkPGludD4obWVzc2FnZSwgZmllbGQsIGluZGV4LCB2YWx1ZSk7CisgIH0KK30KKwordm9pZCBSZWZsZWN0aW9uOjpBZGRFbnVtKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0IHsKKyAgLy8gVXNhZ2UgY2hlY2tlZCBieSBBZGRFbnVtVmFsdWUuCisgIFVTQUdFX0NIRUNLX0VOVU1fVkFMVUUoQWRkRW51bSk7CisgIEFkZEVudW1WYWx1ZUludGVybmFsKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZS0+bnVtYmVyKCkpOworfQorCit2b2lkIFJlZmxlY3Rpb246OkFkZEVudW1WYWx1ZShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChBZGRFbnVtLCBSRVBFQVRFRCwgRU5VTSk7CisgIGlmICghQ3JlYXRlVW5rbm93bkVudW1WYWx1ZXMoZmllbGQpKSB7CisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdmFsdWUgaXMgdmFsaWQgaWYgd2UgZG9uJ3Qgc3VwcG9ydCBkaXJlY3Qgc3RvcmFnZSBvZgorICAgIC8vIHVua25vd24gZW51bSB2YWx1ZXMuCisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWVfZGVzYyA9CisgICAgICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOworICAgIGlmICh2YWx1ZV9kZXNjID09IG51bGxwdHIpIHsKKyAgICAgIE11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UpLT5BZGRWYXJpbnQoZmllbGQtPm51bWJlcigpLCB2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIEFkZEVudW1WYWx1ZUludGVybmFsKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7Cit9CisKK3ZvaWQgUmVmbGVjdGlvbjo6QWRkRW51bVZhbHVlSW50ZXJuYWwoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSBjb25zdCB7CisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5BZGRFbnVtKGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5vcHRpb25zKCkucGFja2VkKCksIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQpOworICB9IGVsc2UgeworICAgIEFkZEZpZWxkPGludD4obWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NvbnN0IE1lc3NhZ2UqIFJlZmxlY3Rpb246OkdldERlZmF1bHRNZXNzYWdlSW5zdGFuY2UoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIGdlbmVyYXRlZCBmYWN0b3J5LCB3ZSBjYWNoZSB0aGUgcHJvdG90eXBlIGluIHRoZSBmaWVsZAorICAvLyBkZXNjcmlwdG9yIGZvciBmYXN0ZXIgYWNjZXNzLgorICAvLyBUaGUgZGVmYXVsdCBpbnN0YW5jZXMgb2YgZ2VuZXJhdGVkIG1lc3NhZ2VzIGFyZSBub3QgY3Jvc3MtbGlua2VkLCB3aGljaAorICAvLyBtZWFucyB0aGV5IGNvbnRhaW4gbnVsbCBwb2ludGVycyBvbiB0aGVpciBtZXNzYWdlIGZpZWxkcyBhbmQgY2FuJ3QgYmUgdXNlZAorICAvLyB0byBnZXQgdGhlIGRlZmF1bHQgb2Ygc3VibWVzc2FnZXMuCisgIGlmIChtZXNzYWdlX2ZhY3RvcnlfID09IE1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpKSB7CisgICAgYXV0byYgcHRyID0gZmllbGQtPmRlZmF1bHRfZ2VuZXJhdGVkX2luc3RhbmNlXzsKKyAgICBhdXRvKiByZXMgPSBwdHIubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgICBpZiAocmVzID09IG51bGxwdHIpIHsKKyAgICAgIC8vIEZpcnN0IHRpbWUgYXNraW5nIGZvciB0aGlzIGZpZWxkJ3MgZGVmYXVsdC4gTG9hZCBpdCBhbmQgY2FjaGUgaXQuCisgICAgICByZXMgPSBtZXNzYWdlX2ZhY3RvcnlfLT5HZXRQcm90b3R5cGUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKTsKKyAgICAgIHB0ci5zdG9yZShyZXMsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgLy8gRm9yIG90aGVyIGZhY3Rvcmllcywgd2UgdHJ5IHRoZSBkZWZhdWx0J3Mgb2JqZWN0IGZpZWxkLgorICAvLyBJbiBwYXJ0aWN1bGFyLCB0aGUgRHluYW1pY01lc3NhZ2VGYWN0b3J5IHdpbGwgY3Jvc3MgbGluayB0aGUgZGVmYXVsdAorICAvLyBpbnN0YW5jZXMgdG8gYWxsb3cgZm9yIHRoaXMuIEJ1dCBvbmx5IGRvIHRoaXMgZm9yIHJlYWwgZmllbGRzLgorICAvLyBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiB0byBhdm9pZCBnb2luZyB0byBHZXRQcm90b3R5cGUoKSBiZWxvdywgYXMgdGhhdAorICAvLyByZXF1aXJlcyBhIGxvY2sgYW5kIGEgbWFwIGxvb2t1cC4KKyAgaWYgKCFmaWVsZC0+aXNfZXh0ZW5zaW9uKCkgJiYgIWZpZWxkLT5vcHRpb25zKCkud2VhaygpICYmCisgICAgICAhSXNMYXp5RmllbGQoZmllbGQpICYmICFzY2hlbWFfLkluUmVhbE9uZW9mKGZpZWxkKSkgeworICAgIGF1dG8qIHJlcyA9IERlZmF1bHRSYXc8Y29uc3QgTWVzc2FnZSo+KGZpZWxkKTsKKyAgICBpZiAocmVzICE9IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiByZXM7CisgICAgfQorICB9CisgIC8vIE90aGVyd2lzZSwganVzdCBnbyB0byB0aGUgZmFjdG9yeS4KKyAgcmV0dXJuIG1lc3NhZ2VfZmFjdG9yeV8tPkdldFByb3RvdHlwZShmaWVsZC0+bWVzc2FnZV90eXBlKCkpOworfQorCitjb25zdCBNZXNzYWdlJiBSZWZsZWN0aW9uOjpHZXRNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChHZXRNZXNzYWdlLCBTSU5HVUxBUiwgTUVTU0FHRSk7CisgIENoZWNrSW52YWxpZEFjY2VzcyhzY2hlbWFfLCBmaWVsZCk7CisKKyAgaWYgKGZhY3RvcnkgPT0gbnVsbHB0cikgZmFjdG9yeSA9IG1lc3NhZ2VfZmFjdG9yeV87CisKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBNZXNzYWdlJj4oR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLkdldE1lc3NhZ2UoCisgICAgICAgIGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCBmYWN0b3J5KSk7CisgIH0gZWxzZSB7CisgICAgaWYgKHNjaGVtYV8uSW5SZWFsT25lb2YoZmllbGQpICYmICFIYXNPbmVvZkZpZWxkKG1lc3NhZ2UsIGZpZWxkKSkgeworICAgICAgcmV0dXJuICpHZXREZWZhdWx0TWVzc2FnZUluc3RhbmNlKGZpZWxkKTsKKyAgICB9CisgICAgY29uc3QgTWVzc2FnZSogcmVzdWx0ID0gR2V0UmF3PGNvbnN0IE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCk7CisgICAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICByZXN1bHQgPSBHZXREZWZhdWx0TWVzc2FnZUluc3RhbmNlKGZpZWxkKTsKKyAgICB9CisgICAgcmV0dXJuICpyZXN1bHQ7CisgIH0KK30KKworTWVzc2FnZSogUmVmbGVjdGlvbjo6TXV0YWJsZU1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoTXV0YWJsZU1lc3NhZ2UsIFNJTkdVTEFSLCBNRVNTQUdFKTsKKyAgQ2hlY2tJbnZhbGlkQWNjZXNzKHNjaGVtYV8sIGZpZWxkKTsKKworICBpZiAoZmFjdG9yeSA9PSBudWxscHRyKSBmYWN0b3J5ID0gbWVzc2FnZV9mYWN0b3J5XzsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1lc3NhZ2UqPigKKyAgICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+TXV0YWJsZU1lc3NhZ2UoZmllbGQsIGZhY3RvcnkpKTsKKyAgfSBlbHNlIHsKKyAgICBNZXNzYWdlKiByZXN1bHQ7CisKKyAgICBNZXNzYWdlKiogcmVzdWx0X2hvbGRlciA9IE11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKTsKKworICAgIGlmIChzY2hlbWFfLkluUmVhbE9uZW9mKGZpZWxkKSkgeworICAgICAgaWYgKCFIYXNPbmVvZkZpZWxkKCptZXNzYWdlLCBmaWVsZCkpIHsKKyAgICAgICAgQ2xlYXJPbmVvZihtZXNzYWdlLCBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKTsKKyAgICAgICAgcmVzdWx0X2hvbGRlciA9IE11dGFibGVGaWVsZDxNZXNzYWdlKj4obWVzc2FnZSwgZmllbGQpOworICAgICAgICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X21lc3NhZ2UgPSBHZXREZWZhdWx0TWVzc2FnZUluc3RhbmNlKGZpZWxkKTsKKyAgICAgICAgKnJlc3VsdF9ob2xkZXIgPSBkZWZhdWx0X21lc3NhZ2UtPk5ldyhtZXNzYWdlLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFNldEJpdChtZXNzYWdlLCBmaWVsZCk7CisgICAgfQorCisgICAgaWYgKCpyZXN1bHRfaG9sZGVyID09IG51bGxwdHIpIHsKKyAgICAgIGNvbnN0IE1lc3NhZ2UqIGRlZmF1bHRfbWVzc2FnZSA9IEdldERlZmF1bHRNZXNzYWdlSW5zdGFuY2UoZmllbGQpOworICAgICAgKnJlc3VsdF9ob2xkZXIgPSBkZWZhdWx0X21lc3NhZ2UtPk5ldyhtZXNzYWdlLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICAgfQorICAgIHJlc3VsdCA9ICpyZXN1bHRfaG9sZGVyOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKwordm9pZCBSZWZsZWN0aW9uOjpVbnNhZmVBcmVuYVNldEFsbG9jYXRlZE1lc3NhZ2UoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgTWVzc2FnZSogc3ViX21lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoU2V0QWxsb2NhdGVkTWVzc2FnZSwgU0lOR1VMQVIsIE1FU1NBR0UpOworICBDaGVja0ludmFsaWRBY2Nlc3Moc2NoZW1hXywgZmllbGQpOworCisKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZSgKKyAgICAgICAgZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpLCBmaWVsZCwgc3ViX21lc3NhZ2UpOworICB9IGVsc2UgeworICAgIGlmIChzY2hlbWFfLkluUmVhbE9uZW9mKGZpZWxkKSkgeworICAgICAgaWYgKHN1Yl9tZXNzYWdlID09IG51bGxwdHIpIHsKKyAgICAgICAgQ2xlYXJPbmVvZihtZXNzYWdlLCBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgICBDbGVhck9uZW9mKG1lc3NhZ2UsIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpOworICAgICAgICAqTXV0YWJsZVJhdzxNZXNzYWdlKj4obWVzc2FnZSwgZmllbGQpID0gc3ViX21lc3NhZ2U7CisgICAgICBTZXRPbmVvZkNhc2UobWVzc2FnZSwgZmllbGQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzdWJfbWVzc2FnZSA9PSBudWxscHRyKSB7CisgICAgICBDbGVhckJpdChtZXNzYWdlLCBmaWVsZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNldEJpdChtZXNzYWdlLCBmaWVsZCk7CisgICAgfQorICAgIE1lc3NhZ2UqKiBzdWJfbWVzc2FnZV9ob2xkZXIgPSBNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCk7CisgICAgaWYgKG1lc3NhZ2UtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpIHsKKyAgICAgIGRlbGV0ZSAqc3ViX21lc3NhZ2VfaG9sZGVyOworICAgIH0KKyAgICAqc3ViX21lc3NhZ2VfaG9sZGVyID0gc3ViX21lc3NhZ2U7CisgIH0KK30KKwordm9pZCBSZWZsZWN0aW9uOjpTZXRBbGxvY2F0ZWRNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyhzdWJfbWVzc2FnZSA9PSBudWxscHRyIHx8IHN1Yl9tZXNzYWdlLT5HZXRPd25pbmdBcmVuYSgpID09IG51bGxwdHIgfHwKKyAgICAgICAgIHN1Yl9tZXNzYWdlLT5HZXRPd25pbmdBcmVuYSgpID09IG1lc3NhZ2UtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgQ2hlY2tJbnZhbGlkQWNjZXNzKHNjaGVtYV8sIGZpZWxkKTsKKworICAvLyBJZiBtZXNzYWdlIGFuZCBzdWItbWVzc2FnZSBhcmUgaW4gZGlmZmVyZW50IG1lbW9yeSBvd25lcnNoaXAgZG9tYWlucworICAvLyAoZGlmZmVyZW50IGFyZW5hcywgb3Igb25lIGlzIG9uIGhlYXAgYW5kIG9uZSBpcyBub3QpLCB0aGVuIHdlIG1heSBuZWVkIHRvCisgIC8vIGRvIGEgY29weS4KKyAgaWYgKHN1Yl9tZXNzYWdlICE9IG51bGxwdHIgJiYKKyAgICAgIHN1Yl9tZXNzYWdlLT5HZXRPd25pbmdBcmVuYSgpICE9IG1lc3NhZ2UtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKSB7CisgICAgaWYgKHN1Yl9tZXNzYWdlLT5HZXRPd25pbmdBcmVuYSgpID09IG51bGxwdHIgJiYKKyAgICAgICAgbWVzc2FnZS0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgIT0gbnVsbHB0cikgeworICAgICAgLy8gQ2FzZSAxOiBwYXJlbnQgaXMgb24gYW4gYXJlbmEgYW5kIGNoaWxkIGlzIGhlYXAtYWxsb2NhdGVkLiBXZSBjYW4gYWRkCisgICAgICAvLyB0aGUgY2hpbGQgdG8gdGhlIGFyZW5hJ3MgT3duKCkgbGlzdCB0byBmcmVlIG9uIGFyZW5hIGRlc3RydWN0aW9uLCB0aGVuCisgICAgICAvLyBzZXQgb3VyIHBvaW50ZXIuCisgICAgICBtZXNzYWdlLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKS0+T3duKHN1Yl9tZXNzYWdlKTsKKyAgICAgIFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZShtZXNzYWdlLCBzdWJfbWVzc2FnZSwgZmllbGQpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBDYXNlIDI6IGFsbCBvdGhlciBjYXNlcy4gV2UgbmVlZCB0byBtYWtlIGEgY29weS4gTXV0YWJsZU1lc3NhZ2UoKSB3aWxsCisgICAgICAvLyBlaXRoZXIgZ2V0IHRoZSBleGlzdGluZyBtZXNzYWdlIG9iamVjdCwgb3IgaW5zdGFudGlhdGUgYSBuZXcgb25lIGFzCisgICAgICAvLyBhcHByb3ByaWF0ZSB3LnIudC4gb3VyIGFyZW5hLgorICAgICAgTWVzc2FnZSogc3ViX21lc3NhZ2VfY29weSA9IE11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgIHN1Yl9tZXNzYWdlX2NvcHktPkNvcHlGcm9tKCpzdWJfbWVzc2FnZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIFNhbWUgbWVtb3J5IG93bmVyc2hpcCBkb21haW5zLgorICAgIFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZShtZXNzYWdlLCBzdWJfbWVzc2FnZSwgZmllbGQpOworICB9Cit9CisKK01lc3NhZ2UqIFJlZmxlY3Rpb246OlVuc2FmZUFyZW5hUmVsZWFzZU1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKFJlbGVhc2VNZXNzYWdlLCBTSU5HVUxBUiwgTUVTU0FHRSk7CisgIENoZWNrSW52YWxpZEFjY2VzcyhzY2hlbWFfLCBmaWVsZCk7CisKKyAgaWYgKGZhY3RvcnkgPT0gbnVsbHB0cikgZmFjdG9yeSA9IG1lc3NhZ2VfZmFjdG9yeV87CisKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNZXNzYWdlKj4oCisgICAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlVuc2FmZUFyZW5hUmVsZWFzZU1lc3NhZ2UoZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSkpOworICB9IGVsc2UgeworICAgIGlmICghKGZpZWxkLT5pc19yZXBlYXRlZCgpIHx8IHNjaGVtYV8uSW5SZWFsT25lb2YoZmllbGQpKSkgeworICAgICAgQ2xlYXJCaXQobWVzc2FnZSwgZmllbGQpOworICAgIH0KKyAgICBpZiAoc2NoZW1hXy5JblJlYWxPbmVvZihmaWVsZCkpIHsKKyAgICAgIGlmIChIYXNPbmVvZkZpZWxkKCptZXNzYWdlLCBmaWVsZCkpIHsKKyAgICAgICAgKk11dGFibGVPbmVvZkNhc2UobWVzc2FnZSwgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAgfQorICAgIE1lc3NhZ2UqKiByZXN1bHQgPSBNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCk7CisgICAgTWVzc2FnZSogcmV0ID0gKnJlc3VsdDsKKyAgICAqcmVzdWx0ID0gbnVsbHB0cjsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKK01lc3NhZ2UqIFJlZmxlY3Rpb246OlJlbGVhc2VNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIGNvbnN0IHsKKyAgQ2hlY2tJbnZhbGlkQWNjZXNzKHNjaGVtYV8sIGZpZWxkKTsKKworICBNZXNzYWdlKiByZWxlYXNlZCA9IFVuc2FmZUFyZW5hUmVsZWFzZU1lc3NhZ2UobWVzc2FnZSwgZmllbGQsIGZhY3RvcnkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICByZWxlYXNlZCA9IE1heWJlRm9yY2VDb3B5KG1lc3NhZ2UtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpLCByZWxlYXNlZCk7CisjZW5kaWYgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICBpZiAobWVzc2FnZS0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgIT0gbnVsbHB0ciAmJiByZWxlYXNlZCAhPSBudWxscHRyKSB7CisgICAgTWVzc2FnZSogY29weV9mcm9tX2FyZW5hID0gcmVsZWFzZWQtPk5ldygpOworICAgIGNvcHlfZnJvbV9hcmVuYS0+Q29weUZyb20oKnJlbGVhc2VkKTsKKyAgICByZWxlYXNlZCA9IGNvcHlfZnJvbV9hcmVuYTsKKyAgfQorICByZXR1cm4gcmVsZWFzZWQ7Cit9CisKK2NvbnN0IE1lc3NhZ2UmIFJlZmxlY3Rpb246OkdldFJlcGVhdGVkTWVzc2FnZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChHZXRSZXBlYXRlZE1lc3NhZ2UsIFJFUEVBVEVELCBNRVNTQUdFKTsKKyAgQ2hlY2tJbnZhbGlkQWNjZXNzKHNjaGVtYV8sIGZpZWxkKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IE1lc3NhZ2UmPigKKyAgICAgICAgR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLkdldFJlcGVhdGVkTWVzc2FnZShmaWVsZC0+bnVtYmVyKCksIGluZGV4KSk7CisgIH0gZWxzZSB7CisgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKKyAgICAgIHJldHVybiBHZXRSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgICAuR2V0UmVwZWF0ZWRGaWVsZCgpCisgICAgICAgICAgLkdldDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPihpbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBHZXRSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgIC5HZXQ8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oaW5kZXgpOworICAgIH0KKyAgfQorfQorCitNZXNzYWdlKiBSZWZsZWN0aW9uOjpNdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoTXV0YWJsZVJlcGVhdGVkTWVzc2FnZSwgUkVQRUFURUQsIE1FU1NBR0UpOworICBDaGVja0ludmFsaWRBY2Nlc3Moc2NoZW1hXywgZmllbGQpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TWVzc2FnZSo+KAorICAgICAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5NdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKGZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCkpOworICB9IGVsc2UgeworICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7CisgICAgICByZXR1cm4gTXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgIC0+TXV0YWJsZVJlcGVhdGVkRmllbGQoKQorICAgICAgICAgIC0+TXV0YWJsZTxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPihpbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgICAtPk11dGFibGU8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oaW5kZXgpOworICAgIH0KKyAgfQorfQorCitNZXNzYWdlKiBSZWZsZWN0aW9uOjpBZGRNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChBZGRNZXNzYWdlLCBSRVBFQVRFRCwgTUVTU0FHRSk7CisgIENoZWNrSW52YWxpZEFjY2VzcyhzY2hlbWFfLCBmaWVsZCk7CisKKyAgaWYgKGZhY3RvcnkgPT0gbnVsbHB0cikgZmFjdG9yeSA9IG1lc3NhZ2VfZmFjdG9yeV87CisKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNZXNzYWdlKj4oCisgICAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPkFkZE1lc3NhZ2UoZmllbGQsIGZhY3RvcnkpKTsKKyAgfSBlbHNlIHsKKyAgICBNZXNzYWdlKiByZXN1bHQgPSBudWxscHRyOworCisgICAgLy8gV2UgY2FuJ3QgdXNlIEFkZEZpZWxkPE1lc3NhZ2U+KCkgYmVjYXVzZSBSZXBlYXRlZFB0ckZpZWxkQmFzZSBkb2Vzbid0CisgICAgLy8ga25vdyBob3cgdG8gYWxsb2NhdGUgb25lLgorICAgIFJlcGVhdGVkUHRyRmllbGRCYXNlKiByZXBlYXRlZCA9IG51bGxwdHI7CisgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKKyAgICAgIHJlcGVhdGVkID0KKyAgICAgICAgICBNdXRhYmxlUmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpLT5NdXRhYmxlUmVwZWF0ZWRGaWVsZCgpOworICAgIH0gZWxzZSB7CisgICAgICByZXBlYXRlZCA9IE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICB9CisgICAgcmVzdWx0ID0gcmVwZWF0ZWQtPkFkZEZyb21DbGVhcmVkPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KCk7CisgICAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAvLyBXZSBtdXN0IGFsbG9jYXRlIGEgbmV3IG9iamVjdC4KKyAgICAgIGNvbnN0IE1lc3NhZ2UqIHByb3RvdHlwZTsKKyAgICAgIGlmIChyZXBlYXRlZC0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgcHJvdG90eXBlID0gZmFjdG9yeS0+R2V0UHJvdG90eXBlKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcm90b3R5cGUgPSAmcmVwZWF0ZWQtPkdldDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigwKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCA9IHByb3RvdHlwZS0+TmV3KG1lc3NhZ2UtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgICAgIC8vIFdlIGNhbiBndWFyYW50ZWUgaGVyZSB0aGF0IHJlcGVhdGVkIGFuZCByZXN1bHQgYXJlIGVpdGhlciBib3RoIGhlYXAKKyAgICAgIC8vIGFsbG9jYXRlZCBvciBhcmVuYSBvd25lZC4gU28gaXQgaXMgc2FmZSB0byBjYWxsIHRoZSB1bnNhZmUgdmVyc2lvbgorICAgICAgLy8gb2YgQWRkQWxsb2NhdGVkLgorICAgICAgcmVwZWF0ZWQtPlVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KHJlc3VsdCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCit2b2lkIFJlZmxlY3Rpb246OkFkZEFsbG9jYXRlZE1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG5ld19lbnRyeSkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoQWRkQWxsb2NhdGVkTWVzc2FnZSwgUkVQRUFURUQsIE1FU1NBR0UpOworICBDaGVja0ludmFsaWRBY2Nlc3Moc2NoZW1hXywgZmllbGQpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5BZGRBbGxvY2F0ZWRNZXNzYWdlKGZpZWxkLCBuZXdfZW50cnkpOworICB9IGVsc2UgeworICAgIFJlcGVhdGVkUHRyRmllbGRCYXNlKiByZXBlYXRlZCA9IG51bGxwdHI7CisgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKKyAgICAgIHJlcGVhdGVkID0KKyAgICAgICAgICBNdXRhYmxlUmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpLT5NdXRhYmxlUmVwZWF0ZWRGaWVsZCgpOworICAgIH0gZWxzZSB7CisgICAgICByZXBlYXRlZCA9IE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICB9CisgICAgcmVwZWF0ZWQtPkFkZEFsbG9jYXRlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPihuZXdfZW50cnkpOworICB9Cit9CisKK3ZvaWQgUmVmbGVjdGlvbjo6VW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWRNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbmV3X2VudHJ5KSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChVbnNhZmVBcmVuYUFkZEFsbG9jYXRlZE1lc3NhZ2UsIFJFUEVBVEVELCBNRVNTQUdFKTsKKyAgQ2hlY2tJbnZhbGlkQWNjZXNzKHNjaGVtYV8sIGZpZWxkKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+VW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWRNZXNzYWdlKGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfZW50cnkpOworICB9IGVsc2UgeworICAgIFJlcGVhdGVkUHRyRmllbGRCYXNlKiByZXBlYXRlZCA9IG51bGxwdHI7CisgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKKyAgICAgIHJlcGVhdGVkID0KKyAgICAgICAgICBNdXRhYmxlUmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpLT5NdXRhYmxlUmVwZWF0ZWRGaWVsZCgpOworICAgIH0gZWxzZSB7CisgICAgICByZXBlYXRlZCA9IE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICB9CisgICAgcmVwZWF0ZWQtPlVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPj4obmV3X2VudHJ5KTsKKyAgfQorfQorCit2b2lkKiBSZWZsZWN0aW9uOjpNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogZGVzYykgY29uc3QgeworICAodm9pZCljdHlwZTsgIC8vIFBhcmFtZXRlciBpcyB1c2VkIGJ5IEdvb2dsZS1pbnRlcm5hbCBjb2RlLgorICBVU0FHRV9DSEVDS19SRVBFQVRFRCgiTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQiKTsKKyAgQ2hlY2tJbnZhbGlkQWNjZXNzKHNjaGVtYV8sIGZpZWxkKTsKKworICBpZiAoZmllbGQtPmNwcF90eXBlKCkgIT0gY3BwdHlwZSAmJgorICAgICAgKGZpZWxkLT5jcHBfdHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNIHx8CisgICAgICAgY3BwdHlwZSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzIpKQorICAgIFJlcG9ydFJlZmxlY3Rpb25Vc2FnZVR5cGVFcnJvcihkZXNjcmlwdG9yXywgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZCIsIGNwcHR5cGUpOworICBpZiAoZGVzYyAhPSBudWxscHRyKQorICAgIEdPT0dMRV9DSEVDS19FUShmaWVsZC0+bWVzc2FnZV90eXBlKCksIGRlc2MpIDw8ICJ3cm9uZyBzdWJtZXNzYWdlIHR5cGUiOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPk11dGFibGVSYXdSZXBlYXRlZEZpZWxkKAorICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksIGZpZWxkLT5pc19wYWNrZWQoKSwgZmllbGQpOworICB9IGVsc2UgeworICAgIC8vIFRyaWdnZXIgdHJhbnNmb3JtIGZvciBNYXBGaWVsZAorICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7CisgICAgICByZXR1cm4gTXV0YWJsZVJhd05vbk9uZW9mPE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgLT5NdXRhYmxlUmVwZWF0ZWRGaWVsZCgpOworICAgIH0KKyAgICByZXR1cm4gTXV0YWJsZVJhd05vbk9uZW9mPHZvaWQ+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgfQorfQorCitjb25zdCB2b2lkKiBSZWZsZWN0aW9uOjpHZXRSYXdSZXBlYXRlZEZpZWxkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfUkVQRUFURUQoIkdldFJhd1JlcGVhdGVkRmllbGQiKTsKKyAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpICE9IGNwcHR5cGUpCisgICAgUmVwb3J0UmVmbGVjdGlvblVzYWdlVHlwZUVycm9yKGRlc2NyaXB0b3JfLCBmaWVsZCwgIkdldFJhd1JlcGVhdGVkRmllbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHB0eXBlKTsKKyAgaWYgKGN0eXBlID49IDApCisgICAgR09PR0xFX0NIRUNLX0VRKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSwgY3R5cGUpIDw8ICJzdWJ0eXBlIG1pc21hdGNoIjsKKyAgaWYgKGRlc2MgIT0gbnVsbHB0cikKKyAgICBHT09HTEVfQ0hFQ0tfRVEoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCBkZXNjKSA8PCAid3Jvbmcgc3VibWVzc2FnZSB0eXBlIjsKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIC8vIFNob3VsZCB1c2UgZXh0ZW5zaW9uX3NldDo6R2V0UmF3UmVwZWF0ZWRGaWVsZC4gSG93ZXZlciwgdGhlIHJlcXVpcmVkCisgICAgLy8gcGFyYW1ldGVyICJkZWZhdWx0IHJlcGVhdGVkIHZhbHVlIiBpcyBub3QgdmVyeSBlYXN5IHRvIGdldCBoZXJlLgorICAgIC8vIE1hcCBpcyBub3Qgc3VwcG9ydGVkIGluIGV4dGVuc2lvbnMsIGl0IGlzIGFjY2VwdGFibGUgdG8gdXNlCisgICAgLy8gZXh0ZW5zaW9uX3NldDo6TXV0YWJsZVJhd1JlcGVhdGVkRmllbGQgd2hpY2ggZG9lcyBub3QgY2hhbmdlIHRoZSBtZXNzYWdlLgorICAgIHJldHVybiBNdXRhYmxlRXh0ZW5zaW9uU2V0KGNvbnN0X2Nhc3Q8TWVzc2FnZSo+KCZtZXNzYWdlKSkKKyAgICAgICAgLT5NdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmlzX3BhY2tlZCgpLCBmaWVsZCk7CisgIH0gZWxzZSB7CisgICAgLy8gVHJpZ2dlciB0cmFuc2Zvcm0gZm9yIE1hcEZpZWxkCisgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKKyAgICAgIHJldHVybiAmKEdldFJhd05vbk9uZW9mPE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpLkdldFJlcGVhdGVkRmllbGQoKSk7CisgICAgfQorICAgIHJldHVybiAmR2V0UmF3Tm9uT25lb2Y8Y2hhcj4obWVzc2FnZSwgZmllbGQpOworICB9Cit9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvciogUmVmbGVjdGlvbjo6R2V0T25lb2ZGaWVsZERlc2NyaXB0b3IoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZXNjcmlwdG9yKSBjb25zdCB7CisgIGlmIChvbmVvZl9kZXNjcmlwdG9yLT5pc19zeW50aGV0aWMoKSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBvbmVvZl9kZXNjcmlwdG9yLT5maWVsZCgwKTsKKyAgICByZXR1cm4gSGFzRmllbGQobWVzc2FnZSwgZmllbGQpID8gZmllbGQgOiBudWxscHRyOworICB9CisgIHVpbnQzMl90IGZpZWxkX251bWJlciA9IEdldE9uZW9mQ2FzZShtZXNzYWdlLCBvbmVvZl9kZXNjcmlwdG9yKTsKKyAgaWYgKGZpZWxkX251bWJlciA9PSAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU51bWJlcihmaWVsZF9udW1iZXIpOworfQorCitib29sIFJlZmxlY3Rpb246OkNvbnRhaW5zTWFwS2V5KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hcEtleSYga2V5KSBjb25zdCB7CisgIFVTQUdFX0NIRUNLKElzTWFwRmllbGRJbkFwaShmaWVsZCksICJMb29rdXBNYXBWYWx1ZSIsCisgICAgICAgICAgICAgICJGaWVsZCBpcyBub3QgYSBtYXAgZmllbGQuIik7CisgIHJldHVybiBHZXRSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkuQ29udGFpbnNNYXBLZXkoa2V5KTsKK30KKworYm9vbCBSZWZsZWN0aW9uOjpJbnNlcnRPckxvb2t1cE1hcFZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXBLZXkmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBWYWx1ZVJlZiogdmFsKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLKElzTWFwRmllbGRJbkFwaShmaWVsZCksICJJbnNlcnRPckxvb2t1cE1hcFZhbHVlIiwKKyAgICAgICAgICAgICAgIkZpZWxkIGlzIG5vdCBhIG1hcCBmaWVsZC4iKTsKKyAgdmFsLT5TZXRUeXBlKGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+bWFwX3ZhbHVlKCktPmNwcF90eXBlKCkpOworICByZXR1cm4gTXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKGtleSwgdmFsKTsKK30KKworYm9vbCBSZWZsZWN0aW9uOjpMb29rdXBNYXBWYWx1ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBjb25zdCBNYXBLZXkmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwVmFsdWVDb25zdFJlZiogdmFsKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLKElzTWFwRmllbGRJbkFwaShmaWVsZCksICJMb29rdXBNYXBWYWx1ZSIsCisgICAgICAgICAgICAgICJGaWVsZCBpcyBub3QgYSBtYXAgZmllbGQuIik7CisgIHZhbC0+U2V0VHlwZShmaWVsZC0+bWVzc2FnZV90eXBlKCktPm1hcF92YWx1ZSgpLT5jcHBfdHlwZSgpKTsKKyAgcmV0dXJuIEdldFJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKS5Mb29rdXBNYXBWYWx1ZShrZXksIHZhbCk7Cit9CisKK2Jvb2wgUmVmbGVjdGlvbjo6RGVsZXRlTWFwVmFsdWUoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFwS2V5JiBrZXkpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0soSXNNYXBGaWVsZEluQXBpKGZpZWxkKSwgIkRlbGV0ZU1hcFZhbHVlIiwKKyAgICAgICAgICAgICAgIkZpZWxkIGlzIG5vdCBhIG1hcCBmaWVsZC4iKTsKKyAgcmV0dXJuIE11dGFibGVSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCktPkRlbGV0ZU1hcFZhbHVlKGtleSk7Cit9CisKK01hcEl0ZXJhdG9yIFJlZmxlY3Rpb246Ok1hcEJlZ2luKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLKElzTWFwRmllbGRJbkFwaShmaWVsZCksICJNYXBCZWdpbiIsICJGaWVsZCBpcyBub3QgYSBtYXAgZmllbGQuIik7CisgIE1hcEl0ZXJhdG9yIGl0ZXIobWVzc2FnZSwgZmllbGQpOworICBHZXRSYXc8TWFwRmllbGRCYXNlPigqbWVzc2FnZSwgZmllbGQpLk1hcEJlZ2luKCZpdGVyKTsKKyAgcmV0dXJuIGl0ZXI7Cit9CisKK01hcEl0ZXJhdG9yIFJlZmxlY3Rpb246Ok1hcEVuZChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0soSXNNYXBGaWVsZEluQXBpKGZpZWxkKSwgIk1hcEVuZCIsICJGaWVsZCBpcyBub3QgYSBtYXAgZmllbGQuIik7CisgIE1hcEl0ZXJhdG9yIGl0ZXIobWVzc2FnZSwgZmllbGQpOworICBHZXRSYXc8TWFwRmllbGRCYXNlPigqbWVzc2FnZSwgZmllbGQpLk1hcEVuZCgmaXRlcik7CisgIHJldHVybiBpdGVyOworfQorCitpbnQgUmVmbGVjdGlvbjo6TWFwU2l6ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBVU0FHRV9DSEVDSyhJc01hcEZpZWxkSW5BcGkoZmllbGQpLCAiTWFwU2l6ZSIsICJGaWVsZCBpcyBub3QgYSBtYXAgZmllbGQuIik7CisgIHJldHVybiBHZXRSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkuc2l6ZSgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIFJlZmxlY3Rpb246OkZpbmRLbm93bkV4dGVuc2lvbkJ5TmFtZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3QgeworICBpZiAoIXNjaGVtYV8uSGFzRXh0ZW5zaW9uU2V0KCkpIHJldHVybiBudWxscHRyOworICByZXR1cm4gZGVzY3JpcHRvcl9wb29sXy0+RmluZEV4dGVuc2lvbkJ5UHJpbnRhYmxlTmFtZShkZXNjcmlwdG9yXywgbmFtZSk7Cit9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvciogUmVmbGVjdGlvbjo6RmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoCisgICAgaW50IG51bWJlcikgY29uc3QgeworICBpZiAoIXNjaGVtYV8uSGFzRXh0ZW5zaW9uU2V0KCkpIHJldHVybiBudWxscHRyOworICByZXR1cm4gZGVzY3JpcHRvcl9wb29sXy0+RmluZEV4dGVuc2lvbkJ5TnVtYmVyKGRlc2NyaXB0b3JfLCBudW1iZXIpOworfQorCitib29sIFJlZmxlY3Rpb246OlN1cHBvcnRzVW5rbm93bkVudW1WYWx1ZXMoKSBjb25zdCB7CisgIHJldHVybiBDcmVhdGVVbmtub3duRW51bVZhbHVlcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gU29tZSBwcml2YXRlIGhlbHBlcnMuCisKKy8vIFRoZXNlIHNpbXBsZSB0ZW1wbGF0ZSBhY2Nlc3NvcnMgb2J0YWluIHBvaW50ZXJzIChvciByZWZlcmVuY2VzKSB0bworLy8gdGhlIGdpdmVuIGZpZWxkLgorCit0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4KK2NvbnN0IFR5cGUmIFJlZmxlY3Rpb246OkdldFJhd05vbk9uZW9mKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHJldHVybiBHZXRDb25zdFJlZkF0T2Zmc2V0PFR5cGU+KG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYV8uR2V0RmllbGRPZmZzZXROb25PbmVvZihmaWVsZCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4KK1R5cGUqIFJlZmxlY3Rpb246Ok11dGFibGVSYXdOb25PbmVvZihNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFBvaW50ZXJBdE9mZnNldDxUeXBlPihtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYV8uR2V0RmllbGRPZmZzZXROb25PbmVvZihmaWVsZCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK1R5cGUqIFJlZmxlY3Rpb246Ok11dGFibGVSYXcoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICByZXR1cm4gR2V0UG9pbnRlckF0T2Zmc2V0PFR5cGU+KG1lc3NhZ2UsIHNjaGVtYV8uR2V0RmllbGRPZmZzZXQoZmllbGQpKTsKK30KKworY29uc3QgdWludDMyX3QqIFJlZmxlY3Rpb246OkdldEhhc0JpdHMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgeworICBHT09HTEVfRENIRUNLKHNjaGVtYV8uSGFzSGFzYml0cygpKTsKKyAgcmV0dXJuICZHZXRDb25zdFJlZkF0T2Zmc2V0PHVpbnQzMl90PihtZXNzYWdlLCBzY2hlbWFfLkhhc0JpdHNPZmZzZXQoKSk7Cit9CisKK3VpbnQzMl90KiBSZWZsZWN0aW9uOjpNdXRhYmxlSGFzQml0cyhNZXNzYWdlKiBtZXNzYWdlKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0soc2NoZW1hXy5IYXNIYXNiaXRzKCkpOworICByZXR1cm4gR2V0UG9pbnRlckF0T2Zmc2V0PHVpbnQzMl90PihtZXNzYWdlLCBzY2hlbWFfLkhhc0JpdHNPZmZzZXQoKSk7Cit9CisKK3VpbnQzMl90KiBSZWZsZWN0aW9uOjpNdXRhYmxlT25lb2ZDYXNlKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvcikgY29uc3QgeworICBHT09HTEVfRENIRUNLKCFvbmVvZl9kZXNjcmlwdG9yLT5pc19zeW50aGV0aWMoKSk7CisgIHJldHVybiBHZXRQb2ludGVyQXRPZmZzZXQ8dWludDMyX3Q+KAorICAgICAgbWVzc2FnZSwgc2NoZW1hXy5HZXRPbmVvZkNhc2VPZmZzZXQob25lb2ZfZGVzY3JpcHRvcikpOworfQorCitjb25zdCBFeHRlbnNpb25TZXQmIFJlZmxlY3Rpb246OkdldEV4dGVuc2lvblNldChjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCB7CisgIHJldHVybiBHZXRDb25zdFJlZkF0T2Zmc2V0PEV4dGVuc2lvblNldD4obWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFfLkdldEV4dGVuc2lvblNldE9mZnNldCgpKTsKK30KKworRXh0ZW5zaW9uU2V0KiBSZWZsZWN0aW9uOjpNdXRhYmxlRXh0ZW5zaW9uU2V0KE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFBvaW50ZXJBdE9mZnNldDxFeHRlbnNpb25TZXQ+KG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFfLkdldEV4dGVuc2lvblNldE9mZnNldCgpKTsKK30KKworY29uc3QgSW50ZXJuYWxNZXRhZGF0YSYgUmVmbGVjdGlvbjo6R2V0SW50ZXJuYWxNZXRhZGF0YSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCB7CisgIHJldHVybiBHZXRDb25zdFJlZkF0T2Zmc2V0PEludGVybmFsTWV0YWRhdGE+KG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYV8uR2V0TWV0YWRhdGFPZmZzZXQoKSk7Cit9CisKK0ludGVybmFsTWV0YWRhdGEqIFJlZmxlY3Rpb246Ok11dGFibGVJbnRlcm5hbE1ldGFkYXRhKE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFBvaW50ZXJBdE9mZnNldDxJbnRlcm5hbE1ldGFkYXRhPihtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYV8uR2V0TWV0YWRhdGFPZmZzZXQoKSk7Cit9CisKK2NvbnN0IHVpbnQzMl90KiBSZWZsZWN0aW9uOjpHZXRJbmxpbmVkU3RyaW5nRG9uYXRlZEFycmF5KAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyhzY2hlbWFfLkhhc0lubGluZWRTdHJpbmcoKSk7CisgIHJldHVybiAmR2V0Q29uc3RSZWZBdE9mZnNldDx1aW50MzJfdD4obWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFfLklubGluZWRTdHJpbmdEb25hdGVkT2Zmc2V0KCkpOworfQorCit1aW50MzJfdCogUmVmbGVjdGlvbjo6TXV0YWJsZUlubGluZWRTdHJpbmdEb25hdGVkQXJyYXkoTWVzc2FnZSogbWVzc2FnZSkgY29uc3QgeworICBHT09HTEVfRENIRUNLKHNjaGVtYV8uSGFzSW5saW5lZFN0cmluZygpKTsKKyAgcmV0dXJuIEdldFBvaW50ZXJBdE9mZnNldDx1aW50MzJfdD4obWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hXy5JbmxpbmVkU3RyaW5nRG9uYXRlZE9mZnNldCgpKTsKK30KKworLy8gU2ltcGxlIGFjY2Vzc29ycyBmb3IgbWFuaXB1bGF0aW5nIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXzsKK2Jvb2wgUmVmbGVjdGlvbjo6SXNJbmxpbmVkU3RyaW5nRG9uYXRlZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgdWludDMyX3QgaW5kZXggPSBzY2hlbWFfLklubGluZWRTdHJpbmdJbmRleChmaWVsZCk7CisgIEdPT0dMRV9EQ0hFQ0tfR1QoaW5kZXgsIDApOworICByZXR1cm4gSXNJbmRleEluSGFzQml0U2V0KEdldElubGluZWRTdHJpbmdEb25hdGVkQXJyYXkobWVzc2FnZSksIGluZGV4KTsKK30KKworaW5saW5lIHZvaWQgU2V0SW5saW5lZFN0cmluZ0RvbmF0ZWQodWludDMyX3QgaW5kZXgsIHVpbnQzMl90KiBhcnJheSkgeworICBhcnJheVtpbmRleCAvIDMyXSB8PSAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDEpIDw8IChpbmRleCAlIDMyKSk7Cit9CisKK2lubGluZSB2b2lkIENsZWFySW5saW5lZFN0cmluZ0RvbmF0ZWQodWludDMyX3QgaW5kZXgsIHVpbnQzMl90KiBhcnJheSkgeworICBhcnJheVtpbmRleCAvIDMyXSAmPSB+KHN0YXRpY19jYXN0PHVpbnQzMl90PigxKSA8PCAoaW5kZXggJSAzMikpOworfQorCit2b2lkIFJlZmxlY3Rpb246OlN3YXBJbmxpbmVkU3RyaW5nRG9uYXRlZChNZXNzYWdlKiBsaHMsIE1lc3NhZ2UqIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgQXJlbmEqIGxoc19hcmVuYSA9IGxocy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIEFyZW5hKiByaHNfYXJlbmEgPSByaHMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICAvLyBJZiBhcmVuYXMgZGlmZmVyLCBpbmluZWQgc3RyaW5nIGZpZWxkcyBhcmUgc3dhcHBlZCBieSBjb3B5aW5nIHZhbHVlcy4KKyAgLy8gRG9uYXRpb24gc3RhdHVzIHNob3VsZCBub3QgYmUgc3dhcHBlZC4KKyAgaWYgKGxoc19hcmVuYSAhPSByaHNfYXJlbmEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgYm9vbCBsaHNfZG9uYXRlZCA9IElzSW5saW5lZFN0cmluZ0RvbmF0ZWQoKmxocywgZmllbGQpOworICBib29sIHJoc19kb25hdGVkID0gSXNJbmxpbmVkU3RyaW5nRG9uYXRlZCgqcmhzLCBmaWVsZCk7CisgIGlmIChsaHNfZG9uYXRlZCA9PSByaHNfZG9uYXRlZCkgeworICAgIHJldHVybjsKKyAgfQorICAvLyBJZiBvbmUgaXMgdW5kb25hdGVkLCBib3RoIG11c3QgaGF2ZSBhbHJlYWR5IHJlZ2lzdGVyZWQgQXJlbmFEdG9yLgorICB1aW50MzJfdCogbGhzX2FycmF5ID0gTXV0YWJsZUlubGluZWRTdHJpbmdEb25hdGVkQXJyYXkobGhzKTsKKyAgdWludDMyX3QqIHJoc19hcnJheSA9IE11dGFibGVJbmxpbmVkU3RyaW5nRG9uYXRlZEFycmF5KHJocyk7CisgIEdPT0dMRV9DSEVDS19FUShsaHNfYXJyYXlbMF0gJiAweDF1LCAwdSk7CisgIEdPT0dMRV9DSEVDS19FUShyaHNfYXJyYXlbMF0gJiAweDF1LCAwdSk7CisgIC8vIFN3YXAgZG9uYXRpb24gc3RhdHVzIGJpdC4KKyAgdWludDMyX3QgaW5kZXggPSBzY2hlbWFfLklubGluZWRTdHJpbmdJbmRleChmaWVsZCk7CisgIEdPT0dMRV9EQ0hFQ0tfR1QoaW5kZXgsIDApOworICBpZiAocmhzX2RvbmF0ZWQpIHsKKyAgICBTZXRJbmxpbmVkU3RyaW5nRG9uYXRlZChpbmRleCwgbGhzX2FycmF5KTsKKyAgICBDbGVhcklubGluZWRTdHJpbmdEb25hdGVkKGluZGV4LCByaHNfYXJyYXkpOworICB9IGVsc2UgeyAgLy8gbGhzX2RvbmF0ZWQKKyAgICBDbGVhcklubGluZWRTdHJpbmdEb25hdGVkKGluZGV4LCBsaHNfYXJyYXkpOworICAgIFNldElubGluZWRTdHJpbmdEb25hdGVkKGluZGV4LCByaHNfYXJyYXkpOworICB9Cit9CisKKy8vIFNpbXBsZSBhY2Nlc3NvcnMgZm9yIG1hbmlwdWxhdGluZyBoYXNfYml0c18uCitib29sIFJlZmxlY3Rpb246Okhhc0JpdChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBHT09HTEVfRENIRUNLKCFmaWVsZC0+b3B0aW9ucygpLndlYWsoKSk7CisgIGlmIChzY2hlbWFfLkhhc0JpdEluZGV4KGZpZWxkKSAhPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLTEpKSB7CisgICAgcmV0dXJuIElzSW5kZXhJbkhhc0JpdFNldChHZXRIYXNCaXRzKG1lc3NhZ2UpLCBzY2hlbWFfLkhhc0JpdEluZGV4KGZpZWxkKSk7CisgIH0KKworICAvLyBJbnRlbnRpb25hbGx5IGNoZWNrIGhlcmUgYmVjYXVzZSBIYXNCaXRJbmRleChmaWVsZCkgIT0gLTEgbWVhbnMgdmFsaWQuCisgIENoZWNrSW52YWxpZEFjY2VzcyhzY2hlbWFfLCBmaWVsZCk7CisKKyAgLy8gcHJvdG8zOiBubyBoYXMtYml0cy4gQWxsIGZpZWxkcyBwcmVzZW50IGV4Y2VwdCBtZXNzYWdlcywgd2hpY2ggYXJlCisgIC8vIHByZXNlbnQgb25seSBpZiB0aGVpciBtZXNzYWdlLWZpZWxkIHBvaW50ZXIgaXMgbm9uLW51bGwuCisgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgIHJldHVybiAhc2NoZW1hXy5Jc0RlZmF1bHRJbnN0YW5jZShtZXNzYWdlKSAmJgorICAgICAgICAgICBHZXRSYXc8Y29uc3QgTWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKSAhPSBudWxscHRyOworICB9IGVsc2UgeworICAgIC8vIE5vbi1tZXNzYWdlIGZpZWxkIChhbmQgbm9uLW9uZW9mLCBzaW5jZSB0aGF0IHdhcyBoYW5kbGVkIGluIEhhc0ZpZWxkKCkKKyAgICAvLyBiZWZvcmUgY2FsbGluZyB1cyksIGFuZCBzaW5ndWxhciAoYWdhaW4sIGNoZWNrZWQgaW4gSGFzRmllbGQpLiBTbywgdGhpcworICAgIC8vIGZpZWxkIG11c3QgYmUgYSBzY2FsYXIuCisKKyAgICAvLyBTY2FsYXIgcHJpbWl0aXZlIChudW1lcmljIG9yIHN0cmluZy9ieXRlcykgZmllbGRzIGFyZSBwcmVzZW50IGlmCisgICAgLy8gdGhlaXIgdmFsdWUgaXMgbm9uLXplcm8gKG51bWVyaWMpIG9yIG5vbi1lbXB0eSAoc3RyaW5nL2J5dGVzKS4gTi5CLjoKKyAgICAvLyB3ZSBtdXN0IHVzZSB0aGlzIGRlZmluaXRpb24gaGVyZSwgcmF0aGVyIHRoYW4gdGhlICJzY2FsYXIgZmllbGRzCisgICAgLy8gYWx3YXlzIHByZXNlbnQiIGluIHRoZSBwcm90bzMgZG9jcywgYmVjYXVzZSBNZXJnZUZyb20oKSBzZW1hbnRpY3MKKyAgICAvLyByZXF1aXJlIHByZXNlbmNlIGFzICJwcmVzZW50IG9uIHdpcmUiLCBhbmQgcmVmbGVjdGlvbi1iYXNlZCBtZXJnZQorICAgIC8vICh3aGljaCB1c2VzIEhhc0ZpZWxkKCkpIG5lZWRzIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGlzLgorICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBpZiAoSXNJbmxpbmVkKGZpZWxkKSkgeworICAgICAgICAgICAgICByZXR1cm4gIUdldEZpZWxkPElubGluZWRTdHJpbmdGaWVsZD4obWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5HZXROb0FyZW5hKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmVtcHR5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBHZXRGaWVsZDxBcmVuYVN0cmluZ1B0cj4obWVzc2FnZSwgZmllbGQpLkdldCgpLnNpemUoKSA+IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICAgIHJldHVybiBHZXRSYXc8Ym9vbD4obWVzc2FnZSwgZmllbGQpICE9IGZhbHNlOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6CisgICAgICAgIHJldHVybiBHZXRSYXc8aW50MzJfdD4obWVzc2FnZSwgZmllbGQpICE9IDA7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgICAgcmV0dXJuIEdldFJhdzxpbnQ2NF90PihtZXNzYWdlLCBmaWVsZCkgIT0gMDsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgcmV0dXJuIEdldFJhdzx1aW50MzJfdD4obWVzc2FnZSwgZmllbGQpICE9IDA7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICAgIHJldHVybiBHZXRSYXc8dWludDY0X3Q+KG1lc3NhZ2UsIGZpZWxkKSAhPSAwOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHVpbnQzMl90KSA9PSBzaXplb2YoZmxvYXQpLAorICAgICAgICAgICAgICAgICAgICAgICJDb2RlIGFzc3VtZXMgdWludDMyX3QgYW5kIGZsb2F0IGFyZSB0aGUgc2FtZSBzaXplLiIpOworICAgICAgICByZXR1cm4gR2V0UmF3PHVpbnQzMl90PihtZXNzYWdlLCBmaWVsZCkgIT0gMDsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodWludDY0X3QpID09IHNpemVvZihkb3VibGUpLAorICAgICAgICAgICAgICAgICAgICAgICJDb2RlIGFzc3VtZXMgdWludDY0X3QgYW5kIGRvdWJsZSBhcmUgdGhlIHNhbWUgc2l6ZS4iKTsKKyAgICAgICAgcmV0dXJuIEdldFJhdzx1aW50NjRfdD4obWVzc2FnZSwgZmllbGQpICE9IDA7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgICByZXR1cm4gR2V0UmF3PGludD4obWVzc2FnZSwgZmllbGQpICE9IDA7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICAvLyBoYW5kbGVkIGFib3ZlOyBhdm9pZCB3YXJuaW5nCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiUmVhY2hlZCBpbXBvc3NpYmxlIGNhc2UgaW4gSGFzQml0KCkuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKwordm9pZCBSZWZsZWN0aW9uOjpTZXRCaXQoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBHT09HTEVfRENIRUNLKCFmaWVsZC0+b3B0aW9ucygpLndlYWsoKSk7CisgIGNvbnN0IHVpbnQzMl90IGluZGV4ID0gc2NoZW1hXy5IYXNCaXRJbmRleChmaWVsZCk7CisgIGlmIChpbmRleCA9PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLTEpKSByZXR1cm47CisgIE11dGFibGVIYXNCaXRzKG1lc3NhZ2UpW2luZGV4IC8gMzJdIHw9CisgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDEpIDw8IChpbmRleCAlIDMyKSk7Cit9CisKK3ZvaWQgUmVmbGVjdGlvbjo6Q2xlYXJCaXQoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBHT09HTEVfRENIRUNLKCFmaWVsZC0+b3B0aW9ucygpLndlYWsoKSk7CisgIGNvbnN0IHVpbnQzMl90IGluZGV4ID0gc2NoZW1hXy5IYXNCaXRJbmRleChmaWVsZCk7CisgIGlmIChpbmRleCA9PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLTEpKSByZXR1cm47CisgIE11dGFibGVIYXNCaXRzKG1lc3NhZ2UpW2luZGV4IC8gMzJdICY9CisgICAgICB+KHN0YXRpY19jYXN0PHVpbnQzMl90PigxKSA8PCAoaW5kZXggJSAzMikpOworfQorCit2b2lkIFJlZmxlY3Rpb246OlN3YXBCaXQoTWVzc2FnZSogbWVzc2FnZTEsIE1lc3NhZ2UqIG1lc3NhZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyghZmllbGQtPm9wdGlvbnMoKS53ZWFrKCkpOworICBpZiAoIXNjaGVtYV8uSGFzSGFzYml0cygpKSB7CisgICAgcmV0dXJuOworICB9CisgIGJvb2wgdGVtcF9oYXNfYml0ID0gSGFzQml0KCptZXNzYWdlMSwgZmllbGQpOworICBpZiAoSGFzQml0KCptZXNzYWdlMiwgZmllbGQpKSB7CisgICAgU2V0Qml0KG1lc3NhZ2UxLCBmaWVsZCk7CisgIH0gZWxzZSB7CisgICAgQ2xlYXJCaXQobWVzc2FnZTEsIGZpZWxkKTsKKyAgfQorICBpZiAodGVtcF9oYXNfYml0KSB7CisgICAgU2V0Qml0KG1lc3NhZ2UyLCBmaWVsZCk7CisgIH0gZWxzZSB7CisgICAgQ2xlYXJCaXQobWVzc2FnZTIsIGZpZWxkKTsKKyAgfQorfQorCitib29sIFJlZmxlY3Rpb246Okhhc09uZW9mKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvcikgY29uc3QgeworICBpZiAob25lb2ZfZGVzY3JpcHRvci0+aXNfc3ludGhldGljKCkpIHsKKyAgICByZXR1cm4gSGFzRmllbGQobWVzc2FnZSwgb25lb2ZfZGVzY3JpcHRvci0+ZmllbGQoMCkpOworICB9CisgIHJldHVybiAoR2V0T25lb2ZDYXNlKG1lc3NhZ2UsIG9uZW9mX2Rlc2NyaXB0b3IpID4gMCk7Cit9CisKK3ZvaWQgUmVmbGVjdGlvbjo6U2V0T25lb2ZDYXNlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgICpNdXRhYmxlT25lb2ZDYXNlKG1lc3NhZ2UsIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpID0gZmllbGQtPm51bWJlcigpOworfQorCit2b2lkIFJlZmxlY3Rpb246OkNsZWFyT25lb2ZGaWVsZChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBpZiAoSGFzT25lb2ZGaWVsZCgqbWVzc2FnZSwgZmllbGQpKSB7CisgICAgQ2xlYXJPbmVvZihtZXNzYWdlLCBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKTsKKyAgfQorfQorCit2b2lkIFJlZmxlY3Rpb246OkNsZWFyT25lb2YoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgaWYgKG9uZW9mX2Rlc2NyaXB0b3ItPmlzX3N5bnRoZXRpYygpKSB7CisgICAgQ2xlYXJGaWVsZChtZXNzYWdlLCBvbmVvZl9kZXNjcmlwdG9yLT5maWVsZCgwKSk7CisgICAgcmV0dXJuOworICB9CisgIC8vIFRPRE8oamllbHVvKTogQ29uc2lkZXIgdG8gY2FjaGUgdGhlIHVudXNlZCBvYmplY3QgaW5zdGVhZCBvZiBkZWxldGluZworICAvLyBpdC4gSXQgd2lsbCBiZSBtdWNoIGZhc3RlciBpZiBhbiBhcHBsaWNhdGlvbiBzd2l0Y2hlcyBhIGxvdCBmcm9tCisgIC8vIGEgZmV3IG9uZW9mIGZpZWxkcy4gIFRpbWUvc3BhY2UgdHJhZGVvZmYKKyAgdWludDMyX3Qgb25lb2ZfY2FzZSA9IEdldE9uZW9mQ2FzZSgqbWVzc2FnZSwgb25lb2ZfZGVzY3JpcHRvcik7CisgIGlmIChvbmVvZl9jYXNlID4gMCkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOdW1iZXIob25lb2ZfY2FzZSk7CisgICAgaWYgKG1lc3NhZ2UtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzogeworICAgICAgICAgICAgICAvLyBPbmVvZiBzdHJpbmcgZmllbGRzIGFyZSBuZXZlciBzZXQgYXMgYSBkZWZhdWx0IGluc3RhbmNlLgorICAgICAgICAgICAgICAvLyBXZSBqdXN0IG5lZWQgdG8gcGFzcyBzb21lIGFyYml0cmFyeSBkZWZhdWx0IHN0cmluZyB0byBtYWtlIGl0CisgICAgICAgICAgICAgIC8vIHdvcmsuIFRoaXMgYWxsb3dzIHVzIHRvIG5vdCBoYXZlIHRoZSByZWFsIGRlZmF1bHQgYWNjZXNzaWJsZQorICAgICAgICAgICAgICAvLyBmcm9tIHJlZmxlY3Rpb24uCisgICAgICAgICAgICAgIE11dGFibGVGaWVsZDxBcmVuYVN0cmluZ1B0cj4obWVzc2FnZSwgZmllbGQpLT5EZXN0cm95KCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgZGVsZXRlICpNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICB9CisKKyAgICAqTXV0YWJsZU9uZW9mQ2FzZShtZXNzYWdlLCBvbmVvZl9kZXNjcmlwdG9yKSA9IDA7CisgIH0KK30KKworI2RlZmluZSBIQU5ETEVfVFlQRShUWVBFLCBDUFBUWVBFLCBDVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBSZXBlYXRlZEZpZWxkPFRZUEU+JiBSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZEZpZWxkSW50ZXJuYWw8VFlQRT4oICAgXAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeyAgICAgICAgXAorICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8UmVwZWF0ZWRGaWVsZDxUWVBFPio+KE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKCAgICAgXAorICAgICAgICBjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZSksIGZpZWxkLCBDUFBUWVBFLCBDVFlQRSwgbnVsbHB0cikpOyAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBSZXBlYXRlZEZpZWxkPFRZUEU+KiBSZWZsZWN0aW9uOjpNdXRhYmxlUmVwZWF0ZWRGaWVsZEludGVybmFsPFRZUEU+KCAgICAgXAorICAgICAgTWVzc2FnZSAqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsgICAgICAgICAgICAgXAorICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXBlYXRlZEZpZWxkPFRZUEU+Kj4oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChtZXNzYWdlLCBmaWVsZCwgQ1BQVFlQRSwgQ1RZUEUsIG51bGxwdHIpKTsgXAorICB9CisKK0hBTkRMRV9UWVBFKGludDMyX3QsIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMiwgLTEpOworSEFORExFX1RZUEUoaW50NjRfdCwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0LCAtMSk7CitIQU5ETEVfVFlQRSh1aW50MzJfdCwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMiwgLTEpOworSEFORExFX1RZUEUodWludDY0X3QsIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQsIC0xKTsKK0hBTkRMRV9UWVBFKGZsb2F0LCBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQsIC0xKTsKK0hBTkRMRV9UWVBFKGRvdWJsZSwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRSwgLTEpOworSEFORExFX1RZUEUoYm9vbCwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0wsIC0xKTsKKworCisjdW5kZWYgSEFORExFX1RZUEUKKwordm9pZCogUmVmbGVjdGlvbjo6TXV0YWJsZVJhd1JlcGVhdGVkU3RyaW5nKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3N0cmluZykgY29uc3QgeworICAodm9pZClpc19zdHJpbmc7ICAvLyBQYXJhbWV0ZXIgaXMgdXNlZCBieSBHb29nbGUtaW50ZXJuYWwgY29kZS4KKyAgcmV0dXJuIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKG1lc3NhZ2UsIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkT3B0aW9uczo6U1RSSU5HLCBudWxscHRyKTsKK30KKworLy8gVGVtcGxhdGUgaW1wbGVtZW50YXRpb25zIG9mIGJhc2ljIGFjY2Vzc29ycy4gIElubGluZSBiZWNhdXNlIGVhY2gKKy8vIHRlbXBsYXRlIGluc3RhbmNlIGlzIG9ubHkgY2FsbGVkIGZyb20gb25lIGxvY2F0aW9uLiAgVGhlc2UgYXJlCisvLyB1c2VkIGZvciBhbGwgdHlwZXMgZXhjZXB0IG1lc3NhZ2VzLgordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Citjb25zdCBUeXBlJiBSZWZsZWN0aW9uOjpHZXRGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICByZXR1cm4gR2V0UmF3PFR5cGU+KG1lc3NhZ2UsIGZpZWxkKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Cit2b2lkIFJlZmxlY3Rpb246OlNldEZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUmIHZhbHVlKSBjb25zdCB7CisgIGJvb2wgcmVhbF9vbmVvZiA9IHNjaGVtYV8uSW5SZWFsT25lb2YoZmllbGQpOworICBpZiAocmVhbF9vbmVvZiAmJiAhSGFzT25lb2ZGaWVsZCgqbWVzc2FnZSwgZmllbGQpKSB7CisgICAgQ2xlYXJPbmVvZihtZXNzYWdlLCBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKTsKKyAgfQorICAqTXV0YWJsZVJhdzxUeXBlPihtZXNzYWdlLCBmaWVsZCkgPSB2YWx1ZTsKKyAgcmVhbF9vbmVvZiA/IFNldE9uZW9mQ2FzZShtZXNzYWdlLCBmaWVsZCkgOiBTZXRCaXQobWVzc2FnZSwgZmllbGQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK1R5cGUqIFJlZmxlY3Rpb246Ok11dGFibGVGaWVsZChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgc2NoZW1hXy5JblJlYWxPbmVvZihmaWVsZCkgPyBTZXRPbmVvZkNhc2UobWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2V0Qml0KG1lc3NhZ2UsIGZpZWxkKTsKKyAgcmV0dXJuIE11dGFibGVSYXc8VHlwZT4obWVzc2FnZSwgZmllbGQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2NvbnN0IFR5cGUmIFJlZmxlY3Rpb246OkdldFJlcGVhdGVkRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBHZXRSYXc8UmVwZWF0ZWRGaWVsZDxUeXBlPiA+KG1lc3NhZ2UsIGZpZWxkKS5HZXQoaW5kZXgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2NvbnN0IFR5cGUmIFJlZmxlY3Rpb246OkdldFJlcGVhdGVkUHRyRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBHZXRSYXc8UmVwZWF0ZWRQdHJGaWVsZDxUeXBlPiA+KG1lc3NhZ2UsIGZpZWxkKS5HZXQoaW5kZXgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK3ZvaWQgUmVmbGVjdGlvbjo6U2V0UmVwZWF0ZWRGaWVsZChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIHZhbHVlKSBjb25zdCB7CisgIE11dGFibGVSYXc8UmVwZWF0ZWRGaWVsZDxUeXBlPiA+KG1lc3NhZ2UsIGZpZWxkKS0+U2V0KGluZGV4LCB2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorVHlwZSogUmVmbGVjdGlvbjo6TXV0YWJsZVJlcGVhdGVkRmllbGQoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxUeXBlPiogcmVwZWF0ZWQgPQorICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkPFR5cGU+ID4obWVzc2FnZSwgZmllbGQpOworICByZXR1cm4gcmVwZWF0ZWQtPk11dGFibGUoaW5kZXgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK3ZvaWQgUmVmbGVjdGlvbjo6QWRkRmllbGQoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSYgdmFsdWUpIGNvbnN0IHsKKyAgTXV0YWJsZVJhdzxSZXBlYXRlZEZpZWxkPFR5cGU+ID4obWVzc2FnZSwgZmllbGQpLT5BZGQodmFsdWUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK1R5cGUqIFJlZmxlY3Rpb246OkFkZEZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4qIHJlcGVhdGVkID0KKyAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZDxUeXBlPiA+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgcmV0dXJuIHJlcGVhdGVkLT5BZGQoKTsKK30KKworTWVzc2FnZUZhY3RvcnkqIFJlZmxlY3Rpb246OkdldE1lc3NhZ2VGYWN0b3J5KCkgY29uc3QgeworICByZXR1cm4gbWVzc2FnZV9mYWN0b3J5XzsKK30KKwordm9pZCogUmVmbGVjdGlvbjo6UmVwZWF0ZWRGaWVsZERhdGEoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgY3BwX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKGZpZWxkLT5pc19yZXBlYXRlZCgpKTsKKyAgR09PR0xFX0NIRUNLKGZpZWxkLT5jcHBfdHlwZSgpID09IGNwcF90eXBlIHx8CisgICAgICAgIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTSAmJgorICAgICAgICAgY3BwX3R5cGUgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyKSkKKyAgICAgIDw8ICJUaGUgdHlwZSBwYXJhbWV0ZXIgVCBpbiBSZXBlYXRlZEZpZWxkUmVmPFQ+IEFQSSBkb2Vzbid0IG1hdGNoICIKKyAgICAgIDw8ICJ0aGUgYWN0dWFsIGZpZWxkIHR5cGUgKGZvciBlbnVtcyBUIHNob3VsZCBiZSB0aGUgZ2VuZXJhdGVkIGVudW0gIgorICAgICAgPDwgInR5cGUgb3IgaW50MzJfdCkuIjsKKyAgaWYgKG1lc3NhZ2VfdHlwZSAhPSBudWxscHRyKSB7CisgICAgR09PR0xFX0NIRUNLX0VRKG1lc3NhZ2VfdHlwZSwgZmllbGQtPm1lc3NhZ2VfdHlwZSgpKTsKKyAgfQorICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPk11dGFibGVSYXdSZXBlYXRlZEZpZWxkKAorICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksIGZpZWxkLT5pc19wYWNrZWQoKSwgZmllbGQpOworICB9IGVsc2UgeworICAgIHJldHVybiBNdXRhYmxlUmF3Tm9uT25lb2Y8Y2hhcj4obWVzc2FnZSwgZmllbGQpOworICB9Cit9CisKK01hcEZpZWxkQmFzZSogUmVmbGVjdGlvbjo6TXV0YWJsZU1hcERhdGEoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBVU0FHRV9DSEVDSyhJc01hcEZpZWxkSW5BcGkoZmllbGQpLCAiR2V0TWFwRGF0YSIsCisgICAgICAgICAgICAgICJGaWVsZCBpcyBub3QgYSBtYXAgZmllbGQuIik7CisgIHJldHVybiBNdXRhYmxlUmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpOworfQorCitjb25zdCBNYXBGaWVsZEJhc2UqIFJlZmxlY3Rpb246OkdldE1hcERhdGEoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLKElzTWFwRmllbGRJbkFwaShmaWVsZCksICJHZXRNYXBEYXRhIiwKKyAgICAgICAgICAgICAgIkZpZWxkIGlzIG5vdCBhIG1hcCBmaWVsZC4iKTsKKyAgcmV0dXJuICYoR2V0UmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpKTsKK30KKworbmFtZXNwYWNlIHsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSBtaWdyYXRpb24gc2NoZW1hIGludG8gcmVmbGVjdGlvbiBzY2hlbWEuCitSZWZsZWN0aW9uU2NoZW1hIE1pZ3JhdGlvblRvUmVmbGVjdGlvblNjaGVtYSgKKyAgICBjb25zdCBNZXNzYWdlKiBjb25zdCogZGVmYXVsdF9pbnN0YW5jZSwgY29uc3QgdWludDMyX3QqIG9mZnNldHMsCisgICAgTWlncmF0aW9uU2NoZW1hIG1pZ3JhdGlvbl9zY2hlbWEpIHsKKyAgUmVmbGVjdGlvblNjaGVtYSByZXN1bHQ7CisgIHJlc3VsdC5kZWZhdWx0X2luc3RhbmNlXyA9ICpkZWZhdWx0X2luc3RhbmNlOworICAvLyBGaXJzdCA3IG9mZnNldHMgYXJlIG9mZnNldHMgdG8gdGhlIHNwZWNpYWwgZmllbGRzLiBUaGUgZm9sbG93aW5nIG9mZnNldHMKKyAgLy8gYXJlIHRoZSBwcm90byBmaWVsZHMuCisgIHJlc3VsdC5vZmZzZXRzXyA9IG9mZnNldHMgKyBtaWdyYXRpb25fc2NoZW1hLm9mZnNldHNfaW5kZXggKyA2OworICByZXN1bHQuaGFzX2JpdF9pbmRpY2VzXyA9IG9mZnNldHMgKyBtaWdyYXRpb25fc2NoZW1hLmhhc19iaXRfaW5kaWNlc19pbmRleDsKKyAgcmVzdWx0Lmhhc19iaXRzX29mZnNldF8gPSBvZmZzZXRzW21pZ3JhdGlvbl9zY2hlbWEub2Zmc2V0c19pbmRleCArIDBdOworICByZXN1bHQubWV0YWRhdGFfb2Zmc2V0XyA9IG9mZnNldHNbbWlncmF0aW9uX3NjaGVtYS5vZmZzZXRzX2luZGV4ICsgMV07CisgIHJlc3VsdC5leHRlbnNpb25zX29mZnNldF8gPSBvZmZzZXRzW21pZ3JhdGlvbl9zY2hlbWEub2Zmc2V0c19pbmRleCArIDJdOworICByZXN1bHQub25lb2ZfY2FzZV9vZmZzZXRfID0gb2Zmc2V0c1ttaWdyYXRpb25fc2NoZW1hLm9mZnNldHNfaW5kZXggKyAzXTsKKyAgcmVzdWx0Lm9iamVjdF9zaXplXyA9IG1pZ3JhdGlvbl9zY2hlbWEub2JqZWN0X3NpemU7CisgIHJlc3VsdC53ZWFrX2ZpZWxkX21hcF9vZmZzZXRfID0gb2Zmc2V0c1ttaWdyYXRpb25fc2NoZW1hLm9mZnNldHNfaW5kZXggKyA0XTsKKyAgcmVzdWx0LmlubGluZWRfc3RyaW5nX2RvbmF0ZWRfb2Zmc2V0XyA9CisgICAgICBvZmZzZXRzW21pZ3JhdGlvbl9zY2hlbWEub2Zmc2V0c19pbmRleCArIDVdOworICByZXN1bHQuaW5saW5lZF9zdHJpbmdfaW5kaWNlc18gPQorICAgICAgb2Zmc2V0cyArIG1pZ3JhdGlvbl9zY2hlbWEuaW5saW5lZF9zdHJpbmdfaW5kaWNlc19pbmRleDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEFzc2lnbkRlc2NyaXB0b3JzSGVscGVyIHsKKyBwdWJsaWM6CisgIEFzc2lnbkRlc2NyaXB0b3JzSGVscGVyKE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSogZmlsZV9sZXZlbF9tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3IqKiBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1pZ3JhdGlvblNjaGVtYSogc2NoZW1hcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogY29uc3QqIGRlZmF1bHRfaW5zdGFuY2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIG9mZnNldHMpCisgICAgICA6IGZhY3RvcnlfKGZhY3RvcnkpLAorICAgICAgICBmaWxlX2xldmVsX21ldGFkYXRhXyhmaWxlX2xldmVsX21ldGFkYXRhKSwKKyAgICAgICAgZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzXyhmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnMpLAorICAgICAgICBzY2hlbWFzXyhzY2hlbWFzKSwKKyAgICAgICAgZGVmYXVsdF9pbnN0YW5jZV9kYXRhXyhkZWZhdWx0X2luc3RhbmNlX2RhdGEpLAorICAgICAgICBvZmZzZXRzXyhvZmZzZXRzKSB7fQorCisgIHZvaWQgQXNzaWduTWVzc2FnZURlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgICBBc3NpZ25NZXNzYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZShpKSk7CisgICAgfQorCisgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV8tPmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOworCisgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV8tPnJlZmxlY3Rpb24gPQorICAgICAgICBuZXcgUmVmbGVjdGlvbihkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBNaWdyYXRpb25Ub1JlZmxlY3Rpb25TY2hlbWEoZGVmYXVsdF9pbnN0YW5jZV9kYXRhXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHNfLCAqc2NoZW1hc18pLAorICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6aW50ZXJuYWxfZ2VuZXJhdGVkX3Bvb2woKSwgZmFjdG9yeV8pOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgQXNzaWduRW51bURlc2NyaXB0b3IoZGVzY3JpcHRvci0+ZW51bV90eXBlKGkpKTsKKyAgICB9CisgICAgc2NoZW1hc18rKzsKKyAgICBkZWZhdWx0X2luc3RhbmNlX2RhdGFfKys7CisgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV8rKzsKKyAgfQorCisgIHZvaWQgQXNzaWduRW51bURlc2NyaXB0b3IoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgICAqZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzXyA9IGRlc2NyaXB0b3I7CisgICAgZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzXysrOworICB9CisKKyAgY29uc3QgTWV0YWRhdGEqIEdldEN1cnJlbnRNZXRhZGF0YVB0cigpIGNvbnN0IHsgcmV0dXJuIGZpbGVfbGV2ZWxfbWV0YWRhdGFfOyB9CisKKyBwcml2YXRlOgorICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeV87CisgIE1ldGFkYXRhKiBmaWxlX2xldmVsX21ldGFkYXRhXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqKiBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnNfOworICBjb25zdCBNaWdyYXRpb25TY2hlbWEqIHNjaGVtYXNfOworICBjb25zdCBNZXNzYWdlKiBjb25zdCogZGVmYXVsdF9pbnN0YW5jZV9kYXRhXzsKKyAgY29uc3QgdWludDMyX3QqIG9mZnNldHNfOworfTsKKworbmFtZXNwYWNlIHsKKworLy8gV2UgaGF2ZSB0aGUgcm91dGluZXMgdGhhdCBhc3NpZ24gZGVzY3JpcHRvcnMgYW5kIGJ1aWxkIHJlZmxlY3Rpb24KKy8vIGF1dG9tYXRpY2FsbHkgZGVsZXRlIHRoZSBhbGxvY2F0ZWQgcmVmbGVjdGlvbi4gTWV0YWRhdGFPd25lciBvd25zCisvLyBhbGwgdGhlIGFsbG9jYXRlZCByZWZsZWN0aW9uIGluc3RhbmNlcy4KK3N0cnVjdCBNZXRhZGF0YU93bmVyIHsKKyAgfk1ldGFkYXRhT3duZXIoKSB7CisgICAgZm9yIChhdXRvIHJhbmdlIDogbWV0YWRhdGFfYXJyYXlzXykgeworICAgICAgZm9yIChjb25zdCBNZXRhZGF0YSogbSA9IHJhbmdlLmZpcnN0OyBtIDwgcmFuZ2Uuc2Vjb25kOyBtKyspIHsKKyAgICAgICAgZGVsZXRlIG0tPnJlZmxlY3Rpb247CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCBBZGRBcnJheShjb25zdCBNZXRhZGF0YSogYmVnaW4sIGNvbnN0IE1ldGFkYXRhKiBlbmQpIHsKKyAgICBtdV8uTG9jaygpOworICAgIG1ldGFkYXRhX2FycmF5c18ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGJlZ2luLCBlbmQpKTsKKyAgICBtdV8uVW5sb2NrKCk7CisgIH0KKworICBzdGF0aWMgTWV0YWRhdGFPd25lciogSW5zdGFuY2UoKSB7CisgICAgc3RhdGljIE1ldGFkYXRhT3duZXIqIHJlcyA9IE9uU2h1dGRvd25EZWxldGUobmV3IE1ldGFkYXRhT3duZXIpOworICAgIHJldHVybiByZXM7CisgIH0KKworIHByaXZhdGU6CisgIE1ldGFkYXRhT3duZXIoKSA9IGRlZmF1bHQ7ICAvLyBwcml2YXRlIGJlY2F1c2Ugc2luZ2xldG9uCisKKyAgV3JhcHBlZE11dGV4IG11XzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IE1ldGFkYXRhKiwgY29uc3QgTWV0YWRhdGEqPiA+IG1ldGFkYXRhX2FycmF5c187Cit9OworCit2b2lkIEFkZERlc2NyaXB0b3JzKGNvbnN0IERlc2NyaXB0b3JUYWJsZSogdGFibGUpOworCit2b2lkIEFzc2lnbkRlc2NyaXB0b3JzSW1wbChjb25zdCBEZXNjcmlwdG9yVGFibGUqIHRhYmxlLCBib29sIGVhZ2VyKSB7CisgIC8vIEVuc3VyZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGFkZGVkIHRvIHRoZSBwb29sLgorICB7CisgICAgLy8gVGhpcyBvbmx5IGhhcHBlbnMgb25jZSBwZXIgcHJvdG8gZmlsZS4gU28gYSBnbG9iYWwgbXV0ZXggdG8gc2VyaWFsaXplCisgICAgLy8gY2FsbHMgdG8gQWRkRGVzY3JpcHRvcnMuCisgICAgc3RhdGljIFdyYXBwZWRNdXRleCBtdXtHT09HTEVfUFJPVE9CVUZfTElOS0VSX0lOSVRJQUxJWkVEfTsKKyAgICBtdS5Mb2NrKCk7CisgICAgQWRkRGVzY3JpcHRvcnModGFibGUpOworICAgIG11LlVubG9jaygpOworICB9CisgIGlmIChlYWdlcikgeworICAgIC8vIE5vcm1hbGx5IHdlIGRvIG5vdCB3YW50IHRvIGVhZ2VybHkgYnVpbGQgZGVzY3JpcHRvcnMgb2Ygb3VyIGRlcHMuCisgICAgLy8gSG93ZXZlciBpZiB0aGlzIHByb3RvIGlzIG9wdGltaXplZCBmb3IgY29kZSBzaXplIChpZSB1c2luZyByZWZsZWN0aW9uKQorICAgIC8vIGFuZCBpdCBoYXMgYSBtZXNzYWdlIGV4dGVuZGluZyBhIGN1c3RvbSBvcHRpb24gb2YgYSBkZXNjcmlwdG9yIHdpdGggdGhhdAorICAgIC8vIG1lc3NhZ2UgYmVpbmcgb3B0aW1pemVkIGZvciBjb2RlIHNpemUgYXMgd2VsbC4gQnVpbGRpbmcgdGhlIGRlc2NyaXB0b3JzCisgICAgLy8gaW4gdGhpcyBmaWxlIHJlcXVpcmVzIHBhcnNpbmcgdGhlIHNlcmlhbGl6ZWQgZmlsZSBkZXNjcmlwdG9yLCB3aGljaCBub3cKKyAgICAvLyByZXF1aXJlcyBwYXJzaW5nIHRoZSBtZXNzYWdlIGV4dGVuc2lvbiwgd2hpY2ggcG90ZW50aWFsbHkgcmVxdWlyZXMKKyAgICAvLyBidWlsZGluZyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgbWVzc2FnZSBleHRlbmRpbmcgb25lIG9mIHRoZSBvcHRpb25zLgorICAgIC8vIEhvd2V2ZXIgd2UgYXJlIGFscmVhZHkgdXBkYXRpbmcgZGVzY3JpcHRvciBwb29sIHVuZGVyIGEgbG9jay4gVG8gcHJldmVudAorICAgIC8vIHRoaXMgdGhlIGNvbXBpbGVyIHN0YXRpY2FsbHkgbG9va3MgZm9yIHRoaXMgY2FzZSBhbmQgd2UganVzdCBtYWtlIHN1cmUgd2UKKyAgICAvLyBmaXJzdCBidWlsZCB0aGUgZGVzY3JpcHRvcnMgb2YgYWxsIG91ciBkZXBlbmRlbmNpZXMsIHByZXZlbnRpbmcgdGhlCisgICAgLy8gZGVhZGxvY2suCisgICAgaW50IG51bV9kZXBzID0gdGFibGUtPm51bV9kZXBzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2RlcHM7IGkrKykgeworICAgICAgLy8gSW4gY2FzZSBvZiB3ZWFrIGZpZWxkcyBkZXBzW2ldIGNvdWxkIGJlIG51bGwuCisgICAgICBpZiAodGFibGUtPmRlcHNbaV0pIEFzc2lnbkRlc2NyaXB0b3JzKHRhYmxlLT5kZXBzW2ldLCB0cnVlKTsKKyAgICB9CisgIH0KKworICAvLyBGaWxsIHRoZSBhcnJheXMgd2l0aCBwb2ludGVycyB0byBkZXNjcmlwdG9ycyBhbmQgcmVmbGVjdGlvbiBjbGFzc2VzLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9CisgICAgICBEZXNjcmlwdG9yUG9vbDo6aW50ZXJuYWxfZ2VuZXJhdGVkX3Bvb2woKS0+RmluZEZpbGVCeU5hbWUoCisgICAgICAgICAgdGFibGUtPmZpbGVuYW1lKTsKKyAgR09PR0xFX0NIRUNLKGZpbGUgIT0gbnVsbHB0cik7CisKKyAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKTsKKworICBBc3NpZ25EZXNjcmlwdG9yc0hlbHBlciBoZWxwZXIoCisgICAgICBmYWN0b3J5LCB0YWJsZS0+ZmlsZV9sZXZlbF9tZXRhZGF0YSwgdGFibGUtPmZpbGVfbGV2ZWxfZW51bV9kZXNjcmlwdG9ycywKKyAgICAgIHRhYmxlLT5zY2hlbWFzLCB0YWJsZS0+ZGVmYXVsdF9pbnN0YW5jZXMsIHRhYmxlLT5vZmZzZXRzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBoZWxwZXIuQXNzaWduTWVzc2FnZURlc2NyaXB0b3IoZmlsZS0+bWVzc2FnZV90eXBlKGkpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGhlbHBlci5Bc3NpZ25FbnVtRGVzY3JpcHRvcihmaWxlLT5lbnVtX3R5cGUoaSkpOworICB9CisgIGlmIChmaWxlLT5vcHRpb25zKCkuY2NfZ2VuZXJpY19zZXJ2aWNlcygpKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5zZXJ2aWNlX2NvdW50KCk7IGkrKykgeworICAgICAgdGFibGUtPmZpbGVfbGV2ZWxfc2VydmljZV9kZXNjcmlwdG9yc1tpXSA9IGZpbGUtPnNlcnZpY2UoaSk7CisgICAgfQorICB9CisgIE1ldGFkYXRhT3duZXI6Okluc3RhbmNlKCktPkFkZEFycmF5KHRhYmxlLT5maWxlX2xldmVsX21ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXIuR2V0Q3VycmVudE1ldGFkYXRhUHRyKCkpOworfQorCit2b2lkIEFkZERlc2NyaXB0b3JzSW1wbChjb25zdCBEZXNjcmlwdG9yVGFibGUqIHRhYmxlKSB7CisgIC8vIFJlZmxlY3Rpb24gcmVmZXJzIHRvIHRoZSBkZWZhdWx0IGZpZWxkcyBzbyBtYWtlIHN1cmUgdGhleSBhcmUgaW5pdGlhbGl6ZWQuCisgIGludGVybmFsOjpJbml0UHJvdG9idWZEZWZhdWx0cygpOworCisgIC8vIEVuc3VyZSBhbGwgZGVwZW5kZW50IGRlc2NyaXB0b3JzIGFyZSByZWdpc3RlcmVkIHRvIHRoZSBnZW5lcmF0ZWQgZGVzY3JpcHRvcgorICAvLyBwb29sIGFuZCBtZXNzYWdlIGZhY3RvcnkuCisgIGludCBudW1fZGVwcyA9IHRhYmxlLT5udW1fZGVwczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZGVwczsgaSsrKSB7CisgICAgLy8gSW4gY2FzZSBvZiB3ZWFrIGZpZWxkcyBkZXBzW2ldIGNvdWxkIGJlIG51bGwuCisgICAgaWYgKHRhYmxlLT5kZXBzW2ldKSBBZGREZXNjcmlwdG9ycyh0YWJsZS0+ZGVwc1tpXSk7CisgIH0KKworICAvLyBSZWdpc3RlciB0aGUgZGVzY3JpcHRvciBvZiB0aGlzIGZpbGUuCisgIERlc2NyaXB0b3JQb29sOjpJbnRlcm5hbEFkZEdlbmVyYXRlZEZpbGUodGFibGUtPmRlc2NyaXB0b3IsIHRhYmxlLT5zaXplKTsKKyAgTWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRGaWxlKHRhYmxlKTsKK30KKwordm9pZCBBZGREZXNjcmlwdG9ycyhjb25zdCBEZXNjcmlwdG9yVGFibGUqIHRhYmxlKSB7CisgIC8vIEFkZERlc2NyaXB0b3JzIGlzIG5vdCB0aHJlYWQgc2FmZS4gQ2FsbGVycyBuZWVkIHRvIGVuc3VyZSBjYWxscyBhcmUKKyAgLy8gcHJvcGVybHkgc2VyaWFsaXplZC4gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBwcmUtbWFpbiBieSBnbG9iYWwKKyAgLy8gZGVzY3JpcHRvcnMgYW5kIHdlIGNhbiBhc3N1bWUgc2luZ2xlIHRocmVhZGVkIGFjY2VzcyBvciBpdCdzIGNhbGxlZAorICAvLyBieSBBc3NpZ25EZXNjcmlwdG9ySW1wbCB3aGljaCB1c2VzIGEgbXV0ZXggdG8gc2VxdWVuY2UgY2FsbHMuCisgIGlmICh0YWJsZS0+aXNfaW5pdGlhbGl6ZWQpIHJldHVybjsKKyAgdGFibGUtPmlzX2luaXRpYWxpemVkID0gdHJ1ZTsKKyAgQWRkRGVzY3JpcHRvcnNJbXBsKHRhYmxlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIFNlcGFyYXRlIGZ1bmN0aW9uIGJlY2F1c2UgaXQgbmVlZHMgdG8gYmUgYSBmcmllbmQgb2YKKy8vIFJlZmxlY3Rpb24KK3ZvaWQgUmVnaXN0ZXJBbGxUeXBlc0ludGVybmFsKGNvbnN0IE1ldGFkYXRhKiBmaWxlX2xldmVsX21ldGFkYXRhLCBpbnQgc2l6ZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBmaWxlX2xldmVsX21ldGFkYXRhW2ldLnJlZmxlY3Rpb247CisgICAgTWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgICAgICBmaWxlX2xldmVsX21ldGFkYXRhW2ldLmRlc2NyaXB0b3IsCisgICAgICAgIHJlZmxlY3Rpb24tPnNjaGVtYV8uZGVmYXVsdF9pbnN0YW5jZV8pOworICB9Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK01ldGFkYXRhIEFzc2lnbkRlc2NyaXB0b3JzKGNvbnN0IERlc2NyaXB0b3JUYWJsZSogKCp0YWJsZSkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpvbmNlX2ZsYWcqIG9uY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRhZGF0YSYgbWV0YWRhdGEpIHsKKyAgY2FsbF9vbmNlKCpvbmNlLCBbPV0geworICAgIGF1dG8qIHQgPSB0YWJsZSgpOworICAgIEFzc2lnbkRlc2NyaXB0b3JzSW1wbCh0LCB0LT5pc19lYWdlcik7CisgIH0pOworCisgIHJldHVybiBtZXRhZGF0YTsKK30KKwordm9pZCBBc3NpZ25EZXNjcmlwdG9ycyhjb25zdCBEZXNjcmlwdG9yVGFibGUqIHRhYmxlLCBib29sIGVhZ2VyKSB7CisgIGlmICghZWFnZXIpIGVhZ2VyID0gdGFibGUtPmlzX2VhZ2VyOworICBjYWxsX29uY2UoKnRhYmxlLT5vbmNlLCBBc3NpZ25EZXNjcmlwdG9yc0ltcGwsIHRhYmxlLCBlYWdlcik7Cit9CisKK0FkZERlc2NyaXB0b3JzUnVubmVyOjpBZGREZXNjcmlwdG9yc1J1bm5lcihjb25zdCBEZXNjcmlwdG9yVGFibGUqIHRhYmxlKSB7CisgIEFkZERlc2NyaXB0b3JzKHRhYmxlKTsKK30KKwordm9pZCBSZWdpc3RlckZpbGVMZXZlbE1ldGFkYXRhKGNvbnN0IERlc2NyaXB0b3JUYWJsZSogdGFibGUpIHsKKyAgQXNzaWduRGVzY3JpcHRvcnModGFibGUpOworICBSZWdpc3RlckFsbFR5cGVzSW50ZXJuYWwodGFibGUtPmZpbGVfbGV2ZWxfbWV0YWRhdGEsIHRhYmxlLT5udW1fbWVzc2FnZXMpOworfQorCit2b2lkIFVua25vd25GaWVsZFNldFNlcmlhbGl6ZXIoY29uc3QgdWludDhfdCogYmFzZSwgdWludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IC8qdGFnKi8sIHVpbnQzMl90IC8qaGFzX29mZnNldCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIGNvbnN0IHZvaWQqIHB0ciA9IGJhc2UgKyBvZmZzZXQ7CisgIGNvbnN0IEludGVybmFsTWV0YWRhdGEqIG1ldGFkYXRhID0gc3RhdGljX2Nhc3Q8Y29uc3QgSW50ZXJuYWxNZXRhZGF0YSo+KHB0cik7CisgIGlmIChtZXRhZGF0YS0+aGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbWV0YWRhdGEtPnVua25vd25fZmllbGRzPFVua25vd25GaWVsZFNldD4oVW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKQorICAgICAgICAuU2VyaWFsaXplVG9Db2RlZFN0cmVhbShvdXRwdXQpOworICB9Cit9CisKK2Jvb2wgSXNEZXNjZW5kYW50KE1lc3NhZ2UmIHJvb3QsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IHJvb3QuR2V0UmVmbGVjdGlvbigpOworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHNPbWl0U3RyaXBwZWQocm9vdCwgJmZpZWxkcyk7CisKKyAgZm9yIChjb25zdCBhdXRvKiBmaWVsZCA6IGZpZWxkcykgeworICAgIC8vIFNraXAgbm9uLW1lc3NhZ2UgZmllbGRzLgorICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgY29udGludWU7CisKKyAgICAvLyBPcHRpb25hbCBtZXNzYWdlcy4KKyAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBNZXNzYWdlKiBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKCZyb290LCBmaWVsZCk7CisgICAgICBpZiAoc3ViX21lc3NhZ2UgPT0gJm1lc3NhZ2UgfHwgSXNEZXNjZW5kYW50KCpzdWJfbWVzc2FnZSwgbWVzc2FnZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBSZXBlYXRlZCBtZXNzYWdlcy4KKyAgICBpZiAoIUlzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKKyAgICAgIGludCBjb3VudCA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShyb290LCBmaWVsZCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgTWVzc2FnZSogc3ViX21lc3NhZ2UgPQorICAgICAgICAgICAgcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZSgmcm9vdCwgZmllbGQsIGkpOworICAgICAgICBpZiAoc3ViX21lc3NhZ2UgPT0gJm1lc3NhZ2UgfHwgSXNEZXNjZW5kYW50KCpzdWJfbWVzc2FnZSwgbWVzc2FnZSkpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gTWFwIGZpZWxkOiBpZiBhY2Nlc3NlZCBhcyByZXBlYXRlZCBmaWVsZHMsIG1lc3NhZ2VzIGFyZSAqY29waWVkKiBhbmQKKyAgICAvLyBtYXRjaGluZyBwb2ludGVyIHdvbid0IHdvcmsuIE11c3QgZGlyZWN0bHkgYWNjZXNzIG1hcC4KKyAgICBjb25zdGV4cHIgaW50IGtWYWxJZHggPSAxOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsX2ZpZWxkID0gZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5maWVsZChrVmFsSWR4KTsKKyAgICAvLyBTa2lwIG1hcCBmaWVsZHMgd2hvc2UgdmFsdWUgdHlwZSBpcyBub3QgbWVzc2FnZS4KKyAgICBpZiAodmFsX2ZpZWxkLT5jcHBfdHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSBjb250aW51ZTsKKworICAgIE1hcEl0ZXJhdG9yIGVuZCA9IHJlZmxlY3Rpb24tPk1hcEVuZCgmcm9vdCwgZmllbGQpOworICAgIGZvciAoYXV0byBpdGVyID0gcmVmbGVjdGlvbi0+TWFwQmVnaW4oJnJvb3QsIGZpZWxkKTsgaXRlciAhPSBlbmQ7ICsraXRlcikgeworICAgICAgTWVzc2FnZSogc3ViX21lc3NhZ2UgPSBpdGVyLk11dGFibGVWYWx1ZVJlZigpLT5NdXRhYmxlTWVzc2FnZVZhbHVlKCk7CisgICAgICBpZiAoc3ViX21lc3NhZ2UgPT0gJm1lc3NhZ2UgfHwgSXNEZXNjZW5kYW50KCpzdWJfbWVzc2FnZSwgbWVzc2FnZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzRiMmNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmgKQEAgLTAsMCArMSwzNTQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGhlYWRlciBpcyBsb2dpY2FsbHkgaW50ZXJuYWwsIGJ1dCBpcyBtYWRlIHB1YmxpYyBiZWNhdXNlIGl0IGlzIHVzZWQKKy8vIGZyb20gcHJvdG9jb2wtY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUsIHdoaWNoIG1heSByZXNpZGUgaW4gb3RoZXIgY29tcG9uZW50cy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfUkVGTEVDVElPTl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX1JFRkxFQ1RJT05fSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKworCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworI2lmZGVmIFNXSUcKKyNlcnJvciAiWW91IGNhbm5vdCBTV0lHIHByb3RvIGhlYWRlcnMiCisjZW5kaWYKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworY2xhc3MgTWFwS2V5OworY2xhc3MgTWFwVmFsdWVSZWY7CitjbGFzcyBNZXNzYWdlTGF5b3V0SW5zcGVjdG9yOworY2xhc3MgTWVzc2FnZTsKK3N0cnVjdCBNZXRhZGF0YTsKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworY2xhc3MgRGVmYXVsdEVtcHR5T25lb2Y7CisvLyBEZWZpbmVkIGluIG90aGVyIGZpbGVzLgorY2xhc3MgRXh0ZW5zaW9uU2V0OyAgLy8gZXh0ZW5zaW9uX3NldC5oCitjbGFzcyBXZWFrRmllbGRNYXA7ICAvLyB3ZWFrX2ZpZWxkX21hcC5oCisKKy8vIFRoaXMgc3RydWN0IGRlc2NyaWJlcyB0aGUgaW50ZXJuYWwgbGF5b3V0IG9mIHRoZSBtZXNzYWdlLCBoZW5jZSB0aGlzIGlzCisvLyB1c2VkIHRvIGFjdCBvbiB0aGUgbWVzc2FnZSByZWZsZWN0aXZlbHkuCisvLyAgIGRlZmF1bHRfaW5zdGFuY2U6ICBUaGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgbWVzc2FnZS4gIFRoaXMgaXMgb25seQorLy8gICAgICAgICAgICAgICAgICB1c2VkIHRvIG9idGFpbiBwb2ludGVycyB0byBkZWZhdWx0IGluc3RhbmNlcyBvZiBlbWJlZGRlZAorLy8gICAgICAgICAgICAgICAgICBtZXNzYWdlcywgd2hpY2ggR2V0TWVzc2FnZSgpIHdpbGwgcmV0dXJuIGlmIHRoZSBwYXJ0aWN1bGFyCisvLyAgICAgICAgICAgICAgICAgIHN1Yi1tZXNzYWdlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuICAoVGh1cywgYWxsCisvLyAgICAgICAgICAgICAgICAgIGVtYmVkZGVkIG1lc3NhZ2UgZmllbGRzICptdXN0KiBoYXZlIG5vbi1udWxsIHBvaW50ZXJzCisvLyAgICAgICAgICAgICAgICAgIGluIHRoZSBkZWZhdWx0IGluc3RhbmNlLikKKy8vICAgb2Zmc2V0czogICAgICAgQW4gYXJyYXkgb2YgaW50cyBnaXZpbmcgdGhlIGJ5dGUgb2Zmc2V0cy4KKy8vICAgICAgICAgICAgICAgICAgRm9yIGVhY2ggb25lb2Ygb3Igd2VhayBmaWVsZCwgdGhlIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUKKy8vICAgICAgICAgICAgICAgICAgZGVmYXVsdF9pbnN0YW5jZS4gVGhlc2UgY2FuIGJlIGNvbXB1dGVkIGF0IGNvbXBpbGUgdGltZQorLy8gICAgICAgICAgICAgICAgICB1c2luZyB0aGUKKy8vICAgICAgICAgICAgICAgICAgUFJPVE8yX0dFTkVSQVRFRF9ERUZBVUxUX09ORU9GX0ZJRUxEX09GRlNFVCgpCisvLyAgICAgICAgICAgICAgICAgIG1hY3JvLiBGb3IgZWFjaCBub25lIG9uZW9mIGZpZWxkLCB0aGUgb2Zmc2V0IGlzIHJlbGF0ZWQgdG8KKy8vICAgICAgICAgICAgICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBtZXNzYWdlIG9iamVjdC4gIFRoZXNlIGNhbiBiZSBjb21wdXRlZCBhdAorLy8gICAgICAgICAgICAgICAgICBjb21waWxlIHRpbWUgdXNpbmcgdGhlCisvLyAgICAgICAgICAgICAgICAgIFBST1RPMl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoKSBtYWNyby4KKy8vICAgICAgICAgICAgICAgICAgQmVzaWRlcyBvZmZzZXRzIGZvciBhbGwgZmllbGRzLCB0aGlzIGFycmF5IGFsc28gY29udGFpbnMKKy8vICAgICAgICAgICAgICAgICAgb2Zmc2V0cyBmb3Igb25lb2YgdW5pb25zLiBUaGUgb2Zmc2V0IG9mIHRoZSBpLXRoIG9uZW9mIHVuaW9uCisvLyAgICAgICAgICAgICAgICAgIGlzIG9mZnNldHNbZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKSArIGldLgorLy8gICBoYXNfYml0X2luZGljZXM6ICBNYXBwaW5nIGZyb20gZmllbGQgaW5kZXhlcyB0byB0aGVpciBpbmRleCBpbiB0aGUgaGFzCisvLyAgICAgICAgICAgICAgICAgIGJpdCBhcnJheS4KKy8vICAgaGFzX2JpdHNfb2Zmc2V0OiAgT2Zmc2V0IGluIHRoZSBtZXNzYWdlIG9mIGFuIGFycmF5IG9mIHVpbnQzMnMgb2Ygc2l6ZQorLy8gICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpLzMyLCByb3VuZGVkIHVwLiAgVGhpcyBpcyBhCisvLyAgICAgICAgICAgICAgICAgIGJpdGZpZWxkIHdoZXJlIGVhY2ggYml0IGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUKKy8vICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBmaWVsZCBvZiB0aGUgbWVzc2FnZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KKy8vICAgICAgICAgICAgICAgICAgVGhlIGJpdCBmb3IgZmllbGQgaW5kZXggaSBpcyBvYnRhaW5lZCBieSB0aGUgZXhwcmVzc2lvbjoKKy8vICAgICAgICAgICAgICAgICAgICBoYXNfYml0c1tpIC8gMzJdICYgKDEgPDwgKGkgJSAzMikpCisvLyAgIHVua25vd25fZmllbGRzX29mZnNldDogIE9mZnNldCBpbiB0aGUgbWVzc2FnZSBvZiB0aGUgVW5rbm93bkZpZWxkU2V0IGZvcgorLy8gICAgICAgICAgICAgICAgICB0aGUgbWVzc2FnZS4KKy8vICAgZXh0ZW5zaW9uc19vZmZzZXQ6ICBPZmZzZXQgaW4gdGhlIG1lc3NhZ2Ugb2YgdGhlIEV4dGVuc2lvblNldCBmb3IgdGhlCisvLyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIG9yIC0xIGlmIHRoZSBtZXNzYWdlIHR5cGUgaGFzIG5vIGV4dGVuc2lvbgorLy8gICAgICAgICAgICAgICAgICByYW5nZXMuCisvLyAgIG9uZW9mX2Nhc2Vfb2Zmc2V0OiAgT2Zmc2V0IGluIHRoZSBtZXNzYWdlIG9mIGFuIGFycmF5IG9mIHVpbnQzMnMgb2YKKy8vICAgICAgICAgICAgICAgICAgc2l6ZSBkZXNjcmlwdG9yLT5vbmVvZl9kZWNsX2NvdW50KCkuICBFYWNoIHVpbnQzMl90CisvLyAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB3aGF0IGZpZWxkIGlzIHNldCBmb3IgZWFjaCBvbmVvZi4KKy8vICAgb2JqZWN0X3NpemU6ICAgVGhlIHNpemUgb2YgYSBtZXNzYWdlIG9iamVjdCBvZiB0aGlzIHR5cGUsIGFzIG1lYXN1cmVkCisvLyAgICAgICAgICAgICAgICAgIGJ5IHNpemVvZigpLgorLy8gICBhcmVuYV9vZmZzZXQ6ICBJZiBhIG1lc3NhZ2UgZG9lc24ndCBoYXZlIGEgdW5rbm93bl9maWVsZF9zZXQgdGhhdCBzdG9yZXMKKy8vICAgICAgICAgICAgICAgICAgdGhlIGFyZW5hLCBpdCBtdXN0IGhhdmUgYSBkaXJlY3QgcG9pbnRlciB0byB0aGUgYXJlbmEuCisvLyAgIHdlYWtfZmllbGRfbWFwX29mZnNldDogSWYgdGhlIG1lc3NhZ2UgcHJvdG8gaGFzIHdlYWsgZmllbGRzLCB0aGlzIGlzIHRoZQorLy8gICAgICAgICAgICAgICAgICBvZmZzZXQgb2YgX3dlYWtfZmllbGRfbWFwXyBpbiB0aGUgZ2VuZXJhdGVkIHByb3RvLiBPdGhlcndpc2UKKy8vICAgICAgICAgICAgICAgICAgLTEuCitzdHJ1Y3QgUmVmbGVjdGlvblNjaGVtYSB7CisgcHVibGljOgorICAvLyBTaXplIG9mIGEgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSBvYmplY3Qgb2YgdGhpcyB0eXBlLgorICB1aW50MzJfdCBHZXRPYmplY3RTaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG9iamVjdF9zaXplXyk7IH0KKworICBib29sIEluUmVhbE9uZW9mKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgICByZXR1cm4gZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSAmJgorICAgICAgICAgICAhZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKS0+aXNfc3ludGhldGljKCk7CisgIH0KKworICAvLyBPZmZzZXQgb2YgYSBub24tb25lb2YgZmllbGQuICBHZXR0aW5nIGEgZmllbGQgb2Zmc2V0IGlzIHNsaWdodGx5IG1vcmUKKyAgLy8gZWZmaWNpZW50IHdoZW4gd2Uga25vdyBzdGF0aWNhbGx5IHRoYXQgaXQgaXMgbm90IGEgb25lb2YgZmllbGQuCisgIHVpbnQzMl90IEdldEZpZWxkT2Zmc2V0Tm9uT25lb2YoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICAgIEdPT0dMRV9EQ0hFQ0soIUluUmVhbE9uZW9mKGZpZWxkKSk7CisgICAgcmV0dXJuIE9mZnNldFZhbHVlKG9mZnNldHNfW2ZpZWxkLT5pbmRleCgpXSwgZmllbGQtPnR5cGUoKSk7CisgIH0KKworICAvLyBPZmZzZXQgb2YgYW55IGZpZWxkLgorICB1aW50MzJfdCBHZXRGaWVsZE9mZnNldChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgICAgaWYgKEluUmVhbE9uZW9mKGZpZWxkKSkgeworICAgICAgc2l6ZV90IG9mZnNldCA9CisgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPmZpZWxkX2NvdW50KCkpICsKKyAgICAgICAgICBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpLT5pbmRleCgpOworICAgICAgcmV0dXJuIE9mZnNldFZhbHVlKG9mZnNldHNfW29mZnNldF0sIGZpZWxkLT50eXBlKCkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gR2V0RmllbGRPZmZzZXROb25PbmVvZihmaWVsZCk7CisgICAgfQorICB9CisKKyAgYm9vbCBJc0ZpZWxkSW5saW5lZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgICAgcmV0dXJuIElubGluZWQob2Zmc2V0c19bZmllbGQtPmluZGV4KCldLCBmaWVsZC0+dHlwZSgpKTsKKyAgfQorCisgIHVpbnQzMl90IEdldE9uZW9mQ2FzZU9mZnNldChjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG9uZW9mX2Nhc2Vfb2Zmc2V0XykgKworICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KG9uZW9mX2Rlc2NyaXB0b3ItPmluZGV4KCkpICoKKyAgICAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkpOworICB9CisKKyAgYm9vbCBIYXNIYXNiaXRzKCkgY29uc3QgeyByZXR1cm4gaGFzX2JpdHNfb2Zmc2V0XyAhPSAtMTsgfQorCisgIC8vIEJpdCBpbmRleCB3aXRoaW4gdGhlIGJpdCBhcnJheSBvZiBoYXNiaXRzLiAgQml0IG9yZGVyIGlzIGxvdy10by1oaWdoLgorICB1aW50MzJfdCBIYXNCaXRJbmRleChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgICAgaWYgKGhhc19iaXRzX29mZnNldF8gPT0gLTEpIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLTEpOworICAgIEdPT0dMRV9EQ0hFQ0soSGFzSGFzYml0cygpKTsKKyAgICByZXR1cm4gaGFzX2JpdF9pbmRpY2VzX1tmaWVsZC0+aW5kZXgoKV07CisgIH0KKworICAvLyBCeXRlIG9mZnNldCBvZiB0aGUgaGFzYml0cyBhcnJheS4KKyAgdWludDMyX3QgSGFzQml0c09mZnNldCgpIGNvbnN0IHsKKyAgICBHT09HTEVfRENIRUNLKEhhc0hhc2JpdHMoKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihoYXNfYml0c19vZmZzZXRfKTsKKyAgfQorCisgIGJvb2wgSGFzSW5saW5lZFN0cmluZygpIGNvbnN0IHsgcmV0dXJuIGlubGluZWRfc3RyaW5nX2RvbmF0ZWRfb2Zmc2V0XyAhPSAtMTsgfQorCisgIC8vIEJpdCBpbmRleCB3aXRoaW4gdGhlIGJpdCBhcnJheSBvZiBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8uICBCaXQgb3JkZXIgaXMKKyAgLy8gbG93LXRvLWhpZ2guCisgIHVpbnQzMl90IElubGluZWRTdHJpbmdJbmRleChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgICAgR09PR0xFX0RDSEVDSyhIYXNJbmxpbmVkU3RyaW5nKCkpOworICAgIHJldHVybiBpbmxpbmVkX3N0cmluZ19pbmRpY2VzX1tmaWVsZC0+aW5kZXgoKV07CisgIH0KKworICAvLyBCeXRlIG9mZnNldCBvZiB0aGUgX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfIGFycmF5LgorICB1aW50MzJfdCBJbmxpbmVkU3RyaW5nRG9uYXRlZE9mZnNldCgpIGNvbnN0IHsKKyAgICBHT09HTEVfRENIRUNLKEhhc0lubGluZWRTdHJpbmcoKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmxpbmVkX3N0cmluZ19kb25hdGVkX29mZnNldF8pOworICB9CisKKyAgLy8gVGhlIG9mZnNldCBvZiB0aGUgSW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBtZW1iZXIuCisgIC8vIEZvciBMaXRlIHRoaXMgd2lsbCBhY3R1YWxseSBiZSBhbiBJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hTGl0ZS4KKyAgLy8gVGhlIHNjaGVtYSBkb2Vzbid0IGNvbnRhaW4gZW5vdWdoIGluZm9ybWF0aW9uIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KKyAgLy8gdGhlc2UgdHdvIGNhc2VzLgorICB1aW50MzJfdCBHZXRNZXRhZGF0YU9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1ldGFkYXRhX29mZnNldF8pOworICB9CisKKyAgLy8gV2hldGhlciB0aGlzIG1lc3NhZ2UgaGFzIGFuIEV4dGVuc2lvblNldC4KKyAgYm9vbCBIYXNFeHRlbnNpb25TZXQoKSBjb25zdCB7IHJldHVybiBleHRlbnNpb25zX29mZnNldF8gIT0gLTE7IH0KKworICAvLyBUaGUgb2Zmc2V0IG9mIHRoZSBFeHRlbnNpb25TZXQgaW4gdGhpcyBtZXNzYWdlLgorICB1aW50MzJfdCBHZXRFeHRlbnNpb25TZXRPZmZzZXQoKSBjb25zdCB7CisgICAgR09PR0xFX0RDSEVDSyhIYXNFeHRlbnNpb25TZXQoKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihleHRlbnNpb25zX29mZnNldF8pOworICB9CisKKyAgLy8gVGhlIG9mZiBzZXQgb2YgV2Vha0ZpZWxkTWFwIHdoZW4gdGhlIG1lc3NhZ2UgY29udGFpbnMgd2VhayBmaWVsZHMuCisgIC8vIFRoZSBkZWZhdWx0IGlzIDAgZm9yIG5vdy4KKyAgaW50IEdldFdlYWtGaWVsZE1hcE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZmllbGRfbWFwX29mZnNldF87IH0KKworICBib29sIElzRGVmYXVsdEluc3RhbmNlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0IHsKKyAgICByZXR1cm4gJm1lc3NhZ2UgPT0gZGVmYXVsdF9pbnN0YW5jZV87CisgIH0KKworICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBmaWVsZC4gIFRoZSBzaXplIGFuZCB0eXBlCisgIC8vIG9mIHRoZSB1bmRlcmx5aW5nIGRhdGEgZGVwZW5kcyBvbiB0aGUgZmllbGQncyB0eXBlLgorICBjb25zdCB2b2lkKiBHZXRGaWVsZERlZmF1bHQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihkZWZhdWx0X2luc3RhbmNlXykgKworICAgICAgICAgICBPZmZzZXRWYWx1ZShvZmZzZXRzX1tmaWVsZC0+aW5kZXgoKV0sIGZpZWxkLT50eXBlKCkpOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBpcyBpbXBsaWNpdGx5IGJhY2tlZCBieSBMYXp5RmllbGQuCisgIGJvb2wgSXNFYWdlcmx5VmVyaWZpZWRMYXp5RmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZmllbGQtPnR5cGUoKSwgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UpOworICAgICh2b2lkKWZpZWxkOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgSXNGaWVsZFN0cmlwcGVkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgICAodm9pZClmaWVsZDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIElzTWVzc2FnZVN0cmlwcGVkKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIGNvbnN0IHsKKyAgICAodm9pZClkZXNjcmlwdG9yOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisKKyAgYm9vbCBIYXNXZWFrRmllbGRzKCkgY29uc3QgeyByZXR1cm4gd2Vha19maWVsZF9tYXBfb2Zmc2V0XyA+IDA7IH0KKworICAvLyBUaGVzZSBtZW1iZXJzIGFyZSBpbnRlbmRlZCB0byBiZSBwcml2YXRlLCBidXQgd2UgY2Fubm90IGFjdHVhbGx5IG1ha2UgdGhlbQorICAvLyBwcml2YXRlIGJlY2F1c2UgdGhpcyBwcmV2ZW50cyB1cyBmcm9tIHVzaW5nIGFnZ3JlZ2F0ZSBpbml0aWFsaXphdGlvbiBvZgorICAvLyB0aGVtLCBpZS4KKyAgLy8KKyAgLy8gICBSZWZsZWN0aW9uU2NoZW1hIHNjaGVtYSA9IHthLCBiLCBjLCBkLCBlLCAuLi59OworICAvLyBwcml2YXRlOgorICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X2luc3RhbmNlXzsKKyAgY29uc3QgdWludDMyX3QqIG9mZnNldHNfOworICBjb25zdCB1aW50MzJfdCogaGFzX2JpdF9pbmRpY2VzXzsKKyAgaW50IGhhc19iaXRzX29mZnNldF87CisgIGludCBtZXRhZGF0YV9vZmZzZXRfOworICBpbnQgZXh0ZW5zaW9uc19vZmZzZXRfOworICBpbnQgb25lb2ZfY2FzZV9vZmZzZXRfOworICBpbnQgb2JqZWN0X3NpemVfOworICBpbnQgd2Vha19maWVsZF9tYXBfb2Zmc2V0XzsKKyAgY29uc3QgdWludDMyX3QqIGlubGluZWRfc3RyaW5nX2luZGljZXNfOworICBpbnQgaW5saW5lZF9zdHJpbmdfZG9uYXRlZF9vZmZzZXRfOworCisgIC8vIFdlIHRhZyBvZmZzZXQgdmFsdWVzIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBkYXRhIGFib3V0IGZpZWxkcyAoc3VjaCBhcworICAvLyAidW51c2VkIiBvciAibGF6eSIgb3IgImlubGluZWQiKS4KKyAgc3RhdGljIHVpbnQzMl90IE9mZnNldFZhbHVlKHVpbnQzMl90IHYsIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7CisgICAgaWYgKHR5cGUgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgfHwKKyAgICAgICAgdHlwZSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HIHx8CisgICAgICAgIHR5cGUgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTKSB7CisgICAgICByZXR1cm4gdiAmIDB4RkZGRkZGRkV1OworICAgIH0KKyAgICByZXR1cm4gdjsKKyAgfQorCisgIHN0YXRpYyBib29sIElubGluZWQodWludDMyX3QgdiwgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKKyAgICBpZiAodHlwZSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HIHx8CisgICAgICAgIHR5cGUgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTKSB7CisgICAgICByZXR1cm4gKHYgJiAxdSkgIT0gMHU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5vbiBzdHJpbmcvYnl0ZSBmaWVsZHMgYXJlIG5vdCBpbmxpbmVkLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfTsKKworLy8gU3RydWN0cyB0aGF0IHRoZSBjb2RlIGdlbmVyYXRvciBlbWl0cyBkaXJlY3RseSB0byBkZXNjcmliZSBhIG1lc3NhZ2UuCisvLyBUaGVzZSBzaG91bGQgbmV2ZXIgdXNlZCBkaXJlY3RseSBleGNlcHQgdG8gYnVpbGQgYSBSZWZsZWN0aW9uU2NoZW1hCisvLyBvYmplY3QuCisvLworLy8gRVhQRVJJTUVOVEFMOiB0aGVzZSBhcmUgY2hhbmdpbmcgcmFwaWRseSwgYW5kIG1heSBjb21wbGV0ZWx5IGRpc2FwcGVhcgorLy8gb3IgbWVyZ2Ugd2l0aCBSZWZsZWN0aW9uU2NoZW1hLgorc3RydWN0IE1pZ3JhdGlvblNjaGVtYSB7CisgIGludDMyX3Qgb2Zmc2V0c19pbmRleDsKKyAgaW50MzJfdCBoYXNfYml0X2luZGljZXNfaW5kZXg7CisgIGludDMyX3QgaW5saW5lZF9zdHJpbmdfaW5kaWNlc19pbmRleDsKKyAgaW50IG9iamVjdF9zaXplOworfTsKKworLy8gVGhpcyBzdHJ1Y3QgdHJpZXMgdG8gcmVkdWNlIHVubmVjZXNzYXJ5IHBhZGRpbmcuCisvLyBUaGUgbnVtX3h4eCBtaWdodCBub3QgYmUgY2xvc2UgdG8gdGhlaXIgcmVzcGVjdGl2ZSBwb2ludGVyLCBidXQgdGhpcyBzYXZlcworLy8gcGFkZGluZy4KK3N0cnVjdCBQUk9UT0JVRl9FWFBPUlQgRGVzY3JpcHRvclRhYmxlIHsKKyAgbXV0YWJsZSBib29sIGlzX2luaXRpYWxpemVkOworICBib29sIGlzX2VhZ2VyOworICBpbnQgc2l6ZTsgIC8vIG9mIHNlcmlhbGl6ZWQgZGVzY3JpcHRvcgorICBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKKyAgb25jZV9mbGFnKiBvbmNlOworICBjb25zdCBEZXNjcmlwdG9yVGFibGUqIGNvbnN0KiBkZXBzOworICBpbnQgbnVtX2RlcHM7CisgIGludCBudW1fbWVzc2FnZXM7CisgIGNvbnN0IE1pZ3JhdGlvblNjaGVtYSogc2NoZW1hczsKKyAgY29uc3QgTWVzc2FnZSogY29uc3QqIGRlZmF1bHRfaW5zdGFuY2VzOworICBjb25zdCB1aW50MzJfdCogb2Zmc2V0czsKKyAgLy8gdXBkYXRlIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRvciBhcnJheXMuCisgIE1ldGFkYXRhKiBmaWxlX2xldmVsX21ldGFkYXRhOworICBjb25zdCBFbnVtRGVzY3JpcHRvcioqIGZpbGVfbGV2ZWxfZW51bV9kZXNjcmlwdG9yczsKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqKiBmaWxlX2xldmVsX3NlcnZpY2VfZGVzY3JpcHRvcnM7Cit9OworCitlbnVtIHsKKyAgLy8gVGFnIHVzZWQgb24gb2Zmc2V0cyBmb3IgZmllbGRzIHRoYXQgZG9uJ3QgaGF2ZSBhIHJlYWwgb2Zmc2V0LgorICAvLyBGb3IgZXhhbXBsZSwgd2VhayBtZXNzYWdlIGZpZWxkcyBnbyBpbnRvIHRoZSBXZWFrRmllbGRNYXAgYW5kIG5vdCBpbiBhbgorICAvLyBhY3R1YWwgZmllbGQuCisgIGtJbnZhbGlkRmllbGRPZmZzZXRUYWcgPSAweDQwMDAwMDAwdSwKK307CisKKy8vIEFzc2lnbkRlc2NyaXB0b3JzKCkgcHVsbHMgdGhlIGNvbXBpbGVkIEZpbGVEZXNjcmlwdG9yIGZyb20gdGhlIERlc2NyaXB0b3JQb29sCisvLyBhbmQgdXNlcyBpdCB0byBwb3B1bGF0ZSBhbGwgb2YgdGhlIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggc3RvcmUgcG9pbnRlcnMgdG8KKy8vIHRoZSBkZXNjcmlwdG9yIG9iamVjdHMuICBJdCBhbHNvIGNvbnN0cnVjdHMgdGhlIHJlZmxlY3Rpb24gb2JqZWN0cy4gIEl0IGlzCisvLyBjYWxsZWQgdGhlIGZpcnN0IHRpbWUgYW55b25lIGNhbGxzIGRlc2NyaXB0b3IoKSBvciBHZXRSZWZsZWN0aW9uKCkgb24gb25lIG9mCisvLyB0aGUgdHlwZXMgZGVmaW5lZCBpbiB0aGUgZmlsZS4gIEFzc2lnbkRlc2NyaXB0b3JzKCkgaXMgdGhyZWFkLXNhZmUuCit2b2lkIFBST1RPQlVGX0VYUE9SVCBBc3NpZ25EZXNjcmlwdG9ycyhjb25zdCBEZXNjcmlwdG9yVGFibGUqIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlYWdlciA9IGZhbHNlKTsKKworLy8gT3ZlcmxvYWQgdXNlZCB0byBpbXBsZW1lbnQgR2V0TWV0YWRhdGFTdGF0aWMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLgorLy8gU2VlIGNvbW1lbnRzIGluIGNvbXBpbGVyL2NwcC9pbnRlcm5hbC9maWxlLmNjIGFzIHRvIHdoeS4KKy8vIEl0IHRha2VzIGEgYE1ldGFkYXRhYCBhbmQgcmV0dXJucyBpdCB0byBhbGxvdyBmb3IgdGFpbCBjYWxscyBhbmQgcmVkdWNlCisvLyBiaW5hcnkgc2l6ZS4KK01ldGFkYXRhIFBST1RPQlVGX0VYUE9SVCBBc3NpZ25EZXNjcmlwdG9ycyhjb25zdCBEZXNjcmlwdG9yVGFibGUqICgqdGFibGUpKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6Om9uY2VfZmxhZyogb25jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRhZGF0YSYgbWV0YWRhdGEpOworCisvLyBUaGVzZSBjYW5ub3QgYmUgaW4gbGl0ZSBzbyB3ZSBwdXQgdGhlbSBpbiB0aGUgcmVmbGVjdGlvbi4KK1BST1RPQlVGX0VYUE9SVCB2b2lkIFVua25vd25GaWVsZFNldFNlcmlhbGl6ZXIoY29uc3QgdWludDhfdCogYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhhc19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKworc3RydWN0IFBST1RPQlVGX0VYUE9SVCBBZGREZXNjcmlwdG9yc1J1bm5lciB7CisgIGV4cGxpY2l0IEFkZERlc2NyaXB0b3JzUnVubmVyKGNvbnN0IERlc2NyaXB0b3JUYWJsZSogdGFibGUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfUkVGTEVDVElPTl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGNlMzk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTM3MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRvIHRlc3QgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24sIHdlIGFjdHVhbGx5IGxldCB0aGUgcHJvdG9jb2wgY29tcGlsZXIKKy8vIGdlbmVyYXRlIGEgZnVsbCBwcm90b2NvbCBtZXNzYWdlIGltcGxlbWVudGF0aW9uIGFuZCB0aGVuIHRlc3QgaXRzCisvLyByZWZsZWN0aW9uIGludGVyZmFjZS4gIFRoaXMgaXMgbXVjaCBlYXNpZXIgYW5kIG1vcmUgbWFpbnRhaW5hYmxlIHRoYW4KKy8vIHRyeWluZyB0byBjcmVhdGUgb3VyIG93biBNZXNzYWdlIGNsYXNzIGZvciBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbgorLy8gdG8gd3JhcC4KKy8vCisvLyBUaGUgdGVzdHMgaGVyZSBjbG9zZWx5IG1pcnJvciBzb21lIG9mIHRoZSB0ZXN0cyBpbgorLy8gY29tcGlsZXIvY3BwL3VuaXR0ZXN0LCBleGNlcHQgdXNpbmcgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlCisvLyByYXRoZXIgdGhhbiBnZW5lcmF0ZWQgYWNjZXNzb3JzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3RfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0SGVscGVyIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFVuc2FmZVNoYWxsb3dTd2FwRmllbGRzKAorICAgICAgTWVzc2FnZSogbGhzLCBNZXNzYWdlKiByaHMsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgZmllbGRzKSB7CisgICAgbGhzLT5HZXRSZWZsZWN0aW9uKCktPlVuc2FmZVNoYWxsb3dTd2FwRmllbGRzKGxocywgcmhzLCBmaWVsZHMpOworICB9CisgIHN0YXRpYyBib29sIElzTGF6eUV4dGVuc2lvbihjb25zdCBNZXNzYWdlJiBtc2csIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0KSB7CisgICAgcmV0dXJuIG1zZy5HZXRSZWZsZWN0aW9uKCktPklzTGF6eUV4dGVuc2lvbihtc2csIGV4dCk7CisgIH0KKyAgc3RhdGljIGJvb2wgSXNMYXp5RmllbGQoY29uc3QgTWVzc2FnZSYgbXNnLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgICAgcmV0dXJuIG1zZy5HZXRSZWZsZWN0aW9uKCktPklzTGF6eUZpZWxkKGZpZWxkKTsKKyAgfQorICBzdGF0aWMgYm9vbCBJc0VhZ2VybHlWZXJpZmllZExhenlGaWVsZChjb25zdCBNZXNzYWdlJiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgICByZXR1cm4gbXNnLkdldFJlZmxlY3Rpb24oKS0+SXNFYWdlcmx5VmVyaWZpZWRMYXp5RmllbGQoZmllbGQpOworICB9CisgIHN0YXRpYyBib29sIElzTGF6aWx5VmVyaWZpZWRMYXp5RmllbGQoY29uc3QgTWVzc2FnZSYgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgICByZXR1cm4gbXNnLkdldFJlZmxlY3Rpb24oKS0+SXNMYXppbHlWZXJpZmllZExhenlGaWVsZChmaWVsZCk7CisgIH0KK307CisKK25hbWVzcGFjZSB7CisKKy8vIFNob3J0aGFuZCB0byBnZXQgYSBGaWVsZERlc2NyaXB0b3IgZm9yIGEgZmllbGQgb2YgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcy4KK2NvbnN0IEZpZWxkRGVzY3JpcHRvciogRihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9CisgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKKyAgR09PR0xFX0NIRUNLKHJlc3VsdCAhPSBudWxscHRyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIERlZmF1bHRzKSB7CisgIC8vIENoZWNrIHRoYXQgYWxsIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5IGluIHRoZSBpbml0aWFsIG1lc3NhZ2UuCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCisgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCkpOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdENsZWFyVmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKKworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisKKyAgLy8gTWVzc2FnZXMgc2hvdWxkIHJldHVybiBwb2ludGVycyB0byBkZWZhdWx0IGluc3RhbmNlcyB1bnRpbCBmaXJzdCB1c2UuCisgIC8vIChUaGlzIGlzIG5vdCBjaGVja2VkIGJ5IEV4cGVjdENsZWFyKCkgc2luY2UgaXQgaXMgbm90IGFjdHVhbGx5IHRydWUgYWZ0ZXIKKyAgLy8gdGhlIGZpZWxkcyBoYXZlIGJlZW4gc2V0IGFuZCB0aGVuIGNsZWFyZWQuKQorICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok9wdGlvbmFsR3JvdXA6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsZ3JvdXAiKSkpOworICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX0VRKCZ1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBBY2Nlc3NvcnMpIHsKKyAgLy8gU2V0IGV2ZXJ5IGZpZWxkIHRvIGEgdW5pcXVlIHZhbHVlIHRoZW4gZ28gYmFjayBhbmQgY2hlY2sgYWxsIHRob3NlCisgIC8vIHZhbHVlcy4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKKyAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24obWVzc2FnZSk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuTW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdFJlcGVhdGVkRmllbGRzTW9kaWZpZWQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBHZXRTdHJpbmdSZWZlcmVuY2UpIHsKKyAgLy8gVGVzdCB0aGF0IEdldFN0cmluZ1JlZmVyZW5jZSgpIHJldHVybnMgdGhlIHVuZGVybHlpbmcgc3RyaW5nIHdoZW4gaXQKKyAgLy8gaXMgYSBub3JtYWwgc3RyaW5nIGZpZWxkLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3N0cmluZygiZm9vIik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiZm9vIik7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBzdGQ6OnN0cmluZyBzY3JhdGNoOworCisgIEVYUEVDVF9FUSgKKyAgICAgICZtZXNzYWdlLm9wdGlvbmFsX3N0cmluZygpLAorICAgICAgJnJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciKSwgJnNjcmF0Y2gpKQorICAgICAgPDwgIkZvciBzaW1wbGUgc3RyaW5nIGZpZWxkcywgR2V0U3RyaW5nUmVmZXJlbmNlKCkgc2hvdWxkIHJldHVybiBhICIKKyAgICAgICAgICJyZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgc3RyaW5nLiI7CisgIEVYUEVDVF9FUSgmbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcoMCksCisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nIiksIDAsICZzY3JhdGNoKSkKKyAgICAgIDw8ICJGb3Igc2ltcGxlIHN0cmluZyBmaWVsZHMsIEdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKCkgc2hvdWxkICIKKyAgICAgICAgICJyZXR1cm4gIgorICAgICAgICAgImEgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmluZy4iOworfQorCisKK2NsYXNzIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uU3dhcFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxib29sPiB7CisgcHJvdGVjdGVkOgorICB2b2lkIFN3YXAoY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwgTWVzc2FnZSogbGhzLCBNZXNzYWdlKiByaHMpIHsKKyAgICBpZiAoR2V0UGFyYW0oKSkgeworICAgICAgcmVmbGVjdGlvbi0+VW5zYWZlQXJlbmFTd2FwKGxocywgcmhzKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVmbGVjdGlvbi0+U3dhcChsaHMsIHJocyk7CisgICAgfQorICB9CisgIHZvaWQgU3dhcEZpZWxkcyhjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLCBNZXNzYWdlKiBsaHMsIE1lc3NhZ2UqIHJocywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+JiBmaWVsZHMpIHsKKyAgICBpZiAoR2V0UGFyYW0oKSkgeworICAgICAgcmVmbGVjdGlvbi0+VW5zYWZlQXJlbmFTd2FwRmllbGRzKGxocywgcmhzLCBmaWVsZHMpOworICAgIH0gZWxzZSB7CisgICAgICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKGxocywgcmhzLCBmaWVsZHMpOworICAgIH0KKyAgfQorfTsKKworLy8gdW5zYWZlX3NoYWxsb3dfc3dhcDogdHJ1ZSAtPiBVbnNhZmVBcmVuYSogQVBJLgorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFJlZmxlY3Rpb25Td2FwLCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblN3YXBUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OkJvb2woKSk7CisKK1RFU1RfUChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblN3YXBUZXN0LCBMaHNTZXQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBsaHM7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgcmhzOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJmxocyk7CisKKyAgU3dhcChsaHMuR2V0UmVmbGVjdGlvbigpLCAmbGhzLCAmcmhzKTsKKworICBUZXN0VXRpbDo6RXhwZWN0Q2xlYXIobGhzKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChyaHMpOworfQorCitURVNUX1AoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25Td2FwVGVzdCwgQm90aFNldCkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIGxoczsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyByaHM7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbGhzKTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmcmhzKTsKKyAgVGVzdFV0aWw6Ok1vZGlmeVJlcGVhdGVkRmllbGRzKCZyaHMpOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBsaHMuR2V0UmVmbGVjdGlvbigpOworICBTd2FwKHJlZmxlY3Rpb24sICZsaHMsICZyaHMpOworCisgIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZEZpZWxkc01vZGlmaWVkKGxocyk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQocmhzKTsKKworICBsaHMuc2V0X29wdGlvbmFsX2ludDMyKDUzMjgxOSk7CisKKyAgU3dhcChyZWZsZWN0aW9uLCAmbGhzLCAmcmhzKTsKKworICBFWFBFQ1RfRVEoNTMyODE5LCByaHMub3B0aW9uYWxfaW50MzIoKSk7Cit9CisKK1RFU1RfUChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblN3YXBUZXN0LCBMaHNDbGVhcmVkKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbGhzOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIHJoczsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZsaHMpOworCisgIC8vIEZvciBwcm90bzIgbWVzc2FnZSwgZm9yIG1lc3NhZ2UgZmllbGQsIENsZWFyIG9ubHkgcmVzZXQgaGFzYml0cywgYnV0CisgIC8vIGRvZXNuJ3QgZGVsZXRlIHRoZSB1bmRlcmx5aW5nIGZpZWxkLgorICBsaHMuQ2xlYXIoKTsKKworICBTd2FwKGxocy5HZXRSZWZsZWN0aW9uKCksICZsaHMsICZyaHMpOworCisgIFRlc3RVdGlsOjpFeHBlY3RDbGVhcihyaHMpOworfQorCitURVNUX1AoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25Td2FwVGVzdCwgUmhzQ2xlYXJlZCkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIGxoczsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyByaHM7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmcmhzKTsKKworICAvLyBGb3IgcHJvdG8yIG1lc3NhZ2UsIGZvciBtZXNzYWdlIGZpZWxkLCBDbGVhciBvbmx5IHJlc2V0IGhhc2JpdHMsIGJ1dAorICAvLyBkb2Vzbid0IGRlbGV0ZSB0aGUgdW5kZXJseWluZyBmaWVsZC4KKyAgcmhzLkNsZWFyKCk7CisKKyAgU3dhcChsaHMuR2V0UmVmbGVjdGlvbigpLCAmbGhzLCAmcmhzKTsKKworICBUZXN0VXRpbDo6RXhwZWN0Q2xlYXIobGhzKTsKK30KKworVEVTVF9QKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uU3dhcFRlc3QsIEV4dGVuc2lvbnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIGxoczsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIHJoczsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbGhzKTsKKworICBTd2FwKGxocy5HZXRSZWZsZWN0aW9uKCksICZsaHMsICZyaHMpOworCisgIFRlc3RVdGlsOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobGhzKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQocmhzKTsKK30KKworVEVTVF9QKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uU3dhcFRlc3QsIFVua25vd24pIHsKKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgbGhzLCByaHM7CisKKyAgbGhzLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEyMzQsIDEpOworCisgIEVYUEVDVF9FUSgxLCBsaHMudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDAsIHJocy51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworICBTd2FwKGxocy5HZXRSZWZsZWN0aW9uKCksICZsaHMsICZyaHMpOworICBFWFBFQ1RfRVEoMCwgbGhzLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLCByaHMudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKK30KKworVEVTVF9QKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uU3dhcFRlc3QsIE9uZW9mKSB7CisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIGxocywgcmhzOworICBUZXN0VXRpbDo6U2V0T25lb2YxKCZsaHMpOworCisgIFN3YXAobGhzLkdldFJlZmxlY3Rpb24oKSwgJmxocywgJnJocyk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mQ2xlYXIobGhzKTsKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MShyaHMpOworfQorCitURVNUX1AoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25Td2FwVGVzdCwgT25lb2ZCb3RoU2V0KSB7CisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIGxocywgcmhzOworICBUZXN0VXRpbDo6U2V0T25lb2YxKCZsaHMpOworICBUZXN0VXRpbDo6U2V0T25lb2YyKCZyaHMpOworCisgIFN3YXAobGhzLkdldFJlZmxlY3Rpb24oKSwgJmxocywgJnJocyk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MihsaHMpOworICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQxKHJocyk7Cit9CisKK1RFU1RfUChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblN3YXBUZXN0LCBTd2FwRmllbGRzKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPiBsaHMoCisgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPihudWxscHRyKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPiByaHMoCisgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPihudWxscHRyKSk7CisgIGxocy0+c2V0X29wdGlvbmFsX2RvdWJsZSgxMi4zKTsKKyAgbGhzLT5tdXRhYmxlX3JlcGVhdGVkX2ludDMyKCktPkFkZCgxMCk7CisgIGxocy0+bXV0YWJsZV9yZXBlYXRlZF9pbnQzMigpLT5BZGQoMjApOworCisgIHJocy0+c2V0X29wdGlvbmFsX3N0cmluZygiaGVsbG8iKTsKKyAgcmhzLT5tdXRhYmxlX3JlcGVhdGVkX2ludDY0KCktPkFkZCgzMCk7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbGhzLT5HZXREZXNjcmlwdG9yKCk7CisgIGZpZWxkcy5wdXNoX2JhY2soZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9kb3VibGUiKSk7CisgIGZpZWxkcy5wdXNoX2JhY2soZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9pbnQzMiIpKTsKKyAgZmllbGRzLnB1c2hfYmFjayhkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX3N0cmluZyIpKTsKKyAgZmllbGRzLnB1c2hfYmFjayhkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX3VpbnQ2NCIpKTsKKworICBTd2FwRmllbGRzKGxocy0+R2V0UmVmbGVjdGlvbigpLCBsaHMuZ2V0KCksIHJocy5nZXQoKSwgZmllbGRzKTsKKworICBFWFBFQ1RfRkFMU0UobGhzLT5oYXNfb3B0aW9uYWxfZG91YmxlKCkpOworICBFWFBFQ1RfRVEoMCwgbGhzLT5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBFWFBFQ1RfVFJVRShsaHMtPmhhc19vcHRpb25hbF9zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiaGVsbG8iLCBsaHMtPm9wdGlvbmFsX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKDAsIGxocy0+cmVwZWF0ZWRfaW50NjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKGxocy0+aGFzX29wdGlvbmFsX3VpbnQ2NCgpKTsKKworICBFWFBFQ1RfVFJVRShyaHMtPmhhc19vcHRpb25hbF9kb3VibGUoKSk7CisgIEVYUEVDVF9FUSgxMi4zLCByaHMtPm9wdGlvbmFsX2RvdWJsZSgpKTsKKyAgRVhQRUNUX0VRKDIsIHJocy0+cmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEwLCByaHMtPnJlcGVhdGVkX2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDIwLCByaHMtPnJlcGVhdGVkX2ludDMyKDEpKTsKKyAgRVhQRUNUX0ZBTFNFKHJocy0+aGFzX29wdGlvbmFsX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKDEsIHJocy0+cmVwZWF0ZWRfaW50NjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHJocy0+aGFzX29wdGlvbmFsX3VpbnQ2NCgpKTsKK30KKworVEVTVF9QKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uU3dhcFRlc3QsIFN3YXBGaWVsZHNBbGwpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+IGxocygKKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+KG51bGxwdHIpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+IHJocygKKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+KG51bGxwdHIpKTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKHJocy5nZXQoKSk7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbGhzLT5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMoKnJocywgJmZpZWxkcyk7CisgIFN3YXBGaWVsZHMocmVmbGVjdGlvbiwgbGhzLmdldCgpLCByaHMuZ2V0KCksIGZpZWxkcyk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldCgqbGhzKTsKKyAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKCpyaHMpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU3dhcEZpZWxkc0FsbE9uRGlmZmVyZW50QXJlbmEpIHsKKyAgQXJlbmEgYXJlbmExLCBhcmVuYTI7CisgIGF1dG8qIG1lc3NhZ2UxID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlcz4oJmFyZW5hMSk7CisgIGF1dG8qIG1lc3NhZ2UyID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlcz4oJmFyZW5hMik7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcyhtZXNzYWdlMik7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEtPkdldFJlZmxlY3Rpb24oKTsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZTIsICZmaWVsZHMpOworICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGRzKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KCptZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RDbGVhcigqbWVzc2FnZTIpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU3dhcEZpZWxkc0FsbE9uQXJlbmFIZWFwKSB7CisgIEFyZW5hIGFyZW5hOworICBhdXRvKiBtZXNzYWdlMSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIHN0ZDo6dW5pcXVlX3B0cjx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPiBtZXNzYWdlMigKKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+KG51bGxwdHIpKTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKG1lc3NhZ2UyLmdldCgpKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS0+R2V0UmVmbGVjdGlvbigpOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKCptZXNzYWdlMiwgJmZpZWxkcyk7CisgIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMobWVzc2FnZTEsIG1lc3NhZ2UyLmdldCgpLCBmaWVsZHMpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoKm1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKCptZXNzYWdlMik7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwRmllbGRzQWxsRXh0ZW5zaW9uKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UyOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlMSk7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1lc3NhZ2UxLCAmZmllbGRzKTsKKyAgcmVmbGVjdGlvbi0+U3dhcEZpZWxkcygmbWVzc2FnZTEsICZtZXNzYWdlMiwgZmllbGRzKTsKKworICBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU3dhcEZpZWxkc0FsbEV4dGVuc2lvbkFyZW5hSGVhcCkgeworICBBcmVuYSBhcmVuYTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPiBtZXNzYWdlMSgKKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4obnVsbHB0cikpOworICBhdXRvKiBtZXNzYWdlMiA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4oJmFyZW5hKTsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlMS5nZXQoKSk7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEtPkdldFJlZmxlY3Rpb24oKTsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZTEsICZmaWVsZHMpOworICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKG1lc3NhZ2UxLmdldCgpLCBtZXNzYWdlMiwgZmllbGRzKTsKKworICBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKCptZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KCptZXNzYWdlMik7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBVbnNhZmVTaGFsbG93U3dhcEZpZWxkc0FsbCkgeworICBBcmVuYSBhcmVuYTsKKyAgYXV0byogbWVzc2FnZTEgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPigmYXJlbmEpOworICBhdXRvKiBtZXNzYWdlMiA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcyhtZXNzYWdlMik7CisKKyAgYXV0byoga2VwdF9uZXN0ZWRfbWVzc2FnZV9wdHIgPSBtZXNzYWdlMi0+bXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworICBhdXRvKiBrZXB0X2ZvcmVpZ25fbWVzc2FnZV9wdHIgPSBtZXNzYWdlMi0+bXV0YWJsZV9vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKTsKKyAgYXV0byoga2VwdF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9wdHIgPQorICAgICAgbWVzc2FnZTItPm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCk7CisgIGF1dG8qIGtlcHRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3B0ciA9CisgICAgICBtZXNzYWdlMi0+bXV0YWJsZV9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCk7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEtPkdldFJlZmxlY3Rpb24oKTsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZTIsICZmaWVsZHMpOworICBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3RIZWxwZXI6OlVuc2FmZVNoYWxsb3dTd2FwRmllbGRzKAorICAgICAgbWVzc2FnZTEsIG1lc3NhZ2UyLCBmaWVsZHMpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoKm1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKCptZXNzYWdlMik7CisKKyAgLy8gRXhwZWN0cyB0aGUgc3dhcCB0byBiZSBzaGFsbG93LiBFeHBlY3RzIHBvaW50ZXIgc3RhYmlsaXR5IHRvIHRoZSBlbGVtZW50IG9mCisgIC8vIHRoZSByZXBlYXRlZCBmaWVsZHMgKG5vdCB0aGUgY29udGFpbmVyKS4KKyAgRVhQRUNUX0VRKGtlcHRfbmVzdGVkX21lc3NhZ2VfcHRyLAorICAgICAgICAgICAgbWVzc2FnZTEtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUShrZXB0X2ZvcmVpZ25fbWVzc2FnZV9wdHIsCisgICAgICAgICAgICBtZXNzYWdlMS0+bXV0YWJsZV9vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUShrZXB0X3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3B0ciwKKyAgICAgICAgICAgIG1lc3NhZ2UxLT5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApKTsKKyAgRVhQRUNUX0VRKGtlcHRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3B0ciwKKyAgICAgICAgICAgIG1lc3NhZ2UxLT5tdXRhYmxlX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgwKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBVbnNhZmVTaGFsbG93U3dhcEZpZWxkc01hcCkgeworICBBcmVuYSBhcmVuYTsKKyAgYXV0byogbWVzc2FnZTEgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdE1hcD4oJmFyZW5hKTsKKyAgYXV0byogbWVzc2FnZTIgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdE1hcD4oJmFyZW5hKTsKKworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKG1lc3NhZ2UyKTsKKworICBhdXRvKiBrZXB0X21hcF9pbnQzMl9mbV9wdHIgPQorICAgICAgJigqbWVzc2FnZTItPm11dGFibGVfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpKVswXTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS0+R2V0UmVmbGVjdGlvbigpOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKCptZXNzYWdlMiwgJmZpZWxkcyk7CisgIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdEhlbHBlcjo6VW5zYWZlU2hhbGxvd1N3YXBGaWVsZHMoCisgICAgICBtZXNzYWdlMSwgbWVzc2FnZTIsIGZpZWxkcyk7CisKKyAgTWFwVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldCgqbWVzc2FnZTEpOworICBNYXBUZXN0VXRpbDo6RXhwZWN0Q2xlYXIoKm1lc3NhZ2UyKTsKKworICAvLyBFeHBlY3RzIHRoZSBzd2FwIHRvIGJlIHNoYWxsb3cuCisgIEVYUEVDVF9FUShrZXB0X21hcF9pbnQzMl9mbV9wdHIsCisgICAgICAgICAgICAmKCptZXNzYWdlMS0+bXV0YWJsZV9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKCkpWzBdKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFVuc2FmZVNoYWxsb3dTd2FwRmllbGRzQWxsRXh0ZW5zaW9uKSB7CisgIEFyZW5hIGFyZW5hOworICBhdXRvKiBtZXNzYWdlMSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4oJmFyZW5hKTsKKyAgYXV0byogbWVzc2FnZTIgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+KCZhcmVuYSk7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMobWVzc2FnZTEpOworCisgIGF1dG8qIGtlcHRfbmVzdGVkX21lc3NhZ2VfZXh0X3B0ciA9CisgICAgICBtZXNzYWdlMS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKTsKKyAgYXV0byoga2VwdF9mb3JlaWduX21lc3NhZ2VfZXh0X3B0ciA9CisgICAgICBtZXNzYWdlMS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbik7CisgIGF1dG8qIGtlcHRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0X3B0ciA9CisgICAgICBtZXNzYWdlMS0+TXV0YWJsZVJlcGVhdGVkRXh0ZW5zaW9uKAorICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pOworICBhdXRvKiBrZXB0X3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRfcHRyID0KKyAgICAgIG1lc3NhZ2UxLT5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UxLT5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMoKm1lc3NhZ2UxLCAmZmllbGRzKTsKKyAgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0SGVscGVyOjpVbnNhZmVTaGFsbG93U3dhcEZpZWxkcygKKyAgICAgIG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGRzKTsKKworICBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKCptZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KCptZXNzYWdlMik7CisKKyAgLy8gRXhwZWN0cyB0aGUgc3dhcCB0byBiZSBzaGFsbG93LgorICBFWFBFQ1RfRVEoCisgICAgICBrZXB0X25lc3RlZF9tZXNzYWdlX2V4dF9wdHIsCisgICAgICBtZXNzYWdlMi0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIGtlcHRfZm9yZWlnbl9tZXNzYWdlX2V4dF9wdHIsCisgICAgICBtZXNzYWdlMi0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoa2VwdF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRfcHRyLAorICAgICAgICAgICAgbWVzc2FnZTItPk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUShrZXB0X3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRfcHRyLAorICAgICAgICAgICAgbWVzc2FnZTItPk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU3dhcEZpZWxkc09uZW9mKSB7CisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgVGVzdFV0aWw6OlNldE9uZW9mMSgmbWVzc2FnZTEpOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UxLkdldERlc2NyaXB0b3IoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZHMucHVzaF9iYWNrKGRlc2NyaXB0b3ItPmZpZWxkKGkpKTsKKyAgfQorICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOworICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKCZtZXNzYWdlMSwgJm1lc3NhZ2UyLCBmaWVsZHMpOworCisgIFRlc3RVdGlsOjpFeHBlY3RPbmVvZkNsZWFyKG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MShtZXNzYWdlMik7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBVbnNhZmVTaGFsbG93U3dhcEZpZWxkc09uZW9mKSB7CisgIEFyZW5hIGFyZW5hOworICBhdXRvKiBtZXNzYWdlMSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0T25lb2YyPigmYXJlbmEpOworICBhdXRvKiBtZXNzYWdlMiA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0T25lb2YyPigmYXJlbmEpOworICBUZXN0VXRpbDo6U2V0T25lb2YxKG1lc3NhZ2UxKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlMS0+R2V0RGVzY3JpcHRvcigpOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkcy5wdXNoX2JhY2soZGVzY3JpcHRvci0+ZmllbGQoaSkpOworICB9CisgIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdEhlbHBlcjo6VW5zYWZlU2hhbGxvd1N3YXBGaWVsZHMoCisgICAgICBtZXNzYWdlMSwgbWVzc2FnZTIsIGZpZWxkcyk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mQ2xlYXIoKm1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MSgqbWVzc2FnZTIpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwKKyAgICAgVW5zYWZlU2hhbGxvd1N3YXBGaWVsZHNPbmVvZkV4cGVjdFNoYWxsb3cpIHsKKyAgQXJlbmEgYXJlbmE7CisgIGF1dG8qIG1lc3NhZ2UxID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RPbmVvZjI+KCZhcmVuYSk7CisgIGF1dG8qIG1lc3NhZ2UyID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RPbmVvZjI+KCZhcmVuYSk7CisgIFRlc3RVdGlsOjpTZXRPbmVvZjEobWVzc2FnZTEpOworICBtZXNzYWdlMS0+bXV0YWJsZV9mb29fbWVzc2FnZSgpLT5zZXRfbW9vX2ludCgxMDAwKTsKKyAgYXV0byoga2VwdF9mb29fcHRyID0gbWVzc2FnZTEtPm11dGFibGVfZm9vX21lc3NhZ2UoKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlMS0+R2V0RGVzY3JpcHRvcigpOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkcy5wdXNoX2JhY2soZGVzY3JpcHRvci0+ZmllbGQoaSkpOworICB9CisgIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdEhlbHBlcjo6VW5zYWZlU2hhbGxvd1N3YXBGaWVsZHMoCisgICAgICBtZXNzYWdlMSwgbWVzc2FnZTIsIGZpZWxkcyk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTItPmhhc19mb29fbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyLT5mb29fbWVzc2FnZSgpLm1vb19pbnQoKSwgMTAwMCk7CisgIEVYUEVDVF9FUShrZXB0X2Zvb19wdHIsIG1lc3NhZ2UyLT5tdXRhYmxlX2Zvb19tZXNzYWdlKCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgUmVtb3ZlTGFzdCkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpKTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKworICByZWZsZWN0aW9uX3Rlc3Rlci5SZW1vdmVMYXN0UmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdExhc3RSZXBlYXRlZHNSZW1vdmVkKG1lc3NhZ2UpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgUmVtb3ZlTGFzdEV4dGVuc2lvbnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCkpOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKworICByZWZsZWN0aW9uX3Rlc3Rlci5SZW1vdmVMYXN0UmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdExhc3RSZXBlYXRlZEV4dGVuc2lvbnNSZW1vdmVkKG1lc3NhZ2UpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgUmVsZWFzZUxhc3QpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKGRlc2NyaXB0b3IpOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLlJlbGVhc2VMYXN0UmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSwgZmFsc2UpOworCisgIFRlc3RVdGlsOjpFeHBlY3RMYXN0UmVwZWF0ZWRzUmVsZWFzZWQobWVzc2FnZSk7CisKKyAgLy8gTm93IHRlc3QgdGhhdCB3ZSBhY3R1YWxseSByZWxlYXNlIHRoZSByaWdodCBtZXNzYWdlLgorICBtZXNzYWdlLkNsZWFyKCk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgY29uc3QgcHJvdG9idWZfdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKiBleHBlY3RlZCA9CisgICAgICBtZXNzYWdlLm11dGFibGVfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpOworICAodm9pZClleHBlY3RlZDsgIC8vIHVudXNlZCBpbiBzb21jZSBjb25maWd1cmF0aW9ucworICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gcmVsZWFzZWQobWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPlJlbGVhc2VMYXN0KAorICAgICAgJm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX0VRKGV4cGVjdGVkLCByZWxlYXNlZC5nZXQoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBSZWxlYXNlTGFzdEV4dGVuc2lvbnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoZGVzY3JpcHRvcik7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLlJlbGVhc2VMYXN0UmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSwgdHJ1ZSk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdExhc3RSZXBlYXRlZEV4dGVuc2lvbnNSZWxlYXNlZChtZXNzYWdlKTsKKworICAvLyBOb3cgdGVzdCB0aGF0IHdlIGFjdHVhbGx5IHJlbGVhc2UgdGhlIHJpZ2h0IG1lc3NhZ2UuCisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworICBBU1NFUlRfRVEoCisgICAgICAyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgY29uc3QgcHJvdG9idWZfdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKiBleHBlY3RlZCA9CisgICAgICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sIDEpOworICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gcmVsZWFzZWQobWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPlJlbGVhc2VMYXN0KAorICAgICAgJm1lc3NhZ2UsIGRlc2NyaXB0b3ItPmZpbGUoKS0+RmluZEV4dGVuc2lvbkJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24iKSkpOworICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHJlbGVhc2VkLmdldCgpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFN3YXBSZXBlYXRlZEVsZW1lbnRzKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCisgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCkpOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworCisgIC8vIFN3YXAgYW5kIHRlc3QgdGhhdCBmaWVsZHMgYXJlIGFsbCBzd2FwcGVkLgorICByZWZsZWN0aW9uX3Rlc3Rlci5Td2FwUmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZHNTd2FwcGVkKG1lc3NhZ2UpOworCisgIC8vIFN3YXAgYmFjayBhbmQgdGVzdCB0aGF0IGZpZWxkcyBhcmUgYWxsIGJhY2sgdG8gb3JpZ2luYWwgdmFsdWVzLgorICByZWZsZWN0aW9uX3Rlc3Rlci5Td2FwUmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwUmVwZWF0ZWRFbGVtZW50c0V4dGVuc2lvbikgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCisgICAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKSk7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworCisgIC8vIFN3YXAgYW5kIHRlc3QgdGhhdCBmaWVsZHMgYXJlIGFsbCBzd2FwcGVkLgorICByZWZsZWN0aW9uX3Rlc3Rlci5Td2FwUmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZEV4dGVuc2lvbnNTd2FwcGVkKG1lc3NhZ2UpOworCisgIC8vIFN3YXAgYmFjayBhbmQgdGVzdCB0aGF0IGZpZWxkcyBhcmUgYWxsIGJhY2sgdG8gb3JpZ2luYWwgdmFsdWVzLgorICByZWZsZWN0aW9uX3Rlc3Rlci5Td2FwUmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgRXh0ZW5zaW9ucykgeworICAvLyBTZXQgZXZlcnkgZXh0ZW5zaW9uIHRvIGEgdW5pcXVlIHZhbHVlIHRoZW4gZ28gYmFjayBhbmQgY2hlY2sgYWxsIHRob3NlCisgIC8vIHZhbHVlcy4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCkpOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKKworICByZWZsZWN0aW9uX3Rlc3Rlci5Nb2RpZnlSZXBlYXRlZEZpZWxkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBGaW5kRXh0ZW5zaW9uVHlwZUJ5TnVtYmVyKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPQorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkuR2V0UmVmbGVjdGlvbigpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uMSA9CisgICAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgICAgICAgICJvcHRpb25hbF9pbnQzMl9leHRlbnNpb24iKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24yID0KKyAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkZpbmRFeHRlbnNpb25CeU5hbWUoCisgICAgICAgICAgInJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24iKTsKKworICBFWFBFQ1RfRVEoZXh0ZW5zaW9uMSwKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKGV4dGVuc2lvbjEtPm51bWJlcigpKSk7CisgIEVYUEVDVF9FUShleHRlbnNpb24yLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoZXh0ZW5zaW9uMi0+bnVtYmVyKCkpKTsKKworICAvLyBOb24tZXhpc3RlbnQgZXh0ZW5zaW9uLgorICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5GaW5kS25vd25FeHRlbnNpb25CeU51bWJlcig2MjM0MSkgPT0gbnVsbHB0cik7CisKKyAgLy8gRXh0ZW5zaW9ucyBvZiBUZXN0QWxsRXh0ZW5zaW9ucyBzaG91bGQgbm90IHNob3cgdXAgYXMgZXh0ZW5zaW9ucyBvZgorICAvLyBvdGhlciB0eXBlcy4KKyAgRVhQRUNUX1RSVUUodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVmYXVsdF9pbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgICAuR2V0UmVmbGVjdGlvbigpCisgICAgICAgICAgICAgICAgICAtPkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKGV4dGVuc2lvbjEtPm51bWJlcigpKSA9PQorICAgICAgICAgICAgICBudWxscHRyKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIEZpbmRLbm93bkV4dGVuc2lvbkJ5TmFtZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0KKyAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpLkdldFJlZmxlY3Rpb24oKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbjEgPQorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+RmluZEV4dGVuc2lvbkJ5TmFtZSgKKyAgICAgICAgICAib3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uMiA9CisgICAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgICAgICAgICJyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uIik7CisKKyAgRVhQRUNUX0VRKGV4dGVuc2lvbjEsCisgICAgICAgICAgICByZWZsZWN0aW9uLT5GaW5kS25vd25FeHRlbnNpb25CeU5hbWUoZXh0ZW5zaW9uMS0+ZnVsbF9uYW1lKCkpKTsKKyAgRVhQRUNUX0VRKGV4dGVuc2lvbjIsCisgICAgICAgICAgICByZWZsZWN0aW9uLT5GaW5kS25vd25FeHRlbnNpb25CeU5hbWUoZXh0ZW5zaW9uMi0+ZnVsbF9uYW1lKCkpKTsKKworICAvLyBOb24tZXhpc3RlbnQgZXh0ZW5zaW9uLgorICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5GaW5kS25vd25FeHRlbnNpb25CeU5hbWUoIm5vX3N1Y2hfZXh0IikgPT0gbnVsbHB0cik7CisKKyAgLy8gRXh0ZW5zaW9ucyBvZiBUZXN0QWxsRXh0ZW5zaW9ucyBzaG91bGQgbm90IHNob3cgdXAgYXMgZXh0ZW5zaW9ucyBvZgorICAvLyBvdGhlciB0eXBlcy4KKyAgRVhQRUNUX1RSVUUodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVmYXVsdF9pbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgICAuR2V0UmVmbGVjdGlvbigpCisgICAgICAgICAgICAgICAgICAtPkZpbmRLbm93bkV4dGVuc2lvbkJ5TmFtZShleHRlbnNpb24xLT5mdWxsX25hbWUoKSkgPT0KKyAgICAgICAgICAgICAgbnVsbHB0cik7Cit9CisKKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFNldEFsbG9jYXRlZE1lc3NhZ2VUZXN0KSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgZnJvbV9tZXNzYWdlMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBmcm9tX21lc3NhZ2UyOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIHRvX21lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmZnJvbV9tZXNzYWdlMSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oJmZyb21fbWVzc2FnZTIpOworCisgIC8vIEJlZm9yZSBtb3ZpbmcgZmllbGRzLCB3ZSBleHBlY3QgdGhlIG5lc3RlZCBtZXNzYWdlcyB0byBiZSBudWxscHRyLgorICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICZ0b19tZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6SVNfTlVMTCk7CisKKyAgLy8gQWZ0ZXIgZmllbGRzIGFyZSBtb3ZlZCB3ZSBzaG91bGQgZ2V0IG5vbi1udWxscHRyIHJlbGVhc2VzLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKAorICAgICAgJmZyb21fbWVzc2FnZTEsICZ0b19tZXNzYWdlKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCisgICAgICAmdG9fbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok5PVF9OVUxMKTsKKworICAvLyBBbm90aGVyIG1vdmUgdG8gbWFrZSBzdXJlIHRoYXQgd2UgY2FuIFNldEFsbG9jYXRlZCBzZXZlcmFsIHRpbWVzLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKAorICAgICAgJmZyb21fbWVzc2FnZTIsICZ0b19tZXNzYWdlKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCisgICAgICAmdG9fbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok5PVF9OVUxMKTsKKworICAvLyBBZnRlciBTZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb051bGxWaWFSZWZsZWN0aW9uKCkgd2UgZXhwZWN0IHRoZQorICAvLyByZWxlYXNlcyB0byBiZSBudWxscHRyIGFnYWluLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb051bGxWaWFSZWZsZWN0aW9uKAorICAgICAgJnRvX21lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICZ0b19tZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6SVNfTlVMTCk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTZXRBbGxvY2F0ZWRNZXNzYWdlT25BcmVuYVRlc3QpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBmcm9tX21lc3NhZ2UxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIGZyb21fbWVzc2FnZTI7CisgIEFyZW5hIGFyZW5hOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiB0b19tZXNzYWdlID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmZnJvbV9tZXNzYWdlMSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oJmZyb21fbWVzc2FnZTIpOworCisgIC8vIEJlZm9yZSBtb3ZpbmcgZmllbGRzLCB3ZSBleHBlY3QgdGhlIG5lc3RlZCBtZXNzYWdlcyB0byBiZSBudWxscHRyLgorICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgIHRvX21lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpJU19OVUxMKTsKKworICAvLyBBZnRlciBmaWVsZHMgYXJlIG1vdmVkIHdlIHNob3VsZCBnZXQgbm9uLW51bGxwdHIgcmVsZWFzZXMuCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTWVzc2FnZVZpYVJlZmxlY3Rpb24oCisgICAgICAmZnJvbV9tZXNzYWdlMSwgdG9fbWVzc2FnZSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgdG9fbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok5PVF9OVUxMKTsKKworICAvLyBBbm90aGVyIG1vdmUgdG8gbWFrZSBzdXJlIHRoYXQgd2UgY2FuIFNldEFsbG9jYXRlZCBzZXZlcmFsIHRpbWVzLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKAorICAgICAgJmZyb21fbWVzc2FnZTIsIHRvX21lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgIHRvX21lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpOT1RfTlVMTCk7CisKKyAgLy8gQWZ0ZXIgU2V0QWxsb2NhdGVkT3B0aW9uYWxNZXNzYWdlRmllbGRzVG9OdWxsVmlhUmVmbGVjdGlvbigpIHdlIGV4cGVjdCB0aGUKKyAgLy8gcmVsZWFzZXMgdG8gYmUgbnVsbHB0ciBhZ2Fpbi4KKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsb2NhdGVkT3B0aW9uYWxNZXNzYWdlRmllbGRzVG9OdWxsVmlhUmVmbGVjdGlvbigKKyAgICAgIHRvX21lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgIHRvX21lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpJU19OVUxMKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFNldEFsbG9jYXRlZEV4dGVuc2lvbk1lc3NhZ2VUZXN0KSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBmcm9tX21lc3NhZ2UxOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgZnJvbV9tZXNzYWdlMjsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIHRvX21lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCkpOworICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKCZmcm9tX21lc3NhZ2UxKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmZnJvbV9tZXNzYWdlMik7CisKKyAgLy8gQmVmb3JlIG1vdmluZyBmaWVsZHMsIHdlIGV4cGVjdCB0aGUgbmVzdGVkIG1lc3NhZ2VzIHRvIGJlIG51bGxwdHIuCisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgJnRvX21lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpJU19OVUxMKTsKKworICAvLyBBZnRlciBmaWVsZHMgYXJlIG1vdmVkIHdlIHNob3VsZCBnZXQgbm9uLW51bGxwdHIgcmVsZWFzZXMuCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTWVzc2FnZVZpYVJlZmxlY3Rpb24oCisgICAgICAmZnJvbV9tZXNzYWdlMSwgJnRvX21lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICZ0b19tZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6Tk9UX05VTEwpOworCisgIC8vIEFub3RoZXIgbW92ZSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBjYW4gU2V0QWxsb2NhdGVkIHNldmVyYWwgdGltZXMuCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTWVzc2FnZVZpYVJlZmxlY3Rpb24oCisgICAgICAmZnJvbV9tZXNzYWdlMiwgJnRvX21lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICZ0b19tZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6Tk9UX05VTEwpOworCisgIC8vIEFmdGVyIFNldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTnVsbFZpYVJlZmxlY3Rpb24oKSB3ZSBleHBlY3QgdGhlCisgIC8vIHJlbGVhc2VzIHRvIGJlIG51bGxwdHIgYWdhaW4uCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTnVsbFZpYVJlZmxlY3Rpb24oCisgICAgICAmdG9fbWVzc2FnZSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgJnRvX21lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpJU19OVUxMKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFNldEFsbG9jYXRlZEV4dGVuc2lvbk1lc3NhZ2VPbkFyZW5hVGVzdCkgeworICBBcmVuYSBhcmVuYTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiB0b19tZXNzYWdlID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4oJmFyZW5hKTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIGZyb21fbWVzc2FnZTE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBmcm9tX21lc3NhZ2UyOworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKKyAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVzY3JpcHRvcigpKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmZnJvbV9tZXNzYWdlMSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oJmZyb21fbWVzc2FnZTIpOworCisgIC8vIEJlZm9yZSBtb3ZpbmcgZmllbGRzLCB3ZSBleHBlY3QgdGhlIG5lc3RlZCBtZXNzYWdlcyB0byBiZSBudWxscHRyLgorICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgIHRvX21lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpJU19OVUxMKTsKKworICAvLyBBZnRlciBmaWVsZHMgYXJlIG1vdmVkIHdlIHNob3VsZCBnZXQgbm9uLW51bGxwdHIgcmVsZWFzZXMuCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTWVzc2FnZVZpYVJlZmxlY3Rpb24oCisgICAgICAmZnJvbV9tZXNzYWdlMSwgdG9fbWVzc2FnZSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgdG9fbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok5PVF9OVUxMKTsKKworICAvLyBBbm90aGVyIG1vdmUgdG8gbWFrZSBzdXJlIHRoYXQgd2UgY2FuIFNldEFsbG9jYXRlZCBzZXZlcmFsIHRpbWVzLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKAorICAgICAgJmZyb21fbWVzc2FnZTIsIHRvX21lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgIHRvX21lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpOT1RfTlVMTCk7CisKKyAgLy8gQWZ0ZXIgU2V0QWxsb2NhdGVkT3B0aW9uYWxNZXNzYWdlRmllbGRzVG9OdWxsVmlhUmVmbGVjdGlvbigpIHdlIGV4cGVjdCB0aGUKKyAgLy8gcmVsZWFzZXMgdG8gYmUgbnVsbHB0ciBhZ2Fpbi4KKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsb2NhdGVkT3B0aW9uYWxNZXNzYWdlRmllbGRzVG9OdWxsVmlhUmVmbGVjdGlvbigKKyAgICAgIHRvX21lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgIHRvX21lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpJU19OVUxMKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIEFkZFJlcGVhdGVkTWVzc2FnZSkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBSZWZsZWN0aW9uKiBuZXN0ZWRfcmVmbGVjdGlvbiA9CisgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCkuR2V0UmVmbGVjdGlvbigpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbmVzdGVkX2JiID0KKyAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKAorICAgICAgICAgICJiYiIpOworCisgIE1lc3NhZ2UqIG5lc3RlZCA9CisgICAgICByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKCZtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpKTsKKyAgbmVzdGVkX3JlZmxlY3Rpb24tPlNldEludDMyKG5lc3RlZCwgbmVzdGVkX2JiLCAxMSk7CisKKyAgRVhQRUNUX0VRKDExLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApLmJiKCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgTXV0YWJsZVJlcGVhdGVkTWVzc2FnZSkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBSZWZsZWN0aW9uKiBuZXN0ZWRfcmVmbGVjdGlvbiA9CisgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCkuR2V0UmVmbGVjdGlvbigpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbmVzdGVkX2JiID0KKyAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKAorICAgICAgICAgICJiYiIpOworCisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxMik7CisKKyAgTWVzc2FnZSogbmVzdGVkID0gcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZSgKKyAgICAgICZtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLCAwKTsKKyAgRVhQRUNUX0VRKDEyLCBuZXN0ZWRfcmVmbGVjdGlvbi0+R2V0SW50MzIoKm5lc3RlZCwgbmVzdGVkX2JiKSk7CisgIG5lc3RlZF9yZWZsZWN0aW9uLT5TZXRJbnQzMihuZXN0ZWQsIG5lc3RlZF9iYiwgMTMpOworICBFWFBFQ1RfRVEoMTMsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBBZGRBbGxvY2F0ZWRNZXNzYWdlKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogbmVzdGVkID0KKyAgICAgIG5ldyB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKCk7CisgIG5lc3RlZC0+c2V0X2JiKDExKTsKKyAgcmVmbGVjdGlvbi0+QWRkQWxsb2NhdGVkTWVzc2FnZSgmbWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWQpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplKCkpOworICBFWFBFQ1RfRVEoMTEsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBMaXN0RmllbGRzT25lT2YpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlNldE9uZW9mMSgmbWVzc2FnZSk7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZSwgJmZpZWxkcyk7CisgIEVYUEVDVF9FUSg0LCBmaWVsZHMuc2l6ZSgpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIE9uZW9mKSB7CisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIC8vIENoZWNrIGRlZmF1bHQgdmFsdWVzLgorICBFWFBFQ1RfRVEoCisgICAgICAwLCByZWZsZWN0aW9uLT5HZXRJbnQzMihtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19pbnQiKSkpOworICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fc3RyaW5nIikpKTsKKyAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fY29yZCIpKSk7CisgIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19zdHJpbmdfcGllY2UiKSkpOworICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fYnl0ZXMiKSkpOworICBFWFBFQ1RfRVEoCisgICAgICB1bml0dGVzdDo6VGVzdE9uZW9mMjo6Rk9PLAorICAgICAgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19lbnVtIikpCisgICAgICAgICAgLT5udW1iZXIoKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OlRlc3RPbmVvZjI6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX21lc3NhZ2UiKSkpOworICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpUZXN0T25lb2YyOjpGb29Hcm91cDo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vZ3JvdXAiKSkpOworICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpUZXN0T25lb2YyOjpGb29Hcm91cDo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbGF6eV9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgNSwgcmVmbGVjdGlvbi0+R2V0SW50MzIobWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfaW50IikpKTsKKyAgRVhQRUNUX0VRKCJTVFJJTkciLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX3N0cmluZyIpKSk7CisgIEVYUEVDVF9FUSgiQ09SRCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX2NvcmQiKSkpOworICBFWFBFQ1RfRVEoIlNQSUVDRSIsCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0VRKCJCWVRFUyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9ieXRlcyIpKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpCQVIsCisgICAgICByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX2VudW0iKSkKKyAgICAgICAgICAtPm51bWJlcigpKTsKKworICAvLyBDaGVjayBTZXQgZnVuY3Rpb25zLgorICByZWZsZWN0aW9uLT5TZXRJbnQzMigmbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29faW50IiksIDEyMyk7CisgIEVYUEVDVF9FUSgxMjMsIHJlZmxlY3Rpb24tPkdldEludDMyKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2ludCIpKSk7CisgIHJlZmxlY3Rpb24tPlNldFN0cmluZygmbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fc3RyaW5nIiksCisgICAgICAgICAgICAgICAgICAgICAgICAiYWJjIik7CisgIEVYUEVDVF9FUSgiYWJjIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19zdHJpbmciKSkpOworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcoJm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2J5dGVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMiKTsKKyAgRVhQRUNUX0VRKCJieXRlcyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19ieXRlcyIpKSk7CisgIHJlZmxlY3Rpb24tPlNldFN0cmluZygmbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfY29yZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5nZV9jb3JkIik7CisgIEVYUEVDVF9FUSgKKyAgICAgICJjaGFuZ2VfY29yZCIsCisgICAgICByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfY29yZCIpKSk7CisgIHJlZmxlY3Rpb24tPlNldFN0cmluZygmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX3N0cmluZ19waWVjZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5nZV9zcGllY2UiKTsKKyAgRVhQRUNUX0VRKCJjaGFuZ2Vfc3BpZWNlIiwKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgICAgICAgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9zdHJpbmdfcGllY2UiKSkpOworCisgIG1lc3NhZ2UuY2xlYXJfZm9vKCk7CisgIG1lc3NhZ2UuY2xlYXJfYmFyKCk7CisgIFRlc3RVdGlsOjpFeHBlY3RPbmVvZkNsZWFyKG1lc3NhZ2UpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU2V0QWxsb2NhdGVkT25lb2ZNZXNzYWdlVGVzdCkgeworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBmcm9tX21lc3NhZ2UxOworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBmcm9tX21lc3NhZ2UyOworICB1bml0dGVzdDo6VGVzdE9uZW9mMiB0b19tZXNzYWdlOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OmRlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IHRvX21lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIE1lc3NhZ2UqIHJlbGVhc2VkID0gcmVmbGVjdGlvbi0+UmVsZWFzZU1lc3NhZ2UoCisgICAgICAmdG9fbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbGF6eV9tZXNzYWdlIikpOworICBFWFBFQ1RfVFJVRShyZWxlYXNlZCA9PSBudWxscHRyKTsKKyAgcmVsZWFzZWQgPSByZWZsZWN0aW9uLT5SZWxlYXNlTWVzc2FnZSgKKyAgICAgICZ0b19tZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19tZXNzYWdlIikpOworICBFWFBFQ1RfVFJVRShyZWxlYXNlZCA9PSBudWxscHRyKTsKKworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6U2V0T25lb2ZWaWFSZWZsZWN0aW9uKCZmcm9tX21lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkV4cGVjdE9uZW9mU2V0VmlhUmVmbGVjdGlvbihmcm9tX21lc3NhZ2UxKTsKKworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6CisgICAgICBTZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKCZmcm9tX21lc3NhZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9fbWVzc2FnZSk7CisgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgKKyAgICAgIHRvX21lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2xhenlfbWVzc2FnZSIpKTsKKyAgKHZvaWQpc3ViX21lc3NhZ2U7ICAvLyB1bnVzZWQgaW4gc29tY2UgY29uZmlndXJhdGlvbnMKKyAgcmVsZWFzZWQgPSByZWZsZWN0aW9uLT5SZWxlYXNlTWVzc2FnZSgKKyAgICAgICZ0b19tZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9UUlVFKHJlbGVhc2VkICE9IG51bGxwdHIpOworICBFWFBFQ1RfRVEoJnN1Yl9tZXNzYWdlLCByZWxlYXNlZCk7CisgIGRlbGV0ZSByZWxlYXNlZDsKKworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6U2V0T25lb2ZWaWFSZWZsZWN0aW9uKCZmcm9tX21lc3NhZ2UyKTsKKworICByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZSgmZnJvbV9tZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbWVzc2FnZSIpKTsKKworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6CisgICAgICBTZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKCZmcm9tX21lc3NhZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9fbWVzc2FnZSk7CisKKyAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UyID0gcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgKKyAgICAgIHRvX21lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX21lc3NhZ2UiKSk7CisgICh2b2lkKXN1Yl9tZXNzYWdlMjsgIC8vIHVudXNlZCBpbiBzb21jZSBjb25maWd1cmF0aW9ucworICByZWxlYXNlZCA9IHJlZmxlY3Rpb24tPlJlbGVhc2VNZXNzYWdlKAorICAgICAgJnRvX21lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX21lc3NhZ2UiKSk7CisgIEVYUEVDVF9UUlVFKHJlbGVhc2VkICE9IG51bGxwdHIpOworICBFWFBFQ1RfRVEoJnN1Yl9tZXNzYWdlMiwgcmVsZWFzZWQpOworICBkZWxldGUgcmVsZWFzZWQ7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTZXRBbGxvY2F0ZWRPbmVvZk1lc3NhZ2VPbkFyZW5hVGVzdCkgeworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBmcm9tX21lc3NhZ2UxOworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBmcm9tX21lc3NhZ2UyOworICBBcmVuYSBhcmVuYTsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIqIHRvX21lc3NhZ2UgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RPbmVvZjI+KCZhcmVuYSk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSB1bml0dGVzdDo6VGVzdE9uZW9mMjo6ZGVzY3JpcHRvcigpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gdG9fbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworCisgIE1lc3NhZ2UqIHJlbGVhc2VkID0gcmVmbGVjdGlvbi0+UmVsZWFzZU1lc3NhZ2UoCisgICAgICB0b19tZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9UUlVFKHJlbGVhc2VkID09IG51bGxwdHIpOworICByZWxlYXNlZCA9IHJlZmxlY3Rpb24tPlJlbGVhc2VNZXNzYWdlKAorICAgICAgdG9fbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbWVzc2FnZSIpKTsKKyAgRVhQRUNUX1RSVUUocmVsZWFzZWQgPT0gbnVsbHB0cik7CisKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlNldE9uZW9mVmlhUmVmbGVjdGlvbigmZnJvbV9tZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpFeHBlY3RPbmVvZlNldFZpYVJlZmxlY3Rpb24oZnJvbV9tZXNzYWdlMSk7CisKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OgorICAgICAgU2V0QWxsb2NhdGVkT3B0aW9uYWxNZXNzYWdlRmllbGRzVG9NZXNzYWdlVmlhUmVmbGVjdGlvbigmZnJvbV9tZXNzYWdlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fbWVzc2FnZSk7CisgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgKKyAgICAgICp0b19tZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSk7CisgIHJlbGVhc2VkID0gcmVmbGVjdGlvbi0+UmVsZWFzZU1lc3NhZ2UoCisgICAgICB0b19tZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9UUlVFKHJlbGVhc2VkICE9IG51bGxwdHIpOworICAvLyBTaW5jZSBzdWJfbWVzc2FnZSBpcyBhcmVuYSBhbGxvY2F0ZWQsIHJlbGVhc2luZyBpdCByZXN1bHRzIGluIGNvcHlpbmcgaXQKKyAgLy8gaW50byBuZXcgaGVhcC1hbGxvY2F0ZWQgbWVtb3J5LgorICBFWFBFQ1RfTkUoJnN1Yl9tZXNzYWdlLCByZWxlYXNlZCk7CisgIGRlbGV0ZSByZWxlYXNlZDsKKworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6U2V0T25lb2ZWaWFSZWZsZWN0aW9uKCZmcm9tX21lc3NhZ2UyKTsKKworICByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZSgmZnJvbV9tZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbWVzc2FnZSIpKTsKKworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6CisgICAgICBTZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKCZmcm9tX21lc3NhZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19tZXNzYWdlKTsKKworICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZTIgPSByZWZsZWN0aW9uLT5HZXRNZXNzYWdlKAorICAgICAgKnRvX21lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX21lc3NhZ2UiKSk7CisgIHJlbGVhc2VkID0gcmVmbGVjdGlvbi0+UmVsZWFzZU1lc3NhZ2UoCisgICAgICB0b19tZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19tZXNzYWdlIikpOworICBFWFBFQ1RfVFJVRShyZWxlYXNlZCAhPSBudWxscHRyKTsKKyAgLy8gU2luY2Ugc3ViX21lc3NhZ2UyIGlzIGFyZW5hIGFsbG9jYXRlZCwgcmVsZWFzaW5nIGl0IHJlc3VsdHMgaW4gY29weWluZyBpdAorICAvLyBpbnRvIG5ldyBoZWFwLWFsbG9jYXRlZCBtZW1vcnkuCisgIEVYUEVDVF9ORSgmc3ViX21lc3NhZ2UyLCByZWxlYXNlZCk7CisgIGRlbGV0ZSByZWxlYXNlZDsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFJlbGVhc2VNZXNzYWdlVGVzdCkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpKTsKKworICAvLyBXaGVuIG5vdGhpbmcgaXMgc2V0LCB3ZSBleHBlY3QgYWxsIHJlbGVhc2VkIG1lc3NhZ2VzIHRvIGJlIG51bGxwdHIuCisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgJm1lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpJU19OVUxMKTsKKworICAvLyBBZnRlciBmaWVsZHMgYXJlIHNldCB3ZSBzaG91bGQgZ2V0IG5vbi1udWxscHRyIHJlbGVhc2VzLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCisgICAgICAmbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok5PVF9OVUxMKTsKKworICAvLyBBZnRlciBDbGVhcigpIHdlIG1heSBvciBtYXkgbm90IGdldCBhIG1lc3NhZ2UgZnJvbSBSZWxlYXNlTWVzc2FnZSgpLgorICAvLyBUaGlzIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKKyAgbWVzc2FnZS5DbGVhcigpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICZtZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6Q0FOX0JFX05VTEwpOworCisgIC8vIFRlc3QgYSBkaWZmZXJlbnQgY29kZSBwYXRoIGZvciBzZXR0aW5nIGFmdGVyIHJlbGVhc2luZy4KKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBSZWxlYXNlRXh0ZW5zaW9uTWVzc2FnZVRlc3QpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCkpOworCisgIC8vIFdoZW4gbm90aGluZyBpcyBzZXQsIHdlIGV4cGVjdCBhbGwgcmVsZWFzZWQgbWVzc2FnZXMgdG8gYmUgbnVsbHB0ci4KKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCisgICAgICAmbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OklTX05VTEwpOworCisgIC8vIEFmdGVyIGZpZWxkcyBhcmUgc2V0IHdlIHNob3VsZCBnZXQgbm9uLW51bGxwdHIgcmVsZWFzZXMuCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICZtZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6Tk9UX05VTEwpOworCisgIC8vIEFmdGVyIENsZWFyKCkgd2UgbWF5IG9yIG1heSBub3QgZ2V0IGEgbWVzc2FnZSBmcm9tIFJlbGVhc2VNZXNzYWdlKCkuCisgIC8vIFRoaXMgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworICBtZXNzYWdlLkNsZWFyKCk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgJm1lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpDQU5fQkVfTlVMTCk7CisKKyAgLy8gVGVzdCBhIGRpZmZlcmVudCBjb2RlIHBhdGggZm9yIHNldHRpbmcgYWZ0ZXIgcmVsZWFzaW5nLgorICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgUmVsZWFzZU9uZW9mTWVzc2FnZVRlc3QpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlNldE9uZW9mVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpkZXNjcmlwdG9yKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5HZXRNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbGF6eV9tZXNzYWdlIikpOworICAodm9pZClzdWJfbWVzc2FnZTsgIC8vIHVudXNlZCBpbiBzb21jZSBjb25maWd1cmF0aW9ucworICBNZXNzYWdlKiByZWxlYXNlZCA9IHJlZmxlY3Rpb24tPlJlbGVhc2VNZXNzYWdlKAorICAgICAgJm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2xhenlfbWVzc2FnZSIpKTsKKworICBFWFBFQ1RfVFJVRShyZWxlYXNlZCAhPSBudWxscHRyKTsKKyAgRVhQRUNUX0VRKCZzdWJfbWVzc2FnZSwgcmVsZWFzZWQpOworICBkZWxldGUgcmVsZWFzZWQ7CisKKyAgcmVsZWFzZWQgPSByZWZsZWN0aW9uLT5SZWxlYXNlTWVzc2FnZSgKKyAgICAgICZtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9UUlVFKHJlbGVhc2VkID09IG51bGxwdHIpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgQXJlbmFSZWxlYXNlTWVzc2FnZVRlc3QpIHsKKyAgQXJlbmEgYXJlbmE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlcz4oJmFyZW5hKTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCisgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCkpOworCisgIC8vIFdoZW4gbm90aGluZyBpcyBzZXQsIHdlIGV4cGVjdCBhbGwgcmVsZWFzZWQgbWVzc2FnZXMgdG8gYmUgbnVsbHB0ci4KKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCisgICAgICBtZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6SVNfTlVMTCk7CisKKyAgLy8gQWZ0ZXIgZmllbGRzIGFyZSBzZXQgd2Ugc2hvdWxkIGdldCBub24tbnVsbHB0ciByZWxlYXNlcy4KKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCisgICAgICBtZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6Tk9UX05VTEwpOworCisgIC8vIEFmdGVyIENsZWFyKCkgd2UgbWF5IG9yIG1heSBub3QgZ2V0IGEgbWVzc2FnZSBmcm9tIFJlbGVhc2VNZXNzYWdlKCkuCisgIC8vIFRoaXMgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24obWVzc2FnZSk7CisgIG1lc3NhZ2UtPkNsZWFyKCk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkNBTl9CRV9OVUxMKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIEFyZW5hUmVsZWFzZUV4dGVuc2lvbk1lc3NhZ2VUZXN0KSB7CisgIEFyZW5hIGFyZW5hOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmEpOworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKKyAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVzY3JpcHRvcigpKTsKKworICAvLyBXaGVuIG5vdGhpbmcgaXMgc2V0LCB3ZSBleHBlY3QgYWxsIHJlbGVhc2VkIG1lc3NhZ2VzIHRvIGJlIG51bGxwdHIuCisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OklTX05VTEwpOworCisgIC8vIEFmdGVyIGZpZWxkcyBhcmUgc2V0IHdlIHNob3VsZCBnZXQgbm9uLW51bGxwdHIgcmVsZWFzZXMuCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24obWVzc2FnZSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok5PVF9OVUxMKTsKKworICAvLyBBZnRlciBDbGVhcigpIHdlIG1heSBvciBtYXkgbm90IGdldCBhIG1lc3NhZ2UgZnJvbSBSZWxlYXNlTWVzc2FnZSgpLgorICAvLyBUaGlzIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOworICBtZXNzYWdlLT5DbGVhcigpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgIG1lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpDQU5fQkVfTlVMTCk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBBcmVuYVJlbGVhc2VPbmVvZk1lc3NhZ2VUZXN0KSB7CisgIEFyZW5hIGFyZW5hOworICB1bml0dGVzdDo6VGVzdE9uZW9mMiogbWVzc2FnZSA9CisgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdE9uZW9mMj4oJmFyZW5hKTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlNldE9uZW9mVmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKKworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OmRlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgTWVzc2FnZSogcmVsZWFzZWQgPSByZWZsZWN0aW9uLT5SZWxlYXNlTWVzc2FnZSgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2xhenlfbWVzc2FnZSIpKTsKKworICBFWFBFQ1RfVFJVRShyZWxlYXNlZCAhPSBudWxscHRyKTsKKyAgZGVsZXRlIHJlbGVhc2VkOworCisgIHJlbGVhc2VkID0gcmVmbGVjdGlvbi0+UmVsZWFzZU1lc3NhZ2UoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9UUlVFKHJlbGVhc2VkID09IG51bGxwdHIpOworfQorCisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFVzYWdlRXJyb3JzKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisKKyNkZWZpbmUgZihOQU1FKSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoTkFNRSkKKworICAvLyBUZXN0aW5nIGV2ZXJ5IHNpbmdsZSBmYWlsdXJlIG1vZGUgd291bGQgYmUgdG9vIG11Y2ggd29yay4gIExldCdzIGp1c3QKKyAgLy8gY2hlY2sgYSBmZXcuCisgIEVYUEVDVF9ERUFUSCgKKyAgICAgIHJlZmxlY3Rpb24tPkdldEludDMyKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDY0IikpLAorICAgICAgIlByb3RvY29sIEJ1ZmZlciByZWZsZWN0aW9uIHVzYWdlIGVycm9yOlxuIgorICAgICAgIiAgTWV0aG9kICAgICAgOiBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uOjpHZXRJbnQzMlxuIgorICAgICAgIiAgTWVzc2FnZSB0eXBlOiBwcm90b2J1Zl91bml0dGVzdFxcLlRlc3RBbGxUeXBlc1xuIgorICAgICAgIiAgRmllbGQgICAgICAgOiBwcm90b2J1Zl91bml0dGVzdFxcLlRlc3RBbGxUeXBlc1xcLm9wdGlvbmFsX2ludDY0XG4iCisgICAgICAiICBQcm9ibGVtICAgICA6IEZpZWxkIGlzIG5vdCB0aGUgcmlnaHQgdHlwZSBmb3IgdGhpcyBtZXNzYWdlOlxuIgorICAgICAgIiAgICBFeHBlY3RlZCAgOiBDUFBUWVBFX0lOVDMyXG4iCisgICAgICAiICAgIEZpZWxkIHR5cGU6IENQUFRZUEVfSU5UNjQiKTsKKyAgRVhQRUNUX0RFQVRIKHJlZmxlY3Rpb24tPkdldEludDMyKAorICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfaW50MzIiKSksCisgICAgICAgICAgICAgICAiUHJvdG9jb2wgQnVmZmVyIHJlZmxlY3Rpb24gdXNhZ2UgZXJyb3I6XG4iCisgICAgICAgICAgICAgICAiICBNZXRob2QgICAgICA6IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb246OkdldEludDMyXG4iCisgICAgICAgICAgICAgICAiICBNZXNzYWdlIHR5cGU6IHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1xuIgorICAgICAgICAgICAgICAgIiAgRmllbGQgICAgICAgOiBwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMucmVwZWF0ZWRfaW50MzJcbiIKKyAgICAgICAgICAgICAgICIgIFByb2JsZW0gICAgIDogRmllbGQgaXMgcmVwZWF0ZWQ7IHRoZSBtZXRob2QgcmVxdWlyZXMgYSAiCisgICAgICAgICAgICAgICAic2luZ3VsYXIgZmllbGQuIik7CisgIEVYUEVDVF9ERUFUSCgKKyAgICAgIHJlZmxlY3Rpb24tPkdldEludDMyKAorICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgiYyIpKSwKKyAgICAgICJQcm90b2NvbCBCdWZmZXIgcmVmbGVjdGlvbiB1c2FnZSBlcnJvcjpcbiIKKyAgICAgICIgIE1ldGhvZCAgICAgIDogZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbjo6R2V0SW50MzJcbiIKKyAgICAgICIgIE1lc3NhZ2UgdHlwZTogcHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXG4iCisgICAgICAiICBGaWVsZCAgICAgICA6IHByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25NZXNzYWdlLmNcbiIKKyAgICAgICIgIFByb2JsZW0gICAgIDogRmllbGQgZG9lcyBub3QgbWF0Y2ggbWVzc2FnZSB0eXBlLiIpOworICBFWFBFQ1RfREVBVEgoCisgICAgICByZWZsZWN0aW9uLT5IYXNGaWVsZCgKKyAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoImMiKSksCisgICAgICAiUHJvdG9jb2wgQnVmZmVyIHJlZmxlY3Rpb24gdXNhZ2UgZXJyb3I6XG4iCisgICAgICAiICBNZXRob2QgICAgICA6IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb246Okhhc0ZpZWxkXG4iCisgICAgICAiICBNZXNzYWdlIHR5cGU6IHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1xuIgorICAgICAgIiAgRmllbGQgICAgICAgOiBwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduTWVzc2FnZS5jXG4iCisgICAgICAiICBQcm9ibGVtICAgICA6IEZpZWxkIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsKKworI3VuZGVmIGYKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorCisKK3VzaW5nIGludGVybmFsOjpJc0Rlc2NlbmRhbnQ7CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24sIElzRGVzY2VuZGFudE1lc3NhZ2UpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxLCBtc2cyOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cxKTsKKyAgbXNnMiA9IG1zZzE7CisKKyAgRVhQRUNUX1RSVUUoSXNEZXNjZW5kYW50KG1zZzEsIG1zZzEub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSkpOworICBFWFBFQ1RfVFJVRShJc0Rlc2NlbmRhbnQobXNnMSwgbXNnMS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkpKTsKKworICBFWFBFQ1RfRkFMU0UoSXNEZXNjZW5kYW50KG1zZzEsIG1zZzIub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSkpOworICBFWFBFQ1RfRkFMU0UoSXNEZXNjZW5kYW50KG1zZzEsIG1zZzIucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24sIElzRGVzY2VuZGFudE1hcCkgeworICB1bml0dGVzdDo6VGVzdE1hcCBtc2cxLCBtc2cyOworICAoKm1zZzEubXV0YWJsZV9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKCkpWzBdLnNldF9jKDEwMCk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJigqbXNnMS5tdXRhYmxlX21hcF9pbnQzMl9hbGxfdHlwZXMoKSlbMF0pOworICBtc2cyID0gbXNnMTsKKworICBFWFBFQ1RfVFJVRShJc0Rlc2NlbmRhbnQobXNnMSwgbXNnMS5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKCkuYXQoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSXNEZXNjZW5kYW50KG1zZzEsIG1zZzEubWFwX2ludDMyX2FsbF90eXBlcygpLmF0KDApKSk7CisKKyAgRVhQRUNUX0ZBTFNFKElzRGVzY2VuZGFudChtc2cxLCBtc2cyLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKS5hdCgwKSkpOworICBFWFBFQ1RfRkFMU0UoSXNEZXNjZW5kYW50KG1zZzEsIG1zZzIubWFwX2ludDMyX2FsbF90eXBlcygpLmF0KDApKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24sIElzRGVzY2VuZGFudEV4dGVuc2lvbikgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbXNnMSwgbXNnMjsKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1zZzEpOworICBtc2cyID0gbXNnMTsKKworICBFWFBFQ1RfVFJVRShJc0Rlc2NlbmRhbnQoCisgICAgICBtc2cxLCBtc2cxLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSkpOworICBFWFBFQ1RfVFJVRShJc0Rlc2NlbmRhbnQoCisgICAgICBtc2cxLAorICAgICAgbXNnMS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sIDApKSk7CisKKyAgRVhQRUNUX0ZBTFNFKElzRGVzY2VuZGFudCgKKyAgICAgIG1zZzEsIG1zZzIuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pKSk7CisgIEVYUEVDVF9GQUxTRShJc0Rlc2NlbmRhbnQoCisgICAgICBtc2cxLAorICAgICAgbXNnMi5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sIDApKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24sIElzRGVzY2VuZGFudE9uZW9mKSB7CisgIHVuaXR0ZXN0OjpUZXN0T25lb2YgbXNnMSwgbXNnMjsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcyhtc2cxLm11dGFibGVfZm9vX21lc3NhZ2UoKSk7CisgIG1zZzIgPSBtc2cxOworCisgIEVYUEVDVF9UUlVFKElzRGVzY2VuZGFudChtc2cxLCBtc2cxLmZvb19tZXNzYWdlKCkub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIElzRGVzY2VuZGFudChtc2cxLCBtc2cxLmZvb19tZXNzYWdlKCkucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApKSk7CisKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgSXNEZXNjZW5kYW50KG1zZzEsIG1zZzIuZm9vX21lc3NhZ2UoKS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKSk7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIElzRGVzY2VuZGFudChtc2cxLCBtc2cyLmZvb19tZXNzYWdlKCkucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfZGVjbC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2RlY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWJiMWRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2RlY2wuaApAQCAtMCwwICsxLDMxMiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoaXMgZmlsZSBjb250YWlucyBkZWNsYXJhdGlvbnMgbmVlZGVkIGluIGdlbmVyYXRlZCBoZWFkZXJzIGZvciBtZXNzYWdlcworLy8gdGhhdCB1c2UgdGFpbC1jYWxsIHRhYmxlIHBhcnNpbmcuIEV2ZXJ5dGhpbmcgaW4gdGhpcyBmaWxlIGlzIGZvciBpbnRlcm5hbAorLy8gdXNlIG9ubHkuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX1RDVEFCTEVfREVDTF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX1RDVEFCTEVfREVDTF9IX18KKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcGFyc2VfY29udGV4dC5oPgorCisvLyBNdXN0IGNvbWUgbGFzdDoKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZmllbGQ6CitzdHJ1Y3QgVGNGaWVsZERhdGEgeworICBjb25zdGV4cHIgVGNGaWVsZERhdGEoKSA6IGRhdGEoMCkge30KKworICAvLyBGYXN0IHRhYmxlIGVudHJ5IGNvbnN0cnVjdG9yOgorICBjb25zdGV4cHIgVGNGaWVsZERhdGEodWludDE2X3QgY29kZWRfdGFnLCB1aW50OF90IGhhc2JpdF9pZHgsIHVpbnQ4X3QgYXV4X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCkKKyAgICAgIDogZGF0YSh1aW50NjRfdHtvZmZzZXR9IDw8IDQ4IHwgICAgICAvLworICAgICAgICAgICAgIHVpbnQ2NF90e2F1eF9pZHh9IDw8IDI0IHwgICAgIC8vCisgICAgICAgICAgICAgdWludDY0X3R7aGFzYml0X2lkeH0gPDwgMTYgfCAgLy8KKyAgICAgICAgICAgICB1aW50NjRfdHtjb2RlZF90YWd9KSB7fQorCisgIC8vIEZpZWxkcyB1c2VkIGluIGZhc3QgdGFibGUgcGFyc2luZzoKKyAgLy8KKyAgLy8gICAgIEJpdDoKKyAgLy8gICAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKworICAvLyAgICAgfDYzICAgIC4uICAgICAzMnwzMSAgICAgLi4gICAgIDB8CisgIC8vICAgICArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKyAgLy8gICAgIDogICAuICAgOiAgIC4gICA6ICAgLiAxNnw9PT09PT09fCBbMTZdIGNvZGVkX3RhZygpCisgIC8vICAgICA6ICAgLiAgIDogICAuICAgOiAyNHw9PT18ICAgLiAgIDogWyA4XSBoYXNiaXRfaWR4KCkKKyAgLy8gICAgIDogICAuICAgOiAgIC4gMzJ8PT09fCAgIDogICAuICAgOiBbIDhdIGF1eF9pZHgoKQorICAvLyAgICAgOiAgIC4gNDg6LS0tLi0tLTogICAuICAgOiAgIC4gICA6IFsxNl0gKHVudXNlZCkKKyAgLy8gICAgIHw9PT09PT09fCAgIC4gICA6ICAgLiAgIDogICAuICAgOiBbMTZdIG9mZnNldCgpCisgIC8vICAgICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgLy8gICAgIHw2MyAgICAuLiAgICAgMzJ8MzEgICAgIC4uICAgICAwfAorICAvLyAgICAgKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFRhZ1R5cGUgPSB1aW50MTZfdD4KKyAgVGFnVHlwZSBjb2RlZF90YWcoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRhZ1R5cGU+KGRhdGEpOworICB9CisgIHVpbnQ4X3QgaGFzYml0X2lkeCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRhdGEgPj4gMTYpOyB9CisgIHVpbnQ4X3QgYXV4X2lkeCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRhdGEgPj4gMjQpOyB9CisgIHVpbnQxNl90IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNl90PihkYXRhID4+IDQ4KTsgfQorCisgIC8vIEZpZWxkcyB1c2VkIGluIG1pbmkgdGFibGUgcGFyc2luZzoKKyAgLy8KKyAgLy8gICAgIEJpdDoKKyAgLy8gICAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKworICAvLyAgICAgfDYzICAgIC4uICAgICAzMnwzMSAgICAgLi4gICAgIDB8CisgIC8vICAgICArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKyAgLy8gICAgIDogICAuICAgOiAgIC4gICB8PT09PT09PT09PT09PT09fCBbMzJdIHRhZygpIChkZWNvZGVkKQorICAvLyAgICAgfD09PT09PT09PT09PT09PXwgICAuICAgOiAgIC4gICA6IFszMl0gZW50cnlfb2Zmc2V0KCkKKyAgLy8gICAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKworICAvLyAgICAgfDYzICAgIC4uICAgICAzMnwzMSAgICAgLi4gICAgIDB8CisgIC8vICAgICArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKworICB1aW50MzJfdCB0YWcoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGF0YSk7IH0KKyAgdWludDMyX3QgZW50cnlfb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRhdGEgPj4gMzIpOyB9CisKKyAgdWludDY0X3QgZGF0YTsKK307CisKK3N0cnVjdCBUY1BhcnNlVGFibGVCYXNlOworCisvLyBUYWlsQ2FsbFBhcnNlRnVuYyBpcyB0aGUgZnVuY3Rpb24gcG9pbnRlciB0eXBlIHVzZWQgaW4gdGhlIHRhaWxjYWxsIHRhYmxlLgordHlwZWRlZiBjb25zdCBjaGFyKiAoKlRhaWxDYWxsUGFyc2VGdW5jKShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKworbmFtZXNwYWNlIGZpZWxkX2xheW91dCB7CitzdHJ1Y3QgT2Zmc2V0IHsKKyAgdWludDMyX3Qgb2ZmOworfTsKK30gIC8vIG5hbWVzcGFjZSBmaWVsZF9sYXlvdXQKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9XSU42NCkKKyNwcmFnbWEgd2FybmluZyhwdXNoKQorLy8gVGNQYXJzZVRhYmxlQmFzZSBpcyBpbnRlbnRpb25hbGx5IG92ZXJhbGlnbmVkIG9uIDMyIGJpdCB0YXJnZXRzLgorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MzI0KQorI2VuZGlmCisKKy8vIEJhc2UgY2xhc3MgZm9yIG1lc3NhZ2UtbGV2ZWwgdGFibGUgd2l0aCBpbmZvIGZvciB0aGUgdGFpbC1jYWxsIHBhcnNlci4KK3N0cnVjdCBhbGlnbmFzKHVpbnQ2NF90KSBUY1BhcnNlVGFibGVCYXNlIHsKKyAgLy8gQ29tbW9uIGF0dHJpYnV0ZXMgZm9yIG1lc3NhZ2UgbGF5b3V0OgorICB1aW50MTZfdCBoYXNfYml0c19vZmZzZXQ7CisgIHVpbnQxNl90IGV4dGVuc2lvbl9vZmZzZXQ7CisgIHVpbnQzMl90IGV4dGVuc2lvbl9yYW5nZV9sb3c7CisgIHVpbnQzMl90IGV4dGVuc2lvbl9yYW5nZV9oaWdoOworICB1aW50MzJfdCBtYXhfZmllbGRfbnVtYmVyOworICB1aW50OF90IGZhc3RfaWR4X21hc2s7CisgIHVpbnQxNl90IGxvb2t1cF90YWJsZV9vZmZzZXQ7CisgIHVpbnQzMl90IHNraXBtYXAzMjsKKyAgdWludDMyX3QgZmllbGRfZW50cmllc19vZmZzZXQ7CisgIHVpbnQxNl90IG51bV9maWVsZF9lbnRyaWVzOworCisgIHVpbnQxNl90IG51bV9hdXhfZW50cmllczsKKyAgdWludDMyX3QgYXV4X29mZnNldDsKKworICBjb25zdCBNZXNzYWdlTGl0ZSogZGVmYXVsdF9pbnN0YW5jZTsKKworICAvLyBIYW5kbGVyIGZvciBmaWVsZHMgd2hpY2ggYXJlIG5vdCBoYW5kbGVkIGJ5IHRhYmxlIGRpc3BhdGNoLgorICBUYWlsQ2FsbFBhcnNlRnVuYyBmYWxsYmFjazsKKworICAvLyBUaGlzIGNvbnN0cnVjdG9yIGV4YWN0bHkgZm9sbG93cyB0aGUgZmllbGQgbGF5b3V0LCBzbyBpdCdzIHRlY2huaWNhbGx5CisgIC8vIG5vdCBuZWNlc3NhcnkuICBIb3dldmVyLCBpdCBtYWtlcyBpdCBtdWNoIG11Y2ggZWFzaWVyIHRvIGFkZCBvciByZS1hcnJhbmdlCisgIC8vIGZpZWxkcywgYmVjYXVzZSBpdCBjYW4gYmUgb3ZlcmxvYWRlZCB3aXRoIGFuIGFkZGl0aW9uYWwgY29uc3RydWN0b3IsCisgIC8vIHRlbXBvcmFyaWx5IGFsbG93aW5nIGJvdGggb2xkIGFuZCBuZXcgcHJvdG9jb2wgYnVmZmVyIGhlYWRlcnMgdG8gYmUKKyAgLy8gY29tcGlsZWQuCisgIGNvbnN0ZXhwciBUY1BhcnNlVGFibGVCYXNlKAorICAgICAgdWludDE2X3QgaGFzX2JpdHNfb2Zmc2V0LCB1aW50MTZfdCBleHRlbnNpb25fb2Zmc2V0LAorICAgICAgdWludDMyX3QgZXh0ZW5zaW9uX3JhbmdlX2xvdywgdWludDMyX3QgZXh0ZW5zaW9uX3JhbmdlX2hpZ2gsCisgICAgICB1aW50MzJfdCBtYXhfZmllbGRfbnVtYmVyLCB1aW50OF90IGZhc3RfaWR4X21hc2ssCisgICAgICB1aW50MTZfdCBsb29rdXBfdGFibGVfb2Zmc2V0LCB1aW50MzJfdCBza2lwbWFwMzIsCisgICAgICB1aW50MzJfdCBmaWVsZF9lbnRyaWVzX29mZnNldCwgdWludDE2X3QgbnVtX2ZpZWxkX2VudHJpZXMsCisgICAgICB1aW50MTZfdCBudW1fYXV4X2VudHJpZXMsIHVpbnQzMl90IGF1eF9vZmZzZXQsCisgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogZGVmYXVsdF9pbnN0YW5jZSwgVGFpbENhbGxQYXJzZUZ1bmMgZmFsbGJhY2spCisgICAgICA6IGhhc19iaXRzX29mZnNldChoYXNfYml0c19vZmZzZXQpLAorICAgICAgICBleHRlbnNpb25fb2Zmc2V0KGV4dGVuc2lvbl9vZmZzZXQpLAorICAgICAgICBleHRlbnNpb25fcmFuZ2VfbG93KGV4dGVuc2lvbl9yYW5nZV9sb3cpLAorICAgICAgICBleHRlbnNpb25fcmFuZ2VfaGlnaChleHRlbnNpb25fcmFuZ2VfaGlnaCksCisgICAgICAgIG1heF9maWVsZF9udW1iZXIobWF4X2ZpZWxkX251bWJlciksCisgICAgICAgIGZhc3RfaWR4X21hc2soZmFzdF9pZHhfbWFzayksCisgICAgICAgIGxvb2t1cF90YWJsZV9vZmZzZXQobG9va3VwX3RhYmxlX29mZnNldCksCisgICAgICAgIHNraXBtYXAzMihza2lwbWFwMzIpLAorICAgICAgICBmaWVsZF9lbnRyaWVzX29mZnNldChmaWVsZF9lbnRyaWVzX29mZnNldCksCisgICAgICAgIG51bV9maWVsZF9lbnRyaWVzKG51bV9maWVsZF9lbnRyaWVzKSwKKyAgICAgICAgbnVtX2F1eF9lbnRyaWVzKG51bV9hdXhfZW50cmllcyksCisgICAgICAgIGF1eF9vZmZzZXQoYXV4X29mZnNldCksCisgICAgICAgIGRlZmF1bHRfaW5zdGFuY2UoZGVmYXVsdF9pbnN0YW5jZSksCisgICAgICAgIGZhbGxiYWNrKGZhbGxiYWNrKSB7fQorCisgIC8vIFRhYmxlIGVudHJ5IGZvciBmYXN0LXBhdGggdGFpbGNhbGwgZGlzcGF0Y2ggaGFuZGxpbmcuCisgIHN0cnVjdCBGYXN0RmllbGRFbnRyeSB7CisgICAgLy8gVGFyZ2V0IGZ1bmN0aW9uIGZvciBkaXNwYXRjaDoKKyAgICBUYWlsQ2FsbFBhcnNlRnVuYyB0YXJnZXQ7CisgICAgLy8gRmllbGQgZGF0YSB1c2VkIGR1cmluZyBwYXJzZToKKyAgICBUY0ZpZWxkRGF0YSBiaXRzOworICB9OworICAvLyBUaGVyZSBpcyBhbHdheXMgYXQgbGVhc3Qgb25lIHRhYmxlIGVudHJ5LgorICBjb25zdCBGYXN0RmllbGRFbnRyeSogZmFzdF9lbnRyeShzaXplX3QgaWR4KSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRmFzdEZpZWxkRW50cnkqPih0aGlzICsgMSkgKyBpZHg7CisgIH0KKworICAvLyBSZXR1cm5zIGEgYmVnaW4gaXRlcmF0b3IgKHBvaW50ZXIpIHRvIHRoZSBzdGFydCBvZiB0aGUgZmllbGQgbG9va3VwIHRhYmxlLgorICBjb25zdCB1aW50MTZfdCogZmllbGRfbG9va3VwX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90Kj4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHRoaXMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cF90YWJsZV9vZmZzZXQpOworICB9CisKKyAgLy8gRmllbGQgZW50cnkgZm9yIGFsbCBmaWVsZHMuCisgIHN0cnVjdCBGaWVsZEVudHJ5IHsKKyAgICB1aW50MzJfdCBvZmZzZXQ7ICAgICAvLyBvZmZzZXQgaW4gdGhlIG1lc3NhZ2Ugb2JqZWN0CisgICAgaW50MzJfdCBoYXNfaWR4OyAgICAgLy8gaGFzLWJpdCBpbmRleAorICAgIHVpbnQxNl90IGF1eF9pZHg7ICAgIC8vIGluZGV4IGZvciBgZmllbGRfYXV4YC4KKyAgICB1aW50MTZfdCB0eXBlX2NhcmQ7ICAvLyBgRmllbGRUeXBlYCBhbmQgYENhcmRpbmFsaXR5YCAoc2VlIF9pbXBsLmgpCisgIH07CisKKyAgLy8gUmV0dXJucyBhIGJlZ2luIGl0ZXJhdG9yIChwb2ludGVyKSB0byB0aGUgc3RhcnQgb2YgdGhlIGZpZWxkIGVudHJpZXMgYXJyYXkuCisgIGNvbnN0IEZpZWxkRW50cnkqIGZpZWxkX2VudHJpZXNfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRmllbGRFbnRyeSo+KAorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4odGhpcykgKyBmaWVsZF9lbnRyaWVzX29mZnNldCk7CisgIH0KKworICAvLyBBdXhpbGlhcnkgZW50cmllcyBmb3IgZmllbGQgdHlwZXMgdGhhdCBuZWVkIGV4dHJhIGluZm9ybWF0aW9uLgorICB1bmlvbiBGaWVsZEF1eCB7CisgICAgY29uc3RleHByIEZpZWxkQXV4KCkgOiBtZXNzYWdlX2RlZmF1bHQobnVsbHB0cikge30KKyAgICBjb25zdGV4cHIgRmllbGRBdXgoYm9vbCAoKmVudW1fdmFsaWRhdG9yKShpbnQpKQorICAgICAgICA6IGVudW1fdmFsaWRhdG9yKGVudW1fdmFsaWRhdG9yKSB7fQorICAgIGNvbnN0ZXhwciBGaWVsZEF1eChmaWVsZF9sYXlvdXQ6Ok9mZnNldCBvZmYpIDogb2Zmc2V0KG9mZi5vZmYpIHt9CisgICAgY29uc3RleHByIEZpZWxkQXV4KGludDE2X3QgcmFuZ2Vfc3RhcnQsIHVpbnQxNl90IHJhbmdlX2xlbmd0aCkKKyAgICAgICAgOiBlbnVtX3Jhbmdle3JhbmdlX3N0YXJ0LCByYW5nZV9sZW5ndGh9IHt9CisgICAgY29uc3RleHByIEZpZWxkQXV4KGNvbnN0IE1lc3NhZ2VMaXRlKiBtc2cpIDogbWVzc2FnZV9kZWZhdWx0KG1zZykge30KKyAgICBib29sICgqZW51bV92YWxpZGF0b3IpKGludCk7CisgICAgc3RydWN0IHsKKyAgICAgIGludDE2X3Qgc3RhcnQ7ICAgIC8vIG1pbmltdW0gZW51bSBudW1iZXIgKGlmIGl0IGZpdHMpCisgICAgICB1aW50MTZfdCBsZW5ndGg7ICAvLyBsZW5ndGggb2YgcmFuZ2UgKGkuZS4sIG1heCA9IHN0YXJ0ICsgbGVuZ3RoIC0gMSkKKyAgICB9IGVudW1fcmFuZ2U7CisgICAgdWludDMyX3Qgb2Zmc2V0OworICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBtZXNzYWdlX2RlZmF1bHQ7CisgIH07CisgIGNvbnN0IEZpZWxkQXV4KiBmaWVsZF9hdXgodWludDMyX3QgaWR4KSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRmllbGRBdXgqPihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4odGhpcykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV4X29mZnNldCkgKworICAgICAgICAgICBpZHg7CisgIH0KKyAgY29uc3QgRmllbGRBdXgqIGZpZWxkX2F1eChjb25zdCBGaWVsZEVudHJ5KiBlbnRyeSkgY29uc3QgeworICAgIHJldHVybiBmaWVsZF9hdXgoZW50cnktPmF1eF9pZHgpOworICB9CisKKyAgLy8gRmllbGQgbmFtZSBkYXRhCisgIGNvbnN0IGNoYXIqIG5hbWVfZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHRoaXMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV4X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9hdXhfZW50cmllcyAqIHNpemVvZihGaWVsZEF1eCkpOworICB9Cit9OworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX1dJTjY0KQorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorCitzdGF0aWNfYXNzZXJ0KHNpemVvZihUY1BhcnNlVGFibGVCYXNlOjpGYXN0RmllbGRFbnRyeSkgPD0gMTYsCisgICAgICAgICAgICAgICJGYXN0IGZpZWxkIGVudHJ5IGlzIHRvbyBiaWcuIik7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihUY1BhcnNlVGFibGVCYXNlOjpGaWVsZEVudHJ5KSA8PSAxNiwKKyAgICAgICAgICAgICAgIkZpZWxkIGVudHJ5IGlzIHRvbyBiaWcuIik7CisKK3RlbXBsYXRlIDxzaXplX3Qga0Zhc3RUYWJsZVNpemVMb2cyLCBzaXplX3Qga051bUZpZWxkRW50cmllcyA9IDAsCisgICAgICAgICAgc2l6ZV90IGtOdW1GaWVsZEF1eCA9IDAsIHNpemVfdCBrTmFtZVRhYmxlU2l6ZSA9IDAsCisgICAgICAgICAgc2l6ZV90IGtGaWVsZExvb2t1cFNpemUgPSAyPgorc3RydWN0IFRjUGFyc2VUYWJsZSB7CisgIFRjUGFyc2VUYWJsZUJhc2UgaGVhZGVyOworCisgIC8vIEVudHJpZXMgZm9yIGVhY2ggZmllbGQuCisgIC8vCisgIC8vIEZpZWxkcyBhcmUgaW5kZXhlZCBieSB0aGUgbG93ZXN0IGJpdHMgb2YgdGhlaXIgZmllbGQgbnVtYmVyLiBUaGUgZmllbGQKKyAgLy8gbnVtYmVyIGlzIG1hc2tlZCB0byBmaXQgaW5zaWRlIHRoZSB0YWJsZS4gTm90ZSB0aGF0IHRoZSBwYXJzaW5nIGxvZ2ljCisgIC8vIGdlbmVyYWxseSBjYWxscyBgVGFpbENhbGxQYXJzZVRhYmxlQmFzZTo6ZmFzdF9lbnRyeSgpYCBpbnN0ZWFkIG9mIGFjY2Vzc2luZworICAvLyB0aGlzIGZpZWxkIGRpcmVjdGx5LgorICBzdGQ6OmFycmF5PFRjUGFyc2VUYWJsZUJhc2U6OkZhc3RGaWVsZEVudHJ5LCAoMSA8PCBrRmFzdFRhYmxlU2l6ZUxvZzIpPgorICAgICAgZmFzdF9lbnRyaWVzOworCisgIC8vIEp1c3QgYmlnIGVub3VnaCB0byBmaW5kIGFsbCB0aGUgZmllbGQgZW50cmllcy4KKyAgc3RkOjphcnJheTx1aW50MTZfdCwga0ZpZWxkTG9va3VwU2l6ZT4gZmllbGRfbG9va3VwX3RhYmxlOworICAvLyBFbnRyaWVzIGZvciBhbGwgZmllbGRzOgorICBzdGQ6OmFycmF5PFRjUGFyc2VUYWJsZUJhc2U6OkZpZWxkRW50cnksIGtOdW1GaWVsZEVudHJpZXM+IGZpZWxkX2VudHJpZXM7CisgIHN0ZDo6YXJyYXk8VGNQYXJzZVRhYmxlQmFzZTo6RmllbGRBdXgsIGtOdW1GaWVsZEF1eD4gYXV4X2VudHJpZXM7CisgIHN0ZDo6YXJyYXk8Y2hhciwga05hbWVUYWJsZVNpemU+IGZpZWxkX25hbWVzOworfTsKKworLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbjogaWYgdGhlcmUgYXJlIG5vIGF1eCBlbnRyaWVzLCB0aGVyZSB3aWxsIGJlIG5vIGFycmF5LgorLy8gSW4gQysrLCBhcnJheXMgY2Fubm90IGhhdmUgbGVuZ3RoIDAsIGJ1dCAoQysrMTEpIHN0ZDo6YXJyYXk8VCwgMD4gaXMgdmFsaWQuCisvLyBIb3dldmVyLCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIGhhdmUgZGlmZmVyZW50IHNpemVvZihzdGQ6OmFycmF5PFQsIDA+KS4KKy8vIFNraXBwaW5nIHRoZSBtZW1iZXIgbWFrZXMgb2Zmc2V0IGNvbXB1dGF0aW9ucyBwb3J0YWJsZS4KK3RlbXBsYXRlIDxzaXplX3Qga0Zhc3RUYWJsZVNpemVMb2cyLCBzaXplX3Qga051bUZpZWxkRW50cmllcywKKyAgICAgICAgICBzaXplX3Qga05hbWVUYWJsZVNpemUsIHNpemVfdCBrRmllbGRMb29rdXBTaXplPgorc3RydWN0IFRjUGFyc2VUYWJsZTxrRmFzdFRhYmxlU2l6ZUxvZzIsIGtOdW1GaWVsZEVudHJpZXMsIDAsIGtOYW1lVGFibGVTaXplLAorICAgICAgICAgICAgICAgICAgICBrRmllbGRMb29rdXBTaXplPiB7CisgIFRjUGFyc2VUYWJsZUJhc2UgaGVhZGVyOworICBzdGQ6OmFycmF5PFRjUGFyc2VUYWJsZUJhc2U6OkZhc3RGaWVsZEVudHJ5LCAoMSA8PCBrRmFzdFRhYmxlU2l6ZUxvZzIpPgorICAgICAgZmFzdF9lbnRyaWVzOworICBzdGQ6OmFycmF5PHVpbnQxNl90LCBrRmllbGRMb29rdXBTaXplPiBmaWVsZF9sb29rdXBfdGFibGU7CisgIHN0ZDo6YXJyYXk8VGNQYXJzZVRhYmxlQmFzZTo6RmllbGRFbnRyeSwga051bUZpZWxkRW50cmllcz4gZmllbGRfZW50cmllczsKKyAgc3RkOjphcnJheTxjaGFyLCBrTmFtZVRhYmxlU2l6ZT4gZmllbGRfbmFtZXM7Cit9OworCisvLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uOiBpZiB0aGVyZSBhcmUgbm8gZmllbGRzIGF0IGFsbCwgdGhlbiB3ZSBjYW4gc2F2ZSBzcGFjZQorLy8gYnkgc2tpcHBpbmcgdGhlIGZpZWxkIG51bWJlcnMgYW5kIGVudHJpZXMuCit0ZW1wbGF0ZSA8c2l6ZV90IGtOYW1lVGFibGVTaXplLCBzaXplX3Qga0ZpZWxkTG9va3VwU2l6ZT4KK3N0cnVjdCBUY1BhcnNlVGFibGU8MCwgMCwgMCwga05hbWVUYWJsZVNpemUsIGtGaWVsZExvb2t1cFNpemU+IHsKKyAgVGNQYXJzZVRhYmxlQmFzZSBoZWFkZXI7CisgIC8vIE4uQi46IHRoZSBmYXN0IGVudHJpZXMgYXJlIHNpemVkIGJ5IGxvZzIsIHNvIDIqKjAgZmllbGRzID0gMSBlbnRyeS4KKyAgLy8gVGhlIGZhc3QgcGFyc2luZyBsb29wIHdpbGwgYWx3YXlzIHVzZSB0aGlzIGVudHJ5LCBzbyBpdCBtdXN0IGJlIHByZXNlbnQuCisgIHN0ZDo6YXJyYXk8VGNQYXJzZVRhYmxlQmFzZTo6RmFzdEZpZWxkRW50cnksIDE+IGZhc3RfZW50cmllczsKKyAgc3RkOjphcnJheTx1aW50MTZfdCwga0ZpZWxkTG9va3VwU2l6ZT4gZmllbGRfbG9va3VwX3RhYmxlOworICBzdGQ6OmFycmF5PGNoYXIsIGtOYW1lVGFibGVTaXplPiBmaWVsZF9uYW1lczsKK307CisKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8VGNQYXJzZVRhYmxlPDE+Pjo6dmFsdWUsCisgICAgICAgICAgICAgICJUY1BhcnNlVGFibGUgbXVzdCBiZSBzdGFuZGFyZCBsYXlvdXQuIik7CisKK3N0YXRpY19hc3NlcnQob2Zmc2V0b2YoVGNQYXJzZVRhYmxlPDE+LCBmYXN0X2VudHJpZXMpID09CisgICAgICAgICAgICAgICAgICBzaXplb2YoVGNQYXJzZVRhYmxlQmFzZSksCisgICAgICAgICAgICAgICJUYWJsZSBlbnRyaWVzIG11c3QgYmUgbGFpZCBvdXQgYWZ0ZXIgVGNQYXJzZVRhYmxlQmFzZS4iKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfVENUQUJMRV9ERUNMX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2Z1bGwuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfZnVsbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzdiYjhkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2Z1bGwuY2MKQEAgLTAsMCArMSw1MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxjc3RkaW50PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcGFyc2VfY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKy8vIGNsYW5nLWZvcm1hdCBvbgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6R2VuZXJpY0ZhbGxiYWNrKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgcmV0dXJuIEdlbmVyaWNGYWxsYmFja0ltcGw8TWVzc2FnZSwgVW5rbm93bkZpZWxkU2V0PihQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9pbXBsLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZmE1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfaW1wbC5oCkBAIC0wLDAgKzEsNTUzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfVENUQUJMRV9JTVBMX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfVENUQUJMRV9JTVBMX0hfXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9kZWNsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BhcnNlX2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorCisvLyBNdXN0IGNvbWUgbGFzdDoKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIE1lc3NhZ2U7CitjbGFzcyBVbmtub3duRmllbGRTZXQ7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEZpZWxkIGxheW91dCBlbnVtcy4KKy8vCisvLyBTdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGZpZWxkcyBpcyBwYWNrZWQgaW50byBhIDE2LWJpdCB2YWx1ZS4gVGhlIGVudW0KKy8vIHR5cGVzIGJlbG93IHJlcHJlc2VudCBiaXR3aXNlIGZpZWxkcywgYWxvbmcgd2l0aCB0aGVpciByZXNwZWN0aXZlIHdpZHRocywKKy8vIHNoaWZ0cywgYW5kIG1hc2tzLgorLy8KKy8vICAgICBCaXQ6CisvLyAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8gICAgIHwxNSAgICAgICAgLi4gICAgICAgICAgOHw3ICAgICAgICAgLi4gICAgICAgICAgMHwKKy8vICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyAgICAgOiAgLiAgOiAgLiAgOiAgLiAgOiAgLiAgOiAgLiAgOiAgLiAgOiAzfD09PT09PT09fCBbM10gRmllbGRUeXBlCisvLyAgICAgOiAgICAgOiAgICAgOiAgICAgOiAgICAgOiAgICAgOiA1fD09PT09fCAgOiAgICAgOiBbMl0gRmllbGRDYXJkaW5hbGl0eQorLy8gICAgIDogIC4gIDogIC4gIDogIC4gIDogIC4gOHw9PT09PT09PXwgIDogIC4gIDogIC4gIDogWzNdIEZpZWxkUmVwCisvLyAgICAgOiAgICAgOiAgICAgOiAgIDEwfD09PT09fCAgICAgOiAgICAgOiAgICAgOiAgICAgOiBbMl0gVHJhbnNmb3JtVmFsaWRhdGlvbgorLy8gICAgIDogIC4gIDogIC4xMnw9PT09PXwgIC4gIDogIC4gIDogIC4gIDogIC4gIDogIC4gIDogWzJdIEZvcm1hdERpc2NyaW1pbmF0b3IKKy8vICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyAgICAgfDE1ICAgICAgICAuLiAgICAgICAgICA4fDcgICAgICAgICAuLiAgICAgICAgICAwfAorLy8gICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vCituYW1lc3BhY2UgZmllbGRfbGF5b3V0IHsKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gRmllbGQga2luZCAoMyBiaXRzKToKKy8vIFRoZXNlIHZhbHVlcyBicm9hZGx5IHJlcHJlc2VudCBhIHdpcmUgdHlwZSBhbmQgYW4gaW4tbWVtb3J5IHN0b3JhZ2UgY2xhc3MuCitlbnVtIEZpZWxkS2luZCA6IHVpbnQxNl90IHsKKyAga0ZrU2hpZnQgPSAwLAorICBrRmtCaXRzID0gMywKKyAga0ZrTWFzayA9ICgoMSA8PCBrRmtCaXRzKSAtIDEpIDw8IGtGa1NoaWZ0LAorCisgIGtGa05vbmUgPSAwLAorICBrRmtWYXJpbnQsICAgICAgICAvLyBXVD0wICAgICByZXA9OCwzMiw2NCBiaXRzCisgIGtGa1BhY2tlZFZhcmludCwgIC8vIFdUPTIgICAgIHJlcD04LDMyLDY0IGJpdHMKKyAga0ZrRml4ZWQsICAgICAgICAgLy8gV1Q9MSw1ICAgcmVwPTMyLDY0IGJpdHMKKyAga0ZrUGFja2VkRml4ZWQsICAgLy8gV1Q9MiAgICAgcmVwPTMyLDY0IGJpdHMKKyAga0ZrU3RyaW5nLCAgICAgICAgLy8gV1Q9MiAgICAgcmVwPXZhcmlvdXMKKyAga0ZrTWVzc2FnZSwgICAgICAgLy8gV1Q9MiwzLDQgcmVwPU1lc3NhZ2VMaXRlKgorICAvLyBNYXBzIGFyZSBhIHNwZWNpYWwgY2FzZSBvZiBNZXNzYWdlLCBidXQgdXNlIGRpZmZlcmVudCBwYXJzaW5nIGxvZ2ljLgorICBrRmtNYXAsICAgICAgICAgICAvLyBXVD0yICAgICByZXA9TWFwKExpdGUpPHZhcmlvdXMsIHZhcmlvdXM+Cit9OworCitzdGF0aWNfYXNzZXJ0KGtGa01hcCA8ICgxIDw8IGtGa0JpdHMpLCAidG9vIG1hbnkgdHlwZXMiKTsKKworLy8gQ2FyZGluYWxpdHkgKDIgYml0cyk6CisvLyBUaGVzZSB2YWx1ZXMgZGV0ZXJtaW5lIGhvdyBtYW55IHZhbHVlcyBhIGZpZWxkIGNhbiBoYXZlIGFuZCBpdHMgcHJlc2VuY2UuCisvLyBQYWNrZWQgZmllbGRzIGFyZSByZXByZXNlbnRlZCBpbiBGaWVsZFR5cGUuCitlbnVtIENhcmRpbmFsaXR5IDogdWludDE2X3QgeworICBrRmNTaGlmdCAgICA9IGtGa1NoaWZ0ICsga0ZrQml0cywKKyAga0ZjQml0cyAgICAgPSAyLAorICBrRmNNYXNrICAgICA9ICgoMSA8PCBrRmNCaXRzKSAtIDEpIDw8IGtGY1NoaWZ0LAorCisgIGtGY1Npbmd1bGFyID0gMCwKKyAga0ZjT3B0aW9uYWwgPSAxIDw8IGtGY1NoaWZ0LAorICBrRmNSZXBlYXRlZCA9IDIgPDwga0ZjU2hpZnQsCisgIGtGY09uZW9mICAgID0gMyA8PCBrRmNTaGlmdCwKK307CisKKy8vIEZpZWxkIHJlcHJlc2VudGF0aW9uICgzIGJpdHMpOgorLy8gVGhlc2UgdmFsdWVzIGFyZSB0aGUgc3BlY2lmaWMgcmVmaW5lbWVudHMgb2Ygc3RvcmFnZSBjbGFzc2VzIGluIEZpZWxkVHlwZS4KK2VudW0gRmllbGRSZXAgOiB1aW50MTZfdCB7CisgIGtSZXBTaGlmdCAgICA9IGtGY1NoaWZ0ICsga0ZjQml0cywKKyAga1JlcEJpdHMgICAgID0gMywKKyAga1JlcE1hc2sgICAgID0gKCgxIDw8IGtSZXBCaXRzKSAtIDEpIDw8IGtSZXBTaGlmdCwKKworICAvLyBOdW1lcmljIHR5cGVzICh1c2VkIGZvciBvcHRpb25hbCBhbmQgcmVwZWF0ZWQgZmllbGRzKToKKyAga1JlcDhCaXRzICAgID0gMCwKKyAga1JlcDMyQml0cyAgID0gMiA8PCBrUmVwU2hpZnQsCisgIGtSZXA2NEJpdHMgICA9IDMgPDwga1JlcFNoaWZ0LAorICAvLyBTdHJpbmcgdHlwZXM6CisgIGtSZXBBU3RyaW5nICA9IDAsICAgICAgICAgICAgICAgLy8gQXJlbmFTdHJpbmdQdHIKKyAga1JlcElTdHJpbmcgID0gMSA8PCBrUmVwU2hpZnQsICAvLyBJbmxpbmVkU3RyaW5nCisgIGtSZXBDb3JkICAgICA9IDIgPDwga1JlcFNoaWZ0LCAgLy8gYWJzbDo6Q29yZAorICBrUmVwU1BpZWNlICAgPSAzIDw8IGtSZXBTaGlmdCwgIC8vIFN0cmluZ1BpZWNlRmllbGQKKyAga1JlcFNTdHJpbmcgID0gNCA8PCBrUmVwU2hpZnQsICAvLyBzdGQ6OnN0cmluZyoKKyAgLy8gTWVzc2FnZSB0eXBlcyAoV1Q9MiB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkKToKKyAga1JlcE1lc3NhZ2UgID0gMCwgICAgICAgICAgICAgICAvLyBNZXNzYWdlTGl0ZSoKKyAga1JlcEdyb3VwICAgID0gMSA8PCBrUmVwU2hpZnQsICAvLyBNZXNzYWdlTGl0ZSogKFdUPTMsNCkKKyAga1JlcExhenkgICAgID0gMiA8PCBrUmVwU2hpZnQsICAvLyBMYXp5RmllbGQqCisgIGtSZXBJV2VhayAgICA9IDMgPDwga1JlcFNoaWZ0LCAgLy8gSW1wbGljaXRXZWFrCit9OworCisvLyBUcmFuc2Zvcm0vdmFsaWRhdGlvbiAoMiBiaXRzKToKKy8vIFRoZXNlIHZhbHVlcyBkZXRlcm1pbmUgdHJhbnNmb3JtcyBvciB2YWxpZGF0aW9uIHRvL2Zyb20gd2lyZSBmb3JtYXQuCitlbnVtIFRyYW5zZm9ybVZhbGlkYXRpb24gOiB1aW50MTZfdCB7CisgIGtUdlNoaWZ0ICAgICA9IGtSZXBTaGlmdCArIGtSZXBCaXRzLAorICBrVHZCaXRzICAgICAgPSAyLAorICBrVHZNYXNrICAgICAgPSAoKDEgPDwga1R2Qml0cykgLSAxKSA8PCBrVHZTaGlmdCwKKworICAvLyBWYXJpbnQgZmllbGRzOgorICBrVHZaaWdaYWcgICAgPSAxIDw8IGtUdlNoaWZ0LAorICBrVHZFbnVtICAgICAgPSAyIDw8IGtUdlNoaWZ0LCAgLy8gdmFsaWRhdGUgdXNpbmcgZ2VuZXJhdGVkIF9Jc1ZhbGlkKCkKKyAga1R2UmFuZ2UgICAgID0gMyA8PCBrVHZTaGlmdCwgIC8vIHZhbGlkYXRlIHVzaW5nIEZpZWxkQXV4OjplbnVtX3JhbmdlCisgIC8vIFN0cmluZyBmaWVsZHM6CisgIGtUdlV0ZjhEZWJ1ZyA9IDEgPDwga1R2U2hpZnQsICAvLyBwcm90bzIKKyAga1R2VXRmOCAgICAgID0gMiA8PCBrVHZTaGlmdCwgIC8vIHByb3RvMworfTsKKworc3RhdGljX2Fzc2VydCgoa1R2RW51bSAmIGtUdlJhbmdlKSAhPSAwLAorICAgICAgICAgICAgICAiZW51bSB2YWxpZGF0aW9uIHR5cGVzIG11c3Qgc2hhcmUgYSBiaXQiKTsKK3N0YXRpY19hc3NlcnQoKGtUdkVudW0gJiBrVHZSYW5nZSAmIGtUdlppZ1phZykgPT0gMCwKKyAgICAgICAgICAgICAgInppZ3phZyBlbmNvZGluZyBpcyBub3QgZW51bSB2YWxpZGF0aW9uIik7CisKKy8vIEZvcm1hdCBkaXNjcmltaW5hdG9ycyAoMiBiaXRzKToKK2VudW0gRm9ybWF0RGlzY3JpbWluYXRvciA6IHVpbnQxNl90IHsKKyAga0ZtdFNoaWZ0ICAgICAgPSBrVHZTaGlmdCArIGtUdkJpdHMsCisgIGtGbXRCaXRzICAgICAgID0gMiwKKyAga0ZtdE1hc2sgICAgICAgPSAoKDEgPDwga0ZtdEJpdHMpIC0gMSkgPDwga0ZtdFNoaWZ0LAorCisgIC8vIE51bWVyaWM6CisgIGtGbXRVbnNpZ25lZCAgID0gMSA8PCBrRm10U2hpZnQsICAvLyBmaXhlZCwgdmFyaW50CisgIGtGbXRTaWduZWQgICAgID0gMiA8PCBrRm10U2hpZnQsICAvLyBmaXhlZCwgdmFyaW50CisgIGtGbXRGbG9hdGluZyAgID0gMyA8PCBrRm10U2hpZnQsICAvLyBmaXhlZAorICBrRm10RW51bSAgICAgICA9IDMgPDwga0ZtdFNoaWZ0LCAgLy8gdmFyaW50CisgIC8vIFN0cmluZ3M6CisgIGtGbXRVdGY4ICAgICAgID0gMSA8PCBrRm10U2hpZnQsICAvLyBzdHJpbmcgKHByb3RvMywgZW5mb3JjZV91dGY4PXRydWUpCisgIGtGbXRVdGY4RXNjYXBlID0gMiA8PCBrRm10U2hpZnQsICAvLyBzdHJpbmcgKHByb3RvMiwgZW5mb3JjZV91dGY4PWZhbHNlKQorICAvLyBCeXRlczoKKyAga0ZtdEFycmF5ICAgICAgPSAxIDw8IGtGbXRTaGlmdCwgIC8vIGJ5dGVzCisgIC8vIE1lc3NhZ2VzOgorICBrRm10U2hvdyAgICAgICA9IDEgPDwga0ZtdFNoaWZ0LCAgLy8gbWVzc2FnZSwgbWFwCit9OworCisvLyBVcGRhdGUgdGhpcyBhc3NlcnRpb24gKGFuZCBjb21tZW50cyBhYm92ZSkgd2hlbiBhZGRpbmcgb3IgcmVtb3ZpbmcgYml0czoKK3N0YXRpY19hc3NlcnQoa0ZtdFNoaWZ0ICsga0ZtdEJpdHMgPT0gMTIsICJudW1iZXIgb2YgYml0cyBjaGFuZ2VkIik7CisKKy8vIFRoaXMgYXNzZXJ0aW9uIHNob3VsZCBub3QgY2hhbmdlIHVubGVzcyB0aGUgc3RvcmFnZSB3aWR0aCBjaGFuZ2VzOgorc3RhdGljX2Fzc2VydChrRm10U2hpZnQgKyBrRm10Qml0cyA8PSAxNiwgInRvbyBtYW55IGJpdHMiKTsKKworLy8gQ29udmVuaWVuY2UgYWxpYXNlcyAoMTYgYml0cywgd2l0aCBmb3JtYXQpOgorZW51bSBGaWVsZFR5cGUgOiB1aW50MTZfdCB7CisgIC8vIE51bWVyaWMgdHlwZXM6CisgIGtCb29sICAgICAgICAgICAgPSBrRmtWYXJpbnQgfCBrUmVwOEJpdHMsCisKKyAga0ZpeGVkMzIgICAgICAgICA9IGtGa0ZpeGVkICB8IGtSZXAzMkJpdHMgfCBrRm10VW5zaWduZWQsCisgIGtVSW50MzIgICAgICAgICAgPSBrRmtWYXJpbnQgfCBrUmVwMzJCaXRzIHwga0ZtdFVuc2lnbmVkLAorICBrU0ZpeGVkMzIgICAgICAgID0ga0ZrRml4ZWQgIHwga1JlcDMyQml0cyB8IGtGbXRTaWduZWQsCisgIGtJbnQzMiAgICAgICAgICAgPSBrRmtWYXJpbnQgfCBrUmVwMzJCaXRzIHwga0ZtdFNpZ25lZCwKKyAga1NJbnQzMiAgICAgICAgICA9IGtGa1ZhcmludCB8IGtSZXAzMkJpdHMgfCBrRm10U2lnbmVkIHwga1R2WmlnWmFnLAorICBrRmxvYXQgICAgICAgICAgID0ga0ZrRml4ZWQgIHwga1JlcDMyQml0cyB8IGtGbXRGbG9hdGluZywKKyAga0VudW0gICAgICAgICAgICA9IGtGa1ZhcmludCB8IGtSZXAzMkJpdHMgfCBrRm10RW51bSAgIHwga1R2RW51bSwKKyAga0VudW1SYW5nZSAgICAgICA9IGtGa1ZhcmludCB8IGtSZXAzMkJpdHMgfCBrRm10RW51bSAgIHwga1R2UmFuZ2UsCisgIGtPcGVuRW51bSAgICAgICAgPSBrRmtWYXJpbnQgfCBrUmVwMzJCaXRzIHwga0ZtdEVudW0sCisKKyAga0ZpeGVkNjQgICAgICAgICA9IGtGa0ZpeGVkICB8IGtSZXA2NEJpdHMgfCBrRm10VW5zaWduZWQsCisgIGtVSW50NjQgICAgICAgICAgPSBrRmtWYXJpbnQgfCBrUmVwNjRCaXRzIHwga0ZtdFVuc2lnbmVkLAorICBrU0ZpeGVkNjQgICAgICAgID0ga0ZrRml4ZWQgIHwga1JlcDY0Qml0cyB8IGtGbXRTaWduZWQsCisgIGtJbnQ2NCAgICAgICAgICAgPSBrRmtWYXJpbnQgfCBrUmVwNjRCaXRzIHwga0ZtdFNpZ25lZCwKKyAga1NJbnQ2NCAgICAgICAgICA9IGtGa1ZhcmludCB8IGtSZXA2NEJpdHMgfCBrRm10U2lnbmVkIHwga1R2WmlnWmFnLAorICBrRG91YmxlICAgICAgICAgID0ga0ZrRml4ZWQgIHwga1JlcDY0Qml0cyB8IGtGbXRGbG9hdGluZywKKworICBrUGFja2VkQm9vbCAgICAgID0ga0ZrUGFja2VkVmFyaW50IHwga1JlcDhCaXRzLAorCisgIGtQYWNrZWRGaXhlZDMyICAgPSBrRmtQYWNrZWRGaXhlZCAgfCBrUmVwMzJCaXRzIHwga0ZtdFVuc2lnbmVkLAorICBrUGFja2VkVUludDMyICAgID0ga0ZrUGFja2VkVmFyaW50IHwga1JlcDMyQml0cyB8IGtGbXRVbnNpZ25lZCwKKyAga1BhY2tlZFNGaXhlZDMyICA9IGtGa1BhY2tlZEZpeGVkICB8IGtSZXAzMkJpdHMgfCBrRm10U2lnbmVkLAorICBrUGFja2VkSW50MzIgICAgID0ga0ZrUGFja2VkVmFyaW50IHwga1JlcDMyQml0cyB8IGtGbXRTaWduZWQsCisgIGtQYWNrZWRTSW50MzIgICAgPSBrRmtQYWNrZWRWYXJpbnQgfCBrUmVwMzJCaXRzIHwga0ZtdFNpZ25lZCB8IGtUdlppZ1phZywKKyAga1BhY2tlZEZsb2F0ICAgICA9IGtGa1BhY2tlZEZpeGVkICB8IGtSZXAzMkJpdHMgfCBrRm10RmxvYXRpbmcsCisgIGtQYWNrZWRFbnVtICAgICAgPSBrRmtQYWNrZWRWYXJpbnQgfCBrUmVwMzJCaXRzIHwga0ZtdEVudW0gICB8IGtUdkVudW0sCisgIGtQYWNrZWRFbnVtUmFuZ2UgPSBrRmtQYWNrZWRWYXJpbnQgfCBrUmVwMzJCaXRzIHwga0ZtdEVudW0gICB8IGtUdlJhbmdlLAorICBrUGFja2VkT3BlbkVudW0gID0ga0ZrUGFja2VkVmFyaW50IHwga1JlcDMyQml0cyB8IGtGbXRFbnVtLAorCisgIGtQYWNrZWRGaXhlZDY0ICAgPSBrRmtQYWNrZWRGaXhlZCAgfCBrUmVwNjRCaXRzIHwga0ZtdFVuc2lnbmVkLAorICBrUGFja2VkVUludDY0ICAgID0ga0ZrUGFja2VkVmFyaW50IHwga1JlcDY0Qml0cyB8IGtGbXRVbnNpZ25lZCwKKyAga1BhY2tlZFNGaXhlZDY0ICA9IGtGa1BhY2tlZEZpeGVkICB8IGtSZXA2NEJpdHMgfCBrRm10U2lnbmVkLAorICBrUGFja2VkSW50NjQgICAgID0ga0ZrUGFja2VkVmFyaW50IHwga1JlcDY0Qml0cyB8IGtGbXRTaWduZWQsCisgIGtQYWNrZWRTSW50NjQgICAgPSBrRmtQYWNrZWRWYXJpbnQgfCBrUmVwNjRCaXRzIHwga0ZtdFNpZ25lZCB8IGtUdlppZ1phZywKKyAga1BhY2tlZERvdWJsZSAgICA9IGtGa1BhY2tlZEZpeGVkICB8IGtSZXA2NEJpdHMgfCBrRm10RmxvYXRpbmcsCisKKyAgLy8gU3RyaW5nIHR5cGVzOgorICBrQnl0ZXMgICAgICAgICAgID0ga0ZrU3RyaW5nIHwga0ZtdEFycmF5LAorICBrUmF3U3RyaW5nICAgICAgID0ga0ZrU3RyaW5nIHwga0ZtdFV0ZjggIHwga1R2VXRmOERlYnVnLAorICBrVXRmOFN0cmluZyAgICAgID0ga0ZrU3RyaW5nIHwga0ZtdFV0ZjggIHwga1R2VXRmOCwKKworICAvLyBNZXNzYWdlIHR5cGVzOgorICBrTWVzc2FnZSAgICAgICAgID0ga0ZrTWVzc2FnZSwKKworICAvLyBNYXAgdHlwZXM6CisgIGtNYXAgICAgICAgICAgICAgPSBrRmtNYXAsCit9OworCisvLyBjbGFuZy1mb3JtYXQgb24KK30gIC8vIG5hbWVzcGFjZSBmaWVsZF9sYXlvdXQKKworLy8gUFJPVE9CVUZfVENfUEFSQU1fREVDTCBhcmUgdGhlIHBhcmFtZXRlcnMgZm9yIHRhaWxjYWxsIGZ1bmN0aW9ucywgaXQgaXMKKy8vIGRlZmluZWQgaW4gcG9ydF9kZWYuaW5jLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIGlzIHBlcmZvcm1hbmNlIHNlbnNpdGl2ZTogY2hhbmdpbmcgdGhlIHBhcmFtZXRlcnMgd2lsbCBjaGFuZ2UKKy8vIHRoZSByZWdpc3RlcnMgdXNlZCBieSB0aGUgQUJJIGNhbGxpbmcgY29udmVudGlvbiwgd2hpY2ggc3Vic2VxdWVudGx5IGFmZmVjdHMKKy8vIHJlZ2lzdGVyIHNlbGVjdGlvbiBsb2dpYyBpbnNpZGUgdGhlIGZ1bmN0aW9uLgorCisvLyBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTIHBhc3NlcyB2YWx1ZXMgdG8gbWF0Y2ggUFJPVE9CVUZfVENfUEFSQU1fREVDTC4KKyNkZWZpbmUgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyBtc2csIHB0ciwgY3R4LCB0YWJsZSwgaGFzYml0cywgZGF0YQorCisjaWZuZGVmIE5ERUJVRwordGVtcGxhdGUgPHNpemVfdCBhbGlnbj4KKyNpZm5kZWYgX01TQ19WRVIKK1tbbm9yZXR1cm5dXQorI2VuZGlmCit2b2lkIEFsaWduRmFpbCh1aW50cHRyX3QgYWRkcmVzcykgeworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5hbGlnbmVkICgiIDw8IGFsaWduIDw8ICIpIGFjY2VzcyBhdCAiIDw8IGFkZHJlc3M7Cit9CisKK2V4dGVybiB0ZW1wbGF0ZSB2b2lkIEFsaWduRmFpbDw0Pih1aW50cHRyX3QpOworZXh0ZXJuIHRlbXBsYXRlIHZvaWQgQWxpZ25GYWlsPDg+KHVpbnRwdHJfdCk7CisjZW5kaWYKKworLy8gVGNQYXJzZXIgaW1wbGVtZW50cyBtb3N0IG9mIHRoZSBwYXJzaW5nIGxvZ2ljIGZvciB0YWlsY2FsbCB0YWJsZXMuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgVGNQYXJzZXIgZmluYWwgeworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEdlbmVyaWNGYWxsYmFjayhQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEdlbmVyaWNGYWxsYmFja0xpdGUoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisKKyAgc3RhdGljIGNvbnN0IGNoYXIqIFBhcnNlTG9vcChNZXNzYWdlTGl0ZSogbXNnLCBjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VDb250ZXh0KiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGNQYXJzZVRhYmxlQmFzZSogdGFibGUpOworCisgIC8vIEZ1bmN0aW9ucyByZWZlcmVuY2VkIGJ5IGdlbmVyYXRlZCBmYXN0IHRhYmxlcyAobnVtZXJpYyB0eXBlcyk6CisgIC8vICAgRjogZml4ZWQgICAgICBWOiB2YXJpbnQgICAgIFo6IHppZ3phZworICAvLyAgIDgvMzIvNjQ6IHN0b3JhZ2UgdHlwZSB3aWR0aCAoYml0cykKKyAgLy8gICBTOiBzaW5ndWxhciAgIFI6IHJlcGVhdGVkICAgUDogcGFja2VkCisgIC8vICAgMS8yOiB0YWcgbGVuZ3RoIChieXRlcykKKworICAvLyBGaXhlZDoKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RGMzJTMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RGMzJTMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RGMzJSMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RGMzJSMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RGMzJQMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RGMzJQMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RGNjRTMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RGNjRTMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RGNjRSMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RGNjRSMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RGNjRQMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RGNjRQMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKworICAvLyBWYXJpbnQ6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VjhTMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RWOFMyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogRmFzdFY4UjEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VjhSMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RWOFAxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogRmFzdFY4UDIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VjMyUzEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VjMyUzIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VjMyUjEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VjMyUjIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VjMyUDEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VjMyUDIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VjY0UzEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VjY0UzIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VjY0UjEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VjY0UjIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VjY0UDEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VjY0UDIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisKKyAgLy8gVmFyaW50ICh3aXRoIHppZ3phZyk6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0WjMyUzEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0WjMyUzIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0WjMyUjEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0WjMyUjIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0WjMyUDEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0WjMyUDIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0WjY0UzEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0WjY0UzIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0WjY0UjEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0WjY0UjIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0WjY0UDEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0WjY0UDIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisKKyAgLy8gRnVuY3Rpb25zIHJlZmVyZW5jZWQgYnkgZ2VuZXJhdGVkIGZhc3QgdGFibGVzIChjbG9zZWQgZW51bSk6CisgIC8vICAgRTogY2xvc2VkIGVudW0gKE4uQi46IG9wZW4gZW51bXMgdXNlIFYzMiwgYWJvdmUpCisgIC8vICAgcjogZW51bSByYW5nZSAgdjogZW51bSB2YWxpZGF0b3IgKF9Jc1ZhbGlkIGZ1bmN0aW9uKQorICAvLyAgIFM6IHNpbmd1bGFyICAgUjogcmVwZWF0ZWQKKyAgLy8gICAxLzI6IHRhZyBsZW5ndGggKGJ5dGVzKQorICBzdGF0aWMgY29uc3QgY2hhciogRmFzdEVyUzEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0RXJTMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RFclIxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogRmFzdEVyUjIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0RXZTMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RFdlMyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogRmFzdEV2UjEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0RXZSMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKworICAvLyBGdW5jdGlvbnMgcmVmZXJlbmNlZCBieSBnZW5lcmF0ZWQgZmFzdCB0YWJsZXMgKHN0cmluZyB0eXBlcyk6CisgIC8vICAgQjogYnl0ZXMgICAgICBTOiBzdHJpbmcgICAgIFU6IFVURi04IHN0cmluZworICAvLyAgIChlbXB0eSk6IEFyZW5hU3RyaW5nUHRyICAgICBpOiBJbmxpbmVkU3RyaW5nCisgIC8vICAgUzogc2luZ3VsYXIgICBSOiByZXBlYXRlZAorICAvLyAgIDEvMjogdGFnIGxlbmd0aCAoYnl0ZXMpCisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0QlMxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogRmFzdEJTMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RCUjEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0QlIyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogRmFzdFNTMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RTUzIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0U1IxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogRmFzdFNSMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RVUzEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VVMyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogRmFzdFVSMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RVUjIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RCaVMxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogRmFzdEJpUzIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0U2lTMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RTaVMyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogRmFzdFVpUzEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0VWlTMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKworICAvLyBGdW5jdGlvbnMgcmVmZXJlbmNlZCBieSBnZW5lcmF0ZWQgZmFzdCB0YWJsZXMgKG1lc3NhZ2UgdHlwZXMpOgorICAvLyAgIE06IG1lc3NhZ2UgICAgRzogZ3JvdXAKKyAgLy8gICBTOiBzaW5ndWxhciAgIFI6IHJlcGVhdGVkCisgIC8vICAgMS8yOiB0YWcgbGVuZ3RoIChieXRlcykKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RNUzEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0TVMyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogRmFzdE1SMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RNUjIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0R1MxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogRmFzdEdTMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIEZhc3RHUjEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBGYXN0R1IyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgaW5saW5lIFQmIFJlZkF0KHZvaWQqIHgsIHNpemVfdCBvZmZzZXQpIHsKKyAgICBUKiB0YXJnZXQgPSByZWludGVycHJldF9jYXN0PFQqPihzdGF0aWNfY2FzdDxjaGFyKj4oeCkgKyBvZmZzZXQpOworI2lmbmRlZiBOREVCVUcKKyAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pih0YXJnZXQpICUgYWxpZ25vZihUKSAhPSAwKSkgeworICAgICAgQWxpZ25GYWlsPGFsaWdub2YoVCk+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pih0YXJnZXQpKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gKnRhcmdldDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgaW5saW5lIGNvbnN0IFQmIFJlZkF0KGNvbnN0IHZvaWQqIHgsIHNpemVfdCBvZmZzZXQpIHsKKyAgICBjb25zdCBUKiB0YXJnZXQgPQorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oeCkgKyBvZmZzZXQpOworI2lmbmRlZiBOREVCVUcKKyAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pih0YXJnZXQpICUgYWxpZ25vZihUKSAhPSAwKSkgeworICAgICAgQWxpZ25GYWlsPGFsaWdub2YoVCk+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pih0YXJnZXQpKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gKnRhcmdldDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgaW5saW5lIFQgUmVhZEF0KGNvbnN0IHZvaWQqIHgsIHNpemVfdCBvZmZzZXQpIHsKKyAgICBUIG91dDsKKyAgICBtZW1jcHkoJm91dCwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHgpICsgb2Zmc2V0LCBzaXplb2YoVCkpOworICAgIHJldHVybiBvdXQ7CisgIH0KKworICAvLyBNaW5pIHBhcnNpbmc6CisgIC8vCisgIC8vIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgZmllbGQgZnJvbSBpbmNvbWluZyBkYXRhIGJhc2VkIG9uIG1ldGFkYXRhIHN0b3JlZCBpbgorICAvLyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uLiBJZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQgaW4gdGhlIG1lc3NhZ2UsIGl0IGlzCisgIC8vIHN0b3JlZCBpbiBlaXRoZXIgdGhlIEV4dGVuc2lvblNldCAoaWYgYXBwbGljYWJsZSkgb3IgdGhlIFVua25vd25GaWVsZFNldC4KKyAgLy8KKyAgLy8gTk9URTogQ3VycmVudGx5LCB0aGlzIGZ1bmN0aW9uIG9ubHkgY2FsbHMgdGhlIHRhYmxlLWxldmVsIGZhbGxiYWNrCisgIC8vIGZ1bmN0aW9uLCBzbyBpdCBzaG91bGQgb25seSBiZSBjYWxsZWQgYXMgdGhlIGZhbGxiYWNrIGZyb20gZmFzdCB0YWJsZQorICAvLyBwYXJzaW5nLgorICBzdGF0aWMgY29uc3QgY2hhciogTWluaVBhcnNlKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEdlbmVyYXRlZFRjVGFibGVMaXRlVGVzdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGFnVHlwZSwgYm9vbCBncm91cF9jb2Rpbmc+CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogU2luZ3VsYXJQYXJzZU1lc3NhZ2VBdXhJbXBsKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGFnVHlwZSwgYm9vbCBncm91cF9jb2Rpbmc+CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogUmVwZWF0ZWRQYXJzZU1lc3NhZ2VBdXhJbXBsKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworCisgIHN0YXRpYyBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIFN5bmNIYXNiaXRzKAorICAgICAgTWVzc2FnZUxpdGUqIG1zZywgdWludDY0X3QgaGFzYml0cywgY29uc3QgVGNQYXJzZVRhYmxlQmFzZSogdGFibGUpIHsKKyAgICBjb25zdCB1aW50MzJfdCBoYXNfYml0c19vZmZzZXQgPSB0YWJsZS0+aGFzX2JpdHNfb2Zmc2V0OworICAgIGlmIChoYXNfYml0c19vZmZzZXQpIHsKKyAgICAgIC8vIE9ubHkgdGhlIGZpcnN0IDMyIGhhcy1iaXRzIGFyZSB1cGRhdGVkLiBOb3RoaW5nIGFib3ZlIHRob3NlIGlzIHN0b3JlZCwKKyAgICAgIC8vIGJ1dCBlLmcuIG1lc3NhZ2VzIHdpdGhvdXQgaGFzLWJpdHMgdXBkYXRlIHRoZSB1cHBlciBiaXRzLgorICAgICAgUmVmQXQ8dWludDMyX3Q+KG1zZywgaGFzX2JpdHNfb2Zmc2V0KSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihoYXNiaXRzKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY29uc3QgY2hhciogVGFnRGlzcGF0Y2goUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBUb1RhZ0Rpc3BhdGNoKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogVG9QYXJzZUxvb3AoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBFcnJvcihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKworICBzdGF0aWMgY29uc3QgY2hhciogRmFzdFVua25vd25FbnVtRmFsbGJhY2soUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisKKyAgY2xhc3MgU2NvcGVkQXJlbmFTd2FwOworCisgIHRlbXBsYXRlIDxjbGFzcyBNZXNzYWdlQmFzZVQsIGNsYXNzIFVua25vd25GaWVsZHNUPgorICBzdGF0aWMgY29uc3QgY2hhciogR2VuZXJpY0ZhbGxiYWNrSW1wbChQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisjZGVmaW5lIENIS18oeCkgXAorICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgcmV0dXJuIG51bGxwdHIgLyogTk9MSU5UICovCisKKyAgICBTeW5jSGFzYml0cyhtc2csIGhhc2JpdHMsIHRhYmxlKTsKKyAgICBDSEtfKHB0cik7CisgICAgdWludDMyX3QgdGFnID0gZGF0YS50YWcoKTsKKyAgICBpZiAoKHRhZyAmIDcpID09IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVAgfHwgdGFnID09IDApIHsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgcmV0dXJuIHB0cjsKKyAgICB9CisgICAgdWludDMyX3QgbnVtID0gdGFnID4+IDM7CisgICAgaWYgKHRhYmxlLT5leHRlbnNpb25fcmFuZ2VfbG93IDw9IG51bSAmJgorICAgICAgICBudW0gPD0gdGFibGUtPmV4dGVuc2lvbl9yYW5nZV9oaWdoKSB7CisgICAgICByZXR1cm4gUmVmQXQ8RXh0ZW5zaW9uU2V0Pihtc2csIHRhYmxlLT5leHRlbnNpb25fb2Zmc2V0KQorICAgICAgICAgIC5QYXJzZUZpZWxkKHRhZywgcHRyLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IE1lc3NhZ2VCYXNlVCo+KHRhYmxlLT5kZWZhdWx0X2luc3RhbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAmbXNnLT5faW50ZXJuYWxfbWV0YWRhdGFfLCBjdHgpOworICAgIH0KKyAgICByZXR1cm4gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywgbXNnLT5faW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8VW5rbm93bkZpZWxkc1Q+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyN1bmRlZiBDSEtfCisgIH0KKworICAvLyBOb3RlOiBgaW5saW5lYCBpcyBuZWVkZWQgb24gdGVtcGxhdGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGJlbG93IHRvIGF2b2lkCisgIC8vIC1XYXR0cmlidXRlcyBkaWFnbm9zdGljIGluIEdDQy4KKworICAvLyBJbXBsZW1lbnRhdGlvbnMgZm9yIGZhc3QgZml4ZWQgZmllbGQgcGFyc2luZyBmdW5jdGlvbnM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBMYXlvdXRUeXBlLCB0eXBlbmFtZSBUYWdUeXBlPgorICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIFNpbmd1bGFyRml4ZWQoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBMYXlvdXRUeXBlLCB0eXBlbmFtZSBUYWdUeXBlPgorICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIFJlcGVhdGVkRml4ZWQoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBMYXlvdXRUeXBlLCB0eXBlbmFtZSBUYWdUeXBlPgorICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIFBhY2tlZEZpeGVkKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworCisgIC8vIEltcGxlbWVudGF0aW9ucyBmb3IgZmFzdCB2YXJpbnQgZmllbGQgcGFyc2luZyBmdW5jdGlvbnM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGaWVsZFR5cGUsIHR5cGVuYW1lIFRhZ1R5cGUsIGJvb2wgemlnemFnID0gZmFsc2U+CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogU2luZ3VsYXJWYXJpbnQoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGaWVsZFR5cGUsIHR5cGVuYW1lIFRhZ1R5cGUsIGJvb2wgemlnemFnID0gZmFsc2U+CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogUmVwZWF0ZWRWYXJpbnQoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGaWVsZFR5cGUsIHR5cGVuYW1lIFRhZ1R5cGUsIGJvb2wgemlnemFnID0gZmFsc2U+CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogUGFja2VkVmFyaW50KFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworCisgIC8vIEhlbHBlciBmb3IgaW50cyA+IDEyNzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZpZWxkVHlwZSwgdHlwZW5hbWUgVGFnVHlwZSwgYm9vbCB6aWd6YWcgPSBmYWxzZT4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIFNpbmd1bGFyVmFyQmlnaW50KFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworCisgIC8vIEltcGxlbWVudGF0aW9ucyBmb3IgZmFzdCBlbnVtIGZpZWxkIHBhcnNpbmcgZnVuY3Rpb25zOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGFnVHlwZSwgdWludDE2X3QgeGZvcm1fdmFsPgorICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIFNpbmd1bGFyRW51bShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFRhZ1R5cGUsIHVpbnQxNl90IHhmb3JtX3ZhbD4KKyAgc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBSZXBlYXRlZEVudW0oUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisKKyAgLy8gSW1wbGVtZW50YXRpb25zIGZvciBmYXN0IHN0cmluZyBmaWVsZCBwYXJzaW5nIGZ1bmN0aW9uczoKKyAgZW51bSBVdGY4VHlwZSB7IGtOb1V0ZjggPSAwLCBrVXRmOCA9IDEsIGtVdGY4VmFsaWRhdGVPbmx5ID0gMiB9OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGFnVHlwZSwgVXRmOFR5cGUgdXRmOD4KKyAgc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBTaW5ndWxhclN0cmluZyhQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFRhZ1R5cGUsIFV0ZjhUeXBlIHV0Zjg+CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogUmVwZWF0ZWRTdHJpbmcoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisKKyAgLy8gTWluaSBmaWVsZCBsb29rdXA6CisgIHN0YXRpYyBjb25zdCBUY1BhcnNlVGFibGVCYXNlOjpGaWVsZEVudHJ5KiBGaW5kRmllbGRFbnRyeSgKKyAgICAgIGNvbnN0IFRjUGFyc2VUYWJsZUJhc2UqIHRhYmxlLCB1aW50MzJfdCBmaWVsZF9udW0pOworICBzdGF0aWMgU3RyaW5nUGllY2UgTWVzc2FnZU5hbWUoY29uc3QgVGNQYXJzZVRhYmxlQmFzZSogdGFibGUpOworICBzdGF0aWMgU3RyaW5nUGllY2UgRmllbGROYW1lKGNvbnN0IFRjUGFyc2VUYWJsZUJhc2UqIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRjUGFyc2VUYWJsZUJhc2U6OkZpZWxkRW50cnkqKTsKKyAgc3RhdGljIGJvb2wgQ2hhbmdlT25lb2YoY29uc3QgVGNQYXJzZVRhYmxlQmFzZSogdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRjUGFyc2VUYWJsZUJhc2U6OkZpZWxkRW50cnkmIGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaWVsZF9udW0sIFBhcnNlQ29udGV4dCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbXNnKTsKKworICAvLyBVVEYtOCB2YWxpZGF0aW9uOgorICBzdGF0aWMgdm9pZCBSZXBvcnRGYXN0VXRmOEVycm9yKHVpbnQzMl90IGRlY29kZWRfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRjUGFyc2VUYWJsZUJhc2UqIHRhYmxlKTsKKyAgc3RhdGljIGJvb2wgTXBWZXJpZnlVdGY4KFN0cmluZ1BpZWNlIHdpcmVfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUY1BhcnNlVGFibGVCYXNlKiB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRjUGFyc2VUYWJsZUJhc2U6OkZpZWxkRW50cnkmIGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgeGZvcm1fdmFsKTsKKworICAvLyBGb3IgRmluZEZpZWxkRW50cnkgdGVzdHM6CisgIGZyaWVuZCBjbGFzcyBGaW5kRmllbGRFbnRyeVRlc3Q7CisgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgdWludDMyX3Qga010U21hbGxTY2FuU2l6ZSA9IDQ7CisKKyAgLy8gTWluaSBwYXJzaW5nOgorICBzdGF0aWMgY29uc3QgY2hhciogTXBWYXJpbnQoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBNcFJlcGVhdGVkVmFyaW50KFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogTXBQYWNrZWRWYXJpbnQoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBNcEZpeGVkKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogTXBSZXBlYXRlZEZpeGVkKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogTXBQYWNrZWRGaXhlZChQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIE1wU3RyaW5nKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogTXBSZXBlYXRlZFN0cmluZyhQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIE1wTWVzc2FnZShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIE1wUmVwZWF0ZWRNZXNzYWdlKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpOworICBzdGF0aWMgY29uc3QgY2hhciogTXBNYXAoUFJPVE9CVUZfVENfUEFSQU1fREVDTCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9UQ1RBQkxFX0lNUExfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OTM4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfbGl0ZS5jYwpAQCAtMCwwICsxLDE4NTkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9kZWNsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfaW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pbmxpbmVkX3N0cmluZ19maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcGFyc2VfY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorLy8gY2xhbmctZm9ybWF0IG9uCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3VzaW5nIEZpZWxkRW50cnkgPSBUY1BhcnNlVGFibGVCYXNlOjpGaWVsZEVudHJ5OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRlbXBsYXRlIGluc3RhbnRpYXRpb25zOgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpZm5kZWYgTkRFQlVHCit0ZW1wbGF0ZSB2b2lkIEFsaWduRmFpbDw0Pih1aW50cHRyX3QpOwordGVtcGxhdGUgdm9pZCBBbGlnbkZhaWw8OD4odWludHB0cl90KTsKKyNlbmRpZgorCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6R2VuZXJpY0ZhbGxiYWNrTGl0ZShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIHJldHVybiBHZW5lcmljRmFsbGJhY2tJbXBsPE1lc3NhZ2VMaXRlLCBzdGQ6OnN0cmluZz4oUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29yZSBmYXN0IHBhcnNpbmcgaW1wbGVtZW50YXRpb246CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgVGNQYXJzZXI6OlNjb3BlZEFyZW5hU3dhcCBmaW5hbCB7CisgcHVibGljOgorICBTY29wZWRBcmVuYVN3YXAoTWVzc2FnZUxpdGUqIG1zZywgUGFyc2VDb250ZXh0KiBjdHgpCisgICAgICA6IGN0eF8oY3R4KSwgc2F2ZWRfKGN0eC0+ZGF0YSgpLmFyZW5hKSB7CisgICAgY3R4Xy0+ZGF0YSgpLmFyZW5hID0gbXNnLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgfQorICBTY29wZWRBcmVuYVN3YXAoY29uc3QgU2NvcGVkQXJlbmFTd2FwJikgPSBkZWxldGU7CisgIH5TY29wZWRBcmVuYVN3YXAoKSB7IGN0eF8tPmRhdGEoKS5hcmVuYSA9IHNhdmVkXzsgfQorCisgcHJpdmF0ZToKKyAgUGFyc2VDb250ZXh0KiBjb25zdCBjdHhfOworICBBcmVuYSogY29uc3Qgc2F2ZWRfOworfTsKKworUFJPVE9CVUZfTk9JTkxJTkUgY29uc3QgY2hhciogVGNQYXJzZXI6OlBhcnNlTG9vcCgKKyAgICBNZXNzYWdlTGl0ZSogbXNnLCBjb25zdCBjaGFyKiBwdHIsIFBhcnNlQ29udGV4dCogY3R4LAorICAgIGNvbnN0IFRjUGFyc2VUYWJsZUJhc2UqIHRhYmxlKSB7CisgIFNjb3BlZEFyZW5hU3dhcCBzYXZlZChtc2csIGN0eCk7CisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgLy8gVW5jb25kaXRpb25hbGx5IHJlYWQgaGFzIGJpdHMsIGV2ZW4gaWYgd2UgZG9uJ3QgaGF2ZSBoYXMgYml0cy4KKyAgICAvLyBoYXNfYml0c19vZmZzZXQgd2lsbCBiZSAwIGFuZCB3ZSB3aWxsIGp1c3QgcmVhZCBzb21ldGhpbmcgdmFsaWQuCisgICAgdWludDY0X3QgaGFzYml0cyA9IFJlYWRBdDx1aW50MzJfdD4obXNnLCB0YWJsZS0+aGFzX2JpdHNfb2Zmc2V0KTsKKyAgICBwdHIgPSBUYWdEaXNwYXRjaChtc2csIHB0ciwgY3R4LCB0YWJsZSwgaGFzYml0cywge30pOworICAgIGlmIChwdHIgPT0gbnVsbHB0cikgYnJlYWs7CisgICAgaWYgKGN0eC0+TGFzdFRhZygpICE9IDEpIGJyZWFrOyAgLy8gRW5kZWQgb24gdGVybWluYXRpbmcgdGFnCisgIH0KKyAgcmV0dXJuIHB0cjsKK30KKworICAvLyBEaXNwYXRjaCB0byB0aGUgZGVzaWduYXRlZCBwYXJzZSBmdW5jdGlvbgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgY29uc3QgY2hhciogVGNQYXJzZXI6OlRhZ0Rpc3BhdGNoKAorICAgIFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgY29uc3QgYXV0byBjb2RlZF90YWcgPSBVbmFsaWduZWRMb2FkPHVpbnQxNl90PihwdHIpOworICBjb25zdCBzaXplX3QgaWR4ID0gY29kZWRfdGFnICYgdGFibGUtPmZhc3RfaWR4X21hc2s7CisgIFBST1RPQlVGX0FTU1VNRSgoaWR4ICYgNykgPT0gMCk7CisgIGF1dG8qIGZhc3RfZW50cnkgPSB0YWJsZS0+ZmFzdF9lbnRyeShpZHggPj4gMyk7CisgIGRhdGEgPSBmYXN0X2VudHJ5LT5iaXRzOworICBkYXRhLmRhdGEgXj0gY29kZWRfdGFnOworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gZmFzdF9lbnRyeS0+dGFyZ2V0KFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCisvLyBXZSBjYW4gb25seSBzYWZlbHkgY2FsbCBmcm9tIGZpZWxkIHRvIG5leHQgZmllbGQgaWYgdGhlIGNhbGwgaXMgb3B0aW1pemVkCisvLyB0byBhIHByb3BlciB0YWlsIGNhbGwuIE90aGVyd2lzZSB3ZSBibG93IHRocm91Z2ggc3RhY2suIENsYW5nIGFuZCBnY2MKKy8vIHJlbGlhYmx5IGRvIHRoaXMgb3B0aW1pemF0aW9uIGluIG9wdCBtb2RlLCBidXQgZG8gbm90IHBlcmZvcm0gdGhpcyBpbiBkZWJ1ZworLy8gbW9kZS4gTHVja2lseSB0aGUgc3RydWN0dXJlIG9mIHRoZSBhbGdvcml0aG0gaXMgc3VjaCB0aGF0IGl0J3MgYWx3YXlzCisvLyBwb3NzaWJsZSB0byBqdXN0IHJldHVybiBhbmQgdXNlIHRoZSBlbmNsb3NpbmcgcGFyc2UgbG9vcCBhcyBhIHRyYW1wb2xpbmUuCitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSBjb25zdCBjaGFyKiBUY1BhcnNlcjo6VG9UYWdEaXNwYXRjaCgKKyAgICBQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIGNvbnN0ZXhwciBib29sIGFsd2F5c19yZXR1cm4gPSAhUFJPVE9CVUZfVEFJTENBTEw7CisgIGlmIChhbHdheXNfcmV0dXJuIHx8ICFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgeworICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBUb1BhcnNlTG9vcChQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgfQorICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gVGFnRGlzcGF0Y2goUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIGNvbnN0IGNoYXIqIFRjUGFyc2VyOjpUb1BhcnNlTG9vcCgKKyAgICBQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgICh2b2lkKWRhdGE7CisgICh2b2lkKWN0eDsKKyAgU3luY0hhc2JpdHMobXNnLCBoYXNiaXRzLCB0YWJsZSk7CisgIHJldHVybiBwdHI7Cit9CisKK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIGNvbnN0IGNoYXIqIFRjUGFyc2VyOjpFcnJvcigKKyAgICBQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgICh2b2lkKWRhdGE7CisgICh2b2lkKWN0eDsKKyAgKHZvaWQpcHRyOworICBTeW5jSGFzYml0cyhtc2csIGhhc2JpdHMsIHRhYmxlKTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIE9uIHRoZSBmYXN0IHBhdGgsIGEgKG1hdGNoaW5nKSAxLWJ5dGUgdGFnIGFscmVhZHkgaGFzIHRoZSBkZWNvZGVkIHZhbHVlLgorc3RhdGljIHVpbnQzMl90IEZhc3REZWNvZGVUYWcodWludDhfdCBjb2RlZF90YWcpIHsKKyAgcmV0dXJuIGNvZGVkX3RhZzsKK30KKworLy8gT24gdGhlIGZhc3QgcGF0aCwgYSAobWF0Y2hpbmcpIDItYnl0ZSB0YWcgYWx3YXlzIG5lZWRzIHRvIGJlIGRlY29kZWQuCitzdGF0aWMgdWludDMyX3QgRmFzdERlY29kZVRhZyh1aW50MTZfdCBjb2RlZF90YWcpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gY29kZWRfdGFnOworICByZXN1bHQgKz0gc3RhdGljX2Nhc3Q8aW50OF90Pihjb2RlZF90YWcpOworICByZXR1cm4gcmVzdWx0ID4+IDE7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29yZSBtaW5pIHBhcnNpbmcgaW1wbGVtZW50YXRpb246CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gRmllbGQgbG9va3VwIHRhYmxlIGxheW91dDoKKy8vCisvLyBCZWNhdXNlIGl0IGNvbnNpc3RzIG9mIGEgc2VyaWVzIG9mIHZhcmlhYmxlLWxlbmd0aCBzZWdtZW50cywgdGhlIGxvb2t1dXAKKy8vIHRhYmxlIGlzIG9yZ2FuaXplZCB3aXRoaW4gYW4gYXJyYXkgb2YgdWludDE2X3QsIGFuZCBlYWNoIGVsZW1lbnQgaXMgZWl0aGVyCisvLyBhIHVpbnQxNl90IG9yIGEgdWludDMyX3Qgc3RvcmVkIGxpdHRsZS1lbmRpYW4gYXMgYSBwYWlyIG9mIHVpbnQxNl90LgorLy8KKy8vIEl0cyBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9jayBtYXBzIDE2IGNvbnRpZ3VvdXNseSBhc2NlbmRpbmcgZmllbGQgbnVtYmVycworLy8gdG8gdGhlaXIgbG9jYXRpb25zIHdpdGhpbiB0aGUgZmllbGQgZW50cnkgdGFibGU6CisKK3N0cnVjdCBTa2lwRW50cnkxNiB7CisgIHVpbnQxNl90IHNraXBtYXA7CisgIHVpbnQxNl90IGZpZWxkX2VudHJ5X29mZnNldDsKK307CisKKy8vIFRoZSBza2lwbWFwIGlzIGEgYml0ZmllbGQgb2Ygd2hpY2ggb2YgdGhvc2UgZmllbGQgbnVtYmVycyBkbyBOT1QgaGF2ZSBhCisvLyBmaWVsZCBlbnRyeS4gIFRoZSBsb3dlc3QgYml0IG9mIHRoZSBza2lwbWFwIGNvcnJlc3BvbmRzIHRvIHRoZSBsb3dlc3Qgb2YKKy8vIHRoZSAxNiBmaWVsZCBudW1iZXJzLCBzbyBpZiBhIHByb3RvIGhhZCBvbmx5IGZpZWxkcyAxLCAyLCAzLCBhbmQgNywgdGhlCisvLyBza2lwbWFwIHdvdWxkIGNvbnRhaW4gMGIxMTExMTExMScxMDExMTAwMC4KKy8vCisvLyBUaGUgZmllbGQgbG9va3VwIHRhYmxlIGJlZ2lucyB3aXRoIGEgc2luZ2xlIDMyLWJpdCBza2lwbWFwIHRoYXQgbWFwcyB0aGUKKy8vIGZpZWxkIG51bWJlcnMgMSB0aHJvdWdoIDMyLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBtYWpvcml0eSBvZiBwcm90bworLy8gbWVzc2FnZXMgb25seSBjb250YWluIGZpZWxkcyBudW1iZXJlZCAxIHRvIDMyLgorLy8KKy8vIFRoZSByZXN0IG9mIHRoZSBsb29rdXAgdGFibGUgaXMgYSByZXBlYXRlZCBzZXJpZXMgb2YKKy8vIHsgMzItYml0IGZpZWxkICMsICAjU2tpcEVudHJ5MTZzLCAge1NraXBFbnRyeTE2Li4ufSB9CisvLyBUaGF0IGlzLCB0aGUgbmV4dCB0aGluZyBpcyBhIHBhaXIgb2YgdWludDE2X3QgdGhhdCBmb3JtIHRoZSBuZXh0CisvLyBsb3dlc3QgZmllbGQgbnVtYmVyIHRoYXQgdGhlIGxvb2t1cCB0YWJsZSBoYW5kbGVzLiAgSWYgdGhpcyBudW1iZXIgaXMgLTEsCisvLyB0aGF0IGlzIHRoZSBlbmQgb2YgdGhlIHRhYmxlLiAgVGhlbiB0aGVyZSBpcyBhIHVpbnQxNl90IHRoYXQgaXMKKy8vIHRoZSBudW1iZXIgb2YgY29udGlndW91cyBTa2lwRW50cnkxNiBlbnRyaWVzIHRoYXQgZm9sbG93LCBhbmQgdGhlbiBvZgorLy8gY291cnNlIHRoZSBTa2lwRW50cnkxNnMgdGhlbXNlbHZlcy4KKworLy8gT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIHRlc3RlZCBhdCBodHRwczovL2dvZGJvbHQub3JnL3ovdmJjN2VuWWNmCisKKy8vIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpZWxkIGZvciBgdGFnYCBpbiB0aGUgdGFibGUncyBmaWVsZCBlbnRyaWVzLgorLy8gUmV0dXJucyBudWxscHRyIGlmIHRoZSBmaWVsZCB3YXMgbm90IGZvdW5kLgorY29uc3QgVGNQYXJzZVRhYmxlQmFzZTo6RmllbGRFbnRyeSogVGNQYXJzZXI6OkZpbmRGaWVsZEVudHJ5KAorICAgIGNvbnN0IFRjUGFyc2VUYWJsZUJhc2UqIHRhYmxlLCB1aW50MzJfdCBmaWVsZF9udW0pIHsKKyAgY29uc3QgRmllbGRFbnRyeSogY29uc3QgZmllbGRfZW50cmllcyA9IHRhYmxlLT5maWVsZF9lbnRyaWVzX2JlZ2luKCk7CisKKyAgdWludDMyX3QgZnN0YXJ0ID0gMTsKKyAgdWludDMyX3QgYWRqX2ZudW0gPSBmaWVsZF9udW0gLSBmc3RhcnQ7CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShhZGpfZm51bSA8IDMyKSkgeworICAgIHVpbnQzMl90IHNraXBtYXAgPSB0YWJsZS0+c2tpcG1hcDMyOworICAgIHVpbnQzMl90IHNraXBiaXQgPSAxIDw8IGFkal9mbnVtOworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKHNraXBtYXAgJiBza2lwYml0KSkgcmV0dXJuIG51bGxwdHI7CisgICAgc2tpcG1hcCAmPSBza2lwYml0IC0gMTsKKyNpZiAoX19HTlVDX18gfHwgX19jbGFuZ19fKSAmJiBfX1BPUENOVF9fCisgICAgLy8gTm90ZTogaGVyZSBhbmQgYmVsb3csIHNraXBtYXAgdHlwaWNhbGx5IGhhcyB2ZXJ5IGZldyBzZXQgYml0cworICAgIC8vICgzMSBpbiB0aGUgd29yc3QgY2FzZSwgYnV0IHVzdWFsbHkgemVybykgc28gYSBsb29wIGlzbid0IHRoYXQKKyAgICAvLyBiYWQsIGFuZCBhIGNvbXBpbGVyLWdlbmVyYXRlZCBwb3Bjb3VudCBpcyB0eXBpY2FsbHkgb25seQorICAgIC8vIHdvcnRod2hpbGUgaWYgdGhlIHByb2Nlc3NvciBpdHNlbGYgaGFzIGhhcmR3YXJlIHBvcGNvdW50IHN1cHBvcnQuCisgICAgYWRqX2ZudW0gLT0gX19idWlsdGluX3BvcGNvdW50KHNraXBtYXApOworI2Vsc2UKKyAgICB3aGlsZSAoc2tpcG1hcCkgeworICAgICAgLS1hZGpfZm51bTsKKyAgICAgIHNraXBtYXAgJj0gc2tpcG1hcCAtIDE7CisgICAgfQorI2VuZGlmCisgICAgYXV0byogZW50cnkgPSBmaWVsZF9lbnRyaWVzICsgYWRqX2ZudW07CisgICAgUFJPVE9CVUZfQVNTVU1FKGVudHJ5ICE9IG51bGxwdHIpOworICAgIHJldHVybiBlbnRyeTsKKyAgfQorICBjb25zdCB1aW50MTZfdCogbG9va3VwX3RhYmxlID0gdGFibGUtPmZpZWxkX2xvb2t1cF9iZWdpbigpOworICBmb3IgKDs7KSB7CisjaWZkZWYgUFJPVE9CVUZfTElUVExFX0VORElBTgorICAgIG1lbWNweSgmZnN0YXJ0LCBsb29rdXBfdGFibGUsIHNpemVvZihmc3RhcnQpKTsKKyNlbHNlCisgICAgZnN0YXJ0ID0gbG9va3VwX3RhYmxlWzBdIHwgKGxvb2t1cF90YWJsZVsxXSA8PCAxNik7CisjZW5kaWYKKyAgICBsb29rdXBfdGFibGUgKz0gc2l6ZW9mKGZzdGFydCkgLyBzaXplb2YoKmxvb2t1cF90YWJsZSk7CisgICAgdWludDMyX3QgbnVtX3NraXBfZW50cmllcyA9ICpsb29rdXBfdGFibGUrKzsKKyAgICBpZiAoZmllbGRfbnVtIDwgZnN0YXJ0KSByZXR1cm4gbnVsbHB0cjsKKyAgICBhZGpfZm51bSA9IGZpZWxkX251bSAtIGZzdGFydDsKKyAgICB1aW50MzJfdCBza2lwX251bSA9IGFkal9mbnVtIC8gMTY7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShza2lwX251bSA8IG51bV9za2lwX2VudHJpZXMpKSB7CisgICAgICAvLyBmb3IgZWFjaCBncm91cCBvZiAxNiBmaWVsZHMgd2UgaGF2ZToKKyAgICAgIC8vIGEgYml0bWFwIG9mIDE2IGJpdHMKKyAgICAgIC8vIGEgMTYtYml0IGZpZWxkLWVudHJ5IG9mZnNldCBmb3IgdGhlIGZpcnN0IG9mIHRoZW0uCisgICAgICBhdXRvKiBza2lwX2RhdGEgPSBsb29rdXBfdGFibGUgKyAoYWRqX2ZudW0gLyAxNikgKiAoc2l6ZW9mKFNraXBFbnRyeTE2KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICBTa2lwRW50cnkxNiBzZSA9IHtza2lwX2RhdGFbMF0sIHNraXBfZGF0YVsxXX07CisgICAgICBhZGpfZm51bSAmPSAxNTsKKyAgICAgIHVpbnQzMl90IHNraXBtYXAgPSBzZS5za2lwbWFwOworICAgICAgdWludDE2X3Qgc2tpcGJpdCA9IDEgPDwgYWRqX2ZudW07CisgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShza2lwbWFwICYgc2tpcGJpdCkpIHJldHVybiBudWxscHRyOworICAgICAgc2tpcG1hcCAmPSBza2lwYml0IC0gMTsKKyAgICAgIGFkal9mbnVtICs9IHNlLmZpZWxkX2VudHJ5X29mZnNldDsKKyNpZiAoX19HTlVDX18gfHwgX19jbGFuZ19fKSAmJiBfX1BPUENOVF9fCisgICAgICBhZGpfZm51bSAtPSBfX2J1aWx0aW5fcG9wY291bnQoc2tpcG1hcCk7CisjZWxzZQorICAgICAgd2hpbGUgKHNraXBtYXApIHsKKyAgICAgICAgLS1hZGpfZm51bTsKKyAgICAgICAgc2tpcG1hcCAmPSBza2lwbWFwIC0gMTsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgYXV0byogZW50cnkgPSBmaWVsZF9lbnRyaWVzICsgYWRqX2ZudW07CisgICAgICBQUk9UT0JVRl9BU1NVTUUoZW50cnkgIT0gbnVsbHB0cik7CisgICAgICByZXR1cm4gZW50cnk7CisgICAgfQorICAgIGxvb2t1cF90YWJsZSArPQorICAgICAgICBudW1fc2tpcF9lbnRyaWVzICogKHNpemVvZihTa2lwRW50cnkxNikgLyBzaXplb2YoKmxvb2t1cF90YWJsZSkpOworICB9Cit9CisKKy8vIEZpZWxkIG5hbWVzIGFyZSBzdG9yZWQgaW4gYSBmb3JtYXQgb2Y6CisvLworLy8gMSkgQSB0YWJsZSBvZiBuYW1lIHNpemVzLCBvbmUgYnl0ZSBlYWNoLCBmcm9tIDEgdG8gMjU1IHBlciBuYW1lLgorLy8gICAgYGVudHJpZXNgIGlzIHRoZSBzaXplIG9mIHRoaXMgZmlyc3QgdGFibGUuCisvLyAxYSkgcGFkZGluZyBieXRlcywgc28gdGhlIHRhYmxlIG9mIG5hbWUgc2l6ZXMgaXMgYSBtdWx0aXBsZSBvZgorLy8gICAgIGVpZ2h0IGJ5dGVzIGluIGxlbmd0aC4gVGhleSBhcmUgemVyby4KKy8vCisvLyAyKSBBbGwgdGhlIG5hbWVzLCBjb25jYXRlbmF0ZWQsIHdpdGggbmVpdGhlciBzZXBhcmF0aW9uIG5vciB0ZXJtaW5hdGlvbi4KKy8vCisvLyBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhY3QgYnV0IG5vdCBwYXJ0aWN1bGFybHkgZmFzdCB0byByZXRyaWV2ZS4KKy8vIEluIHBhcnRpY3VsYXIsIGl0IHRha2VzIE8obikgdG8gcmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIG4ndGggZmllbGQsCisvLyB3aGljaCBpcyB1c3VhbGx5IGZpbmUgYmVjYXVzZSBtb3N0IHByb3RvcyBoYXZlIGZld2VyIHRoYW4gMTAgZmllbGRzLgorc3RhdGljIFN0cmluZ1BpZWNlIEZpbmROYW1lKGNvbnN0IGNoYXIqIG5hbWVfZGF0YSwgc2l6ZV90IGVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluZGV4KSB7CisgIC8vIFRoZSBjb21waWxlciB1bnJvbGxzIHRoZXNlLi4uIGlmIHRoaXMgaXNuJ3QgZmFzdCBlbm91Z2gsCisgIC8vIHRoZXJlJ3MgYW4gQVZYIHZlcnNpb24gYXQgaHR0cHM6Ly9nb2Rib2x0Lm9yZy96L2VvanJqcXpmcgorICAvLyBBUk0tY29tcGF0aWJsZSB2ZXJzaW9uIGF0IGh0dHBzOi8vZ29kYm9sdC5vcmcvei9uNVlUNUVlODUKKworICAvLyBUaGUgZmllbGQgbmFtZSBzaXplcyBhcmUgcGFkZGVkIHVwIHRvIGEgbXVsdGlwbGUgb2YgOCwgc28gd2UKKyAgLy8gbXVzdCBwYWQgdGhlbSBoZXJlLgorICBzaXplX3QgbnVtX3NpemVzID0gKGVudHJpZXMgKyA3KSAmIC04OworICBhdXRvKiB1aW50OHMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihuYW1lX2RhdGEpOworICBzaXplX3QgcG9zID0gc3RkOjphY2N1bXVsYXRlKHVpbnQ4cywgdWludDhzICsgaW5kZXgsIG51bV9zaXplcyk7CisgIHNpemVfdCBzaXplID0gbmFtZV9kYXRhW2luZGV4XTsKKyAgYXV0byogc3RhcnQgPSAmbmFtZV9kYXRhW3Bvc107CisgIHJldHVybiB7c3RhcnQsIHNpemV9OworfQorCitTdHJpbmdQaWVjZSBUY1BhcnNlcjo6TWVzc2FnZU5hbWUoY29uc3QgVGNQYXJzZVRhYmxlQmFzZSogdGFibGUpIHsKKyAgcmV0dXJuIEZpbmROYW1lKHRhYmxlLT5uYW1lX2RhdGEoKSwgdGFibGUtPm51bV9maWVsZF9lbnRyaWVzICsgMSwgMCk7Cit9CisKK1N0cmluZ1BpZWNlIFRjUGFyc2VyOjpGaWVsZE5hbWUoY29uc3QgVGNQYXJzZVRhYmxlQmFzZSogdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRW50cnkqIGZpZWxkX2VudHJ5KSB7CisgIGNvbnN0IEZpZWxkRW50cnkqIGNvbnN0IGZpZWxkX2VudHJpZXMgPSB0YWJsZS0+ZmllbGRfZW50cmllc19iZWdpbigpOworICBhdXRvIGZpZWxkX2luZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihmaWVsZF9lbnRyeSAtIGZpZWxkX2VudHJpZXMpOworICByZXR1cm4gRmluZE5hbWUodGFibGUtPm5hbWVfZGF0YSgpLCB0YWJsZS0+bnVtX2ZpZWxkX2VudHJpZXMgKyAxLAorICAgICAgICAgICAgICAgICAgZmllbGRfaW5kZXggKyAxKTsKK30KKworY29uc3QgY2hhciogVGNQYXJzZXI6Ok1pbmlQYXJzZShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIHVpbnQzMl90IHRhZzsKKyAgcHRyID0gUmVhZFRhZ0lubGluZWQocHRyLCAmdGFnKTsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UocHRyID09IG51bGxwdHIpKSByZXR1cm4gbnVsbHB0cjsKKworICBhdXRvKiBlbnRyeSA9IEZpbmRGaWVsZEVudHJ5KHRhYmxlLCB0YWcgPj4gMyk7CisgIGlmIChlbnRyeSA9PSBudWxscHRyKSB7CisgICAgZGF0YS5kYXRhID0gdGFnOworICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiB0YWJsZS0+ZmFsbGJhY2soUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgIH0KKworICAvLyBUaGUgaGFuZGxlciBtYXkgbmVlZCB0aGUgdGFnIGFuZCB0aGUgZW50cnkgdG8gcmVzb2x2ZSBmYWxsYmFjayBsb2dpYy4gQm90aAorICAvLyBvZiB0aGVzZSBhcmUgMzIgYml0cywgc28gcGFjayB0aGVtIGludG8gKHRoZSA2NC1iaXQpIGBkYXRhYC4gU2luY2Ugd2UgY2FuJ3QKKyAgLy8gcGFjayB0aGUgZW50cnkgcG9pbnRlciBpdHNlbGYsIGp1c3QgcGFjayBpdHMgb2Zmc2V0IGZyb20gYHRhYmxlYC4KKyAgdWludDY0X3QgZW50cnlfb2Zmc2V0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZW50cnkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odGFibGUpOworICBkYXRhLmRhdGEgPSBlbnRyeV9vZmZzZXQgPDwgMzIgfCB0YWc7CisKKyAgdXNpbmcgZmllbGRfbGF5b3V0OjpGaWVsZEtpbmQ7CisgIGF1dG8gZmllbGRfdHlwZSA9IGVudHJ5LT50eXBlX2NhcmQgJiBGaWVsZEtpbmQ6OmtGa01hc2s7CisgIHN3aXRjaCAoZmllbGRfdHlwZSkgeworICAgIGNhc2UgRmllbGRLaW5kOjprRmtOb25lOgorICAgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIHRhYmxlLT5mYWxsYmFjayhQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgICBjYXNlIEZpZWxkS2luZDo6a0ZrVmFyaW50OgorICAgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIE1wVmFyaW50KFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICAgIGNhc2UgRmllbGRLaW5kOjprRmtQYWNrZWRWYXJpbnQ6CisgICAgICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gTXBQYWNrZWRWYXJpbnQoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgY2FzZSBGaWVsZEtpbmQ6OmtGa0ZpeGVkOgorICAgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIE1wRml4ZWQoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgY2FzZSBGaWVsZEtpbmQ6OmtGa1BhY2tlZEZpeGVkOgorICAgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIE1wUGFja2VkRml4ZWQoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgY2FzZSBGaWVsZEtpbmQ6OmtGa1N0cmluZzoKKyAgICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBNcFN0cmluZyhQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgICBjYXNlIEZpZWxkS2luZDo6a0ZrTWVzc2FnZToKKyAgICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBNcE1lc3NhZ2UoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgY2FzZSBGaWVsZEtpbmQ6OmtGa01hcDoKKyAgICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBNcE1hcChQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEVycm9yKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICB9Cit9CisKK25hbWVzcGFjZSB7CisKKy8vIE9mZnNldCByZXR1cm5zIHRoZSBhZGRyZXNzIGBvZmZzZXRgIGJ5dGVzIGFmdGVyIGBiYXNlYC4KK2lubGluZSB2b2lkKiBPZmZzZXQodm9pZCogYmFzZSwgdWludDMyX3Qgb2Zmc2V0KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYmFzZSkgKyBvZmZzZXQ7Cit9CisKKy8vIEludmVydFBhY2tlZCBjaGFuZ2VzIHRhZyBiaXRzIGZyb20gdGhlIGdpdmVuIHdpcmUgdHlwZSB0byBsZW5ndGgKKy8vIGRlbGltaXRlZC4gVGhpcyBpcyB0aGUgZGlmZmVyZW5jZSBleHBlY3RlZCBiZXR3ZWVuIHBhY2tlZCBhbmQgbm9uLXBhY2tlZAorLy8gcmVwZWF0ZWQgZmllbGRzLgordGVtcGxhdGUgPFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBXdD4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgSW52ZXJ0UGFja2VkKFRjRmllbGREYXRhJiBkYXRhKSB7CisgIGRhdGEuZGF0YSBePSBXdCBeIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNZXNzYWdlIGZpZWxkcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUYWdUeXBlLCBib29sIGdyb3VwX2NvZGluZz4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6U2luZ3VsYXJQYXJzZU1lc3NhZ2VBdXhJbXBsKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoZGF0YS5jb2RlZF90YWc8VGFnVHlwZT4oKSAhPSAwKSkgeworICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBNaW5pUGFyc2UoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgIH0KKyAgYXV0byBzYXZlZF90YWcgPSBVbmFsaWduZWRMb2FkPFRhZ1R5cGU+KHB0cik7CisgIHB0ciArPSBzaXplb2YoVGFnVHlwZSk7CisgIGhhc2JpdHMgfD0gKHVpbnQ2NF90ezF9IDw8IGRhdGEuaGFzYml0X2lkeCgpKTsKKyAgU3luY0hhc2JpdHMobXNnLCBoYXNiaXRzLCB0YWJsZSk7CisgIGF1dG8mIGZpZWxkID0gUmVmQXQ8TWVzc2FnZUxpdGUqPihtc2csIGRhdGEub2Zmc2V0KCkpOworICBpZiAoZmllbGQgPT0gbnVsbHB0cikgeworICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBkZWZhdWx0X2luc3RhbmNlID0KKyAgICAgICAgdGFibGUtPmZpZWxkX2F1eChkYXRhLmF1eF9pZHgoKSktPm1lc3NhZ2VfZGVmYXVsdDsKKyAgICBmaWVsZCA9IGRlZmF1bHRfaW5zdGFuY2UtPk5ldyhjdHgtPmRhdGEoKS5hcmVuYSk7CisgIH0KKyAgaWYgKGdyb3VwX2NvZGluZykgeworICAgIHJldHVybiBjdHgtPlBhcnNlR3JvdXAoZmllbGQsIHB0ciwgRmFzdERlY29kZVRhZyhzYXZlZF90YWcpKTsKKyAgfQorICByZXR1cm4gY3R4LT5QYXJzZU1lc3NhZ2UoZmllbGQsIHB0cik7Cit9CisKK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0TVMxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFNpbmd1bGFyUGFyc2VNZXNzYWdlQXV4SW1wbDx1aW50OF90LCBmYWxzZT4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KKworY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RNUzIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gU2luZ3VsYXJQYXJzZU1lc3NhZ2VBdXhJbXBsPHVpbnQxNl90LCBmYWxzZT4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KKworY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RHUzEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gU2luZ3VsYXJQYXJzZU1lc3NhZ2VBdXhJbXBsPHVpbnQ4X3QsIHRydWU+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0R1MyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFNpbmd1bGFyUGFyc2VNZXNzYWdlQXV4SW1wbDx1aW50MTZfdCwgdHJ1ZT4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRhZ1R5cGUsIGJvb2wgZ3JvdXBfY29kaW5nPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpSZXBlYXRlZFBhcnNlTWVzc2FnZUF1eEltcGwoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShkYXRhLmNvZGVkX3RhZzxUYWdUeXBlPigpICE9IDApKSB7CisgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIE1pbmlQYXJzZShQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgfQorICBhdXRvIHNhdmVkX3RhZyA9IFVuYWxpZ25lZExvYWQ8VGFnVHlwZT4ocHRyKTsKKyAgcHRyICs9IHNpemVvZihUYWdUeXBlKTsKKyAgU3luY0hhc2JpdHMobXNnLCBoYXNiaXRzLCB0YWJsZSk7CisgIGNvbnN0IE1lc3NhZ2VMaXRlKiBkZWZhdWx0X2luc3RhbmNlID0KKyAgICAgIHRhYmxlLT5maWVsZF9hdXgoZGF0YS5hdXhfaWR4KCkpLT5tZXNzYWdlX2RlZmF1bHQ7CisgIGF1dG8mIGZpZWxkID0gUmVmQXQ8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1zZywgZGF0YS5vZmZzZXQoKSk7CisgIE1lc3NhZ2VMaXRlKiBzdWJtc2cgPQorICAgICAgZmllbGQuQWRkPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT4+KGRlZmF1bHRfaW5zdGFuY2UpOworICBpZiAoZ3JvdXBfY29kaW5nKSB7CisgICAgcmV0dXJuIGN0eC0+UGFyc2VHcm91cChzdWJtc2csIHB0ciwgRmFzdERlY29kZVRhZyhzYXZlZF90YWcpKTsKKyAgfQorICByZXR1cm4gY3R4LT5QYXJzZU1lc3NhZ2Uoc3VibXNnLCBwdHIpOworfQorCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdE1SMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBSZXBlYXRlZFBhcnNlTWVzc2FnZUF1eEltcGw8dWludDhfdCwgZmFsc2U+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0TVIyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFJlcGVhdGVkUGFyc2VNZXNzYWdlQXV4SW1wbDx1aW50MTZfdCwgZmFsc2U+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0R1IxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFJlcGVhdGVkUGFyc2VNZXNzYWdlQXV4SW1wbDx1aW50OF90LCB0cnVlPigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdEdSMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBSZXBlYXRlZFBhcnNlTWVzc2FnZUF1eEltcGw8dWludDE2X3QsIHRydWU+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRml4ZWQgZmllbGRzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordGVtcGxhdGUgPHR5cGVuYW1lIExheW91dFR5cGUsIHR5cGVuYW1lIFRhZ1R5cGU+CitQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIGNvbnN0IGNoYXIqIFRjUGFyc2VyOjpTaW5ndWxhckZpeGVkKAorICAgIFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoZGF0YS5jb2RlZF90YWc8VGFnVHlwZT4oKSAhPSAwKSkgeworICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBNaW5pUGFyc2UoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgIH0KKyAgcHRyICs9IHNpemVvZihUYWdUeXBlKTsgIC8vIENvbnN1bWUgdGFnCisgIGhhc2JpdHMgfD0gKHVpbnQ2NF90ezF9IDw8IGRhdGEuaGFzYml0X2lkeCgpKTsKKyAgUmVmQXQ8TGF5b3V0VHlwZT4obXNnLCBkYXRhLm9mZnNldCgpKSA9IFVuYWxpZ25lZExvYWQ8TGF5b3V0VHlwZT4ocHRyKTsKKyAgcHRyICs9IHNpemVvZihMYXlvdXRUeXBlKTsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFRvVGFnRGlzcGF0Y2goUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0RjMyUzEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gU2luZ3VsYXJGaXhlZDx1aW50MzJfdCwgdWludDhfdD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0RjMyUzIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gU2luZ3VsYXJGaXhlZDx1aW50MzJfdCwgdWludDE2X3Q+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9Citjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdEY2NFMxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFNpbmd1bGFyRml4ZWQ8dWludDY0X3QsIHVpbnQ4X3Q+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9Citjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdEY2NFMyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFNpbmd1bGFyRml4ZWQ8dWludDY0X3QsIHVpbnQxNl90PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTGF5b3V0VHlwZSwgdHlwZW5hbWUgVGFnVHlwZT4KK1BST1RPQlVGX0FMV0FZU19JTkxJTkUgY29uc3QgY2hhciogVGNQYXJzZXI6OlJlcGVhdGVkRml4ZWQoCisgICAgUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShkYXRhLmNvZGVkX3RhZzxUYWdUeXBlPigpICE9IDApKSB7CisgICAgLy8gQ2hlY2sgaWYgdGhlIGZpZWxkIGNhbiBiZSBwYXJzZWQgYXMgcGFja2VkIHJlcGVhdGVkOgorICAgIGNvbnN0ZXhwciBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgZmFsbGJhY2tfd3QgPQorICAgICAgICBzaXplb2YoTGF5b3V0VHlwZSkgPT0gNCA/IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQ7CisgICAgSW52ZXJ0UGFja2VkPGZhbGxiYWNrX3d0PihkYXRhKTsKKyAgICBpZiAoZGF0YS5jb2RlZF90YWc8VGFnVHlwZT4oKSA9PSAwKSB7CisgICAgICByZXR1cm4gUGFja2VkRml4ZWQ8TGF5b3V0VHlwZSwgVGFnVHlwZT4oUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgfSBlbHNlIHsKKyAgICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBNaW5pUGFyc2UoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgfQorICB9CisgIGF1dG8mIGZpZWxkID0gUmVmQXQ8UmVwZWF0ZWRGaWVsZDxMYXlvdXRUeXBlPj4obXNnLCBkYXRhLm9mZnNldCgpKTsKKyAgaW50IGlkeCA9IGZpZWxkLnNpemUoKTsKKyAgYXV0byBlbGVtID0gZmllbGQuQWRkKCk7CisgIGludCBzcGFjZSA9IGZpZWxkLkNhcGFjaXR5KCkgLSBpZHg7CisgIGlkeCA9IDA7CisgIGF1dG8gZXhwZWN0ZWRfdGFnID0gVW5hbGlnbmVkTG9hZDxUYWdUeXBlPihwdHIpOworICBkbyB7CisgICAgcHRyICs9IHNpemVvZihUYWdUeXBlKTsKKyAgICBlbGVtW2lkeCsrXSA9IFVuYWxpZ25lZExvYWQ8TGF5b3V0VHlwZT4ocHRyKTsKKyAgICBwdHIgKz0gc2l6ZW9mKExheW91dFR5cGUpOworICAgIGlmIChpZHggPj0gc3BhY2UpIGJyZWFrOworICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICB9IHdoaWxlIChVbmFsaWduZWRMb2FkPFRhZ1R5cGU+KHB0cikgPT0gZXhwZWN0ZWRfdGFnKTsKKyAgZmllbGQuQWRkTkFscmVhZHlSZXNlcnZlZChpZHggLSAxKTsKKyAgcmV0dXJuIFRvUGFyc2VMb29wKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdEYzMlIxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFJlcGVhdGVkRml4ZWQ8dWludDMyX3QsIHVpbnQ4X3Q+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9Citjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdEYzMlIyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFJlcGVhdGVkRml4ZWQ8dWludDMyX3QsIHVpbnQxNl90PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RGNjRSMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBSZXBlYXRlZEZpeGVkPHVpbnQ2NF90LCB1aW50OF90PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RGNjRSMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBSZXBlYXRlZEZpeGVkPHVpbnQ2NF90LCB1aW50MTZfdD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KKworLy8gTm90ZTogc29tZSB2ZXJzaW9ucyBvZiBHQ0Mgd2lsbCBmYWlsIHdpdGggZXJyb3IgImZ1bmN0aW9uIG5vdCBpbmxpbmFibGUiIGlmCisvLyBjb3JlY3Vyc2l2ZSBmdW5jdGlvbnMgYXJlIGJvdGggbWFya2VkIHdpdGggUFJPVE9CVUZfQUxXQVlTX0lOTElORSAoQ2xhbmcKKy8vIGFjY2VwdHMgdGhpcykuIFdlIGNhbiBzdGlsbCBhcHBseSB0aGUgYXR0cmlidXRlIHRvIG9uZSBvZiB0aGUgdHdvIGZ1bmN0aW9ucywKKy8vIGp1c3Qgbm90IGJvdGggKHNvIHdlIGRvIG1hcmsgdGhlIFJlcGVhdGVkIHZhcmlhbnQgYXMgYWx3YXlzIGlubGluZWQpLiBUaGlzCisvLyBhbHNvIGFwcGxpZXMgdG8gUGFja2VkVmFyaW50LCBiZWxvdy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMYXlvdXRUeXBlLCB0eXBlbmFtZSBUYWdUeXBlPgorY29uc3QgY2hhciogVGNQYXJzZXI6OlBhY2tlZEZpeGVkKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoZGF0YS5jb2RlZF90YWc8VGFnVHlwZT4oKSAhPSAwKSkgeworICAgIC8vIFRyeSBwYXJzaW5nIGFzIG5vbi1wYWNrZWQgcmVwZWF0ZWQ6CisgICAgY29uc3RleHByIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBmYWxsYmFja193dCA9CisgICAgICAgIHNpemVvZihMYXlvdXRUeXBlKSA9PSA0ID8gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzIKKyAgICAgICAgOiBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NDsKKyAgICBJbnZlcnRQYWNrZWQ8ZmFsbGJhY2tfd3Q+KGRhdGEpOworICAgIGlmIChkYXRhLmNvZGVkX3RhZzxUYWdUeXBlPigpID09IDApIHsKKyAgICAgIHJldHVybiBSZXBlYXRlZEZpeGVkPExheW91dFR5cGUsIFRhZ1R5cGU+KFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICAgIH0gZWxzZSB7CisgICAgICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gTWluaVBhcnNlKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICAgIH0KKyAgfQorICBwdHIgKz0gc2l6ZW9mKFRhZ1R5cGUpOworICAvLyBTaW5jZSBjdHgtPlJlYWRQYWNrZWRGaXhlZCBkb2VzIG5vdCB1c2UgVGFpbENhbGw8PiBvciBSZXR1cm48Piwgc3luYyBhbnkKKyAgLy8gcGVuZGluZyBoYXNiaXRzIG5vdzoKKyAgU3luY0hhc2JpdHMobXNnLCBoYXNiaXRzLCB0YWJsZSk7CisgIGF1dG8mIGZpZWxkID0gUmVmQXQ8UmVwZWF0ZWRGaWVsZDxMYXlvdXRUeXBlPj4obXNnLCBkYXRhLm9mZnNldCgpKTsKKyAgaW50IHNpemUgPSBSZWFkU2l6ZSgmcHRyKTsKKyAgLy8gVE9ETyhkbGopOiBhZGQgYSB0YWlsY2FsbGluZyB2YXJpYW50IG9mIFJlYWRQYWNrZWRGaXhlZC4KKyAgcmV0dXJuIGN0eC0+UmVhZFBhY2tlZEZpeGVkKHB0ciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlcGVhdGVkRmllbGQ8TGF5b3V0VHlwZT4qPigmZmllbGQpKTsKK30KKworY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RGMzJQMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBQYWNrZWRGaXhlZDx1aW50MzJfdCwgdWludDhfdD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0RjMyUDIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gUGFja2VkRml4ZWQ8dWludDMyX3QsIHVpbnQxNl90PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RGNjRQMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBQYWNrZWRGaXhlZDx1aW50NjRfdCwgdWludDhfdD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0RjY0UDIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gUGFja2VkRml4ZWQ8dWludDY0X3QsIHVpbnQxNl90PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZhcmludCBmaWVsZHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgeworCisvLyBTaGlmdCAiYnl0ZSIgbGVmdCBieSBuICogNyBiaXRzLCBmaWxsaW5nIHZhY2F0ZWQgYml0cyB3aXRoIG9uZXMuCit0ZW1wbGF0ZSA8aW50IG4+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB1aW50NjRfdAorc2hpZnRfbGVmdF9maWxsX3dpdGhfb25lcyh1aW50NjRfdCBieXRlLCB1aW50NjRfdCBvbmVzKSB7CisgIHJldHVybiAoYnl0ZSA8PCAobiAqIDcpKSB8IChvbmVzID4+ICg2NCAtIChuICogNykpKTsKK30KKworLy8gU2hpZnQgImJ5dGUiIGxlZnQgYnkgbiAqIDcgYml0cywgZmlsbGluZyB2YWNhdGVkIGJpdHMgd2l0aCBvbmVzLCBhbmQKKy8vIHB1dCB0aGUgbmV3IHZhbHVlIGluIHJlcy4gIFJldHVybiB3aGV0aGVyIHRoZSByZXN1bHQgd2FzIG5lZ2F0aXZlLgordGVtcGxhdGUgPGludCBuPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgYm9vbCBzaGlmdF9sZWZ0X2ZpbGxfd2l0aF9vbmVzX3dhc19uZWdhdGl2ZSgKKyAgICB1aW50NjRfdCBieXRlLCB1aW50NjRfdCBvbmVzLCBpbnQ2NF90JiByZXMpIHsKKyNpZiBkZWZpbmVkKF9fR0NDX0FTTV9GTEFHX09VVFBVVFNfXykgJiYgZGVmaW5lZChfX3g4Nl82NF9fKQorICAvLyBGb3IgdGhlIGZpcnN0IHR3byByb3VuZHMgKHB0clsxXSBhbmQgcHRyWzJdKSwgbWljcm8gYmVuY2htYXJrcyBzaG93IGEKKyAgLy8gc3Vic3RhbnRpYWwgaW1wcm92ZW1lbnQgZnJvbSBjYXB0dXJpbmcgdGhlIHNpZ24gZnJvbSB0aGUgY29uZGl0aW9uIGNvZGUKKyAgLy8gcmVnaXN0ZXIgb24geDg2LTY0LgorICBib29sIHNpZ25fYml0OworICBhc20oInNobGRxICUzLCAlMiwgJTEiCisgICAgICA6ICI9QGNjcyIoc2lnbl9iaXQpLCAiK3IiKGJ5dGUpCisgICAgICA6ICJyIihvbmVzKSwgImkiKG4gKiA3KSk7CisgIHJlcyA9IGJ5dGU7CisgIHJldHVybiBzaWduX2JpdDsKKyNlbHNlCisgIC8vIEdlbmVyaWMgZmFsbGJhY2s6CisgIHJlcyA9IChieXRlIDw8IChuICogNykpIHwgKG9uZXMgPj4gKDY0IC0gKG4gKiA3KSkpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50NjRfdD4ocmVzKSA8IDA7CisjZW5kaWYKK30KKworaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgc3RkOjpwYWlyPGNvbnN0IGNoYXIqLCB1aW50NjRfdD4KK1BhcnNlNjRGYWxsYmFja1BhaXIoY29uc3QgY2hhciogcCwgaW50NjRfdCByZXMxKSB7CisgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQ4X3QqPihwKTsKKworICAvLyBUaGUgYWxnb3JpdGhtIHJlbGllcyBvbiBzaWduIGV4dGVuc2lvbiBmb3IgZWFjaCBieXRlIHRvIHNldCBhbGwgaGlnaCBiaXRzCisgIC8vIHdoZW4gdGhlIHZhcmludCBjb250aW51ZXMuIEl0IGFsc28gcmVsaWVzIG9uIGFzc2VydGluZyBhbGwgb2YgdGhlIGxvd2VyCisgIC8vIGJpdHMgZm9yIGVhY2ggc3VjY2Vzc2l2ZSBieXRlIHJlYWQuIFRoaXMgYWxsb3dzIHRoZSByZXN1bHQgdG8gYmUgYWdncmVnYXRlZAorICAvLyB1c2luZyBhIGJpdHdpc2UgQU5ELiBGb3IgZXhhbXBsZToKKyAgLy8KKyAgLy8gICAgICAgICAgOCAgICAgICAxICAgICAgICAgIDY0ICAgICA1NyAuLi4gMjQgICAgIDE3ICAxNiAgICAgIDkgIDggICAgICAgMQorICAvLyBwdHJbMF0gPSAxYWFhIGFhYWEgOyByZXMxID0gMTExMSAxMTExIC4uLiAxMTExIDExMTEgIDExMTEgMTExMSAgMWFhYSBhYWFhCisgIC8vIHB0clsxXSA9IDFiYmIgYmJiYiA7IHJlczIgPSAxMTExIDExMTEgLi4uIDExMTEgMTExMSAgMTFiYiBiYmJiICBiMTExIDExMTEKKyAgLy8gcHRyWzJdID0gMWNjYyBjY2NjIDsgcmVzMyA9IDAwMDAgMDAwMCAuLi4gMDAwYyBjY2NjICBjYzExIDExMTEgIDExMTEgMTExMQorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vICAgICAgICByZXMxICYgcmVzMiAmIHJlczMgPSAwMDAwIDAwMDAgLi4uIDAwMGMgY2NjYyAgY2NiYiBiYmJiICBiYWFhIGFhYWEKKyAgLy8KKyAgLy8gT24geDg2LTY0LCBhIHNobGQgZnJvbSBhIHNpbmdsZSByZWdpc3RlciBmaWxsZWQgd2l0aCBlbm91Z2ggMXMgaW4gdGhlIGhpZ2gKKyAgLy8gYml0cyBjYW4gYWNjb21wbGlzaCBhbGwgdGhpcyBpbiBvbmUgaW5zdHJ1Y3Rpb24uIEl0IHNvIGhhcHBlbnMgdGhhdCByZXMxCisgIC8vIGhhcyA1NyBoaWdoIGJpdHMgb2Ygb25lcywgd2hpY2ggaXMgZW5vdWdoIGZvciB0aGUgbGFyZ2VzdCBzaGlmdCBkb25lLgorICBHT09HTEVfRENIRUNLX0VRKHJlczEgPj4gNywgLTEpOworICB1aW50NjRfdCBvbmVzID0gcmVzMTsgIC8vIHNhdmUgdGhlIGhpZ2ggMSBiaXRzIGZyb20gcmVzMSAoaW5wdXQgdG8gU0hMRCkKKyAgaW50NjRfdCByZXMyLCByZXMzOyAgICAvLyBhY2N1bXVsYXRlZCByZXN1bHQgY2h1bmtzCisKKyAgaWYgKCFzaGlmdF9sZWZ0X2ZpbGxfd2l0aF9vbmVzX3dhc19uZWdhdGl2ZTwxPihwdHJbMV0sIG9uZXMsIHJlczIpKQorICAgIGdvdG8gZG9uZTI7CisgIGlmICghc2hpZnRfbGVmdF9maWxsX3dpdGhfb25lc193YXNfbmVnYXRpdmU8Mj4ocHRyWzJdLCBvbmVzLCByZXMzKSkKKyAgICBnb3RvIGRvbmUzOworCisgIC8vIEZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBjaHVua3MsIGNoZWNrIHRoZSBzaWduIG9mIHRoZSBBTkQgcmVzdWx0LgorICByZXMxICY9IHNoaWZ0X2xlZnRfZmlsbF93aXRoX29uZXM8Mz4ocHRyWzNdLCBvbmVzKTsKKyAgaWYgKHJlczEgPj0gMCkgZ290byBkb25lNDsKKyAgcmVzMiAmPSBzaGlmdF9sZWZ0X2ZpbGxfd2l0aF9vbmVzPDQ+KHB0cls0XSwgb25lcyk7CisgIGlmIChyZXMyID49IDApIGdvdG8gZG9uZTU7CisgIHJlczMgJj0gc2hpZnRfbGVmdF9maWxsX3dpdGhfb25lczw1PihwdHJbNV0sIG9uZXMpOworICBpZiAocmVzMyA+PSAwKSBnb3RvIGRvbmU2OworICByZXMxICY9IHNoaWZ0X2xlZnRfZmlsbF93aXRoX29uZXM8Nj4ocHRyWzZdLCBvbmVzKTsKKyAgaWYgKHJlczEgPj0gMCkgZ290byBkb25lNzsKKyAgcmVzMiAmPSBzaGlmdF9sZWZ0X2ZpbGxfd2l0aF9vbmVzPDc+KHB0cls3XSwgb25lcyk7CisgIGlmIChyZXMyID49IDApIGdvdG8gZG9uZTg7CisgIHJlczMgJj0gc2hpZnRfbGVmdF9maWxsX3dpdGhfb25lczw4PihwdHJbOF0sIG9uZXMpOworICBpZiAocmVzMyA+PSAwKSBnb3RvIGRvbmU5OworCisgIC8vIEZvciB2YWxpZCA2NGJpdCB2YXJpbnRzLCB0aGUgMTB0aCBieXRlL3B0cls5XSBzaG91bGQgYmUgZXhhY3RseSAxLiBJbiB0aGlzCisgIC8vIGNhc2UsIHRoZSBjb250aW51YXRpb24gYml0IG9mIHB0cls4XSBhbHJlYWR5IHNldCB0aGUgdG9wIGJpdCBvZiByZXMzCisgIC8vIGNvcnJlY3RseSwgc28gYWxsIHdlIGhhdmUgdG8gZG8gaXMgY2hlY2sgdGhhdCB0aGUgZXhwZWN0ZWQgY2FzZSBpcyB0cnVlLgorICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHB0cls5XSA9PSAxKSkgZ290byBkb25lMTA7CisKKyAgLy8gQSB2YWx1ZSBvZiAwLCBob3dldmVyLCByZXByZXNlbnRzIGFuIG92ZXItc2VyaWFsaXplZCB2YXJpbnQuIFRoaXMgY2FzZQorICAvLyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGlmIGRvZXMgKHNheSwgZHVlIHRvIGEgbm9uY29uZm9ybWluZyBzZXJpYWxpemVyKSwKKyAgLy8gZGVhc3NlcnQgdGhlIGNvbnRpbnVhdGlvbiBiaXQgdGhhdCBjYW1lIGZyb20gcHRyWzhdLgorICBpZiAocHRyWzldID09IDApIHsKKyNpZiBkZWZpbmVkKF9fR0NDX0FTTV9GTEFHX09VVFBVVFNfXykgJiYgZGVmaW5lZChfX3g4Nl82NF9fKQorICAgIC8vIFVzZSBhIHNtYWxsIGluc3RydWN0aW9uIHNpbmNlIHRoaXMgaXMgYW4gdW5jb21tb24gY29kZSBwYXRoLgorICAgIGFzbSgiYnRjcSAkNjMsJTAiIDogIityIihyZXMzKSk7CisjZWxzZQorICAgIHJlczMgXj0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KDEpIDw8IDYzOworI2VuZGlmCisgICAgZ290byBkb25lMTA7CisgIH0KKworICAvLyBJZiB0aGUgMTB0aCBieXRlL3B0cls5XSBpdHNlbGYgaGFzIGFueSBvdGhlciB2YWx1ZSwgdGhlbiBpdCBpcyB0b28gYmlnIHRvCisgIC8vIGZpdCBpbiA2NCBiaXRzLiBJZiB0aGUgY29udGludWUgYml0IGlzIHNldCwgaXQgaXMgYW4gdW50ZXJtaW5hdGVkIHZhcmludC4KKyAgcmV0dXJuIHtudWxscHRyLCAwfTsKKworZG9uZTI6CisgIHJldHVybiB7cCArIDIsIHJlczEgJiByZXMyfTsKK2RvbmUzOgorICByZXR1cm4ge3AgKyAzLCByZXMxICYgcmVzMiAmIHJlczN9OworZG9uZTQ6CisgIHJldHVybiB7cCArIDQsIHJlczEgJiByZXMyICYgcmVzM307Citkb25lNToKKyAgcmV0dXJuIHtwICsgNSwgcmVzMSAmIHJlczIgJiByZXMzfTsKK2RvbmU2OgorICByZXR1cm4ge3AgKyA2LCByZXMxICYgcmVzMiAmIHJlczN9OworZG9uZTc6CisgIHJldHVybiB7cCArIDcsIHJlczEgJiByZXMyICYgcmVzM307Citkb25lODoKKyAgcmV0dXJuIHtwICsgOCwgcmVzMSAmIHJlczIgJiByZXMzfTsKK2RvbmU5OgorICByZXR1cm4ge3AgKyA5LCByZXMxICYgcmVzMiAmIHJlczN9OworZG9uZTEwOgorICByZXR1cm4ge3AgKyAxMCwgcmVzMSAmIHJlczIgJiByZXMzfTsKK30KKworaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgY29uc3QgY2hhciogUGFyc2VWYXJpbnQoY29uc3QgY2hhciogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiB2YWx1ZSkgeworICBpbnQ2NF90IGJ5dGUgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KCpwKTsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShieXRlID49IDApKSB7CisgICAgKnZhbHVlID0gYnl0ZTsKKyAgICByZXR1cm4gcCArIDE7CisgIH0gZWxzZSB7CisgICAgYXV0byB0bXAgPSBQYXJzZTY0RmFsbGJhY2tQYWlyKHAsIGJ5dGUpOworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUodG1wLmZpcnN0KSkgKnZhbHVlID0gdG1wLnNlY29uZDsKKyAgICByZXR1cm4gdG1wLmZpcnN0OworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGaWVsZFR5cGUsIGJvb2wgemlnemFnID0gZmFsc2U+CitpbmxpbmUgRmllbGRUeXBlIFppZ1phZ0RlY29kZUhlbHBlcih1aW50NjRfdCB2YWx1ZSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8RmllbGRUeXBlPih2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MzJfdCBaaWdaYWdEZWNvZGVIZWxwZXI8aW50MzJfdCwgdHJ1ZT4odWludDY0X3QgdmFsdWUpIHsKKyAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdEZWNvZGUzMih2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50NjRfdCBaaWdaYWdEZWNvZGVIZWxwZXI8aW50NjRfdCwgdHJ1ZT4odWludDY0X3QgdmFsdWUpIHsKKyAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdEZWNvZGU2NCh2YWx1ZSk7Cit9CisKK2Jvb2wgRW51bUlzVmFsaWRBdXgoaW50MzJfdCB2YWwsIHVpbnQxNl90IHhmb3JtX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgVGNQYXJzZVRhYmxlQmFzZTo6RmllbGRBdXggYXV4KSB7CisgIGlmICh4Zm9ybV92YWwgPT0gZmllbGRfbGF5b3V0OjprVHZSYW5nZSkgeworICAgIGF1dG8gbG8gPSBhdXguZW51bV9yYW5nZS5zdGFydDsKKyAgICByZXR1cm4gbG8gPD0gdmFsICYmIHZhbCA8IChsbyArIGF1eC5lbnVtX3JhbmdlLmxlbmd0aCk7CisgIH0KKyAgcmV0dXJuIGF1eC5lbnVtX3ZhbGlkYXRvcih2YWwpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpZWxkVHlwZSwgdHlwZW5hbWUgVGFnVHlwZSwgYm9vbCB6aWd6YWc+CitQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIGNvbnN0IGNoYXIqIFRjUGFyc2VyOjpTaW5ndWxhclZhcmludCgKKyAgICBQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKGRhdGEuY29kZWRfdGFnPFRhZ1R5cGU+KCkgIT0gMCkpIHsKKyAgICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gTWluaVBhcnNlKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICB9CisgIHB0ciArPSBzaXplb2YoVGFnVHlwZSk7ICAvLyBDb25zdW1lIHRhZworICBoYXNiaXRzIHw9ICh1aW50NjRfdHsxfSA8PCBkYXRhLmhhc2JpdF9pZHgoKSk7CisKKyAgLy8gY2xhbmcgaXNuJ3Qgc21hcnQgZW5vdWdoIHRvIGJlIGFibGUgdG8gb25seSBjb25kaXRpb25hbGx5IHNhdmUKKyAgLy8gcmVnaXN0ZXJzIHRvIHRoZSBzdGFjaywgc28gd2UgdHVybiB0aGUgaW50ZWdlci1ncmVhdGVyLXRoYW4tMTI4CisgIC8vIGNhc2UgaW50byBhIHNlcGFyYXRlIHJvdXRpbmUuCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKHN0YXRpY19jYXN0PGludDhfdD4oKnB0cikgPCAwKSkgeworICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBTaW5ndWxhclZhckJpZ2ludDxGaWVsZFR5cGUsIFRhZ1R5cGUsIHppZ3phZz4oCisgICAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICB9CisKKyAgUmVmQXQ8RmllbGRUeXBlPihtc2csIGRhdGEub2Zmc2V0KCkpID0KKyAgICAgIFppZ1phZ0RlY29kZUhlbHBlcjxGaWVsZFR5cGUsIHppZ3phZz4oc3RhdGljX2Nhc3Q8dWludDhfdD4oKnB0cisrKSk7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBUb1RhZ0Rpc3BhdGNoKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmllbGRUeXBlLCB0eXBlbmFtZSBUYWdUeXBlLCBib29sIHppZ3phZz4KK1BST1RPQlVGX05PSU5MSU5FIGNvbnN0IGNoYXIqIFRjUGFyc2VyOjpTaW5ndWxhclZhckJpZ2ludCgKKyAgICBQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIC8vIEZvciBzb21lIHJlYXNvbiBjbGFuZyB3YW50cyB0byBzYXZlIDUgcmVnaXN0ZXJzIHRvIHRoZSBzdGFjayBoZXJlLAorICAvLyBidXQgd2Ugb25seSBuZWVkIGZvdXIgZm9yIHRoaXMgY29kZSwgc28gc2F2ZSB0aGUgZGF0YSB3ZSBkb24ndCBuZWVkCisgIC8vIHRvIHRoZSBzdGFjay4gIEhhcHBpbHksIHNhdmluZyB0aGVtIHRoaXMgd2F5IHVzZXMgcmVndWxhciBzdG9yZQorICAvLyBpbnN0cnVjdGlvbnMgcmF0aGVyIHRoYW4gUFVTSC9QT1AsIHdoaWNoIHNhdmVzIHRpbWUgYXQgdGhlIGNvc3Qgb2YgZ3JlYXRlcgorICAvLyBjb2RlIHNpemUsIGJ1dCBmb3IgdGhpcyBoZWF2aWx5LXVzZWQgcGllY2Ugb2YgY29kZSwgdGhhdCdzIGZpbmUuCisgIHN0cnVjdCBTcGlsbCB7CisgICAgdWludDY0X3QgZmllbGRfZGF0YTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKiBtc2c7CisgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6VGNQYXJzZVRhYmxlQmFzZSogdGFibGU7CisgICAgdWludDY0X3QgaGFzYml0czsKKyAgfTsKKyAgdm9sYXRpbGUgU3BpbGwgc3BpbGwgPSB7ZGF0YS5kYXRhLCBtc2csIHRhYmxlLCBoYXNiaXRzfTsKKworICB1aW50NjRfdCB0bXA7CisgIFBST1RPQlVGX0FTU1VNRShzdGF0aWNfY2FzdDxpbnQ4X3Q+KCpwdHIpIDwgMCk7CisgIHB0ciA9IFBhcnNlVmFyaW50KHB0ciwgJnRtcCk7CisKKyAgZGF0YS5kYXRhID0gc3BpbGwuZmllbGRfZGF0YTsKKyAgbXNnID0gc3BpbGwubXNnOworICB0YWJsZSA9IHNwaWxsLnRhYmxlOworICBoYXNiaXRzID0gc3BpbGwuaGFzYml0czsKKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShwdHIgPT0gbnVsbHB0cikpIHsKKyAgICByZXR1cm4gRXJyb3IoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgIH0KKyAgUmVmQXQ8RmllbGRUeXBlPihtc2csIGRhdGEub2Zmc2V0KCkpID0KKyAgICAgIFppZ1phZ0RlY29kZUhlbHBlcjxGaWVsZFR5cGUsIHppZ3phZz4odG1wKTsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFRvVGFnRGlzcGF0Y2goUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0VjhTMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBTaW5ndWxhclZhcmludDxib29sLCB1aW50OF90PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RWOFMyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFNpbmd1bGFyVmFyaW50PGJvb2wsIHVpbnQxNl90PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RWMzJTMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBTaW5ndWxhclZhcmludDx1aW50MzJfdCwgdWludDhfdD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0VjMyUzIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gU2luZ3VsYXJWYXJpbnQ8dWludDMyX3QsIHVpbnQxNl90PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RWNjRTMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBTaW5ndWxhclZhcmludDx1aW50NjRfdCwgdWludDhfdD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0VjY0UzIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gU2luZ3VsYXJWYXJpbnQ8dWludDY0X3QsIHVpbnQxNl90PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFozMlMxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFNpbmd1bGFyVmFyaW50PGludDMyX3QsIHVpbnQ4X3QsIHRydWU+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9Citjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFozMlMyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFNpbmd1bGFyVmFyaW50PGludDMyX3QsIHVpbnQxNl90LCB0cnVlPigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RaNjRTMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBTaW5ndWxhclZhcmludDxpbnQ2NF90LCB1aW50OF90LCB0cnVlPigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RaNjRTMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBTaW5ndWxhclZhcmludDxpbnQ2NF90LCB1aW50MTZfdCwgdHJ1ZT4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpZWxkVHlwZSwgdHlwZW5hbWUgVGFnVHlwZSwgYm9vbCB6aWd6YWc+CitQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIGNvbnN0IGNoYXIqIFRjUGFyc2VyOjpSZXBlYXRlZFZhcmludCgKKyAgICBQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKGRhdGEuY29kZWRfdGFnPFRhZ1R5cGU+KCkgIT0gMCkpIHsKKyAgICAvLyBUcnkgcGFyc2luZyBhcyBub24tcGFja2VkIHJlcGVhdGVkOgorICAgIEludmVydFBhY2tlZDxXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UPihkYXRhKTsKKyAgICBpZiAoZGF0YS5jb2RlZF90YWc8VGFnVHlwZT4oKSA9PSAwKSB7CisgICAgICByZXR1cm4gUGFja2VkVmFyaW50PEZpZWxkVHlwZSwgVGFnVHlwZSwgemlnemFnPihQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgICB9IGVsc2UgeworICAgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIE1pbmlQYXJzZShQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgICB9CisgIH0KKyAgYXV0byYgZmllbGQgPSBSZWZBdDxSZXBlYXRlZEZpZWxkPEZpZWxkVHlwZT4+KG1zZywgZGF0YS5vZmZzZXQoKSk7CisgIGF1dG8gZXhwZWN0ZWRfdGFnID0gVW5hbGlnbmVkTG9hZDxUYWdUeXBlPihwdHIpOworICBkbyB7CisgICAgcHRyICs9IHNpemVvZihUYWdUeXBlKTsKKyAgICB1aW50NjRfdCB0bXA7CisgICAgcHRyID0gUGFyc2VWYXJpbnQocHRyLCAmdG1wKTsKKyAgICBpZiAocHRyID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBFcnJvcihQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgICB9CisgICAgZmllbGQuQWRkKFppZ1phZ0RlY29kZUhlbHBlcjxGaWVsZFR5cGUsIHppZ3phZz4odG1wKSk7CisgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9IHdoaWxlIChVbmFsaWduZWRMb2FkPFRhZ1R5cGU+KHB0cikgPT0gZXhwZWN0ZWRfdGFnKTsKKyAgcmV0dXJuIFRvUGFyc2VMb29wKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFY4UjEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gUmVwZWF0ZWRWYXJpbnQ8Ym9vbCwgdWludDhfdD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0VjhSMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBSZXBlYXRlZFZhcmludDxib29sLCB1aW50MTZfdD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0VjMyUjEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gUmVwZWF0ZWRWYXJpbnQ8dWludDMyX3QsIHVpbnQ4X3Q+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9Citjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFYzMlIyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFJlcGVhdGVkVmFyaW50PHVpbnQzMl90LCB1aW50MTZfdD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0VjY0UjEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gUmVwZWF0ZWRWYXJpbnQ8dWludDY0X3QsIHVpbnQ4X3Q+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9Citjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFY2NFIyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFJlcGVhdGVkVmFyaW50PHVpbnQ2NF90LCB1aW50MTZfdD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KKworY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RaMzJSMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBSZXBlYXRlZFZhcmludDxpbnQzMl90LCB1aW50OF90LCB0cnVlPigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RaMzJSMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBSZXBlYXRlZFZhcmludDxpbnQzMl90LCB1aW50MTZfdCwgdHJ1ZT4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0WjY0UjEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gUmVwZWF0ZWRWYXJpbnQ8aW50NjRfdCwgdWludDhfdCwgdHJ1ZT4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0WjY0UjIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gUmVwZWF0ZWRWYXJpbnQ8aW50NjRfdCwgdWludDE2X3QsIHRydWU+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKKy8vIFNlZSBjb21tZW50IG9uIFBhY2tlZEZpeGVkIGZvciB3aHkgdGhpcyBpcyBub3QgUFJPVE9CVUZfQUxXQVlTX0lOTElORS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGaWVsZFR5cGUsIHR5cGVuYW1lIFRhZ1R5cGUsIGJvb2wgemlnemFnPgorY29uc3QgY2hhciogVGNQYXJzZXI6OlBhY2tlZFZhcmludChQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKGRhdGEuY29kZWRfdGFnPFRhZ1R5cGU+KCkgIT0gMCkpIHsKKyAgICBJbnZlcnRQYWNrZWQ8V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVD4oZGF0YSk7CisgICAgaWYgKGRhdGEuY29kZWRfdGFnPFRhZ1R5cGU+KCkgPT0gMCkgeworICAgICAgcmV0dXJuIFJlcGVhdGVkVmFyaW50PEZpZWxkVHlwZSwgVGFnVHlwZSwgemlnemFnPihQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgICB9IGVsc2UgeworICAgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIE1pbmlQYXJzZShQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgICB9CisgIH0KKyAgcHRyICs9IHNpemVvZihUYWdUeXBlKTsKKyAgLy8gU2luY2UgY3R4LT5SZWFkUGFja2VkVmFyaW50IGRvZXMgbm90IHVzZSBUYWlsQ2FsbCBvciBSZXR1cm4sIHN5bmMgYW55CisgIC8vIHBlbmRpbmcgaGFzYml0cyBub3c6CisgIFN5bmNIYXNiaXRzKG1zZywgaGFzYml0cywgdGFibGUpOworICBhdXRvKiBmaWVsZCA9ICZSZWZBdDxSZXBlYXRlZEZpZWxkPEZpZWxkVHlwZT4+KG1zZywgZGF0YS5vZmZzZXQoKSk7CisgIHJldHVybiBjdHgtPlJlYWRQYWNrZWRWYXJpbnQocHRyLCBbZmllbGRdKHVpbnQ2NF90IHZhcmludCkgeworICAgIEZpZWxkVHlwZSB2YWw7CisgICAgaWYgKHppZ3phZykgeworICAgICAgaWYgKHNpemVvZihGaWVsZFR5cGUpID09IDgpIHsKKyAgICAgICAgdmFsID0gV2lyZUZvcm1hdExpdGU6OlppZ1phZ0RlY29kZTY0KHZhcmludCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YWwgPSBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRGVjb2RlMzIodmFyaW50KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdmFsID0gdmFyaW50OworICAgIH0KKyAgICBmaWVsZC0+QWRkKHZhbCk7CisgIH0pOworfQorCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFY4UDEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gUGFja2VkVmFyaW50PGJvb2wsIHVpbnQ4X3Q+KFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RWOFAyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFBhY2tlZFZhcmludDxib29sLCB1aW50MTZfdD4oUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9Citjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFYzMlAxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFBhY2tlZFZhcmludDx1aW50MzJfdCwgdWludDhfdD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0VjMyUDIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gUGFja2VkVmFyaW50PHVpbnQzMl90LCB1aW50MTZfdD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0VjY0UDEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gUGFja2VkVmFyaW50PHVpbnQ2NF90LCB1aW50OF90PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RWNjRQMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBQYWNrZWRWYXJpbnQ8dWludDY0X3QsIHVpbnQxNl90PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFozMlAxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFBhY2tlZFZhcmludDxpbnQzMl90LCB1aW50OF90LCB0cnVlPigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RaMzJQMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBQYWNrZWRWYXJpbnQ8aW50MzJfdCwgdWludDE2X3QsIHRydWU+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9Citjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFo2NFAxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFBhY2tlZFZhcmludDxpbnQ2NF90LCB1aW50OF90LCB0cnVlPigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RaNjRQMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBQYWNrZWRWYXJpbnQ8aW50NjRfdCwgdWludDE2X3QsIHRydWU+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRW51bSBmaWVsZHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQUk9UT0JVRl9OT0lOTElORSBjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFVua25vd25FbnVtRmFsbGJhY2soCisgICAgUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICAodm9pZCltc2c7CisgICh2b2lkKWN0eDsKKyAgKHZvaWQpaGFzYml0czsKKworICAvLyBJZiB3ZSBrbm93IHdlIHdhbnQgdG8gcHV0IHRoaXMgZmllbGQgZGlyZWN0bHkgaW50byB0aGUgdW5rbm93biBmaWVsZCBzZXQsCisgIC8vIHRoZW4gd2UgY2FuIHNraXAgdGhlIGNhbGwgdG8gTWluaVBhcnNlIGFuZCBkaXJlY3RseSBjYWxsIHRhYmxlLT5mYWxsYmFjay4KKyAgLy8gSG93ZXZlciwgd2UgZmlyc3QgaGF2ZSB0byB1cGRhdGUgYGRhdGFgIHRvIGNvbnRhaW4gdGhlIGRlY29kZWQgdGFnLgorICB1aW50MzJfdCB0YWc7CisgIHB0ciA9IFJlYWRUYWcocHRyLCAmdGFnKTsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UocHRyID09IG51bGxwdHIpKSB7CisgICAgcmV0dXJuIEVycm9yKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICB9CisgIGRhdGEuZGF0YSA9IHRhZzsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIHRhYmxlLT5mYWxsYmFjayhQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRhZ1R5cGUsIHVpbnQxNl90IHhmb3JtX3ZhbD4KK1BST1RPQlVGX0FMV0FZU19JTkxJTkUgY29uc3QgY2hhciogVGNQYXJzZXI6OlNpbmd1bGFyRW51bSgKKyAgICBQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKGRhdGEuY29kZWRfdGFnPFRhZ1R5cGU+KCkgIT0gMCkpIHsKKyAgICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gTWluaVBhcnNlKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICB9CisgIGNvbnN0IGNoYXIqIHB0cjIgPSBwdHI7ICAvLyBTYXZlIGZvciB1bmtub3duIGVudW0gY2FzZQorICBwdHIgKz0gc2l6ZW9mKFRhZ1R5cGUpOyAgLy8gQ29uc3VtZSB0YWcKKyAgdWludDY0X3QgdG1wOworICBwdHIgPSBQYXJzZVZhcmludChwdHIsICZ0bXApOworICBpZiAocHRyID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gRXJyb3IoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgIH0KKyAgY29uc3QgVGNQYXJzZVRhYmxlQmFzZTo6RmllbGRBdXggYXV4ID0gKnRhYmxlLT5maWVsZF9hdXgoZGF0YS5hdXhfaWR4KCkpOworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSgKKyAgICAgICAgICAhRW51bUlzVmFsaWRBdXgoc3RhdGljX2Nhc3Q8aW50MzJfdD4odG1wKSwgeGZvcm1fdmFsLCBhdXgpKSkgeworICAgIHB0ciA9IHB0cjI7CisgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIEZhc3RVbmtub3duRW51bUZhbGxiYWNrKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICB9CisgIGhhc2JpdHMgfD0gKHVpbnQ2NF90ezF9IDw8IGRhdGEuaGFzYml0X2lkeCgpKTsKKyAgUmVmQXQ8aW50MzJfdD4obXNnLCBkYXRhLm9mZnNldCgpKSA9IHRtcDsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFRvVGFnRGlzcGF0Y2goUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0RXJTMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBTaW5ndWxhckVudW08dWludDhfdCwgZmllbGRfbGF5b3V0OjprVHZSYW5nZT4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0RXJTMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBTaW5ndWxhckVudW08dWludDE2X3QsIGZpZWxkX2xheW91dDo6a1R2UmFuZ2U+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9Citjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdEV2UzEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gU2luZ3VsYXJFbnVtPHVpbnQ4X3QsIGZpZWxkX2xheW91dDo6a1R2RW51bT4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0RXZTMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBTaW5ndWxhckVudW08dWludDE2X3QsIGZpZWxkX2xheW91dDo6a1R2RW51bT4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRhZ1R5cGUsIHVpbnQxNl90IHhmb3JtX3ZhbD4KK1BST1RPQlVGX0FMV0FZU19JTkxJTkUgY29uc3QgY2hhciogVGNQYXJzZXI6OlJlcGVhdGVkRW51bSgKKyAgICBQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKGRhdGEuY29kZWRfdGFnPFRhZ1R5cGU+KCkgIT0gMCkpIHsKKyAgICBJbnZlcnRQYWNrZWQ8V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVD4oZGF0YSk7CisgICAgaWYgKGRhdGEuY29kZWRfdGFnPFRhZ1R5cGU+KCkgPT0gMCkgeworICAgICAgLy8gUGFja2VkIHBhcnNpbmcgaXMgaGFuZGxlZCBieSBnZW5lcmF0ZWQgZmFsbGJhY2suCisgICAgICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gRmFzdFVua25vd25FbnVtRmFsbGJhY2soUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgfSBlbHNlIHsKKyAgICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBNaW5pUGFyc2UoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgfQorICB9CisgIGF1dG8mIGZpZWxkID0gUmVmQXQ8UmVwZWF0ZWRGaWVsZDxpbnQzMl90Pj4obXNnLCBkYXRhLm9mZnNldCgpKTsKKyAgYXV0byBleHBlY3RlZF90YWcgPSBVbmFsaWduZWRMb2FkPFRhZ1R5cGU+KHB0cik7CisgIGNvbnN0IFRjUGFyc2VUYWJsZUJhc2U6OkZpZWxkQXV4IGF1eCA9ICp0YWJsZS0+ZmllbGRfYXV4KGRhdGEuYXV4X2lkeCgpKTsKKyAgZG8geworICAgIGNvbnN0IGNoYXIqIHB0cjIgPSBwdHI7ICAvLyBzYXZlIGZvciB1bmtub3duIGVudW0gY2FzZQorICAgIHB0ciArPSBzaXplb2YoVGFnVHlwZSk7CisgICAgdWludDY0X3QgdG1wOworICAgIHB0ciA9IFBhcnNlVmFyaW50KHB0ciwgJnRtcCk7CisgICAgaWYgKHB0ciA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gRXJyb3IoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgfQorICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKAorICAgICAgICAgICAgIUVudW1Jc1ZhbGlkQXV4KHN0YXRpY19jYXN0PGludDMyX3Q+KHRtcCksIHhmb3JtX3ZhbCwgYXV4KSkpIHsKKyAgICAgIC8vIFdlIGNhbiBhdm9pZCBkdXBsaWNhdGUgd29yayBpbiBNaW5pUGFyc2UgYnkgZGlyZWN0bHkgY2FsbGluZworICAgICAgLy8gdGFibGUtPmZhbGxiYWNrLgorICAgICAgcHRyID0gcHRyMjsKKyAgICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBGYXN0VW5rbm93bkVudW1GYWxsYmFjayhQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgICB9CisgICAgZmllbGQuQWRkKHN0YXRpY19jYXN0PGludDMyX3Q+KHRtcCkpOworICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSB3aGlsZSAoVW5hbGlnbmVkTG9hZDxUYWdUeXBlPihwdHIpID09IGV4cGVjdGVkX3RhZyk7CisgIHJldHVybiBUb1BhcnNlTG9vcChQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KKworY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RFclIxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFJlcGVhdGVkRW51bTx1aW50OF90LCBmaWVsZF9sYXlvdXQ6OmtUdlJhbmdlPigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RFclIyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFJlcGVhdGVkRW51bTx1aW50MTZfdCwgZmllbGRfbGF5b3V0OjprVHZSYW5nZT4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0RXZSMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBSZXBlYXRlZEVudW08dWludDhfdCwgZmllbGRfbGF5b3V0OjprVHZFbnVtPigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RFdlIyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFJlcGVhdGVkRW51bTx1aW50MTZfdCwgZmllbGRfbGF5b3V0OjprVHZFbnVtPigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFN0cmluZy9ieXRlcyBmaWVsZHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBEZWZpbmVkIGluIHdpcmVfZm9ybWF0X2xpdGUuY2MKK3ZvaWQgUHJpbnRVVEY4RXJyb3JMb2coU3RyaW5nUGllY2UgbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBmaWVsZF9uYW1lLCBjb25zdCBjaGFyKiBvcGVyYXRpb25fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGVtaXRfc3RhY2t0cmFjZSk7CisKK3ZvaWQgVGNQYXJzZXI6OlJlcG9ydEZhc3RVdGY4RXJyb3IodWludDMyX3QgZGVjb2RlZF90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRjUGFyc2VUYWJsZUJhc2UqIHRhYmxlKSB7CisgIHVpbnQzMl90IGZpZWxkX251bSA9IGRlY29kZWRfdGFnID4+IDM7CisgIGNvbnN0IGF1dG8qIGVudHJ5ID0gRmluZEZpZWxkRW50cnkodGFibGUsIGZpZWxkX251bSk7CisgIFByaW50VVRGOEVycm9yTG9nKE1lc3NhZ2VOYW1lKHRhYmxlKSwgRmllbGROYW1lKHRhYmxlLCBlbnRyeSksICJwYXJzaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCituYW1lc3BhY2UgeworCitQUk9UT0JVRl9OT0lOTElORQorY29uc3QgY2hhciogU2luZ3VsYXJTdHJpbmdQYXJzZXJGYWxsYmFjayhBcmVuYVN0cmluZ1B0ciogcywgY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcHNDb3B5SW5wdXRTdHJlYW0qIHN0cmVhbSkgeworICBpbnQgc2l6ZSA9IFJlYWRTaXplKCZwdHIpOworICBpZiAoIXB0cikgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBzdHJlYW0tPlJlYWRTdHJpbmcocHRyLCBzaXplLCBzLT5NdXRhYmxlTm9Db3B5KG51bGxwdHIpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUYWdUeXBlLCBUY1BhcnNlcjo6VXRmOFR5cGUgdXRmOD4KK1BST1RPQlVGX0FMV0FZU19JTkxJTkUgY29uc3QgY2hhciogVGNQYXJzZXI6OlNpbmd1bGFyU3RyaW5nKAorICAgIFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoZGF0YS5jb2RlZF90YWc8VGFnVHlwZT4oKSAhPSAwKSkgeworICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBNaW5pUGFyc2UoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgIH0KKyAgYXV0byBzYXZlZF90YWcgPSBVbmFsaWduZWRMb2FkPFRhZ1R5cGU+KHB0cik7CisgIHB0ciArPSBzaXplb2YoVGFnVHlwZSk7CisgIGhhc2JpdHMgfD0gKHVpbnQ2NF90ezF9IDw8IGRhdGEuaGFzYml0X2lkeCgpKTsKKyAgYXV0byYgZmllbGQgPSBSZWZBdDxBcmVuYVN0cmluZ1B0cj4obXNnLCBkYXRhLm9mZnNldCgpKTsKKyAgYXV0byBhcmVuYSA9IGN0eC0+ZGF0YSgpLmFyZW5hOworICBpZiAoYXJlbmEpIHsKKyAgICBwdHIgPSBjdHgtPlJlYWRBcmVuYVN0cmluZyhwdHIsICZmaWVsZCwgYXJlbmEpOworICB9IGVsc2UgeworICAgIHB0ciA9IFNpbmd1bGFyU3RyaW5nUGFyc2VyRmFsbGJhY2soJmZpZWxkLCBwdHIsIGN0eCk7CisgIH0KKyAgaWYgKHB0ciA9PSBudWxscHRyKSByZXR1cm4gRXJyb3IoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgIHN3aXRjaCAodXRmOCkgeworICAgIGNhc2Uga05vVXRmODoKKyNpZmRlZiBOREVCVUcKKyAgICBjYXNlIGtVdGY4VmFsaWRhdGVPbmx5OgorI2VuZGlmCisgICAgICByZXR1cm4gVG9QYXJzZUxvb3AoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoSXNTdHJ1Y3R1cmFsbHlWYWxpZFVURjgoZmllbGQuR2V0KCkpKSkgeworICAgICAgICByZXR1cm4gVG9QYXJzZUxvb3AoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgICB9CisgICAgICBSZXBvcnRGYXN0VXRmOEVycm9yKEZhc3REZWNvZGVUYWcoc2F2ZWRfdGFnKSwgdGFibGUpOworICAgICAgcmV0dXJuIHV0ZjggPT0ga1V0ZjggPyBFcnJvcihQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBUb1BhcnNlTG9vcChQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgfQorfQorCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdEJTMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBTaW5ndWxhclN0cmluZzx1aW50OF90LCBrTm9VdGY4PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RCUzIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gU2luZ3VsYXJTdHJpbmc8dWludDE2X3QsIGtOb1V0Zjg+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9Citjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFNTMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBTaW5ndWxhclN0cmluZzx1aW50OF90LCBrVXRmOFZhbGlkYXRlT25seT4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0U1MyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFNpbmd1bGFyU3RyaW5nPHVpbnQxNl90LCBrVXRmOFZhbGlkYXRlT25seT4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0VVMxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFNpbmd1bGFyU3RyaW5nPHVpbnQ4X3QsIGtVdGY4PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RVUzIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gU2luZ3VsYXJTdHJpbmc8dWludDE2X3QsIGtVdGY4PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCisvLyBJbmxpbmVkIHN0cmluZyB2YXJpYW50czoKKworY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RCaVMxKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIE1pbmlQYXJzZShQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0QmlTMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBNaW5pUGFyc2UoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9Citjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFNpUzEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gTWluaVBhcnNlKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RTaVMyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIE1pbmlQYXJzZShQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0VWlTMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBNaW5pUGFyc2UoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9Citjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFVpUzIoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gTWluaVBhcnNlKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGFnVHlwZSwgVGNQYXJzZXI6OlV0ZjhUeXBlIHV0Zjg+CitQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIGNvbnN0IGNoYXIqIFRjUGFyc2VyOjpSZXBlYXRlZFN0cmluZygKKyAgICBQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKGRhdGEuY29kZWRfdGFnPFRhZ1R5cGU+KCkgIT0gMCkpIHsKKyAgICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gTWluaVBhcnNlKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICB9CisgIGF1dG8gZXhwZWN0ZWRfdGFnID0gVW5hbGlnbmVkTG9hZDxUYWdUeXBlPihwdHIpOworICBhdXRvJiBmaWVsZCA9IFJlZkF0PFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Pihtc2csIGRhdGEub2Zmc2V0KCkpOworICBkbyB7CisgICAgcHRyICs9IHNpemVvZihUYWdUeXBlKTsKKyAgICBzdGQ6OnN0cmluZyogc3RyID0gZmllbGQuQWRkKCk7CisgICAgcHRyID0gSW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgIGlmIChwdHIgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIEVycm9yKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICAgIH0KKyAgICBzd2l0Y2ggKHV0ZjgpIHsKKyAgICAgIGNhc2Uga05vVXRmODoKKyNpZmRlZiBOREVCVUcKKyAgICAgIGNhc2Uga1V0ZjhWYWxpZGF0ZU9ubHk6CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKElzU3RydWN0dXJhbGx5VmFsaWRVVEY4KCpzdHIpKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFJlcG9ydEZhc3RVdGY4RXJyb3IoRmFzdERlY29kZVRhZyhleHBlY3RlZF90YWcpLCB0YWJsZSk7CisgICAgICAgIGlmICh1dGY4ID09IGtVdGY4KSByZXR1cm4gRXJyb3IoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgfSB3aGlsZSAoVW5hbGlnbmVkTG9hZDxUYWdUeXBlPihwdHIpID09IGV4cGVjdGVkX3RhZyk7CisgIHJldHVybiBUb1BhcnNlTG9vcChQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KKworY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RCUjEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gUmVwZWF0ZWRTdHJpbmc8dWludDhfdCwga05vVXRmOD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0QlIyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFJlcGVhdGVkU3RyaW5nPHVpbnQxNl90LCBrTm9VdGY4PigKKyAgICAgIFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorY29uc3QgY2hhciogVGNQYXJzZXI6OkZhc3RTUjEoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gUmVwZWF0ZWRTdHJpbmc8dWludDhfdCwga1V0ZjhWYWxpZGF0ZU9ubHk+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9Citjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFNSMihQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBSZXBlYXRlZFN0cmluZzx1aW50MTZfdCwga1V0ZjhWYWxpZGF0ZU9ubHk+KAorICAgICAgUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9Citjb25zdCBjaGFyKiBUY1BhcnNlcjo6RmFzdFVSMShQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBSZXBlYXRlZFN0cmluZzx1aW50OF90LCBrVXRmOD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpGYXN0VVIyKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFJlcGVhdGVkU3RyaW5nPHVpbnQxNl90LCBrVXRmOD4oCisgICAgICBQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNaW5pIHBhcnNpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgeworaW5saW5lIHZvaWQgU2V0SGFzKGNvbnN0IFRjUGFyc2VUYWJsZUJhc2UqIHRhYmxlLCBjb25zdCBGaWVsZEVudHJ5JiBlbnRyeSwKKyAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbXNnLCB1aW50NjRfdCYgaGFzYml0cykgeworICBpbnQzMl90IGhhc19pZHggPSBlbnRyeS5oYXNfaWR4OworICBpZiAoaGFzX2lkeCA8IDMyKSB7CisgICAgaGFzYml0cyB8PSB1aW50NjRfdHsxfSA8PCBoYXNfaWR4OworICB9IGVsc2UgeworICAgIGF1dG8qIGhhc2Jsb2NrcyA9ICZUY1BhcnNlcjo6UmVmQXQ8dWludDMyX3Q+KG1zZywgdGFibGUtPmhhc19iaXRzX29mZnNldCk7CisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQorICAgIGFzbSgiYnRzICUxLCAlMFxuIiA6ICIrbSIoKmhhc2Jsb2NrcykgOiAiciIoaGFzX2lkeCkpOworI2Vsc2UKKyAgICBhdXRvJiBoYXNibG9jayA9IGhhc2Jsb2Nrc1toYXNfaWR4IC8gMzJdOworICAgIGhhc2Jsb2NrIHw9IHVpbnQzMl90ezF9IDw8IChoYXNfaWR4ICUgMzIpOworI2VuZGlmCisgIH0KK30KK30gIC8vIG5hbWVzcGFjZQorCisvLyBEZXN0cm95cyBhbnkgZXhpc3Rpbmcgb25lb2YgdW5pb24gbWVtYmVyIChpZiBuZWNlc3NhcnkpLiBSZXR1cm5zIHRydWUgaWYgdGhlCisvLyBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyB0aGUgb2JqZWN0LCBvciBmYWxzZSBpZiB0aGUgZmllbGQKKy8vIGFscmVhZHkgaGFzIHRoZSBkZXNpcmVkIGNhc2UuCitib29sIFRjUGFyc2VyOjpDaGFuZ2VPbmVvZihjb25zdCBUY1BhcnNlVGFibGVCYXNlKiB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRjUGFyc2VUYWJsZUJhc2U6OkZpZWxkRW50cnkmIGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmllbGRfbnVtLCBQYXJzZUNvbnRleHQqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtc2cpIHsKKyAgLy8gVGhlIF9vbmVvZl9jYXNlXyBhcnJheSBvZmZzZXQgaXMgc3RvcmVkIGluIHRoZSBmaXJzdCBhdXggZW50cnkuCisgIHVpbnQzMl90IG9uZW9mX2Nhc2Vfb2Zmc2V0ID0gdGFibGUtPmZpZWxkX2F1eCgwdSktPm9mZnNldDsKKyAgLy8gVGhlIF9vbmVvZl9jYXNlXyBhcnJheSBpbmRleCBpcyBzdG9yZWQgaW4gdGhlIGhhcy1iaXQgaW5kZXguCisgIHVpbnQzMl90KiBvbmVvZl9jYXNlID0KKyAgICAgICZUY1BhcnNlcjo6UmVmQXQ8dWludDMyX3Q+KG1zZywgb25lb2ZfY2FzZV9vZmZzZXQpICsgZW50cnkuaGFzX2lkeDsKKyAgdWludDMyX3QgY3VycmVudF9jYXNlID0gKm9uZW9mX2Nhc2U7CisgICpvbmVvZl9jYXNlID0gZmllbGRfbnVtOworCisgIGlmIChjdXJyZW50X2Nhc2UgPT0gMCkgeworICAgIC8vIElmIHRoZSBtZW1iZXIgaXMgZW1wdHksIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gY2xlYXIuIENhbGxlciBpcworICAgIC8vIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIG5ldyBtZW1iZXIgb2JqZWN0LgorICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChjdXJyZW50X2Nhc2UgPT0gZmllbGRfbnVtKSB7CisgICAgLy8gSWYgdGhlIG1lbWJlciBpcyBhbHJlYWR5IGFjdGl2ZSwgdGhlbiBpdCBzaG91bGQgYmUgbWVyZ2VkLiBXZSdyZSBkb25lLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBMb29rIHVwIHRoZSB2YWx1ZSB0aGF0IGlzIGFscmVhZHkgc3RvcmVkLCBhbmQgZGlzcG9zZSBvZiBpdCBpZiBuZWNlc3NhcnkuCisgIGNvbnN0IEZpZWxkRW50cnkqIGN1cnJlbnRfZW50cnkgPSBGaW5kRmllbGRFbnRyeSh0YWJsZSwgY3VycmVudF9jYXNlKTsKKyAgdWludDE2X3QgY3VycmVudF9raW5kID0gY3VycmVudF9lbnRyeS0+dHlwZV9jYXJkICYgZmllbGRfbGF5b3V0OjprRmtNYXNrOworICB1aW50MTZfdCBjdXJyZW50X3JlcCA9IGN1cnJlbnRfZW50cnktPnR5cGVfY2FyZCAmIGZpZWxkX2xheW91dDo6a1JlcE1hc2s7CisgIGlmIChjdXJyZW50X2tpbmQgPT0gZmllbGRfbGF5b3V0OjprRmtTdHJpbmcpIHsKKyAgICBzd2l0Y2ggKGN1cnJlbnRfcmVwKSB7CisgICAgICBjYXNlIGZpZWxkX2xheW91dDo6a1JlcEFTdHJpbmc6IHsKKyAgICAgICAgYXV0byYgZmllbGQgPSBSZWZBdDxBcmVuYVN0cmluZ1B0cj4obXNnLCBjdXJyZW50X2VudHJ5LT5vZmZzZXQpOworICAgICAgICBmaWVsZC5EZXN0cm95KCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBmaWVsZF9sYXlvdXQ6OmtSZXBTU3RyaW5nOgorICAgICAgY2FzZSBmaWVsZF9sYXlvdXQ6OmtSZXBJU3RyaW5nOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJzdHJpbmcgcmVwIG5vdCBoYW5kbGVkOiAiCisgICAgICAgICAgICAgICAgICAgIDw8IChjdXJyZW50X3JlcCA+PiBmaWVsZF9sYXlvdXQ6OmtSZXBTaGlmdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfSBlbHNlIGlmIChjdXJyZW50X2tpbmQgPT0gZmllbGRfbGF5b3V0OjprRmtNZXNzYWdlKSB7CisgICAgc3dpdGNoIChjdXJyZW50X3JlcCkgeworICAgICAgY2FzZSBmaWVsZF9sYXlvdXQ6OmtSZXBNZXNzYWdlOgorICAgICAgY2FzZSBmaWVsZF9sYXlvdXQ6OmtSZXBHcm91cDoKKyAgICAgIGNhc2UgZmllbGRfbGF5b3V0OjprUmVwSVdlYWs6IHsKKyAgICAgICAgYXV0byYgZmllbGQgPSBSZWZBdDxNZXNzYWdlTGl0ZSo+KG1zZywgY3VycmVudF9lbnRyeS0+b2Zmc2V0KTsKKyAgICAgICAgaWYgKCFjdHgtPmRhdGEoKS5hcmVuYSkgeworICAgICAgICAgIGRlbGV0ZSBmaWVsZDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAibWVzc2FnZSByZXAgbm90IGhhbmRsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgKGN1cnJlbnRfcmVwID4+IGZpZWxkX2xheW91dDo6a1JlcFNoaWZ0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6TXBGaXhlZChQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIGNvbnN0IGF1dG8mIGVudHJ5ID0gUmVmQXQ8RmllbGRFbnRyeT4odGFibGUsIGRhdGEuZW50cnlfb2Zmc2V0KCkpOworICBjb25zdCB1aW50MTZfdCB0eXBlX2NhcmQgPSBlbnRyeS50eXBlX2NhcmQ7CisgIGNvbnN0IHVpbnQxNl90IGNhcmQgPSB0eXBlX2NhcmQgJiBmaWVsZF9sYXlvdXQ6OmtGY01hc2s7CisKKyAgLy8gQ2hlY2sgZm9yIHJlcGVhdGVkIHBhcnNpbmcgKHdpcmV0eXBlIGZhbGxiYWNrIGlzIGhhbmRsZWQgdGhlcmUpOgorICBpZiAoY2FyZCA9PSBmaWVsZF9sYXlvdXQ6OmtGY1JlcGVhdGVkKSB7CisgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIE1wUmVwZWF0ZWRGaXhlZChQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgfQorICAvLyBDaGVjayBmb3IgbWlzbWF0Y2hlZCB3aXJldHlwZToKKyAgY29uc3QgdWludDE2X3QgcmVwID0gdHlwZV9jYXJkICYgZmllbGRfbGF5b3V0OjprUmVwTWFzazsKKyAgY29uc3QgdWludDMyX3QgZGVjb2RlZF93aXJldHlwZSA9IGRhdGEudGFnKCkgJiA3OworICBpZiAocmVwID09IGZpZWxkX2xheW91dDo6a1JlcDY0Qml0cykgeworICAgIGlmIChkZWNvZGVkX3dpcmV0eXBlICE9IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDY0KSB7CisgICAgICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gdGFibGUtPmZhbGxiYWNrKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX0VRKHJlcCwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGZpZWxkX2xheW91dDo6a1JlcDMyQml0cykpOworICAgIGlmIChkZWNvZGVkX3dpcmV0eXBlICE9IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyKSB7CisgICAgICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gdGFibGUtPmZhbGxiYWNrKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICAgIH0KKyAgfQorICAvLyBTZXQgdGhlIGZpZWxkIHByZXNlbnQ6CisgIGlmIChjYXJkID09IGZpZWxkX2xheW91dDo6a0ZjT3B0aW9uYWwpIHsKKyAgICBTZXRIYXModGFibGUsIGVudHJ5LCBtc2csIGhhc2JpdHMpOworICB9IGVsc2UgaWYgKGNhcmQgPT0gZmllbGRfbGF5b3V0OjprRmNPbmVvZikgeworICAgIENoYW5nZU9uZW9mKHRhYmxlLCBlbnRyeSwgZGF0YS50YWcoKSA+PiAzLCBjdHgsIG1zZyk7CisgIH0KKyAgLy8gQ29weSB0aGUgdmFsdWU6CisgIGlmIChyZXAgPT0gZmllbGRfbGF5b3V0OjprUmVwNjRCaXRzKSB7CisgICAgUmVmQXQ8dWludDY0X3Q+KG1zZywgZW50cnkub2Zmc2V0KSA9IFVuYWxpZ25lZExvYWQ8dWludDY0X3Q+KHB0cik7CisgICAgcHRyICs9IHNpemVvZih1aW50NjRfdCk7CisgIH0gZWxzZSB7CisgICAgUmVmQXQ8dWludDMyX3Q+KG1zZywgZW50cnkub2Zmc2V0KSA9IFVuYWxpZ25lZExvYWQ8dWludDMyX3Q+KHB0cik7CisgICAgcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisgIH0KKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFRvVGFnRGlzcGF0Y2goUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpNcFJlcGVhdGVkRml4ZWQoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBjb25zdCBhdXRvJiBlbnRyeSA9IFJlZkF0PEZpZWxkRW50cnk+KHRhYmxlLCBkYXRhLmVudHJ5X29mZnNldCgpKTsKKyAgY29uc3QgdWludDMyX3QgZGVjb2RlZF90YWcgPSBkYXRhLnRhZygpOworICBjb25zdCB1aW50MzJfdCBkZWNvZGVkX3dpcmV0eXBlID0gZGVjb2RlZF90YWcgJiA3OworCisgIC8vIENoZWNrIGZvciBwYWNrZWQgcmVwZWF0ZWQgZmFsbGJhY2s6CisgIGlmIChkZWNvZGVkX3dpcmV0eXBlID09IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIE1wUGFja2VkRml4ZWQoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgIH0KKworICBjb25zdCB1aW50MTZfdCB0eXBlX2NhcmQgPSBlbnRyeS50eXBlX2NhcmQ7CisgIGNvbnN0IHVpbnQxNl90IHJlcCA9IHR5cGVfY2FyZCAmIGZpZWxkX2xheW91dDo6a1JlcE1hc2s7CisgIGlmIChyZXAgPT0gZmllbGRfbGF5b3V0OjprUmVwNjRCaXRzKSB7CisgICAgaWYgKGRlY29kZWRfd2lyZXR5cGUgIT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQpIHsKKyAgICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiB0YWJsZS0+ZmFsbGJhY2soUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgfQorICAgIGF1dG8mIGZpZWxkID0gUmVmQXQ8UmVwZWF0ZWRGaWVsZDx1aW50NjRfdD4+KG1zZywgZW50cnkub2Zmc2V0KTsKKyAgICBjb25zdGV4cHIgYXV0byBzaXplID0gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICBjb25zdCBjaGFyKiBwdHIyID0gcHRyOworICAgIHVpbnQzMl90IG5leHRfdGFnOworICAgIGRvIHsKKyAgICAgIHB0ciA9IHB0cjI7CisgICAgICAqZmllbGQuQWRkKCkgPSBVbmFsaWduZWRMb2FkPHVpbnQ2NF90PihwdHIpOworICAgICAgcHRyICs9IHNpemU7CisgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgIHB0cjIgPSBSZWFkVGFnKHB0ciwgJm5leHRfdGFnKTsKKyAgICB9IHdoaWxlIChuZXh0X3RhZyA9PSBkZWNvZGVkX3RhZyk7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19FUShyZXAsIHN0YXRpY19jYXN0PHVpbnQxNl90PihmaWVsZF9sYXlvdXQ6OmtSZXAzMkJpdHMpKTsKKyAgICBpZiAoZGVjb2RlZF93aXJldHlwZSAhPSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMikgeworICAgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIHRhYmxlLT5mYWxsYmFjayhQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgICB9CisgICAgYXV0byYgZmllbGQgPSBSZWZBdDxSZXBlYXRlZEZpZWxkPHVpbnQzMl90Pj4obXNnLCBlbnRyeS5vZmZzZXQpOworICAgIGNvbnN0ZXhwciBhdXRvIHNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgIGNvbnN0IGNoYXIqIHB0cjIgPSBwdHI7CisgICAgdWludDMyX3QgbmV4dF90YWc7CisgICAgZG8geworICAgICAgcHRyID0gcHRyMjsKKyAgICAgICpmaWVsZC5BZGQoKSA9IFVuYWxpZ25lZExvYWQ8dWludDMyX3Q+KHB0cik7CisgICAgICBwdHIgKz0gc2l6ZTsKKyAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgcHRyMiA9IFJlYWRUYWcocHRyLCAmbmV4dF90YWcpOworICAgIH0gd2hpbGUgKG5leHRfdGFnID09IGRlY29kZWRfdGFnKTsKKyAgfQorCisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBUb1RhZ0Rpc3BhdGNoKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6TXBQYWNrZWRGaXhlZChQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIGNvbnN0IGF1dG8mIGVudHJ5ID0gUmVmQXQ8RmllbGRFbnRyeT4odGFibGUsIGRhdGEuZW50cnlfb2Zmc2V0KCkpOworICBjb25zdCB1aW50MTZfdCB0eXBlX2NhcmQgPSBlbnRyeS50eXBlX2NhcmQ7CisgIGNvbnN0IHVpbnQzMl90IGRlY29kZWRfd2lyZXR5cGUgPSBkYXRhLnRhZygpICYgNzsKKworICAvLyBDaGVjayBmb3Igbm9uLXBhY2tlZCByZXBlYXRlZCBmYWxsYmFjazoKKyAgaWYgKGRlY29kZWRfd2lyZXR5cGUgIT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gTXBSZXBlYXRlZEZpeGVkKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICB9CisKKyAgLy8gU2luY2UgY3R4LT5SZWFkUGFja2VkRml4ZWQgZG9lcyBub3QgdXNlIFRhaWxDYWxsPD4gb3IgUmV0dXJuPD4sIHN5bmMgYW55CisgIC8vIHBlbmRpbmcgaGFzYml0cyBub3c6CisgIFN5bmNIYXNiaXRzKG1zZywgaGFzYml0cywgdGFibGUpOworCisgIGludCBzaXplID0gUmVhZFNpemUoJnB0cik7CisgIHVpbnQxNl90IHJlcCA9IHR5cGVfY2FyZCAmIGZpZWxkX2xheW91dDo6a1JlcE1hc2s7CisgIGlmIChyZXAgPT0gZmllbGRfbGF5b3V0OjprUmVwNjRCaXRzKSB7CisgICAgYXV0byYgZmllbGQgPSBSZWZBdDxSZXBlYXRlZEZpZWxkPHVpbnQ2NF90Pj4obXNnLCBlbnRyeS5vZmZzZXQpOworICAgIHB0ciA9IGN0eC0+UmVhZFBhY2tlZEZpeGVkKHB0ciwgc2l6ZSwgJmZpZWxkKTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX0VRKHJlcCwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGZpZWxkX2xheW91dDo6a1JlcDMyQml0cykpOworICAgIGF1dG8mIGZpZWxkID0gUmVmQXQ8UmVwZWF0ZWRGaWVsZDx1aW50MzJfdD4+KG1zZywgZW50cnkub2Zmc2V0KTsKKyAgICBwdHIgPSBjdHgtPlJlYWRQYWNrZWRGaXhlZChwdHIsIHNpemUsICZmaWVsZCk7CisgIH0KKworICBpZiAocHRyID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gRXJyb3IoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgIH0KKyAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIFRvVGFnRGlzcGF0Y2goUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpNcFZhcmludChQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIGNvbnN0IGF1dG8mIGVudHJ5ID0gUmVmQXQ8RmllbGRFbnRyeT4odGFibGUsIGRhdGEuZW50cnlfb2Zmc2V0KCkpOworICBjb25zdCB1aW50MTZfdCB0eXBlX2NhcmQgPSBlbnRyeS50eXBlX2NhcmQ7CisgIGNvbnN0IHVpbnQxNl90IGNhcmQgPSB0eXBlX2NhcmQgJiBmaWVsZF9sYXlvdXQ6OmtGY01hc2s7CisKKyAgLy8gQ2hlY2sgZm9yIHJlcGVhdGVkIHBhcnNpbmc6CisgIGlmIChjYXJkID09IGZpZWxkX2xheW91dDo6a0ZjUmVwZWF0ZWQpIHsKKyAgICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gTXBSZXBlYXRlZFZhcmludChQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgfQorICAvLyBDaGVjayBmb3Igd2lyZSB0eXBlIG1pc21hdGNoOgorICBpZiAoKGRhdGEudGFnKCkgJiA3KSAhPSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIHRhYmxlLT5mYWxsYmFjayhQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgfQorICBjb25zdCB1aW50MTZfdCB4Zm9ybV92YWwgPSB0eXBlX2NhcmQgJiBmaWVsZF9sYXlvdXQ6OmtUdk1hc2s7CisgIGNvbnN0IGJvb2wgaXNfemlnemFnID0geGZvcm1fdmFsID09IGZpZWxkX2xheW91dDo6a1R2WmlnWmFnOworICBjb25zdCBib29sIGlzX3ZhbGlkYXRlZF9lbnVtID0geGZvcm1fdmFsICYgZmllbGRfbGF5b3V0OjprVHZFbnVtOworCisgIC8vIFBhcnNlIHRoZSB2YWx1ZToKKyAgY29uc3QgY2hhciogcHRyMiA9IHB0cjsgIC8vIHNhdmUgZm9yIHVua25vd24gZW51bSBjYXNlCisgIHVpbnQ2NF90IHRtcDsKKyAgcHRyID0gUGFyc2VWYXJpbnQocHRyLCAmdG1wKTsKKyAgaWYgKHB0ciA9PSBudWxscHRyKSByZXR1cm4gRXJyb3IoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisKKyAgLy8gVHJhbnNmb3JtIGFuZC9vciB2YWxpZGF0ZSB0aGUgdmFsdWUKKyAgdWludDE2X3QgcmVwID0gdHlwZV9jYXJkICYgZmllbGRfbGF5b3V0OjprUmVwTWFzazsKKyAgaWYgKHJlcCA9PSBmaWVsZF9sYXlvdXQ6OmtSZXA2NEJpdHMpIHsKKyAgICBpZiAoaXNfemlnemFnKSB7CisgICAgICB0bXAgPSBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRGVjb2RlNjQodG1wKTsKKyAgICB9CisgIH0gZWxzZSBpZiAocmVwID09IGZpZWxkX2xheW91dDo6a1JlcDMyQml0cykgeworICAgIGlmIChpc192YWxpZGF0ZWRfZW51bSkgeworICAgICAgaWYgKCFFbnVtSXNWYWxpZEF1eCh0bXAsIHhmb3JtX3ZhbCwgKnRhYmxlLT5maWVsZF9hdXgoJmVudHJ5KSkpIHsKKyAgICAgICAgcHRyID0gcHRyMjsKKyAgICAgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIHRhYmxlLT5mYWxsYmFjayhQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzX3ppZ3phZykgeworICAgICAgdG1wID0gV2lyZUZvcm1hdExpdGU6OlppZ1phZ0RlY29kZTMyKHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXApKTsKKyAgICB9CisgIH0KKworICAvLyBNYXJrIHRoZSBmaWVsZCBhcyBwcmVzZW50OgorICBjb25zdCBib29sIGlzX29uZW9mID0gY2FyZCA9PSBmaWVsZF9sYXlvdXQ6OmtGY09uZW9mOworICBpZiAoY2FyZCA9PSBmaWVsZF9sYXlvdXQ6OmtGY09wdGlvbmFsKSB7CisgICAgU2V0SGFzKHRhYmxlLCBlbnRyeSwgbXNnLCBoYXNiaXRzKTsKKyAgfSBlbHNlIGlmIChpc19vbmVvZikgeworICAgIENoYW5nZU9uZW9mKHRhYmxlLCBlbnRyeSwgZGF0YS50YWcoKSA+PiAzLCBjdHgsIG1zZyk7CisgIH0KKworICBpZiAocmVwID09IGZpZWxkX2xheW91dDo6a1JlcDY0Qml0cykgeworICAgIFJlZkF0PHVpbnQ2NF90Pihtc2csIGVudHJ5Lm9mZnNldCkgPSB0bXA7CisgIH0gZWxzZSBpZiAocmVwID09IGZpZWxkX2xheW91dDo6a1JlcDMyQml0cykgeworICAgIFJlZkF0PHVpbnQzMl90Pihtc2csIGVudHJ5Lm9mZnNldCkgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wKTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX0VRKHJlcCwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGZpZWxkX2xheW91dDo6a1JlcDhCaXRzKSk7CisgICAgUmVmQXQ8Ym9vbD4obXNnLCBlbnRyeS5vZmZzZXQpID0gc3RhdGljX2Nhc3Q8Ym9vbD4odG1wKTsKKyAgfQorCisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBUb1RhZ0Rpc3BhdGNoKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6TXBSZXBlYXRlZFZhcmludChQUk9UT0JVRl9UQ19QQVJBTV9ERUNMKSB7CisgIGNvbnN0IGF1dG8mIGVudHJ5ID0gUmVmQXQ8RmllbGRFbnRyeT4odGFibGUsIGRhdGEuZW50cnlfb2Zmc2V0KCkpOworICBhdXRvIHR5cGVfY2FyZCA9IGVudHJ5LnR5cGVfY2FyZDsKKyAgY29uc3QgdWludDMyX3QgZGVjb2RlZF90YWcgPSBkYXRhLnRhZygpOworICBhdXRvIGRlY29kZWRfd2lyZXR5cGUgPSBkZWNvZGVkX3RhZyAmIDc7CisKKyAgLy8gQ2hlY2sgZm9yIHBhY2tlZCByZXBlYXRlZCBmYWxsYmFjazoKKyAgaWYgKGRlY29kZWRfd2lyZXR5cGUgPT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gTXBQYWNrZWRWYXJpbnQoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgIH0KKyAgLy8gQ2hlY2sgZm9yIHdpcmUgdHlwZSBtaXNtYXRjaDoKKyAgaWYgKGRlY29kZWRfd2lyZXR5cGUgIT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiB0YWJsZS0+ZmFsbGJhY2soUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgIH0KKyAgdWludDE2X3QgeGZvcm1fdmFsID0gKHR5cGVfY2FyZCAmIGZpZWxkX2xheW91dDo6a1R2TWFzayk7CisgIGNvbnN0IGJvb2wgaXNfemlnemFnID0geGZvcm1fdmFsID09IGZpZWxkX2xheW91dDo6a1R2WmlnWmFnOworICBjb25zdCBib29sIGlzX3ZhbGlkYXRlZF9lbnVtID0geGZvcm1fdmFsICYgZmllbGRfbGF5b3V0OjprVHZFbnVtOworCisgIHVpbnQxNl90IHJlcCA9IHR5cGVfY2FyZCAmIGZpZWxkX2xheW91dDo6a1JlcE1hc2s7CisgIGlmIChyZXAgPT0gZmllbGRfbGF5b3V0OjprUmVwNjRCaXRzKSB7CisgICAgYXV0byYgZmllbGQgPSBSZWZBdDxSZXBlYXRlZEZpZWxkPHVpbnQ2NF90Pj4obXNnLCBlbnRyeS5vZmZzZXQpOworICAgIGNvbnN0IGNoYXIqIHB0cjIgPSBwdHI7CisgICAgdWludDMyX3QgbmV4dF90YWc7CisgICAgZG8geworICAgICAgdWludDY0X3QgdG1wOworICAgICAgcHRyID0gUGFyc2VWYXJpbnQocHRyMiwgJnRtcCk7CisgICAgICBpZiAocHRyID09IG51bGxwdHIpIHJldHVybiBFcnJvcihQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgICAgIGZpZWxkLkFkZChpc196aWd6YWcgPyBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRGVjb2RlNjQodG1wKSA6IHRtcCk7CisgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgIHB0cjIgPSBSZWFkVGFnKHB0ciwgJm5leHRfdGFnKTsKKyAgICB9IHdoaWxlIChuZXh0X3RhZyA9PSBkZWNvZGVkX3RhZyk7CisgIH0gZWxzZSBpZiAocmVwID09IGZpZWxkX2xheW91dDo6a1JlcDMyQml0cykgeworICAgIGF1dG8mIGZpZWxkID0gUmVmQXQ8UmVwZWF0ZWRGaWVsZDx1aW50MzJfdD4+KG1zZywgZW50cnkub2Zmc2V0KTsKKyAgICBjb25zdCBjaGFyKiBwdHIyID0gcHRyOworICAgIHVpbnQzMl90IG5leHRfdGFnOworICAgIGRvIHsKKyAgICAgIHVpbnQ2NF90IHRtcDsKKyAgICAgIHB0ciA9IFBhcnNlVmFyaW50KHB0cjIsICZ0bXApOworICAgICAgaWYgKHB0ciA9PSBudWxscHRyKSByZXR1cm4gRXJyb3IoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgICBpZiAoaXNfdmFsaWRhdGVkX2VudW0pIHsKKyAgICAgICAgaWYgKCFFbnVtSXNWYWxpZEF1eCh0bXAsIHhmb3JtX3ZhbCwgKnRhYmxlLT5maWVsZF9hdXgoJmVudHJ5KSkpIHsKKyAgICAgICAgICBwdHIgPSBwdHIyOworICAgICAgICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiB0YWJsZS0+ZmFsbGJhY2soUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoaXNfemlnemFnKSB7CisgICAgICAgIHRtcCA9IFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdEZWNvZGUzMih0bXApOworICAgICAgfQorICAgICAgZmllbGQuQWRkKHRtcCk7CisgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgIHB0cjIgPSBSZWFkVGFnKHB0ciwgJm5leHRfdGFnKTsKKyAgICB9IHdoaWxlIChuZXh0X3RhZyA9PSBkZWNvZGVkX3RhZyk7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19FUShyZXAsIHN0YXRpY19jYXN0PHVpbnQxNl90PihmaWVsZF9sYXlvdXQ6OmtSZXA4Qml0cykpOworICAgIGF1dG8mIGZpZWxkID0gUmVmQXQ8UmVwZWF0ZWRGaWVsZDxib29sPj4obXNnLCBlbnRyeS5vZmZzZXQpOworICAgIGNvbnN0IGNoYXIqIHB0cjIgPSBwdHI7CisgICAgdWludDMyX3QgbmV4dF90YWc7CisgICAgZG8geworICAgICAgdWludDY0X3QgdG1wOworICAgICAgcHRyID0gUGFyc2VWYXJpbnQocHRyMiwgJnRtcCk7CisgICAgICBpZiAocHRyID09IG51bGxwdHIpIHJldHVybiBFcnJvcihQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgICAgIGZpZWxkLkFkZChzdGF0aWNfY2FzdDxib29sPih0bXApKTsKKyAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgcHRyMiA9IFJlYWRUYWcocHRyLCAmbmV4dF90YWcpOworICAgIH0gd2hpbGUgKG5leHRfdGFnID09IGRlY29kZWRfdGFnKTsKKyAgfQorCisgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBUb1RhZ0Rpc3BhdGNoKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6TXBQYWNrZWRWYXJpbnQoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBjb25zdCBhdXRvJiBlbnRyeSA9IFJlZkF0PEZpZWxkRW50cnk+KHRhYmxlLCBkYXRhLmVudHJ5X29mZnNldCgpKTsKKyAgYXV0byB0eXBlX2NhcmQgPSBlbnRyeS50eXBlX2NhcmQ7CisgIGF1dG8gZGVjb2RlZF93aXJldHlwZSA9IGRhdGEudGFnKCkgJiA3OworCisgIC8vIENoZWNrIGZvciBub24tcGFja2VkIHJlcGVhdGVkIGZhbGxiYWNrOgorICBpZiAoZGVjb2RlZF93aXJldHlwZSAhPSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiBNcFJlcGVhdGVkVmFyaW50KFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICB9CisgIHVpbnQxNl90IHhmb3JtX3ZhbCA9ICh0eXBlX2NhcmQgJiBmaWVsZF9sYXlvdXQ6OmtUdk1hc2spOworICBjb25zdCBib29sIGlzX3ppZ3phZyA9IHhmb3JtX3ZhbCA9PSBmaWVsZF9sYXlvdXQ6OmtUdlppZ1phZzsKKyAgY29uc3QgYm9vbCBpc192YWxpZGF0ZWRfZW51bSA9IHhmb3JtX3ZhbCAmIGZpZWxkX2xheW91dDo6a1R2RW51bTsKKyAgaWYgKGlzX3ZhbGlkYXRlZF9lbnVtKSB7CisgICAgLy8gVE9ETyhiLzIwNjg5MDE3MSk6IGhhbmRsZSBlbnVtcworICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiB0YWJsZS0+ZmFsbGJhY2soUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgIH0KKworICAvLyBTaW5jZSBjdHgtPlJlYWRQYWNrZWRGaXhlZCBkb2VzIG5vdCB1c2UgVGFpbENhbGw8PiBvciBSZXR1cm48Piwgc3luYyBhbnkKKyAgLy8gcGVuZGluZyBoYXNiaXRzIG5vdzoKKyAgU3luY0hhc2JpdHMobXNnLCBoYXNiaXRzLCB0YWJsZSk7CisKKyAgdWludDE2X3QgcmVwID0gdHlwZV9jYXJkICYgZmllbGRfbGF5b3V0OjprUmVwTWFzazsKKyAgaWYgKHJlcCA9PSBmaWVsZF9sYXlvdXQ6OmtSZXA2NEJpdHMpIHsKKyAgICBhdXRvKiBmaWVsZCA9ICZSZWZBdDxSZXBlYXRlZEZpZWxkPHVpbnQ2NF90Pj4obXNnLCBlbnRyeS5vZmZzZXQpOworICAgIHJldHVybiBjdHgtPlJlYWRQYWNrZWRWYXJpbnQocHRyLCBbZmllbGQsIGlzX3ppZ3phZ10odWludDY0X3QgdmFsdWUpIHsKKyAgICAgIGZpZWxkLT5BZGQoaXNfemlnemFnID8gV2lyZUZvcm1hdExpdGU6OlppZ1phZ0RlY29kZTY0KHZhbHVlKSA6IHZhbHVlKTsKKyAgICB9KTsKKyAgfSBlbHNlIGlmIChyZXAgPT0gZmllbGRfbGF5b3V0OjprUmVwMzJCaXRzKSB7CisgICAgYXV0byogZmllbGQgPSAmUmVmQXQ8UmVwZWF0ZWRGaWVsZDx1aW50MzJfdD4+KG1zZywgZW50cnkub2Zmc2V0KTsKKyAgICByZXR1cm4gY3R4LT5SZWFkUGFja2VkVmFyaW50KHB0ciwgW2ZpZWxkLCBpc196aWd6YWddKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgICBmaWVsZC0+QWRkKGlzX3ppZ3phZyA/IFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdEZWNvZGUzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHZhbHVlKTsKKyAgICB9KTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX0VRKHJlcCwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGZpZWxkX2xheW91dDo6a1JlcDhCaXRzKSk7CisgICAgYXV0byogZmllbGQgPSAmUmVmQXQ8UmVwZWF0ZWRGaWVsZDxib29sPj4obXNnLCBlbnRyeS5vZmZzZXQpOworICAgIHJldHVybiBjdHgtPlJlYWRQYWNrZWRWYXJpbnQoCisgICAgICAgIHB0ciwgW2ZpZWxkXSh1aW50NjRfdCB2YWx1ZSkgeyBmaWVsZC0+QWRkKHZhbHVlKTsgfSk7CisgIH0KKworICByZXR1cm4gRXJyb3IoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKK2Jvb2wgVGNQYXJzZXI6Ok1wVmVyaWZ5VXRmOChTdHJpbmdQaWVjZSB3aXJlX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRjUGFyc2VUYWJsZUJhc2UqIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRW50cnkmIGVudHJ5LCB1aW50MTZfdCB4Zm9ybV92YWwpIHsKKyAgaWYgKHhmb3JtX3ZhbCA9PSBmaWVsZF9sYXlvdXQ6OmtUdlV0ZjgpIHsKKyAgICBpZiAoIUlzU3RydWN0dXJhbGx5VmFsaWRVVEY4KHdpcmVfYnl0ZXMpKSB7CisgICAgICBQcmludFVURjhFcnJvckxvZyhNZXNzYWdlTmFtZSh0YWJsZSksIEZpZWxkTmFtZSh0YWJsZSwgJmVudHJ5KSwgInBhcnNpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorI2lmbmRlZiBOREVCVUcKKyAgaWYgKHhmb3JtX3ZhbCA9PSBmaWVsZF9sYXlvdXQ6OmtUdlV0ZjhEZWJ1ZykgeworICAgIGlmICghSXNTdHJ1Y3R1cmFsbHlWYWxpZFVURjgod2lyZV9ieXRlcykpIHsKKyAgICAgIFByaW50VVRGOEVycm9yTG9nKE1lc3NhZ2VOYW1lKHRhYmxlKSwgRmllbGROYW1lKHRhYmxlLCAmZW50cnkpLCAicGFyc2luZyIsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgfQorICB9CisjZW5kaWYgIC8vIE5ERUJVRworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgY2hhciogVGNQYXJzZXI6Ok1wU3RyaW5nKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgY29uc3QgYXV0byYgZW50cnkgPSBSZWZBdDxGaWVsZEVudHJ5Pih0YWJsZSwgZGF0YS5lbnRyeV9vZmZzZXQoKSk7CisgIGNvbnN0IHVpbnQxNl90IHR5cGVfY2FyZCA9IGVudHJ5LnR5cGVfY2FyZDsKKyAgY29uc3QgdWludDE2X3QgY2FyZCA9IHR5cGVfY2FyZCAmIGZpZWxkX2xheW91dDo6a0ZjTWFzazsKKyAgY29uc3QgdWludDMyX3QgZGVjb2RlZF93aXJldHlwZSA9IGRhdGEudGFnKCkgJiA3OworCisgIGlmIChkZWNvZGVkX3dpcmV0eXBlICE9IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIHRhYmxlLT5mYWxsYmFjayhQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgfQorICBpZiAoY2FyZCA9PSBmaWVsZF9sYXlvdXQ6OmtGY1JlcGVhdGVkKSB7CisgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIE1wUmVwZWF0ZWRTdHJpbmcoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgIH0KKyAgY29uc3QgdWludDE2X3QgeGZvcm1fdmFsID0gdHlwZV9jYXJkICYgZmllbGRfbGF5b3V0OjprVHZNYXNrOworICBjb25zdCB1aW50MTZfdCByZXAgPSB0eXBlX2NhcmQgJiBmaWVsZF9sYXlvdXQ6OmtSZXBNYXNrOworICBpZiAocmVwID09IGZpZWxkX2xheW91dDo6a1JlcElTdHJpbmcpIHsKKyAgICAvLyBUT0RPKGIvMTk4MjExODk3KTogc3VwcG9ydCBJbmlsbmVkU3RyaW5nRmllbGQuCisgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIHRhYmxlLT5mYWxsYmFjayhQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgfQorCisgIC8vIE1hcmsgdGhlIGZpZWxkIGFzIHByZXNlbnQ6CisgIGNvbnN0IGJvb2wgaXNfb25lb2YgPSBjYXJkID09IGZpZWxkX2xheW91dDo6a0ZjT25lb2Y7CisgIGJvb2wgbmVlZF9pbml0ID0gZmFsc2U7CisgIGlmIChjYXJkID09IGZpZWxkX2xheW91dDo6a0ZjT3B0aW9uYWwpIHsKKyAgICBTZXRIYXModGFibGUsIGVudHJ5LCBtc2csIGhhc2JpdHMpOworICB9IGVsc2UgaWYgKGlzX29uZW9mKSB7CisgICAgbmVlZF9pbml0ID0gQ2hhbmdlT25lb2YodGFibGUsIGVudHJ5LCBkYXRhLnRhZygpID4+IDMsIGN0eCwgbXNnKTsKKyAgfQorCisgIGJvb2wgaXNfdmFsaWQgPSBmYWxzZTsKKyAgQXJlbmEqIGFyZW5hID0gY3R4LT5kYXRhKCkuYXJlbmE7CisgIHN3aXRjaCAocmVwKSB7CisgICAgY2FzZSBmaWVsZF9sYXlvdXQ6OmtSZXBBU3RyaW5nOiB7CisgICAgICBhdXRvJiBmaWVsZCA9IFJlZkF0PEFyZW5hU3RyaW5nUHRyPihtc2csIGVudHJ5Lm9mZnNldCk7CisgICAgICBpZiAobmVlZF9pbml0KSBmaWVsZC5Jbml0RGVmYXVsdCgpOworICAgICAgaWYgKGFyZW5hKSB7CisgICAgICAgIHB0ciA9IGN0eC0+UmVhZEFyZW5hU3RyaW5nKHB0ciwgJmZpZWxkLCBhcmVuYSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyogc3RyID0gZmllbGQuTXV0YWJsZU5vQ29weShudWxscHRyKTsKKyAgICAgICAgcHRyID0gSW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgfQorICAgICAgaWYgKCFwdHIpIGJyZWFrOworICAgICAgaXNfdmFsaWQgPSBNcFZlcmlmeVV0ZjgoZmllbGQuR2V0KCksIHRhYmxlLCBlbnRyeSwgeGZvcm1fdmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgZmllbGRfbGF5b3V0OjprUmVwSVN0cmluZzogeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKHB0ciA9PSBudWxscHRyIHx8ICFpc192YWxpZCkgeworICAgIHJldHVybiBFcnJvcihQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgfQorICByZXR1cm4gVG9QYXJzZUxvb3AoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpNcFJlcGVhdGVkU3RyaW5nKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgY29uc3QgYXV0byYgZW50cnkgPSBSZWZBdDxGaWVsZEVudHJ5Pih0YWJsZSwgZGF0YS5lbnRyeV9vZmZzZXQoKSk7CisgIGNvbnN0IHVpbnQxNl90IHR5cGVfY2FyZCA9IGVudHJ5LnR5cGVfY2FyZDsKKyAgY29uc3QgdWludDMyX3QgZGVjb2RlZF90YWcgPSBkYXRhLnRhZygpOworICBjb25zdCB1aW50MzJfdCBkZWNvZGVkX3dpcmV0eXBlID0gZGVjb2RlZF90YWcgJiA3OworCisgIGlmIChkZWNvZGVkX3dpcmV0eXBlICE9IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIHRhYmxlLT5mYWxsYmFjayhQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgfQorCisgIGNvbnN0IHVpbnQxNl90IHJlcCA9IHR5cGVfY2FyZCAmIGZpZWxkX2xheW91dDo6a1JlcE1hc2s7CisgIGNvbnN0IHVpbnQxNl90IHhmb3JtX3ZhbCA9IHR5cGVfY2FyZCAmIGZpZWxkX2xheW91dDo6a1R2TWFzazsKKyAgc3dpdGNoIChyZXApIHsKKyAgICBjYXNlIGZpZWxkX2xheW91dDo6a1JlcFNTdHJpbmc6IHsKKyAgICAgIGF1dG8mIGZpZWxkID0gUmVmQXQ8UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4+KG1zZywgZW50cnkub2Zmc2V0KTsKKyAgICAgIGNvbnN0IGNoYXIqIHB0cjIgPSBwdHI7CisgICAgICB1aW50MzJfdCBuZXh0X3RhZzsKKyAgICAgIGRvIHsKKyAgICAgICAgcHRyID0gcHRyMjsKKyAgICAgICAgc3RkOjpzdHJpbmcqIHN0ciA9IGZpZWxkLkFkZCgpOworICAgICAgICBwdHIgPSBJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKAorICAgICAgICAgICAgICAgIHB0ciA9PSBudWxscHRyIHx8CisgICAgICAgICAgICAgICAgIU1wVmVyaWZ5VXRmOCgqc3RyLCB0YWJsZSwgZW50cnksIHhmb3JtX3ZhbCkpKSB7CisgICAgICAgICAgcmV0dXJuIEVycm9yKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICAgICAgICB9CisgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICBwdHIyID0gUmVhZFRhZyhwdHIsICZuZXh0X3RhZyk7CisgICAgICB9IHdoaWxlIChuZXh0X3RhZyA9PSBkZWNvZGVkX3RhZyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyNpZm5kZWYgTkRFQlVHCisgICAgZGVmYXVsdDoKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbnN1cHBvcnRlZCByZXBlYXRlZCBzdHJpbmcgcmVwOiAiIDw8IHJlcDsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgIH0KKworICByZXR1cm4gVG9QYXJzZUxvb3AoUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7Cit9CisKK2NvbnN0IGNoYXIqIFRjUGFyc2VyOjpNcE1lc3NhZ2UoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBjb25zdCBhdXRvJiBlbnRyeSA9IFJlZkF0PEZpZWxkRW50cnk+KHRhYmxlLCBkYXRhLmVudHJ5X29mZnNldCgpKTsKKyAgY29uc3QgdWludDE2X3QgdHlwZV9jYXJkID0gZW50cnkudHlwZV9jYXJkOworICBjb25zdCB1aW50MTZfdCBjYXJkID0gdHlwZV9jYXJkICYgZmllbGRfbGF5b3V0OjprRmNNYXNrOworCisgIC8vIENoZWNrIGZvciByZXBlYXRlZCBwYXJzaW5nOgorICBpZiAoY2FyZCA9PSBmaWVsZF9sYXlvdXQ6OmtGY1JlcGVhdGVkKSB7CisgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIE1wUmVwZWF0ZWRNZXNzYWdlKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworICB9CisKKyAgY29uc3QgdWludDMyX3QgZGVjb2RlZF90YWcgPSBkYXRhLnRhZygpOworICBjb25zdCB1aW50MzJfdCBkZWNvZGVkX3dpcmV0eXBlID0gZGVjb2RlZF90YWcgJiA3OworICBjb25zdCB1aW50MTZfdCByZXAgPSB0eXBlX2NhcmQgJiBmaWVsZF9sYXlvdXQ6OmtSZXBNYXNrOworICBjb25zdCBib29sIGlzX2dyb3VwID0gcmVwID09IGZpZWxkX2xheW91dDo6a1JlcEdyb3VwOworCisgIC8vIFZhbGlkYXRlIHdpcmV0eXBlOgorICBzd2l0Y2ggKHJlcCkgeworICAgIGNhc2UgZmllbGRfbGF5b3V0OjprUmVwTWVzc2FnZToKKyAgICAgIGlmIChkZWNvZGVkX3dpcmV0eXBlICE9IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGdvdG8gZmFsbGJhY2s7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIGZpZWxkX2xheW91dDo6a1JlcEdyb3VwOgorICAgICAgaWYgKGRlY29kZWRfd2lyZXR5cGUgIT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQKSB7CisgICAgICAgIGdvdG8gZmFsbGJhY2s7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiB7CisgICAgZmFsbGJhY2s6CisgICAgICAvLyBMYXp5IGFuZCBpbXBsaWNpdCB3ZWFrIGZpZWxkcyBhcmUgaGFuZGxlZCBieSBnZW5lcmF0ZWQgY29kZToKKyAgICAgIC8vIFRPRE8oYi8yMTA3NjI4MTYpOiBzdXBwb3J0IHRoZXNlLgorICAgICAgUFJPVE9CVUZfTVVTVFRBSUwgcmV0dXJuIHRhYmxlLT5mYWxsYmFjayhQUk9UT0JVRl9UQ19QQVJBTV9QQVNTKTsKKyAgICB9CisgIH0KKworICBjb25zdCBib29sIGlzX29uZW9mID0gY2FyZCA9PSBmaWVsZF9sYXlvdXQ6OmtGY09uZW9mOworICBib29sIG5lZWRfaW5pdCA9IGZhbHNlOworICBpZiAoY2FyZCA9PSBmaWVsZF9sYXlvdXQ6OmtGY09wdGlvbmFsKSB7CisgICAgU2V0SGFzKHRhYmxlLCBlbnRyeSwgbXNnLCBoYXNiaXRzKTsKKyAgfSBlbHNlIGlmIChpc19vbmVvZikgeworICAgIG5lZWRfaW5pdCA9IENoYW5nZU9uZW9mKHRhYmxlLCBlbnRyeSwgZGF0YS50YWcoKSA+PiAzLCBjdHgsIG1zZyk7CisgIH0KKyAgTWVzc2FnZUxpdGUqJiBmaWVsZCA9IFJlZkF0PE1lc3NhZ2VMaXRlKj4obXNnLCBlbnRyeS5vZmZzZXQpOworICBpZiAobmVlZF9pbml0IHx8IGZpZWxkID09IG51bGxwdHIpIHsKKyAgICBjb25zdCBNZXNzYWdlTGl0ZSogZGVmYXVsdF9pbnN0YW5jZSA9CisgICAgICAgIHRhYmxlLT5maWVsZF9hdXgoJmVudHJ5KS0+bWVzc2FnZV9kZWZhdWx0OworICAgIGZpZWxkID0gZGVmYXVsdF9pbnN0YW5jZS0+TmV3KGN0eC0+ZGF0YSgpLmFyZW5hKTsKKyAgfQorICBTeW5jSGFzYml0cyhtc2csIGhhc2JpdHMsIHRhYmxlKTsKKyAgaWYgKGlzX2dyb3VwKSB7CisgICAgcmV0dXJuIGN0eC0+UGFyc2VHcm91cChmaWVsZCwgcHRyLCBkZWNvZGVkX3RhZyk7CisgIH0KKyAgcmV0dXJuIGN0eC0+UGFyc2VNZXNzYWdlKGZpZWxkLCBwdHIpOworfQorCitjb25zdCBjaGFyKiBUY1BhcnNlcjo6TXBSZXBlYXRlZE1lc3NhZ2UoUFJPVE9CVUZfVENfUEFSQU1fREVDTCkgeworICBjb25zdCBhdXRvJiBlbnRyeSA9IFJlZkF0PEZpZWxkRW50cnk+KHRhYmxlLCBkYXRhLmVudHJ5X29mZnNldCgpKTsKKyAgY29uc3QgdWludDE2X3QgdHlwZV9jYXJkID0gZW50cnkudHlwZV9jYXJkOworICBHT09HTEVfRENIRUNLX0VRKHR5cGVfY2FyZCAmIGZpZWxkX2xheW91dDo6a0ZjTWFzaywKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihmaWVsZF9sYXlvdXQ6OmtGY1JlcGVhdGVkKSk7CisgIGNvbnN0IHVpbnQzMl90IGRlY29kZWRfdGFnID0gZGF0YS50YWcoKTsKKyAgY29uc3QgdWludDMyX3QgZGVjb2RlZF93aXJldHlwZSA9IGRlY29kZWRfdGFnICYgNzsKKyAgY29uc3QgdWludDE2X3QgcmVwID0gdHlwZV9jYXJkICYgZmllbGRfbGF5b3V0OjprUmVwTWFzazsKKyAgY29uc3QgYm9vbCBpc19ncm91cCA9IHJlcCA9PSBmaWVsZF9sYXlvdXQ6OmtSZXBHcm91cDsKKworICAvLyBWYWxpZGF0ZSB3aXJldHlwZToKKyAgc3dpdGNoIChyZXApIHsKKyAgICBjYXNlIGZpZWxkX2xheW91dDo6a1JlcE1lc3NhZ2U6CisgICAgICBpZiAoZGVjb2RlZF93aXJldHlwZSAhPSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBnb3RvIGZhbGxiYWNrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBmaWVsZF9sYXlvdXQ6OmtSZXBHcm91cDoKKyAgICAgIGlmIChkZWNvZGVkX3dpcmV0eXBlICE9IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9TVEFSVF9HUk9VUCkgeworICAgICAgICBnb3RvIGZhbGxiYWNrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogeworICAgIGZhbGxiYWNrOgorICAgICAgLy8gTGF6eSBhbmQgaW1wbGljaXQgd2VhayBmaWVsZHMgYXJlIGhhbmRsZWQgYnkgZ2VuZXJhdGVkIGNvZGU6CisgICAgICAvLyBUT0RPKGIvMjEwNzYyODE2KTogc3VwcG9ydCB0aGVzZS4KKyAgICAgIFBST1RPQlVGX01VU1RUQUlMIHJldHVybiB0YWJsZS0+ZmFsbGJhY2soUFJPVE9CVUZfVENfUEFSQU1fUEFTUyk7CisgICAgfQorICB9CisKKyAgU3luY0hhc2JpdHMobXNnLCBoYXNiaXRzLCB0YWJsZSk7CisgIGNvbnN0IE1lc3NhZ2VMaXRlKiBkZWZhdWx0X2luc3RhbmNlID0KKyAgICAgIHRhYmxlLT5maWVsZF9hdXgoJmVudHJ5KS0+bWVzc2FnZV9kZWZhdWx0OworICBhdXRvJiBmaWVsZCA9IFJlZkF0PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtc2csIGVudHJ5Lm9mZnNldCk7CisgIE1lc3NhZ2VMaXRlKiB2YWx1ZSA9CisgICAgICBmaWVsZC5BZGQ8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2VMaXRlPj4oZGVmYXVsdF9pbnN0YW5jZSk7CisgIGlmIChpc19ncm91cCkgeworICAgIHJldHVybiBjdHgtPlBhcnNlR3JvdXAodmFsdWUsIHB0ciwgZGVjb2RlZF90YWcpOworICB9CisgIHJldHVybiBjdHgtPlBhcnNlTWVzc2FnZSh2YWx1ZSwgcHRyKTsKK30KKworY29uc3QgY2hhciogVGNQYXJzZXI6Ok1wTWFwKFBST1RPQlVGX1RDX1BBUkFNX0RFQ0wpIHsKKyAgY29uc3QgYXV0byYgZW50cnkgPSBSZWZBdDxGaWVsZEVudHJ5Pih0YWJsZSwgZGF0YS5lbnRyeV9vZmZzZXQoKSk7CisgICh2b2lkKWVudHJ5OworICBQUk9UT0JVRl9NVVNUVEFJTCByZXR1cm4gdGFibGUtPmZhbGxiYWNrKFBST1RPQlVGX1RDX1BBUkFNX1BBU1MpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2xpdGVfdGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMxMDgwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdGN0YWJsZV9saXRlX3Rlc3QuY2MKQEAgLTAsMCArMSw2MDcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworbmFtZXNwYWNlIHsKKwordXNpbmcgOjp0ZXN0aW5nOjpFcTsKK3VzaW5nIDo6dGVzdGluZzo6Tm90OworCitNQVRDSEVSX1AzKElzRW50cnlGb3JGaWVsZE51bSwgdGFibGUsIGZpZWxkX251bSwgZmllbGRfbnVtYmVyc190YWJsZSwKKyAgICAgICAgICAgU3RyQ2F0KG5lZ2F0aW9uID8gImlzbid0ICIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZmllbGQgZW50cnkgZm9yIGZpZWxkIG51bWJlciAiLCBmaWVsZF9udW0pKSB7CisgIGlmIChhcmcgPT0gbnVsbHB0cikgeworICAgICpyZXN1bHRfbGlzdGVuZXIgPDwgIndoaWNoIGlzIG51bGxwdHIiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBVc2UgdGhlIGVudHJ5J3MgaW5kZXggdG8gY29tcGFyZSBmaWVsZCBudW1iZXJzLgorICBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxjb25zdCBUY1BhcnNlVGFibGVCYXNlOjpGaWVsZEVudHJ5Kj4oYXJnKSAtCisgICAgICAgICAgICAgICAgICZ0YWJsZS0+ZmllbGRfZW50cmllc1swXTsKKyAgdWludDMyX3QgYWN0dWFsX2ZpZWxkX251bSA9IGZpZWxkX251bWJlcnNfdGFibGVbaW5kZXhdOworICBpZiAoYWN0dWFsX2ZpZWxkX251bSAhPSBmaWVsZF9udW0pIHsKKyAgICAqcmVzdWx0X2xpc3RlbmVyIDw8ICJ3aGljaCBpcyB0aGUgZW50cnkgZm9yICIgPDwgYWN0dWFsX2ZpZWxkX251bTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK1RFU1QoSXNFbnRyeUZvckZpZWxkTnVtVGVzdCwgTWF0Y2hlcikgeworICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgIFRjUGFyc2VUYWJsZTwwLCAzLCAwLCAwLCAyPiB0YWJsZSA9IHsKKyAgICAgIC8vIGhlYWRlcjoKKyAgICAgIHsKKyAgICAgICAgICAwLCAwLCAwLCAwLCAgLy8gaGFzX2JpdHNfb2Zmc2V0LCBleHRlbnNpb25zCisgICAgICAgICAgMCwgICAgICAgICAgIC8vIG1heF9maWVsZF9udW1iZXIKKyAgICAgICAgICAwLCAgICAgICAgICAgLy8gZmFzdF9pZHhfbWFzaywKKyAgICAgICAgICBvZmZzZXRvZihkZWNsdHlwZSh0YWJsZSksIGZpZWxkX2xvb2t1cF90YWJsZSksCisgICAgICAgICAgMHhGRkZGRkZGRiAtIDcsICAvLyA3ID0gZmllbGRzIDEsIDIsIGFuZCAzLgorICAgICAgICAgIG9mZnNldG9mKGRlY2x0eXBlKHRhYmxlKSwgZmllbGRfbmFtZXMpLAorICAgICAgICAgIDAsICAgICAgICAgICAvLyBudW1fZmllbGRfZW50cmllcworICAgICAgICAgIDAsIDAsICAgICAgICAvLyBudW1fYXV4X2VudHJpZXMsIGF1eF9vZmZzZXQsCisgICAgICAgICAgbnVsbHB0ciwgICAgIC8vIGRlZmF1bHQgaW5zdGFuY2UKKyAgICAgICAgICBudWxscHRyLCAgICAgLy8gZmFsbGJhY2sgZnVuY3Rpb24KKyAgICAgIH19OworICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgaW50IHRhYmxlX2ZpZWxkX251bWJlcnNbXSA9IHsxLCAyLCAzfTsKKyAgdGFibGUuZmllbGRfbG9va3VwX3RhYmxlID0gezY1NTM1LCA2NTUzNX07CisKKyAgYXV0byYgZW50cmllcyA9IHRhYmxlLmZpZWxkX2VudHJpZXM7CisgIEVYUEVDVF9USEFUKCZlbnRyaWVzWzBdLCBJc0VudHJ5Rm9yRmllbGROdW0oJnRhYmxlLCAxLCB0YWJsZV9maWVsZF9udW1iZXJzKSk7CisgIEVYUEVDVF9USEFUKCZlbnRyaWVzWzJdLCBJc0VudHJ5Rm9yRmllbGROdW0oJnRhYmxlLCAzLCB0YWJsZV9maWVsZF9udW1iZXJzKSk7CisgIEVYUEVDVF9USEFUKCZlbnRyaWVzWzFdLAorICAgICAgICAgICAgICBOb3QoSXNFbnRyeUZvckZpZWxkTnVtKCZ0YWJsZSwgMywgdGFibGVfZmllbGRfbnVtYmVycykpKTsKKworICBFWFBFQ1RfVEhBVChudWxscHRyLCBOb3QoSXNFbnRyeUZvckZpZWxkTnVtKCZ0YWJsZSwgMSwgdGFibGVfZmllbGRfbnVtYmVycykpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEZpbmRGaWVsZEVudHJ5VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgLy8gQ2FsbHMgdGhlIHByaXZhdGUgYEZpbmRGaWVsZEVudHJ5YCBmdW5jdGlvbi4KKyAgdGVtcGxhdGUgPHNpemVfdCBrRmFzdFRhYmxlU2l6ZUxvZzIsIHNpemVfdCBrTnVtRW50cmllcywgc2l6ZV90IGtOdW1GaWVsZEF1eCwKKyAgICAgICAgICAgIHNpemVfdCBrTmFtZVRhYmxlU2l6ZSwgc2l6ZV90IGtGaWVsZExvb2t1cFRhYmxlU2l6ZT4KKyAgc3RhdGljIGNvbnN0IFRjUGFyc2VUYWJsZUJhc2U6OkZpZWxkRW50cnkqIEZpbmRGaWVsZEVudHJ5KAorICAgICAgY29uc3QgVGNQYXJzZVRhYmxlPGtGYXN0VGFibGVTaXplTG9nMiwga051bUVudHJpZXMsIGtOdW1GaWVsZEF1eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrTmFtZVRhYmxlU2l6ZSwga0ZpZWxkTG9va3VwVGFibGVTaXplPiYgdGFibGUsCisgICAgICB1aW50MzJfdCB0YWcpIHsKKyAgICByZXR1cm4gVGNQYXJzZXI6OkZpbmRGaWVsZEVudHJ5KCZ0YWJsZS5oZWFkZXIsIHRhZyk7CisgIH0KKworICAvLyBDYWxscyB0aGUgcHJpdmF0ZSBgRmllbGROYW1lYCBmdW5jdGlvbi4KKyAgdGVtcGxhdGUgPHNpemVfdCBrRmFzdFRhYmxlU2l6ZUxvZzIsIHNpemVfdCBrTnVtRW50cmllcywgc2l6ZV90IGtOdW1GaWVsZEF1eCwKKyAgICAgICAgICAgIHNpemVfdCBrTmFtZVRhYmxlU2l6ZSwgc2l6ZV90IGtGaWVsZExvb2t1cFRhYmxlU2l6ZT4KKyAgc3RhdGljIFN0cmluZ1BpZWNlIEZpZWxkTmFtZSgKKyAgICAgIGNvbnN0IFRjUGFyc2VUYWJsZTxrRmFzdFRhYmxlU2l6ZUxvZzIsIGtOdW1FbnRyaWVzLCBrTnVtRmllbGRBdXgsCisgICAgICAgICAgICAgICAgICAgICAgICAga05hbWVUYWJsZVNpemUsIGtGaWVsZExvb2t1cFRhYmxlU2l6ZT4mIHRhYmxlLAorICAgICAgY29uc3QgVGNQYXJzZVRhYmxlQmFzZTo6RmllbGRFbnRyeSogZW50cnkpIHsKKyAgICByZXR1cm4gVGNQYXJzZXI6OkZpZWxkTmFtZSgmdGFibGUuaGVhZGVyLCBlbnRyeSk7CisgIH0KKworICAvLyBDYWxscyB0aGUgcHJpdmF0ZSBgTWVzc2FnZU5hbWVgIGZ1bmN0aW9uLgorICB0ZW1wbGF0ZSA8c2l6ZV90IGtGYXN0VGFibGVTaXplTG9nMiwgc2l6ZV90IGtOdW1FbnRyaWVzLCBzaXplX3Qga051bUZpZWxkQXV4LAorICAgICAgICAgICAgc2l6ZV90IGtOYW1lVGFibGVTaXplLCBzaXplX3Qga0ZpZWxkTG9va3VwVGFibGVTaXplPgorICBzdGF0aWMgU3RyaW5nUGllY2UgTWVzc2FnZU5hbWUoCisgICAgICBjb25zdCBUY1BhcnNlVGFibGU8a0Zhc3RUYWJsZVNpemVMb2cyLCBrTnVtRW50cmllcywga051bUZpZWxkQXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGtOYW1lVGFibGVTaXplLCBrRmllbGRMb29rdXBUYWJsZVNpemU+JiB0YWJsZSkgeworICAgIHJldHVybiBUY1BhcnNlcjo6TWVzc2FnZU5hbWUoJnRhYmxlLmhlYWRlcik7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmllbGRzIHNjYW5uZWQgZHVyaW5nIGEgc21hbGwgc2Nhbi4KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQgc21hbGxfc2Nhbl9zaXplKCkgeyByZXR1cm4gVGNQYXJzZXI6OmtNdFNtYWxsU2NhblNpemU7IH0KK307CisKK1RFU1RfRihGaW5kRmllbGRFbnRyeVRlc3QsIFNlcXVlbnRpYWxGaWVsZFJhbmdlKSB7CisgIC8vIExvb2sgdXAgZmllbGRzIHRoYXQgYXJlIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgYGxvb2t1cF90YWJsZV9vZmZzZXRgLgorICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgIFRjUGFyc2VUYWJsZTwwLCA1LCAwLCAwLCA4PiB0YWJsZSA9IHsKKyAgICAgIC8vIGhlYWRlcjoKKyAgICAgIHsKKyAgICAgICAgICAwLCAwLCAwLCAwLCAgLy8gaGFzX2JpdHNfb2Zmc2V0LCBleHRlbnNpb25zCisgICAgICAgICAgMTExLCAgICAgICAgIC8vIG1heF9maWVsZF9udW1iZXIKKyAgICAgICAgICAwLCAgICAgICAgICAgLy8gZmFzdF9pZHhfbWFzaywKKyAgICAgICAgICBvZmZzZXRvZihkZWNsdHlwZSh0YWJsZSksIGZpZWxkX2xvb2t1cF90YWJsZSksCisgICAgICAgICAgMHhGRkZGRkZGRiAtICgxIDw8IDEpIC0gKDEgPDwgMikgICAvLyBmaWVsZHMgMiwgMworICAgICAgICAgICAgICAgICAgICAgLSAoMSA8PCAzKSAtICgxIDw8IDQpLCAgLy8gZmllbGRzIDQsIDUKKyAgICAgICAgICBvZmZzZXRvZihkZWNsdHlwZSh0YWJsZSksIGZpZWxkX2VudHJpZXMpLAorICAgICAgICAgIDUsICAgICAgICAgICAvLyBudW1fZmllbGRfZW50cmllcworICAgICAgICAgIDAsIDAsICAgICAgICAvLyBudW1fYXV4X2VudHJpZXMsIGF1eF9vZmZzZXQsCisgICAgICAgICAgbnVsbHB0ciwgICAgIC8vIGRlZmF1bHQgaW5zdGFuY2UKKyAgICAgICAgICB7fSwgICAgICAgICAgLy8gZmFsbGJhY2sgZnVuY3Rpb24KKyAgICAgIH0sCisgICAgICB7fSwgIC8vIGZhc3RfZW50cmllcworICAgICAgLy8gZmllbGRfbG9va3VwX3RhYmxlIGZvciAyLCAzLCA0LCA1LCAxMTE6CisgICAgICB7eworICAgICAgICAxMTEsICAgICAgMCwgICAgICAgICAgICAgICAgICAvLyBmaWVsZCAxMTEKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSBza2lwIGVudHJ5CisgICAgICAgIDB4RkZGRSwgICA0LCAgICAgICAgICAgICAgICAgIC8vIDEgZmllbGQsIGVudHJ5IDQuCisgICAgICAgIDY1NTM1LCA2NTUzNSwgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0YWJsZQorICAgICAgfX0sCisgIH07CisgIC8vIGNsYW5nLWZvcm1hdCBvbgorICBpbnQgdGFibGVfZmllbGRfbnVtYmVyc1tdID0gezIsIDMsIDQsIDUsIDExMX07CisKKyAgZm9yIChpbnQgaSA6IHRhYmxlX2ZpZWxkX251bWJlcnMpIHsKKyAgICBFWFBFQ1RfVEhBVChGaW5kRmllbGRFbnRyeSh0YWJsZSwgaSksCisgICAgICAgICAgICAgICAgSXNFbnRyeUZvckZpZWxkTnVtKCZ0YWJsZSwgaSwgdGFibGVfZmllbGRfbnVtYmVycykpOworICB9CisgIGZvciAoaW50IGkgOiB7MCwgMSwgNiwgNywgMTEwLCAxMTIsIDUwMDAwMDAwMH0pIHsKKyAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJGaWVsZCAiIDw8IGk7CisgICAgRVhQRUNUX1RIQVQoRmluZEZpZWxkRW50cnkodGFibGUsIGkpLCBFcShudWxscHRyKSk7CisgIH0KK30KKworVEVTVF9GKEZpbmRGaWVsZEVudHJ5VGVzdCwgU21hbGxTY2FuUmFuZ2UpIHsKKyAgLy8gTG9vayB1cCBmaWVsZHMgcGFzdCBgbG9va3VwX3RhYmxlX29mZnNldGAsIGJ1dCBiZWZvcmUgYmluYXJ5IHNlYXJjaC4KKyAgQVNTRVJUX1RIQVQoc21hbGxfc2Nhbl9zaXplKCksIEVxKDQpKSA8PCAidGVzdCBuZWVkcyB0byBiZSB1cGRhdGVkIjsKKyAgLy8gY2xhbmctZm9ybWF0IG9mZgorICBUY1BhcnNlVGFibGU8MCwgNiwgMCwgMCwgOD4gdGFibGUgPSB7CisgICAgICAvLyBoZWFkZXI6CisgICAgICB7CisgICAgICAgICAgMCwgMCwgMCwgMCwgIC8vIGhhc19iaXRzX29mZnNldCwgZXh0ZW5zaW9ucworICAgICAgICAgIDExMSwgICAgICAgICAvLyBtYXhfZmllbGRfbnVtYmVyCisgICAgICAgICAgMCwgICAgICAgICAgIC8vIGZhc3RfaWR4X21hc2ssCisgICAgICAgICAgb2Zmc2V0b2YoZGVjbHR5cGUodGFibGUpLCBmaWVsZF9sb29rdXBfdGFibGUpLAorICAgICAgICAgIDB4RkZGRkZGRkYgLSAoMTw8MCkgLSAoMTw8MikgLSAoMTw8MykgLSAoMTw8NCkgLSAoMTw8NiksICAvLyAxLDMtNSw3CisgICAgICAgICAgb2Zmc2V0b2YoZGVjbHR5cGUodGFibGUpLCBmaWVsZF9lbnRyaWVzKSwKKyAgICAgICAgICA2LCAgICAgICAgICAgLy8gbnVtX2ZpZWxkX2VudHJpZXMKKyAgICAgICAgICAwLCAwLCAgICAgICAgLy8gbnVtX2F1eF9lbnRyaWVzLCBhdXhfb2Zmc2V0LAorICAgICAgICAgIG51bGxwdHIsICAgICAvLyBkZWZhdWx0IGluc3RhbmNlCisgICAgICAgICAge30sICAgICAgICAgIC8vIGZhbGxiYWNrIGZ1bmN0aW9uCisgICAgICB9LAorICAgICAge30sICAvLyBmYXN0X2VudHJpZXMKKyAgICAgIC8vIGZpZWxkX2xvb2t1cF90YWJsZSBmb3IgMSwgMywgNCwgNSwgNywgMTExOgorICAgICAge3sKKyAgICAgICAgMTExLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWVsZCAxMTEKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIHNraXAgZW50cnkKKyAgICAgICAgMHhGRkZFLCA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIGZpZWxkLCBlbnRyeSA1CisgICAgICAgIDY1NTM1LCA2NTUzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHRhYmxlCisgICAgICB9fSwKKyAgfTsKKyAgLy8gY2xhbmctZm9ybWF0IG9uCisgIGludCB0YWJsZV9maWVsZF9udW1iZXJzW10gPSB7Ly8gU2VxdWVudGlhbCBlbnRyaWVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU21hbGwgc2NhbiByYW5nZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCA0LCA1LCA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJpbmFyeSBzZWFyY2ggcmFuZ2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTExfTsKKworICBmb3IgKGludCBpIDogdGFibGVfZmllbGRfbnVtYmVycykgeworICAgIEVYUEVDVF9USEFUKEZpbmRGaWVsZEVudHJ5KHRhYmxlLCBpKSwKKyAgICAgICAgICAgICAgICBJc0VudHJ5Rm9yRmllbGROdW0oJnRhYmxlLCBpLCB0YWJsZV9maWVsZF9udW1iZXJzKSk7CisgIH0KKyAgZm9yIChpbnQgaSA6IHswLCAyLCA2LCA4LCA5LCAxMTAsIDExMiwgNTAwMDAwMDAwfSkgeworICAgIEVYUEVDVF9USEFUKEZpbmRGaWVsZEVudHJ5KHRhYmxlLCBpKSwgRXEobnVsbHB0cikpOworICB9Cit9CisKK1RFU1RfRihGaW5kRmllbGRFbnRyeVRlc3QsIEJpbmFyeVNlYXJjaFJhbmdlKSB7CisgIC8vIEZpZWxkcyBhZnRlciB0aGUgc2VxdWVudGlhbCBhbmQgc21hbGwtc2NhbiByYW5nZXMgYXJlIGxvb2tlZCB1cCB1c2luZworICAvLyBiaW5hcnkgc2VhcmNoLgorICBBU1NFUlRfVEhBVChzbWFsbF9zY2FuX3NpemUoKSwgRXEoNCkpIDw8ICJ0ZXN0IG5lZWRzIHRvIGJlIHVwZGF0ZWQiOworCisgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgVGNQYXJzZVRhYmxlPDAsIDEwLCAwLCAwLCA4PiB0YWJsZSA9IHsKKyAgICAgIC8vIGhlYWRlcjoKKyAgICAgIHsKKyAgICAgICAgICAwLCAwLCAwLCAwLCAgLy8gaGFzX2JpdHNfb2Zmc2V0LCBleHRlbnNpb25zCisgICAgICAgICAgNzAsICAgICAgICAgIC8vIG1heF9maWVsZF9udW1iZXIKKyAgICAgICAgICAwLCAgICAgICAgICAgLy8gZmFzdF9pZHhfbWFzaywKKyAgICAgICAgICBvZmZzZXRvZihkZWNsdHlwZSh0YWJsZSksIGZpZWxkX2xvb2t1cF90YWJsZSksCisgICAgICAgICAgMHhGRkZGRkZGRiAtICgxPDwwKSAtICgxPDwyKSAtICgxPDwzKSAtICgxPDw0KSAgIC8vIDEsIDMsIDQsIDUsIDYKKyAgICAgICAgICAgICAgICAgICAgIC0gKDE8PDUpIC0gKDE8PDcpIC0gKDE8PDgpIC0gKDE8PDEwKSAgLy8gOCwgOSwgMTEsIDEyCisgICAgICAgICAgICAgICAgICAgICAtICgxPDwxMSksCisgICAgICAgICAgb2Zmc2V0b2YoZGVjbHR5cGUodGFibGUpLCBmaWVsZF9lbnRyaWVzKSwKKyAgICAgICAgICAxMCwgICAgICAgICAgLy8gbnVtX2ZpZWxkX2VudHJpZXMKKyAgICAgICAgICAwLCAwLCAgICAgICAgLy8gbnVtX2F1eF9lbnRyaWVzLCBhdXhfb2Zmc2V0LAorICAgICAgICAgIG51bGxwdHIsICAgICAvLyBkZWZhdWx0IGluc3RhbmNlCisgICAgICAgICAge30sICAgICAgICAgIC8vIGZhbGxiYWNrIGZ1bmN0aW9uCisgICAgICB9LAorICAgICAge30sICAvLyBmYXN0X2VudHJpZXMKKyAgICAgIC8vIGZpZWxkX2xvb2t1cF90YWJsZSBmb3IgMSwgMywgNCwgNSwgNiwgOCwgOSwgMTEsIDEyLCA3MAorICAgICAge3sKKyAgICAgICAgNzAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIDcwCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIHNraXAgZW50cnkKKyAgICAgICAgMHhGRkZFLCA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgZmllbGQsIGVudHJ5IDkKKyAgICAgICAgNjU1MzUsIDY1NTM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0YWJsZQorICAgICAgfX0sCisgIH07CisgIGludCB0YWJsZV9maWVsZF9udW1iZXJzW10gPSB7CisgICAgICAgIC8vIFNlcXVlbnRpYWwgZW50cmllczoKKyAgICAgICAgMSwKKyAgICAgICAgLy8gU21hbGwgc2NhbiByYW5nZToKKyAgICAgICAgMywgNCwgNSwgNiwKKyAgICAgICAgLy8gQmluYXJ5IHNlYXJjaCByYW5nZToKKyAgICAgICAgOCwgOSwgMTEsIDEyLCA3MAorICB9OworICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgZm9yIChpbnQgaSA6IHRhYmxlX2ZpZWxkX251bWJlcnMpIHsKKyAgICBFWFBFQ1RfVEhBVChGaW5kRmllbGRFbnRyeSh0YWJsZSwgaSksCisgICAgICAgICAgICAgICAgSXNFbnRyeUZvckZpZWxkTnVtKCZ0YWJsZSwgaSwgdGFibGVfZmllbGRfbnVtYmVycykpOworICB9CisgIGZvciAoaW50IGkgOiB7MCwgMiwgNywgMTAsIDEzLCA2OSwgNzEsIDExMiwgNTAwMDAwMDAwfSkgeworICAgIEVYUEVDVF9USEFUKEZpbmRGaWVsZEVudHJ5KHRhYmxlLCBpKSwgRXEobnVsbHB0cikpOworICB9Cit9CisKK1RFU1RfRihGaW5kRmllbGRFbnRyeVRlc3QsIE91dE9mUmFuZ2UpIHsKKyAgLy8gTG9vayB1cCB0YWdzIHRoYXQgYXJlIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIGluIHRoZSBtZXNzYWdlLgorICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgIFRjUGFyc2VUYWJsZTwwLCAzLCAwLCAxNSwgMj4gdGFibGUgPSB7CisgICAgICAvLyBoZWFkZXI6CisgICAgICB7CisgICAgICAgICAgMCwgMCwgMCwgMCwgIC8vIGhhc19iaXRzX29mZnNldCwgZXh0ZW5zaW9ucworICAgICAgICAgIDMsICAgICAgICAgICAvLyBtYXhfZmllbGRfbnVtYmVyCisgICAgICAgICAgMCwgICAgICAgICAgIC8vIGZhc3RfaWR4X21hc2ssCisgICAgICAgICAgb2Zmc2V0b2YoZGVjbHR5cGUodGFibGUpLCBmaWVsZF9sb29rdXBfdGFibGUpLAorICAgICAgICAgIDB4RkZGRkZGRkYgLSAoMTw8MCkgLSAoMTw8MSkgLSAoMTw8MiksICAvLyBmaWVsZHMgMSwgMiwgMworICAgICAgICAgIG9mZnNldG9mKGRlY2x0eXBlKHRhYmxlKSwgZmllbGRfZW50cmllcyksCisgICAgICAgICAgMywgICAgICAgICAgIC8vIG51bV9maWVsZF9lbnRyaWVzCisgICAgICAgICAgMCwgICAgICAgICAgIC8vIG51bV9hdXhfZW50cmllcworICAgICAgICAgIG9mZnNldG9mKGRlY2x0eXBlKHRhYmxlKSwgZmllbGRfbmFtZXMpLCAgLy8gbm8gYXV4X2VudHJpZXMKKyAgICAgICAgICBudWxscHRyLCAgICAgLy8gZGVmYXVsdCBpbnN0YW5jZQorICAgICAgICAgIHt9LCAgICAgICAgICAvLyBmYWxsYmFjayBmdW5jdGlvbgorICAgICAgfSwKKyAgICAgIHt9LCAgLy8gZmFzdF9lbnRyaWVzCisgICAgICB7ey8vIGZpZWxkIGxvb2t1cCB0YWJsZQorICAgICAgICA2NTUzNSwgNjU1MzUgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0YWJsZQorICAgICAgfX0sCisgICAge30sICAvLyAibWluaSIgdGFibGUKKyAgICAvLyBhdXhpbGlhcnkgZW50cmllcyAobm9uZSBpbiB0aGlzIHRlc3QpCisgICAge3sgIC8vIG5hbWUgbGVuZ3RocworICAgICAgICAiXDBcMVwyXDNcMFwwXDBcMCIKKyAgICAgICAgICAvLyBuYW1lcworICAgICAgICAiMSIKKyAgICAgICAgIjAyIgorICAgICAgICAiMDAzIn19LAorICB9OworICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgaW50IHRhYmxlX2ZpZWxkX251bWJlcnNbXSA9IHsxLCAyLCAzfTsKKworICBmb3IgKGludCBmaWVsZF9udW0gOiB0YWJsZV9maWVsZF9udW1iZXJzKSB7CisgICAgYXV0byogZW50cnkgPSBGaW5kRmllbGRFbnRyeSh0YWJsZSwgZmllbGRfbnVtKTsKKyAgICBFWFBFQ1RfVEhBVChlbnRyeSwKKyAgICAgICAgICAgICAgICBJc0VudHJ5Rm9yRmllbGROdW0oJnRhYmxlLCBmaWVsZF9udW0sIHRhYmxlX2ZpZWxkX251bWJlcnMpKTsKKworICAgIFN0cmluZ1BpZWNlIG5hbWUgPSBGaWVsZE5hbWUodGFibGUsIGVudHJ5KTsKKyAgICBFWFBFQ1RfRVEobmFtZS5sZW5ndGgoKSwgZmllbGRfbnVtKTsKKyAgICB3aGlsZSAobmFtZVswXSA9PSAnMCcpIG5hbWUucmVtb3ZlX3ByZWZpeCgxKTsgIC8vIHN0cmlwIGxlYWRpbmcgemVvcmVzCisgICAgRVhQRUNUX0VRKG5hbWUsIFN0ckNhdChmaWVsZF9udW0pKTsKKyAgfQorICBmb3IgKGludCBmaWVsZF9udW0gOiB7MCwgNCwgMTEyLCA1MDAwMDAwMDB9KSB7CisgICAgRVhQRUNUX1RIQVQoRmluZEZpZWxkRW50cnkodGFibGUsIGZpZWxkX251bSksIEVxKG51bGxwdHIpKTsKKyAgfQorfQorCitURVNUX0YoRmluZEZpZWxkRW50cnlUZXN0LCBFbXB0eU1lc3NhZ2UpIHsKKyAgLy8gRW5zdXJlIHRoYXQgdGFibGVzIHdpdGggbm8gZmllbGRzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KKyAgdXNpbmcgVGFibGVUeXBlID0gVGNQYXJzZVRhYmxlPDAsIDAsIDAsIDIwLCAyPjsKKyAgLy8gY2xhbmctZm9ybWF0IG9mZgorICBUYWJsZVR5cGUgdGFibGUgPSB7CisgICAgICAvLyBoZWFkZXI6CisgICAgICB7CisgICAgICAgICAgMCwgMCwgMCwgMCwgIC8vIGhhc19iaXRzX29mZnNldCwgZXh0ZW5zaW9ucworICAgICAgICAgIDAsICAgICAgICAgICAvLyBtYXhfZmllbGRfbnVtYmVyCisgICAgICAgICAgMCwgICAgICAgICAgIC8vIGZhc3RfaWR4X21hc2ssCisgICAgICAgICAgb2Zmc2V0b2YoZGVjbHR5cGUodGFibGUpLCBmaWVsZF9sb29rdXBfdGFibGUpLAorICAgICAgICAgIDB4RkZGRkZGRkYsICAgICAgIC8vIG5vIGZpZWxkcworICAgICAgICAgIG9mZnNldG9mKGRlY2x0eXBlKHRhYmxlKSwgZmllbGRfbmFtZXMpLCAgLy8gbm8gZmllbGRfZW50cmllcworICAgICAgICAgIDAsICAgICAgICAgICAvLyBudW1fZmllbGRfZW50cmllcworICAgICAgICAgIDAsICAgICAgICAgICAvLyBudW1fYXV4X2VudHJpZXMKKyAgICAgICAgICBvZmZzZXRvZihUYWJsZVR5cGUsIGZpZWxkX25hbWVzKSwKKyAgICAgICAgICBudWxscHRyLCAgICAgLy8gZGVmYXVsdCBpbnN0YW5jZQorICAgICAgICAgIG51bGxwdHIsICAgICAvLyBmYWxsYmFjayBmdW5jdGlvbgorICAgICAgfSwKKyAgICAgIHt9LCAgLy8gZmFzdF9lbnRyaWVzCisgICAgICB7ey8vIGVtcHR5IGZpZWxkIGxvb2t1cCB0YWJsZQorICAgICAgICA2NTUzNSwgNjU1MzUKKyAgICAgIH19LAorICAgICAge3sKKyAgICAgICAgICAiXDEzXDBcMFwwXDBcMFwwXDAiCisgICAgICAgICAgIk1lc3NhZ2VOYW1lIgorICAgICAgfX0sCisgIH07CisgIC8vIGNsYW5nLWZvcm1hdCBvbgorCisgIGZvciAoaW50IGkgOiB7MCwgNCwgMTEyLCA1MDAwMDAwMDB9KSB7CisgICAgRVhQRUNUX1RIQVQoRmluZEZpZWxkRW50cnkodGFibGUsIGkpLCBFcShudWxscHRyKSk7CisgIH0KKyAgRVhQRUNUX1RIQVQoTWVzc2FnZU5hbWUodGFibGUpLCBFcSgiTWVzc2FnZU5hbWUiKSk7Cit9CisKKy8vIE1ha2UgYSBtb25zdGVyIHdpdGggbG90cyBvZiBmaWVsZCBudW1iZXJzCisKK2ludDMyX3QgdGVzdF9hbGxfdHlwZXNfdGFibGVfZmllbGRfbnVtYmVyc1tdID0geworICAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgIDEwLCAgIC8vCisgICAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwgIDE4LCAgMTksICAyMSwgIDIyLCAgMjQsICAgLy8KKyAgICAyNSwgIDI3LCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgICAvLworICAgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDgsICA0OSwgIDUxLCAgIC8vCisgICAgNTIsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICAgLy8KKyAgICA2MywgIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgICAvLworICAgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LCAgODAsICA4MSwgIDgyLCAgIC8vCisgICAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICAgLy8KKyAgICA5MywgIDk0LCAgOTUsICA5NiwgIDk3LCAgOTgsICA5OSwgIDEwMCwgMTAxLCAxMDIsICAvLworICAgIDExMSwgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDIwMSwgIC8vCisgICAgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAgLy8KKyAgICAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMzIxLCAzMjIsIDQwMSwgNDAyLCA0MDMsICAvLworICAgIDQwNCwgNDA1LCA0MDYsIDQwNywgNDA4LCA0MDksIDQxMCwgNDExLCA0MTIsIDQxMywgIC8vCisgICAgNDE0LCA0MTUsIDQxNiwgNDE3fTsKKworLy8gY2xhbmctZm9ybWF0IG9mZgorY29uc3QgVGNQYXJzZVRhYmxlPDUsIDEzNCwgNSwgMjE3NiwgNTU+IHRlc3RfYWxsX3R5cGVzX3RhYmxlID0geworICAgIC8vIGhlYWRlcjoKKyAgICB7CisgICAgICAgIDAsIDAsIDAsIDAsICAvLyBoYXNfYml0c19vZmZzZXQsIGV4dGVuc2lvbnMKKyAgICAgICAgNDE4LCAyNDgsICAgIC8vIG1heF9maWVsZF9udW1iZXIsIGZhc3RfaWR4X21hc2sKKyAgICAgICAgb2Zmc2V0b2YoZGVjbHR5cGUodGVzdF9hbGxfdHlwZXNfdGFibGUpLCBmaWVsZF9sb29rdXBfdGFibGUpLAorICAgICAgICA5Nzc4OTU0MjQsICAvLyBza2lwbWFwIGZvciBmaWVsZHMgMS0xNSwxOC0xOSwyMS0yMiwyNC0yNSwyNywzMS0zMgorICAgICAgICBvZmZzZXRvZihkZWNsdHlwZSh0ZXN0X2FsbF90eXBlc190YWJsZSksIGZpZWxkX2VudHJpZXMpLAorICAgICAgICAxMzUsICAgICAgICAgLy8gbnVtX2ZpZWxkX2VudHJpZXMKKyAgICAgICAgNSwgICAgICAgICAgIC8vIG51bV9hdXhfZW50cmllcworICAgICAgICBvZmZzZXRvZihkZWNsdHlwZSh0ZXN0X2FsbF90eXBlc190YWJsZSksIGF1eF9lbnRyaWVzKSwKKyAgICAgICAgbnVsbHB0ciwgICAgIC8vIGRlZmF1bHQgaW5zdGFuY2UKKyAgICAgICAgbnVsbHB0ciwgICAgIC8vIGZhbGxiYWNrIGZ1bmN0aW9uCisgICAgfSwKKyAgICB7eworICAgICAgICAvLyB0YWlsLWNhbGwgdGFibGUKKyAgICB9fSwKKyAgICB7eyAgLy8gZmllbGQgbG9va3VwIHRhYmxlCisgICAgICAgIC8vCisgICAgICAgIC8vIGZpZWxkcyAzMy00MTcsIG92ZXIgMjUgc2tpcG1hcCAvIG9mZnNldCBwYWlycworICAgICAgMzMsIDAsIDI1LAorICAgICAgMjQ1NzYsICAyNCwgICAxOCwgICAgIDM4LCAgIDAsICAgICAgNTIsICAgMCwgICAgICA2OCwgICAxNjMyMCwgIDg0LAorICAgICAgNjU0MDgsICA5MiwgICA2NTUzNSwgIDk5LCAgIDY1NTM1LCAgOTksICAgNjU1MzUsICA5OSwgICA2NTUzNSwgIDk5LAorICAgICAgNjUyNzksICA5OSwgICA2NTUzNSwgIDEwMCwgIDY1NTM1LCAgMTAwLCAgMzI3NjgsICAxMDAsICA2NTUzNSwgIDExNSwKKyAgICAgIDY1NTM1LCAgMTE1LCAgNjU1MzUsICAxMTUsICA2NTUzNSwgIDExNSwgIDY1NTMyLCAgMTE1LCAgNjU1MzUsICAxMTcsCisgICAgICA2NTUzNSwgIDExNywgIDY1NTM1LCAgMTE3LCAgNjU1MzUsICAxMTcsICAwLCAgICAgIDExNywgIDY1NTMyLCAgMTMzLAorICAgICAgLy8gZW5kIG9mIHRhYmxlCisgICAgICA2NTUzNSwgNjU1MzUKKyAgfX0sCisgIHt7CisgICAgICAvLyAibWluaSIgdGFibGUKKyAgfX0sCisgIHt7ICAvLyBhdXhpbGlhcnkgZW50cmllcyAobm90IHVzZWQgaW4gdGhpcyB0ZXN0KQorICAgICAgey0xLCA0fSwKKyAgICAgIHstMSwgNH0sCisgICAgICB7LTEsIDR9LAorICAgICAgey0xLCA0fSwKKyAgICAgIHstMSwgNH0sCisgICAgfX0sIHt7ICAvLyBuYW1lIGxlbmd0aHMKKyAgICAgICJcMSIgIC8vIG1lc3NhZ2UgbmFtZQorICAgICAgIlwxNlwxNlwxN1wxN1wxN1wxN1wyMFwyMFwyMVwyMVwxNlwxN1wxNVwxN1wxNlwyN1wzMFwyNFwyNVwyNSIKKyAgICAgICJcMTVcMjFcMTZcMTZcMTdcMTdcMTdcMTdcMjBcMjBcMjFcMjFcMTZcMTdcMTVcMTdcMTZcMjdcMzBcMjQiCisgICAgICAiXDI1XDI1XDE1XDE3XDE3XDIxXDIxXDIxXDIxXDIzXDIzXDI1XDI1XDE3XDIwXDE1XDIxXDIwXDMxXDMyIgorICAgICAgIlwyNlwyN1wxNFwxNFwxNVwxNVwxNVwxNVwxNlwxNlwxN1wxN1wxNFwxNVwxM1wyMlwxNlwxNlwxN1wxNyIKKyAgICAgICJcMTdcMTdcMjBcMjBcMjFcMjFcMTZcMTdcMTVcMjRcMTRcMjRcMTRcMTNcMTJcMTRcMTNcMTRcMTJcNCIKKyAgICAgICJcMTVcMTVcMTZcMTZcMTZcMTZcMTdcMTdcMjBcMjBcMTVcMTZcMTRcMTZcMTVcMjVcMjVcMTJcMTNcMTQiCisgICAgICAiXDE1XDEzXDE1XDEyXDEyXDEzXDE0XDE0XDE0XDE2XDE2XDE1XDE1XDE2XDAiCisgICAgICAgIC8vIG5hbWVzCisgICAgICAiTSIKKyAgICAgICJvcHRpb25hbF9pbnQzMiIKKyAgICAgICJvcHRpb25hbF9pbnQ2NCIKKyAgICAgICJvcHRpb25hbF91aW50MzIiCisgICAgICAib3B0aW9uYWxfdWludDY0IgorICAgICAgIm9wdGlvbmFsX3NpbnQzMiIKKyAgICAgICJvcHRpb25hbF9zaW50NjQiCisgICAgICAib3B0aW9uYWxfZml4ZWQzMiIKKyAgICAgICJvcHRpb25hbF9maXhlZDY0IgorICAgICAgIm9wdGlvbmFsX3NmaXhlZDMyIgorICAgICAgIm9wdGlvbmFsX3NmaXhlZDY0IgorICAgICAgIm9wdGlvbmFsX2Zsb2F0IgorICAgICAgIm9wdGlvbmFsX2RvdWJsZSIKKyAgICAgICJvcHRpb25hbF9ib29sIgorICAgICAgIm9wdGlvbmFsX3N0cmluZyIKKyAgICAgICJvcHRpb25hbF9ieXRlcyIKKyAgICAgICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIKKyAgICAgICJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiCisgICAgICAib3B0aW9uYWxfbmVzdGVkX2VudW0iCisgICAgICAib3B0aW9uYWxfZm9yZWlnbl9lbnVtIgorICAgICAgIm9wdGlvbmFsX3N0cmluZ19waWVjZSIKKyAgICAgICJvcHRpb25hbF9jb3JkIgorICAgICAgInJlY3Vyc2l2ZV9tZXNzYWdlIgorICAgICAgInJlcGVhdGVkX2ludDMyIgorICAgICAgInJlcGVhdGVkX2ludDY0IgorICAgICAgInJlcGVhdGVkX3VpbnQzMiIKKyAgICAgICJyZXBlYXRlZF91aW50NjQiCisgICAgICAicmVwZWF0ZWRfc2ludDMyIgorICAgICAgInJlcGVhdGVkX3NpbnQ2NCIKKyAgICAgICJyZXBlYXRlZF9maXhlZDMyIgorICAgICAgInJlcGVhdGVkX2ZpeGVkNjQiCisgICAgICAicmVwZWF0ZWRfc2ZpeGVkMzIiCisgICAgICAicmVwZWF0ZWRfc2ZpeGVkNjQiCisgICAgICAicmVwZWF0ZWRfZmxvYXQiCisgICAgICAicmVwZWF0ZWRfZG91YmxlIgorICAgICAgInJlcGVhdGVkX2Jvb2wiCisgICAgICAicmVwZWF0ZWRfc3RyaW5nIgorICAgICAgInJlcGVhdGVkX2J5dGVzIgorICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIgorICAgICAgInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfZW51bSIKKyAgICAgICJyZXBlYXRlZF9mb3JlaWduX2VudW0iCisgICAgICAicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIgorICAgICAgInJlcGVhdGVkX2NvcmQiCisgICAgICAibWFwX2ludDMyX2ludDMyIgorICAgICAgIm1hcF9pbnQ2NF9pbnQ2NCIKKyAgICAgICJtYXBfdWludDMyX3VpbnQzMiIKKyAgICAgICJtYXBfdWludDY0X3VpbnQ2NCIKKyAgICAgICJtYXBfc2ludDMyX3NpbnQzMiIKKyAgICAgICJtYXBfc2ludDY0X3NpbnQ2NCIKKyAgICAgICJtYXBfZml4ZWQzMl9maXhlZDMyIgorICAgICAgIm1hcF9maXhlZDY0X2ZpeGVkNjQiCisgICAgICAibWFwX3NmaXhlZDMyX3NmaXhlZDMyIgorICAgICAgIm1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCIKKyAgICAgICJtYXBfaW50MzJfZmxvYXQiCisgICAgICAibWFwX2ludDMyX2RvdWJsZSIKKyAgICAgICJtYXBfYm9vbF9ib29sIgorICAgICAgIm1hcF9zdHJpbmdfc3RyaW5nIgorICAgICAgIm1hcF9zdHJpbmdfYnl0ZXMiCisgICAgICAibWFwX3N0cmluZ19uZXN0ZWRfbWVzc2FnZSIKKyAgICAgICJtYXBfc3RyaW5nX2ZvcmVpZ25fbWVzc2FnZSIKKyAgICAgICJtYXBfc3RyaW5nX25lc3RlZF9lbnVtIgorICAgICAgIm1hcF9zdHJpbmdfZm9yZWlnbl9lbnVtIgorICAgICAgInBhY2tlZF9pbnQzMiIKKyAgICAgICJwYWNrZWRfaW50NjQiCisgICAgICAicGFja2VkX3VpbnQzMiIKKyAgICAgICJwYWNrZWRfdWludDY0IgorICAgICAgInBhY2tlZF9zaW50MzIiCisgICAgICAicGFja2VkX3NpbnQ2NCIKKyAgICAgICJwYWNrZWRfZml4ZWQzMiIKKyAgICAgICJwYWNrZWRfZml4ZWQ2NCIKKyAgICAgICJwYWNrZWRfc2ZpeGVkMzIiCisgICAgICAicGFja2VkX3NmaXhlZDY0IgorICAgICAgInBhY2tlZF9mbG9hdCIKKyAgICAgICJwYWNrZWRfZG91YmxlIgorICAgICAgInBhY2tlZF9ib29sIgorICAgICAgInBhY2tlZF9uZXN0ZWRfZW51bSIKKyAgICAgICJ1bnBhY2tlZF9pbnQzMiIKKyAgICAgICJ1bnBhY2tlZF9pbnQ2NCIKKyAgICAgICJ1bnBhY2tlZF91aW50MzIiCisgICAgICAidW5wYWNrZWRfdWludDY0IgorICAgICAgInVucGFja2VkX3NpbnQzMiIKKyAgICAgICJ1bnBhY2tlZF9zaW50NjQiCisgICAgICAidW5wYWNrZWRfZml4ZWQzMiIKKyAgICAgICJ1bnBhY2tlZF9maXhlZDY0IgorICAgICAgInVucGFja2VkX3NmaXhlZDMyIgorICAgICAgInVucGFja2VkX3NmaXhlZDY0IgorICAgICAgInVucGFja2VkX2Zsb2F0IgorICAgICAgInVucGFja2VkX2RvdWJsZSIKKyAgICAgICJ1bnBhY2tlZF9ib29sIgorICAgICAgInVucGFja2VkX25lc3RlZF9lbnVtIgorICAgICAgIm9uZW9mX3VpbnQzMiIKKyAgICAgICJvbmVvZl9uZXN0ZWRfbWVzc2FnZSIKKyAgICAgICJvbmVvZl9zdHJpbmciCisgICAgICAib25lb2ZfYnl0ZXMiCisgICAgICAib25lb2ZfYm9vbCIKKyAgICAgICJvbmVvZl91aW50NjQiCisgICAgICAib25lb2ZfZmxvYXQiCisgICAgICAib25lb2ZfZG91YmxlIgorICAgICAgIm9uZW9mX2VudW0iCisgICAgICAiZGF0YSIKKyAgICAgICJkZWZhdWx0X2ludDMyIgorICAgICAgImRlZmF1bHRfaW50NjQiCisgICAgICAiZGVmYXVsdF91aW50MzIiCisgICAgICAiZGVmYXVsdF91aW50NjQiCisgICAgICAiZGVmYXVsdF9zaW50MzIiCisgICAgICAiZGVmYXVsdF9zaW50NjQiCisgICAgICAiZGVmYXVsdF9maXhlZDMyIgorICAgICAgImRlZmF1bHRfZml4ZWQ2NCIKKyAgICAgICJkZWZhdWx0X3NmaXhlZDMyIgorICAgICAgImRlZmF1bHRfc2ZpeGVkNjQiCisgICAgICAiZGVmYXVsdF9mbG9hdCIKKyAgICAgICJkZWZhdWx0X2RvdWJsZSIKKyAgICAgICJkZWZhdWx0X2Jvb2wiCisgICAgICAiZGVmYXVsdF9zdHJpbmciCisgICAgICAiZGVmYXVsdF9ieXRlcyIKKyAgICAgICJvcHRpb25hbF9sYXp5X21lc3NhZ2UiCisgICAgICAicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIgorICAgICAgImZpZWxkbmFtZTEiCisgICAgICAiZmllbGRfbmFtZTIiCisgICAgICAiX2ZpZWxkX25hbWUzIgorICAgICAgImZpZWxkX19uYW1lNF8iCisgICAgICAiZmllbGQwbmFtZTUiCisgICAgICAiZmllbGRfMF9uYW1lNiIKKyAgICAgICJmaWVsZE5hbWU3IgorICAgICAgIkZpZWxkTmFtZTgiCisgICAgICAiZmllbGRfTmFtZTkiCisgICAgICAiRmllbGRfTmFtZTEwIgorICAgICAgIkZJRUxEX05BTUUxMSIKKyAgICAgICJGSUVMRF9uYW1lMTIiCisgICAgICAiX19maWVsZF9uYW1lMTMiCisgICAgICAiX19GaWVsZF9uYW1lMTQiCisgICAgICAiZmllbGRfX25hbWUxNSIKKyAgICAgICJmaWVsZF9fTmFtZTE2IgorICAgICAgImZpZWxkX25hbWUxN19fIgorICB9fSwKK307CisvLyBjbGFuZy1mb3JtYXQgb24KKworVEVTVF9GKEZpbmRGaWVsZEVudHJ5VGVzdCwgQmlnTWVzc2FnZSkgeworICBFWFBFQ1RfVEhBVChNZXNzYWdlTmFtZSh0ZXN0X2FsbF90eXBlc190YWJsZSksIEVxKCJNIikpOworICBmb3IgKGludCBmaWVsZF9udW0gOgorICAgICAgIHsxLCAxMiwgMzEsIDQyLCA1NywgNjgsIDc5LCA5MCwgMTAxLCAxMTksIDI0OSwgNDAyLCA0MTJ9KSB7CisgICAgYXV0byogZW50cnkgPSBGaW5kRmllbGRFbnRyeSh0ZXN0X2FsbF90eXBlc190YWJsZSwgZmllbGRfbnVtKTsKKyAgICBTdHJpbmdQaWVjZSBuYW1lID0gRmllbGROYW1lKHRlc3RfYWxsX3R5cGVzX3RhYmxlLCBlbnRyeSk7CisgICAgc3dpdGNoIChmaWVsZF9udW0pIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgRVhQRUNUX1RIQVQobmFtZSwgRXEoIm9wdGlvbmFsX2ludDMyIikpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTI6CisgICAgICAgIEVYUEVDVF9USEFUKG5hbWUsIEVxKCJvcHRpb25hbF9kb3VibGUiKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzMToKKyAgICAgICAgRVhQRUNUX1RIQVQobmFtZSwgRXEoInJlcGVhdGVkX2ludDMyIikpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDI6CisgICAgICAgIEVYUEVDVF9USEFUKG5hbWUsIEVxKCJyZXBlYXRlZF9kb3VibGUiKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1NzoKKyAgICAgICAgRVhQRUNUX1RIQVQobmFtZSwgRXEoIm1hcF9pbnQ2NF9pbnQ2NCIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDY4OgorICAgICAgICBFWFBFQ1RfVEhBVChuYW1lLCBFcSgibWFwX2Jvb2xfYm9vbCIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDc5OgorICAgICAgICBFWFBFQ1RfVEhBVChuYW1lLCBFcSgicGFja2VkX3NpbnQzMiIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDkwOgorICAgICAgICBFWFBFQ1RfVEhBVChuYW1lLCBFcSgidW5wYWNrZWRfaW50NjQiKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMDE6CisgICAgICAgIEVYUEVDVF9USEFUKG5hbWUsIEVxKCJ1bnBhY2tlZF9ib29sIikpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTE5OgorICAgICAgICBFWFBFQ1RfVEhBVChuYW1lLCBFcSgib25lb2ZfZW51bSIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI0OToKKyAgICAgICAgRVhQRUNUX1RIQVQobmFtZSwgRXEoImRlZmF1bHRfc2ZpeGVkMzIiKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0MDI6CisgICAgICAgIEVYUEVDVF9USEFUKG5hbWUsIEVxKCJmaWVsZF9uYW1lMiIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQxMjoKKyAgICAgICAgRVhQRUNUX1RIQVQobmFtZSwgRXEoIkZJRUxEX25hbWUxMiIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkMTJhMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5jYwpAQCAtMCwwICsxLDQwOSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworUFJPVE9CVUZfUFJBR01BX0lOSVRfU0VHCisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKwordm9pZCBEZXN0cm95TWVzc2FnZShjb25zdCB2b2lkKiBtZXNzYWdlKSB7CisgIHN0YXRpY19jYXN0PGNvbnN0IE1lc3NhZ2VMaXRlKj4obWVzc2FnZSktPn5NZXNzYWdlTGl0ZSgpOworfQordm9pZCBEZXN0cm95U3RyaW5nKGNvbnN0IHZvaWQqIHMpIHsKKyAgc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjpzdHJpbmcqPihzKS0+fmJhc2ljX3N0cmluZygpOworfQorCitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQKKyAgICBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgRXhwbGljaXRseUNvbnN0cnVjdGVkQXJlbmFTdHJpbmcKKyAgICAgICAgZml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmd7fTsgIC8vIE5PTElOVAorCisKK1BST1RPQlVGX0NPTlNUSU5JVCBzdGQ6OmF0b21pYzxib29sPiBpbml0X3Byb3RvYnVmX2RlZmF1bHRzX3N0YXRle2ZhbHNlfTsKK3N0YXRpYyBib29sIEluaXRQcm90b2J1ZkRlZmF1bHRzSW1wbCgpIHsKKyAgZml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcuRGVmYXVsdENvbnN0cnVjdCgpOworICBPblNodXRkb3duRGVzdHJveVN0cmluZyhmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZy5nZXRfbXV0YWJsZSgpKTsKKworCisgIGluaXRfcHJvdG9idWZfZGVmYXVsdHNfc3RhdGUuc3RvcmUodHJ1ZSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEluaXRQcm90b2J1ZkRlZmF1bHRzU2xvdygpIHsKKyAgc3RhdGljIGJvb2wgaXNfaW5pdGVkID0gSW5pdFByb3RvYnVmRGVmYXVsdHNJbXBsKCk7CisgICh2b2lkKWlzX2luaXRlZDsKK30KKy8vIEZvcmNlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZW1wdHkgc3RyaW5nLgorLy8gTm9ybWFsbHksIHJlZ2lzdHJhdGlvbiB3b3VsZCBkbyBpdCwgYnV0IHdlIGRvbid0IGhhdmUgYW55IGd1YXJhbnRlZSB0aGF0CisvLyB0aGVyZSBpcyBhbnkgb2JqZWN0IHdpdGggcmVmbGVjdGlvbi4KK1BST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgaW5pdF9lbXB0eV9zdHJpbmcgPQorICAgIChJbml0UHJvdG9idWZEZWZhdWx0c1Nsb3coKSwgc3RkOjp0cnVlX3R5cGV7fSk7CisKK3NpemVfdCBTdHJpbmdTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIGNvbnN0IHZvaWQqIHN0YXJ0ID0gJnN0cjsKKyAgY29uc3Qgdm9pZCogZW5kID0gJnN0ciArIDE7CisgIGlmIChzdGFydCA8PSBzdHIuZGF0YSgpICYmIHN0ci5kYXRhKCkgPCBlbmQpIHsKKyAgICAvLyBUaGUgc3RyaW5nJ3MgZGF0YSBpcyBzdG9yZWQgaW5zaWRlIHRoZSBzdHJpbmcgb2JqZWN0IGl0c2VsZi4KKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc3RyLmNhcGFjaXR5KCk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citjb25zdCBUJiBHZXQoY29uc3Qgdm9pZCogcHRyKSB7CisgIHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgVCo+KHB0cik7Cit9CisKKy8vIFByaW1pdGl2ZVR5cGVIZWxwZXIgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgaW50ZXJmYWNlIG9mIFdpcmVGb3JtYXRMaXRlLgorLy8gV2lyZUZvcm1hdExpdGUgaGFzIGEgdmVyeSBpbmNvbnZlbmllbnQgaW50ZXJmYWNlIHdpdGggcmVzcGVjdCB0byB0ZW1wbGF0ZQorLy8gbWV0YS1wcm9ncmFtbWluZy4gVGhpcyBjbGFzcyB3cmFwcyB0aGUgZGlmZmVyZW50IG5hbWVkIGZ1bmN0aW9ucyBpbnRvCisvLyBhIHNpbmdsZSBTZXJpYWxpemUgLyBTZXJpYWxpemVUb0FycmF5IGludGVyZmFjZS4KK3RlbXBsYXRlIDxpbnQgdHlwZT4KK3N0cnVjdCBQcmltaXRpdmVUeXBlSGVscGVyOworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFByaW1pdGl2ZVR5cGVIZWxwZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4geworICB0eXBlZGVmIGJvb2wgVHlwZTsKKyAgc3RhdGljIHZvaWQgU2VyaWFsaXplKGNvbnN0IHZvaWQqIHB0ciwgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sTm9UYWcoR2V0PGJvb2w+KHB0ciksIG91dHB1dCk7CisgIH0KKyAgc3RhdGljIHVpbnQ4X3QqIFNlcmlhbGl6ZVRvQXJyYXkoY29uc3Qgdm9pZCogcHRyLCB1aW50OF90KiBidWZmZXIpIHsKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbE5vVGFnVG9BcnJheShHZXQ8VHlwZT4ocHRyKSwgYnVmZmVyKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBQcmltaXRpdmVUeXBlSGVscGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPiB7CisgIHR5cGVkZWYgaW50MzJfdCBUeXBlOworICBzdGF0aWMgdm9pZCBTZXJpYWxpemUoY29uc3Qgdm9pZCogcHRyLCBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyTm9UYWcoR2V0PGludDMyX3Q+KHB0ciksIG91dHB1dCk7CisgIH0KKyAgc3RhdGljIHVpbnQ4X3QqIFNlcmlhbGl6ZVRvQXJyYXkoY29uc3Qgdm9pZCogcHRyLCB1aW50OF90KiBidWZmZXIpIHsKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJOb1RhZ1RvQXJyYXkoR2V0PFR5cGU+KHB0ciksIGJ1ZmZlcik7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgUHJpbWl0aXZlVHlwZUhlbHBlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TSU5UMzI+IHsKKyAgdHlwZWRlZiBpbnQzMl90IFR5cGU7CisgIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZShjb25zdCB2b2lkKiBwdHIsIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDMyTm9UYWcoR2V0PGludDMyX3Q+KHB0ciksIG91dHB1dCk7CisgIH0KKyAgc3RhdGljIHVpbnQ4X3QqIFNlcmlhbGl6ZVRvQXJyYXkoY29uc3Qgdm9pZCogcHRyLCB1aW50OF90KiBidWZmZXIpIHsKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDMyTm9UYWdUb0FycmF5KEdldDxUeXBlPihwdHIpLCBidWZmZXIpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFByaW1pdGl2ZVR5cGVIZWxwZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfVUlOVDMyPiB7CisgIHR5cGVkZWYgdWludDMyX3QgVHlwZTsKKyAgc3RhdGljIHZvaWQgU2VyaWFsaXplKGNvbnN0IHZvaWQqIHB0ciwgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzJOb1RhZyhHZXQ8dWludDMyX3Q+KHB0ciksIG91dHB1dCk7CisgIH0KKyAgc3RhdGljIHVpbnQ4X3QqIFNlcmlhbGl6ZVRvQXJyYXkoY29uc3Qgdm9pZCogcHRyLCB1aW50OF90KiBidWZmZXIpIHsKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDMyTm9UYWdUb0FycmF5KEdldDxUeXBlPihwdHIpLCBidWZmZXIpOworICB9Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBQcmltaXRpdmVUeXBlSGVscGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDY0PiB7CisgIHR5cGVkZWYgaW50NjRfdCBUeXBlOworICBzdGF0aWMgdm9pZCBTZXJpYWxpemUoY29uc3Qgdm9pZCogcHRyLCBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0Tm9UYWcoR2V0PGludDY0X3Q+KHB0ciksIG91dHB1dCk7CisgIH0KKyAgc3RhdGljIHVpbnQ4X3QqIFNlcmlhbGl6ZVRvQXJyYXkoY29uc3Qgdm9pZCogcHRyLCB1aW50OF90KiBidWZmZXIpIHsKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OldyaXRlSW50NjROb1RhZ1RvQXJyYXkoR2V0PFR5cGU+KHB0ciksIGJ1ZmZlcik7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgUHJpbWl0aXZlVHlwZUhlbHBlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TSU5UNjQ+IHsKKyAgdHlwZWRlZiBpbnQ2NF90IFR5cGU7CisgIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZShjb25zdCB2b2lkKiBwdHIsIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDY0Tm9UYWcoR2V0PGludDY0X3Q+KHB0ciksIG91dHB1dCk7CisgIH0KKyAgc3RhdGljIHVpbnQ4X3QqIFNlcmlhbGl6ZVRvQXJyYXkoY29uc3Qgdm9pZCogcHRyLCB1aW50OF90KiBidWZmZXIpIHsKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDY0Tm9UYWdUb0FycmF5KEdldDxUeXBlPihwdHIpLCBidWZmZXIpOworICB9Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBQcmltaXRpdmVUeXBlSGVscGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX1VJTlQ2ND4geworICB0eXBlZGVmIHVpbnQ2NF90IFR5cGU7CisgIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZShjb25zdCB2b2lkKiBwdHIsIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDY0Tm9UYWcoR2V0PHVpbnQ2NF90PihwdHIpLCBvdXRwdXQpOworICB9CisgIHN0YXRpYyB1aW50OF90KiBTZXJpYWxpemVUb0FycmF5KGNvbnN0IHZvaWQqIHB0ciwgdWludDhfdCogYnVmZmVyKSB7CisgICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQ2NE5vVGFnVG9BcnJheShHZXQ8VHlwZT4ocHRyKSwgYnVmZmVyKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBQcmltaXRpdmVUeXBlSGVscGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX0ZJWEVEMzI+IHsKKyAgdHlwZWRlZiB1aW50MzJfdCBUeXBlOworICBzdGF0aWMgdm9pZCBTZXJpYWxpemUoY29uc3Qgdm9pZCogcHRyLCBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkMzJOb1RhZyhHZXQ8dWludDMyX3Q+KHB0ciksIG91dHB1dCk7CisgIH0KKyAgc3RhdGljIHVpbnQ4X3QqIFNlcmlhbGl6ZVRvQXJyYXkoY29uc3Qgdm9pZCogcHRyLCB1aW50OF90KiBidWZmZXIpIHsKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQzMk5vVGFnVG9BcnJheShHZXQ8VHlwZT4ocHRyKSwgYnVmZmVyKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBQcmltaXRpdmVUeXBlSGVscGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX0ZJWEVENjQ+IHsKKyAgdHlwZWRlZiB1aW50NjRfdCBUeXBlOworICBzdGF0aWMgdm9pZCBTZXJpYWxpemUoY29uc3Qgdm9pZCogcHRyLCBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkNjROb1RhZyhHZXQ8dWludDY0X3Q+KHB0ciksIG91dHB1dCk7CisgIH0KKyAgc3RhdGljIHVpbnQ4X3QqIFNlcmlhbGl6ZVRvQXJyYXkoY29uc3Qgdm9pZCogcHRyLCB1aW50OF90KiBidWZmZXIpIHsKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQ2NE5vVGFnVG9BcnJheShHZXQ8VHlwZT4ocHRyKSwgYnVmZmVyKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBQcmltaXRpdmVUeXBlSGVscGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+CisgICAgOiBQcmltaXRpdmVUeXBlSGVscGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPiB7fTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBQcmltaXRpdmVUeXBlSGVscGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NGSVhFRDMyPgorICAgIDogUHJpbWl0aXZlVHlwZUhlbHBlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9GSVhFRDMyPiB7CisgIHR5cGVkZWYgaW50MzJfdCBUeXBlOworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgUHJpbWl0aXZlVHlwZUhlbHBlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TRklYRUQ2ND4KKyAgICA6IFByaW1pdGl2ZVR5cGVIZWxwZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfRklYRUQ2ND4geworICB0eXBlZGVmIGludDY0X3QgVHlwZTsKK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IFByaW1pdGl2ZVR5cGVIZWxwZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfRkxPQVQ+CisgICAgOiBQcmltaXRpdmVUeXBlSGVscGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX0ZJWEVEMzI+IHsKKyAgdHlwZWRlZiBmbG9hdCBUeXBlOworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgUHJpbWl0aXZlVHlwZUhlbHBlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9ET1VCTEU+CisgICAgOiBQcmltaXRpdmVUeXBlSGVscGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX0ZJWEVENjQ+IHsKKyAgdHlwZWRlZiBkb3VibGUgVHlwZTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgUHJpbWl0aXZlVHlwZUhlbHBlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TVFJJTkc+IHsKKyAgdHlwZWRlZiBzdGQ6OnN0cmluZyBUeXBlOworICBzdGF0aWMgdm9pZCBTZXJpYWxpemUoY29uc3Qgdm9pZCogcHRyLCBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICAgIGNvbnN0IFR5cGUmIHZhbHVlID0gKnN0YXRpY19jYXN0PGNvbnN0IFR5cGUqPihwdHIpOworICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMih2YWx1ZS5zaXplKCkpOworICAgIG91dHB1dC0+V3JpdGVSYXdNYXliZUFsaWFzZWQodmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHN0YXRpYyB1aW50OF90KiBTZXJpYWxpemVUb0FycmF5KGNvbnN0IHZvaWQqIHB0ciwgdWludDhfdCogYnVmZmVyKSB7CisgICAgY29uc3QgVHlwZSYgdmFsdWUgPSAqc3RhdGljX2Nhc3Q8Y29uc3QgVHlwZSo+KHB0cik7CisgICAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVTdHJpbmdXaXRoU2l6ZVRvQXJyYXkodmFsdWUsIGJ1ZmZlcik7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgUHJpbWl0aXZlVHlwZUhlbHBlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CWVRFUz4KKyAgICA6IFByaW1pdGl2ZVR5cGVIZWxwZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfU1RSSU5HPiB7fTsKKworLy8gV2Ugd2FudCB0byBzZXJpYWxpemUgdG8gYm90aCBDb2RlZE91dHB1dFN0cmVhbSBhbmQgZGlyZWN0bHkgaW50byBieXRlIGFycmF5cworLy8gd2l0aG91dCBkdXBsaWNhdGluZyB0aGUgY29kZS4gSW4gZmFjdCB3ZSBtaWdodCB3YW50IGV4dHJhIG91dHB1dCBjaGFubmVscyBpbgorLy8gdGhlIGZ1dHVyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBPLCBpbnQgdHlwZT4KK3N0cnVjdCBPdXRwdXRIZWxwZXI7CisKK3RlbXBsYXRlIDxpbnQgdHlwZSwgdHlwZW5hbWUgTz4KK3ZvaWQgU2VyaWFsaXplVG8oY29uc3Qgdm9pZCogcHRyLCBPKiBvdXRwdXQpIHsKKyAgT3V0cHV0SGVscGVyPE8sIHR5cGU+OjpTZXJpYWxpemUocHRyLCBvdXRwdXQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTz4KK3ZvaWQgV3JpdGVUYWdUbyh1aW50MzJfdCB0YWcsIE8qIG91dHB1dCkgeworICBTZXJpYWxpemVUbzxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9VSU5UMzI+KCZ0YWcsIG91dHB1dCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBPPgordm9pZCBXcml0ZUxlbmd0aFRvKHVpbnQzMl90IGxlbmd0aCwgTyogb3V0cHV0KSB7CisgIFNlcmlhbGl6ZVRvPFdpcmVGb3JtYXRMaXRlOjpUWVBFX1VJTlQzMj4oJmxlbmd0aCwgb3V0cHV0KTsKK30KKworLy8gU3BlY2lhbGl6YXRpb24gZm9yIGNvZGVkIG91dHB1dCBzdHJlYW0KK3RlbXBsYXRlIDxpbnQgdHlwZT4KK3N0cnVjdCBPdXRwdXRIZWxwZXI8aW86OkNvZGVkT3V0cHV0U3RyZWFtLCB0eXBlPiB7CisgIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZShjb25zdCB2b2lkKiBwdHIsIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgICAgUHJpbWl0aXZlVHlwZUhlbHBlcjx0eXBlPjo6U2VyaWFsaXplKHB0ciwgb3V0cHV0KTsKKyAgfQorfTsKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yIHdyaXRpbmcgaW50byBhIHBsYWluIGFycmF5CitzdHJ1Y3QgQXJyYXlPdXRwdXQgeworICB1aW50OF90KiBwdHI7CisgIGJvb2wgaXNfZGV0ZXJtaW5pc3RpYzsKK307CisKK3RlbXBsYXRlIDxpbnQgdHlwZT4KK3N0cnVjdCBPdXRwdXRIZWxwZXI8QXJyYXlPdXRwdXQsIHR5cGU+IHsKKyAgc3RhdGljIHZvaWQgU2VyaWFsaXplKGNvbnN0IHZvaWQqIHB0ciwgQXJyYXlPdXRwdXQqIG91dHB1dCkgeworICAgIG91dHB1dC0+cHRyID0gUHJpbWl0aXZlVHlwZUhlbHBlcjx0eXBlPjo6U2VyaWFsaXplVG9BcnJheShwdHIsIG91dHB1dC0+cHRyKTsKKyAgfQorfTsKKwordm9pZCBTZXJpYWxpemVNZXNzYWdlTm9UYWJsZShjb25zdCBNZXNzYWdlTGl0ZSogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBtc2ctPlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhvdXRwdXQpOworfQorCit2b2lkIFNlcmlhbGl6ZU1lc3NhZ2VOb1RhYmxlKGNvbnN0IE1lc3NhZ2VMaXRlKiBtc2csIEFycmF5T3V0cHV0KiBvdXRwdXQpIHsKKyAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbShvdXRwdXQtPnB0ciwgSU5UX01BWCk7CisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvKCZhcnJheV9zdHJlYW0pOworICBvLlNldFNlcmlhbGl6YXRpb25EZXRlcm1pbmlzdGljKG91dHB1dC0+aXNfZGV0ZXJtaW5pc3RpYyk7CisgIG1zZy0+U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvKTsKKyAgb3V0cHV0LT5wdHIgKz0gby5CeXRlQ291bnQoKTsKK30KKworLy8gV2UgbmVlZCB0byB1c2UgYSBoZWxwZXIgY2xhc3MgdG8gZ2V0IGFjY2VzcyB0byB0aGUgcHJpdmF0ZSBtZW1iZXJzCitjbGFzcyBBY2Nlc3NvckhlbHBlciB7CisgcHVibGljOgorICBzdGF0aWMgaW50IFNpemUoY29uc3QgUmVwZWF0ZWRQdHJGaWVsZEJhc2UmIHgpIHsgcmV0dXJuIHguc2l6ZSgpOyB9CisgIHN0YXRpYyB2b2lkIGNvbnN0KiBHZXQoY29uc3QgUmVwZWF0ZWRQdHJGaWVsZEJhc2UmIHgsIGludCBpZHgpIHsKKyAgICByZXR1cm4geC5yYXdfZGF0YSgpW2lkeF07CisgIH0KK307CisKK3ZvaWQgU2VyaWFsaXplTm90SW1wbGVtZW50ZWQoaW50IGZpZWxkKSB7CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJOb3QgaW1wbGVtZW50ZWQgZmllbGQgbnVtYmVyICIgPDwgZmllbGQ7Cit9CisKKy8vIFdoZW4gc3dpdGNoaW5nIHRvIGMrKzExIHdlIHNob3VsZCBtYWtlIHRoZXNlIGNvbnN0ZXhwciBmdW5jdGlvbnMKKyNkZWZpbmUgU0VSSUFMSVpFX1RBQkxFX09QKHR5cGUsIHR5cGVfY2xhc3MpIFwKKyAgKCh0eXBlIC0gMSkgKyBzdGF0aWNfY2FzdDxpbnQ+KHR5cGVfY2xhc3MpICogRmllbGRNZXRhZGF0YTo6a051bVR5cGVzKQorCit0ZW1wbGF0ZSA8aW50IHR5cGU+Citib29sIElzTnVsbChjb25zdCB2b2lkKiBwdHIpIHsKKyAgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCB0eXBlbmFtZSBQcmltaXRpdmVUeXBlSGVscGVyPHR5cGU+OjpUeXBlKj4ocHRyKSA9PQorICAgICAgICAgMDsKK30KKwordGVtcGxhdGUgPD4KK2Jvb2wgSXNOdWxsPFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NUUklORz4oY29uc3Qgdm9pZCogcHRyKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBBcmVuYVN0cmluZ1B0cio+KHB0ciktPkdldCgpLnNpemUoKSA9PSAwOworfQorCit0ZW1wbGF0ZSA8PgorYm9vbCBJc051bGw8V2lyZUZvcm1hdExpdGU6OlRZUEVfQllURVM+KGNvbnN0IHZvaWQqIHB0cikgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgQXJlbmFTdHJpbmdQdHIqPihwdHIpLT5HZXQoKS5zaXplKCkgPT0gMDsKK30KKwordGVtcGxhdGUgPD4KK2Jvb2wgSXNOdWxsPFdpcmVGb3JtYXRMaXRlOjpUWVBFX0dST1VQPihjb25zdCB2b2lkKiBwdHIpIHsKKyAgcmV0dXJuIEdldDxjb25zdCBNZXNzYWdlTGl0ZSo+KHB0cikgPT0gbnVsbHB0cjsKK30KKwordGVtcGxhdGUgPD4KK2Jvb2wgSXNOdWxsPFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0U+KGNvbnN0IHZvaWQqIHB0cikgeworICByZXR1cm4gR2V0PGNvbnN0IE1lc3NhZ2VMaXRlKj4ocHRyKSA9PSBudWxscHRyOworfQorCit2b2lkIEV4dGVuc2lvblNlcmlhbGl6ZXIoY29uc3QgTWVzc2FnZUxpdGUqIGV4dGVuZGVlLCBjb25zdCB1aW50OF90KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCB0YWcsIHVpbnQzMl90IGhhc19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHRlbnNpb25TZXQqPihwdHIgKyBvZmZzZXQpCisgICAgICAtPlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhleHRlbmRlZSwgdGFnLCBoYXNfb2Zmc2V0LCBvdXRwdXQpOworfQorCit2b2lkIFVua25vd25GaWVsZFNlcmlhbGl6ZXJMaXRlKGNvbnN0IHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAvKnRhZyovLCB1aW50MzJfdCAvKmhhc19vZmZzZXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZVN0cmluZygKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgSW50ZXJuYWxNZXRhZGF0YSo+KHB0ciArIG9mZnNldCkKKyAgICAgICAgICAtPnVua25vd25fZmllbGRzPHN0ZDo6c3RyaW5nPigmaW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKSk7Cit9CisKK01lc3NhZ2VMaXRlKiBEdXBsaWNhdGVJZk5vbk51bGxJbnRlcm5hbChNZXNzYWdlTGl0ZSogbWVzc2FnZSkgeworICBpZiAobWVzc2FnZSkgeworICAgIE1lc3NhZ2VMaXRlKiByZXQgPSBtZXNzYWdlLT5OZXcoKTsKKyAgICByZXQtPkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgqbWVzc2FnZSk7CisgICAgcmV0dXJuIHJldDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorfQorCit2b2lkIEdlbmVyaWNTd2FwKE1lc3NhZ2VMaXRlKiBtMSwgTWVzc2FnZUxpdGUqIG0yKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlTGl0ZT4gdG1wKG0xLT5OZXcoKSk7CisgIHRtcC0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKCptMSk7CisgIG0xLT5DbGVhcigpOworICBtMS0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKCptMik7CisgIG0yLT5DbGVhcigpOworICBtMi0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKCp0bXApOworfQorCisvLyBSZXR1cm5zIGEgbWVzc2FnZSBvd25lZCBieSB0aGlzIEFyZW5hLiAgVGhpcyBtYXkgcmVxdWlyZSBPd24oKWluZyBvcgorLy8gZHVwbGljYXRpbmcgdGhlIG1lc3NhZ2UuCitNZXNzYWdlTGl0ZSogR2V0T3duZWRNZXNzYWdlSW50ZXJuYWwoQXJlbmEqIG1lc3NhZ2VfYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIHN1Ym1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJlbmEqIHN1Ym1lc3NhZ2VfYXJlbmEpIHsKKyAgR09PR0xFX0RDSEVDSyhBcmVuYTo6SW50ZXJuYWxHZXRPd25pbmdBcmVuYShzdWJtZXNzYWdlKSA9PSBzdWJtZXNzYWdlX2FyZW5hKTsKKyAgR09PR0xFX0RDSEVDSyhtZXNzYWdlX2FyZW5hICE9IHN1Ym1lc3NhZ2VfYXJlbmEpOworICBHT09HTEVfRENIRUNLX0VRKHN1Ym1lc3NhZ2VfYXJlbmEsIG51bGxwdHIpOworICBpZiAobWVzc2FnZV9hcmVuYSAhPSBudWxscHRyICYmIHN1Ym1lc3NhZ2VfYXJlbmEgPT0gbnVsbHB0cikgeworICAgIG1lc3NhZ2VfYXJlbmEtPk93bihzdWJtZXNzYWdlKTsKKyAgICByZXR1cm4gc3VibWVzc2FnZTsKKyAgfSBlbHNlIHsKKyAgICBNZXNzYWdlTGl0ZSogcmV0ID0gc3VibWVzc2FnZS0+TmV3KG1lc3NhZ2VfYXJlbmEpOworICAgIHJldC0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKCpzdWJtZXNzYWdlKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZDE1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaApAQCAtMCwwICsxLDIxNCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBtaXNjZWxsYW5lb3VzIGhlbHBlciBjb2RlIHVzZWQgYnkgZ2VuZXJhdGVkIGNvZGUgLS0KKy8vIGluY2x1ZGluZyBsaXRlIHR5cGVzIC0tIGJ1dCB3aGljaCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYnkgdXNlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX1VUSUxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9VVElMX0hfXworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+ICAvLyBBZGQgZGlyZWN0IGRlcCBvbiBwb3J0IGZvciBwYi5jYworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYW55Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2hhc19iaXRzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2ltcGxpY2l0X3dlYWtfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworI2lmZGVmIFNXSUcKKyNlcnJvciAiWW91IGNhbm5vdCBTV0lHIHByb3RvIGhlYWRlcnMiCisjZW5kaWYKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitjbGFzcyBBcmVuYTsKK2NsYXNzIE1lc3NhZ2U7CisKK25hbWVzcGFjZSBpbyB7CitjbGFzcyBDb2RlZElucHV0U3RyZWFtOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+CitpbmxpbmUgVG8gRG93bkNhc3QoRnJvbSogZikgeworICByZXR1cm4gUFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6ZG93bl9jYXN0PFRvPihmKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4KK2lubGluZSBUbyBEb3duQ2FzdChGcm9tJiBmKSB7CisgIHJldHVybiBQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpkb3duX2Nhc3Q8VG8+KGYpOworfQorCisKKy8vIFRoaXMgZmFzdHBhdGggaW5saW5lcyBhIHNpbmdsZSBicmFuY2ggaW5zdGVhZCBvZiBoYXZpbmcgdG8gbWFrZSB0aGUKKy8vIEluaXRQcm90b2J1ZkRlZmF1bHRzIGZ1bmN0aW9uIGNhbGwuCisvLyBJdCBhbHNvIGdlbmVyYXRlcyBsZXNzIGlubGluZWQgY29kZSB0aGFuIGEgZnVuY3Rpb24tc2NvcGUgc3RhdGljIGluaXRpYWxpemVyLgorUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBzdGQ6OmF0b21pYzxib29sPiBpbml0X3Byb3RvYnVmX2RlZmF1bHRzX3N0YXRlOworUFJPVE9CVUZfRVhQT1JUIHZvaWQgSW5pdFByb3RvYnVmRGVmYXVsdHNTbG93KCk7CitQUk9UT0JVRl9FWFBPUlQgaW5saW5lIHZvaWQgSW5pdFByb3RvYnVmRGVmYXVsdHMoKSB7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKAorICAgICAgICAgICFpbml0X3Byb3RvYnVmX2RlZmF1bHRzX3N0YXRlLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSkpKSB7CisgICAgSW5pdFByb3RvYnVmRGVmYXVsdHNTbG93KCk7CisgIH0KK30KKworLy8gVGhpcyB1c2VkIGJ5IHByb3RvMQorUFJPVE9CVUZfRVhQT1JUIGlubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgR2V0RW1wdHlTdHJpbmcoKSB7CisgIEluaXRQcm90b2J1ZkRlZmF1bHRzKCk7CisgIHJldHVybiBHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKTsKK30KKworCisvLyBUcnVlIGlmIElzSW5pdGlhbGl6ZWQoKSBpcyB0cnVlIGZvciBhbGwgZWxlbWVudHMgb2YgdC4gIFR5cGUgaXMgZXhwZWN0ZWQKKy8vIHRvIGJlIGEgUmVwZWF0ZWRQdHJGaWVsZDxzb21lIG1lc3NhZ2UgdHlwZT4uICBJdCdzIHVzZWZ1bCB0byBoYXZlIHRoaXMKKy8vIGhlbHBlciBoZXJlIHRvIGtlZXAgdGhlIHByb3RvYnVmIGNvbXBpbGVyIGZyb20gZXZlciBoYXZpbmcgdG8gZW1pdCBsb29wcyBpbgorLy8gSXNJbml0aWFsaXplZCgpIG1ldGhvZHMuICBXZSB3YW50IHRoZSBDKysgY29tcGlsZXIgdG8gaW5saW5lIHRoaXMgb3Igbm90CisvLyBhcyBpdCBzZWVzIGZpdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNc2c+Citib29sIEFsbEFyZUluaXRpYWxpemVkKGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8TXNnPiYgdCkgeworICBmb3IgKGludCBpID0gdC5zaXplKCk7IC0taSA+PSAwOykgeworICAgIGlmICghdC5HZXQoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vICJXZWFrIiB2YXJpYW50IG9mIEFsbEFyZUluaXRpYWxpemVkLCB1c2VkIHRvIGltcGxlbWVudCBpbXBsaWNpdCB3ZWFrIGZpZWxkcy4KKy8vIFRoaXMgdmVyc2lvbiBvcGVyYXRlcyBvbiBNZXNzYWdlTGl0ZSB0byBhdm9pZCBpbnRyb2R1Y2luZyBhIGRlcGVuZGVuY3kgb24gdGhlCisvLyBjb25jcmV0ZSBtZXNzYWdlIHR5cGUuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgQWxsQXJlSW5pdGlhbGl6ZWRXZWFrKGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8VD4mIHQpIHsKKyAgZm9yIChpbnQgaSA9IHQuc2l6ZSgpOyAtLWkgPj0gMDspIHsKKyAgICBpZiAoIXJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVwZWF0ZWRQdHJGaWVsZEJhc2UmPih0KQorICAgICAgICAgICAgIC5HZXQ8SW1wbGljaXRXZWFrVHlwZUhhbmRsZXI8VD4gPihpKQorICAgICAgICAgICAgIC5Jc0luaXRpYWxpemVkKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBib29sIElzUHJlc2VudChjb25zdCB2b2lkKiBiYXNlLCB1aW50MzJfdCBoYXNiaXQpIHsKKyAgY29uc3QgdWludDMyX3QqIGhhc19iaXRzX2FycmF5ID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDMyX3QqPihiYXNlKTsKKyAgcmV0dXJuIChoYXNfYml0c19hcnJheVtoYXNiaXQgLyAzMl0gJiAoMXUgPDwgKGhhc2JpdCAmIDMxKSkpICE9IDA7Cit9CisKK2lubGluZSBib29sIElzT25lb2ZQcmVzZW50KGNvbnN0IHZvaWQqIGJhc2UsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgdGFnKSB7CisgIGNvbnN0IHVpbnQzMl90KiBvbmVvZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPigKKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihiYXNlKSArIG9mZnNldCk7CisgIHJldHVybiAqb25lb2YgPT0gdGFnID4+IDM7Cit9CisKK3R5cGVkZWYgdm9pZCAoKlNwZWNpYWxTZXJpYWxpemVyKShjb25zdCB1aW50OF90KiBiYXNlLCB1aW50MzJfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGFnLCB1aW50MzJfdCBoYXNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKworUFJPVE9CVUZfRVhQT1JUIHZvaWQgRXh0ZW5zaW9uU2VyaWFsaXplcihjb25zdCBNZXNzYWdlTGl0ZSogZXh0ZW5kZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0YWcsIHVpbnQzMl90IGhhc19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKK1BST1RPQlVGX0VYUE9SVCB2b2lkIFVua25vd25GaWVsZFNlcmlhbGl6ZXJMaXRlKGNvbnN0IHVpbnQ4X3QqIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhhc19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisKK1BST1RPQlVGX0VYUE9SVCBNZXNzYWdlTGl0ZSogRHVwbGljYXRlSWZOb25OdWxsSW50ZXJuYWwoTWVzc2FnZUxpdGUqIG1lc3NhZ2UpOworUFJPVE9CVUZfRVhQT1JUIE1lc3NhZ2VMaXRlKiBHZXRPd25lZE1lc3NhZ2VJbnRlcm5hbChBcmVuYSogbWVzc2FnZV9hcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIHN1Ym1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZW5hKiBzdWJtZXNzYWdlX2FyZW5hKTsKK1BST1RPQlVGX0VYUE9SVCB2b2lkIEdlbmVyaWNTd2FwKE1lc3NhZ2VMaXRlKiBtMSwgTWVzc2FnZUxpdGUqIG0yKTsKKy8vIFdlIHNwZWNpYWxpemUgR2VuZXJpY1N3YXAgZm9yIG5vbi1saXRlIG1lc3NhZ2VzIHRvIGJlbmVmaXQgZnJvbSByZWZsZWN0aW9uLgorUFJPVE9CVUZfRVhQT1JUIHZvaWQgR2VuZXJpY1N3YXAoTWVzc2FnZSogbTEsIE1lc3NhZ2UqIG0yKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUKiBEdXBsaWNhdGVJZk5vbk51bGwoVCogbWVzc2FnZSkgeworICAvLyBUaGUgY2FzdHMgbXVzdCBiZSByZWludGVycHJldF9jYXN0PD4gYmVjYXVzZSBUIG1pZ2h0IGJlIGEgZm9yd2FyZC1kZWNsYXJlZAorICAvLyB0eXBlIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXNuJ3Qga25vdyBpcyByZWxhdGVkIHRvIE1lc3NhZ2VMaXRlLgorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oCisgICAgICBEdXBsaWNhdGVJZk5vbk51bGxJbnRlcm5hbChyZWludGVycHJldF9jYXN0PE1lc3NhZ2VMaXRlKj4obWVzc2FnZSkpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUKiBHZXRPd25lZE1lc3NhZ2UoQXJlbmEqIG1lc3NhZ2VfYXJlbmEsIFQqIHN1Ym1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgQXJlbmEqIHN1Ym1lc3NhZ2VfYXJlbmEpIHsKKyAgLy8gVGhlIGNhc3RzIG11c3QgYmUgcmVpbnRlcnByZXRfY2FzdDw+IGJlY2F1c2UgVCBtaWdodCBiZSBhIGZvcndhcmQtZGVjbGFyZWQKKyAgLy8gdHlwZSB0aGF0IHRoZSBjb21waWxlciBkb2Vzbid0IGtub3cgaXMgcmVsYXRlZCB0byBNZXNzYWdlTGl0ZS4KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KEdldE93bmVkTWVzc2FnZUludGVybmFsKAorICAgICAgbWVzc2FnZV9hcmVuYSwgcmVpbnRlcnByZXRfY2FzdDxNZXNzYWdlTGl0ZSo+KHN1Ym1lc3NhZ2UpLAorICAgICAgc3VibWVzc2FnZV9hcmVuYSkpOworfQorCisvLyBIaWRlIGF0b21pYyBmcm9tIHRoZSBwdWJsaWMgaGVhZGVyIGFuZCBhbGxvdyBlYXN5IGNoYW5nZSB0byByZWd1bGFyIGludAorLy8gb24gcGxhdGZvcm1zIHdoZXJlIHRoZSBhdG9taWMgbWlnaHQgaGF2ZSBhIHBlcmYgaW1wYWN0LgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIENhY2hlZFNpemUgeworIHB1YmxpYzoKKyAgaW50IEdldCgpIGNvbnN0IHsgcmV0dXJuIHNpemVfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7IH0KKyAgdm9pZCBTZXQoaW50IHNpemUpIHsgc2l6ZV8uc3RvcmUoc2l6ZSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6YXRvbWljPGludD4gc2l6ZV97MH07Cit9OworCitQUk9UT0JVRl9FWFBPUlQgdm9pZCBEZXN0cm95TWVzc2FnZShjb25zdCB2b2lkKiBtZXNzYWdlKTsKK1BST1RPQlVGX0VYUE9SVCB2b2lkIERlc3Ryb3lTdHJpbmcoY29uc3Qgdm9pZCogcyk7CisvLyBEZXN0cm95IChub3QgZGVsZXRlKSB0aGUgbWVzc2FnZQoraW5saW5lIHZvaWQgT25TaHV0ZG93bkRlc3Ryb3lNZXNzYWdlKGNvbnN0IHZvaWQqIHB0cikgeworICBPblNodXRkb3duUnVuKERlc3Ryb3lNZXNzYWdlLCBwdHIpOworfQorLy8gRGVzdHJveSB0aGUgc3RyaW5nIChjYWxsIHN0ZDo6c3RyaW5nIGRlc3RydWN0b3IpCitpbmxpbmUgdm9pZCBPblNodXRkb3duRGVzdHJveVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyogcHRyKSB7CisgIE9uU2h1dGRvd25SdW4oRGVzdHJveVN0cmluZywgcHRyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfVVRJTF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvaGFzX2JpdHMuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvaGFzX2JpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGE0NTg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9oYXNfYml0cy5oCkBAIC0wLDAgKzEsMTE3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfSEFTX0JJVFNfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNfQklUU19IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydC5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworI2lmZGVmIFNXSUcKKyNlcnJvciAiWW91IGNhbm5vdCBTV0lHIHByb3RvIGhlYWRlcnMiCisjZW5kaWYKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHNpemVfdCBkb3VibGV3b3Jkcz4KK2NsYXNzIEhhc0JpdHMgeworIHB1YmxpYzoKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBjb25zdGV4cHIgSGFzQml0cygpIDogaGFzX2JpdHNfe30ge30KKworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHZvaWQgQ2xlYXIoKSB7CisgICAgbWVtc2V0KGhhc19iaXRzXywgMCwgc2l6ZW9mKGhhc19iaXRzXykpOworICB9CisKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSB1aW50MzJfdCYgb3BlcmF0b3JbXShpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gaGFzX2JpdHNfW2luZGV4XTsKKyAgfQorCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgY29uc3QgdWludDMyX3QmIG9wZXJhdG9yW10oaW50IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIGhhc19iaXRzX1tpbmRleF07CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgSGFzQml0czxkb3VibGV3b3Jkcz4mIHJocykgY29uc3QgeworICAgIHJldHVybiBtZW1jbXAoaGFzX2JpdHNfLCByaHMuaGFzX2JpdHNfLCBzaXplb2YoaGFzX2JpdHNfKSkgPT0gMDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBIYXNCaXRzPGRvdWJsZXdvcmRzPiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsKKyAgfQorCisgIHZvaWQgT3IoY29uc3QgSGFzQml0czxkb3VibGV3b3Jkcz4mIHJocykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZG91Ymxld29yZHM7IGkrKykgaGFzX2JpdHNfW2ldIHw9IHJoc1tpXTsKKyAgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdDsKKworIHByaXZhdGU6CisgIHVpbnQzMl90IGhhc19iaXRzX1tkb3VibGV3b3Jkc107Cit9OworCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgSGFzQml0czwxPjo6ZW1wdHkoKSBjb25zdCB7CisgIHJldHVybiAhaGFzX2JpdHNfWzBdOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgSGFzQml0czwyPjo6ZW1wdHkoKSBjb25zdCB7CisgIHJldHVybiAhKGhhc19iaXRzX1swXSB8IGhhc19iaXRzX1sxXSk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBIYXNCaXRzPDM+OjplbXB0eSgpIGNvbnN0IHsKKyAgcmV0dXJuICEoaGFzX2JpdHNfWzBdIHwgaGFzX2JpdHNfWzFdIHwgaGFzX2JpdHNfWzJdKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIEhhc0JpdHM8ND46OmVtcHR5KCkgY29uc3QgeworICByZXR1cm4gIShoYXNfYml0c19bMF0gfCBoYXNfYml0c19bMV0gfCBoYXNfYml0c19bMl0gfCBoYXNfYml0c19bM10pOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IGRvdWJsZXdvcmRzPgoraW5saW5lIGJvb2wgSGFzQml0czxkb3VibGV3b3Jkcz46OmVtcHR5KCkgY29uc3QgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRvdWJsZXdvcmRzOyArK2kpIHsKKyAgICBpZiAoaGFzX2JpdHNfW2ldKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0hBU19CSVRTX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pbXBsaWNpdF93ZWFrX21lc3NhZ2UuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2ltcGxpY2l0X3dlYWtfbWVzc2FnZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2VkNmI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pbXBsaWNpdF93ZWFrX21lc3NhZ2UuY2MKQEAgLTAsMCArMSw3MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW1wbGljaXRfd2Vha19tZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcGFyc2VfY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCitQUk9UT0JVRl9QUkFHTUFfSU5JVF9TRUcKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworY29uc3QgY2hhciogSW1wbGljaXRXZWFrTWVzc2FnZTo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VDb250ZXh0KiBjdHgpIHsKKyAgcmV0dXJuIGN0eC0+QXBwZW5kU3RyaW5nKHB0ciwgZGF0YV8pOworfQorCitzdHJ1Y3QgSW1wbGljaXRXZWFrTWVzc2FnZURlZmF1bHRUeXBlIHsKKyAgY29uc3RleHByIEltcGxpY2l0V2Vha01lc3NhZ2VEZWZhdWx0VHlwZSgpCisgICAgICA6IGluc3RhbmNlKENvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgfkltcGxpY2l0V2Vha01lc3NhZ2VEZWZhdWx0VHlwZSgpIHt9CisgIHVuaW9uIHsKKyAgICBJbXBsaWNpdFdlYWtNZXNzYWdlIGluc3RhbmNlOworICB9OworfTsKKworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIEltcGxpY2l0V2Vha01lc3NhZ2VEZWZhdWx0VHlwZQorICAgIGltcGxpY2l0X3dlYWtfbWVzc2FnZV9kZWZhdWx0X2luc3RhbmNlOworCitjb25zdCBJbXBsaWNpdFdlYWtNZXNzYWdlKiBJbXBsaWNpdFdlYWtNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCkgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxJbXBsaWNpdFdlYWtNZXNzYWdlKj4oCisgICAgICAmaW1wbGljaXRfd2Vha19tZXNzYWdlX2RlZmF1bHRfaW5zdGFuY2UpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pbXBsaWNpdF93ZWFrX21lc3NhZ2UuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW1wbGljaXRfd2Vha19tZXNzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5NGFiNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW1wbGljaXRfd2Vha19tZXNzYWdlLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JTVBMSUNJVF9XRUFLX01FU1NBR0VfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JTVBMSUNJVF9XRUFLX01FU1NBR0VfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorCisjaWZkZWYgU1dJRworI2Vycm9yICJZb3UgY2Fubm90IFNXSUcgcHJvdG8gaGVhZGVycyIKKyNlbmRpZgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworLy8gVGhpcyBmaWxlIGlzIGxvZ2ljYWxseSBpbnRlcm5hbC1vbmx5IGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHByb3RvYnVmCisvLyBnZW5lcmF0ZWQgY29kZS4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgTWVzc2FnZUxpdGUgdGhhdCB0cmVhdHMgYWxsIGRhdGEgYXMgdW5rbm93bi4gVGhpcyB0eXBlCisvLyBhY3RzIGFzIGEgcGxhY2Vob2xkZXIgZm9yIGFuIGltcGxpY2l0IHdlYWsgZmllbGQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHRydWUKKy8vIG1lc3NhZ2UgdHlwZSBkb2VzIG5vdCBnZXQgbGlua2VkIGludG8gdGhlIGJpbmFyeS4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBJbXBsaWNpdFdlYWtNZXNzYWdlIDogcHVibGljIE1lc3NhZ2VMaXRlIHsKKyBwdWJsaWM6CisgIEltcGxpY2l0V2Vha01lc3NhZ2UoKSA6IGRhdGFfKG5ldyBzdGQ6OnN0cmluZykge30KKyAgZXhwbGljaXQgY29uc3RleHByIEltcGxpY2l0V2Vha01lc3NhZ2UoQ29uc3RhbnRJbml0aWFsaXplZCkKKyAgICAgIDogZGF0YV8obnVsbHB0cikge30KKyAgZXhwbGljaXQgSW1wbGljaXRXZWFrTWVzc2FnZShBcmVuYSogYXJlbmEpCisgICAgICA6IE1lc3NhZ2VMaXRlKGFyZW5hKSwgZGF0YV8obmV3IHN0ZDo6c3RyaW5nKSB7fQorCisgIH5JbXBsaWNpdFdlYWtNZXNzYWdlKCkgb3ZlcnJpZGUgeworICAgIC8vIGRhdGFfIHdpbGwgYmUgbnVsbCBpbiB0aGUgZGVmYXVsdCBpbnN0YW5jZSwgYnV0IHdlIGNhbiBzYWZlbHkgY2FsbCBkZWxldGUKKyAgICAvLyBoZXJlIGJlY2F1c2UgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugd2lsbCBuZXZlciBiZSBkZXN0cm95ZWQuCisgICAgZGVsZXRlIGRhdGFfOworICB9CisKKyAgc3RhdGljIGNvbnN0IEltcGxpY2l0V2Vha01lc3NhZ2UqIGRlZmF1bHRfaW5zdGFuY2UoKTsKKworICBzdGQ6OnN0cmluZyBHZXRUeXBlTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICIiOyB9CisKKyAgTWVzc2FnZUxpdGUqIE5ldyhBcmVuYSogYXJlbmEpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8SW1wbGljaXRXZWFrTWVzc2FnZT4oYXJlbmEpOworICB9CisKKyAgdm9pZCBDbGVhcigpIG92ZXJyaWRlIHsgZGF0YV8tPmNsZWFyKCk7IH0KKworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisKKyAgdm9pZCBDaGVja1R5cGVBbmRNZXJnZUZyb20oY29uc3QgTWVzc2FnZUxpdGUmIG90aGVyKSBvdmVycmlkZSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcqIG90aGVyX2RhdGEgPQorICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBJbXBsaWNpdFdlYWtNZXNzYWdlJj4ob3RoZXIpLmRhdGFfOworICAgIGlmIChvdGhlcl9kYXRhICE9IG51bGxwdHIpIHsKKyAgICAgIGRhdGFfLT5hcHBlbmQoKm90aGVyX2RhdGEpOworICAgIH0KKyAgfQorCisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGRhdGFfID09IG51bGxwdHIgPyAwIDogZGF0YV8tPnNpemUoKTsKKyAgfQorCisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSh1aW50OF90KiB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbCB7CisgICAgaWYgKGRhdGFfID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgfQorICAgIHJldHVybiBzdHJlYW0tPldyaXRlUmF3KGRhdGFfLT5kYXRhKCksIHN0YXRpY19jYXN0PGludD4oZGF0YV8tPnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKKyAgfQorCisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBkYXRhXyA9PSBudWxscHRyID8gMCA6IHN0YXRpY19jYXN0PGludD4oZGF0YV8tPnNpemUoKSk7CisgIH0KKworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworCisgcHJpdmF0ZToKKyAgLy8gVGhpcyBzdGQ6OnN0cmluZyBpcyBhbGxvY2F0ZWQgb24gdGhlIGhlYXAsIGJ1dCB3ZSB1c2UgYSByYXcgcG9pbnRlciBzbyB0aGF0CisgIC8vIHRoZSBkZWZhdWx0IGluc3RhbmNlIGNhbiBiZSBjb25zdGFudC1pbml0aWFsaXplZC4gSW4gdGhlIGNvbnN0IG1ldGhvZHMsIHdlCisgIC8vIGhhdmUgdG8gaGFuZGxlIHRoZSBwb3NzaWJpbGl0eSBvZiBkYXRhXyBiZWluZyBudWxsLgorICBzdGQ6OnN0cmluZyogZGF0YV87CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbXBsaWNpdFdlYWtNZXNzYWdlKTsKK307CisKK3N0cnVjdCBJbXBsaWNpdFdlYWtNZXNzYWdlRGVmYXVsdFR5cGU7CitleHRlcm4gSW1wbGljaXRXZWFrTWVzc2FnZURlZmF1bHRUeXBlIGltcGxpY2l0X3dlYWtfbWVzc2FnZV9kZWZhdWx0X2luc3RhbmNlOworCisvLyBBIHR5cGUgaGFuZGxlciBmb3IgdXNlIHdpdGggaW1wbGljaXQgd2VhayByZXBlYXRlZCBtZXNzYWdlIGZpZWxkcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsaWNpdFdlYWtUeXBlPgorY2xhc3MgSW1wbGljaXRXZWFrVHlwZUhhbmRsZXIgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBNZXNzYWdlTGl0ZSBUeXBlOworICBzdGF0aWMgY29uc3RleHByIGJvb2wgTW92ZWFibGUgPSBmYWxzZTsKKworICBzdGF0aWMgaW5saW5lIE1lc3NhZ2VMaXRlKiBOZXdGcm9tUHJvdG90eXBlKGNvbnN0IE1lc3NhZ2VMaXRlKiBwcm90b3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJlbmEqIGFyZW5hID0gbnVsbHB0cikgeworICAgIHJldHVybiBwcm90b3R5cGUtPk5ldyhhcmVuYSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgRGVsZXRlKE1lc3NhZ2VMaXRlKiB2YWx1ZSwgQXJlbmEqIGFyZW5hKSB7CisgICAgaWYgKGFyZW5hID09IG51bGxwdHIpIHsKKyAgICAgIGRlbGV0ZSB2YWx1ZTsKKyAgICB9CisgIH0KKyAgc3RhdGljIGlubGluZSBBcmVuYSogR2V0QXJlbmEoTWVzc2FnZUxpdGUqIHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlLT5HZXRBcmVuYSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBDbGVhcihNZXNzYWdlTGl0ZSogdmFsdWUpIHsgdmFsdWUtPkNsZWFyKCk7IH0KKyAgc3RhdGljIHZvaWQgTWVyZ2UoY29uc3QgTWVzc2FnZUxpdGUmIGZyb20sIE1lc3NhZ2VMaXRlKiB0bykgeworICAgIHRvLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oZnJvbSk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBXZWFrUmVwZWF0ZWRQdHJGaWVsZCB7CisgIHVzaW5nIFR5cGVIYW5kbGVyID0gaW50ZXJuYWw6OkltcGxpY2l0V2Vha1R5cGVIYW5kbGVyPFQ+OworICBjb25zdGV4cHIgV2Vha1JlcGVhdGVkUHRyRmllbGQoKSA6IHdlYWsoKSB7fQorICBleHBsaWNpdCBXZWFrUmVwZWF0ZWRQdHJGaWVsZChBcmVuYSogYXJlbmEpIDogd2VhayhhcmVuYSkge30KKyAgfldlYWtSZXBlYXRlZFB0ckZpZWxkKCkgeyB3ZWFrLnRlbXBsYXRlIERlc3Ryb3k8VHlwZUhhbmRsZXI+KCk7IH0KKworICB0eXBlZGVmIGludGVybmFsOjpSZXBlYXRlZFB0ckl0ZXJhdG9yPE1lc3NhZ2VMaXRlPiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJJdGVyYXRvcjxjb25zdCBNZXNzYWdlTGl0ZT4gY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcjxNZXNzYWdlTGl0ZSosIHZvaWQqPgorICAgICAgcG9pbnRlcl9pdGVyYXRvcjsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yPGNvbnN0IE1lc3NhZ2VMaXRlKiBjb25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGNvbnN0PgorICAgICAgY29uc3RfcG9pbnRlcl9pdGVyYXRvcjsKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKGJhc2UoKS5yYXdfZGF0YSgpKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKGJhc2UoKS5yYXdfZGF0YSgpKTsgfQorICBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCB7IHJldHVybiBiZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGJlZ2luKCkgKyBiYXNlKCkuc2l6ZSgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGJlZ2luKCkgKyBiYXNlKCkuc2l6ZSgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSBjb25zdCB7IHJldHVybiBlbmQoKTsgfQorICBwb2ludGVyX2l0ZXJhdG9yIHBvaW50ZXJfYmVnaW4oKSB7CisgICAgcmV0dXJuIHBvaW50ZXJfaXRlcmF0b3IoYmFzZSgpLnJhd19tdXRhYmxlX2RhdGEoKSk7CisgIH0KKyAgY29uc3RfcG9pbnRlcl9pdGVyYXRvciBwb2ludGVyX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9wb2ludGVyX2l0ZXJhdG9yKGJhc2UoKS5yYXdfbXV0YWJsZV9kYXRhKCkpOworICB9CisgIHBvaW50ZXJfaXRlcmF0b3IgcG9pbnRlcl9lbmQoKSB7CisgICAgcmV0dXJuIHBvaW50ZXJfaXRlcmF0b3IoYmFzZSgpLnJhd19tdXRhYmxlX2RhdGEoKSArIGJhc2UoKS5zaXplKCkpOworICB9CisgIGNvbnN0X3BvaW50ZXJfaXRlcmF0b3IgcG9pbnRlcl9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3BvaW50ZXJfaXRlcmF0b3IoYmFzZSgpLnJhd19tdXRhYmxlX2RhdGEoKSArIGJhc2UoKS5zaXplKCkpOworICB9CisKKyAgTWVzc2FnZUxpdGUqIEFkZFdlYWsoY29uc3QgTWVzc2FnZUxpdGUqIHByb3RvdHlwZSkgeworICAgIHJldHVybiBiYXNlKCkuQWRkV2Vhayhwcm90b3R5cGUpOworICB9CisgIFQqIEFkZCgpIHsgcmV0dXJuIHdlYWsuQWRkKCk7IH0KKyAgdm9pZCBDbGVhcigpIHsgYmFzZSgpLnRlbXBsYXRlIENsZWFyPFR5cGVIYW5kbGVyPigpOyB9CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFdlYWtSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcikgeworICAgIGJhc2UoKS50ZW1wbGF0ZSBNZXJnZUZyb208VHlwZUhhbmRsZXI+KG90aGVyLmJhc2UoKSk7CisgIH0KKyAgdm9pZCBJbnRlcm5hbFN3YXAoV2Vha1JlcGVhdGVkUHRyRmllbGQqIG90aGVyKSB7CisgICAgYmFzZSgpLkludGVybmFsU3dhcCgmb3RoZXItPmJhc2UoKSk7CisgIH0KKworICBjb25zdCBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZEJhc2UmIGJhc2UoKSBjb25zdCB7IHJldHVybiB3ZWFrOyB9CisgIGludGVybmFsOjpSZXBlYXRlZFB0ckZpZWxkQmFzZSYgYmFzZSgpIHsgcmV0dXJuIHdlYWs7IH0KKyAgLy8gVW5pb24gZGlzYWJsZXMgcnVubmluZyB0aGUgZGVzdHJ1Y3Rvci4gV2hpY2ggd291bGQgY3JlYXRlIGEgc3Ryb25nIGxpbmsuCisgIC8vIEluc3RlYWQgd2UgZXhwbGljaXRseSBkZXN0cm95IHRoZSB1bmRlcmx5aW5nIGJhc2UgdGhyb3VnaCB0aGUgdmlydHVhbAorICAvLyBkZXN0cnVjdG9yLgorICB1bmlvbiB7CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxUPiB3ZWFrOworICB9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lNUExJQ0lUX1dFQUtfTUVTU0FHRV9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvaW5saW5lZF9zdHJpbmdfZmllbGQuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lubGluZWRfc3RyaW5nX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjM2U0NzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lubGluZWRfc3RyaW5nX2ZpZWxkLmNjCkBAIC0wLDAgKzEsMTE4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pbmxpbmVkX3N0cmluZ19maWVsZC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BhcnNlX2NvbnRleHQuaD4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisvLyBjbGFuZy1mb3JtYXQgb24KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworCitzdGQ6OnN0cmluZyogSW5saW5lZFN0cmluZ0ZpZWxkOjpNdXRhYmxlKGNvbnN0IExhenlTdHJpbmcmIC8qZGVmYXVsdF92YWx1ZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmVuYSogYXJlbmEsIGJvb2wgZG9uYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRvbmF0aW5nX3N0YXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFzaywgTWVzc2FnZUxpdGUqIG1zZykgeworICBpZiAoYXJlbmEgPT0gbnVsbHB0ciB8fCAhZG9uYXRlZCkgeworICAgIHJldHVybiBVbnNhZmVNdXRhYmxlUG9pbnRlcigpOworICB9CisgIHJldHVybiBNdXRhYmxlU2xvdyhhcmVuYSwgZG9uYXRlZCwgZG9uYXRpbmdfc3RhdGVzLCBtYXNrLCBtc2cpOworfQorCitzdGQ6OnN0cmluZyogSW5saW5lZFN0cmluZ0ZpZWxkOjpNdXRhYmxlKEFyZW5hKiBhcmVuYSwgYm9vbCBkb25hdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZG9uYXRpbmdfc3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrLCBNZXNzYWdlTGl0ZSogbXNnKSB7CisgIGlmIChhcmVuYSA9PSBudWxscHRyIHx8ICFkb25hdGVkKSB7CisgICAgcmV0dXJuIFVuc2FmZU11dGFibGVQb2ludGVyKCk7CisgIH0KKyAgcmV0dXJuIE11dGFibGVTbG93KGFyZW5hLCBkb25hdGVkLCBkb25hdGluZ19zdGF0ZXMsIG1hc2ssIG1zZyk7Cit9CisKK3N0ZDo6c3RyaW5nKiBJbmxpbmVkU3RyaW5nRmllbGQ6Ok11dGFibGVTbG93KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb25hdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRvbmF0aW5nX3N0YXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hc2ssIE1lc3NhZ2VMaXRlKiBtc2cpIHsKKyAgKHZvaWQpbWFzazsKKyAgKHZvaWQpbXNnOworICByZXR1cm4gVW5zYWZlTXV0YWJsZVBvaW50ZXIoKTsKK30KKwordm9pZCBJbmxpbmVkU3RyaW5nRmllbGQ6OlNldEFsbG9jYXRlZChjb25zdCBzdGQ6OnN0cmluZyogZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHZhbHVlLCBBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9uYXRlZCwgdWludDMyX3QqIGRvbmF0aW5nX3N0YXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFzaywgTWVzc2FnZUxpdGUqIG1zZykgeworICAodm9pZCltYXNrOworICAodm9pZCltc2c7CisgIFNldEFsbG9jYXRlZE5vQXJlbmEoZGVmYXVsdF92YWx1ZSwgdmFsdWUpOworfQorCit2b2lkIElubGluZWRTdHJpbmdGaWVsZDo6U2V0KHN0ZDo6c3RyaW5nJiYgdmFsdWUsIEFyZW5hKiBhcmVuYSwgYm9vbCBkb25hdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZG9uYXRpbmdfc3RhdGVzLCB1aW50MzJfdCBtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbXNnKSB7CisgICh2b2lkKWRvbmF0aW5nX3N0YXRlczsKKyAgKHZvaWQpbWFzazsKKyAgKHZvaWQpbXNnOworICBTZXROb0FyZW5hKHN0ZDo6bW92ZSh2YWx1ZSkpOworfQorCitzdGQ6OnN0cmluZyogSW5saW5lZFN0cmluZ0ZpZWxkOjpSZWxlYXNlKCkgeworICBhdXRvKiByZWxlYXNlZCA9IG5ldyBzdGQ6OnN0cmluZyhzdGQ6Om1vdmUoKmdldF9tdXRhYmxlKCkpKTsKKyAgZ2V0X211dGFibGUoKS0+Y2xlYXIoKTsKKyAgcmV0dXJuIHJlbGVhc2VkOworfQorCitzdGQ6OnN0cmluZyogSW5saW5lZFN0cmluZ0ZpZWxkOjpSZWxlYXNlKEFyZW5hKiBhcmVuYSwgYm9vbCBkb25hdGVkKSB7CisgIC8vIFdlIGNhbiBub3Qgc3RlYWwgZG9uYXRlZCBhcmVuYSBzdHJpbmdzLgorICBzdGQ6OnN0cmluZyogcmVsZWFzZWQgPSAoYXJlbmEgIT0gbnVsbHB0ciAmJiBkb25hdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgc3RkOjpzdHJpbmcoKmdldF9tdXRhYmxlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBzdGQ6OnN0cmluZyhzdGQ6Om1vdmUoKmdldF9tdXRhYmxlKCkpKTsKKyAgZ2V0X211dGFibGUoKS0+Y2xlYXIoKTsKKyAgcmV0dXJuIHJlbGVhc2VkOworfQorCit2b2lkIElubGluZWRTdHJpbmdGaWVsZDo6Q2xlYXJUb0RlZmF1bHQoY29uc3QgTGF6eVN0cmluZyYgZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmVuYSogYXJlbmEsIGJvb2wgZG9uYXRlZCkgeworICAodm9pZClhcmVuYTsKKyAgZ2V0X211dGFibGUoKS0+YXNzaWduKGRlZmF1bHRfdmFsdWUuZ2V0KCkpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lubGluZWRfc3RyaW5nX2ZpZWxkLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lubGluZWRfc3RyaW5nX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllMzdkNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW5saW5lZF9zdHJpbmdfZmllbGQuaApAQCAtMCwwICsxLDUzMiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lOTElORURfU1RSSU5HX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU5MSU5FRF9TVFJJTkdfRklFTERfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCisjaWZkZWYgU1dJRworI2Vycm9yICJZb3UgY2Fubm90IFNXSUcgcHJvdG8gaGVhZGVycyIKKyNlbmRpZgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIEFyZW5hOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBJbmxpbmVkU3RyaW5nRmllbGQgd3JhcHMgYSBzdGQ6OnN0cmluZyBpbnN0YW5jZSBhbmQgZXhwb3NlcyBhbiBBUEkgc2ltaWxhciB0bworLy8gQXJlbmFTdHJpbmdQdHIncyB3cmFwcGluZyBvZiBhIHN0ZDo6c3RyaW5nKiBpbnN0YW5jZS4KKy8vCisvLyBkZWZhdWx0X3ZhbHVlIHBhcmFtZXRlcnMgYXJlIHRha2VuIGZvciBjb25zaXN0ZW5jeSB3aXRoIEFyZW5hU3RyaW5nUHRyLCBidXQKKy8vIGFyZSBub3QgdXNlZCBmb3IgbW9zdCBtZXRob2RzLiBXaXRoIGlubGluaW5nLCB0aGVzZSBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tCisvLyB0aGUgZ2VuZXJhdGVkIGJpbmFyeS4KKy8vCisvLyBJbmxpbmVkU3RyaW5nRmllbGQgaGFzIGEgZG9uYXRpbmcgbWVjaGFuaXNtIHRoYXQgYWxsb3dzIHN0cmluZyBidWZmZXIKKy8vIGFsbG9jYXRlZCBvbiBhcmVuYS4gQSBzdHJpbmcgaXMgZG9uYXRlZCBtZWFucyBib3RoIHRoZSBzdHJpbmcgY29udGFpbmVyIGFuZAorLy8gdGhlIGRhdGEgYnVmZmVyIGFyZSBvbiBhcmVuYS4gVGhlIGRvbmF0aW5nIG1lY2hhbmlzbSBoZXJlIGlzIHNpbWlsYXIgdG8gdGhlCisvLyBvbmUgaW4gQXJlbmFTdHJpbmdQdHIgd2l0aCBzb21lIGRpZmZlcmVuY2VzOgorLy8KKy8vIFdoZW4gYW4gSW5saW5lZFN0cmluZ0ZpZWxkIGlzIGNvbnN0cnVjdGVkLCB0aGUgZG9uYXRpbmcgc3RhdGUgaXMgdHJ1ZS4gVGhpcworLy8gaXMgYmVjYXVzZSB0aGUgc3RyaW5nIGNvbnRhaW5lciBpcyBkaXJlY3RseSBzdG9yZWQgaW4gdGhlIG1lc3NhZ2Ugb24gdGhlCisvLyBhcmVuYToKKy8vCisvLyAgIENvbnN0cnVjdGlvbjogZG9uYXRlZD10cnVlCisvLyAgIEFyZW5hOgorLy8gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyAgIHxNZXNzYWdlIGZvbzogICAgICAgICAgIHwKKy8vICAgfCArLS0tLS0tLS0tLS0tLS0tLS0tLSsgfAorLy8gICB8IHxJbmxpbmVkU3RyaW5nRmllbGQ6fCB8CisvLyAgIHwgfCArLS0tLS0rICAgICAgICAgICB8IHwKKy8vICAgfCB8IHwgfCB8IHwgICAgICAgICAgIHwgfAorLy8gICB8IHwgKy0tLS0tKyAgICAgICAgICAgfCB8CisvLyAgIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0rIHwKKy8vICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8KKy8vIFdoZW4gbHZhbHVlIFNldCBpcyBjYWxsZWQsIHRoZSBkb25hdGluZyBzdGF0ZSBpcyBzdGlsbCB0cnVlLiBTdHJpbmcgZGF0YSB3aWxsCisvLyBiZSBhbGxvY2F0ZWQgb24gdGhlIGFyZW5hOgorLy8KKy8vICAgTHZhbHVlIFNldDogZG9uYXRlZD10cnVlCisvLyAgIEFyZW5hOgorLy8gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyAgIHxNZXNzYWdlIGZvbzogICAgICAgICAgIHwKKy8vICAgfCArLS0tLS0tLS0tLS0tLS0tLS0tLSsgfAorLy8gICB8IHxJbmxpbmVkU3RyaW5nRmllbGQ6fCB8CisvLyAgIHwgfCArLS0tLS0rICAgICAgICAgICB8IHwKKy8vICAgfCB8IHwgfCB8IHwgICAgICAgICAgIHwgfAorLy8gICB8IHwgK3wtLS0tKyAgICAgICAgICAgfCB8CisvLyAgIHwgKy0tfC0tLS0tLS0tLS0tLS0tLS0rIHwKKy8vICAgfCAgICBWICAgICAgICAgICAgICAgICAgfAorLy8gICB8ICArLS0tLS0tLS0tLS0tLS0tLSsgICB8CisvLyAgIHwgIHwnZicsJ28nLCdvJywuLi4gfCAgIHwKKy8vICAgfCAgKy0tLS0tLS0tLS0tLS0tLS0rICAgfAorLy8gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLworLy8gU29tZSBvcGVyYXRpb25zIHdpbGwgdW5kb25hdGUgYSBkb25hdGVkIHN0cmluZywgaW5jbHVkaW5nOiBNdXRhYmxlLAorLy8gU2V0QWxsb2NhdGVkLCBSdmFsdWUgU2V0LCBhbmQgU3dhcCB3aXRoIGEgbm9uLWRvbmF0ZWQgc3RyaW5nLgorLy8KKy8vIEZvciBtb3JlIGRldGFpbHMgb2YgdGhlIGRvbmF0aW5nIHN0YXRlcyB0cmFuc2l0aW9ucywgZ28vcGQtaW5saW5lZC1zdHJpbmcuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgSW5saW5lZFN0cmluZ0ZpZWxkIHsKKyBwdWJsaWM6CisgIElubGluZWRTdHJpbmdGaWVsZCgpIHsgSW5pdCgpOyB9CisgIGlubGluZSB2b2lkIEluaXQoKSB7IG5ldyAoZ2V0X211dGFibGUoKSkgc3RkOjpzdHJpbmcoKTsgfQorICAvLyBBZGQgdGhlIGR1bW15IHBhcmFtZXRlciBqdXN0IHRvIG1ha2UgSW5saW5lZFN0cmluZ0ZpZWxkKG51bGxwdHIpCisgIC8vIHVuYW1iaWd1b3VzLgorICBjb25zdGV4cHIgSW5saW5lZFN0cmluZ0ZpZWxkKAorICAgICAgY29uc3QgRXhwbGljaXRseUNvbnN0cnVjdGVkPHN0ZDo6c3RyaW5nPiogLypkZWZhdWx0X3ZhbHVlKi8sCisgICAgICBib29sIC8qZHVtbXkqLykKKyAgICAgIDogdmFsdWVfe30ge30KKyAgZXhwbGljaXQgSW5saW5lZFN0cmluZ0ZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0X3ZhbHVlKTsKKyAgZXhwbGljaXQgSW5saW5lZFN0cmluZ0ZpZWxkKEFyZW5hKiBhcmVuYSk7CisgIH5JbmxpbmVkU3RyaW5nRmllbGQoKSB7IERlc3RydWN0KCk7IH0KKworICAvLyBMdmFsdWUgU2V0LiBUbyBzYXZlIHNwYWNlLCB3ZSBwYWNrIHRoZSBkb25hdGluZyBzdGF0ZXMgb2YgbXVsdGlwbGUKKyAgLy8gSW5saW5lZFN0cmluZ0ZpZWxkcyBpbnRvIGFuIHVpbnQzMl90IGBkb25hdGluZ19zdGF0ZXNgLiBUaGUgYG1hc2tgCisgIC8vIGluZGljYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGJpdCBmb3IgdGhpcyBJbmxpbmVkU3RyaW5nRmllbGQuIGBkb25hdGVkYCBpcworICAvLyB3aGV0aGVyIHRoaXMgZmllbGQgaXMgZG9uYXRlZC4KKyAgLy8KKyAgLy8gVGhlIGNhbGxlciBzaG91bGQgZ3VhcmFudGVlIHRoYXQ6CisgIC8vCisgIC8vICAgYGRvbmF0ZWQgPT0gKChkb25hdGluZ19zdGF0ZXMgJiB+bWFzaykgIT0gMClgCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIG5ldmVyIGNoYW5nZXMgdGhlIGBkb25hdGluZ19zdGF0ZXNgLgorICB2b2lkIFNldChDb25zdFN0cmluZ1BhcmFtIHZhbHVlLCBBcmVuYSogYXJlbmEsIGJvb2wgZG9uYXRlZCwKKyAgICAgICAgICAgdWludDMyX3QqIGRvbmF0aW5nX3N0YXRlcywgdWludDMyX3QgbWFzaywgTWVzc2FnZUxpdGUqIG1zZyk7CisKKyAgLy8gUnZhbHVlIFNldC4gSWYgdGhpcyBmaWVsZCBpcyBkb25hdGVkLCB0aGlzIG1ldGhvZCB3aWxsIHVuZG9uYXRlIHRoaXMgZmllbGQKKyAgLy8gYnkgbXV0YXRpbmcgdGhlIGBkb25hdGluZ19zdGF0ZXNgIGFjY29yZGluZyB0byBgbWFza2AuCisgIHZvaWQgU2V0KHN0ZDo6c3RyaW5nJiYgdmFsdWUsIEFyZW5hKiBhcmVuYSwgYm9vbCBkb25hdGVkLAorICAgICAgICAgICB1aW50MzJfdCogZG9uYXRpbmdfc3RhdGVzLCB1aW50MzJfdCBtYXNrLCBNZXNzYWdlTGl0ZSogbXNnKTsKKworICB2b2lkIFNldChjb25zdCBjaGFyKiBzdHIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hLCBib29sIGRvbmF0ZWQsCisgICAgICAgICAgIHVpbnQzMl90KiBkb25hdGluZ19zdGF0ZXMsIHVpbnQzMl90IG1hc2ssIE1lc3NhZ2VMaXRlKiBtc2cpOworCisgIHZvaWQgU2V0KGNvbnN0IGNoYXIqIHN0ciwgc2l6ZV90IHNpemUsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hLCBib29sIGRvbmF0ZWQsCisgICAgICAgICAgIHVpbnQzMl90KiBkb25hdGluZ19zdGF0ZXMsIHVpbnQzMl90IG1hc2ssIE1lc3NhZ2VMaXRlKiBtc2cpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZWZXcmFwcGVkVHlwZT4KKyAgdm9pZCBTZXQoc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxSZWZXcmFwcGVkVHlwZT4gY29uc3Rfc3RyaW5nX3JlZiwKKyAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsIGJvb2wgZG9uYXRlZCwgdWludDMyX3QqIGRvbmF0aW5nX3N0YXRlcywKKyAgICAgICAgICAgdWludDMyX3QgbWFzaywgTWVzc2FnZUxpdGUqIG1zZyk7CisKKyAgdm9pZCBTZXRCeXRlcyhDb25zdFN0cmluZ1BhcmFtIHZhbHVlLCBBcmVuYSogYXJlbmEsIGJvb2wgZG9uYXRlZCwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCogZG9uYXRpbmdfc3RhdGVzLCB1aW50MzJfdCBtYXNrLCBNZXNzYWdlTGl0ZSogbXNnKTsKKworICB2b2lkIFNldEJ5dGVzKHN0ZDo6c3RyaW5nJiYgdmFsdWUsIEFyZW5hKiBhcmVuYSwgYm9vbCBkb25hdGVkLAorICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkb25hdGluZ19zdGF0ZXMsIHVpbnQzMl90IG1hc2ssIE1lc3NhZ2VMaXRlKiBtc2cpOworCisgIHZvaWQgU2V0Qnl0ZXMoY29uc3QgY2hhciogc3RyLCA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSwgYm9vbCBkb25hdGVkLAorICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkb25hdGluZ19zdGF0ZXMsIHVpbnQzMl90IG1hc2ssIE1lc3NhZ2VMaXRlKiBtc2cpOworCisgIHZvaWQgU2V0Qnl0ZXMoY29uc3Qgdm9pZCogcCwgc2l6ZV90IHNpemUsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgIGJvb2wgZG9uYXRlZCwgdWludDMyX3QqIGRvbmF0aW5nX3N0YXRlcywgdWludDMyX3QgbWFzaywKKyAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbXNnKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVmV3JhcHBlZFR5cGU+CisgIHZvaWQgU2V0Qnl0ZXMoc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxSZWZXcmFwcGVkVHlwZT4gY29uc3Rfc3RyaW5nX3JlZiwKKyAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSwgYm9vbCBkb25hdGVkLCB1aW50MzJfdCogZG9uYXRpbmdfc3RhdGVzLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hc2ssIE1lc3NhZ2VMaXRlKiBtc2cpOworCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgdm9pZCBTZXROb0FyZW5hKFN0cmluZ1BpZWNlIHZhbHVlKTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSB2b2lkIFNldE5vQXJlbmEoc3RkOjpzdHJpbmcmJiB2YWx1ZSk7CisKKyAgLy8gQmFzaWMgYWNjZXNzb3JzLgorICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXQoKSBjb25zdCB7IHJldHVybiBHZXROb0FyZW5hKCk7IH0KKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBjb25zdCBzdGQ6OnN0cmluZyYgR2V0Tm9BcmVuYSgpIGNvbnN0OworCisgIC8vIE11dGFibGUgcmV0dXJucyBhIHN0ZDo6c3RyaW5nKiBpbnN0YW5jZSB0aGF0IGlzIGhlYXAtYWxsb2NhdGVkLiBJZiB0aGlzCisgIC8vIGZpZWxkIGlzIGRvbmF0ZWQsIHRoaXMgbWV0aG9kIHVuZG9uYXRlcyB0aGlzIGZpZWxkIGJ5IG11dGF0aW5nIHRoZQorICAvLyBgZG9uYXRpbmdfc3RhdGVzYCBhY2NvcmRpbmcgdG8gYG1hc2tgLCBhbmQgY29waWVzIHRoZSBjb250ZW50IG9mIHRoZQorICAvLyBvcmlnaW5hbCBzdHJpbmcgdG8gdGhlIHJldHVybmluZyBzdHJpbmcuCisgIHN0ZDo6c3RyaW5nKiBNdXRhYmxlKEFyZW5hKiBhcmVuYSwgYm9vbCBkb25hdGVkLCB1aW50MzJfdCogZG9uYXRpbmdfc3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrLCBNZXNzYWdlTGl0ZSogbXNnKTsKKyAgc3RkOjpzdHJpbmcqIE11dGFibGUoY29uc3QgTGF6eVN0cmluZyYgZGVmYXVsdF92YWx1ZSwgQXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvbmF0ZWQsIHVpbnQzMl90KiBkb25hdGluZ19zdGF0ZXMsIHVpbnQzMl90IG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtc2cpOworCisgIC8vIE11dGFibGUobnVsbHB0cl90KSBpcyBhbiBvdmVybG9hZCB0byBleHBsaWNpdGx5IHN1cHBvcnQgTXV0YWJsZShudWxscHRyKQorICAvLyBjYWxscyB1c2VkIGJ5IHRoZSBpbnRlcm5hbCBwYXJzZXIgbG9naWMuIFRoaXMgcHJvdmlkZXMgQVBJIGVxdWl2YWxlbmNlIHdpdGgKKyAgLy8gQXJlbmFTdHJpbmdQdHIsIHdoaWxlIHN0aWxsIHByb3RlY3RpbmcgYWdhaW5zdCBjYWxscyB3aXRoIGFyZW5hIHBvaW50ZXJzLgorICBzdGQ6OnN0cmluZyogTXV0YWJsZShzdGQ6Om51bGxwdHJfdCk7CisgIHN0ZDo6c3RyaW5nKiBNdXRhYmxlTm9Db3B5KHN0ZDo6bnVsbHB0cl90KTsKKworICAvLyBUYWtlcyBhIHN0ZDo6c3RyaW5nIHRoYXQgaXMgaGVhcC1hbGxvY2F0ZWQsIGFuZCB0YWtlcyBvd25lcnNoaXAuIFRoZQorICAvLyBzdGQ6OnN0cmluZydzIGRlc3RydWN0b3IgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBhcmVuYS4gVXNlZCB0byBpbXBsZW1lbnQKKyAgLy8gc2V0X2FsbG9jYXRlZF88ZmllbGQ+IGluIGdlbmVyYXRlZCBjbGFzc2VzLgorICAvLworICAvLyBJZiB0aGlzIGZpZWxkIGlzIGRvbmF0ZWQsIHRoaXMgbWV0aG9kIHVuZG9uYXRlcyB0aGlzIGZpZWxkIGJ5IG11dGF0aW5nIHRoZQorICAvLyBgZG9uYXRpbmdfc3RhdGVzYCBhY2NvcmRpbmcgdG8gYG1hc2tgLgorICB2b2lkIFNldEFsbG9jYXRlZChjb25zdCBzdGQ6OnN0cmluZyogZGVmYXVsdF92YWx1ZSwgc3RkOjpzdHJpbmcqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICBBcmVuYSogYXJlbmEsIGJvb2wgZG9uYXRlZCwgdWludDMyX3QqIGRvbmF0aW5nX3N0YXRlcywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFzaywgTWVzc2FnZUxpdGUqIG1zZyk7CisKKyAgdm9pZCBTZXRBbGxvY2F0ZWROb0FyZW5hKGNvbnN0IHN0ZDo6c3RyaW5nKiBkZWZhdWx0X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHZhbHVlKTsKKworICAvLyBSZWxlYXNlIHJldHVybnMgYSBzdGQ6OnN0cmluZyogaW5zdGFuY2UgdGhhdCBpcyBoZWFwLWFsbG9jYXRlZCBhbmQgaXMgbm90CisgIC8vIE93bigpJ2QgYnkgYW55IGFyZW5hLiBJZiB0aGUgZmllbGQgaXMgbm90IHNldCwgdGhpcyByZXR1cm5zIG51bGxwdHIuIFRoZQorICAvLyBjYWxsZXIgcmV0YWlucyBvd25lcnNoaXAuIENsZWFycyB0aGlzIGZpZWxkIGJhY2sgdG8gbnVsbHB0ciBzdGF0ZS4gVXNlZCB0bworICAvLyBpbXBsZW1lbnQgcmVsZWFzZV88ZmllbGQ+KCkgbWV0aG9kcyBvbiBnZW5lcmF0ZWQgY2xhc3Nlcy4KKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiBSZWxlYXNlKEFyZW5hKiBhcmVuYSwgYm9vbCBkb25hdGVkKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiBSZWxlYXNlKCk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gQmVsb3cgZnVuY3Rpb25zIHdpbGwgYmUgcmVtb3ZlZCBpbiBzdWJzZXF1ZW50IGNvZGUgY2hhbmdlCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgREVQUkVDQVRFRF9NRVRIT0RTX1RPX0JFX0RFTEVURUQKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiBSZWxlYXNlKGNvbnN0IHN0ZDo6c3RyaW5nKiwgQXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb25hdGVkKSB7CisgICAgcmV0dXJuIFJlbGVhc2UoYXJlbmEsIGRvbmF0ZWQpOworICB9CisKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiBSZWxlYXNlTm9uRGVmYXVsdChjb25zdCBzdGQ6OnN0cmluZyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJlbmEqIGFyZW5hKSB7CisgICAgcmV0dXJuIFJlbGVhc2UoKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nKiBSZWxlYXNlTm9uRGVmYXVsdE5vQXJlbmEoY29uc3Qgc3RkOjpzdHJpbmcqIGRlZmF1bHRfdmFsdWUpIHsKKyAgICByZXR1cm4gUmVsZWFzZSgpOworICB9CisKKyAgdm9pZCBTZXQoY29uc3Qgc3RkOjpzdHJpbmcqLCBDb25zdFN0cmluZ1BhcmFtIHZhbHVlLCBBcmVuYSogYXJlbmEsCisgICAgICAgICAgIGJvb2wgZG9uYXRlZCwgdWludDMyX3QqIGRvbmF0aW5nX3N0YXRlcywgdWludDMyX3QgbWFzaywKKyAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1zZykgeworICAgIFNldCh2YWx1ZSwgYXJlbmEsIGRvbmF0ZWQsIGRvbmF0aW5nX3N0YXRlcywgbWFzaywgbXNnKTsKKyAgfQorCisgIHZvaWQgU2V0KGNvbnN0IHN0ZDo6c3RyaW5nKiwgc3RkOjpzdHJpbmcmJiB2YWx1ZSwgQXJlbmEqIGFyZW5hLCBib29sIGRvbmF0ZWQsCisgICAgICAgICAgIHVpbnQzMl90KiBkb25hdGluZ19zdGF0ZXMsIHVpbnQzMl90IG1hc2ssIE1lc3NhZ2VMaXRlKiBtc2cpIHsKKyAgICBTZXQoc3RkOjptb3ZlKHZhbHVlKSwgYXJlbmEsIGRvbmF0ZWQsIGRvbmF0aW5nX3N0YXRlcywgbWFzaywgbXNnKTsKKyAgfQorCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0UGFyYW0+CisgIHZvaWQgU2V0KEZpcnN0UGFyYW0sIGNvbnN0IGNoYXIqIHN0ciwgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsIGJvb2wgZG9uYXRlZCwKKyAgICAgICAgICAgdWludDMyX3QqIGRvbmF0aW5nX3N0YXRlcywgdWludDMyX3QgbWFzaywgTWVzc2FnZUxpdGUqIG1zZykgeworICAgIFNldChzdHIsIGFyZW5hLCBkb25hdGVkLCBkb25hdGluZ19zdGF0ZXMsIG1hc2ssIG1zZyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3RQYXJhbT4KKyAgdm9pZCBTZXQoRmlyc3RQYXJhbSBwMSwgY29uc3QgY2hhciogc3RyLCBzaXplX3Qgc2l6ZSwgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgIGJvb2wgZG9uYXRlZCwgdWludDMyX3QqIGRvbmF0aW5nX3N0YXRlcywgdWludDMyX3QgbWFzaywKKyAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1zZykgeworICAgIFNldChzdHIsIHNpemUsIGFyZW5hLCBkb25hdGVkLCBkb25hdGluZ19zdGF0ZXMsIG1hc2ssIG1zZyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3RQYXJhbSwgdHlwZW5hbWUgUmVmV3JhcHBlZFR5cGU+CisgIHZvaWQgU2V0KEZpcnN0UGFyYW0gcDEsCisgICAgICAgICAgIHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8UmVmV3JhcHBlZFR5cGU+IGNvbnN0X3N0cmluZ19yZWYsCisgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hLCBib29sIGRvbmF0ZWQsIHVpbnQzMl90KiBkb25hdGluZ19zdGF0ZXMsCisgICAgICAgICAgIHVpbnQzMl90IG1hc2ssIE1lc3NhZ2VMaXRlKiBtc2cpIHsKKyAgICBTZXQoY29uc3Rfc3RyaW5nX3JlZiwgYXJlbmEsIGRvbmF0ZWQsIGRvbmF0aW5nX3N0YXRlcywgbWFzaywgbXNnKTsKKyAgfQorCisgIHZvaWQgU2V0Qnl0ZXMoY29uc3Qgc3RkOjpzdHJpbmcqLCBDb25zdFN0cmluZ1BhcmFtIHZhbHVlLCBBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgYm9vbCBkb25hdGVkLCB1aW50MzJfdCogZG9uYXRpbmdfc3RhdGVzLCB1aW50MzJfdCBtYXNrLAorICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtc2cpIHsKKyAgICBTZXQodmFsdWUsIGFyZW5hLCBkb25hdGVkLCBkb25hdGluZ19zdGF0ZXMsIG1hc2ssIG1zZyk7CisgIH0KKworCisgIHZvaWQgU2V0Qnl0ZXMoY29uc3Qgc3RkOjpzdHJpbmcqLCBzdGQ6OnN0cmluZyYmIHZhbHVlLCBBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgYm9vbCBkb25hdGVkLCB1aW50MzJfdCogZG9uYXRpbmdfc3RhdGVzLCB1aW50MzJfdCBtYXNrLAorICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtc2cpIHsKKyAgICBTZXQoc3RkOjptb3ZlKHZhbHVlKSwgYXJlbmEsIGRvbmF0ZWQsIGRvbmF0aW5nX3N0YXRlcywgbWFzaywgbXNnKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGaXJzdFBhcmFtPgorICB2b2lkIFNldEJ5dGVzKEZpcnN0UGFyYW0gcDEsIGNvbnN0IGNoYXIqIHN0ciwgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgYm9vbCBkb25hdGVkLCB1aW50MzJfdCogZG9uYXRpbmdfc3RhdGVzLCB1aW50MzJfdCBtYXNrLAorICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtc2cpIHsKKyAgICBTZXRCeXRlcyhzdHIsIGFyZW5hLCBkb25hdGVkLCBkb25hdGluZ19zdGF0ZXMsIG1hc2ssIG1zZyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3RQYXJhbT4KKyAgdm9pZCBTZXRCeXRlcyhGaXJzdFBhcmFtIHAxLCBjb25zdCB2b2lkKiBwLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSwgYm9vbCBkb25hdGVkLCB1aW50MzJfdCogZG9uYXRpbmdfc3RhdGVzLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hc2ssIE1lc3NhZ2VMaXRlKiBtc2cpIHsKKyAgICBTZXRCeXRlcyhwLCBzaXplLCBhcmVuYSwgZG9uYXRlZCwgZG9uYXRpbmdfc3RhdGVzLCBtYXNrLCBtc2cpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0UGFyYW0sIHR5cGVuYW1lIFJlZldyYXBwZWRUeXBlPgorICB2b2lkIFNldEJ5dGVzKEZpcnN0UGFyYW0gcDEsCisgICAgICAgICAgICAgICAgc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxSZWZXcmFwcGVkVHlwZT4gY29uc3Rfc3RyaW5nX3JlZiwKKyAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSwgYm9vbCBkb25hdGVkLCB1aW50MzJfdCogZG9uYXRpbmdfc3RhdGVzLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hc2ssIE1lc3NhZ2VMaXRlKiBtc2cpIHsKKyAgICBTZXRCeXRlcyhjb25zdF9zdHJpbmdfcmVmLmdldCgpLCBhcmVuYSwgZG9uYXRlZCwgZG9uYXRpbmdfc3RhdGVzLCBtYXNrLAorICAgICAgICAgICAgIG1zZyk7CisgIH0KKworICB2b2lkIFNldE5vQXJlbmEoY29uc3Qgc3RkOjpzdHJpbmcqLCBTdHJpbmdQaWVjZSB2YWx1ZSkgeworICAgIFNldE5vQXJlbmEodmFsdWUpOworICB9CisgIHZvaWQgU2V0Tm9BcmVuYShjb25zdCBzdGQ6OnN0cmluZyosIHN0ZDo6c3RyaW5nJiYgdmFsdWUpIHsKKyAgICBTZXROb0FyZW5hKHN0ZDo6bW92ZSh2YWx1ZSkpOworICB9CisKKyAgc3RkOjpzdHJpbmcqIE11dGFibGUoQXJlbmFTdHJpbmdQdHI6OkVtcHR5RGVmYXVsdCwgQXJlbmEqIGFyZW5hLCBib29sIGRvbmF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkb25hdGluZ19zdGF0ZXMsIHVpbnQzMl90IG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtc2cpIHsKKyAgICByZXR1cm4gTXV0YWJsZShhcmVuYSwgZG9uYXRlZCwgZG9uYXRpbmdfc3RhdGVzLCBtYXNrLCBtc2cpOworICB9CisKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGQ6OnN0cmluZyogTXV0YWJsZU5vQXJlbmFOb0RlZmF1bHQoCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyogLypkZWZhdWx0X3ZhbHVlKi8pIHsKKyAgICByZXR1cm4gTXV0YWJsZU5vQ29weShudWxscHRyKTsKKyAgfQorCisjZW5kaWYgIC8vIERFUFJFQ0FURURfTUVUSE9EU19UT19CRV9ERUxFVEVECisKKyAgLy8gQXJlbmEtc2FmZXR5IHNlbWFudGljczogdGhpcyBpcyBndWFyZGVkIGJ5IHRoZSBsb2dpYyBpbgorICAvLyBTd2FwKCkvVW5zYWZlQXJlbmFTd2FwKCkgYXQgdGhlIG1lc3NhZ2UgbGV2ZWwsIHNvIHRoaXMgbWV0aG9kIGlzCisgIC8vICd1bnNhZmUnIGlmIGNhbGxlZCBkaXJlY3RseS4KKyAgaW5saW5lIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHZvaWQgSW50ZXJuYWxTd2FwKAorICAgICAgSW5saW5lZFN0cmluZ0ZpZWxkKiBsaHMsIEFyZW5hKiBsaHNfYXJlbmEsIGJvb2wgbGhzX2FyZW5hX2R0b3JfcmVnaXN0ZXJlZCwKKyAgICAgIE1lc3NhZ2VMaXRlKiBsaHNfbXNnLCAgLy8KKyAgICAgIElubGluZWRTdHJpbmdGaWVsZCogcmhzLCBBcmVuYSogcmhzX2FyZW5hLCBib29sIHJoc19hcmVuYV9kdG9yX3JlZ2lzdGVyZWQsCisgICAgICBNZXNzYWdlTGl0ZSogcmhzX21zZyk7CisKKyAgLy8gRnJlZXMgc3RvcmFnZSAoaWYgbm90IG9uIGFuIGFyZW5hKS4KKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSB2b2lkIERlc3Ryb3koY29uc3Qgc3RkOjpzdHJpbmcqIGRlZmF1bHRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZW5hKiBhcmVuYSkgeworICAgIGlmIChhcmVuYSA9PSBudWxscHRyKSB7CisgICAgICBEZXN0cm95Tm9BcmVuYShkZWZhdWx0X3ZhbHVlKTsKKyAgICB9CisgIH0KKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSB2b2lkIERlc3Ryb3lOb0FyZW5hKGNvbnN0IHN0ZDo6c3RyaW5nKiBkZWZhdWx0X3ZhbHVlKTsKKworICAvLyBDbGVhcnMgY29udGVudCwgYnV0IGtlZXBzIGFsbG9jYXRlZCBzdGQ6OnN0cmluZywgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mCisgIC8vIGhlYXAgb3BlcmF0aW9ucy4gQWZ0ZXIgdGhpcyByZXR1cm5zLCB0aGUgY29udGVudCAoYXMgc2VlbiBieSB0aGUgdXNlcikgd2lsbAorICAvLyBhbHdheXMgYmUgdGhlIGVtcHR5IHN0ZDo6c3RyaW5nLgorICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHZvaWQgQ2xlYXJUb0VtcHR5KCkgeyBDbGVhck5vbkRlZmF1bHRUb0VtcHR5KCk7IH0KKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSB2b2lkIENsZWFyTm9uRGVmYXVsdFRvRW1wdHkoKSB7CisgICAgZ2V0X211dGFibGUoKS0+Y2xlYXIoKTsKKyAgfQorCisgIC8vIENsZWFycyBjb250ZW50LCBidXQga2VlcHMgYWxsb2NhdGVkIHN0ZDo6c3RyaW5nIGlmIGFyZW5hICE9IG51bGxwdHIsIHRvCisgIC8vIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBoZWFwIG9wZXJhdGlvbnMuIEFmdGVyIHRoaXMgcmV0dXJucywgdGhlIGNvbnRlbnQgKGFzCisgIC8vIHNlZW4gYnkgdGhlIHVzZXIpIHdpbGwgYWx3YXlzIGJlIGVxdWFsIHRvIHxkZWZhdWx0X3ZhbHVlfC4KKyAgdm9pZCBDbGVhclRvRGVmYXVsdChjb25zdCBMYXp5U3RyaW5nJiBkZWZhdWx0X3ZhbHVlLCBBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb25hdGVkKTsKKworICAvLyBHZW5lcmF0ZWQgY29kZSAvIHJlZmxlY3Rpb24gb25seSEgUmV0dXJucyBhIG11dGFibGUgcG9pbnRlciB0byB0aGUgc3RyaW5nLgorICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0ZDo6c3RyaW5nKiBVbnNhZmVNdXRhYmxlUG9pbnRlcigpOworCisgIC8vIElubGluZWRTdHJpbmdGaWVsZCBkb2Vzbid0IGhhdmUgdGhpbmdzIGxpa2UgdGhlIGBkZWZhdWx0X3ZhbHVlYCBwb2ludGVyIGluCisgIC8vIEFyZW5hU3RyaW5nUHRyLgorICBzdGF0aWMgY29uc3RleHByIGJvb2wgSXNEZWZhdWx0KCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIElzRGVmYXVsdChjb25zdCBzdGQ6OnN0cmluZyopIHsgcmV0dXJuIGZhbHNlOyB9CisKKyBwcml2YXRlOgorICB2b2lkIERlc3RydWN0KCkgeyBnZXRfbXV0YWJsZSgpLT5+YmFzaWNfc3RyaW5nKCk7IH0KKworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0ZDo6c3RyaW5nKiBnZXRfbXV0YWJsZSgpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIGNvbnN0IHN0ZDo6c3RyaW5nKiBnZXRfY29uc3QoKSBjb25zdDsKKworICBhbGlnbmFzKHN0ZDo6c3RyaW5nKSBjaGFyIHZhbHVlX1tzaXplb2Yoc3RkOjpzdHJpbmcpXTsKKworICBzdGQ6OnN0cmluZyogTXV0YWJsZVNsb3coOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsIGJvb2wgZG9uYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkb25hdGluZ19zdGF0ZXMsIHVpbnQzMl90IG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbXNnKTsKKworCisgIC8vIFdoZW4gY29uc3RydWN0ZWQgaW4gYW4gQXJlbmEsIHdlIHdhbnQgb3VyIGRlc3RydWN0b3IgdG8gYmUgc2tpcHBlZC4KKyAgZnJpZW5kIGNsYXNzIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKK307CisKK2lubGluZSBzdGQ6OnN0cmluZyogSW5saW5lZFN0cmluZ0ZpZWxkOjpnZXRfbXV0YWJsZSgpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjpzdHJpbmcqPigmdmFsdWVfKTsKK30KKworaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nKiBJbmxpbmVkU3RyaW5nRmllbGQ6OmdldF9jb25zdCgpIGNvbnN0IHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RkOjpzdHJpbmcqPigmdmFsdWVfKTsKK30KKworaW5saW5lIElubGluZWRTdHJpbmdGaWVsZDo6SW5saW5lZFN0cmluZ0ZpZWxkKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0X3ZhbHVlKSB7CisgIG5ldyAoZ2V0X211dGFibGUoKSkgc3RkOjpzdHJpbmcoZGVmYXVsdF92YWx1ZSk7Cit9CisKKworaW5saW5lIElubGluZWRTdHJpbmdGaWVsZDo6SW5saW5lZFN0cmluZ0ZpZWxkKEFyZW5hKiAvKmFyZW5hKi8pIHsgSW5pdCgpOyB9CisKK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgSW5saW5lZFN0cmluZ0ZpZWxkOjpHZXROb0FyZW5hKCkgY29uc3QgeworICByZXR1cm4gKmdldF9jb25zdCgpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVkU3RyaW5nRmllbGQ6OlNldEFsbG9jYXRlZE5vQXJlbmEoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcqIC8qZGVmYXVsdF92YWx1ZSovLCBzdGQ6OnN0cmluZyogdmFsdWUpIHsKKyAgaWYgKHZhbHVlID09IG51bGxwdHIpIHsKKyAgICAvLyBDdXJyZW50bHksIGlubGluZWQgc3RyaW5nIGZpZWxkIGNhbid0IGhhdmUgbm9uIGVtcHR5IGRlZmF1bHQuCisgICAgZ2V0X211dGFibGUoKS0+Y2xlYXIoKTsKKyAgfSBlbHNlIHsKKyAgICBnZXRfbXV0YWJsZSgpLT5hc3NpZ24oc3RkOjptb3ZlKCp2YWx1ZSkpOworICAgIGRlbGV0ZSB2YWx1ZTsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBJbmxpbmVkU3RyaW5nRmllbGQ6OkRlc3Ryb3lOb0FyZW5hKGNvbnN0IHN0ZDo6c3RyaW5nKikgeworICAvLyBUaGlzIGlzIGludm9rZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UncyBBcmVuYUR0b3IsIHdoaWNoIGlzIHVzZWQgdG8KKyAgLy8gY2xlYW4gdXAgb2JqZWN0cyBub3QgYWxsb2NhdGVkIG9uIHRoZSBBcmVuYS4KKyAgdGhpcy0+fklubGluZWRTdHJpbmdGaWVsZCgpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVkU3RyaW5nRmllbGQ6OlNldE5vQXJlbmEoU3RyaW5nUGllY2UgdmFsdWUpIHsKKyAgZ2V0X211dGFibGUoKS0+YXNzaWduKHZhbHVlLmRhdGEoKSwgdmFsdWUubGVuZ3RoKCkpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVkU3RyaW5nRmllbGQ6OlNldE5vQXJlbmEoc3RkOjpzdHJpbmcmJiB2YWx1ZSkgeworICBnZXRfbXV0YWJsZSgpLT5hc3NpZ24oc3RkOjptb3ZlKHZhbHVlKSk7Cit9CisKKy8vIENhbGxlciBzaG91bGQgbWFrZSBzdXJlIHJoc19hcmVuYSBhbGxvY2F0ZWQgcmhzLCBhbmQgbGhzX2FyZW5hIGFsbG9jYXRlZCBsaHMuCitpbmxpbmUgUFJPVE9CVUZfTkRFQlVHX0lOTElORSB2b2lkIElubGluZWRTdHJpbmdGaWVsZDo6SW50ZXJuYWxTd2FwKAorICAgIElubGluZWRTdHJpbmdGaWVsZCogbGhzLCBBcmVuYSogbGhzX2FyZW5hLCBib29sIGxoc19hcmVuYV9kdG9yX3JlZ2lzdGVyZWQsCisgICAgTWVzc2FnZUxpdGUqIGxoc19tc2csICAvLworICAgIElubGluZWRTdHJpbmdGaWVsZCogcmhzLCBBcmVuYSogcmhzX2FyZW5hLCBib29sIHJoc19hcmVuYV9kdG9yX3JlZ2lzdGVyZWQsCisgICAgTWVzc2FnZUxpdGUqIHJoc19tc2cpIHsKKyNpZiBHT09HTEVfUFJPVE9CVUZfSU5URVJOQUxfRE9OQVRFX1NURUFMX0lOTElORQorICBsaHMtPmdldF9tdXRhYmxlKCktPnN3YXAoKnJocy0+Z2V0X211dGFibGUoKSk7CisgIGlmICghbGhzX2FyZW5hX2R0b3JfcmVnaXN0ZXJlZCAmJiByaHNfYXJlbmFfZHRvcl9yZWdpc3RlcmVkKSB7CisgICAgbGhzX21zZy0+T25EZW1hbmRSZWdpc3RlckFyZW5hRHRvcihsaHNfYXJlbmEpOworICB9IGVsc2UgaWYgKGxoc19hcmVuYV9kdG9yX3JlZ2lzdGVyZWQgJiYgIXJoc19hcmVuYV9kdG9yX3JlZ2lzdGVyZWQpIHsKKyAgICByaHNfbXNnLT5PbkRlbWFuZFJlZ2lzdGVyQXJlbmFEdG9yKHJoc19hcmVuYSk7CisgIH0KKyNlbHNlCisgICh2b2lkKWxoc19hcmVuYTsKKyAgKHZvaWQpcmhzX2FyZW5hOworICAodm9pZClsaHNfYXJlbmFfZHRvcl9yZWdpc3RlcmVkOworICAodm9pZClyaHNfYXJlbmFfZHRvcl9yZWdpc3RlcmVkOworICAodm9pZClsaHNfbXNnOworICAodm9pZClyaHNfbXNnOworICBsaHMtPmdldF9tdXRhYmxlKCktPnN3YXAoKnJocy0+Z2V0X211dGFibGUoKSk7CisjZW5kaWYKK30KKworaW5saW5lIHZvaWQgSW5saW5lZFN0cmluZ0ZpZWxkOjpTZXQoQ29uc3RTdHJpbmdQYXJhbSB2YWx1ZSwgQXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb25hdGVkLCB1aW50MzJfdCogLypkb25hdGluZ19zdGF0ZXMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IC8qbWFzayovLCBNZXNzYWdlTGl0ZSogLyptc2cqLykgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpZG9uYXRlZDsKKyAgU2V0Tm9BcmVuYSh2YWx1ZSk7Cit9CisKK2lubGluZSB2b2lkIElubGluZWRTdHJpbmdGaWVsZDo6U2V0KGNvbnN0IGNoYXIqIHN0ciwgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvbmF0ZWQsIHVpbnQzMl90KiBkb25hdGluZ19zdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrLCBNZXNzYWdlTGl0ZSogbXNnKSB7CisgIFNldChDb25zdFN0cmluZ1BhcmFtKHN0ciksIGFyZW5hLCBkb25hdGVkLCBkb25hdGluZ19zdGF0ZXMsIG1hc2ssIG1zZyk7Cit9CisKK2lubGluZSB2b2lkIElubGluZWRTdHJpbmdGaWVsZDo6U2V0KGNvbnN0IGNoYXIqIHN0ciwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSwgYm9vbCBkb25hdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRvbmF0aW5nX3N0YXRlcywgdWludDMyX3QgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtc2cpIHsKKyAgU2V0KENvbnN0U3RyaW5nUGFyYW17c3RyLCBzaXplfSwgYXJlbmEsIGRvbmF0ZWQsIGRvbmF0aW5nX3N0YXRlcywgbWFzaywgbXNnKTsKK30KKworaW5saW5lIHZvaWQgSW5saW5lZFN0cmluZ0ZpZWxkOjpTZXRCeXRlcyhDb25zdFN0cmluZ1BhcmFtIHZhbHVlLCBBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9uYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRvbmF0aW5nX3N0YXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFzaywgTWVzc2FnZUxpdGUqIG1zZykgeworICBTZXQodmFsdWUsIGFyZW5hLCBkb25hdGVkLCBkb25hdGluZ19zdGF0ZXMsIG1hc2ssIG1zZyk7Cit9CisKK2lubGluZSB2b2lkIElubGluZWRTdHJpbmdGaWVsZDo6U2V0Qnl0ZXMoc3RkOjpzdHJpbmcmJiB2YWx1ZSwgQXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvbmF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkb25hdGluZ19zdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hc2ssIE1lc3NhZ2VMaXRlKiBtc2cpIHsKKyAgU2V0KHN0ZDo6bW92ZSh2YWx1ZSksIGFyZW5hLCBkb25hdGVkLCBkb25hdGluZ19zdGF0ZXMsIG1hc2ssIG1zZyk7Cit9CisKK2lubGluZSB2b2lkIElubGluZWRTdHJpbmdGaWVsZDo6U2V0Qnl0ZXMoY29uc3QgY2hhciogc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSwgYm9vbCBkb25hdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZG9uYXRpbmdfc3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrLCBNZXNzYWdlTGl0ZSogbXNnKSB7CisgIFNldChzdHIsIGFyZW5hLCBkb25hdGVkLCBkb25hdGluZ19zdGF0ZXMsIG1hc2ssIG1zZyk7Cit9CisKK2lubGluZSB2b2lkIElubGluZWRTdHJpbmdGaWVsZDo6U2V0Qnl0ZXMoY29uc3Qgdm9pZCogcCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hLCBib29sIGRvbmF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkb25hdGluZ19zdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hc2ssIE1lc3NhZ2VMaXRlKiBtc2cpIHsKKyAgU2V0KHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihwKSwgc2l6ZSwgYXJlbmEsIGRvbmF0ZWQsIGRvbmF0aW5nX3N0YXRlcywgbWFzaywKKyAgICAgIG1zZyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZWZXcmFwcGVkVHlwZT4KK2lubGluZSB2b2lkIElubGluZWRTdHJpbmdGaWVsZDo6U2V0KAorICAgIHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8UmVmV3JhcHBlZFR5cGU+IGNvbnN0X3N0cmluZ19yZWYsCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsIGJvb2wgZG9uYXRlZCwgdWludDMyX3QqIGRvbmF0aW5nX3N0YXRlcywKKyAgICB1aW50MzJfdCBtYXNrLCBNZXNzYWdlTGl0ZSogbXNnKSB7CisgIFNldChjb25zdF9zdHJpbmdfcmVmLmdldCgpLCBhcmVuYSwgZG9uYXRlZCwgZG9uYXRpbmdfc3RhdGVzLCBtYXNrLCBtc2cpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVmV3JhcHBlZFR5cGU+CitpbmxpbmUgdm9pZCBJbmxpbmVkU3RyaW5nRmllbGQ6OlNldEJ5dGVzKAorICAgIHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8UmVmV3JhcHBlZFR5cGU+IGNvbnN0X3N0cmluZ19yZWYsCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsIGJvb2wgZG9uYXRlZCwgdWludDMyX3QqIGRvbmF0aW5nX3N0YXRlcywKKyAgICB1aW50MzJfdCBtYXNrLCBNZXNzYWdlTGl0ZSogbXNnKSB7CisgIFNldChjb25zdF9zdHJpbmdfcmVmLmdldCgpLCBhcmVuYSwgZG9uYXRlZCwgZG9uYXRpbmdfc3RhdGVzLCBtYXNrLCBtc2cpOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcqIElubGluZWRTdHJpbmdGaWVsZDo6VW5zYWZlTXV0YWJsZVBvaW50ZXIoKSB7CisgIHJldHVybiBnZXRfbXV0YWJsZSgpOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcqIElubGluZWRTdHJpbmdGaWVsZDo6TXV0YWJsZShzdGQ6Om51bGxwdHJfdCkgeworICByZXR1cm4gZ2V0X211dGFibGUoKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nKiBJbmxpbmVkU3RyaW5nRmllbGQ6Ok11dGFibGVOb0NvcHkoc3RkOjpudWxscHRyX3QpIHsKKyAgcmV0dXJuIGdldF9tdXRhYmxlKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lOTElORURfU1RSSU5HX0ZJRUxEX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pbmxpbmVkX3N0cmluZ19maWVsZF91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW5saW5lZF9zdHJpbmdfZmllbGRfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmZTZlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW5saW5lZF9zdHJpbmdfZmllbGRfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw1OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW5saW5lZF9zdHJpbmdfZmllbGQuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKwordXNpbmcgaW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOwordXNpbmcgaW50ZXJuYWw6OklubGluZWRTdHJpbmdGaWVsZDsKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4N2UxYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5jYwpAQCAtMCwwICsxLDk2NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaGVhdmlseSBvcHRpbWl6ZWQgdG8gbWFrZSByZWFkcyBhbmQgd3JpdGVzCisvLyBvZiBzbWFsbCB2YWx1ZXMgKGVzcGVjaWFsbHkgdmFyaW50cykgYXMgZmFzdCBhcyBwb3NzaWJsZS4gIEluCisvLyBwYXJ0aWN1bGFyLCB3ZSBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlIHRoYXQgYSByZWFkIG9yIGEgd3JpdGUKKy8vIHdpbGwgbm90IGNyb3NzIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgc2luY2Ugd2UgY2FuIGF2b2lkIGEgbG90CisvLyBvZiBicmFuY2hpbmcgaW4gdGhpcyBjYXNlLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKworCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworbmFtZXNwYWNlIHsKKworc3RhdGljIGNvbnN0IGludCBrTWF4VmFyaW50Qnl0ZXMgPSAxMDsKK3N0YXRpYyBjb25zdCBpbnQga01heFZhcmludDMyQnl0ZXMgPSA1OworCisKK2lubGluZSBib29sIE5leHROb25FbXB0eShaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgY29uc3Qgdm9pZCoqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzaXplKSB7CisgIGJvb2wgc3VjY2VzczsKKyAgZG8geworICAgIHN1Y2Nlc3MgPSBpbnB1dC0+TmV4dChkYXRhLCBzaXplKTsKKyAgfSB3aGlsZSAoc3VjY2VzcyAmJiAqc2l6ZSA9PSAwKTsKKyAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBDb2RlZElucHV0U3RyZWFtID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvZGVkSW5wdXRTdHJlYW06On5Db2RlZElucHV0U3RyZWFtKCkgeworICBpZiAoaW5wdXRfICE9IE5VTEwpIHsKKyAgICBCYWNrVXBJbnB1dFRvQ3VycmVudFBvc2l0aW9uKCk7CisgIH0KK30KKworLy8gU3RhdGljLgoraW50IENvZGVkSW5wdXRTdHJlYW06OmRlZmF1bHRfcmVjdXJzaW9uX2xpbWl0XyA9IDEwMDsKKworCit2b2lkIENvZGVkSW5wdXRTdHJlYW06OkJhY2tVcElucHV0VG9DdXJyZW50UG9zaXRpb24oKSB7CisgIGludCBiYWNrdXBfYnl0ZXMgPSBCdWZmZXJTaXplKCkgKyBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8gKyBvdmVyZmxvd19ieXRlc187CisgIGlmIChiYWNrdXBfYnl0ZXMgPiAwKSB7CisgICAgaW5wdXRfLT5CYWNrVXAoYmFja3VwX2J5dGVzKTsKKworICAgIC8vIHRvdGFsX2J5dGVzX3JlYWRfIGRvZXNuJ3QgaW5jbHVkZSBvdmVyZmxvd19ieXRlc18uCisgICAgdG90YWxfYnl0ZXNfcmVhZF8gLT0gQnVmZmVyU2l6ZSgpICsgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfOworICAgIGJ1ZmZlcl9lbmRfID0gYnVmZmVyXzsKKyAgICBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8gPSAwOworICAgIG92ZXJmbG93X2J5dGVzXyA9IDA7CisgIH0KK30KKworaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6UmVjb21wdXRlQnVmZmVyTGltaXRzKCkgeworICBidWZmZXJfZW5kXyArPSBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF87CisgIGludCBjbG9zZXN0X2xpbWl0ID0gc3RkOjptaW4oY3VycmVudF9saW1pdF8sIHRvdGFsX2J5dGVzX2xpbWl0Xyk7CisgIGlmIChjbG9zZXN0X2xpbWl0IDwgdG90YWxfYnl0ZXNfcmVhZF8pIHsKKyAgICAvLyBUaGUgbGltaXQgcG9zaXRpb24gaXMgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiAgV2UgbXVzdCBhZGp1c3QKKyAgICAvLyB0aGUgYnVmZmVyIHNpemUgYWNjb3JkaW5nbHkuCisgICAgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID0gdG90YWxfYnl0ZXNfcmVhZF8gLSBjbG9zZXN0X2xpbWl0OworICAgIGJ1ZmZlcl9lbmRfIC09IGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XzsKKyAgfSBlbHNlIHsKKyAgICBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8gPSAwOworICB9Cit9CisKK0NvZGVkSW5wdXRTdHJlYW06OkxpbWl0IENvZGVkSW5wdXRTdHJlYW06OlB1c2hMaW1pdChpbnQgYnl0ZV9saW1pdCkgeworICAvLyBDdXJyZW50IHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4KKyAgaW50IGN1cnJlbnRfcG9zaXRpb24gPSBDdXJyZW50UG9zaXRpb24oKTsKKworICBMaW1pdCBvbGRfbGltaXQgPSBjdXJyZW50X2xpbWl0XzsKKworICAvLyBzZWN1cml0eTogYnl0ZV9saW1pdCBpcyBwb3NzaWJseSBldmlsLCBzbyBjaGVjayBmb3IgbmVnYXRpdmUgdmFsdWVzCisgIC8vIGFuZCBvdmVyZmxvdy4gQWxzbyBjaGVjayB0aGF0IHRoZSBuZXcgcmVxdWVzdGVkIGxpbWl0IGlzIGJlZm9yZSB0aGUKKyAgLy8gcHJldmlvdXMgbGltaXQ7IG90aGVyd2lzZSB3ZSBjb250aW51ZSB0byBlbmZvcmNlIHRoZSBwcmV2aW91cyBsaW1pdC4KKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShieXRlX2xpbWl0ID49IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX2xpbWl0IDw9IElOVF9NQVggLSBjdXJyZW50X3Bvc2l0aW9uICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9saW1pdCA8IGN1cnJlbnRfbGltaXRfIC0gY3VycmVudF9wb3NpdGlvbikpIHsKKyAgICBjdXJyZW50X2xpbWl0XyA9IGN1cnJlbnRfcG9zaXRpb24gKyBieXRlX2xpbWl0OworICAgIFJlY29tcHV0ZUJ1ZmZlckxpbWl0cygpOworICB9CisKKyAgcmV0dXJuIG9sZF9saW1pdDsKK30KKwordm9pZCBDb2RlZElucHV0U3RyZWFtOjpQb3BMaW1pdChMaW1pdCBsaW1pdCkgeworICAvLyBUaGUgbGltaXQgcGFzc2VkIGluIGlzIGFjdHVhbGx5IHRoZSAqb2xkKiBsaW1pdCwgd2hpY2ggd2UgcmV0dXJuZWQgZnJvbQorICAvLyBQdXNoTGltaXQoKS4KKyAgY3VycmVudF9saW1pdF8gPSBsaW1pdDsKKyAgUmVjb21wdXRlQnVmZmVyTGltaXRzKCk7CisKKyAgLy8gV2UgbWF5IG5vIGxvbmdlciBiZSBhdCBhIGxlZ2l0aW1hdGUgbWVzc2FnZSBlbmQuICBSZWFkVGFnKCkgbmVlZHMgdG8gYmUKKyAgLy8gY2FsbGVkIGFnYWluIHRvIGZpbmQgb3V0LgorICBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyA9IGZhbHNlOworfQorCitzdGQ6OnBhaXI8Q29kZWRJbnB1dFN0cmVhbTo6TGltaXQsIGludD4KK0NvZGVkSW5wdXRTdHJlYW06OkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoQW5kUHVzaExpbWl0KGludCBieXRlX2xpbWl0KSB7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihQdXNoTGltaXQoYnl0ZV9saW1pdCksIC0tcmVjdXJzaW9uX2J1ZGdldF8pOworfQorCitDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBDb2RlZElucHV0U3RyZWFtOjpSZWFkTGVuZ3RoQW5kUHVzaExpbWl0KCkgeworICB1aW50MzJfdCBsZW5ndGg7CisgIHJldHVybiBQdXNoTGltaXQoUmVhZFZhcmludDMyKCZsZW5ndGgpID8gbGVuZ3RoIDogMCk7Cit9CisKK2Jvb2wgQ29kZWRJbnB1dFN0cmVhbTo6RGVjcmVtZW50UmVjdXJzaW9uRGVwdGhBbmRQb3BMaW1pdChMaW1pdCBsaW1pdCkgeworICBib29sIHJlc3VsdCA9IENvbnN1bWVkRW50aXJlTWVzc2FnZSgpOworICBQb3BMaW1pdChsaW1pdCk7CisgIEdPT0dMRV9EQ0hFQ0tfTFQocmVjdXJzaW9uX2J1ZGdldF8sIHJlY3Vyc2lvbl9saW1pdF8pOworICArK3JlY3Vyc2lvbl9idWRnZXRfOworICByZXR1cm4gcmVzdWx0OworfQorCitib29sIENvZGVkSW5wdXRTdHJlYW06OkNoZWNrRW50aXJlTWVzc2FnZUNvbnN1bWVkQW5kUG9wTGltaXQoTGltaXQgbGltaXQpIHsKKyAgYm9vbCByZXN1bHQgPSBDb25zdW1lZEVudGlyZU1lc3NhZ2UoKTsKKyAgUG9wTGltaXQobGltaXQpOworICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgQ29kZWRJbnB1dFN0cmVhbTo6Qnl0ZXNVbnRpbExpbWl0KCkgY29uc3QgeworICBpZiAoY3VycmVudF9saW1pdF8gPT0gSU5UX01BWCkgcmV0dXJuIC0xOworICBpbnQgY3VycmVudF9wb3NpdGlvbiA9IEN1cnJlbnRQb3NpdGlvbigpOworCisgIHJldHVybiBjdXJyZW50X2xpbWl0XyAtIGN1cnJlbnRfcG9zaXRpb247Cit9CisKK3ZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6U2V0VG90YWxCeXRlc0xpbWl0KGludCB0b3RhbF9ieXRlc19saW1pdCkgeworICAvLyBNYWtlIHN1cmUgdGhlIGxpbWl0IGlzbid0IGFscmVhZHkgcGFzdCwgc2luY2UgdGhpcyBjb3VsZCBjb25mdXNlIG90aGVyCisgIC8vIGNvZGUuCisgIGludCBjdXJyZW50X3Bvc2l0aW9uID0gQ3VycmVudFBvc2l0aW9uKCk7CisgIHRvdGFsX2J5dGVzX2xpbWl0XyA9IHN0ZDo6bWF4KGN1cnJlbnRfcG9zaXRpb24sIHRvdGFsX2J5dGVzX2xpbWl0KTsKKyAgUmVjb21wdXRlQnVmZmVyTGltaXRzKCk7Cit9CisKK2ludCBDb2RlZElucHV0U3RyZWFtOjpCeXRlc1VudGlsVG90YWxCeXRlc0xpbWl0KCkgY29uc3QgeworICBpZiAodG90YWxfYnl0ZXNfbGltaXRfID09IElOVF9NQVgpIHJldHVybiAtMTsKKyAgcmV0dXJuIHRvdGFsX2J5dGVzX2xpbWl0XyAtIEN1cnJlbnRQb3NpdGlvbigpOworfQorCit2b2lkIENvZGVkSW5wdXRTdHJlYW06OlByaW50VG90YWxCeXRlc0xpbWl0RXJyb3IoKSB7CisgIEdPT0dMRV9MT0coRVJST1IpCisgICAgICA8PCAiQSBwcm90b2NvbCBtZXNzYWdlIHdhcyByZWplY3RlZCBiZWNhdXNlIGl0IHdhcyB0b28gIgorICAgICAgICAgImJpZyAobW9yZSB0aGFuICIKKyAgICAgIDw8IHRvdGFsX2J5dGVzX2xpbWl0XworICAgICAgPDwgIiBieXRlcykuICBUbyBpbmNyZWFzZSB0aGUgbGltaXQgKG9yIHRvIGRpc2FibGUgdGhlc2UgIgorICAgICAgICAgIndhcm5pbmdzKSwgc2VlIENvZGVkSW5wdXRTdHJlYW06OlNldFRvdGFsQnl0ZXNMaW1pdCgpICIKKyAgICAgICAgICJpbiB0aGlyZF9wYXJ0eS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaC4iOworfQorCitib29sIENvZGVkSW5wdXRTdHJlYW06OlNraXBGYWxsYmFjayhpbnQgY291bnQsIGludCBvcmlnaW5hbF9idWZmZXJfc2l6ZSkgeworICBpZiAoYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID4gMCkgeworICAgIC8vIFdlIGhpdCBhIGxpbWl0IGluc2lkZSB0aGlzIGJ1ZmZlci4gIEFkdmFuY2UgdG8gdGhlIGxpbWl0IGFuZCBmYWlsLgorICAgIEFkdmFuY2Uob3JpZ2luYWxfYnVmZmVyX3NpemUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvdW50IC09IG9yaWdpbmFsX2J1ZmZlcl9zaXplOworICBidWZmZXJfID0gTlVMTDsKKyAgYnVmZmVyX2VuZF8gPSBidWZmZXJfOworCisgIC8vIE1ha2Ugc3VyZSB0aGlzIHNraXAgZG9lc24ndCB0cnkgdG8gc2tpcCBwYXN0IHRoZSBjdXJyZW50IGxpbWl0LgorICBpbnQgY2xvc2VzdF9saW1pdCA9IHN0ZDo6bWluKGN1cnJlbnRfbGltaXRfLCB0b3RhbF9ieXRlc19saW1pdF8pOworICBpbnQgYnl0ZXNfdW50aWxfbGltaXQgPSBjbG9zZXN0X2xpbWl0IC0gdG90YWxfYnl0ZXNfcmVhZF87CisgIGlmIChieXRlc191bnRpbF9saW1pdCA8IGNvdW50KSB7CisgICAgLy8gV2UgaGl0IHRoZSBsaW1pdC4gIFNraXAgdXAgdG8gaXQgdGhlbiBmYWlsLgorICAgIGlmIChieXRlc191bnRpbF9saW1pdCA+IDApIHsKKyAgICAgIHRvdGFsX2J5dGVzX3JlYWRfID0gY2xvc2VzdF9saW1pdDsKKyAgICAgIGlucHV0Xy0+U2tpcChieXRlc191bnRpbF9saW1pdCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghaW5wdXRfLT5Ta2lwKGNvdW50KSkgeworICAgIHRvdGFsX2J5dGVzX3JlYWRfID0gaW5wdXRfLT5CeXRlQ291bnQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdG90YWxfYnl0ZXNfcmVhZF8gKz0gY291bnQ7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENvZGVkSW5wdXRTdHJlYW06OkdldERpcmVjdEJ1ZmZlclBvaW50ZXIoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICBpZiAoQnVmZmVyU2l6ZSgpID09IDAgJiYgIVJlZnJlc2goKSkgcmV0dXJuIGZhbHNlOworCisgICpkYXRhID0gYnVmZmVyXzsKKyAgKnNpemUgPSBCdWZmZXJTaXplKCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENvZGVkSW5wdXRTdHJlYW06OlJlYWRSYXcodm9pZCogYnVmZmVyLCBpbnQgc2l6ZSkgeworICBpbnQgY3VycmVudF9idWZmZXJfc2l6ZTsKKyAgd2hpbGUgKChjdXJyZW50X2J1ZmZlcl9zaXplID0gQnVmZmVyU2l6ZSgpKSA8IHNpemUpIHsKKyAgICAvLyBSZWFkaW5nIHBhc3QgZW5kIG9mIGJ1ZmZlci4gIENvcHkgd2hhdCB3ZSBoYXZlLCB0aGVuIHJlZnJlc2guCisgICAgbWVtY3B5KGJ1ZmZlciwgYnVmZmVyXywgY3VycmVudF9idWZmZXJfc2l6ZSk7CisgICAgYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSArIGN1cnJlbnRfYnVmZmVyX3NpemU7CisgICAgc2l6ZSAtPSBjdXJyZW50X2J1ZmZlcl9zaXplOworICAgIEFkdmFuY2UoY3VycmVudF9idWZmZXJfc2l6ZSk7CisgICAgaWYgKCFSZWZyZXNoKCkpIHJldHVybiBmYWxzZTsKKyAgfQorCisgIG1lbWNweShidWZmZXIsIGJ1ZmZlcl8sIHNpemUpOworICBBZHZhbmNlKHNpemUpOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIENvZGVkSW5wdXRTdHJlYW06OlJlYWRTdHJpbmcoc3RkOjpzdHJpbmcqIGJ1ZmZlciwgaW50IHNpemUpIHsKKyAgaWYgKHNpemUgPCAwKSByZXR1cm4gZmFsc2U7ICAvLyBzZWN1cml0eTogc2l6ZSBpcyBvZnRlbiB1c2VyLXN1cHBsaWVkCisKKyAgaWYgKEJ1ZmZlclNpemUoKSA+PSBzaXplKSB7CisgICAgU1RMU3RyaW5nUmVzaXplVW5pbml0aWFsaXplZChidWZmZXIsIHNpemUpOworICAgIHN0ZDo6cGFpcjxjaGFyKiwgYm9vbD4geiA9IGFzX3N0cmluZ19kYXRhKGJ1ZmZlcik7CisgICAgaWYgKHouc2Vjb25kKSB7CisgICAgICAvLyBPZGRseSBlbm91Z2gsIG1lbWNweSgpIHJlcXVpcmVzIGl0cyBmaXJzdCB0d28gYXJncyB0byBiZSBub24tTlVMTCBldmVuCisgICAgICAvLyBpZiB3ZSBjb3B5IDAgYnl0ZXMuICBTbywgd2UgaGF2ZSBlbnN1cmVkIHRoYXQgei5maXJzdCBpcyBub24tTlVMTCBoZXJlLgorICAgICAgR09PR0xFX0RDSEVDSyh6LmZpcnN0ICE9IE5VTEwpOworICAgICAgbWVtY3B5KHouZmlyc3QsIGJ1ZmZlcl8sIHNpemUpOworICAgICAgQWR2YW5jZShzaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gUmVhZFN0cmluZ0ZhbGxiYWNrKGJ1ZmZlciwgc2l6ZSk7Cit9CisKK2Jvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFN0cmluZ0ZhbGxiYWNrKHN0ZDo6c3RyaW5nKiBidWZmZXIsIGludCBzaXplKSB7CisgIGlmICghYnVmZmVyLT5lbXB0eSgpKSB7CisgICAgYnVmZmVyLT5jbGVhcigpOworICB9CisKKyAgaW50IGNsb3Nlc3RfbGltaXQgPSBzdGQ6Om1pbihjdXJyZW50X2xpbWl0XywgdG90YWxfYnl0ZXNfbGltaXRfKTsKKyAgaWYgKGNsb3Nlc3RfbGltaXQgIT0gSU5UX01BWCkgeworICAgIGludCBieXRlc190b19saW1pdCA9IGNsb3Nlc3RfbGltaXQgLSBDdXJyZW50UG9zaXRpb24oKTsKKyAgICBpZiAoYnl0ZXNfdG9fbGltaXQgPiAwICYmIHNpemUgPiAwICYmIHNpemUgPD0gYnl0ZXNfdG9fbGltaXQpIHsKKyAgICAgIGJ1ZmZlci0+cmVzZXJ2ZShzaXplKTsKKyAgICB9CisgIH0KKworICBpbnQgY3VycmVudF9idWZmZXJfc2l6ZTsKKyAgd2hpbGUgKChjdXJyZW50X2J1ZmZlcl9zaXplID0gQnVmZmVyU2l6ZSgpKSA8IHNpemUpIHsKKyAgICAvLyBTb21lIFNUTCBpbXBsZW1lbnRhdGlvbnMgImhlbHBmdWxseSIgY3Jhc2ggb24gYnVmZmVyLT5hcHBlbmQoTlVMTCwgMCkuCisgICAgaWYgKGN1cnJlbnRfYnVmZmVyX3NpemUgIT0gMCkgeworICAgICAgLy8gTm90ZTogIHN0cmluZzEuYXBwZW5kKHN0cmluZzIpIGlzIE8oc3RyaW5nMi5zaXplKCkpIChhcyBvcHBvc2VkIHRvCisgICAgICAvLyAgIE8oc3RyaW5nMS5zaXplKCkgKyBzdHJpbmcyLnNpemUoKSksIHdoaWNoIHdvdWxkIGJlIGJhZCkuCisgICAgICBidWZmZXItPmFwcGVuZChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihidWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYnVmZmVyX3NpemUpOworICAgIH0KKyAgICBzaXplIC09IGN1cnJlbnRfYnVmZmVyX3NpemU7CisgICAgQWR2YW5jZShjdXJyZW50X2J1ZmZlcl9zaXplKTsKKyAgICBpZiAoIVJlZnJlc2goKSkgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYnVmZmVyLT5hcHBlbmQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyXyksIHNpemUpOworICBBZHZhbmNlKHNpemUpOworCisgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjMyRmFsbGJhY2sodWludDMyX3QqIHZhbHVlKSB7CisgIHVpbnQ4X3QgYnl0ZXNbc2l6ZW9mKCp2YWx1ZSldOworCisgIGNvbnN0IHVpbnQ4X3QqIHB0cjsKKyAgaWYgKEJ1ZmZlclNpemUoKSA+PSBzdGF0aWNfY2FzdDxpbnQ2NF90PihzaXplb2YoKnZhbHVlKSkpIHsKKyAgICAvLyBGYXN0IHBhdGg6ICBFbm91Z2ggYnl0ZXMgaW4gdGhlIGJ1ZmZlciB0byByZWFkIGRpcmVjdGx5LgorICAgIHB0ciA9IGJ1ZmZlcl87CisgICAgQWR2YW5jZShzaXplb2YoKnZhbHVlKSk7CisgIH0gZWxzZSB7CisgICAgLy8gU2xvdyBwYXRoOiAgSGFkIHRvIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgICAgaWYgKCFSZWFkUmF3KGJ5dGVzLCBzaXplb2YoKnZhbHVlKSkpIHJldHVybiBmYWxzZTsKKyAgICBwdHIgPSBieXRlczsKKyAgfQorICBSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXkocHRyLCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW42NEZhbGxiYWNrKHVpbnQ2NF90KiB2YWx1ZSkgeworICB1aW50OF90IGJ5dGVzW3NpemVvZigqdmFsdWUpXTsKKworICBjb25zdCB1aW50OF90KiBwdHI7CisgIGlmIChCdWZmZXJTaXplKCkgPj0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oc2l6ZW9mKCp2YWx1ZSkpKSB7CisgICAgLy8gRmFzdCBwYXRoOiAgRW5vdWdoIGJ5dGVzIGluIHRoZSBidWZmZXIgdG8gcmVhZCBkaXJlY3RseS4KKyAgICBwdHIgPSBidWZmZXJfOworICAgIEFkdmFuY2Uoc2l6ZW9mKCp2YWx1ZSkpOworICB9IGVsc2UgeworICAgIC8vIFNsb3cgcGF0aDogIEhhZCB0byByZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICAgIGlmICghUmVhZFJhdyhieXRlcywgc2l6ZW9mKCp2YWx1ZSkpKSByZXR1cm4gZmFsc2U7CisgICAgcHRyID0gYnl0ZXM7CisgIH0KKyAgUmVhZExpdHRsZUVuZGlhbjY0RnJvbUFycmF5KHB0ciwgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIHsKKworLy8gRGVjb2RlcyB2YXJpbnQ2NCB3aXRoIGtub3duIHNpemUsIE4sIGFuZCByZXR1cm5zIG5leHQgcG9pbnRlci4gS25vd2luZyBOIGF0CisvLyBjb21waWxlIHRpbWUsIGNvbXBpbGVyIGNhbiBnZW5lcmF0ZSBvcHRpbWFsIGNvZGUuIEZvciBleGFtcGxlLCBpbnN0ZWFkIG9mCisvLyBzdWJ0cmFjdGluZyAweDgwIGF0IGVhY2ggaXRlcmF0aW9uLCBpdCBzdWJ0cmFjdHMgcHJvcGVybHkgc2hpZnRlZCBtYXNrIG9uY2UuCit0ZW1wbGF0ZSA8c2l6ZV90IE4+Citjb25zdCB1aW50OF90KiBEZWNvZGVWYXJpbnQ2NEtub3duU2l6ZShjb25zdCB1aW50OF90KiBidWZmZXIsIHVpbnQ2NF90KiB2YWx1ZSkgeworICBHT09HTEVfRENIRUNLX0dUKE4sIDApOworICB1aW50NjRfdCByZXN1bHQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYnVmZmVyW04gLSAxXSkgPDwgKDcgKiAoTiAtIDEpKTsKKyAgZm9yIChzaXplX3QgaSA9IDAsIG9mZnNldCA9IDA7IGkgPCBOIC0gMTsgaSsrLCBvZmZzZXQgKz0gNykgeworICAgIHJlc3VsdCArPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYnVmZmVyW2ldIC0gMHg4MCkgPDwgb2Zmc2V0OworICB9CisgICp2YWx1ZSA9IHJlc3VsdDsKKyAgcmV0dXJuIGJ1ZmZlciArIE47Cit9CisKKy8vIFJlYWQgYSB2YXJpbnQgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLCB3cml0ZSBpdCB0byAqdmFsdWUsIGFuZCByZXR1cm4gYSBwYWlyLgorLy8gVGhlIGZpcnN0IHBhcnQgb2YgdGhlIHBhaXIgaXMgdHJ1ZSBpZmYgdGhlIHJlYWQgd2FzIHN1Y2Nlc3NmdWwuICBUaGUgc2Vjb25kCisvLyBwYXJ0IGlzIGJ1ZmZlciArIChudW1iZXIgb2YgYnl0ZXMgcmVhZCkuICBUaGlzIGZ1bmN0aW9uIGlzIGFsd2F5cyBpbmxpbmVkLAorLy8gc28gcmV0dXJuaW5nIGEgcGFpciBpcyBjb3N0bGVzcy4KK1BST1RPQlVGX0FMV0FZU19JTkxJTkUKKzo6c3RkOjpwYWlyPGJvb2wsIGNvbnN0IHVpbnQ4X3QqPiBSZWFkVmFyaW50MzJGcm9tQXJyYXkodWludDMyX3QgZmlyc3RfYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB2YWx1ZSk7CitpbmxpbmUgOjpzdGQ6OnBhaXI8Ym9vbCwgY29uc3QgdWludDhfdCo+IFJlYWRWYXJpbnQzMkZyb21BcnJheSgKKyAgICB1aW50MzJfdCBmaXJzdF9ieXRlLCBjb25zdCB1aW50OF90KiBidWZmZXIsIHVpbnQzMl90KiB2YWx1ZSkgeworICAvLyBGYXN0IHBhdGg6ICBXZSBoYXZlIGVub3VnaCBieXRlcyBsZWZ0IGluIHRoZSBidWZmZXIgdG8gZ3VhcmFudGVlIHRoYXQKKyAgLy8gdGhpcyByZWFkIHdvbid0IGNyb3NzIHRoZSBlbmQsIHNvIHdlIGNhbiBza2lwIHRoZSBjaGVja3MuCisgIEdPT0dMRV9EQ0hFQ0tfRVEoKmJ1ZmZlciwgZmlyc3RfYnl0ZSk7CisgIEdPT0dMRV9EQ0hFQ0tfRVEoZmlyc3RfYnl0ZSAmIDB4ODAsIDB4ODApIDw8IGZpcnN0X2J5dGU7CisgIGNvbnN0IHVpbnQ4X3QqIHB0ciA9IGJ1ZmZlcjsKKyAgdWludDMyX3QgYjsKKyAgdWludDMyX3QgcmVzdWx0ID0gZmlyc3RfYnl0ZSAtIDB4ODA7CisgICsrcHRyOyAgLy8gV2UganVzdCBwcm9jZXNzZWQgdGhlIGZpcnN0IGJ5dGUuICBNb3ZlIG9uIHRvIHRoZSBzZWNvbmQuCisgIGIgPSAqKHB0cisrKTsKKyAgcmVzdWx0ICs9IGIgPDwgNzsKKyAgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgIHJlc3VsdCAtPSAweDgwIDw8IDc7CisgIGIgPSAqKHB0cisrKTsKKyAgcmVzdWx0ICs9IGIgPDwgMTQ7CisgIGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICByZXN1bHQgLT0gMHg4MCA8PCAxNDsKKyAgYiA9ICoocHRyKyspOworICByZXN1bHQgKz0gYiA8PCAyMTsKKyAgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgIHJlc3VsdCAtPSAweDgwIDw8IDIxOworICBiID0gKihwdHIrKyk7CisgIHJlc3VsdCArPSBiIDw8IDI4OworICBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgLy8gInJlc3VsdCAtPSAweDgwIDw8IDI4IiBpcyBpcnJlbGV2YW50LgorCisgIC8vIElmIHRoZSBpbnB1dCBpcyBsYXJnZXIgdGhhbiAzMiBiaXRzLCB3ZSBzdGlsbCBuZWVkIHRvIHJlYWQgaXQgYWxsCisgIC8vIGFuZCBkaXNjYXJkIHRoZSBoaWdoLW9yZGVyIGJpdHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwga01heFZhcmludEJ5dGVzIC0ga01heFZhcmludDMyQnl0ZXM7IGkrKykgeworICAgIGIgPSAqKHB0cisrKTsKKyAgICBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgfQorCisgIC8vIFdlIGhhdmUgb3ZlcnJ1biB0aGUgbWF4aW11bSBzaXplIG9mIGEgdmFyaW50ICgxMCBieXRlcykuICBBc3N1bWUKKyAgLy8gdGhlIGRhdGEgaXMgY29ycnVwdC4KKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGZhbHNlLCBwdHIpOworCitkb25lOgorICAqdmFsdWUgPSByZXN1bHQ7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0cnVlLCBwdHIpOworfQorCitQUk9UT0JVRl9BTFdBWVNfSU5MSU5FOjpzdGQ6OnBhaXI8Ym9vbCwgY29uc3QgdWludDhfdCo+IFJlYWRWYXJpbnQ2NEZyb21BcnJheSgKKyAgICBjb25zdCB1aW50OF90KiBidWZmZXIsIHVpbnQ2NF90KiB2YWx1ZSk7CitpbmxpbmUgOjpzdGQ6OnBhaXI8Ym9vbCwgY29uc3QgdWludDhfdCo+IFJlYWRWYXJpbnQ2NEZyb21BcnJheSgKKyAgICBjb25zdCB1aW50OF90KiBidWZmZXIsIHVpbnQ2NF90KiB2YWx1ZSkgeworICAvLyBBc3N1bWVzIHZhcmludDY0IGlzIGF0IGxlYXN0IDIgYnl0ZXMuCisgIEdPT0dMRV9EQ0hFQ0tfR0UoYnVmZmVyWzBdLCAxMjgpOworCisgIGNvbnN0IHVpbnQ4X3QqIG5leHQ7CisgIGlmIChidWZmZXJbMV0gPCAxMjgpIHsKKyAgICBuZXh0ID0gRGVjb2RlVmFyaW50NjRLbm93blNpemU8Mj4oYnVmZmVyLCB2YWx1ZSk7CisgIH0gZWxzZSBpZiAoYnVmZmVyWzJdIDwgMTI4KSB7CisgICAgbmV4dCA9IERlY29kZVZhcmludDY0S25vd25TaXplPDM+KGJ1ZmZlciwgdmFsdWUpOworICB9IGVsc2UgaWYgKGJ1ZmZlclszXSA8IDEyOCkgeworICAgIG5leHQgPSBEZWNvZGVWYXJpbnQ2NEtub3duU2l6ZTw0PihidWZmZXIsIHZhbHVlKTsKKyAgfSBlbHNlIGlmIChidWZmZXJbNF0gPCAxMjgpIHsKKyAgICBuZXh0ID0gRGVjb2RlVmFyaW50NjRLbm93blNpemU8NT4oYnVmZmVyLCB2YWx1ZSk7CisgIH0gZWxzZSBpZiAoYnVmZmVyWzVdIDwgMTI4KSB7CisgICAgbmV4dCA9IERlY29kZVZhcmludDY0S25vd25TaXplPDY+KGJ1ZmZlciwgdmFsdWUpOworICB9IGVsc2UgaWYgKGJ1ZmZlcls2XSA8IDEyOCkgeworICAgIG5leHQgPSBEZWNvZGVWYXJpbnQ2NEtub3duU2l6ZTw3PihidWZmZXIsIHZhbHVlKTsKKyAgfSBlbHNlIGlmIChidWZmZXJbN10gPCAxMjgpIHsKKyAgICBuZXh0ID0gRGVjb2RlVmFyaW50NjRLbm93blNpemU8OD4oYnVmZmVyLCB2YWx1ZSk7CisgIH0gZWxzZSBpZiAoYnVmZmVyWzhdIDwgMTI4KSB7CisgICAgbmV4dCA9IERlY29kZVZhcmludDY0S25vd25TaXplPDk+KGJ1ZmZlciwgdmFsdWUpOworICB9IGVsc2UgaWYgKGJ1ZmZlcls5XSA8IDEyOCkgeworICAgIG5leHQgPSBEZWNvZGVWYXJpbnQ2NEtub3duU2l6ZTwxMD4oYnVmZmVyLCB2YWx1ZSk7CisgIH0gZWxzZSB7CisgICAgLy8gV2UgaGF2ZSBvdmVycnVuIHRoZSBtYXhpbXVtIHNpemUgb2YgYSB2YXJpbnQgKDEwIGJ5dGVzKS4gQXNzdW1lCisgICAgLy8gdGhlIGRhdGEgaXMgY29ycnVwdC4KKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZmFsc2UsIGJ1ZmZlciArIDExKTsKKyAgfQorCisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0cnVlLCBuZXh0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDMyU2xvdyh1aW50MzJfdCogdmFsdWUpIHsKKyAgLy8gRGlyZWN0bHkgaW52b2tlIFJlYWRWYXJpbnQ2NEZhbGxiYWNrLCBzaW5jZSB3ZSBhbHJlYWR5IHRyaWVkIHRvIG9wdGltaXplCisgIC8vIGZvciBvbmUtYnl0ZSB2YXJpbnRzLgorICBzdGQ6OnBhaXI8dWludDY0X3QsIGJvb2w+IHAgPSBSZWFkVmFyaW50NjRGYWxsYmFjaygpOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocC5maXJzdCk7CisgIHJldHVybiBwLnNlY29uZDsKK30KKworaW50NjRfdCBDb2RlZElucHV0U3RyZWFtOjpSZWFkVmFyaW50MzJGYWxsYmFjayh1aW50MzJfdCBmaXJzdF9ieXRlX29yX3plcm8pIHsKKyAgaWYgKEJ1ZmZlclNpemUoKSA+PSBrTWF4VmFyaW50Qnl0ZXMgfHwKKyAgICAgIC8vIE9wdGltaXphdGlvbjogIFdlJ3JlIGFsc28gc2FmZSBpZiB0aGUgYnVmZmVyIGlzIG5vbi1lbXB0eSBhbmQgaXQgZW5kcworICAgICAgLy8gd2l0aCBhIGJ5dGUgdGhhdCB3b3VsZCB0ZXJtaW5hdGUgYSB2YXJpbnQuCisgICAgICAoYnVmZmVyX2VuZF8gPiBidWZmZXJfICYmICEoYnVmZmVyX2VuZF9bLTFdICYgMHg4MCkpKSB7CisgICAgR09PR0xFX0RDSEVDS19ORShmaXJzdF9ieXRlX29yX3plcm8sIDApCisgICAgICAgIDw8ICJDYWxsZXIgc2hvdWxkIHByb3ZpZGUgdXMgd2l0aCAqYnVmZmVyXyB3aGVuIGJ1ZmZlciBpcyBub24tZW1wdHkiOworICAgIHVpbnQzMl90IHRlbXA7CisgICAgOjpzdGQ6OnBhaXI8Ym9vbCwgY29uc3QgdWludDhfdCo+IHAgPQorICAgICAgICBSZWFkVmFyaW50MzJGcm9tQXJyYXkoZmlyc3RfYnl0ZV9vcl96ZXJvLCBidWZmZXJfLCAmdGVtcCk7CisgICAgaWYgKCFwLmZpcnN0KSByZXR1cm4gLTE7CisgICAgYnVmZmVyXyA9IHAuc2Vjb25kOworICAgIHJldHVybiB0ZW1wOworICB9IGVsc2UgeworICAgIC8vIFJlYWxseSBzbG93IGNhc2U6IHdlIHdpbGwgaW5jdXIgdGhlIGNvc3Qgb2YgYW4gZXh0cmEgZnVuY3Rpb24gY2FsbCBoZXJlLAorICAgIC8vIGJ1dCBtb3ZpbmcgdGhpcyBvdXQgb2YgbGluZSByZWR1Y2VzIHRoZSBzaXplIG9mIHRoaXMgZnVuY3Rpb24sIHdoaWNoCisgICAgLy8gaW1wcm92ZXMgdGhlIGNvbW1vbiBjYXNlLiBJbiBtaWNybyBiZW5jaG1hcmtzLCB0aGlzIGlzIHdvcnRoIGFib3V0IDEwLTE1JQorICAgIHVpbnQzMl90IHRlbXA7CisgICAgcmV0dXJuIFJlYWRWYXJpbnQzMlNsb3coJnRlbXApID8gc3RhdGljX2Nhc3Q8aW50NjRfdD4odGVtcCkgOiAtMTsKKyAgfQorfQorCitpbnQgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludFNpemVBc0ludFNsb3coKSB7CisgIC8vIERpcmVjdGx5IGludm9rZSBSZWFkVmFyaW50NjRGYWxsYmFjaywgc2luY2Ugd2UgYWxyZWFkeSB0cmllZCB0byBvcHRpbWl6ZQorICAvLyBmb3Igb25lLWJ5dGUgdmFyaW50cy4KKyAgc3RkOjpwYWlyPHVpbnQ2NF90LCBib29sPiBwID0gUmVhZFZhcmludDY0RmFsbGJhY2soKTsKKyAgaWYgKCFwLnNlY29uZCB8fCBwLmZpcnN0ID4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KElOVF9NQVgpKSByZXR1cm4gLTE7CisgIHJldHVybiBwLmZpcnN0OworfQorCitpbnQgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludFNpemVBc0ludEZhbGxiYWNrKCkgeworICBpZiAoQnVmZmVyU2l6ZSgpID49IGtNYXhWYXJpbnRCeXRlcyB8fAorICAgICAgLy8gT3B0aW1pemF0aW9uOiAgV2UncmUgYWxzbyBzYWZlIGlmIHRoZSBidWZmZXIgaXMgbm9uLWVtcHR5IGFuZCBpdCBlbmRzCisgICAgICAvLyB3aXRoIGEgYnl0ZSB0aGF0IHdvdWxkIHRlcm1pbmF0ZSBhIHZhcmludC4KKyAgICAgIChidWZmZXJfZW5kXyA+IGJ1ZmZlcl8gJiYgIShidWZmZXJfZW5kX1stMV0gJiAweDgwKSkpIHsKKyAgICB1aW50NjRfdCB0ZW1wOworICAgIDo6c3RkOjpwYWlyPGJvb2wsIGNvbnN0IHVpbnQ4X3QqPiBwID0gUmVhZFZhcmludDY0RnJvbUFycmF5KGJ1ZmZlcl8sICZ0ZW1wKTsKKyAgICBpZiAoIXAuZmlyc3QgfHwgdGVtcCA+IHN0YXRpY19jYXN0PHVpbnQ2NF90PihJTlRfTUFYKSkgcmV0dXJuIC0xOworICAgIGJ1ZmZlcl8gPSBwLnNlY29uZDsKKyAgICByZXR1cm4gdGVtcDsKKyAgfSBlbHNlIHsKKyAgICAvLyBSZWFsbHkgc2xvdyBjYXNlOiB3ZSB3aWxsIGluY3VyIHRoZSBjb3N0IG9mIGFuIGV4dHJhIGZ1bmN0aW9uIGNhbGwgaGVyZSwKKyAgICAvLyBidXQgbW92aW5nIHRoaXMgb3V0IG9mIGxpbmUgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGlzIGZ1bmN0aW9uLCB3aGljaAorICAgIC8vIGltcHJvdmVzIHRoZSBjb21tb24gY2FzZS4gSW4gbWljcm8gYmVuY2htYXJrcywgdGhpcyBpcyB3b3J0aCBhYm91dCAxMC0xNSUKKyAgICByZXR1cm4gUmVhZFZhcmludFNpemVBc0ludFNsb3coKTsKKyAgfQorfQorCit1aW50MzJfdCBDb2RlZElucHV0U3RyZWFtOjpSZWFkVGFnU2xvdygpIHsKKyAgaWYgKGJ1ZmZlcl8gPT0gYnVmZmVyX2VuZF8pIHsKKyAgICAvLyBDYWxsIHJlZnJlc2guCisgICAgaWYgKCFSZWZyZXNoKCkpIHsKKyAgICAgIC8vIFJlZnJlc2ggZmFpbGVkLiAgTWFrZSBzdXJlIHRoYXQgaXQgZmFpbGVkIGR1ZSB0byBFT0YsIG5vdCBiZWNhdXNlCisgICAgICAvLyB3ZSBoaXQgdG90YWxfYnl0ZXNfbGltaXRfLCB3aGljaCwgdW5saWtlIG5vcm1hbCBsaW1pdHMsIGlzIG5vdCBhCisgICAgICAvLyB2YWxpZCBwbGFjZSB0byBlbmQgYSBtZXNzYWdlLgorICAgICAgaW50IGN1cnJlbnRfcG9zaXRpb24gPSB0b3RhbF9ieXRlc19yZWFkXyAtIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XzsKKyAgICAgIGlmIChjdXJyZW50X3Bvc2l0aW9uID49IHRvdGFsX2J5dGVzX2xpbWl0XykgeworICAgICAgICAvLyBIaXQgdG90YWxfYnl0ZXNfbGltaXRfLiAgQnV0IGlmIHdlIGFsc28gaGl0IHRoZSBub3JtYWwgbGltaXQsCisgICAgICAgIC8vIHdlJ3JlIHN0aWxsIE9LLgorICAgICAgICBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyA9IGN1cnJlbnRfbGltaXRfID09IHRvdGFsX2J5dGVzX2xpbWl0XzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxlZ2l0aW1hdGVfbWVzc2FnZV9lbmRfID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIC8vIEZvciB0aGUgc2xvdyBwYXRoLCBqdXN0IGRvIGEgNjQtYml0IHJlYWQuIFRyeSB0byBvcHRpbWl6ZSBmb3Igb25lLWJ5dGUgdGFncworICAvLyBhZ2Fpbiwgc2luY2Ugd2UgaGF2ZSBub3cgcmVmcmVzaGVkIHRoZSBidWZmZXIuCisgIHVpbnQ2NF90IHJlc3VsdCA9IDA7CisgIGlmICghUmVhZFZhcmludDY0KCZyZXN1bHQpKSByZXR1cm4gMDsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihyZXN1bHQpOworfQorCit1aW50MzJfdCBDb2RlZElucHV0U3RyZWFtOjpSZWFkVGFnRmFsbGJhY2sodWludDMyX3QgZmlyc3RfYnl0ZV9vcl96ZXJvKSB7CisgIGNvbnN0IGludCBidWZfc2l6ZSA9IEJ1ZmZlclNpemUoKTsKKyAgaWYgKGJ1Zl9zaXplID49IGtNYXhWYXJpbnRCeXRlcyB8fAorICAgICAgLy8gT3B0aW1pemF0aW9uOiAgV2UncmUgYWxzbyBzYWZlIGlmIHRoZSBidWZmZXIgaXMgbm9uLWVtcHR5IGFuZCBpdCBlbmRzCisgICAgICAvLyB3aXRoIGEgYnl0ZSB0aGF0IHdvdWxkIHRlcm1pbmF0ZSBhIHZhcmludC4KKyAgICAgIChidWZfc2l6ZSA+IDAgJiYgIShidWZmZXJfZW5kX1stMV0gJiAweDgwKSkpIHsKKyAgICBHT09HTEVfRENIRUNLX0VRKGZpcnN0X2J5dGVfb3JfemVybywgYnVmZmVyX1swXSk7CisgICAgaWYgKGZpcnN0X2J5dGVfb3JfemVybyA9PSAwKSB7CisgICAgICArK2J1ZmZlcl87CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdWludDMyX3QgdGFnOworICAgIDo6c3RkOjpwYWlyPGJvb2wsIGNvbnN0IHVpbnQ4X3QqPiBwID0KKyAgICAgICAgUmVhZFZhcmludDMyRnJvbUFycmF5KGZpcnN0X2J5dGVfb3JfemVybywgYnVmZmVyXywgJnRhZyk7CisgICAgaWYgKCFwLmZpcnN0KSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYnVmZmVyXyA9IHAuc2Vjb25kOworICAgIHJldHVybiB0YWc7CisgIH0gZWxzZSB7CisgICAgLy8gV2UgYXJlIGNvbW1vbmx5IGF0IGEgbGltaXQgd2hlbiBhdHRlbXB0aW5nIHRvIHJlYWQgdGFncy4gVHJ5IHRvIHF1aWNrbHkKKyAgICAvLyBkZXRlY3QgdGhpcyBjYXNlIHdpdGhvdXQgbWFraW5nIGFub3RoZXIgZnVuY3Rpb24gY2FsbC4KKyAgICBpZiAoKGJ1Zl9zaXplID09IDApICYmCisgICAgICAgICgoYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID4gMCkgfHwKKyAgICAgICAgICh0b3RhbF9ieXRlc19yZWFkXyA9PSBjdXJyZW50X2xpbWl0XykpICYmCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBsaW1pdCB3ZSBoaXQgaXMgbm90IHRvdGFsX2J5dGVzX2xpbWl0Xywgc2luY2UKKyAgICAgICAgLy8gaW4gdGhhdCBjYXNlIHdlIHN0aWxsIG5lZWQgdG8gY2FsbCBSZWZyZXNoKCkgc28gdGhhdCBpdCBwcmludHMgYW4KKyAgICAgICAgLy8gZXJyb3IuCisgICAgICAgIHRvdGFsX2J5dGVzX3JlYWRfIC0gYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfIDwgdG90YWxfYnl0ZXNfbGltaXRfKSB7CisgICAgICAvLyBXZSBoaXQgYSBieXRlIGxpbWl0LgorICAgICAgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF8gPSB0cnVlOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBSZWFkVGFnU2xvdygpOworICB9Cit9CisKK2Jvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDY0U2xvdyh1aW50NjRfdCogdmFsdWUpIHsKKyAgLy8gU2xvdyBwYXRoOiAgVGhpcyByZWFkIG1pZ2h0IGNyb3NzIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgc28gd2UKKyAgLy8gbmVlZCB0byBjaGVjayBhbmQgcmVmcmVzaCB0aGUgYnVmZmVyIGlmIGFuZCB3aGVuIGl0IGRvZXMuCisKKyAgdWludDY0X3QgcmVzdWx0ID0gMDsKKyAgaW50IGNvdW50ID0gMDsKKyAgdWludDMyX3QgYjsKKworICBkbyB7CisgICAgaWYgKGNvdW50ID09IGtNYXhWYXJpbnRCeXRlcykgeworICAgICAgKnZhbHVlID0gMDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgd2hpbGUgKGJ1ZmZlcl8gPT0gYnVmZmVyX2VuZF8pIHsKKyAgICAgIGlmICghUmVmcmVzaCgpKSB7CisgICAgICAgICp2YWx1ZSA9IDA7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgYiA9ICpidWZmZXJfOworICAgIHJlc3VsdCB8PSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYiAmIDB4N0YpIDw8ICg3ICogY291bnQpOworICAgIEFkdmFuY2UoMSk7CisgICAgKytjb3VudDsKKyAgfSB3aGlsZSAoYiAmIDB4ODApOworCisgICp2YWx1ZSA9IHJlc3VsdDsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0ZDo6cGFpcjx1aW50NjRfdCwgYm9vbD4gQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDY0RmFsbGJhY2soKSB7CisgIGlmIChCdWZmZXJTaXplKCkgPj0ga01heFZhcmludEJ5dGVzIHx8CisgICAgICAvLyBPcHRpbWl6YXRpb246ICBXZSdyZSBhbHNvIHNhZmUgaWYgdGhlIGJ1ZmZlciBpcyBub24tZW1wdHkgYW5kIGl0IGVuZHMKKyAgICAgIC8vIHdpdGggYSBieXRlIHRoYXQgd291bGQgdGVybWluYXRlIGEgdmFyaW50LgorICAgICAgKGJ1ZmZlcl9lbmRfID4gYnVmZmVyXyAmJiAhKGJ1ZmZlcl9lbmRfWy0xXSAmIDB4ODApKSkgeworICAgIHVpbnQ2NF90IHRlbXA7CisgICAgOjpzdGQ6OnBhaXI8Ym9vbCwgY29uc3QgdWludDhfdCo+IHAgPSBSZWFkVmFyaW50NjRGcm9tQXJyYXkoYnVmZmVyXywgJnRlbXApOworICAgIGlmICghcC5maXJzdCkgeworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDAsIGZhbHNlKTsKKyAgICB9CisgICAgYnVmZmVyXyA9IHAuc2Vjb25kOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0ZW1wLCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICB1aW50NjRfdCB0ZW1wOworICAgIGJvb2wgc3VjY2VzcyA9IFJlYWRWYXJpbnQ2NFNsb3coJnRlbXApOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0ZW1wLCBzdWNjZXNzKTsKKyAgfQorfQorCitib29sIENvZGVkSW5wdXRTdHJlYW06OlJlZnJlc2goKSB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEoMCwgQnVmZmVyU2l6ZSgpKTsKKworICBpZiAoYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID4gMCB8fCBvdmVyZmxvd19ieXRlc18gPiAwIHx8CisgICAgICB0b3RhbF9ieXRlc19yZWFkXyA9PSBjdXJyZW50X2xpbWl0XykgeworICAgIC8vIFdlJ3ZlIGhpdCBhIGxpbWl0LiAgU3RvcC4KKyAgICBpbnQgY3VycmVudF9wb3NpdGlvbiA9IHRvdGFsX2J5dGVzX3JlYWRfIC0gYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfOworCisgICAgaWYgKGN1cnJlbnRfcG9zaXRpb24gPj0gdG90YWxfYnl0ZXNfbGltaXRfICYmCisgICAgICAgIHRvdGFsX2J5dGVzX2xpbWl0XyAhPSBjdXJyZW50X2xpbWl0XykgeworICAgICAgLy8gSGl0IHRvdGFsX2J5dGVzX2xpbWl0Xy4KKyAgICAgIFByaW50VG90YWxCeXRlc0xpbWl0RXJyb3IoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCB2b2lkKiB2b2lkX2J1ZmZlcjsKKyAgaW50IGJ1ZmZlcl9zaXplOworICBpZiAoTmV4dE5vbkVtcHR5KGlucHV0XywgJnZvaWRfYnVmZmVyLCAmYnVmZmVyX3NpemUpKSB7CisgICAgYnVmZmVyXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHZvaWRfYnVmZmVyKTsKKyAgICBidWZmZXJfZW5kXyA9IGJ1ZmZlcl8gKyBidWZmZXJfc2l6ZTsKKyAgICBHT09HTEVfQ0hFQ0tfR0UoYnVmZmVyX3NpemUsIDApOworCisgICAgaWYgKHRvdGFsX2J5dGVzX3JlYWRfIDw9IElOVF9NQVggLSBidWZmZXJfc2l6ZSkgeworICAgICAgdG90YWxfYnl0ZXNfcmVhZF8gKz0gYnVmZmVyX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE92ZXJmbG93LiAgUmVzZXQgYnVmZmVyX2VuZF8gdG8gbm90IGluY2x1ZGUgdGhlIGJ5dGVzIGJleW9uZCBJTlRfTUFYLgorICAgICAgLy8gV2UgY2FuJ3QgZ2V0IHRoYXQgZmFyIGFueXdheSwgYmVjYXVzZSB0b3RhbF9ieXRlc19saW1pdF8gaXMgZ3VhcmFudGVlZAorICAgICAgLy8gdG8gYmUgbGVzcyB0aGFuIGl0LiAgV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICAgIC8vIHdlIGRpc2NhcmRlZCwgdGhvdWdoLCBzbyB0aGF0IHdlIGNhbiBjYWxsIGlucHV0Xy0+QmFja1VwKCkgdG8gYmFjaworICAgICAgLy8gdXAgb3ZlciB0aGVtIG9uIGRlc3RydWN0aW9uLgorCisgICAgICAvLyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgZXF1aXZhbGVudCB0bzoKKyAgICAgIC8vICAgb3ZlcmZsb3dfYnl0ZXNfID0gdG90YWxfYnl0ZXNfcmVhZF8gKyBidWZmZXJfc2l6ZSAtIElOVF9NQVg7CisgICAgICAvLyBleGNlcHQgdGhhdCBpdCBhdm9pZHMgb3ZlcmZsb3dzLiAgU2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgaGFzCisgICAgICAvLyB1bmRlZmluZWQgcmVzdWx0cyBhY2NvcmRpbmcgdG8gdGhlIEMgc3RhbmRhcmQuCisgICAgICBvdmVyZmxvd19ieXRlc18gPSB0b3RhbF9ieXRlc19yZWFkXyAtIChJTlRfTUFYIC0gYnVmZmVyX3NpemUpOworICAgICAgYnVmZmVyX2VuZF8gLT0gb3ZlcmZsb3dfYnl0ZXNfOworICAgICAgdG90YWxfYnl0ZXNfcmVhZF8gPSBJTlRfTUFYOworICAgIH0KKworICAgIFJlY29tcHV0ZUJ1ZmZlckxpbWl0cygpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIGJ1ZmZlcl8gPSBOVUxMOworICAgIGJ1ZmZlcl9lbmRfID0gTlVMTDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8gQ29kZWRPdXRwdXRTdHJlYW0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIEVwc0NvcHlPdXRwdXRTdHJlYW06OkVuYWJsZUFsaWFzaW5nKGJvb2wgZW5hYmxlZCkgeworICBhbGlhc2luZ19lbmFibGVkXyA9IGVuYWJsZWQgJiYgc3RyZWFtXy0+QWxsb3dzQWxpYXNpbmcoKTsKK30KKworaW50NjRfdCBFcHNDb3B5T3V0cHV0U3RyZWFtOjpCeXRlQ291bnQodWludDhfdCogcHRyKSBjb25zdCB7CisgIC8vIENhbGN1bGF0ZSB0aGUgY3VycmVudCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGJ1ZmZlci4KKyAgaW50IGRlbHRhID0gKGVuZF8gLSBwdHIpICsgKGJ1ZmZlcl9lbmRfID8gMCA6IGtTbG9wQnl0ZXMpOworICByZXR1cm4gc3RyZWFtXy0+Qnl0ZUNvdW50KCkgLSBkZWx0YTsKK30KKworLy8gRmx1c2hlcyB3aGF0J3Mgd3JpdHRlbiBvdXQgdG8gdGhlIHVuZGVybHlpbmcgWmVyb0NvcHlPdXRwdXRTdHJlYW0gYnVmZmVycy4KKy8vIFJldHVybnMgdGhlIHNpemUgcmVtYWluaW5nIGluIHRoZSBidWZmZXIgYW5kIHNldHMgYnVmZmVyX2VuZF8gdG8gdGhlIHN0YXJ0CisvLyBvZiB0aGUgcmVtYWluaW5nIGJ1ZmZlciwgaWUuIFtidWZmZXJfZW5kXywgYnVmZmVyX2VuZF8gKyByZXR1cm4gdmFsdWUpCitpbnQgRXBzQ29weU91dHB1dFN0cmVhbTo6Rmx1c2godWludDhfdCogcHRyKSB7CisgIHdoaWxlIChidWZmZXJfZW5kXyAmJiBwdHIgPiBlbmRfKSB7CisgICAgaW50IG92ZXJydW4gPSBwdHIgLSBlbmRfOworICAgIEdPT0dMRV9EQ0hFQ0soIWhhZF9lcnJvcl8pOworICAgIEdPT0dMRV9EQ0hFQ0sob3ZlcnJ1biA8PSBrU2xvcEJ5dGVzKTsgIC8vIE5PTElOVAorICAgIHB0ciA9IE5leHQoKSArIG92ZXJydW47CisgICAgaWYgKGhhZF9lcnJvcl8pIHJldHVybiAwOworICB9CisgIGludCBzOworICBpZiAoYnVmZmVyX2VuZF8pIHsKKyAgICBzdGQ6Om1lbWNweShidWZmZXJfZW5kXywgYnVmZmVyXywgcHRyIC0gYnVmZmVyXyk7CisgICAgYnVmZmVyX2VuZF8gKz0gcHRyIC0gYnVmZmVyXzsKKyAgICBzID0gZW5kXyAtIHB0cjsKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGUgc3RyZWFtIGlzIHdyaXRpbmcgZGlyZWN0bHkgaW4gdGhlIFplcm9Db3B5T3V0cHV0U3RyZWFtIGJ1ZmZlci4KKyAgICBzID0gZW5kXyArIGtTbG9wQnl0ZXMgLSBwdHI7CisgICAgYnVmZmVyX2VuZF8gPSBwdHI7CisgIH0KKyAgR09PR0xFX0RDSEVDSyhzID49IDApOyAgLy8gTk9MSU5UCisgIHJldHVybiBzOworfQorCit1aW50OF90KiBFcHNDb3B5T3V0cHV0U3RyZWFtOjpUcmltKHVpbnQ4X3QqIHB0cikgeworICBpZiAoaGFkX2Vycm9yXykgcmV0dXJuIHB0cjsKKyAgaW50IHMgPSBGbHVzaChwdHIpOworICBzdHJlYW1fLT5CYWNrVXAocyk7CisgIC8vIFJlc2V0IHRvIGluaXRpYWwgc3RhdGUgKGV4cGVjdGluZyBuZXcgYnVmZmVyKQorICBidWZmZXJfZW5kXyA9IGVuZF8gPSBidWZmZXJfOworICByZXR1cm4gYnVmZmVyXzsKK30KKworCit1aW50OF90KiBFcHNDb3B5T3V0cHV0U3RyZWFtOjpGbHVzaEFuZFJlc2V0QnVmZmVyKHVpbnQ4X3QqIHB0cikgeworICBpZiAoaGFkX2Vycm9yXykgcmV0dXJuIGJ1ZmZlcl87CisgIGludCBzID0gRmx1c2gocHRyKTsKKyAgaWYgKGhhZF9lcnJvcl8pIHJldHVybiBidWZmZXJfOworICByZXR1cm4gU2V0SW5pdGlhbEJ1ZmZlcihidWZmZXJfZW5kXywgcyk7Cit9CisKK2Jvb2wgRXBzQ29weU91dHB1dFN0cmVhbTo6U2tpcChpbnQgY291bnQsIHVpbnQ4X3QqKiBwcCkgeworICBpZiAoY291bnQgPCAwKSByZXR1cm4gZmFsc2U7CisgIGlmIChoYWRfZXJyb3JfKSB7CisgICAgKnBwID0gYnVmZmVyXzsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW50IHNpemUgPSBGbHVzaCgqcHApOworICBpZiAoaGFkX2Vycm9yXykgeworICAgICpwcCA9IGJ1ZmZlcl87CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHZvaWQqIGRhdGEgPSBidWZmZXJfZW5kXzsKKyAgd2hpbGUgKGNvdW50ID4gc2l6ZSkgeworICAgIGNvdW50IC09IHNpemU7CisgICAgaWYgKCFzdHJlYW1fLT5OZXh0KCZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICpwcCA9IEVycm9yKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgICpwcCA9IFNldEluaXRpYWxCdWZmZXIoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGRhdGEpICsgY291bnQsIHNpemUgLSBjb3VudCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEVwc0NvcHlPdXRwdXRTdHJlYW06OkdldERpcmVjdEJ1ZmZlclBvaW50ZXIodm9pZCoqIGRhdGEsIGludCogc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogcHApIHsKKyAgaWYgKGhhZF9lcnJvcl8pIHsKKyAgICAqcHAgPSBidWZmZXJfOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAqc2l6ZSA9IEZsdXNoKCpwcCk7CisgIGlmIChoYWRfZXJyb3JfKSB7CisgICAgKnBwID0gYnVmZmVyXzsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgKmRhdGEgPSBidWZmZXJfZW5kXzsKKyAgd2hpbGUgKCpzaXplID09IDApIHsKKyAgICBpZiAoIXN0cmVhbV8tPk5leHQoZGF0YSwgc2l6ZSkpIHsKKyAgICAgICpwcCA9IEVycm9yKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgICpwcCA9IFNldEluaXRpYWxCdWZmZXIoKmRhdGEsICpzaXplKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3VpbnQ4X3QqIEVwc0NvcHlPdXRwdXRTdHJlYW06OkdldERpcmVjdEJ1ZmZlckZvck5CeXRlc0FuZEFkdmFuY2UoaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogcHApIHsKKyAgaWYgKGhhZF9lcnJvcl8pIHsKKyAgICAqcHAgPSBidWZmZXJfOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGludCBzID0gRmx1c2goKnBwKTsKKyAgaWYgKGhhZF9lcnJvcl8pIHsKKyAgICAqcHAgPSBidWZmZXJfOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChzID49IHNpemUpIHsKKyAgICBhdXRvIHJlcyA9IGJ1ZmZlcl9lbmRfOworICAgICpwcCA9IFNldEluaXRpYWxCdWZmZXIoYnVmZmVyX2VuZF8gKyBzaXplLCBzIC0gc2l6ZSk7CisgICAgcmV0dXJuIHJlczsKKyAgfSBlbHNlIHsKKyAgICAqcHAgPSBTZXRJbml0aWFsQnVmZmVyKGJ1ZmZlcl9lbmRfLCBzKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorfQorCit1aW50OF90KiBFcHNDb3B5T3V0cHV0U3RyZWFtOjpOZXh0KCkgeworICBHT09HTEVfRENIRUNLKCFoYWRfZXJyb3JfKTsgIC8vIE5PTElOVAorICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShzdHJlYW1fID09IG51bGxwdHIpKSByZXR1cm4gRXJyb3IoKTsKKyAgaWYgKGJ1ZmZlcl9lbmRfKSB7CisgICAgLy8gV2UncmUgaW4gdGhlIHBhdGNoIGJ1ZmZlciBhbmQgbmVlZCB0byBmaWxsIHVwIHRoZSBwcmV2aW91cyBidWZmZXIuCisgICAgc3RkOjptZW1jcHkoYnVmZmVyX2VuZF8sIGJ1ZmZlcl8sIGVuZF8gLSBidWZmZXJfKTsKKyAgICB1aW50OF90KiBwdHI7CisgICAgaW50IHNpemU7CisgICAgZG8geworICAgICAgdm9pZCogZGF0YTsKKyAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCFzdHJlYW1fLT5OZXh0KCZkYXRhLCAmc2l6ZSkpKSB7CisgICAgICAgIC8vIFN0cmVhbSBoYXMgYW4gZXJyb3IsIHdlIHVzZSB0aGUgcGF0Y2ggYnVmZmVyIHRvIGNvbnRpbnVlIHRvIGJlCisgICAgICAgIC8vIGFibGUgdG8gd3JpdGUuCisgICAgICAgIHJldHVybiBFcnJvcigpOworICAgICAgfQorICAgICAgcHRyID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGRhdGEpOworICAgIH0gd2hpbGUgKHNpemUgPT0gMCk7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzaXplID4ga1Nsb3BCeXRlcykpIHsKKyAgICAgIHN0ZDo6bWVtY3B5KHB0ciwgZW5kXywga1Nsb3BCeXRlcyk7CisgICAgICBlbmRfID0gcHRyICsgc2l6ZSAtIGtTbG9wQnl0ZXM7CisgICAgICBidWZmZXJfZW5kXyA9IG51bGxwdHI7CisgICAgICByZXR1cm4gcHRyOworICAgIH0gZWxzZSB7CisgICAgICBHT09HTEVfRENIRUNLKHNpemUgPiAwKTsgIC8vIE5PTElOVAorICAgICAgLy8gQnVmZmVyIHRvIHNtYWxsCisgICAgICBzdGQ6Om1lbW1vdmUoYnVmZmVyXywgZW5kXywga1Nsb3BCeXRlcyk7CisgICAgICBidWZmZXJfZW5kXyA9IHB0cjsKKyAgICAgIGVuZF8gPSBidWZmZXJfICsgc2l6ZTsKKyAgICAgIHJldHVybiBidWZmZXJfOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6Om1lbWNweShidWZmZXJfLCBlbmRfLCBrU2xvcEJ5dGVzKTsKKyAgICBidWZmZXJfZW5kXyA9IGVuZF87CisgICAgZW5kXyA9IGJ1ZmZlcl8gKyBrU2xvcEJ5dGVzOworICAgIHJldHVybiBidWZmZXJfOworICB9Cit9CisKK3VpbnQ4X3QqIEVwc0NvcHlPdXRwdXRTdHJlYW06OkVuc3VyZVNwYWNlRmFsbGJhY2sodWludDhfdCogcHRyKSB7CisgIGRvIHsKKyAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShoYWRfZXJyb3JfKSkgcmV0dXJuIGJ1ZmZlcl87CisgICAgaW50IG92ZXJydW4gPSBwdHIgLSBlbmRfOworICAgIEdPT0dMRV9EQ0hFQ0sob3ZlcnJ1biA+PSAwKTsgICAgICAgICAgIC8vIE5PTElOVAorICAgIEdPT0dMRV9EQ0hFQ0sob3ZlcnJ1biA8PSBrU2xvcEJ5dGVzKTsgIC8vIE5PTElOVAorICAgIHB0ciA9IE5leHQoKSArIG92ZXJydW47CisgIH0gd2hpbGUgKHB0ciA+PSBlbmRfKTsKKyAgR09PR0xFX0RDSEVDSyhwdHIgPCBlbmRfKTsgIC8vIE5PTElOVAorICByZXR1cm4gcHRyOworfQorCit1aW50OF90KiBFcHNDb3B5T3V0cHV0U3RyZWFtOjpXcml0ZVJhd0ZhbGxiYWNrKGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcHRyKSB7CisgIGludCBzID0gR2V0U2l6ZShwdHIpOworICB3aGlsZSAocyA8IHNpemUpIHsKKyAgICBzdGQ6Om1lbWNweShwdHIsIGRhdGEsIHMpOworICAgIHNpemUgLT0gczsKKyAgICBkYXRhID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpICsgczsKKyAgICBwdHIgPSBFbnN1cmVTcGFjZUZhbGxiYWNrKHB0ciArIHMpOworICAgIHMgPSBHZXRTaXplKHB0cik7CisgIH0KKyAgc3RkOjptZW1jcHkocHRyLCBkYXRhLCBzaXplKTsKKyAgcmV0dXJuIHB0ciArIHNpemU7Cit9CisKK3VpbnQ4X3QqIEVwc0NvcHlPdXRwdXRTdHJlYW06OldyaXRlQWxpYXNlZFJhdyhjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcHRyKSB7CisgIGlmIChzaXplIDwgR2V0U2l6ZShwdHIpCisgICkgeworICAgIHJldHVybiBXcml0ZVJhdyhkYXRhLCBzaXplLCBwdHIpOworICB9IGVsc2UgeworICAgIHB0ciA9IFRyaW0ocHRyKTsKKyAgICBpZiAoc3RyZWFtXy0+V3JpdGVBbGlhc2VkUmF3KGRhdGEsIHNpemUpKSByZXR1cm4gcHRyOworICAgIHJldHVybiBFcnJvcigpOworICB9Cit9CisKKyNpZm5kZWYgUFJPVE9CVUZfTElUVExFX0VORElBTgordWludDhfdCogRXBzQ29weU91dHB1dFN0cmVhbTo6V3JpdGVSYXdMaXR0bGVFbmRpYW4zMihjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHB0cikgeworICBhdXRvIHAgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSk7CisgIGF1dG8gZW5kID0gcCArIHNpemU7CisgIHdoaWxlIChlbmQgLSBwID49IGtTbG9wQnl0ZXMpIHsKKyAgICBwdHIgPSBFbnN1cmVTcGFjZShwdHIpOworICAgIHVpbnQzMl90IGJ1ZmZlcls0XTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihidWZmZXIpID09IGtTbG9wQnl0ZXMsICJCdWZmZXIgbXVzdCBiZSBrU2xvcEJ5dGVzIik7CisgICAgc3RkOjptZW1jcHkoYnVmZmVyLCBwLCBrU2xvcEJ5dGVzKTsKKyAgICBwICs9IGtTbG9wQnl0ZXM7CisgICAgZm9yIChhdXRvIHggOiBidWZmZXIpCisgICAgICBwdHIgPSBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW4zMlRvQXJyYXkoeCwgcHRyKTsKKyAgfQorICB3aGlsZSAocCA8IGVuZCkgeworICAgIHB0ciA9IEVuc3VyZVNwYWNlKHB0cik7CisgICAgdWludDMyX3QgYnVmZmVyOworICAgIHN0ZDo6bWVtY3B5KCZidWZmZXIsIHAsIDQpOworICAgIHAgKz0gNDsKKyAgICBwdHIgPSBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW4zMlRvQXJyYXkoYnVmZmVyLCBwdHIpOworICB9CisgIHJldHVybiBwdHI7Cit9CisKK3VpbnQ4X3QqIEVwc0NvcHlPdXRwdXRTdHJlYW06OldyaXRlUmF3TGl0dGxlRW5kaWFuNjQoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwdHIpIHsKKyAgYXV0byBwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpOworICBhdXRvIGVuZCA9IHAgKyBzaXplOworICB3aGlsZSAoZW5kIC0gcCA+PSBrU2xvcEJ5dGVzKSB7CisgICAgcHRyID0gRW5zdXJlU3BhY2UocHRyKTsKKyAgICB1aW50NjRfdCBidWZmZXJbMl07CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYnVmZmVyKSA9PSBrU2xvcEJ5dGVzLCAiQnVmZmVyIG11c3QgYmUga1Nsb3BCeXRlcyIpOworICAgIHN0ZDo6bWVtY3B5KGJ1ZmZlciwgcCwga1Nsb3BCeXRlcyk7CisgICAgcCArPSBrU2xvcEJ5dGVzOworICAgIGZvciAoYXV0byB4IDogYnVmZmVyKQorICAgICAgcHRyID0gQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuNjRUb0FycmF5KHgsIHB0cik7CisgIH0KKyAgd2hpbGUgKHAgPCBlbmQpIHsKKyAgICBwdHIgPSBFbnN1cmVTcGFjZShwdHIpOworICAgIHVpbnQ2NF90IGJ1ZmZlcjsKKyAgICBzdGQ6Om1lbWNweSgmYnVmZmVyLCBwLCA4KTsKKyAgICBwICs9IDg7CisgICAgcHRyID0gQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuNjRUb0FycmF5KGJ1ZmZlciwgcHRyKTsKKyAgfQorICByZXR1cm4gcHRyOworfQorI2VuZGlmCisKKwordWludDhfdCogRXBzQ29weU91dHB1dFN0cmVhbTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWRPdXRsaW5lKHVpbnQzMl90IG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHB0cikgeworICBwdHIgPSBFbnN1cmVTcGFjZShwdHIpOworICB1aW50MzJfdCBzaXplID0gcy5zaXplKCk7CisgIHB0ciA9IFdyaXRlTGVuZ3RoRGVsaW0obnVtLCBzaXplLCBwdHIpOworICByZXR1cm4gV3JpdGVSYXdNYXliZUFsaWFzZWQocy5kYXRhKCksIHNpemUsIHB0cik7Cit9CisKK3VpbnQ4X3QqIEVwc0NvcHlPdXRwdXRTdHJlYW06OldyaXRlU3RyaW5nT3V0bGluZSh1aW50MzJfdCBudW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwdHIpIHsKKyAgcHRyID0gRW5zdXJlU3BhY2UocHRyKTsKKyAgdWludDMyX3Qgc2l6ZSA9IHMuc2l6ZSgpOworICBwdHIgPSBXcml0ZUxlbmd0aERlbGltKG51bSwgc2l6ZSwgcHRyKTsKKyAgcmV0dXJuIFdyaXRlUmF3KHMuZGF0YSgpLCBzaXplLCBwdHIpOworfQorCitzdGQ6OmF0b21pYzxib29sPiBDb2RlZE91dHB1dFN0cmVhbTo6ZGVmYXVsdF9zZXJpYWxpemF0aW9uX2RldGVybWluaXN0aWNfeworICAgIGZhbHNlfTsKKworQ29kZWRPdXRwdXRTdHJlYW06On5Db2RlZE91dHB1dFN0cmVhbSgpIHsgVHJpbSgpOyB9CisKKwordWludDhfdCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlU3RyaW5nV2l0aFNpemVUb0FycmF5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCkgeworICBHT09HTEVfRENIRUNLX0xFKHN0ci5zaXplKCksIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSk7CisgIHRhcmdldCA9IFdyaXRlVmFyaW50MzJUb0FycmF5KHN0ci5zaXplKCksIHRhcmdldCk7CisgIHJldHVybiBXcml0ZVN0cmluZ1RvQXJyYXkoc3RyLCB0YXJnZXQpOworfQorCit1aW50OF90KiBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXlPdXRPZkxpbmVIZWxwZXIodWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCkgeworICBHT09HTEVfRENIRUNLX0dFKHZhbHVlLCAweDgwKTsKKyAgdGFyZ2V0WzBdIHw9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDB4ODApOworICB2YWx1ZSA+Pj0gNzsKKyAgdGFyZ2V0WzFdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmFsdWUpOworICBpZiAodmFsdWUgPCAweDgwKSB7CisgICAgcmV0dXJuIHRhcmdldCArIDI7CisgIH0KKyAgdGFyZ2V0ICs9IDI7CisgIGRvIHsKKyAgICAvLyBUdXJuIG9uIGNvbnRpbnVhdGlvbiBiaXQgaW4gdGhlIGJ5dGUgd2UganVzdCB3cm90ZS4KKyAgICB0YXJnZXRbLTFdIHw9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDB4ODApOworICAgIHZhbHVlID4+PSA3OworICAgICp0YXJnZXQgPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2YWx1ZSk7CisgICAgKyt0YXJnZXQ7CisgIH0gd2hpbGUgKHZhbHVlID49IDB4ODApOworICByZXR1cm4gdGFyZ2V0OworfQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmYzk5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmgKQEAgLTAsMCArMSwxNzk5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBDb2RlZElucHV0U3RyZWFtIGFuZCBDb2RlZE91dHB1dFN0cmVhbSBjbGFzc2VzLAorLy8gd2hpY2ggd3JhcCBhIFplcm9Db3B5SW5wdXRTdHJlYW0gb3IgWmVyb0NvcHlPdXRwdXRTdHJlYW0sIHJlc3BlY3RpdmVseSwKKy8vIGFuZCBhbGxvdyB5b3UgdG8gcmVhZCBvciB3cml0ZSBpbmRpdmlkdWFsIHBpZWNlcyBvZiBkYXRhIGluIHZhcmlvdXMKKy8vIGZvcm1hdHMuICBJbiBwYXJ0aWN1bGFyLCB0aGVzZSBpbXBsZW1lbnQgdGhlIHZhcmludCBlbmNvZGluZyBmb3IKKy8vIGludGVnZXJzLCBhIHNpbXBsZSB2YXJpYWJsZS1sZW5ndGggZW5jb2RpbmcgaW4gd2hpY2ggc21hbGxlciBudW1iZXJzCisvLyB0YWtlIGZld2VyIGJ5dGVzLgorLy8KKy8vIFR5cGljYWxseSB0aGVzZSBjbGFzc2VzIHdpbGwgb25seSBiZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIHByb3RvY29sCisvLyBidWZmZXIgbGlicmFyeSBpbiBvcmRlciB0byBlbmNvZGUgYW5kIGRlY29kZSBwcm90b2NvbCBidWZmZXJzLiAgQ2xpZW50cworLy8gb2YgdGhlIGxpYnJhcnkgb25seSBuZWVkIHRvIGtub3cgYWJvdXQgdGhpcyBjbGFzcyBpZiB0aGV5IHdpc2ggdG8gd3JpdGUKKy8vIGN1c3RvbSBtZXNzYWdlIHBhcnNpbmcgb3Igc2VyaWFsaXphdGlvbiBwcm9jZWR1cmVzLgorLy8KKy8vIENvZGVkT3V0cHV0U3RyZWFtIGV4YW1wbGU6CisvLyAgIC8vIFdyaXRlIHNvbWUgZGF0YSB0byAibXlmaWxlIi4gIEZpcnN0IHdlIHdyaXRlIGEgNC1ieXRlICJtYWdpYyBudW1iZXIiCisvLyAgIC8vIHRvIGlkZW50aWZ5IHRoZSBmaWxlIHR5cGUsIHRoZW4gd3JpdGUgYSBsZW5ndGgtZGVsaW1pdGVkIHN0cmluZy4gIFRoZQorLy8gICAvLyBzdHJpbmcgaXMgY29tcG9zZWQgb2YgYSB2YXJpbnQgZ2l2aW5nIHRoZSBsZW5ndGggZm9sbG93ZWQgYnkgdGhlIHJhdworLy8gICAvLyBieXRlcy4KKy8vICAgaW50IGZkID0gb3BlbigibXlmaWxlIiwgT19DUkVBVCB8IE9fV1JPTkxZKTsKKy8vICAgWmVyb0NvcHlPdXRwdXRTdHJlYW0qIHJhd19vdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmZCk7CisvLyAgIENvZGVkT3V0cHV0U3RyZWFtKiBjb2RlZF9vdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0ocmF3X291dHB1dCk7CisvLworLy8gICBpbnQgbWFnaWNfbnVtYmVyID0gMTIzNDsKKy8vICAgY2hhciB0ZXh0W10gPSAiSGVsbG8gd29ybGQhIjsKKy8vICAgY29kZWRfb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjMyKG1hZ2ljX251bWJlcik7CisvLyAgIGNvZGVkX291dHB1dC0+V3JpdGVWYXJpbnQzMihzdHJsZW4odGV4dCkpOworLy8gICBjb2RlZF9vdXRwdXQtPldyaXRlUmF3KHRleHQsIHN0cmxlbih0ZXh0KSk7CisvLworLy8gICBkZWxldGUgY29kZWRfb3V0cHV0OworLy8gICBkZWxldGUgcmF3X291dHB1dDsKKy8vICAgY2xvc2UoZmQpOworLy8KKy8vIENvZGVkSW5wdXRTdHJlYW0gZXhhbXBsZToKKy8vICAgLy8gUmVhZCBhIGZpbGUgY3JlYXRlZCBieSB0aGUgYWJvdmUgY29kZS4KKy8vICAgaW50IGZkID0gb3BlbigibXlmaWxlIiwgT19SRE9OTFkpOworLy8gICBaZXJvQ29weUlucHV0U3RyZWFtKiByYXdfaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZkKTsKKy8vICAgQ29kZWRJbnB1dFN0cmVhbSogY29kZWRfaW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShyYXdfaW5wdXQpOworLy8KKy8vICAgY29kZWRfaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW4zMigmbWFnaWNfbnVtYmVyKTsKKy8vICAgaWYgKG1hZ2ljX251bWJlciAhPSAxMjM0KSB7CisvLyAgICAgY2VyciA8PCAiRmlsZSBub3QgaW4gZXhwZWN0ZWQgZm9ybWF0LiIgPDwgZW5kbDsKKy8vICAgICByZXR1cm47CisvLyAgIH0KKy8vCisvLyAgIHVpbnQzMl90IHNpemU7CisvLyAgIGNvZGVkX2lucHV0LT5SZWFkVmFyaW50MzIoJnNpemUpOworLy8KKy8vICAgY2hhciogdGV4dCA9IG5ldyBjaGFyW3NpemUgKyAxXTsKKy8vICAgY29kZWRfaW5wdXQtPlJlYWRSYXcoYnVmZmVyLCBzaXplKTsKKy8vICAgdGV4dFtzaXplXSA9ICdcMCc7CisvLworLy8gICBkZWxldGUgY29kZWRfaW5wdXQ7CisvLyAgIGRlbGV0ZSByYXdfaW5wdXQ7CisvLyAgIGNsb3NlKGZkKTsKKy8vCisvLyAgIGNvdXQgPDwgIlRleHQgaXM6ICIgPDwgdGV4dCA8PCBlbmRsOworLy8gICBkZWxldGUgW10gdGV4dDsKKy8vCisvLyBGb3IgdGhvc2Ugd2hvIGFyZSBpbnRlcmVzdGVkLCB2YXJpbnQgZW5jb2RpbmcgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorLy8KKy8vIFRoZSBlbmNvZGluZyBvcGVyYXRlcyBvbiB1bnNpZ25lZCBpbnRlZ2VycyBvZiB1cCB0byA2NCBiaXRzIGluIGxlbmd0aC4KKy8vIEVhY2ggYnl0ZSBvZiB0aGUgZW5jb2RlZCB2YWx1ZSBoYXMgdGhlIGZvcm1hdDoKKy8vICogYml0cyAwLTY6IFNldmVuIGJpdHMgb2YgdGhlIG51bWJlciBiZWluZyBlbmNvZGVkLgorLy8gKiBiaXQgNzogWmVybyBpZiB0aGlzIGlzIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIGVuY29kaW5nIChpbiB3aGljaAorLy8gICBjYXNlIGFsbCByZW1haW5pbmcgYml0cyBvZiB0aGUgbnVtYmVyIGFyZSB6ZXJvKSBvciAxIGlmCisvLyAgIG1vcmUgYnl0ZXMgZm9sbG93LgorLy8gVGhlIGZpcnN0IGJ5dGUgY29udGFpbnMgdGhlIGxlYXN0LXNpZ25pZmljYW50IDcgYml0cyBvZiB0aGUgbnVtYmVyLCB0aGUKKy8vIHNlY29uZCBieXRlIChpZiBwcmVzZW50KSBjb250YWlucyB0aGUgbmV4dC1sZWFzdC1zaWduaWZpY2FudCA3IGJpdHMsCisvLyBhbmQgc28gb24uICBTbywgdGhlIGJpbmFyeSBudW1iZXIgMTAxMTAwMDEwMTAxMSB3b3VsZCBiZSBlbmNvZGVkIGluIHR3bworLy8gYnl0ZXMgYXMgIjEwMTAxMDExIDAwMTAxMTAwIi4KKy8vCisvLyBJbiB0aGVvcnksIHZhcmludCBjb3VsZCBiZSB1c2VkIHRvIGVuY29kZSBpbnRlZ2VycyBvZiBhbnkgbGVuZ3RoLgorLy8gSG93ZXZlciwgZm9yIHByYWN0aWNhbGl0eSB3ZSBzZXQgYSBsaW1pdCBhdCA2NCBiaXRzLiAgVGhlIG1heGltdW0gZW5jb2RlZAorLy8gbGVuZ3RoIG9mIGEgbnVtYmVyIGlzIHRodXMgMTAgYnl0ZXMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lPX0NPREVEX1NUUkVBTV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lPX0NPREVEX1NUUkVBTV9IX18KKworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTMwMCAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQorLy8gSWYgTVNWQyBoYXMgIi9SVENjIiBzZXQsIGl0IHdpbGwgY29tcGxhaW4gYWJvdXQgdHJ1bmNhdGluZyBjYXN0cyBhdAorLy8gcnVudGltZS4gIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGludGVudGlvbmFsIHRydW5jYXRpbmcgY2FzdHMuCisjcHJhZ21hIHJ1bnRpbWVfY2hlY2tzKCJjIiwgb2ZmKQorI2VuZGlmCisKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvcG9ydC5oPgorCisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIERlc2NyaXB0b3JQb29sOworY2xhc3MgTWVzc2FnZUZhY3Rvcnk7CitjbGFzcyBaZXJvQ29weUNvZGVkSW5wdXRTdHJlYW07CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit2b2lkIE1hcFRlc3RGb3JjZURldGVybWluaXN0aWMoKTsKK2NsYXNzIEVwc0NvcHlCeXRlU3RyZWFtOworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSBpbyB7CisKKy8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgorY2xhc3MgQ29kZWRJbnB1dFN0cmVhbTsKK2NsYXNzIENvZGVkT3V0cHV0U3RyZWFtOworCisvLyBEZWZpbmVkIGluIG90aGVyIGZpbGVzLgorY2xhc3MgWmVyb0NvcHlJbnB1dFN0cmVhbTsgICAvLyB6ZXJvX2NvcHlfc3RyZWFtLmgKK2NsYXNzIFplcm9Db3B5T3V0cHV0U3RyZWFtOyAgLy8gemVyb19jb3B5X3N0cmVhbS5oCisKKy8vIENsYXNzIHdoaWNoIHJlYWRzIGFuZCBkZWNvZGVzIGJpbmFyeSBkYXRhIHdoaWNoIGlzIGNvbXBvc2VkIG9mIHZhcmludC0KKy8vIGVuY29kZWQgaW50ZWdlcnMgYW5kIGZpeGVkLXdpZHRoIHBpZWNlcy4gIFdyYXBzIGEgWmVyb0NvcHlJbnB1dFN0cmVhbS4KKy8vIE1vc3QgdXNlcnMgd2lsbCBub3QgbmVlZCB0byBkZWFsIHdpdGggQ29kZWRJbnB1dFN0cmVhbS4KKy8vCisvLyBNb3N0IG1ldGhvZHMgb2YgQ29kZWRJbnB1dFN0cmVhbSB0aGF0IHJldHVybiBhIGJvb2wgcmV0dXJuIGZhbHNlIGlmIGFuCisvLyB1bmRlcmx5aW5nIEkvTyBlcnJvciBvY2N1cnMgb3IgaWYgdGhlIGRhdGEgaXMgbWFsZm9ybWVkLiAgT25jZSBzdWNoIGEKKy8vIGZhaWx1cmUgb2NjdXJzLCB0aGUgQ29kZWRJbnB1dFN0cmVhbSBpcyBicm9rZW4gYW5kIGlzIG5vIGxvbmdlciB1c2VmdWwuCisvLyBBZnRlciBhIGZhaWx1cmUsIGNhbGxlcnMgYWxzbyBzaG91bGQgYXNzdW1lIHdyaXRlcyB0byAib3V0IiBhcmdzIG1heSBoYXZlCisvLyBvY2N1cnJlZCwgdGhvdWdoIG5vdGhpbmcgdXNlZnVsIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhvc2Ugd3JpdGVzLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIENvZGVkSW5wdXRTdHJlYW0geworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlIGEgQ29kZWRJbnB1dFN0cmVhbSB0aGF0IHJlYWRzIGZyb20gdGhlIGdpdmVuIFplcm9Db3B5SW5wdXRTdHJlYW0uCisgIGV4cGxpY2l0IENvZGVkSW5wdXRTdHJlYW0oWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpOworCisgIC8vIENyZWF0ZSBhIENvZGVkSW5wdXRTdHJlYW0gdGhhdCByZWFkcyBmcm9tIHRoZSBnaXZlbiBmbGF0IGFycmF5LiAgVGhpcyBpcworICAvLyBmYXN0ZXIgdGhhbiB1c2luZyBhbiBBcnJheUlucHV0U3RyZWFtLiAgUHVzaExpbWl0KHNpemUpIGlzIGltcGxpZWQgYnkKKyAgLy8gdGhpcyBjb25zdHJ1Y3Rvci4KKyAgZXhwbGljaXQgQ29kZWRJbnB1dFN0cmVhbShjb25zdCB1aW50OF90KiBidWZmZXIsIGludCBzaXplKTsKKworICAvLyBEZXN0cm95IHRoZSBDb2RlZElucHV0U3RyZWFtIGFuZCBwb3NpdGlvbiB0aGUgdW5kZXJseWluZworICAvLyBaZXJvQ29weUlucHV0U3RyZWFtIGF0IHRoZSBmaXJzdCB1bnJlYWQgYnl0ZS4gIElmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlCisgIC8vIHJlYWRpbmcgKGNhdXNpbmcgYSBtZXRob2QgdG8gcmV0dXJuIGZhbHNlKSwgdGhlbiB0aGUgZXhhY3QgcG9zaXRpb24gb2YKKyAgLy8gdGhlIGlucHV0IHN0cmVhbSBtYXkgYmUgYW55d2hlcmUgYmV0d2VlbiB0aGUgbGFzdCB2YWx1ZSB0aGF0IHdhcyByZWFkCisgIC8vIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIHN0cmVhbSdzIGJ5dGUgbGltaXQuCisgIH5Db2RlZElucHV0U3RyZWFtKCk7CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBDb2RlZElucHV0U3RyZWFtIHJlYWRzIGZyb20gYSBmbGF0IGFycmF5IGluc3RlYWQgb2YKKyAgLy8gYSBaZXJvQ29weUlucHV0U3RyZWFtLgorICBpbmxpbmUgYm9vbCBJc0ZsYXQoKSBjb25zdDsKKworICAvLyBTa2lwcyBhIG51bWJlciBvZiBieXRlcy4gIFJldHVybnMgZmFsc2UgaWYgYW4gdW5kZXJseWluZyByZWFkIGVycm9yCisgIC8vIG9jY3Vycy4KKyAgaW5saW5lIGJvb2wgU2tpcChpbnQgY291bnQpOworCisgIC8vIFNldHMgKmRhdGEgdG8gcG9pbnQgZGlyZWN0bHkgYXQgdGhlIHVucmVhZCBwYXJ0IG9mIHRoZSBDb2RlZElucHV0U3RyZWFtJ3MKKyAgLy8gdW5kZXJseWluZyBidWZmZXIsIGFuZCAqc2l6ZSB0byB0aGUgc2l6ZSBvZiB0aGF0IGJ1ZmZlciwgYnV0IGRvZXMgbm90CisgIC8vIGFkdmFuY2UgdGhlIHN0cmVhbSdzIGN1cnJlbnQgcG9zaXRpb24uICBUaGlzIHdpbGwgYWx3YXlzIGVpdGhlciBwcm9kdWNlCisgIC8vIGEgbm9uLWVtcHR5IGJ1ZmZlciBvciByZXR1cm4gZmFsc2UuICBJZiB0aGUgY2FsbGVyIGNvbnN1bWVzIGFueSBvZgorICAvLyB0aGlzIGRhdGEsIGl0IHNob3VsZCB0aGVuIGNhbGwgU2tpcCgpIHRvIHNraXAgb3ZlciB0aGUgY29uc3VtZWQgYnl0ZXMuCisgIC8vIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIGV4dGVybmFsIGZhc3QgcGFyc2luZyByb3V0aW5lcyBmb3IKKyAgLy8gdHlwZXMgb2YgZGF0YSBub3QgY292ZXJlZCBieSB0aGUgQ29kZWRJbnB1dFN0cmVhbSBpbnRlcmZhY2UuCisgIGJvb2wgR2V0RGlyZWN0QnVmZmVyUG9pbnRlcihjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKKworICAvLyBMaWtlIEdldERpcmVjdEJ1ZmZlclBvaW50ZXIsIGJ1dCB0aGlzIG1ldGhvZCBpcyBpbmxpbmVkLCBhbmQgZG9lcyBub3QKKyAgLy8gYXR0ZW1wdCB0byBSZWZyZXNoKCkgaWYgdGhlIGJ1ZmZlciBpcyBjdXJyZW50bHkgZW1wdHkuCisgIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKKyAgdm9pZCBHZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lKGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOworCisgIC8vIFJlYWQgcmF3IGJ5dGVzLCBjb3B5aW5nIHRoZW0gaW50byB0aGUgZ2l2ZW4gYnVmZmVyLgorICBib29sIFJlYWRSYXcodm9pZCogYnVmZmVyLCBpbnQgc2l6ZSk7CisKKyAgLy8gTGlrZSBSZWFkUmF3LCBidXQgcmVhZHMgaW50byBhIHN0cmluZy4KKyAgYm9vbCBSZWFkU3RyaW5nKHN0ZDo6c3RyaW5nKiBidWZmZXIsIGludCBzaXplKTsKKworCisgIC8vIFJlYWQgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyLgorICBib29sIFJlYWRMaXR0bGVFbmRpYW4zMih1aW50MzJfdCogdmFsdWUpOworICAvLyBSZWFkIGEgNjQtYml0IGxpdHRsZS1lbmRpYW4gaW50ZWdlci4KKyAgYm9vbCBSZWFkTGl0dGxlRW5kaWFuNjQodWludDY0X3QqIHZhbHVlKTsKKworICAvLyBUaGVzZSBtZXRob2RzIHJlYWQgZnJvbSBhbiBleHRlcm5hbGx5IHByb3ZpZGVkIGJ1ZmZlci4gVGhlIGNhbGxlciBpcworICAvLyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgYnVmZmVyIGhhcyBzdWZmaWNpZW50IHNwYWNlLgorICAvLyBSZWFkIGEgMzItYml0IGxpdHRsZS1lbmRpYW4gaW50ZWdlci4KKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3QqIFJlYWRMaXR0bGVFbmRpYW4zMkZyb21BcnJheShjb25zdCB1aW50OF90KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHZhbHVlKTsKKyAgLy8gUmVhZCBhIDY0LWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIuCisgIHN0YXRpYyBjb25zdCB1aW50OF90KiBSZWFkTGl0dGxlRW5kaWFuNjRGcm9tQXJyYXkoY29uc3QgdWludDhfdCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiB2YWx1ZSk7CisKKyAgLy8gUmVhZCBhbiB1bnNpZ25lZCBpbnRlZ2VyIHdpdGggVmFyaW50IGVuY29kaW5nLCB0cnVuY2F0aW5nIHRvIDMyIGJpdHMuCisgIC8vIFJlYWRpbmcgYSAzMi1iaXQgdmFsdWUgaXMgZXF1aXZhbGVudCB0byByZWFkaW5nIGEgNjQtYml0IG9uZSBhbmQgY2FzdGluZworICAvLyBpdCB0byB1aW50MzJfdCwgYnV0IG1heSBiZSBtb3JlIGVmZmljaWVudC4KKyAgYm9vbCBSZWFkVmFyaW50MzIodWludDMyX3QqIHZhbHVlKTsKKyAgLy8gUmVhZCBhbiB1bnNpZ25lZCBpbnRlZ2VyIHdpdGggVmFyaW50IGVuY29kaW5nLgorICBib29sIFJlYWRWYXJpbnQ2NCh1aW50NjRfdCogdmFsdWUpOworCisgIC8vIFJlYWRzIGEgdmFyaW50IG9mZiB0aGUgd2lyZSBpbnRvIGFuICJpbnQiLiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciByZWFkaW5nCisgIC8vIHNpemVzIG9mZiB0aGUgd2lyZSAoc2l6ZXMgb2Ygc3RyaW5ncywgc3VibWVzc2FnZXMsIGJ5dGVzIGZpZWxkcywgZXRjKS4KKyAgLy8KKyAgLy8gVGhlIHZhbHVlIGZyb20gdGhlIHdpcmUgaXMgaW50ZXJwcmV0ZWQgYXMgdW5zaWduZWQuICBJZiBpdHMgdmFsdWUgZXhjZWVkcworICAvLyB0aGUgcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiBhbiBpbnRlZ2VyIG9uIHRoaXMgcGxhdGZvcm0sIGluc3RlYWQgb2YKKyAgLy8gdHJ1bmNhdGluZyB3ZSByZXR1cm4gZmFsc2UuIFRydW5jYXRpbmcgKGFzIHBlcmZvcm1lZCBieSBSZWFkVmFyaW50MzIoKQorICAvLyBhYm92ZSkgaXMgYW4gYWNjZXB0YWJsZSBhcHByb2FjaCBmb3IgZmllbGRzIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyLCBidXQKKyAgLy8gd2hlbiB3ZSBhcmUgcGFyc2luZyBhIHNpemUgZnJvbSB0aGUgd2lyZSwgdHJ1bmNhdGluZyB0aGUgdmFsdWUgd291bGQgcmVzdWx0CisgIC8vIGluIHVzIG1pc3BhcnNpbmcgdGhlIHBheWxvYWQuCisgIGJvb2wgUmVhZFZhcmludFNpemVBc0ludChpbnQqIHZhbHVlKTsKKworICAvLyBSZWFkIGEgdGFnLiAgVGhpcyBjYWxscyBSZWFkVmFyaW50MzIoKSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LCBvciByZXR1cm5zCisgIC8vIHplcm8gKHdoaWNoIGlzIG5vdCBhIHZhbGlkIHRhZykgaWYgUmVhZFZhcmludDMyKCkgZmFpbHMuICBBbHNvLCBSZWFkVGFnCisgIC8vIChidXQgbm90IFJlYWRUYWdOb0xhc3RUYWcpIHVwZGF0ZXMgdGhlIGxhc3QgdGFnIHZhbHVlLCB3aGljaCBjYW4gYmUgY2hlY2tlZAorICAvLyB3aXRoIExhc3RUYWdXYXMoKS4KKyAgLy8KKyAgLy8gQWx3YXlzIGlubGluZSBiZWNhdXNlIHRoaXMgaXMgb25seSBjYWxsZWQgaW4gb25lIHBsYWNlIHBlciBwYXJzZSBsb29wCisgIC8vIGJ1dCBpdCBpcyBjYWxsZWQgZm9yIGV2ZXJ5IGl0ZXJhdGlvbiBvZiBzYWlkIGxvb3AsIHNvIGl0IHNob3VsZCBiZSBmYXN0LgorICAvLyBHQ0MgZG9lc24ndCB3YW50IHRvIGlubGluZSB0aGlzIGJ5IGRlZmF1bHQuCisgIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdWludDMyX3QgUmVhZFRhZygpIHsKKyAgICByZXR1cm4gbGFzdF90YWdfID0gUmVhZFRhZ05vTGFzdFRhZygpOworICB9CisKKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB1aW50MzJfdCBSZWFkVGFnTm9MYXN0VGFnKCk7CisKKyAgLy8gVGhpcyB1c3VhbGx5IGEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIFJlYWRUYWcoKSB3aGVuIGN1dG9mZiBpcyBhIG1hbmlmZXN0CisgIC8vIGNvbnN0YW50LiAgSXQgZG9lcyBwYXJ0aWN1bGFybHkgd2VsbCBmb3IgY3V0b2ZmID49IDEyNy4gIFRoZSBmaXJzdCBwYXJ0CisgIC8vIG9mIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHRhZyB0aGF0IHdhcyByZWFkLCB0aG91Z2ggaXQgY2FuIGFsc28gYmUgMCBpbgorICAvLyB0aGUgY2FzZXMgd2hlcmUgUmVhZFRhZygpIHdvdWxkIHJldHVybiAwLiAgSWYgdGhlIHNlY29uZCBwYXJ0IGlzIHRydWUKKyAgLy8gdGhlbiB0aGUgdGFnIGlzIGtub3duIHRvIGJlIGluIFswLCBjdXRvZmZdLiAgSWYgbm90LCB0aGUgdGFnIGVpdGhlciBpcworICAvLyBhYm92ZSBjdXRvZmYgb3IgaXMgMC4gIChUaGVyZSdzIGludGVudGlvbmFsIHdpZ2dsZSByb29tIHdoZW4gdGFnIGlzIDAsCisgIC8vIGJlY2F1c2UgdGhhdCBjYW4gYXJpc2UgaW4gc2V2ZXJhbCB3YXlzLCBhbmQgZm9yIGJlc3QgcGVyZm9ybWFuY2Ugd2Ugd2FudAorICAvLyB0byBhdm9pZCBhbiBleHRyYSAiaXMgdGFnID09IDA/IiBjaGVjayBoZXJlLikKKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORQorICBzdGQ6OnBhaXI8dWludDMyX3QsIGJvb2w+IFJlYWRUYWdXaXRoQ3V0b2ZmKHVpbnQzMl90IGN1dG9mZikgeworICAgIHN0ZDo6cGFpcjx1aW50MzJfdCwgYm9vbD4gcmVzdWx0ID0gUmVhZFRhZ1dpdGhDdXRvZmZOb0xhc3RUYWcoY3V0b2ZmKTsKKyAgICBsYXN0X3RhZ18gPSByZXN1bHQuZmlyc3Q7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKKyAgc3RkOjpwYWlyPHVpbnQzMl90LCBib29sPiBSZWFkVGFnV2l0aEN1dG9mZk5vTGFzdFRhZyh1aW50MzJfdCBjdXRvZmYpOworCisgIC8vIFVzdWFsbHkgcmV0dXJucyB0cnVlIGlmIGNhbGxpbmcgUmVhZFZhcmludDMyKCkgbm93IHdvdWxkIHByb2R1Y2UgdGhlIGdpdmVuCisgIC8vIHZhbHVlLiAgV2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlIGlmIFJlYWRWYXJpbnQzMigpIHdvdWxkIG5vdCByZXR1cm4gdGhlCisgIC8vIGdpdmVuIHZhbHVlLiAgSWYgRXhwZWN0VGFnKCkgcmV0dXJucyB0cnVlLCBpdCBhbHNvIGFkdmFuY2VzIHBhc3QKKyAgLy8gdGhlIHZhcmludC4gIEZvciBiZXN0IHBlcmZvcm1hbmNlLCB1c2UgYSBjb21waWxlLXRpbWUgY29uc3RhbnQgYXMgdGhlCisgIC8vIHBhcmFtZXRlci4KKyAgLy8gQWx3YXlzIGlubGluZSBiZWNhdXNlIHRoaXMgY29sbGFwc2VzIHRvIGEgc21hbGwgbnVtYmVyIG9mIGluc3RydWN0aW9ucworICAvLyB3aGVuIGdpdmVuIGEgY29uc3RhbnQgcGFyYW1ldGVyLCBidXQgR0NDIGRvZXNuJ3Qgd2FudCB0byBpbmxpbmUgYnkgZGVmYXVsdC4KKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSBib29sIEV4cGVjdFRhZyh1aW50MzJfdCBleHBlY3RlZCk7CisKKyAgLy8gTGlrZSBhYm92ZSwgZXhjZXB0IHRoaXMgcmVhZHMgZnJvbSB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4gVGhlIGNhbGxlciBpcworICAvLyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byByZWFkIGEgdmFyaW50CisgIC8vIG9mIHRoZSBleHBlY3RlZCBzaXplLiBGb3IgYmVzdCBwZXJmb3JtYW5jZSwgdXNlIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IGFzCisgIC8vIHRoZSBleHBlY3RlZCB0YWcgcGFyYW1ldGVyLgorICAvLworICAvLyBSZXR1cm5zIGEgcG9pbnRlciBiZXlvbmQgdGhlIGV4cGVjdGVkIHRhZyBpZiBpdCB3YXMgZm91bmQsIG9yIE5VTEwgaWYgaXQKKyAgLy8gd2FzIG5vdC4KKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORQorICBzdGF0aWMgY29uc3QgdWludDhfdCogRXhwZWN0VGFnRnJvbUFycmF5KGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleHBlY3RlZCk7CisKKyAgLy8gVXN1YWxseSByZXR1cm5zIHRydWUgaWYgbm8gbW9yZSBieXRlcyBjYW4gYmUgcmVhZC4gIEFsd2F5cyByZXR1cm5zIGZhbHNlCisgIC8vIGlmIG1vcmUgYnl0ZXMgY2FuIGJlIHJlYWQuICBJZiBFeHBlY3RBdEVuZCgpIHJldHVybnMgdHJ1ZSwgYSBzdWJzZXF1ZW50CisgIC8vIGNhbGwgdG8gTGFzdFRhZ1dhcygpIHdpbGwgYWN0IGFzIGlmIFJlYWRUYWcoKSBoYWQgYmVlbiBjYWxsZWQgYW5kIHJldHVybmVkCisgIC8vIHplcm8sIGFuZCBDb25zdW1lZEVudGlyZU1lc3NhZ2UoKSB3aWxsIHJldHVybiB0cnVlLgorICBib29sIEV4cGVjdEF0RW5kKCk7CisKKyAgLy8gSWYgdGhlIGxhc3QgY2FsbCB0byBSZWFkVGFnKCkgb3IgUmVhZFRhZ1dpdGhDdXRvZmYoKSByZXR1cm5lZCB0aGUgZ2l2ZW4KKyAgLy8gdmFsdWUsIHJldHVybnMgdHJ1ZS4gIE90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS4KKyAgLy8gUmVhZFRhZ05vTGFzdFRhZy9SZWFkVGFnV2l0aEN1dG9mZk5vTGFzdFRhZyBkbyBub3QgcHJlc2VydmUgdGhlIGxhc3QKKyAgLy8gcmV0dXJuZWQgdmFsdWUuCisgIC8vCisgIC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgcGFyc2VycyBmb3Igc29tZSB0eXBlcyBvZiBlbWJlZGRlZCBtZXNzYWdlcworICAvLyAod2l0aCBmaWVsZCB0eXBlIFRZUEVfR1JPVVApIGRvbid0IGFjdHVhbGx5IGtub3cgdGhhdCB0aGV5J3ZlIHJlYWNoZWQgdGhlCisgIC8vIGVuZCBvZiBhIG1lc3NhZ2UgdW50aWwgdGhleSBzZWUgYW4gRU5ER1JPVVAgdGFnLCB3aGljaCB3YXMgYWN0dWFsbHkgcGFydAorICAvLyBvZiB0aGUgZW5jbG9zaW5nIG1lc3NhZ2UuICBUaGUgZW5jbG9zaW5nIG1lc3NhZ2Ugd291bGQgbGlrZSB0byBjaGVjayB0aGF0CisgIC8vIHRhZyB0byBtYWtlIHN1cmUgaXQgaGFkIHRoZSByaWdodCBudW1iZXIsIHNvIGl0IGNhbGxzIExhc3RUYWdXYXMoKSBvbgorICAvLyByZXR1cm4gZnJvbSB0aGUgZW1iZWRkZWQgcGFyc2VyIHRvIGNoZWNrLgorICBib29sIExhc3RUYWdXYXModWludDMyX3QgZXhwZWN0ZWQpOworICB2b2lkIFNldExhc3RUYWcodWludDMyX3QgdGFnKSB7IGxhc3RfdGFnXyA9IHRhZzsgfQorCisgIC8vIFdoZW4gcGFyc2luZyBtZXNzYWdlIChidXQgTk9UIGEgZ3JvdXApLCB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZAorICAvLyBpbW1lZGlhdGVseSBhZnRlciBNZXJnZUZyb21Db2RlZFN0cmVhbSgpIHJldHVybnMgKGlmIGl0IHJldHVybnMgdHJ1ZSkKKyAgLy8gdG8gZnVydGhlciB2ZXJpZnkgdGhhdCB0aGUgbWVzc2FnZSBlbmRlZCBpbiBhIGxlZ2l0aW1hdGUgd2F5LiAgRm9yCisgIC8vIGV4YW1wbGUsIHRoaXMgdmVyaWZpZXMgdGhhdCBwYXJzaW5nIGRpZCBub3QgZW5kIG9uIGFuIGVuZC1ncm91cCB0YWcuCisgIC8vIEl0IGFsc28gY2hlY2tzIGZvciBzb21lIGNhc2VzIHdoZXJlLCBkdWUgdG8gb3B0aW1pemF0aW9ucywKKyAgLy8gTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKSBjYW4gaW5jb3JyZWN0bHkgcmV0dXJuIHRydWUuCisgIGJvb2wgQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCk7CisgIHZvaWQgU2V0Q29uc3VtZWQoKSB7IGxlZ2l0aW1hdGVfbWVzc2FnZV9lbmRfID0gdHJ1ZTsgfQorCisgIC8vIExpbWl0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIExpbWl0cyBhcmUgdXNlZCB3aGVuIHBhcnNpbmcgbGVuZ3RoLWRlbGltaXRlZCBlbWJlZGRlZCBtZXNzYWdlcy4KKyAgLy8gQWZ0ZXIgdGhlIG1lc3NhZ2UncyBsZW5ndGggaXMgcmVhZCwgUHVzaExpbWl0KCkgaXMgdXNlZCB0byBwcmV2ZW50CisgIC8vIHRoZSBDb2RlZElucHV0U3RyZWFtIGZyb20gcmVhZGluZyBiZXlvbmQgdGhhdCBsZW5ndGguICBPbmNlIHRoZQorICAvLyBlbWJlZGRlZCBtZXNzYWdlIGhhcyBiZWVuIHBhcnNlZCwgUG9wTGltaXQoKSBpcyBjYWxsZWQgdG8gdW5kbyB0aGUKKyAgLy8gbGltaXQuCisKKyAgLy8gT3BhcXVlIHR5cGUgdXNlZCB3aXRoIFB1c2hMaW1pdCgpIGFuZCBQb3BMaW1pdCgpLiAgRG8gbm90IG1vZGlmeQorICAvLyB2YWx1ZXMgb2YgdGhpcyB0eXBlIHlvdXJzZWxmLiAgVGhlIG9ubHkgcmVhc29uIHRoYXQgdGhpcyBpc24ndCBhCisgIC8vIHN0cnVjdCB3aXRoIHByaXZhdGUgaW50ZXJuYWxzIGlzIGZvciBlZmZpY2llbmN5LgorICB0eXBlZGVmIGludCBMaW1pdDsKKworICAvLyBQbGFjZXMgYSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhlIHN0cmVhbSBtYXkgcmVhZCwKKyAgLy8gc3RhcnRpbmcgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4gIE9uY2UgdGhlIHN0cmVhbSBoaXRzIHRoaXMgbGltaXQsCisgIC8vIGl0IHdpbGwgYWN0IGxpa2UgdGhlIGVuZCBvZiB0aGUgaW5wdXQgaGFzIGJlZW4gcmVhY2hlZCB1bnRpbCBQb3BMaW1pdCgpCisgIC8vIGlzIGNhbGxlZC4KKyAgLy8KKyAgLy8gQXMgdGhlIG5hbWVzIGltcGx5LCB0aGUgc3RyZWFtIGNvbmNlcHR1YWxseSBoYXMgYSBzdGFjayBvZiBsaW1pdHMuICBUaGUKKyAgLy8gc2hvcnRlc3QgbGltaXQgb24gdGhlIHN0YWNrIGlzIGFsd2F5cyBlbmZvcmNlZCwgZXZlbiBpZiBpdCBpcyBub3QgdGhlCisgIC8vIHRvcCBsaW1pdC4KKyAgLy8KKyAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGJ5IFB1c2hMaW1pdCgpIGlzIG9wYXF1ZSB0byB0aGUgY2FsbGVyLCBhbmQgbXVzdAorICAvLyBiZSBwYXNzZWQgdW5jaGFuZ2VkIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNhbGwgdG8gUG9wTGltaXQoKS4KKyAgTGltaXQgUHVzaExpbWl0KGludCBieXRlX2xpbWl0KTsKKworICAvLyBQb3BzIHRoZSBsYXN0IGxpbWl0IHB1c2hlZCBieSBQdXNoTGltaXQoKS4gIFRoZSBpbnB1dCBtdXN0IGJlIHRoZSB2YWx1ZQorICAvLyByZXR1cm5lZCBieSB0aGF0IGNhbGwgdG8gUHVzaExpbWl0KCkuCisgIHZvaWQgUG9wTGltaXQoTGltaXQgbGltaXQpOworCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IHVudGlsIHRoZSBuZWFyZXN0IGxpbWl0IG9uIHRoZQorICAvLyBzdGFjayBpcyBoaXQsIG9yIC0xIGlmIG5vIGxpbWl0cyBhcmUgaW4gcGxhY2UuCisgIGludCBCeXRlc1VudGlsTGltaXQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIGN1cnJlbnQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICBpbnQgQ3VycmVudFBvc2l0aW9uKCkgY29uc3Q7CisKKyAgLy8gVG90YWwgQnl0ZXMgTGltaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVG8gcHJldmVudCBtYWxpY2lvdXMgdXNlcnMgZnJvbSBzZW5kaW5nIGV4Y2Vzc2l2ZWx5IGxhcmdlIG1lc3NhZ2VzCisgIC8vIGFuZCBjYXVzaW5nIG1lbW9yeSBleGhhdXN0aW9uLCBDb2RlZElucHV0U3RyZWFtIGltcG9zZXMgYSBoYXJkIGxpbWl0IG9uCisgIC8vIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgaXQgd2lsbCByZWFkLgorCisgIC8vIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhpcyBDb2RlZElucHV0U3RyZWFtIHdpbGwgcmVhZAorICAvLyBiZWZvcmUgcmVmdXNpbmcgdG8gY29udGludWUuICBUbyBwcmV2ZW50IHNlcnZlcnMgZnJvbSBhbGxvY2F0aW5nIGVub3Jtb3VzCisgIC8vIGFtb3VudHMgb2YgbWVtb3J5IHRvIGhvbGQgcGFyc2VkIG1lc3NhZ2VzLCB0aGUgbWF4aW11bSBtZXNzYWdlIGxlbmd0aAorICAvLyBzaG91bGQgYmUgbGltaXRlZCB0byB0aGUgc2hvcnRlc3QgbGVuZ3RoIHRoYXQgd2lsbCBub3QgaGFybSB1c2FiaWxpdHkuCisgIC8vIFRoZSBkZWZhdWx0IGxpbWl0IGlzIElOVF9NQVggKH4yR0IpIGFuZCBhcHBzIHNob3VsZCBzZXQgc2hvcnRlciBsaW1pdHMKKyAgLy8gaWYgcG9zc2libGUuIEFuIGVycm9yIHdpbGwgYWx3YXlzIGJlIHByaW50ZWQgdG8gc3RkZXJyIGlmIHRoZSBsaW1pdCBpcworICAvLyByZWFjaGVkLgorICAvLworICAvLyBOb3RlOiBzZXR0aW5nIGEgbGltaXQgbGVzcyB0aGFuIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gaXMgaW50ZXJwcmV0ZWQKKyAgLy8gYXMgYSBsaW1pdCBvbiB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgLy8KKyAgLy8gVGhpcyBpcyB1bnJlbGF0ZWQgdG8gUHVzaExpbWl0KCkvUG9wTGltaXQoKS4KKyAgdm9pZCBTZXRUb3RhbEJ5dGVzTGltaXQoaW50IHRvdGFsX2J5dGVzX2xpbWl0KTsKKworICAvLyBUaGUgVG90YWwgQnl0ZXMgTGltaXQgbWludXMgdGhlIEN1cnJlbnQgUG9zaXRpb24sIG9yIC0xIGlmIHRoZSB0b3RhbCBieXRlcworICAvLyBsaW1pdCBpcyBJTlRfTUFYLgorICBpbnQgQnl0ZXNVbnRpbFRvdGFsQnl0ZXNMaW1pdCgpIGNvbnN0OworCisgIC8vIFJlY3Vyc2lvbiBMaW1pdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRvIHByZXZlbnQgY29ycnVwdCBvciBtYWxpY2lvdXMgbWVzc2FnZXMgZnJvbSBjYXVzaW5nIHN0YWNrIG92ZXJmbG93cywKKyAgLy8gd2UgbXVzdCBrZWVwIHRyYWNrIG9mIHRoZSBkZXB0aCBvZiByZWN1cnNpb24gd2hlbiBwYXJzaW5nIGVtYmVkZGVkCisgIC8vIG1lc3NhZ2VzIGFuZCBncm91cHMuICBDb2RlZElucHV0U3RyZWFtIGtlZXBzIHRyYWNrIG9mIHRoaXMgYmVjYXVzZSBpdAorICAvLyBpcyB0aGUgb25seSBvYmplY3QgdGhhdCBpcyBwYXNzZWQgZG93biB0aGUgc3RhY2sgZHVyaW5nIHBhcnNpbmcuCisKKyAgLy8gU2V0cyB0aGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguICBUaGUgZGVmYXVsdCBpcyAxMDAuCisgIHZvaWQgU2V0UmVjdXJzaW9uTGltaXQoaW50IGxpbWl0KTsKKyAgaW50IFJlY3Vyc2lvbkJ1ZGdldCgpIHsgcmV0dXJuIHJlY3Vyc2lvbl9idWRnZXRfOyB9CisKKyAgc3RhdGljIGludCBHZXREZWZhdWx0UmVjdXJzaW9uTGltaXQoKSB7IHJldHVybiBkZWZhdWx0X3JlY3Vyc2lvbl9saW1pdF87IH0KKworICAvLyBJbmNyZW1lbnRzIHRoZSBjdXJyZW50IHJlY3Vyc2lvbiBkZXB0aC4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVwdGggaXMKKyAgLy8gdW5kZXIgdGhlIGxpbWl0LCBmYWxzZSBpZiBpdCBoYXMgZ29uZSBvdmVyLgorICBib29sIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisKKyAgLy8gRGVjcmVtZW50cyB0aGUgcmVjdXJzaW9uIGRlcHRoIGlmIHBvc3NpYmxlLgorICB2b2lkIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisKKyAgLy8gRGVjcmVtZW50cyB0aGUgcmVjdXJzaW9uIGRlcHRoIGJsaW5kbHkuICBUaGlzIGlzIGZhc3RlciB0aGFuCisgIC8vIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkuICBJdCBzaG91bGQgYmUgdXNlZCBvbmx5IGlmIGFsbCBwcmV2aW91cworICAvLyBpbmNyZW1lbnRzIHRvIHJlY3Vyc2lvbiBkZXB0aCB3ZXJlIHN1Y2Nlc3NmdWwuCisgIHZvaWQgVW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKworICAvLyBTaG9ydGhhbmQgZm9yIG1ha2VfcGFpcihQdXNoTGltaXQoYnl0ZV9saW1pdCksIC0tcmVjdXJzaW9uX2J1ZGdldF8pLgorICAvLyBVc2luZyB0aGlzIGNhbiByZWR1Y2UgY29kZSBzaXplIGFuZCBjb21wbGV4aXR5IGluIHNvbWUgY2FzZXMuICBUaGUgY2FsbGVyCisgIC8vIGlzIGV4cGVjdGVkIHRvIGNoZWNrIHRoYXQgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSByZXN1bHQgaXMgbm9uLW5lZ2F0aXZlICh0bworICAvLyBiYWlsIG91dCBpZiB0aGUgZGVwdGggb2YgcmVjdXJzaW9uIGlzIHRvbyBoaWdoKSBhbmQsIGlmIGFsbCBpcyB3ZWxsLCB0bworICAvLyBsYXRlciBwYXNzIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSByZXN1bHQgdG8gUG9wTGltaXQoKSBvciBzaW1pbGFyLgorICBzdGQ6OnBhaXI8Q29kZWRJbnB1dFN0cmVhbTo6TGltaXQsIGludD4gSW5jcmVtZW50UmVjdXJzaW9uRGVwdGhBbmRQdXNoTGltaXQoCisgICAgICBpbnQgYnl0ZV9saW1pdCk7CisKKyAgLy8gU2hvcnRoYW5kIGZvciBQdXNoTGltaXQoUmVhZFZhcmludDMyKCZsZW5ndGgpID8gbGVuZ3RoIDogMCkuCisgIExpbWl0IFJlYWRMZW5ndGhBbmRQdXNoTGltaXQoKTsKKworICAvLyBIZWxwZXIgdGhhdCBpcyBlcXVpdmFsZW50IHRvOiB7CisgIC8vICBib29sIHJlc3VsdCA9IENvbnN1bWVkRW50aXJlTWVzc2FnZSgpOworICAvLyAgUG9wTGltaXQobGltaXQpOworICAvLyAgVW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgLy8gIHJldHVybiByZXN1bHQ7IH0KKyAgLy8gVXNpbmcgdGhpcyBjYW4gcmVkdWNlIGNvZGUgc2l6ZSBhbmQgY29tcGxleGl0eSBpbiBzb21lIGNhc2VzLgorICAvLyBEbyBub3QgdXNlIHVubGVzcyB0aGUgY3VycmVudCByZWN1cnNpb24gZGVwdGggaXMgZ3JlYXRlciB0aGFuIHplcm8uCisgIGJvb2wgRGVjcmVtZW50UmVjdXJzaW9uRGVwdGhBbmRQb3BMaW1pdChMaW1pdCBsaW1pdCk7CisKKyAgLy8gSGVscGVyIHRoYXQgaXMgZXF1aXZhbGVudCB0bzogeworICAvLyAgYm9vbCByZXN1bHQgPSBDb25zdW1lZEVudGlyZU1lc3NhZ2UoKTsKKyAgLy8gIFBvcExpbWl0KGxpbWl0KTsKKyAgLy8gIHJldHVybiByZXN1bHQ7IH0KKyAgLy8gVXNpbmcgdGhpcyBjYW4gcmVkdWNlIGNvZGUgc2l6ZSBhbmQgY29tcGxleGl0eSBpbiBzb21lIGNhc2VzLgorICBib29sIENoZWNrRW50aXJlTWVzc2FnZUNvbnN1bWVkQW5kUG9wTGltaXQoTGltaXQgbGltaXQpOworCisgIC8vIEV4dGVuc2lvbiBSZWdpc3RyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEFEVkFOQ0VEIFVTQUdFOiAgOTkuOSUgb2YgcGVvcGxlIGNhbiBpZ25vcmUgdGhpcyBzZWN0aW9uLgorICAvLworICAvLyBCeSBkZWZhdWx0LCB3aGVuIHBhcnNpbmcgZXh0ZW5zaW9ucywgdGhlIHBhcnNlciBsb29rcyBmb3IgZXh0ZW5zaW9uCisgIC8vIGRlZmluaXRpb25zIGluIHRoZSBwb29sIHdoaWNoIG93bnMgdGhlIG91dGVyIG1lc3NhZ2UncyBEZXNjcmlwdG9yLgorICAvLyBIb3dldmVyLCB5b3UgbWF5IGNhbGwgU2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSB0byBwcm92aWRlIGFuIGFsdGVybmF0aXZlCisgIC8vIHBvb2wgaW5zdGVhZC4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUsIGZvciBleGFtcGxlLCB0byBwYXJzZSBhIG1lc3NhZ2UKKyAgLy8gdXNpbmcgYSBnZW5lcmF0ZWQgY2xhc3MsIGJ1dCByZXByZXNlbnQgc29tZSBleHRlbnNpb25zIHVzaW5nCisgIC8vIER5bmFtaWNNZXNzYWdlLgorCisgIC8vIFNldCB0aGUgcG9vbCB1c2VkIHRvIGxvb2sgdXAgZXh0ZW5zaW9ucy4gIE1vc3QgdXNlcnMgZG8gbm90IG5lZWQgdG8gY2FsbAorICAvLyB0aGlzIGFzIHRoZSBjb3JyZWN0IHBvb2wgd2lsbCBiZSBjaG9zZW4gYXV0b21hdGljYWxseS4KKyAgLy8KKyAgLy8gV0FSTklORzogIEl0IGlzIHZlcnkgZWFzeSB0byBtaXN1c2UgdGhpcy4gIENhcmVmdWxseSByZWFkIHRoZSByZXF1aXJlbWVudHMKKyAgLy8gICBiZWxvdy4gIERvIG5vdCB1c2UgdGhpcyB1bmxlc3MgeW91IGFyZSBzdXJlIHlvdSBuZWVkIGl0LiAgQWxtb3N0IG5vIG9uZQorICAvLyAgIGRvZXMuCisgIC8vCisgIC8vIExldCdzIHNheSB5b3UgYXJlIHBhcnNpbmcgYSBtZXNzYWdlIGludG8gbWVzc2FnZSBvYmplY3QgbSwgYW5kIHlvdSB3YW50CisgIC8vIHRvIHRha2UgYWR2YW50YWdlIG9mIFNldEV4dGVuc2lvblJlZ2lzdHJ5KCkuICBZb3UgbXVzdCBmb2xsb3cgdGhlc2UKKyAgLy8gcmVxdWlyZW1lbnRzOgorICAvLworICAvLyBUaGUgZ2l2ZW4gRGVzY3JpcHRvclBvb2wgbXVzdCBjb250YWluIG0tPkdldERlc2NyaXB0b3IoKS4gIEl0IGlzIG5vdAorICAvLyBzdWZmaWNpZW50IGZvciBpdCB0byBzaW1wbHkgY29udGFpbiBhIGRlc2NyaXB0b3IgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZQorICAvLyBhbmQgY29udGVudCAtLSBpdCBtdXN0IGJlIHRoZSAqZXhhY3Qgb2JqZWN0Ki4gIEluIG90aGVyIHdvcmRzOgorICAvLyAgIGFzc2VydChwb29sLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUobS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKSkgPT0KKyAgLy8gICAgICAgICAgbS0+R2V0RGVzY3JpcHRvcigpKTsKKyAgLy8gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHNhdGlzZnkgdGhpcyByZXF1aXJlbWVudDoKKyAgLy8gMSkgVXNlIG0tPkdldERlc2NyaXB0b3IoKS0+cG9vbCgpIGFzIHRoZSBwb29sLiAgVGhpcyBpcyBnZW5lcmFsbHkgdXNlbGVzcworICAvLyAgICBiZWNhdXNlIHRoaXMgaXMgdGhlIHBvb2wgdGhhdCB3b3VsZCBiZSB1c2VkIGFueXdheSBpZiB5b3UgZGlkbid0IGNhbGwKKyAgLy8gICAgU2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSBhdCBhbGwuCisgIC8vIDIpIFVzZSBhIERlc2NyaXB0b3JQb29sIHdoaWNoIGhhcyBtLT5HZXREZXNjcmlwdG9yKCktPnBvb2woKSBhcyBhbgorICAvLyAgICAidW5kZXJsYXkiLiAgUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgRGVzY3JpcHRvclBvb2wgZm9yIG1vcmUKKyAgLy8gICAgaW5mb3JtYXRpb24gYWJvdXQgdW5kZXJsYXlzLgorICAvLworICAvLyBZb3UgbXVzdCBhbHNvIHByb3ZpZGUgYSBNZXNzYWdlRmFjdG9yeS4gIFRoaXMgZmFjdG9yeSB3aWxsIGJlIHVzZWQgdG8KKyAgLy8gY29uc3RydWN0IE1lc3NhZ2Ugb2JqZWN0cyByZXByZXNlbnRpbmcgZXh0ZW5zaW9ucy4gIFRoZSBmYWN0b3J5J3MKKyAgLy8gR2V0UHJvdG90eXBlKCkgTVVTVCByZXR1cm4gbm9uLU5VTEwgZm9yIGFueSBEZXNjcmlwdG9yIHdoaWNoIGNhbiBiZSBmb3VuZAorICAvLyB0aHJvdWdoIHRoZSBwcm92aWRlZCBwb29sLgorICAvLworICAvLyBJZiB0aGUgcHJvdmlkZWQgZmFjdG9yeSBtaWdodCByZXR1cm4gaW5zdGFuY2VzIG9mIHByb3RvY29sLWNvbXBpbGVyLQorICAvLyBnZW5lcmF0ZWQgKGkuZS4gY29tcGlsZWQtaW4pIHR5cGVzLCBvciBpZiB0aGUgb3V0ZXIgbWVzc2FnZSBvYmplY3QgbSBpcworICAvLyBhIGdlbmVyYXRlZCB0eXBlLCB0aGVuIHRoZSBnaXZlbiBmYWN0b3J5IE1VU1QgaGF2ZSB0aGlzIHByb3BlcnR5OiAgSWYKKyAgLy8gR2V0UHJvdG90eXBlKCkgaXMgZ2l2ZW4gYSBEZXNjcmlwdG9yIHdoaWNoIHJlc2lkZXMgaW4KKyAgLy8gRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksIHRoZSBmYWN0b3J5IE1VU1QgcmV0dXJuIHRoZSBzYW1lCisgIC8vIHByb3RvdHlwZSB3aGljaCBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSB3b3VsZCByZXR1cm4uICBUaGF0CisgIC8vIGlzLCBnaXZlbiBhIGRlc2NyaXB0b3IgZm9yIGEgZ2VuZXJhdGVkIHR5cGUsIHRoZSBmYWN0b3J5IG11c3QgcmV0dXJuIGFuCisgIC8vIGluc3RhbmNlIG9mIHRoZSBnZW5lcmF0ZWQgY2xhc3MgKE5PVCBEeW5hbWljTWVzc2FnZSkuICBIb3dldmVyLCB3aGVuCisgIC8vIGdpdmVuIGEgZGVzY3JpcHRvciBmb3IgYSB0eXBlIHRoYXQgaXMgTk9UIGluIGdlbmVyYXRlZF9wb29sLCB0aGUgZmFjdG9yeQorICAvLyBpcyBmcmVlIHRvIHJldHVybiBhbnkgaW1wbGVtZW50YXRpb24uCisgIC8vCisgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgcmVxdWlyZW1lbnQgaXMgdGhhdCBnZW5lcmF0ZWQgc3ViLW9iamVjdHMgbWF5IGJlCisgIC8vIGFjY2Vzc2VkIHZpYSB0aGUgc3RhbmRhcmQgKG5vbi1yZWZsZWN0aW9uKSBleHRlbnNpb24gYWNjZXNzb3IgbWV0aG9kcywKKyAgLy8gYW5kIHRoZXNlIG1ldGhvZHMgd2lsbCBkb3duLWNhc3QgdGhlIG9iamVjdCB0byB0aGUgZ2VuZXJhdGVkIGNsYXNzIHR5cGUuCisgIC8vIElmIHRoZSBvYmplY3QgaXMgbm90IGFjdHVhbGx5IG9mIHRoYXQgdHlwZSwgdGhlIHJlc3VsdHMgd291bGQgYmUgdW5kZWZpbmVkLgorICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgYW4gZXh0ZW5zaW9uIGlzIG5vdCBjb21waWxlZCBpbiwgdGhlbiB0aGVyZSBpcyBubworICAvLyB3YXkgdGhlIGNvZGUgY291bGQgZW5kIHVwIGFjY2Vzc2luZyBpdCB2aWEgdGhlIHN0YW5kYXJkIGFjY2Vzc29ycyAtLSB0aGUKKyAgLy8gb25seSB3YXkgdG8gYWNjZXNzIHRoZSBleHRlbnNpb24gaXMgdmlhIHJlZmxlY3Rpb24uICBXaGVuIHVzaW5nIHJlZmxlY3Rpb24sCisgIC8vIER5bmFtaWNNZXNzYWdlIGFuZCBnZW5lcmF0ZWQgbWVzc2FnZXMgYXJlIGluZGlzdGluZ3Vpc2hhYmxlLCBzbyBpdCdzIGZpbmUKKyAgLy8gaWYgdGhlc2Ugb2JqZWN0cyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgRHluYW1pY01lc3NhZ2UuCisgIC8vCisgIC8vIFVzaW5nIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBvbiB3aGljaCB5b3UgaGF2ZSBjYWxsZWQKKyAgLy8gU2V0RGVsZWdhdGVUb0dlbmVyYXRlZEZhY3RvcnkodHJ1ZSkgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8gc2F0aXNmeSB0aGUKKyAgLy8gYWJvdmUgcmVxdWlyZW1lbnQuCisgIC8vCisgIC8vIElmIGVpdGhlciBwb29sIG9yIGZhY3RvcnkgaXMgTlVMTCwgYm90aCBtdXN0IGJlIE5VTEwuCisgIC8vCisgIC8vIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgaWdub3JlZCB3aGVuIHBhcnNpbmcgImxpdGUiIG1lc3NhZ2VzIGFzIHRoZXkgZG8KKyAgLy8gbm90IGhhdmUgZGVzY3JpcHRvcnMuCisgIHZvaWQgU2V0RXh0ZW5zaW9uUmVnaXN0cnkoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpOworCisgIC8vIEdldCB0aGUgRGVzY3JpcHRvclBvb2wgc2V0IHZpYSBTZXRFeHRlbnNpb25SZWdpc3RyeSgpLCBvciBOVUxMIGlmIG5vIHBvb2wKKyAgLy8gaGFzIGJlZW4gcHJvdmlkZWQuCisgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBHZXRFeHRlbnNpb25Qb29sKCk7CisKKyAgLy8gR2V0IHRoZSBNZXNzYWdlRmFjdG9yeSBzZXQgdmlhIFNldEV4dGVuc2lvblJlZ2lzdHJ5KCksIG9yIE5VTEwgaWYgbm8KKyAgLy8gZmFjdG9yeSBoYXMgYmVlbiBwcm92aWRlZC4KKyAgTWVzc2FnZUZhY3RvcnkqIEdldEV4dGVuc2lvbkZhY3RvcnkoKTsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb2RlZElucHV0U3RyZWFtKTsKKworICBjb25zdCB1aW50OF90KiBidWZmZXJfOworICBjb25zdCB1aW50OF90KiBidWZmZXJfZW5kXzsgIC8vIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICBaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dF87CisgIGludCB0b3RhbF9ieXRlc19yZWFkXzsgIC8vIHRvdGFsIGJ5dGVzIHJlYWQgZnJvbSBpbnB1dF8sIGluY2x1ZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBidWZmZXIKKworICAvLyBJZiB0b3RhbF9ieXRlc19yZWFkXyBzdXJwYXNzZXMgSU5UX01BWCwgd2UgcmVjb3JkIHRoZSBleHRyYSBieXRlcyBoZXJlCisgIC8vIHNvIHRoYXQgd2UgY2FuIEJhY2tVcCgpIG9uIGRlc3RydWN0aW9uLgorICBpbnQgb3ZlcmZsb3dfYnl0ZXNfOworCisgIC8vIExhc3RUYWdXYXMoKSBzdHVmZi4KKyAgdWludDMyX3QgbGFzdF90YWdfOyAgLy8gcmVzdWx0IG9mIGxhc3QgUmVhZFRhZygpIG9yIFJlYWRUYWdXaXRoQ3V0b2ZmKCkuCisKKyAgLy8gVGhpcyBpcyBzZXQgdHJ1ZSBieSBSZWFkVGFne0ZhbGxiYWNrL1Nsb3d9KCkgaWYgaXQgaXMgY2FsbGVkIHdoZW4gZXhhY3RseQorICAvLyBhdCBFT0YsIG9yIGJ5IEV4cGVjdEF0RW5kKCkgd2hlbiBpdCByZXR1cm5zIHRydWUuICBUaGlzIGhhcHBlbnMgd2hlbiB3ZQorICAvLyByZWFjaCB0aGUgZW5kIG9mIGEgbWVzc2FnZSBhbmQgYXR0ZW1wdCB0byByZWFkIGFub3RoZXIgdGFnLgorICBib29sIGxlZ2l0aW1hdGVfbWVzc2FnZV9lbmRfOworCisgIC8vIFNlZSBFbmFibGVBbGlhc2luZygpLgorICBib29sIGFsaWFzaW5nX2VuYWJsZWRfOworCisgIC8vIExpbWl0cworICBMaW1pdCBjdXJyZW50X2xpbWl0XzsgIC8vIGlmIHBvc2l0aW9uID0gLTEsIG5vIGxpbWl0IGlzIGFwcGxpZWQKKworICAvLyBGb3Igc2ltcGxpY2l0eSwgaWYgdGhlIGN1cnJlbnQgYnVmZmVyIGNyb3NzZXMgYSBsaW1pdCAoZWl0aGVyIGEgbm9ybWFsCisgIC8vIGxpbWl0IGNyZWF0ZWQgYnkgUHVzaExpbWl0KCkgb3IgdGhlIHRvdGFsIGJ5dGVzIGxpbWl0KSwgYnVmZmVyX3NpemVfCisgIC8vIG9ubHkgdHJhY2tzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYmVmb3JlIHRoYXQgbGltaXQuICBUaGlzIGZpZWxkCisgIC8vIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWZ0ZXIgaXQuICBOb3RlIHRoYXQgdGhpcyBpbXBsaWVzIHRoYXQgaWYKKyAgLy8gYnVmZmVyX3NpemVfID09IDAgYW5kIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XyA+IDAsIHdlIGtub3cgd2UndmUKKyAgLy8gaGl0IGEgbGltaXQuICBIb3dldmVyLCBpZiBib3RoIGFyZSB6ZXJvLCBpdCBkb2Vzbid0IG5lY2Vzc2FyaWx5IG1lYW4KKyAgLy8gd2UgYXJlbid0IGF0IGEgbGltaXQgLS0gdGhlIGJ1ZmZlciBtYXkgaGF2ZSBlbmRlZCBleGFjdGx5IGF0IHRoZSBsaW1pdC4KKyAgaW50IGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XzsKKworICAvLyBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkLCBwZXJpb2QuICBUaGlzIGlzIHVucmVsYXRlZCB0bworICAvLyBjdXJyZW50X2xpbWl0Xy4gIFNldCB1c2luZyBTZXRUb3RhbEJ5dGVzTGltaXQoKS4KKyAgaW50IHRvdGFsX2J5dGVzX2xpbWl0XzsKKworICAvLyBDdXJyZW50IHJlY3Vyc2lvbiBidWRnZXQsIGNvbnRyb2xsZWQgYnkgSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSBhbmQKKyAgLy8gc2ltaWxhci4gIFN0YXJ0cyBhdCByZWN1cnNpb25fbGltaXRfIGFuZCBnb2VzIGRvd246IGlmIHRoaXMgcmVhY2hlcworICAvLyAtMSB3ZSBhcmUgb3ZlciBidWRnZXQuCisgIGludCByZWN1cnNpb25fYnVkZ2V0XzsKKyAgLy8gUmVjdXJzaW9uIGRlcHRoIGxpbWl0LCBzZXQgYnkgU2V0UmVjdXJzaW9uTGltaXQoKS4KKyAgaW50IHJlY3Vyc2lvbl9saW1pdF87CisKKyAgLy8gU2VlIFNldEV4dGVuc2lvblJlZ2lzdHJ5KCkuCisgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBleHRlbnNpb25fcG9vbF87CisgIE1lc3NhZ2VGYWN0b3J5KiBleHRlbnNpb25fZmFjdG9yeV87CisKKyAgLy8gUHJpdmF0ZSBtZW1iZXIgZnVuY3Rpb25zLgorCisgIC8vIEZhbGxiYWNrIHdoZW4gU2tpcCgpIGdvZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAgYm9vbCBTa2lwRmFsbGJhY2soaW50IGNvdW50LCBpbnQgb3JpZ2luYWxfYnVmZmVyX3NpemUpOworCisgIC8vIEFkdmFuY2UgdGhlIGJ1ZmZlciBieSBhIGdpdmVuIG51bWJlciBvZiBieXRlcy4KKyAgdm9pZCBBZHZhbmNlKGludCBhbW91bnQpOworCisgIC8vIEJhY2sgdXAgaW5wdXRfIHRvIHRoZSBjdXJyZW50IGJ1ZmZlciBwb3NpdGlvbi4KKyAgdm9pZCBCYWNrVXBJbnB1dFRvQ3VycmVudFBvc2l0aW9uKCk7CisKKyAgLy8gUmVjb21wdXRlcyB0aGUgdmFsdWUgb2YgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfLiAgTXVzdCBiZSBjYWxsZWQgYWZ0ZXIKKyAgLy8gY3VycmVudF9saW1pdF8gb3IgdG90YWxfYnl0ZXNfbGltaXRfIGNoYW5nZXMuCisgIHZvaWQgUmVjb21wdXRlQnVmZmVyTGltaXRzKCk7CisKKyAgLy8gV3JpdGVzIGFuIGVycm9yIG1lc3NhZ2Ugc2F5aW5nIHRoYXQgd2UgaGl0IHRvdGFsX2J5dGVzX2xpbWl0Xy4KKyAgdm9pZCBQcmludFRvdGFsQnl0ZXNMaW1pdEVycm9yKCk7CisKKyAgLy8gQ2FsbGVkIHdoZW4gdGhlIGJ1ZmZlciBydW5zIG91dCB0byByZXF1ZXN0IG1vcmUgZGF0YS4gIEltcGxpZXMgYW4KKyAgLy8gQWR2YW5jZShCdWZmZXJTaXplKCkpLgorICBib29sIFJlZnJlc2goKTsKKworICAvLyBXaGVuIHBhcnNpbmcgdmFyaW50cywgd2Ugb3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBzbWFsbCB2YWx1ZXMsIGFuZAorICAvLyB0aGVuIG9wdGltaXplIGZvciB0aGUgY2FzZSB3aGVuIHRoZSB2YXJpbnQgZml0cyB3aXRoaW4gdGhlIGN1cnJlbnQgYnVmZmVyCisgIC8vIHBpZWNlLiBUaGUgRmFsbGJhY2sgbWV0aG9kIGlzIHVzZWQgd2hlbiB3ZSBjYW4ndCB1c2UgdGhlIG9uZS1ieXRlCisgIC8vIG9wdGltaXphdGlvbi4gVGhlIFNsb3cgbWV0aG9kIGlzIHlldCBhbm90aGVyIGZhbGxiYWNrIHdoZW4gdGhlIGJ1ZmZlciBpcworICAvLyBub3QgbGFyZ2UgZW5vdWdoLiBNYWtpbmcgdGhlIHNsb3cgcGF0aCBvdXQtb2YtbGluZSBzcGVlZHMgdXAgdGhlIGNvbW1vbgorICAvLyBjYXNlIGJ5IDEwLTE1JS4gVGhlIHNsb3cgcGF0aCBpcyBmYWlybHkgdW5jb21tb246IGl0IG9ubHkgdHJpZ2dlcnMgd2hlbiBhCisgIC8vIG1lc3NhZ2UgY3Jvc3NlcyBtdWx0aXBsZSBidWZmZXJzLiAgTm90ZTogUmVhZFZhcmludDMyRmFsbGJhY2soKSBhbmQKKyAgLy8gUmVhZFZhcmludDY0RmFsbGJhY2soKSBhcmUgY2FsbGVkIGZyZXF1ZW50bHkgYW5kIGdlbmVyYWxseSBub3QgaW5saW5lZCwgc28KKyAgLy8gdGhleSBoYXZlIGJlZW4gb3B0aW1pemVkIHRvIGF2b2lkICJvdXQiIHBhcmFtZXRlcnMuICBUaGUgZm9ybWVyIHJldHVybnMgLTEKKyAgLy8gaWYgaXQgZmFpbHMgYW5kIHRoZSB1aW50MzJfdCBpdCByZWFkIG90aGVyd2lzZS4gIFRoZSBsYXR0ZXIgaGFzIGEgYm9vbAorICAvLyBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBhcyBwYXJ0IG9mIGl0cyByZXR1cm4gdHlwZS4KKyAgaW50NjRfdCBSZWFkVmFyaW50MzJGYWxsYmFjayh1aW50MzJfdCBmaXJzdF9ieXRlX29yX3plcm8pOworICBpbnQgUmVhZFZhcmludFNpemVBc0ludEZhbGxiYWNrKCk7CisgIHN0ZDo6cGFpcjx1aW50NjRfdCwgYm9vbD4gUmVhZFZhcmludDY0RmFsbGJhY2soKTsKKyAgYm9vbCBSZWFkVmFyaW50MzJTbG93KHVpbnQzMl90KiB2YWx1ZSk7CisgIGJvb2wgUmVhZFZhcmludDY0U2xvdyh1aW50NjRfdCogdmFsdWUpOworICBpbnQgUmVhZFZhcmludFNpemVBc0ludFNsb3coKTsKKyAgYm9vbCBSZWFkTGl0dGxlRW5kaWFuMzJGYWxsYmFjayh1aW50MzJfdCogdmFsdWUpOworICBib29sIFJlYWRMaXR0bGVFbmRpYW42NEZhbGxiYWNrKHVpbnQ2NF90KiB2YWx1ZSk7CisKKyAgLy8gRmFsbGJhY2svc2xvdyBtZXRob2RzIGZvciByZWFkaW5nIHRhZ3MuIFRoZXNlIGRvIG5vdCB1cGRhdGUgbGFzdF90YWdfLAorICAvLyBidXQgd2lsbCBzZXQgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF8gaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0CisgIC8vIHN0cmVhbS4KKyAgdWludDMyX3QgUmVhZFRhZ0ZhbGxiYWNrKHVpbnQzMl90IGZpcnN0X2J5dGVfb3JfemVybyk7CisgIHVpbnQzMl90IFJlYWRUYWdTbG93KCk7CisgIGJvb2wgUmVhZFN0cmluZ0ZhbGxiYWNrKHN0ZDo6c3RyaW5nKiBidWZmZXIsIGludCBzaXplKTsKKworICAvLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAgaW50IEJ1ZmZlclNpemUoKSBjb25zdDsKKworICBzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0VG90YWxCeXRlc0xpbWl0ID0gSU5UX01BWDsKKworICBzdGF0aWMgaW50IGRlZmF1bHRfcmVjdXJzaW9uX2xpbWl0XzsgIC8vIDEwMCBieSBkZWZhdWx0LgorCisgIGZyaWVuZCBjbGFzcyBnb29nbGU6OnByb3RvYnVmOjpaZXJvQ29weUNvZGVkSW5wdXRTdHJlYW07CisgIGZyaWVuZCBjbGFzcyBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXBzQ29weUJ5dGVTdHJlYW07Cit9OworCisvLyBFcHNDb3B5T3V0cHV0U3RyZWFtIHdyYXBzIGEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gYW5kIGV4cG9zZXMgYSBuZXcgc3RyZWFtLAorLy8gd2hpY2ggaGFzIHRoZSBwcm9wZXJ0eSB5b3UgY2FuIHdyaXRlIGtTbG9wQnl0ZXMgKDE2IGJ5dGVzKSBmcm9tIHRoZSBjdXJyZW50CisvLyBwb3NpdGlvbiB3aXRob3V0IGJvdW5kcyBjaGVja3MuIFRoZSBjdXJzb3IgaW50byB0aGUgc3RyZWFtIGlzIG1hbmFnZWQgYnkKKy8vIHRoZSB1c2VyIG9mIHRoZSBjbGFzcyBhbmQgaXMgYW4gZXhwbGljaXQgcGFyYW1ldGVyIGluIHRoZSBtZXRob2RzLiBDYXJlZnVsCisvLyB1c2Ugb2YgdGhpcyBjbGFzcywgaWUuIGtlZXAgcHRyIGEgbG9jYWwgdmFyaWFibGUsIGVsaW1pbmF0ZXMgdGhlIG5lZWQgdG8KKy8vIGZvciB0aGUgY29tcGlsZXIgdG8gc3luYyB0aGUgcHRyIHZhbHVlIGJldHdlZW4gcmVnaXN0ZXIgYW5kIG1lbW9yeS4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBFcHNDb3B5T3V0cHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIGVudW0geyBrU2xvcEJ5dGVzID0gMTYgfTsKKworICAvLyBJbml0aWFsaXplIGZyb20gYSBzdHJlYW0uCisgIEVwc0NvcHlPdXRwdXRTdHJlYW0oWmVyb0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSwgYm9vbCBkZXRlcm1pbmlzdGljLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBwcCkKKyAgICAgIDogZW5kXyhidWZmZXJfKSwKKyAgICAgICAgc3RyZWFtXyhzdHJlYW0pLAorICAgICAgICBpc19zZXJpYWxpemF0aW9uX2RldGVybWluaXN0aWNfKGRldGVybWluaXN0aWMpIHsKKyAgICAqcHAgPSBidWZmZXJfOworICB9CisKKyAgLy8gT25seSBmb3IgYXJyYXkgc2VyaWFsaXphdGlvbi4gTm8gb3ZlcmZsb3cgcHJvdGVjdGlvbiwgZW5kXyB3aWxsIGJlIHRoZQorICAvLyBwb2ludGVkIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LiBXaGVuIHVzaW5nIHRoaXMgdGhlIHRvdGFsIHNpemUgaXMgYWxyZWFkeQorICAvLyBrbm93biwgc28gbm8gbmVlZCB0byBtYWludGFpbiB0aGUgc2xvcCByZWdpb24uCisgIEVwc0NvcHlPdXRwdXRTdHJlYW0odm9pZCogZGF0YSwgaW50IHNpemUsIGJvb2wgZGV0ZXJtaW5pc3RpYykKKyAgICAgIDogZW5kXyhzdGF0aWNfY2FzdDx1aW50OF90Kj4oZGF0YSkgKyBzaXplKSwKKyAgICAgICAgYnVmZmVyX2VuZF8obnVsbHB0ciksCisgICAgICAgIHN0cmVhbV8obnVsbHB0ciksCisgICAgICAgIGlzX3NlcmlhbGl6YXRpb25fZGV0ZXJtaW5pc3RpY18oZGV0ZXJtaW5pc3RpYykge30KKworICAvLyBJbml0aWFsaXplIGZyb20gc3RyZWFtIGJ1dCB3aXRoIHRoZSBmaXJzdCBidWZmZXIgYWxyZWFkeSBnaXZlbiAoZWFnZXIpLgorICBFcHNDb3B5T3V0cHV0U3RyZWFtKHZvaWQqIGRhdGEsIGludCBzaXplLCBaZXJvQ29weU91dHB1dFN0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGV0ZXJtaW5pc3RpYywgdWludDhfdCoqIHBwKQorICAgICAgOiBzdHJlYW1fKHN0cmVhbSksIGlzX3NlcmlhbGl6YXRpb25fZGV0ZXJtaW5pc3RpY18oZGV0ZXJtaW5pc3RpYykgeworICAgICpwcCA9IFNldEluaXRpYWxCdWZmZXIoZGF0YSwgc2l6ZSk7CisgIH0KKworICAvLyBGbHVzaCBldmVyeXRoaW5nIHRoYXQncyB3cml0dGVuIGludG8gdGhlIHVuZGVybHlpbmcgWmVyb0NvcHlPdXRwdXRTdHJlYW0KKyAgLy8gYW5kIHRyaW1zIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSB0byB0aGUgbG9jYXRpb24gb2YgcHRyLgorICB1aW50OF90KiBUcmltKHVpbnQ4X3QqIHB0cik7CisKKyAgLy8gQWZ0ZXIgdGhpcyBpdCdzIGd1YXJhbnRlZWQgeW91IGNhbiBzYWZlbHkgd3JpdGUga1Nsb3BCeXRlcyB0byBwdHIuIFRoaXMKKyAgLy8gd2lsbCBuZXZlciBmYWlsISBUaGUgdW5kZXJseWluZyBzdHJlYW0gY2FuIHByb2R1Y2UgYW4gZXJyb3IuIFVzZSBIYWRFcnJvcgorICAvLyB0byBjaGVjayBmb3IgZXJyb3JzLgorICBQUk9UT0JVRl9OT0RJU0NBUkQgdWludDhfdCogRW5zdXJlU3BhY2UodWludDhfdCogcHRyKSB7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UocHRyID49IGVuZF8pKSB7CisgICAgICByZXR1cm4gRW5zdXJlU3BhY2VGYWxsYmFjayhwdHIpOworICAgIH0KKyAgICByZXR1cm4gcHRyOworICB9CisKKyAgdWludDhfdCogV3JpdGVSYXcoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUsIHVpbnQ4X3QqIHB0cikgeworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKGVuZF8gLSBwdHIgPCBzaXplKSkgeworICAgICAgcmV0dXJuIFdyaXRlUmF3RmFsbGJhY2soZGF0YSwgc2l6ZSwgcHRyKTsKKyAgICB9CisgICAgc3RkOjptZW1jcHkocHRyLCBkYXRhLCBzaXplKTsKKyAgICByZXR1cm4gcHRyICsgc2l6ZTsKKyAgfQorICAvLyBXcml0ZXMgdGhlIGJ1ZmZlciBzcGVjaWZpZWQgYnkgZGF0YSwgc2l6ZSB0byB0aGUgc3RyZWFtLiBQb3NzaWJseSBieQorICAvLyBhbGlhc2luZyB0aGUgYnVmZmVyIChpZS4gbm90IGNvcHlpbmcgdGhlIGRhdGEpLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlCisgIC8vIHRvIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIGlzIGFsaXZlIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlCisgIC8vIFplcm9Db3B5T3V0cHV0U3RyZWFtLgorI2lmbmRlZiBOREVCVUcKKyAgUFJPVE9CVUZfTk9JTkxJTkUKKyNlbmRpZgorICB1aW50OF90KiBXcml0ZVJhd01heWJlQWxpYXNlZChjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwgdWludDhfdCogcHRyKSB7CisgICAgaWYgKGFsaWFzaW5nX2VuYWJsZWRfKSB7CisgICAgICByZXR1cm4gV3JpdGVBbGlhc2VkUmF3KGRhdGEsIHNpemUsIHB0cik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBXcml0ZVJhdyhkYXRhLCBzaXplLCBwdHIpOworICAgIH0KKyAgfQorCisKKyNpZm5kZWYgTkRFQlVHCisgIFBST1RPQlVGX05PSU5MSU5FCisjZW5kaWYKKyAgdWludDhfdCogV3JpdGVTdHJpbmdNYXliZUFsaWFzZWQodWludDMyX3QgbnVtLCBjb25zdCBzdGQ6OnN0cmluZyYgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcHRyKSB7CisgICAgc3RkOjpwdHJkaWZmX3Qgc2l6ZSA9IHMuc2l6ZSgpOworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKAorICAgICAgICAgICAgc2l6ZSA+PSAxMjggfHwgZW5kXyAtIHB0ciArIDE2IC0gVGFnU2l6ZShudW0gPDwgMykgLSAxIDwgc2l6ZSkpIHsKKyAgICAgIHJldHVybiBXcml0ZVN0cmluZ01heWJlQWxpYXNlZE91dGxpbmUobnVtLCBzLCBwdHIpOworICAgIH0KKyAgICBwdHIgPSBVbnNhZmVWYXJpbnQoKG51bSA8PCAzKSB8IDIsIHB0cik7CisgICAgKnB0cisrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oc2l6ZSk7CisgICAgc3RkOjptZW1jcHkocHRyLCBzLmRhdGEoKSwgc2l6ZSk7CisgICAgcmV0dXJuIHB0ciArIHNpemU7CisgIH0KKyAgdWludDhfdCogV3JpdGVCeXRlc01heWJlQWxpYXNlZCh1aW50MzJfdCBudW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHB0cikgeworICAgIHJldHVybiBXcml0ZVN0cmluZ01heWJlQWxpYXNlZChudW0sIHMsIHB0cik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB1aW50OF90KiBXcml0ZVN0cmluZyh1aW50MzJfdCBudW0sIGNvbnN0IFQmIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcHRyKSB7CisgICAgc3RkOjpwdHJkaWZmX3Qgc2l6ZSA9IHMuc2l6ZSgpOworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKAorICAgICAgICAgICAgc2l6ZSA+PSAxMjggfHwgZW5kXyAtIHB0ciArIDE2IC0gVGFnU2l6ZShudW0gPDwgMykgLSAxIDwgc2l6ZSkpIHsKKyAgICAgIHJldHVybiBXcml0ZVN0cmluZ091dGxpbmUobnVtLCBzLCBwdHIpOworICAgIH0KKyAgICBwdHIgPSBVbnNhZmVWYXJpbnQoKG51bSA8PCAzKSB8IDIsIHB0cik7CisgICAgKnB0cisrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oc2l6ZSk7CisgICAgc3RkOjptZW1jcHkocHRyLCBzLmRhdGEoKSwgc2l6ZSk7CisgICAgcmV0dXJuIHB0ciArIHNpemU7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisjaWZuZGVmIE5ERUJVRworICBQUk9UT0JVRl9OT0lOTElORQorI2VuZGlmCisgIHVpbnQ4X3QqIFdyaXRlQnl0ZXModWludDMyX3QgbnVtLCBjb25zdCBUJiBzLCB1aW50OF90KiBwdHIpIHsKKyAgICByZXR1cm4gV3JpdGVTdHJpbmcobnVtLCBzLCBwdHIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdWludDhfdCogV3JpdGVJbnQzMlBhY2tlZChpbnQgbnVtLCBjb25zdCBUJiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIHVpbnQ4X3QqIHB0cikgeworICAgIHJldHVybiBXcml0ZVZhcmludFBhY2tlZChudW0sIHIsIHNpemUsIHB0ciwgRW5jb2RlNjQpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHVpbnQ4X3QqIFdyaXRlVUludDMyUGFja2VkKGludCBudW0sIGNvbnN0IFQmIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIHVpbnQ4X3QqIHB0cikgeworICAgIHJldHVybiBXcml0ZVZhcmludFBhY2tlZChudW0sIHIsIHNpemUsIHB0ciwgRW5jb2RlMzIpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHVpbnQ4X3QqIFdyaXRlU0ludDMyUGFja2VkKGludCBudW0sIGNvbnN0IFQmIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIHVpbnQ4X3QqIHB0cikgeworICAgIHJldHVybiBXcml0ZVZhcmludFBhY2tlZChudW0sIHIsIHNpemUsIHB0ciwgWmlnWmFnRW5jb2RlMzIpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHVpbnQ4X3QqIFdyaXRlSW50NjRQYWNrZWQoaW50IG51bSwgY29uc3QgVCYgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCB1aW50OF90KiBwdHIpIHsKKyAgICByZXR1cm4gV3JpdGVWYXJpbnRQYWNrZWQobnVtLCByLCBzaXplLCBwdHIsIEVuY29kZTY0KTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB1aW50OF90KiBXcml0ZVVJbnQ2NFBhY2tlZChpbnQgbnVtLCBjb25zdCBUJiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCB1aW50OF90KiBwdHIpIHsKKyAgICByZXR1cm4gV3JpdGVWYXJpbnRQYWNrZWQobnVtLCByLCBzaXplLCBwdHIsIEVuY29kZTY0KTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB1aW50OF90KiBXcml0ZVNJbnQ2NFBhY2tlZChpbnQgbnVtLCBjb25zdCBUJiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCB1aW50OF90KiBwdHIpIHsKKyAgICByZXR1cm4gV3JpdGVWYXJpbnRQYWNrZWQobnVtLCByLCBzaXplLCBwdHIsIFppZ1phZ0VuY29kZTY0KTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB1aW50OF90KiBXcml0ZUVudW1QYWNrZWQoaW50IG51bSwgY29uc3QgVCYgciwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHB0cikgeworICAgIHJldHVybiBXcml0ZVZhcmludFBhY2tlZChudW0sIHIsIHNpemUsIHB0ciwgRW5jb2RlNjQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdWludDhfdCogV3JpdGVGaXhlZFBhY2tlZChpbnQgbnVtLCBjb25zdCBUJiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcHRyKSB7CisgICAgcHRyID0gRW5zdXJlU3BhY2UocHRyKTsKKyAgICBjb25zdGV4cHIgYXV0byBlbGVtZW50X3NpemUgPSBzaXplb2YodHlwZW5hbWUgVDo6dmFsdWVfdHlwZSk7CisgICAgYXV0byBzaXplID0gci5zaXplKCkgKiBlbGVtZW50X3NpemU7CisgICAgcHRyID0gV3JpdGVMZW5ndGhEZWxpbShudW0sIHNpemUsIHB0cik7CisgICAgcmV0dXJuIFdyaXRlUmF3TGl0dGxlRW5kaWFuPGVsZW1lbnRfc2l6ZT4oci5kYXRhKCksIHN0YXRpY19jYXN0PGludD4oc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyKTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgYW4gdW5kZXJseWluZyBJL08gZXJyb3Igc2luY2UgdGhpcyBvYmplY3Qgd2FzCisgIC8vIGNyZWF0ZWQuCisgIGJvb2wgSGFkRXJyb3IoKSBjb25zdCB7IHJldHVybiBoYWRfZXJyb3JfOyB9CisKKyAgLy8gSW5zdHJ1Y3RzIHRoZSBFcHNDb3B5T3V0cHV0U3RyZWFtIHRvIGFsbG93IHRoZSB1bmRlcmx5aW5nCisgIC8vIFplcm9Db3B5T3V0cHV0U3RyZWFtIHRvIGhvbGQgcG9pbnRlcnMgdG8gdGhlIG9yaWdpbmFsIHN0cnVjdHVyZSBpbnN0ZWFkIG9mCisgIC8vIGNvcHlpbmcsIGlmIGl0IHN1cHBvcnRzIGl0IChpLmUuIG91dHB1dC0+QWxsb3dzQWxpYXNpbmcoKSBpcyB0cnVlKS4gIElmIHRoZQorICAvLyB1bmRlcmx5aW5nIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IGFsaWFzaW5nLCB0aGVuIGVuYWJsaW5nIGl0IGhhcyBubworICAvLyBhZmZlY3QuICBGb3Igbm93LCB0aGlzIG9ubHkgYWZmZWN0cyB0aGUgYmVoYXZpb3Igb2YKKyAgLy8gV3JpdGVSYXdNYXliZUFsaWFzZWQoKS4KKyAgLy8KKyAgLy8gTk9URTogSXQgaXMgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlIGNodW5rIG9mIG1lbW9yeQorICAvLyByZW1haW5zIGxpdmUgdW50aWwgYWxsIG9mIHRoZSBkYXRhIGhhcyBiZWVuIGNvbnN1bWVkIGZyb20gdGhlIHN0cmVhbS4KKyAgdm9pZCBFbmFibGVBbGlhc2luZyhib29sIGVuYWJsZWQpOworCisgIC8vIFNlZSBkb2N1bWVudGF0aW9uIG9uIENvZGVkT3V0cHV0U3RyZWFtOjpTZXRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYy4KKyAgdm9pZCBTZXRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYyhib29sIHZhbHVlKSB7CisgICAgaXNfc2VyaWFsaXphdGlvbl9kZXRlcm1pbmlzdGljXyA9IHZhbHVlOworICB9CisKKyAgLy8gU2VlIGRvY3VtZW50YXRpb24gb24gQ29kZWRPdXRwdXRTdHJlYW06OklzU2VyaWFsaXphdGlvbkRldGVybWluaXN0aWMuCisgIGJvb2wgSXNTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYygpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNfc2VyaWFsaXphdGlvbl9kZXRlcm1pbmlzdGljXzsKKyAgfQorCisgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUgc3RyZWFtIGF0IHBvc2l0aW9uIHB0ciwgcmVsYXRpdmUgdG8gdGhlCisgIC8vIHN0cmVhbSdzIG92ZXJhbGwgcG9zaXRpb24uCisgIGludDY0X3QgQnl0ZUNvdW50KHVpbnQ4X3QqIHB0cikgY29uc3Q7CisKKworIHByaXZhdGU6CisgIHVpbnQ4X3QqIGVuZF87CisgIHVpbnQ4X3QqIGJ1ZmZlcl9lbmRfID0gYnVmZmVyXzsKKyAgdWludDhfdCBidWZmZXJfWzIgKiBrU2xvcEJ5dGVzXTsKKyAgWmVyb0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbV87CisgIGJvb2wgaGFkX2Vycm9yXyA9IGZhbHNlOworICBib29sIGFsaWFzaW5nX2VuYWJsZWRfID0gZmFsc2U7ICAvLyBTZWUgRW5hYmxlQWxpYXNpbmcoKS4KKyAgYm9vbCBpc19zZXJpYWxpemF0aW9uX2RldGVybWluaXN0aWNfOworICBib29sIHNraXBfY2hlY2tfY29uc2lzdGVuY3kgPSBmYWxzZTsKKworICB1aW50OF90KiBFbnN1cmVTcGFjZUZhbGxiYWNrKHVpbnQ4X3QqIHB0cik7CisgIGlubGluZSB1aW50OF90KiBOZXh0KCk7CisgIGludCBGbHVzaCh1aW50OF90KiBwdHIpOworICBzdGQ6OnB0cmRpZmZfdCBHZXRTaXplKHVpbnQ4X3QqIHB0cikgY29uc3QgeworICAgIEdPT0dMRV9EQ0hFQ0socHRyIDw9IGVuZF8gKyBrU2xvcEJ5dGVzKTsgIC8vIE5PTElOVAorICAgIHJldHVybiBlbmRfICsga1Nsb3BCeXRlcyAtIHB0cjsKKyAgfQorCisgIHVpbnQ4X3QqIEVycm9yKCkgeworICAgIGhhZF9lcnJvcl8gPSB0cnVlOworICAgIC8vIFdlIHVzZSB0aGUgcGF0Y2ggYnVmZmVyIHRvIGFsd2F5cyBndWFyYW50ZWUgc3BhY2UgdG8gd3JpdGUgdG8uCisgICAgZW5kXyA9IGJ1ZmZlcl8gKyBrU2xvcEJ5dGVzOworICAgIHJldHVybiBidWZmZXJfOworICB9CisKKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQgVGFnU2l6ZSh1aW50MzJfdCB0YWcpIHsKKyAgICByZXR1cm4gKHRhZyA8ICgxIDw8IDcpKSAgICA/IDEKKyAgICAgICAgICAgOiAodGFnIDwgKDEgPDwgMTQpKSA/IDIKKyAgICAgICAgICAgOiAodGFnIDwgKDEgPDwgMjEpKSA/IDMKKyAgICAgICAgICAgOiAodGFnIDwgKDEgPDwgMjgpKSA/IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDU7CisgIH0KKworICBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHVpbnQ4X3QqIFdyaXRlVGFnKHVpbnQzMl90IG51bSwgdWludDMyX3Qgd3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcHRyKSB7CisgICAgR09PR0xFX0RDSEVDSyhwdHIgPCBlbmRfKTsgIC8vIE5PTElOVAorICAgIHJldHVybiBVbnNhZmVWYXJpbnQoKG51bSA8PCAzKSB8IHd0LCBwdHIpOworICB9CisKKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB1aW50OF90KiBXcml0ZUxlbmd0aERlbGltKGludCBudW0sIHVpbnQzMl90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwdHIpIHsKKyAgICBwdHIgPSBXcml0ZVRhZyhudW0sIDIsIHB0cik7CisgICAgcmV0dXJuIFVuc2FmZVdyaXRlU2l6ZShzaXplLCBwdHIpOworICB9CisKKyAgdWludDhfdCogV3JpdGVSYXdGYWxsYmFjayhjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwgdWludDhfdCogcHRyKTsKKworICB1aW50OF90KiBXcml0ZUFsaWFzZWRSYXcoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUsIHVpbnQ4X3QqIHB0cik7CisKKyAgdWludDhfdCogV3JpdGVTdHJpbmdNYXliZUFsaWFzZWRPdXRsaW5lKHVpbnQzMl90IG51bSwgY29uc3Qgc3RkOjpzdHJpbmcmIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwdHIpOworICB1aW50OF90KiBXcml0ZVN0cmluZ091dGxpbmUodWludDMyX3QgbnVtLCBjb25zdCBzdGQ6OnN0cmluZyYgcywgdWludDhfdCogcHRyKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRT4KKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB1aW50OF90KiBXcml0ZVZhcmludFBhY2tlZChpbnQgbnVtLCBjb25zdCBUJiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCB1aW50OF90KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRSYgZW5jb2RlKSB7CisgICAgcHRyID0gRW5zdXJlU3BhY2UocHRyKTsKKyAgICBwdHIgPSBXcml0ZUxlbmd0aERlbGltKG51bSwgc2l6ZSwgcHRyKTsKKyAgICBhdXRvIGl0ID0gci5kYXRhKCk7CisgICAgYXV0byBlbmQgPSBpdCArIHIuc2l6ZSgpOworICAgIGRvIHsKKyAgICAgIHB0ciA9IEVuc3VyZVNwYWNlKHB0cik7CisgICAgICBwdHIgPSBVbnNhZmVWYXJpbnQoZW5jb2RlKCppdCsrKSwgcHRyKTsKKyAgICB9IHdoaWxlIChpdCA8IGVuZCk7CisgICAgcmV0dXJuIHB0cjsKKyAgfQorCisgIHN0YXRpYyB1aW50MzJfdCBFbmNvZGUzMih1aW50MzJfdCB2KSB7IHJldHVybiB2OyB9CisgIHN0YXRpYyB1aW50NjRfdCBFbmNvZGU2NCh1aW50NjRfdCB2KSB7IHJldHVybiB2OyB9CisgIHN0YXRpYyB1aW50MzJfdCBaaWdaYWdFbmNvZGUzMihpbnQzMl90IHYpIHsKKyAgICByZXR1cm4gKHN0YXRpY19jYXN0PHVpbnQzMl90Pih2KSA8PCAxKSBeIHN0YXRpY19jYXN0PHVpbnQzMl90Pih2ID4+IDMxKTsKKyAgfQorICBzdGF0aWMgdWludDY0X3QgWmlnWmFnRW5jb2RlNjQoaW50NjRfdCB2KSB7CisgICAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50NjRfdD4odikgPDwgMSkgXiBzdGF0aWNfY2FzdDx1aW50NjRfdD4odiA+PiA2Myk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgUFJPVE9CVUZfQUxXQVlTX0lOTElORSBzdGF0aWMgdWludDhfdCogVW5zYWZlVmFyaW50KFQgdmFsdWUsIHVpbnQ4X3QqIHB0cikgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc191bnNpZ25lZDxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiVmFyaW50IHNlcmlhbGl6YXRpb24gbXVzdCBiZSB1bnNpZ25lZCIpOworICAgIHB0clswXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHZhbHVlKTsKKyAgICBpZiAodmFsdWUgPCAweDgwKSB7CisgICAgICByZXR1cm4gcHRyICsgMTsKKyAgICB9CisgICAgLy8gVHVybiBvbiBjb250aW51YXRpb24gYml0IGluIHRoZSBieXRlIHdlIGp1c3Qgd3JvdGUuCisgICAgcHRyWzBdIHw9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDB4ODApOworICAgIHZhbHVlID4+PSA3OworICAgIHB0clsxXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHZhbHVlKTsKKyAgICBpZiAodmFsdWUgPCAweDgwKSB7CisgICAgICByZXR1cm4gcHRyICsgMjsKKyAgICB9CisgICAgcHRyICs9IDI7CisgICAgZG8geworICAgICAgLy8gVHVybiBvbiBjb250aW51YXRpb24gYml0IGluIHRoZSBieXRlIHdlIGp1c3Qgd3JvdGUuCisgICAgICBwdHJbLTFdIHw9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDB4ODApOworICAgICAgdmFsdWUgPj49IDc7CisgICAgICAqcHRyID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmFsdWUpOworICAgICAgKytwdHI7CisgICAgfSB3aGlsZSAodmFsdWUgPj0gMHg4MCk7CisgICAgcmV0dXJuIHB0cjsKKyAgfQorCisgIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFVuc2FmZVdyaXRlU2l6ZSh1aW50MzJfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHB0cikgeworICAgIHdoaWxlIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKHZhbHVlID49IDB4ODApKSB7CisgICAgICAqcHRyID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmFsdWUgfCAweDgwKTsKKyAgICAgIHZhbHVlID4+PSA3OworICAgICAgKytwdHI7CisgICAgfQorICAgICpwdHIrKyA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHZhbHVlKTsKKyAgICByZXR1cm4gcHRyOworICB9CisKKyAgdGVtcGxhdGUgPGludCBTPgorICB1aW50OF90KiBXcml0ZVJhd0xpdHRsZUVuZGlhbihjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwgdWludDhfdCogcHRyKTsKKyNpZiAhZGVmaW5lZChQUk9UT0JVRl9MSVRUTEVfRU5ESUFOKSB8fCBcCisgICAgZGVmaW5lZChQUk9UT0JVRl9ESVNBQkxFX0xJVFRMRV9FTkRJQU5fT1BUX0ZPUl9URVNUKQorICB1aW50OF90KiBXcml0ZVJhd0xpdHRsZUVuZGlhbjMyKGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLCB1aW50OF90KiBwdHIpOworICB1aW50OF90KiBXcml0ZVJhd0xpdHRsZUVuZGlhbjY0KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLCB1aW50OF90KiBwdHIpOworI2VuZGlmCisKKyAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgZm9yIENvZGVkT3V0cHV0U3RyZWFtLiBJZGVhbGx5IHRoZXkgc2hvdWxkIGJlIHByaXZhdGUKKyAgLy8gYnV0IHRvIG1hdGNoIGN1cnJlbnQgYmVoYXZpb3Igb2YgQ29kZWRPdXRwdXRTdHJlYW0gYXMgY2xvc2UgYXMgcG9zc2libGUKKyAgLy8gd2UgYWxsb3cgaXQgc29tZSBmdW5jdGlvbmFsaXR5LgorIHB1YmxpYzoKKyAgdWludDhfdCogU2V0SW5pdGlhbEJ1ZmZlcih2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgeworICAgIGF1dG8gcHRyID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGRhdGEpOworICAgIGlmIChzaXplID4ga1Nsb3BCeXRlcykgeworICAgICAgZW5kXyA9IHB0ciArIHNpemUgLSBrU2xvcEJ5dGVzOworICAgICAgYnVmZmVyX2VuZF8gPSBudWxscHRyOworICAgICAgcmV0dXJuIHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgZW5kXyA9IGJ1ZmZlcl8gKyBzaXplOworICAgICAgYnVmZmVyX2VuZF8gPSBwdHI7CisgICAgICByZXR1cm4gYnVmZmVyXzsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5lZWRlZCBieSBDb2RlZE91dHB1dFN0cmVhbSBIYWRFcnJvci4gSGFkRXJyb3IgbmVlZHMgdG8gZmx1c2ggdGhlIHBhdGNoCisgIC8vIGJ1ZmZlcnMgdG8gZW5zdXJlIHRoZXJlIGlzIG5vIGVycm9yIGFzIG9mIHlldC4KKyAgdWludDhfdCogRmx1c2hBbmRSZXNldEJ1ZmZlcih1aW50OF90Kik7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWltaWMgdGhlIG9sZCBDb2RlZE91dHB1dFN0cmVhbSBiZWhhdmlvciBhcyBjbG9zZQorICAvLyBhcyBwb3NzaWJsZS4gVGhleSBmbHVzaCB0aGUgY3VycmVudCBzdGF0ZSB0byB0aGUgc3RyZWFtLCBiZWhhdmUgYXMKKyAgLy8gdGhlIG9sZCBDb2RlZE91dHB1dFN0cmVhbSBhbmQgdGhlbiByZXR1cm4gdG8gbm9ybWFsIG9wZXJhdGlvbi4KKyAgYm9vbCBTa2lwKGludCBjb3VudCwgdWludDhfdCoqIHBwKTsKKyAgYm9vbCBHZXREaXJlY3RCdWZmZXJQb2ludGVyKHZvaWQqKiBkYXRhLCBpbnQqIHNpemUsIHVpbnQ4X3QqKiBwcCk7CisgIHVpbnQ4X3QqIEdldERpcmVjdEJ1ZmZlckZvck5CeXRlc0FuZEFkdmFuY2UoaW50IHNpemUsIHVpbnQ4X3QqKiBwcCk7CisKKyAgZnJpZW5kIGNsYXNzIENvZGVkT3V0cHV0U3RyZWFtOworfTsKKwordGVtcGxhdGUgPD4KK2lubGluZSB1aW50OF90KiBFcHNDb3B5T3V0cHV0U3RyZWFtOjpXcml0ZVJhd0xpdHRsZUVuZGlhbjwxPihjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHB0cikgeworICByZXR1cm4gV3JpdGVSYXcoZGF0YSwgc2l6ZSwgcHRyKTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgdWludDhfdCogRXBzQ29weU91dHB1dFN0cmVhbTo6V3JpdGVSYXdMaXR0bGVFbmRpYW48ND4oY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwdHIpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0xJVFRMRV9FTkRJQU4pICYmIFwKKyAgICAhZGVmaW5lZChQUk9UT0JVRl9ESVNBQkxFX0xJVFRMRV9FTkRJQU5fT1BUX0ZPUl9URVNUKQorICByZXR1cm4gV3JpdGVSYXcoZGF0YSwgc2l6ZSwgcHRyKTsKKyNlbHNlCisgIHJldHVybiBXcml0ZVJhd0xpdHRsZUVuZGlhbjMyKGRhdGEsIHNpemUsIHB0cik7CisjZW5kaWYKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgdWludDhfdCogRXBzQ29weU91dHB1dFN0cmVhbTo6V3JpdGVSYXdMaXR0bGVFbmRpYW48OD4oY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwdHIpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0xJVFRMRV9FTkRJQU4pICYmIFwKKyAgICAhZGVmaW5lZChQUk9UT0JVRl9ESVNBQkxFX0xJVFRMRV9FTkRJQU5fT1BUX0ZPUl9URVNUKQorICByZXR1cm4gV3JpdGVSYXcoZGF0YSwgc2l6ZSwgcHRyKTsKKyNlbHNlCisgIHJldHVybiBXcml0ZVJhd0xpdHRsZUVuZGlhbjY0KGRhdGEsIHNpemUsIHB0cik7CisjZW5kaWYKK30KKworLy8gQ2xhc3Mgd2hpY2ggZW5jb2RlcyBhbmQgd3JpdGVzIGJpbmFyeSBkYXRhIHdoaWNoIGlzIGNvbXBvc2VkIG9mIHZhcmludC0KKy8vIGVuY29kZWQgaW50ZWdlcnMgYW5kIGZpeGVkLXdpZHRoIHBpZWNlcy4gIFdyYXBzIGEgWmVyb0NvcHlPdXRwdXRTdHJlYW0uCisvLyBNb3N0IHVzZXJzIHdpbGwgbm90IG5lZWQgdG8gZGVhbCB3aXRoIENvZGVkT3V0cHV0U3RyZWFtLgorLy8KKy8vIE1vc3QgbWV0aG9kcyBvZiBDb2RlZE91dHB1dFN0cmVhbSB3aGljaCByZXR1cm4gYSBib29sIHJldHVybiBmYWxzZSBpZiBhbgorLy8gdW5kZXJseWluZyBJL08gZXJyb3Igb2NjdXJzLiAgT25jZSBzdWNoIGEgZmFpbHVyZSBvY2N1cnMsIHRoZQorLy8gQ29kZWRPdXRwdXRTdHJlYW0gaXMgYnJva2VuIGFuZCBpcyBubyBsb25nZXIgdXNlZnVsLiBUaGUgV3JpdGUqIG1ldGhvZHMgZG8KKy8vIG5vdCByZXR1cm4gdGhlIHN0cmVhbSBzdGF0dXMsIGJ1dCB3aWxsIGludmFsaWRhdGUgdGhlIHN0cmVhbSBpZiBhbiBlcnJvcgorLy8gb2NjdXJzLiBUaGUgY2xpZW50IGNhbiBwcm9iZSBIYWRFcnJvcigpIHRvIGRldGVybWluZSB0aGUgc3RhdHVzLgorLy8KKy8vIE5vdGUgdGhhdCBldmVyeSBtZXRob2Qgb2YgQ29kZWRPdXRwdXRTdHJlYW0gd2hpY2ggd3JpdGVzIHNvbWUgZGF0YSBoYXMKKy8vIGEgY29ycmVzcG9uZGluZyBzdGF0aWMgIlRvQXJyYXkiIHZlcnNpb24uIFRoZXNlIHZlcnNpb25zIHdyaXRlIGRpcmVjdGx5CisvLyB0byB0aGUgcHJvdmlkZWQgYnVmZmVyLCByZXR1cm5pbmcgYSBwb2ludGVyIHBhc3QgdGhlIGxhc3Qgd3JpdHRlbiBieXRlLgorLy8gVGhleSByZXF1aXJlIHRoYXQgdGhlIGJ1ZmZlciBoYXMgc3VmZmljaWVudCBjYXBhY2l0eSBmb3IgdGhlIGVuY29kZWQgZGF0YS4KKy8vIFRoaXMgYWxsb3dzIGFuIG9wdGltaXphdGlvbiB3aGVyZSB3ZSBjaGVjayBpZiBhbiBvdXRwdXQgc3RyZWFtIGhhcyBlbm91Z2gKKy8vIHNwYWNlIGZvciBhbiBlbnRpcmUgbWVzc2FnZSBiZWZvcmUgd2Ugc3RhcnQgd3JpdGluZyBhbmQsIGlmIHRoZXJlIGlzLCB3ZQorLy8gY2FsbCBvbmx5IHRoZSBUb0FycmF5IG1ldGhvZHMgdG8gYXZvaWQgZG9pbmcgYm91bmQgY2hlY2tzIGZvciBlYWNoCisvLyBpbmRpdmlkdWFsIHZhbHVlLgorLy8gaS5lLiwgaW4gdGhlIGV4YW1wbGUgYWJvdmU6CisvLworLy8gICBDb2RlZE91dHB1dFN0cmVhbSogY29kZWRfb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHJhd19vdXRwdXQpOworLy8gICBpbnQgbWFnaWNfbnVtYmVyID0gMTIzNDsKKy8vICAgY2hhciB0ZXh0W10gPSAiSGVsbG8gd29ybGQhIjsKKy8vCisvLyAgIGludCBjb2RlZF9zaXplID0gc2l6ZW9mKG1hZ2ljX251bWJlcikgKworLy8gICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoc3RybGVuKHRleHQpKSArCisvLyAgICAgICAgICAgICAgICAgICAgc3RybGVuKHRleHQpOworLy8KKy8vICAgdWludDhfdCogYnVmZmVyID0KKy8vICAgICAgIGNvZGVkX291dHB1dC0+R2V0RGlyZWN0QnVmZmVyRm9yTkJ5dGVzQW5kQWR2YW5jZShjb2RlZF9zaXplKTsKKy8vICAgaWYgKGJ1ZmZlciAhPSBudWxscHRyKSB7CisvLyAgICAgLy8gVGhlIG91dHB1dCBzdHJlYW0gaGFzIGVub3VnaCBzcGFjZSBpbiB0aGUgYnVmZmVyOiB3cml0ZSBkaXJlY3RseSB0bworLy8gICAgIC8vIHRoZSBhcnJheS4KKy8vICAgICBidWZmZXIgPSBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW4zMlRvQXJyYXkobWFnaWNfbnVtYmVyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOworLy8gICAgIGJ1ZmZlciA9IENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheShzdHJsZW4odGV4dCksIGJ1ZmZlcik7CisvLyAgICAgYnVmZmVyID0gQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlUmF3VG9BcnJheSh0ZXh0LCBzdHJsZW4odGV4dCksIGJ1ZmZlcik7CisvLyAgIH0gZWxzZSB7CisvLyAgICAgLy8gTWFrZSBib3VuZC1jaGVja2VkIHdyaXRlcywgd2hpY2ggd2lsbCBhc2sgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGZvcgorLy8gICAgIC8vIG1vcmUgc3BhY2UgYXMgbmVlZGVkLgorLy8gICAgIGNvZGVkX291dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW4zMihtYWdpY19udW1iZXIpOworLy8gICAgIGNvZGVkX291dHB1dC0+V3JpdGVWYXJpbnQzMihzdHJsZW4odGV4dCkpOworLy8gICAgIGNvZGVkX291dHB1dC0+V3JpdGVSYXcodGV4dCwgc3RybGVuKHRleHQpKTsKKy8vICAgfQorLy8KKy8vICAgZGVsZXRlIGNvZGVkX291dHB1dDsKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBDb2RlZE91dHB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGEgQ29kZWRPdXRwdXRTdHJlYW0gdGhhdCB3cml0ZXMgdG8gdGhlIGdpdmVuIGBzdHJlYW1gLgorICAvLyBUaGUgcHJvdmlkZWQgc3RyZWFtIG11c3QgcHVibGljbHkgZGVyaXZlIGZyb20gYFplcm9Db3B5T3V0cHV0U3RyZWFtYC4KKyAgdGVtcGxhdGUgPGNsYXNzIFN0cmVhbSwgY2xhc3MgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Jhc2Vfb2Y8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaZXJvQ29weU91dHB1dFN0cmVhbSwgU3RyZWFtPjo6dmFsdWU+Ojp0eXBlPgorICBleHBsaWNpdCBDb2RlZE91dHB1dFN0cmVhbShTdHJlYW0qIHN0cmVhbSk7CisKKyAgLy8gQ3JlYXRlcyBhIENvZGVkT3V0cHV0U3RyZWFtIHRoYXQgd3JpdGVzIHRvIHRoZSBnaXZlbiBgc3RyZWFtYCwgYW5kIGRvZXMKKyAgLy8gYW4gJ2VhZ2VyIGluaXRpYWxpemF0aW9uJyBvZiB0aGUgaW50ZXJuYWwgc3RhdGUgaWYgYGVhZ2VyX2luaXRgIGlzIHRydWUuCisgIC8vIFRoZSBwcm92aWRlZCBzdHJlYW0gbXVzdCBwdWJsaWNseSBkZXJpdmUgZnJvbSBgWmVyb0NvcHlPdXRwdXRTdHJlYW1gLgorICB0ZW1wbGF0ZSA8Y2xhc3MgU3RyZWFtLCBjbGFzcyA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYmFzZV9vZjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFplcm9Db3B5T3V0cHV0U3RyZWFtLCBTdHJlYW0+Ojp2YWx1ZT46OnR5cGU+CisgIENvZGVkT3V0cHV0U3RyZWFtKFN0cmVhbSogc3RyZWFtLCBib29sIGVhZ2VyX2luaXQpOworCisgIC8vIERlc3Ryb3kgdGhlIENvZGVkT3V0cHV0U3RyZWFtIGFuZCBwb3NpdGlvbiB0aGUgdW5kZXJseWluZworICAvLyBaZXJvQ29weU91dHB1dFN0cmVhbSBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBieXRlIHdyaXR0ZW4uCisgIH5Db2RlZE91dHB1dFN0cmVhbSgpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgYW4gdW5kZXJseWluZyBJL08gZXJyb3Igc2luY2UgdGhpcyBvYmplY3Qgd2FzCisgIC8vIGNyZWF0ZWQuIE9uIHNob3VsZCBjYWxsIFRyaW0gYmVmb3JlIHRoaXMgZnVuY3Rpb24gaW4gb3JkZXIgdG8gY2F0Y2ggYWxsCisgIC8vIGVycm9ycy4KKyAgYm9vbCBIYWRFcnJvcigpIHsKKyAgICBjdXJfID0gaW1wbF8uRmx1c2hBbmRSZXNldEJ1ZmZlcihjdXJfKTsKKyAgICBHT09HTEVfRENIRUNLKGN1cl8pOworICAgIHJldHVybiBpbXBsXy5IYWRFcnJvcigpOworICB9CisKKyAgLy8gVHJpbXMgYW55IHVudXNlZCBzcGFjZSBpbiB0aGUgdW5kZXJseWluZyBidWZmZXIgc28gdGhhdCBpdHMgc2l6ZSBtYXRjaGVzCisgIC8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBieSB0aGlzIHN0cmVhbS4gVGhlIHVuZGVybHlpbmcgYnVmZmVyIHdpbGwKKyAgLy8gYXV0b21hdGljYWxseSBiZSB0cmltbWVkIHdoZW4gdGhpcyBzdHJlYW0gaXMgZGVzdHJveWVkOyB0aGlzIGNhbGwgaXMgb25seQorICAvLyBuZWNlc3NhcnkgaWYgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlzIGFjY2Vzc2VkICpiZWZvcmUqIHRoZSBzdHJlYW0gaXMKKyAgLy8gZGVzdHJveWVkLgorICB2b2lkIFRyaW0oKSB7IGN1cl8gPSBpbXBsXy5UcmltKGN1cl8pOyB9CisKKyAgLy8gU2tpcHMgYSBudW1iZXIgb2YgYnl0ZXMsIGxlYXZpbmcgdGhlIGJ5dGVzIHVubW9kaWZpZWQgaW4gdGhlIHVuZGVybHlpbmcKKyAgLy8gYnVmZmVyLiAgUmV0dXJucyBmYWxzZSBpZiBhbiB1bmRlcmx5aW5nIHdyaXRlIGVycm9yIG9jY3Vycy4gIFRoaXMgaXMKKyAgLy8gbWFpbmx5IHVzZWZ1bCB3aXRoIEdldERpcmVjdEJ1ZmZlclBvaW50ZXIoKS4KKyAgLy8gTm90ZSBvZiBjYXV0aW9uLCB0aGUgc2tpcHBlZCBieXRlcyBtYXkgY29udGFpbiB1bmluaXRpYWxpemVkIGRhdGEuIFRoZQorICAvLyBjYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgc2tpcHBlZCBieXRlcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQsCisgIC8vIG90aGVyd2lzZSB5b3UgbWlnaHQgbGVhayBieXRlcyBmcm9tIHlvdXIgaGVhcC4KKyAgYm9vbCBTa2lwKGludCBjb3VudCkgeyByZXR1cm4gaW1wbF8uU2tpcChjb3VudCwgJmN1cl8pOyB9CisKKyAgLy8gU2V0cyAqZGF0YSB0byBwb2ludCBkaXJlY3RseSBhdCB0aGUgdW53cml0dGVuIHBhcnQgb2YgdGhlCisgIC8vIENvZGVkT3V0cHV0U3RyZWFtJ3MgdW5kZXJseWluZyBidWZmZXIsIGFuZCAqc2l6ZSB0byB0aGUgc2l6ZSBvZiB0aGF0CisgIC8vIGJ1ZmZlciwgYnV0IGRvZXMgbm90IGFkdmFuY2UgdGhlIHN0cmVhbSdzIGN1cnJlbnQgcG9zaXRpb24uICBUaGlzIHdpbGwKKyAgLy8gYWx3YXlzIGVpdGhlciBwcm9kdWNlIGEgbm9uLWVtcHR5IGJ1ZmZlciBvciByZXR1cm4gZmFsc2UuICBJZiB0aGUgY2FsbGVyCisgIC8vIHdyaXRlcyBhbnkgZGF0YSB0byB0aGlzIGJ1ZmZlciwgaXQgc2hvdWxkIHRoZW4gY2FsbCBTa2lwKCkgdG8gc2tpcCBvdmVyCisgIC8vIHRoZSBjb25zdW1lZCBieXRlcy4gIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIGV4dGVybmFsIGZhc3QKKyAgLy8gc2VyaWFsaXphdGlvbiByb3V0aW5lcyBmb3IgdHlwZXMgb2YgZGF0YSBub3QgY292ZXJlZCBieSB0aGUKKyAgLy8gQ29kZWRPdXRwdXRTdHJlYW0gaW50ZXJmYWNlLgorICBib29sIEdldERpcmVjdEJ1ZmZlclBvaW50ZXIodm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICAgIHJldHVybiBpbXBsXy5HZXREaXJlY3RCdWZmZXJQb2ludGVyKGRhdGEsIHNpemUsICZjdXJfKTsKKyAgfQorCisgIC8vIElmIHRoZXJlIGFyZSBhdCBsZWFzdCAic2l6ZSIgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGJ1ZmZlciwKKyAgLy8gcmV0dXJucyBhIHBvaW50ZXIgZGlyZWN0bHkgaW50byB0aGUgYnVmZmVyIGFuZCBhZHZhbmNlcyBvdmVyIHRoZXNlIGJ5dGVzLgorICAvLyBUaGUgY2FsbGVyIG1heSB0aGVuIHdyaXRlIGRpcmVjdGx5IGludG8gdGhpcyBidWZmZXIgKGUuZy4gdXNpbmcgdGhlCisgIC8vICpUb0FycmF5IHN0YXRpYyBtZXRob2RzKSByYXRoZXIgdGhhbiBnbyB0aHJvdWdoIENvZGVkT3V0cHV0U3RyZWFtLiAgSWYKKyAgLy8gdGhlcmUgYXJlIG5vdCBlbm91Z2ggYnl0ZXMgYXZhaWxhYmxlLCByZXR1cm5zIE5VTEwuICBUaGUgcmV0dXJuIHBvaW50ZXIgaXMKKyAgLy8gaW52YWxpZGF0ZWQgYXMgc29vbiBhcyBhbnkgb3RoZXIgbm9uLWNvbnN0IG1ldGhvZCBvZiBDb2RlZE91dHB1dFN0cmVhbQorICAvLyBpcyBjYWxsZWQuCisgIGlubGluZSB1aW50OF90KiBHZXREaXJlY3RCdWZmZXJGb3JOQnl0ZXNBbmRBZHZhbmNlKGludCBzaXplKSB7CisgICAgcmV0dXJuIGltcGxfLkdldERpcmVjdEJ1ZmZlckZvck5CeXRlc0FuZEFkdmFuY2Uoc2l6ZSwgJmN1cl8pOworICB9CisKKyAgLy8gV3JpdGUgcmF3IGJ5dGVzLCBjb3B5aW5nIHRoZW0gZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLgorICB2b2lkIFdyaXRlUmF3KGNvbnN0IHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpIHsKKyAgICBjdXJfID0gaW1wbF8uV3JpdGVSYXcoYnVmZmVyLCBzaXplLCBjdXJfKTsKKyAgfQorICAvLyBMaWtlIFdyaXRlUmF3KCkgIGJ1dCB3aWxsIHRyeSB0byB3cml0ZSBhbGlhc2VkIGRhdGEgaWYgYWxpYXNpbmcgaXMKKyAgLy8gdHVybmVkIG9uLgorICB2b2lkIFdyaXRlUmF3TWF5YmVBbGlhc2VkKGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKTsKKyAgLy8gTGlrZSBXcml0ZVJhdygpICBidXQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGFycmF5LgorICAvLyBUaGlzIGlzIF9ub3RfIGlubGluZWQsIGFzIHRoZSBjb21waWxlciBvZnRlbiBvcHRpbWl6ZXMgbWVtY3B5IGludG8gaW5saW5lCisgIC8vIGNvcHkgbG9vcHMuIFNpbmNlIHRoaXMgZ2V0cyBjYWxsZWQgYnkgZXZlcnkgZmllbGQgd2l0aCBzdHJpbmcgb3IgYnl0ZXMKKyAgLy8gdHlwZSwgaW5saW5pbmcgbWF5IGxlYWQgdG8gYSBzaWduaWZpY2FudCBhbW91bnQgb2YgY29kZSBibG9hdCwgd2l0aCBvbmx5IGEKKyAgLy8gbWlub3IgcGVyZm9ybWFuY2UgZ2Fpbi4KKyAgc3RhdGljIHVpbnQ4X3QqIFdyaXRlUmF3VG9BcnJheShjb25zdCB2b2lkKiBidWZmZXIsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCk7CisKKyAgLy8gRXF1aXZhbGVudCB0byBXcml0ZVJhdyhzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpKS4KKyAgdm9pZCBXcml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKyAgLy8gTGlrZSBXcml0ZVN0cmluZygpICBidXQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGFycmF5LgorICBzdGF0aWMgdWludDhfdCogV3JpdGVTdHJpbmdUb0FycmF5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIHVpbnQ4X3QqIHRhcmdldCk7CisgIC8vIFdyaXRlIHRoZSB2YXJpbnQtZW5jb2RlZCBzaXplIG9mIHN0ciBmb2xsb3dlZCBieSBzdHIuCisgIHN0YXRpYyB1aW50OF90KiBXcml0ZVN0cmluZ1dpdGhTaXplVG9BcnJheShjb25zdCBzdGQ6OnN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KTsKKworCisgIC8vIFdyaXRlIGEgMzItYml0IGxpdHRsZS1lbmRpYW4gaW50ZWdlci4KKyAgdm9pZCBXcml0ZUxpdHRsZUVuZGlhbjMyKHVpbnQzMl90IHZhbHVlKSB7CisgICAgY3VyXyA9IGltcGxfLkVuc3VyZVNwYWNlKGN1cl8pOworICAgIFNldEN1cihXcml0ZUxpdHRsZUVuZGlhbjMyVG9BcnJheSh2YWx1ZSwgQ3VyKCkpKTsKKyAgfQorICAvLyBMaWtlIFdyaXRlTGl0dGxlRW5kaWFuMzIoKSAgYnV0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBhcnJheS4KKyAgc3RhdGljIHVpbnQ4X3QqIFdyaXRlTGl0dGxlRW5kaWFuMzJUb0FycmF5KHVpbnQzMl90IHZhbHVlLCB1aW50OF90KiB0YXJnZXQpOworICAvLyBXcml0ZSBhIDY0LWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIuCisgIHZvaWQgV3JpdGVMaXR0bGVFbmRpYW42NCh1aW50NjRfdCB2YWx1ZSkgeworICAgIGN1cl8gPSBpbXBsXy5FbnN1cmVTcGFjZShjdXJfKTsKKyAgICBTZXRDdXIoV3JpdGVMaXR0bGVFbmRpYW42NFRvQXJyYXkodmFsdWUsIEN1cigpKSk7CisgIH0KKyAgLy8gTGlrZSBXcml0ZUxpdHRsZUVuZGlhbjY0KCkgIGJ1dCB3cml0aW5nIGRpcmVjdGx5IHRvIHRoZSB0YXJnZXQgYXJyYXkuCisgIHN0YXRpYyB1aW50OF90KiBXcml0ZUxpdHRsZUVuZGlhbjY0VG9BcnJheSh1aW50NjRfdCB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KTsKKworICAvLyBXcml0ZSBhbiB1bnNpZ25lZCBpbnRlZ2VyIHdpdGggVmFyaW50IGVuY29kaW5nLiAgV3JpdGluZyBhIDMyLWJpdCB2YWx1ZQorICAvLyBpcyBlcXVpdmFsZW50IHRvIGNhc3RpbmcgaXQgdG8gdWludDY0X3QgYW5kIHdyaXRpbmcgaXQgYXMgYSA2NC1iaXQgdmFsdWUsCisgIC8vIGJ1dCBtYXkgYmUgbW9yZSBlZmZpY2llbnQuCisgIHZvaWQgV3JpdGVWYXJpbnQzMih1aW50MzJfdCB2YWx1ZSk7CisgIC8vIExpa2UgV3JpdGVWYXJpbnQzMigpICBidXQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGFycmF5LgorICBzdGF0aWMgdWludDhfdCogV3JpdGVWYXJpbnQzMlRvQXJyYXkodWludDMyX3QgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCk7CisgIC8vIExpa2UgV3JpdGVWYXJpbnQzMigpICBidXQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGFycmF5LCBhbmQgd2l0aAorICAvLyB0aGUgbGVzcyBjb21tb24tY2FzZSBwYXRocyBiZWluZyBvdXQgb2YgbGluZSByYXRoZXIgdGhhbiBpbmxpbmVkLgorICBzdGF0aWMgdWludDhfdCogV3JpdGVWYXJpbnQzMlRvQXJyYXlPdXRPZkxpbmUodWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpOworICAvLyBXcml0ZSBhbiB1bnNpZ25lZCBpbnRlZ2VyIHdpdGggVmFyaW50IGVuY29kaW5nLgorICB2b2lkIFdyaXRlVmFyaW50NjQodWludDY0X3QgdmFsdWUpOworICAvLyBMaWtlIFdyaXRlVmFyaW50NjQoKSAgYnV0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBhcnJheS4KKyAgc3RhdGljIHVpbnQ4X3QqIFdyaXRlVmFyaW50NjRUb0FycmF5KHVpbnQ2NF90IHZhbHVlLCB1aW50OF90KiB0YXJnZXQpOworCisgIC8vIEVxdWl2YWxlbnQgdG8gV3JpdGVWYXJpbnQzMigpIGV4Y2VwdCB3aGVuIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZSwKKyAgLy8gaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIHNpZ24tZXh0ZW5kZWQgdG8gYSBmdWxsIDEwIGJ5dGVzLgorICB2b2lkIFdyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWQoaW50MzJfdCB2YWx1ZSk7CisgIC8vIExpa2UgV3JpdGVWYXJpbnQzMlNpZ25FeHRlbmRlZCgpICBidXQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGFycmF5LgorICBzdGF0aWMgdWludDhfdCogV3JpdGVWYXJpbnQzMlNpZ25FeHRlbmRlZFRvQXJyYXkoaW50MzJfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCk7CisKKyAgLy8gVGhpcyBpcyBpZGVudGljYWwgdG8gV3JpdGVWYXJpbnQzMigpLCBidXQgb3B0aW1pemVkIGZvciB3cml0aW5nIHRhZ3MuCisgIC8vIEluIHBhcnRpY3VsYXIsIGlmIHRoZSBpbnB1dCBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudCwgdGhpcyBtZXRob2QKKyAgLy8gY29tcGlsZXMgZG93biB0byBhIGNvdXBsZSBpbnN0cnVjdGlvbnMuCisgIC8vIEFsd2F5cyBpbmxpbmUgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGFmb3JlbWVudGlvbmVkIG9wdGltaXphdGlvbiBjYW4ndCB3b3JrLAorICAvLyBidXQgR0NDIGJ5IGRlZmF1bHQgZG9lc24ndCB3YW50IHRvIGlubGluZSB0aGlzLgorICB2b2lkIFdyaXRlVGFnKHVpbnQzMl90IHZhbHVlKTsKKyAgLy8gTGlrZSBXcml0ZVRhZygpICBidXQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGFycmF5LgorICBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCisgIHN0YXRpYyB1aW50OF90KiBXcml0ZVRhZ1RvQXJyYXkodWludDMyX3QgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCk7CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBlbmNvZGUgdGhlIGdpdmVuIHZhbHVlIGFzIGEgdmFyaW50LgorICBzdGF0aWMgc2l6ZV90IFZhcmludFNpemUzMih1aW50MzJfdCB2YWx1ZSk7CisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gZW5jb2RlIHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHZhcmludC4KKyAgc3RhdGljIHNpemVfdCBWYXJpbnRTaXplNjQodWludDY0X3QgdmFsdWUpOworCisgIC8vIElmIG5lZ2F0aXZlLCAxMCBieXRlcy4gIE90aGVyd2lzZSwgc2FtZSBhcyBWYXJpbnRTaXplMzIoKS4KKyAgc3RhdGljIHNpemVfdCBWYXJpbnRTaXplMzJTaWduRXh0ZW5kZWQoaW50MzJfdCB2YWx1ZSk7CisKKyAgLy8gU2FtZSBhcyBhYm92ZSwgcGx1cyBvbmUuICBUaGUgYWRkaXRpb25hbCBvbmUgY29tZXMgYXQgbm8gY29tcHV0ZSBjb3N0LgorICBzdGF0aWMgc2l6ZV90IFZhcmludFNpemUzMlBsdXNPbmUodWludDMyX3QgdmFsdWUpOworICBzdGF0aWMgc2l6ZV90IFZhcmludFNpemU2NFBsdXNPbmUodWludDY0X3QgdmFsdWUpOworICBzdGF0aWMgc2l6ZV90IFZhcmludFNpemUzMlNpZ25FeHRlbmRlZFBsdXNPbmUoaW50MzJfdCB2YWx1ZSk7CisKKyAgLy8gQ29tcGlsZS10aW1lIGVxdWl2YWxlbnQgb2YgVmFyaW50U2l6ZTMyKCkuCisgIHRlbXBsYXRlIDx1aW50MzJfdCBWYWx1ZT4KKyAgc3RydWN0IFN0YXRpY1ZhcmludFNpemUzMiB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCB2YWx1ZSA9IChWYWx1ZSA8ICgxIDw8IDcpKSAgICA/IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoVmFsdWUgPCAoMSA8PCAxNCkpID8gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChWYWx1ZSA8ICgxIDw8IDIxKSkgPyAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKFZhbHVlIDwgKDEgPDwgMjgpKSA/IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNTsKKyAgfTsKKworICAvLyBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBzaW5jZSB0aGlzIG9iamVjdCB3YXMgY3JlYXRlZC4KKyAgaW50IEJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihpbXBsXy5CeXRlQ291bnQoY3VyXykgLSBzdGFydF9jb3VudF8pOworICB9CisKKyAgLy8gSW5zdHJ1Y3RzIHRoZSBDb2RlZE91dHB1dFN0cmVhbSB0byBhbGxvdyB0aGUgdW5kZXJseWluZworICAvLyBaZXJvQ29weU91dHB1dFN0cmVhbSB0byBob2xkIHBvaW50ZXJzIHRvIHRoZSBvcmlnaW5hbCBzdHJ1Y3R1cmUgaW5zdGVhZCBvZgorICAvLyBjb3B5aW5nLCBpZiBpdCBzdXBwb3J0cyBpdCAoaS5lLiBvdXRwdXQtPkFsbG93c0FsaWFzaW5nKCkgaXMgdHJ1ZSkuICBJZiB0aGUKKyAgLy8gdW5kZXJseWluZyBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBhbGlhc2luZywgdGhlbiBlbmFibGluZyBpdCBoYXMgbm8KKyAgLy8gYWZmZWN0LiAgRm9yIG5vdywgdGhpcyBvbmx5IGFmZmVjdHMgdGhlIGJlaGF2aW9yIG9mCisgIC8vIFdyaXRlUmF3TWF5YmVBbGlhc2VkKCkuCisgIC8vCisgIC8vIE5PVEU6IEl0IGlzIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZSBjaHVuayBvZiBtZW1vcnkKKyAgLy8gcmVtYWlucyBsaXZlIHVudGlsIGFsbCBvZiB0aGUgZGF0YSBoYXMgYmVlbiBjb25zdW1lZCBmcm9tIHRoZSBzdHJlYW0uCisgIHZvaWQgRW5hYmxlQWxpYXNpbmcoYm9vbCBlbmFibGVkKSB7IGltcGxfLkVuYWJsZUFsaWFzaW5nKGVuYWJsZWQpOyB9CisKKyAgLy8gSW5kaWNhdGUgdG8gdGhlIHNlcmlhbGl6ZXIgd2hldGhlciB0aGUgdXNlciB3YW50cyBkZXRlcm1pbmlzdGljCisgIC8vIHNlcmlhbGl6YXRpb24uIFRoZSBkZWZhdWx0IHdoZW4gdGhpcyBpcyBub3QgY2FsbGVkIGNvbWVzIGZyb20gdGhlIGdsb2JhbAorICAvLyBkZWZhdWx0LCBjb250cm9sbGVkIGJ5IFNldERlZmF1bHRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYy4KKyAgLy8KKyAgLy8gV2hhdCBkZXRlcm1pbmlzdGljIHNlcmlhbGl6YXRpb24gbWVhbnMgaXMgZW50aXJlbHkgdXAgdG8gdGhlIGRyaXZlciBvZiB0aGUKKyAgLy8gc2VyaWFsaXphdGlvbiBwcm9jZXNzIChpLmUuIHRoZSBjYWxsZXIgb2YgbWV0aG9kcyBsaWtlIFdyaXRlVmFyaW50MzIpLiBJbgorICAvLyB0aGUgY2FzZSBvZiBzZXJpYWxpemluZyBhIHByb3RvIGJ1ZmZlciBtZXNzYWdlIHVzaW5nIG9uZSBvZiB0aGUgbWV0aG9kcyBvZgorICAvLyBNZXNzYWdlTGl0ZSwgdGhpcyBtZWFucyB0aGF0IGZvciBhIGdpdmVuIGJpbmFyeSBlcXVhbCBtZXNzYWdlcyB3aWxsIGFsd2F5cworICAvLyBiZSBzZXJpYWxpemVkIHRvIHRoZSBzYW1lIGJ5dGVzLiBUaGlzIGltcGxpZXM6CisgIC8vCisgIC8vICAgKiBSZXBlYXRlZCBzZXJpYWxpemF0aW9uIG9mIGEgbWVzc2FnZSB3aWxsIHJldHVybiB0aGUgc2FtZSBieXRlcy4KKyAgLy8KKyAgLy8gICAqIERpZmZlcmVudCBwcm9jZXNzZXMgcnVubmluZyB0aGUgc2FtZSBiaW5hcnkgKGluY2x1ZGluZyBvbiBkaWZmZXJlbnQKKyAgLy8gICAgIG1hY2hpbmVzKSB3aWxsIHNlcmlhbGl6ZSBlcXVhbCBtZXNzYWdlcyB0byB0aGUgc2FtZSBieXRlcy4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgKm5vdCogY2Fub25pY2FsIGFjcm9zcyBsYW5ndWFnZXMuIEl0IGlzIGFsc28gdW5zdGFibGUKKyAgLy8gYWNyb3NzIGRpZmZlcmVudCBidWlsZHMgd2l0aCBpbnRlcnZlbmluZyBtZXNzYWdlIGRlZmluaXRpb24gY2hhbmdlcywgZHVlIHRvCisgIC8vIHVua25vd24gZmllbGRzLiBVc2VycyB3aG8gbmVlZCBjYW5vbmljYWwgc2VyaWFsaXphdGlvbiAoZS5nLiBwZXJzaXN0ZW50CisgIC8vIHN0b3JhZ2UgaW4gYSBjYW5vbmljYWwgZm9ybSwgZmluZ2VycHJpbnRpbmcpIHNob3VsZCBkZWZpbmUgdGhlaXIgb3duCisgIC8vIGNhbm9uaWNhbGl6YXRpb24gc3BlY2lmaWNhdGlvbiBhbmQgaW1wbGVtZW50IHRoZSBzZXJpYWxpemVyIHVzaW5nCisgIC8vIHJlZmxlY3Rpb24gQVBJcyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIHRoaXMgQVBJLgorICB2b2lkIFNldFNlcmlhbGl6YXRpb25EZXRlcm1pbmlzdGljKGJvb2wgdmFsdWUpIHsKKyAgICBpbXBsXy5TZXRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYyh2YWx1ZSk7CisgIH0KKworICAvLyBSZXR1cm4gd2hldGhlciB0aGUgdXNlciB3YW50cyBkZXRlcm1pbmlzdGljIHNlcmlhbGl6YXRpb24uIFNlZSBhYm92ZS4KKyAgYm9vbCBJc1NlcmlhbGl6YXRpb25EZXRlcm1pbmlzdGljKCkgY29uc3QgeworICAgIHJldHVybiBpbXBsXy5Jc1NlcmlhbGl6YXRpb25EZXRlcm1pbmlzdGljKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBJc0RlZmF1bHRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYygpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9zZXJpYWxpemF0aW9uX2RldGVybWluaXN0aWNfLmxvYWQoCisgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSAhPSAwOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmM+CisgIHZvaWQgU2VyaWFsaXplKGNvbnN0IEZ1bmMmIGZ1bmMpOworCisgIHVpbnQ4X3QqIEN1cigpIGNvbnN0IHsgcmV0dXJuIGN1cl87IH0KKyAgdm9pZCBTZXRDdXIodWludDhfdCogcHRyKSB7IGN1cl8gPSBwdHI7IH0KKyAgRXBzQ29weU91dHB1dFN0cmVhbSogRXBzQ29weSgpIHsgcmV0dXJuICZpbXBsXzsgfQorCisgcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIFN0cmVhbT4KKyAgdm9pZCBJbml0RWFnZXJseShTdHJlYW0qIHN0cmVhbSk7CisKKyAgRXBzQ29weU91dHB1dFN0cmVhbSBpbXBsXzsKKyAgdWludDhfdCogY3VyXzsKKyAgaW50NjRfdCBzdGFydF9jb3VudF87CisgIHN0YXRpYyBzdGQ6OmF0b21pYzxib29sPiBkZWZhdWx0X3NlcmlhbGl6YXRpb25fZGV0ZXJtaW5pc3RpY187CisKKyAgLy8gU2VlIGFib3ZlLiAgT3RoZXIgcHJvamVjdHMgbWF5IHVzZSAiZnJpZW5kIiB0byBhbGxvdyB0aGVtIHRvIGNhbGwgdGhpcy4KKyAgLy8gQWZ0ZXIgU2V0RGVmYXVsdFNlcmlhbGl6YXRpb25EZXRlcm1pbmlzdGljKCkgY29tcGxldGVzLCBhbGwgcHJvdG9jb2wKKyAgLy8gYnVmZmVyIHNlcmlhbGl6YXRpb25zIHdpbGwgYmUgZGV0ZXJtaW5pc3RpYyBieSBkZWZhdWx0LiAgVGhyZWFkIHNhZmUuCisgIC8vIEhvd2V2ZXIsIHRoZSBtZWFuaW5nIG9mICJhZnRlciIgaXMgc3VidGxlIGhlcmU6IHRvIGJlIHNhZmUsIGVhY2ggdGhyZWFkCisgIC8vIHRoYXQgd2FudHMgZGV0ZXJtaW5pc3RpYyBzZXJpYWxpemF0aW9uIGJ5IGRlZmF1bHQgbmVlZHMgdG8gY2FsbAorICAvLyBTZXREZWZhdWx0U2VyaWFsaXphdGlvbkRldGVybWluaXN0aWMoKSBvciBlbnN1cmUgb24gaXRzIG93biB0aGF0IGFub3RoZXIKKyAgLy8gdGhyZWFkIGhhcyBkb25lIHNvLgorICBmcmllbmQgdm9pZCBpbnRlcm5hbDo6TWFwVGVzdEZvcmNlRGV0ZXJtaW5pc3RpYygpOworICBzdGF0aWMgdm9pZCBTZXREZWZhdWx0U2VyaWFsaXphdGlvbkRldGVybWluaXN0aWMoKSB7CisgICAgZGVmYXVsdF9zZXJpYWxpemF0aW9uX2RldGVybWluaXN0aWNfLnN0b3JlKHRydWUsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICB9CisgIC8vIFJFUVVJUkVTOiB2YWx1ZSA+PSAweDgwLCBhbmQgdGhhdCAodmFsdWUgJiA3ZikgaGFzIGJlZW4gd3JpdHRlbiB0byAqdGFyZ2V0LgorICBzdGF0aWMgdWludDhfdCogV3JpdGVWYXJpbnQzMlRvQXJyYXlPdXRPZkxpbmVIZWxwZXIodWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29kZWRPdXRwdXRTdHJlYW0pOworfTsKKworLy8gaW5saW5lIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVGhlIHZhc3QgbWFqb3JpdHkgb2YgdmFyaW50cyBhcmUgb25seSBvbmUgYnl0ZS4gIFRoZXNlIGlubGluZQorLy8gbWV0aG9kcyBvcHRpbWl6ZSBmb3IgdGhhdCBjYXNlLgorCitpbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkVmFyaW50MzIodWludDMyX3QqIHZhbHVlKSB7CisgIHVpbnQzMl90IHYgPSAwOworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKGJ1ZmZlcl8gPCBidWZmZXJfZW5kXykpIHsKKyAgICB2ID0gKmJ1ZmZlcl87CisgICAgaWYgKHYgPCAweDgwKSB7CisgICAgICAqdmFsdWUgPSB2OworICAgICAgQWR2YW5jZSgxKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICBpbnQ2NF90IHJlc3VsdCA9IFJlYWRWYXJpbnQzMkZhbGxiYWNrKHYpOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdCA+PSAwOworfQorCitpbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkVmFyaW50NjQodWludDY0X3QqIHZhbHVlKSB7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSAmJiAqYnVmZmVyXyA8IDB4ODApIHsKKyAgICAqdmFsdWUgPSAqYnVmZmVyXzsKKyAgICBBZHZhbmNlKDEpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHN0ZDo6cGFpcjx1aW50NjRfdCwgYm9vbD4gcCA9IFJlYWRWYXJpbnQ2NEZhbGxiYWNrKCk7CisgICp2YWx1ZSA9IHAuZmlyc3Q7CisgIHJldHVybiBwLnNlY29uZDsKK30KKworaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludFNpemVBc0ludChpbnQqIHZhbHVlKSB7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSkgeworICAgIGludCB2ID0gKmJ1ZmZlcl87CisgICAgaWYgKHYgPCAweDgwKSB7CisgICAgICAqdmFsdWUgPSB2OworICAgICAgQWR2YW5jZSgxKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICAqdmFsdWUgPSBSZWFkVmFyaW50U2l6ZUFzSW50RmFsbGJhY2soKTsKKyAgcmV0dXJuICp2YWx1ZSA+PSAwOworfQorCisvLyBzdGF0aWMKK2lubGluZSBjb25zdCB1aW50OF90KiBDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXkoCisgICAgY29uc3QgdWludDhfdCogYnVmZmVyLCB1aW50MzJfdCogdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0xJVFRMRV9FTkRJQU4pICYmIFwKKyAgICAhZGVmaW5lZChQUk9UT0JVRl9ESVNBQkxFX0xJVFRMRV9FTkRJQU5fT1BUX0ZPUl9URVNUKQorICBtZW1jcHkodmFsdWUsIGJ1ZmZlciwgc2l6ZW9mKCp2YWx1ZSkpOworICByZXR1cm4gYnVmZmVyICsgc2l6ZW9mKCp2YWx1ZSk7CisjZWxzZQorICAqdmFsdWUgPSAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlclswXSkpIHwKKyAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZmZXJbMV0pIDw8IDgpIHwKKyAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZmZXJbMl0pIDw8IDE2KSB8CisgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oYnVmZmVyWzNdKSA8PCAyNCk7CisgIHJldHVybiBidWZmZXIgKyBzaXplb2YoKnZhbHVlKTsKKyNlbmRpZgorfQorLy8gc3RhdGljCitpbmxpbmUgY29uc3QgdWludDhfdCogQ29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjY0RnJvbUFycmF5KAorICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwgdWludDY0X3QqIHZhbHVlKSB7CisjaWYgZGVmaW5lZChQUk9UT0JVRl9MSVRUTEVfRU5ESUFOKSAmJiBcCisgICAgIWRlZmluZWQoUFJPVE9CVUZfRElTQUJMRV9MSVRUTEVfRU5ESUFOX09QVF9GT1JfVEVTVCkKKyAgbWVtY3B5KHZhbHVlLCBidWZmZXIsIHNpemVvZigqdmFsdWUpKTsKKyAgcmV0dXJuIGJ1ZmZlciArIHNpemVvZigqdmFsdWUpOworI2Vsc2UKKyAgdWludDMyX3QgcGFydDAgPSAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlclswXSkpIHwKKyAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlclsxXSkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oYnVmZmVyWzJdKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oYnVmZmVyWzNdKSA8PCAyNCk7CisgIHVpbnQzMl90IHBhcnQxID0gKHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZmZXJbNF0pKSB8CisgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZmZXJbNV0pIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlcls2XSkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlcls3XSkgPDwgMjQpOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocGFydDApIHwgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihwYXJ0MSkgPDwgMzIpOworICByZXR1cm4gYnVmZmVyICsgc2l6ZW9mKCp2YWx1ZSk7CisjZW5kaWYKK30KKworaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjMyKHVpbnQzMl90KiB2YWx1ZSkgeworI2lmIGRlZmluZWQoUFJPVE9CVUZfTElUVExFX0VORElBTikgJiYgXAorICAgICFkZWZpbmVkKFBST1RPQlVGX0RJU0FCTEVfTElUVExFX0VORElBTl9PUFRfRk9SX1RFU1QpCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoQnVmZmVyU2l6ZSgpID49IHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKCp2YWx1ZSkpKSkgeworICAgIGJ1ZmZlcl8gPSBSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXkoYnVmZmVyXywgdmFsdWUpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBSZWFkTGl0dGxlRW5kaWFuMzJGYWxsYmFjayh2YWx1ZSk7CisgIH0KKyNlbHNlCisgIHJldHVybiBSZWFkTGl0dGxlRW5kaWFuMzJGYWxsYmFjayh2YWx1ZSk7CisjZW5kaWYKK30KKworaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjY0KHVpbnQ2NF90KiB2YWx1ZSkgeworI2lmIGRlZmluZWQoUFJPVE9CVUZfTElUVExFX0VORElBTikgJiYgXAorICAgICFkZWZpbmVkKFBST1RPQlVGX0RJU0FCTEVfTElUVExFX0VORElBTl9PUFRfRk9SX1RFU1QpCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoQnVmZmVyU2l6ZSgpID49IHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKCp2YWx1ZSkpKSkgeworICAgIGJ1ZmZlcl8gPSBSZWFkTGl0dGxlRW5kaWFuNjRGcm9tQXJyYXkoYnVmZmVyXywgdmFsdWUpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBSZWFkTGl0dGxlRW5kaWFuNjRGYWxsYmFjayh2YWx1ZSk7CisgIH0KKyNlbHNlCisgIHJldHVybiBSZWFkTGl0dGxlRW5kaWFuNjRGYWxsYmFjayh2YWx1ZSk7CisjZW5kaWYKK30KKworaW5saW5lIHVpbnQzMl90IENvZGVkSW5wdXRTdHJlYW06OlJlYWRUYWdOb0xhc3RUYWcoKSB7CisgIHVpbnQzMl90IHYgPSAwOworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKGJ1ZmZlcl8gPCBidWZmZXJfZW5kXykpIHsKKyAgICB2ID0gKmJ1ZmZlcl87CisgICAgaWYgKHYgPCAweDgwKSB7CisgICAgICBBZHZhbmNlKDEpOworICAgICAgcmV0dXJuIHY7CisgICAgfQorICB9CisgIHYgPSBSZWFkVGFnRmFsbGJhY2sodik7CisgIHJldHVybiB2OworfQorCitpbmxpbmUgc3RkOjpwYWlyPHVpbnQzMl90LCBib29sPiBDb2RlZElucHV0U3RyZWFtOjpSZWFkVGFnV2l0aEN1dG9mZk5vTGFzdFRhZygKKyAgICB1aW50MzJfdCBjdXRvZmYpIHsKKyAgLy8gSW4gcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIGNvZGUgd2UgY2FuIGV4cGVjdCBjdXRvZmYgdG8gYmUgYSBjb21waWxlLXRpbWUKKyAgLy8gY29uc3RhbnQsIGFuZCB0aGluZ3MgbGlrZSAiY3V0b2ZmID49IGtNYXgxQnl0ZVZhcmludCIgdG8gYmUgZXZhbHVhdGVkIGF0CisgIC8vIGNvbXBpbGUgdGltZS4KKyAgdWludDMyX3QgZmlyc3RfYnl0ZV9vcl96ZXJvID0gMDsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShidWZmZXJfIDwgYnVmZmVyX2VuZF8pKSB7CisgICAgLy8gSG90IGNhc2U6IGJ1ZmZlcl8gbm9uX2VtcHR5LCBidWZmZXJfWzBdIGluIFsxLCAxMjgpLgorICAgIC8vIFRPRE8oZ3Bpa2UpOiBJcyBpdCB3b3J0aCByZWFycmFuZ2luZyB0aGlzPyBFLmcuLCBpZiB0aGUgbnVtYmVyIG9mIGZpZWxkcworICAgIC8vIGlzIGxhcmdlIGVub3VnaCB0aGVuIGlzIGl0IGJldHRlciB0byBjaGVjayBmb3IgdGhlIHR3by1ieXRlIGNhc2UgZmlyc3Q/CisgICAgZmlyc3RfYnl0ZV9vcl96ZXJvID0gYnVmZmVyX1swXTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50OF90PihidWZmZXJfWzBdKSA+IDApIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGtNYXgxQnl0ZVZhcmludCA9IDB4N2Y7CisgICAgICB1aW50MzJfdCB0YWcgPSBidWZmZXJfWzBdOworICAgICAgQWR2YW5jZSgxKTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0YWcsIGN1dG9mZiA+PSBrTWF4MUJ5dGVWYXJpbnQgfHwgdGFnIDw9IGN1dG9mZik7CisgICAgfQorICAgIC8vIE90aGVyIGhvdCBjYXNlOiBjdXRvZmYgPj0gMHg4MCwgYnVmZmVyXyBoYXMgYXQgbGVhc3QgdHdvIGJ5dGVzIGF2YWlsYWJsZSwKKyAgICAvLyBhbmQgdGFnIGlzIHR3byBieXRlcy4gIFRoZSBsYXR0ZXIgaXMgdGVzdGVkIGJ5IGJpdHdpc2UtYW5kLW5vdCBvZiB0aGUKKyAgICAvLyBmaXJzdCBieXRlIGFuZCB0aGUgc2Vjb25kIGJ5dGUuCisgICAgaWYgKGN1dG9mZiA+PSAweDgwICYmIFBST1RPQlVGX1BSRURJQ1RfVFJVRShidWZmZXJfICsgMSA8IGJ1ZmZlcl9lbmRfKSAmJgorICAgICAgICBQUk9UT0JVRl9QUkVESUNUX1RSVUUoKGJ1ZmZlcl9bMF0gJiB+YnVmZmVyX1sxXSkgPj0gMHg4MCkpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGtNYXgyQnl0ZVZhcmludCA9ICgweDdmIDw8IDcpICsgMHg3ZjsKKyAgICAgIHVpbnQzMl90IHRhZyA9ICgxdSA8PCA3KSAqIGJ1ZmZlcl9bMV0gKyAoYnVmZmVyX1swXSAtIDB4ODApOworICAgICAgQWR2YW5jZSgyKTsKKyAgICAgIC8vIEl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gdGVzdCBmb3IgdGFnID09IDAgbm93LCBidXQgaXQgaXMgc28gcmFyZSB0aGF0CisgICAgICAvLyB0aGF0IHdlIGRvbid0IGJvdGhlci4gIEEgdmFyaW50LWVuY29kZWQgMCBzaG91bGQgYmUgb25lIGJ5dGUgdW5sZXNzCisgICAgICAvLyB0aGUgZW5jb2RlciBsb3N0IGl0cyBtaW5kLiAgVGhlIHNlY29uZCBwYXJ0IG9mIHRoZSByZXR1cm4gdmFsdWUgb2YKKyAgICAgIC8vIHRoaXMgZnVuY3Rpb24gaXMgYWxsb3dlZCB0byBiZSBlaXRoZXIgdHJ1ZSBvciBmYWxzZSBpZiB0aGUgdGFnIGlzIDAsCisgICAgICAvLyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGZvciB0YWcgPT0gMC4gIFdlIG1heSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIKKyAgICAgIC8vIGl0IGV4Y2VlZHMgY3V0b2ZmLgorICAgICAgYm9vbCBhdF9vcl9iZWxvd19jdXRvZmYgPSBjdXRvZmYgPj0ga01heDJCeXRlVmFyaW50IHx8IHRhZyA8PSBjdXRvZmY7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIodGFnLCBhdF9vcl9iZWxvd19jdXRvZmYpOworICAgIH0KKyAgfQorICAvLyBTbG93IHBhdGgKKyAgY29uc3QgdWludDMyX3QgdGFnID0gUmVhZFRhZ0ZhbGxiYWNrKGZpcnN0X2J5dGVfb3JfemVybyk7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0YWcsIHN0YXRpY19jYXN0PHVpbnQzMl90Pih0YWcgLSAxKSA8IGN1dG9mZik7Cit9CisKK2lubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06Okxhc3RUYWdXYXModWludDMyX3QgZXhwZWN0ZWQpIHsKKyAgcmV0dXJuIGxhc3RfdGFnXyA9PSBleHBlY3RlZDsKK30KKworaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6Q29uc3VtZWRFbnRpcmVNZXNzYWdlKCkgeworICByZXR1cm4gbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF87Cit9CisKK2lubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OkV4cGVjdFRhZyh1aW50MzJfdCBleHBlY3RlZCkgeworICBpZiAoZXhwZWN0ZWQgPCAoMSA8PCA3KSkgeworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSAmJgorICAgICAgICBidWZmZXJfWzBdID09IGV4cGVjdGVkKSB7CisgICAgICBBZHZhbmNlKDEpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZXhwZWN0ZWQgPCAoMSA8PCAxNCkpIHsKKyAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKEJ1ZmZlclNpemUoKSA+PSAyKSAmJgorICAgICAgICBidWZmZXJfWzBdID09IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGV4cGVjdGVkIHwgMHg4MCkgJiYKKyAgICAgICAgYnVmZmVyX1sxXSA9PSBzdGF0aWNfY2FzdDx1aW50OF90PihleHBlY3RlZCA+PiA3KSkgeworICAgICAgQWR2YW5jZSgyKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIERvbid0IGJvdGhlciBvcHRpbWl6aW5nIGZvciBsYXJnZXIgdmFsdWVzLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitpbmxpbmUgY29uc3QgdWludDhfdCogQ29kZWRJbnB1dFN0cmVhbTo6RXhwZWN0VGFnRnJvbUFycmF5KAorICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwgdWludDMyX3QgZXhwZWN0ZWQpIHsKKyAgaWYgKGV4cGVjdGVkIDwgKDEgPDwgNykpIHsKKyAgICBpZiAoYnVmZmVyWzBdID09IGV4cGVjdGVkKSB7CisgICAgICByZXR1cm4gYnVmZmVyICsgMTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZXhwZWN0ZWQgPCAoMSA8PCAxNCkpIHsKKyAgICBpZiAoYnVmZmVyWzBdID09IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGV4cGVjdGVkIHwgMHg4MCkgJiYKKyAgICAgICAgYnVmZmVyWzFdID09IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGV4cGVjdGVkID4+IDcpKSB7CisgICAgICByZXR1cm4gYnVmZmVyICsgMjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2lubGluZSB2b2lkIENvZGVkSW5wdXRTdHJlYW06OkdldERpcmVjdEJ1ZmZlclBvaW50ZXJJbmxpbmUoY29uc3Qgdm9pZCoqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc2l6ZSkgeworICAqZGF0YSA9IGJ1ZmZlcl87CisgICpzaXplID0gc3RhdGljX2Nhc3Q8aW50PihidWZmZXJfZW5kXyAtIGJ1ZmZlcl8pOworfQorCitpbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpFeHBlY3RBdEVuZCgpIHsKKyAgLy8gSWYgd2UgYXJlIGF0IGEgbGltaXQgd2Uga25vdyBubyBtb3JlIGJ5dGVzIGNhbiBiZSByZWFkLiAgT3RoZXJ3aXNlLCBpdCdzCisgIC8vIGhhcmQgdG8gc2F5IHdpdGhvdXQgY2FsbGluZyBSZWZyZXNoKCksIGFuZCB3ZSdkIHJhdGhlciBub3QgZG8gdGhhdC4KKworICBpZiAoYnVmZmVyXyA9PSBidWZmZXJfZW5kXyAmJiAoKGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XyAhPSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvdGFsX2J5dGVzX3JlYWRfID09IGN1cnJlbnRfbGltaXRfKSkpIHsKKyAgICBsYXN0X3RhZ18gPSAwOyAgICAgICAgICAgICAgICAgICAvLyBQcmV0ZW5kIHdlIGNhbGxlZCBSZWFkVGFnKCkuLi4KKyAgICBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyA9IHRydWU7ICAvLyAuLi4gYW5kIGl0IGhpdCBFT0YuCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2lubGluZSBpbnQgQ29kZWRJbnB1dFN0cmVhbTo6Q3VycmVudFBvc2l0aW9uKCkgY29uc3QgeworICByZXR1cm4gdG90YWxfYnl0ZXNfcmVhZF8gLSAoQnVmZmVyU2l6ZSgpICsgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfKTsKK30KKworaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6QWR2YW5jZShpbnQgYW1vdW50KSB7IGJ1ZmZlcl8gKz0gYW1vdW50OyB9CisKK2lubGluZSB2b2lkIENvZGVkSW5wdXRTdHJlYW06OlNldFJlY3Vyc2lvbkxpbWl0KGludCBsaW1pdCkgeworICByZWN1cnNpb25fYnVkZ2V0XyArPSBsaW1pdCAtIHJlY3Vyc2lvbl9saW1pdF87CisgIHJlY3Vyc2lvbl9saW1pdF8gPSBsaW1pdDsKK30KKworaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSB7CisgIC0tcmVjdXJzaW9uX2J1ZGdldF87CisgIHJldHVybiByZWN1cnNpb25fYnVkZ2V0XyA+PSAwOworfQorCitpbmxpbmUgdm9pZCBDb2RlZElucHV0U3RyZWFtOjpEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpIHsKKyAgaWYgKHJlY3Vyc2lvbl9idWRnZXRfIDwgcmVjdXJzaW9uX2xpbWl0XykgKytyZWN1cnNpb25fYnVkZ2V0XzsKK30KKworaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSB7CisgIGFzc2VydChyZWN1cnNpb25fYnVkZ2V0XyA8IHJlY3Vyc2lvbl9saW1pdF8pOworICArK3JlY3Vyc2lvbl9idWRnZXRfOworfQorCitpbmxpbmUgdm9pZCBDb2RlZElucHV0U3RyZWFtOjpTZXRFeHRlbnNpb25SZWdpc3RyeShjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KSB7CisgIGV4dGVuc2lvbl9wb29sXyA9IHBvb2w7CisgIGV4dGVuc2lvbl9mYWN0b3J5XyA9IGZhY3Rvcnk7Cit9CisKK2lubGluZSBjb25zdCBEZXNjcmlwdG9yUG9vbCogQ29kZWRJbnB1dFN0cmVhbTo6R2V0RXh0ZW5zaW9uUG9vbCgpIHsKKyAgcmV0dXJuIGV4dGVuc2lvbl9wb29sXzsKK30KKworaW5saW5lIE1lc3NhZ2VGYWN0b3J5KiBDb2RlZElucHV0U3RyZWFtOjpHZXRFeHRlbnNpb25GYWN0b3J5KCkgeworICByZXR1cm4gZXh0ZW5zaW9uX2ZhY3RvcnlfOworfQorCitpbmxpbmUgaW50IENvZGVkSW5wdXRTdHJlYW06OkJ1ZmZlclNpemUoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGJ1ZmZlcl9lbmRfIC0gYnVmZmVyXyk7Cit9CisKK2lubGluZSBDb2RlZElucHV0U3RyZWFtOjpDb2RlZElucHV0U3RyZWFtKFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KQorICAgIDogYnVmZmVyXyhudWxscHRyKSwKKyAgICAgIGJ1ZmZlcl9lbmRfKG51bGxwdHIpLAorICAgICAgaW5wdXRfKGlucHV0KSwKKyAgICAgIHRvdGFsX2J5dGVzX3JlYWRfKDApLAorICAgICAgb3ZlcmZsb3dfYnl0ZXNfKDApLAorICAgICAgbGFzdF90YWdfKDApLAorICAgICAgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF8oZmFsc2UpLAorICAgICAgYWxpYXNpbmdfZW5hYmxlZF8oZmFsc2UpLAorICAgICAgY3VycmVudF9saW1pdF8oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkpLAorICAgICAgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfKDApLAorICAgICAgdG90YWxfYnl0ZXNfbGltaXRfKGtEZWZhdWx0VG90YWxCeXRlc0xpbWl0KSwKKyAgICAgIHJlY3Vyc2lvbl9idWRnZXRfKGRlZmF1bHRfcmVjdXJzaW9uX2xpbWl0XyksCisgICAgICByZWN1cnNpb25fbGltaXRfKGRlZmF1bHRfcmVjdXJzaW9uX2xpbWl0XyksCisgICAgICBleHRlbnNpb25fcG9vbF8obnVsbHB0ciksCisgICAgICBleHRlbnNpb25fZmFjdG9yeV8obnVsbHB0cikgeworICAvLyBFYWdlcmx5IFJlZnJlc2goKSBzbyBidWZmZXIgc3BhY2UgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLgorICBSZWZyZXNoKCk7Cit9CisKK2lubGluZSBDb2RlZElucHV0U3RyZWFtOjpDb2RlZElucHV0U3RyZWFtKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwgaW50IHNpemUpCisgICAgOiBidWZmZXJfKGJ1ZmZlciksCisgICAgICBidWZmZXJfZW5kXyhidWZmZXIgKyBzaXplKSwKKyAgICAgIGlucHV0XyhudWxscHRyKSwKKyAgICAgIHRvdGFsX2J5dGVzX3JlYWRfKHNpemUpLAorICAgICAgb3ZlcmZsb3dfYnl0ZXNfKDApLAorICAgICAgbGFzdF90YWdfKDApLAorICAgICAgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF8oZmFsc2UpLAorICAgICAgYWxpYXNpbmdfZW5hYmxlZF8oZmFsc2UpLAorICAgICAgY3VycmVudF9saW1pdF8oc2l6ZSksCisgICAgICBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8oMCksCisgICAgICB0b3RhbF9ieXRlc19saW1pdF8oa0RlZmF1bHRUb3RhbEJ5dGVzTGltaXQpLAorICAgICAgcmVjdXJzaW9uX2J1ZGdldF8oZGVmYXVsdF9yZWN1cnNpb25fbGltaXRfKSwKKyAgICAgIHJlY3Vyc2lvbl9saW1pdF8oZGVmYXVsdF9yZWN1cnNpb25fbGltaXRfKSwKKyAgICAgIGV4dGVuc2lvbl9wb29sXyhudWxscHRyKSwKKyAgICAgIGV4dGVuc2lvbl9mYWN0b3J5XyhudWxscHRyKSB7CisgIC8vIE5vdGUgdGhhdCBzZXR0aW5nIGN1cnJlbnRfbGltaXRfID09IHNpemUgaXMgaW1wb3J0YW50IHRvIHByZXZlbnQgc29tZQorICAvLyBjb2RlIHBhdGhzIGZyb20gdHJ5aW5nIHRvIGFjY2VzcyBpbnB1dF8gYW5kIHNlZ2ZhdWx0aW5nLgorfQorCitpbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpJc0ZsYXQoKSBjb25zdCB7IHJldHVybiBpbnB1dF8gPT0gbnVsbHB0cjsgfQorCitpbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpTa2lwKGludCBjb3VudCkgeworICBpZiAoY291bnQgPCAwKSByZXR1cm4gZmFsc2U7ICAvLyBzZWN1cml0eTogY291bnQgaXMgb2Z0ZW4gdXNlci1zdXBwbGllZAorCisgIGNvbnN0IGludCBvcmlnaW5hbF9idWZmZXJfc2l6ZSA9IEJ1ZmZlclNpemUoKTsKKworICBpZiAoY291bnQgPD0gb3JpZ2luYWxfYnVmZmVyX3NpemUpIHsKKyAgICAvLyBKdXN0IHNraXBwaW5nIHdpdGhpbiB0aGUgY3VycmVudCBidWZmZXIuICBFYXN5LgorICAgIEFkdmFuY2UoY291bnQpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIFNraXBGYWxsYmFjayhjb3VudCwgb3JpZ2luYWxfYnVmZmVyX3NpemUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgU3RyZWFtLCBjbGFzcz4KK2lubGluZSBDb2RlZE91dHB1dFN0cmVhbTo6Q29kZWRPdXRwdXRTdHJlYW0oU3RyZWFtKiBzdHJlYW0pCisgICAgOiBpbXBsXyhzdHJlYW0sIElzRGVmYXVsdFNlcmlhbGl6YXRpb25EZXRlcm1pbmlzdGljKCksICZjdXJfKSwKKyAgICAgIHN0YXJ0X2NvdW50XyhzdHJlYW0tPkJ5dGVDb3VudCgpKSB7CisgIEluaXRFYWdlcmx5KHN0cmVhbSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBTdHJlYW0sIGNsYXNzPgoraW5saW5lIENvZGVkT3V0cHV0U3RyZWFtOjpDb2RlZE91dHB1dFN0cmVhbShTdHJlYW0qIHN0cmVhbSwgYm9vbCBlYWdlcl9pbml0KQorICAgIDogaW1wbF8oc3RyZWFtLCBJc0RlZmF1bHRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYygpLCAmY3VyXyksCisgICAgICBzdGFydF9jb3VudF8oc3RyZWFtLT5CeXRlQ291bnQoKSkgeworICBpZiAoZWFnZXJfaW5pdCkgeworICAgIEluaXRFYWdlcmx5KHN0cmVhbSk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIFN0cmVhbT4KK2lubGluZSB2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpJbml0RWFnZXJseShTdHJlYW0qIHN0cmVhbSkgeworICB2b2lkKiBkYXRhOworICBpbnQgc2l6ZTsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdHJlYW0tPk5leHQoJmRhdGEsICZzaXplKSAmJiBzaXplID4gMCkpIHsKKyAgICBjdXJfID0gaW1wbF8uU2V0SW5pdGlhbEJ1ZmZlcihkYXRhLCBzaXplKTsKKyAgfQorfQorCitpbmxpbmUgdWludDhfdCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KHVpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIEVwc0NvcHlPdXRwdXRTdHJlYW06OlVuc2FmZVZhcmludCh2YWx1ZSwgdGFyZ2V0KTsKK30KKworaW5saW5lIHVpbnQ4X3QqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheU91dE9mTGluZSgKKyAgICB1aW50MzJfdCB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KSB7CisgIHRhcmdldFswXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHZhbHVlKTsKKyAgaWYgKHZhbHVlIDwgMHg4MCkgeworICAgIHJldHVybiB0YXJnZXQgKyAxOworICB9IGVsc2UgeworICAgIHJldHVybiBXcml0ZVZhcmludDMyVG9BcnJheU91dE9mTGluZUhlbHBlcih2YWx1ZSwgdGFyZ2V0KTsKKyAgfQorfQorCitpbmxpbmUgdWludDhfdCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50NjRUb0FycmF5KHVpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIEVwc0NvcHlPdXRwdXRTdHJlYW06OlVuc2FmZVZhcmludCh2YWx1ZSwgdGFyZ2V0KTsKK30KKworaW5saW5lIHZvaWQgQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWQoaW50MzJfdCB2YWx1ZSkgeworICBXcml0ZVZhcmludDY0KHN0YXRpY19jYXN0PHVpbnQ2NF90Pih2YWx1ZSkpOworfQorCitpbmxpbmUgdWludDhfdCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWRUb0FycmF5KAorICAgIGludDMyX3QgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gV3JpdGVWYXJpbnQ2NFRvQXJyYXkoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHZhbHVlKSwgdGFyZ2V0KTsKK30KKworaW5saW5lIHVpbnQ4X3QqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjMyVG9BcnJheSh1aW50MzJfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisjaWYgZGVmaW5lZChQUk9UT0JVRl9MSVRUTEVfRU5ESUFOKSAmJiBcCisgICAgIWRlZmluZWQoUFJPVE9CVUZfRElTQUJMRV9MSVRUTEVfRU5ESUFOX09QVF9GT1JfVEVTVCkKKyAgbWVtY3B5KHRhcmdldCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKKyNlbHNlCisgIHRhcmdldFswXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHZhbHVlKTsKKyAgdGFyZ2V0WzFdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmFsdWUgPj4gOCk7CisgIHRhcmdldFsyXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHZhbHVlID4+IDE2KTsKKyAgdGFyZ2V0WzNdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmFsdWUgPj4gMjQpOworI2VuZGlmCisgIHJldHVybiB0YXJnZXQgKyBzaXplb2YodmFsdWUpOworfQorCitpbmxpbmUgdWludDhfdCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuNjRUb0FycmF5KHVpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0xJVFRMRV9FTkRJQU4pICYmIFwKKyAgICAhZGVmaW5lZChQUk9UT0JVRl9ESVNBQkxFX0xJVFRMRV9FTkRJQU5fT1BUX0ZPUl9URVNUKQorICBtZW1jcHkodGFyZ2V0LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworI2Vsc2UKKyAgdWludDMyX3QgcGFydDAgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUpOworICB1aW50MzJfdCBwYXJ0MSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWx1ZSA+PiAzMik7CisKKyAgdGFyZ2V0WzBdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocGFydDApOworICB0YXJnZXRbMV0gPSBzdGF0aWNfY2FzdDx1aW50OF90PihwYXJ0MCA+PiA4KTsKKyAgdGFyZ2V0WzJdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocGFydDAgPj4gMTYpOworICB0YXJnZXRbM10gPSBzdGF0aWNfY2FzdDx1aW50OF90PihwYXJ0MCA+PiAyNCk7CisgIHRhcmdldFs0XSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHBhcnQxKTsKKyAgdGFyZ2V0WzVdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocGFydDEgPj4gOCk7CisgIHRhcmdldFs2XSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHBhcnQxID4+IDE2KTsKKyAgdGFyZ2V0WzddID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocGFydDEgPj4gMjQpOworI2VuZGlmCisgIHJldHVybiB0YXJnZXQgKyBzaXplb2YodmFsdWUpOworfQorCitpbmxpbmUgdm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMih1aW50MzJfdCB2YWx1ZSkgeworICBjdXJfID0gaW1wbF8uRW5zdXJlU3BhY2UoY3VyXyk7CisgIFNldEN1cihXcml0ZVZhcmludDMyVG9BcnJheSh2YWx1ZSwgQ3VyKCkpKTsKK30KKworaW5saW5lIHZvaWQgQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50NjQodWludDY0X3QgdmFsdWUpIHsKKyAgY3VyXyA9IGltcGxfLkVuc3VyZVNwYWNlKGN1cl8pOworICBTZXRDdXIoV3JpdGVWYXJpbnQ2NFRvQXJyYXkodmFsdWUsIEN1cigpKSk7Cit9CisKK2lubGluZSB2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVRhZyh1aW50MzJfdCB2YWx1ZSkgeworICBXcml0ZVZhcmludDMyKHZhbHVlKTsKK30KKworaW5saW5lIHVpbnQ4X3QqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVRhZ1RvQXJyYXkodWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIFdyaXRlVmFyaW50MzJUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQorCitpbmxpbmUgc2l6ZV90IENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIodWludDMyX3QgdmFsdWUpIHsKKyAgLy8gVGhpcyBjb21wdXRlcyB2YWx1ZSA9PSAwID8gMSA6IGZsb29yKGxvZzIodmFsdWUpKSAvIDcgKyAxCisgIC8vIFVzZSBhbiBleHBsaWNpdCBtdWx0aXBsaWNhdGlvbiB0byBpbXBsZW1lbnQgdGhlIGRpdmlkZSBvZgorICAvLyBhIG51bWJlciBpbiB0aGUgMS4uMzEgcmFuZ2UuCisgIC8vIEV4cGxpY2l0IE9SIDB4MSB0byBhdm9pZCBjYWxsaW5nIEJpdHM6OkxvZzJGbG9vck5vblplcm8oMCksIHdoaWNoIGlzCisgIC8vIHVuZGVmaW5lZC4KKyAgdWludDMyX3QgbG9nMnZhbHVlID0gQml0czo6TG9nMkZsb29yTm9uWmVybyh2YWx1ZSB8IDB4MSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KChsb2cydmFsdWUgKiA5ICsgNzMpIC8gNjQpOworfQorCitpbmxpbmUgc2l6ZV90IENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzJQbHVzT25lKHVpbnQzMl90IHZhbHVlKSB7CisgIC8vIFNhbWUgYXMgYWJvdmUsIGJ1dCBvbmUgbW9yZS4KKyAgdWludDMyX3QgbG9nMnZhbHVlID0gQml0czo6TG9nMkZsb29yTm9uWmVybyh2YWx1ZSB8IDB4MSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KChsb2cydmFsdWUgKiA5ICsgNzMgKyA2NCkgLyA2NCk7Cit9CisKK2lubGluZSBzaXplX3QgQ29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemU2NCh1aW50NjRfdCB2YWx1ZSkgeworICAvLyBUaGlzIGNvbXB1dGVzIHZhbHVlID09IDAgPyAxIDogZmxvb3IobG9nMih2YWx1ZSkpIC8gNyArIDEKKyAgLy8gVXNlIGFuIGV4cGxpY2l0IG11bHRpcGxpY2F0aW9uIHRvIGltcGxlbWVudCB0aGUgZGl2aWRlIG9mCisgIC8vIGEgbnVtYmVyIGluIHRoZSAxLi42MyByYW5nZS4KKyAgLy8gRXhwbGljaXQgT1IgMHgxIHRvIGF2b2lkIGNhbGxpbmcgQml0czo6TG9nMkZsb29yTm9uWmVybygwKSwgd2hpY2ggaXMKKyAgLy8gdW5kZWZpbmVkLgorICB1aW50MzJfdCBsb2cydmFsdWUgPSBCaXRzOjpMb2cyRmxvb3JOb25aZXJvNjQodmFsdWUgfCAweDEpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PigobG9nMnZhbHVlICogOSArIDczKSAvIDY0KTsKK30KKworaW5saW5lIHNpemVfdCBDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTY0UGx1c09uZSh1aW50NjRfdCB2YWx1ZSkgeworICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgb25lIG1vcmUuCisgIHVpbnQzMl90IGxvZzJ2YWx1ZSA9IEJpdHM6OkxvZzJGbG9vck5vblplcm82NCh2YWx1ZSB8IDB4MSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KChsb2cydmFsdWUgKiA5ICsgNzMgKyA2NCkgLyA2NCk7Cit9CisKK2lubGluZSBzaXplX3QgQ29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMlNpZ25FeHRlbmRlZChpbnQzMl90IHZhbHVlKSB7CisgIHJldHVybiBWYXJpbnRTaXplNjQoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGludDY0X3R7dmFsdWV9KSk7Cit9CisKK2lubGluZSBzaXplX3QgQ29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMlNpZ25FeHRlbmRlZFBsdXNPbmUoCisgICAgaW50MzJfdCB2YWx1ZSkgeworICByZXR1cm4gVmFyaW50U2l6ZTY0UGx1c09uZShzdGF0aWNfY2FzdDx1aW50NjRfdD4oaW50NjRfdHt2YWx1ZX0pKTsKK30KKworaW5saW5lIHZvaWQgQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgV3JpdGVSYXcoc3RyLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihzdHIuc2l6ZSgpKSk7Cit9CisKK2lubGluZSB2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVJhd01heWJlQWxpYXNlZChjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSB7CisgIGN1cl8gPSBpbXBsXy5Xcml0ZVJhd01heWJlQWxpYXNlZChkYXRhLCBzaXplLCBjdXJfKTsKK30KKworaW5saW5lIHVpbnQ4X3QqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVJhd1RvQXJyYXkoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpIHsKKyAgbWVtY3B5KHRhcmdldCwgZGF0YSwgc2l6ZSk7CisgIHJldHVybiB0YXJnZXQgKyBzaXplOworfQorCitpbmxpbmUgdWludDhfdCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlU3RyaW5nVG9BcnJheShjb25zdCBzdGQ6OnN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBXcml0ZVJhd1RvQXJyYXkoc3RyLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihzdHIuc2l6ZSgpKSwgdGFyZ2V0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDEzMDAgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKKyNwcmFnbWEgcnVudGltZV9jaGVja3MoImMiLCByZXN0b3JlKQorI2VuZGlmICAvLyBfTVNDX1ZFUiAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JT19DT0RFRF9TVFJFQU1fSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMmJmNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDEzNDggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGVzdHMgYW5kIGJlbmNobWFya3MuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworbmFtZXNwYWNlIHsKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEYXRhLURyaXZlbiBUZXN0IEluZnJhc3RydWN0dXJlCisKKy8vIFRFU1RfMUQgYW5kIFRFU1RfMkQgYXJlIG1hY3JvcyBJJ2QgZXZlbnR1YWxseSBsaWtlIHRvIHNlZSBhZGRlZCB0bworLy8gZ1Rlc3QuICBUaGVzZSBtYWNyb3MgY2FuIGJlIHVzZWQgdG8gZGVjbGFyZSB0ZXN0cyB3aGljaCBzaG91bGQgYmUKKy8vIHJ1biBtdWx0aXBsZSB0aW1lcywgb25jZSBmb3IgZWFjaCBpdGVtIGluIHNvbWUgaW5wdXQgYXJyYXkuICBURVNUXzFECisvLyB0ZXN0cyBhbGwgY2FzZXMgaW4gYSBzaW5nbGUgaW5wdXQgYXJyYXkuICBURVNUXzJEIHRlc3RzIGFsbAorLy8gY29tYmluYXRpb25zIG9mIGNhc2VzIGZyb20gdHdvIGFycmF5cy4gIFRoZSBhcnJheXMgbXVzdCBiZSBzdGF0aWNhbGx5CisvLyBkZWZpbmVkIHN1Y2ggdGhhdCB0aGUgR09PR0xFX0FSUkFZU0laRSgpIG1hY3JvIHdvcmtzIG9uIHRoZW0uICBFeGFtcGxlOgorLy8KKy8vIGludCBrQ2FzZXNbXSA9IHsxLCAyLCAzLCA0fQorLy8gVEVTVF8xRChNeUZpeHR1cmUsIE15VGVzdCwga0Nhc2VzKSB7CisvLyAgIEVYUEVDVF9HVChrQ2FzZXNfY2FzZSwgMCk7CisvLyB9CisvLworLy8gVGhpcyB0ZXN0IGl0ZXJhdGVzIHRocm91Z2ggdGhlIG51bWJlcnMgMSwgMiwgMywgYW5kIDQgYW5kIHRlc3RzIHRoYXQKKy8vIHRoZXkgYXJlIGFsbCBncmF0ZXIgdGhhbiB6ZXJvLiAgSW4gY2FzZSBvZiBmYWlsdXJlLCB0aGUgZXhhY3QgY2FzZQorLy8gd2hpY2ggZmFpbGVkIHdpbGwgYmUgcHJpbnRlZC4gIFRoZSBjYXNlIHR5cGUgbXVzdCBiZSBwcmludGFibGUgdXNpbmcKKy8vIG9zdHJlYW06Om9wZXJhdG9yPDwuCisKKy8vIFRPRE8oa2VudG9uKTogIGdUZXN0IG5vdyBzdXBwb3J0cyAicGFyYW1ldGVyaXplZCB0ZXN0cyIgd2hpY2ggd291bGQgYmUKKy8vICAgYSBiZXR0ZXIgd2F5IHRvIGFjY29tcGxpc2ggdGhpcy4gIFJld3JpdGUgd2hlbiB0aW1lIHBlcm1pdHMuCisKKyNkZWZpbmUgVEVTVF8xRChGSVhUVVJFLCBOQU1FLCBDQVNFUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgRklYVFVSRSMjXyMjTkFNRSMjX0REIDogcHVibGljIEZJWFRVUkUgeyAgICAgICAgICAgICAgICAgIFwKKyAgIHByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FzZVR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2b2lkIERvU2luZ2xlQ2FzZShjb25zdCBDYXNlVHlwZSYgQ0FTRVMjI19jYXNlKTsgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEVTVF9GKEZJWFRVUkUjI18jI05BTUUjI19ERCwgTkFNRSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEdPT0dMRV9BUlJBWVNJWkUoQ0FTRVMpOyBpKyspIHsgICAgICAgICAgICAgICBcCisgICAgICBTQ09QRURfVFJBQ0UodGVzdGluZzo6TWVzc2FnZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgPDwgI0NBU0VTICIgY2FzZSAjIiA8PCBpIDw8ICI6ICIgPDwgQ0FTRVNbaV0pOyBcCisgICAgICBEb1NpbmdsZUNhc2UoQ0FTRVNbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYXNlVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgRklYVFVSRSMjXyMjTkFNRSMjX0REOjpEb1NpbmdsZUNhc2UoY29uc3QgQ2FzZVR5cGUmIENBU0VTIyNfY2FzZSkKKworI2RlZmluZSBURVNUXzJEKEZJWFRVUkUsIE5BTUUsIENBU0VTMSwgQ0FTRVMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgRklYVFVSRSMjXyMjTkFNRSMjX0REIDogcHVibGljIEZJWFRVUkUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYXNlVHlwZTEsIHR5cGVuYW1lIENhc2VUeXBlMj4gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2b2lkIERvU2luZ2xlQ2FzZShjb25zdCBDYXNlVHlwZTEmIENBU0VTMSMjX2Nhc2UsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FzZVR5cGUyJiBDQVNFUzIjI19jYXNlKTsgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRFU1RfRihGSVhUVVJFIyNfIyNOQU1FIyNfREQsIE5BTUUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShDQVNFUzEpOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IEdPT0dMRV9BUlJBWVNJWkUoQ0FTRVMyKTsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICA8PCAjQ0FTRVMxICIgY2FzZSAjIiA8PCBpIDw8ICI6ICIgPDwgQ0FTRVMxW2ldIDw8ICIsICIgXAorICAgICAgICAgICAgICAgICAgICAgPDwgI0NBU0VTMiAiIGNhc2UgIyIgPDwgaiA8PCAiOiAiIDw8IENBU0VTMltqXSk7ICAgICAgIFwKKyAgICAgICAgRG9TaW5nbGVDYXNlKENBU0VTMVtpXSwgQ0FTRVMyW2pdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FzZVR5cGUxLCB0eXBlbmFtZSBDYXNlVHlwZTI+ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBGSVhUVVJFIyNfIyNOQU1FIyNfREQ6OkRvU2luZ2xlQ2FzZShjb25zdCBDYXNlVHlwZTEmIENBU0VTMSMjX2Nhc2UsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FzZVR5cGUyJiBDQVNFUzIjI19jYXNlKQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIENvZGVkU3RyZWFtVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIEJ1ZmZlciB1c2VkIGR1cmluZyBtb3N0IG9mIHRoZSB0ZXN0cy4gVGhpcyBhc3N1bWVzIHRlc3RzIHJ1biBzZXF1ZW50aWFsbHkuCisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtCdWZmZXJTaXplID0gMTAyNCAqIDY0OworICBzdGF0aWMgdWludDhfdCBidWZmZXJfW2tCdWZmZXJTaXplXTsKK307CisKK3VpbnQ4X3QgQ29kZWRTdHJlYW1UZXN0OjpidWZmZXJfW0NvZGVkU3RyZWFtVGVzdDo6a0J1ZmZlclNpemVdOworCisvLyBXZSB0ZXN0IGVhY2ggb3BlcmF0aW9uIG92ZXIgYSB2YXJpZXR5IG9mIGJsb2NrIHNpemVzIHRvIGluc3VyZSB0aGF0CisvLyB3ZSB0ZXN0IGNhc2VzIHdoZXJlIHJlYWRzIG9yIHdyaXRlcyBjcm9zcyBidWZmZXIgYm91bmRhcmllcywgY2FzZXMKKy8vIHdoZXJlIHRoZXkgZG9uJ3QsIGFuZCBjYXNlcyB3aGVyZSB0aGVyZSBpcyBzbyBtdWNoIGJ1ZmZlciBsZWZ0IHRoYXQKKy8vIHdlIGNhbiB1c2Ugc3BlY2lhbCBvcHRpbWl6ZWQgcGF0aHMgdGhhdCBkb24ndCB3b3JyeSBhYm91dCBib3VuZHMKKy8vIGNoZWNrcy4KK2NvbnN0IGludCBrQmxvY2tTaXplc1tdID0gezEsIDIsIDMsIDUsIDcsIDEzLCAzMiwgMTAyNH07CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmFyaW50IHRlc3RzLgorCitzdHJ1Y3QgVmFyaW50Q2FzZSB7CisgIHVpbnQ4X3QgYnl0ZXNbMTBdOyAgLy8gRW5jb2RlZCBieXRlcy4KKyAgc2l6ZV90IHNpemU7ICAgICAgICAvLyBFbmNvZGVkIHNpemUsIGluIGJ5dGVzLgorICB1aW50NjRfdCB2YWx1ZTsgICAgIC8vIFBhcnNlZCB2YWx1ZS4KK307CisKK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVmFyaW50Q2FzZSYgYykgeworICByZXR1cm4gb3MgPDwgYy52YWx1ZTsKK30KKworVmFyaW50Q2FzZSBrVmFyaW50Q2FzZXNbXSA9IHsKKyAgICAvLyAzMi1iaXQgdmFsdWVzCisgICAge3sweDAwfSwgMSwgMH0sCisgICAge3sweDAxfSwgMSwgMX0sCisgICAge3sweDdmfSwgMSwgMTI3fSwKKyAgICB7ezB4YTIsIDB4NzR9LCAyLCAoMHgyMiA8PCAwKSB8ICgweDc0IDw8IDcpfSwgIC8vIDE0ODgyCisgICAge3sweGJlLCAweGY3LCAweDkyLCAweDg0LCAweDBifSwKKyAgICAgNSwgIC8vIDI5NjE0ODg4MzAKKyAgICAgKDB4M2UgPDwgMCkgfCAoMHg3NyA8PCA3KSB8ICgweDEyIDw8IDE0KSB8ICgweDA0IDw8IDIxKSB8CisgICAgICAgICAodWludDY0X3R7MHgwYnV9IDw8IDI4KX0sCisKKyAgICAvLyA2NC1iaXQKKyAgICB7ezB4YmUsIDB4ZjcsIDB4OTIsIDB4ODQsIDB4MWJ9LAorICAgICA1LCAgLy8gNzI1NjQ1NjEyNgorICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKKyAgICAgICAgICh1aW50NjRfdHsweDFidX0gPDwgMjgpfSwKKyAgICB7ezB4ODAsIDB4ZTYsIDB4ZWIsIDB4OWMsIDB4YzMsIDB4YzksIDB4YTQsIDB4NDl9LAorICAgICA4LCAgLy8gNDEyNTYyMDI1ODA3MTgzMzYKKyAgICAgKDB4MDAgPDwgMCkgfCAoMHg2NiA8PCA3KSB8ICgweDZiIDw8IDE0KSB8ICgweDFjIDw8IDIxKSB8CisgICAgICAgICAodWludDY0X3R7MHg0M3V9IDw8IDI4KSB8ICh1aW50NjRfdHsweDQ5dX0gPDwgMzUpIHwKKyAgICAgICAgICh1aW50NjRfdHsweDI0dX0gPDwgNDIpIHwgKHVpbnQ2NF90ezB4NDl1fSA8PCA0OSl9LAorICAgIC8vIDExOTY0Mzc4MzMwOTc4NzM1MTMxCisgICAge3sweDliLCAweGE4LCAweGY5LCAweGMyLCAweGJiLCAweGQ2LCAweDgwLCAweDg1LCAweGE2LCAweDAxfSwKKyAgICAgMTAsCisgICAgICgweDFiIDw8IDApIHwgKDB4MjggPDwgNykgfCAoMHg3OSA8PCAxNCkgfCAoMHg0MiA8PCAyMSkgfAorICAgICAgICAgKHVpbnQ2NF90ezB4M2J1fSA8PCAyOCkgfCAodWludDY0X3R7MHg1NnV9IDw8IDM1KSB8CisgICAgICAgICAodWludDY0X3R7MHgwMHV9IDw8IDQyKSB8ICh1aW50NjRfdHsweDA1dX0gPDwgNDkpIHwKKyAgICAgICAgICh1aW50NjRfdHsweDI2dX0gPDwgNTYpIHwgKHVpbnQ2NF90ezB4MDF1fSA8PCA2Myl9LAorfTsKKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRWYXJpbnQzMiwga1ZhcmludENhc2VzLCBrQmxvY2tTaXplcykgeworICBtZW1jcHkoYnVmZmVyXywga1ZhcmludENhc2VzX2Nhc2UuYnl0ZXMsIGtWYXJpbnRDYXNlc19jYXNlLnNpemUpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIHVpbnQzMl90IHZhbHVlOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRWYXJpbnQzMigmdmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGtWYXJpbnRDYXNlc19jYXNlLnZhbHVlKSwgdmFsdWUpOworICB9CisKKyAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnNpemUsIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRUYWcsIGtWYXJpbnRDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtWYXJpbnRDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50Q2FzZXNfY2FzZS5zaXplKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICB1aW50MzJfdCBleHBlY3RlZF92YWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihrVmFyaW50Q2FzZXNfY2FzZS52YWx1ZSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkX3ZhbHVlLCBjb2RlZF9pbnB1dC5SZWFkVGFnKCkpOworCisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuTGFzdFRhZ1dhcyhleHBlY3RlZF92YWx1ZSkpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5MYXN0VGFnV2FzKGV4cGVjdGVkX3ZhbHVlICsgMSkpOworICB9CisKKyAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnNpemUsIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworLy8gVGhpcyBpcyB0aGUgcmVncmVzc2lvbiB0ZXN0IHRoYXQgdmVyaWZpZXMgdGhhdCB0aGVyZSBpcyBubyBpc3N1ZXMKKy8vIHdpdGggdGhlIGVtcHR5IGlucHV0IGJ1ZmZlcnMgaGFuZGxpbmcuCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBFbXB0eUlucHV0QmVmb3JlRW9zKSB7CisgIGNsYXNzIEluIDogcHVibGljIFplcm9Db3B5SW5wdXRTdHJlYW0geworICAgcHVibGljOgorICAgIEluKCkgOiBjb3VudF8oMCkge30KKworICAgcHJpdmF0ZToKKyAgICBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgb3ZlcnJpZGUgeworICAgICAgKmRhdGEgPSBudWxscHRyOworICAgICAgKnNpemUgPSAwOworICAgICAgcmV0dXJuIGNvdW50XysrIDwgMjsKKyAgICB9CisgICAgdm9pZCBCYWNrVXAoaW50IGNvdW50KSBvdmVycmlkZSB7IEdPT0dMRV9MT0coRkFUQUwpIDw8ICJUZXN0cyBuZXZlciBjYWxsIHRoaXMuIjsgfQorICAgIGJvb2wgU2tpcChpbnQgY291bnQpIG92ZXJyaWRlIHsKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJUZXN0cyBuZXZlciBjYWxsIHRoaXMuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaW50NjRfdCBCeXRlQ291bnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAwOyB9CisgICAgaW50IGNvdW50XzsKKyAgfSBpbjsKKyAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmaW4pOworICBpbnB1dC5SZWFkVGFnTm9MYXN0VGFnKCk7CisgIEVYUEVDVF9UUlVFKGlucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKTsKK30KKworVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIEV4cGVjdFRhZywga1ZhcmludENhc2VzKSB7CisgIC8vIExlYXZlIG9uZSBieXRlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBzbyB3ZSBjYW4gcmVhZCBpdAorICAvLyB0byBmb3JjZSB0aGUgZmlyc3QgYnVmZmVyIHRvIGJlIGxvYWRlZC4KKyAgYnVmZmVyX1swXSA9ICdcMCc7CisgIG1lbWNweShidWZmZXJfICsgMSwga1ZhcmludENhc2VzX2Nhc2UuYnl0ZXMsIGtWYXJpbnRDYXNlc19jYXNlLnNpemUpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIC8vIFJlYWQgb25lIGJ5dGUgdG8gZm9yY2UgY29kZWRfaW5wdXQuUmVmaWxsKCkgdG8gYmUgY2FsbGVkLiAgT3RoZXJ3aXNlLAorICAgIC8vIEV4cGVjdFRhZygpIHdpbGwgcmV0dXJuIGEgZmFsc2UgbmVnYXRpdmUuCisgICAgdWludDhfdCBkdW1teTsKKyAgICBjb2RlZF9pbnB1dC5SZWFkUmF3KCZkdW1teSwgMSk7CisgICAgRVhQRUNUX0VRKCh1aW50KSdcMCcsICh1aW50KWR1bW15KTsKKworICAgIHVpbnQzMl90IGV4cGVjdGVkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGtWYXJpbnRDYXNlc19jYXNlLnZhbHVlKTsKKworICAgIC8vIEV4cGVjdFRhZygpIHByb2R1Y2VzIGZhbHNlIG5lZ2F0aXZlcyBmb3IgbGFyZ2UgdmFsdWVzLgorICAgIGlmIChrVmFyaW50Q2FzZXNfY2FzZS5zaXplIDw9IDIpIHsKKyAgICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5FeHBlY3RUYWcoZXhwZWN0ZWRfdmFsdWUgKyAxKSk7CisgICAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5FeHBlY3RUYWcoZXhwZWN0ZWRfdmFsdWUpKTsKKyAgICB9IGVsc2UgeworICAgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkV4cGVjdFRhZyhleHBlY3RlZF92YWx1ZSkpOworICAgIH0KKyAgfQorCisgIGlmIChrVmFyaW50Q2FzZXNfY2FzZS5zaXplIDw9IDIpIHsKKyAgICBFWFBFQ1RfRVEoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSArIDEsIGlucHV0LkJ5dGVDb3VudCgpKTsKKyAgfSBlbHNlIHsKKyAgICBFWFBFQ1RfRVEoMSwgaW5wdXQuQnl0ZUNvdW50KCkpOworICB9Cit9CisKK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBFeHBlY3RUYWdGcm9tQXJyYXksIGtWYXJpbnRDYXNlcykgeworICBtZW1jcHkoYnVmZmVyXywga1ZhcmludENhc2VzX2Nhc2UuYnl0ZXMsIGtWYXJpbnRDYXNlc19jYXNlLnNpemUpOworCisgIGNvbnN0IHVpbnQzMl90IGV4cGVjdGVkX3ZhbHVlID0KKyAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihrVmFyaW50Q2FzZXNfY2FzZS52YWx1ZSk7CisKKyAgLy8gSWYgdGhlIGV4cGVjdGF0aW9uIHN1Y2NlZWRzLCBpdCBzaG91bGQgcmV0dXJuIGEgcG9pbnRlciBwYXN0IHRoZSB0YWcuCisgIGlmIChrVmFyaW50Q2FzZXNfY2FzZS5zaXplIDw9IDIpIHsKKyAgICBFWFBFQ1RfVFJVRShudWxscHRyID09IENvZGVkSW5wdXRTdHJlYW06OkV4cGVjdFRhZ0Zyb21BcnJheSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfLCBleHBlY3RlZF92YWx1ZSArIDEpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXJfICsga1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSA9PQorICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW06OkV4cGVjdFRhZ0Zyb21BcnJheShidWZmZXJfLCBleHBlY3RlZF92YWx1ZSkpOworICB9IGVsc2UgeworICAgIEVYUEVDVF9UUlVFKG51bGxwdHIgPT0KKyAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtOjpFeHBlY3RUYWdGcm9tQXJyYXkoYnVmZmVyXywgZXhwZWN0ZWRfdmFsdWUpKTsKKyAgfQorfQorCitURVNUXzJEKENvZGVkU3RyZWFtVGVzdCwgUmVhZFZhcmludDY0LCBrVmFyaW50Q2FzZXMsIGtCbG9ja1NpemVzKSB7CisgIG1lbWNweShidWZmZXJfLCBrVmFyaW50Q2FzZXNfY2FzZS5ieXRlcywga1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSk7CisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgICAgdWludDY0X3QgdmFsdWU7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFZhcmludDY0KCZ2YWx1ZSkpOworICAgIEVYUEVDVF9FUShrVmFyaW50Q2FzZXNfY2FzZS52YWx1ZSwgdmFsdWUpOworICB9CisKKyAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnNpemUsIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFdyaXRlVmFyaW50MzIsIGtWYXJpbnRDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgaWYgKGtWYXJpbnRDYXNlc19jYXNlLnZhbHVlID4gdWludDY0X3R7MHgwMDAwMDAwMEZGRkZGRkZGdX0pIHsKKyAgICAvLyBTa2lwIHRoaXMgdGVzdCBmb3IgdGhlIDY0LWJpdCB2YWx1ZXMuCisgICAgcmV0dXJuOworICB9CisKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCgmb3V0cHV0KTsKKworICAgIGNvZGVkX291dHB1dC5Xcml0ZVZhcmludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihrVmFyaW50Q2FzZXNfY2FzZS52YWx1ZSkpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9vdXRwdXQuSGFkRXJyb3IoKSk7CisKKyAgICBFWFBFQ1RfRVEoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSwgY29kZWRfb3V0cHV0LkJ5dGVDb3VudCgpKTsKKyAgfQorCisgIEVYUEVDVF9FUShrVmFyaW50Q2FzZXNfY2FzZS5zaXplLCBvdXRwdXQuQnl0ZUNvdW50KCkpOworICBFWFBFQ1RfRVEoMCwKKyAgICAgICAgICAgIG1lbWNtcChidWZmZXJfLCBrVmFyaW50Q2FzZXNfY2FzZS5ieXRlcywga1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSkpOworfQorCitURVNUXzJEKENvZGVkU3RyZWFtVGVzdCwgV3JpdGVWYXJpbnQ2NCwga1ZhcmludENhc2VzLCBrQmxvY2tTaXplcykgeworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXQpOworCisgICAgY29kZWRfb3V0cHV0LldyaXRlVmFyaW50NjQoa1ZhcmludENhc2VzX2Nhc2UudmFsdWUpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9vdXRwdXQuSGFkRXJyb3IoKSk7CisKKyAgICBFWFBFQ1RfRVEoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSwgY29kZWRfb3V0cHV0LkJ5dGVDb3VudCgpKTsKKyAgfQorCisgIEVYUEVDVF9FUShrVmFyaW50Q2FzZXNfY2FzZS5zaXplLCBvdXRwdXQuQnl0ZUNvdW50KCkpOworICBFWFBFQ1RfRVEoMCwKKyAgICAgICAgICAgIG1lbWNtcChidWZmZXJfLCBrVmFyaW50Q2FzZXNfY2FzZS5ieXRlcywga1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSkpOworfQorCisvLyBUaGlzIHRlc3QgY2F1c2VzIGdjYyAzLjMuNSAoYW5kIGVhcmxpZXI/KSB0byBnaXZlIHRoZSBjcnlwdGljIGVycm9yOgorLy8gICAic29ycnksIHVuaW1wbGVtZW50ZWQ6IGBtZXRob2RfY2FsbF9leHByJyBub3Qgc3VwcG9ydGVkIGJ5IGR1bXBfZXhwciIKKyNpZiAhZGVmaW5lZChfX0dOVUNfXykgfHwgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID4gMykKKworaW50MzJfdCBrU2lnbkV4dGVuZGVkVmFyaW50Q2FzZXNbXSA9IHswLCAxLCAtMSwgMTIzNzg5NCwgLTM3ODk1MTM4fTsKKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFdyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWQsIGtTaWduRXh0ZW5kZWRWYXJpbnRDYXNlcywKKyAgICAgICAga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCgmb3V0cHV0KTsKKworICAgIGNvZGVkX291dHB1dC5Xcml0ZVZhcmludDMyU2lnbkV4dGVuZGVkKGtTaWduRXh0ZW5kZWRWYXJpbnRDYXNlc19jYXNlKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfb3V0cHV0LkhhZEVycm9yKCkpOworCisgICAgaWYgKGtTaWduRXh0ZW5kZWRWYXJpbnRDYXNlc19jYXNlIDwgMCkgeworICAgICAgRVhQRUNUX0VRKDEwLCBjb2RlZF9vdXRwdXQuQnl0ZUNvdW50KCkpOworICAgIH0gZWxzZSB7CisgICAgICBFWFBFQ1RfTEUoY29kZWRfb3V0cHV0LkJ5dGVDb3VudCgpLCA1KTsKKyAgICB9CisgIH0KKworICBpZiAoa1NpZ25FeHRlbmRlZFZhcmludENhc2VzX2Nhc2UgPCAwKSB7CisgICAgRVhQRUNUX0VRKDEwLCBvdXRwdXQuQnl0ZUNvdW50KCkpOworICB9IGVsc2UgeworICAgIEVYUEVDVF9MRShvdXRwdXQuQnl0ZUNvdW50KCksIDUpOworICB9CisKKyAgLy8gUmVhZCB2YWx1ZSBiYWNrIGluIGFzIGEgdmFyaW50NjQgYW5kIGluc3VyZSBpdCBtYXRjaGVzLgorICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIHVpbnQ2NF90IHZhbHVlOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRWYXJpbnQ2NCgmdmFsdWUpKTsKKworICAgIEVYUEVDVF9FUShrU2lnbkV4dGVuZGVkVmFyaW50Q2FzZXNfY2FzZSwgc3RhdGljX2Nhc3Q8aW50NjRfdD4odmFsdWUpKTsKKyAgfQorCisgIEVYUEVDVF9FUShvdXRwdXQuQnl0ZUNvdW50KCksIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworI2VuZGlmCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmFyaW50IGZhaWx1cmUgdGVzdC4KKworc3RydWN0IFZhcmludEVycm9yQ2FzZSB7CisgIHVpbnQ4X3QgYnl0ZXNbMTJdOworICBzaXplX3Qgc2l6ZTsKKyAgYm9vbCBjYW5fcGFyc2U7Cit9OworCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFZhcmludEVycm9yQ2FzZSYgYykgeworICByZXR1cm4gb3MgPDwgInNpemUgIiA8PCBjLnNpemU7Cit9CisKK2NvbnN0IFZhcmludEVycm9yQ2FzZSBrVmFyaW50RXJyb3JDYXNlc1tdID0geworICAgIC8vIENvbnRyb2wgY2FzZS4gIChJbnN1cmVzIHRoYXQgdGhlcmUgaXNuJ3Qgc29tZXRoaW5nIGVsc2Ugd3JvbmcgdGhhdAorICAgIC8vIG1ha2VzIHBhcnNpbmcgYWx3YXlzIGZhaWwuKQorICAgIHt7MHgwMH0sIDEsIHRydWV9LAorCisgICAgLy8gTm8gaW5wdXQgZGF0YS4KKyAgICB7e30sIDAsIGZhbHNlfSwKKworICAgIC8vIElucHV0IGVuZHMgdW5leHBlY3RlZGx5LgorICAgIHt7MHhmMCwgMHhhYn0sIDIsIGZhbHNlfSwKKworICAgIC8vIElucHV0IGVuZHMgdW5leHBlY3RlZGx5IGFmdGVyIDMyIGJpdHMuCisgICAge3sweGYwLCAweGFiLCAweGM5LCAweDlhLCAweGY4LCAweGIyfSwgNiwgZmFsc2V9LAorCisgICAgLy8gTG9uZ2VyIHRoYW4gMTAgYnl0ZXMuCisgICAge3sweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAxfSwKKyAgICAgMTEsCisgICAgIGZhbHNlfSwKK307CisKK1RFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkVmFyaW50MzJFcnJvciwga1ZhcmludEVycm9yQ2FzZXMsIGtCbG9ja1NpemVzKSB7CisgIG1lbWNweShidWZmZXJfLCBrVmFyaW50RXJyb3JDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50RXJyb3JDYXNlc19jYXNlLnNpemUpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHN0YXRpY19jYXN0PGludD4oa1ZhcmludEVycm9yQ2FzZXNfY2FzZS5zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc19jYXNlKTsKKyAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgIHVpbnQzMl90IHZhbHVlOworICBFWFBFQ1RfRVEoa1ZhcmludEVycm9yQ2FzZXNfY2FzZS5jYW5fcGFyc2UsIGNvZGVkX2lucHV0LlJlYWRWYXJpbnQzMigmdmFsdWUpKTsKK30KKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRWYXJpbnQzMkVycm9yX0xlYXZlc1ZhbHVlSW5Jbml0aWFsaXplZFN0YXRlLAorICAgICAgICBrVmFyaW50RXJyb3JDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtWYXJpbnRFcnJvckNhc2VzX2Nhc2UuYnl0ZXMsIGtWYXJpbnRFcnJvckNhc2VzX2Nhc2Uuc2l6ZSk7CisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc3RhdGljX2Nhc3Q8aW50PihrVmFyaW50RXJyb3JDYXNlc19jYXNlLnNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtCbG9ja1NpemVzX2Nhc2UpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgdWludDMyX3QgdmFsdWUgPSAwOworICBFWFBFQ1RfRVEoa1ZhcmludEVycm9yQ2FzZXNfY2FzZS5jYW5fcGFyc2UsIGNvZGVkX2lucHV0LlJlYWRWYXJpbnQzMigmdmFsdWUpKTsKKyAgLy8gV2hpbGUgdGhlIHNwZWNpZmljIHZhbHVlIGZvbGxvd2luZyBhIGZhaWx1cmUgaXMgbm90IGNyaXRpY2FsLCB3ZSBkbyB3YW50IHRvCisgIC8vIGVuc3VyZSB0aGF0IGl0IGRvZXNuJ3QgZ2V0IHNldCB0byBhbiB1bmluaXRpYWxpemVkIHZhbHVlLiAoVGhpcyBjaGVjayBmYWlscworICAvLyBpbiBNU0FOIG1vZGUgaWYgdmFsdWUgaGFzIGJlZW4gc2V0IHRvIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWUuKQorICBFWFBFQ1RfRVEodmFsdWUsIHZhbHVlKTsKK30KKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRWYXJpbnQ2NEVycm9yLCBrVmFyaW50RXJyb3JDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtWYXJpbnRFcnJvckNhc2VzX2Nhc2UuYnl0ZXMsIGtWYXJpbnRFcnJvckNhc2VzX2Nhc2Uuc2l6ZSk7CisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc3RhdGljX2Nhc3Q8aW50PihrVmFyaW50RXJyb3JDYXNlc19jYXNlLnNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtCbG9ja1NpemVzX2Nhc2UpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgdWludDY0X3QgdmFsdWU7CisgIEVYUEVDVF9FUShrVmFyaW50RXJyb3JDYXNlc19jYXNlLmNhbl9wYXJzZSwgY29kZWRfaW5wdXQuUmVhZFZhcmludDY0KCZ2YWx1ZSkpOworfQorCitURVNUXzJEKENvZGVkU3RyZWFtVGVzdCwgUmVhZFZhcmludDY0RXJyb3JfTGVhdmVzVmFsdWVJbkluaXRpYWxpemVkU3RhdGUsCisgICAgICAgIGtWYXJpbnRFcnJvckNhc2VzLCBrQmxvY2tTaXplcykgeworICBtZW1jcHkoYnVmZmVyXywga1ZhcmludEVycm9yQ2FzZXNfY2FzZS5ieXRlcywga1ZhcmludEVycm9yQ2FzZXNfY2FzZS5zaXplKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzdGF0aWNfY2FzdDxpbnQ+KGtWYXJpbnRFcnJvckNhc2VzX2Nhc2Uuc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAga0Jsb2NrU2l6ZXNfY2FzZSk7CisgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICB1aW50NjRfdCB2YWx1ZSA9IDA7CisgIEVYUEVDVF9FUShrVmFyaW50RXJyb3JDYXNlc19jYXNlLmNhbl9wYXJzZSwgY29kZWRfaW5wdXQuUmVhZFZhcmludDY0KCZ2YWx1ZSkpOworICAvLyBXaGlsZSB0aGUgc3BlY2lmaWMgdmFsdWUgZm9sbG93aW5nIGEgZmFpbHVyZSBpcyBub3QgY3JpdGljYWwsIHdlIGRvIHdhbnQgdG8KKyAgLy8gZW5zdXJlIHRoYXQgaXQgZG9lc24ndCBnZXQgc2V0IHRvIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWUuIChUaGlzIGNoZWNrIGZhaWxzCisgIC8vIGluIE1TQU4gbW9kZSBpZiB2YWx1ZSBoYXMgYmVlbiBzZXQgdG8gYW4gdW5pbml0aWFsaXplZCB2YWx1ZS4pCisgIEVYUEVDVF9FUSh2YWx1ZSwgdmFsdWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWYXJpbnRTaXplCisKK3N0cnVjdCBWYXJpbnRTaXplQ2FzZSB7CisgIHVpbnQ2NF90IHZhbHVlOworICBpbnQgc2l6ZTsKK307CisKK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVmFyaW50U2l6ZUNhc2UmIGMpIHsKKyAgcmV0dXJuIG9zIDw8IGMudmFsdWU7Cit9CisKK1ZhcmludFNpemVDYXNlIGtWYXJpbnRTaXplQ2FzZXNbXSA9IHsKKyAgICB7MHUsIDF9LAorICAgIHsxdSwgMX0sCisgICAgezEyN3UsIDF9LAorICAgIHsxMjh1LCAyfSwKKyAgICB7NzU4OTIzdSwgM30sCisgICAgezQwMDAwMDAwMDB1LCA1fSwKKyAgICB7dWludDY0X3R7NDEyNTYyMDI1ODA3MTgzMzZ1fSwgOH0sCisgICAge3VpbnQ2NF90ezExOTY0Mzc4MzMwOTc4NzM1MTMxdX0sIDEwfSwKK307CisKK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBWYXJpbnRTaXplMzIsIGtWYXJpbnRTaXplQ2FzZXMpIHsKKyAgaWYgKGtWYXJpbnRTaXplQ2FzZXNfY2FzZS52YWx1ZSA+IDB4ZmZmZmZmZmZ1KSB7CisgICAgLy8gU2tpcCA2NC1iaXQgdmFsdWVzLgorICAgIHJldHVybjsKKyAgfQorCisgIEVYUEVDVF9FUShrVmFyaW50U2l6ZUNhc2VzX2Nhc2Uuc2l6ZSwKKyAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGtWYXJpbnRTaXplQ2FzZXNfY2FzZS52YWx1ZSkpKTsKK30KKworVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFZhcmludFNpemU2NCwga1ZhcmludFNpemVDYXNlcykgeworICBFWFBFQ1RfRVEoa1ZhcmludFNpemVDYXNlc19jYXNlLnNpemUsCisgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTY0KGtWYXJpbnRTaXplQ2FzZXNfY2FzZS52YWx1ZSkpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBWYXJpbnRTaXplMzJQb3dlcnNPZlR3bykgeworICBpbnQgZXhwZWN0ZWQgPSAxOworICBmb3IgKGludCBpID0gMTsgaSA8IDMyOyBpKyspIHsKKyAgICBpZiAoaSAlIDcgPT0gMCkgeworICAgICAgZXhwZWN0ZWQgKz0gMTsKKyAgICB9CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLCBDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PigweDF1IDw8IGkpKSk7CisgIH0KK30KKworVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgVmFyaW50U2l6ZTY0UG93ZXJzT2ZUd28pIHsKKyAgaW50IGV4cGVjdGVkID0gMTsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCA2NDsgaSsrKSB7CisgICAgaWYgKGkgJSA3ID09IDApIHsKKyAgICAgIGV4cGVjdGVkICs9IDE7CisgICAgfQorICAgIEVYUEVDVF9FUShleHBlY3RlZCwgQ29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemU2NCh1aW50NjRfdHsxfSA8PCBpKSk7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRml4ZWQtc2l6ZSBpbnQgdGVzdHMKKworc3RydWN0IEZpeGVkMzJDYXNlIHsKKyAgdWludDhfdCBieXRlc1tzaXplb2YodWludDMyX3QpXTsgIC8vIEVuY29kZWQgYnl0ZXMuCisgIHVpbnQzMl90IHZhbHVlOyAgICAgICAgICAgICAgICAgICAvLyBQYXJzZWQgdmFsdWUuCit9OworCitzdHJ1Y3QgRml4ZWQ2NENhc2UgeworICB1aW50OF90IGJ5dGVzW3NpemVvZih1aW50NjRfdCldOyAgLy8gRW5jb2RlZCBieXRlcy4KKyAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAgIC8vIFBhcnNlZCB2YWx1ZS4KK307CisKK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgRml4ZWQzMkNhc2UmIGMpIHsKKyAgcmV0dXJuIG9zIDw8ICIweCIgPDwgc3RkOjpoZXggPDwgYy52YWx1ZSA8PCBzdGQ6OmRlYzsKK30KKworaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBGaXhlZDY0Q2FzZSYgYykgeworICByZXR1cm4gb3MgPDwgIjB4IiA8PCBzdGQ6OmhleCA8PCBjLnZhbHVlIDw8IHN0ZDo6ZGVjOworfQorCitGaXhlZDMyQ2FzZSBrRml4ZWQzMkNhc2VzW10gPSB7CisgICAge3sweGVmLCAweGNkLCAweGFiLCAweDkwfSwgMHg5MGFiY2RlZnV9LAorICAgIHt7MHgxMiwgMHgzNCwgMHg1NiwgMHg3OH0sIDB4Nzg1NjM0MTJ1fSwKK307CisKK0ZpeGVkNjRDYXNlIGtGaXhlZDY0Q2FzZXNbXSA9IHsKKyAgICB7ezB4ZWYsIDB4Y2QsIDB4YWIsIDB4OTAsIDB4MTIsIDB4MzQsIDB4NTYsIDB4Nzh9LAorICAgICB1aW50NjRfdHsweDc4NTYzNDEyOTBhYmNkZWZ1fX0sCisgICAge3sweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4fSwKKyAgICAgdWludDY0X3R7MHg4ODc3NjY1NTQ0MzMyMjExdX19LAorfTsKKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRMaXR0bGVFbmRpYW4zMiwga0ZpeGVkMzJDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtGaXhlZDMyQ2FzZXNfY2FzZS5ieXRlcywgc2l6ZW9mKGtGaXhlZDMyQ2FzZXNfY2FzZS5ieXRlcykpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIHVpbnQzMl90IHZhbHVlOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoa0ZpeGVkMzJDYXNlc19jYXNlLnZhbHVlLCB2YWx1ZSk7CisgIH0KKworICBFWFBFQ1RfRVEoc2l6ZW9mKHVpbnQzMl90KSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCitURVNUXzJEKENvZGVkU3RyZWFtVGVzdCwgUmVhZExpdHRsZUVuZGlhbjY0LCBrRml4ZWQ2NENhc2VzLCBrQmxvY2tTaXplcykgeworICBtZW1jcHkoYnVmZmVyXywga0ZpeGVkNjRDYXNlc19jYXNlLmJ5dGVzLCBzaXplb2Yoa0ZpeGVkNjRDYXNlc19jYXNlLmJ5dGVzKSk7CisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgICAgdWludDY0X3QgdmFsdWU7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjY0KCZ2YWx1ZSkpOworICAgIEVYUEVDVF9FUShrRml4ZWQ2NENhc2VzX2Nhc2UudmFsdWUsIHZhbHVlKTsKKyAgfQorCisgIEVYUEVDVF9FUShzaXplb2YodWludDY0X3QpLCBpbnB1dC5CeXRlQ291bnQoKSk7Cit9CisKK1RFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBXcml0ZUxpdHRsZUVuZGlhbjMyLCBrRml4ZWQzMkNhc2VzLCBrQmxvY2tTaXplcykgeworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXQpOworCisgICAgY29kZWRfb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoa0ZpeGVkMzJDYXNlc19jYXNlLnZhbHVlKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfb3V0cHV0LkhhZEVycm9yKCkpOworCisgICAgRVhQRUNUX0VRKHNpemVvZih1aW50MzJfdCksIGNvZGVkX291dHB1dC5CeXRlQ291bnQoKSk7CisgIH0KKworICBFWFBFQ1RfRVEoc2l6ZW9mKHVpbnQzMl90KSwgb3V0cHV0LkJ5dGVDb3VudCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lbWNtcChidWZmZXJfLCBrRml4ZWQzMkNhc2VzX2Nhc2UuYnl0ZXMsIHNpemVvZih1aW50MzJfdCkpKTsKK30KKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFdyaXRlTGl0dGxlRW5kaWFuNjQsIGtGaXhlZDY0Q2FzZXMsIGtCbG9ja1NpemVzKSB7CisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXRwdXQoJm91dHB1dCk7CisKKyAgICBjb2RlZF9vdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW42NChrRml4ZWQ2NENhc2VzX2Nhc2UudmFsdWUpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9vdXRwdXQuSGFkRXJyb3IoKSk7CisKKyAgICBFWFBFQ1RfRVEoc2l6ZW9mKHVpbnQ2NF90KSwgY29kZWRfb3V0cHV0LkJ5dGVDb3VudCgpKTsKKyAgfQorCisgIEVYUEVDVF9FUShzaXplb2YodWludDY0X3QpLCBvdXRwdXQuQnl0ZUNvdW50KCkpOworICBFWFBFQ1RfRVEoMCwgbWVtY21wKGJ1ZmZlcl8sIGtGaXhlZDY0Q2FzZXNfY2FzZS5ieXRlcywgc2l6ZW9mKHVpbnQ2NF90KSkpOworfQorCisvLyBUZXN0cyB1c2luZyB0aGUgc3RhdGljIG1ldGhvZHMgdG8gcmVhZCBmaXhlZC1zaXplIHZhbHVlcyBmcm9tIHJhdyBhcnJheXMuCisKK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXksIGtGaXhlZDMyQ2FzZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtGaXhlZDMyQ2FzZXNfY2FzZS5ieXRlcywgc2l6ZW9mKGtGaXhlZDMyQ2FzZXNfY2FzZS5ieXRlcykpOworCisgIHVpbnQzMl90IHZhbHVlOworICBjb25zdCB1aW50OF90KiBlbmQgPQorICAgICAgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjMyRnJvbUFycmF5KGJ1ZmZlcl8sICZ2YWx1ZSk7CisgIEVYUEVDVF9FUShrRml4ZWQzMkNhc2VzX2Nhc2UudmFsdWUsIHZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoZW5kID09IGJ1ZmZlcl8gKyBzaXplb2YodmFsdWUpKTsKK30KKworVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRMaXR0bGVFbmRpYW42NEZyb21BcnJheSwga0ZpeGVkNjRDYXNlcykgeworICBtZW1jcHkoYnVmZmVyXywga0ZpeGVkNjRDYXNlc19jYXNlLmJ5dGVzLCBzaXplb2Yoa0ZpeGVkNjRDYXNlc19jYXNlLmJ5dGVzKSk7CisKKyAgdWludDY0X3QgdmFsdWU7CisgIGNvbnN0IHVpbnQ4X3QqIGVuZCA9CisgICAgICBDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuNjRGcm9tQXJyYXkoYnVmZmVyXywgJnZhbHVlKTsKKyAgRVhQRUNUX0VRKGtGaXhlZDY0Q2FzZXNfY2FzZS52YWx1ZSwgdmFsdWUpOworICBFWFBFQ1RfVFJVRShlbmQgPT0gYnVmZmVyXyArIHNpemVvZih2YWx1ZSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSYXcgcmVhZHMgYW5kIHdyaXRlcworCitjb25zdCBjaGFyIGtSYXdCeXRlc1tdID0gIlNvbWUgYnl0ZXMgd2hpY2ggd2lsbCBiZSB3cml0dGVuIGFuZCByZWFkIHJhdy4iOworCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgUmVhZFJhdywga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisgIGNoYXIgcmVhZF9idWZmZXJbc2l6ZW9mKGtSYXdCeXRlcyldOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkUmF3KHJlYWRfYnVmZmVyLCBzaXplb2Yoa1Jhd0J5dGVzKSkpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoa1Jhd0J5dGVzLCByZWFkX2J1ZmZlciwgc2l6ZW9mKGtSYXdCeXRlcykpKTsKKyAgfQorCisgIEVYUEVDVF9FUShzaXplb2Yoa1Jhd0J5dGVzKSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgV3JpdGVSYXcsIGtCbG9ja1NpemVzKSB7CisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXRwdXQoJm91dHB1dCk7CisKKyAgICBjb2RlZF9vdXRwdXQuV3JpdGVSYXcoa1Jhd0J5dGVzLCBzaXplb2Yoa1Jhd0J5dGVzKSk7CisgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX291dHB1dC5IYWRFcnJvcigpKTsKKworICAgIEVYUEVDVF9FUShzaXplb2Yoa1Jhd0J5dGVzKSwgY29kZWRfb3V0cHV0LkJ5dGVDb3VudCgpKTsKKyAgfQorCisgIEVYUEVDVF9FUShzaXplb2Yoa1Jhd0J5dGVzKSwgb3V0cHV0LkJ5dGVDb3VudCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lbWNtcChidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKSk7Cit9CisKK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkU3RyaW5nLCBrQmxvY2tTaXplcykgeworICBtZW1jcHkoYnVmZmVyXywga1Jhd0J5dGVzLCBzaXplb2Yoa1Jhd0J5dGVzKSk7CisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgICAgc3RkOjpzdHJpbmcgc3RyOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgc3RybGVuKGtSYXdCeXRlcykpKTsKKyAgICBFWFBFQ1RfRVEoa1Jhd0J5dGVzLCBzdHIpOworICB9CisKKyAgRVhQRUNUX0VRKHN0cmxlbihrUmF3Qnl0ZXMpLCBpbnB1dC5CeXRlQ291bnQoKSk7Cit9CisKKy8vIENoZWNrIHRvIG1ha2Ugc3VyZSBSZWFkU3RyaW5nIGRvZXNuJ3QgY3Jhc2ggb24gaW1wb3NzaWJseSBsYXJnZSBzdHJpbmdzLgorVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRTdHJpbmdJbXBvc3NpYmx5TGFyZ2UsIGtCbG9ja1NpemVzKSB7CisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgICAgc3RkOjpzdHJpbmcgc3RyOworICAgIC8vIFRyeSB0byByZWFkIGEgZ2lnYWJ5dGUuCisgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgMSA8PCAzMCkpOworICB9Cit9CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIFJlYWRTdHJpbmdJbXBvc3NpYmx5TGFyZ2VGcm9tU3RyaW5nT25TdGFjaykgeworICAvLyBTYW1lIHRlc3QgYXMgYWJvdmUsIGV4Y2VwdCBkaXJlY3RseSB1c2UgYSBidWZmZXIuIFRoaXMgdXNlZCB0byBjYXVzZQorICAvLyBjcmFzaGVzIHdoaWxlIHRoZSBhYm92ZSBkaWQgbm90LgorICB1aW50OF90IGJ1ZmZlcls4XTsKKyAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dChidWZmZXIsIDgpOworICBzdGQ6OnN0cmluZyBzdHI7CisgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIDEgPDwgMzApKTsKK30KKworVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZ0ltcG9zc2libHlMYXJnZUZyb21TdHJpbmdPbkhlYXApIHsKKyAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYnVmZmVyKG5ldyB1aW50OF90WzhdKTsKKyAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dChidWZmZXIuZ2V0KCksIDgpOworICBzdGQ6OnN0cmluZyBzdHI7CisgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIDEgPDwgMzApKTsKK30KKworVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRTdHJpbmdSZXNlcnZlc01lbW9yeU9uVG90YWxMaW1pdCwga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKyAgICBjb2RlZF9pbnB1dC5TZXRUb3RhbEJ5dGVzTGltaXQoc2l6ZW9mKGtSYXdCeXRlcykpOworICAgIEVYUEVDVF9FUShzaXplb2Yoa1Jhd0J5dGVzKSwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbFRvdGFsQnl0ZXNMaW1pdCgpKTsKKworICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIHN0cmxlbihrUmF3Qnl0ZXMpKSk7CisgICAgRVhQRUNUX0VRKHNpemVvZihrUmF3Qnl0ZXMpIC0gc3RybGVuKGtSYXdCeXRlcyksCisgICAgICAgICAgICAgIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxUb3RhbEJ5dGVzTGltaXQoKSk7CisgICAgRVhQRUNUX0VRKGtSYXdCeXRlcywgc3RyKTsKKyAgICAvLyBUT0RPKGxpdWppc2kpOiBSZXBsYWNlIHdpdGggYSBtb3JlIG1lYW5pbmdmdWwgdGVzdCAoc2VlIGNsLzYwOTY2MDIzKS4KKyAgICBFWFBFQ1RfR0Uoc3RyLmNhcGFjaXR5KCksIHN0cmxlbihrUmF3Qnl0ZXMpKTsKKyAgfQorCisgIEVYUEVDVF9FUShzdHJsZW4oa1Jhd0J5dGVzKSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZ1Jlc2VydmVzTWVtb3J5T25QdXNoZWRMaW1pdCwga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKyAgICBjb2RlZF9pbnB1dC5QdXNoTGltaXQoc2l6ZW9mKGJ1ZmZlcl8pKTsKKworICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIHN0cmxlbihrUmF3Qnl0ZXMpKSk7CisgICAgRVhQRUNUX0VRKGtSYXdCeXRlcywgc3RyKTsKKyAgICAvLyBUT0RPKGxpdWppc2kpOiBSZXBsYWNlIHdpdGggYSBtb3JlIG1lYW5pbmdmdWwgdGVzdCAoc2VlIGNsLzYwOTY2MDIzKS4KKyAgICBFWFBFQ1RfR0Uoc3RyLmNhcGFjaXR5KCksIHN0cmxlbihrUmF3Qnl0ZXMpKTsKKyAgfQorCisgIEVYUEVDVF9FUShzdHJsZW4oa1Jhd0J5dGVzKSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBSZWFkU3RyaW5nTm9SZXNlcnZhdGlvbklmTGltaXRzTm90U2V0KSB7CisgIG1lbWNweShidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKTsKKyAgLy8gQnVmZmVyIHNpemUgaW4gdGhlIGlucHV0IG11c3QgYmUgc21hbGxlciB0aGFuIHNpemVvZihrUmF3Qnl0ZXMpLAorICAvLyBvdGhlcndpc2UgY2hlY2sgYWdhaW5zdCBjYXBhY2l0eSB3aWxsIGZhaWwgYXMgUmVhZFN0cmluZ0lubGluZSgpCisgIC8vIHdpbGwgaGFuZGxlIHRoZSByZWFkaW5nIGFuZCB3aWxsIHJlc2VydmUgdGhlIG1lbW9yeSBhcyBuZWVkZWQuCisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCAzMik7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIHN0cmxlbihrUmF3Qnl0ZXMpKSk7CisgICAgRVhQRUNUX0VRKGtSYXdCeXRlcywgc3RyKTsKKyAgICAvLyBOb3RlOiB0aGlzIGNoZWNrIGRlcGVuZHMgb24gc3RyaW5nIGNsYXNzIGltcGxlbWVudGF0aW9uLiBJdAorICAgIC8vIGV4cGVjdHMgdGhhdCBzdHJpbmcgd2lsbCBhbGxvY2F0ZSBtb3JlIHRoYW4gc3RybGVuKGtSYXdCeXRlcykKKyAgICAvLyBpZiB0aGUgY29udGVudCBvZiBrUmF3Qnl0ZXMgaXMgYXBwZW5kZWQgdG8gc3RyaW5nIGluIHNtYWxsCisgICAgLy8gY2h1bmtzLgorICAgIC8vIFRPRE8obGl1amlzaSk6IFJlcGxhY2Ugd2l0aCBhIG1vcmUgbWVhbmluZ2Z1bCB0ZXN0IChzZWUgY2wvNjA5NjYwMjMpLgorICAgIEVYUEVDVF9HRShzdHIuY2FwYWNpdHkoKSwgc3RybGVuKGtSYXdCeXRlcykpOworICB9CisKKyAgRVhQRUNUX0VRKHN0cmxlbihrUmF3Qnl0ZXMpLCBpbnB1dC5CeXRlQ291bnQoKSk7Cit9CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIFJlYWRTdHJpbmdOb1Jlc2VydmF0aW9uU2l6ZUlzTmVnYXRpdmUpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOworICAvLyBCdWZmZXIgc2l6ZSBpbiB0aGUgaW5wdXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gc2l6ZW9mKGtSYXdCeXRlcyksCisgIC8vIG90aGVyd2lzZSBjaGVjayBhZ2FpbnN0IGNhcGFjaXR5IHdpbGwgZmFpbCBhcyBSZWFkU3RyaW5nSW5saW5lKCkKKyAgLy8gd2lsbCBoYW5kbGUgdGhlIHJlYWRpbmcgYW5kIHdpbGwgcmVzZXJ2ZSB0aGUgbWVtb3J5IGFzIG5lZWRlZC4KKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIDMyKTsKKworICB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworICAgIGNvZGVkX2lucHV0LlB1c2hMaW1pdChzaXplb2YoYnVmZmVyXykpOworCisgICAgc3RkOjpzdHJpbmcgc3RyOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIC0xKSk7CisgICAgLy8gTm90ZTogdGhpcyBjaGVjayBkZXBlbmRzIG9uIHN0cmluZyBjbGFzcyBpbXBsZW1lbnRhdGlvbi4gSXQKKyAgICAvLyBleHBlY3RzIHRoYXQgc3RyaW5nIHdpbGwgYWx3YXlzIGFsbG9jYXRlIHRoZSBzYW1lIGFtb3VudCBvZgorICAgIC8vIG1lbW9yeSBmb3IgYW4gZW1wdHkgc3RyaW5nLgorICAgIEVYUEVDVF9FUShzdGQ6OnN0cmluZygpLmNhcGFjaXR5KCksIHN0ci5jYXBhY2l0eSgpKTsKKyAgfQorfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBSZWFkU3RyaW5nTm9SZXNlcnZhdGlvblNpemVJc0xhcmdlKSB7CisgIG1lbWNweShidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKTsKKyAgLy8gQnVmZmVyIHNpemUgaW4gdGhlIGlucHV0IG11c3QgYmUgc21hbGxlciB0aGFuIHNpemVvZihrUmF3Qnl0ZXMpLAorICAvLyBvdGhlcndpc2UgY2hlY2sgYWdhaW5zdCBjYXBhY2l0eSB3aWxsIGZhaWwgYXMgUmVhZFN0cmluZ0lubGluZSgpCisgIC8vIHdpbGwgaGFuZGxlIHRoZSByZWFkaW5nIGFuZCB3aWxsIHJlc2VydmUgdGhlIG1lbW9yeSBhcyBuZWVkZWQuCisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCAzMik7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKyAgICBjb2RlZF9pbnB1dC5QdXNoTGltaXQoc2l6ZW9mKGJ1ZmZlcl8pKTsKKworICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCAxIDw8IDMwKSk7CisgICAgRVhQRUNUX0dUKDEgPDwgMzAsIHN0ci5jYXBhY2l0eSgpKTsKKyAgfQorfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBSZWFkU3RyaW5nTm9SZXNlcnZhdGlvblNpemVJc092ZXJUaGVMaW1pdCkgeworICBtZW1jcHkoYnVmZmVyXywga1Jhd0J5dGVzLCBzaXplb2Yoa1Jhd0J5dGVzKSk7CisgIC8vIEJ1ZmZlciBzaXplIGluIHRoZSBpbnB1dCBtdXN0IGJlIHNtYWxsZXIgdGhhbiBzaXplb2Yoa1Jhd0J5dGVzKSwKKyAgLy8gb3RoZXJ3aXNlIGNoZWNrIGFnYWluc3QgY2FwYWNpdHkgd2lsbCBmYWlsIGFzIFJlYWRTdHJpbmdJbmxpbmUoKQorICAvLyB3aWxsIGhhbmRsZSB0aGUgcmVhZGluZyBhbmQgd2lsbCByZXNlcnZlIHRoZSBtZW1vcnkgYXMgbmVlZGVkLgorICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwgMzIpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisgICAgY29kZWRfaW5wdXQuUHVzaExpbWl0KDE2KTsKKworICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCBzdHJsZW4oa1Jhd0J5dGVzKSkpOworICAgIC8vIE5vdGU6IHRoaXMgY2hlY2sgZGVwZW5kcyBvbiBzdHJpbmcgY2xhc3MgaW1wbGVtZW50YXRpb24uIEl0CisgICAgLy8gZXhwZWN0cyB0aGF0IHN0cmluZyB3aWxsIGFsbG9jYXRlIGxlc3MgdGhhbiBzdHJsZW4oa1Jhd0J5dGVzKQorICAgIC8vIGZvciBhbiBlbXB0eSBzdHJpbmcuCisgICAgRVhQRUNUX0dUKHN0cmxlbihrUmF3Qnl0ZXMpLCBzdHIuY2FwYWNpdHkoKSk7CisgIH0KK30KKworVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZ05vUmVzZXJ2YXRpb25TaXplSXNPdmVyVGhlVG90YWxCeXRlc0xpbWl0KSB7CisgIG1lbWNweShidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKTsKKyAgLy8gQnVmZmVyIHNpemUgaW4gdGhlIGlucHV0IG11c3QgYmUgc21hbGxlciB0aGFuIHNpemVvZihrUmF3Qnl0ZXMpLAorICAvLyBvdGhlcndpc2UgY2hlY2sgYWdhaW5zdCBjYXBhY2l0eSB3aWxsIGZhaWwgYXMgUmVhZFN0cmluZ0lubGluZSgpCisgIC8vIHdpbGwgaGFuZGxlIHRoZSByZWFkaW5nIGFuZCB3aWxsIHJlc2VydmUgdGhlIG1lbW9yeSBhcyBuZWVkZWQuCisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCAzMik7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKyAgICBjb2RlZF9pbnB1dC5TZXRUb3RhbEJ5dGVzTGltaXQoMTYpOworCisgICAgc3RkOjpzdHJpbmcgc3RyOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIHN0cmxlbihrUmF3Qnl0ZXMpKSk7CisgICAgLy8gTm90ZTogdGhpcyBjaGVjayBkZXBlbmRzIG9uIHN0cmluZyBjbGFzcyBpbXBsZW1lbnRhdGlvbi4gSXQKKyAgICAvLyBleHBlY3RzIHRoYXQgc3RyaW5nIHdpbGwgYWxsb2NhdGUgbGVzcyB0aGFuIHN0cmxlbihrUmF3Qnl0ZXMpCisgICAgLy8gZm9yIGFuIGVtcHR5IHN0cmluZy4KKyAgICBFWFBFQ1RfR1Qoc3RybGVuKGtSYXdCeXRlcyksIHN0ci5jYXBhY2l0eSgpKTsKKyAgfQorfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LAorICAgICAgIFJlYWRTdHJpbmdOb1Jlc2VydmF0aW9uU2l6ZUlzT3ZlclRoZUNsb3Nlc3RMaW1pdF9HbG9iYWxMaW1pdElzQ2xvc2VyKSB7CisgIG1lbWNweShidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKTsKKyAgLy8gQnVmZmVyIHNpemUgaW4gdGhlIGlucHV0IG11c3QgYmUgc21hbGxlciB0aGFuIHNpemVvZihrUmF3Qnl0ZXMpLAorICAvLyBvdGhlcndpc2UgY2hlY2sgYWdhaW5zdCBjYXBhY2l0eSB3aWxsIGZhaWwgYXMgUmVhZFN0cmluZ0lubGluZSgpCisgIC8vIHdpbGwgaGFuZGxlIHRoZSByZWFkaW5nIGFuZCB3aWxsIHJlc2VydmUgdGhlIG1lbW9yeSBhcyBuZWVkZWQuCisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCAzMik7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKyAgICBjb2RlZF9pbnB1dC5QdXNoTGltaXQoc2l6ZW9mKGJ1ZmZlcl8pKTsKKyAgICBjb2RlZF9pbnB1dC5TZXRUb3RhbEJ5dGVzTGltaXQoMTYpOworCisgICAgc3RkOjpzdHJpbmcgc3RyOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIHN0cmxlbihrUmF3Qnl0ZXMpKSk7CisgICAgLy8gTm90ZTogdGhpcyBjaGVjayBkZXBlbmRzIG9uIHN0cmluZyBjbGFzcyBpbXBsZW1lbnRhdGlvbi4gSXQKKyAgICAvLyBleHBlY3RzIHRoYXQgc3RyaW5nIHdpbGwgYWxsb2NhdGUgbGVzcyB0aGFuIHN0cmxlbihrUmF3Qnl0ZXMpCisgICAgLy8gZm9yIGFuIGVtcHR5IHN0cmluZy4KKyAgICBFWFBFQ1RfR1Qoc3RybGVuKGtSYXdCeXRlcyksIHN0ci5jYXBhY2l0eSgpKTsKKyAgfQorfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LAorICAgICAgIFJlYWRTdHJpbmdOb1Jlc2VydmF0aW9uU2l6ZUlzT3ZlclRoZUNsb3Nlc3RMaW1pdF9Mb2NhbExpbWl0SXNDbG9zZXIpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOworICAvLyBCdWZmZXIgc2l6ZSBpbiB0aGUgaW5wdXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gc2l6ZW9mKGtSYXdCeXRlcyksCisgIC8vIG90aGVyd2lzZSBjaGVjayBhZ2FpbnN0IGNhcGFjaXR5IHdpbGwgZmFpbCBhcyBSZWFkU3RyaW5nSW5saW5lKCkKKyAgLy8gd2lsbCBoYW5kbGUgdGhlIHJlYWRpbmcgYW5kIHdpbGwgcmVzZXJ2ZSB0aGUgbWVtb3J5IGFzIG5lZWRlZC4KKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIDMyKTsKKworICB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworICAgIGNvZGVkX2lucHV0LlB1c2hMaW1pdCgxNik7CisgICAgY29kZWRfaW5wdXQuU2V0VG90YWxCeXRlc0xpbWl0KHNpemVvZihidWZmZXJfKSk7CisgICAgRVhQRUNUX0VRKHNpemVvZihidWZmZXJfKSwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbFRvdGFsQnl0ZXNMaW1pdCgpKTsKKworICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCBzdHJsZW4oa1Jhd0J5dGVzKSkpOworICAgIC8vIE5vdGU6IHRoaXMgY2hlY2sgZGVwZW5kcyBvbiBzdHJpbmcgY2xhc3MgaW1wbGVtZW50YXRpb24uIEl0CisgICAgLy8gZXhwZWN0cyB0aGF0IHN0cmluZyB3aWxsIGFsbG9jYXRlIGxlc3MgdGhhbiBzdHJsZW4oa1Jhd0J5dGVzKQorICAgIC8vIGZvciBhbiBlbXB0eSBzdHJpbmcuCisgICAgRVhQRUNUX0dUKHN0cmxlbihrUmF3Qnl0ZXMpLCBzdHIuY2FwYWNpdHkoKSk7CisgIH0KK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTa2lwCisKK2NvbnN0IGNoYXIga1NraXBUZXN0Qnl0ZXNbXSA9CisgICAgIjxCZWZvcmUgc2tpcHBpbmc+PFRvIGJlIHNraXBwZWQ+PEFmdGVyIHNraXBwaW5nPiI7CisKK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBTa2lwSW5wdXQsIGtCbG9ja1NpemVzKSB7CisgIG1lbWNweShidWZmZXJfLCBrU2tpcFRlc3RCeXRlcywgc2l6ZW9mKGtTa2lwVGVzdEJ5dGVzKSk7CisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgICAgc3RkOjpzdHJpbmcgc3RyOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgc3RybGVuKCI8QmVmb3JlIHNraXBwaW5nPiIpKSk7CisgICAgRVhQRUNUX0VRKCI8QmVmb3JlIHNraXBwaW5nPiIsIHN0cik7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuU2tpcChzdHJsZW4oIjxUbyBiZSBza2lwcGVkPiIpKSk7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCBzdHJsZW4oIjxBZnRlciBza2lwcGluZz4iKSkpOworICAgIEVYUEVDVF9FUSgiPEFmdGVyIHNraXBwaW5nPiIsIHN0cik7CisgIH0KKworICBFWFBFQ1RfRVEoc3RybGVuKGtTa2lwVGVzdEJ5dGVzKSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHZXREaXJlY3RCdWZmZXJQb2ludGVyCisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIEdldERpcmVjdEJ1ZmZlclBvaW50ZXJJbnB1dCkgeworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwgOCk7CisgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICBjb25zdCB2b2lkKiBwdHI7CisgIGludCBzaXplOworCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkdldERpcmVjdEJ1ZmZlclBvaW50ZXIoJnB0ciwgJnNpemUpKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlcl8sIHB0cik7CisgIEVYUEVDVF9FUSg4LCBzaXplKTsKKworICAvLyBQZWVraW5nIGFnYWluIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcG9pbnRlci4KKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcigmcHRyLCAmc2l6ZSkpOworICBFWFBFQ1RfRVEoYnVmZmVyXywgcHRyKTsKKyAgRVhQRUNUX0VRKDgsIHNpemUpOworCisgIC8vIFNraXAgZm9yd2FyZCBpbiB0aGUgc2FtZSBidWZmZXIgdGhlbiBwZWVrIGFnYWluLgorICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5Ta2lwKDMpKTsKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcigmcHRyLCAmc2l6ZSkpOworICBFWFBFQ1RfRVEoYnVmZmVyXyArIDMsIHB0cik7CisgIEVYUEVDVF9FUSg1LCBzaXplKTsKKworICAvLyBTa2lwIHRvIGVuZCBvZiBidWZmZXIgYW5kIHBlZWsgLS0gc2hvdWxkIGdldCBuZXh0IGJ1ZmZlci4KKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuU2tpcCg1KSk7CisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkdldERpcmVjdEJ1ZmZlclBvaW50ZXIoJnB0ciwgJnNpemUpKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlcl8gKyA4LCBwdHIpOworICBFWFBFQ1RfRVEoOCwgc2l6ZSk7Cit9CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIEdldERpcmVjdEJ1ZmZlclBvaW50ZXJJbmxpbmVJbnB1dCkgeworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwgOCk7CisgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICBjb25zdCB2b2lkKiBwdHI7CisgIGludCBzaXplOworCisgIGNvZGVkX2lucHV0LkdldERpcmVjdEJ1ZmZlclBvaW50ZXJJbmxpbmUoJnB0ciwgJnNpemUpOworICBFWFBFQ1RfRVEoYnVmZmVyXywgcHRyKTsKKyAgRVhQRUNUX0VRKDgsIHNpemUpOworCisgIC8vIFBlZWtpbmcgYWdhaW4gc2hvdWxkIHJldHVybiB0aGUgc2FtZSBwb2ludGVyLgorICBjb2RlZF9pbnB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lKCZwdHIsICZzaXplKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlcl8sIHB0cik7CisgIEVYUEVDVF9FUSg4LCBzaXplKTsKKworICAvLyBTa2lwIGZvcndhcmQgaW4gdGhlIHNhbWUgYnVmZmVyIHRoZW4gcGVlayBhZ2Fpbi4KKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuU2tpcCgzKSk7CisgIGNvZGVkX2lucHV0LkdldERpcmVjdEJ1ZmZlclBvaW50ZXJJbmxpbmUoJnB0ciwgJnNpemUpOworICBFWFBFQ1RfRVEoYnVmZmVyXyArIDMsIHB0cik7CisgIEVYUEVDVF9FUSg1LCBzaXplKTsKKworICAvLyBTa2lwIHRvIGVuZCBvZiBidWZmZXIgYW5kIHBlZWsgLS0gc2hvdWxkIHJldHVybiBmYWxzZSBhbmQgcHJvdmlkZSBhbiBlbXB0eQorICAvLyBidWZmZXIuIEl0IGRvZXMgbm90IHRyeSB0byBSZWZyZXNoKCkuCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlNraXAoNSkpOworICBjb2RlZF9pbnB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lKCZwdHIsICZzaXplKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlcl8gKyA4LCBwdHIpOworICBFWFBFQ1RfRVEoMCwgc2l6ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExpbWl0cworCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgQmFzaWNMaW1pdCwga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdCg4KTsKKworICAgIC8vIFJlYWQgdW50aWwgd2UgaGl0IHRoZSBsaW1pdC4KKyAgICB1aW50MzJfdCB2YWx1ZTsKKyAgICBFWFBFQ1RfRVEoOCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoNCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKworICAgIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0KTsKKworICAgIEVYUEVDVF9FUSgtMSwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKTsKKyAgfQorCisgIEVYUEVDVF9FUSgxMiwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCisvLyBUZXN0IHdoYXQgaGFwcGVucyB3aGVuIHdlIHB1c2ggdHdvIGxpbWl0cyB3aGVyZSB0aGUgc2Vjb25kICh0b3ApIG9uZSBpcworLy8gc2hvcnRlci4KK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBTbWFsbExpbWl0T25Ub3BPZkJpZ0xpbWl0LCBrQmxvY2tTaXplcykgeworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIEVYUEVDVF9FUSgtMSwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIENvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0MSA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdCg4KTsKKyAgICBFWFBFQ1RfRVEoOCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIENvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0MiA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdCg0KTsKKworICAgIHVpbnQzMl90IHZhbHVlOworCisgICAgLy8gUmVhZCB1bnRpbCB3ZSBoaXQgbGltaXQyLCB0aGUgdG9wIGFuZCBzaG9ydGVzdCBsaW1pdC4KKyAgICBFWFBFQ1RfRVEoNCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKworICAgIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0Mik7CisKKyAgICAvLyBSZWFkIHVudGlsIHdlIGhpdCBsaW1pdDEuCisgICAgRVhQRUNUX0VRKDQsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOworICAgIEVYUEVDVF9FUSgwLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7CisKKyAgICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdDEpOworCisgICAgLy8gTm8gbW9yZSBsaW1pdHMuCisgICAgRVhQRUNUX0VRKC0xLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOworICB9CisKKyAgRVhQRUNUX0VRKDEyLCBpbnB1dC5CeXRlQ291bnQoKSk7Cit9CisKKy8vIFRlc3Qgd2hhdCBoYXBwZW5zIHdoZW4gd2UgcHVzaCB0d28gbGltaXRzIHdoZXJlIHRoZSBzZWNvbmQgKHRvcCkgb25lIGlzCisvLyBsb25nZXIuICBJbiB0aGlzIGNhc2UsIHRoZSB0b3AgbGltaXQgaXMgc2hvcnRlbmVkIHRvIG1hdGNoIHRoZSBwcmV2aW91cworLy8gbGltaXQuCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgQmlnTGltaXRPblRvcE9mU21hbGxMaW1pdCwga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdDEgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoNCk7CisgICAgRVhQRUNUX0VRKDQsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdDIgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoOCk7CisKKyAgICB1aW50MzJfdCB2YWx1ZTsKKworICAgIC8vIFJlYWQgdW50aWwgd2UgaGl0IGxpbWl0Mi4gIEV4Y2VwdCwgd2FpdCEgIGxpbWl0MSBpcyBzaG9ydGVyLCBzbworICAgIC8vIHdlIGVuZCB1cCBoaXR0aW5nIHRoYXQgZmlyc3QsIGRlc3BpdGUgaGF2aW5nIDQgYnl0ZXMgdG8gZ28gb24KKyAgICAvLyBsaW1pdDIuCisgICAgRVhQRUNUX0VRKDQsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOworICAgIEVYUEVDVF9FUSgwLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7CisKKyAgICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdDIpOworCisgICAgLy8gT0ssIHBvcHBlZCBsaW1pdDIsIG5vdyBsaW1pdDEgaXMgb24gdG9wLCB3aGljaCB3ZSd2ZSBhbHJlYWR5IGhpdC4KKyAgICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKworICAgIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0MSk7CisKKyAgICAvLyBObyBtb3JlIGxpbWl0cy4KKyAgICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgIH0KKworICBFWFBFQ1RfRVEoOCwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBFeHBlY3RBdEVuZCkgeworICAvLyBUZXN0IEV4cGVjdEF0RW5kKCksIHdoaWNoIGlzIGJhc2VkIG9uIGxpbWl0cy4KKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkV4cGVjdEF0RW5kKCkpOworCisgIENvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gY29kZWRfaW5wdXQuUHVzaExpbWl0KDQpOworCisgIHVpbnQzMl90IHZhbHVlOworICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkV4cGVjdEF0RW5kKCkpOworCisgIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0KTsKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkV4cGVjdEF0RW5kKCkpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBOZWdhdGl2ZUxpbWl0KSB7CisgIC8vIENoZWNrIHdoYXQgaGFwcGVucyB3aGVuIHdlIHB1c2ggYSBuZWdhdGl2ZSBsaW1pdC4KKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgQ29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoLTEyMzQpOworICAvLyBCeXRlc1VudGlsTGltaXQoKSByZXR1cm5zIC0xIHRvIG1lYW4gIm5vIGxpbWl0Iiwgd2hpY2ggYWN0dWFsbHkgbWVhbnMKKyAgLy8gInRoZSBsaW1pdCBpcyBJTlRfTUFYIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSIuCisgIEVYUEVDVF9FUSgtMSwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdCk7Cit9CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIE5lZ2F0aXZlTGltaXRBZnRlclJlYWRpbmcpIHsKKyAgLy8gQ2hlY2sgd2hhdCBoYXBwZW5zIHdoZW4gd2UgcHVzaCBhIG5lZ2F0aXZlIGxpbWl0LgorICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSk7CisgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKyAgQVNTRVJUX1RSVUUoY29kZWRfaW5wdXQuU2tpcCgxMjgpKTsKKworICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdCgtNjQpOworICAvLyBCeXRlc1VudGlsTGltaXQoKSByZXR1cm5zIC0xIHRvIG1lYW4gIm5vIGxpbWl0Iiwgd2hpY2ggYWN0dWFsbHkgbWVhbnMKKyAgLy8gInRoZSBsaW1pdCBpcyBJTlRfTUFYIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSIuCisgIEVYUEVDVF9FUSgtMSwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdCk7Cit9CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIE92ZXJmbG93TGltaXQpIHsKKyAgLy8gQ2hlY2sgd2hhdCBoYXBwZW5zIHdoZW4gd2UgcHVzaCBhIGxpbWl0IGxhcmdlIGVub3VnaCB0aGF0IGl0cyBhYnNvbHV0ZQorICAvLyBwb3NpdGlvbiBpcyBtb3JlIHRoYW4gMkdCIGludG8gdGhlIHN0cmVhbS4KKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisgIEFTU0VSVF9UUlVFKGNvZGVkX2lucHV0LlNraXAoMTI4KSk7CisKKyAgQ29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoSU5UX01BWCk7CisgIC8vIEJ5dGVzVW50aWxMaW1pdCgpIHJldHVybnMgLTEgdG8gbWVhbiAibm8gbGltaXQiLCB3aGljaCBhY3R1YWxseSBtZWFucworICAvLyAidGhlIGxpbWl0IGlzIElOVF9NQVggcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtIi4KKyAgRVhQRUNUX0VRKC0xLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7CisgIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0KTsKK30KKworVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgVG90YWxCeXRlc0xpbWl0KSB7CisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pKTsKKyAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworICBjb2RlZF9pbnB1dC5TZXRUb3RhbEJ5dGVzTGltaXQoMTYpOworICBFWFBFQ1RfRVEoMTYsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxUb3RhbEJ5dGVzTGltaXQoKSk7CisKKyAgc3RkOjpzdHJpbmcgc3RyOworICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIDE2KSk7CisgIEVYUEVDVF9FUSgwLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsVG90YWxCeXRlc0xpbWl0KCkpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlcnJvcnM7CisKKyAgeworICAgIFNjb3BlZE1lbW9yeUxvZyBlcnJvcl9sb2c7CisgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgMSkpOworICAgIGVycm9ycyA9IGVycm9yX2xvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKworICBBU1NFUlRfRVEoMSwgZXJyb3JzLnNpemUoKSk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIkEgcHJvdG9jb2wgbWVzc2FnZSB3YXMgcmVqZWN0ZWQgYmVjYXVzZSBpdCB3YXMgdG9vIGJpZyIsCisgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzWzBdKTsKKworICBjb2RlZF9pbnB1dC5TZXRUb3RhbEJ5dGVzTGltaXQoMzIpOworICBFWFBFQ1RfRVEoMTYsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxUb3RhbEJ5dGVzTGltaXQoKSk7CisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgMTYpKTsKKyAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxUb3RhbEJ5dGVzTGltaXQoKSk7Cit9CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIFRvdGFsQnl0ZXNMaW1pdE5vdFZhbGlkTWVzc2FnZUVuZCkgeworICAvLyB0b3RhbF9ieXRlc19saW1pdF8gaXMgbm90IGEgdmFsaWQgcGxhY2UgZm9yIGEgbWVzc2FnZSB0byBlbmQuCisKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgLy8gU2V0IGJvdGggdG90YWxfYnl0ZXNfbGltaXQgYW5kIGEgcmVndWxhciBsaW1pdCBhdCAxNiBieXRlcy4KKyAgY29kZWRfaW5wdXQuU2V0VG90YWxCeXRlc0xpbWl0KDE2KTsKKyAgQ29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoMTYpOworCisgIC8vIFJlYWQgMTYgYnl0ZXMuCisgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCAxNikpOworCisgIC8vIFJlYWQgYSB0YWcuICBTaG91bGQgZmFpbCwgYnV0IHJlcG9ydCBiZWluZyBhIHZhbGlkIGVuZHBvaW50IHNpbmNlIGl0J3MKKyAgLy8gYSByZWd1bGFyIGxpbWl0LgorICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuUmVhZFRhZ05vTGFzdFRhZygpKTsKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkpOworCisgIC8vIFBvcCB0aGUgbGltaXQuCisgIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0KTsKKworICAvLyBSZWFkIGEgdGFnLiAgU2hvdWxkIGZhaWwsIGFuZCByZXBvcnQgKm5vdCogYmVpbmcgYSB2YWxpZCBlbmRwb2ludCwgc2luY2UKKyAgLy8gdGhpcyB0aW1lIHdlJ3JlIGhpdHRpbmcgdGhlIHRvdGFsIGJ5dGVzIGxpbWl0LgorICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuUmVhZFRhZ05vTGFzdFRhZygpKTsKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKTsKK30KKworVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgUmVjdXJzaW9uTGltaXQpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisgIGNvZGVkX2lucHV0LlNldFJlY3Vyc2lvbkxpbWl0KDQpOworCisgIC8vIFRoaXMgaXMgd2F5IHRvbyBtdWNoIHRlc3RpbmcgZm9yIGEgY291bnRlci4KKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgLy8gMQorICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAvLyAyCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgIC8vIDMKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgLy8gNAorICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAvLyA1CisgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgIC8vIDYKKyAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgLy8gNQorICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAvLyA2CisgIGNvZGVkX2lucHV0LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7ICAgICAgICAgICAgICAgIC8vIDUKKyAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgLy8gNAorICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAvLyAzCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgIC8vIDQKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgLy8gNQorICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAvLyA0CisgIGNvZGVkX2lucHV0LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7ICAgICAgICAgICAgICAgIC8vIDMKKyAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgLy8gMgorICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAvLyAxCisgIGNvZGVkX2lucHV0LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7ICAgICAgICAgICAgICAgIC8vIDAKKyAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgLy8gMAorICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAvLyAwCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgIC8vIDEKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgLy8gMgorICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAvLyAzCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgIC8vIDQKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgLy8gNQorCisgIGNvZGVkX2lucHV0LlNldFJlY3Vyc2lvbkxpbWl0KDYpOworICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAvLyA2CisgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgIC8vIDcKK30KKworCitjbGFzcyBSZWFsbHlCaWdJbnB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIFJlYWxseUJpZ0lucHV0U3RyZWFtKCkgOiBiYWNrdXBfYW1vdW50XygwKSwgYnVmZmVyX2NvdW50XygwKSB7fQorCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSBvdmVycmlkZSB7CisgICAgLy8gV2Ugb25seSBleHBlY3QgQmFja1VwKCkgdG8gYmUgY2FsbGVkIGF0IHRoZSBlbmQuCisgICAgRVhQRUNUX0VRKDAsIGJhY2t1cF9hbW91bnRfKTsKKworICAgIHN3aXRjaCAoYnVmZmVyX2NvdW50XysrKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgICpkYXRhID0gYnVmZmVyXzsKKyAgICAgICAgKnNpemUgPSBzaXplb2YoYnVmZmVyXyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSAxOgorICAgICAgICAvLyBSZXR1cm4gYW4gZW5vcm1vdXNseSBsYXJnZSBidWZmZXIgdGhhdCwgd2hlbiBjb21iaW5lZCB3aXRoIHRoZSAxaworICAgICAgICAvLyByZXR1cm5lZCBhbHJlYWR5LCBzaG91bGQgb3ZlcmZsb3cgdGhlIHRvdGFsX2J5dGVzX3JlYWRfIGNvdW50ZXIgaW4KKyAgICAgICAgLy8gQ29kZWRJbnB1dFN0cmVhbS4gIE5vdGUgdGhhdCB3ZSdsbCBvbmx5IHJlYWQgdGhlIGZpcnN0IDEwMjQgYnl0ZXMKKyAgICAgICAgLy8gb2YgdGhpcyBidWZmZXIgc28gaXQncyBPSyB0aGF0IHdlIGhhdmUgaXQgcG9pbnQgYXQgYnVmZmVyXy4KKyAgICAgICAgKmRhdGEgPSBidWZmZXJfOworICAgICAgICAqc2l6ZSA9IElOVF9NQVg7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHZvaWQgQmFja1VwKGludCBjb3VudCkgb3ZlcnJpZGUgeyBiYWNrdXBfYW1vdW50XyA9IGNvdW50OyB9CisKKyAgYm9vbCBTa2lwKGludCBjb3VudCkgb3ZlcnJpZGUgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJOb3QgaW1wbGVtZW50ZWQuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW50NjRfdCBCeXRlQ291bnQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk5vdCBpbXBsZW1lbnRlZC4iOworICAgIHJldHVybiAwOworICB9CisKKyAgaW50IGJhY2t1cF9hbW91bnRfOworCisgcHJpdmF0ZToKKyAgY2hhciBidWZmZXJfWzEwMjRdOworICBpbnQ2NF90IGJ1ZmZlcl9jb3VudF87Cit9OworCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBJbnB1dE92ZXIyRykgeworICAvLyBDb2RlZElucHV0U3RyZWFtIHNob3VsZCBncmFjZWZ1bGx5IGhhbmRsZSBpbnB1dCBvdmVyIDJHIGFuZCBjYWxsCisgIC8vIGlucHV0LkJhY2tVcCgpIHdpdGggdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzIG9uIGRlc3RydWN0aW9uLgorICBSZWFsbHlCaWdJbnB1dFN0cmVhbSBpbnB1dDsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXJyb3JzOworCisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgZXJyb3JfbG9nOworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKyAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCA1MTIpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIDEwMjQpKTsKKyAgICBlcnJvcnMgPSBlcnJvcl9sb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisKKyAgRVhQRUNUX0VRKElOVF9NQVggLSA1MTIsIGlucHV0LmJhY2t1cF9hbW91bnRfKTsKKyAgRVhQRUNUX0VRKDAsIGVycm9ycy5zaXplKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI4NGIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5jYwpAQCAtMCwwICsxLDMzNCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogYnJpYW5vbHNvbkBnb29nbGUuY29tIChCcmlhbiBPbHNvbikKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGNsYXNzZXMgR3ppcElucHV0U3RyZWFtIGFuZAorLy8gR3ppcE91dHB1dFN0cmVhbS4KKworCisjaWYgSEFWRV9aTElCCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnQuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworCitzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0QnVmZmVyU2l6ZSA9IDY1NTM2OworCitHemlwSW5wdXRTdHJlYW06Okd6aXBJbnB1dFN0cmVhbShaZXJvQ29weUlucHV0U3RyZWFtKiBzdWJfc3RyZWFtLCBGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9zaXplKQorICAgIDogZm9ybWF0Xyhmb3JtYXQpLCBzdWJfc3RyZWFtXyhzdWJfc3RyZWFtKSwgemVycm9yXyhaX09LKSwgYnl0ZV9jb3VudF8oMCkgeworICB6Y29udGV4dF8uc3RhdGUgPSBaX05VTEw7CisgIHpjb250ZXh0Xy56YWxsb2MgPSBaX05VTEw7CisgIHpjb250ZXh0Xy56ZnJlZSA9IFpfTlVMTDsKKyAgemNvbnRleHRfLm9wYXF1ZSA9IFpfTlVMTDsKKyAgemNvbnRleHRfLnRvdGFsX291dCA9IDA7CisgIHpjb250ZXh0Xy5uZXh0X2luID0gTlVMTDsKKyAgemNvbnRleHRfLmF2YWlsX2luID0gMDsKKyAgemNvbnRleHRfLnRvdGFsX2luID0gMDsKKyAgemNvbnRleHRfLm1zZyA9IE5VTEw7CisgIGlmIChidWZmZXJfc2l6ZSA9PSAtMSkgeworICAgIG91dHB1dF9idWZmZXJfbGVuZ3RoXyA9IGtEZWZhdWx0QnVmZmVyU2l6ZTsKKyAgfSBlbHNlIHsKKyAgICBvdXRwdXRfYnVmZmVyX2xlbmd0aF8gPSBidWZmZXJfc2l6ZTsKKyAgfQorICBvdXRwdXRfYnVmZmVyXyA9IG9wZXJhdG9yIG5ldyhvdXRwdXRfYnVmZmVyX2xlbmd0aF8pOworICBHT09HTEVfQ0hFQ0sob3V0cHV0X2J1ZmZlcl8gIT0gTlVMTCk7CisgIHpjb250ZXh0Xy5uZXh0X291dCA9IHN0YXRpY19jYXN0PEJ5dGVmKj4ob3V0cHV0X2J1ZmZlcl8pOworICB6Y29udGV4dF8uYXZhaWxfb3V0ID0gb3V0cHV0X2J1ZmZlcl9sZW5ndGhfOworICBvdXRwdXRfcG9zaXRpb25fID0gb3V0cHV0X2J1ZmZlcl87Cit9CitHemlwSW5wdXRTdHJlYW06On5HemlwSW5wdXRTdHJlYW0oKSB7CisgIGludGVybmFsOjpTaXplZERlbGV0ZShvdXRwdXRfYnVmZmVyXywgb3V0cHV0X2J1ZmZlcl9sZW5ndGhfKTsKKyAgemVycm9yXyA9IGluZmxhdGVFbmQoJnpjb250ZXh0Xyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGludGVybmFsSW5mbGF0ZUluaXQyKHpfc3RyZWFtKiB6Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEd6aXBJbnB1dFN0cmVhbTo6Rm9ybWF0IGZvcm1hdCkgeworICBpbnQgd2luZG93Qml0c0Zvcm1hdCA9IDA7CisgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBHemlwSW5wdXRTdHJlYW06OkdaSVA6CisgICAgICB3aW5kb3dCaXRzRm9ybWF0ID0gMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEd6aXBJbnB1dFN0cmVhbTo6QVVUTzoKKyAgICAgIHdpbmRvd0JpdHNGb3JtYXQgPSAzMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR3ppcElucHV0U3RyZWFtOjpaTElCOgorICAgICAgd2luZG93Qml0c0Zvcm1hdCA9IDA7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gaW5mbGF0ZUluaXQyKHpjb250ZXh0LCAvKiB3aW5kb3dCaXRzICovIDE1IHwgd2luZG93Qml0c0Zvcm1hdCk7Cit9CisKK2ludCBHemlwSW5wdXRTdHJlYW06OkluZmxhdGUoaW50IGZsdXNoKSB7CisgIGlmICgoemVycm9yXyA9PSBaX09LKSAmJiAoemNvbnRleHRfLmF2YWlsX291dCA9PSAwKSkgeworICAgIC8vIHByZXZpb3VzIGluZmxhdGUgZmlsbGVkIG91dHB1dCBidWZmZXIuIGRvbid0IGNoYW5nZSBpbnB1dCBwYXJhbXMgeWV0LgorICB9IGVsc2UgaWYgKHpjb250ZXh0Xy5hdmFpbF9pbiA9PSAwKSB7CisgICAgY29uc3Qgdm9pZCogaW47CisgICAgaW50IGluX3NpemU7CisgICAgYm9vbCBmaXJzdCA9IHpjb250ZXh0Xy5uZXh0X2luID09IE5VTEw7CisgICAgYm9vbCBvayA9IHN1Yl9zdHJlYW1fLT5OZXh0KCZpbiwgJmluX3NpemUpOworICAgIGlmICghb2spIHsKKyAgICAgIHpjb250ZXh0Xy5uZXh0X291dCA9IE5VTEw7CisgICAgICB6Y29udGV4dF8uYXZhaWxfb3V0ID0gMDsKKyAgICAgIHJldHVybiBaX1NUUkVBTV9FTkQ7CisgICAgfQorICAgIHpjb250ZXh0Xy5uZXh0X2luID0gc3RhdGljX2Nhc3Q8Qnl0ZWYqPihjb25zdF9jYXN0PHZvaWQqPihpbikpOworICAgIHpjb250ZXh0Xy5hdmFpbF9pbiA9IGluX3NpemU7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBpbnQgZXJyb3IgPSBpbnRlcm5hbEluZmxhdGVJbml0MigmemNvbnRleHRfLCBmb3JtYXRfKTsKKyAgICAgIGlmIChlcnJvciAhPSBaX09LKSB7CisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgemNvbnRleHRfLm5leHRfb3V0ID0gc3RhdGljX2Nhc3Q8Qnl0ZWYqPihvdXRwdXRfYnVmZmVyXyk7CisgIHpjb250ZXh0Xy5hdmFpbF9vdXQgPSBvdXRwdXRfYnVmZmVyX2xlbmd0aF87CisgIG91dHB1dF9wb3NpdGlvbl8gPSBvdXRwdXRfYnVmZmVyXzsKKyAgaW50IGVycm9yID0gaW5mbGF0ZSgmemNvbnRleHRfLCBmbHVzaCk7CisgIHJldHVybiBlcnJvcjsKK30KKwordm9pZCBHemlwSW5wdXRTdHJlYW06OkRvTmV4dE91dHB1dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgICpkYXRhID0gb3V0cHV0X3Bvc2l0aW9uXzsKKyAgKnNpemUgPSAoKHVpbnRwdHJfdCl6Y29udGV4dF8ubmV4dF9vdXQpIC0gKCh1aW50cHRyX3Qpb3V0cHV0X3Bvc2l0aW9uXyk7CisgIG91dHB1dF9wb3NpdGlvbl8gPSB6Y29udGV4dF8ubmV4dF9vdXQ7Cit9CisKKy8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitib29sIEd6aXBJbnB1dFN0cmVhbTo6TmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIGJvb2wgb2sgPSAoemVycm9yXyA9PSBaX09LKSB8fCAoemVycm9yXyA9PSBaX1NUUkVBTV9FTkQpIHx8CisgICAgICAgICAgICAoemVycm9yXyA9PSBaX0JVRl9FUlJPUik7CisgIGlmICgoIW9rKSB8fCAoemNvbnRleHRfLm5leHRfb3V0ID09IE5VTEwpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICh6Y29udGV4dF8ubmV4dF9vdXQgIT0gb3V0cHV0X3Bvc2l0aW9uXykgeworICAgIERvTmV4dE91dHB1dChkYXRhLCBzaXplKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoemVycm9yXyA9PSBaX1NUUkVBTV9FTkQpIHsKKyAgICBpZiAoemNvbnRleHRfLm5leHRfb3V0ICE9IE5VTEwpIHsKKyAgICAgIC8vIHN1Yl9zdHJlYW1fIG1heSBoYXZlIGNvbmNhdGVuYXRlZCBzdHJlYW1zIHRvIGZvbGxvdworICAgICAgemVycm9yXyA9IGluZmxhdGVFbmQoJnpjb250ZXh0Xyk7CisgICAgICBieXRlX2NvdW50XyArPSB6Y29udGV4dF8udG90YWxfb3V0OworICAgICAgaWYgKHplcnJvcl8gIT0gWl9PSykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICB6ZXJyb3JfID0gaW50ZXJuYWxJbmZsYXRlSW5pdDIoJnpjb250ZXh0XywgZm9ybWF0Xyk7CisgICAgICBpZiAoemVycm9yXyAhPSBaX09LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgKmRhdGEgPSBOVUxMOworICAgICAgKnNpemUgPSAwOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICB6ZXJyb3JfID0gSW5mbGF0ZShaX05PX0ZMVVNIKTsKKyAgaWYgKCh6ZXJyb3JfID09IFpfU1RSRUFNX0VORCkgJiYgKHpjb250ZXh0Xy5uZXh0X291dCA9PSBOVUxMKSkgeworICAgIC8vIFRoZSB1bmRlcmx5aW5nIHN0cmVhbSdzIE5leHQgcmV0dXJuZWQgZmFsc2UgaW5zaWRlIEluZmxhdGUuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG9rID0gKHplcnJvcl8gPT0gWl9PSykgfHwgKHplcnJvcl8gPT0gWl9TVFJFQU1fRU5EKSB8fAorICAgICAgICh6ZXJyb3JfID09IFpfQlVGX0VSUk9SKTsKKyAgaWYgKCFvaykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBEb05leHRPdXRwdXQoZGF0YSwgc2l6ZSk7CisgIHJldHVybiB0cnVlOworfQordm9pZCBHemlwSW5wdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKKyAgb3V0cHV0X3Bvc2l0aW9uXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KG91dHB1dF9wb3NpdGlvbl8pIC0gY291bnQpOworfQorYm9vbCBHemlwSW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7CisgIGNvbnN0IHZvaWQqIGRhdGE7CisgIGludCBzaXplID0gMDsKKyAgYm9vbCBvayA9IE5leHQoJmRhdGEsICZzaXplKTsKKyAgd2hpbGUgKG9rICYmIChzaXplIDwgY291bnQpKSB7CisgICAgY291bnQgLT0gc2l6ZTsKKyAgICBvayA9IE5leHQoJmRhdGEsICZzaXplKTsKKyAgfQorICBpZiAoc2l6ZSA+IGNvdW50KSB7CisgICAgQmFja1VwKHNpemUgLSBjb3VudCk7CisgIH0KKyAgcmV0dXJuIG9rOworfQoraW50NjRfdCBHemlwSW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgaW50NjRfdCByZXQgPSBieXRlX2NvdW50XyArIHpjb250ZXh0Xy50b3RhbF9vdXQ7CisgIGlmICh6Y29udGV4dF8ubmV4dF9vdXQgIT0gTlVMTCAmJiBvdXRwdXRfcG9zaXRpb25fICE9IE5VTEwpIHsKKyAgICByZXQgKz0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHpjb250ZXh0Xy5uZXh0X291dCkgLQorICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ob3V0cHV0X3Bvc2l0aW9uXyk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zOjpPcHRpb25zKCkKKyAgICA6IGZvcm1hdChHWklQKSwKKyAgICAgIGJ1ZmZlcl9zaXplKGtEZWZhdWx0QnVmZmVyU2l6ZSksCisgICAgICBjb21wcmVzc2lvbl9sZXZlbChaX0RFRkFVTFRfQ09NUFJFU1NJT04pLAorICAgICAgY29tcHJlc3Npb25fc3RyYXRlZ3koWl9ERUZBVUxUX1NUUkFURUdZKSB7fQorCitHemlwT3V0cHV0U3RyZWFtOjpHemlwT3V0cHV0U3RyZWFtKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBzdWJfc3RyZWFtKSB7CisgIEluaXQoc3ViX3N0cmVhbSwgT3B0aW9ucygpKTsKK30KKworR3ppcE91dHB1dFN0cmVhbTo6R3ppcE91dHB1dFN0cmVhbShaZXJvQ29weU91dHB1dFN0cmVhbSogc3ViX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBJbml0KHN1Yl9zdHJlYW0sIG9wdGlvbnMpOworfQorCit2b2lkIEd6aXBPdXRwdXRTdHJlYW06OkluaXQoWmVyb0NvcHlPdXRwdXRTdHJlYW0qIHN1Yl9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBzdWJfc3RyZWFtXyA9IHN1Yl9zdHJlYW07CisgIHN1Yl9kYXRhXyA9IE5VTEw7CisgIHN1Yl9kYXRhX3NpemVfID0gMDsKKworICBpbnB1dF9idWZmZXJfbGVuZ3RoXyA9IG9wdGlvbnMuYnVmZmVyX3NpemU7CisgIGlucHV0X2J1ZmZlcl8gPSBvcGVyYXRvciBuZXcoaW5wdXRfYnVmZmVyX2xlbmd0aF8pOworICBHT09HTEVfQ0hFQ0soaW5wdXRfYnVmZmVyXyAhPSBOVUxMKTsKKworICB6Y29udGV4dF8uemFsbG9jID0gWl9OVUxMOworICB6Y29udGV4dF8uemZyZWUgPSBaX05VTEw7CisgIHpjb250ZXh0Xy5vcGFxdWUgPSBaX05VTEw7CisgIHpjb250ZXh0Xy5uZXh0X291dCA9IE5VTEw7CisgIHpjb250ZXh0Xy5hdmFpbF9vdXQgPSAwOworICB6Y29udGV4dF8udG90YWxfb3V0ID0gMDsKKyAgemNvbnRleHRfLm5leHRfaW4gPSBOVUxMOworICB6Y29udGV4dF8uYXZhaWxfaW4gPSAwOworICB6Y29udGV4dF8udG90YWxfaW4gPSAwOworICB6Y29udGV4dF8ubXNnID0gTlVMTDsKKyAgLy8gZGVmYXVsdCB0byBHWklQIGZvcm1hdAorICBpbnQgd2luZG93Qml0c0Zvcm1hdCA9IDE2OworICBpZiAob3B0aW9ucy5mb3JtYXQgPT0gWkxJQikgeworICAgIHdpbmRvd0JpdHNGb3JtYXQgPSAwOworICB9CisgIHplcnJvcl8gPQorICAgICAgZGVmbGF0ZUluaXQyKCZ6Y29udGV4dF8sIG9wdGlvbnMuY29tcHJlc3Npb25fbGV2ZWwsIFpfREVGTEFURUQsCisgICAgICAgICAgICAgICAgICAgLyogd2luZG93Qml0cyAqLyAxNSB8IHdpbmRvd0JpdHNGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgLyogbWVtTGV2ZWwgKGRlZmF1bHQpICovIDgsIG9wdGlvbnMuY29tcHJlc3Npb25fc3RyYXRlZ3kpOworfQorCitHemlwT3V0cHV0U3RyZWFtOjp+R3ppcE91dHB1dFN0cmVhbSgpIHsKKyAgQ2xvc2UoKTsKKyAgaW50ZXJuYWw6OlNpemVkRGVsZXRlKGlucHV0X2J1ZmZlcl8sIGlucHV0X2J1ZmZlcl9sZW5ndGhfKTsKK30KKworLy8gcHJpdmF0ZQoraW50IEd6aXBPdXRwdXRTdHJlYW06OkRlZmxhdGUoaW50IGZsdXNoKSB7CisgIGludCBlcnJvciA9IFpfT0s7CisgIGRvIHsKKyAgICBpZiAoKHN1Yl9kYXRhXyA9PSBOVUxMKSB8fCAoemNvbnRleHRfLmF2YWlsX291dCA9PSAwKSkgeworICAgICAgYm9vbCBvayA9IHN1Yl9zdHJlYW1fLT5OZXh0KCZzdWJfZGF0YV8sICZzdWJfZGF0YV9zaXplXyk7CisgICAgICBpZiAoIW9rKSB7CisgICAgICAgIHN1Yl9kYXRhXyA9IE5VTEw7CisgICAgICAgIHN1Yl9kYXRhX3NpemVfID0gMDsKKyAgICAgICAgcmV0dXJuIFpfQlVGX0VSUk9SOworICAgICAgfQorICAgICAgR09PR0xFX0NIRUNLX0dUKHN1Yl9kYXRhX3NpemVfLCAwKTsKKyAgICAgIHpjb250ZXh0Xy5uZXh0X291dCA9IHN0YXRpY19jYXN0PEJ5dGVmKj4oc3ViX2RhdGFfKTsKKyAgICAgIHpjb250ZXh0Xy5hdmFpbF9vdXQgPSBzdWJfZGF0YV9zaXplXzsKKyAgICB9CisgICAgZXJyb3IgPSBkZWZsYXRlKCZ6Y29udGV4dF8sIGZsdXNoKTsKKyAgfSB3aGlsZSAoZXJyb3IgPT0gWl9PSyAmJiB6Y29udGV4dF8uYXZhaWxfb3V0ID09IDApOworICBpZiAoKGZsdXNoID09IFpfRlVMTF9GTFVTSCkgfHwgKGZsdXNoID09IFpfRklOSVNIKSkgeworICAgIC8vIE5vdGlmeSBsb3dlciBsYXllciBvZiBkYXRhLgorICAgIHN1Yl9zdHJlYW1fLT5CYWNrVXAoemNvbnRleHRfLmF2YWlsX291dCk7CisgICAgLy8gV2UgZG9uJ3Qgb3duIHRoZSBidWZmZXIgYW55bW9yZS4KKyAgICBzdWJfZGF0YV8gPSBOVUxMOworICAgIHN1Yl9kYXRhX3NpemVfID0gMDsKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CisKKy8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitib29sIEd6aXBPdXRwdXRTdHJlYW06Ok5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICBpZiAoKHplcnJvcl8gIT0gWl9PSykgJiYgKHplcnJvcl8gIT0gWl9CVUZfRVJST1IpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICh6Y29udGV4dF8uYXZhaWxfaW4gIT0gMCkgeworICAgIHplcnJvcl8gPSBEZWZsYXRlKFpfTk9fRkxVU0gpOworICAgIGlmICh6ZXJyb3JfICE9IFpfT0spIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgaWYgKHpjb250ZXh0Xy5hdmFpbF9pbiA9PSAwKSB7CisgICAgLy8gYWxsIGlucHV0IHdhcyBjb25zdW1lZC4gcmVzZXQgdGhlIGJ1ZmZlci4KKyAgICB6Y29udGV4dF8ubmV4dF9pbiA9IHN0YXRpY19jYXN0PEJ5dGVmKj4oaW5wdXRfYnVmZmVyXyk7CisgICAgemNvbnRleHRfLmF2YWlsX2luID0gaW5wdXRfYnVmZmVyX2xlbmd0aF87CisgICAgKmRhdGEgPSBpbnB1dF9idWZmZXJfOworICAgICpzaXplID0gaW5wdXRfYnVmZmVyX2xlbmd0aF87CisgIH0gZWxzZSB7CisgICAgLy8gVGhlIGxvb3AgaW4gRGVmbGF0ZSBzaG91bGQgY29uc3VtZSBhbGwgYXZhaWxfaW4KKyAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkRlZmxhdGUgbGVmdCBieXRlcyB1bmNvbnN1bWVkIjsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KK3ZvaWQgR3ppcE91dHB1dFN0cmVhbTo6QmFja1VwKGludCBjb3VudCkgeworICBHT09HTEVfQ0hFQ0tfR0UoemNvbnRleHRfLmF2YWlsX2luLCBzdGF0aWNfY2FzdDx1SW50Pihjb3VudCkpOworICB6Y29udGV4dF8uYXZhaWxfaW4gLT0gY291bnQ7Cit9CitpbnQ2NF90IEd6aXBPdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHpjb250ZXh0Xy50b3RhbF9pbiArIHpjb250ZXh0Xy5hdmFpbF9pbjsKK30KKworYm9vbCBHemlwT3V0cHV0U3RyZWFtOjpGbHVzaCgpIHsKKyAgemVycm9yXyA9IERlZmxhdGUoWl9GVUxMX0ZMVVNIKTsKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGZsdXNoIHN1Y2NlZWRlZCBvciBpZiBpdCB3YXMgYSBuby1vcC4KKyAgcmV0dXJuICh6ZXJyb3JfID09IFpfT0spIHx8CisgICAgICAgICAoemVycm9yXyA9PSBaX0JVRl9FUlJPUiAmJiB6Y29udGV4dF8uYXZhaWxfaW4gPT0gMCAmJgorICAgICAgICAgIHpjb250ZXh0Xy5hdmFpbF9vdXQgIT0gMCk7Cit9CisKK2Jvb2wgR3ppcE91dHB1dFN0cmVhbTo6Q2xvc2UoKSB7CisgIGlmICgoemVycm9yXyAhPSBaX09LKSAmJiAoemVycm9yXyAhPSBaX0JVRl9FUlJPUikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZG8geworICAgIHplcnJvcl8gPSBEZWZsYXRlKFpfRklOSVNIKTsKKyAgfSB3aGlsZSAoemVycm9yXyA9PSBaX09LKTsKKyAgemVycm9yXyA9IGRlZmxhdGVFbmQoJnpjb250ZXh0Xyk7CisgIGJvb2wgb2sgPSB6ZXJyb3JfID09IFpfT0s7CisgIHplcnJvcl8gPSBaX1NUUkVBTV9FTkQ7CisgIHJldHVybiBvazsKK30KKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBIQVZFX1pMSUIKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Y3MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oCkBAIC0wLDAgKzEsMjA1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBicmlhbm9sc29uQGdvb2dsZS5jb20gKEJyaWFuIE9sc29uKQorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBmb3IgY2xhc3NlcyBHemlwSW5wdXRTdHJlYW0gYW5kCisvLyBHemlwT3V0cHV0U3RyZWFtLgorLy8KKy8vIEd6aXBJbnB1dFN0cmVhbSBkZWNvbXByZXNzZXMgZGF0YSBmcm9tIGFuIHVuZGVybHlpbmcKKy8vIFplcm9Db3B5SW5wdXRTdHJlYW0gYW5kIHByb3ZpZGVzIHRoZSBkZWNvbXByZXNzZWQgZGF0YSBhcyBhCisvLyBaZXJvQ29weUlucHV0U3RyZWFtLgorLy8KKy8vIEd6aXBPdXRwdXRTdHJlYW0gaXMgYW4gWmVyb0NvcHlPdXRwdXRTdHJlYW0gdGhhdCBjb21wcmVzc2VzIGRhdGEgdG8KKy8vIGFuIHVuZGVybHlpbmcgWmVyb0NvcHlPdXRwdXRTdHJlYW0uCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lPX0daSVBfU1RSRUFNX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU9fR1pJUF9TVFJFQU1fSF9fCisKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0Lmg+CisjaW5jbHVkZSAiemxpYi5oIgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworLy8gQSBaZXJvQ29weUlucHV0U3RyZWFtIHRoYXQgcmVhZHMgY29tcHJlc3NlZCBkYXRhIHRocm91Z2ggemxpYgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEd6aXBJbnB1dFN0cmVhbSBQUk9UT0JVRl9GVVRVUkVfRklOQUwKKyAgICA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIEZvcm1hdCBrZXkgZm9yIGNvbnN0cnVjdG9yCisgIGVudW0gRm9ybWF0IHsKKyAgICAvLyB6bGliIHdpbGwgYXV0b2RldGVjdCBnemlwIGhlYWRlciBvciBkZWZsYXRlIHN0cmVhbQorICAgIEFVVE8gPSAwLAorCisgICAgLy8gR1pJUCBzdHJlYW1zIGhhdmUgc29tZSBleHRyYSBoZWFkZXIgZGF0YSBmb3IgZmlsZSBhdHRyaWJ1dGVzLgorICAgIEdaSVAgPSAxLAorCisgICAgLy8gU2ltcGxlciB6bGliIHN0cmVhbSBmb3JtYXQuCisgICAgWkxJQiA9IDIsCisgIH07CisKKyAgLy8gYnVmZmVyX3NpemUgYW5kIGZvcm1hdCBtYXkgYmUgLTEgZm9yIGRlZmF1bHQgb2YgNjRrQiBhbmQgR1pJUCBmb3JtYXQKKyAgZXhwbGljaXQgR3ppcElucHV0U3RyZWFtKFplcm9Db3B5SW5wdXRTdHJlYW0qIHN1Yl9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgZm9ybWF0ID0gQVVUTywgaW50IGJ1ZmZlcl9zaXplID0gLTEpOworICB2aXJ0dWFsIH5HemlwSW5wdXRTdHJlYW0oKTsKKworICAvLyBSZXR1cm4gbGFzdCBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgbm8gZXJyb3IuCisgIGlubGluZSBjb25zdCBjaGFyKiBabGliRXJyb3JNZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gemNvbnRleHRfLm1zZzsgfQorICBpbmxpbmUgaW50IFpsaWJFcnJvckNvZGUoKSBjb25zdCB7IHJldHVybiB6ZXJyb3JfOyB9CisKKyAgLy8gaW1wbGVtZW50cyBaZXJvQ29weUlucHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIG92ZXJyaWRlOworICB2b2lkIEJhY2tVcChpbnQgY291bnQpIG92ZXJyaWRlOworICBib29sIFNraXAoaW50IGNvdW50KSBvdmVycmlkZTsKKyAgaW50NjRfdCBCeXRlQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIEZvcm1hdCBmb3JtYXRfOworCisgIFplcm9Db3B5SW5wdXRTdHJlYW0qIHN1Yl9zdHJlYW1fOworCisgIHpfc3RyZWFtIHpjb250ZXh0XzsKKyAgaW50IHplcnJvcl87CisKKyAgdm9pZCogb3V0cHV0X2J1ZmZlcl87CisgIHZvaWQqIG91dHB1dF9wb3NpdGlvbl87CisgIHNpemVfdCBvdXRwdXRfYnVmZmVyX2xlbmd0aF87CisgIGludDY0X3QgYnl0ZV9jb3VudF87CisKKyAgaW50IEluZmxhdGUoaW50IGZsdXNoKTsKKyAgdm9pZCBEb05leHRPdXRwdXQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSk7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEd6aXBJbnB1dFN0cmVhbSk7Cit9OworCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgR3ppcE91dHB1dFN0cmVhbSBQUk9UT0JVRl9GVVRVUkVfRklOQUwKKyAgICA6IHB1YmxpYyBaZXJvQ29weU91dHB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBGb3JtYXQga2V5IGZvciBjb25zdHJ1Y3RvcgorICBlbnVtIEZvcm1hdCB7CisgICAgLy8gR1pJUCBzdHJlYW1zIGhhdmUgc29tZSBleHRyYSBoZWFkZXIgZGF0YSBmb3IgZmlsZSBhdHRyaWJ1dGVzLgorICAgIEdaSVAgPSAxLAorCisgICAgLy8gU2ltcGxlciB6bGliIHN0cmVhbSBmb3JtYXQuCisgICAgWkxJQiA9IDIsCisgIH07CisKKyAgc3RydWN0IFBST1RPQlVGX0VYUE9SVCBPcHRpb25zIHsKKyAgICAvLyBEZWZhdWx0cyB0byBHWklQLgorICAgIEZvcm1hdCBmb3JtYXQ7CisKKyAgICAvLyBXaGF0IHNpemUgYnVmZmVyIHRvIHVzZSBpbnRlcm5hbGx5LiAgRGVmYXVsdHMgdG8gNjRrQi4KKyAgICBpbnQgYnVmZmVyX3NpemU7CisKKyAgICAvLyBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDksIHdoZXJlIDAgaXMgbm8gY29tcHJlc3Npb24gYW5kIDkgaXMgYmVzdAorICAgIC8vIGNvbXByZXNzaW9uLiAgRGVmYXVsdHMgdG8gWl9ERUZBVUxUX0NPTVBSRVNTSU9OIChzZWUgemxpYi5oKS4KKyAgICBpbnQgY29tcHJlc3Npb25fbGV2ZWw7CisKKyAgICAvLyBEZWZhdWx0cyB0byBaX0RFRkFVTFRfU1RSQVRFR1kuICBDYW4gYWxzbyBiZSBzZXQgdG8gWl9GSUxURVJFRCwKKyAgICAvLyBaX0hVRkZNQU5fT05MWSwgb3IgWl9STEUuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGRlZmxhdGVJbml0MiBpbgorICAgIC8vIHpsaWIuaCBmb3IgZGVmaW5pdGlvbnMgb2YgdGhlc2UgY29uc3RhbnRzLgorICAgIGludCBjb21wcmVzc2lvbl9zdHJhdGVneTsKKworICAgIE9wdGlvbnMoKTsgIC8vIEluaXRpYWxpemVzIHdpdGggZGVmYXVsdCB2YWx1ZXMuCisgIH07CisKKyAgLy8gQ3JlYXRlIGEgR3ppcE91dHB1dFN0cmVhbSB3aXRoIGRlZmF1bHQgb3B0aW9ucy4KKyAgZXhwbGljaXQgR3ppcE91dHB1dFN0cmVhbShaZXJvQ29weU91dHB1dFN0cmVhbSogc3ViX3N0cmVhbSk7CisKKyAgLy8gQ3JlYXRlIGEgR3ppcE91dHB1dFN0cmVhbSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLgorICBHemlwT3V0cHV0U3RyZWFtKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBzdWJfc3RyZWFtLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworICB2aXJ0dWFsIH5HemlwT3V0cHV0U3RyZWFtKCk7CisKKyAgLy8gUmV0dXJuIGxhc3QgZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIG5vIGVycm9yLgorICBpbmxpbmUgY29uc3QgY2hhciogWmxpYkVycm9yTWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIHpjb250ZXh0Xy5tc2c7IH0KKyAgaW5saW5lIGludCBabGliRXJyb3JDb2RlKCkgY29uc3QgeyByZXR1cm4gemVycm9yXzsgfQorCisgIC8vIEZsdXNoZXMgZGF0YSB3cml0dGVuIHNvIGZhciB0byB6aXBwZWQgZGF0YSBpbiB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgIC8vIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmbHVzaCB0aGUgdW5kZXJseWluZyBzdHJlYW0gaWYKKyAgLy8gbmVjZXNzYXJ5LgorICAvLyBDb21wcmVzc2lvbiBtYXkgYmUgbGVzcyBlZmZpY2llbnQgc3RvcHBpbmcgYW5kIHN0YXJ0aW5nIGFyb3VuZCBmbHVzaGVzLgorICAvLyBSZXR1cm5zIHRydWUgaWYgbm8gZXJyb3IuCisgIC8vCisgIC8vIFBsZWFzZSBlbnN1cmUgdGhhdCBibG9jayBzaXplIGlzID4gNi4gSGVyZSBpcyBhbiBleGNlcnB0IGZyb20gdGhlIHpsaWIKKyAgLy8gZG9jIHRoYXQgZXhwbGFpbnMgd2h5OgorICAvLworICAvLyBJbiB0aGUgY2FzZSBvZiBhIFpfRlVMTF9GTFVTSCBvciBaX1NZTkNfRkxVU0gsIG1ha2Ugc3VyZSB0aGF0IGF2YWlsX291dAorICAvLyBpcyBncmVhdGVyIHRoYW4gc2l4IHRvIGF2b2lkIHJlcGVhdGVkIGZsdXNoIG1hcmtlcnMgZHVlIHRvCisgIC8vIGF2YWlsX291dCA9PSAwIG9uIHJldHVybi4KKyAgYm9vbCBGbHVzaCgpOworCisgIC8vIFdyaXRlcyBvdXQgYWxsIGRhdGEgYW5kIGNsb3NlcyB0aGUgZ3ppcCBzdHJlYW0uCisgIC8vIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBjbG9zZSB0aGUgdW5kZXJseWluZyBzdHJlYW0gaWYKKyAgLy8gbmVjZXNzYXJ5LgorICAvLyBSZXR1cm5zIHRydWUgaWYgbm8gZXJyb3IuCisgIGJvb2wgQ2xvc2UoKTsKKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5T3V0cHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSkgb3ZlcnJpZGU7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCkgb3ZlcnJpZGU7CisgIGludDY0X3QgQnl0ZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBaZXJvQ29weU91dHB1dFN0cmVhbSogc3ViX3N0cmVhbV87CisgIC8vIFJlc3VsdCBmcm9tIGNhbGxpbmcgTmV4dCgpIG9uIHN1Yl9zdHJlYW1fCisgIHZvaWQqIHN1Yl9kYXRhXzsKKyAgaW50IHN1Yl9kYXRhX3NpemVfOworCisgIHpfc3RyZWFtIHpjb250ZXh0XzsKKyAgaW50IHplcnJvcl87CisgIHZvaWQqIGlucHV0X2J1ZmZlcl87CisgIHNpemVfdCBpbnB1dF9idWZmZXJfbGVuZ3RoXzsKKworICAvLyBTaGFyZWQgY29uc3RydWN0b3IgY29kZS4KKyAgdm9pZCBJbml0KFplcm9Db3B5T3V0cHV0U3RyZWFtKiBzdWJfc3RyZWFtLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworICAvLyBEbyBzb21lIGNvbXByZXNzaW9uLgorICAvLyBUYWtlcyB6bGliIGZsdXNoIG1vZGUuCisgIC8vIFJldHVybnMgemxpYiBlcnJvciBjb2RlLgorICBpbnQgRGVmbGF0ZShpbnQgZmx1c2gpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHemlwT3V0cHV0U3RyZWFtKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lPX0daSVBfU1RSRUFNX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW1fdW5pdHRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTYyNTFhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW1fdW5pdHRlc3Quc2gKQEAgLTAsMCArMSw0NCBAQAorIyEvYmluL3NoIC14CisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjCisjIEF1dGhvcjogYnJpYW5vbHNvbkBnb29nbGUuY29tIChCcmlhbiBPbHNvbikKKyMKKyMgVGVzdCBjb21wYXRpYmlsaXR5IGJldHdlZW4gY29tbWFuZCBsaW5lIGd6aXAvZ3VuemlwIGJpbmFyaWVzIGFuZAorIyBaZXJvQ29weVN0cmVhbSB2ZXJzaW9ucy4KKworVEVTVEZJTEU9TWFrZWZpbGUKKworKC4vemNnemlwIDwgJHtURVNURklMRX0gfCBndW56aXAgfCBjbXAgLSAke1RFU1RGSUxFfSkgJiYgXAorKGd6aXAgPCAke1RFU1RGSUxFfSB8IC4vemNndW56aXAgfCBjbXAgLSAke1RFU1RGSUxFfSkKKworIyBSZXN1bHQgb2YgIihjbWQpICYmIChjbWQpIiBpbXBsaWNpdGx5IGJlY29tZXMgcmVzdWx0IG9mIHRoaXMgc2NyaXB0CisjIGFuZCB0aHVzIHRoZSB0ZXN0LgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMi5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vaW9fd2luMzIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4MTkwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vaW9fd2luMzIuY2MKQEAgLTAsMCArMSw0NzEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGxhc3psb2Nzb21vckBnb29nbGUuY29tIChMYXN6bG8gQ3NvbW9yKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKy8vIEltcGxlbWVudGF0aW9uIGZvciBsb25nLXBhdGgtYXdhcmUgb3Blbi9ta2Rpci9hY2Nlc3MvZXRjLiBvbiBXaW5kb3dzLCBhcyB3ZWxsCisvLyBhcyBmb3IgdGhlIHN1cHBvcnRpbmcgdXRpbGl0eSBmdW5jdGlvbnMuCisvLworLy8gVGhlc2UgZnVuY3Rpb25zIGNvbnZlcnQgdGhlIGlucHV0IHBhdGggdG8gYW4gYWJzb2x1dGUgV2luZG93cyBwYXRoCisvLyB3aXRoICJcXD9cIiBwcmVmaXgsIHRoZW4gcGFzcyB0aGF0IHRvIF93b3Blbi9fd21rZGlyL193YWNjZXNzL2V0Yy4KKy8vIChkZWNsYXJlZCBpbiA8aW8uaD4pIHJlc3BlY3RpdmVseS4gVGhpcyBhbGxvd3Mgd29ya2luZyB3aXRoIGZpbGVzL2RpcmVjdG9yaWVzCisvLyB3aG9zZSBwYXRocyBhcmUgbG9uZ2VyIHRoYW4gTUFYX1BBVEggKDI2MCBjaGFycykuCisvLworLy8gVGhpcyBmaWxlIGlzIG9ubHkgdXNlZCBvbiBXaW5kb3dzLCBpdCdzIGVtcHR5IG9uIG90aGVyIHBsYXRmb3Jtcy4KKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfWEJPWF9PTkUpCisKKy8vIENvbW1lbnQgdGhpcyBvdXQgdG8gZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBBTlNJIHZlcnNpb25zIChvcGVuLCBta2RpciwgLi4uKQorLy8gaW5zdGVhZCBvZiB0aGUgVW5pY29kZSBvbmVzIChfd29wZW4sIF93bWtkaXIsIC4uLikuIERvaW5nIHNvIGNhbiBiZSB1c2VmdWwgdG8KKy8vIGRlYnVnIGZhaWxpbmcgdGVzdHMgaWYgdGhhdCdzIGNhdXNlZCBieSB0aGUgbG9uZyBwYXRoIHN1cHBvcnQuCisjZGVmaW5lIFNVUFBPUlRfTE9OR1BBVEhTCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vaW9fd2luMzIuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZGlyZWN0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGlvLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx3Y3R5cGUuaD4KKworI2lmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorI2VuZGlmCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworbmFtZXNwYWNlIHdpbjMyIHsKK25hbWVzcGFjZSB7CisKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp3c3RyaW5nOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgY2hhcl90eXBlPgorc3RydWN0IENoYXJUcmFpdHMgeworICBzdGF0aWMgYm9vbCBpc19hbHBoYShjaGFyX3R5cGUgY2gpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBDaGFyVHJhaXRzPGNoYXI+IHsKKyAgc3RhdGljIGJvb2wgaXNfYWxwaGEoY2hhciBjaCkgeyByZXR1cm4gaXNhbHBoYShjaCk7IH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ2hhclRyYWl0czx3Y2hhcl90PiB7CisgIHN0YXRpYyBib29sIGlzX2FscGhhKHdjaGFyX3QgY2gpIHsgcmV0dXJuIGlzd2FscGhhKGNoKTsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIGNoYXJfdHlwZT4KK2Jvb2wgbnVsbF9vcl9lbXB0eShjb25zdCBjaGFyX3R5cGUqIHMpIHsKKyAgcmV0dXJuIHMgPT0gbnVsbHB0ciB8fCAqcyA9PSAwOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdGggc3RhcnRzIHdpdGggYSBkcml2ZSBsZXR0ZXIsIGUuZy4gImM6Ii4KKy8vIE5vdGUgdGhhdCB0aGlzIHdvbid0IGNoZWNrIGZvciB0aGUgIlwiIGFmdGVyIHRoZSBkcml2ZSBsZXR0ZXIsIHNvIHRoaXMgYWxzbworLy8gcmV0dXJucyB0cnVlIGZvciAiYzpmb28iICh3aGljaCBpcyAiYzpcJHtQV0R9XGZvbyIpLgorLy8gVGhpcyBjaGVjayByZXF1aXJlcyB0aGF0IGEgcGF0aCBub3QgaGF2ZSBhIGxvbmdwYXRoIHByZWZpeCAoIlxcP1wiKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBjaGFyX3R5cGU+Citib29sIGhhc19kcml2ZV9sZXR0ZXIoY29uc3QgY2hhcl90eXBlKiBjaCkgeworICByZXR1cm4gQ2hhclRyYWl0czxjaGFyX3R5cGU+Ojppc19hbHBoYShjaFswXSkgJiYgY2hbMV0gPT0gJzonOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdGggc3RhcnRzIHdpdGggYSBsb25ncGF0aCBwcmVmaXggKCJcXD9cIikuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgY2hhcl90eXBlPgorYm9vbCBoYXNfbG9uZ3BhdGhfcHJlZml4KGNvbnN0IGNoYXJfdHlwZSogcGF0aCkgeworICByZXR1cm4gcGF0aFswXSA9PSAnXFwnICYmIHBhdGhbMV0gPT0gJ1xcJyAmJiBwYXRoWzJdID09ICc/JyAmJgorICAgICAgICAgcGF0aFszXSA9PSAnXFwnOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgY2hhcl90eXBlPgorYm9vbCBpc19zZXBhcmF0b3IoY2hhcl90eXBlIGMpIHsKKyAgcmV0dXJuIGMgPT0gJy8nIHx8IGMgPT0gJ1xcJzsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGEgZHJpdmUgc3BlY2lmaWVyIChlLmcuICJjOlwiKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBjaGFyX3R5cGU+Citib29sIGlzX3BhdGhfYWJzb2x1dGUoY29uc3QgY2hhcl90eXBlKiBwYXRoKSB7CisgIHJldHVybiBoYXNfZHJpdmVfbGV0dGVyKHBhdGgpICYmIGlzX3NlcGFyYXRvcihwYXRoWzJdKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIGNoYXJfdHlwZT4KK2Jvb2wgaXNfZHJpdmVfcmVsYXRpdmUoY29uc3QgY2hhcl90eXBlKiBwYXRoKSB7CisgIHJldHVybiBoYXNfZHJpdmVfbGV0dGVyKHBhdGgpICYmIChwYXRoWzJdID09IDAgfHwgIWlzX3NlcGFyYXRvcihwYXRoWzJdKSk7Cit9CisKK3dzdHJpbmcgam9pbl9wYXRocyhjb25zdCB3c3RyaW5nJiBwYXRoMSwgY29uc3Qgd3N0cmluZyYgcGF0aDIpIHsKKyAgaWYgKHBhdGgxLmVtcHR5KCkgfHwgaXNfcGF0aF9hYnNvbHV0ZShwYXRoMi5jX3N0cigpKSB8fAorICAgICAgaGFzX2xvbmdwYXRoX3ByZWZpeChwYXRoMi5jX3N0cigpKSkgeworICAgIHJldHVybiBwYXRoMjsKKyAgfQorICBpZiAocGF0aDIuZW1wdHkoKSkgeworICAgIHJldHVybiBwYXRoMTsKKyAgfQorCisgIGlmIChpc19zZXBhcmF0b3IocGF0aDFbcGF0aDEuc2l6ZSgpIC0gMV0pKSB7CisgICAgcmV0dXJuIGlzX3NlcGFyYXRvcihwYXRoMlswXSkgPyAocGF0aDEgKyBwYXRoMi5zdWJzdHIoMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChwYXRoMSArIHBhdGgyKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gaXNfc2VwYXJhdG9yKHBhdGgyWzBdKSA/IChwYXRoMSArIHBhdGgyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocGF0aDEgKyBMJ1xcJyArIHBhdGgyKTsKKyAgfQorfQorCit3c3RyaW5nIG5vcm1hbGl6ZSh3c3RyaW5nIHBhdGgpIHsKKyAgaWYgKGhhc19sb25ncGF0aF9wcmVmaXgocGF0aC5jX3N0cigpKSkgeworICAgIHBhdGggPSBwYXRoLnN1YnN0cig0KTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCB3c3RyaW5nIGRvdChMIi4iKTsKKyAgc3RhdGljIGNvbnN0IHdzdHJpbmcgZG90ZG90KEwiLi4iKTsKKyAgY29uc3QgV0NIQVIqIHAgPSBwYXRoLmNfc3RyKCk7CisKKyAgc3RkOjp2ZWN0b3I8d3N0cmluZz4gc2VnbWVudHM7CisgIGludCBzZWdtZW50X3N0YXJ0ID0gLTE7CisgIC8vIEZpbmQgdGhlIHBhdGggc2VnbWVudHMgaW4gYHBhdGhgIChzZXBhcmF0ZWQgYnkgIi8iKS4KKyAgZm9yIChpbnQgaSA9IDA7OyArK2kpIHsKKyAgICBpZiAoIWlzX3NlcGFyYXRvcihwW2ldKSAmJiBwW2ldICE9IEwnXDAnKSB7CisgICAgICAvLyBUaGUgY3VycmVudCBjaGFyYWN0ZXIgZG9lcyBub3QgZW5kIGEgc2VnbWVudCwgc28gc3RhcnQgb25lIHVubGVzcyBpdCdzCisgICAgICAvLyBhbHJlYWR5IHN0YXJ0ZWQuCisgICAgICBpZiAoc2VnbWVudF9zdGFydCA8IDApIHsKKyAgICAgICAgc2VnbWVudF9zdGFydCA9IGk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzZWdtZW50X3N0YXJ0ID49IDAgJiYgaSA+IHNlZ21lbnRfc3RhcnQpIHsKKyAgICAgIC8vIFRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyAiLyIgb3IgIlwwIiwgc28gdGhpcyBlbmRzIGEgc2VnbWVudC4KKyAgICAgIC8vIEFkZCB0aGF0IHRvIGBzZWdtZW50c2AgaWYgdGhlcmUncyBhbnl0aGluZyB0byBhZGQ7IGhhbmRsZSAiLiIgYW5kICIuLiIuCisgICAgICB3c3RyaW5nIHNlZ21lbnQocCwgc2VnbWVudF9zdGFydCwgaSAtIHNlZ21lbnRfc3RhcnQpOworICAgICAgc2VnbWVudF9zdGFydCA9IC0xOworICAgICAgaWYgKHNlZ21lbnQgPT0gZG90ZG90KSB7CisgICAgICAgIGlmICghc2VnbWVudHMuZW1wdHkoKSAmJgorICAgICAgICAgICAgKCFoYXNfZHJpdmVfbGV0dGVyKHNlZ21lbnRzWzBdLmNfc3RyKCkpIHx8IHNlZ21lbnRzLnNpemUoKSA+IDEpKSB7CisgICAgICAgICAgc2VnbWVudHMucG9wX2JhY2soKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChzZWdtZW50ICE9IGRvdCAmJiAhc2VnbWVudC5lbXB0eSgpKSB7CisgICAgICAgIHNlZ21lbnRzLnB1c2hfYmFjayhzZWdtZW50KTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHBbaV0gPT0gTCdcMCcpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVuIGBwYXRoYCBpcyBqdXN0IGEgZHJpdmUgc3BlY2lmaWVyIChvciBzb21lIGRlZ2VuZXJhdGUKKyAgLy8gZm9ybSBvZiBpdCwgZS5nLiAiYzpcLi4iKS4KKyAgaWYgKHNlZ21lbnRzLnNpemUoKSA9PSAxICYmIHNlZ21lbnRzWzBdLnNpemUoKSA9PSAyICYmCisgICAgICBoYXNfZHJpdmVfbGV0dGVyKHNlZ21lbnRzWzBdLmNfc3RyKCkpKSB7CisgICAgcmV0dXJuIHNlZ21lbnRzWzBdICsgTCdcXCc7CisgIH0KKworICAvLyBKb2luIGFsbCBzZWdtZW50cy4KKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIHN0ZDo6d3N0cmluZ3N0cmVhbSByZXN1bHQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICByZXN1bHQgPDwgTCdcXCc7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgICAgcmVzdWx0IDw8IHNlZ21lbnRzW2ldOworICB9CisgIC8vIFByZXNlcnZlIHRyYWlsaW5nIHNlcGFyYXRvciBpZiB0aGUgaW5wdXQgY29udGFpbmVkIGl0LgorICBpZiAoIXBhdGguZW1wdHkoKSAmJiBpc19zZXBhcmF0b3IocFtwYXRoLnNpemUoKSAtIDFdKSkgeworICAgIHJlc3VsdCA8PCBMJ1xcJzsKKyAgfQorICByZXR1cm4gcmVzdWx0LnN0cigpOworfQorCitib29sIGFzX3dpbmRvd3NfcGF0aChjb25zdCBjaGFyKiBwYXRoLCB3c3RyaW5nKiByZXN1bHQpIHsKKyAgaWYgKG51bGxfb3JfZW1wdHkocGF0aCkpIHsKKyAgICByZXN1bHQtPmNsZWFyKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgd3N0cmluZyB3cGF0aDsKKyAgaWYgKCFzdHJpbmdzOjp1dGY4X3RvX3djcyhwYXRoLCAmd3BhdGgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChoYXNfbG9uZ3BhdGhfcHJlZml4KHdwYXRoLmNfc3RyKCkpKSB7CisgICAgKnJlc3VsdCA9IHdwYXRoOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChpc19zZXBhcmF0b3IocGF0aFswXSkgfHwgaXNfZHJpdmVfcmVsYXRpdmUocGF0aCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworCisgIGlmICghaXNfcGF0aF9hYnNvbHV0ZSh3cGF0aC5jX3N0cigpKSkgeworICAgIGludCBzaXplID0gOjpHZXRDdXJyZW50RGlyZWN0b3J5VygwLCBudWxscHRyKTsKKyAgICBpZiAoc2l6ZSA9PSAwICYmIEdldExhc3RFcnJvcigpICE9IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPFdDSEFSW10+IHdjd2QobmV3IFdDSEFSW3NpemVdKTsKKyAgICA6OkdldEN1cnJlbnREaXJlY3RvcnlXKHNpemUsIHdjd2QuZ2V0KCkpOworICAgIHdwYXRoID0gam9pbl9wYXRocyh3Y3dkLmdldCgpLCB3cGF0aCk7CisgIH0KKyAgd3BhdGggPSBub3JtYWxpemUod3BhdGgpOworICBpZiAoIWhhc19sb25ncGF0aF9wcmVmaXgod3BhdGguY19zdHIoKSkpIHsKKyAgICAvLyBBZGQgdGhlICJcXD9cIiBwcmVmaXggdW5jb25kaXRpb25hbGx5LiBUaGlzIHdheSB3ZSBwcmV2ZW50IHRoZSBXaW4zMiBBUEkKKyAgICAvLyBmcm9tIHByb2Nlc3NpbmcgdGhlIHBhdGggYW5kICJoZWxwZnVsbHkiIHJlbW92aW5nIHRyYWlsaW5nIGRvdHMgZnJvbSB0aGUKKyAgICAvLyBwYXRoLCBmb3IgZXhhbXBsZS4KKyAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwvaXNzdWVzLzI5MzUKKyAgICB3cGF0aCA9IHdzdHJpbmcoTCJcXFxcP1xcIikgKyB3cGF0aDsKKyAgfQorICAqcmVzdWx0ID0gd3BhdGg7CisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG9wZW4oY29uc3QgY2hhciogcGF0aCwgaW50IGZsYWdzLCBpbnQgbW9kZSkgeworI2lmZGVmIFNVUFBPUlRfTE9OR1BBVEhTCisgIHdzdHJpbmcgd3BhdGg7CisgIGlmICghYXNfd2luZG93c19wYXRoKHBhdGgsICZ3cGF0aCkpIHsKKyAgICBlcnJubyA9IEVOT0VOVDsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDo6X3dvcGVuKHdwYXRoLmNfc3RyKCksIGZsYWdzLCBtb2RlKTsKKyNlbHNlCisgIHJldHVybiA6Ol9vcGVuKHBhdGgsIGZsYWdzLCBtb2RlKTsKKyNlbmRpZgorfQorCitpbnQgbWtkaXIoY29uc3QgY2hhciogcGF0aCwgaW50IC8qX21vZGUqLykgeworI2lmZGVmIFNVUFBPUlRfTE9OR1BBVEhTCisgIHdzdHJpbmcgd3BhdGg7CisgIGlmICghYXNfd2luZG93c19wYXRoKHBhdGgsICZ3cGF0aCkpIHsKKyAgICBlcnJubyA9IEVOT0VOVDsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDo6X3dta2Rpcih3cGF0aC5jX3N0cigpKTsKKyNlbHNlICAgLy8gbm90IFNVUFBPUlRfTE9OR1BBVEhTCisgIHJldHVybiA6Ol9ta2RpcihwYXRoKTsKKyNlbmRpZiAgLy8gbm90IFNVUFBPUlRfTE9OR1BBVEhTCit9CisKK2ludCBhY2Nlc3MoY29uc3QgY2hhciogcGF0aCwgaW50IG1vZGUpIHsKKyNpZmRlZiBTVVBQT1JUX0xPTkdQQVRIUworICB3c3RyaW5nIHdwYXRoOworICBpZiAoIWFzX3dpbmRvd3NfcGF0aChwYXRoLCAmd3BhdGgpKSB7CisgICAgZXJybm8gPSBFTk9FTlQ7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiA6Ol93YWNjZXNzKHdwYXRoLmNfc3RyKCksIG1vZGUpOworI2Vsc2UKKyAgcmV0dXJuIDo6X2FjY2VzcyhwYXRoLCBtb2RlKTsKKyNlbmRpZgorfQorCitpbnQgY2hkaXIoY29uc3QgY2hhciogcGF0aCkgeworI2lmZGVmIFNVUFBPUlRfTE9OR1BBVEhTCisgIHdzdHJpbmcgd3BhdGg7CisgIGlmICghYXNfd2luZG93c19wYXRoKHBhdGgsICZ3cGF0aCkpIHsKKyAgICBlcnJubyA9IEVOT0VOVDsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDo6X3djaGRpcih3cGF0aC5jX3N0cigpKTsKKyNlbHNlCisgIHJldHVybiA6Ol9jaGRpcihwYXRoKTsKKyNlbmRpZgorfQorCitpbnQgc3RhdChjb25zdCBjaGFyKiBwYXRoLCBzdHJ1Y3QgX3N0YXQqIGJ1ZmZlcikgeworI2lmZGVmIFNVUFBPUlRfTE9OR1BBVEhTCisgIHdzdHJpbmcgd3BhdGg7CisgIGlmICghYXNfd2luZG93c19wYXRoKHBhdGgsICZ3cGF0aCkpIHsKKyAgICBlcnJubyA9IEVOT0VOVDsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDo6X3dzdGF0KHdwYXRoLmNfc3RyKCksIGJ1ZmZlcik7CisjZWxzZSAgIC8vIG5vdCBTVVBQT1JUX0xPTkdQQVRIUworICByZXR1cm4gOjpfc3RhdChwYXRoLCBidWZmZXIpOworI2VuZGlmICAvLyBub3QgU1VQUE9SVF9MT05HUEFUSFMKK30KKworRklMRSogZm9wZW4oY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogbW9kZSkgeworI2lmZGVmIFNVUFBPUlRfTE9OR1BBVEhTCisgIGlmIChudWxsX29yX2VtcHR5KHBhdGgpKSB7CisgICAgZXJybm8gPSBFSU5WQUw7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgd3N0cmluZyB3cGF0aDsKKyAgaWYgKCFhc193aW5kb3dzX3BhdGgocGF0aCwgJndwYXRoKSkgeworICAgIGVycm5vID0gRU5PRU5UOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHdzdHJpbmcgd21vZGU7CisgIGlmICghc3RyaW5nczo6dXRmOF90b193Y3MobW9kZSwgJndtb2RlKSkgeworICAgIGVycm5vID0gRUlOVkFMOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiA6Ol93Zm9wZW4od3BhdGguY19zdHIoKSwgd21vZGUuY19zdHIoKSk7CisjZWxzZQorICByZXR1cm4gOjpmb3BlbihwYXRoLCBtb2RlKTsKKyNlbmRpZgorfQorCitpbnQgY2xvc2UoaW50IGZkKSB7IHJldHVybiA6Ol9jbG9zZShmZCk7IH0KKworaW50IGR1cChpbnQgZmQpIHsgcmV0dXJuIDo6X2R1cChmZCk7IH0KKworaW50IGR1cDIoaW50IGZkMSwgaW50IGZkMikgeyByZXR1cm4gOjpfZHVwMihmZDEsIGZkMik7IH0KKworaW50IHJlYWQoaW50IGZkLCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7CisgIHJldHVybiA6Ol9yZWFkKGZkLCBidWZmZXIsIHNpemUpOworfQorCitpbnQgc2V0bW9kZShpbnQgZmQsIGludCBtb2RlKSB7IHJldHVybiA6Ol9zZXRtb2RlKGZkLCBtb2RlKTsgfQorCitpbnQgd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7CisgIHJldHVybiA6Ol93cml0ZShmZCwgYnVmZmVyLCBzaXplKTsKK30KKword3N0cmluZyB0ZXN0b25seV91dGY4X3RvX3dpbnBhdGgoY29uc3QgY2hhciogcGF0aCkgeworICB3c3RyaW5nIHdwYXRoOworICByZXR1cm4gYXNfd2luZG93c19wYXRoKHBhdGgsICZ3cGF0aCkgPyB3cGF0aCA6IHdzdHJpbmcoKTsKK30KKworRXhwYW5kV2lsZGNhcmRzUmVzdWx0IEV4cGFuZFdpbGRjYXJkcygKKyAgICBjb25zdCBzdHJpbmcmIHBhdGgsIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdHJpbmcmKT4gY29uc3VtZSkgeworICBpZiAocGF0aC5maW5kX2ZpcnN0X29mKCIqPyIpID09IHN0cmluZzo6bnBvcykgeworICAgIC8vIFRoZXJlIGFyZSBubyB3aWxkY2FyZHMgaW4gdGhlIHBhdGgsIHdlIGRvbid0IG5lZWQgdG8gZXhwYW5kIGl0LgorICAgIGNvbnN1bWUocGF0aCk7CisgICAgcmV0dXJuIEV4cGFuZFdpbGRjYXJkc1Jlc3VsdDo6a1N1Y2Nlc3M7CisgIH0KKworICB3c3RyaW5nIHdwYXRoOworICBpZiAoIWFzX3dpbmRvd3NfcGF0aChwYXRoLmNfc3RyKCksICZ3cGF0aCkpIHsKKyAgICByZXR1cm4gRXhwYW5kV2lsZGNhcmRzUmVzdWx0OjprRXJyb3JJbnB1dFBhdGhDb252ZXJzaW9uOworICB9CisKKyAgc3RhdGljIGNvbnN0IHdzdHJpbmcga0RvdCA9IEwiLiI7CisgIHN0YXRpYyBjb25zdCB3c3RyaW5nIGtEb3REb3QgPSBMIi4uIjsKKyAgV0lOMzJfRklORF9EQVRBVyBtZXRhZGF0YTsKKyAgSEFORExFIGhhbmRsZSA9IDo6RmluZEZpcnN0RmlsZVcod3BhdGguY19zdHIoKSwgJm1ldGFkYXRhKTsKKyAgaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIC8vIFRoZSBwYXR0ZXJuIGRvZXMgbm90IG1hdGNoIGFueSBmaWxlcyAob3IgZGlyZWN0b3JpZXMpLgorICAgIHJldHVybiBFeHBhbmRXaWxkY2FyZHNSZXN1bHQ6OmtFcnJvck5vTWF0Y2hpbmdGaWxlOworICB9CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gcGF0aC5maW5kX2xhc3Rfb2YoIlxcLyIpOworICBzdHJpbmcgZGlybmFtZTsKKyAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBkaXJuYW1lID0gcGF0aC5zdWJzdHIoMCwgcG9zICsgMSk7CisgIH0KKworICBFeHBhbmRXaWxkY2FyZHNSZXN1bHQgbWF0Y2hlZCA9IEV4cGFuZFdpbGRjYXJkc1Jlc3VsdDo6a0Vycm9yTm9NYXRjaGluZ0ZpbGU7CisgIGRvIHsKKyAgICAvLyBJZ25vcmUgIi4iLCAiLi4iLCBhbmQgZGlyZWN0b3JpZXMuCisgICAgaWYgKChtZXRhZGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSA9PSAwICYmCisgICAgICAgIGtEb3QgIT0gbWV0YWRhdGEuY0ZpbGVOYW1lICYmIGtEb3REb3QgIT0gbWV0YWRhdGEuY0ZpbGVOYW1lKSB7CisgICAgICBtYXRjaGVkID0gRXhwYW5kV2lsZGNhcmRzUmVzdWx0OjprU3VjY2VzczsKKyAgICAgIHN0cmluZyBmaWxlbmFtZTsKKyAgICAgIGlmICghc3RyaW5nczo6d2NzX3RvX3V0ZjgobWV0YWRhdGEuY0ZpbGVOYW1lLCAmZmlsZW5hbWUpKSB7CisgICAgICAgIG1hdGNoZWQgPSBFeHBhbmRXaWxkY2FyZHNSZXN1bHQ6OmtFcnJvck91dHB1dFBhdGhDb252ZXJzaW9uOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGRpcm5hbWUuZW1wdHkoKSkgeworICAgICAgICBjb25zdW1lKGZpbGVuYW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN1bWUoZGlybmFtZSArIGZpbGVuYW1lKTsKKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKDo6RmluZE5leHRGaWxlVyhoYW5kbGUsICZtZXRhZGF0YSkpOworICBGaW5kQ2xvc2UoaGFuZGxlKTsKKyAgcmV0dXJuIG1hdGNoZWQ7Cit9CisKK25hbWVzcGFjZSBzdHJpbmdzIHsKKworYm9vbCB3Y3NfdG9fbWJzKGNvbnN0IFdDSEFSKiBzLCBzdHJpbmcqIG91dCwgYm9vbCBvdXRVdGY4KSB7CisgIGlmIChudWxsX29yX2VtcHR5KHMpKSB7CisgICAgb3V0LT5jbGVhcigpOworICAgIHJldHVybiB0cnVlOworICB9CisgIEJPT0wgdXNlZERlZmF1bHRDaGFyID0gRkFMU0U7CisgIFNldExhc3RFcnJvcigwKTsKKyAgaW50IHNpemUgPSBXaWRlQ2hhclRvTXVsdGlCeXRlKAorICAgICAgb3V0VXRmOCA/IENQX1VURjggOiBDUF9BQ1AsIDAsIHMsIC0xLCBudWxscHRyLCAwLCBudWxscHRyLAorICAgICAgb3V0VXRmOCA/IG51bGxwdHIgOiAmdXNlZERlZmF1bHRDaGFyKTsKKyAgaWYgKChzaXplID09IDAgJiYgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikKKyAgICAgIHx8IHVzZWREZWZhdWx0Q2hhcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBzdGQ6OnVuaXF1ZV9wdHI8Q0hBUltdPiBhc3RyKG5ldyBDSEFSW3NpemVdKTsKKyAgV2lkZUNoYXJUb011bHRpQnl0ZSgKKyAgICAgIG91dFV0ZjggPyBDUF9VVEY4IDogQ1BfQUNQLCAwLCBzLCAtMSwgYXN0ci5nZXQoKSwgc2l6ZSwgbnVsbHB0ciwgbnVsbHB0cik7CisgIG91dC0+YXNzaWduKGFzdHIuZ2V0KCkpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBtYnNfdG9fd2NzKGNvbnN0IGNoYXIqIHMsIHdzdHJpbmcqIG91dCwgYm9vbCBpblV0ZjgpIHsKKyAgaWYgKG51bGxfb3JfZW1wdHkocykpIHsKKyAgICBvdXQtPmNsZWFyKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBTZXRMYXN0RXJyb3IoMCk7CisgIGludCBzaXplID0KKyAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoaW5VdGY4ID8gQ1BfVVRGOCA6IENQX0FDUCwgMCwgcywgLTEsIG51bGxwdHIsIDApOworICBpZiAoc2l6ZSA9PSAwICYmIEdldExhc3RFcnJvcigpICE9IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RkOjp1bmlxdWVfcHRyPFdDSEFSW10+IHdzdHIobmV3IFdDSEFSW3NpemVdKTsKKyAgTXVsdGlCeXRlVG9XaWRlQ2hhcigKKyAgICAgIGluVXRmOCA/IENQX1VURjggOiBDUF9BQ1AsIDAsIHMsIC0xLCB3c3RyLmdldCgpLCBzaXplICsgMSk7CisgIG91dC0+YXNzaWduKHdzdHIuZ2V0KCkpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCB1dGY4X3RvX3djcyhjb25zdCBjaGFyKiBpbnB1dCwgd3N0cmluZyogb3V0KSB7CisgIHJldHVybiBtYnNfdG9fd2NzKGlucHV0LCBvdXQsIHRydWUpOworfQorCitib29sIHdjc190b191dGY4KGNvbnN0IHdjaGFyX3QqIGlucHV0LCBzdHJpbmcqIG91dCkgeworICByZXR1cm4gd2NzX3RvX21icyhpbnB1dCwgb3V0LCB0cnVlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHN0cmluZ3MKK30gIC8vIG5hbWVzcGFjZSB3aW4zMgorfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBkZWZpbmVkKF9XSU4zMikKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vaW9fd2luMzIuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vaW9fd2luMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzJiNGVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMi5oCkBAIC0wLDAgKzEsMTQxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBsYXN6bG9jc29tb3JAZ29vZ2xlLmNvbSAoTGFzemxvIENzb21vcikKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBmb3IgV2luZG93cyBpbXBsZW1lbnRhdGlvbnMgb2YKKy8vIGNvbW1vbmx5IHVzZWQgUE9TSVggZnVuY3Rpb25zIHN1Y2ggYXMgb3BlbigyKSBhbmQgYWNjZXNzKDIpLCBhcyB3ZWxsCisvLyBhcyBtYWNybyBkZWZpbml0aW9ucyBmb3IgZmxhZ3Mgb2YgdGhlc2UgZnVuY3Rpb25zLgorLy8KKy8vIEJ5IGluY2x1ZGluZyB0aGlzIGZpbGUgeW91J2xsIHJlZGVmaW5lIG9wZW4vYWNjZXNzL2V0Yy4gdG8KKy8vIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjp7b3Blbi9hY2Nlc3MvZXRjLn0uCisvLyBNYWtlIHN1cmUgeW91IGRvbid0IGluY2x1ZGUgYSBoZWFkZXIgdGhhdCBhdHRlbXB0cyB0byByZWRlY2xhcmUgb3IKKy8vIHJlZGVmaW5lIHRoZXNlIGZ1bmN0aW9ucywgdGhhdCdsbCBsZWFkIHRvIGNvbmZ1c2luZyBjb21waWxhdGlvbgorLy8gZXJyb3JzLiBJdCdzIGJlc3QgdG8gI2luY2x1ZGUgdGhpcyBmaWxlIGFzIHRoZSBsYXN0IG9uZSB0byBlbnN1cmUgdGhhdC4KKy8vCisvLyBUaGlzIGZpbGUgaXMgb25seSB1c2VkIG9uIFdpbmRvd3MsIGl0J3MgZW1wdHkgb24gb3RoZXIgcGxhdGZvcm1zLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19JT19XSU4zMl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lPX0lPX1dJTjMyX0hfXworCisjaWYgZGVmaW5lZChfV0lOMzIpCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0Lmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCisvLyBDb21waWxlcnMgb24gV2luZG93cyBvdGhlciB0aGFuIE1TVkMgKGUuZy4gQ3lnd2luLCBNaW5HVzMyKSBkZWZpbmUgdGhlCisvLyBmb2xsb3dpbmcgZnVuY3Rpb25zIGFscmVhZHksIGV4Y2VwdCBmb3IgbWtkaXIuCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworbmFtZXNwYWNlIHdpbjMyIHsKKworUFJPVE9CVUZfRVhQT1JUIEZJTEUqIGZvcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG1vZGUpOworUFJPVE9CVUZfRVhQT1JUIGludCBhY2Nlc3MoY29uc3QgY2hhciogcGF0aCwgaW50IG1vZGUpOworUFJPVE9CVUZfRVhQT1JUIGludCBjaGRpcihjb25zdCBjaGFyKiBwYXRoKTsKK1BST1RPQlVGX0VYUE9SVCBpbnQgY2xvc2UoaW50IGZkKTsKK1BST1RPQlVGX0VYUE9SVCBpbnQgZHVwKGludCBmZCk7CitQUk9UT0JVRl9FWFBPUlQgaW50IGR1cDIoaW50IGZkMSwgaW50IGZkMik7CitQUk9UT0JVRl9FWFBPUlQgaW50IG1rZGlyKGNvbnN0IGNoYXIqIHBhdGgsIGludCBfbW9kZSk7CitQUk9UT0JVRl9FWFBPUlQgaW50IG9wZW4oY29uc3QgY2hhciogcGF0aCwgaW50IGZsYWdzLCBpbnQgbW9kZSA9IDApOworUFJPVE9CVUZfRVhQT1JUIGludCByZWFkKGludCBmZCwgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CitQUk9UT0JVRl9FWFBPUlQgaW50IHNldG1vZGUoaW50IGZkLCBpbnQgbW9kZSk7CitQUk9UT0JVRl9FWFBPUlQgaW50IHN0YXQoY29uc3QgY2hhciogcGF0aCwgc3RydWN0IF9zdGF0KiBidWZmZXIpOworUFJPVE9CVUZfRVhQT1JUIGludCB3cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworUFJPVE9CVUZfRVhQT1JUIHN0ZDo6d3N0cmluZyB0ZXN0b25seV91dGY4X3RvX3dpbnBhdGgoY29uc3QgY2hhciogcGF0aCk7CisKK2VudW0gY2xhc3MgRXhwYW5kV2lsZGNhcmRzUmVzdWx0IHsKKyAga1N1Y2Nlc3MgPSAwLAorICBrRXJyb3JOb01hdGNoaW5nRmlsZSA9IDEsCisgIGtFcnJvcklucHV0UGF0aENvbnZlcnNpb24gPSAyLAorICBrRXJyb3JPdXRwdXRQYXRoQ29udmVyc2lvbiA9IDMsCit9OworCisvLyBFeHBhbmQgd2lsZGNhcmRzIGluIGEgcGF0aCBwYXR0ZXJuLCBmZWVkIHRoZSByZXN1bHQgdG8gYSBjb25zdW1lciBmdW5jdGlvbi4KKy8vCisvLyBgcGF0aGAgbXVzdCBiZSBhIHZhbGlkLCBXaW5kb3dzLXN0eWxlIHBhdGguIEl0IG1heSBiZSBhYnNvbHV0ZSwgb3IgcmVsYXRpdmUKKy8vIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgaXQgbWF5IGNvbnRhaW4gd2lsZGNhcmRzICgiKiIgYW5kICI/IikKKy8vIGluIHRoZSBsYXN0IHBhdGggc2VnbWVudC4gVGhpcyBmdW5jdGlvbiBwYXNzZXMgYWxsIG1hdGNoaW5nIGZpbGUgbmFtZXMgdG8KKy8vIGBjb25zdW1lYC4gVGhlIHJlc3VsdGluZyBwYXRocyBtYXkgbm90IGJlIGFic29sdXRlIG5vciBub3JtYWxpemVkLgorLy8KKy8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgdmFsdWUgZnJvbSBgRXhwYW5kV2lsZGNhcmRzUmVzdWx0YC4KK1BST1RPQlVGX0VYUE9SVCBFeHBhbmRXaWxkY2FyZHNSZXN1bHQgRXhwYW5kV2lsZGNhcmRzKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmKT4gY29uc3VtZSk7CisKK25hbWVzcGFjZSBzdHJpbmdzIHsKKworLy8gQ29udmVydCBmcm9tIFVURi0xNiB0byBBY3RpdmUtQ29kZS1QYWdlLWVuY29kZWQgb3IgdG8gVVRGLTgtZW5jb2RlZCB0ZXh0LgorUFJPVE9CVUZfRVhQT1JUIGJvb2wgd2NzX3RvX21icyhjb25zdCB3Y2hhcl90KiBzLCBzdGQ6OnN0cmluZyogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG91dFV0ZjgpOworCisvLyBDb252ZXJ0IGZyb20gQWN0aXZlLUNvZGUtUGFnZS1lbmNvZGVkIG9yIFVURi04LWVuY29kZWQgdGV4dCB0byBVVEYtMTYuCitQUk9UT0JVRl9FWFBPUlQgYm9vbCBtYnNfdG9fd2NzKGNvbnN0IGNoYXIqIHMsIHN0ZDo6d3N0cmluZyogb3V0LCBib29sIGluVXRmOCk7CisKKy8vIENvbnZlcnQgZnJvbSBVVEYtOC1lbmNvZGVkIHRleHQgdG8gVVRGLTE2LgorUFJPVE9CVUZfRVhQT1JUIGJvb2wgdXRmOF90b193Y3MoY29uc3QgY2hhciogaW5wdXQsIHN0ZDo6d3N0cmluZyogb3V0KTsKKworLy8gQ29udmVydCBmcm9tIFVURi0xNi1lbmNvZGVkIHRleHQgdG8gVVRGLTguCitQUk9UT0JVRl9FWFBPUlQgYm9vbCB3Y3NfdG9fdXRmOChjb25zdCB3Y2hhcl90KiBpbnB1dCwgc3RkOjpzdHJpbmcqIG91dCk7CisKK30gIC8vIG5hbWVzcGFjZSBzdHJpbmdzCisKK30gIC8vIG5hbWVzcGFjZSB3aW4zMgorfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2lmbmRlZiBXX09LCisjZGVmaW5lIFdfT0sgMDIgIC8vIG5vdCBkZWZpbmVkIGJ5IE1TVkMgZm9yIHdoYXRldmVyIHJlYXNvbgorI2VuZGlmCisKKyNpZm5kZWYgRl9PSworI2RlZmluZSBGX09LIDAwICAvLyBub3QgZGVmaW5lZCBieSBNU1ZDIGZvciB3aGF0ZXZlciByZWFzb24KKyNlbmRpZgorCisjaWZuZGVmIFNURElOX0ZJTEVOTworI2RlZmluZSBTVERJTl9GSUxFTk8gMAorI2VuZGlmCisKKyNpZm5kZWYgU1RET1VUX0ZJTEVOTworI2RlZmluZSBTVERPVVRfRklMRU5PIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIGRlZmluZWQoX1dJTjMyKQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JT19JT19XSU4zMl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vaW9fd2luMzJfdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZjM3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNjMxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBsYXN6bG9jc29tb3JAZ29vZ2xlLmNvbSAoTGFzemxvIENzb21vcikKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisvLyBVbml0IHRlc3RzIGZvciBsb25nLXBhdGgtYXdhcmUgb3Blbi9ta2Rpci9hY2Nlc3MvZXRjLiBvbiBXaW5kb3dzLCBhcyB3ZWxsIGFzCisvLyBmb3IgdGhlIHN1cHBvcnRpbmcgdXRpbGl0eSBmdW5jdGlvbnMuCisvLworLy8gVGhpcyBmaWxlIGlzIG9ubHkgdXNlZCBvbiBXaW5kb3dzLCBpdCdzIGVtcHR5IG9uIG90aGVyIHBsYXRmb3Jtcy4KKworI2lmIGRlZmluZWQoX1dJTjMyKQorCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vaW9fd2luMzIuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHdjaGFyLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CituYW1lc3BhY2Ugd2luMzIgeworbmFtZXNwYWNlIHsKKworY29uc3QgY2hhciBrVXRmOFRleHRbXSA9IHsKKyAgICAnaCcsICdpJywgJyAnLAorICAgIC8vIHV0Zi04OiAxMTAxMDAwMCAxMDAxMTExMSwgdXRmLTE2OiAxMDAgMDAwMSAxMTExID0gMHgwNDFGCisgICAgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhkMCksIHN0YXRpY19jYXN0PGNoYXI+KDB4OWYpLAorICAgIC8vIHV0Zi04OiAxMTAxMDAwMSAxMDAwMDAwMCwgdXRmLTE2OiAxMDAgMDEwMCAwMDAwID0gMHgwNDQwCisgICAgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhkMSksIHN0YXRpY19jYXN0PGNoYXI+KDB4ODApLAorICAgIC8vIHV0Zi04OiAxMTAxMDAwMCAxMDExMTAwMCwgdXRmLTE2OiAxMDAgMDAxMSAxMDAwID0gMHgwNDM4CisgICAgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhkMCksIHN0YXRpY19jYXN0PGNoYXI+KDB4YjgpLAorICAgIC8vIHV0Zi04OiAxMTAxMDAwMCAxMDExMDAxMCwgdXRmLTE2OiAxMDAgMDAxMSAwMDEwID0gMHgwNDMyCisgICAgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhkMCksIHN0YXRpY19jYXN0PGNoYXI+KDB4YjIpLAorICAgIC8vIHV0Zi04OiAxMTAxMDAwMCAxMDExMDEwMSwgdXRmLTE2OiAxMDAgMDAxMSAwMTAxID0gMHgwNDM1CisgICAgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhkMCksIHN0YXRpY19jYXN0PGNoYXI+KDB4YjUpLAorICAgIC8vIHV0Zi04OiAxMTAxMDAwMSAxMDAwMDAxMCwgdXRmLTE2OiAxMDAgMDEwMCAwMDEwID0gMHgwNDQyCisgICAgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhkMSksIHN0YXRpY19jYXN0PGNoYXI+KDB4ODIpLCAwCit9OworCitjb25zdCB3Y2hhcl90IGtVdGYxNlRleHRbXSA9IHsKKyAgTCdoJywgTCdpJywgTCcgJywKKyAgTCdceDQxZicsIEwnXHg0NDAnLCBMJ1x4NDM4JywgTCdceDQzMicsIEwnXHg0MzUnLCBMJ1x4NDQyJywgMAorfTsKKwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKK3VzaW5nIHN0ZDo6d3N0cmluZzsKKworY2xhc3MgSW9XaW4zMlRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZvaWQgU2V0VXAoKTsKKyAgdm9pZCBUZWFyRG93bigpOworCisgcHJvdGVjdGVkOgorICBib29sIENyZWF0ZUFsbFVuZGVyKHdzdHJpbmcgcGF0aCk7CisgIGJvb2wgRGVsZXRlQWxsVW5kZXIod3N0cmluZyBwYXRoKTsKKworICBXQ0hBUiB3b3JraW5nX2RpcmVjdG9yeVtNQVhfUEFUSF07CisgIHN0cmluZyB0ZXN0X3RtcGRpcjsKKyAgd3N0cmluZyB3dGVzdF90bXBkaXI7Cit9OworCisjZGVmaW5lIEFTU0VSVF9JTklUSUFMSVpFRCAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFWFBFQ1RfRkFMU0UodGVzdF90bXBkaXIuZW1wdHkoKSk7ICBcCisgICAgRVhQRUNUX0ZBTFNFKHd0ZXN0X3RtcGRpci5lbXB0eSgpKTsgXAorICB9CisKK25hbWVzcGFjZSB7Cit2b2lkIFN0cmlwVHJhaWxpbmdTbGFzaGVzKHN0cmluZyogc3RyKSB7CisgIGludCBpID0gc3RyLT5zaXplKCkgLSAxOworICBmb3IgKDsgaSA+PSAwICYmICgoKnN0cilbaV0gPT0gJy8nIHx8ICgqc3RyKVtpXSA9PSAnXFwnKTsgLS1pKSB7fQorICBzdHItPnJlc2l6ZShpKzEpOworfQorCitib29sIEdldEVudlZhckFzVXRmOChjb25zdCBXQ0hBUiogbmFtZSwgc3RyaW5nKiByZXN1bHQpIHsKKyAgRFdPUkQgc2l6ZSA9IDo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZVcobmFtZSwgbnVsbHB0ciwgMCk7CisgIGlmIChzaXplID4gMCAmJiBHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9FTlZWQVJfTk9UX0ZPVU5EKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdDSEFSW10+IHdjcyhuZXcgV0NIQVJbc2l6ZV0pOworICAgIDo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZVcobmFtZSwgd2NzLmdldCgpLCBzaXplKTsKKyAgICAvLyBHZXRFbnZpcm9ubWVudFZhcmlhYmxlQSByZXRyaWV2ZXMgYW4gQWN0aXZlLUNvZGUtUGFnZS1lbmNvZGVkIHRleHQgd2hpY2gKKyAgICAvLyB3ZSdkIGZpcnN0IG5lZWQgdG8gY29udmVydCB0byBVVEYtMTYgdGhlbiB0byBVVEYtOCwgYmVjYXVzZSB0aGVyZSBzZWVtcworICAgIC8vIHRvIGJlIG5vIEFQSSBmdW5jdGlvbiB0byBkbyB0aGF0IGNvbnZlcnNpb24gZGlyZWN0bHkuCisgICAgLy8gR2V0RW52aXJvbm1lbnRWYXJpYWJsZVcgcmV0cmlldmVzIGFuIFVURi0xNi1lbmNvZGVkIHRleHQsIHdoaWNoIHdlIG5lZWQKKyAgICAvLyB0byBjb252ZXJ0IHRvIFVURi04LgorICAgIHJldHVybiBzdHJpbmdzOjp3Y3NfdG9fdXRmOCh3Y3MuZ2V0KCksIHJlc3VsdCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgR2V0Q3dkQXNVdGY4KHN0cmluZyogcmVzdWx0KSB7CisgIERXT1JEIHNpemUgPSA6OkdldEN1cnJlbnREaXJlY3RvcnlXKDAsIG51bGxwdHIpOworICBpZiAoc2l6ZSA+IDApIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8V0NIQVJbXT4gd2NzKG5ldyBXQ0hBUltzaXplXSk7CisgICAgOjpHZXRDdXJyZW50RGlyZWN0b3J5VyhzaXplLCB3Y3MuZ2V0KCkpOworICAgIC8vIEdldEN1cnJlbnREaXJlY3RvcnlBIHJldHJpZXZlcyBhbiBBY3RpdmUtQ29kZS1QYWdlLWVuY29kZWQgdGV4dCB3aGljaAorICAgIC8vIHdlJ2QgZmlyc3QgbmVlZCB0byBjb252ZXJ0IHRvIFVURi0xNiB0aGVuIHRvIFVURi04LCBiZWNhdXNlIHRoZXJlIHNlZW1zCisgICAgLy8gdG8gYmUgbm8gQVBJIGZ1bmN0aW9uIHRvIGRvIHRoYXQgY29udmVyc2lvbiBkaXJlY3RseS4KKyAgICAvLyBHZXRDdXJyZW50RGlyZWN0b3J5VyByZXRyaWV2ZXMgYW4gVVRGLTE2LWVuY29kZWQgdGV4dCwgd2hpY2ggd2UgbmVlZAorICAgIC8vIHRvIGNvbnZlcnQgdG8gVVRGLTguCisgICAgcmV0dXJuIHN0cmluZ3M6Ondjc190b191dGY4KHdjcy5nZXQoKSwgcmVzdWx0KTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBDcmVhdGVFbXB0eUZpbGUoY29uc3Qgd3N0cmluZyYgcGF0aCkgeworICBIQU5ETEUgaCA9IENyZWF0ZUZpbGVXKHBhdGguY19zdHIoKSwgR0VORVJJQ19XUklURSwgMCwgTlVMTCwgQ1JFQVRFX0FMV0FZUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOworICBpZiAoaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBDbG9zZUhhbmRsZShoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIElvV2luMzJUZXN0OjpTZXRVcCgpIHsKKyAgdGVzdF90bXBkaXIuY2xlYXIoKTsKKyAgd3Rlc3RfdG1wZGlyLmNsZWFyKCk7CisgIERXT1JEIHNpemUgPSA6OkdldEN1cnJlbnREaXJlY3RvcnlXKE1BWF9QQVRILCB3b3JraW5nX2RpcmVjdG9yeSk7CisgIEVYUEVDVF9HVChzaXplLCAwVSk7CisgIEVYUEVDVF9MVChzaXplLCBzdGF0aWNfY2FzdDxEV09SRD4oTUFYX1BBVEgpKTsKKworICBzdHJpbmcgdG1wOworICBib29sIG9rID0gZmFsc2U7CisgIGlmICghb2spIHsKKyAgICAvLyBCYXplbCBzZXRzIHRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBpdCBydW5zIHRlc3RzLgorICAgIG9rID0gR2V0RW52VmFyQXNVdGY4KEwiVEVTVF9UTVBESVIiLCAmdG1wKTsKKyAgfQorICBpZiAoIW9rKSB7CisgICAgLy8gQmF6ZWwgMC44LjAgc2V0cyB0aGlzIGVudmlyb25tZW50IGZvciBldmVyeSBidWlsZCBhbmQgdGVzdCBhY3Rpb24uCisgICAgb2sgPSBHZXRFbnZWYXJBc1V0ZjgoTCJURU1QIiwgJnRtcCk7CisgIH0KKyAgaWYgKCFvaykgeworICAgIC8vIEJhemVsIDAuOC4wIHNldHMgdGhpcyBlbnZpcm9ubWVudCBmb3IgZXZlcnkgYnVpbGQgYW5kIHRlc3QgYWN0aW9uLgorICAgIG9rID0gR2V0RW52VmFyQXNVdGY4KEwiVE1QIiwgJnRtcCk7CisgIH0KKyAgaWYgKCFvaykgeworICAgIC8vIEZhbGwgYmFjayB0byB1c2luZyB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgICAgb2sgPSBHZXRDd2RBc1V0ZjgoJnRtcCk7CisgIH0KKyAgaWYgKCFvayB8fCB0bXAuZW1wdHkoKSkgeworICAgIEZBSUwoKSA8PCAiQ2Fubm90IGZpbmQgYSB0ZW1wIGRpcmVjdG9yeS4iOworICB9CisKKyAgU3RyaXBUcmFpbGluZ1NsYXNoZXMoJnRtcCk7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgLy8gRGVsZXRpbmcgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGlzIGFzeW5jaHJvbm91cyBvbiBXaW5kb3dzLCBhbmQgaWYgVGVhckRvd24KKyAgLy8ganVzdCBkZWxldGVkIHRoZSBwcmV2aW91cyB0ZW1wIGRpcmVjdG9yeSwgc29tZXRpbWVzIHdlIGNhbm5vdCByZWNyZWF0ZSB0aGUKKyAgLy8gc2FtZSBkaXJlY3RvcnkuCisgIC8vIFVzZSBhIGNvdW50ZXIgc28gZXZlcnkgdGVzdCBtZXRob2QgZ2V0cyBpdHMgb3duIHRlbXAgZGlyZWN0b3J5LgorICBzdGF0aWMgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOworICByZXN1bHQgPDwgdG1wIDw8ICJcXHczMnRzdCIgPDwgY291bnRlcisrIDw8ICIudG1wIjsKKyAgdGVzdF90bXBkaXIgPSByZXN1bHQuc3RyKCk7CisgIHd0ZXN0X3RtcGRpciA9IHRlc3Rvbmx5X3V0ZjhfdG9fd2lucGF0aCh0ZXN0X3RtcGRpci5jX3N0cigpKTsKKyAgQVNTRVJUX0ZBTFNFKHd0ZXN0X3RtcGRpci5lbXB0eSgpKTsKKyAgQVNTRVJUX1RSVUUoRGVsZXRlQWxsVW5kZXIod3Rlc3RfdG1wZGlyKSk7CisgIEFTU0VSVF9UUlVFKENyZWF0ZUFsbFVuZGVyKHd0ZXN0X3RtcGRpcikpOworfQorCit2b2lkIElvV2luMzJUZXN0OjpUZWFyRG93bigpIHsKKyAgaWYgKCF3dGVzdF90bXBkaXIuZW1wdHkoKSkgeworICAgIERlbGV0ZUFsbFVuZGVyKHd0ZXN0X3RtcGRpcik7CisgIH0KKyAgOjpTZXRDdXJyZW50RGlyZWN0b3J5Vyh3b3JraW5nX2RpcmVjdG9yeSk7Cit9CisKK2Jvb2wgSW9XaW4zMlRlc3Q6OkNyZWF0ZUFsbFVuZGVyKHdzdHJpbmcgcGF0aCkgeworICAvLyBQcmVwZW5kIFVOQyBwcmVmaXggaWYgdGhlIHBhdGggZG9lc24ndCBoYXZlIGl0IGFscmVhZHkuIERvbid0IGJvdGhlcgorICAvLyBjaGVja2luZyBpZiB0aGUgcGF0aCBpcyBzaG9ydGVyIHRoYW4gTUFYX1BBVEgsIGxldCdzIGp1c3QgZG8gaXQKKyAgLy8gdW5jb25kaXRpb25hbGx5LgorICBpZiAocGF0aC5maW5kKEwiXFxcXD9cXCIpICE9IDApIHsKKyAgICBwYXRoID0gd3N0cmluZyhMIlxcXFw/XFwiKSArIHBhdGg7CisgIH0KKyAgaWYgKDo6Q3JlYXRlRGlyZWN0b3J5VyhwYXRoLmNfc3RyKCksIG51bGxwdHIpIHx8CisgICAgICBHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9BTFJFQURZX0VYSVNUUyB8fAorICAgICAgR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfQUNDRVNTX0RFTklFRCkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9QQVRIX05PVF9GT1VORCkgeworICAgIHNpemVfdCBwb3MgPSBwYXRoLmZpbmRfbGFzdF9vZihMJ1xcJyk7CisgICAgaWYgKHBvcyAhPSB3c3RyaW5nOjpucG9zKSB7CisgICAgICB3c3RyaW5nIHBhcmVudChwYXRoLCAwLCBwb3MpOworICAgICAgaWYgKENyZWF0ZUFsbFVuZGVyKHBhcmVudCkgJiYgQ3JlYXRlRGlyZWN0b3J5VyhwYXRoLmNfc3RyKCksIG51bGxwdHIpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSW9XaW4zMlRlc3Q6OkRlbGV0ZUFsbFVuZGVyKHdzdHJpbmcgcGF0aCkgeworICBzdGF0aWMgY29uc3Qgd3N0cmluZyBrRG90KEwiLiIpOworICBzdGF0aWMgY29uc3Qgd3N0cmluZyBrRG90RG90KEwiLi4iKTsKKworICAvLyBQcmVwZW5kIFVOQyBwcmVmaXggaWYgdGhlIHBhdGggZG9lc24ndCBoYXZlIGl0IGFscmVhZHkuIERvbid0IGJvdGhlcgorICAvLyBjaGVja2luZyBpZiB0aGUgcGF0aCBpcyBzaG9ydGVyIHRoYW4gTUFYX1BBVEgsIGxldCdzIGp1c3QgZG8gaXQKKyAgLy8gdW5jb25kaXRpb25hbGx5LgorICBpZiAocGF0aC5maW5kKEwiXFxcXD9cXCIpICE9IDApIHsKKyAgICBwYXRoID0gd3N0cmluZyhMIlxcXFw/XFwiKSArIHBhdGg7CisgIH0KKyAgLy8gQXBwZW5kICJcIiBpZiBuZWNlc3NhcnkuCisgIGlmIChwYXRoW3BhdGguc2l6ZSgpIC0gMV0gIT0gTCdcXCcpIHsKKyAgICBwYXRoLnB1c2hfYmFjayhMJ1xcJyk7CisgIH0KKworICBXSU4zMl9GSU5EX0RBVEFXIG1ldGFkYXRhOworICBIQU5ETEUgaGFuZGxlID0gOjpGaW5kRmlyc3RGaWxlVygocGF0aCArIEwiKiIpLmNfc3RyKCksICZtZXRhZGF0YSk7CisgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICByZXR1cm4gdHJ1ZTsgIC8vIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0CisgIH0KKworICBib29sIHJlc3VsdCA9IHRydWU7CisgIGRvIHsKKyAgICB3c3RyaW5nIGNoaWxkbmFtZSA9IG1ldGFkYXRhLmNGaWxlTmFtZTsKKyAgICBpZiAoa0RvdCAhPSBjaGlsZG5hbWUgJiYga0RvdERvdCAhPSBjaGlsZG5hbWUpIHsKKyAgICAgIHdzdHJpbmcgY2hpbGRwYXRoID0gcGF0aCArIGNoaWxkbmFtZTsKKyAgICAgIGlmICgobWV0YWRhdGEuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgIT0gMCkgeworICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIGp1bmN0aW9uLCBkZWxldGUgaXRzIGNvbnRlbnRzIHJlY3Vyc2l2ZWx5LgorICAgICAgICAvLyBGaW5hbGx5IGRlbGV0ZSB0aGlzIGRpcmVjdG9yeS9qdW5jdGlvbiB0b28uCisgICAgICAgIGlmICgoKG1ldGFkYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9SRVBBUlNFX1BPSU5UKSA9PSAwICYmCisgICAgICAgICAgICAgIURlbGV0ZUFsbFVuZGVyKGNoaWxkcGF0aCkpIHx8CisgICAgICAgICAgICAhOjpSZW1vdmVEaXJlY3RvcnlXKGNoaWxkcGF0aC5jX3N0cigpKSkgeworICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoITo6RGVsZXRlRmlsZVcoY2hpbGRwYXRoLmNfc3RyKCkpKSB7CisgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKDo6RmluZE5leHRGaWxlVyhoYW5kbGUsICZtZXRhZGF0YSkpOworICA6OkZpbmRDbG9zZShoYW5kbGUpOworICByZXR1cm4gcmVzdWx0OworfQorCitURVNUX0YoSW9XaW4zMlRlc3QsIEFjY2Vzc1Rlc3QpIHsKKyAgQVNTRVJUX0lOSVRJQUxJWkVEOworCisgIHN0cmluZyBwYXRoID0gdGVzdF90bXBkaXI7CisgIHdoaWxlIChwYXRoLnNpemUoKSA8IE1BWF9QQVRIIC0gMzApIHsKKyAgICBwYXRoICs9ICJcXGFjY2Vzc3Rlc3QiOworICAgIEVYUEVDVF9FUShta2RpcihwYXRoLmNfc3RyKCksIDA2NDQpLCAwKTsKKyAgfQorICBzdHJpbmcgZmlsZSA9IHBhdGggKyAiXFxmaWxlLnR4dCI7CisgIGludCBmZCA9IG9wZW4oZmlsZS5jX3N0cigpLCBPX0NSRUFUIHwgT19XUk9OTFksIDA2NDQpOworICBpZiAoZmQgPiAwKSB7CisgICAgRVhQRUNUX0VRKGNsb3NlKGZkKSwgMCk7CisgIH0gZWxzZSB7CisgICAgRVhQRUNUX1RSVUUoZmFsc2UpOworICB9CisKKyAgRVhQRUNUX0VRKGFjY2Vzcyh0ZXN0X3RtcGRpci5jX3N0cigpLCBGX09LKSwgMCk7CisgIEVYUEVDVF9FUShhY2Nlc3MocGF0aC5jX3N0cigpLCBGX09LKSwgMCk7CisgIEVYUEVDVF9FUShhY2Nlc3MocGF0aC5jX3N0cigpLCBXX09LKSwgMCk7CisgIEVYUEVDVF9FUShhY2Nlc3MoZmlsZS5jX3N0cigpLCBGX09LIHwgV19PSyksIDApOworICBFWFBFQ1RfTkUoYWNjZXNzKChmaWxlICsgIi5ibGFoIikuY19zdHIoKSwgRl9PSyksIDApOworICBFWFBFQ1RfTkUoYWNjZXNzKChmaWxlICsgIi5ibGFoIikuY19zdHIoKSwgV19PSyksIDApOworCisgIEVYUEVDVF9FUShhY2Nlc3MoIi4iLCBGX09LKSwgMCk7CisgIEVYUEVDVF9FUShhY2Nlc3MoIi4iLCBXX09LKSwgMCk7CisgIEVYUEVDVF9FUShhY2Nlc3MoKHRlc3RfdG1wZGlyICsgIi9hY2Nlc3N0ZXN0IikuY19zdHIoKSwgRl9PSyB8IFdfT0spLCAwKTsKKyAgQVNTRVJUX0VRKGFjY2VzcygodGVzdF90bXBkaXIgKyAiLy4vbm9ybWFsaXplX21lLy4uLy4vYWNjZXNzdGVzdCIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgRl9PSyB8IFdfT0spLAorICAgICAgICAgICAgMCk7CisgIEVYUEVDVF9ORShhY2Nlc3MoImlvX3dpbjMyX3VuaXR0ZXN0LkFjY2Vzc1Rlc3Qubm9uZXhpc3RlbnQiLCBGX09LKSwgMCk7CisgIEVYUEVDVF9ORShhY2Nlc3MoImlvX3dpbjMyX3VuaXR0ZXN0LkFjY2Vzc1Rlc3Qubm9uZXhpc3RlbnQiLCBXX09LKSwgMCk7CisKKyAgQVNTRVJUX0VRKGFjY2VzcygiYzpiYWQiLCBGX09LKSwgLTEpOworICBBU1NFUlRfRVEoZXJybm8sIEVOT0VOVCk7CisgIEFTU0VSVF9FUShhY2Nlc3MoIi90bXAvYmFkIiwgRl9PSyksIC0xKTsKKyAgQVNTRVJUX0VRKGVycm5vLCBFTk9FTlQpOworICBBU1NFUlRfRVEoYWNjZXNzKCJcXGJhZCIsIEZfT0spLCAtMSk7CisgIEFTU0VSVF9FUShlcnJubywgRU5PRU5UKTsKK30KKworVEVTVF9GKElvV2luMzJUZXN0LCBPcGVuVGVzdCkgeworICBBU1NFUlRfSU5JVElBTElaRUQ7CisKKyAgc3RyaW5nIHBhdGggPSB0ZXN0X3RtcGRpcjsKKyAgd2hpbGUgKHBhdGguc2l6ZSgpIDwgTUFYX1BBVEgpIHsKKyAgICBwYXRoICs9ICJcXG9wZW50ZXN0IjsKKyAgICBFWFBFQ1RfRVEobWtkaXIocGF0aC5jX3N0cigpLCAwNjQ0KSwgMCk7CisgIH0KKyAgc3RyaW5nIGZpbGUgPSBwYXRoICsgIlxcZmlsZS50eHQiOworICBpbnQgZmQgPSBvcGVuKGZpbGUuY19zdHIoKSwgT19DUkVBVCB8IE9fV1JPTkxZLCAwNjQ0KTsKKyAgaWYgKGZkID4gMCkgeworICAgIEVYUEVDVF9FUSh3cml0ZShmZCwgImhlbGxvIiwgNSksIDUpOworICAgIEVYUEVDVF9FUShjbG9zZShmZCksIDApOworICB9IGVsc2UgeworICAgIEVYUEVDVF9UUlVFKGZhbHNlKTsKKyAgfQorCisgIEFTU0VSVF9FUShvcGVuKCJjOmJhZC50eHQiLCBPX0NSRUFUIHwgT19XUk9OTFksIDA2NDQpLCAtMSk7CisgIEFTU0VSVF9FUShlcnJubywgRU5PRU5UKTsKKyAgQVNTRVJUX0VRKG9wZW4oIi90bXAvYmFkLnR4dCIsIE9fQ1JFQVQgfCBPX1dST05MWSwgMDY0NCksIC0xKTsKKyAgQVNTRVJUX0VRKGVycm5vLCBFTk9FTlQpOworICBBU1NFUlRfRVEob3BlbigiXFxiYWQudHh0IiwgT19DUkVBVCB8IE9fV1JPTkxZLCAwNjQ0KSwgLTEpOworICBBU1NFUlRfRVEoZXJybm8sIEVOT0VOVCk7Cit9CisKK1RFU1RfRihJb1dpbjMyVGVzdCwgTWtkaXJUZXN0KSB7CisgIEFTU0VSVF9JTklUSUFMSVpFRDsKKworICBzdHJpbmcgcGF0aCA9IHRlc3RfdG1wZGlyOworICBkbyB7CisgICAgcGF0aCArPSAiXFxta2RpcnRlc3QiOworICAgIEFTU0VSVF9FUShta2RpcihwYXRoLmNfc3RyKCksIDA2NDQpLCAwKTsKKyAgfSB3aGlsZSAocGF0aC5zaXplKCkgPD0gTUFYX1BBVEgpOworCisgIEFTU0VSVF9FUShta2RpcigiYzpiYWQiLCAwNjQ0KSwgLTEpOworICBBU1NFUlRfRVEoZXJybm8sIEVOT0VOVCk7CisgIEFTU0VSVF9FUShta2RpcigiL3RtcC9iYWQiLCAwNjQ0KSwgLTEpOworICBBU1NFUlRfRVEoZXJybm8sIEVOT0VOVCk7CisgIEFTU0VSVF9FUShta2RpcigiXFxiYWQiLCAwNjQ0KSwgLTEpOworICBBU1NFUlRfRVEoZXJybm8sIEVOT0VOVCk7Cit9CisKK1RFU1RfRihJb1dpbjMyVGVzdCwgTWtkaXJUZXN0Tm9uQXNjaWkpIHsKKyAgQVNTRVJUX0lOSVRJQUxJWkVEOworCisgIC8vIENyZWF0ZSBhIG5vbi1BU0NJSSBwYXRoLgorICAvLyBFbnN1cmUgdGhhdCB3ZSBjYW4gY3JlYXRlIHRoZSBkaXJlY3RvcnkgdXNpbmcgQ3JlYXRlRGlyZWN0b3J5Vy4KKyAgRVhQRUNUX1RSVUUoQ3JlYXRlRGlyZWN0b3J5Vygod3Rlc3RfdG1wZGlyICsgTCJcXDEiKS5jX3N0cigpLCBudWxscHRyKSk7CisgIEVYUEVDVF9UUlVFKENyZWF0ZURpcmVjdG9yeVcoKHd0ZXN0X3RtcGRpciArIEwiXFwxXFwiICsga1V0ZjE2VGV4dCkuY19zdHIoKSwgbnVsbHB0cikpOworICAvLyBFbnN1cmUgdGhhdCB3ZSBjYW4gY3JlYXRlIGEgdmVyeSBzaW1pbGFybHkgbmFtZWQgZGlyZWN0b3J5IHVzaW5nIG1rZGlyLgorICAvLyBXZSBkb24ndCBhdHRlbXB0IHRvIGRlbGV0ZSBhbmQgcmVjcmVhdGUgdGhlIHNhbWUgZGlyZWN0b3J5LCBiZWNhdXNlIG9uCisgIC8vIFdpbmRvd3MsIGRlbGV0aW5nIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBzZWVtcyB0byBiZSBhc3luY2hyb25vdXMuCisgIEVYUEVDVF9FUShta2RpcigodGVzdF90bXBkaXIgKyAiXFwyIikuY19zdHIoKSwgMDY0NCksIDApOworICBFWFBFQ1RfRVEobWtkaXIoKHRlc3RfdG1wZGlyICsgIlxcMlxcIiArIGtVdGY4VGV4dCkuY19zdHIoKSwgMDY0NCksIDApOworfQorCitURVNUX0YoSW9XaW4zMlRlc3QsIENoZGlyVGVzdCkgeworICBzdHJpbmcgcGF0aCgiQzpcXCIpOworICBFWFBFQ1RfRVEoYWNjZXNzKHBhdGguY19zdHIoKSwgRl9PSyksIDApOworICBBU1NFUlRfRVEoY2hkaXIocGF0aC5jX3N0cigpKSwgMCk7CisKKyAgLy8gRG8gbm90IHRyeSB0byBjaGRpciBpbnRvIHRoZSB0ZXN0X3RtcGRpciwgaXQgbWF5IGFscmVhZHkgY29udGFpbiBkaXJlY3RvcnkKKyAgLy8gbmFtZXMgd2l0aCB0cmFpbGluZyBkb3RzLgorICAvLyBJbnN0ZWFkIHRlc3QgaGVyZSB3aXRoIGFuIG9idmlvdXNseSBkb3QtdHJhaWxlZCBwYXRoLiBJZiB0aGUgd2luMzJfY2hkaXIKKyAgLy8gZnVuY3Rpb24gd291bGQgbm90IGNvbnZlcnQgdGhlIHBhdGggdG8gYWJzb2x1dGUgYW5kIHByZWZpeCB3aXRoICJcXD9cIiB0aGVuCisgIC8vIHRoZSBXaW4zMiBBUEkgd291bGQgaWdub3JlIHRoZSB0cmFpbGluZyBkb3QsIGJ1dCBiZWNhdXNlIG9mIHRoZSBwcmVmaXhpbmcKKyAgLy8gdGhlcmUnbGwgYmUgbm8gcGF0aCBwcm9jZXNzaW5nIGRvbmUsIHNvIHdlJ2xsIGFjdHVhbGx5IGF0dGVtcHQgdG8gY2hkaXIKKyAgLy8gaW50byAiQzpcc29tZVxwYXRoXGZvby4iCisgIHBhdGggPSB0ZXN0X3RtcGRpciArICIvZm9vLiI7CisgIEVYUEVDVF9FUShta2RpcihwYXRoLmNfc3RyKCksIDY0NCksIDApOworICBFWFBFQ1RfRVEoYWNjZXNzKHBhdGguY19zdHIoKSwgRl9PSyksIDApOworICBBU1NFUlRfTkUoY2hkaXIocGF0aC5jX3N0cigpKSwgMCk7Cit9CisKK1RFU1RfRihJb1dpbjMyVGVzdCwgQ2hkaXJUZXN0Tm9uQXNjaWkpIHsKKyAgQVNTRVJUX0lOSVRJQUxJWkVEOworCisgIC8vIENyZWF0ZSBhIGRpcmVjdG9yeSB3aXRoIGEgbm9uLUFTQ0lJIHBhdGggYW5kIGVuc3VyZSB3ZSBjYW4gY2QgaW50byBpdC4KKyAgd3N0cmluZyB3Tm9uQXNjaWkod3Rlc3RfdG1wZGlyICsgTCJcXCIgKyBrVXRmMTZUZXh0KTsKKyAgc3RyaW5nIG5vbkFzY2lpOworICBFWFBFQ1RfVFJVRShzdHJpbmdzOjp3Y3NfdG9fdXRmOCh3Tm9uQXNjaWkuY19zdHIoKSwgJm5vbkFzY2lpKSk7CisgIEVYUEVDVF9UUlVFKENyZWF0ZURpcmVjdG9yeVcod05vbkFzY2lpLmNfc3RyKCksIG51bGxwdHIpKTsKKyAgV0NIQVIgY3dkW01BWF9QQVRIXTsKKyAgRVhQRUNUX1RSVUUoR2V0Q3VycmVudERpcmVjdG9yeVcoTUFYX1BBVEgsIGN3ZCkpOworICAvLyBFbnN1cmUgdGhhdCB3ZSBjYW4gY2QgaW50byB0aGUgcGF0aCB1c2luZyBTZXRDdXJyZW50RGlyZWN0b3J5Vy4KKyAgRVhQRUNUX1RSVUUoU2V0Q3VycmVudERpcmVjdG9yeVcod05vbkFzY2lpLmNfc3RyKCkpKTsKKyAgRVhQRUNUX1RSVUUoU2V0Q3VycmVudERpcmVjdG9yeVcoY3dkKSk7CisgIC8vIEVuc3VyZSB0aGF0IHdlIGNhbiBjZCBpbnRvIHRoZSBwYXRoIHVzaW5nIGNoZGlyLgorICBBU1NFUlRfRVEoY2hkaXIobm9uQXNjaWkuY19zdHIoKSksIDApOworICAvLyBFbnN1cmUgdGhhdCB0aGUgR2V0Q3VycmVudERpcmVjdG9yeVcgcmV0dXJucyB0aGUgZGVzaXJlZCBwYXRoLgorICBFWFBFQ1RfVFJVRShHZXRDdXJyZW50RGlyZWN0b3J5VyhNQVhfUEFUSCwgY3dkKSk7CisgIEFTU0VSVF9FUSh3Tm9uQXNjaWksIGN3ZCk7Cit9CisKK1RFU1RfRihJb1dpbjMyVGVzdCwgRXhwYW5kV2lsZGNhcmRzSW5SZWxhdGl2ZVBhdGhUZXN0KSB7CisgIHdzdHJpbmcgd05vbkFzY2lpKHd0ZXN0X3RtcGRpciArIEwiXFwiICsga1V0ZjE2VGV4dCk7CisgIEVYUEVDVF9UUlVFKENyZWF0ZURpcmVjdG9yeVcod05vbkFzY2lpLmNfc3RyKCksIG51bGxwdHIpKTsKKyAgLy8gQ3JlYXRlIG1vY2sgZmlsZXMgd2Ugd2lsbCB0ZXN0IHBhdHRlcm4gbWF0Y2hpbmcgb24uCisgIEVYUEVDVF9UUlVFKENyZWF0ZUVtcHR5RmlsZSh3Tm9uQXNjaWkgKyBMIlxcZm9vX2EucHJvdG8iKSk7CisgIEVYUEVDVF9UUlVFKENyZWF0ZUVtcHR5RmlsZSh3Tm9uQXNjaWkgKyBMIlxcZm9vX2IucHJvdG8iKSk7CisgIEVYUEVDVF9UUlVFKENyZWF0ZUVtcHR5RmlsZSh3Tm9uQXNjaWkgKyBMIlxcYmFyLnByb3RvIikpOworICAvLyBgY2RgIGludG8gYHd0ZXN0X3RtcGRpcmAuCisgIEVYUEVDVF9UUlVFKFNldEN1cnJlbnREaXJlY3RvcnlXKHd0ZXN0X3RtcGRpci5jX3N0cigpKSk7CisKKyAgaW50IGZvdW5kX2EgPSAwOworICBpbnQgZm91bmRfYiA9IDA7CisgIHZlY3RvcjxzdHJpbmc+IGZvdW5kX2JhZDsKKyAgLy8gQXNzZXJ0IG1hdGNoaW5nIGEgcmVsYXRpdmUgcGF0aCBwYXR0ZXJuLiBSZXN1bHRzIHNob3VsZCBhbHNvIGJlIHJlbGF0aXZlLgorICBFeHBhbmRXaWxkY2FyZHNSZXN1bHQgcmVzdWx0ID0KKyAgICAgIEV4cGFuZFdpbGRjYXJkcyhzdHJpbmcoa1V0ZjhUZXh0KSArICJcXGZvbyoucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgIFsmZm91bmRfYSwgJmZvdW5kX2IsICZmb3VuZF9iYWRdKGNvbnN0IHN0cmluZyYgcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gc3RyaW5nKGtVdGY4VGV4dCkgKyAiXFxmb29fYS5wcm90byIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfYSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwID09IHN0cmluZyhrVXRmOFRleHQpICsgIlxcZm9vX2IucHJvdG8iKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2IrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2JhZC5wdXNoX2JhY2socCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfSk7CisgIEVYUEVDVF9FUShyZXN1bHQsIEV4cGFuZFdpbGRjYXJkc1Jlc3VsdDo6a1N1Y2Nlc3MpOworICBFWFBFQ1RfRVEoZm91bmRfYSwgMSk7CisgIEVYUEVDVF9FUShmb3VuZF9iLCAxKTsKKyAgaWYgKCFmb3VuZF9iYWQuZW1wdHkoKSkgeworICAgIEZBSUwoKSA8PCBmb3VuZF9iYWRbMF07CisgIH0KKworICAvLyBBc3NlcnQgbWF0Y2hpbmcgdGhlIGV4YWN0IGZpbGVuYW1lLgorICBmb3VuZF9hID0gMDsKKyAgZm91bmRfYmFkLmNsZWFyKCk7CisgIHJlc3VsdCA9IEV4cGFuZFdpbGRjYXJkcyhzdHJpbmcoa1V0ZjhUZXh0KSArICJcXGZvb19hLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmZm91bmRfYSwgJmZvdW5kX2JhZF0oY29uc3Qgc3RyaW5nJiBwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwID09IHN0cmluZyhrVXRmOFRleHQpICsgIlxcZm9vX2EucHJvdG8iKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfYSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2JhZC5wdXNoX2JhY2socCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICBFWFBFQ1RfRVEocmVzdWx0LCBFeHBhbmRXaWxkY2FyZHNSZXN1bHQ6OmtTdWNjZXNzKTsKKyAgRVhQRUNUX0VRKGZvdW5kX2EsIDEpOworICBpZiAoIWZvdW5kX2JhZC5lbXB0eSgpKSB7CisgICAgRkFJTCgpIDw8IGZvdW5kX2JhZFswXTsKKyAgfQorfQorCitURVNUX0YoSW9XaW4zMlRlc3QsIEV4cGFuZFdpbGRjYXJkc0luQWJzb2x1dGVQYXRoVGVzdCkgeworICB3c3RyaW5nIHdOb25Bc2NpaSh3dGVzdF90bXBkaXIgKyBMIlxcIiArIGtVdGYxNlRleHQpOworICBFWFBFQ1RfVFJVRShDcmVhdGVEaXJlY3RvcnlXKHdOb25Bc2NpaS5jX3N0cigpLCBudWxscHRyKSk7CisgIC8vIENyZWF0ZSBtb2NrIGZpbGVzIHdlIHdpbGwgdGVzdCBwYXR0ZXJuIG1hdGNoaW5nIG9uLgorICBFWFBFQ1RfVFJVRShDcmVhdGVFbXB0eUZpbGUod05vbkFzY2lpICsgTCJcXGZvb19hLnByb3RvIikpOworICBFWFBFQ1RfVFJVRShDcmVhdGVFbXB0eUZpbGUod05vbkFzY2lpICsgTCJcXGZvb19iLnByb3RvIikpOworICBFWFBFQ1RfVFJVRShDcmVhdGVFbXB0eUZpbGUod05vbkFzY2lpICsgTCJcXGJhci5wcm90byIpKTsKKworICBpbnQgZm91bmRfYSA9IDA7CisgIGludCBmb3VuZF9iID0gMDsKKyAgdmVjdG9yPHN0cmluZz4gZm91bmRfYmFkOworICAvLyBBc3NlcnQgbWF0Y2hpbmcgYW4gYWJzb2x1dGUgcGF0aC4gVGhlIHJlc3VsdHMgc2hvdWxkIGFsc28gdXNlIGFic29sdXRlCisgIC8vIHBhdGguCisgIEV4cGFuZFdpbGRjYXJkc1Jlc3VsdCByZXN1bHQgPQorICAgICAgRXhwYW5kV2lsZGNhcmRzKHN0cmluZyh0ZXN0X3RtcGRpcikgKyAiXFwiICsga1V0ZjhUZXh0ICsgIlxcZm9vKi5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgW3RoaXMsICZmb3VuZF9hLCAmZm91bmRfYiwgJmZvdW5kX2JhZF0oY29uc3Qgc3RyaW5nJiBwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBzdHJpbmcodGhpcy0+dGVzdF90bXBkaXIpICsgIlxcIiArIGtVdGY4VGV4dCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcZm9vX2EucHJvdG8iKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2ErKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocCA9PSBzdHJpbmcodGhpcy0+dGVzdF90bXBkaXIpICsgIlxcIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtVdGY4VGV4dCArICJcXGZvb19iLnByb3RvIikgeworICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9iKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9iYWQucHVzaF9iYWNrKHApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0pOworICBFWFBFQ1RfRVEocmVzdWx0LCBFeHBhbmRXaWxkY2FyZHNSZXN1bHQ6OmtTdWNjZXNzKTsKKyAgRVhQRUNUX0VRKGZvdW5kX2EsIDEpOworICBFWFBFQ1RfRVEoZm91bmRfYiwgMSk7CisgIGlmICghZm91bmRfYmFkLmVtcHR5KCkpIHsKKyAgICBGQUlMKCkgPDwgZm91bmRfYmFkWzBdOworICB9CisKKyAgLy8gQXNzZXJ0IG1hdGNoaW5nIHRoZSBleGFjdCBmaWxlbmFtZS4KKyAgZm91bmRfYSA9IDA7CisgIGZvdW5kX2JhZC5jbGVhcigpOworICByZXN1bHQgPQorICAgICAgRXhwYW5kV2lsZGNhcmRzKHN0cmluZyh0ZXN0X3RtcGRpcikgKyAiXFwiICsga1V0ZjhUZXh0ICsgIlxcZm9vX2EucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgIFt0aGlzLCAmZm91bmRfYSwgJmZvdW5kX2JhZF0oY29uc3Qgc3RyaW5nJiBwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBzdHJpbmcodGhpcy0+dGVzdF90bXBkaXIpICsgIlxcIiArIGtVdGY4VGV4dCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcZm9vX2EucHJvdG8iKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2ErKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2JhZC5wdXNoX2JhY2socCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfSk7CisgIEVYUEVDVF9FUShyZXN1bHQsIEV4cGFuZFdpbGRjYXJkc1Jlc3VsdDo6a1N1Y2Nlc3MpOworICBFWFBFQ1RfRVEoZm91bmRfYSwgMSk7CisgIGlmICghZm91bmRfYmFkLmVtcHR5KCkpIHsKKyAgICBGQUlMKCkgPDwgZm91bmRfYmFkWzBdOworICB9Cit9CisKK1RFU1RfRihJb1dpbjMyVGVzdCwgRXhwYW5kV2lsZGNhcmRzSWdub3Jlc0RpcmVjdG9yaWVzVGVzdCkgeworICB3c3RyaW5nIHdOb25Bc2NpaSh3dGVzdF90bXBkaXIgKyBMIlxcIiArIGtVdGYxNlRleHQpOworICBFWFBFQ1RfVFJVRShDcmVhdGVEaXJlY3RvcnlXKHdOb25Bc2NpaS5jX3N0cigpLCBudWxscHRyKSk7CisgIC8vIENyZWF0ZSBtb2NrIGZpbGVzIHdlIHdpbGwgdGVzdCBwYXR0ZXJuIG1hdGNoaW5nIG9uLgorICBFWFBFQ1RfVFJVRShDcmVhdGVFbXB0eUZpbGUod05vbkFzY2lpICsgTCJcXGZvb19hLnByb3RvIikpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIENyZWF0ZURpcmVjdG9yeVcoKHdOb25Bc2NpaSArIEwiXFxmb29fYi5wcm90byIpLmNfc3RyKCksIG51bGxwdHIpKTsKKyAgRVhQRUNUX1RSVUUoQ3JlYXRlRW1wdHlGaWxlKHdOb25Bc2NpaSArIEwiXFxmb29fYy5wcm90byIpKTsKKyAgLy8gYGNkYCBpbnRvIGB3dGVzdF90bXBkaXJgLgorICBFWFBFQ1RfVFJVRShTZXRDdXJyZW50RGlyZWN0b3J5Vyh3dGVzdF90bXBkaXIuY19zdHIoKSkpOworCisgIGludCBmb3VuZF9hID0gMDsKKyAgaW50IGZvdW5kX2MgPSAwOworICB2ZWN0b3I8c3RyaW5nPiBmb3VuZF9iYWQ7CisgIC8vIEFzc2VydCB0aGF0IHRoZSBwYXR0ZXJuIG1hdGNoZXMgZXhhY3RseSB0aGUgZXhwZWN0ZWQgZmlsZXMsIGFuZCB1c2luZyB0aGUKKyAgLy8gYWJzb2x1dGUgcGF0aCBhcyBkaWQgdGhlIGlucHV0IHBhdHRlcm4uCisgIEV4cGFuZFdpbGRjYXJkc1Jlc3VsdCByZXN1bHQgPQorICAgICAgRXhwYW5kV2lsZGNhcmRzKHN0cmluZyhrVXRmOFRleHQpICsgIlxcZm9vKi5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgWyZmb3VuZF9hLCAmZm91bmRfYywgJmZvdW5kX2JhZF0oY29uc3Qgc3RyaW5nJiBwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBzdHJpbmcoa1V0ZjhUZXh0KSArICJcXGZvb19hLnByb3RvIikgeworICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9hKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHAgPT0gc3RyaW5nKGtVdGY4VGV4dCkgKyAiXFxmb29fYy5wcm90byIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfYysrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfYmFkLnB1c2hfYmFjayhwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgRVhQRUNUX0VRKHJlc3VsdCwgRXhwYW5kV2lsZGNhcmRzUmVzdWx0OjprU3VjY2Vzcyk7CisgIEVYUEVDVF9FUShmb3VuZF9hLCAxKTsKKyAgRVhQRUNUX0VRKGZvdW5kX2MsIDEpOworICBpZiAoIWZvdW5kX2JhZC5lbXB0eSgpKSB7CisgICAgRkFJTCgpIDw8IGZvdW5kX2JhZFswXTsKKyAgfQorfQorCitURVNUX0YoSW9XaW4zMlRlc3QsIEV4cGFuZFdpbGRjYXJkc0ZhaWxzSWZOb0ZpbGVNYXRjaGVzVGVzdCkgeworICB3c3RyaW5nIHdOb25Bc2NpaSh3dGVzdF90bXBkaXIgKyBMIlxcIiArIGtVdGYxNlRleHQpOworICBFWFBFQ1RfVFJVRShDcmVhdGVEaXJlY3RvcnlXKHdOb25Bc2NpaS5jX3N0cigpLCBudWxscHRyKSk7CisgIC8vIENyZWF0ZSBtb2NrIGZpbGVzIHdlIHdpbGwgdGVzdCBwYXR0ZXJuIG1hdGNoaW5nIG9uLgorICBFWFBFQ1RfVFJVRShDcmVhdGVFbXB0eUZpbGUod05vbkFzY2lpICsgTCJcXGZvb19hLnByb3RvIikpOworICAvLyBgY2RgIGludG8gYHd0ZXN0X3RtcGRpcmAuCisgIEVYUEVDVF9UUlVFKFNldEN1cnJlbnREaXJlY3RvcnlXKHd0ZXN0X3RtcGRpci5jX3N0cigpKSk7CisKKyAgLy8gQ29udHJvbCB0ZXN0OiBzaG91bGQgbWF0Y2ggZm9vKi5wcm90bworICBFeHBhbmRXaWxkY2FyZHNSZXN1bHQgcmVzdWx0ID0KKyAgICAgIEV4cGFuZFdpbGRjYXJkcyhzdHJpbmcoa1V0ZjhUZXh0KSArICJcXGZvbyoucHJvdG8iLCBbXShjb25zdCBzdHJpbmcmKSB7fSk7CisgIEVYUEVDVF9FUShyZXN1bHQsIEV4cGFuZFdpbGRjYXJkc1Jlc3VsdDo6a1N1Y2Nlc3MpOworCisgIC8vIENvbnRyb2wgdGVzdDogc2hvdWxkIG1hdGNoIGZvb19hLnByb3RvCisgIHJlc3VsdCA9IEV4cGFuZFdpbGRjYXJkcyhzdHJpbmcoa1V0ZjhUZXh0KSArICJcXGZvb19hLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHN0cmluZyYpIHt9KTsKKyAgRVhQRUNUX0VRKHJlc3VsdCwgRXhwYW5kV2lsZGNhcmRzUmVzdWx0OjprU3VjY2Vzcyk7CisKKyAgLy8gQWN0dWFsIHRlc3Q6IHNob3VsZCBub3QgbWF0Y2ggYW55dGhpbmcuCisgIHJlc3VsdCA9CisgICAgICBFeHBhbmRXaWxkY2FyZHMoc3RyaW5nKGtVdGY4VGV4dCkgKyAiXFxiYXIqLnByb3RvIiwgW10oY29uc3Qgc3RyaW5nJikge30pOworICBBU1NFUlRfRVEocmVzdWx0LCBFeHBhbmRXaWxkY2FyZHNSZXN1bHQ6OmtFcnJvck5vTWF0Y2hpbmdGaWxlKTsKK30KKworVEVTVF9GKElvV2luMzJUZXN0LCBBc1dpbmRvd3NQYXRoVGVzdCkgeworICBEV09SRCBzaXplID0gR2V0Q3VycmVudERpcmVjdG9yeVcoMCwgbnVsbHB0cik7CisgIHN0ZDo6dW5pcXVlX3B0cjx3Y2hhcl90W10+IGN3ZF9zdHIobmV3IHdjaGFyX3Rbc2l6ZV0pOworICBFWFBFQ1RfR1QoR2V0Q3VycmVudERpcmVjdG9yeVcoc2l6ZSwgY3dkX3N0ci5nZXQoKSksIDBVKTsKKyAgd3N0cmluZyBjd2QgPSB3c3RyaW5nKEwiXFxcXD9cXCIpICsgY3dkX3N0ci5nZXQoKTsKKworICBBU1NFUlRfRVEodGVzdG9ubHlfdXRmOF90b193aW5wYXRoKCJyZWxhdGl2ZV9ta2RpcnRlc3QiKSwKKyAgICAgICAgICAgIGN3ZCArIEwiXFxyZWxhdGl2ZV9ta2RpcnRlc3QiKTsKKyAgQVNTRVJUX0VRKHRlc3Rvbmx5X3V0ZjhfdG9fd2lucGF0aCgicHJlc2VydmUvL1xcdHJhaWxpbmcvLy8iKSwKKyAgICAgICAgICAgIGN3ZCArIEwiXFxwcmVzZXJ2ZVxcdHJhaWxpbmdcXCIpOworICBBU1NFUlRfRVEodGVzdG9ubHlfdXRmOF90b193aW5wYXRoKCIuL25vcm1hbGl6ZV9tZVxcLy4uL2JsYWgiKSwKKyAgICAgICAgICAgIGN3ZCArIEwiXFxibGFoIik7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZWxwYXRoOworICBmb3IgKHdjaGFyX3QqIHAgPSBjd2Rfc3RyLmdldCgpOyAqcDsgKytwKSB7CisgICAgaWYgKCpwID09ICcvJyB8fCAqcCA9PSAnXFwnKSB7CisgICAgICByZWxwYXRoIDw8ICIuLi8iOworICAgIH0KKyAgfQorICByZWxwYXRoIDw8ICIuXFwvLi4vXFwuL2JleW9uZC10b3BsZXZlbCI7CisgIEFTU0VSVF9FUSh0ZXN0b25seV91dGY4X3RvX3dpbnBhdGgocmVscGF0aC5zdHIoKS5jX3N0cigpKSwKKyAgICAgICAgICAgIHdzdHJpbmcoTCJcXFxcP1xcIikgKyBjd2Rfc3RyLmdldCgpWzBdICsgTCI6XFxiZXlvbmQtdG9wbGV2ZWwiKTsKKworICAvLyBBYnNvbHV0ZSB1bml4IHBhdGhzIGxhY2sgZHJpdmUgbGV0dGVycywgZHJpdmVsZXNzIGFic29sdXRlIHdpbmRvd3MgcGF0aHMKKyAgLy8gZG8gdG9vLiBOZWl0aGVyIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBkcml2ZS1zcGVjaWZ5aW5nIGFic29sdXRlIFdpbmRvd3MKKyAgLy8gcGF0aC4KKyAgQVNTRVJUX0VRKHRlc3Rvbmx5X3V0ZjhfdG9fd2lucGF0aCgiL2Fic29sdXRlL3VuaXgvcGF0aCIpLCBMIiIpOworICAvLyBUaG91Z2ggdmFsaWQgb24gV2luZG93cywgd2UgYWxzbyBkb24ndCBzdXBwb3J0IFVOQyBwYXRocyAoXFxVTkNcXGJsYWgpLgorICBBU1NFUlRfRVEodGVzdG9ubHlfdXRmOF90b193aW5wYXRoKCJcXGRyaXZlbGVzc1xcYWJzb2x1dGUiKSwgTCIiKTsKKyAgLy8gVGhvdWdoIHZhbGlkIGluIGNtZC5leGUsIGRyaXZlLXJlbGF0aXZlIHBhdGhzIGFyZSBub3Qgc3VwcG9ydGVkLgorICBBU1NFUlRfRVEodGVzdG9ubHlfdXRmOF90b193aW5wYXRoKCJjOmZvbyIpLCBMIiIpOworICBBU1NFUlRfRVEodGVzdG9ubHlfdXRmOF90b193aW5wYXRoKCJjOi9mb28iKSwgTCJcXFxcP1xcYzpcXGZvbyIpOworICBBU1NFUlRfRVEodGVzdG9ubHlfdXRmOF90b193aW5wYXRoKCJcXFxcP1xcQzpcXGZvbyIpLCBMIlxcXFw/XFxDOlxcZm9vIik7Cit9CisKK1RFU1RfRihJb1dpbjMyVGVzdCwgVXRmOFV0ZjE2Q29udmVyc2lvblRlc3QpIHsKKyAgc3RyaW5nIG1iczsKKyAgd3N0cmluZyB3Y3M7CisgIEFTU0VSVF9UUlVFKHN0cmluZ3M6OnV0ZjhfdG9fd2NzKGtVdGY4VGV4dCwgJndjcykpOworICBBU1NFUlRfVFJVRShzdHJpbmdzOjp3Y3NfdG9fdXRmOChrVXRmMTZUZXh0LCAmbWJzKSk7CisgIEFTU0VSVF9FUSh3Y3MsIGtVdGYxNlRleHQpOworICBBU1NFUlRfRVEobWJzLCBrVXRmOFRleHQpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSB3aW4zMgorfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBkZWZpbmVkKF9XSU4zMikKKwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wYWNrYWdlX2luZm8uaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcGFja2FnZV9pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjM2RhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcGFja2FnZV9pbmZvLmgKQEAgLTAsMCArMSw1MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBleGlzdHMgc29sZWx5IHRvIGRvY3VtZW50IHRoZSBnb29nbGU6OnByb3RvYnVmOjppbyBuYW1lc3BhY2UuCisvLyBJdCBpcyBub3QgY29tcGlsZWQgaW50byBhbnl0aGluZywgYnV0IGl0IG1heSBiZSByZWFkIGJ5IGFuIGF1dG9tYXRlZAorLy8gZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IuCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gQXV4aWxpYXJ5IGNsYXNzZXMgdXNlZCBmb3IgSS9PLgorLy8KKy8vIFRoZSBQcm90b2NvbCBCdWZmZXIgbGlicmFyeSB1c2VzIHRoZSBjbGFzc2VzIGluIHRoaXMgcGFja2FnZSB0byBkZWFsIHdpdGgKKy8vIEkvTyBhbmQgZW5jb2RpbmcvZGVjb2RpbmcgcmF3IGJ5dGVzLiAgTW9zdCB1c2VycyB3aWxsIG5vdCBuZWVkIHRvCisvLyBkZWFsIHdpdGggdGhpcyBwYWNrYWdlLiAgSG93ZXZlciwgdXNlcnMgd2hvIHdhbnQgdG8gYWRhcHQgdGhlIHN5c3RlbSB0bworLy8gd29yayB3aXRoIHRoZWlyIG93biBJL08gYWJzdHJhY3Rpb25zIC0tIGUuZy4sIHRvIGFsbG93IFByb3RvY29sIEJ1ZmZlcnMKKy8vIHRvIGJlIHJlYWQgZnJvbSBhIGRpZmZlcmVudCBraW5kIG9mIGlucHV0IHN0cmVhbSB3aXRob3V0IHRoZSBuZWVkIGZvciBhCisvLyB0ZW1wb3JhcnkgYnVmZmVyIC0tIHNob3VsZCB0YWtlIGEgY2xvc2VyIGxvb2suCituYW1lc3BhY2UgaW8ge30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiZDAwYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5jYwpAQCAtMCwwICsxLDQwMyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKworI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CisKK1ByaW50ZXI6OlByaW50ZXIoWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCwgY2hhciB2YXJpYWJsZV9kZWxpbWl0ZXIpCisgICAgOiB2YXJpYWJsZV9kZWxpbWl0ZXJfKHZhcmlhYmxlX2RlbGltaXRlciksCisgICAgICBvdXRwdXRfKG91dHB1dCksCisgICAgICBidWZmZXJfKE5VTEwpLAorICAgICAgYnVmZmVyX3NpemVfKDApLAorICAgICAgb2Zmc2V0XygwKSwKKyAgICAgIGF0X3N0YXJ0X29mX2xpbmVfKHRydWUpLAorICAgICAgZmFpbGVkXyhmYWxzZSksCisgICAgICBhbm5vdGF0aW9uX2NvbGxlY3Rvcl8oTlVMTCkge30KKworUHJpbnRlcjo6UHJpbnRlcihaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjaGFyIHZhcmlhYmxlX2RlbGltaXRlciwKKyAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkNvbGxlY3RvciogYW5ub3RhdGlvbl9jb2xsZWN0b3IpCisgICAgOiB2YXJpYWJsZV9kZWxpbWl0ZXJfKHZhcmlhYmxlX2RlbGltaXRlciksCisgICAgICBvdXRwdXRfKG91dHB1dCksCisgICAgICBidWZmZXJfKE5VTEwpLAorICAgICAgYnVmZmVyX3NpemVfKDApLAorICAgICAgb2Zmc2V0XygwKSwKKyAgICAgIGF0X3N0YXJ0X29mX2xpbmVfKHRydWUpLAorICAgICAgZmFpbGVkXyhmYWxzZSksCisgICAgICBhbm5vdGF0aW9uX2NvbGxlY3Rvcl8oYW5ub3RhdGlvbl9jb2xsZWN0b3IpIHt9CisKK1ByaW50ZXI6On5QcmludGVyKCkgeworICAvLyBPbmx5IEJhY2tVcCgpIGlmIHdlIGludm9rZWQgTmV4dCgpIGF0IGxlYXN0IG9uY2UsIGFuZCB3ZSBoYXZlIG5ldmVyIGZhaWxlZC4KKyAgLy8gTm90ZSB0aGF0IHdlIGFsd2F5cyBjYWxsIGBCYWNrdXBgLCBpLmUuIHdlIGNhbGwgQmFja1VwKDApIGFzIHNvbWUgb3V0cHV0CisgIC8vIHN0cmVhbXMgaGF2ZSBidWZmZXJlZCBvdXRwdXQsIGFuZCBCYWNrVXAoKSBzZXJ2ZXMgYXMgYSBmbHVzaCBldmVudCBpbiBzdWNoCisgIC8vIGltcGxlbWVudGF0aW9ucy4KKyAgaWYgKGJ1ZmZlcl8gIT0gbnVsbHB0ciAmJiAhZmFpbGVkXykgeworICAgIG91dHB1dF8tPkJhY2tVcChidWZmZXJfc2l6ZV8pOworICB9Cit9CisKK2Jvb2wgUHJpbnRlcjo6R2V0U3Vic3RpdHV0aW9uUmFuZ2UoY29uc3QgY2hhciogdmFybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiogcmFuZ2UpIHsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9CisgICAgICBzdWJzdGl0dXRpb25zXy5maW5kKHZhcm5hbWUpOworICBpZiAoaXRlciA9PSBzdWJzdGl0dXRpb25zXy5lbmQoKSkgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiIFVuZGVmaW5lZCB2YXJpYWJsZSBpbiBhbm5vdGF0aW9uOiAiIDw8IHZhcm5hbWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChpdGVyLT5zZWNvbmQuZmlyc3QgPiBpdGVyLT5zZWNvbmQuc2Vjb25kKSB7CisgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICIgVmFyaWFibGUgdXNlZCBmb3IgYW5ub3RhdGlvbiB1c2VkIG11bHRpcGxlIHRpbWVzOiAiCisgICAgICAgICAgICAgICAgPDwgdmFybmFtZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgKnJhbmdlID0gaXRlci0+c2Vjb25kOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBQcmludGVyOjpBbm5vdGF0ZShjb25zdCBjaGFyKiBiZWdpbl92YXJuYW1lLCBjb25zdCBjaGFyKiBlbmRfdmFybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgcGF0aCkgeworICBpZiAoYW5ub3RhdGlvbl9jb2xsZWN0b3JfID09IE5VTEwpIHsKKyAgICAvLyBDYW4ndCBnZW5lcmF0ZSBzaWduYXR1cmVzIHdpdGggdGhpcyBQcmludGVyLgorICAgIHJldHVybjsKKyAgfQorICBzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+IGJlZ2luLCBlbmQ7CisgIGlmICghR2V0U3Vic3RpdHV0aW9uUmFuZ2UoYmVnaW5fdmFybmFtZSwgJmJlZ2luKSB8fAorICAgICAgIUdldFN1YnN0aXR1dGlvblJhbmdlKGVuZF92YXJuYW1lLCAmZW5kKSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoYmVnaW4uZmlyc3QgPiBlbmQuc2Vjb25kKSB7CisgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICIgIEFubm90YXRpb24gaGFzIG5lZ2F0aXZlIGxlbmd0aCBmcm9tICIgPDwgYmVnaW5fdmFybmFtZQorICAgICAgICAgICAgICAgIDw8ICIgdG8gIiA8PCBlbmRfdmFybmFtZTsKKyAgfSBlbHNlIHsKKyAgICBhbm5vdGF0aW9uX2NvbGxlY3Rvcl8tPkFkZEFubm90YXRpb24oYmVnaW4uZmlyc3QsIGVuZC5zZWNvbmQsIGZpbGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCk7CisgIH0KK30KKwordm9pZCBQcmludGVyOjpQcmludChjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiB2YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRleHQpIHsKKyAgaW50IHNpemUgPSBzdHJsZW4odGV4dCk7CisgIGludCBwb3MgPSAwOyAgLy8gVGhlIG51bWJlciBvZiBieXRlcyB3ZSd2ZSB3cml0dGVuIHNvIGZhci4KKyAgc3Vic3RpdHV0aW9uc18uY2xlYXIoKTsKKyAgbGluZV9zdGFydF92YXJpYWJsZXNfLmNsZWFyKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBpZiAodGV4dFtpXSA9PSAnXG4nKSB7CisgICAgICAvLyBTYXcgbmV3bGluZS4gIElmIHRoZXJlIGlzIG1vcmUgdGV4dCwgd2UgbWF5IG5lZWQgdG8gaW5zZXJ0IGFuIGluZGVudAorICAgICAgLy8gaGVyZS4gIFNvLCB3cml0ZSB3aGF0IHdlIGhhdmUgc28gZmFyLCBpbmNsdWRpbmcgdGhlICdcbicuCisgICAgICBXcml0ZVJhdyh0ZXh0ICsgcG9zLCBpIC0gcG9zICsgMSk7CisgICAgICBwb3MgPSBpICsgMTsKKworICAgICAgLy8gU2V0dGluZyB0aGlzIHRydWUgd2lsbCBjYXVzZSB0aGUgbmV4dCBXcml0ZVJhdygpIHRvIGluc2VydCBhbiBpbmRlbnQKKyAgICAgIC8vIGZpcnN0LgorICAgICAgYXRfc3RhcnRfb2ZfbGluZV8gPSB0cnVlOworICAgICAgbGluZV9zdGFydF92YXJpYWJsZXNfLmNsZWFyKCk7CisKKyAgICB9IGVsc2UgaWYgKHRleHRbaV0gPT0gdmFyaWFibGVfZGVsaW1pdGVyXykgeworICAgICAgLy8gU2F3IHRoZSBzdGFydCBvZiBhIHZhcmlhYmxlIG5hbWUuCisKKyAgICAgIC8vIFdyaXRlIHdoYXQgd2UgaGF2ZSBzbyBmYXIuCisgICAgICBXcml0ZVJhdyh0ZXh0ICsgcG9zLCBpIC0gcG9zKTsKKyAgICAgIHBvcyA9IGkgKyAxOworCisgICAgICAvLyBGaW5kIGNsb3NpbmcgZGVsaW1pdGVyLgorICAgICAgY29uc3QgY2hhciogZW5kID0gc3RyY2hyKHRleHQgKyBwb3MsIHZhcmlhYmxlX2RlbGltaXRlcl8pOworICAgICAgaWYgKGVuZCA9PSBOVUxMKSB7CisgICAgICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiIFVuY2xvc2VkIHZhcmlhYmxlIG5hbWUuIjsKKyAgICAgICAgZW5kID0gdGV4dCArIHBvczsKKyAgICAgIH0KKyAgICAgIGludCBlbmRwb3MgPSBlbmQgLSB0ZXh0OworCisgICAgICBzdGQ6OnN0cmluZyB2YXJuYW1lKHRleHQgKyBwb3MsIGVuZHBvcyAtIHBvcyk7CisgICAgICBpZiAodmFybmFtZS5lbXB0eSgpKSB7CisgICAgICAgIC8vIFR3byBkZWxpbWl0ZXJzIGluIGEgcm93IHJlZHVjZSB0byBhIGxpdGVyYWwgZGVsaW1pdGVyIGNoYXJhY3Rlci4KKyAgICAgICAgV3JpdGVSYXcoJnZhcmlhYmxlX2RlbGltaXRlcl8sIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUmVwbGFjZSB3aXRoIHRoZSB2YXJpYWJsZSdzIHZhbHVlLgorICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0KKyAgICAgICAgICAgIHZhcmlhYmxlcy5maW5kKHZhcm5hbWUpOworICAgICAgICBpZiAoaXRlciA9PSB2YXJpYWJsZXMuZW5kKCkpIHsKKyAgICAgICAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIiBVbmRlZmluZWQgdmFyaWFibGU6ICIgPDwgdmFybmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoYXRfc3RhcnRfb2ZfbGluZV8gJiYgaXRlci0+c2Vjb25kLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGxpbmVfc3RhcnRfdmFyaWFibGVzXy5wdXNoX2JhY2sodmFybmFtZSk7CisgICAgICAgICAgfQorICAgICAgICAgIFdyaXRlUmF3KGl0ZXItPnNlY29uZC5kYXRhKCksIGl0ZXItPnNlY29uZC5zaXplKCkpOworICAgICAgICAgIHN0ZDo6cGFpcjxzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiA+OjppdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgYm9vbD4KKyAgICAgICAgICAgICAgaW5zZXJ0ZWQgPSBzdWJzdGl0dXRpb25zXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICB2YXJuYW1lLAorICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIob2Zmc2V0XyAtIGl0ZXItPnNlY29uZC5zaXplKCksIG9mZnNldF8pKSk7CisgICAgICAgICAgaWYgKCFpbnNlcnRlZC5zZWNvbmQpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgdmFyaWFibGUgd2FzIHVzZWQgbXVsdGlwbGUgdGltZXMuICBNYWtlIGl0cyBzcGFuIGhhdmUKKyAgICAgICAgICAgIC8vIG5lZ2F0aXZlIGxlbmd0aCBzbyB3ZSBjYW4gZGV0ZWN0IGl0IGlmIGl0IGdldHMgdXNlZCBpbiBhbgorICAgICAgICAgICAgLy8gYW5ub3RhdGlvbi4KKyAgICAgICAgICAgIGluc2VydGVkLmZpcnN0LT5zZWNvbmQgPSBzdGQ6Om1ha2VfcGFpcigxLCAwKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gQWR2YW5jZSBwYXN0IHRoaXMgdmFyaWFibGUuCisgICAgICBpID0gZW5kcG9zOworICAgICAgcG9zID0gZW5kcG9zICsgMTsKKyAgICB9CisgIH0KKworICAvLyBXcml0ZSB0aGUgcmVzdC4KKyAgV3JpdGVSYXcodGV4dCArIHBvcywgc2l6ZSAtIHBvcyk7Cit9CisKK3ZvaWQgUHJpbnRlcjo6SW5kZW50KCkgeyBpbmRlbnRfICs9ICIgICI7IH0KKwordm9pZCBQcmludGVyOjpPdXRkZW50KCkgeworICBpZiAoaW5kZW50Xy5lbXB0eSgpKSB7CisgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICIgT3V0ZGVudCgpIHdpdGhvdXQgbWF0Y2hpbmcgSW5kZW50KCkuIjsKKyAgICByZXR1cm47CisgIH0KKworICBpbmRlbnRfLnJlc2l6ZShpbmRlbnRfLnNpemUoKSAtIDIpOworfQorCit2b2lkIFByaW50ZXI6OlByaW50UmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhKSB7CisgIFdyaXRlUmF3KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Cit9CisKK3ZvaWQgUHJpbnRlcjo6UHJpbnRSYXcoY29uc3QgY2hhciogZGF0YSkgeworICBpZiAoZmFpbGVkXykgcmV0dXJuOworICBXcml0ZVJhdyhkYXRhLCBzdHJsZW4oZGF0YSkpOworfQorCit2b2lkIFByaW50ZXI6OldyaXRlUmF3KGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplKSB7CisgIGlmIChmYWlsZWRfKSByZXR1cm47CisgIGlmIChzaXplID09IDApIHJldHVybjsKKworICBpZiAoYXRfc3RhcnRfb2ZfbGluZV8gJiYgKHNpemUgPiAwKSAmJiAoZGF0YVswXSAhPSAnXG4nKSkgeworICAgIC8vIEluc2VydCBhbiBpbmRlbnQuCisgICAgYXRfc3RhcnRfb2ZfbGluZV8gPSBmYWxzZTsKKyAgICBDb3B5VG9CdWZmZXIoaW5kZW50Xy5kYXRhKCksIGluZGVudF8uc2l6ZSgpKTsKKyAgICBpZiAoZmFpbGVkXykgcmV0dXJuOworICAgIC8vIEZpeCB1cCBlbXB0eSB2YXJpYWJsZXMgKGUuZy4sICJ7IikgdGhhdCBzaG91bGQgYmUgYW5ub3RhdGVkIGFzCisgICAgLy8gY29taW5nIGFmdGVyIHRoZSBpbmRlbnQuCisgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGkgPSBsaW5lX3N0YXJ0X3ZhcmlhYmxlc18uYmVnaW4oKTsKKyAgICAgICAgIGkgIT0gbGluZV9zdGFydF92YXJpYWJsZXNfLmVuZCgpOyArK2kpIHsKKyAgICAgIHN1YnN0aXR1dGlvbnNfWyppXS5maXJzdCArPSBpbmRlbnRfLnNpemUoKTsKKyAgICAgIHN1YnN0aXR1dGlvbnNfWyppXS5zZWNvbmQgKz0gaW5kZW50Xy5zaXplKCk7CisgICAgfQorICB9CisKKyAgLy8gSWYgd2UncmUgZ29pbmcgdG8gd3JpdGUgYW55IGRhdGEsIGNsZWFyIGxpbmVfc3RhcnRfdmFyaWFibGVzXywgc2luY2UKKyAgLy8gd2UndmUgZWl0aGVyIHVwZGF0ZWQgdGhlbSBpbiB0aGUgYmxvY2sgYWJvdmUgb3IgdGhleSBubyBsb25nZXIgcmVmZXIgdG8KKyAgLy8gdGhlIGN1cnJlbnQgbGluZS4KKyAgbGluZV9zdGFydF92YXJpYWJsZXNfLmNsZWFyKCk7CisKKyAgQ29weVRvQnVmZmVyKGRhdGEsIHNpemUpOworfQorCitib29sIFByaW50ZXI6Ok5leHQoKSB7CisgIGRvIHsKKyAgICB2b2lkKiB2b2lkX2J1ZmZlcjsKKyAgICBpZiAoIW91dHB1dF8tPk5leHQoJnZvaWRfYnVmZmVyLCAmYnVmZmVyX3NpemVfKSkgeworICAgICAgZmFpbGVkXyA9IHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJ1ZmZlcl8gPSByZWludGVycHJldF9jYXN0PGNoYXIqPih2b2lkX2J1ZmZlcik7CisgIH0gd2hpbGUgKGJ1ZmZlcl9zaXplXyA9PSAwKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUHJpbnRlcjo6Q29weVRvQnVmZmVyKGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplKSB7CisgIGlmIChmYWlsZWRfKSByZXR1cm47CisgIGlmIChzaXplID09IDApIHJldHVybjsKKworICB3aGlsZSAoc2l6ZSA+IGJ1ZmZlcl9zaXplXykgeworICAgIC8vIERhdGEgZXhjZWVkcyBzcGFjZSBpbiB0aGUgYnVmZmVyLiAgQ29weSB3aGF0IHdlIGNhbiBhbmQgcmVxdWVzdCBhCisgICAgLy8gbmV3IGJ1ZmZlci4KKyAgICBpZiAoYnVmZmVyX3NpemVfID4gMCkgeworICAgICAgbWVtY3B5KGJ1ZmZlcl8sIGRhdGEsIGJ1ZmZlcl9zaXplXyk7CisgICAgICBvZmZzZXRfICs9IGJ1ZmZlcl9zaXplXzsKKyAgICAgIGRhdGEgKz0gYnVmZmVyX3NpemVfOworICAgICAgc2l6ZSAtPSBidWZmZXJfc2l6ZV87CisgICAgfQorICAgIHZvaWQqIHZvaWRfYnVmZmVyOworICAgIGZhaWxlZF8gPSAhb3V0cHV0Xy0+TmV4dCgmdm9pZF9idWZmZXIsICZidWZmZXJfc2l6ZV8pOworICAgIGlmIChmYWlsZWRfKSByZXR1cm47CisgICAgYnVmZmVyXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHZvaWRfYnVmZmVyKTsKKyAgfQorCisgIC8vIEJ1ZmZlciBpcyBiaWcgZW5vdWdoIHRvIHJlY2VpdmUgdGhlIGRhdGE7IGNvcHkgaXQuCisgIG1lbWNweShidWZmZXJfLCBkYXRhLCBzaXplKTsKKyAgYnVmZmVyXyArPSBzaXplOworICBidWZmZXJfc2l6ZV8gLT0gc2l6ZTsKKyAgb2Zmc2V0XyArPSBzaXplOworfQorCit2b2lkIFByaW50ZXI6OkluZGVudElmQXRTdGFydCgpIHsKKyAgaWYgKGF0X3N0YXJ0X29mX2xpbmVfKSB7CisgICAgQ29weVRvQnVmZmVyKGluZGVudF8uZGF0YSgpLCBpbmRlbnRfLnNpemUoKSk7CisgICAgYXRfc3RhcnRfb2ZfbGluZV8gPSBmYWxzZTsKKyAgfQorfQorCit2b2lkIFByaW50ZXI6OkZvcm1hdEludGVybmFsKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZm9ybWF0KSB7CisgIGF1dG8gc2F2ZSA9IGZvcm1hdDsKKyAgaW50IGFyZ19pbmRleCA9IDA7CisgIHN0ZDo6dmVjdG9yPEFubm90YXRpb25Db2xsZWN0b3I6OkFubm90YXRpb24+IGFubm90YXRpb25zOworICB3aGlsZSAoKmZvcm1hdCkgeworICAgIGNoYXIgYyA9ICpmb3JtYXQrKzsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgJyQnOgorICAgICAgICBmb3JtYXQgPSBXcml0ZVZhcmlhYmxlKGFyZ3MsIHZhcnMsIGZvcm1hdCwgJmFyZ19pbmRleCwgJmFubm90YXRpb25zKTsKKyAgICAgICAgY29udGludWU7CisgICAgICBjYXNlICdcbic6CisgICAgICAgIGF0X3N0YXJ0X29mX2xpbmVfID0gdHJ1ZTsKKyAgICAgICAgbGluZV9zdGFydF92YXJpYWJsZXNfLmNsZWFyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgSW5kZW50SWZBdFN0YXJ0KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwdXNoX2JhY2soYyk7CisgIH0KKyAgaWYgKGFyZ19pbmRleCAhPSBzdGF0aWNfY2FzdDxpbnQ+KGFyZ3Muc2l6ZSgpKSkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICIgVW51c2VkIGFyZ3VtZW50cy4gIiA8PCBzYXZlOworICB9CisgIGlmICghYW5ub3RhdGlvbnMuZW1wdHkoKSkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICIgQW5ub3RhdGlvbiByYW5nZSBpcyBub3QtY2xvc2VkLCBleHBlY3QgJH0kLiAiIDw8IHNhdmU7CisgIH0KK30KKworY29uc3QgY2hhciogUHJpbnRlcjo6V3JpdGVWYXJpYWJsZSgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCisgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdmFycywgY29uc3QgY2hhciogZm9ybWF0LAorICAgIGludCogYXJnX2luZGV4LCBzdGQ6OnZlY3RvcjxBbm5vdGF0aW9uQ29sbGVjdG9yOjpBbm5vdGF0aW9uPiogYW5ub3RhdGlvbnMpIHsKKyAgYXV0byBzdGFydCA9IGZvcm1hdDsKKyAgYXV0byBlbmQgPSBzdHJjaHIoZm9ybWF0LCAnJCcpOworICBpZiAoIWVuZCkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICIgVW5jbG9zZWQgdmFyaWFibGUgbmFtZS4iOworICB9CisgIGZvcm1hdCA9IGVuZCArIDE7CisgIGlmIChlbmQgPT0gc3RhcnQpIHsKKyAgICAvLyAiJCQiIGlzIGFuIGVzY2FwZSBmb3IganVzdCAnJCcKKyAgICBJbmRlbnRJZkF0U3RhcnQoKTsKKyAgICBwdXNoX2JhY2soJyQnKTsKKyAgICByZXR1cm4gZm9ybWF0OworICB9CisgIGlmICgqc3RhcnQgPT0gJ3snKSB7CisgICAgR09PR0xFX0NIRUNLKHN0ZDo6aXNkaWdpdChzdGFydFsxXSkpOworICAgIEdPT0dMRV9DSEVDS19FUShlbmQgLSBzdGFydCwgMik7CisgICAgaW50IGlkeCA9IHN0YXJ0WzFdIC0gJzEnOworICAgIGlmIChpZHggPCAwIHx8IHN0YXRpY19jYXN0PHNpemVfdD4oaWR4KSA+PSBhcmdzLnNpemUoKSkgeworICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkFubm90YXRpb24gJHsiIDw8IGlkeCArIDEgPDwgIiQgaXMgb3V0IG9mIGJvdW5kcy4iOworICAgIH0KKyAgICBpZiAoaWR4ID4gKmFyZ19pbmRleCkgeworICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkFubm90YXRpb24gYXJnIG11c3QgYmUgaW4gY29ycmVjdCBvcmRlciBhcyBnaXZlbi4gRXhwZWN0ZWQiCisgICAgICAgICAgICAgICAgIDw8ICIgJHsiIDw8ICgqYXJnX2luZGV4KSArIDEgPDwgIiQgZ290ICR7IiA8PCBpZHggKyAxIDw8ICIkLiI7CisgICAgfSBlbHNlIGlmIChpZHggPT0gKmFyZ19pbmRleCkgeworICAgICAgKCphcmdfaW5kZXgpKys7CisgICAgfQorICAgIEluZGVudElmQXRTdGFydCgpOworICAgIGFubm90YXRpb25zLT5wdXNoX2JhY2soe3tvZmZzZXRfLCAwfSwgYXJnc1tpZHhdfSk7CisgICAgcmV0dXJuIGZvcm1hdDsKKyAgfSBlbHNlIGlmICgqc3RhcnQgPT0gJ30nKSB7CisgICAgR09PR0xFX0NIRUNLKGFubm90YXRpb25zKTsKKyAgICBpZiAoYW5ub3RhdGlvbnMtPmVtcHR5KCkpIHsKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbmV4cGVjdGVkIGVuZCBvZiBhbm5vdGF0aW9uIGZvdW5kLiI7CisgICAgfQorICAgIGF1dG8mIGEgPSBhbm5vdGF0aW9ucy0+YmFjaygpOworICAgIGEuZmlyc3Quc2Vjb25kID0gb2Zmc2V0XzsKKyAgICBpZiAoYW5ub3RhdGlvbl9jb2xsZWN0b3JfKSBhbm5vdGF0aW9uX2NvbGxlY3Rvcl8tPkFkZEFubm90YXRpb25OZXcoYSk7CisgICAgYW5ub3RhdGlvbnMtPnBvcF9iYWNrKCk7CisgICAgcmV0dXJuIGZvcm1hdDsKKyAgfQorICBhdXRvIHN0YXJ0X3ZhciA9IHN0YXJ0OworICB3aGlsZSAoc3RhcnRfdmFyIDwgZW5kICYmICpzdGFydF92YXIgPT0gJyAnKSBzdGFydF92YXIrKzsKKyAgaWYgKHN0YXJ0X3ZhciA9PSBlbmQpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiIEVtcHR5IHZhcmlhYmxlLiI7CisgIH0KKyAgYXV0byBlbmRfdmFyID0gZW5kOworICB3aGlsZSAoc3RhcnRfdmFyIDwgZW5kX3ZhciAmJiAqKGVuZF92YXIgLSAxKSA9PSAnICcpIGVuZF92YXItLTsKKyAgc3RkOjpzdHJpbmcgdmFyX25hbWV7CisgICAgICBzdGFydF92YXIsIHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nOjpzaXplX3R5cGU+KGVuZF92YXIgLSBzdGFydF92YXIpfTsKKyAgc3RkOjpzdHJpbmcgc3ViOworICBpZiAoc3RkOjppc2RpZ2l0KHZhcl9uYW1lWzBdKSkgeworICAgIEdPT0dMRV9DSEVDS19FUSh2YXJfbmFtZS5zaXplKCksIDFVKTsgIC8vIE5vIG5lZWQgZm9yIG11bHRpLWRpZ2l0cworICAgIGludCBpZHggPSB2YXJfbmFtZVswXSAtICcxJzsgICAvLyBTdGFydCBjb3VudGluZyBhdCAxCisgICAgR09PR0xFX0NIRUNLX0dFKGlkeCwgMCk7CisgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4oaWR4KSA+PSBhcmdzLnNpemUoKSkgeworICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkFyZ3VtZW50ICQiIDw8IGlkeCArIDEgPDwgIiQgaXMgb3V0IG9mIGJvdW5kcy4iOworICAgIH0KKyAgICBpZiAoaWR4ID4gKmFyZ19pbmRleCkgeworICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkFyZ3VtZW50cyBtdXN0IGJlIHVzZWQgaW4gc2FtZSBvcmRlciBhcyBnaXZlbi4gRXhwZWN0ZWQgJCIKKyAgICAgICAgICAgICAgICAgPDwgKCphcmdfaW5kZXgpICsgMSA8PCAiJCBnb3QgJCIgPDwgaWR4ICsgMSA8PCAiJC4iOworICAgIH0gZWxzZSBpZiAoaWR4ID09ICphcmdfaW5kZXgpIHsKKyAgICAgICgqYXJnX2luZGV4KSsrOworICAgIH0KKyAgICBzdWIgPSBhcmdzW2lkeF07CisgIH0gZWxzZSB7CisgICAgYXV0byBpdCA9IHZhcnMuZmluZCh2YXJfbmFtZSk7CisgICAgaWYgKGl0ID09IHZhcnMuZW5kKCkpIHsKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICIgVW5rbm93biB2YXJpYWJsZTogIiA8PCB2YXJfbmFtZSA8PCAiLiI7CisgICAgfQorICAgIHN1YiA9IGl0LT5zZWNvbmQ7CisgIH0KKworICAvLyBCeSByZXR1cm5pbmcgaGVyZSBpbiBjYXNlIG9mIGVtcHR5IHdlIGFsc28gc2tpcCBwb3NzaWJsZSBzcGFjZXMgaW5zaWRlCisgIC8vIHRoZSAkLi4uJCwgaS5lLiAidm9pZCQgZGxsZXhwb3IkIGYoKTsiIC0+ICJ2b2lkIGYoKTsiIGluIHRoZSBlbXB0eSBjYXNlLgorICBpZiAoc3ViLmVtcHR5KCkpIHJldHVybiBmb3JtYXQ7CisKKyAgLy8gV2UncmUgZ29pbmcgdG8gd3JpdGUgc29tZXRoaW5nIG5vbi1lbXB0eSBzbyB3ZSBuZWVkIGEgcG9zc2libGUgaW5kZW50LgorICBJbmRlbnRJZkF0U3RhcnQoKTsKKworICAvLyBXcml0ZSB0aGUgcG9zc2libGUgc3BhY2VzIGluIGZyb250LgorICBDb3B5VG9CdWZmZXIoc3RhcnQsIHN0YXJ0X3ZhciAtIHN0YXJ0KTsKKyAgLy8gV3JpdGUgYSBub24tZW1wdHkgc3Vic3RpdHV0ZWQgdmFyaWFibGUuCisgIENvcHlUb0J1ZmZlcihzdWIuY19zdHIoKSwgc3ViLnNpemUoKSk7CisgIC8vIEZpbmlzaCBvZmYgd2l0aCB3cml0aW5nIHBvc3NpYmxlIHRyYWlsaW5nIHNwYWNlcy4KKyAgQ29weVRvQnVmZmVyKGVuZF92YXIsIGVuZCAtIGVuZF92YXIpOworICByZXR1cm4gZm9ybWF0OworfQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmE0MzIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmgKQEAgLTAsMCArMSwzODcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBVdGlsaXR5IGNsYXNzIGZvciB3cml0aW5nIHRleHQgdG8gYSBaZXJvQ29weU91dHB1dFN0cmVhbS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfSU9fUFJJTlRFUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lPX1BSSU5URVJfSF9fCisKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworY2xhc3MgWmVyb0NvcHlPdXRwdXRTdHJlYW07ICAvLyB6ZXJvX2NvcHlfc3RyZWFtLmgKKworLy8gUmVjb3JkcyBhbm5vdGF0aW9ucyBhYm91dCBhIFByaW50ZXIncyBvdXRwdXQuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgQW5ub3RhdGlvbkNvbGxlY3RvciB7CisgcHVibGljOgorICAvLyBBbm5vdGF0aW9uIGlzIGEgb2Zmc2V0IHJhbmdlIGFuZCBhIHBheWxvYWQgcGFpci4KKyAgdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90Piwgc3RkOjpzdHJpbmc+IEFubm90YXRpb247CisKKyAgLy8gUmVjb3JkcyB0aGF0IHRoZSBieXRlcyBpbiBmaWxlX3BhdGggYmVnaW5uaW5nIHdpdGggYmVnaW5fb2Zmc2V0IGFuZCBlbmRpbmcKKyAgLy8gYmVmb3JlIGVuZF9vZmZzZXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgU291cmNlQ29kZUluZm8tc3R5bGUgcGF0aC4KKyAgdmlydHVhbCB2b2lkIEFkZEFubm90YXRpb24oc2l6ZV90IGJlZ2luX29mZnNldCwgc2l6ZV90IGVuZF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHBhdGgpID0gMDsKKworICAvLyBUT0RPKGdlcmJlbnMpIEkgZG9uJ3Qgc2VlIHdoeSB3ZSBuZWVkIHZpcnR1YWxzIGhlcmUuIEp1c3QgYSB2ZWN0b3Igb2YKKyAgLy8gcmFuZ2UsIHBheWxvYWQgcGFpcnMgc3RvcmVkIGluIGEgY29udGV4dCBzaG91bGQgc3VmZmljZS4KKyAgdmlydHVhbCB2b2lkIEFkZEFubm90YXRpb25OZXcoQW5ub3RhdGlvbiYgLyogYSAqLykge30KKworICB2aXJ0dWFsIH5Bbm5vdGF0aW9uQ29sbGVjdG9yKCkge30KK307CisKKy8vIFJlY29yZHMgYW5ub3RhdGlvbnMgYWJvdXQgYSBQcmludGVyJ3Mgb3V0cHV0IHRvIHRoZSBnaXZlbiBwcm90b2NvbCBidWZmZXIsCisvLyBhc3N1bWluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGFuIDo6QW5ub3RhdGlvbiBtZXNzYWdlIGV4cG9zaW5nIHBhdGgsCisvLyBzb3VyY2VfZmlsZSwgYmVnaW4gYW5kIGVuZCBmaWVsZHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5ub3RhdGlvblByb3RvPgorY2xhc3MgQW5ub3RhdGlvblByb3RvQ29sbGVjdG9yIDogcHVibGljIEFubm90YXRpb25Db2xsZWN0b3IgeworIHB1YmxpYzoKKyAgLy8gYW5ub3RhdGlvbl9wcm90byBpcyB0aGUgcHJvdG9jb2wgYnVmZmVyIHRvIHdoaWNoIG5ldyBBbm5vdGF0aW9ucyBzaG91bGQgYmUKKyAgLy8gYWRkZWQuIEl0IGlzIG5vdCBvd25lZCBieSB0aGUgQW5ub3RhdGlvblByb3RvQ29sbGVjdG9yLgorICBleHBsaWNpdCBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3IoQW5ub3RhdGlvblByb3RvKiBhbm5vdGF0aW9uX3Byb3RvKQorICAgICAgOiBhbm5vdGF0aW9uX3Byb3RvXyhhbm5vdGF0aW9uX3Byb3RvKSB7fQorCisgIC8vIE92ZXJyaWRlIGZvciBBbm5vdGF0aW9uQ29sbGVjdG9yOjpBZGRBbm5vdGF0aW9uLgorICB2b2lkIEFkZEFubm90YXRpb24oc2l6ZV90IGJlZ2luX29mZnNldCwgc2l6ZV90IGVuZF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgcGF0aCkgb3ZlcnJpZGUgeworICAgIHR5cGVuYW1lIEFubm90YXRpb25Qcm90bzo6QW5ub3RhdGlvbiogYW5ub3RhdGlvbiA9CisgICAgICAgIGFubm90YXRpb25fcHJvdG9fLT5hZGRfYW5ub3RhdGlvbigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aC5zaXplKCk7ICsraSkgeworICAgICAgYW5ub3RhdGlvbi0+YWRkX3BhdGgocGF0aFtpXSk7CisgICAgfQorICAgIGFubm90YXRpb24tPnNldF9zb3VyY2VfZmlsZShmaWxlX3BhdGgpOworICAgIGFubm90YXRpb24tPnNldF9iZWdpbihiZWdpbl9vZmZzZXQpOworICAgIGFubm90YXRpb24tPnNldF9lbmQoZW5kX29mZnNldCk7CisgIH0KKyAgLy8gT3ZlcnJpZGUgZm9yIEFubm90YXRpb25Db2xsZWN0b3I6OkFkZEFubm90YXRpb24uCisgIHZvaWQgQWRkQW5ub3RhdGlvbk5ldyhBbm5vdGF0aW9uJiBhKSBvdmVycmlkZSB7CisgICAgYXV0byogYW5ub3RhdGlvbiA9IGFubm90YXRpb25fcHJvdG9fLT5hZGRfYW5ub3RhdGlvbigpOworICAgIGFubm90YXRpb24tPlBhcnNlRnJvbVN0cmluZyhhLnNlY29uZCk7CisgICAgYW5ub3RhdGlvbi0+c2V0X2JlZ2luKGEuZmlyc3QuZmlyc3QpOworICAgIGFubm90YXRpb24tPnNldF9lbmQoYS5maXJzdC5zZWNvbmQpOworICB9CisKKyBwcml2YXRlOgorICAvLyBUaGUgcHJvdG9jb2wgYnVmZmVyIHRvIHdoaWNoIG5ldyBhbm5vdGF0aW9ucyBzaG91bGQgYmUgYWRkZWQuCisgIEFubm90YXRpb25Qcm90byogY29uc3QgYW5ub3RhdGlvbl9wcm90b187Cit9OworCisvLyBUaGlzIHNpbXBsZSB1dGlsaXR5IGNsYXNzIGFzc2lzdHMgaW4gY29kZSBnZW5lcmF0aW9uLiAgSXQgYmFzaWNhbGx5CisvLyBhbGxvd3MgdGhlIGNhbGxlciB0byBkZWZpbmUgYSBzZXQgb2YgdmFyaWFibGVzIGFuZCB0aGVuIG91dHB1dCBzb21lCisvLyB0ZXh0IHdpdGggdmFyaWFibGUgc3Vic3RpdHV0aW9ucy4gIEV4YW1wbGUgdXNhZ2U6CisvLworLy8gICBQcmludGVyIHByaW50ZXIob3V0cHV0LCAnJCcpOworLy8gICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisvLyAgIHZhcnNbIm5hbWUiXSA9ICJCb2IiOworLy8gICBwcmludGVyLlByaW50KHZhcnMsICJNeSBuYW1lIGlzICRuYW1lJC4iKTsKKy8vCisvLyBUaGUgYWJvdmUgd3JpdGVzICJNeSBuYW1lIGlzIEJvYi4iIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorLy8KKy8vIFByaW50ZXIgYWdncmVzc2l2ZWx5IGVuZm9yY2VzIGNvcnJlY3QgdXNhZ2UsIGNyYXNoaW5nICh3aXRoIGFzc2VydCBmYWlsdXJlcykKKy8vIGluIHRoZSBjYXNlIG9mIHVuZGVmaW5lZCB2YXJpYWJsZXMgaW4gZGVidWcgYnVpbGRzLiBUaGlzIGhlbHBzIGdyZWF0bHkgaW4KKy8vIGRlYnVnZ2luZyBjb2RlIHdoaWNoIHVzZXMgaXQuCisvLworLy8gSWYgYSBQcmludGVyIGlzIGNvbnN0cnVjdGVkIHdpdGggYW4gQW5ub3RhdGlvbkNvbGxlY3RvciwgaXQgd2lsbCBwcm92aWRlIGl0CisvLyB3aXRoIGFubm90YXRpb25zIHRoYXQgY29ubmVjdCB0aGUgUHJpbnRlcidzIG91dHB1dCB0byBwYXRocyB0aGF0IGNhbiBpZGVudGlmeQorLy8gdmFyaW91cyBkZXNjcmlwdG9ycy4gIEluIHRoZSBhYm92ZSBleGFtcGxlLCBpZiBwZXJzb25fIGlzIGEgZGVzY3JpcHRvciB0aGF0CisvLyBpZGVudGlmaWVzIEJvYiwgd2UgY2FuIGFzc29jaWF0ZSB0aGUgb3V0cHV0IHN0cmluZyAiTXkgbmFtZSBpcyBCb2IuIiB3aXRoCisvLyBhIHNvdXJjZSBwYXRoIHBvaW50aW5nIHRvIHRoYXQgZGVzY3JpcHRvciB3aXRoOgorLy8KKy8vICAgcHJpbnRlci5Bbm5vdGF0ZSgibmFtZSIsIHBlcnNvbl8pOworLy8KKy8vIFRoZSBBbm5vdGF0aW9uQ29sbGVjdG9yIHdpbGwgYmUgc2VudCBhbiBhbm5vdGF0aW9uIGxpbmtpbmcgdGhlIG91dHB1dCByYW5nZQorLy8gY292ZXJpbmcgIkJvYiIgdG8gdGhlIGxvZ2ljYWwgcGF0aCBwcm92aWRlZCBieSBwZXJzb25fLiAgVG9vbHMgbWF5IHVzZQorLy8gdGhpcyBhc3NvY2lhdGlvbiB0byAoZm9yIGV4YW1wbGUpIGxpbmsgIkJvYiIgaW4gdGhlIG91dHB1dCBiYWNrIHRvIHRoZQorLy8gc291cmNlIGZpbGUgdGhhdCBkZWZpbmVkIHRoZSBwZXJzb25fIGRlc2NyaXB0b3IgaWRlbnRpZnlpbmcgQm9iLgorLy8KKy8vIEFubm90YXRlIGNhbiBvbmx5IGV4YW1pbmUgdmFyaWFibGVzIHN1YnN0aXR1dGVkIGR1cmluZyB0aGUgbGFzdCBjYWxsIHRvCisvLyBQcmludC4gIEl0IGlzIGludmFsaWQgdG8gcmVmZXIgdG8gYSB2YXJpYWJsZSB0aGF0IHdhcyB1c2VkIG11bHRpcGxlIHRpbWVzCisvLyBpbiBhIHNpbmdsZSBQcmludCBjYWxsLgorLy8KKy8vIEluIGZ1bGwgZ2VuZXJhbGl0eSwgb25lIG1heSBzcGVjaWZ5IGEgcmFuZ2Ugb2Ygb3V0cHV0IHRleHQgdXNpbmcgYSBiZWdpbm5pbmcKKy8vIHN1YnN0aXR1dGlvbiB2YXJpYWJsZSBhbmQgYW4gZW5kaW5nIHZhcmlhYmxlLiAgVGhlIHJlc3VsdGluZyBhbm5vdGF0aW9uIHdpbGwKKy8vIHNwYW4gZnJvbSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdWJzdGl0dXRlZCB2YWx1ZSBmb3IgdGhlIGJlZ2lubmluZworLy8gdmFyaWFibGUgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBzdWJzdGl0dXRlZCB2YWx1ZSBmb3IgdGhlIGVuZGluZworLy8gdmFyaWFibGUuICBGb3IgZXhhbXBsZSwgdGhlIEFubm90YXRlIGNhbGwgYWJvdmUgaXMgZXF1aXZhbGVudCB0byB0aGlzIG9uZToKKy8vCisvLyAgIHByaW50ZXIuQW5ub3RhdGUoIm5hbWUiLCAibmFtZSIsIHBlcnNvbl8pOworLy8KKy8vIFRoaXMgaXMgdXNlZnVsIGlmIG11bHRpcGxlIHZhcmlhYmxlcyBjb21iaW5lIHRvIGZvcm0gYSBzaW5nbGUgc3BhbiBvZiBvdXRwdXQKKy8vIHRoYXQgc2hvdWxkIGJlIGFubm90YXRlZCB3aXRoIHRoZSBzYW1lIHNvdXJjZSBwYXRoLiAgRm9yIGV4YW1wbGU6CisvLworLy8gICBQcmludGVyIHByaW50ZXIob3V0cHV0LCAnJCcpOworLy8gICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisvLyAgIHZhcnNbImZpcnN0Il0gPSAiQWxpY2UiOworLy8gICB2YXJzWyJsYXN0Il0gPSAiU21pdGgiOworLy8gICBwcmludGVyLlByaW50KHZhcnMsICJNeSBuYW1lIGlzICRmaXJzdCQgJGxhc3QkLiIpOworLy8gICBwcmludGVyLkFubm90YXRlKCJmaXJzdCIsICJsYXN0IiwgcGVyc29uXyk7CisvLworLy8gVGhpcyBjb2RlIHdvdWxkIGFzc29jaWF0ZSB0aGUgc3BhbiBjb3ZlcmluZyAiQWxpY2UgU21pdGgiIGluIHRoZSBvdXRwdXQgd2l0aAorLy8gdGhlIHBlcnNvbl8gZGVzY3JpcHRvci4KKy8vCisvLyBOb3RlIHRoYXQgdGhlIGJlZ2lubmluZyB2YXJpYWJsZSBtdXN0IGNvbWUgYmVmb3JlIChvciBvdmVybGFwIHdpdGgsIGluIHRoZQorLy8gY2FzZSBvZiB6ZXJvLXNpemVkIHN1YnN0aXR1dGlvbiB2YWx1ZXMpIHRoZSBlbmRpbmcgdmFyaWFibGUuCisvLworLy8gSXQgaXMgYWxzbyBzb21ldGltZXMgdXNlZnVsIHRvIHVzZSB2YXJpYWJsZXMgd2l0aCB6ZXJvLXNpemVkIHZhbHVlcyBhcworLy8gbWFya2Vycy4gIFRoaXMgYXZvaWRzIGlzc3VlcyB3aXRoIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgdmFyaWFibGUKKy8vIGFuZCBhbHNvIGFsbG93cyBhbm5vdGF0aW9uIHJhbmdlcyB0byBzcGFuIGxpdGVyYWwgdGV4dCBmcm9tIHRoZSBQcmludAorLy8gdGVtcGxhdGVzOgorLy8KKy8vICAgUHJpbnRlciBwcmludGVyKG91dHB1dCwgJyQnKTsKKy8vICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworLy8gICB2YXJzWyJmb28iXSA9ICJiYXIiOworLy8gICB2YXJzWyJmdW5jdGlvbiJdID0gImNhbGwiOworLy8gICB2YXJzWyJtYXJrIl0gPSAiIjsKKy8vICAgcHJpbnRlci5QcmludCh2YXJzLCAiJGZ1bmN0aW9uJCgkZm9vJCwkZm9vJCkkbWFyayQiKTsKKy8vICAgcHJpbnRlci5Bbm5vdGF0ZSgiZnVuY3Rpb24iLCAibWFyayIsIGNhbGxfKTsKKy8vCisvLyBUaGlzIGNvZGUgYXNzb2NpYXRlcyB0aGUgc3BhbiBjb3ZlcmluZyAiY2FsbChiYXIsYmFyKSIgaW4gdGhlIG91dHB1dCB3aXRoIHRoZQorLy8gY2FsbF8gZGVzY3JpcHRvci4KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFByaW50ZXIgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlIGEgcHJpbnRlciB0aGF0IHdyaXRlcyB0ZXh0IHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLiAgVXNlIHRoZQorICAvLyBnaXZlbiBjaGFyYWN0ZXIgYXMgdGhlIGRlbGltaXRlciBmb3IgdmFyaWFibGVzLgorICBQcmludGVyKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQsIGNoYXIgdmFyaWFibGVfZGVsaW1pdGVyKTsKKworICAvLyBDcmVhdGUgYSBwcmludGVyIHRoYXQgd3JpdGVzIHRleHQgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uICBVc2UgdGhlCisgIC8vIGdpdmVuIGNoYXJhY3RlciBhcyB0aGUgZGVsaW1pdGVyIGZvciB2YXJpYWJsZXMuICBJZiBhbm5vdGF0aW9uX2NvbGxlY3RvcgorICAvLyBpcyBub3QgbnVsbCwgUHJpbnRlciB3aWxsIHByb3ZpZGUgaXQgd2l0aCBhbm5vdGF0aW9ucyBhYm91dCBjb2RlIHdyaXR0ZW4KKyAgLy8gdG8gdGhlIHN0cmVhbS4gIGFubm90YXRpb25fY29sbGVjdG9yIGlzIG5vdCBvd25lZCBieSBQcmludGVyLgorICBQcmludGVyKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQsIGNoYXIgdmFyaWFibGVfZGVsaW1pdGVyLAorICAgICAgICAgIEFubm90YXRpb25Db2xsZWN0b3IqIGFubm90YXRpb25fY29sbGVjdG9yKTsKKworICB+UHJpbnRlcigpOworCisgIC8vIExpbmsgYSBzdWJzdGl0dXRpb24gdmFyaWFibGUgZW1pdHRlZCBieSB0aGUgbGFzdCBjYWxsIHRvIFByaW50IHRvIHRoZQorICAvLyBvYmplY3QgZGVzY3JpYmVkIGJ5IGRlc2NyaXB0b3IuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb21lRGVzY3JpcHRvcj4KKyAgdm9pZCBBbm5vdGF0ZShjb25zdCBjaGFyKiB2YXJuYW1lLCBjb25zdCBTb21lRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICAgIEFubm90YXRlKHZhcm5hbWUsIHZhcm5hbWUsIGRlc2NyaXB0b3IpOworICB9CisKKyAgLy8gTGluayB0aGUgb3V0cHV0IHJhbmdlIGRlZmluZWQgYnkgdGhlIHN1YnN0aXR1dGlvbiB2YXJpYWJsZXMgYXMgZW1pdHRlZCBieQorICAvLyB0aGUgbGFzdCBjYWxsIHRvIFByaW50IHRvIHRoZSBvYmplY3QgZGVzY3JpYmVkIGJ5IGRlc2NyaXB0b3IuIFRoZSByYW5nZQorICAvLyBiZWdpbnMgYXQgYmVnaW5fdmFybmFtZSdzIHZhbHVlIGFuZCBlbmRzIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUKKyAgLy8gdmFsdWUgc3Vic3RpdHV0ZWQgZm9yIGVuZF92YXJuYW1lLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU29tZURlc2NyaXB0b3I+CisgIHZvaWQgQW5ub3RhdGUoY29uc3QgY2hhciogYmVnaW5fdmFybmFtZSwgY29uc3QgY2hhciogZW5kX3Zhcm5hbWUsCisgICAgICAgICAgICAgICAgY29uc3QgU29tZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgICBpZiAoYW5ub3RhdGlvbl9jb2xsZWN0b3JfID09IE5VTEwpIHsKKyAgICAgIC8vIEFubm90YXRpb25zIGFyZW4ndCB0dXJuZWQgb24gZm9yIHRoaXMgUHJpbnRlciwgc28gZG9uJ3QgcGF5IHRoZSBjb3N0CisgICAgICAvLyBvZiBidWlsZGluZyB0aGUgbG9jYXRpb24gcGF0aC4KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8aW50PiBwYXRoOworICAgIGRlc2NyaXB0b3ItPkdldExvY2F0aW9uUGF0aCgmcGF0aCk7CisgICAgQW5ub3RhdGUoYmVnaW5fdmFybmFtZSwgZW5kX3Zhcm5hbWUsIGRlc2NyaXB0b3ItPmZpbGUoKS0+bmFtZSgpLCBwYXRoKTsKKyAgfQorCisgIC8vIExpbmsgYSBzdWJzdGl0dXRpb24gdmFyaWFibGUgZW1pdHRlZCBieSB0aGUgbGFzdCBjYWxsIHRvIFByaW50IHRvIHRoZSBmaWxlCisgIC8vIHdpdGggcGF0aCBmaWxlX25hbWUuCisgIHZvaWQgQW5ub3RhdGUoY29uc3QgY2hhciogdmFybmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSkgeworICAgIEFubm90YXRlKHZhcm5hbWUsIHZhcm5hbWUsIGZpbGVfbmFtZSk7CisgIH0KKworICAvLyBMaW5rIHRoZSBvdXRwdXQgcmFuZ2UgZGVmaW5lZCBieSB0aGUgc3Vic3RpdHV0aW9uIHZhcmlhYmxlcyBhcyBlbWl0dGVkIGJ5CisgIC8vIHRoZSBsYXN0IGNhbGwgdG8gUHJpbnQgdG8gdGhlIGZpbGUgd2l0aCBwYXRoIGZpbGVfbmFtZS4gVGhlIHJhbmdlIGJlZ2lucworICAvLyBhdCBiZWdpbl92YXJuYW1lJ3MgdmFsdWUgYW5kIGVuZHMgYWZ0ZXIgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSB2YWx1ZQorICAvLyBzdWJzdGl0dXRlZCBmb3IgZW5kX3Zhcm5hbWUuCisgIHZvaWQgQW5ub3RhdGUoY29uc3QgY2hhciogYmVnaW5fdmFybmFtZSwgY29uc3QgY2hhciogZW5kX3Zhcm5hbWUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSkgeworICAgIGlmIChhbm5vdGF0aW9uX2NvbGxlY3Rvcl8gPT0gTlVMTCkgeworICAgICAgLy8gQW5ub3RhdGlvbnMgYXJlbid0IHR1cm5lZCBvbiBmb3IgdGhpcyBQcmludGVyLgorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGVtcHR5X3BhdGg7CisgICAgQW5ub3RhdGUoYmVnaW5fdmFybmFtZSwgZW5kX3Zhcm5hbWUsIGZpbGVfbmFtZSwgZW1wdHlfcGF0aCk7CisgIH0KKworICAvLyBQcmludCBzb21lIHRleHQgYWZ0ZXIgYXBwbHlpbmcgdmFyaWFibGUgc3Vic3RpdHV0aW9ucy4gIElmIGEgcGFydGljdWxhcgorICAvLyB2YXJpYWJsZSBpbiB0aGUgdGV4dCBpcyBub3QgZGVmaW5lZCwgdGhpcyB3aWxsIGNyYXNoLiAgVmFyaWFibGVzIHRvIGJlCisgIC8vIHN1YnN0aXR1dGVkIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIG5hbWVzIHN1cnJvdW5kZWQgYnkgZGVsaW1pdGVyCisgIC8vIGNoYXJhY3RlcnMgKGFzIGdpdmVuIHRvIHRoZSBjb25zdHJ1Y3RvcikuICBUaGUgdmFyaWFibGUgYmluZGluZ3MgYXJlCisgIC8vIGRlZmluZWQgYnkgdGhlIGdpdmVuIG1hcC4KKyAgdm9pZCBQcmludChjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiB2YXJpYWJsZXMsCisgICAgICAgICAgICAgY29uc3QgY2hhciogdGV4dCk7CisKKyAgLy8gTGlrZSB0aGUgZmlyc3QgUHJpbnQoKSwgZXhjZXB0IHRoZSBzdWJzdGl0dXRpb25zIGFyZSBnaXZlbiBhcyBwYXJhbWV0ZXJzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KKyAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBBcmdzJi4uLiBhcmdzKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzOworICAgIFByaW50SW50ZXJuYWwoJnZhcnMsIHRleHQsIGFyZ3MuLi4pOworICB9CisKKyAgLy8gSW5kZW50IHRleHQgYnkgdHdvIHNwYWNlcy4gIEFmdGVyIGNhbGxpbmcgSW5kZW50KCksIHR3byBzcGFjZXMgd2lsbCBiZQorICAvLyBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvZiB0ZXh0LiAgSW5kZW50KCkgbWF5IGJlIGNhbGxlZAorICAvLyBtdWx0aXBsZSB0aW1lcyB0byBwcm9kdWNlIGRlZXBlciBpbmRlbnRzLgorICB2b2lkIEluZGVudCgpOworCisgIC8vIFJlZHVjZXMgdGhlIGN1cnJlbnQgaW5kZW50IGxldmVsIGJ5IHR3byBzcGFjZXMsIG9yIGNyYXNoZXMgaWYgdGhlIGluZGVudAorICAvLyBsZXZlbCBpcyB6ZXJvLgorICB2b2lkIE91dGRlbnQoKTsKKworICAvLyBXcml0ZSBhIHN0cmluZyB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgLy8gVGhpcyBtZXRob2QgZG9lcyBub3QgbG9vayBmb3IgbmV3bGluZXMgdG8gYWRkIGluZGVudGF0aW9uLgorICB2b2lkIFByaW50UmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhKTsKKworICAvLyBXcml0ZSBhIHplcm8tZGVsaW1pdGVkIHN0cmluZyB0byBvdXRwdXQgYnVmZmVyLgorICAvLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBsb29rIGZvciBuZXdsaW5lcyB0byBhZGQgaW5kZW50YXRpb24uCisgIHZvaWQgUHJpbnRSYXcoY29uc3QgY2hhciogZGF0YSk7CisKKyAgLy8gV3JpdGUgc29tZSBieXRlcyB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgLy8gVGhpcyBtZXRob2QgZG9lcyBub3QgbG9vayBmb3IgbmV3bGluZXMgdG8gYWRkIGluZGVudGF0aW9uLgorICB2b2lkIFdyaXRlUmF3KGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplKTsKKworICAvLyBGb3JtYXRJbnRlcm5hbCBpcyBhIGhlbHBlciBmdW5jdGlvbiBub3QgbWVhbnQgdG8gdXNlIGRpcmVjdGx5LCB1c2UKKyAgLy8gY29tcGlsZXI6OmNwcDo6Rm9ybWF0dGVyIGluc3RlYWQuIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gc3VwcG9ydAorICAvLyBmb3JtYXR0aW5nIHRleHQgdXNpbmcgbmFtZWQgdmFyaWFibGVzIChlcS4gIiRmb28kKSBmcm9tIGEgbG9va3VwIG1hcCAodmFycykKKyAgLy8gYW5kIHZhcmlhYmxlcyBkaXJlY3RseSBzdXBwbGllZCBieSBhcmd1bWVudHMgKGVxICIkMSQiIG1lYW5pbmcgZmlyc3QKKyAgLy8gYXJndW1lbnQgd2hpY2ggaXMgdGhlIHplcm8gaW5kZXggZWxlbWVudCBvZiBhcmdzKS4KKyAgdm9pZCBGb3JtYXRJbnRlcm5hbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmb3JtYXQpOworCisgIC8vIFRydWUgaWYgYW55IHdyaXRlIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBmYWlsZWQuICAoV2UgZG9uJ3QganVzdAorICAvLyBjcmFzaCBpbiB0aGlzIGNhc2UgYmVjYXVzZSB0aGlzIGlzIGFuIEkvTyBmYWlsdXJlLCBub3QgYSBwcm9ncmFtbWluZworICAvLyBlcnJvci4pCisgIGJvb2wgZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gZmFpbGVkXzsgfQorCisgcHJpdmF0ZToKKyAgLy8gTGluayB0aGUgb3V0cHV0IHJhbmdlIGRlZmluZWQgYnkgdGhlIHN1YnN0aXR1dGlvbiB2YXJpYWJsZXMgYXMgZW1pdHRlZCBieQorICAvLyB0aGUgbGFzdCBjYWxsIHRvIFByaW50IHRvIHRoZSBvYmplY3QgZm91bmQgYXQgdGhlIFNvdXJjZUNvZGVJbmZvLXN0eWxlIHBhdGgKKyAgLy8gaW4gYSBmaWxlIHdpdGggcGF0aCBmaWxlX3BhdGguIFRoZSByYW5nZSBiZWdpbnMgYXQgdGhlIHN0YXJ0IG9mCisgIC8vIGJlZ2luX3Zhcm5hbWUncyB2YWx1ZSBhbmQgZW5kcyBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIHZhbHVlCisgIC8vIHN1YnN0aXR1dGVkIGZvciBlbmRfdmFybmFtZS4gTm90ZSB0aGF0IGJlZ2luX3Zhcm5hbWUgYW5kIGVuZF92YXJuYW1lCisgIC8vIG1heSByZWZlciB0byB0aGUgc2FtZSB2YXJpYWJsZS4KKyAgdm9pZCBBbm5vdGF0ZShjb25zdCBjaGFyKiBiZWdpbl92YXJuYW1lLCBjb25zdCBjaGFyKiBlbmRfdmFybmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9wYXRoLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBwYXRoKTsKKworICAvLyBCYXNlIGNhc2UKKyAgdm9pZCBQcmludEludGVybmFsKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXh0KSB7CisgICAgUHJpbnQoKnZhcnMsIHRleHQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CisgIHZvaWQgUHJpbnRJbnRlcm5hbChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiB2YXJzLCBjb25zdCBjaGFyKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmdzJi4uLiBhcmdzKSB7CisgICAgKCp2YXJzKVtrZXldID0gdmFsdWU7CisgICAgUHJpbnRJbnRlcm5hbCh2YXJzLCB0ZXh0LCBhcmdzLi4uKTsKKyAgfQorCisgIC8vIENvcHkgc2l6ZSB3b3J0aCBvZiBieXRlcyBmcm9tIGRhdGEgdG8gYnVmZmVyXy4KKyAgdm9pZCBDb3B5VG9CdWZmZXIoY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUpOworCisgIHZvaWQgcHVzaF9iYWNrKGNoYXIgYykgeworICAgIGlmIChmYWlsZWRfKSByZXR1cm47CisgICAgaWYgKGJ1ZmZlcl9zaXplXyA9PSAwKSB7CisgICAgICBpZiAoIU5leHQoKSkgcmV0dXJuOworICAgIH0KKyAgICAqYnVmZmVyXysrID0gYzsKKyAgICBidWZmZXJfc2l6ZV8tLTsKKyAgICBvZmZzZXRfKys7CisgIH0KKworICBib29sIE5leHQoKTsKKworICBpbmxpbmUgdm9pZCBJbmRlbnRJZkF0U3RhcnQoKTsKKyAgY29uc3QgY2hhciogV3JpdGVWYXJpYWJsZSgKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHZhcnMsIGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICAgIGludCogYXJnX2luZGV4LAorICAgICAgc3RkOjp2ZWN0b3I8QW5ub3RhdGlvbkNvbGxlY3Rvcjo6QW5ub3RhdGlvbj4qIGFubm90YXRpb25zKTsKKworICBjb25zdCBjaGFyIHZhcmlhYmxlX2RlbGltaXRlcl87CisKKyAgWmVyb0NvcHlPdXRwdXRTdHJlYW0qIGNvbnN0IG91dHB1dF87CisgIGNoYXIqIGJ1ZmZlcl87CisgIGludCBidWZmZXJfc2l6ZV87CisgIC8vIFRoZSBjdXJyZW50IHBvc2l0aW9uLCBpbiBieXRlcywgaW4gdGhlIG91dHB1dCBzdHJlYW0uICBUaGlzIGlzIGVxdWl2YWxlbnQKKyAgLy8gdG8gdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiB3cml0dGVuIHNvIGZhci4gIFRoaXMgdmFsdWUgaXMKKyAgLy8gdXNlZCB0byBjYWxjdWxhdGUgYW5ub3RhdGlvbiByYW5nZXMgaW4gdGhlIHN1YnN0aXR1dGlvbnNfIG1hcCBiZWxvdy4KKyAgc2l6ZV90IG9mZnNldF87CisKKyAgc3RkOjpzdHJpbmcgaW5kZW50XzsKKyAgYm9vbCBhdF9zdGFydF9vZl9saW5lXzsKKyAgYm9vbCBmYWlsZWRfOworCisgIC8vIEEgbWFwIGZyb20gdmFyaWFibGUgbmFtZSB0byBbc3RhcnQsIGVuZCkgb2Zmc2V0cyBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgLy8gVGhlc2UgcmVmZXIgdG8gdGhlIG9mZnNldHMgdXNlZCBmb3IgYSB2YXJpYWJsZSBhZnRlciB0aGUgbGFzdCBjYWxsIHRvCisgIC8vIFByaW50LiAgSWYgYSB2YXJpYWJsZSB3YXMgdXNlZCBtb3JlIHRoYW4gb25jZSwgdGhlIGVudHJ5IHVzZWQgaW4KKyAgLy8gdGhpcyBtYXAgaXMgc2V0IHRvIGEgbmVnYXRpdmUtbGVuZ3RoIHNwYW4uICBGb3Igc2luZ2x5LXVzZWQgdmFyaWFibGVzLCB0aGUKKyAgLy8gc3RhcnQgb2Zmc2V0IGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN1YnN0aXR1dGlvbjsgdGhlIGVuZCBvZmZzZXQgaXMgdGhlCisgIC8vIGxhc3QgYnl0ZSBvZiB0aGUgc3Vic3RpdHV0aW9uIHBsdXMgb25lIChzdWNoIHRoYXQgKGVuZCAtIHN0YXJ0KSBpcyB0aGUKKyAgLy8gbGVuZ3RoIG9mIHRoZSBzdWJzdGl0dXRlZCBzdHJpbmcpLgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiA+IHN1YnN0aXR1dGlvbnNfOworCisgIC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBrZXlzIGluIHN1YnN0aXR1dGlvbnNfIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkIHdoZW4KKyAgLy8gaW5kZW50cyBhcmUgaW5zZXJ0ZWQuIFRoZXNlIGFyZSBrZXlzIHRoYXQgcmVmZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgLy8gY3VycmVudCBsaW5lLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZV9zdGFydF92YXJpYWJsZXNfOworCisgIC8vIFJldHVybnMgdHJ1ZSBhbmQgc2V0cyByYW5nZSB0byB0aGUgc3Vic3RpdHV0aW9uIHJhbmdlIGluIHRoZSBvdXRwdXQgZm9yCisgIC8vIHZhcm5hbWUgaWYgdmFybmFtZSB3YXMgdXNlZCBvbmNlIGluIHRoZSBsYXN0IGNhbGwgdG8gUHJpbnQuIElmIHZhcm5hbWUKKyAgLy8gd2FzIG5vdCB1c2VkLCBvciBpZiBpdCB3YXMgdXNlZCBtdWx0aXBsZSB0aW1lcywgcmV0dXJucyBmYWxzZSAoYW5kCisgIC8vIGZhaWxzIGEgZGVidWcgYXNzZXJ0aW9uKS4KKyAgYm9vbCBHZXRTdWJzdGl0dXRpb25SYW5nZShjb25zdCBjaGFyKiB2YXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4qIHJhbmdlKTsKKworICAvLyBJZiBub24tbnVsbCwgYW5ub3RhdGlvbl9jb2xsZWN0b3JfIGlzIHVzZWQgdG8gc3RvcmUgYW5ub3RhdGlvbnMgYWJvdXQKKyAgLy8gZ2VuZXJhdGVkIGNvZGUuCisgIEFubm90YXRpb25Db2xsZWN0b3IqIGNvbnN0IGFubm90YXRpb25fY29sbGVjdG9yXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUHJpbnRlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JT19QUklOVEVSX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNTRkMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw3MzUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworLy8gRWFjaCB0ZXN0IHJlcGVhdHMgb3ZlciBzZXZlcmFsIGJsb2NrIHNpemVzIGluIG9yZGVyIHRvIHRlc3QgYm90aCBjYXNlcworLy8gd2hlcmUgcGFydGljdWxhciB3cml0ZXMgY3Jvc3MgYSBidWZmZXIgYm91bmRhcnkgYW5kIGNhc2VzIHdoZXJlIHRoZXkgZG8KKy8vIG5vdC4KKworVEVTVChQcmludGVyLCBFbXB0eVByaW50ZXIpIHsKKyAgY2hhciBidWZmZXJbODE5Ml07CisgIGNvbnN0IGludCBibG9ja19zaXplID0gMTAwOworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBHT09HTEVfQVJSQVlTSVpFKGJ1ZmZlciksIGJsb2NrX3NpemUpOworICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJ1wwJyk7CisgIEVYUEVDVF9UUlVFKCFwcmludGVyLmZhaWxlZCgpKTsKK30KKworVEVTVChQcmludGVyLCBCYXNpY1ByaW50aW5nKSB7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworCisgIGZvciAoaW50IGJsb2NrX3NpemUgPSAxOyBibG9ja19zaXplIDwgNTEyOyBibG9ja19zaXplICo9IDIpIHsKKyAgICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgYmxvY2tfc2l6ZSk7CisKKyAgICB7CisgICAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJ1wwJyk7CisKKyAgICAgIHByaW50ZXIuUHJpbnQoIkhlbGxvIFdvcmxkISIpOworICAgICAgcHJpbnRlci5QcmludCgiICBUaGlzIGlzIHRoZSBzYW1lIGxpbmUuXG4iKTsKKyAgICAgIHByaW50ZXIuUHJpbnQoIkJ1dCB0aGlzIGlzIGEgbmV3IG9uZS5cbkFuZCB0aGlzIGlzIGFub3RoZXIgb25lLiIpOworCisgICAgICBFWFBFQ1RfRkFMU0UocHJpbnRlci5mYWlsZWQoKSk7CisgICAgfQorCisgICAgYnVmZmVyW291dHB1dC5CeXRlQ291bnQoKV0gPSAnXDAnOworCisgICAgRVhQRUNUX1NUUkVRKAorICAgICAgICAiSGVsbG8gV29ybGQhICBUaGlzIGlzIHRoZSBzYW1lIGxpbmUuXG4iCisgICAgICAgICJCdXQgdGhpcyBpcyBhIG5ldyBvbmUuXG4iCisgICAgICAgICJBbmQgdGhpcyBpcyBhbm90aGVyIG9uZS4iLAorICAgICAgICBidWZmZXIpOworICB9Cit9CisKK1RFU1QoUHJpbnRlciwgV3JpdGVSYXcpIHsKKyAgY2hhciBidWZmZXJbODE5Ml07CisKKyAgZm9yIChpbnQgYmxvY2tfc2l6ZSA9IDE7IGJsb2NrX3NpemUgPCA1MTI7IGJsb2NrX3NpemUgKj0gMikgeworICAgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpLCBibG9ja19zaXplKTsKKworICAgIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHN0cmluZ19vYmogPSAiRnJvbSBhbiBvYmplY3RcbiI7CisgICAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKKyAgICAgIHByaW50ZXIuV3JpdGVSYXcoIkhlbGxvIFdvcmxkISIsIDEyKTsKKyAgICAgIHByaW50ZXIuUHJpbnRSYXcoIiAgVGhpcyBpcyB0aGUgc2FtZSBsaW5lLlxuIik7CisgICAgICBwcmludGVyLlByaW50UmF3KCJCdXQgdGhpcyBpcyBhIG5ldyBvbmUuXG5BbmQgdGhpcyBpcyBhbm90aGVyIG9uZS4iKTsKKyAgICAgIHByaW50ZXIuV3JpdGVSYXcoIlxuIiwgMSk7CisgICAgICBwcmludGVyLlByaW50UmF3KHN0cmluZ19vYmopOworICAgICAgRVhQRUNUX0ZBTFNFKHByaW50ZXIuZmFpbGVkKCkpOworICAgIH0KKworICAgIGJ1ZmZlcltvdXRwdXQuQnl0ZUNvdW50KCldID0gJ1wwJzsKKworICAgIEVYUEVDVF9TVFJFUSgKKyAgICAgICAgIkhlbGxvIFdvcmxkISAgVGhpcyBpcyB0aGUgc2FtZSBsaW5lLlxuIgorICAgICAgICAiQnV0IHRoaXMgaXMgYSBuZXcgb25lLlxuIgorICAgICAgICAiQW5kIHRoaXMgaXMgYW5vdGhlciBvbmUuIgorICAgICAgICAiXG4iCisgICAgICAgICJGcm9tIGFuIG9iamVjdFxuIiwKKyAgICAgICAgYnVmZmVyKTsKKyAgfQorfQorCitURVNUKFByaW50ZXIsIFZhcmlhYmxlU3Vic3RpdHV0aW9uKSB7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworCisgIGZvciAoaW50IGJsb2NrX3NpemUgPSAxOyBibG9ja19zaXplIDwgNTEyOyBibG9ja19zaXplICo9IDIpIHsKKyAgICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgYmxvY2tfc2l6ZSk7CisKKyAgICB7CisgICAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKworICAgICAgdmFyc1siZm9vIl0gPSAiV29ybGQiOworICAgICAgdmFyc1siYmFyIl0gPSAiJGZvbyQiOworICAgICAgdmFyc1siYWJjZGVmZyJdID0gIjEyMzQiOworCisgICAgICBwcmludGVyLlByaW50KHZhcnMsICJIZWxsbyAkZm9vJCFcbmJhciA9ICRiYXIkXG4iKTsKKyAgICAgIHByaW50ZXIuUHJpbnRSYXcoIlJhd0JpdFxuIik7CisgICAgICBwcmludGVyLlByaW50KHZhcnMsICIkYWJjZGVmZyRcbkEgbGl0ZXJhbCBkb2xsYXIgc2lnbjogICQkIik7CisKKyAgICAgIHZhcnNbImZvbyJdID0gImJsYWgiOworICAgICAgcHJpbnRlci5QcmludCh2YXJzLCAiXG5Ob3cgZm9vID0gJGZvbyQuIik7CisKKyAgICAgIEVYUEVDVF9GQUxTRShwcmludGVyLmZhaWxlZCgpKTsKKyAgICB9CisKKyAgICBidWZmZXJbb3V0cHV0LkJ5dGVDb3VudCgpXSA9ICdcMCc7CisKKyAgICBFWFBFQ1RfU1RSRVEoCisgICAgICAgICJIZWxsbyBXb3JsZCFcbiIKKyAgICAgICAgImJhciA9ICRmb28kXG4iCisgICAgICAgICJSYXdCaXRcbiIKKyAgICAgICAgIjEyMzRcbiIKKyAgICAgICAgIkEgbGl0ZXJhbCBkb2xsYXIgc2lnbjogICRcbiIKKyAgICAgICAgIk5vdyBmb28gPSBibGFoLiIsCisgICAgICAgIGJ1ZmZlcik7CisgIH0KK30KKworVEVTVChQcmludGVyLCBJbmxpbmVWYXJpYWJsZVN1YnN0aXR1dGlvbikgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisKKyAgeworICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcpOworICAgIHByaW50ZXIuUHJpbnQoIkhlbGxvICRmb28kIVxuIiwgImZvbyIsICJXb3JsZCIpOworICAgIHByaW50ZXIuUHJpbnRSYXcoIlJhd0JpdFxuIik7CisgICAgcHJpbnRlci5QcmludCgiJGZvbyQgJGJhciRcbiIsICJmb28iLCAib25lIiwgImJhciIsICJ0d28iKTsKKyAgICBFWFBFQ1RfRkFMU0UocHJpbnRlci5mYWlsZWQoKSk7CisgIH0KKworICBidWZmZXJbb3V0cHV0LkJ5dGVDb3VudCgpXSA9ICdcMCc7CisKKyAgRVhQRUNUX1NUUkVRKAorICAgICAgIkhlbGxvIFdvcmxkIVxuIgorICAgICAgIlJhd0JpdFxuIgorICAgICAgIm9uZSB0d29cbiIsCisgICAgICBidWZmZXIpOworfQorCisvLyBNb2NrRGVzY3JpcHRvckZpbGUgZGVmaW5lcyBvbmx5IHRob3NlIG1lbWJlcnMgdGhhdCBQcmludGVyIHVzZXMgdG8gd3JpdGUgb3V0CisvLyBhbm5vdGF0aW9ucy4KK2NsYXNzIE1vY2tEZXNjcmlwdG9yRmlsZSB7CisgcHVibGljOgorICBleHBsaWNpdCBNb2NrRGVzY3JpcHRvckZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUpIDogZmlsZV8oZmlsZSkge30KKworICAvLyBUaGUgbW9jayBmaWxlbmFtZSBmb3IgdGhpcyBmaWxlLgorICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVfOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBmaWxlXzsKK307CisKKy8vIE1vY2tEZXNjcmlwdG9yIGRlZmluZXMgb25seSB0aG9zZSBtZW1iZXJzIHRoYXQgUHJpbnRlciB1c2VzIHRvIHdyaXRlIG91dAorLy8gYW5ub3RhdGlvbnMuCitjbGFzcyBNb2NrRGVzY3JpcHRvciB7CisgcHVibGljOgorICBNb2NrRGVzY3JpcHRvcihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSwgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgcGF0aCkKKyAgICAgIDogZmlsZV8oZmlsZSksIHBhdGhfKHBhdGgpIHt9CisKKyAgLy8gVGhlIG1vY2sgZmlsZSBpbiB3aGljaCB0aGlzIGRlc2NyaXB0b3Igd2FzIGRlZmluZWQuCisgIGNvbnN0IE1vY2tEZXNjcmlwdG9yRmlsZSogZmlsZSgpIGNvbnN0IHsgcmV0dXJuICZmaWxlXzsgfQorCisgcHJpdmF0ZToKKyAgLy8gQWxsb3dzIGFjY2VzcyB0byBHZXRMb2NhdGlvblBhdGguCisgIGZyaWVuZCBjbGFzcyBQcmludGVyOworCisgIC8vIENvcGllcyB0aGUgcHJlLXN0b3JlZCBwYXRoIHRvIG91dHB1dC4KKyAgdm9pZCBHZXRMb2NhdGlvblBhdGgoc3RkOjp2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdCB7ICpvdXRwdXQgPSBwYXRoXzsgfQorCisgIE1vY2tEZXNjcmlwdG9yRmlsZSBmaWxlXzsKKyAgc3RkOjp2ZWN0b3I8aW50PiBwYXRoXzsKK307CisKK1RFU1QoUHJpbnRlciwgQW5ub3RhdGVNYXApIHsKKyAgY2hhciBidWZmZXJbODE5Ml07CisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgR2VuZXJhdGVkQ29kZUluZm8gaW5mbzsKKyAgQW5ub3RhdGlvblByb3RvQ29sbGVjdG9yPEdlbmVyYXRlZENvZGVJbmZvPiBpbmZvX2NvbGxlY3RvcigmaW5mbyk7CisgIHsKKyAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnLCAmaW5mb19jb2xsZWN0b3IpOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJmb28iXSA9ICIzIjsKKyAgICB2YXJzWyJiYXIiXSA9ICI1IjsKKyAgICBwcmludGVyLlByaW50KHZhcnMsICIwMTIkZm9vJDQkYmFyJFxuIik7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBwYXRoXzE7CisgICAgcGF0aF8xLnB1c2hfYmFjaygzMyk7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBwYXRoXzI7CisgICAgcGF0aF8yLnB1c2hfYmFjaygxMSk7CisgICAgcGF0aF8yLnB1c2hfYmFjaygyMik7CisgICAgTW9ja0Rlc2NyaXB0b3IgZGVzY3JpcHRvcl8xKCJwYXRoXzEiLCBwYXRoXzEpOworICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3JfMigicGF0aF8yIiwgcGF0aF8yKTsKKyAgICBwcmludGVyLkFubm90YXRlKCJmb28iLCAiZm9vIiwgJmRlc2NyaXB0b3JfMSk7CisgICAgcHJpbnRlci5Bbm5vdGF0ZSgiYmFyIiwgImJhciIsICZkZXNjcmlwdG9yXzIpOworICB9CisgIGJ1ZmZlcltvdXRwdXQuQnl0ZUNvdW50KCldID0gJ1wwJzsKKyAgRVhQRUNUX1NUUkVRKCIwMTIzNDVcbiIsIGJ1ZmZlcik7CisgIEFTU0VSVF9FUSgyLCBpbmZvLmFubm90YXRpb25fc2l6ZSgpKTsKKyAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGZvbyA9IGluZm8uYW5ub3RhdGlvbigwKS5wYXRoX3NpemUoKSA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmaW5mby5hbm5vdGF0aW9uKDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmaW5mby5hbm5vdGF0aW9uKDEpOworICBjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbzo6QW5ub3RhdGlvbiogYmFyID0gaW5mby5hbm5vdGF0aW9uKDApLnBhdGhfc2l6ZSgpID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZpbmZvLmFubm90YXRpb24oMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICZpbmZvLmFubm90YXRpb24oMCk7CisgIEFTU0VSVF9FUSgxLCBmb28tPnBhdGhfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIGJhci0+cGF0aF9zaXplKCkpOworICBFWFBFQ1RfRVEoMzMsIGZvby0+cGF0aCgwKSk7CisgIEVYUEVDVF9FUSgxMSwgYmFyLT5wYXRoKDApKTsKKyAgRVhQRUNUX0VRKDIyLCBiYXItPnBhdGgoMSkpOworICBFWFBFQ1RfRVEoInBhdGhfMSIsIGZvby0+c291cmNlX2ZpbGUoKSk7CisgIEVYUEVDVF9FUSgicGF0aF8yIiwgYmFyLT5zb3VyY2VfZmlsZSgpKTsKKyAgRVhQRUNUX0VRKDMsIGZvby0+YmVnaW4oKSk7CisgIEVYUEVDVF9FUSg0LCBmb28tPmVuZCgpKTsKKyAgRVhQRUNUX0VRKDUsIGJhci0+YmVnaW4oKSk7CisgIEVYUEVDVF9FUSg2LCBiYXItPmVuZCgpKTsKK30KKworVEVTVChQcmludGVyLCBBbm5vdGF0ZUlubGluZSkgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICBHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOworICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKKyAgeworICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7CisgICAgcHJpbnRlci5QcmludCgiMDEyJGZvbyQ0JGJhciRcbiIsICJmb28iLCAiMyIsICJiYXIiLCAiNSIpOworICAgIHN0ZDo6dmVjdG9yPGludD4gcGF0aF8xOworICAgIHBhdGhfMS5wdXNoX2JhY2soMzMpOworICAgIHN0ZDo6dmVjdG9yPGludD4gcGF0aF8yOworICAgIHBhdGhfMi5wdXNoX2JhY2soMTEpOworICAgIHBhdGhfMi5wdXNoX2JhY2soMjIpOworICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3JfMSgicGF0aF8xIiwgcGF0aF8xKTsKKyAgICBNb2NrRGVzY3JpcHRvciBkZXNjcmlwdG9yXzIoInBhdGhfMiIsIHBhdGhfMik7CisgICAgcHJpbnRlci5Bbm5vdGF0ZSgiZm9vIiwgImZvbyIsICZkZXNjcmlwdG9yXzEpOworICAgIHByaW50ZXIuQW5ub3RhdGUoImJhciIsICJiYXIiLCAmZGVzY3JpcHRvcl8yKTsKKyAgfQorICBidWZmZXJbb3V0cHV0LkJ5dGVDb3VudCgpXSA9ICdcMCc7CisgIEVYUEVDVF9TVFJFUSgiMDEyMzQ1XG4iLCBidWZmZXIpOworICBBU1NFUlRfRVEoMiwgaW5mby5hbm5vdGF0aW9uX3NpemUoKSk7CisgIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKiBmb28gPSBpbmZvLmFubm90YXRpb24oMCkucGF0aF9zaXplKCkgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJmluZm8uYW5ub3RhdGlvbigwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJmluZm8uYW5ub3RhdGlvbigxKTsKKyAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGJhciA9IGluZm8uYW5ub3RhdGlvbigwKS5wYXRoX3NpemUoKSA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmaW5mby5hbm5vdGF0aW9uKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmaW5mby5hbm5vdGF0aW9uKDApOworICBBU1NFUlRfRVEoMSwgZm9vLT5wYXRoX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBiYXItPnBhdGhfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDMzLCBmb28tPnBhdGgoMCkpOworICBFWFBFQ1RfRVEoMTEsIGJhci0+cGF0aCgwKSk7CisgIEVYUEVDVF9FUSgyMiwgYmFyLT5wYXRoKDEpKTsKKyAgRVhQRUNUX0VRKCJwYXRoXzEiLCBmb28tPnNvdXJjZV9maWxlKCkpOworICBFWFBFQ1RfRVEoInBhdGhfMiIsIGJhci0+c291cmNlX2ZpbGUoKSk7CisgIEVYUEVDVF9FUSgzLCBmb28tPmJlZ2luKCkpOworICBFWFBFQ1RfRVEoNCwgZm9vLT5lbmQoKSk7CisgIEVYUEVDVF9FUSg1LCBiYXItPmJlZ2luKCkpOworICBFWFBFQ1RfRVEoNiwgYmFyLT5lbmQoKSk7Cit9CisKK1RFU1QoUHJpbnRlciwgQW5ub3RhdGVSYW5nZSkgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICBHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOworICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKKyAgeworICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7CisgICAgcHJpbnRlci5QcmludCgiMDEyJGZvbyQ0JGJhciRcbiIsICJmb28iLCAiMyIsICJiYXIiLCAiNSIpOworICAgIHN0ZDo6dmVjdG9yPGludD4gcGF0aDsKKyAgICBwYXRoLnB1c2hfYmFjaygzMyk7CisgICAgTW9ja0Rlc2NyaXB0b3IgZGVzY3JpcHRvcigicGF0aCIsIHBhdGgpOworICAgIHByaW50ZXIuQW5ub3RhdGUoImZvbyIsICJiYXIiLCAmZGVzY3JpcHRvcik7CisgIH0KKyAgYnVmZmVyW291dHB1dC5CeXRlQ291bnQoKV0gPSAnXDAnOworICBFWFBFQ1RfU1RSRVEoIjAxMjM0NVxuIiwgYnVmZmVyKTsKKyAgQVNTRVJUX0VRKDEsIGluZm8uYW5ub3RhdGlvbl9zaXplKCkpOworICBjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbzo6QW5ub3RhdGlvbiogZm9vYmFyID0gJmluZm8uYW5ub3RhdGlvbigwKTsKKyAgQVNTRVJUX0VRKDEsIGZvb2Jhci0+cGF0aF9zaXplKCkpOworICBFWFBFQ1RfRVEoMzMsIGZvb2Jhci0+cGF0aCgwKSk7CisgIEVYUEVDVF9FUSgicGF0aCIsIGZvb2Jhci0+c291cmNlX2ZpbGUoKSk7CisgIEVYUEVDVF9FUSgzLCBmb29iYXItPmJlZ2luKCkpOworICBFWFBFQ1RfRVEoNiwgZm9vYmFyLT5lbmQoKSk7Cit9CisKK1RFU1QoUHJpbnRlciwgQW5ub3RhdGVFbXB0eVJhbmdlKSB7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgIEdlbmVyYXRlZENvZGVJbmZvIGluZm87CisgIEFubm90YXRpb25Qcm90b0NvbGxlY3RvcjxHZW5lcmF0ZWRDb2RlSW5mbz4gaW5mb19jb2xsZWN0b3IoJmluZm8pOworICB7CisgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJywgJmluZm9fY29sbGVjdG9yKTsKKyAgICBwcmludGVyLlByaW50KCIwMTIkZm9vJDQkYmF6JCRiYW0kJGJhciRcbiIsICJmb28iLCAiMyIsICJiYXIiLCAiNSIsICJiYXoiLAorICAgICAgICAgICAgICAgICAgIiIsICJiYW0iLCAiIik7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBwYXRoOworICAgIHBhdGgucHVzaF9iYWNrKDMzKTsKKyAgICBNb2NrRGVzY3JpcHRvciBkZXNjcmlwdG9yKCJwYXRoIiwgcGF0aCk7CisgICAgcHJpbnRlci5Bbm5vdGF0ZSgiYmF6IiwgImJhbSIsICZkZXNjcmlwdG9yKTsKKyAgfQorICBidWZmZXJbb3V0cHV0LkJ5dGVDb3VudCgpXSA9ICdcMCc7CisgIEVYUEVDVF9TVFJFUSgiMDEyMzQ1XG4iLCBidWZmZXIpOworICBBU1NFUlRfRVEoMSwgaW5mby5hbm5vdGF0aW9uX3NpemUoKSk7CisgIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKiBiYXpiYW0gPSAmaW5mby5hbm5vdGF0aW9uKDApOworICBBU1NFUlRfRVEoMSwgYmF6YmFtLT5wYXRoX3NpemUoKSk7CisgIEVYUEVDVF9FUSgzMywgYmF6YmFtLT5wYXRoKDApKTsKKyAgRVhQRUNUX0VRKCJwYXRoIiwgYmF6YmFtLT5zb3VyY2VfZmlsZSgpKTsKKyAgRVhQRUNUX0VRKDUsIGJhemJhbS0+YmVnaW4oKSk7CisgIEVYUEVDVF9FUSg1LCBiYXpiYW0tPmVuZCgpKTsKK30KKworVEVTVChQcmludGVyLCBBbm5vdGF0ZURlc3BpdGVVbnJlbGF0ZWRNdWx0aXBsZVVzZXMpIHsKKyAgY2hhciBidWZmZXJbODE5Ml07CisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgR2VuZXJhdGVkQ29kZUluZm8gaW5mbzsKKyAgQW5ub3RhdGlvblByb3RvQ29sbGVjdG9yPEdlbmVyYXRlZENvZGVJbmZvPiBpbmZvX2NvbGxlY3RvcigmaW5mbyk7CisgIHsKKyAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnLCAmaW5mb19jb2xsZWN0b3IpOworICAgIHByaW50ZXIuUHJpbnQoIjAxMiRmb28kNCRmb28kJGJhciRcbiIsICJmb28iLCAiMyIsICJiYXIiLCAiNSIpOworICAgIHN0ZDo6dmVjdG9yPGludD4gcGF0aDsKKyAgICBwYXRoLnB1c2hfYmFjaygzMyk7CisgICAgTW9ja0Rlc2NyaXB0b3IgZGVzY3JpcHRvcigicGF0aCIsIHBhdGgpOworICAgIHByaW50ZXIuQW5ub3RhdGUoImJhciIsICJiYXIiLCAmZGVzY3JpcHRvcik7CisgIH0KKyAgYnVmZmVyW291dHB1dC5CeXRlQ291bnQoKV0gPSAnXDAnOworICBFWFBFQ1RfU1RSRVEoIjAxMjM0MzVcbiIsIGJ1ZmZlcik7CisgIEFTU0VSVF9FUSgxLCBpbmZvLmFubm90YXRpb25fc2l6ZSgpKTsKKyAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGJhciA9ICZpbmZvLmFubm90YXRpb24oMCk7CisgIEFTU0VSVF9FUSgxLCBiYXItPnBhdGhfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDMzLCBiYXItPnBhdGgoMCkpOworICBFWFBFQ1RfRVEoInBhdGgiLCBiYXItPnNvdXJjZV9maWxlKCkpOworICBFWFBFQ1RfRVEoNiwgYmFyLT5iZWdpbigpKTsKKyAgRVhQRUNUX0VRKDcsIGJhci0+ZW5kKCkpOworfQorCitURVNUKFByaW50ZXIsIEFubm90YXRlSW5kZW50KSB7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgIEdlbmVyYXRlZENvZGVJbmZvIGluZm87CisgIEFubm90YXRpb25Qcm90b0NvbGxlY3RvcjxHZW5lcmF0ZWRDb2RlSW5mbz4gaW5mb19jb2xsZWN0b3IoJmluZm8pOworICB7CisgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJywgJmluZm9fY29sbGVjdG9yKTsKKyAgICBwcmludGVyLlByaW50KCIwXG4iKTsKKyAgICBwcmludGVyLkluZGVudCgpOworICAgIHByaW50ZXIuUHJpbnQoIiRmb28kIiwgImZvbyIsICI0Iik7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBwYXRoOworICAgIHBhdGgucHVzaF9iYWNrKDQ0KTsKKyAgICBNb2NrRGVzY3JpcHRvciBkZXNjcmlwdG9yKCJwYXRoIiwgcGF0aCk7CisgICAgcHJpbnRlci5Bbm5vdGF0ZSgiZm9vIiwgJmRlc2NyaXB0b3IpOworICAgIHByaW50ZXIuUHJpbnQoIixcbiIpOworICAgIHByaW50ZXIuUHJpbnQoIiRiYXIkIiwgImJhciIsICI5Iik7CisgICAgcGF0aFswXSA9IDk5OworICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3JfdHdvKCJwYXRoIiwgcGF0aCk7CisgICAgcHJpbnRlci5Bbm5vdGF0ZSgiYmFyIiwgJmRlc2NyaXB0b3JfdHdvKTsKKyAgICBwcmludGVyLlByaW50KCJcbiR7JCREJCR9JFxuIiwgInsiLCAiIiwgIn0iLCAiIiwgIkQiLCAiZCIpOworICAgIHBhdGhbMF0gPSAxMzEzOworICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3JfdGhyZWUoInBhdGgiLCBwYXRoKTsKKyAgICBwcmludGVyLkFubm90YXRlKCJ7IiwgIn0iLCAmZGVzY3JpcHRvcl90aHJlZSk7CisgICAgcHJpbnRlci5PdXRkZW50KCk7CisgICAgcHJpbnRlci5QcmludCgiXG4iKTsKKyAgfQorICBidWZmZXJbb3V0cHV0LkJ5dGVDb3VudCgpXSA9ICdcMCc7CisgIEVYUEVDVF9TVFJFUSgiMFxuICA0LFxuICA5XG4gIGRcblxuIiwgYnVmZmVyKTsKKyAgQVNTRVJUX0VRKDMsIGluZm8uYW5ub3RhdGlvbl9zaXplKCkpOworICBjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbzo6QW5ub3RhdGlvbiogZm9vID0gJmluZm8uYW5ub3RhdGlvbigwKTsKKyAgQVNTRVJUX0VRKDEsIGZvby0+cGF0aF9zaXplKCkpOworICBFWFBFQ1RfRVEoNDQsIGZvby0+cGF0aCgwKSk7CisgIEVYUEVDVF9FUSgicGF0aCIsIGZvby0+c291cmNlX2ZpbGUoKSk7CisgIEVYUEVDVF9FUSg0LCBmb28tPmJlZ2luKCkpOworICBFWFBFQ1RfRVEoNSwgZm9vLT5lbmQoKSk7CisgIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKiBiYXIgPSAmaW5mby5hbm5vdGF0aW9uKDEpOworICBBU1NFUlRfRVEoMSwgYmFyLT5wYXRoX3NpemUoKSk7CisgIEVYUEVDVF9FUSg5OSwgYmFyLT5wYXRoKDApKTsKKyAgRVhQRUNUX0VRKCJwYXRoIiwgYmFyLT5zb3VyY2VfZmlsZSgpKTsKKyAgRVhQRUNUX0VRKDksIGJhci0+YmVnaW4oKSk7CisgIEVYUEVDVF9FUSgxMCwgYmFyLT5lbmQoKSk7CisgIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKiBicmFjZXMgPSAmaW5mby5hbm5vdGF0aW9uKDIpOworICBBU1NFUlRfRVEoMSwgYnJhY2VzLT5wYXRoX3NpemUoKSk7CisgIEVYUEVDVF9FUSgxMzEzLCBicmFjZXMtPnBhdGgoMCkpOworICBFWFBFQ1RfRVEoInBhdGgiLCBicmFjZXMtPnNvdXJjZV9maWxlKCkpOworICBFWFBFQ1RfRVEoMTMsIGJyYWNlcy0+YmVnaW4oKSk7CisgIEVYUEVDVF9FUSgxNCwgYnJhY2VzLT5lbmQoKSk7Cit9CisKK1RFU1QoUHJpbnRlciwgQW5ub3RhdGVJbmRlbnROZXdsaW5lKSB7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgIEdlbmVyYXRlZENvZGVJbmZvIGluZm87CisgIEFubm90YXRpb25Qcm90b0NvbGxlY3RvcjxHZW5lcmF0ZWRDb2RlSW5mbz4gaW5mb19jb2xsZWN0b3IoJmluZm8pOworICB7CisgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJywgJmluZm9fY29sbGVjdG9yKTsKKyAgICBwcmludGVyLkluZGVudCgpOworICAgIHByaW50ZXIuUHJpbnQoIiRBJCROJCRCJENcbiIsICJBIiwgIiIsICJOIiwgIlxueiIsICJCIiwgIiIpOworICAgIHN0ZDo6dmVjdG9yPGludD4gcGF0aDsKKyAgICBwYXRoLnB1c2hfYmFjaygwKTsKKyAgICBNb2NrRGVzY3JpcHRvciBkZXNjcmlwdG9yKCJwYXRoIiwgcGF0aCk7CisgICAgcHJpbnRlci5Bbm5vdGF0ZSgiQSIsICJCIiwgJmRlc2NyaXB0b3IpOworICAgIHByaW50ZXIuT3V0ZGVudCgpOworICAgIHByaW50ZXIuUHJpbnQoIlxuIik7CisgIH0KKyAgYnVmZmVyW291dHB1dC5CeXRlQ291bnQoKV0gPSAnXDAnOworICBFWFBFQ1RfU1RSRVEoIlxueiAgQ1xuXG4iLCBidWZmZXIpOworICBBU1NFUlRfRVEoMSwgaW5mby5hbm5vdGF0aW9uX3NpemUoKSk7CisgIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKiBhYiA9ICZpbmZvLmFubm90YXRpb24oMCk7CisgIEFTU0VSVF9FUSgxLCBhYi0+cGF0aF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgYWItPnBhdGgoMCkpOworICBFWFBFQ1RfRVEoInBhdGgiLCBhYi0+c291cmNlX2ZpbGUoKSk7CisgIEVYUEVDVF9FUSgwLCBhYi0+YmVnaW4oKSk7CisgIEVYUEVDVF9FUSg0LCBhYi0+ZW5kKCkpOworfQorCitURVNUKFByaW50ZXIsIEluZGVudGluZykgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKworICBmb3IgKGludCBibG9ja19zaXplID0gMTsgYmxvY2tfc2l6ZSA8IDUxMjsgYmxvY2tfc2l6ZSAqPSAyKSB7CisgICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGJsb2NrX3NpemUpOworCisgICAgeworICAgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJyk7CisgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHZhcnM7CisKKyAgICAgIHZhcnNbIm5ld2xpbmUiXSA9ICJcbiI7CisKKyAgICAgIHByaW50ZXIuUHJpbnQoIlRoaXMgaXMgbm90IGluZGVudGVkLlxuIik7CisgICAgICBwcmludGVyLkluZGVudCgpOworICAgICAgcHJpbnRlci5QcmludCgiVGhpcyBpcyBpbmRlbnRlZFxuQW5kIHNvIGlzIHRoaXNcbiIpOworICAgICAgcHJpbnRlci5PdXRkZW50KCk7CisgICAgICBwcmludGVyLlByaW50KCJCdXQgdGhpcyBpcyBub3QuIik7CisgICAgICBwcmludGVyLkluZGVudCgpOworICAgICAgcHJpbnRlci5QcmludCgKKyAgICAgICAgICAiICBBbmQgdGhpcyBpcyBzdGlsbCB0aGUgc2FtZSBsaW5lLlxuIgorICAgICAgICAgICJCdXQgdGhpcyBpcyBpbmRlbnRlZC5cbiIpOworICAgICAgcHJpbnRlci5QcmludFJhdygiUmF3Qml0IGhhcyBpbmRlbnQgYXQgc3RhcnRcbiIpOworICAgICAgcHJpbnRlci5QcmludFJhdygiYnV0IG5vdCBhZnRlciBhIHJhdyBuZXdsaW5lXG4iKTsKKyAgICAgIHByaW50ZXIuUHJpbnQodmFycywKKyAgICAgICAgICAgICAgICAgICAgIk5vdGUgdGhhdCBhIG5ld2xpbmUgaW4gYSB2YXJpYWJsZSB3aWxsIGJyZWFrICIKKyAgICAgICAgICAgICAgICAgICAgImluZGVudGluZywgYXMgd2Ugc2VlJG5ld2xpbmUkaGVyZS5cbiIpOworICAgICAgcHJpbnRlci5JbmRlbnQoKTsKKyAgICAgIHByaW50ZXIuUHJpbnQoIkFuZCB0aGlzIik7CisgICAgICBwcmludGVyLk91dGRlbnQoKTsKKyAgICAgIHByaW50ZXIuT3V0ZGVudCgpOworICAgICAgcHJpbnRlci5QcmludCgiIGlzIGRvdWJsZS1pbmRlbnRlZFxuQmFjayB0byBub3JtYWwuIik7CisKKyAgICAgIEVYUEVDVF9GQUxTRShwcmludGVyLmZhaWxlZCgpKTsKKyAgICB9CisKKyAgICBidWZmZXJbb3V0cHV0LkJ5dGVDb3VudCgpXSA9ICdcMCc7CisKKyAgICBFWFBFQ1RfU1RSRVEoCisgICAgICAgICJUaGlzIGlzIG5vdCBpbmRlbnRlZC5cbiIKKyAgICAgICAgIiAgVGhpcyBpcyBpbmRlbnRlZFxuIgorICAgICAgICAiICBBbmQgc28gaXMgdGhpc1xuIgorICAgICAgICAiQnV0IHRoaXMgaXMgbm90LiAgQW5kIHRoaXMgaXMgc3RpbGwgdGhlIHNhbWUgbGluZS5cbiIKKyAgICAgICAgIiAgQnV0IHRoaXMgaXMgaW5kZW50ZWQuXG4iCisgICAgICAgICIgIFJhd0JpdCBoYXMgaW5kZW50IGF0IHN0YXJ0XG4iCisgICAgICAgICJidXQgbm90IGFmdGVyIGEgcmF3IG5ld2xpbmVcbiIKKyAgICAgICAgIk5vdGUgdGhhdCBhIG5ld2xpbmUgaW4gYSB2YXJpYWJsZSB3aWxsIGJyZWFrIGluZGVudGluZywgYXMgd2Ugc2VlXG4iCisgICAgICAgICJoZXJlLlxuIgorICAgICAgICAiICAgIEFuZCB0aGlzIGlzIGRvdWJsZS1pbmRlbnRlZFxuIgorICAgICAgICAiQmFjayB0byBub3JtYWwuIiwKKyAgICAgICAgYnVmZmVyKTsKKyAgfQorfQorCisvLyBEZWF0aCB0ZXN0cyBkbyBub3Qgd29yayBvbiBXaW5kb3dzIGFzIG9mIHlldC4KKyNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorVEVTVChQcmludGVyLCBEZWF0aCkgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcpOworCisgIEVYUEVDVF9ERUJVR19ERUFUSChwcmludGVyLlByaW50KCIkbm9zdWNodmFyJCIpLCAiVW5kZWZpbmVkIHZhcmlhYmxlIik7CisgIEVYUEVDVF9ERUJVR19ERUFUSChwcmludGVyLlByaW50KCIkdW5jbG9zZWQiKSwgIlVuY2xvc2VkIHZhcmlhYmxlIG5hbWUiKTsKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKHByaW50ZXIuT3V0ZGVudCgpLCAid2l0aG91dCBtYXRjaGluZyBJbmRlbnQiKTsKK30KKworVEVTVChQcmludGVyLCBBbm5vdGF0ZU11bHRpcGxlVXNlc0RlYXRoKSB7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgIEdlbmVyYXRlZENvZGVJbmZvIGluZm87CisgIEFubm90YXRpb25Qcm90b0NvbGxlY3RvcjxHZW5lcmF0ZWRDb2RlSW5mbz4gaW5mb19jb2xsZWN0b3IoJmluZm8pOworICB7CisgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJywgJmluZm9fY29sbGVjdG9yKTsKKyAgICBwcmludGVyLlByaW50KCIwMTIkZm9vJDQkZm9vJFxuIiwgImZvbyIsICIzIik7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBwYXRoOworICAgIHBhdGgucHVzaF9iYWNrKDMzKTsKKyAgICBNb2NrRGVzY3JpcHRvciBkZXNjcmlwdG9yKCJwYXRoIiwgcGF0aCk7CisgICAgRVhQRUNUX0RFQlVHX0RFQVRIKHByaW50ZXIuQW5ub3RhdGUoImZvbyIsICJmb28iLCAmZGVzY3JpcHRvciksICJtdWx0aXBsZSIpOworICB9Cit9CisKK1RFU1QoUHJpbnRlciwgQW5ub3RhdGVOZWdhdGl2ZUxlbmd0aERlYXRoKSB7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgIEdlbmVyYXRlZENvZGVJbmZvIGluZm87CisgIEFubm90YXRpb25Qcm90b0NvbGxlY3RvcjxHZW5lcmF0ZWRDb2RlSW5mbz4gaW5mb19jb2xsZWN0b3IoJmluZm8pOworICB7CisgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJywgJmluZm9fY29sbGVjdG9yKTsKKyAgICBwcmludGVyLlByaW50KCIwMTIkZm9vJDQkYmFyJFxuIiwgImZvbyIsICIzIiwgImJhciIsICI1Iik7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBwYXRoOworICAgIHBhdGgucHVzaF9iYWNrKDMzKTsKKyAgICBNb2NrRGVzY3JpcHRvciBkZXNjcmlwdG9yKCJwYXRoIiwgcGF0aCk7CisgICAgRVhQRUNUX0RFQlVHX0RFQVRIKHByaW50ZXIuQW5ub3RhdGUoImJhciIsICJmb28iLCAmZGVzY3JpcHRvciksICJuZWdhdGl2ZSIpOworICB9Cit9CisKK1RFU1QoUHJpbnRlciwgQW5ub3RhdGVVbmRlZmluZWREZWF0aCkgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICBHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOworICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKKyAgeworICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7CisgICAgcHJpbnRlci5QcmludCgiMDEyJGZvbyQ0JGZvbyRcbiIsICJmb28iLCAiMyIpOworICAgIHN0ZDo6dmVjdG9yPGludD4gcGF0aDsKKyAgICBwYXRoLnB1c2hfYmFjaygzMyk7CisgICAgTW9ja0Rlc2NyaXB0b3IgZGVzY3JpcHRvcigicGF0aCIsIHBhdGgpOworICAgIEVYUEVDVF9ERUJVR19ERUFUSChwcmludGVyLkFubm90YXRlKCJiYXIiLCAiYmFyIiwgJmRlc2NyaXB0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5kZWZpbmVkIik7CisgIH0KK30KKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKworVEVTVChQcmludGVyLCBXcml0ZUZhaWx1cmVQYXJ0aWFsKSB7CisgIGNoYXIgYnVmZmVyWzE3XTsKKworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcpOworCisgIC8vIFByaW50IDE2IGJ5dGVzIHRvIGFsbW9zdCBmaWxsIHRoZSBidWZmZXIgKHNob3VsZCBub3QgZmFpbCkuCisgIHByaW50ZXIuUHJpbnQoIjAxMjM0NTY3ODlhYmNkZWYiKTsKKyAgRVhQRUNUX0ZBTFNFKHByaW50ZXIuZmFpbGVkKCkpOworCisgIC8vIFRyeSB0byBwcmludCAyIGNoYXJzLiBPbmx5IG9uZSBmaXRzLgorICBwcmludGVyLlByaW50KCI8PiIpOworICBFWFBFQ1RfVFJVRShwcmludGVyLmZhaWxlZCgpKTsKKworICAvLyBBbnl0aGluZyBlbHNlIHNob3VsZCBmYWlsIHRvby4KKyAgcHJpbnRlci5QcmludCgiICIpOworICBFWFBFQ1RfVFJVRShwcmludGVyLmZhaWxlZCgpKTsKKyAgcHJpbnRlci5QcmludCgiYmxhaCIpOworICBFWFBFQ1RfVFJVRShwcmludGVyLmZhaWxlZCgpKTsKKworICAvLyBCdWZmZXIgc2hvdWxkIGNvbnRhaW4gdGhlIGZpcnN0IDE3IGJ5dGVzIHdyaXR0ZW4uCisgIEVYUEVDVF9FUSgiMDEyMzQ1Njc4OWFiY2RlZjwiLCBzdGQ6OnN0cmluZyhidWZmZXIsIHNpemVvZihidWZmZXIpKSk7Cit9CisKK1RFU1QoUHJpbnRlciwgV3JpdGVGYWlsdXJlRXhhY3QpIHsKKyAgY2hhciBidWZmZXJbMTZdOworCisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJyk7CisKKyAgLy8gUHJpbnQgMTYgYnl0ZXMgdG8gZmlsbCB0aGUgYnVmZmVyIGV4YWN0bHkgKHNob3VsZCBub3QgZmFpbCkuCisgIHByaW50ZXIuUHJpbnQoIjAxMjM0NTY3ODlhYmNkZWYiKTsKKyAgRVhQRUNUX0ZBTFNFKHByaW50ZXIuZmFpbGVkKCkpOworCisgIC8vIFRyeSB0byBwcmludCBvbmUgbW9yZSBieXRlIChzaG91bGQgZmFpbCkuCisgIHByaW50ZXIuUHJpbnQoIiAiKTsKKyAgRVhQRUNUX1RSVUUocHJpbnRlci5mYWlsZWQoKSk7CisKKyAgLy8gU2hvdWxkIG5vdCBjcmFzaAorICBwcmludGVyLlByaW50KCJibGFoIik7CisgIEVYUEVDVF9UUlVFKHByaW50ZXIuZmFpbGVkKCkpOworCisgIC8vIEJ1ZmZlciBzaG91bGQgY29udGFpbiB0aGUgZmlyc3QgMTYgYnl0ZXMgd3JpdHRlbi4KKyAgRVhQRUNUX0VRKCIwMTIzNDU2Nzg5YWJjZGVmIiwgc3RkOjpzdHJpbmcoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpOworfQorCitURVNUKFByaW50ZXIsIEZvcm1hdEludGVybmFsKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzeyJhcmcxIiwgImFyZzIifTsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB2YXJzeworICAgICAgeyJmb28iLCAiYmFyIn0sIHsiYmF6IiwgImJsYSJ9LCB7ImVtcHR5IiwgIiJ9fTsKKyAgLy8gU3Vic3RpdHV0aW9uIHRlc3RzCisgIHsKKyAgICAvLyBEaXJlY3QgYXJnIHN1YnN0aXR1dGlvbgorICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgeworICAgICAgU3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dCgmcyk7CisgICAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKKyAgICAgIHByaW50ZXIuRm9ybWF0SW50ZXJuYWwoYXJncywgdmFycywgIiQxJCAkMiQiKTsKKyAgICB9CisgICAgRVhQRUNUX0VRKCJhcmcxIGFyZzIiLCBzKTsKKyAgfQorICB7CisgICAgLy8gVmFyaWFibGUgc3Vic3RpdHV0aW9uIGluY2x1ZGluZyBzcGFjZXMgbGVmdAorICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgeworICAgICAgU3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dCgmcyk7CisgICAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKKyAgICAgIHByaW50ZXIuRm9ybWF0SW50ZXJuYWwoe30sIHZhcnMsICIkZm9vJCQgYmF6JCQgZW1wdHkkIik7CisgICAgfQorICAgIEVYUEVDVF9FUSgiYmFyIGJsYSIsIHMpOworICB9CisgIHsKKyAgICAvLyBWYXJpYWJsZSBzdWJzdGl0dXRpb24gaW5jbHVkaW5nIHNwYWNlcyByaWdodAorICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgeworICAgICAgU3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dCgmcyk7CisgICAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKKyAgICAgIHByaW50ZXIuRm9ybWF0SW50ZXJuYWwoe30sIHZhcnMsICIkZW1wdHkgJCRmb28gJCRiYXokIik7CisgICAgfQorICAgIEVYUEVDVF9FUSgiYmFyIGJsYSIsIHMpOworICB9CisgIHsKKyAgICAvLyBNaXhlZCB2YXJpYWJsZSBzdWJzdGl0dXRpb24KKyAgICBzdGQ6OnN0cmluZyBzOworICAgIHsKKyAgICAgIFN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXQoJnMpOworICAgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJyk7CisgICAgICBwcmludGVyLkZvcm1hdEludGVybmFsKGFyZ3MsIHZhcnMsICIkZW1wdHkgJCQxJCAkZm9vICQkMiQgJGJheiQiKTsKKyAgICB9CisgICAgRVhQRUNUX0VRKCJhcmcxIGJhciBhcmcyIGJsYSIsIHMpOworICB9CisKKyAgLy8gSW5kZW50YXRpb24gdGVzdHMKKyAgeworICAgIC8vIEVtcHR5IGxpbmVzIHNob3VsZG4ndCBpbmRlbnQuCisgICAgc3RkOjpzdHJpbmcgczsKKyAgICB7CisgICAgICBTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0KCZzKTsKKyAgICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcpOworICAgICAgcHJpbnRlci5JbmRlbnQoKTsKKyAgICAgIHByaW50ZXIuRm9ybWF0SW50ZXJuYWwoYXJncywgdmFycywgIiRlbXB0eSAkXG5cbiQxJCAkZm9vICQkMiRcbiRiYXokIik7CisgICAgICBwcmludGVyLk91dGRlbnQoKTsKKyAgICB9CisgICAgRVhQRUNUX0VRKCJcblxuICBhcmcxIGJhciBhcmcyXG4gIGJsYSIsIHMpOworICB9CisgIHsKKyAgICAvLyBBbm5vdGF0aW9ucyBzaG91bGQgcmVzcGVjdCBpbmRlbnRhdGlvbi4KKyAgICBzdGQ6OnN0cmluZyBzOworICAgIEdlbmVyYXRlZENvZGVJbmZvIGluZm87CisgICAgeworICAgICAgU3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dCgmcyk7CisgICAgICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKKyAgICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7CisgICAgICBwcmludGVyLkluZGVudCgpOworICAgICAgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24gYW5ub3RhdGlvbjsKKyAgICAgIGFubm90YXRpb24uc2V0X3NvdXJjZV9maWxlKCJmaWxlLnByb3RvIik7CisgICAgICBhbm5vdGF0aW9uLmFkZF9wYXRoKDMzKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdze2Fubm90YXRpb24uU2VyaWFsaXplQXNTdHJpbmcoKSwgImFyZzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZzIifTsKKyAgICAgIHByaW50ZXIuRm9ybWF0SW50ZXJuYWwoYXJncywgdmFycywgIiRlbXB0eSAkXG5cbiR7MSQkMiQkfSQgJDMkXG4kYmF6JCIpOworICAgICAgcHJpbnRlci5PdXRkZW50KCk7CisgICAgfQorICAgIEVYUEVDVF9FUSgiXG5cbiAgYXJnMSBhcmcyXG4gIGJsYSIsIHMpOworICAgIEFTU0VSVF9FUSgxLCBpbmZvLmFubm90YXRpb25fc2l6ZSgpKTsKKyAgICBjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbzo6QW5ub3RhdGlvbiogYXJnMSA9ICZpbmZvLmFubm90YXRpb24oMCk7CisgICAgQVNTRVJUX0VRKDEsIGFyZzEtPnBhdGhfc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoMzMsIGFyZzEtPnBhdGgoMCkpOworICAgIEVYUEVDVF9FUSgiZmlsZS5wcm90byIsIGFyZzEtPnNvdXJjZV9maWxlKCkpOworICAgIEVYUEVDVF9FUSg0LCBhcmcxLT5iZWdpbigpKTsKKyAgICBFWFBFQ1RfRVEoOCwgYXJnMS0+ZW5kKCkpOworICB9CisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKyAgLy8gRGVhdGggdGVzdHMgaW4gY2FzZSBvZiBpbGxlZ2FsIGZvcm1hdCBzdHJpbmdzLgorICB7CisgICAgLy8gVW51c2VkIGFyZ3VtZW50cworICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgU3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dCgmcyk7CisgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJyk7CisgICAgRVhQRUNUX0RFQVRIKHByaW50ZXIuRm9ybWF0SW50ZXJuYWwoYXJncywgdmFycywgIiRlbXB0eSAkJDEkIiksICJVbnVzZWQiKTsKKyAgfQorICB7CisgICAgLy8gV3Jvbmcgb3JkZXIgYXJndW1lbnRzCisgICAgc3RkOjpzdHJpbmcgczsKKyAgICBTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0KCZzKTsKKyAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKKyAgICBFWFBFQ1RfREVBVEgocHJpbnRlci5Gb3JtYXRJbnRlcm5hbChhcmdzLCB2YXJzLCAiJDIkICQxJCIpLCAib3JkZXIiKTsKKyAgfQorICB7CisgICAgLy8gWmVybyBpcyBpbGxlZ2FsIGFyZ3VtZW50CisgICAgc3RkOjpzdHJpbmcgczsKKyAgICBTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0KCZzKTsKKyAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKKyAgICBFWFBFQ1RfREVBVEgocHJpbnRlci5Gb3JtYXRJbnRlcm5hbChhcmdzLCB2YXJzLCAiJDAkIiksICJmYWlsZWQiKTsKKyAgfQorICB7CisgICAgLy8gQXJndW1lbnQgb3V0IG9mIGJvdW5kcworICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgU3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dCgmcyk7CisgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJyk7CisgICAgRVhQRUNUX0RFQVRIKHByaW50ZXIuRm9ybWF0SW50ZXJuYWwoYXJncywgdmFycywgIiQxJCAkMiQgJDMkIiksICJib3VuZHMiKTsKKyAgfQorICB7CisgICAgLy8gVW5rbm93biB2YXJpYWJsZQorICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgU3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dCgmcyk7CisgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJyk7CisgICAgRVhQRUNUX0RFQVRIKHByaW50ZXIuRm9ybWF0SW50ZXJuYWwoYXJncywgdmFycywgIiRodWgkICQxJCQyJCIpLCAiVW5rbm93biIpOworICB9CisgIHsKKyAgICAvLyBJbGxlZ2FsIHZhcmlhYmxlCisgICAgc3RkOjpzdHJpbmcgczsKKyAgICBTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0KCZzKTsKKyAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKKyAgICBFWFBFQ1RfREVBVEgocHJpbnRlci5Gb3JtYXRJbnRlcm5hbCh7fSwgdmFycywgIiQgJCIpLCAiRW1wdHkiKTsKKyAgfQorI2VuZGlmICAvLyBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorfQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9zdHJ0b2QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2FjYjViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9zdHJ0b2QuY2MKQEAgLTAsMCArMSw4MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vc3RydG9kLmg+CisKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworCisvLyBUaGlzIGFwcHJveGltYXRlbHkgMHgxLmZmZmZmZnAxMjcsIGJ1dCB3ZSBkb24ndCB1c2UgMHgxLmZmZmZmZnAxMjcgYmVjYXVzZQorLy8gaXQgd29uJ3QgY29tcGlsZSBpbiBNU1ZDLgorY29uc3QgZG91YmxlIE1BWF9GTE9BVF9BU19ET1VCTEVfUk9VTkRFRCA9IDMuNDAyODIzNTY3Nzk3MzM2NmUrMzg7CisKK2Zsb2F0IFNhZmVEb3VibGVUb0Zsb2F0KGRvdWJsZSB2YWx1ZSkgeworICAvLyBzdGF0aWNfY2FzdDxmbG9hdD4gb24gYSBudW1iZXIgbGFyZ2VyIHRoYW4gZmxvYXQgY2FuIHJlc3VsdCBpbiBpbGxlZ2FsCisgIC8vIGluc3RydWN0aW9uIGVycm9yLCBzbyB3ZSBuZWVkIHRvIG1hbnVhbGx5IGNvbnZlcnQgaXQgdG8gaW5maW5pdHkgb3IgbWF4LgorICBpZiAodmFsdWUgPiBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWF4KCkpIHsKKyAgICAvLyBNYXggZmxvYXQgdmFsdWUgaXMgYWJvdXQgMy40MDI4MjM0NjY0RTM4IHdoZW4gcmVwcmVzZW50ZWQgYXMgYSBkb3VibGUuCisgICAgLy8gSG93ZXZlciwgd2hlbiBwcmludGluZyBmbG9hdCBhcyB0ZXh0LCBpdCB3aWxsIGJlIHJvdW5kZWQgYXMKKyAgICAvLyAzLjQwMjgyMzVlKzM4LiBJZiB3ZSBwYXJzZSB0aGUgdmFsdWUgb2YgMy40MDI4MjM1ZSszOCBmcm9tIHRleHQgYW5kCisgICAgLy8gY29tcGFyZSBpdCB0byAzLjQwMjgyMzQ2NjRFMzgsIHdlIG1heSB0aGluayB0aGF0IGl0IGlzIGxhcmdlciwgYnV0CisgICAgLy8gYWN0dWFsbHksIGFueSBudW1iZXIgYmV0d2VlbiB0aGVzZSB0d28gbnVtYmVycyBjb3VsZCBvbmx5IGJlIHJlcHJlc2VudGVkCisgICAgLy8gYXMgdGhlIHNhbWUgbWF4IGZsb2F0IG51bWJlciBpbiBmbG9hdCwgc28gd2Ugc2hvdWxkIHRyZWF0IHRoZW0gdGhlIHNhbWUKKyAgICAvLyBhcyBtYXggZmxvYXQuCisgICAgaWYgKHZhbHVlIDw9IE1BWF9GTE9BVF9BU19ET1VCTEVfUk9VTkRFRCkgeworICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjptYXgoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICB9IGVsc2UgaWYgKHZhbHVlIDwgLXN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjptYXgoKSkgeworICAgIGlmICh2YWx1ZSA+PSAtTUFYX0ZMT0FUX0FTX0RPVUJMRV9ST1VOREVEKSB7CisgICAgICByZXR1cm4gLXN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjptYXgoKTsKKyAgICB9CisgICAgcmV0dXJuIC1zdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKTsKKyAgfQorfQorCitkb3VibGUgTm9Mb2NhbGVTdHJ0b2QoY29uc3QgY2hhciogc3RyLCBjaGFyKiogZW5kcHRyKSB7CisgIHJldHVybiBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6Tm9Mb2NhbGVTdHJ0b2Qoc3RyLCBlbmRwdHIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9zdHJ0b2QuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vc3RydG9kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmNTQ0YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vc3RydG9kLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgbG9jYWxlLWluZGVwZW5kZW50IHZlcnNpb24gb2Ygc3RydG9kKCksIHVzZWQgdG8gcGFyc2UgZmxvYXRpbmcKKy8vIHBvaW50IGRlZmF1bHQgdmFsdWVzIGluIC5wcm90byBmaWxlcywgd2hlcmUgdGhlIGRlY2ltYWwgc2VwYXJhdG9yCisvLyBpcyBhbHdheXMgYSBkb3QuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lPX1NUUlRPRF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lPX1NUUlRPRF9IX18KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworLy8gQSBsb2NhbGUtaW5kZXBlbmRlbnQgdmVyc2lvbiBvZiB0aGUgc3RhbmRhcmQgc3RydG9kKCksIHdoaWNoIGFsd2F5cworLy8gdXNlcyBhIGRvdCBhcyB0aGUgZGVjaW1hbCBzZXBhcmF0b3IuCitkb3VibGUgTm9Mb2NhbGVTdHJ0b2QoY29uc3QgY2hhciogc3RyLCBjaGFyKiogZW5kcHRyKTsKKworLy8gQ2FzdHMgYSBkb3VibGUgdmFsdWUgdG8gYSBmbG9hdCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIG91dHNpZGUgb2YgdGhlCisvLyByZXByZXNlbnRhYmxlIHJhbmdlIG9mIGZsb2F0LCBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBwb3NpdGl2ZSBvciBuZWdhdGl2ZQorLy8gaW5maW5pdHkuCitmbG9hdCBTYWZlRG91YmxlVG9GbG9hdChkb3VibGUgdmFsdWUpOworCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JT19TVFJUT0RfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZTA3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5jYwpAQCAtMCwwICsxLDEyMzkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBIZXJlIHdlIGhhdmUgYSBoYW5kLXdyaXR0ZW4gbGV4ZXIuICBBdCBmaXJzdCB5b3UgbWlnaHQgYXNrIHlvdXJzZWxmLAorLy8gIkhhbmQtd3JpdHRlbiB0ZXh0IHByb2Nlc3Npbmc/ICBJcyBLZW50b24gY3Jhenk/ISIgIFdlbGwsIGZpcnN0IG9mIGFsbCwKKy8vIHllcyBJIGFtIGNyYXp5LCBidXQgdGhhdCdzIGJlc2lkZSB0aGUgcG9pbnQuICBUaGVyZSBhcmUgYWN0dWFsbHkgcmVhc29ucworLy8gd2h5IEkgZW5kZWQgdXAgd3JpdGluZyB0aGlzIHRoaXMgd2F5LgorLy8KKy8vIFRoZSB0cmFkaXRpb25hbCBhcHByb2FjaCB0byBsZXhpbmcgaXMgdG8gdXNlIGxleCB0byBnZW5lcmF0ZSBhIGxleGVyIGZvcgorLy8geW91LiAgVW5mb3J0dW5hdGVseSwgbGV4J3Mgb3V0cHV0IGlzIHJpZGljdWxvdXNseSB1Z2x5IGFuZCBkaWZmaWN1bHQgdG8KKy8vIGludGVncmF0ZSBjbGVhbmx5IHdpdGggQysrIGNvZGUsIGVzcGVjaWFsbHkgYWJzdHJhY3QgY29kZSBvciBjb2RlIG1lYW50CisvLyBhcyBhIGxpYnJhcnkuICBCZXR0ZXIgcGFyc2VyLWdlbmVyYXRvcnMgZXhpc3QgYnV0IHdvdWxkIGFkZCBkZXBlbmRlbmNpZXMKKy8vIHdoaWNoIG1vc3QgdXNlcnMgd29uJ3QgYWxyZWFkeSBoYXZlLCB3aGljaCB3ZSdkIGxpa2UgdG8gYXZvaWQuICAoR05VIGZsZXgKKy8vIGhhcyBhIEMrKyBvdXRwdXQgb3B0aW9uLCBidXQgaXQncyBzdGlsbCByaWRpY3Vsb3VzbHkgdWdseSwgbm9uLWFic3RyYWN0LAorLy8gYW5kIG5vdCBsaWJyYXJ5LWZyaWVuZGx5LikKKy8vCisvLyBUaGUgbmV4dCBhcHByb2FjaCB0aGF0IGFueSBnb29kIHNvZnR3YXJlIGVuZ2luZWVyIHNob3VsZCBsb29rIGF0IGlzIHRvCisvLyB1c2UgcmVndWxhciBleHByZXNzaW9ucy4gIEFuZCwgaW5kZWVkLCBJIGRpZC4gIEkgaGF2ZSBjb2RlIHdoaWNoCisvLyBpbXBsZW1lbnRzIHRoaXMgc2FtZSBjbGFzcyB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zLiAgSXQncyBhYm91dCAyMDAKKy8vIGxpbmVzIHNob3J0ZXIuICBIb3dldmVyOgorLy8gLSBSYXRoZXIgdGhhbiBlcnJvciBtZXNzYWdlcyB0ZWxsaW5nIHlvdSAiVGhpcyBzdHJpbmcgaGFzIGFuIGludmFsaWQKKy8vICAgZXNjYXBlIHNlcXVlbmNlIGF0IGxpbmUgNSwgY29sdW1uIDQ1IiwgeW91IGdldCBlcnJvciBtZXNzYWdlcyBsaWtlCisvLyAgICJQYXJzZSBlcnJvciBvbiBsaW5lIDUiLiAgR2l2aW5nIG1vcmUgcHJlY2lzZSBlcnJvcnMgcmVxdWlyZXMgYWRkaW5nCisvLyAgIGEgbG90IG9mIGNvZGUgdGhhdCBlbmRzIHVwIGJhc2ljYWxseSBhcyBjb21wbGV4IGFzIHRoZSBoYW5kLWNvZGVkCisvLyAgIHZlcnNpb24gYW55d2F5LgorLy8gLSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGEgc3RyaW5nIGxpdGVyYWwgbG9va3MgbGlrZSB0aGlzOgorLy8gICAgIGtTdHJpbmcgID0gbmV3IFJFKCIoXCIoW15cIlxcXFxdfCIgICAgICAgICAgICAgIC8vIG5vbi1lc2NhcGVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgIlxcXFxbYWJmbnJ0dj9cIidcXFxcMC03XXwiICAgLy8gbm9ybWFsIGVzY2FwZQorLy8gICAgICAgICAgICAgICAgICAgICAgICJcXFxceFswLTlhLWZBLUZdKSpcInwiICAgICAgIC8vIGhleCBlc2NhcGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAiXCcoW15cJ1xcXFxdfCIgICAgICAgIC8vIEFsc28gc3VwcG9ydCBzaW5nbGUtcXVvdGVzLgorLy8gICAgICAgICAgICAgICAgICAgICAgICJcXFxcW2FiZm5ydHY/XCInXFxcXDAtN118IgorLy8gICAgICAgICAgICAgICAgICAgICAgICJcXFxceFswLTlhLWZBLUZdKSpcJykiKTsKKy8vICAgVmVyaWZ5aW5nIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGlzIGxpbmUgbm9pc2UgaXMgYWN0dWFsbHkgaGFyZGVyIHRoYW4KKy8vICAgdmVyaWZ5aW5nIHRoZSBjb3JyZWN0bmVzcyBvZiBDb25zdW1lU3RyaW5nKCksIGRlZmluZWQgYmVsb3cuICBJJ20gbm90CisvLyAgIGV2ZW4gY29uZmlkZW50IHRoYXQgdGhlIGFib3ZlIGlzIGNvcnJlY3QsIGFmdGVyIHN0YXJpbmcgYXQgaXQgZm9yIHNvbWUKKy8vICAgdGltZS4KKy8vIC0gUENSRSBpcyBmYXN0LCBidXQgdGhlcmUncyBzdGlsbCBtb3JlIG92ZXJoZWFkIGludm9sdmVkIHRoYW4gdGhlIGNvZGUKKy8vICAgYmVsb3cuCisvLyAtIFNhZGx5LCByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBub3QgcGFydCBvZiB0aGUgQyBzdGFuZGFyZCBsaWJyYXJ5LCBzbworLy8gICB1c2luZyB0aGVtIHdvdWxkIHJlcXVpcmUgZGVwZW5kaW5nIG9uIHNvbWUgb3RoZXIgbGlicmFyeS4gIEZvciB0aGUKKy8vICAgb3BlbiBzb3VyY2UgcmVsZWFzZSwgdGhpcyBjb3VsZCBiZSByZWFsbHkgYW5ub3lpbmcuICBOb2JvZHkgbGlrZXMKKy8vICAgZG93bmxvYWRpbmcgb25lIHBpZWNlIG9mIHNvZnR3YXJlIGp1c3QgdG8gZmluZCB0aGF0IHRoZXkgbmVlZCB0bworLy8gICBkb3dubG9hZCBzb21ldGhpbmcgZWxzZSB0byBtYWtlIGl0IHdvcmssIGFuZCBpbiBhbGwgbGlrZWxpaG9vZAorLy8gICBwZW9wbGUgZG93bmxvYWRpbmcgUHJvdG9jb2wgQnVmZmVycyB3aWxsIGFscmVhZHkgYmUgZG9pbmcgc28ganVzdAorLy8gICB0byBtYWtlIHNvbWV0aGluZyBlbHNlIHdvcmsuICBXZSBjb3VsZCBpbmNsdWRlIGEgY29weSBvZiBQQ1JFIHdpdGgKKy8vICAgb3VyIGNvZGUsIGJ1dCB0aGF0IG9ibGlnYXRlcyB1cyB0byBrZWVwIGl0IHVwLXRvLWRhdGUgYW5kIGp1c3Qgc2VlbXMKKy8vICAgbGlrZSBhIGJpZyB3YXN0ZSBqdXN0IHRvIHNhdmUgMjAwIGxpbmVzIG9mIGNvZGUuCisvLworLy8gT24gYSBzaW1pbGFyIGJ1dCB1bnJlbGF0ZWQgbm90ZSwgSSdtIGV2ZW4gc2NhcmVkIHRvIHVzZSBjdHlwZS5oLgorLy8gQXBwYXJlbnRseSBmdW5jdGlvbnMgbGlrZSBpc2FscGhhKCkgYXJlIGxvY2FsZS1kZXBlbmRlbnQuICBTbywgaWYgd2UgdXNlZAorLy8gdGhhdCwgdGhlbiBpZiB0aGlzIGNvZGUgaXMgYmVpbmcgY2FsbGVkIGZyb20gc29tZSBwcm9ncmFtIHRoYXQgZG9lc24ndAorLy8gaGF2ZSBpdHMgbG9jYWxlIHNldCB0byAiQyIsIGl0IHdvdWxkIGJlaGF2ZSBzdHJhbmdlbHkuICBXZSBjYW4ndCBqdXN0IHNldAorLy8gdGhlIGxvY2FsZSB0byAiQyIgb3Vyc2VsdmVzIHNpbmNlIHdlIG1pZ2h0IGJyZWFrIHRoZSBjYWxsaW5nIHByb2dyYW0gdGhhdAorLy8gd2F5LCBwYXJ0aWN1bGFybHkgaWYgaXQgaXMgbXVsdGktdGhyZWFkZWQuICBXVEY/ICBTb21lb25lIHBsZWFzZSBsZXQgbWUKKy8vIChLZW50b24pIGtub3cgaWYgSSdtIG1pc3Npbmcgc29tZXRoaW5nIGhlcmUuLi4KKy8vCisvLyBJJ2QgbG92ZSB0byBoZWFyIGFib3V0IG90aGVyIGFsdGVybmF0aXZlcywgdGhvdWdoLCBhcyB0aGlzIGNvZGUgaXNuJ3QKKy8vIGV4YWN0bHkgcHJldHR5LgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworbmFtZXNwYWNlIHsKKworLy8gQXMgbWVudGlvbmVkIGFib3ZlLCBJIGRvbid0IHRydXN0IGN0eXBlLmggZHVlIHRvIHRoZSBwcmVzZW5jZSBvZiAibG9jYWxlcyIuCisvLyBTbywgSSBoYXZlIHdyaXR0ZW4gcmVwbGFjZW1lbnQgZnVuY3Rpb25zIGhlcmUuICBTb21lb25lIHBsZWFzZSBzbWFjayBtZSBpZgorLy8gdGhpcyBpcyBhIGJhZCBpZGVhIG9yIGlmIHRoZXJlIGlzIHNvbWUgd2F5IGFyb3VuZCB0aGlzLgorLy8KKy8vIFRoZXNlICJjaGFyYWN0ZXIgY2xhc3NlcyIgYXJlIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gdGVtcGxhdGUgbWV0aG9kcy4KKy8vIEZvciBpbnN0YW5jZSwgVG9rZW5pemVyOjpDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlPigpIHdpbGwgZWF0CisvLyB3aGl0ZXNwYWNlLgorCisvLyBOb3RlOiAgTm8gY2xhc3MgaXMgYWxsb3dlZCB0byBjb250YWluICdcMCcsIHNpbmNlIHRoaXMgaXMgdXNlZCB0byBtYXJrIGVuZC0KKy8vICAgb2YtaW5wdXQgYW5kIGlzIGhhbmRsZWQgc3BlY2lhbGx5LgorCisjZGVmaW5lIENIQVJBQ1RFUl9DTEFTUyhOQU1FLCBFWFBSRVNTSU9OKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgTkFNRSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGlubGluZSBib29sIEluQ2xhc3MoY2hhciBjKSB7IHJldHVybiBFWFBSRVNTSU9OOyB9IFwKKyAgfQorCitDSEFSQUNURVJfQ0xBU1MoV2hpdGVzcGFjZSwgYyA9PSAnICcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1x0JyB8fCBjID09ICdccicgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnXHYnIHx8IGMgPT0gJ1xmJyk7CitDSEFSQUNURVJfQ0xBU1MoV2hpdGVzcGFjZU5vTmV3bGluZSwKKyAgICAgICAgICAgICAgICBjID09ICcgJyB8fCBjID09ICdcdCcgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1x2JyB8fCBjID09ICdcZicpOworCitDSEFSQUNURVJfQ0xBU1MoVW5wcmludGFibGUsIGM8JyAnICYmIGM+ICdcMCcpOworCitDSEFSQUNURVJfQ0xBU1MoRGlnaXQsICcwJyA8PSBjICYmIGMgPD0gJzknKTsKK0NIQVJBQ1RFUl9DTEFTUyhPY3RhbERpZ2l0LCAnMCcgPD0gYyAmJiBjIDw9ICc3Jyk7CitDSEFSQUNURVJfQ0xBU1MoSGV4RGlnaXQsICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgfHwgKCdhJyA8PSBjICYmIGMgPD0gJ2YnKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdBJyA8PSBjICYmIGMgPD0gJ0YnKSk7CisKK0NIQVJBQ1RFUl9DTEFTUyhMZXR0ZXIsCisgICAgICAgICAgICAgICAgKCdhJyA8PSBjICYmIGMgPD0gJ3onKSB8fCAoJ0EnIDw9IGMgJiYgYyA8PSAnWicpIHx8IChjID09ICdfJykpOworCitDSEFSQUNURVJfQ0xBU1MoQWxwaGFudW1lcmljLCAoJ2EnIDw9IGMgJiYgYyA8PSAneicpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdBJyA8PSBjICYmIGMgPD0gJ1onKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgfHwgKGMgPT0gJ18nKSk7CisKK0NIQVJBQ1RFUl9DTEFTUyhFc2NhcGUsIGMgPT0gJ2EnIHx8IGMgPT0gJ2InIHx8IGMgPT0gJ2YnIHx8IGMgPT0gJ24nIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAncicgfHwgYyA9PSAndCcgfHwgYyA9PSAndicgfHwgYyA9PSAnXFwnIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnPycgfHwgYyA9PSAnXCcnIHx8IGMgPT0gJ1wiJyk7CisKKyN1bmRlZiBDSEFSQUNURVJfQ0xBU1MKKworLy8gR2l2ZW4gYSBjaGFyLCBpbnRlcnByZXQgaXQgYXMgYSBudW1lcmljIGRpZ2l0IGFuZCByZXR1cm4gaXRzIHZhbHVlLgorLy8gVGhpcyBzdXBwb3J0cyBhbnkgbnVtYmVyIGJhc2UgdXAgdG8gMzYuCisvLyBSZXByZXNlbnRzIGludGVnZXIgdmFsdWVzIG9mIGRpZ2l0cy4KKy8vIFVzZXMgMzYgdG8gaW5kaWNhdGUgYW4gaW52YWxpZCBjaGFyYWN0ZXIgc2luY2Ugd2Ugc3VwcG9ydAorLy8gYmFzZXMgdXAgdG8gMzYuCitzdGF0aWMgY29uc3QgaW50OF90IGtBc2NpaVRvSW50WzI1Nl0gPSB7CisgICAgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsICAvLyAwMC0wRgorICAgIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAgLy8gMTAtMUYKKyAgICAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgIC8vICcgJy0nLycKKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICcwJy0nOScKKyAgICAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICc6Jy0nQCcKKyAgICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgIC8vICdBJy0nUCcKKyAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdRJy0nWicKKyAgICAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdbJy0nYCcKKyAgICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgIC8vICdhJy0ncCcKKyAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdxJy0neicKKyAgICAzNiwgMzYsIDM2LCAzNiwgMzYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICd7Jy1ERUwKKyAgICAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgIC8vIDgwLThGCisgICAgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsICAvLyA5MC05RgorICAgIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAgLy8gQTAtQUYKKyAgICAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgIC8vIEIwLUJGCisgICAgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsICAvLyBDMC1DRgorICAgIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAgLy8gRDAtREYKKyAgICAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgIC8vIEUwLUVGCisgICAgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsICAvLyBGMC1GRgorfTsKKworaW5saW5lIGludCBEaWdpdFZhbHVlKGNoYXIgZGlnaXQpIHsgcmV0dXJuIGtBc2NpaVRvSW50W2RpZ2l0ICYgMHhGRl07IH0KKworLy8gSW5saW5lIGJlY2F1c2UgaXQncyBvbmx5IHVzZWQgaW4gb25lIHBsYWNlLgoraW5saW5lIGNoYXIgVHJhbnNsYXRlRXNjYXBlKGNoYXIgYykgeworICBzd2l0Y2ggKGMpIHsKKyAgICBjYXNlICdhJzoKKyAgICAgIHJldHVybiAnXGEnOworICAgIGNhc2UgJ2InOgorICAgICAgcmV0dXJuICdcYic7CisgICAgY2FzZSAnZic6CisgICAgICByZXR1cm4gJ1xmJzsKKyAgICBjYXNlICduJzoKKyAgICAgIHJldHVybiAnXG4nOworICAgIGNhc2UgJ3InOgorICAgICAgcmV0dXJuICdccic7CisgICAgY2FzZSAndCc6CisgICAgICByZXR1cm4gJ1x0JzsKKyAgICBjYXNlICd2JzoKKyAgICAgIHJldHVybiAnXHYnOworICAgIGNhc2UgJ1xcJzoKKyAgICAgIHJldHVybiAnXFwnOworICAgIGNhc2UgJz8nOgorICAgICAgcmV0dXJuICdcPyc7ICAvLyBUcmlncmFwaHMgPSA6KAorICAgIGNhc2UgJ1wnJzoKKyAgICAgIHJldHVybiAnXCcnOworICAgIGNhc2UgJyInOgorICAgICAgcmV0dXJuICdcIic7CisKKyAgICAvLyBXZSBleHBlY3QgZXNjYXBlIHNlcXVlbmNlcyB0byBoYXZlIGJlZW4gdmFsaWRhdGVkIHNlcGFyYXRlbHkuCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAnPyc7CisgIH0KK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitFcnJvckNvbGxlY3Rvcjo6fkVycm9yQ29sbGVjdG9yKCkge30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUb2tlbml6ZXI6OlRva2VuaXplcihaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpCisgICAgOiBpbnB1dF8oaW5wdXQpLAorICAgICAgZXJyb3JfY29sbGVjdG9yXyhlcnJvcl9jb2xsZWN0b3IpLAorICAgICAgYnVmZmVyXyhOVUxMKSwKKyAgICAgIGJ1ZmZlcl9zaXplXygwKSwKKyAgICAgIGJ1ZmZlcl9wb3NfKDApLAorICAgICAgcmVhZF9lcnJvcl8oZmFsc2UpLAorICAgICAgbGluZV8oMCksCisgICAgICBjb2x1bW5fKDApLAorICAgICAgcmVjb3JkX3RhcmdldF8oTlVMTCksCisgICAgICByZWNvcmRfc3RhcnRfKC0xKSwKKyAgICAgIGFsbG93X2ZfYWZ0ZXJfZmxvYXRfKGZhbHNlKSwKKyAgICAgIGNvbW1lbnRfc3R5bGVfKENQUF9DT01NRU5UX1NUWUxFKSwKKyAgICAgIHJlcXVpcmVfc3BhY2VfYWZ0ZXJfbnVtYmVyXyh0cnVlKSwKKyAgICAgIGFsbG93X211bHRpbGluZV9zdHJpbmdzXyhmYWxzZSkgeworICBjdXJyZW50Xy5saW5lID0gMDsKKyAgY3VycmVudF8uY29sdW1uID0gMDsKKyAgY3VycmVudF8uZW5kX2NvbHVtbiA9IDA7CisgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NUQVJUOworCisgIFJlZnJlc2goKTsKK30KKworVG9rZW5pemVyOjp+VG9rZW5pemVyKCkgeworICAvLyBJZiB3ZSBoYWQgYW55IGJ1ZmZlciBsZWZ0IHVucmVhZCwgcmV0dXJuIGl0IHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbQorICAvLyBzbyB0aGF0IHNvbWVvbmUgZWxzZSBjYW4gcmVhZCBpdC4KKyAgaWYgKGJ1ZmZlcl9zaXplXyA+IGJ1ZmZlcl9wb3NfKSB7CisgICAgaW5wdXRfLT5CYWNrVXAoYnVmZmVyX3NpemVfIC0gYnVmZmVyX3Bvc18pOworICB9Cit9CisKK2Jvb2wgVG9rZW5pemVyOjpyZXBvcnRfd2hpdGVzcGFjZSgpIGNvbnN0IHsgcmV0dXJuIHJlcG9ydF93aGl0ZXNwYWNlXzsgfQorLy8gTm90ZTogYHNldF9yZXBvcnRfd2hpdGVzcGFjZShmYWxzZSlgIGltcGxpZXMgYHNldF9yZXBvcnRfbmV3bGluZXMoZmFsc2UpYC4KK3ZvaWQgVG9rZW5pemVyOjpzZXRfcmVwb3J0X3doaXRlc3BhY2UoYm9vbCByZXBvcnQpIHsKKyAgcmVwb3J0X3doaXRlc3BhY2VfID0gcmVwb3J0OworICByZXBvcnRfbmV3bGluZXNfICY9IHJlcG9ydDsKK30KKworLy8gSWYgdHJ1ZSwgbmV3bGluZSB0b2tlbnMgYXJlIHJlcG9ydGVkIGJ5IE5leHQoKS4KK2Jvb2wgVG9rZW5pemVyOjpyZXBvcnRfbmV3bGluZXMoKSBjb25zdCB7IHJldHVybiByZXBvcnRfbmV3bGluZXNfOyB9CisvLyBOb3RlOiBgc2V0X3JlcG9ydF9uZXdsaW5lcyh0cnVlKWAgaW1wbGllcyBgc2V0X3JlcG9ydF93aGl0ZXNwYWNlKHRydWUpYC4KK3ZvaWQgVG9rZW5pemVyOjpzZXRfcmVwb3J0X25ld2xpbmVzKGJvb2wgcmVwb3J0KSB7CisgIHJlcG9ydF9uZXdsaW5lc18gPSByZXBvcnQ7CisgIHJlcG9ydF93aGl0ZXNwYWNlXyB8PSByZXBvcnQ7ICAvLyBlbmFibGUgcmVwb3J0X3doaXRlc3BhY2UgaWYgbmVjZXNzYXJ5Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVybmFsIGhlbHBlcnMuCisKK3ZvaWQgVG9rZW5pemVyOjpOZXh0Q2hhcigpIHsKKyAgLy8gVXBkYXRlIG91ciBsaW5lIGFuZCBjb2x1bW4gY291bnRlcnMgYmFzZWQgb24gdGhlIGNoYXJhY3RlciBiZWluZworICAvLyBjb25zdW1lZC4KKyAgaWYgKGN1cnJlbnRfY2hhcl8gPT0gJ1xuJykgeworICAgICsrbGluZV87CisgICAgY29sdW1uXyA9IDA7CisgIH0gZWxzZSBpZiAoY3VycmVudF9jaGFyXyA9PSAnXHQnKSB7CisgICAgY29sdW1uXyArPSBrVGFiV2lkdGggLSBjb2x1bW5fICUga1RhYldpZHRoOworICB9IGVsc2UgeworICAgICsrY29sdW1uXzsKKyAgfQorCisgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgY2hhcmFjdGVyLgorICArK2J1ZmZlcl9wb3NfOworICBpZiAoYnVmZmVyX3Bvc18gPCBidWZmZXJfc2l6ZV8pIHsKKyAgICBjdXJyZW50X2NoYXJfID0gYnVmZmVyX1tidWZmZXJfcG9zX107CisgIH0gZWxzZSB7CisgICAgUmVmcmVzaCgpOworICB9Cit9CisKK3ZvaWQgVG9rZW5pemVyOjpSZWZyZXNoKCkgeworICBpZiAocmVhZF9lcnJvcl8pIHsKKyAgICBjdXJyZW50X2NoYXJfID0gJ1wwJzsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBJZiB3ZSdyZSBpbiBhIHRva2VuLCBhcHBlbmQgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlciB0byBpdC4KKyAgaWYgKHJlY29yZF90YXJnZXRfICE9IE5VTEwgJiYgcmVjb3JkX3N0YXJ0XyA8IGJ1ZmZlcl9zaXplXykgeworICAgIHJlY29yZF90YXJnZXRfLT5hcHBlbmQoYnVmZmVyXyArIHJlY29yZF9zdGFydF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZV8gLSByZWNvcmRfc3RhcnRfKTsKKyAgICByZWNvcmRfc3RhcnRfID0gMDsKKyAgfQorCisgIGNvbnN0IHZvaWQqIGRhdGEgPSBOVUxMOworICBidWZmZXJfID0gTlVMTDsKKyAgYnVmZmVyX3Bvc18gPSAwOworICBkbyB7CisgICAgaWYgKCFpbnB1dF8tPk5leHQoJmRhdGEsICZidWZmZXJfc2l6ZV8pKSB7CisgICAgICAvLyBlbmQgb2Ygc3RyZWFtIChvciByZWFkIGVycm9yKQorICAgICAgYnVmZmVyX3NpemVfID0gMDsKKyAgICAgIHJlYWRfZXJyb3JfID0gdHJ1ZTsKKyAgICAgIGN1cnJlbnRfY2hhcl8gPSAnXDAnOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSB3aGlsZSAoYnVmZmVyX3NpemVfID09IDApOworCisgIGJ1ZmZlcl8gPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSk7CisKKyAgY3VycmVudF9jaGFyXyA9IGJ1ZmZlcl9bMF07Cit9CisKK2lubGluZSB2b2lkIFRva2VuaXplcjo6UmVjb3JkVG8oc3RkOjpzdHJpbmcqIHRhcmdldCkgeworICByZWNvcmRfdGFyZ2V0XyA9IHRhcmdldDsKKyAgcmVjb3JkX3N0YXJ0XyA9IGJ1ZmZlcl9wb3NfOworfQorCitpbmxpbmUgdm9pZCBUb2tlbml6ZXI6OlN0b3BSZWNvcmRpbmcoKSB7CisgIC8vIE5vdGU6ICBUaGUgaWYoKSBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIFNUTCBpbXBsZW1lbnRhdGlvbnMgY3Jhc2ggd2hlbgorICAvLyAgIHlvdSBjYWxsIHN0cmluZzo6YXBwZW5kKE5VTEwsIDApLCBwcmVzdW1hYmx5IGJlY2F1c2UgdGhleSBhcmUgdHJ5aW5nIHRvCisgIC8vICAgYmUgaGVscGZ1bCBieSBkZXRlY3RpbmcgdGhlIE5VTEwgcG9pbnRlciwgZXZlbiB0aG91Z2ggdGhlcmUncyBub3RoaW5nCisgIC8vICAgd3Jvbmcgd2l0aCByZWFkaW5nIHplcm8gYnl0ZXMgZnJvbSBOVUxMLgorICBpZiAoYnVmZmVyX3Bvc18gIT0gcmVjb3JkX3N0YXJ0XykgeworICAgIHJlY29yZF90YXJnZXRfLT5hcHBlbmQoYnVmZmVyXyArIHJlY29yZF9zdGFydF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfcG9zXyAtIHJlY29yZF9zdGFydF8pOworICB9CisgIHJlY29yZF90YXJnZXRfID0gTlVMTDsKKyAgcmVjb3JkX3N0YXJ0XyA9IC0xOworfQorCitpbmxpbmUgdm9pZCBUb2tlbml6ZXI6OlN0YXJ0VG9rZW4oKSB7CisgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NUQVJUOyAgLy8gSnVzdCBmb3IgdGhlIHNha2Ugb2YgaW5pdGlhbGl6aW5nIGl0LgorICBjdXJyZW50Xy50ZXh0LmNsZWFyKCk7CisgIGN1cnJlbnRfLmxpbmUgPSBsaW5lXzsKKyAgY3VycmVudF8uY29sdW1uID0gY29sdW1uXzsKKyAgUmVjb3JkVG8oJmN1cnJlbnRfLnRleHQpOworfQorCitpbmxpbmUgdm9pZCBUb2tlbml6ZXI6OkVuZFRva2VuKCkgeworICBTdG9wUmVjb3JkaW5nKCk7CisgIGN1cnJlbnRfLmVuZF9jb2x1bW4gPSBjb2x1bW5fOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgbWV0aG9kcyB0aGF0IGNvbnN1bWUgY2hhcmFjdGVycy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJhY3RlckNsYXNzPgoraW5saW5lIGJvb2wgVG9rZW5pemVyOjpMb29raW5nQXQoKSB7CisgIHJldHVybiBDaGFyYWN0ZXJDbGFzczo6SW5DbGFzcyhjdXJyZW50X2NoYXJfKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJhY3RlckNsYXNzPgoraW5saW5lIGJvb2wgVG9rZW5pemVyOjpUcnlDb25zdW1lT25lKCkgeworICBpZiAoQ2hhcmFjdGVyQ2xhc3M6OkluQ2xhc3MoY3VycmVudF9jaGFyXykpIHsKKyAgICBOZXh0Q2hhcigpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitpbmxpbmUgYm9vbCBUb2tlbml6ZXI6OlRyeUNvbnN1bWUoY2hhciBjKSB7CisgIGlmIChjdXJyZW50X2NoYXJfID09IGMpIHsKKyAgICBOZXh0Q2hhcigpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhcmFjdGVyQ2xhc3M+CitpbmxpbmUgdm9pZCBUb2tlbml6ZXI6OkNvbnN1bWVaZXJvT3JNb3JlKCkgeworICB3aGlsZSAoQ2hhcmFjdGVyQ2xhc3M6OkluQ2xhc3MoY3VycmVudF9jaGFyXykpIHsKKyAgICBOZXh0Q2hhcigpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KK2lubGluZSB2b2lkIFRva2VuaXplcjo6Q29uc3VtZU9uZU9yTW9yZShjb25zdCBjaGFyKiBlcnJvcikgeworICBpZiAoIUNoYXJhY3RlckNsYXNzOjpJbkNsYXNzKGN1cnJlbnRfY2hhcl8pKSB7CisgICAgQWRkRXJyb3IoZXJyb3IpOworICB9IGVsc2UgeworICAgIGRvIHsKKyAgICAgIE5leHRDaGFyKCk7CisgICAgfSB3aGlsZSAoQ2hhcmFjdGVyQ2xhc3M6OkluQ2xhc3MoY3VycmVudF9jaGFyXykpOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1ldGhvZHMgdGhhdCByZWFkIHdob2xlIHBhdHRlcm5zIG1hdGNoaW5nIGNlcnRhaW4ga2luZHMgb2YgdG9rZW5zCisvLyBvciBjb21tZW50cy4KKwordm9pZCBUb2tlbml6ZXI6OkNvbnN1bWVTdHJpbmcoY2hhciBkZWxpbWl0ZXIpIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzd2l0Y2ggKGN1cnJlbnRfY2hhcl8pIHsKKyAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgQWRkRXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIHN0cmluZy4iKTsKKyAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlICdcbic6IHsKKyAgICAgICAgaWYgKCFhbGxvd19tdWx0aWxpbmVfc3RyaW5nc18pIHsKKyAgICAgICAgICBBZGRFcnJvcigiU3RyaW5nIGxpdGVyYWxzIGNhbm5vdCBjcm9zcyBsaW5lIGJvdW5kYXJpZXMuIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE5leHRDaGFyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlICdcXCc6IHsKKyAgICAgICAgLy8gQW4gZXNjYXBlIHNlcXVlbmNlLgorICAgICAgICBOZXh0Q2hhcigpOworICAgICAgICBpZiAoVHJ5Q29uc3VtZU9uZTxFc2NhcGU+KCkpIHsKKyAgICAgICAgICAvLyBWYWxpZCBlc2NhcGUgc2VxdWVuY2UuCisgICAgICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZU9uZTxPY3RhbERpZ2l0PigpKSB7CisgICAgICAgICAgLy8gUG9zc2libHkgZm9sbG93ZWQgYnkgdHdvIG1vcmUgb2N0YWwgZGlnaXRzLCBidXQgdGhlc2Ugd2lsbAorICAgICAgICAgIC8vIGp1c3QgYmUgY29uc3VtZWQgYnkgdGhlIG1haW4gbG9vcCBhbnl3YXkgc28gd2UgZG9uJ3QgbmVlZAorICAgICAgICAgIC8vIHRvIGRvIHNvIGV4cGxpY2l0bHkgaGVyZS4KKyAgICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCd4JykpIHsKKyAgICAgICAgICBpZiAoIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkpIHsKKyAgICAgICAgICAgIEFkZEVycm9yKCJFeHBlY3RlZCBoZXggZGlnaXRzIGZvciBlc2NhcGUgc2VxdWVuY2UuIik7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIFBvc3NpYmx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgaGV4IGRpZ2l0LCBidXQgYWdhaW4gd2UgZG9uJ3QgY2FyZS4KKyAgICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCd1JykpIHsKKyAgICAgICAgICBpZiAoIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkgfHwgIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkgfHwKKyAgICAgICAgICAgICAgIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkgfHwgIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkpIHsKKyAgICAgICAgICAgIEFkZEVycm9yKCJFeHBlY3RlZCBmb3VyIGhleCBkaWdpdHMgZm9yIFxcdSBlc2NhcGUgc2VxdWVuY2UuIik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJ1UnKSkgeworICAgICAgICAgIC8vIFdlIGV4cGVjdCA4IGhleCBkaWdpdHM7IGJ1dCBvbmx5IHRoZSByYW5nZSB1cCB0byAweDEwZmZmZiBpcworICAgICAgICAgIC8vIGxlZ2FsLgorICAgICAgICAgIGlmICghVHJ5Q29uc3VtZSgnMCcpIHx8ICFUcnlDb25zdW1lKCcwJykgfHwKKyAgICAgICAgICAgICAgIShUcnlDb25zdW1lKCcwJykgfHwgVHJ5Q29uc3VtZSgnMScpKSB8fAorICAgICAgICAgICAgICAhVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSB8fCAhVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSB8fAorICAgICAgICAgICAgICAhVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSB8fCAhVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSB8fAorICAgICAgICAgICAgICAhVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSkgeworICAgICAgICAgICAgQWRkRXJyb3IoCisgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGVpZ2h0IGhleCBkaWdpdHMgdXAgdG8gMTBmZmZmIGZvciBcXFUgZXNjYXBlICIKKyAgICAgICAgICAgICAgICAic2VxdWVuY2UiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQWRkRXJyb3IoIkludmFsaWQgZXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZyBsaXRlcmFsLiIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIGlmIChjdXJyZW50X2NoYXJfID09IGRlbGltaXRlcikgeworICAgICAgICAgIE5leHRDaGFyKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE5leHRDaGFyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitUb2tlbml6ZXI6OlRva2VuVHlwZSBUb2tlbml6ZXI6OkNvbnN1bWVOdW1iZXIoYm9vbCBzdGFydGVkX3dpdGhfemVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0YXJ0ZWRfd2l0aF9kb3QpIHsKKyAgYm9vbCBpc19mbG9hdCA9IGZhbHNlOworCisgIGlmIChzdGFydGVkX3dpdGhfemVybyAmJiAoVHJ5Q29uc3VtZSgneCcpIHx8IFRyeUNvbnN1bWUoJ1gnKSkpIHsKKyAgICAvLyBBIGhleCBudW1iZXIgKHN0YXJ0ZWQgd2l0aCAiMHgiKS4KKyAgICBDb25zdW1lT25lT3JNb3JlPEhleERpZ2l0PigiXCIweFwiIG11c3QgYmUgZm9sbG93ZWQgYnkgaGV4IGRpZ2l0cy4iKTsKKworICB9IGVsc2UgaWYgKHN0YXJ0ZWRfd2l0aF96ZXJvICYmIExvb2tpbmdBdDxEaWdpdD4oKSkgeworICAgIC8vIEFuIG9jdGFsIG51bWJlciAoaGFkIGEgbGVhZGluZyB6ZXJvKS4KKyAgICBDb25zdW1lWmVyb09yTW9yZTxPY3RhbERpZ2l0PigpOworICAgIGlmIChMb29raW5nQXQ8RGlnaXQ+KCkpIHsKKyAgICAgIEFkZEVycm9yKCJOdW1iZXJzIHN0YXJ0aW5nIHdpdGggbGVhZGluZyB6ZXJvIG11c3QgYmUgaW4gb2N0YWwuIik7CisgICAgICBDb25zdW1lWmVyb09yTW9yZTxEaWdpdD4oKTsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICAvLyBBIGRlY2ltYWwgbnVtYmVyLgorICAgIGlmIChzdGFydGVkX3dpdGhfZG90KSB7CisgICAgICBpc19mbG9hdCA9IHRydWU7CisgICAgICBDb25zdW1lWmVyb09yTW9yZTxEaWdpdD4oKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29uc3VtZVplcm9Pck1vcmU8RGlnaXQ+KCk7CisKKyAgICAgIGlmIChUcnlDb25zdW1lKCcuJykpIHsKKyAgICAgICAgaXNfZmxvYXQgPSB0cnVlOworICAgICAgICBDb25zdW1lWmVyb09yTW9yZTxEaWdpdD4oKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoVHJ5Q29uc3VtZSgnZScpIHx8IFRyeUNvbnN1bWUoJ0UnKSkgeworICAgICAgaXNfZmxvYXQgPSB0cnVlOworICAgICAgVHJ5Q29uc3VtZSgnLScpIHx8IFRyeUNvbnN1bWUoJysnKTsKKyAgICAgIENvbnN1bWVPbmVPck1vcmU8RGlnaXQ+KCJcImVcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGV4cG9uZW50LiIpOworICAgIH0KKworICAgIGlmIChhbGxvd19mX2FmdGVyX2Zsb2F0XyAmJiAoVHJ5Q29uc3VtZSgnZicpIHx8IFRyeUNvbnN1bWUoJ0YnKSkpIHsKKyAgICAgIGlzX2Zsb2F0ID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAoTG9va2luZ0F0PExldHRlcj4oKSAmJiByZXF1aXJlX3NwYWNlX2FmdGVyX251bWJlcl8pIHsKKyAgICBBZGRFcnJvcigiTmVlZCBzcGFjZSBiZXR3ZWVuIG51bWJlciBhbmQgaWRlbnRpZmllci4iKTsKKyAgfSBlbHNlIGlmIChjdXJyZW50X2NoYXJfID09ICcuJykgeworICAgIGlmIChpc19mbG9hdCkgeworICAgICAgQWRkRXJyb3IoCisgICAgICAgICAgIkFscmVhZHkgc2F3IGRlY2ltYWwgcG9pbnQgb3IgZXhwb25lbnQ7IGNhbid0IGhhdmUgYW5vdGhlciBvbmUuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZEVycm9yKCJIZXggYW5kIG9jdGFsIG51bWJlcnMgbXVzdCBiZSBpbnRlZ2Vycy4iKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gaXNfZmxvYXQgPyBUWVBFX0ZMT0FUIDogVFlQRV9JTlRFR0VSOworfQorCit2b2lkIFRva2VuaXplcjo6Q29uc3VtZUxpbmVDb21tZW50KHN0ZDo6c3RyaW5nKiBjb250ZW50KSB7CisgIGlmIChjb250ZW50ICE9IE5VTEwpIFJlY29yZFRvKGNvbnRlbnQpOworCisgIHdoaWxlIChjdXJyZW50X2NoYXJfICE9ICdcMCcgJiYgY3VycmVudF9jaGFyXyAhPSAnXG4nKSB7CisgICAgTmV4dENoYXIoKTsKKyAgfQorICBUcnlDb25zdW1lKCdcbicpOworCisgIGlmIChjb250ZW50ICE9IE5VTEwpIFN0b3BSZWNvcmRpbmcoKTsKK30KKwordm9pZCBUb2tlbml6ZXI6OkNvbnN1bWVCbG9ja0NvbW1lbnQoc3RkOjpzdHJpbmcqIGNvbnRlbnQpIHsKKyAgaW50IHN0YXJ0X2xpbmUgPSBsaW5lXzsKKyAgaW50IHN0YXJ0X2NvbHVtbiA9IGNvbHVtbl8gLSAyOworCisgIGlmIChjb250ZW50ICE9IE5VTEwpIFJlY29yZFRvKGNvbnRlbnQpOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgd2hpbGUgKGN1cnJlbnRfY2hhcl8gIT0gJ1wwJyAmJiBjdXJyZW50X2NoYXJfICE9ICcqJyAmJgorICAgICAgICAgICBjdXJyZW50X2NoYXJfICE9ICcvJyAmJiBjdXJyZW50X2NoYXJfICE9ICdcbicpIHsKKyAgICAgIE5leHRDaGFyKCk7CisgICAgfQorCisgICAgaWYgKFRyeUNvbnN1bWUoJ1xuJykpIHsKKyAgICAgIGlmIChjb250ZW50ICE9IE5VTEwpIFN0b3BSZWNvcmRpbmcoKTsKKworICAgICAgLy8gQ29uc3VtZSBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGFzdGVyaXNrOworICAgICAgQ29uc3VtZVplcm9Pck1vcmU8V2hpdGVzcGFjZU5vTmV3bGluZT4oKTsKKyAgICAgIGlmIChUcnlDb25zdW1lKCcqJykpIHsKKyAgICAgICAgaWYgKFRyeUNvbnN1bWUoJy8nKSkgeworICAgICAgICAgIC8vIEVuZCBvZiBjb21tZW50LgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChjb250ZW50ICE9IE5VTEwpIFJlY29yZFRvKGNvbnRlbnQpOworICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgnKicpICYmIFRyeUNvbnN1bWUoJy8nKSkgeworICAgICAgLy8gRW5kIG9mIGNvbW1lbnQuCisgICAgICBpZiAoY29udGVudCAhPSBOVUxMKSB7CisgICAgICAgIFN0b3BSZWNvcmRpbmcoKTsKKyAgICAgICAgLy8gU3RyaXAgdHJhaWxpbmcgIiovIi4KKyAgICAgICAgY29udGVudC0+ZXJhc2UoY29udGVudC0+c2l6ZSgpIC0gMik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJy8nKSAmJiBjdXJyZW50X2NoYXJfID09ICcqJykgeworICAgICAgLy8gTm90ZTogIFdlIGRpZG4ndCBjb25zdW1lIHRoZSAnKicgYmVjYXVzZSBpZiB0aGVyZSBpcyBhICcvJyBhZnRlciBpdAorICAgICAgLy8gICB3ZSB3YW50IHRvIGludGVycHJldCB0aGF0IGFzIHRoZSBlbmQgb2YgdGhlIGNvbW1lbnQuCisgICAgICBBZGRFcnJvcigKKyAgICAgICAgICAiXCIvKlwiIGluc2lkZSBibG9jayBjb21tZW50LiAgQmxvY2sgY29tbWVudHMgY2Fubm90IGJlIG5lc3RlZC4iKTsKKyAgICB9IGVsc2UgaWYgKGN1cnJlbnRfY2hhcl8gPT0gJ1wwJykgeworICAgICAgQWRkRXJyb3IoIkVuZC1vZi1maWxlIGluc2lkZSBibG9jayBjb21tZW50LiIpOworICAgICAgZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3Ioc3RhcnRfbGluZSwgc3RhcnRfY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQ29tbWVudCBzdGFydGVkIGhlcmUuIik7CisgICAgICBpZiAoY29udGVudCAhPSBOVUxMKSBTdG9wUmVjb3JkaW5nKCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworVG9rZW5pemVyOjpOZXh0Q29tbWVudFN0YXR1cyBUb2tlbml6ZXI6OlRyeUNvbnN1bWVDb21tZW50U3RhcnQoKSB7CisgIGlmIChjb21tZW50X3N0eWxlXyA9PSBDUFBfQ09NTUVOVF9TVFlMRSAmJiBUcnlDb25zdW1lKCcvJykpIHsKKyAgICBpZiAoVHJ5Q29uc3VtZSgnLycpKSB7CisgICAgICByZXR1cm4gTElORV9DT01NRU5UOworICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgnKicpKSB7CisgICAgICByZXR1cm4gQkxPQ0tfQ09NTUVOVDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gT29wcywgaXQgd2FzIGp1c3QgYSBzbGFzaC4gIFJldHVybiBpdC4KKyAgICAgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NZTUJPTDsKKyAgICAgIGN1cnJlbnRfLnRleHQgPSAiLyI7CisgICAgICBjdXJyZW50Xy5saW5lID0gbGluZV87CisgICAgICBjdXJyZW50Xy5jb2x1bW4gPSBjb2x1bW5fIC0gMTsKKyAgICAgIGN1cnJlbnRfLmVuZF9jb2x1bW4gPSBjb2x1bW5fOworICAgICAgcmV0dXJuIFNMQVNIX05PVF9DT01NRU5UOworICAgIH0KKyAgfSBlbHNlIGlmIChjb21tZW50X3N0eWxlXyA9PSBTSF9DT01NRU5UX1NUWUxFICYmIFRyeUNvbnN1bWUoJyMnKSkgeworICAgIHJldHVybiBMSU5FX0NPTU1FTlQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5PX0NPTU1FTlQ7CisgIH0KK30KKworYm9vbCBUb2tlbml6ZXI6OlRyeUNvbnN1bWVXaGl0ZXNwYWNlKCkgeworICBpZiAocmVwb3J0X25ld2xpbmVzXykgeworICAgIGlmIChUcnlDb25zdW1lT25lPFdoaXRlc3BhY2VOb05ld2xpbmU+KCkpIHsKKyAgICAgIENvbnN1bWVaZXJvT3JNb3JlPFdoaXRlc3BhY2VOb05ld2xpbmU+KCk7CisgICAgICBjdXJyZW50Xy50eXBlID0gVFlQRV9XSElURVNQQUNFOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoVHJ5Q29uc3VtZU9uZTxXaGl0ZXNwYWNlPigpKSB7CisgICAgQ29uc3VtZVplcm9Pck1vcmU8V2hpdGVzcGFjZT4oKTsKKyAgICBjdXJyZW50Xy50eXBlID0gVFlQRV9XSElURVNQQUNFOworICAgIHJldHVybiByZXBvcnRfd2hpdGVzcGFjZV87CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRva2VuaXplcjo6VHJ5Q29uc3VtZU5ld2xpbmUoKSB7CisgIGlmICghcmVwb3J0X3doaXRlc3BhY2VfIHx8ICFyZXBvcnRfbmV3bGluZXNfKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChUcnlDb25zdW1lKCdcbicpKSB7CisgICAgY3VycmVudF8udHlwZSA9IFRZUEVfTkVXTElORTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYm9vbCBUb2tlbml6ZXI6Ok5leHQoKSB7CisgIHByZXZpb3VzXyA9IGN1cnJlbnRfOworCisgIHdoaWxlICghcmVhZF9lcnJvcl8pIHsKKyAgICBTdGFydFRva2VuKCk7CisgICAgYm9vbCByZXBvcnRfdG9rZW4gPSBUcnlDb25zdW1lV2hpdGVzcGFjZSgpIHx8IFRyeUNvbnN1bWVOZXdsaW5lKCk7CisgICAgRW5kVG9rZW4oKTsKKyAgICBpZiAocmVwb3J0X3Rva2VuKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKFRyeUNvbnN1bWVDb21tZW50U3RhcnQoKSkgeworICAgICAgY2FzZSBMSU5FX0NPTU1FTlQ6CisgICAgICAgIENvbnN1bWVMaW5lQ29tbWVudChOVUxMKTsKKyAgICAgICAgY29udGludWU7CisgICAgICBjYXNlIEJMT0NLX0NPTU1FTlQ6CisgICAgICAgIENvbnN1bWVCbG9ja0NvbW1lbnQoTlVMTCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgY2FzZSBTTEFTSF9OT1RfQ09NTUVOVDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlIE5PX0NPTU1FTlQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciBFT0YgYmVmb3JlIGNvbnRpbnVpbmcuCisgICAgaWYgKHJlYWRfZXJyb3JfKSBicmVhazsKKworICAgIGlmIChMb29raW5nQXQ8VW5wcmludGFibGU+KCkgfHwgY3VycmVudF9jaGFyXyA9PSAnXDAnKSB7CisgICAgICBBZGRFcnJvcigiSW52YWxpZCBjb250cm9sIGNoYXJhY3RlcnMgZW5jb3VudGVyZWQgaW4gdGV4dC4iKTsKKyAgICAgIE5leHRDaGFyKCk7CisgICAgICAvLyBTa2lwIG1vcmUgdW5wcmludGFibGUgY2hhcmFjdGVycywgdG9vLiAgQnV0LCByZW1lbWJlciB0aGF0ICdcMCcgaXMKKyAgICAgIC8vIGFsc28gd2hhdCBjdXJyZW50X2NoYXJfIGlzIHNldCB0byBhZnRlciBFT0YgLyByZWFkIGVycm9yLiAgV2UgaGF2ZQorICAgICAgLy8gdG8gYmUgY2FyZWZ1bCBub3QgdG8gZ28gaW50byBhbiBpbmZpbml0ZSBsb29wIG9mIHRyeWluZyB0byBjb25zdW1lCisgICAgICAvLyBpdCwgc28gbWFrZSBzdXJlIHRvIGNoZWNrIHJlYWRfZXJyb3JfIGV4cGxpY2l0bHkgYmVmb3JlIGNvbnN1bWluZworICAgICAgLy8gJ1wwJy4KKyAgICAgIHdoaWxlIChUcnlDb25zdW1lT25lPFVucHJpbnRhYmxlPigpIHx8CisgICAgICAgICAgICAgKCFyZWFkX2Vycm9yXyAmJiBUcnlDb25zdW1lKCdcMCcpKSkgeworICAgICAgICAvLyBJZ25vcmUuCisgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgLy8gUmVhZGluZyBzb21lIHNvcnQgb2YgdG9rZW4uCisgICAgICBTdGFydFRva2VuKCk7CisKKyAgICAgIGlmIChUcnlDb25zdW1lT25lPExldHRlcj4oKSkgeworICAgICAgICBDb25zdW1lWmVyb09yTW9yZTxBbHBoYW51bWVyaWM+KCk7CisgICAgICAgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX0lERU5USUZJRVI7CisgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJzAnKSkgeworICAgICAgICBjdXJyZW50Xy50eXBlID0gQ29uc3VtZU51bWJlcih0cnVlLCBmYWxzZSk7CisgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJy4nKSkgeworICAgICAgICAvLyBUaGlzIGNvdWxkIGJlIHRoZSBiZWdpbm5pbmcgb2YgYSBmbG9hdGluZy1wb2ludCBudW1iZXIsIG9yIGl0IGNvdWxkCisgICAgICAgIC8vIGp1c3QgYmUgYSAnLicgc3ltYm9sLgorCisgICAgICAgIGlmIChUcnlDb25zdW1lT25lPERpZ2l0PigpKSB7CisgICAgICAgICAgLy8gSXQncyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgICAgICAgICBpZiAocHJldmlvdXNfLnR5cGUgPT0gVFlQRV9JREVOVElGSUVSICYmCisgICAgICAgICAgICAgIGN1cnJlbnRfLmxpbmUgPT0gcHJldmlvdXNfLmxpbmUgJiYKKyAgICAgICAgICAgICAgY3VycmVudF8uY29sdW1uID09IHByZXZpb3VzXy5lbmRfY29sdW1uKSB7CisgICAgICAgICAgICAvLyBXZSBkb24ndCBhY2NlcHQgc3ludGF4IGxpa2UgImJsYWguMTIzIi4KKyAgICAgICAgICAgIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKAorICAgICAgICAgICAgICAgIGxpbmVfLCBjb2x1bW5fIC0gMiwKKyAgICAgICAgICAgICAgICAiTmVlZCBzcGFjZSBiZXR3ZWVuIGlkZW50aWZpZXIgYW5kIGRlY2ltYWwgcG9pbnQuIik7CisgICAgICAgICAgfQorICAgICAgICAgIGN1cnJlbnRfLnR5cGUgPSBDb25zdW1lTnVtYmVyKGZhbHNlLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjdXJyZW50Xy50eXBlID0gVFlQRV9TWU1CT0w7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZU9uZTxEaWdpdD4oKSkgeworICAgICAgICBjdXJyZW50Xy50eXBlID0gQ29uc3VtZU51bWJlcihmYWxzZSwgZmFsc2UpOworICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCdcIicpKSB7CisgICAgICAgIENvbnN1bWVTdHJpbmcoJ1wiJyk7CisgICAgICAgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NUUklORzsKKyAgICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgnXCcnKSkgeworICAgICAgICBDb25zdW1lU3RyaW5nKCdcJycpOworICAgICAgICBjdXJyZW50Xy50eXBlID0gVFlQRV9TVFJJTkc7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgaGlnaCBvcmRlciBiaXQgaXMgc2V0LgorICAgICAgICBpZiAoY3VycmVudF9jaGFyXyAmIDB4ODApIHsKKyAgICAgICAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcigKKyAgICAgICAgICAgICAgbGluZV8sIGNvbHVtbl8sCisgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiSW50ZXJwcmV0aW5nIG5vbiBhc2NpaSBjb2RlcG9pbnQgJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGN1cnJlbnRfY2hhcl8pKSk7CisgICAgICAgIH0KKyAgICAgICAgTmV4dENoYXIoKTsKKyAgICAgICAgY3VycmVudF8udHlwZSA9IFRZUEVfU1lNQk9MOworICAgICAgfQorCisgICAgICBFbmRUb2tlbigpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgLy8gRU9GCisgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX0VORDsKKyAgY3VycmVudF8udGV4dC5jbGVhcigpOworICBjdXJyZW50Xy5saW5lID0gbGluZV87CisgIGN1cnJlbnRfLmNvbHVtbiA9IGNvbHVtbl87CisgIGN1cnJlbnRfLmVuZF9jb2x1bW4gPSBjb2x1bW5fOworICByZXR1cm4gZmFsc2U7Cit9CisKK25hbWVzcGFjZSB7CisKKy8vIEhlbHBlciBjbGFzcyBmb3IgY29sbGVjdGluZyBjb21tZW50cyBhbmQgcHV0dGluZyB0aGVtIGluIHRoZSByaWdodCBwbGFjZXMuCisvLworLy8gVGhpcyBiYXNpY2FsbHkganVzdCBidWZmZXJzIHRoZSBtb3N0IHJlY2VudCBjb21tZW50IHVudGlsIGl0IGNhbiBiZSBkZWNpZGVkCisvLyBleGFjdGx5IHdoZXJlIHRoYXQgY29tbWVudCBzaG91bGQgYmUgcGxhY2VkLiAgV2hlbiBGbHVzaCgpIGlzIGNhbGxlZCwgdGhlCisvLyBjdXJyZW50IGNvbW1lbnQgZ29lcyBpbnRvIGVpdGhlciBwcmV2X3RyYWlsaW5nX2NvbW1lbnRzIG9yIGRldGFjaGVkX2NvbW1lbnRzLgorLy8gV2hlbiB0aGUgQ29tbWVudENvbGxlY3RvciBpcyBkZXN0cm95ZWQsIHRoZSBsYXN0IGJ1ZmZlcmVkIGNvbW1lbnQgZ29lcyBpbnRvCisvLyBuZXh0X2xlYWRpbmdfY29tbWVudHMuCitjbGFzcyBDb21tZW50Q29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIENvbW1lbnRDb2xsZWN0b3Ioc3RkOjpzdHJpbmcqIHByZXZfdHJhaWxpbmdfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBkZXRhY2hlZF9jb21tZW50cywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbmV4dF9sZWFkaW5nX2NvbW1lbnRzKQorICAgICAgOiBwcmV2X3RyYWlsaW5nX2NvbW1lbnRzXyhwcmV2X3RyYWlsaW5nX2NvbW1lbnRzKSwKKyAgICAgICAgZGV0YWNoZWRfY29tbWVudHNfKGRldGFjaGVkX2NvbW1lbnRzKSwKKyAgICAgICAgbmV4dF9sZWFkaW5nX2NvbW1lbnRzXyhuZXh0X2xlYWRpbmdfY29tbWVudHMpLAorICAgICAgICBoYXNfY29tbWVudF8oZmFsc2UpLAorICAgICAgICBpc19saW5lX2NvbW1lbnRfKGZhbHNlKSwKKyAgICAgICAgY2FuX2F0dGFjaF90b19wcmV2Xyh0cnVlKSB7CisgICAgaWYgKHByZXZfdHJhaWxpbmdfY29tbWVudHMgIT0gTlVMTCkgcHJldl90cmFpbGluZ19jb21tZW50cy0+Y2xlYXIoKTsKKyAgICBpZiAoZGV0YWNoZWRfY29tbWVudHMgIT0gTlVMTCkgZGV0YWNoZWRfY29tbWVudHMtPmNsZWFyKCk7CisgICAgaWYgKG5leHRfbGVhZGluZ19jb21tZW50cyAhPSBOVUxMKSBuZXh0X2xlYWRpbmdfY29tbWVudHMtPmNsZWFyKCk7CisgIH0KKworICB+Q29tbWVudENvbGxlY3RvcigpIHsKKyAgICAvLyBXaGF0ZXZlciBpcyBpbiB0aGUgYnVmZmVyIGlzIGEgbGVhZGluZyBjb21tZW50LgorICAgIGlmIChuZXh0X2xlYWRpbmdfY29tbWVudHNfICE9IE5VTEwgJiYgaGFzX2NvbW1lbnRfKSB7CisgICAgICBjb21tZW50X2J1ZmZlcl8uc3dhcCgqbmV4dF9sZWFkaW5nX2NvbW1lbnRzXyk7CisgICAgfQorICB9CisKKyAgLy8gQWJvdXQgdG8gcmVhZCBhIGxpbmUgY29tbWVudC4gIEdldCB0aGUgY29tbWVudCBidWZmZXIgcG9pbnRlciBpbiBvcmRlciB0bworICAvLyByZWFkIGludG8gaXQuCisgIHN0ZDo6c3RyaW5nKiBHZXRCdWZmZXJGb3JMaW5lQ29tbWVudCgpIHsKKyAgICAvLyBXZSB3YW50IHRvIGNvbWJpbmUgd2l0aCBwcmV2aW91cyBsaW5lIGNvbW1lbnRzLCBidXQgbm90IGJsb2NrIGNvbW1lbnRzLgorICAgIGlmIChoYXNfY29tbWVudF8gJiYgIWlzX2xpbmVfY29tbWVudF8pIHsKKyAgICAgIEZsdXNoKCk7CisgICAgfQorICAgIGhhc19jb21tZW50XyA9IHRydWU7CisgICAgaXNfbGluZV9jb21tZW50XyA9IHRydWU7CisgICAgcmV0dXJuICZjb21tZW50X2J1ZmZlcl87CisgIH0KKworICAvLyBBYm91dCB0byByZWFkIGEgYmxvY2sgY29tbWVudC4gIEdldCB0aGUgY29tbWVudCBidWZmZXIgcG9pbnRlciBpbiBvcmRlciB0bworICAvLyByZWFkIGludG8gaXQuCisgIHN0ZDo6c3RyaW5nKiBHZXRCdWZmZXJGb3JCbG9ja0NvbW1lbnQoKSB7CisgICAgaWYgKGhhc19jb21tZW50XykgeworICAgICAgRmx1c2goKTsKKyAgICB9CisgICAgaGFzX2NvbW1lbnRfID0gdHJ1ZTsKKyAgICBpc19saW5lX2NvbW1lbnRfID0gZmFsc2U7CisgICAgcmV0dXJuICZjb21tZW50X2J1ZmZlcl87CisgIH0KKworICB2b2lkIENsZWFyQnVmZmVyKCkgeworICAgIGNvbW1lbnRfYnVmZmVyXy5jbGVhcigpOworICAgIGhhc19jb21tZW50XyA9IGZhbHNlOworICB9CisKKyAgLy8gQ2FsbGVkIG9uY2Ugd2Uga25vdyB0aGF0IHRoZSBjb21tZW50IGJ1ZmZlciBpcyBjb21wbGV0ZSBhbmQgaXMgKm5vdCoKKyAgLy8gY29ubmVjdGVkIHRvIHRoZSBuZXh0IHRva2VuLgorICB2b2lkIEZsdXNoKCkgeworICAgIGlmIChoYXNfY29tbWVudF8pIHsKKyAgICAgIGlmIChjYW5fYXR0YWNoX3RvX3ByZXZfKSB7CisgICAgICAgIGlmIChwcmV2X3RyYWlsaW5nX2NvbW1lbnRzXyAhPSBOVUxMKSB7CisgICAgICAgICAgcHJldl90cmFpbGluZ19jb21tZW50c18tPmFwcGVuZChjb21tZW50X2J1ZmZlcl8pOworICAgICAgICB9CisgICAgICAgIGNhbl9hdHRhY2hfdG9fcHJldl8gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkZXRhY2hlZF9jb21tZW50c18gIT0gTlVMTCkgeworICAgICAgICAgIGRldGFjaGVkX2NvbW1lbnRzXy0+cHVzaF9iYWNrKGNvbW1lbnRfYnVmZmVyXyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIENsZWFyQnVmZmVyKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBEZXRhY2hGcm9tUHJldigpIHsgY2FuX2F0dGFjaF90b19wcmV2XyA9IGZhbHNlOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyogcHJldl90cmFpbGluZ19jb21tZW50c187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogZGV0YWNoZWRfY29tbWVudHNfOworICBzdGQ6OnN0cmluZyogbmV4dF9sZWFkaW5nX2NvbW1lbnRzXzsKKworICBzdGQ6OnN0cmluZyBjb21tZW50X2J1ZmZlcl87CisKKyAgLy8gVHJ1ZSBpZiBhbnkgY29tbWVudHMgd2VyZSByZWFkIGludG8gY29tbWVudF9idWZmZXJfLiAgVGhpcyBjYW4gYmUgdHJ1ZSBldmVuCisgIC8vIGlmIGNvbW1lbnRfYnVmZmVyXyBpcyBlbXB0eSwgbmFtZWx5IGlmIHRoZSBjb21tZW50IHdhcyAiLyoqLyIuCisgIGJvb2wgaGFzX2NvbW1lbnRfOworCisgIC8vIElzIHRoZSBjb21tZW50IGluIHRoZSBjb21tZW50IGJ1ZmZlciBhIGxpbmUgY29tbWVudD8KKyAgYm9vbCBpc19saW5lX2NvbW1lbnRfOworCisgIC8vIElzIGl0IHN0aWxsIHBvc3NpYmxlIHRoYXQgd2UgY291bGQgYmUgcmVhZGluZyBhIGNvbW1lbnQgYXR0YWNoZWQgdG8gdGhlCisgIC8vIHByZXZpb3VzIHRva2VuPworICBib29sIGNhbl9hdHRhY2hfdG9fcHJldl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworYm9vbCBUb2tlbml6ZXI6Ok5leHRXaXRoQ29tbWVudHMoc3RkOjpzdHJpbmcqIHByZXZfdHJhaWxpbmdfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGRldGFjaGVkX2NvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG5leHRfbGVhZGluZ19jb21tZW50cykgeworICBDb21tZW50Q29sbGVjdG9yIGNvbGxlY3RvcihwcmV2X3RyYWlsaW5nX2NvbW1lbnRzLCBkZXRhY2hlZF9jb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9sZWFkaW5nX2NvbW1lbnRzKTsKKworICBpZiAoY3VycmVudF8udHlwZSA9PSBUWVBFX1NUQVJUKSB7CisgICAgLy8gSWdub3JlIHVuaWNvZGUgYnl0ZSBvcmRlciBtYXJrKEJPTSkgaWYgaXQgYXBwZWFycyBhdCB0aGUgZmlsZQorICAgIC8vIGJlZ2lubmluZy4gT25seSBVVEYtOCBCT00gKDB4RUYgMHhCQiAweEJGKSBpcyBhY2NlcHRlZC4KKyAgICBpZiAoVHJ5Q29uc3VtZShzdGF0aWNfY2FzdDxjaGFyPigweEVGKSkpIHsKKyAgICAgIGlmICghVHJ5Q29uc3VtZShzdGF0aWNfY2FzdDxjaGFyPigweEJCKSkgfHwKKyAgICAgICAgICAhVHJ5Q29uc3VtZShzdGF0aWNfY2FzdDxjaGFyPigweEJGKSkpIHsKKyAgICAgICAgQWRkRXJyb3IoCisgICAgICAgICAgICAiUHJvdG8gZmlsZSBzdGFydHMgd2l0aCAweEVGIGJ1dCBub3QgVVRGLTggQk9NLiAiCisgICAgICAgICAgICAiT25seSBVVEYtOCBpcyBhY2NlcHRlZCBmb3IgcHJvdG8gZmlsZS4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBjb2xsZWN0b3IuRGV0YWNoRnJvbVByZXYoKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBBIGNvbW1lbnQgYXBwZWFyaW5nIG9uIHRoZSBzYW1lIGxpbmUgbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUgcHJldmlvdXMKKyAgICAvLyBkZWNsYXJhdGlvbi4KKyAgICBDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlTm9OZXdsaW5lPigpOworICAgIHN3aXRjaCAoVHJ5Q29uc3VtZUNvbW1lbnRTdGFydCgpKSB7CisgICAgICBjYXNlIExJTkVfQ09NTUVOVDoKKyAgICAgICAgQ29uc3VtZUxpbmVDb21tZW50KGNvbGxlY3Rvci5HZXRCdWZmZXJGb3JMaW5lQ29tbWVudCgpKTsKKworICAgICAgICAvLyBEb24ndCBhbGxvdyBjb21tZW50cyBvbiBzdWJzZXF1ZW50IGxpbmVzIHRvIGJlIGF0dGFjaGVkIHRvIGEgdHJhaWxpbmcKKyAgICAgICAgLy8gY29tbWVudC4KKyAgICAgICAgY29sbGVjdG9yLkZsdXNoKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCTE9DS19DT01NRU5UOgorICAgICAgICBDb25zdW1lQmxvY2tDb21tZW50KGNvbGxlY3Rvci5HZXRCdWZmZXJGb3JCbG9ja0NvbW1lbnQoKSk7CisKKyAgICAgICAgQ29uc3VtZVplcm9Pck1vcmU8V2hpdGVzcGFjZU5vTmV3bGluZT4oKTsKKyAgICAgICAgaWYgKCFUcnlDb25zdW1lKCdcbicpKSB7CisgICAgICAgICAgLy8gT29wcywgdGhlIG5leHQgdG9rZW4gaXMgb24gdGhlIHNhbWUgbGluZS4gIElmIHdlIHJlY29yZGVkIGEgY29tbWVudAorICAgICAgICAgIC8vIHdlIHJlYWxseSBoYXZlIG5vIGlkZWEgd2hpY2ggdG9rZW4gaXQgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLgorICAgICAgICAgIGNvbGxlY3Rvci5DbGVhckJ1ZmZlcigpOworICAgICAgICAgIHJldHVybiBOZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEb24ndCBhbGxvdyBjb21tZW50cyBvbiBzdWJzZXF1ZW50IGxpbmVzIHRvIGJlIGF0dGFjaGVkIHRvIGEgdHJhaWxpbmcKKyAgICAgICAgLy8gY29tbWVudC4KKyAgICAgICAgY29sbGVjdG9yLkZsdXNoKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTEFTSF9OT1RfQ09NTUVOVDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlIE5PX0NPTU1FTlQ6CisgICAgICAgIGlmICghVHJ5Q29uc3VtZSgnXG4nKSkgeworICAgICAgICAgIC8vIFRoZSBuZXh0IHRva2VuIGlzIG9uIHRoZSBzYW1lIGxpbmUuICBUaGVyZSBhcmUgbm8gY29tbWVudHMuCisgICAgICAgICAgcmV0dXJuIE5leHQoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBPSywgd2UgYXJlIG5vdyBvbiB0aGUgbGluZSAqYWZ0ZXIqIHRoZSBwcmV2aW91cyB0b2tlbi4KKyAgd2hpbGUgKHRydWUpIHsKKyAgICBDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlTm9OZXdsaW5lPigpOworCisgICAgc3dpdGNoIChUcnlDb25zdW1lQ29tbWVudFN0YXJ0KCkpIHsKKyAgICAgIGNhc2UgTElORV9DT01NRU5UOgorICAgICAgICBDb25zdW1lTGluZUNvbW1lbnQoY29sbGVjdG9yLkdldEJ1ZmZlckZvckxpbmVDb21tZW50KCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQkxPQ0tfQ09NTUVOVDoKKyAgICAgICAgQ29uc3VtZUJsb2NrQ29tbWVudChjb2xsZWN0b3IuR2V0QnVmZmVyRm9yQmxvY2tDb21tZW50KCkpOworCisgICAgICAgIC8vIENvbnN1bWUgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgc28gdGhhdCB3ZSBkb24ndCBpbnRlcnByZXQgaXQgYXMgYQorICAgICAgICAvLyBibGFuayBsaW5lIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHRoZSBsb29wLgorICAgICAgICBDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlTm9OZXdsaW5lPigpOworICAgICAgICBUcnlDb25zdW1lKCdcbicpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0xBU0hfTk9UX0NPTU1FTlQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSBOT19DT01NRU5UOgorICAgICAgICBpZiAoVHJ5Q29uc3VtZSgnXG4nKSkgeworICAgICAgICAgIC8vIENvbXBsZXRlbHkgYmxhbmsgbGluZS4KKyAgICAgICAgICBjb2xsZWN0b3IuRmx1c2goKTsKKyAgICAgICAgICBjb2xsZWN0b3IuRGV0YWNoRnJvbVByZXYoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBib29sIHJlc3VsdCA9IE5leHQoKTsKKyAgICAgICAgICBpZiAoIXJlc3VsdCB8fCBjdXJyZW50Xy50ZXh0ID09ICJ9IiB8fCBjdXJyZW50Xy50ZXh0ID09ICJdIiB8fAorICAgICAgICAgICAgICBjdXJyZW50Xy50ZXh0ID09ICIpIikgeworICAgICAgICAgICAgLy8gSXQgbG9va3MgbGlrZSB3ZSdyZSBhdCB0aGUgZW5kIG9mIGEgc2NvcGUuICBJbiB0aGlzIGNhc2UgaXQKKyAgICAgICAgICAgIC8vIG1ha2VzIG5vIHNlbnNlIHRvIGF0dGFjaCBhIGNvbW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0b2tlbi4KKyAgICAgICAgICAgIGNvbGxlY3Rvci5GbHVzaCgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUb2tlbi1wYXJzaW5nIGhlbHBlcnMuICBSZW1lbWJlciB0aGF0IHRoZXNlIGRvbid0IG5lZWQgdG8gcmVwb3J0CisvLyBlcnJvcnMgc2luY2UgYW55IGVycm9ycyBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gcmVwb3J0ZWQgd2hpbGUKKy8vIHRva2VuaXppbmcuICBBbHNvLCB0aGVzZSBjYW4gYXNzdW1lIHRoYXQgd2hhdGV2ZXIgdGV4dCB0aGV5CisvLyBhcmUgZ2l2ZW4gaXMgdGV4dCB0aGF0IHRoZSB0b2tlbml6ZXIgYWN0dWFsbHkgcGFyc2VkIGFzIGEgdG9rZW4KKy8vIG9mIHRoZSBnaXZlbiB0eXBlLgorCitib29sIFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0LCB1aW50NjRfdCBtYXhfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBvdXRwdXQpIHsKKyAgLy8gV2UgY2FuJ3QganVzdCB1c2Ugc3RydG91bGwoKSBiZWNhdXNlIChhKSBpdCBhY2NlcHRzIG5lZ2F0aXZlIG51bWJlcnMsCisgIC8vIChiKSBXZSB3YW50IGFkZGl0aW9uYWwgcmFuZ2UgY2hlY2tzLCAoYykgaXQgcmVwb3J0cyBvdmVyZmxvd3MgdmlhIGVycm5vLgorCisjaWYgMAorICBjb25zdCBjaGFyICpzdHJfYmVnaW4gPSB0ZXh0LmNfc3RyKCk7CisgIGlmICgqc3RyX2JlZ2luID09ICctJykgcmV0dXJuIGZhbHNlOworICBjaGFyICpzdHJfZW5kID0gbnVsbHB0cjsKKyAgZXJybm8gPSAwOworICAqb3V0cHV0ID0gc3RkOjpzdHJ0b3VsbChzdHJfYmVnaW4sICZzdHJfZW5kLCAwKTsKKyAgcmV0dXJuIChlcnJubyA9PSAwICYmIHN0cl9lbmQgJiYgKnN0cl9lbmQgPT0gJ1wwJyAmJiAqb3V0cHV0IDw9IG1heF92YWx1ZSk7CisjZW5kaWYKKworICBjb25zdCBjaGFyKiBwdHIgPSB0ZXh0LmNfc3RyKCk7CisgIGludCBiYXNlID0gMTA7CisgIHVpbnQ2NF90IG92ZXJmbG93X2lmX211bF9iYXNlID0gKGt1aW50NjRtYXggLyAxMCkgKyAxOworICBpZiAocHRyWzBdID09ICcwJykgeworICAgIGlmIChwdHJbMV0gPT0gJ3gnIHx8IHB0clsxXSA9PSAnWCcpIHsKKyAgICAgIC8vIFRoaXMgaXMgaGV4LgorICAgICAgYmFzZSA9IDE2OworICAgICAgb3ZlcmZsb3dfaWZfbXVsX2Jhc2UgPSAoa3VpbnQ2NG1heCAvIDE2KSArIDE7CisgICAgICBwdHIgKz0gMjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVGhpcyBpcyBvY3RhbC4KKyAgICAgIGJhc2UgPSA4OworICAgICAgb3ZlcmZsb3dfaWZfbXVsX2Jhc2UgPSAoa3VpbnQ2NG1heCAvIDgpICsgMTsKKyAgICB9CisgIH0KKworICB1aW50NjRfdCByZXN1bHQgPSAwOworICAvLyBGb3IgYWxsIHRoZSBsZWFkaW5nICcwJ3MsIGFuZCBhbHNvIHRoZSBmaXJzdCBub24temVybyBjaGFyYWN0ZXIsIHdlCisgIC8vIGRvbid0IG5lZWQgdG8gbXVsdGlwbHkuCisgIHdoaWxlICgqcHRyICE9ICdcMCcpIHsKKyAgICBpbnQgZGlnaXQgPSBEaWdpdFZhbHVlKCpwdHIrKyk7CisgICAgaWYgKGRpZ2l0ID49IGJhc2UpIHsKKyAgICAgIC8vIFRoZSB0b2tlbiBwcm92aWRlZCBieSBUb2tlbml6ZXIgaXMgaW52YWxpZC4gaS5lLiwgMDk5IGlzIGFuIGludmFsaWQKKyAgICAgIC8vIHRva2VuLCBidXQgVG9rZW5pemVyIHN0aWxsIHRoaW5rIGl0J3MgaW50ZWdlci4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGRpZ2l0ICE9IDApIHsKKyAgICAgIHJlc3VsdCA9IGRpZ2l0OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGZvciAoOyAqcHRyICE9ICdcMCc7IHB0cisrKSB7CisgICAgaW50IGRpZ2l0ID0gRGlnaXRWYWx1ZSgqcHRyKTsKKyAgICBpZiAoZGlnaXQgPCAwIHx8IGRpZ2l0ID49IGJhc2UpIHsKKyAgICAgIC8vIFRoZSB0b2tlbiBwcm92aWRlZCBieSBUb2tlbml6ZXIgaXMgaW52YWxpZC4gaS5lLiwgMDk5IGlzIGFuIGludmFsaWQKKyAgICAgIC8vIHRva2VuLCBidXQgVG9rZW5pemVyIHN0aWxsIHRoaW5rIGl0J3MgaW50ZWdlci4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHJlc3VsdCA+PSBvdmVyZmxvd19pZl9tdWxfYmFzZSkgeworICAgICAgLy8gV2Uga25vdyB0aGUgbXVsdGlwbHkgd2UncmUgYWJvdXQgdG8gZG8gd2lsbCBvdmVyZmxvdywgc28gZXhpdCBub3cuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIFdlIGtub3cgdGhhdCByZXN1bHQgKiBiYXNlIHdvbid0IG92ZXJmbG93LCBidXQgYWRkaW5nIGRpZ2l0IG1pZ2h0Li4uCisgICAgcmVzdWx0ID0gcmVzdWx0ICogYmFzZSArIGRpZ2l0OworICAgIC8vIEMrKyBndWFyYW50ZWVzIGRlZmluZWQgIndyYXAiIHNlbWFudGljcyB3aGVuIHVuc2lnbmVkIGludGVnZXIKKyAgICAvLyBvcGVyYXRpb25zIG92ZXJmbG93LCBtYWtpbmcgdGhpcyBhIGZhc3Qgd2F5IHRvIGNoZWNrIGlmIGFkZGluZworICAgIC8vIGRpZ2l0IG1hZGUgcmVzdWx0IG92ZXJmbG93LCBhbmQgdGh1cywgd3JhcCBhcm91bmQuCisgICAgaWYgKHJlc3VsdCA8IHN0YXRpY19jYXN0PHVpbnQ2NF90PihiYXNlKSkgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChyZXN1bHQgPiBtYXhfdmFsdWUpIHJldHVybiBmYWxzZTsKKworICAqb3V0cHV0ID0gcmVzdWx0OworICByZXR1cm4gdHJ1ZTsKK30KKworZG91YmxlIFRva2VuaXplcjo6UGFyc2VGbG9hdChjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCkgeworICBjb25zdCBjaGFyKiBzdGFydCA9IHRleHQuY19zdHIoKTsKKyAgY2hhciogZW5kOworICBkb3VibGUgcmVzdWx0ID0gTm9Mb2NhbGVTdHJ0b2Qoc3RhcnQsICZlbmQpOworCisgIC8vICIxZSIgaXMgbm90IGEgdmFsaWQgZmxvYXQsIGJ1dCBpZiB0aGUgdG9rZW5pemVyIHJlYWRzIGl0LCBpdCB3aWxsCisgIC8vIHJlcG9ydCBhbiBlcnJvciBidXQgc3RpbGwgcmV0dXJuIGl0IGFzIGEgdmFsaWQgdG9rZW4uICBXZSBuZWVkIHRvCisgIC8vIGFjY2VwdCBhbnl0aGluZyB0aGUgdG9rZW5pemVyIGNvdWxkIHBvc3NpYmx5IHJldHVybiwgZXJyb3Igb3Igbm90LgorICBpZiAoKmVuZCA9PSAnZScgfHwgKmVuZCA9PSAnRScpIHsKKyAgICArK2VuZDsKKyAgICBpZiAoKmVuZCA9PSAnLScgfHwgKmVuZCA9PSAnKycpICsrZW5kOworICB9CisKKyAgLy8gSWYgdGhlIFRva2VuaXplciBoYWQgYWxsb3dfZl9hZnRlcl9mbG9hdF8gZW5hYmxlZCwgdGhlIGZsb2F0IG1heSBiZQorICAvLyBzdWZmaXhlZCB3aXRoIHRoZSBsZXR0ZXIgJ2YnLgorICBpZiAoKmVuZCA9PSAnZicgfHwgKmVuZCA9PSAnRicpIHsKKyAgICArK2VuZDsKKyAgfQorCisgIEdPT0dMRV9MT0dfSUYoREZBVEFMLAorICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihlbmQgLSBzdGFydCkgIT0gdGV4dC5zaXplKCkgfHwgKnN0YXJ0ID09ICctJykKKyAgICAgIDw8ICIgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCkgcGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QgaGF2ZSBiZWVuIgorICAgICAgICAgIiB0b2tlbml6ZWQgYXMgYSBmbG9hdDogIgorICAgICAgPDwgQ0VzY2FwZSh0ZXh0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gSGVscGVyIHRvIGFwcGVuZCBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIHN0cmluZyBhcyBVVEY4LCB3aXRob3V0IGJyaW5naW5nCisvLyBpbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLgorc3RhdGljIHZvaWQgQXBwZW5kVVRGOCh1aW50MzJfdCBjb2RlX3BvaW50LCBzdGQ6OnN0cmluZyogb3V0cHV0KSB7CisgIHVpbnQzMl90IHRtcCA9IDA7CisgIGludCBsZW4gPSAwOworICBpZiAoY29kZV9wb2ludCA8PSAweDdmKSB7CisgICAgdG1wID0gY29kZV9wb2ludDsKKyAgICBsZW4gPSAxOworICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0gMHgwN2ZmKSB7CisgICAgdG1wID0gMHgwMDAwYzA4MCB8ICgoY29kZV9wb2ludCAmIDB4MDdjMCkgPDwgMikgfCAoY29kZV9wb2ludCAmIDB4MDAzZik7CisgICAgbGVuID0gMjsKKyAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IDB4ZmZmZikgeworICAgIHRtcCA9IDB4MDBlMDgwODAgfCAoKGNvZGVfcG9pbnQgJiAweGYwMDApIDw8IDQpIHwKKyAgICAgICAgICAoKGNvZGVfcG9pbnQgJiAweDBmYzApIDw8IDIpIHwgKGNvZGVfcG9pbnQgJiAweDAwM2YpOworICAgIGxlbiA9IDM7CisgIH0gZWxzZSBpZiAoY29kZV9wb2ludCA8PSAweDEwZmZmZikgeworICAgIHRtcCA9IDB4ZjA4MDgwODAgfCAoKGNvZGVfcG9pbnQgJiAweDFjMDAwMCkgPDwgNikgfAorICAgICAgICAgICgoY29kZV9wb2ludCAmIDB4MDNmMDAwKSA8PCA0KSB8ICgoY29kZV9wb2ludCAmIDB4MDAwZmMwKSA8PCAyKSB8CisgICAgICAgICAgKGNvZGVfcG9pbnQgJiAweDAwM2YpOworICAgIGxlbiA9IDQ7CisgIH0gZWxzZSB7CisgICAgLy8gVW5pY29kZSBjb2RlIHBvaW50cyBlbmQgYXQgMHgxMEZGRkYsIHNvIHRoaXMgaXMgb3V0LW9mLXJhbmdlLgorICAgIC8vIENvbnN1bWVTdHJpbmcgcGVybWl0cyBoZXggdmFsdWVzIHVwIHRvIDB4MUZGRkZGLCBhbmQgRmV0Y2hVbmljb2RlUG9pbnQKKyAgICAvLyBkb2Vzbid0IHBlcmZvcm0gYSByYW5nZSBjaGVjay4KKyAgICBTdHJpbmdBcHBlbmRGKG91dHB1dCwgIlxcVSUwOHgiLCBjb2RlX3BvaW50KTsKKyAgICByZXR1cm47CisgIH0KKyAgdG1wID0gZ2h0b25sKHRtcCk7CisgIG91dHB1dC0+YXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZ0bXApICsgc2l6ZW9mKHRtcCkgLSBsZW4sIGxlbik7Cit9CisKKy8vIFRyeSB0byByZWFkIDxsZW4+IGhleCBkaWdpdHMgZnJvbSBwdHIsIGFuZCBzdHVmZiB0aGUgbnVtZXJpYyByZXN1bHQgaW50bworLy8gKnJlc3VsdC4gUmV0dXJucyB0cnVlIGlmIHRoYXQgbWFueSBkaWdpdHMgd2VyZSBzdWNjZXNzZnVsbHkgY29uc3VtZWQuCitzdGF0aWMgYm9vbCBSZWFkSGV4RGlnaXRzKGNvbnN0IGNoYXIqIHB0ciwgaW50IGxlbiwgdWludDMyX3QqIHJlc3VsdCkgeworICAqcmVzdWx0ID0gMDsKKyAgaWYgKGxlbiA9PSAwKSByZXR1cm4gZmFsc2U7CisgIGZvciAoY29uc3QgY2hhciogZW5kID0gcHRyICsgbGVuOyBwdHIgPCBlbmQ7ICsrcHRyKSB7CisgICAgaWYgKCpwdHIgPT0gJ1wwJykgcmV0dXJuIGZhbHNlOworICAgICpyZXN1bHQgPSAoKnJlc3VsdCA8PCA0KSArIERpZ2l0VmFsdWUoKnB0cik7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEhhbmRsaW5nIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMuIFVURi0xNiBlbmNvZGVzIGNvZGUgcG9pbnRzIGluIHRoZSByYW5nZQorLy8gMHgxMDAwMC4uLjB4MTBmZmZmIGFzIGEgcGFpciBvZiBudW1iZXJzLCBhIGhlYWQgc3Vycm9nYXRlIGZvbGxvd2VkIGJ5IGEgdHJhaWwKKy8vIHN1cnJvZ2F0ZS4gVGhlc2UgbnVtYmVycyBhcmUgaW4gYSByZXNlcnZlZCByYW5nZSBvZiBVbmljb2RlIGNvZGUgcG9pbnRzLCBzbworLy8gaWYgd2UgZW5jb3VudGVyIHN1Y2ggYSBwYWlyIHdlIGtub3cgaG93IHRvIHBhcnNlIGl0IGFuZCBjb252ZXJ0IGl0IGludG8gYQorLy8gc2luZ2xlIGNvZGUgcG9pbnQuCitzdGF0aWMgY29uc3QgdWludDMyX3Qga01pbkhlYWRTdXJyb2dhdGUgPSAweGQ4MDA7CitzdGF0aWMgY29uc3QgdWludDMyX3Qga01heEhlYWRTdXJyb2dhdGUgPSAweGRjMDA7CitzdGF0aWMgY29uc3QgdWludDMyX3Qga01pblRyYWlsU3Vycm9nYXRlID0gMHhkYzAwOworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhUcmFpbFN1cnJvZ2F0ZSA9IDB4ZTAwMDsKKworc3RhdGljIGlubGluZSBib29sIElzSGVhZFN1cnJvZ2F0ZSh1aW50MzJfdCBjb2RlX3BvaW50KSB7CisgIHJldHVybiAoY29kZV9wb2ludCA+PSBrTWluSGVhZFN1cnJvZ2F0ZSkgJiYgKGNvZGVfcG9pbnQgPCBrTWF4SGVhZFN1cnJvZ2F0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBJc1RyYWlsU3Vycm9nYXRlKHVpbnQzMl90IGNvZGVfcG9pbnQpIHsKKyAgcmV0dXJuIChjb2RlX3BvaW50ID49IGtNaW5UcmFpbFN1cnJvZ2F0ZSkgJiYKKyAgICAgICAgIChjb2RlX3BvaW50IDwga01heFRyYWlsU3Vycm9nYXRlKTsKK30KKworLy8gQ29tYmluZSBhIGhlYWQgYW5kIHRyYWlsIHN1cnJvZ2F0ZSBpbnRvIGEgc2luZ2xlIFVuaWNvZGUgY29kZSBwb2ludC4KK3N0YXRpYyB1aW50MzJfdCBBc3NlbWJsZVVURjE2KHVpbnQzMl90IGhlYWRfc3Vycm9nYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhaWxfc3Vycm9nYXRlKSB7CisgIEdPT0dMRV9EQ0hFQ0soSXNIZWFkU3Vycm9nYXRlKGhlYWRfc3Vycm9nYXRlKSk7CisgIEdPT0dMRV9EQ0hFQ0soSXNUcmFpbFN1cnJvZ2F0ZSh0cmFpbF9zdXJyb2dhdGUpKTsKKyAgcmV0dXJuIDB4MTAwMDAgKyAoKChoZWFkX3N1cnJvZ2F0ZSAtIGtNaW5IZWFkU3Vycm9nYXRlKSA8PCAxMCkgfAorICAgICAgICAgICAgICAgICAgICAodHJhaWxfc3Vycm9nYXRlIC0ga01pblRyYWlsU3Vycm9nYXRlKSk7Cit9CisKKy8vIENvbnZlcnQgdGhlIGVzY2FwZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgdG8gYSBudW1iZXIgb2YgZXhwZWN0ZWQgaGV4IGRpZ2l0cy4KK3N0YXRpYyBpbmxpbmUgaW50IFVuaWNvZGVMZW5ndGgoY2hhciBrZXkpIHsKKyAgaWYgKGtleSA9PSAndScpIHJldHVybiA0OworICBpZiAoa2V5ID09ICdVJykgcmV0dXJuIDg7CisgIHJldHVybiAwOworfQorCisvLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlICd1JyBvciAnVScgc3RhcnRpbmcgYSBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZSwgYXR0ZW1wdAorLy8gdG8gcGFyc2UgdGhhdCBzZXF1ZW5jZS4gT24gc3VjY2VzcywgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXIKKy8vIGJleW9uZCB0aGF0IHNlcXVlbmNlLCBhbmQgZmlsbHMgaW4gKmNvZGVfcG9pbnQuIE9uIGZhaWx1cmUsIHJldHVybnMgcHRyCisvLyBpdHNlbGYuCitzdGF0aWMgY29uc3QgY2hhciogRmV0Y2hVbmljb2RlUG9pbnQoY29uc3QgY2hhciogcHRyLCB1aW50MzJfdCogY29kZV9wb2ludCkgeworICBjb25zdCBjaGFyKiBwID0gcHRyOworICAvLyBGZXRjaCB0aGUgY29kZSBwb2ludC4KKyAgY29uc3QgaW50IGxlbiA9IFVuaWNvZGVMZW5ndGgoKnArKyk7CisgIGlmICghUmVhZEhleERpZ2l0cyhwLCBsZW4sIGNvZGVfcG9pbnQpKSByZXR1cm4gcHRyOworICBwICs9IGxlbjsKKworICAvLyBDaGVjayBpZiB0aGUgY29kZSBwb2ludCB3ZSByZWFkIGlzIGEgImhlYWQgc3Vycm9nYXRlLiIgSWYgc28sIHRoZW4gd2UKKyAgLy8gZXhwZWN0IGl0IHRvIGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgY29kZSBwb2ludCB3aGljaCBpcyBhIHZhbGlkCisgIC8vICJ0cmFpbCBzdXJyb2dhdGUsIiBhbmQgdG9nZXRoZXIgdGhleSBmb3JtIGEgVVRGLTE2IHBhaXIgd2hpY2ggZGVjb2RlcyBpbnRvCisgIC8vIGEgc2luZ2xlIFVuaWNvZGUgcG9pbnQuIFRyYWlsIHN1cnJvZ2F0ZXMgbWF5IG9ubHkgdXNlIFx1LCBub3QgXFUuCisgIGlmIChJc0hlYWRTdXJyb2dhdGUoKmNvZGVfcG9pbnQpICYmICpwID09ICdcXCcgJiYgKihwICsgMSkgPT0gJ3UnKSB7CisgICAgdWludDMyX3QgdHJhaWxfc3Vycm9nYXRlOworICAgIGlmIChSZWFkSGV4RGlnaXRzKHAgKyAyLCA0LCAmdHJhaWxfc3Vycm9nYXRlKSAmJgorICAgICAgICBJc1RyYWlsU3Vycm9nYXRlKHRyYWlsX3N1cnJvZ2F0ZSkpIHsKKyAgICAgICpjb2RlX3BvaW50ID0gQXNzZW1ibGVVVEYxNigqY29kZV9wb2ludCwgdHJhaWxfc3Vycm9nYXRlKTsKKyAgICAgIHAgKz0gNjsKKyAgICB9CisgICAgLy8gSWYgdGhpcyBmYWlsZWQsIHRoZW4gd2UganVzdCBlbWl0IHRoZSBoZWFkIHN1cnJvZ2F0ZSBhcyBhIGNvZGUgcG9pbnQuCisgICAgLy8gSXQncyBib2d1cywgYnV0IHNvIGlzIHRoZSBzdHJpbmcuCisgIH0KKworICByZXR1cm4gcDsKK30KKworLy8gVGhlIHRleHQgc3RyaW5nIG11c3QgYmVnaW4gYW5kIGVuZCB3aXRoIHNpbmdsZSBvciBkb3VibGUgcXVvdGUKKy8vIGNoYXJhY3RlcnMuCit2b2lkIFRva2VuaXplcjo6UGFyc2VTdHJpbmdBcHBlbmQoY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dHB1dCkgeworICAvLyBSZW1pbmRlcjogdGV4dFswXSBpcyBhbHdheXMgYSBxdW90ZSBjaGFyYWN0ZXIuICAoSWYgdGV4dCBpcworICAvLyBlbXB0eSwgaXQncyBpbnZhbGlkLCBzbyB3ZSdsbCBqdXN0IHJldHVybikuCisgIGNvbnN0IHNpemVfdCB0ZXh0X3NpemUgPSB0ZXh0LnNpemUoKTsKKyAgaWYgKHRleHRfc2l6ZSA9PSAwKSB7CisgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICIgVG9rZW5pemVyOjpQYXJzZVN0cmluZ0FwcGVuZCgpIHBhc3NlZCB0ZXh0IHRoYXQgY291bGQgbm90IgorICAgICAgICAgICAgICAgICAgICIgaGF2ZSBiZWVuIHRva2VuaXplZCBhcyBhIHN0cmluZzogIgorICAgICAgICAgICAgICAgIDw8IENFc2NhcGUodGV4dCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gUmVzZXJ2ZSByb29tIGZvciBuZXcgc3RyaW5nLiBUaGUgYnJhbmNoIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGlmCisgIC8vIHRoZXJlIGlzIGFscmVhZHkgc3BhY2UgYXZhaWxhYmxlIHRoZSByZXNlcnZlKCkgY2FsbCBtaWdodAorICAvLyBkb3duc2l6ZSB0aGUgb3V0cHV0LgorICBjb25zdCBzaXplX3QgbmV3X2xlbiA9IHRleHRfc2l6ZSArIG91dHB1dC0+c2l6ZSgpOworICBpZiAobmV3X2xlbiA+IG91dHB1dC0+Y2FwYWNpdHkoKSkgeworICAgIG91dHB1dC0+cmVzZXJ2ZShuZXdfbGVuKTsKKyAgfQorCisgIC8vIExvb3AgdGhyb3VnaCB0aGUgc3RyaW5nIGNvcHlpbmcgY2hhcmFjdGVycyB0byAib3V0cHV0IiBhbmQKKyAgLy8gaW50ZXJwcmV0aW5nIGVzY2FwZSBzZXF1ZW5jZXMuICBOb3RlIHRoYXQgYW55IGludmFsaWQgZXNjYXBlCisgIC8vIHNlcXVlbmNlcyBvciBvdGhlciBlcnJvcnMgd2VyZSBhbHJlYWR5IHJlcG9ydGVkIHdoaWxlIHRva2VuaXppbmcuCisgIC8vIEluIHRoaXMgY2FzZSB3ZSBkbyBub3QgbmVlZCB0byBwcm9kdWNlIHZhbGlkIHJlc3VsdHMuCisgIGZvciAoY29uc3QgY2hhciogcHRyID0gdGV4dC5jX3N0cigpICsgMTsgKnB0ciAhPSAnXDAnOyBwdHIrKykgeworICAgIGlmICgqcHRyID09ICdcXCcgJiYgcHRyWzFdICE9ICdcMCcpIHsKKyAgICAgIC8vIEFuIGVzY2FwZSBzZXF1ZW5jZS4KKyAgICAgICsrcHRyOworCisgICAgICBpZiAoT2N0YWxEaWdpdDo6SW5DbGFzcygqcHRyKSkgeworICAgICAgICAvLyBBbiBvY3RhbCBlc2NhcGUuICBNYXkgb25lLCB0d28sIG9yIHRocmVlIGRpZ2l0cy4KKyAgICAgICAgaW50IGNvZGUgPSBEaWdpdFZhbHVlKCpwdHIpOworICAgICAgICBpZiAoT2N0YWxEaWdpdDo6SW5DbGFzcyhwdHJbMV0pKSB7CisgICAgICAgICAgKytwdHI7CisgICAgICAgICAgY29kZSA9IGNvZGUgKiA4ICsgRGlnaXRWYWx1ZSgqcHRyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoT2N0YWxEaWdpdDo6SW5DbGFzcyhwdHJbMV0pKSB7CisgICAgICAgICAgKytwdHI7CisgICAgICAgICAgY29kZSA9IGNvZGUgKiA4ICsgRGlnaXRWYWx1ZSgqcHRyKTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPihjb2RlKSk7CisKKyAgICAgIH0gZWxzZSBpZiAoKnB0ciA9PSAneCcpIHsKKyAgICAgICAgLy8gQSBoZXggZXNjYXBlLiAgTWF5IHplcm8sIG9uZSwgb3IgdHdvIGRpZ2l0cy4gIChUaGUgemVybyBjYXNlCisgICAgICAgIC8vIHdpbGwgaGF2ZSBiZWVuIGNhdWdodCBhcyBhbiBlcnJvciBlYXJsaWVyLikKKyAgICAgICAgaW50IGNvZGUgPSAwOworICAgICAgICBpZiAoSGV4RGlnaXQ6OkluQ2xhc3MocHRyWzFdKSkgeworICAgICAgICAgICsrcHRyOworICAgICAgICAgIGNvZGUgPSBEaWdpdFZhbHVlKCpwdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChIZXhEaWdpdDo6SW5DbGFzcyhwdHJbMV0pKSB7CisgICAgICAgICAgKytwdHI7CisgICAgICAgICAgY29kZSA9IGNvZGUgKiAxNiArIERpZ2l0VmFsdWUoKnB0cik7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0LT5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oY29kZSkpOworCisgICAgICB9IGVsc2UgaWYgKCpwdHIgPT0gJ3UnIHx8ICpwdHIgPT0gJ1UnKSB7CisgICAgICAgIHVpbnQzMl90IHVuaWNvZGU7CisgICAgICAgIGNvbnN0IGNoYXIqIGVuZCA9IEZldGNoVW5pY29kZVBvaW50KHB0ciwgJnVuaWNvZGUpOworICAgICAgICBpZiAoZW5kID09IHB0cikgeworICAgICAgICAgIC8vIEZhaWx1cmU6IEp1c3QgZHVtcCBvdXQgd2hhdCB3ZSBzYXcsIGRvbid0IHRyeSB0byBwYXJzZSBpdC4KKyAgICAgICAgICBvdXRwdXQtPnB1c2hfYmFjaygqcHRyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBBcHBlbmRVVEY4KHVuaWNvZGUsIG91dHB1dCk7CisgICAgICAgICAgcHRyID0gZW5kIC0gMTsgIC8vIEJlY2F1c2Ugd2UncmUgYWJvdXQgdG8gKytwdHIuCisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNvbWUgb3RoZXIgZXNjYXBlIGNvZGUuCisgICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKFRyYW5zbGF0ZUVzY2FwZSgqcHRyKSk7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKCpwdHIgPT0gdGV4dFswXSAmJiBwdHJbMV0gPT0gJ1wwJykgeworICAgICAgLy8gSWdub3JlIGZpbmFsIHF1b3RlIG1hdGNoaW5nIHRoZSBzdGFydGluZyBxdW90ZS4KKyAgICB9IGVsc2UgeworICAgICAgb3V0cHV0LT5wdXNoX2JhY2soKnB0cik7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KK3N0YXRpYyBib29sIEFsbEluQ2xhc3MoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKKyAgZm9yIChjb25zdCBjaGFyIGNoYXJhY3RlciA6IHMpIHsKKyAgICBpZiAoIUNoYXJhY3RlckNsYXNzOjpJbkNsYXNzKGNoYXJhY3RlcikpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBUb2tlbml6ZXI6OklzSWRlbnRpZmllcihjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCkgeworICAvLyBNaXJyb3JzIElERU5USUZJRVIgZGVmaW5pdGlvbiBpbiBUb2tlbml6ZXI6Ok5leHQoKSBhYm92ZS4KKyAgaWYgKHRleHQuc2l6ZSgpID09IDApIHJldHVybiBmYWxzZTsKKyAgaWYgKCFMZXR0ZXI6OkluQ2xhc3ModGV4dC5hdCgwKSkpIHJldHVybiBmYWxzZTsKKyAgaWYgKCFBbGxJbkNsYXNzPEFscGhhbnVtZXJpYz4odGV4dC5zdWJzdHIoMSkpKSByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiYWI3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmgKQEAgLTAsMCArMSw0NDIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBDbGFzcyBmb3IgcGFyc2luZyB0b2tlbml6ZWQgdGV4dCBmcm9tIGEgWmVyb0NvcHlJbnB1dFN0cmVhbS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfSU9fVE9LRU5JWkVSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU9fVE9LRU5JWkVSX0hfXworCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworCitjbGFzcyBaZXJvQ29weUlucHV0U3RyZWFtOyAgLy8gemVyb19jb3B5X3N0cmVhbS5oCisKKy8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgorY2xhc3MgRXJyb3JDb2xsZWN0b3I7CitjbGFzcyBUb2tlbml6ZXI7CisKKy8vIEJ5ICJjb2x1bW4gbnVtYmVyIiwgdGhlIHByb3RvIGNvbXBpbGVyIHJlZmVycyB0byBhIGNvdW50IG9mIHRoZSBudW1iZXIKKy8vIG9mIGJ5dGVzIGJlZm9yZSBhIGdpdmVuIGJ5dGUsIGV4Y2VwdCB0aGF0IGEgdGFiIGNoYXJhY3RlciBhZHZhbmNlcyB0bworLy8gdGhlIG5leHQgbXVsdGlwbGUgb2YgOCBieXRlcy4gIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IGNvbHVtbiBudW1iZXJzCisvLyBhcmUgemVyby1iYXNlZCwgd2hpbGUgbWFueSB1c2VyIGludGVyZmFjZXMgdXNlIG9uZS1iYXNlZCBjb2x1bW4gbnVtYmVycy4KK3R5cGVkZWYgaW50IENvbHVtbk51bWJlcjsKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhbiBvYmplY3Qgd2hpY2ggY29sbGVjdHMgdGhlIGVycm9ycyB0aGF0IG9jY3VyCisvLyBkdXJpbmcgcGFyc2luZy4gIEEgdHlwaWNhbCBpbXBsZW1lbnRhdGlvbiBtaWdodCBzaW1wbHkgcHJpbnQgdGhlIGVycm9ycworLy8gdG8gc3Rkb3V0LgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIGlubGluZSBFcnJvckNvbGxlY3RvcigpIHt9CisgIHZpcnR1YWwgfkVycm9yQ29sbGVjdG9yKCk7CisKKyAgLy8gSW5kaWNhdGVzIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSBpbnB1dCBhdCB0aGUgZ2l2ZW4gbGluZSBhbmQKKyAgLy8gY29sdW1uIG51bWJlcnMuICBUaGUgbnVtYmVycyBhcmUgemVyby1iYXNlZCwgc28geW91IG1heSB3YW50IHRvIGFkZAorICAvLyAxIHRvIGVhY2ggYmVmb3JlIHByaW50aW5nIHRoZW0uCisgIHZpcnR1YWwgdm9pZCBBZGRFcnJvcihpbnQgbGluZSwgQ29sdW1uTnVtYmVyIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA9IDA7CisKKyAgLy8gSW5kaWNhdGVzIHRoYXQgdGhlcmUgd2FzIGEgd2FybmluZyBpbiB0aGUgaW5wdXQgYXQgdGhlIGdpdmVuIGxpbmUgYW5kCisgIC8vIGNvbHVtbiBudW1iZXJzLiAgVGhlIG51bWJlcnMgYXJlIHplcm8tYmFzZWQsIHNvIHlvdSBtYXkgd2FudCB0byBhZGQKKyAgLy8gMSB0byBlYWNoIGJlZm9yZSBwcmludGluZyB0aGVtLgorICB2aXJ0dWFsIHZvaWQgQWRkV2FybmluZyhpbnQgLyogbGluZSAqLywgQ29sdW1uTnVtYmVyIC8qIGNvbHVtbiAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIC8qIG1lc3NhZ2UgKi8pIHt9CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRXJyb3JDb2xsZWN0b3IpOworfTsKKworLy8gVGhpcyBjbGFzcyBjb252ZXJ0cyBhIHN0cmVhbSBvZiByYXcgdGV4dCBpbnRvIGEgc3RyZWFtIG9mIHRva2VucyBmb3IKKy8vIHRoZSBwcm90b2NvbCBkZWZpbml0aW9uIHBhcnNlciB0byBwYXJzZS4gIFRoZSB0b2tlbnMgcmVjb2duaXplZCBhcmUKKy8vIHNpbWlsYXIgdG8gdGhvc2UgdGhhdCBtYWtlIHVwIHRoZSBDIGxhbmd1YWdlOyBzZWUgdGhlIFRva2VuVHlwZSBlbnVtIGZvcgorLy8gcHJlY2lzZSBkZXNjcmlwdGlvbnMuICBXaGl0ZXNwYWNlIGFuZCBjb21tZW50cyBhcmUgc2tpcHBlZC4gIEJ5IGRlZmF1bHQsCisvLyBDLSBhbmQgQysrLXN0eWxlIGNvbW1lbnRzIGFyZSByZWNvZ25pemVkLCBidXQgb3RoZXIgc3R5bGVzIGNhbiBiZSB1c2VkIGJ5CisvLyBjYWxsaW5nIHNldF9jb21tZW50X3N0eWxlKCkuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgVG9rZW5pemVyIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdCBhIFRva2VuaXplciB0aGF0IHJlYWRzIGFuZCB0b2tlbml6ZXMgdGV4dCBmcm9tIHRoZSBnaXZlbgorICAvLyBpbnB1dCBzdHJlYW0gYW5kIHdyaXRlcyBlcnJvcnMgdG8gdGhlIGdpdmVuIGVycm9yX2NvbGxlY3Rvci4KKyAgLy8gVGhlIGNhbGxlciBrZWVwcyBvd25lcnNoaXAgb2YgaW5wdXQgYW5kIGVycm9yX2NvbGxlY3Rvci4KKyAgVG9rZW5pemVyKFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKTsKKyAgflRva2VuaXplcigpOworCisgIGVudW0gVG9rZW5UeXBlIHsKKyAgICBUWVBFX1NUQVJULCAgLy8gTmV4dCgpIGhhcyBub3QgeWV0IGJlZW4gY2FsbGVkLgorICAgIFRZUEVfRU5ELCAgICAvLyBFbmQgb2YgaW5wdXQgcmVhY2hlZC4gICJ0ZXh0IiBpcyBlbXB0eS4KKworICAgIFRZUEVfSURFTlRJRklFUiwgIC8vIEEgc2VxdWVuY2Ugb2YgbGV0dGVycywgZGlnaXRzLCBhbmQgdW5kZXJzY29yZXMsIG5vdAorICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0aW5nIHdpdGggYSBkaWdpdC4gIEl0IGlzIGFuIGVycm9yIGZvciBhIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIGZvbGxvd2VkIGJ5IGFuIGlkZW50aWZpZXIgd2l0aCBubyBzcGFjZSBpbgorICAgICAgICAgICAgICAgICAgICAgIC8vIGJldHdlZW4uCisgICAgVFlQRV9JTlRFR0VSLCAgICAgLy8gQSBzZXF1ZW5jZSBvZiBkaWdpdHMgcmVwcmVzZW50aW5nIGFuIGludGVnZXIuICBOb3JtYWxseQorICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkaWdpdHMgYXJlIGRlY2ltYWwsIGJ1dCBhIHByZWZpeCBvZiAiMHgiIGluZGljYXRlcworICAgICAgICAgICAgICAgICAgICAgIC8vIGEgaGV4IG51bWJlciBhbmQgYSBsZWFkaW5nIHplcm8gaW5kaWNhdGVzIG9jdGFsLCBqdXN0CisgICAgICAgICAgICAgICAgICAgICAgLy8gbGlrZSB3aXRoIEMgbnVtZXJpYyBsaXRlcmFscy4gIEEgbGVhZGluZyBuZWdhdGl2ZSBzaWduCisgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgTk9UIGluY2x1ZGVkIGluIHRoZSB0b2tlbjsgaXQncyB1cCB0byB0aGUgcGFyc2VyIHRvCisgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJwcmV0IHRoZSB1bmFyeSBtaW51cyBvcGVyYXRvciBvbiBpdHMgb3duLgorICAgIFRZUEVfRkxPQVQsICAgICAgIC8vIEEgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbCwgd2l0aCBhIGZyYWN0aW9uYWwgcGFydCBhbmQvb3IKKyAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBleHBvbmVudC4gIEFsd2F5cyBpbiBkZWNpbWFsLiAgQWdhaW4sIG5ldmVyCisgICAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUuCisgICAgVFlQRV9TVFJJTkcsICAgICAgLy8gQSBxdW90ZWQgc2VxdWVuY2Ugb2YgZXNjYXBlZCBjaGFyYWN0ZXJzLiAgRWl0aGVyIHNpbmdsZQorICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGRvdWJsZSBxdW90ZXMgY2FuIGJlIHVzZWQsIGJ1dCB0aGV5IG11c3QgbWF0Y2guCisgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdHJpbmcgbGl0ZXJhbCBjYW5ub3QgY3Jvc3MgYSBsaW5lIGJyZWFrLgorICAgIFRZUEVfU1lNQk9MLCAgICAgIC8vIEFueSBvdGhlciBwcmludGFibGUgY2hhcmFjdGVyLCBsaWtlICchJyBvciAnKycuCisgICAgICAgICAgICAgICAgICAgICAgLy8gU3ltYm9scyBhcmUgYWx3YXlzIGEgc2luZ2xlIGNoYXJhY3Rlciwgc28gIiErJCUiIGlzCisgICAgICAgICAgICAgICAgICAgICAgLy8gZm91ciB0b2tlbnMuCisgICAgVFlQRV9XSElURVNQQUNFLCAgLy8gQSBzZXF1ZW5jZSBvZiB3aGl0ZXNwYWNlLiAgVGhpcyB0b2tlbiB0eXBlIGlzIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9kdWNlZCBpZiByZXBvcnRfd2hpdGVzcGFjZSgpIGlzIHRydWUuICBJdCBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnRlZCBmb3Igd2hpdGVzcGFjZSB3aXRoaW4gY29tbWVudHMgb3Igc3RyaW5ncy4KKyAgICBUWVBFX05FV0xJTkUsICAgICAvLyBBIG5ld2xpbmUgKFxuKS4gIFRoaXMgdG9rZW4gdHlwZSBpcyBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvZHVjZWQgaWYgcmVwb3J0X3doaXRlc3BhY2UoKSBpcyB0cnVlIGFuZAorICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydF9uZXdsaW5lcygpIGlzIHRydWUuICBJdCBpcyBub3QgcmVwb3J0ZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3bGluZXMgaW4gY29tbWVudHMgb3Igc3RyaW5ncy4KKyAgfTsKKworICAvLyBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgdG9rZW4gcmVhZCBmcm9tIHRoZSB0b2tlbiBzdHJlYW0uCisgIHN0cnVjdCBUb2tlbiB7CisgICAgVG9rZW5UeXBlIHR5cGU7CisgICAgc3RkOjpzdHJpbmcgdGV4dDsgIC8vIFRoZSBleGFjdCB0ZXh0IG9mIHRoZSB0b2tlbiBhcyBpdCBhcHBlYXJlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQuICBlLmcuIHRva2VucyBvZiBUWVBFX1NUUklORyB3aWxsIHN0aWxsCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIGVzY2FwZWQgYW5kIGluIHF1b3Rlcy4KKworICAgIC8vICJsaW5lIiBhbmQgImNvbHVtbiIgc3BlY2lmeSB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZgorICAgIC8vIHRoZSB0b2tlbiB3aXRoaW4gdGhlIGlucHV0IHN0cmVhbS4gIFRoZXkgYXJlIHplcm8tYmFzZWQuCisgICAgaW50IGxpbmU7CisgICAgQ29sdW1uTnVtYmVyIGNvbHVtbjsKKyAgICBDb2x1bW5OdW1iZXIgZW5kX2NvbHVtbjsKKyAgfTsKKworICAvLyBHZXQgdGhlIGN1cnJlbnQgdG9rZW4uICBUaGlzIGlzIHVwZGF0ZWQgd2hlbiBOZXh0KCkgaXMgY2FsbGVkLiAgQmVmb3JlCisgIC8vIHRoZSBmaXJzdCBjYWxsIHRvIE5leHQoKSwgY3VycmVudCgpIGhhcyB0eXBlIFRZUEVfU1RBUlQgYW5kIG5vIGNvbnRlbnRzLgorICBjb25zdCBUb2tlbiYgY3VycmVudCgpOworCisgIC8vIFJldHVybiB0aGUgcHJldmlvdXMgdG9rZW4gLS0gaS5lLiB3aGF0IGN1cnJlbnQoKSByZXR1cm5lZCBiZWZvcmUgdGhlCisgIC8vIHByZXZpb3VzIGNhbGwgdG8gTmV4dCgpLgorICBjb25zdCBUb2tlbiYgcHJldmlvdXMoKTsKKworICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHRva2VuLiAgUmV0dXJucyBmYWxzZSBpZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBpcworICAvLyByZWFjaGVkLgorICBib29sIE5leHQoKTsKKworICAvLyBMaWtlIE5leHQoKSwgYnV0IGFsc28gY29sbGVjdHMgY29tbWVudHMgd2hpY2ggYXBwZWFyIGJldHdlZW4gdGhlIHByZXZpb3VzCisgIC8vIGFuZCBuZXh0IHRva2Vucy4KKyAgLy8KKyAgLy8gQ29tbWVudHMgd2hpY2ggYXBwZWFyIHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBwcmV2aW91cyB0b2tlbiBhcmUgc3RvcmVkCisgIC8vIGluICpwcmV2X3RhaWxpbmdfY29tbWVudHMuICBDb21tZW50cyB3aGljaCBhcHBlYXIgdG8gYmUgYXR0YWNoZWQgdG8gdGhlCisgIC8vIG5leHQgdG9rZW4gYXJlIHN0b3JlZCBpbiAqbmV4dF9sZWFkaW5nX2NvbW1lbnRzLiAgQ29tbWVudHMgYXBwZWFyaW5nIGluCisgIC8vIGJldHdlZW4gd2hpY2ggZG8gbm90IGFwcGVhciB0byBiZSBhdHRhY2hlZCB0byBlaXRoZXIgd2lsbCBiZSBhZGRlZCB0bworICAvLyBkZXRhY2hlZF9jb21tZW50cy4gIEFueSBvZiB0aGVzZSBwYXJhbWV0ZXJzIGNhbiBiZSBOVUxMIHRvIHNpbXBseSBkaXNjYXJkCisgIC8vIHRoZSBjb21tZW50cy4KKyAgLy8KKyAgLy8gQSBzZXJpZXMgb2YgbGluZSBjb21tZW50cyBhcHBlYXJpbmcgb24gY29uc2VjdXRpdmUgbGluZXMsIHdpdGggbm8gb3RoZXIKKyAgLy8gdG9rZW5zIGFwcGVhcmluZyBvbiB0aG9zZSBsaW5lcywgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2luZ2xlIGNvbW1lbnQuCisgIC8vCisgIC8vIE9ubHkgdGhlIGNvbW1lbnQgY29udGVudCBpcyByZXR1cm5lZDsgY29tbWVudCBtYXJrZXJzIChlLmcuIC8vKSBhcmUKKyAgLy8gc3RyaXBwZWQgb3V0LiAgRm9yIGJsb2NrIGNvbW1lbnRzLCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGFuIGFzdGVyaXNrIHdpbGwKKyAgLy8gYmUgc3RyaXBwZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvdGhlciB0aGFuIHRoZSBmaXJzdC4gIE5ld2xpbmVzCisgIC8vIGFyZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgorICAvLworICAvLyBFeGFtcGxlczoKKyAgLy8KKyAgLy8gICBvcHRpb25hbCBpbnQzMiBmb28gPSAxOyAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBmb28uCisgIC8vICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBiYXIuCisgIC8vICAgb3B0aW9uYWwgaW50MzIgYmFyID0gMjsKKyAgLy8KKyAgLy8gICBvcHRpb25hbCBzdHJpbmcgYmF6ID0gMzsKKyAgLy8gICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhei4KKyAgLy8gICAvLyBBbm90aGVyIGxpbmUgYXR0YWNoZWQgdG8gYmF6LgorICAvLworICAvLyAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gcXV4LgorICAvLyAgIC8vCisgIC8vICAgLy8gQW5vdGhlciBsaW5lIGF0dGFjaGVkIHRvIHF1eC4KKyAgLy8gICBvcHRpb25hbCBkb3VibGUgcXV4ID0gNDsKKyAgLy8KKyAgLy8gICAvLyBEZXRhY2hlZCBjb21tZW50LiAgVGhpcyBpcyBub3QgYXR0YWNoZWQgdG8gcXV4IG9yIGNvcmdlCisgIC8vICAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgYmxhbmsgbGluZXMgc2VwYXJhdGluZyBpdCBmcm9tIGJvdGguCisgIC8vCisgIC8vICAgb3B0aW9uYWwgc3RyaW5nIGNvcmdlID0gNTsKKyAgLy8gICAvKiBCbG9jayBjb21tZW50IGF0dGFjaGVkCisgIC8vICAgICogdG8gY29yZ2UuICBMZWFkaW5nIGFzdGVyaXNrcworICAvLyAgICAqIHdpbGwgYmUgcmVtb3ZlZC4gKi8KKyAgLy8gICAvKiBCbG9jayBjb21tZW50IGF0dGFjaGVkIHRvCisgIC8vICAgICogZ3JhdWx0LiAqLworICAvLyAgIG9wdGlvbmFsIGludDMyIGdyYXVsdCA9IDY7CisgIGJvb2wgTmV4dFdpdGhDb21tZW50cyhzdGQ6OnN0cmluZyogcHJldl90cmFpbGluZ19jb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogZGV0YWNoZWRfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbmV4dF9sZWFkaW5nX2NvbW1lbnRzKTsKKworICAvLyBQYXJzZSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFBhcnNlcyBhIFRZUEVfRkxPQVQgdG9rZW4uICBUaGlzIG5ldmVyIGZhaWxzLCBzbyBsb25nIGFzIHRoZSB0ZXh0IGFjdHVhbGx5CisgIC8vIGNvbWVzIGZyb20gYSBUWVBFX0ZMT0FUIHRva2VuIHBhcnNlZCBieSBUb2tlbml6ZXIuICBJZiBpdCBkb2Vzbid0LCB0aGUKKyAgLy8gcmVzdWx0IGlzIHVuZGVmaW5lZCAocG9zc2libHkgYW4gYXNzZXJ0IGZhaWx1cmUpLgorICBzdGF0aWMgZG91YmxlIFBhcnNlRmxvYXQoY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpOworCisgIC8vIFBhcnNlcyBhIFRZUEVfU1RSSU5HIHRva2VuLiAgVGhpcyBuZXZlciBmYWlscywgc28gbG9uZyBhcyB0aGUgdGV4dCBhY3R1YWxseQorICAvLyBjb21lcyBmcm9tIGEgVFlQRV9TVFJJTkcgdG9rZW4gcGFyc2VkIGJ5IFRva2VuaXplci4gIElmIGl0IGRvZXNuJ3QsIHRoZQorICAvLyByZXN1bHQgaXMgdW5kZWZpbmVkIChwb3NzaWJseSBhbiBhc3NlcnQgZmFpbHVyZSkuCisgIHN0YXRpYyB2b2lkIFBhcnNlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0LCBzdGQ6OnN0cmluZyogb3V0cHV0KTsKKworICAvLyBJZGVudGljYWwgdG8gUGFyc2VTdHJpbmcsIGJ1dCBhcHBlbmRzIHRvIG91dHB1dC4KKyAgc3RhdGljIHZvaWQgUGFyc2VTdHJpbmdBcHBlbmQoY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQsIHN0ZDo6c3RyaW5nKiBvdXRwdXQpOworCisgIC8vIFBhcnNlcyBhIFRZUEVfSU5URUdFUiB0b2tlbi4gIFJldHVybnMgZmFsc2UgaWYgdGhlIHJlc3VsdCB3b3VsZCBiZQorICAvLyBncmVhdGVyIHRoYW4gbWF4X3ZhbHVlLiAgT3RoZXJ3aXNlLCByZXR1cm5zIHRydWUgYW5kIHNldHMgKm91dHB1dCB0byB0aGUKKyAgLy8gcmVzdWx0LiAgSWYgdGhlIHRleHQgaXMgbm90IGZyb20gYSBUb2tlbiBvZiB0eXBlIFRZUEVfSU5URUdFUiBvcmlnaW5hbGx5CisgIC8vIHBhcnNlZCBieSBhIFRva2VuaXplciwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgKHBvc3NpYmx5IGFuIGFzc2VydAorICAvLyBmYWlsdXJlKS4KKyAgc3RhdGljIGJvb2wgUGFyc2VJbnRlZ2VyKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0LCB1aW50NjRfdCBtYXhfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogb3V0cHV0KTsKKworICAvLyBPcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFNldCB0cnVlIHRvIGFsbG93IGZsb2F0cyB0byBiZSBzdWZmaXhlZCB3aXRoIHRoZSBsZXR0ZXIgJ2YnLiAgVG9rZW5zCisgIC8vIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBiZSBpbnRlZ2VycyBidXQgd2hpY2ggaGF2ZSB0aGUgJ2YnIHN1ZmZpeCB3aWxsIGJlCisgIC8vIGZvcmNlZCB0byBiZSBpbnRlcnByZXRlZCBhcyBmbG9hdHMuICBGb3IgYWxsIG90aGVyIHB1cnBvc2VzLCB0aGUgJ2YnIGlzCisgIC8vIGlnbm9yZWQuCisgIHZvaWQgc2V0X2FsbG93X2ZfYWZ0ZXJfZmxvYXQoYm9vbCB2YWx1ZSkgeyBhbGxvd19mX2FmdGVyX2Zsb2F0XyA9IHZhbHVlOyB9CisKKyAgLy8gVmFsaWQgdmFsdWVzIGZvciBzZXRfY29tbWVudF9zdHlsZSgpLgorICBlbnVtIENvbW1lbnRTdHlsZSB7CisgICAgLy8gTGluZSBjb21tZW50cyBiZWdpbiB3aXRoICIvLyIsIGJsb2NrIGNvbW1lbnRzIGFyZSBkZWxpbWl0ZWQgYnkgIi8qIiBhbmQKKyAgICAvLyAiKi8iLgorICAgIENQUF9DT01NRU5UX1NUWUxFLAorICAgIC8vIExpbmUgY29tbWVudHMgYmVnaW4gd2l0aCAiIyIuICBObyB3YXkgdG8gd3JpdGUgYmxvY2sgY29tbWVudHMuCisgICAgU0hfQ09NTUVOVF9TVFlMRQorICB9OworCisgIC8vIFNldHMgdGhlIGNvbW1lbnQgc3R5bGUuCisgIHZvaWQgc2V0X2NvbW1lbnRfc3R5bGUoQ29tbWVudFN0eWxlIHN0eWxlKSB7IGNvbW1lbnRfc3R5bGVfID0gc3R5bGU7IH0KKworICAvLyBXaGV0aGVyIHRvIHJlcXVpcmUgd2hpdGVzcGFjZSBiZXR3ZWVuIGEgbnVtYmVyIGFuZCBhIGZpZWxkIG5hbWUuCisgIC8vIERlZmF1bHQgaXMgdHJ1ZS4gRG8gbm90IHVzZSB0aGlzOyBmb3IgR29vZ2xlLWludGVybmFsIGNsZWFudXAgb25seS4KKyAgdm9pZCBzZXRfcmVxdWlyZV9zcGFjZV9hZnRlcl9udW1iZXIoYm9vbCByZXF1aXJlKSB7CisgICAgcmVxdWlyZV9zcGFjZV9hZnRlcl9udW1iZXJfID0gcmVxdWlyZTsKKyAgfQorCisgIC8vIFdoZXRoZXIgdG8gYWxsb3cgc3RyaW5nIGxpdGVyYWxzIHRvIHNwYW4gbXVsdGlwbGUgbGluZXMuIERlZmF1bHQgaXMgZmFsc2UuCisgIC8vIERvIG5vdCB1c2UgdGhpczsgZm9yIEdvb2dsZS1pbnRlcm5hbCBjbGVhbnVwIG9ubHkuCisgIHZvaWQgc2V0X2FsbG93X211bHRpbGluZV9zdHJpbmdzKGJvb2wgYWxsb3cpIHsKKyAgICBhbGxvd19tdWx0aWxpbmVfc3RyaW5nc18gPSBhbGxvdzsKKyAgfQorCisgIC8vIElmIHRydWUsIHdoaXRlc3BhY2UgdG9rZW5zIGFyZSByZXBvcnRlZCBieSBOZXh0KCkuCisgIC8vIE5vdGU6IGBzZXRfcmVwb3J0X3doaXRlc3BhY2UoZmFsc2UpYCBpbXBsaWVzIGBzZXRfcmVwb3J0X25ld2xpbmVzKGZhbHNlKWAuCisgIGJvb2wgcmVwb3J0X3doaXRlc3BhY2UoKSBjb25zdDsKKyAgdm9pZCBzZXRfcmVwb3J0X3doaXRlc3BhY2UoYm9vbCByZXBvcnQpOworCisgIC8vIElmIHRydWUsIG5ld2xpbmUgdG9rZW5zIGFyZSByZXBvcnRlZCBieSBOZXh0KCkuCisgIC8vIE5vdGU6IGBzZXRfcmVwb3J0X25ld2xpbmVzKHRydWUpYCBpbXBsaWVzIGBzZXRfcmVwb3J0X3doaXRlc3BhY2UodHJ1ZSlgLgorICBib29sIHJlcG9ydF9uZXdsaW5lcygpIGNvbnN0OworICB2b2lkIHNldF9yZXBvcnRfbmV3bGluZXMoYm9vbCByZXBvcnQpOworCisgIC8vIEV4dGVybmFsIGhlbHBlcjogdmFsaWRhdGUgYW4gaWRlbnRpZmllci4KKyAgc3RhdGljIGJvb2wgSXNJZGVudGlmaWVyKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0KTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUb2tlbml6ZXIpOworCisgIFRva2VuIGN1cnJlbnRfOyAgIC8vIFJldHVybmVkIGJ5IGN1cnJlbnQoKS4KKyAgVG9rZW4gcHJldmlvdXNfOyAgLy8gUmV0dXJuZWQgYnkgcHJldmlvdXMoKS4KKworICBaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dF87CisgIEVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3JfOworCisgIGNoYXIgY3VycmVudF9jaGFyXzsgICAvLyA9PSBidWZmZXJfW2J1ZmZlcl9wb3NfXSwgdXBkYXRlZCBieSBOZXh0Q2hhcigpLgorICBjb25zdCBjaGFyKiBidWZmZXJfOyAgLy8gQ3VycmVudCBidWZmZXIgcmV0dXJuZWQgZnJvbSBpbnB1dF8uCisgIGludCBidWZmZXJfc2l6ZV87ICAgICAvLyBTaXplIG9mIGJ1ZmZlcl8uCisgIGludCBidWZmZXJfcG9zXzsgICAgICAvLyBDdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgYnVmZmVyLgorICBib29sIHJlYWRfZXJyb3JfOyAgICAgLy8gRGlkIHdlIHByZXZpb3VzbHkgZW5jb3VudGVyIGEgcmVhZCBlcnJvcj8KKworICAvLyBMaW5lIGFuZCBjb2x1bW4gbnVtYmVyIG9mIGN1cnJlbnRfY2hhcl8gd2l0aGluIHRoZSB3aG9sZSBpbnB1dCBzdHJlYW0uCisgIGludCBsaW5lXzsKKyAgQ29sdW1uTnVtYmVyIGNvbHVtbl87CisKKyAgLy8gU3RyaW5nIHRvIHdoaWNoIHRleHQgc2hvdWxkIGJlIGFwcGVuZGVkIGFzIHdlIGFkdmFuY2UgdGhyb3VnaCBpdC4KKyAgLy8gQ2FsbCBSZWNvcmRUbygmc3RyKSB0byBzdGFydCByZWNvcmRpbmcgYW5kIFN0b3BSZWNvcmRpbmcoKSB0byBzdG9wLgorICAvLyBFLmcuIFN0YXJ0VG9rZW4oKSBjYWxscyBSZWNvcmRUbygmY3VycmVudF8udGV4dCkuICByZWNvcmRfc3RhcnRfIGlzIHRoZQorICAvLyBwb3NpdGlvbiB3aXRoaW4gdGhlIGN1cnJlbnQgYnVmZmVyIHdoZXJlIHJlY29yZGluZyBzdGFydGVkLgorICBzdGQ6OnN0cmluZyogcmVjb3JkX3RhcmdldF87CisgIGludCByZWNvcmRfc3RhcnRfOworCisgIC8vIE9wdGlvbnMuCisgIGJvb2wgYWxsb3dfZl9hZnRlcl9mbG9hdF87CisgIENvbW1lbnRTdHlsZSBjb21tZW50X3N0eWxlXzsKKyAgYm9vbCByZXF1aXJlX3NwYWNlX2FmdGVyX251bWJlcl87CisgIGJvb2wgYWxsb3dfbXVsdGlsaW5lX3N0cmluZ3NfOworICBib29sIHJlcG9ydF93aGl0ZXNwYWNlXyA9IGZhbHNlOworICBib29sIHJlcG9ydF9uZXdsaW5lc18gPSBmYWxzZTsKKworICAvLyBTaW5jZSB3ZSBjb3VudCBjb2x1bW5zIHdlIG5lZWQgdG8gaW50ZXJwcmV0IHRhYnMgc29tZWhvdy4gIFdlJ2xsIHRha2UKKyAgLy8gdGhlIHN0YW5kYXJkIDgtY2hhcmFjdGVyIGRlZmluaXRpb24gZm9yIGxhY2sgb2YgYW55IHdheSB0byBkbyBiZXR0ZXIuCisgIC8vIFRoaXMgbXVzdCBtYXRjaCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBDb2x1bW5OdW1iZXIuCisgIHN0YXRpYyBjb25zdCBpbnQga1RhYldpZHRoID0gODsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBIZWxwZXIgbWV0aG9kcy4KKworICAvLyBDb25zdW1lIHRoaXMgY2hhcmFjdGVyIGFuZCBhZHZhbmNlIHRvIHRoZSBuZXh0IG9uZS4KKyAgdm9pZCBOZXh0Q2hhcigpOworCisgIC8vIFJlYWQgYSBuZXcgYnVmZmVyIGZyb20gdGhlIGlucHV0LgorICB2b2lkIFJlZnJlc2goKTsKKworICBpbmxpbmUgdm9pZCBSZWNvcmRUbyhzdGQ6OnN0cmluZyogdGFyZ2V0KTsKKyAgaW5saW5lIHZvaWQgU3RvcFJlY29yZGluZygpOworCisgIC8vIENhbGxlZCB3aGVuIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgbmV3CisgIC8vIHRva2VuIChub3QgaW5jbHVkaW5nIHdoaXRlc3BhY2Ugb3IgY29tbWVudHMpLgorICBpbmxpbmUgdm9pZCBTdGFydFRva2VuKCk7CisgIC8vIENhbGxlZCB3aGVuIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZQorICAvLyBlbmQgb2YgdGhlIGxhc3QgdG9rZW4uICBBZnRlciB0aGlzIHJldHVybnMsIGN1cnJlbnRfLnRleHQgd2lsbAorICAvLyBjb250YWluIGFsbCB0ZXh0IGNvbnN1bWVkIHNpbmNlIFN0YXJ0VG9rZW4oKSB3YXMgY2FsbGVkLgorICBpbmxpbmUgdm9pZCBFbmRUb2tlbigpOworCisgIC8vIENvbnZlbmllbmNlIG1ldGhvZCB0byBhZGQgYW4gZXJyb3IgYXQgdGhlIGN1cnJlbnQgbGluZSBhbmQgY29sdW1uLgorICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgICAgZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IobGluZV8sIGNvbHVtbl8sIG1lc3NhZ2UpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlIGZvbGxvd2luZyBmb3VyIG1ldGhvZHMgYXJlIHVzZWQgdG8gY29uc3VtZSB0b2tlbnMgb2Ygc3BlY2lmaWMKKyAgLy8gdHlwZXMuICBUaGV5IGFyZSBhY3R1YWxseSB1c2VkIHRvIGNvbnN1bWUgYWxsIGNoYXJhY3RlcnMgKmFmdGVyKgorICAvLyB0aGUgZmlyc3QsIHNpbmNlIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGNvbnN1bWVzIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgLy8gaW4gb3JkZXIgdG8gZGVjaWRlIHdoYXQga2luZCBvZiB0b2tlbiBpcyBiZWluZyByZWFkLgorCisgIC8vIFJlYWQgYW5kIGNvbnN1bWUgYSBzdHJpbmcsIGVuZGluZyB3aGVuIHRoZSBnaXZlbiBkZWxpbWl0ZXIgaXMKKyAgLy8gY29uc3VtZWQuCisgIHZvaWQgQ29uc3VtZVN0cmluZyhjaGFyIGRlbGltaXRlcik7CisKKyAgLy8gUmVhZCBhbmQgY29uc3VtZSBhIG51bWJlciwgcmV0dXJuaW5nIFRZUEVfRkxPQVQgb3IgVFlQRV9JTlRFR0VSCisgIC8vIGRlcGVuZGluZyBvbiB3aGF0IHdhcyByZWFkLiAgVGhpcyBuZWVkcyB0byBrbm93IGlmIHRoZSBmaXJzdAorICAvLyBjaGFyYWN0ZXIgd2FzIGEgemVybyBpbiBvcmRlciB0byBjb3JyZWN0bHkgcmVjb2duaXplIGhleCBhbmQgb2N0YWwKKyAgLy8gbnVtYmVycy4KKyAgLy8gSXQgYWxzbyBuZWVkcyB0byBrbm93IGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgd2FzIGEgLiB0byBwYXJzZSBmbG9hdGluZworICAvLyBwb2ludCBjb3JyZWN0bHkuCisgIFRva2VuVHlwZSBDb25zdW1lTnVtYmVyKGJvb2wgc3RhcnRlZF93aXRoX3plcm8sIGJvb2wgc3RhcnRlZF93aXRoX2RvdCk7CisKKyAgLy8gQ29uc3VtZSB0aGUgcmVzdCBvZiBhIGxpbmUuCisgIHZvaWQgQ29uc3VtZUxpbmVDb21tZW50KHN0ZDo6c3RyaW5nKiBjb250ZW50KTsKKyAgLy8gQ29uc3VtZSB1bnRpbCAiKi8iLgorICB2b2lkIENvbnN1bWVCbG9ja0NvbW1lbnQoc3RkOjpzdHJpbmcqIGNvbnRlbnQpOworCisgIGVudW0gTmV4dENvbW1lbnRTdGF0dXMgeworICAgIC8vIFN0YXJ0ZWQgYSBsaW5lIGNvbW1lbnQuCisgICAgTElORV9DT01NRU5ULAorCisgICAgLy8gU3RhcnRlZCBhIGJsb2NrIGNvbW1lbnQuCisgICAgQkxPQ0tfQ09NTUVOVCwKKworICAgIC8vIENvbnN1bWVkIGEgc2xhc2gsIHRoZW4gcmVhbGl6ZWQgaXQgd2Fzbid0IGEgY29tbWVudC4gIGN1cnJlbnRfIGhhcworICAgIC8vIGJlZW4gZmlsbGVkIGluIHdpdGggYSBzbGFzaCB0b2tlbi4gIFRoZSBjYWxsZXIgc2hvdWxkIHJldHVybiBpdC4KKyAgICBTTEFTSF9OT1RfQ09NTUVOVCwKKworICAgIC8vIFdlIGRvIG5vdCBhcHBlYXIgdG8gYmUgc3RhcnRpbmcgYSBjb21tZW50IGhlcmUuCisgICAgTk9fQ09NTUVOVAorICB9OworCisgIC8vIElmIHdlJ3JlIGF0IHRoZSBzdGFydCBvZiBhIG5ldyBjb21tZW50LCBjb25zdW1lIGl0IGFuZCByZXR1cm4gd2hhdCBraW5kCisgIC8vIG9mIGNvbW1lbnQgaXQgaXMuCisgIE5leHRDb21tZW50U3RhdHVzIFRyeUNvbnN1bWVDb21tZW50U3RhcnQoKTsKKworICAvLyBJZiB3ZSdyZSBsb29raW5nIGF0IGEgVFlQRV9XSElURVNQQUNFIHRva2VuIGFuZCBgcmVwb3J0X3doaXRlc3BhY2VfYCBpcworICAvLyB0cnVlLCBjb25zdW1lIGl0IGFuZCByZXR1cm4gdHJ1ZS4KKyAgYm9vbCBUcnlDb25zdW1lV2hpdGVzcGFjZSgpOworCisgIC8vIElmIHdlJ3JlIGxvb2tpbmcgYXQgYSBUWVBFX05FV0xJTkUgdG9rZW4gYW5kIGByZXBvcnRfbmV3bGluZXNfYCBpcyB0cnVlLAorICAvLyBjb25zdW1lIGl0IGFuZCByZXR1cm4gdHJ1ZS4KKyAgYm9vbCBUcnlDb25zdW1lTmV3bGluZSgpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRoZXNlIGhlbHBlciBtZXRob2RzIG1ha2UgdGhlIHBhcnNpbmcgY29kZSBtb3JlIHJlYWRhYmxlLiAgVGhlCisgIC8vICJjaGFyYWN0ZXIgY2xhc3NlcyIgcmVmZXJyZWQgdG8gYXJlIGRlZmluZWQgYXQgdGhlIHRvcCBvZiB0aGUgLmNjIGZpbGUuCisgIC8vIEJhc2ljYWxseSBpdCBpcyBhIEMrKyBjbGFzcyB3aXRoIG9uZSBtZXRob2Q6CisgIC8vICAgc3RhdGljIGJvb2wgSW5DbGFzcyhjaGFyIGMpOworICAvLyBUaGUgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiBjIGlzIGEgbWVtYmVyIG9mIHRoaXMgImNsYXNzIiwgbGlrZSAiTGV0dGVyIgorICAvLyBvciAiRGlnaXQiLgorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgb2YgdGhlIGdpdmVuIGNoYXJhY3RlcgorICAvLyBjbGFzcywgYnV0IGRvZXMgbm90IGNvbnN1bWUgYW55dGhpbmcuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KKyAgaW5saW5lIGJvb2wgTG9va2luZ0F0KCk7CisKKyAgLy8gSWYgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIGluIHRoZSBnaXZlbiBjbGFzcywgY29uc3VtZSBpdCBhbmQgcmV0dXJuCisgIC8vIHRydWUuICBPdGhlcndpc2UgcmV0dXJuIGZhbHNlLgorICAvLyBlLmcuIFRyeUNvbnN1bWVPbmU8TGV0dGVyPigpCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KKyAgaW5saW5lIGJvb2wgVHJ5Q29uc3VtZU9uZSgpOworCisgIC8vIExpa2UgYWJvdmUsIGJ1dCB0cnkgdG8gY29uc3VtZSB0aGUgc3BlY2lmaWMgY2hhcmFjdGVyIGluZGljYXRlZC4KKyAgaW5saW5lIGJvb2wgVHJ5Q29uc3VtZShjaGFyIGMpOworCisgIC8vIENvbnN1bWUgemVybyBvciBtb3JlIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIgY2xhc3MuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KKyAgaW5saW5lIHZvaWQgQ29uc3VtZVplcm9Pck1vcmUoKTsKKworICAvLyBDb25zdW1lIG9uZSBvciBtb3JlIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIgY2xhc3Mgb3IgbG9nIHRoZSBnaXZlbgorICAvLyBlcnJvciBtZXNzYWdlLgorICAvLyBlLmcuIENvbnN1bWVPbmVPck1vcmU8RGlnaXQ+KCJFeHBlY3RlZCBkaWdpdHMuIik7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KKyAgaW5saW5lIHZvaWQgQ29uc3VtZU9uZU9yTW9yZShjb25zdCBjaGFyKiBlcnJvcik7Cit9OworCisvLyBpbmxpbmUgbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitpbmxpbmUgY29uc3QgVG9rZW5pemVyOjpUb2tlbiYgVG9rZW5pemVyOjpjdXJyZW50KCkgeyByZXR1cm4gY3VycmVudF87IH0KKworaW5saW5lIGNvbnN0IFRva2VuaXplcjo6VG9rZW4mIFRva2VuaXplcjo6cHJldmlvdXMoKSB7IHJldHVybiBwcmV2aW91c187IH0KKworaW5saW5lIHZvaWQgVG9rZW5pemVyOjpQYXJzZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dHB1dCkgeworICBvdXRwdXQtPmNsZWFyKCk7CisgIFBhcnNlU3RyaW5nQXBwZW5kKHRleHQsIG91dHB1dCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lPX1RPS0VOSVpFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXJfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiYTk0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTE3NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oPgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKK25hbWVzcGFjZSB7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERhdGEtRHJpdmVuIFRlc3QgSW5mcmFzdHJ1Y3R1cmUKKworLy8gVE9ETyhrZW50b24pOiAgVGhpcyBpcyBjb3BpZWQgZnJvbSBjb2RlZF9zdHJlYW1fdW5pdHRlc3QuICBUaGlzIGlzCisvLyAgIHRlbXBvcmFyeSB1bnRpbCB0aGVzZSBmZWF0dXJlcyBhcmUgaW50ZWdyYXRlZCBpbnRvIGdUZXN0IGl0c2VsZi4KKworLy8gVEVTVF8xRCBhbmQgVEVTVF8yRCBhcmUgbWFjcm9zIEknZCBldmVudHVhbGx5IGxpa2UgdG8gc2VlIGFkZGVkIHRvCisvLyBnVGVzdC4gIFRoZXNlIG1hY3JvcyBjYW4gYmUgdXNlZCB0byBkZWNsYXJlIHRlc3RzIHdoaWNoIHNob3VsZCBiZQorLy8gcnVuIG11bHRpcGxlIHRpbWVzLCBvbmNlIGZvciBlYWNoIGl0ZW0gaW4gc29tZSBpbnB1dCBhcnJheS4gIFRFU1RfMUQKKy8vIHRlc3RzIGFsbCBjYXNlcyBpbiBhIHNpbmdsZSBpbnB1dCBhcnJheS4gIFRFU1RfMkQgdGVzdHMgYWxsCisvLyBjb21iaW5hdGlvbnMgb2YgY2FzZXMgZnJvbSB0d28gYXJyYXlzLiAgVGhlIGFycmF5cyBtdXN0IGJlIHN0YXRpY2FsbHkKKy8vIGRlZmluZWQgc3VjaCB0aGF0IHRoZSBHT09HTEVfQVJSQVlTSVpFKCkgbWFjcm8gd29ya3Mgb24gdGhlbS4gIEV4YW1wbGU6CisvLworLy8gaW50IGtDYXNlc1tdID0gezEsIDIsIDMsIDR9CisvLyBURVNUXzFEKE15Rml4dHVyZSwgTXlUZXN0LCBrQ2FzZXMpIHsKKy8vICAgRVhQRUNUX0dUKGtDYXNlc19jYXNlLCAwKTsKKy8vIH0KKy8vCisvLyBUaGlzIHRlc3QgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgbnVtYmVycyAxLCAyLCAzLCBhbmQgNCBhbmQgdGVzdHMgdGhhdAorLy8gdGhleSBhcmUgYWxsIGdyYXRlciB0aGFuIHplcm8uICBJbiBjYXNlIG9mIGZhaWx1cmUsIHRoZSBleGFjdCBjYXNlCisvLyB3aGljaCBmYWlsZWQgd2lsbCBiZSBwcmludGVkLiAgVGhlIGNhc2UgdHlwZSBtdXN0IGJlIHByaW50YWJsZSB1c2luZworLy8gb3N0cmVhbTo6b3BlcmF0b3I8PC4KKworI2RlZmluZSBURVNUXzFEKEZJWFRVUkUsIE5BTUUsIENBU0VTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyBGSVhUVVJFIyNfIyNOQU1FIyNfREQgOiBwdWJsaWMgRklYVFVSRSB7ICAgICAgICAgICAgICAgICAgXAorICAgcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYXNlVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgRG9TaW5nbGVDYXNlKGNvbnN0IENhc2VUeXBlJiBDQVNFUyMjX2Nhc2UpOyAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBURVNUX0YoRklYVFVSRSMjXyMjTkFNRSMjX0RELCBOQU1FKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShDQVNFUyk7IGkrKykgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICA8PCAjQ0FTRVMgIiBjYXNlICMiIDw8IGkgPDwgIjogIiA8PCBDQVNFU1tpXSk7IFwKKyAgICAgIERvU2luZ2xlQ2FzZShDQVNFU1tpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENhc2VUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBGSVhUVVJFIyNfIyNOQU1FIyNfREQ6OkRvU2luZ2xlQ2FzZShjb25zdCBDYXNlVHlwZSYgQ0FTRVMjI19jYXNlKQorCisjZGVmaW5lIFRFU1RfMkQoRklYVFVSRSwgTkFNRSwgQ0FTRVMxLCBDQVNFUzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyBGSVhUVVJFIyNfIyNOQU1FIyNfREQgOiBwdWJsaWMgRklYVFVSRSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIENhc2VUeXBlMSwgdHlwZW5hbWUgQ2FzZVR5cGUyPiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgRG9TaW5nbGVDYXNlKGNvbnN0IENhc2VUeXBlMSYgQ0FTRVMxIyNfY2FzZSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXNlVHlwZTImIENBU0VTMiMjX2Nhc2UpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEVTVF9GKEZJWFRVUkUjI18jI05BTUUjI19ERCwgTkFNRSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKENBU0VTMSk7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgR09PR0xFX0FSUkFZU0laRShDQVNFUzIpOyBqKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTQ09QRURfVFJBQ0UodGVzdGluZzo6TWVzc2FnZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIDw8ICNDQVNFUzEgIiBjYXNlICMiIDw8IGkgPDwgIjogIiA8PCBDQVNFUzFbaV0gPDwgIiwgIiBcCisgICAgICAgICAgICAgICAgICAgICA8PCAjQ0FTRVMyICIgY2FzZSAjIiA8PCBqIDw8ICI6ICIgPDwgQ0FTRVMyW2pdKTsgICAgICAgXAorICAgICAgICBEb1NpbmdsZUNhc2UoQ0FTRVMxW2ldLCBDQVNFUzJbal0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYXNlVHlwZTEsIHR5cGVuYW1lIENhc2VUeXBlMj4gICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEZJWFRVUkUjI18jI05BTUUjI19ERDo6RG9TaW5nbGVDYXNlKGNvbnN0IENhc2VUeXBlMSYgQ0FTRVMxIyNfY2FzZSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXNlVHlwZTImIENBU0VTMiMjX2Nhc2UpCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQW4gaW5wdXQgc3RyZWFtIHRoYXQgaXMgYmFzaWNhbGx5IGxpa2UgYW4gQXJyYXlJbnB1dFN0cmVhbSBidXQgc29tZXRpbWVzCisvLyByZXR1cm5zIGVtcHR5IGJ1ZmZlcnMsIGp1c3QgdG8gdGhyb3cgdXMgb2ZmLgorY2xhc3MgVGVzdElucHV0U3RyZWFtIDogcHVibGljIFplcm9Db3B5SW5wdXRTdHJlYW0geworIHB1YmxpYzoKKyAgVGVzdElucHV0U3RyZWFtKGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLCBpbnQgYmxvY2tfc2l6ZSkKKyAgICAgIDogYXJyYXlfc3RyZWFtXyhkYXRhLCBzaXplLCBibG9ja19zaXplKSwgY291bnRlcl8oMCkge30KKyAgflRlc3RJbnB1dFN0cmVhbSgpIHt9CisKKyAgLy8gaW1wbGVtZW50cyBaZXJvQ29weUlucHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIG92ZXJyaWRlIHsKKyAgICAvLyBXZSdsbCByZXR1cm4gZW1wdHkgYnVmZmVycyBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBidWZmZXIsIGFuZCBldmVyeQorICAgIC8vIDMgYW5kIDUgYnVmZmVycyBhZnRlciB0aGF0LgorICAgIGlmIChjb3VudGVyXyAlIDMgPT0gMCB8fCBjb3VudGVyXyAlIDUgPT0gMCkgeworICAgICAgKmRhdGEgPSBOVUxMOworICAgICAgKnNpemUgPSAwOworICAgICAgKytjb3VudGVyXzsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICArK2NvdW50ZXJfOworICAgICAgcmV0dXJuIGFycmF5X3N0cmVhbV8uTmV4dChkYXRhLCBzaXplKTsKKyAgICB9CisgIH0KKworICB2b2lkIEJhY2tVcChpbnQgY291bnQpIG92ZXJyaWRlIHsgcmV0dXJuIGFycmF5X3N0cmVhbV8uQmFja1VwKGNvdW50KTsgfQorICBib29sIFNraXAoaW50IGNvdW50KSBvdmVycmlkZSB7IHJldHVybiBhcnJheV9zdHJlYW1fLlNraXAoY291bnQpOyB9CisgIGludDY0X3QgQnl0ZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gYXJyYXlfc3RyZWFtXy5CeXRlQ291bnQoKTsgfQorCisgcHJpdmF0ZToKKyAgQXJyYXlJbnB1dFN0cmVhbSBhcnJheV9zdHJlYW1fOworICBpbnQgY291bnRlcl87Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEFuIGVycm9yIGNvbGxlY3RvciB3aGljaCBzaW1wbHkgY29uY2F0ZW5hdGVzIGFsbCBpdHMgZXJyb3JzIGludG8gYSBiaWcKKy8vIGJsb2NrIG9mIHRleHQgd2hpY2ggY2FuIGJlIGNoZWNrZWQuCitjbGFzcyBUZXN0RXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgRXJyb3JDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgVGVzdEVycm9yQ29sbGVjdG9yKCkge30KKyAgflRlc3RFcnJvckNvbGxlY3RvcigpIHt9CisKKyAgc3RkOjpzdHJpbmcgdGV4dF87CisKKyAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBBZGRFcnJvcihpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZ0ZXh0XywgIiQwOiQxOiAkMlxuIiwgbGluZSwgY29sdW1uLCBtZXNzYWdlKTsKKyAgfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBXZSB0ZXN0IGVhY2ggb3BlcmF0aW9uIG92ZXIgYSB2YXJpZXR5IG9mIGJsb2NrIHNpemVzIHRvIGluc3VyZSB0aGF0CisvLyB3ZSB0ZXN0IGNhc2VzIHdoZXJlIHJlYWRzIGNyb3NzIGJ1ZmZlciBib3VuZGFyaWVzIGFzIHdlbGwgYXMgY2FzZXMKKy8vIHdoZXJlIHRoZXkgZG9uJ3QuICBUaGlzIGlzIHNvcnQgb2YgYSBicnV0ZS1mb3JjZSBhcHByb2FjaCB0byB0aGlzLAorLy8gYnV0IGl0J3MgZWFzeSB0byB3cml0ZSBhbmQgZWFzeSB0byB1bmRlcnN0YW5kLgorY29uc3QgaW50IGtCbG9ja1NpemVzW10gPSB7MSwgMiwgMywgNSwgNywgMTMsIDMyLCAxMDI0fTsKKworY2xhc3MgVG9rZW5pemVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIEZvciBlYXN5IHRlc3RpbmcuCisgIHVpbnQ2NF90IFBhcnNlSW50ZWdlcihjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCkgeworICAgIHVpbnQ2NF90IHJlc3VsdDsKKyAgICBFWFBFQ1RfVFJVRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcih0ZXh0LCBrdWludDY0bWF4LCAmcmVzdWx0KSkKKyAgICAgICAgPDwgIiciIDw8IHRleHQgPDwgIiciOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVGhlc2UgdGVzdHMgY2F1c2VzIGdjYyAzLjMuNSAoYW5kIGVhcmxpZXI/KSB0byBnaXZlIHRoZSBjcnlwdGljIGVycm9yOgorLy8gICAic29ycnksIHVuaW1wbGVtZW50ZWQ6IGBtZXRob2RfY2FsbF9leHByJyBub3Qgc3VwcG9ydGVkIGJ5IGR1bXBfZXhwciIKKyNpZiAhZGVmaW5lZChfX0dOVUNfXykgfHwgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID4gMykKKworLy8gSW4gZWFjaCB0ZXN0IGNhc2UsIHRoZSBlbnRpcmUgaW5wdXQgdGV4dCBzaG91bGQgcGFyc2UgYXMgYSBzaW5nbGUgdG9rZW4KKy8vIG9mIHRoZSBnaXZlbiB0eXBlLgorc3RydWN0IFNpbXBsZVRva2VuQ2FzZSB7CisgIHN0ZDo6c3RyaW5nIGlucHV0OworICBUb2tlbml6ZXI6OlRva2VuVHlwZSB0eXBlOworfTsKKworaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxlVG9rZW5DYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgcmV0dXJuIG91dCA8PCBDRXNjYXBlKHRlc3RfY2FzZS5pbnB1dCk7Cit9CisKK1NpbXBsZVRva2VuQ2FzZSBrU2ltcGxlVG9rZW5DYXNlc1tdID0geworICAgIC8vIFRlc3QgaWRlbnRpZmllcnMuCisgICAgeyJoZWxsbyIsIFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSfSwKKworICAgIC8vIFRlc3QgaW50ZWdlcnMuCisgICAgeyIxMjMiLCBUb2tlbml6ZXI6OlRZUEVfSU5URUdFUn0sCisgICAgeyIweGFiNiIsIFRva2VuaXplcjo6VFlQRV9JTlRFR0VSfSwKKyAgICB7IjBYQUI2IiwgVG9rZW5pemVyOjpUWVBFX0lOVEVHRVJ9LAorICAgIHsiMFgxMjM0NTY3IiwgVG9rZW5pemVyOjpUWVBFX0lOVEVHRVJ9LAorICAgIHsiMHg4OWFiY2RlZiIsIFRva2VuaXplcjo6VFlQRV9JTlRFR0VSfSwKKyAgICB7IjB4ODlBQkNERUYiLCBUb2tlbml6ZXI6OlRZUEVfSU5URUdFUn0sCisgICAgeyIwMTIzNDU2NyIsIFRva2VuaXplcjo6VFlQRV9JTlRFR0VSfSwKKworICAgIC8vIFRlc3QgZmxvYXRzLgorICAgIHsiMTIzLjQ1IiwgVG9rZW5pemVyOjpUWVBFX0ZMT0FUfSwKKyAgICB7IjEuIiwgVG9rZW5pemVyOjpUWVBFX0ZMT0FUfSwKKyAgICB7IjFlMyIsIFRva2VuaXplcjo6VFlQRV9GTE9BVH0sCisgICAgeyIxRTMiLCBUb2tlbml6ZXI6OlRZUEVfRkxPQVR9LAorICAgIHsiMWUtMyIsIFRva2VuaXplcjo6VFlQRV9GTE9BVH0sCisgICAgeyIxZSszIiwgVG9rZW5pemVyOjpUWVBFX0ZMT0FUfSwKKyAgICB7IjEuZTMiLCBUb2tlbml6ZXI6OlRZUEVfRkxPQVR9LAorICAgIHsiMS4yZTMiLCBUb2tlbml6ZXI6OlRZUEVfRkxPQVR9LAorICAgIHsiLjEiLCBUb2tlbml6ZXI6OlRZUEVfRkxPQVR9LAorICAgIHsiLjFlMyIsIFRva2VuaXplcjo6VFlQRV9GTE9BVH0sCisgICAgeyIuMWUtMyIsIFRva2VuaXplcjo6VFlQRV9GTE9BVH0sCisgICAgeyIuMWUrMyIsIFRva2VuaXplcjo6VFlQRV9GTE9BVH0sCisKKyAgICAvLyBUZXN0IHN0cmluZ3MuCisgICAgeyInaGVsbG8nIiwgVG9rZW5pemVyOjpUWVBFX1NUUklOR30sCisgICAgeyJcImZvb1wiIiwgVG9rZW5pemVyOjpUWVBFX1NUUklOR30sCisgICAgeyInYVwiYiciLCBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HfSwKKyAgICB7IlwiYSdiXCIiLCBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HfSwKKyAgICB7IidhXFwnYiciLCBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HfSwKKyAgICB7IlwiYVxcXCJiXCIiLCBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HfSwKKyAgICB7IidcXHhmJyIsIFRva2VuaXplcjo6VFlQRV9TVFJJTkd9LAorICAgIHsiJ1xcMCciLCBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HfSwKKworICAgIC8vIFRlc3Qgc3ltYm9scy4KKyAgICB7IisiLCBUb2tlbml6ZXI6OlRZUEVfU1lNQk9MfSwKKyAgICB7Ii4iLCBUb2tlbml6ZXI6OlRZUEVfU1lNQk9MfSwKK307CisKK1RFU1RfMkQoVG9rZW5pemVyVGVzdCwgU2ltcGxlVG9rZW5zLCBrU2ltcGxlVG9rZW5DYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgLy8gU2V0IHVwIHRoZSB0b2tlbml6ZXIuCisgIFRlc3RJbnB1dFN0cmVhbSBpbnB1dChrU2ltcGxlVG9rZW5DYXNlc19jYXNlLmlucHV0LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtTaW1wbGVUb2tlbkNhc2VzX2Nhc2UuaW5wdXQuc2l6ZSgpLCBrQmxvY2tTaXplc19jYXNlKTsKKyAgVGVzdEVycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKKyAgVG9rZW5pemVyIHRva2VuaXplcigmaW5wdXQsICZlcnJvcl9jb2xsZWN0b3IpOworCisgIC8vIEJlZm9yZSBOZXh0KCkgaXMgY2FsbGVkLCB0aGUgaW5pdGlhbCB0b2tlbiBzaG91bGQgYWx3YXlzIGJlIFRZUEVfU1RBUlQuCisgIEVYUEVDVF9FUShUb2tlbml6ZXI6OlRZUEVfU1RBUlQsIHRva2VuaXplci5jdXJyZW50KCkudHlwZSk7CisgIEVYUEVDVF9FUSgiIiwgdG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0KTsKKyAgRVhQRUNUX0VRKDAsIHRva2VuaXplci5jdXJyZW50KCkubGluZSk7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmNvbHVtbik7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmVuZF9jb2x1bW4pOworCisgIC8vIFBhcnNlIHRoZSB0b2tlbi4KKyAgQVNTRVJUX1RSVUUodG9rZW5pemVyLk5leHQoKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBpdCBoYXMgdGhlIHJpZ2h0IHR5cGUuCisgIEVYUEVDVF9FUShrU2ltcGxlVG9rZW5DYXNlc19jYXNlLnR5cGUsIHRva2VuaXplci5jdXJyZW50KCkudHlwZSk7CisgIC8vIENoZWNrIHRoYXQgaXQgY29udGFpbnMgdGhlIGNvbXBsZXRlIGlucHV0IHRleHQuCisgIEVYUEVDVF9FUShrU2ltcGxlVG9rZW5DYXNlc19jYXNlLmlucHV0LCB0b2tlbml6ZXIuY3VycmVudCgpLnRleHQpOworICAvLyBDaGVjayB0aGF0IGl0IGlzIGxvY2F0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQKKyAgRVhQRUNUX0VRKDAsIHRva2VuaXplci5jdXJyZW50KCkubGluZSk7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmNvbHVtbik7CisgIEVYUEVDVF9FUShrU2ltcGxlVG9rZW5DYXNlc19jYXNlLmlucHV0LnNpemUoKSwKKyAgICAgICAgICAgIHRva2VuaXplci5jdXJyZW50KCkuZW5kX2NvbHVtbik7CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIG1vcmUgaW5wdXQuCisgIEVYUEVDVF9GQUxTRSh0b2tlbml6ZXIuTmV4dCgpKTsKKworICAvLyBBZnRlciBOZXh0KCkgcmV0dXJucyBmYWxzZSwgdGhlIHRva2VuIHNob3VsZCBoYXZlIHR5cGUgVFlQRV9FTkQuCisgIEVYUEVDVF9FUShUb2tlbml6ZXI6OlRZUEVfRU5ELCB0b2tlbml6ZXIuY3VycmVudCgpLnR5cGUpOworICBFWFBFQ1RfRVEoIiIsIHRva2VuaXplci5jdXJyZW50KCkudGV4dCk7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmxpbmUpOworICBFWFBFQ1RfRVEoa1NpbXBsZVRva2VuQ2FzZXNfY2FzZS5pbnB1dC5zaXplKCksIHRva2VuaXplci5jdXJyZW50KCkuY29sdW1uKTsKKyAgRVhQRUNUX0VRKGtTaW1wbGVUb2tlbkNhc2VzX2Nhc2UuaW5wdXQuc2l6ZSgpLAorICAgICAgICAgICAgdG9rZW5pemVyLmN1cnJlbnQoKS5lbmRfY29sdW1uKTsKKworICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gZXJyb3JzLgorICBFWFBFQ1RfVFJVRShlcnJvcl9jb2xsZWN0b3IudGV4dF8uZW1wdHkoKSk7Cit9CisKK1RFU1RfMUQoVG9rZW5pemVyVGVzdCwgRmxvYXRTdWZmaXgsIGtCbG9ja1NpemVzKSB7CisgIC8vIFRlc3QgdGhlICJhbGxvd19mX2FmdGVyX2Zsb2F0IiBvcHRpb24uCisKKyAgLy8gU2V0IHVwIHRoZSB0b2tlbml6ZXIuCisgIGNvbnN0IGNoYXIqIHRleHQgPSAiMWYgMi41ZiA2ZTNmIDdGIjsKKyAgVGVzdElucHV0U3RyZWFtIGlucHV0KHRleHQsIHN0cmxlbih0ZXh0KSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisgIFRlc3RFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIFRva2VuaXplciB0b2tlbml6ZXIoJmlucHV0LCAmZXJyb3JfY29sbGVjdG9yKTsKKyAgdG9rZW5pemVyLnNldF9hbGxvd19mX2FmdGVyX2Zsb2F0KHRydWUpOworCisgIC8vIEFkdmFuY2UgdGhyb3VnaCB0b2tlbnMgYW5kIGNoZWNrIHRoYXQgdGhleSBhcmUgcGFyc2VkIGFzIGV4cGVjdGVkLgorICBBU1NFUlRfVFJVRSh0b2tlbml6ZXIuTmV4dCgpKTsKKyAgRVhQRUNUX0VRKHRva2VuaXplci5jdXJyZW50KCkudGV4dCwgIjFmIik7CisgIEVYUEVDVF9FUSh0b2tlbml6ZXIuY3VycmVudCgpLnR5cGUsIFRva2VuaXplcjo6VFlQRV9GTE9BVCk7CisgIEFTU0VSVF9UUlVFKHRva2VuaXplci5OZXh0KCkpOworICBFWFBFQ1RfRVEodG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0LCAiMi41ZiIpOworICBFWFBFQ1RfRVEodG9rZW5pemVyLmN1cnJlbnQoKS50eXBlLCBUb2tlbml6ZXI6OlRZUEVfRkxPQVQpOworICBBU1NFUlRfVFJVRSh0b2tlbml6ZXIuTmV4dCgpKTsKKyAgRVhQRUNUX0VRKHRva2VuaXplci5jdXJyZW50KCkudGV4dCwgIjZlM2YiKTsKKyAgRVhQRUNUX0VRKHRva2VuaXplci5jdXJyZW50KCkudHlwZSwgVG9rZW5pemVyOjpUWVBFX0ZMT0FUKTsKKyAgQVNTRVJUX1RSVUUodG9rZW5pemVyLk5leHQoKSk7CisgIEVYUEVDVF9FUSh0b2tlbml6ZXIuY3VycmVudCgpLnRleHQsICI3RiIpOworICBFWFBFQ1RfRVEodG9rZW5pemVyLmN1cnJlbnQoKS50eXBlLCBUb2tlbml6ZXI6OlRZUEVfRkxPQVQpOworCisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIGlucHV0LgorICBFWFBFQ1RfRkFMU0UodG9rZW5pemVyLk5leHQoKSk7CisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBlcnJvcnMuCisgIEVYUEVDVF9UUlVFKGVycm9yX2NvbGxlY3Rvci50ZXh0Xy5lbXB0eSgpKTsKK30KKworU2ltcGxlVG9rZW5DYXNlIGtXaGl0ZXNwYWNlVG9rZW5DYXNlc1tdID0geworICAgIHsiICIsIFRva2VuaXplcjo6VFlQRV9XSElURVNQQUNFfSwKKyAgICB7IiAgICAiLCBUb2tlbml6ZXI6OlRZUEVfV0hJVEVTUEFDRX0sCisgICAgeyJcdCIsIFRva2VuaXplcjo6VFlQRV9XSElURVNQQUNFfSwKKyAgICB7Ilx2IiwgVG9rZW5pemVyOjpUWVBFX1dISVRFU1BBQ0V9LAorICAgIHsiXHQgIiwgVG9rZW5pemVyOjpUWVBFX1dISVRFU1BBQ0V9LAorICAgIHsiXHZcdCIsIFRva2VuaXplcjo6VFlQRV9XSElURVNQQUNFfSwKKyAgICB7IiAgIFx0XHIiLCBUb2tlbml6ZXI6OlRZUEVfV0hJVEVTUEFDRX0sCisgICAgLy8gTmV3bGluZXM6CisgICAgeyJcbiIsIFRva2VuaXplcjo6VFlQRV9ORVdMSU5FfSwKK307CisKK1RFU1RfMkQoVG9rZW5pemVyVGVzdCwgV2hpdGVzcGFjZSwga1doaXRlc3BhY2VUb2tlbkNhc2VzLCBrQmxvY2tTaXplcykgeworICB7CisgICAgVGVzdElucHV0U3RyZWFtIGlucHV0KGtXaGl0ZXNwYWNlVG9rZW5DYXNlc19jYXNlLmlucHV0LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga1doaXRlc3BhY2VUb2tlbkNhc2VzX2Nhc2UuaW5wdXQuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc19jYXNlKTsKKyAgICBUZXN0RXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICAgIFRva2VuaXplciB0b2tlbml6ZXIoJmlucHV0LCAmZXJyb3JfY29sbGVjdG9yKTsKKworICAgIEVYUEVDVF9GQUxTRSh0b2tlbml6ZXIuTmV4dCgpKTsKKyAgfQorICB7CisgICAgVGVzdElucHV0U3RyZWFtIGlucHV0KGtXaGl0ZXNwYWNlVG9rZW5DYXNlc19jYXNlLmlucHV0LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga1doaXRlc3BhY2VUb2tlbkNhc2VzX2Nhc2UuaW5wdXQuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc19jYXNlKTsKKyAgICBUZXN0RXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICAgIFRva2VuaXplciB0b2tlbml6ZXIoJmlucHV0LCAmZXJyb3JfY29sbGVjdG9yKTsKKyAgICB0b2tlbml6ZXIuc2V0X3JlcG9ydF93aGl0ZXNwYWNlKHRydWUpOworICAgIHRva2VuaXplci5zZXRfcmVwb3J0X25ld2xpbmVzKHRydWUpOworCisgICAgQVNTRVJUX1RSVUUodG9rZW5pemVyLk5leHQoKSk7CisgICAgRVhQRUNUX0VRKHRva2VuaXplci5jdXJyZW50KCkudGV4dCwga1doaXRlc3BhY2VUb2tlbkNhc2VzX2Nhc2UuaW5wdXQpOworICAgIEVYUEVDVF9FUSh0b2tlbml6ZXIuY3VycmVudCgpLnR5cGUsIGtXaGl0ZXNwYWNlVG9rZW5DYXNlc19jYXNlLnR5cGUpOworCisgICAgRVhQRUNUX0ZBTFNFKHRva2VuaXplci5OZXh0KCkpOworICB9Cit9CisKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEluIGVhY2ggY2FzZSwgdGhlIGlucHV0IGlzIHBhcnNlZCB0byBwcm9kdWNlIGEgbGlzdCBvZiB0b2tlbnMuICBUaGUKKy8vIGxhc3QgdG9rZW4gaW4gIm91dHB1dCIgbXVzdCBoYXZlIHR5cGUgVFlQRV9FTkQuCitzdHJ1Y3QgTXVsdGlUb2tlbkNhc2UgeworICBzdGQ6OnN0cmluZyBpbnB1dDsKKyAgc3RkOjp2ZWN0b3I8VG9rZW5pemVyOjpUb2tlbj4gb3V0cHV0OworfTsKKworaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlUb2tlbkNhc2UmIHRlc3RfY2FzZSkgeworICByZXR1cm4gb3V0IDw8IENFc2NhcGUodGVzdF9jYXNlLmlucHV0KTsKK30KKworTXVsdGlUb2tlbkNhc2Uga011bHRpVG9rZW5DYXNlc1tdID0geworICAgIC8vIFRlc3QgZW1wdHkgaW5wdXQuCisgICAgeyIiLAorICAgICB7CisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX0VORCwgIiIsIDAsIDAsIDB9LAorICAgICB9fSwKKworICAgIC8vIFRlc3QgYWxsIHRva2VuIHR5cGVzIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgeyJmb28gMSAxLjIgKyAnYmFyJyIsCisgICAgIHsKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImZvbyIsIDAsIDAsIDN9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9JTlRFR0VSLCAiMSIsIDAsIDQsIDV9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9GTE9BVCwgIjEuMiIsIDAsIDYsIDl9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9TWU1CT0wsICIrIiwgMCwgMTAsIDExfSwKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfU1RSSU5HLCAiJ2JhciciLCAwLCAxMiwgMTd9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9FTkQsICIiLCAwLCAxNywgMTd9LAorICAgICB9fSwKKworICAgIC8vIFRlc3QgdGhhdCBjb25zZWN1dGl2ZSBzeW1ib2xzIGFyZSBwYXJzZWQgYXMgc2VwYXJhdGUgdG9rZW5zLgorICAgIHsiIUArJSIsCisgICAgIHsKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfU1lNQk9MLCAiISIsIDAsIDAsIDF9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9TWU1CT0wsICJAIiwgMCwgMSwgMn0sCisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX1NZTUJPTCwgIisiLCAwLCAyLCAzfSwKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfU1lNQk9MLCAiJSIsIDAsIDMsIDR9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9FTkQsICIiLCAwLCA0LCA0fSwKKyAgICAgfX0sCisKKyAgICAvLyBUZXN0IHRoYXQgbmV3bGluZXMgYWZmZWN0IGxpbmUgbnVtYmVycyBjb3JyZWN0bHkuCisgICAgeyJmb28gYmFyXG5yYWIgb29mIiwKKyAgICAgeworICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiZm9vIiwgMCwgMCwgM30sCisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJiYXIiLCAwLCA0LCA3fSwKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgInJhYiIsIDEsIDAsIDN9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAib29mIiwgMSwgNCwgN30sCisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX0VORCwgIiIsIDEsIDcsIDd9LAorICAgICB9fSwKKworICAgIC8vIFRlc3QgdGhhdCB0YWJzIGFmZmVjdCBjb2x1bW4gbnVtYmVycyBjb3JyZWN0bHkuCisgICAgeyJmb29cdGJhciAgXHRiYXoiLAorICAgICB7CisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJmb28iLCAwLCAwLCAzfSwKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImJhciIsIDAsIDgsIDExfSwKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImJheiIsIDAsIDE2LCAxOX0sCisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX0VORCwgIiIsIDAsIDE5LCAxOX0sCisgICAgIH19LAorCisgICAgLy8gVGVzdCB0aGF0IHRhYnMgaW4gc3RyaW5nIGxpdGVyYWxzIGFmZmVjdCBjb2x1bW4gbnVtYmVycyBjb3JyZWN0bHkuCisgICAgeyJcImZvb1x0YmFyXCIgYmF6IiwKKyAgICAgeworICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9TVFJJTkcsICJcImZvb1x0YmFyXCIiLCAwLCAwLCAxMn0sCisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJiYXoiLCAwLCAxMywgMTZ9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9FTkQsICIiLCAwLCAxNiwgMTZ9LAorICAgICB9fSwKKworICAgIC8vIFRlc3QgdGhhdCBsaW5lIGNvbW1lbnRzIGFyZSBpZ25vcmVkLgorICAgIHsiZm9vIC8vIFRoaXMgaXMgYSBjb21tZW50XG4iCisgICAgICJiYXIgLy8gVGhpcyBpcyBhbm90aGVyIGNvbW1lbnQiLAorICAgICB7CisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJmb28iLCAwLCAwLCAzfSwKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImJhciIsIDEsIDAsIDN9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9FTkQsICIiLCAxLCAzMCwgMzB9LAorICAgICB9fSwKKworICAgIC8vIFRlc3QgdGhhdCBibG9jayBjb21tZW50cyBhcmUgaWdub3JlZC4KKyAgICB7ImZvbyAvKiBUaGlzIGlzIGEgYmxvY2sgY29tbWVudCAqLyBiYXIiLAorICAgICB7CisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJmb28iLCAwLCAwLCAzfSwKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImJhciIsIDAsIDM0LCAzN30sCisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX0VORCwgIiIsIDAsIDM3LCAzN30sCisgICAgIH19LAorCisgICAgLy8gVGVzdCB0aGF0IHNoLXN0eWxlIGNvbW1lbnRzIGFyZSBub3QgaWdub3JlZCBieSBkZWZhdWx0LgorICAgIHsiZm9vICMgYmFyXG4iCisgICAgICJiYXoiLAorICAgICB7CisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJmb28iLCAwLCAwLCAzfSwKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfU1lNQk9MLCAiIyIsIDAsIDQsIDV9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiYmFyIiwgMCwgNiwgOX0sCisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJiYXoiLCAxLCAwLCAzfSwKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfRU5ELCAiIiwgMSwgMywgM30sCisgICAgIH19LAorCisgICAgLy8gVGVzdCBhbGwgd2hpdGVzcGFjZSBjaGFycworICAgIHsiZm9vXG5cdFxyXHZcZmJhciIsCisgICAgIHsKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImZvbyIsIDAsIDAsIDN9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiYmFyIiwgMSwgMTEsIDE0fSwKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfRU5ELCAiIiwgMSwgMTQsIDE0fSwKKyAgICAgfX0sCit9OworCitURVNUXzJEKFRva2VuaXplclRlc3QsIE11bHRpcGxlVG9rZW5zLCBrTXVsdGlUb2tlbkNhc2VzLCBrQmxvY2tTaXplcykgeworICAvLyBTZXQgdXAgdGhlIHRva2VuaXplci4KKyAgVGVzdElucHV0U3RyZWFtIGlucHV0KGtNdWx0aVRva2VuQ2FzZXNfY2FzZS5pbnB1dC5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICBrTXVsdGlUb2tlbkNhc2VzX2Nhc2UuaW5wdXQuc2l6ZSgpLCBrQmxvY2tTaXplc19jYXNlKTsKKyAgVGVzdEVycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKKyAgVG9rZW5pemVyIHRva2VuaXplcigmaW5wdXQsICZlcnJvcl9jb2xsZWN0b3IpOworCisgIC8vIEJlZm9yZSBOZXh0KCkgaXMgY2FsbGVkLCB0aGUgaW5pdGlhbCB0b2tlbiBzaG91bGQgYWx3YXlzIGJlIFRZUEVfU1RBUlQuCisgIEVYUEVDVF9FUShUb2tlbml6ZXI6OlRZUEVfU1RBUlQsIHRva2VuaXplci5jdXJyZW50KCkudHlwZSk7CisgIEVYUEVDVF9FUSgiIiwgdG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0KTsKKyAgRVhQRUNUX0VRKDAsIHRva2VuaXplci5jdXJyZW50KCkubGluZSk7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmNvbHVtbik7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmVuZF9jb2x1bW4pOworCisgIC8vIExvb3AgdGhyb3VnaCBhbGwgZXhwZWN0ZWQgdG9rZW5zLgorICBpbnQgaSA9IDA7CisgIFRva2VuaXplcjo6VG9rZW4gdG9rZW47CisgIGRvIHsKKyAgICB0b2tlbiA9IGtNdWx0aVRva2VuQ2FzZXNfY2FzZS5vdXRwdXRbaSsrXTsKKworICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgIlRva2VuICMiIDw8IGkgPDwgIjogIiA8PCB0b2tlbi50ZXh0KTsKKworICAgIFRva2VuaXplcjo6VG9rZW4gcHJldmlvdXMgPSB0b2tlbml6ZXIuY3VycmVudCgpOworCisgICAgLy8gTmV4dCgpIHNob3VsZCBvbmx5IHJldHVybiBmYWxzZSB3aGVuIGl0IGhpdHMgdGhlIGVuZCB0b2tlbi4KKyAgICBpZiAodG9rZW4udHlwZSAhPSBUb2tlbml6ZXI6OlRZUEVfRU5EKSB7CisgICAgICBBU1NFUlRfVFJVRSh0b2tlbml6ZXIuTmV4dCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgQVNTRVJUX0ZBTFNFKHRva2VuaXplci5OZXh0KCkpOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgdGhlIHByZXZpb3VzIHRva2VuIGlzIHNldCBjb3JyZWN0bHkuCisgICAgRVhQRUNUX0VRKHByZXZpb3VzLnR5cGUsIHRva2VuaXplci5wcmV2aW91cygpLnR5cGUpOworICAgIEVYUEVDVF9FUShwcmV2aW91cy50ZXh0LCB0b2tlbml6ZXIucHJldmlvdXMoKS50ZXh0KTsKKyAgICBFWFBFQ1RfRVEocHJldmlvdXMubGluZSwgdG9rZW5pemVyLnByZXZpb3VzKCkubGluZSk7CisgICAgRVhQRUNUX0VRKHByZXZpb3VzLmNvbHVtbiwgdG9rZW5pemVyLnByZXZpb3VzKCkuY29sdW1uKTsKKyAgICBFWFBFQ1RfRVEocHJldmlvdXMuZW5kX2NvbHVtbiwgdG9rZW5pemVyLnByZXZpb3VzKCkuZW5kX2NvbHVtbik7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSB0b2tlbiBtYXRjaGVzIHRoZSBleHBlY3RlZCBvbmUuCisgICAgRVhQRUNUX0VRKHRva2VuLnR5cGUsIHRva2VuaXplci5jdXJyZW50KCkudHlwZSk7CisgICAgRVhQRUNUX0VRKHRva2VuLnRleHQsIHRva2VuaXplci5jdXJyZW50KCkudGV4dCk7CisgICAgRVhQRUNUX0VRKHRva2VuLmxpbmUsIHRva2VuaXplci5jdXJyZW50KCkubGluZSk7CisgICAgRVhQRUNUX0VRKHRva2VuLmNvbHVtbiwgdG9rZW5pemVyLmN1cnJlbnQoKS5jb2x1bW4pOworICAgIEVYUEVDVF9FUSh0b2tlbi5lbmRfY29sdW1uLCB0b2tlbml6ZXIuY3VycmVudCgpLmVuZF9jb2x1bW4pOworCisgIH0gd2hpbGUgKHRva2VuLnR5cGUgIT0gVG9rZW5pemVyOjpUWVBFX0VORCk7CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGVycm9ycy4KKyAgRVhQRUNUX1RSVUUoZXJyb3JfY29sbGVjdG9yLnRleHRfLmVtcHR5KCkpOworfQorCitNdWx0aVRva2VuQ2FzZSBrTXVsdGlXaGl0ZXNwYWNlVG9rZW5DYXNlc1tdID0geworICAgIC8vIFRlc3QgYWxsIHRva2VuIHR5cGVzIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgeyJmb28gMSBcdDEuMiAgXG4gICArXHYnYmFyJyIsCisgICAgIHsKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImZvbyIsIDAsIDAsIDN9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9XSElURVNQQUNFLCAiICIsIDAsIDMsIDR9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9JTlRFR0VSLCAiMSIsIDAsIDQsIDV9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9XSElURVNQQUNFLCAiIFx0IiwgMCwgNSwgOH0sCisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX0ZMT0FULCAiMS4yIiwgMCwgOCwgMTF9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9XSElURVNQQUNFLCAiICAiLCAwLCAxMSwgMTN9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9ORVdMSU5FLCAiXG4iLCAwLCAxMywgMH0sCisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX1dISVRFU1BBQ0UsICIgICAiLCAxLCAwLCAzfSwKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfU1lNQk9MLCAiKyIsIDEsIDMsIDR9LAorICAgICAgICAge1Rva2VuaXplcjo6VFlQRV9XSElURVNQQUNFLCAiXHYiLCAxLCA0LCA1fSwKKyAgICAgICAgIHtUb2tlbml6ZXI6OlRZUEVfU1RSSU5HLCAiJ2JhciciLCAxLCA1LCAxMH0sCisgICAgICAgICB7VG9rZW5pemVyOjpUWVBFX0VORCwgIiIsIDEsIDEwLCAxMH0sCisgICAgIH19LAorCit9OworCitURVNUXzJEKFRva2VuaXplclRlc3QsIE11bHRpcGxlV2hpdGVzcGFjZVRva2Vucywga011bHRpV2hpdGVzcGFjZVRva2VuQ2FzZXMsCisgICAgICAgIGtCbG9ja1NpemVzKSB7CisgIC8vIFNldCB1cCB0aGUgdG9rZW5pemVyLgorICBUZXN0SW5wdXRTdHJlYW0gaW5wdXQoa011bHRpV2hpdGVzcGFjZVRva2VuQ2FzZXNfY2FzZS5pbnB1dC5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICBrTXVsdGlXaGl0ZXNwYWNlVG9rZW5DYXNlc19jYXNlLmlucHV0LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtCbG9ja1NpemVzX2Nhc2UpOworICBUZXN0RXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICBUb2tlbml6ZXIgdG9rZW5pemVyKCZpbnB1dCwgJmVycm9yX2NvbGxlY3Rvcik7CisgIHRva2VuaXplci5zZXRfcmVwb3J0X3doaXRlc3BhY2UodHJ1ZSk7CisgIHRva2VuaXplci5zZXRfcmVwb3J0X25ld2xpbmVzKHRydWUpOworCisgIC8vIEJlZm9yZSBOZXh0KCkgaXMgY2FsbGVkLCB0aGUgaW5pdGlhbCB0b2tlbiBzaG91bGQgYWx3YXlzIGJlIFRZUEVfU1RBUlQuCisgIEVYUEVDVF9FUShUb2tlbml6ZXI6OlRZUEVfU1RBUlQsIHRva2VuaXplci5jdXJyZW50KCkudHlwZSk7CisgIEVYUEVDVF9FUSgiIiwgdG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0KTsKKyAgRVhQRUNUX0VRKDAsIHRva2VuaXplci5jdXJyZW50KCkubGluZSk7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmNvbHVtbik7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmVuZF9jb2x1bW4pOworCisgIC8vIExvb3AgdGhyb3VnaCBhbGwgZXhwZWN0ZWQgdG9rZW5zLgorICBpbnQgaSA9IDA7CisgIFRva2VuaXplcjo6VG9rZW4gdG9rZW47CisgIGRvIHsKKyAgICB0b2tlbiA9IGtNdWx0aVdoaXRlc3BhY2VUb2tlbkNhc2VzX2Nhc2Uub3V0cHV0W2krK107CisKKyAgICBTQ09QRURfVFJBQ0UodGVzdGluZzo6TWVzc2FnZSgpIDw8ICJUb2tlbiAjIiA8PCBpIDw8ICI6ICIgPDwgdG9rZW4udGV4dCk7CisKKyAgICBUb2tlbml6ZXI6OlRva2VuIHByZXZpb3VzID0gdG9rZW5pemVyLmN1cnJlbnQoKTsKKworICAgIC8vIE5leHQoKSBzaG91bGQgb25seSByZXR1cm4gZmFsc2Ugd2hlbiBpdCBoaXRzIHRoZSBlbmQgdG9rZW4uCisgICAgaWYgKHRva2VuLnR5cGUgIT0gVG9rZW5pemVyOjpUWVBFX0VORCkgeworICAgICAgQVNTRVJUX1RSVUUodG9rZW5pemVyLk5leHQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFTU0VSVF9GQUxTRSh0b2tlbml6ZXIuTmV4dCgpKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBwcmV2aW91cyB0b2tlbiBpcyBzZXQgY29ycmVjdGx5LgorICAgIEVYUEVDVF9FUShwcmV2aW91cy50eXBlLCB0b2tlbml6ZXIucHJldmlvdXMoKS50eXBlKTsKKyAgICBFWFBFQ1RfRVEocHJldmlvdXMudGV4dCwgdG9rZW5pemVyLnByZXZpb3VzKCkudGV4dCk7CisgICAgRVhQRUNUX0VRKHByZXZpb3VzLmxpbmUsIHRva2VuaXplci5wcmV2aW91cygpLmxpbmUpOworICAgIEVYUEVDVF9FUShwcmV2aW91cy5jb2x1bW4sIHRva2VuaXplci5wcmV2aW91cygpLmNvbHVtbik7CisgICAgRVhQRUNUX0VRKHByZXZpb3VzLmVuZF9jb2x1bW4sIHRva2VuaXplci5wcmV2aW91cygpLmVuZF9jb2x1bW4pOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdG9rZW4gbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgb25lLgorICAgIEVYUEVDVF9FUSh0b2tlbi50eXBlLCB0b2tlbml6ZXIuY3VycmVudCgpLnR5cGUpOworICAgIEVYUEVDVF9FUSh0b2tlbi50ZXh0LCB0b2tlbml6ZXIuY3VycmVudCgpLnRleHQpOworICAgIEVYUEVDVF9FUSh0b2tlbi5saW5lLCB0b2tlbml6ZXIuY3VycmVudCgpLmxpbmUpOworICAgIEVYUEVDVF9FUSh0b2tlbi5jb2x1bW4sIHRva2VuaXplci5jdXJyZW50KCkuY29sdW1uKTsKKyAgICBFWFBFQ1RfRVEodG9rZW4uZW5kX2NvbHVtbiwgdG9rZW5pemVyLmN1cnJlbnQoKS5lbmRfY29sdW1uKTsKKworICB9IHdoaWxlICh0b2tlbi50eXBlICE9IFRva2VuaXplcjo6VFlQRV9FTkQpOworCisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBlcnJvcnMuCisgIEVYUEVDVF9UUlVFKGVycm9yX2NvbGxlY3Rvci50ZXh0Xy5lbXB0eSgpKTsKK30KKworLy8gVGhpcyB0ZXN0IGNhdXNlcyBnY2MgMy4zLjUgKGFuZCBlYXJsaWVyPykgdG8gZ2l2ZSB0aGUgY3J5cHRpYyBlcnJvcjoKKy8vICAgInNvcnJ5LCB1bmltcGxlbWVudGVkOiBgbWV0aG9kX2NhbGxfZXhwcicgbm90IHN1cHBvcnRlZCBieSBkdW1wX2V4cHIiCisjaWYgIWRlZmluZWQoX19HTlVDX18pIHx8IF9fR05VQ19fID4gMyB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+IDMpCisKK1RFU1RfMUQoVG9rZW5pemVyVGVzdCwgU2hDb21tZW50U3R5bGUsIGtCbG9ja1NpemVzKSB7CisgIC8vIFRlc3QgdGhlICJjb21tZW50X3N0eWxlIiBvcHRpb24uCisKKyAgY29uc3QgY2hhciogdGV4dCA9CisgICAgICAiZm9vICMgYmFyXG4iCisgICAgICAiYmF6IC8vIHF1eFxuIgorICAgICAgImNvcmdlIC8qIGdyYXVsdCAqL1xuIgorICAgICAgImdhcnBseSI7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGtUb2tlbnNbXSA9IHsiZm9vIiwgIC8vICIjIGJhciIgaXMgaWdub3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJheiIsICIvIiwgICAgICAiLyIsICJxdXgiLCAiY29yZ2UiLCAiLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKiIsICAgImdyYXVsdCIsICIqIiwgIi8iLCAgICJnYXJwbHkifTsKKworICAvLyBTZXQgdXAgdGhlIHRva2VuaXplci4KKyAgVGVzdElucHV0U3RyZWFtIGlucHV0KHRleHQsIHN0cmxlbih0ZXh0KSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisgIFRlc3RFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIFRva2VuaXplciB0b2tlbml6ZXIoJmlucHV0LCAmZXJyb3JfY29sbGVjdG9yKTsKKyAgdG9rZW5pemVyLnNldF9jb21tZW50X3N0eWxlKFRva2VuaXplcjo6U0hfQ09NTUVOVF9TVFlMRSk7CisKKyAgLy8gQWR2YW5jZSB0aHJvdWdoIHRva2VucyBhbmQgY2hlY2sgdGhhdCB0aGV5IGFyZSBwYXJzZWQgYXMgZXhwZWN0ZWQuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShrVG9rZW5zKTsgaSsrKSB7CisgICAgRVhQRUNUX1RSVUUodG9rZW5pemVyLk5leHQoKSk7CisgICAgRVhQRUNUX0VRKHRva2VuaXplci5jdXJyZW50KCkudGV4dCwga1Rva2Vuc1tpXSk7CisgIH0KKworICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gbW9yZSBpbnB1dC4KKyAgRVhQRUNUX0ZBTFNFKHRva2VuaXplci5OZXh0KCkpOworICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gZXJyb3JzLgorICBFWFBFQ1RfVFJVRShlcnJvcl9jb2xsZWN0b3IudGV4dF8uZW1wdHkoKSk7Cit9CisKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEluIGVhY2ggY2FzZSwgdGhlIGlucHV0IGlzIGV4cGVjdGVkIHRvIGhhdmUgdHdvIHRva2VucyBuYW1lZCAicHJldiIgYW5kCisvLyAibmV4dCIgd2l0aCBjb21tZW50cyBpbiBiZXR3ZWVuLgorc3RydWN0IERvY0NvbW1lbnRDYXNlIHsKKyAgc3RkOjpzdHJpbmcgaW5wdXQ7CisKKyAgY29uc3QgY2hhciogcHJldl90cmFpbGluZ19jb21tZW50czsKKyAgY29uc3QgY2hhciogZGV0YWNoZWRfY29tbWVudHNbMTBdOworICBjb25zdCBjaGFyKiBuZXh0X2xlYWRpbmdfY29tbWVudHM7Cit9OworCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb2NDb21tZW50Q2FzZSYgdGVzdF9jYXNlKSB7CisgIHJldHVybiBvdXQgPDwgQ0VzY2FwZSh0ZXN0X2Nhc2UuaW5wdXQpOworfQorCitEb2NDb21tZW50Q2FzZSBrRG9jQ29tbWVudENhc2VzW10gPSB7CisgICAgeyJwcmV2IG5leHQiLAorCisgICAgICIiLAorICAgICB7fSwKKyAgICAgIiJ9LAorCisgICAgeyJwcmV2IC8qIGlnbm9yZWQgKi8gbmV4dCIsCisKKyAgICAgIiIsCisgICAgIHt9LAorICAgICAiIn0sCisKKyAgICB7InByZXYgLy8gdHJhaWxpbmcgY29tbWVudFxuIgorICAgICAibmV4dCIsCisKKyAgICAgIiB0cmFpbGluZyBjb21tZW50XG4iLAorICAgICB7fSwKKyAgICAgIiJ9LAorCisgICAgeyJwcmV2XG4iCisgICAgICIvLyBsZWFkaW5nIGNvbW1lbnRcbiIKKyAgICAgIi8vIGxpbmUgMlxuIgorICAgICAibmV4dCIsCisKKyAgICAgIiIsCisgICAgIHt9LAorICAgICAiIGxlYWRpbmcgY29tbWVudFxuIgorICAgICAiIGxpbmUgMlxuIn0sCisKKyAgICB7InByZXZcbiIKKyAgICAgIi8vIHRyYWlsaW5nIGNvbW1lbnRcbiIKKyAgICAgIi8vIGxpbmUgMlxuIgorICAgICAiXG4iCisgICAgICJuZXh0IiwKKworICAgICAiIHRyYWlsaW5nIGNvbW1lbnRcbiIKKyAgICAgIiBsaW5lIDJcbiIsCisgICAgIHt9LAorICAgICAiIn0sCisKKyAgICB7InByZXYgLy8gdHJhaWxpbmcgY29tbWVudFxuIgorICAgICAiLy8gbGVhZGluZyBjb21tZW50XG4iCisgICAgICIvLyBsaW5lIDJcbiIKKyAgICAgIm5leHQiLAorCisgICAgICIgdHJhaWxpbmcgY29tbWVudFxuIiwKKyAgICAge30sCisgICAgICIgbGVhZGluZyBjb21tZW50XG4iCisgICAgICIgbGluZSAyXG4ifSwKKworICAgIHsicHJldiAvKiB0cmFpbGluZyBibG9jayBjb21tZW50ICovXG4iCisgICAgICIvKiBsZWFkaW5nIGJsb2NrIGNvbW1lbnRcbiIKKyAgICAgIiAqIGxpbmUgMlxuIgorICAgICAiICogbGluZSAzICovIgorICAgICAibmV4dCIsCisKKyAgICAgIiB0cmFpbGluZyBibG9jayBjb21tZW50ICIsCisgICAgIHt9LAorICAgICAiIGxlYWRpbmcgYmxvY2sgY29tbWVudFxuIgorICAgICAiIGxpbmUgMlxuIgorICAgICAiIGxpbmUgMyAifSwKKworICAgIHsicHJldlxuIgorICAgICAiLyogdHJhaWxpbmcgYmxvY2sgY29tbWVudFxuIgorICAgICAiICogbGluZSAyXG4iCisgICAgICIgKiBsaW5lIDNcbiIKKyAgICAgIiAqL1xuIgorICAgICAiLyogbGVhZGluZyBibG9jayBjb21tZW50XG4iCisgICAgICIgKiBsaW5lIDJcbiIKKyAgICAgIiAqIGxpbmUgMyAqLyIKKyAgICAgIm5leHQiLAorCisgICAgICIgdHJhaWxpbmcgYmxvY2sgY29tbWVudFxuIgorICAgICAiIGxpbmUgMlxuIgorICAgICAiIGxpbmUgM1xuIiwKKyAgICAge30sCisgICAgICIgbGVhZGluZyBibG9jayBjb21tZW50XG4iCisgICAgICIgbGluZSAyXG4iCisgICAgICIgbGluZSAzICJ9LAorCisgICAgeyJwcmV2XG4iCisgICAgICIvLyB0cmFpbGluZyBjb21tZW50XG4iCisgICAgICJcbiIKKyAgICAgIi8vIGRldGFjaGVkIGNvbW1lbnRcbiIKKyAgICAgIi8vIGxpbmUgMlxuIgorICAgICAiXG4iCisgICAgICIvLyBzZWNvbmQgZGV0YWNoZWQgY29tbWVudFxuIgorICAgICAiLyogdGhpcmQgZGV0YWNoZWQgY29tbWVudFxuIgorICAgICAiICogbGluZSAyICovXG4iCisgICAgICIvLyBsZWFkaW5nIGNvbW1lbnRcbiIKKyAgICAgIm5leHQiLAorCisgICAgICIgdHJhaWxpbmcgY29tbWVudFxuIiwKKyAgICAgeyIgZGV0YWNoZWQgY29tbWVudFxuIgorICAgICAgIiBsaW5lIDJcbiIsCisgICAgICAiIHNlY29uZCBkZXRhY2hlZCBjb21tZW50XG4iLAorICAgICAgIiB0aGlyZCBkZXRhY2hlZCBjb21tZW50XG4iCisgICAgICAiIGxpbmUgMiAifSwKKyAgICAgIiBsZWFkaW5nIGNvbW1lbnRcbiJ9LAorCisgICAgeyJwcmV2IC8qKi9cbiIKKyAgICAgIlxuIgorICAgICAiLy8gZGV0YWNoZWQgY29tbWVudFxuIgorICAgICAiXG4iCisgICAgICIvLyBsZWFkaW5nIGNvbW1lbnRcbiIKKyAgICAgIm5leHQiLAorCisgICAgICIiLAorICAgICB7IiBkZXRhY2hlZCBjb21tZW50XG4ifSwKKyAgICAgIiBsZWFkaW5nIGNvbW1lbnRcbiJ9LAorCisgICAgeyJwcmV2IC8qKi9cbiIKKyAgICAgIi8vIGxlYWRpbmcgY29tbWVudFxuIgorICAgICAibmV4dCIsCisKKyAgICAgIiIsCisgICAgIHt9LAorICAgICAiIGxlYWRpbmcgY29tbWVudFxuIn0sCit9OworCitURVNUXzJEKFRva2VuaXplclRlc3QsIERvY0NvbW1lbnRzLCBrRG9jQ29tbWVudENhc2VzLCBrQmxvY2tTaXplcykgeworICAvLyBTZXQgdXAgdGhlIHRva2VuaXplci4KKyAgVGVzdElucHV0U3RyZWFtIGlucHV0KGtEb2NDb21tZW50Q2FzZXNfY2FzZS5pbnB1dC5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICBrRG9jQ29tbWVudENhc2VzX2Nhc2UuaW5wdXQuc2l6ZSgpLCBrQmxvY2tTaXplc19jYXNlKTsKKyAgVGVzdEVycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKKyAgVG9rZW5pemVyIHRva2VuaXplcigmaW5wdXQsICZlcnJvcl9jb2xsZWN0b3IpOworCisgIC8vIFNldCB1cCBhIHNlY29uZCB0b2tlbml6ZXIgd2hlcmUgd2UnbGwgcGFzcyBhbGwgTlVMTHMgdG8gTmV4dFdpdGhDb21tZW50cygpLgorICBUZXN0SW5wdXRTdHJlYW0gaW5wdXQyKGtEb2NDb21tZW50Q2FzZXNfY2FzZS5pbnB1dC5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAga0RvY0NvbW1lbnRDYXNlc19jYXNlLmlucHV0LnNpemUoKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisgIFRva2VuaXplciB0b2tlbml6ZXIyKCZpbnB1dDIsICZlcnJvcl9jb2xsZWN0b3IpOworCisgIHRva2VuaXplci5OZXh0KCk7CisgIHRva2VuaXplcjIuTmV4dCgpOworCisgIEVYUEVDVF9FUSgicHJldiIsIHRva2VuaXplci5jdXJyZW50KCkudGV4dCk7CisgIEVYUEVDVF9FUSgicHJldiIsIHRva2VuaXplcjIuY3VycmVudCgpLnRleHQpOworCisgIHN0ZDo6c3RyaW5nIHByZXZfdHJhaWxpbmdfY29tbWVudHM7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZXRhY2hlZF9jb21tZW50czsKKyAgc3RkOjpzdHJpbmcgbmV4dF9sZWFkaW5nX2NvbW1lbnRzOworICB0b2tlbml6ZXIuTmV4dFdpdGhDb21tZW50cygmcHJldl90cmFpbGluZ19jb21tZW50cywgJmRldGFjaGVkX2NvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dF9sZWFkaW5nX2NvbW1lbnRzKTsKKyAgdG9rZW5pemVyMi5OZXh0V2l0aENvbW1lbnRzKE5VTEwsIE5VTEwsIE5VTEwpOworICBFWFBFQ1RfRVEoIm5leHQiLCB0b2tlbml6ZXIuY3VycmVudCgpLnRleHQpOworICBFWFBFQ1RfRVEoIm5leHQiLCB0b2tlbml6ZXIyLmN1cnJlbnQoKS50ZXh0KTsKKworICBFWFBFQ1RfRVEoa0RvY0NvbW1lbnRDYXNlc19jYXNlLnByZXZfdHJhaWxpbmdfY29tbWVudHMsCisgICAgICAgICAgICBwcmV2X3RyYWlsaW5nX2NvbW1lbnRzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRldGFjaGVkX2NvbW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgQVNTRVJUX0xUKGksIEdPT0dMRV9BUlJBWVNJWkUoa0RvY0NvbW1lbnRDYXNlcykpOworICAgIEFTU0VSVF9UUlVFKGtEb2NDb21tZW50Q2FzZXNfY2FzZS5kZXRhY2hlZF9jb21tZW50c1tpXSAhPSBOVUxMKTsKKyAgICBFWFBFQ1RfRVEoa0RvY0NvbW1lbnRDYXNlc19jYXNlLmRldGFjaGVkX2NvbW1lbnRzW2ldLCBkZXRhY2hlZF9jb21tZW50c1tpXSk7CisgIH0KKworICAvLyBWZXJpZnkgdGhhdCB3ZSBtYXRjaGVkIGFsbCB0aGUgZGV0YWNoZWQgY29tbWVudHMuCisgIEVYUEVDVF9FUShOVUxMLAorICAgICAgICAgICAga0RvY0NvbW1lbnRDYXNlc19jYXNlLmRldGFjaGVkX2NvbW1lbnRzW2RldGFjaGVkX2NvbW1lbnRzLnNpemUoKV0pOworCisgIEVYUEVDVF9FUShrRG9jQ29tbWVudENhc2VzX2Nhc2UubmV4dF9sZWFkaW5nX2NvbW1lbnRzLCBuZXh0X2xlYWRpbmdfY29tbWVudHMpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRlc3QgcGFyc2UgaGVscGVycy4KKy8vIFRPRE8oYi8yMjU3ODM3NTgpOiBBZGQgYSBmdXp6IHRlc3QgZm9yIHRoaXMuCitURVNUX0YoVG9rZW5pemVyVGVzdCwgUGFyc2VJbnRlZ2VyKSB7CisgIEVYUEVDVF9FUSgwLCBQYXJzZUludGVnZXIoIjAiKSk7CisgIEVYUEVDVF9FUSgxMjMsIFBhcnNlSW50ZWdlcigiMTIzIikpOworICBFWFBFQ1RfRVEoMHhhYmNkZWYxMnUsIFBhcnNlSW50ZWdlcigiMHhhYmNkZWYxMiIpKTsKKyAgRVhQRUNUX0VRKDB4YWJjZGVmMTJ1LCBQYXJzZUludGVnZXIoIjB4QUJDREVGMTIiKSk7CisgIEVYUEVDVF9FUShrdWludDY0bWF4LCBQYXJzZUludGVnZXIoIjB4RkZGRkZGRkZGRkZGRkZGRiIpKTsKKyAgRVhQRUNUX0VRKDAxMjM0NTY3LCBQYXJzZUludGVnZXIoIjAxMjM0NTY3IikpOworICBFWFBFQ1RfRVEoMFgxMjMsIFBhcnNlSW50ZWdlcigiMFgxMjMiKSk7CisKKyAgLy8gVGVzdCBpbnZhbGlkIGludGVnZXJzIHRoYXQgbWF5IHN0aWxsIGJlIHRva2VuaXplZCBhcyBpbnRlZ2Vycy4KKyAgRVhQRUNUX0VRKDAsIFBhcnNlSW50ZWdlcigiMHgiKSk7CisKKyAgdWludDY0X3QgaTsKKworICAvLyBUZXN0IGludmFsaWQgaW50ZWdlcnMgdGhhdCB3aWxsIG5ldmVyIGJlIHRva2VuaXplZCBhcyBpbnRlZ2Vycy4KKyAgRVhQRUNUX0ZBTFNFKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCJ6eHkiLCBrdWludDY0bWF4LCAmaSkpOworICBFWFBFQ1RfRkFMU0UoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIjEuMiIsIGt1aW50NjRtYXgsICZpKSk7CisgIEVYUEVDVF9GQUxTRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMDgiLCBrdWludDY0bWF4LCAmaSkpOworICBFWFBFQ1RfRkFMU0UoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIjB4ZyIsIGt1aW50NjRtYXgsICZpKSk7CisgIEVYUEVDVF9GQUxTRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiLTEiLCBrdWludDY0bWF4LCAmaSkpOworCisgIC8vIFRlc3Qgb3ZlcmZsb3dzLgorICBFWFBFQ1RfVFJVRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMCIsIDAsICZpKSk7CisgIEVYUEVDVF9GQUxTRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMSIsIDAsICZpKSk7CisgIEVYUEVDVF9UUlVFKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCIxIiwgMSwgJmkpKTsKKyAgRVhQRUNUX1RSVUUoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIjEyMzQ1IiwgMTIzNDUsICZpKSk7CisgIEVYUEVDVF9GQUxTRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMTIzNDYiLCAxMjM0NSwgJmkpKTsKKyAgRVhQRUNUX1RSVUUoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIjB4RkZGRkZGRkZGRkZGRkZGRiIsIGt1aW50NjRtYXgsICZpKSk7CisgIEVYUEVDVF9GQUxTRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMHgxMDAwMDAwMDAwMDAwMDAwMCIsIGt1aW50NjRtYXgsICZpKSk7CisKKyAgLy8gVGVzdCBuZWFyIHRoZSBsaW1pdHMgb2Ygc2lnbmVkIHBhcnNpbmcgKHZhbHVlcyBpbiBraW50NjRtYXggKy8tIDE2MDApCisgIGZvciAoaW50NjRfdCBvZmZzZXQgPSAtMTYwMDsgb2Zmc2V0IDw9IDE2MDA7ICsrb2Zmc2V0KSB7CisgICAgLy8gV2UgbWFrZSBzdXJlIHRvIHBlcmZvcm0gYW4gdW5zaWduZWQgYWRkaXRpb24gc28gdGhhdCB3ZSBhdm9pZCBzaWduZWQKKyAgICAvLyBvdmVyZmxvdywgd2hpY2ggd291bGQgYmUgdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgIHVpbnQ2NF90IGkgPSAweDdGRkZGRkZGRkZGRkZGRkZ1ICsgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG9mZnNldCk7CisgICAgY2hhciBkZWNpbWFsWzMyXTsKKyAgICBzbnByaW50ZihkZWNpbWFsLCAzMiwgIiVsbHUiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KGkpKTsKKyAgICBpZiAob2Zmc2V0ID4gMCkgeworICAgICAgdWludDY0X3QgcGFyc2VkID0gLTE7CisgICAgICBFWFBFQ1RfRkFMU0UoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoZGVjaW1hbCwga2ludDY0bWF4LCAmcGFyc2VkKSkKKyAgICAgICAgICA8PCBkZWNpbWFsIDw8ICI9PiIgPDwgcGFyc2VkOworICAgIH0gZWxzZSB7CisgICAgICB1aW50NjRfdCBwYXJzZWQgPSAtMTsKKyAgICAgIEVYUEVDVF9UUlVFKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKGRlY2ltYWwsIGtpbnQ2NG1heCwgJnBhcnNlZCkpCisgICAgICAgICAgPDwgZGVjaW1hbCA8PCAiPT4iIDw8IHBhcnNlZDsKKyAgICAgIEVYUEVDVF9FUShwYXJzZWQsIGkpOworICAgIH0KKyAgICBjaGFyIG9jdGFsWzMyXTsKKyAgICBzbnByaW50ZihvY3RhbCwgMzIsICIwJWxsbyIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oaSkpOworICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICB1aW50NjRfdCBwYXJzZWQgPSAtMTsKKyAgICAgIEVYUEVDVF9GQUxTRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcihvY3RhbCwga2ludDY0bWF4LCAmcGFyc2VkKSkKKyAgICAgICAgICA8PCBvY3RhbCA8PCAiPT4iIDw8IHBhcnNlZDsKKyAgICB9IGVsc2UgeworICAgICAgdWludDY0X3QgcGFyc2VkID0gLTE7CisgICAgICBFWFBFQ1RfVFJVRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcihvY3RhbCwga2ludDY0bWF4LCAmcGFyc2VkKSkKKyAgICAgICAgICA8PCBvY3RhbCA8PCAiPT4iIDw8IHBhcnNlZDsKKyAgICAgIEVYUEVDVF9FUShwYXJzZWQsIGkpOworICAgIH0KKyAgICBjaGFyIGhleFszMl07CisgICAgc25wcmludGYoaGV4LCAzMiwgIjB4JWxseCIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oaSkpOworICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICB1aW50NjRfdCBwYXJzZWQgPSAtMTsKKyAgICAgIEVYUEVDVF9GQUxTRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcihoZXgsIGtpbnQ2NG1heCwgJnBhcnNlZCkpCisgICAgICAgICAgPDwgaGV4IDw8ICI9PiIgPDwgcGFyc2VkOworICAgIH0gZWxzZSB7CisgICAgICB1aW50NjRfdCBwYXJzZWQgPSAtMTsKKyAgICAgIEVYUEVDVF9UUlVFKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKGhleCwga2ludDY0bWF4LCAmcGFyc2VkKSkgPDwgaGV4OworICAgICAgRVhQRUNUX0VRKHBhcnNlZCwgaSk7CisgICAgfQorICAgIC8vIEVYUEVDVF9ORShvZmZzZXQsIC0yMzcpOworICB9CisKKyAgLy8gVGVzdCBuZWFyIHRoZSBsaW1pdHMgb2YgdW5zaWduZWQgcGFyc2luZyAodmFsdWVzIGluIGt1aW50NjRtYXggKy8tIDE2MDApCisgIC8vIEJ5IGRlZmluaXRpb24sIHZhbHVlcyBncmVhdGVyIHRoYW4ga3VpbnQ2NG1heCBjYW5ub3QgYmUgaGVsZCBpbiBhIHVpbnQ2NF90CisgIC8vIHZhcmlhYmxlLCBzbyBwcmludGluZyB0aGVtIGlzIGEgbGl0dGxlIHRyaWNreTsgZm9ydHVuYXRlbHkgYWxsIGJ1dCB0aGUKKyAgLy8gbGFzdCBmb3VyIGRpZ2l0cyBhcmUga25vd24sIHNvIHdlIGNhbiBoYXJkLWNvZGUgdGhlbSBpbiB0aGUgcHJpbnRmIHN0cmluZywKKyAgLy8gYW5kIHdlIG9ubHkgbmVlZCB0byBmb3JtYXQgdGhlIGxhc3QgNC4KKyAgZm9yIChpbnQ2NF90IG9mZnNldCA9IC0xNjAwOyBvZmZzZXQgPD0gMTYwMDsgKytvZmZzZXQpIHsKKyAgICB7CisgICAgICB1aW50NjRfdCBpID0gMTg0NDY3NDQwNzM3MDk1NTE2MTV1ICsgb2Zmc2V0OworICAgICAgY2hhciBkZWNpbWFsWzMyXTsKKyAgICAgIHNucHJpbnRmKGRlY2ltYWwsIDMyLCAiMTg0NDY3NDQwNzM3MDk1NSUwNGxsdSIsCisgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KDE2MTUgKyBvZmZzZXQpKTsKKyAgICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICAgIHVpbnQ2NF90IHBhcnNlZCA9IC0xOworICAgICAgICBFWFBFQ1RfRkFMU0UoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoZGVjaW1hbCwga3VpbnQ2NG1heCwgJnBhcnNlZCkpCisgICAgICAgICAgICA8PCBkZWNpbWFsIDw8ICI9PiIgPDwgcGFyc2VkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDY0X3QgcGFyc2VkID0gLTE7CisgICAgICAgIEVYUEVDVF9UUlVFKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKGRlY2ltYWwsIGt1aW50NjRtYXgsICZwYXJzZWQpKQorICAgICAgICAgICAgPDwgZGVjaW1hbDsKKyAgICAgICAgRVhQRUNUX0VRKHBhcnNlZCwgaSk7CisgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgIHVpbnQ2NF90IGkgPSAwMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3UgKyBvZmZzZXQ7CisgICAgICBpZiAob2Zmc2V0ID4gMCkgeworICAgICAgICBjaGFyIG9jdGFsWzMyXTsKKyAgICAgICAgc25wcmludGYob2N0YWwsIDMyLCAiMDIwMDAwMDAwMDAwMDAwMDAwMCUwNGxsbyIsCisgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4ob2Zmc2V0IC0gMSkpOworICAgICAgICB1aW50NjRfdCBwYXJzZWQgPSAtMTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKG9jdGFsLCBrdWludDY0bWF4LCAmcGFyc2VkKSkKKyAgICAgICAgICAgIDw8IG9jdGFsIDw8ICI9PiIgPDwgcGFyc2VkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhciBvY3RhbFszMl07CisgICAgICAgIHNucHJpbnRmKG9jdGFsLCAzMiwgIjAlbGxvIiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihpKSk7CisgICAgICAgIHVpbnQ2NF90IHBhcnNlZCA9IC0xOworICAgICAgICBFWFBFQ1RfVFJVRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcihvY3RhbCwga3VpbnQ2NG1heCwgJnBhcnNlZCkpCisgICAgICAgICAgICA8PCBvY3RhbDsKKyAgICAgICAgRVhQRUNUX0VRKHBhcnNlZCwgaSk7CisgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgIHVpbnQ2NF90IHVpID0gMHhmZmZmZmZmZmZmZmZmZmZmdSArIG9mZnNldDsKKyAgICAgIGNoYXIgaGV4WzMyXTsKKyAgICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICAgIHNucHJpbnRmKGhleCwgMzIsICIweDEwMDAwMDAwMDAwMDAlMDRsbHgiLAorICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KG9mZnNldCAtIDEpKTsKKyAgICAgICAgdWludDY0X3QgcGFyc2VkID0gLTE7CisgICAgICAgIEVYUEVDVF9GQUxTRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcihoZXgsIGt1aW50NjRtYXgsICZwYXJzZWQpKQorICAgICAgICAgICAgPDwgaGV4IDw8ICI9PiIgPDwgcGFyc2VkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoaGV4LCAzMiwgIjB4JWxseCIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4odWkpKTsKKyAgICAgICAgdWludDY0X3QgcGFyc2VkID0gLTE7CisgICAgICAgIEVYUEVDVF9UUlVFKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKGhleCwga3VpbnQ2NG1heCwgJnBhcnNlZCkpIDw8IGhleDsKKyAgICAgICAgRVhQRUNUX0VRKHBhcnNlZCwgdWkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitURVNUX0YoVG9rZW5pemVyVGVzdCwgUGFyc2VGbG9hdCkgeworICBFWFBFQ1RfRE9VQkxFX0VRKDEsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMS4iKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMWUzLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjFlMyIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgxZTMsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMUUzIikpOworICBFWFBFQ1RfRE9VQkxFX0VRKDEuNWUzLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjEuNWUzIikpOworICBFWFBFQ1RfRE9VQkxFX0VRKC4xLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIi4xIikpOworICBFWFBFQ1RfRE9VQkxFX0VRKC4yNSwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIuMjUiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLjFlMywgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIuMWUzIikpOworICBFWFBFQ1RfRE9VQkxFX0VRKC4yNWUzLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIi4yNWUzIikpOworICBFWFBFQ1RfRE9VQkxFX0VRKC4xZSszLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIi4xZSszIikpOworICBFWFBFQ1RfRE9VQkxFX0VRKC4xZS0zLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIi4xZS0zIikpOworICBFWFBFQ1RfRE9VQkxFX0VRKDUsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiNSIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSg2ZS0xMiwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCI2ZS0xMiIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgxLjIsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMS4yIikpOworICBFWFBFQ1RfRE9VQkxFX0VRKDEuZTIsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMS5lMiIpKTsKKworICAvLyBUZXN0IGludmFsaWQgaW50ZWdlcnMgdGhhdCBtYXkgc3RpbGwgYmUgdG9rZW5pemVkIGFzIGludGVnZXJzLgorICBFWFBFQ1RfRE9VQkxFX0VRKDEsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMWUiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMSwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxZS0iKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMSwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxLmUiKSk7CisKKyAgLy8gVGVzdCAnZicgc3VmZml4LgorICBFWFBFQ1RfRE9VQkxFX0VRKDEsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMWYiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMSwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxLjBmIikpOworICBFWFBFQ1RfRE9VQkxFX0VRKDEsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMUYiKSk7CisKKyAgLy8gVGhlc2Ugc2hvdWxkIHBhcnNlIHN1Y2Nlc3NmdWxseSBldmVuIHRob3VnaCB0aGV5IGFyZSBvdXQgb2YgcmFuZ2UuCisgIC8vIE92ZXJmbG93cyBiZWNvbWUgaW5maW5pdHkgYW5kIHVuZGVyZmxvd3MgYmVjb21lIHplcm8uCisgIEVYUEVDVF9FUSgwLjAsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMWUtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSIpKTsKKyAgRVhQRUNUX0VRKEhVR0VfVkFMLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjFlKzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkiKSk7CisKKyNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVCAgLy8gZGVhdGggdGVzdHMgZG8gbm90IHdvcmsgb24gV2luZG93cyB5ZXQKKyAgLy8gVGVzdCBpbnZhbGlkIGludGVnZXJzIHRoYXQgd2lsbCBuZXZlciBiZSB0b2tlbml6ZWQgYXMgaW50ZWdlcnMuCisgIEVYUEVDVF9ERUJVR19ERUFUSCgKKyAgICAgIFRva2VuaXplcjo6UGFyc2VGbG9hdCgienh5IiksCisgICAgICAicGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QgaGF2ZSBiZWVuIHRva2VuaXplZCBhcyBhIGZsb2F0Iik7CisgIEVYUEVDVF9ERUJVR19ERUFUSCgKKyAgICAgIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMS1lMCIpLAorICAgICAgInBhc3NlZCB0ZXh0IHRoYXQgY291bGQgbm90IGhhdmUgYmVlbiB0b2tlbml6ZWQgYXMgYSBmbG9hdCIpOworICBFWFBFQ1RfREVCVUdfREVBVEgoCisgICAgICBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIi0xLjAiKSwKKyAgICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGEgZmxvYXQiKTsKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKK30KKworVEVTVF9GKFRva2VuaXplclRlc3QsIFBhcnNlU3RyaW5nKSB7CisgIHN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiJ2hlbGxvJyIsICZvdXRwdXQpOworICBFWFBFQ1RfRVEoImhlbGxvIiwgb3V0cHV0KTsKKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiXCJibGFoXFxuYmxhaDJcIiIsICZvdXRwdXQpOworICBFWFBFQ1RfRVEoImJsYWhcbmJsYWgyIiwgb3V0cHV0KTsKKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiJ1xcMXhcXDFcXDEyM1xcNzM5XFw1MlxcMzM0blxcMyciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJcMXhcMVwxMjNcNzM5XDUyXDMzNG5cMyIsIG91dHB1dCk7CisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIidcXHgyMFxceDQnIiwgJm91dHB1dCk7CisgIEVYUEVDVF9FUSgiXHgyMFx4NCIsIG91dHB1dCk7CisKKyAgLy8gVGVzdCBpbnZhbGlkIHN0cmluZ3MgdGhhdCBtYXkgc3RpbGwgYmUgdG9rZW5pemVkIGFzIHN0cmluZ3MuCisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIlwiXFxhXFxsXFx2XFx0IiwgJm91dHB1dCk7ICAvLyBcbCBpcyBpbnZhbGlkCisgIEVYUEVDVF9FUSgiXGE/XHZcdCIsIG91dHB1dCk7CisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIiciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCIiLCBvdXRwdXQpOworICBUb2tlbml6ZXI6OlBhcnNlU3RyaW5nKCInXFwiLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJcXCIsIG91dHB1dCk7CisKKyAgLy8gRXhwZXJpbWVudCB3aXRoIFVuaWNvZGUgZXNjYXBlcy4gSGVyZSBhcmUgb25lLSwgdHdvLSBhbmQgdGhyZWUtYnl0ZSBVbmljb2RlCisgIC8vIGNoYXJhY3RlcnMuCisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIidcXHUwMDI0XFx1MDBhMlxcdTIwYWNcXFUwMDAyNGI2MlhYJyIsICZvdXRwdXQpOworICBFWFBFQ1RfRVEoIiTCouKCrPCkraJYWCIsIG91dHB1dCk7CisgIC8vIFNhbWUgdGhpbmcgZW5jb2RlZCB1c2luZyBVVEYxNi4KKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiJ1xcdTAwMjRcXHUwMGEyXFx1MjBhY1xcdWQ4NTJcXHVkZjYyWFgnIiwgJm91dHB1dCk7CisgIEVYUEVDVF9FUSgiJMKi4oKs8KStolhYIiwgb3V0cHV0KTsKKyAgLy8gSGVyZSdzIHNvbWUgYnJva2VuIFVURjE2OyB0aGVyZSdzIGEgaGVhZCBzdXJyb2dhdGUgd2l0aCBubyB0YWlsIHN1cnJvZ2F0ZS4KKyAgLy8gV2UganVzdCBvdXRwdXQgdGhpcyBhcyBpZiBpdCB3ZXJlIFVURjg7IGl0J3Mgbm90IGEgZGVmaW5lZCBjb2RlIHBvaW50LCBidXQKKyAgLy8gaXQgaGFzIGEgZGVmaW5lZCBlbmNvZGluZy4KKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiJ1xcdWQ4NTJYWCciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJceGVkXHhhMVx4OTJYWCIsIG91dHB1dCk7CisgIC8vIE1hbGZvcm1lZCBlc2NhcGU6IERlbW9ucyBtYXkgZmx5IG91dCBvZiB0aGUgbm9zZS4KKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiJ1xcdTAnIiwgJm91dHB1dCk7CisgIEVYUEVDVF9FUSgidTAiLCBvdXRwdXQpOworICAvLyBCZXlvbmQgdGhlIHJhbmdlIG9mIHZhbGlkIFVURi0zMiBjb2RlIHVuaXRzLgorICBUb2tlbml6ZXI6OlBhcnNlU3RyaW5nKCInXFxVMDAxMTAwMDBcXFUwMDIwMDAwMFxcVUZGRkZGRkZGJyIsICZvdXRwdXQpOworICBFWFBFQ1RfRVEoIlxcVTAwMTEwMDAwXFxVMDAyMDAwMDBcXFVmZmZmZmZmZiIsIG91dHB1dCk7CisKKyAgLy8gVGVzdCBpbnZhbGlkIHN0cmluZ3MgdGhhdCB3aWxsIG5ldmVyIGJlIHRva2VuaXplZCBhcyBzdHJpbmdzLgorI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUICAvLyBkZWF0aCB0ZXN0cyBkbyBub3Qgd29yayBvbiBXaW5kb3dzIHlldAorICBFWFBFQ1RfREVCVUdfREVBVEgoCisgICAgICBUb2tlbml6ZXI6OlBhcnNlU3RyaW5nKCIiLCAmb3V0cHV0KSwKKyAgICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGEgc3RyaW5nIik7CisjZW5kaWYgIC8vIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCit9CisKK1RFU1RfRihUb2tlbml6ZXJUZXN0LCBQYXJzZVN0cmluZ0FwcGVuZCkgeworICAvLyBDaGVjayB0aGF0IFBhcnNlU3RyaW5nIGFuZCBQYXJzZVN0cmluZ0FwcGVuZCBkaWZmZXIuCisgIHN0ZDo6c3RyaW5nIG91dHB1dCgic3R1ZmYrIik7CisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmdBcHBlbmQoIidoZWxsbyciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJzdHVmZitoZWxsbyIsIG91dHB1dCk7CisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIidoZWxsbyciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJoZWxsbyIsIG91dHB1dCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRWFjaCBjYXNlIHBhcnNlcyBzb21lIGlucHV0IHRleHQsIGlnbm9yaW5nIHRoZSB0b2tlbnMgcHJvZHVjZWQsIGFuZAorLy8gY2hlY2tzIHRoYXQgdGhlIGVycm9yIG91dHB1dCBtYXRjaGVzIHdoYXQgaXMgZXhwZWN0ZWQuCitzdHJ1Y3QgRXJyb3JDYXNlIHsKKyAgc3RkOjpzdHJpbmcgaW5wdXQ7CisgIGJvb2wgcmVjb3ZlcmFibGU7ICAvLyBUcnVlIGlmIHRoZSB0b2tlbml6ZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVjb3ZlciBhbmQKKyAgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlIG1vcmUgdG9rZW5zIGFmdGVyIHNlZWluZyB0aGlzIGVycm9yLiAgQ2FzZXMKKyAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB3aGljaCB0aGlzIGlzIHRydWUgbXVzdCBlbmQgd2l0aCAiZm9vIiBhcworICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhc3QgdG9rZW4sIHdoaWNoIHRoZSB0ZXN0IHdpbGwgY2hlY2sgZm9yLgorICBjb25zdCBjaGFyKiBlcnJvcnM7Cit9OworCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCBFcnJvckNhc2UmIHRlc3RfY2FzZSkgeworICByZXR1cm4gb3V0IDw8IENFc2NhcGUodGVzdF9jYXNlLmlucHV0KTsKK30KKworRXJyb3JDYXNlIGtFcnJvckNhc2VzW10gPSB7CisgICAgLy8gU3RyaW5nIGVycm9ycy4KKyAgICB7IidcXGwnIGZvbyIsIHRydWUsICIwOjI6IEludmFsaWQgZXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZyBsaXRlcmFsLlxuIn0sCisgICAgeyInXFxYJyBmb28iLCB0cnVlLCAiMDoyOiBJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBpbiBzdHJpbmcgbGl0ZXJhbC5cbiJ9LAorICAgIHsiJ1xceCcgZm9vIiwgdHJ1ZSwgIjA6MzogRXhwZWN0ZWQgaGV4IGRpZ2l0cyBmb3IgZXNjYXBlIHNlcXVlbmNlLlxuIn0sCisgICAgeyInZm9vIiwgZmFsc2UsICIwOjQ6IFVuZXhwZWN0ZWQgZW5kIG9mIHN0cmluZy5cbiJ9LAorICAgIHsiJ2JhclxuZm9vIiwgdHJ1ZSwgIjA6NDogU3RyaW5nIGxpdGVyYWxzIGNhbm5vdCBjcm9zcyBsaW5lIGJvdW5kYXJpZXMuXG4ifSwKKyAgICB7IidcXHUwMScgZm9vIiwgdHJ1ZSwKKyAgICAgIjA6NTogRXhwZWN0ZWQgZm91ciBoZXggZGlnaXRzIGZvciBcXHUgZXNjYXBlIHNlcXVlbmNlLlxuIn0sCisgICAgeyInXFx1MDEnIGZvbyIsIHRydWUsCisgICAgICIwOjU6IEV4cGVjdGVkIGZvdXIgaGV4IGRpZ2l0cyBmb3IgXFx1IGVzY2FwZSBzZXF1ZW5jZS5cbiJ9LAorICAgIHsiJ1xcdVhZWicgZm9vIiwgdHJ1ZSwKKyAgICAgIjA6MzogRXhwZWN0ZWQgZm91ciBoZXggZGlnaXRzIGZvciBcXHUgZXNjYXBlIHNlcXVlbmNlLlxuIn0sCisKKyAgICAvLyBJbnRlZ2VyIGVycm9ycy4KKyAgICB7IjEyM2ZvbyIsIHRydWUsICIwOjM6IE5lZWQgc3BhY2UgYmV0d2VlbiBudW1iZXIgYW5kIGlkZW50aWZpZXIuXG4ifSwKKworICAgIC8vIEhleC9vY3RhbCBlcnJvcnMuCisgICAgeyIweCBmb28iLCB0cnVlLCAiMDoyOiBcIjB4XCIgbXVzdCBiZSBmb2xsb3dlZCBieSBoZXggZGlnaXRzLlxuIn0sCisgICAgeyIwNTQxODIzIGZvbyIsIHRydWUsCisgICAgICIwOjQ6IE51bWJlcnMgc3RhcnRpbmcgd2l0aCBsZWFkaW5nIHplcm8gbXVzdCBiZSBpbiBvY3RhbC5cbiJ9LAorICAgIHsiMHgxMjN6IGZvbyIsIHRydWUsICIwOjU6IE5lZWQgc3BhY2UgYmV0d2VlbiBudW1iZXIgYW5kIGlkZW50aWZpZXIuXG4ifSwKKyAgICB7IjB4MTIzLjQgZm9vIiwgdHJ1ZSwgIjA6NTogSGV4IGFuZCBvY3RhbCBudW1iZXJzIG11c3QgYmUgaW50ZWdlcnMuXG4ifSwKKyAgICB7IjAxMjMuNCBmb28iLCB0cnVlLCAiMDo0OiBIZXggYW5kIG9jdGFsIG51bWJlcnMgbXVzdCBiZSBpbnRlZ2Vycy5cbiJ9LAorCisgICAgLy8gRmxvYXQgZXJyb3JzLgorICAgIHsiMWUgZm9vIiwgdHJ1ZSwgIjA6MjogXCJlXCIgbXVzdCBiZSBmb2xsb3dlZCBieSBleHBvbmVudC5cbiJ9LAorICAgIHsiMWUtIGZvbyIsIHRydWUsICIwOjM6IFwiZVwiIG11c3QgYmUgZm9sbG93ZWQgYnkgZXhwb25lbnQuXG4ifSwKKyAgICB7IjEuMi4zIGZvbyIsIHRydWUsCisgICAgICIwOjM6IEFscmVhZHkgc2F3IGRlY2ltYWwgcG9pbnQgb3IgZXhwb25lbnQ7IGNhbid0IGhhdmUgYW5vdGhlciBvbmUuXG4ifSwKKyAgICB7IjFlMi4zIGZvbyIsIHRydWUsCisgICAgICIwOjM6IEFscmVhZHkgc2F3IGRlY2ltYWwgcG9pbnQgb3IgZXhwb25lbnQ7IGNhbid0IGhhdmUgYW5vdGhlciBvbmUuXG4ifSwKKyAgICB7ImEuMSBmb28iLCB0cnVlLAorICAgICAiMDoxOiBOZWVkIHNwYWNlIGJldHdlZW4gaWRlbnRpZmllciBhbmQgZGVjaW1hbCBwb2ludC5cbiJ9LAorICAgIC8vIGFsbG93X2ZfYWZ0ZXJfZmxvYXQgbm90IGVuYWJsZWQsIHNvIHRoaXMgc2hvdWxkIGJlIGFuIGVycm9yLgorICAgIHsiMS4wZiBmb28iLCB0cnVlLCAiMDozOiBOZWVkIHNwYWNlIGJldHdlZW4gbnVtYmVyIGFuZCBpZGVudGlmaWVyLlxuIn0sCisKKyAgICAvLyBCbG9jayBjb21tZW50IGVycm9ycy4KKyAgICB7Ii8qIiwgZmFsc2UsCisgICAgICIwOjI6IEVuZC1vZi1maWxlIGluc2lkZSBibG9jayBjb21tZW50LlxuIgorICAgICAiMDowOiAgIENvbW1lbnQgc3RhcnRlZCBoZXJlLlxuIn0sCisgICAgeyIvKi8qLyBmb28iLCB0cnVlLAorICAgICAiMDozOiBcIi8qXCIgaW5zaWRlIGJsb2NrIGNvbW1lbnQuICBCbG9jayBjb21tZW50cyBjYW5ub3QgYmUgbmVzdGVkLlxuIn0sCisKKyAgICAvLyBDb250cm9sIGNoYXJhY3RlcnMuICBNdWx0aXBsZSBjb25zZWN1dGl2ZSBjb250cm9sIGNoYXJhY3RlcnMgc2hvdWxkIG9ubHkKKyAgICAvLyBwcm9kdWNlIG9uZSBlcnJvci4KKyAgICB7IlxiIGZvbyIsIHRydWUsICIwOjA6IEludmFsaWQgY29udHJvbCBjaGFyYWN0ZXJzIGVuY291bnRlcmVkIGluIHRleHQuXG4ifSwKKyAgICB7IlxiXGIgZm9vIiwgdHJ1ZSwKKyAgICAgIjA6MDogSW52YWxpZCBjb250cm9sIGNoYXJhY3RlcnMgZW5jb3VudGVyZWQgaW4gdGV4dC5cbiJ9LAorCisgICAgLy8gQ2hlY2sgdGhhdCBjb250cm9sIGNoYXJhY3RlcnMgYXQgZW5kIG9mIGlucHV0IGRvbid0IHJlc3VsdCBpbiBhbgorICAgIC8vIGluZmluaXRlIGxvb3AuCisgICAgeyJcYiIsIGZhbHNlLCAiMDowOiBJbnZhbGlkIGNvbnRyb2wgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiB0ZXh0LlxuIn0sCisKKyAgICAvLyBDaGVjayByZWNvdmVyeSBmcm9tICdcMCcuICBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgbGVuZ3RoIG9mCisgICAgLy8gdGhlc2Ugc3RyaW5ncyBiZWNhdXNlIG90aGVyd2lzZSB0aGUgc3RyaW5nIGNvbnN0cnVjdG9yIHdpbGwganVzdCBjYWxsCisgICAgLy8gc3RybGVuKCkgd2hpY2ggd2lsbCBzZWUgdGhlIGZpcnN0ICdcMCcgYW5kIHRoaW5rIHRoYXQgaXMgdGhlIGVuZCBvZiB0aGUKKyAgICAvLyBzdHJpbmcuCisgICAge3N0ZDo6c3RyaW5nKCJcMGZvbyIsIDQpLCB0cnVlLAorICAgICAiMDowOiBJbnZhbGlkIGNvbnRyb2wgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiB0ZXh0LlxuIn0sCisgICAge3N0ZDo6c3RyaW5nKCJcMFwwZm9vIiwgNSksIHRydWUsCisgICAgICIwOjA6IEludmFsaWQgY29udHJvbCBjaGFyYWN0ZXJzIGVuY291bnRlcmVkIGluIHRleHQuXG4ifSwKKworICAgIC8vIENoZWNrIGVycm9yIGZyb20gaGlnaCBvcmRlciBiaXRzIHNldAorICAgIHsiXDMwMGZvbyIsIHRydWUsICIwOjA6IEludGVycHJldGluZyBub24gYXNjaWkgY29kZXBvaW50IDE5Mi5cbiJ9LAorfTsKKworVEVTVF8yRChUb2tlbml6ZXJUZXN0LCBFcnJvcnMsIGtFcnJvckNhc2VzLCBrQmxvY2tTaXplcykgeworICAvLyBTZXQgdXAgdGhlIHRva2VuaXplci4KKyAgVGVzdElucHV0U3RyZWFtIGlucHV0KGtFcnJvckNhc2VzX2Nhc2UuaW5wdXQuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAga0Vycm9yQ2FzZXNfY2FzZS5pbnB1dC5zaXplKCksIGtCbG9ja1NpemVzX2Nhc2UpOworICBUZXN0RXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICBUb2tlbml6ZXIgdG9rZW5pemVyKCZpbnB1dCwgJmVycm9yX2NvbGxlY3Rvcik7CisKKyAgLy8gSWdub3JlIGFsbCBpbnB1dCwgZXhjZXB0IHJlbWVtYmVyIGlmIHRoZSBsYXN0IHRva2VuIHdhcyAiZm9vIi4KKyAgYm9vbCBsYXN0X3dhc19mb28gPSBmYWxzZTsKKyAgd2hpbGUgKHRva2VuaXplci5OZXh0KCkpIHsKKyAgICBsYXN0X3dhc19mb28gPSB0b2tlbml6ZXIuY3VycmVudCgpLnRleHQgPT0gImZvbyI7CisgIH0KKworICAvLyBDaGVjayB0aGF0IHRoZSBlcnJvcnMgbWF0Y2ggd2hhdCB3YXMgZXhwZWN0ZWQuCisgIEVYUEVDVF9FUShrRXJyb3JDYXNlc19jYXNlLmVycm9ycywgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKKworICAvLyBJZiB0aGUgZXJyb3Igd2FzIHJlY292ZXJhYmxlLCBtYWtlIHN1cmUgd2Ugc2F3ICJmb28iIGFmdGVyIGl0LgorICBpZiAoa0Vycm9yQ2FzZXNfY2FzZS5yZWNvdmVyYWJsZSkgeworICAgIEVYUEVDVF9UUlVFKGxhc3Rfd2FzX2Zvbyk7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitURVNUXzFEKFRva2VuaXplclRlc3QsIEJhY2tVcE9uRGVzdHJ1Y3Rpb24sIGtCbG9ja1NpemVzKSB7CisgIHN0ZDo6c3RyaW5nIHRleHQgPSAiZm9vIGJhciI7CisgIFRlc3RJbnB1dFN0cmVhbSBpbnB1dCh0ZXh0LmRhdGEoKSwgdGV4dC5zaXplKCksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIC8vIENyZWF0ZSBhIHRva2VuaXplciwgcmVhZCBvbmUgdG9rZW4sIHRoZW4gZGVzdHJveSBpdC4KKyAgeworICAgIFRlc3RFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgICAgVG9rZW5pemVyIHRva2VuaXplcigmaW5wdXQsICZlcnJvcl9jb2xsZWN0b3IpOworCisgICAgdG9rZW5pemVyLk5leHQoKTsKKyAgfQorCisgIC8vIE9ubHkgImZvbyIgc2hvdWxkIGhhdmUgYmVlbiByZWFkLgorICBFWFBFQ1RfRVEoc3RybGVuKCJmb28iKSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODE1NTVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmNjCkBAIC0wLDAgKzEsNTUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworCitib29sIFplcm9Db3B5T3V0cHV0U3RyZWFtOjpXcml0ZUFsaWFzZWRSYXcoY29uc3Qgdm9pZCogLyogZGF0YSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogc2l6ZSAqLykgeworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVGhpcyBaZXJvQ29weU91dHB1dFN0cmVhbSBkb2Vzbid0IHN1cHBvcnQgYWxpYXNpbmcuICIKKyAgICAgICAgICAgICAgICAiUmVhY2hpbmcgaGVyZSB1c3VhbGx5IG1lYW5zIGEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gIgorICAgICAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvbiBidWcuIjsKKyAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDQxY2JmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmgKQEAgLTAsMCArMSwyNjAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFplcm9Db3B5SW5wdXRTdHJlYW0gYW5kIFplcm9Db3B5T3V0cHV0U3RyZWFtCisvLyBpbnRlcmZhY2VzLCB3aGljaCByZXByZXNlbnQgYWJzdHJhY3QgSS9PIHN0cmVhbXMgdG8gYW5kIGZyb20gd2hpY2gKKy8vIHByb3RvY29sIGJ1ZmZlcnMgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4uICBGb3IgYSBmZXcgc2ltcGxlCisvLyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlc2UgaW50ZXJmYWNlcywgc2VlIHplcm9fY29weV9zdHJlYW1faW1wbC5oLgorLy8KKy8vIFRoZXNlIGludGVyZmFjZXMgYXJlIGRpZmZlcmVudCBmcm9tIGNsYXNzaWMgSS9PIHN0cmVhbXMgaW4gdGhhdCB0aGV5CisvLyB0cnkgdG8gbWluaW1pemUgdGhlIGFtb3VudCBvZiBkYXRhIGNvcHlpbmcgdGhhdCBuZWVkcyB0byBiZSBkb25lLgorLy8gVG8gYWNjb21wbGlzaCB0aGlzLCByZXNwb25zaWJpbGl0eSBmb3IgYWxsb2NhdGluZyBidWZmZXJzIGlzIG1vdmVkIHRvCisvLyB0aGUgc3RyZWFtIG9iamVjdCwgcmF0aGVyIHRoYW4gYmVpbmcgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIuCisvLyBTbywgdGhlIHN0cmVhbSBjYW4gcmV0dXJuIGEgYnVmZmVyIHdoaWNoIGFjdHVhbGx5IHBvaW50cyBkaXJlY3RseSBpbnRvCisvLyB0aGUgZmluYWwgZGF0YSBzdHJ1Y3R1cmUgd2hlcmUgdGhlIGJ5dGVzIGFyZSB0byBiZSBzdG9yZWQsIGFuZCB0aGUgY2FsbGVyCisvLyBjYW4gaW50ZXJhY3QgZGlyZWN0bHkgd2l0aCB0aGF0IGJ1ZmZlciwgZWxpbWluYXRpbmcgYW4gaW50ZXJtZWRpYXRlIGNvcHkKKy8vIG9wZXJhdGlvbi4KKy8vCisvLyBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgY29tbW9uIGNhc2UgaW4gd2hpY2ggeW91IGFyZSByZWFkaW5nIGJ5dGVzCisvLyBmcm9tIGFuIGFycmF5IHRoYXQgaXMgYWxyZWFkeSBpbiBtZW1vcnkgKG9yIHBlcmhhcHMgYW4gbW1hcCgpZWQgZmlsZSkuCisvLyBXaXRoIGNsYXNzaWMgSS9PIHN0cmVhbXMsIHlvdSB3b3VsZCBkbyBzb21ldGhpbmcgbGlrZToKKy8vICAgY2hhciBidWZmZXJbQlVGRkVSX1NJWkVdOworLy8gICBpbnB1dC0+UmVhZChidWZmZXIsIEJVRkZFUl9TSVpFKTsKKy8vICAgRG9Tb21ldGhpbmcoYnVmZmVyLCBCVUZGRVJfU0laRSk7CisvLyBUaGVuLCB0aGUgc3RyZWFtIGJhc2ljYWxseSBqdXN0IGNhbGxzIG1lbWNweSgpIHRvIGNvcHkgdGhlIGRhdGEgZnJvbQorLy8gdGhlIGFycmF5IGludG8geW91ciBidWZmZXIuICBXaXRoIGEgWmVyb0NvcHlJbnB1dFN0cmVhbSwgeW91IHdvdWxkIGRvCisvLyB0aGlzIGluc3RlYWQ6CisvLyAgIGNvbnN0IHZvaWQqIGJ1ZmZlcjsKKy8vICAgaW50IHNpemU7CisvLyAgIGlucHV0LT5OZXh0KCZidWZmZXIsICZzaXplKTsKKy8vICAgRG9Tb21ldGhpbmcoYnVmZmVyLCBzaXplKTsKKy8vIEhlcmUsIG5vIGNvcHkgaXMgcGVyZm9ybWVkLiAgVGhlIGlucHV0IHN0cmVhbSByZXR1cm5zIGEgcG9pbnRlciBkaXJlY3RseQorLy8gaW50byB0aGUgYmFja2luZyBhcnJheSwgYW5kIHRoZSBjYWxsZXIgZW5kcyB1cCByZWFkaW5nIGRpcmVjdGx5IGZyb20gaXQuCisvLworLy8gSWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkIHRoZSBvbGQtZmFzaGlvbiB3YXksIHlvdSBjYW4gY3JlYXRlCisvLyBhIENvZGVkSW5wdXRTdHJlYW0gb3IgQ29kZWRPdXRwdXRTdHJlYW0gd3JhcHBpbmcgdGhlc2Ugb2JqZWN0cyBhbmQgdXNlCisvLyB0aGVpciBSZWFkUmF3KCkvV3JpdGVSYXcoKSBtZXRob2RzLiAgVGhlc2Ugd2lsbCwgb2YgY291cnNlLCBhZGQgYSBjb3B5CisvLyBzdGVwLCBidXQgQ29kZWQqU3RyZWFtIHdpbGwgaGFuZGxlIGJ1ZmZlcmluZyBzbyBhdCBsZWFzdCBpdCB3aWxsIGJlCisvLyByZWFzb25hYmx5IGVmZmljaWVudC4KKy8vCisvLyBaZXJvQ29weUlucHV0U3RyZWFtIGV4YW1wbGU6CisvLyAgIC8vIFJlYWQgaW4gYSBmaWxlIGFuZCBwcmludCBpdHMgY29udGVudHMgdG8gc3Rkb3V0LgorLy8gICBpbnQgZmQgPSBvcGVuKCJteWZpbGUiLCBPX1JET05MWSk7CisvLyAgIFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmZCk7CisvLworLy8gICBjb25zdCB2b2lkKiBidWZmZXI7CisvLyAgIGludCBzaXplOworLy8gICB3aGlsZSAoaW5wdXQtPk5leHQoJmJ1ZmZlciwgJnNpemUpKSB7CisvLyAgICAgY291dC53cml0ZShidWZmZXIsIHNpemUpOworLy8gICB9CisvLworLy8gICBkZWxldGUgaW5wdXQ7CisvLyAgIGNsb3NlKGZkKTsKKy8vCisvLyBaZXJvQ29weU91dHB1dFN0cmVhbSBleGFtcGxlOgorLy8gICAvLyBDb3B5IHRoZSBjb250ZW50cyBvZiAiaW5maWxlIiB0byAib3V0ZmlsZSIsIHVzaW5nIHBsYWluIHJlYWQoKSBmb3IKKy8vICAgLy8gImluZmlsZSIgYnV0IGEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gZm9yICJvdXRmaWxlIi4KKy8vICAgaW50IGluZmQgPSBvcGVuKCJpbmZpbGUiLCBPX1JET05MWSk7CisvLyAgIGludCBvdXRmZCA9IG9wZW4oIm91dGZpbGUiLCBPX1dST05MWSk7CisvLyAgIFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRmZCk7CisvLworLy8gICB2b2lkKiBidWZmZXI7CisvLyAgIGludCBzaXplOworLy8gICB3aGlsZSAob3V0cHV0LT5OZXh0KCZidWZmZXIsICZzaXplKSkgeworLy8gICAgIGludCBieXRlcyA9IHJlYWQoaW5mZCwgYnVmZmVyLCBzaXplKTsKKy8vICAgICBpZiAoYnl0ZXMgPCBzaXplKSB7CisvLyAgICAgICAvLyBSZWFjaGVkIEVPRi4KKy8vICAgICAgIG91dHB1dC0+QmFja1VwKHNpemUgLSBieXRlcyk7CisvLyAgICAgICBicmVhazsKKy8vICAgICB9CisvLyAgIH0KKy8vCisvLyAgIGRlbGV0ZSBvdXRwdXQ7CisvLyAgIGNsb3NlKGluZmQpOworLy8gICBjbG9zZShvdXRmZCk7CisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lPX1pFUk9fQ09QWV9TVFJFQU1fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19aRVJPX0NPUFlfU1RSRUFNX0hfXworCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CisKKy8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgorY2xhc3MgWmVyb0NvcHlJbnB1dFN0cmVhbTsKK2NsYXNzIFplcm9Db3B5T3V0cHV0U3RyZWFtOworCisvLyBBYnN0cmFjdCBpbnRlcmZhY2Ugc2ltaWxhciB0byBhbiBpbnB1dCBzdHJlYW0gYnV0IGRlc2lnbmVkIHRvIG1pbmltaXplCisvLyBjb3B5aW5nLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFplcm9Db3B5SW5wdXRTdHJlYW0geworIHB1YmxpYzoKKyAgWmVyb0NvcHlJbnB1dFN0cmVhbSgpIHt9CisgIHZpcnR1YWwgflplcm9Db3B5SW5wdXRTdHJlYW0oKSB7fQorCisgIC8vIE9idGFpbnMgYSBjaHVuayBvZiBkYXRhIGZyb20gdGhlIHN0cmVhbS4KKyAgLy8KKyAgLy8gUHJlY29uZGl0aW9uczoKKyAgLy8gKiAic2l6ZSIgYW5kICJkYXRhIiBhcmUgbm90IE5VTEwuCisgIC8vCisgIC8vIFBvc3Rjb25kaXRpb25zOgorICAvLyAqIElmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBmYWxzZSwgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHRvIHJldHVybiBvcgorICAvLyAgIGFuIGVycm9yIG9jY3VycmVkLiAgQWxsIGVycm9ycyBhcmUgcGVybWFuZW50LgorICAvLyAqIE90aGVyd2lzZSwgInNpemUiIHBvaW50cyB0byB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyByZWFkIGFuZCAiZGF0YSIKKyAgLy8gICBwb2ludHMgdG8gYSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlc2UgYnl0ZXMuCisgIC8vICogT3duZXJzaGlwIG9mIHRoaXMgYnVmZmVyIHJlbWFpbnMgd2l0aCB0aGUgc3RyZWFtLCBhbmQgdGhlIGJ1ZmZlcgorICAvLyAgIHJlbWFpbnMgdmFsaWQgb25seSB1bnRpbCBzb21lIG90aGVyIG1ldGhvZCBvZiB0aGUgc3RyZWFtIGlzIGNhbGxlZAorICAvLyAgIG9yIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkLgorICAvLyAqIEl0IGlzIGxlZ2FsIGZvciB0aGUgcmV0dXJuZWQgYnVmZmVyIHRvIGhhdmUgemVybyBzaXplLCBhcyBsb25nCisgIC8vICAgYXMgcmVwZWF0ZWRseSBjYWxsaW5nIE5leHQoKSBldmVudHVhbGx5IHlpZWxkcyBhIGJ1ZmZlciB3aXRoIG5vbi16ZXJvCisgIC8vICAgc2l6ZS4KKyAgdmlydHVhbCBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgPSAwOworCisgIC8vIEJhY2tzIHVwIGEgbnVtYmVyIG9mIGJ5dGVzLCBzbyB0aGF0IHRoZSBuZXh0IGNhbGwgdG8gTmV4dCgpIHJldHVybnMKKyAgLy8gZGF0YSBhZ2FpbiB0aGF0IHdhcyBhbHJlYWR5IHJldHVybmVkIGJ5IHRoZSBsYXN0IGNhbGwgdG8gTmV4dCgpLiAgVGhpcworICAvLyBpcyB1c2VmdWwgd2hlbiB3cml0aW5nIHByb2NlZHVyZXMgdGhhdCBhcmUgb25seSBzdXBwb3NlZCB0byByZWFkIHVwCisgIC8vIHRvIGEgY2VydGFpbiBwb2ludCBpbiB0aGUgaW5wdXQsIHRoZW4gcmV0dXJuLiAgSWYgTmV4dCgpIHJldHVybnMgYQorICAvLyBidWZmZXIgdGhhdCBnb2VzIGJleW9uZCB3aGF0IHlvdSB3YW50ZWQgdG8gcmVhZCwgeW91IGNhbiB1c2UgQmFja1VwKCkKKyAgLy8gdG8gcmV0dXJuIHRvIHRoZSBwb2ludCB3aGVyZSB5b3UgaW50ZW5kZWQgdG8gZmluaXNoLgorICAvLworICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHdpdGggYGNvdW50ID0gMGAgdG8gZmluYWxpemUgKGZsdXNoKSBhbnkKKyAgLy8gcHJldmlvdXNseSByZXR1cm5lZCBidWZmZXIuIEZvciBleGFtcGxlLCBhIGZpbGUgb3V0cHV0IHN0cmVhbSBjYW4KKyAgLy8gZmx1c2ggYnVmZmVycyByZXR1cm5lZCBmcm9tIGEgcHJldmlvdXMgY2FsbCB0byBOZXh0KCkgdXBvbiBzdWNoCisgIC8vIEJhY2tVcCgwKSBpbnZvY2F0aW9ucy4gWmVyb0NvcHlPdXRwdXRTdHJlYW0gY2FsbGVycyBzaG91bGQgYWx3YXlzCisgIC8vIGludm9rZSBCYWNrVXAoKSBhZnRlciBhIGZpbmFsIE5leHQoKSBjYWxsLCBldmVuIGlmIHRoZXJlIGlzIG5vCisgIC8vIGV4Y2VzcyBidWZmZXIgZGF0YSB0byBiZSBiYWNrZWQgdXAgdG8gaW5kaWNhdGUgYSBmbHVzaCBwb2ludC4KKyAgLy8KKyAgLy8gUHJlY29uZGl0aW9uczoKKyAgLy8gKiBUaGUgbGFzdCBtZXRob2QgY2FsbGVkIG11c3QgaGF2ZSBiZWVuIE5leHQoKS4KKyAgLy8gKiBjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBidWZmZXIKKyAgLy8gICByZXR1cm5lZCBieSBOZXh0KCkuCisgIC8vCisgIC8vIFBvc3Rjb25kaXRpb25zOgorICAvLyAqIFRoZSBsYXN0ICJjb3VudCIgYnl0ZXMgb2YgdGhlIGxhc3QgYnVmZmVyIHJldHVybmVkIGJ5IE5leHQoKSB3aWxsIGJlCisgIC8vICAgcHVzaGVkIGJhY2sgaW50byB0aGUgc3RyZWFtLiAgU3Vic2VxdWVudCBjYWxscyB0byBOZXh0KCkgd2lsbCByZXR1cm4KKyAgLy8gICB0aGUgc2FtZSBkYXRhIGFnYWluIGJlZm9yZSBwcm9kdWNpbmcgbmV3IGRhdGEuCisgIHZpcnR1YWwgdm9pZCBCYWNrVXAoaW50IGNvdW50KSA9IDA7CisKKyAgLy8gU2tpcHMgYSBudW1iZXIgb2YgYnl0ZXMuICBSZXR1cm5zIGZhbHNlIGlmIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcworICAvLyByZWFjaGVkIG9yIHNvbWUgaW5wdXQgZXJyb3Igb2NjdXJyZWQuICBJbiB0aGUgZW5kLW9mLXN0cmVhbSBjYXNlLCB0aGUKKyAgLy8gc3RyZWFtIGlzIGFkdmFuY2VkIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSAoc28gQnl0ZUNvdW50KCkgd2lsbCByZXR1cm4KKyAgLy8gdGhlIHRvdGFsIHNpemUgb2YgdGhlIHN0cmVhbSkuCisgIHZpcnR1YWwgYm9vbCBTa2lwKGludCBjb3VudCkgPSAwOworCisgIC8vIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkIHNpbmNlIHRoaXMgb2JqZWN0IHdhcyBjcmVhdGVkLgorICB2aXJ0dWFsIGludDY0X3QgQnl0ZUNvdW50KCkgY29uc3QgPSAwOworCisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoWmVyb0NvcHlJbnB1dFN0cmVhbSk7Cit9OworCisvLyBBYnN0cmFjdCBpbnRlcmZhY2Ugc2ltaWxhciB0byBhbiBvdXRwdXQgc3RyZWFtIGJ1dCBkZXNpZ25lZCB0byBtaW5pbWl6ZQorLy8gY29weWluZy4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBaZXJvQ29weU91dHB1dFN0cmVhbSB7CisgcHVibGljOgorICBaZXJvQ29weU91dHB1dFN0cmVhbSgpIHt9CisgIHZpcnR1YWwgflplcm9Db3B5T3V0cHV0U3RyZWFtKCkge30KKworICAvLyBPYnRhaW5zIGEgYnVmZmVyIGludG8gd2hpY2ggZGF0YSBjYW4gYmUgd3JpdHRlbi4gIEFueSBkYXRhIHdyaXR0ZW4KKyAgLy8gaW50byB0aGlzIGJ1ZmZlciB3aWxsIGV2ZW50dWFsbHkgKG1heWJlIGluc3RhbnRseSwgbWF5YmUgbGF0ZXIgb24pCisgIC8vIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dC4KKyAgLy8KKyAgLy8gUHJlY29uZGl0aW9uczoKKyAgLy8gKiAic2l6ZSIgYW5kICJkYXRhIiBhcmUgbm90IE5VTEwuCisgIC8vCisgIC8vIFBvc3Rjb25kaXRpb25zOgorICAvLyAqIElmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBmYWxzZSwgYW4gZXJyb3Igb2NjdXJyZWQuICBBbGwgZXJyb3JzIGFyZQorICAvLyAgIHBlcm1hbmVudC4KKyAgLy8gKiBPdGhlcndpc2UsICJzaXplIiBwb2ludHMgdG8gdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgorICAvLyAgIGFuZCAiZGF0YSIgcG9pbnRzIHRvIHRoZSBidWZmZXIuCisgIC8vICogT3duZXJzaGlwIG9mIHRoaXMgYnVmZmVyIHJlbWFpbnMgd2l0aCB0aGUgc3RyZWFtLCBhbmQgdGhlIGJ1ZmZlcgorICAvLyAgIHJlbWFpbnMgdmFsaWQgb25seSB1bnRpbCBzb21lIG90aGVyIG1ldGhvZCBvZiB0aGUgc3RyZWFtIGlzIGNhbGxlZAorICAvLyAgIG9yIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkLgorICAvLyAqIEFueSBkYXRhIHdoaWNoIHRoZSBjYWxsZXIgc3RvcmVzIGluIHRoaXMgYnVmZmVyIHdpbGwgZXZlbnR1YWxseSBiZQorICAvLyAgIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCAodW5sZXNzIEJhY2tVcCgpIGlzIGNhbGxlZCkuCisgIC8vICogSXQgaXMgbGVnYWwgZm9yIHRoZSByZXR1cm5lZCBidWZmZXIgdG8gaGF2ZSB6ZXJvIHNpemUsIGFzIGxvbmcKKyAgLy8gICBhcyByZXBlYXRlZGx5IGNhbGxpbmcgTmV4dCgpIGV2ZW50dWFsbHkgeWllbGRzIGEgYnVmZmVyIHdpdGggbm9uLXplcm8KKyAgLy8gICBzaXplLgorICB2aXJ0dWFsIGJvb2wgTmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSA9IDA7CisKKyAgLy8gQmFja3MgdXAgYSBudW1iZXIgb2YgYnl0ZXMsIHNvIHRoYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBidWZmZXIgcmV0dXJuZWQKKyAgLy8gYnkgTmV4dCgpIGlzIG5vdCBhY3R1YWxseSB3cml0dGVuLiAgVGhpcyBpcyBuZWVkZWQgd2hlbiB5b3UgZmluaXNoCisgIC8vIHdyaXRpbmcgYWxsIHRoZSBkYXRhIHlvdSB3YW50IHRvIHdyaXRlLCBidXQgdGhlIGxhc3QgYnVmZmVyIHdhcyBiaWdnZXIKKyAgLy8gdGhhbiB5b3UgbmVlZGVkLiAgWW91IGRvbid0IHdhbnQgdG8gd3JpdGUgYSBidW5jaCBvZiBnYXJiYWdlIGFmdGVyIHRoZQorICAvLyBlbmQgb2YgeW91ciBkYXRhLCBzbyB5b3UgdXNlIEJhY2tVcCgpIHRvIGJhY2sgdXAuCisgIC8vCisgIC8vIFByZWNvbmRpdGlvbnM6CisgIC8vICogVGhlIGxhc3QgbWV0aG9kIGNhbGxlZCBtdXN0IGhhdmUgYmVlbiBOZXh0KCkuCisgIC8vICogY291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGxhc3QgYnVmZmVyCisgIC8vICAgcmV0dXJuZWQgYnkgTmV4dCgpLgorICAvLyAqIFRoZSBjYWxsZXIgbXVzdCBub3QgaGF2ZSB3cml0dGVuIGFueXRoaW5nIHRvIHRoZSBsYXN0ICJjb3VudCIgYnl0ZXMKKyAgLy8gICBvZiB0aGF0IGJ1ZmZlci4KKyAgLy8KKyAgLy8gUG9zdGNvbmRpdGlvbnM6CisgIC8vICogVGhlIGxhc3QgImNvdW50IiBieXRlcyBvZiB0aGUgbGFzdCBidWZmZXIgcmV0dXJuZWQgYnkgTmV4dCgpIHdpbGwgYmUKKyAgLy8gICBpZ25vcmVkLgorICB2aXJ0dWFsIHZvaWQgQmFja1VwKGludCBjb3VudCkgPSAwOworCisgIC8vIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHNpbmNlIHRoaXMgb2JqZWN0IHdhcyBjcmVhdGVkLgorICB2aXJ0dWFsIGludDY0X3QgQnl0ZUNvdW50KCkgY29uc3QgPSAwOworCisgIC8vIFdyaXRlIGEgZ2l2ZW4gY2h1bmsgb2YgZGF0YSB0byB0aGUgb3V0cHV0LiAgU29tZSBvdXRwdXQgc3RyZWFtcyBtYXkKKyAgLy8gaW1wbGVtZW50IHRoaXMgaW4gYSB3YXkgdGhhdCBhdm9pZHMgY29weWluZy4gQ2hlY2sgQWxsb3dzQWxpYXNpbmcoKSBiZWZvcmUKKyAgLy8gY2FsbGluZyBXcml0ZUFsaWFzZWRSYXcoKS4gSXQgd2lsbCBHT09HTEVfQ0hFQ0sgZmFpbCBpZiBXcml0ZUFsaWFzZWRSYXcoKSBpcworICAvLyBjYWxsZWQgb24gYSBzdHJlYW0gdGhhdCBkb2VzIG5vdCBhbGxvdyBhbGlhc2luZy4KKyAgLy8KKyAgLy8gTk9URTogSXQgaXMgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlIGNodW5rIG9mIG1lbW9yeQorICAvLyByZW1haW5zIGxpdmUgdW50aWwgYWxsIG9mIHRoZSBkYXRhIGhhcyBiZWVuIGNvbnN1bWVkIGZyb20gdGhlIHN0cmVhbS4KKyAgdmlydHVhbCBib29sIFdyaXRlQWxpYXNlZFJhdyhjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSk7CisgIHZpcnR1YWwgYm9vbCBBbGxvd3NBbGlhc2luZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhaZXJvQ29weU91dHB1dFN0cmVhbSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JT19aRVJPX0NPUFlfU1RSRUFNX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjZiYzg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MKQEAgLTAsMCArMSwzNzIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vaW9fd2luMzIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworI2lmZGVmIF9XSU4zMgorLy8gV2luMzIgbHNlZWsgaXMgYnJva2VuOiAgSWYgaW52b2tlZCBvbiBhIG5vbi1zZWVrYWJsZSBmaWxlIGRlc2NyaXB0b3IsIGl0cworLy8gcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZC4gIFdlIHJlLWRlZmluZSBpdCB0byBhbHdheXMgcHJvZHVjZSBhbiBlcnJvci4KKyNkZWZpbmUgbHNlZWsoZmQsIG9mZnNldCwgb3JpZ2luKSAoKG9mZl90KS0xKQorLy8gRE8gTk9UIGluY2x1ZGUgPGlvLmg+LCBpbnN0ZWFkIGNyZWF0ZSBmdW5jdGlvbnMgaW4gaW9fd2luMzIue2gsY2N9IGFuZCBpbXBvcnQKKy8vIHRoZW0gbGlrZSB3ZSBkbyBiZWxvdy4KK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6YWNjZXNzOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjpjbG9zZTsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6b3BlbjsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6cmVhZDsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6d3JpdGU7CisjZW5kaWYKKworbmFtZXNwYWNlIHsKKworLy8gRUlOVFIgc3Vja3MuCitpbnQgY2xvc2Vfbm9fZWludHIoaW50IGZkKSB7CisgIGludCByZXN1bHQ7CisgIGRvIHsKKyAgICByZXN1bHQgPSBjbG9zZShmZCk7CisgIH0gd2hpbGUgKHJlc3VsdCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaWxlSW5wdXRTdHJlYW06OkZpbGVJbnB1dFN0cmVhbShpbnQgZmlsZV9kZXNjcmlwdG9yLCBpbnQgYmxvY2tfc2l6ZSkKKyAgICA6IGNvcHlpbmdfaW5wdXRfKGZpbGVfZGVzY3JpcHRvciksIGltcGxfKCZjb3B5aW5nX2lucHV0XywgYmxvY2tfc2l6ZSkge30KKworYm9vbCBGaWxlSW5wdXRTdHJlYW06OkNsb3NlKCkgeyByZXR1cm4gY29weWluZ19pbnB1dF8uQ2xvc2UoKTsgfQorCitib29sIEZpbGVJbnB1dFN0cmVhbTo6TmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIHJldHVybiBpbXBsXy5OZXh0KGRhdGEsIHNpemUpOworfQorCit2b2lkIEZpbGVJbnB1dFN0cmVhbTo6QmFja1VwKGludCBjb3VudCkgeyBpbXBsXy5CYWNrVXAoY291bnQpOyB9CisKK2Jvb2wgRmlsZUlucHV0U3RyZWFtOjpTa2lwKGludCBjb3VudCkgeyByZXR1cm4gaW1wbF8uU2tpcChjb3VudCk7IH0KKworaW50NjRfdCBGaWxlSW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLkJ5dGVDb3VudCgpOyB9CisKK0ZpbGVJbnB1dFN0cmVhbTo6Q29weWluZ0ZpbGVJbnB1dFN0cmVhbTo6Q29weWluZ0ZpbGVJbnB1dFN0cmVhbSgKKyAgICBpbnQgZmlsZV9kZXNjcmlwdG9yKQorICAgIDogZmlsZV8oZmlsZV9kZXNjcmlwdG9yKSwKKyAgICAgIGNsb3NlX29uX2RlbGV0ZV8oZmFsc2UpLAorICAgICAgaXNfY2xvc2VkXyhmYWxzZSksCisgICAgICBlcnJub18oMCksCisgICAgICBwcmV2aW91c19zZWVrX2ZhaWxlZF8oZmFsc2UpIHsKKyNpZm5kZWYgX1dJTjMyCisgIGludCBmbGFncyA9IGZjbnRsKGZpbGVfLCBGX0dFVEZMKTsKKyAgZmxhZ3MgJj0gfk9fTk9OQkxPQ0s7CisgIGZjbnRsKGZpbGVfLCBGX1NFVEZMLCBmbGFncyk7CisjZW5kaWYKK30KKworRmlsZUlucHV0U3RyZWFtOjpDb3B5aW5nRmlsZUlucHV0U3RyZWFtOjp+Q29weWluZ0ZpbGVJbnB1dFN0cmVhbSgpIHsKKyAgaWYgKGNsb3NlX29uX2RlbGV0ZV8pIHsKKyAgICBpZiAoIUNsb3NlKCkpIHsKKyAgICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJjbG9zZSgpIGZhaWxlZDogIiA8PCBzdHJlcnJvcihlcnJub18pOworICAgIH0KKyAgfQorfQorCitib29sIEZpbGVJbnB1dFN0cmVhbTo6Q29weWluZ0ZpbGVJbnB1dFN0cmVhbTo6Q2xvc2UoKSB7CisgIEdPT0dMRV9DSEVDSyghaXNfY2xvc2VkXyk7CisKKyAgaXNfY2xvc2VkXyA9IHRydWU7CisgIGlmIChjbG9zZV9ub19laW50cihmaWxlXykgIT0gMCkgeworICAgIC8vIFRoZSBkb2NzIG9uIGNsb3NlKCkgZG8gbm90IHNwZWNpZnkgd2hldGhlciBhIGZpbGUgZGVzY3JpcHRvciBpcyBzdGlsbAorICAgIC8vIG9wZW4gYWZ0ZXIgY2xvc2UoKSBmYWlscyB3aXRoIEVJTy4gIEhvd2V2ZXIsIHRoZSBnbGliYyBzb3VyY2UgY29kZQorICAgIC8vIHNlZW1zIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgbm90LgorICAgIGVycm5vXyA9IGVycm5vOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitpbnQgRmlsZUlucHV0U3RyZWFtOjpDb3B5aW5nRmlsZUlucHV0U3RyZWFtOjpSZWFkKHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpIHsKKyAgR09PR0xFX0NIRUNLKCFpc19jbG9zZWRfKTsKKworICBpbnQgcmVzdWx0OworICBkbyB7CisgICAgcmVzdWx0ID0gcmVhZChmaWxlXywgYnVmZmVyLCBzaXplKTsKKyAgfSB3aGlsZSAocmVzdWx0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAvLyBSZWFkIGVycm9yIChub3QgRU9GKS4KKyAgICBlcnJub18gPSBlcnJubzsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBGaWxlSW5wdXRTdHJlYW06OkNvcHlpbmdGaWxlSW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7CisgIEdPT0dMRV9DSEVDSyghaXNfY2xvc2VkXyk7CisKKyAgaWYgKCFwcmV2aW91c19zZWVrX2ZhaWxlZF8gJiYgbHNlZWsoZmlsZV8sIGNvdW50LCBTRUVLX0NVUikgIT0gKG9mZl90KS0xKSB7CisgICAgLy8gU2VlayBzdWNjZWVkZWQuCisgICAgcmV0dXJuIGNvdW50OworICB9IGVsc2UgeworICAgIC8vIEZhaWxlZCB0byBzZWVrLgorCisgICAgLy8gTm90ZSB0byBzZWxmOiAgRG9uJ3Qgc2VlayBhZ2Fpbi4gIFRoaXMgZmlsZSBkZXNjcmlwdG9yIGRvZXNuJ3QKKyAgICAvLyBzdXBwb3J0IGl0LgorICAgIHByZXZpb3VzX3NlZWtfZmFpbGVkXyA9IHRydWU7CisKKyAgICAvLyBVc2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCisgICAgcmV0dXJuIENvcHlpbmdJbnB1dFN0cmVhbTo6U2tpcChjb3VudCk7CisgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaWxlT3V0cHV0U3RyZWFtOjpGaWxlT3V0cHV0U3RyZWFtKGludCBmaWxlX2Rlc2NyaXB0b3IsIGludCAvKmJsb2NrX3NpemUqLykKKyAgICA6IENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yKCZjb3B5aW5nX291dHB1dF8pLAorICAgICAgY29weWluZ19vdXRwdXRfKGZpbGVfZGVzY3JpcHRvcikge30KKworYm9vbCBGaWxlT3V0cHV0U3RyZWFtOjpDbG9zZSgpIHsKKyAgYm9vbCBmbHVzaF9zdWNjZWVkZWQgPSBGbHVzaCgpOworICByZXR1cm4gY29weWluZ19vdXRwdXRfLkNsb3NlKCkgJiYgZmx1c2hfc3VjY2VlZGVkOworfQorCitGaWxlT3V0cHV0U3RyZWFtOjpDb3B5aW5nRmlsZU91dHB1dFN0cmVhbTo6Q29weWluZ0ZpbGVPdXRwdXRTdHJlYW0oCisgICAgaW50IGZpbGVfZGVzY3JpcHRvcikKKyAgICA6IGZpbGVfKGZpbGVfZGVzY3JpcHRvciksCisgICAgICBjbG9zZV9vbl9kZWxldGVfKGZhbHNlKSwKKyAgICAgIGlzX2Nsb3NlZF8oZmFsc2UpLAorICAgICAgZXJybm9fKDApIHt9CisKK0ZpbGVPdXRwdXRTdHJlYW06On5GaWxlT3V0cHV0U3RyZWFtKCkgeyBGbHVzaCgpOyB9CisKK0ZpbGVPdXRwdXRTdHJlYW06OkNvcHlpbmdGaWxlT3V0cHV0U3RyZWFtOjp+Q29weWluZ0ZpbGVPdXRwdXRTdHJlYW0oKSB7CisgIGlmIChjbG9zZV9vbl9kZWxldGVfKSB7CisgICAgaWYgKCFDbG9zZSgpKSB7CisgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiY2xvc2UoKSBmYWlsZWQ6ICIgPDwgc3RyZXJyb3IoZXJybm9fKTsKKyAgICB9CisgIH0KK30KKworYm9vbCBGaWxlT3V0cHV0U3RyZWFtOjpDb3B5aW5nRmlsZU91dHB1dFN0cmVhbTo6Q2xvc2UoKSB7CisgIEdPT0dMRV9DSEVDSyghaXNfY2xvc2VkXyk7CisKKyAgaXNfY2xvc2VkXyA9IHRydWU7CisgIGlmIChjbG9zZV9ub19laW50cihmaWxlXykgIT0gMCkgeworICAgIC8vIFRoZSBkb2NzIG9uIGNsb3NlKCkgZG8gbm90IHNwZWNpZnkgd2hldGhlciBhIGZpbGUgZGVzY3JpcHRvciBpcyBzdGlsbAorICAgIC8vIG9wZW4gYWZ0ZXIgY2xvc2UoKSBmYWlscyB3aXRoIEVJTy4gIEhvd2V2ZXIsIHRoZSBnbGliYyBzb3VyY2UgY29kZQorICAgIC8vIHNlZW1zIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgbm90LgorICAgIGVycm5vXyA9IGVycm5vOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIEZpbGVPdXRwdXRTdHJlYW06OkNvcHlpbmdGaWxlT3V0cHV0U3RyZWFtOjpXcml0ZShjb25zdCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgeworICBHT09HTEVfQ0hFQ0soIWlzX2Nsb3NlZF8pOworICBpbnQgdG90YWxfd3JpdHRlbiA9IDA7CisKKyAgY29uc3QgdWludDhfdCogYnVmZmVyX2Jhc2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpOworCisgIHdoaWxlICh0b3RhbF93cml0dGVuIDwgc2l6ZSkgeworICAgIGludCBieXRlczsKKyAgICBkbyB7CisgICAgICBieXRlcyA9IHdyaXRlKGZpbGVfLCBidWZmZXJfYmFzZSArIHRvdGFsX3dyaXR0ZW4sIHNpemUgLSB0b3RhbF93cml0dGVuKTsKKyAgICB9IHdoaWxlIChieXRlcyA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisgICAgaWYgKGJ5dGVzIDw9IDApIHsKKyAgICAgIC8vIFdyaXRlIGVycm9yLgorCisgICAgICAvLyBGSVhNRShrZW50b24pOiAgQWNjb3JkaW5nIHRvIHRoZSBtYW4gcGFnZSwgaWYgd3JpdGUoKSByZXR1cm5zIHplcm8sCisgICAgICAvLyAgIHRoZXJlIHdhcyBubyBlcnJvcjsgd3JpdGUoKSBzaW1wbHkgZGlkIG5vdCB3cml0ZSBhbnl0aGluZy4gIEl0J3MKKyAgICAgIC8vICAgdW5jbGVhciB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhpcyBtaWdodCBoYXBwZW4sIGJ1dCBwcmVzdW1hYmx5CisgICAgICAvLyAgIGVycm5vIHdvbid0IGJlIHNldCBpbiB0aGlzIGNhc2UuICBJIGFtIGNvbmZ1c2VkIGFzIHRvIGhvdyBzdWNoIGFuCisgICAgICAvLyAgIGV2ZW50IHNob3VsZCBiZSBoYW5kbGVkLiAgRm9yIG5vdyBJJ20gdHJlYXRpbmcgaXQgYXMgYW4gZXJyb3IsIHNpbmNlCisgICAgICAvLyAgIHJldHJ5aW5nIHNlZW1zIGxpa2UgaXQgY291bGQgbGVhZCB0byBhbiBpbmZpbml0ZSBsb29wLiAgSSBzdXNwZWN0CisgICAgICAvLyAgIHRoaXMgbmV2ZXIgYWN0dWFsbHkgaGFwcGVucyBhbnl3YXkuCisKKyAgICAgIGlmIChieXRlcyA8IDApIHsKKyAgICAgICAgZXJybm9fID0gZXJybm87CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHRvdGFsX3dyaXR0ZW4gKz0gYnl0ZXM7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJc3RyZWFtSW5wdXRTdHJlYW06OklzdHJlYW1JbnB1dFN0cmVhbShzdGQ6OmlzdHJlYW0qIGlucHV0LCBpbnQgYmxvY2tfc2l6ZSkKKyAgICA6IGNvcHlpbmdfaW5wdXRfKGlucHV0KSwgaW1wbF8oJmNvcHlpbmdfaW5wdXRfLCBibG9ja19zaXplKSB7fQorCitib29sIElzdHJlYW1JbnB1dFN0cmVhbTo6TmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIHJldHVybiBpbXBsXy5OZXh0KGRhdGEsIHNpemUpOworfQorCit2b2lkIElzdHJlYW1JbnB1dFN0cmVhbTo6QmFja1VwKGludCBjb3VudCkgeyBpbXBsXy5CYWNrVXAoY291bnQpOyB9CisKK2Jvb2wgSXN0cmVhbUlucHV0U3RyZWFtOjpTa2lwKGludCBjb3VudCkgeyByZXR1cm4gaW1wbF8uU2tpcChjb3VudCk7IH0KKworaW50NjRfdCBJc3RyZWFtSW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLkJ5dGVDb3VudCgpOyB9CisKK0lzdHJlYW1JbnB1dFN0cmVhbTo6Q29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbTo6Q29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbSgKKyAgICBzdGQ6OmlzdHJlYW0qIGlucHV0KQorICAgIDogaW5wdXRfKGlucHV0KSB7fQorCitJc3RyZWFtSW5wdXRTdHJlYW06OkNvcHlpbmdJc3RyZWFtSW5wdXRTdHJlYW06On5Db3B5aW5nSXN0cmVhbUlucHV0U3RyZWFtKCkge30KKworaW50IElzdHJlYW1JbnB1dFN0cmVhbTo6Q29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbTo6UmVhZCh2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSB7CisgIGlucHV0Xy0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPihidWZmZXIpLCBzaXplKTsKKyAgaW50IHJlc3VsdCA9IGlucHV0Xy0+Z2NvdW50KCk7CisgIGlmIChyZXN1bHQgPT0gMCAmJiBpbnB1dF8tPmZhaWwoKSAmJiAhaW5wdXRfLT5lb2YoKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK09zdHJlYW1PdXRwdXRTdHJlYW06Ok9zdHJlYW1PdXRwdXRTdHJlYW0oc3RkOjpvc3RyZWFtKiBvdXRwdXQsIGludCBibG9ja19zaXplKQorICAgIDogY29weWluZ19vdXRwdXRfKG91dHB1dCksIGltcGxfKCZjb3B5aW5nX291dHB1dF8sIGJsb2NrX3NpemUpIHt9CisKK09zdHJlYW1PdXRwdXRTdHJlYW06On5Pc3RyZWFtT3V0cHV0U3RyZWFtKCkgeyBpbXBsXy5GbHVzaCgpOyB9CisKK2Jvb2wgT3N0cmVhbU91dHB1dFN0cmVhbTo6TmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIHJldHVybiBpbXBsXy5OZXh0KGRhdGEsIHNpemUpOworfQorCit2b2lkIE9zdHJlYW1PdXRwdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsgaW1wbF8uQmFja1VwKGNvdW50KTsgfQorCitpbnQ2NF90IE9zdHJlYW1PdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLkJ5dGVDb3VudCgpOyB9CisKK09zdHJlYW1PdXRwdXRTdHJlYW06OkNvcHlpbmdPc3RyZWFtT3V0cHV0U3RyZWFtOjpDb3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbSgKKyAgICBzdGQ6Om9zdHJlYW0qIG91dHB1dCkKKyAgICA6IG91dHB1dF8ob3V0cHV0KSB7fQorCitPc3RyZWFtT3V0cHV0U3RyZWFtOjpDb3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbTo6fkNvcHlpbmdPc3RyZWFtT3V0cHV0U3RyZWFtKCkgeworfQorCitib29sIE9zdHJlYW1PdXRwdXRTdHJlYW06OkNvcHlpbmdPc3RyZWFtT3V0cHV0U3RyZWFtOjpXcml0ZShjb25zdCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgeworICBvdXRwdXRfLT53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihidWZmZXIpLCBzaXplKTsKKyAgcmV0dXJuIG91dHB1dF8tPmdvb2QoKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW06OkNvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbSgKKyAgICBaZXJvQ29weUlucHV0U3RyZWFtKiBjb25zdCBzdHJlYW1zW10sIGludCBjb3VudCkKKyAgICA6IHN0cmVhbXNfKHN0cmVhbXMpLCBzdHJlYW1fY291bnRfKGNvdW50KSwgYnl0ZXNfcmV0aXJlZF8oMCkgeworfQorCitib29sIENvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbTo6TmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIHdoaWxlIChzdHJlYW1fY291bnRfID4gMCkgeworICAgIGlmIChzdHJlYW1zX1swXS0+TmV4dChkYXRhLCBzaXplKSkgcmV0dXJuIHRydWU7CisKKyAgICAvLyBUaGF0IHN0cmVhbSBpcyBkb25lLiAgQWR2YW5jZSB0byB0aGUgbmV4dCBvbmUuCisgICAgYnl0ZXNfcmV0aXJlZF8gKz0gc3RyZWFtc19bMF0tPkJ5dGVDb3VudCgpOworICAgICsrc3RyZWFtc187CisgICAgLS1zdHJlYW1fY291bnRfOworICB9CisKKyAgLy8gTm8gbW9yZSBzdHJlYW1zLgorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtOjpCYWNrVXAoaW50IGNvdW50KSB7CisgIGlmIChzdHJlYW1fY291bnRfID4gMCkgeworICAgIHN0cmVhbXNfWzBdLT5CYWNrVXAoY291bnQpOworICB9IGVsc2UgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiQ2FuJ3QgQmFja1VwKCkgYWZ0ZXIgZmFpbGVkIE5leHQoKS4iOworICB9Cit9CisKK2Jvb2wgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtOjpTa2lwKGludCBjb3VudCkgeworICB3aGlsZSAoc3RyZWFtX2NvdW50XyA+IDApIHsKKyAgICAvLyBBc3N1bWUgdGhhdCBCeXRlQ291bnQoKSBjYW4gYmUgdXNlZCB0byBmaW5kIG91dCBob3cgbXVjaCB3ZSBhY3R1YWxseQorICAgIC8vIHNraXBwZWQgd2hlbiBTa2lwKCkgZmFpbHMuCisgICAgaW50NjRfdCB0YXJnZXRfYnl0ZV9jb3VudCA9IHN0cmVhbXNfWzBdLT5CeXRlQ291bnQoKSArIGNvdW50OworICAgIGlmIChzdHJlYW1zX1swXS0+U2tpcChjb3VudCkpIHJldHVybiB0cnVlOworCisgICAgLy8gSGl0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gIEZpZ3VyZSBvdXQgaG93IG1hbnkgbW9yZSBieXRlcyB3ZSBzdGlsbCBoYXZlCisgICAgLy8gdG8gc2tpcC4KKyAgICBpbnQ2NF90IGZpbmFsX2J5dGVfY291bnQgPSBzdHJlYW1zX1swXS0+Qnl0ZUNvdW50KCk7CisgICAgR09PR0xFX0RDSEVDS19MVChmaW5hbF9ieXRlX2NvdW50LCB0YXJnZXRfYnl0ZV9jb3VudCk7CisgICAgY291bnQgPSB0YXJnZXRfYnl0ZV9jb3VudCAtIGZpbmFsX2J5dGVfY291bnQ7CisKKyAgICAvLyBUaGF0IHN0cmVhbSBpcyBkb25lLiAgQWR2YW5jZSB0byB0aGUgbmV4dCBvbmUuCisgICAgYnl0ZXNfcmV0aXJlZF8gKz0gZmluYWxfYnl0ZV9jb3VudDsKKyAgICArK3N0cmVhbXNfOworICAgIC0tc3RyZWFtX2NvdW50XzsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworaW50NjRfdCBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgaWYgKHN0cmVhbV9jb3VudF8gPT0gMCkgeworICAgIHJldHVybiBieXRlc19yZXRpcmVkXzsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gYnl0ZXNfcmV0aXJlZF8gKyBzdHJlYW1zX1swXS0+Qnl0ZUNvdW50KCk7CisgIH0KK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzg1OTkyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaApAQCAtMCwwICsxLDMzNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBpbnRlcmZhY2VzIGRlZmluZWQgaW4KKy8vIHplcm9fY29weV9zdHJlYW0uaCB3aGljaCBhcmUgb25seSBpbmNsdWRlZCBpbiB0aGUgZnVsbCAobm9uLWxpdGUpCisvLyBwcm90b2J1ZiBsaWJyYXJ5LiAgVGhlc2UgaW1wbGVtZW50YXRpb25zIGluY2x1ZGUgVW5peCBmaWxlIGRlc2NyaXB0b3JzCisvLyBhbmQgQysrIGlvc3RyZWFtcy4gIFNlZSBhbHNvOiAgemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaAorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19aRVJPX0NPUFlfU1RSRUFNX0lNUExfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19aRVJPX0NPUFlfU1RSRUFNX0lNUExfSF9fCisKKworI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQSBaZXJvQ29weUlucHV0U3RyZWFtIHdoaWNoIHJlYWRzIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IuCisvLworLy8gRmlsZUlucHV0U3RyZWFtIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIGFuIGlmc3RyZWFtIHdpdGggSXN0cmVhbUlucHV0U3RyZWFtLgorLy8gVGhlIGxhdHRlciB3aWxsIGludHJvZHVjZSBhbiBleHRyYSBsYXllciBvZiBidWZmZXJpbmcsIGhhcm1pbmcgcGVyZm9ybWFuY2UuCisvLyBBbHNvLCBpdCdzIGNvbmNlaXZhYmxlIHRoYXQgRmlsZUlucHV0U3RyZWFtIGNvdWxkIHNvbWVkYXkgYmUgZW5oYW5jZWQKKy8vIHRvIHVzZSB6ZXJvLWNvcHkgZmlsZSBkZXNjcmlwdG9ycyBvbiBPU3Mgd2hpY2ggc3VwcG9ydCB0aGVtLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEZpbGVJbnB1dFN0cmVhbSBQUk9UT0JVRl9GVVRVUkVfRklOQUwKKyAgICA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCByZWFkcyBmcm9tIHRoZSBnaXZlbiBVbml4IGZpbGUgZGVzY3JpcHRvci4KKyAgLy8gSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0CisgIC8vIHNob3VsZCBiZSByZWFkIGFuZCByZXR1cm5lZCB3aXRoIGVhY2ggY2FsbCB0byBOZXh0KCkuICBPdGhlcndpc2UsCisgIC8vIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzIHVzZWQuCisgIGV4cGxpY2l0IEZpbGVJbnB1dFN0cmVhbShpbnQgZmlsZV9kZXNjcmlwdG9yLCBpbnQgYmxvY2tfc2l6ZSA9IC0xKTsKKworICAvLyBGbHVzaGVzIGFueSBidWZmZXJzIGFuZCBjbG9zZXMgdGhlIHVuZGVybHlpbmcgZmlsZS4gIFJldHVybnMgZmFsc2UgaWYKKyAgLy8gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgcHJvY2VzczsgdXNlIEdldEVycm5vKCkgdG8gZXhhbWluZSB0aGUgZXJyb3IuCisgIC8vIEV2ZW4gaWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGNsb3NlZCB3aGVuIHRoaXMgcmV0dXJucy4KKyAgYm9vbCBDbG9zZSgpOworCisgIC8vIEJ5IGRlZmF1bHQsIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGNsb3NlZCB3aGVuIHRoZSBzdHJlYW0gaXMKKyAgLy8gZGVzdHJveWVkLiAgQ2FsbCBTZXRDbG9zZU9uRGVsZXRlKHRydWUpIHRvIGNoYW5nZSB0aGF0LiAgV0FSTklORzoKKyAgLy8gVGhpcyBsZWF2ZXMgbm8gd2F5IGZvciB0aGUgY2FsbGVyIHRvIGRldGVjdCBpZiBjbG9zZSgpIGZhaWxzLiAgSWYKKyAgLy8gZGV0ZWN0aW5nIGNsb3NlKCkgZXJyb3JzIGlzIGltcG9ydGFudCB0byB5b3UsIHlvdSBzaG91bGQgYXJyYW5nZQorICAvLyB0byBjbG9zZSB0aGUgZGVzY3JpcHRvciB5b3Vyc2VsZi4KKyAgdm9pZCBTZXRDbG9zZU9uRGVsZXRlKGJvb2wgdmFsdWUpIHsgY29weWluZ19pbnB1dF8uU2V0Q2xvc2VPbkRlbGV0ZSh2YWx1ZSk7IH0KKworICAvLyBJZiBhbiBJL08gZXJyb3IgaGFzIG9jY3VycmVkIG9uIHRoaXMgZmlsZSBkZXNjcmlwdG9yLCB0aGlzIGlzIHRoZQorICAvLyBlcnJubyBmcm9tIHRoYXQgZXJyb3IuICBPdGhlcndpc2UsIHRoaXMgaXMgemVyby4gIE9uY2UgYW4gZXJyb3IKKyAgLy8gb2NjdXJzLCB0aGUgc3RyZWFtIGlzIGJyb2tlbiBhbmQgYWxsIHN1YnNlcXVlbnQgb3BlcmF0aW9ucyB3aWxsCisgIC8vIGZhaWwuCisgIGludCBHZXRFcnJubygpIGNvbnN0IHsgcmV0dXJuIGNvcHlpbmdfaW5wdXRfLkdldEVycm5vKCk7IH0KKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5SW5wdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgb3ZlcnJpZGU7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCkgb3ZlcnJpZGU7CisgIGJvb2wgU2tpcChpbnQgY291bnQpIG92ZXJyaWRlOworICBpbnQ2NF90IEJ5dGVDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgY2xhc3MgUFJPVE9CVUZfRVhQT1JUIENvcHlpbmdGaWxlSW5wdXRTdHJlYW0gUFJPVE9CVUZfRlVUVVJFX0ZJTkFMCisgICAgICA6IHB1YmxpYyBDb3B5aW5nSW5wdXRTdHJlYW0geworICAgcHVibGljOgorICAgIENvcHlpbmdGaWxlSW5wdXRTdHJlYW0oaW50IGZpbGVfZGVzY3JpcHRvcik7CisgICAgfkNvcHlpbmdGaWxlSW5wdXRTdHJlYW0oKSBvdmVycmlkZTsKKworICAgIGJvb2wgQ2xvc2UoKTsKKyAgICB2b2lkIFNldENsb3NlT25EZWxldGUoYm9vbCB2YWx1ZSkgeyBjbG9zZV9vbl9kZWxldGVfID0gdmFsdWU7IH0KKyAgICBpbnQgR2V0RXJybm8oKSBjb25zdCB7IHJldHVybiBlcnJub187IH0KKworICAgIC8vIGltcGxlbWVudHMgQ29weWluZ0lucHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGludCBSZWFkKHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpIG92ZXJyaWRlOworICAgIGludCBTa2lwKGludCBjb3VudCkgb3ZlcnJpZGU7CisKKyAgIHByaXZhdGU6CisgICAgLy8gVGhlIGZpbGUgZGVzY3JpcHRvci4KKyAgICBjb25zdCBpbnQgZmlsZV87CisgICAgYm9vbCBjbG9zZV9vbl9kZWxldGVfOworICAgIGJvb2wgaXNfY2xvc2VkXzsKKworICAgIC8vIFRoZSBlcnJubyBvZiB0aGUgSS9PIGVycm9yLCBpZiBvbmUgaGFzIG9jY3VycmVkLiAgT3RoZXJ3aXNlLCB6ZXJvLgorICAgIGludCBlcnJub187CisKKyAgICAvLyBEaWQgd2UgdHJ5IHRvIHNlZWsgb25jZSBhbmQgZmFpbD8gIElmIHNvLCB3ZSBhc3N1bWUgdGhpcyBmaWxlIGRlc2NyaXB0b3IKKyAgICAvLyBkb2Vzbid0IHN1cHBvcnQgc2Vla2luZyBhbmQgd29uJ3QgdHJ5IGFnYWluLgorICAgIGJvb2wgcHJldmlvdXNfc2Vla19mYWlsZWRfOworCisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvcHlpbmdGaWxlSW5wdXRTdHJlYW0pOworICB9OworCisgIENvcHlpbmdGaWxlSW5wdXRTdHJlYW0gY29weWluZ19pbnB1dF87CisgIENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3IgaW1wbF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpbGVJbnB1dFN0cmVhbSk7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIEEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gd2hpY2ggd3JpdGVzIHRvIGEgZmlsZSBkZXNjcmlwdG9yLgorLy8KKy8vIEZpbGVPdXRwdXRTdHJlYW0gaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgYW4gb2ZzdHJlYW0gd2l0aAorLy8gT3N0cmVhbU91dHB1dFN0cmVhbS4gIFRoZSBsYXR0ZXIgd2lsbCBpbnRyb2R1Y2UgYW4gZXh0cmEgbGF5ZXIgb2YgYnVmZmVyaW5nLAorLy8gaGFybWluZyBwZXJmb3JtYW5jZS4gIEFsc28sIGl0J3MgY29uY2VpdmFibGUgdGhhdCBGaWxlT3V0cHV0U3RyZWFtIGNvdWxkCisvLyBzb21lZGF5IGJlIGVuaGFuY2VkIHRvIHVzZSB6ZXJvLWNvcHkgZmlsZSBkZXNjcmlwdG9ycyBvbiBPU3Mgd2hpY2gKKy8vIHN1cHBvcnQgdGhlbS4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBGaWxlT3V0cHV0U3RyZWFtIFBST1RPQlVGX0ZVVFVSRV9GSU5BTAorICAgIDogcHVibGljIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCB3cml0ZXMgdG8gdGhlIGdpdmVuIFVuaXggZmlsZSBkZXNjcmlwdG9yLgorICAvLyBJZiBhIGJsb2NrX3NpemUgaXMgZ2l2ZW4sIGl0IHNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVycworICAvLyB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBieSBOZXh0KCkuICBPdGhlcndpc2UsIGEgcmVhc29uYWJsZSBkZWZhdWx0CisgIC8vIGlzIHVzZWQuCisgIGV4cGxpY2l0IEZpbGVPdXRwdXRTdHJlYW0oaW50IGZpbGVfZGVzY3JpcHRvciwgaW50IGJsb2NrX3NpemUgPSAtMSk7CisKKyAgfkZpbGVPdXRwdXRTdHJlYW0oKSBvdmVycmlkZTsKKworICAvLyBGbHVzaGVzIGFueSBidWZmZXJzIGFuZCBjbG9zZXMgdGhlIHVuZGVybHlpbmcgZmlsZS4gIFJldHVybnMgZmFsc2UgaWYKKyAgLy8gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgcHJvY2VzczsgdXNlIEdldEVycm5vKCkgdG8gZXhhbWluZSB0aGUgZXJyb3IuCisgIC8vIEV2ZW4gaWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGNsb3NlZCB3aGVuIHRoaXMgcmV0dXJucy4KKyAgYm9vbCBDbG9zZSgpOworCisgIC8vIEJ5IGRlZmF1bHQsIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGNsb3NlZCB3aGVuIHRoZSBzdHJlYW0gaXMKKyAgLy8gZGVzdHJveWVkLiAgQ2FsbCBTZXRDbG9zZU9uRGVsZXRlKHRydWUpIHRvIGNoYW5nZSB0aGF0LiAgV0FSTklORzoKKyAgLy8gVGhpcyBsZWF2ZXMgbm8gd2F5IGZvciB0aGUgY2FsbGVyIHRvIGRldGVjdCBpZiBjbG9zZSgpIGZhaWxzLiAgSWYKKyAgLy8gZGV0ZWN0aW5nIGNsb3NlKCkgZXJyb3JzIGlzIGltcG9ydGFudCB0byB5b3UsIHlvdSBzaG91bGQgYXJyYW5nZQorICAvLyB0byBjbG9zZSB0aGUgZGVzY3JpcHRvciB5b3Vyc2VsZi4KKyAgdm9pZCBTZXRDbG9zZU9uRGVsZXRlKGJvb2wgdmFsdWUpIHsgY29weWluZ19vdXRwdXRfLlNldENsb3NlT25EZWxldGUodmFsdWUpOyB9CisKKyAgLy8gSWYgYW4gSS9PIGVycm9yIGhhcyBvY2N1cnJlZCBvbiB0aGlzIGZpbGUgZGVzY3JpcHRvciwgdGhpcyBpcyB0aGUKKyAgLy8gZXJybm8gZnJvbSB0aGF0IGVycm9yLiAgT3RoZXJ3aXNlLCB0aGlzIGlzIHplcm8uICBPbmNlIGFuIGVycm9yCisgIC8vIG9jY3VycywgdGhlIHN0cmVhbSBpcyBicm9rZW4gYW5kIGFsbCBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgd2lsbAorICAvLyBmYWlsLgorICBpbnQgR2V0RXJybm8oKSBjb25zdCB7IHJldHVybiBjb3B5aW5nX291dHB1dF8uR2V0RXJybm8oKTsgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgUFJPVE9CVUZfRVhQT1JUIENvcHlpbmdGaWxlT3V0cHV0U3RyZWFtIFBST1RPQlVGX0ZVVFVSRV9GSU5BTAorICAgICAgOiBwdWJsaWMgQ29weWluZ091dHB1dFN0cmVhbSB7CisgICBwdWJsaWM6CisgICAgQ29weWluZ0ZpbGVPdXRwdXRTdHJlYW0oaW50IGZpbGVfZGVzY3JpcHRvcik7CisgICAgfkNvcHlpbmdGaWxlT3V0cHV0U3RyZWFtKCkgb3ZlcnJpZGU7CisKKyAgICBib29sIENsb3NlKCk7CisgICAgdm9pZCBTZXRDbG9zZU9uRGVsZXRlKGJvb2wgdmFsdWUpIHsgY2xvc2Vfb25fZGVsZXRlXyA9IHZhbHVlOyB9CisgICAgaW50IEdldEVycm5vKCkgY29uc3QgeyByZXR1cm4gZXJybm9fOyB9CisKKyAgICAvLyBpbXBsZW1lbnRzIENvcHlpbmdPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBib29sIFdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpIG92ZXJyaWRlOworCisgICBwcml2YXRlOgorICAgIC8vIFRoZSBmaWxlIGRlc2NyaXB0b3IuCisgICAgY29uc3QgaW50IGZpbGVfOworICAgIGJvb2wgY2xvc2Vfb25fZGVsZXRlXzsKKyAgICBib29sIGlzX2Nsb3NlZF87CisKKyAgICAvLyBUaGUgZXJybm8gb2YgdGhlIEkvTyBlcnJvciwgaWYgb25lIGhhcyBvY2N1cnJlZC4gIE90aGVyd2lzZSwgemVyby4KKyAgICBpbnQgZXJybm9fOworCisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvcHlpbmdGaWxlT3V0cHV0U3RyZWFtKTsKKyAgfTsKKworICBDb3B5aW5nRmlsZU91dHB1dFN0cmVhbSBjb3B5aW5nX291dHB1dF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpbGVPdXRwdXRTdHJlYW0pOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBBIFplcm9Db3B5SW5wdXRTdHJlYW0gd2hpY2ggcmVhZHMgZnJvbSBhIEMrKyBpc3RyZWFtLgorLy8KKy8vIE5vdGUgdGhhdCBmb3IgcmVhZGluZyBmaWxlcyAob3IgYW55dGhpbmcgcmVwcmVzZW50ZWQgYnkgYSBmaWxlIGRlc2NyaXB0b3IpLAorLy8gRmlsZUlucHV0U3RyZWFtIGlzIG1vcmUgZWZmaWNpZW50LgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIElzdHJlYW1JbnB1dFN0cmVhbSBQUk9UT0JVRl9GVVRVUkVfRklOQUwKKyAgICA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCByZWFkcyBmcm9tIHRoZSBnaXZlbiBDKysgaXN0cmVhbS4KKyAgLy8gSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0CisgIC8vIHNob3VsZCBiZSByZWFkIGFuZCByZXR1cm5lZCB3aXRoIGVhY2ggY2FsbCB0byBOZXh0KCkuICBPdGhlcndpc2UsCisgIC8vIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzIHVzZWQuCisgIGV4cGxpY2l0IElzdHJlYW1JbnB1dFN0cmVhbShzdGQ6OmlzdHJlYW0qIHN0cmVhbSwgaW50IGJsb2NrX3NpemUgPSAtMSk7CisKKyAgLy8gaW1wbGVtZW50cyBaZXJvQ29weUlucHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIG92ZXJyaWRlOworICB2b2lkIEJhY2tVcChpbnQgY291bnQpIG92ZXJyaWRlOworICBib29sIFNraXAoaW50IGNvdW50KSBvdmVycmlkZTsKKyAgaW50NjRfdCBCeXRlQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIGNsYXNzIFBST1RPQlVGX0VYUE9SVCBDb3B5aW5nSXN0cmVhbUlucHV0U3RyZWFtIFBST1RPQlVGX0ZVVFVSRV9GSU5BTAorICAgICAgOiBwdWJsaWMgQ29weWluZ0lucHV0U3RyZWFtIHsKKyAgIHB1YmxpYzoKKyAgICBDb3B5aW5nSXN0cmVhbUlucHV0U3RyZWFtKHN0ZDo6aXN0cmVhbSogaW5wdXQpOworICAgIH5Db3B5aW5nSXN0cmVhbUlucHV0U3RyZWFtKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBpbXBsZW1lbnRzIENvcHlpbmdJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBpbnQgUmVhZCh2b2lkKiBidWZmZXIsIGludCBzaXplKSBvdmVycmlkZTsKKyAgICAvLyAoV2UgdXNlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFNraXAoKS4pCisKKyAgIHByaXZhdGU6CisgICAgLy8gVGhlIHN0cmVhbS4KKyAgICBzdGQ6OmlzdHJlYW0qIGlucHV0XzsKKworICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb3B5aW5nSXN0cmVhbUlucHV0U3RyZWFtKTsKKyAgfTsKKworICBDb3B5aW5nSXN0cmVhbUlucHV0U3RyZWFtIGNvcHlpbmdfaW5wdXRfOworICBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yIGltcGxfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJc3RyZWFtSW5wdXRTdHJlYW0pOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBBIFplcm9Db3B5T3V0cHV0U3RyZWFtIHdoaWNoIHdyaXRlcyB0byBhIEMrKyBvc3RyZWFtLgorLy8KKy8vIE5vdGUgdGhhdCBmb3Igd3JpdGluZyBmaWxlcyAob3IgYW55dGhpbmcgcmVwcmVzZW50ZWQgYnkgYSBmaWxlIGRlc2NyaXB0b3IpLAorLy8gRmlsZU91dHB1dFN0cmVhbSBpcyBtb3JlIGVmZmljaWVudC4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBPc3RyZWFtT3V0cHV0U3RyZWFtIFBST1RPQlVGX0ZVVFVSRV9GSU5BTAorICAgIDogcHVibGljIFplcm9Db3B5T3V0cHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCB3cml0ZXMgdG8gdGhlIGdpdmVuIEMrKyBvc3RyZWFtLgorICAvLyBJZiBhIGJsb2NrX3NpemUgaXMgZ2l2ZW4sIGl0IHNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVycworICAvLyB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBieSBOZXh0KCkuICBPdGhlcndpc2UsIGEgcmVhc29uYWJsZSBkZWZhdWx0CisgIC8vIGlzIHVzZWQuCisgIGV4cGxpY2l0IE9zdHJlYW1PdXRwdXRTdHJlYW0oc3RkOjpvc3RyZWFtKiBzdHJlYW0sIGludCBibG9ja19zaXplID0gLTEpOworICB+T3N0cmVhbU91dHB1dFN0cmVhbSgpIG92ZXJyaWRlOworCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSBvdmVycmlkZTsKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KSBvdmVycmlkZTsKKyAgaW50NjRfdCBCeXRlQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIGNsYXNzIFBST1RPQlVGX0VYUE9SVCBDb3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbSBQUk9UT0JVRl9GVVRVUkVfRklOQUwKKyAgICAgIDogcHVibGljIENvcHlpbmdPdXRwdXRTdHJlYW0geworICAgcHVibGljOgorICAgIENvcHlpbmdPc3RyZWFtT3V0cHV0U3RyZWFtKHN0ZDo6b3N0cmVhbSogb3V0cHV0KTsKKyAgICB+Q29weWluZ09zdHJlYW1PdXRwdXRTdHJlYW0oKSBvdmVycmlkZTsKKworICAgIC8vIGltcGxlbWVudHMgQ29weWluZ091dHB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGJvb2wgV3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBpbnQgc2l6ZSkgb3ZlcnJpZGU7CisKKyAgIHByaXZhdGU6CisgICAgLy8gVGhlIHN0cmVhbS4KKyAgICBzdGQ6Om9zdHJlYW0qIG91dHB1dF87CisKKyAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29weWluZ09zdHJlYW1PdXRwdXRTdHJlYW0pOworICB9OworCisgIENvcHlpbmdPc3RyZWFtT3V0cHV0U3RyZWFtIGNvcHlpbmdfb3V0cHV0XzsKKyAgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IgaW1wbF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE9zdHJlYW1PdXRwdXRTdHJlYW0pOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBBIFplcm9Db3B5SW5wdXRTdHJlYW0gd2hpY2ggcmVhZHMgZnJvbSBzZXZlcmFsIG90aGVyIHN0cmVhbXMgaW4gc2VxdWVuY2UuCisvLyBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gaXMgdW5hYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZW5kLW9mLXN0cmVhbQorLy8gYW5kIHJlYWQgZXJyb3JzIGluIHRoZSB1bmRlcmx5aW5nIHN0cmVhbXMsIHNvIGl0IGFzc3VtZXMgYW55IGVycm9ycyBtZWFuCisvLyBlbmQtb2Ytc3RyZWFtLiAgU28sIGlmIHRoZSB1bmRlcmx5aW5nIHN0cmVhbXMgZmFpbCBmb3IgYW55IG90aGVyIHJlYXNvbiwKKy8vIENvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbSBtYXkgZG8gb2RkIHRoaW5ncy4gIEl0IGlzIHN1Z2dlc3RlZCB0aGF0IHlvdSBkbworLy8gbm90IHVzZSBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gb24gc3RyZWFtcyB0aGF0IG1pZ2h0IHByb2R1Y2UgcmVhZCBlcnJvcnMKKy8vIG90aGVyIHRoYW4gZW5kLW9mLXN0cmVhbS4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gUFJPVE9CVUZfRlVUVVJFX0ZJTkFMCisgICAgOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBBbGwgc3RyZWFtcyBwYXNzZWQgaW4gYXMgd2VsbCBhcyB0aGUgYXJyYXkgaXRzZWxmIG11c3QgcmVtYWluIHZhbGlkCisgIC8vIHVudGlsIHRoZSBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gaXMgZGVzdHJveWVkLgorICBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0oWmVyb0NvcHlJbnB1dFN0cmVhbSogY29uc3Qgc3RyZWFtc1tdLCBpbnQgY291bnQpOworICB+Q29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSBvdmVycmlkZTsKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KSBvdmVycmlkZTsKKyAgYm9vbCBTa2lwKGludCBjb3VudCkgb3ZlcnJpZGU7CisgIGludDY0X3QgQnl0ZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisKKworIHByaXZhdGU6CisgIC8vIEFzIHN0cmVhbXMgYXJlIHJldGlyZWQsIHN0cmVhbXNfIGlzIGluY3JlbWVudGVkIGFuZCBjb3VudF8gaXMKKyAgLy8gZGVjcmVtZW50ZWQuCisgIFplcm9Db3B5SW5wdXRTdHJlYW0qIGNvbnN0KiBzdHJlYW1zXzsKKyAgaW50IHN0cmVhbV9jb3VudF87CisgIGludDY0X3QgYnl0ZXNfcmV0aXJlZF87ICAvLyBCeXRlcyByZWFkIGZyb20gcHJldmlvdXMgc3RyZWFtcy4KKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtKTsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU9fWkVST19DT1BZX1NUUkVBTV9JTVBMX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkZmQ4NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuY2MKQEAgLTAsMCArMSw0NzAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworCituYW1lc3BhY2UgeworCisvLyBEZWZhdWx0IGJsb2NrIHNpemUgZm9yIENvcHlpbmd7SW4sT3V0fXB1dFN0cmVhbUFkYXB0b3IuCitzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0QmxvY2tTaXplID0gODE5MjsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQXJyYXlJbnB1dFN0cmVhbTo6QXJyYXlJbnB1dFN0cmVhbShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwgaW50IGJsb2NrX3NpemUpCisgICAgOiBkYXRhXyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihkYXRhKSksCisgICAgICBzaXplXyhzaXplKSwKKyAgICAgIGJsb2NrX3NpemVfKGJsb2NrX3NpemUgPiAwID8gYmxvY2tfc2l6ZSA6IHNpemUpLAorICAgICAgcG9zaXRpb25fKDApLAorICAgICAgbGFzdF9yZXR1cm5lZF9zaXplXygwKSB7fQorCitib29sIEFycmF5SW5wdXRTdHJlYW06Ok5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICBpZiAocG9zaXRpb25fIDwgc2l6ZV8pIHsKKyAgICBsYXN0X3JldHVybmVkX3NpemVfID0gc3RkOjptaW4oYmxvY2tfc2l6ZV8sIHNpemVfIC0gcG9zaXRpb25fKTsKKyAgICAqZGF0YSA9IGRhdGFfICsgcG9zaXRpb25fOworICAgICpzaXplID0gbGFzdF9yZXR1cm5lZF9zaXplXzsKKyAgICBwb3NpdGlvbl8gKz0gbGFzdF9yZXR1cm5lZF9zaXplXzsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICAvLyBXZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheS4KKyAgICBsYXN0X3JldHVybmVkX3NpemVfID0gMDsgIC8vIERvbid0IGxldCBjYWxsZXIgYmFjayB1cC4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKwordm9pZCBBcnJheUlucHV0U3RyZWFtOjpCYWNrVXAoaW50IGNvdW50KSB7CisgIEdPT0dMRV9DSEVDS19HVChsYXN0X3JldHVybmVkX3NpemVfLCAwKQorICAgICAgPDwgIkJhY2tVcCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgTmV4dCgpLiI7CisgIEdPT0dMRV9DSEVDS19MRShjb3VudCwgbGFzdF9yZXR1cm5lZF9zaXplXyk7CisgIEdPT0dMRV9DSEVDS19HRShjb3VudCwgMCk7CisgIHBvc2l0aW9uXyAtPSBjb3VudDsKKyAgbGFzdF9yZXR1cm5lZF9zaXplXyA9IDA7ICAvLyBEb24ndCBsZXQgY2FsbGVyIGJhY2sgdXAgZnVydGhlci4KK30KKworYm9vbCBBcnJheUlucHV0U3RyZWFtOjpTa2lwKGludCBjb3VudCkgeworICBHT09HTEVfQ0hFQ0tfR0UoY291bnQsIDApOworICBsYXN0X3JldHVybmVkX3NpemVfID0gMDsgIC8vIERvbid0IGxldCBjYWxsZXIgYmFjayB1cC4KKyAgaWYgKGNvdW50ID4gc2l6ZV8gLSBwb3NpdGlvbl8pIHsKKyAgICBwb3NpdGlvbl8gPSBzaXplXzsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgcG9zaXRpb25fICs9IGNvdW50OworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK2ludDY0X3QgQXJyYXlJbnB1dFN0cmVhbTo6Qnl0ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gcG9zaXRpb25fOyB9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBcnJheU91dHB1dFN0cmVhbTo6QXJyYXlPdXRwdXRTdHJlYW0odm9pZCogZGF0YSwgaW50IHNpemUsIGludCBibG9ja19zaXplKQorICAgIDogZGF0YV8ocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZGF0YSkpLAorICAgICAgc2l6ZV8oc2l6ZSksCisgICAgICBibG9ja19zaXplXyhibG9ja19zaXplID4gMCA/IGJsb2NrX3NpemUgOiBzaXplKSwKKyAgICAgIHBvc2l0aW9uXygwKSwKKyAgICAgIGxhc3RfcmV0dXJuZWRfc2l6ZV8oMCkge30KKworYm9vbCBBcnJheU91dHB1dFN0cmVhbTo6TmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIGlmIChwb3NpdGlvbl8gPCBzaXplXykgeworICAgIGxhc3RfcmV0dXJuZWRfc2l6ZV8gPSBzdGQ6Om1pbihibG9ja19zaXplXywgc2l6ZV8gLSBwb3NpdGlvbl8pOworICAgICpkYXRhID0gZGF0YV8gKyBwb3NpdGlvbl87CisgICAgKnNpemUgPSBsYXN0X3JldHVybmVkX3NpemVfOworICAgIHBvc2l0aW9uXyArPSBsYXN0X3JldHVybmVkX3NpemVfOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIC8vIFdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LgorICAgIGxhc3RfcmV0dXJuZWRfc2l6ZV8gPSAwOyAgLy8gRG9uJ3QgbGV0IGNhbGxlciBiYWNrIHVwLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit2b2lkIEFycmF5T3V0cHV0U3RyZWFtOjpCYWNrVXAoaW50IGNvdW50KSB7CisgIEdPT0dMRV9DSEVDS19MRShjb3VudCwgbGFzdF9yZXR1cm5lZF9zaXplXykKKyAgICAgIDw8ICJCYWNrVXAoKSBjYW4gbm90IGV4Y2VlZCB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBOZXh0KCkgY2FsbC4iOworICBHT09HTEVfQ0hFQ0tfR0UoY291bnQsIDApOworICBwb3NpdGlvbl8gLT0gY291bnQ7CisgIGxhc3RfcmV0dXJuZWRfc2l6ZV8gLT0gY291bnQ7Cit9CisKK2ludDY0X3QgQXJyYXlPdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIHBvc2l0aW9uXzsgfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1N0cmluZ091dHB1dFN0cmVhbTo6U3RyaW5nT3V0cHV0U3RyZWFtKHN0ZDo6c3RyaW5nKiB0YXJnZXQpIDogdGFyZ2V0Xyh0YXJnZXQpIHt9CisKK2Jvb2wgU3RyaW5nT3V0cHV0U3RyZWFtOjpOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgR09PR0xFX0NIRUNLKHRhcmdldF8gIT0gTlVMTCk7CisgIHNpemVfdCBvbGRfc2l6ZSA9IHRhcmdldF8tPnNpemUoKTsKKworICAvLyBHcm93IHRoZSBzdHJpbmcuCisgIHNpemVfdCBuZXdfc2l6ZTsKKyAgaWYgKG9sZF9zaXplIDwgdGFyZ2V0Xy0+Y2FwYWNpdHkoKSkgeworICAgIC8vIFJlc2l6ZSB0aGUgc3RyaW5nIHRvIG1hdGNoIGl0cyBjYXBhY2l0eSwgc2luY2Ugd2UgY2FuIGdldCBhd2F5CisgICAgLy8gd2l0aG91dCBhIG1lbW9yeSBhbGxvY2F0aW9uIHRoaXMgd2F5LgorICAgIG5ld19zaXplID0gdGFyZ2V0Xy0+Y2FwYWNpdHkoKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBTaXplIGhhcyByZWFjaGVkIGNhcGFjaXR5LCB0cnkgdG8gZG91YmxlIGl0LgorICAgIG5ld19zaXplID0gb2xkX3NpemUgKiAyOworICB9CisgIC8vIEF2b2lkIGludGVnZXIgb3ZlcmZsb3cgaW4gcmV0dXJuZWQgJypzaXplJy4KKyAgbmV3X3NpemUgPSBzdGQ6Om1pbihuZXdfc2l6ZSwgb2xkX3NpemUgKyBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpKTsKKyAgLy8gSW5jcmVhc2UgdGhlIHNpemUsIGFsc28gbWFrZSBzdXJlIHRoYXQgaXQgaXMgYXQgbGVhc3Qga01pbmltdW1TaXplLgorICBTVExTdHJpbmdSZXNpemVVbmluaXRpYWxpemVkKAorICAgICAgdGFyZ2V0XywKKyAgICAgIHN0ZDo6bWF4KG5ld19zaXplLAorICAgICAgICAgICAgICAga01pbmltdW1TaXplICsgMCkpOyAgLy8gIisgMCIgd29ya3MgYXJvdW5kIEdDQzQgd2VpcmRuZXNzLgorCisgICpkYXRhID0gbXV0YWJsZV9zdHJpbmdfZGF0YSh0YXJnZXRfKSArIG9sZF9zaXplOworICAqc2l6ZSA9IHRhcmdldF8tPnNpemUoKSAtIG9sZF9zaXplOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTdHJpbmdPdXRwdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKKyAgR09PR0xFX0NIRUNLX0dFKGNvdW50LCAwKTsKKyAgR09PR0xFX0NIRUNLKHRhcmdldF8gIT0gTlVMTCk7CisgIEdPT0dMRV9DSEVDS19MRShzdGF0aWNfY2FzdDxzaXplX3Q+KGNvdW50KSwgdGFyZ2V0Xy0+c2l6ZSgpKTsKKyAgdGFyZ2V0Xy0+cmVzaXplKHRhcmdldF8tPnNpemUoKSAtIGNvdW50KTsKK30KKworaW50NjRfdCBTdHJpbmdPdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKHRhcmdldF8gIT0gTlVMTCk7CisgIHJldHVybiB0YXJnZXRfLT5zaXplKCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW50IENvcHlpbmdJbnB1dFN0cmVhbTo6U2tpcChpbnQgY291bnQpIHsKKyAgY2hhciBqdW5rWzQwOTZdOworICBpbnQgc2tpcHBlZCA9IDA7CisgIHdoaWxlIChza2lwcGVkIDwgY291bnQpIHsKKyAgICBpbnQgYnl0ZXMgPSBSZWFkKGp1bmssIHN0ZDo6bWluKGNvdW50IC0gc2tpcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0X2Nhc3Q8aW50PihzaXplb2YoanVuaykpKSk7CisgICAgaWYgKGJ5dGVzIDw9IDApIHsKKyAgICAgIC8vIEVPRiBvciByZWFkIGVycm9yLgorICAgICAgcmV0dXJuIHNraXBwZWQ7CisgICAgfQorICAgIHNraXBwZWQgKz0gYnl0ZXM7CisgIH0KKyAgcmV0dXJuIHNraXBwZWQ7Cit9CisKK0NvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3I6OkNvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3IoCisgICAgQ29weWluZ0lucHV0U3RyZWFtKiBjb3B5aW5nX3N0cmVhbSwgaW50IGJsb2NrX3NpemUpCisgICAgOiBjb3B5aW5nX3N0cmVhbV8oY29weWluZ19zdHJlYW0pLAorICAgICAgb3duc19jb3B5aW5nX3N0cmVhbV8oZmFsc2UpLAorICAgICAgZmFpbGVkXyhmYWxzZSksCisgICAgICBwb3NpdGlvbl8oMCksCisgICAgICBidWZmZXJfc2l6ZV8oYmxvY2tfc2l6ZSA+IDAgPyBibG9ja19zaXplIDoga0RlZmF1bHRCbG9ja1NpemUpLAorICAgICAgYnVmZmVyX3VzZWRfKDApLAorICAgICAgYmFja3VwX2J5dGVzXygwKSB7fQorCitDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yOjp+Q29weWluZ0lucHV0U3RyZWFtQWRhcHRvcigpIHsKKyAgaWYgKG93bnNfY29weWluZ19zdHJlYW1fKSB7CisgICAgZGVsZXRlIGNvcHlpbmdfc3RyZWFtXzsKKyAgfQorfQorCitib29sIENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3I6Ok5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICBpZiAoZmFpbGVkXykgeworICAgIC8vIEFscmVhZHkgZmFpbGVkIG9uIGEgcHJldmlvdXMgcmVhZC4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBBbGxvY2F0ZUJ1ZmZlcklmTmVlZGVkKCk7CisKKyAgaWYgKGJhY2t1cF9ieXRlc18gPiAwKSB7CisgICAgLy8gV2UgaGF2ZSBkYXRhIGxlZnQgb3ZlciBmcm9tIGEgcHJldmlvdXMgQmFja1VwKCksIHNvIGp1c3QgcmV0dXJuIHRoYXQuCisgICAgKmRhdGEgPSBidWZmZXJfLmdldCgpICsgYnVmZmVyX3VzZWRfIC0gYmFja3VwX2J5dGVzXzsKKyAgICAqc2l6ZSA9IGJhY2t1cF9ieXRlc187CisgICAgYmFja3VwX2J5dGVzXyA9IDA7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBSZWFkIG5ldyBkYXRhIGludG8gdGhlIGJ1ZmZlci4KKyAgYnVmZmVyX3VzZWRfID0gY29weWluZ19zdHJlYW1fLT5SZWFkKGJ1ZmZlcl8uZ2V0KCksIGJ1ZmZlcl9zaXplXyk7CisgIGlmIChidWZmZXJfdXNlZF8gPD0gMCkgeworICAgIC8vIEVPRiBvciByZWFkIGVycm9yLiAgV2UgZG9uJ3QgbmVlZCB0aGUgYnVmZmVyIGFueW1vcmUuCisgICAgaWYgKGJ1ZmZlcl91c2VkXyA8IDApIHsKKyAgICAgIC8vIFJlYWQgZXJyb3IgKG5vdCBFT0YpLgorICAgICAgZmFpbGVkXyA9IHRydWU7CisgICAgfQorICAgIEZyZWVCdWZmZXIoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcG9zaXRpb25fICs9IGJ1ZmZlcl91c2VkXzsKKworICAqc2l6ZSA9IGJ1ZmZlcl91c2VkXzsKKyAgKmRhdGEgPSBidWZmZXJfLmdldCgpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yOjpCYWNrVXAoaW50IGNvdW50KSB7CisgIEdPT0dMRV9DSEVDSyhiYWNrdXBfYnl0ZXNfID09IDAgJiYgYnVmZmVyXy5nZXQoKSAhPSBOVUxMKQorICAgICAgPDwgIiBCYWNrVXAoKSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgTmV4dCgpLiI7CisgIEdPT0dMRV9DSEVDS19MRShjb3VudCwgYnVmZmVyX3VzZWRfKQorICAgICAgPDwgIiBDYW4ndCBiYWNrIHVwIG92ZXIgbW9yZSBieXRlcyB0aGFuIHdlcmUgcmV0dXJuZWQgYnkgdGhlIGxhc3QgY2FsbCIKKyAgICAgICAgICIgdG8gTmV4dCgpLiI7CisgIEdPT0dMRV9DSEVDS19HRShjb3VudCwgMCkgPDwgIiBQYXJhbWV0ZXIgdG8gQmFja1VwKCkgY2FuJ3QgYmUgbmVnYXRpdmUuIjsKKworICBiYWNrdXBfYnl0ZXNfID0gY291bnQ7Cit9CisKK2Jvb2wgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvcjo6U2tpcChpbnQgY291bnQpIHsKKyAgR09PR0xFX0NIRUNLX0dFKGNvdW50LCAwKTsKKworICBpZiAoZmFpbGVkXykgeworICAgIC8vIEFscmVhZHkgZmFpbGVkIG9uIGEgcHJldmlvdXMgcmVhZC4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBGaXJzdCBza2lwIGFueSBieXRlcyBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzIEJhY2tVcCgpLgorICBpZiAoYmFja3VwX2J5dGVzXyA+PSBjb3VudCkgeworICAgIC8vIFdlIGhhdmUgbW9yZSBkYXRhIGxlZnQgb3ZlciB0aGFuIHdlJ3JlIHRyeWluZyB0byBza2lwLiAgSnVzdCBjaG9wIGl0LgorICAgIGJhY2t1cF9ieXRlc18gLT0gY291bnQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb3VudCAtPSBiYWNrdXBfYnl0ZXNfOworICBiYWNrdXBfYnl0ZXNfID0gMDsKKworICBpbnQgc2tpcHBlZCA9IGNvcHlpbmdfc3RyZWFtXy0+U2tpcChjb3VudCk7CisgIHBvc2l0aW9uXyArPSBza2lwcGVkOworICByZXR1cm4gc2tpcHBlZCA9PSBjb3VudDsKK30KKworaW50NjRfdCBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yOjpCeXRlQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBwb3NpdGlvbl8gLSBiYWNrdXBfYnl0ZXNfOworfQorCit2b2lkIENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3I6OkFsbG9jYXRlQnVmZmVySWZOZWVkZWQoKSB7CisgIGlmIChidWZmZXJfLmdldCgpID09IE5VTEwpIHsKKyAgICBidWZmZXJfLnJlc2V0KG5ldyB1aW50OF90W2J1ZmZlcl9zaXplX10pOworICB9Cit9CisKK3ZvaWQgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvcjo6RnJlZUJ1ZmZlcigpIHsKKyAgR09PR0xFX0NIRUNLX0VRKGJhY2t1cF9ieXRlc18sIDApOworICBidWZmZXJfdXNlZF8gPSAwOworICBidWZmZXJfLnJlc2V0KCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3I6OkNvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yKAorICAgIENvcHlpbmdPdXRwdXRTdHJlYW0qIGNvcHlpbmdfc3RyZWFtLCBpbnQgYmxvY2tfc2l6ZSkKKyAgICA6IGNvcHlpbmdfc3RyZWFtXyhjb3B5aW5nX3N0cmVhbSksCisgICAgICBvd25zX2NvcHlpbmdfc3RyZWFtXyhmYWxzZSksCisgICAgICBmYWlsZWRfKGZhbHNlKSwKKyAgICAgIHBvc2l0aW9uXygwKSwKKyAgICAgIGJ1ZmZlcl9zaXplXyhibG9ja19zaXplID4gMCA/IGJsb2NrX3NpemUgOiBrRGVmYXVsdEJsb2NrU2l6ZSksCisgICAgICBidWZmZXJfdXNlZF8oMCkge30KKworQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3I6On5Db3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcigpIHsKKyAgV3JpdGVCdWZmZXIoKTsKKyAgaWYgKG93bnNfY29weWluZ19zdHJlYW1fKSB7CisgICAgZGVsZXRlIGNvcHlpbmdfc3RyZWFtXzsKKyAgfQorfQorCitib29sIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yOjpGbHVzaCgpIHsgcmV0dXJuIFdyaXRlQnVmZmVyKCk7IH0KKworYm9vbCBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcjo6TmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIGlmIChidWZmZXJfdXNlZF8gPT0gYnVmZmVyX3NpemVfKSB7CisgICAgaWYgKCFXcml0ZUJ1ZmZlcigpKSByZXR1cm4gZmFsc2U7CisgIH0KKworICBBbGxvY2F0ZUJ1ZmZlcklmTmVlZGVkKCk7CisKKyAgKmRhdGEgPSBidWZmZXJfLmdldCgpICsgYnVmZmVyX3VzZWRfOworICAqc2l6ZSA9IGJ1ZmZlcl9zaXplXyAtIGJ1ZmZlcl91c2VkXzsKKyAgYnVmZmVyX3VzZWRfID0gYnVmZmVyX3NpemVfOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcjo6QmFja1VwKGludCBjb3VudCkgeworICBpZiAoY291bnQgPT0gMCkgeworICAgIEZsdXNoKCk7CisgICAgcmV0dXJuOworICB9CisgIEdPT0dMRV9DSEVDS19HRShjb3VudCwgMCk7CisgIEdPT0dMRV9DSEVDS19FUShidWZmZXJfdXNlZF8sIGJ1ZmZlcl9zaXplXykKKyAgICAgIDw8ICIgQmFja1VwKCkgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIE5leHQoKS4iOworICBHT09HTEVfQ0hFQ0tfTEUoY291bnQsIGJ1ZmZlcl91c2VkXykKKyAgICAgIDw8ICIgQ2FuJ3QgYmFjayB1cCBvdmVyIG1vcmUgYnl0ZXMgdGhhbiB3ZXJlIHJldHVybmVkIGJ5IHRoZSBsYXN0IGNhbGwiCisgICAgICAgICAiIHRvIE5leHQoKS4iOworCisgIGJ1ZmZlcl91c2VkXyAtPSBjb3VudDsKK30KKworaW50NjRfdCBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcjo6Qnl0ZUNvdW50KCkgY29uc3QgeworICByZXR1cm4gcG9zaXRpb25fICsgYnVmZmVyX3VzZWRfOworfQorCitib29sIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yOjpXcml0ZUFsaWFzZWRSYXcoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpIHsKKyAgaWYgKHNpemUgPj0gYnVmZmVyX3NpemVfKSB7CisgICAgaWYgKCFGbHVzaCgpIHx8ICFjb3B5aW5nX3N0cmVhbV8tPldyaXRlKGRhdGEsIHNpemUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEdPT0dMRV9EQ0hFQ0tfRVEoYnVmZmVyX3VzZWRfLCAwKTsKKyAgICBwb3NpdGlvbl8gKz0gc2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHZvaWQqIG91dDsKKyAgaW50IG91dF9zaXplOworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICghTmV4dCgmb3V0LCAmb3V0X3NpemUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHNpemUgPD0gb3V0X3NpemUpIHsKKyAgICAgIHN0ZDo6bWVtY3B5KG91dCwgZGF0YSwgc2l6ZSk7CisgICAgICBCYWNrVXAob3V0X3NpemUgLSBzaXplKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0ZDo6bWVtY3B5KG91dCwgZGF0YSwgb3V0X3NpemUpOworICAgIGRhdGEgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSkgKyBvdXRfc2l6ZTsKKyAgICBzaXplIC09IG91dF9zaXplOworICB9CisgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3I6OldyaXRlQnVmZmVyKCkgeworICBpZiAoZmFpbGVkXykgeworICAgIC8vIEFscmVhZHkgZmFpbGVkIG9uIGEgcHJldmlvdXMgd3JpdGUuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGJ1ZmZlcl91c2VkXyA9PSAwKSByZXR1cm4gdHJ1ZTsKKworICBpZiAoY29weWluZ19zdHJlYW1fLT5Xcml0ZShidWZmZXJfLmdldCgpLCBidWZmZXJfdXNlZF8pKSB7CisgICAgcG9zaXRpb25fICs9IGJ1ZmZlcl91c2VkXzsKKyAgICBidWZmZXJfdXNlZF8gPSAwOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIGZhaWxlZF8gPSB0cnVlOworICAgIEZyZWVCdWZmZXIoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKwordm9pZCBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcjo6QWxsb2NhdGVCdWZmZXJJZk5lZWRlZCgpIHsKKyAgaWYgKGJ1ZmZlcl8gPT0gTlVMTCkgeworICAgIGJ1ZmZlcl8ucmVzZXQobmV3IHVpbnQ4X3RbYnVmZmVyX3NpemVfXSk7CisgIH0KK30KKwordm9pZCBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcjo6RnJlZUJ1ZmZlcigpIHsKKyAgYnVmZmVyX3VzZWRfID0gMDsKKyAgYnVmZmVyXy5yZXNldCgpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0xpbWl0aW5nSW5wdXRTdHJlYW06OkxpbWl0aW5nSW5wdXRTdHJlYW0oWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGltaXQpCisgICAgOiBpbnB1dF8oaW5wdXQpLCBsaW1pdF8obGltaXQpIHsKKyAgcHJpb3JfYnl0ZXNfcmVhZF8gPSBpbnB1dF8tPkJ5dGVDb3VudCgpOworfQorCitMaW1pdGluZ0lucHV0U3RyZWFtOjp+TGltaXRpbmdJbnB1dFN0cmVhbSgpIHsKKyAgLy8gSWYgd2Ugb3ZlcnNob3QgdGhlIGxpbWl0LCBiYWNrIHVwLgorICBpZiAobGltaXRfIDwgMCkgaW5wdXRfLT5CYWNrVXAoLWxpbWl0Xyk7Cit9CisKK2Jvb2wgTGltaXRpbmdJbnB1dFN0cmVhbTo6TmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIGlmIChsaW1pdF8gPD0gMCkgcmV0dXJuIGZhbHNlOworICBpZiAoIWlucHV0Xy0+TmV4dChkYXRhLCBzaXplKSkgcmV0dXJuIGZhbHNlOworCisgIGxpbWl0XyAtPSAqc2l6ZTsKKyAgaWYgKGxpbWl0XyA8IDApIHsKKyAgICAvLyBXZSBvdmVyc2hvdCB0aGUgbGltaXQuICBSZWR1Y2UgKnNpemUgdG8gaGlkZSB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyLgorICAgICpzaXplICs9IGxpbWl0XzsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBMaW1pdGluZ0lucHV0U3RyZWFtOjpCYWNrVXAoaW50IGNvdW50KSB7CisgIGlmIChsaW1pdF8gPCAwKSB7CisgICAgaW5wdXRfLT5CYWNrVXAoY291bnQgLSBsaW1pdF8pOworICAgIGxpbWl0XyA9IGNvdW50OworICB9IGVsc2UgeworICAgIGlucHV0Xy0+QmFja1VwKGNvdW50KTsKKyAgICBsaW1pdF8gKz0gY291bnQ7CisgIH0KK30KKworYm9vbCBMaW1pdGluZ0lucHV0U3RyZWFtOjpTa2lwKGludCBjb3VudCkgeworICBpZiAoY291bnQgPiBsaW1pdF8pIHsKKyAgICBpZiAobGltaXRfIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIGlucHV0Xy0+U2tpcChsaW1pdF8pOworICAgIGxpbWl0XyA9IDA7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIGlmICghaW5wdXRfLT5Ta2lwKGNvdW50KSkgcmV0dXJuIGZhbHNlOworICAgIGxpbWl0XyAtPSBjb3VudDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitpbnQ2NF90IExpbWl0aW5nSW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgaWYgKGxpbWl0XyA8IDApIHsKKyAgICByZXR1cm4gaW5wdXRfLT5CeXRlQ291bnQoKSArIGxpbWl0XyAtIHByaW9yX2J5dGVzX3JlYWRfOworICB9IGVsc2UgeworICAgIHJldHVybiBpbnB1dF8tPkJ5dGVDb3VudCgpIC0gcHJpb3JfYnl0ZXNfcmVhZF87CisgIH0KK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkYTMyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaApAQCAtMCwwICsxLDQxMyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBpbnRlcmZhY2VzIGRlZmluZWQgaW4KKy8vIHplcm9fY29weV9zdHJlYW0uaCB3aGljaCBhcmUgaW5jbHVkZWQgaW4gdGhlICJsaXRlIiBwcm90b2J1ZiBsaWJyYXJ5LgorLy8gVGhlc2UgaW1wbGVtZW50YXRpb25zIGNvdmVyIEkvTyBvbiByYXcgYXJyYXlzIGFuZCBzdHJpbmdzLCBhcyB3ZWxsIGFzCisvLyBhZGFwdG9ycyB3aGljaCBtYWtlIGl0IGVhc3kgdG8gaW1wbGVtZW50IHN0cmVhbXMgYmFzZWQgb24gdHJhZGl0aW9uYWwKKy8vIHN0cmVhbXMuICBPZiBjb3Vyc2UsIG1hbnkgdXNlcnMgd2lsbCBwcm9iYWJseSB3YW50IHRvIHdyaXRlIHRoZWlyIG93bgorLy8gaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIGludGVyZmFjZXMgc3BlY2lmaWMgdG8gdGhlIHBhcnRpY3VsYXIgSS9PCisvLyBhYnN0cmFjdGlvbnMgdGhleSBwcmVmZXIgdG8gdXNlLCBidXQgdGhlc2Ugc2hvdWxkIGNvdmVyIHRoZSBtb3N0IGNvbW1vbgorLy8gY2FzZXMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lPX1pFUk9fQ09QWV9TVFJFQU1fSU1QTF9MSVRFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU9fWkVST19DT1BZX1NUUkVBTV9JTVBMX0xJVEVfSF9fCisKKworI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NhbGxiYWNrLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQSBaZXJvQ29weUlucHV0U3RyZWFtIGJhY2tlZCBieSBhbiBpbi1tZW1vcnkgYXJyYXkgb2YgYnl0ZXMuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgQXJyYXlJbnB1dFN0cmVhbSBQUk9UT0JVRl9GVVRVUkVfRklOQUwKKyAgICA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZSBhbiBJbnB1dFN0cmVhbSB0aGF0IHJldHVybnMgdGhlIGJ5dGVzIHBvaW50ZWQgdG8gYnkgImRhdGEiLgorICAvLyAiZGF0YSIgcmVtYWlucyB0aGUgcHJvcGVydHkgb2YgdGhlIGNhbGxlciBidXQgbXVzdCByZW1haW4gdmFsaWQgdW50aWwKKyAgLy8gdGhlIHN0cmVhbSBpcyBkZXN0cm95ZWQuICBJZiBhIGJsb2NrX3NpemUgaXMgZ2l2ZW4sIGNhbGxzIHRvIE5leHQoKQorICAvLyB3aWxsIHJldHVybiBkYXRhIGJsb2NrcyBubyBsYXJnZXIgdGhhbiB0aGUgZ2l2ZW4gc2l6ZS4gIE90aGVyd2lzZSwgdGhlCisgIC8vIGZpcnN0IGNhbGwgdG8gTmV4dCgpIHJldHVybnMgdGhlIGVudGlyZSBhcnJheS4gIGJsb2NrX3NpemUgaXMgbWFpbmx5CisgIC8vIHVzZWZ1bCBmb3IgdGVzdGluZzsgaW4gcHJvZHVjdGlvbiB5b3Ugd291bGQgcHJvYmFibHkgbmV2ZXIgd2FudCB0byBzZXQKKyAgLy8gaXQuCisgIEFycmF5SW5wdXRTdHJlYW0oY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUsIGludCBibG9ja19zaXplID0gLTEpOworICB+QXJyYXlJbnB1dFN0cmVhbSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5SW5wdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgb3ZlcnJpZGU7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCkgb3ZlcnJpZGU7CisgIGJvb2wgU2tpcChpbnQgY291bnQpIG92ZXJyaWRlOworICBpbnQ2NF90IEJ5dGVDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworCisKKyBwcml2YXRlOgorICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhXzsgIC8vIFRoZSBieXRlIGFycmF5LgorICBjb25zdCBpbnQgc2l6ZV87ICAgICAgICAgICAvLyBUb3RhbCBzaXplIG9mIHRoZSBhcnJheS4KKyAgY29uc3QgaW50IGJsb2NrX3NpemVfOyAgICAgLy8gSG93IG1hbnkgYnl0ZXMgdG8gcmV0dXJuIGF0IGEgdGltZS4KKworICBpbnQgcG9zaXRpb25fOworICBpbnQgbGFzdF9yZXR1cm5lZF9zaXplXzsgIC8vIEhvdyBtYW55IGJ5dGVzIHdlIHJldHVybmVkIGxhc3QgdGltZSBOZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXMgY2FsbGVkICh1c2VkIGZvciBlcnJvciBjaGVja2luZyBvbmx5KS4KKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQXJyYXlJbnB1dFN0cmVhbSk7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIEEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gYmFja2VkIGJ5IGFuIGluLW1lbW9yeSBhcnJheSBvZiBieXRlcy4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBBcnJheU91dHB1dFN0cmVhbSBQUk9UT0JVRl9GVVRVUkVfRklOQUwKKyAgICA6IHB1YmxpYyBaZXJvQ29weU91dHB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBDcmVhdGUgYW4gT3V0cHV0U3RyZWFtIHRoYXQgd3JpdGVzIHRvIHRoZSBieXRlcyBwb2ludGVkIHRvIGJ5ICJkYXRhIi4KKyAgLy8gImRhdGEiIHJlbWFpbnMgdGhlIHByb3BlcnR5IG9mIHRoZSBjYWxsZXIgYnV0IG11c3QgcmVtYWluIHZhbGlkIHVudGlsCisgIC8vIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkLiAgSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBjYWxscyB0byBOZXh0KCkKKyAgLy8gd2lsbCByZXR1cm4gZGF0YSBibG9ja3Mgbm8gbGFyZ2VyIHRoYW4gdGhlIGdpdmVuIHNpemUuICBPdGhlcndpc2UsIHRoZQorICAvLyBmaXJzdCBjYWxsIHRvIE5leHQoKSByZXR1cm5zIHRoZSBlbnRpcmUgYXJyYXkuICBibG9ja19zaXplIGlzIG1haW5seQorICAvLyB1c2VmdWwgZm9yIHRlc3Rpbmc7IGluIHByb2R1Y3Rpb24geW91IHdvdWxkIHByb2JhYmx5IG5ldmVyIHdhbnQgdG8gc2V0CisgIC8vIGl0LgorICBBcnJheU91dHB1dFN0cmVhbSh2b2lkKiBkYXRhLCBpbnQgc2l6ZSwgaW50IGJsb2NrX3NpemUgPSAtMSk7CisgIH5BcnJheU91dHB1dFN0cmVhbSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5T3V0cHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSkgb3ZlcnJpZGU7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCkgb3ZlcnJpZGU7CisgIGludDY0X3QgQnl0ZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICB1aW50OF90KiBjb25zdCBkYXRhXzsgICAgIC8vIFRoZSBieXRlIGFycmF5LgorICBjb25zdCBpbnQgc2l6ZV87ICAgICAgICAvLyBUb3RhbCBzaXplIG9mIHRoZSBhcnJheS4KKyAgY29uc3QgaW50IGJsb2NrX3NpemVfOyAgLy8gSG93IG1hbnkgYnl0ZXMgdG8gcmV0dXJuIGF0IGEgdGltZS4KKworICBpbnQgcG9zaXRpb25fOworICBpbnQgbGFzdF9yZXR1cm5lZF9zaXplXzsgIC8vIEhvdyBtYW55IGJ5dGVzIHdlIHJldHVybmVkIGxhc3QgdGltZSBOZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXMgY2FsbGVkICh1c2VkIGZvciBlcnJvciBjaGVja2luZyBvbmx5KS4KKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQXJyYXlPdXRwdXRTdHJlYW0pOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBBIFplcm9Db3B5T3V0cHV0U3RyZWFtIHdoaWNoIGFwcGVuZHMgYnl0ZXMgdG8gYSBzdHJpbmcuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgU3RyaW5nT3V0cHV0U3RyZWFtIFBST1RPQlVGX0ZVVFVSRV9GSU5BTAorICAgIDogcHVibGljIFplcm9Db3B5T3V0cHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZSBhIFN0cmluZ091dHB1dFN0cmVhbSB3aGljaCBhcHBlbmRzIGJ5dGVzIHRvIHRoZSBnaXZlbiBzdHJpbmcuCisgIC8vIFRoZSBzdHJpbmcgcmVtYWlucyBwcm9wZXJ0eSBvZiB0aGUgY2FsbGVyLCBidXQgaXQgaXMgbXV0YXRlZCBpbiBhcmJpdHJhcnkKKyAgLy8gd2F5cyBhbmQgTVVTVCBOT1QgYmUgYWNjZXNzZWQgaW4gYW55IHdheSB1bnRpbCB5b3UncmUgZG9uZSB3aXRoIHRoZQorICAvLyBzdHJlYW0uIEVpdGhlciBiZSBzdXJlIHRoZXJlJ3Mgbm8gZnVydGhlciB1c2FnZSwgb3IgKHNhZmVzdCkgZGVzdHJveSB0aGUKKyAgLy8gc3RyZWFtIGJlZm9yZSB1c2luZyB0aGUgY29udGVudHMuCisgIC8vCisgIC8vIEhpbnQ6ICBJZiB5b3UgY2FsbCB0YXJnZXQtPnJlc2VydmUobikgYmVmb3JlIGNyZWF0aW5nIHRoZSBzdHJlYW0sCisgIC8vICAgdGhlIGZpcnN0IGNhbGwgdG8gTmV4dCgpIHdpbGwgcmV0dXJuIGF0IGxlYXN0IG4gYnl0ZXMgb2YgYnVmZmVyCisgIC8vICAgc3BhY2UuCisgIGV4cGxpY2l0IFN0cmluZ091dHB1dFN0cmVhbShzdGQ6OnN0cmluZyogdGFyZ2V0KTsKKyAgflN0cmluZ091dHB1dFN0cmVhbSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5T3V0cHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSkgb3ZlcnJpZGU7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCkgb3ZlcnJpZGU7CisgIGludDY0X3QgQnl0ZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluaW11bVNpemUgPSAxNjsKKworICBzdGQ6OnN0cmluZyogdGFyZ2V0XzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU3RyaW5nT3V0cHV0U3RyZWFtKTsKK307CisKKy8vIE5vdGU6ICBUaGVyZSBpcyBubyBTdHJpbmdJbnB1dFN0cmVhbS4gIEluc3RlYWQsIGp1c3QgY3JlYXRlIGFuCisvLyBBcnJheUlucHV0U3RyZWFtIGFzIGZvbGxvd3M6CisvLyAgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoc3RyLmRhdGEoKSwgc3RyLnNpemUoKSk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQSBnZW5lcmljIHRyYWRpdGlvbmFsIGlucHV0IHN0cmVhbSBpbnRlcmZhY2UuCisvLworLy8gTG90cyBvZiB0cmFkaXRpb25hbCBpbnB1dCBzdHJlYW1zIChlLmcuIGZpbGUgZGVzY3JpcHRvcnMsIEMgc3RkaW8KKy8vIHN0cmVhbXMsIGFuZCBDKysgaW9zdHJlYW1zKSBleHBvc2UgYW4gaW50ZXJmYWNlIHdoZXJlIGV2ZXJ5IHJlYWQKKy8vIGludm9sdmVzIGNvcHlpbmcgYnl0ZXMgaW50byBhIGJ1ZmZlci4gIElmIHlvdSB3YW50IHRvIHRha2Ugc3VjaCBhbgorLy8gaW50ZXJmYWNlIGFuZCBtYWtlIGEgWmVyb0NvcHlJbnB1dFN0cmVhbSBiYXNlZCBvbiBpdCwgc2ltcGx5IGltcGxlbWVudAorLy8gQ29weWluZ0lucHV0U3RyZWFtIGFuZCB0aGVuIHVzZSBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yLgorLy8KKy8vIENvcHlpbmdJbnB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGF2b2lkIGJ1ZmZlcmluZyBpZiBwb3NzaWJsZS4KKy8vIENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3IgZG9lcyBpdHMgb3duIGJ1ZmZlcmluZyBhbmQgd2lsbCByZWFkIGRhdGEKKy8vIGluIGxhcmdlIGJsb2Nrcy4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBDb3B5aW5nSW5wdXRTdHJlYW0geworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q29weWluZ0lucHV0U3RyZWFtKCkge30KKworICAvLyBSZWFkcyB1cCB0byAic2l6ZSIgYnl0ZXMgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mCisgIC8vIGJ5dGVzIHJlYWQuICBSZWFkKCkgd2FpdHMgdW50aWwgYXQgbGVhc3Qgb25lIGJ5dGUgaXMgYXZhaWxhYmxlLCBvcgorICAvLyByZXR1cm5zIHplcm8gaWYgbm8gYnl0ZXMgd2lsbCBldmVyIGJlY29tZSBhdmFpbGFibGUgKEVPRiksIG9yIC0xIGlmIGEKKyAgLy8gcGVybWFuZW50IHJlYWQgZXJyb3Igb2NjdXJyZWQuCisgIHZpcnR1YWwgaW50IFJlYWQodm9pZCogYnVmZmVyLCBpbnQgc2l6ZSkgPSAwOworCisgIC8vIFNraXBzIHRoZSBuZXh0ICJjb3VudCIgYnl0ZXMgb2YgaW5wdXQuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgLy8gYWN0dWFsbHkgc2tpcHBlZC4gIFRoaXMgd2lsbCBhbHdheXMgYmUgZXhhY3RseSBlcXVhbCB0byAiY291bnQiIHVubGVzcworICAvLyBFT0Ygd2FzIHJlYWNoZWQgb3IgYSBwZXJtYW5lbnQgcmVhZCBlcnJvciBvY2N1cnJlZC4KKyAgLy8KKyAgLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCByZXBlYXRlZGx5IGNhbGxzIFJlYWQoKSBpbnRvIGEgc2NyYXRjaAorICAvLyBidWZmZXIuCisgIHZpcnR1YWwgaW50IFNraXAoaW50IGNvdW50KTsKK307CisKKy8vIEEgWmVyb0NvcHlJbnB1dFN0cmVhbSB3aGljaCByZWFkcyBmcm9tIGEgQ29weWluZ0lucHV0U3RyZWFtLiAgVGhpcyBpcworLy8gdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgWmVyb0NvcHlJbnB1dFN0cmVhbXMgdGhhdCByZWFkIGZyb20gdHJhZGl0aW9uYWwKKy8vIHN0cmVhbXMuICBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBub3QgcmVhbGx5IHplcm8tY29weS4KKy8vCisvLyBJZiB5b3Ugd2FudCB0byByZWFkIGZyb20gZmlsZSBkZXNjcmlwdG9ycyBvciBDKysgaXN0cmVhbXMsIHRoaXMgaXMKKy8vIGFscmVhZHkgaW1wbGVtZW50ZWQgZm9yIHlvdTogIHVzZSBGaWxlSW5wdXRTdHJlYW0gb3IgSXN0cmVhbUlucHV0U3RyZWFtCisvLyByZXNwZWN0aXZlbHkuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvciA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCByZWFkcyBmcm9tIHRoZSBnaXZlbiBDb3B5aW5nSW5wdXRTdHJlYW0uCisgIC8vIElmIGEgYmxvY2tfc2l6ZSBpcyBnaXZlbiwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdAorICAvLyBzaG91bGQgYmUgcmVhZCBhbmQgcmV0dXJuZWQgd2l0aCBlYWNoIGNhbGwgdG8gTmV4dCgpLiAgT3RoZXJ3aXNlLAorICAvLyBhIHJlYXNvbmFibGUgZGVmYXVsdCBpcyB1c2VkLiAgVGhlIGNhbGxlciByZXRhaW5zIG93bmVyc2hpcCBvZgorICAvLyBjb3B5aW5nX3N0cmVhbSB1bmxlc3MgU2V0T3duc0NvcHlpbmdTdHJlYW0odHJ1ZSkgaXMgY2FsbGVkLgorICBleHBsaWNpdCBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yKENvcHlpbmdJbnB1dFN0cmVhbSogY29weWluZ19zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3NpemUgPSAtMSk7CisgIH5Db3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ2FsbCBTZXRPd25zQ29weWluZ1N0cmVhbSh0cnVlKSB0byB0ZWxsIHRoZSBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yIHRvCisgIC8vIGRlbGV0ZSB0aGUgdW5kZXJseWluZyBDb3B5aW5nSW5wdXRTdHJlYW0gd2hlbiBpdCBpcyBkZXN0cm95ZWQuCisgIHZvaWQgU2V0T3duc0NvcHlpbmdTdHJlYW0oYm9vbCB2YWx1ZSkgeyBvd25zX2NvcHlpbmdfc3RyZWFtXyA9IHZhbHVlOyB9CisKKyAgLy8gaW1wbGVtZW50cyBaZXJvQ29weUlucHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIG92ZXJyaWRlOworICB2b2lkIEJhY2tVcChpbnQgY291bnQpIG92ZXJyaWRlOworICBib29sIFNraXAoaW50IGNvdW50KSBvdmVycmlkZTsKKyAgaW50NjRfdCBCeXRlQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIC8vIEluc3VyZXMgdGhhdCBidWZmZXJfIGlzIG5vdCBOVUxMLgorICB2b2lkIEFsbG9jYXRlQnVmZmVySWZOZWVkZWQoKTsKKyAgLy8gRnJlZXMgdGhlIGJ1ZmZlciBhbmQgcmVzZXRzIGJ1ZmZlcl91c2VkXy4KKyAgdm9pZCBGcmVlQnVmZmVyKCk7CisKKyAgLy8gVGhlIHVuZGVybHlpbmcgY29weWluZyBzdHJlYW0uCisgIENvcHlpbmdJbnB1dFN0cmVhbSogY29weWluZ19zdHJlYW1fOworICBib29sIG93bnNfY29weWluZ19zdHJlYW1fOworCisgIC8vIFRydWUgaWYgd2UgaGF2ZSBzZWVuIGEgcGVybWFuZW50IGVycm9yIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICBib29sIGZhaWxlZF87CisKKyAgLy8gVGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgY29weWluZ19zdHJlYW1fLCByZWxhdGl2ZSB0byB0aGUgcG9pbnQgd2hlcmUKKyAgLy8gd2Ugc3RhcnRlZCByZWFkaW5nLgorICBpbnQ2NF90IHBvc2l0aW9uXzsKKworICAvLyBEYXRhIGlzIHJlYWQgaW50byB0aGlzIGJ1ZmZlci4gIEl0IG1heSBiZSBOVUxMIGlmIG5vIGJ1ZmZlciBpcyBjdXJyZW50bHkKKyAgLy8gaW4gdXNlLiAgT3RoZXJ3aXNlLCBpdCBwb2ludHMgdG8gYW4gYXJyYXkgb2Ygc2l6ZSBidWZmZXJfc2l6ZV8uCisgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJ1ZmZlcl87CisgIGNvbnN0IGludCBidWZmZXJfc2l6ZV87CisKKyAgLy8gTnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyIChpLmUuIHRoZSBzaXplIGxhc3QKKyAgLy8gcmV0dXJuZWQgYnkgTmV4dCgpKS4gIDAgPD0gYnVmZmVyX3VzZWRfIDw9IGJ1ZmZlcl9zaXplXy4KKyAgaW50IGJ1ZmZlcl91c2VkXzsKKworICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciB3aGljaCB3ZXJlIGJhY2tlZCB1cCBvdmVyIGJ5IGEgY2FsbCB0bworICAvLyBCYWNrVXAoKS4gIFRoZXNlIG5lZWQgdG8gYmUgcmV0dXJuZWQgYWdhaW4uCisgIC8vIDAgPD0gYmFja3VwX2J5dGVzXyA8PSBidWZmZXJfdXNlZF8KKyAgaW50IGJhY2t1cF9ieXRlc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3IpOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBBIGdlbmVyaWMgdHJhZGl0aW9uYWwgb3V0cHV0IHN0cmVhbSBpbnRlcmZhY2UuCisvLworLy8gTG90cyBvZiB0cmFkaXRpb25hbCBvdXRwdXQgc3RyZWFtcyAoZS5nLiBmaWxlIGRlc2NyaXB0b3JzLCBDIHN0ZGlvCisvLyBzdHJlYW1zLCBhbmQgQysrIGlvc3RyZWFtcykgZXhwb3NlIGFuIGludGVyZmFjZSB3aGVyZSBldmVyeSB3cml0ZQorLy8gaW52b2x2ZXMgY29weWluZyBieXRlcyBmcm9tIGEgYnVmZmVyLiAgSWYgeW91IHdhbnQgdG8gdGFrZSBzdWNoIGFuCisvLyBpbnRlcmZhY2UgYW5kIG1ha2UgYSBaZXJvQ29weU91dHB1dFN0cmVhbSBiYXNlZCBvbiBpdCwgc2ltcGx5IGltcGxlbWVudAorLy8gQ29weWluZ091dHB1dFN0cmVhbSBhbmQgdGhlbiB1c2UgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IuCisvLworLy8gQ29weWluZ091dHB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGF2b2lkIGJ1ZmZlcmluZyBpZiBwb3NzaWJsZS4KKy8vIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yIGRvZXMgaXRzIG93biBidWZmZXJpbmcgYW5kIHdpbGwgd3JpdGUgZGF0YQorLy8gaW4gbGFyZ2UgYmxvY2tzLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIENvcHlpbmdPdXRwdXRTdHJlYW0geworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q29weWluZ091dHB1dFN0cmVhbSgpIHt9CisKKyAgLy8gV3JpdGVzICJzaXplIiBieXRlcyBmcm9tIHRoZSBnaXZlbiBidWZmZXIgdG8gdGhlIG91dHB1dC4gIFJldHVybnMgdHJ1ZQorICAvLyBpZiBzdWNjZXNzZnVsLCBmYWxzZSBvbiBhIHdyaXRlIGVycm9yLgorICB2aXJ0dWFsIGJvb2wgV3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBpbnQgc2l6ZSkgPSAwOworfTsKKworLy8gQSBaZXJvQ29weU91dHB1dFN0cmVhbSB3aGljaCB3cml0ZXMgdG8gYSBDb3B5aW5nT3V0cHV0U3RyZWFtLiAgVGhpcyBpcworLy8gdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgWmVyb0NvcHlPdXRwdXRTdHJlYW1zIHRoYXQgd3JpdGUgdG8gdHJhZGl0aW9uYWwKKy8vIHN0cmVhbXMuICBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBub3QgcmVhbGx5IHplcm8tY29weS4KKy8vCisvLyBJZiB5b3Ugd2FudCB0byB3cml0ZSB0byBmaWxlIGRlc2NyaXB0b3JzIG9yIEMrKyBvc3RyZWFtcywgdGhpcyBpcworLy8gYWxyZWFkeSBpbXBsZW1lbnRlZCBmb3IgeW91OiAgdXNlIEZpbGVPdXRwdXRTdHJlYW0gb3IgT3N0cmVhbU91dHB1dFN0cmVhbQorLy8gcmVzcGVjdGl2ZWx5LgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yIDogcHVibGljIFplcm9Db3B5T3V0cHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCB3cml0ZXMgdG8gdGhlIGdpdmVuIFVuaXggZmlsZSBkZXNjcmlwdG9yLgorICAvLyBJZiBhIGJsb2NrX3NpemUgaXMgZ2l2ZW4sIGl0IHNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVycworICAvLyB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBieSBOZXh0KCkuICBPdGhlcndpc2UsIGEgcmVhc29uYWJsZSBkZWZhdWx0CisgIC8vIGlzIHVzZWQuCisgIGV4cGxpY2l0IENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yKENvcHlpbmdPdXRwdXRTdHJlYW0qIGNvcHlpbmdfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfc2l6ZSA9IC0xKTsKKyAgfkNvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gV3JpdGVzIGFsbCBwZW5kaW5nIGRhdGEgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLiAgUmV0dXJucyBmYWxzZSBpZiBhCisgIC8vIHdyaXRlIGVycm9yIG9jY3VycmVkIG9uIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4gIChUaGUgdW5kZXJseWluZworICAvLyBzdHJlYW0gaXRzZWxmIGlzIG5vdCBuZWNlc3NhcmlseSBmbHVzaGVkLikKKyAgYm9vbCBGbHVzaCgpOworCisgIC8vIENhbGwgU2V0T3duc0NvcHlpbmdTdHJlYW0odHJ1ZSkgdG8gdGVsbCB0aGUgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IgdG8KKyAgLy8gZGVsZXRlIHRoZSB1bmRlcmx5aW5nIENvcHlpbmdPdXRwdXRTdHJlYW0gd2hlbiBpdCBpcyBkZXN0cm95ZWQuCisgIHZvaWQgU2V0T3duc0NvcHlpbmdTdHJlYW0oYm9vbCB2YWx1ZSkgeyBvd25zX2NvcHlpbmdfc3RyZWFtXyA9IHZhbHVlOyB9CisKKyAgLy8gaW1wbGVtZW50cyBaZXJvQ29weU91dHB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIG92ZXJyaWRlOworICB2b2lkIEJhY2tVcChpbnQgY291bnQpIG92ZXJyaWRlOworICBpbnQ2NF90IEJ5dGVDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIFdyaXRlQWxpYXNlZFJhdyhjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgb3ZlcnJpZGU7CisgIGJvb2wgQWxsb3dzQWxpYXNpbmcoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisKKyBwcml2YXRlOgorICAvLyBXcml0ZSB0aGUgY3VycmVudCBidWZmZXIsIGlmIGl0IGlzIHByZXNlbnQuCisgIGJvb2wgV3JpdGVCdWZmZXIoKTsKKyAgLy8gSW5zdXJlcyB0aGF0IGJ1ZmZlcl8gaXMgbm90IE5VTEwuCisgIHZvaWQgQWxsb2NhdGVCdWZmZXJJZk5lZWRlZCgpOworICAvLyBGcmVlcyB0aGUgYnVmZmVyLgorICB2b2lkIEZyZWVCdWZmZXIoKTsKKworICAvLyBUaGUgdW5kZXJseWluZyBjb3B5aW5nIHN0cmVhbS4KKyAgQ29weWluZ091dHB1dFN0cmVhbSogY29weWluZ19zdHJlYW1fOworICBib29sIG93bnNfY29weWluZ19zdHJlYW1fOworCisgIC8vIFRydWUgaWYgd2UgaGF2ZSBzZWVuIGEgcGVybWFuZW50IGVycm9yIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICBib29sIGZhaWxlZF87CisKKyAgLy8gVGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgY29weWluZ19zdHJlYW1fLCByZWxhdGl2ZSB0byB0aGUgcG9pbnQgd2hlcmUKKyAgLy8gd2Ugc3RhcnRlZCB3cml0aW5nLgorICBpbnQ2NF90IHBvc2l0aW9uXzsKKworICAvLyBEYXRhIGlzIHdyaXR0ZW4gZnJvbSB0aGlzIGJ1ZmZlci4gIEl0IG1heSBiZSBOVUxMIGlmIG5vIGJ1ZmZlciBpcworICAvLyBjdXJyZW50bHkgaW4gdXNlLiAgT3RoZXJ3aXNlLCBpdCBwb2ludHMgdG8gYW4gYXJyYXkgb2Ygc2l6ZSBidWZmZXJfc2l6ZV8uCisgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJ1ZmZlcl87CisgIGNvbnN0IGludCBidWZmZXJfc2l6ZV87CisKKyAgLy8gTnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyIChpLmUuIHRoZSBzaXplIGxhc3QKKyAgLy8gcmV0dXJuZWQgYnkgTmV4dCgpKS4gIFdoZW4gQmFja1VwKCkgaXMgY2FsbGVkLCB3ZSBqdXN0IHJlZHVjZSB0aGlzLgorICAvLyAwIDw9IGJ1ZmZlcl91c2VkXyA8PSBidWZmZXJfc2l6ZV8uCisgIGludCBidWZmZXJfdXNlZF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yKTsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQSBaZXJvQ29weUlucHV0U3RyZWFtIHdoaWNoIHdyYXBzIHNvbWUgb3RoZXIgc3RyZWFtIGFuZCBsaW1pdHMgaXQgdG8KKy8vIGEgcGFydGljdWxhciBieXRlIGNvdW50LgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIExpbWl0aW5nSW5wdXRTdHJlYW0gUFJPVE9CVUZfRlVUVVJFX0ZJTkFMCisgICAgOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7CisgcHVibGljOgorICBMaW1pdGluZ0lucHV0U3RyZWFtKFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBpbnQ2NF90IGxpbWl0KTsKKyAgfkxpbWl0aW5nSW5wdXRTdHJlYW0oKSBvdmVycmlkZTsKKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5SW5wdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgb3ZlcnJpZGU7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCkgb3ZlcnJpZGU7CisgIGJvb2wgU2tpcChpbnQgY291bnQpIG92ZXJyaWRlOworICBpbnQ2NF90IEJ5dGVDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworCisKKyBwcml2YXRlOgorICBaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dF87CisgIGludDY0X3QgbGltaXRfOyAgLy8gRGVjcmVhc2VzIGFzIHdlIGdvLCBiZWNvbWVzIG5lZ2F0aXZlIGlmIHdlIG92ZXJzaG9vdC4KKyAgaW50NjRfdCBwcmlvcl9ieXRlc19yZWFkXzsgIC8vIEJ5dGVzIHJlYWQgb24gdW5kZXJseWluZyBzdHJlYW0gYXQgY29uc3RydWN0aW9uCisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExpbWl0aW5nSW5wdXRTdHJlYW0pOworfTsKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIG11dGFibGVfc3RyaW5nX2RhdGEoKSBhbmQgYXNfc3RyaW5nX2RhdGEoKSBhcmUgd29ya2Fyb3VuZHMgdG8gaW1wcm92ZQorLy8gdGhlIHBlcmZvcm1hbmNlIG9mIHdyaXRpbmcgbmV3IGRhdGEgdG8gYW4gZXhpc3Rpbmcgc3RyaW5nLiAgVW5mb3J0dW5hdGVseQorLy8gdGhlIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlIHN0cmluZyBjbGFzcyBhcmUgc3Vib3B0aW1hbCwgYW5kIHVzaW5nIG1lbWNweSgpCisvLyBpcyBtaWxkbHkgYW5ub3lpbmcgYmVjYXVzZSBpdCByZXF1aXJlcyBpdHMgcG9pbnRlciBhcmdzIHRvIGJlIG5vbi1OVUxMIGV2ZW4KKy8vIGlmIHdlIGFzayBpdCB0byBjb3B5IDAgYnl0ZXMuICBGdXJ0aGVybW9yZSwgc3RyaW5nX2FzX2FycmF5KCkgaGFzIHRoZQorLy8gcHJvcGVydHkgdGhhdCBpdCBhbHdheXMgcmV0dXJucyBOVUxMIGlmIGl0cyBhcmcgaXMgdGhlIGVtcHR5IHN0cmluZywgZXhhY3RseQorLy8gd2hhdCB3ZSB3YW50IHRvIGF2b2lkIGlmIHdlJ3JlIHVzaW5nIGl0IGluIGNvbmp1bmN0aW9uIHdpdGggbWVtY3B5KCkhCisvLyBXaXRoIEMrKzExLCB0aGUgZGVzaXJlZCBtZW1jcHkoKSBib2lscyBkb3duIHRvIG1lbWNweSguLi4sICYoKnMpWzBdLCBzaXplKSwKKy8vIHdoZXJlIHMgaXMgYSBzdHJpbmcqLiAgV2l0aG91dCBDKysxMSwgJigqcylbMF0gaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc2FmZSwKKy8vIHNvIHdlIHVzZSBzdHJpbmdfYXNfYXJyYXkoKSwgYW5kIGxpdmUgd2l0aCB0aGUgZXh0cmEgbG9naWMgdGhhdCB0ZXN0cyB3aGV0aGVyCisvLyAqcyBpcyBlbXB0eS4KKworLy8gUmV0dXJuIGEgcG9pbnRlciB0byBtdXRhYmxlIGNoYXJhY3RlcnMgdW5kZXJseWluZyB0aGUgZ2l2ZW4gc3RyaW5nLiAgVGhlCisvLyByZXR1cm4gdmFsdWUgaXMgdmFsaWQgdW50aWwgdGhlIG5leHQgdGltZSB0aGUgc3RyaW5nIGlzIHJlc2l6ZWQuICBXZQorLy8gdHJ1c3QgdGhlIGNhbGxlciB0byB0cmVhdCB0aGUgcmV0dXJuIHZhbHVlIGFzIGFuIGFycmF5IG9mIGxlbmd0aCBzLT5zaXplKCkuCitpbmxpbmUgY2hhciogbXV0YWJsZV9zdHJpbmdfZGF0YShzdGQ6OnN0cmluZyogcykgeworICAvLyBUaGlzIHNob3VsZCBiZSBzaW1wbGVyICYgZmFzdGVyIHRoYW4gc3RyaW5nX2FzX2FycmF5KCkgYmVjYXVzZSB0aGUgbGF0dGVyCisgIC8vIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIE5VTEwgd2hlbiAqcyBpcyBlbXB0eSwgc28gaXQgaGFzIHRvIGNoZWNrIGZvciB0aGF0LgorICByZXR1cm4gJigqcylbMF07Cit9CisKKy8vIGFzX3N0cmluZ19kYXRhKHMpIGlzIGVxdWl2YWxlbnQgdG8KKy8vICAoeyBjaGFyKiBwID0gbXV0YWJsZV9zdHJpbmdfZGF0YShzKTsgbWFrZV9wYWlyKHAsIHAgIT0gTlVMTCk7IH0pCisvLyBTb21ldGltZXMgaXQncyBmYXN0ZXI6IGluIHNvbWUgc2NlbmFyaW9zIHAgY2Fubm90IGJlIE5VTEwsIGFuZCB0aGVuIHRoZQorLy8gY29kZSBjYW4gYXZvaWQgdGhhdCBjaGVjay4KK2lubGluZSBzdGQ6OnBhaXI8Y2hhciosIGJvb2w+IGFzX3N0cmluZ19kYXRhKHN0ZDo6c3RyaW5nKiBzKSB7CisgIGNoYXIqIHAgPSBtdXRhYmxlX3N0cmluZ19kYXRhKHMpOworICByZXR1cm4gc3RkOjptYWtlX3BhaXIocCwgdHJ1ZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lPX1pFUk9fQ09QWV9TVFJFQU1fSU1QTF9MSVRFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZTViNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMDg4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGVzdGluZyBzdHJhdGVneTogIEZvciBlYWNoIHR5cGUgb2YgSS9PIChhcnJheSwgc3RyaW5nLCBmaWxlLCBldGMuKSB3ZQorLy8gY3JlYXRlIGFuIG91dHB1dCBzdHJlYW0gYW5kIHdyaXRlIHNvbWUgZGF0YSB0byBpdCwgdGhlbiBjcmVhdGUgYQorLy8gY29ycmVzcG9uZGluZyBpbnB1dCBzdHJlYW0gdG8gcmVhZCB0aGUgc2FtZSBkYXRhIGJhY2sgYW5kIGV4cGVjdCBpdCB0bworLy8gbWF0Y2guICBXaGVuIHRoZSBkYXRhIGlzIHdyaXR0ZW4sIGl0IGlzIHdyaXR0ZW4gaW4gc2V2ZXJhbCBzbWFsbCBjaHVua3MKKy8vIG9mIHZhcnlpbmcgc2l6ZXMsIHdpdGggYSBCYWNrVXAoKSBhZnRlciBlYWNoIGNodW5rLiAgSXQgaXMgcmVhZCBiYWNrCisvLyBzaW1pbGFybHksIGJ1dCB3aXRoIGNodW5rcyBzZXBhcmF0ZWQgYXQgZGlmZmVyZW50IHBvaW50cy4gIFRoZSB3aG9sZQorLy8gcHJvY2VzcyBpcyBydW4gd2l0aCBhIHZhcmlldHkgb2YgYmxvY2sgc2l6ZXMgZm9yIGJvdGggdGhlIGlucHV0IGFuZAorLy8gdGhlIG91dHB1dC4KKy8vCisvLyBUT0RPKGtlbnRvbik6ICBSZXdyaXRlIHRoaXMgdGVzdCB0byBicmluZyBpdCB1cCB0byB0aGUgc3RhbmRhcmRzIG9mIGFsbAorLy8gICB0aGUgb3RoZXIgcHJvdG8yIHRlc3RzLiAgTWF5IHdhbnQgdG8gd2FpdCBmb3IgZ1Rlc3QgdG8gaW1wbGVtZW50CisvLyAgICJwYXJhbWV0aXplZCB0ZXN0cyIgc28gdGhhdCBvbmUgc2V0IG9mIHRlc3RzIGNhbiBiZSB1c2VkIG9uIGFsbCB0aGUKKy8vICAgaW1wbGVtZW50YXRpb25zLgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKworI2lmIEhBVkVfWkxJQgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CituYW1lc3BhY2UgeworCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIHBpcGUoZmRzKSBfcGlwZShmZHMsIDQwOTYsIE9fQklOQVJZKQorLy8gRE8gTk9UIGluY2x1ZGUgPGlvLmg+LCBpbnN0ZWFkIGNyZWF0ZSBmdW5jdGlvbnMgaW4gaW9fd2luMzIue2gsY2N9IGFuZCBpbXBvcnQKKy8vIHRoZW0gbGlrZSB3ZSBkbyBiZWxvdy4KK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6YWNjZXNzOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjpjbG9zZTsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6bWtkaXI7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbzo6d2luMzI6Om9wZW47CisjZW5kaWYKKworI2lmbmRlZiBPX0JJTkFSWQorI2lmZGVmIF9PX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSBfT19CSU5BUlkKKyNlbHNlCisjZGVmaW5lIE9fQklOQVJZIDAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIHBsYXRmb3JtIGRvZXNuJ3QgbmVlZCBpdC4KKyNlbmRpZgorI2VuZGlmCisKK2NsYXNzIElvVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFRlc3QgaGVscGVycy4KKworICAvLyBIZWxwZXIgdG8gd3JpdGUgYW4gYXJyYXkgb2YgZGF0YSB0byBhbiBvdXRwdXQgc3RyZWFtLgorICBib29sIFdyaXRlVG9PdXRwdXQoWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCwgY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpOworICAvLyBIZWxwZXIgdG8gcmVhZCBhIGZpeGVkLWxlbmd0aCBhcnJheSBvZiBkYXRhIGZyb20gYW4gaW5wdXQgc3RyZWFtLgorICBpbnQgUmVhZEZyb21JbnB1dChaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgdm9pZCogZGF0YSwgaW50IHNpemUpOworICAvLyBXcml0ZSBhIHN0cmluZyB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCBXcml0ZVN0cmluZyhaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKyAgLy8gUmVhZCBhIG51bWJlciBvZiBieXRlcyBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCBjaGVja3MKKyAgLy8gdGhhdCBpdCBtYXRjaGVzIHRoZSBzdHJpbmcuCisgIHZvaWQgUmVhZFN0cmluZyhaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisgIC8vIFdyaXRlcyBzb21lIHRleHQgdG8gdGhlIG91dHB1dCBzdHJlYW0gaW4gYSBwYXJ0aWN1bGFyIG9yZGVyLiAgUmV0dXJucworICAvLyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIGluIGNhc2UgdGhlIGNhbGxlciBuZWVkcyB0aGF0IHRvIHNldCB1cCBhbgorICAvLyBpbnB1dCBzdHJlYW0uCisgIGludCBXcml0ZVN0dWZmKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICAvLyBSZWFkcyB0ZXh0IGZyb20gYW4gaW5wdXQgc3RyZWFtIGFuZCBleHBlY3RzIGl0IHRvIG1hdGNoIHdoYXQKKyAgLy8gV3JpdGVTdHVmZigpIHdyaXRlcy4KKyAgdm9pZCBSZWFkU3R1ZmYoWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIGJvb2wgcmVhZF9lb2YgPSB0cnVlKTsKKworICAvLyBTaW1pbGFyIHRvIFdyaXRlU3R1ZmYsIGJ1dCBwZXJmb3JtcyBtb3JlIHNvcGhpc3RpY2F0ZWQgdGVzdGluZy4KKyAgaW50IFdyaXRlU3R1ZmZMYXJnZShaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgLy8gUmVhZHMgYW5kIHRlc3RzIGEgc3RyZWFtIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiB3cml0dGVuIHRvCisgIC8vIHZpYSBXcml0ZVN0dWZmTGFyZ2UoKS4KKyAgdm9pZCBSZWFkU3R1ZmZMYXJnZShaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCk7CisKKyNpZiBIQVZFX1pMSUIKKyAgc3RkOjpzdHJpbmcgQ29tcHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMmIG9wdGlvbnMpOworICBzdGQ6OnN0cmluZyBVbmNvbXByZXNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhKTsKKyNlbmRpZgorCisgIHN0YXRpYyBjb25zdCBpbnQga0Jsb2NrU2l6ZXNbXTsKKyAgc3RhdGljIGNvbnN0IGludCBrQmxvY2tTaXplQ291bnQ7Cit9OworCitjb25zdCBpbnQgSW9UZXN0OjprQmxvY2tTaXplc1tdID0gey0xLCAxLCAyLCA1LCA3LCAxMCwgMjMsIDY0fTsKK2NvbnN0IGludCBJb1Rlc3Q6OmtCbG9ja1NpemVDb3VudCA9IEdPT0dMRV9BUlJBWVNJWkUoSW9UZXN0OjprQmxvY2tTaXplcyk7CisKK2Jvb2wgSW9UZXN0OjpXcml0ZVRvT3V0cHV0KFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQsIGNvbnN0IHZvaWQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgeworICBjb25zdCB1aW50OCogaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oZGF0YSk7CisgIGludCBpbl9zaXplID0gc2l6ZTsKKworICB2b2lkKiBvdXQ7CisgIGludCBvdXRfc2l6ZTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICghb3V0cHV0LT5OZXh0KCZvdXQsICZvdXRfc2l6ZSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgRVhQRUNUX0dUKG91dF9zaXplLCAwKTsKKworICAgIGlmIChpbl9zaXplIDw9IG91dF9zaXplKSB7CisgICAgICBtZW1jcHkob3V0LCBpbiwgaW5fc2l6ZSk7CisgICAgICBvdXRwdXQtPkJhY2tVcChvdXRfc2l6ZSAtIGluX3NpemUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgbWVtY3B5KG91dCwgaW4sIG91dF9zaXplKTsKKyAgICBpbiArPSBvdXRfc2l6ZTsKKyAgICBpbl9zaXplIC09IG91dF9zaXplOworICB9Cit9CisKKyNkZWZpbmUgTUFYX1JFUEVBVEVEX1pFUk9TIDEwMAorCitpbnQgSW9UZXN0OjpSZWFkRnJvbUlucHV0KFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgeworICB1aW50OCogb3V0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGRhdGEpOworICBpbnQgb3V0X3NpemUgPSBzaXplOworCisgIGNvbnN0IHZvaWQqIGluOworICBpbnQgaW5fc2l6ZSA9IDA7CisKKyAgaW50IHJlcGVhdGVkX3plcm9zID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICghaW5wdXQtPk5leHQoJmluLCAmaW5fc2l6ZSkpIHsKKyAgICAgIHJldHVybiBzaXplIC0gb3V0X3NpemU7CisgICAgfQorICAgIEVYUEVDVF9HVChpbl9zaXplLCAtMSk7CisgICAgaWYgKGluX3NpemUgPT0gMCkgeworICAgICAgcmVwZWF0ZWRfemVyb3MrKzsKKyAgICB9IGVsc2UgeworICAgICAgcmVwZWF0ZWRfemVyb3MgPSAwOworICAgIH0KKyAgICBFWFBFQ1RfTFQocmVwZWF0ZWRfemVyb3MsIE1BWF9SRVBFQVRFRF9aRVJPUyk7CisKKyAgICBpZiAob3V0X3NpemUgPD0gaW5fc2l6ZSkgeworICAgICAgbWVtY3B5KG91dCwgaW4sIG91dF9zaXplKTsKKyAgICAgIGlmIChpbl9zaXplID4gb3V0X3NpemUpIHsKKyAgICAgICAgaW5wdXQtPkJhY2tVcChpbl9zaXplIC0gb3V0X3NpemUpOworICAgICAgfQorICAgICAgcmV0dXJuIHNpemU7ICAvLyBDb3BpZWQgYWxsIG9mIGl0LgorICAgIH0KKworICAgIG1lbWNweShvdXQsIGluLCBpbl9zaXplKTsKKyAgICBvdXQgKz0gaW5fc2l6ZTsKKyAgICBvdXRfc2l6ZSAtPSBpbl9zaXplOworICB9Cit9CisKK3ZvaWQgSW9UZXN0OjpXcml0ZVN0cmluZyhaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIEVYUEVDVF9UUlVFKFdyaXRlVG9PdXRwdXQob3V0cHV0LCBzdHIuY19zdHIoKSwgc3RyLnNpemUoKSkpOworfQorCit2b2lkIElvVGVzdDo6UmVhZFN0cmluZyhaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBidWZmZXIobmV3IGNoYXJbc3RyLnNpemUoKSArIDFdKTsKKyAgYnVmZmVyW3N0ci5zaXplKCldID0gJ1wwJzsKKyAgRVhQRUNUX0VRKFJlYWRGcm9tSW5wdXQoaW5wdXQsIGJ1ZmZlci5nZXQoKSwgc3RyLnNpemUoKSksIHN0ci5zaXplKCkpOworICBFWFBFQ1RfU1RSRVEoc3RyLmNfc3RyKCksIGJ1ZmZlci5nZXQoKSk7Cit9CisKK2ludCBJb1Rlc3Q6OldyaXRlU3R1ZmYoWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVN0cmluZyhvdXRwdXQsICJIZWxsbyB3b3JsZCFcbiIpOworICBXcml0ZVN0cmluZyhvdXRwdXQsICJTb21lIHRlIik7CisgIFdyaXRlU3RyaW5nKG91dHB1dCwgInh0LiAgQmxhaCBibGFoLiIpOworICBXcml0ZVN0cmluZyhvdXRwdXQsICJhYmNkZWZnIik7CisgIFdyaXRlU3RyaW5nKG91dHB1dCwgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7CisgIFdyaXRlU3RyaW5nKG91dHB1dCwgImZvb2JhciIpOworCisgIEVYUEVDVF9FUShvdXRwdXQtPkJ5dGVDb3VudCgpLCA2OCk7CisKKyAgaW50IHJlc3VsdCA9IG91dHB1dC0+Qnl0ZUNvdW50KCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJlYWRzIHRleHQgZnJvbSBhbiBpbnB1dCBzdHJlYW0gYW5kIGV4cGVjdHMgaXQgdG8gbWF0Y2ggd2hhdCBXcml0ZVN0dWZmKCkKKy8vIHdyaXRlcy4KK3ZvaWQgSW9UZXN0OjpSZWFkU3R1ZmYoWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIGJvb2wgcmVhZF9lb2YpIHsKKyAgUmVhZFN0cmluZyhpbnB1dCwgIkhlbGxvIHdvcmxkIVxuIik7CisgIFJlYWRTdHJpbmcoaW5wdXQsICJTb21lIHRleHQuICAiKTsKKyAgUmVhZFN0cmluZyhpbnB1dCwgIkJsYWggIik7CisgIFJlYWRTdHJpbmcoaW5wdXQsICJibGFoLiIpOworICBSZWFkU3RyaW5nKGlucHV0LCAiYWJjZGVmZyIpOworICBFWFBFQ1RfVFJVRShpbnB1dC0+U2tpcCgyMCkpOworICBSZWFkU3RyaW5nKGlucHV0LCAiZm9vIik7CisgIFJlYWRTdHJpbmcoaW5wdXQsICJiYXIiKTsKKworICBFWFBFQ1RfRVEoaW5wdXQtPkJ5dGVDb3VudCgpLCA2OCk7CisKKyAgaWYgKHJlYWRfZW9mKSB7CisgICAgdWludDggYnl0ZTsKKyAgICBFWFBFQ1RfRVEoUmVhZEZyb21JbnB1dChpbnB1dCwgJmJ5dGUsIDEpLCAwKTsKKyAgfQorfQorCitpbnQgSW9UZXN0OjpXcml0ZVN0dWZmTGFyZ2UoWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVN0cmluZyhvdXRwdXQsICJIZWxsbyB3b3JsZCFcbiIpOworICBXcml0ZVN0cmluZyhvdXRwdXQsICJTb21lIHRlIik7CisgIFdyaXRlU3RyaW5nKG91dHB1dCwgInh0LiAgQmxhaCBibGFoLiIpOworICBXcml0ZVN0cmluZyhvdXRwdXQsIHN0ZDo6c3RyaW5nKDEwMDAwMCwgJ3gnKSk7ICAvLyBBIHZlcnkgbG9uZyBzdHJpbmcKKyAgV3JpdGVTdHJpbmcob3V0cHV0LCBzdGQ6OnN0cmluZygxMDAwMDAsICd5JykpOyAgLy8gQSB2ZXJ5IGxvbmcgc3RyaW5nCisgIFdyaXRlU3RyaW5nKG91dHB1dCwgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7CisKKyAgRVhQRUNUX0VRKG91dHB1dC0+Qnl0ZUNvdW50KCksIDIwMDA1NSk7CisKKyAgaW50IHJlc3VsdCA9IG91dHB1dC0+Qnl0ZUNvdW50KCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJlYWRzIHRleHQgZnJvbSBhbiBpbnB1dCBzdHJlYW0gYW5kIGV4cGVjdHMgaXQgdG8gbWF0Y2ggd2hhdCBXcml0ZVN0dWZmKCkKKy8vIHdyaXRlcy4KK3ZvaWQgSW9UZXN0OjpSZWFkU3R1ZmZMYXJnZShaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCkgeworICBSZWFkU3RyaW5nKGlucHV0LCAiSGVsbG8gd29ybGQhXG5Tb21lIHRleHQuICAiKTsKKyAgRVhQRUNUX1RSVUUoaW5wdXQtPlNraXAoNSkpOworICBSZWFkU3RyaW5nKGlucHV0LCAiYmxhaC4iKTsKKyAgRVhQRUNUX1RSVUUoaW5wdXQtPlNraXAoMTAwMDAwIC0gMTApKTsKKyAgUmVhZFN0cmluZyhpbnB1dCwgc3RkOjpzdHJpbmcoMTAsICd4JykgKyBzdGQ6OnN0cmluZygxMDAwMDAgLSAyMDAwMCwgJ3knKSk7CisgIEVYUEVDVF9UUlVFKGlucHV0LT5Ta2lwKDIwMDAwIC0gMTApKTsKKyAgUmVhZFN0cmluZyhpbnB1dCwgInl5eXl5eXl5eXkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOworCisgIEVYUEVDVF9FUShpbnB1dC0+Qnl0ZUNvdW50KCksIDIwMDA1NSk7CisKKyAgdWludDggYnl0ZTsKKyAgRVhQRUNUX0VRKFJlYWRGcm9tSW5wdXQoaW5wdXQsICZieXRlLCAxKSwgMCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVEVTVF9GKElvVGVzdCwgQXJyYXlJbykgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyNTY7CisgIHVpbnQ4IGJ1ZmZlcltrQnVmZmVyU2l6ZV07CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwga0Jsb2NrU2l6ZUNvdW50OyBqKyspIHsKKyAgICAgIGludCBzaXplOworICAgICAgeworICAgICAgICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSwga0Jsb2NrU2l6ZXNbaV0pOworICAgICAgICBzaXplID0gV3JpdGVTdHVmZigmb3V0cHV0KTsKKyAgICAgIH0KKyAgICAgIHsKKyAgICAgICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXIsIHNpemUsIGtCbG9ja1NpemVzW2pdKTsKKyAgICAgICAgUmVhZFN0dWZmKCZpbnB1dCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK1RFU1RfRihJb1Rlc3QsIFR3b1Nlc3Npb25Xcml0ZSkgeworICAvLyBUZXN0IHRoYXQgdHdvIGNvbmNhdGVuYXRlZCB3cml0ZSBzZXNzaW9ucyByZWFkIGNvcnJlY3RseQorCisgIHN0YXRpYyBjb25zdCBjaGFyKiBzdHJBID0gIjAxMjM0NTY3ODkiOworICBzdGF0aWMgY29uc3QgY2hhciogc3RyQiA9ICJXaGlybGVkUGVhcyI7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIgKiAxMDI0OworICB1aW50OCogYnVmZmVyID0gbmV3IHVpbnQ4W2tCdWZmZXJTaXplXTsKKyAgY2hhciogdGVtcF9idWZmZXIgPSBuZXcgY2hhcls0MF07CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwga0Jsb2NrU2l6ZUNvdW50OyBqKyspIHsKKyAgICAgIEFycmF5T3V0cHV0U3RyZWFtKiBvdXRwdXQgPQorICAgICAgICAgIG5ldyBBcnJheU91dHB1dFN0cmVhbShidWZmZXIsIGtCdWZmZXJTaXplLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICBDb2RlZE91dHB1dFN0cmVhbSogY29kZWRfb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKG91dHB1dCk7CisgICAgICBjb2RlZF9vdXRwdXQtPldyaXRlVmFyaW50MzIoc3RybGVuKHN0ckEpKTsKKyAgICAgIGNvZGVkX291dHB1dC0+V3JpdGVSYXcoc3RyQSwgc3RybGVuKHN0ckEpKTsKKyAgICAgIGRlbGV0ZSBjb2RlZF9vdXRwdXQ7ICAvLyBmbHVzaAorICAgICAgaW50NjQgcG9zID0gb3V0cHV0LT5CeXRlQ291bnQoKTsKKyAgICAgIGRlbGV0ZSBvdXRwdXQ7CisgICAgICBvdXRwdXQgPSBuZXcgQXJyYXlPdXRwdXRTdHJlYW0oYnVmZmVyICsgcG9zLCBrQnVmZmVyU2l6ZSAtIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc1tpXSk7CisgICAgICBjb2RlZF9vdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0ob3V0cHV0KTsKKyAgICAgIGNvZGVkX291dHB1dC0+V3JpdGVWYXJpbnQzMihzdHJsZW4oc3RyQikpOworICAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVJhdyhzdHJCLCBzdHJsZW4oc3RyQikpOworICAgICAgZGVsZXRlIGNvZGVkX291dHB1dDsgIC8vIGZsdXNoCisgICAgICBpbnQ2NCBzaXplID0gcG9zICsgb3V0cHV0LT5CeXRlQ291bnQoKTsKKyAgICAgIGRlbGV0ZSBvdXRwdXQ7CisKKyAgICAgIEFycmF5SW5wdXRTdHJlYW0qIGlucHV0ID0KKyAgICAgICAgICBuZXcgQXJyYXlJbnB1dFN0cmVhbShidWZmZXIsIHNpemUsIGtCbG9ja1NpemVzW2pdKTsKKyAgICAgIENvZGVkSW5wdXRTdHJlYW0qIGNvZGVkX2lucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oaW5wdXQpOworICAgICAgdWludDMyIGluc2l6ZTsKKyAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LT5SZWFkVmFyaW50MzIoJmluc2l6ZSkpOworICAgICAgRVhQRUNUX0VRKHN0cmxlbihzdHJBKSwgaW5zaXplKTsKKyAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LT5SZWFkUmF3KHRlbXBfYnVmZmVyLCBpbnNpemUpKTsKKyAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAodGVtcF9idWZmZXIsIHN0ckEsIGluc2l6ZSkpOworCisgICAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC0+UmVhZFZhcmludDMyKCZpbnNpemUpKTsKKyAgICAgIEVYUEVDVF9FUShzdHJsZW4oc3RyQiksIGluc2l6ZSk7CisgICAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC0+UmVhZFJhdyh0ZW1wX2J1ZmZlciwgaW5zaXplKSk7CisgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHRlbXBfYnVmZmVyLCBzdHJCLCBpbnNpemUpKTsKKworICAgICAgZGVsZXRlIGNvZGVkX2lucHV0OworICAgICAgZGVsZXRlIGlucHV0OworICAgIH0KKyAgfQorCisgIGRlbGV0ZVtdIHRlbXBfYnVmZmVyOworICBkZWxldGVbXSBidWZmZXI7Cit9CisKKyNpZiBIQVZFX1pMSUIKK1RFU1RfRihJb1Rlc3QsIEd6aXBJbykgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyICogMTAyNDsKKyAgdWludDgqIGJ1ZmZlciA9IG5ldyB1aW50OFtrQnVmZmVyU2l6ZV07CisgIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7CisgICAgICBmb3IgKGludCB6ID0gMDsgeiA8IGtCbG9ja1NpemVDb3VudDsgeisrKSB7CisgICAgICAgIGludCBnemlwX2J1ZmZlcl9zaXplID0ga0Jsb2NrU2l6ZXNbel07CisgICAgICAgIGludCBzaXplOworICAgICAgICB7CisgICAgICAgICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgICAgICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7CisgICAgICAgICAgb3B0aW9ucy5mb3JtYXQgPSBHemlwT3V0cHV0U3RyZWFtOjpHWklQOworICAgICAgICAgIGlmIChnemlwX2J1ZmZlcl9zaXplICE9IC0xKSB7CisgICAgICAgICAgICBvcHRpb25zLmJ1ZmZlcl9zaXplID0gZ3ppcF9idWZmZXJfc2l6ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0LCBvcHRpb25zKTsKKyAgICAgICAgICBXcml0ZVN0dWZmKCZnem91dCk7CisgICAgICAgICAgZ3pvdXQuQ2xvc2UoKTsKKyAgICAgICAgICBzaXplID0gb3V0cHV0LkJ5dGVDb3VudCgpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlciwgc2l6ZSwga0Jsb2NrU2l6ZXNbal0pOworICAgICAgICAgIEd6aXBJbnB1dFN0cmVhbSBnemluKCZpbnB1dCwgR3ppcElucHV0U3RyZWFtOjpHWklQLCBnemlwX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgICBSZWFkU3R1ZmYoJmd6aW4pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGRlbGV0ZVtdIGJ1ZmZlcjsKK30KKworVEVTVF9GKElvVGVzdCwgR3ppcElvV2l0aEZsdXNoKSB7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIgKiAxMDI0OworICB1aW50OCogYnVmZmVyID0gbmV3IHVpbnQ4W2tCdWZmZXJTaXplXTsKKyAgLy8gV2Ugc3RhcnQgd2l0aCBpID0gNCBhcyB3ZSB3YW50IGEgYmxvY2sgc2l6ZSA+IDYuIFdpdGggYmxvY2sgc2l6ZSA8PSA2CisgIC8vIEZsdXNoKCkgZmlsbHMgdXAgdGhlIGVudGlyZSAySyBidWZmZXIgd2l0aCBmbHVzaCBtYXJrZXJzIGFuZCB0aGUgdGVzdAorICAvLyBmYWlscy4gU2VlIGRvY3VtZW50YXRpb24gZm9yIEZsdXNoKCkgZm9yIG1vcmUgZGV0YWlsLgorICBmb3IgKGludCBpID0gNDsgaSA8IGtCbG9ja1NpemVDb3VudDsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQmxvY2tTaXplQ291bnQ7IGorKykgeworICAgICAgZm9yIChpbnQgeiA9IDA7IHogPCBrQmxvY2tTaXplQ291bnQ7IHorKykgeworICAgICAgICBpbnQgZ3ppcF9idWZmZXJfc2l6ZSA9IGtCbG9ja1NpemVzW3pdOworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgeworICAgICAgICAgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIGtCdWZmZXJTaXplLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICAgICAgR3ppcE91dHB1dFN0cmVhbTo6T3B0aW9ucyBvcHRpb25zOworICAgICAgICAgIG9wdGlvbnMuZm9ybWF0ID0gR3ppcE91dHB1dFN0cmVhbTo6R1pJUDsKKyAgICAgICAgICBpZiAoZ3ppcF9idWZmZXJfc2l6ZSAhPSAtMSkgeworICAgICAgICAgICAgb3B0aW9ucy5idWZmZXJfc2l6ZSA9IGd6aXBfYnVmZmVyX3NpemU7CisgICAgICAgICAgfQorICAgICAgICAgIEd6aXBPdXRwdXRTdHJlYW0gZ3pvdXQoJm91dHB1dCwgb3B0aW9ucyk7CisgICAgICAgICAgV3JpdGVTdHVmZigmZ3pvdXQpOworICAgICAgICAgIEVYUEVDVF9UUlVFKGd6b3V0LkZsdXNoKCkpOworICAgICAgICAgIGd6b3V0LkNsb3NlKCk7CisgICAgICAgICAgc2l6ZSA9IG91dHB1dC5CeXRlQ291bnQoKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXIsIHNpemUsIGtCbG9ja1NpemVzW2pdKTsKKyAgICAgICAgICBHemlwSW5wdXRTdHJlYW0gZ3ppbigmaW5wdXQsIEd6aXBJbnB1dFN0cmVhbTo6R1pJUCwgZ3ppcF9idWZmZXJfc2l6ZSk7CisgICAgICAgICAgUmVhZFN0dWZmKCZnemluKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBkZWxldGVbXSBidWZmZXI7Cit9CisKK1RFU1RfRihJb1Rlc3QsIEd6aXBJb0NvbnRpZ3VvdXNGbHVzaGVzKSB7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIgKiAxMDI0OworICB1aW50OCogYnVmZmVyID0gbmV3IHVpbnQ4W2tCdWZmZXJTaXplXTsKKworICBpbnQgYmxvY2tfc2l6ZSA9IGtCbG9ja1NpemVzWzRdOworICBpbnQgZ3ppcF9idWZmZXJfc2l6ZSA9IGJsb2NrX3NpemU7CisgIGludCBzaXplOworCisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIGtCdWZmZXJTaXplLCBibG9ja19zaXplKTsKKyAgR3ppcE91dHB1dFN0cmVhbTo6T3B0aW9ucyBvcHRpb25zOworICBvcHRpb25zLmZvcm1hdCA9IEd6aXBPdXRwdXRTdHJlYW06OkdaSVA7CisgIGlmIChnemlwX2J1ZmZlcl9zaXplICE9IC0xKSB7CisgICAgb3B0aW9ucy5idWZmZXJfc2l6ZSA9IGd6aXBfYnVmZmVyX3NpemU7CisgIH0KKyAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0LCBvcHRpb25zKTsKKyAgV3JpdGVTdHVmZigmZ3pvdXQpOworICBFWFBFQ1RfVFJVRShnem91dC5GbHVzaCgpKTsKKyAgRVhQRUNUX1RSVUUoZ3pvdXQuRmx1c2goKSk7CisgIGd6b3V0LkNsb3NlKCk7CisgIHNpemUgPSBvdXRwdXQuQnl0ZUNvdW50KCk7CisKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXIsIHNpemUsIGJsb2NrX3NpemUpOworICBHemlwSW5wdXRTdHJlYW0gZ3ppbigmaW5wdXQsIEd6aXBJbnB1dFN0cmVhbTo6R1pJUCwgZ3ppcF9idWZmZXJfc2l6ZSk7CisgIFJlYWRTdHVmZigmZ3ppbik7CisKKyAgZGVsZXRlW10gYnVmZmVyOworfQorCitURVNUX0YoSW9UZXN0LCBHemlwSW9SZWFkQWZ0ZXJGbHVzaCkgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyICogMTAyNDsKKyAgdWludDgqIGJ1ZmZlciA9IG5ldyB1aW50OFtrQnVmZmVyU2l6ZV07CisKKyAgaW50IGJsb2NrX3NpemUgPSBrQmxvY2tTaXplc1s0XTsKKyAgaW50IGd6aXBfYnVmZmVyX3NpemUgPSBibG9ja19zaXplOworICBpbnQgc2l6ZTsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGJsb2NrX3NpemUpOworICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMuZm9ybWF0ID0gR3ppcE91dHB1dFN0cmVhbTo6R1pJUDsKKyAgaWYgKGd6aXBfYnVmZmVyX3NpemUgIT0gLTEpIHsKKyAgICBvcHRpb25zLmJ1ZmZlcl9zaXplID0gZ3ppcF9idWZmZXJfc2l6ZTsKKyAgfQorCisgIEd6aXBPdXRwdXRTdHJlYW0gZ3pvdXQoJm91dHB1dCwgb3B0aW9ucyk7CisgIFdyaXRlU3R1ZmYoJmd6b3V0KTsKKyAgRVhQRUNUX1RSVUUoZ3pvdXQuRmx1c2goKSk7CisgIHNpemUgPSBvdXRwdXQuQnl0ZUNvdW50KCk7CisKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXIsIHNpemUsIGJsb2NrX3NpemUpOworICBHemlwSW5wdXRTdHJlYW0gZ3ppbigmaW5wdXQsIEd6aXBJbnB1dFN0cmVhbTo6R1pJUCwgZ3ppcF9idWZmZXJfc2l6ZSk7CisgIFJlYWRTdHVmZigmZ3ppbik7CisKKyAgZ3pvdXQuQ2xvc2UoKTsKKworICBkZWxldGVbXSBidWZmZXI7Cit9CisKK1RFU1RfRihJb1Rlc3QsIFpsaWJJbykgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyICogMTAyNDsKKyAgdWludDgqIGJ1ZmZlciA9IG5ldyB1aW50OFtrQnVmZmVyU2l6ZV07CisgIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7CisgICAgICBmb3IgKGludCB6ID0gMDsgeiA8IGtCbG9ja1NpemVDb3VudDsgeisrKSB7CisgICAgICAgIGludCBnemlwX2J1ZmZlcl9zaXplID0ga0Jsb2NrU2l6ZXNbel07CisgICAgICAgIGludCBzaXplOworICAgICAgICB7CisgICAgICAgICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgICAgICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7CisgICAgICAgICAgb3B0aW9ucy5mb3JtYXQgPSBHemlwT3V0cHV0U3RyZWFtOjpaTElCOworICAgICAgICAgIGlmIChnemlwX2J1ZmZlcl9zaXplICE9IC0xKSB7CisgICAgICAgICAgICBvcHRpb25zLmJ1ZmZlcl9zaXplID0gZ3ppcF9idWZmZXJfc2l6ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0LCBvcHRpb25zKTsKKyAgICAgICAgICBXcml0ZVN0dWZmKCZnem91dCk7CisgICAgICAgICAgZ3pvdXQuQ2xvc2UoKTsKKyAgICAgICAgICBzaXplID0gb3V0cHV0LkJ5dGVDb3VudCgpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlciwgc2l6ZSwga0Jsb2NrU2l6ZXNbal0pOworICAgICAgICAgIEd6aXBJbnB1dFN0cmVhbSBnemluKCZpbnB1dCwgR3ppcElucHV0U3RyZWFtOjpaTElCLCBnemlwX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgICBSZWFkU3R1ZmYoJmd6aW4pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGRlbGV0ZVtdIGJ1ZmZlcjsKK30KKworVEVTVF9GKElvVGVzdCwgWmxpYklvSW5wdXRBdXRvZGV0ZWN0KSB7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIgKiAxMDI0OworICB1aW50OCogYnVmZmVyID0gbmV3IHVpbnQ4W2tCdWZmZXJTaXplXTsKKyAgaW50IHNpemU7CisgIHsKKyAgICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSk7CisgICAgR3ppcE91dHB1dFN0cmVhbTo6T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuZm9ybWF0ID0gR3ppcE91dHB1dFN0cmVhbTo6WkxJQjsKKyAgICBHemlwT3V0cHV0U3RyZWFtIGd6b3V0KCZvdXRwdXQsIG9wdGlvbnMpOworICAgIFdyaXRlU3R1ZmYoJmd6b3V0KTsKKyAgICBnem91dC5DbG9zZSgpOworICAgIHNpemUgPSBvdXRwdXQuQnl0ZUNvdW50KCk7CisgIH0KKyAgeworICAgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyLCBzaXplKTsKKyAgICBHemlwSW5wdXRTdHJlYW0gZ3ppbigmaW5wdXQsIEd6aXBJbnB1dFN0cmVhbTo6QVVUTyk7CisgICAgUmVhZFN0dWZmKCZnemluKTsKKyAgfQorICB7CisgICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUpOworICAgIEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmZvcm1hdCA9IEd6aXBPdXRwdXRTdHJlYW06OkdaSVA7CisgICAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0LCBvcHRpb25zKTsKKyAgICBXcml0ZVN0dWZmKCZnem91dCk7CisgICAgZ3pvdXQuQ2xvc2UoKTsKKyAgICBzaXplID0gb3V0cHV0LkJ5dGVDb3VudCgpOworICB9CisgIHsKKyAgICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlciwgc2l6ZSk7CisgICAgR3ppcElucHV0U3RyZWFtIGd6aW4oJmlucHV0LCBHemlwSW5wdXRTdHJlYW06OkFVVE8pOworICAgIFJlYWRTdHVmZigmZ3ppbik7CisgIH0KKyAgZGVsZXRlW10gYnVmZmVyOworfQorCitzdGQ6OnN0cmluZyBJb1Rlc3Q6OkNvbXByZXNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zJiBvcHRpb25zKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgeworICAgIFN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXQoJnJlc3VsdCk7CisgICAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0LCBvcHRpb25zKTsKKyAgICBXcml0ZVRvT3V0cHV0KCZnem91dCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdGQ6OnN0cmluZyBJb1Rlc3Q6OlVuY29tcHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICB7CisgICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIEd6aXBJbnB1dFN0cmVhbSBnemluKCZpbnB1dCk7CisgICAgY29uc3Qgdm9pZCogYnVmZmVyOworICAgIGludCBzaXplOworICAgIHdoaWxlIChnemluLk5leHQoJmJ1ZmZlciwgJnNpemUpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlciksIHNpemUpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitURVNUX0YoSW9UZXN0LCBDb21wcmVzc2lvbk9wdGlvbnMpIHsKKyAgLy8gU29tZSBhZC1ob2MgdGVzdGluZyBvZiBjb21wcmVzc2lvbiBvcHRpb25zLgorCisgIHN0ZDo6c3RyaW5nIGdvbGRlbl9maWxlbmFtZSA9CisgICAgICBUZXN0VXRpbDo6R2V0VGVzdERhdGFQYXRoKCJuZXQvcHJvdG8yL2ludGVybmFsL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlIik7CisgIHN0ZDo6c3RyaW5nIGdvbGRlbjsKKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkdldENvbnRlbnRzKGdvbGRlbl9maWxlbmFtZSwgJmdvbGRlbiwgdHJ1ZSkpOworCisgIEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMgb3B0aW9uczsKKyAgc3RkOjpzdHJpbmcgZ3ppcF9jb21wcmVzc2VkID0gQ29tcHJlc3MoZ29sZGVuLCBvcHRpb25zKTsKKworICBvcHRpb25zLmNvbXByZXNzaW9uX2xldmVsID0gMDsKKyAgc3RkOjpzdHJpbmcgbm90X2NvbXByZXNzZWQgPSBDb21wcmVzcyhnb2xkZW4sIG9wdGlvbnMpOworCisgIC8vIFRyeSB6bGliIGNvbXByZXNzaW9uIGZvciBmdW4uCisgIG9wdGlvbnMgPSBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zKCk7CisgIG9wdGlvbnMuZm9ybWF0ID0gR3ppcE91dHB1dFN0cmVhbTo6WkxJQjsKKyAgc3RkOjpzdHJpbmcgemxpYl9jb21wcmVzc2VkID0gQ29tcHJlc3MoZ29sZGVuLCBvcHRpb25zKTsKKworICAvLyBVbmNvbXByZXNzZWQgc2hvdWxkIGJlIGJpZ2dlciB0aGFuIHRoZSBvcmlnaW5hbCBzaW5jZSBpdCBzaG91bGQgaGF2ZSBzb21lCisgIC8vIHNvcnQgb2YgaGVhZGVyLgorICBFWFBFQ1RfR1Qobm90X2NvbXByZXNzZWQuc2l6ZSgpLCBnb2xkZW4uc2l6ZSgpKTsKKworICAvLyBIaWdoZXIgY29tcHJlc3Npb24gbGV2ZWxzIHNob3VsZCByZXN1bHQgaW4gc21hbGxlciBzaXplcy4KKyAgRVhQRUNUX0xUKHpsaWJfY29tcHJlc3NlZC5zaXplKCksIG5vdF9jb21wcmVzc2VkLnNpemUoKSk7CisKKyAgLy8gWkxJQiBmb3JtYXQgc2hvdWxkIGRpZmZlciBmcm9tIEdaSVAgZm9ybWF0LgorICBFWFBFQ1RfVFJVRSh6bGliX2NvbXByZXNzZWQgIT0gZ3ppcF9jb21wcmVzc2VkKTsKKworICAvLyBFdmVyeXRoaW5nIHNob3VsZCBkZWNvbXByZXNzIGNvcnJlY3RseS4KKyAgRVhQRUNUX1RSVUUoVW5jb21wcmVzcyhub3RfY29tcHJlc3NlZCkgPT0gZ29sZGVuKTsKKyAgRVhQRUNUX1RSVUUoVW5jb21wcmVzcyhnemlwX2NvbXByZXNzZWQpID09IGdvbGRlbik7CisgIEVYUEVDVF9UUlVFKFVuY29tcHJlc3MoemxpYl9jb21wcmVzc2VkKSA9PSBnb2xkZW4pOworfQorCitURVNUX0YoSW9UZXN0LCBUd29TZXNzaW9uV3JpdGVHemlwKSB7CisgIC8vIFRlc3QgdGhhdCB0d28gY29uY2F0ZW5hdGVkIGd6aXAgc3RyZWFtcyBjYW4gYmUgcmVhZCBjb3JyZWN0bHkKKworICBzdGF0aWMgY29uc3QgY2hhciogc3RyQSA9ICIwMTIzNDU2Nzg5IjsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIHN0ckIgPSAiUXVpY2tCcm93bkZveCI7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIgKiAxMDI0OworICB1aW50OCogYnVmZmVyID0gbmV3IHVpbnQ4W2tCdWZmZXJTaXplXTsKKyAgY2hhciogdGVtcF9idWZmZXIgPSBuZXcgY2hhcls0MF07CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwga0Jsb2NrU2l6ZUNvdW50OyBqKyspIHsKKyAgICAgIEFycmF5T3V0cHV0U3RyZWFtKiBvdXRwdXQgPQorICAgICAgICAgIG5ldyBBcnJheU91dHB1dFN0cmVhbShidWZmZXIsIGtCdWZmZXJTaXplLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICBHemlwT3V0cHV0U3RyZWFtKiBnem91dCA9IG5ldyBHemlwT3V0cHV0U3RyZWFtKG91dHB1dCk7CisgICAgICBDb2RlZE91dHB1dFN0cmVhbSogY29kZWRfb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKGd6b3V0KTsKKyAgICAgIGludDMyIG91dGxlbiA9IHN0cmxlbihzdHJBKSArIDE7CisgICAgICBjb2RlZF9vdXRwdXQtPldyaXRlVmFyaW50MzIob3V0bGVuKTsKKyAgICAgIGNvZGVkX291dHB1dC0+V3JpdGVSYXcoc3RyQSwgb3V0bGVuKTsKKyAgICAgIGRlbGV0ZSBjb2RlZF9vdXRwdXQ7ICAvLyBmbHVzaAorICAgICAgZGVsZXRlIGd6b3V0OyAgICAgICAgIC8vIGZsdXNoCisgICAgICBpbnQ2NCBwb3MgPSBvdXRwdXQtPkJ5dGVDb3VudCgpOworICAgICAgZGVsZXRlIG91dHB1dDsKKyAgICAgIG91dHB1dCA9IG5ldyBBcnJheU91dHB1dFN0cmVhbShidWZmZXIgKyBwb3MsIGtCdWZmZXJTaXplIC0gcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgIGd6b3V0ID0gbmV3IEd6aXBPdXRwdXRTdHJlYW0ob3V0cHV0KTsKKyAgICAgIGNvZGVkX291dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShnem91dCk7CisgICAgICBvdXRsZW4gPSBzdHJsZW4oc3RyQikgKyAxOworICAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVZhcmludDMyKG91dGxlbik7CisgICAgICBjb2RlZF9vdXRwdXQtPldyaXRlUmF3KHN0ckIsIG91dGxlbik7CisgICAgICBkZWxldGUgY29kZWRfb3V0cHV0OyAgLy8gZmx1c2gKKyAgICAgIGRlbGV0ZSBnem91dDsgICAgICAgICAvLyBmbHVzaAorICAgICAgaW50NjQgc2l6ZSA9IHBvcyArIG91dHB1dC0+Qnl0ZUNvdW50KCk7CisgICAgICBkZWxldGUgb3V0cHV0OworCisgICAgICBBcnJheUlucHV0U3RyZWFtKiBpbnB1dCA9CisgICAgICAgICAgbmV3IEFycmF5SW5wdXRTdHJlYW0oYnVmZmVyLCBzaXplLCBrQmxvY2tTaXplc1tqXSk7CisgICAgICBHemlwSW5wdXRTdHJlYW0qIGd6aW4gPSBuZXcgR3ppcElucHV0U3RyZWFtKGlucHV0KTsKKyAgICAgIENvZGVkSW5wdXRTdHJlYW0qIGNvZGVkX2lucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oZ3ppbik7CisgICAgICB1aW50MzIgaW5zaXplOworICAgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQtPlJlYWRWYXJpbnQzMigmaW5zaXplKSk7CisgICAgICBFWFBFQ1RfRVEoc3RybGVuKHN0ckEpICsgMSwgaW5zaXplKTsKKyAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LT5SZWFkUmF3KHRlbXBfYnVmZmVyLCBpbnNpemUpKTsKKyAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAodGVtcF9idWZmZXIsIHN0ckEsIGluc2l6ZSkpCisgICAgICAgICAgPDwgInN0ckE9IiA8PCBzdHJBIDw8ICIgaW49IiA8PCB0ZW1wX2J1ZmZlcjsKKworICAgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQtPlJlYWRWYXJpbnQzMigmaW5zaXplKSk7CisgICAgICBFWFBFQ1RfRVEoc3RybGVuKHN0ckIpICsgMSwgaW5zaXplKTsKKyAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LT5SZWFkUmF3KHRlbXBfYnVmZmVyLCBpbnNpemUpKTsKKyAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAodGVtcF9idWZmZXIsIHN0ckIsIGluc2l6ZSkpCisgICAgICAgICAgPDwgIiBvdXRfYmxvY2tfc2l6ZT0iIDw8IGtCbG9ja1NpemVzW2ldCisgICAgICAgICAgPDwgIiBpbl9ibG9ja19zaXplPSIgPDwga0Jsb2NrU2l6ZXNbal0gPDwgIiBwb3M9IiA8PCBwb3MKKyAgICAgICAgICA8PCAiIHNpemU9IiA8PCBzaXplIDw8ICIgc3RyQj0iIDw8IHN0ckIgPDwgIiBpbj0iIDw8IHRlbXBfYnVmZmVyOworCisgICAgICBkZWxldGUgY29kZWRfaW5wdXQ7CisgICAgICBkZWxldGUgZ3ppbjsKKyAgICAgIGRlbGV0ZSBpbnB1dDsKKyAgICB9CisgIH0KKworICBkZWxldGVbXSB0ZW1wX2J1ZmZlcjsKKyAgZGVsZXRlW10gYnVmZmVyOworfQorCitURVNUX0YoSW9UZXN0LCBHemlwSW5wdXRCeXRlQ291bnRBZnRlckNsb3NlZCkgeworICBzdGQ6OnN0cmluZyBnb2xkZW4gPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworICBzdGQ6OnN0cmluZyBjb21wcmVzc2VkID0gQ29tcHJlc3MoZ29sZGVuLCBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zKCkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBBcnJheUlucHV0U3RyZWFtIGFycl9pbnB1dChjb21wcmVzc2VkLmRhdGEoKSwgY29tcHJlc3NlZC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Jsb2NrU2l6ZXNbaV0pOworICAgIEd6aXBJbnB1dFN0cmVhbSBnel9pbnB1dCgmYXJyX2lucHV0KTsKKyAgICBjb25zdCB2b2lkKiBidWZmZXI7CisgICAgaW50IHNpemU7CisgICAgd2hpbGUgKGd6X2lucHV0Lk5leHQoJmJ1ZmZlciwgJnNpemUpKSB7CisgICAgICBFWFBFQ1RfTEUoZ3pfaW5wdXQuQnl0ZUNvdW50KCksIGdvbGRlbi5zaXplKCkpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoZ29sZGVuLnNpemUoKSwgZ3pfaW5wdXQuQnl0ZUNvdW50KCkpOworICB9Cit9CisKK1RFU1RfRihJb1Rlc3QsIEd6aXBJbnB1dEJ5dGVDb3VudEFmdGVyQ2xvc2VkQ29uY2F0ZW5hdGVkU3RyZWFtcykgeworICBzdGQ6OnN0cmluZyBnb2xkZW4xID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKyAgc3RkOjpzdHJpbmcgZ29sZGVuMiA9ICJ0aGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nIjsKKyAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPSBnb2xkZW4xLnNpemUoKSArIGdvbGRlbjIuc2l6ZSgpOworICBzdGQ6OnN0cmluZyBjb21wcmVzc2VkID0gQ29tcHJlc3MoZ29sZGVuMSwgR3ppcE91dHB1dFN0cmVhbTo6T3B0aW9ucygpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzcyhnb2xkZW4yLCBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zKCkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBBcnJheUlucHV0U3RyZWFtIGFycl9pbnB1dChjb21wcmVzc2VkLmRhdGEoKSwgY29tcHJlc3NlZC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Jsb2NrU2l6ZXNbaV0pOworICAgIEd6aXBJbnB1dFN0cmVhbSBnel9pbnB1dCgmYXJyX2lucHV0KTsKKyAgICBjb25zdCB2b2lkKiBidWZmZXI7CisgICAgaW50IHNpemU7CisgICAgd2hpbGUgKGd6X2lucHV0Lk5leHQoJmJ1ZmZlciwgJnNpemUpKSB7CisgICAgICBFWFBFQ1RfTEUoZ3pfaW5wdXQuQnl0ZUNvdW50KCksIHRvdGFsX3NpemUpOworICAgIH0KKyAgICBFWFBFQ1RfRVEodG90YWxfc2l6ZSwgZ3pfaW5wdXQuQnl0ZUNvdW50KCkpOworICB9Cit9CisjZW5kaWYKKworLy8gVGhlcmUgaXMgbm8gc3RyaW5nIGlucHV0LCBvbmx5IHN0cmluZyBvdXRwdXQuICBBbHNvLCBpdCBkb2Vzbid0IHN1cHBvcnQKKy8vIGV4cGxpY2l0IGJsb2NrIHNpemVzLiAgU28sIHdlJ2xsIG9ubHkgcnVuIG9uZSB0ZXN0IGFuZCB3ZSdsbCB1c2UKKy8vIEFycmF5SW5wdXQgdG8gcmVhZCBiYWNrIHRoZSByZXN1bHRzLgorVEVTVF9GKElvVGVzdCwgU3RyaW5nSW8pIHsKKyAgc3RkOjpzdHJpbmcgc3RyOworICB7CisgICAgU3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dCgmc3RyKTsKKyAgICBXcml0ZVN0dWZmKCZvdXRwdXQpOworICB9CisgIHsKKyAgICBBcnJheUlucHV0U3RyZWFtIGlucHV0KHN0ci5kYXRhKCksIHN0ci5zaXplKCkpOworICAgIFJlYWRTdHVmZigmaW5wdXQpOworICB9Cit9CisKKy8vIFZlcmlmaWVzIHRoYXQgb3V0cHV0cyB1cCB0byBraW50MzJtYXggY2FuIGJlIGNyZWF0ZWQuCitURVNUX0YoSW9UZXN0LCBMYXJnZU91dHB1dCkgeworICBzdGQ6OnN0cmluZyBzdHI7CisgIFN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXQoJnN0cik7CisgIHZvaWQqIHVudXNlZF9kYXRhOworICBpbnQgc2l6ZTsKKyAgLy8gUmVwZWF0ZWRseSBjYWxsaW5nIE5leHQgc2hvdWxkIGV2ZW50dWFsbHkgZ3JvdyB0aGUgYnVmZmVyIHRvIGtpbnQzMm1heC4KKyAgZG8geworICAgIEVYUEVDVF9UUlVFKG91dHB1dC5OZXh0KCZ1bnVzZWRfZGF0YSwgJnNpemUpKTsKKyAgfSB3aGlsZSAoc3RyLnNpemUoKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpOworICAvLyBGdXJ0aGVyIGluY3JlYXNlcyBzaG91bGQgYmUgcG9zc2libGUuCisgIG91dHB1dC5OZXh0KCZ1bnVzZWRfZGF0YSwgJnNpemUpOworICBFWFBFQ1RfR1Qoc2l6ZSwgMCk7Cit9CisKKworLy8gVG8gdGVzdCBmaWxlcywgd2UgY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUsIHdyaXRlLCByZWFkLCB0cnVuY2F0ZSwgcmVwZWF0LgorVEVTVF9GKElvVGVzdCwgRmlsZUlvKSB7CisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gVGVzdFRlbXBEaXIoKSArICIvemVyb19jb3B5X3N0cmVhbV90ZXN0X2ZpbGUiOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7CisgICAgICAvLyBNYWtlIGEgdGVtcG9yYXJ5IGZpbGUuCisgICAgICBpbnQgZmlsZSA9CisgICAgICAgICAgb3BlbihmaWxlbmFtZS5jX3N0cigpLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQklOQVJZLCAwNzc3KTsKKyAgICAgIEFTU0VSVF9HRShmaWxlLCAwKTsKKworICAgICAgeworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHB1dChmaWxlLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICAgIFdyaXRlU3R1ZmYoJm91dHB1dCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBvdXRwdXQuR2V0RXJybm8oKSk7CisgICAgICB9CisKKyAgICAgIC8vIFJld2luZC4KKyAgICAgIEFTU0VSVF9ORShsc2VlayhmaWxlLCAwLCBTRUVLX1NFVCksIChvZmZfdCktMSk7CisKKyAgICAgIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0KGZpbGUsIGtCbG9ja1NpemVzW2pdKTsKKyAgICAgICAgUmVhZFN0dWZmKCZpbnB1dCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBpbnB1dC5HZXRFcnJubygpKTsKKyAgICAgIH0KKworICAgICAgY2xvc2UoZmlsZSk7CisgICAgfQorICB9Cit9CisKKyNpZm5kZWYgX1dJTjMyCisvLyBUaGlzIHRlc3RzIHRoZSBGaWxlSW5wdXRTdHJlYW0gd2l0aCBhIG5vbiBibG9ja2luZyBmaWxlLiBJdCBvcGVucyBhIHBpcGUgaW4KKy8vIG5vbiBibG9ja2luZyBtb2RlLCB0aGVuIHN0YXJ0cyByZWFkaW5nIGl0LiBUaGUgd3JpdGluZyB0aHJlYWQgc3RhcnRzIHdyaXRpbmcKKy8vIDEwMG1zIGFmdGVyIHRoYXQuCitURVNUX0YoSW9UZXN0LCBOb25CbG9ja2luZ0ZpbGVJbykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGtCbG9ja1NpemVDb3VudDsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQmxvY2tTaXplQ291bnQ7IGorKykgeworICAgICAgaW50IGZkWzJdOworICAgICAgLy8gT24gTGludXggd2UgY291bGQgdXNlIHBpcGUyIHRvIG1ha2UgdGhlIHBpcGUgbm9uLWJsb2NraW5nIGluIG9uZSBzdGVwLAorICAgICAgLy8gYnV0IHdlIGluc3RlYWQgdXNlIHBpcGUgYW5kIGZjbnRsIGJlY2F1c2UgcGlwZTIgaXMgbm90IGF2YWlsYWJsZSBvbgorICAgICAgLy8gTWFjIE9TLgorICAgICAgQVNTRVJUX0VRKHBpcGUoZmQpLCAwKTsKKyAgICAgIEFTU0VSVF9FUShmY250bChmZFswXSwgRl9TRVRGTCwgT19OT05CTE9DSyksIDApOworICAgICAgQVNTRVJUX0VRKGZjbnRsKGZkWzFdLCBGX1NFVEZMLCBPX05PTkJMT0NLKSwgMCk7CisKKyAgICAgIHN0ZDo6bXV0ZXggZ29fd3JpdGU7CisgICAgICBnb193cml0ZS5sb2NrKCk7CisKKyAgICAgIGJvb2wgZG9uZV9yZWFkaW5nID0gZmFsc2U7CisKKyAgICAgIHN0ZDo6dGhyZWFkIHdyaXRlX3RocmVhZChbdGhpcywgZmQsICZnb193cml0ZSwgaV0oKSB7CisgICAgICAgIGdvX3dyaXRlLmxvY2soKTsKKyAgICAgICAgZ29fd3JpdGUudW5sb2NrKCk7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0KGZkWzFdLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICAgIFdyaXRlU3R1ZmYoJm91dHB1dCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBvdXRwdXQuR2V0RXJybm8oKSk7CisgICAgICB9KTsKKworICAgICAgc3RkOjp0aHJlYWQgcmVhZF90aHJlYWQoW3RoaXMsIGZkLCAmZG9uZV9yZWFkaW5nLCBqXSgpIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0KGZkWzBdLCBrQmxvY2tTaXplc1tqXSk7CisgICAgICAgIFJlYWRTdHVmZigmaW5wdXQsIGZhbHNlIC8qIHJlYWRfZW9mICovKTsKKyAgICAgICAgZG9uZV9yZWFkaW5nID0gdHJ1ZTsKKyAgICAgICAgY2xvc2UoZmRbMF0pOworICAgICAgICBjbG9zZShmZFsxXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBpbnB1dC5HZXRFcnJubygpKTsKKyAgICAgIH0pOworCisgICAgICAvLyBTbGVlcGluZyBpcyBub3QgbmVjZXNzYXJ5IGJ1dCBtYWtlcyB0aGUgbmV4dCBleHBlY3RhdGlvbiByZWxldmFudDogdGhlCisgICAgICAvLyByZWFkaW5nIHRocmVhZCB3YWl0cyBmb3IgdGhlIGRhdGEgdG8gYmUgYXZhaWxhYmxlIGJlZm9yZSByZXR1cm5pbmcuCisgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKTsKKyAgICAgIEVYUEVDVF9GQUxTRShkb25lX3JlYWRpbmcpOworICAgICAgZ29fd3JpdGUudW5sb2NrKCk7CisgICAgICB3cml0ZV90aHJlYWQuam9pbigpOworICAgICAgcmVhZF90aHJlYWQuam9pbigpOworICAgICAgRVhQRUNUX1RSVUUoZG9uZV9yZWFkaW5nKTsKKyAgICB9CisgIH0KK30KKworVEVTVF9GKElvVGVzdCwgQmxvY2tpbmdGaWxlSW9XaXRoVGltZW91dCkgeworICBpbnQgZmRbMl07CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgIEFTU0VSVF9FUShzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBmZCksIDApOworICAgIHN0cnVjdCB0aW1ldmFsIHR2IHsKKyAgICAgIC50dl9zZWMgPSAwLCAudHZfdXNlYyA9IDUwMDAKKyAgICB9OworICAgIEFTU0VSVF9FUShzZXRzb2Nrb3B0KGZkWzBdLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJnR2LCBzaXplb2YodHYpKSwgMCk7CisgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0KGZkWzBdLCBrQmxvY2tTaXplc1tpXSk7CisgICAgdWludDggYnl0ZTsKKyAgICBFWFBFQ1RfRVEoUmVhZEZyb21JbnB1dCgmaW5wdXQsICZieXRlLCAxKSwgMCk7CisgICAgRVhQRUNUX0VRKEVBR0FJTiwgaW5wdXQuR2V0RXJybm8oKSk7CisgIH0KK30KKyNlbmRpZgorCisjaWYgSEFWRV9aTElCCitURVNUX0YoSW9UZXN0LCBHemlwRmlsZUlvKSB7CisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gVGVzdFRlbXBEaXIoKSArICIvemVyb19jb3B5X3N0cmVhbV90ZXN0X2ZpbGUiOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7CisgICAgICAvLyBNYWtlIGEgdGVtcG9yYXJ5IGZpbGUuCisgICAgICBpbnQgZmlsZSA9CisgICAgICAgICAgb3BlbihmaWxlbmFtZS5jX3N0cigpLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQklOQVJZLCAwNzc3KTsKKyAgICAgIEFTU0VSVF9HRShmaWxlLCAwKTsKKyAgICAgIHsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQoZmlsZSwga0Jsb2NrU2l6ZXNbaV0pOworICAgICAgICBHemlwT3V0cHV0U3RyZWFtIGd6b3V0KCZvdXRwdXQpOworICAgICAgICBXcml0ZVN0dWZmTGFyZ2UoJmd6b3V0KTsKKyAgICAgICAgZ3pvdXQuQ2xvc2UoKTsKKyAgICAgICAgb3V0cHV0LkZsdXNoKCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBvdXRwdXQuR2V0RXJybm8oKSk7CisgICAgICB9CisKKyAgICAgIC8vIFJld2luZC4KKyAgICAgIEFTU0VSVF9ORShsc2VlayhmaWxlLCAwLCBTRUVLX1NFVCksIChvZmZfdCktMSk7CisKKyAgICAgIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0KGZpbGUsIGtCbG9ja1NpemVzW2pdKTsKKyAgICAgICAgR3ppcElucHV0U3RyZWFtIGd6aW4oJmlucHV0KTsKKyAgICAgICAgUmVhZFN0dWZmTGFyZ2UoJmd6aW4pOworICAgICAgICBFWFBFQ1RfRVEoMCwgaW5wdXQuR2V0RXJybm8oKSk7CisgICAgICB9CisKKyAgICAgIGNsb3NlKGZpbGUpOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8vIE1TVkMgcmFpc2VzIHZhcmlvdXMgZGVidWdnaW5nIGV4Y2VwdGlvbnMgaWYgd2UgdHJ5IHRvIHVzZSBhIGZpbGUKKy8vIGRlc2NyaXB0b3Igb2YgLTEsIGRlZmVhdGluZyBvdXIgdGVzdHMgYmVsb3cuICBUaGlzIGNsYXNzIHdpbGwgZGlzYWJsZQorLy8gdGhlc2UgZGVidWcgYXNzZXJ0aW9ucyB3aGlsZSBpbiBzY29wZS4KK2NsYXNzIE1zdmNEZWJ1Z0Rpc2FibGVyIHsKKyBwdWJsaWM6CisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTQwMAorICBNc3ZjRGVidWdEaXNhYmxlcigpIHsKKyAgICBvbGRfaGFuZGxlcl8gPSBfc2V0X2ludmFsaWRfcGFyYW1ldGVyX2hhbmRsZXIoTXlIYW5kbGVyKTsKKyAgICBvbGRfbW9kZV8gPSBfQ3J0U2V0UmVwb3J0TW9kZShfQ1JUX0FTU0VSVCwgMCk7CisgIH0KKyAgfk1zdmNEZWJ1Z0Rpc2FibGVyKCkgeworICAgIG9sZF9oYW5kbGVyXyA9IF9zZXRfaW52YWxpZF9wYXJhbWV0ZXJfaGFuZGxlcihvbGRfaGFuZGxlcl8pOworICAgIG9sZF9tb2RlXyA9IF9DcnRTZXRSZXBvcnRNb2RlKF9DUlRfQVNTRVJULCBvbGRfbW9kZV8pOworICB9CisKKyAgc3RhdGljIHZvaWQgTXlIYW5kbGVyKGNvbnN0IHdjaGFyX3QqIGV4cHIsIGNvbnN0IHdjaGFyX3QqIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBwUmVzZXJ2ZWQpIHsKKyAgICAvLyBkbyBub3RoaW5nCisgIH0KKworICBfaW52YWxpZF9wYXJhbWV0ZXJfaGFuZGxlciBvbGRfaGFuZGxlcl87CisgIGludCBvbGRfbW9kZV87CisjZWxzZQorICAvLyBEdW1teSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0byBlbnN1cmUgdGhhdCBHQ0MgZG9lc24ndCBjb21wbGFpbgorICAvLyB0aGF0IGRlYnVnX2Rpc2FibGVyIGlzIGFuIHVudXNlZCB2YXJpYWJsZS4KKyAgTXN2Y0RlYnVnRGlzYWJsZXIoKSB7fQorICB+TXN2Y0RlYnVnRGlzYWJsZXIoKSB7fQorI2VuZGlmCit9OworCisvLyBUZXN0IHRoYXQgRmlsZUlucHV0U3RyZWFtcyByZXBvcnQgZXJyb3JzIGNvcnJlY3RseS4KK1RFU1RfRihJb1Rlc3QsIEZpbGVSZWFkRXJyb3IpIHsKKyAgTXN2Y0RlYnVnRGlzYWJsZXIgZGVidWdfZGlzYWJsZXI7CisKKyAgLy8gLTEgPSBpbnZhbGlkIGZpbGUgZGVzY3JpcHRvci4KKyAgRmlsZUlucHV0U3RyZWFtIGlucHV0KC0xKTsKKworICBjb25zdCB2b2lkKiBidWZmZXI7CisgIGludCBzaXplOworICBFWFBFQ1RfRkFMU0UoaW5wdXQuTmV4dCgmYnVmZmVyLCAmc2l6ZSkpOworICBFWFBFQ1RfRVEoRUJBREYsIGlucHV0LkdldEVycm5vKCkpOworfQorCisvLyBUZXN0IHRoYXQgRmlsZU91dHB1dFN0cmVhbXMgcmVwb3J0IGVycm9ycyBjb3JyZWN0bHkuCitURVNUX0YoSW9UZXN0LCBGaWxlV3JpdGVFcnJvcikgeworICBNc3ZjRGVidWdEaXNhYmxlciBkZWJ1Z19kaXNhYmxlcjsKKworICAvLyAtMSA9IGludmFsaWQgZmlsZSBkZXNjcmlwdG9yLgorICBGaWxlT3V0cHV0U3RyZWFtIGlucHV0KC0xKTsKKworICB2b2lkKiBidWZmZXI7CisgIGludCBzaXplOworCisgIC8vIFRoZSBmaXJzdCBjYWxsIHRvIE5leHQoKSBzdWNjZWVkcyBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBhbnl0aGluZyB0bworICAvLyB3cml0ZSB5ZXQuCisgIEVYUEVDVF9UUlVFKGlucHV0Lk5leHQoJmJ1ZmZlciwgJnNpemUpKTsKKworICAvLyBTZWNvbmQgY2FsbCBmYWlscy4KKyAgRVhQRUNUX0ZBTFNFKGlucHV0Lk5leHQoJmJ1ZmZlciwgJnNpemUpKTsKKworICBFWFBFQ1RfRVEoRUJBREYsIGlucHV0LkdldEVycm5vKCkpOworfQorCisvLyBQaXBlcyBhcmUgbm90IHNlZWthYmxlLCBzbyBGaWxle0lucHV0LE91dHB1dH1TdHJlYW0gZW5kcyB1cCBkb2luZyBzb21lCisvLyBkaWZmZXJlbnQgdGhpbmdzIHRvIGhhbmRsZSB0aGVtLiAgV2UnbGwgdGVzdCBieSB3cml0aW5nIHRvIGEgcGlwZSBhbmQKKy8vIHJlYWRpbmcgYmFjayBmcm9tIGl0LgorVEVTVF9GKElvVGVzdCwgUGlwZUlvKSB7CisgIGludCBmaWxlc1syXTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGtCbG9ja1NpemVDb3VudDsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQmxvY2tTaXplQ291bnQ7IGorKykgeworICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgcGlwZSBlYWNoIHRpbWUgYmVjYXVzZSBSZWFkU3R1ZmYoKSBleHBlY3RzCisgICAgICAvLyB0byBzZWUgRU9GIGF0IHRoZSBlbmQuCisgICAgICBBU1NFUlRfRVEocGlwZShmaWxlcyksIDApOworCisgICAgICB7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0KGZpbGVzWzFdLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICAgIFdyaXRlU3R1ZmYoJm91dHB1dCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBvdXRwdXQuR2V0RXJybm8oKSk7CisgICAgICB9CisgICAgICBjbG9zZShmaWxlc1sxXSk7ICAvLyBTZW5kIEVPRi4KKworICAgICAgeworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5wdXQoZmlsZXNbMF0sIGtCbG9ja1NpemVzW2pdKTsKKyAgICAgICAgUmVhZFN0dWZmKCZpbnB1dCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBpbnB1dC5HZXRFcnJubygpKTsKKyAgICAgIH0KKyAgICAgIGNsb3NlKGZpbGVzWzBdKTsKKyAgICB9CisgIH0KK30KKworLy8gVGVzdCB1c2luZyBDKysgaW9zdHJlYW1zLgorVEVTVF9GKElvVGVzdCwgSW9zdHJlYW1JbykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGtCbG9ja1NpemVDb3VudDsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQmxvY2tTaXplQ291bnQ7IGorKykgeworICAgICAgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisKKyAgICAgICAgeworICAgICAgICAgIE9zdHJlYW1PdXRwdXRTdHJlYW0gb3V0cHV0KCZzdHJlYW0sIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgICAgICBXcml0ZVN0dWZmKCZvdXRwdXQpOworICAgICAgICAgIEVYUEVDVF9GQUxTRShzdHJlYW0uZmFpbCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICBJc3RyZWFtSW5wdXRTdHJlYW0gaW5wdXQoJnN0cmVhbSwga0Jsb2NrU2l6ZXNbal0pOworICAgICAgICAgIFJlYWRTdHVmZigmaW5wdXQpOworICAgICAgICAgIEVYUEVDVF9UUlVFKHN0cmVhbS5lb2YoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisKKyAgICAgICAgeworICAgICAgICAgIE9zdHJlYW1PdXRwdXRTdHJlYW0gb3V0cHV0KCZzdHJlYW0sIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgICAgICBXcml0ZVN0dWZmTGFyZ2UoJm91dHB1dCk7CisgICAgICAgICAgRVhQRUNUX0ZBTFNFKHN0cmVhbS5mYWlsKCkpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgIElzdHJlYW1JbnB1dFN0cmVhbSBpbnB1dCgmc3RyZWFtLCBrQmxvY2tTaXplc1tqXSk7CisgICAgICAgICAgUmVhZFN0dWZmTGFyZ2UoJmlucHV0KTsKKyAgICAgICAgICBFWFBFQ1RfVFJVRShzdHJlYW0uZW9mKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vIFRvIHRlc3QgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtLCB3ZSBjcmVhdGUgc2V2ZXJhbCBBcnJheUlucHV0U3RyZWFtcworLy8gY292ZXJpbmcgYSBidWZmZXIgYW5kIHRoZW4gY29uY2F0ZW5hdGUgdGhlbS4KK1RFU1RfRihJb1Rlc3QsIENvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbSkgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyNTY7CisgIHVpbnQ4IGJ1ZmZlcltrQnVmZmVyU2l6ZV07CisKKyAgLy8gRmlsbCB0aGUgYnVmZmVyLgorICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSk7CisgIFdyaXRlU3R1ZmYoJm91dHB1dCk7CisKKyAgLy8gTm93IHNwbGl0IGl0IHVwIGludG8gbXVsdGlwbGUgc3RyZWFtcyBvZiB2YXJ5aW5nIHNpemVzLgorICBBU1NFUlRfRVEoNjgsIG91dHB1dC5CeXRlQ291bnQoKSk7ICAvLyBUZXN0IGRlcGVuZHMgb24gdGhpcy4KKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dDEoYnVmZmVyLCAxMik7CisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQyKGJ1ZmZlciArIDEyLCA3KTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dDMoYnVmZmVyICsgMTksIDYpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0NChidWZmZXIgKyAyNSwgMTUpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0NShidWZmZXIgKyA0MCwgMCk7CisgIC8vIE5vdGU6ICBXZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgc3RyZWFtIGJvdW5kYXJ5IHNvbWV3aGVyZSBiZXR3ZWVuCisgIC8vIGJ5dGVzIDQyIGFuZCA2Miwgd2hpY2ggaXMgdGhlIHJhbmdlIHRoYXQgaXQgU2tpcCgpZWQgYnkgUmVhZFN0dWZmKCkuICBUaGlzCisgIC8vIHRlc3RzIHRoYXQgYSBidWcgdGhhdCBleGlzdGVkIGluIHRoZSBvcmlnaW5hbCBjb2RlIGZvciBTa2lwKCkgaXMgZml4ZWQuCisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQ2KGJ1ZmZlciArIDQwLCAxMCk7CisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQ3KGJ1ZmZlciArIDUwLCAxOCk7ICAvLyBUb3RhbCA9IDY4IGJ5dGVzLgorCisgIFplcm9Db3B5SW5wdXRTdHJlYW0qIHN0cmVhbXNbXSA9IHsmaW5wdXQxLCAmaW5wdXQyLCAmaW5wdXQzLCAmaW5wdXQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0NSwgJmlucHV0NiwgJmlucHV0N307CisKKyAgLy8gQ3JlYXRlIHRoZSBjb25jYXRlbmF0aW5nIHN0cmVhbSBhbmQgcmVhZC4KKyAgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtIGlucHV0KHN0cmVhbXMsIEdPT0dMRV9BUlJBWVNJWkUoc3RyZWFtcykpOworICBSZWFkU3R1ZmYoJmlucHV0KTsKK30KKworLy8gVG8gdGVzdCBMaW1pdGluZ0lucHV0U3RyZWFtLCB3ZSB3cml0ZSBvdXIgZ29sZGVuIHRleHQgdG8gYSBidWZmZXIsIHRoZW4KKy8vIGNyZWF0ZSBhbiBBcnJheUlucHV0U3RyZWFtIHRoYXQgY29udGFpbnMgdGhlIHdob2xlIGJ1ZmZlciAobm90IGp1c3QgdGhlCisvLyBieXRlcyB3cml0dGVuKSwgdGhlbiB1c2UgYSBMaW1pdGluZ0lucHV0U3RyZWFtIHRvIGxpbWl0IGl0IGp1c3QgdG8gdGhlCisvLyBieXRlcyB3cml0dGVuLgorVEVTVF9GKElvVGVzdCwgTGltaXRpbmdJbnB1dFN0cmVhbSkgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyNTY7CisgIHVpbnQ4IGJ1ZmZlcltrQnVmZmVyU2l6ZV07CisKKyAgLy8gRmlsbCB0aGUgYnVmZmVyLgorICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSk7CisgIFdyaXRlU3R1ZmYoJm91dHB1dCk7CisKKyAgLy8gU2V0IHVwIGlucHV0LgorICBBcnJheUlucHV0U3RyZWFtIGFycmF5X2lucHV0KGJ1ZmZlciwga0J1ZmZlclNpemUpOworICBMaW1pdGluZ0lucHV0U3RyZWFtIGlucHV0KCZhcnJheV9pbnB1dCwgb3V0cHV0LkJ5dGVDb3VudCgpKTsKKworICBSZWFkU3R1ZmYoJmlucHV0KTsKK30KKworLy8gQ2hlY2tzIHRoYXQgQnl0ZUNvdW50IHdvcmtzIGNvcnJlY3RseSBmb3IgTGltaXRpbmdJbnB1dFN0cmVhbXMgd2hlcmUgdGhlCisvLyB1bmRlcmx5aW5nIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIHJlYWQuCitURVNUX0YoSW9UZXN0LCBMaW1pdGluZ0lucHV0U3RyZWFtQnl0ZUNvdW50KSB7CisgIGNvbnN0IGludCBrSGFsZkJ1ZmZlclNpemUgPSAxMjg7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IGtIYWxmQnVmZmVyU2l6ZSAqIDI7CisgIHVpbnQ4IGJ1ZmZlcltrQnVmZmVyU2l6ZV07CisKKyAgLy8gU2V0IHVwIGlucHV0LiBPbmx5IGFsbG93IGhhbGYgdG8gYmUgcmVhZCBhdCBvbmNlLgorICBBcnJheUlucHV0U3RyZWFtIGFycmF5X2lucHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGtIYWxmQnVmZmVyU2l6ZSk7CisgIGNvbnN0IHZvaWQqIGRhdGE7CisgIGludCBzaXplOworICBFWFBFQ1RfVFJVRShhcnJheV9pbnB1dC5OZXh0KCZkYXRhLCAmc2l6ZSkpOworICBFWFBFQ1RfRVEoa0hhbGZCdWZmZXJTaXplLCBhcnJheV9pbnB1dC5CeXRlQ291bnQoKSk7CisgIC8vIGtIYWxmQnVmZmVyU2l6ZSAtIDEgdG8gdGVzdCBsaW1pdGluZyBsb2dpYyBhcyB3ZWxsLgorICBMaW1pdGluZ0lucHV0U3RyZWFtIGlucHV0KCZhcnJheV9pbnB1dCwga0hhbGZCdWZmZXJTaXplIC0gMSk7CisgIEVYUEVDVF9FUSgwLCBpbnB1dC5CeXRlQ291bnQoKSk7CisgIEVYUEVDVF9UUlVFKGlucHV0Lk5leHQoJmRhdGEsICZzaXplKSk7CisgIEVYUEVDVF9FUShrSGFsZkJ1ZmZlclNpemUgLSAxLCBpbnB1dC5CeXRlQ291bnQoKSk7Cit9CisKKy8vIENoZWNrIHRoYXQgYSB6ZXJvLXNpemUgYXJyYXkgZG9lc24ndCBjb25mdXNlIHRoZSBjb2RlLgorVEVTVChaZXJvU2l6ZUFycmF5LCBJbnB1dCkgeworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KE5VTEwsIDApOworICBjb25zdCB2b2lkKiBkYXRhOworICBpbnQgc2l6ZTsKKyAgRVhQRUNUX0ZBTFNFKGlucHV0Lk5leHQoJmRhdGEsICZzaXplKSk7Cit9CisKK1RFU1QoWmVyb1NpemVBcnJheSwgT3V0cHV0KSB7CisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChOVUxMLCAwKTsKKyAgdm9pZCogZGF0YTsKKyAgaW50IHNpemU7CisgIEVYUEVDVF9GQUxTRShvdXRwdXQuTmV4dCgmZGF0YSwgJnNpemUpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9saXRlX2FyZW5hX3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9saXRlX2FyZW5hX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OGM2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2xpdGVfYXJlbmFfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw5MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB7CisKK2NsYXNzIExpdGVBcmVuYVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBMaXRlQXJlbmFUZXN0KCkgeworICAgIEFyZW5hT3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuc3RhcnRfYmxvY2tfc2l6ZSA9IDEyOCAqIDEwMjQ7CisgICAgb3B0aW9ucy5tYXhfYmxvY2tfc2l6ZSA9IDEyOCAqIDEwMjQ7CisgICAgYXJlbmFfLnJlc2V0KG5ldyBBcmVuYShvcHRpb25zKSk7CisgICAgLy8gVHJpZ2dlciB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgZmlyc3QgYXJlbmEgYmxvY2ssIHNvIHRoYXQgZnVydGhlciB1c2Ugb2YKKyAgICAvLyB0aGUgYXJlbmEgd2lsbCBub3QgcmVxdWlyZSBhbnkgaGVhcCBhbGxvY2F0aW9ucy4KKyAgICBBcmVuYTo6Q3JlYXRlQXJyYXk8Y2hhcj4oYXJlbmFfLmdldCgpLCAxKTsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxBcmVuYT4gYXJlbmFfOworfTsKKworVEVTVF9GKExpdGVBcmVuYVRlc3QsIE1hcE5vSGVhcEFsbG9jYXRpb24pIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgZGF0YS5yZXNlcnZlKDEyOCAqIDEwMjQpOworCisgIHsKKyAgICAvLyBUT0RPKHRlYm9yaW5nKTogRW5hYmxlIG5vIGhlYXAgY2hlY2sgd2hlbiBBcmVuYVN0cmluZ1B0ciBpcyB1c2VkIGluCisgICAgLy8gTWFwLgorICAgIC8vIGludGVybmFsOjpOb0hlYXBDaGVja2VyIG5vX2hlYXA7CisKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFyZW5hTWFwTGl0ZSogZnJvbSA9CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QXJlbmFNYXBMaXRlPihhcmVuYV8uZ2V0KCkpOworICAgIE1hcExpdGVUZXN0VXRpbDo6U2V0QXJlbmFNYXBGaWVsZHMoZnJvbSk7CisgICAgZnJvbS0+U2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBcmVuYU1hcExpdGUqIHRvID0KKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8cHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBcmVuYU1hcExpdGU+KGFyZW5hXy5nZXQoKSk7CisgICAgdG8tPlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKKyAgICBNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdEFyZW5hTWFwRmllbGRzU2V0KCp0byk7CisgIH0KK30KKworVEVTVF9GKExpdGVBcmVuYVRlc3QsIFVua25vd25GaWVsZE1lbUxlYWspIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlQXJlbmFMaXRlKiBtZXNzYWdlID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHByb3RvYnVmX3VuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZUFyZW5hTGl0ZT4oCisgICAgICAgICAgYXJlbmFfLmdldCgpKTsKKyAgc3RkOjpzdHJpbmcgZGF0YSA9ICJcMDEyXDAwMCI7CisgIGludCBvcmlnaW5hbF9jYXBhY2l0eSA9IGRhdGEuY2FwYWNpdHkoKTsKKyAgd2hpbGUgKGRhdGEuY2FwYWNpdHkoKSA8PSBvcmlnaW5hbF9jYXBhY2l0eSkgeworICAgIGRhdGEuYXBwZW5kKCJhIik7CisgIH0KKyAgZGF0YVsxXSA9IGRhdGEuc2l6ZSgpIC0gMjsKKyAgbWVzc2FnZS0+UGFyc2VGcm9tU3RyaW5nKGRhdGEpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4M2QzMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2xpdGVfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMzMzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcGFyc2VfY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gSGVscGVyIG1ldGhvZHMgdG8gdGVzdCBwYXJzaW5nIG1lcmdlIGJlaGF2aW9yLgordm9pZCBFeHBlY3RNZXNzYWdlTWVyZ2VkKGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlJiBtZXNzYWdlKSB7CisgIEVYUEVDVF9FUShtZXNzYWdlLm9wdGlvbmFsX2ludDMyKCksIDMpOworICBFWFBFQ1RfRVEobWVzc2FnZS5vcHRpb25hbF9pbnQ2NCgpLCAyKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCksICJoZWxsbyIpOworfQorCit2b2lkIEFzc2lnblBhcnNpbmdNZXJnZU1lc3NhZ2VzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlKiBtc2cxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSogbXNnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1zZzMpIHsKKyAgbXNnMS0+c2V0X29wdGlvbmFsX2ludDMyKDEpOworICBtc2cyLT5zZXRfb3B0aW9uYWxfaW50NjQoMik7CisgIG1zZzMtPnNldF9vcHRpb25hbF9pbnQzMigzKTsKKyAgbXNnMy0+c2V0X29wdGlvbmFsX3N0cmluZygiaGVsbG8iKTsKK30KKwordm9pZCBTZXRBbGxUeXBlc0luRW1wdHlNZXNzYWdlVW5rbm93bkZpZWxkcygKKyAgICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZUxpdGUqIGVtcHR5X21lc3NhZ2UpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZTsKKyAgVGVzdFV0aWxMaXRlOjpFeHBlY3RDbGVhcihtZXNzYWdlKTsKKyAgVGVzdFV0aWxMaXRlOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICBzdGQ6OnN0cmluZyBkYXRhID0gbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOworICBlbXB0eV9tZXNzYWdlLT5QYXJzZUZyb21TdHJpbmcoZGF0YSk7Cit9CisKK3ZvaWQgU2V0U29tZVR5cGVzSW5FbXB0eU1lc3NhZ2VVbmtub3duRmllbGRzKAorICAgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlTGl0ZSogZW1wdHlfbWVzc2FnZSkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSBtZXNzYWdlOworICBUZXN0VXRpbExpdGU6OkV4cGVjdENsZWFyKG1lc3NhZ2UpOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9pbnQzMigxMDEpOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9pbnQ2NCgxMDIpOworICBtZXNzYWdlLnNldF9vcHRpb25hbF91aW50MzIoMTAzKTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfdWludDY0KDEwNCk7CisgIHN0ZDo6c3RyaW5nIGRhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgIGVtcHR5X21lc3NhZ2UtPlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKK30KKworCitURVNUKFBhcnNlVmFyaW50VGVzdCwgVmFyaW50MzIpIHsKKyAgYXV0byB0ZXN0X3ZhbHVlID0gW10odWludDMyX3QgdmFsdWUsIGludCB2YXJpbnRfbGVuZ3RoKSB7CisgICAgdWludDhfdCBidWZmZXJbMTBdOworICAgIHVpbnQ4X3QqIHAgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KHZhbHVlLCBidWZmZXIpOworICAgIEFTU0VSVF9FUShwIC0gYnVmZmVyLCB2YXJpbnRfbGVuZ3RoKSA8PCAiVmFsdWUgPSAiIDw8IHZhbHVlOworCisgICAgY29uc3QgY2hhciogY2J1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlcik7CisgICAgdWludDMyX3QgcGFyc2VkID0gfnZhbHVlOworICAgIGNvbnN0IGNoYXIqIHIgPSBpbnRlcm5hbDo6VmFyaW50UGFyc2UoY2J1ZmZlciwgJnBhcnNlZCk7CisgICAgQVNTRVJUX0VRKHIgLSBjYnVmZmVyLCB2YXJpbnRfbGVuZ3RoKSA8PCAiVmFsdWUgPSAiIDw8IHZhbHVlOworICAgIEFTU0VSVF9FUShwYXJzZWQsIHZhbHVlKTsKKyAgfTsKKworICB1aW50MzJfdCBiYXNlID0gNzM7ICAvLyAxMDAxMDExYgorICBmb3IgKGludCB2YXJpbnRfbGVuZ3RoID0gMTsgdmFyaW50X2xlbmd0aCA8PSA1OyArK3ZhcmludF9sZW5ndGgpIHsKKyAgICB1aW50MzJfdCB2YWx1ZXNbXSA9IHsKKyAgICAgICAgYmFzZSAtIDczLCBiYXNlIC0gNzIsIGJhc2UsIGJhc2UgKyAxMjYgLSA3MywgYmFzZSArIDEyNiAtIDcyLAorICAgIH07CisgICAgZm9yICh1aW50MzJfdCB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgdGVzdF92YWx1ZSh2YWx1ZSwgdmFyaW50X2xlbmd0aCk7CisgICAgfQorICAgIGJhc2UgPSAoYmFzZSA8PCA3KSArIDczOworICB9CisKKyAgdGVzdF92YWx1ZShzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCksIDUpOworfQorCitURVNUKFBhcnNlVmFyaW50VGVzdCwgVmFyaW50NjQpIHsKKyAgYXV0byB0ZXN0X3ZhbHVlID0gW10odWludDY0X3QgdmFsdWUsIGludCB2YXJpbnRfbGVuZ3RoKSB7CisgICAgdWludDhfdCBidWZmZXJbMTBdOworICAgIHVpbnQ4X3QqIHAgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50NjRUb0FycmF5KHZhbHVlLCBidWZmZXIpOworICAgIEFTU0VSVF9FUShwIC0gYnVmZmVyLCB2YXJpbnRfbGVuZ3RoKSA8PCAiVmFsdWUgPSAiIDw8IHZhbHVlOworCisgICAgY29uc3QgY2hhciogY2J1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlcik7CisgICAgdWludDY0X3QgcGFyc2VkID0gfnZhbHVlOworICAgIGNvbnN0IGNoYXIqIHIgPSBpbnRlcm5hbDo6VmFyaW50UGFyc2UoY2J1ZmZlciwgJnBhcnNlZCk7CisgICAgQVNTRVJUX0VRKHIgLSBjYnVmZmVyLCB2YXJpbnRfbGVuZ3RoKSA8PCAiVmFsdWUgPSAiIDw8IHZhbHVlOworICAgIEFTU0VSVF9FUShwYXJzZWQsIHZhbHVlKTsKKyAgfTsKKworICB1aW50NjRfdCBiYXNlID0gNzM7ICAvLyAxMDAxMDExYgorICBmb3IgKGludCB2YXJpbnRfbGVuZ3RoID0gMTsgdmFyaW50X2xlbmd0aCA8PSAxMDsgKyt2YXJpbnRfbGVuZ3RoKSB7CisgICAgdWludDY0X3QgdmFsdWVzW10gPSB7CisgICAgICAgIGJhc2UgLSA3MywgYmFzZSAtIDcyLCBiYXNlLCBiYXNlICsgMTI2IC0gNzMsIGJhc2UgKyAxMjYgLSA3MiwKKyAgICB9OworICAgIGZvciAodWludDY0X3QgdmFsdWUgOiB2YWx1ZXMpIHsKKyAgICAgIHRlc3RfdmFsdWUodmFsdWUsIHZhcmludF9sZW5ndGgpOworICAgIH0KKyAgICBiYXNlID0gKGJhc2UgPDwgNykgKyA3MzsKKyAgfQorCisgIHRlc3RfdmFsdWUoc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpLCAxMCk7Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTEpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKworICB7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZSwgbWVzc2FnZTIsIG1lc3NhZ2UzOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0Q2xlYXIobWVzc2FnZSk7CisgICAgVGVzdFV0aWxMaXRlOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICAgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UpOworICAgIGRhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgbWVzc2FnZTMuUGFyc2VGcm9tU3RyaW5nKGRhdGEpOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgICBUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMyk7CisgICAgVGVzdFV0aWxMaXRlOjpNb2RpZnlSZXBlYXRlZEZpZWxkcygmbWVzc2FnZSk7CisgICAgVGVzdFV0aWxMaXRlOjpFeHBlY3RSZXBlYXRlZEZpZWxkc01vZGlmaWVkKG1lc3NhZ2UpOworICAgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgICBUZXN0VXRpbExpdGU6OkV4cGVjdENsZWFyKG1lc3NhZ2UpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTIpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgeworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSwgbWVzc2FnZTIsIG1lc3NhZ2UzOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOworICAgIFRlc3RVdGlsTGl0ZTo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgICAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZSk7CisgICAgc3RkOjpzdHJpbmcgZXh0ZW5zaW9uc19kYXRhID0gbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOworICAgIG1lc3NhZ2UzLlBhcnNlRnJvbVN0cmluZyhleHRlbnNpb25zX2RhdGEpOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKKyAgICBUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMyk7CisgICAgVGVzdFV0aWxMaXRlOjpNb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQobWVzc2FnZSk7CisgICAgbWVzc2FnZS5DbGVhcigpOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTMpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YSwgcGFja2VkX2RhdGE7CisKKyAgeworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlIG1lc3NhZ2UsIG1lc3NhZ2UyLCBtZXNzYWdlMzsKKyAgICBUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZENsZWFyKG1lc3NhZ2UpOworICAgIFRlc3RVdGlsTGl0ZTo6U2V0UGFja2VkRmllbGRzKCZtZXNzYWdlKTsKKyAgICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlKTsKKyAgICBwYWNrZWRfZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBtZXNzYWdlMy5QYXJzZUZyb21TdHJpbmcocGFja2VkX2RhdGEpOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRmllbGRzU2V0KG1lc3NhZ2UpOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgICBUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMyk7CisgICAgVGVzdFV0aWxMaXRlOjpNb2RpZnlQYWNrZWRGaWVsZHMoJm1lc3NhZ2UpOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRmllbGRzTW9kaWZpZWQobWVzc2FnZSk7CisgICAgbWVzc2FnZS5DbGVhcigpOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkQ2xlYXIobWVzc2FnZSk7CisgIH0KKworICB7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBtZXNzYWdlLCBtZXNzYWdlMiwgbWVzc2FnZTM7CisgICAgVGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zQ2xlYXIobWVzc2FnZSk7CisgICAgVGVzdFV0aWxMaXRlOjpTZXRQYWNrZWRFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlKTsKKyAgICBzdGQ6OnN0cmluZyBwYWNrZWRfZXh0ZW5zaW9uc19kYXRhID0gbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOworICAgIEVYUEVDVF9FUShwYWNrZWRfZXh0ZW5zaW9uc19kYXRhLCBwYWNrZWRfZGF0YSk7CisgICAgbWVzc2FnZTMuUGFyc2VGcm9tU3RyaW5nKHBhY2tlZF9leHRlbnNpb25zX2RhdGEpOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKKyAgICBUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldChtZXNzYWdlMyk7CisgICAgVGVzdFV0aWxMaXRlOjpNb2RpZnlQYWNrZWRFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgICBUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNNb2RpZmllZChtZXNzYWdlKTsKKyAgICBtZXNzYWdlLkNsZWFyKCk7CisgICAgVGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zQ2xlYXIobWVzc2FnZSk7CisgIH0KK30KKworVEVTVChMaXRlLCBBbGxMaXRlNSkgeworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICAvLyBUZXN0IHRoYXQgaWYgYW4gb3B0aW9uYWwgb3IgcmVxdWlyZWQgbWVzc2FnZS9ncm91cCBmaWVsZCBhcHBlYXJzIG11bHRpcGxlCisgICAgLy8gdGltZXMgaW4gdGhlIGlucHV0LCB0aGV5IG5lZWQgdG8gYmUgbWVyZ2VkLgorICAgIHVuaXR0ZXN0OjpUZXN0UGFyc2luZ01lcmdlTGl0ZTo6UmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IgZ2VuZXJhdG9yOworICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlKiBtc2cxOworICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlKiBtc2cyOworICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlKiBtc2czOworCisjZGVmaW5lIEFTU0lHTl9SRVBFQVRFRF9GSUVMRChGSUVMRCkgXAorICBtc2cxID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCk7ICAgIFwKKyAgbXNnMiA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpOyAgICBcCisgIG1zZzMgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKTsgICAgXAorICBBc3NpZ25QYXJzaW5nTWVyZ2VNZXNzYWdlcyhtc2cxLCBtc2cyLCBtc2czKQorCisgICAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGZpZWxkMSk7CisgICAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGZpZWxkMik7CisgICAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGZpZWxkMyk7CisgICAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGV4dDEpOworICAgIEFTU0lHTl9SRVBFQVRFRF9GSUVMRChleHQyKTsKKworI3VuZGVmIEFTU0lHTl9SRVBFQVRFRF9GSUVMRAorI2RlZmluZSBBU1NJR05fUkVQRUFURURfR1JPVVAoRklFTEQpICAgICAgICAgICAgICAgIFwKKyAgbXNnMSA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpLT5tdXRhYmxlX2ZpZWxkMSgpOyBcCisgIG1zZzIgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKS0+bXV0YWJsZV9maWVsZDEoKTsgXAorICBtc2czID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCktPm11dGFibGVfZmllbGQxKCk7IFwKKyAgQXNzaWduUGFyc2luZ01lcmdlTWVzc2FnZXMobXNnMSwgbXNnMiwgbXNnMykKKworICAgIEFTU0lHTl9SRVBFQVRFRF9HUk9VUChncm91cDEpOworICAgIEFTU0lHTl9SRVBFQVRFRF9HUk9VUChncm91cDIpOworCisjdW5kZWYgQVNTSUdOX1JFUEVBVEVEX0dST1VQCisKKyAgICBzdGQ6OnN0cmluZyBidWZmZXI7CisgICAgZ2VuZXJhdG9yLlNlcmlhbGl6ZVRvU3RyaW5nKCZidWZmZXIpOworICAgIHVuaXR0ZXN0OjpUZXN0UGFyc2luZ01lcmdlTGl0ZSBwYXJzaW5nX21lcmdlOworICAgIHBhcnNpbmdfbWVyZ2UuUGFyc2VGcm9tU3RyaW5nKGJ1ZmZlcik7CisKKyAgICAvLyBSZXF1aXJlZCBhbmQgb3B0aW9uYWwgZmllbGRzIHNob3VsZCBiZSBtZXJnZWQuCisgICAgRXhwZWN0TWVzc2FnZU1lcmdlZChwYXJzaW5nX21lcmdlLnJlcXVpcmVkX2FsbF90eXBlcygpKTsKKyAgICBFeHBlY3RNZXNzYWdlTWVyZ2VkKHBhcnNpbmdfbWVyZ2Uub3B0aW9uYWxfYWxsX3R5cGVzKCkpOworICAgIEV4cGVjdE1lc3NhZ2VNZXJnZWQoCisgICAgICAgIHBhcnNpbmdfbWVyZ2Uub3B0aW9uYWxncm91cCgpLm9wdGlvbmFsX2dyb3VwX2FsbF90eXBlcygpKTsKKyAgICBFeHBlY3RNZXNzYWdlTWVyZ2VkKHBhcnNpbmdfbWVyZ2UuR2V0RXh0ZW5zaW9uKAorICAgICAgICB1bml0dGVzdDo6VGVzdFBhcnNpbmdNZXJnZUxpdGU6Om9wdGlvbmFsX2V4dCkpOworCisgICAgLy8gUmVwZWF0ZWQgZmllbGRzIHNob3VsZCBub3QgYmUgbWVyZ2VkLgorICAgIEVYUEVDVF9FUShwYXJzaW5nX21lcmdlLnJlcGVhdGVkX2FsbF90eXBlc19zaXplKCksIDMpOworICAgIEVYUEVDVF9FUShwYXJzaW5nX21lcmdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSgpLCAzKTsKKyAgICBFWFBFQ1RfRVEocGFyc2luZ19tZXJnZS5FeHRlbnNpb25TaXplKAorICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RQYXJzaW5nTWVyZ2VMaXRlOjpyZXBlYXRlZF9leHQpLAorICAgICAgICAgICAgICAzKTsKKyAgfQorfQorCitURVNUKExpdGUsIEFsbExpdGU2KSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgLy8gVGVzdCB1bmtub3duIGZpZWxkcyBzdXBwb3J0IGZvciBsaXRlIG1lc3NhZ2VzLgorICB7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZSwgbWVzc2FnZTI7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2VMaXRlIGVtcHR5X21lc3NhZ2U7CisgICAgVGVzdFV0aWxMaXRlOjpFeHBlY3RDbGVhcihtZXNzYWdlKTsKKyAgICBUZXN0VXRpbExpdGU6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgICAgZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBBU1NFUlRfVFJVRShlbXB0eV9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgZGF0YS5jbGVhcigpOworICAgIGRhdGEgPSBlbXB0eV9tZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBkYXRhID0gbWVzc2FnZTIuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7CisgICAgbWVzc2FnZS5DbGVhcigpOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0Q2xlYXIobWVzc2FnZSk7CisgIH0KK30KKworVEVTVChMaXRlLCBBbGxMaXRlNykgeworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UsIG1lc3NhZ2UyOworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlTGl0ZSBlbXB0eV9tZXNzYWdlOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOworICAgIFRlc3RVdGlsTGl0ZTo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgICAgZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBlbXB0eV9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKKyAgICBkYXRhLmNsZWFyKCk7CisgICAgZGF0YSA9IGVtcHR5X21lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSk7CisgICAgZGF0YSA9IG1lc3NhZ2UyLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgVGVzdFV0aWxMaXRlOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKKyAgICBtZXNzYWdlLkNsZWFyKCk7CisgICAgVGVzdFV0aWxMaXRlOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZSk7CisgIH0KK30KKworVEVTVChMaXRlLCBBbGxMaXRlOCkgeworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSBtZXNzYWdlLCBtZXNzYWdlMjsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZUxpdGUgZW1wdHlfbWVzc2FnZTsKKyAgICBUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZENsZWFyKG1lc3NhZ2UpOworICAgIFRlc3RVdGlsTGl0ZTo6U2V0UGFja2VkRmllbGRzKCZtZXNzYWdlKTsKKyAgICBkYXRhID0gbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOworICAgIGVtcHR5X21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpOworICAgIGRhdGEuY2xlYXIoKTsKKyAgICBkYXRhID0gZW1wdHlfbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOworICAgIG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKKyAgICBkYXRhID0gbWVzc2FnZTIuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7CisgICAgbWVzc2FnZS5DbGVhcigpOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkQ2xlYXIobWVzc2FnZSk7CisgIH0KK30KKworVEVTVChMaXRlLCBBbGxMaXRlOSkgeworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UsIG1lc3NhZ2UyOworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlTGl0ZSBlbXB0eV9tZXNzYWdlOworICAgIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOworICAgIFRlc3RVdGlsTGl0ZTo6U2V0UGFja2VkRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgICAgZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBlbXB0eV9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKKyAgICBkYXRhLmNsZWFyKCk7CisgICAgZGF0YSA9IGVtcHR5X21lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSk7CisgICAgZGF0YSA9IG1lc3NhZ2UyLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgVGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKKyAgICBtZXNzYWdlLkNsZWFyKCk7CisgICAgVGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zQ2xlYXIobWVzc2FnZSk7CisgIH0KK30KKworVEVTVChMaXRlLCBBbGxMaXRlMTApIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKworICB7CisgICAgLy8gVGVzdCBVbmtub3duIGZpZWxkcyBzd2FwCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2VMaXRlIGVtcHR5X21lc3NhZ2UsIGVtcHR5X21lc3NhZ2UyOworICAgIFNldEFsbFR5cGVzSW5FbXB0eU1lc3NhZ2VVbmtub3duRmllbGRzKCZlbXB0eV9tZXNzYWdlKTsKKyAgICBTZXRTb21lVHlwZXNJbkVtcHR5TWVzc2FnZVVua25vd25GaWVsZHMoJmVtcHR5X21lc3NhZ2UyKTsKKyAgICBkYXRhID0gZW1wdHlfbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOworICAgIHN0ZDo6c3RyaW5nIGRhdGEyID0gZW1wdHlfbWVzc2FnZTIuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBlbXB0eV9tZXNzYWdlLlN3YXAoJmVtcHR5X21lc3NhZ2UyKTsKKyAgICBFWFBFQ1RfRVEoZGF0YSwgZW1wdHlfbWVzc2FnZTIuU2VyaWFsaXplQXNTdHJpbmcoKSk7CisgICAgRVhQRUNUX0VRKGRhdGEyLCBlbXB0eV9tZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTExKSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIFRlc3QgdW5rbm93biBmaWVsZHMgc3dhcCB3aXRoIHNlbGYKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZUxpdGUgZW1wdHlfbWVzc2FnZTsKKyAgICBTZXRBbGxUeXBlc0luRW1wdHlNZXNzYWdlVW5rbm93bkZpZWxkcygmZW1wdHlfbWVzc2FnZSk7CisgICAgZGF0YSA9IGVtcHR5X21lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBlbXB0eV9tZXNzYWdlLlN3YXAoJmVtcHR5X21lc3NhZ2UpOworICAgIEVYUEVDVF9FUShkYXRhLCBlbXB0eV9tZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTEyKSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIFRlc3QgTWVyZ2VGcm9tIHdpdGggdW5rbm93biBmaWVsZHMKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSBtZXNzYWdlLCBtZXNzYWdlMjsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZUxpdGUgZW1wdHlfbWVzc2FnZSwgZW1wdHlfbWVzc2FnZTI7CisgICAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfaW50MzIoMTAxKTsKKyAgICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9pbnQzMigyMDEpOworICAgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX25lc3RlZF9lbnVtKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVopOworICAgIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9pbnQ2NCgxMDIpOworICAgIG1lc3NhZ2UyLmFkZF9yZXBlYXRlZF9pbnQ2NCgyMDIpOworICAgIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9mb3JlaWduX2VudW0odW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVopOworCisgICAgZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBlbXB0eV9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKKyAgICBkYXRhID0gbWVzc2FnZTIuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBlbXB0eV9tZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSk7CisgICAgbWVzc2FnZS5NZXJnZUZyb20obWVzc2FnZTIpOworICAgIGVtcHR5X21lc3NhZ2UuTWVyZ2VGcm9tKGVtcHR5X21lc3NhZ2UyKTsKKworICAgIGRhdGEgPSBlbXB0eV9tZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgbWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpOworICAgIC8vIFdlIGRvIG5vdCBjb21wYXJlIHRoZSBzZXJpYWxpemVkIG91dHB1dCBvZiBhIG5vcm1hbCBtZXNzYWdlIGFuZCBhIGxpdGUKKyAgICAvLyBtZXNzYWdlIGJlY2F1c2UgdGhlIG9yZGVyIG9mIGZpZWxkcyBkbyBub3QgbWF0Y2guIFdlIGNvbnZlcnQgbGl0ZSBtZXNzYWdlCisgICAgLy8gYmFjayBpbnRvIG5vcm1hbCBtZXNzYWdlLCB0aGVuIGNvbXBhcmUuCisgICAgRVhQRUNUX0VRKG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKSwgbWVzc2FnZTIuU2VyaWFsaXplQXNTdHJpbmcoKSk7CisgIH0KK30KKworVEVTVChMaXRlLCBBbGxMaXRlMTMpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKworICB7CisgICAgLy8gVGVzdCB1bmtub3duIGVudW0gdmFsdWUKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSBtZXNzYWdlOworICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcjsKKyAgICB7CisgICAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmJ1ZmZlcik7CisgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXRfc3RyZWFtKTsKKyAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWcoCisgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OmtPcHRpb25hbE5lc3RlZEVudW1GaWVsZE51bWJlciwKKyAgICAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgJmNvZGVkX291dHB1dCk7CisgICAgICBjb2RlZF9vdXRwdXQuV3JpdGVWYXJpbnQzMigxMCk7CisgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKAorICAgICAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjprUmVwZWF0ZWROZXN0ZWRFbnVtRmllbGROdW1iZXIsCisgICAgICAgICAgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQsICZjb2RlZF9vdXRwdXQpOworICAgICAgY29kZWRfb3V0cHV0LldyaXRlVmFyaW50MzIoMjApOworICAgIH0KKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhidWZmZXIpOworICAgIGRhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgRVhQRUNUX0VRKGRhdGEsIGJ1ZmZlcik7CisgIH0KK30KKworVEVTVChMaXRlLCBBbGxMaXRlMTQpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKworICB7CisgICAgLy8gVGVzdCBDbGVhciB3aXRoIHVua25vd24gZmllbGRzCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2VMaXRlIGVtcHR5X21lc3NhZ2U7CisgICAgU2V0QWxsVHlwZXNJbkVtcHR5TWVzc2FnZVVua25vd25GaWVsZHMoJmVtcHR5X21lc3NhZ2UpOworICAgIGVtcHR5X21lc3NhZ2UuQ2xlYXIoKTsKKyAgICBFWFBFQ1RfRVEoMCwgZW1wdHlfbWVzc2FnZS51bmtub3duX2ZpZWxkcygpLnNpemUoKSk7CisgIH0KK30KKworLy8gVGVzdHMgZm9yIG1hcCBsaXRlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitURVNUKExpdGUsIEFsbExpdGUxNSkgeworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICAvLyBBY2Nlc3NvcnMKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTsKKworICAgIE1hcExpdGVUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlKTsKKyAgICBNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlKTsKKworICAgIE1hcExpdGVUZXN0VXRpbDo6TW9kaWZ5TWFwRmllbGRzKCZtZXNzYWdlKTsKKyAgICBNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc01vZGlmaWVkKG1lc3NhZ2UpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTE2KSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIFNldE1hcEZpZWxkc0luaXRpYWxpemVkCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2U7CisKKyAgICBNYXBMaXRlVGVzdFV0aWw6OlNldE1hcEZpZWxkc0luaXRpYWxpemVkKCZtZXNzYWdlKTsKKyAgICBNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldEluaXRpYWxpemVkKG1lc3NhZ2UpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTE3KSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIENsZWFyCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2U7CisKKyAgICBNYXBMaXRlVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZSk7CisgICAgbWVzc2FnZS5DbGVhcigpOworICAgIE1hcExpdGVUZXN0VXRpbDo6RXhwZWN0Q2xlYXIobWVzc2FnZSk7CisgIH0KK30KKworVEVTVChMaXRlLCBBbGxMaXRlMTgpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKworICB7CisgICAgLy8gQ2xlYXJNZXNzYWdlTWFwCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlTWFwTGl0ZSBtZXNzYWdlOworCisgICAgLy8gQ3JlYXRlcyBhIFRlc3RBbGxUeXBlcyB3aXRoIGRlZmF1bHQgdmFsdWUKKyAgICBUZXN0VXRpbExpdGU6OkV4cGVjdENsZWFyKCgqbWVzc2FnZS5tdXRhYmxlX21hcF9pbnQzMl9tZXNzYWdlKCkpWzBdKTsKKyAgfQorfQorCitURVNUKExpdGUsIEFsbExpdGUxOSkgeworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICAvLyBDb3B5RnJvbQorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgICBNYXBMaXRlVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTEpOworICAgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UxKTsKKyAgICBNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMik7CisKKyAgICAvLyBDb3B5aW5nIGZyb20gc2VsZiBzaG91bGQgYmUgYSBuby1vcC4KKyAgICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMik7CisgICAgTWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTIwKSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIENvcHlGcm9tTWVzc2FnZU1hcAorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZU1hcExpdGUgbWVzc2FnZTEsIG1lc3NhZ2UyOworCisgICAgKCptZXNzYWdlMS5tdXRhYmxlX21hcF9pbnQzMl9tZXNzYWdlKCkpWzBdLmFkZF9yZXBlYXRlZF9pbnQzMigxMDApOworICAgICgqbWVzc2FnZTIubXV0YWJsZV9tYXBfaW50MzJfbWVzc2FnZSgpKVswXS5hZGRfcmVwZWF0ZWRfaW50MzIoMTAxKTsKKworICAgIG1lc3NhZ2UxLkNvcHlGcm9tKG1lc3NhZ2UyKTsKKworICAgIC8vIENoZWNrcyByZXBlYXRlZCBmaWVsZCBpcyBvdmVyd3JpdHRlbi4KKyAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZTEubWFwX2ludDMyX21lc3NhZ2UoKS5hdCgwKS5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICAgIEVYUEVDVF9FUSgxMDEsIG1lc3NhZ2UxLm1hcF9pbnQzMl9tZXNzYWdlKCkuYXQoMCkucmVwZWF0ZWRfaW50MzIoMCkpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTIxKSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIFN3YXBXaXRoRW1wdHkKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTEsIG1lc3NhZ2UyOworCisgICAgTWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UxKTsKKyAgICBNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMSk7CisgICAgTWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RDbGVhcihtZXNzYWdlMik7CisKKyAgICBtZXNzYWdlMS5Td2FwKCZtZXNzYWdlMik7CisgICAgTWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworICAgIE1hcExpdGVUZXN0VXRpbDo6RXhwZWN0Q2xlYXIobWVzc2FnZTEpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTIyKSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIFN3YXBXaXRoU2VsZgorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlOworCisgICAgTWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UpOworICAgIE1hcExpdGVUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UpOworCisgICAgbWVzc2FnZS5Td2FwKCZtZXNzYWdlKTsKKyAgICBNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlKTsKKyAgfQorfQorCitURVNUKExpdGUsIEFsbExpdGUyMykgeworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICAvLyBTd2FwV2l0aE90aGVyCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICAgIE1hcExpdGVUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlMSk7CisgICAgTWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UyKTsKKyAgICBNYXBMaXRlVGVzdFV0aWw6Ok1vZGlmeU1hcEZpZWxkcygmbWVzc2FnZTIpOworCisgICAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOworICAgIE1hcExpdGVUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzTW9kaWZpZWQobWVzc2FnZTEpOworICAgIE1hcExpdGVUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgfQorfQorCitURVNUKExpdGUsIEFsbExpdGUyNCkgeworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICAvLyBDb3B5Q29uc3RydWN0b3IKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTE7CisgICAgTWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UxKTsKKworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlMihtZXNzYWdlMSk7CisgICAgTWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTI1KSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIENvcHlBc3NpZ25tZW50T3BlcmF0b3IKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTE7CisgICAgTWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UxKTsKKworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlMjsKKyAgICBtZXNzYWdlMiA9IG1lc3NhZ2UxOworICAgIE1hcExpdGVUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UyKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHNlbGYtYXNzaWdubWVudCBkb2VzIHNvbWV0aGluZyBzYW5lLgorICAgIG1lc3NhZ2UyLm9wZXJhdG9yPShtZXNzYWdlMik7CisgICAgTWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTI2KSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIE5vbkVtcHR5TWVyZ2VGcm9tCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICAgIE1hcExpdGVUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlMSk7CisKKyAgICAvLyBUaGlzIGZpZWxkIHdpbGwgdGVzdCBtZXJnaW5nIGludG8gYW4gZW1wdHkgc3BvdC4KKyAgICAoKm1lc3NhZ2UyLm11dGFibGVfbWFwX2ludDMyX2ludDMyKCkpWzFdID0gMTsKKyAgICBtZXNzYWdlMS5tdXRhYmxlX21hcF9pbnQzMl9pbnQzMigpLT5lcmFzZSgxKTsKKworICAgIC8vIFRoaXMgdGVzdHMgb3ZlcndyaXRpbmcuCisgICAgKCptZXNzYWdlMi5tdXRhYmxlX21hcF9pbnQzMl9kb3VibGUoKSlbMV0gPSAxOworICAgICgqbWVzc2FnZTEubXV0YWJsZV9tYXBfaW50MzJfZG91YmxlKCkpWzFdID0gMjsKKworICAgIG1lc3NhZ2UxLk1lcmdlRnJvbShtZXNzYWdlMik7CisgICAgTWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTEpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTI3KSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIE1lcmdlRnJvbU1lc3NhZ2VNYXAKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VNYXBMaXRlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICAgICgqbWVzc2FnZTEubXV0YWJsZV9tYXBfaW50MzJfbWVzc2FnZSgpKVswXS5hZGRfcmVwZWF0ZWRfaW50MzIoMTAwKTsKKyAgICAoKm1lc3NhZ2UyLm11dGFibGVfbWFwX2ludDMyX21lc3NhZ2UoKSlbMF0uYWRkX3JlcGVhdGVkX2ludDMyKDEwMSk7CisKKyAgICBtZXNzYWdlMS5NZXJnZUZyb20obWVzc2FnZTIpOworCisgICAgLy8gQ2hlY2tzIHJlcGVhdGVkIGZpZWxkIGlzIG92ZXJ3cml0dGVuLgorICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlMS5tYXBfaW50MzJfbWVzc2FnZSgpLmF0KDApLnJlcGVhdGVkX2ludDMyX3NpemUoKSk7CisgICAgRVhQRUNUX0VRKDEwMSwgbWVzc2FnZTEubWFwX2ludDMyX21lc3NhZ2UoKS5hdCgwKS5yZXBlYXRlZF9pbnQzMigwKSk7CisgIH0KK30KKworVEVTVChMaXRlLCBBbGxMaXRlMjgpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKworICB7CisgICAgLy8gVGVzdCB0aGUgZ2VuZXJhdGVkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoKQorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlMSwgbWVzc2FnZTI7CisgICAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgICBNYXBMaXRlVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTEpOworICAgIHNpemVfdCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemVMb25nKCk7CisgICAgZGF0YS5yZXNpemUoc2l6ZSk7CisgICAgOjp1aW50OF90KiBzdGFydCA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Ojp1aW50OF90Kj4oOjpnb29nbGU6OnByb3RvYnVmOjpzdHJpbmdfYXNfYXJyYXkoJmRhdGEpKTsKKyAgICA6OnVpbnQ4X3QqIGVuZCA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoc3RhcnQpOworICAgIEVYUEVDVF9FUShzaXplLCBlbmQgLSBzdGFydCk7CisgICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMik7CisgIH0KK30KKworVEVTVChMaXRlLCBBbGxMaXRlMjkpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKworICB7CisgICAgLy8gVGVzdCB0aGUgZ2VuZXJhdGVkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgICBNYXBMaXRlVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTEpOworICAgIHNpemVfdCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemVMb25nKCk7CisgICAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgICBkYXRhLnJlc2l6ZShzaXplKTsKKyAgICB7CisgICAgICAvLyBBbGxvdyB0aGUgb3V0cHV0IHN0cmVhbSB0byBidWZmZXIgb25seSBvbmUgYnl0ZSBhdCBhIHRpbWUuCisgICAgICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gYXJyYXlfc3RyZWFtKDo6Z29vZ2xlOjpwcm90b2J1Zjo6c3RyaW5nX2FzX2FycmF5KCZkYXRhKSwgc2l6ZSwgMSk7CisgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmYXJyYXlfc3RyZWFtKTsKKyAgICAgIG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0X3N0cmVhbSk7CisgICAgICBFWFBFQ1RfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKKyAgICAgIEVYUEVDVF9FUShzaXplLCBvdXRwdXRfc3RyZWFtLkJ5dGVDb3VudCgpKTsKKyAgICB9CisgICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMik7CisgIH0KK30KKworCitURVNUKExpdGUsIEFsbExpdGUzMikgeworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICAvLyBQcm90bzJVbmtub3duRW51bQorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RW51bU1hcFBsdXNFeHRyYUxpdGUgZnJvbTsKKyAgICAoKmZyb20ubXV0YWJsZV9rbm93bl9tYXBfZmllbGQoKSlbMF0gPQorICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6RV9QUk9UTzJfTUFQX0VOVU1fRk9PX0xJVEU7CisgICAgKCpmcm9tLm11dGFibGVfdW5rbm93bl9tYXBfZmllbGQoKSlbMF0gPQorICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6RV9QUk9UTzJfTUFQX0VOVU1fRVhUUkFfTElURTsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworICAgIGZyb20uU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RFbnVtTWFwTGl0ZSB0bzsKKyAgICBFWFBFQ1RfVFJVRSh0by5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEVYUEVDVF9FUSgwLCB0by51bmtub3duX21hcF9maWVsZCgpLnNpemUoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHRvLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+ZW1wdHkoKSk7CisgICAgQVNTRVJUX0VRKDEsIHRvLmtub3duX21hcF9maWVsZCgpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKHByb3RvYnVmX3VuaXR0ZXN0OjpQUk9UTzJfTUFQX0VOVU1fRk9PX0xJVEUsCisgICAgICAgICAgICAgIHRvLmtub3duX21hcF9maWVsZCgpLmF0KDApKTsKKworICAgIGRhdGEuY2xlYXIoKTsKKyAgICBmcm9tLkNsZWFyKCk7CisgICAgdG8uU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworICAgIEVYUEVDVF9UUlVFKGZyb20uUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBBU1NFUlRfRVEoMSwgZnJvbS5rbm93bl9tYXBfZmllbGQoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShwcm90b2J1Zl91bml0dGVzdDo6RV9QUk9UTzJfTUFQX0VOVU1fRk9PX0xJVEUsCisgICAgICAgICAgICAgIGZyb20ua25vd25fbWFwX2ZpZWxkKCkuYXQoMCkpOworICAgIEFTU0VSVF9FUSgxLCBmcm9tLnVua25vd25fbWFwX2ZpZWxkKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEocHJvdG9idWZfdW5pdHRlc3Q6OkVfUFJPVE8yX01BUF9FTlVNX0VYVFJBX0xJVEUsCisgICAgICAgICAgICAgIGZyb20udW5rbm93bl9tYXBfZmllbGQoKS5hdCgwKSk7CisgIH0KK30KKworVEVTVChMaXRlLCBBbGxMaXRlMzMpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKworICB7CisgICAgLy8gU3RhbmRhcmRXaXJlRm9ybWF0CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2U7CisgICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJceDBBXHgwNFx4MDhceDAxXHgxMFx4MDEiOworCisgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMSkpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTM0KSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIFVub3JkZXJlZFdpcmVGb3JtYXQKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTsKKworICAgIC8vIHB1dCB2YWx1ZSBiZWZvcmUga2V5IGluIHdpcmUgZm9ybWF0CisgICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJceDBBXHgwNFx4MTBceDAxXHgwOFx4MDIiOworCisgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLnNpemUoKSk7CisgICAgQVNTRVJUX05FKG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuZmluZCgyKSwKKyAgICAgICAgICAgICAgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5lbmQoKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMikpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTM1KSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIER1cGxpY2F0ZWRLZXlXaXJlRm9ybWF0CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2U7CisKKyAgICAvLyBUd28ga2V5IGZpZWxkcyBpbiB3aXJlIGZvcm1hdAorICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiXHgwQVx4MDZceDA4XHgwMVx4MDhceDAyXHgxMFx4MDEiOworCisgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMikpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTM2KSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIER1cGxpY2F0ZWRWYWx1ZVdpcmVGb3JtYXQKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTsKKworICAgIC8vIFR3byB2YWx1ZSBmaWVsZHMgaW4gd2lyZSBmb3JtYXQKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlx4MEFceDA2XHgwOFx4MDFceDEwXHgwMVx4MTBceDAyIjsKKworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmF0KDEpKTsKKyAgfQorfQorCitURVNUKExpdGUsIEFsbExpdGUzNykgeworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICAvLyBNaXNzZWRLZXlXaXJlRm9ybWF0CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2U7CisKKyAgICAvLyBObyBrZXkgZmllbGQgaW4gd2lyZSBmb3JtYXQKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlx4MEFceDAyXHgxMFx4MDEiOworCisgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLnNpemUoKSk7CisgICAgQVNTRVJUX05FKG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuZmluZCgwKSwKKyAgICAgICAgICAgICAgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5lbmQoKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMCkpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTM4KSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIE1pc3NlZFZhbHVlV2lyZUZvcm1hdAorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlOworCisgICAgLy8gTm8gdmFsdWUgZmllbGQgaW4gd2lyZSBmb3JtYXQKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlx4MEFceDAyXHgwOFx4MDEiOworCisgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLnNpemUoKSk7CisgICAgQVNTRVJUX05FKG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuZmluZCgxKSwKKyAgICAgICAgICAgICAgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5lbmQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMSkpOworICB9Cit9CisKK1RFU1QoTGl0ZSwgQWxsTGl0ZTM5KSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIFVua25vd25GaWVsZFdpcmVGb3JtYXQKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTsKKworICAgIC8vIFVua25vd24gZmllbGQgaW4gd2lyZSBmb3JtYXQKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlx4MEFceDA2XHgwOFx4MDJceDEwXHgwM1x4MThceDAxIjsKKworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgzLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmF0KDIpKTsKKyAgfQorfQorCitURVNUKExpdGUsIEFsbExpdGU0MCkgeworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICAvLyBDb3JydXB0ZWRXaXJlRm9ybWF0CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2U7CisKKyAgICAvLyBjb3JydXB0ZWQgZGF0YSBpbiB3aXJlIGZvcm1hdAorICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiXHgwQVx4MDZceDA4XHgwMlx4MTFceDAzIjsKKworICAgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIH0KK30KKworVEVTVChMaXRlLCBBbGxMaXRlNDEpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKworICB7CisgICAgLy8gSXNJbml0aWFsaXplZAorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UmVxdWlyZWRNZXNzYWdlTWFwTGl0ZSBtYXBfbWVzc2FnZTsKKworICAgIC8vIEFkZCBhbiB1bmluaXRpYWxpemVkIG1lc3NhZ2UuCisgICAgKCptYXBfbWVzc2FnZS5tdXRhYmxlX21hcF9maWVsZCgpKVswXTsKKyAgICBFWFBFQ1RfRkFMU0UobWFwX21lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKworICAgIC8vIEluaXRpYWxpemUgdW5pbml0aWFsaXplZCBtZXNzYWdlCisgICAgKCptYXBfbWVzc2FnZS5tdXRhYmxlX21hcF9maWVsZCgpKVswXS5zZXRfYSgwKTsKKyAgICAoKm1hcF9tZXNzYWdlLm11dGFibGVfbWFwX2ZpZWxkKCkpWzBdLnNldF9iKDApOworICAgICgqbWFwX21lc3NhZ2UubXV0YWJsZV9tYXBfZmllbGQoKSlbMF0uc2V0X2MoMCk7CisgICAgRVhQRUNUX1RSVUUobWFwX21lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKyAgfQorfQorCitURVNUKExpdGUsIEFsbExpdGU0MikgeworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICAvLyBDaGVjayB0aGF0IGFkZGluZyBtb3JlIHZhbHVlcyB0byBlbnVtIGRvZXMgbm90IGNvcnJ1cHQgbWVzc2FnZQorICAgIC8vIHdoZW4gcGFzc2VkIHRocm91Z2ggYW4gb2xkIGNsaWVudC4KKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VjJNZXNzYWdlTGl0ZSB2Ml9tZXNzYWdlOworICAgIHYyX21lc3NhZ2Uuc2V0X2ludF9maWVsZCg4MDApOworICAgIC8vIFNldCBlbnVtIGZpZWxkIHRvIHRoZSB2YWx1ZSBub3QgdW5kZXJzdG9vZCBieSB0aGUgb2xkIGNsaWVudC4KKyAgICB2Ml9tZXNzYWdlLnNldF9lbnVtX2ZpZWxkKHByb3RvYnVmX3VuaXR0ZXN0OjpWMl9TRUNPTkQpOworICAgIHN0ZDo6c3RyaW5nIHYyX2J5dGVzID0gdjJfbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOworCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlYxTWVzc2FnZUxpdGUgdjFfbWVzc2FnZTsKKyAgICB2MV9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyh2Ml9ieXRlcyk7CisgICAgRVhQRUNUX1RSVUUodjFfbWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworICAgIEVYUEVDVF9FUSh2MV9tZXNzYWdlLmludF9maWVsZCgpLCB2Ml9tZXNzYWdlLmludF9maWVsZCgpKTsKKyAgICAvLyBWMSBjbGllbnQgZG9lcyBub3QgdW5kZXJzdGFuZCBWMl9TRUNPTkQgdmFsdWUsIHNvIGl0IGRpc2NhcmRzIGl0IGFuZAorICAgIC8vIHVzZXMgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkLgorICAgIEVYUEVDVF9FUSh2MV9tZXNzYWdlLmVudW1fZmllbGQoKSwgcHJvdG9idWZfdW5pdHRlc3Q6OlYxX0ZJUlNUKTsKKworICAgIC8vIEhvd2V2ZXIsIHdoZW4gcmUtc2VyaWFsaXplZCwgaXQgc2hvdWxkIHByZXNlcnZlIGVudW0gdmFsdWUuCisgICAgc3RkOjpzdHJpbmcgdjFfYnl0ZXMgPSB2MV9tZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VjJNZXNzYWdlTGl0ZSBzYW1lX3YyX21lc3NhZ2U7CisgICAgc2FtZV92Ml9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyh2MV9ieXRlcyk7CisKKyAgICBFWFBFQ1RfRVEodjJfbWVzc2FnZS5pbnRfZmllbGQoKSwgc2FtZV92Ml9tZXNzYWdlLmludF9maWVsZCgpKTsKKyAgICBFWFBFQ1RfRVEodjJfbWVzc2FnZS5lbnVtX2ZpZWxkKCksIHNhbWVfdjJfbWVzc2FnZS5lbnVtX2ZpZWxkKCkpOworICB9Cit9CisKKy8vIFRlc3QgdGhhdCB3aGVuIHBhcnNpbmcgYSBvbmVvZiwgd2UgY2FuIHN1Y2Nlc3NmdWxseSBjbGVhciB3aGF0ZXZlciBhbHJlYWR5CisvLyBoYXBwZW5lZCB0byBiZSBzdG9yZWQgaW4gdGhlIG9uZW9mLgorVEVTVChMaXRlLCBBbGxMaXRlNDMpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RPbmVvZlBhcnNpbmdMaXRlIG1lc3NhZ2UxOworCisgIG1lc3NhZ2UxLnNldF9vbmVvZl9pbnQzMigxNyk7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UxLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSk7CisKKyAgLy8gU3VibWVzc2FnZQorICB7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RPbmVvZlBhcnNpbmdMaXRlIG1lc3NhZ2UyOworICAgIG1lc3NhZ2UyLm11dGFibGVfb25lb2Zfc3VibWVzc2FnZSgpOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0X3N0cmVhbSgKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCA6OnVpbnQ4X3QqPihzZXJpYWxpemVkLmRhdGEoKSksCisgICAgICAgIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5NZXJnZUZyb21Db2RlZFN0cmVhbSgmaW5wdXRfc3RyZWFtKSk7CisgICAgRVhQRUNUX0VRKDE3LCBtZXNzYWdlMi5vbmVvZl9pbnQzMigpKTsKKyAgfQorCisgIC8vIFN0cmluZworICB7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RPbmVvZlBhcnNpbmdMaXRlIG1lc3NhZ2UyOworICAgIG1lc3NhZ2UyLnNldF9vbmVvZl9zdHJpbmcoInN0cmluZyIpOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0X3N0cmVhbSgKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCA6OnVpbnQ4X3QqPihzZXJpYWxpemVkLmRhdGEoKSksCisgICAgICAgIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5NZXJnZUZyb21Db2RlZFN0cmVhbSgmaW5wdXRfc3RyZWFtKSk7CisgICAgRVhQRUNUX0VRKDE3LCBtZXNzYWdlMi5vbmVvZl9pbnQzMigpKTsKKyAgfQorCisgIC8vIEJ5dGVzCisgIHsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE9uZW9mUGFyc2luZ0xpdGUgbWVzc2FnZTI7CisgICAgbWVzc2FnZTIuc2V0X29uZW9mX2J5dGVzKCJieXRlcyIpOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0X3N0cmVhbSgKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCA6OnVpbnQ4X3QqPihzZXJpYWxpemVkLmRhdGEoKSksCisgICAgICAgIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5NZXJnZUZyb21Db2RlZFN0cmVhbSgmaW5wdXRfc3RyZWFtKSk7CisgICAgRVhQRUNUX0VRKDE3LCBtZXNzYWdlMi5vbmVvZl9pbnQzMigpKTsKKyAgfQorfQorCisvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IHBhcnNlIGZpZWxkcyBvZiB2YXJpb3VzIHR5cGVzIHdpdGhpbiBvbmVvZgorLy8gZmllbGRzLiBXZSBhbHNvIHZlcmlmeSB0aGF0IHdlIGNhbiBwYXJzZSB0aGUgc2FtZSBkYXRhIHR3aWNlIGludG8gdGhlIHNhbWUKKy8vIG1lc3NhZ2UuCitURVNUKExpdGUsIEFsbExpdGU0NCkgeworICAvLyBJbnQzMgorICB7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RPbmVvZlBhcnNpbmdMaXRlIG9yaWdpbmFsOworICAgIG9yaWdpbmFsLnNldF9vbmVvZl9pbnQzMigxNyk7CisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgICBFWFBFQ1RfVFJVRShvcmlnaW5hbC5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCkpOworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0T25lb2ZQYXJzaW5nTGl0ZSBwYXJzZWQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0X3N0cmVhbSgKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IDo6dWludDhfdCo+KHNlcmlhbGl6ZWQuZGF0YSgpKSwKKyAgICAgICAgICBzZXJpYWxpemVkLnNpemUoKSk7CisgICAgICBFWFBFQ1RfVFJVRShwYXJzZWQuTWVyZ2VGcm9tQ29kZWRTdHJlYW0oJmlucHV0X3N0cmVhbSkpOworICAgICAgRVhQRUNUX0VRKDE3LCBwYXJzZWQub25lb2ZfaW50MzIoKSk7CisgICAgfQorICB9CisKKyAgLy8gU3VibWVzc2FnZQorICB7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RPbmVvZlBhcnNpbmdMaXRlIG9yaWdpbmFsOworICAgIG9yaWdpbmFsLm11dGFibGVfb25lb2Zfc3VibWVzc2FnZSgpLT5zZXRfb3B0aW9uYWxfaW50MzIoNSk7CisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgICBFWFBFQ1RfVFJVRShvcmlnaW5hbC5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCkpOworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0T25lb2ZQYXJzaW5nTGl0ZSBwYXJzZWQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0X3N0cmVhbSgKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IDo6dWludDhfdCo+KHNlcmlhbGl6ZWQuZGF0YSgpKSwKKyAgICAgICAgICBzZXJpYWxpemVkLnNpemUoKSk7CisgICAgICBFWFBFQ1RfVFJVRShwYXJzZWQuTWVyZ2VGcm9tQ29kZWRTdHJlYW0oJmlucHV0X3N0cmVhbSkpOworICAgICAgRVhQRUNUX0VRKDUsIHBhcnNlZC5vbmVvZl9zdWJtZXNzYWdlKCkub3B0aW9uYWxfaW50MzIoKSk7CisgICAgfQorICB9CisKKyAgLy8gU3RyaW5nCisgIHsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE9uZW9mUGFyc2luZ0xpdGUgb3JpZ2luYWw7CisgICAgb3JpZ2luYWwuc2V0X29uZW9mX3N0cmluZygic3RyaW5nIik7CisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgICBFWFBFQ1RfVFJVRShvcmlnaW5hbC5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCkpOworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0T25lb2ZQYXJzaW5nTGl0ZSBwYXJzZWQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0X3N0cmVhbSgKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IDo6dWludDhfdCo+KHNlcmlhbGl6ZWQuZGF0YSgpKSwKKyAgICAgICAgICBzZXJpYWxpemVkLnNpemUoKSk7CisgICAgICBFWFBFQ1RfVFJVRShwYXJzZWQuTWVyZ2VGcm9tQ29kZWRTdHJlYW0oJmlucHV0X3N0cmVhbSkpOworICAgICAgRVhQRUNUX0VRKCJzdHJpbmciLCBwYXJzZWQub25lb2Zfc3RyaW5nKCkpOworICAgIH0KKyAgfQorCisgIC8vIEJ5dGVzCisgIHsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE9uZW9mUGFyc2luZ0xpdGUgb3JpZ2luYWw7CisgICAgb3JpZ2luYWwuc2V0X29uZW9mX2J5dGVzKCJieXRlcyIpOworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgICAgRVhQRUNUX1RSVUUob3JpZ2luYWwuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKTsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE9uZW9mUGFyc2luZ0xpdGUgcGFyc2VkOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCA6OnVpbnQ4X3QqPihzZXJpYWxpemVkLmRhdGEoKSksCisgICAgICAgICAgc2VyaWFsaXplZC5zaXplKCkpOworICAgICAgRVhQRUNUX1RSVUUocGFyc2VkLk1lcmdlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dF9zdHJlYW0pKTsKKyAgICAgIEVYUEVDVF9FUSgiYnl0ZXMiLCBwYXJzZWQub25lb2ZfYnl0ZXMoKSk7CisgICAgfQorICB9CisKKyAgLy8gRW51bQorICB7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RPbmVvZlBhcnNpbmdMaXRlIG9yaWdpbmFsOworICAgIG9yaWdpbmFsLnNldF9vbmVvZl9lbnVtKHByb3RvYnVmX3VuaXR0ZXN0OjpWMl9TRUNPTkQpOworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgICAgRVhQRUNUX1RSVUUob3JpZ2luYWwuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKTsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE9uZW9mUGFyc2luZ0xpdGUgcGFyc2VkOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCA6OnVpbnQ4X3QqPihzZXJpYWxpemVkLmRhdGEoKSksCisgICAgICAgICAgc2VyaWFsaXplZC5zaXplKCkpOworICAgICAgRVhQRUNUX1RSVUUocGFyc2VkLk1lcmdlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dF9zdHJlYW0pKTsKKyAgICAgIEVYUEVDVF9FUShwcm90b2J1Zl91bml0dGVzdDo6VjJfU0VDT05ELCBwYXJzZWQub25lb2ZfZW51bSgpKTsKKyAgICB9CisgIH0KKworICBzdGQ6OmNvdXQgPDwgIlBBU1MiIDw8IHN0ZDo6ZW5kbDsKK30KKworVEVTVChMaXRlLCBBbGxMaXRlNDUpIHsKKyAgLy8gVGVzdCB1bmtub3duIGZpZWxkcyBhcmUgbm90IGRpc2NhcmRlZCB1cG9uIHBhcnNpbmcuCisgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiXDIwXDEiOyAgLy8gdmFyaW50IDEgd2l0aCBmaWVsZCBudW1iZXIgMgorCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZUxpdGUgYTsKKyAgRVhQRUNUX1RSVUUoYS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0oCisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IDo6dWludDhfdCo+KGRhdGEuZGF0YSgpKSwgZGF0YS5zaXplKCkpOworICBFWFBFQ1RfVFJVRShhLk1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgmaW5wdXRfc3RyZWFtKSk7CisKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZCA9IGEuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgRVhQRUNUX0VRKHNlcmlhbGl6ZWQuc3Vic3RyKDAsIDIpLCBkYXRhKTsKKyAgRVhQRUNUX0VRKHNlcmlhbGl6ZWQuc3Vic3RyKDIpLCBkYXRhKTsKK30KKworLy8gVGhlIGZvbGxvd2luZyB0d28gdGVzdHMgY2hlY2sgZm9yIHdpcmUgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHBhY2tlZCBhbmQKKy8vIHVucGFja2VkIHJlcGVhdGVkIGZpZWxkcy4gVGhlcmUgdXNlZCB0byBiZSBhIGJ1ZyBpbiB0aGUgZ2VuZXJhdGVkIHBhcnNpbmcKKy8vIGNvZGUgdGhhdCBjYXVzZWQgdXMgdG8gY2FsY3VsYXRlIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHRhZyBudW1iZXIgd2l0aG91dAorLy8gdGFraW5nIGludG8gYWNjb3VudCB0aGF0IGEgcmVwZWF0ZWQgZmllbGQgbWlnaHQgbm90IGJlIGluIHRoZSBwYWNrZWQgKG9yCisvLyB1bnBhY2tlZCkgc3RhdGUgd2UgZXhwZWN0LiBUaGVzZSB0ZXN0cyBzcGVjaWZpY2FsbHkgY2hlY2sgZm9yIHRoYXQgaXNzdWUgYnkKKy8vIG1ha2luZyBzdXJlIHdlIGNhbiBwYXJzZSByZXBlYXRlZCBmaWVsZHMgd2hlbiB0aGUgdGFnIGlzIGhpZ2hlciB0aGFuIHdlIHdvdWxkCisvLyBleHBlY3QuCitURVNUKExpdGUsIEFsbExpdGU0NikgeworICBwcm90b2J1Zl91bml0dGVzdDo6UGFja2VkSW50MzIgcGFja2VkOworICBwYWNrZWQuYWRkX3JlcGVhdGVkX2ludDMyKDQyKTsKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgQVNTRVJUX1RSVUUocGFja2VkLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSk7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6Ok5vblBhY2tlZEludDMyIG5vbl9wYWNrZWQ7CisgIEFTU0VSVF9UUlVFKG5vbl9wYWNrZWQuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKKyAgQVNTRVJUX0VRKDEsIG5vbl9wYWNrZWQucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQyLCBub25fcGFja2VkLnJlcGVhdGVkX2ludDMyKDApKTsKK30KKworVEVTVChMaXRlLCBBbGxMaXRlNDcpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6Ok5vblBhY2tlZEZpeGVkMzIgbm9uX3BhY2tlZDsKKyAgbm9uX3BhY2tlZC5hZGRfcmVwZWF0ZWRfZml4ZWQzMig0Mik7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIEFTU0VSVF9UUlVFKG5vbl9wYWNrZWQuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6UGFja2VkRml4ZWQzMiBwYWNrZWQ7CisgIEFTU0VSVF9UUlVFKHBhY2tlZC5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpOworICBBU1NFUlRfRVEoMSwgcGFja2VkLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQyLCBwYWNrZWQucmVwZWF0ZWRfZml4ZWQzMigwKSk7Cit9CisKK1RFU1QoTGl0ZSwgTWFwQ3Jhc2gpIHsKKyAgLy8gU2VlIGIvMTEzNjM1NzMwCisgIEFyZW5hIGFyZW5hOworICBhdXRvIG1zZyA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZT4oJmFyZW5hKTsKKyAgLy8gUGF5bG9hZCBmb3IgdGhlIG1hcDxzdHJpbmcsIEVudW0+IHdpdGggYSBlbnVtIHZhcmludCB0aGF0J3MgbG9uZ2VyID4KKyAgLy8gMTAgYnl0ZXMuIFRoaXMgY2F1c2VzIGEgcGFyc2UgZmFpbCBhbmQgYSBzdWJzZXF1ZW50IGRlbGV0ZS4gZmllbGQgMTYKKyAgLy8gKG1hcDxpbnQzMiwgTWFwRW51bUxpdGU+KSB0YWcgPSAxMjgrMiA9IFwyMDIgXDEKKyAgLy8gICAxMyBsb25nIFwxNQorICAvLyAgIGludDMyIGtleSA9IDEgIChcMTAgXDEpCisgIC8vICAgTWFwRW51bUxpdGUgdmFsdWUgPSB0b28gbG9uZyB2YXJpbnQgKHBhcnNlIGVycm9yKQorICBFWFBFQ1RfRkFMU0UobXNnLT5QYXJzZUZyb21TdHJpbmcoCisgICAgICAiXDIwMlwxXDE1XDEwXDFcMjAwXDIwMFwyMDBcMjAwXDIwMFwyMDBcMjAwXDIwMFwyMDBcMjAwXDEiKSk7Cit9CisKK1RFU1QoTGl0ZSwgQ29ycmVjdEVuZGluZykgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSBtc2c7CisgIHsKKyAgICAvLyBBbGwgcHJvdG8gd2lyZWZvcm1hdCBwYXJzZXJzIHNob3VsZCBhY3QgdGhlIHNhbWUgb24gcGFyc2luZyBkYXRhIGluIGFzCisgICAgLy8gbXVjaCBhcyBpdCBjb25jZXJucyB0aGUgcGFyc2luZywgaWUuIG5vdCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGRhdGEuCisgICAgLy8gVGVzdEFsbFR5cGVzTGl0ZSBpcyBub3QgYSBncm91cCBpbnNpZGUgYW5vdGhlciBtZXNzYWdlLiBTbyBpbiBwcmFjdGljZQorICAgIC8vIHdpbGwgbm90IGVuY291bnRlciBhbiBlbmQtZ3JvdXAgdGFnLiBIb3dldmVyIHRoZSBwYXJzZXIgc2hvdWxkIGJlaGF2ZQorICAgIC8vIGxpa2UgYW55IHdpcmUgZm9ybWF0IHBhcnNlciBzaG91bGQuCisgICAgc3RhdGljIGNvbnN0IGNoYXIga1dpcmVGb3JtYXRbXSA9ICJcMjA0XDEiOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGNpcyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihrV2lyZUZvcm1hdCksIDIpOworICAgIC8vIFRoZSBvbGQgQ29kZWRJbnB1dFN0cmVhbSBwYXJzZXIgZ290IGFuIG9wdGltaXphdGlvbiAoUmVhZFRhZ05vTGFzdFRhZykKKyAgICAvLyBmb3Igbm9uLWdyb3VwIG1lc3NhZ2VzIChsaWtlIFRlc3RBbGxUeXBlc0xpdGUpIHdoaWNoIG1hZGUgaXQgbm90IGFjY2VwdAorICAgIC8vIGVuZC1ncm91cC4gVGhpcyBpcyBub3QgYSByZWFsIGJpZyBkZWFsLCBidXQgSSB0aGluayBnb2luZyBmb3J3YXJkIGl0cworICAgIC8vIGdvb2QgdG8gaGF2ZSBhbGwgcGFyc2UgbG9vcHMgYmVoYXZlICdleGFjdGx5JyB0aGUgc2FtZS4KKyAgICBFWFBFQ1RfVFJVRShtc2cuTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKCZjaXMpKTsKKyAgICBFWFBFQ1RfRkFMU0UoY2lzLkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShjaXMuTGFzdFRhZ1dhcygxMzIpKTsKKyAgfQorICB7CisgICAgLy8gVGhpcyBpcyBhbiBpbmNvbXBsZXRlIGVuZC1ncm91cCB0YWcuIFRoaXMgc2hvdWxkIGJlIGEgZ2VudWluZSBwYXJzZQorICAgIC8vIGZhaWx1cmUuCisgICAgc3RhdGljIGNvbnN0IGNoYXIga1dpcmVGb3JtYXRbXSA9ICJcMjE0IjsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBjaXMocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oa1dpcmVGb3JtYXQpLCAxKTsKKyAgICAvLyBVbmZvcnR1bmF0ZWx5IHRoZSBvbGQgcGFyc2VyIGRldGVjdHMgYSBwYXJzZSBlcnJvciBpbiBSZWFkVGFnIGFuZCByZXR1cm5zCisgICAgLy8gMCAoYXMgaXQgc3RhdGVzIDAgaXMgYW4gaW52YWxpZCB0YWcpLiBIb3dldmVyIDAgaXMgbm90IGFuIGludmFsaWQgdGFnCisgICAgLy8gYXMgaXQgY2FuIGJlIHVzZWQgdG8gdGVybWluYXRlIHRoZSBzdHJlYW0sIHNvIHRoaXMgcmV0dXJucyB0cnVlLgorICAgIEVYUEVDVF9GQUxTRShtc2cuTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKCZjaXMpKTsKKyAgfQorfQorCitURVNUKExpdGUsIERlYnVnU3RyaW5nKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgRVhQRUNUX1RSVUUoSGFzUHJlZml4U3RyaW5nKG1lc3NhZ2UxLkRlYnVnU3RyaW5nKCksICJNZXNzYWdlTGl0ZSBhdCAweCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzUHJlZml4U3RyaW5nKG1lc3NhZ2UyLkRlYnVnU3RyaW5nKCksICJNZXNzYWdlTGl0ZSBhdCAweCIpKTsKKworICAvLyBEZWJ1Z1N0cmluZygpIGFuZCBTaG9ydERlYnVnU3RyaW5nKCkgYXJlIHRoZSBzYW1lIGZvciBub3cuCisgIEVYUEVDVF9FUShtZXNzYWdlMS5EZWJ1Z1N0cmluZygpLCBtZXNzYWdlMS5TaG9ydERlYnVnU3RyaW5nKCkpOworCisgIC8vIEV2ZW4gaWRlbnRpY2FsIGxpdGUgcHJvdG9zIHNob3VsZCBoYXZlIGRpZmZlcmVudCBEZWJ1Z1N0cmluZygpIG91dHB1dC4gUGFydAorICAvLyBvZiB0aGUgcmVhc29uIGZvciBpbmNsdWRpbmcgdGhlIG1lbW9yeSBhZGRyZXNzIGlzIHNvIHRoYXQgd2UgZ2V0IHNvbWUKKyAgLy8gbm9uLWRldGVybWluaXNtLCB3aGljaCBzaG91bGQgbWFrZSBpdCBlYXNpZXIgZm9yIHVzIHRvIGNoYW5nZSB0aGUgb3V0cHV0CisgIC8vIGxhdGVyIHdpdGhvdXQgYnJlYWtpbmcgYW55IGNvZGUuCisgIEVYUEVDVF9ORShtZXNzYWdlMS5EZWJ1Z1N0cmluZygpLCBtZXNzYWdlMi5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVChMaXRlLCBFbnVtVmFsdWVUb05hbWUpIHsKKyAgRVhQRUNUX0VRKCJGT1JFSUdOX0xJVEVfRk9PIiwgcHJvdG9idWZfdW5pdHRlc3Q6OkZvcmVpZ25FbnVtTGl0ZV9OYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08pKTsKKyAgRVhQRUNUX0VRKCJGT1JFSUdOX0xJVEVfQkFSIiwgcHJvdG9idWZfdW5pdHRlc3Q6OkZvcmVpZ25FbnVtTGl0ZV9OYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIpKTsKKyAgRVhQRUNUX0VRKCJGT1JFSUdOX0xJVEVfQkFaIiwgcHJvdG9idWZfdW5pdHRlc3Q6OkZvcmVpZ25FbnVtTGl0ZV9OYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVopKTsKKyAgRVhQRUNUX0VRKCIiLCBwcm90b2J1Zl91bml0dGVzdDo6Rm9yZWlnbkVudW1MaXRlX05hbWUoMCkpOworICBFWFBFQ1RfRVEoIiIsIHByb3RvYnVmX3VuaXR0ZXN0OjpGb3JlaWduRW51bUxpdGVfTmFtZSg5OTkpKTsKK30KKworVEVTVChMaXRlLCBOZXN0ZWRFbnVtVmFsdWVUb05hbWUpIHsKKyAgRVhQRUNUX0VRKCJGT08iLCBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6TmVzdGVkRW51bV9OYW1lKAorICAgICAgICAgICAgICAgICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6Rk9PKSk7CisgIEVYUEVDVF9FUSgiQkFSIiwgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6Ok5lc3RlZEVudW1fTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBUikpOworICBFWFBFQ1RfRVEoIkJBWiIsIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpOZXN0ZWRFbnVtX05hbWUoCisgICAgICAgICAgICAgICAgICAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVopKTsKKyAgRVhQRUNUX0VRKCIiLCBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6TmVzdGVkRW51bV9OYW1lKDApKTsKKyAgRVhQRUNUX0VRKCIiLCBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6TmVzdGVkRW51bV9OYW1lKDk5OSkpOworfQorCitURVNUKExpdGUsIEVudW1OYW1lVG9WYWx1ZSkgeworICBwcm90b2J1Zl91bml0dGVzdDo6Rm9yZWlnbkVudW1MaXRlIHZhbHVlOworCisgIEFTU0VSVF9UUlVFKAorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkZvcmVpZ25FbnVtTGl0ZV9QYXJzZSgiRk9SRUlHTl9MSVRFX0ZPTyIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEocHJvdG9idWZfdW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08sIHZhbHVlKTsKKworICBBU1NFUlRfVFJVRSgKKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpGb3JlaWduRW51bUxpdGVfUGFyc2UoIkZPUkVJR05fTElURV9CQVIiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKHByb3RvYnVmX3VuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSLCB2YWx1ZSk7CisKKyAgQVNTRVJUX1RSVUUoCisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6Rm9yZWlnbkVudW1MaXRlX1BhcnNlKCJGT1JFSUdOX0xJVEVfQkFaIiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUShwcm90b2J1Zl91bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiwgdmFsdWUpOworCisgIC8vIE5vbi1leGlzdGVudCB2YWx1ZXMKKyAgRVhQRUNUX0ZBTFNFKHByb3RvYnVmX3VuaXR0ZXN0OjpGb3JlaWduRW51bUxpdGVfUGFyc2UoIkUiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkZvcmVpZ25FbnVtTGl0ZV9QYXJzZSgiRk9SRUlHTl9MSVRFX0MiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKHByb3RvYnVmX3VuaXR0ZXN0OjpGb3JlaWduRW51bUxpdGVfUGFyc2UoIkciLCAmdmFsdWUpKTsKK30KKworVEVTVChMaXRlLCBOZXN0ZWRFbnVtTmFtZVRvVmFsdWUpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6Ok5lc3RlZEVudW0gdmFsdWU7CisKKyAgQVNTRVJUX1RSVUUoCisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6TmVzdGVkRW51bV9QYXJzZSgiRk9PIiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUShwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6Rk9PLCB2YWx1ZSk7CisKKyAgQVNTRVJUX1RSVUUoCisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6TmVzdGVkRW51bV9QYXJzZSgiQkFSIiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUShwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFSLCB2YWx1ZSk7CisKKyAgQVNTRVJUX1RSVUUoCisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6TmVzdGVkRW51bV9QYXJzZSgiQkFaIiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUShwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaLCB2YWx1ZSk7CisKKyAgLy8gTm9uLWV4aXN0ZW50IHZhbHVlcworICBFWFBFQ1RfRkFMU0UoCisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6TmVzdGVkRW51bV9QYXJzZSgiQSIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6TmVzdGVkRW51bV9QYXJzZSgiQyIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6TmVzdGVkRW51bV9QYXJzZSgiRyIsICZ2YWx1ZSkpOworfQorCitURVNUKExpdGUsIEFsaWFzZWRFbnVtKSB7CisgIC8vIEVudW1zIHdpdGggYWxsb3dfYWxpYXMgPSB0cnVlIGNhbiBoYXZlIG11bHRpcGxlIGVudHJpZXMgd2l0aCB0aGUgc2FtZQorICAvLyB2YWx1ZS4KKyAgRVhQRUNUX0VRKCJGT08xIiwgcHJvdG9idWZfdW5pdHRlc3Q6OkR1cEVudW06OlRlc3RFbnVtV2l0aER1cFZhbHVlTGl0ZV9OYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkR1cEVudW06OkZPTzEpKTsKKyAgRVhQRUNUX0VRKCJGT08xIiwgcHJvdG9idWZfdW5pdHRlc3Q6OkR1cEVudW06OlRlc3RFbnVtV2l0aER1cFZhbHVlTGl0ZV9OYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkR1cEVudW06OkZPTzIpKTsKKyAgRVhQRUNUX0VRKCJCQVIxIiwgcHJvdG9idWZfdW5pdHRlc3Q6OkR1cEVudW06OlRlc3RFbnVtV2l0aER1cFZhbHVlTGl0ZV9OYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkR1cEVudW06OkJBUjEpKTsKKyAgRVhQRUNUX0VRKCJCQVIxIiwgcHJvdG9idWZfdW5pdHRlc3Q6OkR1cEVudW06OlRlc3RFbnVtV2l0aER1cFZhbHVlTGl0ZV9OYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkR1cEVudW06OkJBUjIpKTsKKyAgRVhQRUNUX0VRKCJCQVoiLCBwcm90b2J1Zl91bml0dGVzdDo6RHVwRW51bTo6VGVzdEVudW1XaXRoRHVwVmFsdWVMaXRlX05hbWUoCisgICAgICAgICAgICAgICAgICAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpEdXBFbnVtOjpCQVopKTsKKyAgRVhQRUNUX0VRKCIiLCBwcm90b2J1Zl91bml0dGVzdDo6RHVwRW51bTo6VGVzdEVudW1XaXRoRHVwVmFsdWVMaXRlX05hbWUoOTk5KSk7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OkR1cEVudW06OlRlc3RFbnVtV2l0aER1cFZhbHVlTGl0ZSB2YWx1ZTsKKyAgQVNTRVJUX1RSVUUoCisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6RHVwRW51bTo6VGVzdEVudW1XaXRoRHVwVmFsdWVMaXRlX1BhcnNlKCJGT08xIiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUShwcm90b2J1Zl91bml0dGVzdDo6RHVwRW51bTo6Rk9PMSwgdmFsdWUpOworCisgIHZhbHVlID0gc3RhdGljX2Nhc3Q8cHJvdG9idWZfdW5pdHRlc3Q6OkR1cEVudW06OlRlc3RFbnVtV2l0aER1cFZhbHVlTGl0ZT4oMCk7CisgIEFTU0VSVF9UUlVFKAorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkR1cEVudW06OlRlc3RFbnVtV2l0aER1cFZhbHVlTGl0ZV9QYXJzZSgiRk9PMiIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEocHJvdG9idWZfdW5pdHRlc3Q6OkR1cEVudW06OkZPTzIsIHZhbHVlKTsKK30KKworCitURVNUKExpdGUsIENvZGVkSW5wdXRTdHJlYW1Sb2xsYmFjaykgeworICB7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUgbTsKKyAgICBtLnNldF9vcHRpb25hbF9ieXRlcyhzdGQ6OnN0cmluZygzMCwgJ2EnKSk7CisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZCA9IG0uU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBzZXJpYWxpemVkICs9ICdcMDE0JzsKKyAgICBzZXJpYWxpemVkICs9IHN0ZDo6c3RyaW5nKDMsICcgJyk7CisgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gaXMoc2VyaWFsaXplZC5kYXRhKCksIHNlcmlhbGl6ZWQuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQuc2l6ZSgpIC0gNik7CisgICAgeworICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gY2lzKCZpcyk7CisgICAgICBtLkNsZWFyKCk7CisgICAgICBtLk1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgmY2lzKTsKKyAgICAgIEVYUEVDVF9UUlVFKGNpcy5MYXN0VGFnV2FzKDEyKSk7CisgICAgICBFWFBFQ1RfRkFMU0UoY2lzLkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKTsKKyAgICAgIC8vIFNob3VsZCBsZWF2ZSBpcyB3aXRoIDMgc3BhY2VzOworICAgIH0KKyAgICBjb25zdCB2b2lkKiBkYXRhOworICAgIGludCBzaXplOworICAgIEFTU0VSVF9UUlVFKGlzLk5leHQoJmRhdGEsICZzaXplKSk7CisgICAgQVNTRVJUX0VRKHNpemUsIDMpOworICAgIEVYUEVDVF9FUShtZW1jbXAoZGF0YSwgIiAgICIsIDMpLCAwKTsKKyAgfQorICB7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUgbTsKKyAgICBjb25zdGV4cHIgaW50IGtDb3VudCA9IDMwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0NvdW50OyBpKyspIG0uYWRkX3BhY2tlZF9maXhlZDMyKGkpOworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQgPSBtLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgc2VyaWFsaXplZCArPSAnXDAxNCc7CisgICAgc2VyaWFsaXplZCArPSBzdGQ6OnN0cmluZygzLCAnICcpOworICAgIC8vIEJ1ZmZlciBicmVha3MgaW4gbWlkZGxlIG9mIGEgZml4ZWQzMi4KKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpcyhzZXJpYWxpemVkLmRhdGEoKSwgc2VyaWFsaXplZC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZC5zaXplKCkgLSA3KTsKKyAgICB7CisgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBjaXMoJmlzKTsKKyAgICAgIG0uQ2xlYXIoKTsKKyAgICAgIG0uTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKCZjaXMpOworICAgICAgRVhQRUNUX1RSVUUoY2lzLkxhc3RUYWdXYXMoMTIpKTsKKyAgICAgIEVYUEVDVF9GQUxTRShjaXMuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkpOworICAgICAgLy8gU2hvdWxkIGxlYXZlIGlzIHdpdGggMyBzcGFjZXM7CisgICAgfQorICAgIEFTU0VSVF9FUShtLnBhY2tlZF9maXhlZDMyX3NpemUoKSwga0NvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDb3VudDsgaSsrKSBFWFBFQ1RfRVEobS5wYWNrZWRfZml4ZWQzMihpKSwgaSk7CisgICAgY29uc3Qgdm9pZCogZGF0YTsKKyAgICBpbnQgc2l6ZTsKKyAgICBBU1NFUlRfVFJVRShpcy5OZXh0KCZkYXRhLCAmc2l6ZSkpOworICAgIEFTU0VSVF9FUShzaXplLCAzKTsKKyAgICBFWFBFQ1RfRVEobWVtY21wKGRhdGEsICIgICAiLCAzKSwgMCk7CisgIH0KKyAgeworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlIG07CisgICAgY29uc3RleHByIGludCBrQ291bnQgPSAzMDsKKyAgICAvLyBNYWtlIHN1cmUgd2Ugb3V0cHV0IDIgYnl0ZSB2YXJpbnRzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ291bnQ7IGkrKykgbS5hZGRfcGFja2VkX2ZpeGVkMzIoMTI4ICsgaSk7CisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZCA9IG0uU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBzZXJpYWxpemVkICs9ICdcMDE0JzsKKyAgICBzZXJpYWxpemVkICs9IHN0ZDo6c3RyaW5nKDMsICcgJyk7CisgICAgLy8gQnVmZmVyIGJyZWFrcyBpbiBtaWRkbGUgb2YgYSAyIGJ5dGUgdmFyaW50LgorICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlzKHNlcmlhbGl6ZWQuZGF0YSgpLCBzZXJpYWxpemVkLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkLnNpemUoKSAtIDUpOworICAgIHsKKyAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGNpcygmaXMpOworICAgICAgbS5DbGVhcigpOworICAgICAgbS5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmNpcyk7CisgICAgICBFWFBFQ1RfVFJVRShjaXMuTGFzdFRhZ1dhcygxMikpOworICAgICAgRVhQRUNUX0ZBTFNFKGNpcy5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKSk7CisgICAgICAvLyBTaG91bGQgbGVhdmUgaXMgd2l0aCAzIHNwYWNlczsKKyAgICB9CisgICAgQVNTRVJUX0VRKG0ucGFja2VkX2ZpeGVkMzJfc2l6ZSgpLCBrQ291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0NvdW50OyBpKyspIEVYUEVDVF9FUShtLnBhY2tlZF9maXhlZDMyKGkpLCBpICsgMTI4KTsKKyAgICBjb25zdCB2b2lkKiBkYXRhOworICAgIGludCBzaXplOworICAgIEFTU0VSVF9UUlVFKGlzLk5leHQoJmRhdGEsICZzaXplKSk7CisgICAgQVNTRVJUX0VRKHNpemUsIDMpOworICAgIEVYUEVDVF9FUShtZW1jbXAoZGF0YSwgIiAgICIsIDMpLCAwKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXAuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwYTlhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwLmNjCkBAIC0wLDAgKzEsNDEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCit2b2lkKiBjb25zdCBrR2xvYmFsRW1wdHlUYWJsZVtrR2xvYmFsRW1wdHlUYWJsZVNpemVdID0ge251bGxwdHJ9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXAuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4YzE5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwLmgKQEAgLTAsMCArMSwxNDQ4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIG1hcCBjb250YWluZXIgYW5kIGl0cyBoZWxwZXJzIHRvIHN1cHBvcnQgcHJvdG9idWYgbWFwcy4KKy8vCisvLyBUaGUgTWFwIGFuZCBNYXBJdGVyYXRvciB0eXBlcyBhcmUgcHJvdmlkZWQgYnkgdGhpcyBoZWFkZXIgZmlsZS4KKy8vIFBsZWFzZSBhdm9pZCB1c2luZyBvdGhlciB0eXBlcyBkZWZpbmVkIGhlcmUsIHVubGVzcyB0aGV5IGFyZSBwdWJsaWMKKy8vIHR5cGVzIHdpdGhpbiBNYXAgb3IgTWFwSXRlcmF0b3IsIHN1Y2ggYXMgTWFwOjp2YWx1ZV90eXBlLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9NQVBfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9NQVBfSF9fCisKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+ICAvLyBUbyBzdXBwb3J0IFZpc3VhbCBTdHVkaW8gMjAwOAorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2lmIGRlZmluZWQoX19jcHBfbGliX3N0cmluZ192aWV3KQorI2luY2x1ZGUgPHN0cmluZ192aWV3PgorI2VuZGlmICAvLyBkZWZpbmVkKF9fY3BwX2xpYl9zdHJpbmdfdmlldykKKworI2lmICFkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9OT19SRFRTQykgJiYgZGVmaW5lZChfX0FQUExFX18pCisjaW5jbHVkZSA8bWFjaC9tYWNoX3RpbWUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF90eXBlX2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+CisKKyNpZmRlZiBTV0lHCisjZXJyb3IgIllvdSBjYW5ub3QgU1dJRyBwcm90byBoZWFkZXJzIgorI2VuZGlmCisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQ+CitjbGFzcyBNYXA7CisKK2NsYXNzIE1hcEl0ZXJhdG9yOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRW51bT4KK3N0cnVjdCBpc19wcm90b19lbnVtOworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVCwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtleV93aXJlX3R5cGUsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSB2YWx1ZV93aXJlX3R5cGU+CitjbGFzcyBNYXBGaWVsZExpdGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrZXlfd2lyZV90eXBlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgdmFsdWVfd2lyZV90eXBlPgorY2xhc3MgTWFwRmllbGQ7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlRGVmaW5lZE1hcEZpZWxkQmFzZTsKKworY2xhc3MgRHluYW1pY01hcEZpZWxkOworCitjbGFzcyBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjsKKworLy8gcmUtaW1wbGVtZW50IHN0ZDo6YWxsb2NhdG9yIHRvIHVzZSBhcmVuYSBhbGxvY2F0b3IgZm9yIG1lbW9yeSBhbGxvY2F0aW9uLgorLy8gVXNlZCBmb3IgTWFwIGltcGxlbWVudGF0aW9uLiBVc2VycyBzaG91bGQgbm90IHVzZSB0aGlzIGNsYXNzCisvLyBkaXJlY3RseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBVPgorY2xhc3MgTWFwQWxsb2NhdG9yIHsKKyBwdWJsaWM6CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBVOworICB1c2luZyBwb2ludGVyID0gdmFsdWVfdHlwZSo7CisgIHVzaW5nIGNvbnN0X3BvaW50ZXIgPSBjb25zdCB2YWx1ZV90eXBlKjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gdmFsdWVfdHlwZSY7CisgIHVzaW5nIGNvbnN0X3JlZmVyZW5jZSA9IGNvbnN0IHZhbHVlX3R5cGUmOworICB1c2luZyBzaXplX3R5cGUgPSBzaXplX3Q7CisgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHB0cmRpZmZfdDsKKworICBjb25zdGV4cHIgTWFwQWxsb2NhdG9yKCkgOiBhcmVuYV8obnVsbHB0cikge30KKyAgZXhwbGljaXQgY29uc3RleHByIE1hcEFsbG9jYXRvcihBcmVuYSogYXJlbmEpIDogYXJlbmFfKGFyZW5hKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgWD4KKyAgTWFwQWxsb2NhdG9yKGNvbnN0IE1hcEFsbG9jYXRvcjxYPiYgYWxsb2NhdG9yKSAgLy8gTk9MSU5UKHJ1bnRpbWUvZXhwbGljaXQpCisgICAgICA6IGFyZW5hXyhhbGxvY2F0b3IuYXJlbmEoKSkge30KKworICAvLyBNYXBBbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCBhbGlnbm1lbnRzIGJleW9uZCA4LiBUZWNobmljYWxseSB3ZSBzaG91bGQKKyAgLy8gc3VwcG9ydCB1cCB0byBzdGQ6Om1heF9hbGlnbl90LCBidXQgdGhpcyBmYWlscyB3aXRoIHVic2FuIGFuZCB0Y21hbGxvYworICAvLyBkZWJ1ZyBhbGxvY2F0aW9uIGxvZ2ljIHdoaWNoIGFzc3VtZSA4IGFzIGRlZmF1bHQgYWxpZ25tZW50LgorICBzdGF0aWNfYXNzZXJ0KGFsaWdub2YodmFsdWVfdHlwZSkgPD0gOCwgIiIpOworCisgIHBvaW50ZXIgYWxsb2NhdGUoc2l6ZV90eXBlIG4sIGNvbnN0IHZvaWQqIC8qIGhpbnQgKi8gPSBudWxscHRyKSB7CisgICAgLy8gSWYgYXJlbmEgaXMgbm90IGdpdmVuLCBtYWxsb2MgbmVlZHMgdG8gYmUgY2FsbGVkIHdoaWNoIGRvZXNuJ3QKKyAgICAvLyBjb25zdHJ1Y3QgZWxlbWVudCBvYmplY3QuCisgICAgaWYgKGFyZW5hXyA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8cG9pbnRlcj4oOjpvcGVyYXRvciBuZXcobiAqIHNpemVvZih2YWx1ZV90eXBlKSkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxwb2ludGVyPigKKyAgICAgICAgICBBcmVuYTo6Q3JlYXRlQXJyYXk8dWludDhfdD4oYXJlbmFfLCBuICogc2l6ZW9mKHZhbHVlX3R5cGUpKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgcCwgc2l6ZV90eXBlIG4pIHsKKyAgICBpZiAoYXJlbmFfID09IG51bGxwdHIpIHsKKyAgICAgIGludGVybmFsOjpTaXplZERlbGV0ZShwLCBuICogc2l6ZW9mKHZhbHVlX3R5cGUpKTsKKyAgICB9CisgIH0KKworI2lmICFkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9PU19BUFBMRSkgJiYgIWRlZmluZWQoR09PR0xFX1BST1RPQlVGX09TX05BQ0wpICYmIFwKKyAgICAhZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfT1NfRU1TQ1JJUFRFTikKKyAgdGVtcGxhdGUgPGNsYXNzIE5vZGVUeXBlLCBjbGFzcy4uLiBBcmdzPgorICB2b2lkIGNvbnN0cnVjdChOb2RlVHlwZSogcCwgQXJncyYmLi4uIGFyZ3MpIHsKKyAgICAvLyBDbGFuZyAzLjYgZG9lc24ndCBjb21waWxlIHN0YXRpYyBjYXN0aW5nIHRvIHZvaWQqIGRpcmVjdGx5LiAoSXNzdWUKKyAgICAvLyAjMTI2NikgQWNjb3JkaW5nIEMrKyBzdGFuZGFyZCA1LjIuOS8xOiAiVGhlIHN0YXRpY19jYXN0IG9wZXJhdG9yIHNoYWxsCisgICAgLy8gbm90IGNhc3QgYXdheSBjb25zdG5lc3MiLiBTbyBmaXJzdCB0aGUgbWF5YmUgY29uc3QgcG9pbnRlciBpcyBjYXN0ZWQgdG8KKyAgICAvLyBjb25zdCB2b2lkKiBhbmQgYWZ0ZXIgdGhlIGNvbnN0IHZvaWQqIGlzIGNvbnN0IGNhc3RlZC4KKyAgICBuZXcgKGNvbnN0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPihwKSkpCisgICAgICAgIE5vZGVUeXBlKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgTm9kZVR5cGU+CisgIHZvaWQgZGVzdHJveShOb2RlVHlwZSogcCkgeworICAgIHAtPn5Ob2RlVHlwZSgpOworICB9CisjZWxzZQorICB2b2lkIGNvbnN0cnVjdChwb2ludGVyIHAsIGNvbnN0X3JlZmVyZW5jZSB0KSB7IG5ldyAocCkgdmFsdWVfdHlwZSh0KTsgfQorCisgIHZvaWQgZGVzdHJveShwb2ludGVyIHApIHsgcC0+fnZhbHVlX3R5cGUoKTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFg+CisgIHN0cnVjdCByZWJpbmQgeworICAgIHVzaW5nIG90aGVyID0gTWFwQWxsb2NhdG9yPFg+OworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBYPgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFwQWxsb2NhdG9yPFg+JiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiBhcmVuYV8gPT0gb3RoZXIuYXJlbmFfOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFg+CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYXBBbGxvY2F0b3I8WD4mIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIGFyZW5hXyAhPSBvdGhlci5hcmVuYV87CisgIH0KKworICAvLyBUbyBzdXBwb3J0IFZpc3VhbCBTdHVkaW8gMjAwOAorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7CisgICAgLy8gcGFyZW50aGVzZXMgYXJvdW5kIChzdGQ6Oi4uLjptYXgpIHByZXZlbnRzIG1hY3JvIHdhcm5pbmcgb2YgbWF4KCkKKyAgICByZXR1cm4gKHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90eXBlPjo6bWF4KSgpOworICB9CisKKyAgLy8gVG8gc3VwcG9ydCBnY2MtNC40LCB3aGljaCBkb2VzIG5vdCBwcm9wZXJseQorICAvLyBzdXBwb3J0IHRlbXBsYXRlZCBmcmllbmQgY2xhc3NlcworICBBcmVuYSogYXJlbmEoKSBjb25zdCB7IHJldHVybiBhcmVuYV87IH0KKworIHByaXZhdGU6CisgIHVzaW5nIERlc3RydWN0b3JTa2lwcGFibGVfID0gdm9pZDsKKyAgQXJlbmEqIGFyZW5hXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordXNpbmcgS2V5Rm9yVHJlZSA9CisgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzdGQ6OmlzX3NjYWxhcjxUPjo6dmFsdWUsIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IFQ+Pjo6dHlwZTsKKworLy8gRGVmYXVsdCBjYXNlOiBOb3QgdHJhbnNwYXJlbnQuCisvLyBXZSB1c2Ugc3RkOjpoYXNoPGtleV90eXBlPi9zdGQ6Omxlc3M8a2V5X3R5cGU+IGFuZCBhbGwgdGhlIGxvb2t1cCBmdW5jdGlvbnMKKy8vIG9ubHkgYWNjZXB0IGBrZXlfdHlwZWAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUga2V5X3R5cGU+CitzdHJ1Y3QgVHJhbnNwYXJlbnRTdXBwb3J0IHsKKyAgdXNpbmcgaGFzaCA9IHN0ZDo6aGFzaDxrZXlfdHlwZT47CisgIHVzaW5nIGxlc3MgPSBzdGQ6Omxlc3M8a2V5X3R5cGU+OworCisgIHN0YXRpYyBib29sIEVxdWFscyhjb25zdCBrZXlfdHlwZSYgYSwgY29uc3Qga2V5X3R5cGUmIGIpIHsgcmV0dXJuIGEgPT0gYjsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLPgorICB1c2luZyBrZXlfYXJnID0ga2V5X3R5cGU7Cit9OworCisjaWYgZGVmaW5lZChfX2NwcF9saWJfc3RyaW5nX3ZpZXcpCisvLyBJZiBzdGQ6OnN0cmluZ192aWV3IGlzIGF2YWlsYWJsZSwgd2UgYWRkIHRyYW5zcGFyZW50IHN1cHBvcnQgZm9yIHN0ZDo6c3RyaW5nCisvLyBrZXlzLiBXZSB1c2Ugc3RkOjpoYXNoPHN0ZDo6c3RyaW5nX3ZpZXc+IGFzIGl0IHN1cHBvcnRzIHRoZSBpbnB1dCB0eXBlcyB3ZQorLy8gY2FyZSBhYm91dC4gVGhlIGxvb2t1cCBmdW5jdGlvbnMgYWNjZXB0IGFyYml0cmFyeSBgS2AuIFRoaXMgd2lsbCBpbmNsdWRlIGFueQorLy8ga2V5IHR5cGUgdGhhdCBpcyBjb252ZXJ0aWJsZSB0byBzdGQ6OnN0cmluZ192aWV3LgordGVtcGxhdGUgPD4KK3N0cnVjdCBUcmFuc3BhcmVudFN1cHBvcnQ8c3RkOjpzdHJpbmc+IHsKKyAgc3RhdGljIHN0ZDo6c3RyaW5nX3ZpZXcgSW1wbGljaXRDb252ZXJ0KHN0ZDo6c3RyaW5nX3ZpZXcgc3RyKSB7IHJldHVybiBzdHI7IH0KKyAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbm90IGNvbnZlcnRpYmxlIHRvIHN0ZDo6c3RyaW5nX3ZpZXcsIHRyeSB0byBjb252ZXJ0IHRvCisgIC8vIHN0ZDo6c3RyaW5nIGZpcnN0LgorICAvLyBUaGUgdGVtcGxhdGUgbWFrZXMgdGhpcyBvdmVybG9hZCBsb3NlIHJlc29sdXRpb24gd2hlbiBib3RoIGhhdmUgdGhlIHNhbWUKKyAgLy8gcmFuayBvdGhlcndpc2UuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSA9IHZvaWQ+CisgIHN0YXRpYyBzdGQ6OnN0cmluZ192aWV3IEltcGxpY2l0Q29udmVydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIHN0cnVjdCBoYXNoIDogcHJpdmF0ZSBzdGQ6Omhhc2g8c3RkOjpzdHJpbmdfdmlldz4geworICAgIHVzaW5nIGlzX3RyYW5zcGFyZW50ID0gdm9pZDsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IFQmIHN0cikgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2UoKShJbXBsaWNpdENvbnZlcnQoc3RyKSk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6aGFzaDxzdGQ6OnN0cmluZ192aWV3PiYgYmFzZSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisgIH07CisgIHN0cnVjdCBsZXNzIHsKKyAgICB1c2luZyBpc190cmFuc3BhcmVudCA9IHZvaWQ7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCYgdCwgY29uc3QgVSYgdSkgY29uc3QgeworICAgICAgcmV0dXJuIEltcGxpY2l0Q29udmVydCh0KSA8IEltcGxpY2l0Q29udmVydCh1KTsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CisgIHN0YXRpYyBib29sIEVxdWFscyhjb25zdCBUJiB0LCBjb25zdCBVJiB1KSB7CisgICAgcmV0dXJuIEltcGxpY2l0Q29udmVydCh0KSA9PSBJbXBsaWNpdENvbnZlcnQodSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSz4KKyAgdXNpbmcga2V5X2FyZyA9IEs7Cit9OworI2VuZGlmICAvLyBkZWZpbmVkKF9fY3BwX2xpYl9zdHJpbmdfdmlldykKKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KK3VzaW5nIFRyZWVGb3JNYXAgPQorICAgIHN0ZDo6bWFwPEtleUZvclRyZWU8S2V5Piwgdm9pZCosIHR5cGVuYW1lIFRyYW5zcGFyZW50U3VwcG9ydDxLZXk+OjpsZXNzLAorICAgICAgICAgICAgIE1hcEFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgS2V5Rm9yVHJlZTxLZXk+LCB2b2lkKj4+PjsKKworaW5saW5lIGJvb2wgVGFibGVFbnRyeUlzRW1wdHkodm9pZCogY29uc3QqIHRhYmxlLCBzaXplX3QgYikgeworICByZXR1cm4gdGFibGVbYl0gPT0gbnVsbHB0cjsKK30KK2lubGluZSBib29sIFRhYmxlRW50cnlJc05vbkVtcHR5TGlzdCh2b2lkKiBjb25zdCogdGFibGUsIHNpemVfdCBiKSB7CisgIHJldHVybiB0YWJsZVtiXSAhPSBudWxscHRyICYmIHRhYmxlW2JdICE9IHRhYmxlW2IgXiAxXTsKK30KK2lubGluZSBib29sIFRhYmxlRW50cnlJc1RyZWUodm9pZCogY29uc3QqIHRhYmxlLCBzaXplX3QgYikgeworICByZXR1cm4gIVRhYmxlRW50cnlJc0VtcHR5KHRhYmxlLCBiKSAmJiAhVGFibGVFbnRyeUlzTm9uRW1wdHlMaXN0KHRhYmxlLCBiKTsKK30KK2lubGluZSBib29sIFRhYmxlRW50cnlJc0xpc3Qodm9pZCogY29uc3QqIHRhYmxlLCBzaXplX3QgYikgeworICByZXR1cm4gIVRhYmxlRW50cnlJc1RyZWUodGFibGUsIGIpOworfQorCisvLyBUaGlzIGNhcHR1cmVzIGFsbCBudW1lcmljIHR5cGVzLgoraW5saW5lIHNpemVfdCBNYXBWYWx1ZVNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKGJvb2wpIHsgcmV0dXJuIDA7IH0KK2lubGluZSBzaXplX3QgTWFwVmFsdWVTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiBTdHJpbmdTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZyhzdHIpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIFQsCisgICAgICAgICAgdHlwZW5hbWUgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8Y29uc3QgVCY+KCkuU3BhY2VVc2VkTG9uZygpKT4KK3NpemVfdCBNYXBWYWx1ZVNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKGNvbnN0IFQmIG1lc3NhZ2UpIHsKKyAgcmV0dXJuIG1lc3NhZ2UuU3BhY2VVc2VkTG9uZygpIC0gc2l6ZW9mKFQpOworfQorCitjb25zdGV4cHIgc2l6ZV90IGtHbG9iYWxFbXB0eVRhYmxlU2l6ZSA9IDE7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIHZvaWQqIGNvbnN0IGtHbG9iYWxFbXB0eVRhYmxlW2tHbG9iYWxFbXB0eVRhYmxlU2l6ZV07CisKKy8vIFNwYWNlIHVzZWQgZm9yIHRoZSB0YWJsZSwgdHJlZXMsIGFuZCBub2Rlcy4KKy8vIERvZXMgbm90IGluY2x1ZGUgdGhlIGluZGlyZWN0IHNwYWNlIHVzZWQuIEVnIHRoZSBkYXRhIG9mIGEgc3RkOjpzdHJpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5PgorUFJPVE9CVUZfTk9JTkxJTkUgc2l6ZV90IFNwYWNlVXNlZEluVGFibGUodm9pZCoqIHRhYmxlLCBzaXplX3QgbnVtX2J1Y2tldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9ub2RlKSB7CisgIHNpemVfdCBzaXplID0gMDsKKyAgLy8gVGhlIHNpemUgb2YgdGhlIHRhYmxlLgorICBzaXplICs9IHNpemVvZih2b2lkKikgKiBudW1fYnVja2V0czsKKyAgLy8gQWxsIHRoZSBub2Rlcy4KKyAgc2l6ZSArPSBzaXplb2Zfbm9kZSAqIG51bV9lbGVtZW50czsKKyAgLy8gRm9yIGVhY2ggdHJlZSwgY291bnQgdGhlIG92ZXJoZWFkIG9mIHRoZSB0aG9zZSBub2Rlcy4KKyAgLy8gVHdvIGJ1Y2tldHMgYXQgYSB0aW1lIGJlY2F1c2Ugd2Ugb25seSBjYXJlIGFib3V0IHRyZWVzLgorICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bV9idWNrZXRzOyBiICs9IDIpIHsKKyAgICBpZiAoaW50ZXJuYWw6OlRhYmxlRW50cnlJc1RyZWUodGFibGUsIGIpKSB7CisgICAgICB1c2luZyBUcmVlID0gVHJlZUZvck1hcDxLZXk+OworICAgICAgVHJlZSogdHJlZSA9IHN0YXRpY19jYXN0PFRyZWUqPih0YWJsZVtiXSk7CisgICAgICAvLyBFc3RpbWF0ZWQgY29zdCBvZiB0aGUgcmVkLWJsYWNrIHRyZWUgbm9kZXMsIDMgcG9pbnRlcnMgcGx1cyBhCisgICAgICAvLyBib29sIChwbHVzIGFsaWdubWVudCwgc28gNCBwb2ludGVycykuCisgICAgICBzaXplICs9IHRyZWUtPnNpemUoKSAqCisgICAgICAgICAgICAgIChzaXplb2YodHlwZW5hbWUgVHJlZTo6dmFsdWVfdHlwZSkgKyBzaXplb2Yodm9pZCopICogNCk7CisgICAgfQorICB9CisgIHJldHVybiBzaXplOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWFwLAorICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICFzdGQ6OmlzX3NjYWxhcjx0eXBlbmFtZSBNYXA6OmtleV90eXBlPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgIXN0ZDo6aXNfc2NhbGFyPHR5cGVuYW1lIE1hcDo6bWFwcGVkX3R5cGU+Ojp2YWx1ZT46OnR5cGU+CitzaXplX3QgU3BhY2VVc2VkSW5WYWx1ZXMoY29uc3QgTWFwKiBtYXApIHsKKyAgc2l6ZV90IHNpemUgPSAwOworICBmb3IgKGNvbnN0IGF1dG8mIHYgOiAqbWFwKSB7CisgICAgc2l6ZSArPSBpbnRlcm5hbDo6TWFwVmFsdWVTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZyh2LmZpcnN0KSArCisgICAgICAgICAgICBpbnRlcm5hbDo6TWFwVmFsdWVTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZyh2LnNlY29uZCk7CisgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKK2lubGluZSBzaXplX3QgU3BhY2VVc2VkSW5WYWx1ZXMoY29uc3Qgdm9pZCopIHsgcmV0dXJuIDA7IH0KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFRoaXMgaXMgdGhlIGNsYXNzIGZvciBNYXAncyBpbnRlcm5hbCB2YWx1ZV90eXBlLiBJbnN0ZWFkIG9mIHVzaW5nCisvLyBzdGQ6OnBhaXIgYXMgdmFsdWVfdHlwZSwgd2UgdXNlIHRoaXMgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgdXMgbW9yZSBjb250cm9sIG9mCisvLyBpdHMgcHJvY2VzcyBvZiBjb25zdHJ1Y3Rpb24gYW5kIGRlc3RydWN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVD4KK3N0cnVjdCBQUk9UT0JVRl9BVFRSSUJVVEVfU1RBTkRBTE9ORV9ERUJVRyBNYXBQYWlyIHsKKyAgdXNpbmcgZmlyc3RfdHlwZSA9IGNvbnN0IEtleTsKKyAgdXNpbmcgc2Vjb25kX3R5cGUgPSBUOworCisgIE1hcFBhaXIoY29uc3QgS2V5JiBvdGhlcl9maXJzdCwgY29uc3QgVCYgb3RoZXJfc2Vjb25kKQorICAgICAgOiBmaXJzdChvdGhlcl9maXJzdCksIHNlY29uZChvdGhlcl9zZWNvbmQpIHt9CisgIGV4cGxpY2l0IE1hcFBhaXIoY29uc3QgS2V5JiBvdGhlcl9maXJzdCkgOiBmaXJzdChvdGhlcl9maXJzdCksIHNlY29uZCgpIHt9CisgIGV4cGxpY2l0IE1hcFBhaXIoS2V5JiYgb3RoZXJfZmlyc3QpCisgICAgICA6IGZpcnN0KHN0ZDo6bW92ZShvdGhlcl9maXJzdCkpLCBzZWNvbmQoKSB7fQorICBNYXBQYWlyKGNvbnN0IE1hcFBhaXImIG90aGVyKSA6IGZpcnN0KG90aGVyLmZpcnN0KSwgc2Vjb25kKG90aGVyLnNlY29uZCkge30KKworICB+TWFwUGFpcigpIHt9CisKKyAgLy8gSW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBzdGQ6OnBhaXIgb2YgY29tcGF0aWJsZSB0eXBlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgb3BlcmF0b3Igc3RkOjpwYWlyPFQxLCBUMj4oKSBjb25zdCB7ICAvLyBOT0xJTlQocnVudGltZS9leHBsaWNpdCkKKyAgICByZXR1cm4gc3RkOjpwYWlyPFQxLCBUMj4oZmlyc3QsIHNlY29uZCk7CisgIH0KKworICBjb25zdCBLZXkgZmlyc3Q7CisgIFQgc2Vjb25kOworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEFyZW5hOworICBmcmllbmQgY2xhc3MgTWFwPEtleSwgVD47Cit9OworCisvLyBNYXAgaXMgYW4gYXNzb2NpYXRpdmUgY29udGFpbmVyIHR5cGUgdXNlZCB0byBzdG9yZSBwcm90b2J1ZiBtYXAKKy8vIGZpZWxkcy4gIEVhY2ggTWFwIGluc3RhbmNlIG1heSBvciBtYXkgbm90IHVzZSBhIGRpZmZlcmVudCBoYXNoIGZ1bmN0aW9uLCBhCisvLyBkaWZmZXJlbnQgaXRlcmF0aW9uIG9yZGVyLCBhbmQgc28gb24uICBFLmcuLCBwbGVhc2UgZG9uJ3QgZXhhbWluZQorLy8gaW1wbGVtZW50YXRpb24gZGV0YWlscyB0byBkZWNpZGUgaWYgdGhlIGZvbGxvd2luZyB3b3VsZCB3b3JrOgorLy8gIE1hcDxpbnQsIGludD4gbTAsIG0xOworLy8gIG0wWzBdID0gbTFbMF0gPSBtMFsxXSA9IG0xWzFdID0gMDsKKy8vICBhc3NlcnQobTAuYmVnaW4oKS0+Zmlyc3QgPT0gbTEuYmVnaW4oKS0+Zmlyc3QpOyAgLy8gQnVnIQorLy8KKy8vIE1hcCdzIGludGVyZmFjZSBpcyBzaW1pbGFyIHRvIHN0ZDo6dW5vcmRlcmVkX21hcCwgZXhjZXB0IHRoYXQgTWFwIGlzIG5vdAorLy8gZGVzaWduZWQgdG8gcGxheSB3ZWxsIHdpdGggZXhjZXB0aW9ucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQ+CitjbGFzcyBNYXAgeworIHB1YmxpYzoKKyAgdXNpbmcga2V5X3R5cGUgPSBLZXk7CisgIHVzaW5nIG1hcHBlZF90eXBlID0gVDsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IE1hcFBhaXI8S2V5LCBUPjsKKworICB1c2luZyBwb2ludGVyID0gdmFsdWVfdHlwZSo7CisgIHVzaW5nIGNvbnN0X3BvaW50ZXIgPSBjb25zdCB2YWx1ZV90eXBlKjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gdmFsdWVfdHlwZSY7CisgIHVzaW5nIGNvbnN0X3JlZmVyZW5jZSA9IGNvbnN0IHZhbHVlX3R5cGUmOworCisgIHVzaW5nIHNpemVfdHlwZSA9IHNpemVfdDsKKyAgdXNpbmcgaGFzaGVyID0gdHlwZW5hbWUgaW50ZXJuYWw6OlRyYW5zcGFyZW50U3VwcG9ydDxLZXk+OjpoYXNoOworCisgIGNvbnN0ZXhwciBNYXAoKSA6IGVsZW1lbnRzXyhudWxscHRyKSB7fQorICBleHBsaWNpdCBNYXAoQXJlbmEqIGFyZW5hKSA6IGVsZW1lbnRzXyhhcmVuYSkge30KKworICBNYXAoY29uc3QgTWFwJiBvdGhlcikgOiBNYXAoKSB7IGluc2VydChvdGhlci5iZWdpbigpLCBvdGhlci5lbmQoKSk7IH0KKworICBNYXAoTWFwJiYgb3RoZXIpIG5vZXhjZXB0IDogTWFwKCkgeworICAgIGlmIChvdGhlci5hcmVuYSgpICE9IG51bGxwdHIpIHsKKyAgICAgICp0aGlzID0gb3RoZXI7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3YXAob3RoZXIpOworICAgIH0KKyAgfQorCisgIE1hcCYgb3BlcmF0b3I9KE1hcCYmIG90aGVyKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgIT0gJm90aGVyKSB7CisgICAgICBpZiAoYXJlbmEoKSAhPSBvdGhlci5hcmVuYSgpKSB7CisgICAgICAgICp0aGlzID0gb3RoZXI7CisgICAgICB9IGVsc2UgeworICAgICAgICBzd2FwKG90aGVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXQ+CisgIE1hcChjb25zdCBJbnB1dEl0JiBmaXJzdCwgY29uc3QgSW5wdXRJdCYgbGFzdCkgOiBNYXAoKSB7CisgICAgaW5zZXJ0KGZpcnN0LCBsYXN0KTsKKyAgfQorCisgIH5NYXAoKSB7fQorCisgcHJpdmF0ZToKKyAgdXNpbmcgQWxsb2NhdG9yID0gaW50ZXJuYWw6Ok1hcEFsbG9jYXRvcjx2b2lkKj47CisKKyAgLy8gSW5uZXJNYXAgaXMgYSBnZW5lcmljIGhhc2gtYmFzZWQgbWFwLiAgSXQgZG9lc24ndCBjb250YWluIGFueQorICAvLyBwcm90b2NvbC1idWZmZXItc3BlY2lmaWMgbG9naWMuICBJdCBpcyBhIGNoYWluaW5nIGhhc2ggbWFwIHdpdGggdGhlCisgIC8vIGFkZGl0aW9uYWwgZmVhdHVyZSB0aGF0IHNvbWUgYnVja2V0cyBjYW4gYmUgY29udmVydGVkIHRvIHVzZSBhbiBvcmRlcmVkCisgIC8vIGNvbnRhaW5lci4gIFRoaXMgZW5zdXJlcyBPKGxnIG4pIGJvdW5kcyBvbiBmaW5kLCBpbnNlcnQsIGFuZCBlcmFzZSwgd2hpbGUKKyAgLy8gYXZvaWRpbmcgdGhlIG92ZXJoZWFkcyBvZiBvcmRlcmVkIGNvbnRhaW5lcnMgbW9zdCBvZiB0aGUgdGltZS4KKyAgLy8KKyAgLy8gVGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgbmVlZCB0aGUgZnVsbCBnZW5lcmFsaXR5IG9mIHVub3JkZXJlZF9tYXAsCisgIC8vIGFuZCBpdCBkb2Vzbid0IGhhdmUgaXQuICBNb3JlIGJlbGxzIGFuZCB3aGlzdGxlcyBjYW4gYmUgYWRkZWQgYXMgbmVlZGVkLgorICAvLyBTb21lIGltcGxlbWVudGF0aW9uIGRldGFpbHM6CisgIC8vIDEuIFRoZSBoYXNoIGZ1bmN0aW9uIGhhcyB0eXBlIGhhc2hlciBhbmQgdGhlIGVxdWFsaXR5IGZ1bmN0aW9uCisgIC8vICAgIGVxdWFsX3RvPEtleT4uICBXZSBpbmhlcml0IGZyb20gaGFzaGVyIHRvIHNhdmUgc3BhY2UKKyAgLy8gICAgKGVtcHR5LWJhc2UtY2xhc3Mgb3B0aW1pemF0aW9uKS4KKyAgLy8gMi4gVGhlIG51bWJlciBvZiBidWNrZXRzIGlzIGEgcG93ZXIgb2YgdHdvLgorICAvLyAzLiBCdWNrZXRzIGFyZSBjb252ZXJ0ZWQgdG8gdHJlZXMgaW4gcGFpcnM6IGlmIHdlIGNvbnZlcnQgYnVja2V0IGIgdGhlbgorICAvLyAgICBidWNrZXRzIGIgYW5kIGJeMSB3aWxsIHNoYXJlIGEgdHJlZS4gIEludmFyaWFudDogYnVja2V0cyBiIGFuZCBiXjEgaGF2ZQorICAvLyAgICB0aGUgc2FtZSBub24tbnVsbCB2YWx1ZSBpZmYgdGhleSBhcmUgc2hhcmluZyBhIHRyZWUuICAoQW4gYWx0ZXJuYXRpdmUKKyAgLy8gICAgaW1wbGVtZW50YXRpb24gc3RyYXRlZ3kgd291bGQgYmUgdG8gaGF2ZSBhIHRhZyBiaXQgcGVyIGJ1Y2tldC4pCisgIC8vIDQuIEFzIGlzIHR5cGljYWwgZm9yIGhhc2hfbWFwIGFuZCBzdWNoLCB0aGUgS2V5cyBhbmQgVmFsdWVzIGFyZSBhbHdheXMKKyAgLy8gICAgc3RvcmVkIGluIGxpbmtlZCBsaXN0IG5vZGVzLiAgUG9pbnRlcnMgdG8gZWxlbWVudHMgYXJlIG5ldmVyIGludmFsaWRhdGVkCisgIC8vICAgIHVudGlsIHRoZSBlbGVtZW50IGlzIGRlbGV0ZWQuCisgIC8vIDUuIFRoZSB0cmVlcycgcGF5bG9hZCB0eXBlIGlzIHBvaW50ZXIgdG8gbGlua2VkLWxpc3Qgbm9kZS4gIFRyZWUtY29udmVydGluZworICAvLyAgICBhIGJ1Y2tldCBkb2Vzbid0IGNvcHkgS2V5LVZhbHVlIHBhaXJzLgorICAvLyA2LiBPbmNlIHdlJ3ZlIHRyZWUtY29udmVydGVkIGEgYnVja2V0LCBpdCBpcyBuZXZlciBjb252ZXJ0ZWQgYmFjay4gSG93ZXZlciwKKyAgLy8gICAgdGhlIGl0ZW1zIGEgdHJlZSBjb250YWlucyBtYXkgd2luZCB1cCBhc3NpZ25lZCB0byB0cmVlcyBvciBsaXN0cyB1cG9uIGEKKyAgLy8gICAgcmVoYXNoLgorICAvLyA3LiBUaGUgY29kZSByZXF1aXJlcyBubyBDKysgZmVhdHVyZXMgZnJvbSBDKysxNCBvciBsYXRlci4KKyAgLy8gOC4gTXV0YXRpb25zIHRvIGEgbWFwIGRvIG5vdCBpbnZhbGlkYXRlIHRoZSBtYXAncyBpdGVyYXRvcnMsIHBvaW50ZXJzIHRvCisgIC8vICAgIGVsZW1lbnRzLCBvciByZWZlcmVuY2VzIHRvIGVsZW1lbnRzLgorICAvLyA5LiBFeGNlcHQgZm9yIGVyYXNlKGl0ZXJhdG9yKSwgYW55IG5vbi1jb25zdCBtZXRob2QgY2FuIHJlb3JkZXIgaXRlcmF0b3JzLgorICAvLyAxMC4gSW5uZXJNYXAgdXNlcyBLZXlGb3JUcmVlPEtleT4gd2hlbiB1c2luZyB0aGUgVHJlZSByZXByZXNlbnRhdGlvbiwgd2hpY2gKKyAgLy8gICAgaXMgZWl0aGVyIGBLZXlgLCBpZiBLZXkgaXMgYSBzY2FsYXIsIG9yIGByZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBLZXk+YAorICAvLyAgICBvdGhlcndpc2UuIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJ5IGNvcGllcyBvZiBzdHJpbmcga2V5cywgZm9yIGV4YW1wbGUuCisgIGNsYXNzIElubmVyTWFwIDogcHJpdmF0ZSBoYXNoZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IGNvbnN0ZXhwciBJbm5lck1hcChBcmVuYSogYXJlbmEpCisgICAgICAgIDogaGFzaGVyKCksCisgICAgICAgICAgbnVtX2VsZW1lbnRzXygwKSwKKyAgICAgICAgICBudW1fYnVja2V0c18oaW50ZXJuYWw6OmtHbG9iYWxFbXB0eVRhYmxlU2l6ZSksCisgICAgICAgICAgc2VlZF8oMCksCisgICAgICAgICAgaW5kZXhfb2ZfZmlyc3Rfbm9uX251bGxfKGludGVybmFsOjprR2xvYmFsRW1wdHlUYWJsZVNpemUpLAorICAgICAgICAgIHRhYmxlXyhjb25zdF9jYXN0PHZvaWQqKj4oaW50ZXJuYWw6OmtHbG9iYWxFbXB0eVRhYmxlKSksCisgICAgICAgICAgYWxsb2NfKGFyZW5hKSB7fQorCisgICAgfklubmVyTWFwKCkgeworICAgICAgaWYgKGFsbG9jXy5hcmVuYSgpID09IG51bGxwdHIgJiYKKyAgICAgICAgICBudW1fYnVja2V0c18gIT0gaW50ZXJuYWw6OmtHbG9iYWxFbXB0eVRhYmxlU2l6ZSkgeworICAgICAgICBjbGVhcigpOworICAgICAgICBEZWFsbG9jPHZvaWQqPih0YWJsZV8sIG51bV9idWNrZXRzXyk7CisgICAgICB9CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGVudW0geyBrTWluVGFibGVTaXplID0gOCB9OworCisgICAgLy8gTGlua2VkLWxpc3Qgbm9kZXMsIGFzIG9uZSB3b3VsZCBleHBlY3QgZm9yIGEgY2hhaW5pbmcgaGFzaCB0YWJsZS4KKyAgICBzdHJ1Y3QgTm9kZSB7CisgICAgICB2YWx1ZV90eXBlIGt2OworICAgICAgTm9kZSogbmV4dDsKKyAgICB9OworCisgICAgLy8gVHJlZXMuIFRoZSBwYXlsb2FkIHR5cGUgaXMgYSBjb3B5IG9mIEtleSwgc28gdGhhdCB3ZSBjYW4gcXVlcnkgdGhlIHRyZWUKKyAgICAvLyB3aXRoIEtleXMgdGhhdCBhcmUgbm90IGluIGFueSBwYXJ0aWN1bGFyIGRhdGEgc3RydWN0dXJlLgorICAgIC8vIFRoZSB2YWx1ZSBpcyBhIHZvaWQqIHBvaW50aW5nIHRvIE5vZGUuIFdlIHVzZSB2b2lkKiBpbnN0ZWFkIG9mIE5vZGUqIHRvCisgICAgLy8gYXZvaWQgY29kZSBibG9hdC4gVGhhdCB3YXkgdGhlcmUgaXMgb25seSBvbmUgaW5zdGFudGlhdGlvbiBvZiB0aGUgdHJlZQorICAgIC8vIGNsYXNzIHBlciBrZXkgdHlwZS4KKyAgICB1c2luZyBUcmVlID0gaW50ZXJuYWw6OlRyZWVGb3JNYXA8S2V5PjsKKyAgICB1c2luZyBUcmVlSXRlcmF0b3IgPSB0eXBlbmFtZSBUcmVlOjppdGVyYXRvcjsKKworICAgIHN0YXRpYyBOb2RlKiBOb2RlRnJvbVRyZWVJdGVyYXRvcihUcmVlSXRlcmF0b3IgaXQpIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxOb2RlKj4oaXQtPnNlY29uZCk7CisgICAgfQorCisgICAgLy8gaXRlcmF0b3IgYW5kIGNvbnN0X2l0ZXJhdG9yIGFyZSBpbnN0YW50aWF0aW9ucyBvZiBpdGVyYXRvcl9iYXNlLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXlWYWx1ZVR5cGU+CisgICAgY2xhc3MgaXRlcmF0b3JfYmFzZSB7CisgICAgIHB1YmxpYzoKKyAgICAgIHVzaW5nIHJlZmVyZW5jZSA9IEtleVZhbHVlVHlwZSY7CisgICAgICB1c2luZyBwb2ludGVyID0gS2V5VmFsdWVUeXBlKjsKKworICAgICAgLy8gSW52YXJpYW50czoKKyAgICAgIC8vIG5vZGVfIGlzIGFsd2F5cyBjb3JyZWN0LiBUaGlzIGlzIGhhbmR5IGJlY2F1c2UgdGhlIG1vc3QgY29tbW9uCisgICAgICAvLyBvcGVyYXRpb25zIGFyZSBvcGVyYXRvciogYW5kIG9wZXJhdG9yLT4gYW5kIHRoZXkgb25seSB1c2Ugbm9kZV8uCisgICAgICAvLyBXaGVuIG5vZGVfIGlzIHNldCB0byBhIG5vbi1udWxsIHZhbHVlLCBhbGwgdGhlIG90aGVyIG5vbi1jb25zdCBmaWVsZHMKKyAgICAgIC8vIGFyZSB1cGRhdGVkIHRvIGJlIGNvcnJlY3QgYWxzbywgYnV0IHRob3NlIGZpZWxkcyBjYW4gYmVjb21lIHN0YWxlCisgICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyBtYXAgaXMgbW9kaWZpZWQuICBXaGVuIHRob3NlIGZpZWxkcyBhcmUgbmVlZGVkIHRoZXkKKyAgICAgIC8vIGFyZSByZWNoZWNrZWQsIGFuZCB1cGRhdGVkIGlmIG5lY2Vzc2FyeS4KKyAgICAgIGl0ZXJhdG9yX2Jhc2UoKSA6IG5vZGVfKG51bGxwdHIpLCBtXyhudWxscHRyKSwgYnVja2V0X2luZGV4XygwKSB7fQorCisgICAgICBleHBsaWNpdCBpdGVyYXRvcl9iYXNlKGNvbnN0IElubmVyTWFwKiBtKSA6IG1fKG0pIHsKKyAgICAgICAgU2VhcmNoRnJvbShtLT5pbmRleF9vZl9maXJzdF9ub25fbnVsbF8pOworICAgICAgfQorCisgICAgICAvLyBBbnkgaXRlcmF0b3JfYmFzZSBjYW4gY29udmVydCB0byBhbnkgb3RoZXIuICBUaGlzIGlzIG92ZXJraWxsLCBhbmQgd2UKKyAgICAgIC8vIHJlbHkgb24gdGhlIGVuY2xvc2luZyBjbGFzcyB0byB1c2UgaXQgd2lzZWx5LiAgVGhlIHN0YW5kYXJkICJpdGVyYXRvcgorICAgICAgLy8gY2FuIGNvbnZlcnQgdG8gY29uc3RfaXRlcmF0b3IiIGlzIE9LIGJ1dCB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24gaXMgbm90LgorICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgICAgICBleHBsaWNpdCBpdGVyYXRvcl9iYXNlKGNvbnN0IGl0ZXJhdG9yX2Jhc2U8VT4mIGl0KQorICAgICAgICAgIDogbm9kZV8oaXQubm9kZV8pLCBtXyhpdC5tXyksIGJ1Y2tldF9pbmRleF8oaXQuYnVja2V0X2luZGV4Xykge30KKworICAgICAgaXRlcmF0b3JfYmFzZShOb2RlKiBuLCBjb25zdCBJbm5lck1hcCogbSwgc2l6ZV90eXBlIGluZGV4KQorICAgICAgICAgIDogbm9kZV8obiksIG1fKG0pLCBidWNrZXRfaW5kZXhfKGluZGV4KSB7fQorCisgICAgICBpdGVyYXRvcl9iYXNlKFRyZWVJdGVyYXRvciB0cmVlX2l0LCBjb25zdCBJbm5lck1hcCogbSwgc2l6ZV90eXBlIGluZGV4KQorICAgICAgICAgIDogbm9kZV8oTm9kZUZyb21UcmVlSXRlcmF0b3IodHJlZV9pdCkpLCBtXyhtKSwgYnVja2V0X2luZGV4XyhpbmRleCkgeworICAgICAgICAvLyBJbnZhcmlhbnQ6IGl0ZXJhdG9ycyB0aGF0IHVzZSBidWNrZXRzIHdpdGggdHJlZXMgaGF2ZSBhbiBldmVuCisgICAgICAgIC8vIGJ1Y2tldF9pbmRleF8uCisgICAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEoYnVja2V0X2luZGV4XyAlIDIsIDB1KTsKKyAgICAgIH0KKworICAgICAgLy8gQWR2YW5jZSB0aHJvdWdoIGJ1Y2tldHMsIGxvb2tpbmcgZm9yIHRoZSBmaXJzdCB0aGF0IGlzbid0IGVtcHR5LgorICAgICAgLy8gSWYgbm90aGluZyBub24tZW1wdHkgaXMgZm91bmQgdGhlbiBsZWF2ZSBub2RlXyA9PSBudWxscHRyLgorICAgICAgdm9pZCBTZWFyY2hGcm9tKHNpemVfdHlwZSBzdGFydF9idWNrZXQpIHsKKyAgICAgICAgR09PR0xFX0RDSEVDSyhtXy0+aW5kZXhfb2ZfZmlyc3Rfbm9uX251bGxfID09IG1fLT5udW1fYnVja2V0c18gfHwKKyAgICAgICAgICAgICAgIG1fLT50YWJsZV9bbV8tPmluZGV4X29mX2ZpcnN0X25vbl9udWxsX10gIT0gbnVsbHB0cik7CisgICAgICAgIG5vZGVfID0gbnVsbHB0cjsKKyAgICAgICAgZm9yIChidWNrZXRfaW5kZXhfID0gc3RhcnRfYnVja2V0OyBidWNrZXRfaW5kZXhfIDwgbV8tPm51bV9idWNrZXRzXzsKKyAgICAgICAgICAgICBidWNrZXRfaW5kZXhfKyspIHsKKyAgICAgICAgICBpZiAobV8tPlRhYmxlRW50cnlJc05vbkVtcHR5TGlzdChidWNrZXRfaW5kZXhfKSkgeworICAgICAgICAgICAgbm9kZV8gPSBzdGF0aWNfY2FzdDxOb2RlKj4obV8tPnRhYmxlX1tidWNrZXRfaW5kZXhfXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgaWYgKG1fLT5UYWJsZUVudHJ5SXNUcmVlKGJ1Y2tldF9pbmRleF8pKSB7CisgICAgICAgICAgICBUcmVlKiB0cmVlID0gc3RhdGljX2Nhc3Q8VHJlZSo+KG1fLT50YWJsZV9bYnVja2V0X2luZGV4X10pOworICAgICAgICAgICAgR09PR0xFX0RDSEVDSyghdHJlZS0+ZW1wdHkoKSk7CisgICAgICAgICAgICBub2RlXyA9IE5vZGVGcm9tVHJlZUl0ZXJhdG9yKHRyZWUtPmJlZ2luKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBub2RlXy0+a3Y7IH0KKyAgICAgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYob3BlcmF0b3IqKCkpOyB9CisKKyAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3JfYmFzZSYgYSwgY29uc3QgaXRlcmF0b3JfYmFzZSYgYikgeworICAgICAgICByZXR1cm4gYS5ub2RlXyA9PSBiLm5vZGVfOworICAgICAgfQorICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvcl9iYXNlJiBhLCBjb25zdCBpdGVyYXRvcl9iYXNlJiBiKSB7CisgICAgICAgIHJldHVybiBhLm5vZGVfICE9IGIubm9kZV87CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yX2Jhc2UmIG9wZXJhdG9yKysoKSB7CisgICAgICAgIGlmIChub2RlXy0+bmV4dCA9PSBudWxscHRyKSB7CisgICAgICAgICAgVHJlZUl0ZXJhdG9yIHRyZWVfaXQ7CisgICAgICAgICAgY29uc3QgYm9vbCBpc19saXN0ID0gcmV2YWxpZGF0ZV9pZl9uZWNlc3NhcnkoJnRyZWVfaXQpOworICAgICAgICAgIGlmIChpc19saXN0KSB7CisgICAgICAgICAgICBTZWFyY2hGcm9tKGJ1Y2tldF9pbmRleF8gKyAxKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR09PR0xFX0RDSEVDS19FUShidWNrZXRfaW5kZXhfICYgMSwgMHUpOworICAgICAgICAgICAgVHJlZSogdHJlZSA9IHN0YXRpY19jYXN0PFRyZWUqPihtXy0+dGFibGVfW2J1Y2tldF9pbmRleF9dKTsKKyAgICAgICAgICAgIGlmICgrK3RyZWVfaXQgPT0gdHJlZS0+ZW5kKCkpIHsKKyAgICAgICAgICAgICAgU2VhcmNoRnJvbShidWNrZXRfaW5kZXhfICsgMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBub2RlXyA9IE5vZGVGcm9tVHJlZUl0ZXJhdG9yKHRyZWVfaXQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBub2RlXyA9IG5vZGVfLT5uZXh0OworICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3JfYmFzZSBvcGVyYXRvcisrKGludCAvKiB1bnVzZWQgKi8pIHsKKyAgICAgICAgaXRlcmF0b3JfYmFzZSB0bXAgPSAqdGhpczsKKyAgICAgICAgKysqdGhpczsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICAgIH0KKworICAgICAgLy8gQXNzdW1lcyBub2RlXyBhbmQgbV8gYXJlIGNvcnJlY3QgYW5kIG5vbi1udWxsLCBidXQgb3RoZXIgZmllbGRzIG1heSBiZQorICAgICAgLy8gc3RhbGUuICBGaXggdGhlbSBhcyBuZWVkZWQuICBUaGVuIHJldHVybiB0cnVlIGlmZiBub2RlXyBwb2ludHMgdG8gYQorICAgICAgLy8gTm9kZSBpbiBhIGxpc3QuICBJZiBmYWxzZSBpcyByZXR1cm5lZCB0aGVuICppdCBpcyBtb2RpZmllZCB0byBiZQorICAgICAgLy8gYSB2YWxpZCBpdGVyYXRvciBmb3Igbm9kZV8uCisgICAgICBib29sIHJldmFsaWRhdGVfaWZfbmVjZXNzYXJ5KFRyZWVJdGVyYXRvciogaXQpIHsKKyAgICAgICAgR09PR0xFX0RDSEVDSyhub2RlXyAhPSBudWxscHRyICYmIG1fICE9IG51bGxwdHIpOworICAgICAgICAvLyBGb3JjZSBidWNrZXRfaW5kZXhfIHRvIGJlIGluIHJhbmdlLgorICAgICAgICBidWNrZXRfaW5kZXhfICY9IChtXy0+bnVtX2J1Y2tldHNfIC0gMSk7CisgICAgICAgIC8vIENvbW1vbiBjYXNlOiB0aGUgYnVja2V0IHdlIHRoaW5rIGlzIHJlbGV2YW50IHBvaW50cyB0byBub2RlXy4KKyAgICAgICAgaWYgKG1fLT50YWJsZV9bYnVja2V0X2luZGV4X10gPT0gc3RhdGljX2Nhc3Q8dm9pZCo+KG5vZGVfKSkgcmV0dXJuIHRydWU7CisgICAgICAgIC8vIExlc3MgY29tbW9uOiB0aGUgYnVja2V0IGlzIGEgbGlua2VkIGxpc3Qgd2l0aCBub2RlXyBzb21ld2hlcmUgaW4gaXQsCisgICAgICAgIC8vIGJ1dCBub3QgYXQgdGhlIGhlYWQuCisgICAgICAgIGlmIChtXy0+VGFibGVFbnRyeUlzTm9uRW1wdHlMaXN0KGJ1Y2tldF9pbmRleF8pKSB7CisgICAgICAgICAgTm9kZSogbCA9IHN0YXRpY19jYXN0PE5vZGUqPihtXy0+dGFibGVfW2J1Y2tldF9pbmRleF9dKTsKKyAgICAgICAgICB3aGlsZSAoKGwgPSBsLT5uZXh0KSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAobCA9PSBub2RlXykgeworICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gV2VsbCwgYnVja2V0X2luZGV4XyBzdGlsbCBtaWdodCBiZSBjb3JyZWN0LCBidXQgcHJvYmFibHkKKyAgICAgICAgLy8gbm90LiAgUmV2YWxpZGF0ZSBqdXN0IHRvIGJlIHN1cmUuICBUaGlzIGNhc2UgaXMgcmFyZSBlbm91Z2ggdGhhdCB3ZQorICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBwb3RlbnRpYWwgb3B0aW1pemF0aW9ucywgc3VjaCBhcyBoYXZpbmcgYSBjdXN0b20KKyAgICAgICAgLy8gZmluZC1saWtlIG1ldGhvZCB0aGF0IGNvbXBhcmVzIE5vZGUqIGluc3RlYWQgb2YgdGhlIGtleS4KKyAgICAgICAgaXRlcmF0b3JfYmFzZSBpKG1fLT5maW5kKG5vZGVfLT5rdi5maXJzdCwgaXQpKTsKKyAgICAgICAgYnVja2V0X2luZGV4XyA9IGkuYnVja2V0X2luZGV4XzsKKyAgICAgICAgcmV0dXJuIG1fLT5UYWJsZUVudHJ5SXNMaXN0KGJ1Y2tldF9pbmRleF8pOworICAgICAgfQorCisgICAgICBOb2RlKiBub2RlXzsKKyAgICAgIGNvbnN0IElubmVyTWFwKiBtXzsKKyAgICAgIHNpemVfdHlwZSBidWNrZXRfaW5kZXhfOworICAgIH07CisKKyAgIHB1YmxpYzoKKyAgICB1c2luZyBpdGVyYXRvciA9IGl0ZXJhdG9yX2Jhc2U8dmFsdWVfdHlwZT47CisgICAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBpdGVyYXRvcl9iYXNlPGNvbnN0IHZhbHVlX3R5cGU+OworCisgICAgQXJlbmEqIGFyZW5hKCkgY29uc3QgeyByZXR1cm4gYWxsb2NfLmFyZW5hKCk7IH0KKworICAgIHZvaWQgU3dhcChJbm5lck1hcCogb3RoZXIpIHsKKyAgICAgIHN0ZDo6c3dhcChudW1fZWxlbWVudHNfLCBvdGhlci0+bnVtX2VsZW1lbnRzXyk7CisgICAgICBzdGQ6OnN3YXAobnVtX2J1Y2tldHNfLCBvdGhlci0+bnVtX2J1Y2tldHNfKTsKKyAgICAgIHN0ZDo6c3dhcChzZWVkXywgb3RoZXItPnNlZWRfKTsKKyAgICAgIHN0ZDo6c3dhcChpbmRleF9vZl9maXJzdF9ub25fbnVsbF8sIG90aGVyLT5pbmRleF9vZl9maXJzdF9ub25fbnVsbF8pOworICAgICAgc3RkOjpzd2FwKHRhYmxlXywgb3RoZXItPnRhYmxlXyk7CisgICAgICBzdGQ6OnN3YXAoYWxsb2NfLCBvdGhlci0+YWxsb2NfKTsKKyAgICB9CisKKyAgICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMpOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoKTsgfQorICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcyk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigpOyB9CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgZm9yIChzaXplX3R5cGUgYiA9IDA7IGIgPCBudW1fYnVja2V0c187IGIrKykgeworICAgICAgICBpZiAoVGFibGVFbnRyeUlzTm9uRW1wdHlMaXN0KGIpKSB7CisgICAgICAgICAgTm9kZSogbm9kZSA9IHN0YXRpY19jYXN0PE5vZGUqPih0YWJsZV9bYl0pOworICAgICAgICAgIHRhYmxlX1tiXSA9IG51bGxwdHI7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgTm9kZSogbmV4dCA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICBEZXN0cm95Tm9kZShub2RlKTsKKyAgICAgICAgICAgIG5vZGUgPSBuZXh0OworICAgICAgICAgIH0gd2hpbGUgKG5vZGUgIT0gbnVsbHB0cik7CisgICAgICAgIH0gZWxzZSBpZiAoVGFibGVFbnRyeUlzVHJlZShiKSkgeworICAgICAgICAgIFRyZWUqIHRyZWUgPSBzdGF0aWNfY2FzdDxUcmVlKj4odGFibGVfW2JdKTsKKyAgICAgICAgICBHT09HTEVfRENIRUNLKHRhYmxlX1tiXSA9PSB0YWJsZV9bYiArIDFdICYmIChiICYgMSkgPT0gMCk7CisgICAgICAgICAgdGFibGVfW2JdID0gdGFibGVfW2IgKyAxXSA9IG51bGxwdHI7CisgICAgICAgICAgdHlwZW5hbWUgVHJlZTo6aXRlcmF0b3IgdHJlZV9pdCA9IHRyZWUtPmJlZ2luKCk7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgTm9kZSogbm9kZSA9IE5vZGVGcm9tVHJlZUl0ZXJhdG9yKHRyZWVfaXQpOworICAgICAgICAgICAgdHlwZW5hbWUgVHJlZTo6aXRlcmF0b3IgbmV4dCA9IHRyZWVfaXQ7CisgICAgICAgICAgICArK25leHQ7CisgICAgICAgICAgICB0cmVlLT5lcmFzZSh0cmVlX2l0KTsKKyAgICAgICAgICAgIERlc3Ryb3lOb2RlKG5vZGUpOworICAgICAgICAgICAgdHJlZV9pdCA9IG5leHQ7CisgICAgICAgICAgfSB3aGlsZSAodHJlZV9pdCAhPSB0cmVlLT5lbmQoKSk7CisgICAgICAgICAgRGVzdHJveVRyZWUodHJlZSk7CisgICAgICAgICAgYisrOworICAgICAgICB9CisgICAgICB9CisgICAgICBudW1fZWxlbWVudHNfID0gMDsKKyAgICAgIGluZGV4X29mX2ZpcnN0X25vbl9udWxsXyA9IG51bV9idWNrZXRzXzsKKyAgICB9CisKKyAgICBjb25zdCBoYXNoZXImIGhhc2hfZnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgc3RhdGljIHNpemVfdHlwZSBtYXhfc2l6ZSgpIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KDEpIDw8IChzaXplb2Yodm9pZCoqKSA+PSA4ID8gNjAgOiAyOCk7CisgICAgfQorICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gbnVtX2VsZW1lbnRzXzsgfQorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEs+CisgICAgaXRlcmF0b3IgZmluZChjb25zdCBLJiBrKSB7CisgICAgICByZXR1cm4gaXRlcmF0b3IoRmluZEhlbHBlcihrKS5maXJzdCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEs+CisgICAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBLJiBrKSBjb25zdCB7CisgICAgICByZXR1cm4gRmluZEhlbHBlcihrKS5maXJzdDsKKyAgICB9CisKKyAgICAvLyBJbnNlcnRzIGEgbmV3IGVsZW1lbnQgaW50byB0aGUgY29udGFpbmVyIGlmIHRoZXJlIGlzIG5vIGVsZW1lbnQgd2l0aCB0aGUKKyAgICAvLyBrZXkgaW4gdGhlIGNvbnRhaW5lci4KKyAgICAvLyBUaGUgbmV3IGVsZW1lbnQgaXM6CisgICAgLy8gICgxKSBDb25zdHJ1Y3RlZCBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBhcmdzLCBpZiBtYXBwZWRfdHlwZSBpcyBub3QKKyAgICAvLyAgICAgIGFyZW5hIGNvbnN0cnVjdGlibGUuCisgICAgLy8gICgyKSBDb25zdHJ1Y3RlZCBpbi1wbGFjZSB3aXRoIHRoZSBhcmVuYSBhbmQgdGhlbiBhc3NpZ25lZCB3aXRoIGEKKyAgICAvLyAgICAgIG1hcHBlZF90eXBlIHRlbXBvcmFyeSBjb25zdHJ1Y3RlZCB3aXRoIHRoZSBnaXZlbiBhcmdzLCBvdGhlcndpc2UuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiB0cnlfZW1wbGFjZShLJiYgaywgQXJncyYmLi4uIGFyZ3MpIHsKKyAgICAgIHJldHVybiBBcmVuYUF3YXJlVHJ5RW1wbGFjZShBcmVuYTo6aXNfYXJlbmFfY29uc3RydWN0YWJsZTxtYXBwZWRfdHlwZT4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8Sz4oayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICB9CisKKyAgICAvLyBJbnNlcnRzIHRoZSBrZXkgaW50byB0aGUgbWFwLCBpZiBub3QgcHJlc2VudC4gSW4gdGhhdCBjYXNlLCB0aGUgdmFsdWUKKyAgICAvLyB3aWxsIGJlIHZhbHVlIGluaXRpYWxpemVkLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLPgorICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KEsmJiBrKSB7CisgICAgICByZXR1cm4gdHJ5X2VtcGxhY2Uoc3RkOjpmb3J3YXJkPEs+KGspKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSz4KKyAgICB2YWx1ZV90eXBlJiBvcGVyYXRvcltdKEsmJiBrKSB7CisgICAgICByZXR1cm4gKnRyeV9lbXBsYWNlKHN0ZDo6Zm9yd2FyZDxLPihrKSkuZmlyc3Q7CisgICAgfQorCisgICAgdm9pZCBlcmFzZShpdGVyYXRvciBpdCkgeworICAgICAgR09PR0xFX0RDSEVDS19FUShpdC5tXywgdGhpcyk7CisgICAgICB0eXBlbmFtZSBUcmVlOjppdGVyYXRvciB0cmVlX2l0OworICAgICAgY29uc3QgYm9vbCBpc19saXN0ID0gaXQucmV2YWxpZGF0ZV9pZl9uZWNlc3NhcnkoJnRyZWVfaXQpOworICAgICAgc2l6ZV90eXBlIGIgPSBpdC5idWNrZXRfaW5kZXhfOworICAgICAgTm9kZSogY29uc3QgaXRlbSA9IGl0Lm5vZGVfOworICAgICAgaWYgKGlzX2xpc3QpIHsKKyAgICAgICAgR09PR0xFX0RDSEVDSyhUYWJsZUVudHJ5SXNOb25FbXB0eUxpc3QoYikpOworICAgICAgICBOb2RlKiBoZWFkID0gc3RhdGljX2Nhc3Q8Tm9kZSo+KHRhYmxlX1tiXSk7CisgICAgICAgIGhlYWQgPSBFcmFzZUZyb21MaW5rZWRMaXN0KGl0ZW0sIGhlYWQpOworICAgICAgICB0YWJsZV9bYl0gPSBzdGF0aWNfY2FzdDx2b2lkKj4oaGVhZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHT09HTEVfRENIRUNLKFRhYmxlRW50cnlJc1RyZWUoYikpOworICAgICAgICBUcmVlKiB0cmVlID0gc3RhdGljX2Nhc3Q8VHJlZSo+KHRhYmxlX1tiXSk7CisgICAgICAgIHRyZWUtPmVyYXNlKHRyZWVfaXQpOworICAgICAgICBpZiAodHJlZS0+ZW1wdHkoKSkgeworICAgICAgICAgIC8vIEZvcmNlIGIgdG8gYmUgdGhlIG1pbmltdW0gb2YgYiBhbmQgYiBeIDEuICBUaGlzIGlzIGltcG9ydGFudAorICAgICAgICAgIC8vIG9ubHkgYmVjYXVzZSB3ZSB3YW50IGluZGV4X29mX2ZpcnN0X25vbl9udWxsXyB0byBiZSBjb3JyZWN0LgorICAgICAgICAgIGIgJj0gfnN0YXRpY19jYXN0PHNpemVfdHlwZT4oMSk7CisgICAgICAgICAgRGVzdHJveVRyZWUodHJlZSk7CisgICAgICAgICAgdGFibGVfW2JdID0gdGFibGVfW2IgKyAxXSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIERlc3Ryb3lOb2RlKGl0ZW0pOworICAgICAgLS1udW1fZWxlbWVudHNfOworICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoYiA9PSBpbmRleF9vZl9maXJzdF9ub25fbnVsbF8pKSB7CisgICAgICAgIHdoaWxlIChpbmRleF9vZl9maXJzdF9ub25fbnVsbF8gPCBudW1fYnVja2V0c18gJiYKKyAgICAgICAgICAgICAgIHRhYmxlX1tpbmRleF9vZl9maXJzdF9ub25fbnVsbF9dID09IG51bGxwdHIpIHsKKyAgICAgICAgICArK2luZGV4X29mX2ZpcnN0X25vbl9udWxsXzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBTcGFjZVVzZWRJbnRlcm5hbCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6U3BhY2VVc2VkSW5UYWJsZTxLZXk+KHRhYmxlXywgbnVtX2J1Y2tldHNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2VsZW1lbnRzXywgc2l6ZW9mKE5vZGUpKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBUcnlFbXBsYWNlSW50ZXJuYWwoSyYmIGssIEFyZ3MmJi4uLiBhcmdzKSB7CisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIHNpemVfdHlwZT4gcCA9IEZpbmRIZWxwZXIoayk7CisgICAgICAvLyBDYXNlIDE6IGtleSB3YXMgYWxyZWFkeSBwcmVzZW50LgorICAgICAgaWYgKHAuZmlyc3Qubm9kZV8gIT0gbnVsbHB0cikKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKHAuZmlyc3QpLCBmYWxzZSk7CisgICAgICAvLyBDYXNlIDI6IGluc2VydC4KKyAgICAgIGlmIChSZXNpemVJZkxvYWRJc091dE9mUmFuZ2UobnVtX2VsZW1lbnRzXyArIDEpKSB7CisgICAgICAgIHAgPSBGaW5kSGVscGVyKGspOworICAgICAgfQorICAgICAgY29uc3Qgc2l6ZV90eXBlIGIgPSBwLnNlY29uZDsgIC8vIGJ1Y2tldCBudW1iZXIKKyAgICAgIC8vIElmIEsgaXMgbm90IGtleV90eXBlLCBtYWtlIHRoZSBjb252ZXJzaW9uIHRvIGtleV90eXBlIGV4cGxpY2l0LgorICAgICAgdXNpbmcgVHlwZVRvSW5pdCA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8CisgICAgICAgICAgc3RkOjppc19zYW1lPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8Sz46OnR5cGUsIGtleV90eXBlPjo6dmFsdWUsIEsmJiwKKyAgICAgICAgICBrZXlfdHlwZT46OnR5cGU7CisgICAgICBOb2RlKiBub2RlID0gQWxsb2M8Tm9kZT4oMSk7CisgICAgICAvLyBFdmVuIHdoZW4gYXJlbmEgaXMgbnVsbHB0ciwgQ3JlYXRlSW5BcmVuYVN0b3JhZ2UgaXMgc3RpbGwgdXNlZCB0bworICAgICAgLy8gZW5zdXJlIHRoZSBhcmVuYSBvZiBzdWJtZXNzYWdlIHdpbGwgYmUgY29uc2lzdGVudC4gT3RoZXJ3aXNlLAorICAgICAgLy8gc3VibWVzc2FnZSBtYXkgaGF2ZSBpdHMgb3duIGFyZW5hIHdoZW4gbWVzc2FnZS1vd25lZCBhcmVuYSBpcyBlbmFibGVkLgorICAgICAgLy8gTm90ZTogVGhpcyBvbmx5IHdvcmtzIGlmIGBLZXlgIGlzIG5vdCBhcmVuYSBjb25zdHJ1Y3RpYmxlLgorICAgICAgQXJlbmE6OkNyZWF0ZUluQXJlbmFTdG9yYWdlKGNvbnN0X2Nhc3Q8S2V5Kj4oJm5vZGUtPmt2LmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY18uYXJlbmEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxUeXBlVG9Jbml0PihzdGQ6OmZvcndhcmQ8Sz4oaykpKTsKKyAgICAgIC8vIE5vdGU6IGlmIGBUYCBpcyBhcmVuYSBjb25zdHJ1Y3RpYmxlLCBgQXJnc2AgbmVlZHMgdG8gYmUgZW1wdHkuCisgICAgICBBcmVuYTo6Q3JlYXRlSW5BcmVuYVN0b3JhZ2UoJm5vZGUtPmt2LnNlY29uZCwgYWxsb2NfLmFyZW5hKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKworICAgICAgaXRlcmF0b3IgcmVzdWx0ID0gSW5zZXJ0VW5pcXVlKGIsIG5vZGUpOworICAgICAgKytudW1fZWxlbWVudHNfOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHJlc3VsdCwgdHJ1ZSk7CisgICAgfQorCisgICAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gdG8gcGVyZm9ybSBhbiBhc3NpZ25tZW50IG9mIGBtYXBwZWRfdHlwZWAuCisgICAgLy8gSWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRydWUsIHRoZW4gaXQgaXMgYSByZWd1bGFyIGFzc2lnbm1lbnQuCisgICAgLy8gT3RoZXJ3aXNlLCB3ZSBmaXJzdCBjcmVhdGUgYSB0ZW1wb3JhcnkgYW5kIHRoZW4gcGVyZm9ybSBhbiBhc3NpZ25tZW50LgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBWPgorICAgIHN0YXRpYyB2b2lkIEFzc2lnbk1hcHBlZChzdGQ6OnRydWVfdHlwZSwgbWFwcGVkX3R5cGUmIG1hcHBlZCwgViYmIHYpIHsKKyAgICAgIG1hcHBlZCA9IHN0ZDo6Zm9yd2FyZDxWPih2KTsKKyAgICB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgc3RhdGljIHZvaWQgQXNzaWduTWFwcGVkKHN0ZDo6ZmFsc2VfdHlwZSwgbWFwcGVkX3R5cGUmIG1hcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncyYmLi4uIGFyZ3MpIHsKKyAgICAgIG1hcHBlZCA9IG1hcHBlZF90eXBlKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgfQorCisgICAgLy8gQ2FzZSAxOiBgbWFwcGVkX3R5cGVgIGlzIGFyZW5hIGNvbnN0cnVjdGlibGUuIEEgdGVtcG9yYXJ5IG9iamVjdCBpcworICAgIC8vIGNyZWF0ZWQgYW5kIHRoZW4gKGlmIGBBcmdzYCBhcmUgbm90IGVtcHR5KSBhc3NpZ25lZCB0byBhIG1hcHBlZCB2YWx1ZQorICAgIC8vIHRoYXQgd2FzIGNyZWF0ZWQgd2l0aCB0aGUgYXJlbmEuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEs+CisgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBBcmVuYUF3YXJlVHJ5RW1wbGFjZShzdGQ6OnRydWVfdHlwZSwgSyYmIGspIHsKKyAgICAgIC8vIGNhc2UgMS4xOiAiZGVmYXVsdCIgY29uc3RydWN0ZWQgKGUuZy4gZnJvbSBhcmVuYSBvbmx5KS4KKyAgICAgIHJldHVybiBUcnlFbXBsYWNlSW50ZXJuYWwoc3RkOjpmb3J3YXJkPEs+KGspKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBBcmVuYUF3YXJlVHJ5RW1wbGFjZShzdGQ6OnRydWVfdHlwZSwgSyYmIGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzJiYuLi4gYXJncykgeworICAgICAgLy8gY2FzZSAxLjI6ICJkZWZhdWx0IiBjb25zdHJ1Y3RlZCArIGNvcHkvbW92ZSBhc3NpZ25tZW50CisgICAgICBhdXRvIHAgPSBUcnlFbXBsYWNlSW50ZXJuYWwoc3RkOjpmb3J3YXJkPEs+KGspKTsKKyAgICAgIGlmIChwLnNlY29uZCkgeworICAgICAgICBBc3NpZ25NYXBwZWQoc3RkOjppc19zYW1lPHZvaWQodHlwZW5hbWUgc3RkOjpkZWNheTxBcmdzPjo6dHlwZS4uLiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZChtYXBwZWRfdHlwZSk+KCksCisgICAgICAgICAgICAgICAgICAgICBwLmZpcnN0LT5zZWNvbmQsIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgICB9CisgICAgICByZXR1cm4gcDsKKyAgICB9CisgICAgLy8gQ2FzZSAyOiBgbWFwcGVkX3R5cGVgIGlzIG5vdCBhcmVuYSBjb25zdHJ1Y3RpYmxlLiBVc2luZyBpbi1wbGFjZQorICAgIC8vIGNvbnN0cnVjdGlvbi4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KKyAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IEFyZW5hQXdhcmVUcnlFbXBsYWNlKHN0ZDo6ZmFsc2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MmJi4uLiBhcmdzKSB7CisgICAgICByZXR1cm4gVHJ5RW1wbGFjZUludGVybmFsKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgfQorCisgICAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBLZXkmIGssIFRyZWVJdGVyYXRvciogaXQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBGaW5kSGVscGVyKGssIGl0KS5maXJzdDsKKyAgICB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEs+CisgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLCBzaXplX3R5cGU+IEZpbmRIZWxwZXIoY29uc3QgSyYgaykgY29uc3QgeworICAgICAgcmV0dXJuIEZpbmRIZWxwZXIoaywgbnVsbHB0cik7CisgICAgfQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLPgorICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgc2l6ZV90eXBlPiBGaW5kSGVscGVyKGNvbnN0IEsmIGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZUl0ZXJhdG9yKiBpdCkgY29uc3QgeworICAgICAgc2l6ZV90eXBlIGIgPSBCdWNrZXROdW1iZXIoayk7CisgICAgICBpZiAoVGFibGVFbnRyeUlzTm9uRW1wdHlMaXN0KGIpKSB7CisgICAgICAgIE5vZGUqIG5vZGUgPSBzdGF0aWNfY2FzdDxOb2RlKj4odGFibGVfW2JdKTsKKyAgICAgICAgZG8geworICAgICAgICAgIGlmIChpbnRlcm5hbDo6VHJhbnNwYXJlbnRTdXBwb3J0PEtleT46OkVxdWFscyhub2RlLT5rdi5maXJzdCwgaykpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihjb25zdF9pdGVyYXRvcihub2RlLCB0aGlzLCBiKSwgYik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAobm9kZSAhPSBudWxscHRyKTsKKyAgICAgIH0gZWxzZSBpZiAoVGFibGVFbnRyeUlzVHJlZShiKSkgeworICAgICAgICBHT09HTEVfRENIRUNLX0VRKHRhYmxlX1tiXSwgdGFibGVfW2IgXiAxXSk7CisgICAgICAgIGIgJj0gfnN0YXRpY19jYXN0PHNpemVfdD4oMSk7CisgICAgICAgIFRyZWUqIHRyZWUgPSBzdGF0aWNfY2FzdDxUcmVlKj4odGFibGVfW2JdKTsKKyAgICAgICAgYXV0byB0cmVlX2l0ID0gdHJlZS0+ZmluZChrKTsKKyAgICAgICAgaWYgKHRyZWVfaXQgIT0gdHJlZS0+ZW5kKCkpIHsKKyAgICAgICAgICBpZiAoaXQgIT0gbnVsbHB0cikgKml0ID0gdHJlZV9pdDsKKyAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IodHJlZV9pdCwgdGhpcywgYiksIGIpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZW5kKCksIGIpOworICAgIH0KKworICAgIC8vIEluc2VydCB0aGUgZ2l2ZW4gTm9kZSBpbiBidWNrZXQgYi4gIElmIHRoYXQgd291bGQgbWFrZSBidWNrZXQgYiB0b28gYmlnLAorICAgIC8vIGFuZCBidWNrZXQgYiBpcyBub3QgYSB0cmVlLCBjcmVhdGUgYSB0cmVlIGZvciBidWNrZXRzIGIgYW5kIGJeMSB0byBzaGFyZS4KKyAgICAvLyBSZXF1aXJlcyBjb3VudCgqS2V5UHRyRnJvbU5vZGVQdHIobm9kZSkpID09IDAgYW5kIHRoYXQgYiBpcyB0aGUgY29ycmVjdAorICAgIC8vIGJ1Y2tldC4gIG51bV9lbGVtZW50c18gaXMgbm90IG1vZGlmaWVkLgorICAgIGl0ZXJhdG9yIEluc2VydFVuaXF1ZShzaXplX3R5cGUgYiwgTm9kZSogbm9kZSkgeworICAgICAgR09PR0xFX0RDSEVDSyhpbmRleF9vZl9maXJzdF9ub25fbnVsbF8gPT0gbnVtX2J1Y2tldHNfIHx8CisgICAgICAgICAgICAgdGFibGVfW2luZGV4X29mX2ZpcnN0X25vbl9udWxsX10gIT0gbnVsbHB0cik7CisgICAgICAvLyBJbiBwcmFjdGljZSwgdGhlIGNvZGUgdGhhdCBsZWQgdG8gdGhpcyBwb2ludCBtYXkgaGF2ZSBhbHJlYWR5CisgICAgICAvLyBkZXRlcm1pbmVkIHdoZXRoZXIgd2UgYXJlIGluc2VydGluZyBpbnRvIGFuIGVtcHR5IGxpc3QsIGEgc2hvcnQgbGlzdCwKKyAgICAgIC8vIG9yIHdoYXRldmVyLiAgQnV0IGl0J3MgcHJvYmFibHkgY2hlYXAgZW5vdWdoIHRvIHJlY29tcHV0ZSB0aGF0IGhlcmU7CisgICAgICAvLyBpdCdzIGxpa2VseSB0aGF0IHdlJ3JlIGluc2VydGluZyBpbnRvIGFuIGVtcHR5IG9yIHNob3J0IGxpc3QuCisgICAgICBpdGVyYXRvciByZXN1bHQ7CisgICAgICBHT09HTEVfRENIRUNLKGZpbmQobm9kZS0+a3YuZmlyc3QpID09IGVuZCgpKTsKKyAgICAgIGlmIChUYWJsZUVudHJ5SXNFbXB0eShiKSkgeworICAgICAgICByZXN1bHQgPSBJbnNlcnRVbmlxdWVJbkxpc3QoYiwgbm9kZSk7CisgICAgICB9IGVsc2UgaWYgKFRhYmxlRW50cnlJc05vbkVtcHR5TGlzdChiKSkgeworICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShUYWJsZUVudHJ5SXNUb29Mb25nKGIpKSkgeworICAgICAgICAgIFRyZWVDb252ZXJ0KGIpOworICAgICAgICAgIHJlc3VsdCA9IEluc2VydFVuaXF1ZUluVHJlZShiLCBub2RlKTsKKyAgICAgICAgICBHT09HTEVfRENIRUNLX0VRKHJlc3VsdC5idWNrZXRfaW5kZXhfLCBiICYgfnN0YXRpY19jYXN0PHNpemVfdHlwZT4oMSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEluc2VydCBpbnRvIGEgcHJlLWV4aXN0aW5nIGxpc3QuICBUaGlzIGNhc2UgY2Fubm90IG1vZGlmeQorICAgICAgICAgIC8vIGluZGV4X29mX2ZpcnN0X25vbl9udWxsXywgc28gd2Ugc2tpcCB0aGUgY29kZSB0byB1cGRhdGUgaXQuCisgICAgICAgICAgcmV0dXJuIEluc2VydFVuaXF1ZUluTGlzdChiLCBub2RlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSW5zZXJ0IGludG8gYSBwcmUtZXhpc3RpbmcgdHJlZS4gIFRoaXMgY2FzZSBjYW5ub3QgbW9kaWZ5CisgICAgICAgIC8vIGluZGV4X29mX2ZpcnN0X25vbl9udWxsXywgc28gd2Ugc2tpcCB0aGUgY29kZSB0byB1cGRhdGUgaXQuCisgICAgICAgIHJldHVybiBJbnNlcnRVbmlxdWVJblRyZWUoYiwgbm9kZSk7CisgICAgICB9CisgICAgICAvLyBwYXJlbnRoZXNlcyBhcm91bmQgKHN0ZDo6bWluKSBwcmV2ZW50cyBtYWNybyBleHBhbnNpb24gb2YgbWluKC4uLikKKyAgICAgIGluZGV4X29mX2ZpcnN0X25vbl9udWxsXyA9CisgICAgICAgICAgKHN0ZDo6bWluKShpbmRleF9vZl9maXJzdF9ub25fbnVsbF8sIHJlc3VsdC5idWNrZXRfaW5kZXhfKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIHdlIHNob3VsZCBpbnNlcnQgYWZ0ZXIgdGhlIGhlYWQgb2YgdGhlIGxpc3QuIEZvcgorICAgIC8vIG5vbi1vcHRpbWl6ZWQgYnVpbGRzLCB3ZSByYW5kb21seSBkZWNpZGUgd2hldGhlciB0byBpbnNlcnQgcmlnaHQgYXQgdGhlCisgICAgLy8gaGVhZCBvZiB0aGUgbGlzdCBvciBqdXN0IGFmdGVyIHRoZSBoZWFkLiBUaGlzIGhlbHBzIGFkZCBhIGxpdHRsZSBiaXQgb2YKKyAgICAvLyBub24tZGV0ZXJtaW5pc20gdG8gdGhlIG1hcCBvcmRlcmluZy4KKyAgICBib29sIFNob3VsZEluc2VydEFmdGVySGVhZCh2b2lkKiBub2RlKSB7CisjaWZkZWYgTkRFQlVHCisgICAgICAodm9pZClub2RlOworICAgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgICAgIC8vIERvaW5nIG1vZHVsbyB3aXRoIGEgcHJpbWUgbWl4ZXMgdGhlIGJpdHMgbW9yZS4KKyAgICAgIHJldHVybiAocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KG5vZGUpIF4gc2VlZF8pICUgMTMgPiA2OworI2VuZGlmCisgICAgfQorCisgICAgLy8gSGVscGVyIGZvciBJbnNlcnRVbmlxdWUuICBIYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGJ1Y2tldCBiIGlzIGEKKyAgICAvLyBub3QtdG9vLWxvbmcgbGlua2VkIGxpc3QuCisgICAgaXRlcmF0b3IgSW5zZXJ0VW5pcXVlSW5MaXN0KHNpemVfdHlwZSBiLCBOb2RlKiBub2RlKSB7CisgICAgICBpZiAodGFibGVfW2JdICE9IG51bGxwdHIgJiYgU2hvdWxkSW5zZXJ0QWZ0ZXJIZWFkKG5vZGUpKSB7CisgICAgICAgIE5vZGUqIGZpcnN0ID0gc3RhdGljX2Nhc3Q8Tm9kZSo+KHRhYmxlX1tiXSk7CisgICAgICAgIG5vZGUtPm5leHQgPSBmaXJzdC0+bmV4dDsKKyAgICAgICAgZmlyc3QtPm5leHQgPSBub2RlOworICAgICAgICByZXR1cm4gaXRlcmF0b3Iobm9kZSwgdGhpcywgYik7CisgICAgICB9CisKKyAgICAgIG5vZGUtPm5leHQgPSBzdGF0aWNfY2FzdDxOb2RlKj4odGFibGVfW2JdKTsKKyAgICAgIHRhYmxlX1tiXSA9IHN0YXRpY19jYXN0PHZvaWQqPihub2RlKTsKKyAgICAgIHJldHVybiBpdGVyYXRvcihub2RlLCB0aGlzLCBiKTsKKyAgICB9CisKKyAgICAvLyBIZWxwZXIgZm9yIEluc2VydFVuaXF1ZS4gIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgYnVja2V0IGIgcG9pbnRzIHRvIGEKKyAgICAvLyBUcmVlLgorICAgIGl0ZXJhdG9yIEluc2VydFVuaXF1ZUluVHJlZShzaXplX3R5cGUgYiwgTm9kZSogbm9kZSkgeworICAgICAgR09PR0xFX0RDSEVDS19FUSh0YWJsZV9bYl0sIHRhYmxlX1tiIF4gMV0pOworICAgICAgLy8gTWFpbnRhaW4gdGhlIGludmFyaWFudCB0aGF0IG5vZGUtPm5leHQgaXMgbnVsbCBmb3IgYWxsIE5vZGVzIGluIFRyZWVzLgorICAgICAgbm9kZS0+bmV4dCA9IG51bGxwdHI7CisgICAgICByZXR1cm4gaXRlcmF0b3IoCisgICAgICAgICAgc3RhdGljX2Nhc3Q8VHJlZSo+KHRhYmxlX1tiXSktPmluc2VydCh7bm9kZS0+a3YuZmlyc3QsIG5vZGV9KS5maXJzdCwKKyAgICAgICAgICB0aGlzLCBiICYgfnN0YXRpY19jYXN0PHNpemVfdD4oMSkpOworICAgIH0KKworICAgIC8vIFJldHVybnMgd2hldGhlciBpdCBkaWQgcmVzaXplLiAgQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdoZW4KKyAgICAvLyBudW1fZWxlbWVudHNfIGluY3JlYXNlcywgdGhvdWdoIGl0IGNvdWxkIGJlIHVzZWQgaW4gb3RoZXIgc2l0dWF0aW9ucy4KKyAgICAvLyBJdCBjaGVja3MgZm9yIGxvYWQgdG9vIGxvdyBhcyB3ZWxsIGFzIGxvYWQgdG9vIGhpZ2g6IGJlY2F1c2UgYW55IG51bWJlcgorICAgIC8vIG9mIGVyYXNlcyBjYW4gb2NjdXIgYmV0d2VlbiBpbnNlcnRzLCB0aGUgbG9hZCBjb3VsZCBiZSBhcyBsb3cgYXMgMCBoZXJlLgorICAgIC8vIFJlc2l6aW5nIHRvIGEgbG93ZXIgc2l6ZSBpcyBub3QgYWx3YXlzIGhlbHBmdWwsIGJ1dCBmYWlsaW5nIHRvIGRvIHNvIGNhbgorICAgIC8vIGRlc3Ryb3kgdGhlIGV4cGVjdGVkIGJpZy1PIGJvdW5kcyBmb3Igc29tZSBvcGVyYXRpb25zLiBCeSBoYXZpbmcgdGhlCisgICAgLy8gcG9saWN5IHRoYXQgc29tZXRpbWVzIHdlIHJlc2l6ZSBkb3duIGFzIHdlbGwgYXMgdXAsIGNsaWVudHMgY2FuIGVhc2lseQorICAgIC8vIGtlZXAgTyhzaXplKCkpID0gTyhudW1iZXIgb2YgYnVja2V0cykgaWYgdGhleSB3YW50IHRoYXQuCisgICAgYm9vbCBSZXNpemVJZkxvYWRJc091dE9mUmFuZ2Uoc2l6ZV90eXBlIG5ld19zaXplKSB7CisgICAgICBjb25zdCBzaXplX3R5cGUga01heE1hcExvYWRUaW1lczE2ID0gMTI7ICAvLyBjb250cm9scyBSQU0gdnMgQ1BVIHRyYWRlb2ZmCisgICAgICBjb25zdCBzaXplX3R5cGUgaGlfY3V0b2ZmID0gbnVtX2J1Y2tldHNfICoga01heE1hcExvYWRUaW1lczE2IC8gMTY7CisgICAgICBjb25zdCBzaXplX3R5cGUgbG9fY3V0b2ZmID0gaGlfY3V0b2ZmIC8gNDsKKyAgICAgIC8vIFdlIGRvbid0IGNhcmUgaG93IG1hbnkgZWxlbWVudHMgYXJlIGluIHRyZWVzLiAgSWYgYSBsb3QgYXJlLAorICAgICAgLy8gd2UgbWF5IHJlc2l6ZSBldmVuIHRob3VnaCB0aGVyZSBhcmUgbWFueSBlbXB0eSBidWNrZXRzLiAgSW4KKyAgICAgIC8vIHByYWN0aWNlLCB0aGlzIHNlZW1zIGZpbmUuCisgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShuZXdfc2l6ZSA+PSBoaV9jdXRvZmYpKSB7CisgICAgICAgIGlmIChudW1fYnVja2V0c18gPD0gbWF4X3NpemUoKSAvIDIpIHsKKyAgICAgICAgICBSZXNpemUobnVtX2J1Y2tldHNfICogMik7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShuZXdfc2l6ZSA8PSBsb19jdXRvZmYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYnVja2V0c18gPiBrTWluVGFibGVTaXplKSkgeworICAgICAgICBzaXplX3R5cGUgbGcyX29mX3NpemVfcmVkdWN0aW9uX2ZhY3RvciA9IDE7CisgICAgICAgIC8vIEl0J3MgcG9zc2libGUgd2Ugd2FudCB0byBzaHJpbmsgYSBsb3QgaGVyZS4uLiBzaXplKCkgY291bGQgZXZlbiBiZSAwLgorICAgICAgICAvLyBTbywgZXN0aW1hdGUgaG93IG11Y2ggdG8gc2hyaW5rIGJ5IG1ha2luZyBzdXJlIHdlIGRvbid0IHNocmluayBzbworICAgICAgICAvLyBtdWNoIHRoYXQgd2Ugd291bGQgbmVlZCB0byBncm93IHRoZSB0YWJsZSBhZnRlciBhIGZldyBpbnNlcnRzLgorICAgICAgICBjb25zdCBzaXplX3R5cGUgaHlwb3RoZXRpY2FsX3NpemUgPSBuZXdfc2l6ZSAqIDUgLyA0ICsgMTsKKyAgICAgICAgd2hpbGUgKChoeXBvdGhldGljYWxfc2l6ZSA8PCBsZzJfb2Zfc2l6ZV9yZWR1Y3Rpb25fZmFjdG9yKSA8CisgICAgICAgICAgICAgICBoaV9jdXRvZmYpIHsKKyAgICAgICAgICArK2xnMl9vZl9zaXplX3JlZHVjdGlvbl9mYWN0b3I7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90eXBlIG5ld19udW1fYnVja2V0cyA9IHN0ZDo6bWF4PHNpemVfdHlwZT4oCisgICAgICAgICAgICBrTWluVGFibGVTaXplLCBudW1fYnVja2V0c18gPj4gbGcyX29mX3NpemVfcmVkdWN0aW9uX2ZhY3Rvcik7CisgICAgICAgIGlmIChuZXdfbnVtX2J1Y2tldHMgIT0gbnVtX2J1Y2tldHNfKSB7CisgICAgICAgICAgUmVzaXplKG5ld19udW1fYnVja2V0cyk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBSZXNpemUgdG8gdGhlIGdpdmVuIG51bWJlciBvZiBidWNrZXRzLgorICAgIHZvaWQgUmVzaXplKHNpemVfdCBuZXdfbnVtX2J1Y2tldHMpIHsKKyAgICAgIGlmIChudW1fYnVja2V0c18gPT0gaW50ZXJuYWw6OmtHbG9iYWxFbXB0eVRhYmxlU2l6ZSkgeworICAgICAgICAvLyBUaGlzIGlzIHRoZSBnbG9iYWwgZW1wdHkgYXJyYXkuCisgICAgICAgIC8vIEp1c3Qgb3ZlcndyaXRlIHdpdGggYSBuZXcgb25lLiBObyBuZWVkIHRvIHRyYW5zZmVyIG9yIGZyZWUgYW55dGhpbmcuCisgICAgICAgIG51bV9idWNrZXRzXyA9IGluZGV4X29mX2ZpcnN0X25vbl9udWxsXyA9IGtNaW5UYWJsZVNpemU7CisgICAgICAgIHRhYmxlXyA9IENyZWF0ZUVtcHR5VGFibGUobnVtX2J1Y2tldHNfKTsKKyAgICAgICAgc2VlZF8gPSBTZWVkKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgR09PR0xFX0RDSEVDS19HRShuZXdfbnVtX2J1Y2tldHMsIGtNaW5UYWJsZVNpemUpOworICAgICAgdm9pZCoqIGNvbnN0IG9sZF90YWJsZSA9IHRhYmxlXzsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBvbGRfdGFibGVfc2l6ZSA9IG51bV9idWNrZXRzXzsKKyAgICAgIG51bV9idWNrZXRzXyA9IG5ld19udW1fYnVja2V0czsKKyAgICAgIHRhYmxlXyA9IENyZWF0ZUVtcHR5VGFibGUobnVtX2J1Y2tldHNfKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBzdGFydCA9IGluZGV4X29mX2ZpcnN0X25vbl9udWxsXzsKKyAgICAgIGluZGV4X29mX2ZpcnN0X25vbl9udWxsXyA9IG51bV9idWNrZXRzXzsKKyAgICAgIGZvciAoc2l6ZV90eXBlIGkgPSBzdGFydDsgaSA8IG9sZF90YWJsZV9zaXplOyBpKyspIHsKKyAgICAgICAgaWYgKGludGVybmFsOjpUYWJsZUVudHJ5SXNOb25FbXB0eUxpc3Qob2xkX3RhYmxlLCBpKSkgeworICAgICAgICAgIFRyYW5zZmVyTGlzdChvbGRfdGFibGUsIGkpOworICAgICAgICB9IGVsc2UgaWYgKGludGVybmFsOjpUYWJsZUVudHJ5SXNUcmVlKG9sZF90YWJsZSwgaSkpIHsKKyAgICAgICAgICBUcmFuc2ZlclRyZWUob2xkX3RhYmxlLCBpKyspOworICAgICAgICB9CisgICAgICB9CisgICAgICBEZWFsbG9jPHZvaWQqPihvbGRfdGFibGUsIG9sZF90YWJsZV9zaXplKTsKKyAgICB9CisKKyAgICB2b2lkIFRyYW5zZmVyTGlzdCh2b2lkKiBjb25zdCogdGFibGUsIHNpemVfdHlwZSBpbmRleCkgeworICAgICAgTm9kZSogbm9kZSA9IHN0YXRpY19jYXN0PE5vZGUqPih0YWJsZVtpbmRleF0pOworICAgICAgZG8geworICAgICAgICBOb2RlKiBuZXh0ID0gbm9kZS0+bmV4dDsKKyAgICAgICAgSW5zZXJ0VW5pcXVlKEJ1Y2tldE51bWJlcihub2RlLT5rdi5maXJzdCksIG5vZGUpOworICAgICAgICBub2RlID0gbmV4dDsKKyAgICAgIH0gd2hpbGUgKG5vZGUgIT0gbnVsbHB0cik7CisgICAgfQorCisgICAgdm9pZCBUcmFuc2ZlclRyZWUodm9pZCogY29uc3QqIHRhYmxlLCBzaXplX3R5cGUgaW5kZXgpIHsKKyAgICAgIFRyZWUqIHRyZWUgPSBzdGF0aWNfY2FzdDxUcmVlKj4odGFibGVbaW5kZXhdKTsKKyAgICAgIHR5cGVuYW1lIFRyZWU6Oml0ZXJhdG9yIHRyZWVfaXQgPSB0cmVlLT5iZWdpbigpOworICAgICAgZG8geworICAgICAgICBJbnNlcnRVbmlxdWUoQnVja2V0TnVtYmVyKHN0ZDo6Y3JlZih0cmVlX2l0LT5maXJzdCkuZ2V0KCkpLAorICAgICAgICAgICAgICAgICAgICAgTm9kZUZyb21UcmVlSXRlcmF0b3IodHJlZV9pdCkpOworICAgICAgfSB3aGlsZSAoKyt0cmVlX2l0ICE9IHRyZWUtPmVuZCgpKTsKKyAgICAgIERlc3Ryb3lUcmVlKHRyZWUpOworICAgIH0KKworICAgIE5vZGUqIEVyYXNlRnJvbUxpbmtlZExpc3QoTm9kZSogaXRlbSwgTm9kZSogaGVhZCkgeworICAgICAgaWYgKGhlYWQgPT0gaXRlbSkgeworICAgICAgICByZXR1cm4gaGVhZC0+bmV4dDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhlYWQtPm5leHQgPSBFcmFzZUZyb21MaW5rZWRMaXN0KGl0ZW0sIGhlYWQtPm5leHQpOworICAgICAgICByZXR1cm4gaGVhZDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBib29sIFRhYmxlRW50cnlJc0VtcHR5KHNpemVfdHlwZSBiKSBjb25zdCB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OlRhYmxlRW50cnlJc0VtcHR5KHRhYmxlXywgYik7CisgICAgfQorICAgIGJvb2wgVGFibGVFbnRyeUlzTm9uRW1wdHlMaXN0KHNpemVfdHlwZSBiKSBjb25zdCB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OlRhYmxlRW50cnlJc05vbkVtcHR5TGlzdCh0YWJsZV8sIGIpOworICAgIH0KKyAgICBib29sIFRhYmxlRW50cnlJc1RyZWUoc2l6ZV90eXBlIGIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6VGFibGVFbnRyeUlzVHJlZSh0YWJsZV8sIGIpOworICAgIH0KKyAgICBib29sIFRhYmxlRW50cnlJc0xpc3Qoc2l6ZV90eXBlIGIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6VGFibGVFbnRyeUlzTGlzdCh0YWJsZV8sIGIpOworICAgIH0KKworICAgIHZvaWQgVHJlZUNvbnZlcnQoc2l6ZV90eXBlIGIpIHsKKyAgICAgIEdPT0dMRV9EQ0hFQ0soIVRhYmxlRW50cnlJc1RyZWUoYikgJiYgIVRhYmxlRW50cnlJc1RyZWUoYiBeIDEpKTsKKyAgICAgIFRyZWUqIHRyZWUgPQorICAgICAgICAgIEFyZW5hOjpDcmVhdGU8VHJlZT4oYWxsb2NfLmFyZW5hKCksIHR5cGVuYW1lIFRyZWU6OmtleV9jb21wYXJlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmVlOjphbGxvY2F0b3JfdHlwZShhbGxvY18pKTsKKyAgICAgIHNpemVfdHlwZSBjb3VudCA9IENvcHlMaXN0VG9UcmVlKGIsIHRyZWUpICsgQ29weUxpc3RUb1RyZWUoYiBeIDEsIHRyZWUpOworICAgICAgR09PR0xFX0RDSEVDS19FUShjb3VudCwgdHJlZS0+c2l6ZSgpKTsKKyAgICAgIHRhYmxlX1tiXSA9IHRhYmxlX1tiIF4gMV0gPSBzdGF0aWNfY2FzdDx2b2lkKj4odHJlZSk7CisgICAgfQorCisgICAgLy8gQ29weSBhIGxpbmtlZCBsaXN0IGluIHRoZSBnaXZlbiBidWNrZXQgdG8gYSB0cmVlLgorICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGluZ3MgaXQgY29waWVkLgorICAgIHNpemVfdHlwZSBDb3B5TGlzdFRvVHJlZShzaXplX3R5cGUgYiwgVHJlZSogdHJlZSkgeworICAgICAgc2l6ZV90eXBlIGNvdW50ID0gMDsKKyAgICAgIE5vZGUqIG5vZGUgPSBzdGF0aWNfY2FzdDxOb2RlKj4odGFibGVfW2JdKTsKKyAgICAgIHdoaWxlIChub2RlICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJlZS0+aW5zZXJ0KHtub2RlLT5rdi5maXJzdCwgbm9kZX0pOworICAgICAgICArK2NvdW50OworICAgICAgICBOb2RlKiBuZXh0ID0gbm9kZS0+bmV4dDsKKyAgICAgICAgbm9kZS0+bmV4dCA9IG51bGxwdHI7CisgICAgICAgIG5vZGUgPSBuZXh0OworICAgICAgfQorICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8vIFJldHVybiB3aGV0aGVyIHRhYmxlX1tiXSBpcyBhIGxpbmtlZCBsaXN0IHRoYXQgc2VlbXMgYXdmdWxseSBsb25nLgorICAgIC8vIFJlcXVpcmVzIHRhYmxlX1tiXSB0byBwb2ludCB0byBhIG5vbi1lbXB0eSBsaW5rZWQgbGlzdC4KKyAgICBib29sIFRhYmxlRW50cnlJc1Rvb0xvbmcoc2l6ZV90eXBlIGIpIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBrTWF4TGVuZ3RoID0gODsKKyAgICAgIHNpemVfdHlwZSBjb3VudCA9IDA7CisgICAgICBOb2RlKiBub2RlID0gc3RhdGljX2Nhc3Q8Tm9kZSo+KHRhYmxlX1tiXSk7CisgICAgICBkbyB7CisgICAgICAgICsrY291bnQ7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgfSB3aGlsZSAobm9kZSAhPSBudWxscHRyKTsKKyAgICAgIC8vIEludmFyaWFudDogbm8gbGlua2VkIGxpc3QgZXZlciBpcyBtb3JlIHRoYW4ga01heExlbmd0aCBpbiBsZW5ndGguCisgICAgICBHT09HTEVfRENIRUNLX0xFKGNvdW50LCBrTWF4TGVuZ3RoKTsKKyAgICAgIHJldHVybiBjb3VudCA+PSBrTWF4TGVuZ3RoOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLPgorICAgIHNpemVfdHlwZSBCdWNrZXROdW1iZXIoY29uc3QgSyYgaykgY29uc3QgeworICAgICAgLy8gV2UgeG9yIHRoZSBoYXNoIHZhbHVlIGFnYWluc3QgdGhlIHJhbmRvbSBzZWVkIHNvIHRoYXQgd2UgZWZmZWN0aXZlbHkKKyAgICAgIC8vIGhhdmUgYSByYW5kb20gaGFzaCBmdW5jdGlvbi4KKyAgICAgIHVpbnQ2NF90IGggPSBoYXNoX2Z1bmN0aW9uKCkoaykgXiBzZWVkXzsKKworICAgICAgLy8gV2UgdXNlIHRoZSBtdWx0aXBsaWNhdGlvbiBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoZSBidWNrZXQgbnVtYmVyIGZyb20KKyAgICAgIC8vIHRoZSBoYXNoIHZhbHVlLiBUaGUgY29uc3RhbnQga1BoaSAoc3VnZ2VzdGVkIGJ5IEtudXRoKSBpcyByb3VnaGx5CisgICAgICAvLyAoc3FydCg1KSAtIDEpIC8gMiAqIDJeNjQuCisgICAgICBjb25zdGV4cHIgdWludDY0X3Qga1BoaSA9IHVpbnQ2NF90ezB4OWUzNzc5Yjk3ZjRhN2MxNX07CisgICAgICByZXR1cm4gKChrUGhpICogaCkgPj4gMzIpICYgKG51bV9idWNrZXRzXyAtIDEpOworICAgIH0KKworICAgIC8vIFJldHVybiBhIHBvd2VyIG9mIHR3byBubyBsZXNzIHRoYW4gbWF4KGtNaW5UYWJsZVNpemUsIG4pLgorICAgIC8vIEFzc3VtZXMgZWl0aGVyIG4gPCBrTWluVGFibGVTaXplIG9yIG4gaXMgYSBwb3dlciBvZiB0d28uCisgICAgc2l6ZV90eXBlIFRhYmxlU2l6ZShzaXplX3R5cGUgbikgeworICAgICAgcmV0dXJuIG4gPCBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGtNaW5UYWJsZVNpemUpCisgICAgICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihrTWluVGFibGVTaXplKQorICAgICAgICAgICAgICAgICA6IG47CisgICAgfQorCisgICAgLy8gVXNlIGFsbG9jXyB0byBhbGxvY2F0ZSBhbiBhcnJheSBvZiBuIG9iamVjdHMgb2YgdHlwZSBVLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICAgIFUqIEFsbG9jKHNpemVfdHlwZSBuKSB7CisgICAgICB1c2luZyBhbGxvY190eXBlID0gdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8VT46Om90aGVyOworICAgICAgcmV0dXJuIGFsbG9jX3R5cGUoYWxsb2NfKS5hbGxvY2F0ZShuKTsKKyAgICB9CisKKyAgICAvLyBVc2UgYWxsb2NfIHRvIGRlYWxsb2NhdGUgYW4gYXJyYXkgb2YgbiBvYmplY3RzIG9mIHR5cGUgVS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgICB2b2lkIERlYWxsb2MoVSogdCwgc2l6ZV90eXBlIG4pIHsKKyAgICAgIHVzaW5nIGFsbG9jX3R5cGUgPSB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxVPjo6b3RoZXI7CisgICAgICBhbGxvY190eXBlKGFsbG9jXykuZGVhbGxvY2F0ZSh0LCBuKTsKKyAgICB9CisKKyAgICB2b2lkIERlc3Ryb3lOb2RlKE5vZGUqIG5vZGUpIHsKKyAgICAgIGlmIChhbGxvY18uYXJlbmEoKSA9PSBudWxscHRyKSB7CisgICAgICAgIGRlbGV0ZSBub2RlOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgRGVzdHJveVRyZWUoVHJlZSogdHJlZSkgeworICAgICAgaWYgKGFsbG9jXy5hcmVuYSgpID09IG51bGxwdHIpIHsKKyAgICAgICAgZGVsZXRlIHRyZWU7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCoqIENyZWF0ZUVtcHR5VGFibGUoc2l6ZV90eXBlIG4pIHsKKyAgICAgIEdPT0dMRV9EQ0hFQ0sobiA+PSBrTWluVGFibGVTaXplKTsKKyAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEobiAmIChuIC0gMSksIDB1KTsKKyAgICAgIHZvaWQqKiByZXN1bHQgPSBBbGxvYzx2b2lkKj4obik7CisgICAgICBtZW1zZXQocmVzdWx0LCAwLCBuICogc2l6ZW9mKHJlc3VsdFswXSkpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gYSByYW5kb21pc2ggdmFsdWUuCisgICAgc2l6ZV90eXBlIFNlZWQoKSBjb25zdCB7CisgICAgICAvLyBXZSBnZXQgYSBsaXR0bGUgYml0IG9mIHJhbmRvbW5lc3MgZnJvbSB0aGUgYWRkcmVzcyBvZiB0aGUgbWFwLiBUaGUKKyAgICAgIC8vIGxvd2VyIGJpdHMgYXJlIG5vdCB2ZXJ5IHJhbmRvbSwgZHVlIHRvIGFsaWdubWVudCwgc28gd2UgZGlzY2FyZCB0aGVtCisgICAgICAvLyBhbmQgc2hpZnQgdGhlIGhpZ2hlciBiaXRzIGludG8gdGhlaXIgcGxhY2UuCisgICAgICBzaXplX3R5cGUgcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pih0aGlzKSA+PiA0OworI2lmICFkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9OT19SRFRTQykKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICAgIC8vIFVzZSBhIGNvbW1wYWdlLWJhc2VkIGZhc3QgdGltZSBmdW5jdGlvbiBvbiBBcHBsZSBlbnZpcm9ubWVudHMgKE1hY09TLAorICAgICAgLy8gaU9TLCB0dk9TLCB3YXRjaE9TLCBldGMpLgorICAgICAgcyArPSBtYWNoX2Fic29sdXRlX3RpbWUoKTsKKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKKyAgICAgIHVpbnQzMl90IGhpLCBsbzsKKyAgICAgIGFzbSB2b2xhdGlsZSgicmR0c2MiIDogIj1hIihsbyksICI9ZCIoaGkpKTsKKyAgICAgIHMgKz0gKChzdGF0aWNfY2FzdDx1aW50NjRfdD4oaGkpIDw8IDMyKSB8IGxvKTsKKyNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pICYmIGRlZmluZWQoX19HTlVDX18pCisgICAgICAvLyBUaGVyZSBpcyBubyByZHRzYyBvbiBBUk12OC4gQ05UVkNUX0VMMCBpcyB0aGUgdmlydHVhbCBjb3VudGVyIG9mIHRoZQorICAgICAgLy8gc3lzdGVtIHRpbWVyLiBJdCBydW5zIGF0IGEgZGlmZmVyZW50IGZyZXF1ZW5jeSB0aGFuIHRoZSBDUFUncywgYnV0IGlzCisgICAgICAvLyB0aGUgYmVzdCBzb3VyY2Ugb2YgdGltZS1iYXNlZCBlbnRyb3B5IHdlIGdldC4KKyAgICAgIHVpbnQ2NF90IHZpcnR1YWxfdGltZXJfdmFsdWU7CisgICAgICBhc20gdm9sYXRpbGUoIm1ycyAlMCwgY250dmN0X2VsMCIgOiAiPXIiKHZpcnR1YWxfdGltZXJfdmFsdWUpKTsKKyAgICAgIHMgKz0gdmlydHVhbF90aW1lcl92YWx1ZTsKKyNlbmRpZgorI2VuZGlmICAvLyAhZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfTk9fUkRUU0MpCisgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBmcmllbmQgY2xhc3MgQXJlbmE7CisgICAgdXNpbmcgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfID0gdm9pZDsKKyAgICB1c2luZyBEZXN0cnVjdG9yU2tpcHBhYmxlXyA9IHZvaWQ7CisKKyAgICBzaXplX3R5cGUgbnVtX2VsZW1lbnRzXzsKKyAgICBzaXplX3R5cGUgbnVtX2J1Y2tldHNfOworICAgIHNpemVfdHlwZSBzZWVkXzsKKyAgICBzaXplX3R5cGUgaW5kZXhfb2ZfZmlyc3Rfbm9uX251bGxfOworICAgIHZvaWQqKiB0YWJsZV87ICAvLyBhbiBhcnJheSB3aXRoIG51bV9idWNrZXRzXyBlbnRyaWVzCisgICAgQWxsb2NhdG9yIGFsbG9jXzsKKyAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW5uZXJNYXApOworICB9OyAgLy8gZW5kIG9mIGNsYXNzIElubmVyTWFwCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIExvb2t1cEtleT4KKyAgdXNpbmcga2V5X2FyZyA9IHR5cGVuYW1lIGludGVybmFsOjpUcmFuc3BhcmVudFN1cHBvcnQ8CisgICAgICBrZXlfdHlwZT46OnRlbXBsYXRlIGtleV9hcmc8TG9va3VwS2V5PjsKKworIHB1YmxpYzoKKyAgLy8gSXRlcmF0b3JzCisgIGNsYXNzIGNvbnN0X2l0ZXJhdG9yIHsKKyAgICB1c2luZyBJbm5lckl0ID0gdHlwZW5hbWUgSW5uZXJNYXA6OmNvbnN0X2l0ZXJhdG9yOworCisgICBwdWJsaWM6CisgICAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworICAgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBNYXA6OnZhbHVlX3R5cGU7CisgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gcHRyZGlmZl90OworICAgIHVzaW5nIHBvaW50ZXIgPSBjb25zdCB2YWx1ZV90eXBlKjsKKyAgICB1c2luZyByZWZlcmVuY2UgPSBjb25zdCB2YWx1ZV90eXBlJjsKKworICAgIGNvbnN0X2l0ZXJhdG9yKCkge30KKyAgICBleHBsaWNpdCBjb25zdF9pdGVyYXRvcihjb25zdCBJbm5lckl0JiBpdCkgOiBpdF8oaXQpIHt9CisKKyAgICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKml0XzsgfQorICAgIGNvbnN0X3BvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYob3BlcmF0b3IqKCkpOyB9CisKKyAgICBjb25zdF9pdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICAgICsraXRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBjb25zdF9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoaXRfKyspOyB9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBhLCBjb25zdCBjb25zdF9pdGVyYXRvciYgYikgeworICAgICAgcmV0dXJuIGEuaXRfID09IGIuaXRfOworICAgIH0KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBhLCBjb25zdCBjb25zdF9pdGVyYXRvciYgYikgeworICAgICAgcmV0dXJuICEoYSA9PSBiKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSW5uZXJJdCBpdF87CisgIH07CisKKyAgY2xhc3MgaXRlcmF0b3IgeworICAgIHVzaW5nIElubmVySXQgPSB0eXBlbmFtZSBJbm5lck1hcDo6aXRlcmF0b3I7CisKKyAgIHB1YmxpYzoKKyAgICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc7CisgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIE1hcDo6dmFsdWVfdHlwZTsKKyAgICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBwdHJkaWZmX3Q7CisgICAgdXNpbmcgcG9pbnRlciA9IHZhbHVlX3R5cGUqOworICAgIHVzaW5nIHJlZmVyZW5jZSA9IHZhbHVlX3R5cGUmOworCisgICAgaXRlcmF0b3IoKSB7fQorICAgIGV4cGxpY2l0IGl0ZXJhdG9yKGNvbnN0IElubmVySXQmIGl0KSA6IGl0XyhpdCkge30KKworICAgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqaXRfOyB9CisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJihvcGVyYXRvciooKSk7IH0KKworICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgICAgKytpdF87CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIGl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiBpdGVyYXRvcihpdF8rKyk7IH0KKworICAgIC8vIEFsbG93IGltcGxpY2l0IGNvbnZlcnNpb24gdG8gY29uc3RfaXRlcmF0b3IuCisgICAgb3BlcmF0b3IgY29uc3RfaXRlcmF0b3IoKSBjb25zdCB7ICAvLyBOT0xJTlQocnVudGltZS9leHBsaWNpdCkKKyAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcih0eXBlbmFtZSBJbm5lck1hcDo6Y29uc3RfaXRlcmF0b3IoaXRfKSk7CisgICAgfQorCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgYSwgY29uc3QgaXRlcmF0b3ImIGIpIHsKKyAgICAgIHJldHVybiBhLml0XyA9PSBiLml0XzsKKyAgICB9CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgYSwgY29uc3QgaXRlcmF0b3ImIGIpIHsKKyAgICAgIHJldHVybiAhKGEgPT0gYik7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBNYXA7CisKKyAgICBJbm5lckl0IGl0XzsKKyAgfTsKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKGVsZW1lbnRzXy5iZWdpbigpKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcihlbGVtZW50c18uZW5kKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoZWxlbWVudHNfLmJlZ2luKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGVsZW1lbnRzXy5lbmQoKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3QgeyByZXR1cm4gYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBjZW5kKCkgY29uc3QgeyByZXR1cm4gZW5kKCk7IH0KKworICAvLyBDYXBhY2l0eQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGVsZW1lbnRzXy5zaXplKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisKKyAgLy8gRWxlbWVudCBhY2Nlc3MKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEsgPSBrZXlfdHlwZT4KKyAgVCYgb3BlcmF0b3JbXShjb25zdCBrZXlfYXJnPEs+JiBrZXkpIHsKKyAgICByZXR1cm4gZWxlbWVudHNfW2tleV0uc2Vjb25kOworICB9CisgIHRlbXBsYXRlIDwKKyAgICAgIHR5cGVuYW1lIEsgPSBrZXlfdHlwZSwKKyAgICAgIC8vIERpc2FibGUgZm9yIGludGVncmFsIHR5cGVzIHRvIHJlZHVjZSBjb2RlIGJsb2F0LgorICAgICAgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19pbnRlZ3JhbDxLPjo6dmFsdWU+Ojp0eXBlPgorICBUJiBvcGVyYXRvcltdKGtleV9hcmc8Sz4mJiBrZXkpIHsKKyAgICByZXR1cm4gZWxlbWVudHNfW3N0ZDo6Zm9yd2FyZDxLPihrZXkpXS5zZWNvbmQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSyA9IGtleV90eXBlPgorICBjb25zdCBUJiBhdChjb25zdCBrZXlfYXJnPEs+JiBrZXkpIGNvbnN0IHsKKyAgICBjb25zdF9pdGVyYXRvciBpdCA9IGZpbmQoa2V5KTsKKyAgICBHT09HTEVfQ0hFQ0soaXQgIT0gZW5kKCkpIDw8ICJrZXkgbm90IGZvdW5kOiAiIDw8IHN0YXRpY19jYXN0PEtleT4oa2V5KTsKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLID0ga2V5X3R5cGU+CisgIFQmIGF0KGNvbnN0IGtleV9hcmc8Sz4mIGtleSkgeworICAgIGl0ZXJhdG9yIGl0ID0gZmluZChrZXkpOworICAgIEdPT0dMRV9DSEVDSyhpdCAhPSBlbmQoKSkgPDwgImtleSBub3QgZm91bmQ6ICIgPDwgc3RhdGljX2Nhc3Q8S2V5PihrZXkpOworICAgIHJldHVybiBpdC0+c2Vjb25kOworICB9CisKKyAgLy8gTG9va3VwCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLID0ga2V5X3R5cGU+CisgIHNpemVfdHlwZSBjb3VudChjb25zdCBrZXlfYXJnPEs+JiBrZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmluZChrZXkpID09IGVuZCgpID8gMCA6IDE7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSyA9IGtleV90eXBlPgorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IGtleV9hcmc8Sz4mIGtleSkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihlbGVtZW50c18uZmluZChrZXkpKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSyA9IGtleV90eXBlPgorICBpdGVyYXRvciBmaW5kKGNvbnN0IGtleV9hcmc8Sz4mIGtleSkgeworICAgIHJldHVybiBpdGVyYXRvcihlbGVtZW50c18uZmluZChrZXkpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLID0ga2V5X3R5cGU+CisgIGJvb2wgY29udGFpbnMoY29uc3Qga2V5X2FyZzxLPiYga2V5KSBjb25zdCB7CisgICAgcmV0dXJuIGZpbmQoa2V5KSAhPSBlbmQoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLID0ga2V5X3R5cGU+CisgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKAorICAgICAgY29uc3Qga2V5X2FyZzxLPiYga2V5KSBjb25zdCB7CisgICAgY29uc3RfaXRlcmF0b3IgaXQgPSBmaW5kKGtleSk7CisgICAgaWYgKGl0ID09IGVuZCgpKSB7CisgICAgICByZXR1cm4gc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4oaXQsIGl0KTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4gPSBpdCsrOworICAgICAgcmV0dXJuIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+KGJlZ2luLCBpdCk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEsgPSBrZXlfdHlwZT4KKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X2FyZzxLPiYga2V5KSB7CisgICAgaXRlcmF0b3IgaXQgPSBmaW5kKGtleSk7CisgICAgaWYgKGl0ID09IGVuZCgpKSB7CisgICAgICByZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4oaXQsIGl0KTsKKyAgICB9IGVsc2UgeworICAgICAgaXRlcmF0b3IgYmVnaW4gPSBpdCsrOworICAgICAgcmV0dXJuIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+KGJlZ2luLCBpdCk7CisgICAgfQorICB9CisKKyAgLy8gaW5zZXJ0CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZS4uLiBBcmdzPgorICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IHRyeV9lbXBsYWNlKEsmJiBrLCBBcmdzJiYuLi4gYXJncykgeworICAgIGF1dG8gcCA9CisgICAgICAgIGVsZW1lbnRzXy50cnlfZW1wbGFjZShzdGQ6OmZvcndhcmQ8Sz4oayksIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgcmV0dXJuIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IocC5maXJzdCksIHAuc2Vjb25kKTsKKyAgfQorICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydChjb25zdCB2YWx1ZV90eXBlJiB2YWx1ZSkgeworICAgIHJldHVybiB0cnlfZW1wbGFjZSh2YWx1ZS5maXJzdCwgdmFsdWUuc2Vjb25kKTsKKyAgfQorICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydCh2YWx1ZV90eXBlJiYgdmFsdWUpIHsKKyAgICByZXR1cm4gdHJ5X2VtcGxhY2UodmFsdWUuZmlyc3QsIHN0ZDo6bW92ZSh2YWx1ZS5zZWNvbmQpKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBlbXBsYWNlKEFyZ3MmJi4uLiBhcmdzKSB7CisgICAgcmV0dXJuIGluc2VydCh2YWx1ZV90eXBlKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikpOworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0PgorICB2b2lkIGluc2VydChJbnB1dEl0IGZpcnN0LCBJbnB1dEl0IGxhc3QpIHsKKyAgICBmb3IgKDsgZmlyc3QgIT0gbGFzdDsgKytmaXJzdCkgeworICAgICAgdHJ5X2VtcGxhY2UoZmlyc3QtPmZpcnN0LCBmaXJzdC0+c2Vjb25kKTsKKyAgICB9CisgIH0KKyAgdm9pZCBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IHZhbHVlcykgeworICAgIGluc2VydCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKyAgfQorCisgIC8vIEVyYXNlIGFuZCBjbGVhcgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSyA9IGtleV90eXBlPgorICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X2FyZzxLPiYga2V5KSB7CisgICAgaXRlcmF0b3IgaXQgPSBmaW5kKGtleSk7CisgICAgaWYgKGl0ID09IGVuZCgpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgZXJhc2UoaXQpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIHBvcykgeworICAgIGl0ZXJhdG9yIGkgPSBwb3MrKzsKKyAgICBlbGVtZW50c18uZXJhc2UoaS5pdF8pOworICAgIHJldHVybiBwb3M7CisgIH0KKyAgdm9pZCBlcmFzZShpdGVyYXRvciBmaXJzdCwgaXRlcmF0b3IgbGFzdCkgeworICAgIHdoaWxlIChmaXJzdCAhPSBsYXN0KSB7CisgICAgICBmaXJzdCA9IGVyYXNlKGZpcnN0KTsKKyAgICB9CisgIH0KKyAgdm9pZCBjbGVhcigpIHsgZWxlbWVudHNfLmNsZWFyKCk7IH0KKworICAvLyBBc3NpZ24KKyAgTWFwJiBvcGVyYXRvcj0oY29uc3QgTWFwJiBvdGhlcikgeworICAgIGlmICh0aGlzICE9ICZvdGhlcikgeworICAgICAgY2xlYXIoKTsKKyAgICAgIGluc2VydChvdGhlci5iZWdpbigpLCBvdGhlci5lbmQoKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgc3dhcChNYXAmIG90aGVyKSB7CisgICAgaWYgKGFyZW5hKCkgPT0gb3RoZXIuYXJlbmEoKSkgeworICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVE9ETyh6dWd1YW5nKTogb3B0aW1pemUgdGhpcy4gVGhlIHRlbXBvcmFyeSBjb3B5IGNhbiBiZSBhbGxvY2F0ZWQKKyAgICAgIC8vIGluIHRoZSBzYW1lIGFyZW5hIGFzIHRoZSBvdGhlciBtZXNzYWdlLCBhbmQgdGhlICJvdGhlciA9IGNvcHkiIGNhbgorICAgICAgLy8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgZmFzdC1wYXRoIHN3YXAgYWJvdmUuCisgICAgICBNYXAgY29weSA9ICp0aGlzOworICAgICAgKnRoaXMgPSBvdGhlcjsKKyAgICAgIG90aGVyID0gY29weTsKKyAgICB9CisgIH0KKworICB2b2lkIEludGVybmFsU3dhcChNYXAmIG90aGVyKSB7IGVsZW1lbnRzXy5Td2FwKCZvdGhlci5lbGVtZW50c18pOyB9CisKKyAgLy8gQWNjZXNzIHRvIGhhc2hlci4gIEN1cnJlbnRseSB0aGlzIHJldHVybnMgYSBjb3B5LCBidXQgaXQgbWF5CisgIC8vIGJlIG1vZGlmaWVkIHRvIHJldHVybiBhIGNvbnN0IHJlZmVyZW5jZSBpbiB0aGUgZnV0dXJlLgorICBoYXNoZXIgaGFzaF9mdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIGVsZW1lbnRzXy5oYXNoX2Z1bmN0aW9uKCk7IH0KKworICBzaXplX3QgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKSBjb25zdCB7CisgICAgaWYgKGVtcHR5KCkpIHJldHVybiAwOworICAgIHJldHVybiBlbGVtZW50c18uU3BhY2VVc2VkSW50ZXJuYWwoKSArIGludGVybmFsOjpTcGFjZVVzZWRJblZhbHVlcyh0aGlzKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgQXJlbmEqIGFyZW5hKCkgY29uc3QgeyByZXR1cm4gZWxlbWVudHNfLmFyZW5hKCk7IH0KKyAgSW5uZXJNYXAgZWxlbWVudHNfOworCisgIGZyaWVuZCBjbGFzcyBBcmVuYTsKKyAgdXNpbmcgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfID0gdm9pZDsKKyAgdXNpbmcgRGVzdHJ1Y3RvclNraXBwYWJsZV8gPSB2b2lkOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgSywgdHlwZW5hbWUgViwKKyAgICAgICAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtleV93aXJlX3R5cGUsCisgICAgICAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSB2YWx1ZV93aXJlX3R5cGU+CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6TWFwRmllbGRMaXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX01BUF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2VudHJ5LmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9lbnRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNmRlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9lbnRyeS5oCkBAIC0wLDAgKzEsMTM0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTUFQX0VOVFJZX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUFQX0VOVFJZX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfZW50cnlfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfdHlwZV9oYW5kbGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKKyNpZmRlZiBTV0lHCisjZXJyb3IgIllvdSBjYW5ub3QgU1dJRyBwcm90byBoZWFkZXJzIgorI2VuZGlmCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK2NsYXNzIEFyZW5hOworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFZhbHVlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga0tleUZpZWxkVHlwZSwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtWYWx1ZUZpZWxkVHlwZT4KK2NsYXNzIE1hcEZpZWxkOworfQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIE1hcEVudHJ5IGlzIHRoZSByZXR1cm5lZCBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHdoZW4gY2FsbGluZyBBZGRNZXNzYWdlIG9mCisvLyBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uLiBJbiBvcmRlciB0byBsZXQgaXQgd29yayB3aXRoIGdlbmVyYXRlZCBtZXNzYWdlCisvLyByZWZsZWN0aW9uLCBpdHMgaW4tbWVtb3J5IHR5cGUgaXMgdGhlIHNhbWUgYXMgZ2VuZXJhdGVkIG1lc3NhZ2Ugd2l0aCB0aGUgc2FtZQorLy8gZmllbGRzLiBIb3dldmVyLCBpbiBvcmRlciB0byBkZWNpZGUgdGhlIGluLW1lbW9yeSB0eXBlIG9mIGtleS92YWx1ZSwgd2UgbmVlZAorLy8gdG8ga25vdyBib3RoIHRoZWlyIGNwcCB0eXBlIGluIGdlbmVyYXRlZCBhcGkgYW5kIHByb3RvIHR5cGUuIEluCisvLyBpbXBsZW1lbnRhdGlvbiwgYWxsIGluLW1lbW9yeSB0eXBlcyBoYXZlIHJlbGF0ZWQgd2lyZSBmb3JtYXQgZnVuY3Rpb25zIHRvCisvLyBzdXBwb3J0IGV4Y2VwdCBBcmVuYVN0cmluZ1B0ci4gVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIGRlZmluZSBhbm90aGVyIHR5cGUgd2l0aAorLy8gc3VwcG9ydGluZyB3aXJlIGZvcm1hdCBmdW5jdGlvbnMuIFNpbmNlIHRoaXMgdHlwZSBpcyBvbmx5IHVzZWQgYXMgcmV0dXJuIHR5cGUKKy8vIG9mIE1hcEVudHJ5IGFjY2Vzc29ycywgaXQncyBuYW1lZCBNYXBFbnRyeSBhY2Nlc3NvciB0eXBlLgorLy8KKy8vIGNwcCB0eXBlOiAgICAgICAgICAgICAgIHRoZSB0eXBlIHZpc2libGUgdG8gdXNlcnMgaW4gcHVibGljIEFQSS4KKy8vIHByb3RvIHR5cGU6ICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgb2YgdGhlIGZpZWxkLgorLy8gaW4tbWVtb3J5IHR5cGU6ICAgICAgICAgdHlwZSBvZiB0aGUgZGF0YSBtZW1iZXIgdXNlZCB0byBzdG9yZWQgdGhpcyBmaWVsZC4KKy8vIE1hcEVudHJ5IGFjY2Vzc29yIHR5cGU6IHR5cGUgdXNlZCBpbiBNYXBFbnRyeSBnZXR0ZXJzL211dGF0b3JzIHRvIGFjY2VzcyB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLgorLy8KKy8vIGNwcCB0eXBlIHwgcHJvdG8gdHlwZSAgfCBpbi1tZW1vcnkgdHlwZSB8IE1hcEVudHJ5IGFjY2Vzc29yIHR5cGUKKy8vIGludDMyX3QgICAgVFlQRV9JTlQzMiAgICBpbnQzMl90ICAgICAgICAgIGludDMyX3QKKy8vIGludDMyX3QgICAgVFlQRV9GSVhFRDMyICBpbnQzMl90ICAgICAgICAgIGludDMyX3QKKy8vIHN0cmluZyAgICAgVFlQRV9TVFJJTkcgICBBcmVuYVN0cmluZ1B0ciAgIHN0cmluZworLy8gRm9vRW51bSAgICBUWVBFX0VOVU0gICAgIGludCAgICAgICAgICAgICAgaW50CisvLyBGb29NZXNzYWdlIFRZUEVfTUVTU0FHRSAgRm9vTWVzc2FnZSogICAgICBGb29NZXNzYWdlCisvLworLy8gVGhlIGluLW1lbW9yeSB0eXBlcyBvZiBwcmltaXRpdmUgdHlwZXMgY2FuIGJlIGluZmVycmVkIGZyb20gaXRzIHByb3RvIHR5cGUsCisvLyB3aGlsZSB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgY3BwIHR5cGUgaWYgcHJvdG8gdHlwZSBpcworLy8gVFlQRV9NRVNTQUdFIHRvIGluZmVyIHRoZSBpbi1tZW1vcnkgdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFZhbHVlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga0tleUZpZWxkVHlwZSwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtWYWx1ZUZpZWxkVHlwZT4KK2NsYXNzIE1hcEVudHJ5IDogcHVibGljIE1hcEVudHJ5SW1wbDxEZXJpdmVkLCBNZXNzYWdlLCBLZXksIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlGaWVsZFR5cGUsIGtWYWx1ZUZpZWxkVHlwZT4geworIHB1YmxpYzoKKyAgY29uc3RleHByIE1hcEVudHJ5KCkge30KKyAgZXhwbGljaXQgTWFwRW50cnkoQXJlbmEqIGFyZW5hKQorICAgICAgOiBNYXBFbnRyeUltcGw8RGVyaXZlZCwgTWVzc2FnZSwgS2V5LCBWYWx1ZSwga0tleUZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGtWYWx1ZUZpZWxkVHlwZT4oYXJlbmEpIHt9CisgIH5NYXBFbnRyeSgpIG92ZXJyaWRlIHsKKyAgICBNZXNzYWdlOjpfaW50ZXJuYWxfbWV0YWRhdGFfLnRlbXBsYXRlIERlbGV0ZTxVbmtub3duRmllbGRTZXQ+KCk7CisgIH0KKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWFwRW50cnlJbXBsPERlcml2ZWQsIE1lc3NhZ2UsIEtleSwgVmFsdWUsIGtLZXlGaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWYWx1ZUZpZWxkVHlwZT46OktleVR5cGVIYW5kbGVyIEtleVR5cGVIYW5kbGVyOworICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBNYXBFbnRyeUltcGw8RGVyaXZlZCwgTWVzc2FnZSwgS2V5LCBWYWx1ZSwga0tleUZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVmFsdWVGaWVsZFR5cGU+OjpWYWx1ZVR5cGVIYW5kbGVyIFZhbHVlVHlwZUhhbmRsZXI7CisgIHNpemVfdCBTcGFjZVVzZWRMb25nKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKERlcml2ZWQpOworICAgIHNpemUgKz0gS2V5VHlwZUhhbmRsZXI6OlNwYWNlVXNlZEluTWFwRW50cnlMb25nKHRoaXMtPmtleV8pOworICAgIHNpemUgKz0gVmFsdWVUeXBlSGFuZGxlcjo6U3BhY2VVc2VkSW5NYXBFbnRyeUxvbmcodGhpcy0+dmFsdWVfKTsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEMsIHR5cGVuYW1lIEssIHR5cGVuYW1lIFYsCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtfd2lyZV90eXBlLCBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlPgorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6Ok1hcEZpZWxkOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNYXBFbnRyeSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9NQVBfRU5UUllfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9lbnRyeV9saXRlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9lbnRyeV9saXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwOGNkOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2VudHJ5X2xpdGUuaApAQCAtMCwwICsxLDU2MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX01BUF9FTlRSWV9MSVRFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUFQX0VOVFJZX0xJVEVfSF9fCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfdHlwZV9oYW5kbGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BhcnNlX2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKyNpZmRlZiBTV0lHCisjZXJyb3IgIllvdSBjYW5ub3QgU1dJRyBwcm90byBoZWFkZXJzIgorI2VuZGlmCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBWYWx1ZSwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtLZXlGaWVsZFR5cGUsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrVmFsdWVGaWVsZFR5cGU+CitjbGFzcyBNYXBFbnRyeTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFZhbHVlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga0tleUZpZWxkVHlwZSwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtWYWx1ZUZpZWxkVHlwZT4KK2NsYXNzIE1hcEZpZWxkTGl0ZTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIE1vdmVIZWxwZXI6Ok1vdmUgaXMgdXNlZCB0byBzZXQgKmRlc3QuICBJdCBjb3BpZXMgKnNyYywgb3IgbW92ZXMgaXQgKGluCisvLyB0aGUgQysrMTEgc2Vuc2UpLCBvciBzd2FwcyBpdC4gKnNyYyBpcyBsZWZ0IGluIGEgc2FuZSBzdGF0ZSBmb3IKKy8vIHN1YnNlcXVlbnQgZGVzdHJ1Y3Rpb24sIGJ1dCBzaG91bGRuJ3QgYmUgdXNlZCBmb3IgYW55dGhpbmcuCit0ZW1wbGF0ZSA8Ym9vbCBpc19lbnVtLCBib29sIGlzX21lc3NhZ2UsIGJvb2wgaXNfc3RyaW5nbGlrZSwgdHlwZW5hbWUgVD4KK3N0cnVjdCBNb3ZlSGVscGVyIHsgIC8vIHByaW1pdGl2ZXMKKyAgc3RhdGljIHZvaWQgTW92ZShUKiBzcmMsIFQqIGRlc3QpIHsgKmRlc3QgPSAqc3JjOyB9Cit9OworCit0ZW1wbGF0ZSA8Ym9vbCBpc19tZXNzYWdlLCBib29sIGlzX3N0cmluZ2xpa2UsIHR5cGVuYW1lIFQ+CitzdHJ1Y3QgTW92ZUhlbHBlcjx0cnVlLCBpc19tZXNzYWdlLCBpc19zdHJpbmdsaWtlLCBUPiB7ICAvLyBlbnVtcworICBzdGF0aWMgdm9pZCBNb3ZlKFQqIHNyYywgVCogZGVzdCkgeyAqZGVzdCA9ICpzcmM7IH0KKyAgLy8gVCBpcyBhbiBlbnVtIGhlcmUsIHNvIGFsbG93IGNvbnZlcnNpb25zIHRvIGFuZCBmcm9tIGludC4KKyAgc3RhdGljIHZvaWQgTW92ZShUKiBzcmMsIGludCogZGVzdCkgeyAqZGVzdCA9IHN0YXRpY19jYXN0PGludD4oKnNyYyk7IH0KKyAgc3RhdGljIHZvaWQgTW92ZShpbnQqIHNyYywgVCogZGVzdCkgeyAqZGVzdCA9IHN0YXRpY19jYXN0PFQ+KCpzcmMpOyB9Cit9OworCit0ZW1wbGF0ZSA8Ym9vbCBpc19zdHJpbmdsaWtlLCB0eXBlbmFtZSBUPgorc3RydWN0IE1vdmVIZWxwZXI8ZmFsc2UsIHRydWUsIGlzX3N0cmluZ2xpa2UsIFQ+IHsgIC8vIG1lc3NhZ2VzCisgIHN0YXRpYyB2b2lkIE1vdmUoVCogc3JjLCBUKiBkZXN0KSB7IGRlc3QtPlN3YXAoc3JjKTsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgTW92ZUhlbHBlcjxmYWxzZSwgZmFsc2UsIHRydWUsIFQ+IHsgIC8vIHN0cmluZ3MgYW5kIHNpbWlsYXIKKyAgc3RhdGljIHZvaWQgTW92ZShUKiBzcmMsIFQqIGRlc3QpIHsKKyAgICAqZGVzdCA9IHN0ZDo6bW92ZSgqc3JjKTsKKyAgfQorfTsKKworLy8gTWFwRW50cnlJbXBsIGlzIHVzZWQgdG8gaW1wbGVtZW50IHBhcnNpbmcgYW5kIHNlcmlhbGl6YXRpb24gb2YgbWFwIGVudHJpZXMuCisvLyBJdCB1c2VzIEN1cmlvdXMgUmVjdXJzaXZlIFRlbXBsYXRlIFBhdHRlcm4gKENSVFApIHRvIHByb3ZpZGUgdGhlIHR5cGUgb2YKKy8vIHRoZSBldmVudHVhbCBjb2RlIHRvIHRoZSB0ZW1wbGF0ZSBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIEJhc2UsIHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVmFsdWUsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrS2V5RmllbGRUeXBlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga1ZhbHVlRmllbGRUeXBlPgorY2xhc3MgTWFwRW50cnlJbXBsIDogcHVibGljIEJhc2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBNYXBFbnRyeUZ1bmNzPEtleSwgVmFsdWUsIGtLZXlGaWVsZFR5cGUsIGtWYWx1ZUZpZWxkVHlwZT4gRnVuY3M7CisKKyBwcm90ZWN0ZWQ6CisgIC8vIFByb3ZpZGUgdXRpbGl0aWVzIHRvIHBhcnNlL3NlcmlhbGl6ZSBrZXkvdmFsdWUuICBQcm92aWRlIHV0aWxpdGllcyB0bworICAvLyBtYW5pcHVsYXRlIGludGVybmFsIHN0b3JlZCB0eXBlLgorICB0eXBlZGVmIE1hcFR5cGVIYW5kbGVyPGtLZXlGaWVsZFR5cGUsIEtleT4gS2V5VHlwZUhhbmRsZXI7CisgIHR5cGVkZWYgTWFwVHlwZUhhbmRsZXI8a1ZhbHVlRmllbGRUeXBlLCBWYWx1ZT4gVmFsdWVUeXBlSGFuZGxlcjsKKworICAvLyBEZWZpbmUgaW50ZXJuYWwgbWVtb3J5IGxheW91dC4gU3RyaW5ncyBhbmQgbWVzc2FnZXMgYXJlIHN0b3JlZCBhcworICAvLyBwb2ludGVycywgd2hpbGUgb3RoZXIgdHlwZXMgYXJlIHN0b3JlZCBhcyB2YWx1ZXMuCisgIHR5cGVkZWYgdHlwZW5hbWUgS2V5VHlwZUhhbmRsZXI6OlR5cGVPbk1lbW9yeSBLZXlPbk1lbW9yeTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBWYWx1ZVR5cGVIYW5kbGVyOjpUeXBlT25NZW1vcnkgVmFsdWVPbk1lbW9yeTsKKworICAvLyBFbnVtIHR5cGUgY2Fubm90IGJlIHVzZWQgZm9yIE1hcFR5cGVIYW5kbGVyOjpSZWFkLiBEZWZpbmUgYSB0eXBlCisgIC8vIHdoaWNoIHdpbGwgcmVwbGFjZSBFbnVtIHdpdGggaW50LgorICB0eXBlZGVmIHR5cGVuYW1lIEtleVR5cGVIYW5kbGVyOjpNYXBFbnRyeUFjY2Vzc29yVHlwZSBLZXlNYXBFbnRyeUFjY2Vzc29yVHlwZTsKKyAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgVmFsdWVUeXBlSGFuZGxlcjo6TWFwRW50cnlBY2Nlc3NvclR5cGUgVmFsdWVNYXBFbnRyeUFjY2Vzc29yVHlwZTsKKworICAvLyBDb25zdGFudHMgZm9yIGZpZWxkIG51bWJlci4KKyAgc3RhdGljIGNvbnN0IGludCBrS2V5RmllbGROdW1iZXIgPSAxOworICBzdGF0aWMgY29uc3QgaW50IGtWYWx1ZUZpZWxkTnVtYmVyID0gMjsKKworICAvLyBDb25zdGFudHMgZm9yIGZpZWxkIHRhZy4KKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0tleVRhZyA9CisgICAgICBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTUFLRV9UQUcoa0tleUZpZWxkTnVtYmVyLCBLZXlUeXBlSGFuZGxlcjo6a1dpcmVUeXBlKTsKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1ZhbHVlVGFnID0gR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX01BS0VfVEFHKAorICAgICAga1ZhbHVlRmllbGROdW1iZXIsIFZhbHVlVHlwZUhhbmRsZXI6OmtXaXJlVHlwZSk7CisgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RhZ1NpemUgPSAxOworCisgcHVibGljOgorICAvLyBXb3JrLWFyb3VuZCBmb3IgYSBjb21waWxlciBidWcgKHNlZSByZXBlYXRlZF9maWVsZC5oKS4KKyAgdHlwZWRlZiB2b2lkIE1hcEVudHJ5SGFzTWVyZ2VUeXBlVHJhaXQ7CisgIHR5cGVkZWYgRGVyaXZlZCBFbnRyeVR5cGU7CisgIHR5cGVkZWYgS2V5IEVudHJ5S2V5VHlwZTsKKyAgdHlwZWRlZiBWYWx1ZSBFbnRyeVZhbHVlVHlwZTsKKyAgc3RhdGljIGNvbnN0IFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga0VudHJ5S2V5RmllbGRUeXBlID0ga0tleUZpZWxkVHlwZTsKKyAgc3RhdGljIGNvbnN0IFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga0VudHJ5VmFsdWVGaWVsZFR5cGUgPSBrVmFsdWVGaWVsZFR5cGU7CisKKyAgY29uc3RleHByIE1hcEVudHJ5SW1wbCgpCisgICAgICA6IGtleV8oS2V5VHlwZUhhbmRsZXI6OkNvbnN0aW5pdCgpKSwKKyAgICAgICAgdmFsdWVfKFZhbHVlVHlwZUhhbmRsZXI6OkNvbnN0aW5pdCgpKSwKKyAgICAgICAgX2hhc19iaXRzX3t9IHt9CisKKyAgZXhwbGljaXQgTWFwRW50cnlJbXBsKEFyZW5hKiBhcmVuYSkKKyAgICAgIDogQmFzZShhcmVuYSksCisgICAgICAgIGtleV8oS2V5VHlwZUhhbmRsZXI6OkNvbnN0aW5pdCgpKSwKKyAgICAgICAgdmFsdWVfKFZhbHVlVHlwZUhhbmRsZXI6OkNvbnN0aW5pdCgpKSwKKyAgICAgICAgX2hhc19iaXRzX3t9IHt9CisKKyAgfk1hcEVudHJ5SW1wbCgpIG92ZXJyaWRlIHsKKyAgICBpZiAoQmFzZTo6R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgIT0gbnVsbHB0cikgcmV0dXJuOworICAgIEtleVR5cGVIYW5kbGVyOjpEZWxldGVOb0FyZW5hKGtleV8pOworICAgIFZhbHVlVHlwZUhhbmRsZXI6OkRlbGV0ZU5vQXJlbmEodmFsdWVfKTsKKyAgfQorCisgIC8vIGFjY2Vzc29ycyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICB2aXJ0dWFsIGlubGluZSBjb25zdCBLZXlNYXBFbnRyeUFjY2Vzc29yVHlwZSYga2V5KCkgY29uc3QgeworICAgIHJldHVybiBLZXlUeXBlSGFuZGxlcjo6R2V0RXh0ZXJuYWxSZWZlcmVuY2Uoa2V5Xyk7CisgIH0KKyAgdmlydHVhbCBpbmxpbmUgY29uc3QgVmFsdWVNYXBFbnRyeUFjY2Vzc29yVHlwZSYgdmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlVHlwZUhhbmRsZXI6OkRlZmF1bHRJZk5vdEluaXRpYWxpemVkKHZhbHVlXyk7CisgIH0KKyAgaW5saW5lIEtleU1hcEVudHJ5QWNjZXNzb3JUeXBlKiBtdXRhYmxlX2tleSgpIHsKKyAgICBzZXRfaGFzX2tleSgpOworICAgIHJldHVybiBLZXlUeXBlSGFuZGxlcjo6RW5zdXJlTXV0YWJsZSgma2V5XywgQmFzZTo6R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIGlubGluZSBWYWx1ZU1hcEVudHJ5QWNjZXNzb3JUeXBlKiBtdXRhYmxlX3ZhbHVlKCkgeworICAgIHNldF9oYXNfdmFsdWUoKTsKKyAgICByZXR1cm4gVmFsdWVUeXBlSGFuZGxlcjo6RW5zdXJlTXV0YWJsZSgmdmFsdWVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2U6OkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZUxpdGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvLyBNYXBFbnRyeUltcGwgaXMgZm9yIGltcGxlbWVudGF0aW9uIG9ubHkgYW5kIHRoaXMgZnVuY3Rpb24gaXNuJ3QgY2FsbGVkCisgIC8vIGFueXdoZXJlLiBKdXN0IHByb3ZpZGUgYSBmYWtlIGltcGxlbWVudGF0aW9uIGhlcmUgZm9yIE1lc3NhZ2VMaXRlLgorICBzdGQ6OnN0cmluZyBHZXRUeXBlTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICIiOyB9CisKKyAgdm9pZCBDaGVja1R5cGVBbmRNZXJnZUZyb20oY29uc3QgTWVzc2FnZUxpdGUmIG90aGVyKSBvdmVycmlkZSB7CisgICAgTWVyZ2VGcm9tSW50ZXJuYWwoKjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkRvd25DYXN0PGNvbnN0IERlcml2ZWQqPigmb3RoZXIpKTsKKyAgfQorCisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsIHsKKyAgICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgICAgdWludDMyX3QgdGFnOworICAgICAgcHRyID0gUmVhZFRhZyhwdHIsICZ0YWcpOworICAgICAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgICAgIGlmICh0YWcgPT0ga0tleVRhZykgeworICAgICAgICBzZXRfaGFzX2tleSgpOworICAgICAgICBLZXlNYXBFbnRyeUFjY2Vzc29yVHlwZSoga2V5ID0gbXV0YWJsZV9rZXkoKTsKKyAgICAgICAgcHRyID0gS2V5VHlwZUhhbmRsZXI6OlJlYWQocHRyLCBjdHgsIGtleSk7CisgICAgICAgIGlmICghRGVyaXZlZDo6VmFsaWRhdGVLZXkoa2V5KSkgcmV0dXJuIG51bGxwdHI7CisgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBrVmFsdWVUYWcpIHsKKyAgICAgICAgc2V0X2hhc192YWx1ZSgpOworICAgICAgICBWYWx1ZU1hcEVudHJ5QWNjZXNzb3JUeXBlKiB2YWx1ZSA9IG11dGFibGVfdmFsdWUoKTsKKyAgICAgICAgcHRyID0gVmFsdWVUeXBlSGFuZGxlcjo6UmVhZChwdHIsIGN0eCwgdmFsdWUpOworICAgICAgICBpZiAoIURlcml2ZWQ6OlZhbGlkYXRlVmFsdWUodmFsdWUpKSByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0YWcgPT0gMCB8fCBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgICAgICByZXR1cm4gcHRyOworICAgICAgICB9CisgICAgICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKHRhZywgc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmcqPihudWxscHRyKSwgcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgpOworICAgICAgfQorICAgICAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgICB9CisgICAgcmV0dXJuIHB0cjsKKyAgfQorCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBvdmVycmlkZSB7CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIHNpemUgKz0ga1RhZ1NpemUgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KEtleVR5cGVIYW5kbGVyOjpCeXRlU2l6ZShrZXkoKSkpOworICAgIHNpemUgKz0ga1RhZ1NpemUgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KFZhbHVlVHlwZUhhbmRsZXI6OkJ5dGVTaXplKHZhbHVlKCkpKTsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIDo6dWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgOjp1aW50OF90KiBwdHIsIGlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBwdHIgPSBLZXlUeXBlSGFuZGxlcjo6V3JpdGUoa0tleUZpZWxkTnVtYmVyLCBrZXkoKSwgcHRyLCBzdHJlYW0pOworICAgIHJldHVybiBWYWx1ZVR5cGVIYW5kbGVyOjpXcml0ZShrVmFsdWVGaWVsZE51bWJlciwgdmFsdWUoKSwgcHRyLCBzdHJlYW0pOworICB9CisKKyAgLy8gRG9uJ3Qgb3ZlcnJpZGUgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheS4gIFVzZSBNZXNzYWdlTGl0ZSdzLgorCisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGludCBzaXplID0gMDsKKyAgICBzaXplICs9IGhhc19rZXkoKSA/IHN0YXRpY19jYXN0PGludD4oa1RhZ1NpemUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlUeXBlSGFuZGxlcjo6R2V0Q2FjaGVkU2l6ZShrZXkoKSkKKyAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgc2l6ZSArPSBoYXNfdmFsdWUoKSA/IHN0YXRpY19jYXN0PGludD4oa1RhZ1NpemUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVHlwZUhhbmRsZXI6OkdldENhY2hlZFNpemUodmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gVmFsdWVUeXBlSGFuZGxlcjo6SXNJbml0aWFsaXplZCh2YWx1ZV8pOworICB9CisKKyAgQmFzZSogTmV3KEFyZW5hKiBhcmVuYSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIERlcml2ZWQqIGVudHJ5ID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8RGVyaXZlZD4oYXJlbmEpOworICAgIHJldHVybiBlbnRyeTsKKyAgfQorCisgcHJvdGVjdGVkOgorICAvLyBXZSBjYW4ndCBkZWNsYXJlIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkgaGVyZSBhcyBpdCB3b3VsZCBoaWRlIHRoZSBvdGhlcgorICAvLyBvdmVybG9hZCAoY29uc3QgTWVzc2FnZSYpLgorICB2b2lkIE1lcmdlRnJvbUludGVybmFsKGNvbnN0IE1hcEVudHJ5SW1wbCYgZnJvbSkgeworICAgIGlmIChmcm9tLl9oYXNfYml0c19bMF0pIHsKKyAgICAgIGlmIChmcm9tLmhhc19rZXkoKSkgeworICAgICAgICBLZXlUeXBlSGFuZGxlcjo6RW5zdXJlTXV0YWJsZSgma2V5XywgQmFzZTo6R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAgICAgICBLZXlUeXBlSGFuZGxlcjo6TWVyZ2UoZnJvbS5rZXkoKSwgJmtleV8sIEJhc2U6OkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgICAgICAgc2V0X2hhc19rZXkoKTsKKyAgICAgIH0KKyAgICAgIGlmIChmcm9tLmhhc192YWx1ZSgpKSB7CisgICAgICAgIFZhbHVlVHlwZUhhbmRsZXI6OkVuc3VyZU11dGFibGUoJnZhbHVlXywgQmFzZTo6R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAgICAgICBWYWx1ZVR5cGVIYW5kbGVyOjpNZXJnZShmcm9tLnZhbHVlKCksICZ2YWx1ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2U6OkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgICAgICAgc2V0X2hhc192YWx1ZSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgcHVibGljOgorICB2b2lkIENsZWFyKCkgb3ZlcnJpZGUgeworICAgIEtleVR5cGVIYW5kbGVyOjpDbGVhcigma2V5XywgQmFzZTo6R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAgIFZhbHVlVHlwZUhhbmRsZXI6OkNsZWFyKCZ2YWx1ZV8sIEJhc2U6OkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgICBjbGVhcl9oYXNfa2V5KCk7CisgICAgY2xlYXJfaGFzX3ZhbHVlKCk7CisgIH0KKworICAvLyBQYXJzaW5nIHVzaW5nIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSwgYWJvdmUsIGlzIG5vdCBhcworICAvLyBlZmZpY2llbnQgYXMgaXQgY291bGQgYmUuICBUaGlzIGhlbHBlciBjbGFzcyBwcm92aWRlcyBhIHNwZWVkaWVyIHdheS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hcEZpZWxkLCB0eXBlbmFtZSBNYXA+CisgIGNsYXNzIFBhcnNlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgUGFyc2VyKE1hcEZpZWxkKiBtZikgOiBtZl8obWYpLCBtYXBfKG1mLT5NdXRhYmxlTWFwKCkpIHt9CisgICAgflBhcnNlcigpIHsKKyAgICAgIGlmIChlbnRyeV8gIT0gbnVsbHB0ciAmJiBlbnRyeV8tPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpCisgICAgICAgIGRlbGV0ZSBlbnRyeV87CisgICAgfQorCisgICAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCkgeworICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRSghY3R4LT5Eb25lKCZwdHIpICYmICpwdHIgPT0ga0tleVRhZykpIHsKKyAgICAgICAgcHRyID0gS2V5VHlwZUhhbmRsZXI6OlJlYWQocHRyICsgMSwgY3R4LCAma2V5Xyk7CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCFwdHIgfHwgIURlcml2ZWQ6OlZhbGlkYXRlS2V5KCZrZXlfKSkpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKCFjdHgtPkRvbmUoJnB0cikgJiYgKnB0ciA9PSBrVmFsdWVUYWcpKSB7CisgICAgICAgICAgdHlwZW5hbWUgTWFwOjpzaXplX3R5cGUgbWFwX3NpemUgPSBtYXBfLT5zaXplKCk7CisgICAgICAgICAgdmFsdWVfcHRyXyA9ICYoKm1hcF8pW2tleV9dOworICAgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUobWFwX3NpemUgIT0gbWFwXy0+c2l6ZSgpKSkgeworICAgICAgICAgICAgdXNpbmcgVCA9CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgTWFwSWY8VmFsdWVUeXBlSGFuZGxlcjo6a0lzRW51bSwgaW50KiwgVmFsdWUqPjo6dHlwZTsKKyAgICAgICAgICAgIHB0ciA9IFZhbHVlVHlwZUhhbmRsZXI6OlJlYWQocHRyICsgMSwgY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFQ+KHZhbHVlX3B0cl8pKTsKKyAgICAgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCFwdHIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFEZXJpdmVkOjpWYWxpZGF0ZVZhbHVlKHZhbHVlX3B0cl8pKSkgeworICAgICAgICAgICAgICBtYXBfLT5lcmFzZShrZXlfKTsgIC8vIEZhaWx1cmUhIFVuZG8gaW5zZXJ0aW9uLgorICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoY3R4LT5Eb25lKCZwdHIpKSkgcmV0dXJuIHB0cjsKKyAgICAgICAgICAgIGlmICghcHRyKSByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIE5ld0VudHJ5KCk7CisgICAgICAgICAgICBWYWx1ZU1vdmVyOjpNb3ZlKHZhbHVlX3B0cl8sIGVudHJ5Xy0+bXV0YWJsZV92YWx1ZSgpKTsKKyAgICAgICAgICAgIG1hcF8tPmVyYXNlKGtleV8pOworICAgICAgICAgICAgZ290byBtb3ZlX2tleTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCFwdHIpIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIE5ld0VudHJ5KCk7CisgICAgICBtb3ZlX2tleToKKyAgICAgICAgS2V5TW92ZXI6Ok1vdmUoJmtleV8sIGVudHJ5Xy0+bXV0YWJsZV9rZXkoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXB0cikgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIE5ld0VudHJ5KCk7CisgICAgICB9CisgICAgICBwdHIgPSBlbnRyeV8tPl9JbnRlcm5hbFBhcnNlKHB0ciwgY3R4KTsKKyAgICAgIGlmIChwdHIpIFVzZUtleUFuZFZhbHVlRnJvbUVudHJ5KCk7CisgICAgICByZXR1cm4gcHRyOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVbmtub3duVHlwZT4KKyAgICBjb25zdCBjaGFyKiBQYXJzZVdpdGhFbnVtVmFsaWRhdGlvbihjb25zdCBjaGFyKiBwdHIsIFBhcnNlQ29udGV4dCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc192YWxpZCkoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaWVsZF9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxNZXRhZGF0YSogbWV0YWRhdGEpIHsKKyAgICAgIGF1dG8gZW50cnkgPSBOZXdFbnRyeSgpOworICAgICAgcHRyID0gZW50cnktPl9JbnRlcm5hbFBhcnNlKHB0ciwgY3R4KTsKKyAgICAgIGlmICghcHRyKSByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGlmIChpc192YWxpZChlbnRyeS0+dmFsdWUoKSkpIHsKKyAgICAgICAgVXNlS2V5QW5kVmFsdWVGcm9tRW50cnkoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFdyaXRlTGVuZ3RoRGVsaW1pdGVkKGZpZWxkX251bSwgZW50cnktPlNlcmlhbGl6ZUFzU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLT5tdXRhYmxlX3Vua25vd25fZmllbGRzPFVua25vd25UeXBlPigpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwdHI7CisgICAgfQorCisgICAgTWFwRW50cnlJbXBsKiBOZXdFbnRyeSgpIHsgcmV0dXJuIGVudHJ5XyA9IG1mXy0+TmV3RW50cnkoKTsgfQorCisgICAgY29uc3QgS2V5JiBrZXkoKSBjb25zdCB7IHJldHVybiBrZXlfOyB9CisgICAgY29uc3QgVmFsdWUmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gKnZhbHVlX3B0cl87IH0KKworICAgIGNvbnN0IEtleSYgZW50cnlfa2V5KCkgY29uc3QgeyByZXR1cm4gZW50cnlfLT5rZXkoKTsgfQorICAgIGNvbnN0IFZhbHVlJiBlbnRyeV92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGVudHJ5Xy0+dmFsdWUoKTsgfQorCisgICBwcml2YXRlOgorICAgIHZvaWQgVXNlS2V5QW5kVmFsdWVGcm9tRW50cnkoKSB7CisgICAgICAvLyBVcGRhdGUga2V5XyBpbiBjYXNlIHdlIG5lZWQgaXQgbGF0ZXIgKGJlY2F1c2Uga2V5KCkgaXMgY2FsbGVkKS4KKyAgICAgIC8vIFRoaXMgaXMgcG90ZW50aWFsbHkgaW5lZmZpY2llbnQsIGVzcGVjaWFsbHkgaWYgdGhlIGtleSBpcworICAgICAgLy8gZXhwZW5zaXZlIHRvIGNvcHkgKGUuZy4sIGEgbG9uZyBzdHJpbmcpLCBidXQgdGhpcyBpcyBhIGNvbGQKKyAgICAgIC8vIHBhdGgsIHNvIGl0J3Mgbm90IGEgYmlnIGRlYWwuCisgICAgICBrZXlfID0gZW50cnlfLT5rZXkoKTsKKyAgICAgIHZhbHVlX3B0cl8gPSAmKCptYXBfKVtrZXlfXTsKKyAgICAgIFZhbHVlTW92ZXI6Ok1vdmUoZW50cnlfLT5tdXRhYmxlX3ZhbHVlKCksIHZhbHVlX3B0cl8pOworICAgIH0KKworICAgIC8vIEFmdGVyIHJlYWRpbmcgYSBrZXkgYW5kIHZhbHVlIHN1Y2Nlc3NmdWxseSwgYW5kIGluc2VydGluZyB0aGF0IGRhdGEKKyAgICAvLyBpbnRvIG1hcF8sIHdlIGFyZSBub3QgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuICBUaGlzIGlzIHVudXN1YWwsIGJ1dAorICAgIC8vIGFsbG93ZWQgYnkgdGhlIHNwZWMuCisgICAgYm9vbCBSZWFkQmV5b25kS2V5VmFsdWVQYWlyKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgUFJPVE9CVUZfQ09MRCB7CisgICAgICBOZXdFbnRyeSgpOworICAgICAgVmFsdWVNb3Zlcjo6TW92ZSh2YWx1ZV9wdHJfLCBlbnRyeV8tPm11dGFibGVfdmFsdWUoKSk7CisgICAgICBtYXBfLT5lcmFzZShrZXlfKTsKKyAgICAgIEtleU1vdmVyOjpNb3ZlKCZrZXlfLCBlbnRyeV8tPm11dGFibGVfa2V5KCkpOworICAgICAgY29uc3QgYm9vbCByZXN1bHQgPSBlbnRyeV8tPk1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbnB1dCk7CisgICAgICBpZiAocmVzdWx0KSBVc2VLZXlBbmRWYWx1ZUZyb21FbnRyeSgpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICB0eXBlZGVmIE1vdmVIZWxwZXI8S2V5VHlwZUhhbmRsZXI6OmtJc0VudW0sIEtleVR5cGVIYW5kbGVyOjprSXNNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBLZXlUeXBlSGFuZGxlcjo6a1dpcmVUeXBlID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgS2V5PgorICAgICAgICBLZXlNb3ZlcjsKKyAgICB0eXBlZGVmIE1vdmVIZWxwZXI8VmFsdWVUeXBlSGFuZGxlcjo6a0lzRW51bSwgVmFsdWVUeXBlSGFuZGxlcjo6a0lzTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUeXBlSGFuZGxlcjo6a1dpcmVUeXBlID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgVmFsdWU+CisgICAgICAgIFZhbHVlTW92ZXI7CisKKyAgICBNYXBGaWVsZCogY29uc3QgbWZfOworICAgIE1hcCogY29uc3QgbWFwXzsKKyAgICBLZXkga2V5XzsKKyAgICBWYWx1ZSogdmFsdWVfcHRyXzsKKyAgICBNYXBFbnRyeUltcGwqIGVudHJ5XyA9IG51bGxwdHI7CisgIH07CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgc2V0X2hhc19rZXkoKSB7IF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7IH0KKyAgYm9vbCBoYXNfa2V5KCkgY29uc3QgeyByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsgfQorICB2b2lkIGNsZWFyX2hhc19rZXkoKSB7IF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OyB9CisgIHZvaWQgc2V0X2hhc192YWx1ZSgpIHsgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsgfQorICBib29sIGhhc192YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7IH0KKyAgdm9pZCBjbGVhcl9oYXNfdmFsdWUoKSB7IF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OyB9CisKKyBwdWJsaWM6CisgIGlubGluZSBBcmVuYSogR2V0QXJlbmEoKSBjb25zdCB7IHJldHVybiBCYXNlOjpHZXRBcmVuYSgpOyB9CisKKyBwcm90ZWN0ZWQ6ICAvLyBOZWVkZWQgZm9yIGNvbnN0cnVjdGluZyB0YWJsZXMKKyAgS2V5T25NZW1vcnkga2V5XzsKKyAgVmFsdWVPbk1lbW9yeSB2YWx1ZV87CisgIHVpbnQzMl90IF9oYXNfYml0c19bMV07CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDLCB0eXBlbmFtZSBLLCB0eXBlbmFtZSBWLCBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZT4KKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpNYXBFbnRyeTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEMsIHR5cGVuYW1lIEssIHR5cGVuYW1lIFYsIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUsCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlPgorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6Ok1hcEZpZWxkTGl0ZTsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWFwRW50cnlJbXBsKTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFZhbHVlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga0tleUZpZWxkVHlwZSwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtWYWx1ZUZpZWxkVHlwZT4KK2NsYXNzIE1hcEVudHJ5TGl0ZSA6IHB1YmxpYyBNYXBFbnRyeUltcGw8VCwgTWVzc2FnZUxpdGUsIEtleSwgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlGaWVsZFR5cGUsIGtWYWx1ZUZpZWxkVHlwZT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBNYXBFbnRyeUltcGw8VCwgTWVzc2FnZUxpdGUsIEtleSwgVmFsdWUsIGtLZXlGaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGtWYWx1ZUZpZWxkVHlwZT4KKyAgICAgIFN1cGVyVHlwZTsKKyAgY29uc3RleHByIE1hcEVudHJ5TGl0ZSgpIHt9CisgIGV4cGxpY2l0IE1hcEVudHJ5TGl0ZShBcmVuYSogYXJlbmEpIDogU3VwZXJUeXBlKGFyZW5hKSB7fQorICB+TWFwRW50cnlMaXRlKCkgb3ZlcnJpZGUgeworICAgIE1lc3NhZ2VMaXRlOjpfaW50ZXJuYWxfbWV0YWRhdGFfLnRlbXBsYXRlIERlbGV0ZTxzdGQ6OnN0cmluZz4oKTsKKyAgfQorICB2b2lkIE1lcmdlRnJvbShjb25zdCBNYXBFbnRyeUxpdGUmIG90aGVyKSB7IE1lcmdlRnJvbUludGVybmFsKG90aGVyKTsgfQorCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1hcEVudHJ5TGl0ZSk7Cit9OworCisvLyBIZWxwZXJzIGZvciBkZXRlcm1pbmlzdGljIHNlcmlhbGl6YXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gSXRlcmF0b3IgYmFzZSBmb3IgTWFwU29ydGVyRmxhdCBhbmQgTWFwU29ydGVyUHRyLgordGVtcGxhdGUgPHR5cGVuYW1lIHN0b3JhZ2VfdHlwZT4KK3N0cnVjdCBNYXBTb3J0ZXJJdCB7CisgIHN0b3JhZ2VfdHlwZSogcHRyOworICBNYXBTb3J0ZXJJdChzdG9yYWdlX3R5cGUqIHB0cikgOiBwdHIocHRyKSB7fQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFwU29ydGVySXQmIG90aGVyKSBjb25zdCB7IHJldHVybiBwdHIgPT0gb3RoZXIucHRyOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYXBTb3J0ZXJJdCYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisgIE1hcFNvcnRlckl0JiBvcGVyYXRvcisrKCkgeyArK3B0cjsgcmV0dXJuICp0aGlzOyB9CisgIE1hcFNvcnRlckl0IG9wZXJhdG9yKysoaW50KSB7IGF1dG8gb3RoZXIgPSAqdGhpczsgKytwdHI7IHJldHVybiBvdGhlcjsgfQorICBNYXBTb3J0ZXJJdCBvcGVyYXRvcisoaW50IHYpIHsgcmV0dXJuIE1hcFNvcnRlckl0e3B0ciArIHZ9OyB9Cit9OworCisvLyBNYXBTb3J0ZXJGbGF0IHN0b3JlcyBrZXlzIGlubGluZSB3aXRoIHBvaW50ZXJzIHRvIG1hcCBlbnRyaWVzLCBzbyB0aGF0CisvLyBrZXlzIGNhbiBiZSBjb21wYXJlZCB3aXRob3V0IGluZGlyZWN0aW9uLiBUaGlzIHR5cGUgaXMgdXNlZCBmb3IgbWFwcyB3aXRoCisvLyBrZXlzIHRoYXQgYXJlIG5vdCBzdHJpbmdzLgordGVtcGxhdGUgPHR5cGVuYW1lIE1hcFQ+CitjbGFzcyBNYXBTb3J0ZXJGbGF0IHsKKyBwdWJsaWM6CisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBNYXBUOjp2YWx1ZV90eXBlOworICB1c2luZyBzdG9yYWdlX3R5cGUgPSBzdGQ6OnBhaXI8dHlwZW5hbWUgTWFwVDo6a2V5X3R5cGUsIGNvbnN0IHZhbHVlX3R5cGUqPjsKKworICAvLyBUaGlzIGNvbnN0X2l0ZXJhdG9yIGRlcmVmZXJlbmVzIHRvIHRoZSBtYXAgZW50cnkgc3RvcmVkIGluIHRoZSBzb3J0aW5nCisgIC8vIGFycmF5IHBhaXJzLiBUaGlzIGlzIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUgTWFwOjpjb25zdF9pdGVyYXRvciB0eXBlLAorICAvLyBhbmQgYWxsb3dzIGdlbmVyYXRlZCBjb2RlIHRvIHVzZSB0aGUgc2FtZSBsb29wIGJvZHkgd2l0aCBlaXRoZXIgZm9ybToKKyAgLy8gICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogbWFwKSB7IC4uLiB9CisgIC8vICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IE1hcFNvcnRlckZsYXQobWFwKSkgeyAuLi4gfQorICBzdHJ1Y3QgY29uc3RfaXRlcmF0b3IgOiBwdWJsaWMgTWFwU29ydGVySXQ8c3RvcmFnZV90eXBlPiB7CisgICAgdXNpbmcgcG9pbnRlciA9IGNvbnN0IHR5cGVuYW1lIE1hcFQ6OnZhbHVlX3R5cGUqOworICAgIHVzaW5nIHJlZmVyZW5jZSA9IGNvbnN0IHR5cGVuYW1lIE1hcFQ6OnZhbHVlX3R5cGUmOworICAgIHVzaW5nIE1hcFNvcnRlckl0PHN0b3JhZ2VfdHlwZT46Ok1hcFNvcnRlckl0OworCisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gdGhpcy0+cHRyLT5zZWNvbmQ7IH0KKyAgICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnRoaXMtPm9wZXJhdG9yLT4oKTsgfQorICB9OworCisgIGV4cGxpY2l0IE1hcFNvcnRlckZsYXQoY29uc3QgTWFwVCYgbSkKKyAgICAgIDogc2l6ZV8obS5zaXplKCkpLCBpdGVtc18oc2l6ZV8gPyBuZXcgc3RvcmFnZV90eXBlW3NpemVfXSA6IG51bGxwdHIpIHsKKyAgICBpZiAoIXNpemVfKSByZXR1cm47CisgICAgc3RvcmFnZV90eXBlKiBpdCA9ICZpdGVtc19bMF07CisgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IG0pIHsKKyAgICAgICppdCsrID0ge2VudHJ5LmZpcnN0LCAmZW50cnl9OworICAgIH0KKyAgICBzdGQ6OnNvcnQoJml0ZW1zX1swXSwgJml0ZW1zX1tzaXplX10sCisgICAgICAgICAgICAgIFtdKGNvbnN0IHN0b3JhZ2VfdHlwZSYgYSwgY29uc3Qgc3RvcmFnZV90eXBlJiBiKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGEuZmlyc3QgPCBiLmZpcnN0OworICAgICAgICAgICAgICB9KTsKKyAgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4ge2l0ZW1zXy5nZXQoKX07IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4ge2l0ZW1zXy5nZXQoKSArIHNpemVffTsgfQorCisgcHJpdmF0ZToKKyAgc2l6ZV90IHNpemVfOworICBzdGQ6OnVuaXF1ZV9wdHI8c3RvcmFnZV90eXBlW10+IGl0ZW1zXzsKK307CisKKy8vIE1hcFNvcnRlclB0ciBzdG9yZXMgYW5kIHNvcnRzIHBvaW50ZXJzIHRvIG1hcCBlbnRyaWVzLiBUaGlzIHR5cGUgaXMgdXNlZCBmb3IKKy8vIG1hcHMgd2l0aCBrZXlzIHRoYXQgYXJlIHN0cmluZ3MuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWFwVD4KK2NsYXNzIE1hcFNvcnRlclB0ciB7CisgcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgTWFwVDo6dmFsdWVfdHlwZTsKKyAgdXNpbmcgc3RvcmFnZV90eXBlID0gY29uc3QgdHlwZW5hbWUgTWFwVDo6dmFsdWVfdHlwZSo7CisKKyAgLy8gVGhpcyBjb25zdF9pdGVyYXRvciBkZXJlZmVyZW5lcyB0aGUgbWFwIGVudHJ5IHBvaW50ZXIgc3RvcmVkIGluIHRoZSBzb3J0aW5nCisgIC8vIGFycmF5LiBUaGlzIGlzIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUgTWFwOjpjb25zdF9pdGVyYXRvciB0eXBlLCBhbmQKKyAgLy8gYWxsb3dzIGdlbmVyYXRlZCBjb2RlIHRvIHVzZSB0aGUgc2FtZSBsb29wIGJvZHkgd2l0aCBlaXRoZXIgZm9ybToKKyAgLy8gICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogbWFwKSB7IC4uLiB9CisgIC8vICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IE1hcFNvcnRlclB0cihtYXApKSB7IC4uLiB9CisgIHN0cnVjdCBjb25zdF9pdGVyYXRvciA6IHB1YmxpYyBNYXBTb3J0ZXJJdDxzdG9yYWdlX3R5cGU+IHsKKyAgICB1c2luZyBwb2ludGVyID0gY29uc3QgdHlwZW5hbWUgTWFwVDo6dmFsdWVfdHlwZSo7CisgICAgdXNpbmcgcmVmZXJlbmNlID0gY29uc3QgdHlwZW5hbWUgTWFwVDo6dmFsdWVfdHlwZSY7CisgICAgdXNpbmcgTWFwU29ydGVySXQ8c3RvcmFnZV90eXBlPjo6TWFwU29ydGVySXQ7CisKKyAgICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAqdGhpcy0+cHRyOyB9CisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICp0aGlzLT5vcGVyYXRvci0+KCk7IH0KKyAgfTsKKworICBleHBsaWNpdCBNYXBTb3J0ZXJQdHIoY29uc3QgTWFwVCYgbSkKKyAgICAgIDogc2l6ZV8obS5zaXplKCkpLCBpdGVtc18oc2l6ZV8gPyBuZXcgc3RvcmFnZV90eXBlW3NpemVfXSA6IG51bGxwdHIpIHsKKyAgICBpZiAoIXNpemVfKSByZXR1cm47CisgICAgc3RvcmFnZV90eXBlKiBpdCA9ICZpdGVtc19bMF07CisgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IG0pIHsKKyAgICAgICppdCsrID0gJmVudHJ5OworICAgIH0KKyAgICBzdGQ6OnNvcnQoJml0ZW1zX1swXSwgJml0ZW1zX1tzaXplX10sCisgICAgICAgICAgICAgIFtdKGNvbnN0IHN0b3JhZ2VfdHlwZSYgYSwgY29uc3Qgc3RvcmFnZV90eXBlJiBiKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGEtPmZpcnN0IDwgYi0+Zmlyc3Q7CisgICAgICAgICAgICAgIH0pOworICB9CisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiB7aXRlbXNfLmdldCgpfTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiB7aXRlbXNfLmdldCgpICsgc2l6ZV99OyB9CisKKyBwcml2YXRlOgorICBzaXplX3Qgc2l6ZV87CisgIHN0ZDo6dW5pcXVlX3B0cjxzdG9yYWdlX3R5cGVbXT4gaXRlbXNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTUFQX0VOVFJZX0xJVEVfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNjYyZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5jYwpAQCAtMCwwICsxLDY1NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkLmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX2lubC5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKwordm9pZCBNYXBGaWVsZEJhc2U6OkRlc3RydWN0KCkgeworICBpZiAoYXJlbmFfID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgcmVwZWF0ZWRfZmllbGRfOworICB9CisgIHJlcGVhdGVkX2ZpZWxkXyA9IG51bGxwdHI7Cit9CisKK2NvbnN0IFJlcGVhdGVkUHRyRmllbGRCYXNlJiBNYXBGaWVsZEJhc2U6OkdldFJlcGVhdGVkRmllbGQoKSBjb25zdCB7CisgIENvbnN0QWNjZXNzKCk7CisgIFN5bmNSZXBlYXRlZEZpZWxkV2l0aE1hcCgpOworICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZEJhc2UqPihyZXBlYXRlZF9maWVsZF8pOworfQorCitSZXBlYXRlZFB0ckZpZWxkQmFzZSogTWFwRmllbGRCYXNlOjpNdXRhYmxlUmVwZWF0ZWRGaWVsZCgpIHsKKyAgTXV0YWJsZUFjY2VzcygpOworICBTeW5jUmVwZWF0ZWRGaWVsZFdpdGhNYXAoKTsKKyAgU2V0UmVwZWF0ZWREaXJ0eSgpOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZFB0ckZpZWxkQmFzZSo+KHJlcGVhdGVkX2ZpZWxkXyk7Cit9CisKK3ZvaWQgTWFwRmllbGRCYXNlOjpTd2FwU3RhdGUoTWFwRmllbGRCYXNlKiBvdGhlcikgeworICAvLyBhIHJlbGF4ZWQgc3dhcCBvZiB0aGUgYXRvbWljCisgIGF1dG8gb3RoZXJfc3RhdGUgPSBvdGhlci0+c3RhdGVfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIGF1dG8gdGhpc19zdGF0ZSA9IHN0YXRlXy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICBvdGhlci0+c3RhdGVfLnN0b3JlKHRoaXNfc3RhdGUsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICBzdGF0ZV8uc3RvcmUob3RoZXJfc3RhdGUsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworfQorCit2b2lkIFN3YXBSZXBlYXRlZFB0clRvTnVsbChSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KiogZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4qKiB0bywgQXJlbmEqIGZyb21fYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmVuYSogdG9fYXJlbmEpIHsKKyAgR09PR0xFX0RDSEVDSygqZnJvbSAhPSBudWxscHRyKTsKKyAgR09PR0xFX0RDSEVDSygqdG8gPT0gbnVsbHB0cik7CisgICp0byA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4gPih0b19hcmVuYSk7CisgICoqdG8gPSBzdGQ6Om1vdmUoKipmcm9tKTsKKyAgaWYgKGZyb21fYXJlbmEgPT0gbnVsbHB0cikgeworICAgIGRlbGV0ZSAqZnJvbTsKKyAgfQorICAqZnJvbSA9IG51bGxwdHI7Cit9CisKK3ZvaWQgTWFwRmllbGRCYXNlOjpTd2FwKE1hcEZpZWxkQmFzZSogb3RoZXIpIHsKKyAgaWYgKGFyZW5hXyA9PSBvdGhlci0+YXJlbmFfKSB7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHJlcGVhdGVkX2ZpZWxkXyAhPSBudWxscHRyIHx8IG90aGVyLT5yZXBlYXRlZF9maWVsZF8gIT0gbnVsbHB0cikgeworICAgIGlmIChyZXBlYXRlZF9maWVsZF8gPT0gbnVsbHB0cikgeworICAgICAgU3dhcFJlcGVhdGVkUHRyVG9OdWxsKCZvdGhlci0+cmVwZWF0ZWRfZmllbGRfLCAmcmVwZWF0ZWRfZmllbGRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLT5hcmVuYV8sIGFyZW5hXyk7CisgICAgfSBlbHNlIGlmIChvdGhlci0+cmVwZWF0ZWRfZmllbGRfID09IG51bGxwdHIpIHsKKyAgICAgIFN3YXBSZXBlYXRlZFB0clRvTnVsbCgmcmVwZWF0ZWRfZmllbGRfLCAmb3RoZXItPnJlcGVhdGVkX2ZpZWxkXywgYXJlbmFfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLT5hcmVuYV8pOworICAgIH0gZWxzZSB7CisgICAgICByZXBlYXRlZF9maWVsZF8tPlN3YXAob3RoZXItPnJlcGVhdGVkX2ZpZWxkXyk7CisgICAgfQorICB9CisgIFN3YXBTdGF0ZShvdGhlcik7Cit9CisKK3ZvaWQgTWFwRmllbGRCYXNlOjpVbnNhZmVTaGFsbG93U3dhcChNYXBGaWVsZEJhc2UqIG90aGVyKSB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEoYXJlbmFfLCBvdGhlci0+YXJlbmFfKTsKKyAgSW50ZXJuYWxTd2FwKG90aGVyKTsKK30KKwordm9pZCBNYXBGaWVsZEJhc2U6OkludGVybmFsU3dhcChNYXBGaWVsZEJhc2UqIG90aGVyKSB7CisgIHN0ZDo6c3dhcChhcmVuYV8sIG90aGVyLT5hcmVuYV8pOworICBzdGQ6OnN3YXAocmVwZWF0ZWRfZmllbGRfLCBvdGhlci0+cmVwZWF0ZWRfZmllbGRfKTsKKyAgU3dhcFN0YXRlKG90aGVyKTsKK30KKworc2l6ZV90IE1hcEZpZWxkQmFzZTo6U3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKSBjb25zdCB7CisgIENvbnN0QWNjZXNzKCk7CisgIG11dGV4Xy5Mb2NrKCk7CisgIHNpemVfdCBzaXplID0gU3BhY2VVc2VkRXhjbHVkaW5nU2VsZk5vTG9jaygpOworICBtdXRleF8uVW5sb2NrKCk7CisgIENvbnN0QWNjZXNzKCk7CisgIHJldHVybiBzaXplOworfQorCitzaXplX3QgTWFwRmllbGRCYXNlOjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTm9Mb2NrKCkgY29uc3QgeworICBpZiAocmVwZWF0ZWRfZmllbGRfICE9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gcmVwZWF0ZWRfZmllbGRfLT5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZygpOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9Cit9CisKK2Jvb2wgTWFwRmllbGRCYXNlOjpJc01hcFZhbGlkKCkgY29uc3QgeworICBDb25zdEFjY2VzcygpOworICAvLyAiQWNxdWlyZSIgaW5zdXJlcyB0aGUgb3BlcmF0aW9uIGFmdGVyIFN5bmNSZXBlYXRlZEZpZWxkV2l0aE1hcCB3b24ndCBnZXQKKyAgLy8gZXhlY3V0ZWQgYmVmb3JlIHN0YXRlXyBpcyBjaGVja2VkLgorICBpbnQgc3RhdGUgPSBzdGF0ZV8ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgcmV0dXJuIHN0YXRlICE9IFNUQVRFX01PRElGSUVEX1JFUEVBVEVEOworfQorCitib29sIE1hcEZpZWxkQmFzZTo6SXNSZXBlYXRlZEZpZWxkVmFsaWQoKSBjb25zdCB7CisgIENvbnN0QWNjZXNzKCk7CisgIGludCBzdGF0ZSA9IHN0YXRlXy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOworICByZXR1cm4gc3RhdGUgIT0gU1RBVEVfTU9ESUZJRURfTUFQOworfQorCit2b2lkIE1hcEZpZWxkQmFzZTo6U2V0TWFwRGlydHkoKSB7CisgIE11dGFibGVBY2Nlc3MoKTsKKyAgLy8gVGhlc2UgYXJlIGNhbGxlZCBieSAobm9uLWNvbnN0KSBtdXRhdG9yIGZ1bmN0aW9ucy4gU28gYnkgb3VyIEFQSSBpdCdzIHRoZQorICAvLyBjYWxsZXJzIHJlc3BvbnNpYmlsaXR5IHRvIGhhdmUgdGhlc2UgY2FsbHMgcHJvcGVybHkgb3JkZXJlZC4KKyAgc3RhdGVfLnN0b3JlKFNUQVRFX01PRElGSUVEX01BUCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Cit9CisKK3ZvaWQgTWFwRmllbGRCYXNlOjpTZXRSZXBlYXRlZERpcnR5KCkgeworICBNdXRhYmxlQWNjZXNzKCk7CisgIC8vIFRoZXNlIGFyZSBjYWxsZWQgYnkgKG5vbi1jb25zdCkgbXV0YXRvciBmdW5jdGlvbnMuIFNvIGJ5IG91ciBBUEkgaXQncyB0aGUKKyAgLy8gY2FsbGVycyByZXNwb25zaWJpbGl0eSB0byBoYXZlIHRoZXNlIGNhbGxzIHByb3Blcmx5IG9yZGVyZWQuCisgIHN0YXRlXy5zdG9yZShTVEFURV9NT0RJRklFRF9SRVBFQVRFRCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Cit9CisKK3ZvaWQgTWFwRmllbGRCYXNlOjpTeW5jUmVwZWF0ZWRGaWVsZFdpdGhNYXAoKSBjb25zdCB7CisgIENvbnN0QWNjZXNzKCk7CisgIC8vIGFjcXVpcmUgaGVyZSBtYXRjaGVzIHdpdGggcmVsZWFzZSBiZWxvdyB0byBlbnN1cmUgdGhhdCB3ZSBjYW4gb25seSBzZWUgYQorICAvLyB2YWx1ZSBvZiBDTEVBTiBhZnRlciBhbGwgcHJldmlvdXMgY2hhbmdlcyBoYXZlIGJlZW4gc3luY2VkLgorICBzd2l0Y2ggKHN0YXRlXy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpKSB7CisgICAgY2FzZSBTVEFURV9NT0RJRklFRF9NQVA6CisgICAgICBtdXRleF8uTG9jaygpOworICAgICAgLy8gRG91YmxlIGNoZWNrIHN0YXRlLCBiZWNhdXNlIGFub3RoZXIgdGhyZWFkIG1heSBoYXZlIHNlZW4gdGhlIHNhbWUKKyAgICAgIC8vIHN0YXRlIGFuZCBkb25lIHRoZSBzeW5jaHJvbml6YXRpb24gYmVmb3JlIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICAgIGlmIChzdGF0ZV8ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSA9PSBTVEFURV9NT0RJRklFRF9NQVApIHsKKyAgICAgICAgU3luY1JlcGVhdGVkRmllbGRXaXRoTWFwTm9Mb2NrKCk7CisgICAgICAgIHN0YXRlXy5zdG9yZShDTEVBTiwgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICAgICB9CisgICAgICBtdXRleF8uVW5sb2NrKCk7CisgICAgICBDb25zdEFjY2VzcygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTEVBTjoKKyAgICAgIG11dGV4Xy5Mb2NrKCk7CisgICAgICAvLyBEb3VibGUgY2hlY2sgc3RhdGUKKyAgICAgIGlmIChzdGF0ZV8ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSA9PSBDTEVBTikgeworICAgICAgICBpZiAocmVwZWF0ZWRfZmllbGRfID09IG51bGxwdHIpIHsKKyAgICAgICAgICByZXBlYXRlZF9maWVsZF8gPQorICAgICAgICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+ID4oYXJlbmFfKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZV8uc3RvcmUoQ0xFQU4sIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworICAgICAgfQorICAgICAgbXV0ZXhfLlVubG9jaygpOworICAgICAgQ29uc3RBY2Nlc3MoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkIE1hcEZpZWxkQmFzZTo6U3luY1JlcGVhdGVkRmllbGRXaXRoTWFwTm9Mb2NrKCkgY29uc3QgeworICBpZiAocmVwZWF0ZWRfZmllbGRfID09IG51bGxwdHIpIHsKKyAgICByZXBlYXRlZF9maWVsZF8gPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+ID4oYXJlbmFfKTsKKyAgfQorfQorCit2b2lkIE1hcEZpZWxkQmFzZTo6U3luY01hcFdpdGhSZXBlYXRlZEZpZWxkKCkgY29uc3QgeworICBDb25zdEFjY2VzcygpOworICAvLyBhY3F1aXJlIGhlcmUgbWF0Y2hlcyB3aXRoIHJlbGVhc2UgYmVsb3cgdG8gZW5zdXJlIHRoYXQgd2UgY2FuIG9ubHkgc2VlIGEKKyAgLy8gdmFsdWUgb2YgQ0xFQU4gYWZ0ZXIgYWxsIHByZXZpb3VzIGNoYW5nZXMgaGF2ZSBiZWVuIHN5bmNlZC4KKyAgaWYgKHN0YXRlXy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpID09IFNUQVRFX01PRElGSUVEX1JFUEVBVEVEKSB7CisgICAgbXV0ZXhfLkxvY2soKTsKKyAgICAvLyBEb3VibGUgY2hlY2sgc3RhdGUsIGJlY2F1c2UgYW5vdGhlciB0aHJlYWQgbWF5IGhhdmUgc2VlbiB0aGUgc2FtZSBzdGF0ZQorICAgIC8vIGFuZCBkb25lIHRoZSBzeW5jaHJvbml6YXRpb24gYmVmb3JlIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICBpZiAoc3RhdGVfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkgPT0gU1RBVEVfTU9ESUZJRURfUkVQRUFURUQpIHsKKyAgICAgIFN5bmNNYXBXaXRoUmVwZWF0ZWRGaWVsZE5vTG9jaygpOworICAgICAgc3RhdGVfLnN0b3JlKENMRUFOLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgICB9CisgICAgbXV0ZXhfLlVubG9jaygpOworICAgIENvbnN0QWNjZXNzKCk7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tRHluYW1pY01hcEZpZWxkLS0tLS0tLS0tLS0tLS0tLS0tCitEeW5hbWljTWFwRmllbGQ6OkR5bmFtaWNNYXBGaWVsZChjb25zdCBNZXNzYWdlKiBkZWZhdWx0X2VudHJ5KQorICAgIDogZGVmYXVsdF9lbnRyeV8oZGVmYXVsdF9lbnRyeSkge30KKworRHluYW1pY01hcEZpZWxkOjpEeW5hbWljTWFwRmllbGQoY29uc3QgTWVzc2FnZSogZGVmYXVsdF9lbnRyeSwgQXJlbmEqIGFyZW5hKQorICAgIDogVHlwZURlZmluZWRNYXBGaWVsZEJhc2U8TWFwS2V5LCBNYXBWYWx1ZVJlZj4oYXJlbmEpLAorICAgICAgbWFwXyhhcmVuYSksCisgICAgICBkZWZhdWx0X2VudHJ5XyhkZWZhdWx0X2VudHJ5KSB7fQorCitEeW5hbWljTWFwRmllbGQ6On5EeW5hbWljTWFwRmllbGQoKSB7CisgIGlmIChhcmVuYV8gPT0gbnVsbHB0cikgeworICAgIC8vIER5bmFtaWNNYXBGaWVsZCBvd25zIG1hcCB2YWx1ZXMuIE5lZWQgdG8gZGVsZXRlIHRoZW0gYmVmb3JlIGNsZWFyaW5nIHRoZQorICAgIC8vIG1hcC4KKyAgICBmb3IgKGF1dG8mIGt2IDogbWFwXykgeworICAgICAga3Yuc2Vjb25kLkRlbGV0ZURhdGEoKTsKKyAgICB9CisgICAgbWFwXy5jbGVhcigpOworICB9CisgIERlc3RydWN0KCk7Cit9CisKK2ludCBEeW5hbWljTWFwRmllbGQ6OnNpemUoKSBjb25zdCB7IHJldHVybiBHZXRNYXAoKS5zaXplKCk7IH0KKwordm9pZCBEeW5hbWljTWFwRmllbGQ6OkNsZWFyKCkgeworICBNYXA8TWFwS2V5LCBNYXBWYWx1ZVJlZj4qIG1hcCA9ICZjb25zdF9jYXN0PER5bmFtaWNNYXBGaWVsZCo+KHRoaXMpLT5tYXBfOworICBpZiAoTWFwRmllbGRCYXNlOjphcmVuYV8gPT0gbnVsbHB0cikgeworICAgIGZvciAoTWFwPE1hcEtleSwgTWFwVmFsdWVSZWY+OjppdGVyYXRvciBpdGVyID0gbWFwLT5iZWdpbigpOworICAgICAgICAgaXRlciAhPSBtYXAtPmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGl0ZXItPnNlY29uZC5EZWxldGVEYXRhKCk7CisgICAgfQorICB9CisKKyAgbWFwLT5jbGVhcigpOworCisgIGlmIChNYXBGaWVsZEJhc2U6OnJlcGVhdGVkX2ZpZWxkXyAhPSBudWxscHRyKSB7CisgICAgTWFwRmllbGRCYXNlOjpyZXBlYXRlZF9maWVsZF8tPkNsZWFyKCk7CisgIH0KKyAgLy8gRGF0YSBpbiBtYXAgYW5kIHJlcGVhdGVkIGZpZWxkIGFyZSBib3RoIGVtcHR5LCBidXQgd2UgY2FuJ3Qgc2V0IHN0YXR1cworICAvLyBDTEVBTiB3aGljaCB3aWxsIGludmFsaWRhdGUgcHJldmlvdXMgcmVmZXJlbmNlIHRvIG1hcC4KKyAgTWFwRmllbGRCYXNlOjpTZXRNYXBEaXJ0eSgpOworfQorCitib29sIER5bmFtaWNNYXBGaWVsZDo6Q29udGFpbnNNYXBLZXkoY29uc3QgTWFwS2V5JiBtYXBfa2V5KSBjb25zdCB7CisgIGNvbnN0IE1hcDxNYXBLZXksIE1hcFZhbHVlUmVmPiYgbWFwID0gR2V0TWFwKCk7CisgIE1hcDxNYXBLZXksIE1hcFZhbHVlUmVmPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IG1hcC5maW5kKG1hcF9rZXkpOworICByZXR1cm4gaXRlciAhPSBtYXAuZW5kKCk7Cit9CisKK3ZvaWQgRHluYW1pY01hcEZpZWxkOjpBbGxvY2F0ZU1hcFZhbHVlKE1hcFZhbHVlUmVmKiBtYXBfdmFsKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsX2RlcyA9IGRlZmF1bHRfZW50cnlfLT5HZXREZXNjcmlwdG9yKCktPm1hcF92YWx1ZSgpOworICBtYXBfdmFsLT5TZXRUeXBlKHZhbF9kZXMtPmNwcF90eXBlKCkpOworICAvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBNYXBWYWx1ZVJlZiwgYW5kIGluaXRpYWxpemUgdG8KKyAgLy8gZGVmYXVsdCB2YWx1ZS4KKyAgc3dpdGNoICh2YWxfZGVzLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKENQUFRZUEUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6IHsgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFKiB2YWx1ZSA9IEFyZW5hOjpDcmVhdGU8VFlQRT4oTWFwRmllbGRCYXNlOjphcmVuYV8pOyBcCisgICAgbWFwX3ZhbC0+U2V0VmFsdWUodmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorICAgIEhBTkRMRV9UWVBFKElOVDMyLCBpbnQzMl90KTsKKyAgICBIQU5ETEVfVFlQRShJTlQ2NCwgaW50NjRfdCk7CisgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzJfdCk7CisgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjRfdCk7CisgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOworICAgIEhBTkRMRV9UWVBFKEZMT0FULCBmbG9hdCk7CisgICAgSEFORExFX1RZUEUoQk9PTCwgYm9vbCk7CisgICAgSEFORExFX1RZUEUoU1RSSU5HLCBzdGQ6OnN0cmluZyk7CisgICAgSEFORExFX1RZUEUoRU5VTSwgaW50MzJfdCk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOiB7CisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlID0KKyAgICAgICAgICBkZWZhdWx0X2VudHJ5Xy0+R2V0UmVmbGVjdGlvbigpLT5HZXRNZXNzYWdlKCpkZWZhdWx0X2VudHJ5XywgdmFsX2Rlcyk7CisgICAgICBNZXNzYWdlKiB2YWx1ZSA9IG1lc3NhZ2UuTmV3KE1hcEZpZWxkQmFzZTo6YXJlbmFfKTsKKyAgICAgIG1hcF92YWwtPlNldFZhbHVlKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitib29sIER5bmFtaWNNYXBGaWVsZDo6SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShjb25zdCBNYXBLZXkmIG1hcF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBWYWx1ZVJlZiogdmFsKSB7CisgIC8vIEFsd2F5cyB1c2UgbXV0YWJsZSBtYXAgYmVjYXVzZSB1c2VycyBtYXkgY2hhbmdlIHRoZSBtYXAgdmFsdWUgYnkKKyAgLy8gTWFwVmFsdWVSZWYuCisgIE1hcDxNYXBLZXksIE1hcFZhbHVlUmVmPiogbWFwID0gTXV0YWJsZU1hcCgpOworICBNYXA8TWFwS2V5LCBNYXBWYWx1ZVJlZj46Oml0ZXJhdG9yIGl0ZXIgPSBtYXAtPmZpbmQobWFwX2tleSk7CisgIGlmIChpdGVyID09IG1hcC0+ZW5kKCkpIHsKKyAgICBNYXBWYWx1ZVJlZiYgbWFwX3ZhbCA9IG1hcF9bbWFwX2tleV07CisgICAgQWxsb2NhdGVNYXBWYWx1ZSgmbWFwX3ZhbCk7CisgICAgdmFsLT5Db3B5RnJvbShtYXBfdmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAvLyBtYXBfa2V5IGlzIGFscmVhZHkgaW4gdGhlIG1hcC4gTWFrZSBzdXJlICgqbWFwKVttYXBfa2V5XSBpcyBub3QgY2FsbGVkLgorICAvLyBbXSBtYXkgcmVvcmRlciB0aGUgbWFwIGFuZCBpdGVyYXRvcnMuCisgIHZhbC0+Q29weUZyb20oaXRlci0+c2Vjb25kKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIER5bmFtaWNNYXBGaWVsZDo6TG9va3VwTWFwVmFsdWUoY29uc3QgTWFwS2V5JiBtYXBfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcFZhbHVlQ29uc3RSZWYqIHZhbCkgY29uc3QgeworICBjb25zdCBNYXA8TWFwS2V5LCBNYXBWYWx1ZVJlZj4mIG1hcCA9IEdldE1hcCgpOworICBNYXA8TWFwS2V5LCBNYXBWYWx1ZVJlZj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBtYXAuZmluZChtYXBfa2V5KTsKKyAgaWYgKGl0ZXIgPT0gbWFwLmVuZCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIG1hcF9rZXkgaXMgYWxyZWFkeSBpbiB0aGUgbWFwLiBNYWtlIHN1cmUgKCptYXApW21hcF9rZXldIGlzIG5vdCBjYWxsZWQuCisgIC8vIFtdIG1heSByZW9yZGVyIHRoZSBtYXAgYW5kIGl0ZXJhdG9ycy4KKyAgdmFsLT5Db3B5RnJvbShpdGVyLT5zZWNvbmQpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEeW5hbWljTWFwRmllbGQ6OkRlbGV0ZU1hcFZhbHVlKGNvbnN0IE1hcEtleSYgbWFwX2tleSkgeworICBNYXBGaWVsZEJhc2U6OlN5bmNNYXBXaXRoUmVwZWF0ZWRGaWVsZCgpOworICBNYXA8TWFwS2V5LCBNYXBWYWx1ZVJlZj46Oml0ZXJhdG9yIGl0ZXIgPSBtYXBfLmZpbmQobWFwX2tleSk7CisgIGlmIChpdGVyID09IG1hcF8uZW5kKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gU2V0IG1hcCBkaXJ0eSBvbmx5IGlmIHRoZSBkZWxldGUgaXMgc3VjY2Vzc2Z1bC4KKyAgTWFwRmllbGRCYXNlOjpTZXRNYXBEaXJ0eSgpOworICBpZiAoTWFwRmllbGRCYXNlOjphcmVuYV8gPT0gbnVsbHB0cikgeworICAgIGl0ZXItPnNlY29uZC5EZWxldGVEYXRhKCk7CisgIH0KKyAgbWFwXy5lcmFzZShpdGVyKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IE1hcDxNYXBLZXksIE1hcFZhbHVlUmVmPiYgRHluYW1pY01hcEZpZWxkOjpHZXRNYXAoKSBjb25zdCB7CisgIE1hcEZpZWxkQmFzZTo6U3luY01hcFdpdGhSZXBlYXRlZEZpZWxkKCk7CisgIHJldHVybiBtYXBfOworfQorCitNYXA8TWFwS2V5LCBNYXBWYWx1ZVJlZj4qIER5bmFtaWNNYXBGaWVsZDo6TXV0YWJsZU1hcCgpIHsKKyAgTWFwRmllbGRCYXNlOjpTeW5jTWFwV2l0aFJlcGVhdGVkRmllbGQoKTsKKyAgTWFwRmllbGRCYXNlOjpTZXRNYXBEaXJ0eSgpOworICByZXR1cm4gJm1hcF87Cit9CisKK3ZvaWQgRHluYW1pY01hcEZpZWxkOjpTZXRNYXBJdGVyYXRvclZhbHVlKE1hcEl0ZXJhdG9yKiBtYXBfaXRlcikgY29uc3QgeworICBNYXA8TWFwS2V5LCBNYXBWYWx1ZVJlZj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPQorICAgICAgVHlwZURlZmluZWRNYXBGaWVsZEJhc2U8TWFwS2V5LCBNYXBWYWx1ZVJlZj46OkludGVybmFsR2V0SXRlcmF0b3IoCisgICAgICAgICAgbWFwX2l0ZXIpOworICBpZiAoaXRlciA9PSBtYXBfLmVuZCgpKSByZXR1cm47CisgIG1hcF9pdGVyLT5rZXlfLkNvcHlGcm9tKGl0ZXItPmZpcnN0KTsKKyAgbWFwX2l0ZXItPnZhbHVlXy5Db3B5RnJvbShpdGVyLT5zZWNvbmQpOworfQorCit2b2lkIER5bmFtaWNNYXBGaWVsZDo6TWVyZ2VGcm9tKGNvbnN0IE1hcEZpZWxkQmFzZSYgb3RoZXIpIHsKKyAgR09PR0xFX0RDSEVDSyhJc01hcFZhbGlkKCkgJiYgb3RoZXIuSXNNYXBWYWxpZCgpKTsKKyAgTWFwPE1hcEtleSwgTWFwVmFsdWVSZWY+KiBtYXAgPSBNdXRhYmxlTWFwKCk7CisgIGNvbnN0IER5bmFtaWNNYXBGaWVsZCYgb3RoZXJfZmllbGQgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBEeW5hbWljTWFwRmllbGQmPihvdGhlcik7CisgIGZvciAoTWFwPE1hcEtleSwgTWFwVmFsdWVSZWY+Ojpjb25zdF9pdGVyYXRvciBvdGhlcl9pdCA9CisgICAgICAgICAgIG90aGVyX2ZpZWxkLm1hcF8uYmVnaW4oKTsKKyAgICAgICBvdGhlcl9pdCAhPSBvdGhlcl9maWVsZC5tYXBfLmVuZCgpOyArK290aGVyX2l0KSB7CisgICAgTWFwPE1hcEtleSwgTWFwVmFsdWVSZWY+OjppdGVyYXRvciBpdGVyID0gbWFwLT5maW5kKG90aGVyX2l0LT5maXJzdCk7CisgICAgTWFwVmFsdWVSZWYqIG1hcF92YWw7CisgICAgaWYgKGl0ZXIgPT0gbWFwLT5lbmQoKSkgeworICAgICAgbWFwX3ZhbCA9ICZtYXBfW290aGVyX2l0LT5maXJzdF07CisgICAgICBBbGxvY2F0ZU1hcFZhbHVlKG1hcF92YWwpOworICAgIH0gZWxzZSB7CisgICAgICBtYXBfdmFsID0gJml0ZXItPnNlY29uZDsKKyAgICB9CisKKyAgICAvLyBDb3B5IG1hcCB2YWx1ZQorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9CisgICAgICAgIGRlZmF1bHRfZW50cnlfLT5HZXREZXNjcmlwdG9yKCktPm1hcF92YWx1ZSgpOworICAgIHN3aXRjaCAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSkgeworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6IHsKKyAgICAgICAgbWFwX3ZhbC0+U2V0SW50MzJWYWx1ZShvdGhlcl9pdC0+c2Vjb25kLkdldEludDMyVmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKKyAgICAgICAgbWFwX3ZhbC0+U2V0SW50NjRWYWx1ZShvdGhlcl9pdC0+c2Vjb25kLkdldEludDY0VmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7CisgICAgICAgIG1hcF92YWwtPlNldFVJbnQzMlZhbHVlKG90aGVyX2l0LT5zZWNvbmQuR2V0VUludDMyVmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7CisgICAgICAgIG1hcF92YWwtPlNldFVJbnQ2NFZhbHVlKG90aGVyX2l0LT5zZWNvbmQuR2V0VUludDY0VmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKKyAgICAgICAgbWFwX3ZhbC0+U2V0RmxvYXRWYWx1ZShvdGhlcl9pdC0+c2Vjb25kLkdldEZsb2F0VmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7CisgICAgICAgIG1hcF92YWwtPlNldERvdWJsZVZhbHVlKG90aGVyX2l0LT5zZWNvbmQuR2V0RG91YmxlVmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogeworICAgICAgICBtYXBfdmFsLT5TZXRCb29sVmFsdWUob3RoZXJfaXQtPnNlY29uZC5HZXRCb29sVmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICAgIG1hcF92YWwtPlNldFN0cmluZ1ZhbHVlKG90aGVyX2l0LT5zZWNvbmQuR2V0U3RyaW5nVmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogeworICAgICAgICBtYXBfdmFsLT5TZXRFbnVtVmFsdWUob3RoZXJfaXQtPnNlY29uZC5HZXRFbnVtVmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTogeworICAgICAgICBtYXBfdmFsLT5NdXRhYmxlTWVzc2FnZVZhbHVlKCktPkNvcHlGcm9tKAorICAgICAgICAgICAgb3RoZXJfaXQtPnNlY29uZC5HZXRNZXNzYWdlVmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIER5bmFtaWNNYXBGaWVsZDo6U3dhcChNYXBGaWVsZEJhc2UqIG90aGVyKSB7CisgIER5bmFtaWNNYXBGaWVsZCogb3RoZXJfZmllbGQgPSBkb3duX2Nhc3Q8RHluYW1pY01hcEZpZWxkKj4ob3RoZXIpOworICBzdGQ6OnN3YXAodGhpcy0+TWFwRmllbGRCYXNlOjpyZXBlYXRlZF9maWVsZF8sIG90aGVyX2ZpZWxkLT5yZXBlYXRlZF9maWVsZF8pOworICBtYXBfLnN3YXAob3RoZXJfZmllbGQtPm1hcF8pOworICAvLyBhIHJlbGF4ZWQgc3dhcCBvZiB0aGUgYXRvbWljCisgIGF1dG8gb3RoZXJfc3RhdGUgPSBvdGhlcl9maWVsZC0+c3RhdGVfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIGF1dG8gdGhpc19zdGF0ZSA9IHRoaXMtPk1hcEZpZWxkQmFzZTo6c3RhdGVfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIG90aGVyX2ZpZWxkLT5zdGF0ZV8uc3RvcmUodGhpc19zdGF0ZSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIHRoaXMtPk1hcEZpZWxkQmFzZTo6c3RhdGVfLnN0b3JlKG90aGVyX3N0YXRlLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKK30KKwordm9pZCBEeW5hbWljTWFwRmllbGQ6OlN5bmNSZXBlYXRlZEZpZWxkV2l0aE1hcE5vTG9jaygpIGNvbnN0IHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IGRlZmF1bHRfZW50cnlfLT5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5X2RlcyA9IGRlZmF1bHRfZW50cnlfLT5HZXREZXNjcmlwdG9yKCktPm1hcF9rZXkoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWxfZGVzID0gZGVmYXVsdF9lbnRyeV8tPkdldERlc2NyaXB0b3IoKS0+bWFwX3ZhbHVlKCk7CisgIGlmIChNYXBGaWVsZEJhc2U6OnJlcGVhdGVkX2ZpZWxkXyA9PSBudWxscHRyKSB7CisgICAgTWFwRmllbGRCYXNlOjpyZXBlYXRlZF9maWVsZF8gPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+ID4oTWFwRmllbGRCYXNlOjphcmVuYV8pOworICB9CisKKyAgTWFwRmllbGRCYXNlOjpyZXBlYXRlZF9maWVsZF8tPkNsZWFyKCk7CisKKyAgZm9yIChNYXA8TWFwS2V5LCBNYXBWYWx1ZVJlZj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWFwXy5iZWdpbigpOworICAgICAgIGl0ICE9IG1hcF8uZW5kKCk7ICsraXQpIHsKKyAgICBNZXNzYWdlKiBuZXdfZW50cnkgPSBkZWZhdWx0X2VudHJ5Xy0+TmV3KE1hcEZpZWxkQmFzZTo6YXJlbmFfKTsKKyAgICBNYXBGaWVsZEJhc2U6OnJlcGVhdGVkX2ZpZWxkXy0+QWRkQWxsb2NhdGVkKG5ld19lbnRyeSk7CisgICAgY29uc3QgTWFwS2V5JiBtYXBfa2V5ID0gaXQtPmZpcnN0OworICAgIHN3aXRjaCAoa2V5X2Rlcy0+Y3BwX3R5cGUoKSkgeworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobmV3X2VudHJ5LCBrZXlfZGVzLCBtYXBfa2V5LkdldFN0cmluZ1ZhbHVlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgICAgICByZWZsZWN0aW9uLT5TZXRJbnQ2NChuZXdfZW50cnksIGtleV9kZXMsIG1hcF9rZXkuR2V0SW50NjRWYWx1ZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgICAgcmVmbGVjdGlvbi0+U2V0SW50MzIobmV3X2VudHJ5LCBrZXlfZGVzLCBtYXBfa2V5LkdldEludDMyVmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgICByZWZsZWN0aW9uLT5TZXRVSW50NjQobmV3X2VudHJ5LCBrZXlfZGVzLCBtYXBfa2V5LkdldFVJbnQ2NFZhbHVlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgcmVmbGVjdGlvbi0+U2V0VUludDMyKG5ld19lbnRyeSwga2V5X2RlcywgbWFwX2tleS5HZXRVSW50MzJWYWx1ZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgICAgICByZWZsZWN0aW9uLT5TZXRCb29sKG5ld19lbnRyeSwga2V5X2RlcywgbWFwX2tleS5HZXRCb29sVmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjb25zdCBNYXBWYWx1ZVJlZiYgbWFwX3ZhbCA9IGl0LT5zZWNvbmQ7CisgICAgc3dpdGNoICh2YWxfZGVzLT5jcHBfdHlwZSgpKSB7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhuZXdfZW50cnksIHZhbF9kZXMsIG1hcF92YWwuR2V0U3RyaW5nVmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICAgIHJlZmxlY3Rpb24tPlNldEludDY0KG5ld19lbnRyeSwgdmFsX2RlcywgbWFwX3ZhbC5HZXRJbnQ2NFZhbHVlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgICByZWZsZWN0aW9uLT5TZXRJbnQzMihuZXdfZW50cnksIHZhbF9kZXMsIG1hcF92YWwuR2V0SW50MzJWYWx1ZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICAgIHJlZmxlY3Rpb24tPlNldFVJbnQ2NChuZXdfZW50cnksIHZhbF9kZXMsIG1hcF92YWwuR2V0VUludDY0VmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgICByZWZsZWN0aW9uLT5TZXRVSW50MzIobmV3X2VudHJ5LCB2YWxfZGVzLCBtYXBfdmFsLkdldFVJbnQzMlZhbHVlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICAgIHJlZmxlY3Rpb24tPlNldEJvb2wobmV3X2VudHJ5LCB2YWxfZGVzLCBtYXBfdmFsLkdldEJvb2xWYWx1ZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICAgIHJlZmxlY3Rpb24tPlNldERvdWJsZShuZXdfZW50cnksIHZhbF9kZXMsIG1hcF92YWwuR2V0RG91YmxlVmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICAgIHJlZmxlY3Rpb24tPlNldEZsb2F0KG5ld19lbnRyeSwgdmFsX2RlcywgbWFwX3ZhbC5HZXRGbG9hdFZhbHVlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICAgIHJlZmxlY3Rpb24tPlNldEVudW1WYWx1ZShuZXdfZW50cnksIHZhbF9kZXMsIG1hcF92YWwuR2V0RW51bVZhbHVlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6IHsKKyAgICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSA9IG1hcF92YWwuR2V0TWVzc2FnZVZhbHVlKCk7CisgICAgICAgIHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKG5ld19lbnRyeSwgdmFsX2RlcyktPkNvcHlGcm9tKG1lc3NhZ2UpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBEeW5hbWljTWFwRmllbGQ6OlN5bmNNYXBXaXRoUmVwZWF0ZWRGaWVsZE5vTG9jaygpIGNvbnN0IHsKKyAgTWFwPE1hcEtleSwgTWFwVmFsdWVSZWY+KiBtYXAgPSAmY29uc3RfY2FzdDxEeW5hbWljTWFwRmllbGQqPih0aGlzKS0+bWFwXzsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IGRlZmF1bHRfZW50cnlfLT5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5X2RlcyA9IGRlZmF1bHRfZW50cnlfLT5HZXREZXNjcmlwdG9yKCktPm1hcF9rZXkoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWxfZGVzID0gZGVmYXVsdF9lbnRyeV8tPkdldERlc2NyaXB0b3IoKS0+bWFwX3ZhbHVlKCk7CisgIC8vIER5bmFtaWNNYXBGaWVsZCBvd25zIG1hcCB2YWx1ZXMuIE5lZWQgdG8gZGVsZXRlIHRoZW0gYmVmb3JlIGNsZWFyaW5nCisgIC8vIHRoZSBtYXAuCisgIGlmIChNYXBGaWVsZEJhc2U6OmFyZW5hXyA9PSBudWxscHRyKSB7CisgICAgZm9yIChNYXA8TWFwS2V5LCBNYXBWYWx1ZVJlZj46Oml0ZXJhdG9yIGl0ZXIgPSBtYXAtPmJlZ2luKCk7CisgICAgICAgICBpdGVyICE9IG1hcC0+ZW5kKCk7ICsraXRlcikgeworICAgICAgaXRlci0+c2Vjb25kLkRlbGV0ZURhdGEoKTsKKyAgICB9CisgIH0KKyAgbWFwLT5jbGVhcigpOworICBmb3IgKFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT46Oml0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgTWFwRmllbGRCYXNlOjpyZXBlYXRlZF9maWVsZF8tPmJlZ2luKCk7CisgICAgICAgaXQgIT0gTWFwRmllbGRCYXNlOjpyZXBlYXRlZF9maWVsZF8tPmVuZCgpOyArK2l0KSB7CisgICAgLy8gTWFwS2V5IHR5cGUgd2lsbCBiZSBzZXQgbGF0ZXIuCisgICAgTWFwS2V5IG1hcF9rZXk7CisgICAgc3dpdGNoIChrZXlfZGVzLT5jcHBfdHlwZSgpKSB7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIG1hcF9rZXkuU2V0U3RyaW5nVmFsdWUocmVmbGVjdGlvbi0+R2V0U3RyaW5nKCppdCwga2V5X2RlcykpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgICAgICBtYXBfa2V5LlNldEludDY0VmFsdWUocmVmbGVjdGlvbi0+R2V0SW50NjQoKml0LCBrZXlfZGVzKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6CisgICAgICAgIG1hcF9rZXkuU2V0SW50MzJWYWx1ZShyZWZsZWN0aW9uLT5HZXRJbnQzMigqaXQsIGtleV9kZXMpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICAgIG1hcF9rZXkuU2V0VUludDY0VmFsdWUocmVmbGVjdGlvbi0+R2V0VUludDY0KCppdCwga2V5X2RlcykpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgbWFwX2tleS5TZXRVSW50MzJWYWx1ZShyZWZsZWN0aW9uLT5HZXRVSW50MzIoKml0LCBrZXlfZGVzKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKKyAgICAgICAgbWFwX2tleS5TZXRCb29sVmFsdWUocmVmbGVjdGlvbi0+R2V0Qm9vbCgqaXQsIGtleV9kZXMpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDoKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKE1hcEZpZWxkQmFzZTo6YXJlbmFfID09IG51bGxwdHIpIHsKKyAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBtYXAgdmFsdWUgd2l0aCBzYW1lIGtleS4KKyAgICAgIE1hcDxNYXBLZXksIE1hcFZhbHVlUmVmPjo6aXRlcmF0b3IgaXRlciA9IG1hcC0+ZmluZChtYXBfa2V5KTsKKyAgICAgIGlmIChpdGVyICE9IG1hcC0+ZW5kKCkpIHsKKyAgICAgICAgaXRlci0+c2Vjb25kLkRlbGV0ZURhdGEoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBNYXBWYWx1ZVJlZiYgbWFwX3ZhbCA9ICgqbWFwKVttYXBfa2V5XTsKKyAgICBtYXBfdmFsLlNldFR5cGUodmFsX2Rlcy0+Y3BwX3R5cGUoKSk7CisgICAgc3dpdGNoICh2YWxfZGVzLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKENQUFRZUEUsIFRZUEUsIE1FVEhPRCkgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6IHsgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFKiB2YWx1ZSA9IEFyZW5hOjpDcmVhdGU8VFlQRT4oTWFwRmllbGRCYXNlOjphcmVuYV8pOyBcCisgICAgKnZhbHVlID0gcmVmbGVjdGlvbi0+R2V0IyNNRVRIT0QoKml0LCB2YWxfZGVzKTsgICAgICAgICAgXAorICAgIG1hcF92YWwuU2V0VmFsdWUodmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyAgICAgIEhBTkRMRV9UWVBFKElOVDMyLCBpbnQzMl90LCBJbnQzMik7CisgICAgICBIQU5ETEVfVFlQRShJTlQ2NCwgaW50NjRfdCwgSW50NjQpOworICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzJfdCwgVUludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0X3QsIFVJbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRShET1VCTEUsIGRvdWJsZSwgRG91YmxlKTsKKyAgICAgIEhBTkRMRV9UWVBFKEZMT0FULCBmbG9hdCwgRmxvYXQpOworICAgICAgSEFORExFX1RZUEUoQk9PTCwgYm9vbCwgQm9vbCk7CisgICAgICBIQU5ETEVfVFlQRShTVFJJTkcsIHN0ZDo6c3RyaW5nLCBTdHJpbmcpOworICAgICAgSEFORExFX1RZUEUoRU5VTSwgaW50MzJfdCwgRW51bVZhbHVlKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTogeworICAgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlID0gcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgqaXQsIHZhbF9kZXMpOworICAgICAgICBNZXNzYWdlKiB2YWx1ZSA9IG1lc3NhZ2UuTmV3KE1hcEZpZWxkQmFzZTo6YXJlbmFfKTsKKyAgICAgICAgdmFsdWUtPkNvcHlGcm9tKG1lc3NhZ2UpOworICAgICAgICBtYXBfdmFsLlNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3NpemVfdCBEeW5hbWljTWFwRmllbGQ6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZOb0xvY2soKSBjb25zdCB7CisgIHNpemVfdCBzaXplID0gMDsKKyAgaWYgKE1hcEZpZWxkQmFzZTo6cmVwZWF0ZWRfZmllbGRfICE9IG51bGxwdHIpIHsKKyAgICBzaXplICs9IE1hcEZpZWxkQmFzZTo6cmVwZWF0ZWRfZmllbGRfLT5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZygpOworICB9CisgIHNpemUgKz0gc2l6ZW9mKG1hcF8pOworICBzaXplX3QgbWFwX3NpemUgPSBtYXBfLnNpemUoKTsKKyAgaWYgKG1hcF9zaXplKSB7CisgICAgTWFwPE1hcEtleSwgTWFwVmFsdWVSZWY+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1hcF8uYmVnaW4oKTsKKyAgICBzaXplICs9IHNpemVvZihpdC0+Zmlyc3QpICogbWFwX3NpemU7CisgICAgc2l6ZSArPSBzaXplb2YoaXQtPnNlY29uZCkgKiBtYXBfc2l6ZTsKKyAgICAvLyBJZiBrZXkgaXMgc3RyaW5nLCBhZGQgdGhlIGFsbG9jYXRlZCBzcGFjZS4KKyAgICBpZiAoaXQtPmZpcnN0LnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HKSB7CisgICAgICBzaXplICs9IHNpemVvZihzdGQ6OnN0cmluZykgKiBtYXBfc2l6ZTsKKyAgICB9CisgICAgLy8gQWRkIHRoZSBhbGxvY2F0ZWQgc3BhY2UgaW4gTWFwVmFsdWVSZWYuCisgICAgc3dpdGNoIChpdC0+c2Vjb25kLnR5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShDUFBUWVBFLCBUWVBFKSAgICAgICAgICAgXAorICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6IHsgXAorICAgIHNpemUgKz0gc2l6ZW9mKFRZUEUpICogbWFwX3NpemU7ICAgICAgICAgXAorICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisgICAgICBIQU5ETEVfVFlQRShJTlQzMiwgaW50MzJfdCk7CisgICAgICBIQU5ETEVfVFlQRShJTlQ2NCwgaW50NjRfdCk7CisgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMl90KTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0X3QpOworICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOworICAgICAgSEFORExFX1RZUEUoRkxPQVQsIGZsb2F0KTsKKyAgICAgIEhBTkRMRV9UWVBFKEJPT0wsIGJvb2wpOworICAgICAgSEFORExFX1RZUEUoU1RSSU5HLCBzdGQ6OnN0cmluZyk7CisgICAgICBIQU5ETEVfVFlQRShFTlVNLCBpbnQzMl90KTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTogeworICAgICAgICB3aGlsZSAoaXQgIT0gbWFwXy5lbmQoKSkgeworICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UgPSBpdC0+c2Vjb25kLkdldE1lc3NhZ2VWYWx1ZSgpOworICAgICAgICAgIHNpemUgKz0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPlNwYWNlVXNlZExvbmcobWVzc2FnZSk7CisgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODdkNThmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuaApAQCAtMCwwICsxLDk0NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX01BUF9GSUVMRF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX01BUF9GSUVMRF9IX18KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL211dGV4Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX2VudHJ5Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF90eXBlX2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorCisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCisjaWZkZWYgU1dJRworI2Vycm9yICJZb3UgY2Fubm90IFNXSUcgcHJvdG8gaGVhZGVycyIKKyNlbmRpZgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CitjbGFzcyBEeW5hbWljTWVzc2FnZTsKK2NsYXNzIE1hcEl0ZXJhdG9yOworCisvLyBNaWNyb3NvZnQgY29tcGlsZXIgY29tcGxhaW5zIGFib3V0IG5vbi12aXJ0dWFsIGRlc3RydWN0b3IsCisvLyBldmVuIHdoZW4gdGhlIGRlc3RydWN0b3IgaXMgcHJpdmF0ZS4KKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQyNjUpCisjZW5kaWYgIC8vIF9NU0NfVkVSCisKKyNkZWZpbmUgVFlQRV9DSEVDSyhFWFBFQ1RFRFRZUEUsIE1FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKHR5cGUoKSAhPSBFWFBFQ1RFRFRZUEUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiUHJvdG9jb2wgQnVmZmVyIG1hcCB1c2FnZSBlcnJvcjpcbiIgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICA8PCBNRVRIT0QgPDwgIiB0eXBlIGRvZXMgbm90IG1hdGNoXG4iICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICA8PCAiICBFeHBlY3RlZCA6ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICA8PCBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGVOYW1lKEVYUEVDVEVEVFlQRSkgPDwgIlxuIiAgICAgICBcCisgICAgICAgICAgICAgICA8PCAiICBBY3R1YWwgICA6ICIgPDwgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlTmFtZSh0eXBlKCkpOyBcCisgIH0KKworLy8gTWFwS2V5IGlzIGFuIHVuaW9uIHR5cGUgZm9yIHJlcHJlc2VudGluZyBhbnkgcG9zc2libGUKKy8vIG1hcCBrZXkuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTWFwS2V5IHsKKyBwdWJsaWM6CisgIE1hcEtleSgpIDogdHlwZV8oKSB7fQorICBNYXBLZXkoY29uc3QgTWFwS2V5JiBvdGhlcikgOiB0eXBlXygpIHsgQ29weUZyb20ob3RoZXIpOyB9CisKKyAgTWFwS2V5JiBvcGVyYXRvcj0oY29uc3QgTWFwS2V5JiBvdGhlcikgeworICAgIENvcHlGcm9tKG90aGVyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+TWFwS2V5KCkgeworICAgIGlmICh0eXBlXyA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HKSB7CisgICAgICB2YWxfLnN0cmluZ192YWx1ZV8uRGVzdHJ1Y3QoKTsKKyAgICB9CisgIH0KKworICBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgdHlwZSgpIGNvbnN0IHsKKyAgICBpZiAodHlwZV8gPT0gRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlKCkpIHsKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJQcm90b2NvbCBCdWZmZXIgbWFwIHVzYWdlIGVycm9yOlxuIgorICAgICAgICAgICAgICAgICA8PCAiTWFwS2V5Ojp0eXBlIE1hcEtleSBpcyBub3QgaW5pdGlhbGl6ZWQuICIKKyAgICAgICAgICAgICAgICAgPDwgIkNhbGwgc2V0IG1ldGhvZHMgdG8gaW5pdGlhbGl6ZSBNYXBLZXkuIjsKKyAgICB9CisgICAgcmV0dXJuIHR5cGVfOworICB9CisKKyAgdm9pZCBTZXRJbnQ2NFZhbHVlKGludDY0X3QgdmFsdWUpIHsKKyAgICBTZXRUeXBlKEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NCk7CisgICAgdmFsXy5pbnQ2NF92YWx1ZV8gPSB2YWx1ZTsKKyAgfQorICB2b2lkIFNldFVJbnQ2NFZhbHVlKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgU2V0VHlwZShGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0KTsKKyAgICB2YWxfLnVpbnQ2NF92YWx1ZV8gPSB2YWx1ZTsKKyAgfQorICB2b2lkIFNldEludDMyVmFsdWUoaW50MzJfdCB2YWx1ZSkgeworICAgIFNldFR5cGUoRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyKTsKKyAgICB2YWxfLmludDMyX3ZhbHVlXyA9IHZhbHVlOworICB9CisgIHZvaWQgU2V0VUludDMyVmFsdWUodWludDMyX3QgdmFsdWUpIHsKKyAgICBTZXRUeXBlKEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzIpOworICAgIHZhbF8udWludDMyX3ZhbHVlXyA9IHZhbHVlOworICB9CisgIHZvaWQgU2V0Qm9vbFZhbHVlKGJvb2wgdmFsdWUpIHsKKyAgICBTZXRUeXBlKEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MKTsKKyAgICB2YWxfLmJvb2xfdmFsdWVfID0gdmFsdWU7CisgIH0KKyAgdm9pZCBTZXRTdHJpbmdWYWx1ZShzdGQ6OnN0cmluZyB2YWwpIHsKKyAgICBTZXRUeXBlKEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcpOworICAgICp2YWxfLnN0cmluZ192YWx1ZV8uZ2V0X211dGFibGUoKSA9IHN0ZDo6bW92ZSh2YWwpOworICB9CisKKyAgaW50NjRfdCBHZXRJbnQ2NFZhbHVlKCkgY29uc3QgeworICAgIFRZUEVfQ0hFQ0soRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0LCAiTWFwS2V5OjpHZXRJbnQ2NFZhbHVlIik7CisgICAgcmV0dXJuIHZhbF8uaW50NjRfdmFsdWVfOworICB9CisgIHVpbnQ2NF90IEdldFVJbnQ2NFZhbHVlKCkgY29uc3QgeworICAgIFRZUEVfQ0hFQ0soRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NCwgIk1hcEtleTo6R2V0VUludDY0VmFsdWUiKTsKKyAgICByZXR1cm4gdmFsXy51aW50NjRfdmFsdWVfOworICB9CisgIGludDMyX3QgR2V0SW50MzJWYWx1ZSgpIGNvbnN0IHsKKyAgICBUWVBFX0NIRUNLKEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMiwgIk1hcEtleTo6R2V0SW50MzJWYWx1ZSIpOworICAgIHJldHVybiB2YWxfLmludDMyX3ZhbHVlXzsKKyAgfQorICB1aW50MzJfdCBHZXRVSW50MzJWYWx1ZSgpIGNvbnN0IHsKKyAgICBUWVBFX0NIRUNLKEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzIsICJNYXBLZXk6OkdldFVJbnQzMlZhbHVlIik7CisgICAgcmV0dXJuIHZhbF8udWludDMyX3ZhbHVlXzsKKyAgfQorICBib29sIEdldEJvb2xWYWx1ZSgpIGNvbnN0IHsKKyAgICBUWVBFX0NIRUNLKEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MLCAiTWFwS2V5OjpHZXRCb29sVmFsdWUiKTsKKyAgICByZXR1cm4gdmFsXy5ib29sX3ZhbHVlXzsKKyAgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgR2V0U3RyaW5nVmFsdWUoKSBjb25zdCB7CisgICAgVFlQRV9DSEVDSyhGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HLCAiTWFwS2V5OjpHZXRTdHJpbmdWYWx1ZSIpOworICAgIHJldHVybiB2YWxfLnN0cmluZ192YWx1ZV8uZ2V0KCk7CisgIH0KKworICBib29sIG9wZXJhdG9yPChjb25zdCBNYXBLZXkmIG90aGVyKSBjb25zdCB7CisgICAgaWYgKHR5cGVfICE9IG90aGVyLnR5cGVfKSB7CisgICAgICAvLyBXZSBjb3VsZCBkZWZpbmUgYSB0b3RhbCBvcmRlciB0aGF0IGhhbmRsZXMgdGhpcyBjYXNlLCBidXQKKyAgICAgIC8vIHRoZXJlIGN1cnJlbnRseSBubyBuZWVkLiAgU28sIGZvciBub3csIGZhaWwuCisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5zdXBwb3J0ZWQ6IHR5cGUgbWlzbWF0Y2giOworICAgIH0KKyAgICBzd2l0Y2ggKHR5cGUoKSkgeworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuc3VwcG9ydGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICByZXR1cm4gdmFsXy5zdHJpbmdfdmFsdWVfLmdldCgpIDwgb3RoZXIudmFsXy5zdHJpbmdfdmFsdWVfLmdldCgpOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICAgIHJldHVybiB2YWxfLmludDY0X3ZhbHVlXyA8IG90aGVyLnZhbF8uaW50NjRfdmFsdWVfOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6CisgICAgICAgIHJldHVybiB2YWxfLmludDMyX3ZhbHVlXyA8IG90aGVyLnZhbF8uaW50MzJfdmFsdWVfOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgICByZXR1cm4gdmFsXy51aW50NjRfdmFsdWVfIDwgb3RoZXIudmFsXy51aW50NjRfdmFsdWVfOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgICByZXR1cm4gdmFsXy51aW50MzJfdmFsdWVfIDwgb3RoZXIudmFsXy51aW50MzJfdmFsdWVfOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKKyAgICAgICAgcmV0dXJuIHZhbF8uYm9vbF92YWx1ZV8gPCBvdGhlci52YWxfLmJvb2xfdmFsdWVfOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFwS2V5JiBvdGhlcikgY29uc3QgeworICAgIGlmICh0eXBlXyAhPSBvdGhlci50eXBlXykgeworICAgICAgLy8gVG8gYmUgY29uc2lzdGVudCB3aXRoIG9wZXJhdG9yPCwgd2UgZG9uJ3QgYWxsb3cgdGhpcyBlaXRoZXIuCisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5zdXBwb3J0ZWQ6IHR5cGUgbWlzbWF0Y2giOworICAgIH0KKyAgICBzd2l0Y2ggKHR5cGUoKSkgeworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuc3VwcG9ydGVkIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHJldHVybiB2YWxfLnN0cmluZ192YWx1ZV8uZ2V0KCkgPT0gb3RoZXIudmFsXy5zdHJpbmdfdmFsdWVfLmdldCgpOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICAgIHJldHVybiB2YWxfLmludDY0X3ZhbHVlXyA9PSBvdGhlci52YWxfLmludDY0X3ZhbHVlXzsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgICByZXR1cm4gdmFsXy5pbnQzMl92YWx1ZV8gPT0gb3RoZXIudmFsXy5pbnQzMl92YWx1ZV87CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICAgIHJldHVybiB2YWxfLnVpbnQ2NF92YWx1ZV8gPT0gb3RoZXIudmFsXy51aW50NjRfdmFsdWVfOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgICByZXR1cm4gdmFsXy51aW50MzJfdmFsdWVfID09IG90aGVyLnZhbF8udWludDMyX3ZhbHVlXzsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICAgIHJldHVybiB2YWxfLmJvb2xfdmFsdWVfID09IG90aGVyLnZhbF8uYm9vbF92YWx1ZV87CisgICAgfQorICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgQ29weUZyb20oY29uc3QgTWFwS2V5JiBvdGhlcikgeworICAgIFNldFR5cGUob3RoZXIudHlwZSgpKTsKKyAgICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDoKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5zdXBwb3J0ZWQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgKnZhbF8uc3RyaW5nX3ZhbHVlXy5nZXRfbXV0YWJsZSgpID0gb3RoZXIudmFsXy5zdHJpbmdfdmFsdWVfLmdldCgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgICAgICB2YWxfLmludDY0X3ZhbHVlXyA9IG90aGVyLnZhbF8uaW50NjRfdmFsdWVfOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgICB2YWxfLmludDMyX3ZhbHVlXyA9IG90aGVyLnZhbF8uaW50MzJfdmFsdWVfOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgICAgdmFsXy51aW50NjRfdmFsdWVfID0gb3RoZXIudmFsXy51aW50NjRfdmFsdWVfOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgdmFsXy51aW50MzJfdmFsdWVfID0gb3RoZXIudmFsXy51aW50MzJfdmFsdWVfOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICAgIHZhbF8uYm9vbF92YWx1ZV8gPSBvdGhlci52YWxfLmJvb2xfdmFsdWVfOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlR5cGVEZWZpbmVkTWFwRmllbGRCYXNlOworICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1hcEl0ZXJhdG9yOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkR5bmFtaWNNYXBGaWVsZDsKKworICB1bmlvbiBLZXlWYWx1ZSB7CisgICAgS2V5VmFsdWUoKSB7fQorICAgIGludGVybmFsOjpFeHBsaWNpdGx5Q29uc3RydWN0ZWQ8c3RkOjpzdHJpbmc+IHN0cmluZ192YWx1ZV87CisgICAgaW50NjRfdCBpbnQ2NF92YWx1ZV87CisgICAgaW50MzJfdCBpbnQzMl92YWx1ZV87CisgICAgdWludDY0X3QgdWludDY0X3ZhbHVlXzsKKyAgICB1aW50MzJfdCB1aW50MzJfdmFsdWVfOworICAgIGJvb2wgYm9vbF92YWx1ZV87CisgIH0gdmFsXzsKKworICB2b2lkIFNldFR5cGUoRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIHR5cGUpIHsKKyAgICBpZiAodHlwZV8gPT0gdHlwZSkgcmV0dXJuOworICAgIGlmICh0eXBlXyA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HKSB7CisgICAgICB2YWxfLnN0cmluZ192YWx1ZV8uRGVzdHJ1Y3QoKTsKKyAgICB9CisgICAgdHlwZV8gPSB0eXBlOworICAgIGlmICh0eXBlXyA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HKSB7CisgICAgICB2YWxfLnN0cmluZ192YWx1ZV8uRGVmYXVsdENvbnN0cnVjdCgpOworICAgIH0KKyAgfQorCisgIC8vIHR5cGVfIGlzIDAgb3IgYSB2YWxpZCBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUuCisgIC8vIFVzZSAiQ3BwVHlwZSgpIiB0byBpbmRpY2F0ZSB6ZXJvLgorICBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgdHlwZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKK25hbWVzcGFjZSBzdGQgewordGVtcGxhdGUgPD4KK3N0cnVjdCBoYXNoPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNYXBLZXk+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1hcEtleSYgbWFwX2tleSkgY29uc3QgeworICAgIHN3aXRjaCAobWFwX2tleS50eXBlKCkpIHsKKyAgICAgIGNhc2UgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICBjYXNlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICBjYXNlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgIGNhc2UgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5zdXBwb3J0ZWQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHJldHVybiBoYXNoPHN0ZDo6c3RyaW5nPigpKG1hcF9rZXkuR2V0U3RyaW5nVmFsdWUoKSk7CisgICAgICBjYXNlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKKyAgICAgICAgYXV0byB2YWx1ZSA9IG1hcF9rZXkuR2V0SW50NjRWYWx1ZSgpOworICAgICAgICByZXR1cm4gaGFzaDxkZWNsdHlwZSh2YWx1ZSk+KCkodmFsdWUpOworICAgICAgfQorICAgICAgY2FzZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7CisgICAgICAgIGF1dG8gdmFsdWUgPSBtYXBfa2V5LkdldEludDMyVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGhhc2g8ZGVjbHR5cGUodmFsdWUpPigpKG1hcF9rZXkuR2V0SW50MzJWYWx1ZSgpKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6IHsKKyAgICAgICAgYXV0byB2YWx1ZSA9IG1hcF9rZXkuR2V0VUludDY0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGhhc2g8ZGVjbHR5cGUodmFsdWUpPigpKG1hcF9rZXkuR2V0VUludDY0VmFsdWUoKSk7CisgICAgICB9CisgICAgICBjYXNlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7CisgICAgICAgIGF1dG8gdmFsdWUgPSBtYXBfa2V5LkdldFVJbnQzMlZhbHVlKCk7CisgICAgICAgIHJldHVybiBoYXNoPGRlY2x0eXBlKHZhbHVlKT4oKShtYXBfa2V5LkdldFVJbnQzMlZhbHVlKCkpOworICAgICAgfQorICAgICAgY2FzZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6IHsKKyAgICAgICAgcmV0dXJuIGhhc2g8Ym9vbD4oKShtYXBfa2V5LkdldEJvb2xWYWx1ZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNYXBLZXkmIG1hcF9rZXkxLAorICAgICAgICAgICAgICAgICAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1hcEtleSYgbWFwX2tleTIpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFwX2tleTEgPCBtYXBfa2V5MjsKKyAgfQorfTsKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworY2xhc3MgQ29udGVuZGVkTWFwQ2xlYW5UZXN0OworY2xhc3MgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb247CitjbGFzcyBNYXBGaWVsZEFjY2Vzc29yOworCisvLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGFjY2VzcyB0byBtYXAgZmllbGQgdXNpbmcgcmVmbGVjdGlvbiwgd2hpY2ggaXMgdGhlIHNhbWUKKy8vIGFzIHRob3NlIHByb3ZpZGVkIGZvciBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+LiBJdCBpcyB1c2VkIGZvciBpbnRlcm5hbAorLy8gcmVmbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiBvbmx5LiBVc2VycyBzaG91bGQgbmV2ZXIgdXNlIHRoaXMgZGlyZWN0bHkuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTWFwRmllbGRCYXNlIHsKKyBwdWJsaWM6CisgIE1hcEZpZWxkQmFzZSgpCisgICAgICA6IGFyZW5hXyhudWxscHRyKSwgcmVwZWF0ZWRfZmllbGRfKG51bGxwdHIpLCBzdGF0ZV8oU1RBVEVfTU9ESUZJRURfTUFQKSB7fQorCisgIC8vIFRoaXMgY29uc3RydWN0b3IgaXMgZm9yIGNvbnN0YW50IGluaXRpYWxpemVkIGdsb2JhbCBpbnN0YW5jZXMuCisgIC8vIEl0IHVzZXMgYSBsaW5rZXIgaW5pdGlhbGl6ZWQgbXV0ZXgsIHNvIGl0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggcmVndWxhcgorICAvLyBydW50aW1lIGluc3RhbmNlcy4KKyAgLy8gRXhjZXB0IGluIE1TVkMsIHdoZXJlIHdlIGNhbid0IGhhdmUgYSBjb25zdGluaXQgbXV0ZXguCisgIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1leHBsaWNpdC1jb25zdHJ1Y3RvcikKKyAgY29uc3RleHByIE1hcEZpZWxkQmFzZShDb25zdGFudEluaXRpYWxpemVkKQorICAgICAgOiBhcmVuYV8obnVsbHB0ciksCisgICAgICAgIHJlcGVhdGVkX2ZpZWxkXyhudWxscHRyKSwKKyAgICAgICAgbXV0ZXhfKEdPT0dMRV9QUk9UT0JVRl9MSU5LRVJfSU5JVElBTElaRUQpLAorICAgICAgICBzdGF0ZV8oU1RBVEVfTU9ESUZJRURfTUFQKSB7fQorICBleHBsaWNpdCBNYXBGaWVsZEJhc2UoQXJlbmEqIGFyZW5hKQorICAgICAgOiBhcmVuYV8oYXJlbmEpLCByZXBlYXRlZF9maWVsZF8obnVsbHB0ciksIHN0YXRlXyhTVEFURV9NT0RJRklFRF9NQVApIHt9CisKKyBwcm90ZWN0ZWQ6CisgIH5NYXBGaWVsZEJhc2UoKSB7ICAvLyAicHJvdGVjdGVkIiBzdG9wcyB1c2VycyBmcm9tIGRlbGV0aW5nIGEgYE1hcEZpZWxkQmFzZSAqYAorICAgIEdPT0dMRV9EQ0hFQ0socmVwZWF0ZWRfZmllbGRfID09IG51bGxwdHIpOworICB9CisgIHZvaWQgRGVzdHJ1Y3QoKTsKKworIHB1YmxpYzoKKyAgLy8gUmV0dXJucyByZWZlcmVuY2UgdG8gaW50ZXJuYWwgcmVwZWF0ZWQgZmllbGQuIERhdGEgd3JpdHRlbiB1c2luZworICAvLyBNYXAncyBhcGkgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGlzIGd1YXJhbnR0ZWQgdG8gYmUKKyAgLy8gaW5jbHVkZWQgaW4gcmVwZWF0ZWQgZmllbGQuCisgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGRCYXNlJiBHZXRSZXBlYXRlZEZpZWxkKCkgY29uc3Q7CisKKyAgLy8gTGlrZSBhYm92ZS4gUmV0dXJucyBtdXRhYmxlIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIHJlcGVhdGVkIGZpZWxkLgorICBSZXBlYXRlZFB0ckZpZWxkQmFzZSogTXV0YWJsZVJlcGVhdGVkRmllbGQoKTsKKworICAvLyBQdXJlIHZpcnR1YWwgbWFwIEFQSXMgZm9yIE1hcCBSZWZsZWN0aW9uLgorICB2aXJ0dWFsIGJvb2wgQ29udGFpbnNNYXBLZXkoY29uc3QgTWFwS2V5JiBtYXBfa2V5KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBJbnNlcnRPckxvb2t1cE1hcFZhbHVlKGNvbnN0IE1hcEtleSYgbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwVmFsdWVSZWYqIHZhbCkgPSAwOworICB2aXJ0dWFsIGJvb2wgTG9va3VwTWFwVmFsdWUoY29uc3QgTWFwS2V5JiBtYXBfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwVmFsdWVDb25zdFJlZiogdmFsKSBjb25zdCA9IDA7CisgIGJvb2wgTG9va3VwTWFwVmFsdWUoY29uc3QgTWFwS2V5JiwgTWFwVmFsdWVSZWYqKSBjb25zdCA9IGRlbGV0ZTsKKworICAvLyBSZXR1cm5zIHdoZXRoZXIgY2hhbmdlcyB0byB0aGUgbWFwIGFyZSByZWZsZWN0ZWQgaW4gdGhlIHJlcGVhdGVkIGZpZWxkLgorICBib29sIElzUmVwZWF0ZWRGaWVsZFZhbGlkKCkgY29uc3Q7CisgIC8vIEluc3VyZXMgb3BlcmF0aW9ucyBhZnRlciB3b24ndCBnZXQgZXhlY3V0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAgYm9vbCBJc01hcFZhbGlkKCkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBEZWxldGVNYXBWYWx1ZShjb25zdCBNYXBLZXkmIG1hcF9rZXkpID0gMDsKKyAgdmlydHVhbCBib29sIEVxdWFsSXRlcmF0b3IoY29uc3QgTWFwSXRlcmF0b3ImIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hcEl0ZXJhdG9yJiBiKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBNYXBCZWdpbihNYXBJdGVyYXRvciogbWFwX2l0ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIE1hcEVuZChNYXBJdGVyYXRvciogbWFwX2l0ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIE1lcmdlRnJvbShjb25zdCBNYXBGaWVsZEJhc2UmIG90aGVyKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTd2FwKE1hcEZpZWxkQmFzZSogb3RoZXIpOworICB2aXJ0dWFsIHZvaWQgVW5zYWZlU2hhbGxvd1N3YXAoTWFwRmllbGRCYXNlKiBvdGhlcik7CisgIC8vIFN5bmMgTWFwIHdpdGggcmVwZWF0ZWQgZmllbGQgYW5kIHJldHVybnMgdGhlIHNpemUgb2YgbWFwLgorICB2aXJ0dWFsIGludCBzaXplKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgQ2xlYXIoKSA9IDA7CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgYnkgdGhlIHJlcGVhdGVkIGZpZWxkLCBleGNsdWRpbmcKKyAgLy8gc2l6ZW9mKCp0aGlzKQorICBzaXplX3QgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKSBjb25zdDsKKworICBpbnQgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OlRvSW50U2l6ZShTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZygpKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICAvLyBHZXRzIHRoZSBzaXplIG9mIHNwYWNlIHVzZWQgYnkgbWFwIGZpZWxkLgorICB2aXJ0dWFsIHNpemVfdCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTm9Mb2NrKCkgY29uc3Q7CisKKyAgLy8gU3luY2hyb25pemVzIHRoZSBjb250ZW50IGluIE1hcCB0byBSZXBlYXRlZFB0ckZpZWxkIGlmIHRoZXJlIGlzIGFueSBjaGFuZ2UKKyAgLy8gdG8gTWFwIGFmdGVyIGxhc3Qgc3luY2hyb25pemF0aW9uLgorICB2b2lkIFN5bmNSZXBlYXRlZEZpZWxkV2l0aE1hcCgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgU3luY1JlcGVhdGVkRmllbGRXaXRoTWFwTm9Mb2NrKCkgY29uc3Q7CisKKyAgLy8gU3luY2hyb25pemVzIHRoZSBjb250ZW50IGluIFJlcGVhdGVkUHRyRmllbGQgdG8gTWFwIGlmIHRoZXJlIGlzIGFueSBjaGFuZ2UKKyAgLy8gdG8gUmVwZWF0ZWRQdHJGaWVsZCBhZnRlciBsYXN0IHN5bmNocm9uaXphdGlvbi4KKyAgdm9pZCBTeW5jTWFwV2l0aFJlcGVhdGVkRmllbGQoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIFN5bmNNYXBXaXRoUmVwZWF0ZWRGaWVsZE5vTG9jaygpIGNvbnN0IHt9CisKKyAgLy8gVGVsbHMgTWFwRmllbGRCYXNlIHRoYXQgdGhlcmUgaXMgbmV3IGNoYW5nZSB0byBNYXAuCisgIHZvaWQgU2V0TWFwRGlydHkoKTsKKworICAvLyBUZWxscyBNYXBGaWVsZEJhc2UgdGhhdCB0aGVyZSBpcyBuZXcgY2hhbmdlIHRvIFJlcGVhdGVkUHRyRmllbGQuCisgIHZvaWQgU2V0UmVwZWF0ZWREaXJ0eSgpOworCisgIC8vIFByb3ZpZGVzIGRlcml2ZWQgY2xhc3MgdGhlIGFjY2VzcyB0byByZXBlYXRlZCBmaWVsZC4KKyAgdm9pZCogTXV0YWJsZVJlcGVhdGVkUHRyRmllbGQoKSBjb25zdDsKKworICB2b2lkIEludGVybmFsU3dhcChNYXBGaWVsZEJhc2UqIG90aGVyKTsKKworICAvLyBTdXBwb3J0IHRocmVhZCBzYW5pdGl6ZXIgKHRzYW4pIGJ5IG1ha2luZyBjb25zdCAvIG11dGFibGUgcmFjZXMKKyAgLy8gbW9yZSBhcHBhcmVudC4gIElmIG9uZSB0aHJlYWQgY2FsbHMgTXV0YWJsZUFjY2VzcygpIHdoaWxlIGFub3RoZXIKKyAgLy8gdGhyZWFkIGNhbGxzIGVpdGhlciBDb25zdEFjY2VzcygpIG9yIE11dGFibGVBY2Nlc3MoKSwgb24gdGhlIHNhbWUKKyAgLy8gTWFwRmllbGRCYXNlLWRlcml2ZWQgb2JqZWN0LCBhbmQgdGhlcmUgaXMgbm8gc3luY2hyb25pemF0aW9uIGdvaW5nCisgIC8vIG9uIGJldHdlZW4gdGhlbSwgdHNhbiB3aWxsIGFsZXJ0LgorI2lmIGRlZmluZWQoX19TQU5JVElaRV9USFJFQURfXykgfHwgZGVmaW5lZChUSFJFQURfU0FOSVRJWkVSKQorICB2b2lkIENvbnN0QWNjZXNzKCkgY29uc3QgeyBHT09HTEVfQ0hFQ0tfRVEoc2VxMV8sIHNlcTJfKTsgfQorICB2b2lkIE11dGFibGVBY2Nlc3MoKSB7CisgICAgaWYgKHNlcTFfICYgMSkgeworICAgICAgc2VxMl8gPSArK3NlcTFfOworICAgIH0gZWxzZSB7CisgICAgICBzZXExXyA9ICsrc2VxMl87CisgICAgfQorICB9CisgIHVuc2lnbmVkIGludCBzZXExXyA9IDAsIHNlcTJfID0gMDsKKyNlbHNlCisgIHZvaWQgQ29uc3RBY2Nlc3MoKSBjb25zdCB7fQorICB2b2lkIE11dGFibGVBY2Nlc3MoKSB7fQorI2VuZGlmCisgIGVudW0gU3RhdGUgeworICAgIFNUQVRFX01PRElGSUVEX01BUCA9IDAsICAgICAgIC8vIG1hcCBoYXMgbmV3bHkgYWRkZWQgZGF0YSB0aGF0IGhhcyBub3QgYmVlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5bmNocm9uaXplZCB0byByZXBlYXRlZCBmaWVsZAorICAgIFNUQVRFX01PRElGSUVEX1JFUEVBVEVEID0gMSwgIC8vIHJlcGVhdGVkIGZpZWxkIGhhcyBuZXdseSBhZGRlZCBkYXRhIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXMgbm90IGJlZW4gc3luY2hyb25pemVkIHRvIG1hcAorICAgIENMRUFOID0gMiwgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgaW4gbWFwIGFuZCByZXBlYXRlZCBmaWVsZCBhcmUgc2FtZQorICB9OworCisgIEFyZW5hKiBhcmVuYV87CisgIG11dGFibGUgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiogcmVwZWF0ZWRfZmllbGRfOworCisgIG11dGFibGUgaW50ZXJuYWw6OldyYXBwZWRNdXRleAorICAgICAgbXV0ZXhfOyAgLy8gVGhlIHRocmVhZCB0byBzeW5jaHJvbml6ZSBtYXAgYW5kIHJlcGVhdGVkIGZpZWxkCisgICAgICAgICAgICAgICAvLyBuZWVkcyB0byBnZXQgbG9jayBmaXJzdDsKKyAgbXV0YWJsZSBzdGQ6OmF0b21pYzxTdGF0ZT4gc3RhdGVfOworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIENvbnRlbmRlZE1hcENsZWFuVGVzdDsKKyAgZnJpZW5kIGNsYXNzIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOworICBmcmllbmQgY2xhc3MgTWFwRmllbGRBY2Nlc3NvcjsKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uOworICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkR5bmFtaWNNZXNzYWdlOworCisgIC8vIFZpcnR1YWwgaGVscGVyIG1ldGhvZHMgZm9yIE1hcEl0ZXJhdG9yLiBNYXBJdGVyYXRvciBkb2Vzbid0IGhhdmUgdGhlCisgIC8vIHR5cGUgaGVscGVyIGZvciBrZXkgYW5kIHZhbHVlLiBDYWxsIHRoZXNlIGhlbHAgbWV0aG9kcyB0byBkZWFsIHdpdGgKKyAgLy8gZGlmZmVyZW50IHR5cGVzLiBSZWFsIGhlbHBlciBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZCBpbgorICAvLyBUeXBlRGVmaW5lZE1hcEZpZWxkQmFzZS4KKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNYXBJdGVyYXRvcjsKKyAgLy8gQWxsb2NhdGUgbWFwPC4uLj46Oml0ZXJhdG9yIGZvciBNYXBJdGVyYXRvci4KKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemVJdGVyYXRvcihNYXBJdGVyYXRvciogbWFwX2l0ZXIpIGNvbnN0ID0gMDsKKworICAvLyBEZWxldGVJdGVyYXRvcigpIGlzIGNhbGxlZCBieSB0aGUgZGVzdHJ1Y3RvciBvZiBNYXBJdGVyYXRvciBvbmx5LgorICAvLyBJdCBkZWxldGVzIG1hcDwuLi4+OjppdGVyYXRvciBmb3IgTWFwSXRlcmF0b3IuCisgIHZpcnR1YWwgdm9pZCBEZWxldGVJdGVyYXRvcihNYXBJdGVyYXRvciogbWFwX2l0ZXIpIGNvbnN0ID0gMDsKKworICAvLyBDb3B5IHRoZSBtYXA8Li4uPjo6aXRlcmF0b3IgZnJvbSBvdGhlcl9pdGVyYXRvciB0bworICAvLyB0aGlzX2l0ZXJhdG9yLgorICB2aXJ0dWFsIHZvaWQgQ29weUl0ZXJhdG9yKE1hcEl0ZXJhdG9yKiB0aGlzX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hcEl0ZXJhdG9yJiBvdGhlcl9pdGVyYXRvcikgY29uc3QgPSAwOworCisgIC8vIEluY3JlYXNlSXRlcmF0b3IoKSBpcyBjYWxsZWQgYnkgb3BlcmF0b3IrKygpIG9mIE1hcEl0ZXJhdG9yIG9ubHkuCisgIC8vIEl0IGltcGxlbWVudHMgdGhlICsrIG9wZXJhdG9yIG9mIE1hcEl0ZXJhdG9yLgorICB2aXJ0dWFsIHZvaWQgSW5jcmVhc2VJdGVyYXRvcihNYXBJdGVyYXRvciogbWFwX2l0ZXIpIGNvbnN0ID0gMDsKKworICAvLyBTd2FwcyBzdGF0ZV8gd2l0aCBhbm90aGVyIE1hcEZpZWxkQmFzZQorICB2b2lkIFN3YXBTdGF0ZShNYXBGaWVsZEJhc2UqIG90aGVyKTsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWFwRmllbGRCYXNlKTsKK307CisKKy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29tbW9uIE1hcCBSZWZsZWN0aW9uIGltcGxlbWVudGF0aW9ucyBmb3IgZ2VuZXJhdGVkCisvLyBtZXNzYWdlIGFuZCBkeW5hbWljIG1lc3NhZ2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBUPgorY2xhc3MgVHlwZURlZmluZWRNYXBGaWVsZEJhc2UgOiBwdWJsaWMgTWFwRmllbGRCYXNlIHsKKyBwdWJsaWM6CisgIFR5cGVEZWZpbmVkTWFwRmllbGRCYXNlKCkge30KKworICAvLyBUaGlzIGNvbnN0cnVjdG9yIGlzIGZvciBjb25zdGFudCBpbml0aWFsaXplZCBnbG9iYWwgaW5zdGFuY2VzLgorICAvLyBJdCB1c2VzIGEgbGlua2VyIGluaXRpYWxpemVkIG11dGV4LCBzbyBpdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHJlZ3VsYXIKKyAgLy8gcnVudGltZSBpbnN0YW5jZXMuCisgIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1leHBsaWNpdC1jb25zdHJ1Y3RvcikKKyAgY29uc3RleHByIFR5cGVEZWZpbmVkTWFwRmllbGRCYXNlKENvbnN0YW50SW5pdGlhbGl6ZWQgdGFnKQorICAgICAgOiBNYXBGaWVsZEJhc2UodGFnKSB7fQorICBleHBsaWNpdCBUeXBlRGVmaW5lZE1hcEZpZWxkQmFzZShBcmVuYSogYXJlbmEpIDogTWFwRmllbGRCYXNlKGFyZW5hKSB7fQorICBUeXBlRGVmaW5lZE1hcEZpZWxkQmFzZShBcmVuYUluaXRpYWxpemVkLCBBcmVuYSogYXJlbmEpCisgICAgICA6IFR5cGVEZWZpbmVkTWFwRmllbGRCYXNlKGFyZW5hKSB7fQorCisgcHJvdGVjdGVkOgorICB+VHlwZURlZmluZWRNYXBGaWVsZEJhc2UoKSB7fQorICB1c2luZyBNYXBGaWVsZEJhc2U6OkRlc3RydWN0OworCisgcHVibGljOgorICB2b2lkIE1hcEJlZ2luKE1hcEl0ZXJhdG9yKiBtYXBfaXRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgTWFwRW5kKE1hcEl0ZXJhdG9yKiBtYXBfaXRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgRXF1YWxJdGVyYXRvcihjb25zdCBNYXBJdGVyYXRvciYgYSwgY29uc3QgTWFwSXRlcmF0b3ImIGIpIGNvbnN0IG92ZXJyaWRlOworCisgIHZpcnR1YWwgY29uc3QgTWFwPEtleSwgVD4mIEdldE1hcCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBNYXA8S2V5LCBUPiogTXV0YWJsZU1hcCgpID0gMDsKKworIHByb3RlY3RlZDoKKyAgdHlwZW5hbWUgTWFwPEtleSwgVD46OmNvbnN0X2l0ZXJhdG9yJiBJbnRlcm5hbEdldEl0ZXJhdG9yKAorICAgICAgY29uc3QgTWFwSXRlcmF0b3IqIG1hcF9pdGVyKSBjb25zdDsKKworIHByaXZhdGU6CisgIHZvaWQgSW5pdGlhbGl6ZUl0ZXJhdG9yKE1hcEl0ZXJhdG9yKiBtYXBfaXRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgRGVsZXRlSXRlcmF0b3IoTWFwSXRlcmF0b3IqIG1hcF9pdGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBDb3B5SXRlcmF0b3IoTWFwSXRlcmF0b3IqIHRoaXNfaXRlcmF0b3JtLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXBJdGVyYXRvciYgdGhhdF9pdGVyYXRvcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgSW5jcmVhc2VJdGVyYXRvcihNYXBJdGVyYXRvciogbWFwX2l0ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHZpcnR1YWwgdm9pZCBTZXRNYXBJdGVyYXRvclZhbHVlKE1hcEl0ZXJhdG9yKiBtYXBfaXRlcikgY29uc3QgPSAwOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVHlwZURlZmluZWRNYXBGaWVsZEJhc2UpOworfTsKKworLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhY2Nlc3MgdG8gbWFwIGZpZWxkIHVzaW5nIGdlbmVyYXRlZCBhcGkuIEl0IGlzIHVzZWQgZm9yCisvLyBpbnRlcm5hbCBnZW5lcmF0ZWQgbWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBvbmx5LiBVc2VycyBzaG91bGQgbmV2ZXIgdXNlIHRoaXMKKy8vIGRpcmVjdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVCwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtLZXlGaWVsZFR5cGUsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrVmFsdWVGaWVsZFR5cGU+CitjbGFzcyBNYXBGaWVsZCA6IHB1YmxpYyBUeXBlRGVmaW5lZE1hcEZpZWxkQmFzZTxLZXksIFQ+IHsKKyAgLy8gUHJvdmlkZSB1dGlsaXRpZXMgdG8gcGFyc2Uvc2VyaWFsaXplIGtleS92YWx1ZS4gIFByb3ZpZGUgdXRpbGl0aWVzIHRvCisgIC8vIG1hbmlwdWxhdGUgaW50ZXJuYWwgc3RvcmVkIHR5cGUuCisgIHR5cGVkZWYgTWFwVHlwZUhhbmRsZXI8a0tleUZpZWxkVHlwZSwgS2V5PiBLZXlUeXBlSGFuZGxlcjsKKyAgdHlwZWRlZiBNYXBUeXBlSGFuZGxlcjxrVmFsdWVGaWVsZFR5cGUsIFQ+IFZhbHVlVHlwZUhhbmRsZXI7CisKKyAgLy8gRGVmaW5lIG1lc3NhZ2UgdHlwZSBmb3IgaW50ZXJuYWwgcmVwZWF0ZWQgZmllbGQuCisgIHR5cGVkZWYgRGVyaXZlZCBFbnRyeVR5cGU7CisKKyAgLy8gRGVmaW5lIGFiYnJldmlhdGlvbiBmb3IgcGFyZW50IE1hcEZpZWxkTGl0ZQorICB0eXBlZGVmIE1hcEZpZWxkTGl0ZTxEZXJpdmVkLCBLZXksIFQsIGtLZXlGaWVsZFR5cGUsIGtWYWx1ZUZpZWxkVHlwZT4KKyAgICAgIE1hcEZpZWxkTGl0ZVR5cGU7CisKKyAgLy8gRW51bSBuZWVkcyB0byBiZSBoYW5kbGVkIGRpZmZlcmVudGx5IGZyb20gb3RoZXIgdHlwZXMgYmVjYXVzZSBpdCBoYXMKKyAgLy8gZGlmZmVyZW50IGV4cG9zZWQgdHlwZSBpbiBNYXAncyBhcGkgYW5kIHJlcGVhdGVkIGZpZWxkJ3MgYXBpLiBGb3IKKyAgLy8gZGV0YWlscyBzZWUgdGhlIGNvbW1lbnQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mCisgIC8vIFN5bmNNYXBXaXRoUmVwZWF0ZWRGaWVsZE5vTG9jay4KKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIGtJc1ZhbHVlRW51bSA9IFZhbHVlVHlwZUhhbmRsZXI6OmtJc0VudW07CisgIHR5cGVkZWYgdHlwZW5hbWUgTWFwSWY8a0lzVmFsdWVFbnVtLCBULCBjb25zdCBUJj46OnR5cGUgQ2FzdFZhbHVlVHlwZTsKKworIHB1YmxpYzoKKyAgdHlwZWRlZiBNYXA8S2V5LCBUPiBNYXBUeXBlOworCisgIE1hcEZpZWxkKCkgOiBpbXBsXygpIHt9CisgIHZpcnR1YWwgfk1hcEZpZWxkKCkge30gIC8vIERlc3RydWN0KCkgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBjYWxsZWQhCisgIHZvaWQgRGVzdHJ1Y3QoKSB7CisgICAgaW1wbF8uRGVzdHJ1Y3QoKTsKKyAgICBUeXBlRGVmaW5lZE1hcEZpZWxkQmFzZTxLZXksIFQ+OjpEZXN0cnVjdCgpOworICB9CisKKyAgLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyBmb3IgY29uc3RhbnQgaW5pdGlhbGl6ZWQgZ2xvYmFsIGluc3RhbmNlcy4KKyAgLy8gSXQgdXNlcyBhIGxpbmtlciBpbml0aWFsaXplZCBtdXRleCwgc28gaXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCByZWd1bGFyCisgIC8vIHJ1bnRpbWUgaW5zdGFuY2VzLgorICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCisgIGNvbnN0ZXhwciBNYXBGaWVsZChDb25zdGFudEluaXRpYWxpemVkIHRhZykKKyAgICAgIDogVHlwZURlZmluZWRNYXBGaWVsZEJhc2U8S2V5LCBUPih0YWcpLCBpbXBsXygpIHt9CisgIGV4cGxpY2l0IE1hcEZpZWxkKEFyZW5hKiBhcmVuYSkKKyAgICAgIDogVHlwZURlZmluZWRNYXBGaWVsZEJhc2U8S2V5LCBUPihhcmVuYSksIGltcGxfKGFyZW5hKSB7fQorICBNYXBGaWVsZChBcmVuYUluaXRpYWxpemVkLCBBcmVuYSogYXJlbmEpIDogTWFwRmllbGQoYXJlbmEpIHt9CisKKyAgLy8gSW1wbGVtZW50IE1hcEZpZWxkQmFzZQorICBib29sIENvbnRhaW5zTWFwS2V5KGNvbnN0IE1hcEtleSYgbWFwX2tleSkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgSW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShjb25zdCBNYXBLZXkmIG1hcF9rZXksIE1hcFZhbHVlUmVmKiB2YWwpIG92ZXJyaWRlOworICBib29sIExvb2t1cE1hcFZhbHVlKGNvbnN0IE1hcEtleSYgbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICBNYXBWYWx1ZUNvbnN0UmVmKiB2YWwpIGNvbnN0IG92ZXJyaWRlOworICBib29sIExvb2t1cE1hcFZhbHVlKGNvbnN0IE1hcEtleSYsIE1hcFZhbHVlUmVmKikgY29uc3QgPSBkZWxldGU7CisgIGJvb2wgRGVsZXRlTWFwVmFsdWUoY29uc3QgTWFwS2V5JiBtYXBfa2V5KSBvdmVycmlkZTsKKworICBjb25zdCBNYXA8S2V5LCBUPiYgR2V0TWFwKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIE1hcEZpZWxkQmFzZTo6U3luY01hcFdpdGhSZXBlYXRlZEZpZWxkKCk7CisgICAgcmV0dXJuIGltcGxfLkdldE1hcCgpOworICB9CisKKyAgTWFwPEtleSwgVD4qIE11dGFibGVNYXAoKSBvdmVycmlkZSB7CisgICAgTWFwRmllbGRCYXNlOjpTeW5jTWFwV2l0aFJlcGVhdGVkRmllbGQoKTsKKyAgICBNYXA8S2V5LCBUPiogcmVzdWx0ID0gaW1wbF8uTXV0YWJsZU1hcCgpOworICAgIE1hcEZpZWxkQmFzZTo6U2V0TWFwRGlydHkoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgaW50IHNpemUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBDbGVhcigpIG92ZXJyaWRlOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBNYXBGaWVsZEJhc2UmIG90aGVyKSBvdmVycmlkZTsKKyAgdm9pZCBTd2FwKE1hcEZpZWxkQmFzZSogb3RoZXIpIG92ZXJyaWRlOworICB2b2lkIFVuc2FmZVNoYWxsb3dTd2FwKE1hcEZpZWxkQmFzZSogb3RoZXIpIG92ZXJyaWRlOworICB2b2lkIEludGVybmFsU3dhcChNYXBGaWVsZCogb3RoZXIpOworCisgIC8vIFVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHBhcnNpbmcuIENhbGxlciBzaG91bGQgdGFrZSB0aGUgb3duZXJzaGlwIGlmZgorICAvLyBhcmVuYV8gaXMgbnVsbHB0ci4KKyAgRW50cnlUeXBlKiBOZXdFbnRyeSgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLk5ld0VudHJ5KCk7IH0KKworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIFBhcnNlQ29udGV4dCogY3R4KSB7CisgICAgcmV0dXJuIGltcGxfLl9JbnRlcm5hbFBhcnNlKHB0ciwgY3R4KTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVW5rbm93blR5cGU+CisgIGNvbnN0IGNoYXIqIFBhcnNlV2l0aEVudW1WYWxpZGF0aW9uKGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc192YWxpZCkoaW50KSwgdWludDMyX3QgZmllbGRfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbE1ldGFkYXRhKiBtZXRhZGF0YSkgeworICAgIHJldHVybiBpbXBsXy50ZW1wbGF0ZSBQYXJzZVdpdGhFbnVtVmFsaWRhdGlvbjxVbmtub3duVHlwZT4oCisgICAgICAgIHB0ciwgY3R4LCBpc192YWxpZCwgZmllbGRfbnVtLCBtZXRhZGF0YSk7CisgIH0KKworIHByaXZhdGU6CisgIE1hcEZpZWxkTGl0ZVR5cGUgaW1wbF87CisKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworCisgIC8vIEltcGxlbWVudHMgTWFwRmllbGRCYXNlCisgIHZvaWQgU3luY1JlcGVhdGVkRmllbGRXaXRoTWFwTm9Mb2NrKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU3luY01hcFdpdGhSZXBlYXRlZEZpZWxkTm9Mb2NrKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHNpemVfdCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTm9Mb2NrKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBTZXRNYXBJdGVyYXRvclZhbHVlKE1hcEl0ZXJhdG9yKiBtYXBfaXRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTsKKyAgZnJpZW5kIGNsYXNzIE1hcEZpZWxkU3RhdGVUZXN0OyAgLy8gRm9yIHRlc3RpbmcsIGl0IG5lZWRzIHJhdyBhY2Nlc3MgdG8gaW1wbF8KKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1hcEZpZWxkKTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrZXlfd2lyZV90eXBlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgdmFsdWVfd2lyZV90eXBlPgorYm9vbCBBbGxBcmVJbml0aWFsaXplZCgKKyAgICBjb25zdCBNYXBGaWVsZDxEZXJpdmVkLCBLZXksIFQsIGtleV93aXJlX3R5cGUsIHZhbHVlX3dpcmVfdHlwZT4mIGZpZWxkKSB7CisgIGNvbnN0IGF1dG8mIHQgPSBmaWVsZC5HZXRNYXAoKTsKKyAgZm9yICh0eXBlbmFtZSBNYXA8S2V5LCBUPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0LmJlZ2luKCk7IGl0ICE9IHQuZW5kKCk7CisgICAgICAgKytpdCkgeworICAgIGlmICghaXQtPnNlY29uZC5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVmFsdWUsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrS2V5RmllbGRUeXBlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga1ZhbHVlRmllbGRUeXBlPgorc3RydWN0IE1hcEVudHJ5VG9NYXBGaWVsZDwKKyAgICBNYXBFbnRyeTxULCBLZXksIFZhbHVlLCBrS2V5RmllbGRUeXBlLCBrVmFsdWVGaWVsZFR5cGU+PiB7CisgIHR5cGVkZWYgTWFwRmllbGQ8VCwgS2V5LCBWYWx1ZSwga0tleUZpZWxkVHlwZSwga1ZhbHVlRmllbGRUeXBlPiBNYXBGaWVsZFR5cGU7Cit9OworCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRHluYW1pY01hcEZpZWxkCisgICAgOiBwdWJsaWMgVHlwZURlZmluZWRNYXBGaWVsZEJhc2U8TWFwS2V5LCBNYXBWYWx1ZVJlZj4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgRHluYW1pY01hcEZpZWxkKGNvbnN0IE1lc3NhZ2UqIGRlZmF1bHRfZW50cnkpOworICBEeW5hbWljTWFwRmllbGQoY29uc3QgTWVzc2FnZSogZGVmYXVsdF9lbnRyeSwgQXJlbmEqIGFyZW5hKTsKKyAgdmlydHVhbCB+RHluYW1pY01hcEZpZWxkKCk7CisKKyAgLy8gSW1wbGVtZW50IE1hcEZpZWxkQmFzZQorICBib29sIENvbnRhaW5zTWFwS2V5KGNvbnN0IE1hcEtleSYgbWFwX2tleSkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgSW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShjb25zdCBNYXBLZXkmIG1hcF9rZXksIE1hcFZhbHVlUmVmKiB2YWwpIG92ZXJyaWRlOworICBib29sIExvb2t1cE1hcFZhbHVlKGNvbnN0IE1hcEtleSYgbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICBNYXBWYWx1ZUNvbnN0UmVmKiB2YWwpIGNvbnN0IG92ZXJyaWRlOworICBib29sIExvb2t1cE1hcFZhbHVlKGNvbnN0IE1hcEtleSYsIE1hcFZhbHVlUmVmKikgY29uc3QgPSBkZWxldGU7CisgIGJvb2wgRGVsZXRlTWFwVmFsdWUoY29uc3QgTWFwS2V5JiBtYXBfa2V5KSBvdmVycmlkZTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgTWFwRmllbGRCYXNlJiBvdGhlcikgb3ZlcnJpZGU7CisgIHZvaWQgU3dhcChNYXBGaWVsZEJhc2UqIG90aGVyKSBvdmVycmlkZTsKKyAgdm9pZCBVbnNhZmVTaGFsbG93U3dhcChNYXBGaWVsZEJhc2UqIG90aGVyKSBvdmVycmlkZSB7IFN3YXAob3RoZXIpOyB9CisKKyAgY29uc3QgTWFwPE1hcEtleSwgTWFwVmFsdWVSZWY+JiBHZXRNYXAoKSBjb25zdCBvdmVycmlkZTsKKyAgTWFwPE1hcEtleSwgTWFwVmFsdWVSZWY+KiBNdXRhYmxlTWFwKCkgb3ZlcnJpZGU7CisKKyAgaW50IHNpemUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBDbGVhcigpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgTWFwPE1hcEtleSwgTWFwVmFsdWVSZWY+IG1hcF87CisgIGNvbnN0IE1lc3NhZ2UqIGRlZmF1bHRfZW50cnlfOworCisgIHZvaWQgQWxsb2NhdGVNYXBWYWx1ZShNYXBWYWx1ZVJlZiogbWFwX3ZhbCk7CisKKyAgLy8gSW1wbGVtZW50cyBNYXBGaWVsZEJhc2UKKyAgdm9pZCBTeW5jUmVwZWF0ZWRGaWVsZFdpdGhNYXBOb0xvY2soKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTeW5jTWFwV2l0aFJlcGVhdGVkRmllbGROb0xvY2soKSBjb25zdCBvdmVycmlkZTsKKyAgc2l6ZV90IFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZOb0xvY2soKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXRNYXBJdGVyYXRvclZhbHVlKE1hcEl0ZXJhdG9yKiBtYXBfaXRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEeW5hbWljTWFwRmllbGQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIE1hcFZhbHVlQ29uc3RSZWYgcG9pbnRzIHRvIGEgbWFwIHZhbHVlLiBVc2VycyBjYW4gTk9UIG1vZGlmeQorLy8gdGhlIG1hcCB2YWx1ZS4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBNYXBWYWx1ZUNvbnN0UmVmIHsKKyBwdWJsaWM6CisgIE1hcFZhbHVlQ29uc3RSZWYoKSA6IGRhdGFfKG51bGxwdHIpLCB0eXBlXygpIHt9CisKKyAgaW50NjRfdCBHZXRJbnQ2NFZhbHVlKCkgY29uc3QgeworICAgIFRZUEVfQ0hFQ0soRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0LAorICAgICAgICAgICAgICAgIk1hcFZhbHVlQ29uc3RSZWY6OkdldEludDY0VmFsdWUiKTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KGRhdGFfKTsKKyAgfQorICB1aW50NjRfdCBHZXRVSW50NjRWYWx1ZSgpIGNvbnN0IHsKKyAgICBUWVBFX0NIRUNLKEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQsCisgICAgICAgICAgICAgICAiTWFwVmFsdWVDb25zdFJlZjo6R2V0VUludDY0VmFsdWUiKTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QqPihkYXRhXyk7CisgIH0KKyAgaW50MzJfdCBHZXRJbnQzMlZhbHVlKCkgY29uc3QgeworICAgIFRZUEVfQ0hFQ0soRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyLAorICAgICAgICAgICAgICAgIk1hcFZhbHVlQ29uc3RSZWY6OkdldEludDMyVmFsdWUiKTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KGRhdGFfKTsKKyAgfQorICB1aW50MzJfdCBHZXRVSW50MzJWYWx1ZSgpIGNvbnN0IHsKKyAgICBUWVBFX0NIRUNLKEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAiTWFwVmFsdWVDb25zdFJlZjo6R2V0VUludDMyVmFsdWUiKTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihkYXRhXyk7CisgIH0KKyAgYm9vbCBHZXRCb29sVmFsdWUoKSBjb25zdCB7CisgICAgVFlQRV9DSEVDSyhGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTCwgIk1hcFZhbHVlQ29uc3RSZWY6OkdldEJvb2xWYWx1ZSIpOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxib29sKj4oZGF0YV8pOworICB9CisgIGludCBHZXRFbnVtVmFsdWUoKSBjb25zdCB7CisgICAgVFlQRV9DSEVDSyhGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTSwgIk1hcFZhbHVlQ29uc3RSZWY6OkdldEVudW1WYWx1ZSIpOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxpbnQqPihkYXRhXyk7CisgIH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldFN0cmluZ1ZhbHVlKCkgY29uc3QgeworICAgIFRZUEVfQ0hFQ0soRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICJNYXBWYWx1ZUNvbnN0UmVmOjpHZXRTdHJpbmdWYWx1ZSIpOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnN0cmluZyo+KGRhdGFfKTsKKyAgfQorICBmbG9hdCBHZXRGbG9hdFZhbHVlKCkgY29uc3QgeworICAgIFRZUEVfQ0hFQ0soRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FULAorICAgICAgICAgICAgICAgIk1hcFZhbHVlQ29uc3RSZWY6OkdldEZsb2F0VmFsdWUiKTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihkYXRhXyk7CisgIH0KKyAgZG91YmxlIEdldERvdWJsZVZhbHVlKCkgY29uc3QgeworICAgIFRZUEVfQ0hFQ0soRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRSwKKyAgICAgICAgICAgICAgICJNYXBWYWx1ZUNvbnN0UmVmOjpHZXREb3VibGVWYWx1ZSIpOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxkb3VibGUqPihkYXRhXyk7CisgIH0KKworICBjb25zdCBNZXNzYWdlJiBHZXRNZXNzYWdlVmFsdWUoKSBjb25zdCB7CisgICAgVFlQRV9DSEVDSyhGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICJNYXBWYWx1ZUNvbnN0UmVmOjpHZXRNZXNzYWdlVmFsdWUiKTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8TWVzc2FnZSo+KGRhdGFfKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICAvLyBkYXRhXyBwb2ludCB0byBhIG1hcCB2YWx1ZS4gTWFwVmFsdWVDb25zdFJlZiBkb2VzIG5vdAorICAvLyBvd24gdGhpcyB2YWx1ZS4KKyAgdm9pZCogZGF0YV87CisgIC8vIHR5cGVfIGlzIDAgb3IgYSB2YWxpZCBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUuCisgIC8vIFVzZSAiQ3BwVHlwZSgpIiB0byBpbmRpY2F0ZSB6ZXJvLgorICBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgdHlwZV87CisKKyAgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIHR5cGUoKSBjb25zdCB7CisgICAgaWYgKHR5cGVfID09IEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSgpIHx8IGRhdGFfID09IG51bGxwdHIpIHsKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpCisgICAgICAgICAgPDwgIlByb3RvY29sIEJ1ZmZlciBtYXAgdXNhZ2UgZXJyb3I6XG4iCisgICAgICAgICAgPDwgIk1hcFZhbHVlQ29uc3RSZWY6OnR5cGUgTWFwVmFsdWVDb25zdFJlZiBpcyBub3QgaW5pdGlhbGl6ZWQuIjsKKyAgICB9CisgICAgcmV0dXJuIHR5cGVfOworICB9CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgSywgdHlwZW5hbWUgViwKKyAgICAgICAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtleV93aXJlX3R5cGUsCisgICAgICAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSB2YWx1ZV93aXJlX3R5cGU+CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6TWFwRmllbGQ7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlR5cGVEZWZpbmVkTWFwRmllbGRCYXNlOworICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1hcEl0ZXJhdG9yOworICBmcmllbmQgY2xhc3MgUmVmbGVjdGlvbjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEeW5hbWljTWFwRmllbGQ7CisKKyAgdm9pZCBTZXRUeXBlKEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSB0eXBlKSB7IHR5cGVfID0gdHlwZTsgfQorICB2b2lkIFNldFZhbHVlKGNvbnN0IHZvaWQqIHZhbCkgeyBkYXRhXyA9IGNvbnN0X2Nhc3Q8dm9pZCo+KHZhbCk7IH0KKyAgdm9pZCBDb3B5RnJvbShjb25zdCBNYXBWYWx1ZUNvbnN0UmVmJiBvdGhlcikgeworICAgIHR5cGVfID0gb3RoZXIudHlwZV87CisgICAgZGF0YV8gPSBvdGhlci5kYXRhXzsKKyAgfQorfTsKKworLy8gTWFwVmFsdWVSZWYgcG9pbnRzIHRvIGEgbWFwIHZhbHVlLiBVc2VycyBhcmUgYWJsZSB0byBtb2RpZnkKKy8vIHRoZSBtYXAgdmFsdWUuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTWFwVmFsdWVSZWYgZmluYWwgOiBwdWJsaWMgTWFwVmFsdWVDb25zdFJlZiB7CisgcHVibGljOgorICBNYXBWYWx1ZVJlZigpIHt9CisKKyAgdm9pZCBTZXRJbnQ2NFZhbHVlKGludDY0X3QgdmFsdWUpIHsKKyAgICBUWVBFX0NIRUNLKEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NCwgIk1hcFZhbHVlUmVmOjpTZXRJbnQ2NFZhbHVlIik7CisgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KGRhdGFfKSA9IHZhbHVlOworICB9CisgIHZvaWQgU2V0VUludDY0VmFsdWUodWludDY0X3QgdmFsdWUpIHsKKyAgICBUWVBFX0NIRUNLKEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQsICJNYXBWYWx1ZVJlZjo6U2V0VUludDY0VmFsdWUiKTsKKyAgICAqcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCo+KGRhdGFfKSA9IHZhbHVlOworICB9CisgIHZvaWQgU2V0SW50MzJWYWx1ZShpbnQzMl90IHZhbHVlKSB7CisgICAgVFlQRV9DSEVDSyhGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzIsICJNYXBWYWx1ZVJlZjo6U2V0SW50MzJWYWx1ZSIpOworICAgICpyZWludGVycHJldF9jYXN0PGludDMyX3QqPihkYXRhXykgPSB2YWx1ZTsKKyAgfQorICB2b2lkIFNldFVJbnQzMlZhbHVlKHVpbnQzMl90IHZhbHVlKSB7CisgICAgVFlQRV9DSEVDSyhGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyLCAiTWFwVmFsdWVSZWY6OlNldFVJbnQzMlZhbHVlIik7CisgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihkYXRhXykgPSB2YWx1ZTsKKyAgfQorICB2b2lkIFNldEJvb2xWYWx1ZShib29sIHZhbHVlKSB7CisgICAgVFlQRV9DSEVDSyhGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTCwgIk1hcFZhbHVlUmVmOjpTZXRCb29sVmFsdWUiKTsKKyAgICAqcmVpbnRlcnByZXRfY2FzdDxib29sKj4oZGF0YV8pID0gdmFsdWU7CisgIH0KKyAgLy8gVE9ETyhqaWVsdW8pIC0gQ2hlY2tzIHRoYXQgZW51bSBpcyBtZW1iZXIuCisgIHZvaWQgU2V0RW51bVZhbHVlKGludCB2YWx1ZSkgeworICAgIFRZUEVfQ0hFQ0soRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU0sICJNYXBWYWx1ZVJlZjo6U2V0RW51bVZhbHVlIik7CisgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8aW50Kj4oZGF0YV8pID0gdmFsdWU7CisgIH0KKyAgdm9pZCBTZXRTdHJpbmdWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBUWVBFX0NIRUNLKEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcsICJNYXBWYWx1ZVJlZjo6U2V0U3RyaW5nVmFsdWUiKTsKKyAgICAqcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnN0cmluZyo+KGRhdGFfKSA9IHZhbHVlOworICB9CisgIHZvaWQgU2V0RmxvYXRWYWx1ZShmbG9hdCB2YWx1ZSkgeworICAgIFRZUEVfQ0hFQ0soRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FULCAiTWFwVmFsdWVSZWY6OlNldEZsb2F0VmFsdWUiKTsKKyAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGRhdGFfKSA9IHZhbHVlOworICB9CisgIHZvaWQgU2V0RG91YmxlVmFsdWUoZG91YmxlIHZhbHVlKSB7CisgICAgVFlQRV9DSEVDSyhGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFLCAiTWFwVmFsdWVSZWY6OlNldERvdWJsZVZhbHVlIik7CisgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZG91YmxlKj4oZGF0YV8pID0gdmFsdWU7CisgIH0KKworICBNZXNzYWdlKiBNdXRhYmxlTWVzc2FnZVZhbHVlKCkgeworICAgIFRZUEVfQ0hFQ0soRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UsCisgICAgICAgICAgICAgICAiTWFwVmFsdWVSZWY6Ok11dGFibGVNZXNzYWdlVmFsdWUiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxNZXNzYWdlKj4oZGF0YV8pOworICB9CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkR5bmFtaWNNYXBGaWVsZDsKKworICAvLyBPbmx5IHVzZWQgaW4gRHluYW1pY01hcEZpZWxkCisgIHZvaWQgRGVsZXRlRGF0YSgpIHsKKyAgICBzd2l0Y2ggKHR5cGVfKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKENQUFRZUEUsIFRZUEUpICAgICAgICAgICBcCisgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogeyBcCisgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8VFlQRSo+KGRhdGFfKTsgICBcCisgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyAgICAgIEhBTkRMRV9UWVBFKElOVDMyLCBpbnQzMl90KTsKKyAgICAgIEhBTkRMRV9UWVBFKElOVDY0LCBpbnQ2NF90KTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgdWludDMyX3QpOworICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjRfdCk7CisgICAgICBIQU5ETEVfVFlQRShET1VCTEUsIGRvdWJsZSk7CisgICAgICBIQU5ETEVfVFlQRShGTE9BVCwgZmxvYXQpOworICAgICAgSEFORExFX1RZUEUoQk9PTCwgYm9vbCk7CisgICAgICBIQU5ETEVfVFlQRShTVFJJTkcsIHN0ZDo6c3RyaW5nKTsKKyAgICAgIEhBTkRMRV9UWVBFKEVOVU0sIGludDMyX3QpOworICAgICAgSEFORExFX1RZUEUoTUVTU0FHRSwgTWVzc2FnZSk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICB9CisgIH0KK307CisKKyN1bmRlZiBUWVBFX0NIRUNLCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBNYXBJdGVyYXRvciB7CisgcHVibGljOgorICBNYXBJdGVyYXRvcihNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgICBtYXBfID0gcmVmbGVjdGlvbi0+TXV0YWJsZU1hcERhdGEobWVzc2FnZSwgZmllbGQpOworICAgIGtleV8uU2V0VHlwZShmaWVsZC0+bWVzc2FnZV90eXBlKCktPm1hcF9rZXkoKS0+Y3BwX3R5cGUoKSk7CisgICAgdmFsdWVfLlNldFR5cGUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5tYXBfdmFsdWUoKS0+Y3BwX3R5cGUoKSk7CisgICAgbWFwXy0+SW5pdGlhbGl6ZUl0ZXJhdG9yKHRoaXMpOworICB9CisgIE1hcEl0ZXJhdG9yKGNvbnN0IE1hcEl0ZXJhdG9yJiBvdGhlcikgeworICAgIG1hcF8gPSBvdGhlci5tYXBfOworICAgIG1hcF8tPkluaXRpYWxpemVJdGVyYXRvcih0aGlzKTsKKyAgICBtYXBfLT5Db3B5SXRlcmF0b3IodGhpcywgb3RoZXIpOworICB9CisgIH5NYXBJdGVyYXRvcigpIHsgbWFwXy0+RGVsZXRlSXRlcmF0b3IodGhpcyk7IH0KKyAgTWFwSXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBNYXBJdGVyYXRvciYgb3RoZXIpIHsKKyAgICBtYXBfID0gb3RoZXIubWFwXzsKKyAgICBtYXBfLT5Db3B5SXRlcmF0b3IodGhpcywgb3RoZXIpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hcEl0ZXJhdG9yJiBhLCBjb25zdCBNYXBJdGVyYXRvciYgYikgeworICAgIHJldHVybiBhLm1hcF8tPkVxdWFsSXRlcmF0b3IoYSwgYik7CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYXBJdGVyYXRvciYgYSwgY29uc3QgTWFwSXRlcmF0b3ImIGIpIHsKKyAgICByZXR1cm4gIWEubWFwXy0+RXF1YWxJdGVyYXRvcihhLCBiKTsKKyAgfQorICBNYXBJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICBtYXBfLT5JbmNyZWFzZUl0ZXJhdG9yKHRoaXMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBNYXBJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgIC8vIGl0ZXJfIGlzIGNvcGllZCBmcm9tIE1hcDwuLi4+OjppdGVyYXRvciwgbm8gbmVlZCB0bworICAgIC8vIGNvcHkgZnJvbSBpdHMgc2VsZiBhZ2Fpbi4gVXNlIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uCisgICAgLy8gd2l0aCBvcGVyYXRvcisrKCkKKyAgICBtYXBfLT5JbmNyZWFzZUl0ZXJhdG9yKHRoaXMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBjb25zdCBNYXBLZXkmIEdldEtleSgpIHsgcmV0dXJuIGtleV87IH0KKyAgY29uc3QgTWFwVmFsdWVSZWYmIEdldFZhbHVlUmVmKCkgeyByZXR1cm4gdmFsdWVfOyB9CisgIE1hcFZhbHVlUmVmKiBNdXRhYmxlVmFsdWVSZWYoKSB7CisgICAgbWFwXy0+U2V0TWFwRGlydHkoKTsKKyAgICByZXR1cm4gJnZhbHVlXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVD4KKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpUeXBlRGVmaW5lZE1hcEZpZWxkQmFzZTsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEeW5hbWljTWFwRmllbGQ7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQsCisgICAgICAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrS2V5RmllbGRUeXBlLAorICAgICAgICAgICAgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga1ZhbHVlRmllbGRUeXBlPgorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6Ok1hcEZpZWxkOworCisgIC8vIHJlaW50ZXJwcmV0X2Nhc3QgZnJvbSBoZWFwLWFsbG9jYXRlZCBNYXA8Li4uPjo6aXRlcmF0b3IqLiBNYXBJdGVyYXRvciBvd25zCisgIC8vIHRoZSBpdGVyYXRvci4gSXQgaXMgYWxsb2NhdGVkIGJ5IE1hcEZpZWxkPC4uLj46OkluaXRpYWxpemVJdGVyYXRvcigpIGNhbGxlZAorICAvLyBpbiBjb25zdHJ1Y3RvciBhbmQgZGVsZXRlZCBieSBNYXBGaWVsZDwuLi4+OjpEZWxldGVJdGVyYXRvcigpIGNhbGxlZCBpbgorICAvLyBkZXN0cnVjdG9yLgorICB2b2lkKiBpdGVyXzsKKyAgLy8gUG9pbnQgdG8gYSBNYXBGaWVsZCB0byBjYWxsIGhlbHBlciBtZXRob2RzIGltcGxlbWVudGVkIGluIE1hcEZpZWxkLgorICAvLyBNYXBJdGVyYXRvciBkb2VzIG5vdCBvd24gdGhpcyBvYmplY3QuCisgIGludGVybmFsOjpNYXBGaWVsZEJhc2UqIG1hcF87CisgIE1hcEtleSBrZXlfOworICBNYXBWYWx1ZVJlZiB2YWx1ZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcocG9wKSAgLy8gcmVzdG9yZSB3YXJuaW5nIEM0MjY1CisjZW5kaWYgICAgICAgICAgICAgICAgLy8gX01TQ19WRVIKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTUFQX0ZJRUxEX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfaW5sLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9pbmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzRjMjMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfaW5sLmgKQEAgLTAsMCArMSwzNzUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9NQVBfRklFTERfSU5MX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUFQX0ZJRUxEX0lOTF9IX18KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXAuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF90eXBlX2hhbmRsZXIuaD4KKworI2lmZGVmIFNXSUcKKyNlcnJvciAiWW91IGNhbm5vdCBTV0lHIHByb3RvIGhlYWRlcnMiCisjZW5kaWYKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKy8vIFVud3JhcE1hcEtleSB0ZW1wbGF0ZQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIFVud3JhcE1hcEtleShjb25zdCBNYXBLZXkmIG1hcF9rZXkpOwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQzMl90IFVud3JhcE1hcEtleTxpbnQzMl90Pihjb25zdCBNYXBLZXkmIG1hcF9rZXkpIHsKKyAgcmV0dXJuIG1hcF9rZXkuR2V0SW50MzJWYWx1ZSgpOworfQordGVtcGxhdGUgPD4KK2lubGluZSB1aW50MzJfdCBVbndyYXBNYXBLZXk8dWludDMyX3Q+KGNvbnN0IE1hcEtleSYgbWFwX2tleSkgeworICByZXR1cm4gbWFwX2tleS5HZXRVSW50MzJWYWx1ZSgpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBpbnQ2NF90IFVud3JhcE1hcEtleTxpbnQ2NF90Pihjb25zdCBNYXBLZXkmIG1hcF9rZXkpIHsKKyAgcmV0dXJuIG1hcF9rZXkuR2V0SW50NjRWYWx1ZSgpOworfQordGVtcGxhdGUgPD4KK2lubGluZSB1aW50NjRfdCBVbndyYXBNYXBLZXk8dWludDY0X3Q+KGNvbnN0IE1hcEtleSYgbWFwX2tleSkgeworICByZXR1cm4gbWFwX2tleS5HZXRVSW50NjRWYWx1ZSgpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFVud3JhcE1hcEtleTxib29sPihjb25zdCBNYXBLZXkmIG1hcF9rZXkpIHsKKyAgcmV0dXJuIG1hcF9rZXkuR2V0Qm9vbFZhbHVlKCk7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIHN0ZDo6c3RyaW5nIFVud3JhcE1hcEtleTxzdGQ6OnN0cmluZz4oY29uc3QgTWFwS2V5JiBtYXBfa2V5KSB7CisgIHJldHVybiBtYXBfa2V5LkdldFN0cmluZ1ZhbHVlKCk7Cit9CisKKy8vIFNldE1hcEtleSB0ZW1wbGF0ZQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgdm9pZCBTZXRNYXBLZXkoTWFwS2V5KiBtYXBfa2V5LCBjb25zdCBUJiB2YWx1ZSk7Cit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgU2V0TWFwS2V5PGludDMyX3Q+KE1hcEtleSogbWFwX2tleSwgY29uc3QgaW50MzJfdCYgdmFsdWUpIHsKKyAgbWFwX2tleS0+U2V0SW50MzJWYWx1ZSh2YWx1ZSk7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgU2V0TWFwS2V5PHVpbnQzMl90PihNYXBLZXkqIG1hcF9rZXksIGNvbnN0IHVpbnQzMl90JiB2YWx1ZSkgeworICBtYXBfa2V5LT5TZXRVSW50MzJWYWx1ZSh2YWx1ZSk7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgU2V0TWFwS2V5PGludDY0X3Q+KE1hcEtleSogbWFwX2tleSwgY29uc3QgaW50NjRfdCYgdmFsdWUpIHsKKyAgbWFwX2tleS0+U2V0SW50NjRWYWx1ZSh2YWx1ZSk7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgU2V0TWFwS2V5PHVpbnQ2NF90PihNYXBLZXkqIG1hcF9rZXksIGNvbnN0IHVpbnQ2NF90JiB2YWx1ZSkgeworICBtYXBfa2V5LT5TZXRVSW50NjRWYWx1ZSh2YWx1ZSk7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgU2V0TWFwS2V5PGJvb2w+KE1hcEtleSogbWFwX2tleSwgY29uc3QgYm9vbCYgdmFsdWUpIHsKKyAgbWFwX2tleS0+U2V0Qm9vbFZhbHVlKHZhbHVlKTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBTZXRNYXBLZXk8c3RkOjpzdHJpbmc+KE1hcEtleSogbWFwX2tleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIG1hcF9rZXktPlNldFN0cmluZ1ZhbHVlKHZhbHVlKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVHlwZURlZmluZWRNYXBGaWVsZEJhc2UtLS0tLS0tLS0tLS0tLS0KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBNYXA8S2V5LCBUPjo6Y29uc3RfaXRlcmF0b3ImCitUeXBlRGVmaW5lZE1hcEZpZWxkQmFzZTxLZXksIFQ+OjpJbnRlcm5hbEdldEl0ZXJhdG9yKAorICAgIGNvbnN0IE1hcEl0ZXJhdG9yKiBtYXBfaXRlcikgY29uc3QgeworICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8dHlwZW5hbWUgTWFwPEtleSwgVD46OmNvbnN0X2l0ZXJhdG9yKj4oCisgICAgICBtYXBfaXRlci0+aXRlcl8pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBUPgordm9pZCBUeXBlRGVmaW5lZE1hcEZpZWxkQmFzZTxLZXksIFQ+OjpNYXBCZWdpbihNYXBJdGVyYXRvciogbWFwX2l0ZXIpIGNvbnN0IHsKKyAgSW50ZXJuYWxHZXRJdGVyYXRvcihtYXBfaXRlcikgPSBHZXRNYXAoKS5iZWdpbigpOworICBTZXRNYXBJdGVyYXRvclZhbHVlKG1hcF9pdGVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVD4KK3ZvaWQgVHlwZURlZmluZWRNYXBGaWVsZEJhc2U8S2V5LCBUPjo6TWFwRW5kKE1hcEl0ZXJhdG9yKiBtYXBfaXRlcikgY29uc3QgeworICBJbnRlcm5hbEdldEl0ZXJhdG9yKG1hcF9pdGVyKSA9IEdldE1hcCgpLmVuZCgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBUPgorYm9vbCBUeXBlRGVmaW5lZE1hcEZpZWxkQmFzZTxLZXksIFQ+OjpFcXVhbEl0ZXJhdG9yKAorICAgIGNvbnN0IE1hcEl0ZXJhdG9yJiBhLCBjb25zdCBNYXBJdGVyYXRvciYgYikgY29uc3QgeworICByZXR1cm4gSW50ZXJuYWxHZXRJdGVyYXRvcigmYSkgPT0gSW50ZXJuYWxHZXRJdGVyYXRvcigmYik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQ+Cit2b2lkIFR5cGVEZWZpbmVkTWFwRmllbGRCYXNlPEtleSwgVD46OkluY3JlYXNlSXRlcmF0b3IoCisgICAgTWFwSXRlcmF0b3IqIG1hcF9pdGVyKSBjb25zdCB7CisgICsrSW50ZXJuYWxHZXRJdGVyYXRvcihtYXBfaXRlcik7CisgIFNldE1hcEl0ZXJhdG9yVmFsdWUobWFwX2l0ZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBUPgordm9pZCBUeXBlRGVmaW5lZE1hcEZpZWxkQmFzZTxLZXksIFQ+OjpJbml0aWFsaXplSXRlcmF0b3IoCisgICAgTWFwSXRlcmF0b3IqIG1hcF9pdGVyKSBjb25zdCB7CisgIG1hcF9pdGVyLT5pdGVyXyA9IG5ldyB0eXBlbmFtZSBNYXA8S2V5LCBUPjo6Y29uc3RfaXRlcmF0b3I7CisgIEdPT0dMRV9DSEVDSyhtYXBfaXRlci0+aXRlcl8gIT0gbnVsbHB0cik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQ+Cit2b2lkIFR5cGVEZWZpbmVkTWFwRmllbGRCYXNlPEtleSwgVD46OkRlbGV0ZUl0ZXJhdG9yKAorICAgIE1hcEl0ZXJhdG9yKiBtYXBfaXRlcikgY29uc3QgeworICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDx0eXBlbmFtZSBNYXA8S2V5LCBUPjo6Y29uc3RfaXRlcmF0b3IqPigKKyAgICAgIG1hcF9pdGVyLT5pdGVyXyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQ+Cit2b2lkIFR5cGVEZWZpbmVkTWFwRmllbGRCYXNlPEtleSwgVD46OkNvcHlJdGVyYXRvcigKKyAgICBNYXBJdGVyYXRvciogdGhpc19pdGVyLCBjb25zdCBNYXBJdGVyYXRvciYgdGhhdF9pdGVyKSBjb25zdCB7CisgIEludGVybmFsR2V0SXRlcmF0b3IodGhpc19pdGVyKSA9IEludGVybmFsR2V0SXRlcmF0b3IoJnRoYXRfaXRlcik7CisgIHRoaXNfaXRlci0+a2V5Xy5TZXRUeXBlKHRoYXRfaXRlci5rZXlfLnR5cGUoKSk7CisgIC8vIE1hcFZhbHVlUmVmOjp0eXBlKCkgZmFpbHMgd2hlbiBjb250YWluaW5nIGRhdGEgaXMgbnVsbC4gSG93ZXZlciwgaWYKKyAgLy8gdGhpc19pdGVyIHBvaW50cyB0byBNYXBFbmQsIGRhdGEgY2FuIGJlIG51bGwuCisgIHRoaXNfaXRlci0+dmFsdWVfLlNldFR5cGUoCisgICAgICBzdGF0aWNfY2FzdDxGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGU+KHRoYXRfaXRlci52YWx1ZV8udHlwZV8pKTsKKyAgU2V0TWFwSXRlcmF0b3JWYWx1ZSh0aGlzX2l0ZXIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrS2V5RmllbGRUeXBlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga1ZhbHVlRmllbGRUeXBlPgoraW50IE1hcEZpZWxkPERlcml2ZWQsIEtleSwgVCwga0tleUZpZWxkVHlwZSwga1ZhbHVlRmllbGRUeXBlPjo6c2l6ZSgpIGNvbnN0IHsKKyAgTWFwRmllbGRCYXNlOjpTeW5jTWFwV2l0aFJlcGVhdGVkRmllbGQoKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oaW1wbF8uR2V0TWFwKCkuc2l6ZSgpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVCwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtLZXlGaWVsZFR5cGUsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrVmFsdWVGaWVsZFR5cGU+Cit2b2lkIE1hcEZpZWxkPERlcml2ZWQsIEtleSwgVCwga0tleUZpZWxkVHlwZSwga1ZhbHVlRmllbGRUeXBlPjo6Q2xlYXIoKSB7CisgIGlmICh0aGlzLT5NYXBGaWVsZEJhc2U6OnJlcGVhdGVkX2ZpZWxkXyAhPSBudWxscHRyKSB7CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxFbnRyeVR5cGU+KiByZXBlYXRlZF9maWVsZCA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxFbnRyeVR5cGU+Kj4oCisgICAgICAgICAgICB0aGlzLT5NYXBGaWVsZEJhc2U6OnJlcGVhdGVkX2ZpZWxkXyk7CisgICAgcmVwZWF0ZWRfZmllbGQtPkNsZWFyKCk7CisgIH0KKworICBpbXBsXy5NdXRhYmxlTWFwKCktPmNsZWFyKCk7CisgIC8vIERhdGEgaW4gbWFwIGFuZCByZXBlYXRlZCBmaWVsZCBhcmUgYm90aCBlbXB0eSwgYnV0IHdlIGNhbid0IHNldCBzdGF0dXMKKyAgLy8gQ0xFQU4uIEJlY2F1c2UgY2xlYXIgaXMgYSBnZW5lcmF0ZWQgQVBJLCB3ZSBjYW5ub3QgaW52YWxpZGF0ZSBwcmV2aW91cworICAvLyByZWZlcmVuY2UgdG8gbWFwLgorICBNYXBGaWVsZEJhc2U6OlNldE1hcERpcnR5KCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrS2V5RmllbGRUeXBlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga1ZhbHVlRmllbGRUeXBlPgordm9pZCBNYXBGaWVsZDxEZXJpdmVkLCBLZXksIFQsIGtLZXlGaWVsZFR5cGUsCisgICAgICAgICAgICAgIGtWYWx1ZUZpZWxkVHlwZT46OlNldE1hcEl0ZXJhdG9yVmFsdWUoTWFwSXRlcmF0b3IqIG1hcF9pdGVyKQorICAgIGNvbnN0IHsKKyAgY29uc3QgTWFwPEtleSwgVD4mIG1hcCA9IGltcGxfLkdldE1hcCgpOworICB0eXBlbmFtZSBNYXA8S2V5LCBUPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9CisgICAgICBUeXBlRGVmaW5lZE1hcEZpZWxkQmFzZTxLZXksIFQ+OjpJbnRlcm5hbEdldEl0ZXJhdG9yKG1hcF9pdGVyKTsKKyAgaWYgKGl0ZXIgPT0gbWFwLmVuZCgpKSByZXR1cm47CisgIFNldE1hcEtleSgmbWFwX2l0ZXItPmtleV8sIGl0ZXItPmZpcnN0KTsKKyAgbWFwX2l0ZXItPnZhbHVlXy5TZXRWYWx1ZSgmaXRlci0+c2Vjb25kKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVCwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtLZXlGaWVsZFR5cGUsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrVmFsdWVGaWVsZFR5cGU+Citib29sIE1hcEZpZWxkPERlcml2ZWQsIEtleSwgVCwga0tleUZpZWxkVHlwZSwga1ZhbHVlRmllbGRUeXBlPjo6Q29udGFpbnNNYXBLZXkoCisgICAgY29uc3QgTWFwS2V5JiBtYXBfa2V5KSBjb25zdCB7CisgIGNvbnN0IE1hcDxLZXksIFQ+JiBtYXAgPSBpbXBsXy5HZXRNYXAoKTsKKyAgY29uc3QgS2V5JiBrZXkgPSBVbndyYXBNYXBLZXk8S2V5PihtYXBfa2V5KTsKKyAgdHlwZW5hbWUgTWFwPEtleSwgVD46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBtYXAuZmluZChrZXkpOworICByZXR1cm4gaXRlciAhPSBtYXAuZW5kKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrS2V5RmllbGRUeXBlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga1ZhbHVlRmllbGRUeXBlPgorYm9vbCBNYXBGaWVsZDxEZXJpdmVkLCBLZXksIFQsIGtLZXlGaWVsZFR5cGUsCisgICAgICAgICAgICAgIGtWYWx1ZUZpZWxkVHlwZT46Okluc2VydE9yTG9va3VwTWFwVmFsdWUoY29uc3QgTWFwS2V5JiBtYXBfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcFZhbHVlUmVmKiB2YWwpIHsKKyAgLy8gQWx3YXlzIHVzZSBtdXRhYmxlIG1hcCBiZWNhdXNlIHVzZXJzIG1heSBjaGFuZ2UgdGhlIG1hcCB2YWx1ZSBieQorICAvLyBNYXBWYWx1ZVJlZi4KKyAgTWFwPEtleSwgVD4qIG1hcCA9IE11dGFibGVNYXAoKTsKKyAgY29uc3QgS2V5JiBrZXkgPSBVbndyYXBNYXBLZXk8S2V5PihtYXBfa2V5KTsKKyAgdHlwZW5hbWUgTWFwPEtleSwgVD46Oml0ZXJhdG9yIGl0ZXIgPSBtYXAtPmZpbmQoa2V5KTsKKyAgaWYgKG1hcC0+ZW5kKCkgPT0gaXRlcikgeworICAgIHZhbC0+U2V0VmFsdWUoJigoKm1hcClba2V5XSkpOworICAgIHJldHVybiB0cnVlOworICB9CisgIC8vIEtleSBpcyBhbHJlYWR5IGluIHRoZSBtYXAuIE1ha2Ugc3VyZSAoKm1hcClba2V5XSBpcyBub3QgY2FsbGVkLgorICAvLyBbXSBtYXkgcmVvcmRlciB0aGUgbWFwIGFuZCBpdGVyYXRvcnMuCisgIHZhbC0+U2V0VmFsdWUoJihpdGVyLT5zZWNvbmQpKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBULAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga0tleUZpZWxkVHlwZSwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtWYWx1ZUZpZWxkVHlwZT4KK2Jvb2wgTWFwRmllbGQ8RGVyaXZlZCwgS2V5LCBULCBrS2V5RmllbGRUeXBlLCBrVmFsdWVGaWVsZFR5cGU+OjpMb29rdXBNYXBWYWx1ZSgKKyAgICBjb25zdCBNYXBLZXkmIG1hcF9rZXksIE1hcFZhbHVlQ29uc3RSZWYqIHZhbCkgY29uc3QgeworICBjb25zdCBNYXA8S2V5LCBUPiYgbWFwID0gR2V0TWFwKCk7CisgIGNvbnN0IEtleSYga2V5ID0gVW53cmFwTWFwS2V5PEtleT4obWFwX2tleSk7CisgIHR5cGVuYW1lIE1hcDxLZXksIFQ+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gbWFwLmZpbmQoa2V5KTsKKyAgaWYgKG1hcC5lbmQoKSA9PSBpdGVyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIEtleSBpcyBhbHJlYWR5IGluIHRoZSBtYXAuIE1ha2Ugc3VyZSAoKm1hcClba2V5XSBpcyBub3QgY2FsbGVkLgorICAvLyBbXSBtYXkgcmVvcmRlciB0aGUgbWFwIGFuZCBpdGVyYXRvcnMuCisgIHZhbC0+U2V0VmFsdWUoJihpdGVyLT5zZWNvbmQpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrS2V5RmllbGRUeXBlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga1ZhbHVlRmllbGRUeXBlPgorYm9vbCBNYXBGaWVsZDxEZXJpdmVkLCBLZXksIFQsIGtLZXlGaWVsZFR5cGUsIGtWYWx1ZUZpZWxkVHlwZT46OkRlbGV0ZU1hcFZhbHVlKAorICAgIGNvbnN0IE1hcEtleSYgbWFwX2tleSkgeworICBjb25zdCBLZXkmIGtleSA9IFVud3JhcE1hcEtleTxLZXk+KG1hcF9rZXkpOworICByZXR1cm4gTXV0YWJsZU1hcCgpLT5lcmFzZShrZXkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBULAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga0tleUZpZWxkVHlwZSwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtWYWx1ZUZpZWxkVHlwZT4KK3ZvaWQgTWFwRmllbGQ8RGVyaXZlZCwgS2V5LCBULCBrS2V5RmllbGRUeXBlLCBrVmFsdWVGaWVsZFR5cGU+OjpNZXJnZUZyb20oCisgICAgY29uc3QgTWFwRmllbGRCYXNlJiBvdGhlcikgeworICBNYXBGaWVsZEJhc2U6OlN5bmNNYXBXaXRoUmVwZWF0ZWRGaWVsZCgpOworICBjb25zdCBNYXBGaWVsZCYgb3RoZXJfZmllbGQgPSBzdGF0aWNfY2FzdDxjb25zdCBNYXBGaWVsZCY+KG90aGVyKTsKKyAgb3RoZXJfZmllbGQuU3luY01hcFdpdGhSZXBlYXRlZEZpZWxkKCk7CisgIGltcGxfLk1lcmdlRnJvbShvdGhlcl9maWVsZC5pbXBsXyk7CisgIE1hcEZpZWxkQmFzZTo6U2V0TWFwRGlydHkoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVCwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtLZXlGaWVsZFR5cGUsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrVmFsdWVGaWVsZFR5cGU+Cit2b2lkIE1hcEZpZWxkPERlcml2ZWQsIEtleSwgVCwga0tleUZpZWxkVHlwZSwga1ZhbHVlRmllbGRUeXBlPjo6U3dhcCgKKyAgICBNYXBGaWVsZEJhc2UqIG90aGVyKSB7CisgIE1hcEZpZWxkQmFzZTo6U3dhcChvdGhlcik7CisgIE1hcEZpZWxkKiBvdGhlcl9maWVsZCA9IGRvd25fY2FzdDxNYXBGaWVsZCo+KG90aGVyKTsKKyAgaW1wbF8uU3dhcCgmb3RoZXJfZmllbGQtPmltcGxfKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVCwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtLZXlGaWVsZFR5cGUsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrVmFsdWVGaWVsZFR5cGU+Cit2b2lkIE1hcEZpZWxkPERlcml2ZWQsIEtleSwgVCwga0tleUZpZWxkVHlwZSwKKyAgICAgICAgICAgICAga1ZhbHVlRmllbGRUeXBlPjo6VW5zYWZlU2hhbGxvd1N3YXAoTWFwRmllbGRCYXNlKiBvdGhlcikgeworICBJbnRlcm5hbFN3YXAoZG93bl9jYXN0PE1hcEZpZWxkKj4ob3RoZXIpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVCwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtLZXlGaWVsZFR5cGUsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrVmFsdWVGaWVsZFR5cGU+Cit2b2lkIE1hcEZpZWxkPERlcml2ZWQsIEtleSwgVCwga0tleUZpZWxkVHlwZSwga1ZhbHVlRmllbGRUeXBlPjo6SW50ZXJuYWxTd2FwKAorICAgIE1hcEZpZWxkKiBvdGhlcikgeworICBNYXBGaWVsZEJhc2U6OkludGVybmFsU3dhcChvdGhlcik7CisgIGltcGxfLkludGVybmFsU3dhcCgmb3RoZXItPmltcGxfKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVCwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtLZXlGaWVsZFR5cGUsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrVmFsdWVGaWVsZFR5cGU+Cit2b2lkIE1hcEZpZWxkPERlcml2ZWQsIEtleSwgVCwga0tleUZpZWxkVHlwZSwKKyAgICAgICAgICAgICAga1ZhbHVlRmllbGRUeXBlPjo6U3luY1JlcGVhdGVkRmllbGRXaXRoTWFwTm9Mb2NrKCkgY29uc3QgeworICBpZiAodGhpcy0+TWFwRmllbGRCYXNlOjpyZXBlYXRlZF9maWVsZF8gPT0gbnVsbHB0cikgeworICAgIHRoaXMtPk1hcEZpZWxkQmFzZTo6cmVwZWF0ZWRfZmllbGRfID0KKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiA+KAorICAgICAgICAgICAgdGhpcy0+TWFwRmllbGRCYXNlOjphcmVuYV8pOworICB9CisgIGNvbnN0IE1hcDxLZXksIFQ+JiBtYXAgPSBpbXBsXy5HZXRNYXAoKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxFbnRyeVR5cGU+KiByZXBlYXRlZF9maWVsZCA9CisgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkUHRyRmllbGQ8RW50cnlUeXBlPio+KAorICAgICAgICAgIHRoaXMtPk1hcEZpZWxkQmFzZTo6cmVwZWF0ZWRfZmllbGRfKTsKKworICByZXBlYXRlZF9maWVsZC0+Q2xlYXIoKTsKKworICAvLyBUaGUgb25seSB3YXkgd2UgY2FuIGdldCBhdCB0aGlzIHBvaW50IGlzIHRocm91Z2ggcmVmbGVjdGlvbiBhbmQgdGhlCisgIC8vIG9ubHkgd2F5IHdlIGNhbiBnZXQgdGhlIHJlZmxlY3Rpb24gb2JqZWN0IGlzIGJ5IGhhdmluZyBjYWxsZWQgR2V0UmVmbGVjdGlvbgorICAvLyBvbiB0aGUgZW5jb21wYXNzaW5nIGZpZWxkLiBTbyB0aGF0IHR5cGUgbXVzdCBoYXZlIGV4aXN0ZWQgYW5kIGhlbmNlIHdlCisgIC8vIGtub3cgdGhhdCB0aGlzIE1hcEVudHJ5IGRlZmF1bHRfdHlwZSBoYXMgYWxzbyBhbHJlYWR5IGJlZW4gY29uc3RydWN0ZWQuCisgIC8vIFNvIGl0J3Mgc2FmZSB0byBqdXN0IGNhbGwgaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpLgorICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X2VudHJ5ID0gRGVyaXZlZDo6aW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICBmb3IgKHR5cGVuYW1lIE1hcDxLZXksIFQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1hcC5iZWdpbigpOyBpdCAhPSBtYXAuZW5kKCk7CisgICAgICAgKytpdCkgeworICAgIEVudHJ5VHlwZSogbmV3X2VudHJ5ID0KKyAgICAgICAgZG93bl9jYXN0PEVudHJ5VHlwZSo+KGRlZmF1bHRfZW50cnktPk5ldyh0aGlzLT5NYXBGaWVsZEJhc2U6OmFyZW5hXykpOworICAgIHJlcGVhdGVkX2ZpZWxkLT5BZGRBbGxvY2F0ZWQobmV3X2VudHJ5KTsKKyAgICAoKm5ld19lbnRyeS0+bXV0YWJsZV9rZXkoKSkgPSBpdC0+Zmlyc3Q7CisgICAgKCpuZXdfZW50cnktPm11dGFibGVfdmFsdWUoKSkgPSBpdC0+c2Vjb25kOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrS2V5RmllbGRUeXBlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga1ZhbHVlRmllbGRUeXBlPgordm9pZCBNYXBGaWVsZDxEZXJpdmVkLCBLZXksIFQsIGtLZXlGaWVsZFR5cGUsCisgICAgICAgICAgICAgIGtWYWx1ZUZpZWxkVHlwZT46OlN5bmNNYXBXaXRoUmVwZWF0ZWRGaWVsZE5vTG9jaygpIGNvbnN0IHsKKyAgTWFwPEtleSwgVD4qIG1hcCA9IGNvbnN0X2Nhc3Q8TWFwRmllbGQqPih0aGlzKS0+aW1wbF8uTXV0YWJsZU1hcCgpOworICBSZXBlYXRlZFB0ckZpZWxkPEVudHJ5VHlwZT4qIHJlcGVhdGVkX2ZpZWxkID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxFbnRyeVR5cGU+Kj4oCisgICAgICAgICAgdGhpcy0+TWFwRmllbGRCYXNlOjpyZXBlYXRlZF9maWVsZF8pOworICBHT09HTEVfQ0hFQ0sodGhpcy0+TWFwRmllbGRCYXNlOjpyZXBlYXRlZF9maWVsZF8gIT0gbnVsbHB0cik7CisgIG1hcC0+Y2xlYXIoKTsKKyAgZm9yICh0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVudHJ5VHlwZT46Oml0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgcmVwZWF0ZWRfZmllbGQtPmJlZ2luKCk7CisgICAgICAgaXQgIT0gcmVwZWF0ZWRfZmllbGQtPmVuZCgpOyArK2l0KSB7CisgICAgLy8gQ2FzdCBpcyBuZWVkZWQgYmVjYXVzZSBNYXAncyBhcGkgYW5kIGludGVybmFsIHN0b3JhZ2UgaXMgZGlmZmVyZW50IHdoZW4KKyAgICAvLyB2YWx1ZSBpcyBlbnVtLiBGb3IgZW51bSwgd2UgY2Fubm90IGNhc3QgYW4gaW50IHRvIGVudW0uIFRodXMsIHdlIGhhdmUgdG8KKyAgICAvLyBjb3B5IHZhbHVlLiBGb3Igb3RoZXIgdHlwZXMsIHRoZXkgaGF2ZSBzYW1lIGV4cG9zZWQgYXBpIHR5cGUgYW5kIGludGVybmFsCisgICAgLy8gc3RvcmVkIHR5cGUuIFdlIHNob3VsZCBub3QgaW50cm9kdWNlIHZhbHVlIGNvcHkgZm9yIHRoZW0uIFdlIGFjaGlldmUgdGhpcworICAgIC8vIGJ5IGNhc3RpbmcgdG8gdmFsdWUgZm9yIGVudW0gd2hpbGUgY2FzdGluZyB0byByZWZlcmVuY2UgZm9yIG90aGVyIHR5cGVzLgorICAgICgqbWFwKVtpdC0+a2V5KCldID0gc3RhdGljX2Nhc3Q8Q2FzdFZhbHVlVHlwZT4oaXQtPnZhbHVlKCkpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrS2V5RmllbGRUeXBlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga1ZhbHVlRmllbGRUeXBlPgorc2l6ZV90IE1hcEZpZWxkPERlcml2ZWQsIEtleSwgVCwga0tleUZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICBrVmFsdWVGaWVsZFR5cGU+OjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTm9Mb2NrKCkgY29uc3QgeworICBzaXplX3Qgc2l6ZSA9IDA7CisgIGlmICh0aGlzLT5NYXBGaWVsZEJhc2U6OnJlcGVhdGVkX2ZpZWxkXyAhPSBudWxscHRyKSB7CisgICAgc2l6ZSArPSB0aGlzLT5NYXBGaWVsZEJhc2U6OnJlcGVhdGVkX2ZpZWxkXy0+U3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKTsKKyAgfQorICBzaXplICs9IGltcGxfLkdldE1hcCgpLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKCk7CisKKyAgcmV0dXJuIHNpemU7Cit9Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9NQVBfRklFTERfSU5MX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfbGl0ZS5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfbGl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYmY3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9saXRlLmgKQEAgLTAsMCArMSwyMDkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9NQVBfRklFTERfTElURV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX01BUF9GSUVMRF9MSVRFX0hfXworCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9lbnRyeV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BhcnNlX2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworI2lmZGVmIFNXSUcKKyNlcnJvciAiWW91IGNhbm5vdCBTV0lHIHByb3RvIGhlYWRlcnMiCisjZW5kaWYKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmbmRlZiBOREVCVUcKK3ZvaWQgTWFwRmllbGRMaXRlTm90RGVzdHJ1Y3RlZCh2b2lkKiBtYXBfZmllbGRfbGl0ZSk7CisjZW5kaWYKKworLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhY2Nlc3MgdG8gbWFwIGZpZWxkIHVzaW5nIGdlbmVyYXRlZCBhcGkuIEl0IGlzIHVzZWQgZm9yCisvLyBpbnRlcm5hbCBnZW5lcmF0ZWQgbWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBvbmx5LiBVc2VycyBzaG91bGQgbmV2ZXIgdXNlIHRoaXMKKy8vIGRpcmVjdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVCwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtleV93aXJlX3R5cGUsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSB2YWx1ZV93aXJlX3R5cGU+CitjbGFzcyBNYXBGaWVsZExpdGUgeworICAvLyBEZWZpbmUgbWVzc2FnZSB0eXBlIGZvciBpbnRlcm5hbCByZXBlYXRlZCBmaWVsZC4KKyAgdHlwZWRlZiBEZXJpdmVkIEVudHJ5VHlwZTsKKworIHB1YmxpYzoKKyAgdHlwZWRlZiBNYXA8S2V5LCBUPiBNYXBUeXBlOworCisgIGNvbnN0ZXhwciBNYXBGaWVsZExpdGUoKSA6IG1hcF8oKSB7fQorICBleHBsaWNpdCBNYXBGaWVsZExpdGUoQXJlbmEqIGFyZW5hKSA6IG1hcF8oYXJlbmEpIHt9CisgIE1hcEZpZWxkTGl0ZShBcmVuYUluaXRpYWxpemVkLCBBcmVuYSogYXJlbmEpIDogTWFwRmllbGRMaXRlKGFyZW5hKSB7fQorCisjaWZkZWYgTkRFQlVHCisgIHZvaWQgRGVzdHJ1Y3QoKSB7IG1hcF8ufk1hcCgpOyB9CisgIH5NYXBGaWVsZExpdGUoKSB7fQorI2Vsc2UKKyAgdm9pZCBEZXN0cnVjdCgpIHsKKyAgICAvLyBXZSB3YW50IHRvIGRlc3RydWN0IHRoZSBtYXAgaW4gc3VjaCBhIHdheSB0aGF0IHdlIGNhbiB2ZXJpZnkKKyAgICAvLyB0aGF0IHdlJ3ZlIGRvbmUgdGhhdCwgYnV0IGFsc28gYmUgc3VyZSB0aGF0IHdlJ3ZlIGRlYWxsb2NhdGVkCisgICAgLy8gZXZlcnl0aGluZyAoYXMgb3Bwb3NlZCB0byBsZWF2aW5nIGFuIGFsbG9jYXRpb24gYmVoaW5kIHdpdGggbm8KKyAgICAvLyBkYXRhIGluIGl0LCBhcyB3b3VsZCBoYXBwZW4gaWYgYSB2ZWN0b3Igd2FzIHJlc2l6ZSdkIHRvIHplcm8uCisgICAgLy8gTWFwOjpTd2FwIHdpdGggYW4gZW1wdHkgbWFwIGFjY29tcGxpc2hlcyB0aGF0LgorICAgIGRlY2x0eXBlKG1hcF8pIHN3YXBwZWRfbWFwKG1hcF8uYXJlbmEoKSk7CisgICAgbWFwXy5JbnRlcm5hbFN3YXAoc3dhcHBlZF9tYXApOworICB9CisgIH5NYXBGaWVsZExpdGUoKSB7CisgICAgaWYgKG1hcF8uYXJlbmEoKSA9PSBudWxscHRyICYmICFtYXBfLmVtcHR5KCkpIHsKKyAgICAgIE1hcEZpZWxkTGl0ZU5vdERlc3RydWN0ZWQodGhpcyk7CisgICAgfQorICB9CisjZW5kaWYKKyAgLy8gQWNjZXNzb3JzCisgIGNvbnN0IE1hcDxLZXksIFQ+JiBHZXRNYXAoKSBjb25zdCB7IHJldHVybiBtYXBfOyB9CisgIE1hcDxLZXksIFQ+KiBNdXRhYmxlTWFwKCkgeyByZXR1cm4gJm1hcF87IH0KKworICAvLyBDb252ZW5pZW50IG1ldGhvZHMgZm9yIGdlbmVyYXRlZCBtZXNzYWdlIGltcGxlbWVudGF0aW9uLgorICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4obWFwXy5zaXplKCkpOyB9CisgIHZvaWQgQ2xlYXIoKSB7IHJldHVybiBtYXBfLmNsZWFyKCk7IH0KKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgTWFwRmllbGRMaXRlJiBvdGhlcikgeworICAgIGZvciAodHlwZW5hbWUgTWFwPEtleSwgVD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gb3RoZXIubWFwXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gb3RoZXIubWFwXy5lbmQoKTsgKytpdCkgeworICAgICAgbWFwX1tpdC0+Zmlyc3RdID0gaXQtPnNlY29uZDsKKyAgICB9CisgIH0KKyAgdm9pZCBTd2FwKE1hcEZpZWxkTGl0ZSogb3RoZXIpIHsgbWFwXy5zd2FwKG90aGVyLT5tYXBfKTsgfQorICB2b2lkIEludGVybmFsU3dhcChNYXBGaWVsZExpdGUqIG90aGVyKSB7IG1hcF8uSW50ZXJuYWxTd2FwKG90aGVyLT5tYXBfKTsgfQorCisgIC8vIFVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHBhcnNpbmcuIENhbGxlciBzaG91bGQgdGFrZSB0aGUgb3duZXJzaGlwIGlmZgorICAvLyBhcmVuYV8gaXMgbnVsbHB0ci4KKyAgRW50cnlUeXBlKiBOZXdFbnRyeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8RW50cnlUeXBlPihtYXBfLmFyZW5hKCkpOworICB9CisKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCkgeworICAgIHR5cGVuYW1lIERlcml2ZWQ6OnRlbXBsYXRlIFBhcnNlcjxNYXBGaWVsZExpdGUsIE1hcDxLZXksIFQ+PiBwYXJzZXIodGhpcyk7CisgICAgcmV0dXJuIHBhcnNlci5fSW50ZXJuYWxQYXJzZShwdHIsIGN0eCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVW5rbm93blR5cGU+CisgIGNvbnN0IGNoYXIqIFBhcnNlV2l0aEVudW1WYWxpZGF0aW9uKGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc192YWxpZCkoaW50KSwgdWludDMyX3QgZmllbGRfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbE1ldGFkYXRhKiBtZXRhZGF0YSkgeworICAgIHR5cGVuYW1lIERlcml2ZWQ6OnRlbXBsYXRlIFBhcnNlcjxNYXBGaWVsZExpdGUsIE1hcDxLZXksIFQ+PiBwYXJzZXIodGhpcyk7CisgICAgcmV0dXJuIHBhcnNlci50ZW1wbGF0ZSBQYXJzZVdpdGhFbnVtVmFsaWRhdGlvbjxVbmtub3duVHlwZT4oCisgICAgICAgIHB0ciwgY3R4LCBpc192YWxpZCwgZmllbGRfbnVtLCBtZXRhZGF0YSk7CisgIH0KKworIHByaXZhdGU6CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKworICAvLyBtYXBfIGlzIGluc2lkZSBhbiBhbm9ueW1vdXMgdW5pb24gc28gd2UgY2FuIGV4cGxpY2l0bHkgY29udHJvbCBpdHMKKyAgLy8gZGVzdHJ1Y3Rpb24KKyAgdW5pb24geworICAgIE1hcDxLZXksIFQ+IG1hcF87CisgIH07CisKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBVbmtub3duVHlwZSwgdHlwZW5hbWUgVD4KK3N0cnVjdCBFbnVtUGFyc2VXcmFwcGVyIHsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCkgeworICAgIHJldHVybiBtYXBfZmllbGQtPnRlbXBsYXRlIFBhcnNlV2l0aEVudW1WYWxpZGF0aW9uPFVua25vd25UeXBlPigKKyAgICAgICAgcHRyLCBjdHgsIGlzX3ZhbGlkLCBmaWVsZF9udW0sIG1ldGFkYXRhKTsKKyAgfQorICBUKiBtYXBfZmllbGQ7CisgIGJvb2wgKCppc192YWxpZCkoaW50KTsKKyAgdWludDMyX3QgZmllbGRfbnVtOworICBJbnRlcm5hbE1ldGFkYXRhKiBtZXRhZGF0YTsKK307CisKKy8vIEhlbHBlciBmdW5jdGlvbiBiZWNhdXNlIHRoZSB0eXBlbmFtZXMgb2YgbWFwcyBhcmUgaG9ycmVuZG91cyB0byBwcmludC4gVGhpcworLy8gbGV2ZXJhZ2VzIGNvbXBpbGVyIHR5cGUgZGVkdWN0aW9uLCB0byBrZWVwIGFsbCB0eXBlIGRhdGEgb3V0IG9mIHRoZQorLy8gZ2VuZXJhdGVkIGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBVbmtub3duVHlwZSwgdHlwZW5hbWUgVD4KK0VudW1QYXJzZVdyYXBwZXI8VW5rbm93blR5cGUsIFQ+IEluaXRFbnVtUGFyc2VXcmFwcGVyKAorICAgIFQqIG1hcF9maWVsZCwgYm9vbCAoKmlzX3ZhbGlkKShpbnQpLCB1aW50MzJfdCBmaWVsZF9udW0sCisgICAgSW50ZXJuYWxNZXRhZGF0YSogbWV0YWRhdGEpIHsKKyAgcmV0dXJuIEVudW1QYXJzZVdyYXBwZXI8VW5rbm93blR5cGUsIFQ+e21hcF9maWVsZCwgaXNfdmFsaWQsIGZpZWxkX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhfTsKK30KKworLy8gVHJ1ZSBpZiBJc0luaXRpYWxpemVkKCkgaXMgdHJ1ZSBmb3IgdmFsdWUgZmllbGQgaW4gYWxsIGVsZW1lbnRzIG9mIHQuIFQgaXMKKy8vIGV4cGVjdGVkIHRvIGJlIG1lc3NhZ2UuICBJdCdzIHVzZWZ1bCB0byBoYXZlIHRoaXMgaGVscGVyIGhlcmUgdG8ga2VlcCB0aGUKKy8vIHByb3RvYnVmIGNvbXBpbGVyIGZyb20gZXZlciBoYXZpbmcgdG8gZW1pdCBsb29wcyBpbiBJc0luaXRpYWxpemVkKCkgbWV0aG9kcy4KKy8vIFdlIHdhbnQgdGhlIEMrKyBjb21waWxlciB0byBpbmxpbmUgdGhpcyBvciBub3QgYXMgaXQgc2VlcyBmaXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBULAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga2V5X3dpcmVfdHlwZSwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIHZhbHVlX3dpcmVfdHlwZT4KK2Jvb2wgQWxsQXJlSW5pdGlhbGl6ZWQoY29uc3QgTWFwRmllbGRMaXRlPERlcml2ZWQsIEtleSwgVCwga2V5X3dpcmVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3dpcmVfdHlwZT4mIGZpZWxkKSB7CisgIGNvbnN0IGF1dG8mIHQgPSBmaWVsZC5HZXRNYXAoKTsKKyAgZm9yICh0eXBlbmFtZSBNYXA8S2V5LCBUPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0LmJlZ2luKCk7IGl0ICE9IHQuZW5kKCk7CisgICAgICAgKytpdCkgeworICAgIGlmICghaXQtPnNlY29uZC5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1FbnRyeT4KK3N0cnVjdCBNYXBFbnRyeVRvTWFwRmllbGQgOiBNYXBFbnRyeVRvTWFwRmllbGQ8dHlwZW5hbWUgTUVudHJ5OjpTdXBlclR5cGU+IHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBWYWx1ZSwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGtLZXlGaWVsZFR5cGUsCisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrVmFsdWVGaWVsZFR5cGU+CitzdHJ1Y3QgTWFwRW50cnlUb01hcEZpZWxkPAorICAgIE1hcEVudHJ5TGl0ZTxULCBLZXksIFZhbHVlLCBrS2V5RmllbGRUeXBlLCBrVmFsdWVGaWVsZFR5cGU+PiB7CisgIHR5cGVkZWYgTWFwRmllbGRMaXRlPAorICAgICAgTWFwRW50cnlMaXRlPFQsIEtleSwgVmFsdWUsIGtLZXlGaWVsZFR5cGUsIGtWYWx1ZUZpZWxkVHlwZT4sIEtleSwgVmFsdWUsCisgICAgICBrS2V5RmllbGRUeXBlLCBrVmFsdWVGaWVsZFR5cGU+CisgICAgICBNYXBGaWVsZFR5cGU7Cit9OworCisjaWZuZGVmIE5ERUJVRworaW5saW5lIFBST1RPQlVGX05PSU5MSU5FIHZvaWQgTWFwRmllbGRMaXRlTm90RGVzdHJ1Y3RlZCh2b2lkKiBtYXBfZmllbGRfbGl0ZSkgeworICBib29sIHByb3Blcl9kZXN0cnVjdCA9IGZhbHNlOworICBHT09HTEVfQ0hFQ0socHJvcGVyX2Rlc3RydWN0KSA8PCBtYXBfZmllbGRfbGl0ZTsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9NQVBfRklFTERfTElURV9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX3Rlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NTljOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF90ZXN0LmNjCkBAIC0wLDAgKzEsNTM4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9pbmwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdF91dGlsLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3VzaW5nIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM7CisKKy8vIEFyZW5hSG9sZGVyIGZyb20gbWFwX3Rlc3RfdXRpbC5oIHdvcmtzIGZpbmUgZm9yIGZpZWxkcyBvdGhlciB0aGFuIG1hcAorLy8gZmllbGRzLiAgRm9yIG1hcCBmaWVsZHMsIHRoZSBEZXN0cnVjdCgpIGNhbGwgbXVzdCBiZSBtYWRlIGJlZm9yZSB0aGUKKy8vIGFjdHVhbCBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXBUeXBlPgorc3RydWN0IEFyZW5hRGVzdHJ1Y3RvciA6IEFyZW5hSG9sZGVyPE1hcFR5cGU+IHsKKyAgdXNpbmcgQXJlbmFIb2xkZXI8TWFwVHlwZT46OkFyZW5hSG9sZGVyOworICB+QXJlbmFEZXN0cnVjdG9yKCkgeyBBcmVuYUhvbGRlcjxNYXBUeXBlPjo6Z2V0KCktPkRlc3RydWN0KCk7IH0KK307CisKK2NsYXNzIE1hcEZpZWxkQmFzZVN0dWIgOiBwdWJsaWMgTWFwRmllbGRCYXNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgTWFwRmllbGRCYXNlU3R1YigpIHt9CisgIHZpcnR1YWwgfk1hcEZpZWxkQmFzZVN0dWIoKSB7IE1hcEZpZWxkQmFzZTo6RGVzdHJ1Y3QoKTsgfQorICBleHBsaWNpdCBNYXBGaWVsZEJhc2VTdHViKEFyZW5hKiBhcmVuYSkgOiBNYXBGaWVsZEJhc2UoYXJlbmEpIHt9CisgIC8vIEdldCB1bmRlcmxpbmVkIHJlcGVhdGVkIGZpZWxkIHdpdGhvdXQgc3luY2hyb25pemluZyBtYXAuCisgIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4qIEludGVybmFsUmVwZWF0ZWRGaWVsZCgpIHsgcmV0dXJuIHJlcGVhdGVkX2ZpZWxkXzsgfQorICBib29sIElzTWFwQ2xlYW4oKSB7CisgICAgcmV0dXJuIHN0YXRlXy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpICE9IFNUQVRFX01PRElGSUVEX01BUDsKKyAgfQorICBib29sIElzUmVwZWF0ZWRDbGVhbigpIHsKKyAgICByZXR1cm4gc3RhdGVfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkgIT0gU1RBVEVfTU9ESUZJRURfUkVQRUFURUQ7CisgIH0KKyAgdm9pZCBTZXRNYXBEaXJ0eSgpIHsKKyAgICBzdGF0ZV8uc3RvcmUoU1RBVEVfTU9ESUZJRURfTUFQLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgfQorICB2b2lkIFNldFJlcGVhdGVkRGlydHkoKSB7CisgICAgc3RhdGVfLnN0b3JlKFNUQVRFX01PRElGSUVEX1JFUEVBVEVELCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgfQorICBib29sIENvbnRhaW5zTWFwS2V5KGNvbnN0IE1hcEtleSYgbWFwX2tleSkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgYm9vbCBJbnNlcnRPckxvb2t1cE1hcFZhbHVlKGNvbnN0IE1hcEtleSYgbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcFZhbHVlUmVmKiB2YWwpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYm9vbCBMb29rdXBNYXBWYWx1ZShjb25zdCBNYXBLZXkmIG1hcF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgTWFwVmFsdWVDb25zdFJlZiogdmFsKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGJvb2wgRGVsZXRlTWFwVmFsdWUoY29uc3QgTWFwS2V5JiBtYXBfa2V5KSBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICBib29sIEVxdWFsSXRlcmF0b3IoY29uc3QgTWFwSXRlcmF0b3ImIGEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXBJdGVyYXRvciYgYikgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbnQgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgdm9pZCBDbGVhcigpIG92ZXJyaWRlIHt9CisgIHZvaWQgTWFwQmVnaW4oTWFwSXRlcmF0b3IqIG1hcF9pdGVyKSBjb25zdCBvdmVycmlkZSB7fQorICB2b2lkIE1hcEVuZChNYXBJdGVyYXRvciogbWFwX2l0ZXIpIGNvbnN0IG92ZXJyaWRlIHt9CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IE1hcEZpZWxkQmFzZSYgb3RoZXIpIG92ZXJyaWRlIHt9CisgIHZvaWQgU3dhcChNYXBGaWVsZEJhc2UqIG90aGVyKSBvdmVycmlkZSB7fQorICB2b2lkIEluaXRpYWxpemVJdGVyYXRvcihNYXBJdGVyYXRvciogbWFwX2l0ZXIpIGNvbnN0IG92ZXJyaWRlIHt9CisgIHZvaWQgRGVsZXRlSXRlcmF0b3IoTWFwSXRlcmF0b3IqIG1hcF9pdGVyKSBjb25zdCBvdmVycmlkZSB7fQorICB2b2lkIENvcHlJdGVyYXRvcihNYXBJdGVyYXRvciogdGhpc19pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFwSXRlcmF0b3ImIG90aGVyX2l0ZXJhdG9yKSBjb25zdCBvdmVycmlkZSB7fQorICB2b2lkIEluY3JlYXNlSXRlcmF0b3IoTWFwSXRlcmF0b3IqIG1hcF9pdGVyKSBjb25zdCBvdmVycmlkZSB7fQorCisgIEFyZW5hKiBHZXRBcmVuYUZvckludGVybmFsUmVwZWF0ZWRGaWVsZCgpIHsKKyAgICBhdXRvKiByZXBlYXRlZF9maWVsZCA9IE11dGFibGVSZXBlYXRlZEZpZWxkKCk7CisgICAgcmV0dXJuIHJlcGVhdGVkX2ZpZWxkLT5HZXRBcmVuYSgpOworICB9Cit9OworCitjbGFzcyBNYXBGaWVsZEJhc2VQcmltaXRpdmVUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Ym9vbD4geworIHByb3RlY3RlZDoKKyAgdHlwZWRlZiB1bml0dGVzdDo6VGVzdE1hcF9NYXBJbnQzMkludDMyRW50cnlfRG9Ob3RVc2UgRW50cnlUeXBlOworICB0eXBlZGVmIE1hcEZpZWxkPEVudHJ5VHlwZSwgaW50MzJfdCwgaW50MzJfdCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+CisgICAgICBNYXBGaWVsZFR5cGU7CisKKyAgTWFwRmllbGRCYXNlUHJpbWl0aXZlVGVzdCgpCisgICAgICA6IGFyZW5hXyhHZXRQYXJhbSgpID8gbmV3IEFyZW5hKCkgOiBudWxscHRyKSwKKyAgICAgICAgbWFwX2ZpZWxkXyhhcmVuYV8uZ2V0KCkpLAorICAgICAgICBtYXBfZmllbGRfYmFzZV8obWFwX2ZpZWxkXy5nZXQoKSkgeworICAgIC8vIEdldCBkZXNjcmlwdG9ycworICAgIG1hcF9kZXNjcmlwdG9yXyA9IHVuaXR0ZXN0OjpUZXN0TWFwOjpkZXNjcmlwdG9yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9pbnQzMl9pbnQzMiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bWVzc2FnZV90eXBlKCk7CisgICAga2V5X2Rlc2NyaXB0b3JfID0gbWFwX2Rlc2NyaXB0b3JfLT5tYXBfa2V5KCk7CisgICAgdmFsdWVfZGVzY3JpcHRvcl8gPSBtYXBfZGVzY3JpcHRvcl8tPm1hcF92YWx1ZSgpOworCisgICAgLy8gQnVpbGQgbWFwIGZpZWxkCisgICAgbWFwX2ZpZWxkX2Jhc2VfID0gbWFwX2ZpZWxkXy5nZXQoKTsKKyAgICBtYXBfID0gbWFwX2ZpZWxkXy0+TXV0YWJsZU1hcCgpOworICAgIGluaXRpYWxfdmFsdWVfbWFwX1swXSA9IDEwMDsKKyAgICBpbml0aWFsX3ZhbHVlX21hcF9bMV0gPSAxMDE7CisgICAgbWFwXy0+aW5zZXJ0KGluaXRpYWxfdmFsdWVfbWFwXy5iZWdpbigpLCBpbml0aWFsX3ZhbHVlX21hcF8uZW5kKCkpOworICAgIEVYUEVDVF9FUSgyLCBtYXBfLT5zaXplKCkpOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPEFyZW5hPiBhcmVuYV87CisgIEFyZW5hRGVzdHJ1Y3RvcjxNYXBGaWVsZFR5cGU+IG1hcF9maWVsZF87CisgIE1hcEZpZWxkQmFzZSogbWFwX2ZpZWxkX2Jhc2VfOworICBNYXA8aW50MzJfdCwgaW50MzJfdD4qIG1hcF87CisgIGNvbnN0IERlc2NyaXB0b3IqIG1hcF9kZXNjcmlwdG9yXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBrZXlfZGVzY3JpcHRvcl87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsdWVfZGVzY3JpcHRvcl87CisgIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+CisgICAgICBpbml0aWFsX3ZhbHVlX21hcF87ICAvLyBjb3B5IG9mIGluaXRpYWwgdmFsdWVzIGluc2VydGVkCit9OworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTWFwRmllbGRCYXNlUHJpbWl0aXZlVGVzdEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hcEZpZWxkQmFzZVByaW1pdGl2ZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzKHRydWUsIGZhbHNlKSk7CisKK1RFU1RfUChNYXBGaWVsZEJhc2VQcmltaXRpdmVUZXN0LCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKSB7CisgIEVYUEVDVF9MVCgwLCBtYXBfZmllbGRfYmFzZV8tPlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSk7Cit9CisKK1RFU1RfUChNYXBGaWVsZEJhc2VQcmltaXRpdmVUZXN0LCBHZXRSZXBlYXRlZEZpZWxkKSB7CisgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4mIHJlcGVhdGVkID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiY+KAorICAgICAgICAgIG1hcF9maWVsZF9iYXNlXy0+R2V0UmVwZWF0ZWRGaWVsZCgpKTsKKyAgRVhQRUNUX0VRKDIsIHJlcGVhdGVkLnNpemUoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0ZWQuc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlID0gcmVwZWF0ZWQuR2V0KGkpOworICAgIGludCBrZXkgPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIobWVzc2FnZSwga2V5X2Rlc2NyaXB0b3JfKTsKKyAgICBpbnQgdmFsdWUgPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIobWVzc2FnZSwgdmFsdWVfZGVzY3JpcHRvcl8pOworICAgIEVYUEVDVF9FUSh2YWx1ZSwgaW5pdGlhbF92YWx1ZV9tYXBfW2tleV0pOworICB9Cit9CisKK1RFU1RfUChNYXBGaWVsZEJhc2VQcmltaXRpdmVUZXN0LCBNdXRhYmxlUmVwZWF0ZWRGaWVsZCkgeworICBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KiByZXBlYXRlZCA9CisgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4qPigKKyAgICAgICAgICBtYXBfZmllbGRfYmFzZV8tPk11dGFibGVSZXBlYXRlZEZpZWxkKCkpOworICBFWFBFQ1RfRVEoMiwgcmVwZWF0ZWQtPnNpemUoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0ZWQtPnNpemUoKTsgaSsrKSB7CisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSA9IHJlcGVhdGVkLT5HZXQoaSk7CisgICAgaW50IGtleSA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMihtZXNzYWdlLCBrZXlfZGVzY3JpcHRvcl8pOworICAgIGludCB2YWx1ZSA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMihtZXNzYWdlLCB2YWx1ZV9kZXNjcmlwdG9yXyk7CisgICAgRVhQRUNUX0VRKHZhbHVlLCBpbml0aWFsX3ZhbHVlX21hcF9ba2V5XSk7CisgIH0KK30KKworVEVTVF9QKE1hcEZpZWxkQmFzZVByaW1pdGl2ZVRlc3QsIEFyZW5hKSB7CisgIC8vIEFsbG9jYXRlIGEgbGFyZ2UgaW5pdGlhbCBibG9jayB0byBhdm9pZCBtYWxsb2NzIGR1cmluZyBob29rZWQgdGVzdC4KKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gYXJlbmFfYmxvY2soMTI4ICogMTAyNCk7CisgIEFyZW5hT3B0aW9ucyBvcHRpb25zOworICBvcHRpb25zLmluaXRpYWxfYmxvY2sgPSAmYXJlbmFfYmxvY2tbMF07CisgIG9wdGlvbnMuaW5pdGlhbF9ibG9ja19zaXplID0gYXJlbmFfYmxvY2suc2l6ZSgpOworICBBcmVuYSBhcmVuYShvcHRpb25zKTsKKworICB7CisgICAgLy8gVE9ETyhsaXVqaXNpKTogUmUtd3JpdGUgdGhlIHRlc3QgdG8gZW5zdXJlIHRoZSBtZW1vcnkgZm9yIHRoZSBtYXAgYW5kCisgICAgLy8gcmVwZWF0ZWQgZmllbGRzIGFyZSBhbGxvY2F0ZWQgZnJvbSBhcmVuYXMuCisgICAgLy8gTm9IZWFwQ2hlY2tlciBub19oZWFwOworCisgICAgTWFwRmllbGRUeXBlKiBtYXBfZmllbGQgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxNYXBGaWVsZFR5cGU+KCZhcmVuYSk7CisKKyAgICAvLyBTZXQgY29udGVudCBpbiBtYXAKKyAgICAoKm1hcF9maWVsZC0+TXV0YWJsZU1hcCgpKVsxMDBdID0gMTAxOworCisgICAgLy8gVHJpZ2dlciBjb252ZXJzaW9uIHRvIHJlcGVhdGVkIGZpZWxkLgorICAgIG1hcF9maWVsZC0+R2V0UmVwZWF0ZWRGaWVsZCgpOworICB9CisKKyAgeworICAgIC8vIFRPRE8obGl1amlzaSk6IFJlLXdyaXRlIHRoZSB0ZXN0IHRvIGVuc3VyZSB0aGUgbWVtb3J5IGZvciB0aGUgbWFwIGFuZAorICAgIC8vIHJlcGVhdGVkIGZpZWxkcyBhcmUgYWxsb2NhdGVkIGZyb20gYXJlbmFzLgorICAgIC8vIE5vSGVhcENoZWNrZXIgbm9faGVhcDsKKworICAgIE1hcEZpZWxkQmFzZVN0dWIqIG1hcF9maWVsZCA9CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPE1hcEZpZWxkQmFzZVN0dWI+KCZhcmVuYSk7CisKKyAgICAvLyBUcmlnZ2VyIGNvbnZlcnNpb24gdG8gcmVwZWF0ZWQgZmllbGQuCisgICAgRVhQRUNUX1RSVUUobWFwX2ZpZWxkLT5NdXRhYmxlUmVwZWF0ZWRGaWVsZCgpICE9IG51bGxwdHIpOworCisgICAgRVhQRUNUX0VRKG1hcF9maWVsZC0+R2V0QXJlbmFGb3JJbnRlcm5hbFJlcGVhdGVkRmllbGQoKSwgJmFyZW5hKTsKKyAgfQorfQorCitURVNUX1AoTWFwRmllbGRCYXNlUHJpbWl0aXZlVGVzdCwgRW5mb3JjZU5vQXJlbmEpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPE1hcEZpZWxkQmFzZVN0dWI+IG1hcF9maWVsZCgKKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPE1hcEZpZWxkQmFzZVN0dWI+KG51bGxwdHIpKTsKKyAgRVhQRUNUX0VRKG1hcF9maWVsZC0+R2V0QXJlbmFGb3JJbnRlcm5hbFJlcGVhdGVkRmllbGQoKSwgbnVsbHB0cik7Cit9CisKK25hbWVzcGFjZSB7CitlbnVtIFN0YXRlIHsgQ0xFQU4sIE1BUF9ESVJUWSwgUkVQRUFURURfRElSVFkgfTsKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworY2xhc3MgTWFwRmllbGRTdGF0ZVRlc3QKKyAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6dHVwbGU8U3RhdGUsIGJvb2w+PiB7CisgcHJvdGVjdGVkOgorICB0eXBlZGVmIHVuaXR0ZXN0OjpUZXN0TWFwX01hcEludDMySW50MzJFbnRyeV9Eb05vdFVzZSBFbnRyeVR5cGU7CisgIHR5cGVkZWYgTWFwRmllbGQ8RW50cnlUeXBlLCBpbnQzMl90LCBpbnQzMl90LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4KKyAgICAgIE1hcEZpZWxkVHlwZTsKKyAgTWFwRmllbGRTdGF0ZVRlc3QoKQorICAgICAgOiBhcmVuYV8oc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSkgPyBuZXcgQXJlbmEoKSA6IG51bGxwdHIpLAorICAgICAgICBtYXBfZmllbGRfKGFyZW5hXy5nZXQoKSksCisgICAgICAgIG1hcF9maWVsZF9iYXNlXyhtYXBfZmllbGRfLmdldCgpKSwKKyAgICAgICAgc3RhdGVfKHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpKSB7CisgICAgLy8gQnVpbGQgbWFwIGZpZWxkCisgICAgRXhwZWN0KG1hcF9maWVsZF8uZ2V0KCksIE1BUF9ESVJUWSwgMCwgMCwgdHJ1ZSk7CisgICAgc3dpdGNoIChzdGF0ZV8pIHsKKyAgICAgIGNhc2UgQ0xFQU46CisgICAgICAgIEFkZE9uZVN0aWxsQ2xlYW4obWFwX2ZpZWxkXy5nZXQoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNQVBfRElSVFk6CisgICAgICAgIE1ha2VNYXBEaXJ0eShtYXBfZmllbGRfLmdldCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFJFUEVBVEVEX0RJUlRZOgorICAgICAgICBNYWtlUmVwZWF0ZWREaXJ0eShtYXBfZmllbGRfLmdldCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICB2b2lkIEFkZE9uZVN0aWxsQ2xlYW4oTWFwRmllbGRUeXBlKiBtYXBfZmllbGQpIHsKKyAgICBNYXBGaWVsZEJhc2UqIG1hcF9maWVsZF9iYXNlID0gbWFwX2ZpZWxkOworICAgIE1hcDxpbnQzMl90LCBpbnQzMl90PiogbWFwID0gbWFwX2ZpZWxkLT5NdXRhYmxlTWFwKCk7CisgICAgKCptYXApWzBdID0gMDsKKyAgICBtYXBfZmllbGRfYmFzZS0+R2V0UmVwZWF0ZWRGaWVsZCgpOworICAgIEV4cGVjdChtYXBfZmllbGQsIENMRUFOLCAxLCAxLCBmYWxzZSk7CisgIH0KKworICB2b2lkIE1ha2VNYXBEaXJ0eShNYXBGaWVsZFR5cGUqIG1hcF9maWVsZCkgeworICAgIE1hcDxpbnQzMl90LCBpbnQzMl90PiogbWFwID0gbWFwX2ZpZWxkLT5NdXRhYmxlTWFwKCk7CisgICAgKCptYXApWzBdID0gMDsKKyAgICBFeHBlY3QobWFwX2ZpZWxkLCBNQVBfRElSVFksIDEsIDAsIHRydWUpOworICB9CisKKyAgdm9pZCBNYWtlUmVwZWF0ZWREaXJ0eShNYXBGaWVsZFR5cGUqIG1hcF9maWVsZCkgeworICAgIE1ha2VNYXBEaXJ0eShtYXBfZmllbGQpOworICAgIE1hcEZpZWxkQmFzZSogbWFwX2ZpZWxkX2Jhc2UgPSBtYXBfZmllbGQ7CisgICAgbWFwX2ZpZWxkX2Jhc2UtPk11dGFibGVSZXBlYXRlZEZpZWxkKCk7CisgICAgLy8gV2UgdXNlIE11dGFibGVNYXAgb24gaW1wbF8gYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGRpc3R1cmIgdGhlIHN5bmNpbmcKKyAgICBNYXA8aW50MzJfdCwgaW50MzJfdD4qIG1hcCA9IG1hcF9maWVsZC0+aW1wbF8uTXV0YWJsZU1hcCgpOworICAgIG1hcC0+Y2xlYXIoKTsKKworICAgIEV4cGVjdChtYXBfZmllbGQsIFJFUEVBVEVEX0RJUlRZLCAwLCAxLCBmYWxzZSk7CisgIH0KKworICB2b2lkIEV4cGVjdChNYXBGaWVsZFR5cGUqIG1hcF9maWVsZCwgU3RhdGUgc3RhdGUsIGludCBtYXBfc2l6ZSwKKyAgICAgICAgICAgICAgaW50IHJlcGVhdGVkX3NpemUsIGJvb2wgaXNfcmVwZWF0ZWRfbnVsbCkgeworICAgIE1hcEZpZWxkQmFzZSogbWFwX2ZpZWxkX2Jhc2UgPSBtYXBfZmllbGQ7CisgICAgTWFwRmllbGRCYXNlU3R1Yiogc3R1YiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TWFwRmllbGRCYXNlU3R1Yio+KG1hcF9maWVsZF9iYXNlKTsKKworICAgIC8vIFdlIHVzZSBNdXRhYmxlTWFwIG9uIGltcGxfIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkaXN0dXJiIHRoZSBzeW5jaW5nCisgICAgTWFwPGludDMyX3QsIGludDMyX3Q+KiBtYXAgPSBtYXBfZmllbGQtPmltcGxfLk11dGFibGVNYXAoKTsKKyAgICBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KiByZXBlYXRlZF9maWVsZCA9IHN0dWItPkludGVybmFsUmVwZWF0ZWRGaWVsZCgpOworCisgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgY2FzZSBNQVBfRElSVFk6CisgICAgICAgIEVYUEVDVF9GQUxTRShzdHViLT5Jc01hcENsZWFuKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShzdHViLT5Jc1JlcGVhdGVkQ2xlYW4oKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSRVBFQVRFRF9ESVJUWToKKyAgICAgICAgRVhQRUNUX1RSVUUoc3R1Yi0+SXNNYXBDbGVhbigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHN0dWItPklzUmVwZWF0ZWRDbGVhbigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENMRUFOOgorICAgICAgICBFWFBFQ1RfVFJVRShzdHViLT5Jc01hcENsZWFuKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShzdHViLT5Jc1JlcGVhdGVkQ2xlYW4oKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgRkFJTCgpOworICAgIH0KKworICAgIEVYUEVDVF9FUShtYXBfc2l6ZSwgbWFwLT5zaXplKCkpOworICAgIGlmIChpc19yZXBlYXRlZF9udWxsKSB7CisgICAgICBFWFBFQ1RfVFJVRShyZXBlYXRlZF9maWVsZCA9PSBudWxscHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHJlcGVhdGVkX2ZpZWxkID09IG51bGxwdHIpIHsKKyAgICAgICAgRVhQRUNUX0VRKHJlcGVhdGVkX3NpemUsIDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRVhQRUNUX0VRKHJlcGVhdGVkX3NpemUsIHJlcGVhdGVkX2ZpZWxkLT5zaXplKCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxBcmVuYT4gYXJlbmFfOworICBBcmVuYURlc3RydWN0b3I8TWFwRmllbGRUeXBlPiBtYXBfZmllbGRfOworICBNYXBGaWVsZEJhc2UqIG1hcF9maWVsZF9iYXNlXzsKKyAgU3RhdGUgc3RhdGVfOworfTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1hcEZpZWxkU3RhdGVUZXN0SW5zdGFuY2UsIE1hcEZpZWxkU3RhdGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OkNvbWJpbmUodGVzdGluZzo6VmFsdWVzKENMRUFOLCBNQVBfRElSVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVQRUFURURfRElSVFkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzKHRydWUsIGZhbHNlKSkpOworCitURVNUX1AoTWFwRmllbGRTdGF0ZVRlc3QsIEdldE1hcCkgeworICBtYXBfZmllbGRfLT5HZXRNYXAoKTsKKyAgaWYgKHN0YXRlXyAhPSBNQVBfRElSVFkpIHsKKyAgICBFeHBlY3QobWFwX2ZpZWxkXy5nZXQoKSwgQ0xFQU4sIDEsIDEsIGZhbHNlKTsKKyAgfSBlbHNlIHsKKyAgICBFeHBlY3QobWFwX2ZpZWxkXy5nZXQoKSwgTUFQX0RJUlRZLCAxLCAwLCB0cnVlKTsKKyAgfQorfQorCitURVNUX1AoTWFwRmllbGRTdGF0ZVRlc3QsIE11dGFibGVNYXApIHsKKyAgbWFwX2ZpZWxkXy0+TXV0YWJsZU1hcCgpOworICBpZiAoc3RhdGVfICE9IE1BUF9ESVJUWSkgeworICAgIEV4cGVjdChtYXBfZmllbGRfLmdldCgpLCBNQVBfRElSVFksIDEsIDEsIGZhbHNlKTsKKyAgfSBlbHNlIHsKKyAgICBFeHBlY3QobWFwX2ZpZWxkXy5nZXQoKSwgTUFQX0RJUlRZLCAxLCAwLCB0cnVlKTsKKyAgfQorfQorCitURVNUX1AoTWFwRmllbGRTdGF0ZVRlc3QsIE1lcmdlRnJvbUNsZWFuKSB7CisgIEFyZW5hRGVzdHJ1Y3RvcjxNYXBGaWVsZFR5cGU+IG90aGVyKGFyZW5hXy5nZXQoKSk7CisgIEFkZE9uZVN0aWxsQ2xlYW4ob3RoZXIuZ2V0KCkpOworCisgIG1hcF9maWVsZF8tPk1lcmdlRnJvbSgqb3RoZXIpOworCisgIGlmIChzdGF0ZV8gIT0gTUFQX0RJUlRZKSB7CisgICAgRXhwZWN0KG1hcF9maWVsZF8uZ2V0KCksIE1BUF9ESVJUWSwgMSwgMSwgZmFsc2UpOworICB9IGVsc2UgeworICAgIEV4cGVjdChtYXBfZmllbGRfLmdldCgpLCBNQVBfRElSVFksIDEsIDAsIHRydWUpOworICB9CisKKyAgRXhwZWN0KG90aGVyLmdldCgpLCBDTEVBTiwgMSwgMSwgZmFsc2UpOworfQorCitURVNUX1AoTWFwRmllbGRTdGF0ZVRlc3QsIE1lcmdlRnJvbU1hcERpcnR5KSB7CisgIEFyZW5hRGVzdHJ1Y3RvcjxNYXBGaWVsZFR5cGU+IG90aGVyKGFyZW5hXy5nZXQoKSk7CisgIE1ha2VNYXBEaXJ0eShvdGhlci5nZXQoKSk7CisKKyAgbWFwX2ZpZWxkXy0+TWVyZ2VGcm9tKCpvdGhlcik7CisKKyAgaWYgKHN0YXRlXyAhPSBNQVBfRElSVFkpIHsKKyAgICBFeHBlY3QobWFwX2ZpZWxkXy5nZXQoKSwgTUFQX0RJUlRZLCAxLCAxLCBmYWxzZSk7CisgIH0gZWxzZSB7CisgICAgRXhwZWN0KG1hcF9maWVsZF8uZ2V0KCksIE1BUF9ESVJUWSwgMSwgMCwgdHJ1ZSk7CisgIH0KKworICBFeHBlY3Qob3RoZXIuZ2V0KCksIE1BUF9ESVJUWSwgMSwgMCwgdHJ1ZSk7Cit9CisKK1RFU1RfUChNYXBGaWVsZFN0YXRlVGVzdCwgTWVyZ2VGcm9tUmVwZWF0ZWREaXJ0eSkgeworICBBcmVuYURlc3RydWN0b3I8TWFwRmllbGRUeXBlPiBvdGhlcihhcmVuYV8uZ2V0KCkpOworICBNYWtlUmVwZWF0ZWREaXJ0eShvdGhlci5nZXQoKSk7CisKKyAgbWFwX2ZpZWxkXy0+TWVyZ2VGcm9tKCpvdGhlcik7CisKKyAgaWYgKHN0YXRlXyAhPSBNQVBfRElSVFkpIHsKKyAgICBFeHBlY3QobWFwX2ZpZWxkXy5nZXQoKSwgTUFQX0RJUlRZLCAxLCAxLCBmYWxzZSk7CisgIH0gZWxzZSB7CisgICAgRXhwZWN0KG1hcF9maWVsZF8uZ2V0KCksIE1BUF9ESVJUWSwgMSwgMCwgdHJ1ZSk7CisgIH0KKworICBFeHBlY3Qob3RoZXIuZ2V0KCksIENMRUFOLCAxLCAxLCBmYWxzZSk7Cit9CisKK1RFU1RfUChNYXBGaWVsZFN0YXRlVGVzdCwgU3dhcENsZWFuKSB7CisgIEFyZW5hRGVzdHJ1Y3RvcjxNYXBGaWVsZFR5cGU+IG90aGVyKGFyZW5hXy5nZXQoKSk7CisgIEFkZE9uZVN0aWxsQ2xlYW4ob3RoZXIuZ2V0KCkpOworCisgIG1hcF9maWVsZF8tPlN3YXAob3RoZXIuZ2V0KCkpOworCisgIEV4cGVjdChtYXBfZmllbGRfLmdldCgpLCBDTEVBTiwgMSwgMSwgZmFsc2UpOworCisgIHN3aXRjaCAoc3RhdGVfKSB7CisgICAgY2FzZSBDTEVBTjoKKyAgICAgIEV4cGVjdChvdGhlci5nZXQoKSwgQ0xFQU4sIDEsIDEsIGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUFQX0RJUlRZOgorICAgICAgRXhwZWN0KG90aGVyLmdldCgpLCBNQVBfRElSVFksIDEsIDAsIHRydWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSRVBFQVRFRF9ESVJUWToKKyAgICAgIEV4cGVjdChvdGhlci5nZXQoKSwgUkVQRUFURURfRElSVFksIDAsIDEsIGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitURVNUX1AoTWFwRmllbGRTdGF0ZVRlc3QsIFN3YXBNYXBEaXJ0eSkgeworICBBcmVuYURlc3RydWN0b3I8TWFwRmllbGRUeXBlPiBvdGhlcihhcmVuYV8uZ2V0KCkpOworICBNYWtlTWFwRGlydHkob3RoZXIuZ2V0KCkpOworCisgIG1hcF9maWVsZF8tPlN3YXAob3RoZXIuZ2V0KCkpOworCisgIEV4cGVjdChtYXBfZmllbGRfLmdldCgpLCBNQVBfRElSVFksIDEsIDAsIHRydWUpOworCisgIHN3aXRjaCAoc3RhdGVfKSB7CisgICAgY2FzZSBDTEVBTjoKKyAgICAgIEV4cGVjdChvdGhlci5nZXQoKSwgQ0xFQU4sIDEsIDEsIGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUFQX0RJUlRZOgorICAgICAgRXhwZWN0KG90aGVyLmdldCgpLCBNQVBfRElSVFksIDEsIDAsIHRydWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSRVBFQVRFRF9ESVJUWToKKyAgICAgIEV4cGVjdChvdGhlci5nZXQoKSwgUkVQRUFURURfRElSVFksIDAsIDEsIGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitURVNUX1AoTWFwRmllbGRTdGF0ZVRlc3QsIFN3YXBSZXBlYXRlZERpcnR5KSB7CisgIEFyZW5hRGVzdHJ1Y3RvcjxNYXBGaWVsZFR5cGU+IG90aGVyKGFyZW5hXy5nZXQoKSk7CisgIE1ha2VSZXBlYXRlZERpcnR5KG90aGVyLmdldCgpKTsKKworICBtYXBfZmllbGRfLT5Td2FwKG90aGVyLmdldCgpKTsKKworICBFeHBlY3QobWFwX2ZpZWxkXy5nZXQoKSwgUkVQRUFURURfRElSVFksIDAsIDEsIGZhbHNlKTsKKworICBzd2l0Y2ggKHN0YXRlXykgeworICAgIGNhc2UgQ0xFQU46CisgICAgICBFeHBlY3Qob3RoZXIuZ2V0KCksIENMRUFOLCAxLCAxLCBmYWxzZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1BUF9ESVJUWToKKyAgICAgIEV4cGVjdChvdGhlci5nZXQoKSwgTUFQX0RJUlRZLCAxLCAwLCB0cnVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUkVQRUFURURfRElSVFk6CisgICAgICBFeHBlY3Qob3RoZXIuZ2V0KCksIFJFUEVBVEVEX0RJUlRZLCAwLCAxLCBmYWxzZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworVEVTVF9QKE1hcEZpZWxkU3RhdGVUZXN0LCBDbGVhcikgeworICBtYXBfZmllbGRfLT5DbGVhcigpOworCisgIEV4cGVjdChtYXBfZmllbGRfLmdldCgpLCBNQVBfRElSVFksIDAsIDAsIGZhbHNlKTsKK30KKworVEVTVF9QKE1hcEZpZWxkU3RhdGVUZXN0LCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKSB7CisgIG1hcF9maWVsZF9iYXNlXy0+U3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpOworCisgIHN3aXRjaCAoc3RhdGVfKSB7CisgICAgY2FzZSBDTEVBTjoKKyAgICAgIEV4cGVjdChtYXBfZmllbGRfLmdldCgpLCBDTEVBTiwgMSwgMSwgZmFsc2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVBfRElSVFk6CisgICAgICBFeHBlY3QobWFwX2ZpZWxkXy5nZXQoKSwgTUFQX0RJUlRZLCAxLCAwLCB0cnVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUkVQRUFURURfRElSVFk6CisgICAgICBFeHBlY3QobWFwX2ZpZWxkXy5nZXQoKSwgUkVQRUFURURfRElSVFksIDAsIDEsIGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitURVNUX1AoTWFwRmllbGRTdGF0ZVRlc3QsIEdldE1hcEZpZWxkKSB7CisgIG1hcF9maWVsZF9iYXNlXy0+R2V0UmVwZWF0ZWRGaWVsZCgpOworCisgIGlmIChzdGF0ZV8gIT0gUkVQRUFURURfRElSVFkpIHsKKyAgICBFeHBlY3QobWFwX2ZpZWxkXy5nZXQoKSwgQ0xFQU4sIDEsIDEsIGZhbHNlKTsKKyAgfSBlbHNlIHsKKyAgICBFeHBlY3QobWFwX2ZpZWxkXy5nZXQoKSwgUkVQRUFURURfRElSVFksIDAsIDEsIGZhbHNlKTsKKyAgfQorfQorCitURVNUX1AoTWFwRmllbGRTdGF0ZVRlc3QsIE11dGFibGVNYXBGaWVsZCkgeworICBtYXBfZmllbGRfYmFzZV8tPk11dGFibGVSZXBlYXRlZEZpZWxkKCk7CisKKyAgaWYgKHN0YXRlXyAhPSBSRVBFQVRFRF9ESVJUWSkgeworICAgIEV4cGVjdChtYXBfZmllbGRfLmdldCgpLCBSRVBFQVRFRF9ESVJUWSwgMSwgMSwgZmFsc2UpOworICB9IGVsc2UgeworICAgIEV4cGVjdChtYXBfZmllbGRfLmdldCgpLCBSRVBFQVRFRF9ESVJUWSwgMCwgMSwgZmFsc2UpOworICB9Cit9CisKK2NsYXNzIE15TWFwRmllbGQKKyAgICA6IHB1YmxpYyBNYXBGaWVsZDx1bml0dGVzdDo6VGVzdE1hcF9NYXBJbnQzMkludDMyRW50cnlfRG9Ob3RVc2UsIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCwgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4geworIHB1YmxpYzoKKyAgY29uc3RleHByIE15TWFwRmllbGQoKQorICAgICAgOiBNeU1hcEZpZWxkOjpNYXBGaWVsZChpbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorfTsKKworVEVTVChNYXBGaWVsZFRlc3QsIENvbnN0SW5pdCkgeworICAvLyBUaGlzIHRlc3RzIHRoYXQgYE1hcEZpZWxkYCBhbmQgYWxsIGl0cyBiYXNlIGNsYXNzZXMgY2FuIGJlIGNvbnN0YW50CisgIC8vIGluaXRpYWxpemVkLgorICBQUk9UT0JVRl9DT05TVElOSVQgc3RhdGljIE15TWFwRmllbGQgZmllbGQ7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMCk7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxZjI2NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjCkBAIC0wLDAgKzEsOTQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0X3V0aWxfaW1wbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK3ZvaWQgTWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHModW5pdHRlc3Q6OlRlc3RNYXBMaXRlKiBtZXNzYWdlKSB7CisgIE1hcFRlc3RVdGlsSW1wbDo6U2V0TWFwRmllbGRzPHVuaXR0ZXN0OjpNYXBFbnVtTGl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6Ok1BUF9FTlVNX0JBUl9MSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6TUFQX0VOVU1fQkFaX0xJVEU+KG1lc3NhZ2UpOworfQorCit2b2lkIE1hcExpdGVUZXN0VXRpbDo6U2V0QXJlbmFNYXBGaWVsZHModW5pdHRlc3Q6OlRlc3RBcmVuYU1hcExpdGUqIG1lc3NhZ2UpIHsKKyAgTWFwVGVzdFV0aWxJbXBsOjpTZXRBcmVuYU1hcEZpZWxkczx1bml0dGVzdDo6TWFwRW51bUxpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6Ok1BUF9FTlVNX0JBUl9MSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpNQVBfRU5VTV9CQVpfTElURT4obWVzc2FnZSk7Cit9CisKK3ZvaWQgTWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHNJbml0aWFsaXplZCh1bml0dGVzdDo6VGVzdE1hcExpdGUqIG1lc3NhZ2UpIHsKKyAgTWFwVGVzdFV0aWxJbXBsOjpTZXRNYXBGaWVsZHNJbml0aWFsaXplZChtZXNzYWdlKTsKK30KKwordm9pZCBNYXBMaXRlVGVzdFV0aWw6Ok1vZGlmeU1hcEZpZWxkcyh1bml0dGVzdDo6VGVzdE1hcExpdGUqIG1lc3NhZ2UpIHsKKyAgTWFwVGVzdFV0aWxJbXBsOjpNb2RpZnlNYXBGaWVsZHM8dW5pdHRlc3Q6Ok1hcEVudW1MaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6TUFQX0VOVU1fRk9PX0xJVEU+KG1lc3NhZ2UpOworfQorCit2b2lkIE1hcExpdGVUZXN0VXRpbDo6RXhwZWN0Q2xlYXIoY29uc3QgdW5pdHRlc3Q6OlRlc3RNYXBMaXRlJiBtZXNzYWdlKSB7CisgIE1hcFRlc3RVdGlsSW1wbDo6RXhwZWN0Q2xlYXIobWVzc2FnZSk7Cit9CisKK3ZvaWQgTWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQoY29uc3QgdW5pdHRlc3Q6OlRlc3RNYXBMaXRlJiBtZXNzYWdlKSB7CisgIE1hcFRlc3RVdGlsSW1wbDo6RXhwZWN0TWFwRmllbGRzU2V0PHVuaXR0ZXN0OjpNYXBFbnVtTGl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6Ok1BUF9FTlVNX0JBUl9MSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6TUFQX0VOVU1fQkFaX0xJVEU+KG1lc3NhZ2UpOworfQorCit2b2lkIE1hcExpdGVUZXN0VXRpbDo6RXhwZWN0QXJlbmFNYXBGaWVsZHNTZXQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBcmVuYU1hcExpdGUmIG1lc3NhZ2UpIHsKKyAgTWFwVGVzdFV0aWxJbXBsOjpFeHBlY3RBcmVuYU1hcEZpZWxkc1NldDx1bml0dGVzdDo6TWFwRW51bUxpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6Ok1BUF9FTlVNX0JBUl9MSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpNQVBfRU5VTV9CQVpfTElURT4oCisgICAgICBtZXNzYWdlKTsKK30KKwordm9pZCBNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldEluaXRpYWxpemVkKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0TWFwTGl0ZSYgbWVzc2FnZSkgeworICBNYXBUZXN0VXRpbEltcGw6OkV4cGVjdE1hcEZpZWxkc1NldEluaXRpYWxpemVkPHVuaXR0ZXN0OjpNYXBFbnVtTGl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6TUFQX0VOVU1fRk9PX0xJVEU+KAorICAgICAgbWVzc2FnZSk7Cit9CisKK3ZvaWQgTWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNNb2RpZmllZCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdE1hcExpdGUmIG1lc3NhZ2UpIHsKKyAgTWFwVGVzdFV0aWxJbXBsOjpFeHBlY3RNYXBGaWVsZHNNb2RpZmllZDx1bml0dGVzdDo6TWFwRW51bUxpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6Ok1BUF9FTlVNX0JBUl9MSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpNQVBfRU5VTV9GT09fTElURT4oCisgICAgICBtZXNzYWdlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzNkZTdiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuaApAQCAtMCwwICsxLDgwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTUFQX0xJVEVfVEVTVF9VVElMX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUFQX0xJVEVfVEVTVF9VVElMX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnBiLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgTWFwTGl0ZVRlc3RVdGlsIHsKKyBwdWJsaWM6CisgIC8vIFNldCBldmVyeSBmaWVsZCBpbiB0aGUgVGVzdE1hcExpdGUgbWVzc2FnZSB0byBhIHVuaXF1ZSB2YWx1ZS4KKyAgc3RhdGljIHZvaWQgU2V0TWFwRmllbGRzKHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSogbWVzc2FnZSk7CisKKyAgLy8gU2V0IGV2ZXJ5IGZpZWxkIGluIHRoZSBUZXN0QXJlbmFNYXBMaXRlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCisgIHN0YXRpYyB2b2lkIFNldEFyZW5hTWFwRmllbGRzKHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QXJlbmFNYXBMaXRlKiBtZXNzYWdlKTsKKworICAvLyBTZXQgZXZlcnkgZmllbGQgaW4gdGhlIG1lc3NhZ2UgdG8gYSBkZWZhdWx0IHZhbHVlLgorICBzdGF0aWMgdm9pZCBTZXRNYXBGaWVsZHNJbml0aWFsaXplZChwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUqIG1lc3NhZ2UpOworCisgIC8vIE1vZGlmeSBhbGwgdGhlIG1hcCBmaWVsZHMgb2YgdGhlIG1lc3NhZ2UgKHdoaWNoIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbgorICAvLyBpbml0aWFsaXplZCB3aXRoIFNldE1hcEZpZWxkcygpKS4KKyAgc3RhdGljIHZvaWQgTW9kaWZ5TWFwRmllbGRzKHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSogbWVzc2FnZSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgZmllbGRzIGhhdmUgdGhlIHZhbHVlcyB0aGF0IHRoZXkgc2hvdWxkIGhhdmUgYWZ0ZXIKKyAgLy8gU2V0TWFwRmllbGRzKCkgaXMgY2FsbGVkLgorICBzdGF0aWMgdm9pZCBFeHBlY3RNYXBGaWVsZHNTZXQoY29uc3QgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlJiBtZXNzYWdlKTsKKworICAvLyBDaGVjayB0aGF0IGFsbCBmaWVsZHMgaGF2ZSB0aGUgdmFsdWVzIHRoYXQgdGhleSBzaG91bGQgaGF2ZSBhZnRlcgorICAvLyBTZXRNYXBGaWVsZHMoKSBpcyBjYWxsZWQgZm9yIFRlc3RBcmVuYU1hcExpdGUuCisgIHN0YXRpYyB2b2lkIEV4cGVjdEFyZW5hTWFwRmllbGRzU2V0KAorICAgICAgY29uc3QgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBcmVuYU1hcExpdGUmIG1lc3NhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgYWxsIGZpZWxkcyBoYXZlIHRoZSB2YWx1ZXMgdGhhdCB0aGV5IHNob3VsZCBoYXZlIGFmdGVyCisgIC8vIFNldE1hcEZpZWxkc0luaXRpYWxpemVkKCkgaXMgY2FsbGVkLgorICBzdGF0aWMgdm9pZCBFeHBlY3RNYXBGaWVsZHNTZXRJbml0aWFsaXplZCgKKyAgICAgIGNvbnN0IHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSYgbWVzc2FnZSk7CisKKyAgLy8gRXhwZWN0IHRoYXQgdGhlIG1lc3NhZ2UgaXMgbW9kaWZpZWQgYXMgd291bGQgYmUgZXhwZWN0ZWQgZnJvbQorICAvLyBNb2RpZnlNYXBGaWVsZHMoKS4KKyAgc3RhdGljIHZvaWQgRXhwZWN0TWFwRmllbGRzTW9kaWZpZWQoCisgICAgICBjb25zdCBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUmIG1lc3NhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgYWxsIGZpZWxkcyBhcmUgZW1wdHkuCisgIHN0YXRpYyB2b2lkIEV4cGVjdENsZWFyKGNvbnN0IHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSYgbWVzc2FnZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTUFQX0xJVEVfVEVTVF9VVElMX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YxMDQzMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucHJvdG8KQEAgLTAsMCArMSwxMzEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90byI7CisKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK21lc3NhZ2UgVGVzdE1hcExpdGUgeworICBtYXA8aW50MzIsIGludDMyPiBtYXBfaW50MzJfaW50MzIgPSAxOworICBtYXA8aW50NjQsIGludDY0PiBtYXBfaW50NjRfaW50NjQgPSAyOworICBtYXA8dWludDMyLCB1aW50MzI+IG1hcF91aW50MzJfdWludDMyID0gMzsKKyAgbWFwPHVpbnQ2NCwgdWludDY0PiBtYXBfdWludDY0X3VpbnQ2NCA9IDQ7CisgIG1hcDxzaW50MzIsIHNpbnQzMj4gbWFwX3NpbnQzMl9zaW50MzIgPSA1OworICBtYXA8c2ludDY0LCBzaW50NjQ+IG1hcF9zaW50NjRfc2ludDY0ID0gNjsKKyAgbWFwPGZpeGVkMzIsIGZpeGVkMzI+IG1hcF9maXhlZDMyX2ZpeGVkMzIgPSA3OworICBtYXA8Zml4ZWQ2NCwgZml4ZWQ2ND4gbWFwX2ZpeGVkNjRfZml4ZWQ2NCA9IDg7CisgIG1hcDxzZml4ZWQzMiwgc2ZpeGVkMzI+IG1hcF9zZml4ZWQzMl9zZml4ZWQzMiA9IDk7CisgIG1hcDxzZml4ZWQ2NCwgc2ZpeGVkNjQ+IG1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCA9IDEwOworICBtYXA8aW50MzIsIGZsb2F0PiBtYXBfaW50MzJfZmxvYXQgPSAxMTsKKyAgbWFwPGludDMyLCBkb3VibGU+IG1hcF9pbnQzMl9kb3VibGUgPSAxMjsKKyAgbWFwPGJvb2wsIGJvb2w+IG1hcF9ib29sX2Jvb2wgPSAxMzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBtYXBfc3RyaW5nX3N0cmluZyA9IDE0OworICBtYXA8aW50MzIsIGJ5dGVzPiBtYXBfaW50MzJfYnl0ZXMgPSAxNTsKKyAgbWFwPGludDMyLCBNYXBFbnVtTGl0ZT4gbWFwX2ludDMyX2VudW0gPSAxNjsKKyAgbWFwPGludDMyLCBGb3JlaWduTWVzc2FnZUxpdGU+IG1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UgPSAxNzsKKyAgbWFwPGludDMyLCBpbnQzMj4gdGVib3JpbmcgPSAxODsKK30KKworbWVzc2FnZSBUZXN0QXJlbmFNYXBMaXRlIHsKKyAgbWFwPGludDMyLCBpbnQzMj4gbWFwX2ludDMyX2ludDMyID0gMTsKKyAgbWFwPGludDY0LCBpbnQ2ND4gbWFwX2ludDY0X2ludDY0ID0gMjsKKyAgbWFwPHVpbnQzMiwgdWludDMyPiBtYXBfdWludDMyX3VpbnQzMiA9IDM7CisgIG1hcDx1aW50NjQsIHVpbnQ2ND4gbWFwX3VpbnQ2NF91aW50NjQgPSA0OworICBtYXA8c2ludDMyLCBzaW50MzI+IG1hcF9zaW50MzJfc2ludDMyID0gNTsKKyAgbWFwPHNpbnQ2NCwgc2ludDY0PiBtYXBfc2ludDY0X3NpbnQ2NCA9IDY7CisgIG1hcDxmaXhlZDMyLCBmaXhlZDMyPiBtYXBfZml4ZWQzMl9maXhlZDMyID0gNzsKKyAgbWFwPGZpeGVkNjQsIGZpeGVkNjQ+IG1hcF9maXhlZDY0X2ZpeGVkNjQgPSA4OworICBtYXA8c2ZpeGVkMzIsIHNmaXhlZDMyPiBtYXBfc2ZpeGVkMzJfc2ZpeGVkMzIgPSA5OworICBtYXA8c2ZpeGVkNjQsIHNmaXhlZDY0PiBtYXBfc2ZpeGVkNjRfc2ZpeGVkNjQgPSAxMDsKKyAgbWFwPGludDMyLCBmbG9hdD4gbWFwX2ludDMyX2Zsb2F0ID0gMTE7CisgIG1hcDxpbnQzMiwgZG91YmxlPiBtYXBfaW50MzJfZG91YmxlID0gMTI7CisgIG1hcDxib29sLCBib29sPiBtYXBfYm9vbF9ib29sID0gMTM7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbWFwX3N0cmluZ19zdHJpbmcgPSAxNDsKKyAgbWFwPGludDMyLCBieXRlcz4gbWFwX2ludDMyX2J5dGVzID0gMTU7CisgIG1hcDxpbnQzMiwgTWFwRW51bUxpdGU+IG1hcF9pbnQzMl9lbnVtID0gMTY7CisgIG1hcDxpbnQzMiwgRm9yZWlnbk1lc3NhZ2VBcmVuYUxpdGU+IG1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UgPSAxNzsKK30KKworLy8gVGVzdCBlbWJlZGRlZCBtZXNzYWdlIHdpdGggcmVxdWlyZWQgZmllbGRzCittZXNzYWdlIFRlc3RSZXF1aXJlZE1lc3NhZ2VNYXBMaXRlIHsKKyAgbWFwPGludDMyLCBUZXN0UmVxdWlyZWRMaXRlPiBtYXBfZmllbGQgPSAxOworfQorCittZXNzYWdlIFRlc3RFbnVtTWFwTGl0ZSB7CisgIG1hcDxpbnQzMiwgUHJvdG8yTWFwRW51bUxpdGU+IGtub3duX21hcF9maWVsZCA9IDEwMTsKKyAgbWFwPGludDMyLCBQcm90bzJNYXBFbnVtTGl0ZT4gdW5rbm93bl9tYXBfZmllbGQgPSAxMDI7Cit9CisKK21lc3NhZ2UgVGVzdEVudW1NYXBQbHVzRXh0cmFMaXRlIHsKKyAgbWFwPGludDMyLCBQcm90bzJNYXBFbnVtUGx1c0V4dHJhTGl0ZT4ga25vd25fbWFwX2ZpZWxkID0gMTAxOworICBtYXA8aW50MzIsIFByb3RvMk1hcEVudW1QbHVzRXh0cmFMaXRlPiB1bmtub3duX21hcF9maWVsZCA9IDEwMjsKK30KKworbWVzc2FnZSBUZXN0TWVzc2FnZU1hcExpdGUgeworICBtYXA8aW50MzIsIFRlc3RBbGxUeXBlc0xpdGU+IG1hcF9pbnQzMl9tZXNzYWdlID0gMTsKK30KKworZW51bSBQcm90bzJNYXBFbnVtTGl0ZSB7CisgIFBST1RPMl9NQVBfRU5VTV9GT09fTElURSA9IDA7CisgIFBST1RPMl9NQVBfRU5VTV9CQVJfTElURSA9IDE7CisgIFBST1RPMl9NQVBfRU5VTV9CQVpfTElURSA9IDI7Cit9CisKK2VudW0gUHJvdG8yTWFwRW51bVBsdXNFeHRyYUxpdGUgeworICBFX1BST1RPMl9NQVBfRU5VTV9GT09fTElURSA9IDA7CisgIEVfUFJPVE8yX01BUF9FTlVNX0JBUl9MSVRFID0gMTsKKyAgRV9QUk9UTzJfTUFQX0VOVU1fQkFaX0xJVEUgPSAyOworICBFX1BST1RPMl9NQVBfRU5VTV9FWFRSQV9MSVRFID0gMzsKK30KKworZW51bSBNYXBFbnVtTGl0ZSB7CisgIE1BUF9FTlVNX0ZPT19MSVRFID0gMDsKKyAgTUFQX0VOVU1fQkFSX0xJVEUgPSAxOworICBNQVBfRU5VTV9CQVpfTElURSA9IDI7Cit9CisKK21lc3NhZ2UgVGVzdFJlcXVpcmVkTGl0ZSB7CisgIHJlcXVpcmVkIGludDMyIGEgPSAxOworICByZXF1aXJlZCBpbnQzMiBiID0gMjsKKyAgcmVxdWlyZWQgaW50MzIgYyA9IDM7CisKKyAgZXh0ZW5kIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSB7CisgICAgb3B0aW9uYWwgVGVzdFJlcXVpcmVkTGl0ZSBzaW5nbGUgPSAxMDAwOworICB9Cit9CisKK21lc3NhZ2UgRm9yZWlnbk1lc3NhZ2VBcmVuYUxpdGUgeworICBvcHRpb25hbCBpbnQzMiBjID0gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGQ1OGY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnByb3RvCkBAIC0wLDAgKzEsOTEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8yIjsKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvIjsKKworLy8gV2UgZG9uJ3QgcHV0IHRoaXMgaW4gYSBwYWNrYWdlIHdpdGhpbiBwcm90bzIgYmVjYXVzZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorLy8gdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgZG9lc24ndCBkZXBlbmQgb24gYmVpbmcgaW4gdGhlIHByb3RvMiBuYW1lc3BhY2UuCisvLyBJbiBtYXBfdGVzdF91dGlsLmggd2UgZG8gInVzaW5nIG5hbWVzcGFjZSB1bml0dGVzdCA9IHByb3RvYnVmX3VuaXR0ZXN0Ii4KK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK2VudW0gUHJvdG8yTWFwRW51bSB7CisgIFBST1RPMl9NQVBfRU5VTV9GT08gICA9IDA7CisgIFBST1RPMl9NQVBfRU5VTV9CQVIgICA9IDE7CisgIFBST1RPMl9NQVBfRU5VTV9CQVogICA9IDI7Cit9CisKK2VudW0gUHJvdG8yTWFwRW51bVBsdXNFeHRyYSB7CisgIEVfUFJPVE8yX01BUF9FTlVNX0ZPTyAgID0gMDsKKyAgRV9QUk9UTzJfTUFQX0VOVU1fQkFSICAgPSAxOworICBFX1BST1RPMl9NQVBfRU5VTV9CQVogICA9IDI7CisgIEVfUFJPVE8yX01BUF9FTlVNX0VYVFJBID0gMzsKK30KKworbWVzc2FnZSBUZXN0RW51bU1hcCB7CisgIG1hcDxpbnQzMiwgUHJvdG8yTWFwRW51bT4ga25vd25fbWFwX2ZpZWxkID0gMTAxOworICBtYXA8aW50MzIsIFByb3RvMk1hcEVudW0+IHVua25vd25fbWFwX2ZpZWxkID0gMTAyOworfQorCittZXNzYWdlIFRlc3RFbnVtTWFwUGx1c0V4dHJhIHsKKyAgbWFwPGludDMyLCBQcm90bzJNYXBFbnVtUGx1c0V4dHJhPiBrbm93bl9tYXBfZmllbGQgPSAxMDE7CisgIG1hcDxpbnQzMiwgUHJvdG8yTWFwRW51bVBsdXNFeHRyYT4gdW5rbm93bl9tYXBfZmllbGQgPSAxMDI7Cit9CisKK21lc3NhZ2UgVGVzdEltcG9ydEVudW1NYXAgeworICBtYXA8aW50MzIsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtRm9yTWFwPiBpbXBvcnRfZW51bV9hbXAgPSAxOworfQorCittZXNzYWdlIFRlc3RJbnRJbnRNYXAgeworICBtYXA8aW50MzIsIGludDMyPiBtID0gMTsKK30KKworLy8gVGVzdCBhbGwga2V5IHR5cGVzOiBzdHJpbmcsIHBsdXMgdGhlIG5vbi1mbG9hdGluZy1wb2ludCBzY2FsYXJzLgorbWVzc2FnZSBUZXN0TWFwcyB7CisgIG1hcDxpbnQzMiwgVGVzdEludEludE1hcD4gbV9pbnQzMiA9IDE7CisgIG1hcDxpbnQ2NCwgVGVzdEludEludE1hcD4gbV9pbnQ2NCA9IDI7CisgIG1hcDx1aW50MzIsIFRlc3RJbnRJbnRNYXA+IG1fdWludDMyID0gMzsKKyAgbWFwPHVpbnQ2NCwgVGVzdEludEludE1hcD4gbV91aW50NjQgPSA0OworICBtYXA8c2ludDMyLCBUZXN0SW50SW50TWFwPiBtX3NpbnQzMiA9IDU7CisgIG1hcDxzaW50NjQsIFRlc3RJbnRJbnRNYXA+IG1fc2ludDY0ID0gNjsKKyAgbWFwPGZpeGVkMzIsIFRlc3RJbnRJbnRNYXA+IG1fZml4ZWQzMiA9IDc7CisgIG1hcDxmaXhlZDY0LCBUZXN0SW50SW50TWFwPiBtX2ZpeGVkNjQgPSA4OworICBtYXA8c2ZpeGVkMzIsIFRlc3RJbnRJbnRNYXA+IG1fc2ZpeGVkMzIgPSA5OworICBtYXA8c2ZpeGVkNjQsIFRlc3RJbnRJbnRNYXA+IG1fc2ZpeGVkNjQgPSAxMDsKKyAgbWFwPGJvb2wsIFRlc3RJbnRJbnRNYXA+IG1fYm9vbCA9IDExOworICBtYXA8c3RyaW5nLCBUZXN0SW50SW50TWFwPiBtX3N0cmluZyA9IDEyOworfQorCisvLyBUZXN0IG1hcHMgaW4gc3VibWVzc2FnZXMuCittZXNzYWdlIFRlc3RTdWJtZXNzYWdlTWFwcyB7CisgIG9wdGlvbmFsIFRlc3RNYXBzIG0gPSAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdjMDI0YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuY2MKQEAgLTAsMCArMSw4NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsMi5oPgorCisKKyNkZWZpbmUgQlJJREdFX1VOSVRURVNUIDo6Z29vZ2xlOjpwcm90b2J1Zjo6YnJpZGdlX3VuaXR0ZXN0CisjZGVmaW5lIFVOSVRURVNUIDo6cHJvdG9idWZfdW5pdHRlc3QKKyNkZWZpbmUgVU5JVFRFU1RfSU1QT1JUIDo6cHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0CisjZGVmaW5lIFVOSVRURVNUX1BBQ0tBR0VfTkFNRSAicHJvdG9idWZfdW5pdHRlc3QiCisKKy8vIE11c3QgaW5jbHVkZSBhZnRlciBkZWZpbmluZyBVTklUVEVTVCwgZXRjLgorLy8gY2xhbmctZm9ybWF0IG9mZgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaW5jPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdF91dGlsLmluYz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuaW5jPgorLy8gY2xhbmctZm9ybWF0IG9uCisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKworCitzdHJ1Y3QgQWxpZ25lZEFzRGVmYXVsdCB7CisgIGludCB4OworfTsKK3N0cnVjdCBhbGlnbmFzKDgpIEFsaWduZWRBczggeworICBpbnQgeDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBbGlnbmVkLCBib29sIG9uX2FyZW5hID0gZmFsc2U+Cit2b2lkIE1hcFRlc3RfQWxpZ25lZCgpIHsKKyAgQXJlbmEgYXJlbmE7CisgIGNvbnN0ZXhwciBzaXplX3QgYWxpZ25fbWFzayA9IGFsaWdub2YoQWxpZ25lZCkgLSAxOworICBNYXA8aW50LCBBbGlnbmVkPiBtYXAob25fYXJlbmEgPyAmYXJlbmEgOiBudWxscHRyKTsKKyAgbWFwLmluc2VydCh7MSwgQWxpZ25lZHt9fSk7CisgIGF1dG8gaXQgPSBtYXAuZmluZCgxKTsKKyAgQVNTRVJUX05FKGl0LCBtYXAuZW5kKCkpOworICBBU1NFUlRfRVEocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJml0LT5zZWNvbmQpICYgYWxpZ25fbWFzaywgMCk7CisgIG1hcC5jbGVhcigpOworfQorCitURVNUKE1hcFRlc3QsIEFsaWduZWQpIHsgTWFwVGVzdF9BbGlnbmVkPEFsaWduZWRBc0RlZmF1bHQ+KCk7IH0KK1RFU1QoTWFwVGVzdCwgQWxpZ25lZE9uQXJlbmEpIHsgTWFwVGVzdF9BbGlnbmVkPEFsaWduZWRBc0RlZmF1bHQsIHRydWU+KCk7IH0KK1RFU1QoTWFwVGVzdCwgQWxpZ25lZDgpIHsgTWFwVGVzdF9BbGlnbmVkPEFsaWduZWRBczg+KCk7IH0KK1RFU1QoTWFwVGVzdCwgQWxpZ25lZDhPbkFyZW5hKSB7IE1hcFRlc3RfQWxpZ25lZDxBbGlnbmVkQXM4LCB0cnVlPigpOyB9CisKKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdC5pbmMgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0LmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGE3YmZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdC5pbmMKQEAgLTAsMCArMSw0MDcxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBoYWNrIHRvIGluY2x1ZGUgd2luZG93cy5oIGZpcnN0LCB3aGljaCBlbnN1cmVzIHRoZSBHZXRNZXNzYWdlIG1hY3JvIGNhbgorLy8gYmUgdW5kZWZpbmVkIHdoZW4gd2UgaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2lmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIF9XSU5TT0NLQVBJXyAgLy8gdG8gYXZvaWQgcmUtZGVmaW5pdGlvbiBpbiBXaW5Tb2NrMi5oCisjZGVmaW5lIE5PTUlOTUFYICAgICAgLy8gdG8gYXZvaWQgZGVmaW5pbmcgbWluL21heCBtYWNyb3MKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYgIC8vIF9XSU4zMgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8cmFuZG9tPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL3RpbWVfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorCisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK3VzaW5nIFVOSVRURVNUOjpGb3JlaWduTWVzc2FnZTsKK3VzaW5nIFVOSVRURVNUOjpUZXN0QWxsVHlwZXM7Cit1c2luZyBVTklUVEVTVDo6VGVzdE1hcDsKK3VzaW5nIFVOSVRURVNUOjpUZXN0UmVjdXJzaXZlTWFwTWVzc2FnZTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordm9pZCBNYXBUZXN0Rm9yY2VEZXRlcm1pbmlzdGljKCkgeworICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlNldERlZmF1bHRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYygpOworfQorCituYW1lc3BhY2UgeworCisvLyBNYXAgQVBJIFRlc3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgTWFwSW1wbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIE1hcEltcGxUZXN0KCkKKyAgICAgIDogbWFwX3B0cl8obmV3IE1hcDxpbnQzMl90LCBpbnQzMl90PigpKSwKKyAgICAgICAgbWFwXygqbWFwX3B0cl8pLAorICAgICAgICBjb25zdF9tYXBfKCptYXBfcHRyXykgeworICAgIEVYUEVDVF9UUlVFKG1hcF8uZW1wdHkoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1hcF8uc2l6ZSgpKTsKKyAgfQorCisgIHZvaWQgRXhwZWN0U2luZ2xlRWxlbWVudChpbnQzMl90IGtleSwgaW50MzJfdCB2YWx1ZSkgeworICAgIEVYUEVDVF9GQUxTRShtYXBfLmVtcHR5KCkpOworICAgIEVYUEVDVF9FUSgxLCBtYXBfLnNpemUoKSk7CisgICAgRXhwZWN0RWxlbWVudChrZXksIHZhbHVlKTsKKyAgfQorCisgIHZvaWQgRXhwZWN0RWxlbWVudHMoY29uc3Qgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4mIG1hcCkgeworICAgIEVYUEVDVF9GQUxTRShtYXBfLmVtcHR5KCkpOworICAgIEVYUEVDVF9FUShtYXAuc2l6ZSgpLCBtYXBfLnNpemUoKSk7CisgICAgZm9yIChzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXAuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1hcC5lbmQoKTsgKytpdCkgeworICAgICAgRXhwZWN0RWxlbWVudChpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgfQorCisgIHZvaWQgRXhwZWN0RWxlbWVudChpbnQzMl90IGtleSwgaW50MzJfdCB2YWx1ZSkgeworICAgIC8vIFRlc3QgbWFwIHNpemUgaXMgY29ycmVjdC4KKyAgICBFWFBFQ1RfRVEodmFsdWUsIG1hcF9ba2V5XSk7CisgICAgRVhQRUNUX0VRKDEsIG1hcF8uY291bnQoa2V5KSk7CisgICAgRVhQRUNUX1RSVUUobWFwXy5jb250YWlucyhrZXkpKTsKKworICAgIC8vIENoZWNrIG11dGFibGUgYXQgYW5kIGZpbmQgd29yayBjb3JyZWN0bHkuCisgICAgRVhQRUNUX0VRKHZhbHVlLCBtYXBfLmF0KGtleSkpOworICAgIE1hcDxpbnQzMl90LCBpbnQzMl90Pjo6aXRlcmF0b3IgaXQgPSBtYXBfLmZpbmQoa2V5KTsKKworICAgIC8vIGl0ZXJhdG9yIGRlcmVmZXJlbmNlYWJsZQorICAgIEVYUEVDVF9FUShrZXksICgqaXQpLmZpcnN0KTsKKyAgICBFWFBFQ1RfRVEodmFsdWUsICgqaXQpLnNlY29uZCk7CisgICAgRVhQRUNUX0VRKGtleSwgaXQtPmZpcnN0KTsKKyAgICBFWFBFQ1RfRVEodmFsdWUsIGl0LT5zZWNvbmQpOworCisgICAgLy8gaXRlcmF0b3IgbXV0YWJsZQorICAgICgoKml0KS5zZWNvbmQpID0gdmFsdWUgKyAxOworICAgIEVYUEVDVF9FUSh2YWx1ZSArIDEsIG1hcF9ba2V5XSk7CisgICAgKCgqaXQpLnNlY29uZCkgPSB2YWx1ZTsKKyAgICBFWFBFQ1RfRVEodmFsdWUsIG1hcF9ba2V5XSk7CisKKyAgICBpdC0+c2Vjb25kID0gdmFsdWUgKyAxOworICAgIEVYUEVDVF9FUSh2YWx1ZSArIDEsIG1hcF9ba2V5XSk7CisgICAgaXQtPnNlY29uZCA9IHZhbHVlOworICAgIEVYUEVDVF9FUSh2YWx1ZSwgbWFwX1trZXldKTsKKworICAgIC8vIGNvcHkgY29uc3RydWN0b3IKKyAgICBNYXA8aW50MzJfdCwgaW50MzJfdD46Oml0ZXJhdG9yIGl0X2NvcHkgPSBpdDsKKyAgICBFWFBFQ1RfRVEoa2V5LCBpdF9jb3B5LT5maXJzdCk7CisgICAgRVhQRUNUX0VRKHZhbHVlLCBpdF9jb3B5LT5zZWNvbmQpOworCisgICAgLy8gSW1tdXRhYmxlIEFQSSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8vIENoZWNrIGltbXV0YWJsZSBhdCBhbmQgZmluZCB3b3JrIGNvcnJlY3RseS4KKyAgICBFWFBFQ1RfRVEodmFsdWUsIGNvbnN0X21hcF8uYXQoa2V5KSk7CisgICAgTWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdCA9IGNvbnN0X21hcF8uZmluZChrZXkpOworCisgICAgLy8gaXRlcmF0b3IgZGVyZWZlcmVuY2VhYmxlCisgICAgRVhQRUNUX0VRKGtleSwgKCpjb25zdF9pdCkuZmlyc3QpOworICAgIEVYUEVDVF9FUSh2YWx1ZSwgKCpjb25zdF9pdCkuc2Vjb25kKTsKKyAgICBFWFBFQ1RfRVEoa2V5LCBjb25zdF9pdC0+Zmlyc3QpOworICAgIEVYUEVDVF9FUSh2YWx1ZSwgY29uc3RfaXQtPnNlY29uZCk7CisKKyAgICAvLyBjb3B5IGNvbnN0cnVjdG9yCisgICAgTWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdF9jb3B5ID0gY29uc3RfaXQ7CisgICAgRVhQRUNUX0VRKGtleSwgY29uc3RfaXRfY29weS0+Zmlyc3QpOworICAgIEVYUEVDVF9FUSh2YWx1ZSwgY29uc3RfaXRfY29weS0+c2Vjb25kKTsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxNYXA8aW50MzJfdCwgaW50MzJfdD4+IG1hcF9wdHJfOworICBNYXA8aW50MzJfdCwgaW50MzJfdD4mIG1hcF87CisgIGNvbnN0IE1hcDxpbnQzMl90LCBpbnQzMl90PiYgY29uc3RfbWFwXzsKK307CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgT3BlcmF0b3JCcmFja2V0KSB7CisgIGludDMyX3Qga2V5ID0gMDsKKyAgaW50MzJfdCB2YWx1ZTEgPSAxMDA7CisgIGludDMyX3QgdmFsdWUyID0gMTAxOworCisgIEVYUEVDVF9FUSgwLCBtYXBfW2tleV0pOworCisgIG1hcF9ba2V5XSA9IHZhbHVlMTsKKyAgRXhwZWN0U2luZ2xlRWxlbWVudChrZXksIHZhbHVlMSk7CisKKyAgbWFwX1trZXldID0gdmFsdWUyOworICBFeHBlY3RTaW5nbGVFbGVtZW50KGtleSwgdmFsdWUyKTsKK30KKworc3RydWN0IE1vdmVUZXN0S2V5IHsKKyAgTW92ZVRlc3RLZXkoaW50IGRhdGEsIGludCogY29waWVzKSA6IGRhdGEoZGF0YSksIGNvcGllcyhjb3BpZXMpIHt9CisKKyAgTW92ZVRlc3RLZXkoY29uc3QgTW92ZVRlc3RLZXkmIG90aGVyKQorICAgICAgOiBkYXRhKG90aGVyLmRhdGEpLCBjb3BpZXMob3RoZXIuY29waWVzKSB7CisgICAgKysqY29waWVzOworICB9CisKKyAgTW92ZVRlc3RLZXkoTW92ZVRlc3RLZXkmJiBvdGhlcikgbm9leGNlcHQKKyAgICAgIDogZGF0YShvdGhlci5kYXRhKSwgY29waWVzKG90aGVyLmNvcGllcykge30KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1vdmVUZXN0S2V5JiBsaHMsIGNvbnN0IE1vdmVUZXN0S2V5JiByaHMpIHsKKyAgICByZXR1cm4gbGhzLmRhdGEgPT0gcmhzLmRhdGE7CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE1vdmVUZXN0S2V5JiBsaHMsIGNvbnN0IE1vdmVUZXN0S2V5JiByaHMpIHsKKyAgICByZXR1cm4gbGhzLmRhdGEgPCByaHMuZGF0YTsKKyAgfQorCisgIGludCBkYXRhOworICBpbnQqIGNvcGllczsKK307CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworbmFtZXNwYWNlIHN0ZCB7CisKK3RlbXBsYXRlIDw+ICAvLyBOT0xJTlQKK3N0cnVjdCBoYXNoPGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpNb3ZlVGVzdEtleT4geworICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TW92ZVRlc3RLZXkmIGtleSkgY29uc3QgeworICAgIHJldHVybiBoYXNoPGludD57fShrZXkuZGF0YSk7CisgIH0KK307Cit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CituYW1lc3BhY2UgeworCitURVNUX0YoTWFwSW1wbFRlc3QsIE9wZXJhdG9yQnJhY2tldFJWYWx1ZSkgeworICBBcmVuYSBhcmVuYTsKKyAgZm9yIChBcmVuYSogYXJlbmFfdG9fdXNlIDogeyZhcmVuYSwgc3RhdGljX2Nhc3Q8QXJlbmEqPihudWxscHRyKX0pIHsKKyAgICBpbnQgY29waWVzID0gMDsKKyAgICBNYXA8TW92ZVRlc3RLZXksIGludD4gbWFwKGFyZW5hX3RvX3VzZSk7CisgICAgTW92ZVRlc3RLZXkga2V5MSgxLCAmY29waWVzKTsKKyAgICBFWFBFQ1RfRVEoY29waWVzLCAwKTsKKyAgICBtYXBba2V5MV0gPSAwOworICAgIEVYUEVDVF9FUShjb3BpZXMsIDEpOworICAgIG1hcFtNb3ZlVGVzdEtleSgyLCAmY29waWVzKV0gPSAyOworICAgIEVYUEVDVF9FUShjb3BpZXMsIDEpOworICB9Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgT3BlcmF0b3JCcmFja2V0Tm9uRXhpc3QpIHsKKyAgaW50MzJfdCBrZXkgPSAwOworICBpbnQzMl90IGRlZmF1bHRfdmFsdWUgPSAwOworCisgIEVYUEVDVF9FUShkZWZhdWx0X3ZhbHVlLCBtYXBfW2tleV0pOworICBFeHBlY3RTaW5nbGVFbGVtZW50KGtleSwgZGVmYXVsdF92YWx1ZSk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgTXV0YWJsZUF0KSB7CisgIGludDMyX3Qga2V5ID0gMDsKKyAgaW50MzJfdCB2YWx1ZTEgPSAxMDA7CisgIGludDMyX3QgdmFsdWUyID0gMTAxOworCisgIG1hcF9ba2V5XSA9IHZhbHVlMTsKKyAgRXhwZWN0U2luZ2xlRWxlbWVudChrZXksIHZhbHVlMSk7CisKKyAgbWFwXy5hdChrZXkpID0gdmFsdWUyOworICBFeHBlY3RTaW5nbGVFbGVtZW50KGtleSwgdmFsdWUyKTsKK30KKworI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCisKK1RFU1RfRihNYXBJbXBsVGVzdCwgTXV0YWJsZUF0Tm9uRXhpc3REZWF0aFRlc3QpIHsKKyAgRVhQRUNUX0RFQVRIKG1hcF8uYXQoMCksICIiKTsKK30KKworVEVTVF9GKE1hcEltcGxUZXN0LCBJbW11dGFibGVBdE5vbkV4aXN0RGVhdGhUZXN0KSB7CisgIEVYUEVDVF9ERUFUSChjb25zdF9tYXBfLmF0KDApLCAiIik7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgVXNhZ2VFcnJvcnMpIHsKKyAgTWFwS2V5IGtleTsKKyAga2V5LlNldEludDY0VmFsdWUoMSk7CisgIEVYUEVDVF9ERUFUSChrZXkuR2V0VUludDY0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICJQcm90b2NvbCBCdWZmZXIgbWFwIHVzYWdlIGVycm9yOlxuIgorICAgICAgICAgICAgICAgIk1hcEtleTo6R2V0VUludDY0VmFsdWUgdHlwZSBkb2VzIG5vdCBtYXRjaFxuIgorICAgICAgICAgICAgICAgIiAgRXhwZWN0ZWQgOiB1aW50NjRcbiIKKyAgICAgICAgICAgICAgICIgIEFjdHVhbCAgIDogaW50NjQiKTsKKworICBNYXBWYWx1ZVJlZiB2YWx1ZTsKKyAgRVhQRUNUX0RFQVRIKAorICAgICAgdmFsdWUuU2V0RmxvYXRWYWx1ZSgwLjEpLAorICAgICAgIlByb3RvY29sIEJ1ZmZlciBtYXAgdXNhZ2UgZXJyb3I6XG4iCisgICAgICAiTWFwVmFsdWVbQ29uc3RdKlJlZjo6dHlwZSBNYXBWYWx1ZVtDb25zdF0qUmVmIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorCitURVNUX0YoTWFwSW1wbFRlc3QsIE1hcEtleUFzc2lnbm1lbnQpIHsKKyAgTWFwS2V5IGZyb20sIHRvOworICBmcm9tLlNldFN0cmluZ1ZhbHVlKCJhYmMiKTsKKyAgdG8gPSBmcm9tOworICBFWFBFQ1RfRVEoImFiYyIsIHRvLkdldFN0cmluZ1ZhbHVlKCkpOworfQorCitURVNUX0YoTWFwSW1wbFRlc3QsIENvdW50Tm9uRXhpc3QpIHsgRVhQRUNUX0VRKDAsIG1hcF8uY291bnQoMCkpOyB9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgQ29udGFpbk5vdEV4aXN0KSB7IEVYUEVDVF9GQUxTRShtYXBfLmNvbnRhaW5zKDApKTsgfQorCitURVNUX0YoTWFwSW1wbFRlc3QsIEltbXV0YWJsZUNvbnRhaW5Ob3RFeGlzdCkgeworICBFWFBFQ1RfRkFMU0UoY29uc3RfbWFwXy5jb250YWlucygwKSk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgTXV0YWJsZUZpbmROb25FeGlzdCkgeworICBFWFBFQ1RfVFJVRShtYXBfLmVuZCgpID09IG1hcF8uZmluZCgwKSk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgSW1tdXRhYmxlRmluZE5vbkV4aXN0KSB7CisgIEVYUEVDVF9UUlVFKGNvbnN0X21hcF8uZW5kKCkgPT0gY29uc3RfbWFwXy5maW5kKDApKTsKK30KKworVEVTVF9GKE1hcEltcGxUZXN0LCBDb25zdEVuZCkgeworICBFWFBFQ1RfVFJVRShjb25zdF9tYXBfLmVuZCgpID09IGNvbnN0X21hcF8uY2VuZCgpKTsKK30KKworVEVTVF9GKE1hcEltcGxUZXN0LCBHZXRSZWZlcmVuY2VGcm9tSXRlcmF0b3IpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgbWFwX1tpXSA9IGk7CisgIH0KKworICBmb3IgKE1hcDxpbnQzMl90LCBpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXBfLmNiZWdpbigpOworICAgICAgIGl0ICE9IG1hcF8uY2VuZCgpOykgeworICAgIE1hcDxpbnQzMl90LCBpbnQzMl90Pjo6Y29uc3RfcmVmZXJlbmNlIGVudHJ5ID0gKml0Kys7CisgICAgRVhQRUNUX0VRKGVudHJ5LmZpcnN0LCBlbnRyeS5zZWNvbmQpOworICB9CisKKyAgZm9yIChNYXA8aW50MzJfdCwgaW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29uc3RfbWFwXy5iZWdpbigpOworICAgICAgIGl0ICE9IGNvbnN0X21hcF8uZW5kKCk7KSB7CisgICAgTWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9yZWZlcmVuY2UgZW50cnkgPSAqaXQrKzsKKyAgICBFWFBFQ1RfRVEoZW50cnkuZmlyc3QsIGVudHJ5LnNlY29uZCk7CisgIH0KKworICBmb3IgKE1hcDxpbnQzMl90LCBpbnQzMl90Pjo6aXRlcmF0b3IgaXQgPSBtYXBfLmJlZ2luKCk7IGl0ICE9IG1hcF8uZW5kKCk7KSB7CisgICAgTWFwPGludDMyX3QsIGludDMyX3Q+OjpyZWZlcmVuY2UgZW50cnkgPSAqaXQrKzsKKyAgICBFWFBFQ1RfRVEoZW50cnkuZmlyc3QgKyAxLCArK2VudHJ5LnNlY29uZCk7CisgIH0KK30KKworVEVTVF9GKE1hcEltcGxUZXN0LCBJdGVyYXRvckJhc2ljKSB7CisgIG1hcF9bMF0gPSAwOworCisgIC8vIERlZmF1bHQgY29uc3RydWN0aWJsZSAocGVyIGZvcndhcmQgaXRlcmF0b3IgcmVxdWlyZW1lbnRzKS4KKyAgTWFwPGludCwgaW50Pjo6Y29uc3RfaXRlcmF0b3IgY2l0OworICBNYXA8aW50LCBpbnQ+OjppdGVyYXRvciBpdDsKKworICBpdCA9IG1hcF8uYmVnaW4oKTsKKyAgY2l0ID0gaXQ7ICAvLyBDb252ZXJ0cyB0byBjb25zdF9pdGVyYXRvcgorCisgIC8vIENhbiBjb21wYXJlIGJldHdlZW4gdGhlbS4KKyAgRVhQRUNUX1RSVUUoaXQgPT0gY2l0KTsKKyAgRVhQRUNUX0ZBTFNFKGNpdCAhPSBpdCk7CisKKyAgLy8gUHJlIGluY3JlbWVudC4KKyAgRVhQRUNUX0ZBTFNFKGl0ID09ICsrY2l0KTsKKworICAvLyBQb3N0IGluY3JlbWVudC4KKyAgRVhQRUNUX0ZBTFNFKGl0KysgPT0gY2l0KTsKKyAgRVhQRUNUX1RSVUUoaXQgPT0gY2l0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgorc3RhdGljIGludDY0X3QgbWVkaWFuKEl0ZXJhdG9yIGkwLCBJdGVyYXRvciBpMSkgeworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiB2KGkwLCBpMSk7CisgIHN0ZDo6bnRoX2VsZW1lbnQodi5iZWdpbigpLCB2LmJlZ2luKCkgKyB2LnNpemUoKSAvIDIsIHYuZW5kKCkpOworICByZXR1cm4gdlt2LnNpemUoKSAvIDJdOworfQorCitzdGF0aWMgaW50NjRfdCBOb3coKSB7CisgIHJldHVybiB1dGlsOjpUaW1lVXRpbDo6VGltZXN0YW1wVG9OYW5vc2Vjb25kcygKKyAgICAgIHV0aWw6OlRpbWVVdGlsOjpHZXRDdXJyZW50VGltZSgpKTsKK30KKworLy8gQXJiaXRyYXJ5IG9kZCBpbnRlZ2VycyBmb3IgY3JlYXRpbmcgdGVzdCBkYXRhLgorc3RhdGljIGludCBrMCA9IDgxMjM5ODc3MTsKK3N0YXRpYyBpbnQgazEgPSAxMzEyOTM4NzE3Oworc3RhdGljIGludCBrMiA9IDEzMjE1NTUzMzM7CisKKy8vIEEgbmFpdmUgYmVnaW4oKSBpbXBsZW1lbnRhdGlvbiB3aWxsIGNhdXNlIGJlZ2luKCkgdG8gZ2V0IHNsb3dlciBhbmQgc2xvd2VyCisvLyBpZiBvbmUgZXJhc2VzIGVsZW1lbnRzIGF0IHRoZSAiZnJvbnQiIG9mIHRoZSBoYXNoIG1hcCwgYW5kIHdlJ2QgbGlrZSB0bworLy8gYXZvaWQgdGhhdCwgYXMgc3RkOjp1bm9yZGVyZWRfbWFwIGRvZXMuCitURVNUX0YoTWFwSW1wbFRlc3QsIEJlZ2luSXNGYXN0KSB7CisgIGlmICh0cnVlKSByZXR1cm47ICAvLyBUT0RPKGdwaWtlKTogbWFrZSB0aGlzIGxlc3MgZmxha3kgYW5kIHJlLWVuYWJsZSBpdC4KKyAgTWFwPGludDMyX3QsIGludDMyX3Q+IG1hcDsKKyAgY29uc3QgaW50IGtUZXN0U2l6ZSA9IDI1MDAwMDsKKyAgLy8gQ3JlYXRlIGEgcmFuZG9tLWxvb2tpbmcgbWFwIG9mIHNpemUgbi4gIFVzZSBub24tbmVnYXRpdmUgaW50ZWdlciBrZXlzLgorICB1aW50MzJfdCBmcm9nID0gMTIzOTgzOworICBpbnQgbGFzdF9rZXkgPSAwOworICBpbnQgY291bnRlciA9IDA7CisgIHdoaWxlIChtYXAuc2l6ZSgpIDwga1Rlc3RTaXplKSB7CisgICAgZnJvZyAqPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oazApOworICAgIGZyb2cgXj0gZnJvZyA+PiAxNzsKKyAgICBmcm9nICs9IGNvdW50ZXIrKzsKKyAgICBsYXN0X2tleSA9CisgICAgICAgIHN0YXRpY19jYXN0PGludD4oZnJvZykgPj0gMCA/IHN0YXRpY19jYXN0PGludD4oZnJvZykgOiBsYXN0X2tleSBeIDE7CisgICAgR09PR0xFX0RDSEVDS19HRShsYXN0X2tleSwgMCk7CisgICAgbWFwW2xhc3Rfa2V5XSA9IGxhc3Rfa2V5IF4gMTsKKyAgfQorICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiB0aW1lczsKKyAgLy8gV2UncmUgZ29pbmcgdG8gZG8gbWFwLmVyYXNlKG1hcC5iZWdpbigpKSBvdmVyIGFuZCBvdmVyIGFnYWluLiAgQnV0LAorICAvLyBqdXN0IGluIGNhc2Ugb25lIGl0ZXJhdGlvbiBpcyBmYXN0IGNvbXBhcmVkIHRvIHRoZSBncmFudWxhcml0eSBvZgorICAvLyBvdXIgdGltZSBrZWVwaW5nLCB3ZSBtZWFzdXJlIGtDaHVua1NpemUgaXRlcmF0aW9ucyBwZXIgb3V0ZXItbG9vcCBpdGVyLgorICBjb25zdCBpbnQga0NodW5rU2l6ZSA9IDEwMDA7CisgIEdPT0dMRV9DSEVDS19FUShrVGVzdFNpemUgJSBrQ2h1bmtTaXplLCAwKTsKKyAgZG8geworICAgIGNvbnN0IGludDY0X3Qgc3RhcnQgPSBOb3coKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDaHVua1NpemU7IGkrKykgeworICAgICAgbWFwLmVyYXNlKG1hcC5iZWdpbigpKTsKKyAgICB9CisgICAgY29uc3QgaW50NjRfdCBlbmQgPSBOb3coKTsKKyAgICBpZiAoZW5kID4gc3RhcnQpIHsKKyAgICAgIHRpbWVzLnB1c2hfYmFjayhlbmQgLSBzdGFydCk7CisgICAgfQorICB9IHdoaWxlICghbWFwLmVtcHR5KCkpOworICBpZiAodGltZXMuc2l6ZSgpIDwgLjk5ICoga1Rlc3RTaXplIC8ga0NodW5rU2l6ZSkgeworICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgIk5vdygpIGlzbid0IGhlbHBpbmcgdXMgbWVhc3VyZSB0aW1lIjsKKyAgICByZXR1cm47CisgIH0KKyAgaW50NjRfdCB4MCA9IG1lZGlhbih0aW1lcy5iZWdpbigpLCB0aW1lcy5iZWdpbigpICsgOSk7CisgIGludDY0X3QgeDEgPSBtZWRpYW4odGltZXMuYmVnaW4oKSArIHRpbWVzLnNpemUoKSAtIDksIHRpbWVzLmVuZCgpKTsKKyAgR09PR0xFX0xPRyhJTkZPKSA8PCAieDA9IiA8PCB4MCA8PCAiLCB4MT0iIDw8IHgxOworICAvLyB4MSB3aWxsIGdyZWF0bHkgZXhjZWVkIHgwIGlmIHRoZSBjb2RlIHdlIGp1c3QgZXhlY3V0ZWQgdG9vayBPKG5eMikgdGltZS4KKyAgLy8gQW5kIHdlJ2xsIHByb2JhYmx5IHRpbWUgb3V0IGFuZCBuZXZlciBnZXQgaGVyZS4gIFNvLCB0aGlzIHRlc3QgaXMKKyAgLy8gaW50ZW50aW9uYWxseSBsb29zZTogd2UgY2hlY2sgdGhhdCB4MCBhbmQgeDEgYXJlIHdpdGhpbiBhIGZhY3RvciBvZiA4LgorICBFWFBFQ1RfR0UoeDEsIHgwIC8gOCk7CisgIEVYUEVDVF9HRSh4MCwgeDEgLyA4KTsKK30KKworLy8gVHJ5IHRvIGNyZWF0ZSBrVGVzdFNpemUga2V5cyB0aGF0IHdpbGwgbGFuZCBpbiBqdXN0IGEgZmV3IGJ1Y2tldHMsIGFuZAorLy8gdGltZSB0aGUgaW5zZXJ0aW9ucywgdG8gZ2V0IGEgcm91Z2ggZXN0aW1hdGUgb2Ygd2hldGhlciBhbiBPKG5eMikgd29yc3QgY2FzZQorLy8gd2FzIHRyaWdnZXJlZC4gIFRoaXMgdGVzdCBpcyBhIGhhY2t5LCBidXQgcHJvYmFibHkgYmV0dGVyIHRoYW4gbm90aGluZy4KK1RFU1RfRihNYXBJbXBsVGVzdCwgSGFzaEZsb29kKSB7CisgIGNvbnN0IGludCBrVGVzdFNpemUgPSAxMDI0OyAgLy8gbXVzdCBiZSBhIHBvd2VyIG9mIDIKKyAgc3RkOjpzZXQ8aW50PiBzOworICBmb3IgKGludCBpID0gMDsgcy5zaXplKCkgPCBrVGVzdFNpemU7IGkrKykgeworICAgIGlmICgobWFwXy5oYXNoX2Z1bmN0aW9uKCkoaSkgJiAoa1Rlc3RTaXplIC0gMSkpIDwgMykgeworICAgICAgcy5pbnNlcnQoaSk7CisgICAgfQorICB9CisgIC8vIENyZWF0ZSBoYXNoIHRhYmxlIHdpdGgga1Rlc3RTaXplIGVudHJpZXMgdGhhdCBoYXNoIGZsb29kIGEgdGFibGUgd2l0aAorICAvLyAxMDI0IChvciA1MTIgb3IgMjA0OCBvciAuLi4pIGVudHJpZXMuICBUaGlzIGFzc3VtZXMgdGhhdCBtYXBfIHVzZXMgcG93ZXJzCisgIC8vIG9mIDIgZm9yIHRhYmxlIHNpemVzLCBhbmQgdGhhdCBpdCdzIHN1ZmZpY2llbnQgdG8gImZsb29kIiB3aXRoIHJlc3BlY3QgdG8KKyAgLy8gdGhlIGxvdyBiaXRzIG9mIHRoZSBvdXRwdXQgb2YgbWFwXy5oYXNoX2Z1bmN0aW9uKCkuCisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IHRpbWVzOworICBzdGQ6OnNldDxpbnQ+OjppdGVyYXRvciBpdCA9IHMuYmVnaW4oKTsKKyAgaW50IGNvdW50ID0gMDsKKyAgZG8geworICAgIGNvbnN0IGludDY0X3Qgc3RhcnQgPSBOb3coKTsKKyAgICBtYXBfWyppdF0gPSAwOworICAgIGNvbnN0IGludDY0X3QgZW5kID0gTm93KCk7CisgICAgaWYgKGVuZCA+IHN0YXJ0KSB7CisgICAgICB0aW1lcy5wdXNoX2JhY2soZW5kIC0gc3RhcnQpOworICAgIH0KKyAgICArK2NvdW50OworICAgICsraXQ7CisgIH0gd2hpbGUgKGl0ICE9IHMuZW5kKCkpOworICBpZiAodGltZXMuc2l6ZSgpIDwgLjk5ICogY291bnQpIHJldHVybjsKKyAgaW50NjRfdCB4MCA9IG1lZGlhbih0aW1lcy5iZWdpbigpLCB0aW1lcy5iZWdpbigpICsgOSk7CisgIGludDY0X3QgeDEgPSBtZWRpYW4odGltZXMuYmVnaW4oKSArIHRpbWVzLnNpemUoKSAtIDksIHRpbWVzLmVuZCgpKTsKKyAgLy8geDEgd2lsbCBncmVhdGx5IGV4Y2VlZCB4MCBpZiB0aGUgY29kZSB3ZSBqdXN0IGV4ZWN1dGVkIHRvb2sgTyhuXjIpIHRpbWUuCisgIC8vIEJ1dCB3ZSB3YW50IHRvIGFsbG93IE8obiBsb2cgbikuICBBIGZhY3RvciBvZiAyMCBzaG91bGQgYmUgZ2VuZXJvdXMgZW5vdWdoLgorICBFWFBFQ1RfTEUoeDEsIHgwICogMjApOworfQorCitURVNUX0YoTWFwSW1wbFRlc3QsIENvcHlJdGVyYXRvclN0cmVzc1Rlc3QpIHsKKyAgc3RkOjp2ZWN0b3I8TWFwPGludDMyX3QsIGludDMyX3Q+OjppdGVyYXRvcj4gdjsKKyAgY29uc3QgaW50IGtJdGVycyA9IDFlNTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtJdGVyczsgaSsrKSB7CisgICAgaW50MzJfdCBrZXkgPSAoMyArIGkgKiAoNSArIGkgKiAoLTggKyBpICogKDYyICsgaSkpKSkgJiAweDc3Nzc3Nzc3OworICAgIG1hcF9ba2V5XSA9IGk7CisgICAgdi5wdXNoX2JhY2sobWFwXy5maW5kKGtleSkpOworICB9CisgIGZvciAoc3RkOjp2ZWN0b3I8TWFwPGludDMyX3QsIGludDMyX3Q+OjppdGVyYXRvcj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgdi5iZWdpbigpOworICAgICAgIGl0ICE9IHYuZW5kKCk7IGl0KyspIHsKKyAgICBNYXA8aW50MzJfdCwgaW50MzJfdD46Oml0ZXJhdG9yIGkgPSAqaXQ7CisgICAgQVNTRVJUX0VRKGktPmZpcnN0LCAoKml0KS0+Zmlyc3QpOworICAgIEFTU0VSVF9FUShpLT5zZWNvbmQsICgqaXQpLT5zZWNvbmQpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RhdGljIHZvaWQgVGVzdFZhbGlkaXR5Rm9yQWxsS2V5c0V4Y2VwdChpbnQga2V5X3RvX2F2b2lkLCBjb25zdCBUJiBjaGVja19tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFUmIG1hcCkgeworICB0eXBlZGVmIHR5cGVuYW1lIFU6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsgIC8vIGEga2V5LXZhbHVlIHBhaXIKKyAgZm9yICh0eXBlbmFtZSBVOjpjb25zdF9pdGVyYXRvciBpdCA9IG1hcC5iZWdpbigpOyBpdCAhPSBtYXAuZW5kKCk7ICsraXQpIHsKKyAgICBjb25zdCBpbnQga2V5ID0gaXQtPmZpcnN0OworICAgIGlmIChrZXkgPT0ga2V5X3RvX2F2b2lkKSBjb250aW51ZTsKKyAgICAvLyBBbGwgaXRlcmF0b3JzIHJlbGV2YW50IHRvIHRoaXMga2V5LCB3aGV0aGVyIG9sZCAoZnJvbSBjaGVja19tYXApIG9yIG5ldywKKyAgICAvLyBtdXN0IHBvaW50IHRvIHRoZSBzYW1lIG1lbW9yeS4gIFNvLCB0ZXN0IHBvaW50ZXIgZXF1YWxpdHkgaGVyZS4KKyAgICBjb25zdCB2YWx1ZV90eXBlKiBjaGVja192YWwgPSAmKmNoZWNrX21hcC5maW5kKGtleSktPnNlY29uZDsKKyAgICBFWFBFQ1RfRVEoY2hlY2tfdmFsLCAmKml0KTsKKyAgICBFWFBFQ1RfRVEoY2hlY2tfdmFsLCAmKm1hcC5maW5kKGtleSkpOworICB9Cit9CisKKy8vIEVYUEVDVCBpMCBhbmQgaTEgdG8gYmUgdGhlIHNhbWUuICBBZHZhbmNpbmcgdGhlbSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBlZmZlY3QsCisvLyB0b28uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KK3N0YXRpYyB2b2lkIFRlc3RFcXVhbEl0ZXJhdG9ycyhJdGVyIGkwLCBJdGVyIGkxLCBJdGVyIGVuZCkgeworICBjb25zdCBpbnQga01heEFkdmFuY2UgPSAxMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4QWR2YW5jZTsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGkwID09IGVuZCwgaTEgPT0gZW5kKTsKKyAgICBpZiAoaTAgPT0gZW5kKSByZXR1cm47CisgICAgRVhQRUNUX0VRKCYqaTAsICYqaTEpIDw8ICJpdGVyICIgPDwgaTsKKyAgICArK2kwOworICAgICsraTE7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yVHlwZT4KK3N0YXRpYyB2b2lkIFRlc3RPbGRWZXJzdXNOZXdJdGVyYXRvcihpbnQgc2tpcCwgTWFwPGludCwgaW50PiogbSkgeworICBjb25zdCBpbnQgaW5pdGlhbF9zaXplID0gbS0+c2l6ZSgpOworICBJdGVyYXRvclR5cGUgaXQgPSBtLT5iZWdpbigpOworICBmb3IgKGludCBpID0gMDsgaSA8IHNraXAgJiYgaXQgIT0gbS0+ZW5kKCk7IGl0KyssIGkrKykgeworICB9CisgIGlmIChpdCA9PSBtLT5lbmQoKSkgcmV0dXJuOworICBjb25zdCBJdGVyYXRvclR5cGUgb2xkID0gaXQ7CisgIEdPT0dMRV9MT0coSU5GTykgPDwgInNraXA9IiA8PCBza2lwIDw8ICIsIG9sZC0+Zmlyc3Q9IiA8PCBvbGQtPmZpcnN0OworICBjb25zdCBpbnQgdGFyZ2V0X3NpemUgPQorICAgICAgaW5pdGlhbF9zaXplIDwgMTAwID8gaW5pdGlhbF9zaXplICogNSA6IGluaXRpYWxfc2l6ZSAqIDUgLyA0OworICBmb3IgKGludCBpID0gMDsgbS0+c2l6ZSgpIDw9IHRhcmdldF9zaXplOyBpKyspIHsKKyAgICAoKm0pW2ldID0gMDsKKyAgfQorICAvLyBJdGVyYXRvciAnb2xkJyBzaG91bGQgc3RpbGwgd29yayBqdXN0IGZpbmUgZGVzcGl0ZSB0aGUgZ3Jvd3RoIG9mICptLgorICBjb25zdCBJdGVyYXRvclR5cGUgYWZ0ZXJfZ3Jvd3RoID0gbS0+ZmluZChvbGQtPmZpcnN0KTsKKyAgVGVzdEVxdWFsSXRlcmF0b3JzPEl0ZXJhdG9yVHlwZT4ob2xkLCBhZnRlcl9ncm93dGgsIG0tPmVuZCgpKTsKKworICAvLyBOb3cgc2hyaW5rIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuICBEbyB0aGlzIHdpdGggYSBtaXggb2YgZXJhc2VzIGFuZAorICAvLyBpbnNlcnRzIHRvIGluY3JlYXNlIHRoZSBjaGFuY2UgdGhhdCB0aGUgaGFzaHRhYmxlIHdpbGwgcmVzaXplIHRvIGEgbG93ZXIKKyAgLy8gbnVtYmVyIG9mIGJ1Y2tldHMuICAoQnV0LCBpbiBhbnkgY2FzZSwgdGhlIHRlc3QgaXMgc3RpbGwgdXNlZnVsLikKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyICogKHRhcmdldF9zaXplIC0gaW5pdGlhbF9zaXplKTsgaSsrKSB7CisgICAgaWYgKGkgIT0gb2xkLT5maXJzdCkgeworICAgICAgbS0+ZXJhc2UoaSk7CisgICAgfQorICAgIGlmICgoKGkgXiBtLT5iZWdpbigpLT5maXJzdCkgJiAxNSkgPT0gMCkgeworICAgICAgKCptKVtpICogMzQyXSA9IGk7CisgICAgfQorICB9CisgIC8vIE5vdywgdGhlIHRhYmxlIGhhcyBncm93biBhbmQgc2hydW5rOyB0ZXN0IGFnYWluLgorICBUZXN0RXF1YWxJdGVyYXRvcnM8SXRlcmF0b3JUeXBlPihvbGQsIG0tPmZpbmQob2xkLT5maXJzdCksIG0tPmVuZCgpKTsKKyAgVGVzdEVxdWFsSXRlcmF0b3JzPEl0ZXJhdG9yVHlwZT4ob2xkLCBhZnRlcl9ncm93dGgsIG0tPmVuZCgpKTsKK30KKworLy8gQ3JlYXRlIGFuZCB0ZXN0IGFuIG4tZWxlbWVudCBNYXAsIHdpdGggZW1waGFzaXMgb24gaXRlcmF0b3IgY29ycmVjdG5lc3MuCitzdGF0aWMgdm9pZCBTdHJlc3NUZXN0SXRlcmF0b3JzKGludCBuKSB7CisgIEdPT0dMRV9MT0coSU5GTykgPDwgIlN0cmVzc1Rlc3RJdGVyYXRvcnMgIiA8PCBuOworICBHT09HTEVfQ0hFQ0tfR1QobiwgMCk7CisgIC8vIENyZWF0ZSBhIHJhbmRvbS1sb29raW5nIG1hcCBvZiBzaXplIG4uICBVc2Ugbm9uLW5lZ2F0aXZlIGludGVnZXIga2V5cy4KKyAgTWFwPGludCwgaW50PiBtOworICB1aW50MzJfdCBmcm9nID0gMTIzOTg3ICsgbjsKKyAgaW50IGxhc3Rfa2V5ID0gMDsKKyAgaW50IGNvdW50ZXIgPSAwOworICB3aGlsZSAobS5zaXplKCkgPCBuKSB7CisgICAgZnJvZyAqPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oazApOworICAgIGZyb2cgXj0gZnJvZyA+PiAxNzsKKyAgICBmcm9nICs9IGNvdW50ZXIrKzsKKyAgICBsYXN0X2tleSA9CisgICAgICAgIHN0YXRpY19jYXN0PGludD4oZnJvZykgPj0gMCA/IHN0YXRpY19jYXN0PGludD4oZnJvZykgOiBsYXN0X2tleSBeIDE7CisgICAgR09PR0xFX0RDSEVDS19HRShsYXN0X2tleSwgMCk7CisgICAgbVtsYXN0X2tleV0gPSBsYXN0X2tleSBeIDE7CisgIH0KKyAgLy8gVGVzdCBpdC4KKyAgQVNTRVJUX0VRKG4sIG0uc2l6ZSgpKTsKKyAgLy8gQ3JlYXRlIG1hcHMgb2YgcG9pbnRlcnMgYW5kIGl0ZXJhdG9ycy4KKyAgLy8gVGhlc2Ugc2hvdWxkIHJlbWFpbiB2YWxpZCBldmVuIGlmIHdlIG1vZGlmeSBtLgorICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBNYXA8aW50LCBpbnQ+Ojp2YWx1ZV90eXBlKj4gbXAobik7CisgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIE1hcDxpbnQsIGludD46Oml0ZXJhdG9yPiBtaShuKTsKKyAgZm9yIChNYXA8aW50LCBpbnQ+OjppdGVyYXRvciBpdCA9IG0uYmVnaW4oKTsgaXQgIT0gbS5lbmQoKTsgKytpdCkgeworICAgIG1wW2l0LT5maXJzdF0gPSAmKml0OworICAgIG1pW2l0LT5maXJzdF0gPSBpdDsKKyAgfQorICBBU1NFUlRfRVEobS5zaXplKCksIG1pLnNpemUoKSk7CisgIEFTU0VSVF9FUShtLnNpemUoKSwgbXAuc2l6ZSgpKTsKKyAgbS5lcmFzZShsYXN0X2tleSk7CisgIEFTU0VSVF9FUShuIC0gMSwgbS5zaXplKCkpOworICBUZXN0VmFsaWRpdHlGb3JBbGxLZXlzRXhjZXB0KGxhc3Rfa2V5LCBtcCwgbSk7CisgIFRlc3RWYWxpZGl0eUZvckFsbEtleXNFeGNlcHQobGFzdF9rZXksIG1pLCBtKTsKKworICBtW2xhc3Rfa2V5XSA9IDA7CisgIEFTU0VSVF9FUShuLCBtLnNpemUoKSk7CisgIC8vIFRlc3Qgb2xkIGl0ZXJhdG9yIHZzIG5ldyBpdGVyYXRvciwgd2l0aCB0YWJsZSBtb2RpZmljYXRpb24gaW4gYmV0d2Vlbi4KKyAgVGVzdE9sZFZlcnN1c05ld0l0ZXJhdG9yPE1hcDxpbnQsIGludD46OmNvbnN0X2l0ZXJhdG9yPihuICUgMywgJm0pOworICBUZXN0T2xkVmVyc3VzTmV3SXRlcmF0b3I8TWFwPGludCwgaW50Pjo6aXRlcmF0b3I+KG4gJSAoMSArIChuIC8gNDApKSwgJm0pOworICAvLyBGaW5hbGx5LCBlbnN1cmUgZXJhc2UoaXRlcmF0b3IpIGRvZXNuJ3QgcmVvcmRlciBhbnl0aGluZywgYmVjYXVzZSB0aGF0IGlzCisgIC8vIHdoYXQgaXRzIGRvY3VtZW50YXRpb24gc2F5cy4KKyAgbVtsYXN0X2tleV0gPSBtW2xhc3Rfa2V5IF4gOTk5XSA9IDA7CisgIHN0ZDo6dmVjdG9yPE1hcDxpbnQsIGludD46Oml0ZXJhdG9yPiB2OworICB2LnJlc2VydmUobS5zaXplKCkpOworICBpbnQgcG9zaXRpb25fb2ZfbGFzdF9rZXkgPSAwOworICBmb3IgKE1hcDxpbnQsIGludD46Oml0ZXJhdG9yIGl0ID0gbS5iZWdpbigpOyBpdCAhPSBtLmVuZCgpOyArK2l0KSB7CisgICAgaWYgKGl0LT5maXJzdCA9PSBsYXN0X2tleSkgeworICAgICAgcG9zaXRpb25fb2ZfbGFzdF9rZXkgPSB2LnNpemUoKTsKKyAgICB9CisgICAgdi5wdXNoX2JhY2soaXQpOworICB9CisgIEFTU0VSVF9FUShtLnNpemUoKSwgdi5zaXplKCkpOworICBjb25zdCBNYXA8aW50LCBpbnQ+OjppdGVyYXRvciBlcmFzZV9yZXN1bHQgPSBtLmVyYXNlKG0uZmluZChsYXN0X2tleSkpOworICBpbnQgaW5kZXggPSAwOworICBmb3IgKE1hcDxpbnQsIGludD46Oml0ZXJhdG9yIGl0ID0gbS5iZWdpbigpOyBpdCAhPSBtLmVuZCgpOyArK2l0LCArK2luZGV4KSB7CisgICAgaWYgKGluZGV4ID09IHBvc2l0aW9uX29mX2xhc3Rfa2V5KSB7CisgICAgICBFWFBFQ1RfRVEoJiplcmFzZV9yZXN1bHQsICYqdlsrK2luZGV4XSk7CisgICAgfQorICAgIEFTU0VSVF9FUSgmKml0LCAmKnZbaW5kZXhdKTsKKyAgfQorfQorCitURVNUX0YoTWFwSW1wbFRlc3QsIEl0ZXJhdG9ySW52YWxpZGF0aW9uKSB7CisgIC8vIENyZWF0ZSBhIHNldCBvZiBwc2V1ZG8tcmFuZG9tIHNpemVzIHRvIHRlc3QuCisjaWZuZGVmIE5ERUJVRworICBjb25zdCBpbnQga01heFNpemVUb1Rlc3QgPSAxMDAgKiAxMDAwOworI2Vsc2UKKyAgY29uc3QgaW50IGtNYXhTaXplVG9UZXN0ID0gMTAwMCAqIDEwMDA7CisjZW5kaWYKKyAgc3RkOjpzZXQ8aW50PiBzOworICBpbnQgbiA9IGtNYXhTaXplVG9UZXN0OworICB1bnNpZ25lZCBpbnQgZnJvZyA9IGsxICsgbjsKKyAgd2hpbGUgKG4gPiAxICYmIHMuc2l6ZSgpIDwgMjUpIHsKKyAgICBzLmluc2VydChuKTsKKyAgICBuID0gc3RhdGljX2Nhc3Q8aW50PihuICogMTAwIC8gKDEwMS4wICsgKGZyb2cgJiA2MykpKTsKKyAgICBmcm9nICo9IGsyOworICAgIGZyb2cgXj0gZnJvZyA+PiAxNzsKKyAgfQorICAvLyBFbnN1cmUgd2UgdGVzdCBhIGZldyBzbWFsbCBzaXplcy4KKyAgcy5pbnNlcnQoMSk7CisgIHMuaW5zZXJ0KDIpOworICBzLmluc2VydCgzKTsKKyAgLy8gTm93LCB0aGUgcmVhbCB3b3JrLgorICBmb3IgKHN0ZDo6c2V0PGludD46Oml0ZXJhdG9yIGkgPSBzLmJlZ2luKCk7IGkgIT0gcy5lbmQoKTsgKytpKSB7CisgICAgU3RyZXNzVGVzdEl0ZXJhdG9ycygqaSk7CisgIH0KK30KKworLy8gVGVzdCB0aGF0IGVyYXNlKCkgcmV2YWxpZGF0ZXMgaXRlcmF0b3JzLgorVEVTVF9GKE1hcEltcGxUZXN0LCBFcmFzZVJldmFsaWRhdGVzKSB7CisgIG1hcF9bM10gPSBtYXBfWzEzXSA9IG1hcF9bMjBdID0gMDsKKyAgY29uc3QgaW50IGluaXRpYWxfc2l6ZSA9IG1hcF8uc2l6ZSgpOworICBFWFBFQ1RfRVEoMywgaW5pdGlhbF9zaXplKTsKKyAgc3RkOjp2ZWN0b3I8TWFwPGludCwgaW50Pjo6aXRlcmF0b3I+IHY7CisgIGZvciAoTWFwPGludCwgaW50Pjo6aXRlcmF0b3IgaXQgPSBtYXBfLmJlZ2luKCk7IGl0ICE9IG1hcF8uZW5kKCk7ICsraXQpIHsKKyAgICB2LnB1c2hfYmFjayhpdCk7CisgIH0KKyAgRVhQRUNUX0VRKGluaXRpYWxfc2l6ZSwgdi5zaXplKCkpOworICBmb3IgKGludCBpID0gMDsgbWFwXy5zaXplKCkgPD0gaW5pdGlhbF9zaXplICogMjA7IGkrKykgeworICAgIG1hcF9baV0gPSAwOworICB9CisgIGNvbnN0IGludCBsYXJnZXJfc2l6ZSA9IG1hcF8uc2l6ZSgpOworICAvLyBXZSd2ZSBncmVhdGx5IGluY3JlYXNlZCB0aGUgc2l6ZSBvZiB0aGUgbWFwLCBzbyBpdCBpcyBoaWdobHkgbGlrZWx5IHRoYXQKKyAgLy8gdGhlIGZvbGxvd2luZyB3aWxsIGNvcnJ1cHQgbSBpZiBlcmFzZSgpIGRvZXNuJ3QgcHJvcGVybHkgcmV2YWxpZGF0ZQorICAvLyBpdGVyYXRvcnMgcGFzc2VkIHRvIGl0LiAgRmluaXNoaW5nIHRoaXMgcm91dGluZSB3aXRob3V0IGNyYXNoaW5nIGluZGljYXRlcworICAvLyBzdWNjZXNzLgorICBmb3IgKGludCBpID0gMDsgaSA8IHYuc2l6ZSgpOyBpKyspIHsKKyAgICBtYXBfLmVyYXNlKHZbaV0pOworICB9CisgIEVYUEVDVF9FUShsYXJnZXJfc2l6ZSAtIHYuc2l6ZSgpLCBtYXBfLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBJc0NvbnN0SGVscGVyKFQmIC8qdCovKSB7ICAvLyBOT0xJTlQuIFdlIHdhbnQgdG8gY2F0Y2ggbm9uLWNvbnN0IHJlZnMgaGVyZS4KKyAgcmV0dXJuIGZhbHNlOworfQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIElzQ29uc3RIZWxwZXIoY29uc3QgVCYgLyp0Ki8pIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgSXRlcmF0b3JDb25zdG5lc3MpIHsKKyAgbWFwX1swXSA9IDA7CisgIEVYUEVDVF9UUlVFKElzQ29uc3RIZWxwZXIoKm1hcF8uY2JlZ2luKCkpKTsKKyAgRVhQRUNUX1RSVUUoSXNDb25zdEhlbHBlcigqY29uc3RfbWFwXy5iZWdpbigpKSk7CisgIEVYUEVDVF9GQUxTRShJc0NvbnN0SGVscGVyKCptYXBfLmJlZ2luKCkpKTsKK30KKworYm9vbCBJc0ZvcndhcmRJdGVyYXRvckhlbHBlcihzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnIC8qdGFnKi8pIHsgcmV0dXJuIHRydWU7IH0KKworVEVTVF9GKE1hcEltcGxUZXN0LCBJdGVyYXRvckNhdGVnb3J5KSB7CisgIEVYUEVDVF9UUlVFKElzRm9yd2FyZEl0ZXJhdG9ySGVscGVyKAorICAgICAgc3RkOjppdGVyYXRvcl90cmFpdHM8TWFwPGludCwgaW50Pjo6aXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSgpKSk7CisgIEVYUEVDVF9UUlVFKElzRm9yd2FyZEl0ZXJhdG9ySGVscGVyKAorICAgICAgc3RkOjppdGVyYXRvcl90cmFpdHM8CisgICAgICAgICAgTWFwPGludCwgaW50Pjo6Y29uc3RfaXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSgpKSk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgSW5zZXJ0U2luZ2xlTFZhbHVlKSB7CisgIGludDMyX3Qga2V5ID0gMDsKKyAgaW50MzJfdCB2YWx1ZTEgPSAxMDA7CisgIGludDMyX3QgdmFsdWUyID0gMTAxOworCisgIC8vIEluc2VydCBhIG5vbi1leGlzdGluZyBrZXkuCisgIE1hcDxpbnQzMl90LCBpbnQzMl90Pjo6dmFsdWVfdHlwZSB2MShrZXksIHZhbHVlMSk7CisgIHN0ZDo6cGFpcjxNYXA8aW50MzJfdCwgaW50MzJfdD46Oml0ZXJhdG9yLCBib29sPiByZXN1bHQxID0gbWFwXy5pbnNlcnQodjEpOworICBFeHBlY3RTaW5nbGVFbGVtZW50KGtleSwgdmFsdWUxKTsKKworICBNYXA8aW50MzJfdCwgaW50MzJfdD46Oml0ZXJhdG9yIGl0MSA9IHJlc3VsdDEuZmlyc3Q7CisgIEVYUEVDVF9FUShrZXksIGl0MS0+Zmlyc3QpOworICBFWFBFQ1RfRVEodmFsdWUxLCBpdDEtPnNlY29uZCk7CisgIEVYUEVDVF9UUlVFKHJlc3VsdDEuc2Vjb25kKTsKKworICAvLyBJbnNlcnQgYW4gZXhpc3Rpbmcga2V5LgorICBNYXA8aW50MzJfdCwgaW50MzJfdD46OnZhbHVlX3R5cGUgdjIoa2V5LCB2YWx1ZTIpOworICBzdGQ6OnBhaXI8TWFwPGludDMyX3QsIGludDMyX3Q+OjppdGVyYXRvciwgYm9vbD4gcmVzdWx0MiA9IG1hcF8uaW5zZXJ0KHYyKTsKKyAgRXhwZWN0U2luZ2xlRWxlbWVudChrZXksIHZhbHVlMSk7CisKKyAgTWFwPGludDMyX3QsIGludDMyX3Q+OjppdGVyYXRvciBpdDIgPSByZXN1bHQyLmZpcnN0OworICBFWFBFQ1RfVFJVRShpdDEgPT0gaXQyKTsKKyAgRVhQRUNUX0ZBTFNFKHJlc3VsdDIuc2Vjb25kKTsKK30KKworVEVTVF9GKE1hcEltcGxUZXN0LCBJbnNlcnRTaW5nbGVSVmFsdWUpIHsKKyAgaW50MzJfdCBrZXkgPSAwOworICBpbnQzMl90IHZhbHVlMSA9IDEwMDsKKyAgaW50MzJfdCB2YWx1ZTIgPSAxMDE7CisKKyAgLy8gSW5zZXJ0IGEgbm9uLWV4aXN0aW5nIGtleS4KKyAgc3RkOjpwYWlyPE1hcDxpbnQzMl90LCBpbnQzMl90Pjo6aXRlcmF0b3IsIGJvb2w+IHJlc3VsdDEgPQorICAgICAgbWFwXy5pbnNlcnQoTWFwPGludDMyX3QsIGludDMyX3Q+Ojp2YWx1ZV90eXBlKGtleSwgdmFsdWUxKSk7CisgIEV4cGVjdFNpbmdsZUVsZW1lbnQoa2V5LCB2YWx1ZTEpOworCisgIE1hcDxpbnQzMl90LCBpbnQzMl90Pjo6aXRlcmF0b3IgaXQxID0gcmVzdWx0MS5maXJzdDsKKyAgRVhQRUNUX0VRKGtleSwgaXQxLT5maXJzdCk7CisgIEVYUEVDVF9FUSh2YWx1ZTEsIGl0MS0+c2Vjb25kKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0MS5zZWNvbmQpOworCisgIC8vIEluc2VydCBhbiBleGlzdGluZyBrZXkuCisgIHN0ZDo6cGFpcjxNYXA8aW50MzJfdCwgaW50MzJfdD46Oml0ZXJhdG9yLCBib29sPiByZXN1bHQyID0KKyAgICAgIG1hcF8uaW5zZXJ0KE1hcDxpbnQzMl90LCBpbnQzMl90Pjo6dmFsdWVfdHlwZShrZXksIHZhbHVlMikpOworICBFeHBlY3RTaW5nbGVFbGVtZW50KGtleSwgdmFsdWUxKTsKKworICBNYXA8aW50MzJfdCwgaW50MzJfdD46Oml0ZXJhdG9yIGl0MiA9IHJlc3VsdDIuZmlyc3Q7CisgIEVYUEVDVF9UUlVFKGl0MSA9PSBpdDIpOworICBFWFBFQ1RfRkFMU0UocmVzdWx0Mi5zZWNvbmQpOworfQorCitURVNUX0YoTWFwSW1wbFRlc3QsIFRyeUVtcGxhY2UpIHsKKyAgdXNpbmcgOjp0ZXN0aW5nOjpQYWlyOworICB1c2luZyA6OnRlc3Rpbmc6OlVub3JkZXJlZEVsZW1lbnRzQXJlOworCisgIE1hcDxpbnQzMl90LCBzdGQ6OnN0cmluZz4gbTsKKworICBtLnRyeV9lbXBsYWNlKDEsICJvbmUiKTsKKyAgRVhQRUNUX0VRKG0uc2l6ZSgpLCAxKTsKKworICBjb25zdCBpbnQzMl90IGtleSA9IDQyOworICBtLnRyeV9lbXBsYWNlKGtleSwgMywgJ2EnKTsKKyAgbS50cnlfZW1wbGFjZSgyLCBzdGQ6OnN0cmluZygidHdvIikpOworICBFWFBFQ1RfVEhBVCgKKyAgICAgIG0sIFVub3JkZXJlZEVsZW1lbnRzQXJlKFBhaXIoMSwgIm9uZSIpLCBQYWlyKDIsICJ0d28iKSwgUGFpcig0MiwgImFhYSIpKSk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgRW1wbGFjZSkgeworICB1c2luZyA6OnRlc3Rpbmc6OlBhaXI7CisgIHVzaW5nIDo6dGVzdGluZzo6VW5vcmRlcmVkRWxlbWVudHNBcmU7CisKKyAgTWFwPGludDMyX3QsIHN0ZDo6c3RyaW5nPiBtOworCisgIG0uZW1wbGFjZSgxLCAib25lIik7CisgIEVYUEVDVF9FUShtLnNpemUoKSwgMSk7CisKKyAgY29uc3QgaW50MzJfdCBrZXkgPSA0MjsKKyAgbS5lbXBsYWNlKGtleSwgImFhYSIpOworICBtLmVtcGxhY2UoMiwgc3RkOjpzdHJpbmcoInR3byIpKTsKKyAgRVhQRUNUX1RIQVQoCisgICAgICBtLCBVbm9yZGVyZWRFbGVtZW50c0FyZShQYWlyKDEsICJvbmUiKSwgUGFpcigyLCAidHdvIiksIFBhaXIoNDIsICJhYWEiKSkpOworfQorCitzdHJ1Y3QgQ291bnRlZEluc3RhbmNlIHsKKyAgQ291bnRlZEluc3RhbmNlKCkgeyArK251bV9jcmVhdGVkOyB9CisgIENvdW50ZWRJbnN0YW5jZShjb25zdCBDb3VudGVkSW5zdGFuY2UmKSA6IENvdW50ZWRJbnN0YW5jZSgpIHt9CisgIENvdW50ZWRJbnN0YW5jZShDb3VudGVkSW5zdGFuY2UmJikgOiBDb3VudGVkSW5zdGFuY2UoKSB7fQorCisgIENvdW50ZWRJbnN0YW5jZSYgb3BlcmF0b3I9KGNvbnN0IENvdW50ZWRJbnN0YW5jZSYpIHsKKyAgICArK251bV9hc3NpZ25lZDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBleHBsaWNpdCBDb3VudGVkSW5zdGFuY2UoaW50IHgpIDogQ291bnRlZEluc3RhbmNlKCkge30KKworICBzdGF0aWMgaW50IG51bV9jcmVhdGVkOworICBzdGF0aWMgaW50IG51bV9hc3NpZ25lZDsKK307CisKK2ludCBDb3VudGVkSW5zdGFuY2U6Om51bV9jcmVhdGVkID0gMDsKK2ludCBDb3VudGVkSW5zdGFuY2U6Om51bV9hc3NpZ25lZCA9IDA7CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgVHJ5RW1wbGFjZUV4aXN0aW5nKSB7CisgIE1hcDxpbnQzMl90LCBDb3VudGVkSW5zdGFuY2U+IG07CisKKyAgbS50cnlfZW1wbGFjZSgxLCAxKTsKKyAgQVNTRVJUX0VRKG0uc2l6ZSgpLCAxKTsKKworICBDb3VudGVkSW5zdGFuY2U6Om51bV9jcmVhdGVkID0gMDsKKyAgQ291bnRlZEluc3RhbmNlOjpudW1fYXNzaWduZWQgPSAwOworICBtLnRyeV9lbXBsYWNlKDEsIDEyMyk7CisgIEVYUEVDVF9FUShtLnNpemUoKSwgMSk7CisgIEVYUEVDVF9FUShDb3VudGVkSW5zdGFuY2U6Om51bV9jcmVhdGVkLCAwKTsKKyAgRVhQRUNUX0VRKENvdW50ZWRJbnN0YW5jZTo6bnVtX2Fzc2lnbmVkLCAwKTsKK30KKworc3RydWN0IEFyZW5hQ29uc3RydWN0aWJsZSB7CisgIHVzaW5nIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXyA9IHZvaWQ7CisgIHVzaW5nIERlc3RydWN0b3JTa2lwcGFibGVfID0gdm9pZDsKKworICBBcmVuYUNvbnN0cnVjdGlibGUoKSA9IGRlZmF1bHQ7CisgIEFyZW5hQ29uc3RydWN0aWJsZShjb25zdCBBcmVuYUNvbnN0cnVjdGlibGUmKSA9IGRlZmF1bHQ7CisgIEFyZW5hQ29uc3RydWN0aWJsZShBcmVuYSopIDogQXJlbmFDb25zdHJ1Y3RpYmxlKCkge30KKworICBBcmVuYUNvbnN0cnVjdGlibGUmIG9wZXJhdG9yPShjb25zdCBBcmVuYUNvbnN0cnVjdGlibGUmKSA9IGRlZmF1bHQ7CisKKyAgZXhwbGljaXQgQXJlbmFDb25zdHJ1Y3RpYmxlKGludCkgOiBBcmVuYUNvbnN0cnVjdGlibGUoKSB7fQorCisgIEFyZW5hKiBhcmVuYSgpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KKworICBDb3VudGVkSW5zdGFuY2UgdW51c2VkOworfTsKKworVEVTVF9GKE1hcEltcGxUZXN0LCBUcnlFbXBsYWNlQXJlbmFDb25zdHJ1Y3RpYmxlKSB7CisgIEFTU0VSVF9UUlVFKEFyZW5hOjppc19hcmVuYV9jb25zdHJ1Y3RhYmxlPEFyZW5hQ29uc3RydWN0aWJsZT46OnZhbHVlKTsKKworICBBcmVuYUNvbnN0cnVjdGlibGUgdjEsIHYyOworCisgIE1hcDxpbnQzMl90LCBBcmVuYUNvbnN0cnVjdGlibGU+IG07CisKKyAgLy8gImRlZmF1bHQiIGNvbnN0cnVjdGlvbgorICBDb3VudGVkSW5zdGFuY2U6Om51bV9jcmVhdGVkID0gMDsKKyAgQ291bnRlZEluc3RhbmNlOjpudW1fYXNzaWduZWQgPSAwOworICBtLnRyeV9lbXBsYWNlKDEpOworICBFWFBFQ1RfRVEobS5zaXplKCksIDEpOworICBFWFBFQ1RfRVEoQ291bnRlZEluc3RhbmNlOjpudW1fY3JlYXRlZCwgMSk7CisgIEVYUEVDVF9FUShDb3VudGVkSW5zdGFuY2U6Om51bV9hc3NpZ25lZCwgMCk7CisKKyAgLy8gImRlZmF1bHQiIGNvbnN0cnVjdGlvbiArIGNvcHkgYXNzaWdubWVudAorICBDb3VudGVkSW5zdGFuY2U6Om51bV9jcmVhdGVkID0gMDsKKyAgQ291bnRlZEluc3RhbmNlOjpudW1fYXNzaWduZWQgPSAwOworICBtLnRyeV9lbXBsYWNlKDIsIHYxKTsKKyAgRVhQRUNUX0VRKG0uc2l6ZSgpLCAyKTsKKyAgRVhQRUNUX0VRKENvdW50ZWRJbnN0YW5jZTo6bnVtX2NyZWF0ZWQsIDEpOworICBFWFBFQ1RfRVEoQ291bnRlZEluc3RhbmNlOjpudW1fYXNzaWduZWQsIDEpOworCisgIC8vICJkZWZhdWx0IiBjb25zdHJ1Y3Rpb24gKyBtb3ZlIGFzc2lnbm1lbnQKKyAgQ291bnRlZEluc3RhbmNlOjpudW1fY3JlYXRlZCA9IDA7CisgIENvdW50ZWRJbnN0YW5jZTo6bnVtX2Fzc2lnbmVkID0gMDsKKyAgbS50cnlfZW1wbGFjZSgzLCBzdGQ6Om1vdmUodjIpKTsKKyAgRVhQRUNUX0VRKG0uc2l6ZSgpLCAzKTsKKyAgRVhQRUNUX0VRKENvdW50ZWRJbnN0YW5jZTo6bnVtX2NyZWF0ZWQsIDEpOworICBFWFBFQ1RfRVEoQ291bnRlZEluc3RhbmNlOjpudW1fYXNzaWduZWQsIDEpOworCisgIC8vICJkZWZhdWx0IiBjb25zdHJ1Y3Rpb24gKyBpbi1wbGFjZSB0ZW1wb3JhcnkgKyBtb3ZlIGFzc2lnbm1lbnQKKyAgQ291bnRlZEluc3RhbmNlOjpudW1fY3JlYXRlZCA9IDA7CisgIENvdW50ZWRJbnN0YW5jZTo6bnVtX2Fzc2lnbmVkID0gMDsKKyAgbS50cnlfZW1wbGFjZSg0LCAyMzkpOworICBFWFBFQ1RfRVEobS5zaXplKCksIDQpOworICBFWFBFQ1RfRVEoQ291bnRlZEluc3RhbmNlOjpudW1fY3JlYXRlZCwgMik7CisgIEVYUEVDVF9FUShDb3VudGVkSW5zdGFuY2U6Om51bV9hc3NpZ25lZCwgMSk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgVHJ5RW1wbGFjZUV4aXN0aW5nQXJlbmFDb25zdHJ1Y3RpYmxlKSB7CisgIEFTU0VSVF9UUlVFKEFyZW5hOjppc19hcmVuYV9jb25zdHJ1Y3RhYmxlPEFyZW5hQ29uc3RydWN0aWJsZT46OnZhbHVlKTsKKworICBNYXA8aW50MzJfdCwgQXJlbmFDb25zdHJ1Y3RpYmxlPiBtOworCisgIG0udHJ5X2VtcGxhY2UoMSwgMSk7CisgIEFTU0VSVF9FUShtLnNpemUoKSwgMSk7CisKKyAgQ291bnRlZEluc3RhbmNlOjpudW1fY3JlYXRlZCA9IDA7CisgIENvdW50ZWRJbnN0YW5jZTo6bnVtX2Fzc2lnbmVkID0gMDsKKyAgbS50cnlfZW1wbGFjZSgxLCAxMjMpOworICBFWFBFQ1RfRVEobS5zaXplKCksIDEpOworICBFWFBFQ1RfRVEoQ291bnRlZEluc3RhbmNlOjpudW1fY3JlYXRlZCwgMCk7CisgIEVYUEVDVF9FUShDb3VudGVkSW5zdGFuY2U6Om51bV9hc3NpZ25lZCwgMCk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgRW1wbGFjZVNpbmdsZSkgeworICBpbnQzMl90IGtleSA9IDA7CisgIGludDMyX3QgdmFsdWUxID0gMTAwOworICBpbnQzMl90IHZhbHVlMiA9IDEwMTsKKworICAvLyBFbXBsYWNlIGEgbm9uLWV4aXN0aW5nIGtleS4KKyAgYXV0byByZXN1bHQxID0gbWFwXy5lbXBsYWNlKGtleSwgdmFsdWUxKTsKKyAgRXhwZWN0U2luZ2xlRWxlbWVudChrZXksIHZhbHVlMSk7CisKKyAgTWFwPGludDMyX3QsIGludDMyX3Q+OjppdGVyYXRvciBpdDEgPSByZXN1bHQxLmZpcnN0OworICBFWFBFQ1RfRVEoa2V5LCBpdDEtPmZpcnN0KTsKKyAgRVhQRUNUX0VRKHZhbHVlMSwgaXQxLT5zZWNvbmQpOworICBFWFBFQ1RfVFJVRShyZXN1bHQxLnNlY29uZCk7CisKKyAgLy8gRW1wbGFjZSBhbiBleGlzdGluZyBrZXkuCisgIGF1dG8gcmVzdWx0MiA9IG1hcF8uZW1wbGFjZShrZXksIHZhbHVlMik7CisgIEV4cGVjdFNpbmdsZUVsZW1lbnQoa2V5LCB2YWx1ZTEpOworCisgIE1hcDxpbnQzMl90LCBpbnQzMl90Pjo6aXRlcmF0b3IgaXQyID0gcmVzdWx0Mi5maXJzdDsKKyAgRVhQRUNUX1RSVUUoaXQxID09IGl0Mik7CisgIEVYUEVDVF9GQUxTRShyZXN1bHQyLnNlY29uZCk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgSW5zZXJ0QnlJdGVyYXRvcikgeworICBpbnQzMl90IGtleTEgPSAwOworICBpbnQzMl90IGtleTIgPSAxOworICBpbnQzMl90IHZhbHVlMWEgPSAxMDA7CisgIGludDMyX3QgdmFsdWUxYiA9IDEwMTsKKyAgaW50MzJfdCB2YWx1ZTJhID0gMjAwOworICBpbnQzMl90IHZhbHVlMmIgPSAyMDE7CisKKyAgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gbWFwMTsKKyAgbWFwMVtrZXkxXSA9IHZhbHVlMWE7CisgIG1hcDFba2V5Ml0gPSB2YWx1ZTJhOworCisgIG1hcF8uaW5zZXJ0KG1hcDEuYmVnaW4oKSwgbWFwMS5lbmQoKSk7CisgIEV4cGVjdEVsZW1lbnRzKG1hcDEpOworCisgIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+IG1hcDI7CisgIG1hcDJba2V5MV0gPSB2YWx1ZTFiOworICBtYXAyW2tleTJdID0gdmFsdWUyYjsKKworICBtYXBfLmluc2VydChtYXAyLmJlZ2luKCksIG1hcDIuZW5kKCkpOworICBFeHBlY3RFbGVtZW50cyhtYXAxKTsKK30KKworVEVTVF9GKE1hcEltcGxUZXN0LCBJbnNlcnRCeUluaXRpYWxpemVyTGlzdCkgeworICBtYXBfLmluc2VydCh7ezEsIDEwMH0sIHsyLCAyMDB9fSk7CisgIEV4cGVjdEVsZW1lbnRzKHt7MSwgMTAwfSwgezIsIDIwMH19KTsKKworICBtYXBfLmluc2VydCh7ezIsIDIwMX0sIHszLCAzMDF9fSk7CisgIEV4cGVjdEVsZW1lbnRzKHt7MSwgMTAwfSwgezIsIDIwMH0sIHszLCAzMDF9fSk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgRXJhc2VTaW5nbGVCeUtleSkgeworICBpbnQzMl90IGtleSA9IDA7CisgIGludDMyX3QgdmFsdWUgPSAxMDA7CisKKyAgbWFwX1trZXldID0gdmFsdWU7CisgIEV4cGVjdFNpbmdsZUVsZW1lbnQoa2V5LCB2YWx1ZSk7CisKKyAgLy8gRXJhc2UgYW4gZXhpc3Rpbmcga2V5LgorICBFWFBFQ1RfRVEoMSwgbWFwXy5lcmFzZShrZXkpKTsKKyAgRVhQRUNUX1RSVUUobWFwXy5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1hcF8uc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUobWFwXy5lbmQoKSA9PSBtYXBfLmZpbmQoa2V5KSk7CisgIEVYUEVDVF9UUlVFKG1hcF8uYmVnaW4oKSA9PSBtYXBfLmVuZCgpKTsKKworICAvLyBFcmFzZSBhIG5vbi1leGlzdGluZyBrZXkuCisgIEVYUEVDVF9FUSgwLCBtYXBfLmVyYXNlKGtleSkpOworfQorCitURVNUX0YoTWFwSW1wbFRlc3QsIEVyYXNlTXV0aXBsZUJ5S2V5KSB7CisgIC8vIGVyYXNlIGluIG9uZSBzcGVjaWZpYyBvcmRlciB0byB0cmlnZ2VyIGNvcm5lciBjYXNlcworICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgIG1hcF9baV0gPSBpOworICB9CisKKyAgbWFwXy5lcmFzZSgwKTsKKyAgRVhQRUNUX0VRKDQsIG1hcF8uc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUobWFwXy5lbmQoKSA9PSBtYXBfLmZpbmQoMCkpOworCisgIG1hcF8uZXJhc2UoMSk7CisgIEVYUEVDVF9FUSgzLCBtYXBfLnNpemUoKSk7CisgIEVYUEVDVF9UUlVFKG1hcF8uZW5kKCkgPT0gbWFwXy5maW5kKDEpKTsKKworICBtYXBfLmVyYXNlKDMpOworICBFWFBFQ1RfRVEoMiwgbWFwXy5zaXplKCkpOworICBFWFBFQ1RfVFJVRShtYXBfLmVuZCgpID09IG1hcF8uZmluZCgzKSk7CisKKyAgbWFwXy5lcmFzZSg0KTsKKyAgRVhQRUNUX0VRKDEsIG1hcF8uc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUobWFwXy5lbmQoKSA9PSBtYXBfLmZpbmQoNCkpOworCisgIG1hcF8uZXJhc2UoMik7CisgIEVYUEVDVF9FUSgwLCBtYXBfLnNpemUoKSk7CisgIEVYUEVDVF9UUlVFKG1hcF8uZW5kKCkgPT0gbWFwXy5maW5kKDIpKTsKK30KKworVEVTVF9GKE1hcEltcGxUZXN0LCBFcmFzZVNpbmdsZUJ5SXRlcmF0b3IpIHsKKyAgaW50MzJfdCBrZXkgPSAwOworICBpbnQzMl90IHZhbHVlID0gMTAwOworCisgIG1hcF9ba2V5XSA9IHZhbHVlOworICBFeHBlY3RTaW5nbGVFbGVtZW50KGtleSwgdmFsdWUpOworCisgIE1hcDxpbnQzMl90LCBpbnQzMl90Pjo6aXRlcmF0b3IgaXQgPSBtYXBfLmZpbmQoa2V5KTsKKyAgbWFwXy5lcmFzZShpdCk7CisgIEVYUEVDVF9UUlVFKG1hcF8uZW1wdHkoKSk7CisgIEVYUEVDVF9FUSgwLCBtYXBfLnNpemUoKSk7CisgIEVYUEVDVF9UUlVFKG1hcF8uZW5kKCkgPT0gbWFwXy5maW5kKGtleSkpOworICBFWFBFQ1RfVFJVRShtYXBfLmJlZ2luKCkgPT0gbWFwXy5lbmQoKSk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgVmFsaWRJdGVyYXRvckFmdGVyRXJhc2UpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgbWFwX1tpXSA9IGk7CisgIH0KKworICBpbnQgY291bnQgPSAwOworCisgIGZvciAoTWFwPGludDMyX3QsIGludDMyX3Q+OjppdGVyYXRvciBpdCA9IG1hcF8uYmVnaW4oKTsgaXQgIT0gbWFwXy5lbmQoKTspIHsKKyAgICBjb3VudCsrOworICAgIGlmIChpdC0+Zmlyc3QgJSAyID09IDEpIHsKKyAgICAgIG1hcF8uZXJhc2UoaXQrKyk7CisgICAgfSBlbHNlIHsKKyAgICAgICsraXQ7CisgICAgfQorICB9CisKKyAgRVhQRUNUX0VRKDEwLCBjb3VudCk7CisgIEVYUEVDVF9FUSg1LCBtYXBfLnNpemUoKSk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgRXJhc2VCeUl0ZXJhdG9yKSB7CisgIGludDMyX3Qga2V5MSA9IDA7CisgIGludDMyX3Qga2V5MiA9IDE7CisgIGludDMyX3QgdmFsdWUxID0gMTAwOworICBpbnQzMl90IHZhbHVlMiA9IDEwMTsKKworICBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiBtYXA7CisgIG1hcFtrZXkxXSA9IHZhbHVlMTsKKyAgbWFwW2tleTJdID0gdmFsdWUyOworCisgIG1hcF8uaW5zZXJ0KG1hcC5iZWdpbigpLCBtYXAuZW5kKCkpOworICBFeHBlY3RFbGVtZW50cyhtYXApOworCisgIG1hcF8uZXJhc2UobWFwXy5iZWdpbigpLCBtYXBfLmVuZCgpKTsKKyAgRVhQRUNUX1RSVUUobWFwXy5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1hcF8uc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUobWFwXy5lbmQoKSA9PSBtYXBfLmZpbmQoa2V5MSkpOworICBFWFBFQ1RfVFJVRShtYXBfLmVuZCgpID09IG1hcF8uZmluZChrZXkyKSk7CisgIEVYUEVDVF9UUlVFKG1hcF8uYmVnaW4oKSA9PSBtYXBfLmVuZCgpKTsKK30KKworVEVTVF9GKE1hcEltcGxUZXN0LCBDbGVhcikgeworICBpbnQzMl90IGtleSA9IDA7CisgIGludDMyX3QgdmFsdWUgPSAxMDA7CisKKyAgbWFwX1trZXldID0gdmFsdWU7CisgIEV4cGVjdFNpbmdsZUVsZW1lbnQoa2V5LCB2YWx1ZSk7CisKKyAgbWFwXy5jbGVhcigpOworCisgIEVYUEVDVF9UUlVFKG1hcF8uZW1wdHkoKSk7CisgIEVYUEVDVF9FUSgwLCBtYXBfLnNpemUoKSk7CisgIEVYUEVDVF9UUlVFKG1hcF8uZW5kKCkgPT0gbWFwXy5maW5kKGtleSkpOworICBFWFBFQ1RfVFJVRShtYXBfLmJlZ2luKCkgPT0gbWFwXy5lbmQoKSk7Cit9CisKK3N0YXRpYyB2b2lkIENvcHlDb25zdHJ1Y3RvckhlbHBlcihBcmVuYSogYXJlbmEsIE1hcDxpbnQzMl90LCBpbnQzMl90PiogbSkgeworICBpbnQzMl90IGtleTEgPSAwOworICBpbnQzMl90IGtleTIgPSAxOworICBpbnQzMl90IHZhbHVlMSA9IDEwMDsKKyAgaW50MzJfdCB2YWx1ZTIgPSAxMDE7CisKKyAgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gbWFwOworICBtYXBba2V5MV0gPSB2YWx1ZTE7CisgIG1hcFtrZXkyXSA9IHZhbHVlMjsKKworICBtLT5pbnNlcnQobWFwLmJlZ2luKCksIG1hcC5lbmQoKSk7CisKKyAgTWFwPGludDMyX3QsIGludDMyX3Q+IG90aGVyKCptKTsKKworICBFWFBFQ1RfRVEoMiwgb3RoZXIuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKHZhbHVlMSwgb3RoZXIuYXQoa2V5MSkpOworICBFWFBFQ1RfRVEodmFsdWUyLCBvdGhlci5hdChrZXkyKSk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgQ29weUNvbnN0cnVjdG9yV2l0aEFyZW5hKSB7CisgIEFyZW5hIGE7CisgIENvcHlDb25zdHJ1Y3RvckhlbHBlcigmYSwgJm1hcF8pOworfQorCitURVNUX0YoTWFwSW1wbFRlc3QsIENvcHlDb25zdHJ1Y3RvcldpdGhvdXRBcmVuYSkgeworICBDb3B5Q29uc3RydWN0b3JIZWxwZXIobnVsbHB0ciwgJm1hcF8pOworfQorCitURVNUX0YoTWFwSW1wbFRlc3QsIEl0ZXJDb25zdHJ1Y3RvcikgeworICBpbnQzMl90IGtleTEgPSAwOworICBpbnQzMl90IGtleTIgPSAxOworICBpbnQzMl90IHZhbHVlMSA9IDEwMDsKKyAgaW50MzJfdCB2YWx1ZTIgPSAxMDE7CisKKyAgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gbWFwOworICBtYXBba2V5MV0gPSB2YWx1ZTE7CisgIG1hcFtrZXkyXSA9IHZhbHVlMjsKKworICBNYXA8aW50MzJfdCwgaW50MzJfdD4gbmV3X21hcChtYXAuYmVnaW4oKSwgbWFwLmVuZCgpKTsKKworICBFWFBFQ1RfRVEoMiwgbmV3X21hcC5zaXplKCkpOworICBFWFBFQ1RfRVEodmFsdWUxLCBuZXdfbWFwLmF0KGtleTEpKTsKKyAgRVhQRUNUX0VRKHZhbHVlMiwgbmV3X21hcC5hdChrZXkyKSk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgQXNzaWduZXIpIHsKKyAgaW50MzJfdCBrZXkxID0gMDsKKyAgaW50MzJfdCBrZXkyID0gMTsKKyAgaW50MzJfdCB2YWx1ZTEgPSAxMDA7CisgIGludDMyX3QgdmFsdWUyID0gMTAxOworCisgIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+IG1hcDsKKyAgbWFwW2tleTFdID0gdmFsdWUxOworICBtYXBba2V5Ml0gPSB2YWx1ZTI7CisKKyAgbWFwXy5pbnNlcnQobWFwLmJlZ2luKCksIG1hcC5lbmQoKSk7CisKKyAgTWFwPGludDMyX3QsIGludDMyX3Q+IG90aGVyOworICBpbnQzMl90IGtleV9vdGhlciA9IDEyMzsKKyAgaW50MzJfdCB2YWx1ZV9vdGhlciA9IDMyMTsKKyAgb3RoZXJba2V5X290aGVyXSA9IHZhbHVlX290aGVyOworICBFWFBFQ1RfRVEoMSwgb3RoZXIuc2l6ZSgpKTsKKworICBvdGhlciA9IG1hcF87CisKKyAgRVhQRUNUX0VRKDIsIG90aGVyLnNpemUoKSk7CisgIEVYUEVDVF9FUSh2YWx1ZTEsIG90aGVyLmF0KGtleTEpKTsKKyAgRVhQRUNUX0VRKHZhbHVlMiwgb3RoZXIuYXQoa2V5MikpOworICBFWFBFQ1RfVFJVRShvdGhlci5maW5kKGtleV9vdGhlcikgPT0gb3RoZXIuZW5kKCkpOworCisgIC8vIFNlbGYgYXNzaWduCisgIG90aGVyID0gKiZvdGhlcjsgIC8vIEF2b2lkIC1Xc2VsZi1hc3NpZ24uCisgIEVYUEVDVF9FUSgyLCBvdGhlci5zaXplKCkpOworICBFWFBFQ1RfRVEodmFsdWUxLCBvdGhlci5hdChrZXkxKSk7CisgIEVYUEVDVF9FUSh2YWx1ZTIsIG90aGVyLmF0KGtleTIpKTsKK30KKworVEVTVF9GKE1hcEltcGxUZXN0LCBSZWhhc2gpIHsKKyAgY29uc3QgaW50IHRlc3Rfc2l6ZSA9IDUwOworICBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiByZWZlcmVuY2VfbWFwOworICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3Rfc2l6ZTsgaSsrKSB7CisgICAgcmVmZXJlbmNlX21hcFtpXSA9IGk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0X3NpemU7IGkrKykgeworICAgIG1hcF9baV0gPSByZWZlcmVuY2VfbWFwW2ldOworICAgIEVYUEVDVF9FUShyZWZlcmVuY2VfbWFwW2ldLCBtYXBfW2ldKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3Rfc2l6ZTsgaSsrKSB7CisgICAgbWFwXy5lcmFzZShpKTsKKyAgICBFWFBFQ1RfVFJVRShtYXBfLmVuZCgpID09IG1hcF8uZmluZChpKSk7CisgIH0KKyAgRVhQRUNUX1RSVUUobWFwXy5lbXB0eSgpKTsKK30KKworVEVTVF9GKE1hcEltcGxUZXN0LCBFcXVhbFJhbmdlKSB7CisgIGludCBrZXkgPSAxMDAsIGtleV9taXNzaW5nID0gMTAxOworICBtYXBfW2tleV0gPSAxMDA7CisKKyAgc3RkOjpwYWlyPE1hcDxpbnQzMl90LCBpbnQzMl90Pjo6aXRlcmF0b3IsIE1hcDxpbnQzMl90LCBpbnQzMl90Pjo6aXRlcmF0b3I+CisgICAgICByYW5nZSA9IG1hcF8uZXF1YWxfcmFuZ2Uoa2V5KTsKKyAgRVhQRUNUX1RSVUUobWFwXy5maW5kKGtleSkgPT0gcmFuZ2UuZmlyc3QpOworICBFWFBFQ1RfVFJVRSgrK21hcF8uZmluZChrZXkpID09IHJhbmdlLnNlY29uZCk7CisKKyAgcmFuZ2UgPSBtYXBfLmVxdWFsX3JhbmdlKGtleV9taXNzaW5nKTsKKyAgRVhQRUNUX1RSVUUobWFwXy5lbmQoKSA9PSByYW5nZS5maXJzdCk7CisgIEVYUEVDVF9UUlVFKG1hcF8uZW5kKCkgPT0gcmFuZ2Uuc2Vjb25kKTsKKworICBzdGQ6OnBhaXI8TWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciwKKyAgICAgICAgICAgIE1hcDxpbnQzMl90LCBpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3I+CisgICAgICBjb25zdF9yYW5nZSA9IGNvbnN0X21hcF8uZXF1YWxfcmFuZ2Uoa2V5KTsKKyAgRVhQRUNUX1RSVUUoY29uc3RfbWFwXy5maW5kKGtleSkgPT0gY29uc3RfcmFuZ2UuZmlyc3QpOworICBFWFBFQ1RfVFJVRSgrK2NvbnN0X21hcF8uZmluZChrZXkpID09IGNvbnN0X3JhbmdlLnNlY29uZCk7CisKKyAgY29uc3RfcmFuZ2UgPSBjb25zdF9tYXBfLmVxdWFsX3JhbmdlKGtleV9taXNzaW5nKTsKKyAgRVhQRUNUX1RSVUUoY29uc3RfbWFwXy5lbmQoKSA9PSBjb25zdF9yYW5nZS5maXJzdCk7CisgIEVYUEVDVF9UUlVFKGNvbnN0X21hcF8uZW5kKCkgPT0gY29uc3RfcmFuZ2Uuc2Vjb25kKTsKK30KKworVEVTVF9GKE1hcEltcGxUZXN0LCBDb252ZXJ0VG9TdGRNYXApIHsKKyAgbWFwX1sxMDBdID0gMTAxOworICBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiBzdGRfbWFwKG1hcF8uYmVnaW4oKSwgbWFwXy5lbmQoKSk7CisgIEVYUEVDVF9FUSgxLCBzdGRfbWFwLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxMDEsIHN0ZF9tYXBbMTAwXSk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgQ29udmVydFRvU3RkVmVjdG9yT2ZQYWlycykgeworICBtYXBfWzEwMF0gPSAxMDE7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4gc3RkX3ZlYyhtYXBfLmJlZ2luKCksIG1hcF8uZW5kKCkpOworICBFWFBFQ1RfRVEoMSwgc3RkX3ZlYy5zaXplKCkpOworICBFWFBFQ1RfRVEoMTAwLCBzdGRfdmVjWzBdLmZpcnN0KTsKKyAgRVhQRUNUX0VRKDEwMSwgc3RkX3ZlY1swXS5zZWNvbmQpOworfQorCitURVNUX0YoTWFwSW1wbFRlc3QsIFN3YXBCYXNpYykgeworICBNYXA8aW50MzJfdCwgaW50MzJfdD4gYW5vdGhlcjsKKyAgbWFwX1s5Mzk4XSA9IDQxOTk5OworICBhbm90aGVyWzkzOThdID0gNDE5OTk7CisgIGFub3RoZXJbODA3MF0gPSA0MjA1NjsKKyAgYW5vdGhlci5zd2FwKG1hcF8pOworICBFWFBFQ1RfVEhBVChhbm90aGVyLAorICAgICAgICAgICAgICB0ZXN0aW5nOjpVbm9yZGVyZWRFbGVtZW50c0FyZSh0ZXN0aW5nOjpQYWlyKDkzOTgsIDQxOTk5KSkpOworICBFWFBFQ1RfVEhBVChtYXBfLCB0ZXN0aW5nOjpVbm9yZGVyZWRFbGVtZW50c0FyZSh0ZXN0aW5nOjpQYWlyKDgwNzAsIDQyMDU2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6UGFpcig5Mzk4LCA0MTk5OSkpKTsKK30KKworVEVTVF9GKE1hcEltcGxUZXN0LCBTd2FwQXJlbmEpIHsKKyAgQXJlbmEgYXJlbmExLCBhcmVuYTI7CisgIE1hcDxpbnQzMl90LCBpbnQzMl90PiBtMSgmYXJlbmExKTsKKyAgTWFwPGludDMyX3QsIGludDMyX3Q+IG0yKCZhcmVuYTIpOworICBtYXBfWzkzOThdID0gNDE5OTk7CisgIG0xWzkzOThdID0gNDE5OTk7CisgIG0xWzgwNzBdID0gNDIwNTY7CisgIG0yWzEwMjQ0XSA9IDEwMjQ3OworICBtMls4MDcwXSA9IDQyMDU2OworICBtMS5zd2FwKG1hcF8pOworICBFWFBFQ1RfVEhBVChtMSwgdGVzdGluZzo6VW5vcmRlcmVkRWxlbWVudHNBcmUodGVzdGluZzo6UGFpcig5Mzk4LCA0MTk5OSkpKTsKKyAgRVhQRUNUX1RIQVQobWFwXywgdGVzdGluZzo6VW5vcmRlcmVkRWxlbWVudHNBcmUodGVzdGluZzo6UGFpcig4MDcwLCA0MjA1NiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlBhaXIoOTM5OCwgNDE5OTkpKSk7CisgIG0yLnN3YXAobTEpOworICBFWFBFQ1RfVEhBVChtMSwgdGVzdGluZzo6VW5vcmRlcmVkRWxlbWVudHNBcmUodGVzdGluZzo6UGFpcig4MDcwLCA0MjA1NiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpQYWlyKDEwMjQ0LCAxMDI0NykpKTsKKyAgRVhQRUNUX1RIQVQobTIsIHRlc3Rpbmc6OlVub3JkZXJlZEVsZW1lbnRzQXJlKHRlc3Rpbmc6OlBhaXIoOTM5OCwgNDE5OTkpKSk7Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgU3dhcEZpZWxkQXJlbmFSZWZsZWN0aW9uKSB7CisgIE1hcFJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSk7CisgIEFyZW5hIGFyZW5hOworCisgIHsKKyAgICAvLyBUZXN0cyBmaWxsZWQgbGZzIGFuZCBlbXB0eSByaHMuCisgICAgVGVzdE1hcCByaHM7CisKKyAgICB7CisgICAgICAvLyBVc2UgbG9jYWxfYXJlbmEgdG8gYWxsb2NhdGUgbGhzIHRvIHRyaWdnZXIgdXNlLWFmdGVyLWZyZWUgZXJyb3IuCisgICAgICBBcmVuYSBsb2NhbF9hcmVuYTsKKyAgICAgIGF1dG8qIGxocyA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RNYXA+KCZsb2NhbF9hcmVuYSk7CisgICAgICBjb25zdCBhdXRvKiByZWZsZWN0aW9uID0gbGhzLT5HZXRSZWZsZWN0aW9uKCk7CisgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisKKyAgICAgIHJlZmxlY3Rpb25fdGVzdGVyLlNldE1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24obGhzKTsKKyAgICAgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMoKmxocywgJmZpZWxkcyk7CisKKyAgICAgIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMobGhzLCAmcmhzLCBmaWVsZHMpOworCisgICAgICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RDbGVhclZpYVJlZmxlY3Rpb24oKmxocyk7CisgICAgfQorCisgICAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWFwRmllbGRzU2V0VmlhUmVmbGVjdGlvbihyaHMpOworICB9Cit9CisKK1RFU1RfRihNYXBJbXBsVGVzdCwgQ29weUFzc2lnbk1hcEl0ZXJhdG9yKSB7CisgIFRlc3RNYXAgbWVzc2FnZTsKKyAgTWFwUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihVTklUVEVTVDo6VGVzdE1hcDo6ZGVzY3JpcHRvcigpKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0TWFwRmllbGRzVmlhTWFwUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIE1hcEl0ZXJhdG9yIGl0MSA9IHJlZmxlY3Rpb25fdGVzdGVyLk1hcEJlZ2luKCZtZXNzYWdlLCAibWFwX2ludDMyX2ludDMyIik7CisgIE1hcEl0ZXJhdG9yIGl0MiA9IHJlZmxlY3Rpb25fdGVzdGVyLk1hcEVuZCgmbWVzc2FnZSwgIm1hcF9pbnQzMl9pbnQzMiIpOworICBpdDIgPSBpdDE7CisgIEVYUEVDVF9FUShpdDEuR2V0S2V5KCkuR2V0SW50MzJWYWx1ZSgpLCBpdDIuR2V0S2V5KCkuR2V0SW50MzJWYWx1ZSgpKTsKK30KKworVEVTVF9GKE1hcEltcGxUZXN0LCBTcGFjZVVzZWQpIHsKKyAgY29uc3RleHByIHNpemVfdCBrTWluQ2FwID0gODsKKworICBNYXA8aW50MzJfdCwgaW50MzJfdD4gbTsKKyAgLy8gQW4gbmV3bHkgY29uc3RydWN0ZWQgbWFwIHNob3VsZCBoYXZlIG5vIHNwYWNlIHVzZWQuCisgIEVYUEVDVF9FUShtLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKCksIDApOworCisgIHNpemVfdCBjYXBhY2l0eSA9IGtNaW5DYXA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICBtW2ldOworICAgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtNYXhMb2FkRmFjdG9yID0gLjc1OworICAgIGlmIChtLnNpemUoKSA+PSBjYXBhY2l0eSAqIGtNYXhMb2FkRmFjdG9yKSB7CisgICAgICBjYXBhY2l0eSAqPSAyOworICAgIH0KKyAgICBFWFBFQ1RfRVEoCisgICAgICAgIG0uU3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKSwKKyAgICAgICAgc2l6ZW9mKHZvaWQqKSAqIGNhcGFjaXR5ICsKKyAgICAgICAgICAgIG0uc2l6ZSgpICogc2l6ZW9mKHN0ZDo6cGFpcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4sIHZvaWQqPikpOworICB9CisKKyAgLy8gVGVzdCBzdHJpbmcsIGFuZCBub24tc2NhbGFyIGtleXMuCisgIE1hcDxzdGQ6OnN0cmluZywgaW50MzJfdD4gbTI7CisgIHN0ZDo6c3RyaW5nIHN0ciA9ICJTb21lIGFyYml0cmFyaWx5IGxhcmdlIHN0cmluZyI7CisgIG0yW3N0cl0gPSAxOworICBFWFBFQ1RfRVEobTIuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKSwKKyAgICAgICAgICAgIHNpemVvZih2b2lkKikgKiBrTWluQ2FwICsKKyAgICAgICAgICAgICAgICBzaXplb2Yoc3RkOjpwYWlyPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50MzJfdD4sIHZvaWQqPikgKworICAgICAgICAgICAgICAgIGludGVybmFsOjpTdHJpbmdTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZyhzdHIpKTsKKworICAvLyBUZXN0IG1lc3NhZ2VzLCBhbmQgbm9uLXNjYWxhciB2YWx1ZXMuCisgIE1hcDxpbnQzMl90LCBUZXN0QWxsVHlwZXM+IG0zOworICBtM1swXS5zZXRfb3B0aW9uYWxfc3RyaW5nKHN0cik7CisgIEVYUEVDVF9FUShtMy5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZygpLAorICAgICAgICAgICAgc2l6ZW9mKHZvaWQqKSAqIGtNaW5DYXAgKworICAgICAgICAgICAgICAgIHNpemVvZihzdGQ6OnBhaXI8c3RkOjpwYWlyPGludDMyX3QsIFRlc3RBbGxUeXBlcz4sIHZvaWQqPikgKworICAgICAgICAgICAgICAgIG0zWzBdLlNwYWNlVXNlZExvbmcoKSAtIHNpemVvZihtM1swXSkpOworfQorCisvLyBBdHRlbXB0cyB0byB2ZXJpZnkgdGhhdCBhIG1hcCB3aXRoIGtleXMgYSBhbmQgYiBoYXMgYSByYW5kb20gb3JkZXJpbmcuIFRoaXMKKy8vIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBpdCBzdWNjZWVkcyBpbiBvYnNlcnZpbmcgYm90aCBwb3NzaWJsZSBvcmRlcmluZ3MuCitib29sIE1hcE9yZGVyaW5nSXNSYW5kb20oaW50IGEsIGludCBiKSB7CisgIGJvb2wgc2F3X2FfZmlyc3QgPSBmYWxzZTsKKyAgYm9vbCBzYXdfYl9maXJzdCA9IGZhbHNlOworICBzdGQ6OnZlY3RvcjxNYXA8aW50MzJfdCwgaW50MzJfdD4+IHYoNTApOworICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyArK2kpIHsKKyAgICBNYXA8aW50MzJfdCwgaW50MzJfdD4mIG0gPSB2W2ldOworICAgIG1bYV0gPSAwOworICAgIG1bYl0gPSAwOworICAgIGludDMyX3QgZmlyc3RfZWxlbWVudCA9IG0uYmVnaW4oKS0+Zmlyc3Q7CisgICAgaWYgKGZpcnN0X2VsZW1lbnQgPT0gYSkgc2F3X2FfZmlyc3QgPSB0cnVlOworICAgIGlmIChmaXJzdF9lbGVtZW50ID09IGIpIHNhd19iX2ZpcnN0ID0gdHJ1ZTsKKyAgICBpZiAoc2F3X2FfZmlyc3QgJiYgc2F3X2JfZmlyc3QpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHRoZSBpdGVyYXRpb24gb3JkZXIgaXMgcmVhc29uYWJseSByYW5kb20gZXZlbiBmb3IKKy8vIHNtYWxsIG1hcHMuCitURVNUX0YoTWFwSW1wbFRlc3QsIFJhbmRvbU9yZGVyaW5nKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IDEwOyArK2opIHsKKyAgICAgIEVYUEVDVF9UUlVFKE1hcE9yZGVyaW5nSXNSYW5kb20oaSwgaikpCisgICAgICAgICAgPDwgIk1hcCB3aXRoIGtleXMgIiA8PCBpIDw8ICIgYW5kICIgPDwgagorICAgICAgICAgIDw8ICIgaGFzIGRldGVybWluaXN0aWMgb3JkZXJpbmciOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5Pgordm9pZCBUZXN0VHJhbnNwYXJlbnQoY29uc3QgS2V5JiBrZXksIGNvbnN0IEtleSYgbWlzc19rZXkpIHsKKyAgTWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG07CisgIGNvbnN0IGF1dG8mIGNtID0gbTsKKworICBtLmluc2VydCh7IkFCQyIsIDF9KTsKKworICBjb25zdCBhdXRvIGFiY19pdCA9IG0uYmVnaW4oKTsKKworICBtLmluc2VydCh7IkRFRiIsIDJ9KTsKKworICB1c2luZyB0ZXN0aW5nOjpQYWlyOworICB1c2luZyB0ZXN0aW5nOjpVbm9yZGVyZWRFbGVtZW50c0FyZTsKKworICBFWFBFQ1RfRVEobS5hdChrZXkpLCAxKTsKKyAgRVhQRUNUX0VRKGNtLmF0KGtleSksIDEpOworCisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKyAgRVhQRUNUX0RFQVRIKG0uYXQobWlzc19rZXkpLCAiIik7CisgIEVYUEVDVF9ERUFUSChjbS5hdChtaXNzX2tleSksICIiKTsKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKworICBFWFBFQ1RfRVEobS5jb3VudChrZXkpLCAxKTsKKyAgRVhQRUNUX0VRKGNtLmNvdW50KGtleSksIDEpOworICBFWFBFQ1RfRVEobS5jb3VudChtaXNzX2tleSksIDApOworICBFWFBFQ1RfRVEoY20uY291bnQobWlzc19rZXkpLCAwKTsKKworICBFWFBFQ1RfRVEobS5maW5kKGtleSksIGFiY19pdCk7CisgIEVYUEVDVF9FUShjbS5maW5kKGtleSksIGFiY19pdCk7CisgIEVYUEVDVF9FUShtLmZpbmQobWlzc19rZXkpLCBtLmVuZCgpKTsKKyAgRVhQRUNUX0VRKGNtLmZpbmQobWlzc19rZXkpLCBjbS5lbmQoKSk7CisKKyAgRVhQRUNUX1RSVUUobS5jb250YWlucyhrZXkpKTsKKyAgRVhQRUNUX1RSVUUoY20uY29udGFpbnMoa2V5KSk7CisgIEVYUEVDVF9GQUxTRShtLmNvbnRhaW5zKG1pc3Nfa2V5KSk7CisgIEVYUEVDVF9GQUxTRShjbS5jb250YWlucyhtaXNzX2tleSkpOworCisgIEVYUEVDVF9USEFUKG0uZXF1YWxfcmFuZ2Uoa2V5KSwgUGFpcihhYmNfaXQsIHN0ZDo6bmV4dChhYmNfaXQpKSk7CisgIEVYUEVDVF9USEFUKGNtLmVxdWFsX3JhbmdlKGtleSksIFBhaXIoYWJjX2l0LCBzdGQ6Om5leHQoYWJjX2l0KSkpOworICBFWFBFQ1RfVEhBVChtLmVxdWFsX3JhbmdlKG1pc3Nfa2V5KSwgUGFpcihtLmVuZCgpLCBtLmVuZCgpKSk7CisgIEVYUEVDVF9USEFUKGNtLmVxdWFsX3JhbmdlKG1pc3Nfa2V5KSwgUGFpcihtLmVuZCgpLCBtLmVuZCgpKSk7CisKKyAgRVhQRUNUX1RIQVQobSwgVW5vcmRlcmVkRWxlbWVudHNBcmUoUGFpcigiQUJDIiwgMSksIFBhaXIoIkRFRiIsIDIpKSk7CisgIEVYUEVDVF9FUShtLmVyYXNlKGtleSksIDEpOworICBFWFBFQ1RfVEhBVChtLCBVbm9yZGVyZWRFbGVtZW50c0FyZShQYWlyKCJERUYiLCAyKSkpOworICBFWFBFQ1RfRVEobS5lcmFzZShrZXkpLCAwKTsKKyAgRVhQRUNUX0VRKG0uZXJhc2UobWlzc19rZXkpLCAwKTsKKyAgRVhQRUNUX1RIQVQobSwgVW5vcmRlcmVkRWxlbWVudHNBcmUoUGFpcigiREVGIiwgMikpKTsKKworICBtW2tleV07CisgIEVYUEVDVF9USEFUKG0sIFVub3JkZXJlZEVsZW1lbnRzQXJlKFBhaXIoIkFCQyIsIDApLCBQYWlyKCJERUYiLCAyKSkpOworICBtW2tleV0gPSAxOworICBFWFBFQ1RfVEhBVChtLCBVbm9yZGVyZWRFbGVtZW50c0FyZShQYWlyKCJBQkMiLCAxKSwgUGFpcigiREVGIiwgMikpKTsKK30KKworVEVTVF9GKE1hcEltcGxUZXN0LCBUcmFuc3BhcmVudExvb2t1cEZvclN0cmluZykgeworICBUZXN0VHJhbnNwYXJlbnQoIkFCQyIsICJMS0oiKTsKKyAgVGVzdFRyYW5zcGFyZW50KHN0ZDo6c3RyaW5nKCJBQkMiKSwgc3RkOjpzdHJpbmcoIkxLSiIpKTsKKyNpZiBkZWZpbmVkKF9fY3BwX2xpYl9zdHJpbmdfdmlldykKKyAgVGVzdFRyYW5zcGFyZW50KHN0ZDo6c3RyaW5nX3ZpZXcoIkFCQyIpLCBzdGQ6OnN0cmluZ192aWV3KCJMS0oiKSk7CisjZW5kaWYgIC8vIGRlZmluZWQoX19jcHBfbGliX3N0cmluZ192aWV3KQorCisgIC8vIHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXIKKyAgc3RkOjpzdHJpbmcgYWJjID0gIkFCQyIsIGxraiA9ICJMS0oiOworICBUZXN0VHJhbnNwYXJlbnQoc3RkOjpyZWYoYWJjKSwgc3RkOjpyZWYobGtqKSk7CisgIFRlc3RUcmFuc3BhcmVudChzdGQ6OmNyZWYoYWJjKSwgc3RkOjpjcmVmKGxraikpOworfQorCitURVNUX0YoTWFwSW1wbFRlc3QsIENvbnN0SW5pdCkgeworICBQUk9UT0JVRl9DT05TVElOSVQgc3RhdGljIE1hcDxpbnQsIGludD4gbWFwOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKG1hcC5lbXB0eSgpKTsKK30KKworLy8gTWFwIEZpZWxkIFJlZmxlY3Rpb24gVGVzdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgRnVuYyhpbnQgaSwgaW50IGopIHsgcmV0dXJuIGkgKiBqOyB9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBTdHJGdW5jKGludCBpLCBpbnQgaikgeyByZXR1cm4gU3RyQ2F0KEZ1bmMoaSwgaikpOyB9CisKK3N0YXRpYyBpbnQgSW50KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBpbnQgcmVzdWx0ID0gMDsKKyAgc3RkOjppc3RyaW5nc3RyZWFtKHZhbHVlKSA+PiByZXN1bHQ7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBUaGlzIGNsYXNzIGlzIGEgZnJpZW5kLCBzbyBubyBhbm9ueW1vdXMgbmFtZXNwYWNlLgorY2xhc3MgTWFwRmllbGRSZWZsZWN0aW9uVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOworCisgIGludCBNYXBTaXplKGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgICByZXR1cm4gcmVmbGVjdGlvbi0+TWFwU2l6ZShtZXNzYWdlLCBmaWVsZCk7CisgIH0KK307CisKK25hbWVzcGFjZSB7CisKK1RFU1RfRihNYXBGaWVsZFJlZmxlY3Rpb25UZXN0LCBSZWd1bGFyRmllbGRzKSB7CisgIFRlc3RNYXAgbWVzc2FnZTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbCA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisKKyAgTWFwPGludDMyX3QsIGludDMyX3Q+KiBtYXBfaW50MzJfaW50MzIgPSBtZXNzYWdlLm11dGFibGVfbWFwX2ludDMyX2ludDMyKCk7CisgIE1hcDxpbnQzMl90LCBkb3VibGU+KiBtYXBfaW50MzJfZG91YmxlID0gbWVzc2FnZS5tdXRhYmxlX21hcF9pbnQzMl9kb3VibGUoKTsKKyAgTWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIG1hcF9zdHJpbmdfc3RyaW5nID0KKyAgICAgIG1lc3NhZ2UubXV0YWJsZV9tYXBfc3RyaW5nX3N0cmluZygpOworICBNYXA8aW50MzJfdCwgRm9yZWlnbk1lc3NhZ2U+KiBtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlID0KKyAgICAgIG1lc3NhZ2UubXV0YWJsZV9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgKCptYXBfaW50MzJfaW50MzIpW2ldID0gRnVuYyhpLCAxKTsKKyAgICAoKm1hcF9pbnQzMl9kb3VibGUpW2ldID0gRnVuYyhpLCAyKTsKKyAgICAoKm1hcF9zdHJpbmdfc3RyaW5nKVtTdHJGdW5jKGksIDEpXSA9IFN0ckZ1bmMoaSwgNSk7CisgICAgKCptYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKVtpXS5zZXRfYyhGdW5jKGksIDYpKTsKKyAgfQorCisgIC8vIEdldCBGaWVsZERlc2NyaXB0b3JzIGZvciBhbGwgdGhlIGZpZWxkcyBvZiBpbnRlcmVzdC4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9tYXBfaW50MzJfaW50MzIgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJtYXBfaW50MzJfaW50MzIiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9tYXBfaW50MzJfZG91YmxlID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgibWFwX2ludDMyX2RvdWJsZSIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkX21hcF9zdHJpbmdfc3RyaW5nID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgibWFwX3N0cmluZ19zdHJpbmciKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgibWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSIpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfbWFwX2ludDMyX2luMzJfa2V5ID0KKyAgICAgIGZkX21hcF9pbnQzMl9pbnQzMi0+bWVzc2FnZV90eXBlKCktPm1hcF9rZXkoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9tYXBfaW50MzJfaW4zMl92YWx1ZSA9CisgICAgICBmZF9tYXBfaW50MzJfaW50MzItPm1lc3NhZ2VfdHlwZSgpLT5tYXBfdmFsdWUoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9tYXBfaW50MzJfZG91YmxlX2tleSA9CisgICAgICBmZF9tYXBfaW50MzJfZG91YmxlLT5tZXNzYWdlX3R5cGUoKS0+bWFwX2tleSgpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkX21hcF9pbnQzMl9kb3VibGVfdmFsdWUgPQorICAgICAgZmRfbWFwX2ludDMyX2RvdWJsZS0+bWVzc2FnZV90eXBlKCktPm1hcF92YWx1ZSgpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkX21hcF9zdHJpbmdfc3RyaW5nX2tleSA9CisgICAgICBmZF9tYXBfc3RyaW5nX3N0cmluZy0+bWVzc2FnZV90eXBlKCktPm1hcF9rZXkoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9tYXBfc3RyaW5nX3N0cmluZ192YWx1ZSA9CisgICAgICBmZF9tYXBfc3RyaW5nX3N0cmluZy0+bWVzc2FnZV90eXBlKCktPm1hcF92YWx1ZSgpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2Vfa2V5ID0KKyAgICAgIGZkX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UtPm1lc3NhZ2VfdHlwZSgpLT5tYXBfa2V5KCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZV92YWx1ZSA9CisgICAgICBmZF9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlLT5tZXNzYWdlX3R5cGUoKS0+bWFwX3ZhbHVlKCk7CisKKyAgLy8gR2V0IFJlcGVhdGVkUHRyRmllbGQgb2JqZWN0cyBmb3IgYWxsIGZpZWxkcyBvZiBpbnRlcmVzdC4KKyAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiYgbWZfaW50MzJfaW50MzIgPQorICAgICAgcmVmbC0+R2V0UmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPihtZXNzYWdlLCBmZF9tYXBfaW50MzJfaW50MzIpOworICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+JiBtZl9pbnQzMl9kb3VibGUgPQorICAgICAgcmVmbC0+R2V0UmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPihtZXNzYWdlLCBmZF9tYXBfaW50MzJfZG91YmxlKTsKKyAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiYgbWZfc3RyaW5nX3N0cmluZyA9CisgICAgICByZWZsLT5HZXRSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KG1lc3NhZ2UsIGZkX21hcF9zdHJpbmdfc3RyaW5nKTsKKyAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiYgbWZfaW50MzJfZm9yZWlnbl9tZXNzYWdlID0KKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4obWVzc2FnZSwgZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSk7CisKKyAgLy8gR2V0IG11dGFibGUgUmVwZWF0ZWRQdHJGaWVsZCBvYmplY3RzIGZvciBhbGwgZmllbGRzIG9mIGludGVyZXN0LgorICBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KiBtbWZfaW50MzJfaW50MzIgPQorICAgICAgcmVmbC0+TXV0YWJsZVJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4oJm1lc3NhZ2UsIGZkX21hcF9pbnQzMl9pbnQzMik7CisgIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4qIG1tZl9pbnQzMl9kb3VibGUgPQorICAgICAgcmVmbC0+TXV0YWJsZVJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4oJm1lc3NhZ2UsIGZkX21hcF9pbnQzMl9kb3VibGUpOworICBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KiBtbWZfc3RyaW5nX3N0cmluZyA9CisgICAgICByZWZsLT5NdXRhYmxlUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPigmbWVzc2FnZSwgZmRfbWFwX3N0cmluZ19zdHJpbmcpOworICBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KiBtbWZfaW50MzJfZm9yZWlnbl9tZXNzYWdlID0KKyAgICAgIHJlZmwtPk11dGFibGVSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KCZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSk7CisKKyAgLy8gTWFrZSBzdXJlIHdlIGNhbiBkbyBnZXRzIHRocm91Z2ggdGhlIFJlcGVhdGVkUHRyRmllbGQgb2JqZWN0cy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgeworICAgICAgLy8gQ2hlY2sgZ2V0cyB0aHJvdWdoIGNvbnN0IG9iamVjdHMuCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlX2ludDMyX2ludDMyID0gbWZfaW50MzJfaW50MzIuR2V0KGkpOworICAgICAgaW50MzJfdCBrZXlfaW50MzJfaW50MzIgPSBtZXNzYWdlX2ludDMyX2ludDMyLkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoCisgICAgICAgICAgbWVzc2FnZV9pbnQzMl9pbnQzMiwgZmRfbWFwX2ludDMyX2luMzJfa2V5KTsKKyAgICAgIGludDMyX3QgdmFsdWVfaW50MzJfaW50MzIgPSBtZXNzYWdlX2ludDMyX2ludDMyLkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoCisgICAgICAgICAgbWVzc2FnZV9pbnQzMl9pbnQzMiwgZmRfbWFwX2ludDMyX2luMzJfdmFsdWUpOworICAgICAgRVhQRUNUX0VRKHZhbHVlX2ludDMyX2ludDMyLCBGdW5jKGtleV9pbnQzMl9pbnQzMiwgMSkpOworCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlX2ludDMyX2RvdWJsZSA9IG1mX2ludDMyX2RvdWJsZS5HZXQoaSk7CisgICAgICBpbnQzMl90IGtleV9pbnQzMl9kb3VibGUgPSBtZXNzYWdlX2ludDMyX2RvdWJsZS5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgIG1lc3NhZ2VfaW50MzJfZG91YmxlLCBmZF9tYXBfaW50MzJfZG91YmxlX2tleSk7CisgICAgICBkb3VibGUgdmFsdWVfaW50MzJfZG91YmxlID0KKyAgICAgICAgICBtZXNzYWdlX2ludDMyX2RvdWJsZS5HZXRSZWZsZWN0aW9uKCktPkdldERvdWJsZSgKKyAgICAgICAgICAgICAgbWVzc2FnZV9pbnQzMl9kb3VibGUsIGZkX21hcF9pbnQzMl9kb3VibGVfdmFsdWUpOworICAgICAgRVhQRUNUX0VRKHZhbHVlX2ludDMyX2RvdWJsZSwgRnVuYyhrZXlfaW50MzJfZG91YmxlLCAyKSk7CisKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2Vfc3RyaW5nX3N0cmluZyA9IG1mX3N0cmluZ19zdHJpbmcuR2V0KGkpOworICAgICAgc3RkOjpzdHJpbmcga2V5X3N0cmluZ19zdHJpbmcgPQorICAgICAgICAgIG1lc3NhZ2Vfc3RyaW5nX3N0cmluZy5HZXRSZWZsZWN0aW9uKCktPkdldFN0cmluZygKKyAgICAgICAgICAgICAgbWVzc2FnZV9zdHJpbmdfc3RyaW5nLCBmZF9tYXBfc3RyaW5nX3N0cmluZ19rZXkpOworICAgICAgc3RkOjpzdHJpbmcgdmFsdWVfc3RyaW5nX3N0cmluZyA9CisgICAgICAgICAgbWVzc2FnZV9zdHJpbmdfc3RyaW5nLkdldFJlZmxlY3Rpb24oKS0+R2V0U3RyaW5nKAorICAgICAgICAgICAgICBtZXNzYWdlX3N0cmluZ19zdHJpbmcsIGZkX21hcF9zdHJpbmdfc3RyaW5nX3ZhbHVlKTsKKyAgICAgIEVYUEVDVF9FUSh2YWx1ZV9zdHJpbmdfc3RyaW5nLCBTdHJGdW5jKEludChrZXlfc3RyaW5nX3N0cmluZyksIDUpKTsKKworICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZV9pbnQzMl9tZXNzYWdlID0gbWZfaW50MzJfZm9yZWlnbl9tZXNzYWdlLkdldChpKTsKKyAgICAgIGludDMyX3Qga2V5X2ludDMyX21lc3NhZ2UgPQorICAgICAgICAgIG1lc3NhZ2VfaW50MzJfbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgICAgICBtZXNzYWdlX2ludDMyX21lc3NhZ2UsIGZkX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2Vfa2V5KTsKKyAgICAgIGNvbnN0IEZvcmVpZ25NZXNzYWdlJiB2YWx1ZV9pbnQzMl9tZXNzYWdlID0KKyAgICAgICAgICBkb3duX2Nhc3Q8Y29uc3QgRm9yZWlnbk1lc3NhZ2UmPigKKyAgICAgICAgICAgICAgbWVzc2FnZV9pbnQzMl9tZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaW50MzJfbWVzc2FnZSwgZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZV92YWx1ZSkpOworICAgICAgRVhQRUNUX0VRKHZhbHVlX2ludDMyX21lc3NhZ2UuYygpLCBGdW5jKGtleV9pbnQzMl9tZXNzYWdlLCA2KSk7CisgICAgfQorCisgICAgeworICAgICAgLy8gQ2hlY2sgZ2V0cyB0aHJvdWdoIG11dGFibGUgb2JqZWN0cy4KKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2VfaW50MzJfaW50MzIgPSBtbWZfaW50MzJfaW50MzItPkdldChpKTsKKyAgICAgIGludDMyX3Qga2V5X2ludDMyX2ludDMyID0gbWVzc2FnZV9pbnQzMl9pbnQzMi5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgIG1lc3NhZ2VfaW50MzJfaW50MzIsIGZkX21hcF9pbnQzMl9pbjMyX2tleSk7CisgICAgICBpbnQzMl90IHZhbHVlX2ludDMyX2ludDMyID0gbWVzc2FnZV9pbnQzMl9pbnQzMi5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgIG1lc3NhZ2VfaW50MzJfaW50MzIsIGZkX21hcF9pbnQzMl9pbjMyX3ZhbHVlKTsKKyAgICAgIEVYUEVDVF9FUSh2YWx1ZV9pbnQzMl9pbnQzMiwgRnVuYyhrZXlfaW50MzJfaW50MzIsIDEpKTsKKworICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZV9pbnQzMl9kb3VibGUgPSBtbWZfaW50MzJfZG91YmxlLT5HZXQoaSk7CisgICAgICBpbnQzMl90IGtleV9pbnQzMl9kb3VibGUgPSBtZXNzYWdlX2ludDMyX2RvdWJsZS5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgIG1lc3NhZ2VfaW50MzJfZG91YmxlLCBmZF9tYXBfaW50MzJfZG91YmxlX2tleSk7CisgICAgICBkb3VibGUgdmFsdWVfaW50MzJfZG91YmxlID0KKyAgICAgICAgICBtZXNzYWdlX2ludDMyX2RvdWJsZS5HZXRSZWZsZWN0aW9uKCktPkdldERvdWJsZSgKKyAgICAgICAgICAgICAgbWVzc2FnZV9pbnQzMl9kb3VibGUsIGZkX21hcF9pbnQzMl9kb3VibGVfdmFsdWUpOworICAgICAgRVhQRUNUX0VRKHZhbHVlX2ludDMyX2RvdWJsZSwgRnVuYyhrZXlfaW50MzJfZG91YmxlLCAyKSk7CisKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2Vfc3RyaW5nX3N0cmluZyA9IG1tZl9zdHJpbmdfc3RyaW5nLT5HZXQoaSk7CisgICAgICBzdGQ6OnN0cmluZyBrZXlfc3RyaW5nX3N0cmluZyA9CisgICAgICAgICAgbWVzc2FnZV9zdHJpbmdfc3RyaW5nLkdldFJlZmxlY3Rpb24oKS0+R2V0U3RyaW5nKAorICAgICAgICAgICAgICBtZXNzYWdlX3N0cmluZ19zdHJpbmcsIGZkX21hcF9zdHJpbmdfc3RyaW5nX2tleSk7CisgICAgICBzdGQ6OnN0cmluZyB2YWx1ZV9zdHJpbmdfc3RyaW5nID0KKyAgICAgICAgICBtZXNzYWdlX3N0cmluZ19zdHJpbmcuR2V0UmVmbGVjdGlvbigpLT5HZXRTdHJpbmcoCisgICAgICAgICAgICAgIG1lc3NhZ2Vfc3RyaW5nX3N0cmluZywgZmRfbWFwX3N0cmluZ19zdHJpbmdfdmFsdWUpOworICAgICAgRVhQRUNUX0VRKHZhbHVlX3N0cmluZ19zdHJpbmcsIFN0ckZ1bmMoSW50KGtleV9zdHJpbmdfc3RyaW5nKSwgNSkpOworCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlX2ludDMyX21lc3NhZ2UgPSBtbWZfaW50MzJfZm9yZWlnbl9tZXNzYWdlLT5HZXQoaSk7CisgICAgICBpbnQzMl90IGtleV9pbnQzMl9tZXNzYWdlID0KKyAgICAgICAgICBtZXNzYWdlX2ludDMyX21lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigKKyAgICAgICAgICAgICAgbWVzc2FnZV9pbnQzMl9tZXNzYWdlLCBmZF9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlX2tleSk7CisgICAgICBjb25zdCBGb3JlaWduTWVzc2FnZSYgdmFsdWVfaW50MzJfbWVzc2FnZSA9CisgICAgICAgICAgZG93bl9jYXN0PGNvbnN0IEZvcmVpZ25NZXNzYWdlJj4oCisgICAgICAgICAgICAgIG1lc3NhZ2VfaW50MzJfbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICBtZXNzYWdlX2ludDMyX21lc3NhZ2UsIGZkX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VfdmFsdWUpKTsKKyAgICAgIEVYUEVDVF9FUSh2YWx1ZV9pbnQzMl9tZXNzYWdlLmMoKSwgRnVuYyhrZXlfaW50MzJfbWVzc2FnZSwgNikpOworICAgIH0KKyAgfQorCisgIC8vIERvIHNldHMgdGhyb3VnaCB0aGUgUmVwZWF0ZWRQdHJGaWVsZCBvYmplY3RzLgorICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICB7CisgICAgICBNZXNzYWdlKiBtZXNzYWdlX2ludDMyX2ludDMyID0gbW1mX2ludDMyX2ludDMyLT5NdXRhYmxlKGkpOworICAgICAgaW50MzJfdCBrZXlfaW50MzJfaW50MzIgPSBtZXNzYWdlX2ludDMyX2ludDMyLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgICptZXNzYWdlX2ludDMyX2ludDMyLCBmZF9tYXBfaW50MzJfaW4zMl9rZXkpOworICAgICAgbWVzc2FnZV9pbnQzMl9pbnQzMi0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihtZXNzYWdlX2ludDMyX2ludDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZF9tYXBfaW50MzJfaW4zMl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuYyhrZXlfaW50MzJfaW50MzIsIC0xKSk7CisKKyAgICAgIE1lc3NhZ2UqIG1lc3NhZ2VfaW50MzJfZG91YmxlID0gbW1mX2ludDMyX2RvdWJsZS0+TXV0YWJsZShpKTsKKyAgICAgIGludDMyX3Qga2V5X2ludDMyX2RvdWJsZSA9CisgICAgICAgICAgbWVzc2FnZV9pbnQzMl9kb3VibGUtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoCisgICAgICAgICAgICAgICptZXNzYWdlX2ludDMyX2RvdWJsZSwgZmRfbWFwX2ludDMyX2RvdWJsZV9rZXkpOworICAgICAgbWVzc2FnZV9pbnQzMl9kb3VibGUtPkdldFJlZmxlY3Rpb24oKS0+U2V0RG91YmxlKAorICAgICAgICAgIG1lc3NhZ2VfaW50MzJfZG91YmxlLCBmZF9tYXBfaW50MzJfZG91YmxlX3ZhbHVlLAorICAgICAgICAgIEZ1bmMoa2V5X2ludDMyX2RvdWJsZSwgLTIpKTsKKworICAgICAgTWVzc2FnZSogbWVzc2FnZV9zdHJpbmdfc3RyaW5nID0gbW1mX3N0cmluZ19zdHJpbmctPk11dGFibGUoaSk7CisgICAgICBzdGQ6OnN0cmluZyBrZXlfc3RyaW5nX3N0cmluZyA9CisgICAgICAgICAgbWVzc2FnZV9zdHJpbmdfc3RyaW5nLT5HZXRSZWZsZWN0aW9uKCktPkdldFN0cmluZygKKyAgICAgICAgICAgICAgKm1lc3NhZ2Vfc3RyaW5nX3N0cmluZywgZmRfbWFwX3N0cmluZ19zdHJpbmdfa2V5KTsKKyAgICAgIG1lc3NhZ2Vfc3RyaW5nX3N0cmluZy0+R2V0UmVmbGVjdGlvbigpLT5TZXRTdHJpbmcoCisgICAgICAgICAgbWVzc2FnZV9zdHJpbmdfc3RyaW5nLCBmZF9tYXBfc3RyaW5nX3N0cmluZ192YWx1ZSwKKyAgICAgICAgICBTdHJGdW5jKEludChrZXlfc3RyaW5nX3N0cmluZyksIC01KSk7CisKKyAgICAgIE1lc3NhZ2UqIG1lc3NhZ2VfaW50MzJfbWVzc2FnZSA9IG1tZl9pbnQzMl9mb3JlaWduX21lc3NhZ2UtPk11dGFibGUoaSk7CisgICAgICBpbnQzMl90IGtleV9pbnQzMl9tZXNzYWdlID0KKyAgICAgICAgICBtZXNzYWdlX2ludDMyX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoCisgICAgICAgICAgICAgICptZXNzYWdlX2ludDMyX21lc3NhZ2UsIGZkX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2Vfa2V5KTsKKyAgICAgIEZvcmVpZ25NZXNzYWdlKiB2YWx1ZV9pbnQzMl9tZXNzYWdlID0gZG93bl9jYXN0PEZvcmVpZ25NZXNzYWdlKj4oCisgICAgICAgICAgbWVzc2FnZV9pbnQzMl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVNZXNzYWdlKAorICAgICAgICAgICAgICBtZXNzYWdlX2ludDMyX21lc3NhZ2UsIGZkX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VfdmFsdWUpKTsKKyAgICAgIHZhbHVlX2ludDMyX21lc3NhZ2UtPnNldF9jKEZ1bmMoa2V5X2ludDMyX21lc3NhZ2UsIC02KSk7CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgZ2V0cyB0aHJvdWdoIG11dGFibGUgb2JqZWN0cy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgLTEpLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmF0KGkpKTsKKyAgICBFWFBFQ1RfRVEoRnVuYyhpLCAtMiksIG1lc3NhZ2UubWFwX2ludDMyX2RvdWJsZSgpLmF0KGkpKTsKKyAgICBFWFBFQ1RfRVEoU3RyRnVuYyhpLCAtNSksIG1lc3NhZ2UubWFwX3N0cmluZ19zdHJpbmcoKS5hdChTdHJGdW5jKGksIDEpKSk7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgLTYpLCBtZXNzYWdlLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKS5hdChpKS5jKCkpOworICB9Cit9CisKK1RFU1RfRihNYXBGaWVsZFJlZmxlY3Rpb25UZXN0LCBSZXBlYXRlZEZpZWxkUmVmRm9yUmVndWxhckZpZWxkcykgeworICBUZXN0TWFwIG1lc3NhZ2U7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmwgPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzYyA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOworCisgIE1hcDxpbnQzMl90LCBpbnQzMl90PiogbWFwX2ludDMyX2ludDMyID0gbWVzc2FnZS5tdXRhYmxlX21hcF9pbnQzMl9pbnQzMigpOworICBNYXA8aW50MzJfdCwgZG91YmxlPiogbWFwX2ludDMyX2RvdWJsZSA9IG1lc3NhZ2UubXV0YWJsZV9tYXBfaW50MzJfZG91YmxlKCk7CisgIE1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KiBtYXBfc3RyaW5nX3N0cmluZyA9CisgICAgICBtZXNzYWdlLm11dGFibGVfbWFwX3N0cmluZ19zdHJpbmcoKTsKKyAgTWFwPGludDMyX3QsIEZvcmVpZ25NZXNzYWdlPiogbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSA9CisgICAgICBtZXNzYWdlLm11dGFibGVfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgICgqbWFwX2ludDMyX2ludDMyKVtpXSA9IEZ1bmMoaSwgMSk7CisgICAgKCptYXBfaW50MzJfZG91YmxlKVtpXSA9IEZ1bmMoaSwgMik7CisgICAgKCptYXBfc3RyaW5nX3N0cmluZylbU3RyRnVuYyhpLCAxKV0gPSBTdHJGdW5jKGksIDUpOworICAgICgqbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSlbaV0uc2V0X2MoRnVuYyhpLCA2KSk7CisgIH0KKworICAvLyBHZXQgRmllbGREZXNjcmlwdG9ycyBmb3IgYWxsIHRoZSBmaWVsZHMgb2YgaW50ZXJlc3QuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfbWFwX2ludDMyX2ludDMyID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgibWFwX2ludDMyX2ludDMyIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfbWFwX2ludDMyX2RvdWJsZSA9CisgICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9pbnQzMl9kb3VibGUiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9tYXBfc3RyaW5nX3N0cmluZyA9CisgICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9zdHJpbmdfc3RyaW5nIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSA9CisgICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UiKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkX21hcF9pbnQzMl9pbjMyX2tleSA9CisgICAgICBmZF9tYXBfaW50MzJfaW50MzItPm1lc3NhZ2VfdHlwZSgpLT5tYXBfa2V5KCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfbWFwX2ludDMyX2luMzJfdmFsdWUgPQorICAgICAgZmRfbWFwX2ludDMyX2ludDMyLT5tZXNzYWdlX3R5cGUoKS0+bWFwX3ZhbHVlKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfbWFwX2ludDMyX2RvdWJsZV9rZXkgPQorICAgICAgZmRfbWFwX2ludDMyX2RvdWJsZS0+bWVzc2FnZV90eXBlKCktPm1hcF9rZXkoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9tYXBfaW50MzJfZG91YmxlX3ZhbHVlID0KKyAgICAgIGZkX21hcF9pbnQzMl9kb3VibGUtPm1lc3NhZ2VfdHlwZSgpLT5tYXBfdmFsdWUoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9tYXBfc3RyaW5nX3N0cmluZ19rZXkgPQorICAgICAgZmRfbWFwX3N0cmluZ19zdHJpbmctPm1lc3NhZ2VfdHlwZSgpLT5tYXBfa2V5KCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfbWFwX3N0cmluZ19zdHJpbmdfdmFsdWUgPQorICAgICAgZmRfbWFwX3N0cmluZ19zdHJpbmctPm1lc3NhZ2VfdHlwZSgpLT5tYXBfdmFsdWUoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlX2tleSA9CisgICAgICBmZF9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlLT5tZXNzYWdlX3R5cGUoKS0+bWFwX2tleSgpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VfdmFsdWUgPQorICAgICAgZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS0+bWVzc2FnZV90eXBlKCktPm1hcF92YWx1ZSgpOworCisgIC8vIEdldCBSZXBlYXRlZEZpZWxkUmVmIG9iamVjdHMgZm9yIGFsbCBmaWVsZHMgb2YgaW50ZXJlc3QuCisgIGNvbnN0IFJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT4gbWZfaW50MzJfaW50MzIgPQorICAgICAgcmVmbC0+R2V0UmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPihtZXNzYWdlLCBmZF9tYXBfaW50MzJfaW50MzIpOworICBjb25zdCBSZXBlYXRlZEZpZWxkUmVmPE1lc3NhZ2U+IG1mX2ludDMyX2RvdWJsZSA9CisgICAgICByZWZsLT5HZXRSZXBlYXRlZEZpZWxkUmVmPE1lc3NhZ2U+KG1lc3NhZ2UsIGZkX21hcF9pbnQzMl9kb3VibGUpOworICBjb25zdCBSZXBlYXRlZEZpZWxkUmVmPE1lc3NhZ2U+IG1mX3N0cmluZ19zdHJpbmcgPQorICAgICAgcmVmbC0+R2V0UmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPihtZXNzYWdlLCBmZF9tYXBfc3RyaW5nX3N0cmluZyk7CisgIGNvbnN0IFJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT4gbWZfaW50MzJfZm9yZWlnbl9tZXNzYWdlID0KKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT4obWVzc2FnZSwgZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSk7CisKKyAgLy8gR2V0IG11dGFibGUgUmVwZWF0ZWRGaWVsZFJlZiBvYmplY3RzIGZvciBhbGwgZmllbGRzIG9mIGludGVyZXN0LgorICBjb25zdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPiBtbWZfaW50MzJfaW50MzIgPQorICAgICAgcmVmbC0+R2V0TXV0YWJsZVJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT4oJm1lc3NhZ2UsIGZkX21hcF9pbnQzMl9pbnQzMik7CisgIGNvbnN0IE11dGFibGVSZXBlYXRlZEZpZWxkUmVmPE1lc3NhZ2U+IG1tZl9pbnQzMl9kb3VibGUgPQorICAgICAgcmVmbC0+R2V0TXV0YWJsZVJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT4oJm1lc3NhZ2UsIGZkX21hcF9pbnQzMl9kb3VibGUpOworICBjb25zdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPiBtbWZfc3RyaW5nX3N0cmluZyA9CisgICAgICByZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPigmbWVzc2FnZSwgZmRfbWFwX3N0cmluZ19zdHJpbmcpOworICBjb25zdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPiBtbWZfaW50MzJfZm9yZWlnbl9tZXNzYWdlID0KKyAgICAgIHJlZmwtPkdldE11dGFibGVSZXBlYXRlZEZpZWxkUmVmPE1lc3NhZ2U+KCZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSk7CisKKyAgLy8gR2V0IGVudHJ5IGRlZmF1bHQgaW5zdGFuY2VzCisgIHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlPiBlbnRyeV9pbnQzMl9pbnQzMigKKyAgICAgIE1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpCisgICAgICAgICAgLT5HZXRQcm90b3R5cGUoZmRfbWFwX2ludDMyX2ludDMyLT5tZXNzYWdlX3R5cGUoKSkKKyAgICAgICAgICAtPk5ldyhtZXNzYWdlLkdldEFyZW5hKCkpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+IGVudHJ5X2ludDMyX2RvdWJsZSgKKyAgICAgIE1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpCisgICAgICAgICAgLT5HZXRQcm90b3R5cGUoZmRfbWFwX2ludDMyX2RvdWJsZS0+bWVzc2FnZV90eXBlKCkpCisgICAgICAgICAgLT5OZXcobWVzc2FnZS5HZXRBcmVuYSgpKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlPiBlbnRyeV9zdHJpbmdfc3RyaW5nKAorICAgICAgTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCkKKyAgICAgICAgICAtPkdldFByb3RvdHlwZShmZF9tYXBfc3RyaW5nX3N0cmluZy0+bWVzc2FnZV90eXBlKCkpCisgICAgICAgICAgLT5OZXcobWVzc2FnZS5HZXRBcmVuYSgpKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlPiBlbnRyeV9pbnQzMl9mb3JlaWduX21lc3NhZ2UoCisgICAgICBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKQorICAgICAgICAgIC0+R2V0UHJvdG90eXBlKGZkX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UtPm1lc3NhZ2VfdHlwZSgpKQorICAgICAgICAgIC0+TmV3KG1lc3NhZ2UuR2V0QXJlbmEoKSkpOworCisgIEVYUEVDVF9FUSgxMCwgbWZfaW50MzJfaW50MzIuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEwLCBtbWZfaW50MzJfaW50MzIuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEwLCBtZl9pbnQzMl9kb3VibGUuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEwLCBtbWZfaW50MzJfZG91YmxlLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxMCwgbWZfc3RyaW5nX3N0cmluZy5zaXplKCkpOworICBFWFBFQ1RfRVEoMTAsIG1tZl9zdHJpbmdfc3RyaW5nLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxMCwgbWZfaW50MzJfZm9yZWlnbl9tZXNzYWdlLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxMCwgbW1mX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5zaXplKCkpOworCisgIEVYUEVDVF9GQUxTRShtZl9pbnQzMl9pbnQzMi5lbXB0eSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1tZl9pbnQzMl9pbnQzMi5lbXB0eSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1mX2ludDMyX2RvdWJsZS5lbXB0eSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1tZl9pbnQzMl9kb3VibGUuZW1wdHkoKSk7CisgIEVYUEVDVF9GQUxTRShtZl9zdHJpbmdfc3RyaW5nLmVtcHR5KCkpOworICBFWFBFQ1RfRkFMU0UobW1mX3N0cmluZ19zdHJpbmcuZW1wdHkoKSk7CisgIEVYUEVDVF9GQUxTRShtZl9pbnQzMl9mb3JlaWduX21lc3NhZ2UuZW1wdHkoKSk7CisgIEVYUEVDVF9GQUxTRShtbWZfaW50MzJfZm9yZWlnbl9tZXNzYWdlLmVtcHR5KCkpOworCisgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gZG8gZ2V0cyB0aHJvdWdoIHRoZSBSZXBlYXRlZEZpZWxkUmVmIG9iamVjdHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIHsKKyAgICAgIC8vIENoZWNrIGdldHMgdGhyb3VnaCBjb25zdCBvYmplY3RzLgorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZV9pbnQzMl9pbnQzMiA9CisgICAgICAgICAgbWZfaW50MzJfaW50MzIuR2V0KGksIGVudHJ5X2ludDMyX2ludDMyLmdldCgpKTsKKyAgICAgIGludDMyX3Qga2V5X2ludDMyX2ludDMyID0gbWVzc2FnZV9pbnQzMl9pbnQzMi5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgIG1lc3NhZ2VfaW50MzJfaW50MzIsIGZkX21hcF9pbnQzMl9pbjMyX2tleSk7CisgICAgICBpbnQzMl90IHZhbHVlX2ludDMyX2ludDMyID0gbWVzc2FnZV9pbnQzMl9pbnQzMi5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgIG1lc3NhZ2VfaW50MzJfaW50MzIsIGZkX21hcF9pbnQzMl9pbjMyX3ZhbHVlKTsKKyAgICAgIEVYUEVDVF9FUSh2YWx1ZV9pbnQzMl9pbnQzMiwgRnVuYyhrZXlfaW50MzJfaW50MzIsIDEpKTsKKworICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZV9pbnQzMl9kb3VibGUgPQorICAgICAgICAgIG1mX2ludDMyX2RvdWJsZS5HZXQoaSwgZW50cnlfaW50MzJfZG91YmxlLmdldCgpKTsKKyAgICAgIGludDMyX3Qga2V5X2ludDMyX2RvdWJsZSA9IG1lc3NhZ2VfaW50MzJfZG91YmxlLkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoCisgICAgICAgICAgbWVzc2FnZV9pbnQzMl9kb3VibGUsIGZkX21hcF9pbnQzMl9kb3VibGVfa2V5KTsKKyAgICAgIGRvdWJsZSB2YWx1ZV9pbnQzMl9kb3VibGUgPQorICAgICAgICAgIG1lc3NhZ2VfaW50MzJfZG91YmxlLkdldFJlZmxlY3Rpb24oKS0+R2V0RG91YmxlKAorICAgICAgICAgICAgICBtZXNzYWdlX2ludDMyX2RvdWJsZSwgZmRfbWFwX2ludDMyX2RvdWJsZV92YWx1ZSk7CisgICAgICBFWFBFQ1RfRVEodmFsdWVfaW50MzJfZG91YmxlLCBGdW5jKGtleV9pbnQzMl9kb3VibGUsIDIpKTsKKworICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZV9zdHJpbmdfc3RyaW5nID0KKyAgICAgICAgICBtZl9zdHJpbmdfc3RyaW5nLkdldChpLCBlbnRyeV9zdHJpbmdfc3RyaW5nLmdldCgpKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGtleV9zdHJpbmdfc3RyaW5nID0KKyAgICAgICAgICBtZXNzYWdlX3N0cmluZ19zdHJpbmcuR2V0UmVmbGVjdGlvbigpLT5HZXRTdHJpbmcoCisgICAgICAgICAgICAgIG1lc3NhZ2Vfc3RyaW5nX3N0cmluZywgZmRfbWFwX3N0cmluZ19zdHJpbmdfa2V5KTsKKyAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlX3N0cmluZ19zdHJpbmcgPQorICAgICAgICAgIG1lc3NhZ2Vfc3RyaW5nX3N0cmluZy5HZXRSZWZsZWN0aW9uKCktPkdldFN0cmluZygKKyAgICAgICAgICAgICAgbWVzc2FnZV9zdHJpbmdfc3RyaW5nLCBmZF9tYXBfc3RyaW5nX3N0cmluZ192YWx1ZSk7CisgICAgICBFWFBFQ1RfRVEodmFsdWVfc3RyaW5nX3N0cmluZywgU3RyRnVuYyhJbnQoa2V5X3N0cmluZ19zdHJpbmcpLCA1KSk7CisKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2VfaW50MzJfbWVzc2FnZSA9CisgICAgICAgICAgbWZfaW50MzJfZm9yZWlnbl9tZXNzYWdlLkdldChpLCBlbnRyeV9pbnQzMl9mb3JlaWduX21lc3NhZ2UuZ2V0KCkpOworICAgICAgaW50MzJfdCBrZXlfaW50MzJfbWVzc2FnZSA9CisgICAgICAgICAgbWVzc2FnZV9pbnQzMl9tZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoCisgICAgICAgICAgICAgIG1lc3NhZ2VfaW50MzJfbWVzc2FnZSwgZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZV9rZXkpOworICAgICAgY29uc3QgRm9yZWlnbk1lc3NhZ2UmIHZhbHVlX2ludDMyX21lc3NhZ2UgPQorICAgICAgICAgIGRvd25fY2FzdDxjb25zdCBGb3JlaWduTWVzc2FnZSY+KAorICAgICAgICAgICAgICBtZXNzYWdlX2ludDMyX21lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5HZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pbnQzMl9tZXNzYWdlLCBmZF9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlX3ZhbHVlKSk7CisgICAgICBFWFBFQ1RfRVEodmFsdWVfaW50MzJfbWVzc2FnZS5jKCksIEZ1bmMoa2V5X2ludDMyX21lc3NhZ2UsIDYpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAvLyBDaGVjayBnZXRzIHRocm91Z2ggbXV0YWJsZSBvYmplY3RzLgorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZV9pbnQzMl9pbnQzMiA9CisgICAgICAgICAgbW1mX2ludDMyX2ludDMyLkdldChpLCBlbnRyeV9pbnQzMl9pbnQzMi5nZXQoKSk7CisgICAgICBpbnQzMl90IGtleV9pbnQzMl9pbnQzMiA9IG1lc3NhZ2VfaW50MzJfaW50MzIuR2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigKKyAgICAgICAgICBtZXNzYWdlX2ludDMyX2ludDMyLCBmZF9tYXBfaW50MzJfaW4zMl9rZXkpOworICAgICAgaW50MzJfdCB2YWx1ZV9pbnQzMl9pbnQzMiA9IG1lc3NhZ2VfaW50MzJfaW50MzIuR2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigKKyAgICAgICAgICBtZXNzYWdlX2ludDMyX2ludDMyLCBmZF9tYXBfaW50MzJfaW4zMl92YWx1ZSk7CisgICAgICBFWFBFQ1RfRVEodmFsdWVfaW50MzJfaW50MzIsIEZ1bmMoa2V5X2ludDMyX2ludDMyLCAxKSk7CisKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2VfaW50MzJfZG91YmxlID0KKyAgICAgICAgICBtbWZfaW50MzJfZG91YmxlLkdldChpLCBlbnRyeV9pbnQzMl9kb3VibGUuZ2V0KCkpOworICAgICAgaW50MzJfdCBrZXlfaW50MzJfZG91YmxlID0gbWVzc2FnZV9pbnQzMl9kb3VibGUuR2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigKKyAgICAgICAgICBtZXNzYWdlX2ludDMyX2RvdWJsZSwgZmRfbWFwX2ludDMyX2RvdWJsZV9rZXkpOworICAgICAgZG91YmxlIHZhbHVlX2ludDMyX2RvdWJsZSA9CisgICAgICAgICAgbWVzc2FnZV9pbnQzMl9kb3VibGUuR2V0UmVmbGVjdGlvbigpLT5HZXREb3VibGUoCisgICAgICAgICAgICAgIG1lc3NhZ2VfaW50MzJfZG91YmxlLCBmZF9tYXBfaW50MzJfZG91YmxlX3ZhbHVlKTsKKyAgICAgIEVYUEVDVF9FUSh2YWx1ZV9pbnQzMl9kb3VibGUsIEZ1bmMoa2V5X2ludDMyX2RvdWJsZSwgMikpOworCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlX3N0cmluZ19zdHJpbmcgPQorICAgICAgICAgIG1tZl9zdHJpbmdfc3RyaW5nLkdldChpLCBlbnRyeV9zdHJpbmdfc3RyaW5nLmdldCgpKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGtleV9zdHJpbmdfc3RyaW5nID0KKyAgICAgICAgICBtZXNzYWdlX3N0cmluZ19zdHJpbmcuR2V0UmVmbGVjdGlvbigpLT5HZXRTdHJpbmcoCisgICAgICAgICAgICAgIG1lc3NhZ2Vfc3RyaW5nX3N0cmluZywgZmRfbWFwX3N0cmluZ19zdHJpbmdfa2V5KTsKKyAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlX3N0cmluZ19zdHJpbmcgPQorICAgICAgICAgIG1lc3NhZ2Vfc3RyaW5nX3N0cmluZy5HZXRSZWZsZWN0aW9uKCktPkdldFN0cmluZygKKyAgICAgICAgICAgICAgbWVzc2FnZV9zdHJpbmdfc3RyaW5nLCBmZF9tYXBfc3RyaW5nX3N0cmluZ192YWx1ZSk7CisgICAgICBFWFBFQ1RfRVEodmFsdWVfc3RyaW5nX3N0cmluZywgU3RyRnVuYyhJbnQoa2V5X3N0cmluZ19zdHJpbmcpLCA1KSk7CisKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2VfaW50MzJfbWVzc2FnZSA9CisgICAgICAgICAgbW1mX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5HZXQoaSwgZW50cnlfaW50MzJfZm9yZWlnbl9tZXNzYWdlLmdldCgpKTsKKyAgICAgIGludDMyX3Qga2V5X2ludDMyX21lc3NhZ2UgPQorICAgICAgICAgIG1lc3NhZ2VfaW50MzJfbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgICAgICBtZXNzYWdlX2ludDMyX21lc3NhZ2UsIGZkX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2Vfa2V5KTsKKyAgICAgIGNvbnN0IEZvcmVpZ25NZXNzYWdlJiB2YWx1ZV9pbnQzMl9tZXNzYWdlID0KKyAgICAgICAgICBkb3duX2Nhc3Q8Y29uc3QgRm9yZWlnbk1lc3NhZ2UmPigKKyAgICAgICAgICAgICAgbWVzc2FnZV9pbnQzMl9tZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaW50MzJfbWVzc2FnZSwgZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZV92YWx1ZSkpOworICAgICAgRVhQRUNUX0VRKHZhbHVlX2ludDMyX21lc3NhZ2UuYygpLCBGdW5jKGtleV9pbnQzMl9tZXNzYWdlLCA2KSk7CisgICAgfQorICB9CisKKyAgLy8gTWFrZSBzdXJlIHdlIGNhbiBkbyBzZXRzIHRocm91Z2ggdGhlIFJlcGVhdGVkRmllbGRSZWYgb2JqZWN0cy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZV9pbnQzMl9pbnQzMiA9CisgICAgICAgIG1tZl9pbnQzMl9pbnQzMi5HZXQoaSwgZW50cnlfaW50MzJfaW50MzIuZ2V0KCkpOworICAgIGludCBrZXkgPSBtZXNzYWdlX2ludDMyX2ludDMyLkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoCisgICAgICAgIG1lc3NhZ2VfaW50MzJfaW50MzIsIGZkX21hcF9pbnQzMl9pbjMyX2tleSk7CisKKyAgICBlbnRyeV9pbnQzMl9pbnQzMi0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMigKKyAgICAgICAgZW50cnlfaW50MzJfaW50MzIuZ2V0KCksIGZkX21hcF9pbnQzMl9pbnQzMi0+bWVzc2FnZV90eXBlKCktPmZpZWxkKDApLAorICAgICAgICBrZXkpOworICAgIGVudHJ5X2ludDMyX2ludDMyLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKAorICAgICAgICBlbnRyeV9pbnQzMl9pbnQzMi5nZXQoKSwgZmRfbWFwX2ludDMyX2ludDMyLT5tZXNzYWdlX3R5cGUoKS0+ZmllbGQoMSksCisgICAgICAgIEZ1bmMoa2V5LCAtMSkpOworICAgIGVudHJ5X2ludDMyX2RvdWJsZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMigKKyAgICAgICAgZW50cnlfaW50MzJfZG91YmxlLmdldCgpLCBmZF9tYXBfaW50MzJfZG91YmxlLT5tZXNzYWdlX3R5cGUoKS0+ZmllbGQoMCksCisgICAgICAgIGtleSk7CisgICAgZW50cnlfaW50MzJfZG91YmxlLT5HZXRSZWZsZWN0aW9uKCktPlNldERvdWJsZSgKKyAgICAgICAgZW50cnlfaW50MzJfZG91YmxlLmdldCgpLCBmZF9tYXBfaW50MzJfZG91YmxlLT5tZXNzYWdlX3R5cGUoKS0+ZmllbGQoMSksCisgICAgICAgIEZ1bmMoa2V5LCAtMikpOworICAgIGVudHJ5X3N0cmluZ19zdHJpbmctPkdldFJlZmxlY3Rpb24oKS0+U2V0U3RyaW5nKAorICAgICAgICBlbnRyeV9zdHJpbmdfc3RyaW5nLmdldCgpLAorICAgICAgICBmZF9tYXBfc3RyaW5nX3N0cmluZy0+bWVzc2FnZV90eXBlKCktPmZpZWxkKDApLCBTdHJGdW5jKGtleSwgMSkpOworICAgIGVudHJ5X3N0cmluZ19zdHJpbmctPkdldFJlZmxlY3Rpb24oKS0+U2V0U3RyaW5nKAorICAgICAgICBlbnRyeV9zdHJpbmdfc3RyaW5nLmdldCgpLAorICAgICAgICBmZF9tYXBfc3RyaW5nX3N0cmluZy0+bWVzc2FnZV90eXBlKCktPmZpZWxkKDEpLCBTdHJGdW5jKGtleSwgLTUpKTsKKyAgICBlbnRyeV9pbnQzMl9mb3JlaWduX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoCisgICAgICAgIGVudHJ5X2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5nZXQoKSwKKyAgICAgICAgZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS0+bWVzc2FnZV90eXBlKCktPmZpZWxkKDApLCBrZXkpOworICAgIE1lc3NhZ2UqIHZhbHVlX21lc3NhZ2UgPQorICAgICAgICBlbnRyeV9pbnQzMl9mb3JlaWduX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TXV0YWJsZU1lc3NhZ2UoCisgICAgICAgICAgICBlbnRyeV9pbnQzMl9mb3JlaWduX21lc3NhZ2UuZ2V0KCksCisgICAgICAgICAgICBmZF9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlLT5tZXNzYWdlX3R5cGUoKS0+ZmllbGQoMSkpOworICAgIHZhbHVlX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoCisgICAgICAgIHZhbHVlX21lc3NhZ2UsIHZhbHVlX21lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJjIiksCisgICAgICAgIEZ1bmMoa2V5LCAtNikpOworCisgICAgbW1mX2ludDMyX2ludDMyLlNldChpLCAqZW50cnlfaW50MzJfaW50MzIpOworICAgIG1tZl9pbnQzMl9kb3VibGUuU2V0KGksICplbnRyeV9pbnQzMl9kb3VibGUpOworICAgIG1tZl9zdHJpbmdfc3RyaW5nLlNldChpLCAqZW50cnlfc3RyaW5nX3N0cmluZyk7CisgICAgbW1mX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5TZXQoaSwgKmVudHJ5X2ludDMyX2ZvcmVpZ25fbWVzc2FnZSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoRnVuYyhpLCAtMSksIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoaSkpOworICAgIEVYUEVDVF9FUShGdW5jKGksIC0yKSwgbWVzc2FnZS5tYXBfaW50MzJfZG91YmxlKCkuYXQoaSkpOworICAgIEVYUEVDVF9FUShTdHJGdW5jKGksIC01KSwgbWVzc2FnZS5tYXBfc3RyaW5nX3N0cmluZygpLmF0KFN0ckZ1bmMoaSwgMSkpKTsKKyAgICBFWFBFQ1RfRVEoRnVuYyhpLCAtNiksIG1lc3NhZ2UubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpLmF0KGkpLmMoKSk7CisgIH0KKworICAvLyBUZXN0IGl0ZXJhdG9ycy4KKyAgeworICAgIGludCBpbmRleCA9IDA7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDMyX3QsIGludDMyX3Q+IHJlc3VsdDsKKyAgICBmb3IgKFJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT46Oml0ZXJhdG9yIGl0ID0gbWZfaW50MzJfaW50MzIuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1mX2ludDMyX2ludDMyLmVuZCgpOyArK2l0KSB7CisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlID0gKml0OworICAgICAgaW50MzJfdCBrZXkgPQorICAgICAgICAgIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMihtZXNzYWdlLCBmZF9tYXBfaW50MzJfaW4zMl9rZXkpOworICAgICAgaW50MzJfdCB2YWx1ZSA9CisgICAgICAgICAgbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKG1lc3NhZ2UsIGZkX21hcF9pbnQzMl9pbjMyX3ZhbHVlKTsKKyAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7CisgICAgICArK2luZGV4OworICAgIH0KKyAgICBFWFBFQ1RfRVEoMTAsIGluZGV4KTsKKyAgICBmb3IgKHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQzMl90LCBpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPQorICAgICAgICAgICAgIHJlc3VsdC5iZWdpbigpOworICAgICAgICAgaXQgIT0gcmVzdWx0LmVuZCgpOyArK2l0KSB7CisgICAgICBFWFBFQ1RfRVEobWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5hdChpdC0+Zmlyc3QpLCBpdC0+c2Vjb25kKTsKKyAgICB9CisgIH0KKworICB7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50MzJfdCwgZG91YmxlPiByZXN1bHQ7CisgICAgZm9yIChSZXBlYXRlZEZpZWxkUmVmPE1lc3NhZ2U+OjppdGVyYXRvciBpdCA9IG1mX2ludDMyX2RvdWJsZS5iZWdpbigpOworICAgICAgICAgaXQgIT0gbWZfaW50MzJfZG91YmxlLmVuZCgpOyArK2l0KSB7CisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlID0gKml0OworICAgICAgaW50MzJfdCBrZXkgPQorICAgICAgICAgIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMihtZXNzYWdlLCBmZF9tYXBfaW50MzJfZG91YmxlX2tleSk7CisgICAgICBkb3VibGUgdmFsdWUgPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0RG91YmxlKAorICAgICAgICAgIG1lc3NhZ2UsIGZkX21hcF9pbnQzMl9kb3VibGVfdmFsdWUpOworICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTsKKyAgICAgICsraW5kZXg7CisgICAgfQorICAgIEVYUEVDVF9FUSgxMCwgaW5kZXgpOworICAgIGZvciAoc3RkOjp1bm9yZGVyZWRfbWFwPGludDMyX3QsIGRvdWJsZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICByZXN1bHQuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHJlc3VsdC5lbmQoKTsgKytpdCkgeworICAgICAgRVhQRUNUX0VRKG1lc3NhZ2UubWFwX2ludDMyX2RvdWJsZSgpLmF0KGl0LT5maXJzdCksIGl0LT5zZWNvbmQpOworICAgIH0KKyAgfQorCisgIHsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHJlc3VsdDsKKyAgICBmb3IgKFJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT46Oml0ZXJhdG9yIGl0ID0gbWZfc3RyaW5nX3N0cmluZy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbWZfc3RyaW5nX3N0cmluZy5lbmQoKTsgKytpdCkgeworICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSA9ICppdDsKKyAgICAgIHN0ZDo6c3RyaW5nIGtleSA9CisgICAgICAgICAgbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldFN0cmluZyhtZXNzYWdlLCBmZF9tYXBfc3RyaW5nX3N0cmluZ19rZXkpOworICAgICAgc3RkOjpzdHJpbmcgdmFsdWUgPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0U3RyaW5nKAorICAgICAgICAgIG1lc3NhZ2UsIGZkX21hcF9zdHJpbmdfc3RyaW5nX3ZhbHVlKTsKKyAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7CisgICAgICArK2luZGV4OworICAgIH0KKyAgICBFWFBFQ1RfRVEoMTAsIGluZGV4KTsKKyAgICBmb3IgKHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgcmVzdWx0LmJlZ2luKCk7CisgICAgICAgICBpdCAhPSByZXN1bHQuZW5kKCk7ICsraXQpIHsKKyAgICAgIEVYUEVDVF9FUShtZXNzYWdlLm1hcF9zdHJpbmdfc3RyaW5nKCkuYXQoaXQtPmZpcnN0KSwgaXQtPnNlY29uZCk7CisgICAgfQorICB9CisKKyAgeworICAgIGludCBpbmRleCA9IDA7CisgICAgc3RkOjptYXA8aW50MzJfdCwgRm9yZWlnbk1lc3NhZ2U+IHJlc3VsdDsKKyAgICBmb3IgKFJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT46Oml0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICBtZl9pbnQzMl9mb3JlaWduX21lc3NhZ2UuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1mX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5lbmQoKTsgKytpdCkgeworICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSA9ICppdDsKKyAgICAgIGludDMyX3Qga2V5ID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgIG1lc3NhZ2UsIGZkX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2Vfa2V5KTsKKyAgICAgIGNvbnN0IEZvcmVpZ25NZXNzYWdlJiBzdWJfbWVzc2FnZSA9CisgICAgICAgICAgZG93bl9jYXN0PGNvbnN0IEZvcmVpZ25NZXNzYWdlJj4obWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldE1lc3NhZ2UoCisgICAgICAgICAgICAgIG1lc3NhZ2UsIGZkX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VfdmFsdWUpKTsKKyAgICAgIHJlc3VsdFtrZXldLk1lcmdlRnJvbShzdWJfbWVzc2FnZSk7CisgICAgICArK2luZGV4OworICAgIH0KKyAgICBFWFBFQ1RfRVEoMTAsIGluZGV4KTsKKyAgICBmb3IgKHN0ZDo6bWFwPGludDMyX3QsIEZvcmVpZ25NZXNzYWdlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZXN1bHQuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHJlc3VsdC5lbmQoKTsgKytpdCkgeworICAgICAgRVhQRUNUX0VRKG1lc3NhZ2UubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpLmF0KGl0LT5maXJzdCkuYygpLAorICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuYygpKTsKKyAgICB9CisgIH0KKworICAvLyBUZXN0IE11dGFibGVSZXBlYXRlZEZpZWxkUmVmOjpBZGQoKQorICBlbnRyeV9pbnQzMl9pbnQzMi0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMigKKyAgICAgIGVudHJ5X2ludDMyX2ludDMyLmdldCgpLCBmZF9tYXBfaW50MzJfaW50MzItPm1lc3NhZ2VfdHlwZSgpLT5maWVsZCgwKSwKKyAgICAgIDQzMjEpOworICBlbnRyeV9pbnQzMl9pbnQzMi0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMigKKyAgICAgIGVudHJ5X2ludDMyX2ludDMyLmdldCgpLCBmZF9tYXBfaW50MzJfaW50MzItPm1lc3NhZ2VfdHlwZSgpLT5maWVsZCgxKSwKKyAgICAgIDEyMzQpOworICBtbWZfaW50MzJfaW50MzIuQWRkKCplbnRyeV9pbnQzMl9pbnQzMik7CisgIEVYUEVDVF9FUSgxMjM0LCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmF0KDQzMjEpKTsKKworICBlbnRyeV9pbnQzMl9kb3VibGUtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoCisgICAgICBlbnRyeV9pbnQzMl9kb3VibGUuZ2V0KCksIGZkX21hcF9pbnQzMl9kb3VibGUtPm1lc3NhZ2VfdHlwZSgpLT5maWVsZCgwKSwKKyAgICAgIDQzMjEpOworICBlbnRyeV9pbnQzMl9kb3VibGUtPkdldFJlZmxlY3Rpb24oKS0+U2V0RG91YmxlKAorICAgICAgZW50cnlfaW50MzJfZG91YmxlLmdldCgpLCBmZF9tYXBfaW50MzJfZG91YmxlLT5tZXNzYWdlX3R5cGUoKS0+ZmllbGQoMSksCisgICAgICAxMjM0LjApOworICBtbWZfaW50MzJfZG91YmxlLkFkZCgqZW50cnlfaW50MzJfZG91YmxlKTsKKyAgRVhQRUNUX0VRKDEyMzQuMCwgbWVzc2FnZS5tYXBfaW50MzJfZG91YmxlKCkuYXQoNDMyMSkpOworCisgIGVudHJ5X3N0cmluZ19zdHJpbmctPkdldFJlZmxlY3Rpb24oKS0+U2V0U3RyaW5nKAorICAgICAgZW50cnlfc3RyaW5nX3N0cmluZy5nZXQoKSwgZmRfbWFwX3N0cmluZ19zdHJpbmctPm1lc3NhZ2VfdHlwZSgpLT5maWVsZCgwKSwKKyAgICAgICI0MzIxIik7CisgIGVudHJ5X3N0cmluZ19zdHJpbmctPkdldFJlZmxlY3Rpb24oKS0+U2V0U3RyaW5nKAorICAgICAgZW50cnlfc3RyaW5nX3N0cmluZy5nZXQoKSwgZmRfbWFwX3N0cmluZ19zdHJpbmctPm1lc3NhZ2VfdHlwZSgpLT5maWVsZCgxKSwKKyAgICAgICIxMjM0Iik7CisgIG1tZl9zdHJpbmdfc3RyaW5nLkFkZCgqZW50cnlfc3RyaW5nX3N0cmluZyk7CisgIEVYUEVDVF9FUSgiMTIzNCIsIG1lc3NhZ2UubWFwX3N0cmluZ19zdHJpbmcoKS5hdCgiNDMyMSIpKTsKKworICBlbnRyeV9pbnQzMl9mb3JlaWduX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoCisgICAgICBlbnRyeV9pbnQzMl9mb3JlaWduX21lc3NhZ2UuZ2V0KCksCisgICAgICBmZF9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlLT5tZXNzYWdlX3R5cGUoKS0+ZmllbGQoMCksIDQzMjEpOworICBNZXNzYWdlKiB2YWx1ZV9tZXNzYWdlID0KKyAgICAgIGVudHJ5X2ludDMyX2ZvcmVpZ25fbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5NdXRhYmxlTWVzc2FnZSgKKyAgICAgICAgICBlbnRyeV9pbnQzMl9mb3JlaWduX21lc3NhZ2UuZ2V0KCksCisgICAgICAgICAgZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS0+bWVzc2FnZV90eXBlKCktPmZpZWxkKDEpKTsKKyAgRm9yZWlnbk1lc3NhZ2UgZm9yZWlnbl9tZXNzYWdlOworICBmb3JlaWduX21lc3NhZ2Uuc2V0X2MoMTIzNCk7CisgIHZhbHVlX21lc3NhZ2UtPkNvcHlGcm9tKGZvcmVpZ25fbWVzc2FnZSk7CisKKyAgbW1mX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5BZGQoKmVudHJ5X2ludDMyX2ZvcmVpZ25fbWVzc2FnZSk7CisgIEVYUEVDVF9FUSgxMjM0LCBtZXNzYWdlLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKS5hdCg0MzIxKS5jKCkpOworCisgIC8vIFRlc3QgUmVmbGVjdGlvbjo6QWRkQWxsb2NhdGVkTWVzc2FnZQorICBNZXNzYWdlKiBmcmVlX2VudHJ5X3N0cmluZ19zdHJpbmcgPQorICAgICAgTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCkKKyAgICAgICAgICAtPkdldFByb3RvdHlwZShmZF9tYXBfc3RyaW5nX3N0cmluZy0+bWVzc2FnZV90eXBlKCkpCisgICAgICAgICAgLT5OZXcoKTsKKyAgZW50cnlfc3RyaW5nX3N0cmluZy0+R2V0UmVmbGVjdGlvbigpLT5TZXRTdHJpbmcoCisgICAgICBmcmVlX2VudHJ5X3N0cmluZ19zdHJpbmcsIGZkX21hcF9zdHJpbmdfc3RyaW5nLT5tZXNzYWdlX3R5cGUoKS0+ZmllbGQoMCksCisgICAgICAiNDMyMSIpOworICBlbnRyeV9zdHJpbmdfc3RyaW5nLT5HZXRSZWZsZWN0aW9uKCktPlNldFN0cmluZygKKyAgICAgIGZyZWVfZW50cnlfc3RyaW5nX3N0cmluZywgZmRfbWFwX3N0cmluZ19zdHJpbmctPm1lc3NhZ2VfdHlwZSgpLT5maWVsZCgxKSwKKyAgICAgICIxMjM0Iik7CisgIHJlZmwtPkFkZEFsbG9jYXRlZE1lc3NhZ2UoJm1lc3NhZ2UsIGZkX21hcF9zdHJpbmdfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfZW50cnlfc3RyaW5nX3N0cmluZyk7CisKKyAgLy8gVGVzdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjo6UmVtb3ZlTGFzdCgpCisgIG1tZl9pbnQzMl9pbnQzMi5SZW1vdmVMYXN0KCk7CisgIG1tZl9pbnQzMl9kb3VibGUuUmVtb3ZlTGFzdCgpOworICBtbWZfc3RyaW5nX3N0cmluZy5SZW1vdmVMYXN0KCk7CisgIG1tZl9pbnQzMl9mb3JlaWduX21lc3NhZ2UuUmVtb3ZlTGFzdCgpOworICBFWFBFQ1RfRVEoMTAsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEwLCBtZXNzYWdlLm1hcF9pbnQzMl9kb3VibGUoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMTEsIG1lc3NhZ2UubWFwX3N0cmluZ19zdHJpbmcoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMTAsIG1lc3NhZ2UubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpLnNpemUoKSk7CisKKyAgLy8gVGVzdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjo6U3dhcEVsZW1lbnRzKCkKKyAgeworICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UwYSA9IG1tZl9pbnQzMl9pbnQzMi5HZXQoMCwgZW50cnlfaW50MzJfaW50MzIuZ2V0KCkpOworICAgIGludDMyX3QgaW50MzJfdmFsdWUwYSA9CisgICAgICAgIG1lc3NhZ2UwYS5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKG1lc3NhZ2UwYSwgZmRfbWFwX2ludDMyX2luMzJfdmFsdWUpOworICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2U5YSA9IG1tZl9pbnQzMl9pbnQzMi5HZXQoOSwgZW50cnlfaW50MzJfaW50MzIuZ2V0KCkpOworICAgIGludDMyX3QgaW50MzJfdmFsdWU5YSA9CisgICAgICAgIG1lc3NhZ2U5YS5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKG1lc3NhZ2U5YSwgZmRfbWFwX2ludDMyX2luMzJfdmFsdWUpOworCisgICAgbW1mX2ludDMyX2ludDMyLlN3YXBFbGVtZW50cygwLCA5KTsKKworICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UwYiA9IG1tZl9pbnQzMl9pbnQzMi5HZXQoMCwgZW50cnlfaW50MzJfaW50MzIuZ2V0KCkpOworICAgIGludDMyX3QgaW50MzJfdmFsdWUwYiA9CisgICAgICAgIG1lc3NhZ2UwYi5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKG1lc3NhZ2UwYiwgZmRfbWFwX2ludDMyX2luMzJfdmFsdWUpOworICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2U5YiA9IG1tZl9pbnQzMl9pbnQzMi5HZXQoOSwgZW50cnlfaW50MzJfaW50MzIuZ2V0KCkpOworICAgIGludDMyX3QgaW50MzJfdmFsdWU5YiA9CisgICAgICAgIG1lc3NhZ2U5Yi5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKG1lc3NhZ2U5YiwgZmRfbWFwX2ludDMyX2luMzJfdmFsdWUpOworCisgICAgRVhQRUNUX0VRKGludDMyX3ZhbHVlOWEsIGludDMyX3ZhbHVlMGIpOworICAgIEVYUEVDVF9FUShpbnQzMl92YWx1ZTBhLCBpbnQzMl92YWx1ZTliKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMGEgPQorICAgICAgICBtbWZfaW50MzJfZG91YmxlLkdldCgwLCBlbnRyeV9pbnQzMl9kb3VibGUuZ2V0KCkpOworICAgIGRvdWJsZSBkb3VibGVfdmFsdWUwYSA9IG1lc3NhZ2UwYS5HZXRSZWZsZWN0aW9uKCktPkdldERvdWJsZSgKKyAgICAgICAgbWVzc2FnZTBhLCBmZF9tYXBfaW50MzJfZG91YmxlX3ZhbHVlKTsKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlOWEgPQorICAgICAgICBtbWZfaW50MzJfZG91YmxlLkdldCg5LCBlbnRyeV9pbnQzMl9kb3VibGUuZ2V0KCkpOworICAgIGRvdWJsZSBkb3VibGVfdmFsdWU5YSA9IG1lc3NhZ2U5YS5HZXRSZWZsZWN0aW9uKCktPkdldERvdWJsZSgKKyAgICAgICAgbWVzc2FnZTlhLCBmZF9tYXBfaW50MzJfZG91YmxlX3ZhbHVlKTsKKworICAgIG1tZl9pbnQzMl9kb3VibGUuU3dhcEVsZW1lbnRzKDAsIDkpOworCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTBiID0KKyAgICAgICAgbW1mX2ludDMyX2RvdWJsZS5HZXQoMCwgZW50cnlfaW50MzJfZG91YmxlLmdldCgpKTsKKyAgICBkb3VibGUgZG91YmxlX3ZhbHVlMGIgPSBtZXNzYWdlMGIuR2V0UmVmbGVjdGlvbigpLT5HZXREb3VibGUoCisgICAgICAgIG1lc3NhZ2UwYiwgZmRfbWFwX2ludDMyX2RvdWJsZV92YWx1ZSk7CisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTliID0KKyAgICAgICAgbW1mX2ludDMyX2RvdWJsZS5HZXQoOSwgZW50cnlfaW50MzJfZG91YmxlLmdldCgpKTsKKyAgICBkb3VibGUgZG91YmxlX3ZhbHVlOWIgPSBtZXNzYWdlOWIuR2V0UmVmbGVjdGlvbigpLT5HZXREb3VibGUoCisgICAgICAgIG1lc3NhZ2U5YiwgZmRfbWFwX2ludDMyX2RvdWJsZV92YWx1ZSk7CisKKyAgICBFWFBFQ1RfRVEoZG91YmxlX3ZhbHVlOWEsIGRvdWJsZV92YWx1ZTBiKTsKKyAgICBFWFBFQ1RfRVEoZG91YmxlX3ZhbHVlMGEsIGRvdWJsZV92YWx1ZTliKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMGEgPQorICAgICAgICBtbWZfc3RyaW5nX3N0cmluZy5HZXQoMCwgZW50cnlfc3RyaW5nX3N0cmluZy5nZXQoKSk7CisgICAgc3RkOjpzdHJpbmcgc3RyaW5nX3ZhbHVlMGEgPSBtZXNzYWdlMGEuR2V0UmVmbGVjdGlvbigpLT5HZXRTdHJpbmcoCisgICAgICAgIG1lc3NhZ2UwYSwgZmRfbWFwX3N0cmluZ19zdHJpbmdfdmFsdWUpOworICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2U5YSA9CisgICAgICAgIG1tZl9zdHJpbmdfc3RyaW5nLkdldCg5LCBlbnRyeV9zdHJpbmdfc3RyaW5nLmdldCgpKTsKKyAgICBzdGQ6OnN0cmluZyBzdHJpbmdfdmFsdWU5YSA9IG1lc3NhZ2U5YS5HZXRSZWZsZWN0aW9uKCktPkdldFN0cmluZygKKyAgICAgICAgbWVzc2FnZTlhLCBmZF9tYXBfc3RyaW5nX3N0cmluZ192YWx1ZSk7CisKKyAgICBtbWZfc3RyaW5nX3N0cmluZy5Td2FwRWxlbWVudHMoMCwgOSk7CisKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMGIgPQorICAgICAgICBtbWZfc3RyaW5nX3N0cmluZy5HZXQoMCwgZW50cnlfc3RyaW5nX3N0cmluZy5nZXQoKSk7CisgICAgc3RkOjpzdHJpbmcgc3RyaW5nX3ZhbHVlMGIgPSBtZXNzYWdlMGIuR2V0UmVmbGVjdGlvbigpLT5HZXRTdHJpbmcoCisgICAgICAgIG1lc3NhZ2UwYiwgZmRfbWFwX3N0cmluZ19zdHJpbmdfdmFsdWUpOworICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2U5YiA9CisgICAgICAgIG1tZl9zdHJpbmdfc3RyaW5nLkdldCg5LCBlbnRyeV9zdHJpbmdfc3RyaW5nLmdldCgpKTsKKyAgICBzdGQ6OnN0cmluZyBzdHJpbmdfdmFsdWU5YiA9IG1lc3NhZ2U5Yi5HZXRSZWZsZWN0aW9uKCktPkdldFN0cmluZygKKyAgICAgICAgbWVzc2FnZTliLCBmZF9tYXBfc3RyaW5nX3N0cmluZ192YWx1ZSk7CisKKyAgICBFWFBFQ1RfRVEoc3RyaW5nX3ZhbHVlOWEsIHN0cmluZ192YWx1ZTBiKTsKKyAgICBFWFBFQ1RfRVEoc3RyaW5nX3ZhbHVlMGEsIHN0cmluZ192YWx1ZTliKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMGEgPQorICAgICAgICBtbWZfaW50MzJfZm9yZWlnbl9tZXNzYWdlLkdldCgwLCBlbnRyeV9pbnQzMl9mb3JlaWduX21lc3NhZ2UuZ2V0KCkpOworICAgIGNvbnN0IEZvcmVpZ25NZXNzYWdlJiBzdWJfbWVzc2FnZTBhID0KKyAgICAgICAgZG93bl9jYXN0PGNvbnN0IEZvcmVpZ25NZXNzYWdlJj4obWVzc2FnZTBhLkdldFJlZmxlY3Rpb24oKS0+R2V0TWVzc2FnZSgKKyAgICAgICAgICAgIG1lc3NhZ2UwYSwgZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZV92YWx1ZSkpOworICAgIGludDMyX3QgaW50MzJfdmFsdWUwYSA9IHN1Yl9tZXNzYWdlMGEuYygpOworICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2U5YSA9CisgICAgICAgIG1tZl9pbnQzMl9mb3JlaWduX21lc3NhZ2UuR2V0KDksIGVudHJ5X2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5nZXQoKSk7CisgICAgY29uc3QgRm9yZWlnbk1lc3NhZ2UmIHN1Yl9tZXNzYWdlOWEgPQorICAgICAgICBkb3duX2Nhc3Q8Y29uc3QgRm9yZWlnbk1lc3NhZ2UmPihtZXNzYWdlOWEuR2V0UmVmbGVjdGlvbigpLT5HZXRNZXNzYWdlKAorICAgICAgICAgICAgbWVzc2FnZTlhLCBmZF9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlX3ZhbHVlKSk7CisgICAgaW50MzJfdCBpbnQzMl92YWx1ZTlhID0gc3ViX21lc3NhZ2U5YS5jKCk7CisKKyAgICBtbWZfaW50MzJfZm9yZWlnbl9tZXNzYWdlLlN3YXBFbGVtZW50cygwLCA5KTsKKworICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UwYiA9CisgICAgICAgIG1tZl9pbnQzMl9mb3JlaWduX21lc3NhZ2UuR2V0KDAsIGVudHJ5X2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5nZXQoKSk7CisgICAgY29uc3QgRm9yZWlnbk1lc3NhZ2UmIHN1Yl9tZXNzYWdlMGIgPQorICAgICAgICBkb3duX2Nhc3Q8Y29uc3QgRm9yZWlnbk1lc3NhZ2UmPihtZXNzYWdlMGIuR2V0UmVmbGVjdGlvbigpLT5HZXRNZXNzYWdlKAorICAgICAgICAgICAgbWVzc2FnZTBiLCBmZF9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlX3ZhbHVlKSk7CisgICAgaW50MzJfdCBpbnQzMl92YWx1ZTBiID0gc3ViX21lc3NhZ2UwYi5jKCk7CisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTliID0KKyAgICAgICAgbW1mX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5HZXQoOSwgZW50cnlfaW50MzJfZm9yZWlnbl9tZXNzYWdlLmdldCgpKTsKKyAgICBjb25zdCBGb3JlaWduTWVzc2FnZSYgc3ViX21lc3NhZ2U5YiA9CisgICAgICAgIGRvd25fY2FzdDxjb25zdCBGb3JlaWduTWVzc2FnZSY+KG1lc3NhZ2U5Yi5HZXRSZWZsZWN0aW9uKCktPkdldE1lc3NhZ2UoCisgICAgICAgICAgICBtZXNzYWdlOWIsIGZkX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VfdmFsdWUpKTsKKyAgICBpbnQzMl90IGludDMyX3ZhbHVlOWIgPSBzdWJfbWVzc2FnZTliLmMoKTsKKworICAgIEVYUEVDVF9FUShpbnQzMl92YWx1ZTlhLCBpbnQzMl92YWx1ZTBiKTsKKyAgICBFWFBFQ1RfRVEoaW50MzJfdmFsdWUwYSwgaW50MzJfdmFsdWU5Yik7CisgIH0KKworICAvLyBUT0RPKGIvMTgxMTQ4Njc0KTogQWZ0ZXIgc3VwcG9ydGluZyBhcmVuYSBhZ25vc3RpYyBkZWxldGUgb3IgbGV0IG1hcCBlbnRyeQorICAvLyBoYW5kbGUgaGVhcCBhbGxvY2F0aW9uLCB0aGlzIGNvdWxkIGJlIHJlbW92ZWQuCisgIGlmIChtZXNzYWdlLkdldEFyZW5hKCkgIT0gbnVsbHB0cikgeworICAgIGVudHJ5X2ludDMyX2ludDMyLnJlbGVhc2UoKTsKKyAgICBlbnRyeV9pbnQzMl9kb3VibGUucmVsZWFzZSgpOworICAgIGVudHJ5X3N0cmluZ19zdHJpbmcucmVsZWFzZSgpOworICAgIGVudHJ5X2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5yZWxlYXNlKCk7CisgIH0KK30KKworVEVTVF9GKE1hcEZpZWxkUmVmbGVjdGlvblRlc3QsIFJlcGVhdGVkRmllbGRSZWZNZXJnZUZyb21BbmRTd2FwKSB7CisgIC8vIFNldC11cCBtZXNzYWdlIGNvbnRlbnQuCisgIFRlc3RNYXAgbTAsIG0xLCBtMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgKCptMC5tdXRhYmxlX21hcF9pbnQzMl9pbnQzMigpKVtpXSA9IEZ1bmMoaSwgMSk7CisgICAgKCptMC5tdXRhYmxlX21hcF9pbnQzMl9kb3VibGUoKSlbaV0gPSBGdW5jKGksIDIpOworICAgICgqbTAubXV0YWJsZV9tYXBfc3RyaW5nX3N0cmluZygpKVtTdHJGdW5jKGksIDEpXSA9IFN0ckZ1bmMoaSwgNSk7CisgICAgKCptMC5tdXRhYmxlX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKSlbaV0uc2V0X2MoRnVuYyhpLCA2KSk7CisgICAgKCptMS5tdXRhYmxlX21hcF9pbnQzMl9pbnQzMigpKVtpICsgMTBdID0gRnVuYyhpLCAxMSk7CisgICAgKCptMS5tdXRhYmxlX21hcF9pbnQzMl9kb3VibGUoKSlbaSArIDEwXSA9IEZ1bmMoaSwgMTIpOworICAgICgqbTEubXV0YWJsZV9tYXBfc3RyaW5nX3N0cmluZygpKVtTdHJGdW5jKGkgKyAxMCwgMSldID0gU3RyRnVuYyhpLCAxNSk7CisgICAgKCptMS5tdXRhYmxlX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKSlbaSArIDEwXS5zZXRfYyhGdW5jKGksIDE2KSk7CisgICAgKCptMi5tdXRhYmxlX21hcF9pbnQzMl9pbnQzMigpKVtpICsgMjBdID0gRnVuYyhpLCAyMSk7CisgICAgKCptMi5tdXRhYmxlX21hcF9pbnQzMl9kb3VibGUoKSlbaSArIDIwXSA9IEZ1bmMoaSwgMjIpOworICAgICgqbTIubXV0YWJsZV9tYXBfc3RyaW5nX3N0cmluZygpKVtTdHJGdW5jKGkgKyAyMCwgMSldID0gU3RyRnVuYyhpLCAyNSk7CisgICAgKCptMi5tdXRhYmxlX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKSlbaSArIDIwXS5zZXRfYyhGdW5jKGksIDI2KSk7CisgIH0KKworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsID0gbTAuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjID0gbTAuR2V0RGVzY3JpcHRvcigpOworCisgIC8vIEdldCBGaWVsZERlc2NyaXB0b3JzIGZvciBhbGwgdGhlIGZpZWxkcyBvZiBpbnRlcmVzdC4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9tYXBfaW50MzJfaW50MzIgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJtYXBfaW50MzJfaW50MzIiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9tYXBfaW50MzJfZG91YmxlID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgibWFwX2ludDMyX2RvdWJsZSIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkX21hcF9zdHJpbmdfc3RyaW5nID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgibWFwX3N0cmluZ19zdHJpbmciKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgibWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSIpOworCisgIC8vIEdldCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZiBvYmplY3RzIGZvciBhbGwgZmllbGRzIG9mIGludGVyZXN0LgorICBjb25zdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPiBtbWZfaW50MzJfaW50MzIgPQorICAgICAgcmVmbC0+R2V0TXV0YWJsZVJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT4oJm0wLCBmZF9tYXBfaW50MzJfaW50MzIpOworICBjb25zdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPiBtbWZfaW50MzJfZG91YmxlID0KKyAgICAgIHJlZmwtPkdldE11dGFibGVSZXBlYXRlZEZpZWxkUmVmPE1lc3NhZ2U+KCZtMCwgZmRfbWFwX2ludDMyX2RvdWJsZSk7CisgIGNvbnN0IE11dGFibGVSZXBlYXRlZEZpZWxkUmVmPE1lc3NhZ2U+IG1tZl9zdHJpbmdfc3RyaW5nID0KKyAgICAgIHJlZmwtPkdldE11dGFibGVSZXBlYXRlZEZpZWxkUmVmPE1lc3NhZ2U+KCZtMCwgZmRfbWFwX3N0cmluZ19zdHJpbmcpOworICBjb25zdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPiBtbWZfaW50MzJfZm9yZWlnbl9tZXNzYWdlID0KKyAgICAgIHJlZmwtPkdldE11dGFibGVSZXBlYXRlZEZpZWxkUmVmPE1lc3NhZ2U+KCZtMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UpOworCisgIC8vIFRlc3QgTXV0YWJsZVJlcGVhdGVkUmVmOjpDb3B5RnJvbQorICBtbWZfaW50MzJfaW50MzIuQ29weUZyb20oCisgICAgICByZWZsLT5HZXRSZXBlYXRlZEZpZWxkUmVmPE1lc3NhZ2U+KG0xLCBmZF9tYXBfaW50MzJfaW50MzIpKTsKKyAgbW1mX2ludDMyX2RvdWJsZS5Db3B5RnJvbSgKKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT4obTEsIGZkX21hcF9pbnQzMl9kb3VibGUpKTsKKyAgbW1mX3N0cmluZ19zdHJpbmcuQ29weUZyb20oCisgICAgICByZWZsLT5HZXRSZXBlYXRlZEZpZWxkUmVmPE1lc3NhZ2U+KG0xLCBmZF9tYXBfc3RyaW5nX3N0cmluZykpOworICBtbWZfaW50MzJfZm9yZWlnbl9tZXNzYWdlLkNvcHlGcm9tKAorICAgICAgcmVmbC0+R2V0UmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPihtMSwgZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIEVYUEVDVF9FUShGdW5jKGksIDExKSwgbTAubWFwX2ludDMyX2ludDMyKCkuYXQoaSArIDEwKSk7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgMTIpLCBtMC5tYXBfaW50MzJfZG91YmxlKCkuYXQoaSArIDEwKSk7CisgICAgRVhQRUNUX0VRKFN0ckZ1bmMoaSwgMTUpLCBtMC5tYXBfc3RyaW5nX3N0cmluZygpLmF0KFN0ckZ1bmMoaSArIDEwLCAxKSkpOworICAgIEVYUEVDVF9FUShGdW5jKGksIDE2KSwgbTAubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpLmF0KGkgKyAxMCkuYygpKTsKKyAgfQorCisgIC8vIFRlc3QgTXV0YWJsZVJlcGVhdGVkUmVmOjpNZXJnZUZyb20KKyAgbW1mX2ludDMyX2ludDMyLk1lcmdlRnJvbSgKKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT4obTIsIGZkX21hcF9pbnQzMl9pbnQzMikpOworICBtbWZfaW50MzJfZG91YmxlLk1lcmdlRnJvbSgKKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT4obTIsIGZkX21hcF9pbnQzMl9kb3VibGUpKTsKKyAgbW1mX3N0cmluZ19zdHJpbmcuTWVyZ2VGcm9tKAorICAgICAgcmVmbC0+R2V0UmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPihtMiwgZmRfbWFwX3N0cmluZ19zdHJpbmcpKTsKKyAgbW1mX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5NZXJnZUZyb20oCisgICAgICByZWZsLT5HZXRSZXBlYXRlZEZpZWxkUmVmPE1lc3NhZ2U+KG0yLCBmZF9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIEVYUEVDVF9FUShGdW5jKGksIDIxKSwgbTAubWFwX2ludDMyX2ludDMyKCkuYXQoaSArIDIwKSk7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgMjIpLCBtMC5tYXBfaW50MzJfZG91YmxlKCkuYXQoaSArIDIwKSk7CisgICAgRVhQRUNUX0VRKFN0ckZ1bmMoaSwgMjUpLCBtMC5tYXBfc3RyaW5nX3N0cmluZygpLmF0KFN0ckZ1bmMoaSArIDIwLCAxKSkpOworICAgIEVYUEVDVF9FUShGdW5jKGksIDI2KSwgbTAubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpLmF0KGkgKyAyMCkuYygpKTsKKyAgfQorCisgIC8vIFRlc3QgTXV0YWJsZVJlcGVhdGVkUmVmOjpTd2FwCisgIC8vIFN3YXAgYmV0d2VlbiBtMCBhbmQgbTIuCisgIG1tZl9pbnQzMl9pbnQzMi5Td2FwKAorICAgICAgcmVmbC0+R2V0TXV0YWJsZVJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT4oJm0yLCBmZF9tYXBfaW50MzJfaW50MzIpKTsKKyAgbW1mX2ludDMyX2RvdWJsZS5Td2FwKAorICAgICAgcmVmbC0+R2V0TXV0YWJsZVJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT4oJm0yLCBmZF9tYXBfaW50MzJfZG91YmxlKSk7CisgIG1tZl9zdHJpbmdfc3RyaW5nLlN3YXAoCisgICAgICByZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPigmbTIsIGZkX21hcF9zdHJpbmdfc3RyaW5nKSk7CisgIG1tZl9pbnQzMl9mb3JlaWduX21lc3NhZ2UuU3dhcChyZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPigKKyAgICAgICZtMiwgZmRfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSkpOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAvLyBDaGVjayB0aGUgY29udGVudCBvZiBtMC4KKyAgICBFWFBFQ1RfRVEoRnVuYyhpLCAyMSksIG0wLm1hcF9pbnQzMl9pbnQzMigpLmF0KGkgKyAyMCkpOworICAgIEVYUEVDVF9FUShGdW5jKGksIDIyKSwgbTAubWFwX2ludDMyX2RvdWJsZSgpLmF0KGkgKyAyMCkpOworICAgIEVYUEVDVF9FUShTdHJGdW5jKGksIDI1KSwgbTAubWFwX3N0cmluZ19zdHJpbmcoKS5hdChTdHJGdW5jKGkgKyAyMCwgMSkpKTsKKyAgICBFWFBFQ1RfRVEoRnVuYyhpLCAyNiksIG0wLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKS5hdChpICsgMjApLmMoKSk7CisKKyAgICAvLyBDaGVjayB0aGUgY29udGVudCBvZiBtMi4KKyAgICBFWFBFQ1RfRVEoRnVuYyhpLCAxMSksIG0yLm1hcF9pbnQzMl9pbnQzMigpLmF0KGkgKyAxMCkpOworICAgIEVYUEVDVF9FUShGdW5jKGksIDEyKSwgbTIubWFwX2ludDMyX2RvdWJsZSgpLmF0KGkgKyAxMCkpOworICAgIEVYUEVDVF9FUShTdHJGdW5jKGksIDE1KSwgbTIubWFwX3N0cmluZ19zdHJpbmcoKS5hdChTdHJGdW5jKGkgKyAxMCwgMSkpKTsKKyAgICBFWFBFQ1RfRVEoRnVuYyhpLCAxNiksIG0yLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKS5hdChpICsgMTApLmMoKSk7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgMjEpLCBtMi5tYXBfaW50MzJfaW50MzIoKS5hdChpICsgMjApKTsKKyAgICBFWFBFQ1RfRVEoRnVuYyhpLCAyMiksIG0yLm1hcF9pbnQzMl9kb3VibGUoKS5hdChpICsgMjApKTsKKyAgICBFWFBFQ1RfRVEoU3RyRnVuYyhpLCAyNSksIG0yLm1hcF9zdHJpbmdfc3RyaW5nKCkuYXQoU3RyRnVuYyhpICsgMjAsIDEpKSk7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgMjYpLCBtMi5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKCkuYXQoaSArIDIwKS5jKCkpOworICB9CisKKyAgLy8gVE9ETyh0ZWJvcmluZyk6IGFkZCB0ZXN0IGZvciBkdXBsaWNhdGVkIGtleQorfQorCitURVNUX0YoTWFwRmllbGRSZWZsZWN0aW9uVGVzdCwgTWFwU2l6ZVdpdGhEdXBsaWNhdGVkS2V5KSB7CisgIC8vIER5bmFtaWMgTWVzc2FnZQorICB7CisgICAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGZhY3Rvcnk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UoCisgICAgICAgIGZhY3RvcnkuR2V0UHJvdG90eXBlKFVOSVRURVNUOjpUZXN0TWFwOjpkZXNjcmlwdG9yKCkpLT5OZXcoKSk7CisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KKyAgICAgICAgVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJtYXBfaW50MzJfaW50MzIiKTsKKworICAgIE1lc3NhZ2UqIGVudHJ5MSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZS5nZXQoKSwgZmllbGQpOworICAgIE1lc3NhZ2UqIGVudHJ5MiA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZS5nZXQoKSwgZmllbGQpOworCisgICAgY29uc3QgUmVmbGVjdGlvbiogZW50cnlfcmVmbGVjdGlvbiA9IGVudHJ5MS0+R2V0UmVmbGVjdGlvbigpOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5X2ZpZWxkID0gZW50cnkxLT5HZXREZXNjcmlwdG9yKCktPm1hcF9rZXkoKTsKKyAgICBlbnRyeV9yZWZsZWN0aW9uLT5TZXRJbnQzMihlbnRyeTEsIGtleV9maWVsZCwgMSk7CisgICAgZW50cnlfcmVmbGVjdGlvbi0+U2V0SW50MzIoZW50cnkyLCBrZXlfZmllbGQsIDEpOworCisgICAgRVhQRUNUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgZmllbGQpKTsKKyAgICBFWFBFQ1RfRVEoMSwgTWFwU2l6ZShyZWZsZWN0aW9uLCBmaWVsZCwgKm1lc3NhZ2UpKTsKKyAgICBFWFBFQ1RfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKCptZXNzYWdlLCBmaWVsZCkpOworICB9CisKKyAgLy8gR2VuZXJhdGVkIE1lc3NhZ2UKKyAgeworICAgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2U7CisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPQorICAgICAgICBtZXNzYWdlLkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJtYXBfaW50MzJfaW50MzIiKTsKKworICAgIE1lc3NhZ2UqIGVudHJ5MSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UoJm1lc3NhZ2UsIGZpZWxkKTsKKyAgICBNZXNzYWdlKiBlbnRyeTIgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKCZtZXNzYWdlLCBmaWVsZCk7CisKKyAgICBjb25zdCBSZWZsZWN0aW9uKiBlbnRyeV9yZWZsZWN0aW9uID0gZW50cnkxLT5HZXRSZWZsZWN0aW9uKCk7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBrZXlfZmllbGQgPSBlbnRyeTEtPkdldERlc2NyaXB0b3IoKS0+bWFwX2tleSgpOworICAgIGVudHJ5X3JlZmxlY3Rpb24tPlNldEludDMyKGVudHJ5MSwga2V5X2ZpZWxkLCAxKTsKKyAgICBlbnRyeV9yZWZsZWN0aW9uLT5TZXRJbnQzMihlbnRyeTIsIGtleV9maWVsZCwgMSk7CisKKyAgICBFWFBFQ1RfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkKSk7CisgICAgRVhQRUNUX0VRKDEsIE1hcFNpemUocmVmbGVjdGlvbiwgZmllbGQsIG1lc3NhZ2UpKTsKKyAgfQorfQorCitURVNUX0YoTWFwRmllbGRSZWZsZWN0aW9uVGVzdCwgVW5pbml0aWFsaXplZEVudHJ5KSB7CisgIFVOSVRURVNUOjpUZXN0UmVxdWlyZWRNZXNzYWdlTWFwIG1lc3NhZ2U7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9CisgICAgICBtZXNzYWdlLkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJtYXBfZmllbGQiKTsKKyAgYXV0byBlbnRyeSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UoJm1lc3NhZ2UsIGZpZWxkKTsKKyAgRVhQRUNUX0ZBTFNFKGVudHJ5LT5Jc0luaXRpYWxpemVkKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworfQorCitjbGFzcyBNeU1hcEVudHJ5CisgICAgOiBwdWJsaWMgaW50ZXJuYWw6Ok1hcEVudHJ5PE15TWFwRW50cnksIDo6aW50MzJfdCwgOjppbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4geworIHB1YmxpYzoKKyAgY29uc3RleHByIE15TWFwRW50cnkoKSB7fQorICBNeU1hcEVudHJ5KEFyZW5hKikgeyBzdGQ6OmFib3J0KCk7IH0KKyAgTWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBvdmVycmlkZSB7IHN0ZDo6YWJvcnQoKTsgfQorICBzdGF0aWMgYm9vbCBWYWxpZGF0ZUtleSh2b2lkKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgYm9vbCBWYWxpZGF0ZVZhbHVlKHZvaWQqKSB7IHJldHVybiB0cnVlOyB9Cit9OworCitjbGFzcyBNeU1hcEVudHJ5TGl0ZQorICAgIDogcHVibGljIGludGVybmFsOjpNYXBFbnRyeUxpdGU8TXlNYXBFbnRyeUxpdGUsIDo6aW50MzJfdCwgOjppbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPiB7CisgcHVibGljOgorICBjb25zdGV4cHIgTXlNYXBFbnRyeUxpdGUoKSB7fQorICBleHBsaWNpdCBNeU1hcEVudHJ5TGl0ZShBcmVuYSopIHsgc3RkOjphYm9ydCgpOyB9CisgIHN0YXRpYyBib29sIFZhbGlkYXRlS2V5KHZvaWQqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIFZhbGlkYXRlVmFsdWUodm9pZCopIHsgcmV0dXJuIHRydWU7IH0KK307CisKK1RFU1QoTWFwRW50cnlUZXN0LCBDb25zdEluaXQpIHsKKyAgLy8gVGhpcyB2ZXJpZmllcyB0aGF0IGBNYXBFbnRyeWAsIGBNYXBFbnRyeUxpdGVgIGFuZCBgTWFwRW50cnlJbXBsYCBjYW4gYmUKKyAgLy8gY29uc3RhbnQgaW5pdGlhbGl6ZWQuCisgIFBST1RPQlVGX0NPTlNUSU5JVCBzdGF0aWMgTXlNYXBFbnRyeSBlbnRyeXt9OworICBFWFBFQ1RfTkUoZW50cnkuU3BhY2VVc2VkKCksIDApOworCisgIFBST1RPQlVGX0NPTlNUSU5JVCBzdGF0aWMgTXlNYXBFbnRyeUxpdGUgZW50cnlfbGl0ZXt9OyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKGVudHJ5X2xpdGUuSXNJbml0aWFsaXplZCgpKTsKK30KKworLy8gR2VuZXJhdGVkIE1lc3NhZ2UgVGVzdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBBY2Nlc3NvcnMpIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTsKKworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlKTsKKyAgTWFwVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlKTsKKworICBNYXBUZXN0VXRpbDo6TW9kaWZ5TWFwRmllbGRzKCZtZXNzYWdlKTsKKyAgTWFwVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc01vZGlmaWVkKG1lc3NhZ2UpOworfQorCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgU2V0TWFwRmllbGRzSW5pdGlhbGl6ZWQpIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTsKKworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzSW5pdGlhbGl6ZWQoJm1lc3NhZ2UpOworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0SW5pdGlhbGl6ZWQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBQcm90bzJTZXRNYXBGaWVsZHNJbml0aWFsaXplZCkgeworICBVTklUVEVTVDo6VGVzdEVudW1NYXAgbWVzc2FnZTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpQUk9UTzJfTUFQX0VOVU1fRk9PLAorICAgICAgICAgICAgKCptZXNzYWdlLm11dGFibGVfa25vd25fbWFwX2ZpZWxkKCkpWzBdKTsKK30KKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFRlc3QsIENsZWFyKSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2U7CisKKyAgTWFwVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZSk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgTWFwVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UpOworfQorCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgQ2xlYXJNZXNzYWdlTWFwKSB7CisgIFVOSVRURVNUOjpUZXN0TWVzc2FnZU1hcCBtZXNzYWdlOworCisgIC8vIENyZWF0ZXMgYSBUZXN0QWxsVHlwZXMgd2l0aCBkZWZhdWx0IHZhbHVlCisgIFRlc3RVdGlsOjpFeHBlY3RDbGVhcigoKm1lc3NhZ2UubXV0YWJsZV9tYXBfaW50MzJfbWVzc2FnZSgpKVswXSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBDb3B5RnJvbSkgeworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgTWFwVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTEpOworICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMSk7CisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworCisgIC8vIENvcHlpbmcgZnJvbSBzZWxmIHNob3VsZCBiZSBhIG5vLW9wLgorICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMik7CisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgQ29weUZyb21NZXNzYWdlTWFwKSB7CisgIFVOSVRURVNUOjpUZXN0TWVzc2FnZU1hcCBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgKCptZXNzYWdlMS5tdXRhYmxlX21hcF9pbnQzMl9tZXNzYWdlKCkpWzBdLmFkZF9yZXBlYXRlZF9pbnQzMigxMDApOworICAoKm1lc3NhZ2UyLm11dGFibGVfbWFwX2ludDMyX21lc3NhZ2UoKSlbMF0uYWRkX3JlcGVhdGVkX2ludDMyKDEwMSk7CisKKyAgbWVzc2FnZTEuQ29weUZyb20obWVzc2FnZTIpOworCisgIC8vIENoZWNrcyByZXBlYXRlZCBmaWVsZCBpcyBvdmVyd3JpdHRlbi4KKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UxLm1hcF9pbnQzMl9tZXNzYWdlKCkuYXQoMCkucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEwMSwgbWVzc2FnZTEubWFwX2ludDMyX21lc3NhZ2UoKS5hdCgwKS5yZXBlYXRlZF9pbnQzMigwKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBTd2FwV2l0aEVtcHR5KSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlMSk7CisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTEpOworICBNYXBUZXN0VXRpbDo6RXhwZWN0Q2xlYXIobWVzc2FnZTIpOworCisgIG1lc3NhZ2UxLlN3YXAoJm1lc3NhZ2UyKTsKKyAgTWFwVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMik7CisgIE1hcFRlc3RVdGlsOjpFeHBlY3RDbGVhcihtZXNzYWdlMSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBTd2FwV2l0aFNlbGYpIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTsKKworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlKTsKKyAgTWFwVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlKTsKKworICBtZXNzYWdlLlN3YXAoJm1lc3NhZ2UpOworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UpOworfQorCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgU3dhcFdpdGhPdGhlcikgeworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgTWFwVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTEpOworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlMik7CisgIE1hcFRlc3RVdGlsOjpNb2RpZnlNYXBGaWVsZHMoJm1lc3NhZ2UyKTsKKworICBtZXNzYWdlMS5Td2FwKCZtZXNzYWdlMik7CisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNNb2RpZmllZChtZXNzYWdlMSk7CisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgQ29weUNvbnN0cnVjdG9yKSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2UxOworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlMSk7CisKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTIobWVzc2FnZTEpOworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UyKTsKK30KKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFRlc3QsIENvcHlBc3NpZ25tZW50T3BlcmF0b3IpIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTE7CisgIE1hcFRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UxKTsKKworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlMjsKKyAgbWVzc2FnZTIgPSBtZXNzYWdlMTsKKyAgTWFwVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMik7CisKKyAgLy8gTWFrZSBzdXJlIHRoYXQgc2VsZi1hc3NpZ25tZW50IGRvZXMgc29tZXRoaW5nIHNhbmUuCisgIG1lc3NhZ2UyLm9wZXJhdG9yPShtZXNzYWdlMik7CisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworfQorCisjaWYgIWRlZmluZWQoUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUykgfHwgUFJPVE9CVUZfUlRUSQorVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFRlc3QsIFVwY2FzdENvcHlGcm9tKSB7CisgIC8vIFRlc3QgdGhlIENvcHlGcm9tIG1ldGhvZCB0aGF0IHRha2VzIGluIHRoZSBnZW5lcmljIGNvbnN0IE1lc3NhZ2UmCisgIC8vIHBhcmFtZXRlci4KKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTEsIG1lc3NhZ2UyOworCisgIE1hcFRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UxKTsKKworICBjb25zdCBNZXNzYWdlKiBzb3VyY2UgPSBpbXBsaWNpdF9jYXN0PGNvbnN0IE1lc3NhZ2UqPigmbWVzc2FnZTEpOworICBtZXNzYWdlMi5Db3B5RnJvbSgqc291cmNlKTsKKworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UyKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFRlc3QsIENvcHlGcm9tRHluYW1pY01lc3NhZ2UpIHsKKyAgLy8gVGVzdCBjb3B5aW5nIGZyb20gYSBEeW5hbWljTWVzc2FnZSwgd2hpY2ggbXVzdCBmYWxsIGJhY2sgdG8gdXNpbmcKKyAgLy8gcmVmbGVjdGlvbi4KKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTI7CisKKyAgLy8gQ29uc3RydWN0IGEgbmV3IHZlcnNpb24gb2YgdGhlIGR5bmFtaWMgbWVzc2FnZSB2aWEgdGhlIGZhY3RvcnkuCisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OworICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gbWVzc2FnZTE7CisgIG1lc3NhZ2UxLnJlc2V0KGZhY3RvcnkuR2V0UHJvdG90eXBlKFVOSVRURVNUOjpUZXN0TWFwOjpkZXNjcmlwdG9yKCkpLT5OZXcoKSk7CisgIE1hcFJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldE1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24obWVzc2FnZTEuZ2V0KCkpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNYXBGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKCptZXNzYWdlMSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1hcEZpZWxkc1NldFZpYVJlZmxlY3Rpb25JdGVyYXRvcihtZXNzYWdlMS5nZXQoKSk7CisgIG1lc3NhZ2UyLkNvcHlGcm9tKCptZXNzYWdlMSk7CisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgQ29weUZyb21EeW5hbWljTWVzc2FnZU1hcFJlZmxlY3Rpb24pIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTI7CisKKyAgLy8gQ29uc3RydWN0IGEgbmV3IHZlcnNpb24gb2YgdGhlIGR5bmFtaWMgbWVzc2FnZSB2aWEgdGhlIGZhY3RvcnkuCisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OworICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gbWVzc2FnZTE7CisgIG1lc3NhZ2UxLnJlc2V0KGZhY3RvcnkuR2V0UHJvdG90eXBlKFVOSVRURVNUOjpUZXN0TWFwOjpkZXNjcmlwdG9yKCkpLT5OZXcoKSk7CisgIE1hcFJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldE1hcEZpZWxkc1ZpYU1hcFJlZmxlY3Rpb24obWVzc2FnZTEuZ2V0KCkpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNYXBGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKCptZXNzYWdlMSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1hcEZpZWxkc1NldFZpYVJlZmxlY3Rpb25JdGVyYXRvcihtZXNzYWdlMS5nZXQoKSk7CisgIG1lc3NhZ2UyLkNvcHlGcm9tKCptZXNzYWdlMSk7CisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgRHluYW1pY01lc3NhZ2VNZXJnZUZyb21EeW5hbWljTWVzc2FnZSkgeworICAvLyBDb25zdHJ1Y3QgdHdvIGR5bmFtaWMgbWVzc2FnZSBhbmQgc2V0cyB2aWEgbWFwIHJlZmxlY3Rpb24uCisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OworICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gbWVzc2FnZTE7CisgIG1lc3NhZ2UxLnJlc2V0KGZhY3RvcnkuR2V0UHJvdG90eXBlKFVOSVRURVNUOjpUZXN0TWFwOjpkZXNjcmlwdG9yKCkpLT5OZXcoKSk7CisgIE1hcFJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldE1hcEZpZWxkc1ZpYU1hcFJlZmxlY3Rpb24obWVzc2FnZTEuZ2V0KCkpOworCisgIC8vIG1lc3NhZ2UyIGlzIGNyZWF0ZWQgYnkgc2FtZSBmYWN0b3J5LgorICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gbWVzc2FnZTI7CisgIG1lc3NhZ2UyLnJlc2V0KGZhY3RvcnkuR2V0UHJvdG90eXBlKFVOSVRURVNUOjpUZXN0TWFwOjpkZXNjcmlwdG9yKCkpLT5OZXcoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldE1hcEZpZWxkc1ZpYU1hcFJlZmxlY3Rpb24obWVzc2FnZTIuZ2V0KCkpOworCisgIC8vIG1lc3NhZ2UzIGlzIGNyZWF0ZWQgYnkgZGlmZmVyZW50IGZhY3RvcnkuCisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5MzsKKyAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UzOworICBtZXNzYWdlMy5yZXNldChmYWN0b3J5My5HZXRQcm90b3R5cGUoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSktPk5ldygpKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0TWFwRmllbGRzVmlhTWFwUmVmbGVjdGlvbihtZXNzYWdlMy5nZXQoKSk7CisKKyAgbWVzc2FnZTItPk1lcmdlRnJvbSgqbWVzc2FnZTEpOworICBtZXNzYWdlMy0+TWVyZ2VGcm9tKCptZXNzYWdlMSk7CisKKyAgLy8gVGVzdCBNZXJnZUZyb20gZG9lcyBub3Qgc3luYyB0byByZXBlYXRlZCBmaWVsZHMgYW5kCisgIC8vIHRoZXJlIGlzIG5vIGR1cGxpY2F0ZSBrZXlzIGluIHRleHQgZm9ybWF0LgorICBzdGQ6OnN0cmluZyBvdXRwdXQxLCBvdXRwdXQyLCBvdXRwdXQzOworICBUZXh0Rm9ybWF0OjpQcmludFRvU3RyaW5nKCptZXNzYWdlMSwgJm91dHB1dDEpOworICBUZXh0Rm9ybWF0OjpQcmludFRvU3RyaW5nKCptZXNzYWdlMiwgJm91dHB1dDIpOworICBUZXh0Rm9ybWF0OjpQcmludFRvU3RyaW5nKCptZXNzYWdlMywgJm91dHB1dDMpOworICBFWFBFQ1RfRVEob3V0cHV0MSwgb3V0cHV0Mik7CisgIEVYUEVDVF9FUShvdXRwdXQxLCBvdXRwdXQzKTsKK30KKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFRlc3QsIER5bmFtaWNNZXNzYWdlQ29weUZyb20pIHsKKyAgLy8gVGVzdCBjb3B5aW5nIHRvIGEgRHluYW1pY01lc3NhZ2UsIHdoaWNoIG11c3QgZmFsbCBiYWNrIHRvIHVzaW5nIHJlZmxlY3Rpb24uCisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2UyOworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlMik7CisKKyAgLy8gQ29uc3RydWN0IGEgbmV3IHZlcnNpb24gb2YgdGhlIGR5bmFtaWMgbWVzc2FnZSB2aWEgdGhlIGZhY3RvcnkuCisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OworICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gbWVzc2FnZTE7CisgIG1lc3NhZ2UxLnJlc2V0KGZhY3RvcnkuR2V0UHJvdG90eXBlKFVOSVRURVNUOjpUZXN0TWFwOjpkZXNjcmlwdG9yKCkpLT5OZXcoKSk7CisKKyAgTWFwUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihVTklUVEVTVDo6VGVzdE1hcDo6ZGVzY3JpcHRvcigpKTsKKyAgbWVzc2FnZTEtPk1lcmdlRnJvbShtZXNzYWdlMik7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1hcEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oKm1lc3NhZ2UxKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWFwRmllbGRzU2V0VmlhUmVmbGVjdGlvbkl0ZXJhdG9yKG1lc3NhZ2UxLmdldCgpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFRlc3QsIER5bmFtaWNNZXNzYWdlQ29weUZyb21NYXBSZWZsZWN0aW9uKSB7CisgIE1hcFJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSk7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2UyOworICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRNYXBGaWVsZHNWaWFNYXBSZWZsZWN0aW9uKCZtZXNzYWdlMik7CisKKyAgLy8gQ29uc3RydWN0IGEgZHluYW1pYyBtZXNzYWdlIHZpYSB0aGUgZmFjdG9yeS4KKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGZhY3Rvcnk7CisgIHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlPiBtZXNzYWdlMTsKKyAgbWVzc2FnZTEucmVzZXQoZmFjdG9yeS5HZXRQcm90b3R5cGUoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSktPk5ldygpKTsKKworICBtZXNzYWdlMS0+TWVyZ2VGcm9tKG1lc3NhZ2UyKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWFwRmllbGRzU2V0VmlhUmVmbGVjdGlvbkl0ZXJhdG9yKG1lc3NhZ2UxLmdldCgpKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWFwRmllbGRzU2V0VmlhUmVmbGVjdGlvbigqbWVzc2FnZTEpOworfQorCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgU3luY0R5bmFtaWNNYXBXaXRoUmVwZWF0ZWRGaWVsZCkgeworICAvLyBDb25zdHJ1Y3QgYSBkeW5hbWljIG1lc3NhZ2UgdmlhIHRoZSBmYWN0b3J5LgorICBNYXBSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKFVOSVRURVNUOjpUZXN0TWFwOjpkZXNjcmlwdG9yKCkpOworICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZmFjdG9yeTsKKyAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+IG1lc3NhZ2U7CisgIG1lc3NhZ2UucmVzZXQoZmFjdG9yeS5HZXRQcm90b3R5cGUoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSktPk5ldygpKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0TWFwRmllbGRzVmlhUmVmbGVjdGlvbihtZXNzYWdlLmdldCgpKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWFwRmllbGRzU2V0VmlhUmVmbGVjdGlvbkl0ZXJhdG9yKG1lc3NhZ2UuZ2V0KCkpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNYXBGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKCptZXNzYWdlKTsKK30KKworI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgTm9uRW1wdHlNZXJnZUZyb20pIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTEsIG1lc3NhZ2UyOworCisgIE1hcFRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UxKTsKKworICAvLyBUaGlzIGZpZWxkIHdpbGwgdGVzdCBtZXJnaW5nIGludG8gYW4gZW1wdHkgc3BvdC4KKyAgKCptZXNzYWdlMi5tdXRhYmxlX21hcF9pbnQzMl9pbnQzMigpKVsxXSA9IDE7CisgIG1lc3NhZ2UxLm11dGFibGVfbWFwX2ludDMyX2ludDMyKCktPmVyYXNlKDEpOworCisgIC8vIFRoaXMgdGVzdHMgb3ZlcndyaXRpbmcuCisgICgqbWVzc2FnZTIubXV0YWJsZV9tYXBfaW50MzJfZG91YmxlKCkpWzFdID0gMTsKKyAgKCptZXNzYWdlMS5tdXRhYmxlX21hcF9pbnQzMl9kb3VibGUoKSlbMV0gPSAyOworCisgIG1lc3NhZ2UxLk1lcmdlRnJvbShtZXNzYWdlMik7CisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTEpOworCisgIC8vIFRlc3QgcmVmbGVjdGlvbiBNZXJnZUZyb20gZG9lcyBub3Qgc3luYyB0byByZXBlYXRlZCBmaWVsZAorICAvLyBhbmQgdGhlcmUgaXMgbm8gZHVwbGljYXRlZCBrZXlzLgorICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlMSk7CisgIE1hcFRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UyKTsKKworICBtZXNzYWdlMi5NZXJnZUZyb20obWVzc2FnZTEpOworCisgIHN0ZDo6c3RyaW5nIG91dHB1dDEsIG91dHB1dDI7CisgIFRleHRGb3JtYXQ6OlByaW50VG9TdHJpbmcobWVzc2FnZTEsICZvdXRwdXQxKTsKKyAgVGV4dEZvcm1hdDo6UHJpbnRUb1N0cmluZyhtZXNzYWdlMiwgJm91dHB1dDIpOworICBFWFBFQ1RfRVEob3V0cHV0MSwgb3V0cHV0Mik7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBNZXJnZUZyb21NZXNzYWdlTWFwKSB7CisgIFVOSVRURVNUOjpUZXN0TWVzc2FnZU1hcCBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgKCptZXNzYWdlMS5tdXRhYmxlX21hcF9pbnQzMl9tZXNzYWdlKCkpWzBdLmFkZF9yZXBlYXRlZF9pbnQzMigxMDApOworICAoKm1lc3NhZ2UyLm11dGFibGVfbWFwX2ludDMyX21lc3NhZ2UoKSlbMF0uYWRkX3JlcGVhdGVkX2ludDMyKDEwMSk7CisKKyAgbWVzc2FnZTEuTWVyZ2VGcm9tKG1lc3NhZ2UyKTsKKworICAvLyBDaGVja3MgcmVwZWF0ZWQgZmllbGQgaXMgb3ZlcndyaXR0ZW4uCisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlMS5tYXBfaW50MzJfbWVzc2FnZSgpLmF0KDApLnJlcGVhdGVkX2ludDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgxMDEsIG1lc3NhZ2UxLm1hcF9pbnQzMl9tZXNzYWdlKCkuYXQoMCkucmVwZWF0ZWRfaW50MzIoMCkpOworfQorCisvLyBUZXN0IHRoZSBnZW5lcmF0ZWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgpCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgU2VyaWFsaXphdGlvblRvQXJyYXkpIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBzdGQ6OnN0cmluZyBkYXRhOworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlMSk7CisgIHNpemVfdCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemVMb25nKCk7CisgIGRhdGEucmVzaXplKHNpemUpOworICB1aW50OF90KiBzdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KDo6Z29vZ2xlOjpwcm90b2J1Zjo6c3RyaW5nX2FzX2FycmF5KCZkYXRhKSk7CisgIHVpbnQ4X3QqIGVuZCA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoc3RhcnQpOworICBFWFBFQ1RfRVEoc2l6ZSwgZW5kIC0gc3RhcnQpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UyKTsKK30KKworLy8gVGVzdCB0aGUgZ2VuZXJhdGVkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgU2VyaWFsaXphdGlvblRvU3RyZWFtKSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgTWFwVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTEpOworICBzaXplX3Qgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplTG9uZygpOworICBzdGQ6OnN0cmluZyBkYXRhOworICBkYXRhLnJlc2l6ZShzaXplKTsKKyAgeworICAgIC8vIEFsbG93IHRoZSBvdXRwdXQgc3RyZWFtIHRvIGJ1ZmZlciBvbmx5IG9uZSBieXRlIGF0IGEgdGltZS4KKyAgICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gYXJyYXlfc3RyZWFtKDo6Z29vZ2xlOjpwcm90b2J1Zjo6c3RyaW5nX2FzX2FycmF5KCZkYXRhKSwgc2l6ZSwgMSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7CisgICAgbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKKyAgICBFWFBFQ1RfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKKyAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7CisgIH0KKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgTWFwVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMik7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBQYXJzZUZhaWxzSWZNYWxmb3JtZWQpIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXBTdWJtZXNzYWdlIG8sIHA7CisgIGF1dG8gbSA9IG8ubXV0YWJsZV90ZXN0X21hcCgpLT5tdXRhYmxlX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKTsKKyAgKCptKVswXS5zZXRfYygtMSk7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIEVYUEVDVF9UUlVFKG8uU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKTsKKworICAvLyBTaG91bGQgcGFyc2UgY29ycmVjdGx5LgorICBFWFBFQ1RfVFJVRShwLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7CisKKyAgLy8gT3ZlcndyaXRpbmcgdGhlIGxhc3QgYnl0ZSB0byAweEZGIHJlc3VsdHMgaW4gbWFsZm9ybWVkIHdpcmUuCisgIHNlcmlhbGl6ZWRbc2VyaWFsaXplZC5zaXplKCkgLSAxXSA9IDB4RkY7CisgIEVYUEVDVF9GQUxTRShwLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7Cit9CisKKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFRlc3QsIFNhbWVUeXBlTWFwcykgeworICBjb25zdCBEZXNjcmlwdG9yKiBtYXAxID0gVU5JVFRFU1Q6OlRlc3RTYW1lVHlwZU1hcDo6ZGVzY3JpcHRvcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5GaW5kRmllbGRCeU5hbWUoIm1hcDEiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bWVzc2FnZV90eXBlKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIG1hcDIgPSBVTklUVEVTVDo6VGVzdFNhbWVUeXBlTWFwOjpkZXNjcmlwdG9yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkZpbmRGaWVsZEJ5TmFtZSgibWFwMiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5tZXNzYWdlX3R5cGUoKTsKKworICBjb25zdCBNZXNzYWdlKiBtYXAxX2VudHJ5ID0KKyAgICAgIE1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLT5HZXRQcm90b3R5cGUobWFwMSk7CisgIGNvbnN0IE1lc3NhZ2UqIG1hcDJfZW50cnkgPQorICAgICAgTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCktPkdldFByb3RvdHlwZShtYXAyKTsKKworICBFWFBFQ1RfRVEobWFwMSwgbWFwMV9lbnRyeS0+R2V0RGVzY3JpcHRvcigpKTsKKyAgRVhQRUNUX0VRKG1hcDIsIG1hcDJfZW50cnktPkdldERlc2NyaXB0b3IoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBQcm90bzJVbmtub3duRW51bSkgeworICBVTklUVEVTVDo6VGVzdEVudW1NYXBQbHVzRXh0cmEgZnJvbTsKKyAgKCpmcm9tLm11dGFibGVfa25vd25fbWFwX2ZpZWxkKCkpWzBdID0gVU5JVFRFU1Q6OkVfUFJPVE8yX01BUF9FTlVNX0ZPTzsKKyAgKCpmcm9tLm11dGFibGVfdW5rbm93bl9tYXBfZmllbGQoKSlbMF0gPSBVTklUVEVTVDo6RV9QUk9UTzJfTUFQX0VOVU1fRVhUUkE7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIGZyb20uU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIFVOSVRURVNUOjpUZXN0RW51bU1hcCB0bzsKKyAgRVhQRUNUX1RSVUUodG8uUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgRVhQRUNUX0VRKDAsIHRvLnVua25vd25fbWFwX2ZpZWxkKCkuc2l6ZSgpKTsKKyAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkX3NldCA9CisgICAgICB0by5HZXRSZWZsZWN0aW9uKCktPkdldFVua25vd25GaWVsZHModG8pOworICBFWFBFQ1RfRVEoMSwgdW5rbm93bl9maWVsZF9zZXQuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLCB0by5rbm93bl9tYXBfZmllbGQoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlBST1RPMl9NQVBfRU5VTV9GT08sIHRvLmtub3duX21hcF9maWVsZCgpLmF0KDApKTsKKworICBkYXRhLmNsZWFyKCk7CisgIGZyb20uQ2xlYXIoKTsKKyAgdG8uU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworICBFWFBFQ1RfVFJVRShmcm9tLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIEVYUEVDVF9FUSgwLCBmcm9tLkdldFJlZmxlY3Rpb24oKS0+R2V0VW5rbm93bkZpZWxkcyhmcm9tKS5maWVsZF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDEsIGZyb20ua25vd25fbWFwX2ZpZWxkKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpFX1BST1RPMl9NQVBfRU5VTV9GT08sIGZyb20ua25vd25fbWFwX2ZpZWxkKCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMSwgZnJvbS51bmtub3duX21hcF9maWVsZCgpLnNpemUoKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6RV9QUk9UTzJfTUFQX0VOVU1fRVhUUkEsIGZyb20udW5rbm93bl9tYXBfZmllbGQoKS5hdCgwKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBTdGFuZGFyZFdpcmVGb3JtYXQpIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTsKKyAgc3RkOjpzdHJpbmcgZGF0YSA9ICJceDBBXHgwNFx4MDhceDAxXHgxMFx4MDEiOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMSkpOworfQorCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgVW5vcmRlcmVkV2lyZUZvcm1hdCkgeworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlOworCisgIC8vIHB1dCB2YWx1ZSBiZWZvcmUga2V5IGluIHdpcmUgZm9ybWF0CisgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiXHgwQVx4MDRceDEwXHgwMVx4MDhceDAyIjsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLnNpemUoKSk7CisgIEFTU0VSVF9ORShtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmZpbmQoMiksIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuZW5kKCkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5hdCgyKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBEdXBsaWNhdGVkS2V5V2lyZUZvcm1hdCkgeworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlOworCisgIC8vIFR3byBrZXkgZmllbGRzIGluIHdpcmUgZm9ybWF0CisgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiXHgwQVx4MDZceDA4XHgwMVx4MDhceDAyXHgxMFx4MDEiOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMikpOworCisgIC8vIEEgc2ltaWxhciB0ZXN0LCBidXQgd2l0aCBhIG1hcCBmcm9tIGludCB0byBhIG1lc3NhZ2UgdHlwZS4KKyAgLy8gQWdhaW4sIHdlIHdhbnQgdG8gYmUgc3VyZSB0aGF0IHRoZSAic2Vjb25kIG9uZSB3aW5zIiB3aGVuCisgIC8vIHRoZXJlIGFyZSB0d28gc2VwYXJhdGUgZW50cmllcyB3aXRoIHRoZSBzYW1lIGtleS4KKyAgY29uc3QgaW50IGtleSA9IDk5OworICBVTklUVEVTVDo6VGVzdFJlcXVpcmVkTWVzc2FnZU1hcCBtYXBfbWVzc2FnZTsKKyAgVU5JVFRFU1Q6OlRlc3RSZXF1aXJlZCB3aXRoX2R1bW15NDsKKyAgd2l0aF9kdW1teTQuc2V0X2EoMCk7CisgIHdpdGhfZHVtbXk0LnNldF9iKDApOworICB3aXRoX2R1bW15NC5zZXRfYygwKTsKKyAgd2l0aF9kdW1teTQuc2V0X2R1bW15NCgxMSk7CisgICgqbWFwX21lc3NhZ2UubXV0YWJsZV9tYXBfZmllbGQoKSlba2V5XSA9IHdpdGhfZHVtbXk0OworICBzdGQ6OnN0cmluZyBzID0gbWFwX21lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgVU5JVFRFU1Q6OlRlc3RSZXF1aXJlZCB3aXRoX2R1bW15NTsKKyAgd2l0aF9kdW1teTUuc2V0X2EoMCk7CisgIHdpdGhfZHVtbXk1LnNldF9iKDApOworICB3aXRoX2R1bW15NS5zZXRfYygwKTsKKyAgd2l0aF9kdW1teTUuc2V0X2R1bW15NSgxMik7CisgICgqbWFwX21lc3NhZ2UubXV0YWJsZV9tYXBfZmllbGQoKSlba2V5XSA9IHdpdGhfZHVtbXk1OworICBzdGQ6OnN0cmluZyBib3RoID0gcyArIG1hcF9tZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgIC8vIFdlIGRvbid0IGV4cGVjdCBhIG1lcmdlIG5vdy4gIFRoZSAic2Vjb25kIG9uZSB3aW5zLiIKKyAgQVNTRVJUX1RSVUUobWFwX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGJvdGgpKTsKKyAgQVNTRVJUX0VRKDEsIG1hcF9tZXNzYWdlLm1hcF9maWVsZCgpLnNpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtYXBfbWVzc2FnZS5tYXBfZmllbGQoKS5jb3VudChrZXkpKTsKKyAgRVhQRUNUX0VRKDAsIG1hcF9tZXNzYWdlLm1hcF9maWVsZCgpLmZpbmQoa2V5KS0+c2Vjb25kLmEoKSk7CisgIEVYUEVDVF9FUSgwLCBtYXBfbWVzc2FnZS5tYXBfZmllbGQoKS5maW5kKGtleSktPnNlY29uZC5iKCkpOworICBFWFBFQ1RfRVEoMCwgbWFwX21lc3NhZ2UubWFwX2ZpZWxkKCkuZmluZChrZXkpLT5zZWNvbmQuYygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9tZXNzYWdlLm1hcF9maWVsZCgpLmZpbmQoa2V5KS0+c2Vjb25kLmhhc19kdW1teTQoKSk7CisgIEFTU0VSVF9UUlVFKG1hcF9tZXNzYWdlLm1hcF9maWVsZCgpLmZpbmQoa2V5KS0+c2Vjb25kLmhhc19kdW1teTUoKSk7CisgIEVYUEVDVF9FUSgxMiwgbWFwX21lc3NhZ2UubWFwX2ZpZWxkKCkuZmluZChrZXkpLT5zZWNvbmQuZHVtbXk1KCkpOworfQorCisvLyBFeGhhdXN0aXZlIGNvbWJpbmF0aW9ucyBvZiBrZXlzLCB2YWx1ZXMsIGFuZCBqdW5rIGluIGFueSBvcmRlci4KKy8vIFRoaXMgcmUtdGVzdHMgc29tZSBvZiB0aGUgdGhpbmdzIHRlc3RlZCBhYm92ZSwgYnV0IGlmIGl0IGZhaWxzCisvLyBpdCdzIG1vcmUgd29yayB0byBkZXRlcm1pbmUgd2hhdCB3ZW50IHdyb25nLCBzbyBpdCBpc24ndCBuZWNlc3NhcmlseQorLy8gYmFkIHRoYXQgd2UgaGF2ZSB0aGUgc2ltcGxlciB0ZXN0cyB0b28uCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgS2V5c1ZhbHVlc1Vua25vd25zV2lyZUZvcm1hdCkgeworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlOworICBjb25zdCBpbnQga01heE51bUtleXNBbmRWYWx1ZXNBbmRKdW5rID0gNDsKKyAgY29uc3QgY2hhciBrS2V5VGFnID0gMHgwODsKKyAgY29uc3QgY2hhciBrVmFsdWVUYWcgPSAweDEwOworICBjb25zdCBjaGFyIGtKdW5rVGFnID0gMHgyMDsKKyAgZm9yIChpbnQgaXRlbXMgPSAwOyBpdGVtcyA8PSBrTWF4TnVtS2V5c0FuZFZhbHVlc0FuZEp1bms7IGl0ZW1zKyspIHsKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlx4MEEiOworICAgIC8vIEVuY29kZSBsZW5ndGggb2Ygd2hhdCB3aWxsIGZvbGxvdy4KKyAgICBkYXRhLnB1c2hfYmFjayhpdGVtcyAqIDIpOworICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHNPZklQZXJJdGVtID0gNDsKKyAgICBzdGF0aWMgY29uc3QgaW50IG1hc2sgPSAoMSA8PCBrQml0c09mSVBlckl0ZW0pIC0gMTsKKyAgICAvLyBFYWNoIGl0ZXJhdGlvbiBvZiB0aGUgZm9sbG93aW5nIGlzIGEgdGVzdC4gIEl0IHVzZXMgaSBhcyBiaXQgdmVjdG9yCisgICAgLy8gZW5jb2RpbmcgdGhlIGtleXMgYW5kIHZhbHVlcyB0byBwdXQgaW4gdGhlIHdpcmUgZm9ybWF0LgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKDEgPDwgKGl0ZW1zICoga0JpdHNPZklQZXJJdGVtKSk7IGkrKykgeworICAgICAgc3RkOjpzdHJpbmcgd2lyZV9mb3JtYXQgPSBkYXRhOworICAgICAgaW50IGV4cGVjdGVkX2tleSA9IDA7CisgICAgICBpbnQgZXhwZWN0ZWRfdmFsdWUgPSAwOworICAgICAgZm9yIChpbnQgayA9IGksIGogPSAwOyBqIDwgaXRlbXM7IGorKywgayA+Pj0ga0JpdHNPZklQZXJJdGVtKSB7CisgICAgICAgIGJvb2wgaXNfa2V5ID0gayAmIDB4MTsKKyAgICAgICAgYm9vbCBpc192YWx1ZSA9ICFpc19rZXkgJiYgKGsgJiAweDIpOworICAgICAgICB3aXJlX2Zvcm1hdC5wdXNoX2JhY2soaXNfa2V5ID8ga0tleVRhZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXNfdmFsdWUgPyBrVmFsdWVUYWcgOiBrSnVua1RhZyk7CisgICAgICAgIGNoYXIgYyA9IHN0YXRpY19jYXN0PGNoYXI+KGsgJiBtYXNrKSA+PiAyOyAgLy8gT25lIGNoYXIgYWZ0ZXIgdGhlIHRhZy4KKyAgICAgICAgd2lyZV9mb3JtYXQucHVzaF9iYWNrKGMpOworICAgICAgICBpZiAoaXNfa2V5KSBleHBlY3RlZF9rZXkgPSBzdGF0aWNfY2FzdDxpbnQ+KGMpOworICAgICAgICBpZiAoaXNfdmFsdWUpIGV4cGVjdGVkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8aW50PihjKTsKKyAgICAgICAgYm9vbCByZXMgPSBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyh3aXJlX2Zvcm1hdCk7CisgICAgICAgIGJvb2wgZXhwZWN0X3N1Y2Nlc3MgPSB0cnVlOworICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IHRoZSBvbGQgbWFwIHBhcnNlciBhY2NlcHRzIG1hbGZvcm1lZCBpbnB1dCwgdGhlIG5ldworICAgICAgICAvLyBwYXJzZXIgYWNjZXB0cyBvbmx5IGNvcnJlY3QgaW5wdXQuCisgICAgICAgIGlmIChqICE9IGl0ZW1zIC0gMSkgZXhwZWN0X3N1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgaWYgKGV4cGVjdF9zdWNjZXNzKSB7CisgICAgICAgICAgQVNTRVJUX1RSVUUocmVzKTsKKyAgICAgICAgICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5zaXplKCkpOworICAgICAgICAgIEFTU0VSVF9FUShleHBlY3RlZF9rZXksIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYmVnaW4oKS0+Zmlyc3QpOworICAgICAgICAgIEFTU0VSVF9FUShleHBlY3RlZF92YWx1ZSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5iZWdpbigpLT5zZWNvbmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEFTU0VSVF9GQUxTRShyZXMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBEdXBsaWNhdGVkVmFsdWVXaXJlRm9ybWF0KSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2U7CisKKyAgLy8gVHdvIHZhbHVlIGZpZWxkcyBpbiB3aXJlIGZvcm1hdAorICBzdGQ6OnN0cmluZyBkYXRhID0gIlx4MEFceDA2XHgwOFx4MDFceDEwXHgwMVx4MTBceDAyIjsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmF0KDEpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFRlc3QsIE1pc3NlZEtleVdpcmVGb3JtYXQpIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTsKKworICAvLyBObyBrZXkgZmllbGQgaW4gd2lyZSBmb3JtYXQKKyAgc3RkOjpzdHJpbmcgZGF0YSA9ICJceDBBXHgwMlx4MTBceDAxIjsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLnNpemUoKSk7CisgIEFTU0VSVF9ORShtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmZpbmQoMCksIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuZW5kKCkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5hdCgwKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBNaXNzZWRWYWx1ZVdpcmVGb3JtYXQpIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTsKKworICAvLyBObyB2YWx1ZSBmaWVsZCBpbiB3aXJlIGZvcm1hdAorICBzdGQ6OnN0cmluZyBkYXRhID0gIlx4MEFceDAyXHgwOFx4MDEiOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuc2l6ZSgpKTsKKyAgQVNTRVJUX05FKG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuZmluZCgxKSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5lbmQoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmF0KDEpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFRlc3QsIE1pc3NlZFZhbHVlVGV4dEZvcm1hdCkgeworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlOworCisgIC8vIE5vIHZhbHVlIGZpZWxkIGluIHRleHQgZm9ybWF0CisgIHN0ZDo6c3RyaW5nIHRleHQgPQorICAgICAgIm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2Uge1xuIgorICAgICAgIiAga2V5OiAxMjM0NTY3ODkwXG4iCisgICAgICAifSI7CisKKyAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKHRleHQsICZtZXNzYWdlKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMTEsIG1lc3NhZ2UuQnl0ZVNpemVMb25nKCkpOworfQorCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgVW5rbm93bkZpZWxkV2lyZUZvcm1hdCkgeworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlOworCisgIC8vIFVua25vd24gZmllbGQgaW4gd2lyZSBmb3JtYXQKKyAgc3RkOjpzdHJpbmcgZGF0YSA9ICJceDBBXHgwNlx4MDhceDAyXHgxMFx4MDNceDE4XHgwMSI7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMywgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5hdCgyKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBDb3JydXB0ZWRXaXJlRm9ybWF0KSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2U7CisKKyAgLy8gY29ycnVwdGVkIGRhdGEgaW4gd2lyZSBmb3JtYXQKKyAgc3RkOjpzdHJpbmcgZGF0YSA9ICJceDBBXHgwNlx4MDhceDAyXHgxMVx4MDMiOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBJc0luaXRpYWxpemVkKSB7CisgIFVOSVRURVNUOjpUZXN0UmVxdWlyZWRNZXNzYWdlTWFwIG1hcF9tZXNzYWdlOworCisgIC8vIEFkZCBhbiB1bmluaXRpYWxpemVkIG1lc3NhZ2UuCisgICgqbWFwX21lc3NhZ2UubXV0YWJsZV9tYXBfZmllbGQoKSlbMF07CisgIEVYUEVDVF9GQUxTRShtYXBfbWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworCisgIC8vIEluaXRpYWxpemUgdW5pbml0aWFsaXplZCBtZXNzYWdlCisgICgqbWFwX21lc3NhZ2UubXV0YWJsZV9tYXBfZmllbGQoKSlbMF0uc2V0X2EoMCk7CisgICgqbWFwX21lc3NhZ2UubXV0YWJsZV9tYXBfZmllbGQoKSlbMF0uc2V0X2IoMCk7CisgICgqbWFwX21lc3NhZ2UubXV0YWJsZV9tYXBfZmllbGQoKSlbMF0uc2V0X2MoMCk7CisgIEVYUEVDVF9UUlVFKG1hcF9tZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBTcGFjZVVzZWQpIHsKKyAgVU5JVFRFU1Q6OlRlc3RSZXF1aXJlZE1lc3NhZ2VNYXAgbWFwX21lc3NhZ2U7CisgIGNvbnN0IHNpemVfdCBpbml0aWFsID0gbWFwX21lc3NhZ2UuU3BhY2VVc2VkKCk7CisgIGNvbnN0IHNpemVfdCBzcGFjZV91c2VkX21lc3NhZ2UgPSBVTklUVEVTVDo6VGVzdFJlcXVpcmVkKCkuU3BhY2VVc2VkKCk7CisKKyAgYXV0byYgbSA9ICptYXBfbWVzc2FnZS5tdXRhYmxlX21hcF9maWVsZCgpOworICBjb25zdGV4cHIgaW50IGtOdW1WYWx1ZXMgPSAxMDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVZhbHVlczsgKytpKSB7CisgICAgbVtpXTsKKyAgfQorCisgIC8vIFRoZSBleGFjdCB2YWx1ZSB3aWxsIGRlcGVuZCBvbiBpbnRlcm5hbCBzdGF0ZSwgbGlrZSBjb2xsaXNpb25zLAorICAvLyBzbyB3ZSBjYW4ndCBwcmVkaWN0IGl0LiBCdXQgd2UgY2FuIHByZWRpY3QgYSBsb3dlciBib3VuZC4KKyAgc2l6ZV90IGxvd2VyX2JvdW5kID0KKyAgICAgIGluaXRpYWwgKyBrTnVtVmFsdWVzICogKHNwYWNlX3VzZWRfbWVzc2FnZSArIHNpemVvZihpbnQzMl90KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb2RlOjpuZXh0ICovIHNpemVvZih2b2lkKikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFibGUgZW50cnkgKi8gc2l6ZW9mKHZvaWQqKSk7CisKKyAgRVhQRUNUX0xFKGxvd2VyX2JvdW5kLCBtYXBfbWVzc2FnZS5TcGFjZVVzZWQoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBNZXNzYWdlc011c3RNZXJnZSkgeworICBVTklUVEVTVDo6VGVzdFJlcXVpcmVkTWVzc2FnZU1hcCBtYXBfbWVzc2FnZTsKKworICBVTklUVEVTVDo6VGVzdFJlcXVpcmVkIHdpdGhfZHVtbXk0OworICB3aXRoX2R1bW15NC5zZXRfYSg5Nyk7CisgIHdpdGhfZHVtbXk0LnNldF9iKDkxKTsKKyAgd2l0aF9kdW1teTQuc2V0X2R1bW15NCg5OCk7CisgIEVYUEVDVF9GQUxTRSh3aXRoX2R1bW15NC5Jc0luaXRpYWxpemVkKCkpOworICAoKm1hcF9tZXNzYWdlLm11dGFibGVfbWFwX2ZpZWxkKCkpWzBdID0gd2l0aF9kdW1teTQ7CisgIEVYUEVDVF9GQUxTRShtYXBfbWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworCisgIFVOSVRURVNUOjpUZXN0UmVxdWlyZWQgd2l0aF9kdW1teTU7CisgIHdpdGhfZHVtbXk1LnNldF9iKDApOworICB3aXRoX2R1bW15NS5zZXRfYygzMyk7CisgIHdpdGhfZHVtbXk1LnNldF9kdW1teTUoOTkpOworICBFWFBFQ1RfRkFMU0Uod2l0aF9kdW1teTUuSXNJbml0aWFsaXplZCgpKTsKKyAgKCptYXBfbWVzc2FnZS5tdXRhYmxlX21hcF9maWVsZCgpKVswXSA9IHdpdGhfZHVtbXk1OworICBFWFBFQ1RfRkFMU0UobWFwX21lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKworICAvLyBUaGUgd2lyZSBmb3JtYXQgb2YgTWFwRW50cnkgaXMgc3RyYWlnaHRmb3J3YXJkICgqKSBhbmQgY2FuIGJlIG1hbnVhbGx5CisgIC8vIGNvbnN0cnVjdGVkIHRvIGZvcmNlIG1lcmdpbmcgb2YgdHdvIHVuaW5pdGlhbGl6ZWQgbWVzc2FnZXMgdGhhdCB3b3VsZAorICAvLyByZXN1bHQgaW4gYW4gaW5pdGlhbGl6ZWQgbWVzc2FnZS4KKyAgLy8KKyAgLy8gKCopIGh0dHA6Ly9nb29nbGUzL25ldC9wcm90bzIvaW50ZXJuYWwvbWFwX3Rlc3QuY2M/bD0yNDMzJnJjbD0zMTAwMTIwMjgKKyAgc3RkOjpzdHJpbmcgZHVtbXk0X3MgPSB3aXRoX2R1bW15NC5TZXJpYWxpemVQYXJ0aWFsQXNTdHJpbmcoKTsKKyAgc3RkOjpzdHJpbmcgZHVtbXk1X3MgPSB3aXRoX2R1bW15NS5TZXJpYWxpemVQYXJ0aWFsQXNTdHJpbmcoKTsKKyAgaW50IHBheWxvYWRfc2l6ZSA9IGR1bW15NF9zLnNpemUoKSArIGR1bW15NV9zLnNpemUoKTsKKyAgLy8gTWFrZXMgc3VyZSB0aGUgcGF5bG9hZCBzaXplIGZpdHMgaW50byBvbmUgYnl0ZS4KKyAgQVNTRVJUX0xUKHBheWxvYWRfc2l6ZSwgMTI4KTsKKworICBzdGQ6OnN0cmluZyBzKDYsIDApOworICBjaGFyKiBwID0gJnNbMF07CisgICpwKysgPSBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygxLCBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisgIC8vIExlbmd0aDogMkIgZm9yIGtleSB0YWcgJiB2YWwgYW5kIDJCIGZvciB2YWwgdGFnIGFuZCBsZW5ndGggb2YgdGhlIGZvbGxvd2luZworICAvLyBwYXlsb2FkLgorICAqcCsrID0gNCArIHBheWxvYWRfc2l6ZTsKKyAgKnArKyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKDEsIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpOworICAqcCsrID0gMDsKKyAgKnArKyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKDIsIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKKyAgKnArKyA9IHBheWxvYWRfc2l6ZTsKKyAgU3RyQXBwZW5kKCZzLCBkdW1teTRfcywgZHVtbXk1X3MpOworCisgIC8vIFRlc3Qga2V5IHRoZW4gdmFsdWUgdGhlbiB2YWx1ZS4KKyAgaW50IGtleSA9IDA7CisgIEFTU0VSVF9UUlVFKG1hcF9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzKSk7CisgIEFTU0VSVF9FUSgxLCBtYXBfbWVzc2FnZS5tYXBfZmllbGQoKS5zaXplKCkpOworICBBU1NFUlRfRVEoMSwgbWFwX21lc3NhZ2UubWFwX2ZpZWxkKCkuY291bnQoa2V5KSk7CisgIEVYUEVDVF9FUSg5NywgbWFwX21lc3NhZ2UubWFwX2ZpZWxkKCkuZmluZChrZXkpLT5zZWNvbmQuYSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1hcF9tZXNzYWdlLm1hcF9maWVsZCgpLmZpbmQoa2V5KS0+c2Vjb25kLmIoKSk7CisgIEVYUEVDVF9FUSgzMywgbWFwX21lc3NhZ2UubWFwX2ZpZWxkKCkuZmluZChrZXkpLT5zZWNvbmQuYygpKTsKKyAgRVhQRUNUX0VRKDk4LCBtYXBfbWVzc2FnZS5tYXBfZmllbGQoKS5maW5kKGtleSktPnNlY29uZC5kdW1teTQoKSk7CisgIEVYUEVDVF9FUSg5OSwgbWFwX21lc3NhZ2UubWFwX2ZpZWxkKCkuZmluZChrZXkpLT5zZWNvbmQuZHVtbXk1KCkpOworCisgIC8vIFRlc3Qga2V5IHRoZW4gdmFsdWUgdGhlbiB2YWx1ZSB0aGVuIGtleS4KKyAgcy5wdXNoX2JhY2soc1syXSk7ICAvLyBDb3B5IHRoZSBrZXkncyB0YWcuCisgIGtleSA9IDE5OworICBzLnB1c2hfYmFjayhrZXkpOyAgLy8gU2Vjb25kIGtleSBpcyAxOSBpbnN0ZWFkIG9mIDAuCisgIHNbMV0gKz0gMjsgICAgICAgICAvLyBBZGp1c3QgZW5jb2RlZCBzaXplLgorICBBU1NFUlRfVFJVRShtYXBfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcocykpOworICBBU1NFUlRfRVEoMSwgbWFwX21lc3NhZ2UubWFwX2ZpZWxkKCkuc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDEsIG1hcF9tZXNzYWdlLm1hcF9maWVsZCgpLmNvdW50KGtleSkpOworICBFWFBFQ1RfRVEoOTcsIG1hcF9tZXNzYWdlLm1hcF9maWVsZCgpLmZpbmQoa2V5KS0+c2Vjb25kLmEoKSk7CisgIEVYUEVDVF9FUSgwLCBtYXBfbWVzc2FnZS5tYXBfZmllbGQoKS5maW5kKGtleSktPnNlY29uZC5iKCkpOworICBFWFBFQ1RfRVEoMzMsIG1hcF9tZXNzYWdlLm1hcF9maWVsZCgpLmZpbmQoa2V5KS0+c2Vjb25kLmMoKSk7CisgIEVYUEVDVF9FUSg5OCwgbWFwX21lc3NhZ2UubWFwX2ZpZWxkKCkuZmluZChrZXkpLT5zZWNvbmQuZHVtbXk0KCkpOworICBFWFBFQ1RfRVEoOTksIG1hcF9tZXNzYWdlLm1hcF9maWVsZCgpLmZpbmQoa2V5KS0+c2Vjb25kLmR1bW15NSgpKTsKK30KKworLy8gR2VuZXJhdGVkIE1lc3NhZ2UgUmVmbGVjdGlvbiBUZXN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRSZWZsZWN0aW9uVGVzdCwgU3BhY2VVc2VkKSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2U7CisgIE1hcFJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldE1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworCisgIEVYUEVDVF9MVCgwLCBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+U3BhY2VVc2VkTG9uZyhtZXNzYWdlKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRSZWZsZWN0aW9uVGVzdCwgQWNjZXNzb3JzKSB7CisgIC8vIFNldCBldmVyeSBmaWVsZCB0byBhIHVuaXF1ZSB2YWx1ZSB0aGVuIGdvIGJhY2sgYW5kIGNoZWNrIGFsbCB0aG9zZQorICAvLyB2YWx1ZXMuCisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2U7CisgIE1hcFJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldE1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNYXBGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNYXBGaWVsZHNTZXRWaWFSZWZsZWN0aW9uSXRlcmF0b3IoJm1lc3NhZ2UpOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLk1vZGlmeU1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzTW9kaWZpZWQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRSZWZsZWN0aW9uVGVzdCwgU3dhcCkgeworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlMTsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTI7CisKKyAgTWFwVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTEpOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPlN3YXAoJm1lc3NhZ2UxLCAmbWVzc2FnZTIpOworCisgIE1hcFRlc3RVdGlsOjpFeHBlY3RDbGVhcihtZXNzYWdlMSk7CisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkUmVmbGVjdGlvblRlc3QsIFN3YXBXaXRoQm90aFNldCkgeworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlMTsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTI7CisKKyAgTWFwVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTEpOworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlMik7CisgIE1hcFRlc3RVdGlsOjpNb2RpZnlNYXBGaWVsZHMoJm1lc3NhZ2UyKTsKKworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOworICByZWZsZWN0aW9uLT5Td2FwKCZtZXNzYWdlMSwgJm1lc3NhZ2UyKTsKKworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzTW9kaWZpZWQobWVzc2FnZTEpOworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UyKTsKK30KKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFJlZmxlY3Rpb25UZXN0LCBTd2FwRmllbGRzKSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2UxOworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlMjsKKworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlMik7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1lc3NhZ2UyLCAmZmllbGRzKTsKKyAgcmVmbGVjdGlvbi0+U3dhcEZpZWxkcygmbWVzc2FnZTEsICZtZXNzYWdlMiwgZmllbGRzKTsKKworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UxKTsKKyAgTWFwVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UyKTsKK30KKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFJlZmxlY3Rpb25UZXN0LCBDbGVhckZpZWxkKSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2U7CisgIE1hcFRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UpOworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UpOworCisgIE1hcFJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkNsZWFyTWFwRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdENsZWFyVmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0Q2xlYXJWaWFSZWZsZWN0aW9uSXRlcmF0b3IoJm1lc3NhZ2UpOworfQorCitURVNUKEdlbmVyYXRlZE1hcEZpZWxkUmVmbGVjdGlvblRlc3QsIFJlbW92ZUxhc3QpIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTsKKyAgTWFwUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihVTklUVEVTVDo6VGVzdE1hcDo6ZGVzY3JpcHRvcigpKTsKKworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlKTsKKyAgTWFwVGVzdFV0aWw6OkV4cGVjdE1hcHNTaXplKG1lc3NhZ2UsIDIpOworICBzdGQ6OnZlY3Rvcjxjb25zdCBNZXNzYWdlKj4gZXhwZWN0ZWRfZW50cmllcyA9CisgICAgICBNYXBUZXN0VXRpbDo6R2V0TWFwRW50cmllcyhtZXNzYWdlLCAwKTsKKworICByZWZsZWN0aW9uX3Rlc3Rlci5SZW1vdmVMYXN0TWFwc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworCisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBzU2l6ZShtZXNzYWdlLCAxKTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgTWVzc2FnZSo+IHJlbWFpbmVkX2VudHJpZXMgPQorICAgICAgTWFwVGVzdFV0aWw6OkdldE1hcEVudHJpZXMobWVzc2FnZSwgMCk7CisgIEVYUEVDVF9UUlVFKGV4cGVjdGVkX2VudHJpZXMgPT0gcmVtYWluZWRfZW50cmllcyk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRSZWZsZWN0aW9uVGVzdCwgUmVsZWFzZUxhc3QpIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOworICBNYXBSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKGRlc2NyaXB0b3IpOworCisgIE1hcFRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UpOworCisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBzU2l6ZShtZXNzYWdlLCAyKTsKKworICByZWZsZWN0aW9uX3Rlc3Rlci5SZWxlYXNlTGFzdE1hcHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKKworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwc1NpemUobWVzc2FnZSwgMSk7CisKKyAgLy8gTm93IHRlc3QgdGhhdCB3ZSBhY3R1YWxseSByZWxlYXNlIHRoZSByaWdodCBtZXNzYWdlLgorICBtZXNzYWdlLkNsZWFyKCk7CisgIE1hcFRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UpOworCisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBzU2l6ZShtZXNzYWdlLCAyKTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgTWVzc2FnZSo+IGV4cGVjdF9sYXN0ID0KKyAgICAgIE1hcFRlc3RVdGlsOjpHZXRNYXBFbnRyaWVzKG1lc3NhZ2UsIDEpOworICBzdGQ6OnZlY3Rvcjxjb25zdCBNZXNzYWdlKj4gcmVsZWFzZV9sYXN0ID0KKyAgICAgIE1hcFRlc3RVdGlsOjpHZXRNYXBFbnRyaWVzRnJvbVJlbGVhc2UoJm1lc3NhZ2UpOworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwc1NpemUobWVzc2FnZSwgMSk7CisgIEVYUEVDVF9UUlVFKGV4cGVjdF9sYXN0ID09IHJlbGVhc2VfbGFzdCk7CisgIGZvciAoc3RkOjp2ZWN0b3I8Y29uc3QgTWVzc2FnZSo+OjppdGVyYXRvciBpdCA9IHJlbGVhc2VfbGFzdC5iZWdpbigpOworICAgICAgIGl0ICE9IHJlbGVhc2VfbGFzdC5lbmQoKTsgKytpdCkgeworICAgIGRlbGV0ZSAqaXQ7CisgIH0KK30KKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFJlZmxlY3Rpb25UZXN0LCBTd2FwRWxlbWVudHMpIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTsKKyAgTWFwUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihVTklUVEVTVDo6VGVzdE1hcDo6ZGVzY3JpcHRvcigpKTsKKworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlKTsKKworICAvLyBHZXQgcG9pbnRlcnMgb2YgbWFwIGVudHJpZXMgYXQgdGhlaXIgb3JpZ2luYWwgcG9zaXRpb24KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgTWVzc2FnZSo+IGVudHJpZXMwID0gTWFwVGVzdFV0aWw6OkdldE1hcEVudHJpZXMobWVzc2FnZSwgMCk7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IE1lc3NhZ2UqPiBlbnRyaWVzMSA9IE1hcFRlc3RVdGlsOjpHZXRNYXBFbnRyaWVzKG1lc3NhZ2UsIDEpOworCisgIC8vIFN3YXAgdGhlIGZpcnN0IHRpbWUuCisgIHJlZmxlY3Rpb25fdGVzdGVyLlN3YXBNYXBzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisKKyAgLy8gR2V0IHBvaW50ZXIgb2YgbWFwIGVudHJ5IGFmdGVyIHN3YXAgb25jZS4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgTWVzc2FnZSo+IGVudHJpZXMwX29uY2UgPQorICAgICAgTWFwVGVzdFV0aWw6OkdldE1hcEVudHJpZXMobWVzc2FnZSwgMCk7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IE1lc3NhZ2UqPiBlbnRyaWVzMV9vbmNlID0KKyAgICAgIE1hcFRlc3RVdGlsOjpHZXRNYXBFbnRyaWVzKG1lc3NhZ2UsIDEpOworCisgIC8vIFRlc3QgbWFwIGVudHJpZXMgYXJlIHN3YXBwZWQuCisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBzU2l6ZShtZXNzYWdlLCAyKTsKKyAgRVhQRUNUX1RSVUUoZW50cmllczAgPT0gZW50cmllczFfb25jZSk7CisgIEVYUEVDVF9UUlVFKGVudHJpZXMxID09IGVudHJpZXMwX29uY2UpOworCisgIC8vIFN3YXAgdGhlIHNlY29uZCB0aW1lLgorICByZWZsZWN0aW9uX3Rlc3Rlci5Td2FwTWFwc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworCisgIC8vIEdldCBwb2ludGVyIG9mIG1hcCBlbnRyeSBhZnRlciBzd2FwIG9uY2UuCisgIHN0ZDo6dmVjdG9yPGNvbnN0IE1lc3NhZ2UqPiBlbnRyaWVzMF90d2ljZSA9CisgICAgICBNYXBUZXN0VXRpbDo6R2V0TWFwRW50cmllcyhtZXNzYWdlLCAwKTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgTWVzc2FnZSo+IGVudHJpZXMxX3R3aWNlID0KKyAgICAgIE1hcFRlc3RVdGlsOjpHZXRNYXBFbnRyaWVzKG1lc3NhZ2UsIDEpOworCisgIC8vIFRlc3QgbWFwIGVudHJpZXMgYXJlIHN3YXBwZWQgYmFjay4KKyAgTWFwVGVzdFV0aWw6OkV4cGVjdE1hcHNTaXplKG1lc3NhZ2UsIDIpOworICBFWFBFQ1RfVFJVRShlbnRyaWVzMCA9PSBlbnRyaWVzMF90d2ljZSk7CisgIEVYUEVDVF9UUlVFKGVudHJpZXMxID09IGVudHJpZXMxX3R3aWNlKTsKK30KKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFJlZmxlY3Rpb25UZXN0LCBNdXRhYmxlVW5rbm93bkZpZWxkcykgeworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlOworICBNYXBSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKFVOSVRURVNUOjpUZXN0TWFwOjpkZXNjcmlwdG9yKCkpOworICByZWZsZWN0aW9uX3Rlc3Rlci5NdXRhYmxlVW5rbm93bkZpZWxkc09mTWFwRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRSZWZsZWN0aW9uVGVzdCwgRW1iZWRQcm90bzJNZXNzYWdlKSB7CisgIFVOSVRURVNUOjpUZXN0TWVzc2FnZU1hcCBtZXNzYWdlOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX2ZpZWxkID0KKyAgICAgIFVOSVRURVNUOjpUZXN0TWVzc2FnZU1hcDo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoCisgICAgICAgICAgIm1hcF9pbnQzMl9tZXNzYWdlIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsdWUgPSBtYXBfZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5tYXBfdmFsdWUoKTsKKworICBNZXNzYWdlKiBlbnRyeV9tZXNzYWdlID0KKyAgICAgIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5BZGRNZXNzYWdlKCZtZXNzYWdlLCBtYXBfZmllbGQpOworICBFWFBFQ1RfRVEoCisgICAgICAmZW50cnlfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRNZXNzYWdlKCplbnRyeV9tZXNzYWdlLCB2YWx1ZSksCisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IE1lc3NhZ2UqPigmVGVzdEFsbFR5cGVzOjpkZWZhdWx0X2luc3RhbmNlKCkpKTsKKworICBNZXNzYWdlKiBwcm90bzJfbWVzc2FnZSA9CisgICAgICBlbnRyeV9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVNZXNzYWdlKGVudHJ5X21lc3NhZ2UsIHZhbHVlKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgIHByb3RvMl9tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfbWVzc2FnZSgpLnNpemUoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWFwRmllbGRSZWZsZWN0aW9uVGVzdCwgTWVyZ2VGcm9tQ2xlYXJNYXBFbnRyeSkgeworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF9maWVsZCA9CisgICAgICBVTklUVEVTVDo6VGVzdE1hcDo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9pbnQzMl9pbnQzMiIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGtleSA9IG1hcF9maWVsZC0+bWVzc2FnZV90eXBlKCktPm1hcF9rZXkoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZSA9IG1hcF9maWVsZC0+bWVzc2FnZV90eXBlKCktPm1hcF92YWx1ZSgpOworCisgIE1lc3NhZ2UqIGVudHJ5X21lc3NhZ2UxID0KKyAgICAgIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5BZGRNZXNzYWdlKCZtZXNzYWdlLCBtYXBfZmllbGQpOworICBFWFBFQ1RfRkFMU0UoZW50cnlfbWVzc2FnZTEtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKmVudHJ5X21lc3NhZ2UxLCBrZXkpKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgZW50cnlfbWVzc2FnZTEtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKmVudHJ5X21lc3NhZ2UxLCB2YWx1ZSkpOworCisgIE1lc3NhZ2UqIGVudHJ5X21lc3NhZ2UyID0KKyAgICAgIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5BZGRNZXNzYWdlKCZtZXNzYWdlLCBtYXBfZmllbGQpOworICBFWFBFQ1RfRkFMU0UoZW50cnlfbWVzc2FnZTItPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKmVudHJ5X21lc3NhZ2UyLCBrZXkpKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgZW50cnlfbWVzc2FnZTItPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKmVudHJ5X21lc3NhZ2UyLCB2YWx1ZSkpOworCisgIGVudHJ5X21lc3NhZ2UxLT5NZXJnZUZyb20oKmVudHJ5X21lc3NhZ2UyKTsKKyAgRVhQRUNUX0ZBTFNFKGVudHJ5X21lc3NhZ2UxLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCplbnRyeV9tZXNzYWdlMSwga2V5KSk7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIGVudHJ5X21lc3NhZ2UxLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCplbnRyeV9tZXNzYWdlMSwgdmFsdWUpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFJlZmxlY3Rpb25UZXN0LCBNYXBFbnRyeUNsZWFyKSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2U7CisgIE1hcFJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLk11dGFibGVVbmtub3duRmllbGRzT2ZNYXBGaWVsZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKK30KKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFJlZmxlY3Rpb25UZXN0LCBQcm90bzJNYXBFbnRyeUNsZWFyKSB7CisgIFVOSVRURVNUOjpUZXN0RW51bU1hcCBtZXNzYWdlOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9CisgICAgICBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImtub3duX21hcF9maWVsZCIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHZhbHVlX2Rlc2NyaXB0b3IgPQorICAgICAgZmllbGRfZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCktPm1hcF92YWx1ZSgpOworICBNZXNzYWdlKiBzdWJfbWVzc2FnZSA9CisgICAgICBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+QWRkTWVzc2FnZSgmbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisgIEVYUEVDVF9FUSgwLCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRFbnVtVmFsdWUoKnN1Yl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2Rlc2NyaXB0b3IpKTsKK30KKworLy8gTWFwIFJlZmxlY3Rpb24gQVBJIFRlc3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFJlZmxlY3Rpb25UZXN0LCBTZXRWaWFNYXBSZWZsZWN0aW9uKSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2U7CisgIE1hcFJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldE1hcEZpZWxkc1ZpYU1hcFJlZmxlY3Rpb24oJm1lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNYXBGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNYXBGaWVsZHNTZXRWaWFSZWZsZWN0aW9uSXRlcmF0b3IoJm1lc3NhZ2UpOworfQorCisvLyBEeW5hbWljIE1lc3NhZ2UgVGVzdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgTWFwRmllbGRJbkR5bmFtaWNNZXNzYWdlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sXzsKKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGZhY3RvcnlfOworICBjb25zdCBEZXNjcmlwdG9yKiBtYXBfZGVzY3JpcHRvcl87CisgIGNvbnN0IERlc2NyaXB0b3IqIHJlY3Vyc2l2ZV9tYXBfZGVzY3JpcHRvcl87CisgIGNvbnN0IE1lc3NhZ2UqIG1hcF9wcm90b3R5cGVfOworCisgIE1hcEZpZWxkSW5EeW5hbWljTWVzc2FnZVRlc3QoKQorICAgICAgOiBwb29sXyhEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSksIGZhY3RvcnlfKHBvb2xfKSB7fQorCisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgbWFwX2Rlc2NyaXB0b3JfID0gcG9vbF8tPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgc3RkOjpzdHJpbmcoVU5JVFRFU1RfUEFDS0FHRV9OQU1FKSArICIuVGVzdE1hcCIpOworICAgIHJlY3Vyc2l2ZV9tYXBfZGVzY3JpcHRvcl8gPSBwb29sXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKAorICAgICAgICBzdGQ6OnN0cmluZyhVTklUVEVTVF9QQUNLQUdFX05BTUUpICsgIi5UZXN0UmVjdXJzaXZlTWFwTWVzc2FnZSIpOworICAgIEFTU0VSVF9UUlVFKG1hcF9kZXNjcmlwdG9yXyAhPSBudWxscHRyKTsKKyAgICBBU1NFUlRfVFJVRShyZWN1cnNpdmVfbWFwX2Rlc2NyaXB0b3JfICE9IG51bGxwdHIpOworICAgIG1hcF9wcm90b3R5cGVfID0gZmFjdG9yeV8uR2V0UHJvdG90eXBlKG1hcF9kZXNjcmlwdG9yXyk7CisgIH0KK307CisKK1RFU1RfRihNYXBGaWVsZEluRHluYW1pY01lc3NhZ2VUZXN0LCBNYXBJbmRlcGVuZGVudE9mZnNldHMpIHsKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgZmllbGRzIGhhdmUgaW5kZXBlbmRlbnQgb2Zmc2V0cyBieSBzZXR0aW5nIGVhY2gKKyAgLy8gb25lIHRvIGEgdW5pcXVlIHZhbHVlIHRoZW4gY2hlY2tpbmcgdGhhdCB0aGV5IGFsbCBzdGlsbCBoYXZlIHRob3NlCisgIC8vIHVuaXF1ZSB2YWx1ZXMgKGkuZS4gdGhleSBkb24ndCBzdG9tcCBlYWNoIG90aGVyKS4KKyAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UobWFwX3Byb3RvdHlwZV8tPk5ldygpKTsKKyAgTWFwUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihtYXBfZGVzY3JpcHRvcl8pOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldE1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24obWVzc2FnZS5nZXQoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1hcEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oKm1lc3NhZ2UpOworfQorCitURVNUX0YoTWFwRmllbGRJbkR5bmFtaWNNZXNzYWdlVGVzdCwgRHluYW1pY01hcFJlZmxlY3Rpb24pIHsKKyAgLy8gQ2hlY2sgdGhhdCBtYXAgZmllbGRzIHdvcmsgcHJvcGVybHkuCisgIHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlPiBtZXNzYWdlKG1hcF9wcm90b3R5cGVfLT5OZXcoKSk7CisKKyAgLy8gQ2hlY2sgc2V0IGZ1bmN0aW9ucy4KKyAgTWFwUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihtYXBfZGVzY3JpcHRvcl8pOworICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRNYXBGaWVsZHNWaWFNYXBSZWZsZWN0aW9uKG1lc3NhZ2UuZ2V0KCkpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNYXBGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKCptZXNzYWdlKTsKK30KKworVEVTVF9GKE1hcEZpZWxkSW5EeW5hbWljTWVzc2FnZVRlc3QsIE1hcFNwYWNlVXNlZCkgeworICAvLyBUZXN0IHRoYXQgU3BhY2VVc2VkTG9uZygpIHdvcmtzIHByb3Blcmx5CisKKyAgLy8gU2luY2Ugd2Ugc2hhcmUgdGhlIGltcGxlbWVudGF0aW9uIHdpdGggZ2VuZXJhdGVkIG1lc3NhZ2VzLCB3ZSBkb24ndCBuZWVkCisgIC8vIHRvIHRlc3QgdmVyeSBtdWNoIGhlcmUuICBKdXN0IG1ha2Ugc3VyZSBpdCBhcHBlYXJzIHRvIGJlIHdvcmtpbmcuCisKKyAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UobWFwX3Byb3RvdHlwZV8tPk5ldygpKTsKKyAgTWFwUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihtYXBfZGVzY3JpcHRvcl8pOworCisgIGludCBpbml0aWFsX3NwYWNlX3VzZWQgPSBtZXNzYWdlLT5TcGFjZVVzZWRMb25nKCk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0TWFwRmllbGRzVmlhUmVmbGVjdGlvbihtZXNzYWdlLmdldCgpKTsKKyAgRVhQRUNUX0xUKGluaXRpYWxfc3BhY2VfdXNlZCwgbWVzc2FnZS0+U3BhY2VVc2VkTG9uZygpKTsKK30KKworVEVTVF9GKE1hcEZpZWxkSW5EeW5hbWljTWVzc2FnZVRlc3QsIFJlY3Vyc2l2ZU1hcCkgeworICBUZXN0UmVjdXJzaXZlTWFwTWVzc2FnZSBmcm9tOworICAoKmZyb20ubXV0YWJsZV9hKCkpWyIiXTsKKyAgc3RkOjpzdHJpbmcgZGF0YSA9IGZyb20uU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+IHRvKAorICAgICAgZmFjdG9yeV8uR2V0UHJvdG90eXBlKHJlY3Vyc2l2ZV9tYXBfZGVzY3JpcHRvcl8pLT5OZXcoKSk7CisgIEFTU0VSVF9UUlVFKHRvLT5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworfQorCitURVNUX0YoTWFwRmllbGRJbkR5bmFtaWNNZXNzYWdlVGVzdCwgTWFwVmFsdWVSZWZlcmVybmNlVmFsaWRBZnRlclNlcmlhbGl6ZSkgeworICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gbWVzc2FnZShtYXBfcHJvdG90eXBlXy0+TmV3KCkpOworICBNYXBSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKG1hcF9kZXNjcmlwdG9yXyk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldE1hcEZpZWxkc1ZpYU1hcFJlZmxlY3Rpb24obWVzc2FnZS5nZXQoKSk7CisKKyAgLy8gR2V0IHZhbHVlIHJlZmVyZW5jZSBiZWZvcmUgc2VyaWFsaXphdGlvbiwgc28gdGhhdCB3ZSBrbm93IHRoZSB2YWx1ZSBpcyBmcm9tCisgIC8vIG1hcC4KKyAgTWFwS2V5IG1hcF9rZXk7CisgIE1hcFZhbHVlUmVmIG1hcF92YWw7CisgIG1hcF9rZXkuU2V0SW50MzJWYWx1ZSgwKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuR2V0TWFwVmFsdWVWaWFNYXBSZWZsZWN0aW9uKAorICAgICAgbWVzc2FnZS5nZXQoKSwgIm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UiLCBtYXBfa2V5LCAmbWFwX3ZhbCk7CisgIE1lc3NhZ2UqIHN1Ym1zZyA9IG1hcF92YWwuTXV0YWJsZU1lc3NhZ2VWYWx1ZSgpOworCisgIC8vIEluIHByZXZpb3VzIGltcGxlbWVudGF0aW9uLCBjYWxsaW5nIFNlcmlhbGl6ZVRvU3RyaW5nIHdpbGwgY2F1c2Ugc3luY2luZworICAvLyBmcm9tIG1hcCB0byByZXBlYXRlZCBmaWVsZCwgd2hpY2ggd2lsbCBpbnZhbGlkYXRlIHRoZSBzdWJtc2cgd2UgcHJldmlvdXNseQorICAvLyBnb3QuCisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIG1lc3NhZ2UtPlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKworICBjb25zdCBSZWZsZWN0aW9uKiBzdWJtc2dfcmVmbGVjdGlvbiA9IHN1Ym1zZy0+R2V0UmVmbGVjdGlvbigpOworICBjb25zdCBEZXNjcmlwdG9yKiBzdWJtc2dfZGVzYyA9IHN1Ym1zZy0+R2V0RGVzY3JpcHRvcigpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHN1Ym1zZ19maWVsZCA9IHN1Ym1zZ19kZXNjLT5GaW5kRmllbGRCeU5hbWUoImMiKTsKKyAgc3VibXNnX3JlZmxlY3Rpb24tPlNldEludDMyKHN1Ym1zZywgc3VibXNnX2ZpZWxkLCAxMjgpOworCisgIG1lc3NhZ2UtPlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgVGVzdE1hcCB0bzsKKyAgdG8uUGFyc2VGcm9tU3RyaW5nKGRhdGEpOworICBFWFBFQ1RfRVEoMTI4LCB0by5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKCkuYXQoMCkuYygpKTsKK30KKworVEVTVF9GKE1hcEZpZWxkSW5EeW5hbWljTWVzc2FnZVRlc3QsIE1hcEVudHJ5UmVmZXJlcm5jZVZhbGlkQWZ0ZXJTZXJpYWxpemUpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UobWFwX3Byb3RvdHlwZV8tPk5ldygpKTsKKyAgTWFwUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihtYXBfZGVzY3JpcHRvcl8pOworICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRNYXBGaWVsZHNWaWFSZWZsZWN0aW9uKG1lc3NhZ2UuZ2V0KCkpOworCisgIC8vIEdldCBtYXAgZW50cnkgYmVmb3JlIHNlcmlhbGl6YXRpb24sIHNvIHRoYXQgd2Uga25vdyB0aGUgaXQgaXMgZnJvbQorICAvLyByZXBlYXRlZCBmaWVsZC4KKyAgTWVzc2FnZSogbWFwX2VudHJ5ID0gcmVmbGVjdGlvbl90ZXN0ZXIuR2V0TWFwRW50cnlWaWFSZWZsZWN0aW9uKAorICAgICAgbWVzc2FnZS5nZXQoKSwgIm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UiLCAwKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogbWFwX2VudHJ5X3JlZmxlY3Rpb24gPSBtYXBfZW50cnktPkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgRGVzY3JpcHRvciogbWFwX2VudHJ5X2Rlc2MgPSBtYXBfZW50cnktPkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZV9maWVsZCA9IG1hcF9lbnRyeV9kZXNjLT5tYXBfdmFsdWUoKTsKKyAgTWVzc2FnZSogc3VibXNnID0KKyAgICAgIG1hcF9lbnRyeV9yZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZShtYXBfZW50cnksIHZhbHVlX2ZpZWxkKTsKKworICAvLyBJbiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiwgY2FsbGluZyBTZXJpYWxpemVUb1N0cmluZyB3aWxsIGNhdXNlIHN5bmNpbmcKKyAgLy8gZnJvbSByZXBlYXRlZCBmaWVsZCB0byBtYXAsIHdoaWNoIHdpbGwgaW52YWxpZGF0ZSB0aGUgbWFwX2VudHJ5IHdlCisgIC8vIHByZXZpb3VzbHkgZ290LgorICBzdGQ6OnN0cmluZyBkYXRhOworICBtZXNzYWdlLT5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogc3VibXNnX3JlZmxlY3Rpb24gPSBzdWJtc2ctPkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgRGVzY3JpcHRvciogc3VibXNnX2Rlc2MgPSBzdWJtc2ctPkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBzdWJtc2dfZmllbGQgPSBzdWJtc2dfZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJjIik7CisgIHN1Ym1zZ19yZWZsZWN0aW9uLT5TZXRJbnQzMihzdWJtc2csIHN1Ym1zZ19maWVsZCwgMTI4KTsKKworICBtZXNzYWdlLT5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisgIFRlc3RNYXAgdG87CisgIHRvLlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKKyAgRVhQRUNUX0VRKDEyOCwgdG8ubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpLmF0KDApLmMoKSk7Cit9CisKKy8vIFJlZmxlY3Rpb25PcHMgVGVzdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitURVNUKFJlZmxlY3Rpb25PcHNGb3JNYXBGaWVsZFRlc3QsIE1hcFNhbml0eUNoZWNrKSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2U7CisKKyAgTWFwVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZSk7CisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc0Zvck1hcEZpZWxkVGVzdCwgTWFwQ29weSkgeworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlLCBtZXNzYWdlMjsKKworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlKTsKKworICBSZWZsZWN0aW9uT3BzOjpDb3B5KG1lc3NhZ2UsICZtZXNzYWdlMik7CisKKyAgTWFwVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMik7CisKKyAgLy8gQ29weWluZyBmcm9tIHNlbGYgc2hvdWxkIGJlIGEgbm8tb3AuCisgIFJlZmxlY3Rpb25PcHM6OkNvcHkobWVzc2FnZTIsICZtZXNzYWdlMik7CisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNGb3JNYXBGaWVsZFRlc3QsIE1lcmdlTWFwKSB7CisgIC8vIE5vdGU6ICBDb3B5IGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIE1lcmdlKCkgc28gdGVjaG5pY2FsbHkgdGhlIENvcHkKKyAgLy8gICB0ZXN0IGFscmVhZHkgdGVzdGVkIG1vc3Qgb2YgdGhpcy4KKworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlLCBtZXNzYWdlMjsKKworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlKTsKKworICBSZWZsZWN0aW9uT3BzOjpNZXJnZShtZXNzYWdlMiwgJm1lc3NhZ2UpOworCisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc0Zvck1hcEZpZWxkVGVzdCwgQ2xlYXJNYXApIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTsKKworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlKTsKKworICBSZWZsZWN0aW9uT3BzOjpDbGVhcigmbWVzc2FnZSk7CisKKyAgTWFwVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNGb3JNYXBGaWVsZFRlc3QsIE1hcERpc2NhcmRVbmtub3duRmllbGRzKSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2U7CisgIE1hcFRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UpOworCisgIC8vIFNldCBzb21lIHVua25vd24gZmllbGRzIGluIG1lc3NhZ2UuCisgIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5NdXRhYmxlVW5rbm93bkZpZWxkcygmbWVzc2FnZSktPkFkZFZhcmludCgxMjM0NTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTQzMjEpOworCisgIC8vIERpc2NhcmQgdGhlbS4KKyAgUmVmbGVjdGlvbk9wczo6RGlzY2FyZFVua25vd25GaWVsZHMoJm1lc3NhZ2UpOworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UpOworCisgIEVYUEVDVF9FUSgwLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldFVua25vd25GaWVsZHMobWVzc2FnZSkuZmllbGRfY291bnQoKSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc0Zvck1hcEZpZWxkVGVzdCwgSXNJbml0aWFsaXplZCkgeworICBVTklUVEVTVDo6VGVzdFJlcXVpcmVkTWVzc2FnZU1hcCBtYXBfbWVzc2FnZTsKKworICAvLyBBZGQgYW4gdW5pbml0aWFsaXplZCBtZXNzYWdlLgorICAoKm1hcF9tZXNzYWdlLm11dGFibGVfbWFwX2ZpZWxkKCkpWzBdOworICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtYXBfbWVzc2FnZSkpOworCisgIC8vIEluaXRpYWxpemUgdW5pbml0aWFsaXplZCBtZXNzYWdlCisgICgqbWFwX21lc3NhZ2UubXV0YWJsZV9tYXBfZmllbGQoKSlbMF0uc2V0X2EoMCk7CisgICgqbWFwX21lc3NhZ2UubXV0YWJsZV9tYXBfZmllbGQoKSlbMF0uc2V0X2IoMCk7CisgICgqbWFwX21lc3NhZ2UubXV0YWJsZV9tYXBfZmllbGQoKSlbMF0uc2V0X2MoMCk7CisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWFwX21lc3NhZ2UpKTsKK30KKworLy8gV2lyZSBGb3JtYXQgVGVzdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RFU1QoV2lyZUZvcm1hdEZvck1hcEZpZWxkVGVzdCwgUGFyc2VNYXApIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgc291cmNlLCBkZXN0OworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgIE1hcFRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJnNvdXJjZSk7CisgIHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgLy8gUGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZkZXN0KTsKKworICAvLyBDaGVjay4KKyAgTWFwVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChkZXN0KTsKK30KKworVEVTVChXaXJlRm9ybWF0Rm9yTWFwRmllbGRUZXN0LCBNYXBCeXRlU2l6ZSkgeworICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlOworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlKTsKKworICBFWFBFQ1RfRVEobWVzc2FnZS5CeXRlU2l6ZUxvbmcoKSwgV2lyZUZvcm1hdDo6Qnl0ZVNpemUobWVzc2FnZSkpOworICBtZXNzYWdlLkNsZWFyKCk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkJ5dGVTaXplTG9uZygpKTsKKyAgRVhQRUNUX0VRKDAsIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKK30KKworVEVTVChXaXJlRm9ybWF0Rm9yTWFwRmllbGRUZXN0LCBTZXJpYWxpemVNYXApIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVkX2RhdGE7CisgIHN0ZDo6c3RyaW5nIGR5bmFtaWNfZGF0YTsKKworICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlKTsKKworICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgorICB7CisgICAgbWVzc2FnZS5CeXRlU2l6ZUxvbmcoKTsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmdlbmVyYXRlZF9kYXRhKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0KTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOworICB9CisKKyAgLy8gU2VyaWFsaXplIHVzaW5nIFdpcmVGb3JtYXQuCisgIHsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmR5bmFtaWNfZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgc2l6ZV90IHNpemUgPSBXaXJlRm9ybWF0OjpCeXRlU2l6ZShtZXNzYWdlKTsKKyAgICBXaXJlRm9ybWF0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMobWVzc2FnZSwgc2l6ZSwgJm91dHB1dCk7CisgICAgQVNTRVJUX0ZBTFNFKG91dHB1dC5IYWRFcnJvcigpKTsKKyAgfQorCisgIC8vIFNob3VsZCBwYXJzZSB0byB0aGUgc2FtZSBtZXNzYWdlLgorICBFWFBFQ1RfVFJVRShUZXN0VXRpbDo6RXF1YWxzVG9TZXJpYWxpemVkKG1lc3NhZ2UsIGdlbmVyYXRlZF9kYXRhKSk7CisgIEVYUEVDVF9UUlVFKFRlc3RVdGlsOjpFcXVhbHNUb1NlcmlhbGl6ZWQobWVzc2FnZSwgZHluYW1pY19kYXRhKSk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdEZvck1hcEZpZWxkVGVzdCwgU2VyaWFsaXplTWFwRHluYW1pY01lc3NhZ2UpIHsKKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGZhY3Rvcnk7CisgIHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlPiBkeW5hbWljX21lc3NhZ2U7CisgIGR5bmFtaWNfbWVzc2FnZS5yZXNldCgKKyAgICAgIGZhY3RvcnkuR2V0UHJvdG90eXBlKFVOSVRURVNUOjpUZXN0TWFwOjpkZXNjcmlwdG9yKCkpLT5OZXcoKSk7CisgIE1hcFJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldE1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24oZHluYW1pY19tZXNzYWdlLmdldCgpKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWFwRmllbGRzU2V0VmlhUmVmbGVjdGlvbigqZHluYW1pY19tZXNzYWdlKTsKKworICBVTklUVEVTVDo6VGVzdE1hcCBnZW5lcmF0ZWRfbWVzc2FnZTsKKyAgTWFwVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmZ2VuZXJhdGVkX21lc3NhZ2UpOworICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KGdlbmVyYXRlZF9tZXNzYWdlKTsKKworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZWRfZGF0YTsKKyAgc3RkOjpzdHJpbmcgZHluYW1pY19kYXRhOworCisgIC8vIFNlcmlhbGl6ZS4KKyAgZ2VuZXJhdGVkX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmdlbmVyYXRlZF9kYXRhKTsKKyAgZHluYW1pY19tZXNzYWdlLT5TZXJpYWxpemVUb1N0cmluZygmZHluYW1pY19kYXRhKTsKKworICAvLyBCZWNhdXNlIG1hcCBzZXJpYWxpemF0aW9uIGRvZXNuJ3QgZ3VhcmFudGVlIG9yZGVyLCB3ZSBqdXN0IGNvbXBhcmUKKyAgLy8gc2VyaWFsaXplZCBzaXplIGhlcmUuIFRoaXMgaXMgZW5vdWdoIHRvIHRlbGwgZHluYW1pYyBtZXNzYWdlIGRvZXNuJ3QgbWlzcworICAvLyBhbnl0aGluZyBpbiBzZXJpYWxpemF0aW9uLgorICBFWFBFQ1RfVFJVRShkeW5hbWljX2RhdGEuc2l6ZSgpID09IGdlbmVyYXRlZF9kYXRhLnNpemUoKSk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdEZvck1hcEZpZWxkVGVzdCwgTWFwQnl0ZVNpemVEeW5hbWljTWVzc2FnZSkgeworICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZmFjdG9yeTsKKyAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+IGR5bmFtaWNfbWVzc2FnZTsKKyAgZHluYW1pY19tZXNzYWdlLnJlc2V0KAorICAgICAgZmFjdG9yeS5HZXRQcm90b3R5cGUoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSktPk5ldygpKTsKKyAgTWFwUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihVTklUVEVTVDo6VGVzdE1hcDo6ZGVzY3JpcHRvcigpKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0TWFwRmllbGRzVmlhUmVmbGVjdGlvbihkeW5hbWljX21lc3NhZ2UuZ2V0KCkpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNYXBGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKCpkeW5hbWljX21lc3NhZ2UpOworICBzdGQ6OnN0cmluZyBleHBlY3RlZF9zZXJpYWxpemVkX2RhdGE7CisgIGR5bmFtaWNfbWVzc2FnZS0+U2VyaWFsaXplVG9TdHJpbmcoJmV4cGVjdGVkX3NlcmlhbGl6ZWRfZGF0YSk7CisgIGludCBleHBlY3RlZF9zaXplID0gZXhwZWN0ZWRfc2VyaWFsaXplZF9kYXRhLnNpemUoKTsKKyAgRVhQRUNUX0VRKGR5bmFtaWNfbWVzc2FnZS0+Qnl0ZVNpemVMb25nKCksIGV4cGVjdGVkX3NpemUpOworICBUZXN0TWFwIGV4cGVjdGVkX21lc3NhZ2U7CisgIGV4cGVjdGVkX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGV4cGVjdGVkX3NlcmlhbGl6ZWRfZGF0YSk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UyOworICBtZXNzYWdlMi5yZXNldChmYWN0b3J5LkdldFByb3RvdHlwZShVTklUVEVTVDo6VGVzdE1hcDo6ZGVzY3JpcHRvcigpKS0+TmV3KCkpOworICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRNYXBGaWVsZHNWaWFNYXBSZWZsZWN0aW9uKG1lc3NhZ2UyLmdldCgpKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KKyAgICAgIFVOSVRURVNUOjpUZXN0TWFwOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgibWFwX2ludDMyX2ludDMyIik7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBkeW5hbWljX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICAvLyBGb3JjZSB0aGUgbWFwIGZpZWxkIHRvIG1hcmsgd2l0aCBTVEFURV9NT0RJRklFRF9SRVBFQVRFRAorICByZWZsZWN0aW9uLT5SZW1vdmVMYXN0KGR5bmFtaWNfbWVzc2FnZS5nZXQoKSwgZmllbGQpOworICBkeW5hbWljX21lc3NhZ2UtPk1lcmdlRnJvbSgqbWVzc2FnZTIpOworICBkeW5hbWljX21lc3NhZ2UtPk1lcmdlRnJvbSgqbWVzc2FnZTIpOworICAvLyBUaGUgbWFwIGZpZWxkIGlzIG1hcmtlZCBhcyBTVEFURV9NT0RJRklFRF9SRVBFQVRFRCwgQnl0ZVNpemVMb25nKCkgd2lsbCB1c2UKKyAgLy8gcmVwZWF0ZWQgZmllbGQgd2hpY2ggaGF2ZSBkdXBsaWNhdGUga2V5cyB0byBjYWxjdWxhdGUuCisgIHNpemVfdCBkdXBsaWNhdGVfc2l6ZSA9IGR5bmFtaWNfbWVzc2FnZS0+Qnl0ZVNpemVMb25nKCk7CisgIEVYUEVDVF9UUlVFKGR1cGxpY2F0ZV9zaXplID4gZXhwZWN0ZWRfc2l6ZSk7CisgIHN0ZDo6c3RyaW5nIGR1cGxpY2F0ZV9zZXJpYWxpemVkX2RhdGE7CisgIGR5bmFtaWNfbWVzc2FnZS0+U2VyaWFsaXplVG9TdHJpbmcoJmR1cGxpY2F0ZV9zZXJpYWxpemVkX2RhdGEpOworICBFWFBFQ1RfRVEoZHluYW1pY19tZXNzYWdlLT5CeXRlU2l6ZUxvbmcoKSwgZHVwbGljYXRlX3NlcmlhbGl6ZWRfZGF0YS5zaXplKCkpOworCisgIC8vIEZvcmNlIHRoZSBtYXAgZmllbGQgdG8gbWFyayB3aXRoIG1hcCBDTEVBTgorICBFWFBFQ1RfRVEocmVmbGVjdGlvbl90ZXN0ZXIuTWFwU2l6ZSgKKyAgICAgICpkeW5hbWljX21lc3NhZ2UsICJtYXBfaW50MzJfaW50MzIiKSwgMik7CisgIEVYUEVDVF9FUShyZWZsZWN0aW9uX3Rlc3Rlci5NYXBTaXplKAorICAgICAgKmR5bmFtaWNfbWVzc2FnZSwgIm1hcF9pbnQzMl9pbnQzMiIpLCAyKTsKKyAgRVhQRUNUX0VRKHJlZmxlY3Rpb25fdGVzdGVyLk1hcFNpemUoCisgICAgICAqZHluYW1pY19tZXNzYWdlLCAibWFwX2ludDY0X2ludDY0IiksIDIpOworICBFWFBFQ1RfRVEocmVmbGVjdGlvbl90ZXN0ZXIuTWFwU2l6ZSgKKyAgICAgICpkeW5hbWljX21lc3NhZ2UsICJtYXBfdWludDMyX3VpbnQzMiIpLCAyKTsKKyAgRVhQRUNUX0VRKHJlZmxlY3Rpb25fdGVzdGVyLk1hcFNpemUoCisgICAgICAqZHluYW1pY19tZXNzYWdlLCAibWFwX3VpbnQ2NF91aW50NjQiKSwgMik7CisgIEVYUEVDVF9FUShyZWZsZWN0aW9uX3Rlc3Rlci5NYXBTaXplKAorICAgICAgKmR5bmFtaWNfbWVzc2FnZSwgIm1hcF9zaW50MzJfc2ludDMyIiksIDIpOworICBFWFBFQ1RfRVEocmVmbGVjdGlvbl90ZXN0ZXIuTWFwU2l6ZSgKKyAgICAgICpkeW5hbWljX21lc3NhZ2UsICJtYXBfc2ludDY0X3NpbnQ2NCIpLCAyKTsKKyAgRVhQRUNUX0VRKHJlZmxlY3Rpb25fdGVzdGVyLk1hcFNpemUoCisgICAgICAqZHluYW1pY19tZXNzYWdlLCAibWFwX2ZpeGVkMzJfZml4ZWQzMiIpLCAyKTsKKyAgRVhQRUNUX0VRKHJlZmxlY3Rpb25fdGVzdGVyLk1hcFNpemUoCisgICAgICAqZHluYW1pY19tZXNzYWdlLCAibWFwX2ZpeGVkNjRfZml4ZWQ2NCIpLCAyKTsKKyAgRVhQRUNUX0VRKHJlZmxlY3Rpb25fdGVzdGVyLk1hcFNpemUoCisgICAgICAqZHluYW1pY19tZXNzYWdlLCAibWFwX3NmaXhlZDMyX3NmaXhlZDMyIiksIDIpOworICBFWFBFQ1RfRVEocmVmbGVjdGlvbl90ZXN0ZXIuTWFwU2l6ZSgKKyAgICAgICpkeW5hbWljX21lc3NhZ2UsICJtYXBfc2ZpeGVkNjRfc2ZpeGVkNjQiKSwgMik7CisgIEVYUEVDVF9FUShyZWZsZWN0aW9uX3Rlc3Rlci5NYXBTaXplKAorICAgICAgKmR5bmFtaWNfbWVzc2FnZSwgIm1hcF9pbnQzMl9mbG9hdCIpLCAyKTsKKyAgRVhQRUNUX0VRKHJlZmxlY3Rpb25fdGVzdGVyLk1hcFNpemUoCisgICAgICAqZHluYW1pY19tZXNzYWdlLCAibWFwX2ludDMyX2RvdWJsZSIpLCAyKTsKKyAgRVhQRUNUX0VRKHJlZmxlY3Rpb25fdGVzdGVyLk1hcFNpemUoCisgICAgICAqZHluYW1pY19tZXNzYWdlLCAibWFwX2Jvb2xfYm9vbCIpLCAyKTsKKyAgRVhQRUNUX0VRKHJlZmxlY3Rpb25fdGVzdGVyLk1hcFNpemUoCisgICAgICAqZHluYW1pY19tZXNzYWdlLCAibWFwX3N0cmluZ19zdHJpbmciKSwgMik7CisgIEVYUEVDVF9FUShyZWZsZWN0aW9uX3Rlc3Rlci5NYXBTaXplKAorICAgICAgKmR5bmFtaWNfbWVzc2FnZSwgIm1hcF9pbnQzMl9ieXRlcyIpLCAyKTsKKyAgRVhQRUNUX0VRKHJlZmxlY3Rpb25fdGVzdGVyLk1hcFNpemUoCisgICAgICAqZHluYW1pY19tZXNzYWdlLCAibWFwX2ludDMyX2VudW0iKSwgMik7CisgIEVYUEVDVF9FUShyZWZsZWN0aW9uX3Rlc3Rlci5NYXBTaXplKCpkeW5hbWljX21lc3NhZ2UsICJtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlIiksIDIpOworICAvLyBUaGUgbWFwIGZpZWxkIGlzIG1hcmtlZCBhcyBDTEVBTiwgQnl0ZVNpemVMb25nKCkgd2lsbCB1c2UgbWFwIHdoaWNoIGRvIG5vdAorICAvLyBoYXZlIGR1cGxpY2F0ZSBrZXlzIHRvIGNhbGN1bGF0ZS4KKyAgaW50IHNpemUgPSBkeW5hbWljX21lc3NhZ2UtPkJ5dGVTaXplTG9uZygpOworICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc2l6ZSwgc2l6ZSk7CisKKyAgLy8gUHJvdG9idWYgdXNlZCB0byBoYXZlIGEgYnVnIGZvciBzZXJpYWxpemUgd2hlbiBtYXAgaXQgbWFya2VkIENMRUFOLiBJdCB1c2VkCisgIC8vIHJlcGVhdGVkIGZpZWxkIHRvIGNhbGN1bGF0ZSBCeXRlU2l6ZUxvbmcgYnV0IHVzZSBtYXAgdG8gc2VyaWFsaXplIHRoZSByZWFsCisgIC8vIGRhdGEsIHRodXMgdGhlIEJ5dGVTaXplTG9uZyBtYXkgYmlnZ2VyIHRoYW4gcmVhbCBzZXJpYWxpemVkIHNpemUuIEEgY3Jhc2gKKyAgLy8gbWlnaHQgYmUgaGFwcGVuIGF0IFNlcmlhbGl6ZVRvU3RyaW5nKCkuIE9yIGFuICJ1bmV4cGVjdGVkIGVuZCBncm91cCIKKyAgLy8gd2FybmluZyB3YXMgcmFpc2VkIGF0IHBhcnNlIGJhY2sgaWYgdXNlciB1c2UgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkKKyAgLy8gd2hpY2ggYXZvaWRzIHNpemUgY2hlY2sgYXQgc2VyaWFsaXplLgorICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkX2RhdGE7CisgIGR5bmFtaWNfbWVzc2FnZS0+U2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWRfZGF0YSk7CisgIEVYUEVDVF9UUlVFKGR5bmFtaWNfbWVzc2FnZS0+UGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWRfZGF0YSkpOworfQorCitURVNUKFdpcmVGb3JtYXRGb3JNYXBGaWVsZFRlc3QsIE1hcFBhcnNlSGVscGVycykgeworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICAvLyBTZXQgdXAuCisgICAgVU5JVFRFU1Q6OlRlc3RNYXAgbWVzc2FnZTsKKyAgICBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlKTsKKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgfQorCisgIHsKKyAgICAvLyBUZXN0IFBhcnNlRnJvbVN0cmluZy4KKyAgICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlOworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UpOworICB9CisKKyAgeworICAgIC8vIFRlc3QgUGFyc2VGcm9tSXN0cmVhbS4KKyAgICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbShkYXRhKTsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbUlzdHJlYW0oJnN0cmVhbSkpOworICAgIEVYUEVDVF9UUlVFKHN0cmVhbS5lb2YoKSk7CisgICAgTWFwVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlKTsKKyAgfQorCisgIHsKKyAgICAvLyBUZXN0IFBhcnNlRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbS4KKyAgICBzdGQ6OnN0cmluZyBkYXRhX3dpdGhfanVuayhkYXRhKTsKKyAgICBkYXRhX3dpdGhfanVuay5hcHBlbmQoInNvbWUganVuayBvbiB0aGUgZW5kIik7CisgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gc3RyZWFtKGRhdGFfd2l0aF9qdW5rLmRhdGEoKSwgZGF0YV93aXRoX2p1bmsuc2l6ZSgpKTsKKyAgICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlOworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtKCZzdHJlYW0sIGRhdGEuc2l6ZSgpKSk7CisgICAgTWFwVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlKTsKKyAgfQorCisgIHsKKyAgICAvLyBUZXN0IHRoYXQgUGFyc2VGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtIGZhaWxzIChidXQgZG9lc24ndCBjcmFzaCkgaWYKKyAgICAvLyBFT0YgaXMgcmVhY2hlZCBiZWZvcmUgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBieXRlcy4KKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0oZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgICAgRVhQRUNUX0ZBTFNFKAorICAgICAgICBtZXNzYWdlLlBhcnNlRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbSgmc3RyZWFtLCBkYXRhLnNpemUoKSArIDEpKTsKKyAgfQorfQorCisvLyBEZXRlcm1pbmlzdGljIFNlcmlhbGl6YXRpb24gVGVzdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgc3RkOjpzdHJpbmcgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6YXRpb25XaXRoU2VyaWFsaXplUGFydGlhbFRvQ29kZWRTdHJlYW0oCisgICAgY29uc3QgVCYgdCkgeworICBjb25zdCBzaXplX3Qgc2l6ZSA9IHQuQnl0ZVNpemVMb25nKCk7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdChzaXplLCAnXDAnKTsKKyAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbSg6Omdvb2dsZTo6cHJvdG9idWY6OnN0cmluZ19hc19hcnJheSgmcmVzdWx0KSwgc2l6ZSk7CisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZhcnJheV9zdHJlYW0pOworICBvdXRwdXRfc3RyZWFtLlNldFNlcmlhbGl6YXRpb25EZXRlcm1pbmlzdGljKHRydWUpOworICB0LlNlcmlhbGl6ZVBhcnRpYWxUb0NvZGVkU3RyZWFtKCZvdXRwdXRfc3RyZWFtKTsKKyAgRVhQRUNUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7CisgIEVYUEVDVF9FUShzaXplLCBvdXRwdXRfc3RyZWFtLkJ5dGVDb3VudCgpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgc3RkOjpzdHJpbmcgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6YXRpb25XaXRoU2VyaWFsaXplVG9Db2RlZFN0cmVhbSgKKyAgICBjb25zdCBUJiB0KSB7CisgIGNvbnN0IHNpemVfdCBzaXplID0gdC5CeXRlU2l6ZUxvbmcoKTsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0KHNpemUsICdcMCcpOworICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gYXJyYXlfc3RyZWFtKDo6Z29vZ2xlOjpwcm90b2J1Zjo6c3RyaW5nX2FzX2FycmF5KCZyZXN1bHQpLCBzaXplKTsKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7CisgIG91dHB1dF9zdHJlYW0uU2V0U2VyaWFsaXphdGlvbkRldGVybWluaXN0aWModHJ1ZSk7CisgIHQuU2VyaWFsaXplVG9Db2RlZFN0cmVhbSgmb3V0cHV0X3N0cmVhbSk7CisgIEVYUEVDVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHN0ZDo6c3RyaW5nIERldGVybWluaXN0aWNTZXJpYWxpemF0aW9uKGNvbnN0IFQmIHQpIHsKKyAgY29uc3Qgc2l6ZV90IHNpemUgPSB0LkJ5dGVTaXplTG9uZygpOworICBzdGQ6OnN0cmluZyByZXN1bHQoc2l6ZSwgJ1wwJyk7CisgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oOjpnb29nbGU6OnByb3RvYnVmOjpzdHJpbmdfYXNfYXJyYXkoJnJlc3VsdCksIHNpemUpOworICB7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7CisgICAgb3V0cHV0X3N0cmVhbS5TZXRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYyh0cnVlKTsKKyAgICB0LlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0X3N0cmVhbSk7CisgICAgRVhQRUNUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7CisgICAgRVhQRUNUX0VRKHNpemUsIG91dHB1dF9zdHJlYW0uQnl0ZUNvdW50KCkpOworICB9CisgIEVYUEVDVF9FUShyZXN1bHQsIERldGVybWluaXN0aWNTZXJpYWxpemF0aW9uV2l0aFNlcmlhbGl6ZVRvQ29kZWRTdHJlYW0odCkpOworICBFWFBFQ1RfRVEocmVzdWx0LAorICAgICAgICAgICAgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6YXRpb25XaXRoU2VyaWFsaXplUGFydGlhbFRvQ29kZWRTdHJlYW0odCkpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBIZWxwZXIgZm9yIE1hcFNlcmlhbGl6YXRpb25UZXN0LiAgUmV0dXJuIGEgNy1iaXQgQVNDSUkgc3RyaW5nLgorc3RhdGljIHN0ZDo6c3RyaW5nIENvbnN0cnVjdEtleSh1aW50NjRfdCBuKSB7CisgIHN0ZDo6c3RyaW5nIHMobiAlIHN0YXRpY19jYXN0PHVpbnQ2NF90Pig5KSwgJ1wwJyk7CisgIGlmIChzLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gU3RyQ2F0KG4pOworICB9IGVsc2UgeworICAgIHdoaWxlIChuICE9IDApIHsKKyAgICAgIHNbbiAlIHMuc2l6ZSgpXSA9IChuID4+IDEwKSAmIDB4N2Y7CisgICAgICBuIC89IDg4ODsKKyAgICB9CisgICAgcmV0dXJuIHM7CisgIH0KK30KKworVEVTVChNYXBTZXJpYWxpemF0aW9uVGVzdCwgRGV0ZXJtaW5pc3RpYykgeworICBjb25zdCBpbnQga0l0ZXJzID0gMjU7CisgIFVOSVRURVNUOjpUZXN0TWFwcyB0OworICBVTklUVEVTVDo6VGVzdEludEludE1hcCBpbm5lcjsKKyAgKCppbm5lci5tdXRhYmxlX20oKSlbMF0gPSAoKmlubmVyLm11dGFibGVfbSgpKVsxMF0gPQorICAgICAgKCppbm5lci5tdXRhYmxlX20oKSlbLTIwMF0gPSAwOworICB1aW50NjRfdCBmcm9nID0gOTsKKyAgY29uc3QgdWludDY0X3QgbXVsdGlwbGllciA9IDB4YTI5Y2QxNmY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga0l0ZXJzOyBpKyspIHsKKyAgICBjb25zdCBpbnQzMl90IGkzMiA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGZyb2cgJiAweGZmZmZmZmZmKTsKKyAgICBjb25zdCB1aW50MzJfdCB1MzIgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaTMyKSAqIDkxOTE5OworICAgIGNvbnN0IGludDY0X3QgaTY0ID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oZnJvZyk7CisgICAgY29uc3QgdWludDY0X3QgdTY0ID0gZnJvZyAqIHN0YXRpY19jYXN0PHVpbnQ2NF90PigxODczMjEpOworICAgIGNvbnN0IGJvb2wgYiA9IGkzMiA+IDA7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgcyA9IENvbnN0cnVjdEtleShmcm9nKTsKKyAgICAoKmlubmVyLm11dGFibGVfbSgpKVtpXSA9IGkzMjsKKyAgICAoKnQubXV0YWJsZV9tX2ludDMyKCkpW2kzMl0gPSAoKnQubXV0YWJsZV9tX3NpbnQzMigpKVtpMzJdID0KKyAgICAgICAgKCp0Lm11dGFibGVfbV9zZml4ZWQzMigpKVtpMzJdID0gaW5uZXI7CisgICAgKCp0Lm11dGFibGVfbV91aW50MzIoKSlbdTMyXSA9ICgqdC5tdXRhYmxlX21fZml4ZWQzMigpKVt1MzJdID0gaW5uZXI7CisgICAgKCp0Lm11dGFibGVfbV9pbnQ2NCgpKVtpNjRdID0gKCp0Lm11dGFibGVfbV9zaW50NjQoKSlbaTY0XSA9CisgICAgICAgICgqdC5tdXRhYmxlX21fc2ZpeGVkNjQoKSlbaTY0XSA9IGlubmVyOworICAgICgqdC5tdXRhYmxlX21fdWludDY0KCkpW3U2NF0gPSAoKnQubXV0YWJsZV9tX2ZpeGVkNjQoKSlbdTY0XSA9IGlubmVyOworICAgICgqdC5tdXRhYmxlX21fYm9vbCgpKVtiXSA9IGlubmVyOworICAgICgqdC5tdXRhYmxlX21fc3RyaW5nKCkpW3NdID0gaW5uZXI7CisgICAgKCp0Lm11dGFibGVfbV9zdHJpbmcoKSlbcyArIHN0ZDo6c3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCAodTMyICUgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDkpKSwgYildID0KKyAgICAgICAgaW5uZXI7CisgICAgaW5uZXIubXV0YWJsZV9tKCktPmVyYXNlKGkpOworICAgIGZyb2cgPSBmcm9nICogbXVsdGlwbGllciArIGk7CisgICAgZnJvZyBePSAoZnJvZyA+PiA0MSk7CisgIH0KKworICAvLyBWZXJpZmllcyBpZiB0d28gY29uc2VjdXRpdmUgY2FsbHMgdG8gZGV0ZXJtaW5pc3RpYyBzZXJpYWxpemF0aW9uIHByb2R1Y2UKKyAgLy8gdGhlIHNhbWUgYnl0ZXMuIERldGVybWluaXN0aWMgc2VyaWFsaXphdGlvbiBtZWFucyB0aGUgc2FtZSBzZXJpYWxpemF0aW9uCisgIC8vIGJ5dGVzIGluIHRoZSBzYW1lIGJpbmFyeS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgczEgPSBEZXRlcm1pbmlzdGljU2VyaWFsaXphdGlvbih0KTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgczIgPSBEZXRlcm1pbmlzdGljU2VyaWFsaXphdGlvbih0KTsKKyAgRVhQRUNUX0VRKHMxLCBzMik7CisKKyAgVU5JVFRFU1Q6OlRlc3RNYXBzIHU7CisgIEVYUEVDVF9UUlVFKHUuUGFyc2VGcm9tU3RyaW5nKHMxKSk7CisgIEVYUEVDVF9UUlVFKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RXF1YWxzKHUsIHQpKTsKK30KKworVEVTVChNYXBTZXJpYWxpemF0aW9uVGVzdCwgRGV0ZXJtaW5pc3RpY1N1Ym1lc3NhZ2UpIHsKKyAgVU5JVFRFU1Q6OlRlc3RTdWJtZXNzYWdlTWFwcyBwOworICBVTklUVEVTVDo6VGVzdE1hcHMgdDsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSAiZ29sZGVuX21lc3NhZ2VfbWFwcyI7CisgIHN0ZDo6c3RyaW5nIGdvbGRlbjsKKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkdldENvbnRlbnRzKAorICAgICAgVGVzdFV0aWw6OkdldFRlc3REYXRhUGF0aCgibmV0L3Byb3RvMi9pbnRlcm5hbC90ZXN0ZGF0YS8iICsgZmlsZW5hbWUpLAorICAgICAgJmdvbGRlbiwgdHJ1ZSkpOworICB0LlBhcnNlRnJvbVN0cmluZyhnb2xkZW4pOworICAqKHAubXV0YWJsZV9tKCkpID0gdDsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHY7CisgIC8vIFVzZSBtdWx0aXBsZSBhdHRlbXB0cyB0byBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIGEgZmFpbHVyZSBpZiBzb21ldGhpbmcgaXMKKyAgLy8gYnVnZ3kuICBGb3IgZXhhbXBsZSwgZWFjaCBzZXBhcmF0ZSBjb3B5IG9mIGEgbWFwIG1pZ2h0IHVzZSBhIGRpZmZlcmVudAorICAvLyByYW5kb21seS1jaG9zZW4gaGFzaCBmdW5jdGlvbi4KKyAgY29uc3QgaW50IGtBdHRlbXB0cyA9IDEwOworICBmb3IgKGludCBpID0gMDsgaSA8IGtBdHRlbXB0czsgaSsrKSB7CisgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtdW5uZWNlc3NhcnktY29weS1pbml0aWFsaXphdGlvbikKKyAgICBVTklUVEVTVDo6VGVzdFN1Ym1lc3NhZ2VNYXBzIHEocCk7CisgICAgQVNTRVJUX0VRKERldGVybWluaXN0aWNTZXJpYWxpemF0aW9uKHEpLCBEZXRlcm1pbmlzdGljU2VyaWFsaXphdGlvbihwKSk7CisgIH0KK30KKworLy8gVGV4dCBGb3JtYXQgVGVzdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RFU1QoVGV4dEZvcm1hdE1hcFRlc3QsIFNlcmlhbGl6ZUFuZFBhcnNlKSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIHNvdXJjZTsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgZGVzdDsKKyAgTWFwVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmc291cmNlKTsKKyAgc3RkOjpzdHJpbmcgb3V0cHV0OworCisgIC8vIFRlc3QgY29tcGFjdCBBU0NJSQorICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIHByaW50ZXIuUHJpbnRUb1N0cmluZyhzb3VyY2UsICZvdXRwdXQpOworICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOworICBFWFBFQ1RfVFJVRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKG91dHB1dCwgJmRlc3QpKTsKKyAgTWFwVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChkZXN0KTsKK30KKworVEVTVChUZXh0Rm9ybWF0TWFwVGVzdCwgRHluYW1pY01lc3NhZ2UpIHsKKyAgVGVzdE1hcCBwcm90b3R5cGU7CisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OworICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gbWVzc2FnZSgKKyAgICAgIGZhY3RvcnkuR2V0UHJvdG90eXBlKHByb3RvdHlwZS5HZXREZXNjcmlwdG9yKCkpLT5OZXcoKSk7CisgIE1hcFJlZmxlY3Rpb25UZXN0ZXIgdGVzdGVyKG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSk7CisgIHRlc3Rlci5TZXRNYXBGaWVsZHNWaWFSZWZsZWN0aW9uKG1lc3NhZ2UuZ2V0KCkpOworCisgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3RleHQ7CisgIEdPT0dMRV9DSEVDS19PSygKKyAgICAgIEZpbGU6OkdldENvbnRlbnRzKFRlc3RVdGlsOjpHZXRUZXN0RGF0YVBhdGgoIm5ldC9wcm90bzIvaW50ZXJuYWwvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdGRhdGEvbWFwX3Rlc3RfZGF0YS50eHQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZleHBlY3RlZF90ZXh0LCB0cnVlKSk7CisKKyAgQ2xlYW5TdHJpbmdMaW5lRW5kaW5ncygmZXhwZWN0ZWRfdGV4dCwgZmFsc2UpOworICBzdGQ6OnN0cmluZyBhY3R1YWxfdGV4dDsKKyAgVGV4dEZvcm1hdDo6UHJpbnRUb1N0cmluZygqbWVzc2FnZSwgJmFjdHVhbF90ZXh0KTsKKyAgRVhQRUNUX0VRKGFjdHVhbF90ZXh0LCBleHBlY3RlZF90ZXh0KTsKK30KKworVEVTVChUZXh0Rm9ybWF0TWFwVGVzdCwgU29ydGVkKSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2U7CisgIE1hcFJlZmxlY3Rpb25UZXN0ZXIgdGVzdGVyKG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpKTsKKyAgdGVzdGVyLlNldE1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworCisgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3RleHQ7CisgIEdPT0dMRV9DSEVDS19PSygKKyAgICAgIEZpbGU6OkdldENvbnRlbnRzKFRlc3RVdGlsOjpHZXRUZXN0RGF0YVBhdGgoIm5ldC9wcm90bzIvaW50ZXJuYWwvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdGRhdGEvbWFwX3Rlc3RfZGF0YS50eHQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZleHBlY3RlZF90ZXh0LCB0cnVlKSk7CisKKyAgQ2xlYW5TdHJpbmdMaW5lRW5kaW5ncygmZXhwZWN0ZWRfdGV4dCwgZmFsc2UpOworICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIHN0ZDo6c3RyaW5nIGFjdHVhbF90ZXh0OworICBwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJmFjdHVhbF90ZXh0KTsKKyAgRVhQRUNUX0VRKGFjdHVhbF90ZXh0LCBleHBlY3RlZF90ZXh0KTsKKworICAvLyBUZXN0IGFnYWluIG9uIHRoZSByZXZlcnNlIG9yZGVyLgorICBVTklUVEVTVDo6VGVzdE1hcCBtZXNzYWdlMjsKKyAgdGVzdGVyLlNldE1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UyKTsKKyAgdGVzdGVyLlN3YXBNYXBzVmlhUmVmbGVjdGlvbigmbWVzc2FnZTIpOworICBwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZTIsICZhY3R1YWxfdGV4dCk7CisgIEVYUEVDVF9FUShhY3R1YWxfdGV4dCwgZXhwZWN0ZWRfdGV4dCk7Cit9CisKK1RFU1QoVGV4dEZvcm1hdE1hcFRlc3QsIFBhcnNlQ29ycnVwdGVkU3RyaW5nKSB7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRfbWVzc2FnZTsKKyAgR09PR0xFX0NIRUNLX09LKAorICAgICAgRmlsZTo6R2V0Q29udGVudHMoVGVzdFV0aWw6OkdldFRlc3REYXRhUGF0aCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV0L3Byb3RvMi9pbnRlcm5hbC90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9tYXBzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAmc2VyaWFsaXplZF9tZXNzYWdlLCB0cnVlKSk7CisgIFVOSVRURVNUOjpUZXN0TWFwcyBtZXNzYWdlOworICBHT09HTEVfQ0hFQ0sobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZF9tZXNzYWdlKSk7CisgIFRlc3RQYXJzZUNvcnJ1cHRlZFN0cmluZzxVTklUVEVTVDo6VGVzdE1hcHMsIHRydWU+KG1lc3NhZ2UpOworICBUZXN0UGFyc2VDb3JydXB0ZWRTdHJpbmc8VU5JVFRFU1Q6OlRlc3RNYXBzLCBmYWxzZT4obWVzc2FnZSk7Cit9CisKKy8vIFByZXZpb3VzbHksIHNlcmlhbGl6aW5nIHRvIHRleHQgZm9ybWF0IHdpbGwgZGlzYWJsZSBpdGVyYXRvciBmcm9tIGdlbmVyYXRlZAorLy8gQVBJLiBOb3csIHRoZSBpdGVyYXRvciBjYW4gYmUgc3RpbGwgdXNlZCBldmVuIGFmdGVyIHNlcmlhbGl6aW5nIHRvIHRleHQKKy8vIGZvcm1hdC4KK1RFU1QoVGV4dEZvcm1hdE1hcFRlc3QsIE5vRGlzYWJsZUl0ZXJhdG9yKSB7CisgIFVOSVRURVNUOjpUZXN0TWFwIHNvdXJjZTsKKyAgKCpzb3VyY2UubXV0YWJsZV9tYXBfaW50MzJfaW50MzIoKSlbMV0gPSAxOworCisgIC8vIEdldCBpdGVyYXRvci4KKyAgTWFwPGludDMyX3QsIGludDMyX3Q+OjppdGVyYXRvciBpdGVyID0KKyAgICAgIHNvdXJjZS5tdXRhYmxlX21hcF9pbnQzMl9pbnQzMigpLT5maW5kKDEpOworCisgIC8vIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIHRleHQgZm9ybWF0LCB3aGljaCB3aWxsIGludmFsaWRhdGUgdGhlIHByZXZpb3VzCisgIC8vIGl0ZXJhdG9yIHByZXZpb3VzbHkuCisgIHN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBwcmludGVyLlByaW50VG9TdHJpbmcoc291cmNlLCAmb3V0cHV0KTsKKworICAvLyBNb2RpZnkgbWFwIHZpYSB0aGUgaXRlcmF0b3IgKGludmFsaWRhdGVkIGluIHByZXZpb3VzIGltcGxlbWVudGF0aW9uLikuCisgIGl0ZXItPnNlY29uZCA9IDI7CisKKyAgLy8gSW4gcHJldmlvdXMgaW1wbGVtZW50YXRpb24sIHRoZSBuZXcgY2hhbmdlIHdvbid0IGJlIHJlZmxlY3RlZCBpbiB0ZXh0CisgIC8vIGZvcm1hdCwgYmVjYXVzZSB0aGUgcHJldmlvdXMgaXRlcmF0b3IgaGFzIGJlZW4gaW52YWxpZGF0ZWQuCisgIG91dHB1dC5jbGVhcigpOworICBwcmludGVyLlByaW50VG9TdHJpbmcoc291cmNlLCAmb3V0cHV0KTsKKyAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQgPQorICAgICAgIm1hcF9pbnQzMl9pbnQzMiB7XG4iCisgICAgICAiICBrZXk6IDFcbiIKKyAgICAgICIgIHZhbHVlOiAyXG4iCisgICAgICAifVxuIjsKKyAgRVhQRUNUX0VRKG91dHB1dCwgZXhwZWN0ZWQpOworfQorCisvLyBQcmV2aW91c2x5LCBzZXJpYWxpemluZyB0byB0ZXh0IGZvcm1hdCB3aWxsIGRpc2FibGUgaXRlcmF0b3IgZnJvbSByZWZsZWN0aW9uCisvLyBBUEkuCitURVNUKFRleHRGb3JtYXRNYXBUZXN0LCBOb0Rpc2FibGVSZWZsZWN0aW9uSXRlcmF0b3IpIHsKKyAgVU5JVFRFU1Q6OlRlc3RNYXAgc291cmNlOworICAoKnNvdXJjZS5tdXRhYmxlX21hcF9pbnQzMl9pbnQzMigpKVsxXSA9IDE7CisKKyAgLy8gR2V0IGl0ZXJhdG9yLiBUaGlzIHdpbGwgYWxzbyBzeW5jIGludGVybmFsIHJlcGVhdGVkIGZpZWxkIHdpdGggbWFwIGluc2lkZQorICAvLyBvZiBNYXBGaWVsZC4KKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IHNvdXJjZS5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzYyA9CisgICAgICBzb3VyY2UuR2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9pbnQzMl9pbnQzMiIpOworICBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KiBtYXBfZmllbGQgPQorICAgICAgcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4oJnNvdXJjZSwgZmllbGRfZGVzYyk7CisgIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT46Oml0ZXJhdG9yIGl0ZXIgPSBtYXBfZmllbGQtPmJlZ2luKCk7CisKKyAgLy8gU2VyaWFsaXplIG1lc3NhZ2UgdG8gdGV4dCBmb3JtYXQsIHdoaWNoIHdpbGwgaW52YWxpZGF0ZSB0aGUgcHJldmlvdXMKKyAgLy8gaXRlcmF0b3IgcHJldmlvdXNseS4KKyAgc3RkOjpzdHJpbmcgb3V0cHV0OworICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIHByaW50ZXIuUHJpbnRUb1N0cmluZyhzb3VyY2UsICZvdXRwdXQpOworCisgIC8vIE1vZGlmeSBtYXAgdmlhIHRoZSBpdGVyYXRvciAoaW52YWxpZGF0ZWQgaW4gcHJldmlvdXMgaW1wbGVtZW50YXRpb24uKS4KKyAgY29uc3QgUmVmbGVjdGlvbiogbWFwX2VudHJ5X3JlZmxlY3Rpb24gPSBpdGVyLT5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsdWVfZmllbGRfZGVzYyA9IGl0ZXItPkdldERlc2NyaXB0b3IoKS0+bWFwX3ZhbHVlKCk7CisgIG1hcF9lbnRyeV9yZWZsZWN0aW9uLT5TZXRJbnQzMigmKCppdGVyKSwgdmFsdWVfZmllbGRfZGVzYywgMik7CisgIEdPT0dMRV9MT0coSU5GTykgPDwgaXRlci0+RGVidWdTdHJpbmcoKTsKKworICAvLyBJbiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiwgdGhlIG5ldyBjaGFuZ2Ugd29uJ3QgYmUgcmVmbGVjdGVkIGluIHRleHQKKyAgLy8gZm9ybWF0LCBiZWNhdXNlIHRoZSBwcmV2aW91cyBpdGVyYXRvciBoYXMgYmVlbiBpbnZhbGlkYXRlZC4KKyAgb3V0cHV0LmNsZWFyKCk7CisgIHByaW50ZXIuUHJpbnRUb1N0cmluZyhzb3VyY2UsICZvdXRwdXQpOworICBzdGQ6OnN0cmluZyBleHBlY3RlZCA9CisgICAgICAibWFwX2ludDMyX2ludDMyIHtcbiIKKyAgICAgICIgIGtleTogMVxuIgorICAgICAgIiAgdmFsdWU6IDJcbiIKKyAgICAgICJ9XG4iOworICBFWFBFQ1RfRVEob3V0cHV0LCBleHBlY3RlZCk7Cit9CisKKy8vIGFyZW5hIHN1cHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVEVTVChBcmVuYVRlc3QsIFBhcnNpbmdBbmRTZXJpYWxpemluZ05vSGVhcEFsbG9jYXRpb24pIHsKKyAgLy8gQWxsb2NhdGUgYSBsYXJnZSBpbml0aWFsIGJsb2NrIHRvIGF2b2lkIG1hbGxvY3MgZHVyaW5nIGhvb2tlZCB0ZXN0LgorICBzdGQ6OnZlY3RvcjxjaGFyPiBhcmVuYV9ibG9jaygxMjggKiAxMDI0KTsKKyAgQXJlbmFPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMuaW5pdGlhbF9ibG9jayA9ICZhcmVuYV9ibG9ja1swXTsKKyAgb3B0aW9ucy5pbml0aWFsX2Jsb2NrX3NpemUgPSBhcmVuYV9ibG9jay5zaXplKCk7CisgIEFyZW5hIGFyZW5hKG9wdGlvbnMpOworICBzdGQ6OnN0cmluZyBkYXRhOworICBkYXRhLnJlc2VydmUoMTI4ICogMTAyNCk7CisKKyAgeworICAgIC8vIFRPRE8odGVib3JpbmcpOiBFbmFibGUgbm8gaGVhcCBjaGVjayB3aGVuIEFyZW5hU3RyaW5nUHRyIGlzIHVzZWQgaW4gbWFwLgorICAgIC8vIE5vSGVhcENoZWNrZXIgbm9faGVhcDsKKworICAgIFVOSVRURVNUOjpUZXN0QXJlbmFNYXAqIGZyb20gPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxVTklUVEVTVDo6VGVzdEFyZW5hTWFwPigmYXJlbmEpOworICAgIE1hcFRlc3RVdGlsOjpTZXRBcmVuYU1hcEZpZWxkcyhmcm9tKTsKKyAgICBmcm9tLT5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgICBVTklUVEVTVDo6VGVzdEFyZW5hTWFwKiB0byA9CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFVOSVRURVNUOjpUZXN0QXJlbmFNYXA+KCZhcmVuYSk7CisgICAgdG8tPlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKKyAgICBNYXBUZXN0VXRpbDo6RXhwZWN0QXJlbmFNYXBGaWVsZHNTZXQoKnRvKTsKKyAgfQorfQorCitURVNUKEFyZW5hVGVzdCwgU3VibWVzc2FnZU9uU2FtZUFyZW5hKSB7CisgIEFyZW5hIGFyZW5hOworICBmb3IgKEFyZW5hKiBhcmVuYV90b191c2UgOiB7JmFyZW5hLCBzdGF0aWNfY2FzdDxBcmVuYSo+KG51bGxwdHIpfSkgeworICAgIEFyZW5hSG9sZGVyPFVOSVRURVNUOjpUZXN0QXJlbmFNYXA+IG0oYXJlbmFfdG9fdXNlKTsKKyAgICBhdXRvKiBzdWJtID0gJigqbS0+bXV0YWJsZV9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKCkpWzBdOworICAgIEVYUEVDVF9FUShzdWJtLT5HZXRBcmVuYSgpLCBhcmVuYV90b191c2UpOworICB9Cit9CisKKy8vIFVzZSB0ZXh0IGZvcm1hdCBwYXJzaW5nIGFuZCBzZXJpYWxpemluZyB0byB0ZXN0IHJlZmxlY3Rpb24gYXBpLgorVEVTVChBcmVuYVRlc3QsIFJlZmxlY3Rpb25JblRleHRGb3JtYXQpIHsKKyAgQXJlbmEgYXJlbmE7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOworCisgIFVOSVRURVNUOjpUZXN0QXJlbmFNYXAqIGZyb20gPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VU5JVFRFU1Q6OlRlc3RBcmVuYU1hcD4oJmFyZW5hKTsKKyAgVU5JVFRFU1Q6OlRlc3RBcmVuYU1hcCogdG8gPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VU5JVFRFU1Q6OlRlc3RBcmVuYU1hcD4oJmFyZW5hKTsKKworICBNYXBUZXN0VXRpbDo6U2V0QXJlbmFNYXBGaWVsZHMoZnJvbSk7CisgIHByaW50ZXIuUHJpbnRUb1N0cmluZygqZnJvbSwgJmRhdGEpOworCisgIEVYUEVDVF9UUlVFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoZGF0YSwgdG8pKTsKKyAgTWFwVGVzdFV0aWw6OkV4cGVjdEFyZW5hTWFwRmllbGRzU2V0KCp0byk7Cit9CisKKy8vIE1ha2Ugc3VyZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3Igc3RyaW5nIGluIG1hcCBpcyBkZWFsbG9jYXRlZC4KK1RFU1QoQXJlbmFUZXN0LCBTdHJpbmdNYXBOb0xlYWspIHsKKyAgQXJlbmEgYXJlbmE7CisgIFVOSVRURVNUOjpUZXN0QXJlbmFNYXAqIG1lc3NhZ2UgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VU5JVFRFU1Q6OlRlc3RBcmVuYU1hcD4oJmFyZW5hKTsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgLy8gU3RyaW5nIHdpdGggbGVuZ3RoIGxlc3MgdGhhbiAxNiB3aWxsIG5vdCBiZSBhbGxvY2F0ZWQgZnJvbSBoZWFwLgorICBpbnQgb3JpZ2luYWxfY2FwYWNpdHkgPSBkYXRhLmNhcGFjaXR5KCk7CisgIHdoaWxlIChkYXRhLmNhcGFjaXR5KCkgPD0gb3JpZ2luYWxfY2FwYWNpdHkpIHsKKyAgICBkYXRhLmFwcGVuZCgiYSIpOworICB9CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfc3RyaW5nX3N0cmluZygpKVtkYXRhXSA9IGRhdGE7CisgIC8vIFdlIHJlbHkgb24gaGVhcCBjaGVja2VycyB0byBkZXRlY3QgbWVtb3J5IGxlYWsgZm9yIHVzLgorICBBU1NFUlRfRkFMU0UobWVzc2FnZSA9PSBudWxscHRyKTsKK30KKworVEVTVChBcmVuYVRlc3QsIElzSW5pdGlhbGl6ZWQpIHsKKyAgLy8gQWxsb2NhdGUgYSBsYXJnZSBpbml0aWFsIHBvbGx1dGVkIGJsb2NrLgorICBzdGQ6OnZlY3RvcjxjaGFyPiBhcmVuYV9ibG9jaygxMjggKiAxMDI0KTsKKyAgc3RkOjpmaWxsKGFyZW5hX2Jsb2NrLmJlZ2luKCksIGFyZW5hX2Jsb2NrLmVuZCgpLCAnXHhmZicpOworCisgIEFyZW5hT3B0aW9ucyBvcHRpb25zOworICBvcHRpb25zLmluaXRpYWxfYmxvY2sgPSAmYXJlbmFfYmxvY2tbMF07CisgIG9wdGlvbnMuaW5pdGlhbF9ibG9ja19zaXplID0gYXJlbmFfYmxvY2suc2l6ZSgpOworICBBcmVuYSBhcmVuYShvcHRpb25zKTsKKworICBVTklUVEVTVDo6VGVzdEFyZW5hTWFwKiBtZXNzYWdlID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFVOSVRURVNUOjpUZXN0QXJlbmFNYXA+KCZhcmVuYSk7CisgIEVYUEVDVF9FUSgwLCAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2ludDMyKCkpWzBdKTsKK30KKworVEVTVChBcmVuYVRlc3QsIER5bmFtaWNNYXBGaWVsZE9uQXJlbmEpIHsKKyAgQXJlbmEgYXJlbmE7CisgIFVOSVRURVNUOjpUZXN0TWFwIG1lc3NhZ2UyOworCisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OworICBNZXNzYWdlKiBtZXNzYWdlMSA9CisgICAgICBmYWN0b3J5LkdldFByb3RvdHlwZShVTklUVEVTVDo6VGVzdE1hcDo6ZGVzY3JpcHRvcigpKS0+TmV3KCZhcmVuYSk7CisgIE1hcFJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoVU5JVFRFU1Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldE1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24obWVzc2FnZTEpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNYXBGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKCptZXNzYWdlMSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1hcEZpZWxkc1NldFZpYVJlZmxlY3Rpb25JdGVyYXRvcihtZXNzYWdlMSk7CisgIG1lc3NhZ2UyLkNvcHlGcm9tKCptZXNzYWdlMSk7CisgIE1hcFRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEFyZW5hVGVzdCwgRHluYW1pY01hcEZpZWxkT25BcmVuYU1lbW9yeUxlYWspIHsKKyAgYXV0byogZGVzYyA9IFVOSVRURVNUOjpUZXN0TWFwOjpkZXNjcmlwdG9yKCk7CisgIGF1dG8qIGZpZWxkID0gZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJtYXBfaW50MzJfaW50MzIiKTsKKworICBBcmVuYSBhcmVuYTsKKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGZhY3Rvcnk7CisgIGF1dG8qIG1lc3NhZ2UgPSBmYWN0b3J5LkdldFByb3RvdHlwZShkZXNjKS0+TmV3KCZhcmVuYSk7CisgIGF1dG8qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpOworCisgIC8vIEZvcmNlIGludGVybmFsIHN5bmNpbmcsIHdoaWNoIGluaXRpYWxpemVzIHRoZSBtdXRleC4KKyAgTWFwUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihVTklUVEVTVDo6VGVzdE1hcDo6ZGVzY3JpcHRvcigpKTsKKyAgaW50IHNpemUgPSByZWZsZWN0aW9uX3Rlc3Rlci5NYXBTaXplKCptZXNzYWdlLCAibWFwX2ludDMyX2ludDMyIik7CisgIEVYUEVDVF9FUShzaXplLCAxKTsKK30KKworVEVTVChNb3ZlVGVzdCwgTW92ZUNvbnN0cnVjdG9yV29ya3MpIHsKKyAgTWFwPGludDMyX3QsIFRlc3RBbGxUeXBlcz4gb3JpZ2luYWxfbWFwOworICBvcmlnaW5hbF9tYXBbNDJdLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDQyKTsKKyAgb3JpZ2luYWxfbWFwWzQzXS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig0Myk7CisgIGNvbnN0IGF1dG8qIG5lc3RlZF9tc2c0Ml9wdHIgPSAmb3JpZ2luYWxfbWFwWzQyXS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworICBjb25zdCBhdXRvKiBuZXN0ZWRfbXNnNDNfcHRyID0gJm9yaWdpbmFsX21hcFs0M10ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKTsKKworICBNYXA8aW50MzJfdCwgVGVzdEFsbFR5cGVzPiBtb3ZlZF90b19tYXAoc3RkOjptb3ZlKG9yaWdpbmFsX21hcCkpOworICBFWFBFQ1RfVFJVRShvcmlnaW5hbF9tYXAuZW1wdHkoKSk7CisgIEVYUEVDVF9FUSgyLCBtb3ZlZF90b19tYXAuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQyLCBtb3ZlZF90b19tYXBbNDJdLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuYmIoKSk7CisgIEVYUEVDVF9FUSg0MywgbW92ZWRfdG9fbWFwWzQzXS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworICAvLyBUaGlzIHRlc3QgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgcG9pbnRlcnMgYXJlIHN3YXBwZWQsIHNvIHRoZXJlCisgIC8vIHNob3VsZCBiZSBwb2ludGVyIHN0YWJpbGl0eS4KKyAgRVhQRUNUX0VRKG5lc3RlZF9tc2c0Ml9wdHIsICZtb3ZlZF90b19tYXBbNDJdLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEobmVzdGVkX21zZzQzX3B0ciwgJm1vdmVkX3RvX21hcFs0M10ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7Cit9CisKK1RFU1QoTW92ZVRlc3QsIE1vdmVBc3NpZ25tZW50V29ya3MpIHsKKyAgTWFwPGludDMyX3QsIFRlc3RBbGxUeXBlcz4gb3JpZ2luYWxfbWFwOworICBvcmlnaW5hbF9tYXBbNDJdLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDQyKTsKKyAgb3JpZ2luYWxfbWFwWzQzXS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig0Myk7CisgIGNvbnN0IGF1dG8qIG5lc3RlZF9tc2c0Ml9wdHIgPSAmb3JpZ2luYWxfbWFwWzQyXS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworICBjb25zdCBhdXRvKiBuZXN0ZWRfbXNnNDNfcHRyID0gJm9yaWdpbmFsX21hcFs0M10ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKTsKKworICBNYXA8aW50MzJfdCwgVGVzdEFsbFR5cGVzPiBtb3ZlZF90b19tYXAgPSBzdGQ6Om1vdmUob3JpZ2luYWxfbWFwKTsKKyAgRVhQRUNUX1RSVUUob3JpZ2luYWxfbWFwLmVtcHR5KCkpOworICBFWFBFQ1RfRVEoMiwgbW92ZWRfdG9fbWFwLnNpemUoKSk7CisgIEVYUEVDVF9FUSg0MiwgbW92ZWRfdG9fbWFwWzQyXS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworICBFWFBFQ1RfRVEoNDMsIG1vdmVkX3RvX21hcFs0M10ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5iYigpKTsKKyAgLy8gVGhpcyB0ZXN0IHRha2VzIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHBvaW50ZXJzIGFyZSBzd2FwcGVkLCBzbyB0aGVyZQorICAvLyBzaG91bGQgYmUgcG9pbnRlciBzdGFiaWxpdHkuCisgIEVYUEVDVF9FUShuZXN0ZWRfbXNnNDJfcHRyLCAmbW92ZWRfdG9fbWFwWzQyXS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKG5lc3RlZF9tc2c0M19wdHIsICZtb3ZlZF90b19tYXBbNDNdLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0X3V0aWwuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3Rlc3RfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMjE1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0X3V0aWwuaApAQCAtMCwwICsxLDQ2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTUFQX1RFU1RfVVRJTF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX01BUF9URVNUX1VUSUxfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fdGVzdGVyLmg+CisKKyNkZWZpbmUgVU5JVFRFU1QgOjpwcm90b2J1Zl91bml0dGVzdAorI2RlZmluZSBCUklER0VfVU5JVFRFU1QgOjpnb29nbGU6OnByb3RvYnVmOjpicmlkZ2VfdW5pdHRlc3QKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBhZnRlciBkZWZpbmluZyBVTklUVEVTVCwgZXRjLgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdF91dGlsLmluYz4KKworI3VuZGVmIFVOSVRURVNUCisjdW5kZWYgQlJJREdFX1VOSVRURVNUCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX01BUF9URVNUX1VUSUxfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0X3V0aWwuaW5jIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdF91dGlsLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjEyYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdF91dGlsLmluYwpAQCAtMCwwICsxLDI3MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdF91dGlsX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIE1hcFRlc3RVdGlsIHsKKyBwdWJsaWM6CisgIC8vIFNldCBldmVyeSBmaWVsZCBpbiB0aGUgVGVzdE1hcCBtZXNzYWdlIHRvIGEgdW5pcXVlIHZhbHVlLgorICBzdGF0aWMgdm9pZCBTZXRNYXBGaWVsZHMoVU5JVFRFU1Q6OlRlc3RNYXAqIG1lc3NhZ2UpOworCisgIC8vIFNldCBldmVyeSBmaWVsZCBpbiB0aGUgVGVzdEFyZW5hTWFwIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCisgIHN0YXRpYyB2b2lkIFNldEFyZW5hTWFwRmllbGRzKFVOSVRURVNUOjpUZXN0QXJlbmFNYXAqIG1lc3NhZ2UpOworCisgIC8vIFNldCBldmVyeSBmaWVsZCBpbiB0aGUgbWVzc2FnZSB0byBhIGRlZmF1bHQgdmFsdWUuCisgIHN0YXRpYyB2b2lkIFNldE1hcEZpZWxkc0luaXRpYWxpemVkKFVOSVRURVNUOjpUZXN0TWFwKiBtZXNzYWdlKTsKKworICAvLyBNb2RpZnkgYWxsIHRoZSBtYXAgZmllbGRzIG9mIHRoZSBtZXNzYWdlICh3aGljaCBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4KKyAgLy8gaW5pdGlhbGl6ZWQgd2l0aCBTZXRNYXBGaWVsZHMoKSkuCisgIHN0YXRpYyB2b2lkIE1vZGlmeU1hcEZpZWxkcyhVTklUVEVTVDo6VGVzdE1hcCogbWVzc2FnZSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgZmllbGRzIGhhdmUgdGhlIHZhbHVlcyB0aGF0IHRoZXkgc2hvdWxkIGhhdmUgYWZ0ZXIKKyAgLy8gU2V0TWFwRmllbGRzKCkgaXMgY2FsbGVkLgorICBzdGF0aWMgdm9pZCBFeHBlY3RNYXBGaWVsZHNTZXQoY29uc3QgVU5JVFRFU1Q6OlRlc3RNYXAmIG1lc3NhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgYWxsIGZpZWxkcyBoYXZlIHRoZSB2YWx1ZXMgdGhhdCB0aGV5IHNob3VsZCBoYXZlIGFmdGVyCisgIC8vIFNldE1hcEZpZWxkcygpIGlzIGNhbGxlZCBmb3IgVGVzdEFyZW5hTWFwLgorICBzdGF0aWMgdm9pZCBFeHBlY3RBcmVuYU1hcEZpZWxkc1NldChjb25zdCBVTklUVEVTVDo6VGVzdEFyZW5hTWFwJiBtZXNzYWdlKTsKKworICAvLyBDaGVjayB0aGF0IGFsbCBmaWVsZHMgaGF2ZSB0aGUgdmFsdWVzIHRoYXQgdGhleSBzaG91bGQgaGF2ZSBhZnRlcgorICAvLyBTZXRNYXBGaWVsZHNJbml0aWFsaXplZCgpIGlzIGNhbGxlZC4KKyAgc3RhdGljIHZvaWQgRXhwZWN0TWFwRmllbGRzU2V0SW5pdGlhbGl6ZWQoY29uc3QgVU5JVFRFU1Q6OlRlc3RNYXAmIG1lc3NhZ2UpOworCisgIC8vIEV4cGVjdCB0aGF0IHRoZSBtZXNzYWdlIGlzIG1vZGlmaWVkIGFzIHdvdWxkIGJlIGV4cGVjdGVkIGZyb20KKyAgLy8gTW9kaWZ5TWFwRmllbGRzKCkuCisgIHN0YXRpYyB2b2lkIEV4cGVjdE1hcEZpZWxkc01vZGlmaWVkKGNvbnN0IFVOSVRURVNUOjpUZXN0TWFwJiBtZXNzYWdlKTsKKworICAvLyBDaGVjayB0aGF0IGFsbCBmaWVsZHMgYXJlIGVtcHR5LgorICBzdGF0aWMgdm9pZCBFeHBlY3RDbGVhcihjb25zdCBVTklUVEVTVDo6VGVzdE1hcCYgbWVzc2FnZSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgbWFwIGZpZWxkcyBoYXZlIHRoZSBnaXZlbiBzaXplLgorICBzdGF0aWMgdm9pZCBFeHBlY3RNYXBzU2l6ZShjb25zdCBVTklUVEVTVDo6VGVzdE1hcCYgbWVzc2FnZSwgaW50IHNpemUpOworCisgIC8vIEdldCBwb2ludGVycyBvZiBtYXAgZW50cmllcyBhdCBnaXZlbiBpbmRleC4KKyAgc3RhdGljIHN0ZDo6dmVjdG9yPGNvbnN0IE1lc3NhZ2UqPiBHZXRNYXBFbnRyaWVzKAorICAgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RNYXAmIG1lc3NhZ2UsIGludCBpbmRleCk7CisKKyAgLy8gR2V0IHBvaW50ZXJzIG9mIG1hcCBlbnRyaWVzIGZyb20gcmVsZWFzZS4KKyAgc3RhdGljIHN0ZDo6dmVjdG9yPGNvbnN0IE1lc3NhZ2UqPiBHZXRNYXBFbnRyaWVzRnJvbVJlbGVhc2UoCisgICAgICBVTklUVEVTVDo6VGVzdE1hcCogbWVzc2FnZSk7Cit9OworCitpbmxpbmUgdm9pZCBNYXBUZXN0VXRpbDo6U2V0TWFwRmllbGRzKFVOSVRURVNUOjpUZXN0TWFwKiBtZXNzYWdlKSB7CisgIE1hcFRlc3RVdGlsSW1wbDo6U2V0TWFwRmllbGRzPFVOSVRURVNUOjpNYXBFbnVtLCBVTklUVEVTVDo6TUFQX0VOVU1fQkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklUVEVTVDo6TUFQX0VOVU1fQkFaPihtZXNzYWdlKTsKK30KKworaW5saW5lIHZvaWQgTWFwVGVzdFV0aWw6OlNldEFyZW5hTWFwRmllbGRzKFVOSVRURVNUOjpUZXN0QXJlbmFNYXAqIG1lc3NhZ2UpIHsKKyAgTWFwVGVzdFV0aWxJbXBsOjpTZXRBcmVuYU1hcEZpZWxkczxVTklUVEVTVDo6TWFwRW51bSwgVU5JVFRFU1Q6Ok1BUF9FTlVNX0JBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklUVEVTVDo6TUFQX0VOVU1fQkFaPihtZXNzYWdlKTsKK30KKworaW5saW5lIHZvaWQgTWFwVGVzdFV0aWw6OlNldE1hcEZpZWxkc0luaXRpYWxpemVkKFVOSVRURVNUOjpUZXN0TWFwKiBtZXNzYWdlKSB7CisgIE1hcFRlc3RVdGlsSW1wbDo6U2V0TWFwRmllbGRzSW5pdGlhbGl6ZWQobWVzc2FnZSk7Cit9CisKK2lubGluZSB2b2lkIE1hcFRlc3RVdGlsOjpNb2RpZnlNYXBGaWVsZHMoVU5JVFRFU1Q6OlRlc3RNYXAqIG1lc3NhZ2UpIHsKKyAgTWFwVGVzdFV0aWxJbXBsOjpNb2RpZnlNYXBGaWVsZHM8VU5JVFRFU1Q6Ok1hcEVudW0sIFVOSVRURVNUOjpNQVBfRU5VTV9GT08+KAorICAgICAgbWVzc2FnZSk7Cit9CisKK2lubGluZSB2b2lkIE1hcFRlc3RVdGlsOjpFeHBlY3RDbGVhcihjb25zdCBVTklUVEVTVDo6VGVzdE1hcCYgbWVzc2FnZSkgeworICBNYXBUZXN0VXRpbEltcGw6OkV4cGVjdENsZWFyKG1lc3NhZ2UpOworfQorCitpbmxpbmUgdm9pZCBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KGNvbnN0IFVOSVRURVNUOjpUZXN0TWFwJiBtZXNzYWdlKSB7CisgIE1hcFRlc3RVdGlsSW1wbDo6RXhwZWN0TWFwRmllbGRzU2V0PFVOSVRURVNUOjpNYXBFbnVtLCBVTklUVEVTVDo6TUFQX0VOVU1fQkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklUVEVTVDo6TUFQX0VOVU1fQkFaPihtZXNzYWdlKTsKK30KKworaW5saW5lIHZvaWQgTWFwVGVzdFV0aWw6OkV4cGVjdEFyZW5hTWFwRmllbGRzU2V0KAorICAgIGNvbnN0IFVOSVRURVNUOjpUZXN0QXJlbmFNYXAmIG1lc3NhZ2UpIHsKKyAgTWFwVGVzdFV0aWxJbXBsOjpFeHBlY3RBcmVuYU1hcEZpZWxkc1NldDwKKyAgICAgIFVOSVRURVNUOjpNYXBFbnVtLCBVTklUVEVTVDo6TUFQX0VOVU1fQkFSLCBVTklUVEVTVDo6TUFQX0VOVU1fQkFaPigKKyAgICAgIG1lc3NhZ2UpOworfQorCitpbmxpbmUgdm9pZCBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0SW5pdGlhbGl6ZWQoCisgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RNYXAmIG1lc3NhZ2UpIHsKKyAgTWFwVGVzdFV0aWxJbXBsOjpFeHBlY3RNYXBGaWVsZHNTZXRJbml0aWFsaXplZDxVTklUVEVTVDo6TWFwRW51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklUVEVTVDo6TUFQX0VOVU1fRk9PPigKKyAgICAgIG1lc3NhZ2UpOworfQorCitpbmxpbmUgdm9pZCBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzTW9kaWZpZWQoCisgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RNYXAmIG1lc3NhZ2UpIHsKKyAgTWFwVGVzdFV0aWxJbXBsOjpFeHBlY3RNYXBGaWVsZHNNb2RpZmllZDwKKyAgICAgIFVOSVRURVNUOjpNYXBFbnVtLCBVTklUVEVTVDo6TUFQX0VOVU1fQkFSLCBVTklUVEVTVDo6TUFQX0VOVU1fRk9PPigKKyAgICAgIG1lc3NhZ2UpOworfQorCitpbmxpbmUgdm9pZCBNYXBUZXN0VXRpbDo6RXhwZWN0TWFwc1NpemUoY29uc3QgVU5JVFRFU1Q6OlRlc3RNYXAmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOworCisgIEVYUEVDVF9FUShzaXplLCBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+RmllbGRTaXplKAorICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgibWFwX2ludDMyX2ludDMyIikpKTsKKyAgRVhQRUNUX0VRKHNpemUsIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5GaWVsZFNpemUoCisgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfaW50NjRfaW50NjQiKSkpOworICBFWFBFQ1RfRVEoc2l6ZSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5GaWVsZFNpemUoCisgICAgICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfdWludDMyX3VpbnQzMiIpKSk7CisgIEVYUEVDVF9FUShzaXplLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkZpZWxkU2l6ZSgKKyAgICAgICAgICAgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm1hcF91aW50NjRfdWludDY0IikpKTsKKyAgRVhQRUNUX0VRKHNpemUsCisgICAgICAgICAgICBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+RmllbGRTaXplKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgibWFwX3NpbnQzMl9zaW50MzIiKSkpOworICBFWFBFQ1RfRVEoc2l6ZSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5GaWVsZFNpemUoCisgICAgICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfc2ludDY0X3NpbnQ2NCIpKSk7CisgIEVYUEVDVF9FUShzaXplLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkZpZWxkU2l6ZSgKKyAgICAgICAgICAgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9maXhlZDMyX2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfRVEoc2l6ZSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5GaWVsZFNpemUoCisgICAgICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfZml4ZWQ2NF9maXhlZDY0IikpKTsKKyAgRVhQRUNUX0VRKHNpemUsCisgICAgICAgICAgICBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+RmllbGRTaXplKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgibWFwX3NmaXhlZDMyX3NmaXhlZDMyIikpKTsKKyAgRVhQRUNUX0VRKHNpemUsCisgICAgICAgICAgICBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+RmllbGRTaXplKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgibWFwX3NmaXhlZDY0X3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX0VRKHNpemUsIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5GaWVsZFNpemUoCisgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfaW50MzJfZmxvYXQiKSkpOworICBFWFBFQ1RfRVEoc2l6ZSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5GaWVsZFNpemUoCisgICAgICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfaW50MzJfZG91YmxlIikpKTsKKyAgRVhQRUNUX0VRKHNpemUsIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5GaWVsZFNpemUoCisgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfYm9vbF9ib29sIikpKTsKKyAgRVhQRUNUX0VRKHNpemUsCisgICAgICAgICAgICBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+RmllbGRTaXplKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgibWFwX3N0cmluZ19zdHJpbmciKSkpOworICBFWFBFQ1RfRVEoc2l6ZSwgbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkZpZWxkU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9pbnQzMl9ieXRlcyIpKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIHNpemUsCisgICAgICBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+RmllbGRTaXplKAorICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgibWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSIpKSk7Cit9CisKK2lubGluZSBzdGQ6OnZlY3Rvcjxjb25zdCBNZXNzYWdlKj4gTWFwVGVzdFV0aWw6OkdldE1hcEVudHJpZXMoCisgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RNYXAmIG1lc3NhZ2UsIGludCBpbmRleCkgeworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IE1lc3NhZ2UqPiByZXN1bHQ7CisKKyAgcmVzdWx0LnB1c2hfYmFjaygmbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldFJlcGVhdGVkTWVzc2FnZSgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgibWFwX2ludDMyX2ludDMyIiksIGluZGV4KSk7CisgIHJlc3VsdC5wdXNoX2JhY2soJm1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5HZXRSZXBlYXRlZE1lc3NhZ2UoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9pbnQ2NF9pbnQ2NCIpLCBpbmRleCkpOworICByZXN1bHQucHVzaF9iYWNrKCZtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfdWludDMyX3VpbnQzMiIpLCBpbmRleCkpOworICByZXN1bHQucHVzaF9iYWNrKCZtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfdWludDY0X3VpbnQ2NCIpLCBpbmRleCkpOworICByZXN1bHQucHVzaF9iYWNrKCZtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfc2ludDMyX3NpbnQzMiIpLCBpbmRleCkpOworICByZXN1bHQucHVzaF9iYWNrKCZtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfc2ludDY0X3NpbnQ2NCIpLCBpbmRleCkpOworICByZXN1bHQucHVzaF9iYWNrKCZtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfZml4ZWQzMl9maXhlZDMyIiksIGluZGV4KSk7CisgIHJlc3VsdC5wdXNoX2JhY2soJm1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5HZXRSZXBlYXRlZE1lc3NhZ2UoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9maXhlZDY0X2ZpeGVkNjQiKSwgaW5kZXgpKTsKKyAgcmVzdWx0LnB1c2hfYmFjaygmbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldFJlcGVhdGVkTWVzc2FnZSgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgibWFwX3NmaXhlZDMyX3NmaXhlZDMyIiksIGluZGV4KSk7CisgIHJlc3VsdC5wdXNoX2JhY2soJm1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5HZXRSZXBlYXRlZE1lc3NhZ2UoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCIpLCBpbmRleCkpOworICByZXN1bHQucHVzaF9iYWNrKCZtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfaW50MzJfZmxvYXQiKSwgaW5kZXgpKTsKKyAgcmVzdWx0LnB1c2hfYmFjaygmbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldFJlcGVhdGVkTWVzc2FnZSgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgibWFwX2ludDMyX2RvdWJsZSIpLCBpbmRleCkpOworICByZXN1bHQucHVzaF9iYWNrKCZtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfYm9vbF9ib29sIiksIGluZGV4KSk7CisgIHJlc3VsdC5wdXNoX2JhY2soJm1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5HZXRSZXBlYXRlZE1lc3NhZ2UoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9zdHJpbmdfc3RyaW5nIiksIGluZGV4KSk7CisgIHJlc3VsdC5wdXNoX2JhY2soJm1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5HZXRSZXBlYXRlZE1lc3NhZ2UoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9pbnQzMl9ieXRlcyIpLCBpbmRleCkpOworICByZXN1bHQucHVzaF9iYWNrKCZtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfaW50MzJfZW51bSIpLCBpbmRleCkpOworICByZXN1bHQucHVzaF9iYWNrKCZtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlIiksCisgICAgICBpbmRleCkpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2lubGluZSBzdGQ6OnZlY3Rvcjxjb25zdCBNZXNzYWdlKj4gTWFwVGVzdFV0aWw6OkdldE1hcEVudHJpZXNGcm9tUmVsZWFzZSgKKyAgICBVTklUVEVTVDo6VGVzdE1hcCogbWVzc2FnZSkgeworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpOworICBzdGQ6OnZlY3Rvcjxjb25zdCBNZXNzYWdlKj4gcmVzdWx0OworCisgIHJlc3VsdC5wdXNoX2JhY2sobWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5SZWxlYXNlTGFzdCgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgibWFwX2ludDMyX2ludDMyIikpKTsKKyAgcmVzdWx0LnB1c2hfYmFjayhtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlJlbGVhc2VMYXN0KAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfaW50NjRfaW50NjQiKSkpOworICByZXN1bHQucHVzaF9iYWNrKG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+UmVsZWFzZUxhc3QoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm1hcF91aW50MzJfdWludDMyIikpKTsKKyAgcmVzdWx0LnB1c2hfYmFjayhtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlJlbGVhc2VMYXN0KAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfdWludDY0X3VpbnQ2NCIpKSk7CisgIHJlc3VsdC5wdXNoX2JhY2sobWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5SZWxlYXNlTGFzdCgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgibWFwX3NpbnQzMl9zaW50MzIiKSkpOworICByZXN1bHQucHVzaF9iYWNrKG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+UmVsZWFzZUxhc3QoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9zaW50NjRfc2ludDY0IikpKTsKKyAgcmVzdWx0LnB1c2hfYmFjayhtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlJlbGVhc2VMYXN0KAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfZml4ZWQzMl9maXhlZDMyIikpKTsKKyAgcmVzdWx0LnB1c2hfYmFjayhtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlJlbGVhc2VMYXN0KAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfZml4ZWQ2NF9maXhlZDY0IikpKTsKKyAgcmVzdWx0LnB1c2hfYmFjayhtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlJlbGVhc2VMYXN0KAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfc2ZpeGVkMzJfc2ZpeGVkMzIiKSkpOworICByZXN1bHQucHVzaF9iYWNrKG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+UmVsZWFzZUxhc3QoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCIpKSk7CisgIHJlc3VsdC5wdXNoX2JhY2sobWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5SZWxlYXNlTGFzdCgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgibWFwX2ludDMyX2Zsb2F0IikpKTsKKyAgcmVzdWx0LnB1c2hfYmFjayhtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlJlbGVhc2VMYXN0KAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfaW50MzJfZG91YmxlIikpKTsKKyAgcmVzdWx0LnB1c2hfYmFjayhtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlJlbGVhc2VMYXN0KAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfYm9vbF9ib29sIikpKTsKKyAgcmVzdWx0LnB1c2hfYmFjayhtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlJlbGVhc2VMYXN0KAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfc3RyaW5nX3N0cmluZyIpKSk7CisgIHJlc3VsdC5wdXNoX2JhY2sobWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5SZWxlYXNlTGFzdCgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgibWFwX2ludDMyX2J5dGVzIikpKTsKKyAgcmVzdWx0LnB1c2hfYmFjayhtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlJlbGVhc2VMYXN0KAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJtYXBfaW50MzJfZW51bSIpKSk7CisgIHJlc3VsdC5wdXNoX2JhY2sobWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5SZWxlYXNlTGFzdCgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgibWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSIpKSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0X3V0aWxfaW1wbC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdF91dGlsX2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTVhZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdF91dGlsX2ltcGwuaApAQCAtMCwwICsxLDQ3NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX01BUF9URVNUX1VUSUxfSU1QTF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX01BUF9URVNUX1VUSUxfSU1QTF9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKworbmFtZXNwYWNlIHByb3RvYnVmX3VuaXR0ZXN0IHt9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWZfdW5pdHRlc3QKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCituYW1lc3BhY2UgdW5pdHRlc3QgPSA6OnByb3RvYnVmX3VuaXR0ZXN0OworCitjbGFzcyBNYXBUZXN0VXRpbEltcGwgeworIHB1YmxpYzoKKyAgLy8gU2V0IGV2ZXJ5IGZpZWxkIGluIHRoZSBUZXN0TWFwIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBFbnVtVHlwZSwgRW51bVR5cGUgZW51bV92YWx1ZTAsIEVudW1UeXBlIGVudW1fdmFsdWUxLAorICAgICAgICAgICAgdHlwZW5hbWUgTWFwTWVzc2FnZT4KKyAgc3RhdGljIHZvaWQgU2V0TWFwRmllbGRzKE1hcE1lc3NhZ2UqIG1lc3NhZ2UpOworCisgIC8vIFNldCBldmVyeSBmaWVsZCBpbiB0aGUgVGVzdEFyZW5hTWFwIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBFbnVtVHlwZSwgRW51bVR5cGUgZW51bV92YWx1ZTAsIEVudW1UeXBlIGVudW1fdmFsdWUxLAorICAgICAgICAgICAgdHlwZW5hbWUgTWFwTWVzc2FnZT4KKyAgc3RhdGljIHZvaWQgU2V0QXJlbmFNYXBGaWVsZHMoTWFwTWVzc2FnZSogbWVzc2FnZSk7CisKKyAgLy8gU2V0IGV2ZXJ5IGZpZWxkIGluIHRoZSBtZXNzYWdlIHRvIGEgZGVmYXVsdCB2YWx1ZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hcE1lc3NhZ2U+CisgIHN0YXRpYyB2b2lkIFNldE1hcEZpZWxkc0luaXRpYWxpemVkKE1hcE1lc3NhZ2UqIG1lc3NhZ2UpOworCisgIC8vIE1vZGlmeSBhbGwgdGhlIG1hcCBmaWVsZHMgb2YgdGhlIG1lc3NhZ2UgKHdoaWNoIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbgorICAvLyBpbml0aWFsaXplZCB3aXRoIFNldE1hcEZpZWxkcygpKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEVudW1UeXBlLCBFbnVtVHlwZSBlbnVtX3ZhbHVlLCB0eXBlbmFtZSBNYXBNZXNzYWdlPgorICBzdGF0aWMgdm9pZCBNb2RpZnlNYXBGaWVsZHMoTWFwTWVzc2FnZSogbWVzc2FnZSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgZmllbGRzIGhhdmUgdGhlIHZhbHVlcyB0aGF0IHRoZXkgc2hvdWxkIGhhdmUgYWZ0ZXIKKyAgLy8gU2V0TWFwRmllbGRzKCkgaXMgY2FsbGVkLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRW51bVR5cGUsIEVudW1UeXBlIGVudW1fdmFsdWUwLCBFbnVtVHlwZSBlbnVtX3ZhbHVlMSwKKyAgICAgICAgICAgIHR5cGVuYW1lIE1hcE1lc3NhZ2U+CisgIHN0YXRpYyB2b2lkIEV4cGVjdE1hcEZpZWxkc1NldChjb25zdCBNYXBNZXNzYWdlJiBtZXNzYWdlKTsKKworICAvLyBDaGVjayB0aGF0IGFsbCBmaWVsZHMgaGF2ZSB0aGUgdmFsdWVzIHRoYXQgdGhleSBzaG91bGQgaGF2ZSBhZnRlcgorICAvLyBTZXRNYXBGaWVsZHMoKSBpcyBjYWxsZWQgZm9yIFRlc3RBcmVuYU1hcC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEVudW1UeXBlLCBFbnVtVHlwZSBlbnVtX3ZhbHVlMCwgRW51bVR5cGUgZW51bV92YWx1ZTEsCisgICAgICAgICAgICB0eXBlbmFtZSBNYXBNZXNzYWdlPgorICBzdGF0aWMgdm9pZCBFeHBlY3RBcmVuYU1hcEZpZWxkc1NldChjb25zdCBNYXBNZXNzYWdlJiBtZXNzYWdlKTsKKworICAvLyBDaGVjayB0aGF0IGFsbCBmaWVsZHMgaGF2ZSB0aGUgdmFsdWVzIHRoYXQgdGhleSBzaG91bGQgaGF2ZSBhZnRlcgorICAvLyBTZXRNYXBGaWVsZHNJbml0aWFsaXplZCgpIGlzIGNhbGxlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEVudW1UeXBlLCBFbnVtVHlwZSBlbnVtX3ZhbHVlLCB0eXBlbmFtZSBNYXBNZXNzYWdlPgorICBzdGF0aWMgdm9pZCBFeHBlY3RNYXBGaWVsZHNTZXRJbml0aWFsaXplZChjb25zdCBNYXBNZXNzYWdlJiBtZXNzYWdlKTsKKworICAvLyBFeHBlY3QgdGhhdCB0aGUgbWVzc2FnZSBpcyBtb2RpZmllZCBhcyB3b3VsZCBiZSBleHBlY3RlZCBmcm9tCisgIC8vIE1vZGlmeU1hcEZpZWxkcygpLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRW51bVR5cGUsIEVudW1UeXBlIGVudW1fdmFsdWUwLCBFbnVtVHlwZSBlbnVtX3ZhbHVlMSwKKyAgICAgICAgICAgIHR5cGVuYW1lIE1hcE1lc3NhZ2U+CisgIHN0YXRpYyB2b2lkIEV4cGVjdE1hcEZpZWxkc01vZGlmaWVkKGNvbnN0IE1hcE1lc3NhZ2UmIG1lc3NhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgYWxsIGZpZWxkcyBhcmUgZW1wdHkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXBNZXNzYWdlPgorICBzdGF0aWMgdm9pZCBFeHBlY3RDbGVhcihjb25zdCBNYXBNZXNzYWdlJiBtZXNzYWdlKTsKKworICAvLyAvLyBDaGVjayB0aGF0IGFsbCBtYXAgZmllbGRzIGhhdmUgdGhlIGdpdmVuIHNpemUuCisgIC8vIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXBNZXNzYWdlPgorICAvLyBzdGF0aWMgdm9pZCBFeHBlY3RNYXBzU2l6ZShjb25zdCBNYXBNZXNzYWdlJiBtZXNzYWdlLCBpbnQgc2l6ZSk7CisKKyAgLy8gLy8gR2V0IHBvaW50ZXJzIG9mIG1hcCBlbnRyaWVzIGF0IGdpdmVuIGluZGV4LgorICAvLyBzdGF0aWMgc3RkOjp2ZWN0b3I8Y29uc3QgTWVzc2FnZSo+IEdldE1hcEVudHJpZXMoCisgIC8vICAgICBjb25zdCBNYXBNZXNzYWdlJiBtZXNzYWdlLCBpbnQgaW5kZXgpOworCisgIC8vIC8vIEdldCBwb2ludGVycyBvZiBtYXAgZW50cmllcyBmcm9tIHJlbGVhc2UuCisgIC8vIHN0YXRpYyBzdGQ6OnZlY3Rvcjxjb25zdCBNZXNzYWdlKj4gR2V0TWFwRW50cmllc0Zyb21SZWxlYXNlKAorICAvLyAgICAgTWFwTWVzc2FnZSogbWVzc2FnZSk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRW51bVR5cGUsIEVudW1UeXBlIGVudW1fdmFsdWUwLCBFbnVtVHlwZSBlbnVtX3ZhbHVlMSwKKyAgICAgICAgICB0eXBlbmFtZSBNYXBNZXNzYWdlPgordm9pZCBNYXBUZXN0VXRpbEltcGw6OlNldE1hcEZpZWxkcyhNYXBNZXNzYWdlKiBtZXNzYWdlKSB7CisgIC8vIEFkZCBmaXJzdCBlbGVtZW50LgorICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2ludDMyKCkpWzBdID0gMDsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQ2NF9pbnQ2NCgpKVswXSA9IDA7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfdWludDMyX3VpbnQzMigpKVswXSA9IDA7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfdWludDY0X3VpbnQ2NCgpKVswXSA9IDA7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfc2ludDMyX3NpbnQzMigpKVswXSA9IDA7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfc2ludDY0X3NpbnQ2NCgpKVswXSA9IDA7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfZml4ZWQzMl9maXhlZDMyKCkpWzBdID0gMDsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9maXhlZDY0X2ZpeGVkNjQoKSlbMF0gPSAwOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3NmaXhlZDMyX3NmaXhlZDMyKCkpWzBdID0gMDsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9zZml4ZWQ2NF9zZml4ZWQ2NCgpKVswXSA9IDA7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfaW50MzJfZmxvYXQoKSlbMF0gPSAwLjA7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfaW50MzJfZG91YmxlKCkpWzBdID0gMC4wOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2Jvb2xfYm9vbCgpKVswXSA9IGZhbHNlOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3N0cmluZ19zdHJpbmcoKSlbIjAiXSA9ICIwIjsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQzMl9ieXRlcygpKVswXSA9ICIwIjsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQzMl9lbnVtKCkpWzBdID0gZW51bV92YWx1ZTA7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKCkpWzBdLnNldF9jKDApOworCisgIC8vIEFkZCBzZWNvbmQgZWxlbWVudAorICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2ludDMyKCkpWzFdID0gMTsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQ2NF9pbnQ2NCgpKVsxXSA9IDE7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfdWludDMyX3VpbnQzMigpKVsxXSA9IDE7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfdWludDY0X3VpbnQ2NCgpKVsxXSA9IDE7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfc2ludDMyX3NpbnQzMigpKVsxXSA9IDE7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfc2ludDY0X3NpbnQ2NCgpKVsxXSA9IDE7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfZml4ZWQzMl9maXhlZDMyKCkpWzFdID0gMTsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9maXhlZDY0X2ZpeGVkNjQoKSlbMV0gPSAxOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3NmaXhlZDMyX3NmaXhlZDMyKCkpWzFdID0gMTsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9zZml4ZWQ2NF9zZml4ZWQ2NCgpKVsxXSA9IDE7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfaW50MzJfZmxvYXQoKSlbMV0gPSAxLjA7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfaW50MzJfZG91YmxlKCkpWzFdID0gMS4wOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2Jvb2xfYm9vbCgpKVsxXSA9IHRydWU7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfc3RyaW5nX3N0cmluZygpKVsiMSJdID0gIjEiOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2J5dGVzKCkpWzFdID0gIjEiOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2VudW0oKSlbMV0gPSBlbnVtX3ZhbHVlMTsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKSlbMV0uc2V0X2MoMSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbnVtVHlwZSwgRW51bVR5cGUgZW51bV92YWx1ZTAsIEVudW1UeXBlIGVudW1fdmFsdWUxLAorICAgICAgICAgIHR5cGVuYW1lIE1hcE1lc3NhZ2U+Cit2b2lkIE1hcFRlc3RVdGlsSW1wbDo6U2V0QXJlbmFNYXBGaWVsZHMoTWFwTWVzc2FnZSogbWVzc2FnZSkgeworICAvLyBBZGQgZmlyc3QgZWxlbWVudC4KKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQzMl9pbnQzMigpKVswXSA9IDA7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfaW50NjRfaW50NjQoKSlbMF0gPSAwOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3VpbnQzMl91aW50MzIoKSlbMF0gPSAwOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3VpbnQ2NF91aW50NjQoKSlbMF0gPSAwOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3NpbnQzMl9zaW50MzIoKSlbMF0gPSAwOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3NpbnQ2NF9zaW50NjQoKSlbMF0gPSAwOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ZpeGVkMzJfZml4ZWQzMigpKVswXSA9IDA7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfZml4ZWQ2NF9maXhlZDY0KCkpWzBdID0gMDsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9zZml4ZWQzMl9zZml4ZWQzMigpKVswXSA9IDA7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfc2ZpeGVkNjRfc2ZpeGVkNjQoKSlbMF0gPSAwOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2Zsb2F0KCkpWzBdID0gMC4wOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2RvdWJsZSgpKVswXSA9IDAuMDsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9ib29sX2Jvb2woKSlbMF0gPSBmYWxzZTsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9zdHJpbmdfc3RyaW5nKCkpWyIwIl0gPSAiMCI7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfaW50MzJfYnl0ZXMoKSlbMF0gPSAiMCI7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfaW50MzJfZW51bSgpKVswXSA9IGVudW1fdmFsdWUwOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpKVswXS5zZXRfYygwKTsKKworICAvLyBBZGQgc2Vjb25kIGVsZW1lbnQKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQzMl9pbnQzMigpKVsxXSA9IDE7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfaW50NjRfaW50NjQoKSlbMV0gPSAxOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3VpbnQzMl91aW50MzIoKSlbMV0gPSAxOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3VpbnQ2NF91aW50NjQoKSlbMV0gPSAxOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3NpbnQzMl9zaW50MzIoKSlbMV0gPSAxOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3NpbnQ2NF9zaW50NjQoKSlbMV0gPSAxOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ZpeGVkMzJfZml4ZWQzMigpKVsxXSA9IDE7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfZml4ZWQ2NF9maXhlZDY0KCkpWzFdID0gMTsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9zZml4ZWQzMl9zZml4ZWQzMigpKVsxXSA9IDE7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfc2ZpeGVkNjRfc2ZpeGVkNjQoKSlbMV0gPSAxOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2Zsb2F0KCkpWzFdID0gMS4wOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2RvdWJsZSgpKVsxXSA9IDEuMDsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9ib29sX2Jvb2woKSlbMV0gPSB0cnVlOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3N0cmluZ19zdHJpbmcoKSlbIjEiXSA9ICIxIjsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQzMl9ieXRlcygpKVsxXSA9ICIxIjsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQzMl9lbnVtKCkpWzFdID0gZW51bV92YWx1ZTE7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKCkpWzFdLnNldF9jKDEpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWFwTWVzc2FnZT4KK3ZvaWQgTWFwVGVzdFV0aWxJbXBsOjpTZXRNYXBGaWVsZHNJbml0aWFsaXplZChNYXBNZXNzYWdlKiBtZXNzYWdlKSB7CisgIC8vIEFkZCBmaXJzdCBlbGVtZW50IHVzaW5nIGJyYWNrZXQgb3BlcmF0b3IsIHdoaWNoIHNob3VsZCBhc3NpZ24gZGVmYXVsdAorICAvLyB2YWx1ZSBhdXRvbWF0aWNhbGx5LgorICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2ludDMyKCkpWzBdOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDY0X2ludDY0KCkpWzBdOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3VpbnQzMl91aW50MzIoKSlbMF07CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfdWludDY0X3VpbnQ2NCgpKVswXTsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9zaW50MzJfc2ludDMyKCkpWzBdOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3NpbnQ2NF9zaW50NjQoKSlbMF07CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfZml4ZWQzMl9maXhlZDMyKCkpWzBdOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ZpeGVkNjRfZml4ZWQ2NCgpKVswXTsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9zZml4ZWQzMl9zZml4ZWQzMigpKVswXTsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9zZml4ZWQ2NF9zZml4ZWQ2NCgpKVswXTsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQzMl9mbG9hdCgpKVswXTsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQzMl9kb3VibGUoKSlbMF07CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfYm9vbF9ib29sKCkpWzBdOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3N0cmluZ19zdHJpbmcoKSlbIjAiXTsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQzMl9ieXRlcygpKVswXTsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQzMl9lbnVtKCkpWzBdOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpKVswXTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVudW1UeXBlLCBFbnVtVHlwZSBlbnVtX3ZhbHVlLCB0eXBlbmFtZSBNYXBNZXNzYWdlPgordm9pZCBNYXBUZXN0VXRpbEltcGw6Ok1vZGlmeU1hcEZpZWxkcyhNYXBNZXNzYWdlKiBtZXNzYWdlKSB7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfaW50MzJfaW50MzIoKSlbMV0gPSAyOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDY0X2ludDY0KCkpWzFdID0gMjsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF91aW50MzJfdWludDMyKCkpWzFdID0gMjsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF91aW50NjRfdWludDY0KCkpWzFdID0gMjsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9zaW50MzJfc2ludDMyKCkpWzFdID0gMjsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9zaW50NjRfc2ludDY0KCkpWzFdID0gMjsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9maXhlZDMyX2ZpeGVkMzIoKSlbMV0gPSAyOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ZpeGVkNjRfZml4ZWQ2NCgpKVsxXSA9IDI7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfc2ZpeGVkMzJfc2ZpeGVkMzIoKSlbMV0gPSAyOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX3NmaXhlZDY0X3NmaXhlZDY0KCkpWzFdID0gMjsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQzMl9mbG9hdCgpKVsxXSA9IDIuMDsKKyAgKCptZXNzYWdlLT5tdXRhYmxlX21hcF9pbnQzMl9kb3VibGUoKSlbMV0gPSAyLjA7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfYm9vbF9ib29sKCkpWzFdID0gZmFsc2U7CisgICgqbWVzc2FnZS0+bXV0YWJsZV9tYXBfc3RyaW5nX3N0cmluZygpKVsiMSJdID0gIjIiOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2J5dGVzKCkpWzFdID0gIjIiOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2VudW0oKSlbMV0gPSBlbnVtX3ZhbHVlOworICAoKm1lc3NhZ2UtPm11dGFibGVfbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpKVsxXS5zZXRfYygyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hcE1lc3NhZ2U+Cit2b2lkIE1hcFRlc3RVdGlsSW1wbDo6RXhwZWN0Q2xlYXIoY29uc3QgTWFwTWVzc2FnZSYgbWVzc2FnZSkgeworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfaW50NjRfaW50NjQoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfdWludDMyX3VpbnQzMigpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF91aW50NjRfdWludDY0KCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX3NpbnQzMl9zaW50MzIoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfc2ludDY0X3NpbnQ2NCgpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9maXhlZDMyX2ZpeGVkMzIoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfZml4ZWQ2NF9maXhlZDY0KCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX3NmaXhlZDMyX3NmaXhlZDMyKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX3NmaXhlZDY0X3NmaXhlZDY0KCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ludDMyX2Zsb2F0KCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ludDMyX2RvdWJsZSgpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9ib29sX2Jvb2woKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfc3RyaW5nX3N0cmluZygpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9pbnQzMl9ieXRlcygpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9pbnQzMl9lbnVtKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbnVtVHlwZSwgRW51bVR5cGUgZW51bV92YWx1ZTAsIEVudW1UeXBlIGVudW1fdmFsdWUxLAorICAgICAgICAgIHR5cGVuYW1lIE1hcE1lc3NhZ2U+Cit2b2lkIE1hcFRlc3RVdGlsSW1wbDo6RXhwZWN0TWFwRmllbGRzU2V0KGNvbnN0IE1hcE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UubWFwX2ludDY0X2ludDY0KCkuc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UubWFwX3VpbnQzMl91aW50MzIoKS5zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5tYXBfdWludDY0X3VpbnQ2NCgpLnNpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLm1hcF9zaW50MzJfc2ludDMyKCkuc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UubWFwX3NpbnQ2NF9zaW50NjQoKS5zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5tYXBfZml4ZWQzMl9maXhlZDMyKCkuc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UubWFwX2ZpeGVkNjRfZml4ZWQ2NCgpLnNpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLm1hcF9zZml4ZWQzMl9zZml4ZWQzMigpLnNpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLm1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCgpLnNpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLm1hcF9pbnQzMl9mbG9hdCgpLnNpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLm1hcF9pbnQzMl9kb3VibGUoKS5zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5tYXBfYm9vbF9ib29sKCkuc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UubWFwX3N0cmluZ19zdHJpbmcoKS5zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5tYXBfaW50MzJfYnl0ZXMoKS5zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5tYXBfaW50MzJfZW51bSgpLnNpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKS5zaXplKCkpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ludDY0X2ludDY0KCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfdWludDMyX3VpbnQzMigpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX3VpbnQ2NF91aW50NjQoKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9zaW50MzJfc2ludDMyKCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfc2ludDY0X3NpbnQ2NCgpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ZpeGVkMzJfZml4ZWQzMigpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ZpeGVkNjRfZml4ZWQ2NCgpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX3NmaXhlZDMyX3NmaXhlZDMyKCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfc2ZpeGVkNjRfc2ZpeGVkNjQoKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9pbnQzMl9mbG9hdCgpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ludDMyX2RvdWJsZSgpLmF0KDApKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLm1hcF9ib29sX2Jvb2woKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgiMCIsIG1lc3NhZ2UubWFwX3N0cmluZ19zdHJpbmcoKS5hdCgiMCIpKTsKKyAgRVhQRUNUX0VRKCIwIiwgbWVzc2FnZS5tYXBfaW50MzJfYnl0ZXMoKS5hdCgwKSk7CisgIEVYUEVDVF9FUShlbnVtX3ZhbHVlMCwgbWVzc2FnZS5tYXBfaW50MzJfZW51bSgpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpLmF0KDApLmMoKSk7CisKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50NjRfaW50NjQoKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF91aW50MzJfdWludDMyKCkuYXQoMSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfdWludDY0X3VpbnQ2NCgpLmF0KDEpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX3NpbnQzMl9zaW50MzIoKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9zaW50NjRfc2ludDY0KCkuYXQoMSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfZml4ZWQzMl9maXhlZDMyKCkuYXQoMSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfZml4ZWQ2NF9maXhlZDY0KCkuYXQoMSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfc2ZpeGVkMzJfc2ZpeGVkMzIoKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCgpLmF0KDEpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2Zsb2F0KCkuYXQoMSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfZG91YmxlKCkuYXQoMSkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbWVzc2FnZS5tYXBfYm9vbF9ib29sKCkuYXQoMSkpOworICBFWFBFQ1RfRVEoIjEiLCBtZXNzYWdlLm1hcF9zdHJpbmdfc3RyaW5nKCkuYXQoIjEiKSk7CisgIEVYUEVDVF9FUSgiMSIsIG1lc3NhZ2UubWFwX2ludDMyX2J5dGVzKCkuYXQoMSkpOworICBFWFBFQ1RfRVEoZW51bV92YWx1ZTEsIG1lc3NhZ2UubWFwX2ludDMyX2VudW0oKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKS5hdCgxKS5jKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRW51bVR5cGUsIEVudW1UeXBlIGVudW1fdmFsdWUwLCBFbnVtVHlwZSBlbnVtX3ZhbHVlMSwKKyAgICAgICAgICB0eXBlbmFtZSBNYXBNZXNzYWdlPgordm9pZCBNYXBUZXN0VXRpbEltcGw6OkV4cGVjdEFyZW5hTWFwRmllbGRzU2V0KGNvbnN0IE1hcE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX2ludDY0X2ludDY0KCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX3VpbnQzMl91aW50MzIoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5tYXBfdWludDY0X3VpbnQ2NCgpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9zaW50MzJfc2ludDMyKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX3NpbnQ2NF9zaW50NjQoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5tYXBfZml4ZWQzMl9maXhlZDMyKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX2ZpeGVkNjRfZml4ZWQ2NCgpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9zZml4ZWQzMl9zZml4ZWQzMigpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCgpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9pbnQzMl9mbG9hdCgpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9pbnQzMl9kb3VibGUoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5tYXBfYm9vbF9ib29sKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX3N0cmluZ19zdHJpbmcoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5tYXBfaW50MzJfYnl0ZXMoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5tYXBfaW50MzJfZW51bSgpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKS5zaXplKCkpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ludDY0X2ludDY0KCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfdWludDMyX3VpbnQzMigpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX3VpbnQ2NF91aW50NjQoKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9zaW50MzJfc2ludDMyKCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfc2ludDY0X3NpbnQ2NCgpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ZpeGVkMzJfZml4ZWQzMigpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ZpeGVkNjRfZml4ZWQ2NCgpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX3NmaXhlZDMyX3NmaXhlZDMyKCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfc2ZpeGVkNjRfc2ZpeGVkNjQoKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9pbnQzMl9mbG9hdCgpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ludDMyX2RvdWJsZSgpLmF0KDApKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLm1hcF9ib29sX2Jvb2woKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgiMCIsIG1lc3NhZ2UubWFwX3N0cmluZ19zdHJpbmcoKS5hdCgiMCIpKTsKKyAgRVhQRUNUX0VRKCIwIiwgbWVzc2FnZS5tYXBfaW50MzJfYnl0ZXMoKS5hdCgwKSk7CisgIEVYUEVDVF9FUShlbnVtX3ZhbHVlMCwgbWVzc2FnZS5tYXBfaW50MzJfZW51bSgpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpLmF0KDApLmMoKSk7CisKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50NjRfaW50NjQoKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF91aW50MzJfdWludDMyKCkuYXQoMSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfdWludDY0X3VpbnQ2NCgpLmF0KDEpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX3NpbnQzMl9zaW50MzIoKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9zaW50NjRfc2ludDY0KCkuYXQoMSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfZml4ZWQzMl9maXhlZDMyKCkuYXQoMSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfZml4ZWQ2NF9maXhlZDY0KCkuYXQoMSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfc2ZpeGVkMzJfc2ZpeGVkMzIoKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCgpLmF0KDEpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2Zsb2F0KCkuYXQoMSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfZG91YmxlKCkuYXQoMSkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbWVzc2FnZS5tYXBfYm9vbF9ib29sKCkuYXQoMSkpOworICBFWFBFQ1RfRVEoIjEiLCBtZXNzYWdlLm1hcF9zdHJpbmdfc3RyaW5nKCkuYXQoIjEiKSk7CisgIEVYUEVDVF9FUSgiMSIsIG1lc3NhZ2UubWFwX2ludDMyX2J5dGVzKCkuYXQoMSkpOworICBFWFBFQ1RfRVEoZW51bV92YWx1ZTEsIG1lc3NhZ2UubWFwX2ludDMyX2VudW0oKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKS5hdCgxKS5jKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRW51bVR5cGUsIEVudW1UeXBlIGVudW1fdmFsdWUsIHR5cGVuYW1lIE1hcE1lc3NhZ2U+Cit2b2lkIE1hcFRlc3RVdGlsSW1wbDo6RXhwZWN0TWFwRmllbGRzU2V0SW5pdGlhbGl6ZWQoY29uc3QgTWFwTWVzc2FnZSYgbWVzc2FnZSkgeworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50NjRfaW50NjQoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfdWludDMyX3VpbnQzMigpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF91aW50NjRfdWludDY0KCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX3NpbnQzMl9zaW50MzIoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfc2ludDY0X3NpbnQ2NCgpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9maXhlZDMyX2ZpeGVkMzIoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfZml4ZWQ2NF9maXhlZDY0KCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX3NmaXhlZDMyX3NmaXhlZDMyKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX3NmaXhlZDY0X3NmaXhlZDY0KCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2Zsb2F0KCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2RvdWJsZSgpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9ib29sX2Jvb2woKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfc3RyaW5nX3N0cmluZygpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9ieXRlcygpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9lbnVtKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSgpLnNpemUoKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfaW50NjRfaW50NjQoKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF91aW50MzJfdWludDMyKCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfdWludDY0X3VpbnQ2NCgpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX3NpbnQzMl9zaW50MzIoKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9zaW50NjRfc2ludDY0KCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfZml4ZWQzMl9maXhlZDMyKCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfZml4ZWQ2NF9maXhlZDY0KCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfc2ZpeGVkMzJfc2ZpeGVkMzIoKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCgpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX2ludDMyX2Zsb2F0KCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfaW50MzJfZG91YmxlKCkuYXQoMCkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UubWFwX2Jvb2xfYm9vbCgpLmF0KDApKTsKKyAgRVhQRUNUX0VRKCIiLCBtZXNzYWdlLm1hcF9zdHJpbmdfc3RyaW5nKCkuYXQoIjAiKSk7CisgIEVYUEVDVF9FUSgiIiwgbWVzc2FnZS5tYXBfaW50MzJfYnl0ZXMoKS5hdCgwKSk7CisgIEVYUEVDVF9FUShlbnVtX3ZhbHVlLCBtZXNzYWdlLm1hcF9pbnQzMl9lbnVtKCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKCkuYXQoMCkuQnl0ZVNpemVMb25nKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRW51bVR5cGUsIEVudW1UeXBlIGVudW1fdmFsdWUwLCBFbnVtVHlwZSBlbnVtX3ZhbHVlMSwKKyAgICAgICAgICB0eXBlbmFtZSBNYXBNZXNzYWdlPgordm9pZCBNYXBUZXN0VXRpbEltcGw6OkV4cGVjdE1hcEZpZWxkc01vZGlmaWVkKGNvbnN0IE1hcE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgLy8gTW9kaWZ5TWFwRmllbGRzIG9ubHkgc2V0cyB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgZWFjaCBmaWVsZC4gIEluIGFkZGl0aW9uIHRvCisgIC8vIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdCBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCoKKyAgLy8gbW9kaWZpZWQuCisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9pbnQ2NF9pbnQ2NCgpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF91aW50MzJfdWludDMyKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX3VpbnQ2NF91aW50NjQoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5tYXBfc2ludDMyX3NpbnQzMigpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9zaW50NjRfc2ludDY0KCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX2ZpeGVkMzJfZml4ZWQzMigpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9maXhlZDY0X2ZpeGVkNjQoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5tYXBfc2ZpeGVkMzJfc2ZpeGVkMzIoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5tYXBfc2ZpeGVkNjRfc2ZpeGVkNjQoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5tYXBfaW50MzJfZmxvYXQoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5tYXBfaW50MzJfZG91YmxlKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX2Jvb2xfYm9vbCgpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9zdHJpbmdfc3RyaW5nKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX2ludDMyX2J5dGVzKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX2ludDMyX2VudW0oKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKCkuc2l6ZSgpKTsKKworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9pbnQ2NF9pbnQ2NCgpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX3VpbnQzMl91aW50MzIoKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF91aW50NjRfdWludDY0KCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfc2ludDMyX3NpbnQzMigpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX3NpbnQ2NF9zaW50NjQoKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9maXhlZDMyX2ZpeGVkMzIoKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9maXhlZDY0X2ZpeGVkNjQoKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9zZml4ZWQzMl9zZml4ZWQzMigpLmF0KDApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UubWFwX3NmaXhlZDY0X3NmaXhlZDY0KCkuYXQoMCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfaW50MzJfZmxvYXQoKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9pbnQzMl9kb3VibGUoKS5hdCgwKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5tYXBfYm9vbF9ib29sKCkuYXQoMCkpOworICBFWFBFQ1RfRVEoIjAiLCBtZXNzYWdlLm1hcF9zdHJpbmdfc3RyaW5nKCkuYXQoIjAiKSk7CisgIEVYUEVDVF9FUSgiMCIsIG1lc3NhZ2UubWFwX2ludDMyX2J5dGVzKCkuYXQoMCkpOworICBFWFBFQ1RfRVEoZW51bV92YWx1ZTAsIG1lc3NhZ2UubWFwX2ludDMyX2VudW0oKS5hdCgwKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKS5hdCgwKS5jKCkpOworCisgIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgorICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9pbnQ2NF9pbnQ2NCgpLmF0KDEpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX3VpbnQzMl91aW50MzIoKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF91aW50NjRfdWludDY0KCkuYXQoMSkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5tYXBfc2ludDMyX3NpbnQzMigpLmF0KDEpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX3NpbnQ2NF9zaW50NjQoKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9maXhlZDMyX2ZpeGVkMzIoKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9maXhlZDY0X2ZpeGVkNjQoKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9zZml4ZWQzMl9zZml4ZWQzMigpLmF0KDEpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX3NmaXhlZDY0X3NmaXhlZDY0KCkuYXQoMSkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5tYXBfaW50MzJfZmxvYXQoKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9pbnQzMl9kb3VibGUoKS5hdCgxKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5tYXBfYm9vbF9ib29sKCkuYXQoMSkpOworICBFWFBFQ1RfRVEoIjIiLCBtZXNzYWdlLm1hcF9zdHJpbmdfc3RyaW5nKCkuYXQoIjEiKSk7CisgIEVYUEVDVF9FUSgiMiIsIG1lc3NhZ2UubWFwX2ludDMyX2J5dGVzKCkuYXQoMSkpOworICBFWFBFQ1RfRVEoZW51bV92YWx1ZTEsIG1lc3NhZ2UubWFwX2ludDMyX2VudW0oKS5hdCgxKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UoKS5hdCgxKS5jKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTUFQX1RFU1RfVVRJTF9JTVBMX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdHlwZV9oYW5kbGVyLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF90eXBlX2hhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjEwYzYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdHlwZV9oYW5kbGVyLmgKQEAgLTAsMCArMSw3MzYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9NQVBfVFlQRV9IQU5ETEVSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUFQX1RZUEVfSEFORExFUl9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcGFyc2VfY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisKKyNpZmRlZiBTV0lHCisjZXJyb3IgIllvdSBjYW5ub3QgU1dJRyBwcm90byBoZWFkZXJzIgorI2VuZGlmCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFVzZWQgZm9yIGNvbXBpbGUgdGltZSB0eXBlIHNlbGVjdGlvbi4gTWFwSWY6OnR5cGUgd2lsbCBiZSBUcnVlVHlwZSBpZiBGbGFnIGlzCisvLyB0cnVlIGFuZCBGYWxzZVR5cGUgb3RoZXJ3aXNlLgordGVtcGxhdGUgPGJvb2wgRmxhZywgdHlwZW5hbWUgVHJ1ZVR5cGUsIHR5cGVuYW1lIEZhbHNlVHlwZT4KK3N0cnVjdCBNYXBJZjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRydWVUeXBlLCB0eXBlbmFtZSBGYWxzZVR5cGU+CitzdHJ1Y3QgTWFwSWY8dHJ1ZSwgVHJ1ZVR5cGUsIEZhbHNlVHlwZT4geworICB0eXBlZGVmIFRydWVUeXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHJ1ZVR5cGUsIHR5cGVuYW1lIEZhbHNlVHlwZT4KK3N0cnVjdCBNYXBJZjxmYWxzZSwgVHJ1ZVR5cGUsIEZhbHNlVHlwZT4geworICB0eXBlZGVmIEZhbHNlVHlwZSB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGUsIGJvb2wgaXNfYXJlbmFfY29uc3RydWN0YWJsZT4KK2NsYXNzIE1hcEFyZW5hTWVzc2FnZUNyZWF0b3IgeworIHB1YmxpYzoKKyAgLy8gVXNlIGFyZW5hIHRvIGNyZWF0ZSBtZXNzYWdlIGlmIFR5cGUgaXMgYXJlbmEgY29uc3RydWN0YWJsZS4gT3RoZXJ3aXNlLAorICAvLyBjcmVhdGUgdGhlIG1lc3NhZ2Ugb24gaGVhcC4KKyAgc3RhdGljIGlubGluZSBUeXBlKiBDcmVhdGVNZXNzYWdlKEFyZW5hKiBhcmVuYSk7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CitjbGFzcyBNYXBBcmVuYU1lc3NhZ2VDcmVhdG9yPFR5cGUsIHRydWU+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBpbmxpbmUgVHlwZSogQ3JlYXRlTWVzc2FnZShBcmVuYSogYXJlbmEpIHsKKyAgICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VHlwZT4oYXJlbmEpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CitjbGFzcyBNYXBBcmVuYU1lc3NhZ2VDcmVhdG9yPFR5cGUsIGZhbHNlPiB7CisgcHVibGljOgorICBzdGF0aWMgaW5saW5lIFR5cGUqIENyZWF0ZU1lc3NhZ2UoQXJlbmEqIGFyZW5hKSB7CisgICAgcmV0dXJuIEFyZW5hOjpDcmVhdGU8VHlwZT4oYXJlbmEpOworICB9Cit9OworCisvLyBEZWZpbmUgY29uc3RhbnRzIGZvciBnaXZlbiB3aXJlIGZpZWxkIHR5cGUKK3RlbXBsYXRlIDxXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGZpZWxkX3R5cGUsIHR5cGVuYW1lIFR5cGU+CitjbGFzcyBNYXBXaXJlRmllbGRUeXBlVHJhaXRzIHt9OworCisjZGVmaW5lIFRZUEVfVFJBSVRTKEZpZWxkVHlwZSwgQ1R5cGUsIFdpcmVGb3JtYXRUeXBlLCBJc01lc3NhZ2UsIElzRW51bSkgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIE1hcFdpcmVGaWVsZFR5cGVUcmFpdHM8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsIFR5cGU+IHsgICBcCisgICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGNvbnN0IGJvb2wga0lzTWVzc2FnZSA9IElzTWVzc2FnZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGNvbnN0IGJvb2wga0lzRW51bSA9IElzRW51bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXBJZjxrSXNNZXNzYWdlLCBUeXBlKiwgQ1R5cGU+Ojp0eXBlIFR5cGVPbk1lbW9yeTsgICBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXBJZjxrSXNFbnVtLCBpbnQsIFR5cGU+Ojp0eXBlIE1hcEVudHJ5QWNjZXNzb3JUeXBlOyBcCisgICAgc3RhdGljIGNvbnN0IFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBrV2lyZVR5cGUgPSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV8jI1dpcmVGb3JtYXRUeXBlOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07CisKK1RZUEVfVFJBSVRTKE1FU1NBR0UsIFR5cGUsIExFTkdUSF9ERUxJTUlURUQsIHRydWUsIGZhbHNlKQorVFlQRV9UUkFJVFMoU1RSSU5HLCBBcmVuYVN0cmluZ1B0ciwgTEVOR1RIX0RFTElNSVRFRCwgZmFsc2UsIGZhbHNlKQorVFlQRV9UUkFJVFMoQllURVMsIEFyZW5hU3RyaW5nUHRyLCBMRU5HVEhfREVMSU1JVEVELCBmYWxzZSwgZmFsc2UpCitUWVBFX1RSQUlUUyhJTlQ2NCwgaW50NjRfdCwgVkFSSU5ULCBmYWxzZSwgZmFsc2UpCitUWVBFX1RSQUlUUyhVSU5UNjQsIHVpbnQ2NF90LCBWQVJJTlQsIGZhbHNlLCBmYWxzZSkKK1RZUEVfVFJBSVRTKElOVDMyLCBpbnQzMl90LCBWQVJJTlQsIGZhbHNlLCBmYWxzZSkKK1RZUEVfVFJBSVRTKFVJTlQzMiwgdWludDMyX3QsIFZBUklOVCwgZmFsc2UsIGZhbHNlKQorVFlQRV9UUkFJVFMoU0lOVDY0LCBpbnQ2NF90LCBWQVJJTlQsIGZhbHNlLCBmYWxzZSkKK1RZUEVfVFJBSVRTKFNJTlQzMiwgaW50MzJfdCwgVkFSSU5ULCBmYWxzZSwgZmFsc2UpCitUWVBFX1RSQUlUUyhFTlVNLCBpbnQsIFZBUklOVCwgZmFsc2UsIHRydWUpCitUWVBFX1RSQUlUUyhET1VCTEUsIGRvdWJsZSwgRklYRUQ2NCwgZmFsc2UsIGZhbHNlKQorVFlQRV9UUkFJVFMoRkxPQVQsIGZsb2F0LCBGSVhFRDMyLCBmYWxzZSwgZmFsc2UpCitUWVBFX1RSQUlUUyhGSVhFRDY0LCB1aW50NjRfdCwgRklYRUQ2NCwgZmFsc2UsIGZhbHNlKQorVFlQRV9UUkFJVFMoRklYRUQzMiwgdWludDMyX3QsIEZJWEVEMzIsIGZhbHNlLCBmYWxzZSkKK1RZUEVfVFJBSVRTKFNGSVhFRDY0LCBpbnQ2NF90LCBGSVhFRDY0LCBmYWxzZSwgZmFsc2UpCitUWVBFX1RSQUlUUyhTRklYRUQzMiwgaW50MzJfdCwgRklYRUQzMiwgZmFsc2UsIGZhbHNlKQorVFlQRV9UUkFJVFMoQk9PTCwgYm9vbCwgVkFSSU5ULCBmYWxzZSwgZmFsc2UpCisKKyN1bmRlZiBUWVBFX1RSQUlUUworCit0ZW1wbGF0ZSA8V2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBmaWVsZF90eXBlLCB0eXBlbmFtZSBUeXBlPgorY2xhc3MgTWFwVHlwZUhhbmRsZXIge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorY2xhc3MgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSwgVHlwZT4geworIHB1YmxpYzoKKyAgLy8gRW51bSB0eXBlIGNhbm5vdCBiZSB1c2VkIGZvciBNYXBUeXBlSGFuZGxlcjo6UmVhZC4gRGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsCisgIC8vIHJlcGxhY2UgRW51bSB3aXRoIGludC4KKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXBXaXJlRmllbGRUeXBlVHJhaXRzPFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlPjo6TWFwRW50cnlBY2Nlc3NvclR5cGUKKyAgICAgIE1hcEVudHJ5QWNjZXNzb3JUeXBlOworICAvLyBJbnRlcm5hbCBzdG9yZWQgdHlwZSBpbiBNYXBFbnRyeUxpdGUgZm9yIGdpdmVuIHdpcmUgZmllbGQgdHlwZS4KKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXBXaXJlRmllbGRUeXBlVHJhaXRzPFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlPjo6VHlwZU9uTWVtb3J5IFR5cGVPbk1lbW9yeTsKKyAgLy8gQ29ycmVzcG9uZGluZyB3aXJlIHR5cGUgZm9yIGZpZWxkIHR5cGUuCisgIHN0YXRpYyBjb25zdGV4cHIgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIGtXaXJlVHlwZSA9CisgICAgICBNYXBXaXJlRmllbGRUeXBlVHJhaXRzPFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UsIFR5cGU+OjprV2lyZVR5cGU7CisgIC8vIFdoZXRoZXIgd2lyZSB0eXBlIGlzIGZvciBtZXNzYWdlLgorICBzdGF0aWMgY29uc3RleHByIGJvb2wga0lzTWVzc2FnZSA9CisgICAgICBNYXBXaXJlRmllbGRUeXBlVHJhaXRzPFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UsIFR5cGU+OjprSXNNZXNzYWdlOworICAvLyBXaGV0aGVyIHdpcmUgdHlwZSBpcyBmb3IgZW51bS4KKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIGtJc0VudW0gPQorICAgICAgTWFwV2lyZUZpZWxkVHlwZVRyYWl0czxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFLCBUeXBlPjo6a0lzRW51bTsKKworICAvLyBGdW5jdGlvbnMgdXNlZCBpbiBwYXJzaW5nIGFuZCBzZXJpYWxpemF0aW9uLiA9PT09PT09PT09PT09PT09PT09CisgIHN0YXRpYyBpbmxpbmUgc2l6ZV90IEJ5dGVTaXplKGNvbnN0IE1hcEVudHJ5QWNjZXNzb3JUeXBlJiB2YWx1ZSk7CisgIHN0YXRpYyBpbmxpbmUgaW50IEdldENhY2hlZFNpemUoY29uc3QgTWFwRW50cnlBY2Nlc3NvclR5cGUmIHZhbHVlKTsKKyAgc3RhdGljIGlubGluZSBib29sIFJlYWQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBFbnRyeUFjY2Vzc29yVHlwZSogdmFsdWUpOworICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIFJlYWQoY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcEVudHJ5QWNjZXNzb3JUeXBlKiB2YWx1ZSk7CisKKyAgc3RhdGljIGlubGluZSB1aW50OF90KiBXcml0ZShpbnQgZmllbGQsIGNvbnN0IE1hcEVudHJ5QWNjZXNzb3JUeXBlJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwdHIsIGlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pOworCisgIC8vIEZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGRhdGEgb24gbWVtb3J5LiA9PT09PT09PT09PT09PT09PT09PT09PT0KKyAgc3RhdGljIGlubGluZSBjb25zdCBUeXBlJiBHZXRFeHRlcm5hbFJlZmVyZW5jZShjb25zdCBUeXBlKiB2YWx1ZSk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBEZWxldGVOb0FyZW5hKGNvbnN0IFR5cGUqIHgpOworICBzdGF0aWMgaW5saW5lIHZvaWQgTWVyZ2UoY29uc3QgVHlwZSYgZnJvbSwgVHlwZSoqIHRvLCBBcmVuYSogYXJlbmEpOworICBzdGF0aWMgaW5saW5lIHZvaWQgQ2xlYXIoVHlwZSoqIHZhbHVlLCBBcmVuYSogYXJlbmEpOworICBzdGF0aWMgY29uc3RleHByIFR5cGVPbk1lbW9yeSBDb25zdGluaXQoKTsKKworICBzdGF0aWMgaW5saW5lIFR5cGUqIEVuc3VyZU11dGFibGUoVHlwZSoqIHZhbHVlLCBBcmVuYSogYXJlbmEpOworICAvLyBTcGFjZVVzZWRJbk1hcEVudHJ5OiBSZXR1cm4gYnl0ZXMgdXNlZCBieSB2YWx1ZSBpbiBNYXBFbnRyeSwgZXhjbHVkaW5nCisgIC8vIHRob3NlIGFscmVhZHkgY2FsY3VsYXRlIGluIHNpemVvZihNYXBGaWVsZCkuCisgIHN0YXRpYyBpbmxpbmUgc2l6ZV90IFNwYWNlVXNlZEluTWFwRW50cnlMb25nKGNvbnN0IFR5cGUqIHZhbHVlKTsKKyAgLy8gUmV0dXJuIGRlZmF1bHQgaW5zdGFuY2UgaWYgdmFsdWUgaXMgbm90IGluaXRpYWxpemVkIHdoZW4gY2FsbGluZyBjb25zdAorICAvLyByZWZlcmVuY2UgYWNjZXNzb3IuCisgIHN0YXRpYyBpbmxpbmUgY29uc3QgVHlwZSYgRGVmYXVsdElmTm90SW5pdGlhbGl6ZWQoY29uc3QgVHlwZSogdmFsdWUpOworICAvLyBDaGVjayBpZiBhbGwgcmVxdWlyZWQgZmllbGRzIGhhdmUgdmFsdWVzIHNldC4KKyAgc3RhdGljIGlubGluZSBib29sIElzSW5pdGlhbGl6ZWQoVHlwZSogdmFsdWUpOworfTsKKworI2RlZmluZSBNQVBfSEFORExFUihGaWVsZFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIE1hcFR5cGVIYW5kbGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjRmllbGRUeXBlLCBUeXBlPiB7ICAgICAgICAgICAgICAgXAorICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hcFdpcmVGaWVsZFR5cGVUcmFpdHM8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU+OjpNYXBFbnRyeUFjY2Vzc29yVHlwZSAgICAgICAgXAorICAgICAgICBNYXBFbnRyeUFjY2Vzc29yVHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hcFdpcmVGaWVsZFR5cGVUcmFpdHM8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU+OjpUeXBlT25NZW1vcnkgVHlwZU9uTWVtb3J5OyAgXAorICAgIHN0YXRpYyBjb25zdCBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUga1dpcmVUeXBlID0gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTWFwV2lyZUZpZWxkVHlwZVRyYWl0czxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZT46OmtXaXJlVHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBjb25zdCBib29sIGtJc01lc3NhZ2UgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTWFwV2lyZUZpZWxkVHlwZVRyYWl0czxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZT46OmtJc01lc3NhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBjb25zdCBib29sIGtJc0VudW0gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTWFwV2lyZUZpZWxkVHlwZVRyYWl0czxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZT46OmtJc0VudW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgaW50IEJ5dGVTaXplKGNvbnN0IE1hcEVudHJ5QWNjZXNzb3JUeXBlJiB2YWx1ZSk7ICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgaW5saW5lIGludCBHZXRDYWNoZWRTaXplKGNvbnN0IE1hcEVudHJ5QWNjZXNzb3JUeXBlJiB2YWx1ZSk7ICAgICAgICBcCisgICAgc3RhdGljIGlubGluZSBib29sIFJlYWQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcEVudHJ5QWNjZXNzb3JUeXBlKiB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIFJlYWQoY29uc3QgY2hhciogYmVnaW4sIFBhcnNlQ29udGV4dCogY3R4LCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcEVudHJ5QWNjZXNzb3JUeXBlKiB2YWx1ZSk7ICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgdWludDhfdCogV3JpdGUoaW50IGZpZWxkLCBjb25zdCBNYXBFbnRyeUFjY2Vzc29yVHlwZSYgdmFsdWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKTsgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgY29uc3QgTWFwRW50cnlBY2Nlc3NvclR5cGUmIEdldEV4dGVybmFsUmVmZXJlbmNlKCAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgVHlwZU9uTWVtb3J5JiB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGlubGluZSB2b2lkIERlbGV0ZU5vQXJlbmEoY29uc3QgVHlwZU9uTWVtb3J5JiB4KTsgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBNZXJnZShjb25zdCBNYXBFbnRyeUFjY2Vzc29yVHlwZSYgZnJvbSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZU9uTWVtb3J5KiB0bywgQXJlbmEqIGFyZW5hKTsgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGlubGluZSB2b2lkIENsZWFyKFR5cGVPbk1lbW9yeSogdmFsdWUsIEFyZW5hKiBhcmVuYSk7ICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgc2l6ZV90IFNwYWNlVXNlZEluTWFwRW50cnlMb25nKGNvbnN0IFR5cGVPbk1lbW9yeSYgdmFsdWUpOyAgIFwKKyAgICBzdGF0aWMgaW5saW5lIGNvbnN0IE1hcEVudHJ5QWNjZXNzb3JUeXBlJiBEZWZhdWx0SWZOb3RJbml0aWFsaXplZCggICAgICAgICBcCisgICAgICAgIGNvbnN0IFR5cGVPbk1lbW9yeSYgdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBJc0luaXRpYWxpemVkKGNvbnN0IFR5cGVPbk1lbW9yeSYgdmFsdWUpOyAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCBEZWxldGVOb0FyZW5hKFR5cGVPbk1lbW9yeSYgdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGNvbnN0ZXhwciBUeXBlT25NZW1vcnkgQ29uc3Rpbml0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgTWFwRW50cnlBY2Nlc3NvclR5cGUqIEVuc3VyZU11dGFibGUoVHlwZU9uTWVtb3J5KiB2YWx1ZSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZW5hKiBhcmVuYSk7ICAgICAgICAgICBcCisgIH07CitNQVBfSEFORExFUihTVFJJTkcpCitNQVBfSEFORExFUihCWVRFUykKK01BUF9IQU5ETEVSKElOVDY0KQorTUFQX0hBTkRMRVIoVUlOVDY0KQorTUFQX0hBTkRMRVIoSU5UMzIpCitNQVBfSEFORExFUihVSU5UMzIpCitNQVBfSEFORExFUihTSU5UNjQpCitNQVBfSEFORExFUihTSU5UMzIpCitNQVBfSEFORExFUihFTlVNKQorTUFQX0hBTkRMRVIoRE9VQkxFKQorTUFQX0hBTkRMRVIoRkxPQVQpCitNQVBfSEFORExFUihGSVhFRDY0KQorTUFQX0hBTkRMRVIoRklYRUQzMikKK01BUF9IQU5ETEVSKFNGSVhFRDY0KQorTUFQX0hBTkRMRVIoU0ZJWEVEMzIpCitNQVBfSEFORExFUihCT09MKQorI3VuZGVmIE1BUF9IQU5ETEVSCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIHNpemVfdCBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFLCBUeXBlPjo6Qnl0ZVNpemUoCisgICAgY29uc3QgTWFwRW50cnlBY2Nlc3NvclR5cGUmIHZhbHVlKSB7CisgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwodmFsdWUpOworfQorCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9CWVRFX1NJWkUoRmllbGRUeXBlLCBEZWNsYXJlZFR5cGUpICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIGludCBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgVHlwZT46OkJ5dGVTaXplKCBcCisgICAgICBjb25zdCBNYXBFbnRyeUFjY2Vzc29yVHlwZSYgdmFsdWUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KFdpcmVGb3JtYXRMaXRlOjpEZWNsYXJlZFR5cGUjI1NpemUodmFsdWUpKTsgICAgICAgIFwKKyAgfQorCitHT09HTEVfUFJPVE9CVUZfQllURV9TSVpFKFNUUklORywgU3RyaW5nKQorR09PR0xFX1BST1RPQlVGX0JZVEVfU0laRShCWVRFUywgQnl0ZXMpCitHT09HTEVfUFJPVE9CVUZfQllURV9TSVpFKElOVDY0LCBJbnQ2NCkKK0dPT0dMRV9QUk9UT0JVRl9CWVRFX1NJWkUoVUlOVDY0LCBVSW50NjQpCitHT09HTEVfUFJPVE9CVUZfQllURV9TSVpFKElOVDMyLCBJbnQzMikKK0dPT0dMRV9QUk9UT0JVRl9CWVRFX1NJWkUoVUlOVDMyLCBVSW50MzIpCitHT09HTEVfUFJPVE9CVUZfQllURV9TSVpFKFNJTlQ2NCwgU0ludDY0KQorR09PR0xFX1BST1RPQlVGX0JZVEVfU0laRShTSU5UMzIsIFNJbnQzMikKK0dPT0dMRV9QUk9UT0JVRl9CWVRFX1NJWkUoRU5VTSwgRW51bSkKKworI3VuZGVmIEdPT0dMRV9QUk9UT0JVRl9CWVRFX1NJWkUKKworI2RlZmluZSBGSVhFRF9CWVRFX1NJWkUoRmllbGRUeXBlLCBEZWNsYXJlZFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBpbnQgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsIFR5cGU+OjpCeXRlU2l6ZSggXAorICAgICAgY29uc3QgTWFwRW50cnlBY2Nlc3NvclR5cGUmIC8qIHZhbHVlICovKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmsjI0RlY2xhcmVkVHlwZSMjU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworRklYRURfQllURV9TSVpFKERPVUJMRSwgRG91YmxlKQorRklYRURfQllURV9TSVpFKEZMT0FULCBGbG9hdCkKK0ZJWEVEX0JZVEVfU0laRShGSVhFRDY0LCBGaXhlZDY0KQorRklYRURfQllURV9TSVpFKEZJWEVEMzIsIEZpeGVkMzIpCitGSVhFRF9CWVRFX1NJWkUoU0ZJWEVENjQsIFNGaXhlZDY0KQorRklYRURfQllURV9TSVpFKFNGSVhFRDMyLCBTRml4ZWQzMikKK0ZJWEVEX0JZVEVfU0laRShCT09MLCBCb29sKQorCisjdW5kZWYgRklYRURfQllURV9TSVpFCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIGludCBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFLCBUeXBlPjo6R2V0Q2FjaGVkU2l6ZSgKKyAgICBjb25zdCBNYXBFbnRyeUFjY2Vzc29yVHlwZSYgdmFsdWUpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oV2lyZUZvcm1hdExpdGU6Okxlbmd0aERlbGltaXRlZFNpemUoCisgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KHZhbHVlLkdldENhY2hlZFNpemUoKSkpKTsKK30KKworI2RlZmluZSBHRVRfQ0FDSEVEX1NJWkUoRmllbGRUeXBlLCBEZWNsYXJlZFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgVHlwZT46OkdldENhY2hlZFNpemUoIFwKKyAgICAgIGNvbnN0IE1hcEVudHJ5QWNjZXNzb3JUeXBlJiB2YWx1ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oV2lyZUZvcm1hdExpdGU6OkRlY2xhcmVkVHlwZSMjU2l6ZSh2YWx1ZSkpOyAgXAorICB9CisKK0dFVF9DQUNIRURfU0laRShTVFJJTkcsIFN0cmluZykKK0dFVF9DQUNIRURfU0laRShCWVRFUywgQnl0ZXMpCitHRVRfQ0FDSEVEX1NJWkUoSU5UNjQsIEludDY0KQorR0VUX0NBQ0hFRF9TSVpFKFVJTlQ2NCwgVUludDY0KQorR0VUX0NBQ0hFRF9TSVpFKElOVDMyLCBJbnQzMikKK0dFVF9DQUNIRURfU0laRShVSU5UMzIsIFVJbnQzMikKK0dFVF9DQUNIRURfU0laRShTSU5UNjQsIFNJbnQ2NCkKK0dFVF9DQUNIRURfU0laRShTSU5UMzIsIFNJbnQzMikKK0dFVF9DQUNIRURfU0laRShFTlVNLCBFbnVtKQorCisjdW5kZWYgR0VUX0NBQ0hFRF9TSVpFCisKKyNkZWZpbmUgR0VUX0ZJWEVEX0NBQ0hFRF9TSVpFKEZpZWxkVHlwZSwgRGVjbGFyZWRUeXBlKSAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsIFR5cGU+OjpHZXRDYWNoZWRTaXplKCBcCisgICAgICBjb25zdCBNYXBFbnRyeUFjY2Vzc29yVHlwZSYgLyogdmFsdWUgKi8pIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6ayMjRGVjbGFyZWRUeXBlIyNTaXplOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitHRVRfRklYRURfQ0FDSEVEX1NJWkUoRE9VQkxFLCBEb3VibGUpCitHRVRfRklYRURfQ0FDSEVEX1NJWkUoRkxPQVQsIEZsb2F0KQorR0VUX0ZJWEVEX0NBQ0hFRF9TSVpFKEZJWEVENjQsIEZpeGVkNjQpCitHRVRfRklYRURfQ0FDSEVEX1NJWkUoRklYRUQzMiwgRml4ZWQzMikKK0dFVF9GSVhFRF9DQUNIRURfU0laRShTRklYRUQ2NCwgU0ZpeGVkNjQpCitHRVRfRklYRURfQ0FDSEVEX1NJWkUoU0ZJWEVEMzIsIFNGaXhlZDMyKQorR0VUX0ZJWEVEX0NBQ0hFRF9TSVpFKEJPT0wsIEJvb2wpCisKKyN1bmRlZiBHRVRfRklYRURfQ0FDSEVEX1NJWkUKKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CitpbmxpbmUgdWludDhfdCogTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSwgVHlwZT46OldyaXRlKAorICAgIGludCBmaWVsZCwgY29uc3QgTWFwRW50cnlBY2Nlc3NvclR5cGUmIHZhbHVlLCB1aW50OF90KiBwdHIsCisgICAgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgeworICBwdHIgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHB0cik7CisgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6SW50ZXJuYWxXcml0ZU1lc3NhZ2UoCisgICAgICBmaWVsZCwgdmFsdWUsIHZhbHVlLkdldENhY2hlZFNpemUoKSwgcHRyLCBzdHJlYW0pOworfQorCisjZGVmaW5lIFdSSVRFX01FVEhPRChGaWVsZFR5cGUsIERlY2xhcmVkVHlwZSkgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSB1aW50OF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1hcFR5cGVIYW5kbGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjRmllbGRUeXBlLCBUeXBlPjo6V3JpdGUoICBcCisgICAgICBpbnQgZmllbGQsIGNvbnN0IE1hcEVudHJ5QWNjZXNzb3JUeXBlJiB2YWx1ZSwgdWludDhfdCogcHRyLCBcCisgICAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHRyID0gc3RyZWFtLT5FbnN1cmVTcGFjZShwdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHN0cmVhbS0+V3JpdGUjI0RlY2xhcmVkVHlwZShmaWVsZCwgdmFsdWUsIHB0cik7ICAgICAgICBcCisgIH0KKworV1JJVEVfTUVUSE9EKFNUUklORywgU3RyaW5nKQorV1JJVEVfTUVUSE9EKEJZVEVTLCBCeXRlcykKKworI3VuZGVmIFdSSVRFX01FVEhPRAorI2RlZmluZSBXUklURV9NRVRIT0QoRmllbGRUeXBlLCBEZWNsYXJlZFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSB1aW50OF90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgVHlwZT46OldyaXRlKCAgICAgICAgICAgIFwKKyAgICAgIGludCBmaWVsZCwgY29uc3QgTWFwRW50cnlBY2Nlc3NvclR5cGUmIHZhbHVlLCB1aW50OF90KiBwdHIsICAgICAgICAgICBcCisgICAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHB0ciA9IHN0cmVhbS0+RW5zdXJlU3BhY2UocHRyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OldyaXRlIyNEZWNsYXJlZFR5cGUjI1RvQXJyYXkoZmllbGQsIHZhbHVlLCBwdHIpOyBcCisgIH0KKworV1JJVEVfTUVUSE9EKElOVDY0LCBJbnQ2NCkKK1dSSVRFX01FVEhPRChVSU5UNjQsIFVJbnQ2NCkKK1dSSVRFX01FVEhPRChJTlQzMiwgSW50MzIpCitXUklURV9NRVRIT0QoVUlOVDMyLCBVSW50MzIpCitXUklURV9NRVRIT0QoU0lOVDY0LCBTSW50NjQpCitXUklURV9NRVRIT0QoU0lOVDMyLCBTSW50MzIpCitXUklURV9NRVRIT0QoRU5VTSwgRW51bSkKK1dSSVRFX01FVEhPRChET1VCTEUsIERvdWJsZSkKK1dSSVRFX01FVEhPRChGTE9BVCwgRmxvYXQpCitXUklURV9NRVRIT0QoRklYRUQ2NCwgRml4ZWQ2NCkKK1dSSVRFX01FVEhPRChGSVhFRDMyLCBGaXhlZDMyKQorV1JJVEVfTUVUSE9EKFNGSVhFRDY0LCBTRml4ZWQ2NCkKK1dSSVRFX01FVEhPRChTRklYRUQzMiwgU0ZpeGVkMzIpCitXUklURV9NRVRIT0QoQk9PTCwgQm9vbCkKKworI3VuZGVmIFdSSVRFX01FVEhPRAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSBib29sIE1hcFR5cGVIYW5kbGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UsIFR5cGU+OjpSZWFkKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgTWFwRW50cnlBY2Nlc3NvclR5cGUqIHZhbHVlKSB7CisgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoaW5wdXQsIHZhbHVlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CitpbmxpbmUgYm9vbCBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TVFJJTkcsIFR5cGU+OjpSZWFkKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgTWFwRW50cnlBY2Nlc3NvclR5cGUqIHZhbHVlKSB7CisgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZyhpbnB1dCwgdmFsdWUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSBib29sIE1hcFR5cGVIYW5kbGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JZVEVTLCBUeXBlPjo6UmVhZCgKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIE1hcEVudHJ5QWNjZXNzb3JUeXBlKiB2YWx1ZSkgeworICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OlJlYWRCeXRlcyhpbnB1dCwgdmFsdWUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2NvbnN0IGNoYXIqIE1hcFR5cGVIYW5kbGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UsIFR5cGU+OjpSZWFkKAorICAgIGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgsIE1hcEVudHJ5QWNjZXNzb3JUeXBlKiB2YWx1ZSkgeworICByZXR1cm4gY3R4LT5QYXJzZU1lc3NhZ2UodmFsdWUsIHB0cik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorY29uc3QgY2hhciogTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfU1RSSU5HLCBUeXBlPjo6UmVhZCgKKyAgICBjb25zdCBjaGFyKiBwdHIsIFBhcnNlQ29udGV4dCogY3R4LCBNYXBFbnRyeUFjY2Vzc29yVHlwZSogdmFsdWUpIHsKKyAgaW50IHNpemUgPSBSZWFkU2l6ZSgmcHRyKTsKKyAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgcmV0dXJuIGN0eC0+UmVhZFN0cmluZyhwdHIsIHNpemUsIHZhbHVlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Citjb25zdCBjaGFyKiBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CWVRFUywgVHlwZT46OlJlYWQoCisgICAgY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCwgTWFwRW50cnlBY2Nlc3NvclR5cGUqIHZhbHVlKSB7CisgIGludCBzaXplID0gUmVhZFNpemUoJnB0cik7CisgIEdPT0dMRV9QUk9UT0JVRl9QQVJTRVJfQVNTRVJUKHB0cik7CisgIHJldHVybiBjdHgtPlJlYWRTdHJpbmcocHRyLCBzaXplLCB2YWx1ZSk7Cit9CisKK2lubGluZSBjb25zdCBjaGFyKiBSZWFkSU5UNjQoY29uc3QgY2hhciogcHRyLCBpbnQ2NF90KiB2YWx1ZSkgeworICByZXR1cm4gVmFyaW50UGFyc2UocHRyLCByZWludGVycHJldF9jYXN0PHVpbnQ2NF90Kj4odmFsdWUpKTsKK30KK2lubGluZSBjb25zdCBjaGFyKiBSZWFkVUlOVDY0KGNvbnN0IGNoYXIqIHB0ciwgdWludDY0X3QqIHZhbHVlKSB7CisgIHJldHVybiBWYXJpbnRQYXJzZShwdHIsIHZhbHVlKTsKK30KK2lubGluZSBjb25zdCBjaGFyKiBSZWFkSU5UMzIoY29uc3QgY2hhciogcHRyLCBpbnQzMl90KiB2YWx1ZSkgeworICByZXR1cm4gVmFyaW50UGFyc2UocHRyLCByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4odmFsdWUpKTsKK30KK2lubGluZSBjb25zdCBjaGFyKiBSZWFkVUlOVDMyKGNvbnN0IGNoYXIqIHB0ciwgdWludDMyX3QqIHZhbHVlKSB7CisgIHJldHVybiBWYXJpbnRQYXJzZShwdHIsIHZhbHVlKTsKK30KK2lubGluZSBjb25zdCBjaGFyKiBSZWFkU0lOVDY0KGNvbnN0IGNoYXIqIHB0ciwgaW50NjRfdCogdmFsdWUpIHsKKyAgKnZhbHVlID0gUmVhZFZhcmludFppZ1phZzY0KCZwdHIpOworICByZXR1cm4gcHRyOworfQoraW5saW5lIGNvbnN0IGNoYXIqIFJlYWRTSU5UMzIoY29uc3QgY2hhciogcHRyLCBpbnQzMl90KiB2YWx1ZSkgeworICAqdmFsdWUgPSBSZWFkVmFyaW50WmlnWmFnMzIoJnB0cik7CisgIHJldHVybiBwdHI7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KK2lubGluZSBjb25zdCBjaGFyKiBSZWFkRU5VTShjb25zdCBjaGFyKiBwdHIsIEUqIHZhbHVlKSB7CisgICp2YWx1ZSA9IHN0YXRpY19jYXN0PEU+KFJlYWRWYXJpbnQzMigmcHRyKSk7CisgIHJldHVybiBwdHI7Cit9CitpbmxpbmUgY29uc3QgY2hhciogUmVhZEJPT0woY29uc3QgY2hhciogcHRyLCBib29sKiB2YWx1ZSkgeworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxib29sPihSZWFkVmFyaW50MzIoJnB0cikpOworICByZXR1cm4gcHRyOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KK2lubGluZSBjb25zdCBjaGFyKiBSZWFkVW5hbGlnbmVkKGNvbnN0IGNoYXIqIHB0ciwgRiogdmFsdWUpIHsKKyAgKnZhbHVlID0gVW5hbGlnbmVkTG9hZDxGPihwdHIpOworICByZXR1cm4gcHRyICsgc2l6ZW9mKEYpOworfQoraW5saW5lIGNvbnN0IGNoYXIqIFJlYWRGTE9BVChjb25zdCBjaGFyKiBwdHIsIGZsb2F0KiB2YWx1ZSkgeworICByZXR1cm4gUmVhZFVuYWxpZ25lZChwdHIsIHZhbHVlKTsKK30KK2lubGluZSBjb25zdCBjaGFyKiBSZWFkRE9VQkxFKGNvbnN0IGNoYXIqIHB0ciwgZG91YmxlKiB2YWx1ZSkgeworICByZXR1cm4gUmVhZFVuYWxpZ25lZChwdHIsIHZhbHVlKTsKK30KK2lubGluZSBjb25zdCBjaGFyKiBSZWFkRklYRUQ2NChjb25zdCBjaGFyKiBwdHIsIHVpbnQ2NF90KiB2YWx1ZSkgeworICByZXR1cm4gUmVhZFVuYWxpZ25lZChwdHIsIHZhbHVlKTsKK30KK2lubGluZSBjb25zdCBjaGFyKiBSZWFkRklYRUQzMihjb25zdCBjaGFyKiBwdHIsIHVpbnQzMl90KiB2YWx1ZSkgeworICByZXR1cm4gUmVhZFVuYWxpZ25lZChwdHIsIHZhbHVlKTsKK30KK2lubGluZSBjb25zdCBjaGFyKiBSZWFkU0ZJWEVENjQoY29uc3QgY2hhciogcHRyLCBpbnQ2NF90KiB2YWx1ZSkgeworICByZXR1cm4gUmVhZFVuYWxpZ25lZChwdHIsIHZhbHVlKTsKK30KK2lubGluZSBjb25zdCBjaGFyKiBSZWFkU0ZJWEVEMzIoY29uc3QgY2hhciogcHRyLCBpbnQzMl90KiB2YWx1ZSkgeworICByZXR1cm4gUmVhZFVuYWxpZ25lZChwdHIsIHZhbHVlKTsKK30KKworI2RlZmluZSBSRUFEX01FVEhPRChGaWVsZFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBib29sIE1hcFR5cGVIYW5kbGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjRmllbGRUeXBlLCBUeXBlPjo6UmVhZCggXAorICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCBNYXBFbnRyeUFjY2Vzc29yVHlwZSogdmFsdWUpIHsgICAgICAgICAgIFwKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8VHlwZU9uTWVtb3J5LCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjRmllbGRUeXBlPiggXAorICAgICAgICBpbnB1dCwgdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBjaGFyKiBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgVHlwZT46OlJlYWQoIFwKKyAgICAgIGNvbnN0IGNoYXIqIGJlZ2luLCBQYXJzZUNvbnRleHQqIGN0eCwgTWFwRW50cnlBY2Nlc3NvclR5cGUqIHZhbHVlKSB7ICBcCisgICAgKHZvaWQpY3R4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBSZWFkIyNGaWVsZFR5cGUoYmVnaW4sIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitSRUFEX01FVEhPRChJTlQ2NCkKK1JFQURfTUVUSE9EKFVJTlQ2NCkKK1JFQURfTUVUSE9EKElOVDMyKQorUkVBRF9NRVRIT0QoVUlOVDMyKQorUkVBRF9NRVRIT0QoU0lOVDY0KQorUkVBRF9NRVRIT0QoU0lOVDMyKQorUkVBRF9NRVRIT0QoRU5VTSkKK1JFQURfTUVUSE9EKERPVUJMRSkKK1JFQURfTUVUSE9EKEZMT0FUKQorUkVBRF9NRVRIT0QoRklYRUQ2NCkKK1JFQURfTUVUSE9EKEZJWEVEMzIpCitSRUFEX01FVEhPRChTRklYRUQ2NCkKK1JFQURfTUVUSE9EKFNGSVhFRDMyKQorUkVBRF9NRVRIT0QoQk9PTCkKKworI3VuZGVmIFJFQURfTUVUSE9ECisKKy8vIERlZmluaXRpb24gZm9yIG1lc3NhZ2UgaGFuZGxlcgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSBjb25zdCBUeXBlJgorTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSwgVHlwZT46OkdldEV4dGVybmFsUmVmZXJlbmNlKAorICAgIGNvbnN0IFR5cGUqIHZhbHVlKSB7CisgIHJldHVybiAqdmFsdWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIHNpemVfdCBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlPjo6U3BhY2VVc2VkSW5NYXBFbnRyeUxvbmcoY29uc3QgVHlwZSogdmFsdWUpIHsKKyAgcmV0dXJuIHZhbHVlLT5TcGFjZVVzZWRMb25nKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIHZvaWQgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSwgVHlwZT46OkNsZWFyKAorICAgIFR5cGUqKiB2YWx1ZSwgQXJlbmEqIC8qIGFyZW5hICovKSB7CisgIGlmICgqdmFsdWUgIT0gbnVsbHB0cikgKCp2YWx1ZSktPkNsZWFyKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSB2b2lkIE1hcFR5cGVIYW5kbGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UsIFR5cGU+OjpNZXJnZSgKKyAgICBjb25zdCBUeXBlJiBmcm9tLCBUeXBlKiogdG8sIEFyZW5hKiAvKiBhcmVuYSAqLykgeworICAoKnRvKS0+TWVyZ2VGcm9tKGZyb20pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK3ZvaWQgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSwgVHlwZT46OkRlbGV0ZU5vQXJlbmEoCisgICAgY29uc3QgVHlwZSogcHRyKSB7CisgIGRlbGV0ZSBwdHI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorY29uc3RleHByIGF1dG8gTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSwgVHlwZT46OkNvbnN0aW5pdCgpCisgICAgLT4gVHlwZU9uTWVtb3J5IHsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIFR5cGUqIE1hcFR5cGVIYW5kbGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UsIFR5cGU+OjpFbnN1cmVNdXRhYmxlKAorICAgIFR5cGUqKiB2YWx1ZSwgQXJlbmEqIGFyZW5hKSB7CisgIGlmICgqdmFsdWUgPT0gbnVsbHB0cikgeworICAgICp2YWx1ZSA9IE1hcEFyZW5hTWVzc2FnZUNyZWF0b3I8CisgICAgICAgIFR5cGUsCisgICAgICAgIEFyZW5hOjppc19hcmVuYV9jb25zdHJ1Y3RhYmxlPFR5cGU+Ojp0eXBlOjp2YWx1ZT46OkNyZWF0ZU1lc3NhZ2UoYXJlbmEpOworICB9CisgIHJldHVybiAqdmFsdWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIGNvbnN0IFR5cGUmCitNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFLCBUeXBlPjo6RGVmYXVsdElmTm90SW5pdGlhbGl6ZWQoCisgICAgY29uc3QgVHlwZSogdmFsdWUpIHsKKyAgcmV0dXJuIHZhbHVlICE9IG51bGxwdHIgPyAqdmFsdWUgOiAqVHlwZTo6aW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSBib29sIE1hcFR5cGVIYW5kbGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UsIFR5cGU+OjpJc0luaXRpYWxpemVkKAorICAgIFR5cGUqIHZhbHVlKSB7CisgIHJldHVybiB2YWx1ZSA/IHZhbHVlLT5Jc0luaXRpYWxpemVkKCkgOiBmYWxzZTsKK30KKworLy8gRGVmaW5pdGlvbiBmb3Igc3RyaW5nL2J5dGVzIGhhbmRsZXIKKworI2RlZmluZSBTVFJJTkdfT1JfQllURVNfSEFORExFUl9GVU5DVElPTlMoRmllbGRUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZT46Ok1hcEVudHJ5QWNjZXNzb3JUeXBlJiAgICAgICAgICAgXAorICBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBUeXBlPjo6R2V0RXh0ZXJuYWxSZWZlcmVuY2UoY29uc3QgVHlwZU9uTWVtb3J5JiB2YWx1ZSkgeyAgICAgXAorICAgIHJldHVybiB2YWx1ZS5HZXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBUeXBlPjo6U3BhY2VVc2VkSW5NYXBFbnRyeUxvbmcoY29uc3QgVHlwZU9uTWVtb3J5JiB2YWx1ZSkgeyAgXAorICAgIHJldHVybiBzaXplb2YodmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdm9pZCBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgVHlwZT46OkNsZWFyKCAgXAorICAgICAgVHlwZU9uTWVtb3J5KiB2YWx1ZSwgQXJlbmEqIC8qIGFyZW5hICovKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlLT5DbGVhclRvRW1wdHkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdm9pZCBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgVHlwZT46Ok1lcmdlKCAgXAorICAgICAgY29uc3QgTWFwRW50cnlBY2Nlc3NvclR5cGUmIGZyb20sIFR5cGVPbk1lbW9yeSogdG8sIEFyZW5hKiBhcmVuYSkgeyAgICAgXAorICAgIHRvLT5TZXQoZnJvbSwgYXJlbmEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIE1hcFR5cGVIYW5kbGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjRmllbGRUeXBlLCBUeXBlPjo6RGVsZXRlTm9BcmVuYSggXAorICAgICAgVHlwZU9uTWVtb3J5JiB2YWx1ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlLkRlc3Ryb3koKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdGV4cHIgYXV0byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgVHlwZT46OkNvbnN0aW5pdCgpICAgICAgICAgXAorICAgICAgLT5UeXBlT25NZW1vcnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBUeXBlT25NZW1vcnkoJmludGVybmFsOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbml0aWFsaXplZHt9KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdHlwZW5hbWUgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZT46Ok1hcEVudHJ5QWNjZXNzb3JUeXBlKiAgICAgICAgICAgICAgICAgXAorICBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgVHlwZT46OkVuc3VyZU11dGFibGUoICAgICAgXAorICAgICAgVHlwZU9uTWVtb3J5KiB2YWx1ZSwgQXJlbmEqIGFyZW5hKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB2YWx1ZS0+TXV0YWJsZShhcmVuYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZT46Ok1hcEVudHJ5QWNjZXNzb3JUeXBlJiAgICAgICAgICAgXAorICBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBUeXBlPjo6RGVmYXVsdElmTm90SW5pdGlhbGl6ZWQoY29uc3QgVHlwZU9uTWVtb3J5JiB2YWx1ZSkgeyAgXAorICAgIHJldHVybiB2YWx1ZS5HZXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgVHlwZT46OklzSW5pdGlhbGl6ZWQoICAgICAgXAorICAgICAgY29uc3QgVHlwZU9uTWVtb3J5JiAvKiB2YWx1ZSAqLykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CitTVFJJTkdfT1JfQllURVNfSEFORExFUl9GVU5DVElPTlMoU1RSSU5HKQorU1RSSU5HX09SX0JZVEVTX0hBTkRMRVJfRlVOQ1RJT05TKEJZVEVTKQorI3VuZGVmIFNUUklOR19PUl9CWVRFU19IQU5ETEVSX0ZVTkNUSU9OUworCisjZGVmaW5lIFBSSU1JVElWRV9IQU5ETEVSX0ZVTkNUSU9OUyhGaWVsZFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlPjo6TWFwRW50cnlBY2Nlc3NvclR5cGUmICAgICAgICAgIFwKKyAgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBUeXBlPjo6R2V0RXh0ZXJuYWxSZWZlcmVuY2UoY29uc3QgVHlwZU9uTWVtb3J5JiB2YWx1ZSkgeyAgICBcCisgICAgcmV0dXJuIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBzaXplX3QgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsIFR5cGU+OjogICAgIFwKKyAgICAgIFNwYWNlVXNlZEluTWFwRW50cnlMb25nKGNvbnN0IFR5cGVPbk1lbW9yeSYgLyogdmFsdWUgKi8pIHsgICAgICAgICAgICAgXAorICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdm9pZCBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgVHlwZT46OkNsZWFyKCBcCisgICAgICBUeXBlT25NZW1vcnkqIHZhbHVlLCBBcmVuYSogLyogYXJlbmEgKi8pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqdmFsdWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIHZvaWQgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsIFR5cGU+OjpNZXJnZSggXAorICAgICAgY29uc3QgTWFwRW50cnlBY2Nlc3NvclR5cGUmIGZyb20sIFR5cGVPbk1lbW9yeSogdG8sICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBcmVuYSogLyogYXJlbmEgKi8pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqdG8gPSBmcm9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIHZvaWQgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlPjo6RGVsZXRlTm9BcmVuYShUeXBlT25NZW1vcnkmIC8qIHggKi8pIHt9ICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3RleHByIGF1dG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBNYXBUeXBlSGFuZGxlcjxXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI0ZpZWxkVHlwZSwgVHlwZT46OkNvbnN0aW5pdCgpICAgICAgICBcCisgICAgICAtPlR5cGVPbk1lbW9yeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIHR5cGVuYW1lIE1hcFR5cGVIYW5kbGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjRmllbGRUeXBlLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZT46Ok1hcEVudHJ5QWNjZXNzb3JUeXBlKiAgICAgICAgICAgICAgICBcCisgIE1hcFR5cGVIYW5kbGVyPFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjRmllbGRUeXBlLCBUeXBlPjo6RW5zdXJlTXV0YWJsZSggICAgIFwKKyAgICAgIFR5cGVPbk1lbW9yeSogdmFsdWUsIEFyZW5hKiAvKiBhcmVuYSAqLykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlPjo6TWFwRW50cnlBY2Nlc3NvclR5cGUmICAgICAgICAgIFwKKyAgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBUeXBlPjo6RGVmYXVsdElmTm90SW5pdGlhbGl6ZWQoY29uc3QgVHlwZU9uTWVtb3J5JiB2YWx1ZSkgeyBcCisgICAgcmV0dXJuIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTWFwVHlwZUhhbmRsZXI8V2lyZUZvcm1hdExpdGU6OlRZUEVfIyNGaWVsZFR5cGUsIFR5cGU+OjpJc0luaXRpYWxpemVkKCAgICAgXAorICAgICAgY29uc3QgVHlwZU9uTWVtb3J5JiAvKiB2YWx1ZSAqLykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorUFJJTUlUSVZFX0hBTkRMRVJfRlVOQ1RJT05TKElOVDY0KQorUFJJTUlUSVZFX0hBTkRMRVJfRlVOQ1RJT05TKFVJTlQ2NCkKK1BSSU1JVElWRV9IQU5ETEVSX0ZVTkNUSU9OUyhJTlQzMikKK1BSSU1JVElWRV9IQU5ETEVSX0ZVTkNUSU9OUyhVSU5UMzIpCitQUklNSVRJVkVfSEFORExFUl9GVU5DVElPTlMoU0lOVDY0KQorUFJJTUlUSVZFX0hBTkRMRVJfRlVOQ1RJT05TKFNJTlQzMikKK1BSSU1JVElWRV9IQU5ETEVSX0ZVTkNUSU9OUyhFTlVNKQorUFJJTUlUSVZFX0hBTkRMRVJfRlVOQ1RJT05TKERPVUJMRSkKK1BSSU1JVElWRV9IQU5ETEVSX0ZVTkNUSU9OUyhGTE9BVCkKK1BSSU1JVElWRV9IQU5ETEVSX0ZVTkNUSU9OUyhGSVhFRDY0KQorUFJJTUlUSVZFX0hBTkRMRVJfRlVOQ1RJT05TKEZJWEVEMzIpCitQUklNSVRJVkVfSEFORExFUl9GVU5DVElPTlMoU0ZJWEVENjQpCitQUklNSVRJVkVfSEFORExFUl9GVU5DVElPTlMoU0ZJWEVEMzIpCitQUklNSVRJVkVfSEFORExFUl9GVU5DVElPTlMoQk9PTCkKKyN1bmRlZiBQUklNSVRJVkVfSEFORExFUl9GVU5DVElPTlMKKworLy8gRnVuY3Rpb25zIGZvciBvcGVyYXRpbmcgb24gYSBtYXAgZW50cnkgdXNpbmcgdHlwZSBoYW5kbGVycy4KKy8vCisvLyBEb2VzIG5vdCBjb250YWluIGFueSByZXByZXNlbnRhdGlvbiAodGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUKKy8vIGluc3RhbnRpYXRlZCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBWYWx1ZSwgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBrS2V5RmllbGRUeXBlLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUga1ZhbHVlRmllbGRUeXBlPgorc3RydWN0IE1hcEVudHJ5RnVuY3MgeworICB0eXBlZGVmIE1hcFR5cGVIYW5kbGVyPGtLZXlGaWVsZFR5cGUsIEtleT4gS2V5VHlwZUhhbmRsZXI7CisgIHR5cGVkZWYgTWFwVHlwZUhhbmRsZXI8a1ZhbHVlRmllbGRUeXBlLCBWYWx1ZT4gVmFsdWVUeXBlSGFuZGxlcjsKKyAgZW51bSA6IGludCB7CisgICAga0tleUZpZWxkTnVtYmVyID0gMSwKKyAgICBrVmFsdWVGaWVsZE51bWJlciA9IDIKKyAgfTsKKworICBzdGF0aWMgdWludDhfdCogSW50ZXJuYWxTZXJpYWxpemUoaW50IGZpZWxkX251bWJlciwgY29uc3QgS2V5JiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSYgdmFsdWUsIHVpbnQ4X3QqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIHsKKyAgICBwdHIgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHB0cik7CisgICAgcHRyID0gV2lyZUZvcm1hdExpdGU6OldyaXRlVGFnVG9BcnJheSgKKyAgICAgICAgZmllbGRfbnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgcHRyKTsKKyAgICBwdHIgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KEdldENhY2hlZFNpemUoa2V5LCB2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIpOworCisgICAgcHRyID0gS2V5VHlwZUhhbmRsZXI6OldyaXRlKGtLZXlGaWVsZE51bWJlciwga2V5LCBwdHIsIHN0cmVhbSk7CisgICAgcmV0dXJuIFZhbHVlVHlwZUhhbmRsZXI6OldyaXRlKGtWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZSwgcHRyLCBzdHJlYW0pOworICB9CisKKyAgc3RhdGljIHNpemVfdCBCeXRlU2l6ZUxvbmcoY29uc3QgS2V5JiBrZXksIGNvbnN0IFZhbHVlJiB2YWx1ZSkgeworICAgIC8vIFRhZ3MgZm9yIGtleSBhbmQgdmFsdWUgd2lsbCBib3RoIGJlIG9uZSBieXRlIChmaWVsZCBudW1iZXJzIDEgYW5kIDIpLgorICAgIHNpemVfdCBpbm5lcl9sZW5ndGggPQorICAgICAgICAyICsgS2V5VHlwZUhhbmRsZXI6OkJ5dGVTaXplKGtleSkgKyBWYWx1ZVR5cGVIYW5kbGVyOjpCeXRlU2l6ZSh2YWx1ZSk7CisgICAgcmV0dXJuIGlubmVyX2xlbmd0aCArIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlubmVyX2xlbmd0aCkpOworICB9CisKKyAgc3RhdGljIGludCBHZXRDYWNoZWRTaXplKGNvbnN0IEtleSYga2V5LCBjb25zdCBWYWx1ZSYgdmFsdWUpIHsKKyAgICAvLyBUYWdzIGZvciBrZXkgYW5kIHZhbHVlIHdpbGwgYm90aCBiZSBvbmUgYnl0ZSAoZmllbGQgbnVtYmVycyAxIGFuZCAyKS4KKyAgICByZXR1cm4gMiArIEtleVR5cGVIYW5kbGVyOjpHZXRDYWNoZWRTaXplKGtleSkgKworICAgICAgICAgICBWYWx1ZVR5cGVIYW5kbGVyOjpHZXRDYWNoZWRTaXplKHZhbHVlKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTUFQX1RZUEVfSEFORExFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0LnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzZWY2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0LnByb3RvCkBAIC0wLDAgKzEsMTI1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iOworCisvLyBXZSBkb24ndCBwdXQgdGhpcyBpbiBhIHBhY2thZ2Ugd2l0aGluIHByb3RvMiBiZWNhdXNlIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisvLyB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBkb2Vzbid0IGRlcGVuZCBvbiBiZWluZyBpbiB0aGUgcHJvdG8yIG5hbWVzcGFjZS4KKy8vIEluIG1hcF90ZXN0X3V0aWwuaCB3ZSBkbyAidXNpbmcgbmFtZXNwYWNlIHVuaXR0ZXN0ID0gcHJvdG9idWZfdW5pdHRlc3QiLgorcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworLy8gVGVzdHMgbWFwcy4KK21lc3NhZ2UgVGVzdE1hcCB7CisgIG1hcDxpbnQzMiwgaW50MzI+IG1hcF9pbnQzMl9pbnQzMiA9IDE7CisgIG1hcDxpbnQ2NCwgaW50NjQ+IG1hcF9pbnQ2NF9pbnQ2NCA9IDI7CisgIG1hcDx1aW50MzIsIHVpbnQzMj4gbWFwX3VpbnQzMl91aW50MzIgPSAzOworICBtYXA8dWludDY0LCB1aW50NjQ+IG1hcF91aW50NjRfdWludDY0ID0gNDsKKyAgbWFwPHNpbnQzMiwgc2ludDMyPiBtYXBfc2ludDMyX3NpbnQzMiA9IDU7CisgIG1hcDxzaW50NjQsIHNpbnQ2ND4gbWFwX3NpbnQ2NF9zaW50NjQgPSA2OworICBtYXA8Zml4ZWQzMiwgZml4ZWQzMj4gbWFwX2ZpeGVkMzJfZml4ZWQzMiA9IDc7CisgIG1hcDxmaXhlZDY0LCBmaXhlZDY0PiBtYXBfZml4ZWQ2NF9maXhlZDY0ID0gODsKKyAgbWFwPHNmaXhlZDMyLCBzZml4ZWQzMj4gbWFwX3NmaXhlZDMyX3NmaXhlZDMyID0gOTsKKyAgbWFwPHNmaXhlZDY0LCBzZml4ZWQ2ND4gbWFwX3NmaXhlZDY0X3NmaXhlZDY0ID0gMTA7CisgIG1hcDxpbnQzMiwgZmxvYXQ+IG1hcF9pbnQzMl9mbG9hdCA9IDExOworICBtYXA8aW50MzIsIGRvdWJsZT4gbWFwX2ludDMyX2RvdWJsZSA9IDEyOworICBtYXA8Ym9vbCwgYm9vbD4gbWFwX2Jvb2xfYm9vbCA9IDEzOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IG1hcF9zdHJpbmdfc3RyaW5nID0gMTQ7CisgIG1hcDxpbnQzMiwgYnl0ZXM+IG1hcF9pbnQzMl9ieXRlcyA9IDE1OworICBtYXA8aW50MzIsIE1hcEVudW0+IG1hcF9pbnQzMl9lbnVtID0gMTY7CisgIG1hcDxpbnQzMiwgRm9yZWlnbk1lc3NhZ2U+IG1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UgPSAxNzsKKyAgbWFwPHN0cmluZywgRm9yZWlnbk1lc3NhZ2U+IG1hcF9zdHJpbmdfZm9yZWlnbl9tZXNzYWdlID0gMTg7CisgIG1hcDxpbnQzMiwgVGVzdEFsbFR5cGVzPiBtYXBfaW50MzJfYWxsX3R5cGVzID0gMTk7Cit9CisKK21lc3NhZ2UgVGVzdE1hcFN1Ym1lc3NhZ2UgeworICBUZXN0TWFwIHRlc3RfbWFwID0gMTsKK30KKworbWVzc2FnZSBUZXN0TWVzc2FnZU1hcCB7CisgIG1hcDxpbnQzMiwgVGVzdEFsbFR5cGVzPiBtYXBfaW50MzJfbWVzc2FnZSA9IDE7Cit9CisKKy8vIFR3byBtYXAgZmllbGRzIHNoYXJlIHRoZSBzYW1lIGVudHJ5IGRlZmF1bHQgaW5zdGFuY2UuCittZXNzYWdlIFRlc3RTYW1lVHlwZU1hcCB7CisgIG1hcDxpbnQzMiwgaW50MzI+IG1hcDEgPSAxOworICBtYXA8aW50MzIsIGludDMyPiBtYXAyID0gMjsKK30KKworCitlbnVtIE1hcEVudW0geworICBNQVBfRU5VTV9GT08gPSAwOworICBNQVBfRU5VTV9CQVIgPSAxOworICBNQVBfRU5VTV9CQVogPSAyOworfQorCisvLyBUZXN0IGVtYmVkZGVkIG1lc3NhZ2Ugd2l0aCByZXF1aXJlZCBmaWVsZHMKK21lc3NhZ2UgVGVzdFJlcXVpcmVkTWVzc2FnZU1hcCB7CisgIG1hcDxpbnQzMiwgVGVzdFJlcXVpcmVkPiBtYXBfZmllbGQgPSAxOworfQorCittZXNzYWdlIFRlc3RBcmVuYU1hcCB7CisgIG1hcDxpbnQzMiwgaW50MzI+IG1hcF9pbnQzMl9pbnQzMiA9IDE7CisgIG1hcDxpbnQ2NCwgaW50NjQ+IG1hcF9pbnQ2NF9pbnQ2NCA9IDI7CisgIG1hcDx1aW50MzIsIHVpbnQzMj4gbWFwX3VpbnQzMl91aW50MzIgPSAzOworICBtYXA8dWludDY0LCB1aW50NjQ+IG1hcF91aW50NjRfdWludDY0ID0gNDsKKyAgbWFwPHNpbnQzMiwgc2ludDMyPiBtYXBfc2ludDMyX3NpbnQzMiA9IDU7CisgIG1hcDxzaW50NjQsIHNpbnQ2ND4gbWFwX3NpbnQ2NF9zaW50NjQgPSA2OworICBtYXA8Zml4ZWQzMiwgZml4ZWQzMj4gbWFwX2ZpeGVkMzJfZml4ZWQzMiA9IDc7CisgIG1hcDxmaXhlZDY0LCBmaXhlZDY0PiBtYXBfZml4ZWQ2NF9maXhlZDY0ID0gODsKKyAgbWFwPHNmaXhlZDMyLCBzZml4ZWQzMj4gbWFwX3NmaXhlZDMyX3NmaXhlZDMyID0gOTsKKyAgbWFwPHNmaXhlZDY0LCBzZml4ZWQ2ND4gbWFwX3NmaXhlZDY0X3NmaXhlZDY0ID0gMTA7CisgIG1hcDxpbnQzMiwgZmxvYXQ+IG1hcF9pbnQzMl9mbG9hdCA9IDExOworICBtYXA8aW50MzIsIGRvdWJsZT4gbWFwX2ludDMyX2RvdWJsZSA9IDEyOworICBtYXA8Ym9vbCwgYm9vbD4gbWFwX2Jvb2xfYm9vbCA9IDEzOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IG1hcF9zdHJpbmdfc3RyaW5nID0gMTQ7CisgIG1hcDxpbnQzMiwgYnl0ZXM+IG1hcF9pbnQzMl9ieXRlcyA9IDE1OworICBtYXA8aW50MzIsIE1hcEVudW0+IG1hcF9pbnQzMl9lbnVtID0gMTY7CisgIG1hcDxpbnQzMiwgRm9yZWlnbk1lc3NhZ2U+IG1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UgPSAxNzsKK30KKworLy8gUHJldmlvdXNseSwgbWVzc2FnZSBjb250YWluaW5nIGVudW0gY2FsbGVkIFR5cGUgY2Fubm90IGJlIHVzZWQgYXMgdmFsdWUgb2YKKy8vIG1hcCBmaWVsZC4KK21lc3NhZ2UgTWVzc2FnZUNvbnRhaW5pbmdFbnVtQ2FsbGVkVHlwZSB7CisgIGVudW0gVHlwZSB7IFRZUEVfRk9PID0gMDsgfQorICBtYXA8c3RyaW5nLCBNZXNzYWdlQ29udGFpbmluZ0VudW1DYWxsZWRUeXBlPiB0eXBlID0gMTsKK30KKworLy8gUHJldmlvdXNseSwgbWVzc2FnZSBjYW5ub3QgY29udGFpbiBtYXAgZmllbGQgY2FsbGVkICJlbnRyeSIuCittZXNzYWdlIE1lc3NhZ2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkgeworICBtYXA8aW50MzIsIGludDMyPiBlbnRyeSA9IDE7Cit9CisKK21lc3NhZ2UgVGVzdFJlY3Vyc2l2ZU1hcE1lc3NhZ2UgeworICBtYXA8c3RyaW5nLCBUZXN0UmVjdXJzaXZlTWFwTWVzc2FnZT4gYSA9IDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkYzZjOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5jYwpAQCAtMCwwICsxLDQwNCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9pbmwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcGFyc2VfY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX2ludGVybmFsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUT0RPKGdlcmJlbnMpIG1ha2UgdGhpcyBmYWN0b3JpemVkIGJldHRlci4gVGhpcyBzaG91bGQgbm90IGhhdmUgdG8gaG9wCisvLyB0byByZWZsZWN0aW9uLiBDdXJyZW50bHkgdXNlcyBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbiBhbmQgdGh1cyBpcworLy8gZGVmaW5lZCBpbiBnZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjCit2b2lkIFJlZ2lzdGVyRmlsZUxldmVsTWV0YWRhdGEoY29uc3QgRGVzY3JpcHRvclRhYmxlKiBkZXNjcmlwdG9yX3RhYmxlKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK3VzaW5nIGludGVybmFsOjpSZWZsZWN0aW9uT3BzOwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7Cit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7CisKK3ZvaWQgTWVzc2FnZTo6TWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2UmIGZyb20pIHsKKyAgYXV0byogY2xhc3NfdG8gPSBHZXRDbGFzc0RhdGEoKTsKKyAgYXV0byogY2xhc3NfZnJvbSA9IGZyb20uR2V0Q2xhc3NEYXRhKCk7CisgIGF1dG8qIG1lcmdlX3RvX2Zyb20gPSBjbGFzc190byA/IGNsYXNzX3RvLT5tZXJnZV90b19mcm9tIDogbnVsbHB0cjsKKyAgaWYgKGNsYXNzX3RvID09IG51bGxwdHIgfHwgY2xhc3NfdG8gIT0gY2xhc3NfZnJvbSkgeworICAgIG1lcmdlX3RvX2Zyb20gPSBbXShNZXNzYWdlJiB0bywgY29uc3QgTWVzc2FnZSYgZnJvbSkgeworICAgICAgUmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgJnRvKTsKKyAgICB9OworICB9CisgIG1lcmdlX3RvX2Zyb20oKnRoaXMsIGZyb20pOworfQorCit2b2lkIE1lc3NhZ2U6OkNoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCBNZXNzYWdlTGl0ZSYgb3RoZXIpIHsKKyAgTWVyZ2VGcm9tKCpkb3duX2Nhc3Q8Y29uc3QgTWVzc2FnZSo+KCZvdGhlcikpOworfQorCit2b2lkIE1lc3NhZ2U6OkNvcHlGcm9tKGNvbnN0IE1lc3NhZ2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKworICBhdXRvKiBjbGFzc190byA9IEdldENsYXNzRGF0YSgpOworICBhdXRvKiBjbGFzc19mcm9tID0gZnJvbS5HZXRDbGFzc0RhdGEoKTsKKyAgYXV0byogY29weV90b19mcm9tID0gY2xhc3NfdG8gPyBjbGFzc190by0+Y29weV90b19mcm9tIDogbnVsbHB0cjsKKworICBpZiAoY2xhc3NfdG8gPT0gbnVsbHB0ciB8fCBjbGFzc190byAhPSBjbGFzc19mcm9tKSB7CisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IEdldERlc2NyaXB0b3IoKTsKKyAgICBHT09HTEVfQ0hFQ0tfRVEoZnJvbS5HZXREZXNjcmlwdG9yKCksIGRlc2NyaXB0b3IpCisgICAgICAgIDw8ICI6IFRyaWVkIHRvIGNvcHkgZnJvbSBhIG1lc3NhZ2Ugd2l0aCBhIGRpZmZlcmVudCB0eXBlLiAiCisgICAgICAgICAgICJ0bzogIgorICAgICAgICA8PCBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKQorICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICJmcm9tOiAiCisgICAgICAgIDw8IGZyb20uR2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKTsKKyAgICBjb3B5X3RvX2Zyb20gPSBbXShNZXNzYWdlJiB0bywgY29uc3QgTWVzc2FnZSYgZnJvbSkgeworICAgICAgUmVmbGVjdGlvbk9wczo6Q29weShmcm9tLCAmdG8pOworICAgIH07CisgIH0KKyAgY29weV90b19mcm9tKCp0aGlzLCBmcm9tKTsKK30KKwordm9pZCBNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrKE1lc3NhZ2UmIHRvLCBjb25zdCBNZXNzYWdlJiBmcm9tKSB7CisjaWZuZGVmIE5ERUJVRworICBGYWlsSWZDb3B5RnJvbURlc2NlbmRhbnQodG8sIGZyb20pOworI2VuZGlmCisgIHRvLkNsZWFyKCk7CisgIHRvLkdldENsYXNzRGF0YSgpLT5tZXJnZV90b19mcm9tKHRvLCBmcm9tKTsKK30KKwordm9pZCBNZXNzYWdlOjpGYWlsSWZDb3B5RnJvbURlc2NlbmRhbnQoTWVzc2FnZSYgdG8sIGNvbnN0IE1lc3NhZ2UmIGZyb20pIHsKKyAgYXV0byogYXJlbmEgPSB0by5HZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgYm9vbCBzYW1lX21lc3NhZ2Vfb3duZWRfYXJlbmEgPSB0by5HZXRPd25pbmdBcmVuYSgpID09IG51bGxwdHIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVuYSAhPSBudWxscHRyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlbmEgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpOworICBHT09HTEVfQ0hFQ0soIXNhbWVfbWVzc2FnZV9vd25lZF9hcmVuYSAmJiAhaW50ZXJuYWw6OklzRGVzY2VuZGFudCh0bywgZnJvbSkpCisgICAgICA8PCAiU291cmNlIG9mIENvcHlGcm9tIGNhbm5vdCBiZSBhIGRlc2NlbmRhbnQgb2YgdGhlIHRhcmdldC4iOworfQorCitzdGQ6OnN0cmluZyBNZXNzYWdlOjpHZXRUeXBlTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCk7Cit9CisKK3ZvaWQgTWVzc2FnZTo6Q2xlYXIoKSB7IFJlZmxlY3Rpb25PcHM6OkNsZWFyKHRoaXMpOyB9CisKK2Jvb2wgTWVzc2FnZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgcmV0dXJuIFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQoKnRoaXMpOworfQorCit2b2lkIE1lc3NhZ2U6OkZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGVycm9ycykgY29uc3QgeworICByZXR1cm4gUmVmbGVjdGlvbk9wczo6RmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCp0aGlzLCAiIiwgZXJyb3JzKTsKK30KKworc3RkOjpzdHJpbmcgTWVzc2FnZTo6SW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpIGNvbnN0IHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVycm9yczsKKyAgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCZlcnJvcnMpOworICByZXR1cm4gSm9pbihlcnJvcnMsICIsICIpOworfQorCit2b2lkIE1lc3NhZ2U6OkNoZWNrSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIEdPT0dMRV9DSEVDSyhJc0luaXRpYWxpemVkKCkpIDw8ICJNZXNzYWdlIG9mIHR5cGUgXCIiIDw8IEdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCk7Cit9CisKK3ZvaWQgTWVzc2FnZTo6RGlzY2FyZFVua25vd25GaWVsZHMoKSB7CisgIHJldHVybiBSZWZsZWN0aW9uT3BzOjpEaXNjYXJkVW5rbm93bkZpZWxkcyh0aGlzKTsKK30KKworY29uc3QgY2hhciogTWVzc2FnZTo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSB7CisgIHJldHVybiBXaXJlRm9ybWF0OjpfSW50ZXJuYWxQYXJzZSh0aGlzLCBwdHIsIGN0eCk7Cit9CisKK3VpbnQ4X3QqIE1lc3NhZ2U6Ol9JbnRlcm5hbFNlcmlhbGl6ZSh1aW50OF90KiB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICByZXR1cm4gV2lyZUZvcm1hdDo6X0ludGVybmFsU2VyaWFsaXplKCp0aGlzLCB0YXJnZXQsIHN0cmVhbSk7Cit9CisKK3NpemVfdCBNZXNzYWdlOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisgIHNpemVfdCBzaXplID0gV2lyZUZvcm1hdDo6Qnl0ZVNpemUoKnRoaXMpOworICBTZXRDYWNoZWRTaXplKGludGVybmFsOjpUb0NhY2hlZFNpemUoc2l6ZSkpOworICByZXR1cm4gc2l6ZTsKK30KKwordm9pZCBNZXNzYWdlOjpTZXRDYWNoZWRTaXplKGludCAvKiBzaXplICovKSBjb25zdCB7CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJNZXNzYWdlIGNsYXNzIFwiIiA8PCBHZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiIGltcGxlbWVudHMgbmVpdGhlciBTZXRDYWNoZWRTaXplKCkgbm9yIEJ5dGVTaXplKCkuICAiCisgICAgICAgICAgICAgICAgIk11c3QgaW1wbGVtZW50IG9uZSBvciB0aGUgb3RoZXIuIjsKK30KKworc2l6ZV90IE1lc3NhZ2U6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICBzaXplX3QgdG90YWxfc2l6ZSwgaW50ZXJuYWw6OkNhY2hlZFNpemUqIGNhY2hlZF9zaXplKSBjb25zdCB7CisgIHRvdGFsX3NpemUgKz0gV2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczxVbmtub3duRmllbGRTZXQ+KAorICAgICAgICAgIFVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSkpOworICBjYWNoZWRfc2l6ZS0+U2V0KGludGVybmFsOjpUb0NhY2hlZFNpemUodG90YWxfc2l6ZSkpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKworc2l6ZV90IE1lc3NhZ2U6Ok1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgIHNpemVfdCB0b3RhbF9zaXplLCBpbnRlcm5hbDo6Q2FjaGVkU2l6ZSogY2FjaGVkX3NpemUpIGNvbnN0IHsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgcmV0dXJuIENvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCBjYWNoZWRfc2l6ZSk7CisgIH0KKyAgY2FjaGVkX3NpemUtPlNldChpbnRlcm5hbDo6VG9DYWNoZWRTaXplKHRvdGFsX3NpemUpKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3NpemVfdCBNZXNzYWdlOjpTcGFjZVVzZWRMb25nKCkgY29uc3QgeworICByZXR1cm4gR2V0UmVmbGVjdGlvbigpLT5TcGFjZVVzZWRMb25nKCp0aGlzKTsKK30KKwordWludDY0X3QgTWVzc2FnZTo6R2V0SW52YXJpYW50UGVyQnVpbGQodWludDY0X3Qgc2FsdCkgeworICByZXR1cm4gc2FsdDsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIE1lc3NhZ2VGYWN0b3J5CisKK01lc3NhZ2VGYWN0b3J5Ojp+TWVzc2FnZUZhY3RvcnkoKSB7fQorCituYW1lc3BhY2UgeworCisKKyNkZWZpbmUgSEFTSF9NQVAgc3RkOjp1bm9yZGVyZWRfbWFwCisjZGVmaW5lIFNUUl9IQVNIX0ZYTiBoYXNoPDo6Z29vZ2xlOjpwcm90b2J1Zjo6U3RyaW5nUGllY2U+CisKKworY2xhc3MgR2VuZXJhdGVkTWVzc2FnZUZhY3RvcnkgZmluYWwgOiBwdWJsaWMgTWVzc2FnZUZhY3RvcnkgeworIHB1YmxpYzoKKyAgc3RhdGljIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5KiBzaW5nbGV0b24oKTsKKworICB2b2lkIFJlZ2lzdGVyRmlsZShjb25zdCBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RGVzY3JpcHRvclRhYmxlKiB0YWJsZSk7CisgIHZvaWQgUmVnaXN0ZXJUeXBlKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE1lc3NhZ2UqIHByb3RvdHlwZSk7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlRmFjdG9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgY29uc3QgTWVzc2FnZSogR2V0UHJvdG90eXBlKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgLy8gT25seSB3cml0dGVuIGF0IHN0YXRpYyBpbml0IHRpbWUsIHNvIGRvZXMgbm90IHJlcXVpcmUgbG9ja2luZy4KKyAgSEFTSF9NQVA8U3RyaW5nUGllY2UsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEZXNjcmlwdG9yVGFibGUqLAorICAgICAgICAgICBTVFJfSEFTSF9GWE4+CisgICAgICBmaWxlX21hcF87CisKKyAgaW50ZXJuYWw6OldyYXBwZWRNdXRleCBtdXRleF87CisgIC8vIEluaXRpYWxpemVkIGxhemlseSwgc28gcmVxdWlyZXMgbG9ja2luZy4KKyAgc3RkOjp1bm9yZGVyZWRfbWFwPGNvbnN0IERlc2NyaXB0b3IqLCBjb25zdCBNZXNzYWdlKj4gdHlwZV9tYXBfOworfTsKKworR2VuZXJhdGVkTWVzc2FnZUZhY3RvcnkqIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5OjpzaW5nbGV0b24oKSB7CisgIHN0YXRpYyBhdXRvIGluc3RhbmNlID0KKyAgICAgIGludGVybmFsOjpPblNodXRkb3duRGVsZXRlKG5ldyBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeSk7CisgIHJldHVybiBpbnN0YW5jZTsKK30KKwordm9pZCBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6UmVnaXN0ZXJGaWxlKAorICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEZXNjcmlwdG9yVGFibGUqIHRhYmxlKSB7CisgIGlmICghSW5zZXJ0SWZOb3RQcmVzZW50KCZmaWxlX21hcF8sIHRhYmxlLT5maWxlbmFtZSwgdGFibGUpKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkZpbGUgaXMgYWxyZWFkeSByZWdpc3RlcmVkOiAiIDw8IHRhYmxlLT5maWxlbmFtZTsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5OjpSZWdpc3RlclR5cGUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGUpIHsKKyAgR09PR0xFX0RDSEVDS19FUShkZXNjcmlwdG9yLT5maWxlKCktPnBvb2woKSwgRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkpCisgICAgICA8PCAiVHJpZWQgdG8gcmVnaXN0ZXIgYSBub24tZ2VuZXJhdGVkIHR5cGUgd2l0aCB0aGUgZ2VuZXJhdGVkICIKKyAgICAgICAgICJ0eXBlIHJlZ2lzdHJ5LiI7CisKKyAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYXMgYSByZXN1bHQgb2YgY2FsbGluZyBhIGZpbGUgcmVnaXN0cmF0aW9uCisgIC8vIGZ1bmN0aW9uIGR1cmluZyBHZXRQcm90b3R5cGUoKSwgaW4gd2hpY2ggY2FzZSB3ZSBhbHJlYWR5IGhhdmUgbG9ja2VkCisgIC8vIHRoZSBtdXRleC4KKyAgbXV0ZXhfLkFzc2VydEhlbGQoKTsKKyAgaWYgKCFJbnNlcnRJZk5vdFByZXNlbnQoJnR5cGVfbWFwXywgZGVzY3JpcHRvciwgcHJvdG90eXBlKSkgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiVHlwZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICIgPDwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCk7CisgIH0KK30KKworCitjb25zdCBNZXNzYWdlKiBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6R2V0UHJvdG90eXBlKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpIHsKKyAgeworICAgIFJlYWRlck11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICAgIGNvbnN0IE1lc3NhZ2UqIHJlc3VsdCA9IEZpbmRQdHJPck51bGwodHlwZV9tYXBfLCB0eXBlKTsKKyAgICBpZiAocmVzdWx0ICE9IG51bGxwdHIpIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvLyBJZiB0aGUgdHlwZSBpcyBub3QgaW4gdGhlIGdlbmVyYXRlZCBwb29sLCB0aGVuIHdlIGNhbid0IHBvc3NpYmx5IGhhbmRsZQorICAvLyBpdC4KKyAgaWYgKHR5cGUtPmZpbGUoKS0+cG9vbCgpICE9IERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKSByZXR1cm4gbnVsbHB0cjsKKworICAvLyBBcHBhcmVudGx5IHRoZSBmaWxlIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQgeWV0LiAgTGV0J3MgZG8gdGhhdCBub3cuCisgIGNvbnN0IGludGVybmFsOjpEZXNjcmlwdG9yVGFibGUqIHJlZ2lzdHJhdGlvbl9kYXRhID0KKyAgICAgIEZpbmRQdHJPck51bGwoZmlsZV9tYXBfLCB0eXBlLT5maWxlKCktPm5hbWUoKS5jX3N0cigpKTsKKyAgaWYgKHJlZ2lzdHJhdGlvbl9kYXRhID09IG51bGxwdHIpIHsKKyAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkZpbGUgYXBwZWFycyB0byBiZSBpbiBnZW5lcmF0ZWQgcG9vbCBidXQgd2Fzbid0ICIKKyAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZDogIgorICAgICAgICAgICAgICAgIDw8IHR5cGUtPmZpbGUoKS0+bmFtZSgpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgV3JpdGVyTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisKKyAgLy8gQ2hlY2sgaWYgYW5vdGhlciB0aHJlYWQgcHJlZW1wdGVkIHVzLgorICBjb25zdCBNZXNzYWdlKiByZXN1bHQgPSBGaW5kUHRyT3JOdWxsKHR5cGVfbWFwXywgdHlwZSk7CisgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgeworICAgIC8vIE5vcGUuICBPSywgcmVnaXN0ZXIgZXZlcnl0aGluZy4KKyAgICBpbnRlcm5hbDo6UmVnaXN0ZXJGaWxlTGV2ZWxNZXRhZGF0YShyZWdpc3RyYXRpb25fZGF0YSk7CisgICAgLy8gU2hvdWxkIGJlIGhlcmUgbm93LgorICAgIHJlc3VsdCA9IEZpbmRQdHJPck51bGwodHlwZV9tYXBfLCB0eXBlKTsKKyAgfQorCisgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiVHlwZSBhcHBlYXJzIHRvIGJlIGluIGdlbmVyYXRlZCBwb29sIGJ1dCB3YXNuJ3QgIgorICAgICAgICAgICAgICAgIDw8ICJyZWdpc3RlcmVkOiAiIDw8IHR5cGUtPmZ1bGxfbmFtZSgpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK01lc3NhZ2VGYWN0b3J5KiBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSB7CisgIHJldHVybiBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6c2luZ2xldG9uKCk7Cit9CisKK3ZvaWQgTWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRGaWxlKAorICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEZXNjcmlwdG9yVGFibGUqIHRhYmxlKSB7CisgIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5OjpzaW5nbGV0b24oKS0+UmVnaXN0ZXJGaWxlKHRhYmxlKTsKK30KKwordm9pZCBNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgTWVzc2FnZSogcHJvdG90eXBlKSB7CisgIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5OjpzaW5nbGV0b24oKS0+UmVnaXN0ZXJUeXBlKGRlc2NyaXB0b3IsIHByb3RvdHlwZSk7Cit9CisKKworbmFtZXNwYWNlIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCogR2V0U2luZ2xldG9uKCkgeworICBzdGF0aWMgVCBzaW5nbGV0b247CisgIHJldHVybiAmc2luZ2xldG9uOworfQorfSAgLy8gbmFtZXNwYWNlCisKK2NvbnN0IGludGVybmFsOjpSZXBlYXRlZEZpZWxkQWNjZXNzb3IqIFJlZmxlY3Rpb246OlJlcGVhdGVkRmllbGRBY2Nlc3NvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIEdPT0dMRV9DSEVDSyhmaWVsZC0+aXNfcmVwZWF0ZWQoKSk7CisgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgSEFORExFX1BSSU1JVElWRV9UWVBFKFRZUEUsIHR5cGUpIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNUWVBFOiAgIFwKKyAgICByZXR1cm4gR2V0U2luZ2xldG9uPGludGVybmFsOjpSZXBlYXRlZEZpZWxkUHJpbWl0aXZlQWNjZXNzb3I8dHlwZT4gPigpOworICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShJTlQzMiwgaW50MzJfdCkKKyAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoVUlOVDMyLCB1aW50MzJfdCkKKyAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoSU5UNjQsIGludDY0X3QpCisgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKFVJTlQ2NCwgdWludDY0X3QpCisgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKEZMT0FULCBmbG9hdCkKKyAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoRE9VQkxFLCBkb3VibGUpCisgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKEJPT0wsIGJvb2wpCisgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKEVOVU0sIGludDMyX3QpCisjdW5kZWYgSEFORExFX1BSSU1JVElWRV9UWVBFCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICByZXR1cm4gR2V0U2luZ2xldG9uPGludGVybmFsOjpSZXBlYXRlZFB0ckZpZWxkU3RyaW5nQWNjZXNzb3I+KCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgaWYgKGZpZWxkLT5pc19tYXAoKSkgeworICAgICAgICByZXR1cm4gR2V0U2luZ2xldG9uPGludGVybmFsOjpNYXBGaWVsZEFjY2Vzc29yPigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEdldFNpbmdsZXRvbjxpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZE1lc3NhZ2VBY2Nlc3Nvcj4oKTsKKyAgICAgIH0KKyAgfQorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiU2hvdWxkIG5vdCByZWFjaCBoZXJlLiI7CisgIHJldHVybiBudWxscHRyOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGUgPD4KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTgwMCkKKy8vIE5vdGU6IGZvcmNlIG5vaW5saW5lIHRvIHdvcmthcm91bmQgTVNWQyBjb21waWxlciBidWcgd2l0aCAvWmM6aW5saW5lLCBpc3N1ZQorLy8gIzI0MAorUFJPVE9CVUZfTk9JTkxJTkUKKyNlbmRpZgorICAgIE1lc3NhZ2UqCisgICAgR2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+OjpOZXdGcm9tUHJvdG90eXBlKGNvbnN0IE1lc3NhZ2UqIHByb3RvdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBwcm90b3R5cGUtPk5ldyhhcmVuYSk7Cit9Cit0ZW1wbGF0ZSA8PgorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxODAwKQorLy8gTm90ZTogZm9yY2Ugbm9pbmxpbmUgdG8gd29ya2Fyb3VuZCBNU1ZDIGNvbXBpbGVyIGJ1ZyB3aXRoIC9aYzppbmxpbmUsIGlzc3VlCisvLyAjMjQwCitQUk9UT0JVRl9OT0lOTElORQorI2VuZGlmCisgICAgQXJlbmEqCisgICAgR2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+OjpHZXRPd25pbmdBcmVuYShNZXNzYWdlKiB2YWx1ZSkgeworICByZXR1cm4gdmFsdWUtPkdldE93bmluZ0FyZW5hKCk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZWMxNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaApAQCAtMCwwICsxLDE0OTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBEZWZpbmVzIE1lc3NhZ2UsIHRoZSBhYnN0cmFjdCBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgbm9uLWxpdGUKKy8vIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0cy4gIEFsdGhvdWdoIGl0J3MgcG9zc2libGUgdG8gaW1wbGVtZW50IHRoaXMKKy8vIGludGVyZmFjZSBtYW51YWxseSwgbW9zdCB1c2VycyB3aWxsIHVzZSB0aGUgcHJvdG9jb2wgY29tcGlsZXIgdG8KKy8vIGdlbmVyYXRlIGltcGxlbWVudGF0aW9ucy4KKy8vCisvLyBFeGFtcGxlIHVzYWdlOgorLy8KKy8vIFNheSB5b3UgaGF2ZSBhIG1lc3NhZ2UgZGVmaW5lZCBhczoKKy8vCisvLyAgIG1lc3NhZ2UgRm9vIHsKKy8vICAgICBvcHRpb25hbCBzdHJpbmcgdGV4dCA9IDE7CisvLyAgICAgcmVwZWF0ZWQgaW50MzIgbnVtYmVycyA9IDI7CisvLyAgIH0KKy8vCisvLyBUaGVuLCBpZiB5b3UgdXNlZCB0aGUgcHJvdG9jb2wgY29tcGlsZXIgdG8gZ2VuZXJhdGUgYSBjbGFzcyBmcm9tIHRoZSBhYm92ZQorLy8gZGVmaW5pdGlvbiwgeW91IGNvdWxkIHVzZSBpdCBsaWtlIHNvOgorLy8KKy8vICAgc3RkOjpzdHJpbmcgZGF0YTsgIC8vIFdpbGwgc3RvcmUgYSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UuCisvLworLy8gICB7CisvLyAgICAgLy8gQ3JlYXRlIGEgbWVzc2FnZSBhbmQgc2VyaWFsaXplIGl0LgorLy8gICAgIEZvbyBmb287CisvLyAgICAgZm9vLnNldF90ZXh0KCJIZWxsbyBXb3JsZCEiKTsKKy8vICAgICBmb28uYWRkX251bWJlcnMoMSk7CisvLyAgICAgZm9vLmFkZF9udW1iZXJzKDUpOworLy8gICAgIGZvby5hZGRfbnVtYmVycyg0Mik7CisvLworLy8gICAgIGZvby5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisvLyAgIH0KKy8vCisvLyAgIHsKKy8vICAgICAvLyBQYXJzZSB0aGUgc2VyaWFsaXplZCBtZXNzYWdlIGFuZCBjaGVjayB0aGF0IGl0IGNvbnRhaW5zIHRoZQorLy8gICAgIC8vIGNvcnJlY3QgZGF0YS4KKy8vICAgICBGb28gZm9vOworLy8gICAgIGZvby5QYXJzZUZyb21TdHJpbmcoZGF0YSk7CisvLworLy8gICAgIGFzc2VydChmb28udGV4dCgpID09ICJIZWxsbyBXb3JsZCEiKTsKKy8vICAgICBhc3NlcnQoZm9vLm51bWJlcnNfc2l6ZSgpID09IDMpOworLy8gICAgIGFzc2VydChmb28ubnVtYmVycygwKSA9PSAxKTsKKy8vICAgICBhc3NlcnQoZm9vLm51bWJlcnMoMSkgPT0gNSk7CisvLyAgICAgYXNzZXJ0KGZvby5udW1iZXJzKDIpID09IDQyKTsKKy8vICAgfQorLy8KKy8vICAgeworLy8gICAgIC8vIFNhbWUgYXMgdGhlIGxhc3QgYmxvY2ssIGJ1dCBkbyBpdCBkeW5hbWljYWxseSB2aWEgdGhlIE1lc3NhZ2UKKy8vICAgICAvLyByZWZsZWN0aW9uIGludGVyZmFjZS4KKy8vICAgICBNZXNzYWdlKiBmb28gPSBuZXcgRm9vOworLy8gICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBmb28tPkdldERlc2NyaXB0b3IoKTsKKy8vCisvLyAgICAgLy8gR2V0IHRoZSBkZXNjcmlwdG9ycyBmb3IgdGhlIGZpZWxkcyB3ZSdyZSBpbnRlcmVzdGVkIGluIGFuZCB2ZXJpZnkKKy8vICAgICAvLyB0aGVpciB0eXBlcy4KKy8vICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHRleHRfZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoInRleHQiKTsKKy8vICAgICBhc3NlcnQodGV4dF9maWVsZCAhPSBudWxscHRyKTsKKy8vICAgICBhc3NlcnQodGV4dF9maWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpOworLy8gICAgIGFzc2VydCh0ZXh0X2ZpZWxkLT5sYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfT1BUSU9OQUwpOworLy8gICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbnVtYmVyc19maWVsZCA9IGRlc2NyaXB0b3ItPgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRGaWVsZEJ5TmFtZSgibnVtYmVycyIpOworLy8gICAgIGFzc2VydChudW1iZXJzX2ZpZWxkICE9IG51bGxwdHIpOworLy8gICAgIGFzc2VydChudW1iZXJzX2ZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyKTsKKy8vICAgICBhc3NlcnQobnVtYmVyc19maWVsZC0+bGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEKTsKKy8vCisvLyAgICAgLy8gUGFyc2UgdGhlIG1lc3NhZ2UuCisvLyAgICAgZm9vLT5QYXJzZUZyb21TdHJpbmcoZGF0YSk7CisvLworLy8gICAgIC8vIFVzZSB0aGUgcmVmbGVjdGlvbiBpbnRlcmZhY2UgdG8gZXhhbWluZSB0aGUgY29udGVudHMuCisvLyAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IGZvby0+R2V0UmVmbGVjdGlvbigpOworLy8gICAgIGFzc2VydChyZWZsZWN0aW9uLT5HZXRTdHJpbmcoKmZvbywgdGV4dF9maWVsZCkgPT0gIkhlbGxvIFdvcmxkISIpOworLy8gICAgIGFzc2VydChyZWZsZWN0aW9uLT5GaWVsZFNpemUoKmZvbywgbnVtYmVyc19maWVsZCkgPT0gMyk7CisvLyAgICAgYXNzZXJ0KHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIoKmZvbywgbnVtYmVyc19maWVsZCwgMCkgPT0gMSk7CisvLyAgICAgYXNzZXJ0KHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIoKmZvbywgbnVtYmVyc19maWVsZCwgMSkgPT0gNSk7CisvLyAgICAgYXNzZXJ0KHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIoKmZvbywgbnVtYmVyc19maWVsZCwgMikgPT0gNDIpOworLy8KKy8vICAgICBkZWxldGUgZm9vOworLy8gICB9CisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX01FU1NBR0VfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9NRVNTQUdFX0hfXworCisKKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXAuaD4gIC8vIFRPRE8oYi8yMTE0NDI3MTgpOiBjbGVhbnVwCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorCisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCisjaWZkZWYgU1dJRworI2Vycm9yICJZb3UgY2Fubm90IFNXSUcgcHJvdG8gaGVhZGVycyIKKyNlbmRpZgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgorY2xhc3MgTWVzc2FnZTsKK2NsYXNzIFJlZmxlY3Rpb247CitjbGFzcyBNZXNzYWdlRmFjdG9yeTsKKworLy8gRGVmaW5lZCBpbiBvdGhlciBmaWxlcy4KK2NsYXNzIEFzc2lnbkRlc2NyaXB0b3JzSGVscGVyOworY2xhc3MgRHluYW1pY01lc3NhZ2VGYWN0b3J5OworY2xhc3MgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0SGVscGVyOworY2xhc3MgTWFwS2V5OworY2xhc3MgTWFwVmFsdWVDb25zdFJlZjsKK2NsYXNzIE1hcFZhbHVlUmVmOworY2xhc3MgTWFwSXRlcmF0b3I7CitjbGFzcyBNYXBSZWZsZWN0aW9uVGVzdGVyOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworc3RydWN0IERlc2NyaXB0b3JUYWJsZTsKK2NsYXNzIE1hcEZpZWxkQmFzZTsKK2NsYXNzIFN3YXBGaWVsZEhlbHBlcjsKK2NsYXNzIENhY2hlZFNpemU7Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK2NsYXNzIFVua25vd25GaWVsZFNldDsgIC8vIHVua25vd25fZmllbGRfc2V0LmgKK25hbWVzcGFjZSBpbyB7CitjbGFzcyBaZXJvQ29weUlucHV0U3RyZWFtOyAgIC8vIHplcm9fY29weV9zdHJlYW0uaAorY2xhc3MgWmVyb0NvcHlPdXRwdXRTdHJlYW07ICAvLyB6ZXJvX2NvcHlfc3RyZWFtLmgKK2NsYXNzIENvZGVkSW5wdXRTdHJlYW07ICAgICAgLy8gY29kZWRfc3RyZWFtLmgKK2NsYXNzIENvZGVkT3V0cHV0U3RyZWFtOyAgICAgLy8gY29kZWRfc3RyZWFtLmgKK30gIC8vIG5hbWVzcGFjZSBpbworbmFtZXNwYWNlIHB5dGhvbiB7CitjbGFzcyBNYXBSZWZsZWN0aW9uRnJpZW5kOyAgLy8gc2NhbGFyX21hcF9jb250YWluZXIuaAorY2xhc3MgTWVzc2FnZVJlZmxlY3Rpb25GcmllbmQ7Cit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCituYW1lc3BhY2UgZXhwciB7CitjbGFzcyBDZWxNYXBSZWZsZWN0aW9uRnJpZW5kOyAgLy8gZmllbGRfYmFja2VkX21hcF9pbXBsLmNjCit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBNYXBGaWVsZFByaW50ZXJIZWxwZXI7ICAvLyB0ZXh0X2Zvcm1hdC5jYworfQorbmFtZXNwYWNlIHV0aWwgeworY2xhc3MgTWVzc2FnZURpZmZlcmVuY2VyOworfQorCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBSZWZsZWN0aW9uQWNjZXNzb3I7ICAgICAgLy8gbWVzc2FnZS5jYworY2xhc3MgUmVmbGVjdGlvbk9wczsgICAgICAgICAgIC8vIHJlZmxlY3Rpb25fb3BzLmgKK2NsYXNzIE1hcEtleVNvcnRlcjsgICAgICAgICAgICAvLyB3aXJlX2Zvcm1hdC5jYworY2xhc3MgV2lyZUZvcm1hdDsgICAgICAgICAgICAgIC8vIHdpcmVfZm9ybWF0LmgKK2NsYXNzIE1hcEZpZWxkUmVmbGVjdGlvblRlc3Q7ICAvLyBtYXBfdGVzdC5jYworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUmVwZWF0ZWRGaWVsZDsgIC8vIHJlcGVhdGVkX2ZpZWxkLmgKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBSZXBlYXRlZFB0ckZpZWxkOyAgLy8gcmVwZWF0ZWRfZmllbGQuaAorCisvLyBBIGNvbnRhaW5lciB0byBob2xkIG1lc3NhZ2UgbWV0YWRhdGEuCitzdHJ1Y3QgTWV0YWRhdGEgeworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlIDxjbGFzcyBUbz4KK2lubGluZSBUbyogR2V0UG9pbnRlckF0T2Zmc2V0KE1lc3NhZ2UqIG1lc3NhZ2UsIHVpbnQzMl90IG9mZnNldCkgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUbyo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG1lc3NhZ2UpICsgb2Zmc2V0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRvPgorY29uc3QgVG8qIEdldENvbnN0UG9pbnRlckF0T2Zmc2V0KGNvbnN0IE1lc3NhZ2UqIG1lc3NhZ2UsIHVpbnQzMl90IG9mZnNldCkgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUbyo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG1lc3NhZ2UpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVG8+Citjb25zdCBUbyYgR2V0Q29uc3RSZWZBdE9mZnNldChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCB1aW50MzJfdCBvZmZzZXQpIHsKKyAgcmV0dXJuICpHZXRDb25zdFBvaW50ZXJBdE9mZnNldDxUbz4oJm1lc3NhZ2UsIG9mZnNldCk7Cit9CisKK2Jvb2wgQ3JlYXRlVW5rbm93bkVudW1WYWx1ZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiAibWVzc2FnZSIgaXMgYSBkZXNjZW5kYW50IG9mICJyb290Ii4KK1BST1RPQlVGX0VYUE9SVCBib29sIElzRGVzY2VuZGFudChNZXNzYWdlJiByb290LCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHByb3RvY29sIG1lc3NhZ2VzLgorLy8KKy8vIFNlZSBhbHNvIE1lc3NhZ2VMaXRlLCB3aGljaCBjb250YWlucyBtb3N0IGV2ZXJ5LWRheSBvcGVyYXRpb25zLiAgTWVzc2FnZQorLy8gYWRkcyBkZXNjcmlwdG9ycyBhbmQgcmVmbGVjdGlvbiBvbiB0b3Agb2YgdGhhdC4KKy8vCisvLyBUaGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIHRoYXQgYXJlIHZpcnR1YWwgYnV0IG5vdCBwdXJlLXZpcnR1YWwgaGF2ZQorLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgYmFzZWQgb24gcmVmbGVjdGlvbi4gIE1lc3NhZ2UgY2xhc3NlcyB3aGljaCBhcmUKKy8vIG9wdGltaXplZCBmb3Igc3BlZWQgd2lsbCB3YW50IHRvIG92ZXJyaWRlIHRoZXNlIHdpdGggZmFzdGVyIGltcGxlbWVudGF0aW9ucywKKy8vIGJ1dCBjbGFzc2VzIG9wdGltaXplZCBmb3IgY29kZSBzaXplIG1heSBiZSBoYXBweSB3aXRoIGtlZXBpbmcgdGhlbS4gIFNlZQorLy8gdGhlIG9wdGltaXplX2ZvciBvcHRpb24gaW4gZGVzY3JpcHRvci5wcm90by4KKy8vCisvLyBVc2VycyBtdXN0IG5vdCBkZXJpdmUgZnJvbSB0aGlzIGNsYXNzLiBPbmx5IHRoZSBwcm90b2NvbCBjb21waWxlciBhbmQKKy8vIHRoZSBpbnRlcm5hbCBsaWJyYXJ5IGFyZSBhbGxvd2VkIHRvIGNyZWF0ZSBzdWJjbGFzc2VzLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIE1lc3NhZ2UgOiBwdWJsaWMgTWVzc2FnZUxpdGUgeworIHB1YmxpYzoKKyAgY29uc3RleHByIE1lc3NhZ2UoKSB7fQorCisgIC8vIEJhc2ljIE9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzYW1lIHR5cGUuICBPd25lcnNoaXAgaXMgcGFzc2VkIHRvIHRoZQorICAvLyBjYWxsZXIuICAoVGhpcyBpcyBhbHNvIGRlZmluZWQgaW4gTWVzc2FnZUxpdGUsIGJ1dCBpcyBkZWZpbmVkIGFnYWluIGhlcmUKKyAgLy8gZm9yIHJldHVybi10eXBlIGNvdmFyaWFuY2UuKQorICBNZXNzYWdlKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcobnVsbHB0cik7IH0KKworICAvLyBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb24gdGhlIGFyZW5hLiBPd25lcnNoaXAgaXMgcGFzc2VkIHRvIHRoZSBjYWxsZXIKKyAgLy8gaWYgYXJlbmEgaXMgYSBudWxscHRyLgorICBNZXNzYWdlKiBOZXcoQXJlbmEqIGFyZW5hKSBjb25zdCBvdmVycmlkZSA9IDA7CisKKyAgLy8gTWFrZSB0aGlzIG1lc3NhZ2UgaW50byBhIGNvcHkgb2YgdGhlIGdpdmVuIG1lc3NhZ2UuICBUaGUgZ2l2ZW4gbWVzc2FnZQorICAvLyBtdXN0IGhhdmUgdGhlIHNhbWUgZGVzY3JpcHRvciwgYnV0IG5lZWQgbm90IG5lY2Vzc2FyaWx5IGJlIHRoZSBzYW1lIGNsYXNzLgorICAvLyBCeSBkZWZhdWx0IHRoaXMgaXMganVzdCBpbXBsZW1lbnRlZCBhcyAiQ2xlYXIoKTsgTWVyZ2VGcm9tKGZyb20pOyIuCisgIHZvaWQgQ29weUZyb20oY29uc3QgTWVzc2FnZSYgZnJvbSk7CisKKyAgLy8gTWVyZ2UgdGhlIGZpZWxkcyBmcm9tIHRoZSBnaXZlbiBtZXNzYWdlIGludG8gdGhpcyBtZXNzYWdlLiAgU2luZ3VsYXIKKyAgLy8gZmllbGRzIHdpbGwgYmUgb3ZlcndyaXR0ZW4sIGlmIHNwZWNpZmllZCBpbiBmcm9tLCBleGNlcHQgZm9yIGVtYmVkZGVkCisgIC8vIG1lc3NhZ2VzIHdoaWNoIHdpbGwgYmUgbWVyZ2VkLiAgUmVwZWF0ZWQgZmllbGRzIHdpbGwgYmUgY29uY2F0ZW5hdGVkLgorICAvLyBUaGUgZ2l2ZW4gbWVzc2FnZSBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhpcyBtZXNzYWdlIChpLmUuIHRoZQorICAvLyBleGFjdCBzYW1lIGNsYXNzKS4KKyAgdmlydHVhbCB2b2lkIE1lcmdlRnJvbShjb25zdCBNZXNzYWdlJiBmcm9tKTsKKworICAvLyBWZXJpZmllcyB0aGF0IElzSW5pdGlhbGl6ZWQoKSByZXR1cm5zIHRydWUuICBHT09HTEVfQ0hFQ0stZmFpbHMgb3RoZXJ3aXNlLCB3aXRoCisgIC8vIGEgbmljZSBlcnJvciBtZXNzYWdlLgorICB2b2lkIENoZWNrSW5pdGlhbGl6ZWQoKSBjb25zdDsKKworICAvLyBTbG93bHkgYnVpbGQgYSBsaXN0IG9mIGFsbCByZXF1aXJlZCBmaWVsZHMgdGhhdCBhcmUgbm90IHNldC4KKyAgLy8gVGhpcyBpcyBtdWNoLCBtdWNoIHNsb3dlciB0aGFuIElzSW5pdGlhbGl6ZWQoKSBhcyBpdCBpcyBpbXBsZW1lbnRlZAorICAvLyBwdXJlbHkgdmlhIHJlZmxlY3Rpb24uICBHZW5lcmFsbHksIHlvdSBzaG91bGQgbm90IGNhbGwgdGhpcyB1bmxlc3MgeW91CisgIC8vIGhhdmUgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQgYW4gZXJyb3IgZXhpc3RzIGJ5IGNhbGxpbmcgSXNJbml0aWFsaXplZCgpLgorICB2b2lkIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGVycm9ycykgY29uc3Q7CisKKyAgLy8gTGlrZSBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMsIGJ1dCBqb2lucyBhbGwgdGhlIHN0cmluZ3MsIGRlbGltaXRlZCBieQorICAvLyBjb21tYXMsIGFuZCByZXR1cm5zIHRoZW0uCisgIHN0ZDo6c3RyaW5nIEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKworICAvLyBDbGVhcnMgYWxsIHVua25vd24gZmllbGRzIGZyb20gdGhpcyBtZXNzYWdlIGFuZCBhbGwgZW1iZWRkZWQgbWVzc2FnZXMuCisgIC8vIE5vcm1hbGx5LCBpZiB1bmtub3duIHRhZyBudW1iZXJzIGFyZSBlbmNvdW50ZXJlZCB3aGVuIHBhcnNpbmcgYSBtZXNzYWdlLAorICAvLyB0aGUgdGFnIGFuZCB2YWx1ZSBhcmUgc3RvcmVkIGluIHRoZSBtZXNzYWdlJ3MgVW5rbm93bkZpZWxkU2V0IGFuZAorICAvLyB0aGVuIHdyaXR0ZW4gYmFjayBvdXQgd2hlbiB0aGUgbWVzc2FnZSBpcyBzZXJpYWxpemVkLiAgVGhpcyBhbGxvd3Mgc2VydmVycworICAvLyB3aGljaCBzaW1wbHkgcm91dGUgbWVzc2FnZXMgdG8gb3RoZXIgc2VydmVycyB0byBwYXNzIHRocm91Z2ggbWVzc2FnZXMKKyAgLy8gdGhhdCBoYXZlIG5ldyBmaWVsZCBkZWZpbml0aW9ucyB3aGljaCB0aGV5IGRvbid0IHlldCBrbm93IGFib3V0LiAgSG93ZXZlciwKKyAgLy8gdGhpcyBiZWhhdmlvciBjYW4gaGF2ZSBzZWN1cml0eSBpbXBsaWNhdGlvbnMuICBUbyBhdm9pZCBpdCwgY2FsbCB0aGlzCisgIC8vIG1ldGhvZCBhZnRlciBwYXJzaW5nLgorICAvLworICAvLyBTZWUgUmVmbGVjdGlvbjo6R2V0VW5rbm93bkZpZWxkcygpIGZvciBtb3JlIG9uIHVua25vd24gZmllbGRzLgorICB2b2lkIERpc2NhcmRVbmtub3duRmllbGRzKCk7CisKKyAgLy8gQ29tcHV0ZXMgKGFuIGVzdGltYXRlIG9mKSB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGN1cnJlbnRseSB1c2VkIGZvcgorICAvLyBzdG9yaW5nIHRoZSBtZXNzYWdlIGluIG1lbW9yeS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIHRoZQorICAvLyBSZWZsZWN0aW9uIG9iamVjdCdzIFNwYWNlVXNlZCgpIG1ldGhvZC4KKyAgLy8KKyAgLy8gU3BhY2VVc2VkKCkgaXMgbm90aWNlYWJseSBzbG93ZXIgdGhhbiBCeXRlU2l6ZSgpLCBhcyBpdCBpcyBpbXBsZW1lbnRlZAorICAvLyB1c2luZyByZWZsZWN0aW9uIChyYXRoZXIgdGhhbiB0aGUgZ2VuZXJhdGVkIGNvZGUgaW1wbGVtZW50YXRpb24gZm9yCisgIC8vIEJ5dGVTaXplKCkpLiBMaWtlIEJ5dGVTaXplKCksIGl0cyBDUFUgdGltZSBpcyBsaW5lYXIgaW4gdGhlIG51bWJlciBvZgorICAvLyBmaWVsZHMgZGVmaW5lZCBmb3IgdGhlIHByb3RvLgorICB2aXJ0dWFsIHNpemVfdCBTcGFjZVVzZWRMb25nKCkgY29uc3Q7CisKKyAgUFJPVE9CVUZfREVQUkVDQVRFRF9NU0coIlBsZWFzZSB1c2UgU3BhY2VVc2VkTG9uZygpIGluc3RlYWQiKQorICBpbnQgU3BhY2VVc2VkKCkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OlRvSW50U2l6ZShTcGFjZVVzZWRMb25nKCkpOyB9CisKKyAgLy8gRGVidWdnaW5nICYgVGVzdGluZy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBHZW5lcmF0ZXMgYSBodW1hbi1yZWFkYWJsZSBmb3JtIG9mIHRoaXMgbWVzc2FnZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAvLyBOb3RlIHRoYXQgdGhlIGZvcm1hdCBhbmQgY29udGVudCBvZiBhIGRlYnVnIHN0cmluZyBpcyBub3QgZ3VhcmFudGVlZCwgbWF5CisgIC8vIGNoYW5nZSB3aXRob3V0IG5vdGljZSwgYW5kIHNob3VsZCBub3QgYmUgZGVwZW5kZWQgb24uIENvZGUgdGhhdCBkb2VzCisgIC8vIGFueXRoaW5nIGV4Y2VwdCBkaXNwbGF5IGEgc3RyaW5nIHRvIGFzc2lzdCBpbiBkZWJ1Z2dpbmcgc2hvdWxkIHVzZQorICAvLyBUZXh0Rm9ybWF0IGluc3RlYWQuCisgIHN0ZDo6c3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CisgIC8vIExpa2UgRGVidWdTdHJpbmcoKSwgYnV0IHdpdGggbGVzcyB3aGl0ZXNwYWNlLgorICBzdGQ6OnN0cmluZyBTaG9ydERlYnVnU3RyaW5nKCkgY29uc3Q7CisgIC8vIExpa2UgRGVidWdTdHJpbmcoKSwgYnV0IGRvIG5vdCBlc2NhcGUgVVRGLTggYnl0ZSBzZXF1ZW5jZXMuCisgIHN0ZDo6c3RyaW5nIFV0ZjhEZWJ1Z1N0cmluZygpIGNvbnN0OworICAvLyBDb252ZW5pZW5jZSBmdW5jdGlvbiB1c2VmdWwgaW4gR0RCLiAgUHJpbnRzIERlYnVnU3RyaW5nKCkgdG8gc3Rkb3V0LgorICB2b2lkIFByaW50RGVidWdTdHJpbmcoKSBjb25zdDsKKworICAvLyBSZWZsZWN0aW9uLWJhc2VkIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGVzZSBtZXRob2RzIGFyZSBwdXJlLXZpcnR1YWwgaW4gTWVzc2FnZUxpdGUsIGJ1dCBNZXNzYWdlIHByb3ZpZGVzCisgIC8vIHJlZmxlY3Rpb24tYmFzZWQgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMuCisKKyAgc3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBDbGVhcigpIG92ZXJyaWRlOworCisgIC8vIFJldHVybnMgd2hldGhlciBhbGwgcmVxdWlyZWQgZmllbGRzIGhhdmUgYmVlbiBzZXQuIE5vdGUgdGhhdCByZXF1aXJlZAorICAvLyBmaWVsZHMgbm8gbG9uZ2VyIGV4aXN0IHN0YXJ0aW5nIGluIHByb3RvMy4KKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBDaGVja1R5cGVBbmRNZXJnZUZyb20oY29uc3QgTWVzc2FnZUxpdGUmIG90aGVyKSBvdmVycmlkZTsKKyAgLy8gUmVmbGVjdGl2ZSBwYXJzZXIKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIG92ZXJyaWRlOworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSh1aW50OF90KiB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIC8vIFRoaXMgaXMgY2FsbGVkIG9ubHkgYnkgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQnl0ZVNpemUoKSwgdG8KKyAgLy8gdXBkYXRlIHRoZSBjYWNoZWQgc2l6ZS4gIElmIHlvdSBvdmVycmlkZSBCeXRlU2l6ZSgpLCB5b3UgZG8gbm90IG5lZWQKKyAgLy8gdG8gb3ZlcnJpZGUgdGhpcy4gIElmIHlvdSBkbyBub3Qgb3ZlcnJpZGUgQnl0ZVNpemUoKSwgeW91IE1VU1Qgb3ZlcnJpZGUKKyAgLy8gdGhpczsgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2lsbCBjcmFzaC4KKyAgLy8KKyAgLy8gVGhlIG1ldGhvZCBpcyBwcml2YXRlIGJlY2F1c2Ugc3ViY2xhc3NlcyBzaG91bGQgbmV2ZXIgY2FsbCBpdDsgb25seQorICAvLyBvdmVycmlkZSBpdC4gIFllcywgQysrIGxldHMgeW91IGRvIHRoYXQuICBDcmF6eSwgaHVoPworICB2aXJ0dWFsIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisKKyBwdWJsaWM6CisgIC8vIEludHJvc3BlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAvLyBHZXQgYSBub24tb3duaW5nIHBvaW50ZXIgdG8gYSBEZXNjcmlwdG9yIGZvciB0aGlzIG1lc3NhZ2UncyB0eXBlLiAgVGhpcworICAvLyBkZXNjcmliZXMgd2hhdCBmaWVsZHMgdGhlIG1lc3NhZ2UgY29udGFpbnMsIHRoZSB0eXBlcyBvZiB0aG9zZSBmaWVsZHMsIGV0Yy4KKyAgLy8gVGhpcyBvYmplY3QgcmVtYWlucyBwcm9wZXJ0eSBvZiB0aGUgTWVzc2FnZS4KKyAgY29uc3QgRGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIGNvbnN0IHsgcmV0dXJuIEdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsgfQorCisgIC8vIEdldCBhIG5vbi1vd25pbmcgcG9pbnRlciB0byB0aGUgUmVmbGVjdGlvbiBpbnRlcmZhY2UgZm9yIHRoaXMgTWVzc2FnZSwKKyAgLy8gd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVhZCBhbmQgbW9kaWZ5IHRoZSBmaWVsZHMgb2YgdGhlIE1lc3NhZ2UgZHluYW1pY2FsbHkKKyAgLy8gKGluIG90aGVyIHdvcmRzLCB3aXRob3V0IGtub3dpbmcgdGhlIG1lc3NhZ2UgdHlwZSBhdCBjb21waWxlIHRpbWUpLiAgVGhpcworICAvLyBvYmplY3QgcmVtYWlucyBwcm9wZXJ0eSBvZiB0aGUgTWVzc2FnZS4KKyAgY29uc3QgUmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIGNvbnN0IHsgcmV0dXJuIEdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsgfQorCisgcHJvdGVjdGVkOgorICAvLyBHZXQgYSBzdHJ1Y3QgY29udGFpbmluZyB0aGUgbWV0YWRhdGEgZm9yIHRoZSBNZXNzYWdlLCB3aGljaCBpcyB1c2VkIGluIHR1cm4KKyAgLy8gdG8gaW1wbGVtZW50IEdldERlc2NyaXB0b3IoKSBhbmQgR2V0UmVmbGVjdGlvbigpIGFib3ZlLgorICB2aXJ0dWFsIE1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgPSAwOworCisgIHN0cnVjdCBDbGFzc0RhdGEgeworICAgIC8vIE5vdGU6IFRoZSBvcmRlciBvZiBhcmd1bWVudHMgKHRvLCB0aGVuIGZyb20pIGlzIGNob3NlbiBzbyB0aGF0IHRoZSBBQkkKKyAgICAvLyBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBDb3B5RnJvbSBtZXRob2QuICBUaGF0IGlzLCB0aGUKKyAgICAvLyBoaWRkZW4gInRoaXMiIHBhcmFtZXRlciBjb21lcyBmaXJzdC4KKyAgICB2b2lkICgqY29weV90b19mcm9tKShNZXNzYWdlJiB0bywgY29uc3QgTWVzc2FnZSYgZnJvbV9tc2cpOworICAgIHZvaWQgKCptZXJnZV90b19mcm9tKShNZXNzYWdlJiB0bywgY29uc3QgTWVzc2FnZSYgZnJvbV9tc2cpOworICB9OworICAvLyBHZXRDbGFzc0RhdGEoKSByZXR1cm5zIGEgcG9pbnRlciB0byBhIENsYXNzRGF0YSBzdHJ1Y3Qgd2hpY2gKKyAgLy8gZXhpc3RzIGluIGdsb2JhbCBtZW1vcnkgYW5kIGlzIHVuaXF1ZSB0byBlYWNoIHN1YmNsYXNzLiAgVGhpcyB1bmlxdWVuZXNzCisgIC8vIHByb3BlcnR5IGlzIHVzZWQgaW4gb3JkZXIgdG8gcXVpY2tseSBkZXRlcm1pbmUgd2hldGhlciB0d28gbWVzc2FnZXMgYXJlCisgIC8vIG9mIHRoZSBzYW1lIHR5cGUuCisgIC8vIFRPRE8oam9yZyk6IGNoYW5nZSB0byBwdXJlIHZpcnR1YWwKKyAgdmlydHVhbCBjb25zdCBDbGFzc0RhdGEqIEdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KKworICAvLyBDb3B5V2l0aFNvdXJjZUNoZWNrIGNhbGxzIENsZWFyKCkgYW5kIHRoZW4gTWVyZ2VGcm9tKCksIGFuZCBpbiBkZWJ1ZworICAvLyBidWlsZHMsIGNoZWNrcyB0aGF0IGNhbGxpbmcgQ2xlYXIoKSBvbiB0aGUgZGVzdGluYXRpb24gbWVzc2FnZSBkb2Vzbid0CisgIC8vIGFsdGVyIHRoZSBzb3VyY2UuICBJdCBhc3N1bWVzIHRoZSBtZXNzYWdlcyBhcmUga25vd24gdG8gYmUgb2YgdGhlIHNhbWUKKyAgLy8gdHlwZSwgYW5kIHRodXMgdXNlcyBHZXRDbGFzc0RhdGEoKS4KKyAgc3RhdGljIHZvaWQgQ29weVdpdGhTb3VyY2VDaGVjayhNZXNzYWdlJiB0bywgY29uc3QgTWVzc2FnZSYgZnJvbSk7CisKKyAgLy8gRmFpbCBpZiAiZnJvbSIgaXMgYSBkZXNjZW5kYW50IG9mICJ0byIgYXMgc3VjaCBjb3B5IGlzIG5vdCBhbGxvd2VkLgorICBzdGF0aWMgdm9pZCBGYWlsSWZDb3B5RnJvbURlc2NlbmRhbnQoTWVzc2FnZSYgdG8sIGNvbnN0IE1lc3NhZ2UmIGZyb20pOworCisgIGlubGluZSBleHBsaWNpdCBNZXNzYWdlKEFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpCisgICAgICA6IE1lc3NhZ2VMaXRlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7fQorICBzaXplX3QgQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHNpemVfdCB0b3RhbF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpDYWNoZWRTaXplKiBjYWNoZWRfc2l6ZSkgY29uc3Q7CisgIHNpemVfdCBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZShzaXplX3QgdG90YWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpDYWNoZWRTaXplKiBjYWNoZWRfc2l6ZSkgY29uc3Q7CisKKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHVpbnQ2NF90IEdldEludmFyaWFudFBlckJ1aWxkKHVpbnQ2NF90IHNhbHQpOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2UpOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKy8vIEZvcndhcmQtZGVjbGFyZSBpbnRlcmZhY2VzIHVzZWQgdG8gaW1wbGVtZW50IFJlcGVhdGVkRmllbGRSZWYuCisvLyBUaGVzZSBhcmUgcHJvdG9idWYgaW50ZXJuYWxzIHRoYXQgdXNlcnMgc2hvdWxkbid0IGNhcmUgYWJvdXQuCitjbGFzcyBSZXBlYXRlZEZpZWxkQWNjZXNzb3I7Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gRm9yd2FyZC1kZWNsYXJlIFJlcGVhdGVkRmllbGRSZWYgdGVtcGxhdGVzLiBUaGUgc2Vjb25kIHR5cGUgcGFyYW1ldGVyIGlzCisvLyB1c2VkIGZvciBTRklOQUUgdHJpY2tzLiBVc2VycyBzaG91bGQgaWdub3JlIGl0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEVuYWJsZSA9IHZvaWQ+CitjbGFzcyBSZXBlYXRlZEZpZWxkUmVmOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRW5hYmxlID0gdm9pZD4KK2NsYXNzIE11dGFibGVSZXBlYXRlZEZpZWxkUmVmOworCisvLyBUaGlzIGludGVyZmFjZSBjb250YWlucyBtZXRob2RzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZHluYW1pY2FsbHkgYWNjZXNzCisvLyBhbmQgbW9kaWZ5IHRoZSBmaWVsZHMgb2YgYSBwcm90b2NvbCBtZXNzYWdlLiAgVGhlaXIgc2VtYW50aWNzIGFyZQorLy8gc2ltaWxhciB0byB0aGUgYWNjZXNzb3JzIHRoZSBwcm90b2NvbCBjb21waWxlciBnZW5lcmF0ZXMuCisvLworLy8gVG8gZ2V0IHRoZSBSZWZsZWN0aW9uIGZvciBhIGdpdmVuIE1lc3NhZ2UsIGNhbGwgTWVzc2FnZTo6R2V0UmVmbGVjdGlvbigpLgorLy8KKy8vIFRoaXMgaW50ZXJmYWNlIGlzIHNlcGFyYXRlIGZyb20gTWVzc2FnZSBvbmx5IGZvciBlZmZpY2llbmN5IHJlYXNvbnM7CisvLyB0aGUgdmFzdCBtYWpvcml0eSBvZiBpbXBsZW1lbnRhdGlvbnMgb2YgTWVzc2FnZSB3aWxsIHNoYXJlIHRoZSBzYW1lCisvLyBpbXBsZW1lbnRhdGlvbiBvZiBSZWZsZWN0aW9uIChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbiwKKy8vIGRlZmluZWQgaW4gZ2VuZXJhdGVkX21lc3NhZ2UuaCksIGFuZCBhbGwgTWVzc2FnZXMgb2YgYSBwYXJ0aWN1bGFyIGNsYXNzCisvLyBzaG91bGQgc2hhcmUgdGhlIHNhbWUgUmVmbGVjdGlvbiBvYmplY3QgKHRob3VnaCB5b3Ugc2hvdWxkIG5vdCByZWx5IG9uCisvLyB0aGUgbGF0dGVyIGZhY3QpLgorLy8KKy8vIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdGhhdCB0aGVzZSBtZXRob2RzIGNhbiBiZSB1c2VkIGluY29ycmVjdGx5LiAgRm9yCisvLyBleGFtcGxlLCBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHdpbGwgbGVhZCB0byB1bmRlZmluZWQKKy8vIHJlc3VsdHMgKHByb2JhYmx5IGFzc2VydGlvbiBmYWlsdXJlcyk6CisvLyAtIFRoZSBGaWVsZERlc2NyaXB0b3IgaXMgbm90IGEgZmllbGQgb2YgdGhpcyBtZXNzYWdlIHR5cGUuCisvLyAtIFRoZSBtZXRob2QgY2FsbGVkIGlzIG5vdCBhcHByb3ByaWF0ZSBmb3IgdGhlIGZpZWxkJ3MgdHlwZS4gIEZvcgorLy8gICBlYWNoIGZpZWxkIHR5cGUgaW4gRmllbGREZXNjcmlwdG9yOjpUWVBFXyosIHRoZXJlIGlzIG9ubHkgb25lCisvLyAgIEdldCooKSBtZXRob2QsIG9uZSBTZXQqKCkgbWV0aG9kLCBhbmQgb25lIEFkZCooKSBtZXRob2QgdGhhdCBpcworLy8gICB2YWxpZCBmb3IgdGhhdCB0eXBlLiAgSXQgc2hvdWxkIGJlIG9idmlvdXMgd2hpY2ggKGV4Y2VwdCBtYXliZQorLy8gICBmb3IgVFlQRV9CWVRFUywgd2hpY2ggYXJlIHJlcHJlc2VudGVkIHVzaW5nIHN0cmluZ3MgaW4gQysrKS4KKy8vIC0gQSBHZXQqKCkgb3IgU2V0KigpIG1ldGhvZCBmb3Igc2luZ3VsYXIgZmllbGRzIGlzIGNhbGxlZCBvbiBhIHJlcGVhdGVkCisvLyAgIGZpZWxkLgorLy8gLSBHZXRSZXBlYXRlZCooKSwgU2V0UmVwZWF0ZWQqKCksIG9yIEFkZCooKSBpcyBjYWxsZWQgb24gYSBub24tcmVwZWF0ZWQKKy8vICAgZmllbGQuCisvLyAtIFRoZSBNZXNzYWdlIG9iamVjdCBwYXNzZWQgdG8gYW55IG1ldGhvZCBpcyBub3Qgb2YgdGhlIHJpZ2h0IHR5cGUgZm9yCisvLyAgIHRoaXMgUmVmbGVjdGlvbiBvYmplY3QgKGkuZS4gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCkgIT0gcmVmbGVjdGlvbikuCisvLworLy8gWW91IG1pZ2h0IHdvbmRlciB3aHkgdGhlcmUgaXMgbm90IGFueSBhYnN0cmFjdCByZXByZXNlbnRhdGlvbiBmb3IgYSBmaWVsZAorLy8gb2YgYXJiaXRyYXJ5IHR5cGUuICBFLmcuLCB3aHkgaXNuJ3QgdGhlcmUganVzdCBhICJHZXRGaWVsZCgpIiBtZXRob2QgdGhhdAorLy8gcmV0dXJucyAiY29uc3QgRmllbGQmIiwgd2hlcmUgIkZpZWxkIiBpcyBzb21lIGNsYXNzIHdpdGggYWNjZXNzb3JzIGxpa2UKKy8vICJHZXRJbnQzMlZhbHVlKCkiLiAgVGhlIHByb2JsZW0gaXMgdGhhdCBzb21lb25lIHdvdWxkIGhhdmUgdG8gZGVhbCB3aXRoCisvLyBhbGxvY2F0aW5nIHRoZXNlIEZpZWxkIG9iamVjdHMuICBGb3IgZ2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3NlcywgaGF2aW5nIHRvCisvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgYW4gYWRkaXRpb25hbCBvYmplY3QgdG8gd3JhcCBldmVyeSBmaWVsZCB3b3VsZCBhdCBsZWFzdAorLy8gZG91YmxlIHRoZSBtZXNzYWdlJ3MgbWVtb3J5IGZvb3RwcmludCwgcHJvYmFibHkgd29yc2UuICBBbGxvY2F0aW5nIHRoZQorLy8gb2JqZWN0cyBvbi1kZW1hbmQsIG9uIHRoZSBvdGhlciBoYW5kLCB3b3VsZCBiZSBleHBlbnNpdmUgYW5kIHByb25lIHRvCisvLyBtZW1vcnkgbGVha3MuICBTbywgaW5zdGVhZCB3ZSBlbmRlZCB1cCB3aXRoIHRoaXMgZmxhdCBpbnRlcmZhY2UuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgUmVmbGVjdGlvbiBmaW5hbCB7CisgcHVibGljOgorICAvLyBHZXQgdGhlIFVua25vd25GaWVsZFNldCBmb3IgdGhlIG1lc3NhZ2UuICBUaGlzIGNvbnRhaW5zIGZpZWxkcyB3aGljaAorICAvLyB3ZXJlIHNlZW4gd2hlbiB0aGUgTWVzc2FnZSB3YXMgcGFyc2VkIGJ1dCB3ZXJlIG5vdCByZWNvZ25pemVkIGFjY29yZGluZworICAvLyB0byB0aGUgTWVzc2FnZSdzIGRlZmluaXRpb24uCisgIGNvbnN0IFVua25vd25GaWVsZFNldCYgR2V0VW5rbm93bkZpZWxkcyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdDsKKyAgLy8gR2V0IGEgbXV0YWJsZSBwb2ludGVyIHRvIHRoZSBVbmtub3duRmllbGRTZXQgZm9yIHRoZSBtZXNzYWdlLiAgVGhpcworICAvLyBjb250YWlucyBmaWVsZHMgd2hpY2ggd2VyZSBzZWVuIHdoZW4gdGhlIE1lc3NhZ2Ugd2FzIHBhcnNlZCBidXQgd2VyZSBub3QKKyAgLy8gcmVjb2duaXplZCBhY2NvcmRpbmcgdG8gdGhlIE1lc3NhZ2UncyBkZWZpbml0aW9uLgorICBVbmtub3duRmllbGRTZXQqIE11dGFibGVVbmtub3duRmllbGRzKE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0OworCisgIC8vIEVzdGltYXRlIHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIG1lc3NhZ2Ugb2JqZWN0LgorICBzaXplX3QgU3BhY2VVc2VkTG9uZyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdDsKKworICBQUk9UT0JVRl9ERVBSRUNBVEVEX01TRygiUGxlYXNlIHVzZSBTcGFjZVVzZWRMb25nKCkgaW5zdGVhZCIpCisgIGludCBTcGFjZVVzZWQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6VG9JbnRTaXplKFNwYWNlVXNlZExvbmcobWVzc2FnZSkpOworICB9CisKKyAgLy8gQ2hlY2sgaWYgdGhlIGdpdmVuIG5vbi1yZXBlYXRlZCBmaWVsZCBpcyBzZXQuCisgIGJvb2wgSGFzRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgYSByZXBlYXRlZCBmaWVsZC4KKyAgaW50IEZpZWxkU2l6ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworICAvLyBDbGVhciB0aGUgdmFsdWUgb2YgYSBmaWVsZCwgc28gdGhhdCBIYXNGaWVsZCgpIHJldHVybnMgZmFsc2Ugb3IKKyAgLy8gRmllbGRTaXplKCkgcmV0dXJucyB6ZXJvLgorICB2b2lkIENsZWFyRmllbGQoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgLy8gQ2hlY2sgaWYgdGhlIG9uZW9mIGlzIHNldC4gUmV0dXJucyB0cnVlIGlmIGFueSBmaWVsZCBpbiBvbmVvZgorICAvLyBpcyBzZXQsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBIYXNPbmVvZihjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvcikgY29uc3Q7CisKKyAgdm9pZCBDbGVhck9uZW9mKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIGZpZWxkIGRlc2NyaXB0b3IgaWYgdGhlIG9uZW9mIGlzIHNldC4gbnVsbHB0ciBvdGhlcndpc2UuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogR2V0T25lb2ZGaWVsZERlc2NyaXB0b3IoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0OworCisgIC8vIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkLgorICAvLyBXZSBkb24ndCBwcm92aWRlIGEgd2F5IHRvIHJlbW92ZSBhbnkgZWxlbWVudCBvdGhlciB0aGFuIHRoZSBsYXN0CisgIC8vIGJlY2F1c2UgaXQgaW52aXRlcyBpbmVmZmljaWVudCB1c2UsIHN1Y2ggYXMgTyhuXjIpIGZpbHRlcmluZyBsb29wcworICAvLyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gTyhuKS4gIElmIHlvdSB3YW50IHRvIHJlbW92ZSBhbiBlbGVtZW50IG90aGVyCisgIC8vIHRoYW4gdGhlIGxhc3QsIHRoZSBiZXN0IHdheSB0byBkbyBpdCBpcyB0byByZS1hcnJhbmdlIHRoZSBlbGVtZW50cworICAvLyAodXNpbmcgU3dhcCgpKSBzbyB0aGF0IHRoZSBvbmUgeW91IHdhbnQgcmVtb3ZlZCBpcyBhdCB0aGUgZW5kLCB0aGVuCisgIC8vIGNhbGwgUmVtb3ZlTGFzdCgpLgorICB2b2lkIFJlbW92ZUxhc3QoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIC8vIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBvZiBhIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGQsIGFuZCByZXR1cm5zIHRoZQorICAvLyBwb2ludGVyIHRvIHRoZSBjYWxsZXIuICBDYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCBwb2ludGVyLgorICBQUk9UT0JVRl9OT0RJU0NBUkQgTWVzc2FnZSogUmVsZWFzZUxhc3QoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIC8vIFNpbWlsYXIgdG8gUmVsZWFzZUxhc3QoKSB3aXRob3V0IGludGVybmFsIHNhZmV0eSBhbmQgb3duZXJzaHAgY2hlY2tzLiBUaGlzCisgIC8vIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gdGhlIG9iamVjdHMgYXJlIG9uIHRoZSBzYW1lIGFyZW5hIG9yIHBhaXJlZAorICAvLyB3aXRoIGEgY2FsbCB0byBgVW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWRNZXNzYWdlYC4KKyAgTWVzc2FnZSogVW5zYWZlQXJlbmFSZWxlYXNlTGFzdChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIC8vIFN3YXAgdGhlIGNvbXBsZXRlIGNvbnRlbnRzIG9mIHR3byBtZXNzYWdlcy4KKyAgdm9pZCBTd2FwKE1lc3NhZ2UqIG1lc3NhZ2UxLCBNZXNzYWdlKiBtZXNzYWdlMikgY29uc3Q7CisKKyAgLy8gU3dhcCBmaWVsZHMgbGlzdGVkIGluIGZpZWxkcyB2ZWN0b3Igb2YgdHdvIG1lc3NhZ2VzLgorICB2b2lkIFN3YXBGaWVsZHMoTWVzc2FnZSogbWVzc2FnZTEsIE1lc3NhZ2UqIG1lc3NhZ2UyLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGZpZWxkcykgY29uc3Q7CisKKyAgLy8gU3dhcCB0d28gZWxlbWVudHMgb2YgYSByZXBlYXRlZCBmaWVsZC4KKyAgdm9pZCBTd2FwRWxlbWVudHMoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4MSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MikgY29uc3Q7CisKKyAgLy8gU3dhcCB3aXRob3V0IGludGVybmFsIHNhZmV0eSBhbmQgb3duZXJzaGlwIGNoZWNrcy4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkKKyAgLy8gYmUgdXNlZCB3aGVuIHRoZSBvYmplY3RzIGFyZSBvbiB0aGUgc2FtZSBhcmVuYS4KKyAgdm9pZCBVbnNhZmVBcmVuYVN3YXAoTWVzc2FnZSogbGhzLCBNZXNzYWdlKiByaHMpIGNvbnN0OworCisgIC8vIFN3YXBGaWVsZHMgd2l0aG91dCBpbnRlcm5hbCBzYWZldHkgYW5kIG93bmVyc2hpcCBjaGVja3MuIFRoaXMgbWV0aG9kIHNob3VsZAorICAvLyBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgb2JqZWN0cyBhcmUgb24gdGhlIHNhbWUgYXJlbmEuCisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwRmllbGRzKAorICAgICAgTWVzc2FnZSogbGhzLCBNZXNzYWdlKiByaHMsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgZmllbGRzKSBjb25zdDsKKworICAvLyBMaXN0IGFsbCBmaWVsZHMgb2YgdGhlIG1lc3NhZ2Ugd2hpY2ggYXJlIGN1cnJlbnRseSBzZXQsIGV4Y2VwdCBmb3IgdW5rbm93bgorICAvLyBmaWVsZHMsIGJ1dCBpbmNsdWRpbmcgZXh0ZW5zaW9uIGtub3duIHRvIHRoZSBwYXJzZXIgKGkuZS4gY29tcGlsZWQgaW4pLgorICAvLyBTaW5ndWxhciBmaWVsZHMgd2lsbCBvbmx5IGJlIGxpc3RlZCBpZiBIYXNGaWVsZChmaWVsZCkgd291bGQgcmV0dXJuIHRydWUKKyAgLy8gYW5kIHJlcGVhdGVkIGZpZWxkcyB3aWxsIG9ubHkgYmUgbGlzdGVkIGlmIEZpZWxkU2l6ZShmaWVsZCkgd291bGQgcmV0dXJuCisgIC8vIG5vbi16ZXJvLiAgRmllbGRzIChib3RoIG5vcm1hbCBmaWVsZHMgYW5kIGV4dGVuc2lvbiBmaWVsZHMpIHdpbGwgYmUgbGlzdGVkCisgIC8vIG9yZGVyZWQgYnkgZmllbGQgbnVtYmVyLgorICAvLyBVc2UgUmVmbGVjdGlvbjo6R2V0VW5rbm93bkZpZWxkcygpIG9yIG1lc3NhZ2UudW5rbm93bl9maWVsZHMoKSB0byBhbHNvIGdldAorICAvLyBhY2Nlc3MgdG8gZmllbGRzL2V4dGVuc2lvbnMgdW5rbm93biB0byB0aGUgcGFyc2VyLgorICB2b2lkIExpc3RGaWVsZHMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXRwdXQpIGNvbnN0OworCisgIC8vIFNpbmd1bGFyIGZpZWxkIGdldHRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRoZXNlIGdldCB0aGUgdmFsdWUgb2YgYSBub24tcmVwZWF0ZWQgZmllbGQuICBUaGV5IHJldHVybiB0aGUgZGVmYXVsdAorICAvLyB2YWx1ZSBmb3IgZmllbGRzIHRoYXQgYXJlbid0IHNldC4KKworICBpbnQzMl90IEdldEludDMyKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICBpbnQ2NF90IEdldEludDY0KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICB1aW50MzJfdCBHZXRVSW50MzIoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICB1aW50NjRfdCBHZXRVSW50NjQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICBmbG9hdCBHZXRGbG9hdChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgZG91YmxlIEdldERvdWJsZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgYm9vbCBHZXRCb29sKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICBzdGQ6OnN0cmluZyBHZXRTdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBHZXRFbnVtKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgLy8gR2V0RW51bVZhbHVlKCkgcmV0dXJucyBhbiBlbnVtIGZpZWxkJ3MgdmFsdWUgYXMgYW4gaW50ZWdlciByYXRoZXIgdGhhbgorICAvLyBhbiBFbnVtVmFsdWVEZXNjcmlwdG9yKi4gSWYgdGhlIGludGVnZXIgdmFsdWUgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhCisgIC8vIGtub3duIHZhbHVlIGRlc2NyaXB0b3IsIGEgbmV3IHZhbHVlIGRlc2NyaXB0b3IgaXMgY3JlYXRlZC4gKFN1Y2ggYSB2YWx1ZQorICAvLyB3aWxsIG9ubHkgYmUgcHJlc2VudCB3aGVuIHRoZSBuZXcgdW5rbm93bi1lbnVtLXZhbHVlIHNlbWFudGljcyBhcmUgZW5hYmxlZAorICAvLyBmb3IgYSBtZXNzYWdlLikKKyAgaW50IEdldEVudW1WYWx1ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworICAvLyBTZWUgTXV0YWJsZU1lc3NhZ2UoKSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlICJmYWN0b3J5IiBwYXJhbWV0ZXIuCisgIGNvbnN0IE1lc3NhZ2UmIEdldE1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8gR2V0IGEgc3RyaW5nIHZhbHVlIHdpdGhvdXQgY29weWluZywgaWYgcG9zc2libGUuCisgIC8vCisgIC8vIEdldFN0cmluZygpIG5lY2Vzc2FyaWx5IHJldHVybnMgYSBjb3B5IG9mIHRoZSBzdHJpbmcuICBUaGlzIGNhbiBiZQorICAvLyBpbmVmZmljaWVudCB3aGVuIHRoZSBzdGQ6OnN0cmluZyBpcyBhbHJlYWR5IHN0b3JlZCBpbiBhIHN0ZDo6c3RyaW5nIG9iamVjdAorICAvLyBpbiB0aGUgdW5kZXJseWluZyBtZXNzYWdlLiAgR2V0U3RyaW5nUmVmZXJlbmNlKCkgd2lsbCByZXR1cm4gYSByZWZlcmVuY2UgdG8KKyAgLy8gdGhlIHVuZGVybHlpbmcgc3RkOjpzdHJpbmcgaW4gdGhpcyBjYXNlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGNvcHkgdGhlCisgIC8vIHN0cmluZyBpbnRvICpzY3JhdGNoIGFuZCByZXR1cm4gdGhhdC4KKyAgLy8KKyAgLy8gTm90ZTogIEl0IGlzIHBlcmZlY3RseSByZWFzb25hYmxlIGFuZCB1c2VmdWwgdG8gd3JpdGUgY29kZSBsaWtlOgorICAvLyAgICAgc3RyID0gcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIGZpZWxkLCAmc3RyKTsKKyAgLy8gICBUaGlzIGxpbmUgd291bGQgZW5zdXJlIHRoYXQgb25seSBvbmUgY29weSBvZiB0aGUgc3RyaW5nIGlzIG1hZGUKKyAgLy8gICByZWdhcmRsZXNzIG9mIHRoZSBmaWVsZCdzIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24uICBXaGVuIGluaXRpYWxpemluZworICAvLyAgIGEgbmV3bHktY29uc3RydWN0ZWQgc3RyaW5nLCB0aG91Z2gsIGl0J3MganVzdCBhcyBmYXN0IGFuZCBtb3JlCisgIC8vICAgcmVhZGFibGUgdG8gdXNlIGNvZGUgbGlrZToKKyAgLy8gICAgIHN0ZDo6c3RyaW5nIHN0ciA9IHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBmaWVsZCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRTdHJpbmdSZWZlcmVuY2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBzY3JhdGNoKSBjb25zdDsKKworCisgIC8vIFNpbmd1bGFyIGZpZWxkIG11dGF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRoZXNlIG11dGF0ZSB0aGUgdmFsdWUgb2YgYSBub24tcmVwZWF0ZWQgZmllbGQuCisKKyAgdm9pZCBTZXRJbnQzMihNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldEludDY0KE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0VUludDMyKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKSBjb25zdDsKKyAgdm9pZCBTZXRVSW50NjQoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldEZsb2F0KE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgZmxvYXQgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldERvdWJsZShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldEJvb2woTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgIGJvb2wgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldFN0cmluZyhNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0RW51bShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0OworICAvLyBTZXQgYW4gZW51bSBmaWVsZCdzIHZhbHVlIHdpdGggYW4gaW50ZWdlciByYXRoZXIgdGhhbiBFbnVtVmFsdWVEZXNjcmlwdG9yLgorICAvLyBGb3IgcHJvdG8zIHRoaXMgaXMganVzdCBzZXR0aW5nIHRoZSBlbnVtIGZpZWxkIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQsIGZvcgorICAvLyBwcm90bzIgaXQncyBtb3JlIGNvbXBsaWNhdGVkLiBJZiB2YWx1ZSBpcyBhIGtub3duIGVudW0gdmFsdWUgdGhlIGZpZWxkIGlzCisgIC8vIHNldCBhcyB1c3VhbC4gSWYgdGhlIHZhbHVlIGlzIHVua25vd24gdGhlbiBpdCBpcyBhZGRlZCB0byB0aGUgdW5rbm93biBmaWVsZAorICAvLyBzZXQuIE5vdGUgdGhpcyBtYXRjaGVzIHRoZSBiZWhhdmlvciBvZiBwYXJzaW5nIHVua25vd24gZW51bSB2YWx1ZXMuCisgIC8vIElmIG11bHRpcGxlIGNhbGxzIHdpdGggdW5rbm93biB2YWx1ZXMgaGFwcGVuIHRoYW4gdGhleSBhcmUgYWxsIGFkZGVkIHRvIHRoZQorICAvLyB1bmtub3duIGZpZWxkIHNldCBpbiBvcmRlciBvZiB0aGUgY2FsbHMuCisgIHZvaWQgU2V0RW51bVZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgY29uc3Q7CisKKyAgLy8gR2V0IGEgbXV0YWJsZSBwb2ludGVyIHRvIGEgZmllbGQgd2l0aCBhIG1lc3NhZ2UgdHlwZS4gIElmIGEgTWVzc2FnZUZhY3RvcnkKKyAgLy8gaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBjb25zdHJ1Y3QgaW5zdGFuY2VzIG9mIHRoZSBzdWItbWVzc2FnZTsKKyAgLy8gb3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBmYWN0b3J5IGlzIHVzZWQuICBJZiB0aGUgZmllbGQgaXMgYW4gZXh0ZW5zaW9uIHRoYXQKKyAgLy8gZG9lcyBub3QgbGl2ZSBpbiB0aGUgc2FtZSBwb29sIGFzIHRoZSBjb250YWluaW5nIG1lc3NhZ2UncyBkZXNjcmlwdG9yIChlLmcuCisgIC8vIGl0IGxpdmVzIGluIGFuIG92ZXJsYXkgcG9vbCksIHRoZW4gYSBNZXNzYWdlRmFjdG9yeSBtdXN0IGJlIHByb3ZpZGVkLgorICAvLyBJZiB5b3UgaGF2ZSBubyBpZGVhIHdoYXQgdGhhdCBtZWFudCwgdGhlbiB5b3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byB3b3JyeQorICAvLyBhYm91dCBpdCAoZG9uJ3QgcHJvdmlkZSBhIE1lc3NhZ2VGYWN0b3J5KS4gIFdBUk5JTkc6ICBJZiB0aGUKKyAgLy8gRmllbGREZXNjcmlwdG9yIGlzIGZvciBhIGNvbXBpbGVkLWluIGV4dGVuc2lvbiwgdGhlbgorICAvLyBmYWN0b3J5LT5HZXRQcm90b3R5cGUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSBNVVNUIHJldHVybiBhbiBpbnN0YW5jZSBvZgorICAvLyB0aGUgY29tcGlsZWQtaW4gY2xhc3MgZm9yIHRoaXMgdHlwZSwgTk9UIER5bmFtaWNNZXNzYWdlLgorICBNZXNzYWdlKiBNdXRhYmxlTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vIFJlcGxhY2VzIHRoZSBtZXNzYWdlIHNwZWNpZmllZCBieSAnZmllbGQnIHdpdGggdGhlIGFscmVhZHktYWxsb2NhdGVkIG9iamVjdAorICAvLyBzdWJfbWVzc2FnZSwgcGFzc2luZyBvd25lcnNoaXAgdG8gdGhlIG1lc3NhZ2UuICBJZiB0aGUgZmllbGQgY29udGFpbmVkIGEKKyAgLy8gbWVzc2FnZSwgdGhhdCBtZXNzYWdlIGlzIGRlbGV0ZWQuICBJZiBzdWJfbWVzc2FnZSBpcyBudWxscHRyLCB0aGUgZmllbGQgaXMKKyAgLy8gY2xlYXJlZC4KKyAgdm9pZCBTZXRBbGxvY2F0ZWRNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgLy8gU2ltaWxhciB0byBgU2V0QWxsb2NhdGVkTWVzc2FnZWAsIGJ1dCBvbWl0cyBhbGwgaW50ZXJuYWwgc2FmZXR5IGFuZAorICAvLyBvd25lcnNoaXAgY2hlY2tzLiAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBvYmplY3RzIGFyZSBvbgorICAvLyB0aGUgc2FtZSBhcmVuYSBvciBwYWlyZWQgd2l0aCBhIGNhbGwgdG8gYFVuc2FmZUFyZW5hUmVsZWFzZU1lc3NhZ2VgLgorICB2b2lkIFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLCBNZXNzYWdlKiBzdWJfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgLy8gUmVsZWFzZXMgdGhlIG1lc3NhZ2Ugc3BlY2lmaWVkIGJ5ICdmaWVsZCcgYW5kIHJldHVybnMgdGhlIHBvaW50ZXIsCisgIC8vIFJlbGVhc2VNZXNzYWdlKCkgd2lsbCByZXR1cm4gdGhlIG1lc3NhZ2UgdGhlIG1lc3NhZ2Ugb2JqZWN0IGlmIGl0IGV4aXN0cy4KKyAgLy8gT3RoZXJ3aXNlLCBpdCBtYXkgb3IgbWF5IG5vdCByZXR1cm4gbnVsbHB0ci4gIEluIGFueSBjYXNlLCBpZiB0aGUgcmV0dXJuCisgIC8vIHZhbHVlIGlzIG5vbi1udWxsLCB0aGUgY2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlci4KKyAgLy8gSWYgdGhlIGZpZWxkIGV4aXN0ZWQgKEhhc0ZpZWxkKCkgaXMgdHJ1ZSksIHRoZW4gdGhlIHJldHVybmVkIHBvaW50ZXIgd2lsbAorICAvLyBiZSB0aGUgc2FtZSBhcyB0aGUgcG9pbnRlciByZXR1cm5lZCBieSBNdXRhYmxlTWVzc2FnZSgpLgorICAvLyBUaGlzIGZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgQ2xlYXJGaWVsZCgpLgorICBQUk9UT0JVRl9OT0RJU0NBUkQgTWVzc2FnZSogUmVsZWFzZU1lc3NhZ2UoCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkgPSBudWxscHRyKSBjb25zdDsKKworICAvLyBTaW1pbGFyIHRvIGBSZWxlYXNlTWVzc2FnZWAsIGJ1dCBvbWl0cyBhbGwgaW50ZXJuYWwgc2FmZXR5IGFuZCBvd25lcnNoaXAKKyAgLy8gY2hlY2tzLiAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBvYmplY3RzIGFyZSBvbiB0aGUgc2FtZQorICAvLyBhcmVuYSBvciBwYWlyZWQgd2l0aCBhIGNhbGwgdG8gYFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZWAuCisgIE1lc3NhZ2UqIFVuc2FmZUFyZW5hUmVsZWFzZU1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gbnVsbHB0cikgY29uc3Q7CisKKworICAvLyBSZXBlYXRlZCBmaWVsZCBnZXR0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGVzZSBnZXQgdGhlIHZhbHVlIG9mIG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZmllbGQuCisKKyAgaW50MzJfdCBHZXRSZXBlYXRlZEludDMyKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OworICBpbnQ2NF90IEdldFJlcGVhdGVkSW50NjQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3Q7CisgIHVpbnQzMl90IEdldFJlcGVhdGVkVUludDMyKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7CisgIHVpbnQ2NF90IEdldFJlcGVhdGVkVUludDY0KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7CisgIGZsb2F0IEdldFJlcGVhdGVkRmxvYXQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OworICBkb3VibGUgR2V0UmVwZWF0ZWREb3VibGUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3Q7CisgIGJvb2wgR2V0UmVwZWF0ZWRCb29sKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEdldFJlcGVhdGVkRW51bShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3Q7CisgIC8vIEdldFJlcGVhdGVkRW51bVZhbHVlKCkgcmV0dXJucyBhbiBlbnVtIGZpZWxkJ3MgdmFsdWUgYXMgYW4gaW50ZWdlciByYXRoZXIKKyAgLy8gdGhhbiBhbiBFbnVtVmFsdWVEZXNjcmlwdG9yKi4gSWYgdGhlIGludGVnZXIgdmFsdWUgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhCisgIC8vIGtub3duIHZhbHVlIGRlc2NyaXB0b3IsIGEgbmV3IHZhbHVlIGRlc2NyaXB0b3IgaXMgY3JlYXRlZC4gKFN1Y2ggYSB2YWx1ZQorICAvLyB3aWxsIG9ubHkgYmUgcHJlc2VudCB3aGVuIHRoZSBuZXcgdW5rbm93bi1lbnVtLXZhbHVlIHNlbWFudGljcyBhcmUgZW5hYmxlZAorICAvLyBmb3IgYSBtZXNzYWdlLikKKyAgaW50IEdldFJlcGVhdGVkRW51bVZhbHVlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OworICBjb25zdCBNZXNzYWdlJiBHZXRSZXBlYXRlZE1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIFNlZSBHZXRTdHJpbmdSZWZlcmVuY2UoKSwgYWJvdmUuCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBzY3JhdGNoKSBjb25zdDsKKworCisgIC8vIFJlcGVhdGVkIGZpZWxkIG11dGF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRoZXNlIG11dGF0ZSB0aGUgdmFsdWUgb2Ygb25lIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBmaWVsZC4KKworICB2b2lkIFNldFJlcGVhdGVkSW50MzIoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgaW50MzJfdCB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0UmVwZWF0ZWRJbnQ2NChNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBpbnQ2NF90IHZhbHVlKSBjb25zdDsKKyAgdm9pZCBTZXRSZXBlYXRlZFVJbnQzMihNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgdWludDMyX3QgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldFJlcGVhdGVkVUludDY0KE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCB1aW50NjRfdCB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0UmVwZWF0ZWRGbG9hdChNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBmbG9hdCB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0UmVwZWF0ZWREb3VibGUoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0UmVwZWF0ZWRCb29sKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgYm9vbCB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0UmVwZWF0ZWRTdHJpbmcoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIHN0ZDo6c3RyaW5nIHZhbHVlKSBjb25zdDsKKyAgdm9pZCBTZXRSZXBlYXRlZEVudW0oTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgY29uc3Q7CisgIC8vIFNldCBhbiBlbnVtIGZpZWxkJ3MgdmFsdWUgd2l0aCBhbiBpbnRlZ2VyIHJhdGhlciB0aGFuIEVudW1WYWx1ZURlc2NyaXB0b3IuCisgIC8vIEZvciBwcm90bzMgdGhpcyBpcyBqdXN0IHNldHRpbmcgdGhlIGVudW0gZmllbGQgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCwgZm9yCisgIC8vIHByb3RvMiBpdCdzIG1vcmUgY29tcGxpY2F0ZWQuIElmIHZhbHVlIGlzIGEga25vd24gZW51bSB2YWx1ZSB0aGUgZmllbGQgaXMKKyAgLy8gc2V0IGFzIHVzdWFsLiBJZiB0aGUgdmFsdWUgaXMgdW5rbm93biB0aGVuIGl0IGlzIGFkZGVkIHRvIHRoZSB1bmtub3duIGZpZWxkCisgIC8vIHNldC4gTm90ZSB0aGlzIG1hdGNoZXMgdGhlIGJlaGF2aW9yIG9mIHBhcnNpbmcgdW5rbm93biBlbnVtIHZhbHVlcy4KKyAgLy8gSWYgbXVsdGlwbGUgY2FsbHMgd2l0aCB1bmtub3duIHZhbHVlcyBoYXBwZW4gdGhhbiB0aGV5IGFyZSBhbGwgYWRkZWQgdG8gdGhlCisgIC8vIHVua25vd24gZmllbGQgc2V0IGluIG9yZGVyIG9mIHRoZSBjYWxscy4KKyAgdm9pZCBTZXRSZXBlYXRlZEVudW1WYWx1ZShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgaW50IHZhbHVlKSBjb25zdDsKKyAgLy8gR2V0IGEgbXV0YWJsZSBwb2ludGVyIHRvIGFuIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBmaWVsZCB3aXRoIGEgbWVzc2FnZQorICAvLyB0eXBlLgorICBNZXNzYWdlKiBNdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OworCisKKyAgLy8gUmVwZWF0ZWQgZmllbGQgYWRkZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlc2UgYWRkIGFuIGVsZW1lbnQgdG8gYSByZXBlYXRlZCBmaWVsZC4KKworICB2b2lkIEFkZEludDMyKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgQWRkSW50NjQoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlKSBjb25zdDsKKyAgdm9pZCBBZGRVSW50MzIoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpIGNvbnN0OworICB2b2lkIEFkZFVJbnQ2NChNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgQWRkRmxvYXQoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICBmbG9hdCB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgQWRkRG91YmxlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgQWRkQm9vbChNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgYm9vbCB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgQWRkU3RyaW5nKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlKSBjb25zdDsKKyAgdm9pZCBBZGRFbnVtKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgY29uc3Q7CisgIC8vIEFkZCBhbiBpbnRlZ2VyIHZhbHVlIHRvIGEgcmVwZWF0ZWQgZW51bSBmaWVsZCByYXRoZXIgdGhhbgorICAvLyBFbnVtVmFsdWVEZXNjcmlwdG9yLiBGb3IgcHJvdG8zIHRoaXMgaXMganVzdCBzZXR0aW5nIHRoZSBlbnVtIGZpZWxkIHRvIHRoZQorICAvLyB2YWx1ZSBzcGVjaWZpZWQsIGZvciBwcm90bzIgaXQncyBtb3JlIGNvbXBsaWNhdGVkLiBJZiB2YWx1ZSBpcyBhIGtub3duIGVudW0KKyAgLy8gdmFsdWUgdGhlIGZpZWxkIGlzIHNldCBhcyB1c3VhbC4gSWYgdGhlIHZhbHVlIGlzIHVua25vd24gdGhlbiBpdCBpcyBhZGRlZAorICAvLyB0byB0aGUgdW5rbm93biBmaWVsZCBzZXQuIE5vdGUgdGhpcyBtYXRjaGVzIHRoZSBiZWhhdmlvciBvZiBwYXJzaW5nIHVua25vd24KKyAgLy8gZW51bSB2YWx1ZXMuIElmIG11bHRpcGxlIGNhbGxzIHdpdGggdW5rbm93biB2YWx1ZXMgaGFwcGVuIHRoYW4gdGhleSBhcmUgYWxsCisgIC8vIGFkZGVkIHRvIHRoZSB1bmtub3duIGZpZWxkIHNldCBpbiBvcmRlciBvZiB0aGUgY2FsbHMuCisgIHZvaWQgQWRkRW51bVZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgY29uc3Q7CisgIC8vIFNlZSBNdXRhYmxlTWVzc2FnZSgpIGZvciBjb21tZW50cyBvbiB0aGUgImZhY3RvcnkiIHBhcmFtZXRlci4KKyAgTWVzc2FnZSogQWRkTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8gQXBwZW5kcyBhbiBhbHJlYWR5LWFsbG9jYXRlZCBvYmplY3QgJ25ld19lbnRyeScgdG8gdGhlIHJlcGVhdGVkIGZpZWxkCisgIC8vIHNwZWNpZmllZCBieSAnZmllbGQnIHBhc3Npbmcgb3duZXJzaGlwIHRvIHRoZSBtZXNzYWdlLgorICB2b2lkIEFkZEFsbG9jYXRlZE1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG5ld19lbnRyeSkgY29uc3Q7CisKKyAgLy8gU2ltaWxhciB0byBBZGRBbGxvY2F0ZWRNZXNzYWdlKCkgd2l0aG91dCBpbnRlcm5hbCBzYWZldHkgYW5kIG93bmVyc2hpcAorICAvLyBjaGVja3MuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgb2JqZWN0cyBhcmUgb24gdGhlIHNhbWUKKyAgLy8gYXJlbmEgb3IgcGFpcmVkIHdpdGggYSBjYWxsIHRvIGBVbnNhZmVBcmVuYVJlbGVhc2VMYXN0YC4KKyAgdm9pZCBVbnNhZmVBcmVuYUFkZEFsbG9jYXRlZE1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbmV3X2VudHJ5KSBjb25zdDsKKworCisgIC8vIEdldCBhIFJlcGVhdGVkRmllbGRSZWYgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZworICAvLyByZXBlYXRlZCBmaWVsZC4gVGhlIHR5cGUgcGFyYW1ldGVyIFQgbXVzdCBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZQorICAvLyBmaWVsZCdzIGNwcCB0eXBlLiBUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSBtYXBwaW5nIGZyb20gY3BwIHR5cGUKKyAgLy8gdG8gYWNjZXB0YWJsZSBULgorICAvLworICAvLyAgIGZpZWxkLT5jcHBfdHlwZSgpICAgICAgVAorICAvLyAgIENQUFRZUEVfSU5UMzIgICAgICAgIGludDMyX3QKKyAgLy8gICBDUFBUWVBFX1VJTlQzMiAgICAgICB1aW50MzJfdAorICAvLyAgIENQUFRZUEVfSU5UNjQgICAgICAgIGludDY0X3QKKyAgLy8gICBDUFBUWVBFX1VJTlQ2NCAgICAgICB1aW50NjRfdAorICAvLyAgIENQUFRZUEVfRE9VQkxFICAgICAgIGRvdWJsZQorICAvLyAgIENQUFRZUEVfRkxPQVQgICAgICAgIGZsb2F0CisgIC8vICAgQ1BQVFlQRV9CT09MICAgICAgICAgYm9vbAorICAvLyAgIENQUFRZUEVfRU5VTSAgICAgICAgIGdlbmVyYXRlZCBlbnVtIHR5cGUgb3IgaW50MzJfdAorICAvLyAgIENQUFRZUEVfU1RSSU5HICAgICAgIHN0ZDo6c3RyaW5nCisgIC8vICAgQ1BQVFlQRV9NRVNTQUdFICAgICAgZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSBvciBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlCisgIC8vCisgIC8vIEEgUmVwZWF0ZWRGaWVsZFJlZiBvYmplY3QgY2FuIGJlIGNvcGllZCBhbmQgdGhlIHJlc3VsdGVkIG9iamVjdCB3aWxsIHBvaW50CisgIC8vIHRvIHRoZSBzYW1lIHJlcGVhdGVkIGZpZWxkIGluIHRoZSBzYW1lIG1lc3NhZ2UuIFRoZSBvYmplY3QgY2FuIGJlIHVzZWQgYXMKKyAgLy8gbG9uZyBhcyB0aGUgbWVzc2FnZSBpcyBub3QgZGVzdHJveWVkLgorICAvLworICAvLyBOb3RlIHRoYXQgdG8gdXNlIHRoaXMgbWV0aG9kIHVzZXJzIG5lZWQgdG8gaW5jbHVkZSB0aGUgaGVhZGVyIGZpbGUKKyAgLy8gInJlZmxlY3Rpb24uaCIgKHdoaWNoIGRlZmluZXMgdGhlIFJlcGVhdGVkRmllbGRSZWYgY2xhc3MgdGVtcGxhdGVzKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFJlcGVhdGVkRmllbGRSZWY8VD4gR2V0UmVwZWF0ZWRGaWVsZFJlZihjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgLy8gTGlrZSBHZXRSZXBlYXRlZEZpZWxkUmVmKCkgYnV0IHJldHVybiBhbiBvYmplY3QgdGhhdCBjYW4gYWxzbyBiZSB1c2VkCisgIC8vIG1hbmlwdWxhdGUgdGhlIHVuZGVybHlpbmcgcmVwZWF0ZWQgZmllbGQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxUPiBHZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZigKKyAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIC8vIERFUFJFQ0FURUQuIFBsZWFzZSB1c2UgR2V0KE11dGFibGUpUmVwZWF0ZWRGaWVsZFJlZigpIGZvciByZXBlYXRlZCBmaWVsZAorICAvLyBhY2Nlc3MuIFRoZSBmb2xsb3dpbmcgcmVwZWF0ZWQgZmllbGQgYWNjZXNzb3JzIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUKKyAgLy8gZnV0dXJlLgorICAvLworICAvLyBSZXBlYXRlZCBmaWVsZCBhY2Nlc3NvcnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlIG1ldGhvZHMgYWJvdmUsIGUuZy4gR2V0UmVwZWF0ZWRJbnQzMihtc2csIGZkLCBpbmRleCksIHByb3ZpZGUgc2luZ3VsYXIKKyAgLy8gYWNjZXNzIHRvIHRoZSBkYXRhIGluIGEgUmVwZWF0ZWRGaWVsZC4gIFRoZSBtZXRob2RzIGJlbG93IHByb3ZpZGUgYWdncmVnYXRlCisgIC8vIGFjY2VzcyBieSBleHBvc2luZyB0aGUgUmVwZWF0ZWRGaWVsZCBvYmplY3QgaXRzZWxmIHdpdGggdGhlIE1lc3NhZ2UuCisgIC8vIEFwcGx5aW5nIHRoZXNlIHRlbXBsYXRlcyB0byBpbmFwcHJvcHJpYXRlIHR5cGVzIHdpbGwgbGVhZCB0byBhbiB1bmRlZmluZWQKKyAgLy8gcmVmZXJlbmNlIGF0IGxpbmsgdGltZSAoZS5nLiBHZXRSZXBlYXRlZEZpZWxkPCoqKmRvdWJsZT4pLCBvciBwb3NzaWJseSBhCisgIC8vIHRlbXBsYXRlIG1hdGNoaW5nIGVycm9yIGF0IGNvbXBpbGUgdGltZSAoZS5nLiBHZXRSZXBlYXRlZFB0ckZpZWxkPEZpbGU+KS4KKyAgLy8KKyAgLy8gVXNhZ2UgZXhhbXBsZTogbXlfZG91YnMgPSByZWZsLT5HZXRSZXBlYXRlZEZpZWxkPGRvdWJsZT4obXNnLCBmZCk7CisKKyAgLy8gREVQUkVDQVRFRC4gUGxlYXNlIHVzZSBHZXRSZXBlYXRlZEZpZWxkUmVmKCkuCisgIC8vCisgIC8vIGZvciBUID0gQ29yZCBhbmQgYWxsIHByb3RvYnVmIHNjYWxhciB0eXBlcyBleGNlcHQgZW51bXMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9ERVBSRUNBVEVEX01TRygiUGxlYXNlIHVzZSBHZXRSZXBlYXRlZEZpZWxkUmVmKCkgaW5zdGVhZCIpCisgIGNvbnN0IFJlcGVhdGVkRmllbGQ8VD4mIEdldFJlcGVhdGVkRmllbGQoY29uc3QgTWVzc2FnZSYgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZCkgY29uc3QgeworICAgIHJldHVybiBHZXRSZXBlYXRlZEZpZWxkSW50ZXJuYWw8VD4obXNnLCBkKTsKKyAgfQorCisgIC8vIERFUFJFQ0FURUQuIFBsZWFzZSB1c2UgR2V0TXV0YWJsZVJlcGVhdGVkRmllbGRSZWYoKS4KKyAgLy8KKyAgLy8gZm9yIFQgPSBDb3JkIGFuZCBhbGwgcHJvdG9idWYgc2NhbGFyIHR5cGVzIGV4Y2VwdCBlbnVtcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX0RFUFJFQ0FURURfTVNHKCJQbGVhc2UgdXNlIEdldE11dGFibGVSZXBlYXRlZEZpZWxkUmVmKCkgaW5zdGVhZCIpCisgIFJlcGVhdGVkRmllbGQ8VD4qIE11dGFibGVSZXBlYXRlZEZpZWxkKE1lc3NhZ2UqIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkKSBjb25zdCB7CisgICAgcmV0dXJuIE11dGFibGVSZXBlYXRlZEZpZWxkSW50ZXJuYWw8VD4obXNnLCBkKTsKKyAgfQorCisgIC8vIERFUFJFQ0FURUQuIFBsZWFzZSB1c2UgR2V0UmVwZWF0ZWRGaWVsZFJlZigpLgorICAvLworICAvLyBmb3IgVCA9IHN0ZDo6c3RyaW5nLCBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6U3RyaW5nUGllY2VGaWVsZAorICAvLyAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgJiBkZXNjZW5kYW50cy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX0RFUFJFQ0FURURfTVNHKCJQbGVhc2UgdXNlIEdldFJlcGVhdGVkRmllbGRSZWYoKSBpbnN0ZWFkIikKKyAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxUPiYgR2V0UmVwZWF0ZWRQdHJGaWVsZCgKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1zZywgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFJlcGVhdGVkUHRyRmllbGRJbnRlcm5hbDxUPihtc2csIGQpOworICB9CisKKyAgLy8gREVQUkVDQVRFRC4gUGxlYXNlIHVzZSBHZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZigpLgorICAvLworICAvLyBmb3IgVCA9IHN0ZDo6c3RyaW5nLCBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6U3RyaW5nUGllY2VGaWVsZAorICAvLyAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgJiBkZXNjZW5kYW50cy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX0RFUFJFQ0FURURfTVNHKCJQbGVhc2UgdXNlIEdldE11dGFibGVSZXBlYXRlZEZpZWxkUmVmKCkgaW5zdGVhZCIpCisgIFJlcGVhdGVkUHRyRmllbGQ8VD4qIE11dGFibGVSZXBlYXRlZFB0ckZpZWxkKE1lc3NhZ2UqIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkKSBjb25zdCB7CisgICAgcmV0dXJuIE11dGFibGVSZXBlYXRlZFB0ckZpZWxkSW50ZXJuYWw8VD4obXNnLCBkKTsKKyAgfQorCisgIC8vIEV4dGVuc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFRyeSB0byBmaW5kIGFuIGV4dGVuc2lvbiBvZiB0aGlzIG1lc3NhZ2UgdHlwZSBieSBmdWxseS1xdWFsaWZpZWQgZmllbGQKKyAgLy8gbmFtZS4gIFJldHVybnMgbnVsbHB0ciBpZiBubyBleHRlbnNpb24gaXMga25vd24gZm9yIHRoaXMgbmFtZSBvciBudW1iZXIuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0OworCisgIC8vIFRyeSB0byBmaW5kIGFuIGV4dGVuc2lvbiBvZiB0aGlzIG1lc3NhZ2UgdHlwZSBieSBmaWVsZCBudW1iZXIuCisgIC8vIFJldHVybnMgbnVsbHB0ciBpZiBubyBleHRlbnNpb24gaXMga25vd24gZm9yIHRoaXMgbmFtZSBvciBudW1iZXIuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoaW50IG51bWJlcikgY29uc3Q7CisKKyAgLy8gRmVhdHVyZSBGbGFncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gRG9lcyB0aGlzIG1lc3NhZ2Ugc3VwcG9ydCBzdG9yaW5nIGFyYml0cmFyeSBpbnRlZ2VyIHZhbHVlcyBpbiBlbnVtIGZpZWxkcz8KKyAgLy8gSWYgfHRydWV8LCBHZXRFbnVtVmFsdWUvU2V0RW51bVZhbHVlIGFuZCBhc3NvY2lhdGVkIHJlcGVhdGVkLWZpZWxkIHZlcnNpb25zCisgIC8vIHRha2UgYXJiaXRyYXJ5IGludGVnZXIgdmFsdWVzLCBhbmQgdGhlIGxlZ2FjeSBHZXRFbnVtKCkgZ2V0dGVyIHdpbGwKKyAgLy8gZHluYW1pY2FsbHkgY3JlYXRlIGFuIEVudW1WYWx1ZURlc2NyaXB0b3IgZm9yIGFueSBpbnRlZ2VyIHZhbHVlIHdpdGhvdXQKKyAgLy8gb25lLiBJZiB8ZmFsc2V8LCBzZXR0aW5nIGFuIHVua25vd24gZW51bSB2YWx1ZSB2aWEgdGhlIGludGVnZXItYmFzZWQKKyAgLy8gc2V0dGVycyByZXN1bHRzIGluIHVuZGVmaW5lZCBiZWhhdmlvciAoaW4gcHJhY3RpY2UsIEdPT0dMRV9EQ0hFQ0stZmFpbHMpLgorICAvLworICAvLyBHZW5lcmljIGNvZGUgdGhhdCB1c2VzIHJlZmxlY3Rpb24gdG8gaGFuZGxlIG1lc3NhZ2VzIHdpdGggZW51bSBmaWVsZHMKKyAgLy8gc2hvdWxkIGNoZWNrIHRoaXMgZmxhZyBiZWZvcmUgdXNpbmcgdGhlIGludGVnZXItYmFzZWQgc2V0dGVyLCBhbmQgZWl0aGVyCisgIC8vIGRvd25ncmFkZSB0byBhIGNvbXBhdGlibGUgdmFsdWUgb3IgdXNlIHRoZSBVbmtub3duRmllbGRTZXQgaWYgbm90LiBGb3IKKyAgLy8gZXhhbXBsZToKKyAgLy8KKyAgLy8gICBpbnQgbmV3X3ZhbHVlID0gR2V0VmFsdWVGcm9tQXBwbGljYXRpb25Mb2dpYygpOworICAvLyAgIGlmIChyZWZsZWN0aW9uLT5TdXBwb3J0c1Vua25vd25FbnVtVmFsdWVzKCkpIHsKKyAgLy8gICAgIHJlZmxlY3Rpb24tPlNldEVudW1WYWx1ZShtZXNzYWdlLCBmaWVsZCwgbmV3X3ZhbHVlKTsKKyAgLy8gICB9IGVsc2UgeworICAvLyAgICAgaWYgKGZpZWxkX2Rlc2NyaXB0b3ItPmVudW1fdHlwZSgpLT4KKyAgLy8gICAgICAgICAgICAgRmluZFZhbHVlQnlOdW1iZXIobmV3X3ZhbHVlKSAhPSBudWxscHRyKSB7CisgIC8vICAgICAgIHJlZmxlY3Rpb24tPlNldEVudW1WYWx1ZShtZXNzYWdlLCBmaWVsZCwgbmV3X3ZhbHVlKTsKKyAgLy8gICAgIH0gZWxzZSBpZiAoZW1pdF91bmtub3duX2VudW1fdmFsdWVzKSB7CisgIC8vICAgICAgIHJlZmxlY3Rpb24tPk11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UpLT5BZGRWYXJpbnQoCisgIC8vICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksIG5ld192YWx1ZSk7CisgIC8vICAgICB9IGVsc2UgeworICAvLyAgICAgICAvLyBjb252ZXJ0IHZhbHVlIHRvIGEgY29tcGF0aWJsZS9kZWZhdWx0IHZhbHVlLgorICAvLyAgICAgICBuZXdfdmFsdWUgPSBDb21wYXRpYmxlRG93bmdyYWRlKG5ld192YWx1ZSk7CisgIC8vICAgICAgIHJlZmxlY3Rpb24tPlNldEVudW1WYWx1ZShtZXNzYWdlLCBmaWVsZCwgbmV3X3ZhbHVlKTsKKyAgLy8gICAgIH0KKyAgLy8gICB9CisgIGJvb2wgU3VwcG9ydHNVbmtub3duRW51bVZhbHVlcygpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIE1lc3NhZ2VGYWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lc3NhZ2UuICBUaGlzIGNhbiBiZQorICAvLyB1c2VmdWwgZm9yIGRldGVybWluaW5nIGlmIGEgbWVzc2FnZSBpcyBhIGdlbmVyYXRlZCBtZXNzYWdlIG9yIG5vdCwgZm9yCisgIC8vIGV4YW1wbGU6CisgIC8vICAgaWYgKG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0TWVzc2FnZUZhY3RvcnkoKSA9PQorICAvLyAgICAgICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSkgeworICAvLyAgICAgLy8gVGhpcyBpcyBhIGdlbmVyYXRlZCBtZXNzYWdlLgorICAvLyAgIH0KKyAgLy8gSXQgY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGUgbW9yZSBtZXNzYWdlcyBvZiB0aGlzIHR5cGUsIHRob3VnaAorICAvLyBNZXNzYWdlOjpOZXcoKSBpcyBhbiBlYXNpZXIgd2F5IHRvIGFjY29tcGxpc2ggdGhpcy4KKyAgTWVzc2FnZUZhY3RvcnkqIEdldE1lc3NhZ2VGYWN0b3J5KCkgY29uc3Q7CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgY29uc3QgUmVwZWF0ZWRGaWVsZDxUPiYgR2V0UmVwZWF0ZWRGaWVsZEludGVybmFsKAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBSZXBlYXRlZEZpZWxkPFQ+KiBNdXRhYmxlUmVwZWF0ZWRGaWVsZEludGVybmFsKAorICAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPFQ+JiBHZXRSZXBlYXRlZFB0ckZpZWxkSW50ZXJuYWwoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFJlcGVhdGVkUHRyRmllbGQ8VD4qIE11dGFibGVSZXBlYXRlZFB0ckZpZWxkSW50ZXJuYWwoCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgLy8gT2J0YWluIGEgcG9pbnRlciB0byBhIFJlcGVhdGVkIEZpZWxkIFN0cnVjdHVyZSBhbmQgZG8gc29tZSB0eXBlIGNoZWNraW5nOgorICAvLyAgIG9uIGZpZWxkLT5jcHBfdHlwZSgpLAorICAvLyAgIG9uIGZpZWxkLT5maWVsZF9vcHRpb24oKS5jdHlwZSgpIChpZiBjdHlwZSA+PSAwKQorICAvLyAgIG9mIGZpZWxkLT5tZXNzYWdlX3R5cGUoKSAoaWYgbWVzc2FnZV90eXBlICE9IG51bGxwdHIpLgorICAvLyBXZSB1c2UgMiByb3V0aW5lIHJhdGhlciB0aGFuIDQgKGNvbnN0IHZzIG11dGFibGUpIHggKHNjYWxhciB2cyBwb2ludGVyKS4KKyAgdm9pZCogTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlLCBpbnQgY3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSkgY29uc3Q7CisKKyAgY29uc3Qgdm9pZCogR2V0UmF3UmVwZWF0ZWRGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIGNwcHR5cGUsIGludCBjdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUpIGNvbnN0OworCisgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBpbXBsZW1lbnQgKE11dGFibGUpUmVwZWF0ZWRGaWVsZFJlZi4KKyAgLy8gQSBSZWYgb2JqZWN0IHdpbGwgc3RvcmUgYSByYXcgcG9pbnRlciB0byB0aGUgcmVwZWF0ZWQgZmllbGQgZGF0YSAob2J0YWluZWQKKyAgLy8gZnJvbSBSZXBlYXRlZEZpZWxkRGF0YSgpKSBhbmQgYSBwb2ludGVyIHRvIGEgQWNjZXNzb3IgKG9idGFpbmVkIGZyb20KKyAgLy8gUmVwZWF0ZWRGaWVsZEFjY2Vzc29yKSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSByYXcgZGF0YS4KKworICAvLyBSZXR1cm5zIGEgcmF3IHBvaW50ZXIgdG8gdGhlIHJlcGVhdGVkIGZpZWxkCisgIC8vCisgIC8vICJjcHBfdHlwZSIgYW5kICJtZXNzYWdlX3R5cGUiIGFyZSBkZWR1Y2VkIGZyb20gdGhlIHR5cGUgcGFyYW1ldGVyIFQgcGFzc2VkCisgIC8vIHRvIEdldChNdXRhYmxlKVJlcGVhdGVkRmllbGRSZWYuIElmIFQgaXMgYSBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlLAorICAvLyAibWVzc2FnZV90eXBlIiBzaG91bGQgYmUgc2V0IHRvIGl0cyBkZXNjcmlwdG9yLiBPdGhlcndpc2UgIm1lc3NhZ2VfdHlwZSIKKyAgLy8gc2hvdWxkIGJlIHNldCB0byBudWxscHRyLiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNoZWNrCisgIC8vIHdoZXRoZXIgImNwcF90eXBlIi8ibWVzc2FnZV90eXBlIiBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGFjdHVhbCB0eXBlIG9mIHRoZQorICAvLyBmaWVsZC4gV2UgdXNlIDEgcm91dGluZSByYXRoZXIgdGhhbiAyIChjb25zdCB2cyBtdXRhYmxlKSBiZWNhdXNlIGl0IGlzCisgIC8vIHByb3RlY3RlZCBhbmQgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIG1lc3NhZ2UuCisgIHZvaWQqIFJlcGVhdGVkRmllbGREYXRhKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHBfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlKSBjb25zdDsKKworICAvLyBUaGUgcmV0dXJuZWQgcG9pbnRlciBzaG91bGQgcG9pbnQgdG8gYSBzaW5nbGV0b24gaW5zdGFuY2Ugd2hpY2ggaW1wbGVtZW50cworICAvLyB0aGUgUmVwZWF0ZWRGaWVsZEFjY2Vzc29yIGludGVyZmFjZS4KKyAgY29uc3QgaW50ZXJuYWw6OlJlcGVhdGVkRmllbGRBY2Nlc3NvciogUmVwZWF0ZWRGaWVsZEFjY2Vzc29yKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgLy8gTGlzdHMgYWxsIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSB3aGljaCBhcmUgY3VycmVudGx5IHNldCwgZXhjZXB0IGZvciB1bmtub3duCisgIC8vIGZpZWxkcyBhbmQgc3RyaXBwZWQgZmllbGRzLiBTZWUgTGlzdEZpZWxkcyBmb3IgZGV0YWlscy4KKyAgdm9pZCBMaXN0RmllbGRzT21pdFN0cmlwcGVkKAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXRwdXQpIGNvbnN0OworCisgIGJvb2wgSXNNZXNzYWdlU3RyaXBwZWQoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgY29uc3QgeworICAgIHJldHVybiBzY2hlbWFfLklzTWVzc2FnZVN0cmlwcGVkKGRlc2NyaXB0b3IpOworICB9CisKKyAgZnJpZW5kIGNsYXNzIFRleHRGb3JtYXQ7CisKKyAgdm9pZCBMaXN0RmllbGRzTWF5RmFpbE9uU3RyaXBwZWQoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBib29sIHNob3VsZF9mYWlsLAorICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dHB1dCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtZXNzYWdlIGZpZWxkIGlzIGJhY2tlZCBieSBhIExhenlGaWVsZC4KKyAgLy8KKyAgLy8gQSBtZXNzYWdlIGZpZWxkIG1heSBiZSBiYWNrZWQgYnkgYSBMYXp5RmllbGQgd2l0aG91dCB0aGUgdXNlciBhbm5vdGF0aW9uCisgIC8vIChbbGF6eSA9IHRydWVdKS4gV2hpbGUgdGhlIHVzZXItYW5ub3RhdGVkIExhenlGaWVsZCBpcyBsYXppbHkgdmVyaWZpZWQgb24KKyAgLy8gZmlyc3QgdG91Y2ggKGkuZS4gZmFpbHVyZSBvbiBhY2Nlc3MgcmF0aGVyIHRoYW4gcGFyc2luZyBpZiB0aGUgTGF6eUZpZWxkIGlzCisgIC8vIG5vdCBpbml0aWFsaXplZCksIHRoZSBpbmZlcnJlZCBMYXp5RmllbGQgaXMgZWFnZXJseSB2ZXJpZmllZCB0byBhdm9pZCBsYXp5CisgIC8vIHBhcnNpbmcgZXJyb3IgYXQgdGhlIGNvc3Qgb2YgbG93ZXIgZWZmaWNpZW5jeS4gV2hlbiByZWZsZWN0aW5nIGEgbWVzc2FnZQorICAvLyBmaWVsZCwgdXNlIHRoaXMgQVBJIGluc3RlYWQgb2YgY2hlY2tpbmcgZmllbGQtPm9wdGlvbnMoKS5sYXp5KCkuCisgIGJvb2wgSXNMYXp5RmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICAgIHJldHVybiBJc0xhemlseVZlcmlmaWVkTGF6eUZpZWxkKGZpZWxkKSB8fAorICAgICAgICAgICBJc0VhZ2VybHlWZXJpZmllZExhenlGaWVsZChmaWVsZCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGlzIGxhenkgZXh0ZW5zaW9uLiBJdCBpcyBtZWFudCB0byBhbGxvdyBweXRob24KKyAgLy8gcmVwYXJzZSBsYXp5IGZpZWxkIHVudGlsIGIvMTU3NTU5MzI3IGlzIGZpeGVkLgorICBib29sIElzTGF6eUV4dGVuc2lvbihjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworICBib29sIElzTGF6aWx5VmVyaWZpZWRMYXp5RmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGJvb2wgSXNFYWdlcmx5VmVyaWZpZWRMYXp5RmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgZnJpZW5kIGNsYXNzIEZhc3RSZWZsZWN0aW9uTWVzc2FnZU11dGF0b3I7CisgIGZyaWVuZCBib29sIGludGVybmFsOjpJc0Rlc2NlbmRhbnQoTWVzc2FnZSYgcm9vdCwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAgY29uc3QgRGVzY3JpcHRvciogY29uc3QgZGVzY3JpcHRvcl87CisgIGNvbnN0IGludGVybmFsOjpSZWZsZWN0aW9uU2NoZW1hIHNjaGVtYV87CisgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBjb25zdCBkZXNjcmlwdG9yX3Bvb2xfOworICBNZXNzYWdlRmFjdG9yeSogY29uc3QgbWVzc2FnZV9mYWN0b3J5XzsKKworICAvLyBMYXN0IG5vbiB3ZWFrIGZpZWxkIGluZGV4LiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiB3aGVuIG1vc3Qgd2VhayBmaWVsZHMKKyAgLy8gYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGNvbnRhaW5pbmcgbWVzc2FnZS4gSWYgYSBtZXNzYWdlIHByb3RvIGRvZXNuJ3QKKyAgLy8gY29udGFpbiB3ZWFrIGZpZWxkcywgdGhlbiB0aGlzIGZpZWxkIGVxdWFscyBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKS4KKyAgaW50IGxhc3Rfbm9uX3dlYWtfZmllbGRfaW5kZXhfOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBFbmFibGU+CisgIGZyaWVuZCBjbGFzcyBSZXBlYXRlZEZpZWxkUmVmOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRW5hYmxlPgorICBmcmllbmQgY2xhc3MgTXV0YWJsZVJlcGVhdGVkRmllbGRSZWY7CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxheW91dEluc3BlY3RvcjsKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBc3NpZ25EZXNjcmlwdG9yc0hlbHBlcjsKKyAgZnJpZW5kIGNsYXNzIER5bmFtaWNNZXNzYWdlRmFjdG9yeTsKKyAgZnJpZW5kIGNsYXNzIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdEhlbHBlcjsKKyAgZnJpZW5kIGNsYXNzIHB5dGhvbjo6TWFwUmVmbGVjdGlvbkZyaWVuZDsKKyAgZnJpZW5kIGNsYXNzIHB5dGhvbjo6TWVzc2FnZVJlZmxlY3Rpb25GcmllbmQ7CisgIGZyaWVuZCBjbGFzcyB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI7CisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNfQ0VMX01BUF9SRUZMRUNUSU9OX0ZSSUVORAorICBmcmllbmQgY2xhc3MgZXhwcjo6Q2VsTWFwUmVmbGVjdGlvbkZyaWVuZDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpNYXBGaWVsZFJlZmxlY3Rpb25UZXN0OworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6Ok1hcEtleVNvcnRlcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpXaXJlRm9ybWF0OworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6U3dhcEZpZWxkSGVscGVyOworICAvLyBOZWVkZWQgZm9yIGltcGxlbWVudGluZyB0ZXh0IGZvcm1hdCBmb3IgbWFwLgorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6Ok1hcEZpZWxkUHJpbnRlckhlbHBlcjsKKworICBSZWZsZWN0aW9uKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWw6OlJlZmxlY3Rpb25TY2hlbWEmIHNjaGVtYSwKKyAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpOworCisgIC8vIFNwZWNpYWwgdmVyc2lvbiBmb3Igc3BlY2lhbGl6ZWQgaW1wbGVtZW50YXRpb25zIG9mIHN0cmluZy4gIFdlIGNhbid0CisgIC8vIGNhbGwgTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQgZGlyZWN0bHkgaGVyZSBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvCisgIC8vIEZpZWxkT3B0aW9uczo6KiB3aGljaCBhcmUgZGVmaW5lZCBpbiBkZXNjcmlwdG9yLnBiLmguICBJbmNsdWRpbmcgdGhhdAorICAvLyBmaWxlIGhlcmUgaXMgbm90IHBvc3NpYmxlIGJlY2F1c2UgaXQgd291bGQgY2F1c2UgYSBjaXJjdWxhciBpbmNsdWRlIGN5Y2xlLgorICAvLyBXZSB1c2UgMSByb3V0aW5lIHJhdGhlciB0aGFuIDIgKGNvbnN0IHZzIG11dGFibGUpIGJlY2F1c2UgaXQgaXMgcHJpdmF0ZQorICAvLyBhbmQgbXV0YWJsZSBhIHJlcGVhdGVkIHN0cmluZyBmaWVsZCBkb2Vzbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4KKyAgdm9pZCogTXV0YWJsZVJhd1JlcGVhdGVkU3RyaW5nKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3N0cmluZykgY29uc3Q7CisKKyAgZnJpZW5kIGNsYXNzIE1hcFJlZmxlY3Rpb25UZXN0ZXI7CisgIC8vIFJldHVybnMgdHJ1ZSBpZiBrZXkgaXMgaW4gbWFwLiBSZXR1cm5zIGZhbHNlIGlmIGtleSBpcyBub3QgaW4gbWFwIGZpZWxkLgorICBib29sIENvbnRhaW5zTWFwS2V5KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFwS2V5JiBrZXkpIGNvbnN0OworCisgIC8vIElmIGtleSBpcyBpbiBtYXAgZmllbGQ6IFNhdmVzIHRoZSB2YWx1ZSBwb2ludGVyIHRvIHZhbCBhbmQgcmV0dXJucworICAvLyBmYWxzZS4gSWYga2V5IGluIG5vdCBpbiBtYXAgZmllbGQ6IEluc2VydCB0aGUga2V5IGludG8gbWFwLCBzYXZlcworICAvLyB2YWx1ZSBwb2ludGVyIHRvIHZhbCBhbmQgcmV0dXJucyB0cnVlLiBVc2VycyBhcmUgYWJsZSB0byBtb2RpZnkgdGhlCisgIC8vIG1hcCB2YWx1ZSBieSBNYXBWYWx1ZVJlZi4KKyAgYm9vbCBJbnNlcnRPckxvb2t1cE1hcFZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXBLZXkmIGtleSwgTWFwVmFsdWVSZWYqIHZhbCkgY29uc3Q7CisKKyAgLy8gSWYga2V5IGlzIGluIG1hcCBmaWVsZDogU2F2ZXMgdGhlIHZhbHVlIHBvaW50ZXIgdG8gdmFsIGFuZCByZXR1cm5zIHRydWUuCisgIC8vIFJldHVybnMgZmFsc2UgaWYga2V5IGlzIG5vdCBpbiBtYXAgZmllbGQuIFVzZXJzIGFyZSBOT1QgYWJsZSB0byBtb2RpZnkKKyAgLy8gdGhlIHZhbHVlIGJ5IE1hcFZhbHVlQ29uc3RSZWYuCisgIGJvb2wgTG9va3VwTWFwVmFsdWUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXBLZXkmIGtleSwgTWFwVmFsdWVDb25zdFJlZiogdmFsKSBjb25zdDsKKyAgYm9vbCBMb29rdXBNYXBWYWx1ZShjb25zdCBNZXNzYWdlJiwgY29uc3QgRmllbGREZXNjcmlwdG9yKiwgY29uc3QgTWFwS2V5JiwKKyAgICAgICAgICAgICAgICAgICAgICBNYXBWYWx1ZVJlZiopIGNvbnN0ID0gZGVsZXRlOworCisgIC8vIERlbGV0ZSBhbmQgcmV0dXJucyB0cnVlIGlmIGtleSBpcyBpbiB0aGUgbWFwIGZpZWxkLiBSZXR1cm5zIGZhbHNlCisgIC8vIG90aGVyd2lzZS4KKyAgYm9vbCBEZWxldGVNYXBWYWx1ZShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hcEtleSYga2V5KSBjb25zdDsKKworICAvLyBSZXR1cm5zIGEgTWFwSXRlcmF0b3IgcmVmZXJyaW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBtYXAgZmllbGQuCisgIC8vIElmIHRoZSBtYXAgZmllbGQgaXMgZW1wdHksIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSBhcworICAvLyByZWZsZWN0aW9uOjpNYXBFbmQuIE11dGF0aW9uIHRvIHRoZSBmaWVsZCBtYXkgaW52YWxpZGF0ZSB0aGUgaXRlcmF0b3IuCisgIE1hcEl0ZXJhdG9yIE1hcEJlZ2luKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIC8vIFJldHVybnMgYSBNYXBJdGVyYXRvciByZWZlcnJpbmcgdG8gdGhlIHRoZW9yZXRpY2FsIGVsZW1lbnQgdGhhdCB3b3VsZAorICAvLyBmb2xsb3cgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgbWFwIGZpZWxkLiBJdCBkb2VzIG5vdCBwb2ludCB0byBhbnkKKyAgLy8gcmVhbCBlbGVtZW50LiBNdXRhdGlvbiB0byB0aGUgZmllbGQgbWF5IGludmFsaWRhdGUgdGhlIGl0ZXJhdG9yLgorICBNYXBJdGVyYXRvciBNYXBFbmQoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgPGtleSwgdmFsdWU+IHBhaXIgb2YgYSBtYXAgZmllbGQuIFRoZSByZXN1bHQgbWF5IGJlCisgIC8vIGRpZmZlcmVudCBmcm9tIEZpZWxkU2l6ZSB3aGljaCBjYW4gaGF2ZSBkdXBsaWNhdGUga2V5cy4KKyAgaW50IE1hcFNpemUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgLy8gSGVscCBtZXRob2QgZm9yIE1hcEl0ZXJhdG9yLgorICBmcmllbmQgY2xhc3MgTWFwSXRlcmF0b3I7CisgIGZyaWVuZCBjbGFzcyBXaXJlRm9ybWF0Rm9yTWFwRmllbGRUZXN0OworICBpbnRlcm5hbDo6TWFwRmllbGRCYXNlKiBNdXRhYmxlTWFwRGF0YShNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworICBjb25zdCBpbnRlcm5hbDo6TWFwRmllbGRCYXNlKiBHZXRNYXBEYXRhKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIGNvbnN0IFQmIEdldFJhd05vbk9uZW9mKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgVCogTXV0YWJsZVJhd05vbk9uZW9mKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBjb25zdCBUeXBlJiBHZXRSYXcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KKyAgaW5saW5lIFR5cGUqIE11dGFibGVSYXcoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBjb25zdCBUeXBlJiBEZWZhdWx0UmF3KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIGNvbnN0IE1lc3NhZ2UqIEdldERlZmF1bHRNZXNzYWdlSW5zdGFuY2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgaW5saW5lIGNvbnN0IHVpbnQzMl90KiBHZXRIYXNCaXRzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OworICBpbmxpbmUgdWludDMyX3QqIE11dGFibGVIYXNCaXRzKE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0OworICBpbmxpbmUgdWludDMyX3QgR2V0T25lb2ZDYXNlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZXNjcmlwdG9yKSBjb25zdDsKKyAgaW5saW5lIHVpbnQzMl90KiBNdXRhYmxlT25lb2ZDYXNlKAorICAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZXNjcmlwdG9yKSBjb25zdDsKKyAgaW5saW5lIGJvb2wgSGFzRXh0ZW5zaW9uU2V0KGNvbnN0IE1lc3NhZ2UmIC8qIG1lc3NhZ2UgKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gc2NoZW1hXy5IYXNFeHRlbnNpb25TZXQoKTsKKyAgfQorICBjb25zdCBpbnRlcm5hbDo6RXh0ZW5zaW9uU2V0JiBHZXRFeHRlbnNpb25TZXQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3Q7CisgIGludGVybmFsOjpFeHRlbnNpb25TZXQqIE11dGFibGVFeHRlbnNpb25TZXQoTWVzc2FnZSogbWVzc2FnZSkgY29uc3Q7CisKKyAgY29uc3QgaW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGEmIEdldEludGVybmFsTWV0YWRhdGEoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdDsKKworICBpbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YSogTXV0YWJsZUludGVybmFsTWV0YWRhdGEoTWVzc2FnZSogbWVzc2FnZSkgY29uc3Q7CisKKyAgaW5saW5lIGJvb2wgSXNJbmxpbmVkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIGlubGluZSBib29sIEhhc0JpdChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGlubGluZSB2b2lkIFNldEJpdChNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgQ2xlYXJCaXQoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGlubGluZSB2b2lkIFN3YXBCaXQoTWVzc2FnZSogbWVzc2FnZTEsIE1lc3NhZ2UqIG1lc3NhZ2UyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIGlubGluZSBjb25zdCB1aW50MzJfdCogR2V0SW5saW5lZFN0cmluZ0RvbmF0ZWRBcnJheSgKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OworICBpbmxpbmUgdWludDMyX3QqIE11dGFibGVJbmxpbmVkU3RyaW5nRG9uYXRlZEFycmF5KE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0OworICBpbmxpbmUgYm9vbCBJc0lubGluZWRTdHJpbmdEb25hdGVkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGlubGluZSB2b2lkIFN3YXBJbmxpbmVkU3RyaW5nRG9uYXRlZChNZXNzYWdlKiBsaHMsIE1lc3NhZ2UqIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIC8vIFNoYWxsb3ctc3dhcCBmaWVsZHMgbGlzdGVkIGluIGZpZWxkcyB2ZWN0b3Igb2YgdHdvIG1lc3NhZ2VzLiBJdCBpcyB0aGUKKyAgLy8gY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHNoYWxsb3cgc3dhcCBpcyBzYWZlLgorICB2b2lkIFVuc2FmZVNoYWxsb3dTd2FwRmllbGRzKAorICAgICAgTWVzc2FnZSogbWVzc2FnZTEsIE1lc3NhZ2UqIG1lc3NhZ2UyLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGZpZWxkcykgY29uc3Q7CisKKyAgLy8gVGhpcyBmdW5jdGlvbiBvbmx5IHN3YXBzIHRoZSBmaWVsZC4gU2hvdWxkIHN3YXAgY29ycmVzcG9uZGluZyBoYXNfYml0CisgIC8vIGJlZm9yZSBvciBhZnRlciB1c2luZyB0aGlzIGZ1bmN0aW9uLgorICB2b2lkIFN3YXBGaWVsZChNZXNzYWdlKiBtZXNzYWdlMSwgTWVzc2FnZSogbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIC8vIFVuc2FmZSBidXQgc2hhbGxvdyB2ZXJzaW9uIG9mIFN3YXBGaWVsZC4KKyAgdm9pZCBVbnNhZmVTaGFsbG93U3dhcEZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UxLCBNZXNzYWdlKiBtZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIHRlbXBsYXRlIDxib29sIHVuc2FmZV9zaGFsbG93X3N3YXA+CisgIHZvaWQgU3dhcEZpZWxkc0ltcGwoTWVzc2FnZSogbWVzc2FnZTEsIE1lc3NhZ2UqIG1lc3NhZ2UyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+JiBmaWVsZHMpIGNvbnN0OworCisgIHRlbXBsYXRlIDxib29sIHVuc2FmZV9zaGFsbG93X3N3YXA+CisgIHZvaWQgU3dhcE9uZW9mRmllbGQoTWVzc2FnZSogbGhzLCBNZXNzYWdlKiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZXNjcmlwdG9yKSBjb25zdDsKKworICBpbmxpbmUgYm9vbCBIYXNPbmVvZkZpZWxkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGlubGluZSB2b2lkIFNldE9uZW9mQ2FzZShNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGlubGluZSB2b2lkIENsZWFyT25lb2ZGaWVsZChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CisgIGlubGluZSBjb25zdCBUeXBlJiBHZXRGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBpbmxpbmUgdm9pZCBTZXRGaWVsZChNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlJiB2YWx1ZSkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBpbmxpbmUgVHlwZSogTXV0YWJsZUZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBpbmxpbmUgY29uc3QgVHlwZSYgR2V0UmVwZWF0ZWRGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KKyAgaW5saW5lIGNvbnN0IFR5cGUmIEdldFJlcGVhdGVkUHRyRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CisgIGlubGluZSB2b2lkIFNldFJlcGVhdGVkRmllbGQoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIFR5cGUgdmFsdWUpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KKyAgaW5saW5lIFR5cGUqIE11dGFibGVSZXBlYXRlZEZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CisgIGlubGluZSB2b2lkIEFkZEZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUmIHZhbHVlKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CisgIGlubGluZSBUeXBlKiBBZGRGaWVsZChNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworICBpbnQgR2V0RXh0ZW5zaW9uTnVtYmVyT3JEaWUoY29uc3QgRGVzY3JpcHRvciogdHlwZSkgY29uc3Q7CisKKyAgLy8gSW50ZXJuYWwgdmVyc2lvbnMgb2YgRW51bVZhbHVlIEFQSSBwZXJmb3JtIG5vIGNoZWNraW5nLiBDYWxsZWQgYWZ0ZXIgY2hlY2tzCisgIC8vIGJ5IHB1YmxpYyBtZXRob2RzLgorICB2b2lkIFNldEVudW1WYWx1ZUludGVybmFsKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSBjb25zdDsKKyAgdm9pZCBTZXRSZXBlYXRlZEVudW1WYWx1ZUludGVybmFsKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIGNvbnN0OworICB2b2lkIEFkZEVudW1WYWx1ZUludGVybmFsKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSBjb25zdDsKKworICBmcmllbmQgaW5saW5lICAvLyBpbmxpbmUgc28gbm9ib2R5IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24uCisgICAgICB2b2lkCisgICAgICBSZWdpc3RlckFsbFR5cGVzSW50ZXJuYWwoY29uc3QgTWV0YWRhdGEqIGZpbGVfbGV2ZWxfbWV0YWRhdGEsIGludCBzaXplKTsKKyAgZnJpZW5kIGlubGluZSBjb25zdCBjaGFyKiBQYXJzZUxlbkRlbGltKGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCk7CisgIGZyaWVuZCBpbmxpbmUgY29uc3QgY2hhciogUGFyc2VQYWNrZWRGaWVsZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCk7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlZmxlY3Rpb24pOworfTsKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhIGZhY3RvcnkgZm9yIG1lc3NhZ2Ugb2JqZWN0cy4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBNZXNzYWdlRmFjdG9yeSB7CisgcHVibGljOgorICBpbmxpbmUgTWVzc2FnZUZhY3RvcnkoKSB7fQorICB2aXJ0dWFsIH5NZXNzYWdlRmFjdG9yeSgpOworCisgIC8vIEdpdmVuIGEgRGVzY3JpcHRvciwgZ2V0cyBvciBjb25zdHJ1Y3RzIHRoZSBkZWZhdWx0IChwcm90b3R5cGUpIE1lc3NhZ2UKKyAgLy8gb2YgdGhhdCB0eXBlLiAgWW91IGNhbiB0aGVuIGNhbGwgdGhhdCBtZXNzYWdlJ3MgTmV3KCkgbWV0aG9kIHRvIGNvbnN0cnVjdAorICAvLyBhIG11dGFibGUgbWVzc2FnZSBvZiB0aGF0IHR5cGUuCisgIC8vCisgIC8vIENhbGxpbmcgdGhpcyBtZXRob2QgdHdpY2Ugd2l0aCB0aGUgc2FtZSBEZXNjcmlwdG9yIHJldHVybnMgdGhlIHNhbWUKKyAgLy8gb2JqZWN0LiAgVGhlIHJldHVybmVkIG9iamVjdCByZW1haW5zIHByb3BlcnR5IG9mIHRoZSBmYWN0b3J5LiAgQWxzbywgYW55CisgIC8vIG9iamVjdHMgY3JlYXRlZCBieSBjYWxsaW5nIHRoZSBwcm90b3R5cGUncyBOZXcoKSBtZXRob2Qgc2hhcmUgc29tZSBkYXRhCisgIC8vIHdpdGggdGhlIHByb3RvdHlwZSwgc28gdGhlc2UgbXVzdCBiZSBkZXN0cm95ZWQgYmVmb3JlIHRoZSBNZXNzYWdlRmFjdG9yeQorICAvLyBpcyBkZXN0cm95ZWQuCisgIC8vCisgIC8vIFRoZSBnaXZlbiBkZXNjcmlwdG9yIG11c3Qgb3V0bGl2ZSB0aGUgcmV0dXJuZWQgbWVzc2FnZSwgYW5kIGhlbmNlIG11c3QKKyAgLy8gb3V0bGl2ZSB0aGUgTWVzc2FnZUZhY3RvcnkuCisgIC8vCisgIC8vIFNvbWUgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBzdXBwb3J0IGFsbCB0eXBlcy4gIEdldFByb3RvdHlwZSgpIHdpbGwKKyAgLy8gcmV0dXJuIG51bGxwdHIgaWYgdGhlIGRlc2NyaXB0b3IgcGFzc2VkIGluIGlzIG5vdCBzdXBwb3J0ZWQuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIG1heSBvciBtYXkgbm90IGJlIHRocmVhZC1zYWZlIGRlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCisgIC8vIEVhY2ggaW1wbGVtZW50YXRpb24gc2hvdWxkIGRvY3VtZW50IGl0cyBvd24gZGVncmVlIHRocmVhZC1zYWZldHkuCisgIHZpcnR1YWwgY29uc3QgTWVzc2FnZSogR2V0UHJvdG90eXBlKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpID0gMDsKKworICAvLyBHZXRzIGEgTWVzc2FnZUZhY3Rvcnkgd2hpY2ggc3VwcG9ydHMgYWxsIGdlbmVyYXRlZCwgY29tcGlsZWQtaW4gbWVzc2FnZXMuCisgIC8vIEluIG90aGVyIHdvcmRzLCBmb3IgYW55IGNvbXBpbGVkLWluIHR5cGUgRm9vTWVzc2FnZSwgdGhlIGZvbGxvd2luZyBpcyB0cnVlOgorICAvLyAgIE1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLT5HZXRQcm90b3R5cGUoCisgIC8vICAgICBGb29NZXNzYWdlOjpkZXNjcmlwdG9yKCkpID09IEZvb01lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKQorICAvLyBUaGlzIGZhY3Rvcnkgc3VwcG9ydHMgYWxsIHR5cGVzIHdoaWNoIGFyZSBmb3VuZCBpbgorICAvLyBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS4gIElmIGdpdmVuIGEgZGVzY3JpcHRvciBmcm9tIGFueSBvdGhlcgorICAvLyBwb29sLCBHZXRQcm90b3R5cGUoKSB3aWxsIHJldHVybiBudWxscHRyLiAgKFlvdSBjYW4gYWxzbyBjaGVjayBpZiBhCisgIC8vIGRlc2NyaXB0b3IgaXMgZm9yIGEgZ2VuZXJhdGVkIG1lc3NhZ2UgYnkgY2hlY2tpbmcgaWYKKyAgLy8gZGVzY3JpcHRvci0+ZmlsZSgpLT5wb29sKCkgPT0gRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkuKQorICAvLworICAvLyBUaGlzIGZhY3RvcnkgaXMgMTAwJSB0aHJlYWQtc2FmZTsgY2FsbGluZyBHZXRQcm90b3R5cGUoKSBkb2VzIG5vdCBtb2RpZnkKKyAgLy8gYW55IHNoYXJlZCBkYXRhLgorICAvLworICAvLyBUaGlzIGZhY3RvcnkgaXMgYSBzaW5nbGV0b24uICBUaGUgY2FsbGVyIG11c3Qgbm90IGRlbGV0ZSB0aGUgb2JqZWN0LgorICBzdGF0aWMgTWVzc2FnZUZhY3RvcnkqIGdlbmVyYXRlZF9mYWN0b3J5KCk7CisKKyAgLy8gRm9yIGludGVybmFsIHVzZSBvbmx5OiAgUmVnaXN0ZXJzIGEgLnByb3RvIGZpbGUgYXQgc3RhdGljIGluaXRpYWxpemF0aW9uCisgIC8vIHRpbWUsIHRvIGJlIHBsYWNlZCBpbiBnZW5lcmF0ZWRfZmFjdG9yeS4gIFRoZSBmaXJzdCB0aW1lIEdldFByb3RvdHlwZSgpCisgIC8vIGlzIGNhbGxlZCB3aXRoIGEgZGVzY3JpcHRvciBmcm9tIHRoaXMgZmlsZSwgfHJlZ2lzdGVyX21lc3NhZ2VzfCB3aWxsIGJlCisgIC8vIGNhbGxlZCwgd2l0aCB0aGUgZmlsZSBuYW1lIGFzIHRoZSBwYXJhbWV0ZXIuICBJdCBtdXN0IGNhbGwKKyAgLy8gSW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoKSAoYmVsb3cpIHRvIHJlZ2lzdGVyIGVhY2ggbWVzc2FnZSB0eXBlCisgIC8vIGluIHRoZSBmaWxlLiAgVGhpcyBzdHJhbmdlIG1lY2hhbmlzbSBpcyBuZWNlc3NhcnkgYmVjYXVzZSBkZXNjcmlwdG9ycyBhcmUKKyAgLy8gYnVpbHQgbGF6aWx5LCBzbyB3ZSBjYW4ndCByZWdpc3RlciB0eXBlcyBieSB0aGVpciBkZXNjcmlwdG9yIHVudGlsIHdlCisgIC8vIGtub3cgdGhhdCB0aGUgZGVzY3JpcHRvciBleGlzdHMuICB8ZmlsZW5hbWV8IG11c3QgYmUgYSBwZXJtYW5lbnQgc3RyaW5nLgorICBzdGF0aWMgdm9pZCBJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkRmlsZSgKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEZXNjcmlwdG9yVGFibGUqIHRhYmxlKTsKKworICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHk6ICBSZWdpc3RlcnMgYSBtZXNzYWdlIHR5cGUuICBDYWxsZWQgb25seSBieSB0aGUKKyAgLy8gZnVuY3Rpb25zIHdoaWNoIGFyZSByZWdpc3RlcmVkIHdpdGggSW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZEZpbGUoKSwKKyAgLy8gYWJvdmUuCisgIHN0YXRpYyB2b2lkIEludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIHByb3RvdHlwZSk7CisKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXNzYWdlRmFjdG9yeSk7Cit9OworCisjZGVmaW5lIERFQ0xBUkVfR0VUX1JFUEVBVEVEX0ZJRUxEKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUFJPVE9CVUZfRVhQT1JUIGNvbnN0IFJlcGVhdGVkRmllbGQ8VFlQRT4mICAgICAgICAgICAgICAgICAgICAgICBcCisgIFJlZmxlY3Rpb246OkdldFJlcGVhdGVkRmllbGRJbnRlcm5hbDxUWVBFPiggICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQUk9UT0JVRl9FWFBPUlQgUmVwZWF0ZWRGaWVsZDxUWVBFPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUmVmbGVjdGlvbjo6TXV0YWJsZVJlcGVhdGVkRmllbGRJbnRlcm5hbDxUWVBFPiggICAgICAgICAgICAgICAgICBcCisgICAgICBNZXNzYWdlICogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKK0RFQ0xBUkVfR0VUX1JFUEVBVEVEX0ZJRUxEKGludDMyX3QpCitERUNMQVJFX0dFVF9SRVBFQVRFRF9GSUVMRChpbnQ2NF90KQorREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQodWludDMyX3QpCitERUNMQVJFX0dFVF9SRVBFQVRFRF9GSUVMRCh1aW50NjRfdCkKK0RFQ0xBUkVfR0VUX1JFUEVBVEVEX0ZJRUxEKGZsb2F0KQorREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQoZG91YmxlKQorREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQoYm9vbCkKKworI3VuZGVmIERFQ0xBUkVfR0VUX1JFUEVBVEVEX0ZJRUxECisKKy8vIFRyaWVzIHRvIGRvd25jYXN0IHRoaXMgbWVzc2FnZSB0byBhIGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUuICBSZXR1cm5zIG51bGxwdHIKKy8vIGlmIHRoaXMgY2xhc3MgaXMgbm90IGFuIGluc3RhbmNlIG9mIFQuICBUaGlzIHdvcmtzIGV2ZW4gaWYgUlRUSSBpcyBkaXNhYmxlZC4KKy8vCisvLyBUaGlzIGFsc28gaGFzIHRoZSBlZmZlY3Qgb2YgY3JlYXRpbmcgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIFQgdGhhdCB3aWxsCisvLyBwcmV2ZW50IHRoZSBsaW5rZXIgZnJvbSBzdHJpcHBpbmcgaXQgb3V0IGF0IGxpbmsgdGltZS4gIFRoaXMgY2FuIGJlIGltcG9ydGFudAorLy8gaWYgeW91IGFyZSB1c2luZyBhIER5bmFtaWNNZXNzYWdlRmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGUgZ2VuZXJhdGVkCisvLyBmYWN0b3J5LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citjb25zdCBUKiBEeW5hbWljQ2FzdFRvR2VuZXJhdGVkKGNvbnN0IE1lc3NhZ2UqIGZyb20pIHsKKyAgLy8gQ29tcGlsZS10aW1lIGFzc2VydCB0aGF0IFQgaXMgYSBnZW5lcmF0ZWQgdHlwZSB0aGF0IGhhcyBhCisgIC8vIGRlZmF1bHRfaW5zdGFuY2UoKSBhY2Nlc3NvciwgYnV0IGF2b2lkIGFjdHVhbGx5IGNhbGxpbmcgaXQuCisgIGNvbnN0IFQmICgqZ2V0X2RlZmF1bHRfaW5zdGFuY2UpKCkgPSAmVDo6ZGVmYXVsdF9pbnN0YW5jZTsKKyAgKHZvaWQpZ2V0X2RlZmF1bHRfaW5zdGFuY2U7CisKKyAgLy8gQ29tcGlsZS10aW1lIGFzc2VydCB0aGF0IFQgaXMgYSBzdWJjbGFzcyBvZiBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlLgorICBjb25zdCBNZXNzYWdlKiB1bnVzZWQgPSBzdGF0aWNfY2FzdDxUKj4obnVsbHB0cik7CisgICh2b2lkKXVudXNlZDsKKworI2lmIFBST1RPQlVGX1JUVEkKKyAgcmV0dXJuIGR5bmFtaWNfY2FzdDxjb25zdCBUKj4oZnJvbSk7CisjZWxzZQorICBib29sIG9rID0gZnJvbSAhPSBudWxscHRyICYmCisgICAgICAgICAgICBUOjpkZWZhdWx0X2luc3RhbmNlKCkuR2V0UmVmbGVjdGlvbigpID09IGZyb20tPkdldFJlZmxlY3Rpb24oKTsKKyAgcmV0dXJuIG9rID8gZG93bl9jYXN0PGNvbnN0IFQqPihmcm9tKSA6IG51bGxwdHI7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUKiBEeW5hbWljQ2FzdFRvR2VuZXJhdGVkKE1lc3NhZ2UqIGZyb20pIHsKKyAgY29uc3QgTWVzc2FnZSogbWVzc2FnZV9jb25zdCA9IGZyb207CisgIHJldHVybiBjb25zdF9jYXN0PFQqPihEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPFQ+KG1lc3NhZ2VfY29uc3QpKTsKK30KKworLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IHRoaXMgbWVzc2FnZSdzIHJlZmxlY3Rpb24gaXMgbGlua2VkIGludG8KKy8vIHRoZSBiaW5hcnk6CisvLworLy8gICBnb29nbGU6OnByb3RvYnVmOjpMaW5rTWVzc2FnZVJlZmxlY3Rpb248cGtnOjpGb29NZXNzYWdlPigpOworLy8KKy8vIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgZm9sbG93aW5nIGxvb2t1cCB3aWxsIHN1Y2NlZWQ6CisvLworLy8gICBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJwa2cuRm9vTWVzc2FnZSIpOworLy8KKy8vIEFzIGEgc2lkZS1lZmZlY3QsIGl0IHdpbGwgYWxzbyBndWFyYW50ZWUgdGhhdCBhbnl0aGluZyBlbHNlIGZyb20gdGhlIHNhbWUKKy8vIC5wcm90byBmaWxlIHdpbGwgYWxzbyBiZSBhdmFpbGFibGUgZm9yIGxvb2t1cCBpbiB0aGUgZ2VuZXJhdGVkIHBvb2wuCisvLworLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY3R1YWxseSByZWdpc3RlciB0aGUgbWVzc2FnZSwgc28gaXQgZG9lcyBub3QgbmVlZAorLy8gdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgbG9va3VwLiAgSG93ZXZlciBpdCBkb2VzIG5lZWQgdG8gb2NjdXIgaW4gYSBmdW5jdGlvbgorLy8gdGhhdCBjYW5ub3QgYmUgc3RyaXBwZWQgZnJvbSB0aGUgYmluYXJ5IChpZS4gaXQgbXVzdCBiZSByZWFjaGFibGUgZnJvbSBtYWluKS4KKy8vCisvLyBCZXN0IHByYWN0aWNlIGlzIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB3aGVyZSB0aGUKKy8vIHJlZmxlY3Rpb24gaXMgYWN0dWFsbHkgbmVlZGVkLiAgVGhpcyBmdW5jdGlvbiBpcyB2ZXJ5IGNoZWFwIHRvIGNhbGwsIHNvIHlvdQorLy8gc2hvdWxkIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IGl0cyBydW50aW1lIG92ZXJoZWFkIGV4Y2VwdCBpbiB0aGUgdGlnaHRlc3QKKy8vIG9mIGxvb3BzIChvbiB4ODYtNjQgaXQgY29tcGlsZXMgaW50byB0d28gIm1vdiIgaW5zdHJ1Y3Rpb25zKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBMaW5rTWVzc2FnZVJlZmxlY3Rpb24oKSB7CisgIGludGVybmFsOjpTdHJvbmdSZWZlcmVuY2UoVDo6ZGVmYXVsdF9pbnN0YW5jZSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZvciB7R2V0LE11dGFibGV9UmF3UmVwZWF0ZWRQdHJGaWVsZC4gIFdlIHByb3ZpZGUKKy8vIHNwZWNpYWxpemF0aW9ucyBmb3IgPHN0ZDo6c3RyaW5nPiwgPFN0cmluZ1BpZWNlRmllbGQ+IGFuZCA8TWVzc2FnZT4gYW5kCisvLyBoYW5kbGUgZXZlcnl0aGluZyBlbHNlIHdpdGggdGhlIGRlZmF1bHQgdGVtcGxhdGUgd2hpY2ggd2lsbCBtYXRjaCBhbnkgdHlwZQorLy8gaGF2aW5nIGEgbWV0aG9kIHdpdGggc2lnbmF0dXJlICJzdGF0aWMgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvcioKKy8vIGRlc2NyaXB0b3IoKSIuIFN1Y2ggYSB0eXBlIHByZXN1bWFibHkgaXMgYSBkZXNjZW5kYW50IG9mIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UuCisKK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4mCitSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZFB0ckZpZWxkSW50ZXJuYWw8c3RkOjpzdHJpbmc+KAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgcmV0dXJuICpzdGF0aWNfY2FzdDxSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPio+KAorICAgICAgTXV0YWJsZVJhd1JlcGVhdGVkU3RyaW5nKGNvbnN0X2Nhc3Q8TWVzc2FnZSo+KCZtZXNzYWdlKSwgZmllbGQsIHRydWUpKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPioKK1JlZmxlY3Rpb246Ok11dGFibGVSZXBlYXRlZFB0ckZpZWxkSW50ZXJuYWw8c3RkOjpzdHJpbmc+KAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Kj4oCisgICAgICBNdXRhYmxlUmF3UmVwZWF0ZWRTdHJpbmcobWVzc2FnZSwgZmllbGQsIHRydWUpKTsKK30KKworCisvLyAtLS0tLQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4mIFJlZmxlY3Rpb246OkdldFJlcGVhdGVkUHRyRmllbGRJbnRlcm5hbCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPio+KEdldFJhd1JlcGVhdGVkRmllbGQoCisgICAgICBtZXNzYWdlLCBmaWVsZCwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UsIC0xLCBudWxscHRyKSk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiogUmVmbGVjdGlvbjo6TXV0YWJsZVJlcGVhdGVkUHRyRmllbGRJbnRlcm5hbCgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+Kj4oTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQoCisgICAgICBtZXNzYWdlLCBmaWVsZCwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UsIC0xLCBudWxscHRyKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBQQj4KK2lubGluZSBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPFBCPiYgUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRQdHJGaWVsZEludGVybmFsKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBSZXBlYXRlZFB0ckZpZWxkPFBCPio+KAorICAgICAgR2V0UmF3UmVwZWF0ZWRGaWVsZChtZXNzYWdlLCBmaWVsZCwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQQjo6ZGVmYXVsdF9pbnN0YW5jZSgpLkdldERlc2NyaXB0b3IoKSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUEI+CitpbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZDxQQj4qIFJlZmxlY3Rpb246Ok11dGFibGVSZXBlYXRlZFB0ckZpZWxkSW50ZXJuYWwoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxQQj4qPigKKyAgICAgIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKG1lc3NhZ2UsIGZpZWxkLCBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCBQQjo6ZGVmYXVsdF9pbnN0YW5jZSgpLkdldERlc2NyaXB0b3IoKSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2NvbnN0IFR5cGUmIFJlZmxlY3Rpb246OkRlZmF1bHRSYXcoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVHlwZSo+KHNjaGVtYV8uR2V0RmllbGREZWZhdWx0KGZpZWxkKSk7Cit9CisKK3VpbnQzMl90IFJlZmxlY3Rpb246OkdldE9uZW9mQ2FzZSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyghb25lb2ZfZGVzY3JpcHRvci0+aXNfc3ludGhldGljKCkpOworICByZXR1cm4gaW50ZXJuYWw6OkdldENvbnN0UmVmQXRPZmZzZXQ8dWludDMyX3Q+KAorICAgICAgbWVzc2FnZSwgc2NoZW1hXy5HZXRPbmVvZkNhc2VPZmZzZXQob25lb2ZfZGVzY3JpcHRvcikpOworfQorCitib29sIFJlZmxlY3Rpb246Okhhc09uZW9mRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHJldHVybiAoR2V0T25lb2ZDYXNlKG1lc3NhZ2UsIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpID09CisgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGZpZWxkLT5udW1iZXIoKSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2NvbnN0IFR5cGUmIFJlZmxlY3Rpb246OkdldFJhdyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyghc2NoZW1hXy5JblJlYWxPbmVvZihmaWVsZCkgfHwgSGFzT25lb2ZGaWVsZChtZXNzYWdlLCBmaWVsZCkpCisgICAgICA8PCAiRmllbGQgPSAiIDw8IGZpZWxkLT5mdWxsX25hbWUoKTsKKyAgcmV0dXJuIGludGVybmFsOjpHZXRDb25zdFJlZkF0T2Zmc2V0PFR5cGU+KG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFfLkdldEZpZWxkT2Zmc2V0KGZpZWxkKSk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTUVTU0FHRV9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE2NmMxOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmNjCkBAIC0wLDAgKzEsNjAyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yczogd2lua0Bnb29nbGUuY29tIChXaW5rIFNhdmlsbGUpLAorLy8gICAgICAgICAga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorCisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wYXJzZV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbXV0ZXguaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworc3RkOjpzdHJpbmcgTWVzc2FnZUxpdGU6OkluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSBjb25zdCB7CisgIHJldHVybiAiKGNhbm5vdCBkZXRlcm1pbmUgbWlzc2luZyBmaWVsZHMgZm9yIGxpdGUgbWVzc2FnZSkiOworfQorCitzdGQ6OnN0cmluZyBNZXNzYWdlTGl0ZTo6RGVidWdTdHJpbmcoKSBjb25zdCB7CisgIHN0ZDo6dWludHB0cl90IGFkZHJlc3MgPSByZWludGVycHJldF9jYXN0PHN0ZDo6dWludHB0cl90Pih0aGlzKTsKKyAgcmV0dXJuIFN0ckNhdCgiTWVzc2FnZUxpdGUgYXQgMHgiLCBzdHJpbmdzOjpIZXgoYWRkcmVzcykpOworfQorCituYW1lc3BhY2UgeworCisvLyBXaGVuIHNlcmlhbGl6aW5nLCB3ZSBmaXJzdCBjb21wdXRlIHRoZSBieXRlIHNpemUsIHRoZW4gc2VyaWFsaXplIHRoZSBtZXNzYWdlLgorLy8gSWYgc2VyaWFsaXphdGlvbiBwcm9kdWNlcyBhIGRpZmZlcmVudCBudW1iZXIgb2YgYnl0ZXMgdGhhbiBleHBlY3RlZCwgd2UKKy8vIGNhbGwgdGhpcyBmdW5jdGlvbiwgd2hpY2ggY3Jhc2hlcy4gIFRoZSBwcm9ibGVtIGNvdWxkIGJlIGR1ZSB0byBhIGJ1ZyBpbiB0aGUKKy8vIHByb3RvYnVmIGltcGxlbWVudGF0aW9uIGJ1dCBpcyBtb3JlIGxpa2VseSBjYXVzZWQgYnkgY29uY3VycmVudCBtb2RpZmljYXRpb24KKy8vIG9mIHRoZSBtZXNzYWdlLiAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSB0d28gYW5kCisvLyBwcm92aWRlIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UuCit2b2lkIEJ5dGVTaXplQ29uc2lzdGVuY3lFcnJvcihzaXplX3QgYnl0ZV9zaXplX2JlZm9yZV9zZXJpYWxpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVfc2l6ZV9hZnRlcl9zZXJpYWxpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzX3Byb2R1Y2VkX2J5X3NlcmlhbGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgbWVzc2FnZSkgeworICBHT09HTEVfQ0hFQ0tfRVEoYnl0ZV9zaXplX2JlZm9yZV9zZXJpYWxpemF0aW9uLCBieXRlX3NpemVfYWZ0ZXJfc2VyaWFsaXphdGlvbikKKyAgICAgIDw8IG1lc3NhZ2UuR2V0VHlwZU5hbWUoKQorICAgICAgPDwgIiB3YXMgbW9kaWZpZWQgY29uY3VycmVudGx5IGR1cmluZyBzZXJpYWxpemF0aW9uLiI7CisgIEdPT0dMRV9DSEVDS19FUShieXRlc19wcm9kdWNlZF9ieV9zZXJpYWxpemF0aW9uLCBieXRlX3NpemVfYmVmb3JlX3NlcmlhbGl6YXRpb24pCisgICAgICA8PCAiQnl0ZSBzaXplIGNhbGN1bGF0aW9uIGFuZCBzZXJpYWxpemF0aW9uIHdlcmUgaW5jb25zaXN0ZW50LiAgVGhpcyAiCisgICAgICAgICAibWF5IGluZGljYXRlIGEgYnVnIGluIHByb3RvY29sIGJ1ZmZlcnMgb3IgaXQgbWF5IGJlIGNhdXNlZCBieSAiCisgICAgICAgICAiY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgIgorICAgICAgPDwgbWVzc2FnZS5HZXRUeXBlTmFtZSgpIDw8ICIuIjsKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlRoaXMgc2hvdWxkbid0IGJlIGNhbGxlZCBpZiBhbGwgdGhlIHNpemVzIGFyZSBlcXVhbC4iOworfQorCitzdGQ6OnN0cmluZyBJbml0aWFsaXphdGlvbkVycm9yTWVzc2FnZShjb25zdCBjaGFyKiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgbWVzc2FnZSkgeworICAvLyBOb3RlOiAgV2Ugd2FudCB0byBhdm9pZCBkZXBlbmRpbmcgb24gc3RydXRpbCBpbiB0aGUgbGl0ZSBsaWJyYXJ5LCBvdGhlcndpc2UKKyAgLy8gICB3ZSdkIHVzZToKKyAgLy8KKyAgLy8gcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgIC8vICAgIkNhbid0ICQwIG1lc3NhZ2Ugb2YgdHlwZSBcIiQxXCIgYmVjYXVzZSBpdCBpcyBtaXNzaW5nIHJlcXVpcmVkICIKKyAgLy8gICAiZmllbGRzOiAkMiIsCisgIC8vICAgYWN0aW9uLCBtZXNzYWdlLkdldFR5cGVOYW1lKCksCisgIC8vICAgbWVzc2FnZS5Jbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkpOworCisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0ICs9ICJDYW4ndCAiOworICByZXN1bHQgKz0gYWN0aW9uOworICByZXN1bHQgKz0gIiBtZXNzYWdlIG9mIHR5cGUgXCIiOworICByZXN1bHQgKz0gbWVzc2FnZS5HZXRUeXBlTmFtZSgpOworICByZXN1bHQgKz0gIlwiIGJlY2F1c2UgaXQgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICI7CisgIHJlc3VsdCArPSBtZXNzYWdlLkluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW5saW5lIFN0cmluZ1BpZWNlIGFzX3N0cmluZ192aWV3KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKSB7CisgIHJldHVybiBTdHJpbmdQaWVjZShzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSksIHNpemUpOworfQorCisvLyBSZXR1cm5zIHRydWUgb2YgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudCAvIGhhdmUgdmFsdWVzLgoraW5saW5lIGJvb2wgQ2hlY2tGaWVsZFByZXNlbmNlKGNvbnN0IGludGVybmFsOjpQYXJzZUNvbnRleHQmIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlOjpQYXJzZUZsYWdzIHBhcnNlX2ZsYWdzKSB7CisgICh2b2lkKWN0eDsgIC8vIFBhcmFtZXRlciBpcyB1c2VkIGJ5IEdvb2dsZS1pbnRlcm5hbCBjb2RlLgorICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSgocGFyc2VfZmxhZ3MgJiBNZXNzYWdlTGl0ZTo6a01lcmdlUGFydGlhbCkgIT0gMCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gbXNnLklzSW5pdGlhbGl6ZWRXaXRoRXJyb3JzKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIE1lc3NhZ2VMaXRlOjpMb2dJbml0aWFsaXphdGlvbkVycm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgR09PR0xFX0xPRyhFUlJPUikgPDwgSW5pdGlhbGl6YXRpb25FcnJvck1lc3NhZ2UoInBhcnNlIiwgKnRoaXMpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8Ym9vbCBhbGlhc2luZz4KK2Jvb2wgTWVyZ2VGcm9tSW1wbChTdHJpbmdQaWVjZSBpbnB1dCwgTWVzc2FnZUxpdGUqIG1zZywKKyAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZTo6UGFyc2VGbGFncyBwYXJzZV9mbGFncykgeworICBjb25zdCBjaGFyKiBwdHI7CisgIGludGVybmFsOjpQYXJzZUNvbnRleHQgY3R4KGlvOjpDb2RlZElucHV0U3RyZWFtOjpHZXREZWZhdWx0UmVjdXJzaW9uTGltaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNpbmcsICZwdHIsIGlucHV0KTsKKyAgcHRyID0gbXNnLT5fSW50ZXJuYWxQYXJzZShwdHIsICZjdHgpOworICAvLyBjdHggaGFzIGFuIGV4cGxpY2l0IGxpbWl0IHNldCAobGVuZ3RoIG9mIHN0cmluZ192aWV3KS4KKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShwdHIgJiYgY3R4LkVuZGVkQXRMaW1pdCgpKSkgeworICAgIHJldHVybiBDaGVja0ZpZWxkUHJlc2VuY2UoY3R4LCAqbXNnLCBwYXJzZV9mbGFncyk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Ym9vbCBhbGlhc2luZz4KK2Jvb2wgTWVyZ2VGcm9tSW1wbChpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIE1lc3NhZ2VMaXRlKiBtc2csCisgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGU6OlBhcnNlRmxhZ3MgcGFyc2VfZmxhZ3MpIHsKKyAgY29uc3QgY2hhciogcHRyOworICBpbnRlcm5hbDo6UGFyc2VDb250ZXh0IGN0eChpbzo6Q29kZWRJbnB1dFN0cmVhbTo6R2V0RGVmYXVsdFJlY3Vyc2lvbkxpbWl0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzaW5nLCAmcHRyLCBpbnB1dCk7CisgIHB0ciA9IG1zZy0+X0ludGVybmFsUGFyc2UocHRyLCAmY3R4KTsKKyAgLy8gY3R4IGhhcyBubyBleHBsaWNpdCBsaW1pdCAoaGVuY2Ugd2UgZW5kIG9uIGVuZCBvZiBzdHJlYW0pCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUocHRyICYmIGN0eC5FbmRlZEF0RW5kT2ZTdHJlYW0oKSkpIHsKKyAgICByZXR1cm4gQ2hlY2tGaWVsZFByZXNlbmNlKGN0eCwgKm1zZywgcGFyc2VfZmxhZ3MpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGJvb2wgYWxpYXNpbmc+Citib29sIE1lcmdlRnJvbUltcGwoQm91bmRlZFpDSVMgaW5wdXQsIE1lc3NhZ2VMaXRlKiBtc2csCisgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGU6OlBhcnNlRmxhZ3MgcGFyc2VfZmxhZ3MpIHsKKyAgY29uc3QgY2hhciogcHRyOworICBpbnRlcm5hbDo6UGFyc2VDb250ZXh0IGN0eChpbzo6Q29kZWRJbnB1dFN0cmVhbTo6R2V0RGVmYXVsdFJlY3Vyc2lvbkxpbWl0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzaW5nLCAmcHRyLCBpbnB1dC56Y2lzLCBpbnB1dC5saW1pdCk7CisgIHB0ciA9IG1zZy0+X0ludGVybmFsUGFyc2UocHRyLCAmY3R4KTsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoIXB0cikpIHJldHVybiBmYWxzZTsKKyAgY3R4LkJhY2tVcChwdHIpOworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKGN0eC5FbmRlZEF0TGltaXQoKSkpIHsKKyAgICByZXR1cm4gQ2hlY2tGaWVsZFByZXNlbmNlKGN0eCwgKm1zZywgcGFyc2VfZmxhZ3MpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgYm9vbCBNZXJnZUZyb21JbXBsPGZhbHNlPihTdHJpbmdQaWVjZSBpbnB1dCwgTWVzc2FnZUxpdGUqIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGU6OlBhcnNlRmxhZ3MgcGFyc2VfZmxhZ3MpOwordGVtcGxhdGUgYm9vbCBNZXJnZUZyb21JbXBsPHRydWU+KFN0cmluZ1BpZWNlIGlucHV0LCBNZXNzYWdlTGl0ZSogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlOjpQYXJzZUZsYWdzIHBhcnNlX2ZsYWdzKTsKK3RlbXBsYXRlIGJvb2wgTWVyZ2VGcm9tSW1wbDxmYWxzZT4oaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZTo6UGFyc2VGbGFncyBwYXJzZV9mbGFncyk7Cit0ZW1wbGF0ZSBib29sIE1lcmdlRnJvbUltcGw8dHJ1ZT4oaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGU6OlBhcnNlRmxhZ3MgcGFyc2VfZmxhZ3MpOwordGVtcGxhdGUgYm9vbCBNZXJnZUZyb21JbXBsPGZhbHNlPihCb3VuZGVkWkNJUyBpbnB1dCwgTWVzc2FnZUxpdGUqIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGU6OlBhcnNlRmxhZ3MgcGFyc2VfZmxhZ3MpOwordGVtcGxhdGUgYm9vbCBNZXJnZUZyb21JbXBsPHRydWU+KEJvdW5kZWRaQ0lTIGlucHV0LCBNZXNzYWdlTGl0ZSogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlOjpQYXJzZUZsYWdzIHBhcnNlX2ZsYWdzKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK2NsYXNzIFplcm9Db3B5Q29kZWRJbnB1dFN0cmVhbSA6IHB1YmxpYyBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSB7CisgcHVibGljOgorICBaZXJvQ29weUNvZGVkSW5wdXRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGNpcykgOiBjaXNfKGNpcykge30KKyAgYm9vbCBOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIGZpbmFsIHsKKyAgICBpZiAoIWNpc18tPkdldERpcmVjdEJ1ZmZlclBvaW50ZXIoZGF0YSwgc2l6ZSkpIHJldHVybiBmYWxzZTsKKyAgICBjaXNfLT5Ta2lwKCpzaXplKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB2b2lkIEJhY2tVcChpbnQgY291bnQpIGZpbmFsIHsgY2lzXy0+QWR2YW5jZSgtY291bnQpOyB9CisgIGJvb2wgU2tpcChpbnQgY291bnQpIGZpbmFsIHsgcmV0dXJuIGNpc18tPlNraXAoY291bnQpOyB9CisgIGludDY0X3QgQnl0ZUNvdW50KCkgY29uc3QgZmluYWwgeyByZXR1cm4gMDsgfQorCisgIGJvb2wgYWxpYXNpbmdfZW5hYmxlZCgpIHsgcmV0dXJuIGNpc18tPmFsaWFzaW5nX2VuYWJsZWRfOyB9CisKKyBwcml2YXRlOgorICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogY2lzXzsKK307CisKK2Jvb2wgTWVzc2FnZUxpdGU6Ok1lcmdlRnJvbUltcGwoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZTo6UGFyc2VGbGFncyBwYXJzZV9mbGFncykgeworICBaZXJvQ29weUNvZGVkSW5wdXRTdHJlYW0gemNpcyhpbnB1dCk7CisgIGNvbnN0IGNoYXIqIHB0cjsKKyAgaW50ZXJuYWw6OlBhcnNlQ29udGV4dCBjdHgoaW5wdXQtPlJlY3Vyc2lvbkJ1ZGdldCgpLCB6Y2lzLmFsaWFzaW5nX2VuYWJsZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0ciwgJnpjaXMpOworICAvLyBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0gYWxsb3dzIHRlcm1pbmF0aW5nIHRoZSB3aXJlZm9ybWF0IGJ5IDAgb3IKKyAgLy8gZW5kLWdyb3VwIHRhZy4gTGVhdmluZyBpdCB1cCB0byB0aGUgY2FsbGVyIHRvIHZlcmlmeSBjb3JyZWN0IGVuZGluZyBieQorICAvLyBjYWxsaW5nIExhc3RUYWdXYXMgb24gaW5wdXQuIFdlIG5lZWQgdG8gbWFpbnRhaW4gdGhpcyBiZWhhdmlvci4KKyAgY3R4LlRyYWNrQ29ycmVjdEVuZGluZygpOworICBjdHguZGF0YSgpLnBvb2wgPSBpbnB1dC0+R2V0RXh0ZW5zaW9uUG9vbCgpOworICBjdHguZGF0YSgpLmZhY3RvcnkgPSBpbnB1dC0+R2V0RXh0ZW5zaW9uRmFjdG9yeSgpOworICBwdHIgPSBfSW50ZXJuYWxQYXJzZShwdHIsICZjdHgpOworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghcHRyKSkgcmV0dXJuIGZhbHNlOworICBjdHguQmFja1VwKHB0cik7CisgIGlmICghY3R4LkVuZGVkQXRFbmRPZlN0cmVhbSgpKSB7CisgICAgR09PR0xFX0RDSEVDS19ORShjdHguTGFzdFRhZygpLCAxKTsgIC8vIFdlIGNhbid0IGVuZCBvbiBhIHB1c2hlZCBsaW1pdC4KKyAgICBpZiAoY3R4LklzRXhjZWVkaW5nTGltaXQocHRyKSkgcmV0dXJuIGZhbHNlOworICAgIGlucHV0LT5TZXRMYXN0VGFnKGN0eC5MYXN0VGFnKCkpOworICB9IGVsc2UgeworICAgIGlucHV0LT5TZXRDb25zdW1lZCgpOworICB9CisgIHJldHVybiBDaGVja0ZpZWxkUHJlc2VuY2UoY3R4LCAqdGhpcywgcGFyc2VfZmxhZ3MpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisgIHJldHVybiBNZXJnZUZyb21JbXBsKGlucHV0LCBrTWVyZ2VQYXJ0aWFsKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6TWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisgIHJldHVybiBNZXJnZUZyb21JbXBsKGlucHV0LCBrTWVyZ2UpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpQYXJzZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgQ2xlYXIoKTsKKyAgcmV0dXJuIE1lcmdlRnJvbUltcGwoaW5wdXQsIGtQYXJzZSk7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlBhcnNlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgQ2xlYXIoKTsKKyAgcmV0dXJuIE1lcmdlRnJvbUltcGwoaW5wdXQsIGtQYXJzZVBhcnRpYWwpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpQYXJzZUZyb21aZXJvQ29weVN0cmVhbShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgcmV0dXJuIFBhcnNlRnJvbTxrUGFyc2U+KGlucHV0KTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VQYXJ0aWFsRnJvbVplcm9Db3B5U3RyZWFtKAorICAgIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCkgeworICByZXR1cm4gUGFyc2VGcm9tPGtQYXJzZVBhcnRpYWw+KGlucHV0KTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VGcm9tRmlsZURlc2NyaXB0b3IoaW50IGZpbGVfZGVzY3JpcHRvcikgeworICBpbzo6RmlsZUlucHV0U3RyZWFtIGlucHV0KGZpbGVfZGVzY3JpcHRvcik7CisgIHJldHVybiBQYXJzZUZyb21aZXJvQ29weVN0cmVhbSgmaW5wdXQpICYmIGlucHV0LkdldEVycm5vKCkgPT0gMDsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VQYXJ0aWFsRnJvbUZpbGVEZXNjcmlwdG9yKGludCBmaWxlX2Rlc2NyaXB0b3IpIHsKKyAgaW86OkZpbGVJbnB1dFN0cmVhbSBpbnB1dChmaWxlX2Rlc2NyaXB0b3IpOworICByZXR1cm4gUGFyc2VQYXJ0aWFsRnJvbVplcm9Db3B5U3RyZWFtKCZpbnB1dCkgJiYgaW5wdXQuR2V0RXJybm8oKSA9PSAwOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpQYXJzZUZyb21Jc3RyZWFtKHN0ZDo6aXN0cmVhbSogaW5wdXQpIHsKKyAgaW86OklzdHJlYW1JbnB1dFN0cmVhbSB6ZXJvX2NvcHlfaW5wdXQoaW5wdXQpOworICByZXR1cm4gUGFyc2VGcm9tWmVyb0NvcHlTdHJlYW0oJnplcm9fY29weV9pbnB1dCkgJiYgaW5wdXQtPmVvZigpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpQYXJzZVBhcnRpYWxGcm9tSXN0cmVhbShzdGQ6OmlzdHJlYW0qIGlucHV0KSB7CisgIGlvOjpJc3RyZWFtSW5wdXRTdHJlYW0gemVyb19jb3B5X2lucHV0KGlucHV0KTsKKyAgcmV0dXJuIFBhcnNlUGFydGlhbEZyb21aZXJvQ29weVN0cmVhbSgmemVyb19jb3B5X2lucHV0KSAmJiBpbnB1dC0+ZW9mKCk7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6Ok1lcmdlUGFydGlhbEZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oCisgICAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBpbnQgc2l6ZSkgeworICByZXR1cm4gUGFyc2VGcm9tPGtNZXJnZVBhcnRpYWw+KGludGVybmFsOjpCb3VuZGVkWkNJU3tpbnB1dCwgc2l6ZX0pOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpNZXJnZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSB7CisgIHJldHVybiBQYXJzZUZyb208a01lcmdlPihpbnRlcm5hbDo6Qm91bmRlZFpDSVN7aW5wdXQsIHNpemV9KTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgeworICByZXR1cm4gUGFyc2VGcm9tPGtQYXJzZT4oaW50ZXJuYWw6OkJvdW5kZWRaQ0lTe2lucHV0LCBzaXplfSk7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlBhcnNlUGFydGlhbEZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oCisgICAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBpbnQgc2l6ZSkgeworICByZXR1cm4gUGFyc2VGcm9tPGtQYXJzZVBhcnRpYWw+KGludGVybmFsOjpCb3VuZGVkWkNJU3tpbnB1dCwgc2l6ZX0pOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpQYXJzZUZyb21TdHJpbmcoQ29uc3RTdHJpbmdQYXJhbSBkYXRhKSB7CisgIHJldHVybiBQYXJzZUZyb208a1BhcnNlPihkYXRhKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VQYXJ0aWFsRnJvbVN0cmluZyhDb25zdFN0cmluZ1BhcmFtIGRhdGEpIHsKKyAgcmV0dXJuIFBhcnNlRnJvbTxrUGFyc2VQYXJ0aWFsPihkYXRhKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpIHsKKyAgcmV0dXJuIFBhcnNlRnJvbTxrUGFyc2U+KGFzX3N0cmluZ192aWV3KGRhdGEsIHNpemUpKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VQYXJ0aWFsRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKSB7CisgIHJldHVybiBQYXJzZUZyb208a1BhcnNlUGFydGlhbD4oYXNfc3RyaW5nX3ZpZXcoZGF0YSwgc2l6ZSkpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpNZXJnZUZyb21TdHJpbmcoQ29uc3RTdHJpbmdQYXJhbSBkYXRhKSB7CisgIHJldHVybiBQYXJzZUZyb208a01lcmdlPihkYXRhKTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2lubGluZSB1aW50OF90KiBTZXJpYWxpemVUb0FycmF5SW1wbChjb25zdCBNZXNzYWdlTGl0ZSYgbXNnLCB1aW50OF90KiB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIHsKKyAgY29uc3RleHByIGJvb2wgZGVidWcgPSBmYWxzZTsKKyAgaWYgKGRlYnVnKSB7CisgICAgLy8gRm9yY2Ugc2VyaWFsaXphdGlvbiB0byBhIHN0cmVhbSB3aXRoIGEgYmxvY2sgc2l6ZSBvZiAxLCB3aGljaCBmb3JjZXMKKyAgICAvLyBhbGwgd3JpdGVzIHRvIHRoZSBzdHJlYW0gdG8gY3Jvc3MgYnVmZmVycyB0cmlnZ2VyaW5nIGFsbCBmYWxsYmFjayBwYXRocworICAgIC8vIGluIHRoZSB1bml0dGVzdHMgd2hlbiBzZXJpYWxpemluZyB0byBzdHJpbmcgLyBhcnJheS4KKyAgICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gc3RyZWFtKHRhcmdldCwgc2l6ZSwgMSk7CisgICAgdWludDhfdCogcHRyOworICAgIGlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtIG91dCgKKyAgICAgICAgJnN0cmVhbSwgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpJc0RlZmF1bHRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYygpLAorICAgICAgICAmcHRyKTsKKyAgICBwdHIgPSBtc2cuX0ludGVybmFsU2VyaWFsaXplKHB0ciwgJm91dCk7CisgICAgb3V0LlRyaW0ocHRyKTsKKyAgICBHT09HTEVfRENIRUNLKCFvdXQuSGFkRXJyb3IoKSAmJiBzdHJlYW0uQnl0ZUNvdW50KCkgPT0gc2l6ZSk7CisgICAgcmV0dXJuIHRhcmdldCArIHNpemU7CisgIH0gZWxzZSB7CisgICAgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0gb3V0KAorICAgICAgICB0YXJnZXQsIHNpemUsCisgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6SXNEZWZhdWx0U2VyaWFsaXphdGlvbkRldGVybWluaXN0aWMoKSk7CisgICAgYXV0byByZXMgPSBtc2cuX0ludGVybmFsU2VyaWFsaXplKHRhcmdldCwgJm91dCk7CisgICAgR09PR0xFX0RDSEVDSyh0YXJnZXQgKyBzaXplID09IHJlcyk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorfQorCit1aW50OF90KiBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSh1aW50OF90KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gV2Ugb25seSBvcHRpbWl6ZSB0aGlzIHdoZW4gdXNpbmcgb3B0aW1pemVfZm9yID0gU1BFRUQuICBJbiBvdGhlciBjYXNlcworICAvLyB3ZSBqdXN0IHVzZSB0aGUgQ29kZWRPdXRwdXRTdHJlYW0gcGF0aC4KKyAgcmV0dXJuIFNlcmlhbGl6ZVRvQXJyYXlJbXBsKCp0aGlzLCB0YXJnZXQsIEdldENhY2hlZFNpemUoKSk7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVRvQ29kZWRTdHJlYW0oaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyhJc0luaXRpYWxpemVkKCkpIDw8IEluaXRpYWxpemF0aW9uRXJyb3JNZXNzYWdlKCJzZXJpYWxpemUiLCAqdGhpcyk7CisgIHJldHVybiBTZXJpYWxpemVQYXJ0aWFsVG9Db2RlZFN0cmVhbShvdXRwdXQpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVQYXJ0aWFsVG9Db2RlZFN0cmVhbSgKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICBjb25zdCBzaXplX3Qgc2l6ZSA9IEJ5dGVTaXplTG9uZygpOyAgLy8gRm9yY2Ugc2l6ZSB0byBiZSBjYWNoZWQuCisgIGlmIChzaXplID4gSU5UX01BWCkgeworICAgIEdPT0dMRV9MT0coRVJST1IpIDw8IEdldFR5cGVOYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICIgZXhjZWVkZWQgbWF4aW11bSBwcm90b2J1ZiBzaXplIG9mIDJHQjogIiA8PCBzaXplOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGludCBvcmlnaW5hbF9ieXRlX2NvdW50ID0gb3V0cHV0LT5CeXRlQ291bnQoKTsKKyAgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG91dHB1dCk7CisgIGlmIChvdXRwdXQtPkhhZEVycm9yKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW50IGZpbmFsX2J5dGVfY291bnQgPSBvdXRwdXQtPkJ5dGVDb3VudCgpOworCisgIGlmIChmaW5hbF9ieXRlX2NvdW50IC0gb3JpZ2luYWxfYnl0ZV9jb3VudCAhPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihzaXplKSkgeworICAgIEJ5dGVTaXplQ29uc2lzdGVuY3lFcnJvcihzaXplLCBCeXRlU2l6ZUxvbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfYnl0ZV9jb3VudCAtIG9yaWdpbmFsX2J5dGVfY291bnQsICp0aGlzKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKAorICAgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0soSXNJbml0aWFsaXplZCgpKSA8PCBJbml0aWFsaXphdGlvbkVycm9yTWVzc2FnZSgic2VyaWFsaXplIiwgKnRoaXMpOworICByZXR1cm4gU2VyaWFsaXplUGFydGlhbFRvWmVyb0NvcHlTdHJlYW0ob3V0cHV0KTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplUGFydGlhbFRvWmVyb0NvcHlTdHJlYW0oCisgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgY29uc3Qgc2l6ZV90IHNpemUgPSBCeXRlU2l6ZUxvbmcoKTsgIC8vIEZvcmNlIHNpemUgdG8gYmUgY2FjaGVkLgorICBpZiAoc2l6ZSA+IElOVF9NQVgpIHsKKyAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCBHZXRUeXBlTmFtZSgpCisgICAgICAgICAgICAgICA8PCAiIGV4Y2VlZGVkIG1heGltdW0gcHJvdG9idWYgc2l6ZSBvZiAyR0I6ICIgPDwgc2l6ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB1aW50OF90KiB0YXJnZXQ7CisgIGlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtIHN0cmVhbSgKKyAgICAgIG91dHB1dCwgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpJc0RlZmF1bHRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYygpLAorICAgICAgJnRhcmdldCk7CisgIHRhcmdldCA9IF9JbnRlcm5hbFNlcmlhbGl6ZSh0YXJnZXQsICZzdHJlYW0pOworICBzdHJlYW0uVHJpbSh0YXJnZXQpOworICBpZiAoc3RyZWFtLkhhZEVycm9yKCkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVRvRmlsZURlc2NyaXB0b3IoaW50IGZpbGVfZGVzY3JpcHRvcikgY29uc3QgeworICBpbzo6RmlsZU91dHB1dFN0cmVhbSBvdXRwdXQoZmlsZV9kZXNjcmlwdG9yKTsKKyAgcmV0dXJuIFNlcmlhbGl6ZVRvWmVyb0NvcHlTdHJlYW0oJm91dHB1dCkgJiYgb3V0cHV0LkZsdXNoKCk7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVBhcnRpYWxUb0ZpbGVEZXNjcmlwdG9yKGludCBmaWxlX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgaW86OkZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0KGZpbGVfZGVzY3JpcHRvcik7CisgIHJldHVybiBTZXJpYWxpemVQYXJ0aWFsVG9aZXJvQ29weVN0cmVhbSgmb3V0cHV0KSAmJiBvdXRwdXQuRmx1c2goKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplVG9Pc3RyZWFtKHN0ZDo6b3N0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIHsKKyAgICBpbzo6T3N0cmVhbU91dHB1dFN0cmVhbSB6ZXJvX2NvcHlfb3V0cHV0KG91dHB1dCk7CisgICAgaWYgKCFTZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKCZ6ZXJvX2NvcHlfb3V0cHV0KSkgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBvdXRwdXQtPmdvb2QoKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplUGFydGlhbFRvT3N0cmVhbShzdGQ6Om9zdHJlYW0qIG91dHB1dCkgY29uc3QgeworICBpbzo6T3N0cmVhbU91dHB1dFN0cmVhbSB6ZXJvX2NvcHlfb3V0cHV0KG91dHB1dCk7CisgIHJldHVybiBTZXJpYWxpemVQYXJ0aWFsVG9aZXJvQ29weVN0cmVhbSgmemVyb19jb3B5X291dHB1dCk7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OkFwcGVuZFRvU3RyaW5nKHN0ZDo6c3RyaW5nKiBvdXRwdXQpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyhJc0luaXRpYWxpemVkKCkpIDw8IEluaXRpYWxpemF0aW9uRXJyb3JNZXNzYWdlKCJzZXJpYWxpemUiLCAqdGhpcyk7CisgIHJldHVybiBBcHBlbmRQYXJ0aWFsVG9TdHJpbmcob3V0cHV0KTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6QXBwZW5kUGFydGlhbFRvU3RyaW5nKHN0ZDo6c3RyaW5nKiBvdXRwdXQpIGNvbnN0IHsKKyAgc2l6ZV90IG9sZF9zaXplID0gb3V0cHV0LT5zaXplKCk7CisgIHNpemVfdCBieXRlX3NpemUgPSBCeXRlU2l6ZUxvbmcoKTsKKyAgaWYgKGJ5dGVfc2l6ZSA+IElOVF9NQVgpIHsKKyAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCBHZXRUeXBlTmFtZSgpCisgICAgICAgICAgICAgICA8PCAiIGV4Y2VlZGVkIG1heGltdW0gcHJvdG9idWYgc2l6ZSBvZiAyR0I6ICIgPDwgYnl0ZV9zaXplOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFNUTFN0cmluZ1Jlc2l6ZVVuaW5pdGlhbGl6ZWRBbW9ydGl6ZWQob3V0cHV0LCBvbGRfc2l6ZSArIGJ5dGVfc2l6ZSk7CisgIHVpbnQ4X3QqIHN0YXJ0ID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGlvOjptdXRhYmxlX3N0cmluZ19kYXRhKG91dHB1dCkgKyBvbGRfc2l6ZSk7CisgIFNlcmlhbGl6ZVRvQXJyYXlJbXBsKCp0aGlzLCBzdGFydCwgYnl0ZV9zaXplKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVRvU3RyaW5nKHN0ZDo6c3RyaW5nKiBvdXRwdXQpIGNvbnN0IHsKKyAgb3V0cHV0LT5jbGVhcigpOworICByZXR1cm4gQXBwZW5kVG9TdHJpbmcob3V0cHV0KTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKHN0ZDo6c3RyaW5nKiBvdXRwdXQpIGNvbnN0IHsKKyAgb3V0cHV0LT5jbGVhcigpOworICByZXR1cm4gQXBwZW5kUGFydGlhbFRvU3RyaW5nKG91dHB1dCk7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVRvQXJyYXkodm9pZCogZGF0YSwgaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyhJc0luaXRpYWxpemVkKCkpIDw8IEluaXRpYWxpemF0aW9uRXJyb3JNZXNzYWdlKCJzZXJpYWxpemUiLCAqdGhpcyk7CisgIHJldHVybiBTZXJpYWxpemVQYXJ0aWFsVG9BcnJheShkYXRhLCBzaXplKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplUGFydGlhbFRvQXJyYXkodm9pZCogZGF0YSwgaW50IHNpemUpIGNvbnN0IHsKKyAgY29uc3Qgc2l6ZV90IGJ5dGVfc2l6ZSA9IEJ5dGVTaXplTG9uZygpOworICBpZiAoYnl0ZV9zaXplID4gSU5UX01BWCkgeworICAgIEdPT0dMRV9MT0coRVJST1IpIDw8IEdldFR5cGVOYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICIgZXhjZWVkZWQgbWF4aW11bSBwcm90b2J1ZiBzaXplIG9mIDJHQjogIiA8PCBieXRlX3NpemU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChzaXplIDwgc3RhdGljX2Nhc3Q8aW50NjRfdD4oYnl0ZV9zaXplKSkgcmV0dXJuIGZhbHNlOworICB1aW50OF90KiBzdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRhdGEpOworICBTZXJpYWxpemVUb0FycmF5SW1wbCgqdGhpcywgc3RhcnQsIGJ5dGVfc2l6ZSk7CisgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnN0cmluZyBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIC8vIElmIHRoZSBjb21waWxlciBpbXBsZW1lbnRzIHRoZSAoTmFtZWQpIFJldHVybiBWYWx1ZSBPcHRpbWl6YXRpb24sCisgIC8vIHRoZSBsb2NhbCB2YXJpYWJsZSAnb3V0cHV0JyB3aWxsIG5vdCBhY3R1YWxseSByZXNpZGUgb24gdGhlIHN0YWNrCisgIC8vIG9mIHRoaXMgZnVuY3Rpb24sIGJ1dCB3aWxsIGJlIG92ZXJsYWlkIHdpdGggdGhlIG9iamVjdCB0aGF0IHRoZQorICAvLyBjYWxsZXIgc3VwcGxpZWQgZm9yIHRoZSByZXR1cm4gdmFsdWUgdG8gYmUgY29uc3RydWN0ZWQgaW4uCisgIHN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgaWYgKCFBcHBlbmRUb1N0cmluZygmb3V0cHV0KSkgb3V0cHV0LmNsZWFyKCk7CisgIHJldHVybiBvdXRwdXQ7Cit9CisKK3N0ZDo6c3RyaW5nIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVQYXJ0aWFsQXNTdHJpbmcoKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgaWYgKCFBcHBlbmRQYXJ0aWFsVG9TdHJpbmcoJm91dHB1dCkpIG91dHB1dC5jbGVhcigpOworICByZXR1cm4gb3V0cHV0OworfQorCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK01lc3NhZ2VMaXRlKiBOZXdGcm9tUHJvdG90eXBlSGVscGVyKGNvbnN0IE1lc3NhZ2VMaXRlKiBwcm90b3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIHByb3RvdHlwZS0+TmV3KGFyZW5hKTsKK30KK3RlbXBsYXRlIDw+Cit2b2lkIEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT46Ok1lcmdlKGNvbnN0IE1lc3NhZ2VMaXRlJiBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogdG8pIHsKKyAgdG8tPkNoZWNrVHlwZUFuZE1lcmdlRnJvbShmcm9tKTsKK30KK3RlbXBsYXRlIDw+Cit2b2lkIEdlbmVyaWNUeXBlSGFuZGxlcjxzdGQ6OnN0cmluZz46Ok1lcmdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogdG8pIHsKKyAgKnRvID0gZnJvbTsKK30KKworLy8gTm9uLWlubGluZSBpbXBsZW1lbnRhdGlvbnMgb2YgSW50ZXJuYWxNZXRhZGF0YSBkZXN0cnVjdG9yCisvLyBUaGlzIGlzIG1vdmVkIG91dCBvZiB0aGUgaGVhZGVyIGJlY2F1c2UgdGhlIEdPT0dMRV9EQ0hFQ0sgcHJvZHVjZXMgYSBsb3Qgb2YgY29kZS4KK3ZvaWQgSW50ZXJuYWxNZXRhZGF0YTo6Q2hlY2tlZERlc3RydWN0KCkgeworICBpZiAoSGFzTWVzc2FnZU93bmVkQXJlbmFUYWcoKSkgeworICAgIEdPT0dMRV9EQ0hFQ0soIUhhc1Vua25vd25GaWVsZHNUYWcoKSk7CisgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8QXJlbmEqPihwdHJfIC0ga01lc3NhZ2VPd25lZEFyZW5hVGFnTWFzayk7CisgIH0KK30KKworLy8gTm9uLWlubGluZSB2YXJpYW50cyBvZiBzdGQ6OnN0cmluZyBzcGVjaWFsaXphdGlvbnMgZm9yCisvLyB2YXJpb3VzIEludGVybmFsTWV0YWRhdGEgcm91dGluZXMuCit0ZW1wbGF0ZSA8Pgordm9pZCBJbnRlcm5hbE1ldGFkYXRhOjpEb0NsZWFyPHN0ZDo6c3RyaW5nPigpIHsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkczxzdGQ6OnN0cmluZz4oKS0+Y2xlYXIoKTsKK30KKwordGVtcGxhdGUgPD4KK3ZvaWQgSW50ZXJuYWxNZXRhZGF0YTo6RG9NZXJnZUZyb208c3RkOjpzdHJpbmc+KGNvbnN0IHN0ZDo6c3RyaW5nJiBvdGhlcikgeworICBtdXRhYmxlX3Vua25vd25fZmllbGRzPHN0ZDo6c3RyaW5nPigpLT5hcHBlbmQob3RoZXIpOworfQorCit0ZW1wbGF0ZSA8Pgordm9pZCBJbnRlcm5hbE1ldGFkYXRhOjpEb1N3YXA8c3RkOjpzdHJpbmc+KHN0ZDo6c3RyaW5nKiBvdGhlcikgeworICBtdXRhYmxlX3Vua25vd25fZmllbGRzPHN0ZDo6c3RyaW5nPigpLT5zd2FwKCpvdGhlcik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFNodXRkb3duIHN1cHBvcnQuCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3N0cnVjdCBTaHV0ZG93bkRhdGEgeworICB+U2h1dGRvd25EYXRhKCkgeworICAgIHN0ZDo6cmV2ZXJzZShmdW5jdGlvbnMuYmVnaW4oKSwgZnVuY3Rpb25zLmVuZCgpKTsKKyAgICBmb3IgKGF1dG8gcGFpciA6IGZ1bmN0aW9ucykgcGFpci5maXJzdChwYWlyLnNlY29uZCk7CisgIH0KKworICBzdGF0aWMgU2h1dGRvd25EYXRhKiBnZXQoKSB7CisgICAgc3RhdGljIGF1dG8qIGRhdGEgPSBuZXcgU2h1dGRvd25EYXRhOworICAgIHJldHVybiBkYXRhOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHZvaWQgKCopKGNvbnN0IHZvaWQqKSwgY29uc3Qgdm9pZCo+PiBmdW5jdGlvbnM7CisgIE11dGV4IG11dGV4OworfTsKKworc3RhdGljIHZvaWQgUnVuWmVyb0FyZ0Z1bmMoY29uc3Qgdm9pZCogYXJnKSB7CisgIHZvaWQgKCpmdW5jKSgpID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkICgqKSgpPihjb25zdF9jYXN0PHZvaWQqPihhcmcpKTsKKyAgZnVuYygpOworfQorCit2b2lkIE9uU2h1dGRvd24odm9pZCAoKmZ1bmMpKCkpIHsKKyAgT25TaHV0ZG93blJ1bihSdW5aZXJvQXJnRnVuYywgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZnVuYykpOworfQorCit2b2lkIE9uU2h1dGRvd25SdW4odm9pZCAoKmYpKGNvbnN0IHZvaWQqKSwgY29uc3Qgdm9pZCogYXJnKSB7CisgIGF1dG8gc2h1dGRvd25fZGF0YSA9IFNodXRkb3duRGF0YTo6Z2V0KCk7CisgIE11dGV4TG9jayBsb2NrKCZzaHV0ZG93bl9kYXRhLT5tdXRleCk7CisgIHNodXRkb3duX2RhdGEtPmZ1bmN0aW9ucy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoZiwgYXJnKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit2b2lkIFNodXRkb3duUHJvdG9idWZMaWJyYXJ5KCkgeworICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlLCBidXQgYWNjZXB0cyBtdWx0aXBsZSBjYWxscy4KKyAgc3RhdGljIGJvb2wgaXNfc2h1dGRvd24gPSBmYWxzZTsKKyAgaWYgKCFpc19zaHV0ZG93bikgeworICAgIGRlbGV0ZSBpbnRlcm5hbDo6U2h1dGRvd25EYXRhOjpnZXQoKTsKKyAgICBpc19zaHV0ZG93biA9IHRydWU7CisgIH0KK30KKworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MGFlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oCkBAIC0wLDAgKzEsNTkxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yczogd2lua0Bnb29nbGUuY29tIChXaW5rIFNhdmlsbGUpLAorLy8gICAgICAgICAga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIERlZmluZXMgTWVzc2FnZUxpdGUsIHRoZSBhYnN0cmFjdCBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYWxsIChsaXRlCisvLyBhbmQgbm9uLWxpdGUpIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0cy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTUVTU0FHRV9MSVRFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUVTU0FHRV9MSVRFX0hfXworCisKKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXhwbGljaXRseV9jb25zdHJ1Y3RlZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4gIC8vIFRPRE8oYi8yMTE0NDI3MTgpOiBjbGVhbnVwCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorLy8gY2xhbmctZm9ybWF0IG9uCisKKyNpZmRlZiBTV0lHCisjZXJyb3IgIllvdSBjYW5ub3QgU1dJRyBwcm90byBoZWFkZXJzIgorI2VuZGlmCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBSZXBlYXRlZFB0ckZpZWxkOworCitjbGFzcyBGYXN0UmVmbGVjdGlvbk1lc3NhZ2VNdXRhdG9yOworY2xhc3MgRmFzdFJlZmxlY3Rpb25TdHJpbmdTZXR0ZXI7CitjbGFzcyBSZWZsZWN0aW9uOworCituYW1lc3BhY2UgaW8geworCitjbGFzcyBDb2RlZElucHV0U3RyZWFtOworY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW07CitjbGFzcyBaZXJvQ29weUlucHV0U3RyZWFtOworY2xhc3MgWmVyb0NvcHlPdXRwdXRTdHJlYW07CisKK30gIC8vIG5hbWVzcGFjZSBpbworbmFtZXNwYWNlIGludGVybmFsIHsKKworY2xhc3MgU3dhcEZpZWxkSGVscGVyOworCisvLyBTZWUgcGFyc2VfY29udGV4dC5oIGZvciBleHBsYW5hdGlvbgorY2xhc3MgUGFyc2VDb250ZXh0OworCitjbGFzcyBFeHRlbnNpb25TZXQ7CitjbGFzcyBMYXp5RmllbGQ7CitjbGFzcyBSZXBlYXRlZFB0ckZpZWxkQmFzZTsKK2NsYXNzIFRjUGFyc2VyOworY2xhc3MgV2lyZUZvcm1hdExpdGU7CitjbGFzcyBXZWFrRmllbGRNYXA7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorY2xhc3MgR2VuZXJpY1R5cGVIYW5kbGVyOyAgLy8gZGVmaW5lZCBpbiByZXBlYXRlZF9maWVsZC5oCisKKy8vIFdlIGNvbXB1dGUgc2l6ZXMgYXMgc2l6ZV90IGJ1dCBjYWNoZSB0aGVtIGFzIGludC4gIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYQorLy8gY29tcHV0ZWQgc2l6ZSB0byBhIGNhY2hlZCBzaXplLiAgU2luY2Ugd2UgZG9uJ3QgcHJvY2VlZCB3aXRoIHNlcmlhbGl6YXRpb24KKy8vIGlmIHRoZSB0b3RhbCBzaXplIHdhcyA+IElOVF9NQVgsIGl0IGlzIG5vdCBpbXBvcnRhbnQgd2hhdCB0aGlzIGZ1bmN0aW9uCisvLyByZXR1cm5zIGZvciBpbnB1dHMgPiBJTlRfTUFYLiAgSG93ZXZlciB0aGlzIGNhc2Ugc2hvdWxkIG5vdCBlcnJvciBvcgorLy8gR09PR0xFX0NIRUNLLWZhaWwsIGJlY2F1c2UgdGhlIGZ1bGwgc2l6ZV90IHJlc29sdXRpb24gaXMgc3RpbGwgcmV0dXJuZWQgZnJvbQorLy8gQnl0ZVNpemVMb25nKCkgYW5kIGNoZWNrZWQgYWdhaW5zdCBJTlRfTUFYOyB3ZSBjYW4gY2F0Y2ggdGhlIG92ZXJmbG93CisvLyB0aGVyZS4KK2lubGluZSBpbnQgVG9DYWNoZWRTaXplKHNpemVfdCBzaXplKSB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHNpemUpOyB9CisKKy8vIFdlIG1haW5seSBjYWxjdWxhdGUgc2l6ZXMgaW4gdGVybXMgb2Ygc2l6ZV90LCBidXQgc29tZSBmdW5jdGlvbnMgdGhhdAorLy8gY29tcHV0ZSBzaXplcyByZXR1cm4gImludCIuICBUaGVzZSBpbnQgc2l6ZXMgYXJlIGV4cGVjdGVkIHRvIGFsd2F5cyBiZQorLy8gcG9zaXRpdmUuIFRoaXMgZnVuY3Rpb24gaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBjYXN0aW5nIGFuIGludCB0byBzaXplX3QKKy8vIGRpcmVjdGx5IG9uIDY0LWJpdCBwbGF0Zm9ybXMgYmVjYXVzZSBpdCBhdm9pZHMgbWFraW5nIHRoZSBjb21waWxlciBlbWl0IGEKKy8vIHNpZ24gZXh0ZW5kaW5nIGluc3RydWN0aW9uLCB3aGljaCB3ZSBkb24ndCB3YW50IGFuZCBkb24ndCB3YW50IHRvIHBheSBmb3IuCitpbmxpbmUgc2l6ZV90IEZyb21JbnRTaXplKGludCBzaXplKSB7CisgIC8vIENvbnZlcnQgdG8gdW5zaWduZWQgYmVmb3JlIHdpZGVuaW5nIHNvIHNpZ24gZXh0ZW5zaW9uIGlzIG5vdCBuZWNlc3NhcnkuCisgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHNpemUpOworfQorCisvLyBGb3IgY2FzZXMgd2hlcmUgYSBsZWdhY3kgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlZ2VyIHNpemUuICBXZSBHT09HTEVfRENIRUNLKCkKKy8vIHRoYXQgdGhlIGNvbnZlcnNpb24gd2lsbCBmaXQgd2l0aGluIGFuIGludGVnZXI7IGlmIHRoaXMgaXMgZmFsc2UgdGhlbiB3ZQorLy8gYXJlIGxvc2luZyBpbmZvcm1hdGlvbi4KK2lubGluZSBpbnQgVG9JbnRTaXplKHNpemVfdCBzaXplKSB7CisgIEdPT0dMRV9EQ0hFQ0tfTEUoc2l6ZSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihJTlRfTUFYKSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHNpemUpOworfQorCisvLyBEZWZhdWx0IGVtcHR5IHN0cmluZyBvYmplY3QuIERvbid0IHVzZSB0aGlzIGRpcmVjdGx5LiBJbnN0ZWFkLCBjYWxsCisvLyBHZXRFbXB0eVN0cmluZygpIHRvIGdldCB0aGUgcmVmZXJlbmNlLiBUaGlzIGVtcHR5IHN0cmluZyBpcyBhbGlnbmVkIHdpdGggYQorLy8gbWluaW11bSBhbGlnbm1lbnQgb2YgOCBieXRlcyB0byBtYXRjaCB0aGUgcmVxdWlyZW1lbnQgb2YgQXJlbmFTdHJpbmdQdHIuCitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIEV4cGxpY2l0bHlDb25zdHJ1Y3RlZEFyZW5hU3RyaW5nCisgICAgZml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmc7CisKKworUFJPVE9CVUZfRVhQT1JUIGNvbnN0ZXhwciBjb25zdCBzdGQ6OnN0cmluZyYgR2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkgeworICByZXR1cm4gZml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcuZ2V0KCk7Cit9CisKK1BST1RPQlVGX0VYUE9SVCBzaXplX3QgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBJbnRlcmZhY2UgdG8gbGlnaHQgd2VpZ2h0IHByb3RvY29sIG1lc3NhZ2VzLgorLy8KKy8vIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGFsbCBwcm90b2NvbCBtZXNzYWdlIG9iamVjdHMuICBOb24tbGl0ZQorLy8gbWVzc2FnZXMgYWRkaXRpb25hbGx5IGltcGxlbWVudCB0aGUgTWVzc2FnZSBpbnRlcmZhY2UsIHdoaWNoIGlzIGEKKy8vIHN1YmNsYXNzIG9mIE1lc3NhZ2VMaXRlLiAgVXNlIE1lc3NhZ2VMaXRlIGluc3RlYWQgd2hlbiB5b3Ugb25seSBuZWVkCisvLyB0aGUgc3Vic2V0IG9mIGZlYXR1cmVzIHdoaWNoIGl0IHN1cHBvcnRzIC0tIG5hbWVseSwgbm90aGluZyB0aGF0IHVzZXMKKy8vIGRlc2NyaXB0b3JzIG9yIHJlZmxlY3Rpb24uICBZb3UgY2FuIGluc3RydWN0IHRoZSBwcm90b2NvbCBjb21waWxlcgorLy8gdG8gZ2VuZXJhdGUgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgb25seSBNZXNzYWdlTGl0ZSwgbm90IHRoZSBmdWxsCisvLyBNZXNzYWdlIGludGVyZmFjZSwgYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgbGluZSB0byB0aGUgLnByb3RvIGZpbGU6CisvLworLy8gICBvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworLy8KKy8vIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBvbiByZXNvdXJjZS1jb25zdHJhaW5lZCBzeXN0ZW1zIHdoZXJlCisvLyB0aGUgZnVsbCBwcm90b2NvbCBidWZmZXJzIHJ1bnRpbWUgbGlicmFyeSBpcyB0b28gYmlnLgorLy8KKy8vIE5vdGUgdGhhdCBvbiBub24tY29uc3RyYWluZWQgc3lzdGVtcyAoZS5nLiBzZXJ2ZXJzKSB3aGVuIHlvdSBuZWVkCisvLyB0byBsaW5rIGluIGxvdHMgb2YgcHJvdG9jb2wgZGVmaW5pdGlvbnMsIGEgYmV0dGVyIHdheSB0byByZWR1Y2UKKy8vIHRvdGFsIGNvZGUgZm9vdHByaW50IGlzIHRvIHVzZSBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkUuICBUaGlzCisvLyB3aWxsIG1ha2UgdGhlIGdlbmVyYXRlZCBjb2RlIHNtYWxsZXIgd2hpbGUgc3RpbGwgc3VwcG9ydGluZyBhbGwgdGhlCisvLyBzYW1lIGZlYXR1cmVzIChhdCB0aGUgZXhwZW5zZSBvZiBzcGVlZCkuICBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUUKKy8vIGlzIGJlc3Qgd2hlbiB5b3Ugb25seSBoYXZlIGEgc21hbGwgbnVtYmVyIG9mIG1lc3NhZ2UgdHlwZXMgbGlua2VkCisvLyBpbnRvIHlvdXIgYmluYXJ5LCBpbiB3aGljaCBjYXNlIHRoZSBzaXplIG9mIHRoZSBwcm90b2NvbCBidWZmZXJzCisvLyBydW50aW1lIGl0c2VsZiBpcyB0aGUgYmlnZ2VzdCBwcm9ibGVtLgorLy8KKy8vIFVzZXJzIG11c3Qgbm90IGRlcml2ZSBmcm9tIHRoaXMgY2xhc3MuIE9ubHkgdGhlIHByb3RvY29sIGNvbXBpbGVyIGFuZAorLy8gdGhlIGludGVybmFsIGxpYnJhcnkgYXJlIGFsbG93ZWQgdG8gY3JlYXRlIHN1YmNsYXNzZXMuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTWVzc2FnZUxpdGUgeworIHB1YmxpYzoKKyAgY29uc3RleHByIE1lc3NhZ2VMaXRlKCkge30KKyAgdmlydHVhbCB+TWVzc2FnZUxpdGUoKSA9IGRlZmF1bHQ7CisKKyAgLy8gQmFzaWMgT3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhpcyBtZXNzYWdlIHR5cGUsIGUuZy4gImZvby5iYXIuQmF6UHJvdG8iLgorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFR5cGVOYW1lKCkgY29uc3QgPSAwOworCisgIC8vIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc2FtZSB0eXBlLiAgT3duZXJzaGlwIGlzIHBhc3NlZCB0byB0aGUKKyAgLy8gY2FsbGVyLgorICBNZXNzYWdlTGl0ZSogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KG51bGxwdHIpOyB9CisKKyAgLy8gQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9uIHRoZSBhcmVuYS4gT3duZXJzaGlwIGlzIHBhc3NlZCB0byB0aGUgY2FsbGVyCisgIC8vIGlmIGFyZW5hIGlzIGEgbnVsbHB0ci4KKyAgdmlydHVhbCBNZXNzYWdlTGl0ZSogTmV3KEFyZW5hKiBhcmVuYSkgY29uc3QgPSAwOworCisgIC8vIFJldHVybnMgdXNlci1vd25lZCBhcmVuYTsgbnVsbHB0ciBpZiBpdCdzIG1lc3NhZ2Ugb3duZWQuCisgIEFyZW5hKiBHZXRBcmVuYSgpIGNvbnN0IHsgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udXNlcl9hcmVuYSgpOyB9CisKKyAgLy8gQ2xlYXIgYWxsIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSBhbmQgc2V0IHRoZW0gdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgIC8vIENsZWFyKCkgYXNzdW1lcyB0aGF0IGFueSBtZW1vcnkgYWxsb2NhdGVkIHRvIGhvbGQgcGFydHMgb2YgdGhlIG1lc3NhZ2UKKyAgLy8gd2lsbCBsaWtlbHkgYmUgbmVlZGVkIGFnYWluLCBzbyB0aGUgbWVtb3J5IHVzZWQgbWF5IG5vdCBiZSBmcmVlZC4KKyAgLy8gVG8gZW5zdXJlIHRoYXQgYWxsIG1lbW9yeSB1c2VkIGJ5IGEgTWVzc2FnZSBpcyBmcmVlZCwgeW91IG11c3QgZGVsZXRlIGl0LgorICB2aXJ0dWFsIHZvaWQgQ2xlYXIoKSA9IDA7CisKKyAgLy8gUXVpY2tseSBjaGVjayBpZiBhbGwgcmVxdWlyZWQgZmllbGRzIGhhdmUgdmFsdWVzIHNldC4KKyAgdmlydHVhbCBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCA9IDA7CisKKyAgLy8gVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIExpdGUgbWVzc2FnZXMgLS0gaXQganVzdCByZXR1cm5zICIoY2Fubm90CisgIC8vIGRldGVybWluZSBtaXNzaW5nIGZpZWxkcyBmb3IgbGl0ZSBtZXNzYWdlKSIuICBIb3dldmVyLCBpdCBpcyBpbXBsZW1lbnRlZAorICAvLyBmb3IgZnVsbCBtZXNzYWdlcy4gIFNlZSBtZXNzYWdlLmguCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgSW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpIGNvbnN0OworCisgIC8vIElmIHxvdGhlcnwgaXMgdGhlIGV4YWN0IHNhbWUgY2xhc3MgYXMgdGhpcywgY2FsbHMgTWVyZ2VGcm9tKCkuIE90aGVyd2lzZSwKKyAgLy8gcmVzdWx0cyBhcmUgdW5kZWZpbmVkIChwcm9iYWJseSBjcmFzaCkuCisgIHZpcnR1YWwgdm9pZCBDaGVja1R5cGVBbmRNZXJnZUZyb20oY29uc3QgTWVzc2FnZUxpdGUmIG90aGVyKSA9IDA7CisKKyAgLy8gVGhlc2UgbWV0aG9kcyByZXR1cm4gYSBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5IG9mIHRoZSBtZXNzYWdlLiBOb3RlIHRoYXQKKyAgLy8gc2luY2UgdGhlIE1lc3NhZ2VMaXRlIGludGVyZmFjZSBkb2VzIG5vdCBzdXBwb3J0IHJlZmxlY3Rpb24sIHRoZXJlIGlzIHZlcnkKKyAgLy8gbGl0dGxlIGluZm9ybWF0aW9uIHRoYXQgdGhlc2UgbWV0aG9kcyBjYW4gcHJvdmlkZS4gVGhleSBhcmUgc2hhZG93ZWQgYnkKKyAgLy8gbWV0aG9kcyBvZiB0aGUgc2FtZSBuYW1lIG9uIHRoZSBNZXNzYWdlIGludGVyZmFjZSB3aGljaCBwcm92aWRlIG11Y2ggbW9yZQorICAvLyBpbmZvcm1hdGlvbi4gVGhlIG1ldGhvZHMgaGVyZSBhcmUgaW50ZW5kZWQgcHJpbWFyaWx5IHRvIGZhY2lsaXRhdGUgY29kZQorICAvLyByZXVzZSBmb3IgbG9naWMgdGhhdCBuZWVkcyB0byBpbnRlcm9wZXJhdGUgd2l0aCBib3RoIGZ1bGwgYW5kIGxpdGUgcHJvdG9zLgorICAvLworICAvLyBUaGUgZm9ybWF0IG9mIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgc3ViamVjdCB0byBjaGFuZ2UsIHNvIHBsZWFzZSBkbyBub3QKKyAgLy8gYXNzdW1lIGl0IHdpbGwgcmVtYWluIHN0YWJsZSBvdmVyIHRpbWUuCisgIHN0ZDo6c3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIFNob3J0RGVidWdTdHJpbmcoKSBjb25zdCB7IHJldHVybiBEZWJ1Z1N0cmluZygpOyB9CisgIC8vIE1lc3NhZ2VMaXRlOjpEZWJ1Z1N0cmluZyBpcyBhbHJlYWR5IFV0ZjggU2FmZS4gVGhpcyBpcyB0byBhZGQgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIE1lc3NhZ2UuCisgIHN0ZDo6c3RyaW5nIFV0ZjhEZWJ1Z1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIERlYnVnU3RyaW5nKCk7IH0KKworICAvLyBQYXJzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBNZXRob2RzIGZvciBwYXJzaW5nIGluIHByb3RvY29sIGJ1ZmZlciBmb3JtYXQuICBNb3N0IG9mIHRoZXNlIGFyZQorICAvLyBqdXN0IHNpbXBsZSB3cmFwcGVycyBhcm91bmQgTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKS4gIENsZWFyKCkgd2lsbCBiZQorICAvLyBjYWxsZWQgYmVmb3JlIG1lcmdpbmcgdGhlIGlucHV0LgorCisgIC8vIEZpbGwgdGhlIG1lc3NhZ2Ugd2l0aCBhIHByb3RvY29sIGJ1ZmZlciBwYXJzZWQgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQKKyAgLy8gc3RyZWFtLiBSZXR1cm5zIGZhbHNlIG9uIGEgcmVhZCBlcnJvciBvciBpZiB0aGUgaW5wdXQgaXMgaW4gdGhlIHdyb25nCisgIC8vIGZvcm1hdC4gIEEgc3VjY2Vzc2Z1bCByZXR1cm4gZG9lcyBub3QgaW5kaWNhdGUgdGhlIGVudGlyZSBpbnB1dCBpcworICAvLyBjb25zdW1lZCwgZW5zdXJlIHlvdSBjYWxsIENvbnN1bWVkRW50aXJlTWVzc2FnZSgpIHRvIGNoZWNrIHRoYXQgaWYKKyAgLy8gYXBwbGljYWJsZS4KKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgYm9vbCBQYXJzZUZyb21Db2RlZFN0cmVhbSgKKyAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIC8vIExpa2UgUGFyc2VGcm9tQ29kZWRTdHJlYW0oKSwgYnV0IGFjY2VwdHMgbWVzc2FnZXMgdGhhdCBhcmUgbWlzc2luZworICAvLyByZXF1aXJlZCBmaWVsZHMuCisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIGJvb2wgUGFyc2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgLy8gUmVhZCBhIHByb3RvY29sIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiB6ZXJvLWNvcHkgaW5wdXQgc3RyZWFtLiAgSWYKKyAgLy8gc3VjY2Vzc2Z1bCwgdGhlIGVudGlyZSBpbnB1dCB3aWxsIGJlIGNvbnN1bWVkLgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyBib29sIFBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKAorICAgICAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgLy8gTGlrZSBQYXJzZUZyb21aZXJvQ29weVN0cmVhbSgpLCBidXQgYWNjZXB0cyBtZXNzYWdlcyB0aGF0IGFyZSBtaXNzaW5nCisgIC8vIHJlcXVpcmVkIGZpZWxkcy4KKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgYm9vbCBQYXJzZVBhcnRpYWxGcm9tWmVyb0NvcHlTdHJlYW0oCisgICAgICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpOworICAvLyBQYXJzZSBhIHByb3RvY29sIGJ1ZmZlciBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGVudGlyZQorICAvLyBpbnB1dCB3aWxsIGJlIGNvbnN1bWVkLgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyBib29sIFBhcnNlRnJvbUZpbGVEZXNjcmlwdG9yKAorICAgICAgaW50IGZpbGVfZGVzY3JpcHRvcik7CisgIC8vIExpa2UgUGFyc2VGcm9tRmlsZURlc2NyaXB0b3IoKSwgYnV0IGFjY2VwdHMgbWVzc2FnZXMgdGhhdCBhcmUgbWlzc2luZworICAvLyByZXF1aXJlZCBmaWVsZHMuCisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIGJvb2wgUGFyc2VQYXJ0aWFsRnJvbUZpbGVEZXNjcmlwdG9yKAorICAgICAgaW50IGZpbGVfZGVzY3JpcHRvcik7CisgIC8vIFBhcnNlIGEgcHJvdG9jb2wgYnVmZmVyIGZyb20gYSBDKysgaXN0cmVhbS4gIElmIHN1Y2Nlc3NmdWwsIHRoZSBlbnRpcmUKKyAgLy8gaW5wdXQgd2lsbCBiZSBjb25zdW1lZC4KKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgYm9vbCBQYXJzZUZyb21Jc3RyZWFtKHN0ZDo6aXN0cmVhbSogaW5wdXQpOworICAvLyBMaWtlIFBhcnNlRnJvbUlzdHJlYW0oKSwgYnV0IGFjY2VwdHMgbWVzc2FnZXMgdGhhdCBhcmUgbWlzc2luZworICAvLyByZXF1aXJlZCBmaWVsZHMuCisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIGJvb2wgUGFyc2VQYXJ0aWFsRnJvbUlzdHJlYW0oCisgICAgICBzdGQ6OmlzdHJlYW0qIGlucHV0KTsKKyAgLy8gUmVhZCBhIHByb3RvY29sIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiB6ZXJvLWNvcHkgaW5wdXQgc3RyZWFtLCBleHBlY3RpbmcKKyAgLy8gdGhlIG1lc3NhZ2UgdG8gYmUgZXhhY3RseSAic2l6ZSIgYnl0ZXMgbG9uZy4gIElmIHN1Y2Nlc3NmdWwsIGV4YWN0bHkKKyAgLy8gdGhpcyBtYW55IGJ5dGVzIHdpbGwgaGF2ZSBiZWVuIGNvbnN1bWVkIGZyb20gdGhlIGlucHV0LgorICBib29sIE1lcmdlUGFydGlhbEZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpOworICAvLyBMaWtlIFBhcnNlRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbSgpLCBidXQgYWNjZXB0cyBtZXNzYWdlcyB0aGF0IGFyZQorICAvLyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBNZXJnZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBpbnQgc2l6ZSk7CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIGJvb2wgUGFyc2VGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtKAorICAgICAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBpbnQgc2l6ZSk7CisgIC8vIExpa2UgUGFyc2VGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtKCksIGJ1dCBhY2NlcHRzIG1lc3NhZ2VzIHRoYXQgYXJlCisgIC8vIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyBib29sIFBhcnNlUGFydGlhbEZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oCisgICAgICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIGludCBzaXplKTsKKyAgLy8gUGFyc2VzIGEgcHJvdG9jb2wgYnVmZmVyIGNvbnRhaW5lZCBpbiBhIHN0cmluZy4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCisgIC8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBzdHJpbmcgaW4gdGhlIChub24taHVtYW4tcmVhZGFibGUpIGJpbmFyeSB3aXJlCisgIC8vIGZvcm1hdCwgbWF0Y2hpbmcgdGhlIGVuY29kaW5nIG91dHB1dCBieSBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplVG9TdHJpbmcoKS4KKyAgLy8gSWYgeW91J2QgbGlrZSB0byBjb252ZXJ0IGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGludG8gYSBwcm90b2NvbCBidWZmZXIKKyAgLy8gb2JqZWN0LCBzZWUgZ29vZ2xlOjpwcm90b2J1Zjo6VGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKCkuCisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIGJvb2wgUGFyc2VGcm9tU3RyaW5nKENvbnN0U3RyaW5nUGFyYW0gZGF0YSk7CisgIC8vIExpa2UgUGFyc2VGcm9tU3RyaW5nKCksIGJ1dCBhY2NlcHRzIG1lc3NhZ2VzIHRoYXQgYXJlIG1pc3NpbmcKKyAgLy8gcmVxdWlyZWQgZmllbGRzLgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyBib29sIFBhcnNlUGFydGlhbEZyb21TdHJpbmcoCisgICAgICBDb25zdFN0cmluZ1BhcmFtIGRhdGEpOworICAvLyBQYXJzZSBhIHByb3RvY29sIGJ1ZmZlciBjb250YWluZWQgaW4gYW4gYXJyYXkgb2YgYnl0ZXMuCisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSk7CisgIC8vIExpa2UgUGFyc2VGcm9tQXJyYXkoKSwgYnV0IGFjY2VwdHMgbWVzc2FnZXMgdGhhdCBhcmUgbWlzc2luZworICAvLyByZXF1aXJlZCBmaWVsZHMuCisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIGJvb2wgUGFyc2VQYXJ0aWFsRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKTsKKworCisgIC8vIFJlYWRzIGEgcHJvdG9jb2wgYnVmZmVyIGZyb20gdGhlIHN0cmVhbSBhbmQgbWVyZ2VzIGl0IGludG8gdGhpcworICAvLyBNZXNzYWdlLiAgU2luZ3VsYXIgZmllbGRzIHJlYWQgZnJvbSB0aGUgd2hhdCBpcworICAvLyBhbHJlYWR5IGluIHRoZSBNZXNzYWdlIGFuZCByZXBlYXRlZCBmaWVsZHMgYXJlIGFwcGVuZGVkIHRvIHRob3NlCisgIC8vIGFscmVhZHkgcHJlc2VudC4KKyAgLy8KKyAgLy8gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gY2FsbCBpbnB1dC0+TGFzdFRhZ1dhcygpCisgIC8vIChmb3IgZ3JvdXBzKSBvciBpbnB1dC0+Q29uc3VtZWRFbnRpcmVNZXNzYWdlKCkgKGZvciBub24tZ3JvdXBzKSBhZnRlcgorICAvLyB0aGlzIHJldHVybnMgdG8gdmVyaWZ5IHRoYXQgdGhlIG1lc3NhZ2UncyBlbmQgd2FzIGRlbGltaXRlZCBjb3JyZWN0bHkuCisgIC8vCisgIC8vIFBhcnNlRnJvbUNvZGVkU3RyZWFtKCkgaXMgaW1wbGVtZW50ZWQgYXMgQ2xlYXIoKSBmb2xsb3dlZCBieQorICAvLyBNZXJnZUZyb21Db2RlZFN0cmVhbSgpLgorICBib29sIE1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisKKyAgLy8gTGlrZSBNZXJnZUZyb21Db2RlZFN0cmVhbSgpLCBidXQgc3VjY2VlZHMgZXZlbiBpZiByZXF1aXJlZCBmaWVsZHMgYXJlCisgIC8vIG1pc3NpbmcgaW4gdGhlIGlucHV0LgorICAvLworICAvLyBNZXJnZUZyb21Db2RlZFN0cmVhbSgpIGlzIGp1c3QgaW1wbGVtZW50ZWQgYXMgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKCkKKyAgLy8gZm9sbG93ZWQgYnkgSXNJbml0aWFsaXplZCgpLgorICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworCisgIC8vIE1lcmdlIGEgcHJvdG9jb2wgYnVmZmVyIGNvbnRhaW5lZCBpbiBhIHN0cmluZy4KKyAgYm9vbCBNZXJnZUZyb21TdHJpbmcoQ29uc3RTdHJpbmdQYXJhbSBkYXRhKTsKKworCisgIC8vIFNlcmlhbGl6YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIE1ldGhvZHMgZm9yIHNlcmlhbGl6aW5nIGluIHByb3RvY29sIGJ1ZmZlciBmb3JtYXQuICBNb3N0IG9mIHRoZXNlCisgIC8vIGFyZSBqdXN0IHNpbXBsZSB3cmFwcGVycyBhcm91bmQgQnl0ZVNpemUoKSBhbmQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkuCisKKyAgLy8gV3JpdGUgYSBwcm90b2NvbCBidWZmZXIgb2YgdGhpcyBtZXNzYWdlIHRvIHRoZSBnaXZlbiBvdXRwdXQuICBSZXR1cm5zCisgIC8vIGZhbHNlIG9uIGEgd3JpdGUgZXJyb3IuICBJZiB0aGUgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcywKKyAgLy8gdGhpcyBtYXkgR09PR0xFX0NIRUNLLWZhaWwuCisgIGJvb2wgU2VyaWFsaXplVG9Db2RlZFN0cmVhbShpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIC8vIExpa2UgU2VyaWFsaXplVG9Db2RlZFN0cmVhbSgpLCBidXQgYWxsb3dzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgorICBib29sIFNlcmlhbGl6ZVBhcnRpYWxUb0NvZGVkU3RyZWFtKGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgLy8gV3JpdGUgdGhlIG1lc3NhZ2UgdG8gdGhlIGdpdmVuIHplcm8tY29weSBvdXRwdXQgc3RyZWFtLiAgQWxsIHJlcXVpcmVkCisgIC8vIGZpZWxkcyBtdXN0IGJlIHNldC4KKyAgYm9vbCBTZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgLy8gTGlrZSBTZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKCksIGJ1dCBhbGxvd3MgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgU2VyaWFsaXplUGFydGlhbFRvWmVyb0NvcHlTdHJlYW0oaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICAvLyBTZXJpYWxpemUgdGhlIG1lc3NhZ2UgYW5kIHN0b3JlIGl0IGluIHRoZSBnaXZlbiBzdHJpbmcuICBBbGwgcmVxdWlyZWQKKyAgLy8gZmllbGRzIG11c3QgYmUgc2V0LgorICBib29sIFNlcmlhbGl6ZVRvU3RyaW5nKHN0ZDo6c3RyaW5nKiBvdXRwdXQpIGNvbnN0OworICAvLyBMaWtlIFNlcmlhbGl6ZVRvU3RyaW5nKCksIGJ1dCBhbGxvd3MgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKHN0ZDo6c3RyaW5nKiBvdXRwdXQpIGNvbnN0OworICAvLyBTZXJpYWxpemUgdGhlIG1lc3NhZ2UgYW5kIHN0b3JlIGl0IGluIHRoZSBnaXZlbiBieXRlIGFycmF5LiAgQWxsIHJlcXVpcmVkCisgIC8vIGZpZWxkcyBtdXN0IGJlIHNldC4KKyAgYm9vbCBTZXJpYWxpemVUb0FycmF5KHZvaWQqIGRhdGEsIGludCBzaXplKSBjb25zdDsKKyAgLy8gTGlrZSBTZXJpYWxpemVUb0FycmF5KCksIGJ1dCBhbGxvd3MgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgU2VyaWFsaXplUGFydGlhbFRvQXJyYXkodm9pZCogZGF0YSwgaW50IHNpemUpIGNvbnN0OworCisgIC8vIE1ha2UgYSBzdHJpbmcgZW5jb2RpbmcgdGhlIG1lc3NhZ2UuIElzIGVxdWl2YWxlbnQgdG8gY2FsbGluZworICAvLyBTZXJpYWxpemVUb1N0cmluZygpIG9uIGEgc3RyaW5nIGFuZCB1c2luZyB0aGF0LiAgUmV0dXJucyB0aGUgZW1wdHkKKyAgLy8gc3RyaW5nIGlmIFNlcmlhbGl6ZVRvU3RyaW5nKCkgd291bGQgaGF2ZSByZXR1cm5lZCBhbiBlcnJvci4KKyAgLy8gTm90ZTogSWYgeW91IGludGVuZCB0byBnZW5lcmF0ZSBtYW55IHN1Y2ggc3RyaW5ncywgeW91IG1heQorICAvLyByZWR1Y2UgaGVhcCBmcmFnbWVudGF0aW9uIGJ5IGluc3RlYWQgcmUtdXNpbmcgdGhlIHNhbWUgc3RyaW5nCisgIC8vIG9iamVjdCB3aXRoIGNhbGxzIHRvIFNlcmlhbGl6ZVRvU3RyaW5nKCkuCisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Q7CisgIC8vIExpa2UgU2VyaWFsaXplQXNTdHJpbmcoKSwgYnV0IGFsbG93cyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplUGFydGlhbEFzU3RyaW5nKCkgY29uc3Q7CisKKyAgLy8gU2VyaWFsaXplIHRoZSBtZXNzYWdlIGFuZCB3cml0ZSBpdCB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiAgQWxsCisgIC8vIHJlcXVpcmVkIGZpZWxkcyBtdXN0IGJlIHNldC4KKyAgYm9vbCBTZXJpYWxpemVUb0ZpbGVEZXNjcmlwdG9yKGludCBmaWxlX2Rlc2NyaXB0b3IpIGNvbnN0OworICAvLyBMaWtlIFNlcmlhbGl6ZVRvRmlsZURlc2NyaXB0b3IoKSwgYnV0IGFsbG93cyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBTZXJpYWxpemVQYXJ0aWFsVG9GaWxlRGVzY3JpcHRvcihpbnQgZmlsZV9kZXNjcmlwdG9yKSBjb25zdDsKKyAgLy8gU2VyaWFsaXplIHRoZSBtZXNzYWdlIGFuZCB3cml0ZSBpdCB0byB0aGUgZ2l2ZW4gQysrIG9zdHJlYW0uICBBbGwKKyAgLy8gcmVxdWlyZWQgZmllbGRzIG11c3QgYmUgc2V0LgorICBib29sIFNlcmlhbGl6ZVRvT3N0cmVhbShzdGQ6Om9zdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIC8vIExpa2UgU2VyaWFsaXplVG9Pc3RyZWFtKCksIGJ1dCBhbGxvd3MgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgU2VyaWFsaXplUGFydGlhbFRvT3N0cmVhbShzdGQ6Om9zdHJlYW0qIG91dHB1dCkgY29uc3Q7CisKKyAgLy8gTGlrZSBTZXJpYWxpemVUb1N0cmluZygpLCBidXQgYXBwZW5kcyB0byB0aGUgZGF0YSB0byB0aGUgc3RyaW5nJ3MKKyAgLy8gZXhpc3RpbmcgY29udGVudHMuICBBbGwgcmVxdWlyZWQgZmllbGRzIG11c3QgYmUgc2V0LgorICBib29sIEFwcGVuZFRvU3RyaW5nKHN0ZDo6c3RyaW5nKiBvdXRwdXQpIGNvbnN0OworICAvLyBMaWtlIEFwcGVuZFRvU3RyaW5nKCksIGJ1dCBhbGxvd3MgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgQXBwZW5kUGFydGlhbFRvU3RyaW5nKHN0ZDo6c3RyaW5nKiBvdXRwdXQpIGNvbnN0OworCisKKyAgLy8gQ29tcHV0ZXMgdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiB0aGUgbWVzc2FnZS4gIFRoaXMgcmVjdXJzaXZlbHkgY2FsbHMKKyAgLy8gQnl0ZVNpemVMb25nKCkgb24gYWxsIGVtYmVkZGVkIG1lc3NhZ2VzLgorICAvLworICAvLyBCeXRlU2l6ZUxvbmcoKSBpcyBnZW5lcmFsbHkgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgZmllbGRzIGRlZmluZWQgZm9yIHRoZQorICAvLyBwcm90by4KKyAgdmlydHVhbCBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgPSAwOworCisgIC8vIExlZ2FjeSBCeXRlU2l6ZSgpIEFQSS4KKyAgUFJPVE9CVUZfREVQUkVDQVRFRF9NU0coIlBsZWFzZSB1c2UgQnl0ZVNpemVMb25nKCkgaW5zdGVhZCIpCisgIGludCBCeXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpUb0ludFNpemUoQnl0ZVNpemVMb25nKCkpOyB9CisKKyAgLy8gU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB3aXRob3V0IHJlY29tcHV0aW5nIHRoZSBzaXplLiAgVGhlIG1lc3NhZ2UgbXVzdCBub3QKKyAgLy8gaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gQnl0ZVNpemUoKSwgYW5kIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAvLyBCeXRlU2l6ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4gIE90aGVyd2lzZSB0aGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkLgorICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAgIG91dHB1dC0+U2V0Q3VyKF9JbnRlcm5hbFNlcmlhbGl6ZShvdXRwdXQtPkN1cigpLCBvdXRwdXQtPkVwc0NvcHkoKSkpOworICB9CisKKyAgLy8gRnVuY3Rpb25zIGJlbG93IGhlcmUgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLiAgSXQgaXNuJ3QKKyAgLy8gZW5mb3JjZWQsIGJ1dCB0aGV5IHNob3VsZCBiZSB0cmVhdGVkIGFzIHByaXZhdGUsIGFuZCB3aWxsIGJlIHByaXZhdGUKKyAgLy8gYXQgc29tZSBmdXR1cmUgdGltZS4gIFVuZm9ydHVuYXRlbHkgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSAiZnJpZW5kIgorICAvLyBrZXl3b3JkIGluIEdDQyBpcyBicm9rZW4gYXQgdGhlIG1vbWVudCwgYnV0IHdlIGV4cGVjdCBpdCB3aWxsIGJlIGZpeGVkLgorCisgIC8vIExpa2UgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzLCBidXQgd3JpdGVzIGRpcmVjdGx5IHRvICp0YXJnZXQsIHJldHVybmluZworICAvLyBhIHBvaW50ZXIgdG8gdGhlIGJ5dGUgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGxhc3QgYnl0ZSB3cml0dGVuLiAgInRhcmdldCIKKyAgLy8gbXVzdCBwb2ludCBhdCBhIGJ5dGUgYXJyYXkgb2YgYXQgbGVhc3QgQnl0ZVNpemUoKSBieXRlcy4gIFdoZXRoZXIgdG8gdXNlCisgIC8vIGRldGVybWluaXN0aWMgc2VyaWFsaXphdGlvbiwgZS5nLiwgbWFwcyBpbiBzb3J0ZWQgb3JkZXIsIGlzIGRldGVybWluZWQgYnkKKyAgLy8gQ29kZWRPdXRwdXRTdHJlYW06OklzRGVmYXVsdFNlcmlhbGl6YXRpb25EZXRlcm1pbmlzdGljKCkuCisgIHVpbnQ4X3QqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodWludDhfdCogdGFyZ2V0KSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgY2FsbCB0byBCeXRlU2l6ZSgpLiAgQW4gZW1iZWRkZWQgbWVzc2FnZSdzCisgIC8vIHNpemUgaXMgbmVlZGVkIGJvdGggdG8gc2VyaWFsaXplIGl0IChiZWNhdXNlIGVtYmVkZGVkIG1lc3NhZ2VzIGFyZQorICAvLyBsZW5ndGgtZGVsaW1pdGVkKSBhbmQgdG8gY29tcHV0ZSB0aGUgb3V0ZXIgbWVzc2FnZSdzIHNpemUuICBDYWNoaW5nCisgIC8vIHRoZSBzaXplIGF2b2lkcyBjb21wdXRpbmcgaXQgbXVsdGlwbGUgdGltZXMuCisgIC8vCisgIC8vIEJ5dGVTaXplKCkgZG9lcyBub3QgYXV0b21hdGljYWxseSB1c2UgdGhlIGNhY2hlZCBzaXplIHdoZW4gYXZhaWxhYmxlCisgIC8vIGJlY2F1c2UgdGhpcyB3b3VsZCByZXF1aXJlIGludmFsaWRhdGluZyBpdCBldmVyeSB0aW1lIHRoZSBtZXNzYWdlIHdhcworICAvLyBtb2RpZmllZCwgd2hpY2ggd291bGQgYmUgdG9vIGhhcmQgYW5kIGV4cGVuc2l2ZS4gIChFLmcuIGlmIGEgZGVlcGx5LW5lc3RlZAorICAvLyBzdWItbWVzc2FnZSBpcyBjaGFuZ2VkLCBhbGwgb2YgaXRzIHBhcmVudHMnIGNhY2hlZCBzaXplcyB3b3VsZCBuZWVkIHRvIGJlCisgIC8vIGludmFsaWRhdGVkLCB3aGljaCBpcyB0b28gbXVjaCB3b3JrIGZvciBhbiBvdGhlcndpc2UgaW5saW5lZCBzZXR0ZXIKKyAgLy8gbWV0aG9kLikKKyAgdmlydHVhbCBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIC8qcHRyKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlBhcnNlQ29udGV4dCogLypjdHgqLykgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uRGVtYW5kUmVnaXN0ZXJBcmVuYUR0b3IoQXJlbmEqIC8qYXJlbmEqLykge30KKworIHByb3RlY3RlZDoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBUKiBDcmVhdGVNYXliZU1lc3NhZ2UoQXJlbmEqIGFyZW5hKSB7CisgICAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8VD4oYXJlbmEpOworICB9CisKKyAgaW5saW5lIGV4cGxpY2l0IE1lc3NhZ2VMaXRlKEFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpCisgICAgICA6IF9pbnRlcm5hbF9tZXRhZGF0YV8oYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHt9CisKKyAgLy8gUmV0dXJucyB0aGUgYXJlbmEsIGlmIGFueSwgdGhhdCBkaXJlY3RseSBvd25zIHRoaXMgbWVzc2FnZSBhbmQgaXRzIGludGVybmFsCisgIC8vIG1lbW9yeSAoQXJlbmE6Ok93biBpcyBkaWZmZXJlbnQgaW4gdGhhdCB0aGUgYXJlbmEgZG9lc24ndCBkaXJlY3RseSBvd24gdGhlCisgIC8vIGludGVybmFsIG1lbW9yeSkuIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gcHJvdG8ncyBpbXBsZW1lbnRhdGlvbiBmb3IKKyAgLy8gc3dhcHBpbmcsIG1vdmluZyBhbmQgc2V0dGluZyBhbGxvY2F0ZWQsIGZvciBkZWNpZGluZyB3aGV0aGVyIHRoZSBvd25lcnNoaXAKKyAgLy8gb2YgdGhpcyBtZXNzYWdlIG9yIGl0cyBpbnRlcm5hbCBtZW1vcnkgY291bGQgYmUgY2hhbmdlZC4KKyAgQXJlbmEqIEdldE93bmluZ0FyZW5hKCkgY29uc3QgeyByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5vd25pbmdfYXJlbmEoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIGFyZW5hLCB1c2VkIGZvciBhbGxvY2F0aW5nIGludGVybmFsIG9iamVjdHMoZS5nLiwgY2hpbGQKKyAgLy8gbWVzc2FnZXMsIGV0YyksIG9yIG93bmluZyBpbmNvbWluZyBvYmplY3RzIChlLmcuLCBzZXQgYWxsb2NhdGVkKS4KKyAgQXJlbmEqIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1lc3NhZ2UgaXMgZW5hYmxlZCBmb3IgbWVzc2FnZS1vd25lZCBhcmVuYSAoTU9BKQorICAvLyB0cmlhbHMuIE5vIGxpdGUgbWVzc2FnZXMgYXJlIGVsaWdpYmxlIGZvciBNT0EuCisgIHN0YXRpYyBib29sIEluTW9hVHJpYWwoKSB7IHJldHVybiBmYWxzZTsgfQorCisgIGludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhIF9pbnRlcm5hbF9tZXRhZGF0YV87CisKKyBwdWJsaWM6CisgIGVudW0gUGFyc2VGbGFncyB7CisgICAga01lcmdlID0gMCwKKyAgICBrUGFyc2UgPSAxLAorICAgIGtNZXJnZVBhcnRpYWwgPSAyLAorICAgIGtQYXJzZVBhcnRpYWwgPSAzLAorICAgIGtNZXJnZVdpdGhBbGlhc2luZyA9IDQsCisgICAga1BhcnNlV2l0aEFsaWFzaW5nID0gNSwKKyAgICBrTWVyZ2VQYXJ0aWFsV2l0aEFsaWFzaW5nID0gNiwKKyAgICBrUGFyc2VQYXJ0aWFsV2l0aEFsaWFzaW5nID0gNworICB9OworCisgIHRlbXBsYXRlIDxQYXJzZUZsYWdzIGZsYWdzLCB0eXBlbmFtZSBUPgorICBib29sIFBhcnNlRnJvbShjb25zdCBUJiBpbnB1dCk7CisKKyAgLy8gRmFzdCBwYXRoIHdoZW4gY29uZGl0aW9ucyBtYXRjaCAoaWUuIG5vbi1kZXRlcm1pbmlzdGljKQorICAvLyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKHVpbnQ4X3QqIHB0cikgY29uc3Q7CisgIHZpcnR1YWwgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogcHRyLCBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCA9IDA7CisKKyAgLy8gSWRlbnRpY2FsIHRvIElzSW5pdGlhbGl6ZWQoKSBleGNlcHQgdGhhdCBpdCBsb2dzIGFuIGVycm9yIG1lc3NhZ2UuCisgIGJvb2wgSXNJbml0aWFsaXplZFdpdGhFcnJvcnMoKSBjb25zdCB7CisgICAgaWYgKElzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIHRydWU7CisgICAgTG9nSW5pdGlhbGl6YXRpb25FcnJvck1lc3NhZ2UoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBGYXN0UmVmbGVjdGlvbk1lc3NhZ2VNdXRhdG9yOworICBmcmllbmQgY2xhc3MgRmFzdFJlZmxlY3Rpb25TdHJpbmdTZXR0ZXI7CisgIGZyaWVuZCBjbGFzcyBNZXNzYWdlOworICBmcmllbmQgY2xhc3MgUmVmbGVjdGlvbjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpFeHRlbnNpb25TZXQ7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6TGF6eUZpZWxkOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlN3YXBGaWVsZEhlbHBlcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpUY1BhcnNlcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpXZWFrRmllbGRNYXA7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CisgIGZyaWVuZCBjbGFzcyBBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkdlbmVyaWNUeXBlSGFuZGxlcjsKKworICB2b2lkIExvZ0luaXRpYWxpemF0aW9uRXJyb3JNZXNzYWdlKCkgY29uc3Q7CisKKyAgYm9vbCBNZXJnZUZyb21JbXBsKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgUGFyc2VGbGFncyBwYXJzZV9mbGFncyk7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2VMaXRlKTsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlIDxib29sIGFsaWFzPgorYm9vbCBNZXJnZUZyb21JbXBsKFN0cmluZ1BpZWNlIGlucHV0LCBNZXNzYWdlTGl0ZSogbXNnLAorICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlOjpQYXJzZUZsYWdzIHBhcnNlX2ZsYWdzKTsKK2V4dGVybiB0ZW1wbGF0ZSBib29sIE1lcmdlRnJvbUltcGw8ZmFsc2U+KFN0cmluZ1BpZWNlIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlOjpQYXJzZUZsYWdzIHBhcnNlX2ZsYWdzKTsKK2V4dGVybiB0ZW1wbGF0ZSBib29sIE1lcmdlRnJvbUltcGw8dHJ1ZT4oU3RyaW5nUGllY2UgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlOjpQYXJzZUZsYWdzIHBhcnNlX2ZsYWdzKTsKKwordGVtcGxhdGUgPGJvb2wgYWxpYXM+Citib29sIE1lcmdlRnJvbUltcGwoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBNZXNzYWdlTGl0ZSogbXNnLAorICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlOjpQYXJzZUZsYWdzIHBhcnNlX2ZsYWdzKTsKK2V4dGVybiB0ZW1wbGF0ZSBib29sIE1lcmdlRnJvbUltcGw8ZmFsc2U+KGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZTo6UGFyc2VGbGFncyBwYXJzZV9mbGFncyk7CitleHRlcm4gdGVtcGxhdGUgYm9vbCBNZXJnZUZyb21JbXBsPHRydWU+KGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGU6OlBhcnNlRmxhZ3MgcGFyc2VfZmxhZ3MpOworCitzdHJ1Y3QgQm91bmRlZFpDSVMgeworICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogemNpczsKKyAgaW50IGxpbWl0OworfTsKKwordGVtcGxhdGUgPGJvb2wgYWxpYXM+Citib29sIE1lcmdlRnJvbUltcGwoQm91bmRlZFpDSVMgaW5wdXQsIE1lc3NhZ2VMaXRlKiBtc2csCisgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGU6OlBhcnNlRmxhZ3MgcGFyc2VfZmxhZ3MpOworZXh0ZXJuIHRlbXBsYXRlIGJvb2wgTWVyZ2VGcm9tSW1wbDxmYWxzZT4oQm91bmRlZFpDSVMgaW5wdXQsIE1lc3NhZ2VMaXRlKiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZTo6UGFyc2VGbGFncyBwYXJzZV9mbGFncyk7CitleHRlcm4gdGVtcGxhdGUgYm9vbCBNZXJnZUZyb21JbXBsPHRydWU+KEJvdW5kZWRaQ0lTIGlucHV0LCBNZXNzYWdlTGl0ZSogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZTo6UGFyc2VGbGFncyBwYXJzZV9mbGFncyk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFNvdXJjZVdyYXBwZXI7CisKK3RlbXBsYXRlIDxib29sIGFsaWFzLCB0eXBlbmFtZSBUPgorYm9vbCBNZXJnZUZyb21JbXBsKGNvbnN0IFNvdXJjZVdyYXBwZXI8VD4mIGlucHV0LCBNZXNzYWdlTGl0ZSogbXNnLAorICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlOjpQYXJzZUZsYWdzIHBhcnNlX2ZsYWdzKSB7CisgIHJldHVybiBpbnB1dC50ZW1wbGF0ZSBNZXJnZUludG88YWxpYXM+KG1zZywgcGFyc2VfZmxhZ3MpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGUgPE1lc3NhZ2VMaXRlOjpQYXJzZUZsYWdzIGZsYWdzLCB0eXBlbmFtZSBUPgorYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VGcm9tKGNvbnN0IFQmIGlucHV0KSB7CisgIGlmIChmbGFncyAmIGtQYXJzZSkgQ2xlYXIoKTsKKyAgY29uc3RleHByIGJvb2wgYWxpYXMgPSAoZmxhZ3MgJiBrTWVyZ2VXaXRoQWxpYXNpbmcpICE9IDA7CisgIHJldHVybiBpbnRlcm5hbDo6TWVyZ2VGcm9tSW1wbDxhbGlhcz4oaW5wdXQsIHRoaXMsIGZsYWdzKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gU2h1dGRvd24gc3VwcG9ydC4KKworCisvLyBTaHV0IGRvd24gdGhlIGVudGlyZSBwcm90b2NvbCBidWZmZXJzIGxpYnJhcnksIGRlbGV0aW5nIGFsbCBzdGF0aWMtZHVyYXRpb24KKy8vIG9iamVjdHMgYWxsb2NhdGVkIGJ5IHRoZSBsaWJyYXJ5IG9yIGJ5IGdlbmVyYXRlZCAucGIuY2MgZmlsZXMuCisvLworLy8gVGhlcmUgYXJlIHR3byByZWFzb25zIHlvdSBtaWdodCB3YW50IHRvIGNhbGwgdGhpczoKKy8vICogWW91IHVzZSBhIGRyYWNvbmlhbiBkZWZpbml0aW9uIG9mICJtZW1vcnkgbGVhayIgaW4gd2hpY2ggeW91IGV4cGVjdAorLy8gICBldmVyeSBzaW5nbGUgbWFsbG9jKCkgdG8gaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZnJlZSgpLCBldmVuIGZvciBvYmplY3RzCisvLyAgIHdoaWNoIGxpdmUgdW50aWwgcHJvZ3JhbSBleGl0LgorLy8gKiBZb3UgYXJlIHdyaXRpbmcgYSBkeW5hbWljYWxseS1sb2FkZWQgbGlicmFyeSB3aGljaCBuZWVkcyB0byBjbGVhbiB1cAorLy8gICBhZnRlciBpdHNlbGYgd2hlbiB0aGUgbGlicmFyeSBpcyB1bmxvYWRlZC4KKy8vCisvLyBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtdWx0aXBsZSB0aW1lcy4gIEhvd2V2ZXIsIGl0IGlzIG5vdCBzYWZlIHRvIHVzZQorLy8gYW55IG90aGVyIHBhcnQgb2YgdGhlIHByb3RvY29sIGJ1ZmZlcnMgbGlicmFyeSBhZnRlcgorLy8gU2h1dGRvd25Qcm90b2J1ZkxpYnJhcnkoKSBoYXMgYmVlbiBjYWxsZWQuIEZ1cnRoZXJtb3JlIHRoaXMgY2FsbCBpcyBub3QKKy8vIHRocmVhZCBzYWZlLCB1c2VyIG5lZWRzIHRvIHN5bmNocm9uaXplIG11bHRpcGxlIGNhbGxzLgorUFJPVE9CVUZfRVhQT1JUIHZvaWQgU2h1dGRvd25Qcm90b2J1ZkxpYnJhcnkoKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gUmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBTaHV0ZG93blByb3RvY29sQnVmZmVycygpIGlzIGNhbGxlZC4KK1BST1RPQlVGX0VYUE9SVCB2b2lkIE9uU2h1dGRvd24odm9pZCAoKmZ1bmMpKCkpOworLy8gUnVuIGFuIGFyYml0cmFyeSBmdW5jdGlvbiBvbiBhbiBhcmcKK1BST1RPQlVGX0VYUE9SVCB2b2lkIE9uU2h1dGRvd25SdW4odm9pZCAoKmYpKGNvbnN0IHZvaWQqKSwgY29uc3Qgdm9pZCogYXJnKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUKiBPblNodXRkb3duRGVsZXRlKFQqIHApIHsKKyAgT25TaHV0ZG93blJ1bihbXShjb25zdCB2b2lkKiBwcCkgeyBkZWxldGUgc3RhdGljX2Nhc3Q8Y29uc3QgVCo+KHBwKTsgfSwgcCk7CisgIHJldHVybiBwOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9NRVNTQUdFX0xJVEVfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcxZjYwYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDQ4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKworI2RlZmluZSBNRVNTQUdFX1RFU1RfTkFNRSBNZXNzYWdlVGVzdAorI2RlZmluZSBNRVNTQUdFX0ZBQ1RPUllfVEVTVF9OQU1FIE1lc3NhZ2VGYWN0b3J5VGVzdAorI2RlZmluZSBVTklUVEVTVF9QQUNLQUdFX05BTUUgInByb3RvYnVmX3VuaXR0ZXN0IgorI2RlZmluZSBVTklUVEVTVCA6OnByb3RvYnVmX3VuaXR0ZXN0CisjZGVmaW5lIFVOSVRURVNUX0lNUE9SVCA6OnByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydAorCisvLyBNdXN0IGluY2x1ZGUgYWZ0ZXIgdGhlIGFib3ZlIG1hY3Jvcy4KKy8vIGNsYW5nLWZvcm1hdCBvZmYKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmluYz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5pbmM+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisvLyBjbGFuZy1mb3JtYXQgb24KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5pbmMgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMmJiYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuaW5jCkBAIC0wLDAgKzEsMTEzMSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBuZWVkcyB0byBiZSBpbmNsdWRlZCBhcyAuaW5jIGFzIGl0IGRlcGVuZHMgb24gY2VydGFpbiBtYWNyb3MgYmVpbmcKKy8vIGRlZmluZWQgcHJpb3IgdG8gaXRzIGluY2x1c2lvbi4KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaWZuZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbDIuaD4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKy8vIERPIE5PVCBpbmNsdWRlIDxpby5oPiwgaW5zdGVhZCBjcmVhdGUgZnVuY3Rpb25zIGluIGlvX3dpbjMyLntoLGNjfSBhbmQgaW1wb3J0CisvLyB0aGVtIGxpa2Ugd2UgZG8gYmVsb3cuCit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbzo6d2luMzI6OmNsb3NlOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjpvcGVuOworI2VuZGlmCisKKyNpZm5kZWYgT19CSU5BUlkKKyNpZmRlZiBfT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgX09fQklOQVJZCisjZWxzZQorI2RlZmluZSBPX0JJTkFSWSAwICAvLyBJZiB0aGlzIGlzbid0IGRlZmluZWQsIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IG5lZWQgaXQuCisjZW5kaWYKKyNlbmRpZgorCitURVNUKE1FU1NBR0VfVEVTVF9OQU1FLCBTZXJpYWxpemVIZWxwZXJzKSB7CisgIC8vIFRPRE8oa2VudG9uKTogIFRlc3QgbW9yZSBoZWxwZXJzPyAgVGhleSdyZSBhbGwgdHdvLWxpbmVycyBzbyBpdCBzZWVtcworICAvLyAgIGxpa2UgYSB3YXN0ZSBvZiB0aW1lLgorCisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKKworICBzdGQ6OnN0cmluZyBzdHIxKCJmb28iKTsKKyAgc3RkOjpzdHJpbmcgc3RyMigiYmFyIik7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmc3RyMSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkFwcGVuZFRvU3RyaW5nKCZzdHIyKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuU2VyaWFsaXplVG9Pc3RyZWFtKCZzdHJlYW0pKTsKKworICBFWFBFQ1RfRVEoc3RyMS5zaXplKCkgKyAzLCBzdHIyLnNpemUoKSk7CisgIEVYUEVDVF9FUSgiYmFyIiwgc3RyMi5zdWJzdHIoMCwgMykpOworICAvLyBEb24ndCB1c2UgRVhQRUNUX0VRIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkdW1wIHJhdyBiaW5hcnkgZGF0YSB0bworICAvLyBzdGRvdXQuCisgIEVYUEVDVF9UUlVFKHN0cjIuc3Vic3RyKDMpID09IHN0cjEpOworCisgIC8vIEdDQyBnaXZlcyBzb21lIHNvcnQgb2YgZXJyb3IgaWYgd2UgdHJ5IHRvIGp1c3QgZG8gc3RyZWFtLnN0cigpID09IHN0cjEuCisgIHN0ZDo6c3RyaW5nIHRlbXAgPSBzdHJlYW0uc3RyKCk7CisgIEVYUEVDVF9UUlVFKHRlbXAgPT0gc3RyMSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpID09IHN0cjEpOworCit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIFNlcmlhbGl6ZVRvQnJva2VuT3N0cmVhbSkgeworICBzdGQ6Om9mc3RyZWFtIG91dDsKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9pbnQzMigxMjMpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlNlcmlhbGl6ZVRvT3N0cmVhbSgmb3V0KSk7Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIFBhcnNlRnJvbUZpbGVEZXNjcmlwdG9yKSB7CisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0KKyAgICAgIFRlc3RVdGlsOjpHZXRUZXN0RGF0YVBhdGgoIm5ldC9wcm90bzIvaW50ZXJuYWwvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UiKTsKKyAgaW50IGZpbGUgPSBvcGVuKGZpbGVuYW1lLmNfc3RyKCksIE9fUkRPTkxZIHwgT19CSU5BUlkpOworICBBU1NFUlRfR0UoZmlsZSwgMCk7CisKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbUZpbGVEZXNjcmlwdG9yKGZpbGUpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlKTsKKworICBFWFBFQ1RfR0UoY2xvc2UoZmlsZSksIDApOworfQorCitURVNUKE1FU1NBR0VfVEVTVF9OQU1FLCBQYXJzZVBhY2tlZEZyb21GaWxlRGVzY3JpcHRvcikgeworICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IFRlc3RVdGlsOjpHZXRUZXN0RGF0YVBhdGgoCisgICAgICAibmV0L3Byb3RvMi9pbnRlcm5hbC90ZXN0ZGF0YS9nb2xkZW5fcGFja2VkX2ZpZWxkc19tZXNzYWdlIik7CisgIGludCBmaWxlID0gb3BlbihmaWxlbmFtZS5jX3N0cigpLCBPX1JET05MWSB8IE9fQklOQVJZKTsKKyAgQVNTRVJUX0dFKGZpbGUsIDApOworCisgIFVOSVRURVNUOjpUZXN0UGFja2VkVHlwZXMgbWVzc2FnZTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21GaWxlRGVzY3JpcHRvcihmaWxlKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRGaWVsZHNTZXQobWVzc2FnZSk7CisKKyAgRVhQRUNUX0dFKGNsb3NlKGZpbGUpLCAwKTsKK30KKworVEVTVChNRVNTQUdFX1RFU1RfTkFNRSwgUGFyc2VIZWxwZXJzKSB7CisgIC8vIFRPRE8oa2VudG9uKTogIFRlc3QgbW9yZSBoZWxwZXJzPyAgVGhleSdyZSBhbGwgdHdvLWxpbmVycyBzbyBpdCBzZWVtcworICAvLyAgIGxpa2UgYSB3YXN0ZSBvZiB0aW1lLgorICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICAvLyBTZXQgdXAuCisgICAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICAgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICAgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworICB9CisKKyAgeworICAgIC8vIFRlc3QgUGFyc2VGcm9tU3RyaW5nLgorICAgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlKTsKKyAgfQorCisgIHsKKyAgICAvLyBUZXN0IFBhcnNlRnJvbUlzdHJlYW0uCisgICAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbShkYXRhKTsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbUlzdHJlYW0oJnN0cmVhbSkpOworICAgIEVYUEVDVF9UUlVFKHN0cmVhbS5lb2YoKSk7CisgICAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlKTsKKyAgfQorCisgIHsKKyAgICAvLyBUZXN0IFBhcnNlRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbS4KKyAgICBzdGQ6OnN0cmluZyBkYXRhX3dpdGhfanVuayhkYXRhKTsKKyAgICBkYXRhX3dpdGhfanVuay5hcHBlbmQoInNvbWUganVuayBvbiB0aGUgZW5kIik7CisgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gc3RyZWFtKGRhdGFfd2l0aF9qdW5rLmRhdGEoKSwgZGF0YV93aXRoX2p1bmsuc2l6ZSgpKTsKKyAgICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oJnN0cmVhbSwgZGF0YS5zaXplKCkpKTsKKyAgICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworICB9CisKKyAgeworICAgIC8vIFRlc3QgdGhhdCBQYXJzZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0gZmFpbHMgKGJ1dCBkb2Vzbid0IGNyYXNoKSBpZgorICAgIC8vIEVPRiBpcyByZWFjaGVkIGJlZm9yZSB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGJ5dGVzLgorICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIHN0cmVhbShkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgICBFWFBFQ1RfRkFMU0UoCisgICAgICAgIG1lc3NhZ2UuUGFyc2VGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtKCZzdHJlYW0sIGRhdGEuc2l6ZSgpICsgMSkpOworICB9Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIFBhcnNlRmFpbHNJZk5vdEluaXRpYWxpemVkKSB7CisgIFVOSVRURVNUOjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVycm9yczsKKworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKKyAgICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoIiIpKTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisKKyAgQVNTRVJUX0VRKDEsIGVycm9ycy5zaXplKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAiQ2FuJ3QgcGFyc2UgbWVzc2FnZSBvZiB0eXBlIFwiIiArIHN0ZDo6c3RyaW5nKFVOSVRURVNUX1BBQ0tBR0VfTkFNRSkgKworICAgICAgICAgICIuVGVzdFJlcXVpcmVkXCIgYmVjYXVzZSBpdCBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYSwgYiwgYyIsCisgICAgICBlcnJvcnNbMF0pOworfQorCitURVNUKE1FU1NBR0VfVEVTVF9OQU1FLCBQYXJzZUZhaWxzSWZTdWJtZXNzYWdlTm90SW5pdGlhbGl6ZWQpIHsKKyAgVU5JVFRFU1Q6OlRlc3RSZXF1aXJlZEZvcmVpZ24gc291cmNlLCBtZXNzYWdlOworICBzb3VyY2UubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCktPnNldF9kdW1teTIoMTAwKTsKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZCA9IHNvdXJjZS5TZXJpYWxpemVQYXJ0aWFsQXNTdHJpbmcoKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlUGFydGlhbEZyb21TdHJpbmcoc2VyaWFsaXplZCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlcnJvcnM7CisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzb3VyY2UuU2VyaWFsaXplUGFydGlhbEFzU3RyaW5nKCkpKTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisKKyAgRVhQRUNUX1RIQVQoCisgICAgICBlcnJvcnMsCisgICAgICB0ZXN0aW5nOjpFbGVtZW50c0FyZSgKKyAgICAgICAgICAiQ2FuJ3QgcGFyc2UgbWVzc2FnZSBvZiB0eXBlIFwiIiArCisgICAgICAgICAgc3RkOjpzdHJpbmcoVU5JVFRFU1RfUEFDS0FHRV9OQU1FKSArCisgICAgICAgICAgIi5UZXN0UmVxdWlyZWRGb3JlaWduXCIgYmVjYXVzZSBpdCBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogIgorICAgICAgICAgICJvcHRpb25hbF9tZXNzYWdlLmEsIG9wdGlvbmFsX21lc3NhZ2UuYiwgb3B0aW9uYWxfbWVzc2FnZS5jIikpOworfQorCitURVNUKE1FU1NBR0VfVEVTVF9OQU1FLCBQYXJzZUZhaWxzSWZFeHRlbnNpb25Ob3RJbml0aWFsaXplZCkgeworICBVTklUVEVTVDo6VGVzdENoaWxkRXh0ZW5zaW9uIHNvdXJjZSwgbWVzc2FnZTsKKyAgYXV0byogciA9IHNvdXJjZS5tdXRhYmxlX29wdGlvbmFsX2V4dGVuc2lvbigpLT5NdXRhYmxlRXh0ZW5zaW9uKAorICAgICAgVU5JVFRFU1Q6OlRlc3RSZXF1aXJlZDo6c2luZ2xlKTsKKyAgci0+c2V0X2R1bW15MigxMDApOworICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkID0gc291cmNlLlNlcmlhbGl6ZVBhcnRpYWxBc1N0cmluZygpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VQYXJ0aWFsRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVycm9yczsKKyAgeworICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7CisgICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNvdXJjZS5TZXJpYWxpemVQYXJ0aWFsQXNTdHJpbmcoKSkpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKworICBFWFBFQ1RfVEhBVChlcnJvcnMsCisgICAgICAgICAgICAgIHRlc3Rpbmc6OkVsZW1lbnRzQXJlKHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICAgICAgICAgICAiQ2FuJ3QgcGFyc2UgbWVzc2FnZSBvZiB0eXBlIFwiJDAuVGVzdENoaWxkRXh0ZW5zaW9uXCIgIgorICAgICAgICAgICAgICAgICAgImJlY2F1c2UgaXQgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICIKKyAgICAgICAgICAgICAgICAgICJvcHRpb25hbF9leHRlbnNpb24uKCQwLlRlc3RSZXF1aXJlZC5zaW5nbGUpLmEsICIKKyAgICAgICAgICAgICAgICAgICJvcHRpb25hbF9leHRlbnNpb24uKCQwLlRlc3RSZXF1aXJlZC5zaW5nbGUpLmIsICIKKyAgICAgICAgICAgICAgICAgICJvcHRpb25hbF9leHRlbnNpb24uKCQwLlRlc3RSZXF1aXJlZC5zaW5nbGUpLmMiLAorICAgICAgICAgICAgICAgICAgVU5JVFRFU1RfUEFDS0FHRV9OQU1FKSkpOworfQorCitURVNUKE1FU1NBR0VfVEVTVF9OQU1FLCBNZXJnZUZyb21VbmluaXRpYWxpemVkKSB7CisgIFVOSVRURVNUOjpUZXN0TmVzdGVkUmVxdWlyZWRGb3JlaWduIG8sIHAsIHE7CisgIFVOSVRURVNUOjpUZXN0TmVzdGVkUmVxdWlyZWRGb3JlaWduKiBjaGlsZCA9IG8ubXV0YWJsZV9jaGlsZCgpOworICBjb25zdGV4cHIgaW50IGtEZXB0aCA9IDI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga0RlcHRoOyBpKyspIHsKKyAgICBjaGlsZC0+c2V0X2R1bW15KGkpOworICAgIGNoaWxkID0gY2hpbGQtPm11dGFibGVfY2hpbGQoKTsKKyAgfQorICBVTklUVEVTVDo6VGVzdFJlcXVpcmVkRm9yZWlnbiogcGF5bG9hZCA9IGNoaWxkLT5tdXRhYmxlX3BheWxvYWQoKTsKKyAgcGF5bG9hZC0+bXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCktPnNldF9hKDEpOworICBwYXlsb2FkLT5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2R1bW15MigxMDApOworICBwYXlsb2FkLT5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2R1bW15NCgyMDApOworICBBU1NFUlRfVFJVRShwLlBhcnNlUGFydGlhbEZyb21TdHJpbmcoby5TZXJpYWxpemVQYXJ0aWFsQXNTdHJpbmcoKSkpOworCisgIHEubXV0YWJsZV9jaGlsZCgpLT5zZXRfZHVtbXkoNTAwKTsKKyAgcSA9IHA7CisgIHEuUGFyc2VQYXJ0aWFsRnJvbVN0cmluZyhxLlNlcmlhbGl6ZVBhcnRpYWxBc1N0cmluZygpKTsKKyAgRVhQRUNUX1RSVUUoVGVzdFV0aWw6OkVxdWFsc1RvU2VyaWFsaXplZChxLCBvLlNlcmlhbGl6ZVBhcnRpYWxBc1N0cmluZygpKSk7CisgIEVYUEVDVF9UUlVFKFRlc3RVdGlsOjpFcXVhbHNUb1NlcmlhbGl6ZWQocSwgcC5TZXJpYWxpemVQYXJ0aWFsQXNTdHJpbmcoKSkpOworfQorCitURVNUKE1FU1NBR0VfVEVTVF9OQU1FLCBFeHBsaWNpdExhenlFeGNlZWRSZWN1cnNpb25MaW1pdCkgeworICBVTklUVEVTVDo6TmVzdGVkVGVzdEFsbFR5cGVzIG9yaWdpbmFsLCBwYXJzZWQ7CisgIC8vIEJ1aWxkIHByb3RvIHdpdGggcmVjdXJzaW9uIGRlcHRoIG9mIDMuCisgIG9yaWdpbmFsLm11dGFibGVfbGF6eV9jaGlsZCgpCisgICAgICAtPm11dGFibGVfY2hpbGQoKQorICAgICAgLT5tdXRhYmxlX3BheWxvYWQoKQorICAgICAgLT5zZXRfb3B0aW9uYWxfaW50MzIoLTEpOworICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkOworICBFWFBFQ1RfVFJVRShvcmlnaW5hbC5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCkpOworCisgIC8vIFVzZXIgYW5ub3RhdGVkIExhenlGaWVsZCAoW2xhenkgPSB0cnVlXSkgaXMgZWFnZXJseSB2ZXJpZmllZCBhbmQgc2hvdWxkCisgIC8vIGNhdGNoIHRoZSByZWN1cnNpb24gbGltaXQgdmlvbGF0aW9uLgorICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBhcnJheV9zdHJlYW0oc2VyaWFsaXplZC5kYXRhKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXRfc3RyZWFtKCZhcnJheV9zdHJlYW0pOworICBpbnB1dF9zdHJlYW0uU2V0UmVjdXJzaW9uTGltaXQoMik7CisgIEVYUEVDVF9GQUxTRShwYXJzZWQuUGFyc2VGcm9tQ29kZWRTdHJlYW0oJmlucHV0X3N0cmVhbSkpOworCisgIC8vIExhenkgcmVhZCByZXN1bHRzIGluIHBhcnNpbmcgZXJyb3Igd2hpY2ggY2FuIGJlIHZlcmlmaWVkIGJ5IG5vdCBoYXZpbmcKKyAgLy8gZXhwZWN0ZWQgdmFsdWUuCisgIEVYUEVDVF9ORShwYXJzZWQubGF6eV9jaGlsZCgpLmNoaWxkKCkucGF5bG9hZCgpLm9wdGlvbmFsX2ludDMyKCksIC0xKTsKK30KKworVEVTVChNRVNTQUdFX1RFU1RfTkFNRSwgTmVzdGVkRXhwbGljaXRMYXp5RXhjZWVkUmVjdXJzaW9uTGltaXQpIHsKKyAgVU5JVFRFU1Q6Ok5lc3RlZFRlc3RBbGxUeXBlcyBvcmlnaW5hbCwgcGFyc2VkOworICAvLyBCdWlsZCBwcm90byB3aXRoIHJlY3Vyc2lvbiBkZXB0aCBvZiA1LCB3aXRoIG5lc3RlZCBhbm5vdGF0ZWQgTGF6eUZpZWxkLgorICBvcmlnaW5hbC5tdXRhYmxlX2xhenlfY2hpbGQoKQorICAgICAgLT5tdXRhYmxlX2NoaWxkKCkKKyAgICAgIC0+bXV0YWJsZV9sYXp5X2NoaWxkKCkKKyAgICAgIC0+bXV0YWJsZV9jaGlsZCgpCisgICAgICAtPm11dGFibGVfcGF5bG9hZCgpCisgICAgICAtPnNldF9vcHRpb25hbF9pbnQzMigtMSk7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIEVYUEVDVF9UUlVFKG9yaWdpbmFsLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSk7CisKKyAgLy8gVXNlciBhbm5vdGF0ZWQgTGF6eUZpZWxkIChbbGF6eSA9IHRydWVdKSBpcyBlYWdlcmx5IHZlcmlmaWVkIGFuZCBzaG91bGQKKyAgLy8gY2F0Y2ggdGhlIHJlY3Vyc2lvbiBsaW1pdCB2aW9sYXRpb24uCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGFycmF5X3N0cmVhbShzZXJpYWxpemVkLmRhdGEoKSwgc2VyaWFsaXplZC5zaXplKCkpOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7CisgIGlucHV0X3N0cmVhbS5TZXRSZWN1cnNpb25MaW1pdCg0KTsKKyAgRVhQRUNUX0ZBTFNFKHBhcnNlZC5QYXJzZUZyb21Db2RlZFN0cmVhbSgmaW5wdXRfc3RyZWFtKSk7CisKKyAgLy8gTGF6eSByZWFkIHJlc3VsdHMgaW4gcGFyc2luZyBlcnJvciB3aGljaCBjYW4gYmUgdmVyaWZpZWQgYnkgbm90IGhhdmluZworICAvLyBleHBlY3RlZCB2YWx1ZS4KKyAgRVhQRUNUX05FKHBhcnNlZC5sYXp5X2NoaWxkKCkKKyAgICAgICAgICAgICAgICAuY2hpbGQoKQorICAgICAgICAgICAgICAgIC5sYXp5X2NoaWxkKCkKKyAgICAgICAgICAgICAgICAuY2hpbGQoKQorICAgICAgICAgICAgICAgIC5wYXlsb2FkKCkKKyAgICAgICAgICAgICAgICAub3B0aW9uYWxfaW50MzIoKSwKKyAgICAgICAgICAgIC0xKTsKK30KKworVEVTVChNRVNTQUdFX1RFU1RfTkFNRSwgUGFyc2VGYWlsc0lmU3VibWVzc2FnZVRydW5jYXRlZCkgeworICBVTklUVEVTVDo6TmVzdGVkVGVzdEFsbFR5cGVzIG8sIHA7CisgIGNvbnN0ZXhwciBpbnQga0RlcHRoID0gNTsKKyAgYXV0byogY2hpbGQgPSBvLm11dGFibGVfY2hpbGQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRGVwdGg7IGkrKykgeworICAgIGNoaWxkID0gY2hpbGQtPm11dGFibGVfY2hpbGQoKTsKKyAgfQorICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKGNoaWxkLT5tdXRhYmxlX3BheWxvYWQoKSk7CisKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgRVhQRUNUX1RSVUUoby5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCkpOworCisgIC8vIFNob3VsZCBwYXJzZSBjb3JyZWN0bHkuCisgIEVYUEVDVF9UUlVFKHAuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKKworICBjb25zdGV4cHIgaW50IGtNYXhUcnVuY2F0ZSA9IDUwOworICBBU1NFUlRfR1Qoc2VyaWFsaXplZC5zaXplKCksIGtNYXhUcnVuY2F0ZSk7CisKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBrTWF4VHJ1bmNhdGU7IGkgKz0gMykgeworICAgIEVYUEVDVF9GQUxTRSgKKyAgICAgICAgcC5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZC5zdWJzdHIoMCwgc2VyaWFsaXplZC5zaXplKCkgLSBpKSkpOworICB9Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIFBhcnNlRmFpbHNJZldpcmVNYWxmb3JtZWQpIHsKKyAgVU5JVFRFU1Q6Ok5lc3RlZFRlc3RBbGxUeXBlcyBvLCBwOworICBjb25zdGV4cHIgaW50IGtEZXB0aCA9IDU7CisgIGF1dG8qIGNoaWxkID0gby5tdXRhYmxlX2NoaWxkKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga0RlcHRoOyBpKyspIHsKKyAgICBjaGlsZCA9IGNoaWxkLT5tdXRhYmxlX2NoaWxkKCk7CisgIH0KKyAgLy8gLTEgYmVjb21lcyBceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceDEKKyAgY2hpbGQtPm11dGFibGVfcGF5bG9hZCgpLT5zZXRfb3B0aW9uYWxfaW50MzIoLTEpOworCisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIEVYUEVDVF9UUlVFKG8uU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKTsKKworICAvLyBTaG91bGQgcGFyc2UgY29ycmVjdGx5LgorICBFWFBFQ1RfVFJVRShwLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7CisKKyAgLy8gT3ZlcndyaXRpbmcgdGhlIGxhc3QgYnl0ZSB0byAweEZGIHJlc3VsdHMgaW4gbWFsZm9ybWVkIHdpcmUuCisgIHNlcmlhbGl6ZWRbc2VyaWFsaXplZC5zaXplKCkgLSAxXSA9IDB4RkY7CisgIEVYUEVDVF9GQUxTRShwLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIFBhcnNlRmFpbHNJZk9uZW9mV2lyZU1hbGZvcm1lZCkgeworICBVTklUVEVTVDo6TmVzdGVkVGVzdEFsbFR5cGVzIG8sIHA7CisgIGNvbnN0ZXhwciBpbnQga0RlcHRoID0gNTsKKyAgYXV0byogY2hpbGQgPSBvLm11dGFibGVfY2hpbGQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRGVwdGg7IGkrKykgeworICAgIGNoaWxkID0gY2hpbGQtPm11dGFibGVfY2hpbGQoKTsKKyAgfQorICAvLyAtMSBiZWNvbWVzIFx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4MQorICBjaGlsZC0+bXV0YWJsZV9wYXlsb2FkKCktPm11dGFibGVfb25lb2ZfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKC0xKTsKKworICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkOworICBFWFBFQ1RfVFJVRShvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSk7CisKKyAgLy8gU2hvdWxkIHBhcnNlIGNvcnJlY3RseS4KKyAgRVhQRUNUX1RSVUUocC5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpOworCisgIC8vIE92ZXJ3cml0aW5nIHRoZSBsYXN0IGJ5dGUgdG8gMHhGRiByZXN1bHRzIGluIG1hbGZvcm1lZCB3aXJlLgorICBzZXJpYWxpemVkW3NlcmlhbGl6ZWQuc2l6ZSgpIC0gMV0gPSAweEZGOworICBFWFBFQ1RfRkFMU0UocC5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpOworfQorCitURVNUKE1FU1NBR0VfVEVTVF9OQU1FLCBQYXJzZUZhaWxzSWZFeHRlbnNpb25XaXJlTWFsZm9ybWVkKSB7CisgIFVOSVRURVNUOjpUZXN0Q2hpbGRFeHRlbnNpb24gbywgcDsKKyAgYXV0byogbSA9IG8ubXV0YWJsZV9vcHRpb25hbF9leHRlbnNpb24oKS0+TXV0YWJsZUV4dGVuc2lvbigKKyAgICAgIFVOSVRURVNUOjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pOworCisgIC8vIC0xIGJlY29tZXMgXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHgxCisgIG0tPnNldF9iYigtMSk7CisKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgRVhQRUNUX1RSVUUoby5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCkpOworCisgIC8vIFNob3VsZCBwYXJzZSBjb3JyZWN0bHkuCisgIEVYUEVDVF9UUlVFKHAuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKKworICAvLyBPdmVyd3JpdGluZyB0aGUgbGFzdCBieXRlIHRvIDB4RkYgcmVzdWx0cyBpbiBtYWxmb3JtZWQgd2lyZS4KKyAgc2VyaWFsaXplZFtzZXJpYWxpemVkLnNpemUoKSAtIDFdID0gMHhGRjsKKyAgRVhQRUNUX0ZBTFNFKHAuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKK30KKworVEVTVChNRVNTQUdFX1RFU1RfTkFNRSwgVW5pbml0aWFsaXplZEFuZE1hbGZvcm1lZCkgeworICBVTklUVEVTVDo6VGVzdFJlcXVpcmVkRm9yZWlnbiBvLCBwMSwgcDI7CisgIG8ubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCktPnNldF9hKC0xKTsKKworICAvLyAtMSBiZWNvbWVzIFx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4MQorICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkOworICBFWFBFQ1RfVFJVRShvLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygmc2VyaWFsaXplZCkpOworCisgIC8vIFNob3VsZCBwYXJzZSBjb3JyZWN0bHkuCisgIEVYUEVDVF9UUlVFKHAxLlBhcnNlUGFydGlhbEZyb21TdHJpbmcoc2VyaWFsaXplZCkpOworICBFWFBFQ1RfRkFMU0UocDEuSXNJbml0aWFsaXplZCgpKTsKKworICAvLyBPdmVyd3JpdGluZyB0aGUgbGFzdCBieXRlIHRvIDB4RkYgcmVzdWx0cyBpbiBtYWxmb3JtZWQgd2lyZS4KKyAgc2VyaWFsaXplZFtzZXJpYWxpemVkLnNpemUoKSAtIDFdID0gMHhGRjsKKyAgRVhQRUNUX0ZBTFNFKHAyLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7CisgIEVYUEVDVF9GQUxTRShwMi5Jc0luaXRpYWxpemVkKCkpOworfQorCitpbmxpbmUgVU5JVFRFU1Q6Ok5lc3RlZFRlc3RBbGxUeXBlcyBJbml0TmVzdGVkUHJvdG8oaW50IGRlcHRoKSB7CisgIFVOSVRURVNUOjpOZXN0ZWRUZXN0QWxsVHlwZXMgcDsKKyAgYXV0byogY2hpbGQgPSBwLm11dGFibGVfY2hpbGQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7CisgICAgY2hpbGQtPm11dGFibGVfcGF5bG9hZCgpLT5zZXRfb3B0aW9uYWxfaW50MzIoaSk7CisgICAgY2hpbGQgPSBjaGlsZC0+bXV0YWJsZV9jaGlsZCgpOworICB9CisgIC8vIC0xIGJlY29tZXMgXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHgxCisgIGNoaWxkLT5tdXRhYmxlX3BheWxvYWQoKS0+c2V0X29wdGlvbmFsX2ludDMyKC0xKTsKKyAgcmV0dXJuIHA7Cit9CisKKy8vIFBhcnNpbmcgcHJvdG8gbXVzdCBub3QgYWNjZXNzIGJleW9uZCB0aGUgYm91bmQuCitURVNUKE1FU1NBR0VfVEVTVF9OQU1FLCBQYXJzZVN0cmljdGx5Qm91bmRlZFN0cmVhbSkgeworICBVTklUVEVTVDo6TmVzdGVkVGVzdEFsbFR5cGVzIG8sIHA7CisgIGNvbnN0ZXhwciBpbnQga0RlcHRoID0gMjsKKyAgbyA9IEluaXROZXN0ZWRQcm90byhrRGVwdGgpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKG8ubXV0YWJsZV9jaGlsZCgpLT5tdXRhYmxlX3BheWxvYWQoKSk7CisgIG8ubXV0YWJsZV9jaGlsZCgpLT5tdXRhYmxlX2NoaWxkKCktPm11dGFibGVfcGF5bG9hZCgpLT5zZXRfb3B0aW9uYWxfc3RyaW5nKAorICAgICAgc3RkOjpzdHJpbmcoMTAyNCwgJ2EnKSk7CisKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgRVhQRUNUX1RSVUUoby5TZXJpYWxpemVUb1N0cmluZygmZGF0YSkpOworCisgIFRlc3RVdGlsOjpCb3VuZGVkQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0oZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUocC5QYXJzZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oJnN0cmVhbSwgZGF0YS5zaXplKCkpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChwLmNoaWxkKCkucGF5bG9hZCgpKTsKK30KKworVEVTVChNRVNTQUdFX1RFU1RfTkFNRSwgQWxsU2V0TWV0aG9kc09uU3RyaW5nRmllbGQpIHsKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtc2c7CisKKworICBtc2cuc2V0X29wdGlvbmFsX3N0cmluZygiQXNjaWl6Iik7CisgIEVYUEVDVF9FUShtc2cub3B0aW9uYWxfc3RyaW5nKCksICJBc2NpaXoiKTsKKworICBtc2cuc2V0X29wdGlvbmFsX3N0cmluZygiTGVuZ3RoIGRlbGltaXRlZCIsIDYpOworICBFWFBFQ1RfRVEobXNnLm9wdGlvbmFsX3N0cmluZygpLCAiTGVuZ3RoIik7CisKKyAgc3RkOjpzdHJpbmcgdmFsdWUgPSAic3RkOjpzdHJpbmcgdmFsdWUgMSI7CisgIG1zZy5zZXRfb3B0aW9uYWxfc3RyaW5nKHZhbHVlKTsKKyAgRVhQRUNUX0VRKG1zZy5vcHRpb25hbF9zdHJpbmcoKSwgInN0ZDo6c3RyaW5nIHZhbHVlIDEiKTsKKworICB2YWx1ZSA9ICJzdGQ6OnN0cmluZyB2YWx1ZSAyIjsKKyAgbXNnLnNldF9vcHRpb25hbF9zdHJpbmcoc3RkOjpjcmVmKHZhbHVlKSk7CisgIEVYUEVDVF9FUShtc2cub3B0aW9uYWxfc3RyaW5nKCksICJzdGQ6OnN0cmluZyB2YWx1ZSAyIik7CisKKyAgdmFsdWUgPSAic3RkOjpzdHJpbmcgdmFsdWUgMyI7CisgIG1zZy5zZXRfb3B0aW9uYWxfc3RyaW5nKHN0ZDo6bW92ZSh2YWx1ZSkpOworICBFWFBFQ1RfRVEobXNnLm9wdGlvbmFsX3N0cmluZygpLCAic3RkOjpzdHJpbmcgdmFsdWUgMyIpOworfQorCitURVNUKE1FU1NBR0VfVEVTVF9OQU1FLCBTdWNjZXNzQWZ0ZXJQYXJzaW5nRmFpbHVyZSkgeworICBVTklUVEVTVDo6TmVzdGVkVGVzdEFsbFR5cGVzIG8sIHAsIHE7CisgIGNvbnN0ZXhwciBpbnQga0RlcHRoID0gNTsKKyAgbyA9IEluaXROZXN0ZWRQcm90byhrRGVwdGgpOworICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkOworICBFWFBFQ1RfVFJVRShvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSk7CisKKyAgLy8gU2hvdWxkIHBhcnNlIGNvcnJlY3RseS4KKyAgRVhQRUNUX1RSVUUocC5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpOworCisgIC8vIE92ZXJ3cml0aW5nIHRoZSBsYXN0IGJ5dGUgdG8gMHhGRiByZXN1bHRzIGluIG1hbGZvcm1lZCB3aXJlLgorICBzZXJpYWxpemVkW3NlcmlhbGl6ZWQuc2l6ZSgpIC0gMV0gPSAweEZGOworICBFWFBFQ1RfRkFMU0UocC5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpOworCisgIC8vIFN1YnNlcXVlbnQgc2VyaWFsaXphdGlvbiBzaG91bGQgYmUgcGFyc2VkIGNvcnJlY3RseS4KKyAgRVhQRUNUX1RSVUUocS5QYXJzZUZyb21TdHJpbmcocC5TZXJpYWxpemVBc1N0cmluZygpKSk7Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIEV4Y2VlZFJlY3Vyc2lvbkxpbWl0KSB7CisgIFVOSVRURVNUOjpOZXN0ZWRUZXN0QWxsVHlwZXMgbywgcDsKKyAgY29uc3QgaW50IGtEZXB0aCA9IGlvOjpDb2RlZElucHV0U3RyZWFtOjpHZXREZWZhdWx0UmVjdXJzaW9uTGltaXQoKSArIDEwOworICBvID0gSW5pdE5lc3RlZFByb3RvKGtEZXB0aCk7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIEVYUEVDVF9UUlVFKG8uU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKTsKKworICAvLyBSZWN1cnNpb24gbGV2ZWwgZGVlcGVyIHRoYW4gdGhlIGRlZmF1bHQuCisgIEVYUEVDVF9GQUxTRShwLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIFN1cHBvcnRDdXN0b21SZWN1cnNpb25MaW1pdFJlYWQpIHsKKyAgVU5JVFRFU1Q6Ok5lc3RlZFRlc3RBbGxUeXBlcyBvLCBwOworICBjb25zdCBpbnQga0RlcHRoID0gaW86OkNvZGVkSW5wdXRTdHJlYW06OkdldERlZmF1bHRSZWN1cnNpb25MaW1pdCgpICsgMTA7CisgIG8gPSBJbml0TmVzdGVkUHJvdG8oa0RlcHRoKTsKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgRVhQRUNUX1RSVUUoby5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCkpOworCisgIC8vIFNob3VsZCBwYXNzIHdpdGggY3VzdG9tIGxpbWl0ICsgcmVhZHMuCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChzZXJpYWxpemVkLmRhdGEoKSwgc2VyaWFsaXplZC5zaXplKCkpOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgaW5wdXQuU2V0UmVjdXJzaW9uTGltaXQoa0RlcHRoICsgMTApOworICBFWFBFQ1RfVFJVRShwLlBhcnNlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCkpOworCisgIEVYUEVDVF9FUShwLmNoaWxkKCkucGF5bG9hZCgpLm9wdGlvbmFsX2ludDMyKCksIDApOworICBFWFBFQ1RfRVEocC5jaGlsZCgpLmNoaWxkKCkucGF5bG9hZCgpLm9wdGlvbmFsX2ludDMyKCksIDEpOworCisgIC8vIFZlcmlmeSBwIHNlcmlhbGl6ZXMgc3VjY2Vzc2Z1bGx5IChzdXJ2aXZlcyBWZXJpZnlDb25zaXN0ZW5jeSkuCisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgRVhQRUNUX1RSVUUocC5TZXJpYWxpemVUb1N0cmluZygmcmVzdWx0KSk7Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIFN1cHBvcnRDdXN0b21SZWN1cnNpb25MaW1pdFdyaXRlKSB7CisgIFVOSVRURVNUOjpOZXN0ZWRUZXN0QWxsVHlwZXMgbywgcDsKKyAgY29uc3QgaW50IGtEZXB0aCA9IGlvOjpDb2RlZElucHV0U3RyZWFtOjpHZXREZWZhdWx0UmVjdXJzaW9uTGltaXQoKSArIDEwOworICBvID0gSW5pdE5lc3RlZFByb3RvKGtEZXB0aCk7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIEVYUEVDVF9UUlVFKG8uU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKTsKKworICAvLyBTaG91bGQgcGFzcyB3aXRoIGN1c3RvbSBsaW1pdCArIHdyaXRlcy4KKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KHNlcmlhbGl6ZWQuZGF0YSgpLCBzZXJpYWxpemVkLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICBpbnB1dC5TZXRSZWN1cnNpb25MaW1pdChrRGVwdGggKyAxMCk7CisgIEVYUEVDVF9UUlVFKHAuUGFyc2VGcm9tQ29kZWRTdHJlYW0oJmlucHV0KSk7CisKKyAgRVhQRUNUX0VRKHAubXV0YWJsZV9jaGlsZCgpLT5tdXRhYmxlX3BheWxvYWQoKS0+b3B0aW9uYWxfaW50MzIoKSwgMCk7CisgIEVYUEVDVF9FUSgKKyAgICAgIHAubXV0YWJsZV9jaGlsZCgpLT5tdXRhYmxlX2NoaWxkKCktPm11dGFibGVfcGF5bG9hZCgpLT5vcHRpb25hbF9pbnQzMigpLAorICAgICAgMSk7Cit9CisKKy8vIFdoaWxlIGRlZXAgcmVjdXJzaW9uIGlzIG5ldmVyIGd1YXJhbnRlZWQsIHRoaXMgdGVzdCBhaW1zIHRvIGNhdGNoIHBvdGVudGlhbAorLy8gaXNzdWVzIHdpdGggdmVyeSBkZWVwIHJlY3Vyc2lvbi4KK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIFN1cHBvcnREZWVwUmVjdXJzaW9uTGltaXQpIHsKKyAgVU5JVFRFU1Q6Ok5lc3RlZFRlc3RBbGxUeXBlcyBvLCBwOworICBjb25zdGV4cHIgaW50IGtEZXB0aCA9IDEwMDA7CisgIGF1dG8qIGNoaWxkID0gby5tdXRhYmxlX2NoaWxkKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga0RlcHRoOyBpKyspIHsKKyAgICBjaGlsZCA9IGNoaWxkLT5tdXRhYmxlX2NoaWxkKCk7CisgIH0KKyAgY2hpbGQtPm11dGFibGVfcGF5bG9hZCgpLT5zZXRfb3B0aW9uYWxfaW50MzIoMTAwKTsKKworICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkOworICBFWFBFQ1RfVFJVRShvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSk7CisKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KHNlcmlhbGl6ZWQuZGF0YSgpLCBzZXJpYWxpemVkLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICBpbnB1dC5TZXRSZWN1cnNpb25MaW1pdCgxMTAwKTsKKyAgRVhQRUNUX1RSVUUocC5QYXJzZUZyb21Db2RlZFN0cmVhbSgmaW5wdXQpKTsKK30KKworVEVTVChNRVNTQUdFX1RFU1RfTkFNRSwgU3dhcCkgeworICBVTklUVEVTVDo6TmVzdGVkVGVzdEFsbFR5cGVzIG87CisgIGNvbnN0ZXhwciBpbnQga0RlcHRoID0gNTsKKyAgYXV0byogY2hpbGQgPSBvLm11dGFibGVfY2hpbGQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRGVwdGg7IGkrKykgeworICAgIGNoaWxkID0gY2hpbGQtPm11dGFibGVfY2hpbGQoKTsKKyAgfQorICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKGNoaWxkLT5tdXRhYmxlX3BheWxvYWQoKSk7CisKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgRVhQRUNUX1RSVUUoby5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCkpOworCisgIHsKKyAgICBBcmVuYSBhcmVuYTsKKyAgICBVTklUVEVTVDo6TmVzdGVkVGVzdEFsbFR5cGVzKiBwMSA9CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFVOSVRURVNUOjpOZXN0ZWRUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisKKyAgICAvLyBTaG91bGQgcGFyc2UgY29ycmVjdGx5LgorICAgIEVYUEVDVF9UUlVFKHAxLT5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpOworCisgICAgVU5JVFRFU1Q6Ok5lc3RlZFRlc3RBbGxUeXBlcyogcDIgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxVTklUVEVTVDo6TmVzdGVkVGVzdEFsbFR5cGVzPigmYXJlbmEpOworCisgICAgcDEtPlN3YXAocDIpOworCisgICAgRVhQRUNUX0VRKG8uU2VyaWFsaXplQXNTdHJpbmcoKSwgcDItPlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICB9Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIEJ5cGFzc0luaXRpYWxpemF0aW9uQ2hlY2tPblBhcnNlKSB7CisgIFVOSVRURVNUOjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KG51bGxwdHIsIDApOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmlucHV0KSk7Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcpIHsKKyAgVU5JVFRFU1Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOworICBFWFBFQ1RfRVEoImEsIGIsIGMiLCBtZXNzYWdlLkluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSk7Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIER5bmFtaWNDYXN0VG9HZW5lcmF0ZWQpIHsKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyB0ZXN0X2FsbF90eXBlczsKKworICBNZXNzYWdlKiB0ZXN0X2FsbF90eXBlc19wb2ludGVyID0gJnRlc3RfYWxsX3R5cGVzOworICBFWFBFQ1RfRVEoJnRlc3RfYWxsX3R5cGVzLCBEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPFVOSVRURVNUOjpUZXN0QWxsVHlwZXM+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9hbGxfdHlwZXNfcG9pbnRlcikpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgRHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxVTklUVEVTVDo6VGVzdFJlcXVpcmVkPigKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2FsbF90eXBlc19wb2ludGVyKSk7CisKKyAgY29uc3QgTWVzc2FnZSogdGVzdF9hbGxfdHlwZXNfcG9pbnRlcl9jb25zdCA9ICZ0ZXN0X2FsbF90eXBlczsKKyAgRVhQRUNUX0VRKCZ0ZXN0X2FsbF90eXBlcywKKyAgICAgICAgICAgIER5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcz4oCisgICAgICAgICAgICAgICAgdGVzdF9hbGxfdHlwZXNfcG9pbnRlcl9jb25zdCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgRHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBVTklUVEVTVDo6VGVzdFJlcXVpcmVkPigKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2FsbF90eXBlc19wb2ludGVyX2NvbnN0KSk7CisKKyAgTWVzc2FnZSogdGVzdF9hbGxfdHlwZXNfcG9pbnRlcl9udWxscHRyID0gbnVsbHB0cjsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIER5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8VU5JVFRFU1Q6OlRlc3RBbGxUeXBlcz4oCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9hbGxfdHlwZXNfcG9pbnRlcl9udWxscHRyKSk7Cit9CisKKyNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVCAgLy8gZGVhdGggdGVzdHMgZG8gbm90IHdvcmsgb24gV2luZG93cyB5ZXQuCisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIFNlcmlhbGl6ZUZhaWxzSWZOb3RJbml0aWFsaXplZCkgeworICBVTklUVEVTVDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIEVYUEVDVF9ERUJVR19ERUFUSChFWFBFQ1RfVFJVRShtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKSksCisgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2VyaWFsaXplIG1lc3NhZ2Ugb2YgdHlwZSBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFVOSVRURVNUX1BBQ0tBR0VfTkFNRSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICIuVGVzdFJlcXVpcmVkXCIgYmVjYXVzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIml0IGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiBhLCBiLCBjIik7Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIENoZWNrSW5pdGlhbGl6ZWQpIHsKKyAgVU5JVFRFU1Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOworICBFWFBFQ1RfREVBVEgobWVzc2FnZS5DaGVja0luaXRpYWxpemVkKCksCisgICAgICAgICAgICAgICAiTWVzc2FnZSBvZiB0eXBlIFwiIiArIHN0ZDo6c3RyaW5nKFVOSVRURVNUX1BBQ0tBR0VfTkFNRSkgKworICAgICAgICAgICAgICAgICAgICIuVGVzdFJlcXVpcmVkXCIgaXMgbWlzc2luZyByZXF1aXJlZCAiCisgICAgICAgICAgICAgICAgICAgImZpZWxkczogYSwgYiwgYyIpOworfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCisKK25hbWVzcGFjZSB7CisvLyBBbiBpbnB1dCBzdHJlYW0gdGhhdCByZXBlYXRzIGEgc3RkOjpzdHJpbmcncyBjb250ZW50IGZvciBhIG51bWJlciBvZiB0aW1lcy4KKy8vIEl0IGhlbHBzIHVzIGNyZWF0ZSBhIHJlYWxseSBsYXJnZSBpbnB1dCB3aXRob3V0IGNvbnN1bWluZyB0b28gbXVjaCBtZW1vcnkuCisvLyBVc2VkIHRvIHRlc3QgdGhlIHBhcnNpbmcgYmVoYXZpb3Igd2hlbiB0aGUgaW5wdXQgc2l6ZSBleGNlZWRzIDJHIG9yIGNsb3NlIHRvCisvLyBpdC4KK2NsYXNzIFJlcGVhdGVkSW5wdXRTdHJlYW0gOiBwdWJsaWMgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0geworIHB1YmxpYzoKKyAgUmVwZWF0ZWRJbnB1dFN0cmVhbShjb25zdCBzdGQ6OnN0cmluZyYgZGF0YSwgc2l6ZV90IGNvdW50KQorICAgICAgOiBkYXRhXyhkYXRhKSwgY291bnRfKGNvdW50KSwgcG9zaXRpb25fKDApLCB0b3RhbF9ieXRlX2NvdW50XygwKSB7fQorCisgIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSBvdmVycmlkZSB7CisgICAgaWYgKHBvc2l0aW9uXyA9PSBkYXRhXy5zaXplKCkpIHsKKyAgICAgIGlmICgtLWNvdW50XyA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHBvc2l0aW9uXyA9IDA7CisgICAgfQorICAgICpkYXRhID0gJmRhdGFfW3Bvc2l0aW9uX107CisgICAgKnNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KGRhdGFfLnNpemUoKSAtIHBvc2l0aW9uXyk7CisgICAgcG9zaXRpb25fID0gZGF0YV8uc2l6ZSgpOworICAgIHRvdGFsX2J5dGVfY291bnRfICs9ICpzaXplOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KSBvdmVycmlkZSB7CisgICAgcG9zaXRpb25fIC09IHN0YXRpY19jYXN0PHNpemVfdD4oY291bnQpOworICAgIHRvdGFsX2J5dGVfY291bnRfIC09IGNvdW50OworICB9CisKKyAgYm9vbCBTa2lwKGludCBjb3VudCkgb3ZlcnJpZGUgeworICAgIHdoaWxlIChjb3VudCA+IDApIHsKKyAgICAgIGNvbnN0IHZvaWQqIGRhdGE7CisgICAgICBpbnQgc2l6ZTsKKyAgICAgIGlmICghTmV4dCgmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHNpemUgPj0gY291bnQpIHsKKyAgICAgICAgQmFja1VwKHNpemUgLSBjb3VudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY291bnQgLT0gc2l6ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW50NjRfdCBCeXRlQ291bnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0b3RhbF9ieXRlX2NvdW50XzsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgZGF0YV87CisgIHNpemVfdCBjb3VudF87ICAgICAvLyBUaGUgbnVtYmVyIG9mIHN0cmluZ3MgdGhhdCBoYXZlbid0IGJlZW4gY29uc3VtZWQuCisgIHNpemVfdCBwb3NpdGlvbl87ICAvLyBQb3NpdGlvbiBpbiB0aGUgc3RkOjpzdHJpbmcgZm9yIHRoZSBuZXh0IHJlYWQuCisgIGludDY0X3QgdG90YWxfYnl0ZV9jb3VudF87Cit9OworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIFRlc3RQYXJzZU1lc3NhZ2VzQ2xvc2VUbzJHKSB7CisgIGNvbnN0ZXhwciBpbnQzMl90IGtpbnQzMm1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpOworCisgIC8vIENyZWF0ZSBhIG1lc3NhZ2Ugd2l0aCBhIGxhcmdlIHN0ZDo6c3RyaW5nIGZpZWxkLgorICBzdGQ6OnN0cmluZyB2YWx1ZSA9IHN0ZDo6c3RyaW5nKDY0ICogMTAyNCAqIDEwMjQsICd4Jyk7CisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfc3RyaW5nKHZhbHVlKTsKKworICAvLyBSZXBlYXQgdGhpcyBtZXNzYWdlIGluIHRoZSBpbnB1dCBzdHJlYW0gdG8gbWFrZSB0aGUgdG90YWwgaW5wdXQgc2l6ZQorICAvLyBjbG9zZSB0byAyRy4KKyAgc3RkOjpzdHJpbmcgZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgc2l6ZV90IGNvdW50ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihraW50MzJtYXgpIC8gZGF0YS5zaXplKCk7CisgIFJlcGVhdGVkSW5wdXRTdHJlYW0gaW5wdXQoZGF0YSwgY291bnQpOworCisgIC8vIFRoZSBwYXJzaW5nIHNob3VsZCBzdWNjZWVkLgorICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIHJlc3VsdDsKKyAgRVhQRUNUX1RSVUUocmVzdWx0LlBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKCZpbnB1dCkpOworCisgIC8vIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIGEgc2luZ3VsYXIgZmllbGQsIHRoZSBsYXN0IG9uZQorICAvLyBzaG91bGQgd2luLgorICBFWFBFQ1RfRVEodmFsdWUsIHJlc3VsdC5vcHRpb25hbF9zdHJpbmcoKSk7Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIFRlc3RQYXJzZU1lc3NhZ2VzT3ZlcjJHKSB7CisgIGNvbnN0ZXhwciBpbnQzMl90IGtpbnQzMm1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpOworCisgIC8vIENyZWF0ZSBhIG1lc3NhZ2Ugd2l0aCBhIGxhcmdlIHN0ZDo6c3RyaW5nIGZpZWxkLgorICBzdGQ6OnN0cmluZyB2YWx1ZSA9IHN0ZDo6c3RyaW5nKDY0ICogMTAyNCAqIDEwMjQsICd4Jyk7CisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfc3RyaW5nKHZhbHVlKTsKKworICAvLyBSZXBlYXQgdGhpcyBtZXNzYWdlIGluIHRoZSBpbnB1dCBzdHJlYW0gdG8gbWFrZSB0aGUgdG90YWwgaW5wdXQgc2l6ZQorICAvLyBsYXJnZXIgdGhhbiAyRy4KKyAgc3RkOjpzdHJpbmcgZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgc2l6ZV90IGNvdW50ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihraW50MzJtYXgpIC8gZGF0YS5zaXplKCkgKyAxOworICBSZXBlYXRlZElucHV0U3RyZWFtIGlucHV0KGRhdGEsIGNvdW50KTsKKworICAvLyBUaGUgcGFyc2luZyBzaG91bGQgZmFpbC4KKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyByZXN1bHQ7CisgIEVYUEVDVF9GQUxTRShyZXN1bHQuUGFyc2VGcm9tWmVyb0NvcHlTdHJlYW0oJmlucHV0KSk7Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIEJ5cGFzc0luaXRpYWxpemF0aW9uQ2hlY2tPblNlcmlhbGl6ZSkgeworICBVTklUVEVTVDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7CisgIGlvOjpBcnJheU91dHB1dFN0cmVhbSByYXdfb3V0cHV0KG51bGxwdHIsIDApOworICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5TZXJpYWxpemVQYXJ0aWFsVG9Db2RlZFN0cmVhbSgmb3V0cHV0KSk7Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycykgeworICBVTklUVEVTVDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlcnJvcnM7CisgIG1lc3NhZ2UuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCZlcnJvcnMpOworICBBU1NFUlRfRVEoMywgZXJyb3JzLnNpemUoKSk7CisgIEVYUEVDVF9FUSgiYSIsIGVycm9yc1swXSk7CisgIEVYUEVDVF9FUSgiYiIsIGVycm9yc1sxXSk7CisgIEVYUEVDVF9FUSgiYyIsIGVycm9yc1syXSk7Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIFJlbGVhc2VNdXN0VXNlUmVzdWx0KSB7CisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgYXV0byogZiA9IG5ldyBVTklUVEVTVDo6Rm9yZWlnbk1lc3NhZ2UoKTsKKyAgZi0+c2V0X2MoMTAwMCk7CisgIG1lc3NhZ2Uuc2V0X2FsbG9jYXRlZF9vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoZik7CisgIGF1dG8qIG1mID0gbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpOworICBFWFBFQ1RfRVEobWYsIGYpOworICBzdGQ6OnVuaXF1ZV9wdHI8VU5JVFRFU1Q6OkZvcmVpZ25NZXNzYWdlPiByZigKKyAgICAgIG1lc3NhZ2UucmVsZWFzZV9vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9ORShyZi5nZXQoKSwgbnVsbHB0cik7Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIFBhcnNlRmFpbHNPbkludmFsaWRNZXNzYWdlRW5kKSB7CisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICAvLyBDb250cm9sIGNhc2UuCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tQXJyYXkoIiIsIDApKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhIHZhbGlkIHZhcmludCwgYnV0IG5vdCBhIHZhbGlkIHRhZyAoemVybykuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbUFycmF5KCJcMCIsIDEpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhIG1hbGZvcm1lZCB2YXJpbnQuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbUFycmF5KCJcMjAwIiwgMSkpOworCisgIC8vIFRoZSBieXRlIGlzIGFuIGVuZGdyb3VwIHRhZywgYnV0IHdlIGFyZW4ndCBwYXJzaW5nIGEgZ3JvdXAuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbUFycmF5KCJcMDE0IiwgMSkpOworfQorCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGIvMjM2MzA4NTgKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIE1lc3NhZ2VJc1N0aWxsVmFsaWRBZnRlclBhcnNlRmFpbHMpIHsKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIC8vIDkgMHhGRnMgZm9yIHRoZSAib3B0aW9uYWxfdWludDY0IiBmaWVsZC4KKyAgc3RkOjpzdHJpbmcgaW52YWxpZF9kYXRhID0gIlx4MjBceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkYiOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhpbnZhbGlkX2RhdGEpKTsKKyAgbWVzc2FnZS5DbGVhcigpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF91aW50NjQoKSk7CisKKyAgLy8gaW52YWxpZCBkYXRhIGZvciBmaWVsZCAib3B0aW9uYWxfc3RyaW5nIi4gTGVuZ3RoIHByZWZpeCBpcyAxIGJ1dCBubworICAvLyBwYXlsb2FkLgorICBzdGQ6OnN0cmluZyBpbnZhbGlkX3N0cmluZ19kYXRhID0gIlx4NzJceDAxIjsKKyAgeworICAgIEFyZW5hIGFyZW5hOworICAgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMqIGFyZW5hX21lc3NhZ2UgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxVTklUVEVTVDo6VGVzdEFsbFR5cGVzPigmYXJlbmEpOworICAgIEVYUEVDVF9GQUxTRShhcmVuYV9tZXNzYWdlLT5QYXJzZUZyb21TdHJpbmcoaW52YWxpZF9zdHJpbmdfZGF0YSkpOworICAgIGFyZW5hX21lc3NhZ2UtPkNsZWFyKCk7CisgICAgRVhQRUNUX0VRKCIiLCBhcmVuYV9tZXNzYWdlLT5vcHRpb25hbF9zdHJpbmcoKSk7CisgIH0KK30KKworCituYW1lc3BhY2UgeworCit2b2lkIEV4cGVjdE1lc3NhZ2VNZXJnZWQoY29uc3QgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSkgeworICBFWFBFQ1RfRVEoMywgbWVzc2FnZS5vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2Uub3B0aW9uYWxfaW50NjQoKSk7CisgIEVYUEVDVF9FUSgiaGVsbG8iLCBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZygpKTsKK30KKwordm9pZCBBc3NpZ25QYXJzaW5nTWVyZ2VNZXNzYWdlcyhVTklUVEVTVDo6VGVzdEFsbFR5cGVzKiBtc2cxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzKiBtc2cyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzKiBtc2czKSB7CisgIG1zZzEtPnNldF9vcHRpb25hbF9pbnQzMigxKTsKKyAgbXNnMi0+c2V0X29wdGlvbmFsX2ludDY0KDIpOworICBtc2czLT5zZXRfb3B0aW9uYWxfaW50MzIoMyk7CisgIG1zZzMtPnNldF9vcHRpb25hbF9zdHJpbmcoImhlbGxvIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBUZXN0IHRoYXQgaWYgYW4gb3B0aW9uYWwgb3IgcmVxdWlyZWQgbWVzc2FnZS9ncm91cCBmaWVsZCBhcHBlYXJzIG11bHRpcGxlCisvLyB0aW1lcyBpbiB0aGUgaW5wdXQsIHRoZXkgbmVlZCB0byBiZSBtZXJnZWQuCitURVNUKE1FU1NBR0VfVEVTVF9OQU1FLCBQYXJzaW5nTWVyZ2UpIHsKKyAgVU5JVFRFU1Q6OlRlc3RQYXJzaW5nTWVyZ2U6OlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yIGdlbmVyYXRvcjsKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyogbXNnMTsKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyogbXNnMjsKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyogbXNnMzsKKworI2RlZmluZSBBU1NJR05fUkVQRUFURURfRklFTEQoRklFTEQpIFwKKyAgbXNnMSA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpOyAgICBcCisgIG1zZzIgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKTsgICAgXAorICBtc2czID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCk7ICAgIFwKKyAgQXNzaWduUGFyc2luZ01lcmdlTWVzc2FnZXMobXNnMSwgbXNnMiwgbXNnMykKKworICBBU1NJR05fUkVQRUFURURfRklFTEQoZmllbGQxKTsKKyAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGZpZWxkMik7CisgIEFTU0lHTl9SRVBFQVRFRF9GSUVMRChmaWVsZDMpOworICBBU1NJR05fUkVQRUFURURfRklFTEQoZXh0MSk7CisgIEFTU0lHTl9SRVBFQVRFRF9GSUVMRChleHQyKTsKKworI3VuZGVmIEFTU0lHTl9SRVBFQVRFRF9GSUVMRAorI2RlZmluZSBBU1NJR05fUkVQRUFURURfR1JPVVAoRklFTEQpICAgICAgICAgICAgICAgIFwKKyAgbXNnMSA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpLT5tdXRhYmxlX2ZpZWxkMSgpOyBcCisgIG1zZzIgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKS0+bXV0YWJsZV9maWVsZDEoKTsgXAorICBtc2czID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCktPm11dGFibGVfZmllbGQxKCk7IFwKKyAgQXNzaWduUGFyc2luZ01lcmdlTWVzc2FnZXMobXNnMSwgbXNnMiwgbXNnMykKKworICBBU1NJR05fUkVQRUFURURfR1JPVVAoZ3JvdXAxKTsKKyAgQVNTSUdOX1JFUEVBVEVEX0dST1VQKGdyb3VwMik7CisKKyN1bmRlZiBBU1NJR05fUkVQRUFURURfR1JPVVAKKworICBzdGQ6OnN0cmluZyBidWZmZXI7CisgIGdlbmVyYXRvci5TZXJpYWxpemVUb1N0cmluZygmYnVmZmVyKTsKKyAgVU5JVFRFU1Q6OlRlc3RQYXJzaW5nTWVyZ2UgcGFyc2luZ19tZXJnZTsKKyAgcGFyc2luZ19tZXJnZS5QYXJzZUZyb21TdHJpbmcoYnVmZmVyKTsKKworICAvLyBSZXF1aXJlZCBhbmQgb3B0aW9uYWwgZmllbGRzIHNob3VsZCBiZSBtZXJnZWQuCisgIEV4cGVjdE1lc3NhZ2VNZXJnZWQocGFyc2luZ19tZXJnZS5yZXF1aXJlZF9hbGxfdHlwZXMoKSk7CisgIEV4cGVjdE1lc3NhZ2VNZXJnZWQocGFyc2luZ19tZXJnZS5vcHRpb25hbF9hbGxfdHlwZXMoKSk7CisgIEV4cGVjdE1lc3NhZ2VNZXJnZWQocGFyc2luZ19tZXJnZS5vcHRpb25hbGdyb3VwKCkub3B0aW9uYWxfZ3JvdXBfYWxsX3R5cGVzKCkpOworICBFeHBlY3RNZXNzYWdlTWVyZ2VkKAorICAgICAgcGFyc2luZ19tZXJnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OlRlc3RQYXJzaW5nTWVyZ2U6Om9wdGlvbmFsX2V4dCkpOworCisgIC8vIFJlcGVhdGVkIGZpZWxkcyBzaG91bGQgbm90IGJlIG1lcmdlZC4KKyAgRVhQRUNUX0VRKDMsIHBhcnNpbmdfbWVyZ2UucmVwZWF0ZWRfYWxsX3R5cGVzX3NpemUoKSk7CisgIEVYUEVDVF9FUSgzLCBwYXJzaW5nX21lcmdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMywgcGFyc2luZ19tZXJnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpUZXN0UGFyc2luZ01lcmdlOjpyZXBlYXRlZF9leHQpKTsKK30KKworVEVTVChNRVNTQUdFX1RFU1RfTkFNRSwgTWVyZ2VGcm9tKSB7CisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgc291cmNlLCBkZXN0OworCisgIC8vIE9wdGlvbmFsIGZpZWxkcworICBzb3VyY2Uuc2V0X29wdGlvbmFsX2ludDMyKDEpOyAgLy8gb25seSBzb3VyY2UKKyAgc291cmNlLnNldF9vcHRpb25hbF9pbnQ2NCgyKTsgIC8vIGJvdGggc291cmNlIGFuZCBkZXN0CisgIGRlc3Quc2V0X29wdGlvbmFsX2ludDY0KDMpOworICBkZXN0LnNldF9vcHRpb25hbF91aW50MzIoNCk7ICAvLyBvbmx5IGRlc3QKKworICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aCBkZWZhdWx0cworICBzb3VyY2Uuc2V0X2RlZmF1bHRfaW50MzIoMTMpOyAgLy8gb25seSBzb3VyY2UKKyAgc291cmNlLnNldF9kZWZhdWx0X2ludDY0KDE0KTsgIC8vIGJvdGggc291cmNlIGFuZCBkZXN0CisgIGRlc3Quc2V0X2RlZmF1bHRfaW50NjQoMTUpOworICBkZXN0LnNldF9kZWZhdWx0X3VpbnQzMigxNik7ICAvLyBvbmx5IGRlc3QKKworICAvLyBSZXBlYXRlZCBmaWVsZHMKKyAgc291cmNlLmFkZF9yZXBlYXRlZF9pbnQzMig1KTsgIC8vIG9ubHkgc291cmNlCisgIHNvdXJjZS5hZGRfcmVwZWF0ZWRfaW50MzIoNik7CisgIHNvdXJjZS5hZGRfcmVwZWF0ZWRfaW50NjQoNyk7ICAvLyBib3RoIHNvdXJjZSBhbmQgZGVzdAorICBzb3VyY2UuYWRkX3JlcGVhdGVkX2ludDY0KDgpOworICBkZXN0LmFkZF9yZXBlYXRlZF9pbnQ2NCg5KTsKKyAgZGVzdC5hZGRfcmVwZWF0ZWRfaW50NjQoMTApOworICBkZXN0LmFkZF9yZXBlYXRlZF91aW50MzIoMTEpOyAgLy8gb25seSBkZXN0CisgIGRlc3QuYWRkX3JlcGVhdGVkX3VpbnQzMigxMik7CisKKyAgZGVzdC5NZXJnZUZyb20oc291cmNlKTsKKworICAvLyBPcHRpb25hbCBmaWVsZHM6IHNvdXJjZSBvdmVyd3JpdGVzIGRlc3QgaWYgc291cmNlIGlzIHNwZWNpZmllZAorICBFWFBFQ1RfRVEoMSwgZGVzdC5vcHRpb25hbF9pbnQzMigpKTsgICAvLyBvbmx5IHNvdXJjZTogdXNlIHNvdXJjZQorICBFWFBFQ1RfRVEoMiwgZGVzdC5vcHRpb25hbF9pbnQ2NCgpKTsgICAvLyBzb3VyY2UgYW5kIGRlc3Q6IHVzZSBzb3VyY2UKKyAgRVhQRUNUX0VRKDQsIGRlc3Qub3B0aW9uYWxfdWludDMyKCkpOyAgLy8gb25seSBkZXN0OiB1c2UgZGVzdAorICBFWFBFQ1RfRVEoMCwgZGVzdC5vcHRpb25hbF91aW50NjQoKSk7ICAvLyBuZWl0aGVyOiB1c2UgZGVmYXVsdAorCisgIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRoIGRlZmF1bHRzCisgIEVYUEVDVF9FUSgxMywgZGVzdC5kZWZhdWx0X2ludDMyKCkpOyAgIC8vIG9ubHkgc291cmNlOiB1c2Ugc291cmNlCisgIEVYUEVDVF9FUSgxNCwgZGVzdC5kZWZhdWx0X2ludDY0KCkpOyAgIC8vIHNvdXJjZSBhbmQgZGVzdDogdXNlIHNvdXJjZQorICBFWFBFQ1RfRVEoMTYsIGRlc3QuZGVmYXVsdF91aW50MzIoKSk7ICAvLyBvbmx5IGRlc3Q6IHVzZSBkZXN0CisgIEVYUEVDVF9FUSg0NCwgZGVzdC5kZWZhdWx0X3VpbnQ2NCgpKTsgIC8vIG5laXRoZXI6IHVzZSBkZWZhdWx0CisKKyAgLy8gUmVwZWF0ZWQgZmllbGRzOiBjb25jYXRlbmF0ZSBzb3VyY2Ugb250byB0aGUgZW5kIG9mIGRlc3QKKyAgQVNTRVJUX0VRKDIsIGRlc3QucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDUsIGRlc3QucmVwZWF0ZWRfaW50MzIoMCkpOworICBFWFBFQ1RfRVEoNiwgZGVzdC5yZXBlYXRlZF9pbnQzMigxKSk7CisgIEFTU0VSVF9FUSg0LCBkZXN0LnJlcGVhdGVkX2ludDY0X3NpemUoKSk7CisgIEVYUEVDVF9FUSg5LCBkZXN0LnJlcGVhdGVkX2ludDY0KDApKTsKKyAgRVhQRUNUX0VRKDEwLCBkZXN0LnJlcGVhdGVkX2ludDY0KDEpKTsKKyAgRVhQRUNUX0VRKDcsIGRlc3QucmVwZWF0ZWRfaW50NjQoMikpOworICBFWFBFQ1RfRVEoOCwgZGVzdC5yZXBlYXRlZF9pbnQ2NCgzKSk7CisgIEFTU0VSVF9FUSgyLCBkZXN0LnJlcGVhdGVkX3VpbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMTEsIGRlc3QucmVwZWF0ZWRfdWludDMyKDApKTsKKyAgRVhQRUNUX0VRKDEyLCBkZXN0LnJlcGVhdGVkX3VpbnQzMigxKSk7CisgIEFTU0VSVF9FUSgwLCBkZXN0LnJlcGVhdGVkX3VpbnQ2NF9zaXplKCkpOworfQorCitURVNUKE1FU1NBR0VfVEVTVF9OQU1FLCBJc0luaXRpYWxpemVkKSB7CisgIFVOSVRURVNUOjpUZXN0SXNJbml0aWFsaXplZCBtc2c7CisgIEVYUEVDVF9UUlVFKG1zZy5Jc0luaXRpYWxpemVkKCkpOworICBVTklUVEVTVDo6VGVzdElzSW5pdGlhbGl6ZWQ6OlN1Yk1lc3NhZ2UqIHN1Yl9tZXNzYWdlID0KKyAgICAgIG1zZy5tdXRhYmxlX3N1Yl9tZXNzYWdlKCk7CisgIEVYUEVDVF9UUlVFKG1zZy5Jc0luaXRpYWxpemVkKCkpOworICBVTklUVEVTVDo6VGVzdElzSW5pdGlhbGl6ZWQ6OlN1Yk1lc3NhZ2U6OlN1Ykdyb3VwKiBzdWJfZ3JvdXAgPQorICAgICAgc3ViX21lc3NhZ2UtPm11dGFibGVfc3ViZ3JvdXAoKTsKKyAgRVhQRUNUX0ZBTFNFKG1zZy5Jc0luaXRpYWxpemVkKCkpOworICBzdWJfZ3JvdXAtPnNldF9pKDEpOworICBFWFBFQ1RfVFJVRShtc2cuSXNJbml0aWFsaXplZCgpKTsKK30KKworVEVTVChNRVNTQUdFX1RFU1RfTkFNRSwgSXNJbml0aWFsaXplZFNwbGl0Qnl0ZXN0cmVhbSkgeworICBVTklUVEVTVDo6VGVzdFJlcXVpcmVkIGFiLCBjOworICBhYi5zZXRfYSgxKTsKKyAgYWIuc2V0X2IoMik7CisgIGMuc2V0X2MoMyk7CisKKyAgLy8gVGhlIHByb3RvYnVmIHJlcHJlc2VudGVkIGJ5IHRoZSBjb25jYXRlbmF0ZWQgc3RyaW5nIGhhcyBhbGwgcmVxdWlyZWQKKyAgLy8gZmllbGRzIChhLGIsYykgc2V0LgorICBzdGQ6OnN0cmluZyBieXRlcyA9CisgICAgICBhYi5TZXJpYWxpemVQYXJ0aWFsQXNTdHJpbmcoKSArIGMuU2VyaWFsaXplUGFydGlhbEFzU3RyaW5nKCk7CisKKyAgVU5JVFRFU1Q6OlRlc3RSZXF1aXJlZCBjb25jYXRlbmF0ZWQ7CisgIEVYUEVDVF9UUlVFKGNvbmNhdGVuYXRlZC5QYXJzZVBhcnRpYWxGcm9tU3RyaW5nKGJ5dGVzKSk7CisgIEVYUEVDVF9UUlVFKGNvbmNhdGVuYXRlZC5Jc0luaXRpYWxpemVkKCkpOworCisgIFVOSVRURVNUOjpUZXN0UmVxdWlyZWRGb3JlaWduIGZhYiwgZmM7CisgIGZhYi5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2EoMSk7CisgIGZhYi5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2IoMik7CisgIGZjLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpLT5zZXRfYygzKTsKKworICBieXRlcyA9CisgICAgICBmYWIuU2VyaWFsaXplUGFydGlhbEFzU3RyaW5nKCkgKyBmYy5TZXJpYWxpemVQYXJ0aWFsQXNTdHJpbmcoKTsKKworICBVTklUVEVTVDo6VGVzdFJlcXVpcmVkRm9yZWlnbiBmY29uY2F0ZW5hdGVkOworICBFWFBFQ1RfVFJVRShmY29uY2F0ZW5hdGVkLlBhcnNlUGFydGlhbEZyb21TdHJpbmcoYnl0ZXMpKTsKKyAgRVhQRUNUX1RSVUUoZmNvbmNhdGVuYXRlZC5Jc0luaXRpYWxpemVkKCkpOworfQorCitURVNUKE1FU1NBR0VfRkFDVE9SWV9URVNUX05BTUUsIEdlbmVyYXRlZEZhY3RvcnlMb29rdXApIHsKKyAgRVhQRUNUX0VRKE1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLT5HZXRQcm90b3R5cGUoCisgICAgICAgICAgICAgICAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpKSwKKyAgICAgICAgICAgICZVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpkZWZhdWx0X2luc3RhbmNlKCkpOworfQorCitURVNUKE1FU1NBR0VfRkFDVE9SWV9URVNUX05BTUUsIEdlbmVyYXRlZEZhY3RvcnlVbmtub3duVHlwZSkgeworICAvLyBDb25zdHJ1Y3QgYSBuZXcgZGVzY3JpcHRvci4KKyAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICBmaWxlLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgZmlsZS5hZGRfbWVzc2FnZV90eXBlKCktPnNldF9uYW1lKCJGb28iKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IHBvb2wuQnVpbGRGaWxlKGZpbGUpLT5tZXNzYWdlX3R5cGUoMCk7CisKKyAgLy8gVHJ5aW5nIHRvIGNvbnN0cnVjdCBpdCBzaG91bGQgcmV0dXJuIG51bGxwdHIuCisgIEVYUEVDVF9UUlVFKE1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLT5HZXRQcm90b3R5cGUoZGVzY3JpcHRvcikgPT0KKyAgICAgICAgICAgICAgbnVsbHB0cik7Cit9CisKK1RFU1QoTUVTU0FHRV9URVNUX05BTUUsIE1PTUlQYXJzZXJFZGdlQ2FzZXMpIHsKKyAgeworICAgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbXNnOworICAgIC8vIFBhcnNlciBlbmRzIGluIGxhc3QgMTYgYnl0ZXMgb2YgYnVmZmVyIGR1ZSB0byBhIDAuCisgICAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgICAvLyAxMiBieXRlcyBvZiBkYXRhCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIGRhdGEgKz0gIlwzNzBcMVwxIjsKKyAgICAvLyAxMyBieXRlIGlzIHRlcm1pbmF0b3IKKyAgICBkYXRhICs9ICdcMCc7ICAvLyBUZXJtaW5hdG9yCisgICAgLy8gZm9sbG93ZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIHN0cmVhbQorICAgIC8vIHNwYWNlIGlzIGFzY2lpIDMyIHNvIG5vIGVuZCBncm91cAorICAgIGRhdGEgKz0gc3RkOjpzdHJpbmcoMzAsICcgJyk7CisgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gemNpcyhkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIDE3KTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBjaXMoJnpjaXMpOworICAgIEVYUEVDVF9UUlVFKG1zZy5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmNpcykpOworICAgIEVYUEVDVF9FUShjaXMuQ3VycmVudFBvc2l0aW9uKCksIDMgKiA0ICsgMSk7CisgIH0KKyAgeworICAgIC8vIFBhcnNlciBlbmRzIGluIGxhc3QgMTYgYnl0ZXMgb2YgYnVmZmVyIGR1ZSB0byBhIGVuZC1ncm91cC4KKyAgICAvLyBNdXN0IHVzZSBhIG1lc3NhZ2UgdGhhdCBpcyBhIGdyb3VwLiBPdGhlcndpc2UgZW5kaW5nIG9uIGEgZ3JvdXAgZW5kIGlzCisgICAgLy8gYSBmYWlsdXJlLgorICAgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6Ok9wdGlvbmFsR3JvdXAgbXNnOworICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIGRhdGEgKz0gIlwzNzBcMVwxIjsKKyAgICBkYXRhICs9ICdcMTQnOyAgLy8gT2N0YWwgZW5kLWdyb3VwIHRhZyAxMiAoMSAqIDggKyA0KAorICAgIGRhdGEgKz0gc3RkOjpzdHJpbmcoMzAsICcgJyk7CisgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gemNpcyhkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIDE3KTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBjaXMoJnpjaXMpOworICAgIEVYUEVDVF9UUlVFKG1zZy5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmNpcykpOworICAgIEVYUEVDVF9FUShjaXMuQ3VycmVudFBvc2l0aW9uKCksIDMgKiAzICsgMSk7CisgICAgRVhQRUNUX1RSVUUoY2lzLkxhc3RUYWdXYXMoMTIpKTsKKyAgfQorICB7CisgICAgLy8gUGFyc2VyIGVuZHMgaW4gbGFzdCAxNiBieXRlcyBvZiBidWZmZXIgZHVlIHRvIGEgZW5kLWdyb3VwLiBCdXQgaXMgaW5zaWRlCisgICAgLy8gYSBsZW5ndGggZGVsaW1pdGVkIGZpZWxkLgorICAgIC8vIGEgZmFpbHVyZS4KKyAgICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpPcHRpb25hbEdyb3VwIG1zZzsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworICAgIGRhdGEgKz0gIlwyMlwzZm9vIjsKKyAgICBkYXRhICs9ICdcMTQnOyAgLy8gT2N0YWwgZW5kLWdyb3VwIHRhZyAxMiAoMSAqIDggKyA0KAorICAgIGRhdGEgKz0gc3RkOjpzdHJpbmcoMzAsICcgJyk7CisgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gemNpcyhkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIDE3KTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBjaXMoJnpjaXMpOworICAgIEVYUEVDVF9UUlVFKG1zZy5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmNpcykpOworICAgIEVYUEVDVF9FUShjaXMuQ3VycmVudFBvc2l0aW9uKCksIDYpOworICAgIEVYUEVDVF9UUlVFKGNpcy5MYXN0VGFnV2FzKDEyKSk7CisgIH0KKyAgeworICAgIC8vIFBhcnNlciBmYWlscyB3aGVuIGVuZGluZyBvbiAwIGlmIGZyb20gWmVyb0NvcHlJbnB1dFN0cmVhbQorICAgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbXNnOworICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisgICAgLy8gMTIgYnl0ZXMgb2YgZGF0YQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSBkYXRhICs9ICJcMzcwXDFcMSI7CisgICAgLy8gMTMgYnl0ZSBpcyB0ZXJtaW5hdG9yCisgICAgZGF0YSArPSAnXDAnOyAgLy8gVGVybWluYXRvcgorICAgIGRhdGEgKz0gc3RkOjpzdHJpbmcoMzAsICcgJyk7CisgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gemNpcyhkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIDE3KTsKKyAgICBFWFBFQ1RfRkFMU0UobXNnLlBhcnNlUGFydGlhbEZyb21aZXJvQ29weVN0cmVhbSgmemNpcykpOworICB9Cit9CisKKworVEVTVChNRVNTQUdFX1RFU1RfTkFNRSwgQ2hlY2tTZXJpYWxpemF0aW9uV2hlbkludGVybGVhdmVkRXh0ZW5zaW9ucykgeworICBVTklUVEVTVDo6VGVzdEV4dGVuc2lvblJhbmdlU2VyaWFsaXplIGluX21lc3NhZ2U7CisKKyAgaW5fbWVzc2FnZS5zZXRfZm9vX29uZSgxKTsKKyAgaW5fbWVzc2FnZS5zZXRfZm9vX3R3bygyKTsKKyAgaW5fbWVzc2FnZS5zZXRfZm9vX3RocmVlKDMpOworICBpbl9tZXNzYWdlLnNldF9mb29fZm91cig0KTsKKworICBpbl9tZXNzYWdlLlNldEV4dGVuc2lvbihVTklUVEVTVDo6VGVzdEV4dGVuc2lvblJhbmdlU2VyaWFsaXplOjpiYXJfb25lLCAxKTsKKyAgaW5fbWVzc2FnZS5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OlRlc3RFeHRlbnNpb25SYW5nZVNlcmlhbGl6ZTo6YmFyX3R3bywgMik7CisgIGluX21lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpUZXN0RXh0ZW5zaW9uUmFuZ2VTZXJpYWxpemU6OmJhcl90aHJlZSwgMyk7CisgIGluX21lc3NhZ2UuU2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpUZXN0RXh0ZW5zaW9uUmFuZ2VTZXJpYWxpemU6OmJhcl9mb3VyLCA0KTsKKyAgaW5fbWVzc2FnZS5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OlRlc3RFeHRlbnNpb25SYW5nZVNlcmlhbGl6ZTo6YmFyX2ZpdmUsIDUpOworCisgIHN0ZDo6c3RyaW5nIGJ1ZmZlcjsKKyAgaW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmYnVmZmVyKTsKKworICBVTklUVEVTVDo6VGVzdEV4dGVuc2lvblJhbmdlU2VyaWFsaXplIG91dF9tZXNzYWdlOworICBvdXRfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoYnVmZmVyKTsKKworICBFWFBFQ1RfRVEoMSwgb3V0X21lc3NhZ2UuZm9vX29uZSgpKTsKKyAgRVhQRUNUX0VRKDIsIG91dF9tZXNzYWdlLmZvb190d28oKSk7CisgIEVYUEVDVF9FUSgzLCBvdXRfbWVzc2FnZS5mb29fdGhyZWUoKSk7CisgIEVYUEVDVF9FUSg0LCBvdXRfbWVzc2FnZS5mb29fZm91cigpKTsKKworICBFWFBFQ1RfRVEoMSwgb3V0X21lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpUZXN0RXh0ZW5zaW9uUmFuZ2VTZXJpYWxpemU6OmJhcl9vbmUpKTsKKyAgRVhQRUNUX0VRKDIsIG91dF9tZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6VGVzdEV4dGVuc2lvblJhbmdlU2VyaWFsaXplOjpiYXJfdHdvKSk7CisgIEVYUEVDVF9FUSgzLCBvdXRfbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OlRlc3RFeHRlbnNpb25SYW5nZVNlcmlhbGl6ZTo6YmFyX3RocmVlKSk7CisgIEVYUEVDVF9FUSg0LCBvdXRfbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OlRlc3RFeHRlbnNpb25SYW5nZVNlcmlhbGl6ZTo6YmFyX2ZvdXIpKTsKKyAgRVhQRUNUX0VRKDUsIG91dF9tZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6VGVzdEV4dGVuc2lvblJhbmdlU2VyaWFsaXplOjpiYXJfZml2ZSkpOworfQorCitURVNUKE1FU1NBR0VfVEVTVF9OQU1FLCBQcmVzZXJ2ZXNGbG9hdGluZ1BvaW50TmVnYXRpdmUwKSB7CisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgaW5fbWVzc2FnZTsKKyAgaW5fbWVzc2FnZS5zZXRfb3B0aW9uYWxfZmxvYXQoLTAuMGYpOworICBpbl9tZXNzYWdlLnNldF9vcHRpb25hbF9kb3VibGUoLTAuMCk7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIEVYUEVDVF9UUlVFKGluX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKTsKKyAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBvdXRfbWVzc2FnZTsKKyAgRVhQRUNUX1RSVUUob3V0X21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKKyAgRVhQRUNUX0VRKGluX21lc3NhZ2Uub3B0aW9uYWxfZmxvYXQoKSwgb3V0X21lc3NhZ2Uub3B0aW9uYWxfZmxvYXQoKSk7CisgIEVYUEVDVF9FUShzdGQ6OnNpZ25iaXQoaW5fbWVzc2FnZS5vcHRpb25hbF9mbG9hdCgpKSwKKyAgICAgICAgICAgIHN0ZDo6c2lnbmJpdChvdXRfbWVzc2FnZS5vcHRpb25hbF9mbG9hdCgpKSk7CisgIEVYUEVDVF9FUShpbl9tZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSgpLCBvdXRfbWVzc2FnZS5vcHRpb25hbF9kb3VibGUoKSk7CisgIEVYUEVDVF9FUShzdGQ6OnNpZ25iaXQoaW5fbWVzc2FnZS5vcHRpb25hbF9kb3VibGUoKSksCisgICAgICAgICAgICBzdGQ6OnNpZ25iaXQob3V0X21lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKCkpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL21ldGFkYXRhLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21ldGFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4OTY0OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWV0YWRhdGEuaApAQCAtMCwwICsxLDM2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTUVUQURBVEFfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9NRVRBREFUQV9IX18KKworLy8gVE9ETyhiLzE1MTExNzYzMCk6IFJlbW92ZSB0aGlzIGZpbGUgYW5kIGFsbCBpbnN0YW5jZXMgd2hlcmUgaXQgZ2V0cyBpbXBvcnRlZC4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTUVUQURBVEFfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL21ldGFkYXRhX2xpdGUuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvbWV0YWRhdGFfbGl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMzE1MTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21ldGFkYXRhX2xpdGUuaApAQCAtMCwwICsxLDMxNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX01FVEFEQVRBX0xJVEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9NRVRBREFUQV9MSVRFX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydC5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworI2lmZGVmIFNXSUcKKyNlcnJvciAiWW91IGNhbm5vdCBTV0lHIHByb3RvIGhlYWRlcnMiCisjZW5kaWYKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhpcyBpcyB0aGUgcmVwcmVzZW50YXRpb24gZm9yIG1lc3NhZ2VzIHRoYXQgc3VwcG9ydCBhcmVuYSBhbGxvY2F0aW9uLiBJdAorLy8gdXNlcyBhIHRhZ2dlZCBwb2ludGVyIHRvIGVpdGhlciBzdG9yZSB0aGUgb3duaW5nIEFyZW5hIHBvaW50ZXIsIGlmIHRoZXJlIGFyZQorLy8gbm8gdW5rbm93biBmaWVsZHMsIG9yIGEgcG9pbnRlciB0byBhIGJsb2NrIG9mIG1lbW9yeSB3aXRoIGJvdGggdGhlIG93bmluZworLy8gQXJlbmEgcG9pbnRlciBhbmQgdGhlIFVua25vd25GaWVsZFNldCwgaWYgdGhlcmUgYXJlIHVua25vd24gZmllbGRzLiBCZXNpZGVzLAorLy8gaXQgYWxzbyB1c2VzIHRoZSB0YWcgdG8gZGlzdGluZ3Vpc2ggd2hldGhlciB0aGUgb3duaW5nIEFyZW5hIHBvaW50ZXIgaXMgYWxzbworLy8gdXNlZCBieSBzdWItc3RydWN0dXJlIGFsbG9jYXRpb24uIFRoaXMgb3B0aW1pemF0aW9uIGFsbG93cyBmb3IKKy8vICJ6ZXJvLW92ZXJoZWFkIiBzdG9yYWdlIG9mIHRoZSBBcmVuYSBwb2ludGVyLCByZWxhdGl2ZSB0byB0aGUgYWJvdmUgYmFzZWxpbmUKKy8vIGltcGxlbWVudGF0aW9uLgorLy8KKy8vIFRoZSB0YWdnZWQgcG9pbnRlciB1c2VzIHRoZSBsZWFzdCB0d28gc2lnbmlmaWNhbnQgYml0cyB0byBkaXNhbWJpZ3VhdGUgY2FzZXMuCisvLyBJdCB1c2VzIGJpdCAwID09IDAgdG8gaW5kaWNhdGUgYW4gYXJlbmEgcG9pbnRlciBhbmQgYml0IDAgPT0gMSB0byBpbmRpY2F0ZSBhCisvLyBVRlMrQXJlbmEtY29udGFpbmVyIHBvaW50ZXIuIEJlc2lkZXMgaXQgdXNlcyBiaXQgMSA9PSAwIHRvIGluZGljYXRlIGFyZW5hCisvLyBhbGxvY2F0aW9uIGFuZCBiaXQgMSA9PSAxIHRvIGluZGljYXRlIGhlYXAgYWxsb2NhdGlvbi4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBJbnRlcm5hbE1ldGFkYXRhIHsKKyBwdWJsaWM6CisgIGNvbnN0ZXhwciBJbnRlcm5hbE1ldGFkYXRhKCkgOiBwdHJfKDApIHt9CisgIGV4cGxpY2l0IEludGVybmFsTWV0YWRhdGEoQXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSkgeworICAgIFNldEFyZW5hKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgfQorCisgIHZvaWQgU2V0QXJlbmEoQXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgICBwdHJfID0gaXNfbWVzc2FnZV9vd25lZAorICAgICAgICAgICAgICAgPyByZWludGVycHJldF9jYXN0PGludHB0cl90PihhcmVuYSkgfCBrTWVzc2FnZU93bmVkQXJlbmFUYWdNYXNrCisgICAgICAgICAgICAgICA6IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGFyZW5hKTsKKyAgICBHT09HTEVfRENIRUNLKCFpc19tZXNzYWdlX293bmVkIHx8IGFyZW5hICE9IG51bGxwdHIpOworICB9CisKKyAgLy8gVG8ga2VlcCB0aGUgQUJJIGlkZW50aWNhbCBiZXR3ZWVuIGRlYnVnIGFuZCBub24tZGVidWcgYnVpbGRzLAorICAvLyB0aGUgZGVzdHJ1Y3RvciBpcyBhbHdheXMgZGVmaW5lZCBoZXJlIGV2ZW4gdGhvdWdoIGl0IG1heSBkZWxlZ2F0ZQorICAvLyB0byBhIG5vbi1pbmxpbmUgcHJpdmF0ZSBtZXRob2QuCisgIC8vIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9pc3N1ZXMvOTk0NykKKyAgfkludGVybmFsTWV0YWRhdGEoKSB7CisjaWYgZGVmaW5lZChOREVCVUcpIHx8IGRlZmluZWQoX01TQ19WRVIpCisgICAgaWYgKEhhc01lc3NhZ2VPd25lZEFyZW5hVGFnKCkpIHsKKyAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PEFyZW5hKj4ocHRyXyAtIGtNZXNzYWdlT3duZWRBcmVuYVRhZ01hc2spOworICAgIH0KKyNlbHNlCisgICAgQ2hlY2tlZERlc3RydWN0KCk7CisjZW5kaWYKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIERlbGV0ZSgpIHsKKyAgICAvLyBOb3RlIHRoYXQgRGVsZXRlPD4gc2hvdWxkIGJlIGNhbGxlZCBub3QgbW9yZSB0aGFuIG9uY2UuCisgICAgaWYgKGhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgICAgRGVsZXRlT3V0T2ZMaW5lSGVscGVyPFQ+KCk7CisgICAgfQorICB9CisKKyAgLy8gRGVsZXRlUmV0dXJuQXJlbmEgd2lsbCBkZWxldGUgdGhlIHVua25vd24gZmllbGRzIG9ubHkgaWYgdGhleSB3ZXJlbid0CisgIC8vIGFsbG9jYXRlZCBvbiBhbiBhcmVuYS4gIFRoZW4gaXQgdXBkYXRlcyB0aGUgZmxhZ3Mgc28gdGhhdCBpZiB5b3UgY2FsbAorICAvLyBoYXZlX3Vua25vd25fZmllbGRzKCksIGl0IHdpbGwgcmV0dXJuIGZhbHNlLiAgRmluYWxseSwgaXQgcmV0dXJucyB0aGUKKyAgLy8gY3VycmVudCB2YWx1ZSBvZiBhcmVuYSgpLiAgSXQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGEKKyAgLy8gTWVzc2FnZSBjbGFzcydzIGRlc3RydWN0b3IgY2FsbCwgc28gdGhhdCB3aGVuIGNvbnRyb2wgZXZlbnR1YWxseSBnZXRzCisgIC8vIHRvIH5JbnRlcm5hbE1ldGFkYXRhKCksIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGhhdmVfdW5rbm93bl9maWVsZHMoKQorICAvLyBhZ2Fpbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEFyZW5hKiBEZWxldGVSZXR1cm5BcmVuYSgpIHsKKyAgICBpZiAoaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgICByZXR1cm4gRGVsZXRlT3V0T2ZMaW5lSGVscGVyPFQ+KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBQdHJWYWx1ZTxBcmVuYT4oKTsKKyAgICB9CisgIH0KKworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIEFyZW5hKiBvd25pbmdfYXJlbmEoKSBjb25zdCB7CisgICAgcmV0dXJuIEhhc01lc3NhZ2VPd25lZEFyZW5hVGFnKCkgPyBudWxscHRyIDogYXJlbmEoKTsKKyAgfQorCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgQXJlbmEqIHVzZXJfYXJlbmEoKSBjb25zdCB7CisgICAgQXJlbmEqIGEgPSBhcmVuYSgpOworICAgIHJldHVybiBhICYmICFhLT5Jc01lc3NhZ2VPd25lZCgpID8gYSA6IG51bGxwdHI7CisgIH0KKworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIEFyZW5hKiBhcmVuYSgpIGNvbnN0IHsKKyAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShoYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgICByZXR1cm4gUHRyVmFsdWU8Q29udGFpbmVyQmFzZT4oKS0+YXJlbmE7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBQdHJWYWx1ZTxBcmVuYT4oKTsKKyAgICB9CisgIH0KKworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIGJvb2wgaGF2ZV91bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gSGFzVW5rbm93bkZpZWxkc1RhZygpOworICB9CisKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSB2b2lkKiByYXdfYXJlbmFfcHRyKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPihwdHJfKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIGNvbnN0IFQmIHVua25vd25fZmllbGRzKAorICAgICAgY29uc3QgVCYgKCpkZWZhdWx0X2luc3RhbmNlKSgpKSBjb25zdCB7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoaGF2ZV91bmtub3duX2ZpZWxkcygpKSkgeworICAgICAgcmV0dXJuIFB0clZhbHVlPENvbnRhaW5lcjxUPj4oKS0+dW5rbm93bl9maWVsZHM7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgVCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKGhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICAgIHJldHVybiAmUHRyVmFsdWU8Q29udGFpbmVyPFQ+PigpLT51bmtub3duX2ZpZWxkczsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG11dGFibGVfdW5rbm93bl9maWVsZHNfc2xvdzxUPigpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHZvaWQgU3dhcChJbnRlcm5hbE1ldGFkYXRhKiBvdGhlcikgeworICAgIC8vIFNlbWFudGljcyBoZXJlIGFyZSB0aGF0IHdlIHN3YXAgb25seSB0aGUgdW5rbm93biBmaWVsZHMsIG5vdCB0aGUgYXJlbmEKKyAgICAvLyBwb2ludGVyLiBXZSBjYW5ub3Qgc2ltcGx5IHN3YXAgcHRyXyB3aXRoIG90aGVyLT5wdHJfIGJlY2F1c2Ugd2UgbmVlZCB0bworICAgIC8vIG1haW50YWluIG91ciBvd24gYXJlbmEgcHRyLiBBbHNvLCBvdXIgcHRyXyBhbmQgb3RoZXIncyBwdHJfIG1heSBiZSBpbgorICAgIC8vIGRpZmZlcmVudCBzdGF0ZXMgKGRpcmVjdCBhcmVuYSBwb2ludGVyIHZzLiBjb250YWluZXIgd2l0aCBVRlMpIHNvIHdlCisgICAgLy8gY2Fubm90IHNpbXBseSBzd2FwIHB0cl8gYW5kIHRoZW4gcmVzdG9yZSB0aGUgYXJlbmEgcG9pbnRlcnMuIFdlIHJldXNlCisgICAgLy8gVUZTJ3Mgc3dhcCBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkLgorICAgIGlmIChoYXZlX3Vua25vd25fZmllbGRzKCkgfHwgb3RoZXItPmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgICAgRG9Td2FwPFQ+KG90aGVyLT5tdXRhYmxlX3Vua25vd25fZmllbGRzPFQ+KCkpOworICAgIH0KKyAgfQorCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgdm9pZCBJbnRlcm5hbFN3YXAoSW50ZXJuYWxNZXRhZGF0YSogb3RoZXIpIHsKKyAgICBzdGQ6OnN3YXAocHRyXywgb3RoZXItPnB0cl8pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgdm9pZCBNZXJnZUZyb20oY29uc3QgSW50ZXJuYWxNZXRhZGF0YSYgb3RoZXIpIHsKKyAgICBpZiAob3RoZXIuaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgICBEb01lcmdlRnJvbTxUPihvdGhlci51bmtub3duX2ZpZWxkczxUPihudWxscHRyKSk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgdm9pZCBDbGVhcigpIHsKKyAgICBpZiAoaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgICBEb0NsZWFyPFQ+KCk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBpbnRwdHJfdCBwdHJfOworCisgIC8vIFRhZ2dlZCBwb2ludGVyIGltcGxlbWVudGF0aW9uLgorICBzdGF0aWMgY29uc3RleHByIGludHB0cl90IGtVbmtub3duRmllbGRzVGFnTWFzayA9IDE7CisgIHN0YXRpYyBjb25zdGV4cHIgaW50cHRyX3Qga01lc3NhZ2VPd25lZEFyZW5hVGFnTWFzayA9IDI7CisgIHN0YXRpYyBjb25zdGV4cHIgaW50cHRyX3Qga1B0clRhZ01hc2sgPQorICAgICAga1Vua25vd25GaWVsZHNUYWdNYXNrIHwga01lc3NhZ2VPd25lZEFyZW5hVGFnTWFzazsKKyAgc3RhdGljIGNvbnN0ZXhwciBpbnRwdHJfdCBrUHRyVmFsdWVNYXNrID0gfmtQdHJUYWdNYXNrOworCisgIC8vIEFjY2Vzc29ycyBmb3IgcG9pbnRlciB0YWcgYW5kIHBvaW50ZXIgdmFsdWUuCisgIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgYm9vbCBIYXNVbmtub3duRmllbGRzVGFnKCkgY29uc3QgeworICAgIHJldHVybiBwdHJfICYga1Vua25vd25GaWVsZHNUYWdNYXNrOworICB9CisgIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgYm9vbCBIYXNNZXNzYWdlT3duZWRBcmVuYVRhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gcHRyXyAmIGtNZXNzYWdlT3duZWRBcmVuYVRhZ01hc2s7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgVSogUHRyVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VSo+KHB0cl8gJiBrUHRyVmFsdWVNYXNrKTsKKyAgfQorCisgIC8vIElmIHB0cl8ncyB0YWcgaXMga1RhZ0NvbnRhaW5lciwgaXQgcG9pbnRzIHRvIGFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0LgorICBzdHJ1Y3QgQ29udGFpbmVyQmFzZSB7CisgICAgQXJlbmEqIGFyZW5hOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgQ29udGFpbmVyIDogcHVibGljIENvbnRhaW5lckJhc2UgeworICAgIFQgdW5rbm93bl9maWVsZHM7CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX05PSU5MSU5FIEFyZW5hKiBEZWxldGVPdXRPZkxpbmVIZWxwZXIoKSB7CisgICAgaWYgKGF1dG8qIGEgPSBhcmVuYSgpKSB7CisgICAgICAvLyBTdWJ0bGU6IHdlIHdhbnQgdG8gcHJlc2VydmUgdGhlIG1lc3NhZ2Utb3duZWQgYXJlbmEgZmxhZywgd2hpbGUgYXQgdGhlCisgICAgICAvLyBzYW1lIHRpbWUgcmVwbGFjaW5nIHRoZSBwb2ludGVyIHRvIENvbnRhaW5lcjxUPiB3aXRoIGEgcG9pbnRlciB0byB0aGUKKyAgICAgIC8vIGFyZW5hLgorICAgICAgaW50cHRyX3QgbWVzc2FnZV9vd25lZF9hcmVuYV90YWcgPSBwdHJfICYga01lc3NhZ2VPd25lZEFyZW5hVGFnTWFzazsKKyAgICAgIHB0cl8gPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihhKSB8IG1lc3NhZ2Vfb3duZWRfYXJlbmFfdGFnOworICAgICAgcmV0dXJuIGE7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlbGV0ZSBQdHJWYWx1ZTxDb250YWluZXI8VD4+KCk7CisgICAgICBwdHJfID0gMDsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9OT0lOTElORSBUKiBtdXRhYmxlX3Vua25vd25fZmllbGRzX3Nsb3coKSB7CisgICAgQXJlbmEqIG15X2FyZW5hID0gYXJlbmEoKTsKKyAgICBDb250YWluZXI8VD4qIGNvbnRhaW5lciA9IEFyZW5hOjpDcmVhdGU8Q29udGFpbmVyPFQ+PihteV9hcmVuYSk7CisgICAgaW50cHRyX3QgbWVzc2FnZV9vd25lZF9hcmVuYV90YWcgPSBwdHJfICYga01lc3NhZ2VPd25lZEFyZW5hVGFnTWFzazsKKyAgICAvLyBUd28tc3RlcCBhc3NpZ25tZW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiBjbGFuZydzIHN0YXRpYyBhbmFseXplcjoKKyAgICAvLyBodHRwczovL2J1Z3MubGx2bS5vcmcvc2hvd19idWcuY2dpP2lkPTM0MTk4LgorICAgIHB0cl8gPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pihjb250YWluZXIpOworICAgIHB0cl8gfD0ga1Vua25vd25GaWVsZHNUYWdNYXNrIHwgbWVzc2FnZV9vd25lZF9hcmVuYV90YWc7CisgICAgY29udGFpbmVyLT5hcmVuYSA9IG15X2FyZW5hOworICAgIHJldHVybiAmKGNvbnRhaW5lci0+dW5rbm93bl9maWVsZHMpOworICB9CisKKyAgLy8gVGVtcGxhdGVkIGZ1bmN0aW9ucy4KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgUFJPVE9CVUZfTk9JTkxJTkUgdm9pZCBEb0NsZWFyKCkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHM8VD4oKS0+Q2xlYXIoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9OT0lOTElORSB2b2lkIERvTWVyZ2VGcm9tKGNvbnN0IFQmIG90aGVyKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkczxUPigpLT5NZXJnZUZyb20ob3RoZXIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX05PSU5MSU5FIHZvaWQgRG9Td2FwKFQqIG90aGVyKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkczxUPigpLT5Td2FwKG90aGVyKTsKKyAgfQorCisgIC8vIFByaXZhdGUgaGVscGVyIHdpdGggZGVidWcgY2hlY2tzIGZvciB+SW50ZXJuYWxNZXRhZGF0YSgpCisgIHZvaWQgQ2hlY2tlZERlc3RydWN0KCk7Cit9OworCisvLyBTdHJpbmcgVGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zLgorCit0ZW1wbGF0ZSA8PgorUFJPVE9CVUZfRVhQT1JUIHZvaWQgSW50ZXJuYWxNZXRhZGF0YTo6RG9DbGVhcjxzdGQ6OnN0cmluZz4oKTsKK3RlbXBsYXRlIDw+CitQUk9UT0JVRl9FWFBPUlQgdm9pZCBJbnRlcm5hbE1ldGFkYXRhOjpEb01lcmdlRnJvbTxzdGQ6OnN0cmluZz4oCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG90aGVyKTsKK3RlbXBsYXRlIDw+CitQUk9UT0JVRl9FWFBPUlQgdm9pZCBJbnRlcm5hbE1ldGFkYXRhOjpEb1N3YXA8c3RkOjpzdHJpbmc+KHN0ZDo6c3RyaW5nKiBvdGhlcik7CisKKy8vIFRoaXMgaGVscGVyIFJBSUkgY2xhc3MgaXMgbmVlZGVkIHRvIGVmZmljaWVudGx5IHBhcnNlIHVua25vd24gZmllbGRzLiBXZQorLy8gc2hvdWxkIG9ubHkgY2FsbCBtdXRhYmxlX3Vua25vd25fZmllbGRzIGlmIHRoZXJlIGFyZSBhY3R1YWwgdW5rbm93biBmaWVsZHMuCisvLyBUaGUgb2J2aW91cyB0aGluZyB0byBqdXN0IHVzZSBhIHN0YWNrIHN0cmluZyBhbmQgc3dhcCBpdCBhdCB0aGUgZW5kIG9mCisvLyB0aGUgcGFyc2Ugd29uJ3Qgd29yaywgYmVjYXVzZSB0aGUgZGVzdHJ1Y3RvciBvZiBTdHJpbmdPdXRwdXRTdHJlYW0gbmVlZHMgdG8KKy8vIGJlIGNhbGxlZCBiZWZvcmUgd2UgY2FuIG1vZGlmeSB0aGUgc3RyaW5nIChpdCBjaGVjay1mYWlscykuIFVzaW5nCisvLyBMaXRlVW5rbm93bkZpZWxkU2V0dGVyIHNldHRlcigmX2ludGVybmFsX21ldGFkYXRhXyk7CisvLyBTdHJpbmdPdXRwdXRTdHJlYW0gc3RyZWFtKHNldHRlci5idWZmZXIoKSk7CisvLyBndWFyYW50ZWVzIHRoYXQgdGhlIHN0cmluZyBpcyBvbmx5IHN3YXBwZWQgYWZ0ZXIgc3RyZWFtIGlzIGRlc3Ryb3llZC4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBMaXRlVW5rbm93bkZpZWxkU2V0dGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IExpdGVVbmtub3duRmllbGRTZXR0ZXIoSW50ZXJuYWxNZXRhZGF0YSogbWV0YWRhdGEpCisgICAgICA6IG1ldGFkYXRhXyhtZXRhZGF0YSkgeworICAgIGlmIChtZXRhZGF0YS0+aGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgICBidWZmZXJfLnN3YXAoKm1ldGFkYXRhLT5tdXRhYmxlX3Vua25vd25fZmllbGRzPHN0ZDo6c3RyaW5nPigpKTsKKyAgICB9CisgIH0KKyAgfkxpdGVVbmtub3duRmllbGRTZXR0ZXIoKSB7CisgICAgaWYgKCFidWZmZXJfLmVtcHR5KCkpCisgICAgICBtZXRhZGF0YV8tPm11dGFibGVfdW5rbm93bl9maWVsZHM8c3RkOjpzdHJpbmc+KCktPnN3YXAoYnVmZmVyXyk7CisgIH0KKyAgc3RkOjpzdHJpbmcqIGJ1ZmZlcigpIHsgcmV0dXJuICZidWZmZXJfOyB9CisKKyBwcml2YXRlOgorICBJbnRlcm5hbE1ldGFkYXRhKiBtZXRhZGF0YV87CisgIHN0ZDo6c3RyaW5nIGJ1ZmZlcl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9NRVRBREFUQV9MSVRFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9ub19maWVsZF9wcmVzZW5jZV90ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9ub19maWVsZF9wcmVzZW5jZV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODJjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL25vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuY2MKQEAgLTAsMCArMSw1NzUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB7CisKKy8vIEhlbHBlcjogY2hlY2tzIHRoYXQgYWxsIGZpZWxkcyBoYXZlIGRlZmF1bHQgKHplcm8vZW1wdHkpIHZhbHVlcy4KK3ZvaWQgQ2hlY2tEZWZhdWx0VmFsdWVzKAorICAgIGNvbnN0IHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyYgbSkgeworICBFWFBFQ1RfRVEoMCwgbS5vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKDAsIG0ub3B0aW9uYWxfaW50NjQoKSk7CisgIEVYUEVDVF9FUSgwLCBtLm9wdGlvbmFsX3VpbnQzMigpKTsKKyAgRVhQRUNUX0VRKDAsIG0ub3B0aW9uYWxfdWludDY0KCkpOworICBFWFBFQ1RfRVEoMCwgbS5vcHRpb25hbF9zaW50MzIoKSk7CisgIEVYUEVDVF9FUSgwLCBtLm9wdGlvbmFsX3NpbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKDAsIG0ub3B0aW9uYWxfZml4ZWQzMigpKTsKKyAgRVhQRUNUX0VRKDAsIG0ub3B0aW9uYWxfZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0VRKDAsIG0ub3B0aW9uYWxfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSgwLCBtLm9wdGlvbmFsX3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoMCwgbS5vcHRpb25hbF9mbG9hdCgpKTsKKyAgRVhQRUNUX0VRKDAsIG0ub3B0aW9uYWxfZG91YmxlKCkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG0ub3B0aW9uYWxfYm9vbCgpKTsKKyAgRVhQRUNUX0VRKDAsIG0ub3B0aW9uYWxfc3RyaW5nKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG0ub3B0aW9uYWxfYnl0ZXMoKS5zaXplKCkpOworCisgIEVYUEVDVF9FUShmYWxzZSwgbS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIC8vIGFjY2Vzc29yIGZvciBtZXNzYWdlIGZpZWxkcyByZXR1cm5zIGRlZmF1bHQgaW5zdGFuY2Ugd2hlbiBub3QgcHJlc2VudAorICBFWFBFQ1RfRVEoMCwgbS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG0uaGFzX29wdGlvbmFsX3Byb3RvMl9tZXNzYWdlKCkpOworICAvLyBFbWJlZGRlZCBwcm90bzIgbWVzc2FnZXMgc3RpbGwgaGF2ZSBwcm90bzIgc2VtYW50aWNzLCBlLmcuIG5vbi16ZXJvIGRlZmF1bHQKKyAgLy8gdmFsdWVzLiBIZXJlIHRoZSBzdWJtZXNzYWdlIGlzIG5vdCBwcmVzZW50IGJ1dCBpdHMgYWNjZXNzb3IgcmV0dXJucyB0aGUKKyAgLy8gZGVmYXVsdCBpbnN0YW5jZS4KKyAgRVhQRUNUX0VRKDQxLCBtLm9wdGlvbmFsX3Byb3RvMl9tZXNzYWdlKCkuZGVmYXVsdF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtLmhhc19vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUShwcm90bzJfbm9maWVsZHByZXNlbmNlX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTywKKyAgICAgICAgICAgIG0ub3B0aW9uYWxfbmVzdGVkX2VudW0oKSk7CisgIEVYUEVDVF9FUShwcm90bzJfbm9maWVsZHByZXNlbmNlX3VuaXR0ZXN0OjpGT1JFSUdOX0ZPTywKKyAgICAgICAgICAgIG0ub3B0aW9uYWxfZm9yZWlnbl9lbnVtKCkpOworCisKKyAgRVhQRUNUX0VRKDAsIG0ucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG0ucmVwZWF0ZWRfaW50NjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG0ucmVwZWF0ZWRfdWludDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtLnJlcGVhdGVkX3VpbnQ2NF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbS5yZXBlYXRlZF9zaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG0ucmVwZWF0ZWRfc2ludDY0X3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG0ucmVwZWF0ZWRfZml4ZWQ2NF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbS5yZXBlYXRlZF9zZml4ZWQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbS5yZXBlYXRlZF9zZml4ZWQ2NF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbS5yZXBlYXRlZF9mbG9hdF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbS5yZXBlYXRlZF9kb3VibGVfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG0ucmVwZWF0ZWRfYm9vbF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbS5yZXBlYXRlZF9zdHJpbmdfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG0ucmVwZWF0ZWRfYnl0ZXNfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG0ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG0ucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtLnJlcGVhdGVkX3Byb3RvMl9tZXNzYWdlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbS5yZXBlYXRlZF9sYXp5X21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6T05FT0ZfRklFTERfTk9UX1NFVCwKKyAgICAgICAgICAgIG0ub25lb2ZfZmllbGRfY2FzZSgpKTsKK30KKwordm9pZCBGaWxsVmFsdWVzKHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbSkgeworICBtLT5zZXRfb3B0aW9uYWxfaW50MzIoMTAwKTsKKyAgbS0+c2V0X29wdGlvbmFsX2ludDY0KDEwMSk7CisgIG0tPnNldF9vcHRpb25hbF91aW50MzIoMTAyKTsKKyAgbS0+c2V0X29wdGlvbmFsX3VpbnQ2NCgxMDMpOworICBtLT5zZXRfb3B0aW9uYWxfc2ludDMyKDEwNCk7CisgIG0tPnNldF9vcHRpb25hbF9zaW50NjQoMTA1KTsKKyAgbS0+c2V0X29wdGlvbmFsX2ZpeGVkMzIoMTA2KTsKKyAgbS0+c2V0X29wdGlvbmFsX2ZpeGVkNjQoMTA3KTsKKyAgbS0+c2V0X29wdGlvbmFsX3NmaXhlZDMyKDEwOCk7CisgIG0tPnNldF9vcHRpb25hbF9zZml4ZWQ2NCgxMDkpOworICBtLT5zZXRfb3B0aW9uYWxfZmxvYXQoMTEwLjApOworICBtLT5zZXRfb3B0aW9uYWxfZG91YmxlKDExMS4wKTsKKyAgbS0+c2V0X29wdGlvbmFsX2Jvb2wodHJ1ZSk7CisgIG0tPnNldF9vcHRpb25hbF9zdHJpbmcoImFzZGYiKTsKKyAgbS0+c2V0X29wdGlvbmFsX2J5dGVzKCJqa2w7Iik7CisgIG0tPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDQyKTsKKyAgbS0+bXV0YWJsZV9vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoNDMpOworICBtLT5tdXRhYmxlX29wdGlvbmFsX3Byb3RvMl9tZXNzYWdlKCktPnNldF9vcHRpb25hbF9pbnQzMig0NCk7CisgIG0tPnNldF9vcHRpb25hbF9uZXN0ZWRfZW51bSgKKyAgICAgIHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKKyAgbS0+c2V0X29wdGlvbmFsX2ZvcmVpZ25fZW51bShwcm90bzJfbm9maWVsZHByZXNlbmNlX3VuaXR0ZXN0OjpGT1JFSUdOX0JBWik7CisgIG0tPm11dGFibGVfb3B0aW9uYWxfbGF6eV9tZXNzYWdlKCktPnNldF9iYig0NSk7CisgIG0tPmFkZF9yZXBlYXRlZF9pbnQzMigxMDApOworICBtLT5hZGRfcmVwZWF0ZWRfaW50NjQoMTAxKTsKKyAgbS0+YWRkX3JlcGVhdGVkX3VpbnQzMigxMDIpOworICBtLT5hZGRfcmVwZWF0ZWRfdWludDY0KDEwMyk7CisgIG0tPmFkZF9yZXBlYXRlZF9zaW50MzIoMTA0KTsKKyAgbS0+YWRkX3JlcGVhdGVkX3NpbnQ2NCgxMDUpOworICBtLT5hZGRfcmVwZWF0ZWRfZml4ZWQzMigxMDYpOworICBtLT5hZGRfcmVwZWF0ZWRfZml4ZWQ2NCgxMDcpOworICBtLT5hZGRfcmVwZWF0ZWRfc2ZpeGVkMzIoMTA4KTsKKyAgbS0+YWRkX3JlcGVhdGVkX3NmaXhlZDY0KDEwOSk7CisgIG0tPmFkZF9yZXBlYXRlZF9mbG9hdCgxMTAuMCk7CisgIG0tPmFkZF9yZXBlYXRlZF9kb3VibGUoMTExLjApOworICBtLT5hZGRfcmVwZWF0ZWRfYm9vbCh0cnVlKTsKKyAgbS0+YWRkX3JlcGVhdGVkX3N0cmluZygiYXNkZiIpOworICBtLT5hZGRfcmVwZWF0ZWRfYnl0ZXMoImprbDsiKTsKKyAgbS0+YWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig0Nik7CisgIG0tPmFkZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoNDcpOworICBtLT5hZGRfcmVwZWF0ZWRfcHJvdG8yX21lc3NhZ2UoKS0+c2V0X29wdGlvbmFsX2ludDMyKDQ4KTsKKyAgbS0+YWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtKAorICAgICAgcHJvdG8yX25vZmllbGRwcmVzZW5jZV91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVopOworICBtLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9lbnVtKHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OkZPUkVJR05fQkFaKTsKKyAgbS0+YWRkX3JlcGVhdGVkX2xhenlfbWVzc2FnZSgpLT5zZXRfYmIoNDkpOworCisgIG0tPnNldF9vbmVvZl91aW50MzIoMSk7CisgIG0tPm11dGFibGVfb25lb2ZfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDUwKTsKKyAgbS0+c2V0X29uZW9mX3N0cmluZygidGVzdCIpOyAgLy8gb25seSB0aGlzIG9uZSByZW1haW5zIHNldAorfQorCit2b2lkIENoZWNrTm9uRGVmYXVsdFZhbHVlcygKKyAgICBjb25zdCBwcm90bzJfbm9maWVsZHByZXNlbmNlX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMmIG0pIHsKKyAgRVhQRUNUX0VRKDEwMCwgbS5vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKDEwMSwgbS5vcHRpb25hbF9pbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKDEwMiwgbS5vcHRpb25hbF91aW50MzIoKSk7CisgIEVYUEVDVF9FUSgxMDMsIG0ub3B0aW9uYWxfdWludDY0KCkpOworICBFWFBFQ1RfRVEoMTA0LCBtLm9wdGlvbmFsX3NpbnQzMigpKTsKKyAgRVhQRUNUX0VRKDEwNSwgbS5vcHRpb25hbF9zaW50NjQoKSk7CisgIEVYUEVDVF9FUSgxMDYsIG0ub3B0aW9uYWxfZml4ZWQzMigpKTsKKyAgRVhQRUNUX0VRKDEwNywgbS5vcHRpb25hbF9maXhlZDY0KCkpOworICBFWFBFQ1RfRVEoMTA4LCBtLm9wdGlvbmFsX3NmaXhlZDMyKCkpOworICBFWFBFQ1RfRVEoMTA5LCBtLm9wdGlvbmFsX3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoMTEwLjAsIG0ub3B0aW9uYWxfZmxvYXQoKSk7CisgIEVYUEVDVF9FUSgxMTEuMCwgbS5vcHRpb25hbF9kb3VibGUoKSk7CisgIEVYUEVDVF9FUSh0cnVlLCBtLm9wdGlvbmFsX2Jvb2woKSk7CisgIEVYUEVDVF9FUSgiYXNkZiIsIG0ub3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoImprbDsiLCBtLm9wdGlvbmFsX2J5dGVzKCkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSg0MiwgbS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoNDMsIG0ub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkuYygpKTsKKyAgRVhQRUNUX0VRKHRydWUsIG0uaGFzX29wdGlvbmFsX3Byb3RvMl9tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoNDQsIG0ub3B0aW9uYWxfcHJvdG8yX21lc3NhZ2UoKS5vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLAorICAgICAgICAgICAgbS5vcHRpb25hbF9uZXN0ZWRfZW51bSgpKTsKKyAgRVhQRUNUX0VRKHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OkZPUkVJR05fQkFaLAorICAgICAgICAgICAgbS5vcHRpb25hbF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9FUSh0cnVlLCBtLmhhc19vcHRpb25hbF9sYXp5X21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSg0NSwgbS5vcHRpb25hbF9sYXp5X21lc3NhZ2UoKS5iYigpKTsKKworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMTAwLCBtLnJlcGVhdGVkX2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfaW50NjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEwMSwgbS5yZXBlYXRlZF9pbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX3VpbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMTAyLCBtLnJlcGVhdGVkX3VpbnQzMigwKSk7CisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX3VpbnQ2NF9zaXplKCkpOworICBFWFBFQ1RfRVEoMTAzLCBtLnJlcGVhdGVkX3VpbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX3NpbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMTA0LCBtLnJlcGVhdGVkX3NpbnQzMigwKSk7CisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX3NpbnQ2NF9zaXplKCkpOworICBFWFBFQ1RfRVEoMTA1LCBtLnJlcGVhdGVkX3NpbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEwNiwgbS5yZXBlYXRlZF9maXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfZml4ZWQ2NF9zaXplKCkpOworICBFWFBFQ1RfRVEoMTA3LCBtLnJlcGVhdGVkX2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9zZml4ZWQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMTA4LCBtLnJlcGVhdGVkX3NmaXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfc2ZpeGVkNjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEwOSwgbS5yZXBlYXRlZF9zZml4ZWQ2NCgwKSk7CisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX2Zsb2F0X3NpemUoKSk7CisgIEVYUEVDVF9FUSgxMTAuMCwgbS5yZXBlYXRlZF9mbG9hdCgwKSk7CisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX2RvdWJsZV9zaXplKCkpOworICBFWFBFQ1RfRVEoMTExLjAsIG0ucmVwZWF0ZWRfZG91YmxlKDApKTsKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfYm9vbF9zaXplKCkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbS5yZXBlYXRlZF9ib29sKDApKTsKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfc3RyaW5nX3NpemUoKSk7CisgIEVYUEVDVF9FUSgiYXNkZiIsIG0ucmVwZWF0ZWRfc3RyaW5nKDApKTsKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfYnl0ZXNfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJqa2w7IiwgbS5yZXBlYXRlZF9ieXRlcygwKSk7CisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUoKSk7CisgIEVYUEVDVF9FUSg0NiwgbS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKS5iYigpKTsKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7CisgIEVYUEVDVF9FUSg0NywgbS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfcHJvdG8yX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQ4LCBtLnJlcGVhdGVkX3Byb3RvMl9tZXNzYWdlKDApLm9wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOworICBFWFBFQ1RfRVEocHJvdG8yX25vZmllbGRwcmVzZW5jZV91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosCisgICAgICAgICAgICBtLnJlcGVhdGVkX25lc3RlZF9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUoKSk7CisgIEVYUEVDVF9FUShwcm90bzJfbm9maWVsZHByZXNlbmNlX3VuaXR0ZXN0OjpGT1JFSUdOX0JBWiwKKyAgICAgICAgICAgIG0ucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX3NpemUoKSk7CisgIEVYUEVDVF9FUSg0OSwgbS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UoMCkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6a09uZW9mU3RyaW5nLAorICAgICAgICAgICAgbS5vbmVvZl9maWVsZF9jYXNlKCkpOworICBFWFBFQ1RfRVEoInRlc3QiLCBtLm9uZW9mX3N0cmluZygpKTsKK30KKworVEVTVChOb0ZpZWxkUHJlc2VuY2VUZXN0LCBCYXNpY01lc3NhZ2VUZXN0KSB7CisgIHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICAvLyBDaGVjayBkZWZhdWx0IHZhbHVlcywgZmlsbCBhbGwgZmllbGRzLCBjaGVjayB2YWx1ZXMuIFdlIGp1c3Qgd2FudCB0bworICAvLyBleGVyY2lzZSB0aGUgYmFzaWMgZ2V0dGVycy9zZXR0ZXIgcGF0aHMgaGVyZSB0byBtYWtlIHN1cmUgbm8KKyAgLy8gZmllbGQtcHJlc2VuY2UtcmVsYXRlZCBjaGFuZ2VzIGJyb2tlIHRoZXNlLgorICBDaGVja0RlZmF1bHRWYWx1ZXMobWVzc2FnZSk7CisgIEZpbGxWYWx1ZXMoJm1lc3NhZ2UpOworICBDaGVja05vbkRlZmF1bHRWYWx1ZXMobWVzc2FnZSk7CisKKyAgLy8gQ2xlYXIoKSBzaG91bGQgYmUgZXF1aXZhbGVudCB0byBnZXR0aW5nIGEgZnJlc2hseS1jb25zdHJ1Y3RlZCBtZXNzYWdlLgorICBtZXNzYWdlLkNsZWFyKCk7CisgIENoZWNrRGVmYXVsdFZhbHVlcyhtZXNzYWdlKTsKK30KKworVEVTVChOb0ZpZWxkUHJlc2VuY2VUZXN0LCBNZXNzYWdlRmllbGRQcmVzZW5jZVRlc3QpIHsKKyAgLy8gY2hlY2sgdGhhdCBwcmVzZW5jZSBzdGlsbCB3b3JrcyBwcm9wZXJseSBmb3IgbWVzc2FnZSBmaWVsZHMuCisgIHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICAvLyBHZXR0ZXIgc2hvdWxkIGZldGNoIGRlZmF1bHQgaW5zdGFuY2UsIGFuZCBub3QgY2F1c2UgdGhlIGZpZWxkIHRvIGJlY29tZQorICAvLyBwcmVzZW50LgorICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDQyKTsKKyAgRVhQRUNUX0VRKHRydWUsIG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBtZXNzYWdlLmNsZWFyX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisKKyAgLy8gTGlrZXdpc2UgZm9yIGEgbGF6eSBtZXNzYWdlIGZpZWxkLgorICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuaGFzX29wdGlvbmFsX2xhenlfbWVzc2FnZSgpKTsKKyAgLy8gR2V0dGVyIHNob3VsZCBmZXRjaCBkZWZhdWx0IGluc3RhbmNlLCBhbmQgbm90IGNhdXNlIHRoZSBmaWVsZCB0byBiZWNvbWUKKyAgLy8gcHJlc2VudC4KKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfbGF6eV9tZXNzYWdlKCkuYmIoKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5oYXNfb3B0aW9uYWxfbGF6eV9tZXNzYWdlKCkpOworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbGF6eV9tZXNzYWdlKCktPnNldF9iYig0Mik7CisgIEVYUEVDVF9FUSh0cnVlLCBtZXNzYWdlLmhhc19vcHRpb25hbF9sYXp5X21lc3NhZ2UoKSk7CisgIG1lc3NhZ2UuY2xlYXJfb3B0aW9uYWxfbGF6eV9tZXNzYWdlKCk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5oYXNfb3B0aW9uYWxfbGF6eV9tZXNzYWdlKCkpOworCisgIC8vIFRlc3QgZmllbGQgcHJlc2VuY2Ugb2YgYSBtZXNzYWdlIGZpZWxkIG9uIHRoZSBkZWZhdWx0IGluc3RhbmNlLgorICBFWFBFQ1RfRVEoZmFsc2UsCisgICAgICAgICAgICBwcm90bzJfbm9maWVsZHByZXNlbmNlX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlZmF1bHRfaW5zdGFuY2UoKQorICAgICAgICAgICAgICAgIC5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7Cit9CisKK1RFU1QoTm9GaWVsZFByZXNlbmNlVGVzdCwgUmVmbGVjdGlvbkhhc0ZpZWxkVGVzdCkgeworICAvLyBjaGVjayB0aGF0IEhhc0ZpZWxkIHJlcG9ydHMgdHJ1ZSBvbiBhbGwgc2NhbGFyIGZpZWxkcy4gQ2hlY2sgdGhhdCBpdAorICAvLyBiZWhhdmVzIHByb3Blcmx5IGZvciBtZXNzYWdlIGZpZWxkcy4KKworICBwcm90bzJfbm9maWVsZHByZXNlbmNlX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgY29uc3QgUmVmbGVjdGlvbiogciA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisKKyAgLy8gQ2hlY2sgaW5pdGlhbCBzdGF0ZTogc2NhbGFycyBub3QgcHJlc2VudCAoZHVlIHRvIG5lZWQgdG8gYmUgY29uc2lzdGVudCB3aXRoCisgIC8vIE1lcmdlRnJvbSgpKSwgbWVzc2FnZSBmaWVsZHMgbm90IHByZXNlbnQsIG9uZW9mcyBub3QgcHJlc2VudC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzYy0+ZmllbGQoaSk7CisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSBjb250aW51ZTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHItPkhhc0ZpZWxkKG1lc3NhZ2UsIGZpZWxkKSk7CisgIH0KKworICAvLyBUZXN0IGZpZWxkIHByZXNlbmNlIG9mIGEgbWVzc2FnZSBmaWVsZCBvbiB0aGUgZGVmYXVsdCBpbnN0YW5jZS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtc2dfZmllbGQgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpOworICBFWFBFQ1RfRVEoCisgICAgICBmYWxzZSwKKyAgICAgIHItPkhhc0ZpZWxkKAorICAgICAgICAgIHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgIG1zZ19maWVsZCkpOworCisgIC8vIEZpbGwgYWxsIGZpZWxkcywgZXhwZWN0IGV2ZXJ5dGhpbmcgdG8gcmVwb3J0IHRydWUgKGNoZWNrIG9uZW9mcyBiZWxvdykuCisgIEZpbGxWYWx1ZXMoJm1lc3NhZ2UpOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2MtPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjLT5maWVsZChpKTsKKyAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkgfHwgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkgIT0gRmllbGRPcHRpb25zOjpTVFJJTkcpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBFWFBFQ1RfRVEodHJ1ZSwgci0+SGFzRmllbGQobWVzc2FnZSwgZmllbGQpKTsKKyAgfQorCisgIG1lc3NhZ2UuQ2xlYXIoKTsKKworICAvLyBDaGVjayB6ZXJvL2VtcHR5LW1lYW5zLW5vdC1wcmVzZW50IHNlbWFudGljcy4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9pbnQzMiA9IGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50MzIiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kb3VibGUgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9kb3VibGUiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9zdHJpbmcgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9zdHJpbmciKTsKKworICBFWFBFQ1RfRVEoZmFsc2UsIHItPkhhc0ZpZWxkKG1lc3NhZ2UsIGZpZWxkX2ludDMyKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgci0+SGFzRmllbGQobWVzc2FnZSwgZmllbGRfZG91YmxlKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgci0+SGFzRmllbGQobWVzc2FnZSwgZmllbGRfc3RyaW5nKSk7CisKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfaW50MzIoNDIpOworICBFWFBFQ1RfRVEodHJ1ZSwgci0+SGFzRmllbGQobWVzc2FnZSwgZmllbGRfaW50MzIpKTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfaW50MzIoMCk7CisgIEVYUEVDVF9FUShmYWxzZSwgci0+SGFzRmllbGQobWVzc2FnZSwgZmllbGRfaW50MzIpKTsKKworICBtZXNzYWdlLnNldF9vcHRpb25hbF9kb3VibGUoNDIuMCk7CisgIEVYUEVDVF9FUSh0cnVlLCByLT5IYXNGaWVsZChtZXNzYWdlLCBmaWVsZF9kb3VibGUpKTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfZG91YmxlKDAuMCk7CisgIEVYUEVDVF9FUShmYWxzZSwgci0+SGFzRmllbGQobWVzc2FnZSwgZmllbGRfZG91YmxlKSk7CisKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfc3RyaW5nKCJ0ZXN0Iik7CisgIEVYUEVDVF9FUSh0cnVlLCByLT5IYXNGaWVsZChtZXNzYWdlLCBmaWVsZF9zdHJpbmcpKTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfc3RyaW5nKCIiKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCByLT5IYXNGaWVsZChtZXNzYWdlLCBmaWVsZF9zdHJpbmcpKTsKK30KKworVEVTVChOb0ZpZWxkUHJlc2VuY2VUZXN0LCBSZWZsZWN0aW9uQ2xlYXJGaWVsZFRlc3QpIHsKKyAgcHJvdG8yX25vZmllbGRwcmVzZW5jZV91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogciA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9pbnQzMiA9IGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50MzIiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kb3VibGUgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9kb3VibGUiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9zdHJpbmcgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9zdHJpbmciKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9tZXNzYWdlID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9sYXp5ID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbGF6eV9tZXNzYWdlIik7CisKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfaW50MzIoNDIpOworICByLT5DbGVhckZpZWxkKCZtZXNzYWdlLCBmaWVsZF9pbnQzMik7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX2ludDMyKCkpOworCisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX2RvdWJsZSg0Mi4wKTsKKyAgci0+Q2xlYXJGaWVsZCgmbWVzc2FnZSwgZmllbGRfZG91YmxlKTsKKyAgRVhQRUNUX0VRKDAuMCwgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUoKSk7CisKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfc3RyaW5nKCJ0ZXN0Iik7CisgIHItPkNsZWFyRmllbGQoJm1lc3NhZ2UsIGZpZWxkX3N0cmluZyk7CisgIEVYUEVDVF9FUSgiIiwgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcoKSk7CisKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxMjM0KTsKKyAgci0+Q2xlYXJGaWVsZCgmbWVzc2FnZSwgZmllbGRfbWVzc2FnZSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5iYigpKTsKKworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbGF6eV9tZXNzYWdlKCktPnNldF9iYig0Mik7CisgIHItPkNsZWFyRmllbGQoJm1lc3NhZ2UsIGZpZWxkX2xhenkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbGF6eV9tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9sYXp5X21lc3NhZ2UoKS5iYigpKTsKK30KKworVEVTVChOb0ZpZWxkUHJlc2VuY2VUZXN0LCBIYXNGaWVsZE9uZW9mc1Rlc3QpIHsKKyAgLy8gY2hlY2sgdGhhdCBIYXNGaWVsZCBiZWhhdmVzIHByb3Blcmx5IGZvciBvbmVvZnMuCisgIHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHIgPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzYyA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2Nfb25lb2ZfdWludDMyID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgib25lb2ZfdWludDMyIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY19vbmVvZl9uZXN0ZWRfbWVzc2FnZSA9CisgICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoIm9uZW9mX25lc3RlZF9tZXNzYWdlIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY19vbmVvZl9zdHJpbmcgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJvbmVvZl9zdHJpbmciKTsKKyAgR09PR0xFX0NIRUNLKGRlc2Nfb25lb2ZfdWludDMyICE9IG51bGxwdHIpOworICBHT09HTEVfQ0hFQ0soZGVzY19vbmVvZl9uZXN0ZWRfbWVzc2FnZSAhPSBudWxscHRyKTsKKyAgR09PR0xFX0NIRUNLKGRlc2Nfb25lb2Zfc3RyaW5nICE9IG51bGxwdHIpOworCisgIEVYUEVDVF9FUShmYWxzZSwgci0+SGFzRmllbGQobWVzc2FnZSwgZGVzY19vbmVvZl91aW50MzIpKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCByLT5IYXNGaWVsZChtZXNzYWdlLCBkZXNjX29uZW9mX25lc3RlZF9tZXNzYWdlKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgci0+SGFzRmllbGQobWVzc2FnZSwgZGVzY19vbmVvZl9zdHJpbmcpKTsKKworICBtZXNzYWdlLnNldF9vbmVvZl9zdHJpbmcoInRlc3QiKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCByLT5IYXNGaWVsZChtZXNzYWdlLCBkZXNjX29uZW9mX3VpbnQzMikpOworICBFWFBFQ1RfRVEoZmFsc2UsIHItPkhhc0ZpZWxkKG1lc3NhZ2UsIGRlc2Nfb25lb2ZfbmVzdGVkX21lc3NhZ2UpKTsKKyAgRVhQRUNUX0VRKHRydWUsIHItPkhhc0ZpZWxkKG1lc3NhZ2UsIGRlc2Nfb25lb2Zfc3RyaW5nKSk7CisgIG1lc3NhZ2UubXV0YWJsZV9vbmVvZl9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoNDIpOworICBFWFBFQ1RfRVEoZmFsc2UsIHItPkhhc0ZpZWxkKG1lc3NhZ2UsIGRlc2Nfb25lb2ZfdWludDMyKSk7CisgIEVYUEVDVF9FUSh0cnVlLCByLT5IYXNGaWVsZChtZXNzYWdlLCBkZXNjX29uZW9mX25lc3RlZF9tZXNzYWdlKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgci0+SGFzRmllbGQobWVzc2FnZSwgZGVzY19vbmVvZl9zdHJpbmcpKTsKKworICBtZXNzYWdlLkNsZWFyKCk7CisgIEVYUEVDVF9FUShmYWxzZSwgci0+SGFzRmllbGQobWVzc2FnZSwgZGVzY19vbmVvZl91aW50MzIpKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCByLT5IYXNGaWVsZChtZXNzYWdlLCBkZXNjX29uZW9mX25lc3RlZF9tZXNzYWdlKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgci0+SGFzRmllbGQobWVzc2FnZSwgZGVzY19vbmVvZl9zdHJpbmcpKTsKK30KKworVEVTVChOb0ZpZWxkUHJlc2VuY2VUZXN0LCBEb250U2VyaWFsaXplRGVmYXVsdFZhbHVlc1Rlc3QpIHsKKyAgLy8gY2hlY2sgdGhhdCBzZXJpYWxpemVkIGRhdGEgY29udGFpbnMgb25seSBub24temVybyBudW1lcmljIGZpZWxkcy9ub24tZW1wdHkKKyAgLy8gc3RyaW5nL2J5dGUgZmllbGRzLgorICBwcm90bzJfbm9maWVsZHByZXNlbmNlX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgc3RkOjpzdHJpbmcgb3V0cHV0OworCisgIC8vIEFsbCBkZWZhdWx0IHZhbHVlcyAtPiBubyBvdXRwdXQuCisgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJm91dHB1dCk7CisgIEVYUEVDVF9FUSgwLCBvdXRwdXQuc2l6ZSgpKTsKKworICAvLyBaZXJvIHZhbHVlcyAtPiBzdGlsbCBubyBvdXRwdXQuCisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX2ludDMyKDApOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9pbnQ2NCgwKTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfdWludDMyKDApOworICBtZXNzYWdlLnNldF9vcHRpb25hbF91aW50NjQoMCk7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3NpbnQzMigwKTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfc2ludDY0KDApOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9maXhlZDMyKDApOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9maXhlZDY0KDApOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9zZml4ZWQzMigwKTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfc2ZpeGVkNjQoMCk7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX2Zsb2F0KDApOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9kb3VibGUoMCk7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX2Jvb2woMCk7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3N0cmluZygiIik7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX2J5dGVzKCIiKTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfbmVzdGVkX2VudW0oCisgICAgICBwcm90bzJfbm9maWVsZHByZXNlbmNlX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7ICAvLyBmaXJzdCBlbnVtIGVudHJ5CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX2ZvcmVpZ25fZW51bSgKKyAgICAgIHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OkZPUkVJR05fRk9PKTsgIC8vIGZpcnN0IGVudW0gZW50cnkKKworICBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZvdXRwdXQpOworICBFWFBFQ1RfRVEoMCwgb3V0cHV0LnNpemUoKSk7CisKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfaW50MzIoMSk7CisgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJm91dHB1dCk7CisgIEVYUEVDVF9FUSgyLCBvdXRwdXQuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJceDA4XHgwMSIsIG91dHB1dCk7CisKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfaW50MzIoMCk7CisgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJm91dHB1dCk7CisgIEVYUEVDVF9FUSgwLCBvdXRwdXQuc2l6ZSgpKTsKK30KKworVEVTVChOb0ZpZWxkUHJlc2VuY2VUZXN0LCBNZXJnZUZyb21JZk5vbnplcm9UZXN0KSB7CisgIC8vIGNoZWNrIHRoYXQgTWVyZ2VGcm9tIGNvcGllcyBpZiBub256ZXJvL25vbmRlZmF1bHQgb25seS4KKyAgcHJvdG8yX25vZmllbGRwcmVzZW5jZV91bml0dGVzdDo6VGVzdEFsbFR5cGVzIHNvdXJjZTsKKyAgcHJvdG8yX25vZmllbGRwcmVzZW5jZV91bml0dGVzdDo6VGVzdEFsbFR5cGVzIGRlc3Q7CisKKyAgZGVzdC5zZXRfb3B0aW9uYWxfaW50MzIoNDIpOworICBkZXN0LnNldF9vcHRpb25hbF9zdHJpbmcoInRlc3QiKTsKKyAgc291cmNlLnNldF9vcHRpb25hbF9pbnQzMigwKTsKKyAgc291cmNlLnNldF9vcHRpb25hbF9zdHJpbmcoIiIpOworICAvLyBNZXJnZUZyb20oKSBjb3BpZXMgb25seSBpZiBwcmVzZW50IGluIHNlcmlhbGl6YXRpb24sIGkuZS4sIG5vbi16ZXJvLgorICBkZXN0Lk1lcmdlRnJvbShzb3VyY2UpOworICBFWFBFQ1RfRVEoNDIsIGRlc3Qub3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSgidGVzdCIsIGRlc3Qub3B0aW9uYWxfc3RyaW5nKCkpOworCisgIHNvdXJjZS5zZXRfb3B0aW9uYWxfaW50MzIoODQpOworICBzb3VyY2Uuc2V0X29wdGlvbmFsX3N0cmluZygidGVzdDIiKTsKKyAgZGVzdC5NZXJnZUZyb20oc291cmNlKTsKKyAgRVhQRUNUX0VRKDg0LCBkZXN0Lm9wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoInRlc3QyIiwgZGVzdC5vcHRpb25hbF9zdHJpbmcoKSk7Cit9CisKK1RFU1QoTm9GaWVsZFByZXNlbmNlVGVzdCwgSXNJbml0aWFsaXplZFRlc3QpIHsKKyAgLy8gQ2hlY2sgdGhhdCBJc0luaXRpYWxpemVkIHdvcmtzIHByb3Blcmx5LgorICBwcm90bzJfbm9maWVsZHByZXNlbmNlX3VuaXR0ZXN0OjpUZXN0UHJvdG8yUmVxdWlyZWQgbWVzc2FnZTsKKworICBFWFBFQ1RfRVEodHJ1ZSwgbWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworICBtZXNzYWdlLm11dGFibGVfcHJvdG8yKCktPnNldF9hKDEpOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKyAgbWVzc2FnZS5tdXRhYmxlX3Byb3RvMigpLT5zZXRfYigxKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisgIG1lc3NhZ2UubXV0YWJsZV9wcm90bzIoKS0+c2V0X2MoMSk7CisgIEVYUEVDVF9FUSh0cnVlLCBtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7Cit9CisKK1RFU1QoTm9GaWVsZFByZXNlbmNlVGVzdCwgTGF6eU1lc3NhZ2VGaWVsZEhhc0JpdCkgeworICAvLyBDaGVjayB0aGF0IGhhcy1iaXQgaW50ZXJhY3Rpb24gd2l0aCBsYXp5IG1lc3NhZ2Ugd29ya3MgKGhhcy1iaXQgYmVmb3JlIGFuZAorICAvLyBhZnRlciBsYXp5IGRlY29kZSkuCisgIHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBjb25zdCBSZWZsZWN0aW9uKiByID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbGF6eV9tZXNzYWdlIik7CisgIEdPT0dMRV9DSEVDSyhmaWVsZCAhPSBudWxscHRyKTsKKworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuaGFzX29wdGlvbmFsX2xhenlfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCByLT5IYXNGaWVsZChtZXNzYWdlLCBmaWVsZCkpOworCisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9sYXp5X21lc3NhZ2UoKS0+c2V0X2JiKDQyKTsKKyAgRVhQRUNUX0VRKHRydWUsIG1lc3NhZ2UuaGFzX29wdGlvbmFsX2xhenlfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKHRydWUsIHItPkhhc0ZpZWxkKG1lc3NhZ2UsIGZpZWxkKSk7CisKKyAgLy8gU2VyaWFsaXplIGFuZCBwYXJzZSB3aXRoIGEgbmV3IG1lc3NhZ2Ugb2JqZWN0IHNvIHRoYXQgbGF6eSBmaWVsZCBvbiBuZXcKKyAgLy8gb2JqZWN0IGlzIGluIHVucGFyc2VkIHN0YXRlLgorICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJm91dHB1dCk7CisgIHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMjsKKyAgbWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKG91dHB1dCk7CisKKyAgRVhQRUNUX0VRKHRydWUsIG1lc3NhZ2UyLmhhc19vcHRpb25hbF9sYXp5X21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSh0cnVlLCByLT5IYXNGaWVsZChtZXNzYWdlMiwgZmllbGQpKTsKKworICAvLyBBY2Nlc3MgZmllbGQgdG8gZm9yY2UgbGF6eSBwYXJzZS4KKyAgRVhQRUNUX0VRKDQyLCBtZXNzYWdlLm9wdGlvbmFsX2xhenlfbWVzc2FnZSgpLmJiKCkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbWVzc2FnZTIuaGFzX29wdGlvbmFsX2xhenlfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKHRydWUsIHItPkhhc0ZpZWxkKG1lc3NhZ2UyLCBmaWVsZCkpOworfQorCitURVNUKE5vRmllbGRQcmVzZW5jZVRlc3QsIE9uZW9mUHJlc2VuY2UpIHsKKyAgcHJvdG8yX25vZmllbGRwcmVzZW5jZV91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIC8vIG9uZW9mIGZpZWxkcyBzdGlsbCBoYXZlIGZpZWxkIHByZXNlbmNlIC0tIGVuc3VyZSB0aGF0IHRoaXMgZ29lcyBvbiB0aGUgd2lyZQorICAvLyBldmVuIHRob3VnaCBpdHMgdmFsdWUgaXMgdGhlIGVtcHR5IHN0cmluZy4KKyAgbWVzc2FnZS5zZXRfb25lb2Zfc3RyaW5nKCIiKTsKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCk7CisgIC8vIFRhZzogMTEzIC0tPiB0YWcgaXMgKDExMyA8PCAzKSB8IDIgKGxlbmd0aCBkZWxpbWl0ZWQpID0gOTA2CisgIC8vIHZhcmludDogMHg4YSAweDA3CisgIC8vIExlbmd0aDogMHgwMAorICBFWFBFQ1RfRVEoMywgc2VyaWFsaXplZC5zaXplKCkpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4YSksIHNlcmlhbGl6ZWQuYXQoMCkpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8Y2hhcj4oMHgwNyksIHNlcmlhbGl6ZWQuYXQoMSkpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8Y2hhcj4oMHgwMCksIHNlcmlhbGl6ZWQuYXQoMikpOworCisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpOworICBFWFBFQ1RfRVEocHJvdG8yX25vZmllbGRwcmVzZW5jZV91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjprT25lb2ZTdHJpbmcsCisgICAgICAgICAgICBtZXNzYWdlLm9uZW9mX2ZpZWxkX2Nhc2UoKSk7CisKKyAgLy8gQWxzbyB0ZXN0IGludDMyIGFuZCBlbnVtIGZpZWxkcy4KKyAgbWVzc2FnZS5DbGVhcigpOworICBtZXNzYWdlLnNldF9vbmVvZl91aW50MzIoMCk7ICAvLyB3b3VsZCBub3QgZ28gb24gd2lyZSBpZiBvcmRpbmFyeSBmaWVsZC4KKyAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCk7CisgIEVYUEVDVF9FUSgzLCBzZXJpYWxpemVkLnNpemUoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKKyAgRVhQRUNUX0VRKHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6a09uZW9mVWludDMyLAorICAgICAgICAgICAgbWVzc2FnZS5vbmVvZl9maWVsZF9jYXNlKCkpOworCisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgbWVzc2FnZS5zZXRfb25lb2ZfZW51bSgKKyAgICAgIHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PKTsgIC8vIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlLgorICBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKTsKKyAgRVhQRUNUX0VRKDMsIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpOworICBFWFBFQ1RfRVEocHJvdG8yX25vZmllbGRwcmVzZW5jZV91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjprT25lb2ZFbnVtLAorICAgICAgICAgICAgbWVzc2FnZS5vbmVvZl9maWVsZF9jYXNlKCkpOworCisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgbWVzc2FnZS5zZXRfb25lb2Zfc3RyaW5nKCJ0ZXN0Iik7CisgIG1lc3NhZ2UuY2xlYXJfb25lb2Zfc3RyaW5nKCk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkJ5dGVTaXplTG9uZygpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvcGFja2FnZV9pbmZvLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3BhY2thZ2VfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNjE2NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3BhY2thZ2VfaW5mby5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgZXhpc3RzIHNvbGVseSB0byBkb2N1bWVudCB0aGUgZ29vZ2xlOjpwcm90b2J1ZiBuYW1lc3BhY2UuCisvLyBJdCBpcyBub3QgY29tcGlsZWQgaW50byBhbnl0aGluZywgYnV0IGl0IG1heSBiZSByZWFkIGJ5IGFuIGF1dG9tYXRlZAorLy8gZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IuCisKKy8vIENvcmUgY29tcG9uZW50cyBvZiB0aGUgUHJvdG9jb2wgQnVmZmVycyBydW50aW1lIGxpYnJhcnkuCisvLworLy8gVGhlIGZpbGVzIGluIHRoaXMgcGFja2FnZSByZXByZXNlbnQgdGhlIGNvcmUgb2YgdGhlIFByb3RvY29sIEJ1ZmZlcgorLy8gc3lzdGVtLiAgQWxsIG9mIHRoZW0gYXJlIHBhcnQgb2YgdGhlIGxpYnByb3RvYnVmIGxpYnJhcnkuCisvLworLy8gQSBub3RlIG9uIHRocmVhZC1zYWZldHk6CisvLworLy8gVGhyZWFkLXNhZmV0eSBpbiB0aGUgUHJvdG9jb2wgQnVmZmVyIGxpYnJhcnkgZm9sbG93cyBhIHNpbXBsZSBydWxlOgorLy8gdW5sZXNzIGV4cGxpY2l0bHkgbm90ZWQgb3RoZXJ3aXNlLCBpdCBpcyBhbHdheXMgc2FmZSB0byB1c2UgYW4gb2JqZWN0CisvLyBmcm9tIG11bHRpcGxlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkgYXMgbG9uZyBhcyB0aGUgb2JqZWN0IGlzIGRlY2xhcmVkCisvLyBjb25zdCBpbiBhbGwgdGhyZWFkcyAob3IsIGl0IGlzIG9ubHkgdXNlZCBpbiB3YXlzIHRoYXQgd291bGQgYmUgYWxsb3dlZAorLy8gaWYgaXQgd2VyZSBkZWNsYXJlZCBjb25zdCkuICBIb3dldmVyLCBpZiBhbiBvYmplY3QgaXMgYWNjZXNzZWQgaW4gb25lCisvLyB0aHJlYWQgaW4gYSB3YXkgdGhhdCB3b3VsZCBub3QgYmUgYWxsb3dlZCBpZiBpdCB3ZXJlIGNvbnN0LCB0aGVuIGl0IGlzCisvLyBub3Qgc2FmZSB0byBhY2Nlc3MgdGhhdCBvYmplY3QgaW4gYW55IG90aGVyIHRocmVhZCBzaW11bHRhbmVvdXNseS4KKy8vCisvLyBQdXQgc2ltcGx5LCByZWFkLW9ubHkgYWNjZXNzIHRvIGFuIG9iamVjdCBjYW4gaGFwcGVuIGluIG11bHRpcGxlIHRocmVhZHMKKy8vIHNpbXVsdGFuZW91c2x5LCBidXQgd3JpdGUgYWNjZXNzIGNhbiBvbmx5IGhhcHBlbiBpbiBhIHNpbmdsZSB0aHJlYWQgYXQKKy8vIGEgdGltZS4KKy8vCisvLyBUaGUgaW1wbGVtZW50YXRpb24gZG9lcyBjb250YWluIHNvbWUgImNvbnN0IiBtZXRob2RzIHdoaWNoIGFjdHVhbGx5IG1vZGlmeQorLy8gdGhlIG9iamVjdCBiZWhpbmQgdGhlIHNjZW5lcyAtLSBlLmcuLCB0byBjYWNoZSByZXN1bHRzIC0tIGJ1dCBpbiB0aGVzZSBjYXNlcworLy8gbXV0ZXggbG9ja2luZyBpcyB1c2VkIHRvIG1ha2UgdGhlIGFjY2VzcyB0aHJlYWQtc2FmZS4KK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKy8vIFRPRE8oZ2VyYmVucykgcmVtb3ZlIHRoaXMgY29tbWVudCwgd2UgbmVlZCBpdCB0byBwcmV2ZW50IGNsYW5nLWZvcm1hdAorLy8gZnJvbSBjb21iaW5pbmcgdGhlIGJyYWNrZXRzLiBXaGljaCB3b3VsZCBtZXNzIHdpdGggZXh0cmFjdCBzY3JpcHQKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9wYXJzZV9jb250ZXh0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9wYXJzZV9jb250ZXh0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODUyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3BhcnNlX2NvbnRleHQuY2MKQEAgLTAsMCArMSw1NDggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BhcnNlX2NvbnRleHQuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9lbmRpYW4uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworbmFtZXNwYWNlIHsKKworLy8gT25seSBjYWxsIGlmIGF0IHN0YXJ0IG9mIHRhZy4KK2Jvb2wgUGFyc2VFbmRzSW5TbG9wUmVnaW9uKGNvbnN0IGNoYXIqIGJlZ2luLCBpbnQgb3ZlcnJ1biwgaW50IGRlcHRoKSB7CisgIGNvbnN0ZXhwciBpbnQga1Nsb3BCeXRlcyA9IEVwc0NvcHlJbnB1dFN0cmVhbTo6a1Nsb3BCeXRlczsKKyAgR09PR0xFX0RDSEVDS19HRShvdmVycnVuLCAwKTsKKyAgR09PR0xFX0RDSEVDS19MRShvdmVycnVuLCBrU2xvcEJ5dGVzKTsKKyAgYXV0byBwdHIgPSBiZWdpbiArIG92ZXJydW47CisgIGF1dG8gZW5kID0gYmVnaW4gKyBrU2xvcEJ5dGVzOworICB3aGlsZSAocHRyIDwgZW5kKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IFJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBpZiAocHRyID09IG51bGxwdHIgfHwgcHRyID4gZW5kKSByZXR1cm4gZmFsc2U7CisgICAgLy8gZW5kaW5nIG9uIDAgdGFnIGlzIGFsbG93ZWQgYW5kIGlzIHRoZSBtYWpvciByZWFzb24gZm9yIHRoZSBuZWNlc3NpdHkgb2YKKyAgICAvLyB0aGlzIGZ1bmN0aW9uLgorICAgIGlmICh0YWcgPT0gMCkgcmV0dXJuIHRydWU7CisgICAgc3dpdGNoICh0YWcgJiA3KSB7CisgICAgICBjYXNlIDA6IHsgIC8vIFZhcmludAorICAgICAgICB1aW50NjRfdCB2YWw7CisgICAgICAgIHB0ciA9IFZhcmludFBhcnNlKHB0ciwgJnZhbCk7CisgICAgICAgIGlmIChwdHIgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgMTogeyAgLy8gZml4ZWQ2NAorICAgICAgICBwdHIgKz0gODsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDI6IHsgIC8vIGxlbiBkZWxpbQorICAgICAgICBpbnQzMl90IHNpemUgPSBSZWFkU2l6ZSgmcHRyKTsKKyAgICAgICAgaWYgKHB0ciA9PSBudWxscHRyIHx8IHNpemUgPiBlbmQgLSBwdHIpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcHRyICs9IHNpemU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAzOiB7ICAvLyBzdGFydCBncm91cAorICAgICAgICBkZXB0aCsrOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgNDogeyAgICAgICAgICAgICAgICAgICAgLy8gZW5kIGdyb3VwCisgICAgICAgIGlmICgtLWRlcHRoIDwgMCkgcmV0dXJuIHRydWU7ICAvLyBXZSBleGl0IGVhcmx5CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA1OiB7ICAvLyBmaXhlZDMyCisgICAgICAgIHB0ciArPSA0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIFVua25vd24gd2lyZWZvcm1hdAorICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitjb25zdCBjaGFyKiBFcHNDb3B5SW5wdXRTdHJlYW06Ok5leHRCdWZmZXIoaW50IG92ZXJydW4sIGludCBkZXB0aCkgeworICBpZiAobmV4dF9jaHVua18gPT0gbnVsbHB0cikgcmV0dXJuIG51bGxwdHI7ICAvLyBXZSd2ZSByZWFjaGVkIGVuZCBvZiBzdHJlYW0uCisgIGlmIChuZXh0X2NodW5rXyAhPSBidWZmZXJfKSB7CisgICAgR09PR0xFX0RDSEVDSyhzaXplXyA+IGtTbG9wQnl0ZXMpOworICAgIC8vIFRoZSBjaHVuayBpcyBsYXJnZSBlbm91Z2ggdG8gYmUgdXNlZCBkaXJlY3RseQorICAgIGJ1ZmZlcl9lbmRfID0gbmV4dF9jaHVua18gKyBzaXplXyAtIGtTbG9wQnl0ZXM7CisgICAgYXV0byByZXMgPSBuZXh0X2NodW5rXzsKKyAgICBuZXh0X2NodW5rXyA9IGJ1ZmZlcl87CisgICAgaWYgKGFsaWFzaW5nXyA9PSBrT25QYXRjaCkgYWxpYXNpbmdfID0ga05vRGVsdGE7CisgICAgcmV0dXJuIHJlczsKKyAgfQorICAvLyBNb3ZlIHRoZSBzbG9wIGJ5dGVzIG9mIHByZXZpb3VzIGJ1ZmZlciB0byBzdGFydCBvZiB0aGUgcGF0Y2ggYnVmZmVyLgorICAvLyBOb3RlIHdlIG11c3QgdXNlIG1lbW1vdmUgYmVjYXVzZSB0aGUgcHJldmlvdXMgYnVmZmVyIGNvdWxkIGJlIHBhcnQgb2YKKyAgLy8gYnVmZmVyXy4KKyAgc3RkOjptZW1tb3ZlKGJ1ZmZlcl8sIGJ1ZmZlcl9lbmRfLCBrU2xvcEJ5dGVzKTsKKyAgaWYgKG92ZXJhbGxfbGltaXRfID4gMCAmJgorICAgICAgKGRlcHRoIDwgMCB8fCAhUGFyc2VFbmRzSW5TbG9wUmVnaW9uKGJ1ZmZlcl8sIG92ZXJydW4sIGRlcHRoKSkpIHsKKyAgICBjb25zdCB2b2lkKiBkYXRhOworICAgIC8vIFplcm9Db3B5SW5wdXRTdHJlYW0gaW5kaWNhdGVzIE5leHQgbWF5IHJldHVybiAwIHNpemUgYnVmZmVycy4gSGVuY2UKKyAgICAvLyB3ZSBsb29wLgorICAgIHdoaWxlIChTdHJlYW1OZXh0KCZkYXRhKSkgeworICAgICAgaWYgKHNpemVfID4ga1Nsb3BCeXRlcykgeworICAgICAgICAvLyBXZSBnb3QgYSBsYXJnZSBjaHVuaworICAgICAgICBzdGQ6Om1lbWNweShidWZmZXJfICsga1Nsb3BCeXRlcywgZGF0YSwga1Nsb3BCeXRlcyk7CisgICAgICAgIG5leHRfY2h1bmtfID0gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEpOworICAgICAgICBidWZmZXJfZW5kXyA9IGJ1ZmZlcl8gKyBrU2xvcEJ5dGVzOworICAgICAgICBpZiAoYWxpYXNpbmdfID49IGtOb0RlbHRhKSBhbGlhc2luZ18gPSBrT25QYXRjaDsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcl87CisgICAgICB9IGVsc2UgaWYgKHNpemVfID4gMCkgeworICAgICAgICBzdGQ6Om1lbWNweShidWZmZXJfICsga1Nsb3BCeXRlcywgZGF0YSwgc2l6ZV8pOworICAgICAgICBuZXh0X2NodW5rXyA9IGJ1ZmZlcl87CisgICAgICAgIGJ1ZmZlcl9lbmRfID0gYnVmZmVyXyArIHNpemVfOworICAgICAgICBpZiAoYWxpYXNpbmdfID49IGtOb0RlbHRhKSBhbGlhc2luZ18gPSBrT25QYXRjaDsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcl87CisgICAgICB9CisgICAgICBHT09HTEVfRENIRUNLKHNpemVfID09IDApIDw8IHNpemVfOworICAgIH0KKyAgICBvdmVyYWxsX2xpbWl0XyA9IDA7ICAvLyBOZXh0IGZhaWxlZCwgbm8gbW9yZSBuZWVkcyBmb3IgbmV4dAorICB9CisgIC8vIEVuZCBvZiBzdHJlYW0gb3IgYXJyYXkKKyAgaWYgKGFsaWFzaW5nXyA9PSBrTm9EZWx0YSkgeworICAgIC8vIElmIHRoZXJlIGlzIG5vIG1vcmUgYmxvY2sgYW5kIGFsaWFzaW5nIGlzIHRydWUsIHRoZSBwcmV2aW91cyBibG9jaworICAgIC8vIGlzIHN0aWxsIHZhbGlkIGFuZCB3ZSBjYW4gYWxpYXMuIFdlIGhhdmUgdXNlcnMgcmVseWluZyBvbiBzdHJpbmdfdmlldydzCisgICAgLy8gb2J0YWluZWQgZnJvbSBwcm90b3MgdG8gb3V0bGl2ZSB0aGUgcHJvdG8sIHdoZW4gdGhlIHBhcnNlIHdhcyBmcm9tIGFuCisgICAgLy8gYXJyYXkuIFRoaXMgZ3VhcmFudGVlcyBzdHJpbmdfdmlldydzIGFyZSBhbHdheXMgYWxpYXNlZCBpZiBwYXJzZWQgZnJvbQorICAgIC8vIGFuIGFycmF5LgorICAgIGFsaWFzaW5nXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjp1aW50cHRyX3Q+KGJ1ZmZlcl9lbmRfKSAtCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnVpbnRwdHJfdD4oYnVmZmVyXyk7CisgIH0KKyAgbmV4dF9jaHVua18gPSBudWxscHRyOworICBidWZmZXJfZW5kXyA9IGJ1ZmZlcl8gKyBrU2xvcEJ5dGVzOworICBzaXplXyA9IDA7CisgIHJldHVybiBidWZmZXJfOworfQorCitjb25zdCBjaGFyKiBFcHNDb3B5SW5wdXRTdHJlYW06Ok5leHQoKSB7CisgIEdPT0dMRV9EQ0hFQ0sobGltaXRfID4ga1Nsb3BCeXRlcyk7CisgIGF1dG8gcCA9IE5leHRCdWZmZXIoMCAvKiBpbW1hdGVyaWFsICovLCAtMSk7CisgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICBsaW1pdF9lbmRfID0gYnVmZmVyX2VuZF87CisgICAgLy8gRGlzdGluZ3Vpc2ggZW5kaW5nIG9uIGEgcHVzaGVkIGxpbWl0IG9yIGVuZGluZyBvbiBlbmQtb2Ytc3RyZWFtLgorICAgIFNldEVuZE9mU3RyZWFtKCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgbGltaXRfIC09IGJ1ZmZlcl9lbmRfIC0gcDsgIC8vIEFkanVzdCBsaW1pdF8gcmVsYXRpdmUgdG8gbmV3IGFuY2hvcgorICBsaW1pdF9lbmRfID0gYnVmZmVyX2VuZF8gKyBzdGQ6Om1pbigwLCBsaW1pdF8pOworICByZXR1cm4gcDsKK30KKworc3RkOjpwYWlyPGNvbnN0IGNoYXIqLCBib29sPiBFcHNDb3B5SW5wdXRTdHJlYW06OkRvbmVGYWxsYmFjayhpbnQgb3ZlcnJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoKSB7CisgIC8vIERpZCB3ZSBleGNlZWRlZCB0aGUgbGltaXQgKHBhcnNlIGVycm9yKS4KKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0Uob3ZlcnJ1biA+IGxpbWl0XykpIHJldHVybiB7bnVsbHB0ciwgdHJ1ZX07CisgIEdPT0dMRV9EQ0hFQ0sob3ZlcnJ1biAhPSBsaW1pdF8pOyAgLy8gR3VhcmFudGVlZCBieSBjYWxsZXIuCisgIEdPT0dMRV9EQ0hFQ0sob3ZlcnJ1biA8IGxpbWl0Xyk7ICAgLy8gRm9sbG93cyBmcm9tIGFib3ZlCisgIC8vIFRPRE8oZ2VyYmVucykgSW5zdGVhZCBvZiB0aGlzIGRjaGVjayB3ZSBjb3VsZCBqdXN0IGFzc2lnbiwgYW5kIHJlbW92ZQorICAvLyB1cGRhdGluZyB0aGUgbGltaXRfZW5kIGZyb20gUG9wTGltaXQsIGllLgorICAvLyBsaW1pdF9lbmRfID0gYnVmZmVyX2VuZF8gKyAoc3RkOjptaW4pKDAsIGxpbWl0Xyk7CisgIC8vIGlmIChwdHIgPCBsaW1pdF9lbmRfKSByZXR1cm4ge3B0ciwgZmFsc2V9OworICBHT09HTEVfRENIRUNLKGxpbWl0X2VuZF8gPT0gYnVmZmVyX2VuZF8gKyAoc3RkOjptaW4pKDAsIGxpbWl0XykpOworICAvLyBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlIGZvbGxvd2luZyBhc3NlcnRpb24gaG9sZHMuCisgIEdPT0dMRV9EQ0hFQ0tfR1QobGltaXRfLCAwKTsKKyAgR09PR0xFX0RDSEVDSyhsaW1pdF9lbmRfID09IGJ1ZmZlcl9lbmRfKTsgIC8vIGJlY2F1c2UgbGltaXRfID4gMAorICBjb25zdCBjaGFyKiBwOworICBkbyB7CisgICAgLy8gV2UgYXJlIHBhc3QgdGhlIGVuZCBvZiBidWZmZXJfZW5kXywgaW4gdGhlIHNsb3AgcmVnaW9uLgorICAgIEdPT0dMRV9EQ0hFQ0tfR0Uob3ZlcnJ1biwgMCk7CisgICAgcCA9IE5leHRCdWZmZXIob3ZlcnJ1biwgZGVwdGgpOworICAgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICAgIC8vIFdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KKyAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKG92ZXJydW4gIT0gMCkpIHJldHVybiB7bnVsbHB0ciwgdHJ1ZX07CisgICAgICBHT09HTEVfRENIRUNLX0dUKGxpbWl0XywgMCk7CisgICAgICBsaW1pdF9lbmRfID0gYnVmZmVyX2VuZF87CisgICAgICAvLyBEaXN0aW5ndWlzaCBlbmRpbmcgb24gYSBwdXNoZWQgbGltaXQgb3IgZW5kaW5nIG9uIGVuZC1vZi1zdHJlYW0uCisgICAgICBTZXRFbmRPZlN0cmVhbSgpOworICAgICAgcmV0dXJuIHtidWZmZXJfZW5kXywgdHJ1ZX07CisgICAgfQorICAgIGxpbWl0XyAtPSBidWZmZXJfZW5kXyAtIHA7ICAvLyBBZGp1c3QgbGltaXRfIHJlbGF0aXZlIHRvIG5ldyBhbmNob3IKKyAgICBwICs9IG92ZXJydW47CisgICAgb3ZlcnJ1biA9IHAgLSBidWZmZXJfZW5kXzsKKyAgfSB3aGlsZSAob3ZlcnJ1biA+PSAwKTsKKyAgbGltaXRfZW5kXyA9IGJ1ZmZlcl9lbmRfICsgc3RkOjptaW4oMCwgbGltaXRfKTsKKyAgcmV0dXJuIHtwLCBmYWxzZX07Cit9CisKK2NvbnN0IGNoYXIqIEVwc0NvcHlJbnB1dFN0cmVhbTo6U2tpcEZhbGxiYWNrKGNvbnN0IGNoYXIqIHB0ciwgaW50IHNpemUpIHsKKyAgcmV0dXJuIEFwcGVuZFNpemUocHRyLCBzaXplLCBbXShjb25zdCBjaGFyKiAvKnAqLywgaW50IC8qcyovKSB7fSk7Cit9CisKK2NvbnN0IGNoYXIqIEVwc0NvcHlJbnB1dFN0cmVhbTo6UmVhZFN0cmluZ0ZhbGxiYWNrKGNvbnN0IGNoYXIqIHB0ciwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogc3RyKSB7CisgIHN0ci0+Y2xlYXIoKTsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzaXplIDw9IGJ1ZmZlcl9lbmRfIC0gcHRyICsgbGltaXRfKSkgeworICAgIC8vIFJlc2VydmUgdGhlIHN0cmluZyB1cCB0byBhIHN0YXRpYyBzYWZlIHNpemUuIElmIHN0cmluZ3MgYXJlIGJpZ2dlciB0aGFuCisgICAgLy8gdGhpcyB3ZSBwcm9jZWVkIGJ5IGdyb3dpbmcgdGhlIHN0cmluZyBhcyBuZWVkZWQuIFRoaXMgcHJvdGVjdHMgYWdhaW5zdAorICAgIC8vIG1hbGljaW91cyBwYXlsb2FkcyBtYWtpbmcgcHJvdG9idWYgaG9sZCBvbiB0byBhIGxvdCBvZiBtZW1vcnkuCisgICAgc3RyLT5yZXNlcnZlKHN0ci0+c2l6ZSgpICsgc3RkOjptaW48aW50PihzaXplLCBrU2FmZVN0cmluZ1NpemUpKTsKKyAgfQorICByZXR1cm4gQXBwZW5kU2l6ZShwdHIsIHNpemUsCisgICAgICAgICAgICAgICAgICAgIFtzdHJdKGNvbnN0IGNoYXIqIHAsIGludCBzKSB7IHN0ci0+YXBwZW5kKHAsIHMpOyB9KTsKK30KKworY29uc3QgY2hhciogRXBzQ29weUlucHV0U3RyZWFtOjpBcHBlbmRTdHJpbmdGYWxsYmFjayhjb25zdCBjaGFyKiBwdHIsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogc3RyKSB7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc2l6ZSA8PSBidWZmZXJfZW5kXyAtIHB0ciArIGxpbWl0XykpIHsKKyAgICAvLyBSZXNlcnZlIHRoZSBzdHJpbmcgdXAgdG8gYSBzdGF0aWMgc2FmZSBzaXplLiBJZiBzdHJpbmdzIGFyZSBiaWdnZXIgdGhhbgorICAgIC8vIHRoaXMgd2UgcHJvY2VlZCBieSBncm93aW5nIHRoZSBzdHJpbmcgYXMgbmVlZGVkLiBUaGlzIHByb3RlY3RzIGFnYWluc3QKKyAgICAvLyBtYWxpY2lvdXMgcGF5bG9hZHMgbWFraW5nIHByb3RvYnVmIGhvbGQgb24gdG8gYSBsb3Qgb2YgbWVtb3J5LgorICAgIHN0ci0+cmVzZXJ2ZShzdHItPnNpemUoKSArIHN0ZDo6bWluPGludD4oc2l6ZSwga1NhZmVTdHJpbmdTaXplKSk7CisgIH0KKyAgcmV0dXJuIEFwcGVuZFNpemUocHRyLCBzaXplLAorICAgICAgICAgICAgICAgICAgICBbc3RyXShjb25zdCBjaGFyKiBwLCBpbnQgcykgeyBzdHItPmFwcGVuZChwLCBzKTsgfSk7Cit9CisKKworY29uc3QgY2hhciogRXBzQ29weUlucHV0U3RyZWFtOjpJbml0RnJvbShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogemNpcykgeworICB6Y2lzXyA9IHpjaXM7CisgIGNvbnN0IHZvaWQqIGRhdGE7CisgIGludCBzaXplOworICBsaW1pdF8gPSBJTlRfTUFYOworICBpZiAoemNpcy0+TmV4dCgmZGF0YSwgJnNpemUpKSB7CisgICAgb3ZlcmFsbF9saW1pdF8gLT0gc2l6ZTsKKyAgICBpZiAoc2l6ZSA+IGtTbG9wQnl0ZXMpIHsKKyAgICAgIGF1dG8gcHRyID0gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEpOworICAgICAgbGltaXRfIC09IHNpemUgLSBrU2xvcEJ5dGVzOworICAgICAgbGltaXRfZW5kXyA9IGJ1ZmZlcl9lbmRfID0gcHRyICsgc2l6ZSAtIGtTbG9wQnl0ZXM7CisgICAgICBuZXh0X2NodW5rXyA9IGJ1ZmZlcl87CisgICAgICBpZiAoYWxpYXNpbmdfID09IGtPblBhdGNoKSBhbGlhc2luZ18gPSBrTm9EZWx0YTsKKyAgICAgIHJldHVybiBwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbWl0X2VuZF8gPSBidWZmZXJfZW5kXyA9IGJ1ZmZlcl8gKyBrU2xvcEJ5dGVzOworICAgICAgbmV4dF9jaHVua18gPSBidWZmZXJfOworICAgICAgYXV0byBwdHIgPSBidWZmZXJfICsgMiAqIGtTbG9wQnl0ZXMgLSBzaXplOworICAgICAgc3RkOjptZW1jcHkocHRyLCBkYXRhLCBzaXplKTsKKyAgICAgIHJldHVybiBwdHI7CisgICAgfQorICB9CisgIG92ZXJhbGxfbGltaXRfID0gMDsKKyAgbmV4dF9jaHVua18gPSBudWxscHRyOworICBzaXplXyA9IDA7CisgIGxpbWl0X2VuZF8gPSBidWZmZXJfZW5kXyA9IGJ1ZmZlcl87CisgIHJldHVybiBidWZmZXJfOworfQorCitjb25zdCBjaGFyKiBQYXJzZUNvbnRleHQ6OlJlYWRTaXplQW5kUHVzaExpbWl0QW5kRGVwdGgoY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogb2xkX2xpbWl0KSB7CisgIGludCBzaXplID0gUmVhZFNpemUoJnB0cik7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCFwdHIpKSB7CisgICAgKm9sZF9saW1pdCA9IDA7ICAvLyBNYWtlIHN1cmUgdGhpcyBpc24ndCB1bmluaXRpYWxpemVkIGV2ZW4gb24gZXJyb3IgcmV0dXJuCisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgKm9sZF9saW1pdCA9IFB1c2hMaW1pdChwdHIsIHNpemUpOworICBpZiAoLS1kZXB0aF8gPCAwKSByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHB0cjsKK30KKworY29uc3QgY2hhciogUGFyc2VDb250ZXh0OjpQYXJzZU1lc3NhZ2UoTWVzc2FnZUxpdGUqIG1zZywgY29uc3QgY2hhciogcHRyKSB7CisgIGludCBvbGQ7CisgIHB0ciA9IFJlYWRTaXplQW5kUHVzaExpbWl0QW5kRGVwdGgocHRyLCAmb2xkKTsKKyAgcHRyID0gcHRyID8gbXNnLT5fSW50ZXJuYWxQYXJzZShwdHIsIHRoaXMpIDogbnVsbHB0cjsKKyAgZGVwdGhfKys7CisgIGlmICghUG9wTGltaXQob2xkKSkgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBwdHI7Cit9CisKK2lubGluZSB2b2lkIFdyaXRlVmFyaW50KHVpbnQ2NF90IHZhbCwgc3RkOjpzdHJpbmcqIHMpIHsKKyAgd2hpbGUgKHZhbCA+PSAxMjgpIHsKKyAgICB1aW50OF90IGMgPSB2YWwgfCAweDgwOworICAgIHMtPnB1c2hfYmFjayhjKTsKKyAgICB2YWwgPj49IDc7CisgIH0KKyAgcy0+cHVzaF9iYWNrKHZhbCk7Cit9CisKK3ZvaWQgV3JpdGVWYXJpbnQodWludDMyX3QgbnVtLCB1aW50NjRfdCB2YWwsIHN0ZDo6c3RyaW5nKiBzKSB7CisgIFdyaXRlVmFyaW50KG51bSA8PCAzLCBzKTsKKyAgV3JpdGVWYXJpbnQodmFsLCBzKTsKK30KKwordm9pZCBXcml0ZUxlbmd0aERlbGltaXRlZCh1aW50MzJfdCBudW0sIFN0cmluZ1BpZWNlIHZhbCwgc3RkOjpzdHJpbmcqIHMpIHsKKyAgV3JpdGVWYXJpbnQoKG51bSA8PCAzKSArIDIsIHMpOworICBXcml0ZVZhcmludCh2YWwuc2l6ZSgpLCBzKTsKKyAgcy0+YXBwZW5kKHZhbC5kYXRhKCksIHZhbC5zaXplKCkpOworfQorCitzdGQ6OnBhaXI8Y29uc3QgY2hhciosIHVpbnQzMl90PiBWYXJpbnRQYXJzZVNsb3czMihjb25zdCBjaGFyKiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVzKSB7CisgIGZvciAoc3RkOjp1aW50MzJfdCBpID0gMjsgaSA8IDU7IGkrKykgeworICAgIHVpbnQzMl90IGJ5dGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihwW2ldKTsKKyAgICByZXMgKz0gKGJ5dGUgLSAxKSA8PCAoNyAqIGkpOworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoYnl0ZSA8IDEyOCkpIHsKKyAgICAgIHJldHVybiB7cCArIGkgKyAxLCByZXN9OworICAgIH0KKyAgfQorICAvLyBBY2NlcHQgPjUgYnl0ZXMKKyAgZm9yIChzdGQ6OnVpbnQzMl90IGkgPSA1OyBpIDwgMTA7IGkrKykgeworICAgIHVpbnQzMl90IGJ5dGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihwW2ldKTsKKyAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKGJ5dGUgPCAxMjgpKSB7CisgICAgICByZXR1cm4ge3AgKyBpICsgMSwgcmVzfTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHtudWxscHRyLCAwfTsKK30KKworc3RkOjpwYWlyPGNvbnN0IGNoYXIqLCB1aW50NjRfdD4gVmFyaW50UGFyc2VTbG93NjQoY29uc3QgY2hhciogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlczMyKSB7CisgIHVpbnQ2NF90IHJlcyA9IHJlczMyOworICBmb3IgKHN0ZDo6dWludDMyX3QgaSA9IDI7IGkgPCAxMDsgaSsrKSB7CisgICAgdWludDY0X3QgYnl0ZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHBbaV0pOworICAgIHJlcyArPSAoYnl0ZSAtIDEpIDw8ICg3ICogaSk7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShieXRlIDwgMTI4KSkgeworICAgICAgcmV0dXJuIHtwICsgaSArIDEsIHJlc307CisgICAgfQorICB9CisgIHJldHVybiB7bnVsbHB0ciwgMH07Cit9CisKK3N0ZDo6cGFpcjxjb25zdCBjaGFyKiwgdWludDMyX3Q+IFJlYWRUYWdGYWxsYmFjayhjb25zdCBjaGFyKiBwLCB1aW50MzJfdCByZXMpIHsKKyAgZm9yIChzdGQ6OnVpbnQzMl90IGkgPSAyOyBpIDwgNTsgaSsrKSB7CisgICAgdWludDMyX3QgYnl0ZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHBbaV0pOworICAgIHJlcyArPSAoYnl0ZSAtIDEpIDw8ICg3ICogaSk7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShieXRlIDwgMTI4KSkgeworICAgICAgcmV0dXJuIHtwICsgaSArIDEsIHJlc307CisgICAgfQorICB9CisgIHJldHVybiB7bnVsbHB0ciwgMH07Cit9CisKK3N0ZDo6cGFpcjxjb25zdCBjaGFyKiwgaW50MzJfdD4gUmVhZFNpemVGYWxsYmFjayhjb25zdCBjaGFyKiBwLCB1aW50MzJfdCByZXMpIHsKKyAgZm9yIChzdGQ6OnVpbnQzMl90IGkgPSAxOyBpIDwgNDsgaSsrKSB7CisgICAgdWludDMyX3QgYnl0ZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHBbaV0pOworICAgIHJlcyArPSAoYnl0ZSAtIDEpIDw8ICg3ICogaSk7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShieXRlIDwgMTI4KSkgeworICAgICAgcmV0dXJuIHtwICsgaSArIDEsIHJlc307CisgICAgfQorICB9CisgIHN0ZDo6dWludDMyX3QgYnl0ZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHBbNF0pOworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShieXRlID49IDgpKSByZXR1cm4ge251bGxwdHIsIDB9OyAgLy8gc2l6ZSA+PSAyZ2IKKyAgcmVzICs9IChieXRlIC0gMSkgPDwgMjg7CisgIC8vIFByb3RlY3QgYWdhaW5zdCBzaWduIGludGVnZXIgb3ZlcmZsb3cgaW4gUHVzaExpbWl0LiBMaW1pdHMgYXJlIHJlbGF0aXZlCisgIC8vIHRvIGJ1ZmZlciBlbmRzIGFuZCBwdHIgY291bGQgcG90ZW50aWFsIGJlIGtTbG9wQnl0ZXMgYmV5b25kIGEgYnVmZmVyIGVuZC4KKyAgLy8gVG8gcHJvdGVjdCBhZ2FpbnN0IG92ZXJmbG93IHdlIHJlamVjdCBsaW1pdHMgYWJzdXJkbHkgY2xvc2UgdG8gSU5UX01BWC4KKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UocmVzID4gSU5UX01BWCAtIFBhcnNlQ29udGV4dDo6a1Nsb3BCeXRlcykpIHsKKyAgICByZXR1cm4ge251bGxwdHIsIDB9OworICB9CisgIHJldHVybiB7cCArIDUsIHJlc307Cit9CisKK2NvbnN0IGNoYXIqIFN0cmluZ1BhcnNlcihjb25zdCBjaGFyKiBiZWdpbiwgY29uc3QgY2hhciogZW5kLCB2b2lkKiBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VDb250ZXh0KikgeworICBhdXRvIHN0ciA9IHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nKj4ob2JqZWN0KTsKKyAgc3RyLT5hcHBlbmQoYmVnaW4sIGVuZCAtIGJlZ2luKTsKKyAgcmV0dXJuIGVuZDsKK30KKworLy8gRGVmaW5lZCBpbiB3aXJlX2Zvcm1hdF9saXRlLmNjCit2b2lkIFByaW50VVRGOEVycm9yTG9nKFN0cmluZ1BpZWNlIG1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgZmllbGRfbmFtZSwgY29uc3QgY2hhciogb3BlcmF0aW9uX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbWl0X3N0YWNrdHJhY2UpOworCitib29sIFZlcmlmeVVURjgoU3RyaW5nUGllY2Ugc3RyLCBjb25zdCBjaGFyKiBmaWVsZF9uYW1lKSB7CisgIGlmICghSXNTdHJ1Y3R1cmFsbHlWYWxpZFVURjgoc3RyKSkgeworICAgIFByaW50VVRGOEVycm9yTG9nKCIiLCBmaWVsZF9uYW1lLCAicGFyc2luZyIsIGZhbHNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IGNoYXIqIElubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdGQ6OnN0cmluZyogcywgY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlQ29udGV4dCogY3R4KSB7CisgIGludCBzaXplID0gUmVhZFNpemUoJnB0cik7CisgIGlmICghcHRyKSByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIGN0eC0+UmVhZFN0cmluZyhwdHIsIHNpemUsIHMpOworfQorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIHNpZ24+Citjb25zdCBjaGFyKiBWYXJpbnRQYXJzZXIodm9pZCogb2JqZWN0LCBjb25zdCBjaGFyKiBwdHIsIFBhcnNlQ29udGV4dCogY3R4KSB7CisgIHJldHVybiBjdHgtPlJlYWRQYWNrZWRWYXJpbnQocHRyLCBbb2JqZWN0XSh1aW50NjRfdCB2YXJpbnQpIHsKKyAgICBUIHZhbDsKKyAgICBpZiAoc2lnbikgeworICAgICAgaWYgKHNpemVvZihUKSA9PSA4KSB7CisgICAgICAgIHZhbCA9IFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdEZWNvZGU2NCh2YXJpbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsID0gV2lyZUZvcm1hdExpdGU6OlppZ1phZ0RlY29kZTMyKHZhcmludCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHZhbCA9IHZhcmludDsKKyAgICB9CisgICAgc3RhdGljX2Nhc3Q8UmVwZWF0ZWRGaWVsZDxUPio+KG9iamVjdCktPkFkZCh2YWwpOworICB9KTsKK30KKworY29uc3QgY2hhciogUGFja2VkSW50MzJQYXJzZXIodm9pZCogb2JqZWN0LCBjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUNvbnRleHQqIGN0eCkgeworICByZXR1cm4gVmFyaW50UGFyc2VyPGludDMyX3QsIGZhbHNlPihvYmplY3QsIHB0ciwgY3R4KTsKK30KK2NvbnN0IGNoYXIqIFBhY2tlZFVJbnQzMlBhcnNlcih2b2lkKiBvYmplY3QsIGNvbnN0IGNoYXIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUNvbnRleHQqIGN0eCkgeworICByZXR1cm4gVmFyaW50UGFyc2VyPHVpbnQzMl90LCBmYWxzZT4ob2JqZWN0LCBwdHIsIGN0eCk7Cit9Citjb25zdCBjaGFyKiBQYWNrZWRJbnQ2NFBhcnNlcih2b2lkKiBvYmplY3QsIGNvbnN0IGNoYXIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlQ29udGV4dCogY3R4KSB7CisgIHJldHVybiBWYXJpbnRQYXJzZXI8aW50NjRfdCwgZmFsc2U+KG9iamVjdCwgcHRyLCBjdHgpOworfQorY29uc3QgY2hhciogUGFja2VkVUludDY0UGFyc2VyKHZvaWQqIG9iamVjdCwgY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlQ29udGV4dCogY3R4KSB7CisgIHJldHVybiBWYXJpbnRQYXJzZXI8dWludDY0X3QsIGZhbHNlPihvYmplY3QsIHB0ciwgY3R4KTsKK30KK2NvbnN0IGNoYXIqIFBhY2tlZFNJbnQzMlBhcnNlcih2b2lkKiBvYmplY3QsIGNvbnN0IGNoYXIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUNvbnRleHQqIGN0eCkgeworICByZXR1cm4gVmFyaW50UGFyc2VyPGludDMyX3QsIHRydWU+KG9iamVjdCwgcHRyLCBjdHgpOworfQorY29uc3QgY2hhciogUGFja2VkU0ludDY0UGFyc2VyKHZvaWQqIG9iamVjdCwgY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlQ29udGV4dCogY3R4KSB7CisgIHJldHVybiBWYXJpbnRQYXJzZXI8aW50NjRfdCwgdHJ1ZT4ob2JqZWN0LCBwdHIsIGN0eCk7Cit9CisKK2NvbnN0IGNoYXIqIFBhY2tlZEVudW1QYXJzZXIodm9pZCogb2JqZWN0LCBjb25zdCBjaGFyKiBwdHIsIFBhcnNlQ29udGV4dCogY3R4KSB7CisgIHJldHVybiBWYXJpbnRQYXJzZXI8aW50LCBmYWxzZT4ob2JqZWN0LCBwdHIsIGN0eCk7Cit9CisKK2NvbnN0IGNoYXIqIFBhY2tlZEJvb2xQYXJzZXIodm9pZCogb2JqZWN0LCBjb25zdCBjaGFyKiBwdHIsIFBhcnNlQ29udGV4dCogY3R4KSB7CisgIHJldHVybiBWYXJpbnRQYXJzZXI8Ym9vbCwgZmFsc2U+KG9iamVjdCwgcHRyLCBjdHgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NvbnN0IGNoYXIqIEZpeGVkUGFyc2VyKHZvaWQqIG9iamVjdCwgY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCkgeworICBpbnQgc2l6ZSA9IFJlYWRTaXplKCZwdHIpOworICByZXR1cm4gY3R4LT5SZWFkUGFja2VkRml4ZWQocHRyLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVwZWF0ZWRGaWVsZDxUPio+KG9iamVjdCkpOworfQorCitjb25zdCBjaGFyKiBQYWNrZWRGaXhlZDMyUGFyc2VyKHZvaWQqIG9iamVjdCwgY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUNvbnRleHQqIGN0eCkgeworICByZXR1cm4gRml4ZWRQYXJzZXI8dWludDMyX3Q+KG9iamVjdCwgcHRyLCBjdHgpOworfQorY29uc3QgY2hhciogUGFja2VkU0ZpeGVkMzJQYXJzZXIodm9pZCogb2JqZWN0LCBjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUNvbnRleHQqIGN0eCkgeworICByZXR1cm4gRml4ZWRQYXJzZXI8aW50MzJfdD4ob2JqZWN0LCBwdHIsIGN0eCk7Cit9Citjb25zdCBjaGFyKiBQYWNrZWRGaXhlZDY0UGFyc2VyKHZvaWQqIG9iamVjdCwgY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUNvbnRleHQqIGN0eCkgeworICByZXR1cm4gRml4ZWRQYXJzZXI8dWludDY0X3Q+KG9iamVjdCwgcHRyLCBjdHgpOworfQorY29uc3QgY2hhciogUGFja2VkU0ZpeGVkNjRQYXJzZXIodm9pZCogb2JqZWN0LCBjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUNvbnRleHQqIGN0eCkgeworICByZXR1cm4gRml4ZWRQYXJzZXI8aW50NjRfdD4ob2JqZWN0LCBwdHIsIGN0eCk7Cit9Citjb25zdCBjaGFyKiBQYWNrZWRGbG9hdFBhcnNlcih2b2lkKiBvYmplY3QsIGNvbnN0IGNoYXIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlQ29udGV4dCogY3R4KSB7CisgIHJldHVybiBGaXhlZFBhcnNlcjxmbG9hdD4ob2JqZWN0LCBwdHIsIGN0eCk7Cit9Citjb25zdCBjaGFyKiBQYWNrZWREb3VibGVQYXJzZXIodm9pZCogb2JqZWN0LCBjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VDb250ZXh0KiBjdHgpIHsKKyAgcmV0dXJuIEZpeGVkUGFyc2VyPGRvdWJsZT4ob2JqZWN0LCBwdHIsIGN0eCk7Cit9CisKK2NsYXNzIFVua25vd25GaWVsZExpdGVQYXJzZXJIZWxwZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVW5rbm93bkZpZWxkTGl0ZVBhcnNlckhlbHBlcihzdGQ6OnN0cmluZyogdW5rbm93bikKKyAgICAgIDogdW5rbm93bl8odW5rbm93bikge30KKworICB2b2lkIEFkZFZhcmludCh1aW50MzJfdCBudW0sIHVpbnQ2NF90IHZhbHVlKSB7CisgICAgaWYgKHVua25vd25fID09IG51bGxwdHIpIHJldHVybjsKKyAgICBXcml0ZVZhcmludChudW0gKiA4LCB1bmtub3duXyk7CisgICAgV3JpdGVWYXJpbnQodmFsdWUsIHVua25vd25fKTsKKyAgfQorICB2b2lkIEFkZEZpeGVkNjQodWludDMyX3QgbnVtLCB1aW50NjRfdCB2YWx1ZSkgeworICAgIGlmICh1bmtub3duXyA9PSBudWxscHRyKSByZXR1cm47CisgICAgV3JpdGVWYXJpbnQobnVtICogOCArIDEsIHVua25vd25fKTsKKyAgICBjaGFyIGJ1ZmZlcls4XTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuNjRUb0FycmF5KAorICAgICAgICB2YWx1ZSwgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSk7CisgICAgdW5rbm93bl8tPmFwcGVuZChidWZmZXIsIDgpOworICB9CisgIGNvbnN0IGNoYXIqIFBhcnNlTGVuZ3RoRGVsaW1pdGVkKHVpbnQzMl90IG51bSwgY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUNvbnRleHQqIGN0eCkgeworICAgIGludCBzaXplID0gUmVhZFNpemUoJnB0cik7CisgICAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgICBpZiAodW5rbm93bl8gPT0gbnVsbHB0cikgcmV0dXJuIGN0eC0+U2tpcChwdHIsIHNpemUpOworICAgIFdyaXRlVmFyaW50KG51bSAqIDggKyAyLCB1bmtub3duXyk7CisgICAgV3JpdGVWYXJpbnQoc2l6ZSwgdW5rbm93bl8pOworICAgIHJldHVybiBjdHgtPkFwcGVuZFN0cmluZyhwdHIsIHNpemUsIHVua25vd25fKTsKKyAgfQorICBjb25zdCBjaGFyKiBQYXJzZUdyb3VwKHVpbnQzMl90IG51bSwgY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCkgeworICAgIGlmICh1bmtub3duXykgV3JpdGVWYXJpbnQobnVtICogOCArIDMsIHVua25vd25fKTsKKyAgICBwdHIgPSBjdHgtPlBhcnNlR3JvdXAodGhpcywgcHRyLCBudW0gKiA4ICsgMyk7CisgICAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgICBpZiAodW5rbm93bl8pIFdyaXRlVmFyaW50KG51bSAqIDggKyA0LCB1bmtub3duXyk7CisgICAgcmV0dXJuIHB0cjsKKyAgfQorICB2b2lkIEFkZEZpeGVkMzIodWludDMyX3QgbnVtLCB1aW50MzJfdCB2YWx1ZSkgeworICAgIGlmICh1bmtub3duXyA9PSBudWxscHRyKSByZXR1cm47CisgICAgV3JpdGVWYXJpbnQobnVtICogOCArIDUsIHVua25vd25fKTsKKyAgICBjaGFyIGJ1ZmZlcls0XTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuMzJUb0FycmF5KAorICAgICAgICB2YWx1ZSwgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSk7CisgICAgdW5rbm93bl8tPmFwcGVuZChidWZmZXIsIDQpOworICB9CisKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCkgeworICAgIHJldHVybiBXaXJlRm9ybWF0UGFyc2VyKCp0aGlzLCBwdHIsIGN0eCk7CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nKiB1bmtub3duXzsKK307CisKK2NvbnN0IGNoYXIqIFVua25vd25Hcm91cExpdGVQYXJzZShzdGQ6OnN0cmluZyogdW5rbm93biwgY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlQ29udGV4dCogY3R4KSB7CisgIFVua25vd25GaWVsZExpdGVQYXJzZXJIZWxwZXIgZmllbGRfcGFyc2VyKHVua25vd24pOworICByZXR1cm4gV2lyZUZvcm1hdFBhcnNlcihmaWVsZF9wYXJzZXIsIHB0ciwgY3R4KTsKK30KKworY29uc3QgY2hhciogVW5rbm93bkZpZWxkUGFyc2UodWludDMyX3QgdGFnLCBzdGQ6OnN0cmluZyogdW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgpIHsKKyAgVW5rbm93bkZpZWxkTGl0ZVBhcnNlckhlbHBlciBmaWVsZF9wYXJzZXIodW5rbm93bik7CisgIHJldHVybiBGaWVsZFBhcnNlcih0YWcsIGZpZWxkX3BhcnNlciwgcHRyLCBjdHgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9wYXJzZV9jb250ZXh0LmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3BhcnNlX2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWVhNTBjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9wYXJzZV9jb250ZXh0LmgKQEAgLTAsMCArMSwxMDI1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUEFSU0VfQ09OVEVYVF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1BBUlNFX0NPTlRFWFRfSF9fCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9lbmRpYW4uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW1wbGljaXRfd2Vha19tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lubGluZWRfc3RyaW5nX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21ldGFkYXRhX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIFVua25vd25GaWVsZFNldDsKK2NsYXNzIERlc2NyaXB0b3JQb29sOworY2xhc3MgTWVzc2FnZUZhY3Rvcnk7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRlbXBsYXRlIGNvZGUgYmVsb3cgbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgZXhpc3RlbmNlIG9mIHRoZXNlIGZ1bmN0aW9ucy4KK1BST1RPQlVGX0VYUE9SVCB2b2lkIFdyaXRlVmFyaW50KHVpbnQzMl90IG51bSwgdWludDY0X3QgdmFsLCBzdGQ6OnN0cmluZyogcyk7CitQUk9UT0JVRl9FWFBPUlQgdm9pZCBXcml0ZUxlbmd0aERlbGltaXRlZCh1aW50MzJfdCBudW0sIFN0cmluZ1BpZWNlIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBzKTsKKy8vIElubGluZSBiZWNhdXNlIGl0IGlzIGp1c3QgZm9yd2FyZGluZyB0byBzLT5Xcml0ZVZhcmludAoraW5saW5lIHZvaWQgV3JpdGVWYXJpbnQodWludDMyX3QgbnVtLCB1aW50NjRfdCB2YWwsIFVua25vd25GaWVsZFNldCogcyk7CitpbmxpbmUgdm9pZCBXcml0ZUxlbmd0aERlbGltaXRlZCh1aW50MzJfdCBudW0sIFN0cmluZ1BpZWNlIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogcyk7CisKKworLy8gVGhlIGJhc2ljIGFic3RyYWN0aW9uIHRoZSBwYXJzZXIgaXMgZGVzaWduZWQgZm9yIGlzIGEgc2xpZ2h0IG1vZGlmaWNhdGlvbgorLy8gb2YgdGhlIFplcm9Db3B5SW5wdXRTdHJlYW0gKFpDSVMpIGFic3RyYWN0aW9uLiBBIFpDSVMgcHJlc2VudHMgYSBzZXJpYWxpemVkCisvLyBzdHJlYW0gYXMgYSBzZXJpZXMgb2YgYnVmZmVycyB0aGF0IGNvbmNhdGVuYXRlIHRvIHRoZSBmdWxsIHN0cmVhbS4KKy8vIFBpY3RvcmlhbGx5IGEgWkNJUyBwcmVzZW50cyBhIHN0cmVhbSBpbiBjaHVua3MgbGlrZSBzbworLy8gWy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLV0KKy8vIFstLS0tLS0tLS0tLS0tLS0tLS0tLS1dIGNodW5rIDEKKy8vICAgICAgICAgICAgICAgICAgICAgIFstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXSBjaHVuayAyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rIDMgWy0tLS0tLS0tLS0tLS0tXQorLy8KKy8vIFdoZXJlIHRoZSAnLScgcmVwcmVzZW50IHRoZSBieXRlcyB3aGljaCBhcmUgdmVydGljYWxseSBsaW5lZCB1cCB3aXRoIHRoZQorLy8gYnl0ZXMgb2YgdGhlIHN0cmVhbS4gVGhlIHByb3RvIHBhcnNlciByZXF1aXJlcyBpdHMgaW5wdXQgdG8gYmUgcHJlc2VudGVkCisvLyBzaW1pbGFybHkgd2l0aCB0aGUgZXh0cmEKKy8vIHByb3BlcnR5IHRoYXQgZWFjaCBjaHVuayBoYXMga1Nsb3BCeXRlcyBwYXN0IGl0cyBlbmQgdGhhdCBvdmVybGFwcyB3aXRoIHRoZQorLy8gZmlyc3Qga1Nsb3BCeXRlcyBvZiB0aGUgbmV4dCBjaHVuaywgb3IgaWYgdGhlcmUgaXMgbm8gbmV4dCBjaHVuayBhdCBsZWFzdCBpdHMKKy8vIHN0aWxsIHZhbGlkIHRvIHJlYWQgdGhvc2UgYnl0ZXMuIEFnYWluLCBwaWN0b3JpYWxseSwgd2Ugbm93IGhhdmUKKy8vCisvLyBbLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXQorLy8gWy0tLS0tLS0tLS0tLS0tLS0tLS0uLi4uXSBjaHVuayAxCisvLyAgICAgICAgICAgICAgICAgICAgWy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4uLi5dIGNodW5rIDIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsgMyBbLS0tLS0tLS0tLS0tLS0tLS0tLi4qKl0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsgNCBbLS0qKioqXQorLy8gSGVyZSAnLScgbWVhbiB0aGUgYnl0ZXMgb2YgdGhlIHN0cmVhbSBvciBjaHVuayBhbmQgJy4nIG1lYW5zIGJ5dGVzIHBhc3QgdGhlCisvLyBjaHVuayB0aGF0IG1hdGNoIHVwIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGNodW5rLiBBYm92ZSBlYWNoIGNodW5rIGhhcworLy8gNCAnLicgYWZ0ZXIgdGhlIGNodW5rLiBJbiB0aGUgY2FzZSB0aGVzZSAnb3ZlcmZsb3cnIGJ5dGVzIHJlcHJlc2VudHMgYnl0ZXMKKy8vIHBhc3QgdGhlIHN0cmVhbSwgaW5kaWNhdGVkIGJ5ICcqJyBhYm92ZSwgdGhlaXIgdmFsdWVzIGFyZSB1bnNwZWNpZmllZC4gSXQgaXMKKy8vIHN0aWxsIGxlZ2FsIHRvIHJlYWQgdGhlbSAoaWUuIHNob3VsZCBub3Qgc2VnZmF1bHQpLiBSZWFkaW5nIHBhc3QgdGhlCisvLyBlbmQgc2hvdWxkIGJlIGRldGVjdGVkIGJ5IHRoZSB1c2VyIGFuZCBpbmRpY2F0ZWQgYXMgYW4gZXJyb3IuCisvLworLy8gVGhlIHJlYXNvbiBmb3IgdGhpcywgYWRtaXR0ZWRseSwgdW5jb252ZW50aW9uYWwgaW52YXJpYW50IGlzIHRvIHJ1dGhsZXNzbHkKKy8vIG9wdGltaXplIHRoZSBwcm90b2J1ZiBwYXJzZXIuIEhhdmluZyBhbiBvdmVybGFwIGhlbHBzIGluIHR3byBpbXBvcnRhbnQgd2F5cy4KKy8vIEZpcnN0bHkgaXQgYWxsZXZpYXRlcyBoYXZpbmcgdG8gcGVyZm9ybWluZyBib3VuZHMgY2hlY2tzIGlmIGEgcGllY2Ugb2YgY29kZQorLy8gaXMgZ3VhcmFudGVlZCB0byBub3QgcmVhZCBtb3JlIHRoYW4ga1Nsb3BCeXRlcy4gU2Vjb25kbHksIGFuZCBtb3JlCisvLyBpbXBvcnRhbnRseSwgdGhlIHByb3RvYnVmIHdpcmVmb3JtYXQgaXMgc3VjaCB0aGF0IHJlYWRpbmcgYSBrZXkvdmFsdWUgcGFpciBpcworLy8gYWx3YXlzIGxlc3MgdGhhbiAxNiBieXRlcy4gVGhpcyByZW1vdmVzIHRoZSBuZWVkIHRvIGNoYW5nZSB0byBuZXh0IGJ1ZmZlciBpbgorLy8gdGhlIG1pZGRsZSBvZiByZWFkaW5nIHByaW1pdGl2ZSB2YWx1ZXMuIEhlbmNlIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3RvcmUgYW5kCisvLyBsb2FkIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRXBzQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIGVudW0geyBrU2xvcEJ5dGVzID0gMTYsIGtNYXhDb3JkQnl0ZXNUb0NvcHkgPSA1MTIgfTsKKworICBleHBsaWNpdCBFcHNDb3B5SW5wdXRTdHJlYW0oYm9vbCBlbmFibGVfYWxpYXNpbmcpCisgICAgICA6IGFsaWFzaW5nXyhlbmFibGVfYWxpYXNpbmcgPyBrT25QYXRjaCA6IGtOb0FsaWFzaW5nKSB7fQorCisgIHZvaWQgQmFja1VwKGNvbnN0IGNoYXIqIHB0cikgeworICAgIEdPT0dMRV9EQ0hFQ0socHRyIDw9IGJ1ZmZlcl9lbmRfICsga1Nsb3BCeXRlcyk7CisgICAgaW50IGNvdW50OworICAgIGlmIChuZXh0X2NodW5rXyA9PSBidWZmZXJfKSB7CisgICAgICBjb3VudCA9IHN0YXRpY19jYXN0PGludD4oYnVmZmVyX2VuZF8gKyBrU2xvcEJ5dGVzIC0gcHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgY291bnQgPSBzaXplXyArIHN0YXRpY19jYXN0PGludD4oYnVmZmVyX2VuZF8gLSBwdHIpOworICAgIH0KKyAgICBpZiAoY291bnQgPiAwKSBTdHJlYW1CYWNrVXAoY291bnQpOworICB9CisKKyAgLy8gSWYgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlIGl0J3MgYW4gZXJyb3IKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIGludCBQdXNoTGltaXQoY29uc3QgY2hhciogcHRyLCBpbnQgbGltaXQpIHsKKyAgICBHT09HTEVfRENIRUNLKGxpbWl0ID49IDAgJiYgbGltaXQgPD0gSU5UX01BWCAtIGtTbG9wQnl0ZXMpOworICAgIC8vIFRoaXMgYWRkIGlzIHNhZmUgZHVlIHRvIHRoZSBpbnZhcmlhbnQgYWJvdmUsIGJlY2F1c2UKKyAgICAvLyBwdHIgLSBidWZmZXJfZW5kXyA8PSBrU2xvcEJ5dGVzLgorICAgIGxpbWl0ICs9IHN0YXRpY19jYXN0PGludD4ocHRyIC0gYnVmZmVyX2VuZF8pOworICAgIGxpbWl0X2VuZF8gPSBidWZmZXJfZW5kXyArIChzdGQ6Om1pbikoMCwgbGltaXQpOworICAgIGF1dG8gb2xkX2xpbWl0ID0gbGltaXRfOworICAgIGxpbWl0XyA9IGxpbWl0OworICAgIHJldHVybiBvbGRfbGltaXQgLSBsaW1pdDsKKyAgfQorCisgIFBST1RPQlVGX05PRElTQ0FSRCBib29sIFBvcExpbWl0KGludCBkZWx0YSkgeworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCFFbmRlZEF0TGltaXQoKSkpIHJldHVybiBmYWxzZTsKKyAgICBsaW1pdF8gPSBsaW1pdF8gKyBkZWx0YTsKKyAgICAvLyBUT0RPKGdlcmJlbnMpIFdlIGNvdWxkIHJlbW92ZSB0aGlzIGxpbmUgYW5kIGhvaXN0IHRoZSBjb2RlIHRvCisgICAgLy8gRG9uZUZhbGxiYWNrLiBTdHVkeSB0aGUgcGVyZi9iaW4tc2l6ZSBlZmZlY3RzLgorICAgIGxpbWl0X2VuZF8gPSBidWZmZXJfZW5kXyArIChzdGQ6Om1pbikoMCwgbGltaXRfKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIFBST1RPQlVGX05PRElTQ0FSRCBjb25zdCBjaGFyKiBTa2lwKGNvbnN0IGNoYXIqIHB0ciwgaW50IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8PSBidWZmZXJfZW5kXyArIGtTbG9wQnl0ZXMgLSBwdHIpIHsKKyAgICAgIHJldHVybiBwdHIgKyBzaXplOworICAgIH0KKyAgICByZXR1cm4gU2tpcEZhbGxiYWNrKHB0ciwgc2l6ZSk7CisgIH0KKyAgUFJPVE9CVUZfTk9ESVNDQVJEIGNvbnN0IGNoYXIqIFJlYWRTdHJpbmcoY29uc3QgY2hhciogcHRyLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHMpIHsKKyAgICBpZiAoc2l6ZSA8PSBidWZmZXJfZW5kXyArIGtTbG9wQnl0ZXMgLSBwdHIpIHsKKyAgICAgIHMtPmFzc2lnbihwdHIsIHNpemUpOworICAgICAgcmV0dXJuIHB0ciArIHNpemU7CisgICAgfQorICAgIHJldHVybiBSZWFkU3RyaW5nRmFsbGJhY2socHRyLCBzaXplLCBzKTsKKyAgfQorICBQUk9UT0JVRl9OT0RJU0NBUkQgY29uc3QgY2hhciogQXBwZW5kU3RyaW5nKGNvbnN0IGNoYXIqIHB0ciwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHMpIHsKKyAgICBpZiAoc2l6ZSA8PSBidWZmZXJfZW5kXyArIGtTbG9wQnl0ZXMgLSBwdHIpIHsKKyAgICAgIHMtPmFwcGVuZChwdHIsIHNpemUpOworICAgICAgcmV0dXJuIHB0ciArIHNpemU7CisgICAgfQorICAgIHJldHVybiBBcHBlbmRTdHJpbmdGYWxsYmFjayhwdHIsIHNpemUsIHMpOworICB9CisgIC8vIEltcGxlbWVudGVkIGluIGFyZW5hc3RyaW5nLmNjCisgIFBST1RPQlVGX05PRElTQ0FSRCBjb25zdCBjaGFyKiBSZWFkQXJlbmFTdHJpbmcoY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZW5hU3RyaW5nUHRyKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZW5hKiBhcmVuYSk7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFRhZywgdHlwZW5hbWUgVD4KKyAgUFJPVE9CVUZfTk9ESVNDQVJEIGNvbnN0IGNoYXIqIFJlYWRSZXBlYXRlZEZpeGVkKGNvbnN0IGNoYXIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZyBleHBlY3RlZF90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPFQ+KiBvdXQpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9OT0RJU0NBUkQgY29uc3QgY2hhciogUmVhZFBhY2tlZEZpeGVkKGNvbnN0IGNoYXIqIHB0ciwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxUPiogb3V0KTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFkZD4KKyAgUFJPVE9CVUZfTk9ESVNDQVJEIGNvbnN0IGNoYXIqIFJlYWRQYWNrZWRWYXJpbnQoY29uc3QgY2hhciogcHRyLCBBZGQgYWRkKTsKKworICB1aW50MzJfdCBMYXN0VGFnKCkgY29uc3QgeyByZXR1cm4gbGFzdF90YWdfbWludXNfMV8gKyAxOyB9CisgIGJvb2wgQ29uc3VtZUVuZEdyb3VwKHVpbnQzMl90IHN0YXJ0X3RhZykgeworICAgIGJvb2wgcmVzID0gbGFzdF90YWdfbWludXNfMV8gPT0gc3RhcnRfdGFnOworICAgIGxhc3RfdGFnX21pbnVzXzFfID0gMDsKKyAgICByZXR1cm4gcmVzOworICB9CisgIGJvb2wgRW5kZWRBdExpbWl0KCkgY29uc3QgeyByZXR1cm4gbGFzdF90YWdfbWludXNfMV8gPT0gMDsgfQorICBib29sIEVuZGVkQXRFbmRPZlN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIGxhc3RfdGFnX21pbnVzXzFfID09IDE7IH0KKyAgdm9pZCBTZXRMYXN0VGFnKHVpbnQzMl90IHRhZykgeyBsYXN0X3RhZ19taW51c18xXyA9IHRhZyAtIDE7IH0KKyAgdm9pZCBTZXRFbmRPZlN0cmVhbSgpIHsgbGFzdF90YWdfbWludXNfMV8gPSAxOyB9CisgIGJvb2wgSXNFeGNlZWRpbmdMaW1pdChjb25zdCBjaGFyKiBwdHIpIHsKKyAgICByZXR1cm4gcHRyID4gbGltaXRfZW5kXyAmJgorICAgICAgICAgICAobmV4dF9jaHVua18gPT0gbnVsbHB0ciB8fCBwdHIgLSBidWZmZXJfZW5kXyA+IGxpbWl0Xyk7CisgIH0KKyAgYm9vbCBBbGlhc2luZ0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBhbGlhc2luZ18gIT0ga05vQWxpYXNpbmc7IH0KKyAgaW50IEJ5dGVzVW50aWxMaW1pdChjb25zdCBjaGFyKiBwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gbGltaXRfICsgc3RhdGljX2Nhc3Q8aW50PihidWZmZXJfZW5kXyAtIHB0cik7CisgIH0KKyAgLy8gUmV0dXJucyB0cnVlIGlmIG1vcmUgZGF0YSBpcyBhdmFpbGFibGUsIGlmIGZhbHNlIGlzIHJldHVybmVkIG9uZSBoYXMgdG8KKyAgLy8gY2FsbCBEb25lIGZvciBmdXJ0aGVyIGNoZWNrcy4KKyAgYm9vbCBEYXRhQXZhaWxhYmxlKGNvbnN0IGNoYXIqIHB0cikgeyByZXR1cm4gcHRyIDwgbGltaXRfZW5kXzsgfQorCisgcHJvdGVjdGVkOgorICAvLyBSZXR1cm5zIHRydWUgaXMgbGltaXQgKGVpdGhlciBhbiBleHBsaWNpdCBsaW1pdCBvciBlbmQgb2Ygc3RyZWFtKSBpcworICAvLyByZWFjaGVkLiBJdCBhbGlnbnMgKnB0ciBhY3Jvc3MgYnVmZmVyIHNlYW1zLgorICAvLyBJZiBsaW1pdCBpcyBleGNlZWRlZCBpdCByZXR1cm5zIHRydWUgYW5kIHB0ciBpcyBzZXQgdG8gbnVsbC4KKyAgYm9vbCBEb25lV2l0aENoZWNrKGNvbnN0IGNoYXIqKiBwdHIsIGludCBkKSB7CisgICAgR09PR0xFX0RDSEVDSygqcHRyKTsKKyAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKCpwdHIgPCBsaW1pdF9lbmRfKSkgcmV0dXJuIGZhbHNlOworICAgIGludCBvdmVycnVuID0gc3RhdGljX2Nhc3Q8aW50PigqcHRyIC0gYnVmZmVyX2VuZF8pOworICAgIEdPT0dMRV9EQ0hFQ0tfTEUob3ZlcnJ1biwga1Nsb3BCeXRlcyk7ICAvLyBHdWFyYW50ZWVkIGJ5IHBhcnNlIGxvb3AuCisgICAgaWYgKG92ZXJydW4gPT0KKyAgICAgICAgbGltaXRfKSB7ICAvLyAgTm8gbmVlZCB0byBmbGlwIGJ1ZmZlcnMgaWYgd2UgZW5kZWQgb24gYSBsaW1pdC4KKyAgICAgIC8vIElmIHdlIGFjdHVhbGx5IG92ZXJydW4gdGhlIGJ1ZmZlciBhbmQgbmV4dF9jaHVua18gaXMgbnVsbC4gSXQgbWVhbnMKKyAgICAgIC8vIHRoZSBzdHJlYW0gZW5kZWQgYW5kIHdlIHBhc3NlZCB0aGUgc3RyZWFtIGVuZC4KKyAgICAgIGlmIChvdmVycnVuID4gMCAmJiBuZXh0X2NodW5rXyA9PSBudWxscHRyKSAqcHRyID0gbnVsbHB0cjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBhdXRvIHJlcyA9IERvbmVGYWxsYmFjayhvdmVycnVuLCBkKTsKKyAgICAqcHRyID0gcmVzLmZpcnN0OworICAgIHJldHVybiByZXMuc2Vjb25kOworICB9CisKKyAgY29uc3QgY2hhciogSW5pdEZyb20oU3RyaW5nUGllY2UgZmxhdCkgeworICAgIG92ZXJhbGxfbGltaXRfID0gMDsKKyAgICBpZiAoZmxhdC5zaXplKCkgPiBrU2xvcEJ5dGVzKSB7CisgICAgICBsaW1pdF8gPSBrU2xvcEJ5dGVzOworICAgICAgbGltaXRfZW5kXyA9IGJ1ZmZlcl9lbmRfID0gZmxhdC5kYXRhKCkgKyBmbGF0LnNpemUoKSAtIGtTbG9wQnl0ZXM7CisgICAgICBuZXh0X2NodW5rXyA9IGJ1ZmZlcl87CisgICAgICBpZiAoYWxpYXNpbmdfID09IGtPblBhdGNoKSBhbGlhc2luZ18gPSBrTm9EZWx0YTsKKyAgICAgIHJldHVybiBmbGF0LmRhdGEoKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RkOjptZW1jcHkoYnVmZmVyXywgZmxhdC5kYXRhKCksIGZsYXQuc2l6ZSgpKTsKKyAgICAgIGxpbWl0XyA9IDA7CisgICAgICBsaW1pdF9lbmRfID0gYnVmZmVyX2VuZF8gPSBidWZmZXJfICsgZmxhdC5zaXplKCk7CisgICAgICBuZXh0X2NodW5rXyA9IG51bGxwdHI7CisgICAgICBpZiAoYWxpYXNpbmdfID09IGtPblBhdGNoKSB7CisgICAgICAgIGFsaWFzaW5nXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjp1aW50cHRyX3Q+KGZsYXQuZGF0YSgpKSAtCisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjp1aW50cHRyX3Q+KGJ1ZmZlcl8pOworICAgICAgfQorICAgICAgcmV0dXJuIGJ1ZmZlcl87CisgICAgfQorICB9CisKKyAgY29uc3QgY2hhciogSW5pdEZyb20oaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIHpjaXMpOworCisgIGNvbnN0IGNoYXIqIEluaXRGcm9tKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiB6Y2lzLCBpbnQgbGltaXQpIHsKKyAgICBpZiAobGltaXQgPT0gLTEpIHJldHVybiBJbml0RnJvbSh6Y2lzKTsKKyAgICBvdmVyYWxsX2xpbWl0XyA9IGxpbWl0OworICAgIGF1dG8gcmVzID0gSW5pdEZyb20oemNpcyk7CisgICAgbGltaXRfID0gbGltaXQgLSBzdGF0aWNfY2FzdDxpbnQ+KGJ1ZmZlcl9lbmRfIC0gcmVzKTsKKyAgICBsaW1pdF9lbmRfID0gYnVmZmVyX2VuZF8gKyAoc3RkOjptaW4pKDAsIGxpbWl0Xyk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgY2hhciogbGltaXRfZW5kXzsgIC8vIGJ1ZmZlcl9lbmRfICsgbWluKGxpbWl0XywgMCkKKyAgY29uc3QgY2hhciogYnVmZmVyX2VuZF87CisgIGNvbnN0IGNoYXIqIG5leHRfY2h1bmtfOworICBpbnQgc2l6ZV87CisgIGludCBsaW1pdF87ICAvLyByZWxhdGl2ZSB0byBidWZmZXJfZW5kXzsKKyAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIHpjaXNfID0gbnVsbHB0cjsKKyAgY2hhciBidWZmZXJfWzIgKiBrU2xvcEJ5dGVzXSA9IHt9OworICBlbnVtIHsga05vQWxpYXNpbmcgPSAwLCBrT25QYXRjaCA9IDEsIGtOb0RlbHRhID0gMiB9OworICBzdGQ6OnVpbnRwdHJfdCBhbGlhc2luZ18gPSBrTm9BbGlhc2luZzsKKyAgLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIHRvIGNvbW11bmljYXRlIGhvdyB0aGUgcGFyc2UgZW5kZWQsIGluIG9yZGVyIHRvCisgIC8vIGNvbXBsZXRlbHkgdmVyaWZ5IHRoZSBwYXJzZWQgZGF0YS4gQSB3aXJlLWZvcm1hdCBwYXJzZSBjYW4gZW5kIGJlY2F1c2Ugb2YKKyAgLy8gb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAgLy8gMSkgQSBwYXJzZSBjYW4gZW5kIG9uIGEgcHVzaGVkIGxpbWl0LgorICAvLyAyKSBBIHBhcnNlIGNhbiBlbmQgb24gRW5kIE9mIFN0cmVhbSAoRU9TKS4KKyAgLy8gMykgQSBwYXJzZSBjYW4gZW5kIG9uIDAgdGFnIChvbmx5IHZhbGlkIGZvciB0b3BsZXZlbCBtZXNzYWdlKS4KKyAgLy8gNCkgQSBwYXJzZSBjYW4gZW5kIG9uIGFuIGVuZC1ncm91cCB0YWcuCisgIC8vIFRoaXMgdmFyaWFibGUgc2hvdWxkIGFsd2F5cyBiZSBzZXQgdG8gMCwgd2hpY2ggaW5kaWNhdGVzIGNhc2UgMS4gSWYgdGhlCisgIC8vIHBhcnNlIHRlcm1pbmF0ZWQgZHVlIHRvIEVPUyAoY2FzZSAyKSwgaXQncyBzZXQgdG8gMS4gSW4gY2FzZSB0aGUgcGFyc2UKKyAgLy8gZW5kZWQgZHVlIHRvIGEgdGVybWluYXRpbmcgdGFnIChjYXNlIDMgYW5kIDQpIGl0J3Mgc2V0IHRvICh0YWcgLSAxKS4KKyAgLy8gVGhpcyB2YXIgZG9lc24ndCByZWFsbHkgYmVsb25nIGluIEVwc0NvcHlJbnB1dFN0cmVhbSBhbmQgc2hvdWxkIGJlIHBhcnQgb2YKKyAgLy8gdGhlIFBhcnNlQ29udGV4dCwgYnV0IGNhc2UgMiBpcyBtb3N0IGVhc2lseSBhbmQgb3B0aW1hbGx5IGltcGxlbWVudGVkIGluCisgIC8vIERvbmVGYWxsYmFjay4KKyAgdWludDMyX3QgbGFzdF90YWdfbWludXNfMV8gPSAwOworICBpbnQgb3ZlcmFsbF9saW1pdF8gPSBJTlRfTUFYOyAgLy8gT3ZlcmFsbCBsaW1pdCBpbmRlcGVuZGVudCBvZiBwdXNoZWQgbGltaXRzLgorICAvLyBQcmV0dHkgcmFuZG9tIGxhcmdlIG51bWJlciB0aGF0IHNlZW1zIGxpa2UgYSBzYWZlIGFsbG9jYXRpb24gb24gbW9zdAorICAvLyBzeXN0ZW1zLiBUT0RPKGdlcmJlbnMpIGRvIHdlIG5lZWQgdG8gc2V0IHRoaXMgYXMgYnVpbGQgZmxhZz8KKyAgZW51bSB7IGtTYWZlU3RyaW5nU2l6ZSA9IDUwMDAwMDAwIH07CisKKyAgLy8gQWR2YW5jZXMgdG8gbmV4dCBidWZmZXIgY2h1bmsgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHNhbWUgbG9naWNhbCBwbGFjZQorICAvLyBpbiB0aGUgc3RyZWFtIGFzIHNldCBieSBvdmVycnVuLiBPdmVycnVuIGluZGljYXRlcyB0aGUgcG9zaXRpb24gaW4gdGhlIHNsb3AKKyAgLy8gcmVnaW9uIHRoZSBwYXJzZSB3YXMgbGVmdCAoMCA8PSBvdmVycnVuIDw9IGtTbG9wQnl0ZXMpLiBSZXR1cm5zIHRydWUgaWYgYXQKKyAgLy8gbGltaXQsIGF0IHdoaWNoIHBvaW50IHRoZSByZXR1cm5lZCBwb2ludGVyIG1heWJlIG51bGwgaWYgdGhlcmUgd2FzIGFuCisgIC8vIGVycm9yLiBUaGUgaW52YXJpYW50IG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhhdCBpdCdzIGd1YXJhbnRlZWQgdGhhdAorICAvLyBrU2xvcEJ5dGVzIGJ5dGVzIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHRoZSByZXR1cm5lZCBwdHIuIFRoaXMgZnVuY3Rpb24gbWlnaHQKKyAgLy8gYWR2YW5jZSBtb3JlIGJ1ZmZlcnMgdGhhbiBvbmUgaW4gdGhlIHVuZGVybHlpbmcgWmVyb0NvcHlJbnB1dFN0cmVhbS4KKyAgc3RkOjpwYWlyPGNvbnN0IGNoYXIqLCBib29sPiBEb25lRmFsbGJhY2soaW50IG92ZXJydW4sIGludCBkZXB0aCk7CisgIC8vIEFkdmFuY2VzIHRvIHRoZSBuZXh0IGJ1ZmZlciwgYXQgbW9zdCBvbmUgY2FsbCB0byBOZXh0KCkgb24gdGhlIHVuZGVybHlpbmcKKyAgLy8gWmVyb0NvcHlJbnB1dFN0cmVhbSBpcyBtYWRlLiBUaGlzIGZ1bmN0aW9uIERPRVMgTk9UIG1hdGNoIHRoZSByZXR1cm5lZAorICAvLyBwb2ludGVyIHRvIHdoZXJlIGluIHRoZSBzbG9wIHJlZ2lvbiB0aGUgcGFyc2UgZW5kcywgaGVuY2Ugbm8gb3ZlcnJ1bgorICAvLyBwYXJhbWV0ZXIuIFRoaXMgaXMgdXNlZnVsIGZvciBzdHJpbmcgb3BlcmF0aW9ucyB3aGVyZSB5b3UgYWx3YXlzIGNvcHkKKyAgLy8gdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyIChpbmNsdWRpbmcgdGhlIHNsb3AgcmVnaW9uKS4KKyAgY29uc3QgY2hhciogTmV4dCgpOworICAvLyBvdmVycnVuIGlzIHRoZSBsb2NhdGlvbiBpbiB0aGUgc2xvcCByZWdpb24gdGhlIHN0cmVhbSBjdXJyZW50bHkgaXMKKyAgLy8gKDAgPD0gb3ZlcnJ1biA8PSBrU2xvcEJ5dGVzKS4gVG8gcHJldmVudCBmbGlwcGluZyB0byB0aGUgbmV4dCBidWZmZXIgb2YKKyAgLy8gdGhlIFplcm9Db3B5SW5wdXRTdHJlYW0gaW4gdGhlIGNhc2UgdGhlIHBhcnNlIHdpbGwgZW5kIGluIHRoZSBsYXN0CisgIC8vIGtTbG9wQnl0ZXMgb2YgdGhlIGN1cnJlbnQgYnVmZmVyLiBkZXB0aCBpcyB0aGUgY3VycmVudCBkZXB0aCBvZiBuZXN0ZWQKKyAgLy8gZ3JvdXBzIChvciBuZWdhdGl2ZSBpZiB0aGUgdXNlIGNhc2UgZG9lcyBub3QgbmVlZCBjYXJlZnVsIHRyYWNraW5nKS4KKyAgaW5saW5lIGNvbnN0IGNoYXIqIE5leHRCdWZmZXIoaW50IG92ZXJydW4sIGludCBkZXB0aCk7CisgIGNvbnN0IGNoYXIqIFNraXBGYWxsYmFjayhjb25zdCBjaGFyKiBwdHIsIGludCBzaXplKTsKKyAgY29uc3QgY2hhciogQXBwZW5kU3RyaW5nRmFsbGJhY2soY29uc3QgY2hhciogcHRyLCBpbnQgc2l6ZSwgc3RkOjpzdHJpbmcqIHN0cik7CisgIGNvbnN0IGNoYXIqIFJlYWRTdHJpbmdGYWxsYmFjayhjb25zdCBjaGFyKiBwdHIsIGludCBzaXplLCBzdGQ6OnN0cmluZyogc3RyKTsKKyAgYm9vbCBTdHJlYW1OZXh0KGNvbnN0IHZvaWQqKiBkYXRhKSB7CisgICAgYm9vbCByZXMgPSB6Y2lzXy0+TmV4dChkYXRhLCAmc2l6ZV8pOworICAgIGlmIChyZXMpIG92ZXJhbGxfbGltaXRfIC09IHNpemVfOworICAgIHJldHVybiByZXM7CisgIH0KKyAgdm9pZCBTdHJlYW1CYWNrVXAoaW50IGNvdW50KSB7CisgICAgemNpc18tPkJhY2tVcChjb3VudCk7CisgICAgb3ZlcmFsbF9saW1pdF8gKz0gY291bnQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQT4KKyAgY29uc3QgY2hhciogQXBwZW5kU2l6ZShjb25zdCBjaGFyKiBwdHIsIGludCBzaXplLCBjb25zdCBBJiBhcHBlbmQpIHsKKyAgICBpbnQgY2h1bmtfc2l6ZSA9IGJ1ZmZlcl9lbmRfICsga1Nsb3BCeXRlcyAtIHB0cjsKKyAgICBkbyB7CisgICAgICBHT09HTEVfRENIRUNLKHNpemUgPiBjaHVua19zaXplKTsKKyAgICAgIGlmIChuZXh0X2NodW5rXyA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGFwcGVuZChwdHIsIGNodW5rX3NpemUpOworICAgICAgcHRyICs9IGNodW5rX3NpemU7CisgICAgICBzaXplIC09IGNodW5rX3NpemU7CisgICAgICAvLyBUT0RPKGdlcmJlbnMpIE5leHQgY2FsbHMgTmV4dEJ1ZmZlciB3aGljaCBnZW5lcmF0ZXMgYnVmZmVycyB3aXRoCisgICAgICAvLyBvdmVybGFwIGFuZCB0aHVzIGluY3VycyBjb3N0IG9mIGNvcHlpbmcgdGhlIHNsb3AgcmVnaW9ucy4gVGhpcyBpcyBub3QKKyAgICAgIC8vIG5lY2Vzc2FyeSBmb3IgcmVhZGluZyBzdHJpbmdzLiBXZSBzaG91bGQganVzdCBjYWxsIE5leHQgYnVmZmVycy4KKyAgICAgIGlmIChsaW1pdF8gPD0ga1Nsb3BCeXRlcykgcmV0dXJuIG51bGxwdHI7CisgICAgICBwdHIgPSBOZXh0KCk7CisgICAgICBpZiAocHRyID09IG51bGxwdHIpIHJldHVybiBudWxscHRyOyAgLy8gcGFzc2VkIHRoZSBsaW1pdAorICAgICAgcHRyICs9IGtTbG9wQnl0ZXM7CisgICAgICBjaHVua19zaXplID0gYnVmZmVyX2VuZF8gKyBrU2xvcEJ5dGVzIC0gcHRyOworICAgIH0gd2hpbGUgKHNpemUgPiBjaHVua19zaXplKTsKKyAgICBhcHBlbmQocHRyLCBzaXplKTsKKyAgICByZXR1cm4gcHRyICsgc2l6ZTsKKyAgfQorCisgIC8vIEFwcGVuZFVudGlsRW5kIGFwcGVuZHMgZGF0YSB1bnRpbCBhIGxpbWl0IChlaXRoZXIgYSBQdXNoTGltaXQgb3IgZW5kIG9mCisgIC8vIHN0cmVhbS4gTm9ybWFsIHBheWxvYWRzIGFyZSBmcm9tIGxlbmd0aCBkZWxpbWl0ZWQgZmllbGRzIHdoaWNoIGhhdmUgYW4KKyAgLy8gZXhwbGljaXQgc2l6ZS4gUmVhZGluZyB1bnRpbCBsaW1pdCBvbmx5IGNvbWVzIHdoZW4gdGhlIHN0cmluZyB0YWtlcworICAvLyB0aGUgcGxhY2Ugb2YgYSBwcm90b2J1ZiwgaWUgUmF3TWVzc2FnZS9TdHJpbmdSYXdNZXNzYWdlLCBsYXp5IGZpZWxkcyBhbmQKKyAgLy8gaW1wbGljaXQgd2VhayBtZXNzYWdlcy4gV2Uga2VlcCB0aGVzZSBtZXRob2RzIHByaXZhdGUgYW5kIGZyaWVuZCB0aGVtLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQT4KKyAgY29uc3QgY2hhciogQXBwZW5kVW50aWxFbmQoY29uc3QgY2hhciogcHRyLCBjb25zdCBBJiBhcHBlbmQpIHsKKyAgICBpZiAocHRyIC0gYnVmZmVyX2VuZF8gPiBsaW1pdF8pIHJldHVybiBudWxscHRyOworICAgIHdoaWxlIChsaW1pdF8gPiBrU2xvcEJ5dGVzKSB7CisgICAgICBzaXplX3QgY2h1bmtfc2l6ZSA9IGJ1ZmZlcl9lbmRfICsga1Nsb3BCeXRlcyAtIHB0cjsKKyAgICAgIGFwcGVuZChwdHIsIGNodW5rX3NpemUpOworICAgICAgcHRyID0gTmV4dCgpOworICAgICAgaWYgKHB0ciA9PSBudWxscHRyKSByZXR1cm4gbGltaXRfZW5kXzsKKyAgICAgIHB0ciArPSBrU2xvcEJ5dGVzOworICAgIH0KKyAgICBhdXRvIGVuZCA9IGJ1ZmZlcl9lbmRfICsgbGltaXRfOworICAgIEdPT0dMRV9EQ0hFQ0soZW5kID49IHB0cik7CisgICAgYXBwZW5kKHB0ciwgZW5kIC0gcHRyKTsKKyAgICByZXR1cm4gZW5kOworICB9CisKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIGNvbnN0IGNoYXIqIEFwcGVuZFN0cmluZyhjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHN0cikgeworICAgIHJldHVybiBBcHBlbmRVbnRpbEVuZCgKKyAgICAgICAgcHRyLCBbc3RyXShjb25zdCBjaGFyKiBwLCBwdHJkaWZmX3QgcykgeyBzdHItPmFwcGVuZChwLCBzKTsgfSk7CisgIH0KKyAgZnJpZW5kIGNsYXNzIEltcGxpY2l0V2Vha01lc3NhZ2U7Cit9OworCit1c2luZyBMYXp5RWFnZXJWZXJpZnlGblR5cGUgPSBjb25zdCBjaGFyKiAoKikoY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlQ29udGV4dCogY3R4KTsKK3VzaW5nIExhenlFYWdlclZlcmlmeUZuUmVmID0gc3RkOjpyZW1vdmVfcG9pbnRlcjxMYXp5RWFnZXJWZXJpZnlGblR5cGU+Ojp0eXBlJjsKKworLy8gUGFyc2VDb250ZXh0IGhvbGRzIGFsbCBkYXRhIHRoYXQgaXMgZ2xvYmFsIHRvIHRoZSBlbnRpcmUgcGFyc2UuIE1vc3QKKy8vIGltcG9ydGFudGx5IGl0IGNvbnRhaW5zIHRoZSBpbnB1dCBzdHJlYW0sIGJ1dCBhbHNvIHJlY3Vyc2lvbiBkZXB0aCBhbmQgYWxzbworLy8gc3RvcmVzIHRoZSBlbmQgZ3JvdXAgdGFnLCBpbiBjYXNlIGEgcGFyc2VyIGVuZGVkIG9uIGEgZW5kZ3JvdXAsIHRvIHZlcmlmeQorLy8gbWF0Y2hpbmcgc3RhcnQvZW5kIGdyb3VwIHRhZ3MuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgUGFyc2VDb250ZXh0IDogcHVibGljIEVwc0NvcHlJbnB1dFN0cmVhbSB7CisgcHVibGljOgorICBzdHJ1Y3QgRGF0YSB7CisgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wgPSBudWxscHRyOworICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gbnVsbHB0cjsKKyAgICBBcmVuYSogYXJlbmEgPSBudWxscHRyOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgorICBQYXJzZUNvbnRleHQoaW50IGRlcHRoLCBib29sIGFsaWFzaW5nLCBjb25zdCBjaGFyKiogc3RhcnQsIFQmJi4uLiBhcmdzKQorICAgICAgOiBFcHNDb3B5SW5wdXRTdHJlYW0oYWxpYXNpbmcpLCBkZXB0aF8oZGVwdGgpIHsKKyAgICAqc3RhcnQgPSBJbml0RnJvbShzdGQ6OmZvcndhcmQ8VD4oYXJncykuLi4pOworICB9CisKKyAgdm9pZCBUcmFja0NvcnJlY3RFbmRpbmcoKSB7IGdyb3VwX2RlcHRoXyA9IDA7IH0KKworICBib29sIERvbmUoY29uc3QgY2hhcioqIHB0cikgeyByZXR1cm4gRG9uZVdpdGhDaGVjayhwdHIsIGdyb3VwX2RlcHRoXyk7IH0KKworICBpbnQgZGVwdGgoKSBjb25zdCB7IHJldHVybiBkZXB0aF87IH0KKworICBEYXRhJiBkYXRhKCkgeyByZXR1cm4gZGF0YV87IH0KKyAgY29uc3QgRGF0YSYgZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfOyB9CisKKyAgY29uc3QgY2hhciogUGFyc2VNZXNzYWdlKE1lc3NhZ2VMaXRlKiBtc2csIGNvbnN0IGNoYXIqIHB0cik7CisKKyAgLy8gU3Bhd25zIGEgY2hpbGQgcGFyc2luZyBjb250ZXh0IHRoYXQgaW5oZXJpdHMga2V5IHByb3BlcnRpZXMuIE5ldyBjb250ZXh0CisgIC8vIGluaGVyaXRzIHRoZSBmb2xsb3dpbmc6CisgIC8vIC0tZGVwdGhfLCBkYXRhXywgY2hlY2tfcmVxdWlyZWRfZmllbGRzXywgbGF6eV9wYXJzZV9tb2RlXworICAvLyBUaGUgc3Bhd25lZCBjb250ZXh0IGFsd2F5cyBkaXNhYmxlcyBhbGlhc2luZyAoZGlmZmVyZW50IGlucHV0KS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFQ+CisgIFBhcnNlQ29udGV4dCBTcGF3bihjb25zdCBjaGFyKiogc3RhcnQsIFQmJi4uLiBhcmdzKSB7CisgICAgUGFyc2VDb250ZXh0IHNwYXduZWQoZGVwdGhfLCBmYWxzZSwgc3RhcnQsIHN0ZDo6Zm9yd2FyZDxUPihhcmdzKS4uLik7CisgICAgLy8gVHJhbnNmZXIga2V5IGNvbnRleHQgc3RhdGVzLgorICAgIHNwYXduZWQuZGF0YV8gPSBkYXRhXzsKKyAgICByZXR1cm4gc3Bhd25lZDsKKyAgfQorCisgIC8vIFRoaXMgb3ZlcmxvYWQgc3VwcG9ydHMgdGhvc2UgZmV3IGNhc2VzIHdoZXJlIFBhcnNlTWVzc2FnZSBpcyBjYWxsZWQKKyAgLy8gb24gYSBjbGFzcyB0aGF0IGlzIG5vdCBhY3R1YWxseSBhIHByb3RvIG1lc3NhZ2UuCisgIC8vIFRPRE8oam9yZyk6IEVsaW1pbmF0ZSB0aGlzIHVzZSBjYXNlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2Jhc2Vfb2Y8TWVzc2FnZUxpdGUsIFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+Ojp0eXBlID0gdHJ1ZT4KKyAgUFJPVE9CVUZfTk9ESVNDQVJEIGNvbnN0IGNoYXIqIFBhcnNlTWVzc2FnZShUKiBtc2csIGNvbnN0IGNoYXIqIHB0cik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX05PRElTQ0FSRCBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIGNvbnN0IGNoYXIqIFBhcnNlR3JvdXAoCisgICAgICBUKiBtc2csIGNvbnN0IGNoYXIqIHB0ciwgdWludDMyX3QgdGFnKSB7CisgICAgaWYgKC0tZGVwdGhfIDwgMCkgcmV0dXJuIG51bGxwdHI7CisgICAgZ3JvdXBfZGVwdGhfKys7CisgICAgcHRyID0gbXNnLT5fSW50ZXJuYWxQYXJzZShwdHIsIHRoaXMpOworICAgIGdyb3VwX2RlcHRoXy0tOworICAgIGRlcHRoXysrOworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCFDb25zdW1lRW5kR3JvdXAodGFnKSkpIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBwdHI7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE91dC1vZi1saW5lIHJvdXRpbmUgdG8gc2F2ZSBzcGFjZSBpbiBQYXJzZUNvbnRleHQ6OlBhcnNlTWVzc2FnZTxUPgorICAvLyAgIGludCBvbGQ7CisgIC8vICAgcHRyID0gUmVhZFNpemVBbmRQdXNoTGltaXRBbmREZXB0aChwdHIsICZvbGQpCisgIC8vIGlzIGVxdWl2YWxlbnQgdG86CisgIC8vICAgaW50IHNpemUgPSBSZWFkU2l6ZSgmcHRyKTsKKyAgLy8gICBpZiAoIXB0cikgcmV0dXJuIG51bGxwdHI7CisgIC8vICAgaW50IG9sZCA9IFB1c2hMaW1pdChwdHIsIHNpemUpOworICAvLyAgIGlmICgtLWRlcHRoXyA8IDApIHJldHVybiBudWxscHRyOworICBQUk9UT0JVRl9OT0RJU0NBUkQgY29uc3QgY2hhciogUmVhZFNpemVBbmRQdXNoTGltaXRBbmREZXB0aChjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogb2xkX2xpbWl0KTsKKworICAvLyBUaGUgY29udGV4dCBrZWVwcyBhbiBpbnRlcm5hbCBzdGFjayB0byBrZWVwIHRyYWNrIG9mIHRoZSByZWN1cnNpdmUKKyAgLy8gcGFydCBvZiB0aGUgcGFyc2Ugc3RhdGUuCisgIC8vIEN1cnJlbnQgZGVwdGggb2YgdGhlIGFjdGl2ZSBwYXJzZXIsIGRlcHRoIGNvdW50cyBkb3duLgorICAvLyBUaGlzIGlzIHVzZWQgdG8gbGltaXQgcmVjdXJzaW9uIGRlcHRoICh0byBwcmV2ZW50IG92ZXJmbG93IG9uIG1hbGljaW91cworICAvLyBkYXRhKSwgYnV0IGlzIGFsc28gdXNlZCB0byBpbmRleCBpbiBzdGFja18gdG8gc3RvcmUgdGhlIGN1cnJlbnQgc3RhdGUuCisgIGludCBkZXB0aF87CisgIC8vIFVuZm9ydHVuYXRlbHkgbmVjZXNzYXJ5IGZvciB0aGUgZnJpbmdlIGNhc2Ugb2YgZW5kaW5nIG9uIDAgb3IgZW5kLWdyb3VwIHRhZworICAvLyBpbiB0aGUgbGFzdCBrU2xvcEJ5dGVzIG9mIGEgWmVyb0NvcHlJbnB1dFN0cmVhbSBjaHVuay4KKyAgaW50IGdyb3VwX2RlcHRoXyA9IElOVF9NSU47CisgIERhdGEgZGF0YV87Cit9OworCit0ZW1wbGF0ZSA8dWludDMyX3QgdGFnPgorYm9vbCBFeHBlY3RUYWcoY29uc3QgY2hhciogcHRyKSB7CisgIGlmICh0YWcgPCAxMjgpIHsKKyAgICByZXR1cm4gKnB0ciA9PSBzdGF0aWNfY2FzdDxjaGFyPih0YWcpOworICB9IGVsc2UgeworICAgIHN0YXRpY19hc3NlcnQodGFnIDwgMTI4ICogMTI4LCAiV2Ugb25seSBleHBlY3QgdGFncyBmb3IgMSBvciAyIGJ5dGVzIik7CisgICAgY2hhciBidWZbMl0gPSB7c3RhdGljX2Nhc3Q8Y2hhcj4odGFnIHwgMHg4MCksIHN0YXRpY19jYXN0PGNoYXI+KHRhZyA+PiA3KX07CisgICAgcmV0dXJuIHN0ZDo6bWVtY21wKHB0ciwgYnVmLCAyKSA9PSAwOworICB9Cit9CisKK3RlbXBsYXRlIDxpbnQ+CitzdHJ1Y3QgRW5kaWFuSGVscGVyOworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IEVuZGlhbkhlbHBlcjwxPiB7CisgIHN0YXRpYyB1aW50OF90IExvYWQoY29uc3Qgdm9pZCogcCkgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihwKTsgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBFbmRpYW5IZWxwZXI8Mj4geworICBzdGF0aWMgdWludDE2X3QgTG9hZChjb25zdCB2b2lkKiBwKSB7CisgICAgdWludDE2X3QgdG1wOworICAgIHN0ZDo6bWVtY3B5KCZ0bXAsIHAsIDIpOworICAgIHJldHVybiBsaXR0bGVfZW5kaWFuOjpUb0hvc3QodG1wKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBFbmRpYW5IZWxwZXI8ND4geworICBzdGF0aWMgdWludDMyX3QgTG9hZChjb25zdCB2b2lkKiBwKSB7CisgICAgdWludDMyX3QgdG1wOworICAgIHN0ZDo6bWVtY3B5KCZ0bXAsIHAsIDQpOworICAgIHJldHVybiBsaXR0bGVfZW5kaWFuOjpUb0hvc3QodG1wKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBFbmRpYW5IZWxwZXI8OD4geworICBzdGF0aWMgdWludDY0X3QgTG9hZChjb25zdCB2b2lkKiBwKSB7CisgICAgdWludDY0X3QgdG1wOworICAgIHN0ZDo6bWVtY3B5KCZ0bXAsIHAsIDgpOworICAgIHJldHVybiBsaXR0bGVfZW5kaWFuOjpUb0hvc3QodG1wKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIFVuYWxpZ25lZExvYWQoY29uc3QgY2hhciogcCkgeworICBhdXRvIHRtcCA9IEVuZGlhbkhlbHBlcjxzaXplb2YoVCk+OjpMb2FkKHApOworICBUIHJlczsKKyAgbWVtY3B5KCZyZXMsICZ0bXAsIHNpemVvZihUKSk7CisgIHJldHVybiByZXM7Cit9CisKK1BST1RPQlVGX0VYUE9SVAorc3RkOjpwYWlyPGNvbnN0IGNoYXIqLCB1aW50MzJfdD4gVmFyaW50UGFyc2VTbG93MzIoY29uc3QgY2hhciogcCwgdWludDMyX3QgcmVzKTsKK1BST1RPQlVGX0VYUE9SVAorc3RkOjpwYWlyPGNvbnN0IGNoYXIqLCB1aW50NjRfdD4gVmFyaW50UGFyc2VTbG93NjQoY29uc3QgY2hhciogcCwgdWludDMyX3QgcmVzKTsKKworaW5saW5lIGNvbnN0IGNoYXIqIFZhcmludFBhcnNlU2xvdyhjb25zdCBjaGFyKiBwLCB1aW50MzJfdCByZXMsIHVpbnQzMl90KiBvdXQpIHsKKyAgYXV0byB0bXAgPSBWYXJpbnRQYXJzZVNsb3czMihwLCByZXMpOworICAqb3V0ID0gdG1wLnNlY29uZDsKKyAgcmV0dXJuIHRtcC5maXJzdDsKK30KKworaW5saW5lIGNvbnN0IGNoYXIqIFZhcmludFBhcnNlU2xvdyhjb25zdCBjaGFyKiBwLCB1aW50MzJfdCByZXMsIHVpbnQ2NF90KiBvdXQpIHsKKyAgYXV0byB0bXAgPSBWYXJpbnRQYXJzZVNsb3c2NChwLCByZXMpOworICAqb3V0ID0gdG1wLnNlY29uZDsKKyAgcmV0dXJuIHRtcC5maXJzdDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitQUk9UT0JVRl9OT0RJU0NBUkQgY29uc3QgY2hhciogVmFyaW50UGFyc2UoY29uc3QgY2hhciogcCwgVCogb3V0KSB7CisgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocCk7CisgIHVpbnQzMl90IHJlcyA9IHB0clswXTsKKyAgaWYgKCEocmVzICYgMHg4MCkpIHsKKyAgICAqb3V0ID0gcmVzOworICAgIHJldHVybiBwICsgMTsKKyAgfQorICB1aW50MzJfdCBieXRlID0gcHRyWzFdOworICByZXMgKz0gKGJ5dGUgLSAxKSA8PCA3OworICBpZiAoIShieXRlICYgMHg4MCkpIHsKKyAgICAqb3V0ID0gcmVzOworICAgIHJldHVybiBwICsgMjsKKyAgfQorICByZXR1cm4gVmFyaW50UGFyc2VTbG93KHAsIHJlcywgb3V0KTsKK30KKworLy8gVXNlZCBmb3IgdGFncywgY291bGQgcmVhZCB1cCB0byA1IGJ5dGVzIHdoaWNoIG11c3QgYmUgYXZhaWxhYmxlLgorLy8gQ2FsbGVyIG11c3QgZW5zdXJlIGl0cyBzYWZlIHRvIGNhbGwuCisKK1BST1RPQlVGX0VYUE9SVAorc3RkOjpwYWlyPGNvbnN0IGNoYXIqLCB1aW50MzJfdD4gUmVhZFRhZ0ZhbGxiYWNrKGNvbnN0IGNoYXIqIHAsIHVpbnQzMl90IHJlcyk7CisKKy8vIFNhbWUgYXMgUGFyc2VWYXJpbnQgYnV0IG9ubHkgYWNjZXB0IDUgYnl0ZXMgYXQgbW9zdC4KK2lubGluZSBjb25zdCBjaGFyKiBSZWFkVGFnKGNvbnN0IGNoYXIqIHAsIHVpbnQzMl90KiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAvKm1heF90YWcqLyA9IDApIHsKKyAgdWludDMyX3QgcmVzID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocFswXSk7CisgIGlmIChyZXMgPCAxMjgpIHsKKyAgICAqb3V0ID0gcmVzOworICAgIHJldHVybiBwICsgMTsKKyAgfQorICB1aW50MzJfdCBzZWNvbmQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihwWzFdKTsKKyAgcmVzICs9IChzZWNvbmQgLSAxKSA8PCA3OworICBpZiAoc2Vjb25kIDwgMTI4KSB7CisgICAgKm91dCA9IHJlczsKKyAgICByZXR1cm4gcCArIDI7CisgIH0KKyAgYXV0byB0bXAgPSBSZWFkVGFnRmFsbGJhY2socCwgcmVzKTsKKyAgKm91dCA9IHRtcC5zZWNvbmQ7CisgIHJldHVybiB0bXAuZmlyc3Q7Cit9CisKKy8vIEFzIGFib3ZlLCBidXQgb3B0aW1pemVkIHRvIGNvbnN1bWUgdmVyeSBmZXcgcmVnaXN0ZXJzIHdoaWxlIHN0aWxsIGJlaW5nIGZhc3QsCisvLyBSZWFkVGFnSW5saW5lZCBpcyB1c2VmdWwgZm9yIGNhbGxlcnMgdGhhdCBkb24ndCBtaW5kIHRoZSBleHRyYSBjb2RlIGJ1dCB3b3VsZAorLy8gbGlrZSB0byBhdm9pZCBhbiBleHRlcm4gZnVuY3Rpb24gY2FsbCBjYXVzaW5nIHNwaWxscyBpbnRvIHRoZSBzdGFjay4KKy8vCisvLyBUd28gc3VwcG9ydCByb3V0aW5lcyBmb3IgUmVhZFRhZ0lubGluZWQgY29tZSBmaXJzdC4uLgordGVtcGxhdGUgPGNsYXNzIFQ+CitQUk9UT0JVRl9OT0RJU0NBUkQgUFJPVE9CVUZfQUxXQVlTX0lOTElORSBjb25zdGV4cHIgVCBSb3RhdGVMZWZ0KAorICAgIFQgeCwgaW50IHMpIG5vZXhjZXB0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFQ+KHggPDwgKHMgJiAoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6ZGlnaXRzIC0gMSkpKSB8CisgICAgICAgICBzdGF0aWNfY2FzdDxUPih4ID4+ICgoLXMpICYgKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0cyAtIDEpKSk7Cit9CisKK1BST1RPQlVGX05PRElTQ0FSRCBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB1aW50NjRfdAorUm90UmlnaHQ3QW5kUmVwbGFjZUxvd0J5dGUodWludDY0X3QgcmVzLCBjb25zdCBjaGFyJiBieXRlKSB7CisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQorICAvLyBUaGlzIHdpbGwgb25seSB1c2Ugb25lIHJlZ2lzdGVyIGZvciBgcmVzYC4KKyAgLy8gYGJ5dGVgIGNvbWVzIGFzIGEgcmVmZXJlbmNlIHRvIGFsbG93IHRoZSBjb21waWxlciB0byBnZW5lcmF0ZSBjb2RlIGxpa2U6CisgIC8vCisgIC8vICAgcm9ycSAgICAkNywgJXJjeAorICAvLyAgIG1vdmIgICAgMSglcmF4KSwgJWNsCisgIC8vCisgIC8vIHdoaWNoIGF2b2lkcyBsb2FkaW5nIHRoZSBpbmNvbWluZyBieXRlcyBpbnRvIGEgc2VwYXJhdGUgcmVnaXN0ZXIgZmlyc3QuCisgIGFzbSgicm9yICQ3LCUwXG5cdCIKKyAgICAgICJtb3ZiICUxLCViMCIKKyAgICAgIDogIityIihyZXMpCisgICAgICA6ICJtIihieXRlKSk7CisjZWxzZQorICByZXMgPSBSb3RhdGVMZWZ0KHJlcywgLTcpOworICByZXMgPSByZXMgJiB+MHhGRjsKKyAgcmVzIHw9IDB4RkYgJiBieXRlOworI2VuZGlmCisgIHJldHVybiByZXM7Cit9OworCitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQorY29uc3QgY2hhciogUmVhZFRhZ0lubGluZWQoY29uc3QgY2hhciogcHRyLCB1aW50MzJfdCogb3V0KSB7CisgIHVpbnQ2NF90IHJlcyA9IDB4RkYgJiBwdHJbMF07CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKHJlcyA+PSAxMjgpKSB7CisgICAgcmVzID0gUm90UmlnaHQ3QW5kUmVwbGFjZUxvd0J5dGUocmVzLCBwdHJbMV0pOworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKHJlcyAmIDB4ODApKSB7CisgICAgICByZXMgPSBSb3RSaWdodDdBbmRSZXBsYWNlTG93Qnl0ZShyZXMsIHB0clsyXSk7CisgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShyZXMgJiAweDgwKSkgeworICAgICAgICByZXMgPSBSb3RSaWdodDdBbmRSZXBsYWNlTG93Qnl0ZShyZXMsIHB0clszXSk7CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKHJlcyAmIDB4ODApKSB7CisgICAgICAgICAgLy8gTm90ZTogdGhpcyB3b3VsZG4ndCB3b3JrIGlmIHJlcyB3ZXJlIDMyLWJpdCwKKyAgICAgICAgICAvLyBiZWNhdXNlIHRoZW4gcmVwbGFjaW5nIHRoZSBsb3cgYnl0ZSB3b3VsZCBvdmVyd3JpdGUKKyAgICAgICAgICAvLyB0aGUgYm90dG9tIDQgYml0cyBvZiB0aGUgcmVzdWx0LgorICAgICAgICAgIHJlcyA9IFJvdFJpZ2h0N0FuZFJlcGxhY2VMb3dCeXRlKHJlcywgcHRyWzRdKTsKKyAgICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShyZXMgJiAweDgwKSkgeworICAgICAgICAgICAgLy8gVGhlIHByb3RvIGZvcm1hdCBkb2VzIG5vdCBwZXJtaXQgbG9uZ2VyIHRoYW4gNS1ieXRlIGVuY29kaW5ncyBmb3IKKyAgICAgICAgICAgIC8vIHRhZ3MuCisgICAgICAgICAgICAqb3V0ID0gMDsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgIH0KKyAgICAgICAgICAqb3V0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFJvdGF0ZUxlZnQocmVzLCAyOCkpOworI2lmIGRlZmluZWQoX19HTlVDX18pCisgICAgICAgICAgLy8gTm90ZTogdGhpcyBhc20gc3RhdGVtZW50IHByZXZlbnRzIHRoZSBjb21waWxlciBmcm9tCisgICAgICAgICAgLy8gdHJ5aW5nIHRvIHNoYXJlIHRoZSAicmV0dXJuIHB0ciArIGNvbnN0YW50IiBhbW9uZyBhbGwKKyAgICAgICAgICAvLyBicmFuY2hlcy4KKyAgICAgICAgICBhc20oIiIgOiAiK3IiKHB0cikpOworI2VuZGlmCisgICAgICAgICAgcmV0dXJuIHB0ciArIDU7CisgICAgICAgIH0KKyAgICAgICAgKm91dCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihSb3RhdGVMZWZ0KHJlcywgMjEpKTsKKyAgICAgICAgcmV0dXJuIHB0ciArIDQ7CisgICAgICB9CisgICAgICAqb3V0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFJvdGF0ZUxlZnQocmVzLCAxNCkpOworICAgICAgcmV0dXJuIHB0ciArIDM7CisgICAgfQorICAgICpvdXQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oUm90YXRlTGVmdChyZXMsIDcpKTsKKyAgICByZXR1cm4gcHRyICsgMjsKKyAgfQorICAqb3V0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJlcyk7CisgIHJldHVybiBwdHIgKyAxOworfQorCisvLyBEZWNvZGUgMiBjb25zZWN1dGl2ZSBieXRlcyBvZiBhIHZhcmludCBhbmQgcmV0dXJucyB0aGUgdmFsdWUsIHNoaWZ0ZWQgbGVmdAorLy8gYnkgMS4gSXQgc2ltdWx0YW5lb3VzIHVwZGF0ZXMgKnB0ciB0byAqcHRyICsgMSBvciAqcHRyICsgMiBkZXBlbmRpbmcgaWYgdGhlCisvLyBmaXJzdCBieXRlJ3MgY29udGludWF0aW9uIGJpdCBpcyBzZXQuCisvLyBJZiBiaXQgMTUgb2YgcmV0dXJuIHZhbHVlIGlzIHNldCAoZXF1aXZhbGVudCB0byB0aGUgY29udGludWF0aW9uIGJpdHMgb2YgYm90aAorLy8gYnl0ZXMgYmVpbmcgc2V0KSB0aGUgdmFyaW50IGNvbnRpbnVlcywgb3RoZXJ3aXNlIHRoZSBwYXJzZSBpcyBkb25lLiBPbiB4ODYKKy8vIG1vdnN4IGVheCwgZGlsCisvLyBhbmQgZWRpLCBlYXgKKy8vIGFkZCBlYXgsIGVkaQorLy8gYWRjIFtyc2ldLCAxCitpbmxpbmUgdWludDMyX3QgRGVjb2RlVHdvQnl0ZXMoY29uc3QgY2hhcioqIHB0cikgeworICB1aW50MzJfdCB2YWx1ZSA9IFVuYWxpZ25lZExvYWQ8dWludDE2X3Q+KCpwdHIpOworICAvLyBTaWduIGV4dGVuZCB0aGUgbG93IGJ5dGUgY29udGludWF0aW9uIGJpdAorICB1aW50MzJfdCB4ID0gc3RhdGljX2Nhc3Q8aW50OF90Pih2YWx1ZSk7CisgIHZhbHVlICY9IHg7ICAvLyBNYXNrIG91dCB0aGUgaGlnaCBieXRlIGlmZiBubyBjb250aW51YXRpb24KKyAgLy8gVGhpcyBhZGQgaXMgYW4gYW1hemluZyBvcGVyYXRpb24sIGl0IGNhbmNlbHMgdGhlIGxvdyBieXRlIGNvbnRpbnVhdGlvbiBiaXQKKyAgLy8gZnJvbSB5IHRyYW5zZmVycmluZyBpdCB0byB0aGUgY2FycnkuIFNpbXVsdGFuZW91c2x5IGl0IGFsc28gc2hpZnRzIHRoZSA3CisgIC8vIExTQiBsZWZ0IGJ5IG9uZSB0aWdodGx5IGFnYWluc3QgaGlnaCBieXRlIHZhcmludCBiaXRzLiBIZW5jZSB2YWx1ZSBub3cKKyAgLy8gY29udGFpbnMgdGhlIHVucGFja2VkIHZhbHVlIHNoaWZ0ZWQgbGVmdCBieSAxLgorICB2YWx1ZSArPSB4OworICAvLyBVc2UgdGhlIGNhcnJ5IHRvIHVwZGF0ZSB0aGUgcHRyIGFwcHJvcHJpYXRlbHkuCisgICpwdHIgKz0gdmFsdWUgPCB4ID8gMiA6IDE7CisgIHJldHVybiB2YWx1ZTsKK30KKworLy8gTW9yZSBlZmZpY2llbnQgdmFyaW50IHBhcnNpbmcgZm9yIGJpZyB2YXJpbnRzCitpbmxpbmUgY29uc3QgY2hhciogUGFyc2VCaWdWYXJpbnQoY29uc3QgY2hhciogcCwgdWludDY0X3QqIG91dCkgeworICBhdXRvIHBuZXcgPSBwOworICBhdXRvIHRtcCA9IERlY29kZVR3b0J5dGVzKCZwbmV3KTsKKyAgdWludDY0X3QgcmVzID0gdG1wID4+IDE7CisgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8c3RkOjppbnQxNl90Pih0bXApID49IDApKSB7CisgICAgKm91dCA9IHJlczsKKyAgICByZXR1cm4gcG5ldzsKKyAgfQorICBmb3IgKHN0ZDo6dWludDMyX3QgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICBwbmV3ID0gcCArIDIgKiBpOworICAgIHRtcCA9IERlY29kZVR3b0J5dGVzKCZwbmV3KTsKKyAgICByZXMgKz0gKHN0YXRpY19jYXN0PHN0ZDo6dWludDY0X3Q+KHRtcCkgLSAyKSA8PCAoMTQgKiBpIC0gMSk7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDxzdGQ6OmludDE2X3Q+KHRtcCkgPj0gMCkpIHsKKyAgICAgICpvdXQgPSByZXM7CisgICAgICByZXR1cm4gcG5ldzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK1BST1RPQlVGX0VYUE9SVAorc3RkOjpwYWlyPGNvbnN0IGNoYXIqLCBpbnQzMl90PiBSZWFkU2l6ZUZhbGxiYWNrKGNvbnN0IGNoYXIqIHAsIHVpbnQzMl90IGZpcnN0KTsKKy8vIFVzZWQgZm9yIHRhZ3MsIGNvdWxkIHJlYWQgdXAgdG8gNSBieXRlcyB3aGljaCBtdXN0IGJlIGF2YWlsYWJsZS4gQWRkaXRpb25hbGx5CisvLyBpdCBtYWtlcyBzdXJlIHRoZSB1bnNpZ25lZCB2YWx1ZSBmaXRzIGEgaW50MzJfdCwgb3RoZXJ3aXNlIHJldHVybnMgbnVsbHB0ci4KKy8vIENhbGxlciBtdXN0IGVuc3VyZSBpdHMgc2FmZSB0byBjYWxsLgoraW5saW5lIHVpbnQzMl90IFJlYWRTaXplKGNvbnN0IGNoYXIqKiBwcCkgeworICBhdXRvIHAgPSAqcHA7CisgIHVpbnQzMl90IHJlcyA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHBbMF0pOworICBpZiAocmVzIDwgMTI4KSB7CisgICAgKnBwID0gcCArIDE7CisgICAgcmV0dXJuIHJlczsKKyAgfQorICBhdXRvIHggPSBSZWFkU2l6ZUZhbGxiYWNrKHAsIHJlcyk7CisgICpwcCA9IHguZmlyc3Q7CisgIHJldHVybiB4LnNlY29uZDsKK30KKworLy8gU29tZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gc2ltcGxpZnkgdGhlIGdlbmVyYXRlZCBwYXJzZSBsb29wIGNvZGUuCisvLyBSZXR1cm5pbmcgdGhlIHZhbHVlIGFuZCB1cGRhdGluZyB0aGUgYnVmZmVyIHBvaW50ZXIgYWxsb3dzIGZvciBuaWNlcgorLy8gZnVuY3Rpb24gY29tcG9zaXRpb24uIFdlIHJlbHkgb24gdGhlIGNvbXBpbGVyIHRvIGlubGluZSB0aGlzLgorLy8gQWxzbyBpbiBkZWJ1ZyBjb21waWxlcyBoYXZpbmcgbG9jYWwgc2NvcGVkIHZhcmlhYmxlcyB0ZW5kIHRvIGdlbmVyYXRlZAorLy8gc3RhY2sgZnJhbWVzIHRoYXQgc2NhbGUgYXMgTyhudW0gZmllbGRzKS4KK2lubGluZSB1aW50NjRfdCBSZWFkVmFyaW50NjQoY29uc3QgY2hhcioqIHApIHsKKyAgdWludDY0X3QgdG1wOworICAqcCA9IFZhcmludFBhcnNlKCpwLCAmdG1wKTsKKyAgcmV0dXJuIHRtcDsKK30KKworaW5saW5lIHVpbnQzMl90IFJlYWRWYXJpbnQzMihjb25zdCBjaGFyKiogcCkgeworICB1aW50MzJfdCB0bXA7CisgICpwID0gVmFyaW50UGFyc2UoKnAsICZ0bXApOworICByZXR1cm4gdG1wOworfQorCitpbmxpbmUgaW50NjRfdCBSZWFkVmFyaW50WmlnWmFnNjQoY29uc3QgY2hhcioqIHApIHsKKyAgdWludDY0X3QgdG1wOworICAqcCA9IFZhcmludFBhcnNlKCpwLCAmdG1wKTsKKyAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdEZWNvZGU2NCh0bXApOworfQorCitpbmxpbmUgaW50MzJfdCBSZWFkVmFyaW50WmlnWmFnMzIoY29uc3QgY2hhcioqIHApIHsKKyAgdWludDY0X3QgdG1wOworICAqcCA9IFZhcmludFBhcnNlKCpwLCAmdG1wKTsKKyAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdEZWNvZGUzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0ZDo6aXNfYmFzZV9vZjxNZXNzYWdlTGl0ZSwgVD46OnZhbHVlLCBib29sPjo6dHlwZT4KK1BST1RPQlVGX05PRElTQ0FSRCBjb25zdCBjaGFyKiBQYXJzZUNvbnRleHQ6OlBhcnNlTWVzc2FnZShUKiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHRyKSB7CisgIGludCBvbGQ7CisgIHB0ciA9IFJlYWRTaXplQW5kUHVzaExpbWl0QW5kRGVwdGgocHRyLCAmb2xkKTsKKyAgcHRyID0gcHRyID8gbXNnLT5fSW50ZXJuYWxQYXJzZShwdHIsIHRoaXMpIDogbnVsbHB0cjsKKyAgZGVwdGhfKys7CisgIGlmICghUG9wTGltaXQob2xkKSkgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBwdHI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUYWcsIHR5cGVuYW1lIFQ+Citjb25zdCBjaGFyKiBFcHNDb3B5SW5wdXRTdHJlYW06OlJlYWRSZXBlYXRlZEZpeGVkKGNvbnN0IGNoYXIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnIGV4cGVjdGVkX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxUPiogb3V0KSB7CisgIGRvIHsKKyAgICBvdXQtPkFkZChVbmFsaWduZWRMb2FkPFQ+KHB0cikpOworICAgIHB0ciArPSBzaXplb2YoVCk7CisgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UocHRyID49IGxpbWl0X2VuZF8pKSByZXR1cm4gcHRyOworICB9IHdoaWxlIChVbmFsaWduZWRMb2FkPFRhZz4ocHRyKSA9PSBleHBlY3RlZF90YWcgJiYgKHB0ciArPSBzaXplb2YoVGFnKSkpOworICByZXR1cm4gcHRyOworfQorCisvLyBBZGQgYW55IG9mIHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gZGVidWcgd2hpY2ggcGFyc2UgZnVuY3Rpb24gaXMgZmFpbGluZy4KKworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVNTRVJUX1JFVFVSTihwcmVkaWNhdGUsIHJldCkgXAorICBpZiAoIShwcmVkaWNhdGUpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiAgOjpyYWlzZShTSUdJTlQpOyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogIEdPT0dMRV9MT0coRVJST1IpIDw8ICJQYXJzZSBmYWlsdXJlIjsgICovICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUEFSU0VSX0FTU0VSVChwcmVkaWNhdGUpIFwKKyAgR09PR0xFX1BST1RPQlVGX0FTU0VSVF9SRVRVUk4ocHJlZGljYXRlLCBudWxscHRyKQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NvbnN0IGNoYXIqIEVwc0NvcHlJbnB1dFN0cmVhbTo6UmVhZFBhY2tlZEZpeGVkKGNvbnN0IGNoYXIqIHB0ciwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPFQ+KiBvdXQpIHsKKyAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgaW50IG5ieXRlcyA9IGJ1ZmZlcl9lbmRfICsga1Nsb3BCeXRlcyAtIHB0cjsKKyAgd2hpbGUgKHNpemUgPiBuYnl0ZXMpIHsKKyAgICBpbnQgbnVtID0gbmJ5dGVzIC8gc2l6ZW9mKFQpOworICAgIGludCBvbGRfZW50cmllcyA9IG91dC0+c2l6ZSgpOworICAgIG91dC0+UmVzZXJ2ZShvbGRfZW50cmllcyArIG51bSk7CisgICAgaW50IGJsb2NrX3NpemUgPSBudW0gKiBzaXplb2YoVCk7CisgICAgYXV0byBkc3QgPSBvdXQtPkFkZE5BbHJlYWR5UmVzZXJ2ZWQobnVtKTsKKyNpZmRlZiBQUk9UT0JVRl9MSVRUTEVfRU5ESUFOCisgICAgc3RkOjptZW1jcHkoZHN0LCBwdHIsIGJsb2NrX3NpemUpOworI2Vsc2UKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKQorICAgICAgZHN0W2ldID0gVW5hbGlnbmVkTG9hZDxUPihwdHIgKyBpICogc2l6ZW9mKFQpKTsKKyNlbmRpZgorICAgIHNpemUgLT0gYmxvY2tfc2l6ZTsKKyAgICBpZiAobGltaXRfIDw9IGtTbG9wQnl0ZXMpIHJldHVybiBudWxscHRyOworICAgIHB0ciA9IE5leHQoKTsKKyAgICBpZiAocHRyID09IG51bGxwdHIpIHJldHVybiBudWxscHRyOworICAgIHB0ciArPSBrU2xvcEJ5dGVzIC0gKG5ieXRlcyAtIGJsb2NrX3NpemUpOworICAgIG5ieXRlcyA9IGJ1ZmZlcl9lbmRfICsga1Nsb3BCeXRlcyAtIHB0cjsKKyAgfQorICBpbnQgbnVtID0gc2l6ZSAvIHNpemVvZihUKTsKKyAgaW50IG9sZF9lbnRyaWVzID0gb3V0LT5zaXplKCk7CisgIG91dC0+UmVzZXJ2ZShvbGRfZW50cmllcyArIG51bSk7CisgIGludCBibG9ja19zaXplID0gbnVtICogc2l6ZW9mKFQpOworICBhdXRvIGRzdCA9IG91dC0+QWRkTkFscmVhZHlSZXNlcnZlZChudW0pOworI2lmZGVmIFBST1RPQlVGX0xJVFRMRV9FTkRJQU4KKyAgc3RkOjptZW1jcHkoZHN0LCBwdHIsIGJsb2NrX3NpemUpOworI2Vsc2UKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgZHN0W2ldID0gVW5hbGlnbmVkTG9hZDxUPihwdHIgKyBpICogc2l6ZW9mKFQpKTsKKyNlbmRpZgorICBwdHIgKz0gYmxvY2tfc2l6ZTsKKyAgaWYgKHNpemUgIT0gYmxvY2tfc2l6ZSkgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBwdHI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBZGQ+Citjb25zdCBjaGFyKiBSZWFkUGFja2VkVmFyaW50QXJyYXkoY29uc3QgY2hhciogcHRyLCBjb25zdCBjaGFyKiBlbmQsIEFkZCBhZGQpIHsKKyAgd2hpbGUgKHB0ciA8IGVuZCkgeworICAgIHVpbnQ2NF90IHZhcmludDsKKyAgICBwdHIgPSBWYXJpbnRQYXJzZShwdHIsICZ2YXJpbnQpOworICAgIGlmIChwdHIgPT0gbnVsbHB0cikgcmV0dXJuIG51bGxwdHI7CisgICAgYWRkKHZhcmludCk7CisgIH0KKyAgcmV0dXJuIHB0cjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEFkZD4KK2NvbnN0IGNoYXIqIEVwc0NvcHlJbnB1dFN0cmVhbTo6UmVhZFBhY2tlZFZhcmludChjb25zdCBjaGFyKiBwdHIsIEFkZCBhZGQpIHsKKyAgaW50IHNpemUgPSBSZWFkU2l6ZSgmcHRyKTsKKyAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgaW50IGNodW5rX3NpemUgPSBidWZmZXJfZW5kXyAtIHB0cjsKKyAgd2hpbGUgKHNpemUgPiBjaHVua19zaXplKSB7CisgICAgcHRyID0gUmVhZFBhY2tlZFZhcmludEFycmF5KHB0ciwgYnVmZmVyX2VuZF8sIGFkZCk7CisgICAgaWYgKHB0ciA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKKyAgICBpbnQgb3ZlcnJ1biA9IHB0ciAtIGJ1ZmZlcl9lbmRfOworICAgIEdPT0dMRV9EQ0hFQ0sob3ZlcnJ1biA+PSAwICYmIG92ZXJydW4gPD0ga1Nsb3BCeXRlcyk7CisgICAgaWYgKHNpemUgLSBjaHVua19zaXplIDw9IGtTbG9wQnl0ZXMpIHsKKyAgICAgIC8vIFRoZSBjdXJyZW50IGJ1ZmZlciBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCwgd2UgZG9uJ3QgbmVlZAorICAgICAgLy8gdG8gZmxpcCBidWZmZXJzLiBIb3dldmVyIHdlIG11c3QgcGFyc2UgZnJvbSBhIGJ1ZmZlciB3aXRoIGVub3VnaCBzcGFjZQorICAgICAgLy8gc28gd2UgYXJlIG5vdCBwcm9uZSB0byBhIGJ1ZmZlciBvdmVyZmxvdy4KKyAgICAgIGNoYXIgYnVmW2tTbG9wQnl0ZXMgKyAxMF0gPSB7fTsKKyAgICAgIHN0ZDo6bWVtY3B5KGJ1ZiwgYnVmZmVyX2VuZF8sIGtTbG9wQnl0ZXMpOworICAgICAgR09PR0xFX0NIRUNLX0xFKHNpemUgLSBjaHVua19zaXplLCBrU2xvcEJ5dGVzKTsKKyAgICAgIGF1dG8gZW5kID0gYnVmICsgKHNpemUgLSBjaHVua19zaXplKTsKKyAgICAgIGF1dG8gcmVzID0gUmVhZFBhY2tlZFZhcmludEFycmF5KGJ1ZiArIG92ZXJydW4sIGVuZCwgYWRkKTsKKyAgICAgIGlmIChyZXMgPT0gbnVsbHB0ciB8fCByZXMgIT0gZW5kKSByZXR1cm4gbnVsbHB0cjsKKyAgICAgIHJldHVybiBidWZmZXJfZW5kXyArIChyZXMgLSBidWYpOworICAgIH0KKyAgICBzaXplIC09IG92ZXJydW4gKyBjaHVua19zaXplOworICAgIEdPT0dMRV9EQ0hFQ0tfR1Qoc2l6ZSwgMCk7CisgICAgLy8gV2UgbXVzdCBmbGlwIGJ1ZmZlcnMKKyAgICBpZiAobGltaXRfIDw9IGtTbG9wQnl0ZXMpIHJldHVybiBudWxscHRyOworICAgIHB0ciA9IE5leHQoKTsKKyAgICBpZiAocHRyID09IG51bGxwdHIpIHJldHVybiBudWxscHRyOworICAgIHB0ciArPSBvdmVycnVuOworICAgIGNodW5rX3NpemUgPSBidWZmZXJfZW5kXyAtIHB0cjsKKyAgfQorICBhdXRvIGVuZCA9IHB0ciArIHNpemU7CisgIHB0ciA9IFJlYWRQYWNrZWRWYXJpbnRBcnJheShwdHIsIGVuZCwgYWRkKTsKKyAgcmV0dXJuIGVuZCA9PSBwdHIgPyBwdHIgOiBudWxscHRyOworfQorCisvLyBIZWxwZXIgZm9yIHZlcmlmaWNhdGlvbiBvZiB1dGY4CitQUk9UT0JVRl9FWFBPUlQKK2Jvb2wgVmVyaWZ5VVRGOChTdHJpbmdQaWVjZSBzLCBjb25zdCBjaGFyKiBmaWVsZF9uYW1lKTsKKworaW5saW5lIGJvb2wgVmVyaWZ5VVRGOChjb25zdCBzdGQ6OnN0cmluZyogcywgY29uc3QgY2hhciogZmllbGRfbmFtZSkgeworICByZXR1cm4gVmVyaWZ5VVRGOCgqcywgZmllbGRfbmFtZSk7Cit9CisKKy8vIEFsbCB0aGUgc3RyaW5nIHBhcnNlcnMgd2l0aCBvciB3aXRob3V0IFVURiBjaGVja2luZyBhbmQgZm9yIGFsbCBDVHlwZXMuCitQUk9UT0JVRl9OT0RJU0NBUkQgUFJPVE9CVUZfRVhQT1JUIGNvbnN0IGNoYXIqIElubGluZUdyZWVkeVN0cmluZ1BhcnNlcigKKyAgICBzdGQ6OnN0cmluZyogcywgY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCk7CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitQUk9UT0JVRl9OT0RJU0NBUkQgY29uc3QgY2hhciogRmllbGRQYXJzZXIodWludDY0X3QgdGFnLCBUJiBmaWVsZF9wYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCkgeworICB1aW50MzJfdCBudW1iZXIgPSB0YWcgPj4gMzsKKyAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQobnVtYmVyICE9IDApOworICB1c2luZyBXaXJlVHlwZSA9IGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGU7CisgIHN3aXRjaCAodGFnICYgNykgeworICAgIGNhc2UgV2lyZVR5cGU6OldJUkVUWVBFX1ZBUklOVDogeworICAgICAgdWludDY0X3QgdmFsdWU7CisgICAgICBwdHIgPSBWYXJpbnRQYXJzZShwdHIsICZ2YWx1ZSk7CisgICAgICBHT09HTEVfUFJPVE9CVUZfUEFSU0VSX0FTU0VSVChwdHIpOworICAgICAgZmllbGRfcGFyc2VyLkFkZFZhcmludChudW1iZXIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFdpcmVUeXBlOjpXSVJFVFlQRV9GSVhFRDY0OiB7CisgICAgICB1aW50NjRfdCB2YWx1ZSA9IFVuYWxpZ25lZExvYWQ8dWludDY0X3Q+KHB0cik7CisgICAgICBwdHIgKz0gODsKKyAgICAgIGZpZWxkX3BhcnNlci5BZGRGaXhlZDY0KG51bWJlciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgV2lyZVR5cGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6IHsKKyAgICAgIHB0ciA9IGZpZWxkX3BhcnNlci5QYXJzZUxlbmd0aERlbGltaXRlZChudW1iZXIsIHB0ciwgY3R4KTsKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9QQVJTRVJfQVNTRVJUKHB0cik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBXaXJlVHlwZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVA6IHsKKyAgICAgIHB0ciA9IGZpZWxkX3BhcnNlci5QYXJzZUdyb3VwKG51bWJlciwgcHRyLCBjdHgpOworICAgICAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFdpcmVUeXBlOjpXSVJFVFlQRV9FTkRfR1JPVVA6IHsKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBoYXBwZW4iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgV2lyZVR5cGU6OldJUkVUWVBFX0ZJWEVEMzI6IHsKKyAgICAgIHVpbnQzMl90IHZhbHVlID0gVW5hbGlnbmVkTG9hZDx1aW50MzJfdD4ocHRyKTsKKyAgICAgIHB0ciArPSA0OworICAgICAgZmllbGRfcGFyc2VyLkFkZEZpeGVkMzIobnVtYmVyLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBwdHI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorUFJPVE9CVUZfTk9ESVNDQVJEIGNvbnN0IGNoYXIqIFdpcmVGb3JtYXRQYXJzZXIoVCYgZmllbGRfcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VDb250ZXh0KiBjdHgpIHsKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gUmVhZFRhZyhwdHIsICZ0YWcpOworICAgIEdPT0dMRV9QUk9UT0JVRl9QQVJTRVJfQVNTRVJUKHB0ciAhPSBudWxscHRyKTsKKyAgICBpZiAodGFnID09IDAgfHwgKHRhZyAmIDcpID09IDQpIHsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgcmV0dXJuIHB0cjsKKyAgICB9CisgICAgcHRyID0gRmllbGRQYXJzZXIodGFnLCBmaWVsZF9wYXJzZXIsIHB0ciwgY3R4KTsKKyAgICBHT09HTEVfUFJPVE9CVUZfUEFSU0VSX0FTU0VSVChwdHIgIT0gbnVsbHB0cik7CisgIH0KKyAgcmV0dXJuIHB0cjsKK30KKworLy8gVGhlIHBhY2tlZCBwYXJzZXJzIHBhcnNlIHJlcGVhdGVkIG51bWVyaWMgcHJpbWl0aXZlcyBkaXJlY3RseSBpbnRvICB0aGUKKy8vIGNvcnJlc3BvbmRpbmcgZmllbGQKKworLy8gVGhlc2UgYXJlIHBhY2tlZCB2YXJpbnRzCitQUk9UT0JVRl9OT0RJU0NBUkQgUFJPVE9CVUZfRVhQT1JUIGNvbnN0IGNoYXIqIFBhY2tlZEludDMyUGFyc2VyKAorICAgIHZvaWQqIG9iamVjdCwgY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCk7CitQUk9UT0JVRl9OT0RJU0NBUkQgUFJPVE9CVUZfRVhQT1JUIGNvbnN0IGNoYXIqIFBhY2tlZFVJbnQzMlBhcnNlcigKKyAgICB2b2lkKiBvYmplY3QsIGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgpOworUFJPVE9CVUZfTk9ESVNDQVJEIFBST1RPQlVGX0VYUE9SVCBjb25zdCBjaGFyKiBQYWNrZWRJbnQ2NFBhcnNlcigKKyAgICB2b2lkKiBvYmplY3QsIGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgpOworUFJPVE9CVUZfTk9ESVNDQVJEIFBST1RPQlVGX0VYUE9SVCBjb25zdCBjaGFyKiBQYWNrZWRVSW50NjRQYXJzZXIoCisgICAgdm9pZCogb2JqZWN0LCBjb25zdCBjaGFyKiBwdHIsIFBhcnNlQ29udGV4dCogY3R4KTsKK1BST1RPQlVGX05PRElTQ0FSRCBQUk9UT0JVRl9FWFBPUlQgY29uc3QgY2hhciogUGFja2VkU0ludDMyUGFyc2VyKAorICAgIHZvaWQqIG9iamVjdCwgY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCk7CitQUk9UT0JVRl9OT0RJU0NBUkQgUFJPVE9CVUZfRVhQT1JUIGNvbnN0IGNoYXIqIFBhY2tlZFNJbnQ2NFBhcnNlcigKKyAgICB2b2lkKiBvYmplY3QsIGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgpOworUFJPVE9CVUZfTk9ESVNDQVJEIFBST1RPQlVGX0VYUE9SVCBjb25zdCBjaGFyKiBQYWNrZWRFbnVtUGFyc2VyKAorICAgIHZvaWQqIG9iamVjdCwgY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorUFJPVE9CVUZfTk9ESVNDQVJEIGNvbnN0IGNoYXIqIFBhY2tlZEVudW1QYXJzZXIodm9pZCogb2JqZWN0LCBjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUNvbnRleHQqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc192YWxpZCkoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsTWV0YWRhdGEqIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX251bSkgeworICByZXR1cm4gY3R4LT5SZWFkUGFja2VkVmFyaW50KAorICAgICAgcHRyLCBbb2JqZWN0LCBpc192YWxpZCwgbWV0YWRhdGEsIGZpZWxkX251bV0odWludDY0X3QgdmFsKSB7CisgICAgICAgIGlmIChpc192YWxpZCh2YWwpKSB7CisgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVwZWF0ZWRGaWVsZDxpbnQ+Kj4ob2JqZWN0KS0+QWRkKHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgV3JpdGVWYXJpbnQoZmllbGRfbnVtLCB2YWwsIG1ldGFkYXRhLT5tdXRhYmxlX3Vua25vd25fZmllbGRzPFQ+KCkpOworICAgICAgICB9CisgICAgICB9KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitQUk9UT0JVRl9OT0RJU0NBUkQgY29uc3QgY2hhciogUGFja2VkRW51bVBhcnNlckFyZygKKyAgICB2b2lkKiBvYmplY3QsIGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgsCisgICAgYm9vbCAoKmlzX3ZhbGlkKShjb25zdCB2b2lkKiwgaW50KSwgY29uc3Qgdm9pZCogZGF0YSwKKyAgICBJbnRlcm5hbE1ldGFkYXRhKiBtZXRhZGF0YSwgaW50IGZpZWxkX251bSkgeworICByZXR1cm4gY3R4LT5SZWFkUGFja2VkVmFyaW50KAorICAgICAgcHRyLCBbb2JqZWN0LCBpc192YWxpZCwgZGF0YSwgbWV0YWRhdGEsIGZpZWxkX251bV0odWludDY0X3QgdmFsKSB7CisgICAgICAgIGlmIChpc192YWxpZChkYXRhLCB2YWwpKSB7CisgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVwZWF0ZWRGaWVsZDxpbnQ+Kj4ob2JqZWN0KS0+QWRkKHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgV3JpdGVWYXJpbnQoZmllbGRfbnVtLCB2YWwsIG1ldGFkYXRhLT5tdXRhYmxlX3Vua25vd25fZmllbGRzPFQ+KCkpOworICAgICAgICB9CisgICAgICB9KTsKK30KKworUFJPVE9CVUZfTk9ESVNDQVJEIFBST1RPQlVGX0VYUE9SVCBjb25zdCBjaGFyKiBQYWNrZWRCb29sUGFyc2VyKAorICAgIHZvaWQqIG9iamVjdCwgY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCk7CitQUk9UT0JVRl9OT0RJU0NBUkQgUFJPVE9CVUZfRVhQT1JUIGNvbnN0IGNoYXIqIFBhY2tlZEZpeGVkMzJQYXJzZXIoCisgICAgdm9pZCogb2JqZWN0LCBjb25zdCBjaGFyKiBwdHIsIFBhcnNlQ29udGV4dCogY3R4KTsKK1BST1RPQlVGX05PRElTQ0FSRCBQUk9UT0JVRl9FWFBPUlQgY29uc3QgY2hhciogUGFja2VkU0ZpeGVkMzJQYXJzZXIoCisgICAgdm9pZCogb2JqZWN0LCBjb25zdCBjaGFyKiBwdHIsIFBhcnNlQ29udGV4dCogY3R4KTsKK1BST1RPQlVGX05PRElTQ0FSRCBQUk9UT0JVRl9FWFBPUlQgY29uc3QgY2hhciogUGFja2VkRml4ZWQ2NFBhcnNlcigKKyAgICB2b2lkKiBvYmplY3QsIGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgpOworUFJPVE9CVUZfTk9ESVNDQVJEIFBST1RPQlVGX0VYUE9SVCBjb25zdCBjaGFyKiBQYWNrZWRTRml4ZWQ2NFBhcnNlcigKKyAgICB2b2lkKiBvYmplY3QsIGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgpOworUFJPVE9CVUZfTk9ESVNDQVJEIFBST1RPQlVGX0VYUE9SVCBjb25zdCBjaGFyKiBQYWNrZWRGbG9hdFBhcnNlcigKKyAgICB2b2lkKiBvYmplY3QsIGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgpOworUFJPVE9CVUZfTk9ESVNDQVJEIFBST1RPQlVGX0VYUE9SVCBjb25zdCBjaGFyKiBQYWNrZWREb3VibGVQYXJzZXIoCisgICAgdm9pZCogb2JqZWN0LCBjb25zdCBjaGFyKiBwdHIsIFBhcnNlQ29udGV4dCogY3R4KTsKKworLy8gVGhpcyBpcyB0aGUgb25seSByZWN1cnNpdmUgcGFyc2VyLgorUFJPVE9CVUZfTk9ESVNDQVJEIFBST1RPQlVGX0VYUE9SVCBjb25zdCBjaGFyKiBVbmtub3duR3JvdXBMaXRlUGFyc2UoCisgICAgc3RkOjpzdHJpbmcqIHVua25vd24sIGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgpOworLy8gVGhpcyBpcyBhIGhlbHBlciB0byBmb3IgdGhlIFVua25vd25Hcm91cExpdGVQYXJzZSBidXQgaXMgYWN0dWFsbHkgYWxzbworLy8gdXNlZnVsIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gSXQgdXNlcyBvdmVybG9hZCBvbiBzdGQ6OnN0cmluZyogdnMKKy8vIFVua25vd25GaWVsZFNldCogdG8gbWFrZSB0aGUgZ2VuZXJhdGVkIGNvZGUgaXNvbW9ycGhpYyBiZXR3ZWVuIGZ1bGwgYW5kIGxpdGUuCitQUk9UT0JVRl9OT0RJU0NBUkQgUFJPVE9CVUZfRVhQT1JUIGNvbnN0IGNoYXIqIFVua25vd25GaWVsZFBhcnNlKAorICAgIHVpbnQzMl90IHRhZywgc3RkOjpzdHJpbmcqIHVua25vd24sIGNvbnN0IGNoYXIqIHB0ciwgUGFyc2VDb250ZXh0KiBjdHgpOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QQVJTRV9DT05URVhUX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9wb3J0LmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWMwNjBiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9wb3J0LmgKQEAgLTAsMCArMSw4MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgY29tbW9uIGhlYWRlciB0aGF0IGlzIGluY2x1ZGVkIGFjcm9zcyBhbGwgcHJvdG9idWYgaGVhZGVycy4gIFdlIGRvIG91ciBiZXN0CisvLyB0byBhdm9pZCAjZGVmaW5pbmcgYW55IG1hY3JvcyBoZXJlOyBpbnN0ZWFkIHdlIGdlbmVyYWxseSBwdXQgbWFjcm9zIGluCisvLyBwb3J0X2RlZi5pbmMgYW5kIHBvcnRfdW5kZWYuaW5jIHNvIHRoZXkgYXJlIG5vdCB2aXNpYmxlIGZyb20gb3V0c2lkZSBvZgorLy8gcHJvdG9idWYuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BPUlRfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QT1JUX0hfXworCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxuZXc+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKK2lubGluZSB2b2lkIFNpemVkRGVsZXRlKHZvaWQqIHAsIHNpemVfdCBzaXplKSB7CisjaWYgZGVmaW5lZChfX2NwcF9zaXplZF9kZWFsbG9jYXRpb24pCisgIDo6b3BlcmF0b3IgZGVsZXRlKHAsIHNpemUpOworI2Vsc2UKKyAgOjpvcGVyYXRvciBkZWxldGUocCk7CisjZW5kaWYKK30KK2lubGluZSB2b2lkIFNpemVkQXJyYXlEZWxldGUodm9pZCogcCwgc2l6ZV90IHNpemUpIHsKKyNpZiBkZWZpbmVkKF9fY3BwX3NpemVkX2RlYWxsb2NhdGlvbikKKyAgOjpvcGVyYXRvciBkZWxldGVbXShwLCBzaXplKTsKKyNlbHNlCisgIDo6b3BlcmF0b3IgZGVsZXRlW10ocCk7CisjZW5kaWYKK30KKworLy8gVGFnIHR5cGUgdXNlZCB0byBpbnZva2UgdGhlIGNvbnN0aW5pdCBjb25zdHJ1Y3RvciBvdmVybG9hZCBvZiBjbGFzc2VzCisvLyBzdWNoIGFzIEFyZW5hU3RyaW5nUHRyIGFuZCBNYXBGaWVsZEJhc2UuIFN1Y2ggY29uc3RydWN0b3JzIGFyZSBpbnRlcm5hbAorLy8gaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiB0aGUgbGlicmFyeS4KK3N0cnVjdCBDb25zdGFudEluaXRpYWxpemVkIHsKKyAgZXhwbGljaXQgQ29uc3RhbnRJbml0aWFsaXplZCgpID0gZGVmYXVsdDsKK307CisKKy8vIFRhZyB0eXBlIHVzZWQgdG8gaW52b2tlIHRoZSBhcmVuYSBjb25zdHJ1Y3RvciBvdmVybG9hZCBvZiBjbGFzc2VzIHN1Y2gKKy8vIGFzIEV4dGVuc2lvblNldCBhbmQgTWFwRmllbGRMaXRlIGluIGFnZ3JlZ2F0ZSBpbml0aWFsaXphdGlvbi4gVGhlc2UKKy8vIGNsYXNzZXMgdHlwaWNhbGx5IGRvbid0IGhhdmUgbW92ZS9jb3B5IGNvbnN0cnVjdG9ycywgd2hpY2ggcnVsZXMgb3V0CisvLyBleHBsaWNpdCBpbml0aWFsaXphdGlvbiBpbiBwcmUtQysrMTcuCitzdHJ1Y3QgQXJlbmFJbml0aWFsaXplZCB7CisgIGV4cGxpY2l0IEFyZW5hSW5pdGlhbGl6ZWQoKSA9IGRlZmF1bHQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QT1JUX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmMgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDBkYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmMKQEAgLTAsMCArMSw5MjggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBjb21tb24gbWFjcm9zIHRoYXQgYXJlIHVzZWQgaW4gcHJvdG9idWYuCisvLworLy8gVG8gaGlkZSB0aGVzZSBkZWZpbml0aW9ucyBmcm9tIHRoZSBvdXRzaWRlIHdvcmxkIChhbmQgdG8gcHJldmVudCBjb2xsaXNpb25zCisvLyBpZiBtb3JlIHRoYW4gb25lIHZlcnNpb24gb2YgcHJvdG9idWYgaXMgI2luY2x1ZGVkIGluIHRoZSBzYW1lIHByb2plY3QpIHlvdQorLy8gbXVzdCBmb2xsb3cgdGhpcyBwYXR0ZXJuIHdoZW4gI2luY2x1ZGluZyBwb3J0X2RlZi5pbmMgaW4gYSBoZWFkZXIgZmlsZToKKy8vCisvLyAjaW5jbHVkZSAib3RoZXJfaGVhZGVyLmgiCisvLyAjaW5jbHVkZSAibWVzc2FnZS5oIgorLy8gLy8gZXRjLgorLy8KKy8vICNpbmNsdWRlICJwb3J0X2RlZi5pbmMiICAvLyBNVVNUIGJlIGxhc3QgaGVhZGVyIGluY2x1ZGVkCisvLworLy8gLy8gRGVmaW5pdGlvbnMgZm9yIHRoaXMgaGVhZGVyLgorLy8KKy8vICNpbmNsdWRlICJwb3J0X3VuZGVmLmluYyIKKy8vCisvLyBUaGlzIGlzIGEgdGV4dHVhbCBoZWFkZXIgd2l0aCBubyBpbmNsdWRlIGd1YXJkLCBiZWNhdXNlIHdlIHdhbnQgdG8KKy8vIGRldGVjdC9wcm9oaWJpdCBhbnl0aW1lIGl0IGlzICNpbmNsdWRlZCB0d2ljZSB3aXRob3V0IGEgY29ycmVzcG9uZGluZworLy8gI3VuZGVmLgorCisvLyBUaGUgZGVmaW5pdGlvbnMgaW4gdGhpcyBmaWxlIGFyZSBpbnRlbmRlZCB0byBiZSBwb3J0YWJsZSBhY3Jvc3MgQ2xhbmcsCisvLyBHQ0MsIGFuZCBNU1ZDLiBGdW5jdGlvbi1saWtlIG1hY3JvcyBhcmUgdXNhYmxlIHdpdGhvdXQgYW4gI2lmZGVmIGd1YXJkLgorLy8gU3ludGF4IG1hY3JvcyAoZm9yIGV4YW1wbGUsIGF0dHJpYnV0ZXMpIGFyZSBhbHdheXMgZGVmaW5lZCwgYWx0aG91Z2gKKy8vIHRoZXkgbWF5IGJlIGVtcHR5LgorLy8KKy8vIFNvbWUgZGVmaW5pdGlvbnMgcmVseSBvbiB0aGUgTkRFQlVHIG1hY3JvIGFuZC9vciAoaW4gTVNWQykgX0RFQlVHOgorLy8gLSBodHRwczovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jL2Vycm9yL2Fzc2VydAorLy8gLSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9jcHAvcHJlcHJvY2Vzc29yL3ByZWRlZmluZWQtbWFjcm9zI21pY3Jvc29mdC1zcGVjaWZpYy1wcmVkZWZpbmVkLW1hY3JvcworLy8KKy8vIFJlZmVyZW5jZXMgZm9yIHByZWRlZmluZWQgbWFjcm9zOgorLy8gLSBTdGFuZGFyZDogaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL3ByZXByb2Nlc3Nvci9yZXBsYWNlCisvLyAtIENsYW5nOiBodHRwczovL2NsYW5nLmxsdm0ub3JnL2RvY3MvTGFuZ3VhZ2VFeHRlbnNpb25zLmh0bWwKKy8vICAgICAgICAgIChzZWUgYWxzbyBHQ0MgcHJlZGVmaW5lZCBtYWNyb3MpCisvLyAtIEdDQzogaHR0cHM6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2NwcC9QcmVkZWZpbmVkLU1hY3Jvcy5odG1sCisvLyAtIE1TVkM6IGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2NwcC9wcmVwcm9jZXNzb3IvcHJlZGVmaW5lZC1tYWNyb3MKKy8vIC0gSW50ZXJhY3RpdmUgKENsYW5nL0dDQyBvbmx5KTogaHR0cHM6Ly93d3cuY29tcGlsZXItZXhwbG9yZXIuY29tL3ovaGM2aktkM3NqCisvLworLy8gUmVmZXJlbmNlcyBmb3IgYXR0cmlidXRlcyAoYW5kIGV4dGVuc2lvbiBhdHRyaWJ1dGVzKToKKy8vIC0gU3RhbmRhcmQ6IGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9sYW5ndWFnZS9hdHRyaWJ1dGVzCisvLyAtIENsYW5nOiBodHRwczovL2NsYW5nLmxsdm0ub3JnL2RvY3MvQXR0cmlidXRlUmVmZXJlbmNlLmh0bWwKKy8vIC0gR0NDOiBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL0F0dHJpYnV0ZS1TeW50YXguaHRtbAorLy8gICAgICAgIChzZWUgQ2xhbmcgYXR0cmlidXRlIGRvY3MgYXMgd2VsbCkKKy8vCisvLyBSZWZlcmVuY2VzIGZvciBzdGFuZGFyZCBDKysgbGFuZ3VhZ2UgY29uZm9ybWFuY2UgKGFuZCBtaW5pbXVtIHZlcnNpb25zKToKKy8vIC0gQ2xhbmc6IGh0dHBzOi8vY2xhbmcubGx2bS5vcmcvY3h4X3N0YXR1cy5odG1sCisvLyAtIEdDQzogaHR0cHM6Ly9nY2MuZ251Lm9yZy9wcm9qZWN0cy9jeHgtc3RhdHVzLmh0bWwKKy8vIC0gTVNWQzogaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvY3BwL292ZXJ2aWV3L3Zpc3VhbC1jcHAtbGFuZ3VhZ2UtY29uZm9ybWFuY2UKKy8vCisvLyBIaXN0b3JpY2FsIHJlbGVhc2Ugbm90ZXMgKHdoaWNoIGNhbiBoZWxwIHRvIGRldGVybWluZSBtaW5pbXVtIHZlcnNpb25zKToKKy8vIC0gQ2xhbmc6IGh0dHBzOi8vcmVsZWFzZXMubGx2bS5vcmcvCisvLyAtIEdDQzogaHR0cHM6Ly9nY2MuZ251Lm9yZy9yZWxlYXNlcy5odG1sCisvLyAtIE1TVkM6IGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Zpc3VhbHN0dWRpby9yZWxlYXNlcy8yMDE5L3JlbGVhc2Utbm90ZXMtaGlzdG9yeQorLy8gICAgICAgICBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy92aXN1YWxzdHVkaW8vcmVsZWFzZW5vdGVzL3ZzMjAxNy1yZWxub3Rlcy1oaXN0b3J5CisKKy8vIFBvcnRhYmxlIGZhbGxiYWNrcyBmb3IgQysrMjAgZmVhdHVyZSB0ZXN0IG1hY3JvczoKKy8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9mZWF0dXJlX3Rlc3QKKyNpZm5kZWYgX19oYXNfY3BwX2F0dHJpYnV0ZQorI2RlZmluZSBfX2hhc19jcHBfYXR0cmlidXRlKHgpIDAKKyNkZWZpbmUgUFJPVE9CVUZfaGFzX2NwcF9hdHRyaWJ1dGVfREVGSU5FRF8KKyNlbmRpZgorCisvLyBQb3J0YWJsZSBmYWxsYmFjayBmb3IgQ2xhbmcncyBfX2hhc19mZWF0dXJlIG1hY3JvOgorLy8gaHR0cHM6Ly9jbGFuZy5sbHZtLm9yZy9kb2NzL0xhbmd1YWdlRXh0ZW5zaW9ucy5odG1sI2hhcy1mZWF0dXJlLWFuZC1oYXMtZXh0ZW5zaW9uCisjaWZuZGVmIF9faGFzX2ZlYXR1cmUKKyNkZWZpbmUgX19oYXNfZmVhdHVyZSh4KSAwCisjZGVmaW5lIFBST1RPQlVGX2hhc19mZWF0dXJlX0RFRklORURfCisjZW5kaWYKKworLy8gUG9ydGFibGUgZmFsbGJhY2sgZm9yIENsYW5nJ3MgX19oYXNfd2FybmluZyBtYWNybzoKKyNpZm5kZWYgX19oYXNfd2FybmluZworI2RlZmluZSBfX2hhc193YXJuaW5nKHgpIDAKKyNkZWZpbmUgUFJPVE9CVUZfaGFzX3dhcm5pbmdfREVGSU5FRF8KKyNlbmRpZgorCisvLyBQb3J0YWJsZSBmYWxsYmFja3MgZm9yIHRoZSBfX2hhc19hdHRyaWJ1dGUgbWFjcm8gKEdDQyBhbmQgQ2xhbmcpOgorLy8gaHR0cHM6Ly9jbGFuZy5sbHZtLm9yZy9kb2NzL0xhbmd1YWdlRXh0ZW5zaW9ucy5odG1sI2hhcy1hdHRyaWJ1dGUKKy8vIGh0dHBzOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9jcHAvXzAwNWZfMDA1Zmhhc18wMDVmYXR0cmlidXRlLmh0bWwKKyNpZm5kZWYgX19oYXNfYXR0cmlidXRlCisjZGVmaW5lIF9faGFzX2F0dHJpYnV0ZSh4KSAwCisjZGVmaW5lIFBST1RPQlVGX2hhc19hdHRyaWJ1dGVfREVGSU5FRF8KKyNlbmRpZgorCisvLyBQb3J0YWJsZSBmYWxsYmFjayBmb3IgX19oYXNfYnVpbHRpbiAoR0NDIGFuZCBDbGFuZyk6CisvLyBodHRwczovL2NsYW5nLmxsdm0ub3JnL2RvY3MvTGFuZ3VhZ2VFeHRlbnNpb25zLmh0bWwjaGFzLWJ1aWx0aW4KKy8vIGh0dHBzOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9jcHAvXzAwNWZfMDA1Zmhhc18wMDVmYnVpbHRpbi5odG1sCisjaWZuZGVmIF9faGFzX2J1aWx0aW4KKyNkZWZpbmUgX19oYXNfYnVpbHRpbih4KSAwCisjZGVmaW5lIFBST1RPQlVGX2hhc19idWlsdGluX0RFRklORURfCisjZW5kaWYKKworLy8gUG9ydGFibGUgUFJPVE9CVUZfQlVJTFRJTl9CU1dBUHh4IGRlZmluaXRpb25zCisvLyBDb2RlIG11c3QgY2hlY2sgZm9yIGF2YWlsYWJpbGl0eSwgZS5nLjogYGRlZmluZWQoUFJPVE9CVUZfQlVJTFRJTl9CU1dBUDMyKWAKKyNpZmRlZiBQUk9UT0JVRl9CVUlMVElOX0JTV0FQMTYKKyNlcnJvciBQUk9UT0JVRl9CVUlMVElOX0JTV0FQMTYgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjaWZkZWYgUFJPVE9CVUZfQlVJTFRJTl9CU1dBUDMyCisjZXJyb3IgUFJPVE9CVUZfQlVJTFRJTl9CU1dBUDMyIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorI2lmZGVmIFBST1RPQlVGX0JVSUxUSU5fQlNXQVA2NAorI2Vycm9yIFBST1RPQlVGX0JVSUxUSU5fQlNXQVA2NCB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9ic3dhcDE2KQorI2RlZmluZSBQUk9UT0JVRl9CVUlMVElOX0JTV0FQMTYoeCkgX19idWlsdGluX2Jzd2FwMTYoeCkKKyNlbmRpZgorI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IF9faGFzX2J1aWx0aW4oX19idWlsdGluX2Jzd2FwMzIpCisjZGVmaW5lIFBST1RPQlVGX0JVSUxUSU5fQlNXQVAzMih4KSBfX2J1aWx0aW5fYnN3YXAzMih4KQorI2VuZGlmCisjaWYgZGVmaW5lZChfX0dOVUNfXykgfHwgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fYnN3YXA2NCkKKyNkZWZpbmUgUFJPVE9CVUZfQlVJTFRJTl9CU1dBUDY0KHgpIF9fYnVpbHRpbl9ic3dhcDY0KHgpCisjZW5kaWYKKworLy8gUG9ydGFibGUgY2hlY2sgZm9yIEdDQyBtaW5pbXVtIHZlcnNpb246CisvLyBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvY3BwL0NvbW1vbi1QcmVkZWZpbmVkLU1hY3Jvcy5odG1sCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgXAorICAgICYmIGRlZmluZWQoX19HTlVDX1BBVENITEVWRUxfXykKKyMgIGRlZmluZSBQUk9UT0JVRl9HTlVDX01JTih4LCB5KSBcCisgIChfX0dOVUNfXyA+ICh4KSB8fCBfX0dOVUNfXyA9PSAoeCkgJiYgX19HTlVDX01JTk9SX18gPj0gKHkpKQorI2Vsc2UKKyMgIGRlZmluZSBQUk9UT0JVRl9HTlVDX01JTih4LCB5KSAwCisjZW5kaWYKKworLy8gUG9ydGFibGUgY2hlY2sgZm9yIE1TVkMgbWluaW11bSB2ZXJzaW9uOgorLy8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvY3BwL3ByZXByb2Nlc3Nvci9wcmVkZWZpbmVkLW1hY3JvcworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIFBST1RPQlVGX01TQ19WRVJfTUlOKHgpIChfTVNDX1ZFUiA+PSB4KQorI2Vsc2UKKyNkZWZpbmUgUFJPVE9CVUZfTVNDX1ZFUl9NSU4oeCkgMAorI2VuZGlmCisKKy8vIFBvcnRhYmxlIGNoZWNrIGZvciBtaW5pbXVtIEMrKyBsYW5ndWFnZSB2ZXJzaW9uOgorLy8gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL3ByZXByb2Nlc3Nvci9yZXBsYWNlCisvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9jcHAvcHJlcHJvY2Vzc29yL3ByZWRlZmluZWQtbWFjcm9zCisjaWYgIWRlZmluZWQoX01TVkNfTEFORykKKyNkZWZpbmUgUFJPVE9CVUZfQ1BMVVNQTFVTX01JTih4KSAoX19jcGx1c3BsdXMgPj0geCkKKyNlbHNlCisjZGVmaW5lIFBST1RPQlVGX0NQTFVTUExVU19NSU4oeCkgKF9NU1ZDX0xBTkcgPj0geCkKKyNlbmRpZgorCisvLyBGdXR1cmUgdmVyc2lvbnMgb2YgcHJvdG9idWYgd2lsbCBpbmNsdWRlIGJyZWFraW5nIGNoYW5nZXMgdG8gc29tZSBBUElzLgorLy8gVGhpcyBtYWNybyBjYW4gYmUgc2V0IHRvIGVuYWJsZSB0aGVzZSBBUEkgY2hhbmdlcyBhaGVhZCBvZiB0aW1lLCBzbyB0aGF0CisvLyB1c2VyIGNvZGUgY2FuIGJlIHVwZGF0ZWQgYmVmb3JlIHVwZ3JhZGluZyB2ZXJzaW9ucyBvZiBwcm90b2J1Zi4KKy8vIFBST1RPQlVGX0ZVVFVSRV9GSU5BTCBpcyB1c2VkIG9uIGNsYXNzZXMgdGhhdCBhcmUgaGlzdG9yaWNhbGx5IG5vdCBtYXJrZWQgYXMKKy8vIGZpbmFsLCBidXQgdGhhdCBtYXkgYmUgbWFya2VkIGZpbmFsIGluIGZ1dHVyZSAoYnJlYWtpbmcpIHJlbGVhc2VzLgorLy8gI2RlZmluZSBQUk9UT0JVRl9GVVRVUkVfQlJFQUtJTkdfQ0hBTkdFUyAxCisvLyAjZGVmaW5lIFBST1RPQlVGX0ZVVFVSRV9GSU5BTCBmaW5hbAorI2RlZmluZSBQUk9UT0JVRl9GVVRVUkVfRklOQUwKKworI2lmZGVmIFBST1RPQlVGX1ZFUlNJT04KKyNlcnJvciBQUk9UT0JVRl9WRVJTSU9OIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorI2RlZmluZSBQUk9UT0JVRl9WRVJTSU9OIDMwMjEwMDkKKworI2lmZGVmIFBST1RPQlVGX01JTl9IRUFERVJfVkVSU0lPTl9GT1JfUFJPVE9DCisjZXJyb3IgUFJPVE9CVUZfTUlOX0hFQURFUl9WRVJTSU9OX0ZPUl9QUk9UT0Mgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjZGVmaW5lIFBST1RPQlVGX01JTl9IRUFERVJfVkVSU0lPTl9GT1JfUFJPVE9DIDMwMjEwMDAKKworI2lmZGVmIFBST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTgorI2Vycm9yIFBST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTiB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNkZWZpbmUgUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OIDMwMjEwMDAKKworI2lmZGVmIFBST1RPQlVGX1ZFUlNJT05fU1VGRklYCisjZXJyb3IgUFJPVE9CVUZfVkVSU0lPTl9TVUZGSVggd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjZGVmaW5lIFBST1RPQlVGX1ZFUlNJT05fU1VGRklYICIiCisKKyNpZiBkZWZpbmVkKFBST1RPQlVGX05BTUVTUEFDRSkgfHwgZGVmaW5lZChQUk9UT0JVRl9OQU1FU1BBQ0VfSUQpCisjZXJyb3IgUFJPVE9CVUZfTkFNRVNQQUNFIG9yIFBST1RPQlVGX05BTUVTUEFDRV9JRCB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNkZWZpbmUgUFJPVE9CVUZfTkFNRVNQQUNFICJnb29nbGU6OnByb3RvYnVmIgorI2RlZmluZSBQUk9UT0JVRl9OQU1FU1BBQ0VfSUQgZ29vZ2xlOjpwcm90b2J1ZgorI2RlZmluZSBQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTiBcCisgIG5hbWVzcGFjZSBnb29nbGUgeyAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIHByb3RvYnVmIHsKKyNkZWZpbmUgUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFIFwKKyAgfSAvKiBuYW1lc3BhY2UgcHJvdG9idWYgKi8gICAgIFwKKyAgfSAvKiBuYW1lc3BhY2UgZ29vZ2xlICovCisKKyNpZmRlZiBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCisjZXJyb3IgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKy8vIEZvciBmdW5jdGlvbnMgd2Ugd2FudCB0byBmb3JjZSBpbmxpbmUuCisjaWYgZGVmaW5lZChQUk9UT0JVRl9OT19JTkxJTkUpCisjIGRlZmluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCisjZWxpZiBQUk9UT0JVRl9HTlVDX01JTigzLCAxKQorIyBkZWZpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjIGRlZmluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIF9fZm9yY2VpbmxpbmUKKyNlbHNlCisjIGRlZmluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCisjZW5kaWYKKworI2lmZGVmIFBST1RPQlVGX05ERUJVR19JTkxJTkUKKyNlcnJvciBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorLy8gQXZvaWQgZXhjZXNzaXZlIGlubGluaW5nIGluIG5vbi1vcHRpbWl6ZWQgYnVpbGRzLiBXaXRob3V0IG90aGVyIG9wdGltaXphdGlvbnMKKy8vIHRoZSBpbmxpbmluZyBpcyBub3QgZ29pbmcgdG8gcHJvdmlkZSBiZW5lZml0cyBhbnl3YXkgYW5kIHRoZSBodWdlIHJlc3VsdGluZworLy8gZnVuY3Rpb25zLCBlc3BlY2lhbGx5IGluIHRoZSBwcm90by1nZW5lcmF0ZWQgc2VyaWFsaXphdGlvbiBmdW5jdGlvbnMsIHByb2R1Y2UKKy8vIHN0YWNrIGZyYW1lcyBzbyBsYXJnZSB0aGF0IG1hbnkgdGVzdHMgcnVuIGludG8gc3RhY2sgb3ZlcmZsb3dzIChiLzMyMTkyODk3KS4KKyNpZiBkZWZpbmVkKE5ERUJVRykgfHwgKGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9ERUJVRykpCisjIGRlZmluZSBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKKyNlbHNlCisjIGRlZmluZSBQUk9UT0JVRl9OREVCVUdfSU5MSU5FCisjZW5kaWYKKworLy8gTm90ZSB0aGF0IFBST1RPQlVGX05PSU5MSU5FIGlzIGFuIGF0dHJpYnV0ZSBhcHBsaWVkIHRvIGZ1bmN0aW9ucywgdG8gcHJldmVudAorLy8gdGhlbSBmcm9tIGJlaW5nIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyLiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tCisvLyBQUk9UT0JVRl9OT19JTkxJTkUsIHdoaWNoIGlzIGEgdXNlci1zdXBwbGllZCBtYWNybyB0aGF0IGRpc2FibGVzIGZvcmNlZAorLy8gaW5saW5pbmcgYnkgUFJPVE9CVUZfKEFMV0FZU3xOREVCVUcpX0lOTElORS4KKyNpZmRlZiBQUk9UT0JVRl9OT0lOTElORQorI2Vycm9yIFBST1RPQlVGX05PSU5MSU5FIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorI2lmIFBST1RPQlVGX0dOVUNfTUlOKDMsIDEpCisjIGRlZmluZSBQUk9UT0JVRl9OT0lOTElORSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorLy8gU2VlbXMgdG8gaGF2ZSBiZWVuIGFyb3VuZCBzaW5jZSBhdCBsZWFzdCBWaXN1YWwgU3R1ZGlvIDIwMDUKKyMgZGVmaW5lIFBST1RPQlVGX05PSU5MSU5FIF9fZGVjbHNwZWMobm9pbmxpbmUpCisjZW5kaWYKKworI2lmZGVmIFBST1RPQlVGX01VU1RUQUlMCisjZXJyb3IgUFJPVE9CVUZfTVVTVFRBSUwgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjaWZkZWYgUFJPVE9CVUZfVEFJTENBTEwKKyNlcnJvciBQUk9UT0JVRl9UQUlMQ0FMTCB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNpZiBfX2hhc19jcHBfYXR0cmlidXRlKGNsYW5nOjptdXN0dGFpbCkgJiYgIWRlZmluZWQoX19hcm1fXykgJiYgXAorICAgICFkZWZpbmVkKF9BUkNIX1BQQykgJiYgIWRlZmluZWQoX193YXNtX18pICYmICAgICAgICAgICAgICAgICBcCisgICAgIShkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0lYODYpKSAmJiAgICAgICAgICAgICAgICAgIFwKKyAgICAhKGRlZmluZWQoX19OREtfTUFKT1JfXykgJiYgX19OREtfTUFKT1IgPD0gMjQpCisjICBpZm5kZWYgUFJPVE8yX09QRU5TT1VSQ0UKKy8vIENvbXBpbGF0aW9uIGZhaWxzIG9uIEFSTTMyOiBiLzE5NTk0MzMwNgorLy8gQ29tcGlsYXRpb24gZmFpbHMgb24gcG93ZXJwYzY0bGU6IGIvMTg3OTg1MTEzCisvLyBDb21waWxhdGlvbiBmYWlscyBvbiBYODYgV2luZG93czoKKy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9sbHZtL2xsdm0tcHJvamVjdC9pc3N1ZXMvNTMyNzEKKyMgIGVuZGlmCisjZGVmaW5lIFBST1RPQlVGX01VU1RUQUlMIFtbY2xhbmc6Om11c3R0YWlsXV0KKyNkZWZpbmUgUFJPVE9CVUZfVEFJTENBTEwgdHJ1ZQorI2Vsc2UKKyNkZWZpbmUgUFJPVE9CVUZfTVVTVFRBSUwKKyNkZWZpbmUgUFJPVE9CVUZfVEFJTENBTEwgZmFsc2UKKyNlbmRpZgorCisjaWZkZWYgUFJPVE9CVUZfRVhDTFVTSVZFX0xPQ0tTX1JFUVVJUkVECisjZXJyb3IgUFJPVE9CVUZfRVhDTFVTSVZFX0xPQ0tTX1JFUVVJUkVEIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorI2lmIF9faGFzX2F0dHJpYnV0ZShleGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQpCisjZGVmaW5lIFBST1RPQlVGX0VYQ0xVU0lWRV9MT0NLU19SRVFVSVJFRCguLi4pIFwKKyAgX19hdHRyaWJ1dGVfXygoZXhjbHVzaXZlX2xvY2tzX3JlcXVpcmVkKF9fVkFfQVJHU19fKSkpCisjZWxzZQorI2RlZmluZSBQUk9UT0JVRl9FWENMVVNJVkVfTE9DS1NfUkVRVUlSRUQoLi4uKQorI2VuZGlmCisKKyNpZmRlZiBQUk9UT0JVRl9OT19USFJFQURfU0FGRVRZX0FOQUxZU0lTCisjZXJyb3IgUFJPVE9CVUZfTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUyB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNpZiBfX2hhc19hdHRyaWJ1dGUobm9fdGhyZWFkX3NhZmV0eV9hbmFseXNpcykKKyNkZWZpbmUgUFJPVE9CVUZfTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUyBcCisgIF9fYXR0cmlidXRlX18oKG5vX3RocmVhZF9zYWZldHlfYW5hbHlzaXMpKQorI2Vsc2UKKyNkZWZpbmUgUFJPVE9CVUZfTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUworI2VuZGlmCisKKyNpZmRlZiBQUk9UT0JVRl9HVUFSREVEX0JZCisjZXJyb3IgUFJPVE9CVUZfR1VBUkRFRF9CWSB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNpZiBfX2hhc19hdHRyaWJ1dGUoZ3VhcmRlZF9ieSkKKyNkZWZpbmUgUFJPVE9CVUZfR1VBUkRFRF9CWSh4KSBfX2F0dHJpYnV0ZV9fKChndWFyZGVkX2J5KHgpKSkKKyNlbHNlCisjZGVmaW5lIFBST1RPQlVGX0dVQVJERURfQlkoeCkKKyNlbmRpZgorCisjaWZkZWYgUFJPVE9CVUZfTE9DS1NfRVhDTFVERUQKKyNlcnJvciBQUk9UT0JVRl9MT0NLU19FWENMVURFRCB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNpZiBfX2hhc19hdHRyaWJ1dGUobG9ja3NfZXhjbHVkZWQpCisjZGVmaW5lIFBST1RPQlVGX0xPQ0tTX0VYQ0xVREVEKC4uLikgXAorICBfX2F0dHJpYnV0ZV9fKChsb2Nrc19leGNsdWRlZChfX1ZBX0FSR1NfXykpKQorI2Vsc2UKKyNkZWZpbmUgUFJPVE9CVUZfTE9DS1NfRVhDTFVERUQoLi4uKQorI2VuZGlmCisKKyNpZmRlZiBQUk9UT0JVRl9DT0xECisjZXJyb3IgUFJPVE9CVUZfQ09MRCB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNpZiBfX2hhc19hdHRyaWJ1dGUoY29sZCkgfHwgUFJPVE9CVUZfR05VQ19NSU4oNCwgMykKKyMgZGVmaW5lIFBST1RPQlVGX0NPTEQgX19hdHRyaWJ1dGVfXygoY29sZCkpCisjZWxzZQorIyBkZWZpbmUgUFJPVE9CVUZfQ09MRAorI2VuZGlmCisKKyNpZmRlZiBQUk9UT0JVRl9TRUNUSU9OX1ZBUklBQkxFCisjZXJyb3IgUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRSB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNpZiAoX19oYXNfYXR0cmlidXRlKHNlY3Rpb24pIHx8IGRlZmluZWQoX19HTlVDX18pKSAmJiBkZWZpbmVkKF9fRUxGX18pCisvLyBQbGFjZSBhIHZhcmlhYmxlIGluIHRoZSBnaXZlbiBFTEYgc2VjdGlvbi4KKyMgZGVmaW5lIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUoeCkgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigjeCkpKQorI2Vsc2UKKyMgZGVmaW5lIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUoeCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQUk9UT0JVRl9ERVBSRUNBVEVEKQorI2Vycm9yIFBST1RPQlVGX0RFUFJFQ0FURUQgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjaWYgZGVmaW5lZChQUk9UT0JVRl9ERVBSRUNBVEVEX01TRykKKyNlcnJvciBQUk9UT0JVRl9ERVBSRUNBVEVEX01TRyB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNpZiBfX2hhc19hdHRyaWJ1dGUoZGVwcmVjYXRlZCkgfHwgUFJPVE9CVUZfR05VQ19NSU4oMywgMCkKKyMgZGVmaW5lIFBST1RPQlVGX0RFUFJFQ0FURUQgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpCisjIGRlZmluZSBQUk9UT0JVRl9ERVBSRUNBVEVEX01TRyhtc2cpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQobXNnKSkpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyBkZWZpbmUgUFJPVE9CVUZfREVQUkVDQVRFRCBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQpCisjIGRlZmluZSBQUk9UT0JVRl9ERVBSRUNBVEVEX01TRyhtc2cpIF9fZGVjbHNwZWMoZGVwcmVjYXRlZChtc2cpKQorI2Vsc2UKKyMgZGVmaW5lIFBST1RPQlVGX0RFUFJFQ0FURUQKKyMgZGVmaW5lIFBST1RPQlVGX0RFUFJFQ0FURURfTVNHKG1zZykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQUk9UT0JVRl9ERVBSRUNBVEVEX0VOVU0pCisjZXJyb3IgUFJPVE9CVUZfREVQUkVDQVRFRF9FTlVNIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorI2lmIGRlZmluZWQoX19jbGFuZ19fKSB8fCBQUk9UT0JVRl9HTlVDX01JTig2LCAwKQorLy8gaHR0cHM6Ly9nY2MuZ251Lm9yZy9nY2MtNi9jaGFuZ2VzLmh0bWwKKyMgZGVmaW5lIFBST1RPQlVGX0RFUFJFQ0FURURfRU5VTSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKKyNlbHNlCisjIGRlZmluZSBQUk9UT0JVRl9ERVBSRUNBVEVEX0VOVU0KKyNlbmRpZgorCisjaWZkZWYgUFJPVE9CVUZfRlVOQ19BTElHTgorI2Vycm9yIFBST1RPQlVGX0ZVTkNfQUxJR04gd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjaWYgX19oYXNfYXR0cmlidXRlKGFsaWduZWQpIHx8IFBST1RPQlVGX0dOVUNfTUlOKDQsIDMpCisjZGVmaW5lIFBST1RPQlVGX0ZVTkNfQUxJR04oYnl0ZXMpIF9fYXR0cmlidXRlX18oKGFsaWduZWQoYnl0ZXMpKSkKKyNlbHNlCisjZGVmaW5lIFBST1RPQlVGX0ZVTkNfQUxJR04oYnl0ZXMpCisjZW5kaWYKKworI2lmZGVmIFBST1RPQlVGX1JFVFVSTlNfTk9OTlVMTAorI2Vycm9yIFBST1RPQlVGX1JFVFVSTlNfTk9OTlVMTCB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNpZiBfX2hhc19hdHRyaWJ1dGUocmV0dXJuc19ub25udWxsKSB8fCBQUk9UT0JVRl9HTlVDX01JTig0LCA5KQorI2RlZmluZSBQUk9UT0JVRl9SRVRVUk5TX05PTk5VTEwgX19hdHRyaWJ1dGVfXygocmV0dXJuc19ub25udWxsKSkKKyNlbHNlCisjZGVmaW5lIFBST1RPQlVGX1JFVFVSTlNfTk9OTlVMTAorI2VuZGlmCisKKyNpZmRlZiBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUworI2Vycm9yIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorI2lmIF9faGFzX2NwcF9hdHRyaWJ1dGUoY2xhbmc6OnJlaW5pdGlhbGl6ZXMpCisjZGVmaW5lIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIFtbY2xhbmc6OnJlaW5pdGlhbGl6ZXNdXQorI2Vsc2UKKyNkZWZpbmUgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMKKyNlbmRpZgorCisvLyBUaGUgbWluaW11bSBsaWJyYXJ5IHZlcnNpb24gd2hpY2ggd29ya3Mgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZQorLy8gaGVhZGVycy4KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX01JTl9MSUJSQVJZX1ZFUlNJT04gMzAyMTAwMAorCisjaWZkZWYgUFJPVE9CVUZfUlRUSQorI2Vycm9yIFBST1RPQlVGX1JUVEkgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfTk9fUlRUSSkgJiYgR09PR0xFX1BST1RPQlVGX05PX1JUVEkKKy8vIEEgdXNlci1wcm92aWRlZCBkZWZpbml0aW9uIEdPT0dMRV9QUk9UT0JVRl9OT19SVFRJPTEgZGlzYWJsZXMgUlRUSS4KKyNkZWZpbmUgUFJPVE9CVUZfUlRUSSAwCisjZWxpZiBkZWZpbmVkKF9fY3BwX3J0dGkpCisvLyBodHRwczovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvZmVhdHVyZV90ZXN0CisjZGVmaW5lIFBST1RPQlVGX1JUVEkgMQorI2VsaWYgX19oYXNfZmVhdHVyZShjeHhfcnR0aSkKKy8vIGh0dHBzOi8vY2xhbmcubGx2bS5vcmcvZG9jcy9MYW5ndWFnZUV4dGVuc2lvbnMuaHRtbCNjLXJ0dGkKKyNkZWZpbmUgUFJPVE9CVUZfUlRUSSAxCisjZWxpZiBkZWZpbmVkKF9fR1hYX1JUVEkpCisvLyBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvY3BwL0NvbW1vbi1QcmVkZWZpbmVkLU1hY3Jvcy5odG1sCisjZGVmaW5lIFBST1RPQlVGX1JUVEkgMQorI2VsaWYgZGVmaW5lZChfQ1BQUlRUSSkKKy8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2NwcC9idWlsZC9yZWZlcmVuY2UvZ3ItZW5hYmxlLXJ1bi10aW1lLXR5cGUtaW5mb3JtYXRpb24KKyNkZWZpbmUgUFJPVE9CVUZfUlRUSSAxCisjZWxzZQorI2RlZmluZSBQUk9UT0JVRl9SVFRJIDAKKyNlbmRpZgorCisvLyBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGdpdmVuIGZpZWxkIHdpdGhpbiB0aGUgZ2l2ZW4gYWdncmVnYXRlIHR5cGUuCisvLyBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIEFOU0kgQyBvZmZzZXRvZigpIG1hY3JvLiAgSG93ZXZlciwgYWNjb3JkaW5nCisvLyB0byB0aGUgQysrIHN0YW5kYXJkLCBvZmZzZXRvZigpIG9ubHkgd29ya3Mgb24gUE9EIHR5cGVzLCBhbmQgR0NDCisvLyBlbmZvcmNlcyB0aGlzIHJlcXVpcmVtZW50IHdpdGggYSB3YXJuaW5nLiAgSW4gcHJhY3RpY2UsIHRoaXMgcnVsZSBpcworLy8gdW5uZWNlc3NhcmlseSBzdHJpY3Q7IHRoZXJlIGlzIHByb2JhYmx5IG5vIGNvbXBpbGVyIG9yIHBsYXRmb3JtIG9uCisvLyB3aGljaCB0aGUgb2Zmc2V0cyBvZiB0aGUgZGlyZWN0IGZpZWxkcyBvZiBhIGNsYXNzIGFyZSBub24tY29uc3RhbnQuCisvLyBGaWVsZHMgaW5oZXJpdGVkIGZyb20gc3VwZXJjbGFzc2VzICpjYW4qIGhhdmUgbm9uLWNvbnN0YW50IG9mZnNldHMsCisvLyBidXQgdGhhdCdzIG5vdCB3aGF0IHRoaXMgbWFjcm8gd2lsbCBiZSB1c2VkIGZvci4KKyNpZmRlZiBQUk9UT0JVRl9GSUVMRF9PRkZTRVQKKyNlcnJvciBQUk9UT0JVRl9GSUVMRF9PRkZTRVQgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisvLyBGb3IgQ2xhbmcgd2UgdXNlIF9fYnVpbHRpbl9vZmZzZXRvZigpIGFuZCBzdXBwcmVzcyB0aGUgd2FybmluZywKKy8vIHRvIGF2b2lkIENvbnRyb2wgRmxvdyBJbnRlZ3JpdHkgYW5kIFVCU2FuIHZwdHIgc2FuaXRpemVycyBmcm9tCisvLyBjcmFzaGluZyB3aGlsZSB0cnlpbmcgdG8gdmFsaWRhdGUgdGhlIGludmFsaWQgcmVpbnRlcnByZXRfY2FzdHMuCisjZGVmaW5lIFBST1RPQlVGX0ZJRUxEX09GRlNFVChUWVBFLCBGSUVMRCkgICAgICAgICAgICAgICAgICAgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHB1c2giKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdpbnZhbGlkLW9mZnNldG9mXCIiKSBcCisgIF9fYnVpbHRpbl9vZmZzZXRvZihUWVBFLCBGSUVMRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHBvcCIpCisjZWxpZiBQUk9UT0JVRl9HTlVDX01JTig0LCA4KQorI2RlZmluZSBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoVFlQRSwgRklFTEQpIF9fYnVpbHRpbl9vZmZzZXRvZihUWVBFLCBGSUVMRCkKKyNlbHNlICAvLyBkZWZpbmVkKF9fY2xhbmdfXykKKy8vIE5vdGUgdGhhdCB3ZSBjYWxjdWxhdGUgcmVsYXRpdmUgdG8gdGhlIHBvaW50ZXIgdmFsdWUgMTYgaGVyZSBzaW5jZSBpZiB3ZQorLy8ganVzdCB1c2UgemVybywgR0NDIGNvbXBsYWlucyBhYm91dCBkZXJlZmVyZW5jaW5nIGEgTlVMTCBwb2ludGVyLiAgV2UKKy8vIGNob29zZSAxNiByYXRoZXIgdGhhbiBzb21lIG90aGVyIG51bWJlciBqdXN0IGluIGNhc2UgdGhlIGNvbXBpbGVyIHdvdWxkCisvLyBiZSBjb25mdXNlZCBieSBhbiB1bmFsaWduZWQgcG9pbnRlci4KKyNkZWZpbmUgUFJPVE9CVUZfRklFTERfT0ZGU0VUKFRZUEUsIEZJRUxEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWNfY2FzdDwgOjp1aW50MzJfdD4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFlQRSo+KDE2KS0+RklFTEQpIC0gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KDE2KSkKKyNlbmRpZgorCisjaWZkZWYgUFJPVE9CVUZfRVhQT1JUCisjZXJyb3IgUFJPVE9CVUZfRVhQT1JUIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQUk9UT0JVRl9VU0VfRExMUykgJiYgZGVmaW5lZChfTVNDX1ZFUikKKyMgaWYgZGVmaW5lZChMSUJQUk9UT0JVRl9FWFBPUlRTKQorIyAgZGVmaW5lIFBST1RPQlVGX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgIGRlZmluZSBQUk9UT0JVRl9FWFBPUlRfVEVNUExBVEVfREVDTEFSRQorIyAgZGVmaW5lIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUZJTkUgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjIGVsc2UKKyMgIGRlZmluZSBQUk9UT0JVRl9FWFBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICBkZWZpbmUgUFJPVE9CVUZfRVhQT1JUX1RFTVBMQVRFX0RFQ0xBUkUKKyMgIGRlZmluZSBQUk9UT0JVRl9FWFBPUlRfVEVNUExBVEVfREVGSU5FIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyBlbmRpZiAgLy8gZGVmaW5lZChMSUJQUk9UT0JVRl9FWFBPUlRTKQorI2VsaWYgZGVmaW5lZChQUk9UT0JVRl9VU0VfRExMUykgJiYgZGVmaW5lZChMSUJQUk9UT0JVRl9FWFBPUlRTKQorIyBkZWZpbmUgUFJPVE9CVUZfRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjIGRlZmluZSBQUk9UT0JVRl9FWFBPUlRfVEVNUExBVEVfREVDTEFSRSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorIyBkZWZpbmUgUFJPVE9CVUZfRVhQT1JUX1RFTVBMQVRFX0RFRklORQorI2Vsc2UKKyMgZGVmaW5lIFBST1RPQlVGX0VYUE9SVAorIyBkZWZpbmUgUFJPVE9CVUZfRVhQT1JUX1RFTVBMQVRFX0RFQ0xBUkUKKyMgZGVmaW5lIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUZJTkUKKyNlbmRpZgorCisjaWZkZWYgUFJPVE9DX0VYUE9SVAorI2Vycm9yIFBST1RPQ19FWFBPUlQgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBST1RPQlVGX1VTRV9ETExTKSAmJiBkZWZpbmVkKF9NU0NfVkVSKQorIyBpZiBkZWZpbmVkKExJQlBST1RPQ19FWFBPUlRTKQorIyAgZGVmaW5lIFBST1RPQ19FWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjIGVsc2UKKyMgIGRlZmluZSBQUk9UT0NfRVhQT1JUIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyBlbmRpZiAgLy8gZGVmaW5lZChMSUJQUk9UT0NfRVhQT1JUUykKKyNlbGlmIGRlZmluZWQoUFJPVE9CVUZfVVNFX0RMTFMpICYmIGRlZmluZWQoTElCUFJPVE9DX0VYUE9SVFMpCisjIGRlZmluZSBQUk9UT0NfRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZWxzZQorIyBkZWZpbmUgUFJPVE9DX0VYUE9SVAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBST1RPQlVGX1BSRURJQ1RfVFJVRSkgfHwgZGVmaW5lZChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKQorI2Vycm9yIFBST1RPQlVGX1BSRURJQ1RfKFRSVUV8RkFMU0UpIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorI2lmIFBST1RPQlVGX0dOVUNfTUlOKDMsIDApCisjIGRlZmluZSBQUk9UT0JVRl9QUkVESUNUX1RSVUUoeCkgKF9fYnVpbHRpbl9leHBlY3QoZmFsc2UgfHwgKHgpLCB0cnVlKSkKKyMgZGVmaW5lIFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoeCkgKF9fYnVpbHRpbl9leHBlY3QoZmFsc2UgfHwgKHgpLCBmYWxzZSkpCisjZWxzZQorIyBkZWZpbmUgUFJPVE9CVUZfUFJFRElDVF9UUlVFKHgpICh4KQorIyBkZWZpbmUgUFJPVE9CVUZfUFJFRElDVF9GQUxTRSh4KSAoeCkKKyNlbmRpZgorCisjaWZkZWYgUFJPVE9CVUZfTk9ESVNDQVJECisjZXJyb3IgUFJPVE9CVUZfTk9ESVNDQVJEIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorI2lmIF9faGFzX2NwcF9hdHRyaWJ1dGUobm9kaXNjYXJkKSAmJiBQUk9UT0JVRl9DUExVU1BMVVNfTUlOKDIwMTcwM0wpCisjZGVmaW5lIFBST1RPQlVGX05PRElTQ0FSRCBbW25vZGlzY2FyZF1dCisjZWxpZiBfX2hhc19hdHRyaWJ1dGUod2Fybl91bnVzZWRfcmVzdWx0KSB8fCBQUk9UT0JVRl9HTlVDX01JTig0LCA4KQorI2RlZmluZSBQUk9UT0JVRl9OT0RJU0NBUkQgX19hdHRyaWJ1dGVfXygod2Fybl91bnVzZWRfcmVzdWx0KSkKKyNlbHNlCisjZGVmaW5lIFBST1RPQlVGX05PRElTQ0FSRAorI2VuZGlmCisKKy8vIEVuYWJsZSBhbGwgc3RhYmxlIGV4cGVyaW1lbnRzIGlmIHRoaXMgZmxhZyBpcyBzZXQuICBUaGlzIGFsbG93cyB1cyB0byBncm91cAorLy8gYWxsIG9mIHRoZXNlIGV4cGVyaW1lbnRzIHVuZGVyIGEgc2luZ2xlIGJ1aWxkIGZsYWcsIHdoaWNoIGNhbiBiZSBlbmFibGVkIGluCisvLyB0aGUgcHJvdG9idWYuc3RhYmxlLWV4cGVyaW1lbnRzIFRBUCBwcm9qZWN0LgorI2lmZGVmIFBST1RPQlVGX0VOQUJMRV9TVEFCTEVfRVhQRVJJTUVOVFMKKyNkZWZpbmUgUFJPVE9CVUZfRk9SQ0VfTUVTU0FHRV9PV05FRF9BUkVOQQorI2VuZGlmICAvLyAhUFJPVE9CVUZfRU5BQkxFX1NUQUJMRV9FWFBFUklNRU5UUworCisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisjZXJyb3IgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorCisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisjZXJyb3IgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorCisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisjZXJyb3IgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorCisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfUkVTRVRfSU5fQ0xFQVIKKyNlcnJvciBQUk9UT0JVRl9GT1JDRV9SRVNFVF9JTl9DTEVBUiB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKworLy8gRm9yY2UgY29weSB0aGUgZGVmYXVsdCBzdHJpbmcgdG8gYSBzdHJpbmcgZmllbGQgc28gdGhhdCBub24tb3B0aW1pemVkIGJ1aWxkcworLy8gaGF2ZSBoYXJkZXItdG8tcmVseS1vbiBhZGRyZXNzIHN0YWJpbGl0eS4KKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisjZXJyb3IgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORyB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKworI2lmZGVmIFBST1RPQlVGX0ZBTExUSFJPVUdIX0lOVEVOREVECisjZXJyb3IgUFJPVE9CVUZfRkFMTFRIUk9VR0hfSU5URU5ERUQgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjaWYgX19oYXNfY3BwX2F0dHJpYnV0ZShmYWxsdGhyb3VnaCkKKyNkZWZpbmUgUFJPVE9CVUZfRkFMTFRIUk9VR0hfSU5URU5ERUQgW1tmYWxsdGhyb3VnaF1dCisjZWxpZiBfX2hhc19mZWF0dXJlKGN4eF9hdHRyaWJ1dGVzKSAmJiBfX2hhc193YXJuaW5nKCItV2ltcGxpY2l0LWZhbGx0aHJvdWdoIikKKyNkZWZpbmUgUFJPVE9CVUZfRkFMTFRIUk9VR0hfSU5URU5ERUQgW1tjbGFuZzo6ZmFsbHRocm91Z2hdXQorI2VsaWYgUFJPVE9CVUZfR05VQ19NSU4oNywgMCkKKyNkZWZpbmUgUFJPVE9CVUZfRkFMTFRIUk9VR0hfSU5URU5ERUQgW1tnbnU6OmZhbGx0aHJvdWdoXV0KKyNlbHNlCisjZGVmaW5lIFBST1RPQlVGX0ZBTExUSFJPVUdIX0lOVEVOREVECisjZW5kaWYKKworLy8gUFJPVE9CVUZfQVNTVU1FKHByZWQpIHRlbGxzIHRoZSBjb21waWxlciB0aGF0IGl0IGNhbiBhc3N1bWUgcHJlZCBpcyB0cnVlLiBUbworLy8gYmUgc2FmZSwgd2UgYWxzbyB2YWxpZGF0ZSB0aGUgYXNzdW1wdGlvbiB3aXRoIGEgR09PR0xFX0RDSEVDSyBpbiB1bm9wdGltaXplZAorLy8gYnVpbGRzLiBUaGUgbWFjcm8gZG9lcyBub3QgZG8gYW55dGhpbmcgdXNlZnVsIGlmIHRoZSBjb21waWxlciBkb2VzIG5vdAorLy8gc3VwcG9ydCBfX2J1aWx0aW5fYXNzdW1lLgorI2lmZGVmIFBST1RPQlVGX0FTU1VNRQorI2Vycm9yIFBST1RPQlVGX0FTU1VNRSB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNpZiBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9hc3N1bWUpCisjZGVmaW5lIFBST1RPQlVGX0FTU1VNRShwcmVkKSBcCisgIEdPT0dMRV9EQ0hFQ0socHJlZCk7ICAgICAgICAgICAgICAgXAorICBfX2J1aWx0aW5fYXNzdW1lKHByZWQpCisjZWxzZQorI2RlZmluZSBQUk9UT0JVRl9BU1NVTUUocHJlZCkgR09PR0xFX0RDSEVDSyhwcmVkKQorI2VuZGlmCisKKy8vIFNwZWNpZnkgbWVtb3J5IGFsaWdubWVudCBmb3Igc3RydWN0cywgY2xhc3NlcywgZXRjLgorLy8gVXNlIGxpa2U6CisvLyAgIGNsYXNzIFBST1RPQlVGX0FMSUdOQVMoMTYpIE15Q2xhc3MgeyAuLi4gfQorLy8gICBQUk9UT0JVRl9BTElHTkFTKDE2KSBpbnQgYXJyYXlbNF07CisvLworLy8gSW4gbW9zdCBwbGFjZXMgeW91IGNhbiB1c2UgdGhlIEMrKzExIGtleXdvcmQgImFsaWduYXMiLCB3aGljaCBpcyBwcmVmZXJyZWQuCisvLworLy8gQnV0IGNvbXBpbGVycyBoYXZlIHRyb3VibGUgbWl4aW5nIF9fYXR0cmlidXRlX18oKC4uLikpIHN5bnRheCB3aXRoCisvLyBhbGlnbmFzKC4uLikgc3ludGF4LgorLy8KKy8vIERvZXNuJ3Qgd29yayBpbiBjbGFuZyBvciBnY2M6CisvLyAgIHN0cnVjdCBhbGlnbmFzKDE2KSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBTIHsgY2hhciBjOyB9OworLy8gV29ya3MgaW4gY2xhbmcgYnV0IG5vdCBnY2M6CisvLyAgIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhbGlnbmFzKDE2KSBTMiB7IGNoYXIgYzsgfTsKKy8vIFdvcmtzIGluIGNsYW5nIGFuZCBnY2M6CisvLyAgIHN0cnVjdCBhbGlnbmFzKDE2KSBTMyB7IGNoYXIgYzsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8vCisvLyBUaGVyZSBhcmUgYWxzbyBzb21lIGF0dHJpYnV0ZXMgdGhhdCBtdXN0IGJlIHNwZWNpZmllZCAqYmVmb3JlKiBhIGNsYXNzCisvLyBkZWZpbml0aW9uOiB2aXNpYmlsaXR5ICh1c2VkIGZvciBleHBvcnRpbmcgZnVuY3Rpb25zL2NsYXNzZXMpIGlzIG9uZSBvZgorLy8gdGhlc2UgYXR0cmlidXRlcy4gVGhpcyBtZWFucyB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgYWxpZ25hcygpIHdpdGggYQorLy8gY2xhc3MgdGhhdCBpcyBtYXJrZWQgYXMgZXhwb3J0ZWQuCisjaWZkZWYgUFJPVE9CVUZfQUxJR05BUworI2Vycm9yIFBST1RPQlVGX0FMSUdOQVMgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgUFJPVE9CVUZfQUxJR05BUyhieXRlX2FsaWdubWVudCkgX19kZWNsc3BlYyhhbGlnbihieXRlX2FsaWdubWVudCkpCisjZWxpZiBQUk9UT0JVRl9HTlVDX01JTigzLCAwKQorI2RlZmluZSBQUk9UT0JVRl9BTElHTkFTKGJ5dGVfYWxpZ25tZW50KSBcCisgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoYnl0ZV9hbGlnbm1lbnQpKSkKKyNlbHNlCisjZGVmaW5lIFBST1RPQlVGX0FMSUdOQVMoYnl0ZV9hbGlnbm1lbnQpIGFsaWduYXMoYnl0ZV9hbGlnbm1lbnQpCisjZW5kaWYKKworI2lmZGVmIFBST1RPQlVGX0ZJTkFMCisjZXJyb3IgUFJPVE9CVUZfRklOQUwgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjZGVmaW5lIFBST1RPQlVGX0ZJTkFMIGZpbmFsCisKKyNpZmRlZiBQUk9UT0JVRl9USFJFQURfTE9DQUwKKyNlcnJvciBQUk9UT0JVRl9USFJFQURfTE9DQUwgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgUFJPVE9CVUZfVEhSRUFEX0xPQ0FMIF9fZGVjbHNwZWModGhyZWFkKQorI2Vsc2UKKyNkZWZpbmUgUFJPVE9CVUZfVEhSRUFEX0xPQ0FMIF9fdGhyZWFkCisjZW5kaWYKKworLy8gVE9ETyhiLzIyODE3Mzg0Myk6IGNsZWFudXAgUFJPVE9CVUZfTElUVExFX0VORElBTiBpbiB2YXJpb3VzIDNwIGZvcmtzLgorI2lmIChkZWZpbmVkKF9fQllURV9PUkRFUl9fKSAmJiBkZWZpbmVkKF9fT1JERVJfTElUVExFX0VORElBTl9fKSAmJiBcCisgICAgIF9fQllURV9PUkRFUl9fID09IF9fT1JERVJfTElUVExFX0VORElBTl9fKQorI2RlZmluZSBQUk9UT0JVRl9MSVRUTEVfRU5ESUFOIDEKKyNpZmRlZiBQUk9UT0JVRl9CSUdfRU5ESUFOCisjZXJyb3IgQ29uZmxpY3RpbmcgUFJPVE9CVUZfQklHX0VORElBTiB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoX19CWVRFX09SREVSX18pICYmIGRlZmluZWQoX19PUkRFUl9CSUdfRU5ESUFOX18pICYmIFwKKyAgICBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0JJR19FTkRJQU5fXworI2RlZmluZSBQUk9UT0JVRl9CSUdfRU5ESUFOIDEKKyNlbGlmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19hYXJjaDY0X18pCisjZGVmaW5lIFBST1RPQlVGX0xJVFRMRV9FTkRJQU4gMQorI2Vsc2UKKyNlcnJvciAiZW5kaWFuIGRldGVjdGlvbiBmYWlsZWQgZm9yIGN1cnJlbnQgY29tcGlsZXIiCisjZW5kaWYKKworLy8gRm9yIGVuYWJsaW5nIG1lc3NhZ2Ugb3duZWQgYXJlbmEsIG9uZSBtYWpvciBibG9ja2VyIGlzIHNlbWFudGljIGNoYW5nZSBmcm9tCisvLyBtb3ZpbmcgdG8gY29weWluZyB3aGVuIHRoZXJlIGlzIG93bmVyc2hpcCB0cmFuc2ZlciAoZS5nLiwgbW92ZSBjdG9yLCBzd2FwLAorLy8gc2V0IGFsbG9jYXRlZCwgcmVsZWFzZSkuIFRoaXMgY2hhbmdlIG5vdCBvbmx5IGNhdXNlcyBwZXJmb3JtYW5jZSByZWdyZXNzaW9uCisvLyBidXQgYWxzbyBicmVha3MgdXNlcnMgY29kZSAoZS5nLiwgZGFuZ2xpbmcgcmVmZXJlbmNlKS4gRm9yIHRvcC1sZXZlbAorLy8gbWVzc2FnZXMsIHNpbmNlIGl0IG93bnMgdGhlIGFyZW5hLCB3ZSBjYW4gbWl0aWdhdGUgdGhlIGlzc3VlIGJ5IHRyYW5zZmVycmluZworLy8gb3duZXJzaGlwIG9mIGFyZW5hLiBIb3dldmVyLCB3ZSBjYW5ub3QgZG8gdGhhdCBmb3IgbmVzdGVkIG1lc3NhZ2VzLiBJbiBvcmRlcgorLy8gdG8gdGVsbCBob3cgbWFueSB1c2FnZXMgb2YgbmVzdGVkIG1lc3NhZ2VzIGFmZmVjdGVkIGJ5IG1lc3NhZ2Ugb3duZWQgYXJlbmEsCisvLyB3ZSBuZWVkIHRvIHNpbXVsYXRlIHRoZSBhcmVuYSBvd25lcnNoaXAuCisvLyBUaGlzIGV4cGVyaW1lbnQgaXMgcHVyZWx5IGZvciB0aGUgcHVycG9zZSBvZiBnYXRoZXJpbmcgZGF0YS4gQWxsIGNvZGUgZ3VhcmRlZAorLy8gYnkgdGhpcyBmbGFnIGlzIHN1cHBvc2VkIHRvIGJlIHJlbW92ZWQgYWZ0ZXIgdGhpcyBleHBlcmltZW50LgorI2RlZmluZSBQUk9UT0JVRl9NRVNTQUdFX09XTkVEX0FSRU5BX0VYUEVSSU1FTlQKKyNpZmRlZiBQUk9UT0JVRl9DT05TVElOSVQKKyNlcnJvciBQUk9UT0JVRl9DT05TVElOSVQgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjaWYgZGVmaW5lZChfX2NwcF9jb25zdGluaXQpICYmICFkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBQUk9UT0JVRl9DT05TVElOSVQgY29uc3Rpbml0CisjZGVmaW5lIFBST1RPQlVGX0NPTlNURVhQUiBjb25zdGV4cHIKKy8vIFNvbWUgb2xkZXIgQ2xhbmcgdmVyc2lvbnMgaW5jb3JyZWN0bHkgcmFpc2UgYW4gZXJyb3IgYWJvdXQKKy8vIGNvbnN0YW50LWluaXRpYWxpemluZyB3ZWFrIGRlZmF1bHQgaW5zdGFuY2UgcG9pbnRlcnMuIFZlcnNpb25zIDEyLjAgYW5kCisvLyBoaWdoZXIgc2VlbSB0byB3b3JrLCBleGNlcHQgdGhhdCBYQ29kZSAxMi41LjEgc2hvd3MgdGhlIGVycm9yIGV2ZW4gdGhvdWdoIGl0CisvLyB1c2VzIENsYW5nIDEyLjAuNS4KKy8vIENsYW5nLWNsIG9uIFdpbmRvd3MgcmFpc2VzIGVycm9yIGFsc28uCisjZWxpZiAhZGVmaW5lZChfTVNDX1ZFUikgJiYgX19oYXNfY3BwX2F0dHJpYnV0ZShjbGFuZzo6cmVxdWlyZV9jb25zdGFudF9pbml0aWFsaXphdGlvbikgJiYgXAorICAgICgoZGVmaW5lZChfX0FQUExFX18pICYmIF9fY2xhbmdfbWFqb3JfXyA+PSAxMykgfHwgICAgICAgICAgICAgICAgXAorICAgICAoIWRlZmluZWQoX19BUFBMRV9fKSAmJiBfX2NsYW5nX21ham9yX18gPj0gMTIpKQorI2RlZmluZSBQUk9UT0JVRl9DT05TVElOSVQgW1tjbGFuZzo6cmVxdWlyZV9jb25zdGFudF9pbml0aWFsaXphdGlvbl1dCisjZGVmaW5lIFBST1RPQlVGX0NPTlNURVhQUiBjb25zdGV4cHIKKyNlbGlmIFBST1RPQlVGX0dOVUNfTUlOKDEyLCAyKQorI2RlZmluZSBQUk9UT0JVRl9DT05TVElOSVQgX19jb25zdGluaXQKKyNkZWZpbmUgUFJPVE9CVUZfQ09OU1RFWFBSIGNvbnN0ZXhwcgorLy8gTVNWQyAxNyBjdXJyZW50bHkgc2VlbXMgdG8gcmFpc2UgYW4gZXJyb3IgYWJvdXQgY29uc3RhbnQtaW5pdGlhbGl6ZWQgcG9pbnRlcnMuCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxOTMwCisjZGVmaW5lIFBST1RPQlVGX0NPTlNUSU5JVAorI2RlZmluZSBQUk9UT0JVRl9DT05TVEVYUFIgY29uc3RleHByCisjZWxzZQorI2RlZmluZSBQUk9UT0JVRl9DT05TVElOSVQKKyNkZWZpbmUgUFJPVE9CVUZfQ09OU1RFWFBSCisjZW5kaWYKKworLy8gU29tZSBnbG9iYWxzIHdpdGggYW4gZW1wdHkgbm9uLXRyaXZpYWwgZGVzdHJ1Y3RvciBhcmUgYW5ub3RhdGVkIHdpdGgKKy8vIG5vX2Rlc3Ryb3kgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIEl0IHJlZHVjZXMgdGhlIGNvc3Qgb2YgdGhlc2UgZ2xvYmFscyBpbgorLy8gbm9uLW9wdCBtb2RlIGFuZCB1bmRlciBzYW5pdGl6ZXJzLgorI2lmZGVmIFBST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZCisjZXJyb3IgUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjaWYgX19oYXNfY3BwX2F0dHJpYnV0ZShjbGFuZzo6bm9fZGVzdHJveSkKKyNkZWZpbmUgUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgW1tjbGFuZzo6bm9fZGVzdHJveV1dCisjZWxzZQorI2RlZmluZSBQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWQorI2VuZGlmCisKKy8vIEZvcmNlIGNsYW5nIHRvIGFsd2F5cyBlbWl0IGNvbXBsZXRlIGRlYnVnIGluZm8gZm9yIGEgdHlwZS4KKy8vIENsYW5nIHVzZXMgY29uc3RydWN0b3IgaG9taW5nIHRvIGRldGVybWluZSB3aGVuIHRvIGVtaXQgZGVidWcgaW5mbyBmb3IgYQorLy8gdHlwZS4gSWYgdGhlIGNvbnN0cnVjdG9yIG9mIGEgdHlwZSBpcyBuZXZlciB1c2VkLCB3aGljaCBjYW4gaGFwcGVuIGluIHNvbWUKKy8vIGNhc2VzIHdoZXJlIG1lbWJlciB2YXJpYWJsZXMgYXJlIGNvbnN0cnVjdGVkIGluIHBsYWNlIGZvciBvcHRpbWl6YXRpb24KKy8vIHB1cnBvc2VzIChzZWUgYi8yMDg4MDMxNzUgZm9yIGFuIGV4YW1wbGUpLCB0aGUgdHlwZSB3aWxsIGhhdmUgaW5jb21wbGV0ZQorLy8gZGVidWcgaW5mbyB1bmxlc3MgdGhpcyBhdHRyaWJ1dGUgaXMgdXNlZC4KKyNpZmRlZiBQUk9UT0JVRl9BVFRSSUJVVEVfU1RBTkRBTE9ORV9ERUJVRworI2Vycm9yIFBST1RPQlVGX0FUVFJJQlVURV9TVEFOREFMT05FX0RFQlVHIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorI2lmIF9faGFzX2NwcF9hdHRyaWJ1dGUoY2xhbmc6OnN0YW5kYWxvbmVfZGVidWcpCisjZGVmaW5lIFBST1RPQlVGX0FUVFJJQlVURV9TVEFOREFMT05FX0RFQlVHIFtbY2xhbmc6OnN0YW5kYWxvbmVfZGVidWddXQorI2Vsc2UKKyNkZWZpbmUgUFJPVE9CVUZfQVRUUklCVVRFX1NUQU5EQUxPTkVfREVCVUcKKyNlbmRpZgorCisvLyBQcm90b2J1ZiBleHRlbnNpb25zIGFuZCByZWZsZWN0aW9uIHJlcXVpcmUgcmVnaXN0cmF0aW9uIG9mIHRoZSBwcm90b3MgbGlua2VkCisvLyBpbiB0aGUgYmluYXJ5LiBOb3QgdW50aWwgZXZlcnl0aGluZyBpcyByZWdpc3RlcmVkIGRvZXMgdGhlIHJ1bnRpbWUgaGF2ZSBhCisvLyBjb21wbGV0ZSB2aWV3IG9uIGFsbCBwcm90b3MuIFdoZW4gY29kZSBpcyB1c2luZyByZWZsZWN0aW9uIG9yIGV4dGVuc2lvbnMKKy8vIGluIGJldHdlZW4gcmVnaXN0cmF0aW9uIGNhbGxzIHRoaXMgY2FuIGxlYWQgdG8gc3VycHJpc2luZyBiZWhhdmlvci4gQnkKKy8vIGhhdmluZyB0aGUgcmVnaXN0cmF0aW9uIHJ1biBmaXJzdCB3ZSBtaXRpZ2F0ZSB0aGlzIHNjZW5hcmlvLgorLy8gSGlnaGVzdCBwcmlvcml0eSBpcyAxMDEuIFdlIHVzZSAxMDIgZm9yIHJlZ2lzdHJhdGlvbiwgdG8gYWxsb3cgY29kZSB0aGF0CisvLyByZWFsbHkgd2FudHMgdG8gaGlnaGVyIHByaW9yaXR5IHRvIHN0aWxsIGJlYXQgdXMuIFNvbWUgaW5pdGlhbGl6YXRpb24gaGFwcGVucworLy8gYXQgaGlnaGVyIHByaW9yaXR5LCB0aG91Z2gsIHNpbmNlIGl0IGlzIG5lZWRlZCBiZWZvcmUgcmVnaXN0cmF0aW9uLgorI2lmZGVmIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMQorI2Vycm9yIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNpZmRlZiBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTIKKyNlcnJvciBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTIgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjaWYgUFJPVE9CVUZfR05VQ19NSU4oMywgMCkgJiYgKCFkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX2NsYW5nX18pKSAmJiBcCisgICAgISgoZGVmaW5lZChzdW4pIHx8IGRlZmluZWQoX19zdW4pKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoZGVmaW5lZChfX1NWUjQpIHx8IGRlZmluZWQoX19zdnI0X18pKSkKKyNkZWZpbmUgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIF9fYXR0cmlidXRlX18oKGluaXRfcHJpb3JpdHkoKDEwMSkpKSkKKyNkZWZpbmUgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkyIF9fYXR0cmlidXRlX18oKGluaXRfcHJpb3JpdHkoKDEwMikpKSkKKyNlbHNlCisjZGVmaW5lIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMQorI2RlZmluZSBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTIKKyNlbmRpZgorCisjaWZkZWYgUFJPVE9CVUZfUFJBR01BX0lOSVRfU0VHCisjZXJyb3IgUFJPVE9CVUZfUFJBR01BX0lOSVRfU0VHIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIFBST1RPQlVGX1BSQUdNQV9JTklUX1NFRyBfX3ByYWdtYShpbml0X3NlZyhsaWIpKQorI2Vsc2UKKyNkZWZpbmUgUFJPVE9CVUZfUFJBR01BX0lOSVRfU0VHCisjZW5kaWYKKworI2lmZGVmIFBST1RPQlVGX0FUVFJJQlVURV9XRUFLCisjZXJyb3IgUFJPVE9CVUZfQVRUUklCVVRFX1dFQUsgd2FzIHByZXZpb3VzbHkgZGVmaW5lZAorI2VuZGlmCisjaWYgX19oYXNfYXR0cmlidXRlKHdlYWspICYmIFwKKyAgICAhZGVmaW5lZChfX0FQUExFX18pICYmIFwKKyAgICAoIWRlZmluZWQoX1dJTjMyKSB8fCBfX2NsYW5nX21ham9yX18gPCA5KSAmJiBcCisgICAgIWRlZmluZWQoX19NSU5HVzMyX18pCisjZGVmaW5lIFBST1RPQlVGX0FUVFJJQlVURV9XRUFLIF9fYXR0cmlidXRlX18oKHdlYWspKQorI2RlZmluZSBQUk9UT0JVRl9IQVZFX0FUVFJJQlVURV9XRUFLIDEKKyNlbHNlCisjZGVmaW5lIFBST1RPQlVGX0FUVFJJQlVURV9XRUFLCisjZGVmaW5lIFBST1RPQlVGX0hBVkVfQVRUUklCVVRFX1dFQUsgMAorI2VuZGlmCisKKy8vIE1hY3JvcyB0byBkZXRlY3Qgc2FuaXRpemVycy4KKyNpZmRlZiBQUk9UT0JVRl9BU0FOCisjZXJyb3IgUFJPVE9CVUZfQVNBTiB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNpZmRlZiBQUk9UT0JVRl9NU0FOCisjZXJyb3IgUFJPVE9CVUZfTVNBTiB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNpZmRlZiBQUk9UT0JVRl9UU0FOCisjZXJyb3IgUFJPVE9CVUZfVFNBTiB3YXMgcHJldmlvdXNseSBkZWZpbmVkCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyMgIGlmIF9faGFzX2ZlYXR1cmUoYWRkcmVzc19zYW5pdGl6ZXIpCisjICAgIGRlZmluZSBQUk9UT0JVRl9BU0FOIDEKKyMgIGVuZGlmCisjICBpZiBfX2hhc19mZWF0dXJlKHRocmVhZF9zYW5pdGl6ZXIpCisjICAgIGRlZmluZSBQUk9UT0JVRl9UU0FOIDEKKyMgIGVuZGlmCisjICBpZiBfX2hhc19mZWF0dXJlKG1lbW9yeV9zYW5pdGl6ZXIpCisjICAgIGRlZmluZSBQUk9UT0JVRl9NU0FOIDEKKyMgIGVuZGlmCisjZWxpZiBQUk9UT0JVRl9HTlVDX01JTigzLCAwKQorLy8gRG91YmxlLWd1YXJkIGlzIG5lZWRlZCBmb3IgLVd1bmRlZjoKKyMgIGlmZGVmIF9fU0FOSVRJWkVfQUREUkVTU19fCisjICBpZiAgICBfX1NBTklUSVpFX0FERFJFU1NfXworIyAgICBkZWZpbmUgUFJPVE9CVUZfQVNBTiAxCisjICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmZGVmIF9fU0FOSVRJWkVfVEhSRUFEX18KKyMgIGlmICAgIF9fU0FOSVRJWkVfVEhSRUFEX18KKyMgICAgZGVmaW5lIFBST1RPQlVGX1RTQU4gMQorIyAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLy8gVGFpbCBjYWxsIHRhYmxlLWRyaXZlbiBwYXJzaW5nIGNhbiBiZSBlbmFibGVkIGJ5IGRlZmluaW5nCisvLyBQUk9UT0JVRl9FWFBFUklNRU5UQUxfVVNFX1RBSUxfQ0FMTF9UQUJMRV9QQVJTRVIgYXQgY29tcGlsYXRpb24gdGltZS4gTm90ZQorLy8gdGhhdCB0aGlzIG1hY3JvIGlzIGZvciBzbWFsbC1zY2FsZSB0ZXN0aW5nIG9ubHksIGFuZCBpcyBub3Qgc3VwcG9ydGVkLgorI2lmZGVmIFBST1RPQlVGX1RBSUxfQ0FMTF9UQUJMRV9QQVJTRVJfRU5BQkxFRAorI2Vycm9yIFBST1RPQlVGX1RBSUxfQ0FMTF9UQUJMRV9QQVJTRVJfRU5BQkxFRCB3YXMgcHJldmlvdXNseSBkZWNsYXJlZAorI2VuZGlmCisjaWYgZGVmaW5lZChQUk9UT0JVRl9FWFBFUklNRU5UQUxfVVNFX1RBSUxfQ0FMTF9UQUJMRV9QQVJTRVIpCisjZGVmaW5lIFBST1RPQlVGX1RBSUxfQ0FMTF9UQUJMRV9QQVJTRVJfRU5BQkxFRCAxCisjZW5kaWYKKworI2RlZmluZSBQUk9UT0JVRl9UQ19QQVJBTV9ERUNMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlICptc2csIGNvbnN0IGNoYXIgKnB0ciwgICAgICAgICAgICAgICAgIFwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCAqY3R4LCAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpUY1BhcnNlVGFibGVCYXNlICp0YWJsZSwgICAgICAgXAorICAgICAgdWludDY0X3QgaGFzYml0cywgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6VGNGaWVsZERhdGEgZGF0YQorCisjaWZkZWYgUFJPVE9CVUZfVU5VU0VECisjZXJyb3IgUFJPVE9CVUZfVU5VU0VEIHdhcyBwcmV2aW91c2x5IGRlZmluZWQKKyNlbmRpZgorI2lmIF9faGFzX2NwcF9hdHRyaWJ1dGUobWF5YmVfdW51c2VkKSB8fCBcCisgICAgKFBST1RPQlVGX01TQ19WRVJfTUlOKDE5MTEpICYmIFBST1RPQlVGX0NQTFVTUExVU19NSU4oMjAxNzAzTCkpCisjZGVmaW5lIFBST1RPQlVGX1VOVVNFRCBbW21heWJlX3VudXNlZF1dCisjZWxpZiBfX2hhc19hdHRyaWJ1dGUodW51c2VkKSB8fCBQUk9UT0JVRl9HTlVDX01JTigzLCAwKQorI2RlZmluZSBQUk9UT0JVRl9VTlVTRUQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCisjZWxzZQorI2RlZmluZSBQUk9UT0JVRl9VTlVTRUQKKyNlbmRpZgorCisvLyBUaHJlYWRTYWZlQXJlbmF6IGlzIHR1cm5lZCBvZmYgY29tcGxldGVseSBpbiBvcGVuc291cmNlIGJ1aWxkcy4KKworLy8gV2luZG93cyBkZWNsYXJlcyBzZXZlcmFsIGluY29udmVuaWVudCBtYWNybyBuYW1lcy4gIFdlICN1bmRlZiB0aGVtIGFuZCB0aGVuCisvLyByZXN0b3JlIHRoZW0gaW4gcG9ydF91bmRlZi5pbmMuCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgcHVzaF9tYWNybygiQ1JFQVRFX05FVyIpCisjdW5kZWYgQ1JFQVRFX05FVworI3ByYWdtYSBwdXNoX21hY3JvKCJERUxFVEUiKQorI3VuZGVmIERFTEVURQorI3ByYWdtYSBwdXNoX21hY3JvKCJET1VCTEVfQ0xJQ0siKQorI3VuZGVmIERPVUJMRV9DTElDSworI3ByYWdtYSBwdXNoX21hY3JvKCJFUlJPUiIpCisjdW5kZWYgRVJST1IKKyNwcmFnbWEgcHVzaF9tYWNybygiRVJST1JfQlVTWSIpCisjdW5kZWYgRVJST1JfQlVTWQorI3ByYWdtYSBwdXNoX21hY3JvKCJFUlJPUl9JTlNUQUxMX0ZBSUxFRCIpCisjdW5kZWYgRVJST1JfSU5TVEFMTF9GQUlMRUQKKyNwcmFnbWEgcHVzaF9tYWNybygiRVJST1JfTk9UX0ZPVU5EIikKKyN1bmRlZiBFUlJPUl9OT1RfRk9VTkQKKyNwcmFnbWEgcHVzaF9tYWNybygiR2V0Q2xhc3NOYW1lIikKKyN1bmRlZiBHZXRDbGFzc05hbWUKKyNwcmFnbWEgcHVzaF9tYWNybygiR2V0TWVzc2FnZSIpCisjdW5kZWYgR2V0TWVzc2FnZQorI3ByYWdtYSBwdXNoX21hY3JvKCJHZXRPYmplY3QiKQorI3VuZGVmIEdldE9iamVjdAorI3ByYWdtYSBwdXNoX21hY3JvKCJJR05PUkUiKQorI3VuZGVmIElHTk9SRQorI3ByYWdtYSBwdXNoX21hY3JvKCJJTiIpCisjdW5kZWYgSU4KKyNwcmFnbWEgcHVzaF9tYWNybygiSU5QVVRfS0VZQk9BUkQiKQorI3VuZGVmIElOUFVUX0tFWUJPQVJECisjcHJhZ21hIHB1c2hfbWFjcm8oIk5PX0VSUk9SIikKKyN1bmRlZiBOT19FUlJPUgorI3ByYWdtYSBwdXNoX21hY3JvKCJPVVQiKQorI3VuZGVmIE9VVAorI3ByYWdtYSBwdXNoX21hY3JvKCJPUFRJT05BTCIpCisjdW5kZWYgT1BUSU9OQUwKKyNwcmFnbWEgcHVzaF9tYWNybygibWluIikKKyN1bmRlZiBtaW4KKyNwcmFnbWEgcHVzaF9tYWNybygibWF4IikKKyN1bmRlZiBtYXgKKyNwcmFnbWEgcHVzaF9tYWNybygiTkVBUiIpCisjdW5kZWYgTkVBUgorI3ByYWdtYSBwdXNoX21hY3JvKCJOT19EQVRBIikKKyN1bmRlZiBOT19EQVRBCisjcHJhZ21hIHB1c2hfbWFjcm8oIlJFQVNPTl9VTktOT1dOIikKKyN1bmRlZiBSRUFTT05fVU5LTk9XTgorI3ByYWdtYSBwdXNoX21hY3JvKCJTRVJWSUNFX0RJU0FCTEVEIikKKyN1bmRlZiBTRVJWSUNFX0RJU0FCTEVECisjcHJhZ21hIHB1c2hfbWFjcm8oIlNFVkVSSVRZX0VSUk9SIikKKyN1bmRlZiBTRVZFUklUWV9FUlJPUgorI3ByYWdtYSBwdXNoX21hY3JvKCJTVEFUVVNfUEVORElORyIpCisjdW5kZWYgU1RBVFVTX1BFTkRJTkcKKyNwcmFnbWEgcHVzaF9tYWNybygiU1RSSUNUIikKKyN1bmRlZiBTVFJJQ1QKKyNwcmFnbWEgcHVzaF9tYWNybygidGltZXpvbmUiKQorI3VuZGVmIHRpbWV6b25lCisjZW5kaWYgIC8vIF9NU0NfVkVSCisKKyNpZmRlZiBfX0FQUExFX18KKy8vIEluY29udmVuaWVudCBtYWNybyBuYW1lcyBmcm9tIHVzci9pbmNsdWRlL21hdGguaCBpbiBzb21lIG1hY09TIFNES3MuCisjcHJhZ21hIHB1c2hfbWFjcm8oIkRPTUFJTiIpCisjdW5kZWYgRE9NQUlOCisvLyBJbmNvbnZlbmllbnQgbWFjcm8gbmFtZXMgZnJvbSAvdXNyL2luY2x1ZGUvbWFjaC9ib29sZWFuLmggaW4gc29tZSBtYWNPUyBTREtzLgorI3ByYWdtYSBwdXNoX21hY3JvKCJUUlVFIikKKyN1bmRlZiBUUlVFCisjcHJhZ21hIHB1c2hfbWFjcm8oIkZBTFNFIikKKyN1bmRlZiBGQUxTRQorLy8gSW5jb252ZW5pZW50IG1hY3JvIG5hbWVzIGZyb20gdXNyL2luY2x1ZGUvc3lzL3N5c2xpbWl0cy5oIGluIHNvbWUgbWFjT1MgU0RLcy4KKyNwcmFnbWEgcHVzaF9tYWNybygiVUlEX01BWCIpCisjdW5kZWYgVUlEX01BWAorI2VuZGlmICAvLyBfX0FQUExFX18KKworI2lmIGRlZmluZWQoX19jbGFuZ19fKSB8fCBQUk9UT0JVRl9HTlVDX01JTigzLCAwKSB8fCBkZWZpbmVkKF9NU0NfVkVSKQorLy8gRG9uJ3QgbGV0IE9iamVjdGl2ZS1DIE1hY3JvcyBpbnRlcmZlcmUgd2l0aCBwcm90byBpZGVudGlmaWVycyB3aXRoIHRoZSBzYW1lCisvLyBuYW1lLgorI3ByYWdtYSBwdXNoX21hY3JvKCJERUJVRyIpCisjdW5kZWYgREVCVUcKKyNlbmRpZiAvLyBkZWZpbmVkKF9fY2xhbmdfXykgfHwgUFJPVE9CVUZfR05VQ19NSU4oMywgMCkgfHwgZGVmaW5lZChfTVNDX1ZFUikKKworI2lmIFBST1RPQlVGX0dOVUNfTUlOKDMsIDApCisvLyBHQ0MgZG9lcyBub3QgYWxsb3cgZGlzYWJsaW5nIGRpYWdub3N0aWNzIHdpdGhpbiBhbiBleHByZXNzaW9uOgorLy8gaHR0cHM6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NjA4NzUsIHNvIHdlIGRpc2FibGUgdGhpcyBvbmUKKy8vIGdsb2JhbGx5IGV2ZW4gdGhvdWdoIGl0J3Mgb25seSB1c2VkIGZvciBQUk9UT0JVRl9GSUVMRF9PRkZTRVQuCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdpbnZhbGlkLW9mZnNldG9mIgorI2VuZGlmCisKKy8vIFNpbGVuY2Ugc29tZSBNU1ZDIHdhcm5pbmdzIGluIGFsbCBvdXIgY29kZS4KKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisvLyBGb3Igbm9uLXRyaXZpYWwgdW5pb25zCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ1ODIpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ1ODMpCisvLyBGb3IgaW5pdF9zZWcobGliKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MDczKQorLy8gVG8gc2lsZW5jZSB0aGUgZmFjdCB0aGF0IHdlIHdpbGwgcG9wIHRoaXMgcHVzaCBmcm9tIGFub3RoZXIgZmlsZQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA1MDMxKQorLy8gQ29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudAorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQxMjcpCisvLyBkZWNpbWFsIGRpZ2l0IHRlcm1pbmF0ZXMgb2N0YWwgZXNjYXBlIHNlcXVlbmNlCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDEyNSkKKyNlbmRpZgorCisvLyBXZSBkb24ndCB3YW50IGNvZGUgb3V0c2lkZSBwb3J0X2RlZiBkb2luZyBjb21wbGV4IHRlc3RpbmcsIHNvCisvLyByZW1vdmUgb3VyIHBvcnRhYmxlIGNvbmRpdGlvbiB0ZXN0IG1hY3JvcyB0byBudWRnZSBmb2xrcyBhd2F5IGZyb20KKy8vIHVzaW5nIGl0IHRoZW1zZWx2ZXMuCisjaWZkZWYgUFJPVE9CVUZfaGFzX2NwcF9hdHRyaWJ1dGVfREVGSU5FRF8KKyMgIHVuZGVmIF9faGFzX2NwcF9hdHRyaWJ1dGUKKyMgIHVuZGVmIFBST1RPQlVGX2hhc19jcHBfYXR0cmlidXRlX0RFRklORURfCisjZW5kaWYKKyNpZmRlZiBQUk9UT0JVRl9oYXNfZmVhdHVyZV9ERUZJTkVEXworIyAgdW5kZWYgX19oYXNfZmVhdHVyZQorIyAgdW5kZWYgUFJPVE9CVUZfaGFzX2ZlYXR1cmVfREVGSU5FRF8KKyNlbmRpZgorI2lmZGVmIFBST1RPQlVGX2hhc193YXJuaW5nX0RFRklORURfCisjICB1bmRlZiBfX2hhc193YXJuaW5nCisjICB1bmRlZiBQUk9UT0JVRl9oYXNfd2FybmluZ19ERUZJTkVEXworI2VuZGlmCisjaWZkZWYgUFJPVE9CVUZfaGFzX2F0dHJpYnV0ZV9ERUZJTkVEXworIyAgdW5kZWYgX19oYXNfYXR0cmlidXRlCisjICB1bmRlZiBQUk9UT0JVRl9oYXNfYXR0cmlidXRlX0RFRklORURfCisjZW5kaWYKKyNpZmRlZiBQUk9UT0JVRl9oYXNfYnVpbHRpbl9ERUZJTkVEXworIyAgdW5kZWYgX19oYXNfYnVpbHRpbgorIyAgdW5kZWYgUFJPVE9CVUZfaGFzX2J1aWx0aW5fREVGSU5FRF8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4MGZhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmMKQEAgLTAsMCArMSwxNjAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyAjdW5kZWZzIGFsbCBtYWNyb3MgZGVmaW5lZCBpbiBwb3J0X2RlZi5pbmMuICBTZWUgY29tbWVudHMgaW4gcG9ydF9kZWYuaW5jCisvLyBmb3IgbW9yZSBpbmZvLgorCisjaWZuZGVmIFBST1RPQlVGX05BTUVTUEFDRQorI2Vycm9yICJwb3J0X3VuZGVmLmluYyBtdXN0IGJlIGluY2x1ZGVkIGFmdGVyIHBvcnRfZGVmLmluYyIKKyNlbmRpZgorCisjdW5kZWYgUFJPVE9CVUZfQlVJTFRJTl9CU1dBUDE2CisjdW5kZWYgUFJPVE9CVUZfQlVJTFRJTl9CU1dBUDMyCisjdW5kZWYgUFJPVE9CVUZfQlVJTFRJTl9CU1dBUDY0CisjdW5kZWYgUFJPVE9CVUZfR05VQ19NSU4KKyN1bmRlZiBQUk9UT0JVRl9NU0NfVkVSX01JTgorI3VuZGVmIFBST1RPQlVGX0NQTFVTUExVU19NSU4KKyN1bmRlZiBQUk9UT0JVRl9OQU1FU1BBQ0UKKyN1bmRlZiBQUk9UT0JVRl9OQU1FU1BBQ0VfSUQKKyN1bmRlZiBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCisjdW5kZWYgUFJPVE9CVUZfTkRFQlVHX0lOTElORQorI3VuZGVmIFBST1RPQlVGX01VU1RUQUlMCisjdW5kZWYgUFJPVE9CVUZfVEFJTENBTEwKKyN1bmRlZiBQUk9UT0JVRl9DT0xECisjdW5kZWYgUFJPVE9CVUZfTk9JTkxJTkUKKyN1bmRlZiBQUk9UT0JVRl9TRUNUSU9OX1ZBUklBQkxFCisjdW5kZWYgUFJPVE9CVUZfREVQUkVDQVRFRAorI3VuZGVmIFBST1RPQlVGX0RFUFJFQ0FURURfRU5VTQorI3VuZGVmIFBST1RPQlVGX0RFUFJFQ0FURURfTVNHCisjdW5kZWYgUFJPVE9CVUZfRlVOQ19BTElHTgorI3VuZGVmIFBST1RPQlVGX1JFVFVSTlNfTk9OTlVMTAorI3VuZGVmIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTCisjdW5kZWYgUFJPVE9CVUZfUlRUSQorI3VuZGVmIFBST1RPQlVGX1ZFUlNJT04KKyN1bmRlZiBQUk9UT0JVRl9WRVJTSU9OX1NVRkZJWAorI3VuZGVmIFBST1RPQlVGX0ZJRUxEX09GRlNFVAorI3VuZGVmIFBST1RPQlVGX01JTl9IRUFERVJfVkVSU0lPTl9GT1JfUFJPVE9DCisjdW5kZWYgUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCisjdW5kZWYgUFJPVE9CVUZfUFJFRElDVF9UUlVFCisjdW5kZWYgUFJPVE9CVUZfUFJFRElDVF9GQUxTRQorI3VuZGVmIFBST1RPQlVGX0ZBTExUSFJPVUdIX0lOVEVOREVECisjdW5kZWYgUFJPVE9CVUZfRVhQT1JUCisjdW5kZWYgUFJPVE9DX0VYUE9SVAorI3VuZGVmIFBST1RPQlVGX05PRElTQ0FSRAorI3VuZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorI3VuZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorI3VuZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorI3VuZGVmIFBST1RPQlVGX0ZPUkNFX1JFU0VUX0lOX0NMRUFSCisjdW5kZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworI3VuZGVmIFBST1RPQlVGX05BTUVTUEFDRV9PUEVOCisjdW5kZWYgUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCisjdW5kZWYgUFJPVE9CVUZfVU5VU0VECisjdW5kZWYgUFJPVE9CVUZfQVNTVU1FCisjdW5kZWYgUFJPVE9CVUZfRVhQT1JUX1RFTVBMQVRFX0RFQ0xBUkUKKyN1bmRlZiBQUk9UT0JVRl9FWFBPUlRfVEVNUExBVEVfREVGSU5FCisjdW5kZWYgUFJPVE9CVUZfQUxJR05BUworI3VuZGVmIFBST1RPQlVGX0ZJTkFMCisjdW5kZWYgUFJPVE9CVUZfRlVUVVJFX0ZJTkFMCisjdW5kZWYgUFJPVE9CVUZfVEhSRUFEX0xPQ0FMCisjdW5kZWYgUFJPVE9CVUZfTElUVExFX0VORElBTgorI3VuZGVmIFBST1RPQlVGX0JJR19FTkRJQU4KKyN1bmRlZiBQUk9UT0JVRl9NRVNTQUdFX09XTkVEX0FSRU5BX0VYUEVSSU1FTlQKKyN1bmRlZiBQUk9UT0JVRl9DT05TVElOSVQKKyN1bmRlZiBQUk9UT0JVRl9DT05TVEVYUFIKKyN1bmRlZiBQUk9UT0JVRl9BVFRSSUJVVEVfV0VBSworI3VuZGVmIFBST1RPQlVGX0hBVkVfQVRUUklCVVRFX1dFQUsKKyN1bmRlZiBQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWQorI3VuZGVmIFBST1RPQlVGX0FUVFJJQlVURV9TVEFOREFMT05FX0RFQlVHCisjdW5kZWYgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxCisjdW5kZWYgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkyCisjdW5kZWYgUFJPVE9CVUZfUFJBR01BX0lOSVRfU0VHCisjdW5kZWYgUFJPVE9CVUZfQVNBTgorI3VuZGVmIFBST1RPQlVGX01TQU4KKyN1bmRlZiBQUk9UT0JVRl9UU0FOCisjdW5kZWYgUFJPVE9CVUZfVEFJTF9DQUxMX1RBQkxFX1BBUlNFUl9FTkFCTEVECisjdW5kZWYgUFJPVE9CVUZfVENfUEFSQU1fREVDTAorI3VuZGVmIFBST1RPQlVGX0VYQ0xVU0lWRV9MT0NLU19SRVFVSVJFRAorI3VuZGVmIFBST1RPQlVGX0xPQ0tTX0VYQ0xVREVECisjdW5kZWYgUFJPVE9CVUZfTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUworI3VuZGVmIFBST1RPQlVGX0dVQVJERURfQlkKKworI2lmZGVmIFBST1RPQlVGX0ZVVFVSRV9CUkVBS0lOR19DSEFOR0VTCisjdW5kZWYgUFJPVE9CVUZfRlVUVVJFX0JSRUFLSU5HX0NIQU5HRVMKKyNlbmRpZgorCisvLyBSZXN0b3JlIG1hY3JvIHRoYXQgbWF5IGhhdmUgYmVlbiAjdW5kZWYnZCBpbiBwb3J0X2RlZi5pbmMuCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgcG9wX21hY3JvKCJDUkVBVEVfTkVXIikKKyNwcmFnbWEgcG9wX21hY3JvKCJERUxFVEUiKQorI3ByYWdtYSBwb3BfbWFjcm8oIkRPVUJMRV9DTElDSyIpCisjcHJhZ21hIHBvcF9tYWNybygiRVJST1IiKQorI3ByYWdtYSBwb3BfbWFjcm8oIkVSUk9SX0JVU1kiKQorI3ByYWdtYSBwb3BfbWFjcm8oIkVSUk9SX0lOU1RBTExfRkFJTEVEIikKKyNwcmFnbWEgcG9wX21hY3JvKCJFUlJPUl9OT1RfRk9VTkQiKQorI3ByYWdtYSBwb3BfbWFjcm8oIkdldENsYXNzTmFtZSIpCisjcHJhZ21hIHBvcF9tYWNybygiR2V0TWVzc2FnZSIpCisjcHJhZ21hIHBvcF9tYWNybygiR2V0T2JqZWN0IikKKyNwcmFnbWEgcG9wX21hY3JvKCJJR05PUkUiKQorI3ByYWdtYSBwb3BfbWFjcm8oIklOIikKKyNwcmFnbWEgcG9wX21hY3JvKCJJTlBVVF9LRVlCT0FSRCIpCisjcHJhZ21hIHBvcF9tYWNybygiT1VUIikKKyNwcmFnbWEgcG9wX21hY3JvKCJPUFRJT05BTCIpCisjcHJhZ21hIHBvcF9tYWNybygibWluIikKKyNwcmFnbWEgcG9wX21hY3JvKCJtYXgiKQorI3ByYWdtYSBwb3BfbWFjcm8oIk5FQVIiKQorI3ByYWdtYSBwb3BfbWFjcm8oIk5PX0RBVEEiKQorI3ByYWdtYSBwb3BfbWFjcm8oIk5PX0VSUk9SIikKKyNwcmFnbWEgcG9wX21hY3JvKCJSRUFTT05fVU5LTk9XTiIpCisjcHJhZ21hIHBvcF9tYWNybygiU0VSVklDRV9ESVNBQkxFRCIpCisjcHJhZ21hIHBvcF9tYWNybygiU0VWRVJJVFlfRVJST1IiKQorI3ByYWdtYSBwb3BfbWFjcm8oIlNUUklDVCIpCisjcHJhZ21hIHBvcF9tYWNybygiU1RBVFVTX1BFTkRJTkciKQorI3ByYWdtYSBwb3BfbWFjcm8oInRpbWV6b25lIikKKyNlbmRpZgorCisjaWZkZWYgX19BUFBMRV9fCisjcHJhZ21hIHBvcF9tYWNybygiRE9NQUlOIikKKyNwcmFnbWEgcG9wX21hY3JvKCJUUlVFIikKKyNwcmFnbWEgcG9wX21hY3JvKCJGQUxTRSIpCisjcHJhZ21hIHBvcF9tYWNybygiVUlEX01BWCIpCisjZW5kaWYgIC8vIF9fQVBQTEVfXworCisjaWYgZGVmaW5lZChfX2NsYW5nX18pIHx8IGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX01TQ19WRVIpCisjcHJhZ21hIHBvcF9tYWNybygiREVCVUciKQorI2VuZGlmIC8vIGRlZmluZWQoX19jbGFuZ19fKSB8fCBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKQorCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworLy8gUG9wIHRoZSB3YXJuaW5nKHB1c2gpIGZyb20gcG9ydF9kZWYuaW5jCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3ByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNmJiZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3ByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LmNjCkBAIC0wLDAgKzEsMjkwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB7CisKK3ZvaWQgRmlsbE1lc3NhZ2UoCisgICAgcHJvdG8zX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6TXlNZXNzYWdlUGx1c0V4dHJhKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPnNldF9lKHByb3RvM19wcmVzZXJ2ZV91bmtub3duX2VudW1fdW5pdHRlc3Q6OkVfRVhUUkEpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZShwcm90bzNfcHJlc2VydmVfdW5rbm93bl9lbnVtX3VuaXR0ZXN0OjpFX0VYVFJBKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3BhY2tlZF9lKAorICAgICAgcHJvdG8zX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6RV9FWFRSQSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9wYWNrZWRfdW5leHBlY3RlZF9lKAorICAgICAgcHJvdG8zX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6RV9FWFRSQSk7CisgIG1lc3NhZ2UtPnNldF9vbmVvZl9lXzEocHJvdG8zX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6RV9FWFRSQSk7Cit9CisKK3ZvaWQgQ2hlY2tNZXNzYWdlKAorICAgIGNvbnN0IHByb3RvM19wcmVzZXJ2ZV91bmtub3duX2VudW1fdW5pdHRlc3Q6Ok15TWVzc2FnZVBsdXNFeHRyYSYgbWVzc2FnZSkgeworICBFWFBFQ1RfRVEocHJvdG8zX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6RV9FWFRSQSwgbWVzc2FnZS5lKCkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9lX3NpemUoKSk7CisgIEVYUEVDVF9FUShwcm90bzNfcHJlc2VydmVfdW5rbm93bl9lbnVtX3VuaXR0ZXN0OjpFX0VYVFJBLAorICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9lKDApKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfcGFja2VkX2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKHByb3RvM19wcmVzZXJ2ZV91bmtub3duX2VudW1fdW5pdHRlc3Q6OkVfRVhUUkEsCisgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX3BhY2tlZF9lKDApKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfcGFja2VkX3VuZXhwZWN0ZWRfZV9zaXplKCkpOworICBFWFBFQ1RfRVEocHJvdG8zX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6RV9FWFRSQSwKKyAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfcGFja2VkX3VuZXhwZWN0ZWRfZSgwKSk7CisgIEVYUEVDVF9FUShwcm90bzNfcHJlc2VydmVfdW5rbm93bl9lbnVtX3VuaXR0ZXN0OjpFX0VYVFJBLAorICAgICAgICAgICAgbWVzc2FnZS5vbmVvZl9lXzEoKSk7Cit9CisKK3ZvaWQgQ2hlY2tNZXNzYWdlKAorICAgIGNvbnN0IHByb3RvM19wcmVzZXJ2ZV91bmtub3duX2VudW1fdW5pdHRlc3Q6Ok15TWVzc2FnZSYgbWVzc2FnZSkgeworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50Pihwcm90bzNfcHJlc2VydmVfdW5rbm93bl9lbnVtX3VuaXR0ZXN0OjpFX0VYVFJBKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obWVzc2FnZS5lKCkpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfZV9zaXplKCkpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50Pihwcm90bzNfcHJlc2VydmVfdW5rbm93bl9lbnVtX3VuaXR0ZXN0OjpFX0VYVFJBKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obWVzc2FnZS5yZXBlYXRlZF9lKDApKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3BhY2tlZF9lX3NpemUoKSk7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQ+KHByb3RvM19wcmVzZXJ2ZV91bmtub3duX2VudW1fdW5pdHRlc3Q6OkVfRVhUUkEpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihtZXNzYWdlLnJlcGVhdGVkX3BhY2tlZF9lKDApKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3BhY2tlZF91bmV4cGVjdGVkX2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludD4ocHJvdG8zX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6RV9FWFRSQSksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KG1lc3NhZ2UucmVwZWF0ZWRfcGFja2VkX3VuZXhwZWN0ZWRfZSgwKSkpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50Pihwcm90bzNfcHJlc2VydmVfdW5rbm93bl9lbnVtX3VuaXR0ZXN0OjpFX0VYVFJBKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obWVzc2FnZS5vbmVvZl9lXzEoKSkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vIFRlc3QgdGhhdCBwYXJzaW5nIHByZXNlcnZlcyBhbiB1bmtub3duIHZhbHVlIGluIHRoZSBlbnVtIGZpZWxkIGFuZCBkb2VzIG5vdAorLy8gcHVudCBpdCB0byB0aGUgVW5rbm93bkZpZWxkU2V0LgorVEVTVChQcmVzZXJ2ZVVua25vd25FbnVtVGVzdCwgUHJlc2VydmVQYXJzZUFuZFNlcmlhbGl6ZSkgeworICBwcm90bzNfcHJlc2VydmVfdW5rbm93bl9lbnVtX3VuaXR0ZXN0OjpNeU1lc3NhZ2VQbHVzRXh0cmEgb3JpZ19tZXNzYWdlOworICBGaWxsTWVzc2FnZSgmb3JpZ19tZXNzYWdlKTsKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgb3JpZ19tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKTsKKworICBwcm90bzNfcHJlc2VydmVfdW5rbm93bl9lbnVtX3VuaXR0ZXN0OjpNeU1lc3NhZ2UgbWVzc2FnZTsKKyAgRVhQRUNUX0VRKHRydWUsIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKKyAgQ2hlY2tNZXNzYWdlKG1lc3NhZ2UpOworCisgIHNlcmlhbGl6ZWQuY2xlYXIoKTsKKyAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCk7CisgIEVYUEVDVF9FUSh0cnVlLCBvcmlnX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKKyAgQ2hlY2tNZXNzYWdlKG9yaWdfbWVzc2FnZSk7Cit9CisKKy8vIFRlc3QgdGhhdCByZWZsZWN0aW9uIGJhc2VkIGltcGxlbWVudGF0aW9uIGFsc28ga2VlcHMgdW5rbm93biBlbnVtIHZhbHVlcyBhbmQKKy8vIGRvZXNuJ3QgcHV0IHRoZW0gaW50byBVbmtub3duRmllbGRTZXQuCitURVNUKFByZXNlcnZlVW5rbm93bkVudW1UZXN0LCBQcmVzZXJ2ZVBhcnNlQW5kU2VyaWFsaXplRHluYW1pY01lc3NhZ2UpIHsKKyAgcHJvdG8zX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6TXlNZXNzYWdlUGx1c0V4dHJhIG9yaWdfbWVzc2FnZTsKKyAgRmlsbE1lc3NhZ2UoJm9yaWdfbWVzc2FnZSk7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQgPSBvcmlnX21lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKworICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZmFjdG9yeTsKKyAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UoCisgICAgICBmYWN0b3J5CisgICAgICAgICAgLkdldFByb3RvdHlwZSgKKyAgICAgICAgICAgICAgcHJvdG8zX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6TXlNZXNzYWdlOjpkZXNjcmlwdG9yKCkpCisgICAgICAgICAgLT5OZXcoKSk7CisgIEVYUEVDVF9FUSh0cnVlLCBtZXNzYWdlLT5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpOworICBtZXNzYWdlLT5EaXNjYXJkVW5rbm93bkZpZWxkcygpOworCisgIHNlcmlhbGl6ZWQgPSBtZXNzYWdlLT5TZXJpYWxpemVBc1N0cmluZygpOworICBFWFBFQ1RfRVEodHJ1ZSwgb3JpZ19tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7CisgIENoZWNrTWVzc2FnZShvcmlnX21lc3NhZ2UpOworfQorCisvLyBUZXN0IHRoYXQgZm9yIHByb3RvMiBtZXNzYWdlcywgdW5rbm93biB2YWx1ZXMgYXJlIGluIHVua25vd24gZmllbGRzLgorVEVTVChQcmVzZXJ2ZVVua25vd25FbnVtVGVzdCwgUHJvdG8ySGlkZXNVbmtub3duVmFsdWVzKSB7CisgIHByb3RvM19wcmVzZXJ2ZV91bmtub3duX2VudW1fdW5pdHRlc3Q6Ok15TWVzc2FnZVBsdXNFeHRyYSBvcmlnX21lc3NhZ2U7CisgIEZpbGxNZXNzYWdlKCZvcmlnX21lc3NhZ2UpOworCisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIG9yaWdfbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCk7CisKKyAgcHJvdG8yX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6TXlNZXNzYWdlIG1lc3NhZ2U7CisgIEVYUEVDVF9FUSh0cnVlLCBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7CisgIC8vIFRoZSBpbnRlcm1lZGlhdGUgbWVzc2FnZSBoYXMgZXZlcnl0aGluZyBpbiBpdHMgInVua25vd24gZmllbGRzIi4KKyAgcHJvdG8yX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6TXlNZXNzYWdlIG1lc3NhZ2UyID0gbWVzc2FnZTsKKyAgbWVzc2FnZTIuRGlzY2FyZFVua25vd25GaWVsZHMoKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UyLkJ5dGVTaXplTG9uZygpKTsKKworICAvLyBCdXQgd2hlbiB3ZSBwYXNzIGl0IHRvIHRoZSBjb3JyZWN0IHN0cnVjdHVyZSwgYWxsIHZhbHVlcyBhcmUgdGhlcmUuCisgIHNlcmlhbGl6ZWQuY2xlYXIoKTsKKyAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCk7CisgIEVYUEVDVF9FUSh0cnVlLCBvcmlnX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKKyAgQ2hlY2tNZXNzYWdlKG9yaWdfbWVzc2FnZSk7Cit9CisKKy8vIFNhbWUgYXMgYmVmb3JlLCBmb3IgYSBkeW5hbWljIG1lc3NhZ2UuCitURVNUKFByZXNlcnZlVW5rbm93bkVudW1UZXN0LCBEeW5hbWljUHJvdG8ySGlkZXNVbmtub3duVmFsdWVzKSB7CisgIHByb3RvM19wcmVzZXJ2ZV91bmtub3duX2VudW1fdW5pdHRlc3Q6Ok15TWVzc2FnZVBsdXNFeHRyYSBvcmlnX21lc3NhZ2U7CisgIEZpbGxNZXNzYWdlKCZvcmlnX21lc3NhZ2UpOworCisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIG9yaWdfbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCk7CisKKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGZhY3Rvcnk7CisgIHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlPiBtZXNzYWdlKAorICAgICAgZmFjdG9yeQorICAgICAgICAgIC5HZXRQcm90b3R5cGUoCisgICAgICAgICAgICAgIHByb3RvMl9wcmVzZXJ2ZV91bmtub3duX2VudW1fdW5pdHRlc3Q6Ok15TWVzc2FnZTo6ZGVzY3JpcHRvcigpKQorICAgICAgICAgIC0+TmV3KCkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbWVzc2FnZS0+UGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKKyAgLy8gVGhlIGludGVybWVkaWF0ZSBtZXNzYWdlIGhhcyBldmVyeXRoaW5nIGluIGl0cyAidW5rbm93biBmaWVsZHMiLgorICBwcm90bzJfcHJlc2VydmVfdW5rbm93bl9lbnVtX3VuaXR0ZXN0OjpNeU1lc3NhZ2UgbWVzc2FnZTI7CisgIG1lc3NhZ2UyLkNvcHlGcm9tKCptZXNzYWdlKTsKKyAgbWVzc2FnZTIuRGlzY2FyZFVua25vd25GaWVsZHMoKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UyLkJ5dGVTaXplTG9uZygpKTsKKworICAvLyBCdXQgd2hlbiB3ZSBwYXNzIGl0IHRvIHRoZSBjb3JyZWN0IHN0cnVjdHVyZSwgYWxsIHZhbHVlcyBhcmUgdGhlcmUuCisgIHNlcmlhbGl6ZWQuY2xlYXIoKTsKKyAgbWVzc2FnZS0+U2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpOworICBFWFBFQ1RfRVEodHJ1ZSwgb3JpZ19tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7CisgIENoZWNrTWVzc2FnZShvcmlnX21lc3NhZ2UpOworfQorCisvLyBUZXN0IHRoYXQgcmVmbGVjdGlvbiBwcm92aWRlcyBFbnVtVmFsdWVEZXNjcmlwdG9ycyBmb3IgdW5rbm93biB2YWx1ZXMuCitURVNUKFByZXNlcnZlVW5rbm93bkVudW1UZXN0LCBEeW5hbWljRW51bVZhbHVlRGVzY3JpcHRvcnMpIHsKKyAgcHJvdG8zX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6TXlNZXNzYWdlUGx1c0V4dHJhIG9yaWdfbWVzc2FnZTsKKyAgRmlsbE1lc3NhZ2UoJm9yaWdfbWVzc2FnZSk7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIG9yaWdfbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCk7CisKKyAgcHJvdG8zX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6TXlNZXNzYWdlIG1lc3NhZ2U7CisgIEVYUEVDVF9FUSh0cnVlLCBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7CisgIENoZWNrTWVzc2FnZShtZXNzYWdlKTsKKworICBjb25zdCBSZWZsZWN0aW9uKiByID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGQgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGQtPkZpbmRGaWVsZEJ5TmFtZSgiZSIpOworCisgIC8vIFRoaXMgc2hvdWxkIGR5bmFtaWNhbGx5IGNyZWF0ZSBhbiBFbnVtVmFsdWVEZXNjcmlwdG9yLgorICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0gci0+R2V0RW51bShtZXNzYWdlLCBmaWVsZCk7CisgIEVYUEVDVF9FUShlbnVtX3ZhbHVlLT5udW1iZXIoKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocHJvdG8zX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6RV9FWFRSQSkpOworCisgIC8vIEZldGNoaW5nIHZhbHVlIGZvciBhIHNlY29uZCB0aW1lIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcG9pbnRlci4KKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZV9zZWNvbmQgPSByLT5HZXRFbnVtKG1lc3NhZ2UsIGZpZWxkKTsKKyAgRVhQRUNUX0VRKGVudW1fdmFsdWUsIGVudW1fdmFsdWVfc2Vjb25kKTsKKworICAvLyBDaGVjayB0aGUgcmVwZWF0ZWQgY2FzZSB0b28uCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVwZWF0ZWRfZmllbGQgPSBkLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2UiKTsKKyAgZW51bV92YWx1ZSA9IHItPkdldFJlcGVhdGVkRW51bShtZXNzYWdlLCByZXBlYXRlZF9maWVsZCwgMCk7CisgIEVYUEVDVF9FUShlbnVtX3ZhbHVlLT5udW1iZXIoKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocHJvdG8zX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDo6RV9FWFRSQSkpOworICAvLyBTaG91bGQgcmV1c2UgdGhlIHNhbWUgRW51bVZhbHVlRGVzY3JpcHRvciwgZXZlbiBmb3IgYSBkaWZmZXJlbnQgZmllbGQuCisgIEVYUEVDVF9FUShlbnVtX3ZhbHVlLCBlbnVtX3ZhbHVlX3NlY29uZCk7CisKKyAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoZSByZXR1cm5lZCB2YWx1ZSBkZXNjcmlwdG9yIHRvIHNldCBhIHZhbHVlIG9uCisgIC8vIGFub3RoZXIgbWVzc2FnZS4KKyAgTWVzc2FnZSogbSA9IG1lc3NhZ2UuTmV3KCk7CisgIHItPlNldEVudW0obSwgZmllbGQsIGVudW1fdmFsdWUpOworICBFWFBFQ1RfRVEoZW51bV92YWx1ZSwgci0+R2V0RW51bSgqbSwgZmllbGQpKTsKKyAgZGVsZXRlIG07Cit9CisKKy8vIFRlc3QgdGhhdCB0aGUgbmV3IGludGVnZXItYmFzZWQgZW51bSByZWZsZWN0aW9uIEFQSSB3b3Jrcy4KK1RFU1QoUHJlc2VydmVVbmtub3duRW51bVRlc3QsIEludGVnZXJFbnVtUmVmbGVjdGlvbkFQSSkgeworICBwcm90bzNfcHJlc2VydmVfdW5rbm93bl9lbnVtX3VuaXR0ZXN0OjpNeU1lc3NhZ2UgbWVzc2FnZTsKKyAgY29uc3QgUmVmbGVjdGlvbiogciA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBEZXNjcmlwdG9yKiBkID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBzaW5ndWxhcl9maWVsZCA9IGQtPkZpbmRGaWVsZEJ5TmFtZSgiZSIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlcGVhdGVkX2ZpZWxkID0gZC0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9lIik7CisKKyAgci0+U2V0RW51bVZhbHVlKCZtZXNzYWdlLCBzaW5ndWxhcl9maWVsZCwgNDIpOworICBFWFBFQ1RfRVEoNDIsIHItPkdldEVudW1WYWx1ZShtZXNzYWdlLCBzaW5ndWxhcl9maWVsZCkpOworICByLT5BZGRFbnVtVmFsdWUoJm1lc3NhZ2UsIHJlcGVhdGVkX2ZpZWxkLCA0Mik7CisgIHItPkFkZEVudW1WYWx1ZSgmbWVzc2FnZSwgcmVwZWF0ZWRfZmllbGQsIDQyKTsKKyAgRVhQRUNUX0VRKDQyLCByLT5HZXRSZXBlYXRlZEVudW1WYWx1ZShtZXNzYWdlLCByZXBlYXRlZF9maWVsZCwgMCkpOworICByLT5TZXRSZXBlYXRlZEVudW1WYWx1ZSgmbWVzc2FnZSwgcmVwZWF0ZWRfZmllbGQsIDEsIDg0KTsKKyAgRVhQRUNUX0VRKDg0LCByLT5HZXRSZXBlYXRlZEVudW1WYWx1ZShtZXNzYWdlLCByZXBlYXRlZF9maWVsZCwgMSkpOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0gci0+R2V0RW51bShtZXNzYWdlLCBzaW5ndWxhcl9maWVsZCk7CisgIEVYUEVDVF9FUSg0MiwgZW51bV92YWx1ZS0+bnVtYmVyKCkpOworfQorCisvLyBUZXN0IHRoYXQgdGhlIEVudW1WYWx1ZSBBUEkgd29ya3MgcHJvcGVybHkgZm9yIHByb3RvMiBtZXNzYWdlcyBhcyB3ZWxsLgorVEVTVChQcmVzZXJ2ZVVua25vd25FbnVtVGVzdCwgUHJvdG8yQ2F0Y2hlc1Vua25vd25WYWx1ZXMpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOyAgLy8gcHJvdG8yIG1lc3NhZ2UKKyAgY29uc3QgUmVmbGVjdGlvbiogciA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBEZXNjcmlwdG9yKiBkID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVwZWF0ZWRfZmllbGQgPQorICAgICAgZC0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIpOworICAvLyBBZGQgb25lIGVsZW1lbnQgdG8gdGhlIHJlcGVhdGVkIGZpZWxkIHNvIHRoYXQgd2UgY2FuIHRlc3QKKyAgLy8gU2V0UmVwZWF0ZWRFbnVtVmFsdWUuCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUgPQorICAgICAgcmVwZWF0ZWRfZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU5hbWUoIkJBUiIpOworICBFWFBFQ1RfVFJVRShlbnVtX3ZhbHVlICE9IG51bGxwdHIpOworICByLT5BZGRFbnVtKCZtZXNzYWdlLCByZXBlYXRlZF9maWVsZCwgZW51bV92YWx1ZSk7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBzaW5ndWxhcl9maWVsZCA9CisgICAgICBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9lbnVtIik7CisgIC8vIEVudW0tZmllbGQgaW50ZWdlci1iYXNlZCBzZXR0ZXJzIHRyZWF0IGFzIHVua25vd24gaW50ZWdlciB2YWx1ZXMgYXMKKyAgLy8gdW5rbm93biBmaWVsZHMuCisgIHItPlNldEVudW1WYWx1ZSgmbWVzc2FnZSwgc2luZ3VsYXJfZmllbGQsIDQyNDIpOworICBFWFBFQ1RfRVEoci0+R2V0RW51bShtZXNzYWdlLCBzaW5ndWxhcl9maWVsZCktPm51bWJlcigpLAorICAgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PKTsKKyAgci0+U2V0UmVwZWF0ZWRFbnVtVmFsdWUoJm1lc3NhZ2UsIHJlcGVhdGVkX2ZpZWxkLCAwLCA0MjQyKTsKKyAgLy8gcmVwZWF0ZWRfbmVzdGVkX2VudW0gd2FzIHNldCB0byBiYXIgYWJvdmUsIHRoaXMgc2hvdWxkIG5vdCBoYXZlIGNoYW5nZWQuCisgIEVYUEVDVF9FUShyLT5HZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgcmVwZWF0ZWRfZmllbGQsIDApLT5udW1iZXIoKSwKKyAgICAgICAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUik7CisgIHItPkFkZEVudW1WYWx1ZSgmbWVzc2FnZSwgcmVwZWF0ZWRfZmllbGQsIDQyNDIpOworICAvLyBObyBlbGVtZW50IHNob3VsZCBiZSBhZGRlZAorICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCksIDEpOworCisgIC8vIFdlIHJlcXVpcmUgdGhlIGVudW1zIHRvIGVuZCB1cCBpbiB1bmtub3duIGZpZWxkIHNldAorICBBU1NFUlRfRVEobWVzc2FnZS51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCksIDMpOworICBFWFBFQ1RfRVEobWVzc2FnZS51bmtub3duX2ZpZWxkcygpLmZpZWxkKDApLm51bWJlcigpLAorICAgICAgICAgICAgc2luZ3VsYXJfZmllbGQtPm51bWJlcigpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UudW5rbm93bl9maWVsZHMoKS5maWVsZCgwKS52YXJpbnQoKSwgNDI0Mik7CisgIEVYUEVDVF9FUShtZXNzYWdlLnVua25vd25fZmllbGRzKCkuZmllbGQoMSkubnVtYmVyKCksCisgICAgICAgICAgICByZXBlYXRlZF9maWVsZC0+bnVtYmVyKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS51bmtub3duX2ZpZWxkcygpLmZpZWxkKDEpLnZhcmludCgpLCA0MjQyKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UudW5rbm93bl9maWVsZHMoKS5maWVsZCgyKS5udW1iZXIoKSwKKyAgICAgICAgICAgIHJlcGVhdGVkX2ZpZWxkLT5udW1iZXIoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLnVua25vd25fZmllbGRzKCkuZmllbGQoMikudmFyaW50KCksIDQyNDIpOworfQorCitURVNUKFByZXNlcnZlVW5rbm93bkVudW1UZXN0LCBTdXBwb3J0c1Vua25vd25FbnVtVmFsdWVzQVBJKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgcHJvdG8yX21lc3NhZ2U7CisgIHByb3RvM19wcmVzZXJ2ZV91bmtub3duX2VudW1fdW5pdHRlc3Q6Ok15TWVzc2FnZSBuZXdfbWVzc2FnZTsKKworICBjb25zdCBSZWZsZWN0aW9uKiBwcm90bzJfcmVmbGVjdGlvbiA9IHByb3RvMl9tZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogbmV3X3JlZmxlY3Rpb24gPSBuZXdfbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisKKyAgRVhQRUNUX0ZBTFNFKHByb3RvMl9yZWZsZWN0aW9uLT5TdXBwb3J0c1Vua25vd25FbnVtVmFsdWVzKCkpOworICBFWFBFQ1RfVFJVRShuZXdfcmVmbGVjdGlvbi0+U3VwcG9ydHNVbmtub3duRW51bVZhbHVlcygpKTsKK30KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZiOGQwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxNTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3VzaW5nIHByb3RvM19hcmVuYV91bml0dGVzdDo6VGVzdEFsbFR5cGVzOworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgeworLy8gV2Ugc2VsZWN0aXZlbHkgc2V0L2NoZWNrIGEgZmV3IHJlcHJlc2VudGF0aXZlIGZpZWxkcyByYXRoZXIgdGhhbiBhbGwgZmllbGRzCisvLyBhcyB0aGlzIHRlc3QgaXMgb25seSBleHBlY3RlZCB0byBjb3ZlciB0aGUgYmFzaWNzIG9mIGFyZW5hIHN1cHBvcnQuCit2b2lkIFNldEFsbEZpZWxkcyhUZXN0QWxsVHlwZXMqIG0pIHsKKyAgbS0+c2V0X29wdGlvbmFsX2ludDMyKDEwMCk7CisgIG0tPnNldF9vcHRpb25hbF9zdHJpbmcoImFzZGYiKTsKKyAgbS0+c2V0X29wdGlvbmFsX2J5dGVzKCJqa2w7Iik7CisgIG0tPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDQyKTsKKyAgbS0+bXV0YWJsZV9vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoNDMpOworICBtLT5zZXRfb3B0aW9uYWxfbmVzdGVkX2VudW0ocHJvdG8zX2FyZW5hX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWik7CisgIG0tPnNldF9vcHRpb25hbF9mb3JlaWduX2VudW0ocHJvdG8zX2FyZW5hX3VuaXR0ZXN0OjpGT1JFSUdOX0JBWik7CisgIG0tPm11dGFibGVfb3B0aW9uYWxfbGF6eV9tZXNzYWdlKCktPnNldF9iYig0NSk7CisgIG0tPmFkZF9yZXBlYXRlZF9pbnQzMigxMDApOworICBtLT5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJhc2RmIik7CisgIG0tPmFkZF9yZXBlYXRlZF9ieXRlcygiamtsOyIpOworICBtLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDQ2KTsKKyAgbS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgpLT5zZXRfYyg0Nyk7CisgIG0tPmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bShwcm90bzNfYXJlbmFfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKKyAgbS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fZW51bShwcm90bzNfYXJlbmFfdW5pdHRlc3Q6OkZPUkVJR05fQkFaKTsKKyAgbS0+YWRkX3JlcGVhdGVkX2xhenlfbWVzc2FnZSgpLT5zZXRfYmIoNDkpOworCisgIG0tPnNldF9vbmVvZl91aW50MzIoMSk7CisgIG0tPm11dGFibGVfb25lb2ZfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDUwKTsKKyAgbS0+c2V0X29uZW9mX3N0cmluZygidGVzdCIpOyAgLy8gb25seSB0aGlzIG9uZSByZW1haW5zIHNldAorfQorCit2b2lkIEV4cGVjdEFsbEZpZWxkc1NldChjb25zdCBUZXN0QWxsVHlwZXMmIG0pIHsKKyAgRVhQRUNUX0VRKDEwMCwgbS5vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKCJhc2RmIiwgbS5vcHRpb25hbF9zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiamtsOyIsIG0ub3B0aW9uYWxfYnl0ZXMoKSk7CisgIEVYUEVDVF9FUSh0cnVlLCBtLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKDQyLCBtLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuYmIoKSk7CisgIEVYUEVDVF9FUSh0cnVlLCBtLmhhc19vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSg0MywgbS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKS5jKCkpOworICBFWFBFQ1RfRVEocHJvdG8zX2FyZW5hX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWiwgbS5vcHRpb25hbF9uZXN0ZWRfZW51bSgpKTsKKyAgRVhQRUNUX0VRKHByb3RvM19hcmVuYV91bml0dGVzdDo6Rk9SRUlHTl9CQVosIG0ub3B0aW9uYWxfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbS5oYXNfb3B0aW9uYWxfbGF6eV9tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoNDUsIG0ub3B0aW9uYWxfbGF6eV9tZXNzYWdlKCkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEwMCwgbS5yZXBlYXRlZF9pbnQzMigwKSk7CisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBFWFBFQ1RfRVEoImFzZGYiLCBtLnJlcGVhdGVkX3N0cmluZygwKSk7CisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX2J5dGVzX3NpemUoKSk7CisgIEVYUEVDVF9FUSgiamtsOyIsIG0ucmVwZWF0ZWRfYnl0ZXMoMCkpOworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplKCkpOworICBFWFBFQ1RfRVEoNDYsIG0ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOworICBFWFBFQ1RfRVEoNDcsIG0ucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApLmMoKSk7CisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSk7CisgIEVYUEVDVF9FUShwcm90bzNfYXJlbmFfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLAorICAgICAgICAgICAgbS5yZXBlYXRlZF9uZXN0ZWRfZW51bSgwKSk7CisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9zaXplKCkpOworICBFWFBFQ1RfRVEocHJvdG8zX2FyZW5hX3VuaXR0ZXN0OjpGT1JFSUdOX0JBWiwgbS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMCkpOworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9sYXp5X21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQ5LCBtLnJlcGVhdGVkX2xhenlfbWVzc2FnZSgwKS5iYigpKTsKKworICBFWFBFQ1RfRVEocHJvdG8zX2FyZW5hX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmtPbmVvZlN0cmluZywKKyAgICAgICAgICAgIG0ub25lb2ZfZmllbGRfY2FzZSgpKTsKKyAgRVhQRUNUX0VRKCJ0ZXN0IiwgbS5vbmVvZl9zdHJpbmcoKSk7Cit9CisKKy8vIEluIHRoaXMgZmlsZSB3ZSBvbmx5IHRlc3Qgc29tZSBiYXNpYyBmdW5jdGlvbmFsaXRpZXMgb2YgYXJlbmEgc3VwcG9ydCBpbgorLy8gcHJvdG8zIGFuZCBleHBlY3QgdGhlIGFyZW5hIHN1cHBvcnQgdG8gYmUgZnVsbHkgdGVzdGVkIGluIHByb3RvMiB1bml0dGVzdHMKKy8vIGJlY2F1c2UgcHJvdG8zIHNoYXJlcyBtb3N0IGNvZGUgd2l0aCBwcm90bzIuCisKK1RFU1QoUHJvdG8zQXJlbmFMaXRlVGVzdCwgUGFyc2luZykgeworICBUZXN0QWxsVHlwZXMgb3JpZ2luYWw7CisgIFNldEFsbEZpZWxkcygmb3JpZ2luYWwpOworCisgIEFyZW5hIGFyZW5hOworICBUZXN0QWxsVHlwZXMqIGFyZW5hX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIGFyZW5hX21lc3NhZ2UtPlBhcnNlRnJvbVN0cmluZyhvcmlnaW5hbC5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgRXhwZWN0QWxsRmllbGRzU2V0KCphcmVuYV9tZXNzYWdlKTsKK30KKworVEVTVChQcm90bzNBcmVuYUxpdGVUZXN0LCBTd2FwKSB7CisgIEFyZW5hIGFyZW5hMTsKKyAgQXJlbmEgYXJlbmEyOworCisgIC8vIFRlc3QgU3dhcCgpLgorICBUZXN0QWxsVHlwZXMqIGFyZW5hMV9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmExKTsKKyAgVGVzdEFsbFR5cGVzKiBhcmVuYTJfbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hMik7CisgIGFyZW5hMV9tZXNzYWdlLT5Td2FwKGFyZW5hMl9tZXNzYWdlKTsKKyAgRVhQRUNUX0VRKCZhcmVuYTEsIGFyZW5hMV9tZXNzYWdlLT5HZXRBcmVuYSgpKTsKKyAgRVhQRUNUX0VRKCZhcmVuYTIsIGFyZW5hMl9tZXNzYWdlLT5HZXRBcmVuYSgpKTsKK30KKworVEVTVChQcm90bzNBcmVuYUxpdGVUZXN0LCBTZXRBbGxvY2F0ZWRNZXNzYWdlKSB7CisgIEFyZW5hIGFyZW5hOworICBUZXN0QWxsVHlwZXMqIGFyZW5hX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogbmVzdGVkID0gbmV3IFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZTsKKyAgbmVzdGVkLT5zZXRfYmIoMTE4KTsKKyAgYXJlbmFfbWVzc2FnZS0+c2V0X2FsbG9jYXRlZF9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZShuZXN0ZWQpOworICBFWFBFQ1RfRVEoMTE4LCBhcmVuYV9tZXNzYWdlLT5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworfQorCitURVNUKFByb3RvM0FyZW5hTGl0ZVRlc3QsIFJlbGVhc2VNZXNzYWdlKSB7CisgIEFyZW5hIGFyZW5hOworICBUZXN0QWxsVHlwZXMqIGFyZW5hX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIGFyZW5hX21lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDExOCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U+IG5lc3RlZCgKKyAgICAgIGFyZW5hX21lc3NhZ2UtPnJlbGVhc2Vfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgxMTgsIG5lc3RlZC0+YmIoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYmUxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDYzNSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCit1c2luZyBwcm90bzNfYXJlbmFfdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOwordXNpbmcgcHJvdG8zX2FyZW5hX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM7CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworY2xhc3MgUHJvdG8zQXJlbmFUZXN0SGVscGVyIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgQXJlbmEqIEdldE93bmluZ0FyZW5hKGNvbnN0IFQmIG1zZykgeworICAgIHJldHVybiBtc2cuR2V0T3duaW5nQXJlbmEoKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSB7CisvLyBXZSBzZWxlY3RpdmVseSBzZXQvY2hlY2sgYSBmZXcgcmVwcmVzZW50YXRpdmUgZmllbGRzIHJhdGhlciB0aGFuIGFsbCBmaWVsZHMKKy8vIGFzIHRoaXMgdGVzdCBpcyBvbmx5IGV4cGVjdGVkIHRvIGNvdmVyIHRoZSBiYXNpY3Mgb2YgYXJlbmEgc3VwcG9ydC4KK3ZvaWQgU2V0QWxsRmllbGRzKFRlc3RBbGxUeXBlcyogbSkgeworICBtLT5zZXRfb3B0aW9uYWxfaW50MzIoMTAwKTsKKyAgbS0+c2V0X29wdGlvbmFsX3N0cmluZygiYXNkZiIpOworICBtLT5zZXRfb3B0aW9uYWxfYnl0ZXMoImprbDsiKTsKKyAgbS0+bXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoNDIpOworICBtLT5tdXRhYmxlX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpLT5zZXRfYyg0Myk7CisgIG0tPnNldF9vcHRpb25hbF9uZXN0ZWRfZW51bShwcm90bzNfYXJlbmFfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKKyAgbS0+c2V0X29wdGlvbmFsX2ZvcmVpZ25fZW51bShwcm90bzNfYXJlbmFfdW5pdHRlc3Q6OkZPUkVJR05fQkFaKTsKKyAgbS0+bXV0YWJsZV9vcHRpb25hbF9sYXp5X21lc3NhZ2UoKS0+c2V0X2JiKDQ1KTsKKyAgbS0+bXV0YWJsZV9vcHRpb25hbF91bnZlcmlmaWVkX2xhenlfbWVzc2FnZSgpLT5zZXRfYmIoNDYpOworICBtLT5hZGRfcmVwZWF0ZWRfaW50MzIoMTAwKTsKKyAgbS0+YWRkX3JlcGVhdGVkX3N0cmluZygiYXNkZiIpOworICBtLT5hZGRfcmVwZWF0ZWRfYnl0ZXMoImprbDsiKTsKKyAgbS0+YWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig0Nik7CisgIG0tPmFkZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoNDcpOworICBtLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0ocHJvdG8zX2FyZW5hX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWik7CisgIG0tPmFkZF9yZXBlYXRlZF9mb3JlaWduX2VudW0ocHJvdG8zX2FyZW5hX3VuaXR0ZXN0OjpGT1JFSUdOX0JBWik7CisgIG0tPmFkZF9yZXBlYXRlZF9sYXp5X21lc3NhZ2UoKS0+c2V0X2JiKDQ5KTsKKworICBtLT5zZXRfb25lb2ZfdWludDMyKDEpOworICBtLT5tdXRhYmxlX29uZW9mX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig1MCk7CisgIG0tPnNldF9vbmVvZl9zdHJpbmcoInRlc3QiKTsgIC8vIG9ubHkgdGhpcyBvbmUgcmVtYWlucyBzZXQKK30KKwordm9pZCBFeHBlY3RBbGxGaWVsZHNTZXQoY29uc3QgVGVzdEFsbFR5cGVzJiBtKSB7CisgIEVYUEVDVF9FUSgxMDAsIG0ub3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSgiYXNkZiIsIG0ub3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoImprbDsiLCBtLm9wdGlvbmFsX2J5dGVzKCkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSg0MiwgbS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoNDMsIG0ub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkuYygpKTsKKyAgRVhQRUNUX0VRKHByb3RvM19hcmVuYV91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosIG0ub3B0aW9uYWxfbmVzdGVkX2VudW0oKSk7CisgIEVYUEVDVF9FUShwcm90bzNfYXJlbmFfdW5pdHRlc3Q6OkZPUkVJR05fQkFaLCBtLm9wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX0VRKHRydWUsIG0uaGFzX29wdGlvbmFsX2xhenlfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKDQ1LCBtLm9wdGlvbmFsX2xhenlfbWVzc2FnZSgpLmJiKCkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbS5oYXNfb3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSg0NiwgbS5vcHRpb25hbF91bnZlcmlmaWVkX2xhenlfbWVzc2FnZSgpLmJiKCkpOworCisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX2ludDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgxMDAsIG0ucmVwZWF0ZWRfaW50MzIoMCkpOworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9zdHJpbmdfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJhc2RmIiwgbS5yZXBlYXRlZF9zdHJpbmcoMCkpOworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9ieXRlc19zaXplKCkpOworICBFWFBFQ1RfRVEoImprbDsiLCBtLnJlcGVhdGVkX2J5dGVzKDApKTsKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQ2LCBtLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApLmJiKCkpOworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQ3LCBtLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgwKS5jKCkpOworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOworICBFWFBFQ1RfRVEocHJvdG8zX2FyZW5hX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWiwKKyAgICAgICAgICAgIG0ucmVwZWF0ZWRfbmVzdGVkX2VudW0oMCkpOworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKHByb3RvM19hcmVuYV91bml0dGVzdDo6Rk9SRUlHTl9CQVosIG0ucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX3NpemUoKSk7CisgIEVYUEVDVF9FUSg0OSwgbS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UoMCkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKHByb3RvM19hcmVuYV91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjprT25lb2ZTdHJpbmcsCisgICAgICAgICAgICBtLm9uZW9mX2ZpZWxkX2Nhc2UoKSk7CisgIEVYUEVDVF9FUSgidGVzdCIsIG0ub25lb2Zfc3RyaW5nKCkpOworfQorCisvLyBJbiB0aGlzIGZpbGUgd2Ugb25seSB0ZXN0IHNvbWUgYmFzaWMgZnVuY3Rpb25hbGl0aWVzIG9mIGFyZW5hIHN1cHBvcnQgaW4KKy8vIHByb3RvMyBhbmQgZXhwZWN0IHRoZSBhcmVuYSBzdXBwb3J0IHRvIGJlIGZ1bGx5IHRlc3RlZCBpbiBwcm90bzIgdW5pdHRlc3RzCisvLyBiZWNhdXNlIHByb3RvMyBzaGFyZXMgbW9zdCBjb2RlIHdpdGggcHJvdG8yLgorCitURVNUKFByb3RvM0FyZW5hVGVzdCwgUGFyc2luZykgeworICBUZXN0QWxsVHlwZXMgb3JpZ2luYWw7CisgIFNldEFsbEZpZWxkcygmb3JpZ2luYWwpOworCisgIEFyZW5hIGFyZW5hOworICBUZXN0QWxsVHlwZXMqIGFyZW5hX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIGFyZW5hX21lc3NhZ2UtPlBhcnNlRnJvbVN0cmluZyhvcmlnaW5hbC5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgRXhwZWN0QWxsRmllbGRzU2V0KCphcmVuYV9tZXNzYWdlKTsKK30KKworVEVTVChQcm90bzNBcmVuYVRlc3QsIFVua25vd25GaWVsZHMpIHsKKyAgVGVzdEFsbFR5cGVzIG9yaWdpbmFsOworICBTZXRBbGxGaWVsZHMoJm9yaWdpbmFsKTsKKworICBBcmVuYSBhcmVuYTsKKyAgVGVzdEFsbFR5cGVzKiBhcmVuYV9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEpOworICBhcmVuYV9tZXNzYWdlLT5QYXJzZUZyb21TdHJpbmcob3JpZ2luYWwuU2VyaWFsaXplQXNTdHJpbmcoKSk7CisgIEV4cGVjdEFsbEZpZWxkc1NldCgqYXJlbmFfbWVzc2FnZSk7CisKKyAgLy8gSW4gcHJvdG8zIHdlIGNhbiBzdGlsbCBnZXQgYSBwb2ludGVyIHRvIHRoZSBVbmtub3duRmllbGRTZXQgdGhyb3VnaAorICAvLyByZWZsZWN0aW9uIEFQSS4KKyAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyA9CisgICAgICBhcmVuYV9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVVbmtub3duRmllbGRzKGFyZW5hX21lc3NhZ2UpOworICAvLyBXZSBjYW4gbW9kaWZ5IHRoaXMgVW5rbm93bkZpZWxkU2V0LgorICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KDEsIDIpOworICAvLyBBbmQgdGhlIHVua25vd24gZmllbGRzIHNob3VsZCBiZSBjaGFuZ2VkLgorICBBU1NFUlRfTkUob3JpZ2luYWwuQnl0ZVNpemVMb25nKCksIGFyZW5hX21lc3NhZ2UtPkJ5dGVTaXplTG9uZygpKTsKKyAgQVNTRVJUX0ZBTFNFKAorICAgICAgYXJlbmFfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRVbmtub3duRmllbGRzKCphcmVuYV9tZXNzYWdlKS5lbXB0eSgpKTsKK30KKworVEVTVChQcm90bzNBcmVuYVRlc3QsIEdldEFyZW5hKSB7CisgIEFyZW5hIGFyZW5hOworCisgIC8vIFRlc3RzIGFyZW5hLWFsbG9jYXRlZCBtZXNzYWdlIGFuZCBzdWJtZXNzYWdlcy4KKyAgYXV0byogYXJlbmFfbWVzc2FnZTEgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIGF1dG8qIGFyZW5hX3N1Ym1lc3NhZ2UxID0gYXJlbmFfbWVzc2FnZTEtPm11dGFibGVfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCk7CisgIGF1dG8qIGFyZW5hX3JlcGVhdGVkX3N1Ym1lc3NhZ2UxID0KKyAgICAgIGFyZW5hX21lc3NhZ2UxLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKCk7CisgIEVYUEVDVF9FUSgmYXJlbmEsIGFyZW5hX21lc3NhZ2UxLT5HZXRBcmVuYSgpKTsKKyAgRVhQRUNUX0VRKCZhcmVuYSwgYXJlbmFfc3VibWVzc2FnZTEtPkdldEFyZW5hKCkpOworICBFWFBFQ1RfRVEoJmFyZW5hLCBhcmVuYV9yZXBlYXRlZF9zdWJtZXNzYWdlMS0+R2V0QXJlbmEoKSk7CisKKyAgLy8gVGVzdHMgYXR0YWNoZWQgaGVhcC1hbGxvY2F0ZWQgbWVzc2FnZXMuCisgIGF1dG8qIGFyZW5hX21lc3NhZ2UyID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEpOworICBhcmVuYV9tZXNzYWdlMi0+c2V0X2FsbG9jYXRlZF9vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UobmV3IEZvcmVpZ25NZXNzYWdlKCkpOworICBhcmVuYV9tZXNzYWdlMi0+bXV0YWJsZV9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoKS0+QWRkQWxsb2NhdGVkKAorICAgICAgbmV3IEZvcmVpZ25NZXNzYWdlKCkpOworICBjb25zdCBhdXRvJiBzdWJtZXNzYWdlMiA9IGFyZW5hX21lc3NhZ2UyLT5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKTsKKyAgY29uc3QgYXV0byYgcmVwZWF0ZWRfc3VibWVzc2FnZTIgPQorICAgICAgYXJlbmFfbWVzc2FnZTItPnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgwKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIHN1Ym1lc3NhZ2UyLkdldEFyZW5hKCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgcmVwZWF0ZWRfc3VibWVzc2FnZTIuR2V0QXJlbmEoKSk7CisKKyAgLy8gVGVzdHMgbWVzc2FnZSBjcmVhdGVkIGJ5IEFyZW5hOjpDcmVhdGUuCisgIGF1dG8qIGFyZW5hX21lc3NhZ2UzID0gQXJlbmE6OkNyZWF0ZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBhcmVuYV9tZXNzYWdlMy0+R2V0QXJlbmEoKSk7Cit9CisKK1RFU1QoUHJvdG8zQXJlbmFUZXN0LCBHZXRBcmVuYVdpdGhVbmtub3duKSB7CisgIEFyZW5hIGFyZW5hOworCisgIC8vIFRlc3RzIGFyZW5hLWFsbG9jYXRlZCBtZXNzYWdlIGFuZCBzdWJtZXNzYWdlcy4KKyAgYXV0byogYXJlbmFfbWVzc2FnZTEgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIGFyZW5hX21lc3NhZ2UxLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVVbmtub3duRmllbGRzKGFyZW5hX21lc3NhZ2UxKTsKKyAgYXV0byogYXJlbmFfc3VibWVzc2FnZTEgPSBhcmVuYV9tZXNzYWdlMS0+bXV0YWJsZV9vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKTsKKyAgYXJlbmFfc3VibWVzc2FnZTEtPkdldFJlZmxlY3Rpb24oKS0+TXV0YWJsZVVua25vd25GaWVsZHMoYXJlbmFfc3VibWVzc2FnZTEpOworICBhdXRvKiBhcmVuYV9yZXBlYXRlZF9zdWJtZXNzYWdlMSA9CisgICAgICBhcmVuYV9tZXNzYWdlMS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgpOworICBhcmVuYV9yZXBlYXRlZF9zdWJtZXNzYWdlMS0+R2V0UmVmbGVjdGlvbigpLT5NdXRhYmxlVW5rbm93bkZpZWxkcygKKyAgICAgIGFyZW5hX3JlcGVhdGVkX3N1Ym1lc3NhZ2UxKTsKKyAgRVhQRUNUX0VRKCZhcmVuYSwgYXJlbmFfbWVzc2FnZTEtPkdldEFyZW5hKCkpOworICBFWFBFQ1RfRVEoJmFyZW5hLCBhcmVuYV9zdWJtZXNzYWdlMS0+R2V0QXJlbmEoKSk7CisgIEVYUEVDVF9FUSgmYXJlbmEsIGFyZW5hX3JlcGVhdGVkX3N1Ym1lc3NhZ2UxLT5HZXRBcmVuYSgpKTsKKworICAvLyBUZXN0cyBhdHRhY2hlZCBoZWFwLWFsbG9jYXRlZCBtZXNzYWdlcy4KKyAgYXV0byogYXJlbmFfbWVzc2FnZTIgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIGFyZW5hX21lc3NhZ2UyLT5zZXRfYWxsb2NhdGVkX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZShuZXcgRm9yZWlnbk1lc3NhZ2UoKSk7CisgIGFyZW5hX21lc3NhZ2UyLT5tdXRhYmxlX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgpLT5BZGRBbGxvY2F0ZWQoCisgICAgICBuZXcgRm9yZWlnbk1lc3NhZ2UoKSk7CisgIGF1dG8qIHN1Ym1lc3NhZ2UyID0gYXJlbmFfbWVzc2FnZTItPm11dGFibGVfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCk7CisgIHN1Ym1lc3NhZ2UyLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVVbmtub3duRmllbGRzKHN1Ym1lc3NhZ2UyKTsKKyAgYXV0byogcmVwZWF0ZWRfc3VibWVzc2FnZTIgPQorICAgICAgYXJlbmFfbWVzc2FnZTItPm11dGFibGVfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApOworICByZXBlYXRlZF9zdWJtZXNzYWdlMi0+R2V0UmVmbGVjdGlvbigpLT5NdXRhYmxlVW5rbm93bkZpZWxkcygKKyAgICAgIHJlcGVhdGVkX3N1Ym1lc3NhZ2UyKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIHN1Ym1lc3NhZ2UyLT5HZXRBcmVuYSgpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIHJlcGVhdGVkX3N1Ym1lc3NhZ2UyLT5HZXRBcmVuYSgpKTsKK30KKworVEVTVChQcm90bzNBcmVuYVRlc3QsIFN3YXApIHsKKyAgQXJlbmEgYXJlbmExOworICBBcmVuYSBhcmVuYTI7CisKKyAgLy8gVGVzdCBTd2FwKCkuCisgIFRlc3RBbGxUeXBlcyogYXJlbmExX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYTEpOworICBUZXN0QWxsVHlwZXMqIGFyZW5hMl9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEyKTsKKyAgYXJlbmExX21lc3NhZ2UtPlN3YXAoYXJlbmEyX21lc3NhZ2UpOworICBFWFBFQ1RfRVEoJmFyZW5hMSwgYXJlbmExX21lc3NhZ2UtPkdldEFyZW5hKCkpOworICBFWFBFQ1RfRVEoJmFyZW5hMiwgYXJlbmEyX21lc3NhZ2UtPkdldEFyZW5hKCkpOworfQorCitURVNUKFByb3RvM0FyZW5hVGVzdCwgU2V0QWxsb2NhdGVkTWVzc2FnZSkgeworICBBcmVuYSBhcmVuYTsKKyAgVGVzdEFsbFR5cGVzKiBhcmVuYV9tZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEpOworICBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIG5lc3RlZCA9IG5ldyBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U7CisgIG5lc3RlZC0+c2V0X2JiKDExOCk7CisgIGFyZW5hX21lc3NhZ2UtPnNldF9hbGxvY2F0ZWRfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UobmVzdGVkKTsKKyAgRVhQRUNUX0VRKDExOCwgYXJlbmFfbWVzc2FnZS0+b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5iYigpKTsKK30KKworVEVTVChQcm90bzNBcmVuYVRlc3QsIFJlbGVhc2VNZXNzYWdlKSB7CisgIEFyZW5hIGFyZW5hOworICBUZXN0QWxsVHlwZXMqIGFyZW5hX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIGFyZW5hX21lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDExOCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U+IG5lc3RlZCgKKyAgICAgIGFyZW5hX21lc3NhZ2UtPnJlbGVhc2Vfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgxMTgsIG5lc3RlZC0+YmIoKSk7Cit9CisKK1RFU1QoUHJvdG8zQXJlbmFUZXN0LCBNZXNzYWdlRmllbGRDbGVhcikgeworICAvLyBHaXRIdWIgaXNzdWUgIzMxMDogaHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9pc3N1ZXMvMzEwCisgIEFyZW5hIGFyZW5hOworICBUZXN0QWxsVHlwZXMqIGFyZW5hX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIGFyZW5hX21lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDExOCk7CisgIC8vIFRoaXMgc2hvdWxkIG5vdCBjcmFzaCwgYnV0IHByaW9yIHRvIHRoZSBidWdmaXgsIGl0IHRyaWVkIHRvIHVzZSBgb3BlcmF0b3IKKyAgLy8gZGVsZXRlYCB0aGUgbmVzdGVkIG1lc3NhZ2UgKHdoaWNoIGlzIG9uIHRoZSBhcmVuYSk6CisgIGFyZW5hX21lc3NhZ2UtPkNsZWFyKCk7Cit9CisKK1RFU1QoUHJvdG8zQXJlbmFUZXN0LCBNZXNzYWdlRmllbGRDbGVhclZpYVJlZmxlY3Rpb24pIHsKKyAgQXJlbmEgYXJlbmE7CisgIFRlc3RBbGxUeXBlcyogbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogciA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZCA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtc2dfZmllbGQgPQorICAgICAgZC0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpOworCisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDEpOworICByLT5DbGVhckZpZWxkKG1lc3NhZ2UsIG1zZ19maWVsZCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLT5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLT5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworfQorCitURVNUKFByb3RvM09wdGlvbmFsVGVzdCwgT3B0aW9uYWxGaWVsZHMpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbCBtc2c7CisgIEVYUEVDVF9GQUxTRShtc2cuaGFzX29wdGlvbmFsX2ludDMyKCkpOworICBtc2cuc2V0X29wdGlvbmFsX2ludDMyKDApOworICBFWFBFQ1RfVFJVRShtc2cuaGFzX29wdGlvbmFsX2ludDMyKCkpOworCisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIG1zZy5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCk7CisgIEVYUEVDVF9HVChzZXJpYWxpemVkLnNpemUoKSwgMCk7CisKKyAgbXNnLmNsZWFyX29wdGlvbmFsX2ludDMyKCk7CisgIEVYUEVDVF9GQUxTRShtc2cuaGFzX29wdGlvbmFsX2ludDMyKCkpOworICBtc2cuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpOworICBFWFBFQ1RfRVEoc2VyaWFsaXplZC5zaXplKCksIDApOworfQorCitURVNUKFByb3RvM09wdGlvbmFsVGVzdCwgT3B0aW9uYWxGaWVsZERlc2NyaXB0b3IpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogZCA9IHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UHJvdG8zT3B0aW9uYWw6OmRlc2NyaXB0b3IoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGQtPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZiA9IGQtPmZpZWxkKGkpOworICAgIGlmIChIYXNQcmVmaXhTdHJpbmcoZi0+bmFtZSgpLCAic2luZ3VsYXIiKSkgeworICAgICAgRVhQRUNUX0ZBTFNFKGYtPmhhc19vcHRpb25hbF9rZXl3b3JkKCkpIDw8IGYtPmZ1bGxfbmFtZSgpOworICAgICAgRVhQRUNUX0ZBTFNFKGYtPmhhc19wcmVzZW5jZSgpKSA8PCBmLT5mdWxsX25hbWUoKTsKKyAgICAgIEVYUEVDVF9GQUxTRShmLT5jb250YWluaW5nX29uZW9mKCkpIDw8IGYtPmZ1bGxfbmFtZSgpOworICAgIH0gZWxzZSB7CisgICAgICBFWFBFQ1RfVFJVRShmLT5oYXNfb3B0aW9uYWxfa2V5d29yZCgpKSA8PCBmLT5mdWxsX25hbWUoKTsKKyAgICAgIEVYUEVDVF9UUlVFKGYtPmhhc19wcmVzZW5jZSgpKSA8PCBmLT5mdWxsX25hbWUoKTsKKyAgICAgIEVYUEVDVF9UUlVFKGYtPmNvbnRhaW5pbmdfb25lb2YoKSkgPDwgZi0+ZnVsbF9uYW1lKCk7CisgICAgfQorICB9Cit9CisKK1RFU1QoUHJvdG8zT3B0aW9uYWxUZXN0LCBFeHRlbnNpb25zKSB7CisgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwID0gRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbm9fb3B0aW9uYWwgPSBwLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LlByb3RvM09wdGlvbmFsRXh0ZW5zaW9ucy5leHRfbm9fb3B0aW9uYWwiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB3aXRoX29wdGlvbmFsID0gcC0+RmluZEV4dGVuc2lvbkJ5TmFtZSgKKyAgICAgICJwcm90b2J1Zl91bml0dGVzdC5Qcm90bzNPcHRpb25hbEV4dGVuc2lvbnMuZXh0X3dpdGhfb3B0aW9uYWwiKTsKKyAgR09PR0xFX0NIRUNLKG5vX29wdGlvbmFsKTsKKyAgR09PR0xFX0NIRUNLKHdpdGhfb3B0aW9uYWwpOworICBFWFBFQ1RfRkFMU0Uobm9fb3B0aW9uYWwtPmhhc19vcHRpb25hbF9rZXl3b3JkKCkpOworICBFWFBFQ1RfVFJVRSh3aXRoX29wdGlvbmFsLT5oYXNfb3B0aW9uYWxfa2V5d29yZCgpKTsKKworICBjb25zdCBEZXNjcmlwdG9yKiBkID0gcHJvdG9idWZfdW5pdHRlc3Q6OlByb3RvM09wdGlvbmFsRXh0ZW5zaW9uczo6ZGVzY3JpcHRvcigpOworICBFWFBFQ1RfVFJVRShkLT5vcHRpb25zKCkuSGFzRXh0ZW5zaW9uKAorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlByb3RvM09wdGlvbmFsRXh0ZW5zaW9uczo6ZXh0X25vX29wdGlvbmFsKSk7CisgIEVYUEVDVF9UUlVFKGQtPm9wdGlvbnMoKS5IYXNFeHRlbnNpb24oCisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6UHJvdG8zT3B0aW9uYWxFeHRlbnNpb25zOjpleHRfd2l0aF9vcHRpb25hbCkpOworICBFWFBFQ1RfRVEoOCwgZC0+b3B0aW9ucygpLkdldEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6UHJvdG8zT3B0aW9uYWxFeHRlbnNpb25zOjpleHRfbm9fb3B0aW9uYWwpKTsKKyAgRVhQRUNUX0VRKDE2LAorICAgICAgICAgICAgZC0+b3B0aW9ucygpLkdldEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6UHJvdG8zT3B0aW9uYWxFeHRlbnNpb25zOjpleHRfd2l0aF9vcHRpb25hbCkpOworCisgIGNvbnN0IERlc2NyaXB0b3IqIGQyID0gcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbDo6ZGVzY3JpcHRvcigpOworICBFWFBFQ1RfRkFMU0UoZDItPm9wdGlvbnMoKS5IYXNFeHRlbnNpb24oCisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6UHJvdG8zT3B0aW9uYWxFeHRlbnNpb25zOjpleHRfbm9fb3B0aW9uYWwpKTsKKyAgRVhQRUNUX0ZBTFNFKGQyLT5vcHRpb25zKCkuSGFzRXh0ZW5zaW9uKAorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlByb3RvM09wdGlvbmFsRXh0ZW5zaW9uczo6ZXh0X3dpdGhfb3B0aW9uYWwpKTsKK30KKworVEVTVChQcm90bzNPcHRpb25hbFRlc3QsIE9wdGlvbmFsRmllbGQpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbCBtc2c7CisgIEVYUEVDVF9GQUxTRShtc2cuaGFzX29wdGlvbmFsX2ludDMyKCkpOworICBtc2cuc2V0X29wdGlvbmFsX2ludDMyKDApOworICBFWFBFQ1RfVFJVRShtc2cuaGFzX29wdGlvbmFsX2ludDMyKCkpOworCisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIG1zZy5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCk7CisgIEVYUEVDVF9HVChzZXJpYWxpemVkLnNpemUoKSwgMCk7CisKKyAgbXNnLmNsZWFyX29wdGlvbmFsX2ludDMyKCk7CisgIEVYUEVDVF9GQUxTRShtc2cuaGFzX29wdGlvbmFsX2ludDMyKCkpOworICBtc2cuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpOworICBFWFBFQ1RfRVEoc2VyaWFsaXplZC5zaXplKCksIDApOworfQorCitURVNUKFByb3RvM09wdGlvbmFsVGVzdCwgT3B0aW9uYWxGaWVsZFJlZmxlY3Rpb24pIHsKKyAgLy8gVGVzdHMgdGhhdCBvbmVvZiByZWZsZWN0aW9uIHdvcmtzIG9uIHN5bnRoZXRpYyBvbmVvZnMuCisgIC8vCisgIC8vIFdlIHRlc3QgdGhpcyBtb3JlIGRlZXBseSBlbHNld2hlcmUgYnkgcGFyc2luZy9zZXJpYWxpemluZyBUZXh0Rm9ybWF0ICh3aGljaAorICAvLyBkb2Vzbid0IHRyZWF0IHN5bnRoZXRpYyBvbmVvZnMgc3BlY2lhbGx5LCBzbyByZWZsZWN0cyBvdmVyIHRoZW0gbm9ybWFsbHkpLgorICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdFByb3RvM09wdGlvbmFsIG1zZzsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZCA9IG1zZy5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb24qIHIgPSBtc2cuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGYgPSBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIik7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok9uZW9mRGVzY3JpcHRvciogbyA9IGQtPkZpbmRPbmVvZkJ5TmFtZSgiX29wdGlvbmFsX2ludDMyIik7CisgIEdPT0dMRV9DSEVDSyhmKTsKKyAgR09PR0xFX0NIRUNLKG8pOworICBFWFBFQ1RfVFJVRShvLT5pc19zeW50aGV0aWMoKSk7CisKKyAgRVhQRUNUX0ZBTFNFKHItPkhhc0ZpZWxkKG1zZywgZikpOworICBFWFBFQ1RfRkFMU0Uoci0+SGFzT25lb2YobXNnLCBvKSk7CisgIEVYUEVDVF9UUlVFKHItPkdldE9uZW9mRmllbGREZXNjcmlwdG9yKG1zZywgbykgPT0gbnVsbHB0cik7CisKKyAgci0+U2V0SW50MzIoJm1zZywgZiwgMTIzKTsKKyAgRVhQRUNUX0VRKDEyMywgbXNnLm9wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoMTIzLCByLT5HZXRJbnQzMihtc2csIGYpKTsKKyAgRVhQRUNUX1RSVUUoci0+SGFzRmllbGQobXNnLCBmKSk7CisgIEVYUEVDVF9UUlVFKHItPkhhc09uZW9mKG1zZywgbykpOworICBFWFBFQ1RfRVEoZiwgci0+R2V0T25lb2ZGaWVsZERlc2NyaXB0b3IobXNnLCBvKSk7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICByLT5MaXN0RmllbGRzKG1zZywgJmZpZWxkcyk7CisgIEVYUEVDVF9FUSgxLCBmaWVsZHMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKGYsIGZpZWxkc1swXSk7CisKKyAgci0+Q2xlYXJPbmVvZigmbXNnLCBvKTsKKyAgRVhQRUNUX0ZBTFNFKHItPkhhc0ZpZWxkKG1zZywgZikpOworICBFWFBFQ1RfRkFMU0Uoci0+SGFzT25lb2YobXNnLCBvKSk7CisgIEVYUEVDVF9UUlVFKHItPkdldE9uZW9mRmllbGREZXNjcmlwdG9yKG1zZywgbykgPT0gbnVsbHB0cik7CisKKyAgbXNnLnNldF9vcHRpb25hbF9pbnQzMigxMjMpOworICBFWFBFQ1RfRVEoMTIzLCByLT5HZXRJbnQzMihtc2csIGYpKTsKKyAgRVhQRUNUX1RSVUUoci0+SGFzRmllbGQobXNnLCBmKSk7CisgIEVYUEVDVF9UUlVFKHItPkhhc09uZW9mKG1zZywgbykpOworICBFWFBFQ1RfRVEoZiwgci0+R2V0T25lb2ZGaWVsZERlc2NyaXB0b3IobXNnLCBvKSk7CisKKyAgci0+Q2xlYXJPbmVvZigmbXNnLCBvKTsKKyAgRVhQRUNUX0ZBTFNFKHItPkhhc0ZpZWxkKG1zZywgZikpOworICBFWFBFQ1RfRkFMU0Uoci0+SGFzT25lb2YobXNnLCBvKSk7CisgIEVYUEVDVF9UUlVFKHItPkdldE9uZW9mRmllbGREZXNjcmlwdG9yKG1zZywgbykgPT0gbnVsbHB0cik7Cit9CisKKy8vIEl0J3MgYSByZWdyZXNzaW9uIHRlc3QgZm9yIGIvMTYwNjY1NTQzLgorVEVTVChQcm90bzNPcHRpb25hbFRlc3QsIENsZWFyTm9uT3B0aW9uYWxNZXNzYWdlRmllbGQpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbE1lc3NhZ2UgbXNnOworICBtc2cubXV0YWJsZV9uZXN0ZWRfbWVzc2FnZSgpOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkID0gbXNnLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogciA9IG1zZy5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZiA9IGQtPkZpbmRGaWVsZEJ5TmFtZSgibmVzdGVkX21lc3NhZ2UiKTsKKyAgci0+Q2xlYXJGaWVsZCgmbXNnLCBmKTsKK30KKworVEVTVChQcm90bzNPcHRpb25hbFRlc3QsIENsZWFyT3B0aW9uYWxNZXNzYWdlRmllbGQpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbE1lc3NhZ2UgbXNnOworICBtc2cubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkID0gbXNnLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogciA9IG1zZy5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZiA9CisgICAgICBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIik7CisgIHItPkNsZWFyRmllbGQoJm1zZywgZik7Cit9CisKK1RFU1QoUHJvdG8zT3B0aW9uYWxUZXN0LCBTd2FwTm9uT3B0aW9uYWxNZXNzYWdlRmllbGQpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbE1lc3NhZ2UgbXNnMTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbE1lc3NhZ2UgbXNnMjsKKyAgbXNnMS5tdXRhYmxlX25lc3RlZF9tZXNzYWdlKCk7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGQgPSBtc2cxLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogciA9IG1zZzEuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGYgPSBkLT5GaW5kRmllbGRCeU5hbWUoIm5lc3RlZF9tZXNzYWdlIik7CisgIHItPlN3YXBGaWVsZHMoJm1zZzEsICZtc2cyLCB7Zn0pOworfQorCitURVNUKFByb3RvM09wdGlvbmFsVGVzdCwgU3dhcE9wdGlvbmFsTWVzc2FnZUZpZWxkKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UHJvdG8zT3B0aW9uYWxNZXNzYWdlIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UHJvdG8zT3B0aW9uYWxNZXNzYWdlIG1zZzI7CisgIG1zZzEubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkID0gbXNnMS5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb24qIHIgPSBtc2cxLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBmID0KKyAgICAgIGQtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKTsKKyAgci0+U3dhcEZpZWxkcygmbXNnMSwgJm1zZzIsIHtmfSk7Cit9CisKK3ZvaWQgU2V0QWxsRmllbGRzWmVybyhwcm90b2J1Zl91bml0dGVzdDo6VGVzdFByb3RvM09wdGlvbmFsKiBtc2cpIHsKKyAgbXNnLT5zZXRfb3B0aW9uYWxfaW50MzIoMCk7CisgIG1zZy0+c2V0X29wdGlvbmFsX2ludDY0KDApOworICBtc2ctPnNldF9vcHRpb25hbF91aW50MzIoMCk7CisgIG1zZy0+c2V0X29wdGlvbmFsX3VpbnQ2NCgwKTsKKyAgbXNnLT5zZXRfb3B0aW9uYWxfc2ludDMyKDApOworICBtc2ctPnNldF9vcHRpb25hbF9zaW50NjQoMCk7CisgIG1zZy0+c2V0X29wdGlvbmFsX2ZpeGVkMzIoMCk7CisgIG1zZy0+c2V0X29wdGlvbmFsX2ZpeGVkNjQoMCk7CisgIG1zZy0+c2V0X29wdGlvbmFsX3NmaXhlZDMyKDApOworICBtc2ctPnNldF9vcHRpb25hbF9zZml4ZWQ2NCgwKTsKKyAgbXNnLT5zZXRfb3B0aW9uYWxfZmxvYXQoMCk7CisgIG1zZy0+c2V0X29wdGlvbmFsX2RvdWJsZSgwKTsKKyAgbXNnLT5zZXRfb3B0aW9uYWxfYm9vbChmYWxzZSk7CisgIG1zZy0+c2V0X29wdGlvbmFsX3N0cmluZygiIik7CisgIG1zZy0+c2V0X29wdGlvbmFsX2J5dGVzKCIiKTsKKyAgbXNnLT5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCk7CisgIG1zZy0+bXV0YWJsZV9sYXp5X25lc3RlZF9tZXNzYWdlKCk7CisgIG1zZy0+c2V0X29wdGlvbmFsX25lc3RlZF9lbnVtKAorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbDo6VU5TUEVDSUZJRUQpOworfQorCit2b2lkIFNldEFsbEZpZWxkc05vblplcm8ocHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbCogbXNnKSB7CisgIG1zZy0+c2V0X29wdGlvbmFsX2ludDMyKDEwMSk7CisgIG1zZy0+c2V0X29wdGlvbmFsX2ludDY0KDEwMik7CisgIG1zZy0+c2V0X29wdGlvbmFsX3VpbnQzMigxMDMpOworICBtc2ctPnNldF9vcHRpb25hbF91aW50NjQoMTA0KTsKKyAgbXNnLT5zZXRfb3B0aW9uYWxfc2ludDMyKDEwNSk7CisgIG1zZy0+c2V0X29wdGlvbmFsX3NpbnQ2NCgxMDYpOworICBtc2ctPnNldF9vcHRpb25hbF9maXhlZDMyKDEwNyk7CisgIG1zZy0+c2V0X29wdGlvbmFsX2ZpeGVkNjQoMTA4KTsKKyAgbXNnLT5zZXRfb3B0aW9uYWxfc2ZpeGVkMzIoMTA5KTsKKyAgbXNnLT5zZXRfb3B0aW9uYWxfc2ZpeGVkNjQoMTEwKTsKKyAgbXNnLT5zZXRfb3B0aW9uYWxfZmxvYXQoMTExKTsKKyAgbXNnLT5zZXRfb3B0aW9uYWxfZG91YmxlKDExMik7CisgIG1zZy0+c2V0X29wdGlvbmFsX2Jvb2wodHJ1ZSk7CisgIG1zZy0+c2V0X29wdGlvbmFsX3N0cmluZygiYWJjIik7CisgIG1zZy0+c2V0X29wdGlvbmFsX2J5dGVzKCJkZWYiKTsKKyAgbXNnLT5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCk7CisgIG1zZy0+bXV0YWJsZV9sYXp5X25lc3RlZF9tZXNzYWdlKCk7CisgIG1zZy0+c2V0X29wdGlvbmFsX25lc3RlZF9lbnVtKHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UHJvdG8zT3B0aW9uYWw6OkJBWik7Cit9CisKK3ZvaWQgVGVzdEFsbEZpZWxkc1plcm8oY29uc3QgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbCYgbXNnKSB7CisgIEVYUEVDVF9FUSgwLCBtc2cub3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSgwLCBtc2cub3B0aW9uYWxfaW50NjQoKSk7CisgIEVYUEVDVF9FUSgwLCBtc2cub3B0aW9uYWxfdWludDMyKCkpOworICBFWFBFQ1RfRVEoMCwgbXNnLm9wdGlvbmFsX3VpbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1zZy5vcHRpb25hbF9zaW50MzIoKSk7CisgIEVYUEVDVF9FUSgwLCBtc2cub3B0aW9uYWxfc2ludDY0KCkpOworICBFWFBFQ1RfRVEoMCwgbXNnLm9wdGlvbmFsX2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSgwLCBtc2cub3B0aW9uYWxfZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1zZy5vcHRpb25hbF9zZml4ZWQzMigpKTsKKyAgRVhQRUNUX0VRKDAsIG1zZy5vcHRpb25hbF9zZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1zZy5vcHRpb25hbF9mbG9hdCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1zZy5vcHRpb25hbF9kb3VibGUoKSk7CisgIEVYUEVDVF9FUSgwLCBtc2cub3B0aW9uYWxfYm9vbCgpKTsKKyAgRVhQRUNUX0VRKCIiLCBtc2cub3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoIiIsIG1zZy5vcHRpb25hbF9ieXRlcygpKTsKKyAgRVhQRUNUX0VRKHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UHJvdG8zT3B0aW9uYWw6OlVOU1BFQ0lGSUVELAorICAgICAgICAgICAgbXNnLm9wdGlvbmFsX25lc3RlZF9lbnVtKCkpOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHIgPSBtc2cuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBEZXNjcmlwdG9yKiBkID0gbXNnLkdldERlc2NyaXB0b3IoKTsKKyAgRVhQRUNUX0VRKCIiLCByLT5HZXRTdHJpbmcobXNnLCBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX3N0cmluZyIpKSk7Cit9CisKK3ZvaWQgVGVzdEFsbEZpZWxkc05vblplcm8oY29uc3QgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbCYgbXNnKSB7CisgIEVYUEVDVF9FUSgxMDEsIG1zZy5vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKDEwMiwgbXNnLm9wdGlvbmFsX2ludDY0KCkpOworICBFWFBFQ1RfRVEoMTAzLCBtc2cub3B0aW9uYWxfdWludDMyKCkpOworICBFWFBFQ1RfRVEoMTA0LCBtc2cub3B0aW9uYWxfdWludDY0KCkpOworICBFWFBFQ1RfRVEoMTA1LCBtc2cub3B0aW9uYWxfc2ludDMyKCkpOworICBFWFBFQ1RfRVEoMTA2LCBtc2cub3B0aW9uYWxfc2ludDY0KCkpOworICBFWFBFQ1RfRVEoMTA3LCBtc2cub3B0aW9uYWxfZml4ZWQzMigpKTsKKyAgRVhQRUNUX0VRKDEwOCwgbXNnLm9wdGlvbmFsX2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9FUSgxMDksIG1zZy5vcHRpb25hbF9zZml4ZWQzMigpKTsKKyAgRVhQRUNUX0VRKDExMCwgbXNnLm9wdGlvbmFsX3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoMTExLCBtc2cub3B0aW9uYWxfZmxvYXQoKSk7CisgIEVYUEVDVF9FUSgxMTIsIG1zZy5vcHRpb25hbF9kb3VibGUoKSk7CisgIEVYUEVDVF9FUSh0cnVlLCBtc2cub3B0aW9uYWxfYm9vbCgpKTsKKyAgRVhQRUNUX0VRKCJhYmMiLCBtc2cub3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoImRlZiIsIG1zZy5vcHRpb25hbF9ieXRlcygpKTsKKyAgRVhQRUNUX0VRKHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UHJvdG8zT3B0aW9uYWw6OkJBWiwKKyAgICAgICAgICAgIG1zZy5vcHRpb25hbF9uZXN0ZWRfZW51bSgpKTsKK30KKwordm9pZCBUZXN0QWxsRmllbGRzU2V0KGNvbnN0IHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UHJvdG8zT3B0aW9uYWwmIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIHNldCkgeworICBFWFBFQ1RfRVEoc2V0LCBtc2cuaGFzX29wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoc2V0LCBtc2cuaGFzX29wdGlvbmFsX2ludDY0KCkpOworICBFWFBFQ1RfRVEoc2V0LCBtc2cuaGFzX29wdGlvbmFsX3VpbnQzMigpKTsKKyAgRVhQRUNUX0VRKHNldCwgbXNnLmhhc19vcHRpb25hbF91aW50NjQoKSk7CisgIEVYUEVDVF9FUShzZXQsIG1zZy5oYXNfb3B0aW9uYWxfc2ludDMyKCkpOworICBFWFBFQ1RfRVEoc2V0LCBtc2cuaGFzX29wdGlvbmFsX3NpbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKHNldCwgbXNnLmhhc19vcHRpb25hbF9maXhlZDMyKCkpOworICBFWFBFQ1RfRVEoc2V0LCBtc2cuaGFzX29wdGlvbmFsX2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9FUShzZXQsIG1zZy5oYXNfb3B0aW9uYWxfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUShzZXQsIG1zZy5oYXNfb3B0aW9uYWxfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9FUShzZXQsIG1zZy5oYXNfb3B0aW9uYWxfZmxvYXQoKSk7CisgIEVYUEVDVF9FUShzZXQsIG1zZy5oYXNfb3B0aW9uYWxfZG91YmxlKCkpOworICBFWFBFQ1RfRVEoc2V0LCBtc2cuaGFzX29wdGlvbmFsX2Jvb2woKSk7CisgIEVYUEVDVF9FUShzZXQsIG1zZy5oYXNfb3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoc2V0LCBtc2cuaGFzX29wdGlvbmFsX2J5dGVzKCkpOworICBFWFBFQ1RfRVEoc2V0LCBtc2cuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoc2V0LCBtc2cuaGFzX2xhenlfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUShzZXQsIG1zZy5oYXNfb3B0aW9uYWxfbmVzdGVkX2VudW0oKSk7Cit9CisKK1RFU1QoUHJvdG8zT3B0aW9uYWxUZXN0LCBCaW5hcnlSb3VuZFRyaXApIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbCBtc2c7CisgIFRlc3RBbGxGaWVsZHNTZXQobXNnLCBmYWxzZSk7CisgIFNldEFsbEZpZWxkc1plcm8oJm1zZyk7CisgIFRlc3RBbGxGaWVsZHNaZXJvKG1zZyk7CisgIFRlc3RBbGxGaWVsZHNTZXQobXNnLCB0cnVlKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdFByb3RvM09wdGlvbmFsIG1zZzI7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIG1zZy5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCk7CisgIEVYUEVDVF9UUlVFKG1zZzIuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKKyAgVGVzdEFsbEZpZWxkc1plcm8obXNnMik7CisgIFRlc3RBbGxGaWVsZHNTZXQobXNnMiwgdHJ1ZSk7Cit9CisKK1RFU1QoUHJvdG8zT3B0aW9uYWxUZXN0LCBUZXh0Rm9ybWF0Um91bmRUcmlwWmVyb3MpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbCBtc2c7CisgIFNldEFsbEZpZWxkc1plcm8oJm1zZyk7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbCBtc2cyOworICBzdGQ6OnN0cmluZyB0ZXh0OworICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQcmludFRvU3RyaW5nKG1zZywgJnRleHQpKTsKKyAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKHRleHQsICZtc2cyKSk7CisgIFRlc3RBbGxGaWVsZHNTZXQobXNnMiwgdHJ1ZSk7CisgIFRlc3RBbGxGaWVsZHNaZXJvKG1zZzIpOworfQorCitURVNUKFByb3RvM09wdGlvbmFsVGVzdCwgVGV4dEZvcm1hdFJvdW5kVHJpcE5vblplcm9zKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UHJvdG8zT3B0aW9uYWwgbXNnOworICBTZXRBbGxGaWVsZHNOb25aZXJvKCZtc2cpOworCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UHJvdG8zT3B0aW9uYWwgbXNnMjsKKyAgc3RkOjpzdHJpbmcgdGV4dDsKKyAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UHJpbnRUb1N0cmluZyhtc2csICZ0ZXh0KSk7CisgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyh0ZXh0LCAmbXNnMikpOworICBUZXN0QWxsRmllbGRzU2V0KG1zZzIsIHRydWUpOworICBUZXN0QWxsRmllbGRzTm9uWmVybyhtc2cyKTsKK30KKworVEVTVChQcm90bzNPcHRpb25hbFRlc3QsIFN3YXBSb3VuZFRyaXBaZXJvKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UHJvdG8zT3B0aW9uYWwgbXNnOworICBTZXRBbGxGaWVsZHNaZXJvKCZtc2cpOworICBUZXN0QWxsRmllbGRzU2V0KG1zZywgdHJ1ZSk7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbCBtc2cyOworICBtc2cuU3dhcCgmbXNnMik7CisgIFRlc3RBbGxGaWVsZHNTZXQobXNnMiwgdHJ1ZSk7CisgIFRlc3RBbGxGaWVsZHNaZXJvKG1zZzIpOworfQorCitURVNUKFByb3RvM09wdGlvbmFsVGVzdCwgU3dhcFJvdW5kVHJpcE5vblplcm8pIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQcm90bzNPcHRpb25hbCBtc2c7CisgIFNldEFsbEZpZWxkc05vblplcm8oJm1zZyk7CisgIFRlc3RBbGxGaWVsZHNTZXQobXNnLCB0cnVlKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdFByb3RvM09wdGlvbmFsIG1zZzI7CisgIG1zZy5Td2FwKCZtc2cyKTsKKyAgVGVzdEFsbEZpZWxkc1NldChtc2cyLCB0cnVlKTsKKyAgVGVzdEFsbEZpZWxkc05vblplcm8obXNnMik7Cit9CisKK1RFU1QoUHJvdG8zT3B0aW9uYWxUZXN0LCBSZWZsZWN0aXZlU3dhcFJvdW5kVHJpcCkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdFByb3RvM09wdGlvbmFsIG1zZzsKKyAgU2V0QWxsRmllbGRzWmVybygmbXNnKTsKKyAgVGVzdEFsbEZpZWxkc1NldChtc2csIHRydWUpOworCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UHJvdG8zT3B0aW9uYWwgbXNnMjsKKyAgbXNnMi5HZXRSZWZsZWN0aW9uKCktPlN3YXAoJm1zZywgJm1zZzIpOworICBUZXN0QWxsRmllbGRzU2V0KG1zZzIsIHRydWUpOworICBUZXN0QWxsRmllbGRzWmVybyhtc2cyKTsKK30KKworVEVTVChQcm90bzNPcHRpb25hbFRlc3QsIFBsYWluRmllbGRzKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGQgPSBUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKTsKKworICBFWFBFQ1RfRkFMU0UoZC0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpLT5oYXNfcHJlc2VuY2UoKSk7CisgIEVYUEVDVF9UUlVFKGQtPkZpbmRGaWVsZEJ5TmFtZSgib25lb2ZfbmVzdGVkX21lc3NhZ2UiKS0+aGFzX3ByZXNlbmNlKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfbGl0ZV91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlZWVkYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw0MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnBiLmg+CisKKyNkZWZpbmUgTElURV9URVNUX05BTUUgUHJvdG8zTGl0ZVRlc3QKKyNkZWZpbmUgVU5JVFRFU1QgOjpwcm90bzNfdW5pdHRlc3QKKworLy8gTXVzdCBpbmNsdWRlIGFmdGVyIHRoZSBhYm92ZSBtYWNyb3MuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Byb3RvM19saXRlX3VuaXR0ZXN0LmluYz4KKworLy8gTWFrZSBleHRyYWN0IHNjcmlwdCBoYXBweS4KK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfbGl0ZV91bml0dGVzdC5pbmMgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19saXRlX3VuaXR0ZXN0LmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODc4MTYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfbGl0ZV91bml0dGVzdC5pbmMKQEAgLTAsMCArMSwxNDkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKwordXNpbmcgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczsKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHsKKy8vIFdlIHNlbGVjdGl2ZWx5IHNldC9jaGVjayBhIGZldyByZXByZXNlbnRhdGl2ZSBmaWVsZHMgcmF0aGVyIHRoYW4gYWxsIGZpZWxkcworLy8gYXMgdGhpcyB0ZXN0IGlzIG9ubHkgZXhwZWN0ZWQgdG8gY292ZXIgdGhlIGJhc2ljcyBvZiBsaXRlIHN1cHBvcnQuCit2b2lkIFNldEFsbEZpZWxkcyhUZXN0QWxsVHlwZXMqIG0pIHsKKyAgbS0+c2V0X29wdGlvbmFsX2ludDMyKDEwMCk7CisgIG0tPnNldF9vcHRpb25hbF9zdHJpbmcoImFzZGYiKTsKKyAgbS0+c2V0X29wdGlvbmFsX2J5dGVzKCJqa2w7Iik7CisgIG0tPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDQyKTsKKyAgbS0+bXV0YWJsZV9vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoNDMpOworICBtLT5zZXRfb3B0aW9uYWxfbmVzdGVkX2VudW0oVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKKyAgbS0+c2V0X29wdGlvbmFsX2ZvcmVpZ25fZW51bSgKKyAgICAgIFVOSVRURVNUOjpGT1JFSUdOX0JBWik7CisgIG0tPm11dGFibGVfb3B0aW9uYWxfbGF6eV9tZXNzYWdlKCktPnNldF9iYig0NSk7CisgIG0tPm11dGFibGVfb3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UoKS0+c2V0X2JiKDQ2KTsKKyAgbS0+YWRkX3JlcGVhdGVkX2ludDMyKDEwMCk7CisgIG0tPmFkZF9yZXBlYXRlZF9zdHJpbmcoImFzZGYiKTsKKyAgbS0+YWRkX3JlcGVhdGVkX2J5dGVzKCJqa2w7Iik7CisgIG0tPmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoNDYpOworICBtLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKCktPnNldF9jKDQ3KTsKKyAgbS0+YWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBWik7CisgIG0tPmFkZF9yZXBlYXRlZF9mb3JlaWduX2VudW0oCisgICAgICBVTklUVEVTVDo6Rk9SRUlHTl9CQVopOworICBtLT5hZGRfcmVwZWF0ZWRfbGF6eV9tZXNzYWdlKCktPnNldF9iYig0OSk7CisKKyAgbS0+c2V0X29uZW9mX3VpbnQzMigxKTsKKyAgbS0+bXV0YWJsZV9vbmVvZl9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoNTApOworICBtLT5zZXRfb25lb2Zfc3RyaW5nKCJ0ZXN0Iik7ICAvLyBvbmx5IHRoaXMgb25lIHJlbWFpbnMgc2V0Cit9CisKK3ZvaWQgRXhwZWN0QWxsRmllbGRzU2V0KGNvbnN0IFRlc3RBbGxUeXBlcyYgbSkgeworICBFWFBFQ1RfRVEoMTAwLCBtLm9wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoImFzZGYiLCBtLm9wdGlvbmFsX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJqa2w7IiwgbS5vcHRpb25hbF9ieXRlcygpKTsKKyAgRVhQRUNUX0VRKHRydWUsIG0uaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoNDIsIG0ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5iYigpKTsKKyAgRVhQRUNUX0VRKHRydWUsIG0uaGFzX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKDQzLCBtLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpLmMoKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpCQVosIG0ub3B0aW9uYWxfbmVzdGVkX2VudW0oKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rk9SRUlHTl9CQVosCisgICAgICAgICAgICBtLm9wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX0VRKHRydWUsIG0uaGFzX29wdGlvbmFsX2xhenlfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKDQ1LCBtLm9wdGlvbmFsX2xhenlfbWVzc2FnZSgpLmJiKCkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbS5oYXNfb3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSg0NiwgbS5vcHRpb25hbF91bnZlcmlmaWVkX2xhenlfbWVzc2FnZSgpLmJiKCkpOworCisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX2ludDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgxMDAsIG0ucmVwZWF0ZWRfaW50MzIoMCkpOworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9zdHJpbmdfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJhc2RmIiwgbS5yZXBlYXRlZF9zdHJpbmcoMCkpOworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9ieXRlc19zaXplKCkpOworICBFWFBFQ1RfRVEoImprbDsiLCBtLnJlcGVhdGVkX2J5dGVzKDApKTsKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQ2LCBtLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApLmJiKCkpOworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQ3LCBtLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgwKS5jKCkpOworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6QkFaLCBtLnJlcGVhdGVkX25lc3RlZF9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKDEsIG0ucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUoKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rk9SRUlHTl9CQVosCisgICAgICAgICAgICBtLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgwKSk7CisgIEVYUEVDVF9FUSgxLCBtLnJlcGVhdGVkX2xhenlfbWVzc2FnZV9zaXplKCkpOworICBFWFBFQ1RfRVEoNDksIG0ucmVwZWF0ZWRfbGF6eV9tZXNzYWdlKDApLmJiKCkpOworCisgIEVYUEVDVF9FUShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjprT25lb2ZTdHJpbmcsCisgICAgICAgICAgICBtLm9uZW9mX2ZpZWxkX2Nhc2UoKSk7CisgIEVYUEVDVF9FUSgidGVzdCIsIG0ub25lb2Zfc3RyaW5nKCkpOworfQorCisvLyBJbiB0aGlzIGZpbGUgd2Ugb25seSB0ZXN0IHNvbWUgYmFzaWMgZnVuY3Rpb25hbGl0aWVzIG9mIGluIHByb3RvMyBhbmQgZXhwZWN0CisvLyB0aGUgcmVzdCBpcyBmdWxseSB0ZXN0ZWQgaW4gcHJvdG8yIHVuaXR0ZXN0cyBiZWNhdXNlIHByb3RvMyBzaGFyZXMgbW9zdCBjb2RlCisvLyB3aXRoIHByb3RvMi4KKworVEVTVChMSVRFX1RFU1RfTkFNRSwgUGFyc2luZykgeworICBUZXN0QWxsVHlwZXMgb3JpZ2luYWw7CisgIFNldEFsbEZpZWxkcygmb3JpZ2luYWwpOworCisgIFRlc3RBbGxUeXBlcyBtc2c7CisgIG1zZy5QYXJzZUZyb21TdHJpbmcob3JpZ2luYWwuU2VyaWFsaXplQXNTdHJpbmcoKSk7CisgIEV4cGVjdEFsbEZpZWxkc1NldChtc2cpOworfQorCitURVNUKExJVEVfVEVTVF9OQU1FLCBTd2FwKSB7CisgIC8vIFRlc3QgU3dhcCgpLgorICBUZXN0QWxsVHlwZXMgbXNnMTsKKyAgVGVzdEFsbFR5cGVzIG1zZzI7CisgIG1zZzEuc2V0X29wdGlvbmFsX3N0cmluZygiMTIzIik7CisgIG1zZzIuc2V0X29wdGlvbmFsX3N0cmluZygiMzQ1NiIpOworICBtc2cxLlN3YXAoJm1zZzIpOworICBFWFBFQ1RfRVEoIjM0NTYiLCBtc2cxLm9wdGlvbmFsX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCIxMjMiLCBtc2cyLm9wdGlvbmFsX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKG1zZzEuQnl0ZVNpemUoKSwgbXNnMi5CeXRlU2l6ZSgpICsgMSk7Cit9CisKK1RFU1QoTElURV9URVNUX05BTUUsIE9uZW9mSGF6emVycykgeworICBUZXN0QWxsVHlwZXMgbXNnOworICBtc2cuc2V0X29uZW9mX3VpbnQzMigxKTsKKyAgbXNnLnNldF9vbmVvZl9zdHJpbmcoInRlc3QiKTsKKworICBFWFBFQ1RfRVEodHJ1ZSwgbXNnLmhhc19vbmVvZl9zdHJpbmcoKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbXNnLmhhc19vbmVvZl91aW50MzIoKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbXNnLmhhc19vbmVvZl9ieXRlcygpKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtc2cuaGFzX29uZW9mX25lc3RlZF9tZXNzYWdlKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjc1YTQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLmgKQEAgLTAsMCArMSw1NzAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIHRoZSBSZXBlYXRlZEZpZWxkUmVmIGNsYXNzIHRlbXBsYXRlIHVzZWQgdG8gYWNjZXNzCisvLyByZXBlYXRlZCBmaWVsZHMgd2l0aCBwcm90b2J1ZiByZWZsZWN0aW9uIEFQSS4KKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1JFRkxFQ1RJT05fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9SRUZMRUNUSU9OX0hfXworCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV91dGlsLmg+CisKKyNpZmRlZiBTV0lHCisjZXJyb3IgIllvdSBjYW5ub3QgU1dJRyBwcm90byBoZWFkZXJzIgorI2VuZGlmCisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEVuYWJsZSA9IHZvaWQ+CitzdHJ1Y3QgUmVmVHlwZVRyYWl0czsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1JlcGVhdGVkRmllbGRSZWY8VD4gUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRGaWVsZFJlZigKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHJldHVybiBSZXBlYXRlZEZpZWxkUmVmPFQ+KG1lc3NhZ2UsIGZpZWxkKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxUPiBSZWZsZWN0aW9uOjpHZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZigKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHJldHVybiBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxUPihtZXNzYWdlLCBmaWVsZCk7Cit9CisKKy8vIFJlcGVhdGVkRmllbGRSZWYgZGVmaW5pdGlvbiBmb3Igbm9uLW1lc3NhZ2UgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFJlcGVhdGVkRmllbGRSZWY8CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfYmFzZV9vZjxNZXNzYWdlLCBUPjo6dmFsdWU+Ojp0eXBlPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OlJlZlR5cGVUcmFpdHM8VD46Oml0ZXJhdG9yIEl0ZXJhdG9yVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6UmVmVHlwZVRyYWl0czxUPjo6QWNjZXNzb3JUeXBlIEFjY2Vzc29yVHlwZTsKKworIHB1YmxpYzoKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGFjY2Vzc29yXy0+SXNFbXB0eShkYXRhXyk7IH0KKyAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBhY2Nlc3Nvcl8tPlNpemUoZGF0YV8pOyB9CisgIFQgR2V0KGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gYWNjZXNzb3JfLT50ZW1wbGF0ZSBHZXQ8VD4oZGF0YV8sIGluZGV4KTsgfQorCisgIHR5cGVkZWYgSXRlcmF0b3JUeXBlIGl0ZXJhdG9yOworICB0eXBlZGVmIEl0ZXJhdG9yVHlwZSBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgVCYgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IFQmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBpbnQgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihkYXRhXywgYWNjZXNzb3JfLCB0cnVlKTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihkYXRhXywgYWNjZXNzb3JfLCBmYWxzZSk7IH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBSZWZsZWN0aW9uOworICBSZXBlYXRlZEZpZWxkUmVmKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgICAgZGF0YV8gPSByZWZsZWN0aW9uLT5SZXBlYXRlZEZpZWxkRGF0YShjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZSksIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlJlZlR5cGVUcmFpdHM8VD46OmNwcF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgYWNjZXNzb3JfID0gcmVmbGVjdGlvbi0+UmVwZWF0ZWRGaWVsZEFjY2Vzc29yKGZpZWxkKTsKKyAgfQorCisgIGNvbnN0IHZvaWQqIGRhdGFfOworICBjb25zdCBBY2Nlc3NvclR5cGUqIGFjY2Vzc29yXzsKK307CisKKy8vIE11dGFibGVSZXBlYXRlZEZpZWxkUmVmIGRlZmluaXRpb24gZm9yIG5vbi1tZXNzYWdlIHR5cGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjwKKyAgICBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19iYXNlX29mPE1lc3NhZ2UsIFQ+Ojp2YWx1ZT46OnR5cGU+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6UmVmVHlwZVRyYWl0czxUPjo6QWNjZXNzb3JUeXBlIEFjY2Vzc29yVHlwZTsKKworIHB1YmxpYzoKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGFjY2Vzc29yXy0+SXNFbXB0eShkYXRhXyk7IH0KKyAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBhY2Nlc3Nvcl8tPlNpemUoZGF0YV8pOyB9CisgIFQgR2V0KGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gYWNjZXNzb3JfLT50ZW1wbGF0ZSBHZXQ8VD4oZGF0YV8sIGluZGV4KTsgfQorCisgIHZvaWQgU2V0KGludCBpbmRleCwgY29uc3QgVCYgdmFsdWUpIGNvbnN0IHsKKyAgICBhY2Nlc3Nvcl8tPnRlbXBsYXRlIFNldDxUPihkYXRhXywgaW5kZXgsIHZhbHVlKTsKKyAgfQorICB2b2lkIEFkZChjb25zdCBUJiB2YWx1ZSkgY29uc3QgeyBhY2Nlc3Nvcl8tPnRlbXBsYXRlIEFkZDxUPihkYXRhXywgdmFsdWUpOyB9CisgIHZvaWQgUmVtb3ZlTGFzdCgpIGNvbnN0IHsgYWNjZXNzb3JfLT5SZW1vdmVMYXN0KGRhdGFfKTsgfQorICB2b2lkIFN3YXBFbGVtZW50cyhpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKSBjb25zdCB7CisgICAgYWNjZXNzb3JfLT5Td2FwRWxlbWVudHMoZGF0YV8sIGluZGV4MSwgaW5kZXgyKTsKKyAgfQorICB2b2lkIENsZWFyKCkgY29uc3QgeyBhY2Nlc3Nvcl8tPkNsZWFyKGRhdGFfKTsgfQorCisgIHZvaWQgU3dhcChjb25zdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZiYgb3RoZXIpIGNvbnN0IHsKKyAgICBhY2Nlc3Nvcl8tPlN3YXAoZGF0YV8sIG90aGVyLmFjY2Vzc29yXywgb3RoZXIuZGF0YV8pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIGNvbnN0IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgSXRlcmF0b3I7CisgICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbnRhaW5lci5iZWdpbigpOyBpdCAhPSBjb250YWluZXIuZW5kKCk7ICsraXQpIHsKKyAgICAgIEFkZCgqaXQpOworICAgIH0KKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorICB2b2lkIENvcHlGcm9tKGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKSBjb25zdCB7CisgICAgQ2xlYXIoKTsKKyAgICBNZXJnZUZyb20oY29udGFpbmVyKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFJlZmxlY3Rpb247CisgIE11dGFibGVSZXBlYXRlZEZpZWxkUmVmKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICAgIGRhdGFfID0gcmVmbGVjdGlvbi0+UmVwZWF0ZWRGaWVsZERhdGEoCisgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBpbnRlcm5hbDo6UmVmVHlwZVRyYWl0czxUPjo6Y3BwX3R5cGUsIG51bGxwdHIpOworICAgIGFjY2Vzc29yXyA9IHJlZmxlY3Rpb24tPlJlcGVhdGVkRmllbGRBY2Nlc3NvcihmaWVsZCk7CisgIH0KKworICB2b2lkKiBkYXRhXzsKKyAgY29uc3QgQWNjZXNzb3JUeXBlKiBhY2Nlc3Nvcl87Cit9OworCisvLyBSZXBlYXRlZEZpZWxkUmVmIGRlZmluaXRpb24gZm9yIG1lc3NhZ2UgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFJlcGVhdGVkRmllbGRSZWY8CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mPE1lc3NhZ2UsIFQ+Ojp2YWx1ZT46OnR5cGU+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6UmVmVHlwZVRyYWl0czxUPjo6aXRlcmF0b3IgSXRlcmF0b3JUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpSZWZUeXBlVHJhaXRzPFQ+OjpBY2Nlc3NvclR5cGUgQWNjZXNzb3JUeXBlOworCisgcHVibGljOgorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gYWNjZXNzb3JfLT5Jc0VtcHR5KGRhdGFfKTsgfQorICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGFjY2Vzc29yXy0+U2l6ZShkYXRhXyk7IH0KKyAgLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBtZXNzYWdlIG9iamVjdCBpZiBpdAorICAvLyBleGlzdHMuIElmIGEgbWVzc2FnZSBvYmplY3QgZG9lc24ndCBleGlzdCAoZS5nLiwgZGF0YSBzdG9yZWQgaW4gc2VyaWFsaXplZAorICAvLyBmb3JtKSwgc2NyYXRjaF9zcGFjZSB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBkYXRhIGFuZCBhIHJlZmVyZW5jZSB0byBpdAorICAvLyB3aWxsIGJlIHJldHVybmVkLgorICAvLworICAvLyBFeGFtcGxlOgorICAvLyAgIFJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT4gaCA9IC4uLgorICAvLyAgIHVuaXF1ZV9wdHI8TWVzc2FnZT4gc2NyYXRjaF9zcGFjZShoLk5ld01lc3NhZ2UoKSk7CisgIC8vICAgY29uc3QgTWVzc2FnZSYgaXRlbSA9IGguR2V0KGluZGV4LCBzY3JhdGNoX3NwYWNlLmdldCgpKTsKKyAgY29uc3QgVCYgR2V0KGludCBpbmRleCwgVCogc2NyYXRjaF9zcGFjZSkgY29uc3QgeworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgVCo+KGFjY2Vzc29yXy0+R2V0KGRhdGFfLCBpbmRleCwgc2NyYXRjaF9zcGFjZSkpOworICB9CisgIC8vIENyZWF0ZSBhIG5ldyBtZXNzYWdlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG1lc3NhZ2VzIHN0b3JlZCBpbiB0aGlzCisgIC8vIHJlcGVhdGVkIGZpZWxkLiBDYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCBvYmplY3QuCisgIFQqIE5ld01lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxUKj4oZGVmYXVsdF9pbnN0YW5jZV8tPk5ldygpKTsgfQorCisgIHR5cGVkZWYgSXRlcmF0b3JUeXBlIGl0ZXJhdG9yOworICB0eXBlZGVmIEl0ZXJhdG9yVHlwZSBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgVCYgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IFQmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiBpbnQgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGl0ZXJhdG9yKGRhdGFfLCBhY2Nlc3Nvcl8sIHRydWUsIE5ld01lc3NhZ2UoKSk7CisgIH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgIC8vIFRoZSBlbmQgaXRlcmF0b3IgbXVzdCBub3QgYmUgZGVyZWZlcmVuY2VkLCBubyBuZWVkIGZvciBzY3JhdGNoIHNwYWNlLgorICAgIHJldHVybiBpdGVyYXRvcihkYXRhXywgYWNjZXNzb3JfLCBmYWxzZSwgbnVsbHB0cik7CisgIH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBSZWZsZWN0aW9uOworICBSZXBlYXRlZEZpZWxkUmVmKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgICAgZGF0YV8gPSByZWZsZWN0aW9uLT5SZXBlYXRlZEZpZWxkRGF0YSgKKyAgICAgICAgY29uc3RfY2FzdDxNZXNzYWdlKj4oJm1lc3NhZ2UpLCBmaWVsZCwKKyAgICAgICAgaW50ZXJuYWw6OlJlZlR5cGVUcmFpdHM8VD46OmNwcF90eXBlLAorICAgICAgICBpbnRlcm5hbDo6UmVmVHlwZVRyYWl0czxUPjo6R2V0TWVzc2FnZUZpZWxkRGVzY3JpcHRvcigpKTsKKyAgICBhY2Nlc3Nvcl8gPSByZWZsZWN0aW9uLT5SZXBlYXRlZEZpZWxkQWNjZXNzb3IoZmllbGQpOworICAgIGRlZmF1bHRfaW5zdGFuY2VfID0KKyAgICAgICAgcmVmbGVjdGlvbi0+R2V0TWVzc2FnZUZhY3RvcnkoKS0+R2V0UHJvdG90eXBlKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSk7CisgIH0KKworICBjb25zdCB2b2lkKiBkYXRhXzsKKyAgY29uc3QgQWNjZXNzb3JUeXBlKiBhY2Nlc3Nvcl87CisgIGNvbnN0IE1lc3NhZ2UqIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKworLy8gTXV0YWJsZVJlcGVhdGVkRmllbGRSZWYgZGVmaW5pdGlvbiBmb3IgbWVzc2FnZSB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgTXV0YWJsZVJlcGVhdGVkRmllbGRSZWY8CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mPE1lc3NhZ2UsIFQ+Ojp2YWx1ZT46OnR5cGU+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6UmVmVHlwZVRyYWl0czxUPjo6QWNjZXNzb3JUeXBlIEFjY2Vzc29yVHlwZTsKKworIHB1YmxpYzoKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGFjY2Vzc29yXy0+SXNFbXB0eShkYXRhXyk7IH0KKyAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBhY2Nlc3Nvcl8tPlNpemUoZGF0YV8pOyB9CisgIC8vIFNlZSBjb21tZW50cyBmb3IgUmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPjo6R2V0KCkKKyAgY29uc3QgVCYgR2V0KGludCBpbmRleCwgVCogc2NyYXRjaF9zcGFjZSkgY29uc3QgeworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgVCo+KGFjY2Vzc29yXy0+R2V0KGRhdGFfLCBpbmRleCwgc2NyYXRjaF9zcGFjZSkpOworICB9CisgIC8vIENyZWF0ZSBhIG5ldyBtZXNzYWdlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG1lc3NhZ2VzIHN0b3JlZCBpbiB0aGlzCisgIC8vIHJlcGVhdGVkIGZpZWxkLiBDYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCBvYmplY3QuCisgIFQqIE5ld01lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxUKj4oZGVmYXVsdF9pbnN0YW5jZV8tPk5ldygpKTsgfQorCisgIHZvaWQgU2V0KGludCBpbmRleCwgY29uc3QgVCYgdmFsdWUpIGNvbnN0IHsKKyAgICBhY2Nlc3Nvcl8tPlNldChkYXRhXywgaW5kZXgsICZ2YWx1ZSk7CisgIH0KKyAgdm9pZCBBZGQoY29uc3QgVCYgdmFsdWUpIGNvbnN0IHsgYWNjZXNzb3JfLT5BZGQoZGF0YV8sICZ2YWx1ZSk7IH0KKyAgdm9pZCBSZW1vdmVMYXN0KCkgY29uc3QgeyBhY2Nlc3Nvcl8tPlJlbW92ZUxhc3QoZGF0YV8pOyB9CisgIHZvaWQgU3dhcEVsZW1lbnRzKGludCBpbmRleDEsIGludCBpbmRleDIpIGNvbnN0IHsKKyAgICBhY2Nlc3Nvcl8tPlN3YXBFbGVtZW50cyhkYXRhXywgaW5kZXgxLCBpbmRleDIpOworICB9CisgIHZvaWQgQ2xlYXIoKSBjb25zdCB7IGFjY2Vzc29yXy0+Q2xlYXIoZGF0YV8pOyB9CisKKyAgdm9pZCBTd2FwKGNvbnN0IE11dGFibGVSZXBlYXRlZEZpZWxkUmVmJiBvdGhlcikgY29uc3QgeworICAgIGFjY2Vzc29yXy0+U3dhcChkYXRhXywgb3RoZXIuYWNjZXNzb3JfLCBvdGhlci5kYXRhXyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorICB2b2lkIE1lcmdlRnJvbShjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikgY29uc3QgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBJdGVyYXRvcjsKKyAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29udGFpbmVyLmJlZ2luKCk7IGl0ICE9IGNvbnRhaW5lci5lbmQoKTsgKytpdCkgeworICAgICAgQWRkKCppdCk7CisgICAgfQorICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CisgIHZvaWQgQ29weUZyb20oY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIGNvbnN0IHsKKyAgICBDbGVhcigpOworICAgIE1lcmdlRnJvbShjb250YWluZXIpOworICB9CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgUmVmbGVjdGlvbjsKKyAgTXV0YWJsZVJlcGVhdGVkRmllbGRSZWYoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgICAgZGF0YV8gPSByZWZsZWN0aW9uLT5SZXBlYXRlZEZpZWxkRGF0YSgKKyAgICAgICAgbWVzc2FnZSwgZmllbGQsIGludGVybmFsOjpSZWZUeXBlVHJhaXRzPFQ+OjpjcHBfdHlwZSwKKyAgICAgICAgaW50ZXJuYWw6OlJlZlR5cGVUcmFpdHM8VD46OkdldE1lc3NhZ2VGaWVsZERlc2NyaXB0b3IoKSk7CisgICAgYWNjZXNzb3JfID0gcmVmbGVjdGlvbi0+UmVwZWF0ZWRGaWVsZEFjY2Vzc29yKGZpZWxkKTsKKyAgICBkZWZhdWx0X2luc3RhbmNlXyA9CisgICAgICAgIHJlZmxlY3Rpb24tPkdldE1lc3NhZ2VGYWN0b3J5KCktPkdldFByb3RvdHlwZShmaWVsZC0+bWVzc2FnZV90eXBlKCkpOworICB9CisKKyAgdm9pZCogZGF0YV87CisgIGNvbnN0IEFjY2Vzc29yVHlwZSogYWNjZXNzb3JfOworICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisvLyBJbnRlcmZhY2VzIHVzZWQgdG8gaW1wbGVtZW50IHJlZmxlY3Rpb24gUmVwZWF0ZWRGaWVsZFJlZiBBUEkuCisvLyBSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZEFjY2Vzc29yKCkgc2hvdWxkIHJldHVybiBhIHBvaW50ZXIgdG8gYW4gc2luZ2xldG9uCisvLyBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBiZWxvdyBpbnRlcmZhY2UuCisvLworLy8gVGhpcyBpbnRlcmZhY2UgcGFzc2VzL3JldHVybnMgdmFsdWVzIHVzaW5nIHZvaWQgcG9pbnRlcnMuIFRoZSBhY3R1YWwgdHlwZQorLy8gb2YgdGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlIGZpZWxkJ3MgY3BwX3R5cGUuIEZvbGxvd2luZyBpcyBhIG1hcHBpbmcgZnJvbQorLy8gY3BwX3R5cGUgdG8gdGhlIHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiB0aGlzIGludGVyZmFjZToKKy8vCisvLyAgIGZpZWxkLT5jcHBfdHlwZSgpICAgICAgVCAgICAgICAgICAgICAgICBBY3R1YWwgdHlwZSBvZiB2b2lkKgorLy8gICBDUFBUWVBFX0lOVDMyICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBpbnQzMl90CisvLyAgIENQUFRZUEVfVUlOVDMyICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIHVpbnQzMl90CisvLyAgIENQUFRZUEVfSU5UNjQgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIGludDY0X3QKKy8vICAgQ1BQVFlQRV9VSU5UNjQgICAgICAgdWludDY0X3QgICAgICAgICAgICAgICAgdWludDY0X3QKKy8vICAgQ1BQVFlQRV9ET1VCTEUgICAgICAgZG91YmxlICAgICAgICAgICAgICAgICAgZG91YmxlCisvLyAgIENQUFRZUEVfRkxPQVQgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIGZsb2F0CisvLyAgIENQUFRZUEVfQk9PTCAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGJvb2wKKy8vICAgQ1BQVFlQRV9FTlVNICAgICAgICAgZ2VuZXJhdGVkIGVudW0gdHlwZSAgICAgaW50MzJfdAorLy8gICBDUFBUWVBFX1NUUklORyAgICAgICBzdHJpbmcgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZworLy8gICBDUFBUWVBFX01FU1NBR0UgICAgICBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlCisvLyAgICAgICAgICAgICAgICAgICAgICAgIG9yIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UKKy8vCisvLyBOb3RlIHRoYXQgZm9yIGVudW1zIHdlIHVzZSBpbnQzMl90IGluIHRoZSBpbnRlcmZhY2UuCisvLworLy8gWW91IGNhbiBtYXAgZnJvbSBUIHRvIHRoZSBhY3R1YWwgdHlwZSB1c2luZyBSZWZUeXBlVHJhaXRzOgorLy8gICB0eXBlZGVmIFJlZlR5cGVUcmFpdHM8VD46OkFjY2Vzc29yVmFsdWVUeXBlIEFjdHVhbFR5cGU7CitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgUmVwZWF0ZWRGaWVsZEFjY2Vzc29yIHsKKyBwdWJsaWM6CisgIC8vIFR5cGVkZWZzIGZvciBjbGFyaXR5LgorICB0eXBlZGVmIHZvaWQgRmllbGQ7CisgIHR5cGVkZWYgdm9pZCBWYWx1ZTsKKyAgdHlwZWRlZiB2b2lkIEl0ZXJhdG9yOworCisgIHZpcnR1YWwgYm9vbCBJc0VtcHR5KGNvbnN0IEZpZWxkKiBkYXRhKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50IFNpemUoY29uc3QgRmllbGQqIGRhdGEpIGNvbnN0ID0gMDsKKyAgLy8gRGVwZW5kcyBvbiB0aGUgdW5kZXJseWluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVwZWF0ZWQgZmllbGQsIHRoaXMKKyAgLy8gbWV0aG9kIGNhbiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIG9iamVjdCBpZiBzdWNoIGFuIG9iamVjdAorICAvLyBleGlzdHMsIG9yIGZpbGwgdGhlIGRhdGEgaW50byBzY3JhdGNoX3NwYWNlIGFuZCByZXR1cm4gc2NyYXRjaF9zcGFjZS4KKyAgLy8gQ2FsbGVycyBvZiB0aGlzIG1ldGhvZCBtdXN0IGVuc3VyZSBzY3JhdGNoX3NwYWNlIGlzIGEgdmFsaWQgcG9pbnRlcgorICAvLyB0byBhIG11dGFibGUgb2JqZWN0IG9mIHRoZSBjb3JyZWN0IHR5cGUuCisgIHZpcnR1YWwgY29uc3QgVmFsdWUqIEdldChjb25zdCBGaWVsZCogZGF0YSwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUqIHNjcmF0Y2hfc3BhY2UpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHZvaWQgQ2xlYXIoRmllbGQqIGRhdGEpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldChGaWVsZCogZGF0YSwgaW50IGluZGV4LCBjb25zdCBWYWx1ZSogdmFsdWUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEFkZChGaWVsZCogZGF0YSwgY29uc3QgVmFsdWUqIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBSZW1vdmVMYXN0KEZpZWxkKiBkYXRhKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTd2FwRWxlbWVudHMoRmllbGQqIGRhdGEsIGludCBpbmRleDEsIGludCBpbmRleDIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIFN3YXAoRmllbGQqIGRhdGEsIGNvbnN0IFJlcGVhdGVkRmllbGRBY2Nlc3Nvciogb3RoZXJfbXV0YXRvciwKKyAgICAgICAgICAgICAgICAgICAgRmllbGQqIG90aGVyX2RhdGEpIGNvbnN0ID0gMDsKKworICAvLyBDcmVhdGUgYW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVwZWF0ZWQgZmllbGQuCisgIHZpcnR1YWwgSXRlcmF0b3IqIEJlZ2luSXRlcmF0b3IoY29uc3QgRmllbGQqIGRhdGEpIGNvbnN0ID0gMDsKKyAgLy8gQ3JlYXRlIGFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIGF0IHRoZSBlbmQgb2YgdGhlIHJlcGVhdGVkIGZpZWxkLgorICB2aXJ0dWFsIEl0ZXJhdG9yKiBFbmRJdGVyYXRvcihjb25zdCBGaWVsZCogZGF0YSkgY29uc3QgPSAwOworICAvLyBNYWtlIGEgY29weSBvZiBhbiBpdGVyYXRvciBhbmQgcmV0dXJuIHRoZSBuZXcgY29weS4KKyAgdmlydHVhbCBJdGVyYXRvciogQ29weUl0ZXJhdG9yKGNvbnN0IEZpZWxkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSXRlcmF0b3IqIGl0ZXJhdG9yKSBjb25zdCA9IDA7CisgIC8vIE1vdmUgYW4gaXRlcmF0b3IgdG8gcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudC4KKyAgdmlydHVhbCBJdGVyYXRvciogQWR2YW5jZUl0ZXJhdG9yKGNvbnN0IEZpZWxkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IqIGl0ZXJhdG9yKSBjb25zdCA9IDA7CisgIC8vIENvbXBhcmUgd2hldGhlciB0d28gaXRlcmF0b3JzIHBvaW50IHRvIHRoZSBzYW1lIGVsZW1lbnQuCisgIHZpcnR1YWwgYm9vbCBFcXVhbHNJdGVyYXRvcihjb25zdCBGaWVsZCogZGF0YSwgY29uc3QgSXRlcmF0b3IqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJdGVyYXRvciogYikgY29uc3QgPSAwOworICAvLyBEZWxldGUgYW4gaXRlcmF0b3IgY3JlYXRlZCBieSBCZWdpbkl0ZXJhdG9yKCksIEVuZEl0ZXJhdG9yKCkgYW5kCisgIC8vIENvcHlJdGVyYXRvcigpLgorICB2aXJ0dWFsIHZvaWQgRGVsZXRlSXRlcmF0b3IoY29uc3QgRmllbGQqIGRhdGEsIEl0ZXJhdG9yKiBpdGVyYXRvcikgY29uc3QgPSAwOworICAvLyBMaWtlIEdldCgpIGJ1dCBmb3IgaXRlcmF0b3JzLgorICB2aXJ0dWFsIGNvbnN0IFZhbHVlKiBHZXRJdGVyYXRvclZhbHVlKGNvbnN0IEZpZWxkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEl0ZXJhdG9yKiBpdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSogc2NyYXRjaF9zcGFjZSkgY29uc3QgPSAwOworCisgIC8vIFRlbXBsYXRlZCBtZXRob2RzIHRoYXQgbWFrZSB1c2luZyB0aGlzIGludGVyZmFjZSBlYXNpZXIgZm9yIG5vbi1tZXNzYWdlCisgIC8vIHR5cGVzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgVCBHZXQoY29uc3QgRmllbGQqIGRhdGEsIGludCBpbmRleCkgY29uc3QgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgUmVmVHlwZVRyYWl0czxUPjo6QWNjZXNzb3JWYWx1ZVR5cGUgQWN0dWFsVHlwZTsKKyAgICBBY3R1YWxUeXBlIHNjcmF0Y2hfc3BhY2U7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQ+KCpyZWludGVycHJldF9jYXN0PGNvbnN0IEFjdHVhbFR5cGUqPigKKyAgICAgICAgR2V0KGRhdGEsIGluZGV4LCBzdGF0aWNfY2FzdDxWYWx1ZSo+KCZzY3JhdGNoX3NwYWNlKSkpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBWYWx1ZVR5cGU+CisgIHZvaWQgU2V0KEZpZWxkKiBkYXRhLCBpbnQgaW5kZXgsIGNvbnN0IFZhbHVlVHlwZSYgdmFsdWUpIGNvbnN0IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJlZlR5cGVUcmFpdHM8VD46OkFjY2Vzc29yVmFsdWVUeXBlIEFjdHVhbFR5cGU7CisgICAgLy8gSW4gdGhpcyBSZXBlYXRlZEZpZWxkQWNjZXNzb3IgaW50ZXJmYWNlIHdlIHBhc3MvcmV0dXJuIGRhdGEgdXNpbmcKKyAgICAvLyByYXcgcG9pbnRlcnMuIFR5cGUgb2YgdGhlIGRhdGEgdGhlc2UgcmF3IHBvaW50ZXJzIHBvaW50IHRvIHNob3VsZAorICAgIC8vIGJlIEFjdHVhbFR5cGUuIEhlcmUgd2UgaGF2ZSBhIFZhbHVlVHlwZSBvYmplY3QgYW5kIHdhbnQgYSBBY3R1YWxUeXBlCisgICAgLy8gcG9pbnRlci4gV2UgY2FuJ3QgY2FzdCBhIFZhbHVlVHlwZSBwb2ludGVyIHRvIGFuIEFjdHVhbFR5cGUgcG9pbnRlcgorICAgIC8vIGRpcmVjdGx5IGJlY2F1c2UgdGhlaXIgdHlwZSBtaWdodCBiZSBkaWZmZXJlbnQgKGZvciBlbnVtcyBWYWx1ZVR5cGUKKyAgICAvLyBtYXkgYmUgYSBnZW5lcmF0ZWQgZW51bSB0eXBlIHdoaWxlIEFjdHVhbFR5cGUgaXMgaW50MzJfdCkuIFRvIGJlIHNhZmUKKyAgICAvLyB3ZSBtYWtlIGEgY29weSB0byBnZXQgYSB0ZW1wb3JhcnkgQWN0dWFsVHlwZSBvYmplY3QgYW5kIHVzZSBpdC4KKyAgICBBY3R1YWxUeXBlIHRtcCA9IHN0YXRpY19jYXN0PEFjdHVhbFR5cGU+KHZhbHVlKTsKKyAgICBTZXQoZGF0YSwgaW5kZXgsIHN0YXRpY19jYXN0PGNvbnN0IFZhbHVlKj4oJnRtcCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFZhbHVlVHlwZT4KKyAgdm9pZCBBZGQoRmllbGQqIGRhdGEsIGNvbnN0IFZhbHVlVHlwZSYgdmFsdWUpIGNvbnN0IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJlZlR5cGVUcmFpdHM8VD46OkFjY2Vzc29yVmFsdWVUeXBlIEFjdHVhbFR5cGU7CisgICAgLy8gSW4gdGhpcyBSZXBlYXRlZEZpZWxkQWNjZXNzb3IgaW50ZXJmYWNlIHdlIHBhc3MvcmV0dXJuIGRhdGEgdXNpbmcKKyAgICAvLyByYXcgcG9pbnRlcnMuIFR5cGUgb2YgdGhlIGRhdGEgdGhlc2UgcmF3IHBvaW50ZXJzIHBvaW50IHRvIHNob3VsZAorICAgIC8vIGJlIEFjdHVhbFR5cGUuIEhlcmUgd2UgaGF2ZSBhIFZhbHVlVHlwZSBvYmplY3QgYW5kIHdhbnQgYSBBY3R1YWxUeXBlCisgICAgLy8gcG9pbnRlci4gV2UgY2FuJ3QgY2FzdCBhIFZhbHVlVHlwZSBwb2ludGVyIHRvIGFuIEFjdHVhbFR5cGUgcG9pbnRlcgorICAgIC8vIGRpcmVjdGx5IGJlY2F1c2UgdGhlaXIgdHlwZSBtaWdodCBiZSBkaWZmZXJlbnQgKGZvciBlbnVtcyBWYWx1ZVR5cGUKKyAgICAvLyBtYXkgYmUgYSBnZW5lcmF0ZWQgZW51bSB0eXBlIHdoaWxlIEFjdHVhbFR5cGUgaXMgaW50MzJfdCkuIFRvIGJlIHNhZmUKKyAgICAvLyB3ZSBtYWtlIGEgY29weSB0byBnZXQgYSB0ZW1wb3JhcnkgQWN0dWFsVHlwZSBvYmplY3QgYW5kIHVzZSBpdC4KKyAgICBBY3R1YWxUeXBlIHRtcCA9IHN0YXRpY19jYXN0PEFjdHVhbFR5cGU+KHZhbHVlKTsKKyAgICBBZGQoZGF0YSwgc3RhdGljX2Nhc3Q8Y29uc3QgVmFsdWUqPigmdG1wKSk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgLy8gV2Ugd2FudCB0aGUgZGVzdHJ1Y3RvciB0byBiZSBjb21wbGV0ZWx5IHRyaXZpYWwgYXMgdG8gYWxsb3cgaXQgdG8gYmUKKyAgLy8gYSBmdW5jdGlvbiBsb2NhbCBzdGF0aWMuIEhlbmNlIHdlIG1ha2UgaXQgbm9uLXZpcnR1YWwgYW5kIHByb3RlY3RlZCwKKyAgLy8gdGhpcyBjbGFzcyBvbmx5IGxpdmUgYXMgcGFydCBvZiBhIGdsb2JhbCBzaW5nbGV0b24gYW5kIHNob3VsZCBub3QgYmUKKyAgLy8gZGVsZXRlZC4KKyAgflJlcGVhdGVkRmllbGRBY2Nlc3NvcigpID0gZGVmYXVsdDsKK307CisKKy8vIEltcGxlbWVudCAoTXV0YWJsZSlSZXBlYXRlZEZpZWxkUmVmOjppdGVyYXRvcgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBSZXBlYXRlZEZpZWxkUmVmSXRlcmF0b3IgeworICB0eXBlZGVmIHR5cGVuYW1lIFJlZlR5cGVUcmFpdHM8VD46OkFjY2Vzc29yVmFsdWVUeXBlIEFjY2Vzc29yVmFsdWVUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFJlZlR5cGVUcmFpdHM8VD46Okl0ZXJhdG9yVmFsdWVUeXBlIEl0ZXJhdG9yVmFsdWVUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFJlZlR5cGVUcmFpdHM8VD46Okl0ZXJhdG9yUG9pbnRlclR5cGUgSXRlcmF0b3JQb2ludGVyVHlwZTsKKworIHB1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworICB1c2luZyB2YWx1ZV90eXBlID0gVDsKKyAgdXNpbmcgcG9pbnRlciA9IFQqOworICB1c2luZyByZWZlcmVuY2UgPSBUJjsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisKKyAgLy8gQ29uc3RydWN0b3IgZm9yIG5vbi1tZXNzYWdlIGZpZWxkcy4KKyAgUmVwZWF0ZWRGaWVsZFJlZkl0ZXJhdG9yKGNvbnN0IHZvaWQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXBlYXRlZEZpZWxkQWNjZXNzb3IqIGFjY2Vzc29yLCBib29sIGJlZ2luKQorICAgICAgOiBkYXRhXyhkYXRhKSwKKyAgICAgICAgYWNjZXNzb3JfKGFjY2Vzc29yKSwKKyAgICAgICAgaXRlcmF0b3JfKGJlZ2luID8gYWNjZXNzb3ItPkJlZ2luSXRlcmF0b3IoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogYWNjZXNzb3ItPkVuZEl0ZXJhdG9yKGRhdGEpKSwKKyAgICAgICAgLy8gVGhlIGVuZCBpdGVyYXRvciBtdXN0IG5vdCBiZSBkZXJlZmVyZW5jZWQsIG5vIG5lZWQgZm9yIHNjcmF0Y2ggc3BhY2UuCisgICAgICAgIHNjcmF0Y2hfc3BhY2VfKGJlZ2luID8gbmV3IEFjY2Vzc29yVmFsdWVUeXBlIDogbnVsbHB0cikge30KKyAgLy8gQ29uc3RydWN0b3IgZm9yIG1lc3NhZ2UgZmllbGRzLgorICBSZXBlYXRlZEZpZWxkUmVmSXRlcmF0b3IoY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlcGVhdGVkRmllbGRBY2Nlc3NvciogYWNjZXNzb3IsIGJvb2wgYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NvclZhbHVlVHlwZSogc2NyYXRjaF9zcGFjZSkKKyAgICAgIDogZGF0YV8oZGF0YSksCisgICAgICAgIGFjY2Vzc29yXyhhY2Nlc3NvciksCisgICAgICAgIGl0ZXJhdG9yXyhiZWdpbiA/IGFjY2Vzc29yLT5CZWdpbkl0ZXJhdG9yKGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICA6IGFjY2Vzc29yLT5FbmRJdGVyYXRvcihkYXRhKSksCisgICAgICAgIHNjcmF0Y2hfc3BhY2VfKHNjcmF0Y2hfc3BhY2UpIHt9CisgIH5SZXBlYXRlZEZpZWxkUmVmSXRlcmF0b3IoKSB7IGFjY2Vzc29yXy0+RGVsZXRlSXRlcmF0b3IoZGF0YV8sIGl0ZXJhdG9yXyk7IH0KKyAgUmVwZWF0ZWRGaWVsZFJlZkl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgUmVwZWF0ZWRGaWVsZFJlZkl0ZXJhdG9yIHRtcCgqdGhpcyk7CisgICAgaXRlcmF0b3JfID0gYWNjZXNzb3JfLT5BZHZhbmNlSXRlcmF0b3IoZGF0YV8sIGl0ZXJhdG9yXyk7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorICBSZXBlYXRlZEZpZWxkUmVmSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgaXRlcmF0b3JfID0gYWNjZXNzb3JfLT5BZHZhbmNlSXRlcmF0b3IoZGF0YV8sIGl0ZXJhdG9yXyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEl0ZXJhdG9yVmFsdWVUeXBlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SXRlcmF0b3JWYWx1ZVR5cGU+KAorICAgICAgICAqc3RhdGljX2Nhc3Q8Y29uc3QgQWNjZXNzb3JWYWx1ZVR5cGUqPihhY2Nlc3Nvcl8tPkdldEl0ZXJhdG9yVmFsdWUoCisgICAgICAgICAgICBkYXRhXywgaXRlcmF0b3JfLCBzY3JhdGNoX3NwYWNlXy5nZXQoKSkpKTsKKyAgfQorICBJdGVyYXRvclBvaW50ZXJUeXBlIG9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEl0ZXJhdG9yUG9pbnRlclR5cGU+KAorICAgICAgICBhY2Nlc3Nvcl8tPkdldEl0ZXJhdG9yVmFsdWUoZGF0YV8sIGl0ZXJhdG9yXywgc2NyYXRjaF9zcGFjZV8uZ2V0KCkpKTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgUmVwZWF0ZWRGaWVsZFJlZkl0ZXJhdG9yJiBvdGhlcikgY29uc3QgeworICAgIGFzc2VydChkYXRhXyA9PSBvdGhlci5kYXRhXyk7CisgICAgYXNzZXJ0KGFjY2Vzc29yXyA9PSBvdGhlci5hY2Nlc3Nvcl8pOworICAgIHJldHVybiAhYWNjZXNzb3JfLT5FcXVhbHNJdGVyYXRvcihkYXRhXywgaXRlcmF0b3JfLCBvdGhlci5pdGVyYXRvcl8pOworICB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZXBlYXRlZEZpZWxkUmVmSXRlcmF0b3ImIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICF0aGlzLT5vcGVyYXRvciE9KG90aGVyKTsKKyAgfQorCisgIFJlcGVhdGVkRmllbGRSZWZJdGVyYXRvcihjb25zdCBSZXBlYXRlZEZpZWxkUmVmSXRlcmF0b3ImIG90aGVyKQorICAgICAgOiBkYXRhXyhvdGhlci5kYXRhXyksCisgICAgICAgIGFjY2Vzc29yXyhvdGhlci5hY2Nlc3Nvcl8pLAorICAgICAgICBpdGVyYXRvcl8oYWNjZXNzb3JfLT5Db3B5SXRlcmF0b3IoZGF0YV8sIG90aGVyLml0ZXJhdG9yXykpIHt9CisgIFJlcGVhdGVkRmllbGRSZWZJdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IFJlcGVhdGVkRmllbGRSZWZJdGVyYXRvciYgb3RoZXIpIHsKKyAgICBpZiAodGhpcyAhPSAmb3RoZXIpIHsKKyAgICAgIGFjY2Vzc29yXy0+RGVsZXRlSXRlcmF0b3IoZGF0YV8sIGl0ZXJhdG9yXyk7CisgICAgICBkYXRhXyA9IG90aGVyLmRhdGFfOworICAgICAgYWNjZXNzb3JfID0gb3RoZXIuYWNjZXNzb3JfOworICAgICAgaXRlcmF0b3JfID0gYWNjZXNzb3JfLT5Db3B5SXRlcmF0b3IoZGF0YV8sIG90aGVyLml0ZXJhdG9yXyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgcHJvdGVjdGVkOgorICBjb25zdCB2b2lkKiBkYXRhXzsKKyAgY29uc3QgUmVwZWF0ZWRGaWVsZEFjY2Vzc29yKiBhY2Nlc3Nvcl87CisgIHZvaWQqIGl0ZXJhdG9yXzsKKyAgc3RkOjp1bmlxdWVfcHRyPEFjY2Vzc29yVmFsdWVUeXBlPiBzY3JhdGNoX3NwYWNlXzsKK307CisKKy8vIFR5cGVUcmFpdHMgdGhhdCBtYXBzIHRoZSB0eXBlIHBhcmFtZXRlciBUIG9mIFJlcGVhdGVkRmllbGRSZWYgb3IKKy8vIE11dGFibGVSZXBlYXRlZEZpZWxkUmVmIHRvIGNvcnJlc3BvbmRpbmcgaXRlcmF0b3IgdHlwZSwKKy8vIFJlcGVhdGVkRmllbGRBY2Nlc3NvciB0eXBlLCBldGMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBQcmltaXRpdmVUcmFpdHMgeworICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfcHJpbWl0aXZlID0gZmFsc2U7Cit9OworI2RlZmluZSBERUZJTkVfUFJJTUlUSVZFKFRZUEUsIHR5cGUpICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IFByaW1pdGl2ZVRyYWl0czx0eXBlPiB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3ByaW1pdGl2ZSA9IHRydWU7ICAgICAgICAgICBcCisgICAgc3RhdGljIGNvbnN0IEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHBfdHlwZSA9IFwKKyAgICAgICAgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjVFlQRTsgICAgICAgICAgICAgXAorICB9OworREVGSU5FX1BSSU1JVElWRShJTlQzMiwgaW50MzJfdCkKK0RFRklORV9QUklNSVRJVkUoVUlOVDMyLCB1aW50MzJfdCkKK0RFRklORV9QUklNSVRJVkUoSU5UNjQsIGludDY0X3QpCitERUZJTkVfUFJJTUlUSVZFKFVJTlQ2NCwgdWludDY0X3QpCitERUZJTkVfUFJJTUlUSVZFKEZMT0FULCBmbG9hdCkKK0RFRklORV9QUklNSVRJVkUoRE9VQkxFLCBkb3VibGUpCitERUZJTkVfUFJJTUlUSVZFKEJPT0wsIGJvb2wpCisjdW5kZWYgREVGSU5FX1BSSU1JVElWRQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBSZWZUeXBlVHJhaXRzPAorICAgIFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPFByaW1pdGl2ZVRyYWl0czxUPjo6aXNfcHJpbWl0aXZlPjo6dHlwZT4geworICB0eXBlZGVmIFJlcGVhdGVkRmllbGRSZWZJdGVyYXRvcjxUPiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBSZXBlYXRlZEZpZWxkQWNjZXNzb3IgQWNjZXNzb3JUeXBlOworICB0eXBlZGVmIFQgQWNjZXNzb3JWYWx1ZVR5cGU7CisgIHR5cGVkZWYgVCBJdGVyYXRvclZhbHVlVHlwZTsKKyAgdHlwZWRlZiBUKiBJdGVyYXRvclBvaW50ZXJUeXBlOworICBzdGF0aWMgY29uc3RleHByIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHBfdHlwZSA9CisgICAgICBQcmltaXRpdmVUcmFpdHM8VD46OmNwcF90eXBlOworICBzdGF0aWMgY29uc3QgRGVzY3JpcHRvciogR2V0TWVzc2FnZUZpZWxkRGVzY3JpcHRvcigpIHsgcmV0dXJuIG51bGxwdHI7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFJlZlR5cGVUcmFpdHM8CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aXNfcHJvdG9fZW51bTxUPjo6dmFsdWU+Ojp0eXBlPiB7CisgIHR5cGVkZWYgUmVwZWF0ZWRGaWVsZFJlZkl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOworICB0eXBlZGVmIFJlcGVhdGVkRmllbGRBY2Nlc3NvciBBY2Nlc3NvclR5cGU7CisgIC8vIFdlIHVzZSBpbnQzMl90IGZvciByZXBlYXRlZCBlbnVtcyBpbiBSZXBlYXRlZEZpZWxkQWNjZXNzb3IuCisgIHR5cGVkZWYgaW50MzJfdCBBY2Nlc3NvclZhbHVlVHlwZTsKKyAgdHlwZWRlZiBUIEl0ZXJhdG9yVmFsdWVUeXBlOworICB0eXBlZGVmIGludDMyX3QqIEl0ZXJhdG9yUG9pbnRlclR5cGU7CisgIHN0YXRpYyBjb25zdGV4cHIgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIGNwcF90eXBlID0KKyAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOworICBzdGF0aWMgY29uc3QgRGVzY3JpcHRvciogR2V0TWVzc2FnZUZpZWxkRGVzY3JpcHRvcigpIHsgcmV0dXJuIG51bGxwdHI7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFJlZlR5cGVUcmFpdHM8CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lPHN0ZDo6c3RyaW5nLCBUPjo6dmFsdWU+Ojp0eXBlPiB7CisgIHR5cGVkZWYgUmVwZWF0ZWRGaWVsZFJlZkl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOworICB0eXBlZGVmIFJlcGVhdGVkRmllbGRBY2Nlc3NvciBBY2Nlc3NvclR5cGU7CisgIHR5cGVkZWYgc3RkOjpzdHJpbmcgQWNjZXNzb3JWYWx1ZVR5cGU7CisgIHR5cGVkZWYgY29uc3Qgc3RkOjpzdHJpbmcgSXRlcmF0b3JWYWx1ZVR5cGU7CisgIHR5cGVkZWYgY29uc3Qgc3RkOjpzdHJpbmcqIEl0ZXJhdG9yUG9pbnRlclR5cGU7CisgIHN0YXRpYyBjb25zdGV4cHIgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIGNwcF90eXBlID0KKyAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc7CisgIHN0YXRpYyBjb25zdCBEZXNjcmlwdG9yKiBHZXRNZXNzYWdlRmllbGREZXNjcmlwdG9yKCkgeyByZXR1cm4gbnVsbHB0cjsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgTWVzc2FnZURlc2NyaXB0b3JHZXR0ZXIgeworICBzdGF0aWMgY29uc3QgRGVzY3JpcHRvciogZ2V0KCkgeworICAgIHJldHVybiBUOjpkZWZhdWx0X2luc3RhbmNlKCkuR2V0RGVzY3JpcHRvcigpOworICB9Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBNZXNzYWdlRGVzY3JpcHRvckdldHRlcjxNZXNzYWdlPiB7CisgIHN0YXRpYyBjb25zdCBEZXNjcmlwdG9yKiBnZXQoKSB7IHJldHVybiBudWxscHRyOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBSZWZUeXBlVHJhaXRzPAorICAgIFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYmFzZV9vZjxNZXNzYWdlLCBUPjo6dmFsdWU+Ojp0eXBlPiB7CisgIHR5cGVkZWYgUmVwZWF0ZWRGaWVsZFJlZkl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOworICB0eXBlZGVmIFJlcGVhdGVkRmllbGRBY2Nlc3NvciBBY2Nlc3NvclR5cGU7CisgIHR5cGVkZWYgTWVzc2FnZSBBY2Nlc3NvclZhbHVlVHlwZTsKKyAgdHlwZWRlZiBjb25zdCBUJiBJdGVyYXRvclZhbHVlVHlwZTsKKyAgdHlwZWRlZiBjb25zdCBUKiBJdGVyYXRvclBvaW50ZXJUeXBlOworICBzdGF0aWMgY29uc3RleHByIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHBfdHlwZSA9CisgICAgICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTsKKyAgc3RhdGljIGNvbnN0IERlc2NyaXB0b3IqIEdldE1lc3NhZ2VGaWVsZERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIE1lc3NhZ2VEZXNjcmlwdG9yR2V0dGVyPFQ+OjpnZXQoKTsKKyAgfQorfTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1JFRkxFQ1RJT05fSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25faW50ZXJuYWwuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NDljM2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25faW50ZXJuYWwuaApAQCAtMCwwICsxLDM2NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1JFRkxFQ1RJT05fSU5URVJOQUxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9SRUZMRUNUSU9OX0lOVEVSTkFMX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisvLyBBIGJhc2UgY2xhc3MgZm9yIFJlcGVhdGVkRmllbGRBY2Nlc3NvciBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjYW4gc3VwcG9ydAorLy8gcmFuZG9tLWFjY2VzcyBlZmZpY2llbnRseS4gQWxsIGl0ZXJhdG9yIG1ldGhvZHMgZGVsZWdhdGVzIHRoZSB3b3JrIHRvCisvLyBjb3JyZXNwb25kaW5nIHJhbmRvbS1hY2Nlc3MgbWV0aG9kcy4KK2NsYXNzIFJhbmRvbUFjY2Vzc1JlcGVhdGVkRmllbGRBY2Nlc3NvciA6IHB1YmxpYyBSZXBlYXRlZEZpZWxkQWNjZXNzb3IgeworIHB1YmxpYzoKKyAgSXRlcmF0b3IqIEJlZ2luSXRlcmF0b3IoY29uc3QgRmllbGQqIC8qZGF0YSovKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFBvc2l0aW9uVG9JdGVyYXRvcigwKTsKKyAgfQorICBJdGVyYXRvciogRW5kSXRlcmF0b3IoY29uc3QgRmllbGQqIGRhdGEpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUG9zaXRpb25Ub0l0ZXJhdG9yKHRoaXMtPlNpemUoZGF0YSkpOworICB9CisgIEl0ZXJhdG9yKiBDb3B5SXRlcmF0b3IoY29uc3QgRmllbGQqIC8qZGF0YSovLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEl0ZXJhdG9yKiBpdGVyYXRvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBjb25zdF9jYXN0PEl0ZXJhdG9yKj4oaXRlcmF0b3IpOworICB9CisgIEl0ZXJhdG9yKiBBZHZhbmNlSXRlcmF0b3IoY29uc3QgRmllbGQqIC8qZGF0YSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yKiBpdGVyYXRvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBQb3NpdGlvblRvSXRlcmF0b3IoSXRlcmF0b3JUb1Bvc2l0aW9uKGl0ZXJhdG9yKSArIDEpOworICB9CisgIGJvb2wgRXF1YWxzSXRlcmF0b3IoY29uc3QgRmllbGQqIC8qZGF0YSovLCBjb25zdCBJdGVyYXRvciogYSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJdGVyYXRvciogYikgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBhID09IGI7CisgIH0KKyAgdm9pZCBEZWxldGVJdGVyYXRvcihjb25zdCBGaWVsZCogLypkYXRhKi8sCisgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IqIC8qaXRlcmF0b3IqLykgY29uc3Qgb3ZlcnJpZGUge30KKyAgY29uc3QgVmFsdWUqIEdldEl0ZXJhdG9yVmFsdWUoY29uc3QgRmllbGQqIGRhdGEsIGNvbnN0IEl0ZXJhdG9yKiBpdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUqIHNjcmF0Y2hfc3BhY2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gR2V0KGRhdGEsIHN0YXRpY19jYXN0PGludD4oSXRlcmF0b3JUb1Bvc2l0aW9uKGl0ZXJhdG9yKSksCisgICAgICAgICAgICAgICBzY3JhdGNoX3NwYWNlKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB+UmFuZG9tQWNjZXNzUmVwZWF0ZWRGaWVsZEFjY2Vzc29yKCkgPSBkZWZhdWx0OworCisgcHJpdmF0ZToKKyAgc3RhdGljIGludHB0cl90IEl0ZXJhdG9yVG9Qb3NpdGlvbihjb25zdCBJdGVyYXRvciogaXRlcmF0b3IpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oaXRlcmF0b3IpOworICB9CisgIHN0YXRpYyBJdGVyYXRvciogUG9zaXRpb25Ub0l0ZXJhdG9yKGludHB0cl90IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8SXRlcmF0b3IqPihwb3NpdGlvbik7CisgIH0KK307CisKKy8vIEJhc2UgY2xhc3MgZm9yIFJlcGVhdGVkRmllbGRBY2Nlc3NvciBpbXBsZW1lbnRhdGlvbnMgdGhhdCBtYW5pcHVsYXRlcworLy8gUmVwZWF0ZWRGaWVsZDxUPi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUmVwZWF0ZWRGaWVsZFdyYXBwZXIgOiBwdWJsaWMgUmFuZG9tQWNjZXNzUmVwZWF0ZWRGaWVsZEFjY2Vzc29yIHsKKyBwdWJsaWM6CisgIFJlcGVhdGVkRmllbGRXcmFwcGVyKCkge30KKyAgYm9vbCBJc0VtcHR5KGNvbnN0IEZpZWxkKiBkYXRhKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEdldFJlcGVhdGVkRmllbGQoZGF0YSktPmVtcHR5KCk7CisgIH0KKyAgaW50IFNpemUoY29uc3QgRmllbGQqIGRhdGEpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gR2V0UmVwZWF0ZWRGaWVsZChkYXRhKS0+c2l6ZSgpOworICB9CisgIGNvbnN0IFZhbHVlKiBHZXQoY29uc3QgRmllbGQqIGRhdGEsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICBWYWx1ZSogc2NyYXRjaF9zcGFjZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBDb252ZXJ0RnJvbVQoR2V0UmVwZWF0ZWRGaWVsZChkYXRhKS0+R2V0KGluZGV4KSwgc2NyYXRjaF9zcGFjZSk7CisgIH0KKyAgdm9pZCBDbGVhcihGaWVsZCogZGF0YSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIE11dGFibGVSZXBlYXRlZEZpZWxkKGRhdGEpLT5DbGVhcigpOworICB9CisgIHZvaWQgU2V0KEZpZWxkKiBkYXRhLCBpbnQgaW5kZXgsIGNvbnN0IFZhbHVlKiB2YWx1ZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIE11dGFibGVSZXBlYXRlZEZpZWxkKGRhdGEpLT5TZXQoaW5kZXgsIENvbnZlcnRUb1QodmFsdWUpKTsKKyAgfQorICB2b2lkIEFkZChGaWVsZCogZGF0YSwgY29uc3QgVmFsdWUqIHZhbHVlKSBjb25zdCBvdmVycmlkZSB7CisgICAgTXV0YWJsZVJlcGVhdGVkRmllbGQoZGF0YSktPkFkZChDb252ZXJ0VG9UKHZhbHVlKSk7CisgIH0KKyAgdm9pZCBSZW1vdmVMYXN0KEZpZWxkKiBkYXRhKSBjb25zdCBvdmVycmlkZSB7CisgICAgTXV0YWJsZVJlcGVhdGVkRmllbGQoZGF0YSktPlJlbW92ZUxhc3QoKTsKKyAgfQorICB2b2lkIFN3YXBFbGVtZW50cyhGaWVsZCogZGF0YSwgaW50IGluZGV4MSwgaW50IGluZGV4MikgY29uc3Qgb3ZlcnJpZGUgeworICAgIE11dGFibGVSZXBlYXRlZEZpZWxkKGRhdGEpLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIH5SZXBlYXRlZEZpZWxkV3JhcHBlcigpID0gZGVmYXVsdDsKKyAgdHlwZWRlZiBSZXBlYXRlZEZpZWxkPFQ+IFJlcGVhdGVkRmllbGRUeXBlOworICBzdGF0aWMgY29uc3QgUmVwZWF0ZWRGaWVsZFR5cGUqIEdldFJlcGVhdGVkRmllbGQoY29uc3QgRmllbGQqIGRhdGEpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBSZXBlYXRlZEZpZWxkVHlwZSo+KGRhdGEpOworICB9CisgIHN0YXRpYyBSZXBlYXRlZEZpZWxkVHlwZSogTXV0YWJsZVJlcGVhdGVkRmllbGQoRmllbGQqIGRhdGEpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZEZpZWxkVHlwZSo+KGRhdGEpOworICB9CisKKyAgLy8gQ29udmVydCBhbiBvYmplY3QgcmVjZWl2ZWQgYnkgdGhpcyBhY2Nlc3NvciB0byBhbiBvYmplY3QgdG8gYmUgc3RvcmVkIGluCisgIC8vIHRoZSB1bmRlcmx5aW5nIFJlcGVhdGVkRmllbGQuCisgIHZpcnR1YWwgVCBDb252ZXJ0VG9UKGNvbnN0IFZhbHVlKiB2YWx1ZSkgY29uc3QgPSAwOworCisgIC8vIENvbnZlcnQgYW4gb2JqZWN0IHN0b3JlZCBpbiBSZXBlYXRlZFB0ckZpZWxkIHRvIGFuIG9iamVjdCB0aGF0IHdpbGwgYmUKKyAgLy8gcmV0dXJuZWQgYnkgdGhpcyBhY2Nlc3Nvci4gSWYgdGhlIHR3byBvYmplY3RzIGhhdmUgdGhlIHNhbWUgdHlwZSAodHJ1ZSBmb3IKKyAgLy8gc3RyaW5nIGZpZWxkcyB3aXRoIGN0eXBlPVNUUklORyksIGEgcG9pbnRlciB0byB0aGUgc291cmNlIG9iamVjdCBjYW4gYmUKKyAgLy8gcmV0dXJuZWQgZGlyZWN0bHkuIE90aGVyd2lzZSwgZGF0YSBzaG91bGQgYmUgY29waWVkIGZyb20gdmFsdWUgdG8KKyAgLy8gc2NyYXRjaF9zcGFjZSBhbmQgc2NyYXRjaF9zcGFjZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgIHZpcnR1YWwgY29uc3QgVmFsdWUqIENvbnZlcnRGcm9tVChjb25zdCBUJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKiBzY3JhdGNoX3NwYWNlKSBjb25zdCA9IDA7Cit9OworCisvLyBCYXNlIGNsYXNzIGZvciBSZXBlYXRlZEZpZWxkQWNjZXNzb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgbWFuaXB1bGF0ZXMKKy8vIFJlcGVhdGVkUHRyRmllbGQ8VD4uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFJlcGVhdGVkUHRyRmllbGRXcmFwcGVyIDogcHVibGljIFJhbmRvbUFjY2Vzc1JlcGVhdGVkRmllbGRBY2Nlc3NvciB7CisgcHVibGljOgorICBib29sIElzRW1wdHkoY29uc3QgRmllbGQqIGRhdGEpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gR2V0UmVwZWF0ZWRGaWVsZChkYXRhKS0+ZW1wdHkoKTsKKyAgfQorICBpbnQgU2l6ZShjb25zdCBGaWVsZCogZGF0YSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBHZXRSZXBlYXRlZEZpZWxkKGRhdGEpLT5zaXplKCk7CisgIH0KKyAgY29uc3QgVmFsdWUqIEdldChjb25zdCBGaWVsZCogZGF0YSwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgIFZhbHVlKiBzY3JhdGNoX3NwYWNlKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIENvbnZlcnRGcm9tVChHZXRSZXBlYXRlZEZpZWxkKGRhdGEpLT5HZXQoaW5kZXgpLCBzY3JhdGNoX3NwYWNlKTsKKyAgfQorICB2b2lkIENsZWFyKEZpZWxkKiBkYXRhKSBjb25zdCBvdmVycmlkZSB7CisgICAgTXV0YWJsZVJlcGVhdGVkRmllbGQoZGF0YSktPkNsZWFyKCk7CisgIH0KKyAgdm9pZCBTZXQoRmllbGQqIGRhdGEsIGludCBpbmRleCwgY29uc3QgVmFsdWUqIHZhbHVlKSBjb25zdCBvdmVycmlkZSB7CisgICAgQ29udmVydFRvVCh2YWx1ZSwgTXV0YWJsZVJlcGVhdGVkRmllbGQoZGF0YSktPk11dGFibGUoaW5kZXgpKTsKKyAgfQorICB2b2lkIEFkZChGaWVsZCogZGF0YSwgY29uc3QgVmFsdWUqIHZhbHVlKSBjb25zdCBvdmVycmlkZSB7CisgICAgVCogYWxsb2NhdGVkID0gTmV3KHZhbHVlKTsKKyAgICBDb252ZXJ0VG9UKHZhbHVlLCBhbGxvY2F0ZWQpOworICAgIE11dGFibGVSZXBlYXRlZEZpZWxkKGRhdGEpLT5BZGRBbGxvY2F0ZWQoYWxsb2NhdGVkKTsKKyAgfQorICB2b2lkIFJlbW92ZUxhc3QoRmllbGQqIGRhdGEpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBNdXRhYmxlUmVwZWF0ZWRGaWVsZChkYXRhKS0+UmVtb3ZlTGFzdCgpOworICB9CisgIHZvaWQgU3dhcEVsZW1lbnRzKEZpZWxkKiBkYXRhLCBpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKSBjb25zdCBvdmVycmlkZSB7CisgICAgTXV0YWJsZVJlcGVhdGVkRmllbGQoZGF0YSktPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7CisgIH0KKworIHByb3RlY3RlZDoKKyAgflJlcGVhdGVkUHRyRmllbGRXcmFwcGVyKCkgPSBkZWZhdWx0OworICB0eXBlZGVmIFJlcGVhdGVkUHRyRmllbGQ8VD4gUmVwZWF0ZWRGaWVsZFR5cGU7CisgIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkVHlwZSogR2V0UmVwZWF0ZWRGaWVsZChjb25zdCBGaWVsZCogZGF0YSkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFJlcGVhdGVkRmllbGRUeXBlKj4oZGF0YSk7CisgIH0KKyAgc3RhdGljIFJlcGVhdGVkRmllbGRUeXBlKiBNdXRhYmxlUmVwZWF0ZWRGaWVsZChGaWVsZCogZGF0YSkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFJlcGVhdGVkRmllbGRUeXBlKj4oZGF0YSk7CisgIH0KKworICAvLyBDcmVhdGUgYSBuZXcgVCBpbnN0YW5jZS4gRm9yIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGRzLCBUIGNhbiBiZSBzcGVjaWZpZWQKKyAgLy8gYXMgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSBzbyB3ZSBjYW4ndCB1c2UgIm5ldyBUKCkiIGRpcmVjdGx5LiBJbiB0aGF0IGNhc2UsIHZhbHVlCisgIC8vIHNob3VsZCBiZSBhIG1lc3NhZ2Ugb2YgdGhlIHNhbWUgdHlwZSAoaXQncyBlbnN1cmVkIGJ5IHRoZSBjYWxsZXIpIGFuZCBhCisgIC8vIG5ldyBtZXNzYWdlIG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQgdXNpbmcgaXQuCisgIHZpcnR1YWwgVCogTmV3KGNvbnN0IFZhbHVlKiB2YWx1ZSkgY29uc3QgPSAwOworCisgIC8vIENvbnZlcnQgYW4gb2JqZWN0IHJlY2VpdmVkIGJ5IHRoaXMgYWNjZXNzb3IgdG8gYW4gb2JqZWN0IHRoYXQgd2lsbCBiZQorICAvLyBzdG9yZWQgaW4gdGhlIHVuZGVybHlpbmcgUmVwZWF0ZWRQdHJGaWVsZC4KKyAgdmlydHVhbCB2b2lkIENvbnZlcnRUb1QoY29uc3QgVmFsdWUqIHZhbHVlLCBUKiByZXN1bHQpIGNvbnN0ID0gMDsKKworICAvLyBDb252ZXJ0IGFuIG9iamVjdCBzdG9yZWQgaW4gUmVwZWF0ZWRQdHJGaWVsZCB0byBhbiBvYmplY3QgdGhhdCB3aWxsIGJlCisgIC8vIHJldHVybmVkIGJ5IHRoaXMgYWNjZXNzb3IuIElmIHRoZSB0d28gb2JqZWN0cyBoYXZlIHRoZSBzYW1lIHR5cGUgKHRydWUgZm9yCisgIC8vIHN0cmluZyBmaWVsZHMgd2l0aCBjdHlwZT1TVFJJTkcpLCBhIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvYmplY3QgY2FuIGJlCisgIC8vIHJldHVybmVkIGRpcmVjdGx5LiBPdGhlcndpc2UsIGRhdGEgc2hvdWxkIGJlIGNvcGllZCBmcm9tIHZhbHVlIHRvCisgIC8vIHNjcmF0Y2hfc3BhY2UgYW5kIHNjcmF0Y2hfc3BhY2Ugc2hvdWxkIGJlIHJldHVybmVkLgorICB2aXJ0dWFsIGNvbnN0IFZhbHVlKiBDb252ZXJ0RnJvbVQoY29uc3QgVCYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSogc2NyYXRjaF9zcGFjZSkgY29uc3QgPSAwOworfTsKKworLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgUmFuZG9tQWNjZXNzUmVwZWF0ZWRGaWVsZEFjY2Vzc29yIHRoYXQgbWFuaXB1bGF0ZXMKKy8vIE1hcEZpZWxkQmFzZS4KK2NsYXNzIE1hcEZpZWxkQWNjZXNzb3IgZmluYWwgOiBwdWJsaWMgUmFuZG9tQWNjZXNzUmVwZWF0ZWRGaWVsZEFjY2Vzc29yIHsKKyBwdWJsaWM6CisgIE1hcEZpZWxkQWNjZXNzb3IoKSB7fQorICB2aXJ0dWFsIH5NYXBGaWVsZEFjY2Vzc29yKCkge30KKyAgYm9vbCBJc0VtcHR5KGNvbnN0IEZpZWxkKiBkYXRhKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEdldFJlcGVhdGVkRmllbGQoZGF0YSktPmVtcHR5KCk7CisgIH0KKyAgaW50IFNpemUoY29uc3QgRmllbGQqIGRhdGEpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gR2V0UmVwZWF0ZWRGaWVsZChkYXRhKS0+c2l6ZSgpOworICB9CisgIGNvbnN0IFZhbHVlKiBHZXQoY29uc3QgRmllbGQqIGRhdGEsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICBWYWx1ZSogc2NyYXRjaF9zcGFjZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBDb252ZXJ0RnJvbUVudHJ5KEdldFJlcGVhdGVkRmllbGQoZGF0YSktPkdldChpbmRleCksIHNjcmF0Y2hfc3BhY2UpOworICB9CisgIHZvaWQgQ2xlYXIoRmllbGQqIGRhdGEpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBNdXRhYmxlUmVwZWF0ZWRGaWVsZChkYXRhKS0+Q2xlYXIoKTsKKyAgfQorICB2b2lkIFNldChGaWVsZCogZGF0YSwgaW50IGluZGV4LCBjb25zdCBWYWx1ZSogdmFsdWUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBDb252ZXJ0VG9FbnRyeSh2YWx1ZSwgTXV0YWJsZVJlcGVhdGVkRmllbGQoZGF0YSktPk11dGFibGUoaW5kZXgpKTsKKyAgfQorICB2b2lkIEFkZChGaWVsZCogZGF0YSwgY29uc3QgVmFsdWUqIHZhbHVlKSBjb25zdCBvdmVycmlkZSB7CisgICAgTWVzc2FnZSogYWxsb2NhdGVkID0gTmV3KHZhbHVlKTsKKyAgICBDb252ZXJ0VG9FbnRyeSh2YWx1ZSwgYWxsb2NhdGVkKTsKKyAgICBNdXRhYmxlUmVwZWF0ZWRGaWVsZChkYXRhKS0+QWRkQWxsb2NhdGVkKGFsbG9jYXRlZCk7CisgIH0KKyAgdm9pZCBSZW1vdmVMYXN0KEZpZWxkKiBkYXRhKSBjb25zdCBvdmVycmlkZSB7CisgICAgTXV0YWJsZVJlcGVhdGVkRmllbGQoZGF0YSktPlJlbW92ZUxhc3QoKTsKKyAgfQorICB2b2lkIFN3YXBFbGVtZW50cyhGaWVsZCogZGF0YSwgaW50IGluZGV4MSwgaW50IGluZGV4MikgY29uc3Qgb3ZlcnJpZGUgeworICAgIE11dGFibGVSZXBlYXRlZEZpZWxkKGRhdGEpLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOworICB9CisgIHZvaWQgU3dhcChGaWVsZCogZGF0YSwgY29uc3QgaW50ZXJuYWw6OlJlcGVhdGVkRmllbGRBY2Nlc3Nvciogb3RoZXJfbXV0YXRvciwKKyAgICAgICAgICAgIEZpZWxkKiBvdGhlcl9kYXRhKSBjb25zdCBvdmVycmlkZSB7CisgICAgR09PR0xFX0NIRUNLKHRoaXMgPT0gb3RoZXJfbXV0YXRvcik7CisgICAgTXV0YWJsZVJlcGVhdGVkRmllbGQoZGF0YSktPlN3YXAoTXV0YWJsZVJlcGVhdGVkRmllbGQob3RoZXJfZGF0YSkpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiBSZXBlYXRlZEZpZWxkVHlwZTsKKyAgc3RhdGljIGNvbnN0IFJlcGVhdGVkRmllbGRUeXBlKiBHZXRSZXBlYXRlZEZpZWxkKGNvbnN0IEZpZWxkKiBkYXRhKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVwZWF0ZWRGaWVsZFR5cGUqPigKKyAgICAgICAgKCZyZWludGVycHJldF9jYXN0PGNvbnN0IE1hcEZpZWxkQmFzZSo+KGRhdGEpLT5HZXRSZXBlYXRlZEZpZWxkKCkpKTsKKyAgfQorICBzdGF0aWMgUmVwZWF0ZWRGaWVsZFR5cGUqIE11dGFibGVSZXBlYXRlZEZpZWxkKEZpZWxkKiBkYXRhKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRGaWVsZFR5cGUqPigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNYXBGaWVsZEJhc2UqPihkYXRhKS0+TXV0YWJsZVJlcGVhdGVkRmllbGQoKSk7CisgIH0KKyAgdmlydHVhbCBNZXNzYWdlKiBOZXcoY29uc3QgVmFsdWUqIHZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IE1lc3NhZ2UqPih2YWx1ZSktPk5ldygpOworICB9CisgIC8vIENvbnZlcnQgYW4gb2JqZWN0IHJlY2VpdmVkIGJ5IHRoaXMgYWNjZXNzb3IgdG8gYW4gTWFwRW50cnkgbWVzc2FnZSB0byBiZQorICAvLyBzdG9yZWQgaW4gdGhlIHVuZGVybHlpbmcgTWFwRmllbGRCYXNlLgorICB2aXJ0dWFsIHZvaWQgQ29udmVydFRvRW50cnkoY29uc3QgVmFsdWUqIHZhbHVlLCBNZXNzYWdlKiByZXN1bHQpIGNvbnN0IHsKKyAgICByZXN1bHQtPkNvcHlGcm9tKCpzdGF0aWNfY2FzdDxjb25zdCBNZXNzYWdlKj4odmFsdWUpKTsKKyAgfQorICAvLyBDb252ZXJ0IGEgTWFwRW50cnkgbWVzc2FnZSBzdG9yZWQgaW4gdGhlIHVuZGVybHlpbmcgTWFwRmllbGRCYXNlIHRvIGFuCisgIC8vIG9iamVjdCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhpcyBhY2Nlc3Nvci4KKyAgdmlydHVhbCBjb25zdCBWYWx1ZSogQ29udmVydEZyb21FbnRyeShjb25zdCBNZXNzYWdlJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSogLypzY3JhdGNoX3NwYWNlKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgVmFsdWUqPigmdmFsdWUpOworICB9Cit9OworCisvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiBSZXBlYXRlZEZpZWxkQWNjZXNzb3IgZm9yIHByaW1pdGl2ZSB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUmVwZWF0ZWRGaWVsZFByaW1pdGl2ZUFjY2Vzc29yIGZpbmFsIDogcHVibGljIFJlcGVhdGVkRmllbGRXcmFwcGVyPFQ+IHsKKyAgdHlwZWRlZiB2b2lkIEZpZWxkOworICB0eXBlZGVmIHZvaWQgVmFsdWU7CisgIHVzaW5nIFJlcGVhdGVkRmllbGRXcmFwcGVyPFQ+OjpNdXRhYmxlUmVwZWF0ZWRGaWVsZDsKKworIHB1YmxpYzoKKyAgUmVwZWF0ZWRGaWVsZFByaW1pdGl2ZUFjY2Vzc29yKCkge30KKyAgdm9pZCBTd2FwKEZpZWxkKiBkYXRhLCBjb25zdCBpbnRlcm5hbDo6UmVwZWF0ZWRGaWVsZEFjY2Vzc29yKiBvdGhlcl9tdXRhdG9yLAorICAgICAgICAgICAgRmllbGQqIG90aGVyX2RhdGEpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAvLyBDdXJyZW50bHkgUmVwZWF0ZWRGaWVsZFByaW1pdGl2ZUFjY2Vzc29yIGlzIHRoZSBvbmx5IGltcGxlbWVudGF0aW9uIG9mCisgICAgLy8gUmVwZWF0ZWRGaWVsZEFjY2Vzc29yIGZvciBwcmltaXRpdmUgdHlwZXMuIEFzIHdlIGFyZSB1c2luZyBzaW5nbGV0b25zCisgICAgLy8gZm9yIHRoZXNlIGFjY2Vzc29ycywgaGVyZSAib3RoZXJfbXV0YXRvciIgbXVzdCBiZSAidGhpcyIuCisgICAgR09PR0xFX0NIRUNLKHRoaXMgPT0gb3RoZXJfbXV0YXRvcik7CisgICAgTXV0YWJsZVJlcGVhdGVkRmllbGQoZGF0YSktPlN3YXAoTXV0YWJsZVJlcGVhdGVkRmllbGQob3RoZXJfZGF0YSkpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIFQgQ29udmVydFRvVChjb25zdCBWYWx1ZSogdmFsdWUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IFQqPih2YWx1ZSk7CisgIH0KKyAgY29uc3QgVmFsdWUqIENvbnZlcnRGcm9tVChjb25zdCBUJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSogLypzY3JhdGNoX3NwYWNlKi8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgVmFsdWUqPigmdmFsdWUpOworICB9Cit9OworCisvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFJlcGVhdGVkRmllbGRBY2Nlc3NvciBmb3Igc3RyaW5nIGZpZWxkcyB3aXRoCisvLyBjdHlwZT1TVFJJTkcuCitjbGFzcyBSZXBlYXRlZFB0ckZpZWxkU3RyaW5nQWNjZXNzb3IgZmluYWwKKyAgICA6IHB1YmxpYyBSZXBlYXRlZFB0ckZpZWxkV3JhcHBlcjxzdGQ6OnN0cmluZz4geworICB0eXBlZGVmIHZvaWQgRmllbGQ7CisgIHR5cGVkZWYgdm9pZCBWYWx1ZTsKKyAgdXNpbmcgUmVwZWF0ZWRGaWVsZEFjY2Vzc29yOjpBZGQ7CisKKyBwdWJsaWM6CisgIFJlcGVhdGVkUHRyRmllbGRTdHJpbmdBY2Nlc3NvcigpIHt9CisgIHZvaWQgU3dhcChGaWVsZCogZGF0YSwgY29uc3QgaW50ZXJuYWw6OlJlcGVhdGVkRmllbGRBY2Nlc3Nvciogb3RoZXJfbXV0YXRvciwKKyAgICAgICAgICAgIEZpZWxkKiBvdGhlcl9kYXRhKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKHRoaXMgPT0gb3RoZXJfbXV0YXRvcikgeworICAgICAgTXV0YWJsZVJlcGVhdGVkRmllbGQoZGF0YSktPlN3YXAoTXV0YWJsZVJlcGVhdGVkRmllbGQob3RoZXJfZGF0YSkpOworICAgIH0gZWxzZSB7CisgICAgICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiB0bXA7CisgICAgICB0bXAuU3dhcChNdXRhYmxlUmVwZWF0ZWRGaWVsZChkYXRhKSk7CisgICAgICBpbnQgb3RoZXJfc2l6ZSA9IG90aGVyX211dGF0b3ItPlNpemUob3RoZXJfZGF0YSk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG90aGVyX3NpemU7ICsraSkgeworICAgICAgICBBZGQ8c3RkOjpzdHJpbmc+KGRhdGEsIG90aGVyX211dGF0b3ItPkdldDxzdGQ6OnN0cmluZz4ob3RoZXJfZGF0YSwgaSkpOworICAgICAgfQorICAgICAgaW50IHNpemUgPSBTaXplKGRhdGEpOworICAgICAgb3RoZXJfbXV0YXRvci0+Q2xlYXIob3RoZXJfZGF0YSk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBvdGhlcl9tdXRhdG9yLT5BZGQ8c3RkOjpzdHJpbmc+KG90aGVyX2RhdGEsIHRtcC5HZXQoaSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGQ6OnN0cmluZyogTmV3KGNvbnN0IFZhbHVlKikgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbmV3IHN0ZDo6c3RyaW5nKCk7IH0KKyAgdm9pZCBDb252ZXJ0VG9UKGNvbnN0IFZhbHVlKiB2YWx1ZSwgc3RkOjpzdHJpbmcqIHJlc3VsdCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICpyZXN1bHQgPSAqc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjpzdHJpbmcqPih2YWx1ZSk7CisgIH0KKyAgY29uc3QgVmFsdWUqIENvbnZlcnRGcm9tVChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUqIC8qc2NyYXRjaF9zcGFjZSovKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFZhbHVlKj4oJnZhbHVlKTsKKyAgfQorfTsKKworCitjbGFzcyBSZXBlYXRlZFB0ckZpZWxkTWVzc2FnZUFjY2Vzc29yIGZpbmFsCisgICAgOiBwdWJsaWMgUmVwZWF0ZWRQdHJGaWVsZFdyYXBwZXI8TWVzc2FnZT4geworICB0eXBlZGVmIHZvaWQgRmllbGQ7CisgIHR5cGVkZWYgdm9pZCBWYWx1ZTsKKworIHB1YmxpYzoKKyAgUmVwZWF0ZWRQdHJGaWVsZE1lc3NhZ2VBY2Nlc3NvcigpIHt9CisgIHZvaWQgU3dhcChGaWVsZCogZGF0YSwgY29uc3QgaW50ZXJuYWw6OlJlcGVhdGVkRmllbGRBY2Nlc3Nvciogb3RoZXJfbXV0YXRvciwKKyAgICAgICAgICAgIEZpZWxkKiBvdGhlcl9kYXRhKSBjb25zdCBvdmVycmlkZSB7CisgICAgR09PR0xFX0NIRUNLKHRoaXMgPT0gb3RoZXJfbXV0YXRvcik7CisgICAgTXV0YWJsZVJlcGVhdGVkRmllbGQoZGF0YSktPlN3YXAoTXV0YWJsZVJlcGVhdGVkRmllbGQob3RoZXJfZGF0YSkpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIE1lc3NhZ2UqIE5ldyhjb25zdCBWYWx1ZSogdmFsdWUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgTWVzc2FnZSo+KHZhbHVlKS0+TmV3KCk7CisgIH0KKyAgdm9pZCBDb252ZXJ0VG9UKGNvbnN0IFZhbHVlKiB2YWx1ZSwgTWVzc2FnZSogcmVzdWx0KSBjb25zdCBvdmVycmlkZSB7CisgICAgcmVzdWx0LT5Db3B5RnJvbSgqc3RhdGljX2Nhc3Q8Y29uc3QgTWVzc2FnZSo+KHZhbHVlKSk7CisgIH0KKyAgY29uc3QgVmFsdWUqIENvbnZlcnRGcm9tVChjb25zdCBNZXNzYWdlJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSogLypzY3JhdGNoX3NwYWNlKi8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgVmFsdWUqPigmdmFsdWUpOworICB9Cit9OworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfUkVGTEVDVElPTl9JTlRFUk5BTF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMTk3MmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmNjCkBAIC0wLDAgKzEsNDU5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX2lubC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworc3RhdGljIGNvbnN0IFJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb25PckRpZShjb25zdCBNZXNzYWdlJiBtKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHIgPSBtLkdldFJlZmxlY3Rpb24oKTsKKyAgaWYgKHIgPT0gbnVsbHB0cikgeworICAgIGNvbnN0IERlc2NyaXB0b3IqIGQgPSBtLkdldERlc2NyaXB0b3IoKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbXR5cGUgPSBkID8gZC0+bmFtZSgpIDogInVua25vd24iOworICAgIC8vIFJhd01lc3NhZ2UgaXMgb25lIGtub3duIHR5cGUgZm9yIHdoaWNoIEdldFJlZmxlY3Rpb24oKSByZXR1cm5zIG51bGxwdHIuCisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk1lc3NhZ2UgZG9lcyBub3Qgc3VwcG9ydCByZWZsZWN0aW9uICh0eXBlICIgPDwgbXR5cGUgPDwgIikuIjsKKyAgfQorICByZXR1cm4gcjsKK30KKwordm9pZCBSZWZsZWN0aW9uT3BzOjpDb3B5KGNvbnN0IE1lc3NhZ2UmIGZyb20sIE1lc3NhZ2UqIHRvKSB7CisgIGlmICgmZnJvbSA9PSB0bykgcmV0dXJuOworICBDbGVhcih0byk7CisgIE1lcmdlKGZyb20sIHRvKTsKK30KKwordm9pZCBSZWZsZWN0aW9uT3BzOjpNZXJnZShjb25zdCBNZXNzYWdlJiBmcm9tLCBNZXNzYWdlKiB0bykgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRvKTsKKworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gZnJvbS5HZXREZXNjcmlwdG9yKCk7CisgIEdPT0dMRV9DSEVDS19FUSh0by0+R2V0RGVzY3JpcHRvcigpLCBkZXNjcmlwdG9yKQorICAgICAgPDwgIlRyaWVkIHRvIG1lcmdlIG1lc3NhZ2VzIG9mIGRpZmZlcmVudCB0eXBlcyAiCisgICAgICA8PCAiKG1lcmdlICIgPDwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgPDwgIiB0byAiCisgICAgICA8PCB0by0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKSA8PCAiKSI7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogZnJvbV9yZWZsZWN0aW9uID0gR2V0UmVmbGVjdGlvbk9yRGllKGZyb20pOworICBjb25zdCBSZWZsZWN0aW9uKiB0b19yZWZsZWN0aW9uID0gR2V0UmVmbGVjdGlvbk9yRGllKCp0byk7CisgIGJvb2wgaXNfZnJvbV9nZW5lcmF0ZWQgPSAoZnJvbV9yZWZsZWN0aW9uLT5HZXRNZXNzYWdlRmFjdG9yeSgpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCkpOworICBib29sIGlzX3RvX2dlbmVyYXRlZCA9ICh0b19yZWZsZWN0aW9uLT5HZXRNZXNzYWdlRmFjdG9yeSgpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIGZyb21fcmVmbGVjdGlvbi0+TGlzdEZpZWxkc09taXRTdHJpcHBlZChmcm9tLCAmZmllbGRzKTsKKyAgZm9yIChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkIDogZmllbGRzKSB7CisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAvLyBVc2UgbWFwIHJlZmxlY3Rpb24gaWYgYm90aCBhcmUgaW4gbWFwIHN0YXR1cyBhbmQgaGF2ZSB0aGUKKyAgICAgIC8vIHNhbWUgbWFwIHR5cGUgdG8gYXZvaWQgc3luYyB3aXRoIHJlcGVhdGVkIGZpZWxkLgorICAgICAgLy8gTm90ZTogQXMgZnJvbSBhbmQgdG8gbWVzc2FnZXMgaGF2ZSB0aGUgc2FtZSBkZXNjcmlwdG9yLCB0aGUKKyAgICAgIC8vIG1hcCBmaWVsZCB0eXBlcyBhcmUgdGhlIHNhbWUgaWYgdGhleSBhcmUgYm90aCBnZW5lcmF0ZWQKKyAgICAgIC8vIG1lc3NhZ2VzIG9yIGJvdGggZHluYW1pYyBtZXNzYWdlcy4KKyAgICAgIGlmIChpc19mcm9tX2dlbmVyYXRlZCA9PSBpc190b19nZW5lcmF0ZWQgJiYgZmllbGQtPmlzX21hcCgpKSB7CisgICAgICAgIGNvbnN0IE1hcEZpZWxkQmFzZSogZnJvbV9maWVsZCA9CisgICAgICAgICAgICBmcm9tX3JlZmxlY3Rpb24tPkdldE1hcERhdGEoZnJvbSwgZmllbGQpOworICAgICAgICBNYXBGaWVsZEJhc2UqIHRvX2ZpZWxkID0gdG9fcmVmbGVjdGlvbi0+TXV0YWJsZU1hcERhdGEodG8sIGZpZWxkKTsKKyAgICAgICAgaWYgKHRvX2ZpZWxkLT5Jc01hcFZhbGlkKCkgJiYgZnJvbV9maWVsZC0+SXNNYXBWYWxpZCgpKSB7CisgICAgICAgICAgdG9fZmllbGQtPk1lcmdlRnJvbSgqZnJvbV9maWVsZCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGludCBjb3VudCA9IGZyb21fcmVmbGVjdGlvbi0+RmllbGRTaXplKGZyb20sIGZpZWxkKTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgeworICAgICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKENQUFRZUEUsIE1FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvX3JlZmxlY3Rpb24tPkFkZCMjTUVUSE9EKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRvLCBmaWVsZCwgZnJvbV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZCMjTUVUSE9EKGZyb20sIGZpZWxkLCBqKSk7IFwKKyAgICBicmVhazsKKworICAgICAgICAgIEhBTkRMRV9UWVBFKElOVDMyLCBJbnQzMik7CisgICAgICAgICAgSEFORExFX1RZUEUoSU5UNjQsIEludDY0KTsKKyAgICAgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIFVJbnQzMik7CisgICAgICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCBVSW50NjQpOworICAgICAgICAgIEhBTkRMRV9UWVBFKEZMT0FULCBGbG9hdCk7CisgICAgICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBEb3VibGUpOworICAgICAgICAgIEhBTkRMRV9UWVBFKEJPT0wsIEJvb2wpOworICAgICAgICAgIEhBTkRMRV9UWVBFKFNUUklORywgU3RyaW5nKTsKKyAgICAgICAgICBIQU5ETEVfVFlQRShFTlVNLCBFbnVtKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIGZyb21fY2hpbGQgPQorICAgICAgICAgICAgICAgIGZyb21fcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKGZyb20sIGZpZWxkLCBqKTsKKyAgICAgICAgICAgIGlmIChmcm9tX3JlZmxlY3Rpb24gPT0gdG9fcmVmbGVjdGlvbikgeworICAgICAgICAgICAgICB0b19yZWZsZWN0aW9uCisgICAgICAgICAgICAgICAgICAtPkFkZE1lc3NhZ2UodG8sIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fY2hpbGQuR2V0UmVmbGVjdGlvbigpLT5HZXRNZXNzYWdlRmFjdG9yeSgpKQorICAgICAgICAgICAgICAgICAgLT5NZXJnZUZyb20oZnJvbV9jaGlsZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB0b19yZWZsZWN0aW9uLT5BZGRNZXNzYWdlKHRvLCBmaWVsZCktPk1lcmdlRnJvbShmcm9tX2NoaWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoQ1BQVFlQRSwgTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0b19yZWZsZWN0aW9uLT5TZXQjI01FVEhPRCh0bywgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3JlZmxlY3Rpb24tPkdldCMjTUVUSE9EKGZyb20sIGZpZWxkKSk7IFwKKyAgICBicmVhazsKKworICAgICAgICBIQU5ETEVfVFlQRShJTlQzMiwgSW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRShJTlQ2NCwgSW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIFVJbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgVUludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoRkxPQVQsIEZsb2F0KTsKKyAgICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBEb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRShCT09MLCBCb29sKTsKKyAgICAgICAgSEFORExFX1RZUEUoU1RSSU5HLCBTdHJpbmcpOworICAgICAgICBIQU5ETEVfVFlQRShFTlVNLCBFbnVtKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgY29uc3QgTWVzc2FnZSYgZnJvbV9jaGlsZCA9IGZyb21fcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShmcm9tLCBmaWVsZCk7CisgICAgICAgICAgaWYgKGZyb21fcmVmbGVjdGlvbiA9PSB0b19yZWZsZWN0aW9uKSB7CisgICAgICAgICAgICB0b19yZWZsZWN0aW9uCisgICAgICAgICAgICAgICAgLT5NdXRhYmxlTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdG8sIGZpZWxkLCBmcm9tX2NoaWxkLkdldFJlZmxlY3Rpb24oKS0+R2V0TWVzc2FnZUZhY3RvcnkoKSkKKyAgICAgICAgICAgICAgICAtPk1lcmdlRnJvbShmcm9tX2NoaWxkKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG9fcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UodG8sIGZpZWxkKS0+TWVyZ2VGcm9tKGZyb21fY2hpbGQpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIWZyb21fcmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhmcm9tKS5lbXB0eSgpKSB7CisgICAgdG9fcmVmbGVjdGlvbi0+TXV0YWJsZVVua25vd25GaWVsZHModG8pLT5NZXJnZUZyb20oCisgICAgICAgIGZyb21fcmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhmcm9tKSk7CisgIH0KK30KKwordm9pZCBSZWZsZWN0aW9uT3BzOjpDbGVhcihNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBHZXRSZWZsZWN0aW9uT3JEaWUoKm1lc3NhZ2UpOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkc09taXRTdHJpcHBlZCgqbWVzc2FnZSwgJmZpZWxkcyk7CisgIGZvciAoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA6IGZpZWxkcykgeworICAgIHJlZmxlY3Rpb24tPkNsZWFyRmllbGQobWVzc2FnZSwgZmllbGQpOworICB9CisKKyAgaWYgKHJlZmxlY3Rpb24tPkdldEludGVybmFsTWV0YWRhdGEoKm1lc3NhZ2UpLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIHJlZmxlY3Rpb24tPk11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UpLT5DbGVhcigpOworICB9Cit9CisKK2Jvb2wgUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBib29sIGNoZWNrX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNoZWNrX2Rlc2NlbmRhbnRzKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IEdldFJlZmxlY3Rpb25PckRpZShtZXNzYWdlKTsKKyAgaWYgKGNvbnN0IGludCBmaWVsZF9jb3VudCA9IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCkpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGJlZ2luID0gZGVzY3JpcHRvci0+ZmllbGQoMCk7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBlbmQgPSBiZWdpbiArIGZpZWxkX2NvdW50OworICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZGVzY3JpcHRvci0+ZmllbGQoZmllbGRfY291bnQgLSAxKSwgZW5kIC0gMSk7CisKKyAgICBpZiAoY2hlY2tfZmllbGRzKSB7CisgICAgICAvLyBDaGVjayByZXF1aXJlZCBmaWVsZHMgb2YgdGhpcyBtZXNzYWdlLgorICAgICAgZm9yIChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gYmVnaW47IGZpZWxkICE9IGVuZDsgKytmaWVsZCkgeworICAgICAgICBpZiAoZmllbGQtPmlzX3JlcXVpcmVkKCkgJiYgIXJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIGZpZWxkKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChjaGVja19kZXNjZW5kYW50cykgeworICAgICAgZm9yIChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gYmVnaW47IGZpZWxkICE9IGVuZDsgKytmaWVsZCkgeworICAgICAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUgPSBmaWVsZC0+bWVzc2FnZV90eXBlKCk7CisgICAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UobWVzc2FnZV90eXBlLT5vcHRpb25zKCkubWFwX2VudHJ5KCkpKSB7CisgICAgICAgICAgICBpZiAobWVzc2FnZV90eXBlLT5maWVsZCgxKS0+Y3BwX3R5cGUoKSA9PQorICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICAgICAgICAgIGNvbnN0IE1hcEZpZWxkQmFzZSogbWFwX2ZpZWxkID0KKyAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldE1hcERhdGEobWVzc2FnZSwgZmllbGQpOworICAgICAgICAgICAgICBpZiAobWFwX2ZpZWxkLT5Jc01hcFZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICBNYXBJdGVyYXRvciBpdChjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZSksIGZpZWxkKTsKKyAgICAgICAgICAgICAgICBNYXBJdGVyYXRvciBlbmRfbWFwKGNvbnN0X2Nhc3Q8TWVzc2FnZSo+KCZtZXNzYWdlKSwgZmllbGQpOworICAgICAgICAgICAgICAgIGZvciAobWFwX2ZpZWxkLT5NYXBCZWdpbigmaXQpLCBtYXBfZmllbGQtPk1hcEVuZCgmZW5kX21hcCk7CisgICAgICAgICAgICAgICAgICAgICBpdCAhPSBlbmRfbWFwOyArK2l0KSB7CisgICAgICAgICAgICAgICAgICBpZiAoIWl0LkdldFZhbHVlUmVmKCkuR2V0TWVzc2FnZVZhbHVlKCkuSXNJbml0aWFsaXplZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgc2l6ZSA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgICAgICAgICBpZiAoIXJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBmaWVsZCwgaikKKyAgICAgICAgICAgICAgICAgICAgICAgLklzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgZmllbGQpKSB7CisgICAgICAgICAgICBpZiAoIXJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpLklzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChjaGVja19kZXNjZW5kYW50cyAmJiByZWZsZWN0aW9uLT5IYXNFeHRlbnNpb25TZXQobWVzc2FnZSkgJiYKKyAgICAgICFyZWZsZWN0aW9uLT5HZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuSXNJbml0aWFsaXplZCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBHZXRSZWZsZWN0aW9uT3JEaWUobWVzc2FnZSk7CisKKyAgLy8gQ2hlY2sgcmVxdWlyZWQgZmllbGRzIG9mIHRoaXMgbWVzc2FnZS4KKyAgeworICAgIGNvbnN0IGludCBmaWVsZF9jb3VudCA9IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZF9jb3VudDsgaSsrKSB7CisgICAgICBpZiAoZGVzY3JpcHRvci0+ZmllbGQoaSktPmlzX3JlcXVpcmVkKCkpIHsKKyAgICAgICAgaWYgKCFyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBkZXNjcmlwdG9yLT5maWVsZChpKSkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDaGVjayB0aGF0IHN1Yi1tZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgLy8gU2hvdWxkIGJlIHNhZmUgdG8gc2tpcCBzdHJpcHBlZCBmaWVsZHMgYmVjYXVzZSByZXF1aXJlZCBmaWVsZHMgYXJlIG5vdAorICAvLyBzdHJpcHBlZC4KKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkc09taXRTdHJpcHBlZChtZXNzYWdlLCAmZmllbGRzKTsKKyAgZm9yIChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkIDogZmllbGRzKSB7CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisKKyAgICAgIGlmIChmaWVsZC0+aXNfbWFwKCkpIHsKKyAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZV9maWVsZCA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+ZmllbGQoMSk7CisgICAgICAgIGlmICh2YWx1ZV9maWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgICAgIGNvbnN0IE1hcEZpZWxkQmFzZSogbWFwX2ZpZWxkID0KKyAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0TWFwRGF0YShtZXNzYWdlLCBmaWVsZCk7CisgICAgICAgICAgaWYgKG1hcF9maWVsZC0+SXNNYXBWYWxpZCgpKSB7CisgICAgICAgICAgICBNYXBJdGVyYXRvciBpdGVyKGNvbnN0X2Nhc3Q8TWVzc2FnZSo+KCZtZXNzYWdlKSwgZmllbGQpOworICAgICAgICAgICAgTWFwSXRlcmF0b3IgZW5kKGNvbnN0X2Nhc3Q8TWVzc2FnZSo+KCZtZXNzYWdlKSwgZmllbGQpOworICAgICAgICAgICAgZm9yIChtYXBfZmllbGQtPk1hcEJlZ2luKCZpdGVyKSwgbWFwX2ZpZWxkLT5NYXBFbmQoJmVuZCk7CisgICAgICAgICAgICAgICAgIGl0ZXIgIT0gZW5kOyArK2l0ZXIpIHsKKyAgICAgICAgICAgICAgaWYgKCFpdGVyLkdldFZhbHVlUmVmKCkuR2V0TWVzc2FnZVZhbHVlKCkuSXNJbml0aWFsaXplZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgIGludCBzaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkKTsKKworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgICAgIGlmICghcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkLCBqKQorICAgICAgICAgICAgICAgICAgIC5Jc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBmaWVsZCkuSXNJbml0aWFsaXplZCgpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIElzTWFwVmFsdWVNZXNzYWdlVHlwZWQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBtYXBfZmllbGQpIHsKKyAgcmV0dXJuIG1hcF9maWVsZC0+bWVzc2FnZV90eXBlKCktPmZpZWxkKDEpLT5jcHBfdHlwZSgpID09CisgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTsKK30KKwordm9pZCBSZWZsZWN0aW9uT3BzOjpEaXNjYXJkVW5rbm93bkZpZWxkcyhNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBHZXRSZWZsZWN0aW9uT3JEaWUoKm1lc3NhZ2UpOworCisgIHJlZmxlY3Rpb24tPk11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UpLT5DbGVhcigpOworCisgIC8vIFdhbGsgdGhyb3VnaCB0aGUgZmllbGRzIG9mIHRoaXMgbWVzc2FnZSBhbmQgRGlzY2FyZFVua25vd25GaWVsZHMgb24gYW55CisgIC8vIG1lc3NhZ2VzIHByZXNlbnQuCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZSwgJmZpZWxkcyk7CisgIGZvciAoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA6IGZpZWxkcykgeworICAgIC8vIFNraXAgb3ZlciBub24tbWVzc2FnZSBmaWVsZHMuCisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLy8gRGlzY2FyZCB0aGUgdW5rbm93biBmaWVsZHMgaW4gbWFwcyB0aGF0IGNvbnRhaW4gbWVzc2FnZSB2YWx1ZXMuCisgICAgaWYgKGZpZWxkLT5pc19tYXAoKSAmJiBJc01hcFZhbHVlTWVzc2FnZVR5cGVkKGZpZWxkKSkgeworICAgICAgY29uc3QgTWFwRmllbGRCYXNlKiBtYXBfZmllbGQgPQorICAgICAgICAgIHJlZmxlY3Rpb24tPk11dGFibGVNYXBEYXRhKG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgIGlmIChtYXBfZmllbGQtPklzTWFwVmFsaWQoKSkgeworICAgICAgICBNYXBJdGVyYXRvciBpdGVyKG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgICAgTWFwSXRlcmF0b3IgZW5kKG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgICAgZm9yIChtYXBfZmllbGQtPk1hcEJlZ2luKCZpdGVyKSwgbWFwX2ZpZWxkLT5NYXBFbmQoJmVuZCk7IGl0ZXIgIT0gZW5kOworICAgICAgICAgICAgICsraXRlcikgeworICAgICAgICAgIGl0ZXIuTXV0YWJsZVZhbHVlUmVmKCktPk11dGFibGVNZXNzYWdlVmFsdWUoKS0+RGlzY2FyZFVua25vd25GaWVsZHMoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gRGlzY2FyZCBldmVyeSB1bmtub3duIGZpZWxkIGluc2lkZSBtZXNzYWdlcyBpbiBhIHJlcGVhdGVkIGZpZWxkLgorICAgIH0gZWxzZSBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIGludCBzaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKCptZXNzYWdlLCBmaWVsZCk7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgICByZWZsZWN0aW9uLT5NdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkLCBqKQorICAgICAgICAgICAgLT5EaXNjYXJkVW5rbm93bkZpZWxkcygpOworICAgICAgfQorICAgICAgLy8gRGlzY2FyZCB0aGUgdW5rbm93biBmaWVsZHMgaW5zaWRlIGFuIG9wdGlvbmFsIG1lc3NhZ2UuCisgICAgfSBlbHNlIHsKKyAgICAgIHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkKS0+RGlzY2FyZFVua25vd25GaWVsZHMoKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIFN1Yk1lc3NhZ2VQcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgeworICBzdGQ6OnN0cmluZyByZXN1bHQocHJlZml4KTsKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIHJlc3VsdC5hcHBlbmQoIigiKTsKKyAgICByZXN1bHQuYXBwZW5kKGZpZWxkLT5mdWxsX25hbWUoKSk7CisgICAgcmVzdWx0LmFwcGVuZCgiKSIpOworICB9IGVsc2UgeworICAgIHJlc3VsdC5hcHBlbmQoZmllbGQtPm5hbWUoKSk7CisgIH0KKyAgaWYgKGluZGV4ICE9IC0xKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiWyIpOworICAgIHJlc3VsdC5hcHBlbmQoU3RyQ2F0KGluZGV4KSk7CisgICAgcmVzdWx0LmFwcGVuZCgiXSIpOworICB9CisgIHJlc3VsdC5hcHBlbmQoIi4iKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBSZWZsZWN0aW9uT3BzOjpGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGVycm9ycykgeworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBHZXRSZWZsZWN0aW9uT3JEaWUobWVzc2FnZSk7CisKKyAgLy8gQ2hlY2sgcmVxdWlyZWQgZmllbGRzIG9mIHRoaXMgbWVzc2FnZS4KKyAgeworICAgIGNvbnN0IGludCBmaWVsZF9jb3VudCA9IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZF9jb3VudDsgaSsrKSB7CisgICAgICBpZiAoZGVzY3JpcHRvci0+ZmllbGQoaSktPmlzX3JlcXVpcmVkKCkpIHsKKyAgICAgICAgaWYgKCFyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBkZXNjcmlwdG9yLT5maWVsZChpKSkpIHsKKyAgICAgICAgICBlcnJvcnMtPnB1c2hfYmFjayhwcmVmaXggKyBkZXNjcmlwdG9yLT5maWVsZChpKS0+bmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENoZWNrIHN1Yi1tZXNzYWdlcy4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzT21pdFN0cmlwcGVkKG1lc3NhZ2UsICZmaWVsZHMpOworICBmb3IgKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgOiBmaWVsZHMpIHsKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKworICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgIGludCBzaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkKTsKKworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0KKyAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkLCBqKTsKKyAgICAgICAgICBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoc3ViX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Yk1lc3NhZ2VQcmVmaXgocHJlZml4LCBmaWVsZCwgaiksIGVycm9ycyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBmaWVsZCk7CisgICAgICAgIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhzdWJfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Yk1lc3NhZ2VQcmVmaXgocHJlZml4LCBmaWVsZCwgLTEpLCBlcnJvcnMpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIEdlbmVyaWNTd2FwKE1lc3NhZ2UqIGxocywgTWVzc2FnZSogcmhzKSB7CisjaWZuZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICBHT09HTEVfRENIRUNLKEFyZW5hOjpJbnRlcm5hbEdldE93bmluZ0FyZW5hKGxocykgIT0KKyAgICAgICAgIEFyZW5hOjpJbnRlcm5hbEdldE93bmluZ0FyZW5hKHJocykpOworICBHT09HTEVfRENIRUNLKEFyZW5hOjpJbnRlcm5hbEdldE93bmluZ0FyZW5hKGxocykgIT0gbnVsbHB0ciB8fAorICAgICAgICAgQXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEocmhzKSAhPSBudWxscHRyKTsKKyNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAvLyBBdCBsZWFzdCBvbmUgb2YgdGhlc2UgbXVzdCBoYXZlIGFuIGFyZW5hLCBzbyBtYWtlIGByaHNgIHBvaW50IHRvIGl0LgorICBBcmVuYSogYXJlbmEgPSBBcmVuYTo6SW50ZXJuYWxHZXRPd25pbmdBcmVuYShyaHMpOworICBpZiAoYXJlbmEgPT0gbnVsbHB0cikgeworICAgIHN0ZDo6c3dhcChsaHMsIHJocyk7CisgICAgYXJlbmEgPSBBcmVuYTo6SW50ZXJuYWxHZXRPd25pbmdBcmVuYShyaHMpOworICB9CisKKyAgLy8gSW1wcm92ZSBlZmZpY2llbmN5IGJ5IHBsYWNpbmcgdGhlIHRlbXBvcmFyeSBvbiBhbiBhcmVuYSBzbyB0aGF0IG1lc3NhZ2VzCisgIC8vIGFyZSBjb3BpZWQgdHdpY2UgcmF0aGVyIHRoYW4gdGhyZWUgdGltZXMuCisgIE1lc3NhZ2UqIHRtcCA9IHJocy0+TmV3KGFyZW5hKTsKKyAgdG1wLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oKmxocyk7CisgIGxocy0+Q2xlYXIoKTsKKyAgbGhzLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oKnJocyk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgIHJocy0+Q2xlYXIoKTsKKyAgcmhzLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oKnRtcCk7CisgIGlmIChhcmVuYSA9PSBudWxscHRyKSBkZWxldGUgdG1wOworI2Vsc2UgICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgcmhzLT5HZXRSZWZsZWN0aW9uKCktPlN3YXAodG1wLCByaHMpOworI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0NTcwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaApAQCAtMCwwICsxLDkyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBoZWFkZXIgaXMgbG9naWNhbGx5IGludGVybmFsLCBidXQgaXMgbWFkZSBwdWJsaWMgYmVjYXVzZSBpdCBpcyB1c2VkCisvLyBmcm9tIHByb3RvY29sLWNvbXBpbGVyLWdlbmVyYXRlZCBjb2RlLCB3aGljaCBtYXkgcmVzaWRlIGluIG90aGVyIGNvbXBvbmVudHMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1JFRkxFQ1RJT05fT1BTX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUkVGTEVDVElPTl9PUFNfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKworI2lmZGVmIFNXSUcKKyNlcnJvciAiWW91IGNhbm5vdCBTV0lHIHByb3RvIGhlYWRlcnMiCisjZW5kaWYKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEJhc2ljIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIHVzaW5nIHJlZmxlY3Rpb24uCisvLyBUaGVzZSBjYW4gYmUgdXNlZCBhcyBhIGNoZWFwIHdheSB0byBpbXBsZW1lbnQgdGhlIGNvcnJlc3BvbmRpbmcKKy8vIG1ldGhvZHMgb2YgdGhlIE1lc3NhZ2UgaW50ZXJmYWNlLCB0aG91Z2ggdGhleSBhcmUgbGlrZWx5IHRvIGJlCisvLyBzbG93ZXIgdGhhbiBpbXBsZW1lbnRhdGlvbnMgdGFpbG9yZWQgZm9yIHRoZSBzcGVjaWZpYyBtZXNzYWdlIHR5cGUuCisvLworLy8gVGhpcyBjbGFzcyBzaG91bGQgc3RheSBsaW1pdGVkIHRvIG9wZXJhdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAorLy8gdGhlIE1lc3NhZ2UgaW50ZXJmYWNlLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgcmVhbGx5IGEgbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgb25seSBzdGF0aWMgbWV0aG9kcy4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBSZWZsZWN0aW9uT3BzIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIENvcHkoY29uc3QgTWVzc2FnZSYgZnJvbSwgTWVzc2FnZSogdG8pOworICBzdGF0aWMgdm9pZCBNZXJnZShjb25zdCBNZXNzYWdlJiBmcm9tLCBNZXNzYWdlKiB0byk7CisgIHN0YXRpYyB2b2lkIENsZWFyKE1lc3NhZ2UqIG1lc3NhZ2UpOworICBzdGF0aWMgYm9vbCBJc0luaXRpYWxpemVkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworICBzdGF0aWMgYm9vbCBJc0luaXRpYWxpemVkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGJvb2wgY2hlY2tfZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2hlY2tfZGVzY2VuZGFudHMpOworICBzdGF0aWMgdm9pZCBEaXNjYXJkVW5rbm93bkZpZWxkcyhNZXNzYWdlKiBtZXNzYWdlKTsKKworICAvLyBGaW5kcyBhbGwgdW5zZXQgcmVxdWlyZWQgZmllbGRzIGluIHRoZSBtZXNzYWdlIGFuZCBhZGRzIHRoZWlyIGZ1bGwKKyAgLy8gcGF0aHMgKGUuZy4gImZvby5iYXJbNV0uYmF6IikgdG8gKm5hbWVzLiAgInByZWZpeCIgd2lsbCBiZSBhdHRhY2hlZCB0bworICAvLyB0aGUgZnJvbnQgb2YgZWFjaCBuYW1lLgorICBzdGF0aWMgdm9pZCBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGVycm9ycyk7CisKKyBwcml2YXRlOgorICAvLyBBbGwgbWV0aG9kcyBhcmUgc3RhdGljLiAgTm8gbmVlZCB0byBjb25zdHJ1Y3QuCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZWZsZWN0aW9uT3BzKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1JFRkxFQ1RJT05fT1BTX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzY2U0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw1NDYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgU2FuaXR5Q2hlY2spIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBDb3B5KSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZSwgbWVzc2FnZTI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisKKyAgUmVmbGVjdGlvbk9wczo6Q29weShtZXNzYWdlLCAmbWVzc2FnZTIpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworCisgIC8vIENvcHlpbmcgZnJvbSBzZWxmIHNob3VsZCBiZSBhIG5vLW9wLgorICBSZWZsZWN0aW9uT3BzOjpDb3B5KG1lc3NhZ2UyLCAmbWVzc2FnZTIpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgQ29weUV4dGVuc2lvbnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UsIG1lc3NhZ2UyOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKworICBSZWZsZWN0aW9uT3BzOjpDb3B5KG1lc3NhZ2UsICZtZXNzYWdlMik7CisKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBDb3B5T25lb2YpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZSwgbWVzc2FnZTI7CisgIFRlc3RVdGlsOjpTZXRPbmVvZjEoJm1lc3NhZ2UpOworICBSZWZsZWN0aW9uT3BzOjpDb3B5KG1lc3NhZ2UsICZtZXNzYWdlMik7CisgIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDEobWVzc2FnZTIpOworCisgIFRlc3RVdGlsOjpTZXRPbmVvZjIoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQyKG1lc3NhZ2UpOworICBSZWZsZWN0aW9uT3BzOjpDb3B5KG1lc3NhZ2UsICZtZXNzYWdlMik7CisgIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDIobWVzc2FnZTIpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBNZXJnZSkgeworICAvLyBOb3RlOiAgQ29weSBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBNZXJnZSgpIHNvIHRlY2huaWNhbGx5IHRoZSBDb3B5CisgIC8vICAgdGVzdCBhbHJlYWR5IHRlc3RlZCBtb3N0IG9mIHRoaXMuCisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlLCBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKworICAvLyBUaGlzIGZpZWxkIHdpbGwgdGVzdCBtZXJnaW5nIGludG8gYW4gZW1wdHkgc3BvdC4KKyAgbWVzc2FnZTIuc2V0X29wdGlvbmFsX2ludDMyKG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIoKSk7CisgIG1lc3NhZ2UuY2xlYXJfb3B0aW9uYWxfaW50MzIoKTsKKworICAvLyBUaGlzIHRlc3RzIG92ZXJ3cml0aW5nLgorICBtZXNzYWdlMi5zZXRfb3B0aW9uYWxfc3RyaW5nKG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCkpOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9zdHJpbmcoInNvbWV0aGluZyBlbHNlIik7CisKKyAgLy8gVGhpcyB0ZXN0cyBjb25jYXRlbmF0aW5nLgorICBtZXNzYWdlMi5hZGRfcmVwZWF0ZWRfaW50MzIobWVzc2FnZS5yZXBlYXRlZF9pbnQzMigxKSk7CisgIGludDMyX3QgaSA9IG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIoMCk7CisgIG1lc3NhZ2UuY2xlYXJfcmVwZWF0ZWRfaW50MzIoKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfaW50MzIoaSk7CisKKyAgUmVmbGVjdGlvbk9wczo6TWVyZ2UobWVzc2FnZTIsICZtZXNzYWdlKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBNZXJnZUV4dGVuc2lvbnMpIHsKKyAgLy8gTm90ZTogIENvcHkgaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgTWVyZ2UoKSBzbyB0ZWNobmljYWxseSB0aGUgQ29weQorICAvLyAgIHRlc3QgYWxyZWFkeSB0ZXN0ZWQgbW9zdCBvZiB0aGlzLgorCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlLCBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisKKyAgLy8gVGhpcyBmaWVsZCB3aWxsIHRlc3QgbWVyZ2luZyBpbnRvIGFuIGVtcHR5IHNwb3QuCisgIG1lc3NhZ2UyLlNldEV4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24sCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uKSk7CisgIG1lc3NhZ2UuQ2xlYXJFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbik7CisKKyAgLy8gVGhpcyB0ZXN0cyBvdmVyd3JpdGluZy4KKyAgbWVzc2FnZTIuU2V0RXh0ZW5zaW9uKAorICAgICAgdW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24sCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbikpOworICBtZXNzYWdlLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiwgInNvbWV0aGluZyBlbHNlIik7CisKKyAgLy8gVGhpcyB0ZXN0cyBjb25jYXRlbmF0aW5nLgorICBtZXNzYWdlMi5BZGRFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uLAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwgMSkpOworICBpbnQzMl90IGkgPSBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uLCAwKTsKKyAgbWVzc2FnZS5DbGVhckV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uKTsKKyAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwgaSk7CisKKyAgUmVmbGVjdGlvbk9wczo6TWVyZ2UobWVzc2FnZTIsICZtZXNzYWdlKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgTWVyZ2VVbmtub3duKSB7CisgIC8vIFRlc3QgdGhhdCB0aGUgbWVzc2FnZXMnIFVua25vd25GaWVsZFNldHMgYXJlIGNvcnJlY3RseSBtZXJnZWQuCisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgbWVzc2FnZTEubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMTIzNCwgMSk7CisgIG1lc3NhZ2UyLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEyMzQsIDIpOworCisgIFJlZmxlY3Rpb25PcHM6Ok1lcmdlKG1lc3NhZ2UyLCAmbWVzc2FnZTEpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlMS51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwKKyAgICAgICAgICAgIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGQoMCkudHlwZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGQoMCkudmFyaW50KCkpOworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwKKyAgICAgICAgICAgIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGQoMSkudHlwZSgpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGQoMSkudmFyaW50KCkpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBNZXJnZU9uZW9mKSB7CisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgVGVzdFV0aWw6OlNldE9uZW9mMSgmbWVzc2FnZTEpOworCisgIC8vIE1lcmdlIHRvIGVtcHR5IG1lc3NhZ2UKKyAgUmVmbGVjdGlvbk9wczo6TWVyZ2UobWVzc2FnZTEsICZtZXNzYWdlMik7CisgIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDEobWVzc2FnZTIpOworCisgIC8vIE1lcmdlIHdpdGggdGhlIHNhbWUgb25lb2YgZmllbGRzCisgIFJlZmxlY3Rpb25PcHM6Ok1lcmdlKG1lc3NhZ2UxLCAmbWVzc2FnZTIpOworICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQxKG1lc3NhZ2UyKTsKKworICAvLyBNZXJnZSB3aXRoIGRpZmZlcmVudCBvbmVvZiBmaWVsZHMKKyAgVGVzdFV0aWw6OlNldE9uZW9mMigmbWVzc2FnZTEpOworICBSZWZsZWN0aW9uT3BzOjpNZXJnZShtZXNzYWdlMSwgJm1lc3NhZ2UyKTsKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MihtZXNzYWdlMik7Cit9CisKKyNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBNZXJnZUZyb21TZWxmKSB7CisgIC8vIE5vdGU6ICBDb3B5IGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIE1lcmdlKCkgc28gdGVjaG5pY2FsbHkgdGhlIENvcHkKKyAgLy8gICB0ZXN0IGFscmVhZHkgdGVzdGVkIG1vc3Qgb2YgdGhpcy4KKworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgRVhQRUNUX0RFQVRIKFJlZmxlY3Rpb25PcHM6Ok1lcmdlKG1lc3NhZ2UsICZtZXNzYWdlKSwgIiZmcm9tIik7Cit9CisKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgQ2xlYXIpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworCisgIFJlZmxlY3Rpb25PcHM6OkNsZWFyKCZtZXNzYWdlKTsKKworICBUZXN0VXRpbDo6RXhwZWN0Q2xlYXIobWVzc2FnZSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBnZXR0aW5nIGVtYmVkZGVkIG1lc3NhZ2VzIHJldHVybnMgdGhlIG9iamVjdHMgY3JlYXRlZCBkdXJpbmcKKyAgLy8gU2V0QWxsRmllbGRzKCkgcmF0aGVyIHRoYW4gZGVmYXVsdCBpbnN0YW5jZXMuCisgIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6T3B0aW9uYWxHcm91cDo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxncm91cCgpKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdF9pbXBvcnQ6OkltcG9ydE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlKCkpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBDbGVhckV4dGVuc2lvbnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworCisgIFJlZmxlY3Rpb25PcHM6OkNsZWFyKCZtZXNzYWdlKTsKKworICBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgZ2V0dGluZyBlbWJlZGRlZCBtZXNzYWdlcyByZXR1cm5zIHRoZSBvYmplY3RzIGNyZWF0ZWQgZHVyaW5nCisgIC8vIFNldEFsbEV4dGVuc2lvbnMoKSByYXRoZXIgdGhhbiBkZWZhdWx0IGluc3RhbmNlcy4KKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6T3B0aW9uYWxHcm91cF9leHRlbnNpb246OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfTkUoCisgICAgICAmdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdF9pbXBvcnQ6OkltcG9ydE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIENsZWFyVW5rbm93bikgeworICAvLyBUZXN0IHRoYXQgdGhlIG1lc3NhZ2UncyBVbmtub3duRmllbGRTZXQgaXMgY29ycmVjdGx5IGNsZWFyZWQuCisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2U7CisgIG1lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMTIzNCwgMSk7CisKKyAgUmVmbGVjdGlvbk9wczo6Q2xlYXIoJm1lc3NhZ2UpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIENsZWFyT25lb2YpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKworICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZDbGVhcihtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OlNldE9uZW9mMSgmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDEobWVzc2FnZSk7CisgIFJlZmxlY3Rpb25PcHM6OkNsZWFyKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mQ2xlYXIobWVzc2FnZSk7CisKKyAgVGVzdFV0aWw6OlNldE9uZW9mMSgmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDEobWVzc2FnZSk7CisgIFRlc3RVdGlsOjpTZXRPbmVvZjIoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQyKG1lc3NhZ2UpOworICBSZWZsZWN0aW9uT3BzOjpDbGVhcigmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RPbmVvZkNsZWFyKG1lc3NhZ2UpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBEaXNjYXJkVW5rbm93bkZpZWxkcykgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworCisgIC8vIFNldCBzb21lIHVua25vd24gZmllbGRzIGluIG1lc3NhZ2UuCisgIG1lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMTIzNDU2LCA2NTQzMjEpOworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKQorICAgICAgLT5tdXRhYmxlX3Vua25vd25fZmllbGRzKCkKKyAgICAgIC0+QWRkVmFyaW50KDEyMzQ1NiwgNjU0MzIxKTsKKyAgbWVzc2FnZS5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApCisgICAgICAtPm11dGFibGVfdW5rbm93bl9maWVsZHMoKQorICAgICAgLT5BZGRWYXJpbnQoMTIzNDU2LCA2NTQzMjEpOworCisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLAorICAgICAgICAgICAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLAorICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKS51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworCisgIC8vIERpc2NhcmQgdGhlbS4KKyAgUmVmbGVjdGlvbk9wczo6RGlzY2FyZFVua25vd25GaWVsZHMoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgwLAorICAgICAgICAgICAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgwLAorICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKS51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBEaXNjYXJkVW5rbm93bkV4dGVuc2lvbnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKworICAvLyBTZXQgc29tZSB1bmtub3duIGZpZWxkcy4KKyAgbWVzc2FnZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgxMjM0NTYsIDY1NDMyMSk7CisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgLT5tdXRhYmxlX3Vua25vd25fZmllbGRzKCkKKyAgICAgIC0+QWRkVmFyaW50KDEyMzQ1NiwgNjU0MzIxKTsKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24sIDApCisgICAgICAtPm11dGFibGVfdW5rbm93bl9maWVsZHMoKQorICAgICAgLT5BZGRWYXJpbnQoMTIzNDU2LCA2NTQzMjEpOworCisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgICAgIC51bmtub3duX2ZpZWxkcygpCisgICAgICAgICAgICAgICAgICAgLmZpZWxkX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24sIDApCisgICAgICAgICAgICAgICAgLnVua25vd25fZmllbGRzKCkKKyAgICAgICAgICAgICAgICAuZmllbGRfY291bnQoKSk7CisKKyAgLy8gRGlzY2FyZCB0aGVtLgorICBSZWZsZWN0aW9uT3BzOjpEaXNjYXJkVW5rbm93bkZpZWxkcygmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgICAgIC51bmtub3duX2ZpZWxkcygpCisgICAgICAgICAgICAgICAgICAgLmZpZWxkX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMCwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24sIDApCisgICAgICAgICAgICAgICAgLnVua25vd25fZmllbGRzKCkKKyAgICAgICAgICAgICAgICAuZmllbGRfY291bnQoKSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIElzSW5pdGlhbGl6ZWQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOworCisgIEVYUEVDVF9GQUxTRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKyAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSwgdHJ1ZSwgZmFsc2UpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCBmYWxzZSwgdHJ1ZSkpOworICBtZXNzYWdlLnNldF9hKDEpOworICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7CisgIEVYUEVDVF9GQUxTRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UsIHRydWUsIHRydWUpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCBmYWxzZSwgdHJ1ZSkpOworICBtZXNzYWdlLnNldF9iKDIpOworICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7CisgIEVYUEVDVF9GQUxTRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UsIHRydWUsIHRydWUpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCBmYWxzZSwgdHJ1ZSkpOworICBtZXNzYWdlLnNldF9jKDMpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCB0cnVlLCBmYWxzZSkpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UsIGZhbHNlLCB0cnVlKSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIEZvcmVpZ25Jc0luaXRpYWxpemVkKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWRGb3JlaWduIG1lc3NhZ2U7CisKKyAgLy8gU3RhcnRzIG91dCBpbml0aWFsaXplZCBiZWNhdXNlIHRoZSBmb3JlaWduIG1lc3NhZ2UgaXMgaXRzZWxmIGFuIG9wdGlvbmFsCisgIC8vIGZpZWxkLgorICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCBmYWxzZSwgdHJ1ZSkpOworCisgIC8vIE9uY2Ugd2UgY3JlYXRlIHRoYXQgZmllbGQsIHRoZSBtZXNzYWdlIGlzIG5vIGxvbmdlciBpbml0aWFsaXplZC4KKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKTsKKyAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UsIHRydWUsIGZhbHNlKSk7CisgIEVYUEVDVF9GQUxTRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UsIGZhbHNlLCB0cnVlKSk7CisKKyAgLy8gSW5pdGlhbGl6ZSBpdC4gIE5vdyB3ZSdyZSBpbml0aWFsaXplZC4KKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2EoMSk7CisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCktPnNldF9iKDIpOworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpLT5zZXRfYygzKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7CisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSwgdHJ1ZSwgZmFsc2UpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCBmYWxzZSwgdHJ1ZSkpOworCisgIC8vIEFkZCBhIHJlcGVhdGVkIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UuICBObyBsb25nZXIgaW5pdGlhbGl6ZWQuCisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQqIHN1Yl9tZXNzYWdlID0gbWVzc2FnZS5hZGRfcmVwZWF0ZWRfbWVzc2FnZSgpOworICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7CisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSwgdHJ1ZSwgZmFsc2UpKTsKKyAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSwgZmFsc2UsIHRydWUpKTsKKworICAvLyBJbml0aWFsaXplIHRoYXQgcmVwZWF0ZWQgdmVyc2lvbi4KKyAgc3ViX21lc3NhZ2UtPnNldF9hKDEpOworICBzdWJfbWVzc2FnZS0+c2V0X2IoMik7CisgIHN1Yl9tZXNzYWdlLT5zZXRfYygzKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7CisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSwgdHJ1ZSwgZmFsc2UpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCBmYWxzZSwgdHJ1ZSkpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBFeHRlbnNpb25Jc0luaXRpYWxpemVkKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworCisgIC8vIFN0YXJ0cyBvdXQgaW5pdGlhbGl6ZWQgYmVjYXVzZSB0aGUgZm9yZWlnbiBtZXNzYWdlIGlzIGl0c2VsZiBhbiBvcHRpb25hbAorICAvLyBmaWVsZC4KKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7CisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSwgdHJ1ZSwgZmFsc2UpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCBmYWxzZSwgdHJ1ZSkpOworCisgIC8vIE9uY2Ugd2UgY3JlYXRlIHRoYXQgZmllbGQsIHRoZSBtZXNzYWdlIGlzIG5vIGxvbmdlciBpbml0aWFsaXplZC4KKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OnNpbmdsZSk7CisgIEVYUEVDVF9GQUxTRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCB0cnVlLCBmYWxzZSkpOworICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCBmYWxzZSwgdHJ1ZSkpOworCisgIC8vIEluaXRpYWxpemUgaXQuICBOb3cgd2UncmUgaW5pdGlhbGl6ZWQuCisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjpzaW5nbGUpLT5zZXRfYSgxKTsKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OnNpbmdsZSktPnNldF9iKDIpOworICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6c2luZ2xlKS0+c2V0X2MoMyk7CisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UsIHRydWUsIGZhbHNlKSk7CisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSwgZmFsc2UsIHRydWUpKTsKKworICAvLyBBZGQgYSByZXBlYXRlZCB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlLiAgTm8gbG9uZ2VyIGluaXRpYWxpemVkLgorICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSk7CisgIEVYUEVDVF9GQUxTRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCB0cnVlLCBmYWxzZSkpOworICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCBmYWxzZSwgdHJ1ZSkpOworCisgIC8vIEluaXRpYWxpemUgdGhhdCByZXBlYXRlZCB2ZXJzaW9uLgorICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6bXVsdGksIDApLT5zZXRfYSgxKTsKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6Om11bHRpLCAwKS0+c2V0X2IoMik7CisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSwgMCktPnNldF9jKDMpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCB0cnVlLCBmYWxzZSkpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UsIGZhbHNlLCB0cnVlKSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIE9uZW9mSXNJbml0aWFsaXplZCkgeworICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkT25lb2YgbWVzc2FnZTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7CisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSwgdHJ1ZSwgZmFsc2UpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCBmYWxzZSwgdHJ1ZSkpOworCisgIG1lc3NhZ2UubXV0YWJsZV9mb29fbWVzc2FnZSgpOworICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7CisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSwgdHJ1ZSwgZmFsc2UpKTsKKyAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSwgZmFsc2UsIHRydWUpKTsKKworICBtZXNzYWdlLnNldF9mb29faW50KDEpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCB0cnVlLCBmYWxzZSkpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UsIGZhbHNlLCB0cnVlKSk7CisKKyAgbWVzc2FnZS5tdXRhYmxlX2Zvb19tZXNzYWdlKCk7CisgIEVYUEVDVF9GQUxTRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCB0cnVlLCBmYWxzZSkpOworICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCBmYWxzZSwgdHJ1ZSkpOworICBtZXNzYWdlLm11dGFibGVfZm9vX21lc3NhZ2UoKS0+c2V0X3JlcXVpcmVkX2RvdWJsZSgwLjEpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlLCB0cnVlLCBmYWxzZSkpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UsIGZhbHNlLCB0cnVlKSk7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXJyb3JzOworICBSZWZsZWN0aW9uT3BzOjpGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMobWVzc2FnZSwgIiIsICZlcnJvcnMpOworICByZXR1cm4gSm9pbihlcnJvcnMsICIsIik7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycykgeworICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7CisgIEVYUEVDVF9FUSgiYSxiLGMiLCBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMobWVzc2FnZSkpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBGaW5kRm9yZWlnbkluaXRpYWxpemF0aW9uRXJyb3JzKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWRGb3JlaWduIG1lc3NhZ2U7CisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX21lc3NhZ2UoKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfbWVzc2FnZSgpOworICBFWFBFQ1RfRVEoCisgICAgICAib3B0aW9uYWxfbWVzc2FnZS5hLCIKKyAgICAgICJvcHRpb25hbF9tZXNzYWdlLmIsIgorICAgICAgIm9wdGlvbmFsX21lc3NhZ2UuYywiCisgICAgICAicmVwZWF0ZWRfbWVzc2FnZVswXS5hLCIKKyAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmIsIgorICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYywiCisgICAgICAicmVwZWF0ZWRfbWVzc2FnZVsxXS5hLCIKKyAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzFdLmIsIgorICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMV0uYyIsCisgICAgICBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMobWVzc2FnZSkpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBGaW5kRXh0ZW5zaW9uSW5pdGlhbGl6YXRpb25FcnJvcnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjpzaW5nbGUpOworICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSk7CisgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6Om11bHRpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQuc2luZ2xlKS5hLCIKKyAgICAgICIocHJvdG9idWZfdW5pdHRlc3QuVGVzdFJlcXVpcmVkLnNpbmdsZSkuYiwiCisgICAgICAiKHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZC5zaW5nbGUpLmMsIgorICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzBdLmEsIgorICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzBdLmIsIgorICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzBdLmMsIgorICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzFdLmEsIgorICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzFdLmIsIgorICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzFdLmMiLAorICAgICAgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKG1lc3NhZ2UpKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgRmluZE9uZW9mSW5pdGlhbGl6YXRpb25FcnJvcnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZE9uZW9mIG1lc3NhZ2U7CisgIG1lc3NhZ2UubXV0YWJsZV9mb29fbWVzc2FnZSgpOworICBFWFBFQ1RfRVEoImZvb19tZXNzYWdlLnJlcXVpcmVkX2RvdWJsZSIsIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhtZXNzYWdlKSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIEdlbmVyaWNTd2FwKSB7CisgIEFyZW5hIGFyZW5hOworICB7CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICAgIGF1dG8qIGFyZW5hX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPigmYXJlbmEpOworICAgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoYXJlbmFfbWVzc2FnZSk7CisgICAgY29uc3QgdWludDY0X3QgaW5pdGlhbF9hcmVuYV9zaXplID0gYXJlbmEuU3BhY2VVc2VkKCk7CisKKyAgICBHZW5lcmljU3dhcCgmbWVzc2FnZSwgYXJlbmFfbWVzc2FnZSk7CisKKyAgICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworICAgIFRlc3RVdGlsOjpFeHBlY3RDbGVhcigqYXJlbmFfbWVzc2FnZSk7CisgICAgLy8gVGhlIHRlbXAgc2hvdWxkIGJlIGFsbG9jYXRlZCBvbiB0aGUgYXJlbmEgaW4gdGhpcyBjYXNlLgorICAgIEVYUEVDVF9HVChhcmVuYS5TcGFjZVVzZWQoKSwgaW5pdGlhbF9hcmVuYV9zaXplKTsKKyAgfQorICB7CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICAgIGF1dG8qIGFyZW5hX21lc3NhZ2UgPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPigmYXJlbmEpOworICAgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoYXJlbmFfbWVzc2FnZSk7CisgICAgY29uc3QgdWludDY0X3QgaW5pdGlhbF9hcmVuYV9zaXplID0gYXJlbmEuU3BhY2VVc2VkKCk7CisKKyAgICBHZW5lcmljU3dhcChhcmVuYV9tZXNzYWdlLCAmbWVzc2FnZSk7CisKKyAgICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworICAgIFRlc3RVdGlsOjpFeHBlY3RDbGVhcigqYXJlbmFfbWVzc2FnZSk7CisgICAgLy8gVGhlIHRlbXAgc2hvdWxkIGJlIGFsbG9jYXRlZCBvbiB0aGUgYXJlbmEgaW4gdGhpcyBjYXNlLgorICAgIEVYUEVDVF9HVChhcmVuYS5TcGFjZVVzZWQoKSwgaW5pdGlhbF9hcmVuYV9zaXplKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fdGVzdGVyLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzZkYjAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5jYwpAQCAtMCwwICsxLDE2NzMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fdGVzdGVyLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorCisvLyBNdXN0IGluY2x1ZGUgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK01hcFJlZmxlY3Rpb25UZXN0ZXI6Ok1hcFJlZmxlY3Rpb25UZXN0ZXIoY29uc3QgRGVzY3JpcHRvciogYmFzZV9kZXNjcmlwdG9yKQorICAgIDogYmFzZV9kZXNjcmlwdG9yXyhiYXNlX2Rlc2NyaXB0b3IpIHsKKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wgPSBiYXNlX2Rlc2NyaXB0b3ItPmZpbGUoKS0+cG9vbCgpOworICBzdGQ6OnN0cmluZyBwYWNrYWdlID0gYmFzZV9kZXNjcmlwdG9yLT5maWxlKCktPnBhY2thZ2UoKTsKKworICBtYXBfZW51bV9mb29fID0gcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZShwYWNrYWdlICsgIi5NQVBfRU5VTV9GT08iKTsKKyAgbWFwX2VudW1fYmFyXyA9IHBvb2wtPkZpbmRFbnVtVmFsdWVCeU5hbWUocGFja2FnZSArICIuTUFQX0VOVU1fQkFSIik7CisgIG1hcF9lbnVtX2Jhel8gPSBwb29sLT5GaW5kRW51bVZhbHVlQnlOYW1lKHBhY2thZ2UgKyAiLk1BUF9FTlVNX0JBWiIpOworCisgIGZvcmVpZ25fY18gPSBwb29sLT5GaW5kRmllbGRCeU5hbWUocGFja2FnZSArICIuRm9yZWlnbk1lc3NhZ2UuYyIpOworICBtYXBfaW50MzJfaW50MzJfa2V5XyA9CisgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUocGFja2FnZSArICIuVGVzdE1hcC5NYXBJbnQzMkludDMyRW50cnkua2V5Iik7CisgIG1hcF9pbnQzMl9pbnQzMl92YWxfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShwYWNrYWdlICsgIi5UZXN0TWFwLk1hcEludDMySW50MzJFbnRyeS52YWx1ZSIpOworICBtYXBfaW50NjRfaW50NjRfa2V5XyA9CisgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUocGFja2FnZSArICIuVGVzdE1hcC5NYXBJbnQ2NEludDY0RW50cnkua2V5Iik7CisgIG1hcF9pbnQ2NF9pbnQ2NF92YWxfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShwYWNrYWdlICsgIi5UZXN0TWFwLk1hcEludDY0SW50NjRFbnRyeS52YWx1ZSIpOworICBtYXBfdWludDMyX3VpbnQzMl9rZXlfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShwYWNrYWdlICsgIi5UZXN0TWFwLk1hcFVpbnQzMlVpbnQzMkVudHJ5LmtleSIpOworICBtYXBfdWludDMyX3VpbnQzMl92YWxfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShwYWNrYWdlICsgIi5UZXN0TWFwLk1hcFVpbnQzMlVpbnQzMkVudHJ5LnZhbHVlIik7CisgIG1hcF91aW50NjRfdWludDY0X2tleV8gPQorICAgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKHBhY2thZ2UgKyAiLlRlc3RNYXAuTWFwVWludDY0VWludDY0RW50cnkua2V5Iik7CisgIG1hcF91aW50NjRfdWludDY0X3ZhbF8gPQorICAgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKHBhY2thZ2UgKyAiLlRlc3RNYXAuTWFwVWludDY0VWludDY0RW50cnkudmFsdWUiKTsKKyAgbWFwX3NpbnQzMl9zaW50MzJfa2V5XyA9CisgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUocGFja2FnZSArICIuVGVzdE1hcC5NYXBTaW50MzJTaW50MzJFbnRyeS5rZXkiKTsKKyAgbWFwX3NpbnQzMl9zaW50MzJfdmFsXyA9CisgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUocGFja2FnZSArICIuVGVzdE1hcC5NYXBTaW50MzJTaW50MzJFbnRyeS52YWx1ZSIpOworICBtYXBfc2ludDY0X3NpbnQ2NF9rZXlfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShwYWNrYWdlICsgIi5UZXN0TWFwLk1hcFNpbnQ2NFNpbnQ2NEVudHJ5LmtleSIpOworICBtYXBfc2ludDY0X3NpbnQ2NF92YWxfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShwYWNrYWdlICsgIi5UZXN0TWFwLk1hcFNpbnQ2NFNpbnQ2NEVudHJ5LnZhbHVlIik7CisgIG1hcF9maXhlZDMyX2ZpeGVkMzJfa2V5XyA9CisgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUocGFja2FnZSArICIuVGVzdE1hcC5NYXBGaXhlZDMyRml4ZWQzMkVudHJ5LmtleSIpOworICBtYXBfZml4ZWQzMl9maXhlZDMyX3ZhbF8gPQorICAgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKHBhY2thZ2UgKyAiLlRlc3RNYXAuTWFwRml4ZWQzMkZpeGVkMzJFbnRyeS52YWx1ZSIpOworICBtYXBfZml4ZWQ2NF9maXhlZDY0X2tleV8gPQorICAgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKHBhY2thZ2UgKyAiLlRlc3RNYXAuTWFwRml4ZWQ2NEZpeGVkNjRFbnRyeS5rZXkiKTsKKyAgbWFwX2ZpeGVkNjRfZml4ZWQ2NF92YWxfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShwYWNrYWdlICsgIi5UZXN0TWFwLk1hcEZpeGVkNjRGaXhlZDY0RW50cnkudmFsdWUiKTsKKyAgbWFwX3NmaXhlZDMyX3NmaXhlZDMyX2tleV8gPQorICAgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKHBhY2thZ2UgKyAiLlRlc3RNYXAuTWFwU2ZpeGVkMzJTZml4ZWQzMkVudHJ5LmtleSIpOworICBtYXBfc2ZpeGVkMzJfc2ZpeGVkMzJfdmFsXyA9IHBvb2wtPkZpbmRGaWVsZEJ5TmFtZSgKKyAgICAgIHBhY2thZ2UgKyAiLlRlc3RNYXAuTWFwU2ZpeGVkMzJTZml4ZWQzMkVudHJ5LnZhbHVlIik7CisgIG1hcF9zZml4ZWQ2NF9zZml4ZWQ2NF9rZXlfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShwYWNrYWdlICsgIi5UZXN0TWFwLk1hcFNmaXhlZDY0U2ZpeGVkNjRFbnRyeS5rZXkiKTsKKyAgbWFwX3NmaXhlZDY0X3NmaXhlZDY0X3ZhbF8gPSBwb29sLT5GaW5kRmllbGRCeU5hbWUoCisgICAgICBwYWNrYWdlICsgIi5UZXN0TWFwLk1hcFNmaXhlZDY0U2ZpeGVkNjRFbnRyeS52YWx1ZSIpOworICBtYXBfaW50MzJfZmxvYXRfa2V5XyA9CisgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUocGFja2FnZSArICIuVGVzdE1hcC5NYXBJbnQzMkZsb2F0RW50cnkua2V5Iik7CisgIG1hcF9pbnQzMl9mbG9hdF92YWxfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShwYWNrYWdlICsgIi5UZXN0TWFwLk1hcEludDMyRmxvYXRFbnRyeS52YWx1ZSIpOworICBtYXBfaW50MzJfZG91YmxlX2tleV8gPQorICAgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKHBhY2thZ2UgKyAiLlRlc3RNYXAuTWFwSW50MzJEb3VibGVFbnRyeS5rZXkiKTsKKyAgbWFwX2ludDMyX2RvdWJsZV92YWxfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShwYWNrYWdlICsgIi5UZXN0TWFwLk1hcEludDMyRG91YmxlRW50cnkudmFsdWUiKTsKKyAgbWFwX2Jvb2xfYm9vbF9rZXlfID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShwYWNrYWdlICsgIi5UZXN0TWFwLk1hcEJvb2xCb29sRW50cnkua2V5Iik7CisgIG1hcF9ib29sX2Jvb2xfdmFsXyA9CisgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUocGFja2FnZSArICIuVGVzdE1hcC5NYXBCb29sQm9vbEVudHJ5LnZhbHVlIik7CisgIG1hcF9zdHJpbmdfc3RyaW5nX2tleV8gPQorICAgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKHBhY2thZ2UgKyAiLlRlc3RNYXAuTWFwU3RyaW5nU3RyaW5nRW50cnkua2V5Iik7CisgIG1hcF9zdHJpbmdfc3RyaW5nX3ZhbF8gPQorICAgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKHBhY2thZ2UgKyAiLlRlc3RNYXAuTWFwU3RyaW5nU3RyaW5nRW50cnkudmFsdWUiKTsKKyAgbWFwX2ludDMyX2J5dGVzX2tleV8gPQorICAgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKHBhY2thZ2UgKyAiLlRlc3RNYXAuTWFwSW50MzJCeXRlc0VudHJ5LmtleSIpOworICBtYXBfaW50MzJfYnl0ZXNfdmFsXyA9CisgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUocGFja2FnZSArICIuVGVzdE1hcC5NYXBJbnQzMkJ5dGVzRW50cnkudmFsdWUiKTsKKyAgbWFwX2ludDMyX2VudW1fa2V5XyA9CisgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUocGFja2FnZSArICIuVGVzdE1hcC5NYXBJbnQzMkVudW1FbnRyeS5rZXkiKTsKKyAgbWFwX2ludDMyX2VudW1fdmFsXyA9CisgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUocGFja2FnZSArICIuVGVzdE1hcC5NYXBJbnQzMkVudW1FbnRyeS52YWx1ZSIpOworICBtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlX2tleV8gPSBwb29sLT5GaW5kRmllbGRCeU5hbWUoCisgICAgICBwYWNrYWdlICsgIi5UZXN0TWFwLk1hcEludDMyRm9yZWlnbk1lc3NhZ2VFbnRyeS5rZXkiKTsKKyAgbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZV92YWxfID0gcG9vbC0+RmluZEZpZWxkQnlOYW1lKAorICAgICAgcGFja2FnZSArICIuVGVzdE1hcC5NYXBJbnQzMkZvcmVpZ25NZXNzYWdlRW50cnkudmFsdWUiKTsKKworICBFWFBFQ1RfRkFMU0UobWFwX2VudW1fZm9vXyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9lbnVtX2Jhcl8gPT0gbnVsbHB0cik7CisgIEVYUEVDVF9GQUxTRShtYXBfZW51bV9iYXpfID09IG51bGxwdHIpOworICBFWFBFQ1RfRkFMU0UobWFwX2ludDMyX2ludDMyX2tleV8gPT0gbnVsbHB0cik7CisgIEVYUEVDVF9GQUxTRShtYXBfaW50MzJfaW50MzJfdmFsXyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9pbnQ2NF9pbnQ2NF9rZXlfID09IG51bGxwdHIpOworICBFWFBFQ1RfRkFMU0UobWFwX2ludDY0X2ludDY0X3ZhbF8gPT0gbnVsbHB0cik7CisgIEVYUEVDVF9GQUxTRShtYXBfdWludDMyX3VpbnQzMl9rZXlfID09IG51bGxwdHIpOworICBFWFBFQ1RfRkFMU0UobWFwX3VpbnQzMl91aW50MzJfdmFsXyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF91aW50NjRfdWludDY0X2tleV8gPT0gbnVsbHB0cik7CisgIEVYUEVDVF9GQUxTRShtYXBfdWludDY0X3VpbnQ2NF92YWxfID09IG51bGxwdHIpOworICBFWFBFQ1RfRkFMU0UobWFwX3NpbnQzMl9zaW50MzJfa2V5XyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9zaW50MzJfc2ludDMyX3ZhbF8gPT0gbnVsbHB0cik7CisgIEVYUEVDVF9GQUxTRShtYXBfc2ludDY0X3NpbnQ2NF9rZXlfID09IG51bGxwdHIpOworICBFWFBFQ1RfRkFMU0UobWFwX3NpbnQ2NF9zaW50NjRfdmFsXyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9maXhlZDMyX2ZpeGVkMzJfa2V5XyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9maXhlZDMyX2ZpeGVkMzJfdmFsXyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9maXhlZDY0X2ZpeGVkNjRfa2V5XyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9maXhlZDY0X2ZpeGVkNjRfdmFsXyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9zZml4ZWQzMl9zZml4ZWQzMl9rZXlfID09IG51bGxwdHIpOworICBFWFBFQ1RfRkFMU0UobWFwX3NmaXhlZDMyX3NmaXhlZDMyX3ZhbF8gPT0gbnVsbHB0cik7CisgIEVYUEVDVF9GQUxTRShtYXBfc2ZpeGVkNjRfc2ZpeGVkNjRfa2V5XyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9zZml4ZWQ2NF9zZml4ZWQ2NF92YWxfID09IG51bGxwdHIpOworICBFWFBFQ1RfRkFMU0UobWFwX2ludDMyX2Zsb2F0X2tleV8gPT0gbnVsbHB0cik7CisgIEVYUEVDVF9GQUxTRShtYXBfaW50MzJfZmxvYXRfdmFsXyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9pbnQzMl9kb3VibGVfa2V5XyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9pbnQzMl9kb3VibGVfdmFsXyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9ib29sX2Jvb2xfa2V5XyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9ib29sX2Jvb2xfdmFsXyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9zdHJpbmdfc3RyaW5nX2tleV8gPT0gbnVsbHB0cik7CisgIEVYUEVDVF9GQUxTRShtYXBfc3RyaW5nX3N0cmluZ192YWxfID09IG51bGxwdHIpOworICBFWFBFQ1RfRkFMU0UobWFwX2ludDMyX2J5dGVzX2tleV8gPT0gbnVsbHB0cik7CisgIEVYUEVDVF9GQUxTRShtYXBfaW50MzJfYnl0ZXNfdmFsXyA9PSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKG1hcF9pbnQzMl9lbnVtX2tleV8gPT0gbnVsbHB0cik7CisgIEVYUEVDVF9GQUxTRShtYXBfaW50MzJfZW51bV92YWxfID09IG51bGxwdHIpOworICBFWFBFQ1RfRkFMU0UobWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZV9rZXlfID09IG51bGxwdHIpOworICBFWFBFQ1RfRkFMU0UobWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZV92YWxfID09IG51bGxwdHIpOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGFsbF9tYXBfZGVzY3JpcHRvcnMgPSB7CisgICAgICBtYXBfaW50MzJfaW50MzJfa2V5XywKKyAgICAgIG1hcF9pbnQzMl9pbnQzMl92YWxfLAorICAgICAgbWFwX2ludDY0X2ludDY0X2tleV8sCisgICAgICBtYXBfaW50NjRfaW50NjRfdmFsXywKKyAgICAgIG1hcF91aW50MzJfdWludDMyX2tleV8sCisgICAgICBtYXBfdWludDMyX3VpbnQzMl92YWxfLAorICAgICAgbWFwX3VpbnQ2NF91aW50NjRfa2V5XywKKyAgICAgIG1hcF91aW50NjRfdWludDY0X3ZhbF8sCisgICAgICBtYXBfc2ludDMyX3NpbnQzMl9rZXlfLAorICAgICAgbWFwX3NpbnQzMl9zaW50MzJfdmFsXywKKyAgICAgIG1hcF9zaW50NjRfc2ludDY0X2tleV8sCisgICAgICBtYXBfc2ludDY0X3NpbnQ2NF92YWxfLAorICAgICAgbWFwX2ZpeGVkMzJfZml4ZWQzMl9rZXlfLAorICAgICAgbWFwX2ZpeGVkMzJfZml4ZWQzMl92YWxfLAorICAgICAgbWFwX2ZpeGVkNjRfZml4ZWQ2NF9rZXlfLAorICAgICAgbWFwX2ZpeGVkNjRfZml4ZWQ2NF92YWxfLAorICAgICAgbWFwX3NmaXhlZDMyX3NmaXhlZDMyX2tleV8sCisgICAgICBtYXBfc2ZpeGVkMzJfc2ZpeGVkMzJfdmFsXywKKyAgICAgIG1hcF9zZml4ZWQ2NF9zZml4ZWQ2NF9rZXlfLAorICAgICAgbWFwX3NmaXhlZDY0X3NmaXhlZDY0X3ZhbF8sCisgICAgICBtYXBfaW50MzJfZmxvYXRfa2V5XywKKyAgICAgIG1hcF9pbnQzMl9mbG9hdF92YWxfLAorICAgICAgbWFwX2ludDMyX2RvdWJsZV9rZXlfLAorICAgICAgbWFwX2ludDMyX2RvdWJsZV92YWxfLAorICAgICAgbWFwX2Jvb2xfYm9vbF9rZXlfLAorICAgICAgbWFwX2Jvb2xfYm9vbF92YWxfLAorICAgICAgbWFwX3N0cmluZ19zdHJpbmdfa2V5XywKKyAgICAgIG1hcF9zdHJpbmdfc3RyaW5nX3ZhbF8sCisgICAgICBtYXBfaW50MzJfYnl0ZXNfa2V5XywKKyAgICAgIG1hcF9pbnQzMl9ieXRlc192YWxfLAorICAgICAgbWFwX2ludDMyX2VudW1fa2V5XywKKyAgICAgIG1hcF9pbnQzMl9lbnVtX3ZhbF8sCisgICAgICBtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlX2tleV8sCisgICAgICBtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlX3ZhbF99OworICBmb3IgKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRlc2MgOiBhbGxfbWFwX2Rlc2NyaXB0b3JzKSB7CisgICAgR09PR0xFX0NIRUNLKGZkZXNjLT5jb250YWluaW5nX3R5cGUoKSAhPSBudWxscHRyKSA8PCBmZGVzYy0+bmFtZSgpOworICAgIGlmIChmZGVzYy0+bmFtZSgpID09ICJrZXkiKSB7CisgICAgICBFWFBFQ1RfRVEoZmRlc2MtPmNvbnRhaW5pbmdfdHlwZSgpLT5tYXBfa2V5KCksIGZkZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgRVhQRUNUX0VRKGZkZXNjLT5uYW1lKCksICJ2YWx1ZSIpOworICAgICAgRVhQRUNUX0VRKGZkZXNjLT5jb250YWluaW5nX3R5cGUoKS0+bWFwX3ZhbHVlKCksIGZkZXNjKTsKKyAgICB9CisgIH0KK30KKworLy8gU2hvcnRoYW5kIHRvIGdldCBhIEZpZWxkRGVzY3JpcHRvciBmb3IgYSBmaWVsZCBvZiB1bml0dGVzdDo6VGVzdE1hcC4KK2NvbnN0IEZpZWxkRGVzY3JpcHRvciogTWFwUmVmbGVjdGlvblRlc3Rlcjo6Rihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9IG51bGxwdHI7CisgIHJlc3VsdCA9IGJhc2VfZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKKyAgR09PR0xFX0NIRUNLKHJlc3VsdCAhPSBudWxscHRyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBNYXBSZWZsZWN0aW9uVGVzdGVyOjpTZXRNYXBGaWVsZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgTWVzc2FnZSogc3ViX21lc3NhZ2UgPSBudWxscHRyOworICBNZXNzYWdlKiBzdWJfZm9yZWlnbl9tZXNzYWdlID0gbnVsbHB0cjsKKworICAvLyBBZGQgZmlyc3QgZWxlbWVudC4KKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9pbnQzMiIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIG1hcF9pbnQzMl9pbnQzMl9rZXlfLCAwKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIG1hcF9pbnQzMl9pbnQzMl92YWxfLCAwKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ludDY0X2ludDY0IikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQ2NChzdWJfbWVzc2FnZSwgbWFwX2ludDY0X2ludDY0X2tleV8sIDApOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQ2NChzdWJfbWVzc2FnZSwgbWFwX2ludDY0X2ludDY0X3ZhbF8sIDApOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfdWludDMyX3VpbnQzMiIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0VUludDMyKHN1Yl9tZXNzYWdlLCBtYXBfdWludDMyX3VpbnQzMl9rZXlfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldFVJbnQzMihzdWJfbWVzc2FnZSwgbWFwX3VpbnQzMl91aW50MzJfdmFsXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfdWludDY0X3VpbnQ2NCIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0VUludDY0KHN1Yl9tZXNzYWdlLCBtYXBfdWludDY0X3VpbnQ2NF9rZXlfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldFVJbnQ2NChzdWJfbWVzc2FnZSwgbWFwX3VpbnQ2NF91aW50NjRfdmFsXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfc2ludDMyX3NpbnQzMiIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIG1hcF9zaW50MzJfc2ludDMyX2tleV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbWFwX3NpbnQzMl9zaW50MzJfdmFsXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9zaW50NjRfc2ludDY0IikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQ2NChzdWJfbWVzc2FnZSwgbWFwX3NpbnQ2NF9zaW50NjRfa2V5XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDY0KHN1Yl9tZXNzYWdlLCBtYXBfc2ludDY0X3NpbnQ2NF92YWxfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ZpeGVkMzJfZml4ZWQzMiIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0VUludDMyKHN1Yl9tZXNzYWdlLCBtYXBfZml4ZWQzMl9maXhlZDMyX2tleV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0VUludDMyKHN1Yl9tZXNzYWdlLCBtYXBfZml4ZWQzMl9maXhlZDMyX3ZhbF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ZpeGVkNjRfZml4ZWQ2NCIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0VUludDY0KHN1Yl9tZXNzYWdlLCBtYXBfZml4ZWQ2NF9maXhlZDY0X2tleV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0VUludDY0KHN1Yl9tZXNzYWdlLCBtYXBfZml4ZWQ2NF9maXhlZDY0X3ZhbF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX3NmaXhlZDMyX3NmaXhlZDMyIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX3NmaXhlZDMyX3NmaXhlZDMyX2tleV8sIDApOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX3NmaXhlZDMyX3NmaXhlZDMyX3ZhbF8sIDApOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfc2ZpeGVkNjRfc2ZpeGVkNjQiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDY0KHN1Yl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfc2ZpeGVkNjRfc2ZpeGVkNjRfa2V5XywgMCk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDY0KHN1Yl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfc2ZpeGVkNjRfc2ZpeGVkNjRfdmFsXywgMCk7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9mbG9hdCIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIG1hcF9pbnQzMl9mbG9hdF9rZXlfLCAwKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0RmxvYXQoc3ViX21lc3NhZ2UsIG1hcF9pbnQzMl9mbG9hdF92YWxfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjApOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfZG91YmxlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbWFwX2ludDMyX2RvdWJsZV9rZXlfLCAwKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0RG91YmxlKHN1Yl9tZXNzYWdlLCBtYXBfaW50MzJfZG91YmxlX3ZhbF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjApOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfYm9vbF9ib29sIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRCb29sKHN1Yl9tZXNzYWdlLCBtYXBfYm9vbF9ib29sX2tleV8sIGZhbHNlKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0Qm9vbChzdWJfbWVzc2FnZSwgbWFwX2Jvb2xfYm9vbF92YWxfLCBmYWxzZSk7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9zdHJpbmdfc3RyaW5nIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRTdHJpbmcoc3ViX21lc3NhZ2UsIG1hcF9zdHJpbmdfc3RyaW5nX2tleV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMCIpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRTdHJpbmcoc3ViX21lc3NhZ2UsIG1hcF9zdHJpbmdfc3RyaW5nX3ZhbF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMCIpOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfYnl0ZXMiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBtYXBfaW50MzJfYnl0ZXNfa2V5XywgMCk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldFN0cmluZyhzdWJfbWVzc2FnZSwgbWFwX2ludDMyX2J5dGVzX3ZhbF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMCIpOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfZW51bSIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIG1hcF9pbnQzMl9lbnVtX2tleV8sIDApOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRFbnVtKHN1Yl9tZXNzYWdlLCBtYXBfaW50MzJfZW51bV92YWxfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9lbnVtX2Jhcl8pOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZV9rZXlfLCAwKTsKKyAgc3ViX2ZvcmVpZ25fbWVzc2FnZSA9IHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVNZXNzYWdlKAorICAgICAgc3ViX21lc3NhZ2UsIG1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VfdmFsXywgbnVsbHB0cik7CisgIHN1Yl9mb3JlaWduX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX2ZvcmVpZ25fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduX2NfLCAwKTsKKworICAvLyBBZGQgc2Vjb25kIGVsZW1lbnQKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9pbnQzMiIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIG1hcF9pbnQzMl9pbnQzMl9rZXlfLCAxKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIG1hcF9pbnQzMl9pbnQzMl92YWxfLCAxKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ludDY0X2ludDY0IikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQ2NChzdWJfbWVzc2FnZSwgbWFwX2ludDY0X2ludDY0X2tleV8sIDEpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQ2NChzdWJfbWVzc2FnZSwgbWFwX2ludDY0X2ludDY0X3ZhbF8sIDEpOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfdWludDMyX3VpbnQzMiIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0VUludDMyKHN1Yl9tZXNzYWdlLCBtYXBfdWludDMyX3VpbnQzMl9rZXlfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldFVJbnQzMihzdWJfbWVzc2FnZSwgbWFwX3VpbnQzMl91aW50MzJfdmFsXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfdWludDY0X3VpbnQ2NCIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0VUludDY0KHN1Yl9tZXNzYWdlLCBtYXBfdWludDY0X3VpbnQ2NF9rZXlfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldFVJbnQ2NChzdWJfbWVzc2FnZSwgbWFwX3VpbnQ2NF91aW50NjRfdmFsXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfc2ludDMyX3NpbnQzMiIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIG1hcF9zaW50MzJfc2ludDMyX2tleV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbWFwX3NpbnQzMl9zaW50MzJfdmFsXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9zaW50NjRfc2ludDY0IikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQ2NChzdWJfbWVzc2FnZSwgbWFwX3NpbnQ2NF9zaW50NjRfa2V5XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDY0KHN1Yl9tZXNzYWdlLCBtYXBfc2ludDY0X3NpbnQ2NF92YWxfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ZpeGVkMzJfZml4ZWQzMiIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0VUludDMyKHN1Yl9tZXNzYWdlLCBtYXBfZml4ZWQzMl9maXhlZDMyX2tleV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0VUludDMyKHN1Yl9tZXNzYWdlLCBtYXBfZml4ZWQzMl9maXhlZDMyX3ZhbF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ZpeGVkNjRfZml4ZWQ2NCIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0VUludDY0KHN1Yl9tZXNzYWdlLCBtYXBfZml4ZWQ2NF9maXhlZDY0X2tleV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0VUludDY0KHN1Yl9tZXNzYWdlLCBtYXBfZml4ZWQ2NF9maXhlZDY0X3ZhbF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX3NmaXhlZDMyX3NmaXhlZDMyIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX3NmaXhlZDMyX3NmaXhlZDMyX2tleV8sIDEpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX3NmaXhlZDMyX3NmaXhlZDMyX3ZhbF8sIDEpOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfc2ZpeGVkNjRfc2ZpeGVkNjQiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDY0KHN1Yl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfc2ZpeGVkNjRfc2ZpeGVkNjRfa2V5XywgMSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDY0KHN1Yl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfc2ZpeGVkNjRfc2ZpeGVkNjRfdmFsXywgMSk7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9mbG9hdCIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIG1hcF9pbnQzMl9mbG9hdF9rZXlfLCAxKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0RmxvYXQoc3ViX21lc3NhZ2UsIG1hcF9pbnQzMl9mbG9hdF92YWxfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjApOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfZG91YmxlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbWFwX2ludDMyX2RvdWJsZV9rZXlfLCAxKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0RG91YmxlKHN1Yl9tZXNzYWdlLCBtYXBfaW50MzJfZG91YmxlX3ZhbF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjApOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfYm9vbF9ib29sIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRCb29sKHN1Yl9tZXNzYWdlLCBtYXBfYm9vbF9ib29sX2tleV8sIHRydWUpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRCb29sKHN1Yl9tZXNzYWdlLCBtYXBfYm9vbF9ib29sX3ZhbF8sIHRydWUpOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfc3RyaW5nX3N0cmluZyIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0U3RyaW5nKHN1Yl9tZXNzYWdlLCBtYXBfc3RyaW5nX3N0cmluZ19rZXlfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0U3RyaW5nKHN1Yl9tZXNzYWdlLCBtYXBfc3RyaW5nX3N0cmluZ192YWxfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ludDMyX2J5dGVzIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbWFwX2ludDMyX2J5dGVzX2tleV8sIDEpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRTdHJpbmcoc3ViX21lc3NhZ2UsIG1hcF9pbnQzMl9ieXRlc192YWxfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ludDMyX2VudW0iKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBtYXBfaW50MzJfZW51bV9rZXlfLCAxKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0RW51bShzdWJfbWVzc2FnZSwgbWFwX2ludDMyX2VudW1fdmFsXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfZW51bV9iYXpfKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2Vfa2V5XywgMSk7CisgIHN1Yl9mb3JlaWduX21lc3NhZ2UgPSBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5NdXRhYmxlTWVzc2FnZSgKKyAgICAgIHN1Yl9tZXNzYWdlLCBtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlX3ZhbF8sIG51bGxwdHIpOworICBzdWJfZm9yZWlnbl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9mb3JlaWduX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbl9jXywgMSk7Cit9CisKK3ZvaWQgTWFwUmVmbGVjdGlvblRlc3Rlcjo6U2V0TWFwRmllbGRzVmlhTWFwUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgTWVzc2FnZSogc3ViX2ZvcmVpZ25fbWVzc2FnZSA9IG51bGxwdHI7CisgIE1hcFZhbHVlUmVmIG1hcF92YWw7CisgIE1hcFZhbHVlQ29uc3RSZWYgbWFwX3ZhbF9jb25zdDsKKworICAvLyBBZGQgZmlyc3QgZWxlbWVudC4KKyAgTWFwS2V5IG1hcF9rZXk7CisgIG1hcF9rZXkuU2V0SW50MzJWYWx1ZSgwKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkxvb2t1cE1hcFZhbHVlKCptZXNzYWdlLCBGKCJtYXBfaW50MzJfaW50MzIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXksICZtYXBfdmFsX2NvbnN0KSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX2ludDMyX2ludDMyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSwgJm1hcF92YWwpKTsKKyAgbWFwX3ZhbC5TZXRJbnQzMlZhbHVlKDApOworCisgIG1hcF9rZXkuU2V0SW50NjRWYWx1ZSgwKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkxvb2t1cE1hcFZhbHVlKCptZXNzYWdlLCBGKCJtYXBfaW50NjRfaW50NjQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXksICZtYXBfdmFsX2NvbnN0KSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX2ludDY0X2ludDY0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSwgJm1hcF92YWwpKTsKKyAgbWFwX3ZhbC5TZXRJbnQ2NFZhbHVlKDApOworCisgIG1hcF9rZXkuU2V0VUludDMyVmFsdWUoMCk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5Mb29rdXBNYXBWYWx1ZSgqbWVzc2FnZSwgRigibWFwX3VpbnQzMl91aW50MzIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXksICZtYXBfdmFsX2NvbnN0KSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUoCisgICAgICBtZXNzYWdlLCBGKCJtYXBfdWludDMyX3VpbnQzMiIpLCBtYXBfa2V5LCAmbWFwX3ZhbCkpOworICBtYXBfdmFsLlNldFVJbnQzMlZhbHVlKDApOworCisgIG1hcF9rZXkuU2V0VUludDY0VmFsdWUoMCk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUoCisgICAgICBtZXNzYWdlLCBGKCJtYXBfdWludDY0X3VpbnQ2NCIpLCBtYXBfa2V5LCAmbWFwX3ZhbCkpOworICBtYXBfdmFsLlNldFVJbnQ2NFZhbHVlKDApOworCisgIG1hcF9rZXkuU2V0SW50MzJWYWx1ZSgwKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZSgKKyAgICAgIG1lc3NhZ2UsIEYoIm1hcF9zaW50MzJfc2ludDMyIiksIG1hcF9rZXksICZtYXBfdmFsKSk7CisgIG1hcF92YWwuU2V0SW50MzJWYWx1ZSgwKTsKKworICBtYXBfa2V5LlNldEludDY0VmFsdWUoMCk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUoCisgICAgICBtZXNzYWdlLCBGKCJtYXBfc2ludDY0X3NpbnQ2NCIpLCBtYXBfa2V5LCAmbWFwX3ZhbCkpOworICBtYXBfdmFsLlNldEludDY0VmFsdWUoMCk7CisKKyAgbWFwX2tleS5TZXRVSW50MzJWYWx1ZSgwKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZSgKKyAgICAgIG1lc3NhZ2UsIEYoIm1hcF9maXhlZDMyX2ZpeGVkMzIiKSwgbWFwX2tleSwgJm1hcF92YWwpKTsKKyAgbWFwX3ZhbC5TZXRVSW50MzJWYWx1ZSgwKTsKKworICBtYXBfa2V5LlNldFVJbnQ2NFZhbHVlKDApOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKAorICAgICAgbWVzc2FnZSwgRigibWFwX2ZpeGVkNjRfZml4ZWQ2NCIpLCBtYXBfa2V5LCAmbWFwX3ZhbCkpOworICBtYXBfdmFsLlNldFVJbnQ2NFZhbHVlKDApOworCisgIG1hcF9rZXkuU2V0SW50MzJWYWx1ZSgwKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZSgKKyAgICAgIG1lc3NhZ2UsIEYoIm1hcF9zZml4ZWQzMl9zZml4ZWQzMiIpLCBtYXBfa2V5LCAmbWFwX3ZhbCkpOworICBtYXBfdmFsLlNldEludDMyVmFsdWUoMCk7CisKKyAgbWFwX2tleS5TZXRJbnQ2NFZhbHVlKDApOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKAorICAgICAgbWVzc2FnZSwgRigibWFwX3NmaXhlZDY0X3NmaXhlZDY0IiksIG1hcF9rZXksICZtYXBfdmFsKSk7CisgIG1hcF92YWwuU2V0SW50NjRWYWx1ZSgwKTsKKworICBtYXBfa2V5LlNldEludDMyVmFsdWUoMCk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX2ludDMyX2Zsb2F0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSwgJm1hcF92YWwpKTsKKyAgbWFwX3ZhbC5TZXRGbG9hdFZhbHVlKDAuMCk7CisKKyAgbWFwX2tleS5TZXRJbnQzMlZhbHVlKDApOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9kb3VibGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbCkpOworICBtYXBfdmFsLlNldERvdWJsZVZhbHVlKDAuMCk7CisKKyAgbWFwX2tleS5TZXRCb29sVmFsdWUoZmFsc2UpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+TG9va3VwTWFwVmFsdWUoKm1lc3NhZ2UsIEYoIm1hcF9ib29sX2Jvb2wiKSwgbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfdmFsX2NvbnN0KSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX2Jvb2xfYm9vbCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXksICZtYXBfdmFsKSk7CisgIG1hcF92YWwuU2V0Qm9vbFZhbHVlKGZhbHNlKTsKKworICBtYXBfa2V5LlNldFN0cmluZ1ZhbHVlKCIwIik7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5Mb29rdXBNYXBWYWx1ZSgqbWVzc2FnZSwgRigibWFwX3N0cmluZ19zdHJpbmciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXksICZtYXBfdmFsX2NvbnN0KSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUoCisgICAgICBtZXNzYWdlLCBGKCJtYXBfc3RyaW5nX3N0cmluZyIpLCBtYXBfa2V5LCAmbWFwX3ZhbCkpOworICBtYXBfdmFsLlNldFN0cmluZ1ZhbHVlKCIwIik7CisKKyAgbWFwX2tleS5TZXRJbnQzMlZhbHVlKDApOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+TG9va3VwTWFwVmFsdWUoKm1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9ieXRlcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSwgJm1hcF92YWxfY29uc3QpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfYnl0ZXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbCkpOworICBtYXBfdmFsLlNldFN0cmluZ1ZhbHVlKCIwIik7CisKKyAgbWFwX2tleS5TZXRJbnQzMlZhbHVlKDApOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+TG9va3VwTWFwVmFsdWUoKm1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9lbnVtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbF9jb25zdCkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9lbnVtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSwgJm1hcF92YWwpKTsKKyAgbWFwX3ZhbC5TZXRFbnVtVmFsdWUobWFwX2VudW1fYmFyXy0+bnVtYmVyKCkpOworCisgIG1hcF9rZXkuU2V0SW50MzJWYWx1ZSgwKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkxvb2t1cE1hcFZhbHVlKAorICAgICAgKm1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UiKSwgbWFwX2tleSwgJm1hcF92YWxfY29uc3QpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZSgKKyAgICAgIG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UiKSwgbWFwX2tleSwgJm1hcF92YWwpKTsKKyAgc3ViX2ZvcmVpZ25fbWVzc2FnZSA9IG1hcF92YWwuTXV0YWJsZU1lc3NhZ2VWYWx1ZSgpOworICBzdWJfZm9yZWlnbl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9mb3JlaWduX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbl9jXywgMCk7CisKKyAgLy8gQWRkIHNlY29uZCBlbGVtZW50CisgIG1hcF9rZXkuU2V0SW50MzJWYWx1ZSgxKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfaW50MzIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbCkpOworICBtYXBfdmFsLlNldEludDMyVmFsdWUoMSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9pbnQzMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbCkpOworCisgIG1hcF9rZXkuU2V0SW50NjRWYWx1ZSgxKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfaW50NjRfaW50NjQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbCkpOworICBtYXBfdmFsLlNldEludDY0VmFsdWUoMSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9pbnQ2NF9pbnQ2NCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbCkpOworCisgIG1hcF9rZXkuU2V0VUludDMyVmFsdWUoMSk7CisgIHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX3VpbnQzMl91aW50MzIiKSwgbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX3ZhbCk7CisgIG1hcF92YWwuU2V0VUludDMyVmFsdWUoMSk7CisKKyAgbWFwX2tleS5TZXRVSW50NjRWYWx1ZSgxKTsKKyAgcmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfdWludDY0X3VpbnQ2NCIpLCBtYXBfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfdmFsKTsKKyAgbWFwX3ZhbC5TZXRVSW50NjRWYWx1ZSgxKTsKKworICBtYXBfa2V5LlNldEludDMyVmFsdWUoMSk7CisgIHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX3NpbnQzMl9zaW50MzIiKSwgbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX3ZhbCk7CisgIG1hcF92YWwuU2V0SW50MzJWYWx1ZSgxKTsKKworICBtYXBfa2V5LlNldEludDY0VmFsdWUoMSk7CisgIHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX3NpbnQ2NF9zaW50NjQiKSwgbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX3ZhbCk7CisgIG1hcF92YWwuU2V0SW50NjRWYWx1ZSgxKTsKKworICBtYXBfa2V5LlNldFVJbnQzMlZhbHVlKDEpOworICByZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9maXhlZDMyX2ZpeGVkMzIiKSwgbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX3ZhbCk7CisgIG1hcF92YWwuU2V0VUludDMyVmFsdWUoMSk7CisKKyAgbWFwX2tleS5TZXRVSW50NjRWYWx1ZSgxKTsKKyAgcmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfZml4ZWQ2NF9maXhlZDY0IiksIG1hcF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF92YWwpOworICBtYXBfdmFsLlNldFVJbnQ2NFZhbHVlKDEpOworCisgIG1hcF9rZXkuU2V0SW50MzJWYWx1ZSgxKTsKKyAgcmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfc2ZpeGVkMzJfc2ZpeGVkMzIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbCk7CisgIG1hcF92YWwuU2V0SW50MzJWYWx1ZSgxKTsKKworICBtYXBfa2V5LlNldEludDY0VmFsdWUoMSk7CisgIHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX3NmaXhlZDY0X3NmaXhlZDY0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSwgJm1hcF92YWwpOworICBtYXBfdmFsLlNldEludDY0VmFsdWUoMSk7CisKKyAgbWFwX2tleS5TZXRJbnQzMlZhbHVlKDEpOworICByZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9mbG9hdCIpLCBtYXBfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfdmFsKTsKKyAgbWFwX3ZhbC5TZXRGbG9hdFZhbHVlKDEuMCk7CisKKyAgbWFwX2tleS5TZXRJbnQzMlZhbHVlKDEpOworICByZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9kb3VibGUiKSwgbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX3ZhbCk7CisgIG1hcF92YWwuU2V0RG91YmxlVmFsdWUoMS4wKTsKKworICBtYXBfa2V5LlNldEJvb2xWYWx1ZSh0cnVlKTsKKyAgcmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfYm9vbF9ib29sIiksIG1hcF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF92YWwpOworICBtYXBfdmFsLlNldEJvb2xWYWx1ZSh0cnVlKTsKKworICBtYXBfa2V5LlNldFN0cmluZ1ZhbHVlKCIxIik7CisgIHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX3N0cmluZ19zdHJpbmciKSwgbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX3ZhbCk7CisgIG1hcF92YWwuU2V0U3RyaW5nVmFsdWUoIjEiKTsKKworICBtYXBfa2V5LlNldEludDMyVmFsdWUoMSk7CisgIHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX2ludDMyX2J5dGVzIiksIG1hcF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF92YWwpOworICBtYXBfdmFsLlNldFN0cmluZ1ZhbHVlKCIxIik7CisKKyAgbWFwX2tleS5TZXRJbnQzMlZhbHVlKDEpOworICByZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9lbnVtIiksIG1hcF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF92YWwpOworICBtYXBfdmFsLlNldEVudW1WYWx1ZShtYXBfZW51bV9iYXpfLT5udW1iZXIoKSk7CisKKyAgbWFwX2tleS5TZXRJbnQzMlZhbHVlKDEpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKAorICAgICAgbWVzc2FnZSwgRigibWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSIpLCBtYXBfa2V5LCAmbWFwX3ZhbCkpOworICBzdWJfZm9yZWlnbl9tZXNzYWdlID0gbWFwX3ZhbC5NdXRhYmxlTWVzc2FnZVZhbHVlKCk7CisgIHN1Yl9mb3JlaWduX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX2ZvcmVpZ25fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduX2NfLCAxKTsKK30KKwordm9pZCBNYXBSZWZsZWN0aW9uVGVzdGVyOjpHZXRNYXBWYWx1ZVZpYU1hcFJlZmxlY3Rpb24oCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkX25hbWUsIGNvbnN0IE1hcEtleSYgbWFwX2tleSwKKyAgICBNYXBWYWx1ZVJlZiogbWFwX3ZhbCkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKGZpZWxkX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCBtYXBfdmFsKSk7Cit9CisKK01lc3NhZ2UqIE1hcFJlZmxlY3Rpb25UZXN0ZXI6OkdldE1hcEVudHJ5VmlhUmVmbGVjdGlvbigKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSwgaW50IGluZGV4KSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIHJldHVybiByZWZsZWN0aW9uLT5NdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoZmllbGRfbmFtZSksIGluZGV4KTsKK30KKworTWFwSXRlcmF0b3IgTWFwUmVmbGVjdGlvblRlc3Rlcjo6TWFwQmVnaW4oTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIHJldHVybiByZWZsZWN0aW9uLT5NYXBCZWdpbihtZXNzYWdlLCBGKGZpZWxkX25hbWUpKTsKK30KKworTWFwSXRlcmF0b3IgTWFwUmVmbGVjdGlvblRlc3Rlcjo6TWFwRW5kKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkX25hbWUpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgcmV0dXJuIHJlZmxlY3Rpb24tPk1hcEVuZChtZXNzYWdlLCBGKGZpZWxkX25hbWUpKTsKK30KKworaW50IE1hcFJlZmxlY3Rpb25UZXN0ZXI6Ok1hcFNpemUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgcmV0dXJuIHJlZmxlY3Rpb24tPk1hcFNpemUobWVzc2FnZSwgRihmaWVsZF9uYW1lKSk7Cit9CisKK3ZvaWQgTWFwUmVmbGVjdGlvblRlc3Rlcjo6Q2xlYXJNYXBGaWVsZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICByZWZsZWN0aW9uLT5DbGVhckZpZWxkKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9pbnQzMiIpKTsKKyAgcmVmbGVjdGlvbi0+Q2xlYXJGaWVsZChtZXNzYWdlLCBGKCJtYXBfaW50NjRfaW50NjQiKSk7CisgIHJlZmxlY3Rpb24tPkNsZWFyRmllbGQobWVzc2FnZSwgRigibWFwX3VpbnQzMl91aW50MzIiKSk7CisgIHJlZmxlY3Rpb24tPkNsZWFyRmllbGQobWVzc2FnZSwgRigibWFwX3VpbnQ2NF91aW50NjQiKSk7CisgIHJlZmxlY3Rpb24tPkNsZWFyRmllbGQobWVzc2FnZSwgRigibWFwX3NpbnQzMl9zaW50MzIiKSk7CisgIHJlZmxlY3Rpb24tPkNsZWFyRmllbGQobWVzc2FnZSwgRigibWFwX3NpbnQ2NF9zaW50NjQiKSk7CisgIHJlZmxlY3Rpb24tPkNsZWFyRmllbGQobWVzc2FnZSwgRigibWFwX2ZpeGVkMzJfZml4ZWQzMiIpKTsKKyAgcmVmbGVjdGlvbi0+Q2xlYXJGaWVsZChtZXNzYWdlLCBGKCJtYXBfZml4ZWQ2NF9maXhlZDY0IikpOworICByZWZsZWN0aW9uLT5DbGVhckZpZWxkKG1lc3NhZ2UsIEYoIm1hcF9zZml4ZWQzMl9zZml4ZWQzMiIpKTsKKyAgcmVmbGVjdGlvbi0+Q2xlYXJGaWVsZChtZXNzYWdlLCBGKCJtYXBfc2ZpeGVkNjRfc2ZpeGVkNjQiKSk7CisgIHJlZmxlY3Rpb24tPkNsZWFyRmllbGQobWVzc2FnZSwgRigibWFwX2ludDMyX2Zsb2F0IikpOworICByZWZsZWN0aW9uLT5DbGVhckZpZWxkKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9kb3VibGUiKSk7CisgIHJlZmxlY3Rpb24tPkNsZWFyRmllbGQobWVzc2FnZSwgRigibWFwX2Jvb2xfYm9vbCIpKTsKKyAgcmVmbGVjdGlvbi0+Q2xlYXJGaWVsZChtZXNzYWdlLCBGKCJtYXBfc3RyaW5nX3N0cmluZyIpKTsKKyAgcmVmbGVjdGlvbi0+Q2xlYXJGaWVsZChtZXNzYWdlLCBGKCJtYXBfaW50MzJfYnl0ZXMiKSk7CisgIHJlZmxlY3Rpb24tPkNsZWFyRmllbGQobWVzc2FnZSwgRigibWFwX2ludDMyX2VudW0iKSk7CisgIHJlZmxlY3Rpb24tPkNsZWFyRmllbGQobWVzc2FnZSwgRigibWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSIpKTsKK30KKwordm9pZCBNYXBSZWZsZWN0aW9uVGVzdGVyOjpNb2RpZnlNYXBGaWVsZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgTWFwVmFsdWVSZWYgbWFwX3ZhbDsKKyAgTWVzc2FnZSogc3ViX2ZvcmVpZ25fbWVzc2FnZTsKKworICAvLyBNb2RpZnkgdGhlIHNlY29uZCBlbGVtZW50CisgIE1hcEtleSBtYXBfa2V5OworICBtYXBfa2V5LlNldEludDMyVmFsdWUoMSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9pbnQzMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbCkpOworICBtYXBfdmFsLlNldEludDMyVmFsdWUoMik7CisKKyAgbWFwX2tleS5TZXRJbnQ2NFZhbHVlKDEpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfaW50NjRfaW50NjQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSwgJm1hcF92YWwpKTsKKyAgbWFwX3ZhbC5TZXRJbnQ2NFZhbHVlKDIpOworCisgIG1hcF9rZXkuU2V0VUludDMyVmFsdWUoMSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKAorICAgICAgbWVzc2FnZSwgRigibWFwX3VpbnQzMl91aW50MzIiKSwgbWFwX2tleSwgJm1hcF92YWwpKTsKKyAgbWFwX3ZhbC5TZXRVSW50MzJWYWx1ZSgyKTsKKworICBtYXBfa2V5LlNldFVJbnQ2NFZhbHVlKDEpOworICByZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF91aW50NjRfdWludDY0IiksIG1hcF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF92YWwpOworICBtYXBfdmFsLlNldFVJbnQ2NFZhbHVlKDIpOworCisgIG1hcF9rZXkuU2V0SW50MzJWYWx1ZSgxKTsKKyAgcmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfc2ludDMyX3NpbnQzMiIpLCBtYXBfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfdmFsKTsKKyAgbWFwX3ZhbC5TZXRJbnQzMlZhbHVlKDIpOworCisgIG1hcF9rZXkuU2V0SW50NjRWYWx1ZSgxKTsKKyAgcmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfc2ludDY0X3NpbnQ2NCIpLCBtYXBfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfdmFsKTsKKyAgbWFwX3ZhbC5TZXRJbnQ2NFZhbHVlKDIpOworCisgIG1hcF9rZXkuU2V0VUludDMyVmFsdWUoMSk7CisgIHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX2ZpeGVkMzJfZml4ZWQzMiIpLCBtYXBfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfdmFsKTsKKyAgbWFwX3ZhbC5TZXRVSW50MzJWYWx1ZSgyKTsKKworICBtYXBfa2V5LlNldFVJbnQ2NFZhbHVlKDEpOworICByZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9maXhlZDY0X2ZpeGVkNjQiKSwgbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX3ZhbCk7CisgIG1hcF92YWwuU2V0VUludDY0VmFsdWUoMik7CisKKyAgbWFwX2tleS5TZXRJbnQzMlZhbHVlKDEpOworICByZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9zZml4ZWQzMl9zZml4ZWQzMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXksICZtYXBfdmFsKTsKKyAgbWFwX3ZhbC5TZXRJbnQzMlZhbHVlKDIpOworCisgIG1hcF9rZXkuU2V0SW50NjRWYWx1ZSgxKTsKKyAgcmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfc2ZpeGVkNjRfc2ZpeGVkNjQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbCk7CisgIG1hcF92YWwuU2V0SW50NjRWYWx1ZSgyKTsKKworICBtYXBfa2V5LlNldEludDMyVmFsdWUoMSk7CisgIHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX2ludDMyX2Zsb2F0IiksIG1hcF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF92YWwpOworICBtYXBfdmFsLlNldEZsb2F0VmFsdWUoMi4wKTsKKworICBtYXBfa2V5LlNldEludDMyVmFsdWUoMSk7CisgIHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX2ludDMyX2RvdWJsZSIpLCBtYXBfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfdmFsKTsKKyAgbWFwX3ZhbC5TZXREb3VibGVWYWx1ZSgyLjApOworCisgIG1hcF9rZXkuU2V0Qm9vbFZhbHVlKHRydWUpOworICByZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9ib29sX2Jvb2wiKSwgbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX3ZhbCk7CisgIG1hcF92YWwuU2V0Qm9vbFZhbHVlKGZhbHNlKTsKKworICBtYXBfa2V5LlNldFN0cmluZ1ZhbHVlKCIxIik7CisgIHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX3N0cmluZ19zdHJpbmciKSwgbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX3ZhbCk7CisgIG1hcF92YWwuU2V0U3RyaW5nVmFsdWUoIjIiKTsKKworICBtYXBfa2V5LlNldEludDMyVmFsdWUoMSk7CisgIHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX2ludDMyX2J5dGVzIiksIG1hcF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF92YWwpOworICBtYXBfdmFsLlNldFN0cmluZ1ZhbHVlKCIyIik7CisKKyAgbWFwX2tleS5TZXRJbnQzMlZhbHVlKDEpOworICByZWZsZWN0aW9uLT5JbnNlcnRPckxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9lbnVtIiksIG1hcF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF92YWwpOworICBtYXBfdmFsLlNldEVudW1WYWx1ZShtYXBfZW51bV9mb29fLT5udW1iZXIoKSk7CisKKyAgbWFwX2tleS5TZXRJbnQzMlZhbHVlKDEpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZSgKKyAgICAgIG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UiKSwgbWFwX2tleSwgJm1hcF92YWwpKTsKKyAgc3ViX2ZvcmVpZ25fbWVzc2FnZSA9IG1hcF92YWwuTXV0YWJsZU1lc3NhZ2VWYWx1ZSgpOworICBzdWJfZm9yZWlnbl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9mb3JlaWduX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbl9jXywgMik7Cit9CisKK3ZvaWQgTWFwUmVmbGVjdGlvblRlc3Rlcjo6UmVtb3ZlTGFzdE1hcHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBvdXRwdXQ7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMoKm1lc3NhZ2UsICZvdXRwdXQpOworICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dC5zaXplKCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBvdXRwdXRbaV07CisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgY29udGludWU7CisgICAgcmVmbGVjdGlvbi0+UmVtb3ZlTGFzdChtZXNzYWdlLCBmaWVsZCk7CisgIH0KK30KKwordm9pZCBNYXBSZWZsZWN0aW9uVGVzdGVyOjpSZWxlYXNlTGFzdE1hcHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBvdXRwdXQ7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMoKm1lc3NhZ2UsICZvdXRwdXQpOworICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dC5zaXplKCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBvdXRwdXRbaV07CisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgY29udGludWU7CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSBjb250aW51ZTsKKworICAgIE1lc3NhZ2UqIHJlbGVhc2VkID0gcmVmbGVjdGlvbi0+UmVsZWFzZUxhc3QobWVzc2FnZSwgZmllbGQpOworICAgIEFTU0VSVF9UUlVFKHJlbGVhc2VkICE9IG51bGxwdHIpCisgICAgICAgIDw8ICJSZWxlYXNlTGFzdCByZXR1cm5lZCBudWxscHRyIGZvcjogIiA8PCBmaWVsZC0+bmFtZSgpOworICAgIGRlbGV0ZSByZWxlYXNlZDsKKyAgfQorfQorCit2b2lkIE1hcFJlZmxlY3Rpb25UZXN0ZXI6OlN3YXBNYXBzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IG91dHB1dDsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZSwgJm91dHB1dCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0LnNpemUoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG91dHB1dFtpXTsKKyAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSBjb250aW51ZTsKKyAgICByZWZsZWN0aW9uLT5Td2FwRWxlbWVudHMobWVzc2FnZSwgZmllbGQsIDAsIDEpOworICB9Cit9CisKK3ZvaWQgTWFwUmVmbGVjdGlvblRlc3Rlcjo6TXV0YWJsZVVua25vd25GaWVsZHNPZk1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24oCisgICAgTWVzc2FnZSogbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBNZXNzYWdlKiBzdWJfbWVzc2FnZSA9IG51bGxwdHI7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9pbnQzMiIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TXV0YWJsZVVua25vd25GaWVsZHMoc3ViX21lc3NhZ2UpICE9CisgICAgICAgICAgICAgIG51bGxwdHIpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ludDY0X2ludDY0IikpOworICBFWFBFQ1RfVFJVRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhzdWJfbWVzc2FnZSkgIT0KKyAgICAgICAgICAgICAgbnVsbHB0cik7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfdWludDMyX3VpbnQzMiIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TXV0YWJsZVVua25vd25GaWVsZHMoc3ViX21lc3NhZ2UpICE9CisgICAgICAgICAgICAgIG51bGxwdHIpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX3VpbnQ2NF91aW50NjQiKSk7CisgIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVVbmtub3duRmllbGRzKHN1Yl9tZXNzYWdlKSAhPQorICAgICAgICAgICAgICBudWxscHRyKTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9zaW50MzJfc2ludDMyIikpOworICBFWFBFQ1RfVFJVRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhzdWJfbWVzc2FnZSkgIT0KKyAgICAgICAgICAgICAgbnVsbHB0cik7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfc2ludDY0X3NpbnQ2NCIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TXV0YWJsZVVua25vd25GaWVsZHMoc3ViX21lc3NhZ2UpICE9CisgICAgICAgICAgICAgIG51bGxwdHIpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ZpeGVkMzJfZml4ZWQzMiIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TXV0YWJsZVVua25vd25GaWVsZHMoc3ViX21lc3NhZ2UpICE9CisgICAgICAgICAgICAgIG51bGxwdHIpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ZpeGVkNjRfZml4ZWQ2NCIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TXV0YWJsZVVua25vd25GaWVsZHMoc3ViX21lc3NhZ2UpICE9CisgICAgICAgICAgICAgIG51bGxwdHIpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX3NmaXhlZDMyX3NmaXhlZDMyIikpOworICBFWFBFQ1RfVFJVRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhzdWJfbWVzc2FnZSkgIT0KKyAgICAgICAgICAgICAgbnVsbHB0cik7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfc2ZpeGVkNjRfc2ZpeGVkNjQiKSk7CisgIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVVbmtub3duRmllbGRzKHN1Yl9tZXNzYWdlKSAhPQorICAgICAgICAgICAgICBudWxscHRyKTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9mbG9hdCIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TXV0YWJsZVVua25vd25GaWVsZHMoc3ViX21lc3NhZ2UpICE9CisgICAgICAgICAgICAgIG51bGxwdHIpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ludDMyX2RvdWJsZSIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TXV0YWJsZVVua25vd25GaWVsZHMoc3ViX21lc3NhZ2UpICE9CisgICAgICAgICAgICAgIG51bGxwdHIpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2Jvb2xfYm9vbCIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TXV0YWJsZVVua25vd25GaWVsZHMoc3ViX21lc3NhZ2UpICE9CisgICAgICAgICAgICAgIG51bGxwdHIpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX3N0cmluZ19zdHJpbmciKSk7CisgIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVVbmtub3duRmllbGRzKHN1Yl9tZXNzYWdlKSAhPQorICAgICAgICAgICAgICBudWxscHRyKTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9ieXRlcyIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TXV0YWJsZVVua25vd25GaWVsZHMoc3ViX21lc3NhZ2UpICE9CisgICAgICAgICAgICAgIG51bGxwdHIpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ludDMyX2VudW0iKSk7CisgIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVVbmtub3duRmllbGRzKHN1Yl9tZXNzYWdlKSAhPQorICAgICAgICAgICAgICBudWxscHRyKTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UiKSk7CisgIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVVbmtub3duRmllbGRzKHN1Yl9tZXNzYWdlKSAhPQorICAgICAgICAgICAgICBudWxscHRyKTsKK30KKwordm9pZCBNYXBSZWZsZWN0aW9uVGVzdGVyOjpFeHBlY3RNYXBGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgc3RkOjpzdHJpbmcgc2NyYXRjaDsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBNZXNzYWdlKiBzdWJfbWVzc2FnZTsKKyAgTWFwS2V5IG1hcF9rZXk7CisgIE1hcFZhbHVlQ29uc3RSZWYgbWFwX3ZhbHVlX2NvbnN0X3JlZjsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigibWFwX2ludDMyX2ludDMyIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJtYXBfaW50NjRfaW50NjQiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoIm1hcF91aW50MzJfdWludDMyIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJtYXBfdWludDY0X3VpbnQ2NCIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigibWFwX3NpbnQzMl9zaW50MzIiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoIm1hcF9zaW50NjRfc2ludDY0IikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJtYXBfZml4ZWQzMl9maXhlZDMyIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJtYXBfZml4ZWQ2NF9maXhlZDY0IikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJtYXBfc2ZpeGVkMzJfc2ZpeGVkMzIiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoIm1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigibWFwX2ludDMyX2Zsb2F0IikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfZG91YmxlIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJtYXBfYm9vbF9ib29sIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJtYXBfc3RyaW5nX3N0cmluZyIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigibWFwX2ludDMyX2J5dGVzIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfZW51bSIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigibWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSIpKSk7CisKKyAgeworICAgIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+IG1hcDsKKyAgICBtYXBbMF0gPSAwOworICAgIG1hcFsxXSA9IDE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIGNvbnN0IGludGVybmFsOjpNYXBGaWVsZEJhc2UmIG1hcF9maWVsZCA9CisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmF3PGludGVybmFsOjpNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYoIm1hcF9pbnQzMl9pbnQzMiIpKTsKKyAgICAgIGlmIChtYXBfZmllbGQuSXNSZXBlYXRlZEZpZWxkVmFsaWQoKSkgeworICAgICAgICAvLyBDaGVjayB3aXRoIFJlcGVhdGVkRmllbGQgUmVmbGVjdGlvbgorICAgICAgICBzdWJfbWVzc2FnZSA9CisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9pbnQzMiIpLCBpKTsKKyAgICAgICAgaW50MzJfdCBrZXkgPSBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigKKyAgICAgICAgICAgICpzdWJfbWVzc2FnZSwgbWFwX2ludDMyX2ludDMyX2tleV8pOworICAgICAgICBpbnQzMl90IHZhbCA9IHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfaW50MzJfaW50MzJfdmFsXyk7CisgICAgICAgIEVYUEVDVF9FUShtYXBba2V5XSwgdmFsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENoZWNrIHdpdGggTWFwIFJlZmxlY3Rpb24KKyAgICAgICAgbWFwX2tleS5TZXRJbnQzMlZhbHVlKGkpOworICAgICAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkNvbnRhaW5zTWFwS2V5KG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9pbnQzMiIpLCBtYXBfa2V5KSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9pbnQzMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbHVlX2NvbnN0X3JlZikpOworICAgICAgICBFWFBFQ1RfRVEobWFwX3ZhbHVlX2NvbnN0X3JlZi5HZXRJbnQzMlZhbHVlKCksIG1hcFtpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIHsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBpbnQ2NF90PiBtYXA7CisgICAgbWFwWzBdID0gMDsKKyAgICBtYXBbMV0gPSAxOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICBjb25zdCBpbnRlcm5hbDo6TWFwRmllbGRCYXNlJiBtYXBfZmllbGQgPQorICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJhdzxpbnRlcm5hbDo6TWFwRmllbGRCYXNlPihtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGKCJtYXBfaW50NjRfaW50NjQiKSk7CisgICAgICBpZiAobWFwX2ZpZWxkLklzUmVwZWF0ZWRGaWVsZFZhbGlkKCkpIHsKKyAgICAgICAgLy8gQ2hlY2sgd2l0aCBSZXBlYXRlZEZpZWxkIFJlZmxlY3Rpb24KKyAgICAgICAgc3ViX21lc3NhZ2UgPQorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfaW50NjRfaW50NjQiKSwgaSk7CisgICAgICAgIGludDY0X3Qga2V5ID0gc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50NjQoCisgICAgICAgICAgICAqc3ViX21lc3NhZ2UsIG1hcF9pbnQ2NF9pbnQ2NF9rZXlfKTsKKyAgICAgICAgaW50NjRfdCB2YWwgPSBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQ2NCgKKyAgICAgICAgICAgICpzdWJfbWVzc2FnZSwgbWFwX2ludDY0X2ludDY0X3ZhbF8pOworICAgICAgICBFWFBFQ1RfRVEobWFwW2tleV0sIHZhbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDaGVjayB3aXRoIE1hcCBSZWZsZWN0aW9uCisgICAgICAgIG1hcF9rZXkuU2V0SW50NjRWYWx1ZShpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoCisgICAgICAgICAgICByZWZsZWN0aW9uLT5Db250YWluc01hcEtleShtZXNzYWdlLCBGKCJtYXBfaW50NjRfaW50NjQiKSwgbWFwX2tleSkpOworICAgICAgICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5Mb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfaW50NjRfaW50NjQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSwgJm1hcF92YWx1ZV9jb25zdF9yZWYpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1hcF92YWx1ZV9jb25zdF9yZWYuR2V0SW50NjRWYWx1ZSgpLCBtYXBbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorICB7CisgICAgc3RkOjptYXA8dWludDMyX3QsIHVpbnQzMl90PiBtYXA7CisgICAgbWFwWzBdID0gMDsKKyAgICBtYXBbMV0gPSAxOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICBjb25zdCBpbnRlcm5hbDo6TWFwRmllbGRCYXNlJiBtYXBfZmllbGQgPQorICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJhdzxpbnRlcm5hbDo6TWFwRmllbGRCYXNlPihtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGKCJtYXBfdWludDMyX3VpbnQzMiIpKTsKKyAgICAgIGlmIChtYXBfZmllbGQuSXNSZXBlYXRlZEZpZWxkVmFsaWQoKSkgeworICAgICAgICAvLyBDaGVjayB3aXRoIFJlcGVhdGVkRmllbGQgUmVmbGVjdGlvbgorICAgICAgICBzdWJfbWVzc2FnZSA9CisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF91aW50MzJfdWludDMyIiksIGkpOworICAgICAgICB1aW50MzJfdCBrZXkgPSBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRVSW50MzIoCisgICAgICAgICAgICAqc3ViX21lc3NhZ2UsIG1hcF91aW50MzJfdWludDMyX2tleV8pOworICAgICAgICB1aW50MzJfdCB2YWwgPSBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRVSW50MzIoCisgICAgICAgICAgICAqc3ViX21lc3NhZ2UsIG1hcF91aW50MzJfdWludDMyX3ZhbF8pOworICAgICAgICBFWFBFQ1RfRVEobWFwW2tleV0sIHZhbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDaGVjayB3aXRoIE1hcCBSZWZsZWN0aW9uCisgICAgICAgIG1hcF9rZXkuU2V0VUludDMyVmFsdWUoaSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkNvbnRhaW5zTWFwS2V5KG1lc3NhZ2UsIEYoIm1hcF91aW50MzJfdWludDMyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXkpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+TG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX3VpbnQzMl91aW50MzIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSwgJm1hcF92YWx1ZV9jb25zdF9yZWYpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1hcF92YWx1ZV9jb25zdF9yZWYuR2V0VUludDMyVmFsdWUoKSwgbWFwW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgeworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCB1aW50NjRfdD4gbWFwOworICAgIG1hcFswXSA9IDA7CisgICAgbWFwWzFdID0gMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgY29uc3QgaW50ZXJuYWw6Ok1hcEZpZWxkQmFzZSYgbWFwX2ZpZWxkID0KKyAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSYXc8aW50ZXJuYWw6Ok1hcEZpZWxkQmFzZT4obWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRigibWFwX3VpbnQ2NF91aW50NjQiKSk7CisgICAgICBpZiAobWFwX2ZpZWxkLklzUmVwZWF0ZWRGaWVsZFZhbGlkKCkpIHsKKyAgICAgICAgLy8gQ2hlY2sgd2l0aCBSZXBlYXRlZEZpZWxkIFJlZmxlY3Rpb24KKyAgICAgICAgc3ViX21lc3NhZ2UgPQorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfdWludDY0X3VpbnQ2NCIpLCBpKTsKKyAgICAgICAgdWludDY0X3Qga2V5ID0gc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0VUludDY0KAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfdWludDY0X3VpbnQ2NF9rZXlfKTsKKyAgICAgICAgdWludDY0X3QgdmFsID0gc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0VUludDY0KAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfdWludDY0X3VpbnQ2NF92YWxfKTsKKyAgICAgICAgRVhQRUNUX0VRKG1hcFtrZXldLCB2YWwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ2hlY2sgd2l0aCBNYXAgUmVmbGVjdGlvbgorICAgICAgICBtYXBfa2V5LlNldFVJbnQ2NFZhbHVlKGkpOworICAgICAgICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5Db250YWluc01hcEtleShtZXNzYWdlLCBGKCJtYXBfdWludDY0X3VpbnQ2NCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5KSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF91aW50NjRfdWludDY0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXksICZtYXBfdmFsdWVfY29uc3RfcmVmKSk7CisgICAgICAgIEVYUEVDVF9FUShtYXBfdmFsdWVfY29uc3RfcmVmLkdldFVJbnQ2NFZhbHVlKCksIG1hcFtpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIHsKKyAgICBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiBtYXA7CisgICAgbWFwWzBdID0gMDsKKyAgICBtYXBbMV0gPSAxOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICBjb25zdCBpbnRlcm5hbDo6TWFwRmllbGRCYXNlJiBtYXBfZmllbGQgPQorICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJhdzxpbnRlcm5hbDo6TWFwRmllbGRCYXNlPihtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGKCJtYXBfc2ludDMyX3NpbnQzMiIpKTsKKyAgICAgIGlmIChtYXBfZmllbGQuSXNSZXBlYXRlZEZpZWxkVmFsaWQoKSkgeworICAgICAgICAvLyBDaGVjayB3aXRoIFJlcGVhdGVkRmllbGQgUmVmbGVjdGlvbgorICAgICAgICBzdWJfbWVzc2FnZSA9CisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9zaW50MzJfc2ludDMyIiksIGkpOworICAgICAgICBpbnQzMl90IGtleSA9IHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfc2ludDMyX3NpbnQzMl9rZXlfKTsKKyAgICAgICAgaW50MzJfdCB2YWwgPSBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigKKyAgICAgICAgICAgICpzdWJfbWVzc2FnZSwgbWFwX3NpbnQzMl9zaW50MzJfdmFsXyk7CisgICAgICAgIEVYUEVDVF9FUShtYXBba2V5XSwgdmFsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENoZWNrIHdpdGggTWFwIFJlZmxlY3Rpb24KKyAgICAgICAgbWFwX2tleS5TZXRJbnQzMlZhbHVlKGkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgcmVmbGVjdGlvbi0+Q29udGFpbnNNYXBLZXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigibWFwX3NpbnQzMl9zaW50MzIiKSwgbWFwX2tleSkpOworICAgICAgICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5Mb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfc2ludDMyX3NpbnQzMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbHVlX2NvbnN0X3JlZikpOworICAgICAgICBFWFBFQ1RfRVEobWFwX3ZhbHVlX2NvbnN0X3JlZi5HZXRJbnQzMlZhbHVlKCksIG1hcFtpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIHsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBpbnQ2NF90PiBtYXA7CisgICAgbWFwWzBdID0gMDsKKyAgICBtYXBbMV0gPSAxOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICBjb25zdCBpbnRlcm5hbDo6TWFwRmllbGRCYXNlJiBtYXBfZmllbGQgPQorICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJhdzxpbnRlcm5hbDo6TWFwRmllbGRCYXNlPihtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGKCJtYXBfc2ludDY0X3NpbnQ2NCIpKTsKKyAgICAgIGlmIChtYXBfZmllbGQuSXNSZXBlYXRlZEZpZWxkVmFsaWQoKSkgeworICAgICAgICAvLyBDaGVjayB3aXRoIFJlcGVhdGVkRmllbGQgUmVmbGVjdGlvbgorICAgICAgICBzdWJfbWVzc2FnZSA9CisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoIm1hcF9zaW50NjRfc2ludDY0IiksIGkpOworICAgICAgICBpbnQ2NF90IGtleSA9IHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDY0KAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfc2ludDY0X3NpbnQ2NF9rZXlfKTsKKyAgICAgICAgaW50NjRfdCB2YWwgPSBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQ2NCgKKyAgICAgICAgICAgICpzdWJfbWVzc2FnZSwgbWFwX3NpbnQ2NF9zaW50NjRfdmFsXyk7CisgICAgICAgIEVYUEVDVF9FUShtYXBba2V5XSwgdmFsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENoZWNrIHdpdGggTWFwIFJlZmxlY3Rpb24KKyAgICAgICAgbWFwX2tleS5TZXRJbnQ2NFZhbHVlKGkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgcmVmbGVjdGlvbi0+Q29udGFpbnNNYXBLZXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigibWFwX3NpbnQ2NF9zaW50NjQiKSwgbWFwX2tleSkpOworICAgICAgICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5Mb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfc2ludDY0X3NpbnQ2NCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbHVlX2NvbnN0X3JlZikpOworICAgICAgICBFWFBFQ1RfRVEobWFwX3ZhbHVlX2NvbnN0X3JlZi5HZXRJbnQ2NFZhbHVlKCksIG1hcFtpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIHsKKyAgICBzdGQ6Om1hcDx1aW50MzJfdCwgdWludDMyX3Q+IG1hcDsKKyAgICBtYXBbMF0gPSAwOworICAgIG1hcFsxXSA9IDE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIGNvbnN0IGludGVybmFsOjpNYXBGaWVsZEJhc2UmIG1hcF9maWVsZCA9CisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmF3PGludGVybmFsOjpNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYoIm1hcF9maXhlZDMyX2ZpeGVkMzIiKSk7CisgICAgICBpZiAobWFwX2ZpZWxkLklzUmVwZWF0ZWRGaWVsZFZhbGlkKCkpIHsKKyAgICAgICAgLy8gQ2hlY2sgd2l0aCBSZXBlYXRlZEZpZWxkIFJlZmxlY3Rpb24KKyAgICAgICAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgICAgICAgICAgbWVzc2FnZSwgRigibWFwX2ZpeGVkMzJfZml4ZWQzMiIpLCBpKTsKKyAgICAgICAgdWludDMyX3Qga2V5ID0gc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0VUludDMyKAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfZml4ZWQzMl9maXhlZDMyX2tleV8pOworICAgICAgICB1aW50MzJfdCB2YWwgPSBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRVSW50MzIoCisgICAgICAgICAgICAqc3ViX21lc3NhZ2UsIG1hcF9maXhlZDMyX2ZpeGVkMzJfdmFsXyk7CisgICAgICAgIEVYUEVDVF9FUShtYXBba2V5XSwgdmFsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENoZWNrIHdpdGggTWFwIFJlZmxlY3Rpb24KKyAgICAgICAgbWFwX2tleS5TZXRVSW50MzJWYWx1ZShpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIHJlZmxlY3Rpb24tPkNvbnRhaW5zTWFwS2V5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoIm1hcF9maXhlZDMyX2ZpeGVkMzIiKSwgbWFwX2tleSkpOworICAgICAgICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5Mb29rdXBNYXBWYWx1ZSgKKyAgICAgICAgICAgIG1lc3NhZ2UsIEYoIm1hcF9maXhlZDMyX2ZpeGVkMzIiKSwgbWFwX2tleSwgJm1hcF92YWx1ZV9jb25zdF9yZWYpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1hcF92YWx1ZV9jb25zdF9yZWYuR2V0VUludDMyVmFsdWUoKSwgbWFwW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgeworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCB1aW50NjRfdD4gbWFwOworICAgIG1hcFswXSA9IDA7CisgICAgbWFwWzFdID0gMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgY29uc3QgaW50ZXJuYWw6Ok1hcEZpZWxkQmFzZSYgbWFwX2ZpZWxkID0KKyAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSYXc8aW50ZXJuYWw6Ok1hcEZpZWxkQmFzZT4obWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRigibWFwX2ZpeGVkNjRfZml4ZWQ2NCIpKTsKKyAgICAgIGlmIChtYXBfZmllbGQuSXNSZXBlYXRlZEZpZWxkVmFsaWQoKSkgeworICAgICAgICAvLyBDaGVjayB3aXRoIFJlcGVhdGVkRmllbGQgUmVmbGVjdGlvbgorICAgICAgICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UoCisgICAgICAgICAgICBtZXNzYWdlLCBGKCJtYXBfZml4ZWQ2NF9maXhlZDY0IiksIGkpOworICAgICAgICB1aW50NjRfdCBrZXkgPSBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRVSW50NjQoCisgICAgICAgICAgICAqc3ViX21lc3NhZ2UsIG1hcF9maXhlZDY0X2ZpeGVkNjRfa2V5Xyk7CisgICAgICAgIHVpbnQ2NF90IHZhbCA9IHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldFVJbnQ2NCgKKyAgICAgICAgICAgICpzdWJfbWVzc2FnZSwgbWFwX2ZpeGVkNjRfZml4ZWQ2NF92YWxfKTsKKyAgICAgICAgRVhQRUNUX0VRKG1hcFtrZXldLCB2YWwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ2hlY2sgd2l0aCBNYXAgUmVmbGVjdGlvbgorICAgICAgICBtYXBfa2V5LlNldFVJbnQ2NFZhbHVlKGkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgcmVmbGVjdGlvbi0+Q29udGFpbnNNYXBLZXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigibWFwX2ZpeGVkNjRfZml4ZWQ2NCIpLCBtYXBfa2V5KSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkxvb2t1cE1hcFZhbHVlKAorICAgICAgICAgICAgbWVzc2FnZSwgRigibWFwX2ZpeGVkNjRfZml4ZWQ2NCIpLCBtYXBfa2V5LCAmbWFwX3ZhbHVlX2NvbnN0X3JlZikpOworICAgICAgICBFWFBFQ1RfRVEobWFwX3ZhbHVlX2NvbnN0X3JlZi5HZXRVSW50NjRWYWx1ZSgpLCBtYXBbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorICB7CisgICAgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gbWFwOworICAgIG1hcFswXSA9IDA7CisgICAgbWFwWzFdID0gMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgY29uc3QgaW50ZXJuYWw6Ok1hcEZpZWxkQmFzZSYgbWFwX2ZpZWxkID0KKyAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSYXc8aW50ZXJuYWw6Ok1hcEZpZWxkQmFzZT4oCisgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoIm1hcF9zZml4ZWQzMl9zZml4ZWQzMiIpKTsKKyAgICAgIGlmIChtYXBfZmllbGQuSXNSZXBlYXRlZEZpZWxkVmFsaWQoKSkgeworICAgICAgICAvLyBDaGVjayB3aXRoIFJlcGVhdGVkRmllbGQgUmVmbGVjdGlvbgorICAgICAgICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UoCisgICAgICAgICAgICBtZXNzYWdlLCBGKCJtYXBfc2ZpeGVkMzJfc2ZpeGVkMzIiKSwgaSk7CisgICAgICAgIGludDMyX3Qga2V5ID0gc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoCisgICAgICAgICAgICAqc3ViX21lc3NhZ2UsIG1hcF9zZml4ZWQzMl9zZml4ZWQzMl9rZXlfKTsKKyAgICAgICAgaW50MzJfdCB2YWwgPSBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigKKyAgICAgICAgICAgICpzdWJfbWVzc2FnZSwgbWFwX3NmaXhlZDMyX3NmaXhlZDMyX3ZhbF8pOworICAgICAgICBFWFBFQ1RfRVEobWFwW2tleV0sIHZhbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDaGVjayB3aXRoIE1hcCBSZWZsZWN0aW9uCisgICAgICAgIG1hcF9rZXkuU2V0SW50MzJWYWx1ZShpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIHJlZmxlY3Rpb24tPkNvbnRhaW5zTWFwS2V5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoIm1hcF9zZml4ZWQzMl9zZml4ZWQzMiIpLCBtYXBfa2V5KSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYoIm1hcF9zZml4ZWQzMl9zZml4ZWQzMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbHVlX2NvbnN0X3JlZikpOworICAgICAgICBFWFBFQ1RfRVEobWFwX3ZhbHVlX2NvbnN0X3JlZi5HZXRJbnQzMlZhbHVlKCksIG1hcFtpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIHsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBpbnQ2NF90PiBtYXA7CisgICAgbWFwWzBdID0gMDsKKyAgICBtYXBbMV0gPSAxOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICBjb25zdCBpbnRlcm5hbDo6TWFwRmllbGRCYXNlJiBtYXBfZmllbGQgPQorICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJhdzxpbnRlcm5hbDo6TWFwRmllbGRCYXNlPigKKyAgICAgICAgICAgICAgbWVzc2FnZSwgRigibWFwX3NmaXhlZDY0X3NmaXhlZDY0IikpOworICAgICAgaWYgKG1hcF9maWVsZC5Jc1JlcGVhdGVkRmllbGRWYWxpZCgpKSB7CisgICAgICAgIC8vIENoZWNrIHdpdGggUmVwZWF0ZWRGaWVsZCBSZWZsZWN0aW9uCisgICAgICAgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZSgKKyAgICAgICAgICAgIG1lc3NhZ2UsIEYoIm1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCIpLCBpKTsKKyAgICAgICAgaW50NjRfdCBrZXkgPSBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQ2NCgKKyAgICAgICAgICAgICpzdWJfbWVzc2FnZSwgbWFwX3NmaXhlZDY0X3NmaXhlZDY0X2tleV8pOworICAgICAgICBpbnQ2NF90IHZhbCA9IHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDY0KAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfc2ZpeGVkNjRfc2ZpeGVkNjRfdmFsXyk7CisgICAgICAgIEVYUEVDVF9FUShtYXBba2V5XSwgdmFsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENoZWNrIHdpdGggTWFwIFJlZmxlY3Rpb24KKyAgICAgICAgbWFwX2tleS5TZXRJbnQ2NFZhbHVlKGkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgcmVmbGVjdGlvbi0+Q29udGFpbnNNYXBLZXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigibWFwX3NmaXhlZDY0X3NmaXhlZDY0IiksIG1hcF9rZXkpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+TG9va3VwTWFwVmFsdWUobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRigibWFwX3NmaXhlZDY0X3NmaXhlZDY0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXksICZtYXBfdmFsdWVfY29uc3RfcmVmKSk7CisgICAgICAgIEVYUEVDVF9FUShtYXBfdmFsdWVfY29uc3RfcmVmLkdldEludDY0VmFsdWUoKSwgbWFwW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgeworICAgIHN0ZDo6bWFwPGludDMyX3QsIGZsb2F0PiBtYXA7CisgICAgbWFwWzBdID0gMC4wOworICAgIG1hcFsxXSA9IDEuMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgY29uc3QgaW50ZXJuYWw6Ok1hcEZpZWxkQmFzZSYgbWFwX2ZpZWxkID0KKyAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSYXc8aW50ZXJuYWw6Ok1hcEZpZWxkQmFzZT4obWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRigibWFwX2ludDMyX2Zsb2F0IikpOworICAgICAgaWYgKG1hcF9maWVsZC5Jc1JlcGVhdGVkRmllbGRWYWxpZCgpKSB7CisgICAgICAgIC8vIENoZWNrIHdpdGggUmVwZWF0ZWRGaWVsZCBSZWZsZWN0aW9uCisgICAgICAgIHN1Yl9tZXNzYWdlID0KKyAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ludDMyX2Zsb2F0IiksIGkpOworICAgICAgICBpbnQzMl90IGtleSA9IHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfaW50MzJfZmxvYXRfa2V5Xyk7CisgICAgICAgIGZsb2F0IHZhbCA9IHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEZsb2F0KAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfaW50MzJfZmxvYXRfdmFsXyk7CisgICAgICAgIEVYUEVDVF9FUShtYXBba2V5XSwgdmFsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENoZWNrIHdpdGggTWFwIFJlZmxlY3Rpb24KKyAgICAgICAgbWFwX2tleS5TZXRJbnQzMlZhbHVlKGkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgcmVmbGVjdGlvbi0+Q29udGFpbnNNYXBLZXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigibWFwX2ludDMyX2Zsb2F0IiksIG1hcF9rZXkpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+TG9va3VwTWFwVmFsdWUobWVzc2FnZSwgRigibWFwX2ludDMyX2Zsb2F0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXksICZtYXBfdmFsdWVfY29uc3RfcmVmKSk7CisgICAgICAgIEVYUEVDVF9FUShtYXBfdmFsdWVfY29uc3RfcmVmLkdldEZsb2F0VmFsdWUoKSwgbWFwW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgeworICAgIHN0ZDo6bWFwPGludDMyX3QsIGRvdWJsZT4gbWFwOworICAgIG1hcFswXSA9IDAuMDsKKyAgICBtYXBbMV0gPSAxLjA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIGNvbnN0IGludGVybmFsOjpNYXBGaWVsZEJhc2UmIG1hcF9maWVsZCA9CisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmF3PGludGVybmFsOjpNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYoIm1hcF9pbnQzMl9kb3VibGUiKSk7CisgICAgICBpZiAobWFwX2ZpZWxkLklzUmVwZWF0ZWRGaWVsZFZhbGlkKCkpIHsKKyAgICAgICAgLy8gQ2hlY2sgd2l0aCBSZXBlYXRlZEZpZWxkIFJlZmxlY3Rpb24KKyAgICAgICAgc3ViX21lc3NhZ2UgPQorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfZG91YmxlIiksIGkpOworICAgICAgICBpbnQzMl90IGtleSA9IHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfaW50MzJfZG91YmxlX2tleV8pOworICAgICAgICBkb3VibGUgdmFsID0gc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0RG91YmxlKAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfaW50MzJfZG91YmxlX3ZhbF8pOworICAgICAgICBFWFBFQ1RfRVEobWFwW2tleV0sIHZhbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDaGVjayB3aXRoIE1hcCBSZWZsZWN0aW9uCisgICAgICAgIG1hcF9rZXkuU2V0SW50MzJWYWx1ZShpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIHJlZmxlY3Rpb24tPkNvbnRhaW5zTWFwS2V5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9kb3VibGUiKSwgbWFwX2tleSkpOworICAgICAgICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5Mb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfZG91YmxlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXksICZtYXBfdmFsdWVfY29uc3RfcmVmKSk7CisgICAgICAgIEVYUEVDVF9FUShtYXBfdmFsdWVfY29uc3RfcmVmLkdldERvdWJsZVZhbHVlKCksIG1hcFtpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIHsKKyAgICBzdGQ6Om1hcDxib29sLCBib29sPiBtYXA7CisgICAgbWFwW2ZhbHNlXSA9IGZhbHNlOworICAgIG1hcFt0cnVlXSA9IHRydWU7CisgICAgc3RkOjp2ZWN0b3I8Ym9vbD4ga2V5cyA9IHtmYWxzZSwgdHJ1ZX07CisgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gdmFscyA9IHtmYWxzZSwgdHJ1ZX07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIGNvbnN0IGludGVybmFsOjpNYXBGaWVsZEJhc2UmIG1hcF9maWVsZCA9CisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmF3PGludGVybmFsOjpNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYoIm1hcF9ib29sX2Jvb2wiKSk7CisgICAgICBpZiAobWFwX2ZpZWxkLklzUmVwZWF0ZWRGaWVsZFZhbGlkKCkpIHsKKyAgICAgICAgLy8gQ2hlY2sgd2l0aCBSZXBlYXRlZEZpZWxkIFJlZmxlY3Rpb24KKyAgICAgICAgc3ViX21lc3NhZ2UgPQorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfYm9vbF9ib29sIiksIGkpOworICAgICAgICBib29sIGtleSA9IHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEJvb2woKnN1Yl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2Jvb2xfYm9vbF9rZXlfKTsKKyAgICAgICAgYm9vbCB2YWwgPSBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRCb29sKCpzdWJfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9ib29sX2Jvb2xfdmFsXyk7CisgICAgICAgIEVYUEVDVF9FUShtYXBba2V5XSwgdmFsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENoZWNrIHdpdGggTWFwIFJlZmxlY3Rpb24KKyAgICAgICAgbWFwX2tleS5TZXRCb29sVmFsdWUoa2V5c1tpXSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCByZWZsZWN0aW9uLT5Db250YWluc01hcEtleShtZXNzYWdlLCBGKCJtYXBfYm9vbF9ib29sIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5KSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9ib29sX2Jvb2wiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSwgJm1hcF92YWx1ZV9jb25zdF9yZWYpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1hcF92YWx1ZV9jb25zdF9yZWYuR2V0Qm9vbFZhbHVlKCksIHZhbHNbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorICB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtYXA7CisgICAgbWFwWyIwIl0gPSAiMCI7CisgICAgbWFwWyIxIl0gPSAiMSI7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGtleXMgPSB7IjAiLCAiMSJ9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2YWxzID0geyIwIiwgIjEifTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgY29uc3QgaW50ZXJuYWw6Ok1hcEZpZWxkQmFzZSYgbWFwX2ZpZWxkID0KKyAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSYXc8aW50ZXJuYWw6Ok1hcEZpZWxkQmFzZT4obWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRigibWFwX3N0cmluZ19zdHJpbmciKSk7CisgICAgICBpZiAobWFwX2ZpZWxkLklzUmVwZWF0ZWRGaWVsZFZhbGlkKCkpIHsKKyAgICAgICAgLy8gQ2hlY2sgd2l0aCBSZXBlYXRlZEZpZWxkIFJlZmxlY3Rpb24KKyAgICAgICAgc3ViX21lc3NhZ2UgPQorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJtYXBfc3RyaW5nX3N0cmluZyIpLCBpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcga2V5ID0gc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0U3RyaW5nKAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfc3RyaW5nX3N0cmluZ19rZXlfKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgdmFsID0gc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0U3RyaW5nKAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfc3RyaW5nX3N0cmluZ192YWxfKTsKKyAgICAgICAgRVhQRUNUX0VRKG1hcFtrZXldLCB2YWwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ2hlY2sgd2l0aCBNYXAgUmVmbGVjdGlvbgorICAgICAgICBtYXBfa2V5LlNldFN0cmluZ1ZhbHVlKGtleXNbaV0pOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgcmVmbGVjdGlvbi0+Q29udGFpbnNNYXBLZXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigibWFwX3N0cmluZ19zdHJpbmciKSwgbWFwX2tleSkpOworICAgICAgICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5Mb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfc3RyaW5nX3N0cmluZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbHVlX2NvbnN0X3JlZikpOworICAgICAgICBFWFBFQ1RfRVEobWFwX3ZhbHVlX2NvbnN0X3JlZi5HZXRTdHJpbmdWYWx1ZSgpLCB2YWxzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgeworICAgIHN0ZDo6bWFwPGludDMyX3QsIHN0ZDo6c3RyaW5nPiBtYXA7CisgICAgbWFwWzBdID0gIjAiOworICAgIG1hcFsxXSA9ICIxIjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgY29uc3QgaW50ZXJuYWw6Ok1hcEZpZWxkQmFzZSYgbWFwX2ZpZWxkID0KKyAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSYXc8aW50ZXJuYWw6Ok1hcEZpZWxkQmFzZT4obWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRigibWFwX2ludDMyX2J5dGVzIikpOworICAgICAgaWYgKG1hcF9maWVsZC5Jc1JlcGVhdGVkRmllbGRWYWxpZCgpKSB7CisgICAgICAgIC8vIENoZWNrIHdpdGggUmVwZWF0ZWRGaWVsZCBSZWZsZWN0aW9uCisgICAgICAgIHN1Yl9tZXNzYWdlID0KKyAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ludDMyX2J5dGVzIiksIGkpOworICAgICAgICBpbnQzMl90IGtleSA9IHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfaW50MzJfYnl0ZXNfa2V5Xyk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHZhbCA9IHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldFN0cmluZygKKyAgICAgICAgICAgICpzdWJfbWVzc2FnZSwgbWFwX2ludDMyX2J5dGVzX3ZhbF8pOworICAgICAgICBFWFBFQ1RfRVEobWFwW2tleV0sIHZhbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDaGVjayB3aXRoIE1hcCBSZWZsZWN0aW9uCisgICAgICAgIG1hcF9rZXkuU2V0SW50MzJWYWx1ZShpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIHJlZmxlY3Rpb24tPkNvbnRhaW5zTWFwS2V5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9ieXRlcyIpLCBtYXBfa2V5KSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkxvb2t1cE1hcFZhbHVlKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9ieXRlcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbHVlX2NvbnN0X3JlZikpOworICAgICAgICBFWFBFQ1RfRVEobWFwX3ZhbHVlX2NvbnN0X3JlZi5HZXRTdHJpbmdWYWx1ZSgpLCBtYXBbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorICB7CisgICAgc3RkOjptYXA8aW50MzJfdCwgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcio+IG1hcDsKKyAgICBtYXBbMF0gPSBtYXBfZW51bV9iYXJfOworICAgIG1hcFsxXSA9IG1hcF9lbnVtX2Jhel87CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIGNvbnN0IGludGVybmFsOjpNYXBGaWVsZEJhc2UmIG1hcF9maWVsZCA9CisgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmF3PGludGVybmFsOjpNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYoIm1hcF9pbnQzMl9lbnVtIikpOworICAgICAgaWYgKG1hcF9maWVsZC5Jc1JlcGVhdGVkRmllbGRWYWxpZCgpKSB7CisgICAgICAgIC8vIENoZWNrIHdpdGggUmVwZWF0ZWRGaWVsZCBSZWZsZWN0aW9uCisgICAgICAgIHN1Yl9tZXNzYWdlID0KKyAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigibWFwX2ludDMyX2VudW0iKSwgaSk7CisgICAgICAgIGludDMyX3Qga2V5ID0gc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoCisgICAgICAgICAgICAqc3ViX21lc3NhZ2UsIG1hcF9pbnQzMl9lbnVtX2tleV8pOworICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWwgPSBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRFbnVtKAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfaW50MzJfZW51bV92YWxfKTsKKyAgICAgICAgRVhQRUNUX0VRKG1hcFtrZXldLCB2YWwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ2hlY2sgd2l0aCBNYXAgUmVmbGVjdGlvbgorICAgICAgICBtYXBfa2V5LlNldEludDMyVmFsdWUoaSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCByZWZsZWN0aW9uLT5Db250YWluc01hcEtleShtZXNzYWdlLCBGKCJtYXBfaW50MzJfZW51bSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSkpOworICAgICAgICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5Mb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfZW51bSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5LCAmbWFwX3ZhbHVlX2NvbnN0X3JlZikpOworICAgICAgICBFWFBFQ1RfRVEobWFwX3ZhbHVlX2NvbnN0X3JlZi5HZXRFbnVtVmFsdWUoKSwgbWFwW2ldLT5udW1iZXIoKSk7CisgICAgICB9CisgICAgfQorICB9CisgIHsKKyAgICBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiBtYXA7CisgICAgbWFwWzBdID0gMDsKKyAgICBtYXBbMV0gPSAxOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICBjb25zdCBpbnRlcm5hbDo6TWFwRmllbGRCYXNlJiBtYXBfZmllbGQgPQorICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJhdzxpbnRlcm5hbDo6TWFwRmllbGRCYXNlPigKKyAgICAgICAgICAgICAgbWVzc2FnZSwgRigibWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSIpKTsKKyAgICAgIGlmIChtYXBfZmllbGQuSXNSZXBlYXRlZEZpZWxkVmFsaWQoKSkgeworICAgICAgICAvLyBDaGVjayB3aXRoIFJlcGVhdGVkRmllbGQgUmVmbGVjdGlvbgorICAgICAgICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UoCisgICAgICAgICAgICBtZXNzYWdlLCBGKCJtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlIiksIGkpOworICAgICAgICBpbnQzMl90IGtleSA9IHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKAorICAgICAgICAgICAgKnN1Yl9tZXNzYWdlLCBtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlX2tleV8pOworICAgICAgICBjb25zdCBNZXNzYWdlJiBmb3JlaWduX21lc3NhZ2UgPQorICAgICAgICAgICAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAqc3ViX21lc3NhZ2UsIG1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VfdmFsXyk7CisgICAgICAgIGludDMyX3QgdmFsID0gZm9yZWlnbl9tZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoZm9yZWlnbl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25fY18pOworICAgICAgICBFWFBFQ1RfRVEobWFwW2tleV0sIHZhbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDaGVjayB3aXRoIE1hcCBSZWZsZWN0aW9uCisgICAgICAgIG1hcF9rZXkuU2V0SW50MzJWYWx1ZShpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIHJlZmxlY3Rpb24tPkNvbnRhaW5zTWFwS2V5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UiKSwgbWFwX2tleSkpOworICAgICAgICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5Mb29rdXBNYXBWYWx1ZShtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGKCJtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXksICZtYXBfdmFsdWVfY29uc3RfcmVmKSk7CisgICAgICAgIGNvbnN0IE1lc3NhZ2UmIGZvcmVpZ25fbWVzc2FnZSA9IG1hcF92YWx1ZV9jb25zdF9yZWYuR2V0TWVzc2FnZVZhbHVlKCk7CisgICAgICAgIEVYUEVDVF9FUShmb3JlaWduX21lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMihmb3JlaWduX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduX2NfKSwKKyAgICAgICAgICAgICAgICAgIG1hcFtpXSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgTWFwUmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0TWFwRmllbGRzU2V0VmlhUmVmbGVjdGlvbkl0ZXJhdG9yKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgc3RkOjpzdHJpbmcgc2NyYXRjaDsKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKCptZXNzYWdlLCBGKCJtYXBfaW50MzJfaW50MzIiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKCptZXNzYWdlLCBGKCJtYXBfaW50NjRfaW50NjQiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKCptZXNzYWdlLCBGKCJtYXBfdWludDMyX3VpbnQzMiIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIEYoIm1hcF91aW50NjRfdWludDY0IikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgRigibWFwX3NpbnQzMl9zaW50MzIiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKCptZXNzYWdlLCBGKCJtYXBfc2ludDY0X3NpbnQ2NCIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIEYoIm1hcF9maXhlZDMyX2ZpeGVkMzIiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKCptZXNzYWdlLCBGKCJtYXBfZml4ZWQ2NF9maXhlZDY0IikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgRigibWFwX3NmaXhlZDMyX3NmaXhlZDMyIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgRigibWFwX3NmaXhlZDY0X3NmaXhlZDY0IikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgRigibWFwX2ludDMyX2Zsb2F0IikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgRigibWFwX2ludDMyX2RvdWJsZSIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIEYoIm1hcF9ib29sX2Jvb2wiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKCptZXNzYWdlLCBGKCJtYXBfc3RyaW5nX3N0cmluZyIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9ieXRlcyIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9lbnVtIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgRigibWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSIpKSk7CisKKyAgeworICAgIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+IG1hcDsKKyAgICBtYXBbMF0gPSAwOworICAgIG1hcFsxXSA9IDE7CisgICAgaW50IHNpemUgPSAwOworICAgIGZvciAoTWFwSXRlcmF0b3IgaXRlciA9IHJlZmxlY3Rpb24tPk1hcEJlZ2luKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9pbnQzMiIpKTsKKyAgICAgICAgIGl0ZXIgIT0gcmVmbGVjdGlvbi0+TWFwRW5kKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9pbnQzMiIpKTsKKyAgICAgICAgICsraXRlciwgKytzaXplKSB7CisgICAgICAvLyBDaGVjayBjb25zdCBtZXRob2RzIGRvIG5vdCBpbnZhbGlkYXRlIG1hcC4KKyAgICAgIG1lc3NhZ2UtPkRlYnVnU3RyaW5nKCk7CisgICAgICBtZXNzYWdlLT5TaG9ydERlYnVnU3RyaW5nKCk7CisgICAgICBtZXNzYWdlLT5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCk7CisgICAgICBtZXNzYWdlLT5TcGFjZVVzZWRMb25nKCk7CisgICAgICBtZXNzYWdlLT5CeXRlU2l6ZUxvbmcoKTsKKyAgICAgIEVYUEVDVF9FUShtYXBbaXRlci5HZXRLZXkoKS5HZXRJbnQzMlZhbHVlKCldLAorICAgICAgICAgICAgICAgIGl0ZXIuR2V0VmFsdWVSZWYoKS5HZXRJbnQzMlZhbHVlKCkpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoc2l6ZSwgMik7CisgIH0KKyAgeworICAgIHN0ZDo6bWFwPGludDY0X3QsIGludDY0X3Q+IG1hcDsKKyAgICBtYXBbMF0gPSAwOworICAgIG1hcFsxXSA9IDE7CisgICAgZm9yIChNYXBJdGVyYXRvciBpdGVyID0gcmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX2ludDY0X2ludDY0IikpOworICAgICAgICAgaXRlciAhPSByZWZsZWN0aW9uLT5NYXBFbmQobWVzc2FnZSwgRigibWFwX2ludDY0X2ludDY0IikpOyArK2l0ZXIpIHsKKyAgICAgIEVYUEVDVF9FUShtYXBbaXRlci5HZXRLZXkoKS5HZXRJbnQ2NFZhbHVlKCldLAorICAgICAgICAgICAgICAgIGl0ZXIuR2V0VmFsdWVSZWYoKS5HZXRJbnQ2NFZhbHVlKCkpOworICAgIH0KKyAgfQorICB7CisgICAgc3RkOjptYXA8dWludDMyX3QsIHVpbnQzMl90PiBtYXA7CisgICAgbWFwWzBdID0gMDsKKyAgICBtYXBbMV0gPSAxOworICAgIGZvciAoTWFwSXRlcmF0b3IgaXRlciA9CisgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX3VpbnQzMl91aW50MzIiKSk7CisgICAgICAgICBpdGVyICE9IHJlZmxlY3Rpb24tPk1hcEVuZChtZXNzYWdlLCBGKCJtYXBfdWludDMyX3VpbnQzMiIpKTsgKytpdGVyKSB7CisgICAgICBFWFBFQ1RfRVEobWFwW2l0ZXIuR2V0S2V5KCkuR2V0VUludDMyVmFsdWUoKV0sCisgICAgICAgICAgICAgICAgaXRlci5HZXRWYWx1ZVJlZigpLkdldFVJbnQzMlZhbHVlKCkpOworICAgIH0KKyAgfQorICB7CisgICAgc3RkOjptYXA8dWludDY0X3QsIHVpbnQ2NF90PiBtYXA7CisgICAgbWFwWzBdID0gMDsKKyAgICBtYXBbMV0gPSAxOworICAgIGZvciAoTWFwSXRlcmF0b3IgaXRlciA9CisgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX3VpbnQ2NF91aW50NjQiKSk7CisgICAgICAgICBpdGVyICE9IHJlZmxlY3Rpb24tPk1hcEVuZChtZXNzYWdlLCBGKCJtYXBfdWludDY0X3VpbnQ2NCIpKTsgKytpdGVyKSB7CisgICAgICBFWFBFQ1RfRVEobWFwW2l0ZXIuR2V0S2V5KCkuR2V0VUludDY0VmFsdWUoKV0sCisgICAgICAgICAgICAgICAgaXRlci5HZXRWYWx1ZVJlZigpLkdldFVJbnQ2NFZhbHVlKCkpOworICAgIH0KKyAgfQorICB7CisgICAgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gbWFwOworICAgIG1hcFswXSA9IDA7CisgICAgbWFwWzFdID0gMTsKKyAgICBmb3IgKE1hcEl0ZXJhdG9yIGl0ZXIgPQorICAgICAgICAgICAgIHJlZmxlY3Rpb24tPk1hcEJlZ2luKG1lc3NhZ2UsIEYoIm1hcF9zaW50MzJfc2ludDMyIikpOworICAgICAgICAgaXRlciAhPSByZWZsZWN0aW9uLT5NYXBFbmQobWVzc2FnZSwgRigibWFwX3NpbnQzMl9zaW50MzIiKSk7ICsraXRlcikgeworICAgICAgRVhQRUNUX0VRKG1hcFtpdGVyLkdldEtleSgpLkdldEludDMyVmFsdWUoKV0sCisgICAgICAgICAgICAgICAgaXRlci5HZXRWYWx1ZVJlZigpLkdldEludDMyVmFsdWUoKSk7CisgICAgfQorICB9CisgIHsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBpbnQ2NF90PiBtYXA7CisgICAgbWFwWzBdID0gMDsKKyAgICBtYXBbMV0gPSAxOworICAgIGZvciAoTWFwSXRlcmF0b3IgaXRlciA9CisgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX3NpbnQ2NF9zaW50NjQiKSk7CisgICAgICAgICBpdGVyICE9IHJlZmxlY3Rpb24tPk1hcEVuZChtZXNzYWdlLCBGKCJtYXBfc2ludDY0X3NpbnQ2NCIpKTsgKytpdGVyKSB7CisgICAgICBFWFBFQ1RfRVEobWFwW2l0ZXIuR2V0S2V5KCkuR2V0SW50NjRWYWx1ZSgpXSwKKyAgICAgICAgICAgICAgICBpdGVyLkdldFZhbHVlUmVmKCkuR2V0SW50NjRWYWx1ZSgpKTsKKyAgICB9CisgIH0KKyAgeworICAgIHN0ZDo6bWFwPHVpbnQzMl90LCB1aW50MzJfdD4gbWFwOworICAgIG1hcFswXSA9IDA7CisgICAgbWFwWzFdID0gMTsKKyAgICBmb3IgKE1hcEl0ZXJhdG9yIGl0ZXIgPQorICAgICAgICAgICAgIHJlZmxlY3Rpb24tPk1hcEJlZ2luKG1lc3NhZ2UsIEYoIm1hcF9maXhlZDMyX2ZpeGVkMzIiKSk7CisgICAgICAgICBpdGVyICE9IHJlZmxlY3Rpb24tPk1hcEVuZChtZXNzYWdlLCBGKCJtYXBfZml4ZWQzMl9maXhlZDMyIikpOworICAgICAgICAgKytpdGVyKSB7CisgICAgICBFWFBFQ1RfRVEobWFwW2l0ZXIuR2V0S2V5KCkuR2V0VUludDMyVmFsdWUoKV0sCisgICAgICAgICAgICAgICAgaXRlci5HZXRWYWx1ZVJlZigpLkdldFVJbnQzMlZhbHVlKCkpOworICAgIH0KKyAgfQorICB7CisgICAgc3RkOjptYXA8dWludDY0X3QsIHVpbnQ2NF90PiBtYXA7CisgICAgbWFwWzBdID0gMDsKKyAgICBtYXBbMV0gPSAxOworICAgIGZvciAoTWFwSXRlcmF0b3IgaXRlciA9CisgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX2ZpeGVkNjRfZml4ZWQ2NCIpKTsKKyAgICAgICAgIGl0ZXIgIT0gcmVmbGVjdGlvbi0+TWFwRW5kKG1lc3NhZ2UsIEYoIm1hcF9maXhlZDY0X2ZpeGVkNjQiKSk7CisgICAgICAgICArK2l0ZXIpIHsKKyAgICAgIEVYUEVDVF9FUShtYXBbaXRlci5HZXRLZXkoKS5HZXRVSW50NjRWYWx1ZSgpXSwKKyAgICAgICAgICAgICAgICBpdGVyLkdldFZhbHVlUmVmKCkuR2V0VUludDY0VmFsdWUoKSk7CisgICAgfQorICB9CisgIHsKKyAgICBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiBtYXA7CisgICAgbWFwWzBdID0gMDsKKyAgICBtYXBbMV0gPSAxOworICAgIGZvciAoTWFwSXRlcmF0b3IgaXRlciA9CisgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX3NmaXhlZDMyX3NmaXhlZDMyIikpOworICAgICAgICAgaXRlciAhPSByZWZsZWN0aW9uLT5NYXBFbmQobWVzc2FnZSwgRigibWFwX3NmaXhlZDMyX3NmaXhlZDMyIikpOworICAgICAgICAgKytpdGVyKSB7CisgICAgICBFWFBFQ1RfRVEobWFwW2l0ZXIuR2V0S2V5KCkuR2V0SW50MzJWYWx1ZSgpXSwKKyAgICAgICAgICAgICAgICBpdGVyLkdldFZhbHVlUmVmKCkuR2V0SW50MzJWYWx1ZSgpKTsKKyAgICB9CisgIH0KKyAgeworICAgIHN0ZDo6bWFwPGludDMyX3QsIGZsb2F0PiBtYXA7CisgICAgbWFwWzBdID0gMC4wOworICAgIG1hcFsxXSA9IDEuMDsKKyAgICBmb3IgKE1hcEl0ZXJhdG9yIGl0ZXIgPSByZWZsZWN0aW9uLT5NYXBCZWdpbihtZXNzYWdlLCBGKCJtYXBfaW50MzJfZmxvYXQiKSk7CisgICAgICAgICBpdGVyICE9IHJlZmxlY3Rpb24tPk1hcEVuZChtZXNzYWdlLCBGKCJtYXBfaW50MzJfZmxvYXQiKSk7ICsraXRlcikgeworICAgICAgRVhQRUNUX0VRKG1hcFtpdGVyLkdldEtleSgpLkdldEludDMyVmFsdWUoKV0sCisgICAgICAgICAgICAgICAgaXRlci5HZXRWYWx1ZVJlZigpLkdldEZsb2F0VmFsdWUoKSk7CisgICAgfQorICB9CisgIHsKKyAgICBzdGQ6Om1hcDxpbnQzMl90LCBkb3VibGU+IG1hcDsKKyAgICBtYXBbMF0gPSAwLjA7CisgICAgbWFwWzFdID0gMS4wOworICAgIGZvciAoTWFwSXRlcmF0b3IgaXRlciA9CisgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX2ludDMyX2RvdWJsZSIpKTsKKyAgICAgICAgIGl0ZXIgIT0gcmVmbGVjdGlvbi0+TWFwRW5kKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9kb3VibGUiKSk7ICsraXRlcikgeworICAgICAgRVhQRUNUX0VRKG1hcFtpdGVyLkdldEtleSgpLkdldEludDMyVmFsdWUoKV0sCisgICAgICAgICAgICAgICAgaXRlci5HZXRWYWx1ZVJlZigpLkdldERvdWJsZVZhbHVlKCkpOworICAgIH0KKyAgfQorICB7CisgICAgc3RkOjptYXA8Ym9vbCwgYm9vbD4gbWFwOworICAgIG1hcFtmYWxzZV0gPSBmYWxzZTsKKyAgICBtYXBbdHJ1ZV0gPSB0cnVlOworICAgIGZvciAoTWFwSXRlcmF0b3IgaXRlciA9IHJlZmxlY3Rpb24tPk1hcEJlZ2luKG1lc3NhZ2UsIEYoIm1hcF9ib29sX2Jvb2wiKSk7CisgICAgICAgICBpdGVyICE9IHJlZmxlY3Rpb24tPk1hcEVuZChtZXNzYWdlLCBGKCJtYXBfYm9vbF9ib29sIikpOyArK2l0ZXIpIHsKKyAgICAgIEVYUEVDVF9FUShtYXBbaXRlci5HZXRLZXkoKS5HZXRCb29sVmFsdWUoKV0sCisgICAgICAgICAgICAgICAgaXRlci5HZXRWYWx1ZVJlZigpLkdldEJvb2xWYWx1ZSgpKTsKKyAgICB9CisgIH0KKyAgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbWFwOworICAgIG1hcFsiMCJdID0gIjAiOworICAgIG1hcFsiMSJdID0gIjEiOworICAgIGludCBzaXplID0gMDsKKyAgICBmb3IgKE1hcEl0ZXJhdG9yIGl0ZXIgPQorICAgICAgICAgICAgIHJlZmxlY3Rpb24tPk1hcEJlZ2luKG1lc3NhZ2UsIEYoIm1hcF9zdHJpbmdfc3RyaW5nIikpOworICAgICAgICAgaXRlciAhPSByZWZsZWN0aW9uLT5NYXBFbmQobWVzc2FnZSwgRigibWFwX3N0cmluZ19zdHJpbmciKSk7CisgICAgICAgICArK2l0ZXIsICsrc2l6ZSkgeworICAgICAgLy8gQ2hlY2sgY29uc3QgbWV0aG9kcyBkbyBub3QgaW52YWxpZGF0ZSBtYXAuCisgICAgICBtZXNzYWdlLT5EZWJ1Z1N0cmluZygpOworICAgICAgbWVzc2FnZS0+U2hvcnREZWJ1Z1N0cmluZygpOworICAgICAgbWVzc2FnZS0+U2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpOworICAgICAgbWVzc2FnZS0+U3BhY2VVc2VkTG9uZygpOworICAgICAgbWVzc2FnZS0+Qnl0ZVNpemVMb25nKCk7CisgICAgICBFWFBFQ1RfRVEobWFwW2l0ZXIuR2V0S2V5KCkuR2V0U3RyaW5nVmFsdWUoKV0sCisgICAgICAgICAgICAgICAgaXRlci5HZXRWYWx1ZVJlZigpLkdldFN0cmluZ1ZhbHVlKCkpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoc2l6ZSwgMik7CisgIH0KKyAgeworICAgIHN0ZDo6bWFwPGludDMyX3QsIHN0ZDo6c3RyaW5nPiBtYXA7CisgICAgbWFwWzBdID0gIjAiOworICAgIG1hcFsxXSA9ICIxIjsKKyAgICBmb3IgKE1hcEl0ZXJhdG9yIGl0ZXIgPSByZWZsZWN0aW9uLT5NYXBCZWdpbihtZXNzYWdlLCBGKCJtYXBfaW50MzJfYnl0ZXMiKSk7CisgICAgICAgICBpdGVyICE9IHJlZmxlY3Rpb24tPk1hcEVuZChtZXNzYWdlLCBGKCJtYXBfaW50MzJfYnl0ZXMiKSk7ICsraXRlcikgeworICAgICAgRVhQRUNUX0VRKG1hcFtpdGVyLkdldEtleSgpLkdldEludDMyVmFsdWUoKV0sCisgICAgICAgICAgICAgICAgaXRlci5HZXRWYWx1ZVJlZigpLkdldFN0cmluZ1ZhbHVlKCkpOworICAgIH0KKyAgfQorICB7CisgICAgc3RkOjptYXA8aW50MzJfdCwgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcio+IG1hcDsKKyAgICBtYXBbMF0gPSBtYXBfZW51bV9iYXJfOworICAgIG1hcFsxXSA9IG1hcF9lbnVtX2Jhel87CisgICAgZm9yIChNYXBJdGVyYXRvciBpdGVyID0gcmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX2ludDMyX2VudW0iKSk7CisgICAgICAgICBpdGVyICE9IHJlZmxlY3Rpb24tPk1hcEVuZChtZXNzYWdlLCBGKCJtYXBfaW50MzJfZW51bSIpKTsgKytpdGVyKSB7CisgICAgICBFWFBFQ1RfRVEobWFwW2l0ZXIuR2V0S2V5KCkuR2V0SW50MzJWYWx1ZSgpXS0+bnVtYmVyKCksCisgICAgICAgICAgICAgICAgaXRlci5HZXRWYWx1ZVJlZigpLkdldEVudW1WYWx1ZSgpKTsKKyAgICB9CisgIH0KKyAgeworICAgIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+IG1hcDsKKyAgICBtYXBbMF0gPSAwOworICAgIG1hcFsxXSA9IDE7CisgICAgaW50IHNpemUgPSAwOworICAgIGZvciAoTWFwSXRlcmF0b3IgaXRlciA9CisgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSIpKTsKKyAgICAgICAgIGl0ZXIgIT0gcmVmbGVjdGlvbi0+TWFwRW5kKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UiKSk7CisgICAgICAgICArK2l0ZXIsICsrc2l6ZSkgeworICAgICAgLy8gQ2hlY2sgY29uc3QgbWV0aG9kcyBkbyBub3QgaW52YWxpZGF0ZSBtYXAuCisgICAgICBtZXNzYWdlLT5EZWJ1Z1N0cmluZygpOworICAgICAgbWVzc2FnZS0+U2hvcnREZWJ1Z1N0cmluZygpOworICAgICAgbWVzc2FnZS0+U2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpOworICAgICAgbWVzc2FnZS0+U3BhY2VVc2VkTG9uZygpOworICAgICAgbWVzc2FnZS0+Qnl0ZVNpemVMb25nKCk7CisgICAgICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9IGl0ZXIuR2V0VmFsdWVSZWYoKS5HZXRNZXNzYWdlVmFsdWUoKTsKKyAgICAgIEVYUEVDVF9FUShtYXBbaXRlci5HZXRLZXkoKS5HZXRJbnQzMlZhbHVlKCldLAorICAgICAgICAgICAgICAgIHN1Yl9tZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoc3ViX21lc3NhZ2UsIGZvcmVpZ25fY18pKTsKKyAgICB9CisgICAgRVhQRUNUX0VRKHNpemUsIDIpOworICB9Cit9CisKK3ZvaWQgTWFwUmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0Q2xlYXJWaWFSZWZsZWN0aW9uKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICAvLyBNYXAgZmllbGRzIGFyZSBlbXB0eS4KKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfaW50MzIiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoIm1hcF9pbnQ2NF9pbnQ2NCIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigibWFwX3VpbnQzMl91aW50MzIiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoIm1hcF91aW50NjRfdWludDY0IikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJtYXBfc2ludDMyX3NpbnQzMiIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigibWFwX3NpbnQ2NF9zaW50NjQiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoIm1hcF9maXhlZDMyX2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoIm1hcF9maXhlZDY0X2ZpeGVkNjQiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoIm1hcF9zZml4ZWQzMl9zZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigibWFwX3NmaXhlZDY0X3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfZmxvYXQiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9kb3VibGUiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoIm1hcF9ib29sX2Jvb2wiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoIm1hcF9zdHJpbmdfc3RyaW5nIikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfYnl0ZXMiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9lbnVtIikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+R2V0TWFwRGF0YShtZXNzYWdlLCBGKCJtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlIikpCisgICAgICAgICAgICAgICAgICAtPklzTWFwVmFsaWQoKSk7Cit9CisKK3ZvaWQgTWFwUmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0Q2xlYXJWaWFSZWZsZWN0aW9uSXRlcmF0b3IoTWVzc2FnZSogbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5NYXBCZWdpbihtZXNzYWdlLCBGKCJtYXBfaW50MzJfaW50MzIiKSkgPT0KKyAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwRW5kKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9pbnQzMiIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPk1hcEJlZ2luKG1lc3NhZ2UsIEYoIm1hcF9pbnQ2NF9pbnQ2NCIpKSA9PQorICAgICAgICAgICAgICByZWZsZWN0aW9uLT5NYXBFbmQobWVzc2FnZSwgRigibWFwX2ludDY0X2ludDY0IikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX3VpbnQzMl91aW50MzIiKSkgPT0KKyAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwRW5kKG1lc3NhZ2UsIEYoIm1hcF91aW50MzJfdWludDMyIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX3VpbnQ2NF91aW50NjQiKSkgPT0KKyAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwRW5kKG1lc3NhZ2UsIEYoIm1hcF91aW50NjRfdWludDY0IikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX3NpbnQzMl9zaW50MzIiKSkgPT0KKyAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwRW5kKG1lc3NhZ2UsIEYoIm1hcF9zaW50MzJfc2ludDMyIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX3NpbnQ2NF9zaW50NjQiKSkgPT0KKyAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwRW5kKG1lc3NhZ2UsIEYoIm1hcF9zaW50NjRfc2ludDY0IikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX2ZpeGVkMzJfZml4ZWQzMiIpKSA9PQorICAgICAgICAgICAgICByZWZsZWN0aW9uLT5NYXBFbmQobWVzc2FnZSwgRigibWFwX2ZpeGVkMzJfZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPk1hcEJlZ2luKG1lc3NhZ2UsIEYoIm1hcF9maXhlZDY0X2ZpeGVkNjQiKSkgPT0KKyAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwRW5kKG1lc3NhZ2UsIEYoIm1hcF9maXhlZDY0X2ZpeGVkNjQiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5NYXBCZWdpbihtZXNzYWdlLCBGKCJtYXBfc2ZpeGVkMzJfc2ZpeGVkMzIiKSkgPT0KKyAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwRW5kKG1lc3NhZ2UsIEYoIm1hcF9zZml4ZWQzMl9zZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPk1hcEJlZ2luKG1lc3NhZ2UsIEYoIm1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCIpKSA9PQorICAgICAgICAgICAgICByZWZsZWN0aW9uLT5NYXBFbmQobWVzc2FnZSwgRigibWFwX3NmaXhlZDY0X3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX2ludDMyX2Zsb2F0IikpID09CisgICAgICAgICAgICAgIHJlZmxlY3Rpb24tPk1hcEVuZChtZXNzYWdlLCBGKCJtYXBfaW50MzJfZmxvYXQiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5NYXBCZWdpbihtZXNzYWdlLCBGKCJtYXBfaW50MzJfZG91YmxlIikpID09CisgICAgICAgICAgICAgIHJlZmxlY3Rpb24tPk1hcEVuZChtZXNzYWdlLCBGKCJtYXBfaW50MzJfZG91YmxlIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX2Jvb2xfYm9vbCIpKSA9PQorICAgICAgICAgICAgICByZWZsZWN0aW9uLT5NYXBFbmQobWVzc2FnZSwgRigibWFwX2Jvb2xfYm9vbCIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPk1hcEJlZ2luKG1lc3NhZ2UsIEYoIm1hcF9zdHJpbmdfc3RyaW5nIikpID09CisgICAgICAgICAgICAgIHJlZmxlY3Rpb24tPk1hcEVuZChtZXNzYWdlLCBGKCJtYXBfc3RyaW5nX3N0cmluZyIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPk1hcEJlZ2luKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9ieXRlcyIpKSA9PQorICAgICAgICAgICAgICByZWZsZWN0aW9uLT5NYXBFbmQobWVzc2FnZSwgRigibWFwX2ludDMyX2J5dGVzIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX2ludDMyX2VudW0iKSkgPT0KKyAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwRW5kKG1lc3NhZ2UsIEYoIm1hcF9pbnQzMl9lbnVtIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+TWFwQmVnaW4obWVzc2FnZSwgRigibWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSIpKSA9PQorICAgICAgICAgICAgICByZWZsZWN0aW9uLT5NYXBFbmQobWVzc2FnZSwgRigibWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSIpKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX3Rlc3Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMmRjODEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fdGVzdGVyLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9SRUZMRUNUSU9OX1RFU1RFUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1JFRkxFQ1RJT05fVEVTVEVSX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gUHJvdmlkZXMgQVBJcyB0byB0ZXN0IHByb3RvY29sIGJ1ZmZlcnMgcmVmbGVjdGl2ZWx5LgorY2xhc3MgTWFwUmVmbGVjdGlvblRlc3RlciB7CisgcHVibGljOgorICAvLyBiYXNlX2Rlc2NyaXB0b3IgbXVzdCBiZSBhIGRlc2NyaXB0b3IgZm9yIFRlc3RNYXAsIHdoaWNoIGlzIHVzZWQgZm9yCisgIC8vIE1hcFJlZmxlY3Rpb25UZXN0ZXIgdG8gZmV0Y2ggdGhlIEZpZWxkRGVzY3JpcHRvcnMgbmVlZGVkIHRvIHVzZSB0aGUKKyAgLy8gcmVmbGVjdGlvbiBpbnRlcmZhY2UuCisgIGV4cGxpY2l0IE1hcFJlZmxlY3Rpb25UZXN0ZXIoY29uc3QgRGVzY3JpcHRvciogYmFzZV9kZXNjcmlwdG9yKTsKKworICB2b2lkIFNldE1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7CisgIHZvaWQgU2V0TWFwRmllbGRzVmlhTWFwUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKTsKKyAgdm9pZCBDbGVhck1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7CisgIHZvaWQgTW9kaWZ5TWFwRmllbGRzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKTsKKyAgdm9pZCBSZW1vdmVMYXN0TWFwc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7CisgIHZvaWQgUmVsZWFzZUxhc3RNYXBzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKTsKKyAgdm9pZCBTd2FwTWFwc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7CisgIHZvaWQgTXV0YWJsZVVua25vd25GaWVsZHNPZk1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7CisgIHZvaWQgRXhwZWN0TWFwRmllbGRzU2V0VmlhUmVmbGVjdGlvbihjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKKyAgdm9pZCBFeHBlY3RNYXBGaWVsZHNTZXRWaWFSZWZsZWN0aW9uSXRlcmF0b3IoTWVzc2FnZSogbWVzc2FnZSk7CisgIHZvaWQgRXhwZWN0Q2xlYXJWaWFSZWZsZWN0aW9uKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworICB2b2lkIEV4cGVjdENsZWFyVmlhUmVmbGVjdGlvbkl0ZXJhdG9yKE1lc3NhZ2UqIG1lc3NhZ2UpOworICB2b2lkIEdldE1hcFZhbHVlVmlhTWFwUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFwS2V5JiBtYXBfa2V5LCBNYXBWYWx1ZVJlZiogbWFwX3ZhbCk7CisgIE1lc3NhZ2UqIEdldE1hcEVudHJ5VmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkX25hbWUsIGludCBpbmRleCk7CisgIE1hcEl0ZXJhdG9yIE1hcEJlZ2luKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lKTsKKyAgTWFwSXRlcmF0b3IgTWFwRW5kKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lKTsKKyAgaW50IE1hcFNpemUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkX25hbWUpOworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworICBjb25zdCBEZXNjcmlwdG9yKiBiYXNlX2Rlc2NyaXB0b3JfOworCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIG1hcF9lbnVtX2Jhcl87CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIG1hcF9lbnVtX2Jhel87CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIG1hcF9lbnVtX2Zvb187CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmb3JlaWduX2NfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF9pbnQzMl9pbnQzMl9rZXlfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF9pbnQzMl9pbnQzMl92YWxfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF9pbnQ2NF9pbnQ2NF9rZXlfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF9pbnQ2NF9pbnQ2NF92YWxfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF91aW50MzJfdWludDMyX2tleV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX3VpbnQzMl91aW50MzJfdmFsXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtYXBfdWludDY0X3VpbnQ2NF9rZXlfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF91aW50NjRfdWludDY0X3ZhbF87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX3NpbnQzMl9zaW50MzJfa2V5XzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtYXBfc2ludDMyX3NpbnQzMl92YWxfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF9zaW50NjRfc2ludDY0X2tleV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX3NpbnQ2NF9zaW50NjRfdmFsXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtYXBfZml4ZWQzMl9maXhlZDMyX2tleV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX2ZpeGVkMzJfZml4ZWQzMl92YWxfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF9maXhlZDY0X2ZpeGVkNjRfa2V5XzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtYXBfZml4ZWQ2NF9maXhlZDY0X3ZhbF87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX3NmaXhlZDMyX3NmaXhlZDMyX2tleV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX3NmaXhlZDMyX3NmaXhlZDMyX3ZhbF87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX3NmaXhlZDY0X3NmaXhlZDY0X2tleV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX3NmaXhlZDY0X3NmaXhlZDY0X3ZhbF87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX2ludDMyX2Zsb2F0X2tleV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX2ludDMyX2Zsb2F0X3ZhbF87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX2ludDMyX2RvdWJsZV9rZXlfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF9pbnQzMl9kb3VibGVfdmFsXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtYXBfYm9vbF9ib29sX2tleV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX2Jvb2xfYm9vbF92YWxfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF9zdHJpbmdfc3RyaW5nX2tleV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX3N0cmluZ19zdHJpbmdfdmFsXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtYXBfaW50MzJfYnl0ZXNfa2V5XzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtYXBfaW50MzJfYnl0ZXNfdmFsXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtYXBfaW50MzJfZW51bV9rZXlfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF9pbnQzMl9lbnVtX3ZhbF87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZV9rZXlfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VfdmFsXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9SRUZMRUNUSU9OX1RFU1RFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNjRkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjCkBAIC0wLDAgKzEsNzEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKwordGVtcGxhdGUgY2xhc3MgUFJPVE9CVUZfRVhQT1JUX1RFTVBMQVRFX0RFRklORSBSZXBlYXRlZEZpZWxkPGJvb2w+OwordGVtcGxhdGUgY2xhc3MgUFJPVE9CVUZfRVhQT1JUX1RFTVBMQVRFX0RFRklORSBSZXBlYXRlZEZpZWxkPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgUFJPVE9CVUZfRVhQT1JUX1RFTVBMQVRFX0RFRklORSBSZXBlYXRlZEZpZWxkPHVpbnQzMl90PjsKK3RlbXBsYXRlIGNsYXNzIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUZJTkUgUmVwZWF0ZWRGaWVsZDxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUZJTkUgUmVwZWF0ZWRGaWVsZDx1aW50NjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBQUk9UT0JVRl9FWFBPUlRfVEVNUExBVEVfREVGSU5FIFJlcGVhdGVkRmllbGQ8ZmxvYXQ+OwordGVtcGxhdGUgY2xhc3MgUFJPVE9CVUZfRVhQT1JUX1RFTVBMQVRFX0RFRklORSBSZXBlYXRlZEZpZWxkPGRvdWJsZT47Cit0ZW1wbGF0ZSBjbGFzcyBQUk9UT0JVRl9FWFBPUlRfVEVNUExBVEVfREVGSU5FIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+OworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGUgY2xhc3MgUFJPVE9CVUZfRVhQT1JUX1RFTVBMQVRFX0RFRklORSBSZXBlYXRlZEl0ZXJhdG9yPGJvb2w+OwordGVtcGxhdGUgY2xhc3MgUFJPVE9CVUZfRVhQT1JUX1RFTVBMQVRFX0RFRklORSBSZXBlYXRlZEl0ZXJhdG9yPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgUFJPVE9CVUZfRVhQT1JUX1RFTVBMQVRFX0RFRklORSBSZXBlYXRlZEl0ZXJhdG9yPHVpbnQzMl90PjsKK3RlbXBsYXRlIGNsYXNzIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUZJTkUgUmVwZWF0ZWRJdGVyYXRvcjxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUZJTkUgUmVwZWF0ZWRJdGVyYXRvcjx1aW50NjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBQUk9UT0JVRl9FWFBPUlRfVEVNUExBVEVfREVGSU5FIFJlcGVhdGVkSXRlcmF0b3I8ZmxvYXQ+OwordGVtcGxhdGUgY2xhc3MgUFJPVE9CVUZfRVhQT1JUX1RFTVBMQVRFX0RFRklORSBSZXBlYXRlZEl0ZXJhdG9yPGRvdWJsZT47Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZiNzM0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaApAQCAtMCwwICsxLDEyMTkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBSZXBlYXRlZEZpZWxkIGFuZCBSZXBlYXRlZFB0ckZpZWxkIGFyZSB1c2VkIGJ5IGdlbmVyYXRlZCBwcm90b2NvbCBtZXNzYWdlCisvLyBjbGFzc2VzIHRvIG1hbmlwdWxhdGUgcmVwZWF0ZWQgZmllbGRzLiAgVGhlc2UgY2xhc3NlcyBhcmUgdmVyeSBzaW1pbGFyIHRvCisvLyBTVEwncyB2ZWN0b3IsIGJ1dCBpbmNsdWRlIGEgbnVtYmVyIG9mIG9wdGltaXphdGlvbnMgZm91bmQgdG8gYmUgdXNlZnVsCisvLyBzcGVjaWZpY2FsbHkgaW4gdGhlIGNhc2Ugb2YgUHJvdG9jb2wgQnVmZmVycy4gIFJlcGVhdGVkUHRyRmllbGQgaXMKKy8vIHBhcnRpY3VsYXJseSBkaWZmZXJlbnQgZnJvbSBTVEwgdmVjdG9yIGFzIGl0IG1hbmFnZXMgb3duZXJzaGlwIG9mIHRoZQorLy8gcG9pbnRlcnMgdGhhdCBpdCBjb250YWlucy4KKy8vCisvLyBUaGlzIGhlYWRlciBjb3ZlcnMgUmVwZWF0ZWRGaWVsZC4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUkVQRUFURURfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9SRVBFQVRFRF9GSUVMRF9IX18KKworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9wdHJfZmllbGQuaD4KKworCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworI2lmZGVmIFNXSUcKKyNlcnJvciAiWW91IGNhbm5vdCBTV0lHIHByb3RvIGhlYWRlcnMiCisjZW5kaWYKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitjbGFzcyBNZXNzYWdlOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IGtSZXBIZWFkZXJTaXplPgorY29uc3RleHByIGludCBSZXBlYXRlZEZpZWxkTG93ZXJDbGFtcExpbWl0KCkgeworICAvLyBUaGUgaGVhZGVyIGlzIHBhZGRlZCB0byBiZSBhdCBsZWFzdCBgc2l6ZW9mKFQpYCB3aGVuIGl0IHdvdWxkIGJlIHNtYWxsZXIKKyAgLy8gb3RoZXJ3aXNlLgorICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA8PSBrUmVwSGVhZGVyU2l6ZSwgIiIpOworICAvLyBXZSB3YW50IHRvIHBhZCB0aGUgbWluaW11bSBzaXplIHRvIGJlIGEgcG93ZXIgb2YgdHdvIGJ5dGVzLCBpbmNsdWRpbmcgdGhlCisgIC8vIGhlYWRlci4KKyAgLy8gVGhlIGZpcnN0IGFsbG9jYXRpb24gaXMga1JlcEhlYWRlclNpemUgYnl0ZXMgd29ydGggb2YgZWxlbWVudHMgZm9yIGEgdG90YWwKKyAgLy8gb2YgMiprUmVwSGVhZGVyU2l6ZSBieXRlcy4KKyAgLy8gRm9yIGFuIDgtYnl0ZSBoZWFkZXIsIHdlIGFsbG9jYXRlIDggYm9vbCwgMiBpbnRzLCBvciAxIGludDY0LgorICByZXR1cm4ga1JlcEhlYWRlclNpemUgLyBzaXplb2YoVCk7Cit9CisKKy8vIGtSZXBlYXRlZEZpZWxkVXBwZXJDbGFtcExpbWl0IGlzIHRoZSBsb3dlc3Qgc2lnbmVkIGludGVnZXIgdmFsdWUgdGhhdAorLy8gb3ZlcmZsb3dzIHdoZW4gbXVsdGlwbGllZCBieSAyICh3aGljaCBpcyB1bmRlZmluZWQgYmVoYXZpb3IpLiBTaXplcyBhYm92ZQorLy8gdGhpcyB3aWxsIGNsYW1wIHRvIHRoZSBtYXhpbXVtIGludCB2YWx1ZSBpbnN0ZWFkIG9mIGZvbGxvd2luZyBleHBvbmVudGlhbAorLy8gZ3Jvd3RoIHdoZW4gZ3Jvd2luZyBhIHJlcGVhdGVkIGZpZWxkLgorY29uc3RleHByIGludCBrUmVwZWF0ZWRGaWVsZFVwcGVyQ2xhbXBMaW1pdCA9CisgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLyAyKSArIDE7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgoraW5saW5lIGludCBDYWxjdWxhdGVSZXNlcnZlKEl0ZXIgYmVnaW4sIEl0ZXIgZW5kLCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHN0ZDo6ZGlzdGFuY2UoYmVnaW4sIGVuZCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KK2lubGluZSBpbnQgQ2FsY3VsYXRlUmVzZXJ2ZShJdGVyIC8qYmVnaW4qLywgSXRlciAvKmVuZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnIC8qdW51c2VkKi8pIHsKKyAgcmV0dXJuIC0xOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KK2lubGluZSBpbnQgQ2FsY3VsYXRlUmVzZXJ2ZShJdGVyIGJlZ2luLCBJdGVyIGVuZCkgeworICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeSBDYXRlZ29yeTsKKyAgcmV0dXJuIENhbGN1bGF0ZVJlc2VydmUoYmVnaW4sIGVuZCwgQ2F0ZWdvcnkoKSk7Cit9CisKKy8vIFN3YXBzIHR3byBibG9ja3Mgb2YgbWVtb3J5IG9mIHNpemUgc2l6ZW9mKFQpLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgdm9pZCBTd2FwQmxvY2soY2hhciogcCwgY2hhciogcSkgeworICBUIHRtcDsKKyAgbWVtY3B5KCZ0bXAsIHAsIHNpemVvZihUKSk7CisgIG1lbWNweShwLCBxLCBzaXplb2YoVCkpOworICBtZW1jcHkocSwgJnRtcCwgc2l6ZW9mKFQpKTsKK30KKworLy8gU3dhcHMgdHdvIGJsb2NrcyBvZiBtZW1vcnkgb2Ygc2l6ZSBrU2l6ZToKKy8vICB0ZW1wbGF0ZSA8aW50IGtTaXplPiB2b2lkIG1lbXN3YXAoY2hhciogcCwgY2hhciogcSk7Cit0ZW1wbGF0ZSA8aW50IGtTaXplPgoraW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChrU2l6ZSA9PSAwKSwgdm9pZD46OnR5cGUgbWVtc3dhcChjaGFyKiwgY2hhciopIHsKK30KKworI2RlZmluZSBQUk9UT19NRU1TV0FQX0RFRl9TSVpFKHJlZ190eXBlLCBtYXhfc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDxpbnQga1NpemU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8KGtTaXplID49IHNpemVvZihyZWdfdHlwZSkgJiYga1NpemUgPCAobWF4X3NpemUpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkPjo6dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1lbXN3YXAoY2hhciogcCwgY2hhciogcSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTd2FwQmxvY2s8cmVnX3R5cGU+KHAsIHEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbXN3YXA8a1NpemUgLSBzaXplb2YocmVnX3R5cGUpPihwICsgc2l6ZW9mKHJlZ190eXBlKSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgKyBzaXplb2YocmVnX3R5cGUpKTsgICAgICAgICAgICAgICAgIFwKKyAgfQorCitQUk9UT19NRU1TV0FQX0RFRl9TSVpFKHVpbnQ4X3QsIDIpCitQUk9UT19NRU1TV0FQX0RFRl9TSVpFKHVpbnQxNl90LCA0KQorUFJPVE9fTUVNU1dBUF9ERUZfU0laRSh1aW50MzJfdCwgOCkKKworI2lmZGVmIF9fU0laRU9GX0lOVDEyOF9fCitQUk9UT19NRU1TV0FQX0RFRl9TSVpFKHVpbnQ2NF90LCAxNikKK1BST1RPX01FTVNXQVBfREVGX1NJWkUoX191aW50MTI4X3QsICgxdSA8PCAzMSkpCisjZWxzZQorUFJPVE9fTUVNU1dBUF9ERUZfU0laRSh1aW50NjRfdCwgKDF1IDw8IDMxKSkKKyNlbmRpZgorCisjdW5kZWYgUFJPVE9fTUVNU1dBUF9ERUZfU0laRQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2NsYXNzIFJlcGVhdGVkSXRlcmF0b3I7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBSZXBlYXRlZEZpZWxkIGlzIHVzZWQgdG8gcmVwcmVzZW50IHJlcGVhdGVkIGZpZWxkcyBvZiBhIHByaW1pdGl2ZSB0eXBlIChpbgorLy8gb3RoZXIgd29yZHMsIGV2ZXJ5dGhpbmcgZXhjZXB0IHN0cmluZ3MgYW5kIG5lc3RlZCBNZXNzYWdlcykuICBNb3N0IHVzZXJzIHdpbGwKKy8vIG5vdCBldmVyIHVzZSBhIFJlcGVhdGVkRmllbGQgZGlyZWN0bHk7IHRoZXkgd2lsbCB1c2UgdGhlIGdldC1ieS1pbmRleCwKKy8vIHNldC1ieS1pbmRleCwgYW5kIGFkZCBhY2Nlc3NvcnMgdGhhdCBhcmUgZ2VuZXJhdGVkIGZvciBhbGwgcmVwZWF0ZWQgZmllbGRzLgordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitjbGFzcyBSZXBlYXRlZEZpZWxkIGZpbmFsIHsKKyAgc3RhdGljX2Fzc2VydCgKKyAgICAgIGFsaWdub2YoQXJlbmEpID49IGFsaWdub2YoRWxlbWVudCksCisgICAgICAiV2Ugb25seSBzdXBwb3J0IHR5cGVzIHRoYXQgaGF2ZSBhbiBhbGlnbm1lbnQgc21hbGxlciB0aGFuIEFyZW5hIik7CisKKyBwdWJsaWM6CisgIGNvbnN0ZXhwciBSZXBlYXRlZEZpZWxkKCk7CisgIGV4cGxpY2l0IFJlcGVhdGVkRmllbGQoQXJlbmEqIGFyZW5hKTsKKworICBSZXBlYXRlZEZpZWxkKGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlciwKKyAgICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPAorICAgICAgICAgICAgICAgIEVsZW1lbnQsIGRlY2x0eXBlKCpzdGQ6OmRlY2x2YWw8SXRlcj4oKSk+Ojp2YWx1ZT46OnR5cGU+CisgIFJlcGVhdGVkRmllbGQoSXRlciBiZWdpbiwgSXRlciBlbmQpOworCisgIH5SZXBlYXRlZEZpZWxkKCk7CisKKyAgUmVwZWF0ZWRGaWVsZCYgb3BlcmF0b3I9KGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKTsKKworICBSZXBlYXRlZEZpZWxkKFJlcGVhdGVkRmllbGQmJiBvdGhlcikgbm9leGNlcHQ7CisgIFJlcGVhdGVkRmllbGQmIG9wZXJhdG9yPShSZXBlYXRlZEZpZWxkJiYgb3RoZXIpIG5vZXhjZXB0OworCisgIGJvb2wgZW1wdHkoKSBjb25zdDsKKyAgaW50IHNpemUoKSBjb25zdDsKKworICBjb25zdCBFbGVtZW50JiBHZXQoaW50IGluZGV4KSBjb25zdDsKKyAgRWxlbWVudCogTXV0YWJsZShpbnQgaW5kZXgpOworCisgIGNvbnN0IEVsZW1lbnQmIG9wZXJhdG9yW10oaW50IGluZGV4KSBjb25zdCB7IHJldHVybiBHZXQoaW5kZXgpOyB9CisgIEVsZW1lbnQmIG9wZXJhdG9yW10oaW50IGluZGV4KSB7IHJldHVybiAqTXV0YWJsZShpbmRleCk7IH0KKworICBjb25zdCBFbGVtZW50JiBhdChpbnQgaW5kZXgpIGNvbnN0OworICBFbGVtZW50JiBhdChpbnQgaW5kZXgpOworCisgIHZvaWQgU2V0KGludCBpbmRleCwgY29uc3QgRWxlbWVudCYgdmFsdWUpOworICB2b2lkIEFkZChjb25zdCBFbGVtZW50JiB2YWx1ZSk7CisgIC8vIEFwcGVuZHMgYSBuZXcgZWxlbWVudCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXQuCisgIC8vIFRoZSBuZXcgZWxlbWVudCBpcyB1bmluaXRpYWxpemVkIGlmIHxFbGVtZW50fCBpcyBhIFBPRCB0eXBlLgorICBFbGVtZW50KiBBZGQoKTsKKyAgLy8gQXBwZW5kcyBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgW2JlZ2luLCBlbmQpIGFmdGVyIHJlc2VydmluZworICAvLyB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGVsZW1lbnRzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KKyAgdm9pZCBBZGQoSXRlciBiZWdpbiwgSXRlciBlbmQpOworCisgIC8vIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuCisgIHZvaWQgUmVtb3ZlTGFzdCgpOworCisgIC8vIEV4dHJhY3RzIGVsZW1lbnRzIHdpdGggaW5kaWNlcyBpbiAiW3N0YXJ0IC4uIHN0YXJ0K251bS0xXSIuCisgIC8vIENvcGllcyB0aGVtIGludG8gImVsZW1lbnRzWzAgLi4gbnVtLTFdIiBpZiAiZWxlbWVudHMiIGlzIG5vdCBudWxscHRyLgorICAvLyBDYXV0aW9uOiBhbHNvIG1vdmVzIGVsZW1lbnRzIHdpdGggaW5kaWNlcyBbc3RhcnQrbnVtIC4uXS4KKyAgLy8gQ2FsbGluZyB0aGlzIHJvdXRpbmUgaW5zaWRlIGEgbG9vcCBjYW4gY2F1c2UgcXVhZHJhdGljIGJlaGF2aW9yLgorICB2b2lkIEV4dHJhY3RTdWJyYW5nZShpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqIGVsZW1lbnRzKTsKKworICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKTsKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDb3B5RnJvbShjb25zdCBSZXBlYXRlZEZpZWxkJiBvdGhlcik7CisKKyAgLy8gUmVwbGFjZXMgdGhlIGNvbnRlbnRzIHdpdGggUmVwZWF0ZWRGaWVsZChiZWdpbiwgZW5kKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQXNzaWduKEl0ZXIgYmVnaW4sIEl0ZXIgZW5kKTsKKworICAvLyBSZXNlcnZlcyBzcGFjZSB0byBleHBhbmQgdGhlIGZpZWxkIHRvIGF0IGxlYXN0IHRoZSBnaXZlbiBzaXplLiAgSWYgdGhlCisgIC8vIGFycmF5IGlzIGdyb3duLCBpdCB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCBkb3VibGVkIGluIHNpemUuCisgIHZvaWQgUmVzZXJ2ZShpbnQgbmV3X3NpemUpOworCisgIC8vIFJlc2l6ZXMgdGhlIFJlcGVhdGVkRmllbGQgdG8gYSBuZXcsIHNtYWxsZXIgc2l6ZS4gIFRoaXMgaXMgTygxKS4KKyAgdm9pZCBUcnVuY2F0ZShpbnQgbmV3X3NpemUpOworCisgIHZvaWQgQWRkQWxyZWFkeVJlc2VydmVkKGNvbnN0IEVsZW1lbnQmIHZhbHVlKTsKKyAgLy8gQXBwZW5kcyBhIG5ldyBlbGVtZW50IGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgorICAvLyBUaGUgbmV3IGVsZW1lbnQgaXMgdW5pbml0aWFsaXplZCBpZiB8RWxlbWVudHwgaXMgYSBQT0QgdHlwZS4KKyAgLy8gU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIENhcGFjaXR5KCkgPiBTaXplKCkuCisgIEVsZW1lbnQqIEFkZEFscmVhZHlSZXNlcnZlZCgpOworICBFbGVtZW50KiBBZGROQWxyZWFkeVJlc2VydmVkKGludCBlbGVtZW50cyk7CisgIGludCBDYXBhY2l0eSgpIGNvbnN0OworCisgIC8vIExpa2UgU1RMIHJlc2l6ZS4gIFVzZXMgdmFsdWUgdG8gZmlsbCBhcHBlbmRlZCBlbGVtZW50cy4KKyAgLy8gTGlrZSBUcnVuY2F0ZSgpIGlmIG5ld19zaXplIDw9IHNpemUoKSwgb3RoZXJ3aXNlIHRoaXMgaXMKKyAgLy8gTyhuZXdfc2l6ZSAtIHNpemUoKSkuCisgIHZvaWQgUmVzaXplKGludCBuZXdfc2l6ZSwgY29uc3QgRWxlbWVudCYgdmFsdWUpOworCisgIC8vIEdldHMgdGhlIHVuZGVybHlpbmcgYXJyYXkuICBUaGlzIHBvaW50ZXIgaXMgcG9zc2libHkgaW52YWxpZGF0ZWQgYnkKKyAgLy8gYW55IGFkZCBvciByZW1vdmUgb3BlcmF0aW9uLgorICBFbGVtZW50KiBtdXRhYmxlX2RhdGEoKTsKKyAgY29uc3QgRWxlbWVudCogZGF0YSgpIGNvbnN0OworCisgIC8vIFN3YXBzIGVudGlyZSBjb250ZW50cyB3aXRoICJvdGhlciIuIElmIHRoZXkgYXJlIHNlcGFyYXRlIGFyZW5hcyB0aGVuLAorICAvLyBjb3BpZXMgZGF0YSBiZXR3ZWVuIGVhY2ggb3RoZXIuCisgIHZvaWQgU3dhcChSZXBlYXRlZEZpZWxkKiBvdGhlcik7CisKKyAgLy8gU3dhcHMgZW50aXJlIGNvbnRlbnRzIHdpdGggIm90aGVyIi4gU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIHRoZSBjYWxsZXIgY2FuCisgIC8vIGd1YXJhbnRlZSB0aGF0IGJvdGggcmVwZWF0ZWQgZmllbGRzIGFyZSBvbiB0aGUgc2FtZSBhcmVuYSBvciBhcmUgb24gdGhlCisgIC8vIGhlYXAuIFN3YXBwaW5nIGJldHdlZW4gZGlmZmVyZW50IGFyZW5hcyBpcyBkaXNhbGxvd2VkIGFuZCBjYXVnaHQgYnkgYQorICAvLyBHT09HTEVfRENIRUNLIChzZWUgQVBJIGRvY3MgZm9yIGRldGFpbHMpLgorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChSZXBlYXRlZEZpZWxkKiBvdGhlcik7CisKKyAgLy8gU3dhcHMgdHdvIGVsZW1lbnRzLgorICB2b2lkIFN3YXBFbGVtZW50cyhpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKTsKKworICAvLyBTVEwtbGlrZSBpdGVyYXRvciBzdXBwb3J0CisgIHR5cGVkZWYgaW50ZXJuYWw6OlJlcGVhdGVkSXRlcmF0b3I8RWxlbWVudD4gaXRlcmF0b3I7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlJlcGVhdGVkSXRlcmF0b3I8Y29uc3QgRWxlbWVudD4gY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgRWxlbWVudCB2YWx1ZV90eXBlOworICB0eXBlZGVmIHZhbHVlX3R5cGUmIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSogcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIGludCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKworICBpdGVyYXRvciBiZWdpbigpOworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0OworICBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdDsKKyAgaXRlcmF0b3IgZW5kKCk7CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0OworICBjb25zdF9pdGVyYXRvciBjZW5kKCkgY29uc3Q7CisKKyAgLy8gUmV2ZXJzZSBpdGVyYXRvciBzdXBwb3J0CisgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gcmV2ZXJzZV9pdGVyYXRvcjsKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7CisgIH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBieSB0aGUgcmVwZWF0ZWQgZmllbGQsIGV4Y2x1ZGluZworICAvLyBzaXplb2YoKnRoaXMpCisgIHNpemVfdCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZygpIGNvbnN0OworCisgIGludCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6VG9JbnRTaXplKFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKCkpOworICB9CisKKyAgLy8gUmVtb3ZlcyB0aGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5IHBvc2l0aW9uLgorICAvLworICAvLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgcmVtb3ZlZAorICAvLyBlbGVtZW50LgorICAvLworICAvLyBJbnZhbGlkYXRlcyBhbGwgaXRlcmF0b3JzIGF0IG9yIGFmdGVyIHRoZSByZW1vdmVkIGVsZW1lbnQsIGluY2x1ZGluZyBlbmQoKS4KKyAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24pOworCisgIC8vIFJlbW92ZXMgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSBbZmlyc3QsIGxhc3QpLgorICAvLworICAvLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgcmVtb3ZlZCByYW5nZS4KKyAgLy8KKyAgLy8gSW52YWxpZGF0ZXMgYWxsIGl0ZXJhdG9ycyBhdCBvciBhZnRlciB0aGUgcmVtb3ZlZCByYW5nZSwgaW5jbHVkaW5nIGVuZCgpLgorICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCk7CisKKyAgLy8gR2V0cyB0aGUgQXJlbmEgb24gd2hpY2ggdGhpcyBSZXBlYXRlZEZpZWxkIHN0b3JlcyBpdHMgZWxlbWVudHMuCisgIGlubGluZSBBcmVuYSogR2V0QXJlbmEoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldE93bmluZ0FyZW5hKCk7CisgIH0KKworICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgIC8vCisgIC8vIFRoaXMgaXMgcHVibGljIGR1ZSB0byBpdCBiZWluZyBjYWxsZWQgYnkgZ2VuZXJhdGVkIGNvZGUuCisgIGlubGluZSB2b2lkIEludGVybmFsU3dhcChSZXBlYXRlZEZpZWxkKiBvdGhlcik7CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIEFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKworICAvLyBHZXRzIHRoZSBBcmVuYSBvbiB3aGljaCB0aGlzIFJlcGVhdGVkRmllbGQgc3RvcmVzIGl0cyBlbGVtZW50cy4KKyAgaW5saW5lIEFyZW5hKiBHZXRPd25pbmdBcmVuYSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKHRvdGFsX3NpemVfID09IDApID8gc3RhdGljX2Nhc3Q8QXJlbmEqPihhcmVuYV9vcl9lbGVtZW50c18pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlcCgpLT5hcmVuYTsKKyAgfQorCisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbml0aWFsU2l6ZSA9IDA7CisgIC8vIEEgbm90ZSBvbiB0aGUgcmVwcmVzZW50YXRpb24gaGVyZSAoc2VlIGFsc28gY29tbWVudCBiZWxvdyBmb3IKKyAgLy8gUmVwZWF0ZWRQdHJGaWVsZEJhc2UncyBzdHJ1Y3QgUmVwKToKKyAgLy8KKyAgLy8gV2UgbWFpbnRhaW4gdGhlIHNhbWUgc2l6ZW9mKFJlcGVhdGVkRmllbGQpIGFzIGJlZm9yZSB3ZSBhZGRlZCBhcmVuYSBzdXBwb3J0CisgIC8vIHNvIHRoYXQgd2UgZG8gbm90IGRlZ3JhZGUgcGVyZm9ybWFuY2UgYnkgYmxvYXRpbmcgbWVtb3J5IHVzYWdlLiBEaXJlY3RseQorICAvLyBhZGRpbmcgYW4gYXJlbmFfIGVsZW1lbnQgdG8gUmVwZWF0ZWRGaWVsZCBpcyBxdWl0ZSBjb3N0bHkuIEJ5IHVzaW5nCisgIC8vIGluZGlyZWN0aW9uIGluIHRoaXMgd2F5LCB3ZSBrZWVwIHRoZSBzYW1lIHNpemUgd2hlbiB0aGUgUmVwZWF0ZWRGaWVsZCBpcworICAvLyBlbXB0eSAoY29tbW9uIGNhc2UpLCBhbmQgYWRkIG9ubHkgYW4gOC1ieXRlIGhlYWRlciB0byB0aGUgZWxlbWVudHMgYXJyYXkKKyAgLy8gd2hlbiBub24tZW1wdHkuIFdlIG1ha2Ugc3VyZSB0byBwbGFjZSB0aGUgc2l6ZSBmaWVsZHMgZGlyZWN0bHkgaW4gdGhlCisgIC8vIFJlcGVhdGVkRmllbGQgY2xhc3MgdG8gYXZvaWQgY29zdGx5IGNhY2hlIG1pc3NlcyBkdWUgdG8gdGhlIGluZGlyZWN0aW9uLgorICBpbnQgY3VycmVudF9zaXplXzsKKyAgaW50IHRvdGFsX3NpemVfOworICAvLyBQYWQgdGhlIFJlcCBhZnRlciBhcmVuYSBhbGxvdyBmb3IgcG93ZXItb2YtdHdvIGJ5dGUgc2l6ZXMgd2hlbgorICAvLyBzaXplb2YoRWxlbWVudCkgPiBzaXplb2YoQXJlbmEqKS4gZWcgZm9yIDE2LWJ5dGUgb2JqZWN0cy4KKyAgc3RhdGljIFBST1RPQlVGX0NPTlNURVhQUiBjb25zdCBzaXplX3Qga1JlcEhlYWRlclNpemUgPQorICAgICAgc2l6ZW9mKEFyZW5hKikgPCBzaXplb2YoRWxlbWVudCkgPyBzaXplb2YoRWxlbWVudCkgOiBzaXplb2YoQXJlbmEqKTsKKyAgc3RydWN0IFJlcCB7CisgICAgQXJlbmEqIGFyZW5hOworICAgIEVsZW1lbnQqIGVsZW1lbnRzKCkgeworICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RWxlbWVudCo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHRoaXMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVwSGVhZGVyU2l6ZSk7CisgICAgfQorICB9OworCisgIC8vIElmIHRvdGFsX3NpemVfID09IDAgdGhpcyBwb2ludHMgdG8gYW4gQXJlbmEgb3RoZXJ3aXNlIGl0IHBvaW50cyB0byB0aGUKKyAgLy8gZWxlbWVudHMgbWVtYmVyIG9mIGEgUmVwIHN0cnVjdC4gVXNpbmcgdGhpcyBpbnZhcmlhbnQgYWxsb3dzIHRoZSBzdG9yYWdlIG9mCisgIC8vIHRoZSBhcmVuYSBwb2ludGVyIHdpdGhvdXQgYW4gZXh0cmEgYWxsb2NhdGlvbiBpbiB0aGUgY29uc3RydWN0b3IuCisgIHZvaWQqIGFyZW5hX29yX2VsZW1lbnRzXzsKKworICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byBlbGVtZW50cyBhcnJheS4KKyAgLy8gcHJlLWNvbmRpdGlvbjogdGhlIGFycmF5IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZC4KKyAgRWxlbWVudCogZWxlbWVudHMoKSBjb25zdCB7CisgICAgR09PR0xFX0RDSEVDS19HVCh0b3RhbF9zaXplXywgMCk7CisgICAgLy8gQmVjYXVzZSBvZiBhYm92ZSBwcmUtY29uZGl0aW9uIHRoaXMgY2FzdCBpcyBzYWZlLgorICAgIHJldHVybiB1bnNhZmVfZWxlbWVudHMoKTsKKyAgfQorCisgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIGVsZW1lbnRzIGFycmF5IGlmIGl0IGV4aXN0czsgb3RoZXJ3aXNlIGVpdGhlciBudWxsIG9yCisgIC8vIGFuIGludmFsaWQgcG9pbnRlciBpcyByZXR1cm5lZC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIGVtcHR5IHJlcGVhdGVkCisgIC8vIGZpZWxkcywgd2hlcmUgeW91IGNhbid0IGRlcmVmZXJlbmNlIHRoaXMgcG9pbnRlciBhbnl3YXkgKGl0J3MgZW1wdHkpLgorICBFbGVtZW50KiB1bnNhZmVfZWxlbWVudHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnQqPihhcmVuYV9vcl9lbGVtZW50c18pOworICB9CisKKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIFJlcCBzdHJ1Y3QuCisgIC8vIHByZS1jb25kaXRpb246IHRoZSBSZXAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkLCBpZSBlbGVtZW50cygpIGlzIHNhZmUuCisgIFJlcCogcmVwKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFJlcCo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGVsZW1lbnRzKCkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVwSGVhZGVyU2l6ZSk7CisgIH0KKworICBmcmllbmQgY2xhc3MgQXJlbmE7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisKKyAgLy8gTW92ZXMgdGhlIGNvbnRlbnRzIG9mIHxmcm9tfCBpbnRvIHx0b3wsIHBvc3NpYmx5IGNsb2JiZXJpbmcgfGZyb218IGluIHRoZQorICAvLyBwcm9jZXNzLiAgRm9yIHByaW1pdGl2ZSB0eXBlcyB0aGlzIGlzIGp1c3QgYSBtZW1jcHkoKSwgYnV0IGl0IGNvdWxkIGJlCisgIC8vIHNwZWNpYWxpemVkIGZvciBub24tcHJpbWl0aXZlIHR5cGVzIHRvLCBzYXksIHN3YXAgZWFjaCBlbGVtZW50IGluc3RlYWQuCisgIHZvaWQgTW92ZUFycmF5KEVsZW1lbnQqIHRvLCBFbGVtZW50KiBmcm9tLCBpbnQgc2l6ZSk7CisKKyAgLy8gQ29waWVzIHRoZSBlbGVtZW50cyBvZiB8ZnJvbXwgaW50byB8dG98LgorICB2b2lkIENvcHlBcnJheShFbGVtZW50KiB0bywgY29uc3QgRWxlbWVudCogZnJvbSwgaW50IHNpemUpOworCisgIC8vIEludGVybmFsIGhlbHBlciB0byBkZWxldGUgYWxsIGVsZW1lbnRzIGFuZCBkZWFsbG9jYXRlIHRoZSBzdG9yYWdlLgorICB2b2lkIEludGVybmFsRGVhbGxvY2F0ZShSZXAqIHJlcCwgaW50IHNpemUsIGJvb2wgaW5fZGVzdHJ1Y3RvcikgeworICAgIGlmIChyZXAgIT0gbnVsbHB0cikgeworICAgICAgRWxlbWVudCogZSA9ICZyZXAtPmVsZW1lbnRzKClbMF07CisgICAgICBpZiAoIXN0ZDo6aXNfdHJpdmlhbDxFbGVtZW50Pjo6dmFsdWUpIHsKKyAgICAgICAgRWxlbWVudCogbGltaXQgPSAmcmVwLT5lbGVtZW50cygpW3NpemVdOworICAgICAgICBmb3IgKDsgZSA8IGxpbWl0OyBlKyspIHsKKyAgICAgICAgICBlLT5+RWxlbWVudCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBjb25zdCBzaXplX3QgYnl0ZXMgPSBzaXplICogc2l6ZW9mKCplKSArIGtSZXBIZWFkZXJTaXplOworICAgICAgaWYgKHJlcC0+YXJlbmEgPT0gbnVsbHB0cikgeworICAgICAgICBpbnRlcm5hbDo6U2l6ZWREZWxldGUocmVwLCBieXRlcyk7CisgICAgICB9IGVsc2UgaWYgKCFpbl9kZXN0cnVjdG9yKSB7CisgICAgICAgIC8vIElmIHdlIGFyZSBpbiB0aGUgZGVzdHJ1Y3Rvciwgd2UgbWlnaHQgYmUgYmVpbmcgZGVzdHJveWVkIGFzIHBhcnQgb2YKKyAgICAgICAgLy8gdGhlIGFyZW5hIHRlYXJkb3duLiBXZSBjYW4ndCB0cnkgYW5kIHJldHVybiBibG9ja3MgdG8gdGhlIGFyZW5hIHRoZW4uCisgICAgICAgIHJlcC0+YXJlbmEtPlJldHVybkFycmF5TWVtb3J5KHJlcCwgYnl0ZXMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFRoaXMgY2xhc3MgaXMgYSBwZXJmb3JtYW5jZSB3cmFwcGVyIGFyb3VuZCBSZXBlYXRlZEZpZWxkOjpBZGQoY29uc3QgVCYpCisgIC8vIGZ1bmN0aW9uLiBJbiBnZW5lcmFsIHVubGVzcyBhIFJlcGVhdGVkRmllbGQgaXMgYSBsb2NhbCBzdGFjayB2YXJpYWJsZSBMTFZNCisgIC8vIGhhcyBhIGhhcmQgdGltZSBvcHRpbWl6aW5nIEFkZC4gVGhlIG1hY2hpbmUgY29kZSB0ZW5kcyB0byBiZQorICAvLyBsb29wOgorICAvLyBtb3YgJXNpemUsIGR3b3JkIHB0ciBbJXJlcGVhdGVkX2ZpZWxkXSAgICAgICAvLyBsb2FkCisgIC8vIGNtcCAlc2l6ZSwgZHdvcmQgcHRyIFslcmVwZWF0ZWRfZmllbGQgKyA0XQorICAvLyBqYWUgZmFsbGJhY2sKKyAgLy8gbW92ICVidWZmZXIsIHF3b3JkIHB0ciBbJXJlcGVhdGVkX2ZpZWxkICsgOF0KKyAgLy8gbW92IGR3b3JkIFslYnVmZmVyICsgJXNpemUgKiA0XSwgJXZhbHVlCisgIC8vIGluYyAlc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudAorICAvLyBtb3YgZHdvcmQgcHRyIFslcmVwZWF0ZWRfZmllbGRdLCAlc2l6ZSAgICAgICAvLyBzdG9yZQorICAvLyBqbXAgbG9vcAorICAvLworICAvLyBUaGlzIHB1dHMgYSBsb2FkL3N0b3JlIGluIGVhY2ggaXRlcmF0aW9uIG9mIHRoZSBpbXBvcnRhbnQgbG9vcCB2YXJpYWJsZQorICAvLyBzaXplLiBJdCdzIGEgcHJldHR5IGJhZCBjb21waWxlIHRoYXQgaGFwcGVucyBldmVuIGluIHNpbXBsZSBjYXNlcywgYnV0CisgIC8vIGxhcmdlbHkgdGhlIHByZXNlbmNlIG9mIHRoZSBmYWxsYmFjayBwYXRoIGRpc3R1cmJzIHRoZSBjb21waWxlcnMgbWVtLXRvLXJlZworICAvLyBhbmFseXNpcy4KKyAgLy8KKyAgLy8gVGhpcyBjbGFzcyB0YWtlcyBvd25lcnNoaXAgb2YgYSByZXBlYXRlZCBmaWVsZCBmb3IgdGhlIGR1cmF0aW9uIG9mIGl0cworICAvLyBsaWZldGltZS4gVGhlIHJlcGVhdGVkIGZpZWxkIHNob3VsZCBub3QgYmUgYWNjZXNzZWQgZHVyaW5nIHRoaXMgdGltZSwgaWUuCisgIC8vIG9ubHkgYWNjZXNzIHRocm91Z2ggdGhpcyBjbGFzcyBpcyBhbGxvd2VkLiBUaGlzIGNsYXNzIHNob3VsZCBhbHdheXMgYmUgYQorICAvLyBmdW5jdGlvbiBsb2NhbCBzdGFjayB2YXJpYWJsZS4gSW50ZW5kZWQgdXNlCisgIC8vCisgIC8vIHZvaWQgQWRkU2VxdWVuY2UoY29uc3QgaW50KiBiZWdpbiwgY29uc3QgaW50KiBlbmQsIFJlcGVhdGVkRmllbGQ8aW50Piogb3V0KQorICAvLyB7CisgIC8vICAgUmVwZWF0ZWRGaWVsZEFkZGVyPGludD4gYWRkZXIob3V0KTsgIC8vIFRha2Ugb3duZXJzaGlwIG9mIG91dAorICAvLyAgIGZvciAoYXV0byBpdCA9IGJlZ2luOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgLy8gICAgIGFkZGVyLkFkZCgqaXQpOworICAvLyAgIH0KKyAgLy8gfQorICAvLworICAvLyBUeXBpY2FsbHksIGR1ZSB0byB0aGUgZmFjdCB0aGF0IGFkZGVyIGlzIGEgbG9jYWwgc3RhY2sgdmFyaWFibGUsIHRoZQorICAvLyBjb21waWxlciB3aWxsIGJlIHN1Y2Nlc3NmdWwgaW4gbWVtLXRvLXJlZyB0cmFuc2Zvcm1hdGlvbiBhbmQgdGhlIG1hY2hpbmUKKyAgLy8gY29kZSB3aWxsIGJlIGxvb3A6IGNtcCAlc2l6ZSwgJWNhcGFjaXR5IGphZSBmYWxsYmFjayBtb3YgZHdvcmQgcHRyIFslYnVmZmVyCisgIC8vICsgJXNpemUgKiA0XSwgJXZhbCBpbmMgJXNpemUgam1wIGxvb3AKKyAgLy8KKyAgLy8gVGhlIGZpcnN0IHZlcnNpb24gZXhlY3V0ZXMgYXQgNyBjeWNsZXMgcGVyIGl0ZXJhdGlvbiB3aGlsZSB0aGUgc2Vjb25kCisgIC8vIHZlcnNpb24gZXhlY3V0ZXMgYXQgb25seSAxIG9yIDIgY3ljbGVzLgorICB0ZW1wbGF0ZSA8aW50ID0gMCwgYm9vbCA9IHN0ZDo6aXNfdHJpdmlhbDxFbGVtZW50Pjo6dmFsdWU+CisgIGNsYXNzIEZhc3RBZGRlckltcGwgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEZhc3RBZGRlckltcGwoUmVwZWF0ZWRGaWVsZCogcmYpIDogcmVwZWF0ZWRfZmllbGRfKHJmKSB7CisgICAgICBpbmRleF8gPSByZXBlYXRlZF9maWVsZF8tPmN1cnJlbnRfc2l6ZV87CisgICAgICBjYXBhY2l0eV8gPSByZXBlYXRlZF9maWVsZF8tPnRvdGFsX3NpemVfOworICAgICAgYnVmZmVyXyA9IHJlcGVhdGVkX2ZpZWxkXy0+dW5zYWZlX2VsZW1lbnRzKCk7CisgICAgfQorICAgIH5GYXN0QWRkZXJJbXBsKCkgeyByZXBlYXRlZF9maWVsZF8tPmN1cnJlbnRfc2l6ZV8gPSBpbmRleF87IH0KKworICAgIHZvaWQgQWRkKEVsZW1lbnQgdmFsKSB7CisgICAgICBpZiAoaW5kZXhfID09IGNhcGFjaXR5XykgeworICAgICAgICByZXBlYXRlZF9maWVsZF8tPmN1cnJlbnRfc2l6ZV8gPSBpbmRleF87CisgICAgICAgIHJlcGVhdGVkX2ZpZWxkXy0+UmVzZXJ2ZShpbmRleF8gKyAxKTsKKyAgICAgICAgY2FwYWNpdHlfID0gcmVwZWF0ZWRfZmllbGRfLT50b3RhbF9zaXplXzsKKyAgICAgICAgYnVmZmVyXyA9IHJlcGVhdGVkX2ZpZWxkXy0+dW5zYWZlX2VsZW1lbnRzKCk7CisgICAgICB9CisgICAgICBidWZmZXJfW2luZGV4XysrXSA9IHZhbDsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgUmVwZWF0ZWRGaWVsZCogcmVwZWF0ZWRfZmllbGRfOworICAgIGludCBpbmRleF87CisgICAgaW50IGNhcGFjaXR5XzsKKyAgICBFbGVtZW50KiBidWZmZXJfOworCisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZhc3RBZGRlckltcGwpOworICB9OworCisgIC8vIEZhc3RBZGRlciBpcyBhIHdyYXBwZXIgZm9yIGFkZGluZyBmaWVsZHMuIFRoZSBzcGVjaWFsaXphdGlvbiBhYm92ZSBoYW5kbGVzCisgIC8vIFBPRCB0eXBlcyBtb3JlIGVmZmljaWVudGx5IHRoYW4gUmVwZWF0ZWRGaWVsZC4KKyAgdGVtcGxhdGUgPGludCBJPgorICBjbGFzcyBGYXN0QWRkZXJJbXBsPEksIGZhbHNlPiB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgRmFzdEFkZGVySW1wbChSZXBlYXRlZEZpZWxkKiByZikgOiByZXBlYXRlZF9maWVsZF8ocmYpIHt9CisgICAgdm9pZCBBZGQoY29uc3QgRWxlbWVudCYgdmFsKSB7IHJlcGVhdGVkX2ZpZWxkXy0+QWRkKHZhbCk7IH0KKworICAgcHJpdmF0ZToKKyAgICBSZXBlYXRlZEZpZWxkKiByZXBlYXRlZF9maWVsZF87CisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZhc3RBZGRlckltcGwpOworICB9OworCisgIHVzaW5nIEZhc3RBZGRlciA9IEZhc3RBZGRlckltcGw8PjsKKworICBmcmllbmQgY2xhc3MgVGVzdFJlcGVhdGVkRmllbGRIZWxwZXI7CisgIGZyaWVuZCBjbGFzcyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpQYXJzZUNvbnRleHQ7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGlzIGlzIGEgaGVscGVyIHRlbXBsYXRlIHRvIGNvcHkgYW4gYXJyYXkgb2YgZWxlbWVudHMgZWZmaWNpZW50bHkgd2hlbiB0aGV5CisvLyBoYXZlIGEgdHJpdmlhbCBjb3B5IGNvbnN0cnVjdG9yLCBhbmQgY29ycmVjdGx5IG90aGVyd2lzZS4gVGhpcyByZWFsbHkKKy8vIHNob3VsZG4ndCBiZSBuZWNlc3NhcnksIGJ1dCBvdXIgY29tcGlsZXIgZG9lc24ndCBvcHRpbWl6ZSBzdGQ6OmNvcHkgdmVyeQorLy8gZWZmZWN0aXZlbHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudCwKKyAgICAgICAgICBib29sIEhhc1RyaXZpYWxDb3B5ID0gc3RkOjppc190cml2aWFsPEVsZW1lbnQ+Ojp2YWx1ZT4KK3N0cnVjdCBFbGVtZW50Q29waWVyIHsKKyAgdm9pZCBvcGVyYXRvcigpKEVsZW1lbnQqIHRvLCBjb25zdCBFbGVtZW50KiBmcm9tLCBpbnQgYXJyYXlfc2l6ZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gaW1wbGVtZW50YXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2NvbnN0ZXhwciBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpSZXBlYXRlZEZpZWxkKCkKKyAgICA6IGN1cnJlbnRfc2l6ZV8oMCksIHRvdGFsX3NpemVfKDApLCBhcmVuYV9vcl9lbGVtZW50c18obnVsbHB0cikge30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRGaWVsZChBcmVuYSogYXJlbmEpCisgICAgOiBjdXJyZW50X3NpemVfKDApLCB0b3RhbF9zaXplXygwKSwgYXJlbmFfb3JfZWxlbWVudHNfKGFyZW5hKSB7fQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpSZXBlYXRlZEZpZWxkKGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKQorICAgIDogY3VycmVudF9zaXplXygwKSwgdG90YWxfc2l6ZV8oMCksIGFyZW5hX29yX2VsZW1lbnRzXyhudWxscHRyKSB7CisgIGlmIChvdGhlci5jdXJyZW50X3NpemVfICE9IDApIHsKKyAgICBSZXNlcnZlKG90aGVyLnNpemUoKSk7CisgICAgQWRkTkFscmVhZHlSZXNlcnZlZChvdGhlci5zaXplKCkpOworICAgIENvcHlBcnJheShNdXRhYmxlKDApLCAmb3RoZXIuR2V0KDApLCBvdGhlci5zaXplKCkpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXIsIHR5cGVuYW1lPgorUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRGaWVsZChJdGVyIGJlZ2luLCBJdGVyIGVuZCkKKyAgICA6IGN1cnJlbnRfc2l6ZV8oMCksIHRvdGFsX3NpemVfKDApLCBhcmVuYV9vcl9lbGVtZW50c18obnVsbHB0cikgeworICBBZGQoYmVnaW4sIGVuZCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgorUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6flJlcGVhdGVkRmllbGQoKSB7CisjaWZuZGVmIE5ERUJVRworICAvLyBUcnkgdG8gdHJpZ2dlciBzZWdmYXVsdCAvIGFzYW4gZmFpbHVyZSBpbiBub24tb3B0IGJ1aWxkcyBpZiBhcmVuYV8KKyAgLy8gbGlmZXRpbWUgaGFzIGVuZGVkIGJlZm9yZSB0aGUgZGVzdHJ1Y3Rvci4KKyAgYXV0byBhcmVuYSA9IEdldE93bmluZ0FyZW5hKCk7CisgIGlmIChhcmVuYSkgKHZvaWQpYXJlbmEtPlNwYWNlQWxsb2NhdGVkKCk7CisjZW5kaWYKKyAgaWYgKHRvdGFsX3NpemVfID4gMCkgeworICAgIEludGVybmFsRGVhbGxvY2F0ZShyZXAoKSwgdG90YWxfc2l6ZV8sIHRydWUpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD4mIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Om9wZXJhdG9yPSgKKyAgICBjb25zdCBSZXBlYXRlZEZpZWxkJiBvdGhlcikgeworICBpZiAodGhpcyAhPSAmb3RoZXIpIENvcHlGcm9tKG90aGVyKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpSZXBlYXRlZEZpZWxkKFJlcGVhdGVkRmllbGQmJiBvdGhlcikgbm9leGNlcHQKKyAgICA6IFJlcGVhdGVkRmllbGQoKSB7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgIENvcHlGcm9tKG90aGVyKTsKKyNlbHNlICAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgIC8vIFdlIGRvbid0IGp1c3QgY2FsbCBTd2FwKCZvdGhlcikgaGVyZSBiZWNhdXNlIGl0IHdvdWxkIHBlcmZvcm0gMyBjb3BpZXMgaWYKKyAgLy8gb3RoZXIgaXMgb24gYW4gYXJlbmEuIFRoaXMgZmllbGQgY2FuJ3QgYmUgb24gYW4gYXJlbmEgYmVjYXVzZSBhcmVuYQorICAvLyBjb25zdHJ1Y3Rpb24gYWx3YXlzIHVzZXMgdGhlIEFyZW5hKiBhY2NlcHRpbmcgY29uc3RydWN0b3IuCisgIGlmIChvdGhlci5HZXRPd25pbmdBcmVuYSgpKSB7CisgICAgQ29weUZyb20ob3RoZXIpOworICB9IGVsc2UgeworICAgIEludGVybmFsU3dhcCgmb3RoZXIpOworICB9CisjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50PiYgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6b3BlcmF0b3I9KAorICAgIFJlcGVhdGVkRmllbGQmJiBvdGhlcikgbm9leGNlcHQgeworICAvLyBXZSBkb24ndCBqdXN0IGNhbGwgU3dhcCgmb3RoZXIpIGhlcmUgYmVjYXVzZSBpdCB3b3VsZCBwZXJmb3JtIDMgY29waWVzIGlmCisgIC8vIHRoZSB0d28gZmllbGRzIGFyZSBvbiBkaWZmZXJlbnQgYXJlbmFzLgorICBpZiAodGhpcyAhPSAmb3RoZXIpIHsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBvdGhlci5HZXRPd25pbmdBcmVuYSgpCisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgIHx8IEdldE93bmluZ0FyZW5hKCkgPT0gbnVsbHB0cgorI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBDb3B5RnJvbShvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIEludGVybmFsU3dhcCgmb3RoZXIpOworICAgIH0KKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGJvb2wgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6ZW1wdHkoKSBjb25zdCB7CisgIHJldHVybiBjdXJyZW50X3NpemVfID09IDA7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGludCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpzaXplKCkgY29uc3QgeworICByZXR1cm4gY3VycmVudF9zaXplXzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgaW50IFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkNhcGFjaXR5KCkgY29uc3QgeworICByZXR1cm4gdG90YWxfc2l6ZV87Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6QWRkQWxyZWFkeVJlc2VydmVkKGNvbnN0IEVsZW1lbnQmIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0tfTFQoY3VycmVudF9zaXplXywgdG90YWxfc2l6ZV8pOworICBlbGVtZW50cygpW2N1cnJlbnRfc2l6ZV8rK10gPSB2YWx1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6QWRkQWxyZWFkeVJlc2VydmVkKCkgeworICBHT09HTEVfRENIRUNLX0xUKGN1cnJlbnRfc2l6ZV8sIHRvdGFsX3NpemVfKTsKKyAgcmV0dXJuICZlbGVtZW50cygpW2N1cnJlbnRfc2l6ZV8rK107Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIEVsZW1lbnQqIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkFkZE5BbHJlYWR5UmVzZXJ2ZWQoaW50IGVsZW1lbnRzKSB7CisgIEdPT0dMRV9EQ0hFQ0tfR0UodG90YWxfc2l6ZV8gLSBjdXJyZW50X3NpemVfLCBlbGVtZW50cykKKyAgICAgIDw8IHRvdGFsX3NpemVfIDw8ICIsICIgPDwgY3VycmVudF9zaXplXzsKKyAgLy8gV2FybmluZzogc29tZXRpbWVzIHBlb3BsZSBjYWxsIHRoaXMgd2hlbiBlbGVtZW50cyA9PSAwIGFuZAorICAvLyB0b3RhbF9zaXplXyA9PSAwLiBJbiB0aGlzIGNhc2UgdGhlIHJldHVybiBwb2ludGVyIHBvaW50cyB0byBhIHplcm8gc2l6ZQorICAvLyBhcnJheSAobiA9PSAwKS4gSGVuY2Ugd2UgY2FuIGp1c3QgdXNlIHVuc2FmZV9lbGVtZW50cygpLCBiZWNhdXNlIHRoZSB1c2VyCisgIC8vIGNhbm5vdCBkZXJlZmVyZW5jZSB0aGUgcG9pbnRlciBhbnl3YXkuCisgIEVsZW1lbnQqIHJldCA9IHVuc2FmZV9lbGVtZW50cygpICsgY3VycmVudF9zaXplXzsKKyAgY3VycmVudF9zaXplXyArPSBlbGVtZW50czsKKyAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpSZXNpemUoaW50IG5ld19zaXplLCBjb25zdCBFbGVtZW50JiB2YWx1ZSkgeworICBHT09HTEVfRENIRUNLX0dFKG5ld19zaXplLCAwKTsKKyAgaWYgKG5ld19zaXplID4gY3VycmVudF9zaXplXykgeworICAgIFJlc2VydmUobmV3X3NpemUpOworICAgIHN0ZDo6ZmlsbCgmZWxlbWVudHMoKVtjdXJyZW50X3NpemVfXSwgJmVsZW1lbnRzKClbbmV3X3NpemVdLCB2YWx1ZSk7CisgIH0KKyAgY3VycmVudF9zaXplXyA9IG5ld19zaXplOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBjb25zdCBFbGVtZW50JiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpHZXQoaW50IGluZGV4KSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0tfR0UoaW5kZXgsIDApOworICBHT09HTEVfRENIRUNLX0xUKGluZGV4LCBjdXJyZW50X3NpemVfKTsKKyAgcmV0dXJuIGVsZW1lbnRzKClbaW5kZXhdOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBjb25zdCBFbGVtZW50JiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjphdChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLX0dFKGluZGV4LCAwKTsKKyAgR09PR0xFX0NIRUNLX0xUKGluZGV4LCBjdXJyZW50X3NpemVfKTsKKyAgcmV0dXJuIGVsZW1lbnRzKClbaW5kZXhdOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBFbGVtZW50JiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjphdChpbnQgaW5kZXgpIHsKKyAgR09PR0xFX0NIRUNLX0dFKGluZGV4LCAwKTsKKyAgR09PR0xFX0NIRUNLX0xUKGluZGV4LCBjdXJyZW50X3NpemVfKTsKKyAgcmV0dXJuIGVsZW1lbnRzKClbaW5kZXhdOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBFbGVtZW50KiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpNdXRhYmxlKGludCBpbmRleCkgeworICBHT09HTEVfRENIRUNLX0dFKGluZGV4LCAwKTsKKyAgR09PR0xFX0RDSEVDS19MVChpbmRleCwgY3VycmVudF9zaXplXyk7CisgIHJldHVybiAmZWxlbWVudHMoKVtpbmRleF07Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6U2V0KGludCBpbmRleCwgY29uc3QgRWxlbWVudCYgdmFsdWUpIHsKKyAgR09PR0xFX0RDSEVDS19HRShpbmRleCwgMCk7CisgIEdPT0dMRV9EQ0hFQ0tfTFQoaW5kZXgsIGN1cnJlbnRfc2l6ZV8pOworICBlbGVtZW50cygpW2luZGV4XSA9IHZhbHVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkFkZChjb25zdCBFbGVtZW50JiB2YWx1ZSkgeworICB1aW50MzJfdCBzaXplID0gY3VycmVudF9zaXplXzsKKyAgaWYgKHN0YXRpY19jYXN0PGludD4oc2l6ZSkgPT0gdG90YWxfc2l6ZV8pIHsKKyAgICAvLyB2YWx1ZSBjb3VsZCByZWZlcmVuY2UgYW4gZWxlbWVudCBvZiB0aGUgYXJyYXkuIFJlc2VydmluZyBuZXcgc3BhY2Ugd2lsbAorICAgIC8vIGludmFsaWRhdGUgdGhlIHJlZmVyZW5jZS4gU28gd2UgbXVzdCBtYWtlIGEgY29weSBmaXJzdC4KKyAgICBhdXRvIHRtcCA9IHZhbHVlOworICAgIFJlc2VydmUodG90YWxfc2l6ZV8gKyAxKTsKKyAgICBlbGVtZW50cygpW3NpemVdID0gc3RkOjptb3ZlKHRtcCk7CisgIH0gZWxzZSB7CisgICAgZWxlbWVudHMoKVtzaXplXSA9IHZhbHVlOworICB9CisgIGN1cnJlbnRfc2l6ZV8gPSBzaXplICsgMTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6QWRkKCkgeworICB1aW50MzJfdCBzaXplID0gY3VycmVudF9zaXplXzsKKyAgaWYgKHN0YXRpY19jYXN0PGludD4oc2l6ZSkgPT0gdG90YWxfc2l6ZV8pIFJlc2VydmUodG90YWxfc2l6ZV8gKyAxKTsKKyAgYXV0byBwdHIgPSAmZWxlbWVudHMoKVtzaXplXTsKKyAgY3VycmVudF9zaXplXyA9IHNpemUgKyAxOworICByZXR1cm4gcHRyOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgoraW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6QWRkKEl0ZXIgYmVnaW4sIEl0ZXIgZW5kKSB7CisgIGludCByZXNlcnZlID0gaW50ZXJuYWw6OkNhbGN1bGF0ZVJlc2VydmUoYmVnaW4sIGVuZCk7CisgIGlmIChyZXNlcnZlICE9IC0xKSB7CisgICAgaWYgKHJlc2VydmUgPT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFJlc2VydmUocmVzZXJ2ZSArIHNpemUoKSk7CisgICAgLy8gVE9ETyhja2VubmVsbHkpOiAgVGhlIGNvbXBpbGVyIGxvc2VzIHRyYWNrIG9mIHRoZSBidWZmZXIgZnJlc2hseQorICAgIC8vIGFsbG9jYXRlZCBieSBSZXNlcnZlKCkgYnkgdGhlIHRpbWUgd2UgY2FsbCBlbGVtZW50cywgc28gaXQgY2Fubm90CisgICAgLy8gZ3VhcmFudGVlIHRoYXQgZWxlbWVudHMgZG9lcyBub3QgYWxpYXMgW2JlZ2luKCksIGVuZCgpKS4KKyAgICAvLworICAgIC8vIElmIHJlc3RyaWN0IGlzIGF2YWlsYWJsZSwgYW5ub3RhdGluZyB0aGUgcG9pbnRlciBvYnRhaW5lZCBmcm9tIGVsZW1lbnRzKCkKKyAgICAvLyBjYXVzZXMgdGhpcyB0byBsb3dlciB0byBtZW1jcHkgaW5zdGVhZCBvZiBtZW1tb3ZlLgorICAgIHN0ZDo6Y29weShiZWdpbiwgZW5kLCBlbGVtZW50cygpICsgc2l6ZSgpKTsKKyAgICBjdXJyZW50X3NpemVfID0gcmVzZXJ2ZSArIHNpemUoKTsKKyAgfSBlbHNlIHsKKyAgICBGYXN0QWRkZXIgZmFzdF9hZGRlcih0aGlzKTsKKyAgICBmb3IgKDsgYmVnaW4gIT0gZW5kOyArK2JlZ2luKSBmYXN0X2FkZGVyLkFkZCgqYmVnaW4pOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVtb3ZlTGFzdCgpIHsKKyAgR09PR0xFX0RDSEVDS19HVChjdXJyZW50X3NpemVfLCAwKTsKKyAgY3VycmVudF9zaXplXy0tOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK3ZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6RXh0cmFjdFN1YnJhbmdlKGludCBzdGFydCwgaW50IG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQqIGVsZW1lbnRzKSB7CisgIEdPT0dMRV9EQ0hFQ0tfR0Uoc3RhcnQsIDApOworICBHT09HTEVfRENIRUNLX0dFKG51bSwgMCk7CisgIEdPT0dMRV9EQ0hFQ0tfTEUoc3RhcnQgKyBudW0sIHRoaXMtPmN1cnJlbnRfc2l6ZV8pOworCisgIC8vIFNhdmUgdGhlIHZhbHVlcyBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cyBpZiByZXF1ZXN0ZWQuCisgIGlmIChlbGVtZW50cyAhPSBudWxscHRyKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkgZWxlbWVudHNbaV0gPSB0aGlzLT5HZXQoaSArIHN0YXJ0KTsKKyAgfQorCisgIC8vIFNsaWRlIHJlbWFpbmluZyBlbGVtZW50cyBkb3duIHRvIGZpbGwgdGhlIGdhcC4KKyAgaWYgKG51bSA+IDApIHsKKyAgICBmb3IgKGludCBpID0gc3RhcnQgKyBudW07IGkgPCB0aGlzLT5jdXJyZW50X3NpemVfOyArK2kpCisgICAgICB0aGlzLT5TZXQoaSAtIG51bSwgdGhpcy0+R2V0KGkpKTsKKyAgICB0aGlzLT5UcnVuY2F0ZSh0aGlzLT5jdXJyZW50X3NpemVfIC0gbnVtKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkNsZWFyKCkgeworICBjdXJyZW50X3NpemVfID0gMDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpNZXJnZUZyb20oY29uc3QgUmVwZWF0ZWRGaWVsZCYgb3RoZXIpIHsKKyAgR09PR0xFX0RDSEVDS19ORSgmb3RoZXIsIHRoaXMpOworICBpZiAob3RoZXIuY3VycmVudF9zaXplXyAhPSAwKSB7CisgICAgaW50IGV4aXN0aW5nX3NpemUgPSBzaXplKCk7CisgICAgUmVzZXJ2ZShleGlzdGluZ19zaXplICsgb3RoZXIuc2l6ZSgpKTsKKyAgICBBZGROQWxyZWFkeVJlc2VydmVkKG90aGVyLnNpemUoKSk7CisgICAgQ29weUFycmF5KE11dGFibGUoZXhpc3Rpbmdfc2l6ZSksICZvdGhlci5HZXQoMCksIG90aGVyLnNpemUoKSk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpDb3B5RnJvbShjb25zdCBSZXBlYXRlZEZpZWxkJiBvdGhlcikgeworICBpZiAoJm90aGVyID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKG90aGVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KK2lubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkFzc2lnbihJdGVyIGJlZ2luLCBJdGVyIGVuZCkgeworICBDbGVhcigpOworICBBZGQoYmVnaW4sIGVuZCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OmVyYXNlKAorICAgIGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uKSB7CisgIHJldHVybiBlcmFzZShwb3NpdGlvbiwgcG9zaXRpb24gKyAxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6aXRlcmF0b3IgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6ZXJhc2UoCisgICAgY29uc3RfaXRlcmF0b3IgZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIGxhc3QpIHsKKyAgc2l6ZV90eXBlIGZpcnN0X29mZnNldCA9IGZpcnN0IC0gY2JlZ2luKCk7CisgIGlmIChmaXJzdCAhPSBsYXN0KSB7CisgICAgVHJ1bmNhdGUoc3RkOjpjb3B5KGxhc3QsIGNlbmQoKSwgYmVnaW4oKSArIGZpcnN0X29mZnNldCkgLSBjYmVnaW4oKSk7CisgIH0KKyAgcmV0dXJuIGJlZ2luKCkgKyBmaXJzdF9vZmZzZXQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIEVsZW1lbnQqIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Om11dGFibGVfZGF0YSgpIHsKKyAgcmV0dXJuIHVuc2FmZV9lbGVtZW50cygpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBjb25zdCBFbGVtZW50KiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpkYXRhKCkgY29uc3QgeworICByZXR1cm4gdW5zYWZlX2VsZW1lbnRzKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6SW50ZXJuYWxTd2FwKFJlcGVhdGVkRmllbGQqIG90aGVyKSB7CisgIEdPT0dMRV9EQ0hFQ0sodGhpcyAhPSBvdGhlcik7CisKKyAgLy8gU3dhcCBhbGwgZmllbGRzIGF0IG9uY2UuCisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8UmVwZWF0ZWRGaWVsZDxFbGVtZW50Pj46OnZhbHVlLAorICAgICAgICAgICAgICAgICJvZmZzZXRvZigpIHJlcXVpcmVzIHN0YW5kYXJkIGxheW91dCBiZWZvcmUgYysrMTciKTsKKyAgaW50ZXJuYWw6Om1lbXN3YXA8b2Zmc2V0b2YoUmVwZWF0ZWRGaWVsZCwgYXJlbmFfb3JfZWxlbWVudHNfKSArCisgICAgICAgICAgICAgICAgICAgIHNpemVvZih0aGlzLT5hcmVuYV9vcl9lbGVtZW50c18pIC0KKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoUmVwZWF0ZWRGaWVsZCwgY3VycmVudF9zaXplXyk+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4odGhpcykgKyBvZmZzZXRvZihSZXBlYXRlZEZpZWxkLCBjdXJyZW50X3NpemVfKSwKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG90aGVyKSArIG9mZnNldG9mKFJlcGVhdGVkRmllbGQsIGN1cnJlbnRfc2l6ZV8pKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Cit2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OlN3YXAoUmVwZWF0ZWRGaWVsZCogb3RoZXIpIHsKKyAgaWYgKHRoaXMgPT0gb3RoZXIpIHJldHVybjsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0ciAmJgorICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworI2Vsc2UgICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0gZWxzZSB7CisgICAgUmVwZWF0ZWRGaWVsZDxFbGVtZW50PiB0ZW1wKG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICB0ZW1wLk1lcmdlRnJvbSgqdGhpcyk7CisgICAgQ29weUZyb20oKm90aGVyKTsKKyAgICBvdGhlci0+VW5zYWZlQXJlbmFTd2FwKCZ0ZW1wKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK3ZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6VW5zYWZlQXJlbmFTd2FwKFJlcGVhdGVkRmllbGQqIG90aGVyKSB7CisgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm47CisgIEdPT0dMRV9EQ0hFQ0tfRVEoR2V0T3duaW5nQXJlbmEoKSwgb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICBJbnRlcm5hbFN3YXAob3RoZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK3ZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6U3dhcEVsZW1lbnRzKGludCBpbmRleDEsIGludCBpbmRleDIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOyAgLy8gZW5hYmxlIEFETCB3aXRoIGZhbGxiYWNrCisgIHN3YXAoZWxlbWVudHMoKVtpbmRleDFdLCBlbGVtZW50cygpW2luZGV4Ml0pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjppdGVyYXRvcgorUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6YmVnaW4oKSB7CisgIHJldHVybiBpdGVyYXRvcih1bnNhZmVfZWxlbWVudHMoKSk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+Ojpjb25zdF9pdGVyYXRvcgorUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6YmVnaW4oKSBjb25zdCB7CisgIHJldHVybiBjb25zdF9pdGVyYXRvcih1bnNhZmVfZWxlbWVudHMoKSk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+Ojpjb25zdF9pdGVyYXRvcgorUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6Y2JlZ2luKCkgY29uc3QgeworICByZXR1cm4gY29uc3RfaXRlcmF0b3IodW5zYWZlX2VsZW1lbnRzKCkpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6aXRlcmF0b3IgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6ZW5kKCkgeworICByZXR1cm4gaXRlcmF0b3IodW5zYWZlX2VsZW1lbnRzKCkgKyBjdXJyZW50X3NpemVfKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OmNvbnN0X2l0ZXJhdG9yCitSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjplbmQoKSBjb25zdCB7CisgIHJldHVybiBjb25zdF9pdGVyYXRvcih1bnNhZmVfZWxlbWVudHMoKSArIGN1cnJlbnRfc2l6ZV8pOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6Y29uc3RfaXRlcmF0b3IKK1JlcGVhdGVkRmllbGQ8RWxlbWVudD46OmNlbmQoKSBjb25zdCB7CisgIHJldHVybiBjb25zdF9pdGVyYXRvcih1bnNhZmVfZWxlbWVudHMoKSArIGN1cnJlbnRfc2l6ZV8pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBzaXplX3QgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6U3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKSBjb25zdCB7CisgIHJldHVybiB0b3RhbF9zaXplXyA+IDAgPyAodG90YWxfc2l6ZV8gKiBzaXplb2YoRWxlbWVudCkgKyBrUmVwSGVhZGVyU2l6ZSkgOiAwOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworLy8gUmV0dXJucyB0aGUgbmV3IHNpemUgZm9yIGEgcmVzZXJ2ZWQgZmllbGQgYmFzZWQgb24gaXRzICd0b3RhbF9zaXplJyBhbmQgdGhlCisvLyByZXF1ZXN0ZWQgJ25ld19zaXplJy4gVGhlIHJlc3VsdCBpcyBjbGFtcGVkIHRvIHRoZSBjbG9zZWQgaW50ZXJ2YWw6CisvLyAgIFtpbnRlcm5hbDo6a01pblJlcGVhdGVkRmllbGRBbGxvY2F0aW9uU2l6ZSwKKy8vICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCldCisvLyBSZXF1aXJlczoKKy8vICAgICBuZXdfc2l6ZSA+IHRvdGFsX3NpemUgJiYKKy8vICAgICAodG90YWxfc2l6ZSA9PSAwIHx8CisvLyAgICAgIHRvdGFsX3NpemUgPj0ga1JlcGVhdGVkRmllbGRMb3dlckNsYW1wTGltaXQpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IGtSZXBIZWFkZXJTaXplPgoraW5saW5lIGludCBDYWxjdWxhdGVSZXNlcnZlU2l6ZShpbnQgdG90YWxfc2l6ZSwgaW50IG5ld19zaXplKSB7CisgIGNvbnN0ZXhwciBpbnQgbG93ZXJfbGltaXQgPSBSZXBlYXRlZEZpZWxkTG93ZXJDbGFtcExpbWl0PFQsIGtSZXBIZWFkZXJTaXplPigpOworICBpZiAobmV3X3NpemUgPCBsb3dlcl9saW1pdCkgeworICAgIC8vIENsYW1wIHRvIHNtYWxsZXN0IGFsbG93ZWQgc2l6ZS4KKyAgICByZXR1cm4gbG93ZXJfbGltaXQ7CisgIH0KKyAgY29uc3RleHByIGludCBrTWF4U2l6ZUJlZm9yZUNsYW1wID0KKyAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpIC0ga1JlcEhlYWRlclNpemUpIC8gMjsKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UodG90YWxfc2l6ZSA+IGtNYXhTaXplQmVmb3JlQ2xhbXApKSB7CisgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CisgIH0KKyAgLy8gV2Ugd2FudCB0byBkb3VibGUgdGhlIG51bWJlciBvZiBieXRlcywgbm90IHRoZSBudW1iZXIgb2YgZWxlbWVudHMsIHRvIHRyeQorICAvLyB0byBzdGF5IHdpdGhpbiBwb3dlci1vZi10d28gYWxsb2NhdGlvbnMuCisgIC8vIFRoZSBhbGxvY2F0aW9uIGhhcyBrUmVwSGVhZGVyU2l6ZSArIHNpemVvZihUKSAqIGNhcGFjaXR5LgorICBpbnQgZG91YmxlZF9zaXplID0gMiAqIHRvdGFsX3NpemUgKyBrUmVwSGVhZGVyU2l6ZSAvIHNpemVvZihUKTsKKyAgcmV0dXJuIHN0ZDo6bWF4KGRvdWJsZWRfc2l6ZSwgbmV3X3NpemUpOworfQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEF2b2lkIGlubGluaW5nIG9mIFJlc2VydmUoKTogbmV3LCBjb3B5LCBhbmQgZGVsZXRlW10gbGVhZCB0byBhIHNpZ25pZmljYW50CisvLyBhbW91bnQgb2YgY29kZSBibG9hdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50Pgordm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpSZXNlcnZlKGludCBuZXdfc2l6ZSkgeworICBpZiAodG90YWxfc2l6ZV8gPj0gbmV3X3NpemUpIHJldHVybjsKKyAgUmVwKiBvbGRfcmVwID0gdG90YWxfc2l6ZV8gPiAwID8gcmVwKCkgOiBudWxscHRyOworICBSZXAqIG5ld19yZXA7CisgIEFyZW5hKiBhcmVuYSA9IEdldE93bmluZ0FyZW5hKCk7CisKKyAgbmV3X3NpemUgPSBpbnRlcm5hbDo6Q2FsY3VsYXRlUmVzZXJ2ZVNpemU8RWxlbWVudCwga1JlcEhlYWRlclNpemU+KAorICAgICAgdG90YWxfc2l6ZV8sIG5ld19zaXplKTsKKworICBHT09HTEVfRENIRUNLX0xFKAorICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihuZXdfc2l6ZSksCisgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSAtIGtSZXBIZWFkZXJTaXplKSAvIHNpemVvZihFbGVtZW50KSkKKyAgICAgIDw8ICJSZXF1ZXN0ZWQgc2l6ZSBpcyB0b28gbGFyZ2UgdG8gZml0IGludG8gc2l6ZV90LiI7CisgIHNpemVfdCBieXRlcyA9CisgICAgICBrUmVwSGVhZGVyU2l6ZSArIHNpemVvZihFbGVtZW50KSAqIHN0YXRpY19jYXN0PHNpemVfdD4obmV3X3NpemUpOworICBpZiAoYXJlbmEgPT0gbnVsbHB0cikgeworICAgIG5ld19yZXAgPSBzdGF0aWNfY2FzdDxSZXAqPig6Om9wZXJhdG9yIG5ldyhieXRlcykpOworICB9IGVsc2UgeworICAgIG5ld19yZXAgPSByZWludGVycHJldF9jYXN0PFJlcCo+KEFyZW5hOjpDcmVhdGVBcnJheTxjaGFyPihhcmVuYSwgYnl0ZXMpKTsKKyAgfQorICBuZXdfcmVwLT5hcmVuYSA9IGFyZW5hOworICBpbnQgb2xkX3RvdGFsX3NpemUgPSB0b3RhbF9zaXplXzsKKyAgLy8gQWxyZWFkeSBrbm93bjogbmV3X3NpemUgPj0gaW50ZXJuYWw6OmtNaW5SZXBlYXRlZEZpZWxkQWxsb2NhdGlvblNpemUKKyAgLy8gTWFpbnRhaW4gaW52YXJpYW50OgorICAvLyAgICAgdG90YWxfc2l6ZV8gPT0gMCB8fAorICAvLyAgICAgdG90YWxfc2l6ZV8gPj0gaW50ZXJuYWw6OmtNaW5SZXBlYXRlZEZpZWxkQWxsb2NhdGlvblNpemUKKyAgdG90YWxfc2l6ZV8gPSBuZXdfc2l6ZTsKKyAgYXJlbmFfb3JfZWxlbWVudHNfID0gbmV3X3JlcC0+ZWxlbWVudHMoKTsKKyAgLy8gSW52b2tlIHBsYWNlbWVudC1uZXcgb24gbmV3bHkgYWxsb2NhdGVkIGVsZW1lbnRzLiBXZSBzaG91bGRuJ3QgaGF2ZSB0byBkbworICAvLyB0aGlzLCBzaW5jZSBFbGVtZW50IGlzIHN1cHBvc2VkIHRvIGJlIFBPRCwgYnV0IGEgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGlzCisgIC8vIGNvZGUgYWxsb2NhdGVkIHN0b3JhZ2Ugd2l0aCAibmV3IEVsZW1lbnRbc2l6ZV0iIGFuZCBzb21lIGNvZGUgdXNlcworICAvLyBSZXBlYXRlZEZpZWxkIHdpdGggbm9uLVBPRCB0eXBlcywgcmVseWluZyBvbiBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLiBJZgorICAvLyBFbGVtZW50IGhhcyBhIHRyaXZpYWwgY29uc3RydWN0b3IgKGUuZy4sIGludDMyX3QpLCBnY2MgKHRlc3RlZCB3aXRoIC1PMikKKyAgLy8gY29tcGxldGVseSByZW1vdmVzIHRoaXMgbG9vcCBiZWNhdXNlIHRoZSBsb29wIGJvZHkgaXMgZW1wdHksIHNvIHRoaXMgaGFzIG5vCisgIC8vIGVmZmVjdCB1bmxlc3MgaXRzIHNpZGUtZWZmZWN0cyBhcmUgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLgorICAvLyBOb3RlIHRoYXQgd2UgZG8gdGhpcyBiZWZvcmUgTW92ZUFycmF5KCkgYmVsb3cgYmVjYXVzZSBFbGVtZW50J3MgY29weQorICAvLyBhc3NpZ25tZW50IGltcGxlbWVudGF0aW9uIHdpbGwgd2FudCBhbiBpbml0aWFsaXplZCBpbnN0YW5jZSBmaXJzdC4KKyAgRWxlbWVudCogZSA9ICZlbGVtZW50cygpWzBdOworICBFbGVtZW50KiBsaW1pdCA9IGUgKyB0b3RhbF9zaXplXzsKKyAgZm9yICg7IGUgPCBsaW1pdDsgZSsrKSB7CisgICAgbmV3IChlKSBFbGVtZW50OworICB9CisgIGlmIChjdXJyZW50X3NpemVfID4gMCkgeworICAgIE1vdmVBcnJheSgmZWxlbWVudHMoKVswXSwgb2xkX3JlcC0+ZWxlbWVudHMoKSwgY3VycmVudF9zaXplXyk7CisgIH0KKworICAvLyBMaWtld2lzZSwgd2UgbmVlZCB0byBpbnZva2UgZGVzdHJ1Y3RvcnMgb24gdGhlIG9sZCBhcnJheS4KKyAgSW50ZXJuYWxEZWFsbG9jYXRlKG9sZF9yZXAsIG9sZF90b3RhbF9zaXplLCBmYWxzZSk7CisKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpUcnVuY2F0ZShpbnQgbmV3X3NpemUpIHsKKyAgR09PR0xFX0RDSEVDS19MRShuZXdfc2l6ZSwgY3VycmVudF9zaXplXyk7CisgIGlmIChjdXJyZW50X3NpemVfID4gMCkgeworICAgIGN1cnJlbnRfc2l6ZV8gPSBuZXdfc2l6ZTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Ok1vdmVBcnJheShFbGVtZW50KiB0bywgRWxlbWVudCogZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJyYXlfc2l6ZSkgeworICBDb3B5QXJyYXkodG8sIGZyb20sIGFycmF5X3NpemUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkNvcHlBcnJheShFbGVtZW50KiB0bywgY29uc3QgRWxlbWVudCogZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJyYXlfc2l6ZSkgeworICBpbnRlcm5hbDo6RWxlbWVudENvcGllcjxFbGVtZW50PigpKHRvLCBmcm9tLCBhcnJheV9zaXplKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQsIGJvb2wgSGFzVHJpdmlhbENvcHk+Cit2b2lkIEVsZW1lbnRDb3BpZXI8RWxlbWVudCwgSGFzVHJpdmlhbENvcHk+OjpvcGVyYXRvcigpKEVsZW1lbnQqIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbGVtZW50KiBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJyYXlfc2l6ZSkgeworICBzdGQ6OmNvcHkoZnJvbSwgZnJvbSArIGFycmF5X3NpemUsIHRvKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitzdHJ1Y3QgRWxlbWVudENvcGllcjxFbGVtZW50LCB0cnVlPiB7CisgIHZvaWQgb3BlcmF0b3IoKShFbGVtZW50KiB0bywgY29uc3QgRWxlbWVudCogZnJvbSwgaW50IGFycmF5X3NpemUpIHsKKyAgICBtZW1jcHkodG8sIGZyb20sIHN0YXRpY19jYXN0PHNpemVfdD4oYXJyYXlfc2l6ZSkgKiBzaXplb2YoRWxlbWVudCkpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEl0ZXJhdG9ycyBhbmQgaGVscGVyIGZ1bmN0aW9ucyB0aGF0IGZvbGxvdyB0aGUgc3Bpcml0IG9mIHRoZSBTVEwKKy8vIHN0ZDo6YmFja19pbnNlcnRfaXRlcmF0b3IgYW5kIHN0ZDo6YmFja19pbnNlcnRlciBidXQgYXJlIHRhaWxvci1tYWRlCisvLyBmb3IgUmVwZWF0ZWRGaWVsZCBhbmQgUmVwZWF0ZWRQdHJGaWVsZC4gVHlwaWNhbCB1c2FnZSB3b3VsZCBiZToKKy8vCisvLyAgIHN0ZDo6Y29weShzb21lX3NlcXVlbmNlLmJlZ2luKCksIHNvbWVfc2VxdWVuY2UuZW5kKCksCisvLyAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkQmFja0luc2VydGVyKHByb3RvLm11dGFibGVfc2VxdWVuY2UoKSkpOworLy8KKy8vIFBvcnRlZCBieSBqb2hhbm5lcyBmcm9tIHV0aWwvZ3RsL3Byb3RvLWFycmF5LWl0ZXJhdG9ycy5oCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFNUTC1saWtlIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uIGZvciBSZXBlYXRlZEZpZWxkLiAgWW91IHNob3VsZCBub3QKKy8vIHJlZmVyIHRvIHRoaXMgY2xhc3MgZGlyZWN0bHk7IHVzZSBSZXBlYXRlZEZpZWxkPFQ+OjppdGVyYXRvciBpbnN0ZWFkLgorLy8KKy8vIE5vdGU6IEFsbCBvZiB0aGUgaXRlcmF0b3Igb3BlcmF0b3JzICptdXN0KiBiZSBpbmxpbmVkIHRvIGF2b2lkIHBlcmZvcm1hbmNlCisvLyByZWdyZXNzaW9ucy4gIFRoaXMgaXMgY2F1c2VkIGJ5IHRoZSBleHRlcm4gdGVtcGxhdGUgZGVjbGFyYXRpb25zIGJlbG93ICh3aGljaAorLy8gYXJlIHJlcXVpcmVkIGJlY2F1c2Ugb2YgdGhlIFJlcGVhdGVkRmllbGQgZXh0ZXJuIHRlbXBsYXRlIGRlY2xhcmF0aW9ucykuICBJZgorLy8gYW55IG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmVuJ3QgZXhwbGljaXRseSBpbmxpbmVkIChlLmcuIGRlZmluZWQgaW4gdGhlIGNsYXNzKSwKKy8vIHRoZSBjb21waWxlciBpc24ndCBhbGxvd2VkIHRvIGlubGluZSB0aGVtLgordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitjbGFzcyBSZXBlYXRlZEl0ZXJhdG9yIHsKKyBwdWJsaWM6CisgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZzsKKyAgLy8gTm90ZTogcmVtb3ZlX2NvbnN0IGlzIG5lY2Vzc2FyeSBmb3Igc3RkOjpwYXJ0aWFsX3N1bSwgd2hpY2ggdXNlcyB2YWx1ZV90eXBlCisgIC8vIHRvIGRldGVybWluZSB0aGUgc3VtbWF0aW9uIHZhcmlhYmxlIHR5cGUuCisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDxFbGVtZW50Pjo6dHlwZTsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisgIHVzaW5nIHBvaW50ZXIgPSBFbGVtZW50KjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gRWxlbWVudCY7CisKKyAgY29uc3RleHByIFJlcGVhdGVkSXRlcmF0b3IoKSBub2V4Y2VwdCA6IGl0XyhudWxscHRyKSB7fQorCisgIC8vIEFsbG93cyAidXBjYXN0aW5nIiBmcm9tIFJlcGVhdGVkSXRlcmF0b3I8VCoqPiB0bworICAvLyBSZXBlYXRlZEl0ZXJhdG9yPGNvbnN0IFQqY29uc3QqPi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyRWxlbWVudCwKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8CisgICAgICAgICAgICAgICAgT3RoZXJFbGVtZW50KiwgcG9pbnRlcj46OnZhbHVlPjo6dHlwZSogPSBudWxscHRyPgorICBjb25zdGV4cHIgUmVwZWF0ZWRJdGVyYXRvcigKKyAgICAgIGNvbnN0IFJlcGVhdGVkSXRlcmF0b3I8T3RoZXJFbGVtZW50PiYgb3RoZXIpIG5vZXhjZXB0CisgICAgICA6IGl0XyhvdGhlci5pdF8pIHt9CisKKyAgLy8gZGVyZWZlcmVuY2VhYmxlCisgIGNvbnN0ZXhwciByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gKml0XzsgfQorICBjb25zdGV4cHIgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gaXRfOyB9CisKKyBwcml2YXRlOgorICAvLyBIZWxwZXIgYWxpYXMgdG8gaGlkZSB0aGUgaW50ZXJuYWwgdHlwZS4KKyAgdXNpbmcgaXRlcmF0b3IgPSBSZXBlYXRlZEl0ZXJhdG9yPEVsZW1lbnQ+OworCisgcHVibGljOgorICAvLyB7aW5jLGRlY31yZW1lbnRhYmxlCisgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgbm9leGNlcHQgeworICAgICsraXRfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpdGVyYXRvciBvcGVyYXRvcisrKGludCkgbm9leGNlcHQgeyByZXR1cm4gaXRlcmF0b3IoaXRfKyspOyB9CisgIGl0ZXJhdG9yJiBvcGVyYXRvci0tKCkgbm9leGNlcHQgeworICAgIC0taXRfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpdGVyYXRvciBvcGVyYXRvci0tKGludCkgbm9leGNlcHQgeyByZXR1cm4gaXRlcmF0b3IoaXRfLS0pOyB9CisKKyAgLy8gZXF1YWxpdHlfY29tcGFyYWJsZQorICBmcmllbmQgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlcmF0b3ImIHkpIG5vZXhjZXB0IHsKKyAgICByZXR1cm4geC5pdF8gPT0geS5pdF87CisgIH0KKyAgZnJpZW5kIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yJiB5KSBub2V4Y2VwdCB7CisgICAgcmV0dXJuIHguaXRfICE9IHkuaXRfOworICB9CisKKyAgLy8gbGVzc190aGFuX2NvbXBhcmFibGUKKyAgZnJpZW5kIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChjb25zdCBpdGVyYXRvciYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVyYXRvciYgeSkgbm9leGNlcHQgeworICAgIHJldHVybiB4Lml0XyA8IHkuaXRfOworICB9CisgIGZyaWVuZCBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGl0ZXJhdG9yJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVyYXRvciYgeSkgbm9leGNlcHQgeworICAgIHJldHVybiB4Lml0XyA8PSB5Lml0XzsKKyAgfQorICBmcmllbmQgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGl0ZXJhdG9yJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yJiB5KSBub2V4Y2VwdCB7CisgICAgcmV0dXJuIHguaXRfID4geS5pdF87CisgIH0KKyAgZnJpZW5kIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0oY29uc3QgaXRlcmF0b3ImIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yJiB5KSBub2V4Y2VwdCB7CisgICAgcmV0dXJuIHguaXRfID49IHkuaXRfOworICB9CisKKyAgLy8gYWRkYWJsZSwgc3VidHJhY3RhYmxlCisgIGl0ZXJhdG9yJiBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBkKSBub2V4Y2VwdCB7CisgICAgaXRfICs9IGQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGNvbnN0ZXhwciBpdGVyYXRvciBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIGQpIGNvbnN0IG5vZXhjZXB0IHsKKyAgICByZXR1cm4gaXRlcmF0b3IoaXRfICsgZCk7CisgIH0KKyAgZnJpZW5kIGNvbnN0ZXhwciBpdGVyYXRvciBvcGVyYXRvcisoY29uc3QgZGlmZmVyZW5jZV90eXBlIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGl0KSBub2V4Y2VwdCB7CisgICAgcmV0dXJuIGl0ICsgZDsKKyAgfQorCisgIGl0ZXJhdG9yJiBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBkKSBub2V4Y2VwdCB7CisgICAgaXRfIC09IGQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGl0ZXJhdG9yIGNvbnN0ZXhwciBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIGQpIGNvbnN0IG5vZXhjZXB0IHsKKyAgICByZXR1cm4gaXRlcmF0b3IoaXRfIC0gZCk7CisgIH0KKworICAvLyBpbmRleGFibGUKKyAgY29uc3RleHByIHJlZmVyZW5jZSBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBkKSBjb25zdCBub2V4Y2VwdCB7CisgICAgcmV0dXJuIGl0X1tkXTsKKyAgfQorCisgIC8vIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IKKyAgZnJpZW5kIGNvbnN0ZXhwciBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKGl0ZXJhdG9yIGl0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGl0Mikgbm9leGNlcHQgeworICAgIHJldHVybiBpdDEuaXRfIC0gaXQyLml0XzsKKyAgfQorCisgcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyRWxlbWVudD4KKyAgZnJpZW5kIGNsYXNzIFJlcGVhdGVkSXRlcmF0b3I7CisKKyAgLy8gQWxsb3cgY29uc3RydWN0aW9uIGZyb20gUmVwZWF0ZWRGaWVsZC4KKyAgZnJpZW5kIGNsYXNzIFJlcGVhdGVkRmllbGQ8dmFsdWVfdHlwZT47CisgIGV4cGxpY2l0IFJlcGVhdGVkSXRlcmF0b3IoRWxlbWVudCogaXQpIG5vZXhjZXB0IDogaXRfKGl0KSB7fQorCisgIC8vIFRoZSBpbnRlcm5hbCBpdGVyYXRvci4KKyAgRWxlbWVudCogaXRfOworfTsKKworLy8gQSBiYWNrIGluc2VydGVyIGZvciBSZXBlYXRlZEZpZWxkIG9iamVjdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3IgeworIHB1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6Om91dHB1dF9pdGVyYXRvcl90YWc7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworICB1c2luZyBwb2ludGVyID0gdm9pZDsKKyAgdXNpbmcgcmVmZXJlbmNlID0gdm9pZDsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisKKyAgZXhwbGljaXQgUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcigKKyAgICAgIFJlcGVhdGVkRmllbGQ8VD4qIGNvbnN0IG11dGFibGVfZmllbGQpCisgICAgICA6IGZpZWxkXyhtdXRhYmxlX2ZpZWxkKSB7fQorICBSZXBlYXRlZEZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcj0oY29uc3QgVCYgdmFsdWUpIHsKKyAgICBmaWVsZF8tPkFkZCh2YWx1ZSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CisgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQorICBSZXBlYXRlZEZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKGludCAvKiB1bnVzZWQgKi8pIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworIHByaXZhdGU6CisgIFJlcGVhdGVkRmllbGQ8VD4qIGZpZWxkXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBQcm92aWRlcyBhIGJhY2sgaW5zZXJ0IGl0ZXJhdG9yIGZvciBSZXBlYXRlZEZpZWxkIGluc3RhbmNlcywKKy8vIHNpbWlsYXIgdG8gc3RkOjpiYWNrX2luc2VydGVyKCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2ludGVybmFsOjpSZXBlYXRlZEZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+IFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIoCisgICAgUmVwZWF0ZWRGaWVsZDxUPiogY29uc3QgbXV0YWJsZV9maWVsZCkgeworICByZXR1cm4gaW50ZXJuYWw6OlJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4obXV0YWJsZV9maWVsZCk7Cit9CisKKy8vIEV4dGVybiBkZWNsYXJhdGlvbnMgb2YgY29tbW9uIGluc3RhbnRpYXRpb25zIHRvIHJlZHVjZSBsaWJyYXJ5IGJsb2F0LgorZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUNMQVJFIFJlcGVhdGVkRmllbGQ8Ym9vbD47CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgUFJPVE9CVUZfRVhQT1JUX1RFTVBMQVRFX0RFQ0xBUkUgUmVwZWF0ZWRGaWVsZDxpbnQzMl90PjsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBQUk9UT0JVRl9FWFBPUlRfVEVNUExBVEVfREVDTEFSRSBSZXBlYXRlZEZpZWxkPHVpbnQzMl90PjsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBQUk9UT0JVRl9FWFBPUlRfVEVNUExBVEVfREVDTEFSRSBSZXBlYXRlZEZpZWxkPGludDY0X3Q+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUNMQVJFIFJlcGVhdGVkRmllbGQ8dWludDY0X3Q+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUNMQVJFIFJlcGVhdGVkRmllbGQ8ZmxvYXQ+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUNMQVJFIFJlcGVhdGVkRmllbGQ8ZG91YmxlPjsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBQUk9UT0JVRl9FWFBPUlRfVEVNUExBVEVfREVDTEFSRSBSZXBlYXRlZEl0ZXJhdG9yPGJvb2w+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUNMQVJFCisgICAgUmVwZWF0ZWRJdGVyYXRvcjxpbnQzMl90PjsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBQUk9UT0JVRl9FWFBPUlRfVEVNUExBVEVfREVDTEFSRQorICAgIFJlcGVhdGVkSXRlcmF0b3I8dWludDMyX3Q+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUNMQVJFCisgICAgUmVwZWF0ZWRJdGVyYXRvcjxpbnQ2NF90PjsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBQUk9UT0JVRl9FWFBPUlRfVEVNUExBVEVfREVDTEFSRQorICAgIFJlcGVhdGVkSXRlcmF0b3I8dWludDY0X3Q+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUNMQVJFIFJlcGVhdGVkSXRlcmF0b3I8ZmxvYXQ+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUNMQVJFIFJlcGVhdGVkSXRlcmF0b3I8ZG91YmxlPjsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfUkVQRUFURURfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVlODIwMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDcwOSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogdGdzQGdvb2dsZS5jb20gKFRvbSBTenltYW5za2kpCisvLworLy8gVGVzdCByZWZsZWN0aW9uIG1ldGhvZHMgZm9yIGFnZ3JlZ2F0ZSBhY2Nlc3MgdG8gUmVwZWF0ZWRbUHRyXUZpZWxkcy4KKy8vIFRoaXMgdGVzdCBwcm90bzIgbWV0aG9kcyBvbiBhIHByb3RvMiBsYXlvdXQuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCit1c2luZyB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2U7Cit1c2luZyB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM7Cit1c2luZyB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOworCituYW1lc3BhY2UgeworCitzdGF0aWMgaW50IEZ1bmMoaW50IGksIGludCBqKSB7IHJldHVybiBpICogajsgfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgU3RyRnVuYyhpbnQgaSwgaW50IGopIHsgcmV0dXJuIFN0ckNhdChGdW5jKGksIDQpKTsgfQorCitURVNUKFJlcGVhdGVkRmllbGRSZWZsZWN0aW9uVGVzdCwgUmVndWxhckZpZWxkcykgeworICBUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbCA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfaW50MzIoRnVuYyhpLCAxKSk7CisgICAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKEZ1bmMoaSwgMikpOworICAgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZyhTdHJGdW5jKGksIDUpKTsKKyAgICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoRnVuYyhpLCA2KSk7CisgIH0KKworICAvLyBHZXQgRmllbGREZXNjcmlwdG9ycyBmb3IgYWxsIHRoZSBmaWVsZHMgb2YgaW50ZXJlc3QuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfcmVwZWF0ZWRfaW50MzIgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9pbnQzMiIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkX3JlcGVhdGVkX2RvdWJsZSA9CisgICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2RvdWJsZSIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkX3JlcGVhdGVkX3N0cmluZyA9CisgICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX3N0cmluZyIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSA9CisgICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpOworCisgIC8vIEdldCBSZXBlYXRlZEZpZWxkIG9iamVjdHMgZm9yIGFsbCBmaWVsZHMgb2YgaW50ZXJlc3QuCisgIGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50MzJfdD4mIHJmX2ludDMyID0KKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkRmllbGQ8aW50MzJfdD4obWVzc2FnZSwgZmRfcmVwZWF0ZWRfaW50MzIpOworICBjb25zdCBSZXBlYXRlZEZpZWxkPGRvdWJsZT4mIHJmX2RvdWJsZSA9CisgICAgICByZWZsLT5HZXRSZXBlYXRlZEZpZWxkPGRvdWJsZT4obWVzc2FnZSwgZmRfcmVwZWF0ZWRfZG91YmxlKTsKKworICAvLyBHZXQgbXV0YWJsZSBSZXBlYXRlZEZpZWxkIG9iamVjdHMgZm9yIGFsbCBmaWVsZHMgb2YgaW50ZXJlc3QuCisgIFJlcGVhdGVkRmllbGQ8aW50MzJfdD4qIG1yZl9pbnQzMiA9CisgICAgICByZWZsLT5NdXRhYmxlUmVwZWF0ZWRGaWVsZDxpbnQzMl90PigmbWVzc2FnZSwgZmRfcmVwZWF0ZWRfaW50MzIpOworICBSZXBlYXRlZEZpZWxkPGRvdWJsZT4qIG1yZl9kb3VibGUgPQorICAgICAgcmVmbC0+TXV0YWJsZVJlcGVhdGVkRmllbGQ8ZG91YmxlPigmbWVzc2FnZSwgZmRfcmVwZWF0ZWRfZG91YmxlKTsKKworICAvLyBHZXQgUmVwZWF0ZWRQdHJGaWVsZCBvYmplY3RzIGZvciBhbGwgZmllbGRzIG9mIGludGVyZXN0LgorICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiYgcnBmX3N0cmluZyA9CisgICAgICByZWZsLT5HZXRSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPihtZXNzYWdlLCBmZF9yZXBlYXRlZF9zdHJpbmcpOworICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPEZvcmVpZ25NZXNzYWdlPiYgcnBmX2ZvcmVpZ25fbWVzc2FnZSA9CisgICAgICByZWZsLT5HZXRSZXBlYXRlZFB0ckZpZWxkPEZvcmVpZ25NZXNzYWdlPihtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKTsKKyAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiYgcnBmX21lc3NhZ2UgPQorICAgICAgcmVmbC0+R2V0UmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPihtZXNzYWdlLCBmZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UpOworCisgIC8vIEdldCBtdXRhYmxlIFJlcGVhdGVkUHRyRmllbGQgb2JqZWN0cyBmb3IgYWxsIGZpZWxkcyBvZiBpbnRlcmVzdC4KKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4qIG1ycGZfc3RyaW5nID0KKyAgICAgIHJlZmwtPk11dGFibGVSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPigmbWVzc2FnZSwgZmRfcmVwZWF0ZWRfc3RyaW5nKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxGb3JlaWduTWVzc2FnZT4qIG1ycGZfZm9yZWlnbl9tZXNzYWdlID0KKyAgICAgIHJlZmwtPk11dGFibGVSZXBlYXRlZFB0ckZpZWxkPEZvcmVpZ25NZXNzYWdlPigKKyAgICAgICAgICAmbWVzc2FnZSwgZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiogbXJwZl9tZXNzYWdlID0KKyAgICAgIHJlZmwtPk11dGFibGVSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KCZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKTsKKworICAvLyBNYWtlIHN1cmUgd2UgY2FuIGRvIGdldHMgYW5kIHNldHMgdGhyb3VnaCB0aGUgUmVwZWF0ZWRbUHRyXUZpZWxkIG9iamVjdHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIC8vIENoZWNrIGdldHMgdGhyb3VnaCBjb25zdCBvYmplY3RzLgorICAgIEVYUEVDVF9FUShyZl9pbnQzMi5HZXQoaSksIEZ1bmMoaSwgMSkpOworICAgIEVYUEVDVF9FUShyZl9kb3VibGUuR2V0KGkpLCBGdW5jKGksIDIpKTsKKyAgICBFWFBFQ1RfRVEocnBmX3N0cmluZy5HZXQoaSksIFN0ckZ1bmMoaSwgNSkpOworICAgIEVYUEVDVF9FUShycGZfZm9yZWlnbl9tZXNzYWdlLkdldChpKS5jKCksIEZ1bmMoaSwgNikpOworICAgIEVYUEVDVF9FUShkb3duX2Nhc3Q8Y29uc3QgRm9yZWlnbk1lc3NhZ2UqPigmcnBmX21lc3NhZ2UuR2V0KGkpKS0+YygpLAorICAgICAgICAgICAgICBGdW5jKGksIDYpKTsKKworICAgIC8vIENoZWNrIGdldHMgdGhyb3VnaCBtdXRhYmxlIG9iamVjdHMuCisgICAgRVhQRUNUX0VRKG1yZl9pbnQzMi0+R2V0KGkpLCBGdW5jKGksIDEpKTsKKyAgICBFWFBFQ1RfRVEobXJmX2RvdWJsZS0+R2V0KGkpLCBGdW5jKGksIDIpKTsKKyAgICBFWFBFQ1RfRVEobXJwZl9zdHJpbmctPkdldChpKSwgU3RyRnVuYyhpLCA1KSk7CisgICAgRVhQRUNUX0VRKG1ycGZfZm9yZWlnbl9tZXNzYWdlLT5HZXQoaSkuYygpLCBGdW5jKGksIDYpKTsKKyAgICBFWFBFQ1RfRVEoZG93bl9jYXN0PGNvbnN0IEZvcmVpZ25NZXNzYWdlKj4oJm1ycGZfbWVzc2FnZS0+R2V0KGkpKS0+YygpLAorICAgICAgICAgICAgICBGdW5jKGksIDYpKTsKKworICAgIC8vIENoZWNrIHNldHMgdGhyb3VnaCBtdXRhYmxlIG9iamVjdHMuCisgICAgbXJmX2ludDMyLT5TZXQoaSwgRnVuYyhpLCAtMSkpOworICAgIG1yZl9kb3VibGUtPlNldChpLCBGdW5jKGksIC0yKSk7CisgICAgbXJwZl9zdHJpbmctPk11dGFibGUoaSktPmFzc2lnbihTdHJGdW5jKGksIC01KSk7CisgICAgbXJwZl9mb3JlaWduX21lc3NhZ2UtPk11dGFibGUoaSktPnNldF9jKEZ1bmMoaSwgLTYpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9pbnQzMihpKSwgRnVuYyhpLCAtMSkpOworICAgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZShpKSwgRnVuYyhpLCAtMikpOworICAgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyhpKSwgU3RyRnVuYyhpLCAtNSkpOworICAgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZShpKS5jKCksIEZ1bmMoaSwgLTYpKTsKKyAgICBkb3duX2Nhc3Q8Rm9yZWlnbk1lc3NhZ2UqPihtcnBmX21lc3NhZ2UtPk11dGFibGUoaSkpLT5zZXRfYyhGdW5jKGksIDcpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoaSkuYygpLCBGdW5jKGksIDcpKTsKKyAgfQorCisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKyAgLy8gTWFrZSBzdXJlIHR5cGVzIGFyZSBjaGVja2VkIGNvcnJlY3RseSBhdCBydW50aW1lLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkX29wdGlvbmFsX2ludDMyID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50MzIiKTsKKyAgRVhQRUNUX0RFQVRIKHJlZmwtPkdldFJlcGVhdGVkRmllbGQ8aW50MzJfdD4obWVzc2FnZSwgZmRfb3B0aW9uYWxfaW50MzIpLAorICAgICAgICAgICAgICAgInJlcXVpcmVzIGEgcmVwZWF0ZWQgZmllbGQiKTsKKyAgRVhQRUNUX0RFQVRIKHJlZmwtPkdldFJlcGVhdGVkRmllbGQ8ZG91YmxlPihtZXNzYWdlLCBmZF9yZXBlYXRlZF9pbnQzMiksCisgICAgICAgICAgICAgICAibm90IHRoZSByaWdodCB0eXBlIik7CisgIEVYUEVDVF9ERUFUSChyZWZsLT5HZXRSZXBlYXRlZFB0ckZpZWxkPFRlc3RBbGxUeXBlcz4oCisgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKSwKKyAgICAgICAgICAgICAgICJ3cm9uZyBzdWJtZXNzYWdlIHR5cGUiKTsKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKK30KKworCitURVNUKFJlcGVhdGVkRmllbGRSZWZsZWN0aW9uVGVzdCwgRXh0ZW5zaW9uRmllbGRzKSB7CisgIFRlc3RBbGxFeHRlbnNpb25zIGV4dGVuZGVkX21lc3NhZ2U7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmwgPSBleHRlbmRlZF9tZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzYyA9IGV4dGVuZGVkX21lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIGV4dGVuZGVkX21lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuYyhpLCAxKSk7CisgIH0KKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkX3JlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiA9CisgICAgICBkZXNjLT5maWxlKCktPkZpbmRFeHRlbnNpb25CeU5hbWUoInJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiIpOworICBHT09HTEVfQ0hFQ0soZmRfcmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uICE9IG51bGxwdHIpOworCisgIGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50NjRfdD4mIHJmX2ludDY0X2V4dGVuc2lvbiA9CisgICAgICByZWZsLT5HZXRSZXBlYXRlZEZpZWxkPGludDY0X3Q+KGV4dGVuZGVkX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX3JlcGVhdGVkX2ludDY0X2V4dGVuc2lvbik7CisKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ2NF90PiogbXJmX2ludDY0X2V4dGVuc2lvbiA9CisgICAgICByZWZsLT5NdXRhYmxlUmVwZWF0ZWRGaWVsZDxpbnQ2NF90PigmZXh0ZW5kZWRfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX3JlcGVhdGVkX2ludDY0X2V4dGVuc2lvbik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgMSksIHJmX2ludDY0X2V4dGVuc2lvbi5HZXQoaSkpOworICAgIG1yZl9pbnQ2NF9leHRlbnNpb24tPlNldChpLCBGdW5jKGksIC0xKSk7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgLTEpLCBleHRlbmRlZF9tZXNzYWdlLkdldEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uLCBpKSk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFJlZiwgdHlwZW5hbWUgTWVzc2FnZVR5cGUsIHR5cGVuYW1lIFZhbHVlVHlwZT4KK3ZvaWQgVGVzdFJlcGVhdGVkRmllbGRSZWZJdGVyYXRvckZvclByaW1pdGl2ZSgKKyAgICBjb25zdCBSZWYmIGhhbmRsZSwgY29uc3QgTWVzc2FnZVR5cGUmIG1lc3NhZ2UsCisgICAgVmFsdWVUeXBlIChNZXNzYWdlVHlwZTo6KkdldEZ1bmMpKGludCkgY29uc3QpIHsKKyAgaW50IGluZGV4ID0gMDsKKyAgZm9yICh0eXBlbmFtZSBSZWY6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaGFuZGxlLmJlZ2luKCk7IGl0ICE9IGhhbmRsZS5lbmQoKTsKKyAgICAgICArK2l0KSB7CisgICAgRVhQRUNUX0VRKChtZXNzYWdlLipHZXRGdW5jKShpbmRleCksICppdCk7CisgICAgKytpbmRleDsKKyAgfQorICBFWFBFQ1RfRVEoaGFuZGxlLnNpemUoKSwgaW5kZXgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWVzc2FnZVR5cGUsIHR5cGVuYW1lIFZhbHVlVHlwZT4KK3ZvaWQgVGVzdFJlcGVhdGVkRmllbGRSZWZJdGVyYXRvckZvclN0cmluZygKKyAgICBjb25zdCBSZXBlYXRlZEZpZWxkUmVmPHN0ZDo6c3RyaW5nPiYgaGFuZGxlLCBjb25zdCBNZXNzYWdlVHlwZSYgbWVzc2FnZSwKKyAgICBWYWx1ZVR5cGUgKE1lc3NhZ2VUeXBlOjoqR2V0RnVuYykoaW50KSBjb25zdCkgeworICBpbnQgaW5kZXggPSAwOworICBmb3IgKHR5cGVuYW1lIFJlcGVhdGVkRmllbGRSZWY8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgIGhhbmRsZS5iZWdpbigpOworICAgICAgIGl0ICE9IGhhbmRsZS5lbmQoKTsgKytpdCkgeworICAgIC8vIFRlc3QgYm90aCBvcGVyYXRvciogYW5kIG9wZXJhdG9yLT4KKyAgICBFWFBFQ1RfRVEoKG1lc3NhZ2UuKkdldEZ1bmMpKGluZGV4KSwgKml0KTsKKyAgICBFWFBFQ1RfRVEoKG1lc3NhZ2UuKkdldEZ1bmMpKGluZGV4KS5zaXplKCksIGl0LT5zaXplKCkpOworICAgICsraW5kZXg7CisgIH0KKyAgRVhQRUNUX0VRKGhhbmRsZS5zaXplKCksIGluZGV4KTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkUmVmbGVjdGlvblRlc3QsIFJlcGVhdGVkRmllbGRSZWZGb3JSZWd1bGFyRmllbGRzKSB7CisgIFRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9pbnQzMihGdW5jKGksIDEpKTsKKyAgICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoRnVuYyhpLCAyKSk7CisgICAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfc3RyaW5nKFN0ckZ1bmMoaSwgNSkpOworICAgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgpLT5zZXRfYyhGdW5jKGksIDYpKTsKKyAgfQorCisgIC8vIEdldCBGaWVsZERlc2NyaXB0b3JzIGZvciBhbGwgdGhlIGZpZWxkcyBvZiBpbnRlcmVzdC4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9yZXBlYXRlZF9pbnQzMiA9CisgICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ludDMyIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfcmVwZWF0ZWRfZG91YmxlID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfZG91YmxlIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfcmVwZWF0ZWRfc3RyaW5nID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfc3RyaW5nIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIik7CisKKyAgLy8gR2V0IFJlcGVhdGVkRmllbGRSZWYgb2JqZWN0cyBmb3IgYWxsIGZpZWxkcyBvZiBpbnRlcmVzdC4KKyAgY29uc3QgUmVwZWF0ZWRGaWVsZFJlZjxpbnQzMl90PiByZl9pbnQzMiA9CisgICAgICByZWZsLT5HZXRSZXBlYXRlZEZpZWxkUmVmPGludDMyX3Q+KG1lc3NhZ2UsIGZkX3JlcGVhdGVkX2ludDMyKTsKKyAgY29uc3QgUmVwZWF0ZWRGaWVsZFJlZjxkb3VibGU+IHJmX2RvdWJsZSA9CisgICAgICByZWZsLT5HZXRSZXBlYXRlZEZpZWxkUmVmPGRvdWJsZT4obWVzc2FnZSwgZmRfcmVwZWF0ZWRfZG91YmxlKTsKKyAgY29uc3QgUmVwZWF0ZWRGaWVsZFJlZjxzdGQ6OnN0cmluZz4gcmZfc3RyaW5nID0KKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkRmllbGRSZWY8c3RkOjpzdHJpbmc+KG1lc3NhZ2UsIGZkX3JlcGVhdGVkX3N0cmluZyk7CisgIGNvbnN0IFJlcGVhdGVkRmllbGRSZWY8Rm9yZWlnbk1lc3NhZ2U+IHJmX2ZvcmVpZ25fbWVzc2FnZSA9CisgICAgICByZWZsLT5HZXRSZXBlYXRlZEZpZWxkUmVmPEZvcmVpZ25NZXNzYWdlPihtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKTsKKyAgY29uc3QgUmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPiByZl9tZXNzYWdlID0KKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkRmllbGRSZWY8TWVzc2FnZT4obWVzc2FnZSwgZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKTsKKworICAvLyBHZXQgTXV0YWJsZVJlcGVhdGVkRmllbGRSZWYgb2JqZWN0cyBmb3IgYWxsIGZpZWxkcyBvZiBpbnRlcmVzdC4KKyAgY29uc3QgTXV0YWJsZVJlcGVhdGVkRmllbGRSZWY8aW50MzJfdD4gbXJmX2ludDMyID0KKyAgICAgIHJlZmwtPkdldE11dGFibGVSZXBlYXRlZEZpZWxkUmVmPGludDMyX3Q+KCZtZXNzYWdlLCBmZF9yZXBlYXRlZF9pbnQzMik7CisgIGNvbnN0IE11dGFibGVSZXBlYXRlZEZpZWxkUmVmPGRvdWJsZT4gbXJmX2RvdWJsZSA9CisgICAgICByZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxkb3VibGU+KCZtZXNzYWdlLCBmZF9yZXBlYXRlZF9kb3VibGUpOworICBjb25zdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxzdGQ6OnN0cmluZz4gbXJmX3N0cmluZyA9CisgICAgICByZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxzdGQ6OnN0cmluZz4oJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfcmVwZWF0ZWRfc3RyaW5nKTsKKyAgY29uc3QgTXV0YWJsZVJlcGVhdGVkRmllbGRSZWY8Rm9yZWlnbk1lc3NhZ2U+IG1yZl9mb3JlaWduX21lc3NhZ2UgPQorICAgICAgcmVmbC0+R2V0TXV0YWJsZVJlcGVhdGVkRmllbGRSZWY8Rm9yZWlnbk1lc3NhZ2U+KAorICAgICAgICAgICZtZXNzYWdlLCBmZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UpOworICBjb25zdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPiBtcmZfbWVzc2FnZSA9CisgICAgICByZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxNZXNzYWdlPigmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSk7CisKKyAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJfc2l6ZSgpLCByZl9pbnQzMi5zaXplKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9pbnQzMl9zaXplKCksIG1yZl9pbnQzMi5zaXplKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9kb3VibGVfc2l6ZSgpLCByZl9kb3VibGUuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlX3NpemUoKSwgbXJmX2RvdWJsZS5zaXplKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfc2l6ZSgpLCByZl9zdHJpbmcuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3NpemUoKSwgbXJmX3N0cmluZy5zaXplKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpLCByZl9mb3JlaWduX21lc3NhZ2Uuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSwKKyAgICAgICAgICAgIG1yZl9mb3JlaWduX21lc3NhZ2Uuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSwgcmZfbWVzc2FnZS5zaXplKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpLCBtcmZfbWVzc2FnZS5zaXplKCkpOworCisgIEVYUEVDVF9GQUxTRShyZl9pbnQzMi5lbXB0eSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1yZl9pbnQzMi5lbXB0eSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHJmX2RvdWJsZS5lbXB0eSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1yZl9kb3VibGUuZW1wdHkoKSk7CisgIEVYUEVDVF9GQUxTRShyZl9zdHJpbmcuZW1wdHkoKSk7CisgIEVYUEVDVF9GQUxTRShtcmZfc3RyaW5nLmVtcHR5KCkpOworICBFWFBFQ1RfRkFMU0UocmZfZm9yZWlnbl9tZXNzYWdlLmVtcHR5KCkpOworICBFWFBFQ1RfRkFMU0UobXJmX2ZvcmVpZ25fbWVzc2FnZS5lbXB0eSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHJmX21lc3NhZ2UuZW1wdHkoKSk7CisgIEVYUEVDVF9GQUxTRShtcmZfbWVzc2FnZS5lbXB0eSgpKTsKKworICAvLyBNYWtlIHN1cmUgd2UgY2FuIGRvIGdldHMgYW5kIHNldHMgdGhyb3VnaCB0aGUgUmVwZWF0ZWRGaWVsZFJlZiBvYmplY3RzLgorICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAvLyBDaGVjayBnZXRzIHRocm91Z2ggY29uc3Qgb2JqZWN0cy4KKyAgICBFWFBFQ1RfRVEocmZfaW50MzIuR2V0KGkpLCBGdW5jKGksIDEpKTsKKyAgICBFWFBFQ1RfRVEocmZfZG91YmxlLkdldChpKSwgRnVuYyhpLCAyKSk7CisgICAgRVhQRUNUX0VRKHJmX3N0cmluZy5HZXQoaSksIFN0ckZ1bmMoaSwgNSkpOworICAgIEZvcmVpZ25NZXNzYWdlIHNjcmF0Y2hfc3BhY2U7CisgICAgRVhQRUNUX0VRKHJmX2ZvcmVpZ25fbWVzc2FnZS5HZXQoaSwgJnNjcmF0Y2hfc3BhY2UpLmMoKSwgRnVuYyhpLCA2KSk7CisgICAgRVhQRUNUX0VRKAorICAgICAgICBkb3duX2Nhc3Q8Y29uc3QgRm9yZWlnbk1lc3NhZ2UmPihyZl9tZXNzYWdlLkdldChpLCAmc2NyYXRjaF9zcGFjZSkpLmMoKSwKKyAgICAgICAgRnVuYyhpLCA2KSk7CisKKyAgICAvLyBDaGVjayBnZXRzIHRocm91Z2ggbXV0YWJsZSBvYmplY3RzLgorICAgIEVYUEVDVF9FUShtcmZfaW50MzIuR2V0KGkpLCBGdW5jKGksIDEpKTsKKyAgICBFWFBFQ1RfRVEobXJmX2RvdWJsZS5HZXQoaSksIEZ1bmMoaSwgMikpOworICAgIEVYUEVDVF9FUShtcmZfc3RyaW5nLkdldChpKSwgU3RyRnVuYyhpLCA1KSk7CisgICAgRVhQRUNUX0VRKG1yZl9mb3JlaWduX21lc3NhZ2UuR2V0KGksICZzY3JhdGNoX3NwYWNlKS5jKCksIEZ1bmMoaSwgNikpOworICAgIEVYUEVDVF9FUSgKKyAgICAgICAgZG93bl9jYXN0PGNvbnN0IEZvcmVpZ25NZXNzYWdlJj4obXJmX21lc3NhZ2UuR2V0KGksICZzY3JhdGNoX3NwYWNlKSkKKyAgICAgICAgICAgIC5jKCksCisgICAgICAgIEZ1bmMoaSwgNikpOworCisgICAgLy8gQ2hlY2sgc2V0cyB0aHJvdWdoIG11dGFibGUgb2JqZWN0cy4KKyAgICBtcmZfaW50MzIuU2V0KGksIEZ1bmMoaSwgLTEpKTsKKyAgICBtcmZfZG91YmxlLlNldChpLCBGdW5jKGksIC0yKSk7CisgICAgbXJmX3N0cmluZy5TZXQoaSwgU3RyRnVuYyhpLCAtNSkpOworICAgIEZvcmVpZ25NZXNzYWdlIGZvcmVpZ25fbWVzc2FnZTsKKyAgICBmb3JlaWduX21lc3NhZ2Uuc2V0X2MoRnVuYyhpLCAtNikpOworICAgIG1yZl9mb3JlaWduX21lc3NhZ2UuU2V0KGksIGZvcmVpZ25fbWVzc2FnZSk7CisgICAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIoaSksIEZ1bmMoaSwgLTEpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoaSksIEZ1bmMoaSwgLTIpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcoaSksIFN0ckZ1bmMoaSwgLTUpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoaSkuYygpLCBGdW5jKGksIC02KSk7CisgICAgZm9yZWlnbl9tZXNzYWdlLnNldF9jKEZ1bmMoaSwgNykpOworICAgIG1yZl9tZXNzYWdlLlNldChpLCBmb3JlaWduX21lc3NhZ2UpOworICAgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZShpKS5jKCksIEZ1bmMoaSwgNykpOworICB9CisKKyAgLy8gVGVzdCBpdGVyYXRvcnMuCisgIFRlc3RSZXBlYXRlZEZpZWxkUmVmSXRlcmF0b3JGb3JQcmltaXRpdmUocmZfaW50MzIsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRlc3RBbGxUeXBlczo6cmVwZWF0ZWRfaW50MzIpOworICBUZXN0UmVwZWF0ZWRGaWVsZFJlZkl0ZXJhdG9yRm9yUHJpbWl0aXZlKHJmX2RvdWJsZSwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmVGVzdEFsbFR5cGVzOjpyZXBlYXRlZF9kb3VibGUpOworICBUZXN0UmVwZWF0ZWRGaWVsZFJlZkl0ZXJhdG9yRm9yU3RyaW5nKHJmX3N0cmluZywgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmVGVzdEFsbFR5cGVzOjpyZXBlYXRlZF9zdHJpbmcpOworCisgIC8vIFRlc3QgaXRlcmF0b3JzIGZvciBtZXNzYWdlIGZpZWxkcy4KKyAgdHlwZWRlZiBSZXBlYXRlZEZpZWxkUmVmPEZvcmVpZ25NZXNzYWdlPjo6aXRlcmF0b3IgTWVzc2FnZUl0ZXJhdG9yOworICBpbnQgaW5kZXggPSAwOworICBmb3IgKE1lc3NhZ2VJdGVyYXRvciBpdCA9IHJmX2ZvcmVpZ25fbWVzc2FnZS5iZWdpbigpOworICAgICAgIGl0ICE9IHJmX2ZvcmVpZ25fbWVzc2FnZS5lbmQoKTsgKytpdCkgeworICAgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZShpbmRleCkuYygpLCBpdC0+YygpKTsKKyAgICArK2luZGV4OworICB9CisgIEVYUEVDVF9FUSgxMCwgaW5kZXgpOworCisgIC8vIFRlc3QgaXRlcmF0b3Igb3BlcmF0b3JzIHRoYXQgYXJlIG5vdCB1c3VhbGx5IHVzZWQgaW4gcmVndWxhciBmb3ItbG9vcHMuCisgIC8vIEluY2x1ZGluZzogcG9zdCBpbmNyZW1lbnQsIGFzc2lnbiwgPT0uCisgIE1lc3NhZ2VJdGVyYXRvciBvbGRfaXQgPSByZl9mb3JlaWduX21lc3NhZ2UuYmVnaW4oKTsKKyAgTWVzc2FnZUl0ZXJhdG9yIG5ld19pdCA9IG9sZF9pdCsrOworICBFWFBFQ1RfRkFMU0Uob2xkX2l0ID09IG5ld19pdCk7CisgIC8vIENoZWNrIHRoYXQgb2xkX2l0KysgaW5jcmVtZW50cyBvbGRfaXQgb25jZS4KKyAgZm9yIChpbmRleCA9IDE7IG9sZF9pdCAhPSByZl9mb3JlaWduX21lc3NhZ2UuZW5kKCk7ICsrb2xkX2l0LCArK2luZGV4KSB7CisgICAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKGluZGV4KS5jKCksIG9sZF9pdC0+YygpKTsKKyAgfQorICBFWFBFQ1RfRVEoMTAsIGluZGV4KTsKKyAgLy8gVGVzdCBhc3NpZ24gb3BlcmF0b3IuCisgIG9sZF9pdCA9IG5ld19pdDsKKyAgZm9yIChpbmRleCA9IDA7IG9sZF9pdCAhPSByZl9mb3JlaWduX21lc3NhZ2UuZW5kKCk7ICsrb2xkX2l0LCArK2luZGV4KSB7CisgICAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKGluZGV4KS5jKCksIG9sZF9pdC0+YygpKTsKKyAgfQorICBFWFBFQ1RfRVEoMTAsIGluZGV4KTsKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgcmV0dXJuZWQgdmFsdWUgb2Ygb2xkX2l0KysgaXMgdGhlIG9uZSBiZWZvcmUgaW5jcmVtZW50LgorICBmb3IgKGluZGV4ID0gMDsgbmV3X2l0ICE9IHJmX2ZvcmVpZ25fbWVzc2FnZS5lbmQoKTsgKytuZXdfaXQsICsraW5kZXgpIHsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoaW5kZXgpLmMoKSwgbmV3X2l0LT5jKCkpOworICB9CisgIEVYUEVDVF9FUSgxMCwgaW5kZXgpOworCisgIC8vIFRlc3QgTXV0YWJsZVJlcGVhdGVkRmllbGRSZWY6OkFkZCgpCisgIG1yZl9pbnQzMi5BZGQoMTIzNCk7CisgIG1yZl9kb3VibGUuQWRkKDEyMzQuMCk7CisgIG1yZl9zdHJpbmcuQWRkKCIxMjM0Iik7CisgIEZvcmVpZ25NZXNzYWdlIGZvcmVpZ25fbWVzc2FnZTsKKyAgZm9yZWlnbl9tZXNzYWdlLnNldF9jKDEyMzQpOworICBtcmZfZm9yZWlnbl9tZXNzYWdlLkFkZChmb3JlaWduX21lc3NhZ2UpOworICBFWFBFQ1RfRVEoMTIzNCwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMigxMCkpOworICBFWFBFQ1RfRVEoMTIzNC4wLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgxMCkpOworICBFWFBFQ1RfRVEoIjEyMzQiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZygxMCkpOworICBFWFBFQ1RfRVEoMTIzNCwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMTApLmMoKSk7CisKKyAgLy8gVGVzdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjo6UmVtb3ZlTGFzdCgpCisgIG1yZl9pbnQzMi5SZW1vdmVMYXN0KCk7CisgIG1yZl9kb3VibGUuUmVtb3ZlTGFzdCgpOworICBtcmZfc3RyaW5nLlJlbW92ZUxhc3QoKTsKKyAgbXJmX2ZvcmVpZ25fbWVzc2FnZS5SZW1vdmVMYXN0KCk7CisgIEVYUEVDVF9FUSgxMCwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMTAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgxMCwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEwLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOworCisgIC8vIFRlc3QgTXV0YWJsZVJlcGVhdGVkRmllbGRSZWY6OlN3YXBFbGVtZW50cygpCisgIG1yZl9pbnQzMi5Td2FwRWxlbWVudHMoMCwgOSk7CisgIG1yZl9kb3VibGUuU3dhcEVsZW1lbnRzKDAsIDkpOworICBtcmZfc3RyaW5nLlN3YXBFbGVtZW50cygwLCA5KTsKKyAgbXJmX2ZvcmVpZ25fbWVzc2FnZS5Td2FwRWxlbWVudHMoMCwgOSk7CisgIEVYUEVDVF9FUShGdW5jKDksIC0xKSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMigwKSk7CisgIEVYUEVDVF9FUShGdW5jKDAsIC0xKSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMig5KSk7CisgIEVYUEVDVF9FUShGdW5jKDksIC0yKSwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMCkpOworICBFWFBFQ1RfRVEoRnVuYygwLCAtMiksIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDkpKTsKKyAgRVhQRUNUX0VRKFN0ckZ1bmMoOSwgLTUpLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZygwKSk7CisgIEVYUEVDVF9FUShTdHJGdW5jKDAsIC01KSwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcoOSkpOworICBFWFBFQ1RfRVEoRnVuYyg5LCA3KSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKKyAgRVhQRUNUX0VRKEZ1bmMoMCwgNyksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDkpLmMoKSk7CisKKyAgLy8gVGVzdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjo6Q2xlYXIoKQorICBtcmZfaW50MzIuQ2xlYXIoKTsKKyAgbXJmX2RvdWJsZS5DbGVhcigpOworICBtcmZfc3RyaW5nLkNsZWFyKCk7CisgIG1yZl9mb3JlaWduX21lc3NhZ2UuQ2xlYXIoKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKworICAvLyBUZXN0IChNdXRhYmxlKVJlcGVhdGVkRmllbGRSZWY6OmVtcHR5KCkKKyAgRVhQRUNUX1RSVUUocmZfaW50MzIuZW1wdHkoKSk7CisgIEVYUEVDVF9UUlVFKG1yZl9pbnQzMi5lbXB0eSgpKTsKKyAgRVhQRUNUX1RSVUUocmZfZG91YmxlLmVtcHR5KCkpOworICBFWFBFQ1RfVFJVRShtcmZfZG91YmxlLmVtcHR5KCkpOworICBFWFBFQ1RfVFJVRShyZl9zdHJpbmcuZW1wdHkoKSk7CisgIEVYUEVDVF9UUlVFKG1yZl9zdHJpbmcuZW1wdHkoKSk7CisgIEVYUEVDVF9UUlVFKHJmX2ZvcmVpZ25fbWVzc2FnZS5lbXB0eSgpKTsKKyAgRVhQRUNUX1RSVUUobXJmX2ZvcmVpZ25fbWVzc2FnZS5lbXB0eSgpKTsKKyAgRVhQRUNUX1RSVUUocmZfbWVzc2FnZS5lbXB0eSgpKTsKKyAgRVhQRUNUX1RSVUUobXJmX21lc3NhZ2UuZW1wdHkoKSk7CisKKyNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorCisgIC8vIE1ha2Ugc3VyZSB0eXBlcyBhcmUgY2hlY2tlZCBjb3JyZWN0bHkgYXQgcnVudGltZS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9vcHRpb25hbF9pbnQzMiA9CisgICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIik7CisgIEVYUEVDVF9ERUFUSChyZWZsLT5HZXRSZXBlYXRlZEZpZWxkUmVmPGludDMyX3Q+KG1lc3NhZ2UsIGZkX29wdGlvbmFsX2ludDMyKSwKKyAgICAgICAgICAgICAgICIiKTsKKyAgRVhQRUNUX0RFQVRIKHJlZmwtPkdldFJlcGVhdGVkRmllbGRSZWY8ZG91YmxlPihtZXNzYWdlLCBmZF9yZXBlYXRlZF9pbnQzMiksCisgICAgICAgICAgICAgICAiIik7CisgIEVYUEVDVF9ERUFUSChyZWZsLT5HZXRSZXBlYXRlZEZpZWxkUmVmPFRlc3RBbGxUeXBlcz4oCisgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKSwKKyAgICAgICAgICAgICAgICIiKTsKKworI2VuZGlmICAvLyBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorfQorCitURVNUKFJlcGVhdGVkRmllbGRSZWZsZWN0aW9uVGVzdCwgUmVwZWF0ZWRGaWVsZFJlZkZvckVudW1zKSB7CisgIFRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bShUZXN0QWxsVHlwZXM6OkJBUik7CisgIH0KKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkX3JlcGVhdGVkX25lc3RlZF9lbnVtID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfbmVzdGVkX2VudW0iKTsKKyAgY29uc3QgUmVwZWF0ZWRGaWVsZFJlZjxUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW0+IGVudW1fcmVmID0KKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkRmllbGRSZWY8VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtPigKKyAgICAgICAgICBtZXNzYWdlLCBmZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSk7CisgIGNvbnN0IE11dGFibGVSZXBlYXRlZEZpZWxkUmVmPFRlc3RBbGxUeXBlczo6TmVzdGVkRW51bT4gbXV0YWJsZV9lbnVtX3JlZiA9CisgICAgICByZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW0+KAorICAgICAgICAgICZtZXNzYWdlLCBmZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSk7CisgIGNvbnN0IFJlcGVhdGVkRmllbGRSZWY8aW50MzJfdD4gaW50MzJfcmVmID0KKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkRmllbGRSZWY8aW50MzJfdD4obWVzc2FnZSwgZmRfcmVwZWF0ZWRfbmVzdGVkX2VudW0pOworICBjb25zdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxpbnQzMl90PiBtdXRhYmxlX2ludDMyX3JlZiA9CisgICAgICByZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxpbnQzMl90PigmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX3JlcGVhdGVkX25lc3RlZF9lbnVtKTsKKworICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCksIGVudW1fcmVmLnNpemUoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSwgbXV0YWJsZV9lbnVtX3JlZi5zaXplKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCksIGludDMyX3JlZi5zaXplKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCksIG11dGFibGVfaW50MzJfcmVmLnNpemUoKSk7CisKKyAgRVhQRUNUX0ZBTFNFKGVudW1fcmVmLmVtcHR5KCkpOworICBFWFBFQ1RfRkFMU0UobXV0YWJsZV9lbnVtX3JlZi5lbXB0eSgpKTsKKyAgRVhQRUNUX0ZBTFNFKGludDMyX3JlZi5lbXB0eSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG11dGFibGVfaW50MzJfcmVmLmVtcHR5KCkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIEVYUEVDVF9FUShUZXN0QWxsVHlwZXM6OkJBUiwgZW51bV9yZWYuR2V0KGkpKTsKKyAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVIsIG11dGFibGVfZW51bV9yZWYuR2V0KGkpKTsKKyAgICBtdXRhYmxlX2VudW1fcmVmLlNldChpLCBUZXN0QWxsVHlwZXM6OkJBWik7CisgICAgRVhQRUNUX0VRKFRlc3RBbGxUeXBlczo6QkFaLCBlbnVtX3JlZi5HZXQoaSkpOworICAgIEVYUEVDVF9FUShUZXN0QWxsVHlwZXM6OkJBWiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bShpKSk7CisKKyAgICBtZXNzYWdlLnNldF9yZXBlYXRlZF9uZXN0ZWRfZW51bShpLCBUZXN0QWxsVHlwZXM6OkJBUik7CisgICAgRVhQRUNUX0VRKFRlc3RBbGxUeXBlczo6QkFSLCBpbnQzMl9yZWYuR2V0KGkpKTsKKyAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVIsIG11dGFibGVfaW50MzJfcmVmLkdldChpKSk7CisgICAgbXV0YWJsZV9pbnQzMl9yZWYuU2V0KGksIFRlc3RBbGxUeXBlczo6QkFaKTsKKyAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVosIGludDMyX3JlZi5HZXQoaSkpOworICAgIEVYUEVDVF9FUShUZXN0QWxsVHlwZXM6OkJBWiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bShpKSk7CisgIH0KKworICBUZXN0UmVwZWF0ZWRGaWVsZFJlZkl0ZXJhdG9yRm9yUHJpbWl0aXZlKGVudW1fcmVmLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZUZXN0QWxsVHlwZXM6OnJlcGVhdGVkX25lc3RlZF9lbnVtKTsKKyAgVGVzdFJlcGVhdGVkRmllbGRSZWZJdGVyYXRvckZvclByaW1pdGl2ZShpbnQzMl9yZWYsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRlc3RBbGxUeXBlczo6cmVwZWF0ZWRfbmVzdGVkX2VudW0pOworCisgIC8vIFRlc3QgQWRkKCkKKyAgbXV0YWJsZV9lbnVtX3JlZi5BZGQoVGVzdEFsbFR5cGVzOjpGT08pOworICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpGT08sIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0oMTApKTsKKyAgbXV0YWJsZV9pbnQzMl9yZWYuQWRkKFRlc3RBbGxUeXBlczo6QkFSKTsKKyAgRVhQRUNUX0VRKFRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtKDExKSk7CisKKyAgLy8gVGVzdCBSZW1vdmVMYXN0KCkKKyAgbXV0YWJsZV9lbnVtX3JlZi5SZW1vdmVMYXN0KCk7CisgIEVYUEVDVF9FUSgxMSwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOworICBtdXRhYmxlX2ludDMyX3JlZi5SZW1vdmVMYXN0KCk7CisgIEVYUEVDVF9FUSgxMCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOworCisgIC8vIFRlc3QgU3dhcEVsZW1lbnRzKCkKKyAgbXV0YWJsZV9lbnVtX3JlZi5TZXQoMCwgVGVzdEFsbFR5cGVzOjpCQVIpOworICBtdXRhYmxlX2VudW1fcmVmLlNldCg5LCBUZXN0QWxsVHlwZXM6OkJBWik7CisgIG11dGFibGVfZW51bV9yZWYuU3dhcEVsZW1lbnRzKDAsIDkpOworICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVosIGVudW1fcmVmLkdldCgwKSk7CisgIEVYUEVDVF9FUShUZXN0QWxsVHlwZXM6OkJBUiwgZW51bV9yZWYuR2V0KDkpKTsKKyAgbXV0YWJsZV9pbnQzMl9yZWYuU3dhcEVsZW1lbnRzKDAsIDkpOworICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVIsIGVudW1fcmVmLkdldCgwKSk7CisgIEVYUEVDVF9FUShUZXN0QWxsVHlwZXM6OkJBWiwgZW51bV9yZWYuR2V0KDkpKTsKKworICAvLyBUZXN0IENsZWFyKCkKKyAgbXV0YWJsZV9lbnVtX3JlZi5DbGVhcigpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOworICBtdXRhYmxlX2VudW1fcmVmLkFkZChUZXN0QWxsVHlwZXM6OkZPTyk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSk7CisgIG11dGFibGVfaW50MzJfcmVmLkNsZWFyKCk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSk7CisKKyAgLy8gVGVzdCBlbXB0eSgpCisgIEVYUEVDVF9UUlVFKGVudW1fcmVmLmVtcHR5KCkpOworICBFWFBFQ1RfVFJVRShtdXRhYmxlX2VudW1fcmVmLmVtcHR5KCkpOworICBFWFBFQ1RfVFJVRShpbnQzMl9yZWYuZW1wdHkoKSk7CisgIEVYUEVDVF9UUlVFKG11dGFibGVfaW50MzJfcmVmLmVtcHR5KCkpOworfQorCitURVNUKFJlcGVhdGVkRmllbGRSZWZsZWN0aW9uVGVzdCwgUmVwZWF0ZWRGaWVsZFJlZkZvckV4dGVuc2lvbkZpZWxkcykgeworICBUZXN0QWxsRXh0ZW5zaW9ucyBleHRlbmRlZF9tZXNzYWdlOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsID0gZXh0ZW5kZWRfbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MgPSBleHRlbmRlZF9tZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBleHRlbmRlZF9tZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmMoaSwgMSkpOworICB9CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9yZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gPQorICAgICAgZGVzYy0+ZmlsZSgpLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24iKTsKKyAgR09PR0xFX0NIRUNLKGZkX3JlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAhPSBudWxscHRyKTsKKworICBjb25zdCBSZXBlYXRlZEZpZWxkUmVmPGludDY0X3Q+IHJmX2ludDY0X2V4dGVuc2lvbiA9CisgICAgICByZWZsLT5HZXRSZXBlYXRlZEZpZWxkUmVmPGludDY0X3Q+KGV4dGVuZGVkX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX3JlcGVhdGVkX2ludDY0X2V4dGVuc2lvbik7CisKKyAgY29uc3QgTXV0YWJsZVJlcGVhdGVkRmllbGRSZWY8aW50NjRfdD4gbXJmX2ludDY0X2V4dGVuc2lvbiA9CisgICAgICByZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxpbnQ2NF90PigmZXh0ZW5kZWRfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX3JlcGVhdGVkX2ludDY0X2V4dGVuc2lvbik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgMSksIHJmX2ludDY0X2V4dGVuc2lvbi5HZXQoaSkpOworICAgIG1yZl9pbnQ2NF9leHRlbnNpb24uU2V0KGksIEZ1bmMoaSwgLTEpKTsKKyAgICBFWFBFQ1RfRVEoRnVuYyhpLCAtMSksIGV4dGVuZGVkX21lc3NhZ2UuR2V0RXh0ZW5zaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24sIGkpKTsKKyAgfQorfQorCisKK1RFU1QoUmVwZWF0ZWRGaWVsZFJlZmxlY3Rpb25UZXN0LCBSZXBlYXRlZEZpZWxkUmVmTWVyZ2VGcm9tQW5kU3dhcCkgeworICAvLyBTZXQtdXAgbWVzc2FnZSBjb250ZW50LgorICBUZXN0QWxsVHlwZXMgbTAsIG0xLCBtMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgbTAuYWRkX3JlcGVhdGVkX2ludDMyKEZ1bmMoaSwgMSkpOworICAgIG0wLmFkZF9yZXBlYXRlZF9kb3VibGUoRnVuYyhpLCAyKSk7CisgICAgbTAuYWRkX3JlcGVhdGVkX3N0cmluZyhTdHJGdW5jKGksIDUpKTsKKyAgICBtMC5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKCktPnNldF9jKEZ1bmMoaSwgNikpOworICAgIG0wLmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bShUZXN0QWxsVHlwZXM6OkZPTyk7CisgICAgbTEuYWRkX3JlcGVhdGVkX2ludDMyKEZ1bmMoaSwgMTEpKTsKKyAgICBtMS5hZGRfcmVwZWF0ZWRfZG91YmxlKEZ1bmMoaSwgMTIpKTsKKyAgICBtMS5hZGRfcmVwZWF0ZWRfc3RyaW5nKFN0ckZ1bmMoaSwgMTUpKTsKKyAgICBtMS5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKCktPnNldF9jKEZ1bmMoaSwgMTYpKTsKKyAgICBtMS5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0oVGVzdEFsbFR5cGVzOjpCQVIpOworICAgIG0yLmFkZF9yZXBlYXRlZF9pbnQzMihGdW5jKGksIDIxKSk7CisgICAgbTIuYWRkX3JlcGVhdGVkX2RvdWJsZShGdW5jKGksIDIyKSk7CisgICAgbTIuYWRkX3JlcGVhdGVkX3N0cmluZyhTdHJGdW5jKGksIDI1KSk7CisgICAgbTIuYWRkX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgpLT5zZXRfYyhGdW5jKGksIDI2KSk7CisgICAgbTIuYWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtKFRlc3RBbGxUeXBlczo6QkFaKTsKKyAgfQorCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmwgPSBtMC5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MgPSBtMC5HZXREZXNjcmlwdG9yKCk7CisKKyAgLy8gR2V0IEZpZWxkRGVzY3JpcHRvcnMgZm9yIGFsbCB0aGUgZmllbGRzIG9mIGludGVyZXN0LgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkX3JlcGVhdGVkX2ludDMyID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfaW50MzIiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9yZXBlYXRlZF9kb3VibGUgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9kb3VibGUiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9yZXBlYXRlZF9zdHJpbmcgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9zdHJpbmciKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSA9CisgICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX25lc3RlZF9lbnVtIik7CisKKyAgLy8gR2V0IE11dGFibGVSZXBlYXRlZEZpZWxkUmVmIG9iamVjdHMgZm9yIGFsbCBmaWVsZHMgb2YgaW50ZXJlc3QuCisgIGNvbnN0IE11dGFibGVSZXBlYXRlZEZpZWxkUmVmPGludDMyX3Q+IG1yZl9pbnQzMiA9CisgICAgICByZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxpbnQzMl90PigmbTAsIGZkX3JlcGVhdGVkX2ludDMyKTsKKyAgY29uc3QgTXV0YWJsZVJlcGVhdGVkRmllbGRSZWY8ZG91YmxlPiBtcmZfZG91YmxlID0KKyAgICAgIHJlZmwtPkdldE11dGFibGVSZXBlYXRlZEZpZWxkUmVmPGRvdWJsZT4oJm0wLCBmZF9yZXBlYXRlZF9kb3VibGUpOworICBjb25zdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxzdGQ6OnN0cmluZz4gbXJmX3N0cmluZyA9CisgICAgICByZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxzdGQ6OnN0cmluZz4oJm0wLCBmZF9yZXBlYXRlZF9zdHJpbmcpOworICBjb25zdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxGb3JlaWduTWVzc2FnZT4gbXJmX2ZvcmVpZ25fbWVzc2FnZSA9CisgICAgICByZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxGb3JlaWduTWVzc2FnZT4oCisgICAgICAgICAgJm0wLCBmZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UpOworICBjb25zdCBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW0+IG1yZl9uZXN0ZWRfZW51bSA9CisgICAgICByZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW0+KAorICAgICAgICAgICZtMCwgZmRfcmVwZWF0ZWRfbmVzdGVkX2VudW0pOworCisgIC8vIFRlc3QgTXV0YWJsZVJlcGVhdGVkUmVmOjpDb3B5RnJvbQorICBtcmZfaW50MzIuQ29weUZyb20ocmVmbC0+R2V0UmVwZWF0ZWRGaWVsZFJlZjxpbnQzMl90PihtMSwgZmRfcmVwZWF0ZWRfaW50MzIpKTsKKyAgbXJmX2RvdWJsZS5Db3B5RnJvbSgKKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkRmllbGRSZWY8ZG91YmxlPihtMSwgZmRfcmVwZWF0ZWRfZG91YmxlKSk7CisgIG1yZl9zdHJpbmcuQ29weUZyb20oCisgICAgICByZWZsLT5HZXRSZXBlYXRlZEZpZWxkUmVmPHN0ZDo6c3RyaW5nPihtMSwgZmRfcmVwZWF0ZWRfc3RyaW5nKSk7CisgIG1yZl9mb3JlaWduX21lc3NhZ2UuQ29weUZyb20ocmVmbC0+R2V0UmVwZWF0ZWRGaWVsZFJlZjxGb3JlaWduTWVzc2FnZT4oCisgICAgICBtMSwgZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKSk7CisgIG1yZl9uZXN0ZWRfZW51bS5Db3B5RnJvbShyZWZsLT5HZXRSZXBlYXRlZEZpZWxkUmVmPFRlc3RBbGxUeXBlczo6TmVzdGVkRW51bT4oCisgICAgICBtMSwgZmRfcmVwZWF0ZWRfbmVzdGVkX2VudW0pKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgMTEpLCBtMC5yZXBlYXRlZF9pbnQzMihpKSk7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgMTIpLCBtMC5yZXBlYXRlZF9kb3VibGUoaSkpOworICAgIEVYUEVDVF9FUShTdHJGdW5jKGksIDE1KSwgbTAucmVwZWF0ZWRfc3RyaW5nKGkpKTsKKyAgICBFWFBFQ1RfRVEoRnVuYyhpLCAxNiksIG0wLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZShpKS5jKCkpOworICAgIEVYUEVDVF9FUShUZXN0QWxsVHlwZXM6OkJBUiwgbTAucmVwZWF0ZWRfbmVzdGVkX2VudW0oaSkpOworICB9CisKKyAgLy8gVGVzdCBNdXRhYmxlUmVwZWF0ZWRSZWY6Ok1lcmdlRnJvbQorICBtcmZfaW50MzIuTWVyZ2VGcm9tKAorICAgICAgcmVmbC0+R2V0UmVwZWF0ZWRGaWVsZFJlZjxpbnQzMl90PihtMiwgZmRfcmVwZWF0ZWRfaW50MzIpKTsKKyAgbXJmX2RvdWJsZS5NZXJnZUZyb20oCisgICAgICByZWZsLT5HZXRSZXBlYXRlZEZpZWxkUmVmPGRvdWJsZT4obTIsIGZkX3JlcGVhdGVkX2RvdWJsZSkpOworICBtcmZfc3RyaW5nLk1lcmdlRnJvbSgKKyAgICAgIHJlZmwtPkdldFJlcGVhdGVkRmllbGRSZWY8c3RkOjpzdHJpbmc+KG0yLCBmZF9yZXBlYXRlZF9zdHJpbmcpKTsKKyAgbXJmX2ZvcmVpZ25fbWVzc2FnZS5NZXJnZUZyb20ocmVmbC0+R2V0UmVwZWF0ZWRGaWVsZFJlZjxGb3JlaWduTWVzc2FnZT4oCisgICAgICBtMiwgZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKSk7CisgIG1yZl9uZXN0ZWRfZW51bS5NZXJnZUZyb20ocmVmbC0+R2V0UmVwZWF0ZWRGaWVsZFJlZjxUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW0+KAorICAgICAgbTIsIGZkX3JlcGVhdGVkX25lc3RlZF9lbnVtKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIEVYUEVDVF9FUShGdW5jKGksIDIxKSwgbTAucmVwZWF0ZWRfaW50MzIoaSArIDEwKSk7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgMjIpLCBtMC5yZXBlYXRlZF9kb3VibGUoaSArIDEwKSk7CisgICAgRVhQRUNUX0VRKFN0ckZ1bmMoaSwgMjUpLCBtMC5yZXBlYXRlZF9zdHJpbmcoaSArIDEwKSk7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgMjYpLCBtMC5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoaSArIDEwKS5jKCkpOworICAgIEVYUEVDVF9FUShUZXN0QWxsVHlwZXM6OkJBWiwgbTAucmVwZWF0ZWRfbmVzdGVkX2VudW0oaSArIDEwKSk7CisgIH0KKworICAvLyBUZXN0IE11dGFibGVSZXBlYXRlZFJlZjo6U3dhcAorICAvLyBTd2FwIGJldHdlZW4gbTAgYW5kIG0yLgorICBtcmZfaW50MzIuU3dhcCgKKyAgICAgIHJlZmwtPkdldE11dGFibGVSZXBlYXRlZEZpZWxkUmVmPGludDMyX3Q+KCZtMiwgZmRfcmVwZWF0ZWRfaW50MzIpKTsKKyAgbXJmX2RvdWJsZS5Td2FwKAorICAgICAgcmVmbC0+R2V0TXV0YWJsZVJlcGVhdGVkRmllbGRSZWY8ZG91YmxlPigmbTIsIGZkX3JlcGVhdGVkX2RvdWJsZSkpOworICBtcmZfc3RyaW5nLlN3YXAoCisgICAgICByZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxzdGQ6OnN0cmluZz4oJm0yLCBmZF9yZXBlYXRlZF9zdHJpbmcpKTsKKyAgbXJmX2ZvcmVpZ25fbWVzc2FnZS5Td2FwKHJlZmwtPkdldE11dGFibGVSZXBlYXRlZEZpZWxkUmVmPEZvcmVpZ25NZXNzYWdlPigKKyAgICAgICZtMiwgZmRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKSk7CisgIG1yZl9uZXN0ZWRfZW51bS5Td2FwKAorICAgICAgcmVmbC0+R2V0TXV0YWJsZVJlcGVhdGVkRmllbGRSZWY8VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtPigKKyAgICAgICAgICAmbTIsIGZkX3JlcGVhdGVkX25lc3RlZF9lbnVtKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIC8vIENoZWNrIHRoZSBjb250ZW50IG9mIG0wLgorICAgIEVYUEVDVF9FUShGdW5jKGksIDIxKSwgbTAucmVwZWF0ZWRfaW50MzIoaSkpOworICAgIEVYUEVDVF9FUShGdW5jKGksIDIyKSwgbTAucmVwZWF0ZWRfZG91YmxlKGkpKTsKKyAgICBFWFBFQ1RfRVEoU3RyRnVuYyhpLCAyNSksIG0wLnJlcGVhdGVkX3N0cmluZyhpKSk7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgMjYpLCBtMC5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoaSkuYygpKTsKKyAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVosIG0wLnJlcGVhdGVkX25lc3RlZF9lbnVtKGkpKTsKKworICAgIC8vIENoZWNrIHRoZSBjb250ZW50IG9mIG0yLgorICAgIEVYUEVDVF9FUShGdW5jKGksIDExKSwgbTIucmVwZWF0ZWRfaW50MzIoaSkpOworICAgIEVYUEVDVF9FUShGdW5jKGksIDEyKSwgbTIucmVwZWF0ZWRfZG91YmxlKGkpKTsKKyAgICBFWFBFQ1RfRVEoU3RyRnVuYyhpLCAxNSksIG0yLnJlcGVhdGVkX3N0cmluZyhpKSk7CisgICAgRVhQRUNUX0VRKEZ1bmMoaSwgMTYpLCBtMi5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoaSkuYygpKTsKKyAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVIsIG0yLnJlcGVhdGVkX25lc3RlZF9lbnVtKGkpKTsKKyAgICBFWFBFQ1RfRVEoRnVuYyhpLCAyMSksIG0yLnJlcGVhdGVkX2ludDMyKGkgKyAxMCkpOworICAgIEVYUEVDVF9FUShGdW5jKGksIDIyKSwgbTIucmVwZWF0ZWRfZG91YmxlKGkgKyAxMCkpOworICAgIEVYUEVDVF9FUShTdHJGdW5jKGksIDI1KSwgbTIucmVwZWF0ZWRfc3RyaW5nKGkgKyAxMCkpOworICAgIEVYUEVDVF9FUShGdW5jKGksIDI2KSwgbTIucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKGkgKyAxMCkuYygpKTsKKyAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVosIG0yLnJlcGVhdGVkX25lc3RlZF9lbnVtKGkgKyAxMCkpOworICB9Cit9CisKKy8vIFRlc3QgdGhhdCBHZXRSZXBlYXRlZEZpZWxkUmVmL011dGFibGVSZXBlYXRlZEZpZWxkUmVmIHdvcmtzIHdpdGgKKy8vIER5bmFtaWNNZXNzYWdlLgorVEVTVChSZXBlYXRlZEZpZWxkUmVmbGVjdGlvblRlc3QsIFJlcGVhdGVkRmllbGRSZWZEeW5hbWljTWVzc2FnZSkgeworICAvLyBEeW5hbWljTWVzc2FnZSBzaGFyZXMgdGhlIHNhbWUgbWVtb3J5IGxheW91dCBhcyBnZW5lcmF0ZWQgbWVzc2FnZQorICAvLyBhbmQgdXNlIHRoZSBzYW1lIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uIGNvZGUgZm9yIHJlZmxlY3Rpb24uCisgIC8vIEFsbCBjb2RlIHBhdGhzIHNob3VsZCBhbHJlYWR5IGJlIGNvdmVyZWQgYnkgdGhlIG90aGVyIHRlc3RzIGZvcgorICAvLyBnZW5lcmF0ZWQgbWVzc2FnZXMuIEhlcmUgd2UganVzdCB0ZXN0IG9uZSBmaWVsZC4KKworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjID0gVGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmRfcmVwZWF0ZWRfaW50MzIgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9pbnQzMiIpOworCisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OworICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gZHluYW1pY19tZXNzYWdlKGZhY3RvcnkuR2V0UHJvdG90eXBlKGRlc2MpLT5OZXcoKSk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmwgPSBkeW5hbWljX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxpbnQzMl90PiByZl9pbnQzMiA9CisgICAgICByZWZsLT5HZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjxpbnQzMl90PihkeW5hbWljX21lc3NhZ2UuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZF9yZXBlYXRlZF9pbnQzMik7CisgIHJmX2ludDMyLkFkZCgxMjM0KTsKKyAgRVhQRUNUX0VRKDEsIHJlZmwtPkZpZWxkU2l6ZSgqZHluYW1pY19tZXNzYWdlLCBmZF9yZXBlYXRlZF9pbnQzMikpOworICBFWFBFQ1RfRVEoMTIzNCwKKyAgICAgICAgICAgIHJlZmwtPkdldFJlcGVhdGVkSW50MzIoKmR5bmFtaWNfbWVzc2FnZSwgZmRfcmVwZWF0ZWRfaW50MzIsIDApKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTgyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMjM2MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRPRE8oa2VudG9uKTogIEltcHJvdmUgdGhpcyB1bml0dGVzdCB0byBicmluZyBpdCB1cCB0byB0aGUgc3RhbmRhcmRzIG9mCisvLyAgIG90aGVyIHByb3RvMiB1bml0dGVzdHMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB7CisKK3VzaW5nIDo6cHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczsKK3VzaW5nIDo6dGVzdGluZzo6QWxsT2Y7Cit1c2luZyA6OnRlc3Rpbmc6OkVsZW1lbnRzQXJlOwordXNpbmcgOjp0ZXN0aW5nOjpHZTsKK3VzaW5nIDo6dGVzdGluZzo6TGU7CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgQ29uc3RJbml0KSB7CisgIFBST1RPQlVGX0NPTlNUSU5JVCBzdGF0aWMgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxke307ICAvLyBOT0xJTlQKKyAgRVhQRUNUX1RSVUUoZmllbGQuZW1wdHkoKSk7Cit9CisKKy8vIFRlc3Qgb3BlcmF0aW9ucyBvbiBhIHNtYWxsIFJlcGVhdGVkRmllbGQuCitURVNUKFJlcGVhdGVkRmllbGQsIFNtYWxsKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDsKKworICBFWFBFQ1RfVFJVRShmaWVsZC5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMCk7CisKKyAgZmllbGQuQWRkKDUpOworCisgIEVYUEVDVF9GQUxTRShmaWVsZC5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMSk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksIDUpOworICBFWFBFQ1RfRVEoZmllbGQuYXQoMCksIDUpOworCisgIGZpZWxkLkFkZCg0Mik7CisKKyAgRVhQRUNUX0ZBTFNFKGZpZWxkLmVtcHR5KCkpOworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAyKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgwKSwgNSk7CisgIEVYUEVDVF9FUShmaWVsZC5hdCgwKSwgNSk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMSksIDQyKTsKKyAgRVhQRUNUX0VRKGZpZWxkLmF0KDEpLCA0Mik7CisKKyAgZmllbGQuU2V0KDEsIDIzKTsKKworICBFWFBFQ1RfRkFMU0UoZmllbGQuZW1wdHkoKSk7CisgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDIpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDApLCA1KTsKKyAgRVhQRUNUX0VRKGZpZWxkLmF0KDApLCA1KTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgxKSwgMjMpOworICBFWFBFQ1RfRVEoZmllbGQuYXQoMSksIDIzKTsKKworICBmaWVsZC5hdCgxKSA9IDI1OworCisgIEVYUEVDVF9GQUxTRShmaWVsZC5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMik7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksIDUpOworICBFWFBFQ1RfRVEoZmllbGQuYXQoMCksIDUpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDEpLCAyNSk7CisgIEVYUEVDVF9FUShmaWVsZC5hdCgxKSwgMjUpOworCisgIGZpZWxkLlJlbW92ZUxhc3QoKTsKKworICBFWFBFQ1RfRkFMU0UoZmllbGQuZW1wdHkoKSk7CisgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDEpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDApLCA1KTsKKyAgRVhQRUNUX0VRKGZpZWxkLmF0KDApLCA1KTsKKworICBmaWVsZC5DbGVhcigpOworCisgIEVYUEVDVF9UUlVFKGZpZWxkLmVtcHR5KCkpOworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAwKTsKKyAgLy8gQWRkaXRpb25hbCBieXRlcyBhcmUgZm9yICdzdHJ1Y3QgUmVwJyBoZWFkZXIuCisgIGludCBleHBlY3RlZF91c2FnZSA9CisgICAgICAoc2l6ZW9mKEFyZW5hKikgPiBzaXplb2YoaW50KSA/IHNpemVvZihBcmVuYSopIC8gc2l6ZW9mKGludCkgOiAzKSAqCisgICAgICAgICAgc2l6ZW9mKGludCkgKworICAgICAgc2l6ZW9mKEFyZW5hKik7CisgIEVYUEVDVF9HRShmaWVsZC5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCksIGV4cGVjdGVkX3VzYWdlKTsKK30KKworCisvLyBUZXN0IG9wZXJhdGlvbnMgb24gYSBSZXBlYXRlZEZpZWxkIHdoaWNoIGlzIGxhcmdlIGVub3VnaCB0byBhbGxvY2F0ZSBhCisvLyBzZXBhcmF0ZSBhcnJheS4KK1RFU1QoUmVwZWF0ZWRGaWVsZCwgTGFyZ2UpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIGZpZWxkLkFkZChpICogaSk7CisgIH0KKworICBFWFBFQ1RfRkFMU0UoZmllbGQuZW1wdHkoKSk7CisgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDE2KTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoZmllbGQuR2V0KGkpLCBpICogaSk7CisgIH0KKworICBpbnQgZXhwZWN0ZWRfdXNhZ2UgPSAxNiAqIHNpemVvZihpbnQpOworICBFWFBFQ1RfR0UoZmllbGQuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpLCBleHBlY3RlZF91c2FnZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXA+Cit2b2lkIENoZWNrQWxsb2NhdGlvblNpemVzKGJvb2wgaXNfcHRyKSB7CisgIHVzaW5nIFQgPSB0eXBlbmFtZSBSZXA6OnZhbHVlX3R5cGU7CisgIC8vIFVzZSBhIGxhcmdlIGluaXRpYWwgYmxvY2sgdG8gbWFrZSB0aGUgY2hlY2tzIGJlbG93IGVhc2llciB0byBwcmVkaWN0LgorICBzdGQ6OnN0cmluZyBidWYoMSA8PCAyMCwgMCk7CisKKyAgQXJlbmEgYXJlbmEoJmJ1ZlswXSwgYnVmLnNpemUoKSk7CisgIGF1dG8qIHJlcCA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcD4oJmFyZW5hKTsKKyAgc2l6ZV90IHByZXYgPSBhcmVuYS5TcGFjZVVzZWQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7CisgICAgcmVwLT5BZGQoVHt9KTsKKyAgICBpZiAoc2l6ZW9mKHZvaWQqKSA9PSA4KSB7CisgICAgICAvLyBGb3IgUmVwZWF0ZWRQdHJGaWVsZCB3ZSBhbHNvIGFsbG9jYXRlIHRoZSBUIGluIHRoZSBhcmVuYS4KKyAgICAgIC8vIFN1YnRyYWN0IHRob3NlIGZyb20gdGhlIGNvdW50LgorICAgICAgc2l6ZV90IG5ld191c2VkID0gYXJlbmEuU3BhY2VVc2VkKCkgLSAoaXNfcHRyID8gc2l6ZW9mKFQpICogKGkgKyAxKSA6IDApOworICAgICAgc2l6ZV90IGxhc3RfYWxsb2MgPSBuZXdfdXNlZCAtIHByZXY7CisgICAgICBwcmV2ID0gbmV3X3VzZWQ7CisKKyAgICAgIC8vIFdoZW4gd2UgYWN0dWFsbHkgYWxsb2NhdGVkIHNvbWV0aGluZywgY2hlY2sgdGhlIHNpemUuCisgICAgICBpZiAobGFzdF9hbGxvYyAhPSAwKSB7CisgICAgICAgIC8vIE11c3QgYmUgYD49IDE2YCwgYXMgZXhwZWN0ZWQgYnkgdGhlIEFyZW5hLgorICAgICAgICBBU1NFUlRfR0UobGFzdF9hbGxvYywgMTYpOworICAgICAgICAvLyBNdXN0IGJlIG9mIGEgcG93ZXIgb2YgdHdvLgorICAgICAgICBzaXplX3QgbG9nMiA9IEJpdHM6OkxvZzJGbG9vck5vblplcm82NChsYXN0X2FsbG9jKTsKKyAgICAgICAgQVNTRVJUX0VRKCgxIDw8IGxvZzIpLCBsYXN0X2FsbG9jKTsKKyAgICAgIH0KKworICAgICAgLy8gVGhlIGJ5dGUgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4KKyAgICAgIEFTU0VSVF9FUShyZXAtPkNhcGFjaXR5KCkgKiBzaXplb2YoVCkgJSA4LCAwKTsKKyAgICB9CisgIH0KK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBBcmVuYUFsbG9jYXRpb25TaXplc01hdGNoRXhwZWN0ZWRWYWx1ZXMpIHsKKyAgLy8gUmVwZWF0ZWRGaWVsZCBndWFyYW50ZWVzIHRoYXQgaW4gNjQtYml0IG1vZGUgd2UgbmV2ZXIgYWxsb2NhdGUgYW55dGhpbmcKKyAgLy8gc21hbGxlciB0aGFuIDE2IGJ5dGVzIGZyb20gYW4gYXJlbmEuCisgIC8vIFRoaXMgaXMgaW1wb3J0YW50IHRvIGF2b2lkIGEgYnJhbmNoIGluIHRoZSByZWFsbG9jYXRpb24gcGF0aC4KKyAgLy8gVGhpcyBpcyBhbHNvIGltcG9ydGFudCBiZWNhdXNlIGFsbG9jYXRpbmcgYW55dGhpbmcgbGVzcyB3b3VsZCBiZSB3YXN0aW5nCisgIC8vIG1lbW9yeS4KKyAgLy8gSWYgdGhlIGFsbG9jYXRpb24gc2l6ZSBpcyB3cm9uZywgUmV0dXJuQXJyYXlNZW1vcnkgd2lsbCBHT09HTEVfRENIRUNLLgorICBDaGVja0FsbG9jYXRpb25TaXplczxSZXBlYXRlZEZpZWxkPGJvb2w+PihmYWxzZSk7CisgIENoZWNrQWxsb2NhdGlvblNpemVzPFJlcGVhdGVkRmllbGQ8dWludDhfdD4+KGZhbHNlKTsKKyAgQ2hlY2tBbGxvY2F0aW9uU2l6ZXM8UmVwZWF0ZWRGaWVsZDx1aW50MTZfdD4+KGZhbHNlKTsKKyAgQ2hlY2tBbGxvY2F0aW9uU2l6ZXM8UmVwZWF0ZWRGaWVsZDx1aW50MzJfdD4+KGZhbHNlKTsKKyAgQ2hlY2tBbGxvY2F0aW9uU2l6ZXM8UmVwZWF0ZWRGaWVsZDx1aW50NjRfdD4+KGZhbHNlKTsKKyAgQ2hlY2tBbGxvY2F0aW9uU2l6ZXM8UmVwZWF0ZWRGaWVsZDxzdGQ6OnBhaXI8dWludDY0X3QsIHVpbnQ2NF90Pj4+KGZhbHNlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFJlcD4KK3ZvaWQgQ2hlY2tOYXR1cmFsR3Jvd3RoT25BcmVuYXNSZXVzZUJsb2Nrcyhib29sIGlzX3B0cikgeworICBBcmVuYSBhcmVuYTsKKyAgc3RkOjp2ZWN0b3I8UmVwKj4gdmFsdWVzOworICB1c2luZyBUID0gdHlwZW5hbWUgUmVwOjp2YWx1ZV90eXBlOworCisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtOdW1GaWVsZHMgPSAxMDA7CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtOdW1FbGVtcyA9IDEwMDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUZpZWxkczsgKytpKSB7CisgICAgdmFsdWVzLnB1c2hfYmFjayhBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXA+KCZhcmVuYSkpOworICAgIGF1dG8mIGZpZWxkID0gKnZhbHVlcy5iYWNrKCk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrTnVtRWxlbXM7ICsraikgeworICAgICAgZmllbGQuQWRkKFR7fSk7CisgICAgfQorICB9CisKKyAgc2l6ZV90IHVzZWRfYnl0ZXNfaWZfcmV1c2luZyA9CisgICAgICB2YWx1ZXMuc2l6ZSgpICogdmFsdWVzWzBdLT5DYXBhY2l0eSgpICogKGlzX3B0ciA/IHNpemVvZihUKikgOiBzaXplb2YoVCkpOworICAvLyBVc2UgYSAyJSBzbGFjayBmb3Igb3RoZXIgb3ZlcmhlYWQuCisgIC8vIElmIHdlIHdlcmUgbm90IHJldXNpbmcgdGhlIGJsb2NrcywgdGhlIGFjdHVhbCB2YWx1ZSB3b3VsZCBiZSB+MnggdGhlCisgIC8vIGV4cGVjdGVkLgorICBFWFBFQ1RfVEhBVCgKKyAgICAgIGFyZW5hLlNwYWNlVXNlZCgpIC0gKGlzX3B0ciA/IHNpemVvZihUKSAqIGtOdW1FbGVtcyAqIGtOdW1GaWVsZHMgOiAwKSwKKyAgICAgIEFsbE9mKEdlKHVzZWRfYnl0ZXNfaWZfcmV1c2luZyksIExlKDEuMDIgKiB1c2VkX2J5dGVzX2lmX3JldXNpbmcpKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgTmF0dXJhbEdyb3d0aE9uQXJlbmFzUmV1c2VCbG9ja3MpIHsKKyAgQ2hlY2tOYXR1cmFsR3Jvd3RoT25BcmVuYXNSZXVzZUJsb2NrczxSZXBlYXRlZEZpZWxkPGludD4+KGZhbHNlKTsKK30KKworLy8gVGVzdCBzd2FwcGluZyBiZXR3ZWVuIHZhcmlvdXMgdHlwZXMgb2YgUmVwZWF0ZWRGaWVsZHMuCitURVNUKFJlcGVhdGVkRmllbGQsIFN3YXBTbWFsbFNtYWxsKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDE7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDI7CisKKyAgZmllbGQxLkFkZCg1KTsKKyAgZmllbGQxLkFkZCg0Mik7CisKKyAgRVhQRUNUX0ZBTFNFKGZpZWxkMS5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGZpZWxkMS5zaXplKCksIDIpOworICBFWFBFQ1RfRVEoZmllbGQxLkdldCgwKSwgNSk7CisgIEVYUEVDVF9FUShmaWVsZDEuR2V0KDEpLCA0Mik7CisKKyAgRVhQRUNUX1RSVUUoZmllbGQyLmVtcHR5KCkpOworICBFWFBFQ1RfRVEoZmllbGQyLnNpemUoKSwgMCk7CisKKyAgZmllbGQxLlN3YXAoJmZpZWxkMik7CisKKyAgRVhQRUNUX1RSVUUoZmllbGQxLmVtcHR5KCkpOworICBFWFBFQ1RfRVEoZmllbGQxLnNpemUoKSwgMCk7CisKKyAgRVhQRUNUX0ZBTFNFKGZpZWxkMi5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGZpZWxkMi5zaXplKCksIDIpOworICBFWFBFQ1RfRVEoZmllbGQyLkdldCgwKSwgNSk7CisgIEVYUEVDVF9FUShmaWVsZDIuR2V0KDEpLCA0Mik7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgU3dhcExhcmdlU21hbGwpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkMTsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkMjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBmaWVsZDEuQWRkKGkgKiBpKTsKKyAgfQorICBmaWVsZDIuQWRkKDUpOworICBmaWVsZDIuQWRkKDQyKTsKKyAgZmllbGQxLlN3YXAoJmZpZWxkMik7CisKKyAgRVhQRUNUX0VRKGZpZWxkMS5zaXplKCksIDIpOworICBFWFBFQ1RfRVEoZmllbGQxLkdldCgwKSwgNSk7CisgIEVYUEVDVF9FUShmaWVsZDEuR2V0KDEpLCA0Mik7CisgIEVYUEVDVF9FUShmaWVsZDIuc2l6ZSgpLCAxNik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIEVYUEVDVF9FUShmaWVsZDIuR2V0KGkpLCBpICogaSk7CisgIH0KK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBTd2FwTGFyZ2VMYXJnZSkgeworICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQxOworICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQyOworCisgIGZpZWxkMS5BZGQoNSk7CisgIGZpZWxkMS5BZGQoNDIpOworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBmaWVsZDEuQWRkKGkpOworICAgIGZpZWxkMi5BZGQoaSAqIGkpOworICB9CisgIGZpZWxkMi5Td2FwKCZmaWVsZDEpOworCisgIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAxNik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIEVYUEVDVF9FUShmaWVsZDEuR2V0KGkpLCBpICogaSk7CisgIH0KKyAgRVhQRUNUX0VRKGZpZWxkMi5zaXplKCksIDE4KTsKKyAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoMCksIDUpOworICBFWFBFQ1RfRVEoZmllbGQyLkdldCgxKSwgNDIpOworICBmb3IgKGludCBpID0gMjsgaSA8IDE4OyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoZmllbGQyLkdldChpKSwgaSAtIDIpOworICB9Cit9CisKKy8vIERldGVybWluZXMgaG93IG11Y2ggc3BhY2Ugd2FzIHJlc2VydmVkIGJ5IHRoZSBnaXZlbiBmaWVsZCBieSBhZGRpbmcgZWxlbWVudHMKKy8vIHRvIGl0IHVudGlsIGl0IHJlLWFsbG9jYXRlcyBpdHMgc3BhY2UuCitzdGF0aWMgaW50IFJlc2VydmVkU3BhY2UoUmVwZWF0ZWRGaWVsZDxpbnQ+KiBmaWVsZCkgeworICBjb25zdCBpbnQqIHB0ciA9IGZpZWxkLT5kYXRhKCk7CisgIGRvIHsKKyAgICBmaWVsZC0+QWRkKDApOworICB9IHdoaWxlIChmaWVsZC0+ZGF0YSgpID09IHB0cik7CisKKyAgcmV0dXJuIGZpZWxkLT5zaXplKCkgLSAxOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIFJlc2VydmVNb3JlVGhhbkRvdWJsZSkgeworICAvLyBSZXNlcnZlIG1vcmUgdGhhbiBkb3VibGUgdGhlIHByZXZpb3VzIHNwYWNlIGluIHRoZSBmaWVsZCBhbmQgZXhwZWN0IHRoZQorICAvLyBmaWVsZCB0byByZXNlcnZlIGV4YWN0bHkgdGhlIGFtb3VudCBzcGVjaWZpZWQuCisgIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDsKKyAgZmllbGQuUmVzZXJ2ZSgyMCk7CisKKyAgRVhQRUNUX0xFKDIwLCBSZXNlcnZlZFNwYWNlKCZmaWVsZCkpOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIFJlc2VydmVMZXNzVGhhbkRvdWJsZSkgeworICAvLyBSZXNlcnZlIGxlc3MgdGhhbiBkb3VibGUgdGhlIHByZXZpb3VzIHNwYWNlIGluIHRoZSBmaWVsZCBhbmQgZXhwZWN0IHRoZQorICAvLyBmaWVsZCB0byBncm93IGJ5IGRvdWJsZSBpbnN0ZWFkLgorICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQ7CisgIGZpZWxkLlJlc2VydmUoMjApOworICBpbnQgY2FwYWNpdHkgPSBmaWVsZC5DYXBhY2l0eSgpOworICBmaWVsZC5SZXNlcnZlKGNhcGFjaXR5ICogMS41KTsKKworICBFWFBFQ1RfTEUoMiAqIGNhcGFjaXR5LCBSZXNlcnZlZFNwYWNlKCZmaWVsZCkpOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIFJlc2VydmVMZXNzVGhhbkV4aXN0aW5nKSB7CisgIC8vIFJlc2VydmUgbGVzcyB0aGFuIHRoZSBwcmV2aW91cyBzcGFjZSBpbiB0aGUgZmllbGQgYW5kIGV4cGVjdCB0aGUKKyAgLy8gZmllbGQgdG8gbm90IHJlLWFsbG9jYXRlIGF0IGFsbC4KKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkOworICBmaWVsZC5SZXNlcnZlKDIwKTsKKyAgY29uc3QgaW50KiBwcmV2aW91c19wdHIgPSBmaWVsZC5kYXRhKCk7CisgIGZpZWxkLlJlc2VydmUoMTApOworCisgIEVYUEVDVF9FUShwcmV2aW91c19wdHIsIGZpZWxkLmRhdGEoKSk7CisgIEVYUEVDVF9MRSgyMCwgUmVzZXJ2ZWRTcGFjZSgmZmllbGQpKTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBSZXNpemUpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkOworICBmaWVsZC5SZXNpemUoMiwgMSk7CisgIEVYUEVDVF9FUSgyLCBmaWVsZC5zaXplKCkpOworICBmaWVsZC5SZXNpemUoNSwgMik7CisgIEVYUEVDVF9FUSg1LCBmaWVsZC5zaXplKCkpOworICBmaWVsZC5SZXNpemUoNCwgMyk7CisgIEFTU0VSVF9FUSg0LCBmaWVsZC5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgZmllbGQuR2V0KDApKTsKKyAgRVhQRUNUX0VRKDEsIGZpZWxkLkdldCgxKSk7CisgIEVYUEVDVF9FUSgyLCBmaWVsZC5HZXQoMikpOworICBFWFBFQ1RfRVEoMiwgZmllbGQuR2V0KDMpKTsKKyAgZmllbGQuUmVzaXplKDAsIDQpOworICBFWFBFQ1RfVFJVRShmaWVsZC5lbXB0eSgpKTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBSZXNlcnZlTm90aGluZykgeworICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQ7CisgIEVYUEVDVF9FUSgwLCBmaWVsZC5DYXBhY2l0eSgpKTsKKworICBmaWVsZC5SZXNlcnZlKC0xKTsKKyAgRVhQRUNUX0VRKDAsIGZpZWxkLkNhcGFjaXR5KCkpOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIFJlc2VydmVMb3dlckNsYW1wKSB7CisgIGludCBjbGFtcGVkX3ZhbHVlID0gaW50ZXJuYWw6OkNhbGN1bGF0ZVJlc2VydmVTaXplPGJvb2wsIHNpemVvZih2b2lkKik+KDAsIDEpOworICBFWFBFQ1RfR0UoY2xhbXBlZF92YWx1ZSwgOCAvIHNpemVvZihib29sKSk7CisgIEVYUEVDVF9FUSgoaW50ZXJuYWw6OlJlcGVhdGVkRmllbGRMb3dlckNsYW1wTGltaXQ8Ym9vbCwgc2l6ZW9mKHZvaWQqKT4oKSksCisgICAgICAgICAgICBjbGFtcGVkX3ZhbHVlKTsKKyAgLy8gRVhQRUNUX0VRKGNsYW1wZWRfdmFsdWUsIChpbnRlcm5hbDo6Q2FsY3VsYXRlUmVzZXJ2ZVNpemU8Ym9vbCwKKyAgLy8gc2l6ZW9mKHZvaWQqKT4oIGNsYW1wZWRfdmFsdWUsIDIpKSk7CisKKyAgY2xhbXBlZF92YWx1ZSA9IGludGVybmFsOjpDYWxjdWxhdGVSZXNlcnZlU2l6ZTxpbnQsIHNpemVvZih2b2lkKik+KDAsIDEpOworICBFWFBFQ1RfR0UoY2xhbXBlZF92YWx1ZSwgOCAvIHNpemVvZihpbnQpKTsKKyAgRVhQRUNUX0VRKChpbnRlcm5hbDo6UmVwZWF0ZWRGaWVsZExvd2VyQ2xhbXBMaW1pdDxpbnQsIHNpemVvZih2b2lkKik+KCkpLAorICAgICAgICAgICAgY2xhbXBlZF92YWx1ZSk7CisgIC8vIEVYUEVDVF9FUShjbGFtcGVkX3ZhbHVlLCAoaW50ZXJuYWw6OkNhbGN1bGF0ZVJlc2VydmVTaXplPGludCwKKyAgLy8gc2l6ZW9mKHZvaWQqKT4oIGNsYW1wZWRfdmFsdWUsIDIpKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgUmVzZXJ2ZUdyb3d0aCkgeworICAvLyBNYWtlIHN1cmUgdGhlIGZpZWxkIGNhcGFjaXR5IGRvdWJsZXMgaW4gc2l6ZSBvbiByZXBlYXRlZCByZXNlcnZhdGlvbi4KKyAgZm9yIChpbnQgc2l6ZSA9IGludGVybmFsOjpSZXBlYXRlZEZpZWxkTG93ZXJDbGFtcExpbWl0PGludCwgc2l6ZW9mKHZvaWQqKT4oKSwKKyAgICAgICAgICAgaSA9IDA7CisgICAgICAgaSA8IDQ7ICsraSkgeworICAgIGludCBuZXh0ID0KKyAgICAgICAgc2l6ZW9mKEFyZW5hKikgPj0gc2l6ZW9mKGludCkKKyAgICAgICAgICAgID8KKyAgICAgICAgICAgIC8vIGZvciBzbWFsbCBlbm91Z2ggZWxlbWVudHMsIHdlIGRvdWJsZSBudW1iZXIgb2YgdG90YWwgYnl0ZXMKKyAgICAgICAgICAgICgoMiAqIChzaXplICogc2l6ZW9mKGludCkgKyBzaXplb2YoQXJlbmEqKSkpIC0gc2l6ZW9mKEFyZW5hKikpIC8KKyAgICAgICAgICAgICAgICBzaXplb2YoaW50KQorICAgICAgICAgICAgOgorICAgICAgICAgICAgLy8gd2UganVzdCBkb3VibGUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpZiB0b28gbGFyZ2Ugc2l6ZS4KKyAgICAgICAgICAgIHNpemUgKiAyOworICAgIEVYUEVDVF9FUShuZXh0LCAoaW50ZXJuYWw6OkNhbGN1bGF0ZVJlc2VydmVTaXplPGludCwgc2l6ZW9mKHZvaWQqKT4oCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBzaXplICsgMSkpKTsKKyAgICBzaXplID0gbmV4dDsKKyAgfQorfQorCitURVNUKFJlcGVhdGVkRmllbGQsIFJlc2VydmVMYXJnZSkgeworICBjb25zdCBpbnQgb2xkX3NpemUgPSAxMDsKKyAgLy8gVGhpcyBpcyBhIHNpemUgd2Ugd29uJ3QgZ2V0IGJ5IGRvdWJsaW5nOgorICBjb25zdCBpbnQgbmV3X3NpemUgPSBvbGRfc2l6ZSAqIDMgKyAxOworCisgIC8vIFJlc2VydmluZyBtb3JlIHRoYW4gMnggY3VycmVudCBjYXBhY2l0eSBzaG91bGQgZ3JvdyBkaXJlY3RseSB0byB0aGF0IHNpemUuCisgIEVYUEVDVF9FUShuZXdfc2l6ZSwgKGludGVybmFsOjpDYWxjdWxhdGVSZXNlcnZlU2l6ZTxpbnQsIHNpemVvZih2b2lkKik+KAorICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfc2l6ZSwgbmV3X3NpemUpKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgUmVzZXJ2ZUh1Z2UpIHsKKyAgLy8gTGFyZ2VzdCB2YWx1ZSB0aGF0IGRvZXMgbm90IGNsYW1wIHRvIHRoZSBsYXJnZSBsaW1pdDoKKyAgY29uc3RleHByIGludCBub25fY2xhbXBpbmdfbGltaXQgPQorICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLSBzaXplb2YoQXJlbmEqKSkgLyAyOworICBBU1NFUlRfTFQoMiAqIG5vbl9jbGFtcGluZ19saW1pdCwgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSk7CisgIEVYUEVDVF9MVCgoaW50ZXJuYWw6OkNhbGN1bGF0ZVJlc2VydmVTaXplPGludCwgc2l6ZW9mKHZvaWQqKT4oCisgICAgICAgICAgICAgICAgbm9uX2NsYW1waW5nX2xpbWl0LCBub25fY2xhbXBpbmdfbGltaXQgKyAxKSksCisgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpKTsKKworICAvLyBTbWFsbGVzdCBzaXplIHRoYXQgKndpbGwqIGNsYW1wIHRvIHRoZSB1cHBlciBsaW1pdDoKKyAgY29uc3RleHByIGludCBtaW5fY2xhbXBpbmdfc2l6ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLyAyICsgMTsKKyAgRVhQRUNUX0VRKChpbnRlcm5hbDo6Q2FsY3VsYXRlUmVzZXJ2ZVNpemU8aW50LCBzaXplb2Yodm9pZCopPigKKyAgICAgICAgICAgICAgICBtaW5fY2xhbXBpbmdfc2l6ZSwgbWluX2NsYW1waW5nX3NpemUgKyAxKSksCisgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpKTsKKworI2lmZGVmIFBST1RPQlVGX1RFU1RfQUxMT1dfTEFSR0VfQUxMT0MKKyAgLy8gVGhlIHJlc3Qgb2YgdGhpcyB0ZXN0IG1heSBhbGxvY2F0ZSBzZXZlcmFsIEdCIG9mIG1lbW9yeSwgc28gaXQgaXMgb25seQorICAvLyBidWlsdCBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC4KKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGh1Z2VfZmllbGQ7CisKKyAgLy8gUmVzZXJ2ZSBhIHNpemUgZm9yIGh1Z2VfZmllbGQgdGhhdCB3aWxsIGNsYW1wLgorICBodWdlX2ZpZWxkLlJlc2VydmUobWluX2NsYW1waW5nX3NpemUpOworICBFWFBFQ1RfR0UoaHVnZV9maWVsZC5DYXBhY2l0eSgpLCBtaW5fY2xhbXBpbmdfc2l6ZSk7CisgIEFTU0VSVF9MVChodWdlX2ZpZWxkLkNhcGFjaXR5KCksIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLSAxKTsKKworI2lmbmRlZiBQUk9UT0JVRl9BU0FOCisgIC8vIFRoZSBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgZmllbGRzIGlzLCBpbiB0aGVvcnksIHVwIHRvIE1BWElOVC0xIGluIHNpemUuCisgIC8vIEhvd2V2ZXIsIHNvbWUgY29tcGlsZXJzIGNhbid0IGhhbmRsZSBhIHN0cnVjdCB3aG9zZSBzaXplIGlzIGxhcmdlcgorICAvLyB0aGFuIDJHQiwgYW5kIHRoZSBwcm90b2NvbCBidWZmZXIgZm9ybWF0IGRvZXNuJ3QgaGFuZGxlIG1vcmUgdGhhbiAyR0Igb2YKKyAgLy8gZGF0YSBhdCBvbmNlLCBlaXRoZXIuICBTbyB3ZSBsaW1pdCBpdCwgYnV0IHRoZSBjb2RlIGJlbG93IGFjY2Vzc2VzIGJleW9uZAorICAvLyB0aGF0IGxpbWl0LgorCisgIC8vIEFsbG9jYXRpb24gbWF5IHJldHVybiBtb3JlIG1lbW9yeSB0aGFuIHdlIHJlcXVlc3RlZC4gSG93ZXZlciwgdGhlIHVwZGF0ZWQKKyAgLy8gc2l6ZSBtdXN0IHN0aWxsIGJlIGNsYW1wZWQgdG8gYSB2YWxpZCByYW5nZS4KKyAgaHVnZV9maWVsZC5SZXNlcnZlKGh1Z2VfZmllbGQuQ2FwYWNpdHkoKSArIDEpOworICBFWFBFQ1RfRVEoaHVnZV9maWVsZC5DYXBhY2l0eSgpLCBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpKTsKKyNlbmRpZiAgLy8gUFJPVE9CVUZfQVNBTgorI2VuZGlmICAvLyBQUk9UT0JVRl9URVNUX0FMTE9XX0xBUkdFX0FMTE9DCit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgTWVyZ2VGcm9tKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBzb3VyY2UsIGRlc3RpbmF0aW9uOworICBzb3VyY2UuQWRkKDQpOworICBzb3VyY2UuQWRkKDUpOworICBkZXN0aW5hdGlvbi5BZGQoMSk7CisgIGRlc3RpbmF0aW9uLkFkZCgyKTsKKyAgZGVzdGluYXRpb24uQWRkKDMpOworCisgIGRlc3RpbmF0aW9uLk1lcmdlRnJvbShzb3VyY2UpOworCisgIEFTU0VSVF9FUSg1LCBkZXN0aW5hdGlvbi5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgZGVzdGluYXRpb24uR2V0KDApKTsKKyAgRVhQRUNUX0VRKDIsIGRlc3RpbmF0aW9uLkdldCgxKSk7CisgIEVYUEVDVF9FUSgzLCBkZXN0aW5hdGlvbi5HZXQoMikpOworICBFWFBFQ1RfRVEoNCwgZGVzdGluYXRpb24uR2V0KDMpKTsKKyAgRVhQRUNUX0VRKDUsIGRlc3RpbmF0aW9uLkdldCg0KSk7Cit9CisKKworVEVTVChSZXBlYXRlZEZpZWxkLCBDb3B5RnJvbSkgeworICBSZXBlYXRlZEZpZWxkPGludD4gc291cmNlLCBkZXN0aW5hdGlvbjsKKyAgc291cmNlLkFkZCg0KTsKKyAgc291cmNlLkFkZCg1KTsKKyAgZGVzdGluYXRpb24uQWRkKDEpOworICBkZXN0aW5hdGlvbi5BZGQoMik7CisgIGRlc3RpbmF0aW9uLkFkZCgzKTsKKworICBkZXN0aW5hdGlvbi5Db3B5RnJvbShzb3VyY2UpOworCisgIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOworICBFWFBFQ1RfRVEoNCwgZGVzdGluYXRpb24uR2V0KDApKTsKKyAgRVhQRUNUX0VRKDUsIGRlc3RpbmF0aW9uLkdldCgxKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgQ29weUZyb21TZWxmKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBtZTsKKyAgbWUuQWRkKDMpOworICBtZS5Db3B5RnJvbShtZSk7CisgIEFTU0VSVF9FUSgxLCBtZS5zaXplKCkpOworICBFWFBFQ1RfRVEoMywgbWUuR2V0KDApKTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBFcmFzZSkgeworICBSZXBlYXRlZEZpZWxkPGludD4gbWU7CisgIFJlcGVhdGVkRmllbGQ8aW50Pjo6aXRlcmF0b3IgaXQgPSBtZS5lcmFzZShtZS5iZWdpbigpLCBtZS5lbmQoKSk7CisgIEVYUEVDVF9UUlVFKG1lLmJlZ2luKCkgPT0gaXQpOworICBFWFBFQ1RfRVEoMCwgbWUuc2l6ZSgpKTsKKworICBtZS5BZGQoMSk7CisgIG1lLkFkZCgyKTsKKyAgbWUuQWRkKDMpOworICBpdCA9IG1lLmVyYXNlKG1lLmJlZ2luKCksIG1lLmVuZCgpKTsKKyAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSA9PSBpdCk7CisgIEVYUEVDVF9FUSgwLCBtZS5zaXplKCkpOworCisgIG1lLkFkZCg0KTsKKyAgbWUuQWRkKDUpOworICBtZS5BZGQoNik7CisgIGl0ID0gbWUuZXJhc2UobWUuYmVnaW4oKSArIDIsIG1lLmVuZCgpKTsKKyAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSArIDIgPT0gaXQpOworICBFWFBFQ1RfRVEoMiwgbWUuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQsIG1lLkdldCgwKSk7CisgIEVYUEVDVF9FUSg1LCBtZS5HZXQoMSkpOworCisgIG1lLkFkZCg2KTsKKyAgbWUuQWRkKDcpOworICBtZS5BZGQoOCk7CisgIGl0ID0gbWUuZXJhc2UobWUuYmVnaW4oKSArIDEsIG1lLmJlZ2luKCkgKyAzKTsKKyAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSArIDEgPT0gaXQpOworICBFWFBFQ1RfRVEoMywgbWUuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQsIG1lLkdldCgwKSk7CisgIEVYUEVDVF9FUSg3LCBtZS5HZXQoMSkpOworICBFWFBFQ1RfRVEoOCwgbWUuR2V0KDIpKTsKK30KKworLy8gQWRkIGNvbnRlbnRzIG9mIGVtcHR5IGNvbnRhaW5lciB0byBhbiBlbXB0eSBmaWVsZC4KK1RFU1QoUmVwZWF0ZWRGaWVsZCwgQWRkUmFuZ2UxKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBtZTsKKyAgc3RkOjp2ZWN0b3I8aW50PiB2YWx1ZXM7CisKKyAgbWUuQWRkKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworICBBU1NFUlRfRVEobWUuc2l6ZSgpLCAwKTsKK30KKworLy8gQWRkIGNvbnRlbnRzIG9mIGNvbnRhaW5lciB3aXRoIG9uZSB0aGluZyB0byBhbiBlbXB0eSBmaWVsZC4KK1RFU1QoUmVwZWF0ZWRGaWVsZCwgQWRkUmFuZ2UyKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBtZTsKKyAgc3RkOjp2ZWN0b3I8aW50PiB2YWx1ZXM7CisgIHZhbHVlcy5wdXNoX2JhY2soLTEpOworCisgIG1lLkFkZCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKyAgQVNTRVJUX0VRKG1lLnNpemUoKSwgMSk7CisgIEFTU0VSVF9FUShtZS5HZXQoMCksIHZhbHVlc1swXSk7Cit9CisKKy8vIEFkZCBjb250ZW50cyBvZiBjb250YWluZXIgd2l0aCBtb3JlIHRoYW4gb25lIHRoaW5nIHRvIGFuIGVtcHR5IGZpZWxkLgorVEVTVChSZXBlYXRlZEZpZWxkLCBBZGRSYW5nZTMpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IG1lOworICBzdGQ6OnZlY3RvcjxpbnQ+IHZhbHVlczsKKyAgdmFsdWVzLnB1c2hfYmFjaygwKTsKKyAgdmFsdWVzLnB1c2hfYmFjaygxKTsKKworICBtZS5BZGQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7CisgIEFTU0VSVF9FUShtZS5zaXplKCksIDIpOworICBBU1NFUlRfRVEobWUuR2V0KDApLCB2YWx1ZXNbMF0pOworICBBU1NFUlRfRVEobWUuR2V0KDEpLCB2YWx1ZXNbMV0pOworfQorCisvLyBBZGQgY29udGVudHMgb2YgY29udGFpbmVyIHdpdGggbW9yZSB0aGFuIG9uZSB0aGluZyB0byBhIG5vbi1lbXB0eSBmaWVsZC4KK1RFU1QoUmVwZWF0ZWRGaWVsZCwgQWRkUmFuZ2U0KSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBtZTsKKyAgbWUuQWRkKDApOworICBtZS5BZGQoMSk7CisKKyAgc3RkOjp2ZWN0b3I8aW50PiB2YWx1ZXM7CisgIHZhbHVlcy5wdXNoX2JhY2soMik7CisgIHZhbHVlcy5wdXNoX2JhY2soMyk7CisKKyAgbWUuQWRkKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworICBBU1NFUlRfRVEobWUuc2l6ZSgpLCA0KTsKKyAgQVNTRVJUX0VRKG1lLkdldCgwKSwgMCk7CisgIEFTU0VSVF9FUShtZS5HZXQoMSksIDEpOworICBBU1NFUlRfRVEobWUuR2V0KDIpLCB2YWx1ZXNbMF0pOworICBBU1NFUlRfRVEobWUuR2V0KDMpLCB2YWx1ZXNbMV0pOworfQorCisvLyBBZGQgY29udGVudHMgb2YgYSBzdHJpbmdzdHJlYW0gaW4gb3JkZXIgdG8gdGVzdCBjb2RlIHBhdGhzIHdoZXJlIHRoZXJlIGlzCisvLyBhbiBpbnB1dCBpdGVyYXRvci4KK1RFU1QoUmVwZWF0ZWRGaWVsZCwgQWRkUmFuZ2U1KSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBtZTsKKworICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgMSA8PCAnICcgPDwgMjsKKworICBtZS5BZGQoc3RkOjppc3RyZWFtX2l0ZXJhdG9yPGludD4oc3MpLCBzdGQ6OmlzdHJlYW1faXRlcmF0b3I8aW50PigpKTsKKyAgQVNTRVJUX0VRKG1lLnNpemUoKSwgMik7CisgIEFTU0VSVF9FUShtZS5HZXQoMCksIDEpOworICBBU1NFUlRfRVEobWUuR2V0KDEpLCAyKTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBBZGRBbmRBc3NpZ25SYW5nZXMpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkOworCisgIGludCB2YWxzW10gPSB7MiwgMjcsIDI4NzUsIDYwOTI1MH07CisgIGZpZWxkLkFzc2lnbihzdGQ6OmJlZ2luKHZhbHMpLCBzdGQ6OmVuZCh2YWxzKSk7CisKKyAgQVNTRVJUX0VRKGZpZWxkLnNpemUoKSwgNCk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksIDIpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDEpLCAyNyk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMiksIDI4NzUpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDMpLCA2MDkyNTApOworCisgIGZpZWxkLkFkZChzdGQ6OmJlZ2luKHZhbHMpLCBzdGQ6OmVuZCh2YWxzKSk7CisgIEFTU0VSVF9FUShmaWVsZC5zaXplKCksIDgpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDApLCAyKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgxKSwgMjcpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDIpLCAyODc1KTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgzKSwgNjA5MjUwKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCg0KSwgMik7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoNSksIDI3KTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCg2KSwgMjg3NSk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoNyksIDYwOTI1MCk7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgQ29weUNvbnN0cnVjdCkgeworICBSZXBlYXRlZEZpZWxkPGludD4gc291cmNlOworICBzb3VyY2UuQWRkKDEpOworICBzb3VyY2UuQWRkKDIpOworCisgIFJlcGVhdGVkRmllbGQ8aW50PiBkZXN0aW5hdGlvbihzb3VyY2UpOworCisgIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgZGVzdGluYXRpb24uR2V0KDApKTsKKyAgRVhQRUNUX0VRKDIsIGRlc3RpbmF0aW9uLkdldCgxKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgSXRlcmF0b3JDb25zdHJ1Y3QpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiB2YWx1ZXM7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBlbXB0eSh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKyAgQVNTRVJUX0VRKHZhbHVlcy5zaXplKCksIGVtcHR5LnNpemUoKSk7CisKKyAgdmFsdWVzLnB1c2hfYmFjaygxKTsKKyAgdmFsdWVzLnB1c2hfYmFjaygyKTsKKworICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7CisgIEFTU0VSVF9FUSh2YWx1ZXMuc2l6ZSgpLCBmaWVsZC5zaXplKCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzBdLCBmaWVsZC5HZXQoMCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzFdLCBmaWVsZC5HZXQoMSkpOworCisgIFJlcGVhdGVkRmllbGQ8aW50PiBvdGhlcihmaWVsZC5iZWdpbigpLCBmaWVsZC5lbmQoKSk7CisgIEFTU0VSVF9FUSh2YWx1ZXMuc2l6ZSgpLCBvdGhlci5zaXplKCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzBdLCBvdGhlci5HZXQoMCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzFdLCBvdGhlci5HZXQoMSkpOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIENvcHlBc3NpZ24pIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IHNvdXJjZSwgZGVzdGluYXRpb247CisgIHNvdXJjZS5BZGQoNCk7CisgIHNvdXJjZS5BZGQoNSk7CisgIGRlc3RpbmF0aW9uLkFkZCgxKTsKKyAgZGVzdGluYXRpb24uQWRkKDIpOworICBkZXN0aW5hdGlvbi5BZGQoMyk7CisKKyAgZGVzdGluYXRpb24gPSBzb3VyY2U7CisKKyAgQVNTRVJUX0VRKDIsIGRlc3RpbmF0aW9uLnNpemUoKSk7CisgIEVYUEVDVF9FUSg0LCBkZXN0aW5hdGlvbi5HZXQoMCkpOworICBFWFBFQ1RfRVEoNSwgZGVzdGluYXRpb24uR2V0KDEpKTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBTZWxmQXNzaWduKSB7CisgIC8vIFZlcmlmeSB0aGF0IGFzc2lnbm1lbnQgdG8gc2VsZiBkb2VzIG5vdCBkZXN0cm95IGRhdGEuCisgIFJlcGVhdGVkRmllbGQ8aW50PiBzb3VyY2UsICpwOworICBwID0gJnNvdXJjZTsKKyAgc291cmNlLkFkZCg3KTsKKyAgc291cmNlLkFkZCg4KTsKKworICAqcCA9IHNvdXJjZTsKKworICBBU1NFUlRfRVEoMiwgc291cmNlLnNpemUoKSk7CisgIEVYUEVDVF9FUSg3LCBzb3VyY2UuR2V0KDApKTsKKyAgRVhQRUNUX0VRKDgsIHNvdXJjZS5HZXQoMSkpOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIE1vdmVDb25zdHJ1Y3QpIHsKKyAgeworICAgIFJlcGVhdGVkRmllbGQ8aW50PiBzb3VyY2U7CisgICAgc291cmNlLkFkZCgxKTsKKyAgICBzb3VyY2UuQWRkKDIpOworICAgIGNvbnN0IGludCogZGF0YSA9IHNvdXJjZS5kYXRhKCk7CisgICAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGRlc3RpbmF0aW9uID0gc3RkOjptb3ZlKHNvdXJjZSk7CisgICAgRVhQRUNUX0VRKGRhdGEsIGRlc3RpbmF0aW9uLmRhdGEoKSk7CisgICAgRVhQRUNUX1RIQVQoZGVzdGluYXRpb24sIEVsZW1lbnRzQXJlKDEsIDIpKTsKKyAgICAvLyBUaGlzIHByb3BlcnR5IGlzbid0IGd1YXJhbnRlZWQgYnV0IGl0J3MgdXNlZnVsIHRvIGhhdmUgYSB0ZXN0IHRoYXQgd291bGQKKyAgICAvLyBjYXRjaCBjaGFuZ2VzIGluIHRoaXMgYXJlYS4KKyAgICBFWFBFQ1RfVFJVRShzb3VyY2UuZW1wdHkoKSk7CisgIH0KKyAgeworICAgIEFyZW5hIGFyZW5hOworICAgIFJlcGVhdGVkRmllbGQ8aW50Piogc291cmNlID0KKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRGaWVsZDxpbnQ+PigmYXJlbmEpOworICAgIHNvdXJjZS0+QWRkKDEpOworICAgIHNvdXJjZS0+QWRkKDIpOworICAgIFJlcGVhdGVkRmllbGQ8aW50PiBkZXN0aW5hdGlvbiA9IHN0ZDo6bW92ZSgqc291cmNlKTsKKyAgICBFWFBFQ1RfRVEobnVsbHB0ciwgZGVzdGluYXRpb24uR2V0QXJlbmEoKSk7CisgICAgRVhQRUNUX1RIQVQoZGVzdGluYXRpb24sIEVsZW1lbnRzQXJlKDEsIDIpKTsKKyAgICAvLyBUaGlzIHByb3BlcnR5IGlzbid0IGd1YXJhbnRlZWQgYnV0IGl0J3MgdXNlZnVsIHRvIGhhdmUgYSB0ZXN0IHRoYXQgd291bGQKKyAgICAvLyBjYXRjaCBjaGFuZ2VzIGluIHRoaXMgYXJlYS4KKyAgICBFWFBFQ1RfVEhBVCgqc291cmNlLCBFbGVtZW50c0FyZSgxLCAyKSk7CisgIH0KK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBNb3ZlQXNzaWduKSB7CisgIHsKKyAgICBSZXBlYXRlZEZpZWxkPGludD4gc291cmNlOworICAgIHNvdXJjZS5BZGQoMSk7CisgICAgc291cmNlLkFkZCgyKTsKKyAgICBSZXBlYXRlZEZpZWxkPGludD4gZGVzdGluYXRpb247CisgICAgZGVzdGluYXRpb24uQWRkKDMpOworICAgIGNvbnN0IGludCogc291cmNlX2RhdGEgPSBzb3VyY2UuZGF0YSgpOworICAgIGNvbnN0IGludCogZGVzdGluYXRpb25fZGF0YSA9IGRlc3RpbmF0aW9uLmRhdGEoKTsKKyAgICBkZXN0aW5hdGlvbiA9IHN0ZDo6bW92ZShzb3VyY2UpOworICAgIEVYUEVDVF9FUShzb3VyY2VfZGF0YSwgZGVzdGluYXRpb24uZGF0YSgpKTsKKyAgICBFWFBFQ1RfVEhBVChkZXN0aW5hdGlvbiwgRWxlbWVudHNBcmUoMSwgMikpOworICAgIC8vIFRoaXMgcHJvcGVydHkgaXNuJ3QgZ3VhcmFudGVlZCBidXQgaXQncyB1c2VmdWwgdG8gaGF2ZSBhIHRlc3QgdGhhdCB3b3VsZAorICAgIC8vIGNhdGNoIGNoYW5nZXMgaW4gdGhpcyBhcmVhLgorICAgIEVYUEVDVF9FUShkZXN0aW5hdGlvbl9kYXRhLCBzb3VyY2UuZGF0YSgpKTsKKyAgICBFWFBFQ1RfVEhBVChzb3VyY2UsIEVsZW1lbnRzQXJlKDMpKTsKKyAgfQorICB7CisgICAgQXJlbmEgYXJlbmE7CisgICAgUmVwZWF0ZWRGaWVsZDxpbnQ+KiBzb3VyY2UgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPGludD4+KCZhcmVuYSk7CisgICAgc291cmNlLT5BZGQoMSk7CisgICAgc291cmNlLT5BZGQoMik7CisgICAgUmVwZWF0ZWRGaWVsZDxpbnQ+KiBkZXN0aW5hdGlvbiA9CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkRmllbGQ8aW50Pj4oJmFyZW5hKTsKKyAgICBkZXN0aW5hdGlvbi0+QWRkKDMpOworICAgIGNvbnN0IGludCogc291cmNlX2RhdGEgPSBzb3VyY2UtPmRhdGEoKTsKKyAgICBjb25zdCBpbnQqIGRlc3RpbmF0aW9uX2RhdGEgPSBkZXN0aW5hdGlvbi0+ZGF0YSgpOworICAgICpkZXN0aW5hdGlvbiA9IHN0ZDo6bW92ZSgqc291cmNlKTsKKyAgICBFWFBFQ1RfRVEoc291cmNlX2RhdGEsIGRlc3RpbmF0aW9uLT5kYXRhKCkpOworICAgIEVYUEVDVF9USEFUKCpkZXN0aW5hdGlvbiwgRWxlbWVudHNBcmUoMSwgMikpOworICAgIC8vIFRoaXMgcHJvcGVydHkgaXNuJ3QgZ3VhcmFudGVlZCBidXQgaXQncyB1c2VmdWwgdG8gaGF2ZSBhIHRlc3QgdGhhdCB3b3VsZAorICAgIC8vIGNhdGNoIGNoYW5nZXMgaW4gdGhpcyBhcmVhLgorICAgIEVYUEVDVF9FUShkZXN0aW5hdGlvbl9kYXRhLCBzb3VyY2UtPmRhdGEoKSk7CisgICAgRVhQRUNUX1RIQVQoKnNvdXJjZSwgRWxlbWVudHNBcmUoMykpOworICB9CisgIHsKKyAgICBBcmVuYSBzb3VyY2VfYXJlbmE7CisgICAgUmVwZWF0ZWRGaWVsZDxpbnQ+KiBzb3VyY2UgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPGludD4+KCZzb3VyY2VfYXJlbmEpOworICAgIHNvdXJjZS0+QWRkKDEpOworICAgIHNvdXJjZS0+QWRkKDIpOworICAgIEFyZW5hIGRlc3RpbmF0aW9uX2FyZW5hOworICAgIFJlcGVhdGVkRmllbGQ8aW50PiogZGVzdGluYXRpb24gPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPGludD4+KCZkZXN0aW5hdGlvbl9hcmVuYSk7CisgICAgZGVzdGluYXRpb24tPkFkZCgzKTsKKyAgICAqZGVzdGluYXRpb24gPSBzdGQ6Om1vdmUoKnNvdXJjZSk7CisgICAgRVhQRUNUX1RIQVQoKmRlc3RpbmF0aW9uLCBFbGVtZW50c0FyZSgxLCAyKSk7CisgICAgLy8gVGhpcyBwcm9wZXJ0eSBpc24ndCBndWFyYW50ZWVkIGJ1dCBpdCdzIHVzZWZ1bCB0byBoYXZlIGEgdGVzdCB0aGF0IHdvdWxkCisgICAgLy8gY2F0Y2ggY2hhbmdlcyBpbiB0aGlzIGFyZWEuCisgICAgRVhQRUNUX1RIQVQoKnNvdXJjZSwgRWxlbWVudHNBcmUoMSwgMikpOworICB9CisgIHsKKyAgICBBcmVuYSBhcmVuYTsKKyAgICBSZXBlYXRlZEZpZWxkPGludD4qIHNvdXJjZSA9CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkRmllbGQ8aW50Pj4oJmFyZW5hKTsKKyAgICBzb3VyY2UtPkFkZCgxKTsKKyAgICBzb3VyY2UtPkFkZCgyKTsKKyAgICBSZXBlYXRlZEZpZWxkPGludD4gZGVzdGluYXRpb247CisgICAgZGVzdGluYXRpb24uQWRkKDMpOworICAgIGRlc3RpbmF0aW9uID0gc3RkOjptb3ZlKCpzb3VyY2UpOworICAgIEVYUEVDVF9USEFUKGRlc3RpbmF0aW9uLCBFbGVtZW50c0FyZSgxLCAyKSk7CisgICAgLy8gVGhpcyBwcm9wZXJ0eSBpc24ndCBndWFyYW50ZWVkIGJ1dCBpdCdzIHVzZWZ1bCB0byBoYXZlIGEgdGVzdCB0aGF0IHdvdWxkCisgICAgLy8gY2F0Y2ggY2hhbmdlcyBpbiB0aGlzIGFyZWEuCisgICAgRVhQRUNUX1RIQVQoKnNvdXJjZSwgRWxlbWVudHNBcmUoMSwgMikpOworICB9CisgIHsKKyAgICBSZXBlYXRlZEZpZWxkPGludD4gc291cmNlOworICAgIHNvdXJjZS5BZGQoMSk7CisgICAgc291cmNlLkFkZCgyKTsKKyAgICBBcmVuYSBhcmVuYTsKKyAgICBSZXBlYXRlZEZpZWxkPGludD4qIGRlc3RpbmF0aW9uID0KKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRGaWVsZDxpbnQ+PigmYXJlbmEpOworICAgIGRlc3RpbmF0aW9uLT5BZGQoMyk7CisgICAgKmRlc3RpbmF0aW9uID0gc3RkOjptb3ZlKHNvdXJjZSk7CisgICAgRVhQRUNUX1RIQVQoKmRlc3RpbmF0aW9uLCBFbGVtZW50c0FyZSgxLCAyKSk7CisgICAgLy8gVGhpcyBwcm9wZXJ0eSBpc24ndCBndWFyYW50ZWVkIGJ1dCBpdCdzIHVzZWZ1bCB0byBoYXZlIGEgdGVzdCB0aGF0IHdvdWxkCisgICAgLy8gY2F0Y2ggY2hhbmdlcyBpbiB0aGlzIGFyZWEuCisgICAgRVhQRUNUX1RIQVQoc291cmNlLCBFbGVtZW50c0FyZSgxLCAyKSk7CisgIH0KKyAgeworICAgIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDsKKyAgICAvLyBBbiBhbGlhcyB0byBkZWZlYXQgLVdzZWxmLW1vdmUuCisgICAgUmVwZWF0ZWRGaWVsZDxpbnQ+JiBhbGlhcyA9IGZpZWxkOworICAgIGZpZWxkLkFkZCgxKTsKKyAgICBmaWVsZC5BZGQoMik7CisgICAgY29uc3QgaW50KiBkYXRhID0gZmllbGQuZGF0YSgpOworICAgIGZpZWxkID0gc3RkOjptb3ZlKGFsaWFzKTsKKyAgICBFWFBFQ1RfRVEoZGF0YSwgZmllbGQuZGF0YSgpKTsKKyAgICBFWFBFQ1RfVEhBVChmaWVsZCwgRWxlbWVudHNBcmUoMSwgMikpOworICB9CisgIHsKKyAgICBBcmVuYSBhcmVuYTsKKyAgICBSZXBlYXRlZEZpZWxkPGludD4qIGZpZWxkID0KKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRGaWVsZDxpbnQ+PigmYXJlbmEpOworICAgIGZpZWxkLT5BZGQoMSk7CisgICAgZmllbGQtPkFkZCgyKTsKKyAgICBjb25zdCBpbnQqIGRhdGEgPSBmaWVsZC0+ZGF0YSgpOworICAgICpmaWVsZCA9IHN0ZDo6bW92ZSgqZmllbGQpOworICAgIEVYUEVDVF9FUShkYXRhLCBmaWVsZC0+ZGF0YSgpKTsKKyAgICBFWFBFQ1RfVEhBVCgqZmllbGQsIEVsZW1lbnRzQXJlKDEsIDIpKTsKKyAgfQorfQorCitURVNUKE1vdmFibGUsIFdvcmtzKSB7CisgIGNsYXNzIE5vbk1vdmVDb25zdHJ1Y3RpYmxlIHsKKyAgIHB1YmxpYzoKKyAgICBOb25Nb3ZlQ29uc3RydWN0aWJsZShOb25Nb3ZlQ29uc3RydWN0aWJsZSYmKSA9IGRlbGV0ZTsKKyAgICBOb25Nb3ZlQ29uc3RydWN0aWJsZSYgb3BlcmF0b3I9KE5vbk1vdmVDb25zdHJ1Y3RpYmxlJiYpIHsgcmV0dXJuICp0aGlzOyB9CisgIH07CisgIGNsYXNzIE5vbk1vdmVBc3NpZ25hYmxlIHsKKyAgIHB1YmxpYzoKKyAgICBOb25Nb3ZlQXNzaWduYWJsZShOb25Nb3ZlQXNzaWduYWJsZSYmKSB7fQorICAgIE5vbk1vdmVBc3NpZ25hYmxlJiBvcGVyYXRvcj0oTm9uTW92ZUNvbnN0cnVjdGlibGUmJikgPSBkZWxldGU7CisgIH07CisgIGNsYXNzIE5vbk1vdmFibGUgeworICAgcHVibGljOgorICAgIE5vbk1vdmFibGUoTm9uTW92YWJsZSYmKSA9IGRlbGV0ZTsKKyAgICBOb25Nb3ZhYmxlJiBvcGVyYXRvcj0oTm9uTW92YWJsZSYmKSA9IGRlbGV0ZTsKKyAgfTsKKworICBFWFBFQ1RfVFJVRShpbnRlcm5hbDo6SXNNb3ZhYmxlPHN0ZDo6c3RyaW5nPjo6dmFsdWUpOworCisgIEVYUEVDVF9GQUxTRShzdGQ6OmlzX21vdmVfY29uc3RydWN0aWJsZTxOb25Nb3ZlQ29uc3RydWN0aWJsZT46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoc3RkOjppc19tb3ZlX2Fzc2lnbmFibGU8Tm9uTW92ZUNvbnN0cnVjdGlibGU+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpbnRlcm5hbDo6SXNNb3ZhYmxlPE5vbk1vdmVDb25zdHJ1Y3RpYmxlPjo6dmFsdWUpOworCisgIEVYUEVDVF9UUlVFKHN0ZDo6aXNfbW92ZV9jb25zdHJ1Y3RpYmxlPE5vbk1vdmVBc3NpZ25hYmxlPjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0Uoc3RkOjppc19tb3ZlX2Fzc2lnbmFibGU8Tm9uTW92ZUFzc2lnbmFibGU+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpbnRlcm5hbDo6SXNNb3ZhYmxlPE5vbk1vdmVBc3NpZ25hYmxlPjo6dmFsdWUpOworCisgIEVYUEVDVF9GQUxTRShpbnRlcm5hbDo6SXNNb3ZhYmxlPE5vbk1vdmFibGU+Ojp2YWx1ZSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgTW92ZUFkZCkgeworICBSZXBlYXRlZFB0ckZpZWxkPFRlc3RBbGxUeXBlcz4gZmllbGQ7CisgIFRlc3RBbGxUeXBlcyB0ZXN0X2FsbF90eXBlczsKKyAgYXV0byogb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgPQorICAgICAgdGVzdF9hbGxfdHlwZXMubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS0+c2V0X2JiKDQyKTsKKyAgZmllbGQuQWRkKHN0ZDo6bW92ZSh0ZXN0X2FsbF90eXBlcykpOworCisgIEVYUEVDVF9FUShvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSwKKyAgICAgICAgICAgIGZpZWxkLk11dGFibGUoMCktPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgTXV0YWJsZURhdGFJc011dGFibGUpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkOworICBmaWVsZC5BZGQoMSk7CisgIEVYUEVDVF9FUSgxLCBmaWVsZC5HZXQoMCkpOworICAvLyBUaGUgZmFjdCB0aGF0IHRoaXMgbGluZSBjb21waWxlcyB3b3VsZCBiZSBlbm91Z2gsIGJ1dCB3ZSdsbCBjaGVjayB0aGUKKyAgLy8gdmFsdWUgYW55d2F5LgorICAqZmllbGQubXV0YWJsZV9kYXRhKCkgPSAyOworICBFWFBFQ1RfRVEoMiwgZmllbGQuR2V0KDApKTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBTdWJzY3JpcHRPcGVyYXRvcnMpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkOworICBmaWVsZC5BZGQoMSk7CisgIEVYUEVDVF9FUSgxLCBmaWVsZC5HZXQoMCkpOworICBFWFBFQ1RfRVEoMSwgZmllbGRbMF0pOworICBFWFBFQ1RfRVEoZmllbGQuTXV0YWJsZSgwKSwgJmZpZWxkWzBdKTsKKyAgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ+JiBjb25zdF9maWVsZCA9IGZpZWxkOworICBFWFBFQ1RfRVEoZmllbGQuZGF0YSgpLCAmY29uc3RfZmllbGRbMF0pOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIFRydW5jYXRlKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDsKKworICBmaWVsZC5BZGQoMTIpOworICBmaWVsZC5BZGQoMzQpOworICBmaWVsZC5BZGQoNTYpOworICBmaWVsZC5BZGQoNzgpOworICBFWFBFQ1RfRVEoNCwgZmllbGQuc2l6ZSgpKTsKKworICBmaWVsZC5UcnVuY2F0ZSgzKTsKKyAgRVhQRUNUX0VRKDMsIGZpZWxkLnNpemUoKSk7CisKKyAgZmllbGQuQWRkKDkwKTsKKyAgRVhQRUNUX0VRKDQsIGZpZWxkLnNpemUoKSk7CisgIEVYUEVDVF9FUSg5MCwgZmllbGQuR2V0KDMpKTsKKworICAvLyBUcnVuY2F0aW9ucyB0aGF0IGRvbid0IGNoYW5nZSB0aGUgc2l6ZSBhcmUgYWxsb3dlZCwgYnV0IGdyb3dpbmcgaXMgbm90CisgIC8vIGFsbG93ZWQuCisgIGZpZWxkLlRydW5jYXRlKGZpZWxkLnNpemUoKSk7CisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKGZpZWxkLlRydW5jYXRlKGZpZWxkLnNpemUoKSArIDEpLCAibmV3X3NpemUiKTsKKyNlbmRpZgorfQorCisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgRXh0cmFjdFN1YnJhbmdlKSB7CisgIC8vIEV4aGF1c3RpdmVseSB0ZXN0IGV2ZXJ5IHN1YnJhbmdlIGluIGFycmF5cyBvZiBhbGwgc2l6ZXMgZnJvbSAwIHRocm91Z2ggOS4KKyAgZm9yIChpbnQgc3ogPSAwOyBzeiA8IDEwOyArK3N6KSB7CisgICAgZm9yIChpbnQgbnVtID0gMDsgbnVtIDw9IHN6OyArK251bSkgeworICAgICAgZm9yIChpbnQgc3RhcnQgPSAwOyBzdGFydCA8IHN6IC0gbnVtOyArK3N0YXJ0KSB7CisgICAgICAgIC8vIENyZWF0ZSBSZXBlYXRlZEZpZWxkIHdpdGggc3ogZWxlbWVudHMgaGF2aW5nIHZhbHVlcyAwIHRocm91Z2ggc3otMS4KKyAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQzMl90PiBmaWVsZDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzejsgKytpKSBmaWVsZC5BZGQoaSk7CisgICAgICAgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIHN6KTsKKworICAgICAgICAvLyBDcmVhdGUgYSBjYXRjaGVyIGFycmF5IGFuZCBjYWxsIEV4dHJhY3RTdWJyYW5nZS4KKyAgICAgICAgaW50MzJfdCBjYXRjaGVyWzEwXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSBjYXRjaGVyW2ldID0gLTE7CisgICAgICAgIGZpZWxkLkV4dHJhY3RTdWJyYW5nZShzdGFydCwgbnVtLCBjYXRjaGVyKTsKKworICAgICAgICAvLyBEb2VzIHRoZSByZXN1bHRpbmcgYXJyYXkgaGF2ZSB0aGUgcmlnaHQgc2l6ZT8KKyAgICAgICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgc3ogLSBudW0pOworCisgICAgICAgIC8vIFdlcmUgdGhlIHJlbW92ZWQgZWxlbWVudHMgZXh0cmFjdGVkIGludG8gdGhlIGNhdGNoZXIgYXJyYXk/CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpIEVYUEVDVF9FUShjYXRjaGVyW2ldLCBzdGFydCArIGkpOworICAgICAgICBFWFBFQ1RfRVEoY2F0Y2hlcltudW1dLCAtMSk7CisKKyAgICAgICAgLy8gRG9lcyB0aGUgcmVzdWx0aW5nIGFycmF5IGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlcz8KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGFydDsgKytpKSBFWFBFQ1RfRVEoZmllbGQuR2V0KGkpLCBpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZmllbGQuc2l6ZSgpOyArK2kpCisgICAgICAgICAgRVhQRUNUX0VRKGZpZWxkLkdldChpKSwgaSArIG51bSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgQ2xlYXJUaGVuUmVzZXJ2ZU1vcmUpIHsKKyAgLy8gVGVzdCB0aGF0IFJlc2VydmUgcHJvcGVybHkgZGVzdHJveXMgdGhlIG9sZCBpbnRlcm5hbCBhcnJheSB3aGVuIGl0J3MgZm9yY2VkCisgIC8vIHRvIGFsbG9jYXRlIGEgbmV3IG9uZSwgZXZlbiB3aGVuIGNsZWFyZWQtYnV0LW5vdC1kZWxldGVkIG9iamVjdHMgYXJlCisgIC8vIHByZXNlbnQuIFVzZSBhICdzdHJpbmcnIGFuZCA+IDE2IGJ5dGVzIGxlbmd0aCBzbyB0aGF0IHRoZSBlbGVtZW50cyBhcmUKKyAgLy8gbm9uLVBPRCBhbmQgYWxsb2NhdGUgLS0gdGhlIGxlYWsgY2hlY2tlciB3aWxsIGNhdGNoIGFueSBza2lwcGVkIGRlc3RydWN0b3IKKyAgLy8gY2FsbHMgaGVyZS4KKyAgUmVwZWF0ZWRGaWVsZDxzdGQ6OnN0cmluZz4gZmllbGQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgIGZpZWxkLkFkZChzdGQ6OnN0cmluZygiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IikpOworICB9CisgIEVYUEVDVF9FUSgzMiwgZmllbGQuc2l6ZSgpKTsKKyAgZmllbGQuQ2xlYXIoKTsKKyAgRVhQRUNUX0VRKDAsIGZpZWxkLnNpemUoKSk7CisgIEVYUEVDVF9MRSgzMiwgZmllbGQuQ2FwYWNpdHkoKSk7CisKKyAgZmllbGQuUmVzZXJ2ZSgxMDI0KTsKKyAgRVhQRUNUX0VRKDAsIGZpZWxkLnNpemUoKSk7CisgIEVYUEVDVF9MRSgxMDI0LCBmaWVsZC5DYXBhY2l0eSgpKTsKKyAgLy8gRmluaXNoIHRlc3QgLS0gfGZpZWxkfCBzaG91bGQgZGVzdHJveSB0aGUgY2xlYXJlZC1idXQtbm90LXlldC1kZXN0cm95ZWQKKyAgLy8gc3RyaW5ncy4KK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBUZXN0U0FkZEZyb21TZWxmKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDsKKyAgZmllbGQuQWRkKDApOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgIGZpZWxkLkFkZChmaWVsZFswXSk7CisgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUmVwZWF0ZWRQdHJGaWVsZCB0ZXN0cy4gIFRoZXNlIHByZXR0eSBtdWNoIGp1c3QgbWlycm9yIHRoZSBSZXBlYXRlZEZpZWxkCisvLyB0ZXN0cyBhYm92ZS4KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBDb25zdEluaXQpIHsKKyAgUFJPVE9CVUZfQ09OU1RJTklUIHN0YXRpYyBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBmaWVsZHt9OyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKGZpZWxkLmVtcHR5KCkpOworfQorCisvLyBUaGlzIGhlbHBlciBvdmVybG9hZCBzZXQgdGVzdHMgd2hldGhlciBYOjpmIGNhbiBiZSBjYWxsZWQgd2l0aCBhIGJyYWNlZCBwYWlyLAorLy8gWDo6Zih7YSwgYn0pIG9mIHN0ZDo6c3RyaW5nIGl0ZXJhdG9ycyAoc3BlY2lmaWNhbGx5LCBwb2ludGVyczogVGhhdCBjYWxsIGlzCisvLyBhbWJpZ3VvdXMgaWYgYW5kIG9ubHkgaWYgdGhlIGNhbGwgdG8gVmFsaWRSZXNvbHV0aW9uUG9pbnRlclJhbmdlIGlzIG5vdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBYPgorYXV0byBWYWxpZFJlc29sdXRpb25Qb2ludGVyUmFuZ2UoY29uc3Qgc3RkOjpzdHJpbmcqIHApCisgICAgLT4gZGVjbHR5cGUoWDo6Zih7cCwgcCArIDJ9KSwgc3RkOjp0cnVlX3R5cGV7fSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgWD4KK3N0ZDo6ZmFsc2VfdHlwZSBWYWxpZFJlc29sdXRpb25Qb2ludGVyUmFuZ2Uodm9pZCopOworCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIFVuYW1iaWd1b3VzQ29uc3RydWN0b3IpIHsKKyAgc3RydWN0IFggeworICAgIHN0YXRpYyBib29sIGYoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KSB7IHJldHVybiBmYWxzZTsgfQorICAgIHN0YXRpYyBib29sIGYoZ29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4pIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHN0YXRpYyBib29sIGcoc3RkOjp2ZWN0b3I8aW50PikgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBzdGF0aWMgYm9vbCBnKGdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KSB7IHJldHVybiB0cnVlOyB9CisgIH07CisKKyAgLy8gUmVwZWF0ZWRQdHJGaWVsZCBoYXMgbm8gaW5pdGlhbGl6ZXItbGlzdCBjb25zdHJ1Y3RvciwgYW5kIGEgY29uc3RydWN0b3IKKyAgLy8gZnJvbSB0byBjb25zdCBjaGFyKiB2YWx1ZXMgaXMgZXhjbHVkZWQgYnkgaXRzIGNvbnN0cmFpbnRzLgorICBFWFBFQ1RfRkFMU0UoWDo6Zih7ImFiYyIsICJ4eXoifSkpOworCisgIC8vIENvbnN0cnVjdGlvbiBmcm9tIGEgcGFpciBvZiBpbnQqIGlzIGFsc28gbm90IGFtYmlndW91cy4KKyAgaW50IGFbNV0gPSB7fTsKKyAgRVhQRUNUX0ZBTFNFKFg6Omcoe2EsIGEgKyA1fSkpOworCisgIC8vIENvbnN0cnVjdGlvbiBmcm9tIHN0cmluZyBpdGVyYXRvcnMgZm9yIHRoZSB1bmlxdWUgc3RyaW5nIG92ZXJsb2FkICJnIgorICAvLyB3b3Jrcy4KKyAgLy8gRGlzYWJsaW5nIHRoaXMgZm9yIG5vdywgdGhpcyBpcyBhY3R1YWxseSBhbWJpZ3VvdXMgd2l0aCBsaWJzdGRjKysuCisgIC8vIHN0ZDo6c3RyaW5nIGJbMl0gPSB7ImFiYyIsICJ4eXoifTsKKyAgLy8gRVhQRUNUX1RSVUUoWDo6Zyh7YiwgYiArIDJ9KSk7CisKKyAgLy8gQ29uc3RydWN0aW9uIGZyb20gc3RyaW5nIGl0ZXJhdG9ycyBmb3IgImYiIGlzIGFtYmlndW91cywgc2luY2UgYm90aAorICAvLyBjb250YWluZXJzIGFyZSBlcXVhbGx5IGdvb2QuCisgIC8vCisgIC8vIFg6OmYoe2IsIGIgKyAyfSk7ICAvLyBlcnJvciA9PiBWYWxpZFJlc29sdXRpb25Qb2ludGVyUmFuZ2UgaXMgdW5hbWJpZ3VvdXMuCisgIEVYUEVDVF9GQUxTRShkZWNsdHlwZShWYWxpZFJlc29sdXRpb25Qb2ludGVyUmFuZ2U8WD4obnVsbHB0cikpOjp2YWx1ZSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgU21hbGwpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gZmllbGQ7CisKKyAgRVhQRUNUX1RSVUUoZmllbGQuZW1wdHkoKSk7CisgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDApOworCisgIGZpZWxkLkFkZCgpLT5hc3NpZ24oImZvbyIpOworCisgIEVYUEVDVF9GQUxTRShmaWVsZC5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMSk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksICJmb28iKTsKKyAgRVhQRUNUX0VRKGZpZWxkLmF0KDApLCAiZm9vIik7CisKKyAgZmllbGQuQWRkKCktPmFzc2lnbigiYmFyIik7CisKKyAgRVhQRUNUX0ZBTFNFKGZpZWxkLmVtcHR5KCkpOworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAyKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgwKSwgImZvbyIpOworICBFWFBFQ1RfRVEoZmllbGQuYXQoMCksICJmb28iKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgxKSwgImJhciIpOworICBFWFBFQ1RfRVEoZmllbGQuYXQoMSksICJiYXIiKTsKKworICBmaWVsZC5NdXRhYmxlKDEpLT5hc3NpZ24oImJheiIpOworCisgIEVYUEVDVF9GQUxTRShmaWVsZC5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMik7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksICJmb28iKTsKKyAgRVhQRUNUX0VRKGZpZWxkLmF0KDApLCAiZm9vIik7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMSksICJiYXoiKTsKKyAgRVhQRUNUX0VRKGZpZWxkLmF0KDEpLCAiYmF6Iik7CisKKyAgZmllbGQuUmVtb3ZlTGFzdCgpOworCisgIEVYUEVDVF9GQUxTRShmaWVsZC5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMSk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksICJmb28iKTsKKyAgRVhQRUNUX0VRKGZpZWxkLmF0KDApLCAiZm9vIik7CisKKyAgZmllbGQuQ2xlYXIoKTsKKworICBFWFBFQ1RfVFJVRShmaWVsZC5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMCk7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgTGFyZ2UpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gZmllbGQ7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgKmZpZWxkLkFkZCgpICs9ICdhJyArIGk7CisgIH0KKworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAxNik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGZpZWxkLkdldChpKS5zaXplKCksIDEpOworICAgIEVYUEVDVF9FUShmaWVsZC5HZXQoaSlbMF0sICdhJyArIGkpOworICB9CisKKyAgaW50IG1pbl9leHBlY3RlZF91c2FnZSA9IDE2ICogc2l6ZW9mKHN0ZDo6c3RyaW5nKTsKKyAgRVhQRUNUX0dFKGZpZWxkLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSwgbWluX2V4cGVjdGVkX3VzYWdlKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBBcmVuYUFsbG9jYXRpb25TaXplc01hdGNoRXhwZWN0ZWRWYWx1ZXMpIHsKKyAgQ2hlY2tBbGxvY2F0aW9uU2l6ZXM8UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4+KHRydWUpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIE5hdHVyYWxHcm93dGhPbkFyZW5hc1JldXNlQmxvY2tzKSB7CisgIENoZWNrTmF0dXJhbEdyb3d0aE9uQXJlbmFzUmV1c2VCbG9ja3M8UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4+KHRydWUpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIEFkZEFuZEFzc2lnblJhbmdlcykgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBmaWVsZDsKKworICBjb25zdCBjaGFyKiB2YWxzW10gPSB7ImFiYyIsICJ4IiwgInl6IiwgInh5enp5In07CisgIGZpZWxkLkFzc2lnbihzdGQ6OmJlZ2luKHZhbHMpLCBzdGQ6OmVuZCh2YWxzKSk7CisKKyAgQVNTRVJUX0VRKGZpZWxkLnNpemUoKSwgNCk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksICJhYmMiKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgxKSwgIngiKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgyKSwgInl6Iik7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMyksICJ4eXp6eSIpOworCisgIGZpZWxkLkFkZChzdGQ6OmJlZ2luKHZhbHMpLCBzdGQ6OmVuZCh2YWxzKSk7CisgIEFTU0VSVF9FUShmaWVsZC5zaXplKCksIDgpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDApLCAiYWJjIik7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMSksICJ4Iik7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMiksICJ5eiIpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDMpLCAieHl6enkiKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCg0KSwgImFiYyIpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDUpLCAieCIpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDYpLCAieXoiKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCg3KSwgInh5enp5Iik7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgU3dhcFNtYWxsU21hbGwpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gZmllbGQxOworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBmaWVsZDI7CisKKyAgRVhQRUNUX1RSVUUoZmllbGQxLmVtcHR5KCkpOworICBFWFBFQ1RfRVEoZmllbGQxLnNpemUoKSwgMCk7CisgIEVYUEVDVF9UUlVFKGZpZWxkMi5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGZpZWxkMi5zaXplKCksIDApOworCisgIGZpZWxkMS5BZGQoKS0+YXNzaWduKCJmb28iKTsKKyAgZmllbGQxLkFkZCgpLT5hc3NpZ24oImJhciIpOworCisgIEVYUEVDVF9GQUxTRShmaWVsZDEuZW1wdHkoKSk7CisgIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAyKTsKKyAgRVhQRUNUX0VRKGZpZWxkMS5HZXQoMCksICJmb28iKTsKKyAgRVhQRUNUX0VRKGZpZWxkMS5HZXQoMSksICJiYXIiKTsKKworICBFWFBFQ1RfVFJVRShmaWVsZDIuZW1wdHkoKSk7CisgIEVYUEVDVF9FUShmaWVsZDIuc2l6ZSgpLCAwKTsKKworICBmaWVsZDEuU3dhcCgmZmllbGQyKTsKKworICBFWFBFQ1RfVFJVRShmaWVsZDEuZW1wdHkoKSk7CisgIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAwKTsKKworICBFWFBFQ1RfRVEoZmllbGQyLnNpemUoKSwgMik7CisgIEVYUEVDVF9FUShmaWVsZDIuR2V0KDApLCAiZm9vIik7CisgIEVYUEVDVF9FUShmaWVsZDIuR2V0KDEpLCAiYmFyIik7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgU3dhcExhcmdlU21hbGwpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gZmllbGQxOworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBmaWVsZDI7CisKKyAgZmllbGQyLkFkZCgpLT5hc3NpZ24oImZvbyIpOworICBmaWVsZDIuQWRkKCktPmFzc2lnbigiYmFyIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICpmaWVsZDEuQWRkKCkgKz0gJ2EnICsgaTsKKyAgfQorICBmaWVsZDEuU3dhcCgmZmllbGQyKTsKKworICBFWFBFQ1RfRVEoZmllbGQxLnNpemUoKSwgMik7CisgIEVYUEVDVF9FUShmaWVsZDEuR2V0KDApLCAiZm9vIik7CisgIEVYUEVDVF9FUShmaWVsZDEuR2V0KDEpLCAiYmFyIik7CisgIEVYUEVDVF9FUShmaWVsZDIuc2l6ZSgpLCAxNik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIEVYUEVDVF9FUShmaWVsZDIuR2V0KGkpLnNpemUoKSwgMSk7CisgICAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoaSlbMF0sICdhJyArIGkpOworICB9Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgU3dhcExhcmdlTGFyZ2UpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gZmllbGQxOworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBmaWVsZDI7CisKKyAgZmllbGQxLkFkZCgpLT5hc3NpZ24oImZvbyIpOworICBmaWVsZDEuQWRkKCktPmFzc2lnbigiYmFyIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICpmaWVsZDEuQWRkKCkgKz0gJ0EnICsgaTsKKyAgICAqZmllbGQyLkFkZCgpICs9ICdhJyArIGk7CisgIH0KKyAgZmllbGQyLlN3YXAoJmZpZWxkMSk7CisKKyAgRVhQRUNUX0VRKGZpZWxkMS5zaXplKCksIDE2KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGZpZWxkMS5HZXQoaSkuc2l6ZSgpLCAxKTsKKyAgICBFWFBFQ1RfRVEoZmllbGQxLkdldChpKVswXSwgJ2EnICsgaSk7CisgIH0KKyAgRVhQRUNUX0VRKGZpZWxkMi5zaXplKCksIDE4KTsKKyAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoMCksICJmb28iKTsKKyAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoMSksICJiYXIiKTsKKyAgZm9yIChpbnQgaSA9IDI7IGkgPCAxODsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoaSkuc2l6ZSgpLCAxKTsKKyAgICBFWFBFQ1RfRVEoZmllbGQyLkdldChpKVswXSwgJ0EnICsgaSAtIDIpOworICB9Cit9CisKK3N0YXRpYyBpbnQgUmVzZXJ2ZWRTcGFjZShSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiogZmllbGQpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcqIGNvbnN0KiBwdHIgPSBmaWVsZC0+ZGF0YSgpOworICBkbyB7CisgICAgZmllbGQtPkFkZCgpOworICB9IHdoaWxlIChmaWVsZC0+ZGF0YSgpID09IHB0cik7CisKKyAgcmV0dXJuIGZpZWxkLT5zaXplKCkgLSAxOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIFJlc2VydmVNb3JlVGhhbkRvdWJsZSkgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBmaWVsZDsKKyAgZmllbGQuUmVzZXJ2ZSgyMCk7CisKKyAgRVhQRUNUX0xFKDIwLCBSZXNlcnZlZFNwYWNlKCZmaWVsZCkpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIFJlc2VydmVMZXNzVGhhbkRvdWJsZSkgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBmaWVsZDsKKyAgZmllbGQuUmVzZXJ2ZSgyMCk7CisKKyAgaW50IGNhcGFjaXR5ID0gZmllbGQuQ2FwYWNpdHkoKTsKKyAgLy8gR3JvdyBieSAxLjV4CisgIGZpZWxkLlJlc2VydmUoY2FwYWNpdHkgKyAoY2FwYWNpdHkgPj4gMikpOworCisgIEVYUEVDVF9MRSgyICogY2FwYWNpdHksIFJlc2VydmVkU3BhY2UoJmZpZWxkKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgUmVzZXJ2ZUxlc3NUaGFuRXhpc3RpbmcpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gZmllbGQ7CisgIGZpZWxkLlJlc2VydmUoMjApOworICBjb25zdCBzdGQ6OnN0cmluZyogY29uc3QqIHByZXZpb3VzX3B0ciA9IGZpZWxkLmRhdGEoKTsKKyAgZmllbGQuUmVzZXJ2ZSgxMCk7CisKKyAgRVhQRUNUX0VRKHByZXZpb3VzX3B0ciwgZmllbGQuZGF0YSgpKTsKKyAgRVhQRUNUX0xFKDIwLCBSZXNlcnZlZFNwYWNlKCZmaWVsZCkpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIFJlc2VydmVEb2VzbnRMb3NlQWxsb2NhdGVkKSB7CisgIC8vIENoZWNrIHRoYXQgYSBidWcgaXMgZml4ZWQ6ICBBbiBlYXJsaWVyIGltcGxlbWVudGF0aW9uIG9mIFJlc2VydmUoKQorICAvLyBmYWlsZWQgdG8gY29weSBwb2ludGVycyB0byBhbGxvY2F0ZWQtYnV0LWNsZWFyZWQgb2JqZWN0cywgcG9zc2libHkKKyAgLy8gbGVhZGluZyB0byBzZWdmYXVsdHMuCisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+IGZpZWxkOworICBzdGQ6OnN0cmluZyogZmlyc3QgPSBmaWVsZC5BZGQoKTsKKyAgZmllbGQuUmVtb3ZlTGFzdCgpOworCisgIGZpZWxkLlJlc2VydmUoMjApOworICBFWFBFQ1RfRVEoZmlyc3QsIGZpZWxkLkFkZCgpKTsKK30KKworLy8gQ2xlYXJpbmcgZWxlbWVudHMgaXMgdHJpY2t5IHdpdGggUmVwZWF0ZWRQdHJGaWVsZHMgc2luY2UgdGhlIG1lbW9yeSBmb3IKKy8vIHRoZSBlbGVtZW50cyBpcyByZXRhaW5lZCBhbmQgcmV1c2VkLgorVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBDbGVhcmVkRWxlbWVudHMpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gZmllbGQ7CisKKyAgc3RkOjpzdHJpbmcqIG9yaWdpbmFsID0gZmllbGQuQWRkKCk7CisgICpvcmlnaW5hbCA9ICJmb28iOworCisgIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgMCk7CisKKyAgZmllbGQuUmVtb3ZlTGFzdCgpOworICBFWFBFQ1RfVFJVRShvcmlnaW5hbC0+ZW1wdHkoKSk7CisgIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgMSk7CisKKyAgRVhQRUNUX0VRKGZpZWxkLkFkZCgpLAorICAgICAgICAgICAgb3JpZ2luYWwpOyAgLy8gU2hvdWxkIHJldHVybiBzYW1lIHN0cmluZyBmb3IgcmV1c2UuCisgIEVYUEVDVF9FUShmaWVsZC5VbnNhZmVBcmVuYVJlbGVhc2VMYXN0KCksIG9yaWdpbmFsKTsgIC8vIFdlIHRha2Ugb3duZXJzaGlwLgorICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOworCisgIEVYUEVDVF9ORShmaWVsZC5BZGQoKSwgb3JpZ2luYWwpOyAgLy8gU2hvdWxkIE5PVCByZXR1cm4gdGhlIHNhbWUgc3RyaW5nLgorICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOworCisgIGZpZWxkLlVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkKG9yaWdpbmFsKTsgIC8vIEdpdmUgb3duZXJzaGlwIGJhY2suCisgIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgMCk7CisgIEVYUEVDVF9FUShmaWVsZC5NdXRhYmxlKDEpLCBvcmlnaW5hbCk7CisKKyAgZmllbGQuQ2xlYXIoKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCAyKTsKKyNpZm5kZWYgUFJPVE9CVUZfRlVUVVJFX0JSRUFLSU5HX0NIQU5HRVMKKyAgRVhQRUNUX0VRKGZpZWxkLlJlbGVhc2VDbGVhcmVkKCksIG9yaWdpbmFsKTsgIC8vIFRha2Ugb3duZXJzaGlwIGFnYWluLgorICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDEpOworICBFWFBFQ1RfTkUoZmllbGQuQWRkKCksIG9yaWdpbmFsKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCAwKTsKKyAgRVhQRUNUX05FKGZpZWxkLkFkZCgpLCBvcmlnaW5hbCk7CisgIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgMCk7CisKKyAgZmllbGQuQWRkQ2xlYXJlZChvcmlnaW5hbCk7ICAvLyBHaXZlIG93bmVyc2hpcCBiYWNrLCBidXQgYXMgYSBjbGVhcmVkIG9iamVjdC4KKyAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCAxKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkFkZCgpLCBvcmlnaW5hbCk7CisgIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgMCk7CisjZW5kaWYgIC8vICFQUk9UT0JVRl9GVVRVUkVfQlJFQUtJTkdfQ0hBTkdFUworfQorCisvLyBUZXN0IGFsbCBjb2RlIHBhdGhzIGluIEFkZEFsbG9jYXRlZCgpLgorVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBBZGRBbGxvY2F0ZWQpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gZmllbGQ7CisgIHdoaWxlIChmaWVsZC5zaXplKCkgPCBmaWVsZC5DYXBhY2l0eSgpKSB7CisgICAgZmllbGQuQWRkKCktPmFzc2lnbigiZmlsbGVyIik7CisgIH0KKworICBpbnQgaW5kZXggPSBmaWVsZC5zaXplKCk7CisKKyAgLy8gRmlyc3QgYnJhbmNoOiAgRmllbGQgaXMgYXQgY2FwYWNpdHkgd2l0aCBubyBjbGVhcmVkIG9iamVjdHMuCisgIHN0ZDo6c3RyaW5nKiBmb28gPSBuZXcgc3RkOjpzdHJpbmcoImZvbyIpOworICBmaWVsZC5BZGRBbGxvY2F0ZWQoZm9vKTsKKyAgRVhQRUNUX0VRKGluZGV4ICsgMSwgZmllbGQuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIGZpZWxkLkNsZWFyZWRDb3VudCgpKTsKKyAgRVhQRUNUX0VRKGZvbywgJmZpZWxkLkdldChpbmRleCkpOworCisgIC8vIExhc3QgYnJhbmNoOiAgRmllbGQgaXMgbm90IGF0IGNhcGFjaXR5IGFuZCB0aGVyZSBhcmUgbm8gY2xlYXJlZCBvYmplY3RzLgorICBzdGQ6OnN0cmluZyogYmFyID0gbmV3IHN0ZDo6c3RyaW5nKCJiYXIiKTsKKyAgZmllbGQuQWRkQWxsb2NhdGVkKGJhcik7CisgICsraW5kZXg7CisgIEVYUEVDVF9FUShpbmRleCArIDEsIGZpZWxkLnNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBmaWVsZC5DbGVhcmVkQ291bnQoKSk7CisgIEVYUEVDVF9FUShiYXIsICZmaWVsZC5HZXQoaW5kZXgpKTsKKworICAvLyBUaGlyZCBicmFuY2g6ICBGaWVsZCBpcyBub3QgYXQgY2FwYWNpdHkgYW5kIHRoZXJlIGFyZSBubyBjbGVhcmVkIG9iamVjdHMuCisgIGZpZWxkLlJlbW92ZUxhc3QoKTsKKyAgc3RkOjpzdHJpbmcqIGJheiA9IG5ldyBzdGQ6OnN0cmluZygiYmF6Iik7CisgIGZpZWxkLkFkZEFsbG9jYXRlZChiYXopOworICBFWFBFQ1RfRVEoaW5kZXggKyAxLCBmaWVsZC5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgZmllbGQuQ2xlYXJlZENvdW50KCkpOworICBFWFBFQ1RfRVEoYmF6LCAmZmllbGQuR2V0KGluZGV4KSk7CisKKyAgLy8gU2Vjb25kIGJyYW5jaDogIEZpZWxkIGlzIGF0IGNhcGFjaXR5IGJ1dCBoYXMgc29tZSBjbGVhcmVkIG9iamVjdHMuCisgIHdoaWxlIChmaWVsZC5zaXplKCkgPCBmaWVsZC5DYXBhY2l0eSgpKSB7CisgICAgZmllbGQuQWRkKCktPmFzc2lnbigiZmlsbGVyMiIpOworICB9CisgIGZpZWxkLlJlbW92ZUxhc3QoKTsKKyAgaW5kZXggPSBmaWVsZC5zaXplKCk7CisgIHN0ZDo6c3RyaW5nKiBtb28gPSBuZXcgc3RkOjpzdHJpbmcoIm1vbyIpOworICBmaWVsZC5BZGRBbGxvY2F0ZWQobW9vKTsKKyAgRVhQRUNUX0VRKGluZGV4ICsgMSwgZmllbGQuc2l6ZSgpKTsKKyAgLy8gV2Ugc2hvdWxkIGhhdmUgZGlzY2FyZGVkIHRoZSBjbGVhcmVkIG9iamVjdC4KKyAgRVhQRUNUX0VRKDAsIGZpZWxkLkNsZWFyZWRDb3VudCgpKTsKKyAgRVhQRUNUX0VRKG1vbywgJmZpZWxkLkdldChpbmRleCkpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIEFkZEFsbG9jYXRlZERpZmZlcmVudEFyZW5hKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8VGVzdEFsbFR5cGVzPiBmaWVsZDsKKyAgQXJlbmEgYXJlbmE7CisgIGF1dG8qIG1zZyA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hKTsKKyAgZmllbGQuQWRkQWxsb2NhdGVkKG1zZyk7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgTWVyZ2VGcm9tKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+IHNvdXJjZSwgZGVzdGluYXRpb247CisgIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI0Iik7CisgIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI1Iik7CisgIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjEiKTsKKyAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMiIpOworICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIzIik7CisKKyAgZGVzdGluYXRpb24uTWVyZ2VGcm9tKHNvdXJjZSk7CisKKyAgQVNTRVJUX0VRKDUsIGRlc3RpbmF0aW9uLnNpemUoKSk7CisgIEVYUEVDVF9FUSgiMSIsIGRlc3RpbmF0aW9uLkdldCgwKSk7CisgIEVYUEVDVF9FUSgiMiIsIGRlc3RpbmF0aW9uLkdldCgxKSk7CisgIEVYUEVDVF9FUSgiMyIsIGRlc3RpbmF0aW9uLkdldCgyKSk7CisgIEVYUEVDVF9FUSgiNCIsIGRlc3RpbmF0aW9uLkdldCgzKSk7CisgIEVYUEVDVF9FUSgiNSIsIGRlc3RpbmF0aW9uLkdldCg0KSk7Cit9CisKKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBDb3B5RnJvbSkgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBzb3VyY2UsIGRlc3RpbmF0aW9uOworICBzb3VyY2UuQWRkKCktPmFzc2lnbigiNCIpOworICBzb3VyY2UuQWRkKCktPmFzc2lnbigiNSIpOworICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIxIik7CisgIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjIiKTsKKyAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMyIpOworCisgIGRlc3RpbmF0aW9uLkNvcHlGcm9tKHNvdXJjZSk7CisKKyAgQVNTRVJUX0VRKDIsIGRlc3RpbmF0aW9uLnNpemUoKSk7CisgIEVYUEVDVF9FUSgiNCIsIGRlc3RpbmF0aW9uLkdldCgwKSk7CisgIEVYUEVDVF9FUSgiNSIsIGRlc3RpbmF0aW9uLkdldCgxKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgQ29weUZyb21TZWxmKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+IG1lOworICBtZS5BZGQoKS0+YXNzaWduKCIxIik7CisgIG1lLkNvcHlGcm9tKG1lKTsKKyAgQVNTRVJUX0VRKDEsIG1lLnNpemUoKSk7CisgIEVYUEVDVF9FUSgiMSIsIG1lLkdldCgwKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgRXJhc2UpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gbWU7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdCA9IG1lLmVyYXNlKG1lLmJlZ2luKCksIG1lLmVuZCgpKTsKKyAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSA9PSBpdCk7CisgIEVYUEVDVF9FUSgwLCBtZS5zaXplKCkpOworCisgICptZS5BZGQoKSA9ICIxIjsKKyAgKm1lLkFkZCgpID0gIjIiOworICAqbWUuQWRkKCkgPSAiMyI7CisgIGl0ID0gbWUuZXJhc2UobWUuYmVnaW4oKSwgbWUuZW5kKCkpOworICBFWFBFQ1RfVFJVRShtZS5iZWdpbigpID09IGl0KTsKKyAgRVhQRUNUX0VRKDAsIG1lLnNpemUoKSk7CisKKyAgKm1lLkFkZCgpID0gIjQiOworICAqbWUuQWRkKCkgPSAiNSI7CisgICptZS5BZGQoKSA9ICI2IjsKKyAgaXQgPSBtZS5lcmFzZShtZS5iZWdpbigpICsgMiwgbWUuZW5kKCkpOworICBFWFBFQ1RfVFJVRShtZS5iZWdpbigpICsgMiA9PSBpdCk7CisgIEVYUEVDVF9FUSgyLCBtZS5zaXplKCkpOworICBFWFBFQ1RfRVEoIjQiLCBtZS5HZXQoMCkpOworICBFWFBFQ1RfRVEoIjUiLCBtZS5HZXQoMSkpOworCisgICptZS5BZGQoKSA9ICI2IjsKKyAgKm1lLkFkZCgpID0gIjciOworICAqbWUuQWRkKCkgPSAiOCI7CisgIGl0ID0gbWUuZXJhc2UobWUuYmVnaW4oKSArIDEsIG1lLmJlZ2luKCkgKyAzKTsKKyAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSArIDEgPT0gaXQpOworICBFWFBFQ1RfRVEoMywgbWUuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCI0IiwgbWUuR2V0KDApKTsKKyAgRVhQRUNUX0VRKCI3IiwgbWUuR2V0KDEpKTsKKyAgRVhQRUNUX0VRKCI4IiwgbWUuR2V0KDIpKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBDb3B5Q29uc3RydWN0KSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+IHNvdXJjZTsKKyAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjEiKTsKKyAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjIiKTsKKworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBkZXN0aW5hdGlvbihzb3VyY2UpOworCisgIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOworICBFWFBFQ1RfRVEoIjEiLCBkZXN0aW5hdGlvbi5HZXQoMCkpOworICBFWFBFQ1RfRVEoIjIiLCBkZXN0aW5hdGlvbi5HZXQoMSkpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIEl0ZXJhdG9yQ29uc3RydWN0X1N0cmluZykgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdmFsdWVzOworICB2YWx1ZXMucHVzaF9iYWNrKCIxIik7CisgIHZhbHVlcy5wdXNoX2JhY2soIjIiKTsKKworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBmaWVsZCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKyAgQVNTRVJUX0VRKHZhbHVlcy5zaXplKCksIGZpZWxkLnNpemUoKSk7CisgIEVYUEVDVF9FUSh2YWx1ZXNbMF0sIGZpZWxkLkdldCgwKSk7CisgIEVYUEVDVF9FUSh2YWx1ZXNbMV0sIGZpZWxkLkdldCgxKSk7CisKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gb3RoZXIoZmllbGQuYmVnaW4oKSwgZmllbGQuZW5kKCkpOworICBBU1NFUlRfRVEodmFsdWVzLnNpemUoKSwgb3RoZXIuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKHZhbHVlc1swXSwgb3RoZXIuR2V0KDApKTsKKyAgRVhQRUNUX0VRKHZhbHVlc1sxXSwgb3RoZXIuR2V0KDEpKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBJdGVyYXRvckNvbnN0cnVjdF9Qcm90bykgeworICB0eXBlZGVmIFRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSBOZXN0ZWQ7CisgIHN0ZDo6dmVjdG9yPE5lc3RlZD4gdmFsdWVzOworICB2YWx1ZXMucHVzaF9iYWNrKE5lc3RlZCgpKTsKKyAgdmFsdWVzLmJhY2soKS5zZXRfYmIoMSk7CisgIHZhbHVlcy5wdXNoX2JhY2soTmVzdGVkKCkpOworICB2YWx1ZXMuYmFjaygpLnNldF9iYigyKTsKKworICBSZXBlYXRlZFB0ckZpZWxkPE5lc3RlZD4gZmllbGQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7CisgIEFTU0VSVF9FUSh2YWx1ZXMuc2l6ZSgpLCBmaWVsZC5zaXplKCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzBdLmJiKCksIGZpZWxkLkdldCgwKS5iYigpKTsKKyAgRVhQRUNUX0VRKHZhbHVlc1sxXS5iYigpLCBmaWVsZC5HZXQoMSkuYmIoKSk7CisKKyAgUmVwZWF0ZWRQdHJGaWVsZDxOZXN0ZWQ+IG90aGVyKGZpZWxkLmJlZ2luKCksIGZpZWxkLmVuZCgpKTsKKyAgQVNTRVJUX0VRKHZhbHVlcy5zaXplKCksIG90aGVyLnNpemUoKSk7CisgIEVYUEVDVF9FUSh2YWx1ZXNbMF0uYmIoKSwgb3RoZXIuR2V0KDApLmJiKCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzFdLmJiKCksIG90aGVyLkdldCgxKS5iYigpKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBDb3B5QXNzaWduKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+IHNvdXJjZSwgZGVzdGluYXRpb247CisgIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI0Iik7CisgIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI1Iik7CisgIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjEiKTsKKyAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMiIpOworICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIzIik7CisKKyAgZGVzdGluYXRpb24gPSBzb3VyY2U7CisKKyAgQVNTRVJUX0VRKDIsIGRlc3RpbmF0aW9uLnNpemUoKSk7CisgIEVYUEVDVF9FUSgiNCIsIGRlc3RpbmF0aW9uLkdldCgwKSk7CisgIEVYUEVDVF9FUSgiNSIsIGRlc3RpbmF0aW9uLkdldCgxKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgU2VsZkFzc2lnbikgeworICAvLyBWZXJpZnkgdGhhdCBhc3NpZ25tZW50IHRvIHNlbGYgZG9lcyBub3QgZGVzdHJveSBkYXRhLgorICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBzb3VyY2UsICpwOworICBwID0gJnNvdXJjZTsKKyAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjciKTsKKyAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjgiKTsKKworICAqcCA9IHNvdXJjZTsKKworICBBU1NFUlRfRVEoMiwgc291cmNlLnNpemUoKSk7CisgIEVYUEVDVF9FUSgiNyIsIHNvdXJjZS5HZXQoMCkpOworICBFWFBFQ1RfRVEoIjgiLCBzb3VyY2UuR2V0KDEpKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBNb3ZlQ29uc3RydWN0KSB7CisgIHsKKyAgICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBzb3VyY2U7CisgICAgKnNvdXJjZS5BZGQoKSA9ICIxIjsKKyAgICAqc291cmNlLkFkZCgpID0gIjIiOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nKiBjb25zdCogZGF0YSA9IHNvdXJjZS5kYXRhKCk7CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gZGVzdGluYXRpb24gPSBzdGQ6Om1vdmUoc291cmNlKTsKKyAgICBFWFBFQ1RfRVEoZGF0YSwgZGVzdGluYXRpb24uZGF0YSgpKTsKKyAgICBFWFBFQ1RfVEhBVChkZXN0aW5hdGlvbiwgRWxlbWVudHNBcmUoIjEiLCAiMiIpKTsKKyAgICAvLyBUaGlzIHByb3BlcnR5IGlzbid0IGd1YXJhbnRlZWQgYnV0IGl0J3MgdXNlZnVsIHRvIGhhdmUgYSB0ZXN0IHRoYXQgd291bGQKKyAgICAvLyBjYXRjaCBjaGFuZ2VzIGluIHRoaXMgYXJlYS4KKyAgICBFWFBFQ1RfVFJVRShzb3VyY2UuZW1wdHkoKSk7CisgIH0KKyAgeworICAgIEFyZW5hIGFyZW5hOworICAgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KiBzb3VyY2UgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPj4oJmFyZW5hKTsKKyAgICAqc291cmNlLT5BZGQoKSA9ICIxIjsKKyAgICAqc291cmNlLT5BZGQoKSA9ICIyIjsKKyAgICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBkZXN0aW5hdGlvbiA9IHN0ZDo6bW92ZSgqc291cmNlKTsKKyAgICBFWFBFQ1RfRVEobnVsbHB0ciwgZGVzdGluYXRpb24uR2V0QXJlbmEoKSk7CisgICAgRVhQRUNUX1RIQVQoZGVzdGluYXRpb24sIEVsZW1lbnRzQXJlKCIxIiwgIjIiKSk7CisgICAgLy8gVGhpcyBwcm9wZXJ0eSBpc24ndCBndWFyYW50ZWVkIGJ1dCBpdCdzIHVzZWZ1bCB0byBoYXZlIGEgdGVzdCB0aGF0IHdvdWxkCisgICAgLy8gY2F0Y2ggY2hhbmdlcyBpbiB0aGlzIGFyZWEuCisgICAgRVhQRUNUX1RIQVQoKnNvdXJjZSwgRWxlbWVudHNBcmUoIjEiLCAiMiIpKTsKKyAgfQorfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIE1vdmVBc3NpZ24pIHsKKyAgeworICAgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+IHNvdXJjZTsKKyAgICAqc291cmNlLkFkZCgpID0gIjEiOworICAgICpzb3VyY2UuQWRkKCkgPSAiMiI7CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gZGVzdGluYXRpb247CisgICAgKmRlc3RpbmF0aW9uLkFkZCgpID0gIjMiOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nKiBjb25zdCogc291cmNlX2RhdGEgPSBzb3VyY2UuZGF0YSgpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nKiBjb25zdCogZGVzdGluYXRpb25fZGF0YSA9IGRlc3RpbmF0aW9uLmRhdGEoKTsKKyAgICBkZXN0aW5hdGlvbiA9IHN0ZDo6bW92ZShzb3VyY2UpOworICAgIEVYUEVDVF9FUShzb3VyY2VfZGF0YSwgZGVzdGluYXRpb24uZGF0YSgpKTsKKyAgICBFWFBFQ1RfVEhBVChkZXN0aW5hdGlvbiwgRWxlbWVudHNBcmUoIjEiLCAiMiIpKTsKKyAgICAvLyBUaGlzIHByb3BlcnR5IGlzbid0IGd1YXJhbnRlZWQgYnV0IGl0J3MgdXNlZnVsIHRvIGhhdmUgYSB0ZXN0IHRoYXQgd291bGQKKyAgICAvLyBjYXRjaCBjaGFuZ2VzIGluIHRoaXMgYXJlYS4KKyAgICBFWFBFQ1RfRVEoZGVzdGluYXRpb25fZGF0YSwgc291cmNlLmRhdGEoKSk7CisgICAgRVhQRUNUX1RIQVQoc291cmNlLCBFbGVtZW50c0FyZSgiMyIpKTsKKyAgfQorICB7CisgICAgQXJlbmEgYXJlbmE7CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4qIHNvdXJjZSA9CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+PigmYXJlbmEpOworICAgICpzb3VyY2UtPkFkZCgpID0gIjEiOworICAgICpzb3VyY2UtPkFkZCgpID0gIjIiOworICAgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KiBkZXN0aW5hdGlvbiA9CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+PigmYXJlbmEpOworICAgICpkZXN0aW5hdGlvbi0+QWRkKCkgPSAiMyI7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcqIGNvbnN0KiBzb3VyY2VfZGF0YSA9IHNvdXJjZS0+ZGF0YSgpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nKiBjb25zdCogZGVzdGluYXRpb25fZGF0YSA9IGRlc3RpbmF0aW9uLT5kYXRhKCk7CisgICAgKmRlc3RpbmF0aW9uID0gc3RkOjptb3ZlKCpzb3VyY2UpOworICAgIEVYUEVDVF9FUShzb3VyY2VfZGF0YSwgZGVzdGluYXRpb24tPmRhdGEoKSk7CisgICAgRVhQRUNUX1RIQVQoKmRlc3RpbmF0aW9uLCBFbGVtZW50c0FyZSgiMSIsICIyIikpOworICAgIC8vIFRoaXMgcHJvcGVydHkgaXNuJ3QgZ3VhcmFudGVlZCBidXQgaXQncyB1c2VmdWwgdG8gaGF2ZSBhIHRlc3QgdGhhdCB3b3VsZAorICAgIC8vIGNhdGNoIGNoYW5nZXMgaW4gdGhpcyBhcmVhLgorICAgIEVYUEVDVF9FUShkZXN0aW5hdGlvbl9kYXRhLCBzb3VyY2UtPmRhdGEoKSk7CisgICAgRVhQRUNUX1RIQVQoKnNvdXJjZSwgRWxlbWVudHNBcmUoIjMiKSk7CisgIH0KKyAgeworICAgIEFyZW5hIHNvdXJjZV9hcmVuYTsKKyAgICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiogc291cmNlID0KKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4+KCZzb3VyY2VfYXJlbmEpOworICAgICpzb3VyY2UtPkFkZCgpID0gIjEiOworICAgICpzb3VyY2UtPkFkZCgpID0gIjIiOworICAgIEFyZW5hIGRlc3RpbmF0aW9uX2FyZW5hOworICAgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KiBkZXN0aW5hdGlvbiA9CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+PigmZGVzdGluYXRpb25fYXJlbmEpOworICAgICpkZXN0aW5hdGlvbi0+QWRkKCkgPSAiMyI7CisgICAgKmRlc3RpbmF0aW9uID0gc3RkOjptb3ZlKCpzb3VyY2UpOworICAgIEVYUEVDVF9USEFUKCpkZXN0aW5hdGlvbiwgRWxlbWVudHNBcmUoIjEiLCAiMiIpKTsKKyAgICAvLyBUaGlzIHByb3BlcnR5IGlzbid0IGd1YXJhbnRlZWQgYnV0IGl0J3MgdXNlZnVsIHRvIGhhdmUgYSB0ZXN0IHRoYXQgd291bGQKKyAgICAvLyBjYXRjaCBjaGFuZ2VzIGluIHRoaXMgYXJlYS4KKyAgICBFWFBFQ1RfVEhBVCgqc291cmNlLCBFbGVtZW50c0FyZSgiMSIsICIyIikpOworICB9CisgIHsKKyAgICBBcmVuYSBhcmVuYTsKKyAgICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiogc291cmNlID0KKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4+KCZhcmVuYSk7CisgICAgKnNvdXJjZS0+QWRkKCkgPSAiMSI7CisgICAgKnNvdXJjZS0+QWRkKCkgPSAiMiI7CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gZGVzdGluYXRpb247CisgICAgKmRlc3RpbmF0aW9uLkFkZCgpID0gIjMiOworICAgIGRlc3RpbmF0aW9uID0gc3RkOjptb3ZlKCpzb3VyY2UpOworICAgIEVYUEVDVF9USEFUKGRlc3RpbmF0aW9uLCBFbGVtZW50c0FyZSgiMSIsICIyIikpOworICAgIC8vIFRoaXMgcHJvcGVydHkgaXNuJ3QgZ3VhcmFudGVlZCBidXQgaXQncyB1c2VmdWwgdG8gaGF2ZSBhIHRlc3QgdGhhdCB3b3VsZAorICAgIC8vIGNhdGNoIGNoYW5nZXMgaW4gdGhpcyBhcmVhLgorICAgIEVYUEVDVF9USEFUKCpzb3VyY2UsIEVsZW1lbnRzQXJlKCIxIiwgIjIiKSk7CisgIH0KKyAgeworICAgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+IHNvdXJjZTsKKyAgICAqc291cmNlLkFkZCgpID0gIjEiOworICAgICpzb3VyY2UuQWRkKCkgPSAiMiI7CisgICAgQXJlbmEgYXJlbmE7CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4qIGRlc3RpbmF0aW9uID0KKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4+KCZhcmVuYSk7CisgICAgKmRlc3RpbmF0aW9uLT5BZGQoKSA9ICIzIjsKKyAgICAqZGVzdGluYXRpb24gPSBzdGQ6Om1vdmUoc291cmNlKTsKKyAgICBFWFBFQ1RfVEhBVCgqZGVzdGluYXRpb24sIEVsZW1lbnRzQXJlKCIxIiwgIjIiKSk7CisgICAgLy8gVGhpcyBwcm9wZXJ0eSBpc24ndCBndWFyYW50ZWVkIGJ1dCBpdCdzIHVzZWZ1bCB0byBoYXZlIGEgdGVzdCB0aGF0IHdvdWxkCisgICAgLy8gY2F0Y2ggY2hhbmdlcyBpbiB0aGlzIGFyZWEuCisgICAgRVhQRUNUX1RIQVQoc291cmNlLCBFbGVtZW50c0FyZSgiMSIsICIyIikpOworICB9CisgIHsKKyAgICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBmaWVsZDsKKyAgICAvLyBBbiBhbGlhcyB0byBkZWZlYXQgLVdzZWxmLW1vdmUuCisgICAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4mIGFsaWFzID0gZmllbGQ7CisgICAgKmZpZWxkLkFkZCgpID0gIjEiOworICAgICpmaWVsZC5BZGQoKSA9ICIyIjsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyogY29uc3QqIGRhdGEgPSBmaWVsZC5kYXRhKCk7CisgICAgZmllbGQgPSBzdGQ6Om1vdmUoYWxpYXMpOworICAgIEVYUEVDVF9FUShkYXRhLCBmaWVsZC5kYXRhKCkpOworICAgIEVYUEVDVF9USEFUKGZpZWxkLCBFbGVtZW50c0FyZSgiMSIsICIyIikpOworICB9CisgIHsKKyAgICBBcmVuYSBhcmVuYTsKKyAgICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiogZmllbGQgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPj4oJmFyZW5hKTsKKyAgICAqZmllbGQtPkFkZCgpID0gIjEiOworICAgICpmaWVsZC0+QWRkKCkgPSAiMiI7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcqIGNvbnN0KiBkYXRhID0gZmllbGQtPmRhdGEoKTsKKyAgICAqZmllbGQgPSBzdGQ6Om1vdmUoKmZpZWxkKTsKKyAgICBFWFBFQ1RfRVEoZGF0YSwgZmllbGQtPmRhdGEoKSk7CisgICAgRVhQRUNUX1RIQVQoKmZpZWxkLCBFbGVtZW50c0FyZSgiMSIsICIyIikpOworICB9Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgTXV0YWJsZURhdGFJc011dGFibGUpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gZmllbGQ7CisgICpmaWVsZC5BZGQoKSA9ICIxIjsKKyAgRVhQRUNUX0VRKCIxIiwgZmllbGQuR2V0KDApKTsKKyAgLy8gVGhlIGZhY3QgdGhhdCB0aGlzIGxpbmUgY29tcGlsZXMgd291bGQgYmUgZW5vdWdoLCBidXQgd2UnbGwgY2hlY2sgdGhlCisgIC8vIHZhbHVlIGFueXdheS4KKyAgc3RkOjpzdHJpbmcqKiBkYXRhID0gZmllbGQubXV0YWJsZV9kYXRhKCk7CisgICoqZGF0YSA9ICIyIjsKKyAgRVhQRUNUX0VRKCIyIiwgZmllbGQuR2V0KDApKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBTdWJzY3JpcHRPcGVyYXRvcnMpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gZmllbGQ7CisgICpmaWVsZC5BZGQoKSA9ICIxIjsKKyAgRVhQRUNUX0VRKCIxIiwgZmllbGQuR2V0KDApKTsKKyAgRVhQRUNUX0VRKCIxIiwgZmllbGRbMF0pOworICBFWFBFQ1RfRVEoZmllbGQuTXV0YWJsZSgwKSwgJmZpZWxkWzBdKTsKKyAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4mIGNvbnN0X2ZpZWxkID0gZmllbGQ7CisgIEVYUEVDVF9FUSgqZmllbGQuZGF0YSgpLCAmY29uc3RfZmllbGRbMF0pOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIEV4dHJhY3RTdWJyYW5nZSkgeworICAvLyBFeGhhdXN0aXZlbHkgdGVzdCBldmVyeSBzdWJyYW5nZSBpbiBhcnJheXMgb2YgYWxsIHNpemVzIGZyb20gMCB0aHJvdWdoIDkKKyAgLy8gd2l0aCAwIHRocm91Z2ggMyBjbGVhcmVkIGVsZW1lbnRzIGF0IHRoZSBlbmQuCisgIGZvciAoaW50IHN6ID0gMDsgc3ogPCAxMDsgKytzeikgeworICAgIGZvciAoaW50IG51bSA9IDA7IG51bSA8PSBzejsgKytudW0pIHsKKyAgICAgIGZvciAoaW50IHN0YXJ0ID0gMDsgc3RhcnQgPCBzeiAtIG51bTsgKytzdGFydCkgeworICAgICAgICBmb3IgKGludCBleHRyYSA9IDA7IGV4dHJhIDwgNDsgKytleHRyYSkgeworICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nKj4gc3ViamVjdDsKKworICAgICAgICAgIC8vIENyZWF0ZSBhbiBhcnJheSB3aXRoICJzeiIgZWxlbWVudHMgYW5kICJleHRyYSIgY2xlYXJlZCBlbGVtZW50cy4KKyAgICAgICAgICAvLyBVc2UgYW4gYXJlbmEgdG8gYXZvaWQgY29waWVzIGZyb20gZGVidWctYnVpbGQgc3RhYmlsaXR5IGNoZWNrcy4KKyAgICAgICAgICBBcmVuYSBhcmVuYTsKKyAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBmaWVsZCgmYXJlbmEpOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ogKyBleHRyYTsgKytpKSB7CisgICAgICAgICAgICBzdWJqZWN0LnB1c2hfYmFjayhuZXcgc3RkOjpzdHJpbmcoKSk7CisgICAgICAgICAgICBmaWVsZC5BZGRBbGxvY2F0ZWQoc3ViamVjdFtpXSk7CisgICAgICAgICAgfQorICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIHN6ICsgZXh0cmEpOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0cmE7ICsraSkgZmllbGQuUmVtb3ZlTGFzdCgpOworICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIHN6KTsKKyAgICAgICAgICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIGV4dHJhKTsKKworICAgICAgICAgIC8vIENyZWF0ZSBhIGNhdGNoZXIgYXJyYXkgYW5kIGNhbGwgRXh0cmFjdFN1YnJhbmdlLgorICAgICAgICAgIHN0ZDo6c3RyaW5nKiBjYXRjaGVyWzEwXTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIGNhdGNoZXJbaV0gPSBudWxscHRyOworICAgICAgICAgIGZpZWxkLkV4dHJhY3RTdWJyYW5nZShzdGFydCwgbnVtLCBjYXRjaGVyKTsKKworICAgICAgICAgIC8vIERvZXMgdGhlIHJlc3VsdGluZyBhcnJheSBoYXZlIHRoZSByaWdodCBzaXplPworICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIHN6IC0gbnVtKTsKKworICAgICAgICAgIC8vIFdlcmUgdGhlIHJlbW92ZWQgZWxlbWVudHMgZXh0cmFjdGVkIGludG8gdGhlIGNhdGNoZXIgYXJyYXk/CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkKKyAgICAgICAgICAgIEVYUEVDVF9FUSgqY2F0Y2hlcltpXSwgKnN1YmplY3Rbc3RhcnQgKyBpXSk7CisgICAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIGNhdGNoZXJbbnVtXSk7CisKKyAgICAgICAgICAvLyBEb2VzIHRoZSByZXN1bHRpbmcgYXJyYXkgY29udGFpbiB0aGUgcmlnaHQgdmFsdWVzPworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhcnQ7ICsraSkKKyAgICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5NdXRhYmxlKGkpLCBzdWJqZWN0W2ldKTsKKyAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBmaWVsZC5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5NdXRhYmxlKGkpLCBzdWJqZWN0W2kgKyBudW1dKTsKKworICAgICAgICAgIC8vIFJlaW5zdGF0ZSB0aGUgY2xlYXJlZCBlbGVtZW50cy4KKyAgICAgICAgICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIGV4dHJhKTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhOyArK2kpIGZpZWxkLkFkZCgpOworICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgMCk7CisgICAgICAgICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgc3ogLSBudW0gKyBleHRyYSk7CisKKyAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGV4dHJhIGVsZW1lbnRzIGFyZSBhbGwgdGhlcmUgKGluIHNvbWUgb3JkZXIpLgorICAgICAgICAgIGZvciAoaW50IGkgPSBzejsgaSA8IHN6ICsgZXh0cmE7ICsraSkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBzejsgaiA8IHN6ICsgZXh0cmE7ICsraikgeworICAgICAgICAgICAgICBpZiAoZmllbGQuTXV0YWJsZShqIC0gbnVtKSA9PSBzdWJqZWN0W2ldKSBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRVhQRUNUX0VRKGNvdW50LCAxKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBSZWxlYXNlIHRoZSBjYXVnaHQgZWxlbWVudHMuCisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkgZGVsZXRlIGNhdGNoZXJbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBEZWxldGVTdWJyYW5nZSkgeworICAvLyBEZWxldGVTdWJyYW5nZSBpcyBhIHRyaXZpYWwgZXh0ZW5zaW9uIG9mIEV4dGVuZFN1YnJhbmdlLgorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIEl0ZXJhdG9yIHRlc3RzIHN0b2xlbiBmcm9tIG5ldC9wcm90by9wcm90by1hcnJheV91bml0dGVzdC4KK2NsYXNzIFJlcGVhdGVkRmllbGRJdGVyYXRvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICBwcm90b19hcnJheV8uQWRkKGkpOworICAgIH0KKyAgfQorCisgIFJlcGVhdGVkRmllbGQ8aW50PiBwcm90b19hcnJheV87Cit9OworCitURVNUX0YoUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yVGVzdCwgQ29udmVydGlibGUpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+OjppdGVyYXRvciBpdGVyID0gcHJvdG9fYXJyYXlfLmJlZ2luKCk7CisgIFJlcGVhdGVkRmllbGQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyID0gaXRlcjsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+Ojp2YWx1ZV90eXBlIHZhbHVlID0gKmNfaXRlcjsKKyAgRVhQRUNUX0VRKDAsIHZhbHVlKTsKK30KKworVEVTVF9GKFJlcGVhdGVkRmllbGRJdGVyYXRvclRlc3QsIE11dGFibGVJdGVyYXRpb24pIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+OjppdGVyYXRvciBpdGVyID0gcHJvdG9fYXJyYXlfLmJlZ2luKCk7CisgIEVYUEVDVF9FUSgwLCAqaXRlcik7CisgICsraXRlcjsKKyAgRVhQRUNUX0VRKDEsICppdGVyKyspOworICBFWFBFQ1RfRVEoMiwgKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9UUlVFKHByb3RvX2FycmF5Xy5lbmQoKSA9PSBpdGVyKTsKKworICBFWFBFQ1RfRVEoMiwgKihwcm90b19hcnJheV8uZW5kKCkgLSAxKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSXRlcmF0b3JUZXN0LCBDb25zdEl0ZXJhdGlvbikgeworICBjb25zdCBSZXBlYXRlZEZpZWxkPGludD4mIGNvbnN0X3Byb3RvX2FycmF5ID0gcHJvdG9fYXJyYXlfOworICBSZXBlYXRlZEZpZWxkPGludD46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBjb25zdF9wcm90b19hcnJheS5iZWdpbigpOworICBFWFBFQ1RfRVEoMCwgKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9FUSgxLCAqaXRlcisrKTsKKyAgRVhQRUNUX0VRKDIsICppdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfVFJVRShjb25zdF9wcm90b19hcnJheS5lbmQoKSA9PSBpdGVyKTsKKyAgRVhQRUNUX0VRKDIsICooY29uc3RfcHJvdG9fYXJyYXkuZW5kKCkgLSAxKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSXRlcmF0b3JUZXN0LCBNdXRhdGlvbikgeworICBSZXBlYXRlZEZpZWxkPGludD46Oml0ZXJhdG9yIGl0ZXIgPSBwcm90b19hcnJheV8uYmVnaW4oKTsKKyAgKml0ZXIgPSA3OworICBFWFBFQ1RfRVEoNywgcHJvdG9fYXJyYXlfLkdldCgwKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImZvbyIpOworICAgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJiYXIiKTsKKyAgICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYmF6Iik7CisgIH0KKworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBwcm90b19hcnJheV87Cit9OworCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgQ29udmVydGlibGUpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBwcm90b19hcnJheV8uYmVnaW4oKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlciA9IGl0ZXI7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Ojp2YWx1ZV90eXBlIHZhbHVlID0gKmNfaXRlcjsKKyAgRVhQRUNUX0VRKCJmb28iLCB2YWx1ZSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBNdXRhYmxlSXRlcmF0aW9uKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gcHJvdG9fYXJyYXlfLmJlZ2luKCk7CisgIEVYUEVDVF9FUSgiZm9vIiwgKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9FUSgiYmFyIiwgKihpdGVyKyspKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqaXRlcik7CisgICsraXRlcjsKKyAgRVhQRUNUX1RSVUUocHJvdG9fYXJyYXlfLmVuZCgpID09IGl0ZXIpOworICBFWFBFQ1RfRVEoImJheiIsICooLS1wcm90b19hcnJheV8uZW5kKCkpKTsKK30KKworVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRJdGVyYXRvclRlc3QsIENvbnN0SXRlcmF0aW9uKSB7CisgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+JiBjb25zdF9wcm90b19hcnJheSA9IHByb3RvX2FycmF5XzsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPQorICAgICAgY29uc3RfcHJvdG9fYXJyYXkuYmVnaW4oKTsKKyAgaXRlciAtIGNvbnN0X3Byb3RvX2FycmF5LmNiZWdpbigpOworICBFWFBFQ1RfRVEoImZvbyIsICppdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfRVEoImJhciIsICooaXRlcisrKSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9UUlVFKGNvbnN0X3Byb3RvX2FycmF5LmVuZCgpID09IGl0ZXIpOworICBFWFBFQ1RfRVEoImJheiIsICooLS1jb25zdF9wcm90b19hcnJheS5lbmQoKSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgTXV0YWJsZVJldmVyc2VJdGVyYXRpb24pIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46OnJldmVyc2VfaXRlcmF0b3IgaXRlciA9IHByb3RvX2FycmF5Xy5yYmVnaW4oKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqaXRlcik7CisgICsraXRlcjsKKyAgRVhQRUNUX0VRKCJiYXIiLCAqKGl0ZXIrKykpOworICBFWFBFQ1RfRVEoImZvbyIsICppdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfVFJVRShwcm90b19hcnJheV8ucmVuZCgpID09IGl0ZXIpOworICBFWFBFQ1RfRVEoImZvbyIsICooLS1wcm90b19hcnJheV8ucmVuZCgpKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBDb25zdFJldmVyc2VJdGVyYXRpb24pIHsKKyAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4mIGNvbnN0X3Byb3RvX2FycmF5ID0gcHJvdG9fYXJyYXlfOworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdGVyID0KKyAgICAgIGNvbnN0X3Byb3RvX2FycmF5LnJiZWdpbigpOworICBFWFBFQ1RfRVEoImJheiIsICppdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfRVEoImJhciIsICooaXRlcisrKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9UUlVFKGNvbnN0X3Byb3RvX2FycmF5LnJlbmQoKSA9PSBpdGVyKTsKKyAgRVhQRUNUX0VRKCJmb28iLCAqKC0tY29uc3RfcHJvdG9fYXJyYXkucmVuZCgpKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBSYW5kb21BY2Nlc3MpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBwcm90b19hcnJheV8uYmVnaW4oKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ZXIyID0gaXRlcjsKKyAgKytpdGVyMjsKKyAgKytpdGVyMjsKKyAgRVhQRUNUX1RSVUUoaXRlciArIDIgPT0gaXRlcjIpOworICBFWFBFQ1RfVFJVRShpdGVyID09IGl0ZXIyIC0gMik7CisgIEVYUEVDVF9FUSgiYmF6IiwgaXRlclsyXSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgKihpdGVyICsgMikpOworICBFWFBFQ1RfRVEoMywgcHJvdG9fYXJyYXlfLmVuZCgpIC0gcHJvdG9fYXJyYXlfLmJlZ2luKCkpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgUmFuZG9tQWNjZXNzQ29uc3QpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBwcm90b19hcnJheV8uY2JlZ2luKCk7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyMiA9IGl0ZXI7CisgICsraXRlcjI7CisgICsraXRlcjI7CisgIEVYUEVDVF9UUlVFKGl0ZXIgKyAyID09IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA9PSBpdGVyMiAtIDIpOworICBFWFBFQ1RfRVEoImJheiIsIGl0ZXJbMl0pOworICBFWFBFQ1RfRVEoImJheiIsICooaXRlciArIDIpKTsKKyAgRVhQRUNUX0VRKDMsIHByb3RvX2FycmF5Xy5jZW5kKCkgLSBwcm90b19hcnJheV8uY2JlZ2luKCkpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgRGlmZmVyZW5jZUNvbnN0Q29udmVyc2lvbikgeworICBFWFBFQ1RfRVEoMywgcHJvdG9fYXJyYXlfLmVuZCgpIC0gcHJvdG9fYXJyYXlfLmNiZWdpbigpKTsKKyAgRVhQRUNUX0VRKDMsIHByb3RvX2FycmF5Xy5jZW5kKCkgLSBwcm90b19hcnJheV8uYmVnaW4oKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBDb21wYXJhYmxlKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gcHJvdG9fYXJyYXlfLmJlZ2luKCk7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyMiA9IGl0ZXIgKyAxOworICBFWFBFQ1RfVFJVRShpdGVyID09IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA8IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA8PSBpdGVyMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPD0gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIyID4gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIyID49IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyID49IGl0ZXIpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgQ29tcGFyYWJsZUNvbnN0Q29udmVyc2lvbikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXRlciA9IHByb3RvX2FycmF5Xy5iZWdpbigpOworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjIgPSBpdGVyICsgMTsKKyAgRVhQRUNUX1RSVUUoaXRlciA9PSBpdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA9PSBwcm90b19hcnJheV8uY2JlZ2luKCkpOworICBFWFBFQ1RfVFJVRShwcm90b19hcnJheV8uY2JlZ2luKCkgPT0gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gaXRlcjIpOworICBFWFBFQ1RfVFJVRShpdGVyMiAhPSBpdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA8IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA8PSBpdGVyMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPD0gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIyID4gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIyID49IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyID49IGl0ZXIpOworfQorCisvLyBVbmluaXRpYWxpemVkIGl0ZXJhdG9yIGRvZXMgbm90IHBvaW50IHRvIGFueSBvZiB0aGUgUmVwZWF0ZWRQdHJGaWVsZC4KK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBVbmluaXRpYWxpemVkSXRlcmF0b3IpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ZXI7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLmJlZ2luKCkpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IHByb3RvX2FycmF5Xy5iZWdpbigpICsgMSk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLmJlZ2luKCkgKyAyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBwcm90b19hcnJheV8uYmVnaW4oKSArIDMpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IHByb3RvX2FycmF5Xy5lbmQoKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBTVExBbGdvcml0aG1zX2xvd2VyX2JvdW5kKSB7CisgIHByb3RvX2FycmF5Xy5DbGVhcigpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYSIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYyIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiZCIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigibiIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigicCIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigieCIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigieSIpOworCisgIHN0ZDo6c3RyaW5nIHYgPSAiZiI7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICBzdGQ6Omxvd2VyX2JvdW5kKHByb3RvX2FycmF5Xy5iZWdpbigpLCBwcm90b19hcnJheV8uZW5kKCksIHYpOworCisgIEVYUEVDVF9FUSgqaXQsICJuIik7CisgIEVYUEVDVF9UUlVFKGl0ID09IHByb3RvX2FycmF5Xy5iZWdpbigpICsgMyk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBNdXRhdGlvbikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXRlciA9IHByb3RvX2FycmF5Xy5iZWdpbigpOworICAqaXRlciA9ICJtb28iOworICBFWFBFQ1RfRVEoIm1vbyIsIHByb3RvX2FycmF5Xy5HZXQoMCkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiZm9vIik7CisgICAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImJhciIpOworICAgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJiYXoiKTsKKyAgICBjb25zdF9wcm90b19hcnJheV8gPSAmcHJvdG9fYXJyYXlfOworICB9CisKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz4gcHJvdG9fYXJyYXlfOworICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiogY29uc3RfcHJvdG9fYXJyYXlfOworfTsKKworVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBDb252ZXJ0aWJsZVB0cikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPjo6cG9pbnRlcl9pdGVyYXRvciBpdGVyID0KKyAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCk7CisgIHN0YXRpY19jYXN0PHZvaWQ+KGl0ZXIpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIENvbnZlcnRpYmxlQ29uc3RQdHIpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46OmNvbnN0X3BvaW50ZXJfaXRlcmF0b3IgaXRlciA9CisgICAgICBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKTsKKyAgc3RhdGljX2Nhc3Q8dm9pZD4oaXRlcik7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCwgTXV0YWJsZVB0ckl0ZXJhdGlvbikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPjo6cG9pbnRlcl9pdGVyYXRvciBpdGVyID0KKyAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCk7CisgIEVYUEVDVF9FUSgiZm9vIiwgKippdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfRVEoImJhciIsICoqKGl0ZXIrKykpOworICBFWFBFQ1RfRVEoImJheiIsICoqaXRlcik7CisgICsraXRlcjsKKyAgRVhQRUNUX1RSVUUocHJvdG9fYXJyYXlfLnBvaW50ZXJfZW5kKCkgPT0gaXRlcik7CisgIEVYUEVDVF9FUSgiYmF6IiwgKiooLS1wcm90b19hcnJheV8ucG9pbnRlcl9lbmQoKSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIE11dGFibGVDb25zdFB0ckl0ZXJhdGlvbikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvciBpdGVyID0KKyAgICAgIGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9iZWdpbigpOworICBFWFBFQ1RfRVEoImZvbyIsICoqaXRlcik7CisgICsraXRlcjsKKyAgRVhQRUNUX0VRKCJiYXIiLCAqKihpdGVyKyspKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9UUlVFKGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9lbmQoKSA9PSBpdGVyKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqKigtLWNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9lbmQoKSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIFJhbmRvbVB0ckFjY2VzcykgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPjo6cG9pbnRlcl9pdGVyYXRvciBpdGVyID0KKyAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCk7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ZXIyID0gaXRlcjsKKyAgKytpdGVyMjsKKyAgKytpdGVyMjsKKyAgRVhQRUNUX1RSVUUoaXRlciArIDIgPT0gaXRlcjIpOworICBFWFBFQ1RfVFJVRShpdGVyID09IGl0ZXIyIC0gMik7CisgIEVYUEVDVF9FUSgiYmF6IiwgKml0ZXJbMl0pOworICBFWFBFQ1RfRVEoImJheiIsICoqKGl0ZXIgKyAyKSk7CisgIEVYUEVDVF9FUSgzLCBwcm90b19hcnJheV8uZW5kKCkgLSBwcm90b19hcnJheV8uYmVnaW4oKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCwgUmFuZG9tQ29uc3RQdHJBY2Nlc3MpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46OmNvbnN0X3BvaW50ZXJfaXRlcmF0b3IgaXRlciA9CisgICAgICBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46OmNvbnN0X3BvaW50ZXJfaXRlcmF0b3IgaXRlcjIgPSBpdGVyOworICArK2l0ZXIyOworICArK2l0ZXIyOworICBFWFBFQ1RfVFJVRShpdGVyICsgMiA9PSBpdGVyMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gaXRlcjIgLSAyKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqaXRlclsyXSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgKiooaXRlciArIDIpKTsKKyAgRVhQRUNUX0VRKDMsIGNvbnN0X3Byb3RvX2FycmF5Xy0+ZW5kKCkgLSBjb25zdF9wcm90b19hcnJheV8tPmJlZ2luKCkpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIERpZmZlcmVuY2VDb25zdENvbnZlcnNpb24pIHsKKyAgRVhQRUNUX0VRKDMsCisgICAgICAgICAgICBwcm90b19hcnJheV8ucG9pbnRlcl9lbmQoKSAtIGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9iZWdpbigpKTsKKyAgRVhQRUNUX0VRKDMsCisgICAgICAgICAgICBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfZW5kKCkgLSBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpKTsKK30KKworVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBDb21wYXJhYmxlUHRyKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQorICAgICAgcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46OnBvaW50ZXJfaXRlcmF0b3IgaXRlcjIgPSBpdGVyICsgMTsKKyAgRVhQRUNUX1RSVUUoaXRlciA9PSBpdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBpdGVyMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPCBpdGVyMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPD0gaXRlcjIpOworICBFWFBFQ1RfVFJVRShpdGVyIDw9IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyMiA+IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyMiA+PSBpdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA+PSBpdGVyKTsKK30KKworVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBDb21wYXJhYmxlQ29uc3RQdHIpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46OmNvbnN0X3BvaW50ZXJfaXRlcmF0b3IgaXRlciA9CisgICAgICBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46OmNvbnN0X3BvaW50ZXJfaXRlcmF0b3IgaXRlcjIgPSBpdGVyICsgMTsKKyAgRVhQRUNUX1RSVUUoaXRlciA9PSBpdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBpdGVyMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPCBpdGVyMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPD0gaXRlcjIpOworICBFWFBFQ1RfVFJVRShpdGVyIDw9IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyMiA+IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyMiA+PSBpdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA+PSBpdGVyKTsKK30KKworVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBDb21wYXJhYmxlQ29uc3RDb252ZXJzaW9uKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQorICAgICAgcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz46OmNvbnN0X3BvaW50ZXJfaXRlcmF0b3IgaXRlcjIgPSBpdGVyICsgMTsKKyAgRVhQRUNUX1RSVUUoaXRlciA9PSBpdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA9PSBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKSk7CisgIEVYUEVDVF9UUlVFKGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9iZWdpbigpID09IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlcjIgIT0gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPCBpdGVyMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPD0gaXRlcjIpOworICBFWFBFQ1RfVFJVRShpdGVyIDw9IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyMiA+IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyMiA+PSBpdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA+PSBpdGVyKTsKK30KKworLy8gVW5pbml0aWFsaXplZCBpdGVyYXRvciBkb2VzIG5vdCBwb2ludCB0byBhbnkgb2YgdGhlIFJlcGVhdGVkUHRyT3ZlclB0cnMuCisvLyBEZXJlZmVyZW5jaW5nIGFuIHVuaW5pdGlhbGl6ZWQgaXRlcmF0b3IgY3Jhc2hlcyB0aGUgcHJvY2Vzcy4KK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCwgVW5pbml0aWFsaXplZFB0ckl0ZXJhdG9yKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ZXI7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKSk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKSArIDEpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCkgKyAyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpICsgMyk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLnBvaW50ZXJfZW5kKCkpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIFVuaW5pdGlhbGl6ZWRDb25zdFB0ckl0ZXJhdG9yKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yIGl0ZXI7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2JlZ2luKCkpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9iZWdpbigpICsgMSk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2JlZ2luKCkgKyAyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKSArIDMpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9lbmQoKSk7Cit9CisKKy8vIFRoaXMgY29tcGFyaXNvbiBmdW5jdG9yIGlzIHJlcXVpcmVkIGJ5IHRoZSB0ZXN0cyBmb3IgUmVwZWF0ZWRQdHJPdmVyUHRycy4KKy8vIFRoZXkgb3BlcmF0ZSBvbiBzdHJpbmdzIGFuZCBuZWVkIHRvIGNvbXBhcmUgc3RyaW5ncyBhcyBzdHJpbmdzIGluCisvLyBhbnkgc3RsIGFsZ29yaXRobSwgZXZlbiB0aG91Z2ggdGhlIGl0ZXJhdG9yIHJldHVybnMgYSBwb2ludGVyIHRvIGEKKy8vIHN0cmluZworLy8gLSBpLmUuICppdGVyIGhhcyB0eXBlIHN0ZDo6c3RyaW5nKi4KK3N0cnVjdCBTdHJpbmdMZXNzVGhhbiB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZyogeiwgY29uc3Qgc3RkOjpzdHJpbmcqIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gKnogPCAqeTsKKyAgfQorfTsKKworVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBQdHJTVExBbGdvcml0aG1zX2xvd2VyX2JvdW5kKSB7CisgIHByb3RvX2FycmF5Xy5DbGVhcigpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYSIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYyIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiZCIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigibiIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigicCIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigieCIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigieSIpOworCisgIHsKKyAgICBzdGQ6OnN0cmluZyB2ID0gImYiOworICAgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgc3RkOjpsb3dlcl9ib3VuZChwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2VuZCgpLCAmdiwgU3RyaW5nTGVzc1RoYW4oKSk7CisKKyAgICBHT09HTEVfQ0hFQ0soKml0ICE9IG51bGxwdHIpOworCisgICAgRVhQRUNUX0VRKCoqaXQsICJuIik7CisgICAgRVhQRUNUX1RSVUUoaXQgPT0gcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKSArIDMpOworICB9CisgIHsKKyAgICBzdGQ6OnN0cmluZyB2ID0gImYiOworICAgIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yIGl0ID0gc3RkOjpsb3dlcl9ib3VuZCgKKyAgICAgICAgY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2JlZ2luKCksIGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9lbmQoKSwKKyAgICAgICAgJnYsIFN0cmluZ0xlc3NUaGFuKCkpOworCisgICAgR09PR0xFX0NIRUNLKCppdCAhPSBudWxscHRyKTsKKworICAgIEVYUEVDVF9FUSgqKml0LCAibiIpOworICAgIEVYUEVDVF9UUlVFKGl0ID09IGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9iZWdpbigpICsgMyk7CisgIH0KK30KKworVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBQdHJNdXRhdGlvbikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPjo6cG9pbnRlcl9pdGVyYXRvciBpdGVyID0KKyAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCk7CisgICoqaXRlciA9ICJtb28iOworICBFWFBFQ1RfRVEoIm1vbyIsIHByb3RvX2FycmF5Xy5HZXQoMCkpOworCisgIEVYUEVDVF9FUSgiYmFyIiwgcHJvdG9fYXJyYXlfLkdldCgxKSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgcHJvdG9fYXJyYXlfLkdldCgyKSk7CisgICsraXRlcjsKKyAgZGVsZXRlICppdGVyOworICAqaXRlciA9IG5ldyBzdGQ6OnN0cmluZygiYSIpOworICArK2l0ZXI7CisgIGRlbGV0ZSAqaXRlcjsKKyAgKml0ZXIgPSBuZXcgc3RkOjpzdHJpbmcoImIiKTsKKyAgRVhQRUNUX0VRKCJhIiwgcHJvdG9fYXJyYXlfLkdldCgxKSk7CisgIEVYUEVDVF9FUSgiYiIsIHByb3RvX2FycmF5Xy5HZXQoMikpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIFNvcnQpIHsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImMiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImQiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oIm4iKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oInAiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImEiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oInkiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oIngiKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBwcm90b19hcnJheV8uR2V0KDApKTsKKyAgRVhQRUNUX0VRKCJuIiwgcHJvdG9fYXJyYXlfLkdldCg1KSk7CisgIEVYUEVDVF9FUSgieCIsIHByb3RvX2FycmF5Xy5HZXQoOSkpOworICBzdGQ6OnNvcnQocHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKSwgcHJvdG9fYXJyYXlfLnBvaW50ZXJfZW5kKCksCisgICAgICAgICAgICBTdHJpbmdMZXNzVGhhbigpKTsKKyAgRVhQRUNUX0VRKCJhIiwgcHJvdG9fYXJyYXlfLkdldCgwKSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgcHJvdG9fYXJyYXlfLkdldCgyKSk7CisgIEVYUEVDVF9FUSgieSIsIHByb3RvX2FycmF5Xy5HZXQoOSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVW5pdC10ZXN0cyBmb3IgdGhlIGluc2VydCBpdGVyYXRvcnMKKy8vIGdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIsCisvLyBnb29nbGU6OnByb3RvYnVmOjpBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydGVyCisvLyBQb3J0ZWQgZnJvbSB1dGlsL2d0bC9wcm90by1hcnJheS1pdGVyYXRvcnNfdW5pdHRlc3QuCisKK2NsYXNzIFJlcGVhdGVkRmllbGRJbnNlcnRpb25JdGVyYXRvcnNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RkOjpsaXN0PGRvdWJsZT4gaGFsdmVzOworICBzdGQ6Omxpc3Q8aW50PiBmaWJvbmFjY2k7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB3b3JkczsKKyAgdHlwZWRlZiBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UgTmVzdGVkOworICBOZXN0ZWQgbmVzdGVkc1syXTsKKyAgc3RkOjp2ZWN0b3I8TmVzdGVkKj4gbmVzdGVkX3B0cnM7CisgIFRlc3RBbGxUeXBlcyBwcm90b2J1ZmZlcjsKKworICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIGZpYm9uYWNjaS5wdXNoX2JhY2soMSk7CisgICAgZmlib25hY2NpLnB1c2hfYmFjaygxKTsKKyAgICBmaWJvbmFjY2kucHVzaF9iYWNrKDIpOworICAgIGZpYm9uYWNjaS5wdXNoX2JhY2soMyk7CisgICAgZmlib25hY2NpLnB1c2hfYmFjayg1KTsKKyAgICBmaWJvbmFjY2kucHVzaF9iYWNrKDgpOworICAgIHN0ZDo6Y29weShmaWJvbmFjY2kuYmVnaW4oKSwgZmlib25hY2NpLmVuZCgpLAorICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkQmFja0luc2VydGVyKHByb3RvYnVmZmVyLm11dGFibGVfcmVwZWF0ZWRfaW50MzIoKSkpOworCisgICAgaGFsdmVzLnB1c2hfYmFjaygxLjApOworICAgIGhhbHZlcy5wdXNoX2JhY2soMC41KTsKKyAgICBoYWx2ZXMucHVzaF9iYWNrKDAuMjUpOworICAgIGhhbHZlcy5wdXNoX2JhY2soMC4xMjUpOworICAgIGhhbHZlcy5wdXNoX2JhY2soMC4wNjI1KTsKKyAgICBzdGQ6OmNvcHkoaGFsdmVzLmJlZ2luKCksIGhhbHZlcy5lbmQoKSwKKyAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRlcihwcm90b2J1ZmZlci5tdXRhYmxlX3JlcGVhdGVkX2RvdWJsZSgpKSk7CisKKyAgICB3b3Jkcy5wdXNoX2JhY2soIkFibGUiKTsKKyAgICB3b3Jkcy5wdXNoX2JhY2soIndhcyIpOworICAgIHdvcmRzLnB1c2hfYmFjaygiSSIpOworICAgIHdvcmRzLnB1c2hfYmFjaygiZXJlIik7CisgICAgd29yZHMucHVzaF9iYWNrKCJJIik7CisgICAgd29yZHMucHVzaF9iYWNrKCJzYXciKTsKKyAgICB3b3Jkcy5wdXNoX2JhY2soIkVsYmEiKTsKKyAgICBzdGQ6OmNvcHkod29yZHMuYmVnaW4oKSwgd29yZHMuZW5kKCksCisgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIocHJvdG9idWZmZXIubXV0YWJsZV9yZXBlYXRlZF9zdHJpbmcoKSkpOworCisgICAgbmVzdGVkc1swXS5zZXRfYmIoMTcpOworICAgIG5lc3RlZHNbMV0uc2V0X2JiKDQ3MTEpOworICAgIHN0ZDo6Y29weSgmbmVzdGVkc1swXSwgJm5lc3RlZHNbMl0sCisgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIoCisgICAgICAgICAgICAgICAgICBwcm90b2J1ZmZlci5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCkpKTsKKworICAgIG5lc3RlZF9wdHJzLnB1c2hfYmFjayhuZXcgTmVzdGVkKTsKKyAgICBuZXN0ZWRfcHRycy5iYWNrKCktPnNldF9iYigxNzApOworICAgIG5lc3RlZF9wdHJzLnB1c2hfYmFjayhuZXcgTmVzdGVkKTsKKyAgICBuZXN0ZWRfcHRycy5iYWNrKCktPnNldF9iYig0NzExMCk7CisgICAgc3RkOjpjb3B5KG5lc3RlZF9wdHJzLmJlZ2luKCksIG5lc3RlZF9wdHJzLmVuZCgpLAorICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkQmFja0luc2VydGVyKAorICAgICAgICAgICAgICAgICAgcHJvdG9idWZmZXIubXV0YWJsZV9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpKSk7CisgIH0KKworICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGZvciAoYXV0byBwdHIgOiBuZXN0ZWRfcHRycykgeworICAgICAgZGVsZXRlIHB0cjsKKyAgICB9CisgIH0KK307CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSW5zZXJ0aW9uSXRlcmF0b3JzVGVzdCwgRmlib25hY2NpKSB7CisgIEVYUEVDVF9UUlVFKHN0ZDo6ZXF1YWwoZmlib25hY2NpLmJlZ2luKCksIGZpYm9uYWNjaS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2J1ZmZlci5yZXBlYXRlZF9pbnQzMigpLmJlZ2luKCkpKTsKKyAgRVhQRUNUX1RSVUUoc3RkOjplcXVhbChwcm90b2J1ZmZlci5yZXBlYXRlZF9pbnQzMigpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZmZXIucmVwZWF0ZWRfaW50MzIoKS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWJvbmFjY2kuYmVnaW4oKSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsIEhhbHZlcykgeworICBFWFBFQ1RfVFJVRShzdGQ6OmVxdWFsKGhhbHZlcy5iZWdpbigpLCBoYWx2ZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZmZXIucmVwZWF0ZWRfZG91YmxlKCkuYmVnaW4oKSkpOworICBFWFBFQ1RfVFJVRShzdGQ6OmVxdWFsKHByb3RvYnVmZmVyLnJlcGVhdGVkX2RvdWJsZSgpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZmZXIucmVwZWF0ZWRfZG91YmxlKCkuZW5kKCksIGhhbHZlcy5iZWdpbigpKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSW5zZXJ0aW9uSXRlcmF0b3JzVGVzdCwgV29yZHMpIHsKKyAgQVNTRVJUX0VRKHdvcmRzLnNpemUoKSwgcHJvdG9idWZmZXIucmVwZWF0ZWRfc3RyaW5nX3NpemUoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgd29yZHMuc2l6ZSgpOyArK2kpCisgICAgRVhQRUNUX0VRKHdvcmRzLmF0KGkpLCBwcm90b2J1ZmZlci5yZXBlYXRlZF9zdHJpbmcoaSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsIFdvcmRzMikgeworICB3b3Jkcy5jbGVhcigpOworICB3b3Jkcy5wdXNoX2JhY2soInNpbmciKTsKKyAgd29yZHMucHVzaF9iYWNrKCJhIik7CisgIHdvcmRzLnB1c2hfYmFjaygic29uZyIpOworICB3b3Jkcy5wdXNoX2JhY2soIm9mIik7CisgIHdvcmRzLnB1c2hfYmFjaygic2l4Iik7CisgIHdvcmRzLnB1c2hfYmFjaygicGVuY2UiKTsKKyAgcHJvdG9idWZmZXIubXV0YWJsZV9yZXBlYXRlZF9zdHJpbmcoKS0+Q2xlYXIoKTsKKyAgc3RkOjpjb3B5KAorICAgICAgd29yZHMuYmVnaW4oKSwgd29yZHMuZW5kKCksCisgICAgICBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydGVyKHByb3RvYnVmZmVyLm11dGFibGVfcmVwZWF0ZWRfc3RyaW5nKCkpKTsKKyAgQVNTRVJUX0VRKHdvcmRzLnNpemUoKSwgcHJvdG9idWZmZXIucmVwZWF0ZWRfc3RyaW5nX3NpemUoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgd29yZHMuc2l6ZSgpOyArK2kpCisgICAgRVhQRUNUX0VRKHdvcmRzLmF0KGkpLCBwcm90b2J1ZmZlci5yZXBlYXRlZF9zdHJpbmcoaSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsIE5lc3RlZHMpIHsKKyAgQVNTRVJUX0VRKHByb3RvYnVmZmVyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUoKSwgNCk7CisgIEVYUEVDVF9FUShwcm90b2J1ZmZlci5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKS5iYigpLCAxNyk7CisgIEVYUEVDVF9FUShwcm90b2J1ZmZlci5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgxKS5iYigpLCA0NzExKTsKKyAgRVhQRUNUX0VRKHByb3RvYnVmZmVyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDIpLmJiKCksIDE3MCk7CisgIEVYUEVDVF9FUShwcm90b2J1ZmZlci5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgzKS5iYigpLCA0NzExMCk7Cit9CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSW5zZXJ0aW9uSXRlcmF0b3JzVGVzdCwKKyAgICAgICBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkV2l0aFN0cmluZ0ludERhdGEpIHsKKyAgc3RkOjp2ZWN0b3I8TmVzdGVkKj4gZGF0YTsKKyAgVGVzdEFsbFR5cGVzIGdvbGRlbnByb3RvOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBOZXN0ZWQqIG5ld19kYXRhID0gbmV3IE5lc3RlZDsKKyAgICBuZXdfZGF0YS0+c2V0X2JiKGkpOworICAgIGRhdGEucHVzaF9iYWNrKG5ld19kYXRhKTsKKworICAgIG5ld19kYXRhID0gZ29sZGVucHJvdG8uYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCk7CisgICAgbmV3X2RhdGEtPnNldF9iYihpKTsKKyAgfQorICBUZXN0QWxsVHlwZXMgdGVzdHByb3RvOworICBzdGQ6OmNvcHkoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpLAorICAgICAgICAgICAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKKyAgICAgICAgICAgICAgICB0ZXN0cHJvdG8ubXV0YWJsZV9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpKSk7CisgIEVYUEVDVF9FUSh0ZXN0cHJvdG8uRGVidWdTdHJpbmcoKSwgZ29sZGVucHJvdG8uRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSW5zZXJ0aW9uSXRlcmF0b3JzVGVzdCwKKyAgICAgICBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkV2l0aFN0cmluZykgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZyo+IGRhdGE7CisgIFRlc3RBbGxUeXBlcyBnb2xkZW5wcm90bzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgc3RkOjpzdHJpbmcqIG5ld19kYXRhID0gbmV3IHN0ZDo6c3RyaW5nOworICAgICpuZXdfZGF0YSA9ICJuYW1lLSIgKyBTdHJDYXQoaSk7CisgICAgZGF0YS5wdXNoX2JhY2sobmV3X2RhdGEpOworCisgICAgbmV3X2RhdGEgPSBnb2xkZW5wcm90by5hZGRfcmVwZWF0ZWRfc3RyaW5nKCk7CisgICAgKm5ld19kYXRhID0gIm5hbWUtIiArIFN0ckNhdChpKTsKKyAgfQorICBUZXN0QWxsVHlwZXMgdGVzdHByb3RvOworICBzdGQ6OmNvcHkoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpLAorICAgICAgICAgICAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKKyAgICAgICAgICAgICAgICB0ZXN0cHJvdG8ubXV0YWJsZV9yZXBlYXRlZF9zdHJpbmcoKSkpOworICBFWFBFQ1RfRVEodGVzdHByb3RvLkRlYnVnU3RyaW5nKCksIGdvbGRlbnByb3RvLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsCisgICAgICAgVW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkV2l0aFN0cmluZ0ludERhdGEpIHsKKyAgc3RkOjp2ZWN0b3I8TmVzdGVkKj4gZGF0YTsKKyAgQXJlbmEgYXJlbmE7CisgIGF1dG8qIGdvbGRlbnByb3RvID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VGVzdEFsbFR5cGVzPigmYXJlbmEpOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBhdXRvKiBuZXdfZGF0YSA9IGdvbGRlbnByb3RvLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKTsKKyAgICBuZXdfZGF0YS0+c2V0X2JiKGkpOworICAgIGRhdGEucHVzaF9iYWNrKG5ld19kYXRhKTsKKyAgfQorICBhdXRvKiB0ZXN0cHJvdG8gPSBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxUZXN0QWxsVHlwZXM+KCZhcmVuYSk7CisgIHN0ZDo6Y29weShkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCksCisgICAgICAgICAgICBVbnNhZmVBcmVuYUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0ZXIoCisgICAgICAgICAgICAgICAgdGVzdHByb3RvLT5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCkpKTsKKyAgRVhQRUNUX0VRKHRlc3Rwcm90by0+RGVidWdTdHJpbmcoKSwgZ29sZGVucHJvdG8tPkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsCisgICAgICAgVW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkV2l0aFN0cmluZykgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZyo+IGRhdGE7CisgIEFyZW5hIGFyZW5hOworICBhdXRvKiBnb2xkZW5wcm90byA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgYXV0byogbmV3X2RhdGEgPSBnb2xkZW5wcm90by0+YWRkX3JlcGVhdGVkX3N0cmluZygpOworICAgICpuZXdfZGF0YSA9ICJuYW1lLSIgKyBTdHJDYXQoaSk7CisgICAgZGF0YS5wdXNoX2JhY2sobmV3X2RhdGEpOworICB9CisgIGF1dG8qIHRlc3Rwcm90byA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPFRlc3RBbGxUeXBlcz4oJmFyZW5hKTsKKyAgc3RkOjpjb3B5KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwKKyAgICAgICAgICAgIFVuc2FmZUFyZW5hQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKKyAgICAgICAgICAgICAgICB0ZXN0cHJvdG8tPm11dGFibGVfcmVwZWF0ZWRfc3RyaW5nKCkpKTsKKyAgRVhQRUNUX0VRKHRlc3Rwcm90by0+RGVidWdTdHJpbmcoKSwgZ29sZGVucHJvdG8tPkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsIE1vdmVTdHJpbmdzKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzcmMgPSB7ImEiLCAiYiIsICJjIiwgImQifTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvcHkgPQorICAgICAgc3JjOyAgLy8gY29weSBzaW5jZSBtb3ZlIGxlYXZlcyBpbiB1bmRlZmluZWQgc3RhdGUKKyAgVGVzdEFsbFR5cGVzIHRlc3Rwcm90bzsKKyAgc3RkOjptb3ZlKGNvcHkuYmVnaW4oKSwgY29weS5lbmQoKSwKKyAgICAgICAgICAgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIodGVzdHByb3RvLm11dGFibGVfcmVwZWF0ZWRfc3RyaW5nKCkpKTsKKworICBBU1NFUlRfVEhBVCh0ZXN0cHJvdG8ucmVwZWF0ZWRfc3RyaW5nKCksIHRlc3Rpbmc6OkVsZW1lbnRzQXJlQXJyYXkoc3JjKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSW5zZXJ0aW9uSXRlcmF0b3JzVGVzdCwgTW92ZVByb3RvcykgeworICBhdXRvIG1ha2VfbmVzdGVkID0gW10oaW50MzJfdCB4KSB7CisgICAgTmVzdGVkIHJldDsKKyAgICByZXQuc2V0X2JiKHgpOworICAgIHJldHVybiByZXQ7CisgIH07CisgIHN0ZDo6dmVjdG9yPE5lc3RlZD4gc3JjID0ge21ha2VfbmVzdGVkKDMpLCBtYWtlX25lc3RlZCg1KSwgbWFrZV9uZXN0ZWQoNyl9OworICBzdGQ6OnZlY3RvcjxOZXN0ZWQ+IGNvcHkgPSBzcmM7ICAvLyBjb3B5IHNpbmNlIG1vdmUgbGVhdmVzIGluIHVuZGVmaW5lZCBzdGF0ZQorICBUZXN0QWxsVHlwZXMgdGVzdHByb3RvOworICBzdGQ6Om1vdmUoCisgICAgICBjb3B5LmJlZ2luKCksIGNvcHkuZW5kKCksCisgICAgICBSZXBlYXRlZEZpZWxkQmFja0luc2VydGVyKHRlc3Rwcm90by5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCkpKTsKKworICBBU1NFUlRfRVEoc3JjLnNpemUoKSwgdGVzdHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjLnNpemUoKTsgKytpKSB7CisgICAgRVhQRUNUX0VRKHNyY1tpXS5EZWJ1Z1N0cmluZygpLAorICAgICAgICAgICAgICB0ZXN0cHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoaSkuRGVidWdTdHJpbmcoKSk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9wdHJfZmllbGQuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX3B0cl9maWVsZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTg2NzI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9wdHJfZmllbGQuY2MKQEAgLTAsMCArMSwxNTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pbXBsaWNpdF93ZWFrX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydC5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit2b2lkKiogUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkludGVybmFsRXh0ZW5kKGludCBleHRlbmRfYW1vdW50KSB7CisgIGludCBuZXdfc2l6ZSA9IGN1cnJlbnRfc2l6ZV8gKyBleHRlbmRfYW1vdW50OworICBpZiAodG90YWxfc2l6ZV8gPj0gbmV3X3NpemUpIHsKKyAgICAvLyBOLkIuOiByZXBfIGlzIG5vbi1udWxscHRyIGJlY2F1c2UgZXh0ZW5kX2Ftb3VudCBpcyBhbHdheXMgPiAwLCBoZW5jZQorICAgIC8vIHRvdGFsX3NpemUgbXVzdCBiZSBub24temVybyBzaW5jZSBpdCBpcyBsb3dlci1ib3VuZGVkIGJ5IG5ld19zaXplLgorICAgIHJldHVybiAmcmVwXy0+ZWxlbWVudHNbY3VycmVudF9zaXplX107CisgIH0KKyAgUmVwKiBvbGRfcmVwID0gcmVwXzsKKyAgQXJlbmEqIGFyZW5hID0gR2V0T3duaW5nQXJlbmEoKTsKKyAgbmV3X3NpemUgPSBpbnRlcm5hbDo6Q2FsY3VsYXRlUmVzZXJ2ZVNpemU8dm9pZCosIGtSZXBIZWFkZXJTaXplPih0b3RhbF9zaXplXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc2l6ZSk7CisgIEdPT0dMRV9DSEVDS19MRShzdGF0aWNfY2FzdDxpbnQ2NF90PihuZXdfc2l6ZSksCisgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KAorICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkgLSBrUmVwSGVhZGVyU2l6ZSkgLworICAgICAgICAgICAgICAgc2l6ZW9mKG9sZF9yZXAtPmVsZW1lbnRzWzBdKSkpCisgICAgICA8PCAiUmVxdWVzdGVkIHNpemUgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIHNpemVfdC4iOworICBzaXplX3QgYnl0ZXMgPSBrUmVwSGVhZGVyU2l6ZSArIHNpemVvZihvbGRfcmVwLT5lbGVtZW50c1swXSkgKiBuZXdfc2l6ZTsKKyAgaWYgKGFyZW5hID09IG51bGxwdHIpIHsKKyAgICByZXBfID0gcmVpbnRlcnByZXRfY2FzdDxSZXAqPig6Om9wZXJhdG9yIG5ldyhieXRlcykpOworICB9IGVsc2UgeworICAgIHJlcF8gPSByZWludGVycHJldF9jYXN0PFJlcCo+KEFyZW5hOjpDcmVhdGVBcnJheTxjaGFyPihhcmVuYSwgYnl0ZXMpKTsKKyAgfQorICBjb25zdCBpbnQgb2xkX3RvdGFsX3NpemUgPSB0b3RhbF9zaXplXzsKKyAgdG90YWxfc2l6ZV8gPSBuZXdfc2l6ZTsKKyAgaWYgKG9sZF9yZXApIHsKKyAgICBpZiAob2xkX3JlcC0+YWxsb2NhdGVkX3NpemUgPiAwKSB7CisgICAgICBtZW1jcHkocmVwXy0+ZWxlbWVudHMsIG9sZF9yZXAtPmVsZW1lbnRzLAorICAgICAgICAgICAgIG9sZF9yZXAtPmFsbG9jYXRlZF9zaXplICogc2l6ZW9mKHJlcF8tPmVsZW1lbnRzWzBdKSk7CisgICAgfQorICAgIHJlcF8tPmFsbG9jYXRlZF9zaXplID0gb2xkX3JlcC0+YWxsb2NhdGVkX3NpemU7CisKKyAgICBjb25zdCBzaXplX3Qgb2xkX3NpemUgPQorICAgICAgICBvbGRfdG90YWxfc2l6ZSAqIHNpemVvZihyZXBfLT5lbGVtZW50c1swXSkgKyBrUmVwSGVhZGVyU2l6ZTsKKyAgICBpZiAoYXJlbmEgPT0gbnVsbHB0cikgeworICAgICAgaW50ZXJuYWw6OlNpemVkRGVsZXRlKG9sZF9yZXAsIG9sZF9zaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgYXJlbmFfLT5SZXR1cm5BcnJheU1lbW9yeShvbGRfcmVwLCBvbGRfc2l6ZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHJlcF8tPmFsbG9jYXRlZF9zaXplID0gMDsKKyAgfQorICByZXR1cm4gJnJlcF8tPmVsZW1lbnRzW2N1cnJlbnRfc2l6ZV9dOworfQorCit2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZXNlcnZlKGludCBuZXdfc2l6ZSkgeworICBpZiAobmV3X3NpemUgPiBjdXJyZW50X3NpemVfKSB7CisgICAgSW50ZXJuYWxFeHRlbmQobmV3X3NpemUgLSBjdXJyZW50X3NpemVfKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpEZXN0cm95UHJvdG9zKCkgeworICBHT09HTEVfRENIRUNLKHJlcF8pOworICBHT09HTEVfRENIRUNLKGFyZW5hXyA9PSBudWxscHRyKTsKKyAgaW50IG4gPSByZXBfLT5hbGxvY2F0ZWRfc2l6ZTsKKyAgdm9pZCogY29uc3QqIGVsZW1lbnRzID0gcmVwXy0+ZWxlbWVudHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgZGVsZXRlIHN0YXRpY19jYXN0PE1lc3NhZ2VMaXRlKj4oZWxlbWVudHNbaV0pOworICB9CisgIGNvbnN0IHNpemVfdCBzaXplID0gdG90YWxfc2l6ZV8gKiBzaXplb2YoZWxlbWVudHNbMF0pICsga1JlcEhlYWRlclNpemU7CisgIGludGVybmFsOjpTaXplZERlbGV0ZShyZXBfLCBzaXplKTsKKyAgcmVwXyA9IG51bGxwdHI7Cit9CisKK3ZvaWQqIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGRPdXRPZkxpbmVIZWxwZXIodm9pZCogb2JqKSB7CisgIGlmICghcmVwXyB8fCByZXBfLT5hbGxvY2F0ZWRfc2l6ZSA9PSB0b3RhbF9zaXplXykgeworICAgIEludGVybmFsRXh0ZW5kKDEpOyAgLy8gRXF1aXZhbGVudCB0byAiUmVzZXJ2ZSh0b3RhbF9zaXplXyArIDEpIgorICB9CisgICsrcmVwXy0+YWxsb2NhdGVkX3NpemU7CisgIHJlcF8tPmVsZW1lbnRzW2N1cnJlbnRfc2l6ZV8rK10gPSBvYmo7CisgIHJldHVybiBvYmo7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkNsb3NlR2FwKGludCBzdGFydCwgaW50IG51bSkgeworICBpZiAocmVwXyA9PSBudWxscHRyKSByZXR1cm47CisgIC8vIENsb3NlIHVwIGEgZ2FwIG9mICJudW0iIGVsZW1lbnRzIHN0YXJ0aW5nIGF0IG9mZnNldCAic3RhcnQiLgorICBmb3IgKGludCBpID0gc3RhcnQgKyBudW07IGkgPCByZXBfLT5hbGxvY2F0ZWRfc2l6ZTsgKytpKQorICAgIHJlcF8tPmVsZW1lbnRzW2kgLSBudW1dID0gcmVwXy0+ZWxlbWVudHNbaV07CisgIGN1cnJlbnRfc2l6ZV8gLT0gbnVtOworICByZXBfLT5hbGxvY2F0ZWRfc2l6ZSAtPSBudW07Cit9CisKK01lc3NhZ2VMaXRlKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6QWRkV2Vhayhjb25zdCBNZXNzYWdlTGl0ZSogcHJvdG90eXBlKSB7CisgIGlmIChyZXBfICE9IG51bGxwdHIgJiYgY3VycmVudF9zaXplXyA8IHJlcF8tPmFsbG9jYXRlZF9zaXplKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8TWVzc2FnZUxpdGUqPihyZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfKytdKTsKKyAgfQorICBpZiAoIXJlcF8gfHwgcmVwXy0+YWxsb2NhdGVkX3NpemUgPT0gdG90YWxfc2l6ZV8pIHsKKyAgICBSZXNlcnZlKHRvdGFsX3NpemVfICsgMSk7CisgIH0KKyAgKytyZXBfLT5hbGxvY2F0ZWRfc2l6ZTsKKyAgTWVzc2FnZUxpdGUqIHJlc3VsdCA9IHByb3RvdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcHJvdG90eXBlLT5OZXcoYXJlbmFfKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8SW1wbGljaXRXZWFrTWVzc2FnZT4oYXJlbmFfKTsKKyAgcmVwXy0+ZWxlbWVudHNbY3VycmVudF9zaXplXysrXSA9IHJlc3VsdDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9wdHJfZmllbGQuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfcHRyX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxMjMwYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfcHRyX2ZpZWxkLmgKQEAgLTAsMCArMSwxOTcwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gUmVwZWF0ZWRGaWVsZCBhbmQgUmVwZWF0ZWRQdHJGaWVsZCBhcmUgdXNlZCBieSBnZW5lcmF0ZWQgcHJvdG9jb2wgbWVzc2FnZQorLy8gY2xhc3NlcyB0byBtYW5pcHVsYXRlIHJlcGVhdGVkIGZpZWxkcy4gIFRoZXNlIGNsYXNzZXMgYXJlIHZlcnkgc2ltaWxhciB0bworLy8gU1RMJ3MgdmVjdG9yLCBidXQgaW5jbHVkZSBhIG51bWJlciBvZiBvcHRpbWl6YXRpb25zIGZvdW5kIHRvIGJlIHVzZWZ1bAorLy8gc3BlY2lmaWNhbGx5IGluIHRoZSBjYXNlIG9mIFByb3RvY29sIEJ1ZmZlcnMuICBSZXBlYXRlZFB0ckZpZWxkIGlzCisvLyBwYXJ0aWN1bGFybHkgZGlmZmVyZW50IGZyb20gU1RMIHZlY3RvciBhcyBpdCBtYW5hZ2VzIG93bmVyc2hpcCBvZiB0aGUKKy8vIHBvaW50ZXJzIHRoYXQgaXQgY29udGFpbnMuCisvLworLy8gVGhpcyBoZWFkZXIgY292ZXJzIFJlcGVhdGVkUHRyRmllbGQuCisKKy8vIElXWVUgcHJhZ21hOiBwcml2YXRlLCBpbmNsdWRlICJuZXQvcHJvdG8yL3B1YmxpYy9yZXBlYXRlZF9maWVsZC5oIgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9SRVBFQVRFRF9QVFJfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9SRVBFQVRFRF9QVFJfRklFTERfSF9fCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaWZkZWYgX01TQ19WRVIKKy8vIFRoaXMgaXMgcmVxdWlyZWQgZm9yIG1pbi9tYXggb24gVlMyMDEzIG9ubHkuCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2VuZGlmCisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+CisKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKKyNpZmRlZiBTV0lHCisjZXJyb3IgIllvdSBjYW5ub3QgU1dJRyBwcm90byBoZWFkZXJzIgorI2VuZGlmCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgTWVzc2FnZTsKK2NsYXNzIFJlZmxlY3Rpb247CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFdlYWtSZXBlYXRlZFB0ckZpZWxkOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjbGFzcyBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW1IZWxwZXI7CitjbGFzcyBTd2FwRmllbGRIZWxwZXI7CisKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXQ+CitjbGFzcyBSZXBlYXRlZFB0ckl0ZXJhdG9yOwordGVtcGxhdGUgPHR5cGVuYW1lIEl0LCB0eXBlbmFtZSBWb2lkUHRyPgorY2xhc3MgUmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yOworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIHR5cGUtdHJhaXRzIGhlbHBlciBmb3IgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6IHdlIG9ubHkgd2FudCB0byBpbnZva2UKKy8vIGFyZW5hLXJlbGF0ZWQgImNvcHkgaWYgb24gZGlmZmVyZW50IGFyZW5hIiBiZWhhdmlvciBpZiB0aGUgbmVjZXNzYXJ5IG1ldGhvZHMKKy8vIGV4aXN0IG9uIHRoZSBjb250YWluZWQgdHlwZS4gSW4gcGFydGljdWxhciwgd2UgcmVseSBvbiBNZXJnZUZyb20oKSBleGlzdGluZworLy8gYXMgYSBnZW5lcmFsIHByb3h5IGZvciB0aGUgZmFjdCB0aGF0IGEgY29weSB3aWxsIHdvcmssIGFuZCB3ZSBhbHNvIHByb3ZpZGUgYQorLy8gc3BlY2lmaWMgb3ZlcnJpZGUgZm9yIHN0ZDo6c3RyaW5nKi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFR5cGVJbXBsZW1lbnRzTWVyZ2VCZWhhdmlvclByb2JlRm9yTWVyZ2VGcm9tIHsKKyAgdHlwZWRlZiBjaGFyIEhhc01lcmdlOworICB0eXBlZGVmIGxvbmcgSGFzTm9NZXJnZTsKKworICAvLyBXZSBhY2NlcHQgZWl0aGVyIG9mOgorICAvLyAtIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFQmIG90aGVyKQorICAvLyAtIGJvb2wgTWVyZ2VGcm9tKGNvbnN0IFQmIG90aGVyKQorICAvLworICAvLyBXZSBtYW5nbGUgdGhlc2UgbmFtZXMgYSBiaXQgdG8gYXZvaWQgY29tcGF0aWJpbGl0eSBpc3N1ZXMgaW4gJ3VuY2xlYW4nCisgIC8vIGluY2x1ZGUgZW52aXJvbm1lbnRzIHRoYXQgbWF5IGhhdmUsIGUuZy4sICIjZGVmaW5lIHRlc3QgLi4uIiAoeWVzLCB0aGlzCisgIC8vIGV4aXN0cykuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVLCB0eXBlbmFtZSBSZXRUeXBlLCBSZXRUeXBlIChVOjoqKShjb25zdCBVJiBhcmcpPgorICBzdHJ1Y3QgQ2hlY2tUeXBlOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIEhhc01lcmdlIENoZWNrKENoZWNrVHlwZTxVLCB2b2lkLCAmVTo6TWVyZ2VGcm9tPiopOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIEhhc01lcmdlIENoZWNrKENoZWNrVHlwZTxVLCBib29sLCAmVTo6TWVyZ2VGcm9tPiopOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIEhhc05vTWVyZ2UgQ2hlY2soLi4uKTsKKworICAvLyBSZXNvbHZlcyB0byBlaXRoZXIgc3RkOjp0cnVlX3R5cGUgb3Igc3RkOjpmYWxzZV90eXBlLgorICB0eXBlZGVmIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoQ2hlY2s8VD4oMCkpID09IHNpemVvZihIYXNNZXJnZSkpPgorICAgICAgdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHZvaWQ+CitzdHJ1Y3QgVHlwZUltcGxlbWVudHNNZXJnZUJlaGF2aW9yCisgICAgOiBUeXBlSW1wbGVtZW50c01lcmdlQmVoYXZpb3JQcm9iZUZvck1lcmdlRnJvbTxUPiB7fTsKKworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFR5cGVJbXBsZW1lbnRzTWVyZ2VCZWhhdmlvcjxzdGQ6OnN0cmluZz4geworICB0eXBlZGVmIHN0ZDo6dHJ1ZV90eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJc01vdmFibGUKKyAgICA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgc3RkOjppc19tb3ZlX2NvbnN0cnVjdGlibGU8VD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX21vdmVfYXNzaWduYWJsZTxUPjo6dmFsdWU+IHt9OworCisvLyBUaGlzIGlzIHRoZSBjb21tb24gYmFzZSBjbGFzcyBmb3IgUmVwZWF0ZWRQdHJGaWVsZHMuICBJdCBkZWFscyBvbmx5IGluIHZvaWQqCisvLyBwb2ludGVycy4gIFVzZXJzIHNob3VsZCBub3QgdXNlIHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5LgorLy8KKy8vIFRoZSBtZXRob2RzIG9mIHRoaXMgaW50ZXJmYWNlIGNvcnJlc3BvbmQgdG8gdGhlIG1ldGhvZHMgb2YgUmVwZWF0ZWRQdHJGaWVsZCwKKy8vIGJ1dCBtYXkgaGF2ZSBhIHRlbXBsYXRlIGFyZ3VtZW50IGNhbGxlZCBUeXBlSGFuZGxlci4gIEl0cyBzaWduYXR1cmUgaXM6CisvLyAgIGNsYXNzIFR5cGVIYW5kbGVyIHsKKy8vICAgIHB1YmxpYzoKKy8vICAgICB0eXBlZGVmIE15VHlwZSBUeXBlOworLy8gICAgIHN0YXRpYyBUeXBlKiBOZXcoKTsKKy8vICAgICBzdGF0aWMgVHlwZSogTmV3RnJvbVByb3RvdHlwZShjb25zdCBUeXBlKiBwcm90b3R5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZW5hKiBhcmVuYSk7CisvLyAgICAgc3RhdGljIHZvaWQgRGVsZXRlKFR5cGUqKTsKKy8vICAgICBzdGF0aWMgdm9pZCBDbGVhcihUeXBlKik7CisvLyAgICAgc3RhdGljIHZvaWQgTWVyZ2UoY29uc3QgVHlwZSYgZnJvbSwgVHlwZSogdG8pOworLy8KKy8vICAgICAvLyBPbmx5IG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGlmIFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBpcyBjYWxsZWQuCisvLyAgICAgc3RhdGljIGludCBTcGFjZVVzZWRMb25nKGNvbnN0IFR5cGUmKTsKKy8vICAgfTsKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBSZXBlYXRlZFB0ckZpZWxkQmFzZSB7CisgcHJvdGVjdGVkOgorICBjb25zdGV4cHIgUmVwZWF0ZWRQdHJGaWVsZEJhc2UoKQorICAgICAgOiBhcmVuYV8obnVsbHB0ciksIGN1cnJlbnRfc2l6ZV8oMCksIHRvdGFsX3NpemVfKDApLCByZXBfKG51bGxwdHIpIHt9CisgIGV4cGxpY2l0IFJlcGVhdGVkUHRyRmllbGRCYXNlKEFyZW5hKiBhcmVuYSkKKyAgICAgIDogYXJlbmFfKGFyZW5hKSwgY3VycmVudF9zaXplXygwKSwgdG90YWxfc2l6ZV8oMCksIHJlcF8obnVsbHB0cikge30KKworICBSZXBlYXRlZFB0ckZpZWxkQmFzZShjb25zdCBSZXBlYXRlZFB0ckZpZWxkQmFzZSYpID0gZGVsZXRlOworICBSZXBlYXRlZFB0ckZpZWxkQmFzZSYgb3BlcmF0b3I9KGNvbnN0IFJlcGVhdGVkUHRyRmllbGRCYXNlJikgPSBkZWxldGU7CisKKyAgflJlcGVhdGVkUHRyRmllbGRCYXNlKCkgeworI2lmbmRlZiBOREVCVUcKKyAgICAvLyBUcnkgdG8gdHJpZ2dlciBzZWdmYXVsdCAvIGFzYW4gZmFpbHVyZSBpbiBub24tb3B0IGJ1aWxkcy4gSWYgYXJlbmFfCisgICAgLy8gbGlmZXRpbWUgaGFzIGVuZGVkIGJlZm9yZSB0aGUgZGVzdHJ1Y3Rvci4KKyAgICBpZiAoYXJlbmFfKSAodm9pZClhcmVuYV8tPlNwYWNlQWxsb2NhdGVkKCk7CisjZW5kaWYKKyAgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3NpemVfID09IDA7IH0KKyAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3NpemVfOyB9CisgIGludCBDYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIHRvdGFsX3NpemVfOyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICBjb25zdCB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSYgYXQoaW50IGluZGV4KSBjb25zdCB7CisgICAgR09PR0xFX0NIRUNLX0dFKGluZGV4LCAwKTsKKyAgICBHT09HTEVfQ0hFQ0tfTFQoaW5kZXgsIGN1cnJlbnRfc2l6ZV8pOworICAgIHJldHVybiAqY2FzdDxUeXBlSGFuZGxlcj4ocmVwXy0+ZWxlbWVudHNbaW5kZXhdKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUmIGF0KGludCBpbmRleCkgeworICAgIEdPT0dMRV9DSEVDS19HRShpbmRleCwgMCk7CisgICAgR09PR0xFX0NIRUNLX0xUKGluZGV4LCBjdXJyZW50X3NpemVfKTsKKyAgICByZXR1cm4gKmNhc3Q8VHlwZUhhbmRsZXI+KHJlcF8tPmVsZW1lbnRzW2luZGV4XSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBNdXRhYmxlKGludCBpbmRleCkgeworICAgIEdPT0dMRV9EQ0hFQ0tfR0UoaW5kZXgsIDApOworICAgIEdPT0dMRV9EQ0hFQ0tfTFQoaW5kZXgsIGN1cnJlbnRfc2l6ZV8pOworICAgIHJldHVybiBjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1tpbmRleF0pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogQWRkKAorICAgICAgY29uc3QgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHByb3RvdHlwZSA9IG51bGxwdHIpIHsKKyAgICBpZiAocmVwXyAhPSBudWxscHRyICYmIGN1cnJlbnRfc2l6ZV8gPCByZXBfLT5hbGxvY2F0ZWRfc2l6ZSkgeworICAgICAgcmV0dXJuIGNhc3Q8VHlwZUhhbmRsZXI+KHJlcF8tPmVsZW1lbnRzW2N1cnJlbnRfc2l6ZV8rK10pOworICAgIH0KKyAgICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogcmVzdWx0ID0KKyAgICAgICAgVHlwZUhhbmRsZXI6Ok5ld0Zyb21Qcm90b3R5cGUocHJvdG90eXBlLCBhcmVuYV8pOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKj4oCisgICAgICAgIEFkZE91dE9mTGluZUhlbHBlcihyZXN1bHQpKTsKKyAgfQorCisgIHRlbXBsYXRlIDwKKyAgICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyLAorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8VHlwZUhhbmRsZXI6Ok1vdmFibGU6OnZhbHVlPjo6dHlwZSogPSBudWxscHRyPgorICBpbmxpbmUgdm9pZCBBZGQodHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUmJiB2YWx1ZSkgeworICAgIGlmIChyZXBfICE9IG51bGxwdHIgJiYgY3VycmVudF9zaXplXyA8IHJlcF8tPmFsbG9jYXRlZF9zaXplKSB7CisgICAgICAqY2FzdDxUeXBlSGFuZGxlcj4ocmVwXy0+ZWxlbWVudHNbY3VycmVudF9zaXplXysrXSkgPSBzdGQ6Om1vdmUodmFsdWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIXJlcF8gfHwgcmVwXy0+YWxsb2NhdGVkX3NpemUgPT0gdG90YWxfc2l6ZV8pIHsKKyAgICAgIFJlc2VydmUodG90YWxfc2l6ZV8gKyAxKTsKKyAgICB9CisgICAgKytyZXBfLT5hbGxvY2F0ZWRfc2l6ZTsKKyAgICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogcmVzdWx0ID0KKyAgICAgICAgVHlwZUhhbmRsZXI6Ok5ldyhhcmVuYV8sIHN0ZDo6bW92ZSh2YWx1ZSkpOworICAgIHJlcF8tPmVsZW1lbnRzW2N1cnJlbnRfc2l6ZV8rK10gPSByZXN1bHQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHZvaWQgRGVsZXRlKGludCBpbmRleCkgeworICAgIEdPT0dMRV9EQ0hFQ0tfR0UoaW5kZXgsIDApOworICAgIEdPT0dMRV9EQ0hFQ0tfTFQoaW5kZXgsIGN1cnJlbnRfc2l6ZV8pOworICAgIFR5cGVIYW5kbGVyOjpEZWxldGUoY2FzdDxUeXBlSGFuZGxlcj4ocmVwXy0+ZWxlbWVudHNbaW5kZXhdKSwgYXJlbmFfKTsKKyAgfQorCisgIC8vIE11c3QgYmUgY2FsbGVkIGZyb20gZGVzdHJ1Y3Rvci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICB2b2lkIERlc3Ryb3koKSB7CisgICAgaWYgKHJlcF8gIT0gbnVsbHB0ciAmJiBhcmVuYV8gPT0gbnVsbHB0cikgeworICAgICAgaW50IG4gPSByZXBfLT5hbGxvY2F0ZWRfc2l6ZTsKKyAgICAgIHZvaWQqIGNvbnN0KiBlbGVtZW50cyA9IHJlcF8tPmVsZW1lbnRzOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgVHlwZUhhbmRsZXI6OkRlbGV0ZShjYXN0PFR5cGVIYW5kbGVyPihlbGVtZW50c1tpXSksIG51bGxwdHIpOworICAgICAgfQorICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSB0b3RhbF9zaXplXyAqIHNpemVvZihlbGVtZW50c1swXSkgKyBrUmVwSGVhZGVyU2l6ZTsKKyAgICAgIGludGVybmFsOjpTaXplZERlbGV0ZShyZXBfLCBzaXplKTsKKyAgICB9CisgICAgcmVwXyA9IG51bGxwdHI7CisgIH0KKworICBib29sIE5lZWRzRGVzdHJveSgpIGNvbnN0IHsgcmV0dXJuIHJlcF8gIT0gbnVsbHB0ciAmJiBhcmVuYV8gPT0gbnVsbHB0cjsgfQorICB2b2lkIERlc3Ryb3lQcm90b3MoKTsgIC8vIGltcGxlbWVudGVkIGluIHRoZSBjYyBmaWxlCisKKyBwdWJsaWM6CisgIC8vIFRoZSBuZXh0IGZldyBtZXRob2RzIGFyZSBwdWJsaWMgc28gdGhhdCB0aGV5IGNhbiBiZSBjYWxsZWQgZnJvbSBnZW5lcmF0ZWQKKyAgLy8gY29kZSB3aGVuIGltcGxpY2l0IHdlYWsgZmllbGRzIGFyZSB1c2VkLCBidXQgdGhleSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ5CisgIC8vIGFwcGxpY2F0aW9uIGNvZGUuCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICBjb25zdCB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSYgR2V0KGludCBpbmRleCkgY29uc3QgeworICAgIEdPT0dMRV9EQ0hFQ0tfR0UoaW5kZXgsIDApOworICAgIEdPT0dMRV9EQ0hFQ0tfTFQoaW5kZXgsIGN1cnJlbnRfc2l6ZV8pOworICAgIHJldHVybiAqY2FzdDxUeXBlSGFuZGxlcj4ocmVwXy0+ZWxlbWVudHNbaW5kZXhdKTsKKyAgfQorCisgIC8vIENyZWF0ZXMgYW5kIGFkZHMgYW4gZWxlbWVudCB1c2luZyB0aGUgZ2l2ZW4gcHJvdG90eXBlLCB3aXRob3V0IGludHJvZHVjaW5nCisgIC8vIGEgbGluay10aW1lIGRlcGVuZGVuY3kgb24gdGhlIGNvbmNyZXRlIG1lc3NhZ2UgdHlwZS4gVGhpcyBtZXRob2QgaXMgdXNlZCB0bworICAvLyBpbXBsZW1lbnQgaW1wbGljaXQgd2VhayBmaWVsZHMuIFRoZSBwcm90b3R5cGUgbWF5IGJlIG51bGxwdHIsIGluIHdoaWNoIGNhc2UKKyAgLy8gYW4gSW1wbGljaXRXZWFrTWVzc2FnZSB3aWxsIGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlci4KKyAgTWVzc2FnZUxpdGUqIEFkZFdlYWsoY29uc3QgTWVzc2FnZUxpdGUqIHByb3RvdHlwZSk7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICB2b2lkIENsZWFyKCkgeworICAgIGNvbnN0IGludCBuID0gY3VycmVudF9zaXplXzsKKyAgICBHT09HTEVfRENIRUNLX0dFKG4sIDApOworICAgIGlmIChuID4gMCkgeworICAgICAgdm9pZCogY29uc3QqIGVsZW1lbnRzID0gcmVwXy0+ZWxlbWVudHM7CisgICAgICBpbnQgaSA9IDA7CisgICAgICBkbyB7CisgICAgICAgIFR5cGVIYW5kbGVyOjpDbGVhcihjYXN0PFR5cGVIYW5kbGVyPihlbGVtZW50c1tpKytdKSk7CisgICAgICB9IHdoaWxlIChpIDwgbik7CisgICAgICBjdXJyZW50X3NpemVfID0gMDsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFJlcGVhdGVkUHRyRmllbGRCYXNlJiBvdGhlcikgeworICAgIC8vIFRvIGF2b2lkIHVubmVjZXNzYXJ5IGNvZGUgZHVwbGljYXRpb24gYW5kIHJlZHVjZSBiaW5hcnkgc2l6ZSwgd2UgdXNlIGEKKyAgICAvLyBsYXllcmVkIGFwcHJvYWNoIHRvIGltcGxlbWVudGluZyBNZXJnZUZyb20oKS4gVGhlIHRvcGxldmVsIG1ldGhvZCBpcworICAgIC8vIHRlbXBsYXRlZCwgc28gd2UgZ2V0IGEgc21hbGwgdGh1bmsgcGVyIGNvbmNyZXRlIG1lc3NhZ2UgdHlwZSBpbiB0aGUKKyAgICAvLyBiaW5hcnkuIFRoaXMgY2FsbHMgYSBzaGFyZWQgaW1wbGVtZW50YXRpb24gd2l0aCBtb3N0IG9mIHRoZSBsb2dpYywKKyAgICAvLyBwYXNzaW5nIGEgZnVuY3Rpb24gcG9pbnRlciB0byBhbm90aGVyIHR5cGUtc3BlY2lmaWMgcGllY2Ugb2YgY29kZSB0aGF0CisgICAgLy8gY2FsbHMgdGhlIG9iamVjdC1hbGxvY2F0ZSBhbmQgbWVyZ2UgaGFuZGxlcnMuCisgICAgR09PR0xFX0RDSEVDS19ORSgmb3RoZXIsIHRoaXMpOworICAgIGlmIChvdGhlci5jdXJyZW50X3NpemVfID09IDApIHJldHVybjsKKyAgICBNZXJnZUZyb21JbnRlcm5hbChvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAmUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok1lcmdlRnJvbUlubmVyTG9vcDxUeXBlSGFuZGxlcj4pOworICB9CisKKyAgaW5saW5lIHZvaWQgSW50ZXJuYWxTd2FwKFJlcGVhdGVkUHRyRmllbGRCYXNlKiByaHMpIHsKKyAgICBHT09HTEVfRENIRUNLKHRoaXMgIT0gcmhzKTsKKworICAgIC8vIFN3YXAgYWxsIGZpZWxkcyBhdCBvbmNlLgorICAgIGF1dG8gdGVtcCA9IHN0ZDo6bWFrZV90dXBsZShyaHMtPmFyZW5hXywgcmhzLT5jdXJyZW50X3NpemVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHMtPnRvdGFsX3NpemVfLCByaHMtPnJlcF8pOworICAgIHN0ZDo6dGllKHJocy0+YXJlbmFfLCByaHMtPmN1cnJlbnRfc2l6ZV8sIHJocy0+dG90YWxfc2l6ZV8sIHJocy0+cmVwXykgPQorICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoYXJlbmFfLCBjdXJyZW50X3NpemVfLCB0b3RhbF9zaXplXywgcmVwXyk7CisgICAgc3RkOjp0aWUoYXJlbmFfLCBjdXJyZW50X3NpemVfLCB0b3RhbF9zaXplXywgcmVwXykgPSB0ZW1wOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdm9pZCBSZW1vdmVMYXN0KCkgeworICAgIEdPT0dMRV9EQ0hFQ0tfR1QoY3VycmVudF9zaXplXywgMCk7CisgICAgVHlwZUhhbmRsZXI6OkNsZWFyKGNhc3Q8VHlwZUhhbmRsZXI+KHJlcF8tPmVsZW1lbnRzWy0tY3VycmVudF9zaXplX10pKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdm9pZCBDb3B5RnJvbShjb25zdCBSZXBlYXRlZFB0ckZpZWxkQmFzZSYgb3RoZXIpIHsKKyAgICBpZiAoJm90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6Q2xlYXI8VHlwZUhhbmRsZXI+KCk7CisgICAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok1lcmdlRnJvbTxUeXBlSGFuZGxlcj4ob3RoZXIpOworICB9CisKKyAgdm9pZCBDbG9zZUdhcChpbnQgc3RhcnQsIGludCBudW0pOyAgLy8gaW1wbGVtZW50ZWQgaW4gdGhlIGNjIGZpbGUKKworICB2b2lkIFJlc2VydmUoaW50IG5ld19zaXplKTsgIC8vIGltcGxlbWVudGVkIGluIHRoZSBjYyBmaWxlCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBjb3B5KAorICAgICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlKSB7CisgICAgYXV0byogbmV3X3ZhbHVlID0gVHlwZUhhbmRsZXI6Ok5ld0Zyb21Qcm90b3R5cGUodmFsdWUsIG51bGxwdHIpOworICAgIFR5cGVIYW5kbGVyOjpNZXJnZSgqdmFsdWUsIG5ld192YWx1ZSk7CisgICAgcmV0dXJuIG5ld192YWx1ZTsKKyAgfQorCisgIC8vIFVzZWQgZm9yIGNvbnN0cnVjdGluZyBpdGVyYXRvcnMuCisgIHZvaWQqIGNvbnN0KiByYXdfZGF0YSgpIGNvbnN0IHsgcmV0dXJuIHJlcF8gPyByZXBfLT5lbGVtZW50cyA6IG51bGxwdHI7IH0KKyAgdm9pZCoqIHJhd19tdXRhYmxlX2RhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlcF8gPyBjb25zdF9jYXN0PHZvaWQqKj4ocmVwXy0+ZWxlbWVudHMpIDogbnVsbHB0cjsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqKiBtdXRhYmxlX2RhdGEoKSB7CisgICAgLy8gVE9ETyhrZW50b24pOiAgQnJlYWtzIEMrKyBhbGlhc2luZyBydWxlcy4gIFdlIHNob3VsZCBwcm9iYWJseSByZW1vdmUgdGhpcworICAgIC8vICAgbWV0aG9kIGVudGlyZWx5LgorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKio+KHJhd19tdXRhYmxlX2RhdGEoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBjb25zdCogZGF0YSgpIGNvbnN0IHsKKyAgICAvLyBUT0RPKGtlbnRvbik6ICBCcmVha3MgQysrIGFsaWFzaW5nIHJ1bGVzLiAgV2Ugc2hvdWxkIHByb2JhYmx5IHJlbW92ZSB0aGlzCisgICAgLy8gICBtZXRob2QgZW50aXJlbHkuCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIGNvbnN0Kj4oCisgICAgICAgIHJhd19kYXRhKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHZvaWQgU3dhcChSZXBlYXRlZFB0ckZpZWxkQmFzZSogb3RoZXIpIHsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpCisjZWxzZSAgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKQorI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgeworICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgU3dhcEZhbGxiYWNrPFR5cGVIYW5kbGVyPihvdGhlcik7CisgICAgfQorICB9CisKKyAgdm9pZCBTd2FwRWxlbWVudHMoaW50IGluZGV4MSwgaW50IGluZGV4MikgeworICAgIHVzaW5nIHN0ZDo6c3dhcDsgIC8vIGVuYWJsZSBBREwgd2l0aCBmYWxsYmFjaworICAgIHN3YXAocmVwXy0+ZWxlbWVudHNbaW5kZXgxXSwgcmVwXy0+ZWxlbWVudHNbaW5kZXgyXSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHNpemVfdCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZygpIGNvbnN0IHsKKyAgICBzaXplX3QgYWxsb2NhdGVkX2J5dGVzID0gc3RhdGljX2Nhc3Q8c2l6ZV90Pih0b3RhbF9zaXplXykgKiBzaXplb2Yodm9pZCopOworICAgIGlmIChyZXBfICE9IG51bGxwdHIpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwXy0+YWxsb2NhdGVkX3NpemU7ICsraSkgeworICAgICAgICBhbGxvY2F0ZWRfYnl0ZXMgKz0KKyAgICAgICAgICAgIFR5cGVIYW5kbGVyOjpTcGFjZVVzZWRMb25nKCpjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1tpXSkpOworICAgICAgfQorICAgICAgYWxsb2NhdGVkX2J5dGVzICs9IGtSZXBIZWFkZXJTaXplOworICAgIH0KKyAgICByZXR1cm4gYWxsb2NhdGVkX2J5dGVzOworICB9CisKKyAgLy8gQWR2YW5jZWQgbWVtb3J5IG1hbmFnZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBMaWtlIEFkZCgpLCBidXQgaWYgdGhlcmUgYXJlIG5vIGNsZWFyZWQgb2JqZWN0cyB0byB1c2UsIHJldHVybnMgbnVsbHB0ci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogQWRkRnJvbUNsZWFyZWQoKSB7CisgICAgaWYgKHJlcF8gIT0gbnVsbHB0ciAmJiBjdXJyZW50X3NpemVfIDwgcmVwXy0+YWxsb2NhdGVkX3NpemUpIHsKKyAgICAgIHJldHVybiBjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfKytdKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICB2b2lkIEFkZEFsbG9jYXRlZCh0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogdmFsdWUpIHsKKyAgICB0eXBlbmFtZSBUeXBlSW1wbGVtZW50c01lcmdlQmVoYXZpb3I8dHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGU+Ojp0eXBlIHQ7CisgICAgQWRkQWxsb2NhdGVkSW50ZXJuYWw8VHlwZUhhbmRsZXI+KHZhbHVlLCB0KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdm9pZCBVbnNhZmVBcmVuYUFkZEFsbG9jYXRlZCh0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogdmFsdWUpIHsKKyAgICAvLyBNYWtlIHJvb20gZm9yIHRoZSBuZXcgcG9pbnRlci4KKyAgICBpZiAoIXJlcF8gfHwgY3VycmVudF9zaXplXyA9PSB0b3RhbF9zaXplXykgeworICAgICAgLy8gVGhlIGFycmF5IGlzIGNvbXBsZXRlbHkgZnVsbCB3aXRoIG5vIGNsZWFyZWQgb2JqZWN0cywgc28gZ3JvdyBpdC4KKyAgICAgIFJlc2VydmUodG90YWxfc2l6ZV8gKyAxKTsKKyAgICAgICsrcmVwXy0+YWxsb2NhdGVkX3NpemU7CisgICAgfSBlbHNlIGlmIChyZXBfLT5hbGxvY2F0ZWRfc2l6ZSA9PSB0b3RhbF9zaXplXykgeworICAgICAgLy8gVGhlcmUgaXMgbm8gbW9yZSBzcGFjZSBpbiB0aGUgcG9pbnRlciBhcnJheSBiZWNhdXNlIGl0IGNvbnRhaW5zIHNvbWUKKyAgICAgIC8vIGNsZWFyZWQgb2JqZWN0cyBhd2FpdGluZyByZXVzZS4gIFdlIGRvbid0IHdhbnQgdG8gZ3JvdyB0aGUgYXJyYXkgaW4KKyAgICAgIC8vIHRoaXMgY2FzZSBiZWNhdXNlIG90aGVyd2lzZSBhIGxvb3AgY2FsbGluZyBBZGRBbGxvY2F0ZWQoKSBmb2xsb3dlZCBieQorICAgICAgLy8gQ2xlYXIoKSB3b3VsZCBsZWFrIG1lbW9yeS4KKyAgICAgIFR5cGVIYW5kbGVyOjpEZWxldGUoY2FzdDxUeXBlSGFuZGxlcj4ocmVwXy0+ZWxlbWVudHNbY3VycmVudF9zaXplX10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVuYV8pOworICAgIH0gZWxzZSBpZiAoY3VycmVudF9zaXplXyA8IHJlcF8tPmFsbG9jYXRlZF9zaXplKSB7CisgICAgICAvLyBXZSBoYXZlIHNvbWUgY2xlYXJlZCBvYmplY3RzLiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGVpciBvcmRlciwgc28gd2UKKyAgICAgIC8vIGNhbiBqdXN0IG1vdmUgdGhlIGZpcnN0IG9uZSB0byB0aGUgZW5kIHRvIG1ha2Ugc3BhY2UuCisgICAgICByZXBfLT5lbGVtZW50c1tyZXBfLT5hbGxvY2F0ZWRfc2l6ZV0gPSByZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfXTsKKyAgICAgICsrcmVwXy0+YWxsb2NhdGVkX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoZXJlIGFyZSBubyBjbGVhcmVkIG9iamVjdHMuCisgICAgICArK3JlcF8tPmFsbG9jYXRlZF9zaXplOworICAgIH0KKworICAgIHJlcF8tPmVsZW1lbnRzW2N1cnJlbnRfc2l6ZV8rK10gPSB2YWx1ZTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZWxlYXNlTGFzdCgpIHsKKyAgICB0eXBlbmFtZSBUeXBlSW1wbGVtZW50c01lcmdlQmVoYXZpb3I8dHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGU+Ojp0eXBlIHQ7CisgICAgcmV0dXJuIFJlbGVhc2VMYXN0SW50ZXJuYWw8VHlwZUhhbmRsZXI+KHQpOworICB9CisKKyAgLy8gUmVsZWFzZXMgYW5kIHJldHVybnMgdGhlIGxhc3QgZWxlbWVudCwgYnV0IGRvZXMgbm90IGRvIG91dC1vZi1hcmVuYSBjb3B5LgorICAvLyBJbnN0ZWFkLCBqdXN0IHJldHVybnMgdGhlIHJhdyBwb2ludGVyIHRvIHRoZSBjb250YWluZWQgZWxlbWVudCBpbiB0aGUKKyAgLy8gYXJlbmEuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIFVuc2FmZUFyZW5hUmVsZWFzZUxhc3QoKSB7CisgICAgR09PR0xFX0RDSEVDS19HVChjdXJyZW50X3NpemVfLCAwKTsKKyAgICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogcmVzdWx0ID0KKyAgICAgICAgY2FzdDxUeXBlSGFuZGxlcj4ocmVwXy0+ZWxlbWVudHNbLS1jdXJyZW50X3NpemVfXSk7CisgICAgLS1yZXBfLT5hbGxvY2F0ZWRfc2l6ZTsKKyAgICBpZiAoY3VycmVudF9zaXplXyA8IHJlcF8tPmFsbG9jYXRlZF9zaXplKSB7CisgICAgICAvLyBUaGVyZSBhcmUgY2xlYXJlZCBlbGVtZW50cyBvbiB0aGUgZW5kOyByZXBsYWNlIHRoZSByZW1vdmVkIGVsZW1lbnQKKyAgICAgIC8vIHdpdGggdGhlIGxhc3QgYWxsb2NhdGVkIGVsZW1lbnQuCisgICAgICByZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfXSA9IHJlcF8tPmVsZW1lbnRzW3JlcF8tPmFsbG9jYXRlZF9zaXplXTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGludCBDbGVhcmVkQ291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlcF8gPyAocmVwXy0+YWxsb2NhdGVkX3NpemUgLSBjdXJyZW50X3NpemVfKSA6IDA7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHZvaWQgQWRkQ2xlYXJlZCh0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogdmFsdWUpIHsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gbnVsbHB0cikgPDwgIkFkZENsZWFyZWQoKSBjYW4gb25seSBiZSB1c2VkIG9uIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXBlYXRlZFB0ckZpZWxkIG5vdCBvbiBhbiBhcmVuYS4iOworICAgIEdPT0dMRV9EQ0hFQ0soVHlwZUhhbmRsZXI6OkdldE93bmluZ0FyZW5hKHZhbHVlKSA9PSBudWxscHRyKQorICAgICAgICA8PCAiQWRkQ2xlYXJlZCgpIGNhbiBvbmx5IGFjY2VwdCB2YWx1ZXMgbm90IG9uIGFuIGFyZW5hLiI7CisgICAgaWYgKCFyZXBfIHx8IHJlcF8tPmFsbG9jYXRlZF9zaXplID09IHRvdGFsX3NpemVfKSB7CisgICAgICBSZXNlcnZlKHRvdGFsX3NpemVfICsgMSk7CisgICAgfQorICAgIHJlcF8tPmVsZW1lbnRzW3JlcF8tPmFsbG9jYXRlZF9zaXplKytdID0gdmFsdWU7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIFBST1RPQlVGX05PRElTQ0FSRCB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogUmVsZWFzZUNsZWFyZWQoKSB7CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG51bGxwdHIpCisgICAgICAgIDw8ICJSZWxlYXNlQ2xlYXJlZCgpIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZXBlYXRlZFB0ckZpZWxkIG5vdCBvbiAiCisgICAgICAgIDw8ICJhbiBhcmVuYS4iOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBudWxscHRyKTsKKyAgICBHT09HTEVfRENIRUNLKHJlcF8gIT0gbnVsbHB0cik7CisgICAgR09PR0xFX0RDSEVDS19HVChyZXBfLT5hbGxvY2F0ZWRfc2l6ZSwgY3VycmVudF9zaXplXyk7CisgICAgcmV0dXJuIGNhc3Q8VHlwZUhhbmRsZXI+KHJlcF8tPmVsZW1lbnRzWy0tcmVwXy0+YWxsb2NhdGVkX3NpemVdKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdm9pZCBBZGRBbGxvY2F0ZWRJbnRlcm5hbCh0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogdmFsdWUsIHN0ZDo6dHJ1ZV90eXBlKSB7CisgICAgLy8gQWRkQWxsb2NhdGVkIHZlcnNpb24gdGhhdCBpbXBsZW1lbnRzIGFyZW5hLXNhZmUgY29weWluZyBiZWhhdmlvci4KKyAgICBBcmVuYSogZWxlbWVudF9hcmVuYSA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXJlbmEqPihUeXBlSGFuZGxlcjo6R2V0T3duaW5nQXJlbmEodmFsdWUpKTsKKyAgICBBcmVuYSogYXJlbmEgPSBHZXRPd25pbmdBcmVuYSgpOworICAgIGlmIChhcmVuYSA9PSBlbGVtZW50X2FyZW5hICYmIHJlcF8gJiYgcmVwXy0+YWxsb2NhdGVkX3NpemUgPCB0b3RhbF9zaXplXykgeworICAgICAgLy8gRmFzdCBwYXRoOiB1bmRlcmx5aW5nIGFyZW5hIHJlcHJlc2VudGF0aW9uICh0YWdnZWQgcG9pbnRlcikgaXMgZXF1YWwgdG8KKyAgICAgIC8vIG91ciBhcmVuYSBwb2ludGVyLCBhbmQgd2UgY2FuIGFkZCB0byBhcnJheSB3aXRob3V0IHJlc2l6aW5nIGl0IChhdAorICAgICAgLy8gbGVhc3Qgb25lIHNsb3QgdGhhdCBpcyBub3QgYWxsb2NhdGVkKS4KKyAgICAgIHZvaWQqKiBlbGVtcyA9IHJlcF8tPmVsZW1lbnRzOworICAgICAgaWYgKGN1cnJlbnRfc2l6ZV8gPCByZXBfLT5hbGxvY2F0ZWRfc2l6ZSkgeworICAgICAgICAvLyBNYWtlIHNwYWNlIGF0IFtjdXJyZW50XSBieSBtb3ZpbmcgZmlyc3QgYWxsb2NhdGVkIGVsZW1lbnQgdG8gZW5kIG9mCisgICAgICAgIC8vIGFsbG9jYXRlZCBsaXN0LgorICAgICAgICBlbGVtc1tyZXBfLT5hbGxvY2F0ZWRfc2l6ZV0gPSBlbGVtc1tjdXJyZW50X3NpemVfXTsKKyAgICAgIH0KKyAgICAgIGVsZW1zW2N1cnJlbnRfc2l6ZV9dID0gdmFsdWU7CisgICAgICBjdXJyZW50X3NpemVfID0gY3VycmVudF9zaXplXyArIDE7CisgICAgICByZXBfLT5hbGxvY2F0ZWRfc2l6ZSA9IHJlcF8tPmFsbG9jYXRlZF9zaXplICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgQWRkQWxsb2NhdGVkU2xvd1dpdGhDb3B5PFR5cGVIYW5kbGVyPih2YWx1ZSwgZWxlbWVudF9hcmVuYSwgYXJlbmEpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdm9pZCBBZGRBbGxvY2F0ZWRJbnRlcm5hbCgKKyAgICAgIC8vIEFkZEFsbG9jYXRlZCB2ZXJzaW9uIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGFyZW5hLXNhZmUgY29weWluZworICAgICAgLy8gYmVoYXZpb3IuCisgICAgICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogdmFsdWUsIHN0ZDo6ZmFsc2VfdHlwZSkgeworICAgIGlmIChyZXBfICYmIHJlcF8tPmFsbG9jYXRlZF9zaXplIDwgdG90YWxfc2l6ZV8pIHsKKyAgICAgIC8vIEZhc3QgcGF0aDogdW5kZXJseWluZyBhcmVuYSByZXByZXNlbnRhdGlvbiAodGFnZ2VkIHBvaW50ZXIpIGlzIGVxdWFsIHRvCisgICAgICAvLyBvdXIgYXJlbmEgcG9pbnRlciwgYW5kIHdlIGNhbiBhZGQgdG8gYXJyYXkgd2l0aG91dCByZXNpemluZyBpdCAoYXQKKyAgICAgIC8vIGxlYXN0IG9uZSBzbG90IHRoYXQgaXMgbm90IGFsbG9jYXRlZCkuCisgICAgICB2b2lkKiogZWxlbXMgPSByZXBfLT5lbGVtZW50czsKKyAgICAgIGlmIChjdXJyZW50X3NpemVfIDwgcmVwXy0+YWxsb2NhdGVkX3NpemUpIHsKKyAgICAgICAgLy8gTWFrZSBzcGFjZSBhdCBbY3VycmVudF0gYnkgbW92aW5nIGZpcnN0IGFsbG9jYXRlZCBlbGVtZW50IHRvIGVuZCBvZgorICAgICAgICAvLyBhbGxvY2F0ZWQgbGlzdC4KKyAgICAgICAgZWxlbXNbcmVwXy0+YWxsb2NhdGVkX3NpemVdID0gZWxlbXNbY3VycmVudF9zaXplX107CisgICAgICB9CisgICAgICBlbGVtc1tjdXJyZW50X3NpemVfXSA9IHZhbHVlOworICAgICAgY3VycmVudF9zaXplXyA9IGN1cnJlbnRfc2l6ZV8gKyAxOworICAgICAgKytyZXBfLT5hbGxvY2F0ZWRfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgVW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQ8VHlwZUhhbmRsZXI+KHZhbHVlKTsKKyAgICB9CisgIH0KKworICAvLyBTbG93cGF0aCBoYW5kbGVzIGFsbCBjYXNlcywgY29weWluZyBpZiBuZWNlc3NhcnkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgUFJPVE9CVUZfTk9JTkxJTkUgdm9pZCBBZGRBbGxvY2F0ZWRTbG93V2l0aENvcHkoCisgICAgICAvLyBQYXNzIHZhbHVlX2FyZW5hIGFuZCBteV9hcmVuYSB0byBhdm9pZCBkdXBsaWNhdGUgdmlydHVhbCBjYWxsICh2YWx1ZSkKKyAgICAgIC8vIG9yIGxvYWQgKG1pbmUpLgorICAgICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlLCBBcmVuYSogdmFsdWVfYXJlbmEsIEFyZW5hKiBteV9hcmVuYSkgeworICAgIC8vIEVuc3VyZSB0aGF0IGVpdGhlciB0aGUgdmFsdWUgaXMgaW4gdGhlIHNhbWUgYXJlbmEsIG9yIGlmIG5vdCwgd2UgZG8gdGhlCisgICAgLy8gYXBwcm9wcmlhdGUgdGhpbmc6IE93bigpIGl0IChpZiBpdCdzIG9uIGhlYXAgYW5kIHdlJ3JlIGluIGFuIGFyZW5hKSBvcgorICAgIC8vIGNvcHkgaXQgdG8gb3VyIGFyZW5hL2hlYXAgKG90aGVyd2lzZSkuCisgICAgaWYgKG15X2FyZW5hICE9IG51bGxwdHIgJiYgdmFsdWVfYXJlbmEgPT0gbnVsbHB0cikgeworICAgICAgbXlfYXJlbmEtPk93bih2YWx1ZSk7CisgICAgfSBlbHNlIGlmIChteV9hcmVuYSAhPSB2YWx1ZV9hcmVuYSkgeworICAgICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIG5ld192YWx1ZSA9CisgICAgICAgICAgVHlwZUhhbmRsZXI6Ok5ld0Zyb21Qcm90b3R5cGUodmFsdWUsIG15X2FyZW5hKTsKKyAgICAgIFR5cGVIYW5kbGVyOjpNZXJnZSgqdmFsdWUsIG5ld192YWx1ZSk7CisgICAgICBUeXBlSGFuZGxlcjo6RGVsZXRlKHZhbHVlLCB2YWx1ZV9hcmVuYSk7CisgICAgICB2YWx1ZSA9IG5ld192YWx1ZTsKKyAgICB9CisKKyAgICBVbnNhZmVBcmVuYUFkZEFsbG9jYXRlZDxUeXBlSGFuZGxlcj4odmFsdWUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogUmVsZWFzZUxhc3RJbnRlcm5hbChzdGQ6OnRydWVfdHlwZSkgeworICAgIC8vIFJlbGVhc2VMYXN0KCkgZm9yIHR5cGVzIHRoYXQgaW1wbGVtZW50IG1lcmdlL2NvcHkgYmVoYXZpb3IuCisgICAgLy8gRmlyc3QsIHJlbGVhc2UgYW4gZWxlbWVudC4KKyAgICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogcmVzdWx0ID0gVW5zYWZlQXJlbmFSZWxlYXNlTGFzdDxUeXBlSGFuZGxlcj4oKTsKKyAgICAvLyBOb3cgcGVyZm9ybSBhIGNvcHkgaWYgd2UncmUgb24gYW4gYXJlbmEuCisgICAgQXJlbmEqIGFyZW5hID0gR2V0T3duaW5nQXJlbmEoKTsKKworICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBuZXdfcmVzdWx0OworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICAgIG5ld19yZXN1bHQgPSBjb3B5PFR5cGVIYW5kbGVyPihyZXN1bHQpOworICAgIGlmIChhcmVuYSA9PSBudWxscHRyKSBkZWxldGUgcmVzdWx0OworI2Vsc2UgICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgICBuZXdfcmVzdWx0ID0gKGFyZW5hID09IG51bGxwdHIpID8gcmVzdWx0IDogY29weTxUeXBlSGFuZGxlcj4ocmVzdWx0KTsKKyNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICAgIHJldHVybiBuZXdfcmVzdWx0OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogUmVsZWFzZUxhc3RJbnRlcm5hbChzdGQ6OmZhbHNlX3R5cGUpIHsKKyAgICAvLyBSZWxlYXNlTGFzdCgpIGZvciB0eXBlcyB0aGF0ICpkbyBub3QqIGltcGxlbWVudCBtZXJnZS9jb3B5IGJlaGF2aW9yIC0tCisgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBVbnNhZmVBcmVuYVJlbGVhc2VMYXN0KCkuIE5vdGUgdGhhdCB3ZSBHT09HTEVfRENIRUNLLWZhaWwgaWYKKyAgICAvLyB3ZSdyZSBvbiBhbiBhcmVuYSwgc2luY2UgdGhlIHVzZXIgcmVhbGx5IHNob3VsZCBpbXBsZW1lbnQgdGhlIGNvcHkKKyAgICAvLyBvcGVyYXRpb24gaW4gdGhpcyBjYXNlLgorICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBudWxscHRyKQorICAgICAgICA8PCAiUmVsZWFzZUxhc3QoKSBjYWxsZWQgb24gYSBSZXBlYXRlZFB0ckZpZWxkIHRoYXQgaXMgb24gYW4gYXJlbmEsICIKKyAgICAgICAgPDwgIndpdGggYSB0eXBlIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IE1lcmdlRnJvbS4gVGhpcyBpcyB1bnNhZmU7ICIKKyAgICAgICAgPDwgInBsZWFzZSBpbXBsZW1lbnQgTWVyZ2VGcm9tIGZvciB5b3VyIHR5cGUuIjsKKyAgICByZXR1cm4gVW5zYWZlQXJlbmFSZWxlYXNlTGFzdDxUeXBlSGFuZGxlcj4oKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgUFJPVE9CVUZfTk9JTkxJTkUgdm9pZCBTd2FwRmFsbGJhY2soUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIG90aGVyKSB7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG51bGxwdHIgfHwKKyAgICAgICAgICAgb3RoZXItPkdldE93bmluZ0FyZW5hKCkgIT0gR2V0T3duaW5nQXJlbmEoKSk7CisjZWxzZSAgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIEdPT0dMRV9EQ0hFQ0sob3RoZXItPkdldE93bmluZ0FyZW5hKCkgIT0gR2V0T3duaW5nQXJlbmEoKSk7CisjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKworICAgIC8vIENvcHkgc2VtYW50aWNzIGluIHRoaXMgY2FzZS4gV2UgdHJ5IHRvIGltcHJvdmUgZWZmaWNpZW5jeSBieSBwbGFjaW5nIHRoZQorICAgIC8vIHRlbXBvcmFyeSBvbiB8b3RoZXJ8J3MgYXJlbmEgc28gdGhhdCBtZXNzYWdlcyBhcmUgY29waWVkIHR3aWNlIHJhdGhlcgorICAgIC8vIHRoYW4gdGhyZWUgdGltZXMuCisgICAgUmVwZWF0ZWRQdHJGaWVsZEJhc2UgdGVtcChvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgdGVtcC5NZXJnZUZyb208VHlwZUhhbmRsZXI+KCp0aGlzKTsKKyAgICB0aGlzLT5DbGVhcjxUeXBlSGFuZGxlcj4oKTsKKyAgICB0aGlzLT5NZXJnZUZyb208VHlwZUhhbmRsZXI+KCpvdGhlcik7CisgICAgb3RoZXItPkludGVybmFsU3dhcCgmdGVtcCk7CisgICAgdGVtcC5EZXN0cm95PFR5cGVIYW5kbGVyPigpOyAgLy8gRnJlZXMgcmVwXyBpZiBgb3RoZXJgIGhhZCBubyBhcmVuYS4KKyAgfQorCisgIGlubGluZSBBcmVuYSogR2V0QXJlbmEoKSBjb25zdCB7IHJldHVybiBhcmVuYV87IH0KKworIHByb3RlY3RlZDoKKyAgaW5saW5lIEFyZW5hKiBHZXRPd25pbmdBcmVuYSgpIGNvbnN0IHsgcmV0dXJuIGFyZW5hXzsgfQorCisgcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyBBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisKKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luaXRpYWxTaXplID0gMDsKKyAgLy8gQSBmZXcgbm90ZXMgb24gaW50ZXJuYWwgcmVwcmVzZW50YXRpb246CisgIC8vCisgIC8vIFdlIHVzZSBhbiBpbmRpcmVjdGVkIGFwcHJvYWNoLCB3aXRoIHN0cnVjdCBSZXAsIHRvIGtlZXAKKyAgLy8gc2l6ZW9mKFJlcGVhdGVkUHRyRmllbGRCYXNlKSBlcXVpdmFsZW50IHRvIHdoYXQgaXQgd2FzIGJlZm9yZSBhcmVuYSBzdXBwb3J0CisgIC8vIHdhcyBhZGRlZDsgbmFtZWx5LCAzIDgtYnl0ZSBtYWNoaW5lIHdvcmRzIG9uIHg4Ni02NC4gQW4gaW5zdGFuY2Ugb2YgUmVwIGlzCisgIC8vIGFsbG9jYXRlZCBvbmx5IHdoZW4gdGhlIHJlcGVhdGVkIGZpZWxkIGlzIG5vbi1lbXB0eSwgYW5kIGl0IGlzIGEKKyAgLy8gZHluYW1pY2FsbHktc2l6ZWQgc3RydWN0ICh0aGUgaGVhZGVyIGlzIGRpcmVjdGx5IGZvbGxvd2VkIGJ5IGVsZW1lbnRzW10pLgorICAvLyBXZSBwbGFjZSBhcmVuYV8gYW5kIGN1cnJlbnRfc2l6ZV8gZGlyZWN0bHkgaW4gdGhlIG9iamVjdCB0byBhdm9pZCBjYWNoZQorICAvLyBtaXNzZXMgZHVlIHRvIHRoZSBpbmRpcmVjdGlvbiwgYmVjYXVzZSB0aGVzZSBmaWVsZHMgYXJlIGNoZWNrZWQgZnJlcXVlbnRseS4KKyAgLy8gUGxhY2luZyBhbGwgZmllbGRzIGRpcmVjdGx5IGluIHRoZSBSZXBlYXRlZFB0ckZpZWxkQmFzZSBpbnN0YW5jZSB3b3VsZCBjb3N0CisgIC8vIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGZvciBtZW1vcnktc2Vuc2l0aXZlIHdvcmtsb2Fkcy4KKyAgQXJlbmEqIGFyZW5hXzsKKyAgaW50IGN1cnJlbnRfc2l6ZV87CisgIGludCB0b3RhbF9zaXplXzsKKyAgc3RydWN0IFJlcCB7CisgICAgaW50IGFsbG9jYXRlZF9zaXplOworICAgIC8vIEhlcmUgd2UgZGVjbGFyZSBhIGh1Z2UgYXJyYXkgYXMgYSB3YXkgb2YgYXBwcm94aW1hdGluZyBDJ3MgImZsZXhpYmxlCisgICAgLy8gYXJyYXkgbWVtYmVyIiBmZWF0dXJlIHdpdGhvdXQgcmVseWluZyBvbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgdm9pZCogZWxlbWVudHNbKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLSAyICogc2l6ZW9mKGludCkpIC8KKyAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9pZCopXTsKKyAgfTsKKyAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga1JlcEhlYWRlclNpemUgPSBvZmZzZXRvZihSZXAsIGVsZW1lbnRzKTsKKyAgUmVwKiByZXBfOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogY2FzdCh2b2lkKiBlbGVtZW50KSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqPihlbGVtZW50KTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIGNhc3QoY29uc3Qgdm9pZCogZWxlbWVudCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKj4oZWxlbWVudCk7CisgIH0KKworICAvLyBOb24tdGVtcGxhdGVkIGlubmVyIGZ1bmN0aW9uIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24uIFRha2VzIGEgZnVuY3Rpb24KKyAgLy8gcG9pbnRlciB0byB0aGUgdHlwZS1zcGVjaWZpYyAodGVtcGxhdGVkKSBpbm5lciBhbGxvY2F0ZS9tZXJnZSBsb29wLgorICB2b2lkIE1lcmdlRnJvbUludGVybmFsKGNvbnN0IFJlcGVhdGVkUHRyRmllbGRCYXNlJiBvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIChSZXBlYXRlZFB0ckZpZWxkQmFzZTo6KmlubmVyX2xvb3ApKHZvaWQqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KSkgeworICAgIC8vIE5vdGU6IHdyYXBwZXIgaGFzIGFscmVhZHkgZ3VhcmFudGVlZCB0aGF0IG90aGVyLnJlcF8gIT0gbnVsbHB0ciBoZXJlLgorICAgIGludCBvdGhlcl9zaXplID0gb3RoZXIuY3VycmVudF9zaXplXzsKKyAgICB2b2lkKiogb3RoZXJfZWxlbWVudHMgPSBvdGhlci5yZXBfLT5lbGVtZW50czsKKyAgICB2b2lkKiogbmV3X2VsZW1lbnRzID0gSW50ZXJuYWxFeHRlbmQob3RoZXJfc2l6ZSk7CisgICAgaW50IGFsbG9jYXRlZF9lbGVtcyA9IHJlcF8tPmFsbG9jYXRlZF9zaXplIC0gY3VycmVudF9zaXplXzsKKyAgICAodGhpcy0+KmlubmVyX2xvb3ApKG5ld19lbGVtZW50cywgb3RoZXJfZWxlbWVudHMsIG90aGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWRfZWxlbXMpOworICAgIGN1cnJlbnRfc2l6ZV8gKz0gb3RoZXJfc2l6ZTsKKyAgICBpZiAocmVwXy0+YWxsb2NhdGVkX3NpemUgPCBjdXJyZW50X3NpemVfKSB7CisgICAgICByZXBfLT5hbGxvY2F0ZWRfc2l6ZSA9IGN1cnJlbnRfc2l6ZV87CisgICAgfQorICB9CisKKyAgLy8gTWVyZ2VzIG90aGVyX2VsZW1zIHRvIG91cl9lbGVtcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICBQUk9UT0JVRl9OT0lOTElORSB2b2lkIE1lcmdlRnJvbUlubmVyTG9vcCh2b2lkKiogb3VyX2VsZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogb3RoZXJfZWxlbXMsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHJlYWR5X2FsbG9jYXRlZCkgeworICAgIGlmIChhbHJlYWR5X2FsbG9jYXRlZCA8IGxlbmd0aCkgeworICAgICAgQXJlbmEqIGFyZW5hID0gR2V0T3duaW5nQXJlbmEoKTsKKyAgICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBlbGVtX3Byb3RvdHlwZSA9CisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSo+KG90aGVyX2VsZW1zWzBdKTsKKyAgICAgIGZvciAoaW50IGkgPSBhbHJlYWR5X2FsbG9jYXRlZDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIC8vIEFsbG9jYXRlIGEgbmV3IGVtcHR5IGVsZW1lbnQgdGhhdCB3ZSdsbCBtZXJnZSBpbnRvIGJlbG93CisgICAgICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBuZXdfZWxlbSA9CisgICAgICAgICAgICBUeXBlSGFuZGxlcjo6TmV3RnJvbVByb3RvdHlwZShlbGVtX3Byb3RvdHlwZSwgYXJlbmEpOworICAgICAgICBvdXJfZWxlbXNbaV0gPSBuZXdfZWxlbTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gTWFpbiBsb29wIHRoYXQgZG9lcyB0aGUgYWN0dWFsIG1lcmdpbmcKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAvLyBBbHJlYWR5IGFsbG9jYXRlZDogdXNlIGV4aXN0aW5nIGVsZW1lbnQuCisgICAgICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogb3RoZXJfZWxlbSA9CisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSo+KG90aGVyX2VsZW1zW2ldKTsKKyAgICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBuZXdfZWxlbSA9CisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSo+KG91cl9lbGVtc1tpXSk7CisgICAgICBUeXBlSGFuZGxlcjo6TWVyZ2UoKm90aGVyX2VsZW0sIG5ld19lbGVtKTsKKyAgICB9CisgIH0KKworICAvLyBJbnRlcm5hbCBoZWxwZXI6IGV4dGVuZHMgYXJyYXkgc3BhY2UgaWYgbmVjZXNzYXJ5IHRvIGNvbnRhaW4KKyAgLy8gfGV4dGVuZF9hbW91bnR8IG1vcmUgZWxlbWVudHMsIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudAorICAvLyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIG9sZCBsaXN0IG9mIGVsZW1lbnRzLiAgVGhpcyBpbnRlcmZhY2UgZmFjdG9ycyBvdXQKKyAgLy8gY29tbW9uIGJlaGF2aW9yIGZyb20gUmVzZXJ2ZSgpIGFuZCBNZXJnZUZyb20oKSB0byByZWR1Y2UgY29kZSBzaXplLgorICAvLyB8ZXh0ZW5kX2Ftb3VudHwgbXVzdCBiZSA+IDAuCisgIHZvaWQqKiBJbnRlcm5hbEV4dGVuZChpbnQgZXh0ZW5kX2Ftb3VudCk7CisKKyAgLy8gSW50ZXJuYWwgaGVscGVyIGZvciBBZGQ6IGFkZHMgIm9iaiIgYXMgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUKKyAgLy8gYXJyYXksIGluY2x1ZGluZyBwb3RlbnRpYWxseSByZXNpemluZyB0aGUgYXJyYXkgd2l0aCBSZXNlcnZlIGlmCisgIC8vIG5lZWRlZAorICB2b2lkKiBBZGRPdXRPZkxpbmVIZWxwZXIodm9pZCogb2JqKTsKKworICAvLyBUaGUgcmVmbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBjYWxsIHByb3RlY3RlZCBtZXRob2RzIGRpcmVjdGx5LAorICAvLyByZWludGVycHJldGluZyBwb2ludGVycyBhcyBiZWluZyB0byBNZXNzYWdlIGluc3RlYWQgb2YgYSBzcGVjaWZpYyBNZXNzYWdlCisgIC8vIHN1YmNsYXNzLgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb247CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlN3YXBGaWVsZEhlbHBlcjsKKworICAvLyBFeHRlbnNpb25TZXQgc3RvcmVzIHJlcGVhdGVkIG1lc3NhZ2UgZXh0ZW5zaW9ucyBhcworICAvLyBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPiwgYnV0IG5vbi1saXRlIEV4dGVuc2lvblNldHMgbmVlZCB0byBpbXBsZW1lbnQKKyAgLy8gU3BhY2VVc2VkTG9uZygpLCBhbmQgdGh1cyBuZWVkIHRvIGNhbGwgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKQorICAvLyByZWludGVycHJldGluZyBNZXNzYWdlTGl0ZSBhcyBNZXNzYWdlLiAgRXh0ZW5zaW9uU2V0IGFsc28gbmVlZHMgdG8gbWFrZSB1c2UKKyAgLy8gb2YgQWRkRnJvbUNsZWFyZWQoKSwgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuCisgIGZyaWVuZCBjbGFzcyBFeHRlbnNpb25TZXQ7CisKKyAgLy8gVGhlIE1hcEZpZWxkQmFzZSBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBjYWxsIHByb3RlY3RlZCBtZXRob2RzIGRpcmVjdGx5LAorICAvLyByZWludGVycHJldGluZyBwb2ludGVycyBhcyBiZWluZyB0byBNZXNzYWdlIGluc3RlYWQgb2YgYSBzcGVjaWZpYyBNZXNzYWdlCisgIC8vIHN1YmNsYXNzLgorICBmcmllbmQgY2xhc3MgTWFwRmllbGRCYXNlOworICBmcmllbmQgY2xhc3MgTWFwRmllbGRCYXNlU3R1YjsKKworICAvLyBUaGUgdGFibGUtZHJpdmVuIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0bworICAvLyBvcGVyYXRlIG9uIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+LgorICBmcmllbmQgY2xhc3MgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtSGVscGVyOworICBmcmllbmQgY2xhc3MgQWNjZXNzb3JIZWxwZXI7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBmcmllbmQgc3RydWN0IGdvb2dsZTo6cHJvdG9idWY6OldlYWtSZXBlYXRlZFB0ckZpZWxkOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlRjUGFyc2VyOyAgLy8gVE9ETyhqb3JnKTogUmVtb3ZlIHRoaXMgZnJpZW5kLgorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyaWNUeXBlPgorY2xhc3MgR2VuZXJpY1R5cGVIYW5kbGVyIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgR2VuZXJpY1R5cGUgVHlwZTsKKyAgdXNpbmcgTW92YWJsZSA9IElzTW92YWJsZTxHZW5lcmljVHlwZT47CisKKyAgc3RhdGljIGlubGluZSBHZW5lcmljVHlwZSogTmV3KEFyZW5hKiBhcmVuYSkgeworICAgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPFR5cGU+KGFyZW5hKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIEdlbmVyaWNUeXBlKiBOZXcoQXJlbmEqIGFyZW5hLCBHZW5lcmljVHlwZSYmIHZhbHVlKSB7CisgICAgcmV0dXJuIEFyZW5hOjpDcmVhdGU8R2VuZXJpY1R5cGU+KGFyZW5hLCBzdGQ6Om1vdmUodmFsdWUpKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIEdlbmVyaWNUeXBlKiBOZXdGcm9tUHJvdG90eXBlKGNvbnN0IEdlbmVyaWNUeXBlKiAvKnByb3RvdHlwZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gTmV3KGFyZW5hKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgRGVsZXRlKEdlbmVyaWNUeXBlKiB2YWx1ZSwgQXJlbmEqIGFyZW5hKSB7CisgICAgaWYgKGFyZW5hID09IG51bGxwdHIpIHsKKyAgICAgIGRlbGV0ZSB2YWx1ZTsKKyAgICB9CisgIH0KKyAgc3RhdGljIGlubGluZSBBcmVuYSogR2V0T3duaW5nQXJlbmEoR2VuZXJpY1R5cGUqIHZhbHVlKSB7CisgICAgcmV0dXJuIEFyZW5hOjpHZXRPd25pbmdBcmVuYTxUeXBlPih2YWx1ZSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgQ2xlYXIoR2VuZXJpY1R5cGUqIHZhbHVlKSB7IHZhbHVlLT5DbGVhcigpOyB9CisgIHN0YXRpYyB2b2lkIE1lcmdlKGNvbnN0IEdlbmVyaWNUeXBlJiBmcm9tLCBHZW5lcmljVHlwZSogdG8pOworICBzdGF0aWMgaW5saW5lIHNpemVfdCBTcGFjZVVzZWRMb25nKGNvbnN0IEdlbmVyaWNUeXBlJiB2YWx1ZSkgeworICAgIHJldHVybiB2YWx1ZS5TcGFjZVVzZWRMb25nKCk7CisgIH0KK307CisKKy8vIE5ld0Zyb21Qcm90b3R5cGVIZWxwZXIoKSBpcyBub3QgZGVmaW5lZCBpbmxpbmUgaGVyZSwgYXMgd2Ugd2lsbCBuZWVkIHRvIGRvIGEKKy8vIHZpcnR1YWwgZnVuY3Rpb24gZGlzcGF0Y2ggYW55d2F5cyB0byBnbyBmcm9tIE1lc3NhZ2UqIHRvIGNhbGwgTmV3L01lcmdlLiAoVGhlCisvLyBhZGRpdGlvbmFsIGhlbHBlciBpcyBuZWVkZWQgYXMgYSB3b3JrYXJvdW5kIGZvciBNU1ZDLikKK01lc3NhZ2VMaXRlKiBOZXdGcm9tUHJvdG90eXBlSGVscGVyKGNvbnN0IE1lc3NhZ2VMaXRlKiBwcm90b3R5cGUsIEFyZW5hKiBhcmVuYSk7CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgTWVzc2FnZUxpdGUqIEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT46Ok5ld0Zyb21Qcm90b3R5cGUoCisgICAgY29uc3QgTWVzc2FnZUxpdGUqIHByb3RvdHlwZSwgQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBOZXdGcm9tUHJvdG90eXBlSGVscGVyKHByb3RvdHlwZSwgYXJlbmEpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBBcmVuYSogR2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2VMaXRlPjo6R2V0T3duaW5nQXJlbmEoCisgICAgTWVzc2FnZUxpdGUqIHZhbHVlKSB7CisgIHJldHVybiB2YWx1ZS0+R2V0T3duaW5nQXJlbmEoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyaWNUeXBlPgorUFJPVE9CVUZfTk9JTkxJTkUgaW5saW5lIHZvaWQgR2VuZXJpY1R5cGVIYW5kbGVyPEdlbmVyaWNUeXBlPjo6TWVyZ2UoCisgICAgY29uc3QgR2VuZXJpY1R5cGUmIGZyb20sIEdlbmVyaWNUeXBlKiB0bykgeworICB0by0+TWVyZ2VGcm9tKGZyb20pOworfQordGVtcGxhdGUgPD4KK3ZvaWQgR2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2VMaXRlPjo6TWVyZ2UoY29uc3QgTWVzc2FnZUxpdGUmIGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiB0byk7CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBHZW5lcmljVHlwZUhhbmRsZXI8c3RkOjpzdHJpbmc+OjpDbGVhcihzdGQ6OnN0cmluZyogdmFsdWUpIHsKKyAgdmFsdWUtPmNsZWFyKCk7Cit9Cit0ZW1wbGF0ZSA8Pgordm9pZCBHZW5lcmljVHlwZUhhbmRsZXI8c3RkOjpzdHJpbmc+OjpNZXJnZShjb25zdCBzdGQ6OnN0cmluZyYgZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHRvKTsKKworLy8gTWVzc2FnZSBzcGVjaWFsaXphdGlvbiBib2RpZXMgZGVmaW5lZCBpbiBtZXNzYWdlLmNjLiBUaGlzIHNwbGl0IGlzIG5lY2Vzc2FyeQorLy8gdG8gYWxsb3cgcHJvdG8yLWxpdGUgKHdoaWNoIGluY2x1ZGVzIHRoaXMgaGVhZGVyKSB0byBiZSBpbmRlcGVuZGVudCBvZgorLy8gTWVzc2FnZS4KK3RlbXBsYXRlIDw+CitQUk9UT0JVRl9FWFBPUlQgTWVzc2FnZSogR2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+OjpOZXdGcm9tUHJvdG90eXBlKAorICAgIGNvbnN0IE1lc3NhZ2UqIHByb3RvdHlwZSwgQXJlbmEqIGFyZW5hKTsKK3RlbXBsYXRlIDw+CitQUk9UT0JVRl9FWFBPUlQgQXJlbmEqIEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPjo6R2V0T3duaW5nQXJlbmEoCisgICAgTWVzc2FnZSogdmFsdWUpOworCitjbGFzcyBTdHJpbmdUeXBlSGFuZGxlciB7CisgcHVibGljOgorICB0eXBlZGVmIHN0ZDo6c3RyaW5nIFR5cGU7CisgIHVzaW5nIE1vdmFibGUgPSBJc01vdmFibGU8VHlwZT47CisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyogTmV3KEFyZW5hKiBhcmVuYSkgeworICAgIHJldHVybiBBcmVuYTo6Q3JlYXRlPHN0ZDo6c3RyaW5nPihhcmVuYSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyogTmV3KEFyZW5hKiBhcmVuYSwgc3RkOjpzdHJpbmcmJiB2YWx1ZSkgeworICAgIHJldHVybiBBcmVuYTo6Q3JlYXRlPHN0ZDo6c3RyaW5nPihhcmVuYSwgc3RkOjptb3ZlKHZhbHVlKSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyogTmV3RnJvbVByb3RvdHlwZShjb25zdCBzdGQ6OnN0cmluZyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJlbmEqIGFyZW5hKSB7CisgICAgcmV0dXJuIE5ldyhhcmVuYSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBBcmVuYSogR2V0T3duaW5nQXJlbmEoc3RkOjpzdHJpbmcqKSB7IHJldHVybiBudWxscHRyOyB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBEZWxldGUoc3RkOjpzdHJpbmcqIHZhbHVlLCBBcmVuYSogYXJlbmEpIHsKKyAgICBpZiAoYXJlbmEgPT0gbnVsbHB0cikgeworICAgICAgZGVsZXRlIHZhbHVlOworICAgIH0KKyAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgQ2xlYXIoc3RkOjpzdHJpbmcqIHZhbHVlKSB7IHZhbHVlLT5jbGVhcigpOyB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBNZXJnZShjb25zdCBzdGQ6OnN0cmluZyYgZnJvbSwgc3RkOjpzdHJpbmcqIHRvKSB7CisgICAgKnRvID0gZnJvbTsKKyAgfQorICBzdGF0aWMgc2l6ZV90IFNwYWNlVXNlZExvbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgcmV0dXJuIHNpemVvZih2YWx1ZSkgKyBTdHJpbmdTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZyh2YWx1ZSk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBSZXBlYXRlZFB0ckZpZWxkIGlzIGxpa2UgUmVwZWF0ZWRGaWVsZCwgYnV0IHVzZWQgZm9yIHJlcGVhdGVkIHN0cmluZ3Mgb3IKKy8vIE1lc3NhZ2VzLgordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitjbGFzcyBSZXBlYXRlZFB0ckZpZWxkIGZpbmFsIDogcHJpdmF0ZSBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZEJhc2UgeworCisgcHVibGljOgorICBjb25zdGV4cHIgUmVwZWF0ZWRQdHJGaWVsZCgpOworICBleHBsaWNpdCBSZXBlYXRlZFB0ckZpZWxkKEFyZW5hKiBhcmVuYSk7CisKKyAgUmVwZWF0ZWRQdHJGaWVsZChjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXIsCisgICAgICAgICAgICB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTwKKyAgICAgICAgICAgICAgICBFbGVtZW50LCBkZWNsdHlwZSgqc3RkOjpkZWNsdmFsPEl0ZXI+KCkpPjo6dmFsdWU+Ojp0eXBlPgorICBSZXBlYXRlZFB0ckZpZWxkKEl0ZXIgYmVnaW4sIEl0ZXIgZW5kKTsKKworICB+UmVwZWF0ZWRQdHJGaWVsZCgpOworCisgIFJlcGVhdGVkUHRyRmllbGQmIG9wZXJhdG9yPShjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcik7CisKKyAgUmVwZWF0ZWRQdHJGaWVsZChSZXBlYXRlZFB0ckZpZWxkJiYgb3RoZXIpIG5vZXhjZXB0OworICBSZXBlYXRlZFB0ckZpZWxkJiBvcGVyYXRvcj0oUmVwZWF0ZWRQdHJGaWVsZCYmIG90aGVyKSBub2V4Y2VwdDsKKworICBib29sIGVtcHR5KCkgY29uc3Q7CisgIGludCBzaXplKCkgY29uc3Q7CisKKyAgY29uc3QgRWxlbWVudCYgR2V0KGludCBpbmRleCkgY29uc3Q7CisgIEVsZW1lbnQqIE11dGFibGUoaW50IGluZGV4KTsKKworICAvLyBVbmxpa2Ugc3RkOjp2ZWN0b3IsIGFkZGluZyBhbiBlbGVtZW50IHRvIGEgUmVwZWF0ZWRQdHJGaWVsZCBkb2Vzbid0IGFsd2F5cworICAvLyBtYWtlIGEgbmV3IGVsZW1lbnQ7IGl0IG1pZ2h0IHJlLXVzZSBhbiBlbGVtZW50IGxlZnQgb3ZlciBmcm9tIHdoZW4gdGhlCisgIC8vIGZpZWxkIHdhcyBDbGVhcigpJ2Qgb3IgcmVpemUoKSdkIHNtYWxsZXIuICBGb3IgdGhpcyByZWFzb24sIEFkZCgpIGlzIHRoZQorICAvLyBmYXN0ZXN0IEFQSSBmb3IgYWRkaW5nIGEgbmV3IGVsZW1lbnQuCisgIEVsZW1lbnQqIEFkZCgpOworCisgIC8vIGBBZGQoc3RkOjptb3ZlKHZhbHVlKSk7YCBpcyBlcXVpdmFsZW50IHRvIGAqQWRkKCkgPSBzdGQ6Om1vdmUodmFsdWUpO2AKKyAgLy8gSXQgd2lsbCBlaXRoZXIgbW92ZS1jb25zdHJ1Y3QgdG8gdGhlIGVuZCBvZiB0aGlzIGZpZWxkLCBvciBzd2FwIHZhbHVlCisgIC8vIHdpdGggdGhlIG5ldy1vci1yZWN5Y2xlZCBlbGVtZW50IGF0IHRoZSBlbmQgb2YgdGhpcyBmaWVsZC4gIE5vdGUgdGhhdAorICAvLyB0aGlzIG9wZXJhdGlvbiBpcyB2ZXJ5IHNsb3cgaWYgdGhpcyBSZXBlYXRlZFB0ckZpZWxkIGlzIG5vdCBvbiB0aGUKKyAgLy8gc2FtZSBBcmVuYSwgaWYgYW55LCBhcyBgdmFsdWVgLgorICB2b2lkIEFkZChFbGVtZW50JiYgdmFsdWUpOworCisgIC8vIENvcHlpbmcgdG8gdGhlIGVuZCBvZiB0aGlzIFJlcGVhdGVkUHRyRmllbGQgaXMgc2xvd2VzdCBvZiBhbGw7IGl0IGNhbid0CisgIC8vIHJlbGlhYmx5IGNvcHktY29uc3RydWN0IHRvIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhpcyBSZXBlYXRlZFB0ckZpZWxkLCBmb3IKKyAgLy8gZXhhbXBsZSAodW5saWtlIHN0ZDo6dmVjdG9yKS4KKyAgLy8gV2UgY3VycmVudGx5IGJsb2NrIHRoaXMgQVBJLiAgVGhlIHJpZ2h0IHdheSB0byBhZGQgdG8gdGhlIGVuZCBpcyB0byBjYWxsCisgIC8vIEFkZCgpIGFuZCBtb2RpZnkgdGhlIGVsZW1lbnQgaXQgcG9pbnRzIHRvLgorICAvLyBJZiB5b3UgbXVzdCBhZGQgYW4gZXhpc3RpbmcgdmFsdWUsIGNhbGwgYCpBZGQoKSA9IHZhbHVlO2AKKyAgdm9pZCBBZGQoY29uc3QgRWxlbWVudCYgdmFsdWUpID0gZGVsZXRlOworCisgIC8vIEFwcGVuZCBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgW2JlZ2luLCBlbmQpIGFmdGVyIHJlc2VydmluZworICAvLyB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGVsZW1lbnRzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KKyAgdm9pZCBBZGQoSXRlciBiZWdpbiwgSXRlciBlbmQpOworCisgIGNvbnN0IEVsZW1lbnQmIG9wZXJhdG9yW10oaW50IGluZGV4KSBjb25zdCB7IHJldHVybiBHZXQoaW5kZXgpOyB9CisgIEVsZW1lbnQmIG9wZXJhdG9yW10oaW50IGluZGV4KSB7IHJldHVybiAqTXV0YWJsZShpbmRleCk7IH0KKworICBjb25zdCBFbGVtZW50JiBhdChpbnQgaW5kZXgpIGNvbnN0OworICBFbGVtZW50JiBhdChpbnQgaW5kZXgpOworCisgIC8vIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuCisgIC8vIE93bmVyc2hpcCBvZiB0aGUgZWxlbWVudCBpcyByZXRhaW5lZCBieSB0aGUgYXJyYXkuCisgIHZvaWQgUmVtb3ZlTGFzdCgpOworCisgIC8vIERlbGV0ZXMgZWxlbWVudHMgd2l0aCBpbmRpY2VzIGluIHRoZSByYW5nZSBbc3RhcnQgLi4gc3RhcnQrbnVtLTFdLgorICAvLyBDYXV0aW9uOiBtb3ZlcyBhbGwgZWxlbWVudHMgd2l0aCBpbmRpY2VzIFtzdGFydCtudW0gLi4gXS4KKyAgLy8gQ2FsbGluZyB0aGlzIHJvdXRpbmUgaW5zaWRlIGEgbG9vcCBjYW4gY2F1c2UgcXVhZHJhdGljIGJlaGF2aW9yLgorICB2b2lkIERlbGV0ZVN1YnJhbmdlKGludCBzdGFydCwgaW50IG51bSk7CisKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcik7CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ29weUZyb20oY29uc3QgUmVwZWF0ZWRQdHJGaWVsZCYgb3RoZXIpOworCisgIC8vIFJlcGxhY2VzIHRoZSBjb250ZW50cyB3aXRoIFJlcGVhdGVkUHRyRmllbGQoYmVnaW4sIGVuZCkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIEFzc2lnbihJdGVyIGJlZ2luLCBJdGVyIGVuZCk7CisKKyAgLy8gUmVzZXJ2ZXMgc3BhY2UgdG8gZXhwYW5kIHRoZSBmaWVsZCB0byBhdCBsZWFzdCB0aGUgZ2l2ZW4gc2l6ZS4gIFRoaXMgb25seQorICAvLyByZXNpemVzIHRoZSBwb2ludGVyIGFycmF5OyBpdCBkb2Vzbid0IGFsbG9jYXRlIGFueSBvYmplY3RzLiAgSWYgdGhlCisgIC8vIGFycmF5IGlzIGdyb3duLCBpdCB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCBkb3VibGVkIGluIHNpemUuCisgIHZvaWQgUmVzZXJ2ZShpbnQgbmV3X3NpemUpOworCisgIGludCBDYXBhY2l0eSgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIHVuZGVybHlpbmcgYXJyYXkuICBUaGlzIHBvaW50ZXIgaXMgcG9zc2libHkgaW52YWxpZGF0ZWQgYnkKKyAgLy8gYW55IGFkZCBvciByZW1vdmUgb3BlcmF0aW9uLgorICAvLworICAvLyBUaGlzIEFQSSBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkIG9mIGRpcmVjdGx5IHdvcmtpbmcgd2l0aCBlbGVtZW50IGFycmF5LAorICAvLyB1c2UgQVBJcyBpbiByZXBlYXRlZF9maWVsZF91dGlsLmg7IGUuZy4gc29ydGluZywgZXRjLgorICBQUk9UT0JVRl9ERVBSRUNBVEVEX01TRygiVXNlIEFQSXMgaW4gcmVwZWF0ZWRfZmllbGRfdXRpbC5oIikKKyAgRWxlbWVudCoqIG11dGFibGVfZGF0YSgpOworICBjb25zdCBFbGVtZW50KiBjb25zdCogZGF0YSgpIGNvbnN0OworCisgIC8vIFN3YXBzIGVudGlyZSBjb250ZW50cyB3aXRoICJvdGhlciIuIElmIHRoZXkgYXJlIG9uIHNlcGFyYXRlIGFyZW5hcywgdGhlbgorICAvLyBjb3BpZXMgZGF0YS4KKyAgdm9pZCBTd2FwKFJlcGVhdGVkUHRyRmllbGQqIG90aGVyKTsKKworICAvLyBTd2FwcyBlbnRpcmUgY29udGVudHMgd2l0aCAib3RoZXIiLiBDYWxsZXIgc2hvdWxkIGd1YXJhbnRlZSB0aGF0IGVpdGhlcgorICAvLyBib3RoIGZpZWxkcyBhcmUgb24gdGhlIHNhbWUgYXJlbmEgb3IgYm90aCBhcmUgb24gdGhlIGhlYXAuIFN3YXBwaW5nIGJldHdlZW4KKyAgLy8gZGlmZmVyZW50IGFyZW5hcyB3aXRoIHRoaXMgZnVuY3Rpb24gaXMgZGlzYWxsb3dlZCBhbmQgaXMgY2F1Z2h0IHZpYQorICAvLyBHT09HTEVfRENIRUNLLgorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChSZXBlYXRlZFB0ckZpZWxkKiBvdGhlcik7CisKKyAgLy8gU3dhcHMgdHdvIGVsZW1lbnRzLgorICB2b2lkIFN3YXBFbGVtZW50cyhpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKTsKKworICAvLyBTVEwtbGlrZSBpdGVyYXRvciBzdXBwb3J0CisgIHR5cGVkZWYgaW50ZXJuYWw6OlJlcGVhdGVkUHRySXRlcmF0b3I8RWxlbWVudD4gaXRlcmF0b3I7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlJlcGVhdGVkUHRySXRlcmF0b3I8Y29uc3QgRWxlbWVudD4gY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgRWxlbWVudCB2YWx1ZV90eXBlOworICB0eXBlZGVmIHZhbHVlX3R5cGUmIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSogcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIGludCBzaXplX3R5cGU7CisgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKworICBpdGVyYXRvciBiZWdpbigpOworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0OworICBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdDsKKyAgaXRlcmF0b3IgZW5kKCk7CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0OworICBjb25zdF9pdGVyYXRvciBjZW5kKCkgY29uc3Q7CisKKyAgLy8gUmV2ZXJzZSBpdGVyYXRvciBzdXBwb3J0CisgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gcmV2ZXJzZV9pdGVyYXRvcjsKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7CisgIH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7CisgIH0KKworICAvLyBDdXN0b20gU1RMLWxpa2UgaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyBvdmVyIGFuZCByZXR1cm5zIHRoZSB1bmRlcmx5aW5nCisgIC8vIHBvaW50ZXJzIHRvIEVsZW1lbnQgcmF0aGVyIHRoYW4gRWxlbWVudCBpdHNlbGYuCisgIHR5cGVkZWYgaW50ZXJuYWw6OlJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcjxFbGVtZW50Kiwgdm9pZCo+CisgICAgICBwb2ludGVyX2l0ZXJhdG9yOworICB0eXBlZGVmIGludGVybmFsOjpSZXBlYXRlZFB0ck92ZXJQdHJzSXRlcmF0b3I8Y29uc3QgRWxlbWVudCogY29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBjb25zdD4KKyAgICAgIGNvbnN0X3BvaW50ZXJfaXRlcmF0b3I7CisgIHBvaW50ZXJfaXRlcmF0b3IgcG9pbnRlcl9iZWdpbigpOworICBjb25zdF9wb2ludGVyX2l0ZXJhdG9yIHBvaW50ZXJfYmVnaW4oKSBjb25zdDsKKyAgcG9pbnRlcl9pdGVyYXRvciBwb2ludGVyX2VuZCgpOworICBjb25zdF9wb2ludGVyX2l0ZXJhdG9yIHBvaW50ZXJfZW5kKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyAoYW4gZXN0aW1hdGUgb2YpIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBieSB0aGUgcmVwZWF0ZWQgZmllbGQsCisgIC8vIGV4Y2x1ZGluZyBzaXplb2YoKnRoaXMpLgorICBzaXplX3QgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKSBjb25zdDsKKworICBpbnQgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OlRvSW50U2l6ZShTcGFjZVVzZWRFeGNsdWRpbmdTZWxmTG9uZygpKTsKKyAgfQorCisgIC8vIEFkdmFuY2VkIG1lbW9yeSBtYW5hZ2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFdoZW4gaGFyZGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYmVjb21lcyBuZWNlc3NhcnkgLS0gYXMgaXQgc29tZXRpbWVzCisgIC8vIGRvZXMgaGVyZSBhdCBHb29nbGUgLS0gdGhlIGZvbGxvd2luZyBtZXRob2RzIG1heSBiZSB1c2VmdWwuCisKKyAgLy8gQWRkcyBhbiBhbHJlYWR5LWFsbG9jYXRlZCBvYmplY3QsIHBhc3Npbmcgb3duZXJzaGlwIHRvIHRoZQorICAvLyBSZXBlYXRlZFB0ckZpZWxkLgorICAvLworICAvLyBOb3RlIHRoYXQgc29tZSBzcGVjaWFsIGJlaGF2aW9yIG9jY3VycyB3aXRoIHJlc3BlY3QgdG8gYXJlbmFzOgorICAvLworICAvLyAgIChpKSBpZiB0aGlzIGZpZWxkIGhvbGRzIHN1Ym1lc3NhZ2VzLCB0aGUgbmV3IHN1Ym1lc3NhZ2Ugd2lsbCBiZSBjb3BpZWQgaWYKKyAgLy8gICB0aGUgb3JpZ2luYWwgaXMgaW4gYW4gYXJlbmEgYW5kIHRoaXMgUmVwZWF0ZWRQdHJGaWVsZCBpcyBlaXRoZXIgaW4gYQorICAvLyAgIGRpZmZlcmVudCBhcmVuYSwgb3Igb24gdGhlIGhlYXAuCisgIC8vICAgKGlpKSBpZiB0aGlzIGZpZWxkIGhvbGRzIHN0cmluZ3MsIHRoZSBwYXNzZWQtaW4gc3RyaW5nICptdXN0KiBiZQorICAvLyAgIGhlYXAtYWxsb2NhdGVkLCBub3QgYXJlbmEtYWxsb2NhdGVkLiBUaGVyZSBpcyBubyB3YXkgdG8gZHluYW1pY2FsbHkgY2hlY2sKKyAgLy8gICB0aGlzIGF0IHJ1bnRpbWUsIHNvIFVzZXIgQmV3YXJlLgorICB2b2lkIEFkZEFsbG9jYXRlZChFbGVtZW50KiB2YWx1ZSk7CisKKyAgLy8gUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgbGFzdCBlbGVtZW50LCBwYXNzaW5nIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyLgorICAvLyBSZXF1aXJlczogIHNpemUoKSA+IDAKKyAgLy8KKyAgLy8gSWYgdGhpcyBSZXBlYXRlZFB0ckZpZWxkIGlzIG9uIGFuIGFyZW5hLCBhbiBvYmplY3QgY29weSBpcyByZXF1aXJlZCB0byBwYXNzCisgIC8vIG93bmVyc2hpcCBiYWNrIHRvIHRoZSB1c2VyIChmb3IgY29tcGF0aWJsZSBzZW1hbnRpY3MpLiBVc2UKKyAgLy8gVW5zYWZlQXJlbmFSZWxlYXNlTGFzdCgpIGlmIHRoaXMgYmVoYXZpb3IgaXMgdW5kZXNpcmVkLgorICBQUk9UT0JVRl9OT0RJU0NBUkQgRWxlbWVudCogUmVsZWFzZUxhc3QoKTsKKworICAvLyBBZGRzIGFuIGFscmVhZHktYWxsb2NhdGVkIG9iamVjdCwgc2tpcHBpbmcgYXJlbmEtb3duZXJzaGlwIGNoZWNrcy4gVGhlIHVzZXIKKyAgLy8gbXVzdCBndWFyYW50ZWUgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGluIHRoZSBzYW1lIGFyZW5hIGFzIHRoaXMKKyAgLy8gUmVwZWF0ZWRQdHJGaWVsZC4KKyAgLy8gSXQgaXMgYWxzbyB1c2VmdWwgaW4gbGVnYWN5IGNvZGUgdGhhdCB1c2VzIHRlbXBvcmFyeSBvd25lcnNoaXAgdG8gYXZvaWQKKyAgLy8gY29waWVzLiBFeGFtcGxlOgorICAvLyAgIFJlcGVhdGVkUHRyRmllbGQ8VD4gdGVtcF9maWVsZDsKKyAgLy8gICB0ZW1wX2ZpZWxkLlVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkKG5ldyBUKTsKKyAgLy8gICAuLi4gLy8gRG8gc29tZXRoaW5nIHdpdGggdGVtcF9maWVsZAorICAvLyAgIHRlbXBfZmllbGQuVW5zYWZlQXJlbmFFeHRyYWN0U3VicmFuZ2UoMCwgdGVtcF9maWVsZC5zaXplKCksIG51bGxwdHIpOworICAvLyBJZiB5b3UgcHV0IHRlbXBfZmllbGQgb24gdGhlIGFyZW5hIHRoaXMgZmFpbHMsIGJlY2F1c2UgdGhlIG93bmVyc2hpcAorICAvLyB0cmFuc2ZlcnMgdG8gdGhlIGFyZW5hIGF0IHRoZSAiQWRkQWxsb2NhdGVkIiBjYWxsIGFuZCBpcyBub3QgcmVsZWFzZWQKKyAgLy8gYW55bW9yZSwgY2F1c2luZyBhIGRvdWJsZSBkZWxldGUuIFVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkIHByZXZlbnRzIHRoaXMuCisgIHZvaWQgVW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQoRWxlbWVudCogdmFsdWUpOworCisgIC8vIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGxhc3QgZWxlbWVudC4gIFVubGlrZSBSZWxlYXNlTGFzdCwgdGhlIHJldHVybmVkCisgIC8vIHBvaW50ZXIgaXMgYWx3YXlzIHRvIHRoZSBvcmlnaW5hbCBvYmplY3QuICBUaGlzIG1heSBiZSBpbiBhbiBhcmVuYSwgaW4KKyAgLy8gd2hpY2ggY2FzZSBpdCB3b3VsZCBoYXZlIHRoZSBhcmVuYSdzIGxpZmV0aW1lLgorICAvLyBSZXF1aXJlczogY3VycmVudF9zaXplXyA+IDAKKyAgRWxlbWVudCogVW5zYWZlQXJlbmFSZWxlYXNlTGFzdCgpOworCisgIC8vIEV4dHJhY3RzIGVsZW1lbnRzIHdpdGggaW5kaWNlcyBpbiB0aGUgcmFuZ2UgIltzdGFydCAuLiBzdGFydCtudW0tMV0iLgorICAvLyBUaGUgY2FsbGVyIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSBleHRyYWN0ZWQgZWxlbWVudHMgYW5kIGlzIHJlc3BvbnNpYmxlCisgIC8vIGZvciBkZWxldGluZyB0aGVtIHdoZW4gdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgLy8gSWYgImVsZW1lbnRzIiBpcyBub24tbnVsbHB0ciwgdGhlbiBwb2ludGVycyB0byB0aGUgZXh0cmFjdGVkIGVsZW1lbnRzCisgIC8vIGFyZSBzdG9yZWQgaW4gImVsZW1lbnRzWzAgLi4gbnVtLTFdIiBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIHRoZSBjYWxsZXIuCisgIC8vIElmICJlbGVtZW50cyIgaXMgbnVsbHB0ciwgdGhlbiB0aGUgY2FsbGVyIG11c3QgdXNlIHNvbWUgb3RoZXIgbWVjaGFuaXNtCisgIC8vIHRvIHBlcmZvcm0gYW55IGZ1cnRoZXIgb3BlcmF0aW9ucyAobGlrZSBkZWxldGlvbikgb24gdGhlc2UgZWxlbWVudHMuCisgIC8vIENhdXRpb246IGltcGxlbWVudGF0aW9uIGFsc28gbW92ZXMgZWxlbWVudHMgd2l0aCBpbmRpY2VzIFtzdGFydCtudW0gLi5dLgorICAvLyBDYWxsaW5nIHRoaXMgcm91dGluZSBpbnNpZGUgYSBsb29wIGNhbiBjYXVzZSBxdWFkcmF0aWMgYmVoYXZpb3IuCisgIC8vCisgIC8vIE1lbW9yeSBjb3B5aW5nIGJlaGF2aW9yIGlzIGlkZW50aWNhbCB0byBSZWxlYXNlTGFzdCgpLCBkZXNjcmliZWQgYWJvdmU6IGlmCisgIC8vIHRoaXMgUmVwZWF0ZWRQdHJGaWVsZCBpcyBvbiBhbiBhcmVuYSwgYW4gb2JqZWN0IGNvcHkgaXMgcGVyZm9ybWVkIGZvciBlYWNoCisgIC8vIHJldHVybmVkIGVsZW1lbnQsIHNvIHRoYXQgYWxsIHJldHVybmVkIGVsZW1lbnQgcG9pbnRlcnMgYXJlIHRvCisgIC8vIGhlYXAtYWxsb2NhdGVkIGNvcGllcy4gSWYgdGhpcyBjb3B5IGlzIG5vdCBkZXNpcmVkLCB0aGUgdXNlciBzaG91bGQgY2FsbAorICAvLyBVbnNhZmVBcmVuYUV4dHJhY3RTdWJyYW5nZSgpLgorICB2b2lkIEV4dHJhY3RTdWJyYW5nZShpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqKiBlbGVtZW50cyk7CisKKyAgLy8gSWRlbnRpY2FsIHRvIEV4dHJhY3RTdWJyYW5nZSgpIGRlc2NyaWJlZCBhYm92ZSwgZXhjZXB0IHRoYXQgbm8gb2JqZWN0CisgIC8vIGNvcGllcyBhcmUgZXZlciBwZXJmb3JtZWQuIEluc3RlYWQsIHRoZSByYXcgb2JqZWN0IHBvaW50ZXJzIGFyZSByZXR1cm5lZC4KKyAgLy8gVGh1cywgaWYgb24gYW4gYXJlbmEsIHRoZSByZXR1cm5lZCBvYmplY3RzIG11c3Qgbm90IGJlIGZyZWVkLCBiZWNhdXNlIHRoZXkKKyAgLy8gd2lsbCBub3QgYmUgaGVhcC1hbGxvY2F0ZWQgb2JqZWN0cy4KKyAgdm9pZCBVbnNhZmVBcmVuYUV4dHJhY3RTdWJyYW5nZShpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqKiBlbGVtZW50cyk7CisKKyAgLy8gV2hlbiBlbGVtZW50cyBhcmUgcmVtb3ZlZCBieSBjYWxscyB0byBSZW1vdmVMYXN0KCkgb3IgQ2xlYXIoKSwgdGhleQorICAvLyBhcmUgbm90IGFjdHVhbGx5IGZyZWVkLiAgSW5zdGVhZCwgdGhleSBhcmUgY2xlYXJlZCBhbmQga2VwdCBzbyB0aGF0CisgIC8vIHRoZXkgY2FuIGJlIHJldXNlZCBsYXRlci4gIFRoaXMgY2FuIHNhdmUgbG90cyBvZiBDUFUgdGltZSB3aGVuCisgIC8vIHJlcGVhdGVkbHkgcmV1c2luZyBhIHByb3RvY29sIG1lc3NhZ2UgZm9yIHNpbWlsYXIgcHVycG9zZXMuCisgIC8vCisgIC8vIEhhcmRjb3JlIHByb2dyYW1zIG1heSBjaG9vc2UgdG8gbWFuaXB1bGF0ZSB0aGVzZSBjbGVhcmVkIG9iamVjdHMKKyAgLy8gdG8gYmV0dGVyIG9wdGltaXplIG1lbW9yeSBtYW5hZ2VtZW50IHVzaW5nIHRoZSBmb2xsb3dpbmcgcm91dGluZXMuCisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGNsZWFyZWQgb2JqZWN0cyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcga2VwdAorICAvLyBhcm91bmQgZm9yIHJldXNlLgorICBpbnQgQ2xlYXJlZENvdW50KCkgY29uc3Q7CisjaWZuZGVmIFBST1RPQlVGX0ZVVFVSRV9CUkVBS0lOR19DSEFOR0VTCisgIC8vIEFkZHMgYW4gZWxlbWVudCB0byB0aGUgcG9vbCBvZiBjbGVhcmVkIG9iamVjdHMsIHBhc3Npbmcgb3duZXJzaGlwIHRvCisgIC8vIHRoZSBSZXBlYXRlZFB0ckZpZWxkLiAgVGhlIGVsZW1lbnQgbXVzdCBiZSBjbGVhcmVkIHByaW9yIHRvIGNhbGxpbmcKKyAgLy8gdGhpcyBtZXRob2QuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSBjYWxsZWQgd2hlbiBlaXRoZXIgdGhlIHJlcGVhdGVkIGZpZWxkIG9yIHx2YWx1ZXwgaXMKKyAgLy8gb24gYW4gYXJlbmE7IGJvdGggY2FzZXMgd2lsbCB0cmlnZ2VyIGEgR09PR0xFX0RDSEVDSy1mYWlsdXJlLgorICB2b2lkIEFkZENsZWFyZWQoRWxlbWVudCogdmFsdWUpOworICAvLyBSZW1vdmVzIGFuZCByZXR1cm5zIGEgc2luZ2xlIGVsZW1lbnQgZnJvbSB0aGUgY2xlYXJlZCBwb29sLCBwYXNzaW5nCisgIC8vIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyLiAgVGhlIGVsZW1lbnQgaXMgZ3VhcmFudGVlZCB0byBiZSBjbGVhcmVkLgorICAvLyBSZXF1aXJlczogIENsZWFyZWRDb3VudCgpID4gMAorICAvLworICAvLyBUaGlzIG1ldGhvZCBjYW5ub3QgYmUgY2FsbGVkIHdoZW4gdGhlIHJlcGVhdGVkIGZpZWxkIGlzIG9uIGFuIGFyZW5hOyBkb2luZworICAvLyBzbyB3aWxsIHRyaWdnZXIgYSBHT09HTEVfRENIRUNLLWZhaWx1cmUuCisgIFBST1RPQlVGX05PRElTQ0FSRCBFbGVtZW50KiBSZWxlYXNlQ2xlYXJlZCgpOworI2VuZGlmICAvLyAhUFJPVE9CVUZfRlVUVVJFX0JSRUFLSU5HX0NIQU5HRVMKKworICAvLyBSZW1vdmVzIHRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgcG9zaXRpb24uCisgIC8vCisgIC8vIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSByZW1vdmVkCisgIC8vIGVsZW1lbnQuCisgIC8vCisgIC8vIEludmFsaWRhdGVzIGFsbCBpdGVyYXRvcnMgYXQgb3IgYWZ0ZXIgdGhlIHJlbW92ZWQgZWxlbWVudCwgaW5jbHVkaW5nIGVuZCgpLgorICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBwb3NpdGlvbik7CisKKyAgLy8gUmVtb3ZlcyB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIFtmaXJzdCwgbGFzdCkuCisgIC8vCisgIC8vIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSByZW1vdmVkIHJhbmdlLgorICAvLworICAvLyBJbnZhbGlkYXRlcyBhbGwgaXRlcmF0b3JzIGF0IG9yIGFmdGVyIHRoZSByZW1vdmVkIHJhbmdlLCBpbmNsdWRpbmcgZW5kKCkuCisgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIGZpcnN0LCBjb25zdF9pdGVyYXRvciBsYXN0KTsKKworICAvLyBHZXRzIHRoZSBhcmVuYSBvbiB3aGljaCB0aGlzIFJlcGVhdGVkUHRyRmllbGQgc3RvcmVzIGl0cyBlbGVtZW50cy4KKyAgaW5saW5lIEFyZW5hKiBHZXRBcmVuYSgpIGNvbnN0OworCisgIC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KKyAgLy8KKyAgLy8gVGhpcyBpcyBwdWJsaWMgZHVlIHRvIGl0IGJlaW5nIGNhbGxlZCBieSBnZW5lcmF0ZWQgY29kZS4KKyAgdm9pZCBJbnRlcm5hbFN3YXAoUmVwZWF0ZWRQdHJGaWVsZCogb3RoZXIpIHsKKyAgICBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vdGU6ICBSZXBlYXRlZFB0ckZpZWxkIFNIT1VMRCBOT1QgYmUgc3ViY2xhc3NlZCBieSB1c2Vycy4KKyAgY2xhc3MgVHlwZUhhbmRsZXI7CisKKyAgLy8gSW50ZXJuYWwgdmVyc2lvbiBvZiBHZXRBcmVuYSgpLgorICBpbmxpbmUgQXJlbmEqIEdldE93bmluZ0FyZW5hKCkgY29uc3Q7CisKKyAgLy8gSW1wbGVtZW50YXRpb25zIGZvciBFeHRyYWN0U3VicmFuZ2UoKS4gVGhlIGNvcHlpbmcgYmVoYXZpb3IgbXVzdCBiZQorICAvLyBpbmNsdWRlZCBvbmx5IGlmIHRoZSB0eXBlIHN1cHBvcnRzIHRoZSBuZWNlc3Nhcnkgb3BlcmF0aW9ucyAoZS5nLiwKKyAgLy8gTWVyZ2VGcm9tKCkpLCBzbyB3ZSBtdXN0IHJlc29sdmUgdGhpcyBhdCBjb21waWxlIHRpbWUuIEV4dHJhY3RTdWJyYW5nZSgpCisgIC8vIHVzZXMgU0ZJTkFFIHRvIGNob29zZSBvbmUgb2YgdGhlIGJlbG93IGltcGxlbWVudGF0aW9ucy4KKyAgdm9pZCBFeHRyYWN0U3VicmFuZ2VJbnRlcm5hbChpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqKiBlbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRydWVfdHlwZSk7CisgIHZvaWQgRXh0cmFjdFN1YnJhbmdlSW50ZXJuYWwoaW50IHN0YXJ0LCBpbnQgbnVtLCBFbGVtZW50KiogZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmYWxzZV90eXBlKTsKKworICBmcmllbmQgY2xhc3MgQXJlbmE7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGZyaWVuZCBzdHJ1Y3QgV2Vha1JlcGVhdGVkUHRyRmllbGQ7CisKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2NsYXNzIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlR5cGVIYW5kbGVyCisgICAgOiBwdWJsaWMgaW50ZXJuYWw6OkdlbmVyaWNUeXBlSGFuZGxlcjxFbGVtZW50PiB7fTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIFJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+OjpUeXBlSGFuZGxlcgorICAgIDogcHVibGljIGludGVybmFsOjpTdHJpbmdUeXBlSGFuZGxlciB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Citjb25zdGV4cHIgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRQdHJGaWVsZCgpCisgICAgOiBSZXBlYXRlZFB0ckZpZWxkQmFzZSgpIHt9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlJlcGVhdGVkUHRyRmllbGQoQXJlbmEqIGFyZW5hKQorICAgIDogUmVwZWF0ZWRQdHJGaWVsZEJhc2UoYXJlbmEpIHt9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlJlcGVhdGVkUHRyRmllbGQoCisgICAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZCYgb3RoZXIpCisgICAgOiBSZXBlYXRlZFB0ckZpZWxkQmFzZSgpIHsKKyAgTWVyZ2VGcm9tKG90aGVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlciwgdHlwZW5hbWU+CitpbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRQdHJGaWVsZChJdGVyIGJlZ2luLCBJdGVyIGVuZCkgeworICBBZGQoYmVnaW4sIGVuZCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgorUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6flJlcGVhdGVkUHRyRmllbGQoKSB7CisjaWZkZWYgX19jcHBfaWZfY29uc3RleHByCisgIGlmIGNvbnN0ZXhwciAoc3RkOjppc19iYXNlX29mPE1lc3NhZ2VMaXRlLCBFbGVtZW50Pjo6dmFsdWUpIHsKKyNlbHNlCisgIGlmIChzdGQ6OmlzX2Jhc2Vfb2Y8TWVzc2FnZUxpdGUsIEVsZW1lbnQ+Ojp2YWx1ZSkgeworI2VuZGlmCisgICAgaWYgKE5lZWRzRGVzdHJveSgpKSBEZXN0cm95UHJvdG9zKCk7CisgIH0gZWxzZSB7CisgICAgRGVzdHJveTxUeXBlSGFuZGxlcj4oKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+JiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpvcGVyYXRvcj0oCisgICAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZCYgb3RoZXIpIHsKKyAgaWYgKHRoaXMgIT0gJm90aGVyKSBDb3B5RnJvbShvdGhlcik7CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRQdHJGaWVsZCgKKyAgICBSZXBlYXRlZFB0ckZpZWxkJiYgb3RoZXIpIG5vZXhjZXB0CisgICAgOiBSZXBlYXRlZFB0ckZpZWxkKCkgeworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICBDb3B5RnJvbShvdGhlcik7CisjZWxzZSAgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAvLyBXZSBkb24ndCBqdXN0IGNhbGwgU3dhcCgmb3RoZXIpIGhlcmUgYmVjYXVzZSBpdCB3b3VsZCBwZXJmb3JtIDMgY29waWVzIGlmCisgIC8vIG90aGVyIGlzIG9uIGFuIGFyZW5hLiBUaGlzIGZpZWxkIGNhbid0IGJlIG9uIGFuIGFyZW5hIGJlY2F1c2UgYXJlbmEKKyAgLy8gY29uc3RydWN0aW9uIGFsd2F5cyB1c2VzIHRoZSBBcmVuYSogYWNjZXB0aW5nIGNvbnN0cnVjdG9yLgorICBpZiAob3RoZXIuR2V0T3duaW5nQXJlbmEoKSkgeworICAgIENvcHlGcm9tKG90aGVyKTsKKyAgfSBlbHNlIHsKKyAgICBJbnRlcm5hbFN3YXAoJm90aGVyKTsKKyAgfQorI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD4mIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Om9wZXJhdG9yPSgKKyAgICBSZXBlYXRlZFB0ckZpZWxkJiYgb3RoZXIpIG5vZXhjZXB0IHsKKyAgLy8gV2UgZG9uJ3QganVzdCBjYWxsIFN3YXAoJm90aGVyKSBoZXJlIGJlY2F1c2UgaXQgd291bGQgcGVyZm9ybSAzIGNvcGllcyBpZgorICAvLyB0aGUgdHdvIGZpZWxkcyBhcmUgb24gZGlmZmVyZW50IGFyZW5hcy4KKyAgaWYgKHRoaXMgIT0gJm90aGVyKSB7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gb3RoZXIuR2V0T3duaW5nQXJlbmEoKQorI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICB8fCBHZXRPd25pbmdBcmVuYSgpID09IG51bGxwdHIKKyNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgQ29weUZyb20ob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICBJbnRlcm5hbFN3YXAoJm90aGVyKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBib29sIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmVtcHR5KCkgY29uc3QgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OmVtcHR5KCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGludCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpzaXplKCkgY29uc3QgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OnNpemUoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgY29uc3QgRWxlbWVudCYgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6R2V0KGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkdldDxUeXBlSGFuZGxlcj4oaW5kZXgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBjb25zdCBFbGVtZW50JiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjphdChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjphdDxUeXBlSGFuZGxlcj4oaW5kZXgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBFbGVtZW50JiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjphdChpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjphdDxUeXBlSGFuZGxlcj4oaW5kZXgpOworfQorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIEVsZW1lbnQqIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Ok11dGFibGUoaW50IGluZGV4KSB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TXV0YWJsZTxUeXBlSGFuZGxlcj4oaW5kZXgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBFbGVtZW50KiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpBZGQoKSB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6QWRkPFR5cGVIYW5kbGVyPigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkFkZChFbGVtZW50JiYgdmFsdWUpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkFkZDxUeXBlSGFuZGxlcj4oc3RkOjptb3ZlKHZhbHVlKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpBZGQoSXRlciBiZWdpbiwgSXRlciBlbmQpIHsKKyAgaWYgKHN0ZDo6aXNfYmFzZV9vZjwKKyAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeT46OnZhbHVlKSB7CisgICAgaW50IHJlc2VydmUgPSBzdGQ6OmRpc3RhbmNlKGJlZ2luLCBlbmQpOworICAgIFJlc2VydmUoc2l6ZSgpICsgcmVzZXJ2ZSk7CisgIH0KKyAgZm9yICg7IGJlZ2luICE9IGVuZDsgKytiZWdpbikgeworICAgICpBZGQoKSA9ICpiZWdpbjsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlJlbW92ZUxhc3QoKSB7CisgIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZW1vdmVMYXN0PFR5cGVIYW5kbGVyPigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkRlbGV0ZVN1YnJhbmdlKGludCBzdGFydCwgaW50IG51bSkgeworICBHT09HTEVfRENIRUNLX0dFKHN0YXJ0LCAwKTsKKyAgR09PR0xFX0RDSEVDS19HRShudW0sIDApOworICBHT09HTEVfRENIRUNLX0xFKHN0YXJ0ICsgbnVtLCBzaXplKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgKytpKSB7CisgICAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkRlbGV0ZTxUeXBlSGFuZGxlcj4oc3RhcnQgKyBpKTsKKyAgfQorICBVbnNhZmVBcmVuYUV4dHJhY3RTdWJyYW5nZShzdGFydCwgbnVtLCBudWxscHRyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpFeHRyYWN0U3VicmFuZ2UoaW50IHN0YXJ0LCBpbnQgbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQqKiBlbGVtZW50cykgeworICB0eXBlbmFtZSBpbnRlcm5hbDo6VHlwZUltcGxlbWVudHNNZXJnZUJlaGF2aW9yPAorICAgICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGU+Ojp0eXBlIHQ7CisgIEV4dHJhY3RTdWJyYW5nZUludGVybmFsKHN0YXJ0LCBudW0sIGVsZW1lbnRzLCB0KTsKK30KKworLy8gRXh0cmFjdFN1YnJhbmdlKCkgaW1wbGVtZW50YXRpb24gZm9yIHR5cGVzIHRoYXQgaW1wbGVtZW50IG1lcmdlL2NvcHkKKy8vIGJlaGF2aW9yLgordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpFeHRyYWN0U3VicmFuZ2VJbnRlcm5hbCgKKyAgICBpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqKiBlbGVtZW50cywgc3RkOjp0cnVlX3R5cGUpIHsKKyAgR09PR0xFX0RDSEVDS19HRShzdGFydCwgMCk7CisgIEdPT0dMRV9EQ0hFQ0tfR0UobnVtLCAwKTsKKyAgR09PR0xFX0RDSEVDS19MRShzdGFydCArIG51bSwgc2l6ZSgpKTsKKworICBpZiAobnVtID09IDApIHJldHVybjsKKworICBHT09HTEVfRENIRUNLX05FKGVsZW1lbnRzLCBudWxscHRyKQorICAgICAgPDwgIlJlbGVhc2luZyBlbGVtZW50cyB3aXRob3V0IHRyYW5zZmVycmluZyBvd25lcnNoaXAgaXMgYW4gdW5zYWZlICIKKyAgICAgICAgICJvcGVyYXRpb24uICBVc2UgVW5zYWZlQXJlbmFFeHRyYWN0U3VicmFuZ2UuIjsKKyAgaWYgKGVsZW1lbnRzID09IG51bGxwdHIpIHsKKyAgICBDbG9zZUdhcChzdGFydCwgbnVtKTsKKyAgICByZXR1cm47CisgIH0KKworICBBcmVuYSogYXJlbmEgPSBHZXRPd25pbmdBcmVuYSgpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICAvLyBBbHdheXMgY29weS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgIGVsZW1lbnRzW2ldID0gY29weTxUeXBlSGFuZGxlcj4oCisgICAgICAgIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpNdXRhYmxlPFR5cGVIYW5kbGVyPihpICsgc3RhcnQpKTsKKyAgfQorICBpZiAoYXJlbmEgPT0gbnVsbHB0cikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICAgIGRlbGV0ZSBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TXV0YWJsZTxUeXBlSGFuZGxlcj4oaSArIHN0YXJ0KTsKKyAgICB9CisgIH0KKyNlbHNlICAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIC8vIElmIHdlJ3JlIG9uIGFuIGFyZW5hLCB3ZSBwZXJmb3JtIGEgY29weSBmb3IgZWFjaCBlbGVtZW50IHNvIHRoYXQgdGhlCisgIC8vIHJldHVybmVkIGVsZW1lbnRzIGFyZSBoZWFwLWFsbG9jYXRlZC4gT3RoZXJ3aXNlLCBqdXN0IGZvcndhcmQgaXQuCisgIGlmIChhcmVuYSAhPSBudWxscHRyKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgICAgZWxlbWVudHNbaV0gPSBjb3B5PFR5cGVIYW5kbGVyPigKKyAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TXV0YWJsZTxUeXBlSGFuZGxlcj4oaSArIHN0YXJ0KSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICAgIGVsZW1lbnRzW2ldID0gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok11dGFibGU8VHlwZUhhbmRsZXI+KGkgKyBzdGFydCk7CisgICAgfQorICB9CisjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgQ2xvc2VHYXAoc3RhcnQsIG51bSk7Cit9CisKKy8vIEV4dHJhY3RTdWJyYW5nZSgpIGltcGxlbWVudGF0aW9uIGZvciB0eXBlcyB0aGF0IGRvIG5vdCBpbXBsZW1lbnQgbWVyZ2UvY29weQorLy8gYmVoYXZpb3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkV4dHJhY3RTdWJyYW5nZUludGVybmFsKAorICAgIGludCBzdGFydCwgaW50IG51bSwgRWxlbWVudCoqIGVsZW1lbnRzLCBzdGQ6OmZhbHNlX3R5cGUpIHsKKyAgLy8gVGhpcyBjYXNlIGlzIGlkZW50aWNhbCB0byBVbnNhZmVBcmVuYUV4dHJhY3RTdWJyYW5nZSgpLiBIb3dldmVyLCBzaW5jZQorICAvLyBFeHRyYWN0U3VicmFuZ2UoKSBtdXN0IHJldHVybiBoZWFwLWFsbG9jYXRlZCBvYmplY3RzIGJ5IGNvbnRyYWN0LCBhbmQgd2UKKyAgLy8gY2Fubm90IGZ1bGZpbGwgdGhpcyBjb250cmFjdCBpZiB3ZSBhcmUgYW4gb24gYXJlbmEsIHdlIG11c3QgR09PR0xFX0RDSEVDSygpIHRoYXQKKyAgLy8gd2UgYXJlIG5vdCBvbiBhbiBhcmVuYS4KKyAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG51bGxwdHIpCisgICAgICA8PCAiRXh0cmFjdFN1YnJhbmdlKCkgd2hlbiBhcmVuYSBpcyBub24tbnVsbHB0ciBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuICIKKyAgICAgIDw8ICJ0aGUgRWxlbWVudCB0eXBlIHN1cHBsaWVzIGEgTWVyZ2VGcm9tKCkgb3BlcmF0aW9uIHRvIG1ha2UgY29waWVzLiI7CisgIFVuc2FmZUFyZW5hRXh0cmFjdFN1YnJhbmdlKHN0YXJ0LCBudW0sIGVsZW1lbnRzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpVbnNhZmVBcmVuYUV4dHJhY3RTdWJyYW5nZSgKKyAgICBpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqKiBlbGVtZW50cykgeworICBHT09HTEVfRENIRUNLX0dFKHN0YXJ0LCAwKTsKKyAgR09PR0xFX0RDSEVDS19HRShudW0sIDApOworICBHT09HTEVfRENIRUNLX0xFKHN0YXJ0ICsgbnVtLCBzaXplKCkpOworCisgIGlmIChudW0gPiAwKSB7CisgICAgLy8gU2F2ZSB0aGUgdmFsdWVzIG9mIHRoZSByZW1vdmVkIGVsZW1lbnRzIGlmIHJlcXVlc3RlZC4KKyAgICBpZiAoZWxlbWVudHMgIT0gbnVsbHB0cikgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgICAgICBlbGVtZW50c1tpXSA9IFJlcGVhdGVkUHRyRmllbGRCYXNlOjpNdXRhYmxlPFR5cGVIYW5kbGVyPihpICsgc3RhcnQpOworICAgICAgfQorICAgIH0KKyAgICBDbG9zZUdhcChzdGFydCwgbnVtKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkNsZWFyKCkgeworICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6Q2xlYXI8VHlwZUhhbmRsZXI+KCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6TWVyZ2VGcm9tKAorICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQmIG90aGVyKSB7CisgIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpNZXJnZUZyb208VHlwZUhhbmRsZXI+KG90aGVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpDb3B5RnJvbShjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcikgeworICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6Q29weUZyb208VHlwZUhhbmRsZXI+KG90aGVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkFzc2lnbihJdGVyIGJlZ2luLCBJdGVyIGVuZCkgeworICBDbGVhcigpOworICBBZGQoYmVnaW4sIGVuZCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCitSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjplcmFzZShjb25zdF9pdGVyYXRvciBwb3NpdGlvbikgeworICByZXR1cm4gZXJhc2UocG9zaXRpb24sIHBvc2l0aW9uICsgMSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCitSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjplcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCkgeworICBzaXplX3R5cGUgcG9zX29mZnNldCA9IHN0ZDo6ZGlzdGFuY2UoY2JlZ2luKCksIGZpcnN0KTsKKyAgc2l6ZV90eXBlIGxhc3Rfb2Zmc2V0ID0gc3RkOjpkaXN0YW5jZShjYmVnaW4oKSwgbGFzdCk7CisgIERlbGV0ZVN1YnJhbmdlKHBvc19vZmZzZXQsIGxhc3Rfb2Zmc2V0IC0gcG9zX29mZnNldCk7CisgIHJldHVybiBiZWdpbigpICsgcG9zX29mZnNldDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgRWxlbWVudCoqIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Om11dGFibGVfZGF0YSgpIHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjptdXRhYmxlX2RhdGE8VHlwZUhhbmRsZXI+KCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGNvbnN0IEVsZW1lbnQqIGNvbnN0KiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpkYXRhKCkgY29uc3QgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OmRhdGE8VHlwZUhhbmRsZXI+KCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6U3dhcChSZXBlYXRlZFB0ckZpZWxkKiBvdGhlcikgeworICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuOworICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6U3dhcDxUeXBlSGFuZGxlcj4ob3RoZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlVuc2FmZUFyZW5hU3dhcCgKKyAgICBSZXBlYXRlZFB0ckZpZWxkKiBvdGhlcikgeworICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuOworICBHT09HTEVfRENIRUNLX0VRKEdldE93bmluZ0FyZW5hKCksIG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkludGVybmFsU3dhcChvdGhlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6U3dhcEVsZW1lbnRzKGludCBpbmRleDEsIGludCBpbmRleDIpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIEFyZW5hKiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpHZXRBcmVuYSgpIGNvbnN0IHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpHZXRBcmVuYSgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBBcmVuYSogUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6R2V0T3duaW5nQXJlbmEoKSBjb25zdCB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6R2V0T3duaW5nQXJlbmEoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgc2l6ZV90IFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKCkgY29uc3QgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nPFR5cGVIYW5kbGVyPigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkFkZEFsbG9jYXRlZChFbGVtZW50KiB2YWx1ZSkgeworICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6QWRkQWxsb2NhdGVkPFR5cGVIYW5kbGVyPih2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6VW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQoRWxlbWVudCogdmFsdWUpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkPFR5cGVIYW5kbGVyPih2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIEVsZW1lbnQqIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlJlbGVhc2VMYXN0KCkgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlJlbGVhc2VMYXN0PFR5cGVIYW5kbGVyPigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBFbGVtZW50KiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpVbnNhZmVBcmVuYVJlbGVhc2VMYXN0KCkgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlVuc2FmZUFyZW5hUmVsZWFzZUxhc3Q8VHlwZUhhbmRsZXI+KCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGludCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpDbGVhcmVkQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6Q2xlYXJlZENvdW50KCk7Cit9CisKKyNpZm5kZWYgUFJPVE9CVUZfRlVUVVJFX0JSRUFLSU5HX0NIQU5HRVMKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6QWRkQ2xlYXJlZChFbGVtZW50KiB2YWx1ZSkgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkFkZENsZWFyZWQ8VHlwZUhhbmRsZXI+KHZhbHVlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6UmVsZWFzZUNsZWFyZWQoKSB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVsZWFzZUNsZWFyZWQ8VHlwZUhhbmRsZXI+KCk7Cit9CisjZW5kaWYgIC8vICFQUk9UT0JVRl9GVVRVUkVfQlJFQUtJTkdfQ0hBTkdFUworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlJlc2VydmUoaW50IG5ld19zaXplKSB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVzZXJ2ZShuZXdfc2l6ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGludCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpDYXBhY2l0eSgpIGNvbnN0IHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDYXBhY2l0eSgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFNUTC1saWtlIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uIGZvciBSZXBlYXRlZFB0ckZpZWxkLiAgWW91IHNob3VsZCBub3QKKy8vIHJlZmVyIHRvIHRoaXMgY2xhc3MgZGlyZWN0bHk7IHVzZSBSZXBlYXRlZFB0ckZpZWxkPFQ+OjppdGVyYXRvciBpbnN0ZWFkLgorLy8KKy8vIFRoZSBpdGVyYXRvciBmb3IgUmVwZWF0ZWRQdHJGaWVsZDxUPiwgUmVwZWF0ZWRQdHJJdGVyYXRvcjxUPiwgaXMKKy8vIHZlcnkgc2ltaWxhciB0byBpdGVyYXRvcl9wdHI8VCoqPiBpbiB1dGlsL2d0bC9pdGVyYXRvcl9hZGFwdG9ycy5oLAorLy8gYnV0IGFkZHMgcmFuZG9tLWFjY2VzcyBvcGVyYXRvcnMgYW5kIGlzIG1vZGlmaWVkIHRvIHdyYXAgYSB2b2lkKiogYmFzZQorLy8gaXRlcmF0b3IgKHNpbmNlIFJlcGVhdGVkUHRyRmllbGQgc3RvcmVzIGl0cyBhcnJheSBhcyBhIHZvaWQqIGFycmF5IGFuZAorLy8gY2FzdGluZyB2b2lkKiogdG8gVCoqIHdvdWxkIHZpb2xhdGUgQysrIGFsaWFzaW5nIHJ1bGVzKS4KKy8vCisvLyBUaGlzIGNvZGUgYmFzZWQgb24gbmV0L3Byb3RvL3Byb3RvLWFycmF5LWludGVybmFsLmggYnkgSmVmZnJleSBZYXNza2luCisvLyAoanlhc3NraW5AZ29vZ2xlLmNvbSkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2NsYXNzIFJlcGVhdGVkUHRySXRlcmF0b3IgeworIHB1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3IgPSBSZXBlYXRlZFB0ckl0ZXJhdG9yPEVsZW1lbnQ+OworICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWc7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDxFbGVtZW50Pjo6dHlwZTsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisgIHVzaW5nIHBvaW50ZXIgPSBFbGVtZW50KjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gRWxlbWVudCY7CisKKyAgUmVwZWF0ZWRQdHJJdGVyYXRvcigpIDogaXRfKG51bGxwdHIpIHt9CisgIGV4cGxpY2l0IFJlcGVhdGVkUHRySXRlcmF0b3Iodm9pZCogY29uc3QqIGl0KSA6IGl0XyhpdCkge30KKworICAvLyBBbGxvd3MgInVwY2FzdGluZyIgZnJvbSBSZXBlYXRlZFB0ckl0ZXJhdG9yPFQqKj4gdG8KKyAgLy8gUmVwZWF0ZWRQdHJJdGVyYXRvcjxjb25zdCBUKmNvbnN0Kj4uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdGhlckVsZW1lbnQsCisgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPAorICAgICAgICAgICAgICAgIE90aGVyRWxlbWVudCosIHBvaW50ZXI+Ojp2YWx1ZT46OnR5cGUqID0gbnVsbHB0cj4KKyAgUmVwZWF0ZWRQdHJJdGVyYXRvcihjb25zdCBSZXBlYXRlZFB0ckl0ZXJhdG9yPE90aGVyRWxlbWVudD4mIG90aGVyKQorICAgICAgOiBpdF8ob3RoZXIuaXRfKSB7fQorCisgIC8vIGRlcmVmZXJlbmNlYWJsZQorICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8RWxlbWVudCo+KCppdF8pOyB9CisgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYob3BlcmF0b3IqKCkpOyB9CisKKyAgLy8ge2luYyxkZWN9cmVtZW50YWJsZQorICBpdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICArK2l0XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuIGl0ZXJhdG9yKGl0XysrKTsgfQorICBpdGVyYXRvciYgb3BlcmF0b3ItLSgpIHsKKyAgICAtLWl0XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaXRlcmF0b3Igb3BlcmF0b3ItLShpbnQpIHsgcmV0dXJuIGl0ZXJhdG9yKGl0Xy0tKTsgfQorCisgIC8vIGVxdWFsaXR5X2NvbXBhcmFibGUKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgeCwgY29uc3QgaXRlcmF0b3ImIHkpIHsKKyAgICByZXR1cm4geC5pdF8gPT0geS5pdF87CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgeCwgY29uc3QgaXRlcmF0b3ImIHkpIHsKKyAgICByZXR1cm4geC5pdF8gIT0geS5pdF87CisgIH0KKworICAvLyBsZXNzX3RoYW5fY29tcGFyYWJsZQorICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgaXRlcmF0b3ImIHgsIGNvbnN0IGl0ZXJhdG9yJiB5KSB7CisgICAgcmV0dXJuIHguaXRfIDwgeS5pdF87CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8PShjb25zdCBpdGVyYXRvciYgeCwgY29uc3QgaXRlcmF0b3ImIHkpIHsKKyAgICByZXR1cm4geC5pdF8gPD0geS5pdF87CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGl0ZXJhdG9yJiB4LCBjb25zdCBpdGVyYXRvciYgeSkgeworICAgIHJldHVybiB4Lml0XyA+IHkuaXRfOworICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPj0oY29uc3QgaXRlcmF0b3ImIHgsIGNvbnN0IGl0ZXJhdG9yJiB5KSB7CisgICAgcmV0dXJuIHguaXRfID49IHkuaXRfOworICB9CisKKyAgLy8gYWRkYWJsZSwgc3VidHJhY3RhYmxlCisgIGl0ZXJhdG9yJiBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBkKSB7CisgICAgaXRfICs9IGQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGZyaWVuZCBpdGVyYXRvciBvcGVyYXRvcisoaXRlcmF0b3IgaXQsIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBkKSB7CisgICAgaXQgKz0gZDsKKyAgICByZXR1cm4gaXQ7CisgIH0KKyAgZnJpZW5kIGl0ZXJhdG9yIG9wZXJhdG9yKyhjb25zdCBkaWZmZXJlbmNlX3R5cGUgZCwgaXRlcmF0b3IgaXQpIHsKKyAgICBpdCArPSBkOworICAgIHJldHVybiBpdDsKKyAgfQorICBpdGVyYXRvciYgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgZCkgeworICAgIGl0XyAtPSBkOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBmcmllbmQgaXRlcmF0b3Igb3BlcmF0b3ItKGl0ZXJhdG9yIGl0LCBkaWZmZXJlbmNlX3R5cGUgZCkgeworICAgIGl0IC09IGQ7CisgICAgcmV0dXJuIGl0OworICB9CisKKyAgLy8gaW5kZXhhYmxlCisgIHJlZmVyZW5jZSBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBkKSBjb25zdCB7IHJldHVybiAqKCp0aGlzICsgZCk7IH0KKworICAvLyByYW5kb20gYWNjZXNzIGl0ZXJhdG9yCisgIGZyaWVuZCBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKGl0ZXJhdG9yIGl0MSwgaXRlcmF0b3IgaXQyKSB7CisgICAgcmV0dXJuIGl0MS5pdF8gLSBpdDIuaXRfOworICB9CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJFbGVtZW50PgorICBmcmllbmQgY2xhc3MgUmVwZWF0ZWRQdHJJdGVyYXRvcjsKKworICAvLyBUaGUgaW50ZXJuYWwgaXRlcmF0b3IuCisgIHZvaWQqIGNvbnN0KiBpdF87Cit9OworCisvLyBQcm92aWRlcyBhbiBpdGVyYXRvciB0aGF0IG9wZXJhdGVzIG9uIHBvaW50ZXJzIHRvIHRoZSB1bmRlcmx5aW5nIG9iamVjdHMKKy8vIHJhdGhlciB0aGFuIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMgYXMgUmVwZWF0ZWRQdHJJdGVyYXRvciBkb2VzLgorLy8gQ29uc2lkZXIgdXNpbmcgdGhpcyB3aGVuIHdvcmtpbmcgd2l0aCBzdGwgYWxnb3JpdGhtcyB0aGF0IGNoYW5nZQorLy8gdGhlIGFycmF5LgorLy8gVGhlIFZvaWRQdHIgdGVtcGxhdGUgcGFyYW1ldGVyIGhvbGRzIHRoZSB0eXBlLWFnbm9zdGljIHBvaW50ZXIgdmFsdWUKKy8vIHJlZmVyZW5jZWQgYnkgdGhlIGl0ZXJhdG9yLiAgSXQgc2hvdWxkIGVpdGhlciBiZSAidm9pZCAqIiBmb3IgYSBtdXRhYmxlCisvLyBpdGVyYXRvciwgb3IgImNvbnN0IHZvaWQqIGNvbnN0IiBmb3IgYSBjb25zdGFudCBpdGVyYXRvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50LCB0eXBlbmFtZSBWb2lkUHRyPgorY2xhc3MgUmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yIHsKKyBwdWJsaWM6CisgIHVzaW5nIGl0ZXJhdG9yID0gUmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yPEVsZW1lbnQsIFZvaWRQdHI+OworICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWc7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDxFbGVtZW50Pjo6dHlwZTsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisgIHVzaW5nIHBvaW50ZXIgPSBFbGVtZW50KjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gRWxlbWVudCY7CisKKyAgUmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yKCkgOiBpdF8obnVsbHB0cikge30KKyAgZXhwbGljaXQgUmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yKFZvaWRQdHIqIGl0KSA6IGl0XyhpdCkge30KKworICAvLyBBbGxvd3MgInVwY2FzdGluZyIgZnJvbSBSZXBlYXRlZFB0ck92ZXJQdHJzSXRlcmF0b3I8VCoqPiB0bworICAvLyBSZXBlYXRlZFB0ck92ZXJQdHJzSXRlcmF0b3I8Y29uc3QgVCpjb25zdCo+LgorICB0ZW1wbGF0ZSA8CisgICAgICB0eXBlbmFtZSBPdGhlckVsZW1lbnQsIHR5cGVuYW1lIE90aGVyVm9pZFB0ciwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8T3RoZXJFbGVtZW50KiwgcG9pbnRlcj46OnZhbHVlICYmCisgICAgICAgICAgc3RkOjppc19jb252ZXJ0aWJsZTxPdGhlclZvaWRQdHIqLCBWb2lkUHRyPjo6dmFsdWU+Ojp0eXBlKiA9IG51bGxwdHI+CisgIFJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcigKKyAgICAgIGNvbnN0IFJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcjxPdGhlckVsZW1lbnQsIE90aGVyVm9pZFB0cj4mIG90aGVyKQorICAgICAgOiBpdF8ob3RoZXIuaXRfKSB7fQorCisgIC8vIGRlcmVmZXJlbmNlYWJsZQorICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8RWxlbWVudCo+KGl0Xyk7IH0KKyAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJihvcGVyYXRvciooKSk7IH0KKworICAvLyB7aW5jLGRlY31yZW1lbnRhYmxlCisgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgICsraXRfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gaXRlcmF0b3IoaXRfKyspOyB9CisgIGl0ZXJhdG9yJiBvcGVyYXRvci0tKCkgeworICAgIC0taXRfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpdGVyYXRvciBvcGVyYXRvci0tKGludCkgeyByZXR1cm4gaXRlcmF0b3IoaXRfLS0pOyB9CisKKyAgLy8gZXF1YWxpdHlfY29tcGFyYWJsZQorICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiB4LCBjb25zdCBpdGVyYXRvciYgeSkgeworICAgIHJldHVybiB4Lml0XyA9PSB5Lml0XzsKKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiB4LCBjb25zdCBpdGVyYXRvciYgeSkgeworICAgIHJldHVybiB4Lml0XyAhPSB5Lml0XzsKKyAgfQorCisgIC8vIGxlc3NfdGhhbl9jb21wYXJhYmxlCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdCBpdGVyYXRvciYgeCwgY29uc3QgaXRlcmF0b3ImIHkpIHsKKyAgICByZXR1cm4geC5pdF8gPCB5Lml0XzsKKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGl0ZXJhdG9yJiB4LCBjb25zdCBpdGVyYXRvciYgeSkgeworICAgIHJldHVybiB4Lml0XyA8PSB5Lml0XzsKKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvcj4oY29uc3QgaXRlcmF0b3ImIHgsIGNvbnN0IGl0ZXJhdG9yJiB5KSB7CisgICAgcmV0dXJuIHguaXRfID4geS5pdF87CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+PShjb25zdCBpdGVyYXRvciYgeCwgY29uc3QgaXRlcmF0b3ImIHkpIHsKKyAgICByZXR1cm4geC5pdF8gPj0geS5pdF87CisgIH0KKworICAvLyBhZGRhYmxlLCBzdWJ0cmFjdGFibGUKKyAgaXRlcmF0b3ImIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIGQpIHsKKyAgICBpdF8gKz0gZDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgZnJpZW5kIGl0ZXJhdG9yIG9wZXJhdG9yKyhpdGVyYXRvciBpdCwgZGlmZmVyZW5jZV90eXBlIGQpIHsKKyAgICBpdCArPSBkOworICAgIHJldHVybiBpdDsKKyAgfQorICBmcmllbmQgaXRlcmF0b3Igb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBkLCBpdGVyYXRvciBpdCkgeworICAgIGl0ICs9IGQ7CisgICAgcmV0dXJuIGl0OworICB9CisgIGl0ZXJhdG9yJiBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBkKSB7CisgICAgaXRfIC09IGQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGZyaWVuZCBpdGVyYXRvciBvcGVyYXRvci0oaXRlcmF0b3IgaXQsIGRpZmZlcmVuY2VfdHlwZSBkKSB7CisgICAgaXQgLT0gZDsKKyAgICByZXR1cm4gaXQ7CisgIH0KKworICAvLyBpbmRleGFibGUKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIGQpIGNvbnN0IHsgcmV0dXJuICooKnRoaXMgKyBkKTsgfQorCisgIC8vIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IKKyAgZnJpZW5kIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvci0oaXRlcmF0b3IgaXQxLCBpdGVyYXRvciBpdDIpIHsKKyAgICByZXR1cm4gaXQxLml0XyAtIGl0Mi5pdF87CisgIH0KKworIHByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdGhlckVsZW1lbnQsIHR5cGVuYW1lIE90aGVyVm9pZFB0cj4KKyAgZnJpZW5kIGNsYXNzIFJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcjsKKworICAvLyBUaGUgaW50ZXJuYWwgaXRlcmF0b3IuCisgIFZvaWRQdHIqIGl0XzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjppdGVyYXRvcgorUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6YmVnaW4oKSB7CisgIHJldHVybiBpdGVyYXRvcihyYXdfZGF0YSgpKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmNvbnN0X2l0ZXJhdG9yCitSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpiZWdpbigpIGNvbnN0IHsKKyAgcmV0dXJuIGl0ZXJhdG9yKHJhd19kYXRhKCkpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Y29uc3RfaXRlcmF0b3IKK1JlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmNiZWdpbigpIGNvbnN0IHsKKyAgcmV0dXJuIGJlZ2luKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjppdGVyYXRvcgorUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6ZW5kKCkgeworICByZXR1cm4gaXRlcmF0b3IocmF3X2RhdGEoKSArIHNpemUoKSk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpjb25zdF9pdGVyYXRvcgorUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6ZW5kKCkgY29uc3QgeworICByZXR1cm4gaXRlcmF0b3IocmF3X2RhdGEoKSArIHNpemUoKSk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpjb25zdF9pdGVyYXRvcgorUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Y2VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGVuZCgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpwb2ludGVyX2l0ZXJhdG9yCitSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpwb2ludGVyX2JlZ2luKCkgeworICByZXR1cm4gcG9pbnRlcl9pdGVyYXRvcihyYXdfbXV0YWJsZV9kYXRhKCkpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvcgorUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6cG9pbnRlcl9iZWdpbigpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X3BvaW50ZXJfaXRlcmF0b3IoY29uc3RfY2FzdDxjb25zdCB2b2lkKiBjb25zdCo+KHJhd19kYXRhKCkpKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OnBvaW50ZXJfaXRlcmF0b3IKK1JlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OnBvaW50ZXJfZW5kKCkgeworICByZXR1cm4gcG9pbnRlcl9pdGVyYXRvcihyYXdfbXV0YWJsZV9kYXRhKCkgKyBzaXplKCkpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvcgorUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6cG9pbnRlcl9lbmQoKSBjb25zdCB7CisgIHJldHVybiBjb25zdF9wb2ludGVyX2l0ZXJhdG9yKAorICAgICAgY29uc3RfY2FzdDxjb25zdCB2b2lkKiBjb25zdCo+KHJhd19kYXRhKCkgKyBzaXplKCkpKTsKK30KKworLy8gSXRlcmF0b3JzIGFuZCBoZWxwZXIgZnVuY3Rpb25zIHRoYXQgZm9sbG93IHRoZSBzcGlyaXQgb2YgdGhlIFNUTAorLy8gc3RkOjpiYWNrX2luc2VydF9pdGVyYXRvciBhbmQgc3RkOjpiYWNrX2luc2VydGVyIGJ1dCBhcmUgdGFpbG9yLW1hZGUKKy8vIGZvciBSZXBlYXRlZEZpZWxkIGFuZCBSZXBlYXRlZFB0ckZpZWxkLiBUeXBpY2FsIHVzYWdlIHdvdWxkIGJlOgorLy8KKy8vICAgc3RkOjpjb3B5KHNvbWVfc2VxdWVuY2UuYmVnaW4oKSwgc29tZV9zZXF1ZW5jZS5lbmQoKSwKKy8vICAgICAgICAgICAgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIocHJvdG8ubXV0YWJsZV9zZXF1ZW5jZSgpKSk7CisvLworLy8gUG9ydGVkIGJ5IGpvaGFubmVzIGZyb20gdXRpbC9ndGwvcHJvdG8tYXJyYXktaXRlcmF0b3JzLmgKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQSBiYWNrIGluc2VydGVyIGZvciBSZXBlYXRlZFB0ckZpZWxkIG9iamVjdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3IgeworIHB1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6Om91dHB1dF9pdGVyYXRvcl90YWc7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworICB1c2luZyBwb2ludGVyID0gdm9pZDsKKyAgdXNpbmcgcmVmZXJlbmNlID0gdm9pZDsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcihSZXBlYXRlZFB0ckZpZWxkPFQ+KiBjb25zdCBtdXRhYmxlX2ZpZWxkKQorICAgICAgOiBmaWVsZF8obXV0YWJsZV9maWVsZCkge30KKyAgUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3I9KGNvbnN0IFQmIHZhbHVlKSB7CisgICAgKmZpZWxkXy0+QWRkKCkgPSB2YWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3I9KAorICAgICAgY29uc3QgVCogY29uc3QgcHRyX3RvX3ZhbHVlKSB7CisgICAgKmZpZWxkXy0+QWRkKCkgPSAqcHRyX3RvX3ZhbHVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcj0oVCYmIHZhbHVlKSB7CisgICAgKmZpZWxkXy0+QWRkKCkgPSBzdGQ6Om1vdmUodmFsdWUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorICBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKyhpbnQgLyogdW51c2VkICovKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyBwcml2YXRlOgorICBSZXBlYXRlZFB0ckZpZWxkPFQ+KiBmaWVsZF87Cit9OworCisvLyBBIGJhY2sgaW5zZXJ0ZXIgZm9yIFJlcGVhdGVkUHRyRmllbGRzIHRoYXQgaW5zZXJ0cyBieSB0cmFuc2ZlcnJpbmcgb3duZXJzaGlwCisvLyBvZiBhIHBvaW50ZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3IgeworIHB1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6Om91dHB1dF9pdGVyYXRvcl90YWc7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworICB1c2luZyBwb2ludGVyID0gdm9pZDsKKyAgdXNpbmcgcmVmZXJlbmNlID0gdm9pZDsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisKKyAgZXhwbGljaXQgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcigKKyAgICAgIFJlcGVhdGVkUHRyRmllbGQ8VD4qIGNvbnN0IG11dGFibGVfZmllbGQpCisgICAgICA6IGZpZWxkXyhtdXRhYmxlX2ZpZWxkKSB7fQorICBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcj0oCisgICAgICBUKiBjb25zdCBwdHJfdG9fdmFsdWUpIHsKKyAgICBmaWVsZF8tPkFkZEFsbG9jYXRlZChwdHJfdG9fdmFsdWUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorICBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKyhpbnQgLyogdW51c2VkICovKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyBwcml2YXRlOgorICBSZXBlYXRlZFB0ckZpZWxkPFQ+KiBmaWVsZF87Cit9OworCisvLyBBbG1vc3QgaWRlbnRpY2FsIHRvIEFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3IuIFRoaXMgb25lCisvLyB1c2VzIHRoZSBVbnNhZmVBcmVuYUFkZEFsbG9jYXRlZCBpbnN0ZWFkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbnNhZmVBcmVuYUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3IgeworIHB1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6Om91dHB1dF9pdGVyYXRvcl90YWc7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworICB1c2luZyBwb2ludGVyID0gdm9pZDsKKyAgdXNpbmcgcmVmZXJlbmNlID0gdm9pZDsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisKKyAgZXhwbGljaXQgVW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yKAorICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxUPiogY29uc3QgbXV0YWJsZV9maWVsZCkKKyAgICAgIDogZmllbGRfKG11dGFibGVfZmllbGQpIHt9CisgIFVuc2FmZUFyZW5hQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3I9KAorICAgICAgVCBjb25zdCogY29uc3QgcHRyX3RvX3ZhbHVlKSB7CisgICAgZmllbGRfLT5VbnNhZmVBcmVuYUFkZEFsbG9jYXRlZChjb25zdF9jYXN0PFQqPihwdHJfdG9fdmFsdWUpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgVW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvciooKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFVuc2FmZUFyZW5hQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKygpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgVW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKAorICAgICAgaW50IC8qIHVudXNlZCAqLykgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgUmVwZWF0ZWRQdHJGaWVsZDxUPiogZmllbGRfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFByb3ZpZGVzIGEgYmFjayBpbnNlcnQgaXRlcmF0b3IgZm9yIFJlcGVhdGVkUHRyRmllbGQgaW5zdGFuY2VzLAorLy8gc2ltaWxhciB0byBzdGQ6OmJhY2tfaW5zZXJ0ZXIoKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW50ZXJuYWw6OlJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4gUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKKyAgICBSZXBlYXRlZFB0ckZpZWxkPFQ+KiBjb25zdCBtdXRhYmxlX2ZpZWxkKSB7CisgIHJldHVybiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPihtdXRhYmxlX2ZpZWxkKTsKK30KKworLy8gU3BlY2lhbCBiYWNrIGluc2VydCBpdGVyYXRvciBmb3IgUmVwZWF0ZWRQdHJGaWVsZCBpbnN0YW5jZXMsIGp1c3QgaW4KKy8vIGNhc2Ugc29tZW9uZSB3YW50cyB0byB3cml0ZSBnZW5lcmljIHRlbXBsYXRlIGNvZGUgdGhhdCBjYW4gYWNjZXNzIGJvdGgKKy8vIFJlcGVhdGVkRmllbGRzIGFuZCBSZXBlYXRlZFB0ckZpZWxkcyB1c2luZyBhIGNvbW1vbiBuYW1lLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiBSZXBlYXRlZEZpZWxkQmFja0luc2VydGVyKAorICAgIFJlcGVhdGVkUHRyRmllbGQ8VD4qIGNvbnN0IG11dGFibGVfZmllbGQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+KG11dGFibGVfZmllbGQpOworfQorCisvLyBQcm92aWRlcyBhIGJhY2sgaW5zZXJ0IGl0ZXJhdG9yIGZvciBSZXBlYXRlZFB0ckZpZWxkIGluc3RhbmNlcworLy8gc2ltaWxhciB0byBzdGQ6OmJhY2tfaW5zZXJ0ZXIoKSB3aGljaCB0cmFuc2ZlcnMgdGhlIG93bmVyc2hpcCB3aGlsZQorLy8gY29weWluZyBlbGVtZW50cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW50ZXJuYWw6OkFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4KK0FsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0ZXIoCisgICAgUmVwZWF0ZWRQdHJGaWVsZDxUPiogY29uc3QgbXV0YWJsZV9maWVsZCkgeworICByZXR1cm4gaW50ZXJuYWw6OkFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4oCisgICAgICBtdXRhYmxlX2ZpZWxkKTsKK30KKworLy8gU2ltaWxhciB0byBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydGVyLCB1c2luZworLy8gVW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQgaW5zdGVhZCBvZiBBZGRBbGxvY2F0ZWQuCisvLyBUaGlzIGlzIHNsaWdodGx5IGZhc3RlciBpZiB0aGF0IG1hdHRlcnMuIEl0IGlzIGFsc28gdXNlZnVsIGluIGxlZ2FjeSBjb2RlCisvLyB0aGF0IHVzZXMgdGVtcG9yYXJ5IG93bmVyc2hpcCB0byBhdm9pZCBjb3BpZXMuIEV4YW1wbGU6CisvLyAgIFJlcGVhdGVkUHRyRmllbGQ8VD4gdGVtcF9maWVsZDsKKy8vICAgdGVtcF9maWVsZC5VbnNhZmVBcmVuYUFkZEFsbG9jYXRlZChuZXcgVCk7CisvLyAgIC4uLiAvLyBEbyBzb21ldGhpbmcgd2l0aCB0ZW1wX2ZpZWxkCisvLyAgIHRlbXBfZmllbGQuVW5zYWZlQXJlbmFFeHRyYWN0U3VicmFuZ2UoMCwgdGVtcF9maWVsZC5zaXplKCksIG51bGxwdHIpOworLy8gUHV0dGluZyB0ZW1wX2ZpZWxkIG9uIHRoZSBhcmVuYSBmYWlscyBiZWNhdXNlIHRoZSBvd25lcnNoaXAgdHJhbnNmZXJzIHRvIHRoZQorLy8gYXJlbmEgYXQgdGhlICJBZGRBbGxvY2F0ZWQiIGNhbGwgYW5kIGlzIG5vdCByZWxlYXNlZCBhbnltb3JlIGNhdXNpbmcgYQorLy8gZG91YmxlIGRlbGV0ZS4gVGhpcyBmdW5jdGlvbiB1c2VzIFVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkIHRvIHByZXZlbnQgdGhpcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW50ZXJuYWw6OlVuc2FmZUFyZW5hQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPgorVW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydGVyKAorICAgIFJlcGVhdGVkUHRyRmllbGQ8VD4qIGNvbnN0IG11dGFibGVfZmllbGQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpVbnNhZmVBcmVuYUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4oCisgICAgICBtdXRhYmxlX2ZpZWxkKTsKK30KKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFBST1RPQlVGX0VYUE9SVF9URU1QTEFURV9ERUNMQVJFCisgICAgUmVwZWF0ZWRQdHJGaWVsZDxzdGQ6OnN0cmluZz47CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9SRVBFQVRFRF9QVFJfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5NDU2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc2VydmljZS5jYwpAQCAtMCwwICsxLDQ1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc2VydmljZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK1NlcnZpY2U6On5TZXJ2aWNlKCkge30KK1JwY0NoYW5uZWw6On5ScGNDaGFubmVsKCkge30KK1JwY0NvbnRyb2xsZXI6On5ScGNDb250cm9sbGVyKCkge30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvc2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODhlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaApAQCAtMCwwICsxLDI5NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIERFUFJFQ0FURUQ6ICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgYWJzdHJhY3QgaW50ZXJmYWNlcyB1bmRlcmx5aW5nIHByb3RvMgorLy8gUlBDIHNlcnZpY2VzLiAgVGhlc2UgYXJlIGludGVuZGVkIHRvIGJlIGluZGVwZW5kZW50IG9mIGFueSBwYXJ0aWN1bGFyIFJQQworLy8gaW1wbGVtZW50YXRpb24sIHNvIHRoYXQgcHJvdG8yIHNlcnZpY2VzIGNhbiBiZSB1c2VkIG9uIHRvcCBvZiBhIHZhcmlldHkKKy8vIG9mIGltcGxlbWVudGF0aW9ucy4gIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiAyLjMuMCwgUlBDIGltcGxlbWVudGF0aW9ucyBzaG91bGQKKy8vIG5vdCB0cnkgdG8gYnVpbGQgb24gdGhlc2UsIGJ1dCBzaG91bGQgaW5zdGVhZCBwcm92aWRlIGNvZGUgZ2VuZXJhdG9yIHBsdWdpbnMKKy8vIHdoaWNoIGdlbmVyYXRlIGNvZGUgc3BlY2lmaWMgdG8gdGhlIHBhcnRpY3VsYXIgUlBDIGltcGxlbWVudGF0aW9uLiAgVGhpcyB3YXkKKy8vIHRoZSBnZW5lcmF0ZWQgY29kZSBjYW4gYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGluIHVzZQorLy8gYW5kIGNhbiBhdm9pZCB1bm5lY2Vzc2FyeSBsYXllcnMgb2YgaW5kaXJlY3Rpb24uCisvLworLy8KKy8vIFdoZW4geW91IHVzZSB0aGUgcHJvdG9jb2wgY29tcGlsZXIgdG8gY29tcGlsZSBhIHNlcnZpY2UgZGVmaW5pdGlvbiwgaXQKKy8vIGdlbmVyYXRlcyB0d28gY2xhc3NlczogIEFuIGFic3RyYWN0IGludGVyZmFjZSBmb3IgdGhlIHNlcnZpY2UgKHdpdGgKKy8vIG1ldGhvZHMgbWF0Y2hpbmcgdGhlIHNlcnZpY2UgZGVmaW5pdGlvbikgYW5kIGEgInN0dWIiIGltcGxlbWVudGF0aW9uLgorLy8gQSBzdHViIGlzIGp1c3QgYSB0eXBlLXNhZmUgd3JhcHBlciBhcm91bmQgYW4gUnBjQ2hhbm5lbCB3aGljaCBlbXVsYXRlcyBhCisvLyBsb2NhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VydmljZS4KKy8vCisvLyBGb3IgZXhhbXBsZSwgdGhlIHNlcnZpY2UgZGVmaW5pdGlvbjoKKy8vICAgc2VydmljZSBNeVNlcnZpY2UgeworLy8gICAgIHJwYyBGb28oTXlSZXF1ZXN0KSByZXR1cm5zKE15UmVzcG9uc2UpOworLy8gICB9CisvLyB3aWxsIGdlbmVyYXRlIGFic3RyYWN0IGludGVyZmFjZSAiTXlTZXJ2aWNlIiBhbmQgY2xhc3MgIk15U2VydmljZTo6U3R1YiIuCisvLyBZb3UgY291bGQgaW1wbGVtZW50IGEgTXlTZXJ2aWNlIGFzIGZvbGxvd3M6CisvLyAgIGNsYXNzIE15U2VydmljZUltcGwgOiBwdWJsaWMgTXlTZXJ2aWNlIHsKKy8vICAgIHB1YmxpYzoKKy8vICAgICBNeVNlcnZpY2VJbXBsKCkge30KKy8vICAgICB+TXlTZXJ2aWNlSW1wbCgpIHt9CisvLworLy8gICAgIC8vIGltcGxlbWVudHMgTXlTZXJ2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgICB2b2lkIEZvbyhnb29nbGU6OnByb3RvYnVmOjpScGNDb250cm9sbGVyKiBjb250cm9sbGVyLAorLy8gICAgICAgICAgICAgIGNvbnN0IE15UmVxdWVzdCogcmVxdWVzdCwKKy8vICAgICAgICAgICAgICBNeVJlc3BvbnNlKiByZXNwb25zZSwKKy8vICAgICAgICAgICAgICBDbG9zdXJlKiBkb25lKSB7CisvLyAgICAgICAvLyAuLi4gcmVhZCByZXF1ZXN0IGFuZCBmaWxsIGluIHJlc3BvbnNlIC4uLgorLy8gICAgICAgZG9uZS0+UnVuKCk7CisvLyAgICAgfQorLy8gICB9OworLy8gWW91IHdvdWxkIHRoZW4gcmVnaXN0ZXIgYW4gaW5zdGFuY2Ugb2YgTXlTZXJ2aWNlSW1wbCB3aXRoIHlvdXIgUlBDIHNlcnZlcgorLy8gaW1wbGVtZW50YXRpb24uICAoSG93IHRvIGRvIHRoYXQgZGVwZW5kcyBvbiB0aGUgaW1wbGVtZW50YXRpb24uKQorLy8KKy8vIFRvIGNhbGwgYSByZW1vdGUgTXlTZXJ2aWNlSW1wbCwgZmlyc3QgeW91IG5lZWQgYW4gUnBjQ2hhbm5lbCBjb25uZWN0ZWQgdG8gaXQuCisvLyBIb3cgdG8gY29uc3RydWN0IGEgY2hhbm5lbCBkZXBlbmRzLCBhZ2Fpbiwgb24geW91ciBSUEMgaW1wbGVtZW50YXRpb24uCisvLyBIZXJlIHdlIHVzZSBhIGh5cG90aGV0aWNhbCAiTXlScGNDaGFubmVsIiBhcyBhbiBleGFtcGxlOgorLy8gICBNeVJwY0NoYW5uZWwgY2hhbm5lbCgicnBjOmhvc3RuYW1lOjEyMzQvbXlzZXJ2aWNlIik7CisvLyAgIE15UnBjQ29udHJvbGxlciBjb250cm9sbGVyOworLy8gICBNeVNlcnZpY2VJbXBsOjpTdHViIHN0dWIoJmNoYW5uZWwpOworLy8gICBGb29SZXF1ZXN0IHJlcXVlc3Q7CisvLyAgIEZvb1Jlc3BvbnNlIHJlc3BvbnNlOworLy8KKy8vICAgLy8gLi4uIGZpbGwgaW4gcmVxdWVzdCAuLi4KKy8vCisvLyAgIHN0dWIuRm9vKCZjb250cm9sbGVyLCByZXF1ZXN0LCAmcmVzcG9uc2UsIE5ld0NhbGxiYWNrKEhhbmRsZVJlc3BvbnNlKSk7CisvLworLy8gT24gVGhyZWFkLVNhZmV0eToKKy8vCisvLyBEaWZmZXJlbnQgUlBDIGltcGxlbWVudGF0aW9ucyBtYXkgbWFrZSBkaWZmZXJlbnQgZ3VhcmFudGVlcyBhYm91dCB3aGF0CisvLyB0aHJlYWRzIHRoZXkgbWF5IHJ1biBjYWxsYmFja3Mgb24sIGFuZCB3aGF0IHRocmVhZHMgdGhlIGFwcGxpY2F0aW9uIGlzCisvLyBhbGxvd2VkIHRvIHVzZSB0byBjYWxsIHRoZSBSUEMgc3lzdGVtLiAgUG9ydGFibGUgc29mdHdhcmUgc2hvdWxkIGJlIHJlYWR5CisvLyBmb3IgY2FsbGJhY2tzIHRvIGJlIGNhbGxlZCBvbiBhbnkgdGhyZWFkLCBidXQgc2hvdWxkIG5vdCB0cnkgdG8gY2FsbCB0aGUKKy8vIFJQQyBzeXN0ZW0gZnJvbSBhbnkgdGhyZWFkIGV4Y2VwdCBmb3IgdGhlIG9uZXMgb24gd2hpY2ggaXQgcmVjZWl2ZWQgdGhlCisvLyBjYWxsYmFja3MuICBSZWFsaXN0aWNhbGx5LCB0aG91Z2gsIHNpbXBsZSBzb2Z0d2FyZSB3aWxsIHByb2JhYmx5IHdhbnQgdG8KKy8vIHVzZSBhIHNpbmdsZS10aHJlYWRlZCBSUEMgc3lzdGVtIHdoaWxlIGhpZ2gtZW5kIHNvZnR3YXJlIHdpbGwgd2FudCB0bworLy8gdXNlIG11bHRpcGxlIHRocmVhZHMuICBSUEMgaW1wbGVtZW50YXRpb25zIHNob3VsZCBwcm92aWRlIG11bHRpcGxlCisvLyBjaG9pY2VzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9TRVJWSUNFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU0VSVklDRV9IX18KKworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYWxsYmFjay5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworI2lmZGVmIFNXSUcKKyNlcnJvciAiWW91IGNhbm5vdCBTV0lHIHByb3RvIGhlYWRlcnMiCisjZW5kaWYKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gRGVmaW5lZCBpbiB0aGlzIGZpbGUuCitjbGFzcyBTZXJ2aWNlOworY2xhc3MgUnBjQ29udHJvbGxlcjsKK2NsYXNzIFJwY0NoYW5uZWw7CisKKy8vIERlZmluZWQgaW4gb3RoZXIgZmlsZXMuCitjbGFzcyBEZXNjcmlwdG9yOyAgICAgICAgIC8vIGRlc2NyaXB0b3IuaAorY2xhc3MgU2VydmljZURlc2NyaXB0b3I7ICAvLyBkZXNjcmlwdG9yLmgKK2NsYXNzIE1ldGhvZERlc2NyaXB0b3I7ICAgLy8gZGVzY3JpcHRvci5oCitjbGFzcyBNZXNzYWdlOyAgICAgICAgICAgIC8vIG1lc3NhZ2UuaAorCisvLyBBYnN0cmFjdCBiYXNlIGludGVyZmFjZSBmb3IgcHJvdG9jb2wtYnVmZmVyLWJhc2VkIFJQQyBzZXJ2aWNlcy4gIFNlcnZpY2VzCisvLyB0aGVtc2VsdmVzIGFyZSBhYnN0cmFjdCBpbnRlcmZhY2VzIChpbXBsZW1lbnRlZCBlaXRoZXIgYnkgc2VydmVycyBvciBhcworLy8gc3R1YnMpLCBidXQgdGhleSBzdWJjbGFzcyB0aGlzIGJhc2UgaW50ZXJmYWNlLiAgVGhlIG1ldGhvZHMgb2YgdGhpcworLy8gaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHRvIGNhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIFNlcnZpY2Ugd2l0aG91dCBrbm93aW5nCisvLyBpdHMgZXhhY3QgdHlwZSBhdCBjb21waWxlIHRpbWUgKGFuYWxvZ291cyB0byBSZWZsZWN0aW9uKS4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBTZXJ2aWNlIHsKKyBwdWJsaWM6CisgIGlubGluZSBTZXJ2aWNlKCkge30KKyAgdmlydHVhbCB+U2VydmljZSgpOworCisgIC8vIFdoZW4gY29uc3RydWN0aW5nIGEgc3R1YiwgeW91IG1heSBwYXNzIFNUVUJfT1dOU19DSEFOTkVMIGFzIHRoZSBzZWNvbmQKKyAgLy8gcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3RvciB0byB0ZWxsIGl0IHRvIGRlbGV0ZSBpdHMgUnBjQ2hhbm5lbCB3aGVuCisgIC8vIGRlc3Ryb3llZC4KKyAgZW51bSBDaGFubmVsT3duZXJzaGlwIHsgU1RVQl9PV05TX0NIQU5ORUwsIFNUVUJfRE9FU05UX09XTl9DSEFOTkVMIH07CisKKyAgLy8gR2V0IHRoZSBTZXJ2aWNlRGVzY3JpcHRvciBkZXNjcmliaW5nIHRoaXMgc2VydmljZSBhbmQgaXRzIG1ldGhvZHMuCisgIHZpcnR1YWwgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSA9IDA7CisKKyAgLy8gQ2FsbCBhIG1ldGhvZCBvZiB0aGUgc2VydmljZSBzcGVjaWZpZWQgYnkgTWV0aG9kRGVzY3JpcHRvci4gIFRoaXMgaXMKKyAgLy8gbm9ybWFsbHkgaW1wbGVtZW50ZWQgYXMgYSBzaW1wbGUgc3dpdGNoKCkgdGhhdCBjYWxscyB0aGUgc3RhbmRhcmQKKyAgLy8gZGVmaW5pdGlvbnMgb2YgdGhlIHNlcnZpY2UncyBtZXRob2RzLgorICAvLworICAvLyBQcmVjb25kaXRpb25zOgorICAvLyAqIG1ldGhvZC0+c2VydmljZSgpID09IEdldERlc2NyaXB0b3IoKQorICAvLyAqIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGFyZSBvZiB0aGUgZXhhY3Qgc2FtZSBjbGFzc2VzIGFzIHRoZSBvYmplY3RzCisgIC8vICAgcmV0dXJuZWQgYnkgR2V0UmVxdWVzdFByb3RvdHlwZShtZXRob2QpIGFuZAorICAvLyAgIEdldFJlc3BvbnNlUHJvdG90eXBlKG1ldGhvZCkuCisgIC8vICogQWZ0ZXIgdGhlIGNhbGwgaGFzIHN0YXJ0ZWQsIHRoZSByZXF1ZXN0IG11c3Qgbm90IGJlIG1vZGlmaWVkIGFuZCB0aGUKKyAgLy8gICByZXNwb25zZSBtdXN0IG5vdCBiZSBhY2Nlc3NlZCBhdCBhbGwgdW50aWwgImRvbmUiIGlzIGNhbGxlZC4KKyAgLy8gKiAiY29udHJvbGxlciIgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3IgdGhlIFJQQyBpbXBsZW1lbnRhdGlvbiBiZWluZworICAvLyAgIHVzZWQgYnkgdGhpcyBTZXJ2aWNlLiAgRm9yIHN0dWJzLCB0aGUgImNvcnJlY3QgdHlwZSIgZGVwZW5kcyBvbiB0aGUKKyAgLy8gICBScGNDaGFubmVsIHdoaWNoIHRoZSBzdHViIGlzIHVzaW5nLiAgU2VydmVyLXNpZGUgU2VydmljZQorICAvLyAgIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYWNjZXB0IHdoYXRldmVyIHR5cGUgb2YgUnBjQ29udHJvbGxlcgorICAvLyAgIHRoZSBzZXJ2ZXItc2lkZSBSUEMgaW1wbGVtZW50YXRpb24gdXNlcy4KKyAgLy8KKyAgLy8gUG9zdGNvbmRpdGlvbnM6CisgIC8vICogImRvbmUiIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG1ldGhvZCBpcyBjb21wbGV0ZS4gIFRoaXMgbWF5IGJlCisgIC8vICAgYmVmb3JlIENhbGxNZXRob2QoKSByZXR1cm5zIG9yIGl0IG1heSBiZSBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCisgIC8vICogSWYgdGhlIFJQQyBzdWNjZWVkZWQsICJyZXNwb25zZSIgY29udGFpbnMgdGhlIHJlc3BvbnNlIHJldHVybmVkIGJ5CisgIC8vICAgdGhlIHNlcnZlci4KKyAgLy8gKiBJZiB0aGUgUlBDIGZhaWxlZCwgInJlc3BvbnNlIidzIGNvbnRlbnRzIGFyZSB1bmRlZmluZWQuICBUaGUKKyAgLy8gICBScGNDb250cm9sbGVyIGNhbiBiZSBxdWVyaWVkIHRvIGRldGVybWluZSBpZiBhbiBlcnJvciBvY2N1cnJlZCBhbmQKKyAgLy8gICBwb3NzaWJseSB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuCisgIHZpcnR1YWwgdm9pZCBDYWxsTWV0aG9kKGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUnBjQ29udHJvbGxlciogY29udHJvbGxlciwgY29uc3QgTWVzc2FnZSogcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogcmVzcG9uc2UsIENsb3N1cmUqIGRvbmUpID0gMDsKKworICAvLyBDYWxsTWV0aG9kKCkgcmVxdWlyZXMgdGhhdCB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcGFzc2VkIGluIGFyZSBvZiBhCisgIC8vIHBhcnRpY3VsYXIgc3ViY2xhc3Mgb2YgTWVzc2FnZS4gIEdldFJlcXVlc3RQcm90b3R5cGUoKSBhbmQKKyAgLy8gR2V0UmVzcG9uc2VQcm90b3R5cGUoKSBnZXQgdGhlIGRlZmF1bHQgaW5zdGFuY2VzIG9mIHRoZXNlIHJlcXVpcmVkIHR5cGVzLgorICAvLyBZb3UgY2FuIHRoZW4gY2FsbCBNZXNzYWdlOjpOZXcoKSBvbiB0aGVzZSBpbnN0YW5jZXMgdG8gY29uc3RydWN0IG11dGFibGUKKyAgLy8gb2JqZWN0cyB3aGljaCB5b3UgY2FuIHRoZW4gcGFzcyB0byBDYWxsTWV0aG9kKCkuCisgIC8vCisgIC8vIEV4YW1wbGU6CisgIC8vICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0KKyAgLy8gICAgIHNlcnZpY2UtPkdldERlc2NyaXB0b3IoKS0+RmluZE1ldGhvZEJ5TmFtZSgiRm9vIik7CisgIC8vICAgTWVzc2FnZSogcmVxdWVzdCAgPSBzdHViLT5HZXRSZXF1ZXN0UHJvdG90eXBlIChtZXRob2QpLT5OZXcoKTsKKyAgLy8gICBNZXNzYWdlKiByZXNwb25zZSA9IHN0dWItPkdldFJlc3BvbnNlUHJvdG90eXBlKG1ldGhvZCktPk5ldygpOworICAvLyAgIHJlcXVlc3QtPlBhcnNlRnJvbVN0cmluZyhpbnB1dCk7CisgIC8vICAgc2VydmljZS0+Q2FsbE1ldGhvZChtZXRob2QsICpyZXF1ZXN0LCByZXNwb25zZSwgY2FsbGJhY2spOworICB2aXJ0dWFsIGNvbnN0IE1lc3NhZ2UmIEdldFJlcXVlc3RQcm90b3R5cGUoCisgICAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBjb25zdCBNZXNzYWdlJiBHZXRSZXNwb25zZVByb3RvdHlwZSgKKyAgICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCkgY29uc3QgPSAwOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNlcnZpY2UpOworfTsKKworLy8gQW4gUnBjQ29udHJvbGxlciBtZWRpYXRlcyBhIHNpbmdsZSBtZXRob2QgY2FsbC4gIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YKKy8vIHRoZSBjb250cm9sbGVyIGlzIHRvIHByb3ZpZGUgYSB3YXkgdG8gbWFuaXB1bGF0ZSBzZXR0aW5ncyBzcGVjaWZpYyB0byB0aGUKKy8vIFJQQyBpbXBsZW1lbnRhdGlvbiBhbmQgdG8gZmluZCBvdXQgYWJvdXQgUlBDLWxldmVsIGVycm9ycy4KKy8vCisvLyBUaGUgbWV0aG9kcyBwcm92aWRlZCBieSB0aGUgUnBjQ29udHJvbGxlciBpbnRlcmZhY2UgYXJlIGludGVuZGVkIHRvIGJlIGEKKy8vICJsZWFzdCBjb21tb24gZGVub21pbmF0b3IiIHNldCBvZiBmZWF0dXJlcyB3aGljaCB3ZSBleHBlY3QgYWxsCisvLyBpbXBsZW1lbnRhdGlvbnMgdG8gc3VwcG9ydC4gIFNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBtYXkgcHJvdmlkZSBtb3JlCisvLyBhZHZhbmNlZCBmZWF0dXJlcyAoZS5nLiBkZWFkbGluZSBwcm9wYWdhdGlvbikuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgUnBjQ29udHJvbGxlciB7CisgcHVibGljOgorICBpbmxpbmUgUnBjQ29udHJvbGxlcigpIHt9CisgIHZpcnR1YWwgflJwY0NvbnRyb2xsZXIoKTsKKworICAvLyBDbGllbnQtc2lkZSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGVzZSBjYWxscyBtYXkgYmUgbWFkZSBmcm9tIHRoZSBjbGllbnQgc2lkZSBvbmx5LiAgVGhlaXIgcmVzdWx0cworICAvLyBhcmUgdW5kZWZpbmVkIG9uIHRoZSBzZXJ2ZXIgc2lkZSAobWF5IGNyYXNoKS4KKworICAvLyBSZXNldHMgdGhlIFJwY0NvbnRyb2xsZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUgc28gdGhhdCBpdCBtYXkgYmUgcmV1c2VkIGluCisgIC8vIGEgbmV3IGNhbGwuICBNdXN0IG5vdCBiZSBjYWxsZWQgd2hpbGUgYW4gUlBDIGlzIGluIHByb2dyZXNzLgorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSA9IDA7CisKKyAgLy8gQWZ0ZXIgYSBjYWxsIGhhcyBmaW5pc2hlZCwgcmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsIGZhaWxlZC4gIFRoZSBwb3NzaWJsZQorICAvLyByZWFzb25zIGZvciBmYWlsdXJlIGRlcGVuZCBvbiB0aGUgUlBDIGltcGxlbWVudGF0aW9uLiAgRmFpbGVkKCkgbXVzdCBub3QKKyAgLy8gYmUgY2FsbGVkIGJlZm9yZSBhIGNhbGwgaGFzIGZpbmlzaGVkLiAgSWYgRmFpbGVkKCkgcmV0dXJucyB0cnVlLCB0aGUKKyAgLy8gY29udGVudHMgb2YgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgYXJlIHVuZGVmaW5lZC4KKyAgdmlydHVhbCBib29sIEZhaWxlZCgpIGNvbnN0ID0gMDsKKworICAvLyBJZiBGYWlsZWQoKSBpcyB0cnVlLCByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLgorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEVycm9yVGV4dCgpIGNvbnN0ID0gMDsKKworICAvLyBBZHZpc2VzIHRoZSBSUEMgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciBkZXNpcmVzIHRoYXQgdGhlIFJQQyBjYWxsIGJlCisgIC8vIGNhbmNlbGVkLiAgVGhlIFJQQyBzeXN0ZW0gbWF5IGNhbmNlbCBpdCBpbW1lZGlhdGVseSwgbWF5IHdhaXQgYXdoaWxlIGFuZAorICAvLyB0aGVuIGNhbmNlbCBpdCwgb3IgbWF5IG5vdCBldmVuIGNhbmNlbCB0aGUgY2FsbCBhdCBhbGwuICBJZiB0aGUgY2FsbCBpcworICAvLyBjYW5jZWxlZCwgdGhlICJkb25lIiBjYWxsYmFjayB3aWxsIHN0aWxsIGJlIGNhbGxlZCBhbmQgdGhlIFJwY0NvbnRyb2xsZXIKKyAgLy8gd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsIGZhaWxlZCBhdCB0aGF0IHRpbWUuCisgIHZpcnR1YWwgdm9pZCBTdGFydENhbmNlbCgpID0gMDsKKworICAvLyBTZXJ2ZXItc2lkZSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGVzZSBjYWxscyBtYXkgYmUgbWFkZSBmcm9tIHRoZSBzZXJ2ZXIgc2lkZSBvbmx5LiAgVGhlaXIgcmVzdWx0cworICAvLyBhcmUgdW5kZWZpbmVkIG9uIHRoZSBjbGllbnQgc2lkZSAobWF5IGNyYXNoKS4KKworICAvLyBDYXVzZXMgRmFpbGVkKCkgdG8gcmV0dXJuIHRydWUgb24gdGhlIGNsaWVudCBzaWRlLiAgInJlYXNvbiIgd2lsbCBiZQorICAvLyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbWVzc2FnZSByZXR1cm5lZCBieSBFcnJvclRleHQoKS4gIElmIHlvdSBmaW5kCisgIC8vIHlvdSBuZWVkIHRvIHJldHVybiBtYWNoaW5lLXJlYWRhYmxlIGluZm9ybWF0aW9uIGFib3V0IGZhaWx1cmVzLCB5b3UKKyAgLy8gc2hvdWxkIGluY29ycG9yYXRlIGl0IGludG8geW91ciByZXNwb25zZSBwcm90b2NvbCBidWZmZXIgYW5kIHNob3VsZAorICAvLyBOT1QgY2FsbCBTZXRGYWlsZWQoKS4KKyAgdmlydHVhbCB2b2lkIFNldEZhaWxlZChjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKSA9IDA7CisKKyAgLy8gSWYgdHJ1ZSwgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCBjYW5jZWxlZCB0aGUgUlBDLCBzbyB0aGUgc2VydmVyIG1heQorICAvLyBhcyB3ZWxsIGdpdmUgdXAgb24gcmVwbHlpbmcgdG8gaXQuICBUaGUgc2VydmVyIHNob3VsZCBzdGlsbCBjYWxsIHRoZQorICAvLyBmaW5hbCAiZG9uZSIgY2FsbGJhY2suCisgIHZpcnR1YWwgYm9vbCBJc0NhbmNlbGVkKCkgY29uc3QgPSAwOworCisgIC8vIEFza3MgdGhhdCB0aGUgZ2l2ZW4gY2FsbGJhY2sgYmUgY2FsbGVkIHdoZW4gdGhlIFJQQyBpcyBjYW5jZWxlZC4gIFRoZQorICAvLyBjYWxsYmFjayB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgZXhhY3RseSBvbmNlLiAgSWYgdGhlIFJQQyBjb21wbGV0ZXMgd2l0aG91dAorICAvLyBiZWluZyBjYW5jZWxlZCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGNvbXBsZXRpb24uICBJZiB0aGUgUlBDCisgIC8vIGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsZWQgd2hlbiBOb3RpZnlPbkNhbmNlbCgpIGlzIGNhbGxlZCwgdGhlIGNhbGxiYWNrCisgIC8vIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5LgorICAvLworICAvLyBOb3RpZnlPbkNhbmNlbCgpIG11c3QgYmUgY2FsbGVkIG5vIG1vcmUgdGhhbiBvbmNlIHBlciByZXF1ZXN0LgorICB2aXJ0dWFsIHZvaWQgTm90aWZ5T25DYW5jZWwoQ2xvc3VyZSogY2FsbGJhY2spID0gMDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhScGNDb250cm9sbGVyKTsKK307CisKKy8vIEFic3RyYWN0IGludGVyZmFjZSBmb3IgYW4gUlBDIGNoYW5uZWwuICBBbiBScGNDaGFubmVsIHJlcHJlc2VudHMgYQorLy8gY29tbXVuaWNhdGlvbiBsaW5lIHRvIGEgU2VydmljZSB3aGljaCBjYW4gYmUgdXNlZCB0byBjYWxsIHRoYXQgU2VydmljZSdzCisvLyBtZXRob2RzLiAgVGhlIFNlcnZpY2UgbWF5IGJlIHJ1bm5pbmcgb24gYW5vdGhlciBtYWNoaW5lLiAgTm9ybWFsbHksIHlvdQorLy8gc2hvdWxkIG5vdCBjYWxsIGFuIFJwY0NoYW5uZWwgZGlyZWN0bHksIGJ1dCBpbnN0ZWFkIGNvbnN0cnVjdCBhIHN0dWIgU2VydmljZQorLy8gd3JhcHBpbmcgaXQuICBFeGFtcGxlOgorLy8gICBScGNDaGFubmVsKiBjaGFubmVsID0gbmV3IE15UnBjQ2hhbm5lbCgicmVtb3RlaG9zdC5leGFtcGxlLmNvbToxMjM0Iik7CisvLyAgIE15U2VydmljZSogc2VydmljZSA9IG5ldyBNeVNlcnZpY2U6OlN0dWIoY2hhbm5lbCk7CisvLyAgIHNlcnZpY2UtPk15TWV0aG9kKHJlcXVlc3QsICZyZXNwb25zZSwgY2FsbGJhY2spOworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFJwY0NoYW5uZWwgeworIHB1YmxpYzoKKyAgaW5saW5lIFJwY0NoYW5uZWwoKSB7fQorICB2aXJ0dWFsIH5ScGNDaGFubmVsKCk7CisKKyAgLy8gQ2FsbCB0aGUgZ2l2ZW4gbWV0aG9kIG9mIHRoZSByZW1vdGUgc2VydmljZS4gIFRoZSBzaWduYXR1cmUgb2YgdGhpcworICAvLyBwcm9jZWR1cmUgbG9va3MgdGhlIHNhbWUgYXMgU2VydmljZTo6Q2FsbE1ldGhvZCgpLCBidXQgdGhlIHJlcXVpcmVtZW50cworICAvLyBhcmUgbGVzcyBzdHJpY3QgaW4gb25lIGltcG9ydGFudCB3YXk6ICB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugb2JqZWN0cworICAvLyBuZWVkIG5vdCBiZSBvZiBhbnkgc3BlY2lmaWMgY2xhc3MgYXMgbG9uZyBhcyB0aGVpciBkZXNjcmlwdG9ycyBhcmUKKyAgLy8gbWV0aG9kLT5pbnB1dF90eXBlKCkgYW5kIG1ldGhvZC0+b3V0cHV0X3R5cGUoKS4KKyAgdmlydHVhbCB2b2lkIENhbGxNZXRob2QoY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBScGNDb250cm9sbGVyKiBjb250cm9sbGVyLCBjb25zdCBNZXNzYWdlKiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiByZXNwb25zZSwgQ2xvc3VyZSogZG9uZSkgPSAwOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJwY0NoYW5uZWwpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NFUlZJQ0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnBiLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wYi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzUyNWU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wYi5jYwpAQCAtMCwwICsxLDI5NyBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucGIuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK1BST1RPQlVGX1BSQUdNQV9JTklUX1NFRworCituYW1lc3BhY2UgX3BiID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ7CituYW1lc3BhY2UgX3BiaSA9IF9wYjo6aW50ZXJuYWw7CisKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCitQUk9UT0JVRl9DT05TVEVYUFIgU291cmNlQ29udGV4dDo6U291cmNlQ29udGV4dCgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uZmlsZV9uYW1lXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fSB7fQorc3RydWN0IFNvdXJjZUNvbnRleHREZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIFNvdXJjZUNvbnRleHREZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+U291cmNlQ29udGV4dERlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgU291cmNlQ29udGV4dCBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBTb3VyY2VDb250ZXh0RGVmYXVsdFR5cGVJbnRlcm5hbCBfU291cmNlQ29udGV4dF9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorc3RhdGljIDo6X3BiOjpNZXRhZGF0YSBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmc291cmNlXzVmY29udGV4dF8yZXByb3RvWzFdOworc3RhdGljIGNvbnN0ZXhwciA6Ol9wYjo6RW51bURlc2NyaXB0b3IgY29uc3QqKiBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZzb3VyY2VfNWZjb250ZXh0XzJlcHJvdG8gPSBudWxscHRyOworc3RhdGljIGNvbnN0ZXhwciA6Ol9wYjo6U2VydmljZURlc2NyaXB0b3IgY29uc3QqKiBmaWxlX2xldmVsX3NlcnZpY2VfZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZzb3VyY2VfNWZjb250ZXh0XzJlcHJvdG8gPSBudWxscHRyOworCitjb25zdCB1aW50MzJfdCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZnNvdXJjZV81ZmNvbnRleHRfMmVwcm90bzo6b2Zmc2V0c1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0geworICB+MHUsICAvLyBubyBfaGFzX2JpdHNfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCwgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0LCBfaW1wbF8uZmlsZV9uYW1lXyksCit9Oworc3RhdGljIGNvbnN0IDo6X3BiaTo6TWlncmF0aW9uU2NoZW1hIHNjaGVtYXNbXSBQUk9UT0JVRl9TRUNUSU9OX1ZBUklBQkxFKHByb3RvZGVzY19jb2xkKSA9IHsKKyAgeyAwLCAtMSwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCl9LAorfTsKKworc3RhdGljIGNvbnN0IDo6X3BiOjpNZXNzYWdlKiBjb25zdCBmaWxlX2RlZmF1bHRfaW5zdGFuY2VzW10gPSB7CisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X1NvdXJjZUNvbnRleHRfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorfTsKKworY29uc3QgY2hhciBkZXNjcmlwdG9yX3RhYmxlX3Byb3RvZGVmX2dvb2dsZV8yZnByb3RvYnVmXzJmc291cmNlXzVmY29udGV4dF8yZXByb3RvW10gUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRShwcm90b2Rlc2NfY29sZCkgPQorICAiXG4kZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvXDAyMlwwMTciCisgICJnb29nbGUucHJvdG9idWZcIlwiXG5cclNvdXJjZUNvbnRleHRcMDIyXDAyMVxuXHRmaWxlIgorICAiX25hbWVcMDMwXDAwMSBcMDAxKFx0QlwyMTJcMDAxXG5cMDIzY29tLmdvb2dsZS5wcm90b2J1ZkJcMDIyU291IgorICAicmNlQ29udGV4dFByb3RvUFwwMDFaNmdvb2dsZS5nb2xhbmcub3JnL3BybyIKKyAgInRvYnVmL3R5cGVzL2tub3duL3NvdXJjZWNvbnRleHRwYlwyNDJcMDAyXDAwM0dQQlwyNTIiCisgICJcMDAyXDAzNkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2JcMDA2cHJvdG8zIgorICA7CitzdGF0aWMgOjpfcGJpOjpvbmNlX2ZsYWcgZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnNvdXJjZV81ZmNvbnRleHRfMmVwcm90b19vbmNlOworY29uc3QgOjpfcGJpOjpEZXNjcmlwdG9yVGFibGUgZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnNvdXJjZV81ZmNvbnRleHRfMmVwcm90byA9IHsKKyAgICBmYWxzZSwgZmFsc2UsIDI0MCwgZGVzY3JpcHRvcl90YWJsZV9wcm90b2RlZl9nb29nbGVfMmZwcm90b2J1Zl8yZnNvdXJjZV81ZmNvbnRleHRfMmVwcm90bywKKyAgICAiZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvIiwKKyAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnNvdXJjZV81ZmNvbnRleHRfMmVwcm90b19vbmNlLCBudWxscHRyLCAwLCAxLAorICAgIHNjaGVtYXMsIGZpbGVfZGVmYXVsdF9pbnN0YW5jZXMsIFRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmc291cmNlXzVmY29udGV4dF8yZXByb3RvOjpvZmZzZXRzLAorICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZzb3VyY2VfNWZjb250ZXh0XzJlcHJvdG8sIGZpbGVfbGV2ZWxfZW51bV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZnNvdXJjZV81ZmNvbnRleHRfMmVwcm90bywKKyAgICBmaWxlX2xldmVsX3NlcnZpY2VfZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZzb3VyY2VfNWZjb250ZXh0XzJlcHJvdG8sCit9OworUFJPVE9CVUZfQVRUUklCVVRFX1dFQUsgY29uc3QgOjpfcGJpOjpEZXNjcmlwdG9yVGFibGUqIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZzb3VyY2VfNWZjb250ZXh0XzJlcHJvdG9fZ2V0dGVyKCkgeworICByZXR1cm4gJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZzb3VyY2VfNWZjb250ZXh0XzJlcHJvdG87Cit9CisKKy8vIEZvcmNlIHJ1bm5pbmcgQWRkRGVzY3JpcHRvcnMoKSBhdCBkeW5hbWljIGluaXRpYWxpemF0aW9uIHRpbWUuCitQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTIgc3RhdGljIDo6X3BiaTo6QWRkRGVzY3JpcHRvcnNSdW5uZXIgZHluYW1pY19pbml0X2R1bW15X2dvb2dsZV8yZnByb3RvYnVmXzJmc291cmNlXzVmY29udGV4dF8yZXByb3RvKCZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmc291cmNlXzVmY29udGV4dF8yZXByb3RvKTsKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgU291cmNlQ29udGV4dDo6X0ludGVybmFsIHsKKyBwdWJsaWM6Cit9OworCitTb3VyY2VDb250ZXh0OjpTb3VyY2VDb250ZXh0KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQpCit9CitTb3VyY2VDb250ZXh0OjpTb3VyY2VDb250ZXh0KGNvbnN0IFNvdXJjZUNvbnRleHQmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIFNvdXJjZUNvbnRleHQqIGNvbnN0IF90aGlzID0gdGhpczsgKHZvaWQpX3RoaXM7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8uZmlsZV9uYW1lXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8uZmlsZV9uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5maWxlX25hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoIWZyb20uX2ludGVybmFsX2ZpbGVfbmFtZSgpLmVtcHR5KCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLmZpbGVfbmFtZV8uU2V0KGZyb20uX2ludGVybmFsX2ZpbGVfbmFtZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQpCit9CisKK2lubGluZSB2b2lkIFNvdXJjZUNvbnRleHQ6OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLmZpbGVfbmFtZV8pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICB9OworICBfaW1wbF8uZmlsZV9uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5maWxlX25hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworfQorCitTb3VyY2VDb250ZXh0Ojp+U291cmNlQ29udGV4dCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQpCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBTb3VyY2VDb250ZXh0OjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8uZmlsZV9uYW1lXy5EZXN0cm95KCk7Cit9CisKK3ZvaWQgU291cmNlQ29udGV4dDo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgU291cmNlQ29udGV4dDo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dCkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLmZpbGVfbmFtZV8uQ2xlYXJUb0VtcHR5KCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogU291cmNlQ29udGV4dDo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBzdHJpbmcgZmlsZV9uYW1lID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDEwKSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfZmlsZV9uYW1lKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgIENIS18oOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb250ZXh0LmZpbGVfbmFtZSIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBTb3VyY2VDb250ZXh0OjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb250ZXh0KQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHN0cmluZyBmaWxlX25hbWUgPSAxOworICBpZiAoIXRoaXMtPl9pbnRlcm5hbF9maWxlX25hbWUoKS5lbXB0eSgpKSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZygKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9maWxlX25hbWUoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX2ZpbGVfbmFtZSgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dC5maWxlX25hbWUiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICAxLCB0aGlzLT5faW50ZXJuYWxfZmlsZV9uYW1lKCksIHRhcmdldCk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dCkKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IFNvdXJjZUNvbnRleHQ6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dCkKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHN0cmluZyBmaWxlX25hbWUgPSAxOworICBpZiAoIXRoaXMtPl9pbnRlcm5hbF9maWxlX25hbWUoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9maWxlX25hbWUoKSk7CisgIH0KKworICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBTb3VyY2VDb250ZXh0OjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgU291cmNlQ29udGV4dDo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpTb3VyY2VDb250ZXh0OjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBTb3VyY2VDb250ZXh0OjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8U291cmNlQ29udGV4dCo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgU291cmNlQ29udGV4dCY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQpCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBpZiAoIWZyb20uX2ludGVybmFsX2ZpbGVfbmFtZSgpLmVtcHR5KCkpIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF9maWxlX25hbWUoZnJvbS5faW50ZXJuYWxfZmlsZV9uYW1lKCkpOworICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIFNvdXJjZUNvbnRleHQ6OkNvcHlGcm9tKGNvbnN0IFNvdXJjZUNvbnRleHQmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQpCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBTb3VyY2VDb250ZXh0OjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTb3VyY2VDb250ZXh0OjpJbnRlcm5hbFN3YXAoU291cmNlQ29udGV4dCogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBhdXRvKiBsaHNfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgYXV0byogcmhzX2FyZW5hID0gb3RoZXItPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLmZpbGVfbmFtZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLmZpbGVfbmFtZV8sIHJoc19hcmVuYQorICApOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgU291cmNlQ29udGV4dDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZzb3VyY2VfNWZjb250ZXh0XzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnNvdXJjZV81ZmNvbnRleHRfMmVwcm90b19vbmNlLAorICAgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZnNvdXJjZV81ZmNvbnRleHRfMmVwcm90b1swXSk7Cit9CisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0KgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0ID4oYXJlbmEpOworfQorUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wYi5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZjI3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnBiLmgKQEAgLTAsMCArMSwyODIgQEAKKy8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisvLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90bworCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZnNvdXJjZV81ZmNvbnRleHRfMmVwcm90bworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfZ29vZ2xlXzJmcHJvdG9idWZfMmZzb3VyY2VfNWZjb250ZXh0XzJlcHJvdG8KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorI2lmIFBST1RPQlVGX1ZFUlNJT04gPCAzMDIxMDAwCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcworI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuIFBsZWFzZSB1cGRhdGUKKyNlcnJvciB5b3VyIGhlYWRlcnMuCisjZW5kaWYKKyNpZiAzMDIxMDA5IDwgUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiBQbGVhc2UKKyNlcnJvciByZWdlbmVyYXRlIHRoaXMgZmlsZSB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2MuCisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGFfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisjZGVmaW5lIFBST1RPQlVGX0lOVEVSTkFMX0VYUE9SVF9nb29nbGVfMmZwcm90b2J1Zl8yZnNvdXJjZV81ZmNvbnRleHRfMmVwcm90byBQUk9UT0JVRl9FWFBPUlQKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCituYW1lc3BhY2UgaW50ZXJuYWwgeworY2xhc3MgQW55TWV0YWRhdGE7Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IHVzZSB0aGVzZSBtZW1iZXJzLgorc3RydWN0IFBST1RPQlVGX0VYUE9SVCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZnNvdXJjZV81ZmNvbnRleHRfMmVwcm90byB7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBvZmZzZXRzW107Cit9OworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkRlc2NyaXB0b3JUYWJsZSBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmc291cmNlXzVmY29udGV4dF8yZXByb3RvOworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK2NsYXNzIFNvdXJjZUNvbnRleHQ7CitzdHJ1Y3QgU291cmNlQ29udGV4dERlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIFNvdXJjZUNvbnRleHREZWZhdWx0VHlwZUludGVybmFsIF9Tb3VyY2VDb250ZXh0X2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQ+KEFyZW5hKik7CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFNvdXJjZUNvbnRleHQgZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dCkgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIFNvdXJjZUNvbnRleHQoKSA6IFNvdXJjZUNvbnRleHQobnVsbHB0cikge30KKyAgflNvdXJjZUNvbnRleHQoKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIFNvdXJjZUNvbnRleHQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBTb3VyY2VDb250ZXh0KGNvbnN0IFNvdXJjZUNvbnRleHQmIGZyb20pOworICBTb3VyY2VDb250ZXh0KFNvdXJjZUNvbnRleHQmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogU291cmNlQ29udGV4dCgpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIFNvdXJjZUNvbnRleHQmIG9wZXJhdG9yPShjb25zdCBTb3VyY2VDb250ZXh0JiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBTb3VyY2VDb250ZXh0JiBvcGVyYXRvcj0oU291cmNlQ29udGV4dCYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBTb3VyY2VDb250ZXh0JiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgU291cmNlQ29udGV4dCogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTb3VyY2VDb250ZXh0Kj4oCisgICAgICAgICAgICAgICAmX1NvdXJjZUNvbnRleHRfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAwOworCisgIGZyaWVuZCB2b2lkIHN3YXAoU291cmNlQ29udGV4dCYgYSwgU291cmNlQ29udGV4dCYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChTb3VyY2VDb250ZXh0KiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChTb3VyY2VDb250ZXh0KiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBTb3VyY2VDb250ZXh0KiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPFNvdXJjZUNvbnRleHQ+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgU291cmNlQ29udGV4dCYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBTb3VyY2VDb250ZXh0JiBmcm9tKSB7CisgICAgU291cmNlQ29udGV4dDo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKFNvdXJjZUNvbnRleHQqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dCI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBTb3VyY2VDb250ZXh0KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrRmlsZU5hbWVGaWVsZE51bWJlciA9IDEsCisgIH07CisgIC8vIHN0cmluZyBmaWxlX25hbWUgPSAxOworICB2b2lkIGNsZWFyX2ZpbGVfbmFtZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfZmlsZV9uYW1lKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfZmlsZV9uYW1lKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9maWxlX25hbWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2ZpbGVfbmFtZShzdGQ6OnN0cmluZyogZmlsZV9uYW1lKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9maWxlX25hbWUoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X2ZpbGVfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfZmlsZV9uYW1lKCk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgZmlsZV9uYW1lXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmc291cmNlXzVmY29udGV4dF8yZXByb3RvOworfTsKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfX0dOVUNfXworICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3N0cmljdC1hbGlhc2luZyIKKyNlbmRpZiAgLy8gX19HTlVDX18KKy8vIFNvdXJjZUNvbnRleHQKKworLy8gc3RyaW5nIGZpbGVfbmFtZSA9IDE7CitpbmxpbmUgdm9pZCBTb3VyY2VDb250ZXh0OjpjbGVhcl9maWxlX25hbWUoKSB7CisgIF9pbXBsXy5maWxlX25hbWVfLkNsZWFyVG9FbXB0eSgpOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBTb3VyY2VDb250ZXh0OjpmaWxlX25hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQuZmlsZV9uYW1lKQorICByZXR1cm4gX2ludGVybmFsX2ZpbGVfbmFtZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgU291cmNlQ29udGV4dDo6c2V0X2ZpbGVfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIAorIF9pbXBsXy5maWxlX25hbWVfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dC5maWxlX25hbWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFNvdXJjZUNvbnRleHQ6Om11dGFibGVfZmlsZV9uYW1lKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9maWxlX25hbWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQuZmlsZV9uYW1lKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIFNvdXJjZUNvbnRleHQ6Ol9pbnRlcm5hbF9maWxlX25hbWUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZmlsZV9uYW1lXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvbnRleHQ6Ol9pbnRlcm5hbF9zZXRfZmlsZV9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAKKyAgX2ltcGxfLmZpbGVfbmFtZV8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFNvdXJjZUNvbnRleHQ6Ol9pbnRlcm5hbF9tdXRhYmxlX2ZpbGVfbmFtZSgpIHsKKyAgCisgIHJldHVybiBfaW1wbF8uZmlsZV9uYW1lXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogU291cmNlQ29udGV4dDo6cmVsZWFzZV9maWxlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb250ZXh0LmZpbGVfbmFtZSkKKyAgcmV0dXJuIF9pbXBsXy5maWxlX25hbWVfLlJlbGVhc2UoKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvbnRleHQ6OnNldF9hbGxvY2F0ZWRfZmlsZV9uYW1lKHN0ZDo6c3RyaW5nKiBmaWxlX25hbWUpIHsKKyAgaWYgKGZpbGVfbmFtZSAhPSBudWxscHRyKSB7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgIH0KKyAgX2ltcGxfLmZpbGVfbmFtZV8uU2V0QWxsb2NhdGVkKGZpbGVfbmFtZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5maWxlX25hbWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLmZpbGVfbmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb250ZXh0LmZpbGVfbmFtZSkKK30KKworI2lmZGVmIF9fR05VQ19fCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYgIC8vIF9fR05VQ19fCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCisKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2dvb2dsZV8yZnByb3RvYnVmXzJmc291cmNlXzVmY29udGV4dF8yZXByb3RvCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmJmYzQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90bwpAQCAtMCwwICsxLDQ4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOworCitvcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMiOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJTb3VyY2VDb250ZXh0UHJvdG8iOworb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOworb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gIkdQQiI7CitvcHRpb24gZ29fcGFja2FnZSA9ICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9zb3VyY2Vjb250ZXh0cGIiOworCisvLyBgU291cmNlQ29udGV4dGAgcmVwcmVzZW50cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc291cmNlIG9mIGEKKy8vIHByb3RvYnVmIGVsZW1lbnQsIGxpa2UgdGhlIGZpbGUgaW4gd2hpY2ggaXQgaXMgZGVmaW5lZC4KK21lc3NhZ2UgU291cmNlQ29udGV4dCB7CisgIC8vIFRoZSBwYXRoLXF1YWxpZmllZCBuYW1lIG9mIHRoZSAucHJvdG8gZmlsZSB0aGF0IGNvbnRhaW5lZCB0aGUgYXNzb2NpYXRlZAorICAvLyBwcm90b2J1ZiBlbGVtZW50LiAgRm9yIGV4YW1wbGU6IGAiZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvImAuCisgIHN0cmluZyBmaWxlX25hbWUgPSAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHJpbmdfbWVtYmVyX3JvYmJlci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHJpbmdfbWVtYmVyX3JvYmJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzEwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0cmluZ19tZW1iZXJfcm9iYmVyLmgKQEAgLTAsMCArMSwzOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUUklOR19NRU1CRVJfUk9CQkVSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU1RSSU5HX01FTUJFUl9ST0JCRVJfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfU1RSSU5HX01FTUJFUl9ST0JCRVJfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3RydWN0LnBiLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YzcyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5jYwpAQCAtMCwwICsxLDEwNTcgQEAKKy8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisvLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucGIuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK1BST1RPQlVGX1BSQUdNQV9JTklUX1NFRworCituYW1lc3BhY2UgX3BiID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ7CituYW1lc3BhY2UgX3BiaSA9IF9wYjo6aW50ZXJuYWw7CisKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCitQUk9UT0JVRl9DT05TVEVYUFIgU3RydWN0X0ZpZWxkc0VudHJ5X0RvTm90VXNlOjpTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2UoCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKSB7fQorc3RydWN0IFN0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZURlZmF1bHRUeXBlSW50ZXJuYWwgeworICBQUk9UT0JVRl9DT05TVEVYUFIgU3RydWN0X0ZpZWxkc0VudHJ5X0RvTm90VXNlRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgflN0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZURlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgU3RydWN0X0ZpZWxkc0VudHJ5X0RvTm90VXNlIF9pbnN0YW5jZTsKKyAgfTsKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIFN0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZURlZmF1bHRUeXBlSW50ZXJuYWwgX1N0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZV9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBTdHJ1Y3Q6OlN0cnVjdCgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uZmllbGRzXykqL3s6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQoKX0KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319IHt9CitzdHJ1Y3QgU3RydWN0RGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBTdHJ1Y3REZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+U3RydWN0RGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBTdHJ1Y3QgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgU3RydWN0RGVmYXVsdFR5cGVJbnRlcm5hbCBfU3RydWN0X2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIFZhbHVlOjpWYWx1ZSgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8ua2luZF8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9vbmVvZl9jYXNlXykqL3t9fSB7fQorc3RydWN0IFZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5WYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgVmFsdWUgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgVmFsdWVEZWZhdWx0VHlwZUludGVybmFsIF9WYWx1ZV9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBMaXN0VmFsdWU6Okxpc3RWYWx1ZSgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8udmFsdWVzXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fSB7fQorc3RydWN0IExpc3RWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwgeworICBQUk9UT0JVRl9DT05TVEVYUFIgTGlzdFZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgfkxpc3RWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgTGlzdFZhbHVlIF9pbnN0YW5jZTsKKyAgfTsKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIExpc3RWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwgX0xpc3RWYWx1ZV9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorc3RhdGljIDo6X3BiOjpNZXRhZGF0YSBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG9bNF07CitzdGF0aWMgY29uc3QgOjpfcGI6OkVudW1EZXNjcmlwdG9yKiBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90b1sxXTsKK3N0YXRpYyBjb25zdGV4cHIgOjpfcGI6OlNlcnZpY2VEZXNjcmlwdG9yIGNvbnN0KiogZmlsZV9sZXZlbF9zZXJ2aWNlX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG8gPSBudWxscHRyOworCitjb25zdCB1aW50MzJfdCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZnN0cnVjdF8yZXByb3RvOjpvZmZzZXRzW10gUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRShwcm90b2Rlc2NfY29sZCkgPSB7CisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0X0ZpZWxkc0VudHJ5X0RvTm90VXNlLCBfaGFzX2JpdHNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2UsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0X0ZpZWxkc0VudHJ5X0RvTm90VXNlLCBrZXlfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2UsIHZhbHVlXyksCisgIDAsCisgIDEsCisgIH4wdSwgIC8vIG5vIF9oYXNfYml0c18KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJ1Y3QsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0LCBfaW1wbF8uZmllbGRzXyksCisgIH4wdSwgIC8vIG5vIF9oYXNfYml0c18KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZSwgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlZhbHVlLCBfaW1wbF8uX29uZW9mX2Nhc2VfWzBdKSwKKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgOjpfcGJpOjprSW52YWxpZEZpZWxkT2Zmc2V0VGFnLAorICA6Ol9wYmk6OmtJbnZhbGlkRmllbGRPZmZzZXRUYWcsCisgIDo6X3BiaTo6a0ludmFsaWRGaWVsZE9mZnNldFRhZywKKyAgOjpfcGJpOjprSW52YWxpZEZpZWxkT2Zmc2V0VGFnLAorICA6Ol9wYmk6OmtJbnZhbGlkRmllbGRPZmZzZXRUYWcsCisgIDo6X3BiaTo6a0ludmFsaWRGaWVsZE9mZnNldFRhZywKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZSwgX2ltcGxfLmtpbmRfKSwKKyAgfjB1LCAgLy8gbm8gX2hhc19iaXRzXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Okxpc3RWYWx1ZSwgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpMaXN0VmFsdWUsIF9pbXBsXy52YWx1ZXNfKSwKK307CitzdGF0aWMgY29uc3QgOjpfcGJpOjpNaWdyYXRpb25TY2hlbWEgc2NoZW1hc1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0geworICB7IDAsIDgsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZSl9LAorICB7IDEwLCAtMSwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0KX0sCisgIHsgMTcsIC0xLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZSl9LAorICB7IDMwLCAtMSwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TGlzdFZhbHVlKX0sCit9OworCitzdGF0aWMgY29uc3QgOjpfcGI6Ok1lc3NhZ2UqIGNvbnN0IGZpbGVfZGVmYXVsdF9pbnN0YW5jZXNbXSA9IHsKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfU3RydWN0X0ZpZWxkc0VudHJ5X0RvTm90VXNlX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfU3RydWN0X2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfVmFsdWVfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9MaXN0VmFsdWVfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorfTsKKworY29uc3QgY2hhciBkZXNjcmlwdG9yX3RhYmxlX3Byb3RvZGVmX2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG9bXSBQUk9UT0JVRl9TRUNUSU9OX1ZBUklBQkxFKHByb3RvZGVzY19jb2xkKSA9CisgICJcblwwMzRnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvXDAyMlwwMTdnb29nbGUucCIKKyAgInJvdG9idWZcIlwyMDRcMDAxXG5cMDA2U3RydWN0XDAyMjNcblwwMDZmaWVsZHNcMDMwXDAwMSBcMDAzKFwwMTMyIy5nb28iCisgICJnbGUucHJvdG9idWYuU3RydWN0LkZpZWxkc0VudHJ5XDAzMkVcblwwMTNGaWVsZCIKKyAgInNFbnRyeVwwMjJcMDEzXG5cMDAza2V5XDAzMFwwMDEgXDAwMShcdFwwMjIlXG5cMDA1dmFsdWVcMDMwXDAwMiBcMDAxKFwwMTMyXDAyNi5nb28iCisgICJnbGUucHJvdG9idWYuVmFsdWU6XDAwMjhcMDAxXCJcMzUyXDAwMVxuXDAwNVZhbHVlXDAyMjBcblxubnVsbCIKKyAgIl92YWx1ZVwwMzBcMDAxIFwwMDEoXDAxNjJcMDMyLmdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUiCisgICJIXDAwMFwwMjJcMDI2XG5cMDE0bnVtYmVyX3ZhbHVlXDAzMFwwMDIgXDAwMShcMDAxSFwwMDBcMDIyXDAyNlxuXDAxNHN0cmluZ192YWwiCisgICJ1ZVwwMzBcMDAzIFwwMDEoXHRIXDAwMFwwMjJcMDI0XG5cbmJvb2xfdmFsdWVcMDMwXDAwNCBcMDAxKFwwMTBIXDAwMFwwMjIvXG5cMDE0c3RydSIKKyAgImN0X3ZhbHVlXDAzMFwwMDUgXDAwMShcMDEzMlwwMjcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgiCisgICJcMDAwXDAyMjBcblxubGlzdF92YWx1ZVwwMzBcMDA2IFwwMDEoXDAxMzJcMDMyLmdvb2dsZS5wcm90b2J1Zi4iCisgICJMaXN0VmFsdWVIXDAwMEJcMDA2XG5cMDA0a2luZFwiM1xuXHRMaXN0VmFsdWVcMDIyJlxuXDAwNnZhbHUiCisgICJlc1wwMzBcMDAxIFwwMDMoXDAxMzJcMDI2Lmdvb2dsZS5wcm90b2J1Zi5WYWx1ZSpcMDMzXG5cdE51bGwiCisgICJWYWx1ZVwwMjJcMDE2XG5cbk5VTExfVkFMVUVcMDIwXDAwMEJcMTc3XG5cMDIzY29tLmdvb2dsZS5wcm90IgorICAib2J1ZkJcMDEzU3RydWN0UHJvdG9QXDAwMVovZ29vZ2xlLmdvbGFuZy5vcmcvcCIKKyAgInJvdG9idWYvdHlwZXMva25vd24vc3RydWN0cGJcMzcwXDAwMVwwMDFcMjQyXDAwMlwwMDNHUEJcMjUyXDAwMlwwMzYiCisgICJHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiXDAwNnByb3RvMyIKKyAgOworc3RhdGljIDo6X3BiaTo6b25jZV9mbGFnIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90b19vbmNlOworY29uc3QgOjpfcGJpOjpEZXNjcmlwdG9yVGFibGUgZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnN0cnVjdF8yZXByb3RvID0geworICAgIGZhbHNlLCBmYWxzZSwgNjM4LCBkZXNjcmlwdG9yX3RhYmxlX3Byb3RvZGVmX2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG8sCisgICAgImdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8iLAorICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG9fb25jZSwgbnVsbHB0ciwgMCwgNCwKKyAgICBzY2hlbWFzLCBmaWxlX2RlZmF1bHRfaW5zdGFuY2VzLCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZnN0cnVjdF8yZXByb3RvOjpvZmZzZXRzLAorICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90bywgZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG8sCisgICAgZmlsZV9sZXZlbF9zZXJ2aWNlX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG8sCit9OworUFJPVE9CVUZfQVRUUklCVVRFX1dFQUsgY29uc3QgOjpfcGJpOjpEZXNjcmlwdG9yVGFibGUqIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90b19nZXR0ZXIoKSB7CisgIHJldHVybiAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnN0cnVjdF8yZXByb3RvOworfQorCisvLyBGb3JjZSBydW5uaW5nIEFkZERlc2NyaXB0b3JzKCkgYXQgZHluYW1pYyBpbml0aWFsaXphdGlvbiB0aW1lLgorUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkyIHN0YXRpYyA6Ol9wYmk6OkFkZERlc2NyaXB0b3JzUnVubmVyIGR5bmFtaWNfaW5pdF9kdW1teV9nb29nbGVfMmZwcm90b2J1Zl8yZnN0cnVjdF8yZXByb3RvKCZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG8pOworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvciogTnVsbFZhbHVlX2Rlc2NyaXB0b3IoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXNzaWduRGVzY3JpcHRvcnMoJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90byk7CisgIHJldHVybiBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90b1swXTsKK30KK2Jvb2wgTnVsbFZhbHVlX0lzVmFsaWQoaW50IHZhbHVlKSB7CisgIHN3aXRjaCAodmFsdWUpIHsKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2U6OlN0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZSgpIHt9CitTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2U6OlN0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hKQorICAgIDogU3VwZXJUeXBlKGFyZW5hKSB7fQordm9pZCBTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2U6Ok1lcmdlRnJvbShjb25zdCBTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2UmIG90aGVyKSB7CisgIE1lcmdlRnJvbUludGVybmFsKG90aGVyKTsKK30KKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2U6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnN0cnVjdF8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG9bMF0pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFN0cnVjdDo6X0ludGVybmFsIHsKKyBwdWJsaWM6Cit9OworCitTdHJ1Y3Q6OlN0cnVjdCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgaWYgKGFyZW5hICE9IG51bGxwdHIgJiYgIWlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgICBhcmVuYS0+T3duQ3VzdG9tRGVzdHJ1Y3Rvcih0aGlzLCAmU3RydWN0OjpBcmVuYUR0b3IpOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU3RydWN0KQorfQorU3RydWN0OjpTdHJ1Y3QoY29uc3QgU3RydWN0JiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBTdHJ1Y3QqIGNvbnN0IF90aGlzID0gdGhpczsgKHZvaWQpX3RoaXM7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICAvKmRlY2x0eXBlKF9pbXBsXy5maWVsZHNfKSove30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX3RoaXMtPl9pbXBsXy5maWVsZHNfLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5maWVsZHNfKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlN0cnVjdCkKK30KKworaW5saW5lIHZvaWQgU3RydWN0OjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIC8qZGVjbHR5cGUoX2ltcGxfLmZpZWxkc18pKi97OjpfcGJpOjpBcmVuYUluaXRpYWxpemVkKCksIGFyZW5hfQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgIH07Cit9CisKK1N0cnVjdDo6flN0cnVjdCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlN0cnVjdCkKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIEFyZW5hRHRvcih0aGlzKTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBTdHJ1Y3Q6OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy5maWVsZHNfLkRlc3RydWN0KCk7CisgIF9pbXBsXy5maWVsZHNfLn5NYXBGaWVsZCgpOworfQorCit2b2lkIFN0cnVjdDo6QXJlbmFEdG9yKHZvaWQqIG9iamVjdCkgeworICBTdHJ1Y3QqIF90aGlzID0gcmVpbnRlcnByZXRfY2FzdDwgU3RydWN0KiA+KG9iamVjdCk7CisgIF90aGlzLT5faW1wbF8uZmllbGRzXy5EZXN0cnVjdCgpOworfQordm9pZCBTdHJ1Y3Q6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIFN0cnVjdDo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuU3RydWN0KQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfaW1wbF8uZmllbGRzXy5DbGVhcigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIFN0cnVjdDo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBtYXA8c3RyaW5nLCAuZ29vZ2xlLnByb3RvYnVmLlZhbHVlPiBmaWVsZHMgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTApKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZSgmX2ltcGxfLmZpZWxkc18sIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzwxMD4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICB9ICAvLyBzd2l0Y2gKKyAgaGFuZGxlX3VudXN1YWw6CisgICAgaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkgeworICAgICAgQ0hLXyhwdHIpOworICAgICAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7CisgICAgICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogU3RydWN0OjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gbWFwPHN0cmluZywgLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZT4gZmllbGRzID0gMTsKKyAgaWYgKCF0aGlzLT5faW50ZXJuYWxfZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHVzaW5nIE1hcFR5cGUgPSA6Ol9wYjo6TWFwPHN0ZDo6c3RyaW5nLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VmFsdWU+OworICAgIHVzaW5nIFdpcmVIZWxwZXIgPSBTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2U6OkZ1bmNzOworICAgIGNvbnN0IGF1dG8mIG1hcF9maWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9maWVsZHMoKTsKKyAgICBhdXRvIGNoZWNrX3V0ZjggPSBbXShjb25zdCBNYXBUeXBlOjp2YWx1ZV90eXBlJiBlbnRyeSkgeworICAgICAgKHZvaWQpZW50cnk7CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKAorICAgICAgICBlbnRyeS5maXJzdC5kYXRhKCksIHN0YXRpY19jYXN0PGludD4oZW50cnkuZmlyc3QubGVuZ3RoKCkpLAorICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTRVJJQUxJWkUsCisgICAgICAgICJnb29nbGUucHJvdG9idWYuU3RydWN0LkZpZWxkc0VudHJ5LmtleSIpOworICAgIH07CisKKyAgICBpZiAoc3RyZWFtLT5Jc1NlcmlhbGl6YXRpb25EZXRlcm1pbmlzdGljKCkgJiYgbWFwX2ZpZWxkLnNpemUoKSA+IDEpIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiA6Ol9wYmk6Ok1hcFNvcnRlclB0cjxNYXBUeXBlPihtYXBfZmllbGQpKSB7CisgICAgICAgIHRhcmdldCA9IFdpcmVIZWxwZXI6OkludGVybmFsU2VyaWFsaXplKDEsIGVudHJ5LmZpcnN0LCBlbnRyeS5zZWNvbmQsIHRhcmdldCwgc3RyZWFtKTsKKyAgICAgICAgY2hlY2tfdXRmOChlbnRyeSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBtYXBfZmllbGQpIHsKKyAgICAgICAgdGFyZ2V0ID0gV2lyZUhlbHBlcjo6SW50ZXJuYWxTZXJpYWxpemUoMSwgZW50cnkuZmlyc3QsIGVudHJ5LnNlY29uZCwgdGFyZ2V0LCBzdHJlYW0pOworICAgICAgICBjaGVja191dGY4KGVudHJ5KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuU3RydWN0KQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgU3RydWN0OjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlN0cnVjdCkKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIG1hcDxzdHJpbmcsIC5nb29nbGUucHJvdG9idWYuVmFsdWU+IGZpZWxkcyA9IDE7CisgIHRvdGFsX3NpemUgKz0gMSAqCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkZyb21JbnRTaXplKHRoaXMtPl9pbnRlcm5hbF9maWVsZHNfc2l6ZSgpKTsKKyAgZm9yICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWFwPCBzdGQ6OnN0cmluZywgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlZhbHVlID46OmNvbnN0X2l0ZXJhdG9yCisgICAgICBpdCA9IHRoaXMtPl9pbnRlcm5hbF9maWVsZHMoKS5iZWdpbigpOworICAgICAgaXQgIT0gdGhpcy0+X2ludGVybmFsX2ZpZWxkcygpLmVuZCgpOyArK2l0KSB7CisgICAgdG90YWxfc2l6ZSArPSBTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2U6OkZ1bmNzOjpCeXRlU2l6ZUxvbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgfQorCisgIHJldHVybiBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCAmX2ltcGxfLl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhIFN0cnVjdDo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIFN0cnVjdDo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpTdHJ1Y3Q6OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH0KKworCit2b2lkIFN0cnVjdDo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PFN0cnVjdCo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgU3RydWN0Jj4oZnJvbV9tc2cpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU3RydWN0KQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX3RoaXMtPl9pbXBsXy5maWVsZHNfLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5maWVsZHNfKTsKKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgU3RydWN0OjpDb3B5RnJvbShjb25zdCBTdHJ1Y3QmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlN0cnVjdCkKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIFN0cnVjdDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU3RydWN0OjpJbnRlcm5hbFN3YXAoU3RydWN0KiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5maWVsZHNfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5maWVsZHNfKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIFN0cnVjdDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90b1sxXSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVmFsdWU6Ol9JbnRlcm5hbCB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdCYgc3RydWN0X3ZhbHVlKGNvbnN0IFZhbHVlKiBtc2cpOworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Okxpc3RWYWx1ZSYgbGlzdF92YWx1ZShjb25zdCBWYWx1ZSogbXNnKTsKK307CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJ1Y3QmCitWYWx1ZTo6X0ludGVybmFsOjpzdHJ1Y3RfdmFsdWUoY29uc3QgVmFsdWUqIG1zZykgeworICByZXR1cm4gKm1zZy0+X2ltcGxfLmtpbmRfLnN0cnVjdF92YWx1ZV87Cit9Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TGlzdFZhbHVlJgorVmFsdWU6Ol9JbnRlcm5hbDo6bGlzdF92YWx1ZShjb25zdCBWYWx1ZSogbXNnKSB7CisgIHJldHVybiAqbXNnLT5faW1wbF8ua2luZF8ubGlzdF92YWx1ZV87Cit9Cit2b2lkIFZhbHVlOjpzZXRfYWxsb2NhdGVkX3N0cnVjdF92YWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0KiBzdHJ1Y3RfdmFsdWUpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBtZXNzYWdlX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGNsZWFyX2tpbmQoKTsKKyAgaWYgKHN0cnVjdF92YWx1ZSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogc3VibWVzc2FnZV9hcmVuYSA9CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEoc3RydWN0X3ZhbHVlKTsKKyAgICBpZiAobWVzc2FnZV9hcmVuYSAhPSBzdWJtZXNzYWdlX2FyZW5hKSB7CisgICAgICBzdHJ1Y3RfdmFsdWUgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdldE93bmVkTWVzc2FnZSgKKyAgICAgICAgICBtZXNzYWdlX2FyZW5hLCBzdHJ1Y3RfdmFsdWUsIHN1Ym1lc3NhZ2VfYXJlbmEpOworICAgIH0KKyAgICBzZXRfaGFzX3N0cnVjdF92YWx1ZSgpOworICAgIF9pbXBsXy5raW5kXy5zdHJ1Y3RfdmFsdWVfID0gc3RydWN0X3ZhbHVlOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5WYWx1ZS5zdHJ1Y3RfdmFsdWUpCit9Cit2b2lkIFZhbHVlOjpzZXRfYWxsb2NhdGVkX2xpc3RfdmFsdWUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Okxpc3RWYWx1ZSogbGlzdF92YWx1ZSkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIG1lc3NhZ2VfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgY2xlYXJfa2luZCgpOworICBpZiAobGlzdF92YWx1ZSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogc3VibWVzc2FnZV9hcmVuYSA9CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEobGlzdF92YWx1ZSk7CisgICAgaWYgKG1lc3NhZ2VfYXJlbmEgIT0gc3VibWVzc2FnZV9hcmVuYSkgeworICAgICAgbGlzdF92YWx1ZSA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2V0T3duZWRNZXNzYWdlKAorICAgICAgICAgIG1lc3NhZ2VfYXJlbmEsIGxpc3RfdmFsdWUsIHN1Ym1lc3NhZ2VfYXJlbmEpOworICAgIH0KKyAgICBzZXRfaGFzX2xpc3RfdmFsdWUoKTsKKyAgICBfaW1wbF8ua2luZF8ubGlzdF92YWx1ZV8gPSBsaXN0X3ZhbHVlOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5WYWx1ZS5saXN0X3ZhbHVlKQorfQorVmFsdWU6OlZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlZhbHVlKQorfQorVmFsdWU6OlZhbHVlKGNvbnN0IFZhbHVlJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBWYWx1ZSogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5raW5kXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fb25lb2ZfY2FzZV8pKi97fX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgY2xlYXJfaGFzX2tpbmQoKTsKKyAgc3dpdGNoIChmcm9tLmtpbmRfY2FzZSgpKSB7CisgICAgY2FzZSBrTnVsbFZhbHVlOiB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9udWxsX3ZhbHVlKGZyb20uX2ludGVybmFsX251bGxfdmFsdWUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrTnVtYmVyVmFsdWU6IHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X251bWJlcl92YWx1ZShmcm9tLl9pbnRlcm5hbF9udW1iZXJfdmFsdWUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrU3RyaW5nVmFsdWU6IHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X3N0cmluZ192YWx1ZShmcm9tLl9pbnRlcm5hbF9zdHJpbmdfdmFsdWUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrQm9vbFZhbHVlOiB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9ib29sX3ZhbHVlKGZyb20uX2ludGVybmFsX2Jvb2xfdmFsdWUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrU3RydWN0VmFsdWU6IHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfbXV0YWJsZV9zdHJ1Y3RfdmFsdWUoKS0+OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdDo6TWVyZ2VGcm9tKAorICAgICAgICAgIGZyb20uX2ludGVybmFsX3N0cnVjdF92YWx1ZSgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtMaXN0VmFsdWU6IHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfbXV0YWJsZV9saXN0X3ZhbHVlKCktPjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpMaXN0VmFsdWU6Ok1lcmdlRnJvbSgKKyAgICAgICAgICBmcm9tLl9pbnRlcm5hbF9saXN0X3ZhbHVlKCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgS0lORF9OT1RfU0VUOiB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlZhbHVlKQorfQorCitpbmxpbmUgdm9pZCBWYWx1ZTo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8ua2luZF8pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX29uZW9mX2Nhc2VfKSove30KKyAgfTsKKyAgY2xlYXJfaGFzX2tpbmQoKTsKK30KKworVmFsdWU6On5WYWx1ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlZhbHVlKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgVmFsdWU6OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIGlmIChoYXNfa2luZCgpKSB7CisgICAgY2xlYXJfa2luZCgpOworICB9Cit9CisKK3ZvaWQgVmFsdWU6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIFZhbHVlOjpjbGVhcl9raW5kKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG9uZV9vZl9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuVmFsdWUpCisgIHN3aXRjaCAoa2luZF9jYXNlKCkpIHsKKyAgICBjYXNlIGtOdWxsVmFsdWU6IHsKKyAgICAgIC8vIE5vIG5lZWQgdG8gY2xlYXIKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtOdW1iZXJWYWx1ZTogeworICAgICAgLy8gTm8gbmVlZCB0byBjbGVhcgorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Uga1N0cmluZ1ZhbHVlOiB7CisgICAgICBfaW1wbF8ua2luZF8uc3RyaW5nX3ZhbHVlXy5EZXN0cm95KCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrQm9vbFZhbHVlOiB7CisgICAgICAvLyBObyBuZWVkIHRvIGNsZWFyCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrU3RydWN0VmFsdWU6IHsKKyAgICAgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7CisgICAgICAgIGRlbGV0ZSBfaW1wbF8ua2luZF8uc3RydWN0X3ZhbHVlXzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtMaXN0VmFsdWU6IHsKKyAgICAgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7CisgICAgICAgIGRlbGV0ZSBfaW1wbF8ua2luZF8ubGlzdF92YWx1ZV87CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBLSU5EX05PVF9TRVQ6IHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBfaW1wbF8uX29uZW9mX2Nhc2VfWzBdID0gS0lORF9OT1RfU0VUOworfQorCisKK3ZvaWQgVmFsdWU6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlZhbHVlKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBjbGVhcl9raW5kKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogVmFsdWU6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gLmdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUgbnVsbF92YWx1ZSA9IDE7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA4KSkgeworICAgICAgICAgIHVpbnQ2NF90IHZhbCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICBfaW50ZXJuYWxfc2V0X251bGxfdmFsdWUoc3RhdGljX2Nhc3Q8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok51bGxWYWx1ZT4odmFsKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gZG91YmxlIG51bWJlcl92YWx1ZSA9IDI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxNykpIHsKKyAgICAgICAgICBfaW50ZXJuYWxfc2V0X251bWJlcl92YWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlVuYWxpZ25lZExvYWQ8ZG91YmxlPihwdHIpKTsKKyAgICAgICAgICBwdHIgKz0gc2l6ZW9mKGRvdWJsZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gc3RyaW5nIHN0cmluZ192YWx1ZSA9IDM7CisgICAgICBjYXNlIDM6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAyNikpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX3N0cmluZ192YWx1ZSgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICBDSEtfKDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuVmFsdWUuc3RyaW5nX3ZhbHVlIikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIGJvb2wgYm9vbF92YWx1ZSA9IDQ7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAzMikpIHsKKyAgICAgICAgICBfaW50ZXJuYWxfc2V0X2Jvb2xfdmFsdWUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cikpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyAuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCBzdHJ1Y3RfdmFsdWUgPSA1OworICAgICAgY2FzZSA1OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNDIpKSB7CisgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX211dGFibGVfc3RydWN0X3ZhbHVlKCksIHB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIC5nb29nbGUucHJvdG9idWYuTGlzdFZhbHVlIGxpc3RfdmFsdWUgPSA2OworICAgICAgY2FzZSA2OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNTApKSB7CisgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX211dGFibGVfbGlzdF92YWx1ZSgpLCBwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBWYWx1ZTo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuVmFsdWUpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gLmdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUgbnVsbF92YWx1ZSA9IDE7CisgIGlmIChfaW50ZXJuYWxfaGFzX251bGxfdmFsdWUoKSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAorICAgICAgMSwgdGhpcy0+X2ludGVybmFsX251bGxfdmFsdWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIGRvdWJsZSBudW1iZXJfdmFsdWUgPSAyOworICBpZiAoX2ludGVybmFsX2hhc19udW1iZXJfdmFsdWUoKSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZURvdWJsZVRvQXJyYXkoMiwgdGhpcy0+X2ludGVybmFsX251bWJlcl92YWx1ZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gc3RyaW5nIHN0cmluZ192YWx1ZSA9IDM7CisgIGlmIChfaW50ZXJuYWxfaGFzX3N0cmluZ192YWx1ZSgpKSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZygKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9zdHJpbmdfdmFsdWUoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX3N0cmluZ192YWx1ZSgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuVmFsdWUuc3RyaW5nX3ZhbHVlIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgMywgdGhpcy0+X2ludGVybmFsX3N0cmluZ192YWx1ZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gYm9vbCBib29sX3ZhbHVlID0gNDsKKyAgaWYgKF9pbnRlcm5hbF9oYXNfYm9vbF92YWx1ZSgpKSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoNCwgdGhpcy0+X2ludGVybmFsX2Jvb2xfdmFsdWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIC5nb29nbGUucHJvdG9idWYuU3RydWN0IHN0cnVjdF92YWx1ZSA9IDU7CisgIGlmIChfaW50ZXJuYWxfaGFzX3N0cnVjdF92YWx1ZSgpKSB7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg1LCBfSW50ZXJuYWw6OnN0cnVjdF92YWx1ZSh0aGlzKSwKKyAgICAgICAgX0ludGVybmFsOjpzdHJ1Y3RfdmFsdWUodGhpcykuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICAvLyAuZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZSBsaXN0X3ZhbHVlID0gNjsKKyAgaWYgKF9pbnRlcm5hbF9oYXNfbGlzdF92YWx1ZSgpKSB7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg2LCBfSW50ZXJuYWw6Omxpc3RfdmFsdWUodGhpcyksCisgICAgICAgIF9JbnRlcm5hbDo6bGlzdF92YWx1ZSh0aGlzKS5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSkgeworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdDo6SW50ZXJuYWxTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5WYWx1ZSkKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IFZhbHVlOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlZhbHVlKQorICBzaXplX3QgdG90YWxfc2l6ZSA9IDA7CisKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgc3dpdGNoIChraW5kX2Nhc2UoKSkgeworICAgIC8vIC5nb29nbGUucHJvdG9idWYuTnVsbFZhbHVlIG51bGxfdmFsdWUgPSAxOworICAgIGNhc2Uga051bGxWYWx1ZTogeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodGhpcy0+X2ludGVybmFsX251bGxfdmFsdWUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gZG91YmxlIG51bWJlcl92YWx1ZSA9IDI7CisgICAgY2FzZSBrTnVtYmVyVmFsdWU6IHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArIDg7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gc3RyaW5nIHN0cmluZ192YWx1ZSA9IDM7CisgICAgY2FzZSBrU3RyaW5nVmFsdWU6IHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+X2ludGVybmFsX3N0cmluZ192YWx1ZSgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBib29sIGJvb2xfdmFsdWUgPSA0OworICAgIGNhc2Uga0Jvb2xWYWx1ZTogeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyAuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCBzdHJ1Y3RfdmFsdWUgPSA1OworICAgIGNhc2Uga1N0cnVjdFZhbHVlOiB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZSgKKyAgICAgICAgICAqX2ltcGxfLmtpbmRfLnN0cnVjdF92YWx1ZV8pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vIC5nb29nbGUucHJvdG9idWYuTGlzdFZhbHVlIGxpc3RfdmFsdWUgPSA2OworICAgIGNhc2Uga0xpc3RWYWx1ZTogeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUoCisgICAgICAgICAgKl9pbXBsXy5raW5kXy5saXN0X3ZhbHVlXyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBLSU5EX05PVF9TRVQ6IHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBWYWx1ZTo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIFZhbHVlOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKlZhbHVlOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBWYWx1ZTo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PFZhbHVlKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBWYWx1ZSY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlZhbHVlKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgc3dpdGNoIChmcm9tLmtpbmRfY2FzZSgpKSB7CisgICAgY2FzZSBrTnVsbFZhbHVlOiB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9udWxsX3ZhbHVlKGZyb20uX2ludGVybmFsX251bGxfdmFsdWUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrTnVtYmVyVmFsdWU6IHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X251bWJlcl92YWx1ZShmcm9tLl9pbnRlcm5hbF9udW1iZXJfdmFsdWUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrU3RyaW5nVmFsdWU6IHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X3N0cmluZ192YWx1ZShmcm9tLl9pbnRlcm5hbF9zdHJpbmdfdmFsdWUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrQm9vbFZhbHVlOiB7CisgICAgICBfdGhpcy0+X2ludGVybmFsX3NldF9ib29sX3ZhbHVlKGZyb20uX2ludGVybmFsX2Jvb2xfdmFsdWUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrU3RydWN0VmFsdWU6IHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfbXV0YWJsZV9zdHJ1Y3RfdmFsdWUoKS0+OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdDo6TWVyZ2VGcm9tKAorICAgICAgICAgIGZyb20uX2ludGVybmFsX3N0cnVjdF92YWx1ZSgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtMaXN0VmFsdWU6IHsKKyAgICAgIF90aGlzLT5faW50ZXJuYWxfbXV0YWJsZV9saXN0X3ZhbHVlKCktPjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpMaXN0VmFsdWU6Ok1lcmdlRnJvbSgKKyAgICAgICAgICBmcm9tLl9pbnRlcm5hbF9saXN0X3ZhbHVlKCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgS0lORF9OT1RfU0VUOiB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgVmFsdWU6OkNvcHlGcm9tKGNvbnN0IFZhbHVlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5WYWx1ZSkKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIFZhbHVlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBWYWx1ZTo6SW50ZXJuYWxTd2FwKFZhbHVlKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN3YXAoX2ltcGxfLmtpbmRfLCBvdGhlci0+X2ltcGxfLmtpbmRfKTsKKyAgc3dhcChfaW1wbF8uX29uZW9mX2Nhc2VfWzBdLCBvdGhlci0+X2ltcGxfLl9vbmVvZl9jYXNlX1swXSk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBWYWx1ZTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90b1syXSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgTGlzdFZhbHVlOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKK307CisKK0xpc3RWYWx1ZTo6TGlzdFZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZSkKK30KK0xpc3RWYWx1ZTo6TGlzdFZhbHVlKGNvbnN0IExpc3RWYWx1ZSYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgTGlzdFZhbHVlKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLnZhbHVlc18pe2Zyb20uX2ltcGxfLnZhbHVlc199CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUpCit9CisKK2lubGluZSB2b2lkIExpc3RWYWx1ZTo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8udmFsdWVzXyl7YXJlbmF9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgfTsKK30KKworTGlzdFZhbHVlOjp+TGlzdFZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgTGlzdFZhbHVlOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8udmFsdWVzXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworfQorCit2b2lkIExpc3RWYWx1ZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgTGlzdFZhbHVlOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy52YWx1ZXNfLkNsZWFyKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogTGlzdFZhbHVlOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVmFsdWUgdmFsdWVzID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDEwKSkgeworICAgICAgICAgIHB0ciAtPSAxOworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX2FkZF92YWx1ZXMoKSwgcHRyKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDEwPihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBMaXN0VmFsdWU6Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZSkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlZhbHVlIHZhbHVlcyA9IDE7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF92YWx1ZXNfc2l6ZSgpKTsgaSA8IG47IGkrKykgeworICAgIGNvbnN0IGF1dG8mIHJlcGZpZWxkID0gdGhpcy0+X2ludGVybmFsX3ZhbHVlcyhpKTsKKyAgICB0YXJnZXQgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoMSwgcmVwZmllbGQsIHJlcGZpZWxkLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZSkKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IExpc3RWYWx1ZTo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlZhbHVlIHZhbHVlcyA9IDE7CisgIHRvdGFsX3NpemUgKz0gMVVMICogdGhpcy0+X2ludGVybmFsX3ZhbHVlc19zaXplKCk7CisgIGZvciAoY29uc3QgYXV0byYgbXNnIDogdGhpcy0+X2ltcGxfLnZhbHVlc18pIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZShtc2cpOworICB9CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgTGlzdFZhbHVlOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgTGlzdFZhbHVlOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkxpc3RWYWx1ZTo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgTGlzdFZhbHVlOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8TGlzdFZhbHVlKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBMaXN0VmFsdWUmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUpCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfdGhpcy0+X2ltcGxfLnZhbHVlc18uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLnZhbHVlc18pOworICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBMaXN0VmFsdWU6OkNvcHlGcm9tKGNvbnN0IExpc3RWYWx1ZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgTGlzdFZhbHVlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBMaXN0VmFsdWU6OkludGVybmFsU3dhcChMaXN0VmFsdWUqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX2ltcGxfLnZhbHVlc18uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLnZhbHVlc18pOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgTGlzdFZhbHVlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnN0cnVjdF8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90b19vbmNlLAorICAgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZnN0cnVjdF8yZXByb3RvWzNdKTsKK30KKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZSoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2UgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2UgPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJ1Y3QqCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0ID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0ID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VmFsdWUqCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VmFsdWUgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZSA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Okxpc3RWYWx1ZSoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpMaXN0VmFsdWUgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpMaXN0VmFsdWUgPihhcmVuYSk7Cit9CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzRhMWJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucGIuaApAQCAtMCwwICsxLDExNzcgQEAKKy8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisvLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90bworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90bworCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisjaWYgUFJPVE9CVUZfVkVSU0lPTiA8IDMwMjEwMDAKKyNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCisjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gUGxlYXNlIHVwZGF0ZQorI2Vycm9yIHlvdXIgaGVhZGVycy4KKyNlbmRpZgorI2lmIDMwMjEwMDkgPCBQUk9UT0JVRl9NSU5fUFJPVE9DX1ZFUlNJT04KKyNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhbiBvbGRlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcworI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuIFBsZWFzZQorI2Vycm9yIHJlZ2VuZXJhdGUgdGhpcyBmaWxlIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYy4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcC5oPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfZW50cnkuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX2lubC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKyNkZWZpbmUgUFJPVE9CVUZfSU5URVJOQUxfRVhQT1JUX2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG8gUFJPVE9CVUZfRVhQT1JUCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorbmFtZXNwYWNlIGludGVybmFsIHsKK2NsYXNzIEFueU1ldGFkYXRhOworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIC0tIGRvIG5vdCB1c2UgdGhlc2UgbWVtYmVycy4KK3N0cnVjdCBQUk9UT0JVRl9FWFBPUlQgVGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90byB7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBvZmZzZXRzW107Cit9OworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkRlc2NyaXB0b3JUYWJsZSBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG87CitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorY2xhc3MgTGlzdFZhbHVlOworc3RydWN0IExpc3RWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIExpc3RWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwgX0xpc3RWYWx1ZV9kZWZhdWx0X2luc3RhbmNlXzsKK2NsYXNzIFN0cnVjdDsKK3N0cnVjdCBTdHJ1Y3REZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBTdHJ1Y3REZWZhdWx0VHlwZUludGVybmFsIF9TdHJ1Y3RfZGVmYXVsdF9pbnN0YW5jZV87CitjbGFzcyBTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2U7CitzdHJ1Y3QgU3RydWN0X0ZpZWxkc0VudHJ5X0RvTm90VXNlRGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gU3RydWN0X0ZpZWxkc0VudHJ5X0RvTm90VXNlRGVmYXVsdFR5cGVJbnRlcm5hbCBfU3RydWN0X0ZpZWxkc0VudHJ5X0RvTm90VXNlX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgVmFsdWU7CitzdHJ1Y3QgVmFsdWVEZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwgX1ZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Okxpc3RWYWx1ZSogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TGlzdFZhbHVlPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdCogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0PihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZSogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0X0ZpZWxkc0VudHJ5X0RvTm90VXNlPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlZhbHVlKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZT4oQXJlbmEqKTsKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KKworZW51bSBOdWxsVmFsdWUgOiBpbnQgeworICBOVUxMX1ZBTFVFID0gMCwKKyAgTnVsbFZhbHVlX0lOVF9NSU5fU0VOVElORUxfRE9fTk9UX1VTRV8gPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKSwKKyAgTnVsbFZhbHVlX0lOVF9NQVhfU0VOVElORUxfRE9fTk9UX1VTRV8gPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKQorfTsKK1BST1RPQlVGX0VYUE9SVCBib29sIE51bGxWYWx1ZV9Jc1ZhbGlkKGludCB2YWx1ZSk7Citjb25zdGV4cHIgTnVsbFZhbHVlIE51bGxWYWx1ZV9NSU4gPSBOVUxMX1ZBTFVFOworY29uc3RleHByIE51bGxWYWx1ZSBOdWxsVmFsdWVfTUFYID0gTlVMTF9WQUxVRTsKK2NvbnN0ZXhwciBpbnQgTnVsbFZhbHVlX0FSUkFZU0laRSA9IE51bGxWYWx1ZV9NQVggKyAxOworCitQUk9UT0JVRl9FWFBPUlQgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yKiBOdWxsVmFsdWVfZGVzY3JpcHRvcigpOwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgTnVsbFZhbHVlX05hbWUoVCBlbnVtX3RfdmFsdWUpIHsKKyAgc3RhdGljX2Fzc2VydCg6OnN0ZDo6aXNfc2FtZTxULCBOdWxsVmFsdWU+Ojp2YWx1ZSB8fAorICAgIDo6c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsCisgICAgIkluY29ycmVjdCB0eXBlIHBhc3NlZCB0byBmdW5jdGlvbiBOdWxsVmFsdWVfTmFtZS4iKTsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6TmFtZU9mRW51bSgKKyAgICBOdWxsVmFsdWVfZGVzY3JpcHRvcigpLCBlbnVtX3RfdmFsdWUpOworfQoraW5saW5lIGJvb2wgTnVsbFZhbHVlX1BhcnNlKAorICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpDb25zdFN0cmluZ1BhcmFtIG5hbWUsIE51bGxWYWx1ZSogdmFsdWUpIHsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VOYW1lZEVudW08TnVsbFZhbHVlPigKKyAgICBOdWxsVmFsdWVfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Cit9CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFN0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZSA6IHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Ok1hcEVudHJ5PFN0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZSwgCisgICAgc3RkOjpzdHJpbmcsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZSwKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX1NUUklORywKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0U+IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Ok1hcEVudHJ5PFN0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZSwgCisgICAgc3RkOjpzdHJpbmcsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZSwKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX1NUUklORywKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0U+IFN1cGVyVHlwZTsKKyAgU3RydWN0X0ZpZWxkc0VudHJ5X0RvTm90VXNlKCk7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2UoCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworICBleHBsaWNpdCBTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2UoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFN0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZSYgb3RoZXIpOworICBzdGF0aWMgY29uc3QgU3RydWN0X0ZpZWxkc0VudHJ5X0RvTm90VXNlKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTdHJ1Y3RfRmllbGRzRW50cnlfRG9Ob3RVc2UqPigmX1N0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZV9kZWZhdWx0X2luc3RhbmNlXyk7IH0KKyAgc3RhdGljIGJvb2wgVmFsaWRhdGVLZXkoc3RkOjpzdHJpbmcqIHMpIHsKKyAgICByZXR1cm4gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZyhzLT5kYXRhKCksIHN0YXRpY19jYXN0PGludD4ocy0+c2l6ZSgpKSwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UEFSU0UsICJnb29nbGUucHJvdG9idWYuU3RydWN0LkZpZWxkc0VudHJ5LmtleSIpOworIH0KKyAgc3RhdGljIGJvb2wgVmFsaWRhdGVWYWx1ZSh2b2lkKikgeyByZXR1cm4gdHJ1ZTsgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG87Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBTdHJ1Y3QgZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuU3RydWN0KSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgU3RydWN0KCkgOiBTdHJ1Y3QobnVsbHB0cikge30KKyAgflN0cnVjdCgpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgU3RydWN0KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgU3RydWN0KGNvbnN0IFN0cnVjdCYgZnJvbSk7CisgIFN0cnVjdChTdHJ1Y3QmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogU3RydWN0KCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgU3RydWN0JiBvcGVyYXRvcj0oY29uc3QgU3RydWN0JiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBTdHJ1Y3QmIG9wZXJhdG9yPShTdHJ1Y3QmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgU3RydWN0JiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgU3RydWN0KiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFN0cnVjdCo+KAorICAgICAgICAgICAgICAgJl9TdHJ1Y3RfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAxOworCisgIGZyaWVuZCB2b2lkIHN3YXAoU3RydWN0JiBhLCBTdHJ1Y3QmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoU3RydWN0KiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChTdHJ1Y3QqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFN0cnVjdCogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxTdHJ1Y3Q+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgU3RydWN0JiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IFN0cnVjdCYgZnJvbSkgeworICAgIFN0cnVjdDo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKFN0cnVjdCogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QiOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgU3RydWN0KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgQXJlbmFEdG9yKHZvaWQqIG9iamVjdCk7CisgIHB1YmxpYzoKKworICBzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXzsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDsKKworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrRmllbGRzRmllbGROdW1iZXIgPSAxLAorICB9OworICAvLyBtYXA8c3RyaW5nLCAuZ29vZ2xlLnByb3RvYnVmLlZhbHVlPiBmaWVsZHMgPSAxOworICBpbnQgZmllbGRzX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9maWVsZHNfc2l6ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfZmllbGRzKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNYXA8IHN0ZDo6c3RyaW5nLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VmFsdWUgPiYKKyAgICAgIF9pbnRlcm5hbF9maWVsZHMoKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1hcDwgc3RkOjpzdHJpbmcsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZSA+KgorICAgICAgX2ludGVybmFsX211dGFibGVfZmllbGRzKCk7CisgIHB1YmxpYzoKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1hcDwgc3RkOjpzdHJpbmcsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZSA+JgorICAgICAgZmllbGRzKCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNYXA8IHN0ZDo6c3RyaW5nLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VmFsdWUgPioKKyAgICAgIG11dGFibGVfZmllbGRzKCk7CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6TWFwRmllbGQ8CisgICAgICAgIFN0cnVjdF9GaWVsZHNFbnRyeV9Eb05vdFVzZSwKKyAgICAgICAgc3RkOjpzdHJpbmcsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZSwKKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TVFJJTkcsCisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRT4gZmllbGRzXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmc3RydWN0XzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgVmFsdWUgZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuVmFsdWUpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBWYWx1ZSgpIDogVmFsdWUobnVsbHB0cikge30KKyAgflZhbHVlKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBWYWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIFZhbHVlKGNvbnN0IFZhbHVlJiBmcm9tKTsKKyAgVmFsdWUoVmFsdWUmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogVmFsdWUoKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBWYWx1ZSYgb3BlcmF0b3I9KGNvbnN0IFZhbHVlJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBWYWx1ZSYgb3BlcmF0b3I9KFZhbHVlJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IFZhbHVlJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIGVudW0gS2luZENhc2UgeworICAgIGtOdWxsVmFsdWUgPSAxLAorICAgIGtOdW1iZXJWYWx1ZSA9IDIsCisgICAga1N0cmluZ1ZhbHVlID0gMywKKyAgICBrQm9vbFZhbHVlID0gNCwKKyAgICBrU3RydWN0VmFsdWUgPSA1LAorICAgIGtMaXN0VmFsdWUgPSA2LAorICAgIEtJTkRfTk9UX1NFVCA9IDAsCisgIH07CisKKyAgc3RhdGljIGlubGluZSBjb25zdCBWYWx1ZSogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBWYWx1ZSo+KAorICAgICAgICAgICAgICAgJl9WYWx1ZV9kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDI7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChWYWx1ZSYgYSwgVmFsdWUmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoVmFsdWUqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKFZhbHVlKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBWYWx1ZSogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxWYWx1ZT4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBWYWx1ZSYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBWYWx1ZSYgZnJvbSkgeworICAgIFZhbHVlOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoVmFsdWUqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuVmFsdWUiOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgVmFsdWUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtOdWxsVmFsdWVGaWVsZE51bWJlciA9IDEsCisgICAga051bWJlclZhbHVlRmllbGROdW1iZXIgPSAyLAorICAgIGtTdHJpbmdWYWx1ZUZpZWxkTnVtYmVyID0gMywKKyAgICBrQm9vbFZhbHVlRmllbGROdW1iZXIgPSA0LAorICAgIGtTdHJ1Y3RWYWx1ZUZpZWxkTnVtYmVyID0gNSwKKyAgICBrTGlzdFZhbHVlRmllbGROdW1iZXIgPSA2LAorICB9OworICAvLyAuZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZSBudWxsX3ZhbHVlID0gMTsKKyAgYm9vbCBoYXNfbnVsbF92YWx1ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfbnVsbF92YWx1ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfbnVsbF92YWx1ZSgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TnVsbFZhbHVlIG51bGxfdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfbnVsbF92YWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TnVsbFZhbHVlIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok51bGxWYWx1ZSBfaW50ZXJuYWxfbnVsbF92YWx1ZSgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfbnVsbF92YWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TnVsbFZhbHVlIHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIGRvdWJsZSBudW1iZXJfdmFsdWUgPSAyOworICBib29sIGhhc19udW1iZXJfdmFsdWUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX251bWJlcl92YWx1ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfbnVtYmVyX3ZhbHVlKCk7CisgIGRvdWJsZSBudW1iZXJfdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfbnVtYmVyX3ZhbHVlKGRvdWJsZSB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGRvdWJsZSBfaW50ZXJuYWxfbnVtYmVyX3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9udW1iZXJfdmFsdWUoZG91YmxlIHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIHN0cmluZyBzdHJpbmdfdmFsdWUgPSAzOworICBib29sIGhhc19zdHJpbmdfdmFsdWUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX3N0cmluZ192YWx1ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfc3RyaW5nX3ZhbHVlKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJpbmdfdmFsdWUoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF9zdHJpbmdfdmFsdWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9zdHJpbmdfdmFsdWUoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX3N0cmluZ192YWx1ZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfc3RyaW5nX3ZhbHVlKHN0ZDo6c3RyaW5nKiBzdHJpbmdfdmFsdWUpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX3N0cmluZ192YWx1ZSgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9zdHJpbmdfdmFsdWUoKTsKKyAgcHVibGljOgorCisgIC8vIGJvb2wgYm9vbF92YWx1ZSA9IDQ7CisgIGJvb2wgaGFzX2Jvb2xfdmFsdWUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX2Jvb2xfdmFsdWUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2Jvb2xfdmFsdWUoKTsKKyAgYm9vbCBib29sX3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgc2V0X2Jvb2xfdmFsdWUoYm9vbCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2Jvb2xfdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X2Jvb2xfdmFsdWUoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyAuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCBzdHJ1Y3RfdmFsdWUgPSA1OworICBib29sIGhhc19zdHJ1Y3RfdmFsdWUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX3N0cnVjdF92YWx1ZSgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfc3RydWN0X3ZhbHVlKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJ1Y3QmIHN0cnVjdF92YWx1ZSgpIGNvbnN0OworICBQUk9UT0JVRl9OT0RJU0NBUkQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdCogcmVsZWFzZV9zdHJ1Y3RfdmFsdWUoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdCogbXV0YWJsZV9zdHJ1Y3RfdmFsdWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX3N0cnVjdF92YWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0KiBzdHJ1Y3RfdmFsdWUpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0JiBfaW50ZXJuYWxfc3RydWN0X3ZhbHVlKCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJ1Y3QqIF9pbnRlcm5hbF9tdXRhYmxlX3N0cnVjdF92YWx1ZSgpOworICBwdWJsaWM6CisgIHZvaWQgdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfc3RydWN0X3ZhbHVlKAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdCogc3RydWN0X3ZhbHVlKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdCogdW5zYWZlX2FyZW5hX3JlbGVhc2Vfc3RydWN0X3ZhbHVlKCk7CisKKyAgLy8gLmdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUgbGlzdF92YWx1ZSA9IDY7CisgIGJvb2wgaGFzX2xpc3RfdmFsdWUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfaGFzX2xpc3RfdmFsdWUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX2xpc3RfdmFsdWUoKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Okxpc3RWYWx1ZSYgbGlzdF92YWx1ZSgpIGNvbnN0OworICBQUk9UT0JVRl9OT0RJU0NBUkQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Okxpc3RWYWx1ZSogcmVsZWFzZV9saXN0X3ZhbHVlKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpMaXN0VmFsdWUqIG11dGFibGVfbGlzdF92YWx1ZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfbGlzdF92YWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TGlzdFZhbHVlKiBsaXN0X3ZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Okxpc3RWYWx1ZSYgX2ludGVybmFsX2xpc3RfdmFsdWUoKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Okxpc3RWYWx1ZSogX2ludGVybmFsX211dGFibGVfbGlzdF92YWx1ZSgpOworICBwdWJsaWM6CisgIHZvaWQgdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfbGlzdF92YWx1ZSgKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpMaXN0VmFsdWUqIGxpc3RfdmFsdWUpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TGlzdFZhbHVlKiB1bnNhZmVfYXJlbmFfcmVsZWFzZV9saXN0X3ZhbHVlKCk7CisKKyAgdm9pZCBjbGVhcl9raW5kKCk7CisgIEtpbmRDYXNlIGtpbmRfY2FzZSgpIGNvbnN0OworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlZhbHVlKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKyAgdm9pZCBzZXRfaGFzX251bGxfdmFsdWUoKTsKKyAgdm9pZCBzZXRfaGFzX251bWJlcl92YWx1ZSgpOworICB2b2lkIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgIHZvaWQgc2V0X2hhc19ib29sX3ZhbHVlKCk7CisgIHZvaWQgc2V0X2hhc19zdHJ1Y3RfdmFsdWUoKTsKKyAgdm9pZCBzZXRfaGFzX2xpc3RfdmFsdWUoKTsKKworICBpbmxpbmUgYm9vbCBoYXNfa2luZCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfa2luZCgpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIHVuaW9uIEtpbmRVbmlvbiB7CisgICAgICBjb25zdGV4cHIgS2luZFVuaW9uKCkgOiBfY29uc3Rpbml0X3t9IHt9CisgICAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCBfY29uc3Rpbml0XzsKKyAgICAgIGludCBudWxsX3ZhbHVlXzsKKyAgICAgIGRvdWJsZSBudW1iZXJfdmFsdWVfOworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBzdHJpbmdfdmFsdWVfOworICAgICAgYm9vbCBib29sX3ZhbHVlXzsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJ1Y3QqIHN0cnVjdF92YWx1ZV87CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TGlzdFZhbHVlKiBsaXN0X3ZhbHVlXzsKKyAgICB9IGtpbmRfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgICAgdWludDMyX3QgX29uZW9mX2Nhc2VfWzFdOworCisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZzdHJ1Y3RfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBMaXN0VmFsdWUgZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgTGlzdFZhbHVlKCkgOiBMaXN0VmFsdWUobnVsbHB0cikge30KKyAgfkxpc3RWYWx1ZSgpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgTGlzdFZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgTGlzdFZhbHVlKGNvbnN0IExpc3RWYWx1ZSYgZnJvbSk7CisgIExpc3RWYWx1ZShMaXN0VmFsdWUmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogTGlzdFZhbHVlKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgTGlzdFZhbHVlJiBvcGVyYXRvcj0oY29uc3QgTGlzdFZhbHVlJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBMaXN0VmFsdWUmIG9wZXJhdG9yPShMaXN0VmFsdWUmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgTGlzdFZhbHVlJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgTGlzdFZhbHVlKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IExpc3RWYWx1ZSo+KAorICAgICAgICAgICAgICAgJl9MaXN0VmFsdWVfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAzOworCisgIGZyaWVuZCB2b2lkIHN3YXAoTGlzdFZhbHVlJiBhLCBMaXN0VmFsdWUmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoTGlzdFZhbHVlKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChMaXN0VmFsdWUqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIExpc3RWYWx1ZSogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxMaXN0VmFsdWU+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgTGlzdFZhbHVlJiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IExpc3RWYWx1ZSYgZnJvbSkgeworICAgIExpc3RWYWx1ZTo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKExpc3RWYWx1ZSogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUiOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgTGlzdFZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrVmFsdWVzRmllbGROdW1iZXIgPSAxLAorICB9OworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlZhbHVlIHZhbHVlcyA9IDE7CisgIGludCB2YWx1ZXNfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX3ZhbHVlc19zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl92YWx1ZXMoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlZhbHVlKiBtdXRhYmxlX3ZhbHVlcyhpbnQgaW5kZXgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlZhbHVlID4qCisgICAgICBtdXRhYmxlX3ZhbHVlcygpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VmFsdWUmIF9pbnRlcm5hbF92YWx1ZXMoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlZhbHVlKiBfaW50ZXJuYWxfYWRkX3ZhbHVlcygpOworICBwdWJsaWM6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZSYgdmFsdWVzKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZSogYWRkX3ZhbHVlcygpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlZhbHVlID4mCisgICAgICB2YWx1ZXMoKSBjb25zdDsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZSkKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZSA+IHZhbHVlc187CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZnN0cnVjdF8yZXByb3RvOworfTsKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfX0dOVUNfXworICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3N0cmljdC1hbGlhc2luZyIKKyNlbmRpZiAgLy8gX19HTlVDX18KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU3RydWN0CisKKy8vIG1hcDxzdHJpbmcsIC5nb29nbGUucHJvdG9idWYuVmFsdWU+IGZpZWxkcyA9IDE7CitpbmxpbmUgaW50IFN0cnVjdDo6X2ludGVybmFsX2ZpZWxkc19zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmZpZWxkc18uc2l6ZSgpOworfQoraW5saW5lIGludCBTdHJ1Y3Q6OmZpZWxkc19zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2ZpZWxkc19zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBTdHJ1Y3Q6OmNsZWFyX2ZpZWxkcygpIHsKKyAgX2ltcGxfLmZpZWxkc18uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWFwPCBzdGQ6OnN0cmluZywgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlZhbHVlID4mCitTdHJ1Y3Q6Ol9pbnRlcm5hbF9maWVsZHMoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZmllbGRzXy5HZXRNYXAoKTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWFwPCBzdGQ6OnN0cmluZywgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlZhbHVlID4mCitTdHJ1Y3Q6OmZpZWxkcygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX21hcDpnb29nbGUucHJvdG9idWYuU3RydWN0LmZpZWxkcykKKyAgcmV0dXJuIF9pbnRlcm5hbF9maWVsZHMoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWFwPCBzdGQ6OnN0cmluZywgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlZhbHVlID4qCitTdHJ1Y3Q6Ol9pbnRlcm5hbF9tdXRhYmxlX2ZpZWxkcygpIHsKKyAgcmV0dXJuIF9pbXBsXy5maWVsZHNfLk11dGFibGVNYXAoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWFwPCBzdGQ6OnN0cmluZywgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlZhbHVlID4qCitTdHJ1Y3Q6Om11dGFibGVfZmllbGRzKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9tYXA6Z29vZ2xlLnByb3RvYnVmLlN0cnVjdC5maWVsZHMpCisgIHJldHVybiBfaW50ZXJuYWxfbXV0YWJsZV9maWVsZHMoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBWYWx1ZQorCisvLyAuZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZSBudWxsX3ZhbHVlID0gMTsKK2lubGluZSBib29sIFZhbHVlOjpfaW50ZXJuYWxfaGFzX251bGxfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBraW5kX2Nhc2UoKSA9PSBrTnVsbFZhbHVlOworfQoraW5saW5lIGJvb2wgVmFsdWU6Omhhc19udWxsX3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19udWxsX3ZhbHVlKCk7Cit9CitpbmxpbmUgdm9pZCBWYWx1ZTo6c2V0X2hhc19udWxsX3ZhbHVlKCkgeworICBfaW1wbF8uX29uZW9mX2Nhc2VfWzBdID0ga051bGxWYWx1ZTsKK30KK2lubGluZSB2b2lkIFZhbHVlOjpjbGVhcl9udWxsX3ZhbHVlKCkgeworICBpZiAoX2ludGVybmFsX2hhc19udWxsX3ZhbHVlKCkpIHsKKyAgICBfaW1wbF8ua2luZF8ubnVsbF92YWx1ZV8gPSAwOworICAgIGNsZWFyX2hhc19raW5kKCk7CisgIH0KK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TnVsbFZhbHVlIFZhbHVlOjpfaW50ZXJuYWxfbnVsbF92YWx1ZSgpIGNvbnN0IHsKKyAgaWYgKF9pbnRlcm5hbF9oYXNfbnVsbF92YWx1ZSgpKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TnVsbFZhbHVlID4oX2ltcGxfLmtpbmRfLm51bGxfdmFsdWVfKTsKKyAgfQorICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpOdWxsVmFsdWUgPigwKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TnVsbFZhbHVlIFZhbHVlOjpudWxsX3ZhbHVlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5WYWx1ZS5udWxsX3ZhbHVlKQorICByZXR1cm4gX2ludGVybmFsX251bGxfdmFsdWUoKTsKK30KK2lubGluZSB2b2lkIFZhbHVlOjpfaW50ZXJuYWxfc2V0X251bGxfdmFsdWUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok51bGxWYWx1ZSB2YWx1ZSkgeworICBpZiAoIV9pbnRlcm5hbF9oYXNfbnVsbF92YWx1ZSgpKSB7CisgICAgY2xlYXJfa2luZCgpOworICAgIHNldF9oYXNfbnVsbF92YWx1ZSgpOworICB9CisgIF9pbXBsXy5raW5kXy5udWxsX3ZhbHVlXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgVmFsdWU6OnNldF9udWxsX3ZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpOdWxsVmFsdWUgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9udWxsX3ZhbHVlKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVmFsdWUubnVsbF92YWx1ZSkKK30KKworLy8gZG91YmxlIG51bWJlcl92YWx1ZSA9IDI7CitpbmxpbmUgYm9vbCBWYWx1ZTo6X2ludGVybmFsX2hhc19udW1iZXJfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBraW5kX2Nhc2UoKSA9PSBrTnVtYmVyVmFsdWU7Cit9CitpbmxpbmUgYm9vbCBWYWx1ZTo6aGFzX251bWJlcl92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfbnVtYmVyX3ZhbHVlKCk7Cit9CitpbmxpbmUgdm9pZCBWYWx1ZTo6c2V0X2hhc19udW1iZXJfdmFsdWUoKSB7CisgIF9pbXBsXy5fb25lb2ZfY2FzZV9bMF0gPSBrTnVtYmVyVmFsdWU7Cit9CitpbmxpbmUgdm9pZCBWYWx1ZTo6Y2xlYXJfbnVtYmVyX3ZhbHVlKCkgeworICBpZiAoX2ludGVybmFsX2hhc19udW1iZXJfdmFsdWUoKSkgeworICAgIF9pbXBsXy5raW5kXy5udW1iZXJfdmFsdWVfID0gMDsKKyAgICBjbGVhcl9oYXNfa2luZCgpOworICB9Cit9CitpbmxpbmUgZG91YmxlIFZhbHVlOjpfaW50ZXJuYWxfbnVtYmVyX3ZhbHVlKCkgY29uc3QgeworICBpZiAoX2ludGVybmFsX2hhc19udW1iZXJfdmFsdWUoKSkgeworICAgIHJldHVybiBfaW1wbF8ua2luZF8ubnVtYmVyX3ZhbHVlXzsKKyAgfQorICByZXR1cm4gMDsKK30KK2lubGluZSB2b2lkIFZhbHVlOjpfaW50ZXJuYWxfc2V0X251bWJlcl92YWx1ZShkb3VibGUgdmFsdWUpIHsKKyAgaWYgKCFfaW50ZXJuYWxfaGFzX251bWJlcl92YWx1ZSgpKSB7CisgICAgY2xlYXJfa2luZCgpOworICAgIHNldF9oYXNfbnVtYmVyX3ZhbHVlKCk7CisgIH0KKyAgX2ltcGxfLmtpbmRfLm51bWJlcl92YWx1ZV8gPSB2YWx1ZTsKK30KK2lubGluZSBkb3VibGUgVmFsdWU6Om51bWJlcl92YWx1ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVmFsdWUubnVtYmVyX3ZhbHVlKQorICByZXR1cm4gX2ludGVybmFsX251bWJlcl92YWx1ZSgpOworfQoraW5saW5lIHZvaWQgVmFsdWU6OnNldF9udW1iZXJfdmFsdWUoZG91YmxlIHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfbnVtYmVyX3ZhbHVlKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVmFsdWUubnVtYmVyX3ZhbHVlKQorfQorCisvLyBzdHJpbmcgc3RyaW5nX3ZhbHVlID0gMzsKK2lubGluZSBib29sIFZhbHVlOjpfaW50ZXJuYWxfaGFzX3N0cmluZ192YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGtpbmRfY2FzZSgpID09IGtTdHJpbmdWYWx1ZTsKK30KK2lubGluZSBib29sIFZhbHVlOjpoYXNfc3RyaW5nX3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19zdHJpbmdfdmFsdWUoKTsKK30KK2lubGluZSB2b2lkIFZhbHVlOjpzZXRfaGFzX3N0cmluZ192YWx1ZSgpIHsKKyAgX2ltcGxfLl9vbmVvZl9jYXNlX1swXSA9IGtTdHJpbmdWYWx1ZTsKK30KK2lubGluZSB2b2lkIFZhbHVlOjpjbGVhcl9zdHJpbmdfdmFsdWUoKSB7CisgIGlmIChfaW50ZXJuYWxfaGFzX3N0cmluZ192YWx1ZSgpKSB7CisgICAgX2ltcGxfLmtpbmRfLnN0cmluZ192YWx1ZV8uRGVzdHJveSgpOworICAgIGNsZWFyX2hhc19raW5kKCk7CisgIH0KK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgVmFsdWU6OnN0cmluZ192YWx1ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVmFsdWUuc3RyaW5nX3ZhbHVlKQorICByZXR1cm4gX2ludGVybmFsX3N0cmluZ192YWx1ZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIHZvaWQgVmFsdWU6OnNldF9zdHJpbmdfdmFsdWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyAgaWYgKCFfaW50ZXJuYWxfaGFzX3N0cmluZ192YWx1ZSgpKSB7CisgICAgY2xlYXJfa2luZCgpOworICAgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgICAgX2ltcGxfLmtpbmRfLnN0cmluZ192YWx1ZV8uSW5pdERlZmF1bHQoKTsKKyAgfQorICBfaW1wbF8ua2luZF8uc3RyaW5nX3ZhbHVlXy5TZXQoIHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5WYWx1ZS5zdHJpbmdfdmFsdWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFZhbHVlOjptdXRhYmxlX3N0cmluZ192YWx1ZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfc3RyaW5nX3ZhbHVlKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5WYWx1ZS5zdHJpbmdfdmFsdWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgVmFsdWU6Ol9pbnRlcm5hbF9zdHJpbmdfdmFsdWUoKSBjb25zdCB7CisgIGlmIChfaW50ZXJuYWxfaGFzX3N0cmluZ192YWx1ZSgpKSB7CisgICAgcmV0dXJuIF9pbXBsXy5raW5kXy5zdHJpbmdfdmFsdWVfLkdldCgpOworICB9CisgIHJldHVybiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpOworfQoraW5saW5lIHZvaWQgVmFsdWU6Ol9pbnRlcm5hbF9zZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBpZiAoIV9pbnRlcm5hbF9oYXNfc3RyaW5nX3ZhbHVlKCkpIHsKKyAgICBjbGVhcl9raW5kKCk7CisgICAgc2V0X2hhc19zdHJpbmdfdmFsdWUoKTsKKyAgICBfaW1wbF8ua2luZF8uc3RyaW5nX3ZhbHVlXy5Jbml0RGVmYXVsdCgpOworICB9CisgIF9pbXBsXy5raW5kXy5zdHJpbmdfdmFsdWVfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBWYWx1ZTo6X2ludGVybmFsX211dGFibGVfc3RyaW5nX3ZhbHVlKCkgeworICBpZiAoIV9pbnRlcm5hbF9oYXNfc3RyaW5nX3ZhbHVlKCkpIHsKKyAgICBjbGVhcl9raW5kKCk7CisgICAgc2V0X2hhc19zdHJpbmdfdmFsdWUoKTsKKyAgICBfaW1wbF8ua2luZF8uc3RyaW5nX3ZhbHVlXy5Jbml0RGVmYXVsdCgpOworICB9CisgIHJldHVybiBfaW1wbF8ua2luZF8uc3RyaW5nX3ZhbHVlXy5NdXRhYmxlKCAgICAgIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogVmFsdWU6OnJlbGVhc2Vfc3RyaW5nX3ZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuVmFsdWUuc3RyaW5nX3ZhbHVlKQorICBpZiAoX2ludGVybmFsX2hhc19zdHJpbmdfdmFsdWUoKSkgeworICAgIGNsZWFyX2hhc19raW5kKCk7CisgICAgcmV0dXJuIF9pbXBsXy5raW5kXy5zdHJpbmdfdmFsdWVfLlJlbGVhc2UoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorfQoraW5saW5lIHZvaWQgVmFsdWU6OnNldF9hbGxvY2F0ZWRfc3RyaW5nX3ZhbHVlKHN0ZDo6c3RyaW5nKiBzdHJpbmdfdmFsdWUpIHsKKyAgaWYgKGhhc19raW5kKCkpIHsKKyAgICBjbGVhcl9raW5kKCk7CisgIH0KKyAgaWYgKHN0cmluZ192YWx1ZSAhPSBudWxscHRyKSB7CisgICAgc2V0X2hhc19zdHJpbmdfdmFsdWUoKTsKKyAgICBfaW1wbF8ua2luZF8uc3RyaW5nX3ZhbHVlXy5Jbml0QWxsb2NhdGVkKHN0cmluZ192YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5WYWx1ZS5zdHJpbmdfdmFsdWUpCit9CisKKy8vIGJvb2wgYm9vbF92YWx1ZSA9IDQ7CitpbmxpbmUgYm9vbCBWYWx1ZTo6X2ludGVybmFsX2hhc19ib29sX3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4ga2luZF9jYXNlKCkgPT0ga0Jvb2xWYWx1ZTsKK30KK2lubGluZSBib29sIFZhbHVlOjpoYXNfYm9vbF92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfYm9vbF92YWx1ZSgpOworfQoraW5saW5lIHZvaWQgVmFsdWU6OnNldF9oYXNfYm9vbF92YWx1ZSgpIHsKKyAgX2ltcGxfLl9vbmVvZl9jYXNlX1swXSA9IGtCb29sVmFsdWU7Cit9CitpbmxpbmUgdm9pZCBWYWx1ZTo6Y2xlYXJfYm9vbF92YWx1ZSgpIHsKKyAgaWYgKF9pbnRlcm5hbF9oYXNfYm9vbF92YWx1ZSgpKSB7CisgICAgX2ltcGxfLmtpbmRfLmJvb2xfdmFsdWVfID0gZmFsc2U7CisgICAgY2xlYXJfaGFzX2tpbmQoKTsKKyAgfQorfQoraW5saW5lIGJvb2wgVmFsdWU6Ol9pbnRlcm5hbF9ib29sX3ZhbHVlKCkgY29uc3QgeworICBpZiAoX2ludGVybmFsX2hhc19ib29sX3ZhbHVlKCkpIHsKKyAgICByZXR1cm4gX2ltcGxfLmtpbmRfLmJvb2xfdmFsdWVfOworICB9CisgIHJldHVybiBmYWxzZTsKK30KK2lubGluZSB2b2lkIFZhbHVlOjpfaW50ZXJuYWxfc2V0X2Jvb2xfdmFsdWUoYm9vbCB2YWx1ZSkgeworICBpZiAoIV9pbnRlcm5hbF9oYXNfYm9vbF92YWx1ZSgpKSB7CisgICAgY2xlYXJfa2luZCgpOworICAgIHNldF9oYXNfYm9vbF92YWx1ZSgpOworICB9CisgIF9pbXBsXy5raW5kXy5ib29sX3ZhbHVlXyA9IHZhbHVlOworfQoraW5saW5lIGJvb2wgVmFsdWU6OmJvb2xfdmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlZhbHVlLmJvb2xfdmFsdWUpCisgIHJldHVybiBfaW50ZXJuYWxfYm9vbF92YWx1ZSgpOworfQoraW5saW5lIHZvaWQgVmFsdWU6OnNldF9ib29sX3ZhbHVlKGJvb2wgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9ib29sX3ZhbHVlKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVmFsdWUuYm9vbF92YWx1ZSkKK30KKworLy8gLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3Qgc3RydWN0X3ZhbHVlID0gNTsKK2lubGluZSBib29sIFZhbHVlOjpfaW50ZXJuYWxfaGFzX3N0cnVjdF92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGtpbmRfY2FzZSgpID09IGtTdHJ1Y3RWYWx1ZTsKK30KK2lubGluZSBib29sIFZhbHVlOjpoYXNfc3RydWN0X3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19zdHJ1Y3RfdmFsdWUoKTsKK30KK2lubGluZSB2b2lkIFZhbHVlOjpzZXRfaGFzX3N0cnVjdF92YWx1ZSgpIHsKKyAgX2ltcGxfLl9vbmVvZl9jYXNlX1swXSA9IGtTdHJ1Y3RWYWx1ZTsKK30KK2lubGluZSB2b2lkIFZhbHVlOjpjbGVhcl9zdHJ1Y3RfdmFsdWUoKSB7CisgIGlmIChfaW50ZXJuYWxfaGFzX3N0cnVjdF92YWx1ZSgpKSB7CisgICAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpIHsKKyAgICAgIGRlbGV0ZSBfaW1wbF8ua2luZF8uc3RydWN0X3ZhbHVlXzsKKyAgICB9CisgICAgY2xlYXJfaGFzX2tpbmQoKTsKKyAgfQorfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJ1Y3QqIFZhbHVlOjpyZWxlYXNlX3N0cnVjdF92YWx1ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLlZhbHVlLnN0cnVjdF92YWx1ZSkKKyAgaWYgKF9pbnRlcm5hbF9oYXNfc3RydWN0X3ZhbHVlKCkpIHsKKyAgICBjbGVhcl9oYXNfa2luZCgpOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJ1Y3QqIHRlbXAgPSBfaW1wbF8ua2luZF8uc3RydWN0X3ZhbHVlXzsKKyAgICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgIT0gbnVsbHB0cikgeworICAgICAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICAgIH0KKyAgICBfaW1wbF8ua2luZF8uc3RydWN0X3ZhbHVlXyA9IG51bGxwdHI7CisgICAgcmV0dXJuIHRlbXA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0JiBWYWx1ZTo6X2ludGVybmFsX3N0cnVjdF92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfc3RydWN0X3ZhbHVlKCkKKyAgICAgID8gKl9pbXBsXy5raW5kXy5zdHJ1Y3RfdmFsdWVfCisgICAgICA6IHJlaW50ZXJwcmV0X2Nhc3Q8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJ1Y3QmPig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X1N0cnVjdF9kZWZhdWx0X2luc3RhbmNlXyk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdCYgVmFsdWU6OnN0cnVjdF92YWx1ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVmFsdWUuc3RydWN0X3ZhbHVlKQorICByZXR1cm4gX2ludGVybmFsX3N0cnVjdF92YWx1ZSgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJ1Y3QqIFZhbHVlOjp1bnNhZmVfYXJlbmFfcmVsZWFzZV9zdHJ1Y3RfdmFsdWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuVmFsdWUuc3RydWN0X3ZhbHVlKQorICBpZiAoX2ludGVybmFsX2hhc19zdHJ1Y3RfdmFsdWUoKSkgeworICAgIGNsZWFyX2hhc19raW5kKCk7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdCogdGVtcCA9IF9pbXBsXy5raW5kXy5zdHJ1Y3RfdmFsdWVfOworICAgIF9pbXBsXy5raW5kXy5zdHJ1Y3RfdmFsdWVfID0gbnVsbHB0cjsKKyAgICByZXR1cm4gdGVtcDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorfQoraW5saW5lIHZvaWQgVmFsdWU6OnVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkX3N0cnVjdF92YWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0KiBzdHJ1Y3RfdmFsdWUpIHsKKyAgY2xlYXJfa2luZCgpOworICBpZiAoc3RydWN0X3ZhbHVlKSB7CisgICAgc2V0X2hhc19zdHJ1Y3RfdmFsdWUoKTsKKyAgICBfaW1wbF8ua2luZF8uc3RydWN0X3ZhbHVlXyA9IHN0cnVjdF92YWx1ZTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlZhbHVlLnN0cnVjdF92YWx1ZSkKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0KiBWYWx1ZTo6X2ludGVybmFsX211dGFibGVfc3RydWN0X3ZhbHVlKCkgeworICBpZiAoIV9pbnRlcm5hbF9oYXNfc3RydWN0X3ZhbHVlKCkpIHsKKyAgICBjbGVhcl9raW5kKCk7CisgICAgc2V0X2hhc19zdHJ1Y3RfdmFsdWUoKTsKKyAgICBfaW1wbF8ua2luZF8uc3RydWN0X3ZhbHVlXyA9IENyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdCA+KEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICByZXR1cm4gX2ltcGxfLmtpbmRfLnN0cnVjdF92YWx1ZV87Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cnVjdCogVmFsdWU6Om11dGFibGVfc3RydWN0X3ZhbHVlKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RydWN0KiBfbXNnID0gX2ludGVybmFsX211dGFibGVfc3RydWN0X3ZhbHVlKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5WYWx1ZS5zdHJ1Y3RfdmFsdWUpCisgIHJldHVybiBfbXNnOworfQorCisvLyAuZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZSBsaXN0X3ZhbHVlID0gNjsKK2lubGluZSBib29sIFZhbHVlOjpfaW50ZXJuYWxfaGFzX2xpc3RfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBraW5kX2Nhc2UoKSA9PSBrTGlzdFZhbHVlOworfQoraW5saW5lIGJvb2wgVmFsdWU6Omhhc19saXN0X3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2hhc19saXN0X3ZhbHVlKCk7Cit9CitpbmxpbmUgdm9pZCBWYWx1ZTo6c2V0X2hhc19saXN0X3ZhbHVlKCkgeworICBfaW1wbF8uX29uZW9mX2Nhc2VfWzBdID0ga0xpc3RWYWx1ZTsKK30KK2lubGluZSB2b2lkIFZhbHVlOjpjbGVhcl9saXN0X3ZhbHVlKCkgeworICBpZiAoX2ludGVybmFsX2hhc19saXN0X3ZhbHVlKCkpIHsKKyAgICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikgeworICAgICAgZGVsZXRlIF9pbXBsXy5raW5kXy5saXN0X3ZhbHVlXzsKKyAgICB9CisgICAgY2xlYXJfaGFzX2tpbmQoKTsKKyAgfQorfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpMaXN0VmFsdWUqIFZhbHVlOjpyZWxlYXNlX2xpc3RfdmFsdWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5WYWx1ZS5saXN0X3ZhbHVlKQorICBpZiAoX2ludGVybmFsX2hhc19saXN0X3ZhbHVlKCkpIHsKKyAgICBjbGVhcl9oYXNfa2luZCgpOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpMaXN0VmFsdWUqIHRlbXAgPSBfaW1wbF8ua2luZF8ubGlzdF92YWx1ZV87CisgICAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpICE9IG51bGxwdHIpIHsKKyAgICAgIHRlbXAgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkR1cGxpY2F0ZUlmTm9uTnVsbCh0ZW1wKTsKKyAgICB9CisgICAgX2ltcGxfLmtpbmRfLmxpc3RfdmFsdWVfID0gbnVsbHB0cjsKKyAgICByZXR1cm4gdGVtcDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpMaXN0VmFsdWUmIFZhbHVlOjpfaW50ZXJuYWxfbGlzdF92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfbGlzdF92YWx1ZSgpCisgICAgICA/ICpfaW1wbF8ua2luZF8ubGlzdF92YWx1ZV8KKyAgICAgIDogcmVpbnRlcnByZXRfY2FzdDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Okxpc3RWYWx1ZSY+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfTGlzdFZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfKTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TGlzdFZhbHVlJiBWYWx1ZTo6bGlzdF92YWx1ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVmFsdWUubGlzdF92YWx1ZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9saXN0X3ZhbHVlKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Okxpc3RWYWx1ZSogVmFsdWU6OnVuc2FmZV9hcmVuYV9yZWxlYXNlX2xpc3RfdmFsdWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuVmFsdWUubGlzdF92YWx1ZSkKKyAgaWYgKF9pbnRlcm5hbF9oYXNfbGlzdF92YWx1ZSgpKSB7CisgICAgY2xlYXJfaGFzX2tpbmQoKTsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TGlzdFZhbHVlKiB0ZW1wID0gX2ltcGxfLmtpbmRfLmxpc3RfdmFsdWVfOworICAgIF9pbXBsXy5raW5kXy5saXN0X3ZhbHVlXyA9IG51bGxwdHI7CisgICAgcmV0dXJuIHRlbXA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK30KK2lubGluZSB2b2lkIFZhbHVlOjp1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF9saXN0X3ZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpMaXN0VmFsdWUqIGxpc3RfdmFsdWUpIHsKKyAgY2xlYXJfa2luZCgpOworICBpZiAobGlzdF92YWx1ZSkgeworICAgIHNldF9oYXNfbGlzdF92YWx1ZSgpOworICAgIF9pbXBsXy5raW5kXy5saXN0X3ZhbHVlXyA9IGxpc3RfdmFsdWU7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3Vuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5WYWx1ZS5saXN0X3ZhbHVlKQorfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpMaXN0VmFsdWUqIFZhbHVlOjpfaW50ZXJuYWxfbXV0YWJsZV9saXN0X3ZhbHVlKCkgeworICBpZiAoIV9pbnRlcm5hbF9oYXNfbGlzdF92YWx1ZSgpKSB7CisgICAgY2xlYXJfa2luZCgpOworICAgIHNldF9oYXNfbGlzdF92YWx1ZSgpOworICAgIF9pbXBsXy5raW5kXy5saXN0X3ZhbHVlXyA9IENyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Okxpc3RWYWx1ZSA+KEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICByZXR1cm4gX2ltcGxfLmtpbmRfLmxpc3RfdmFsdWVfOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpMaXN0VmFsdWUqIFZhbHVlOjptdXRhYmxlX2xpc3RfdmFsdWUoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpMaXN0VmFsdWUqIF9tc2cgPSBfaW50ZXJuYWxfbXV0YWJsZV9saXN0X3ZhbHVlKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5WYWx1ZS5saXN0X3ZhbHVlKQorICByZXR1cm4gX21zZzsKK30KKworaW5saW5lIGJvb2wgVmFsdWU6Omhhc19raW5kKCkgY29uc3QgeworICByZXR1cm4ga2luZF9jYXNlKCkgIT0gS0lORF9OT1RfU0VUOworfQoraW5saW5lIHZvaWQgVmFsdWU6OmNsZWFyX2hhc19raW5kKCkgeworICBfaW1wbF8uX29uZW9mX2Nhc2VfWzBdID0gS0lORF9OT1RfU0VUOworfQoraW5saW5lIFZhbHVlOjpLaW5kQ2FzZSBWYWx1ZTo6a2luZF9jYXNlKCkgY29uc3QgeworICByZXR1cm4gVmFsdWU6OktpbmRDYXNlKF9pbXBsXy5fb25lb2ZfY2FzZV9bMF0pOworfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBMaXN0VmFsdWUKKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZSB2YWx1ZXMgPSAxOworaW5saW5lIGludCBMaXN0VmFsdWU6Ol9pbnRlcm5hbF92YWx1ZXNfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy52YWx1ZXNfLnNpemUoKTsKK30KK2lubGluZSBpbnQgTGlzdFZhbHVlOjp2YWx1ZXNfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF92YWx1ZXNfc2l6ZSgpOworfQoraW5saW5lIHZvaWQgTGlzdFZhbHVlOjpjbGVhcl92YWx1ZXMoKSB7CisgIF9pbXBsXy52YWx1ZXNfLkNsZWFyKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlZhbHVlKiBMaXN0VmFsdWU6Om11dGFibGVfdmFsdWVzKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlLnZhbHVlcykKKyAgcmV0dXJuIF9pbXBsXy52YWx1ZXNfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VmFsdWUgPioKK0xpc3RWYWx1ZTo6bXV0YWJsZV92YWx1ZXMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZS52YWx1ZXMpCisgIHJldHVybiAmX2ltcGxfLnZhbHVlc187Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlZhbHVlJiBMaXN0VmFsdWU6Ol9pbnRlcm5hbF92YWx1ZXMoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8udmFsdWVzXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZSYgTGlzdFZhbHVlOjp2YWx1ZXMoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZS52YWx1ZXMpCisgIHJldHVybiBfaW50ZXJuYWxfdmFsdWVzKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VmFsdWUqIExpc3RWYWx1ZTo6X2ludGVybmFsX2FkZF92YWx1ZXMoKSB7CisgIHJldHVybiBfaW1wbF8udmFsdWVzXy5BZGQoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VmFsdWUqIExpc3RWYWx1ZTo6YWRkX3ZhbHVlcygpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlZhbHVlKiBfYWRkID0gX2ludGVybmFsX2FkZF92YWx1ZXMoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlLnZhbHVlcykKKyAgcmV0dXJuIF9hZGQ7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpWYWx1ZSA+JgorTGlzdFZhbHVlOjp2YWx1ZXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUudmFsdWVzKQorICByZXR1cm4gX2ltcGxfLnZhbHVlc187Cit9CisKKyNpZmRlZiBfX0dOVUNfXworICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorI2VuZGlmICAvLyBfX0dOVUNfXworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KKwordGVtcGxhdGUgPD4gc3RydWN0IGlzX3Byb3RvX2VudW08IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpOdWxsVmFsdWU+IDogOjpzdGQ6OnRydWVfdHlwZSB7fTsKK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TnVsbFZhbHVlPigpIHsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpOdWxsVmFsdWVfZGVzY3JpcHRvcigpOworfQorCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX0dPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZnN0cnVjdF8yZXByb3RvCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYzg0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90bwpAQCAtMCwwICsxLDk1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOworCitvcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMiOworb3B0aW9uIGNjX2VuYWJsZV9hcmVuYXMgPSB0cnVlOworb3B0aW9uIGdvX3BhY2thZ2UgPSAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vc3RydWN0cGIiOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJTdHJ1Y3RQcm90byI7CitvcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7CitvcHRpb24gb2JqY19jbGFzc19wcmVmaXggPSAiR1BCIjsKKworLy8gYFN0cnVjdGAgcmVwcmVzZW50cyBhIHN0cnVjdHVyZWQgZGF0YSB2YWx1ZSwgY29uc2lzdGluZyBvZiBmaWVsZHMKKy8vIHdoaWNoIG1hcCB0byBkeW5hbWljYWxseSB0eXBlZCB2YWx1ZXMuIEluIHNvbWUgbGFuZ3VhZ2VzLCBgU3RydWN0YAorLy8gbWlnaHQgYmUgc3VwcG9ydGVkIGJ5IGEgbmF0aXZlIHJlcHJlc2VudGF0aW9uLiBGb3IgZXhhbXBsZSwgaW4KKy8vIHNjcmlwdGluZyBsYW5ndWFnZXMgbGlrZSBKUyBhIHN0cnVjdCBpcyByZXByZXNlbnRlZCBhcyBhbgorLy8gb2JqZWN0LiBUaGUgZGV0YWlscyBvZiB0aGF0IHJlcHJlc2VudGF0aW9uIGFyZSBkZXNjcmliZWQgdG9nZXRoZXIKKy8vIHdpdGggdGhlIHByb3RvIHN1cHBvcnQgZm9yIHRoZSBsYW5ndWFnZS4KKy8vCisvLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYFN0cnVjdGAgaXMgSlNPTiBvYmplY3QuCittZXNzYWdlIFN0cnVjdCB7CisgIC8vIFVub3JkZXJlZCBtYXAgb2YgZHluYW1pY2FsbHkgdHlwZWQgdmFsdWVzLgorICBtYXA8c3RyaW5nLCBWYWx1ZT4gZmllbGRzID0gMTsKK30KKworLy8gYFZhbHVlYCByZXByZXNlbnRzIGEgZHluYW1pY2FsbHkgdHlwZWQgdmFsdWUgd2hpY2ggY2FuIGJlIGVpdGhlcgorLy8gbnVsbCwgYSBudW1iZXIsIGEgc3RyaW5nLCBhIGJvb2xlYW4sIGEgcmVjdXJzaXZlIHN0cnVjdCB2YWx1ZSwgb3IgYQorLy8gbGlzdCBvZiB2YWx1ZXMuIEEgcHJvZHVjZXIgb2YgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gc2V0IG9uZSBvZiB0aGVzZQorLy8gdmFyaWFudHMuIEFic2VuY2Ugb2YgYW55IHZhcmlhbnQgaW5kaWNhdGVzIGFuIGVycm9yLgorLy8KKy8vIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgVmFsdWVgIGlzIEpTT04gdmFsdWUuCittZXNzYWdlIFZhbHVlIHsKKyAgLy8gVGhlIGtpbmQgb2YgdmFsdWUuCisgIG9uZW9mIGtpbmQgeworICAgIC8vIFJlcHJlc2VudHMgYSBudWxsIHZhbHVlLgorICAgIE51bGxWYWx1ZSBudWxsX3ZhbHVlID0gMTsKKyAgICAvLyBSZXByZXNlbnRzIGEgZG91YmxlIHZhbHVlLgorICAgIGRvdWJsZSBudW1iZXJfdmFsdWUgPSAyOworICAgIC8vIFJlcHJlc2VudHMgYSBzdHJpbmcgdmFsdWUuCisgICAgc3RyaW5nIHN0cmluZ192YWx1ZSA9IDM7CisgICAgLy8gUmVwcmVzZW50cyBhIGJvb2xlYW4gdmFsdWUuCisgICAgYm9vbCBib29sX3ZhbHVlID0gNDsKKyAgICAvLyBSZXByZXNlbnRzIGEgc3RydWN0dXJlZCB2YWx1ZS4KKyAgICBTdHJ1Y3Qgc3RydWN0X3ZhbHVlID0gNTsKKyAgICAvLyBSZXByZXNlbnRzIGEgcmVwZWF0ZWQgYFZhbHVlYC4KKyAgICBMaXN0VmFsdWUgbGlzdF92YWx1ZSA9IDY7CisgIH0KK30KKworLy8gYE51bGxWYWx1ZWAgaXMgYSBzaW5nbGV0b24gZW51bWVyYXRpb24gdG8gcmVwcmVzZW50IHRoZSBudWxsIHZhbHVlIGZvciB0aGUKKy8vIGBWYWx1ZWAgdHlwZSB1bmlvbi4KKy8vCisvLyAgVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBOdWxsVmFsdWVgIGlzIEpTT04gYG51bGxgLgorZW51bSBOdWxsVmFsdWUgeworICAvLyBOdWxsIHZhbHVlLgorICBOVUxMX1ZBTFVFID0gMDsKK30KKworLy8gYExpc3RWYWx1ZWAgaXMgYSB3cmFwcGVyIGFyb3VuZCBhIHJlcGVhdGVkIGZpZWxkIG9mIHZhbHVlcy4KKy8vCisvLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYExpc3RWYWx1ZWAgaXMgSlNPTiBhcnJheS4KK21lc3NhZ2UgTGlzdFZhbHVlIHsKKyAgLy8gUmVwZWF0ZWQgZmllbGQgb2YgZHluYW1pY2FsbHkgdHlwZWQgdmFsdWVzLgorICByZXBlYXRlZCBWYWx1ZSB2YWx1ZXMgPSAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MGQ2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW0uY2MKQEAgLTAsMCArMSwxOTQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW0uaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBzdHJpbmdzIHsKKwordm9pZCBCeXRlU291cmNlOjpDb3B5VG8oQnl0ZVNpbmsqIHNpbmssIHNpemVfdCBuKSB7CisgIHdoaWxlIChuID4gMCkgeworICAgIFN0cmluZ1BpZWNlIGZyYWdtZW50ID0gUGVlaygpOworICAgIGlmIChmcmFnbWVudC5lbXB0eSgpKSB7CisgICAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkJ5dGVTb3VyY2U6OkNvcHlUbygpIG92ZXJyYW4gaW5wdXQuIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzdGQ6OnNpemVfdCBmcmFnbWVudF9zaXplID0gc3RkOjptaW48c3RkOjpzaXplX3Q+KG4sIGZyYWdtZW50LnNpemUoKSk7CisgICAgc2luay0+QXBwZW5kKGZyYWdtZW50LmRhdGEoKSwgZnJhZ21lbnRfc2l6ZSk7CisgICAgU2tpcChmcmFnbWVudF9zaXplKTsKKyAgICBuIC09IGZyYWdtZW50X3NpemU7CisgIH0KK30KKwordm9pZCBCeXRlU2luazo6Rmx1c2goKSB7fQorCit2b2lkIFVuY2hlY2tlZEFycmF5Qnl0ZVNpbms6OkFwcGVuZChjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbikgeworICBpZiAoZGF0YSAhPSBkZXN0XykgeworICAgIC8vIENhdGNoIGNhc2VzIHdoZXJlIHRoZSBwb2ludGVyIHJldHVybmVkIGJ5IEdldEFwcGVuZEJ1ZmZlcigpIHdhcyBtb2RpZmllZC4KKyAgICBHT09HTEVfRENIRUNLKCEoZGVzdF8gPD0gZGF0YSAmJiBkYXRhIDwgKGRlc3RfICsgbikpKQorICAgICAgICA8PCAiQXBwZW5kKCkgZGF0YVtdIG92ZXJsYXBzIHdpdGggZGVzdF9bXSI7CisgICAgbWVtY3B5KGRlc3RfLCBkYXRhLCBuKTsKKyAgfQorICBkZXN0XyArPSBuOworfQorCitDaGVja2VkQXJyYXlCeXRlU2luazo6Q2hlY2tlZEFycmF5Qnl0ZVNpbmsoY2hhciogb3V0YnVmLCBzaXplX3QgY2FwYWNpdHkpCisgICAgOiBvdXRidWZfKG91dGJ1ZiksIGNhcGFjaXR5XyhjYXBhY2l0eSksIHNpemVfKDApLCBvdmVyZmxvd2VkXyhmYWxzZSkgeworfQorCit2b2lkIENoZWNrZWRBcnJheUJ5dGVTaW5rOjpBcHBlbmQoY29uc3QgY2hhciogYnl0ZXMsIHNpemVfdCBuKSB7CisgIHNpemVfdCBhdmFpbGFibGUgPSBjYXBhY2l0eV8gLSBzaXplXzsKKyAgaWYgKG4gPiBhdmFpbGFibGUpIHsKKyAgICBuID0gYXZhaWxhYmxlOworICAgIG92ZXJmbG93ZWRfID0gdHJ1ZTsKKyAgfQorICBpZiAobiA+IDAgJiYgYnl0ZXMgIT0gKG91dGJ1Zl8gKyBzaXplXykpIHsKKyAgICAvLyBDYXRjaCBjYXNlcyB3aGVyZSB0aGUgcG9pbnRlciByZXR1cm5lZCBieSBHZXRBcHBlbmRCdWZmZXIoKSB3YXMgbW9kaWZpZWQuCisgICAgR09PR0xFX0RDSEVDSyghKG91dGJ1Zl8gPD0gYnl0ZXMgJiYgYnl0ZXMgPCAob3V0YnVmXyArIGNhcGFjaXR5XykpKQorICAgICAgICA8PCAiQXBwZW5kKCkgYnl0ZXNbXSBvdmVybGFwcyB3aXRoIG91dGJ1Zl9bXSI7CisgICAgbWVtY3B5KG91dGJ1Zl8gKyBzaXplXywgYnl0ZXMsIG4pOworICB9CisgIHNpemVfICs9IG47Cit9CisKK0dyb3dpbmdBcnJheUJ5dGVTaW5rOjpHcm93aW5nQXJyYXlCeXRlU2luayhzaXplX3QgZXN0aW1hdGVkX3NpemUpCisgICAgOiBjYXBhY2l0eV8oZXN0aW1hdGVkX3NpemUpLAorICAgICAgYnVmXyhuZXcgY2hhcltlc3RpbWF0ZWRfc2l6ZV0pLAorICAgICAgc2l6ZV8oMCkgeworfQorCitHcm93aW5nQXJyYXlCeXRlU2luazo6fkdyb3dpbmdBcnJheUJ5dGVTaW5rKCkgeworICBkZWxldGVbXSBidWZfOyAgLy8gSnVzdCBpbiBjYXNlIHRoZSB1c2VyIGRpZG4ndCBjYWxsIEdldEJ1ZmZlci4KK30KKwordm9pZCBHcm93aW5nQXJyYXlCeXRlU2luazo6QXBwZW5kKGNvbnN0IGNoYXIqIGJ5dGVzLCBzaXplX3QgbikgeworICBzaXplX3QgYXZhaWxhYmxlID0gY2FwYWNpdHlfIC0gc2l6ZV87CisgIGlmIChieXRlcyAhPSAoYnVmXyArIHNpemVfKSkgeworICAgIC8vIENhdGNoIGNhc2VzIHdoZXJlIHRoZSBwb2ludGVyIHJldHVybmVkIGJ5IEdldEFwcGVuZEJ1ZmZlcigpIHdhcyBtb2RpZmllZC4KKyAgICAvLyBXZSBuZWVkIHRvIHRlc3QgZm9yIHRoaXMgYmVmb3JlIGNhbGxpbmcgRXhwYW5kKCkgd2hpY2ggbWF5IHJlYWxsb2NhdGUuCisgICAgR09PR0xFX0RDSEVDSyghKGJ1Zl8gPD0gYnl0ZXMgJiYgYnl0ZXMgPCAoYnVmXyArIGNhcGFjaXR5XykpKQorICAgICAgICA8PCAiQXBwZW5kKCkgYnl0ZXNbXSBvdmVybGFwcyB3aXRoIGJ1Zl9bXSI7CisgIH0KKyAgaWYgKG4gPiBhdmFpbGFibGUpIHsKKyAgICBFeHBhbmQobiAtIGF2YWlsYWJsZSk7CisgIH0KKyAgaWYgKG4gPiAwICYmIGJ5dGVzICE9IChidWZfICsgc2l6ZV8pKSB7CisgICAgbWVtY3B5KGJ1Zl8gKyBzaXplXywgYnl0ZXMsIG4pOworICB9CisgIHNpemVfICs9IG47Cit9CisKK2NoYXIqIEdyb3dpbmdBcnJheUJ5dGVTaW5rOjpHZXRCdWZmZXIoc2l6ZV90KiBuYnl0ZXMpIHsKKyAgU2hyaW5rVG9GaXQoKTsKKyAgY2hhciogYiA9IGJ1Zl87CisgICpuYnl0ZXMgPSBzaXplXzsKKyAgYnVmXyA9IG51bGxwdHI7CisgIHNpemVfID0gY2FwYWNpdHlfID0gMDsKKyAgcmV0dXJuIGI7Cit9CisKK3ZvaWQgR3Jvd2luZ0FycmF5Qnl0ZVNpbms6OkV4cGFuZChzaXplX3QgYW1vdW50KSB7ICAvLyBFeHBhbmQgYnkgYXQgbGVhc3QgNTAlLgorICBzaXplX3QgbmV3X2NhcGFjaXR5ID0gc3RkOjptYXgoY2FwYWNpdHlfICsgYW1vdW50LCAoMyAqIGNhcGFjaXR5XykgLyAyKTsKKyAgY2hhciogYmlnZ2VyID0gbmV3IGNoYXJbbmV3X2NhcGFjaXR5XTsKKyAgbWVtY3B5KGJpZ2dlciwgYnVmXywgc2l6ZV8pOworICBkZWxldGVbXSBidWZfOworICBidWZfID0gYmlnZ2VyOworICBjYXBhY2l0eV8gPSBuZXdfY2FwYWNpdHk7Cit9CisKK3ZvaWQgR3Jvd2luZ0FycmF5Qnl0ZVNpbms6OlNocmlua1RvRml0KCkgeworICAvLyBTaHJpbmsgb25seSBpZiB0aGUgYnVmZmVyIGlzIGxhcmdlIGFuZCBzaXplXyBpcyBsZXNzIHRoYW4gMy80CisgIC8vIG9mIGNhcGFjaXR5Xy4KKyAgaWYgKGNhcGFjaXR5XyA+IDI1NiAmJiBzaXplXyA8ICgzICogY2FwYWNpdHlfKSAvIDQpIHsKKyAgICBjaGFyKiBqdXN0X2Vub3VnaCA9IG5ldyBjaGFyW3NpemVfXTsKKyAgICBtZW1jcHkoanVzdF9lbm91Z2gsIGJ1Zl8sIHNpemVfKTsKKyAgICBkZWxldGVbXSBidWZfOworICAgIGJ1Zl8gPSBqdXN0X2Vub3VnaDsKKyAgICBjYXBhY2l0eV8gPSBzaXplXzsKKyAgfQorfQorCit2b2lkIFN0cmluZ0J5dGVTaW5rOjpBcHBlbmQoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IG4pIHsKKyAgZGVzdF8tPmFwcGVuZChkYXRhLCBuKTsKK30KKworc2l6ZV90IEFycmF5Qnl0ZVNvdXJjZTo6QXZhaWxhYmxlKCkgY29uc3QgeworICByZXR1cm4gaW5wdXRfLnNpemUoKTsKK30KKworU3RyaW5nUGllY2UgQXJyYXlCeXRlU291cmNlOjpQZWVrKCkgeworICByZXR1cm4gaW5wdXRfOworfQorCit2b2lkIEFycmF5Qnl0ZVNvdXJjZTo6U2tpcChzaXplX3QgbikgeworICBHT09HTEVfRENIRUNLX0xFKG4sIGlucHV0Xy5zaXplKCkpOworICBpbnB1dF8ucmVtb3ZlX3ByZWZpeChuKTsKK30KKworTGltaXRCeXRlU291cmNlOjpMaW1pdEJ5dGVTb3VyY2UoQnl0ZVNvdXJjZSAqc291cmNlLCBzaXplX3QgbGltaXQpCisgIDogc291cmNlXyhzb3VyY2UpLAorICAgIGxpbWl0XyhsaW1pdCkgeworfQorCitzaXplX3QgTGltaXRCeXRlU291cmNlOjpBdmFpbGFibGUoKSBjb25zdCB7CisgIHNpemVfdCBhdmFpbGFibGUgPSBzb3VyY2VfLT5BdmFpbGFibGUoKTsKKyAgaWYgKGF2YWlsYWJsZSA+IGxpbWl0XykgeworICAgIGF2YWlsYWJsZSA9IGxpbWl0XzsKKyAgfQorCisgIHJldHVybiBhdmFpbGFibGU7Cit9CisKK1N0cmluZ1BpZWNlIExpbWl0Qnl0ZVNvdXJjZTo6UGVlaygpIHsKKyAgU3RyaW5nUGllY2UgcGllY2UgPSBzb3VyY2VfLT5QZWVrKCk7CisgIHJldHVybiBTdHJpbmdQaWVjZShwaWVjZS5kYXRhKCksIHN0ZDo6bWluKHBpZWNlLnNpemUoKSwgbGltaXRfKSk7Cit9CisKK3ZvaWQgTGltaXRCeXRlU291cmNlOjpTa2lwKHNpemVfdCBuKSB7CisgIEdPT0dMRV9EQ0hFQ0tfTEUobiwgbGltaXRfKTsKKyAgc291cmNlXy0+U2tpcChuKTsKKyAgbGltaXRfIC09IG47Cit9CisKK3ZvaWQgTGltaXRCeXRlU291cmNlOjpDb3B5VG8oQnl0ZVNpbmsgKnNpbmssIHNpemVfdCBuKSB7CisgIEdPT0dMRV9EQ0hFQ0tfTEUobiwgbGltaXRfKTsKKyAgc291cmNlXy0+Q29weVRvKHNpbmssIG4pOworICBsaW1pdF8gLT0gbjsKK30KKworfSAgLy8gbmFtZXNwYWNlIHN0cmluZ3MKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E0OGRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmgKQEAgLTAsMCArMSwzNTEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIEJ5dGVTaW5rIGFuZCBCeXRlU291cmNlIGFic3RyYWN0IGludGVyZmFjZXMuIFRoZXNlCisvLyBpbnRlcmZhY2VzIHJlcHJlc2VudCBvYmplY3RzIHRoYXQgY29uc3VtZSAoQnl0ZVNpbmspIG9yIHByb2R1Y2UgKEJ5dGVTb3VyY2UpCisvLyBhIHNlcXVlbmNlIG9mIGJ5dGVzLiBVc2luZyB0aGVzZSBhYnN0cmFjdCBpbnRlcmZhY2VzIGluIHlvdXIgQVBJcyBjYW4gaGVscAorLy8gbWFrZSB5b3VyIGNvZGUgd29yayB3aXRoIGEgdmFyaWV0eSBvZiBpbnB1dCBhbmQgb3V0cHV0IHR5cGVzLgorLy8KKy8vIFRoaXMgZmlsZSBhbHNvIGRlY2xhcmVzIHRoZSBmb2xsb3dpbmcgY29tbW9ubHkgdXNlZCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlc2UKKy8vIGludGVyZmFjZXMuCisvLworLy8gICBCeXRlU2luazoKKy8vICAgICAgVW5jaGVja2VkQXJyYXlCeXRlU2luayAgV3JpdGVzIHRvIGFuIGFycmF5LCB3aXRob3V0IGJvdW5kcyBjaGVja2luZworLy8gICAgICBDaGVja2VkQXJyYXlCeXRlU2luayAgICBXcml0ZXMgdG8gYW4gYXJyYXksIHdpdGggYm91bmRzIGNoZWNraW5nCisvLyAgICAgIEdyb3dpbmdBcnJheUJ5dGVTaW5rICAgIEFsbG9jYXRlcyBhbmQgd3JpdGVzIHRvIGEgZ3Jvd2FibGUgYnVmZmVyCisvLyAgICAgIFN0cmluZ0J5dGVTaW5rICAgICAgICAgIFdyaXRlcyB0byBhbiBTVEwgc3RyaW5nCisvLyAgICAgIE51bGxCeXRlU2luayAgICAgICAgICAgIENvbnN1bWVzIGEgbmV2ZXItZW5kaW5nIHN0cmVhbSBvZiBieXRlcworLy8KKy8vICAgQnl0ZVNvdXJjZToKKy8vICAgICAgQXJyYXlCeXRlU291cmNlICAgICAgICAgUmVhZHMgZnJvbSBhbiBhcnJheSBvciBzdHJpbmcvU3RyaW5nUGllY2UKKy8vICAgICAgTGltaXRlZEJ5dGVTb3VyY2UgICAgICAgTGltaXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIGFuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX0JZVEVTVFJFQU1fSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX0JZVEVTVFJFQU1fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2UuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK2NsYXNzIENvcmRCeXRlU2luazsKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHN0cmluZ3MgeworCisvLyBBbiBhYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGFuIG9iamVjdCB0aGF0IGNvbnN1bWVzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuIFRoaXMKKy8vIGludGVyZmFjZSBvZmZlcnMgYSB3YXkgdG8gYXBwZW5kIGRhdGEgYXMgd2VsbCBhcyBhIEZsdXNoKCkgZnVuY3Rpb24uCisvLworLy8gRXhhbXBsZToKKy8vCisvLyAgIHN0cmluZyBteV9kYXRhOworLy8gICAuLi4KKy8vICAgQnl0ZVNpbmsqIHNpbmsgPSAuLi4KKy8vICAgc2luay0+QXBwZW5kKG15X2RhdGEuZGF0YSgpLCBteV9kYXRhLnNpemUoKSk7CisvLyAgIHNpbmstPkZsdXNoKCk7CisvLworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEJ5dGVTaW5rIHsKKyBwdWJsaWM6CisgIEJ5dGVTaW5rKCkge30KKyAgdmlydHVhbCB+Qnl0ZVNpbmsoKSB7fQorCisgIC8vIEFwcGVuZHMgdGhlICJuIiBieXRlcyBzdGFydGluZyBhdCAiYnl0ZXMiLgorICB2aXJ0dWFsIHZvaWQgQXBwZW5kKGNvbnN0IGNoYXIqIGJ5dGVzLCBzaXplX3QgbikgPSAwOworCisgIC8vIEZsdXNoZXMgaW50ZXJuYWwgYnVmZmVycy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBCeXRlU2luaworICAvLyBzdWJjbGFzc2VzIG1heSB1c2UgaW50ZXJuYWwgYnVmZmVycyB0aGF0IHJlcXVpcmUgY2FsbGluZyBGbHVzaCgpIGF0IHRoZSBlbmQKKyAgLy8gb2YgdGhlIHN0cmVhbS4KKyAgdmlydHVhbCB2b2lkIEZsdXNoKCk7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQnl0ZVNpbmspOworfTsKKworLy8gQW4gYWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhbiBvYmplY3QgdGhhdCBwcm9kdWNlcyBhIGZpeGVkLXNpemUgc2VxdWVuY2Ugb2YKKy8vIGJ5dGVzLgorLy8KKy8vIEV4YW1wbGU6CisvLworLy8gICBCeXRlU291cmNlKiBzb3VyY2UgPSAuLi4KKy8vICAgd2hpbGUgKHNvdXJjZS0+QXZhaWxhYmxlKCkgPiAwKSB7CisvLyAgICAgU3RyaW5nUGllY2UgZGF0YSA9IHNvdXJjZS0+UGVlaygpOworLy8gICAgIC4uLiBkbyBzb21ldGhpbmcgd2l0aCAiZGF0YSIgLi4uCisvLyAgICAgc291cmNlLT5Ta2lwKGRhdGEubGVuZ3RoKCkpOworLy8gICB9CisvLworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEJ5dGVTb3VyY2UgeworIHB1YmxpYzoKKyAgQnl0ZVNvdXJjZSgpIHt9CisgIHZpcnR1YWwgfkJ5dGVTb3VyY2UoKSB7fQorCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIHJlYWQgZnJvbSB0aGUgc291cmNlLiBBdmFpbGFibGUoKQorICAvLyBzaG91bGQgZGVjcmVhc2UgYnkgTiBlYWNoIHRpbWUgU2tpcChOKSBpcyBjYWxsZWQuIEF2YWlsYWJsZSgpIG1heSBub3QKKyAgLy8gaW5jcmVhc2UuIEF2YWlsYWJsZSgpIHJldHVybmluZyAwIGluZGljYXRlcyB0aGF0IHRoZSBCeXRlU291cmNlIGlzCisgIC8vIGV4aGF1c3RlZC4KKyAgLy8KKyAgLy8gTm90ZTogU2l6ZSgpIG1heSBoYXZlIGJlZW4gYSBtb3JlIGFwcHJvcHJpYXRlIG5hbWUgYXMgaXQncyBtb3JlCisgIC8vICAgICAgIGluZGljYXRpdmUgb2YgdGhlIGZpeGVkLXNpemUgbmF0dXJlIG9mIGEgQnl0ZVNvdXJjZS4KKyAgdmlydHVhbCBzaXplX3QgQXZhaWxhYmxlKCkgY29uc3QgPSAwOworCisgIC8vIFJldHVybnMgYSBTdHJpbmdQaWVjZSBvZiB0aGUgbmV4dCBjb250aWd1b3VzIHJlZ2lvbiBvZiB0aGUgc291cmNlLiBEb2VzIG5vdAorICAvLyByZXBvc2l0aW9uIHRoZSBzb3VyY2UuIFRoZSByZXR1cm5lZCByZWdpb24gaXMgZW1wdHkgaWZmIEF2YWlsYWJsZSgpID09IDAuCisgIC8vCisgIC8vIFRoZSByZXR1cm5lZCByZWdpb24gaXMgdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byBTa2lwKCkgb3IgdW50aWwgdGhpcworICAvLyBvYmplY3QgaXMgZGVzdHJveWVkLCB3aGljaGV2ZXIgb2NjdXJzIGZpcnN0LgorICAvLworICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSByZXR1cm5lZCBTdHJpbmdQaWVjZSB3aWxsIGJlIDw9IEF2YWlsYWJsZSgpLgorICB2aXJ0dWFsIFN0cmluZ1BpZWNlIFBlZWsoKSA9IDA7CisKKyAgLy8gU2tpcHMgdGhlIG5leHQgbiBieXRlcy4gSW52YWxpZGF0ZXMgYW55IFN0cmluZ1BpZWNlIHJldHVybmVkIGJ5IGEgcHJldmlvdXMKKyAgLy8gY2FsbCB0byBQZWVrKCkuCisgIC8vCisgIC8vIFJFUVVJUkVTOiBBdmFpbGFibGUoKSA+PSBuCisgIHZpcnR1YWwgdm9pZCBTa2lwKHNpemVfdCBuKSA9IDA7CisKKyAgLy8gV3JpdGVzIHRoZSBuZXh0IG4gYnl0ZXMgaW4gdGhpcyBCeXRlU291cmNlIHRvIHRoZSBnaXZlbiBCeXRlU2luaywgYW5kCisgIC8vIGFkdmFuY2VzIHRoaXMgQnl0ZVNvdXJjZSBwYXN0IHRoZSBjb3BpZWQgYnl0ZXMuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgIC8vIG9mIHRoaXMgbWV0aG9kIGp1c3QgY29waWVzIHRoZSBieXRlcyBub3JtYWxseSwgYnV0IHN1YmNsYXNzZXMgbWlnaHQKKyAgLy8gb3ZlcnJpZGUgQ29weVRvIHRvIG9wdGltaXplIGNlcnRhaW4gY2FzZXMuCisgIC8vCisgIC8vIFJFUVVJUkVTOiBBdmFpbGFibGUoKSA+PSBuCisgIHZpcnR1YWwgdm9pZCBDb3B5VG8oQnl0ZVNpbmsqIHNpbmssIHNpemVfdCBuKTsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhCeXRlU291cmNlKTsKK307CisKKy8vCisvLyBTb21lIGNvbW1vbmx5IHVzZWQgaW1wbGVtZW50YXRpb25zIG9mIEJ5dGVTaW5rCisvLworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBCeXRlU2luayB0aGF0IHdyaXRlcyB0byBhbiB1bnNpemVkIGJ5dGUgYXJyYXkuIE5vCisvLyBib3VuZHMtY2hlY2tpbmcgaXMgcGVyZm9ybWVkLS1pdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlCisvLyB0aGF0IHRoZSBkZXN0aW5hdGlvbiBhcnJheSBpcyBsYXJnZSBlbm91Z2guCisvLworLy8gRXhhbXBsZToKKy8vCisvLyAgIGNoYXIgYnVmWzEwXTsKKy8vICAgVW5jaGVja2VkQXJyYXlCeXRlU2luayBzaW5rKGJ1Zik7CisvLyAgIHNpbmsuQXBwZW5kKCJoaSIsIDIpOyAgICAvLyBPSworLy8gICBzaW5rLkFwcGVuZChkYXRhLCAxMDApOyAgLy8gV09PUFMhIE92ZXJmbG93cyBidWZbMTBdLgorLy8KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBVbmNoZWNrZWRBcnJheUJ5dGVTaW5rIDogcHVibGljIEJ5dGVTaW5rIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFVuY2hlY2tlZEFycmF5Qnl0ZVNpbmsoY2hhciogZGVzdCkgOiBkZXN0XyhkZXN0KSB7fQorICB2aXJ0dWFsIHZvaWQgQXBwZW5kKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBuKSBvdmVycmlkZTsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IG91dHB1dCBwb2ludGVyIHNvIHRoYXQgYSBjYWxsZXIgY2FuIHNlZSBob3cgbWFueSBieXRlcworICAvLyB3ZXJlIHByb2R1Y2VkLgorICAvLworICAvLyBOb3RlOiB0aGlzIG1ldGhvZCBpcyBub3QgcGFydCBvZiB0aGUgQnl0ZVNpbmsgaW50ZXJmYWNlLgorICBjaGFyKiBDdXJyZW50RGVzdGluYXRpb24oKSBjb25zdCB7IHJldHVybiBkZXN0XzsgfQorCisgcHJpdmF0ZToKKyAgY2hhciogZGVzdF87CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhVbmNoZWNrZWRBcnJheUJ5dGVTaW5rKTsKK307CisKKy8vIEltcGxlbWVudGF0aW9uIG9mIEJ5dGVTaW5rIHRoYXQgd3JpdGVzIHRvIGEgc2l6ZWQgYnl0ZSBhcnJheS4gVGhpcyBzaW5rIHdpbGwKKy8vIG5vdCB3cml0ZSBtb3JlIHRoYW4gImNhcGFjaXR5IiBieXRlcyB0byBvdXRidWYuIE9uY2UgImNhcGFjaXR5IiBieXRlcyBhcmUKKy8vIGFwcGVuZGVkLCBzdWJzZXF1ZW50IGJ5dGVzIHdpbGwgYmUgaWdub3JlZCBhbmQgT3ZlcmZsb3dlZCgpIHdpbGwgcmV0dXJuIHRydWUuCisvLyBPdmVyZmxvd2VkKCkgZG9lcyBub3QgY2F1c2UgYSBydW50aW1lIGVycm9yIChpLmUuLCBpdCBkb2VzIG5vdCBDSEVDSyBmYWlsKS4KKy8vCisvLyBFeGFtcGxlOgorLy8KKy8vICAgY2hhciBidWZbMTBdOworLy8gICBDaGVja2VkQXJyYXlCeXRlU2luayBzaW5rKGJ1ZiwgMTApOworLy8gICBzaW5rLkFwcGVuZCgiaGkiLCAyKTsgICAgLy8gT0sKKy8vICAgc2luay5BcHBlbmQoZGF0YSwgMTAwKTsgIC8vIFdpbGwgb25seSB3cml0ZSA4IG1vcmUgYnl0ZXMKKy8vCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgQ2hlY2tlZEFycmF5Qnl0ZVNpbmsgOiBwdWJsaWMgQnl0ZVNpbmsgeworIHB1YmxpYzoKKyAgQ2hlY2tlZEFycmF5Qnl0ZVNpbmsoY2hhciogb3V0YnVmLCBzaXplX3QgY2FwYWNpdHkpOworICB2aXJ0dWFsIHZvaWQgQXBwZW5kKGNvbnN0IGNoYXIqIGJ5dGVzLCBzaXplX3Qgbikgb3ZlcnJpZGU7CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gdG8gdGhlIHNpbmsuCisgIHNpemVfdCBOdW1iZXJPZkJ5dGVzV3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIHNpemVfOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIGFueSBieXRlcyB3ZXJlIGRpc2NhcmRlZCwgaS5lLiwgaWYgdGhlcmUgd2FzIGFuCisgIC8vIGF0dGVtcHQgdG8gd3JpdGUgbW9yZSB0aGFuICdjYXBhY2l0eScgYnl0ZXMuCisgIGJvb2wgT3ZlcmZsb3dlZCgpIGNvbnN0IHsgcmV0dXJuIG92ZXJmbG93ZWRfOyB9CisKKyBwcml2YXRlOgorICBjaGFyKiBvdXRidWZfOworICBjb25zdCBzaXplX3QgY2FwYWNpdHlfOworICBzaXplX3Qgc2l6ZV87CisgIGJvb2wgb3ZlcmZsb3dlZF87CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDaGVja2VkQXJyYXlCeXRlU2luayk7Cit9OworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBCeXRlU2luayB0aGF0IGFsbG9jYXRlcyBhbiBpbnRlcm5hbCBidWZmZXIgKGEgY2hhciBhcnJheSkKKy8vIGFuZCBleHBhbmRzIGl0IGFzIG5lZWRlZCB0byBhY2NvbW1vZGF0ZSBhcHBlbmRlZCBkYXRhIChzaW1pbGFyIHRvIGEgc3RyaW5nKSwKKy8vIGFuZCBhbGxvd3MgdGhlIGNhbGxlciB0byB0YWtlIG93bmVyc2hpcCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyIHZpYSB0aGUKKy8vIEdldEJ1ZmZlcigpIG1ldGhvZC4gVGhlIGJ1ZmZlciByZXR1cm5lZCBmcm9tIEdldEJ1ZmZlcigpIG11c3QgYmUgZGVsZXRlZCBieQorLy8gdGhlIGNhbGxlciB3aXRoIGRlbGV0ZVtdLiBHZXRCdWZmZXIoKSBhbHNvIHNldHMgdGhlIGludGVybmFsIGJ1ZmZlciB0byBiZQorLy8gZW1wdHksIGFuZCBzdWJzZXF1ZW50IGFwcGVuZHMgdG8gdGhlIHNpbmsgd2lsbCBjcmVhdGUgYSBuZXcgYnVmZmVyLiBUaGUKKy8vIGRlc3RydWN0b3Igd2lsbCBmcmVlIHRoZSBpbnRlcm5hbCBidWZmZXIgaWYgR2V0QnVmZmVyKCkgd2FzIG5vdCBjYWxsZWQuCisvLworLy8gRXhhbXBsZToKKy8vCisvLyAgIEdyb3dpbmdBcnJheUJ5dGVTaW5rIHNpbmsoMTApOworLy8gICBzaW5rLkFwcGVuZCgiaGkiLCAyKTsKKy8vICAgc2luay5BcHBlbmQoZGF0YSwgbik7CisvLyAgIGNvbnN0IGNoYXIqIGJ1ZiA9IHNpbmsuR2V0QnVmZmVyKCk7ICAvLyBPd25lcnNoaXAgdHJhbnNmZXJyZWQKKy8vICAgZGVsZXRlW10gYnVmOworLy8KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBHcm93aW5nQXJyYXlCeXRlU2luayA6IHB1YmxpYyBzdHJpbmdzOjpCeXRlU2luayB7CisgcHVibGljOgorICBleHBsaWNpdCBHcm93aW5nQXJyYXlCeXRlU2luayhzaXplX3QgZXN0aW1hdGVkX3NpemUpOworICB2aXJ0dWFsIH5Hcm93aW5nQXJyYXlCeXRlU2luaygpOworICB2aXJ0dWFsIHZvaWQgQXBwZW5kKGNvbnN0IGNoYXIqIGJ5dGVzLCBzaXplX3Qgbikgb3ZlcnJpZGU7CisKKyAgLy8gUmV0dXJucyB0aGUgYWxsb2NhdGVkIGJ1ZmZlciwgYW5kIHNldHMgbmJ5dGVzIHRvIGl0cyBzaXplLiBUaGUgY2FsbGVyIHRha2VzCisgIC8vIG93bmVyc2hpcCBvZiB0aGUgYnVmZmVyIGFuZCBtdXN0IGRlbGV0ZSBpdCB3aXRoIGRlbGV0ZVtdLgorICBjaGFyKiBHZXRCdWZmZXIoc2l6ZV90KiBuYnl0ZXMpOworCisgcHJpdmF0ZToKKyAgdm9pZCBFeHBhbmQoc2l6ZV90IGFtb3VudCk7CisgIHZvaWQgU2hyaW5rVG9GaXQoKTsKKworICBzaXplX3QgY2FwYWNpdHlfOworICBjaGFyKiBidWZfOworICBzaXplX3Qgc2l6ZV87CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHcm93aW5nQXJyYXlCeXRlU2luayk7Cit9OworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBCeXRlU2luayB0aGF0IGFwcGVuZHMgdG8gdGhlIGdpdmVuIHN0cmluZy4KKy8vIEV4aXN0aW5nIGNvbnRlbnRzIG9mICJkZXN0IiBhcmUgbm90IG1vZGlmaWVkOyBuZXcgZGF0YSBpcyBhcHBlbmRlZC4KKy8vCisvLyBFeGFtcGxlOgorLy8KKy8vICAgc3RyaW5nIGRlc3QgPSAiSGVsbG8gIjsKKy8vICAgU3RyaW5nQnl0ZVNpbmsgc2luaygmZGVzdCk7CisvLyAgIHNpbmsuQXBwZW5kKCJXb3JsZCIsIDUpOworLy8gICBhc3NlcnQoZGVzdCA9PSAiSGVsbG8gV29ybGQiKTsKKy8vCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgU3RyaW5nQnl0ZVNpbmsgOiBwdWJsaWMgQnl0ZVNpbmsgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgU3RyaW5nQnl0ZVNpbmsoc3RkOjpzdHJpbmcqIGRlc3QpIDogZGVzdF8oZGVzdCkge30KKyAgdmlydHVhbCB2b2lkIEFwcGVuZChjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgbikgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyogZGVzdF87CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJpbmdCeXRlU2luayk7Cit9OworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBCeXRlU2luayB0aGF0IGRpc2NhcmRzIGFsbCBkYXRhLgorLy8KKy8vIEV4YW1wbGU6CisvLworLy8gICBOdWxsQnl0ZVNpbmsgc2luazsKKy8vICAgc2luay5BcHBlbmQoZGF0YSwgZGF0YS5zaXplKCkpOyAgLy8gQWxsIGRhdGEgaWdub3JlZC4KKy8vCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTnVsbEJ5dGVTaW5rIDogcHVibGljIEJ5dGVTaW5rIHsKKyBwdWJsaWM6CisgIE51bGxCeXRlU2luaygpIHt9CisgIHZvaWQgQXBwZW5kKGNvbnN0IGNoYXIqIC8qZGF0YSovLCBzaXplX3QgLypuKi8pIG92ZXJyaWRlIHt9CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVsbEJ5dGVTaW5rKTsKK307CisKKy8vCisvLyBTb21lIGNvbW1vbmx5IHVzZWQgaW1wbGVtZW50YXRpb25zIG9mIEJ5dGVTb3VyY2UKKy8vCisKKy8vIEltcGxlbWVudGF0aW9uIG9mIEJ5dGVTb3VyY2UgdGhhdCByZWFkcyBmcm9tIGEgU3RyaW5nUGllY2UuCisvLworLy8gRXhhbXBsZToKKy8vCisvLyAgIHN0cmluZyBkYXRhID0gIkhlbGxvIjsKKy8vICAgQXJyYXlCeXRlU291cmNlIHNvdXJjZShkYXRhKTsKKy8vICAgYXNzZXJ0KHNvdXJjZS5BdmFpbGFibGUoKSA9PSA1KTsKKy8vICAgYXNzZXJ0KHNvdXJjZS5QZWVrKCkgPT0gIkhlbGxvIik7CisvLworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEFycmF5Qnl0ZVNvdXJjZSA6IHB1YmxpYyBCeXRlU291cmNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEFycmF5Qnl0ZVNvdXJjZShTdHJpbmdQaWVjZSBzKSA6IGlucHV0XyhzKSB7fQorCisgIHZpcnR1YWwgc2l6ZV90IEF2YWlsYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIFN0cmluZ1BpZWNlIFBlZWsoKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFNraXAoc2l6ZV90IG4pIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgU3RyaW5nUGllY2UgICBpbnB1dF87CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBcnJheUJ5dGVTb3VyY2UpOworfTsKKworLy8gSW1wbGVtZW50YXRpb24gb2YgQnl0ZVNvdXJjZSB0aGF0IHdyYXBzIGFub3RoZXIgQnl0ZVNvdXJjZSwgbGltaXRpbmcgdGhlCisvLyBudW1iZXIgb2YgYnl0ZXMgcmV0dXJuZWQuCisvLworLy8gVGhlIGNhbGxlciBtYWludGFpbnMgb3duZXJzaGlwIG9mIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSwgYW5kIG1heSBub3QgdXNlIHRoZQorLy8gdW5kZXJseWluZyBzb3VyY2Ugd2hpbGUgdXNpbmcgdGhlIExpbWl0Qnl0ZVNvdXJjZSBvYmplY3QuICBUaGUgdW5kZXJseWluZworLy8gc291cmNlJ3MgcG9pbnRlciBpcyBhZHZhbmNlZCBieSBuIGJ5dGVzIGV2ZXJ5IHRpbWUgdGhpcyBMaW1pdEJ5dGVTb3VyY2UKKy8vIG9iamVjdCBpcyBhZHZhbmNlZCBieSBuLgorLy8KKy8vIEV4YW1wbGU6CisvLworLy8gICBzdHJpbmcgZGF0YSA9ICJIZWxsbyBXb3JsZCI7CisvLyAgIEFycmF5Qnl0ZVNvdXJjZSBhYnMoZGF0YSk7CisvLyAgIGFzc2VydChhYnMuQXZhaWxhYmxlKCkgPT0gZGF0YS5zaXplKCkpOworLy8KKy8vICAgTGltaXRCeXRlU291cmNlIGxpbWl0KGFicywgNSk7CisvLyAgIGFzc2VydChsaW1pdC5BdmFpbGFibGUoKSA9PSA1KTsKKy8vICAgYXNzZXJ0KGxpbWl0LlBlZWsoKSA9PSAiSGVsbG8iKTsKKy8vCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTGltaXRCeXRlU291cmNlIDogcHVibGljIEJ5dGVTb3VyY2UgeworIHB1YmxpYzoKKyAgLy8gUmV0dXJucyBhdCBtb3N0ICJsaW1pdCIgYnl0ZXMgZnJvbSAic291cmNlIi4KKyAgTGltaXRCeXRlU291cmNlKEJ5dGVTb3VyY2UqIHNvdXJjZSwgc2l6ZV90IGxpbWl0KTsKKworICB2aXJ0dWFsIHNpemVfdCBBdmFpbGFibGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBTdHJpbmdQaWVjZSBQZWVrKCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBTa2lwKHNpemVfdCBuKSBvdmVycmlkZTsKKworICAvLyBXZSBvdmVycmlkZSBDb3B5VG8gc28gdGhhdCB3ZSBjYW4gZm9yd2FyZCB0byB0aGUgdW5kZXJseWluZyBzb3VyY2UsIGluCisgIC8vIGNhc2UgaXQgaGFzIGFuIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBDb3B5VG8uCisgIHZpcnR1YWwgdm9pZCBDb3B5VG8oQnl0ZVNpbmsqIHNpbmssIHNpemVfdCBuKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIEJ5dGVTb3VyY2UqIHNvdXJjZV87CisgIHNpemVfdCBsaW1pdF87Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc3RyaW5ncworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX0JZVEVTVFJFQU1fSF8KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbV91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjExODI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTQ2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2Ugc3RyaW5ncyB7CituYW1lc3BhY2UgeworCisvLyBXZSB1c2UgdGhpcyBjbGFzcyBpbnN0ZWFkIG9mIEFycmF5Qnl0ZVNvdXJjZSB0byBzaW11bGF0ZSBhIEJ5dGVTb3VyY2UgdGhhdAorLy8gY29udGFpbnMgbXVsdGlwbGUgZnJhZ21lbnRzLiAgQXJyYXlCeXRlU291cmNlIHJldHVybnMgdGhlIGVudGlyZSBhcnJheSBpbgorLy8gb25lIGZyYWdtZW50LgorY2xhc3MgTW9ja0J5dGVTb3VyY2UgOiBwdWJsaWMgQnl0ZVNvdXJjZSB7CisgcHVibGljOgorICBNb2NrQnl0ZVNvdXJjZShTdHJpbmdQaWVjZSBkYXRhLCBpbnQgYmxvY2tfc2l6ZSkKKyAgICA6IGRhdGFfKGRhdGEpLCBibG9ja19zaXplXyhibG9ja19zaXplKSB7fQorCisgIHNpemVfdCBBdmFpbGFibGUoKSBjb25zdCB7IHJldHVybiBkYXRhXy5zaXplKCk7IH0KKyAgU3RyaW5nUGllY2UgUGVlaygpIHsKKyAgICByZXR1cm4gZGF0YV8uc3Vic3RyKDAsIGJsb2NrX3NpemVfKTsKKyAgfQorICB2b2lkIFNraXAoc2l6ZV90IG4pIHsgZGF0YV8ucmVtb3ZlX3ByZWZpeChuKTsgfQorCisgcHJpdmF0ZToKKyAgU3RyaW5nUGllY2UgZGF0YV87CisgIGludCBibG9ja19zaXplXzsKK307CisKK1RFU1QoQnl0ZVNvdXJjZVRlc3QsIENvcHlUbykgeworICBTdHJpbmdQaWVjZSBkYXRhKCJIZWxsbyB3b3JsZCEiKTsKKyAgTW9ja0J5dGVTb3VyY2Ugc291cmNlKGRhdGEsIDMpOworICBzdGQ6OnN0cmluZyBzdHI7CisgIFN0cmluZ0J5dGVTaW5rIHNpbmsoJnN0cik7CisKKyAgc291cmNlLkNvcHlUbygmc2luaywgZGF0YS5zaXplKCkpOworICBFWFBFQ1RfRVEoZGF0YSwgc3RyKTsKK30KKworVEVTVChCeXRlU291cmNlVGVzdCwgQ29weVN1YnN0cmluZ1RvKSB7CisgIFN0cmluZ1BpZWNlIGRhdGEoIkhlbGxvIHdvcmxkISIpOworICBNb2NrQnl0ZVNvdXJjZSBzb3VyY2UoZGF0YSwgMyk7CisgIHNvdXJjZS5Ta2lwKDEpOworICBzdGQ6OnN0cmluZyBzdHI7CisgIFN0cmluZ0J5dGVTaW5rIHNpbmsoJnN0cik7CisKKyAgc291cmNlLkNvcHlUbygmc2luaywgZGF0YS5zaXplKCkgLSAyKTsKKyAgRVhQRUNUX0VRKGRhdGEuc3Vic3RyKDEsIGRhdGEuc2l6ZSgpIC0gMiksIHN0cik7CisgIEVYUEVDVF9FUSgiISIsIHNvdXJjZS5QZWVrKCkpOworfQorCitURVNUKEJ5dGVTb3VyY2VUZXN0LCBMaW1pdEJ5dGVTb3VyY2UpIHsKKyAgU3RyaW5nUGllY2UgZGF0YSgiSGVsbG8gd29ybGQhIik7CisgIE1vY2tCeXRlU291cmNlIHNvdXJjZShkYXRhLCAzKTsKKyAgTGltaXRCeXRlU291cmNlIGxpbWl0X3NvdXJjZSgmc291cmNlLCA2KTsKKyAgRVhQRUNUX0VRKDYsIGxpbWl0X3NvdXJjZS5BdmFpbGFibGUoKSk7CisgIGxpbWl0X3NvdXJjZS5Ta2lwKDEpOworICBFWFBFQ1RfRVEoNSwgbGltaXRfc291cmNlLkF2YWlsYWJsZSgpKTsKKworICB7CisgICAgc3RkOjpzdHJpbmcgc3RyOworICAgIFN0cmluZ0J5dGVTaW5rIHNpbmsoJnN0cik7CisgICAgbGltaXRfc291cmNlLkNvcHlUbygmc2luaywgbGltaXRfc291cmNlLkF2YWlsYWJsZSgpKTsKKyAgICBFWFBFQ1RfRVEoImVsbG8gIiwgc3RyKTsKKyAgICBFWFBFQ1RfRVEoMCwgbGltaXRfc291cmNlLkF2YWlsYWJsZSgpKTsKKyAgICBFWFBFQ1RfRVEoNiwgc291cmNlLkF2YWlsYWJsZSgpKTsKKyAgfQorCisgIHsKKyAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgU3RyaW5nQnl0ZVNpbmsgc2luaygmc3RyKTsKKyAgICBzb3VyY2UuQ29weVRvKCZzaW5rLCBzb3VyY2UuQXZhaWxhYmxlKCkpOworICAgIEVYUEVDVF9FUSgid29ybGQhIiwgc3RyKTsKKyAgICBFWFBFQ1RfRVEoMCwgc291cmNlLkF2YWlsYWJsZSgpKTsKKyAgfQorfQorCitURVNUKEJ5dGVTb3VyY2VUZXN0LCBDb3B5VG9TdHJpbmdCeXRlU2luaykgeworICBTdHJpbmdQaWVjZSBkYXRhKCJIZWxsbyB3b3JsZCEiKTsKKyAgTW9ja0J5dGVTb3VyY2Ugc291cmNlKGRhdGEsIDMpOworICBzdGQ6OnN0cmluZyBzdHI7CisgIFN0cmluZ0J5dGVTaW5rIHNpbmsoJnN0cik7CisgIHNvdXJjZS5Db3B5VG8oJnNpbmssIGRhdGEuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKGRhdGEsIHN0cik7Cit9CisKKy8vIFZlcmlmeSB0aGF0IEJ5dGVTaW5rIGlzIHN1YmNsYXNzYWJsZSBhbmQgRmx1c2goKSBvdmVycmlkYWJsZS4KK2NsYXNzIEZsdXNoaW5nQnl0ZVNpbmsgOiBwdWJsaWMgU3RyaW5nQnl0ZVNpbmsgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRmx1c2hpbmdCeXRlU2luayhzdGQ6OnN0cmluZyogZGVzdCkgOiBTdHJpbmdCeXRlU2luayhkZXN0KSB7fQorICB2aXJ0dWFsIHZvaWQgRmx1c2goKSB7IEFwcGVuZCgieiIsIDEpOyB9CisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZsdXNoaW5nQnl0ZVNpbmspOworfTsKKworLy8gV3JpdGUgYW5kIEZsdXNoIHZpYSB0aGUgQnl0ZVNpbmsgc3VwZXJjbGFzcyBpbnRlcmZhY2UuCit2b2lkIFdyaXRlQW5kRmx1c2goQnl0ZVNpbmsqIHMpIHsKKyAgcy0+QXBwZW5kKCJhYmMiLCAzKTsKKyAgcy0+Rmx1c2goKTsKK30KKworVEVTVChCeXRlU2lua1Rlc3QsIEZsdXNoKSB7CisgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgRmx1c2hpbmdCeXRlU2luayBmX3NpbmsoJnN0cik7CisgIFdyaXRlQW5kRmx1c2goJmZfc2luayk7CisgIEVYUEVDVF9TVFJFUSgiYWJjeiIsIHN0ci5jX3N0cigpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2Ugc3RyaW5ncworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NhbGxiYWNrLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NhbGxiYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkNTQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaApAQCAtMCwwICsxLDU4MyBAQAorI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfQ0FMTEJBQ0tfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX0NBTExCQUNLX0hfCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYWNyb3MuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGVtdWxhdGVzIGdvb2dsZTMvYmFzZS9jYWxsYmFjay5oCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhIGNhbGxiYWNrLiAgV2hlbiBjYWxsaW5nIGFuIFJQQywgeW91IG11c3QgcHJvdmlkZQorLy8gYSBDbG9zdXJlIHRvIGNhbGwgd2hlbiB0aGUgcHJvY2VkdXJlIGNvbXBsZXRlcy4gIFNlZSB0aGUgU2VydmljZSBpbnRlcmZhY2UKKy8vIGluIHNlcnZpY2UuaC4KKy8vCisvLyBUbyBhdXRvbWF0aWNhbGx5IGNvbnN0cnVjdCBhIENsb3N1cmUgd2hpY2ggY2FsbHMgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIG9yCisvLyBtZXRob2Qgd2l0aCBhIHBhcnRpY3VsYXIgc2V0IG9mIHBhcmFtZXRlcnMsIHVzZSB0aGUgTmV3Q2FsbGJhY2soKSBmdW5jdGlvbi4KKy8vIEV4YW1wbGU6CisvLyAgIHZvaWQgRm9vRG9uZShjb25zdCBGb29SZXNwb25zZSogcmVzcG9uc2UpIHsKKy8vICAgICAuLi4KKy8vICAgfQorLy8KKy8vICAgdm9pZCBDYWxsRm9vKCkgeworLy8gICAgIC4uLgorLy8gICAgIC8vIFdoZW4gZG9uZSwgY2FsbCBGb29Eb25lKCkgYW5kIHBhc3MgaXQgYSBwb2ludGVyIHRvIHRoZSByZXNwb25zZS4KKy8vICAgICBDbG9zdXJlKiBjYWxsYmFjayA9IE5ld0NhbGxiYWNrKCZGb29Eb25lLCByZXNwb25zZSk7CisvLyAgICAgLy8gTWFrZSB0aGUgY2FsbC4KKy8vICAgICBzZXJ2aWNlLT5Gb28oY29udHJvbGxlciwgcmVxdWVzdCwgcmVzcG9uc2UsIGNhbGxiYWNrKTsKKy8vICAgfQorLy8KKy8vIEV4YW1wbGUgdGhhdCBjYWxscyBhIG1ldGhvZDoKKy8vICAgY2xhc3MgSGFuZGxlciB7CisvLyAgICBwdWJsaWM6CisvLyAgICAgLi4uCisvLworLy8gICAgIHZvaWQgRm9vRG9uZShjb25zdCBGb29SZXNwb25zZSogcmVzcG9uc2UpIHsKKy8vICAgICAgIC4uLgorLy8gICAgIH0KKy8vCisvLyAgICAgdm9pZCBDYWxsRm9vKCkgeworLy8gICAgICAgLi4uCisvLyAgICAgICAvLyBXaGVuIGRvbmUsIGNhbGwgRm9vRG9uZSgpIGFuZCBwYXNzIGl0IGEgcG9pbnRlciB0byB0aGUgcmVzcG9uc2UuCisvLyAgICAgICBDbG9zdXJlKiBjYWxsYmFjayA9IE5ld0NhbGxiYWNrKHRoaXMsICZIYW5kbGVyOjpGb29Eb25lLCByZXNwb25zZSk7CisvLyAgICAgICAvLyBNYWtlIHRoZSBjYWxsLgorLy8gICAgICAgc2VydmljZS0+Rm9vKGNvbnRyb2xsZXIsIHJlcXVlc3QsIHJlc3BvbnNlLCBjYWxsYmFjayk7CisvLyAgICAgfQorLy8gICB9OworLy8KKy8vIEN1cnJlbnRseSBOZXdDYWxsYmFjaygpIHN1cHBvcnRzIGJpbmRpbmcgemVybywgb25lLCBvciB0d28gYXJndW1lbnRzLgorLy8KKy8vIENhbGxiYWNrcyBjcmVhdGVkIHdpdGggTmV3Q2FsbGJhY2soKSBhdXRvbWF0aWNhbGx5IGRlbGV0ZSB0aGVtc2VsdmVzIHdoZW4KKy8vIGV4ZWN1dGVkLiAgVGhleSBzaG91bGQgYmUgdXNlZCB3aGVuIGEgY2FsbGJhY2sgaXMgdG8gYmUgY2FsbGVkIGV4YWN0bHkKKy8vIG9uY2UgKHVzdWFsbHkgdGhlIGNhc2Ugd2l0aCBSUEMgY2FsbGJhY2tzKS4gIElmIGEgY2FsbGJhY2sgbWF5IGJlIGNhbGxlZAorLy8gYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHRpbWVzIChpbmNsdWRpbmcgemVybyksIGNyZWF0ZSBpdCB3aXRoCisvLyBOZXdQZXJtYW5lbnRDYWxsYmFjaygpIGluc3RlYWQuICBZb3UgYXJlIHRoZW4gcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZQorLy8gY2FsbGJhY2sgKHVzaW5nIHRoZSAiZGVsZXRlIiBrZXl3b3JkIGFzIG5vcm1hbCkuCisvLworLy8gTm90ZSB0aGF0IE5ld0NhbGxiYWNrKCkgaXMgYSBiaXQgdG91Y2h5IHJlZ2FyZGluZyBhcmd1bWVudCB0eXBlcy4gIEdlbmVyYWxseSwKKy8vIHRoZSB2YWx1ZXMgeW91IHByb3ZpZGUgZm9yIHRoZSBwYXJhbWV0ZXIgYmluZGluZ3MgbXVzdCBleGFjdGx5IG1hdGNoIHRoZQorLy8gdHlwZXMgYWNjZXB0ZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6CisvLyAgIHZvaWQgRm9vKHN0ZDo6c3RyaW5nIHMpOworLy8gICBOZXdDYWxsYmFjaygmRm9vLCAiZm9vIik7ICAgICAgICAgIC8vIFdPTidUIFdPUks6ICBjb25zdCBjaGFyKiAhPSBzdHJpbmcKKy8vICAgTmV3Q2FsbGJhY2soJkZvbywgc3RkOjpzdHJpbmcoImZvbyIpKTsgIC8vIFdPUktTCisvLyBBbHNvIG5vdGUgdGhhdCB0aGUgYXJndW1lbnRzIGNhbm5vdCBiZSByZWZlcmVuY2VzOgorLy8gICB2b2lkIEZvbyhjb25zdCBzdGQ6OnN0cmluZyYgcyk7CisvLyAgIHN0ZDo6c3RyaW5nIG15X3N0cjsKKy8vICAgTmV3Q2FsbGJhY2soJkZvbywgbXlfc3RyKTsgIC8vIFdPTidUIFdPUks6ICBDYW4ndCB1c2UgcmVmZXJlbmNlcy4KKy8vIEhvd2V2ZXIsIGNvcnJlY3RseS10eXBlZCBwb2ludGVycyB3aWxsIHdvcmsganVzdCBmaW5lLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIENsb3N1cmUgeworIHB1YmxpYzoKKyAgQ2xvc3VyZSgpIHt9CisgIHZpcnR1YWwgfkNsb3N1cmUoKTsKKworICB2aXJ0dWFsIHZvaWQgUnVuKCkgPSAwOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENsb3N1cmUpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUj4KK2NsYXNzIFJlc3VsdENhbGxiYWNrIHsKKyBwdWJsaWM6CisgIFJlc3VsdENhbGxiYWNrKCkge30KKyAgdmlydHVhbCB+UmVzdWx0Q2FsbGJhY2soKSB7fQorCisgIHZpcnR1YWwgUiBSdW4oKSA9IDA7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVzdWx0Q2FsbGJhY2spOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExPgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFJlc3VsdENhbGxiYWNrMSB7CisgcHVibGljOgorICBSZXN1bHRDYWxsYmFjazEoKSB7fQorICB2aXJ0dWFsIH5SZXN1bHRDYWxsYmFjazEoKSB7fQorCisgIHZpcnR1YWwgUiBSdW4oQTEpID0gMDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXN1bHRDYWxsYmFjazEpOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBSZXN1bHRDYWxsYmFjazIgeworIHB1YmxpYzoKKyAgUmVzdWx0Q2FsbGJhY2syKCkge30KKyAgdmlydHVhbCB+UmVzdWx0Q2FsbGJhY2syKCkge30KKworICB2aXJ0dWFsIFIgUnVuKEExLEEyKSA9IDA7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVzdWx0Q2FsbGJhY2syKTsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBGdW5jdGlvbkNsb3N1cmUwIDogcHVibGljIENsb3N1cmUgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB2b2lkICgqRnVuY3Rpb25UeXBlKSgpOworCisgIEZ1bmN0aW9uQ2xvc3VyZTAoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcpCisgICAgOiBmdW5jdGlvbl8oZnVuY3Rpb24pLCBzZWxmX2RlbGV0aW5nXyhzZWxmX2RlbGV0aW5nKSB7fQorICB+RnVuY3Rpb25DbG9zdXJlMCgpOworCisgIHZvaWQgUnVuKCkgb3ZlcnJpZGUgeworICAgIGJvb2wgbmVlZHNfZGVsZXRlID0gc2VsZl9kZWxldGluZ187ICAvLyByZWFkIGluIGNhc2UgY2FsbGJhY2sgZGVsZXRlcworICAgIGZ1bmN0aW9uXygpOworICAgIGlmIChuZWVkc19kZWxldGUpIGRlbGV0ZSB0aGlzOworICB9CisKKyBwcml2YXRlOgorICBGdW5jdGlvblR5cGUgZnVuY3Rpb25fOworICBib29sIHNlbGZfZGVsZXRpbmdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzPgorY2xhc3MgTWV0aG9kQ2xvc3VyZTAgOiBwdWJsaWMgQ2xvc3VyZSB7CisgcHVibGljOgorICB0eXBlZGVmIHZvaWQgKENsYXNzOjoqTWV0aG9kVHlwZSkoKTsKKworICBNZXRob2RDbG9zdXJlMChDbGFzcyogb2JqZWN0LCBNZXRob2RUeXBlIG1ldGhvZCwgYm9vbCBzZWxmX2RlbGV0aW5nKQorICAgIDogb2JqZWN0XyhvYmplY3QpLCBtZXRob2RfKG1ldGhvZCksIHNlbGZfZGVsZXRpbmdfKHNlbGZfZGVsZXRpbmcpIHt9CisgIH5NZXRob2RDbG9zdXJlMCgpIHt9CisKKyAgdm9pZCBSdW4oKSBvdmVycmlkZSB7CisgICAgYm9vbCBuZWVkc19kZWxldGUgPSBzZWxmX2RlbGV0aW5nXzsgIC8vIHJlYWQgaW4gY2FzZSBjYWxsYmFjayBkZWxldGVzCisgICAgKG9iamVjdF8tPiptZXRob2RfKSgpOworICAgIGlmIChuZWVkc19kZWxldGUpIGRlbGV0ZSB0aGlzOworICB9CisKKyBwcml2YXRlOgorICBDbGFzcyogb2JqZWN0XzsKKyAgTWV0aG9kVHlwZSBtZXRob2RfOworICBib29sIHNlbGZfZGVsZXRpbmdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEFyZzE+CitjbGFzcyBGdW5jdGlvbkNsb3N1cmUxIDogcHVibGljIENsb3N1cmUgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB2b2lkICgqRnVuY3Rpb25UeXBlKShBcmcxIGFyZzEpOworCisgIEZ1bmN0aW9uQ2xvc3VyZTEoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcsCisgICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxKQorICAgIDogZnVuY3Rpb25fKGZ1bmN0aW9uKSwgc2VsZl9kZWxldGluZ18oc2VsZl9kZWxldGluZyksCisgICAgICBhcmcxXyhhcmcxKSB7fQorICB+RnVuY3Rpb25DbG9zdXJlMSgpIHt9CisKKyAgdm9pZCBSdW4oKSBvdmVycmlkZSB7CisgICAgYm9vbCBuZWVkc19kZWxldGUgPSBzZWxmX2RlbGV0aW5nXzsgIC8vIHJlYWQgaW4gY2FzZSBjYWxsYmFjayBkZWxldGVzCisgICAgZnVuY3Rpb25fKGFyZzFfKTsKKyAgICBpZiAobmVlZHNfZGVsZXRlKSBkZWxldGUgdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uXzsKKyAgYm9vbCBzZWxmX2RlbGV0aW5nXzsKKyAgQXJnMSBhcmcxXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgQXJnMT4KK2NsYXNzIE1ldGhvZENsb3N1cmUxIDogcHVibGljIENsb3N1cmUgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB2b2lkIChDbGFzczo6Kk1ldGhvZFR5cGUpKEFyZzEgYXJnMSk7CisKKyAgTWV0aG9kQ2xvc3VyZTEoQ2xhc3MqIG9iamVjdCwgTWV0aG9kVHlwZSBtZXRob2QsIGJvb2wgc2VsZl9kZWxldGluZywKKyAgICAgICAgICAgICAgICAgQXJnMSBhcmcxKQorICAgIDogb2JqZWN0XyhvYmplY3QpLCBtZXRob2RfKG1ldGhvZCksIHNlbGZfZGVsZXRpbmdfKHNlbGZfZGVsZXRpbmcpLAorICAgICAgYXJnMV8oYXJnMSkge30KKyAgfk1ldGhvZENsb3N1cmUxKCkge30KKworICB2b2lkIFJ1bigpIG92ZXJyaWRlIHsKKyAgICBib29sIG5lZWRzX2RlbGV0ZSA9IHNlbGZfZGVsZXRpbmdfOyAgLy8gcmVhZCBpbiBjYXNlIGNhbGxiYWNrIGRlbGV0ZXMKKyAgICAob2JqZWN0Xy0+Km1ldGhvZF8pKGFyZzFfKTsKKyAgICBpZiAobmVlZHNfZGVsZXRlKSBkZWxldGUgdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgQ2xhc3MqIG9iamVjdF87CisgIE1ldGhvZFR5cGUgbWV0aG9kXzsKKyAgYm9vbCBzZWxmX2RlbGV0aW5nXzsKKyAgQXJnMSBhcmcxXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPgorY2xhc3MgRnVuY3Rpb25DbG9zdXJlMiA6IHB1YmxpYyBDbG9zdXJlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdm9pZCAoKkZ1bmN0aW9uVHlwZSkoQXJnMSBhcmcxLCBBcmcyIGFyZzIpOworCisgIEZ1bmN0aW9uQ2xvc3VyZTIoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcsCisgICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxLCBBcmcyIGFyZzIpCisgICAgOiBmdW5jdGlvbl8oZnVuY3Rpb24pLCBzZWxmX2RlbGV0aW5nXyhzZWxmX2RlbGV0aW5nKSwKKyAgICAgIGFyZzFfKGFyZzEpLCBhcmcyXyhhcmcyKSB7fQorICB+RnVuY3Rpb25DbG9zdXJlMigpIHt9CisKKyAgdm9pZCBSdW4oKSBvdmVycmlkZSB7CisgICAgYm9vbCBuZWVkc19kZWxldGUgPSBzZWxmX2RlbGV0aW5nXzsgIC8vIHJlYWQgaW4gY2FzZSBjYWxsYmFjayBkZWxldGVzCisgICAgZnVuY3Rpb25fKGFyZzFfLCBhcmcyXyk7CisgICAgaWYgKG5lZWRzX2RlbGV0ZSkgZGVsZXRlIHRoaXM7CisgIH0KKworIHByaXZhdGU6CisgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvbl87CisgIGJvb2wgc2VsZl9kZWxldGluZ187CisgIEFyZzEgYXJnMV87CisgIEFyZzIgYXJnMl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+CitjbGFzcyBNZXRob2RDbG9zdXJlMiA6IHB1YmxpYyBDbG9zdXJlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdm9pZCAoQ2xhc3M6OipNZXRob2RUeXBlKShBcmcxIGFyZzEsIEFyZzIgYXJnMik7CisKKyAgTWV0aG9kQ2xvc3VyZTIoQ2xhc3MqIG9iamVjdCwgTWV0aG9kVHlwZSBtZXRob2QsIGJvb2wgc2VsZl9kZWxldGluZywKKyAgICAgICAgICAgICAgICAgQXJnMSBhcmcxLCBBcmcyIGFyZzIpCisgICAgOiBvYmplY3RfKG9iamVjdCksIG1ldGhvZF8obWV0aG9kKSwgc2VsZl9kZWxldGluZ18oc2VsZl9kZWxldGluZyksCisgICAgICBhcmcxXyhhcmcxKSwgYXJnMl8oYXJnMikge30KKyAgfk1ldGhvZENsb3N1cmUyKCkge30KKworICB2b2lkIFJ1bigpIG92ZXJyaWRlIHsKKyAgICBib29sIG5lZWRzX2RlbGV0ZSA9IHNlbGZfZGVsZXRpbmdfOyAgLy8gcmVhZCBpbiBjYXNlIGNhbGxiYWNrIGRlbGV0ZXMKKyAgICAob2JqZWN0Xy0+Km1ldGhvZF8pKGFyZzFfLCBhcmcyXyk7CisgICAgaWYgKG5lZWRzX2RlbGV0ZSkgZGVsZXRlIHRoaXM7CisgIH0KKworIHByaXZhdGU6CisgIENsYXNzKiBvYmplY3RfOworICBNZXRob2RUeXBlIG1ldGhvZF87CisgIGJvb2wgc2VsZl9kZWxldGluZ187CisgIEFyZzEgYXJnMV87CisgIEFyZzIgYXJnMl87Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSPgorY2xhc3MgRnVuY3Rpb25SZXN1bHRDYWxsYmFja18wXzAgOiBwdWJsaWMgUmVzdWx0Q2FsbGJhY2s8Uj4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBSICgqRnVuY3Rpb25UeXBlKSgpOworCisgIEZ1bmN0aW9uUmVzdWx0Q2FsbGJhY2tfMF8wKEZ1bmN0aW9uVHlwZSBmdW5jdGlvbiwgYm9vbCBzZWxmX2RlbGV0aW5nKQorICAgICAgOiBmdW5jdGlvbl8oZnVuY3Rpb24pLCBzZWxmX2RlbGV0aW5nXyhzZWxmX2RlbGV0aW5nKSB7fQorICB+RnVuY3Rpb25SZXN1bHRDYWxsYmFja18wXzAoKSB7fQorCisgIFIgUnVuKCkgb3ZlcnJpZGUgeworICAgIGJvb2wgbmVlZHNfZGVsZXRlID0gc2VsZl9kZWxldGluZ187ICAvLyByZWFkIGluIGNhc2UgY2FsbGJhY2sgZGVsZXRlcworICAgIFIgcmVzdWx0ID0gZnVuY3Rpb25fKCk7CisgICAgaWYgKG5lZWRzX2RlbGV0ZSkgZGVsZXRlIHRoaXM7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgcHJpdmF0ZToKKyAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uXzsKKyAgYm9vbCBzZWxmX2RlbGV0aW5nXzsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFAxPgorY2xhc3MgRnVuY3Rpb25SZXN1bHRDYWxsYmFja18xXzAgOiBwdWJsaWMgUmVzdWx0Q2FsbGJhY2s8Uj4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBSICgqRnVuY3Rpb25UeXBlKShQMSk7CisKKyAgRnVuY3Rpb25SZXN1bHRDYWxsYmFja18xXzAoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAxIHAxKQorICAgICAgOiBmdW5jdGlvbl8oZnVuY3Rpb24pLCBzZWxmX2RlbGV0aW5nXyhzZWxmX2RlbGV0aW5nKSwgcDFfKHAxKSB7fQorICB+RnVuY3Rpb25SZXN1bHRDYWxsYmFja18xXzAoKSB7fQorCisgIFIgUnVuKCkgb3ZlcnJpZGUgeworICAgIGJvb2wgbmVlZHNfZGVsZXRlID0gc2VsZl9kZWxldGluZ187ICAvLyByZWFkIGluIGNhc2UgY2FsbGJhY2sgZGVsZXRlcworICAgIFIgcmVzdWx0ID0gZnVuY3Rpb25fKHAxXyk7CisgICAgaWYgKG5lZWRzX2RlbGV0ZSkgZGVsZXRlIHRoaXM7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgcHJpdmF0ZToKKyAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uXzsKKyAgYm9vbCBzZWxmX2RlbGV0aW5nXzsKKyAgUDEgcDFfOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQXJnMT4KK2NsYXNzIEZ1bmN0aW9uUmVzdWx0Q2FsbGJhY2tfMF8xIDogcHVibGljIFJlc3VsdENhbGxiYWNrMTxSLCBBcmcxPiB7CisgcHVibGljOgorICB0eXBlZGVmIFIgKCpGdW5jdGlvblR5cGUpKEFyZzEgYXJnMSk7CisKKyAgRnVuY3Rpb25SZXN1bHRDYWxsYmFja18wXzEoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcpCisgICAgICA6IGZ1bmN0aW9uXyhmdW5jdGlvbiksIHNlbGZfZGVsZXRpbmdfKHNlbGZfZGVsZXRpbmcpIHt9CisgIH5GdW5jdGlvblJlc3VsdENhbGxiYWNrXzBfMSgpIHt9CisKKyAgUiBSdW4oQXJnMSBhMSkgb3ZlcnJpZGUgeworICAgIGJvb2wgbmVlZHNfZGVsZXRlID0gc2VsZl9kZWxldGluZ187ICAvLyByZWFkIGluIGNhc2UgY2FsbGJhY2sgZGVsZXRlcworICAgIFIgcmVzdWx0ID0gZnVuY3Rpb25fKGExKTsKKyAgICBpZiAobmVlZHNfZGVsZXRlKSBkZWxldGUgdGhpczsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyBwcml2YXRlOgorICBGdW5jdGlvblR5cGUgZnVuY3Rpb25fOworICBib29sIHNlbGZfZGVsZXRpbmdfOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgUDEsIHR5cGVuYW1lIEExPgorY2xhc3MgRnVuY3Rpb25SZXN1bHRDYWxsYmFja18xXzEgOiBwdWJsaWMgUmVzdWx0Q2FsbGJhY2sxPFIsIEExPiB7CisgcHVibGljOgorICB0eXBlZGVmIFIgKCpGdW5jdGlvblR5cGUpKFAxLCBBMSk7CisKKyAgRnVuY3Rpb25SZXN1bHRDYWxsYmFja18xXzEoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAxIHAxKQorICAgICAgOiBmdW5jdGlvbl8oZnVuY3Rpb24pLCBzZWxmX2RlbGV0aW5nXyhzZWxmX2RlbGV0aW5nKSwgcDFfKHAxKSB7fQorICB+RnVuY3Rpb25SZXN1bHRDYWxsYmFja18xXzEoKSB7fQorCisgIFIgUnVuKEExIGExKSBvdmVycmlkZSB7CisgICAgYm9vbCBuZWVkc19kZWxldGUgPSBzZWxmX2RlbGV0aW5nXzsgIC8vIHJlYWQgaW4gY2FzZSBjYWxsYmFjayBkZWxldGVzCisgICAgUiByZXN1bHQgPSBmdW5jdGlvbl8ocDFfLCBhMSk7CisgICAgaWYgKG5lZWRzX2RlbGV0ZSkgZGVsZXRlIHRoaXM7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgcHJpdmF0ZToKKyAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uXzsKKyAgYm9vbCBzZWxmX2RlbGV0aW5nXzsKKyAgUDEgcDFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSW50ZXJuYWxDb25zdFJlZiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlIGJhc2VfdHlwZTsKKyAgdHlwZWRlZiBjb25zdCBiYXNlX3R5cGUmIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBUPgorY2xhc3MgTWV0aG9kUmVzdWx0Q2FsbGJhY2tfMF8wIDogcHVibGljIFJlc3VsdENhbGxiYWNrPFI+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgUiAoVDo6Kk1ldGhvZFR5cGUpKCk7CisgIE1ldGhvZFJlc3VsdENhbGxiYWNrXzBfMChUKiBvYmplY3QsIE1ldGhvZFR5cGUgbWV0aG9kLCBib29sIHNlbGZfZGVsZXRpbmcpCisgICAgICA6IG9iamVjdF8ob2JqZWN0KSwKKyAgICAgICAgbWV0aG9kXyhtZXRob2QpLAorICAgICAgICBzZWxmX2RlbGV0aW5nXyhzZWxmX2RlbGV0aW5nKSB7fQorICB+TWV0aG9kUmVzdWx0Q2FsbGJhY2tfMF8wKCkge30KKworICBSIFJ1bigpIHsKKyAgICBib29sIG5lZWRzX2RlbGV0ZSA9IHNlbGZfZGVsZXRpbmdfOworICAgIFIgcmVzdWx0ID0gKG9iamVjdF8tPiptZXRob2RfKSgpOworICAgIGlmIChuZWVkc19kZWxldGUpIGRlbGV0ZSB0aGlzOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworIHByaXZhdGU6CisgIFQqIG9iamVjdF87CisgIE1ldGhvZFR5cGUgbWV0aG9kXzsKKyAgYm9vbCBzZWxmX2RlbGV0aW5nXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBQMSwgdHlwZW5hbWUgUDIsIHR5cGVuYW1lIFAzLAorICAgICAgICAgIHR5cGVuYW1lIFA0LCB0eXBlbmFtZSBQNSwgdHlwZW5hbWUgUDYsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KK2NsYXNzIE1ldGhvZFJlc3VsdENhbGxiYWNrXzZfMiA6IHB1YmxpYyBSZXN1bHRDYWxsYmFjazI8UiwgQTEsIEEyPiB7CisgcHVibGljOgorICB0eXBlZGVmIFIgKFQ6OipNZXRob2RUeXBlKShQMSwgUDIsIFAzLCBQNCwgUDUsIFA2LCBBMSwgQTIpOworICBNZXRob2RSZXN1bHRDYWxsYmFja182XzIoVCogb2JqZWN0LCBNZXRob2RUeXBlIG1ldGhvZCwgYm9vbCBzZWxmX2RlbGV0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUDEgcDEsIFAyIHAyLCBQMyBwMywgUDQgcDQsIFA1IHA1LCBQNiBwNikKKyAgICAgIDogb2JqZWN0XyhvYmplY3QpLAorICAgICAgICBtZXRob2RfKG1ldGhvZCksCisgICAgICAgIHNlbGZfZGVsZXRpbmdfKHNlbGZfZGVsZXRpbmcpLAorICAgICAgICBwMV8ocDEpLAorICAgICAgICBwMl8ocDIpLAorICAgICAgICBwM18ocDMpLAorICAgICAgICBwNF8ocDQpLAorICAgICAgICBwNV8ocDUpLAorICAgICAgICBwNl8ocDYpIHt9CisgIH5NZXRob2RSZXN1bHRDYWxsYmFja182XzIoKSB7fQorCisgIFIgUnVuKEExIGExLCBBMiBhMikgb3ZlcnJpZGUgeworICAgIGJvb2wgbmVlZHNfZGVsZXRlID0gc2VsZl9kZWxldGluZ187CisgICAgUiByZXN1bHQgPSAob2JqZWN0Xy0+Km1ldGhvZF8pKHAxXywgcDJfLCBwM18sIHA0XywgcDVfLCBwNl8sIGExLCBhMik7CisgICAgaWYgKG5lZWRzX2RlbGV0ZSkgZGVsZXRlIHRoaXM7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgcHJpdmF0ZToKKyAgVCogb2JqZWN0XzsKKyAgTWV0aG9kVHlwZSBtZXRob2RfOworICBib29sIHNlbGZfZGVsZXRpbmdfOworICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8UDE+Ojp0eXBlIHAxXzsKKyAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFAyPjo6dHlwZSBwMl87CisgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxQMz46OnR5cGUgcDNfOworICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8UDQ+Ojp0eXBlIHA0XzsKKyAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFA1Pjo6dHlwZSBwNV87CisgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxQNj46OnR5cGUgcDZfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFNlZSBDbG9zdXJlLgoraW5saW5lIENsb3N1cmUqIE5ld0NhbGxiYWNrKHZvaWQgKCpmdW5jdGlvbikoKSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpGdW5jdGlvbkNsb3N1cmUwKGZ1bmN0aW9uLCB0cnVlKTsKK30KKworLy8gU2VlIENsb3N1cmUuCitpbmxpbmUgQ2xvc3VyZSogTmV3UGVybWFuZW50Q2FsbGJhY2sodm9pZCAoKmZ1bmN0aW9uKSgpKSB7CisgIHJldHVybiBuZXcgaW50ZXJuYWw6OkZ1bmN0aW9uQ2xvc3VyZTAoZnVuY3Rpb24sIGZhbHNlKTsKK30KKworLy8gU2VlIENsb3N1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3M+CitpbmxpbmUgQ2xvc3VyZSogTmV3Q2FsbGJhY2soQ2xhc3MqIG9iamVjdCwgdm9pZCAoQ2xhc3M6OiptZXRob2QpKCkpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6TWV0aG9kQ2xvc3VyZTA8Q2xhc3M+KG9iamVjdCwgbWV0aG9kLCB0cnVlKTsKK30KKworLy8gU2VlIENsb3N1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3M+CitpbmxpbmUgQ2xvc3VyZSogTmV3UGVybWFuZW50Q2FsbGJhY2soQ2xhc3MqIG9iamVjdCwgdm9pZCAoQ2xhc3M6OiptZXRob2QpKCkpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6TWV0aG9kQ2xvc3VyZTA8Q2xhc3M+KG9iamVjdCwgbWV0aG9kLCBmYWxzZSk7Cit9CisKKy8vIFNlZSBDbG9zdXJlLgordGVtcGxhdGUgPHR5cGVuYW1lIEFyZzE+CitpbmxpbmUgQ2xvc3VyZSogTmV3Q2FsbGJhY2sodm9pZCAoKmZ1bmN0aW9uKShBcmcxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmcxIGFyZzEpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6RnVuY3Rpb25DbG9zdXJlMTxBcmcxPihmdW5jdGlvbiwgdHJ1ZSwgYXJnMSk7Cit9CisKKy8vIFNlZSBDbG9zdXJlLgordGVtcGxhdGUgPHR5cGVuYW1lIEFyZzE+CitpbmxpbmUgQ2xvc3VyZSogTmV3UGVybWFuZW50Q2FsbGJhY2sodm9pZCAoKmZ1bmN0aW9uKShBcmcxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmcxIGFyZzEpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6RnVuY3Rpb25DbG9zdXJlMTxBcmcxPihmdW5jdGlvbiwgZmFsc2UsIGFyZzEpOworfQorCisvLyBTZWUgQ2xvc3VyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgQXJnMT4KK2lubGluZSBDbG9zdXJlKiBOZXdDYWxsYmFjayhDbGFzcyogb2JqZWN0LCB2b2lkIChDbGFzczo6Km1ldGhvZCkoQXJnMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxKSB7CisgIHJldHVybiBuZXcgaW50ZXJuYWw6Ok1ldGhvZENsb3N1cmUxPENsYXNzLCBBcmcxPihvYmplY3QsIG1ldGhvZCwgdHJ1ZSwgYXJnMSk7Cit9CisKKy8vIFNlZSBDbG9zdXJlLgordGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBBcmcxPgoraW5saW5lIENsb3N1cmUqIE5ld1Blcm1hbmVudENhbGxiYWNrKENsYXNzKiBvYmplY3QsIHZvaWQgKENsYXNzOjoqbWV0aG9kKShBcmcxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmcxIGFyZzEpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6TWV0aG9kQ2xvc3VyZTE8Q2xhc3MsIEFyZzE+KG9iamVjdCwgbWV0aG9kLCBmYWxzZSwgYXJnMSk7Cit9CisKKy8vIFNlZSBDbG9zdXJlLgordGVtcGxhdGUgPHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+CitpbmxpbmUgQ2xvc3VyZSogTmV3Q2FsbGJhY2sodm9pZCAoKmZ1bmN0aW9uKShBcmcxLCBBcmcyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmcxIGFyZzEsIEFyZzIgYXJnMikgeworICByZXR1cm4gbmV3IGludGVybmFsOjpGdW5jdGlvbkNsb3N1cmUyPEFyZzEsIEFyZzI+KAorICAgIGZ1bmN0aW9uLCB0cnVlLCBhcmcxLCBhcmcyKTsKK30KKworLy8gU2VlIENsb3N1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMj4KK2lubGluZSBDbG9zdXJlKiBOZXdQZXJtYW5lbnRDYWxsYmFjayh2b2lkICgqZnVuY3Rpb24pKEFyZzEsIEFyZzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZzEgYXJnMSwgQXJnMiBhcmcyKSB7CisgIHJldHVybiBuZXcgaW50ZXJuYWw6OkZ1bmN0aW9uQ2xvc3VyZTI8QXJnMSwgQXJnMj4oCisgICAgZnVuY3Rpb24sIGZhbHNlLCBhcmcxLCBhcmcyKTsKK30KKworLy8gU2VlIENsb3N1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+CitpbmxpbmUgQ2xvc3VyZSogTmV3Q2FsbGJhY2soQ2xhc3MqIG9iamVjdCwgdm9pZCAoQ2xhc3M6OiptZXRob2QpKEFyZzEsIEFyZzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZzEgYXJnMSwgQXJnMiBhcmcyKSB7CisgIHJldHVybiBuZXcgaW50ZXJuYWw6Ok1ldGhvZENsb3N1cmUyPENsYXNzLCBBcmcxLCBBcmcyPigKKyAgICBvYmplY3QsIG1ldGhvZCwgdHJ1ZSwgYXJnMSwgYXJnMik7Cit9CisKKy8vIFNlZSBDbG9zdXJlLgordGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPgoraW5saW5lIENsb3N1cmUqIE5ld1Blcm1hbmVudENhbGxiYWNrKAorICAgIENsYXNzKiBvYmplY3QsIHZvaWQgKENsYXNzOjoqbWV0aG9kKShBcmcxLCBBcmcyKSwKKyAgICBBcmcxIGFyZzEsIEFyZzIgYXJnMikgeworICByZXR1cm4gbmV3IGludGVybmFsOjpNZXRob2RDbG9zdXJlMjxDbGFzcywgQXJnMSwgQXJnMj4oCisgICAgb2JqZWN0LCBtZXRob2QsIGZhbHNlLCBhcmcxLCBhcmcyKTsKK30KKworLy8gU2VlIFJlc3VsdENhbGxiYWNrCit0ZW1wbGF0ZTx0eXBlbmFtZSBSPgoraW5saW5lIFJlc3VsdENhbGxiYWNrPFI+KiBOZXdDYWxsYmFjayhSICgqZnVuY3Rpb24pKCkpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6RnVuY3Rpb25SZXN1bHRDYWxsYmFja18wXzA8Uj4oZnVuY3Rpb24sIHRydWUpOworfQorCisvLyBTZWUgUmVzdWx0Q2FsbGJhY2sKK3RlbXBsYXRlPHR5cGVuYW1lIFI+CitpbmxpbmUgUmVzdWx0Q2FsbGJhY2s8Uj4qIE5ld1Blcm1hbmVudENhbGxiYWNrKFIgKCpmdW5jdGlvbikoKSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpGdW5jdGlvblJlc3VsdENhbGxiYWNrXzBfMDxSPihmdW5jdGlvbiwgZmFsc2UpOworfQorCisvLyBTZWUgUmVzdWx0Q2FsbGJhY2sKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFAxPgoraW5saW5lIFJlc3VsdENhbGxiYWNrPFI+KiBOZXdDYWxsYmFjayhSICgqZnVuY3Rpb24pKFAxKSwgUDEgcDEpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6RnVuY3Rpb25SZXN1bHRDYWxsYmFja18xXzA8UiwgUDE+KAorICAgICAgZnVuY3Rpb24sIHRydWUsIHAxKTsKK30KKworLy8gU2VlIFJlc3VsdENhbGxiYWNrCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBQMT4KK2lubGluZSBSZXN1bHRDYWxsYmFjazxSPiogTmV3UGVybWFuZW50Q2FsbGJhY2soCisgICAgUiAoKmZ1bmN0aW9uKShQMSksIFAxIHAxKSB7CisgIHJldHVybiBuZXcgaW50ZXJuYWw6OkZ1bmN0aW9uUmVzdWx0Q2FsbGJhY2tfMV8wPFIsIFAxPigKKyAgICAgIGZ1bmN0aW9uLCBmYWxzZSwgcDEpOworfQorCisvLyBTZWUgUmVzdWx0Q2FsbGJhY2sxCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMT4KK2lubGluZSBSZXN1bHRDYWxsYmFjazE8UiwgQTE+KiBOZXdDYWxsYmFjayhSICgqZnVuY3Rpb24pKEExKSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpGdW5jdGlvblJlc3VsdENhbGxiYWNrXzBfMTxSLCBBMT4oZnVuY3Rpb24sIHRydWUpOworfQorCisvLyBTZWUgUmVzdWx0Q2FsbGJhY2sxCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMT4KK2lubGluZSBSZXN1bHRDYWxsYmFjazE8UiwgQTE+KiBOZXdQZXJtYW5lbnRDYWxsYmFjayhSICgqZnVuY3Rpb24pKEExKSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpGdW5jdGlvblJlc3VsdENhbGxiYWNrXzBfMTxSLCBBMT4oZnVuY3Rpb24sIGZhbHNlKTsKK30KKworLy8gU2VlIFJlc3VsdENhbGxiYWNrMQordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgUDEsIHR5cGVuYW1lIEExPgoraW5saW5lIFJlc3VsdENhbGxiYWNrMTxSLCBBMT4qIE5ld0NhbGxiYWNrKFIgKCpmdW5jdGlvbikoUDEsIEExKSwgUDEgcDEpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6RnVuY3Rpb25SZXN1bHRDYWxsYmFja18xXzE8UiwgUDEsIEExPigKKyAgICAgIGZ1bmN0aW9uLCB0cnVlLCBwMSk7Cit9CisKKy8vIFNlZSBSZXN1bHRDYWxsYmFjazEKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFAxLCB0eXBlbmFtZSBBMT4KK2lubGluZSBSZXN1bHRDYWxsYmFjazE8UiwgQTE+KiBOZXdQZXJtYW5lbnRDYWxsYmFjaygKKyAgICBSICgqZnVuY3Rpb24pKFAxLCBBMSksIFAxIHAxKSB7CisgIHJldHVybiBuZXcgaW50ZXJuYWw6OkZ1bmN0aW9uUmVzdWx0Q2FsbGJhY2tfMV8xPFIsIFAxLCBBMT4oCisgICAgICBmdW5jdGlvbiwgZmFsc2UsIHAxKTsKK30KKworLy8gU2VlIE1ldGhvZFJlc3VsdENhbGxiYWNrXzBfMAordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2lubGluZSBSZXN1bHRDYWxsYmFjazxSPiogTmV3UGVybWFuZW50Q2FsbGJhY2soCisgICAgVDEqIG9iamVjdCwgUiAoVDI6OipmdW5jdGlvbikoKSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpNZXRob2RSZXN1bHRDYWxsYmFja18wXzA8UiwgVDE+KG9iamVjdCwgZnVuY3Rpb24sIGZhbHNlKTsKK30KKworLy8gU2VlIE1ldGhvZFJlc3VsdENhbGxiYWNrXzZfMgordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIFAxLCB0eXBlbmFtZSBQMiwgdHlwZW5hbWUgUDMsCisgICAgICAgICAgdHlwZW5hbWUgUDQsIHR5cGVuYW1lIFA1LCB0eXBlbmFtZSBQNiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgoraW5saW5lIFJlc3VsdENhbGxiYWNrMjxSLCBBMSwgQTI+KiBOZXdQZXJtYW5lbnRDYWxsYmFjaygKKyAgICBUKiBvYmplY3QsIFIgKFQ6OipmdW5jdGlvbikoUDEsIFAyLCBQMywgUDQsIFA1LCBQNiwgQTEsIEEyKSwKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6SW50ZXJuYWxDb25zdFJlZjxQMT46OnR5cGUgcDEsCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkludGVybmFsQ29uc3RSZWY8UDI+Ojp0eXBlIHAyLAorICAgIHR5cGVuYW1lIGludGVybmFsOjpJbnRlcm5hbENvbnN0UmVmPFAzPjo6dHlwZSBwMywKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6SW50ZXJuYWxDb25zdFJlZjxQND46OnR5cGUgcDQsCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkludGVybmFsQ29uc3RSZWY8UDU+Ojp0eXBlIHA1LAorICAgIHR5cGVuYW1lIGludGVybmFsOjpJbnRlcm5hbENvbnN0UmVmPFA2Pjo6dHlwZSBwNikgeworICByZXR1cm4gbmV3IGludGVybmFsOjpNZXRob2RSZXN1bHRDYWxsYmFja182XzI8UiwgVCwgUDEsIFAyLCBQMywgUDQsIFA1LCBQNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEExLCBBMj4ob2JqZWN0LCBmdW5jdGlvbiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpOworfQorCisvLyBBIGZ1bmN0aW9uIHdoaWNoIGRvZXMgbm90aGluZy4gIFVzZWZ1bCBmb3IgY3JlYXRpbmcgbm8tb3AgY2FsbGJhY2tzLCBlLmcuOgorLy8gICBDbG9zdXJlKiBub3RoaW5nID0gTmV3Q2FsbGJhY2soJkRvTm90aGluZyk7Cit2b2lkIFBST1RPQlVGX0VYUE9SVCBEb05vdGhpbmcoKTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX0NBTExCQUNLX0hfCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2Nhc3RzLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2Nhc3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyOWRhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaApAQCAtMCwwICsxLDEzOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NBU1RTX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ0FTVFNfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBVc2UgaW1wbGljaXRfY2FzdCBhcyBhIHNhZmUgdmVyc2lvbiBvZiBzdGF0aWNfY2FzdCBvciBjb25zdF9jYXN0CisvLyBmb3IgdXBjYXN0aW5nIGluIHRoZSB0eXBlIGhpZXJhcmNoeSAoaS5lLiBjYXN0aW5nIGEgcG9pbnRlciB0byBGb28KKy8vIHRvIGEgcG9pbnRlciB0byBTdXBlcmNsYXNzT2ZGb28gb3IgY2FzdGluZyBhIHBvaW50ZXIgdG8gRm9vIHRvCisvLyBhIGNvbnN0IHBvaW50ZXIgdG8gRm9vKS4KKy8vIFdoZW4geW91IHVzZSBpbXBsaWNpdF9jYXN0LCB0aGUgY29tcGlsZXIgY2hlY2tzIHRoYXQgdGhlIGNhc3QgaXMgc2FmZS4KKy8vIFN1Y2ggZXhwbGljaXQgaW1wbGljaXRfY2FzdHMgYXJlIG5lY2Vzc2FyeSBpbiBzdXJwcmlzaW5nbHkgbWFueQorLy8gc2l0dWF0aW9ucyB3aGVyZSBDKysgZGVtYW5kcyBhbiBleGFjdCB0eXBlIG1hdGNoIGluc3RlYWQgb2YgYW4KKy8vIGFyZ3VtZW50IHR5cGUgY29udmVydGlibGUgdG8gYSB0YXJnZXQgdHlwZS4KKy8vCisvLyBUaGUgRnJvbSB0eXBlIGNhbiBiZSBpbmZlcnJlZCwgc28gdGhlIHByZWZlcnJlZCBzeW50YXggZm9yIHVzaW5nCisvLyBpbXBsaWNpdF9jYXN0IGlzIHRoZSBzYW1lIGFzIGZvciBzdGF0aWNfY2FzdCBldGMuOgorLy8KKy8vICAgaW1wbGljaXRfY2FzdDxUb1R5cGU+KGV4cHIpCisvLworLy8gaW1wbGljaXRfY2FzdCB3b3VsZCBoYXZlIGJlZW4gcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkIGxpYnJhcnksCisvLyBidXQgdGhlIHByb3Bvc2FsIHdhcyBzdWJtaXR0ZWQgdG9vIGxhdGUuICBJdCB3aWxsIHByb2JhYmx5IG1ha2UKKy8vIGl0cyB3YXkgaW50byB0aGUgbGFuZ3VhZ2UgaW4gdGhlIGZ1dHVyZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPgoraW5saW5lIFRvIGltcGxpY2l0X2Nhc3QoRnJvbSBjb25zdCAmZikgeworICByZXR1cm4gZjsKK30KKworLy8gV2hlbiB5b3UgdXBjYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tIHR5cGUgRm9vIHRvIHR5cGUKKy8vIFN1cGVyY2xhc3NPZkZvbyksIGl0J3MgZmluZSB0byB1c2UgaW1wbGljaXRfY2FzdDw+LCBzaW5jZSB1cGNhc3RzCisvLyBhbHdheXMgc3VjY2VlZC4gIFdoZW4geW91IGRvd25jYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tCisvLyB0eXBlIEZvbyB0byB0eXBlIFN1YmNsYXNzT2ZGb28pLCBzdGF0aWNfY2FzdDw+IGlzbid0IHNhZmUsIGJlY2F1c2UKKy8vIGhvdyBkbyB5b3Uga25vdyB0aGUgcG9pbnRlciBpcyByZWFsbHkgb2YgdHlwZSBTdWJjbGFzc09mRm9vPyAgSXQKKy8vIGNvdWxkIGJlIGEgYmFyZSBGb28sIG9yIG9mIHR5cGUgRGlmZmVyZW50U3ViY2xhc3NPZkZvby4gIFRodXMsCisvLyB3aGVuIHlvdSBkb3duY2FzdCwgeW91IHNob3VsZCB1c2UgdGhpcyBtYWNyby4gIEluIGRlYnVnIG1vZGUsIHdlCisvLyB1c2UgZHluYW1pY19jYXN0PD4gdG8gZG91YmxlLWNoZWNrIHRoZSBkb3duY2FzdCBpcyBsZWdhbCAod2UgZGllCisvLyBpZiBpdCdzIG5vdCkuICBJbiBub3JtYWwgbW9kZSwgd2UgZG8gdGhlIGVmZmljaWVudCBzdGF0aWNfY2FzdDw+CisvLyBpbnN0ZWFkLiAgVGh1cywgaXQncyBpbXBvcnRhbnQgdG8gdGVzdCBpbiBkZWJ1ZyBtb2RlIHRvIG1ha2Ugc3VyZQorLy8gdGhlIGNhc3QgaXMgbGVnYWwhCisvLyAgICBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIGluIHRoZSBjb2RlIHdlIHNob3VsZCB1c2UgZHluYW1pY19jYXN0PD4uCisvLyBJbiBwYXJ0aWN1bGFyLCB5b3UgU0hPVUxETidUIGJlIHVzaW5nIGR5bmFtaWNfY2FzdDw+IGluIG9yZGVyIHRvCisvLyBkbyBSVFRJIChlZyBjb2RlIGxpa2UgdGhpczoKKy8vICAgIGlmIChkeW5hbWljX2Nhc3Q8U3ViY2xhc3MxPihmb28pKSBIYW5kbGVBU3ViY2xhc3MxT2JqZWN0KGZvbyk7CisvLyAgICBpZiAoZHluYW1pY19jYXN0PFN1YmNsYXNzMj4oZm9vKSkgSGFuZGxlQVN1YmNsYXNzMk9iamVjdChmb28pOworLy8gWW91IHNob3VsZCBkZXNpZ24gdGhlIGNvZGUgc29tZSBvdGhlciB3YXkgbm90IHRvIG5lZWQgdGhpcy4KKwordGVtcGxhdGU8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+ICAgICAvLyB1c2UgbGlrZSB0aGlzOiBkb3duX2Nhc3Q8VCo+KGZvbyk7CitpbmxpbmUgVG8gZG93bl9jYXN0KEZyb20qIGYpIHsgICAgICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBhY2NlcHQgcG9pbnRlcnMKKyAgLy8gRW5zdXJlcyB0aGF0IFRvIGlzIGEgc3ViLXR5cGUgb2YgRnJvbSAqLiAgVGhpcyB0ZXN0IGlzIGhlcmUgb25seQorICAvLyBmb3IgY29tcGlsZS10aW1lIHR5cGUgY2hlY2tpbmcsIGFuZCBoYXMgbm8gb3ZlcmhlYWQgaW4gYW4KKyAgLy8gb3B0aW1pemVkIGJ1aWxkIGF0IHJ1bi10aW1lLCBhcyBpdCB3aWxsIGJlIG9wdGltaXplZCBhd2F5CisgIC8vIGNvbXBsZXRlbHkuCisgIGlmIChmYWxzZSkgeworICAgIGltcGxpY2l0X2Nhc3Q8RnJvbSosIFRvPigwKTsKKyAgfQorCisjaWYgIWRlZmluZWQoTkRFQlVHKSAmJiBQUk9UT0JVRl9SVFRJCisgIGFzc2VydChmID09IG51bGxwdHIgfHwgZHluYW1pY19jYXN0PFRvPihmKSAhPSBudWxscHRyKTsgIC8vIFJUVEk6IGRlYnVnIG1vZGUgb25seSEKKyNlbmRpZgorICByZXR1cm4gc3RhdGljX2Nhc3Q8VG8+KGYpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4gICAgLy8gdXNlIGxpa2UgdGhpczogZG93bl9jYXN0PFQmPihmb28pOworaW5saW5lIFRvIGRvd25fY2FzdChGcm9tJiBmKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFRvPjo6dHlwZSogVG9Bc1BvaW50ZXI7CisgIC8vIEVuc3VyZXMgdGhhdCBUbyBpcyBhIHN1Yi10eXBlIG9mIEZyb20gKi4gIFRoaXMgdGVzdCBpcyBoZXJlIG9ubHkKKyAgLy8gZm9yIGNvbXBpbGUtdGltZSB0eXBlIGNoZWNraW5nLCBhbmQgaGFzIG5vIG92ZXJoZWFkIGluIGFuCisgIC8vIG9wdGltaXplZCBidWlsZCBhdCBydW4tdGltZSwgYXMgaXQgd2lsbCBiZSBvcHRpbWl6ZWQgYXdheQorICAvLyBjb21wbGV0ZWx5LgorICBpZiAoZmFsc2UpIHsKKyAgICBpbXBsaWNpdF9jYXN0PEZyb20qLCBUb0FzUG9pbnRlcj4oMCk7CisgIH0KKworI2lmICFkZWZpbmVkKE5ERUJVRykgJiYgUFJPVE9CVUZfUlRUSQorICAvLyBSVFRJOiBkZWJ1ZyBtb2RlIG9ubHkhCisgIGFzc2VydChkeW5hbWljX2Nhc3Q8VG9Bc1BvaW50ZXI+KCZmKSAhPSBudWxscHRyKTsKKyNlbmRpZgorICByZXR1cm4gKnN0YXRpY19jYXN0PFRvQXNQb2ludGVyPigmZik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPgoraW5saW5lIFRvIGJpdF9jYXN0KGNvbnN0IEZyb20mIGZyb20pIHsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoRnJvbSkgPT0gc2l6ZW9mKFRvKSwgImJpdF9jYXN0X3dpdGhfZGlmZmVyZW50X3NpemVzIik7CisgIFRvIGRlc3Q7CisgIG1lbWNweSgmZGVzdCwgJmZyb20sIHNpemVvZihkZXN0KSk7CisgIHJldHVybiBkZXN0OworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gV2UgbWFkZSB0aGVzZSBpbnRlcm5hbCBzbyB0aGF0IHRoZXkgd291bGQgc2hvdyB1cCBhcyBzdWNoIGluIHRoZSBkb2NzLAorLy8gYnV0IHdlIGRvbid0IHdhbnQgdG8gc3RpY2sgImludGVybmFsOjoiIGluIGZyb250IG9mIHRoZW0gZXZlcnl3aGVyZS4KK3VzaW5nIGludGVybmFsOjppbXBsaWNpdF9jYXN0OwordXNpbmcgaW50ZXJuYWw6OmRvd25fY2FzdDsKK3VzaW5nIGludGVybmFsOjpiaXRfY2FzdDsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NBU1RTX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGE4MDdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uY2MKQEAgLTAsMCArMSwzMjQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaWZkZWYgX1dJTjMyCisjaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAgLy8gV2Ugb25seSBuZWVkIG1pbmltYWwgaW5jbHVkZXMKKyNlbmRpZgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmICAgIC8vIHNlZSBjb21tZW50IGluIHN0cnV0aWwuY2MKKyNlbmRpZgorI2lmIGRlZmluZWQoX19BTkRST0lEX18pCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NhbGxiYWNrLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjguaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordm9pZCBWZXJpZnlWZXJzaW9uKGludCBoZWFkZXJWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgIGludCBtaW5MaWJyYXJ5VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSkgeworICBpZiAoR09PR0xFX1BST1RPQlVGX1ZFUlNJT04gPCBtaW5MaWJyYXJ5VmVyc2lvbikgeworICAgIC8vIExpYnJhcnkgaXMgdG9vIG9sZCBmb3IgaGVhZGVycy4KKyAgICBHT09HTEVfTE9HKEZBVEFMKQorICAgICAgPDwgIlRoaXMgcHJvZ3JhbSByZXF1aXJlcyB2ZXJzaW9uICIgPDwgVmVyc2lvblN0cmluZyhtaW5MaWJyYXJ5VmVyc2lvbikKKyAgICAgIDw8ICIgb2YgdGhlIFByb3RvY29sIEJ1ZmZlciBydW50aW1lIGxpYnJhcnksIGJ1dCB0aGUgaW5zdGFsbGVkIHZlcnNpb24gIgorICAgICAgICAgImlzICIgPDwgVmVyc2lvblN0cmluZyhHT09HTEVfUFJPVE9CVUZfVkVSU0lPTikgPDwgIi4gIFBsZWFzZSB1cGRhdGUgIgorICAgICAgICAgInlvdXIgbGlicmFyeS4gIElmIHlvdSBjb21waWxlZCB0aGUgcHJvZ3JhbSB5b3Vyc2VsZiwgbWFrZSBzdXJlIHRoYXQgIgorICAgICAgICAgInlvdXIgaGVhZGVycyBhcmUgZnJvbSB0aGUgc2FtZSB2ZXJzaW9uIG9mIFByb3RvY29sIEJ1ZmZlcnMgYXMgeW91ciAiCisgICAgICAgICAibGluay10aW1lIGxpYnJhcnkuICAoVmVyc2lvbiB2ZXJpZmljYXRpb24gZmFpbGVkIGluIFwiIgorICAgICAgPDwgZmlsZW5hbWUgPDwgIlwiLikiOworICB9CisgIGlmIChoZWFkZXJWZXJzaW9uIDwga01pbkhlYWRlclZlcnNpb25Gb3JMaWJyYXJ5KSB7CisgICAgLy8gSGVhZGVycyBhcmUgdG9vIG9sZCBmb3IgbGlicmFyeS4KKyAgICBHT09HTEVfTE9HKEZBVEFMKQorICAgICAgPDwgIlRoaXMgcHJvZ3JhbSB3YXMgY29tcGlsZWQgYWdhaW5zdCB2ZXJzaW9uICIKKyAgICAgIDw8IFZlcnNpb25TdHJpbmcoaGVhZGVyVmVyc2lvbikgPDwgIiBvZiB0aGUgUHJvdG9jb2wgQnVmZmVyIHJ1bnRpbWUgIgorICAgICAgICAgImxpYnJhcnksIHdoaWNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGluc3RhbGxlZCB2ZXJzaW9uICgiCisgICAgICA8PCBWZXJzaW9uU3RyaW5nKEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OKSA8PCAgIikuICBDb250YWN0IHRoZSBwcm9ncmFtICIKKyAgICAgICAgICJhdXRob3IgZm9yIGFuIHVwZGF0ZS4gIElmIHlvdSBjb21waWxlZCB0aGUgcHJvZ3JhbSB5b3Vyc2VsZiwgbWFrZSAiCisgICAgICAgICAic3VyZSB0aGF0IHlvdXIgaGVhZGVycyBhcmUgZnJvbSB0aGUgc2FtZSB2ZXJzaW9uIG9mIFByb3RvY29sIEJ1ZmZlcnMgIgorICAgICAgICAgImFzIHlvdXIgbGluay10aW1lIGxpYnJhcnkuICAoVmVyc2lvbiB2ZXJpZmljYXRpb24gZmFpbGVkIGluIFwiIgorICAgICAgPDwgZmlsZW5hbWUgPDwgIlwiLikiOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIFZlcnNpb25TdHJpbmcoaW50IHZlcnNpb24pIHsKKyAgaW50IG1ham9yID0gdmVyc2lvbiAvIDEwMDAwMDA7CisgIGludCBtaW5vciA9ICh2ZXJzaW9uIC8gMTAwMCkgJSAxMDAwOworICBpbnQgbWljcm8gPSB2ZXJzaW9uICUgMTAwMDsKKworICAvLyAxMjggYnl0ZXMgc2hvdWxkIGFsd2F5cyBiZSBlbm91Z2gsIGJ1dCB3ZSB1c2Ugc25wcmludGYoKSBhbnl3YXkgdG8gYmUKKyAgLy8gc2FmZS4KKyAgY2hhciBidWZmZXJbMTI4XTsKKyAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVkLiVkLiVkIiwgbWFqb3IsIG1pbm9yLCBtaWNybyk7CisKKyAgLy8gR3VhcmQgYWdhaW5zdCBicm9rZW4gTVNWQyBzbnByaW50ZigpLgorICBidWZmZXJbc2l6ZW9mKGJ1ZmZlciktMV0gPSAnXDAnOworCisgIHJldHVybiBidWZmZXI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBlbXVsYXRlcyBnb29nbGUzL2Jhc2UvbG9nZ2luZy5jYworCisvLyBJZiB0aGUgbWluaW11bSBsb2dnaW5nIGxldmVsIGlzIG5vdCBzZXQsIHdlIGRlZmF1bHQgdG8gbG9nZ2luZyBtZXNzYWdlcyBmb3IKKy8vIGFsbCBsZXZlbHMuCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9NSU5fTE9HX0xFVkVMCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9NSU5fTE9HX0xFVkVMIExPR0xFVkVMX0lORk8KKyNlbmRpZgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykKK2lubGluZSB2b2lkIERlZmF1bHRMb2dIYW5kbGVyKExvZ0xldmVsIGxldmVsLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICBpZiAobGV2ZWwgPCBHT09HTEVfUFJPVE9CVUZfTUlOX0xPR19MRVZFTCkgeworICAgIHJldHVybjsKKyAgfQorICBzdGF0aWMgY29uc3QgY2hhciogbGV2ZWxfbmFtZXNbXSA9IHsiSU5GTyIsICJXQVJOSU5HIiwgIkVSUk9SIiwgIkZBVEFMIn07CisKKyAgc3RhdGljIGNvbnN0IGludCBhbmRyb2lkX2xvZ19sZXZlbHNbXSA9IHsKKyAgICAgIEFORFJPSURfTE9HX0lORk8sICAgLy8gTE9HKElORk8pLAorICAgICAgQU5EUk9JRF9MT0dfV0FSTiwgICAvLyBMT0coV0FSTklORykKKyAgICAgIEFORFJPSURfTE9HX0VSUk9SLCAgLy8gTE9HKEVSUk9SKQorICAgICAgQU5EUk9JRF9MT0dfRkFUQUwsICAvLyBMT0coRkFUQUwpCisgIH07CisKKyAgLy8gQm91bmQgdGhlIGxvZ2dpbmcgbGV2ZWwuCisgIGNvbnN0IGludCBhbmRyb2lkX2xvZ19sZXZlbCA9IGFuZHJvaWRfbG9nX2xldmVsc1tsZXZlbF07CisgIDo6c3RkOjpvc3RyaW5nc3RyZWFtIG9zdHI7CisgIG9zdHIgPDwgIltsaWJwcm90b2J1ZiAiIDw8IGxldmVsX25hbWVzW2xldmVsXSA8PCAiICIgPDwgZmlsZW5hbWUgPDwgIjoiCisgICAgICAgPDwgbGluZSA8PCAiXSAiIDw8IG1lc3NhZ2UuY19zdHIoKTsKKworICAvLyBPdXRwdXQgdGhlIGxvZyBzdHJpbmcgdGhlIEFuZHJvaWQgbG9nIGF0IHRoZSBhcHByb3ByaWF0ZSBsZXZlbC4KKyAgX19hbmRyb2lkX2xvZ193cml0ZShhbmRyb2lkX2xvZ19sZXZlbCwgImxpYnByb3RvYnVmLW5hdGl2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgb3N0ci5zdHIoKS5jX3N0cigpKTsKKyAgLy8gQWxzbyBvdXRwdXQgdG8gc3RkOjpjZXJyLgorICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgb3N0ci5zdHIoKS5jX3N0cigpKTsKKyAgZmZsdXNoKHN0ZGVycik7CisKKyAgLy8gSW5kaWNhdGUgdGVybWluYXRpb24gaWYgbmVlZGVkLgorICBpZiAoYW5kcm9pZF9sb2dfbGV2ZWwgPT0gQU5EUk9JRF9MT0dfRkFUQUwpIHsKKyAgICBfX2FuZHJvaWRfbG9nX3dyaXRlKEFORFJPSURfTE9HX0ZBVEFMLCAibGlicHJvdG9idWYtbmF0aXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXJtaW5hdGluZy5cbiIpOworICB9Cit9CisKKyNlbHNlCit2b2lkIERlZmF1bHRMb2dIYW5kbGVyKExvZ0xldmVsIGxldmVsLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgIGlmIChsZXZlbCA8IEdPT0dMRV9QUk9UT0JVRl9NSU5fTE9HX0xFVkVMKSB7CisgICAgcmV0dXJuOworICB9CisgIHN0YXRpYyBjb25zdCBjaGFyKiBsZXZlbF9uYW1lc1tdID0geyAiSU5GTyIsICJXQVJOSU5HIiwgIkVSUk9SIiwgIkZBVEFMIiB9OworCisgIC8vIFdlIHVzZSBmcHJpbnRmKCkgaW5zdGVhZCBvZiBjZXJyIGJlY2F1c2Ugd2Ugd2FudCB0aGlzIHRvIHdvcmsgYXQgc3RhdGljCisgIC8vIGluaXRpYWxpemF0aW9uIHRpbWUuCisgIGZwcmludGYoc3RkZXJyLCAiW2xpYnByb3RvYnVmICVzICVzOiVkXSAlc1xuIiwKKyAgICAgICAgICBsZXZlbF9uYW1lc1tsZXZlbF0sIGZpbGVuYW1lLCBsaW5lLCBtZXNzYWdlLmNfc3RyKCkpOworICBmZmx1c2goc3RkZXJyKTsgIC8vIE5lZWRlZCBvbiBNU1ZDLgorfQorI2VuZGlmCisKK3ZvaWQgTnVsbExvZ0hhbmRsZXIoTG9nTGV2ZWwgLyogbGV2ZWwgKi8sIGNvbnN0IGNoYXIqIC8qIGZpbGVuYW1lICovLAorICAgICAgICAgICAgICAgICAgICBpbnQgLyogbGluZSAqLywgY29uc3Qgc3RkOjpzdHJpbmcmIC8qIG1lc3NhZ2UgKi8pIHsKKyAgLy8gTm90aGluZy4KK30KKworc3RhdGljIExvZ0hhbmRsZXIqIGxvZ19oYW5kbGVyXyA9ICZEZWZhdWx0TG9nSGFuZGxlcjsKK3N0YXRpYyBzdGQ6OmF0b21pYzxpbnQ+IGxvZ19zaWxlbmNlcl9jb3VudF8gPSBBVE9NSUNfVkFSX0lOSVQoMCk7CisKK0xvZ01lc3NhZ2UmIExvZ01lc3NhZ2U6Om9wZXJhdG9yPDwoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIG1lc3NhZ2VfICs9IHZhbHVlOworICByZXR1cm4gKnRoaXM7Cit9CisKK0xvZ01lc3NhZ2UmIExvZ01lc3NhZ2U6Om9wZXJhdG9yPDwoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgbWVzc2FnZV8gKz0gdmFsdWU7CisgIHJldHVybiAqdGhpczsKK30KKworTG9nTWVzc2FnZSYgTG9nTWVzc2FnZTo6b3BlcmF0b3I8PChjb25zdCBTdHJpbmdQaWVjZSYgdmFsdWUpIHsKKyAgbWVzc2FnZV8gKz0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCitMb2dNZXNzYWdlJiBMb2dNZXNzYWdlOjpvcGVyYXRvcjw8KGNvbnN0IHV0aWw6OlN0YXR1cyYgc3RhdHVzKSB7CisgIG1lc3NhZ2VfICs9IHN0YXR1cy5Ub1N0cmluZygpOworICByZXR1cm4gKnRoaXM7Cit9CisKK0xvZ01lc3NhZ2UmIExvZ01lc3NhZ2U6Om9wZXJhdG9yPDwoY29uc3QgdWludDEyOCYgdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0cjsKKyAgc3RyIDw8IHZhbHVlOworICBtZXNzYWdlXyArPSBzdHIuc3RyKCk7CisgIHJldHVybiAqdGhpczsKK30KKworTG9nTWVzc2FnZSYgTG9nTWVzc2FnZTo6b3BlcmF0b3I8PChjaGFyIHZhbHVlKSB7CisgIHJldHVybiAqdGhpcyA8PCBTdHJpbmdQaWVjZSgmdmFsdWUsIDEpOworfQorCitMb2dNZXNzYWdlJiBMb2dNZXNzYWdlOjpvcGVyYXRvcjw8KHZvaWQqIHZhbHVlKSB7CisgIFN0ckFwcGVuZCgmbWVzc2FnZV8sIHN0cmluZ3M6OkhleChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4odmFsdWUpKSk7CisgIHJldHVybiAqdGhpczsKK30KKworI3VuZGVmIERFQ0xBUkVfU1RSRUFNX09QRVJBVE9SCisjZGVmaW5lIERFQ0xBUkVfU1RSRUFNX09QRVJBVE9SKFRZUEUpICAgICAgICAgICAgICBcCisgIExvZ01lc3NhZ2UmIExvZ01lc3NhZ2U6Om9wZXJhdG9yPDwoVFlQRSB2YWx1ZSkgeyBcCisgICAgU3RyQXBwZW5kKCZtZXNzYWdlXywgdmFsdWUpOyAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICp0aGlzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IoaW50KQorREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IodW5zaWduZWQgaW50KQorREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IobG9uZykgICAgICAgICAgIC8vIE5PTElOVChydW50aW1lL2ludCkKK0RFQ0xBUkVfU1RSRUFNX09QRVJBVE9SKHVuc2lnbmVkIGxvbmcpICAvLyBOT0xJTlQocnVudGltZS9pbnQpCitERUNMQVJFX1NUUkVBTV9PUEVSQVRPUihkb3VibGUpCitERUNMQVJFX1NUUkVBTV9PUEVSQVRPUihsb25nIGxvbmcpICAgICAgICAgICAvLyBOT0xJTlQocnVudGltZS9pbnQpCitERUNMQVJFX1NUUkVBTV9PUEVSQVRPUih1bnNpZ25lZCBsb25nIGxvbmcpICAvLyBOT0xJTlQocnVudGltZS9pbnQpCisjdW5kZWYgREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IKKworTG9nTWVzc2FnZTo6TG9nTWVzc2FnZShMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lKQorICA6IGxldmVsXyhsZXZlbCksIGZpbGVuYW1lXyhmaWxlbmFtZSksIGxpbmVfKGxpbmUpIHt9CitMb2dNZXNzYWdlOjp+TG9nTWVzc2FnZSgpIHt9CisKK3ZvaWQgTG9nTWVzc2FnZTo6RmluaXNoKCkgeworICBib29sIHN1cHByZXNzID0gZmFsc2U7CisKKyAgaWYgKGxldmVsXyAhPSBMT0dMRVZFTF9GQVRBTCkgeworICAgIHN1cHByZXNzID0gbG9nX3NpbGVuY2VyX2NvdW50XyA+IDA7CisgIH0KKworICBpZiAoIXN1cHByZXNzKSB7CisgICAgbG9nX2hhbmRsZXJfKGxldmVsXywgZmlsZW5hbWVfLCBsaW5lXywgbWVzc2FnZV8pOworICB9CisKKyAgaWYgKGxldmVsXyA9PSBMT0dMRVZFTF9GQVRBTCkgeworI2lmIFBST1RPQlVGX1VTRV9FWENFUFRJT05TCisgICAgdGhyb3cgRmF0YWxFeGNlcHRpb24oZmlsZW5hbWVfLCBsaW5lXywgbWVzc2FnZV8pOworI2Vsc2UKKyAgICBhYm9ydCgpOworI2VuZGlmCisgIH0KK30KKwordm9pZCBMb2dGaW5pc2hlcjo6b3BlcmF0b3I9KExvZ01lc3NhZ2UmIG90aGVyKSB7CisgIG90aGVyLkZpbmlzaCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworTG9nSGFuZGxlciogU2V0TG9nSGFuZGxlcihMb2dIYW5kbGVyKiBuZXdfZnVuYykgeworICBMb2dIYW5kbGVyKiBvbGQgPSBpbnRlcm5hbDo6bG9nX2hhbmRsZXJfOworICBpZiAob2xkID09ICZpbnRlcm5hbDo6TnVsbExvZ0hhbmRsZXIpIHsKKyAgICBvbGQgPSBudWxscHRyOworICB9CisgIGlmIChuZXdfZnVuYyA9PSBudWxscHRyKSB7CisgICAgaW50ZXJuYWw6OmxvZ19oYW5kbGVyXyA9ICZpbnRlcm5hbDo6TnVsbExvZ0hhbmRsZXI7CisgIH0gZWxzZSB7CisgICAgaW50ZXJuYWw6OmxvZ19oYW5kbGVyXyA9IG5ld19mdW5jOworICB9CisgIHJldHVybiBvbGQ7Cit9CisKK0xvZ1NpbGVuY2VyOjpMb2dTaWxlbmNlcigpIHsKKyAgKytpbnRlcm5hbDo6bG9nX3NpbGVuY2VyX2NvdW50XzsKK307CisKK0xvZ1NpbGVuY2VyOjp+TG9nU2lsZW5jZXIoKSB7CisgIC0taW50ZXJuYWw6OmxvZ19zaWxlbmNlcl9jb3VudF87Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBlbXVsYXRlcyBnb29nbGUzL2Jhc2UvY2FsbGJhY2suY2MKKworQ2xvc3VyZTo6fkNsb3N1cmUoKSB7fQorCituYW1lc3BhY2UgaW50ZXJuYWwgeyBGdW5jdGlvbkNsb3N1cmUwOjp+RnVuY3Rpb25DbG9zdXJlMCgpIHt9IH0KKwordm9pZCBEb05vdGhpbmcoKSB7fQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBlbXVsYXRlcyBnb29nbGUzL3V0aWwvZW5kaWFuL2VuZGlhbi5oCisvLworLy8gVE9ETyh4aWFvZmVuZyk6IFBST1RPQlVGX0xJVFRMRV9FTkRJQU4gaXMgdW5mb3J0dW5hdGVseSBkZWZpbmVkIGluCisvLyBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmggYW5kIHRoZXJlZm9yZSBjYW4gbm90IGJlIHVzZWQgaGVyZS4KKy8vIE1heWJlIG1vdmUgdGhhdCBtYWNybyBkZWZpbml0aW9uIGhlcmUgaW4gdGhlIGZ1dHVyZS4KK3VpbnQzMl90IGdodG9ubCh1aW50MzJfdCB4KSB7CisgIHVuaW9uIHsKKyAgICB1aW50MzJfdCByZXN1bHQ7CisgICAgdWludDhfdCByZXN1bHRfYXJyYXlbNF07CisgIH07CisgIHJlc3VsdF9hcnJheVswXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHggPj4gMjQpOworICByZXN1bHRfYXJyYXlbMV0gPSBzdGF0aWNfY2FzdDx1aW50OF90PigoeCA+PiAxNikgJiAweEZGKTsKKyAgcmVzdWx0X2FycmF5WzJdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oKHggPj4gOCkgJiAweEZGKTsKKyAgcmVzdWx0X2FycmF5WzNdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oeCAmIDB4RkYpOworICByZXR1cm4gcmVzdWx0OworfQorCisjaWYgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMKK0ZhdGFsRXhjZXB0aW9uOjp+RmF0YWxFeGNlcHRpb24oKSB0aHJvdygpIHt9CisKK2NvbnN0IGNoYXIqIEZhdGFsRXhjZXB0aW9uOjp3aGF0KCkgY29uc3QgdGhyb3coKSB7CisgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOworfQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExZGIyYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpIGFuZCBvdGhlcnMKKy8vCisvLyBDb250YWlucyBiYXNpYyB0eXBlcyBhbmQgdXRpbGl0aWVzIHVzZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIGxpYnJhcnkuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTU1PTl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTU1PTl9IX18KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hY3Jvcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wbGF0Zm9ybV9tYWNyb3MuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvcG9ydC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5oPgorCisjaWZuZGVmIFBST1RPQlVGX1VTRV9FWENFUFRJT05TCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfQ1BQVU5XSU5EKQorICAjZGVmaW5lIFBST1RPQlVGX1VTRV9FWENFUFRJT05TIDEKKyNlbGlmIGRlZmluZWQoX19FWENFUFRJT05TKQorICAjZGVmaW5lIFBST1RPQlVGX1VTRV9FWENFUFRJT05TIDEKKyNlbHNlCisgICNkZWZpbmUgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMgMAorI2VuZGlmCisjZW5kaWYKKworI2lmIFBST1RPQlVGX1VTRV9FWENFUFRJT05TCisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2VuZGlmCisjaWYgZGVmaW5lZChfX0FQUExFX18pCisjaW5jbHVkZSA8VGFyZ2V0Q29uZGl0aW9uYWxzLmg+ICAvLyBmb3IgVEFSR0VUX09TX0lQSE9ORQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSB8fCBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9PU19BTkRST0lEKSB8fCAoZGVmaW5lZChUQVJHRVRfT1NfSVBIT05FKSAmJiBUQVJHRVRfT1NfSVBIT05FKSB8fCBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9PU19JUEhPTkUpCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2Ugc3RkIHt9CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFNvbWUgb2YgdGhlc2UgY29uc3RhbnRzIGFyZSBtYWNyb3MgcmF0aGVyIHRoYW4gY29uc3QgaW50cyBzbyB0aGF0IHRoZXkgY2FuCisvLyBiZSB1c2VkIGluICNpZiBkaXJlY3RpdmVzLgorCisvLyBUaGUgY3VycmVudCB2ZXJzaW9uLCByZXByZXNlbnRlZCBhcyBhIHNpbmdsZSBpbnRlZ2VyIHRvIG1ha2UgY29tcGFyaXNvbgorLy8gZWFzaWVyOiAgbWFqb3IgKiAxMF42ICsgbWlub3IgKiAxMF4zICsgbWljcm8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1ZFUlNJT04gMzAyMTAwOQorCisvLyBBIHN1ZmZpeCBzdHJpbmcgZm9yIGFscGhhLCBiZXRhIG9yIHJjIHJlbGVhc2VzLiBFbXB0eSBmb3Igc3RhYmxlIHJlbGVhc2VzLgorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVkVSU0lPTl9TVUZGSVggIiIKKworLy8gVGhlIG1pbmltdW0gaGVhZGVyIHZlcnNpb24gd2hpY2ggd29ya3Mgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mCisvLyB0aGUgbGlicmFyeS4gIFRoaXMgY29uc3RhbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBwcm90b2MncyBDKysgY29kZQorLy8gZ2VuZXJhdG9yLgorc3RhdGljIGNvbnN0IGludCBrTWluSGVhZGVyVmVyc2lvbkZvckxpYnJhcnkgPSAzMDIxMDAwOworCisvLyBUaGUgbWluaW11bSBwcm90b2MgdmVyc2lvbiB3aGljaCB3b3JrcyB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlCisvLyBoZWFkZXJzLgorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OIDMwMjEwMDAKKworLy8gVGhlIG1pbmltdW0gaGVhZGVyIHZlcnNpb24gd2hpY2ggd29ya3Mgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mCisvLyBwcm90b2MuICBUaGlzIGNvbnN0YW50IHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gVmVyaWZ5VmVyc2lvbigpLgorc3RhdGljIGNvbnN0IGludCBrTWluSGVhZGVyVmVyc2lvbkZvclByb3RvYyA9IDMwMjEwMDA7CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIGhlYWRlcnMgYW5kIGxpYnJhcmllcyBhcmUgY29tcGF0aWJsZS4gIFVzZSB0aGUgbWFjcm8KKy8vIGJlbG93IHRvIGNhbGwgdGhpcy4KK3ZvaWQgUFJPVE9CVUZfRVhQT1JUIFZlcmlmeVZlcnNpb24oaW50IGhlYWRlclZlcnNpb24sIGludCBtaW5MaWJyYXJ5VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUpOworCisvLyBDb252ZXJ0cyBhIG51bWVyaWMgdmVyc2lvbiBudW1iZXIgdG8gYSBzdHJpbmcuCitzdGQ6OnN0cmluZyBQUk9UT0JVRl9FWFBPUlQgVmVyc2lvblN0cmluZyhpbnQgdmVyc2lvbik7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBQbGFjZSB0aGlzIG1hY3JvIGluIHlvdXIgbWFpbigpIGZ1bmN0aW9uIChvciBzb21ld2hlcmUgYmVmb3JlIHlvdSBhdHRlbXB0CisvLyB0byB1c2UgdGhlIHByb3RvYnVmIGxpYnJhcnkpIHRvIHZlcmlmeSB0aGF0IHRoZSB2ZXJzaW9uIHlvdSBsaW5rIGFnYWluc3QKKy8vIG1hdGNoZXMgdGhlIGhlYWRlcnMgeW91IGNvbXBpbGVkIGFnYWluc3QuICBJZiBhIHZlcnNpb24gbWlzbWF0Y2ggaXMKKy8vIGRldGVjdGVkLCB0aGUgcHJvY2VzcyB3aWxsIGFib3J0LgorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVkVSSUZZX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlZlcmlmeVZlcnNpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT09HTEVfUFJPVE9CVUZfVkVSU0lPTiwgR09PR0xFX1BST1RPQlVGX01JTl9MSUJSQVJZX1ZFUlNJT04sICAgICAgICAgXAorICAgIF9fRklMRV9fKQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGZyb20gZ29vZ2xlMy91dGlsL3V0ZjgvcHVibGljL3VuaWxpYi5oCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIENoZWNrcyBpZiB0aGUgYnVmZmVyIGNvbnRhaW5zIHN0cnVjdHVyYWxseS12YWxpZCBVVEYtOC4gIEltcGxlbWVudGVkIGluCisvLyBzdHJ1Y3R1cmFsbHlfdmFsaWQuY2MuCitQUk9UT0JVRl9FWFBPUlQgYm9vbCBJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChjb25zdCBjaGFyKiBidWYsIGludCBsZW4pOworCitpbmxpbmUgYm9vbCBJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChTdHJpbmdQaWVjZSBzdHIpIHsKKyAgcmV0dXJuIElzU3RydWN0dXJhbGx5VmFsaWRVVEY4KHN0ci5kYXRhKCksIHN0YXRpY19jYXN0PGludD4oc3RyLmxlbmd0aCgpKSk7Cit9CisKKy8vIFJldHVybnMgaW5pdGlhbCBudW1iZXIgb2YgYnl0ZXMgb2Ygc3RydWN0dXJhbGx5IHZhbGlkIFVURi04LgorUFJPVE9CVUZfRVhQT1JUIGludCBVVEY4U3BuU3RydWN0dXJhbGx5VmFsaWQoU3RyaW5nUGllY2Ugc3RyKTsKKworLy8gQ29lcmNlIFVURi04IGJ5dGUgc3RyaW5nIGluIHNyY19zdHIgdG8gYmUKKy8vIGEgc3RydWN0dXJhbGx5LXZhbGlkIGVxdWFsLWxlbmd0aCBzdHJpbmcgYnkgc2VsZWN0aXZlbHkKKy8vIG92ZXJ3cml0aW5nIGlsbGVnYWwgYnl0ZXMgd2l0aCByZXBsYWNlX2NoYXIgKHR5cGljYWxseSAnICcgb3IgJz8nKS4KKy8vIHJlcGxhY2VfY2hhciBtdXN0IGJlIGxlZ2FsIHByaW50YWJsZSA3LWJpdCBBc2NpaSAweDIwLi4weDdlLgorLy8gc3JjX3N0ciBpcyByZWFkLW9ubHkuCisvLworLy8gUmV0dXJucyBwb2ludGVyIHRvIG91dHB1dCBidWZmZXIsIHNyY19zdHIuZGF0YSgpIGlmIG5vIGNoYW5nZXMgd2VyZSBtYWRlLAorLy8gIG9yIGlkc3QgaWYgc29tZSBieXRlcyB3ZXJlIGNoYW5nZWQuIGlkc3QgaXMgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIKKy8vICBhbmQgbXVzdCBiZSBhdCBsZWFzdCBhcyBiaWcgYXMgc3JjX3N0cgorLy8KKy8vIE9wdGltaXplZCBmb3I6IGFsbCBzdHJ1Y3R1cmFsbHkgdmFsaWQgYW5kIG5vIGJ5dGUgY29weWluZyBpcyBkb25lLgorLy8KK1BST1RPQlVGX0VYUE9SVCBjaGFyKiBVVEY4Q29lcmNlVG9TdHJ1Y3R1cmFsbHlWYWxpZChTdHJpbmdQaWVjZSBzdHIsIGNoYXIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJlcGxhY2VfY2hhcik7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBUaGlzIGxpdmVzIGluIG1lc3NhZ2VfbGl0ZS5oIG5vdywgYnV0IHdlIGxlYXZlIHRoaXMgaGVyZSBmb3IgYW55IHVzZXJzIHRoYXQKKy8vICNpbmNsdWRlIGNvbW1vbi5oIGFuZCBub3QgbWVzc2FnZV9saXRlLmguCitQUk9UT0JVRl9FWFBPUlQgdm9pZCBTaHV0ZG93blByb3RvYnVmTGlicmFyeSgpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBTdHJvbmdseSByZWZlcmVuY2VzIHRoZSBnaXZlbiB2YXJpYWJsZSBzdWNoIHRoYXQgdGhlIGxpbmtlciB3aWxsIGJlIGZvcmNlZAorLy8gdG8gcHVsbCBpbiB0aGlzIHZhcmlhYmxlJ3MgdHJhbnNsYXRpb24gdW5pdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBTdHJvbmdSZWZlcmVuY2UoY29uc3QgVCYgdmFyKSB7CisgIGF1dG8gdm9sYXRpbGUgdW51c2VkID0gJnZhcjsKKyAgKHZvaWQpJnVudXNlZDsgIC8vIFVzZSBhZGRyZXNzIHRvIGF2b2lkIGFuIGV4dHJhIGxvYWQgb2YgInVudXNlZCIuCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjaWYgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMKK2NsYXNzIEZhdGFsRXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uIHsKKyBwdWJsaWM6CisgIEZhdGFsRXhjZXB0aW9uKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbGluZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgICA6IGZpbGVuYW1lXyhmaWxlbmFtZSksIGxpbmVfKGxpbmUpLCBtZXNzYWdlXyhtZXNzYWdlKSB7fQorICB2aXJ0dWFsIH5GYXRhbEV4Y2VwdGlvbigpIHRocm93KCk7CisKKyAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgb3ZlcnJpZGU7CisKKyAgY29uc3QgY2hhciogZmlsZW5hbWUoKSBjb25zdCB7IHJldHVybiBmaWxlbmFtZV87IH0KKyAgaW50IGxpbmUoKSBjb25zdCB7IHJldHVybiBsaW5lXzsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1lc3NhZ2VfOyB9CisKKyBwcml2YXRlOgorICBjb25zdCBjaGFyKiBmaWxlbmFtZV87CisgIGNvbnN0IGludCBsaW5lXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbWVzc2FnZV87Cit9OworI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01NT05fSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NWU0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDM1OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHsKKworLy8gVE9ETyhrZW50b24pOiAgTW9yZSB0ZXN0cy4KKworI2lmZGVmIFBBQ0tBR0VfVkVSU0lPTiAgLy8gb25seSBkZWZpbmVkIHdoZW4gdXNpbmcgYXV0b21ha2UsIG5vdCBNU1ZDCisKK1RFU1QoVmVyc2lvblRlc3QsIFZlcnNpb25NYXRjaGVzQ29uZmlnKSB7CisgIC8vIFZlcmlmeSB0aGF0IHRoZSB2ZXJzaW9uIHN0cmluZyBzcGVjaWZpZWQgaW4gY29uZmlnLmggbWF0Y2hlcyB0aGUgb25lCisgIC8vIGluIGNvbW1vbi5oLiAgVGhlIGNvbmZpZy5oIHZlcnNpb24gaXMgYSBzdHJpbmcgd2hpY2ggbWF5IGhhdmUgYSBzdWZmaXgKKyAgLy8gbGlrZSAiYmV0YSIgb3IgInJjMSIsIHNvIHdlIHJlbW92ZSB0aGF0LgorICBzdGQ6OnN0cmluZyB2ZXJzaW9uID0gUEFDS0FHRV9WRVJTSU9OOworICBpbnQgcG9zID0gMDsKKyAgd2hpbGUgKHBvcyA8IHZlcnNpb24uc2l6ZSgpICYmCisgICAgICAgICAoYXNjaWlfaXNkaWdpdCh2ZXJzaW9uW3Bvc10pIHx8IHZlcnNpb25bcG9zXSA9PSAnLicpKSB7CisgICAgKytwb3M7CisgIH0KKyAgdmVyc2lvbi5lcmFzZShwb3MpOworCisgIEVYUEVDVF9FUSh2ZXJzaW9uLCBpbnRlcm5hbDo6VmVyc2lvblN0cmluZyhHT09HTEVfUFJPVE9CVUZfVkVSU0lPTikpOworfQorCisjZW5kaWYgIC8vIFBBQ0tBR0VfVkVSU0lPTgorCitURVNUKENvbW1vblRlc3QsIEludE1pbk1heENvbnN0YW50cykgeworICAvLyBraW50MzJtaW4gd2FzIGRlY2xhcmVkIGluY29ycmVjdGx5IGluIHRoZSBmaXJzdCByZWxlYXNlIG9mIHByb3RvYnVmcy4KKyAgLy8gVWdoLgorICBFWFBFQ1RfTFQoa2ludDMybWluLCBraW50MzJtYXgpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dWludDMyPihraW50MzJtaW4pLCBzdGF0aWNfY2FzdDx1aW50MzI+KGtpbnQzMm1heCkgKyAxKTsKKyAgRVhQRUNUX0xUKGtpbnQ2NG1pbiwga2ludDY0bWF4KTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHVpbnQ2ND4oa2ludDY0bWluKSwgc3RhdGljX2Nhc3Q8dWludDY0PihraW50NjRtYXgpICsgMSk7CisgIEVYUEVDVF9FUSgwLCBrdWludDMybWF4ICsgMSk7CisgIEVYUEVDVF9FUSgwLCBrdWludDY0bWF4ICsgMSk7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjYXB0dXJlZF9tZXNzYWdlc187CisKK3ZvaWQgQ2FwdHVyZUxvZyhMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgIGNhcHR1cmVkX21lc3NhZ2VzXy5wdXNoX2JhY2soCisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiJDAgJDE6JDI6ICQzIiwKKyAgICAgIGltcGxpY2l0X2Nhc3Q8aW50PihsZXZlbCksIGZpbGVuYW1lLCBsaW5lLCBtZXNzYWdlKSk7Cit9CisKK1RFU1QoTG9nZ2luZ1Rlc3QsIERlZmF1bHRMb2dnaW5nKSB7CisgIENhcHR1cmVUZXN0U3RkZXJyKCk7CisgIGludCBsaW5lID0gX19MSU5FX187CisgIEdPT0dMRV9MT0coSU5GTyAgICkgPDwgIkEgbWVzc2FnZS4iOworICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJBIHdhcm5pbmcuIjsKKyAgR09PR0xFX0xPRyhFUlJPUiAgKSA8PCAiQW4gZXJyb3IuIjsKKworICBzdGQ6OnN0cmluZyB0ZXh0ID0gR2V0Q2FwdHVyZWRUZXN0U3RkZXJyKCk7CisgIEVYUEVDVF9FUSgKKyAgICAiW2xpYnByb3RvYnVmIElORk8gIiBfX0ZJTEVfXyAiOiIgKyBTaW1wbGVJdG9hKGxpbmUgKyAxKSArICJdIEEgbWVzc2FnZS5cbiIKKyAgICAiW2xpYnByb3RvYnVmIFdBUk5JTkcgIiBfX0ZJTEVfXyAiOiIgKyBTaW1wbGVJdG9hKGxpbmUgKyAyKSArICJdIEEgd2FybmluZy5cbiIKKyAgICAiW2xpYnByb3RvYnVmIEVSUk9SICIgX19GSUxFX18gIjoiICsgU2ltcGxlSXRvYShsaW5lICsgMykgKyAiXSBBbiBlcnJvci5cbiIsCisgICAgdGV4dCk7Cit9CisKK1RFU1QoTG9nZ2luZ1Rlc3QsIE51bGxMb2dnaW5nKSB7CisgIExvZ0hhbmRsZXIqIG9sZF9oYW5kbGVyID0gU2V0TG9nSGFuZGxlcihudWxscHRyKTsKKworICBDYXB0dXJlVGVzdFN0ZGVycigpOworICBHT09HTEVfTE9HKElORk8gICApIDw8ICJBIG1lc3NhZ2UuIjsKKyAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiQSB3YXJuaW5nLiI7CisgIEdPT0dMRV9MT0coRVJST1IgICkgPDwgIkFuIGVycm9yLiI7CisKKyAgRVhQRUNUX1RSVUUoU2V0TG9nSGFuZGxlcihvbGRfaGFuZGxlcikgPT0gbnVsbHB0cik7CisKKyAgc3RkOjpzdHJpbmcgdGV4dCA9IEdldENhcHR1cmVkVGVzdFN0ZGVycigpOworICBFWFBFQ1RfRVEoIiIsIHRleHQpOworfQorCitURVNUKExvZ2dpbmdUZXN0LCBDYXB0dXJlTG9nZ2luZykgeworICBjYXB0dXJlZF9tZXNzYWdlc18uY2xlYXIoKTsKKworICBMb2dIYW5kbGVyKiBvbGRfaGFuZGxlciA9IFNldExvZ0hhbmRsZXIoJkNhcHR1cmVMb2cpOworCisgIGludCBzdGFydF9saW5lID0gX19MSU5FX187CisgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJBbiBlcnJvci4iOworICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJBIHdhcm5pbmcuIjsKKworICBFWFBFQ1RfVFJVRShTZXRMb2dIYW5kbGVyKG9sZF9oYW5kbGVyKSA9PSAmQ2FwdHVyZUxvZyk7CisKKyAgQVNTRVJUX0VRKDIsIGNhcHR1cmVkX21lc3NhZ2VzXy5zaXplKCkpOworICBFWFBFQ1RfRVEoCisgICAgIjIgIiBfX0ZJTEVfXyAiOiIgKyBTaW1wbGVJdG9hKHN0YXJ0X2xpbmUgKyAxKSArICI6IEFuIGVycm9yLiIsCisgICAgY2FwdHVyZWRfbWVzc2FnZXNfWzBdKTsKKyAgRVhQRUNUX0VRKAorICAgICIxICIgX19GSUxFX18gIjoiICsgU2ltcGxlSXRvYShzdGFydF9saW5lICsgMikgKyAiOiBBIHdhcm5pbmcuIiwKKyAgICBjYXB0dXJlZF9tZXNzYWdlc19bMV0pOworfQorCitURVNUKExvZ2dpbmdUZXN0LCBTaWxlbmNlTG9nZ2luZykgeworICBjYXB0dXJlZF9tZXNzYWdlc18uY2xlYXIoKTsKKworICBMb2dIYW5kbGVyKiBvbGRfaGFuZGxlciA9IFNldExvZ0hhbmRsZXIoJkNhcHR1cmVMb2cpOworCisgIGludCBsaW5lMSA9IF9fTElORV9fOyBHT09HTEVfTE9HKElORk8pIDw8ICJWaXNpYmxlMSI7CisgIExvZ1NpbGVuY2VyKiBzaWxlbmNlcjEgPSBuZXcgTG9nU2lsZW5jZXI7CisgIEdPT0dMRV9MT0coSU5GTykgPDwgIk5vdCB2aXNpYmxlLiI7CisgIExvZ1NpbGVuY2VyKiBzaWxlbmNlcjIgPSBuZXcgTG9nU2lsZW5jZXI7CisgIEdPT0dMRV9MT0coSU5GTykgPDwgIk5vdCB2aXNpYmxlLiI7CisgIGRlbGV0ZSBzaWxlbmNlcjE7CisgIEdPT0dMRV9MT0coSU5GTykgPDwgIk5vdCB2aXNpYmxlLiI7CisgIGRlbGV0ZSBzaWxlbmNlcjI7CisgIGludCBsaW5lMiA9IF9fTElORV9fOyBHT09HTEVfTE9HKElORk8pIDw8ICJWaXNpYmxlMiI7CisKKyAgRVhQRUNUX1RSVUUoU2V0TG9nSGFuZGxlcihvbGRfaGFuZGxlcikgPT0gJkNhcHR1cmVMb2cpOworCisgIEFTU0VSVF9FUSgyLCBjYXB0dXJlZF9tZXNzYWdlc18uc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKAorICAgICIwICIgX19GSUxFX18gIjoiICsgU2ltcGxlSXRvYShsaW5lMSkgKyAiOiBWaXNpYmxlMSIsCisgICAgY2FwdHVyZWRfbWVzc2FnZXNfWzBdKTsKKyAgRVhQRUNUX0VRKAorICAgICIwICIgX19GSUxFX18gIjoiICsgU2ltcGxlSXRvYShsaW5lMikgKyAiOiBWaXNpYmxlMiIsCisgICAgY2FwdHVyZWRfbWVzc2FnZXNfWzFdKTsKK30KKworY2xhc3MgQ2xvc3VyZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2b2lkIFNldEExMjNNZXRob2QoKSAgIHsgYV8gPSAxMjM7IH0KKyAgc3RhdGljIHZvaWQgU2V0QTEyM0Z1bmN0aW9uKCkgeyBjdXJyZW50X2luc3RhbmNlXy0+YV8gPSAxMjM7IH0KKworICB2b2lkIFNldEFNZXRob2QoaW50IGEpICAgICAgICAgeyBhXyA9IGE7IH0KKyAgdm9pZCBTZXRDTWV0aG9kKHN0ZDo6c3RyaW5nIGMpIHsgY18gPSBjOyB9CisKKyAgc3RhdGljIHZvaWQgU2V0QUZ1bmN0aW9uKGludCBhKSAgICAgICAgIHsgY3VycmVudF9pbnN0YW5jZV8tPmFfID0gYTsgfQorICBzdGF0aWMgdm9pZCBTZXRDRnVuY3Rpb24oc3RkOjpzdHJpbmcgYykgeyBjdXJyZW50X2luc3RhbmNlXy0+Y18gPSBjOyB9CisKKyAgdm9pZCBTZXRBQk1ldGhvZChpbnQgYSwgY29uc3QgY2hhciogYikgIHsgYV8gPSBhOyBiXyA9IGI7IH0KKyAgc3RhdGljIHZvaWQgU2V0QUJGdW5jdGlvbihpbnQgYSwgY29uc3QgY2hhciogYikgeworICAgIGN1cnJlbnRfaW5zdGFuY2VfLT5hXyA9IGE7CisgICAgY3VycmVudF9pbnN0YW5jZV8tPmJfID0gYjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBjdXJyZW50X2luc3RhbmNlXyA9IHRoaXM7CisgICAgYV8gPSAwOworICAgIGJfID0gbnVsbHB0cjsKKyAgICBjXy5jbGVhcigpOworICAgIHBlcm1hbmVudF9jbG9zdXJlXyA9IG51bGxwdHI7CisgIH0KKworICB2b2lkIERlbGV0ZUNsb3N1cmVJbkNhbGxiYWNrKCkgeworICAgIGRlbGV0ZSBwZXJtYW5lbnRfY2xvc3VyZV87CisgIH0KKworICBpbnQgYV87CisgIGNvbnN0IGNoYXIqIGJfOworICBzdGQ6OnN0cmluZyBjXzsKKyAgQ2xvc3VyZSogcGVybWFuZW50X2Nsb3N1cmVfOworCisgIHN0YXRpYyBDbG9zdXJlVGVzdCogY3VycmVudF9pbnN0YW5jZV87Cit9OworCitDbG9zdXJlVGVzdCogQ2xvc3VyZVRlc3Q6OmN1cnJlbnRfaW5zdGFuY2VfID0gbnVsbHB0cjsKKworVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0Q2xvc3VyZUZ1bmN0aW9uMCkgeworICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3Q2FsbGJhY2soJlNldEExMjNGdW5jdGlvbik7CisgIEVYUEVDVF9ORSgxMjMsIGFfKTsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSgxMjMsIGFfKTsKK30KKworVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0Q2xvc3VyZU1ldGhvZDApIHsKKyAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld0NhbGxiYWNrKGN1cnJlbnRfaW5zdGFuY2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsb3N1cmVUZXN0OjpTZXRBMTIzTWV0aG9kKTsKKyAgRVhQRUNUX05FKDEyMywgYV8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDEyMywgYV8pOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RDbG9zdXJlRnVuY3Rpb24xKSB7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdDYWxsYmFjaygmU2V0QUZ1bmN0aW9uLCA0NTYpOworICBFWFBFQ1RfTkUoNDU2LCBhXyk7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoNDU2LCBhXyk7Cit9CisKK1RFU1RfRihDbG9zdXJlVGVzdCwgVGVzdENsb3N1cmVNZXRob2QxKSB7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdDYWxsYmFjayhjdXJyZW50X2luc3RhbmNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbG9zdXJlVGVzdDo6U2V0QU1ldGhvZCwgNDU2KTsKKyAgRVhQRUNUX05FKDQ1NiwgYV8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDQ1NiwgYV8pOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RDbG9zdXJlRnVuY3Rpb24xU3RyaW5nKSB7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdDYWxsYmFjaygmU2V0Q0Z1bmN0aW9uLCBzdGQ6OnN0cmluZygidGVzdCIpKTsKKyAgRVhQRUNUX05FKCJ0ZXN0IiwgY18pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKCJ0ZXN0IiwgY18pOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RDbG9zdXJlTWV0aG9kMVN0cmluZykgeworICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3Q2FsbGJhY2soY3VycmVudF9pbnN0YW5jZV8sICZDbG9zdXJlVGVzdDo6U2V0Q01ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJ0ZXN0IikpOworICBFWFBFQ1RfTkUoInRlc3QiLCBjXyk7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoInRlc3QiLCBjXyk7Cit9CisKK1RFU1RfRihDbG9zdXJlVGVzdCwgVGVzdENsb3N1cmVGdW5jdGlvbjIpIHsKKyAgY29uc3QgY2hhciogY3N0ciA9ICJoZWxsbyI7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdDYWxsYmFjaygmU2V0QUJGdW5jdGlvbiwgNzg5LCBjc3RyKTsKKyAgRVhQRUNUX05FKDc4OSwgYV8pOworICBFWFBFQ1RfTkUoY3N0ciwgYl8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDc4OSwgYV8pOworICBFWFBFQ1RfRVEoY3N0ciwgYl8pOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RDbG9zdXJlTWV0aG9kMikgeworICBjb25zdCBjaGFyKiBjc3RyID0gImhlbGxvIjsKKyAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld0NhbGxiYWNrKGN1cnJlbnRfaW5zdGFuY2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsb3N1cmVUZXN0OjpTZXRBQk1ldGhvZCwgNzg5LCBjc3RyKTsKKyAgRVhQRUNUX05FKDc4OSwgYV8pOworICBFWFBFQ1RfTkUoY3N0ciwgYl8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDc4OSwgYV8pOworICBFWFBFQ1RfRVEoY3N0ciwgYl8pOworfQorCisvLyBSZXBlYXQgYWxsIG9mIHRoZSBhYm92ZSB3aXRoIE5ld1Blcm1hbmVudENhbGxiYWNrKCkKKworVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0UGVybWFuZW50Q2xvc3VyZUZ1bmN0aW9uMCkgeworICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3UGVybWFuZW50Q2FsbGJhY2soJlNldEExMjNGdW5jdGlvbik7CisgIEVYUEVDVF9ORSgxMjMsIGFfKTsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSgxMjMsIGFfKTsKKyAgYV8gPSAwOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDEyMywgYV8pOworICBkZWxldGUgY2xvc3VyZTsKK30KKworVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0UGVybWFuZW50Q2xvc3VyZU1ldGhvZDApIHsKKyAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld1Blcm1hbmVudENhbGxiYWNrKGN1cnJlbnRfaW5zdGFuY2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsb3N1cmVUZXN0OjpTZXRBMTIzTWV0aG9kKTsKKyAgRVhQRUNUX05FKDEyMywgYV8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDEyMywgYV8pOworICBhXyA9IDA7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoMTIzLCBhXyk7CisgIGRlbGV0ZSBjbG9zdXJlOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RQZXJtYW5lbnRDbG9zdXJlRnVuY3Rpb24xKSB7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdQZXJtYW5lbnRDYWxsYmFjaygmU2V0QUZ1bmN0aW9uLCA0NTYpOworICBFWFBFQ1RfTkUoNDU2LCBhXyk7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoNDU2LCBhXyk7CisgIGFfID0gMDsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSg0NTYsIGFfKTsKKyAgZGVsZXRlIGNsb3N1cmU7Cit9CisKK1RFU1RfRihDbG9zdXJlVGVzdCwgVGVzdFBlcm1hbmVudENsb3N1cmVNZXRob2QxKSB7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdQZXJtYW5lbnRDYWxsYmFjayhjdXJyZW50X2luc3RhbmNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbG9zdXJlVGVzdDo6U2V0QU1ldGhvZCwgNDU2KTsKKyAgRVhQRUNUX05FKDQ1NiwgYV8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDQ1NiwgYV8pOworICBhXyA9IDA7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoNDU2LCBhXyk7CisgIGRlbGV0ZSBjbG9zdXJlOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RQZXJtYW5lbnRDbG9zdXJlRnVuY3Rpb24yKSB7CisgIGNvbnN0IGNoYXIqIGNzdHIgPSAiaGVsbG8iOworICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3UGVybWFuZW50Q2FsbGJhY2soJlNldEFCRnVuY3Rpb24sIDc4OSwgY3N0cik7CisgIEVYUEVDVF9ORSg3ODksIGFfKTsKKyAgRVhQRUNUX05FKGNzdHIsIGJfKTsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSg3ODksIGFfKTsKKyAgRVhQRUNUX0VRKGNzdHIsIGJfKTsKKyAgYV8gPSAwOworICBiXyA9IG51bGxwdHI7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoNzg5LCBhXyk7CisgIEVYUEVDVF9FUShjc3RyLCBiXyk7CisgIGRlbGV0ZSBjbG9zdXJlOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RQZXJtYW5lbnRDbG9zdXJlTWV0aG9kMikgeworICBjb25zdCBjaGFyKiBjc3RyID0gImhlbGxvIjsKKyAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld1Blcm1hbmVudENhbGxiYWNrKGN1cnJlbnRfaW5zdGFuY2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsb3N1cmVUZXN0OjpTZXRBQk1ldGhvZCwgNzg5LCBjc3RyKTsKKyAgRVhQRUNUX05FKDc4OSwgYV8pOworICBFWFBFQ1RfTkUoY3N0ciwgYl8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDc4OSwgYV8pOworICBFWFBFQ1RfRVEoY3N0ciwgYl8pOworICBhXyA9IDA7CisgIGJfID0gbnVsbHB0cjsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSg3ODksIGFfKTsKKyAgRVhQRUNUX0VRKGNzdHIsIGJfKTsKKyAgZGVsZXRlIGNsb3N1cmU7Cit9CisKK1RFU1RfRihDbG9zdXJlVGVzdCwgVGVzdFBlcm1hbmVudENsb3N1cmVEZWxldGVJbkNhbGxiYWNrKSB7CisgIHBlcm1hbmVudF9jbG9zdXJlXyA9IE5ld1Blcm1hbmVudENhbGxiYWNrKChDbG9zdXJlVGVzdCopIHRoaXMsCisgICAgICAmQ2xvc3VyZVRlc3Q6OkRlbGV0ZUNsb3N1cmVJbkNhbGxiYWNrKTsKKyAgcGVybWFuZW50X2Nsb3N1cmVfLT5SdW4oKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZWMwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaApAQCAtMCwwICsxLDExNCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfSEFTSF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX0hBU0hfSF9fCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyMgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRV9ERUNMQVJBVElPTl9TVEFSVCBcCisgIG5hbWVzcGFjZSBnb29nbGUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgcHJvdG9idWYgeworIyBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFX0RFQ0xBUkFUSU9OX0VORCB9fQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CitzdHJ1Y3QgaGFzaCA6IHB1YmxpYyBzdGQ6Omhhc2g8S2V5PiB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KK3N0cnVjdCBoYXNoPGNvbnN0IEtleSo+IHsKKyAgaW5saW5lIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IEtleSoga2V5KSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihrZXkpOworICB9Cit9OworCisvLyBVbmxpa2UgdGhlIG9sZCBTR0kgdmVyc2lvbiwgdGhlIFRSMSAiaGFzaCIgZG9lcyBub3Qgc3BlY2lhbC1jYXNlIGNoYXIqLiAgU28sCisvLyB3ZSBnbyBhaGVhZCBhbmQgcHJvdmlkZSBvdXIgb3duIGltcGxlbWVudGF0aW9uLgordGVtcGxhdGUgPD4KK3N0cnVjdCBoYXNoPGNvbnN0IGNoYXIqPiB7CisgIGlubGluZSBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzdHIpIGNvbnN0IHsKKyAgICBzaXplX3QgcmVzdWx0ID0gMDsKKyAgICBmb3IgKDsgKnN0ciAhPSAnXDAnOyBzdHIrKykgeworICAgICAgcmVzdWx0ID0gNSAqIHJlc3VsdCArIHN0YXRpY19jYXN0PHNpemVfdD4oKnN0cik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBoYXNoPGJvb2w+IHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoYm9vbCB4KSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oeCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaGFzaDxzdGQ6OnN0cmluZz4geworICBpbmxpbmUgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgY29uc3QgeworICAgIHJldHVybiBoYXNoPGNvbnN0IGNoYXIqPigpKGtleS5jX3N0cigpKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBzaXplX3QgYnVja2V0X3NpemUgPSA0OworICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1pbl9idWNrZXRzID0gODsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZyYgYSwgY29uc3Qgc3RkOjpzdHJpbmcmIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gYSA8IGI7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGaXJzdCwgdHlwZW5hbWUgU2Vjb25kPgorc3RydWN0IGhhc2g8c3RkOjpwYWlyPEZpcnN0LCBTZWNvbmQ+ID4geworICBpbmxpbmUgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpwYWlyPEZpcnN0LCBTZWNvbmQ+JiBrZXkpIGNvbnN0IHsKKyAgICBzaXplX3QgZmlyc3RfaGFzaCA9IGhhc2g8Rmlyc3Q+KCkoa2V5LmZpcnN0KTsKKyAgICBzaXplX3Qgc2Vjb25kX2hhc2ggPSBoYXNoPFNlY29uZD4oKShrZXkuc2Vjb25kKTsKKworICAgIC8vIEZJWE1FKGtlbnRvbik6ICBXaGF0IGlzIHRoZSBiZXN0IHdheSB0byBjb21wdXRlIHRoaXMgaGFzaD8gIEkgaGF2ZQorICAgIC8vIG5vIGlkZWEhICBUaGlzIHNlZW1zIGEgYml0IGJldHRlciB0aGFuIGFuIFhPUi4KKyAgICByZXR1cm4gZmlyc3RfaGFzaCAqICgoMSA8PCAxNikgLSAxKSArIHNlY29uZF9oYXNoOworICB9CisKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBidWNrZXRfc2l6ZSA9IDQ7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgbWluX2J1Y2tldHMgPSA4OworICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6cGFpcjxGaXJzdCwgU2Vjb25kPiYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6cGFpcjxGaXJzdCwgU2Vjb25kPiYgYikgY29uc3QgeworICAgIHJldHVybiBhIDwgYjsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX0hBU0hfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNTFjZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOC5jYwpAQCAtMCwwICsxLDE5MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4Lmg+CisKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQocmVhZGFiaWxpdHkvc3RyZWFtcykKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY29uc3QgdWludDEyOF9wb2Qga3VpbnQxMjhtYXggPSB7dWludDY0X3R7MHhGRkZGRkZGRkZGRkZGRkZGdX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdHsweEZGRkZGRkZGRkZGRkZGRkZ1fX07CisKKy8vIFJldHVybnMgdGhlIDAtYmFzZWQgcG9zaXRpb24gb2YgdGhlIGxhc3Qgc2V0IGJpdCAoaS5lLiwgbW9zdCBzaWduaWZpY2FudCBiaXQpCisvLyBpbiB0aGUgZ2l2ZW4gdWludDY0LiBUaGUgYXJndW1lbnQgbWF5IG5vdCBiZSAwLgorLy8KKy8vIEZvciBleGFtcGxlOgorLy8gICBHaXZlbjogNSAoZGVjaW1hbCkgPT0gMTAxIChiaW5hcnkpCisvLyAgIFJldHVybnM6IDIKKyNkZWZpbmUgU1RFUChULCBuLCBwb3MsIHNoKSAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgobikgPj0gKHN0YXRpY19jYXN0PFQ+KDEpIDw8IChzaCkpKSB7IFwKKyAgICAgIChuKSA9IChuKSA+PiAoc2gpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAocG9zKSB8PSAoc2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgaW50IEZsczY0KHVpbnQ2NF90IG4pIHsKKyAgR09PR0xFX0RDSEVDS19ORSgwLCBuKTsKKyAgaW50IHBvcyA9IDA7CisgIFNURVAodWludDY0X3QsIG4sIHBvcywgMHgyMCk7CisgIHVpbnQzMl90IG4zMiA9IG47CisgIFNURVAodWludDMyX3QsIG4zMiwgcG9zLCAweDEwKTsKKyAgU1RFUCh1aW50MzJfdCwgbjMyLCBwb3MsIDB4MDgpOworICBTVEVQKHVpbnQzMl90LCBuMzIsIHBvcywgMHgwNCk7CisgIHJldHVybiBwb3MgKyAoKHVpbnQ2NF90ezB4MzMzMzMzMzMyMjIyMTEwMHV9ID4+IChuMzIgPDwgMikpICYgMHgzKTsKK30KKyN1bmRlZiBTVEVQCisKKy8vIExpa2UgRmxzNjQoKSBhYm92ZSwgYnV0IHJldHVybnMgdGhlIDAtYmFzZWQgcG9zaXRpb24gb2YgdGhlIGxhc3Qgc2V0IGJpdAorLy8gKGkuZS4sIG1vc3Qgc2lnbmlmaWNhbnQgYml0KSBpbiB0aGUgZ2l2ZW4gdWludDEyOC4gVGhlIGFyZ3VtZW50IG1heSBub3QgYmUgMC4KK3N0YXRpYyBpbmxpbmUgaW50IEZsczEyOCh1aW50MTI4IG4pIHsKKyAgaWYgKHVpbnQ2NF90IGhpID0gVWludDEyOEhpZ2g2NChuKSkgeworICAgIHJldHVybiBGbHM2NChoaSkgKyA2NDsKKyAgfQorICByZXR1cm4gRmxzNjQoVWludDEyOExvdzY0KG4pKTsKK30KKwordm9pZCB1aW50MTI4OjpEaXZNb2RJbXBsKHVpbnQxMjggZGl2aWRlbmQsIHVpbnQxMjggZGl2aXNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTI4KiBxdW90aWVudF9yZXQsIHVpbnQxMjgqIHJlbWFpbmRlcl9yZXQpIHsKKyAgaWYgKGRpdmlzb3IgPT0gMCkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJEaXZpc2lvbiBvciBtb2QgYnkgemVybzogZGl2aWRlbmQuaGk9IiA8PCBkaXZpZGVuZC5oaV8KKyAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBsbz0iIDw8IGRpdmlkZW5kLmxvXzsKKyAgfSBlbHNlIGlmIChkaXZpZGVuZCA8IGRpdmlzb3IpIHsKKyAgICAqcXVvdGllbnRfcmV0ID0gMDsKKyAgICAqcmVtYWluZGVyX3JldCA9IGRpdmlkZW5kOworICAgIHJldHVybjsKKyAgfSBlbHNlIHsKKyAgICBpbnQgZGl2aWRlbmRfYml0X2xlbmd0aCA9IEZsczEyOChkaXZpZGVuZCk7CisgICAgaW50IGRpdmlzb3JfYml0X2xlbmd0aCA9IEZsczEyOChkaXZpc29yKTsKKyAgICBpbnQgZGlmZmVyZW5jZSA9IGRpdmlkZW5kX2JpdF9sZW5ndGggLSBkaXZpc29yX2JpdF9sZW5ndGg7CisgICAgdWludDEyOCBxdW90aWVudCA9IDA7CisgICAgd2hpbGUgKGRpZmZlcmVuY2UgPj0gMCkgeworICAgICAgcXVvdGllbnQgPDw9IDE7CisgICAgICB1aW50MTI4IHNoaWZ0ZWRfZGl2aXNvciA9IGRpdmlzb3IgPDwgZGlmZmVyZW5jZTsKKyAgICAgIGlmIChzaGlmdGVkX2Rpdmlzb3IgPD0gZGl2aWRlbmQpIHsKKyAgICAgICAgZGl2aWRlbmQgLT0gc2hpZnRlZF9kaXZpc29yOworICAgICAgICBxdW90aWVudCArPSAxOworICAgICAgfQorICAgICAgZGlmZmVyZW5jZSAtPSAxOworICAgIH0KKyAgICAvL3JlY29yZCB0aGUgZmluYWwgcXVvdGllbnQgYW5kIHJlbWFpbmRlcgorICAgICpxdW90aWVudF9yZXQgPSBxdW90aWVudDsKKyAgICAqcmVtYWluZGVyX3JldCA9IGRpdmlkZW5kOworICB9Cit9CisKKwordWludDEyOCYgdWludDEyODo6b3BlcmF0b3IvPShjb25zdCB1aW50MTI4JiBkaXZpc29yKSB7CisgIHVpbnQxMjggcXVvdGllbnQgPSAwOworICB1aW50MTI4IHJlbWFpbmRlciA9IDA7CisgIERpdk1vZEltcGwoKnRoaXMsIGRpdmlzb3IsICZxdW90aWVudCwgJnJlbWFpbmRlcik7CisgICp0aGlzID0gcXVvdGllbnQ7CisgIHJldHVybiAqdGhpczsKK30KK3VpbnQxMjgmIHVpbnQxMjg6Om9wZXJhdG9yJT0oY29uc3QgdWludDEyOCYgZGl2aXNvcikgeworICB1aW50MTI4IHF1b3RpZW50ID0gMDsKKyAgdWludDEyOCByZW1haW5kZXIgPSAwOworICBEaXZNb2RJbXBsKCp0aGlzLCBkaXZpc29yLCAmcXVvdGllbnQsICZyZW1haW5kZXIpOworICAqdGhpcyA9IHJlbWFpbmRlcjsKKyAgcmV0dXJuICp0aGlzOworfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvLCBjb25zdCB1aW50MTI4JiBiKSB7CisgIHN0ZDo6aW9zX2Jhc2U6OmZtdGZsYWdzIGZsYWdzID0gby5mbGFncygpOworCisgIC8vIFNlbGVjdCBhIGRpdmlzb3Igd2hpY2ggaXMgdGhlIGxhcmdlc3QgcG93ZXIgb2YgdGhlIGJhc2UgPCAyXjY0LgorICB1aW50MTI4IGRpdjsKKyAgc3RkOjpzdHJlYW1zaXplIGRpdl9iYXNlX2xvZzsKKyAgc3dpdGNoIChmbGFncyAmIHN0ZDo6aW9zOjpiYXNlZmllbGQpIHsKKyAgICBjYXNlIHN0ZDo6aW9zOjpoZXg6CisgICAgICBkaXYgPQorICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90Pih1aW50NjRfdHsweDEwMDAwMDAwMDAwMDAwMDB1fSk7ICAvLyAxNl4xNQorICAgICAgZGl2X2Jhc2VfbG9nID0gMTU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHN0ZDo6aW9zOjpvY3Q6CisgICAgICBkaXYgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oCisgICAgICAgICAgdWludDY0X3R7MDEwMDAwMDAwMDAwMDAwMDAwMDAwMDB1fSk7ICAvLyA4XjIxCisgICAgICBkaXZfYmFzZV9sb2cgPSAyMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAvLyBzdGQ6Omlvczo6ZGVjCisgICAgICBkaXYgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oCisgICAgICAgICAgdWludDY0X3R7MTAwMDAwMDAwMDAwMDAwMDAwMDB1fSk7ICAvLyAxMF4xOQorICAgICAgZGl2X2Jhc2VfbG9nID0gMTk7CisgICAgICBicmVhazsKKyAgfQorCisgIC8vIE5vdyBwaWVjZSB0b2dldGhlciB0aGUgdWludDEyOCByZXByZXNlbnRhdGlvbiBmcm9tIHRocmVlIGNodW5rcyBvZgorICAvLyB0aGUgb3JpZ2luYWwgdmFsdWUsIGVhY2ggbGVzcyB0aGFuICJkaXYiIGFuZCB0aGVyZWZvcmUgcmVwcmVzZW50YWJsZQorICAvLyBhcyBhIHVpbnQ2NC4KKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICBzdGQ6Omlvc19iYXNlOjpmbXRmbGFncyBjb3B5X21hc2sgPQorICAgICAgc3RkOjppb3M6OmJhc2VmaWVsZCB8IHN0ZDo6aW9zOjpzaG93YmFzZSB8IHN0ZDo6aW9zOjp1cHBlcmNhc2U7CisgIG9zLnNldGYoZmxhZ3MgJiBjb3B5X21hc2ssIGNvcHlfbWFzayk7CisgIHVpbnQxMjggaGlnaCA9IGI7CisgIHVpbnQxMjggbG93OworICB1aW50MTI4OjpEaXZNb2RJbXBsKGhpZ2gsIGRpdiwgJmhpZ2gsICZsb3cpOworICB1aW50MTI4IG1pZDsKKyAgdWludDEyODo6RGl2TW9kSW1wbChoaWdoLCBkaXYsICZoaWdoLCAmbWlkKTsKKyAgaWYgKGhpZ2gubG9fICE9IDApIHsKKyAgICBvcyA8PCBoaWdoLmxvXzsKKyAgICBvcyA8PCBzdGQ6Om5vc2hvd2Jhc2UgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KGRpdl9iYXNlX2xvZyk7CisgICAgb3MgPDwgbWlkLmxvXzsKKyAgICBvcyA8PCBzdGQ6OnNldHcoZGl2X2Jhc2VfbG9nKTsKKyAgfSBlbHNlIGlmIChtaWQubG9fICE9IDApIHsKKyAgICBvcyA8PCBtaWQubG9fOworICAgIG9zIDw8IHN0ZDo6bm9zaG93YmFzZSA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoZGl2X2Jhc2VfbG9nKTsKKyAgfQorICBvcyA8PCBsb3cubG9fOworICBzdGQ6OnN0cmluZyByZXAgPSBvcy5zdHIoKTsKKworICAvLyBBZGQgdGhlIHJlcXVpc2l0ZSBwYWRkaW5nLgorICBzdGQ6OnN0cmVhbXNpemUgd2lkdGggPSBvLndpZHRoKDApOworICBhdXRvIHJlcFNpemUgPSBzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KHJlcC5zaXplKCkpOworICBpZiAod2lkdGggPiByZXBTaXplKSB7CisgICAgaWYgKChmbGFncyAmIHN0ZDo6aW9zOjphZGp1c3RmaWVsZCkgPT0gc3RkOjppb3M6OmxlZnQpIHsKKyAgICAgIHJlcC5hcHBlbmQod2lkdGggLSByZXBTaXplLCBvLmZpbGwoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcC5pbnNlcnQoc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmc6OnNpemVfdHlwZT4oMCksIHdpZHRoIC0gcmVwU2l6ZSwKKyAgICAgICAgICAgICAgICAgby5maWxsKCkpOworICAgIH0KKyAgfQorCisgIC8vIFN0cmVhbSB0aGUgZmluYWwgcmVwcmVzZW50YXRpb24gaW4gYSBzaW5nbGUgIjw8IiBjYWxsLgorICByZXR1cm4gbyA8PCByZXA7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPiAgLy8gTk9MSU5UCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmQ3YmRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjguaApAQCAtMCwwICsxLDM4NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19JTlQxMjhfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX0lOVDEyOF9IXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCisjaW5jbHVkZSA8aW9zZndkPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitzdHJ1Y3QgdWludDEyOF9wb2Q7CisKKy8vIFRPRE8oeGlhb2ZlbmcpOiBEZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU19DT05TVEVYUFIgd2hlbiBjb25zdGV4cHIgaXMKKy8vIGF2YWlsYWJsZS4KKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfSEFTX0NPTlNURVhQUgorIyBkZWZpbmUgVUlOVDEyOF9DT05TVEVYUFIgY29uc3RleHByCisjZWxzZQorIyBkZWZpbmUgVUlOVDEyOF9DT05TVEVYUFIKKyNlbmRpZgorCisvLyBBbiB1bnNpZ25lZCAxMjgtYml0IGludGVnZXIgdHlwZS4gVGhyZWFkLWNvbXBhdGlibGUuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgdWludDEyOCB7CisgcHVibGljOgorICBVSU5UMTI4X0NPTlNURVhQUiB1aW50MTI4KCk7ICAvLyBTZXRzIHRvIDAsIGJ1dCBkb24ndCB0cnVzdCBvbiB0aGlzIGJlaGF2aW9yLgorICBVSU5UMTI4X0NPTlNURVhQUiB1aW50MTI4KHVpbnQ2NF90IHRvcCwgdWludDY0X3QgYm90dG9tKTsKKyNpZm5kZWYgU1dJRworICBVSU5UMTI4X0NPTlNURVhQUiB1aW50MTI4KGludCBib3R0b20pOworICBVSU5UMTI4X0NPTlNURVhQUiB1aW50MTI4KHVpbnQzMl90IGJvdHRvbSk7ICAgLy8gVG9wIDk2IGJpdHMgPSAwCisjZW5kaWYKKyAgVUlOVDEyOF9DT05TVEVYUFIgdWludDEyOCh1aW50NjRfdCBib3R0b20pOyAgIC8vIGhpXyA9IDAKKyAgVUlOVDEyOF9DT05TVEVYUFIgdWludDEyOChjb25zdCB1aW50MTI4X3BvZCAmdmFsKTsKKworICAvLyBUcml2aWFsIGNvcHkgY29uc3RydWN0b3IsIGFzc2lnbm1lbnQgb3BlcmF0b3IgYW5kIGRlc3RydWN0b3IuCisKKyAgdm9pZCBJbml0aWFsaXplKHVpbnQ2NF90IHRvcCwgdWludDY0X3QgYm90dG9tKTsKKworICAvLyBBcml0aG1ldGljIG9wZXJhdG9ycy4KKyAgdWludDEyOCYgb3BlcmF0b3IrPShjb25zdCB1aW50MTI4JiBiKTsKKyAgdWludDEyOCYgb3BlcmF0b3ItPShjb25zdCB1aW50MTI4JiBiKTsKKyAgdWludDEyOCYgb3BlcmF0b3IqPShjb25zdCB1aW50MTI4JiBiKTsKKyAgLy8gTG9uZyBkaXZpc2lvbi9tb2R1bG8gZm9yIHVpbnQxMjguCisgIHVpbnQxMjgmIG9wZXJhdG9yLz0oY29uc3QgdWludDEyOCYgYik7CisgIHVpbnQxMjgmIG9wZXJhdG9yJT0oY29uc3QgdWludDEyOCYgYik7CisgIHVpbnQxMjggb3BlcmF0b3IrKyhpbnQpOworICB1aW50MTI4IG9wZXJhdG9yLS0oaW50KTsKKyAgdWludDEyOCYgb3BlcmF0b3I8PD0oaW50KTsKKyAgdWludDEyOCYgb3BlcmF0b3I+Pj0oaW50KTsKKyAgdWludDEyOCYgb3BlcmF0b3ImPShjb25zdCB1aW50MTI4JiBiKTsKKyAgdWludDEyOCYgb3BlcmF0b3J8PShjb25zdCB1aW50MTI4JiBiKTsKKyAgdWludDEyOCYgb3BlcmF0b3JePShjb25zdCB1aW50MTI4JiBiKTsKKyAgdWludDEyOCYgb3BlcmF0b3IrKygpOworICB1aW50MTI4JiBvcGVyYXRvci0tKCk7CisKKyAgZnJpZW5kIHVpbnQ2NF90IFVpbnQxMjhMb3c2NChjb25zdCB1aW50MTI4JiB2KTsKKyAgZnJpZW5kIHVpbnQ2NF90IFVpbnQxMjhIaWdoNjQoY29uc3QgdWludDEyOCYgdik7CisKKyAgLy8gV2UgYWRkICJzdGQ6OiIgdG8gYXZvaWQgaW5jbHVkaW5nIGFsbCBvZiBwb3J0LmguCisgIFBST1RPQlVGX0VYUE9SVCBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDEyOCYgYik7CisKKyBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBEaXZNb2RJbXBsKHVpbnQxMjggZGl2aWRlbmQsIHVpbnQxMjggZGl2aXNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTI4KiBxdW90aWVudF9yZXQsIHVpbnQxMjgqIHJlbWFpbmRlcl9yZXQpOworCisgIC8vIExpdHRsZS1lbmRpYW4gbWVtb3J5IG9yZGVyIG9wdGltaXphdGlvbnMgY2FuIGJlbmVmaXQgZnJvbQorICAvLyBoYXZpbmcgbG9fIGZpcnN0LCBoaV8gbGFzdC4KKyAgLy8gU2VlIHV0aWwvZW5kaWFuL2VuZGlhbi5oIGFuZCBMb2FkMTI4L1N0b3JlMTI4IGZvciBzdG9yaW5nIGEgdWludDEyOC4KKyAgdWludDY0X3QgbG9fOworICB1aW50NjRfdCBoaV87CisKKyAgLy8gTm90IGltcGxlbWVudGVkLCBqdXN0IGRlY2xhcmVkIGZvciBjYXRjaGluZyBhdXRvbWF0aWMgdHlwZSBjb252ZXJzaW9ucy4KKyAgdWludDEyOCh1aW50OF90KTsKKyAgdWludDEyOCh1aW50MTZfdCk7CisgIHVpbnQxMjgoZmxvYXQgdik7CisgIHVpbnQxMjgoZG91YmxlIHYpOworfTsKKworLy8gVGhpcyBpcyBhIFBPRCBmb3JtIG9mIHVpbnQxMjggd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHN0YXRpYyB2YXJpYWJsZXMgd2hpY2gKKy8vIG5lZWQgdG8gYmUgb3BlcmF0ZWQgb24gYXMgdWludDEyOC4KK3N0cnVjdCB1aW50MTI4X3BvZCB7CisgIC8vIE5vdGU6IFRoZSBvcmRlcmluZyBvZiBmaWVsZHMgaXMgZGlmZmVyZW50IHRoYW4gJ2NsYXNzIHVpbnQxMjgnIGJ1dCB0aGUKKyAgLy8gc2FtZSBhcyBpdHMgMi1hcmcgY29uc3RydWN0b3IuICBUaGlzIGVuYWJsZXMgbW9yZSBvYnZpb3VzIGluaXRpYWxpemF0aW9uCisgIC8vIG9mIHN0YXRpYyBpbnN0YW5jZXMsIHdoaWNoIGlzIHRoZSBwcmltYXJ5IHJlYXNvbiBmb3IgdGhpcyBzdHJ1Y3QgaW4gdGhlCisgIC8vIGZpcnN0IHBsYWNlLiAgVGhpcyBkb2VzIG5vdCBzZWVtIHRvIGRlZmVhdCBhbnkgb3B0aW1pemF0aW9ucyB3cnQKKyAgLy8gb3BlcmF0aW9ucyBpbnZvbHZpbmcgdGhpcyBzdHJ1Y3QuCisgIHVpbnQ2NF90IGhpOworICB1aW50NjRfdCBsbzsKK307CisKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gY29uc3QgdWludDEyOF9wb2Qga3VpbnQxMjhtYXg7CisKKy8vIGFsbG93IHVpbnQxMjggdG8gYmUgbG9nZ2VkCitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTI4JiBiKTsKKworLy8gTWV0aG9kcyB0byBhY2Nlc3MgbG93IGFuZCBoaWdoIHBpZWNlcyBvZiAxMjgtYml0IHZhbHVlLgorLy8gRGVmaW5lZCBleHRlcm5hbGx5IGZyb20gdWludDEyOCB0byBmYWNpbGl0YXRlIGNvbnZlcnNpb24KKy8vIHRvIG5hdGl2ZSAxMjgtYml0IHR5cGVzIHdoZW4gY29tcGlsZXJzIHN1cHBvcnQgdGhlbS4KK2lubGluZSB1aW50NjRfdCBVaW50MTI4TG93NjQoY29uc3QgdWludDEyOCYgdikgeyByZXR1cm4gdi5sb187IH0KK2lubGluZSB1aW50NjRfdCBVaW50MTI4SGlnaDY0KGNvbnN0IHVpbnQxMjgmIHYpIHsgcmV0dXJuIHYuaGlfOyB9CisKKy8vIFRPRE86IHBlcmhhcHMgaXQgd291bGQgYmUgbmljZSB0byBoYXZlIGludDEyOCwgYSBzaWduZWQgMTI4LWJpdCB0eXBlPworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgICAgICAgICAgSW1wbGVtZW50YXRpb24gZGV0YWlscyBmb2xsb3cKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHVpbnQxMjgmIGxocywgY29uc3QgdWludDEyOCYgcmhzKSB7CisgIHJldHVybiAoVWludDEyOExvdzY0KGxocykgPT0gVWludDEyOExvdzY0KHJocykgJiYKKyAgICAgICAgICBVaW50MTI4SGlnaDY0KGxocykgPT0gVWludDEyOEhpZ2g2NChyaHMpKTsKK30KK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgdWludDEyOCYgbGhzLCBjb25zdCB1aW50MTI4JiByaHMpIHsKKyAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKK2lubGluZSBVSU5UMTI4X0NPTlNURVhQUiB1aW50MTI4Ojp1aW50MTI4KCkgOiBsb18oMCksIGhpXygwKSB7fQoraW5saW5lIFVJTlQxMjhfQ09OU1RFWFBSIHVpbnQxMjg6OnVpbnQxMjgodWludDY0X3QgdG9wLCB1aW50NjRfdCBib3R0b20pCisgICAgOiBsb18oYm90dG9tKSwgaGlfKHRvcCkge30KK2lubGluZSBVSU5UMTI4X0NPTlNURVhQUiB1aW50MTI4Ojp1aW50MTI4KGNvbnN0IHVpbnQxMjhfcG9kJiB2KQorICAgIDogbG9fKHYubG8pLCBoaV8odi5oaSkge30KK2lubGluZSBVSU5UMTI4X0NPTlNURVhQUiB1aW50MTI4Ojp1aW50MTI4KHVpbnQ2NF90IGJvdHRvbSkKKyAgICA6IGxvXyhib3R0b20pLCBoaV8oMCkge30KKyNpZm5kZWYgU1dJRworaW5saW5lIFVJTlQxMjhfQ09OU1RFWFBSIHVpbnQxMjg6OnVpbnQxMjgodWludDMyX3QgYm90dG9tKQorICAgIDogbG9fKGJvdHRvbSksIGhpXygwKSB7fQoraW5saW5lIFVJTlQxMjhfQ09OU1RFWFBSIHVpbnQxMjg6OnVpbnQxMjgoaW50IGJvdHRvbSkKKyAgICA6IGxvXyhib3R0b20pLCBoaV8oc3RhdGljX2Nhc3Q8aW50NjRfdD4oKGJvdHRvbSA8IDApID8gLTEgOiAwKSkge30KKyNlbmRpZgorCisjdW5kZWYgVUlOVDEyOF9DT05TVEVYUFIKKworaW5saW5lIHZvaWQgdWludDEyODo6SW5pdGlhbGl6ZSh1aW50NjRfdCB0b3AsIHVpbnQ2NF90IGJvdHRvbSkgeworICBoaV8gPSB0b3A7CisgIGxvXyA9IGJvdHRvbTsKK30KKworLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMuCisKKyNkZWZpbmUgQ01QMTI4KG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSBib29sIG9wZXJhdG9yIG9wKGNvbnN0IHVpbnQxMjgmIGxocywgY29uc3QgdWludDEyOCYgcmhzKSB7IFwKKyAgcmV0dXJuIChVaW50MTI4SGlnaDY0KGxocykgPT0gVWludDEyOEhpZ2g2NChyaHMpKSA/ICAgICAgICAgICAgIFwKKyAgICAgIChVaW50MTI4TG93NjQobGhzKSBvcCBVaW50MTI4TG93NjQocmhzKSkgOiAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChVaW50MTI4SGlnaDY0KGxocykgb3AgVWludDEyOEhpZ2g2NChyaHMpKTsgICAgICAgICAgICAgICAgIFwKK30KKworQ01QMTI4KDwpCitDTVAxMjgoPikKK0NNUDEyOCg+PSkKK0NNUDEyOCg8PSkKKworI3VuZGVmIENNUDEyOAorCisvLyBVbmFyeSBvcGVyYXRvcnMKKworaW5saW5lIHVpbnQxMjggb3BlcmF0b3ItKGNvbnN0IHVpbnQxMjgmIHZhbCkgeworICBjb25zdCB1aW50NjRfdCBoaV9mbGlwID0gflVpbnQxMjhIaWdoNjQodmFsKTsKKyAgY29uc3QgdWludDY0X3QgbG9fZmxpcCA9IH5VaW50MTI4TG93NjQodmFsKTsKKyAgY29uc3QgdWludDY0X3QgbG9fYWRkID0gbG9fZmxpcCArIDE7CisgIGlmIChsb19hZGQgPCBsb19mbGlwKSB7CisgICAgcmV0dXJuIHVpbnQxMjgoaGlfZmxpcCArIDEsIGxvX2FkZCk7CisgIH0KKyAgcmV0dXJuIHVpbnQxMjgoaGlfZmxpcCwgbG9fYWRkKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhKGNvbnN0IHVpbnQxMjgmIHZhbCkgeworICByZXR1cm4gIVVpbnQxMjhIaWdoNjQodmFsKSAmJiAhVWludDEyOExvdzY0KHZhbCk7Cit9CisKKy8vIExvZ2ljYWwgb3BlcmF0b3JzLgorCitpbmxpbmUgdWludDEyOCBvcGVyYXRvcn4oY29uc3QgdWludDEyOCYgdmFsKSB7CisgIHJldHVybiB1aW50MTI4KH5VaW50MTI4SGlnaDY0KHZhbCksIH5VaW50MTI4TG93NjQodmFsKSk7Cit9CisKKyNkZWZpbmUgTE9HSUMxMjgob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSB1aW50MTI4IG9wZXJhdG9yIG9wKGNvbnN0IHVpbnQxMjgmIGxocywgY29uc3QgdWludDEyOCYgcmhzKSB7IFwKKyAgcmV0dXJuIHVpbnQxMjgoVWludDEyOEhpZ2g2NChsaHMpIG9wIFVpbnQxMjhIaWdoNjQocmhzKSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgVWludDEyOExvdzY0KGxocykgb3AgVWludDEyOExvdzY0KHJocykpOyAgICAgICAgICAgIFwKK30KKworTE9HSUMxMjgofCkKK0xPR0lDMTI4KCYpCitMT0dJQzEyOCheKQorCisjdW5kZWYgTE9HSUMxMjgKKworI2RlZmluZSBMT0dJQ0FTU0lHTjEyOChvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSB1aW50MTI4JiB1aW50MTI4OjpvcGVyYXRvciBvcChjb25zdCB1aW50MTI4JiBvdGhlcikgeyBcCisgIGhpXyBvcCBvdGhlci5oaV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsb18gb3Agb3RoZXIubG9fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuICp0aGlzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0xPR0lDQVNTSUdOMTI4KHw9KQorTE9HSUNBU1NJR04xMjgoJj0pCitMT0dJQ0FTU0lHTjEyOChePSkKKworI3VuZGVmIExPR0lDQVNTSUdOMTI4CisKKy8vIFNoaWZ0IG9wZXJhdG9ycy4KKworaW5saW5lIHVpbnQxMjggb3BlcmF0b3I8PChjb25zdCB1aW50MTI4JiB2YWwsIGludCBhbW91bnQpIHsKKyAgLy8gdWludDY0IHNoaWZ0cyBvZiA+PSA2NCBhcmUgdW5kZWZpbmVkLCBzbyB3ZSB3aWxsIG5lZWQgc29tZSBzcGVjaWFsLWNhc2luZy4KKyAgaWYgKGFtb3VudCA8IDY0KSB7CisgICAgaWYgKGFtb3VudCA9PSAwKSB7CisgICAgICByZXR1cm4gdmFsOworICAgIH0KKyAgICB1aW50NjRfdCBuZXdfaGkgPSAoVWludDEyOEhpZ2g2NCh2YWwpIDw8IGFtb3VudCkgfAorICAgICAgICAgICAgICAgICAgICAgIChVaW50MTI4TG93NjQodmFsKSA+PiAoNjQgLSBhbW91bnQpKTsKKyAgICB1aW50NjRfdCBuZXdfbG8gPSBVaW50MTI4TG93NjQodmFsKSA8PCBhbW91bnQ7CisgICAgcmV0dXJuIHVpbnQxMjgobmV3X2hpLCBuZXdfbG8pOworICB9IGVsc2UgaWYgKGFtb3VudCA8IDEyOCkgeworICAgIHJldHVybiB1aW50MTI4KFVpbnQxMjhMb3c2NCh2YWwpIDw8IChhbW91bnQgLSA2NCksIDApOworICB9IGVsc2UgeworICAgIHJldHVybiB1aW50MTI4KDAsIDApOworICB9Cit9CisKK2lubGluZSB1aW50MTI4IG9wZXJhdG9yPj4oY29uc3QgdWludDEyOCYgdmFsLCBpbnQgYW1vdW50KSB7CisgIC8vIHVpbnQ2NCBzaGlmdHMgb2YgPj0gNjQgYXJlIHVuZGVmaW5lZCwgc28gd2Ugd2lsbCBuZWVkIHNvbWUgc3BlY2lhbC1jYXNpbmcuCisgIGlmIChhbW91bnQgPCA2NCkgeworICAgIGlmIChhbW91bnQgPT0gMCkgeworICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisgICAgdWludDY0X3QgbmV3X2hpID0gVWludDEyOEhpZ2g2NCh2YWwpID4+IGFtb3VudDsKKyAgICB1aW50NjRfdCBuZXdfbG8gPSAoVWludDEyOExvdzY0KHZhbCkgPj4gYW1vdW50KSB8CisgICAgICAgICAgICAgICAgICAgICAgKFVpbnQxMjhIaWdoNjQodmFsKSA8PCAoNjQgLSBhbW91bnQpKTsKKyAgICByZXR1cm4gdWludDEyOChuZXdfaGksIG5ld19sbyk7CisgIH0gZWxzZSBpZiAoYW1vdW50IDwgMTI4KSB7CisgICAgcmV0dXJuIHVpbnQxMjgoMCwgVWludDEyOEhpZ2g2NCh2YWwpID4+IChhbW91bnQgLSA2NCkpOworICB9IGVsc2UgeworICAgIHJldHVybiB1aW50MTI4KDAsIDApOworICB9Cit9CisKK2lubGluZSB1aW50MTI4JiB1aW50MTI4OjpvcGVyYXRvcjw8PShpbnQgYW1vdW50KSB7CisgIC8vIHVpbnQ2NCBzaGlmdHMgb2YgPj0gNjQgYXJlIHVuZGVmaW5lZCwgc28gd2Ugd2lsbCBuZWVkIHNvbWUgc3BlY2lhbC1jYXNpbmcuCisgIGlmIChhbW91bnQgPCA2NCkgeworICAgIGlmIChhbW91bnQgIT0gMCkgeworICAgICAgaGlfID0gKGhpXyA8PCBhbW91bnQpIHwgKGxvXyA+PiAoNjQgLSBhbW91bnQpKTsKKyAgICAgIGxvXyA9IGxvXyA8PCBhbW91bnQ7CisgICAgfQorICB9IGVsc2UgaWYgKGFtb3VudCA8IDEyOCkgeworICAgIGhpXyA9IGxvXyA8PCAoYW1vdW50IC0gNjQpOworICAgIGxvXyA9IDA7CisgIH0gZWxzZSB7CisgICAgaGlfID0gMDsKKyAgICBsb18gPSAwOworICB9CisgIHJldHVybiAqdGhpczsKK30KKworaW5saW5lIHVpbnQxMjgmIHVpbnQxMjg6Om9wZXJhdG9yPj49KGludCBhbW91bnQpIHsKKyAgLy8gdWludDY0IHNoaWZ0cyBvZiA+PSA2NCBhcmUgdW5kZWZpbmVkLCBzbyB3ZSB3aWxsIG5lZWQgc29tZSBzcGVjaWFsLWNhc2luZy4KKyAgaWYgKGFtb3VudCA8IDY0KSB7CisgICAgaWYgKGFtb3VudCAhPSAwKSB7CisgICAgICBsb18gPSAobG9fID4+IGFtb3VudCkgfCAoaGlfIDw8ICg2NCAtIGFtb3VudCkpOworICAgICAgaGlfID0gaGlfID4+IGFtb3VudDsKKyAgICB9CisgIH0gZWxzZSBpZiAoYW1vdW50IDwgMTI4KSB7CisgICAgbG9fID0gaGlfID4+IChhbW91bnQgLSA2NCk7CisgICAgaGlfID0gMDsKKyAgfSBlbHNlIHsKKyAgICBsb18gPSAwOworICAgIGhpXyA9IDA7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCitpbmxpbmUgdWludDEyOCBvcGVyYXRvcisoY29uc3QgdWludDEyOCYgbGhzLCBjb25zdCB1aW50MTI4JiByaHMpIHsKKyAgcmV0dXJuIHVpbnQxMjgobGhzKSArPSByaHM7Cit9CisKK2lubGluZSB1aW50MTI4IG9wZXJhdG9yLShjb25zdCB1aW50MTI4JiBsaHMsIGNvbnN0IHVpbnQxMjgmIHJocykgeworICByZXR1cm4gdWludDEyOChsaHMpIC09IHJoczsKK30KKworaW5saW5lIHVpbnQxMjggb3BlcmF0b3IqKGNvbnN0IHVpbnQxMjgmIGxocywgY29uc3QgdWludDEyOCYgcmhzKSB7CisgIHJldHVybiB1aW50MTI4KGxocykgKj0gcmhzOworfQorCitpbmxpbmUgdWludDEyOCBvcGVyYXRvci8oY29uc3QgdWludDEyOCYgbGhzLCBjb25zdCB1aW50MTI4JiByaHMpIHsKKyAgcmV0dXJuIHVpbnQxMjgobGhzKSAvPSByaHM7Cit9CisKK2lubGluZSB1aW50MTI4IG9wZXJhdG9yJShjb25zdCB1aW50MTI4JiBsaHMsIGNvbnN0IHVpbnQxMjgmIHJocykgeworICByZXR1cm4gdWludDEyOChsaHMpICU9IHJoczsKK30KKworaW5saW5lIHVpbnQxMjgmIHVpbnQxMjg6Om9wZXJhdG9yKz0oY29uc3QgdWludDEyOCYgYikgeworICBoaV8gKz0gYi5oaV87CisgIHVpbnQ2NF90IGxvbG8gPSBsb18gKyBiLmxvXzsKKyAgaWYgKGxvbG8gPCBsb18pCisgICAgKytoaV87CisgIGxvXyA9IGxvbG87CisgIHJldHVybiAqdGhpczsKK30KKworaW5saW5lIHVpbnQxMjgmIHVpbnQxMjg6Om9wZXJhdG9yLT0oY29uc3QgdWludDEyOCYgYikgeworICBoaV8gLT0gYi5oaV87CisgIGlmIChiLmxvXyA+IGxvXykKKyAgICAtLWhpXzsKKyAgbG9fIC09IGIubG9fOworICByZXR1cm4gKnRoaXM7Cit9CisKK2lubGluZSB1aW50MTI4JiB1aW50MTI4OjpvcGVyYXRvcio9KGNvbnN0IHVpbnQxMjgmIGIpIHsKKyAgdWludDY0X3QgYTk2ID0gaGlfID4+IDMyOworICB1aW50NjRfdCBhNjQgPSBoaV8gJiAweGZmZmZmZmZmdTsKKyAgdWludDY0X3QgYTMyID0gbG9fID4+IDMyOworICB1aW50NjRfdCBhMDAgPSBsb18gJiAweGZmZmZmZmZmdTsKKyAgdWludDY0X3QgYjk2ID0gYi5oaV8gPj4gMzI7CisgIHVpbnQ2NF90IGI2NCA9IGIuaGlfICYgMHhmZmZmZmZmZnU7CisgIHVpbnQ2NF90IGIzMiA9IGIubG9fID4+IDMyOworICB1aW50NjRfdCBiMDAgPSBiLmxvXyAmIDB4ZmZmZmZmZmZ1OworICAvLyBtdWx0aXBseSBbYTk2IC4uIGEwMF0geCBbYjk2IC4uIGIwMF0KKyAgLy8gdGVybXMgaGlnaGVyIHRoYW4gYzk2IGRpc2FwcGVhciBvZmYgdGhlIGhpZ2ggc2lkZQorICAvLyB0ZXJtcyBjOTYgYW5kIGM2NCBhcmUgc2FmZSB0byBpZ25vcmUgY2FycnkgYml0CisgIHVpbnQ2NF90IGM5NiA9IGE5NiAqIGIwMCArIGE2NCAqIGIzMiArIGEzMiAqIGI2NCArIGEwMCAqIGI5NjsKKyAgdWludDY0X3QgYzY0ID0gYTY0ICogYjAwICsgYTMyICogYjMyICsgYTAwICogYjY0OworICB0aGlzLT5oaV8gPSAoYzk2IDw8IDMyKSArIGM2NDsKKyAgdGhpcy0+bG9fID0gMDsKKyAgLy8gYWRkIHRlcm1zIGFmdGVyIHRoaXMgb25lIGF0IGEgdGltZSB0byBjYXB0dXJlIGNhcnJ5CisgICp0aGlzICs9IHVpbnQxMjgoYTMyICogYjAwKSA8PCAzMjsKKyAgKnRoaXMgKz0gdWludDEyOChhMDAgKiBiMzIpIDw8IDMyOworICAqdGhpcyArPSBhMDAgKiBiMDA7CisgIHJldHVybiAqdGhpczsKK30KKworaW5saW5lIHVpbnQxMjggdWludDEyODo6b3BlcmF0b3IrKyhpbnQpIHsKKyAgdWludDEyOCB0bXAoKnRoaXMpOworICAqdGhpcyArPSAxOworICByZXR1cm4gdG1wOworfQorCitpbmxpbmUgdWludDEyOCB1aW50MTI4OjpvcGVyYXRvci0tKGludCkgeworICB1aW50MTI4IHRtcCgqdGhpcyk7CisgICp0aGlzIC09IDE7CisgIHJldHVybiB0bXA7Cit9CisKK2lubGluZSB1aW50MTI4JiB1aW50MTI4OjpvcGVyYXRvcisrKCkgeworICAqdGhpcyArPSAxOworICByZXR1cm4gKnRoaXM7Cit9CisKK2lubGluZSB1aW50MTI4JiB1aW50MTI4OjpvcGVyYXRvci0tKCkgeworICAqdGhpcyAtPSAxOworICByZXR1cm4gKnRoaXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19JTlQxMjhfSF8KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4X3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjhfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE2MzRmMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNTExIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjguaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworVEVTVChJbnQxMjgsIEFsbFRlc3RzKSB7CisgIHVpbnQxMjggemVybygwKTsKKyAgdWludDEyOCBvbmUoMSk7CisgIHVpbnQxMjggb25lXzJhcmcoMCwgMSk7CisgIHVpbnQxMjggdHdvKDAsIDIpOworICB1aW50MTI4IHRocmVlKDAsIDMpOworICB1aW50MTI4IGJpZygyMDAwLCAyKTsKKyAgdWludDEyOCBiaWdfbWludXNfb25lKDIwMDAsIDEpOworICB1aW50MTI4IGJpZ2dlcigyMDAxLCAxKTsKKyAgdWludDEyOCBiaWdnZXN0KGt1aW50MTI4bWF4KTsKKyAgdWludDEyOCBoaWdoX2xvdygxLCAwKTsKKyAgdWludDEyOCBsb3dfaGlnaCgwLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpOworICBFWFBFQ1RfTFQob25lLCB0d28pOworICBFWFBFQ1RfR1QodHdvLCBvbmUpOworICBFWFBFQ1RfTFQob25lLCBiaWcpOworICBFWFBFQ1RfTFQob25lLCBiaWcpOworICBFWFBFQ1RfRVEob25lLCBvbmVfMmFyZyk7CisgIEVYUEVDVF9ORShvbmUsIHR3byk7CisgIEVYUEVDVF9HVChiaWcsIG9uZSk7CisgIEVYUEVDVF9HRShiaWcsIHR3byk7CisgIEVYUEVDVF9HRShiaWcsIGJpZ19taW51c19vbmUpOworICBFWFBFQ1RfR1QoYmlnLCBiaWdfbWludXNfb25lKTsKKyAgRVhQRUNUX0xUKGJpZ19taW51c19vbmUsIGJpZyk7CisgIEVYUEVDVF9MRShiaWdfbWludXNfb25lLCBiaWcpOworICBFWFBFQ1RfTkUoYmlnX21pbnVzX29uZSwgYmlnKTsKKyAgRVhQRUNUX0xUKGJpZywgYmlnZ2VzdCk7CisgIEVYUEVDVF9MRShiaWcsIGJpZ2dlc3QpOworICBFWFBFQ1RfR1QoYmlnZ2VzdCwgYmlnKTsKKyAgRVhQRUNUX0dFKGJpZ2dlc3QsIGJpZyk7CisgIEVYUEVDVF9FUShiaWcsIH5+YmlnKTsKKyAgRVhQRUNUX0VRKG9uZSwgb25lIHwgb25lKTsKKyAgRVhQRUNUX0VRKGJpZywgYmlnIHwgYmlnKTsKKyAgRVhQRUNUX0VRKG9uZSwgb25lIHwgemVybyk7CisgIEVYUEVDVF9FUShvbmUsIG9uZSAmIG9uZSk7CisgIEVYUEVDVF9FUShiaWcsIGJpZyAmIGJpZyk7CisgIEVYUEVDVF9FUSh6ZXJvLCBvbmUgJiB6ZXJvKTsKKyAgRVhQRUNUX0VRKHplcm8sIGJpZyAmIH5iaWcpOworICBFWFBFQ1RfRVEoemVybywgb25lIF4gb25lKTsKKyAgRVhQRUNUX0VRKHplcm8sIGJpZyBeIGJpZyk7CisgIEVYUEVDVF9FUShvbmUsIG9uZSBeIHplcm8pOworCisgIC8vIFNoaWZ0IG9wZXJhdG9ycy4KKyAgRVhQRUNUX0VRKGJpZywgYmlnIDw8IDApOworICBFWFBFQ1RfRVEoYmlnLCBiaWcgPj4gMCk7CisgIEVYUEVDVF9HVChiaWcgPDwgMSwgYmlnKTsKKyAgRVhQRUNUX0xUKGJpZyA+PiAxLCBiaWcpOworICBFWFBFQ1RfRVEoYmlnLCAoYmlnIDw8IDEwKSA+PiAxMCk7CisgIEVYUEVDVF9FUShiaWcsIChiaWcgPj4gMSkgPDwgMSk7CisgIEVYUEVDVF9FUShvbmUsIChvbmUgPDwgODApID4+IDgwKTsKKyAgRVhQRUNUX0VRKHplcm8sIChvbmUgPj4gODApIDw8IDgwKTsKKyAgRVhQRUNUX0VRKHplcm8sIGJpZyA+PiAxMjgpOworICBFWFBFQ1RfRVEoemVybywgYmlnIDw8IDEyOCk7CisKKyAgLy8gU2hpZnQgYXNzaWdubWVudHMuCisgIHVpbnQxMjggYmlnX2NvcHkgPSBiaWc7CisgIEVYUEVDVF9FUShiaWcgPDwgMCwgYmlnX2NvcHkgPDw9IDApOworICBiaWdfY29weSA9IGJpZzsKKyAgRVhQRUNUX0VRKGJpZyA+PiAwLCBiaWdfY29weSA+Pj0gMCk7CisgIGJpZ19jb3B5ID0gYmlnOworICBFWFBFQ1RfRVEoYmlnIDw8IDEsIGJpZ19jb3B5IDw8PSAxKTsKKyAgYmlnX2NvcHkgPSBiaWc7CisgIEVYUEVDVF9FUShiaWcgPj4gMSwgYmlnX2NvcHkgPj49IDEpOworICBiaWdfY29weSA9IGJpZzsKKyAgRVhQRUNUX0VRKGJpZyA8PCAxMCwgYmlnX2NvcHkgPDw9IDEwKTsKKyAgYmlnX2NvcHkgPSBiaWc7CisgIEVYUEVDVF9FUShiaWcgPj4gMTAsIGJpZ19jb3B5ID4+PSAxMCk7CisgIGJpZ19jb3B5ID0gYmlnOworICBFWFBFQ1RfRVEoYmlnIDw8IDY0LCBiaWdfY29weSA8PD0gNjQpOworICBiaWdfY29weSA9IGJpZzsKKyAgRVhQRUNUX0VRKGJpZyA+PiA2NCwgYmlnX2NvcHkgPj49IDY0KTsKKyAgYmlnX2NvcHkgPSBiaWc7CisgIEVYUEVDVF9FUShiaWcgPDwgNzMsIGJpZ19jb3B5IDw8PSA3Myk7CisgIGJpZ19jb3B5ID0gYmlnOworICBFWFBFQ1RfRVEoYmlnID4+IDczLCBiaWdfY29weSA+Pj0gNzMpOworICBiaWdfY29weSA9IGJpZzsKKyAgRVhQRUNUX0VRKGJpZyA8PCAxMjgsIGJpZ19jb3B5IDw8PSAxMjgpOworICBiaWdfY29weSA9IGJpZzsKKyAgRVhQRUNUX0VRKGJpZyA+PiAxMjgsIGJpZ19jb3B5ID4+PSAxMjgpOworCisgIEVYUEVDVF9FUShVaW50MTI4SGlnaDY0KGJpZ2dlc3QpLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpOworICBFWFBFQ1RfRVEoVWludDEyOExvdzY0KGJpZ2dlc3QpLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpOworICBFWFBFQ1RfRVEoemVybyArIG9uZSwgb25lKTsKKyAgRVhQRUNUX0VRKG9uZSArIG9uZSwgdHdvKTsKKyAgRVhQRUNUX0VRKGJpZ19taW51c19vbmUgKyBvbmUsIGJpZyk7CisgIEVYUEVDVF9FUShvbmUgLSBvbmUsIHplcm8pOworICBFWFBFQ1RfRVEob25lIC0gemVybywgb25lKTsKKyAgRVhQRUNUX0VRKHplcm8gLSBvbmUsIGJpZ2dlc3QpOworICBFWFBFQ1RfRVEoYmlnIC0gYmlnLCB6ZXJvKTsKKyAgRVhQRUNUX0VRKGJpZyAtIG9uZSwgYmlnX21pbnVzX29uZSk7CisgIEVYUEVDVF9FUShiaWcgKyBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCksIGJpZ2dlcik7CisgIEVYUEVDVF9FUShiaWdnZXN0ICsgMSwgemVybyk7CisgIEVYUEVDVF9FUSh6ZXJvIC0gMSwgYmlnZ2VzdCk7CisgIEVYUEVDVF9FUShoaWdoX2xvdyAtIG9uZSwgbG93X2hpZ2gpOworICBFWFBFQ1RfRVEobG93X2hpZ2ggKyBvbmUsIGhpZ2hfbG93KTsKKyAgRVhQRUNUX0VRKFVpbnQxMjhIaWdoNjQoKHVpbnQxMjgoMSkgPDwgNjQpIC0gMSksIDApOworICBFWFBFQ1RfRVEoVWludDEyOExvdzY0KCh1aW50MTI4KDEpIDw8IDY0KSAtIDEpLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpOworICBFWFBFQ1RfVFJVRSghIW9uZSk7CisgIEVYUEVDVF9UUlVFKCEhaGlnaF9sb3cpOworICBFWFBFQ1RfRkFMU0UoISF6ZXJvKTsKKyAgRVhQRUNUX0ZBTFNFKCFvbmUpOworICBFWFBFQ1RfRkFMU0UoIWhpZ2hfbG93KTsKKyAgRVhQRUNUX1RSVUUoIXplcm8pOworICBFWFBFQ1RfVFJVRSh6ZXJvID09IDApOworICBFWFBFQ1RfRkFMU0UoemVybyAhPSAwKTsKKyAgRVhQRUNUX0ZBTFNFKG9uZSA9PSAwKTsKKyAgRVhQRUNUX1RSVUUob25lICE9IDApOworCisgIHVpbnQxMjggdGVzdCA9IHplcm87CisgIEVYUEVDVF9FUSgrK3Rlc3QsIG9uZSk7CisgIEVYUEVDVF9FUSh0ZXN0LCBvbmUpOworICBFWFBFQ1RfRVEodGVzdCsrLCBvbmUpOworICBFWFBFQ1RfRVEodGVzdCwgdHdvKTsKKyAgRVhQRUNUX0VRKHRlc3QgLT0gMiwgemVybyk7CisgIEVYUEVDVF9FUSh0ZXN0LCB6ZXJvKTsKKyAgRVhQRUNUX0VRKHRlc3QgKz0gMiwgdHdvKTsKKyAgRVhQRUNUX0VRKHRlc3QsIHR3byk7CisgIEVYUEVDVF9FUSgtLXRlc3QsIG9uZSk7CisgIEVYUEVDVF9FUSh0ZXN0LCBvbmUpOworICBFWFBFQ1RfRVEodGVzdC0tLCBvbmUpOworICBFWFBFQ1RfRVEodGVzdCwgemVybyk7CisgIEVYUEVDVF9FUSh0ZXN0IHw9IHRocmVlLCB0aHJlZSk7CisgIEVYUEVDVF9FUSh0ZXN0ICY9IG9uZSwgb25lKTsKKyAgRVhQRUNUX0VRKHRlc3QgXj0gdGhyZWUsIHR3byk7CisgIEVYUEVDVF9FUSh0ZXN0ID4+PSAxLCBvbmUpOworICBFWFBFQ1RfRVEodGVzdCA8PD0gMSwgdHdvKTsKKworICBFWFBFQ1RfRVEoYmlnLCAtKC1iaWcpKTsKKyAgRVhQRUNUX0VRKHR3bywgLSgoLW9uZSkgLSAxKSk7CisgIEVYUEVDVF9FUShrdWludDEyOG1heCwgLW9uZSk7CisgIEVYUEVDVF9FUSh6ZXJvLCAtemVybyk7CisKKyAgR09PR0xFX0xPRyhJTkZPKSA8PCBvbmU7CisgIEdPT0dMRV9MT0coSU5GTykgPDwgYmlnX21pbnVzX29uZTsKK30KKworVEVTVChJbnQxMjgsIFBvZFRlc3RzKSB7CisgIHVpbnQxMjhfcG9kIHBvZCA9IHsgMTIzNDUsIDY3ODkwIH07CisgIHVpbnQxMjggZnJvbV9wb2QocG9kKTsKKyAgRVhQRUNUX0VRKDEyMzQ1LCBVaW50MTI4SGlnaDY0KGZyb21fcG9kKSk7CisgIEVYUEVDVF9FUSg2Nzg5MCwgVWludDEyOExvdzY0KGZyb21fcG9kKSk7CisKKyAgdWludDEyOCB6ZXJvKDApOworICB1aW50MTI4X3BvZCB6ZXJvX3BvZCA9IHswLCAwfTsKKyAgdWludDEyOCBvbmUoMSk7CisgIHVpbnQxMjhfcG9kIG9uZV9wb2QgPSB7MCwgMX07CisgIHVpbnQxMjggdHdvKDIpOworICB1aW50MTI4X3BvZCB0d29fcG9kID0gezAsIDJ9OworICB1aW50MTI4IHRocmVlKDMpOworICB1aW50MTI4X3BvZCB0aHJlZV9wb2QgPSB7MCwgM307CisgIHVpbnQxMjggYmlnKDEsIDApOworICB1aW50MTI4X3BvZCBiaWdfcG9kID0gezEsIDB9OworCisgIEVYUEVDVF9FUSh6ZXJvLCB6ZXJvX3BvZCk7CisgIEVYUEVDVF9FUSh6ZXJvX3BvZCwgemVybyk7CisgIEVYUEVDVF9FUSh6ZXJvX3BvZCwgemVyb19wb2QpOworICBFWFBFQ1RfRVEob25lLCBvbmVfcG9kKTsKKyAgRVhQRUNUX0VRKG9uZV9wb2QsIG9uZSk7CisgIEVYUEVDVF9FUShvbmVfcG9kLCBvbmVfcG9kKTsKKyAgRVhQRUNUX0VRKHR3bywgdHdvX3BvZCk7CisgIEVYUEVDVF9FUSh0d29fcG9kLCB0d28pOworICBFWFBFQ1RfRVEodHdvX3BvZCwgdHdvX3BvZCk7CisKKyAgRVhQRUNUX05FKG9uZSwgdHdvX3BvZCk7CisgIEVYUEVDVF9ORShvbmVfcG9kLCB0d28pOworICBFWFBFQ1RfTkUob25lX3BvZCwgdHdvX3BvZCk7CisKKyAgRVhQRUNUX0xUKG9uZSwgdHdvX3BvZCk7CisgIEVYUEVDVF9MVChvbmVfcG9kLCB0d28pOworICBFWFBFQ1RfTFQob25lX3BvZCwgdHdvX3BvZCk7CisgIEVYUEVDVF9MRShvbmUsIG9uZV9wb2QpOworICBFWFBFQ1RfTEUob25lX3BvZCwgb25lKTsKKyAgRVhQRUNUX0xFKG9uZV9wb2QsIG9uZV9wb2QpOworICBFWFBFQ1RfTEUob25lLCB0d29fcG9kKTsKKyAgRVhQRUNUX0xFKG9uZV9wb2QsIHR3byk7CisgIEVYUEVDVF9MRShvbmVfcG9kLCB0d29fcG9kKTsKKworICBFWFBFQ1RfR1QodHdvLCBvbmVfcG9kKTsKKyAgRVhQRUNUX0dUKHR3b19wb2QsIG9uZSk7CisgIEVYUEVDVF9HVCh0d29fcG9kLCBvbmVfcG9kKTsKKyAgRVhQRUNUX0dFKHR3bywgdHdvX3BvZCk7CisgIEVYUEVDVF9HRSh0d29fcG9kLCB0d28pOworICBFWFBFQ1RfR0UodHdvX3BvZCwgdHdvX3BvZCk7CisgIEVYUEVDVF9HRSh0d28sIG9uZV9wb2QpOworICBFWFBFQ1RfR0UodHdvX3BvZCwgb25lKTsKKyAgRVhQRUNUX0dFKHR3b19wb2QsIG9uZV9wb2QpOworCisgIEVYUEVDVF9FUSh0aHJlZSwgb25lIHwgdHdvX3BvZCk7CisgIEVYUEVDVF9FUSh0aHJlZSwgb25lX3BvZCB8IHR3byk7CisgIEVYUEVDVF9FUSh0aHJlZSwgb25lX3BvZCB8IHR3b19wb2QpOworICBFWFBFQ1RfRVEob25lLCB0aHJlZSAmIG9uZV9wb2QpOworICBFWFBFQ1RfRVEob25lLCB0aHJlZV9wb2QgJiBvbmUpOworICBFWFBFQ1RfRVEob25lLCB0aHJlZV9wb2QgJiBvbmVfcG9kKTsKKyAgRVhQRUNUX0VRKHR3bywgdGhyZWUgXiBvbmVfcG9kKTsKKyAgRVhQRUNUX0VRKHR3bywgdGhyZWVfcG9kIF4gb25lKTsKKyAgRVhQRUNUX0VRKHR3bywgdGhyZWVfcG9kIF4gb25lX3BvZCk7CisgIEVYUEVDVF9FUSh0d28sIHRocmVlICYgKH5vbmUpKTsKKyAgRVhQRUNUX0VRKHRocmVlLCB+fnRocmVlKTsKKworICBFWFBFQ1RfRVEodHdvLCB0d29fcG9kIDw8IDApOworICBFWFBFQ1RfRVEodHdvLCBvbmVfcG9kIDw8IDEpOworICBFWFBFQ1RfRVEoYmlnLCBvbmVfcG9kIDw8IDY0KTsKKyAgRVhQRUNUX0VRKHplcm8sIG9uZV9wb2QgPDwgMTI4KTsKKyAgRVhQRUNUX0VRKHR3bywgdHdvX3BvZCA+PiAwKTsKKyAgRVhQRUNUX0VRKG9uZSwgdHdvX3BvZCA+PiAxKTsKKyAgRVhQRUNUX0VRKG9uZSwgYmlnX3BvZCA+PiA2NCk7CisKKyAgRVhQRUNUX0VRKG9uZSwgemVybyArIG9uZV9wb2QpOworICBFWFBFQ1RfRVEob25lLCB6ZXJvX3BvZCArIG9uZSk7CisgIEVYUEVDVF9FUShvbmUsIHplcm9fcG9kICsgb25lX3BvZCk7CisgIEVYUEVDVF9FUShvbmUsIHR3byAtIG9uZV9wb2QpOworICBFWFBFQ1RfRVEob25lLCB0d29fcG9kIC0gb25lKTsKKyAgRVhQRUNUX0VRKG9uZSwgdHdvX3BvZCAtIG9uZV9wb2QpOworfQorCitURVNUKEludDEyOCwgT3BlcmF0b3JBc3NpZ25SZXR1cm5SZWYpIHsKKyAgdWludDEyOCB2KDEpOworICAodiArPSA0KSAtPSAzOworICBFWFBFQ1RfRVEoMiwgdik7Cit9CisKK1RFU1QoSW50MTI4LCBNdWx0aXBseSkgeworICB1aW50MTI4IGEsIGIsIGM7CisKKyAgLy8gWmVybyB0ZXN0LgorICBhID0gMDsKKyAgYiA9IDA7CisgIGMgPSBhICogYjsKKyAgRVhQRUNUX0VRKDAsIGMpOworCisgIC8vIE1heCBjYXJyaWVzLgorICBhID0gdWludDEyOCgwKSAtIDE7CisgIGIgPSB1aW50MTI4KDApIC0gMTsKKyAgYyA9IGEgKiBiOworICBFWFBFQ1RfRVEoMSwgYyk7CisKKyAgLy8gU2VsZi1vcGVyYXRpb24gd2l0aCBtYXggY2Fycmllcy4KKyAgYyA9IHVpbnQxMjgoMCkgLSAxOworICBjICo9IGM7CisgIEVYUEVDVF9FUSgxLCBjKTsKKworICAvLyAxLWJpdCB4IDEtYml0LgorICBmb3IgKGludCBpID0gMDsgaSA8IDY0OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDY0OyArK2opIHsKKyAgICAgIGEgPSB1aW50MTI4KDEpIDw8IGk7CisgICAgICBiID0gdWludDEyOCgxKSA8PCBqOworICAgICAgYyA9IGEgKiBiOworICAgICAgRVhQRUNUX0VRKHVpbnQxMjgoMSkgPDwgKGkraiksIGMpOworICAgIH0KKyAgfQorCisgIC8vIFZlcmlmaWVkIHdpdGggZGMuCisgIGEgPSB1aW50MTI4KHVpbnQ2NF90ezB4ZmZmZmVlZWVkZGRkY2NjY3V9LCB1aW50NjRfdHsweGJiYmJhYWFhOTk5OTg4ODh1fSk7CisgIGIgPSB1aW50MTI4KHVpbnQ2NF90ezB4Nzc3NzY2NjY1NTU1NDQ0NHV9LCB1aW50NjRfdHsweDMzMzMyMjIyMTExMTAwMDB1fSk7CisgIGMgPSBhICogYjsKKyAgRVhQRUNUX0VRKAorICAgICAgdWludDEyOCh1aW50NjRfdHsweDUzMEVEQTc0MUM3MUQ0QzN1fSwgdWludDY0X3R7MHhCRjI1OTc1MzE5MDgwMDAwdX0pLCBjKTsKKyAgRVhQRUNUX0VRKDAsIGMgLSBiICogYSk7CisgIEVYUEVDVF9FUShhICogYSAtIGIgKiBiLCAoYSArIGIpICogKGEgLSBiKSk7CisKKyAgLy8gVmVyaWZpZWQgd2l0aCBkYy4KKyAgYSA9IHVpbnQxMjgodWludDY0X3R7MHgwMTIzNDU2Nzg5YWJjZGVmdX0sIHVpbnQ2NF90ezB4ZmVkY2JhOTg3NjU0MzIxMHV9KTsKKyAgYiA9IHVpbnQxMjgodWludDY0X3R7MHgwMjQ2OGFjZTEzNTc5YmRmdX0sIHVpbnQ2NF90ezB4ZmRiOTc1MzFlY2E4NjQyMHV9KTsKKyAgYyA9IGEgKiBiOworICBFWFBFQ1RfRVEoCisgICAgICB1aW50MTI4KHVpbnQ2NF90ezB4OTdhODdmNGYyNjFiYTNmMnV9LCB1aW50NjRfdHsweDM0MmQwYmJmNDg5NDgyMDB1fSksIGMpOworICBFWFBFQ1RfRVEoMCwgYyAtIGIgKiBhKTsKKyAgRVhQRUNUX0VRKGEqYSAtIGIqYiwgKGErYikgKiAoYS1iKSk7Cit9CisKK1RFU1QoSW50MTI4LCBBbGlhc1Rlc3RzKSB7CisgIHVpbnQxMjggeDEoMSwgMik7CisgIHVpbnQxMjggeDIoMiwgNCk7CisgIHgxICs9IHgxOworICBFWFBFQ1RfRVEoeDIsIHgxKTsKKworICB1aW50MTI4IHgzKDEsIHN0YXRpY19jYXN0PHVpbnQ2NF90PigxKSA8PCA2Myk7CisgIHVpbnQxMjggeDQoMywgMCk7CisgIHgzICs9IHgzOworICBFWFBFQ1RfRVEoeDQsIHgzKTsKK30KKworI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCitURVNUKEludDEyOCwgRGl2aWRlQnlaZXJvQ2hlY2tGYWlscykgeworICB1aW50MTI4IGEgPSAwOworICB1aW50MTI4IGIgPSAwOworICBFWFBFQ1RfREVBVEgoYSAvIGIsICJEaXZpc2lvbiBvciBtb2QgYnkgemVybzoiKTsKKyAgYSA9IDEyMzsKKyAgRVhQRUNUX0RFQVRIKGEgLyBiLCAiRGl2aXNpb24gb3IgbW9kIGJ5IHplcm86Iik7Cit9CisKK1RFU1QoSW50MTI4LCBNb2RCeVplcm9DaGVja0ZhaWxzKSB7CisgIHVpbnQxMjggYSA9IDA7CisgIHVpbnQxMjggYiA9IDA7CisgIEVYUEVDVF9ERUFUSChhICUgYiwgIkRpdmlzaW9uIG9yIG1vZCBieSB6ZXJvOiIpOworICBhID0gMTIzOworICBFWFBFQ1RfREVBVEgoYSAlIGIsICJEaXZpc2lvbiBvciBtb2QgYnkgemVybzoiKTsKK30KKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKworVEVTVChJbnQxMjgsIERpdmlkZUFuZE1vZCkgeworICAvLyBhIDo9IHEgKiBiICsgcgorICB1aW50MTI4IGEsIGIsIHEsIHI7CisKKyAgLy8gWmVybyB0ZXN0LgorICBhID0gMDsKKyAgYiA9IDEyMzsKKyAgcSA9IGEgLyBiOworICByID0gYSAlIGI7CisgIEVYUEVDVF9FUSgwLCBxKTsKKyAgRVhQRUNUX0VRKDAsIHIpOworCisgIGEgPSB1aW50MTI4KHVpbnQ2NF90ezB4NTMwZWRhNzQxYzcxZDRjM3V9LCB1aW50NjRfdHsweGJmMjU5NzUzMTkwODAwMDB1fSk7CisgIHEgPSB1aW50MTI4KHVpbnQ2NF90ezB4NGRlMmNhYjA4MXV9LCB1aW50NjRfdHsweDE0YzM0YWI0Njc2ZTRiYWJ1fSk7CisgIGIgPSB1aW50MTI4KDB4MTExMDAwMSk7CisgIHIgPSB1aW50MTI4KDB4M2ViNDU1KTsKKyAgQVNTRVJUX0VRKGEsIHEgKiBiICsgcik7ICAvLyBTYW5pdHktY2hlY2suCisKKyAgdWludDEyOCByZXN1bHRfcSwgcmVzdWx0X3I7CisgIHJlc3VsdF9xID0gYSAvIGI7CisgIHJlc3VsdF9yID0gYSAlIGI7CisgIEVYUEVDVF9FUShxLCByZXN1bHRfcSk7CisgIEVYUEVDVF9FUShyLCByZXN1bHRfcik7CisKKyAgLy8gVHJ5IHRoZSBvdGhlciB3YXkgYXJvdW5kLgorICBzdGQ6OnN3YXAocSwgYik7CisgIHJlc3VsdF9xID0gYSAvIGI7CisgIHJlc3VsdF9yID0gYSAlIGI7CisgIEVYUEVDVF9FUShxLCByZXN1bHRfcSk7CisgIEVYUEVDVF9FUShyLCByZXN1bHRfcik7CisgIC8vIFJlc3RvcmUuCisgIHN0ZDo6c3dhcChiLCBxKTsKKworICAvLyBEaXZpZGVuZCA8IGRpdmlzb3I7IHJlc3VsdCBzaG91bGQgYmUgcTowIHI6PGRpdmlkZW5kPi4KKyAgc3RkOjpzd2FwKGEsIGIpOworICByZXN1bHRfcSA9IGEgLyBiOworICByZXN1bHRfciA9IGEgJSBiOworICBFWFBFQ1RfRVEoMCwgcmVzdWx0X3EpOworICBFWFBFQ1RfRVEoYSwgcmVzdWx0X3IpOworICAvLyBUcnkgdGhlIG90aGVyIHdheSBhcm91bmQuCisgIHN0ZDo6c3dhcChhLCBxKTsKKyAgcmVzdWx0X3EgPSBhIC8gYjsKKyAgcmVzdWx0X3IgPSBhICUgYjsKKyAgRVhQRUNUX0VRKDAsIHJlc3VsdF9xKTsKKyAgRVhQRUNUX0VRKGEsIHJlc3VsdF9yKTsKKyAgLy8gUmVzdG9yZS4KKyAgc3RkOjpzd2FwKHEsIGEpOworICBzdGQ6OnN3YXAoYiwgYSk7CisKKyAgLy8gVHJ5IGEgbGFyZ2UgcmVtYWluZGVyLgorICBiID0gYSAvIDIgKyAxOworICB1aW50MTI4IGV4cGVjdGVkX3IodWludDY0X3R7MHgyOTg3NmQzYTBlMzhlYTYxdX0sCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdHsweGRmOTJjYmE5OGM4M2ZmZmZ1fSk7CisgIC8vIFNhbml0eSBjaGVja3MuCisgIEFTU0VSVF9FUShhIC8gMiAtIDEsIGV4cGVjdGVkX3IpOworICBBU1NFUlRfRVEoYSwgYiArIGV4cGVjdGVkX3IpOworICByZXN1bHRfcSA9IGEgLyBiOworICByZXN1bHRfciA9IGEgJSBiOworICBFWFBFQ1RfRVEoMSwgcmVzdWx0X3EpOworICBFWFBFQ1RfRVEoZXhwZWN0ZWRfciwgcmVzdWx0X3IpOworfQorCitzdGF0aWMgdWludDY0X3QgUmFuZG9tVWludDY0KCkgeworICB1aW50NjRfdCB2MSA9IHJhbmQoKTsKKyAgdWludDY0X3QgdjIgPSByYW5kKCk7CisgIHVpbnQ2NF90IHYzID0gcmFuZCgpOworICByZXR1cm4gdjEgKiB2MiArIHYzOworfQorCitURVNUKEludDEyOCwgRGl2aWRlQW5kTW9kUmFuZG9tSW5wdXRzKSB7CisgIGNvbnN0IGludCBrTnVtSXRlcnMgPSAxIDw8IDE4OworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1JdGVyczsgKytpKSB7CisgICAgY29uc3QgdWludDEyOCBhKFJhbmRvbVVpbnQ2NCgpLCBSYW5kb21VaW50NjQoKSk7CisgICAgY29uc3QgdWludDEyOCBiKFJhbmRvbVVpbnQ2NCgpLCBSYW5kb21VaW50NjQoKSk7CisgICAgaWYgKGIgPT0gMCkgeworICAgICAgY29udGludWU7ICAvLyBBdm9pZCBhIGRpdi1ieS16ZXJvLgorICAgIH0KKyAgICBjb25zdCB1aW50MTI4IHEgPSBhIC8gYjsKKyAgICBjb25zdCB1aW50MTI4IHIgPSBhICUgYjsKKyAgICBBU1NFUlRfRVEoYSwgYiAqIHEgKyByKTsKKyAgfQorfQorCisjaWZkZWYgR09PR0xFX1BST1RPQlVGX0hBU19DT05TVEVYUFIKK1RFU1QoSW50MTI4LCBDb25zdGV4cHJUZXN0KSB7CisgIGNvbnN0ZXhwciB1aW50MTI4IHplcm87CisgIGNvbnN0ZXhwciB1aW50MTI4IG9uZSA9IDE7CisgIGNvbnN0ZXhwciB1aW50MTI4X3BvZCBwb2QgPSB7MiwgM307CisgIGNvbnN0ZXhwciB1aW50MTI4IGZyb21fcG9kID0gcG9kOworICBjb25zdGV4cHIgdWludDEyOCBtaW51c190d28gPSAtMjsKKyAgRVhQRUNUX0VRKG9uZSwgdWludDEyOCgxKSk7CisgIEVYUEVDVF9FUShmcm9tX3BvZCwgdWludDEyOCgyLCAzKSk7CisgIEVYUEVDVF9FUShtaW51c190d28sIHVpbnQxMjgoLTFVTEwsIC0yVUxMKSk7Cit9CisKK1RFU1QoSW50MTI4LCBUcmFpdHMpIHsKKyAgRVhQRUNUX1RSVUUoc3RkOjppc190cml2aWFsbHlfY29weV9jb25zdHJ1Y3RpYmxlPHVpbnQxMjg+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlfYXNzaWduYWJsZTx1aW50MTI4Pjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShzdGQ6OmlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGU8dWludDEyOD46OnZhbHVlKTsKK30KKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0hBU19DT05TVEVYUFIKKworVEVTVChJbnQxMjgsIE9TdHJlYW0pIHsKKyAgc3RydWN0IHsKKyAgICB1aW50MTI4IHZhbDsKKyAgICBzdGQ6Omlvc19iYXNlOjpmbXRmbGFncyBmbGFnczsKKyAgICBzdGQ6OnN0cmVhbXNpemUgd2lkdGg7CisgICAgY2hhciBmaWxsOworICAgIGNvbnN0IGNoYXIqIHJlcDsKKyAgfSBjYXNlc1tdID0geworICAgICAgLy8gemVybyB3aXRoIGRpZmZlcmVudCBiYXNlcworICAgICAge3VpbnQxMjgoMCksIHN0ZDo6aW9zOjpkZWMsIDAsICdfJywgIjAifSwKKyAgICAgIHt1aW50MTI4KDApLCBzdGQ6Omlvczo6b2N0LCAwLCAnXycsICIwIn0sCisgICAgICB7dWludDEyOCgwKSwgc3RkOjppb3M6OmhleCwgMCwgJ18nLCAiMCJ9LAorICAgICAgLy8gY3Jvc3NvdmVyIGJldHdlZW4gbG9fIGFuZCBoaV8KKyAgICAgIHt1aW50MTI4KDAsIC0xKSwgc3RkOjppb3M6OmRlYywgMCwgJ18nLCAiMTg0NDY3NDQwNzM3MDk1NTE2MTUifSwKKyAgICAgIHt1aW50MTI4KDAsIC0xKSwgc3RkOjppb3M6Om9jdCwgMCwgJ18nLCAiMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyJ9LAorICAgICAge3VpbnQxMjgoMCwgLTEpLCBzdGQ6Omlvczo6aGV4LCAwLCAnXycsICJmZmZmZmZmZmZmZmZmZmZmIn0sCisgICAgICB7dWludDEyOCgxLCAwKSwgc3RkOjppb3M6OmRlYywgMCwgJ18nLCAiMTg0NDY3NDQwNzM3MDk1NTE2MTYifSwKKyAgICAgIHt1aW50MTI4KDEsIDApLCBzdGQ6Omlvczo6b2N0LCAwLCAnXycsICIyMDAwMDAwMDAwMDAwMDAwMDAwMDAwIn0sCisgICAgICB7dWludDEyOCgxLCAwKSwgc3RkOjppb3M6OmhleCwgMCwgJ18nLCAiMTAwMDAwMDAwMDAwMDAwMDAifSwKKyAgICAgIC8vIGp1c3QgdGhlIHRvcCBiaXQKKyAgICAgIHt1aW50MTI4KHVpbnQ2NF90ezB4ODAwMDAwMDAwMDAwMDAwMHV9LCAwKSwgc3RkOjppb3M6OmRlYywgMCwgJ18nLAorICAgICAgICIxNzAxNDExODM0NjA0NjkyMzE3MzE2ODczMDM3MTU4ODQxMDU3MjgifSwKKyAgICAgIHt1aW50MTI4KHVpbnQ2NF90ezB4ODAwMDAwMDAwMDAwMDAwMHV9LCAwKSwgc3RkOjppb3M6Om9jdCwgMCwgJ18nLAorICAgICAgICIyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIn0sCisgICAgICB7dWludDEyOCh1aW50NjRfdHsweDgwMDAwMDAwMDAwMDAwMDB1fSwgMCksIHN0ZDo6aW9zOjpoZXgsIDAsICdfJywKKyAgICAgICAiODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAifSwKKyAgICAgIC8vIG1heGltdW0gdWludDEyOCB2YWx1ZQorICAgICAge3VpbnQxMjgoLTEsIC0xKSwgc3RkOjppb3M6OmRlYywgMCwgJ18nLAorICAgICAgICIzNDAyODIzNjY5MjA5Mzg0NjM0NjMzNzQ2MDc0MzE3NjgyMTE0NTUifSwKKyAgICAgIHt1aW50MTI4KC0xLCAtMSksIHN0ZDo6aW9zOjpvY3QsIDAsICdfJywKKyAgICAgICAiMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyJ9LAorICAgICAge3VpbnQxMjgoLTEsIC0xKSwgc3RkOjppb3M6OmhleCwgMCwgJ18nLAorICAgICAgICJmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZiJ9LAorICAgICAgLy8gdXBwZXJjYXNlCisgICAgICB7dWludDEyOCgtMSwgLTEpLCBzdGQ6Omlvczo6aGV4IHwgc3RkOjppb3M6OnVwcGVyY2FzZSwgMCwgJ18nLAorICAgICAgICJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiJ9LAorICAgICAgLy8gc2hvd2Jhc2UKKyAgICAgIHt1aW50MTI4KDEpLCBzdGQ6Omlvczo6ZGVjIHwgc3RkOjppb3M6OnNob3diYXNlLCAwLCAnXycsICIxIn0sCisgICAgICB7dWludDEyOCgxKSwgc3RkOjppb3M6Om9jdCB8IHN0ZDo6aW9zOjpzaG93YmFzZSwgMCwgJ18nLCAiMDEifSwKKyAgICAgIHt1aW50MTI4KDEpLCBzdGQ6Omlvczo6aGV4IHwgc3RkOjppb3M6OnNob3diYXNlLCAwLCAnXycsICIweDEifSwKKyAgICAgIC8vIHNob3diYXNlIGRvZXMgbm90aGluZyBvbiB6ZXJvCisgICAgICB7dWludDEyOCgwKSwgc3RkOjppb3M6OmRlYyB8IHN0ZDo6aW9zOjpzaG93YmFzZSwgMCwgJ18nLCAiMCJ9LAorICAgICAge3VpbnQxMjgoMCksIHN0ZDo6aW9zOjpvY3QgfCBzdGQ6Omlvczo6c2hvd2Jhc2UsIDAsICdfJywgIjAifSwKKyAgICAgIHt1aW50MTI4KDApLCBzdGQ6Omlvczo6aGV4IHwgc3RkOjppb3M6OnNob3diYXNlLCAwLCAnXycsICIwIn0sCisgICAgICAvLyBzaG93cG9zIGRvZXMgbm90aGluZyBvbiB1bnNpZ25lZCB0eXBlcworICAgICAge3VpbnQxMjgoMSksIHN0ZDo6aW9zOjpkZWMgfCBzdGQ6Omlvczo6c2hvd3BvcywgMCwgJ18nLCAiMSJ9LAorICAgICAgLy8gcGFkZGluZworICAgICAge3VpbnQxMjgoOSksIHN0ZDo6aW9zOjpkZWMsIDYsICdfJywgIl9fX19fOSJ9LAorICAgICAge3VpbnQxMjgoMTIzNDUpLCBzdGQ6Omlvczo6ZGVjLCA2LCAnXycsICJfMTIzNDUifSwKKyAgICAgIC8vIGxlZnQgYWRqdXN0bWVudAorICAgICAge3VpbnQxMjgoOSksIHN0ZDo6aW9zOjpkZWMgfCBzdGQ6Omlvczo6bGVmdCwgNiwgJ18nLCAiOV9fX19fIn0sCisgICAgICB7dWludDEyOCgxMjM0NSksIHN0ZDo6aW9zOjpkZWMgfCBzdGQ6Omlvczo6bGVmdCwgNiwgJ18nLCAiMTIzNDVfIn0sCisgIH07CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShjYXNlcyk7ICsraSkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcy5mbGFncyhjYXNlc1tpXS5mbGFncyk7CisgICAgb3Mud2lkdGgoY2FzZXNbaV0ud2lkdGgpOworICAgIG9zLmZpbGwoY2FzZXNbaV0uZmlsbCk7CisgICAgb3MgPDwgY2FzZXNbaV0udmFsOworICAgIEVYUEVDVF9FUShjYXNlc1tpXS5yZXAsIG9zLnN0cigpKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlY2MyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaApAQCAtMCwwICsxLDIzOSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX0xPR0dJTkdfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX0xPR0dJTkdfSF8KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYWNyb3MuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvcG9ydC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2UuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGVtdWxhdGVzIGdvb2dsZTMvYmFzZS9sb2dnaW5nLmgKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitlbnVtIExvZ0xldmVsIHsKKyAgTE9HTEVWRUxfSU5GTywgICAgIC8vIEluZm9ybWF0aW9uYWwuICBUaGlzIGlzIG5ldmVyIGFjdHVhbGx5IHVzZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgIC8vIGxpYnByb3RvYnVmLgorICBMT0dMRVZFTF9XQVJOSU5HLCAgLy8gV2FybnMgYWJvdXQgaXNzdWVzIHRoYXQsIGFsdGhvdWdoIG5vdCB0ZWNobmljYWxseSBhCisgICAgICAgICAgICAgICAgICAgICAvLyBwcm9ibGVtIG5vdywgY291bGQgY2F1c2UgcHJvYmxlbXMgaW4gdGhlIGZ1dHVyZS4gIEZvcgorICAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZSwgYSAvLyB3YXJuaW5nIHdpbGwgYmUgcHJpbnRlZCB3aGVuIHBhcnNpbmcgYQorICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSB0aGF0IGlzIG5lYXIgdGhlIG1lc3NhZ2Ugc2l6ZSBsaW1pdC4KKyAgTE9HTEVWRUxfRVJST1IsICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWNoIHNob3VsZCBuZXZlciBoYXBwZW4gZHVyaW5nCisgICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWwgdXNlLgorICBMT0dMRVZFTF9GQVRBTCwgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQgZnJvbSB3aGljaCB0aGUgbGlicmFyeSBjYW5ub3QKKyAgICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXIuICBUaGlzIHVzdWFsbHkgaW5kaWNhdGVzIGEgcHJvZ3JhbW1pbmcgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBjb2RlIHdoaWNoIGNhbGxzIHRoZSBsaWJyYXJ5LCBlc3BlY2lhbGx5IHdoZW4KKyAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBpbGVkIGluIGRlYnVnIG1vZGUuCisKKyNpZmRlZiBOREVCVUcKKyAgTE9HTEVWRUxfREZBVEFMID0gTE9HTEVWRUxfRVJST1IKKyNlbHNlCisgIExPR0xFVkVMX0RGQVRBTCA9IExPR0xFVkVMX0ZBVEFMCisjZW5kaWYKK307CisKK2NsYXNzIHVpbnQxMjg7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjbGFzcyBMb2dGaW5pc2hlcjsKKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIExvZ01lc3NhZ2UgeworIHB1YmxpYzoKKyAgTG9nTWVzc2FnZShMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lKTsKKyAgfkxvZ01lc3NhZ2UoKTsKKworICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwoY29uc3QgY2hhciogdmFsdWUpOworICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGNoYXIgdmFsdWUpOworICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGludCB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwodWludCB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwobG9uZyB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwobG9uZyBsb25nIHZhbHVlKTsKKyAgTG9nTWVzc2FnZSYgb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpOworICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGRvdWJsZSB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwodm9pZCogdmFsdWUpOworICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGNvbnN0IFN0cmluZ1BpZWNlJiB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwoY29uc3QgdXRpbDo6U3RhdHVzJiBzdGF0dXMpOworICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGNvbnN0IHVpbnQxMjgmIHZhbHVlKTsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBMb2dGaW5pc2hlcjsKKyAgdm9pZCBGaW5pc2goKTsKKworICBMb2dMZXZlbCBsZXZlbF87CisgIGNvbnN0IGNoYXIqIGZpbGVuYW1lXzsKKyAgaW50IGxpbmVfOworICBzdGQ6OnN0cmluZyBtZXNzYWdlXzsKK307CisKKy8vIFVzZWQgdG8gbWFrZSB0aGUgZW50aXJlICJMT0coQkxBSCkgPDwgZXRjLiIgZXhwcmVzc2lvbiBoYXZlIGEgdm9pZCByZXR1cm4KKy8vIHR5cGUgYW5kIHByaW50IGEgbmV3bGluZSBhZnRlciBlYWNoIG1lc3NhZ2UuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTG9nRmluaXNoZXIgeworIHB1YmxpYzoKKyAgdm9pZCBvcGVyYXRvcj0oTG9nTWVzc2FnZSYgb3RoZXIpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgSXNPayhUIHN0YXR1cykgeyByZXR1cm4gc3RhdHVzLm9rKCk7IH0KK3RlbXBsYXRlPD4KK2lubGluZSBib29sIElzT2soYm9vbCBzdGF0dXMpIHsgcmV0dXJuIHN0YXR1czsgfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gVW5kZWYgZXZlcnl0aGluZyBpbiBjYXNlIHdlJ3JlIGJlaW5nIG1peGVkIHdpdGggc29tZSBvdGhlciBHb29nbGUgbGlicmFyeQorLy8gd2hpY2ggYWxyZWFkeSBkZWZpbmVkIHRoZW0gaXRzZWxmLiAgUHJlc3VtYWJseSBhbGwgR29vZ2xlIGxpYnJhcmllcyB3aWxsCisvLyBzdXBwb3J0IHRoZSBzYW1lIHN5bnRheCBmb3IgdGhlc2Ugc28gaXQgc2hvdWxkIG5vdCBiZSBhIGJpZyBkZWFsIGlmIHRoZXkKKy8vIGVuZCB1cCB1c2luZyBvdXIgZGVmaW5pdGlvbnMgaW5zdGVhZC4KKyN1bmRlZiBHT09HTEVfTE9HCisjdW5kZWYgR09PR0xFX0xPR19JRgorCisjdW5kZWYgR09PR0xFX0NIRUNLCisjdW5kZWYgR09PR0xFX0NIRUNLX09LCisjdW5kZWYgR09PR0xFX0NIRUNLX0VRCisjdW5kZWYgR09PR0xFX0NIRUNLX05FCisjdW5kZWYgR09PR0xFX0NIRUNLX0xUCisjdW5kZWYgR09PR0xFX0NIRUNLX0xFCisjdW5kZWYgR09PR0xFX0NIRUNLX0dUCisjdW5kZWYgR09PR0xFX0NIRUNLX0dFCisjdW5kZWYgR09PR0xFX0NIRUNLX05PVE5VTEwKKworI3VuZGVmIEdPT0dMRV9ETE9HCisjdW5kZWYgR09PR0xFX0RDSEVDSworI3VuZGVmIEdPT0dMRV9EQ0hFQ0tfT0sKKyN1bmRlZiBHT09HTEVfRENIRUNLX0VRCisjdW5kZWYgR09PR0xFX0RDSEVDS19ORQorI3VuZGVmIEdPT0dMRV9EQ0hFQ0tfTFQKKyN1bmRlZiBHT09HTEVfRENIRUNLX0xFCisjdW5kZWYgR09PR0xFX0RDSEVDS19HVAorI3VuZGVmIEdPT0dMRV9EQ0hFQ0tfR0UKKworI2RlZmluZSBHT09HTEVfTE9HKExFVkVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpMb2dGaW5pc2hlcigpID0gXAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TG9nTWVzc2FnZSggXAorICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TE9HTEVWRUxfIyNMRVZFTCwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBHT09HTEVfTE9HX0lGKExFVkVMLCBDT05ESVRJT04pIFwKKyAgIShDT05ESVRJT04pID8gKHZvaWQpMCA6IEdPT0dMRV9MT0coTEVWRUwpCisKKyNkZWZpbmUgR09PR0xFX0NIRUNLKEVYUFJFU1NJT04pIFwKKyAgR09PR0xFX0xPR19JRihGQVRBTCwgIShFWFBSRVNTSU9OKSkgPDwgIkNIRUNLIGZhaWxlZDogIiAjRVhQUkVTU0lPTiAiOiAiCisjZGVmaW5lIEdPT0dMRV9DSEVDS19PSyhBKSBHT09HTEVfQ0hFQ0soOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SXNPayhBKSkKKyNkZWZpbmUgR09PR0xFX0NIRUNLX0VRKEEsIEIpIEdPT0dMRV9DSEVDSygoQSkgPT0gKEIpKQorI2RlZmluZSBHT09HTEVfQ0hFQ0tfTkUoQSwgQikgR09PR0xFX0NIRUNLKChBKSAhPSAoQikpCisjZGVmaW5lIEdPT0dMRV9DSEVDS19MVChBLCBCKSBHT09HTEVfQ0hFQ0soKEEpIDwgIChCKSkKKyNkZWZpbmUgR09PR0xFX0NIRUNLX0xFKEEsIEIpIEdPT0dMRV9DSEVDSygoQSkgPD0gKEIpKQorI2RlZmluZSBHT09HTEVfQ0hFQ0tfR1QoQSwgQikgR09PR0xFX0NIRUNLKChBKSA+ICAoQikpCisjZGVmaW5lIEdPT0dMRV9DSEVDS19HRShBLCBCKSBHT09HTEVfQ0hFQ0soKEEpID49IChCKSkKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUKiBDaGVja05vdE51bGwoY29uc3QgY2hhciogLyogZmlsZSAqLywgaW50IC8qIGxpbmUgKi8sCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgVCogdmFsKSB7CisgIGlmICh2YWwgPT0gbnVsbHB0cikgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8IG5hbWU7CisgIH0KKyAgcmV0dXJuIHZhbDsKK30KK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorI2RlZmluZSBHT09HTEVfQ0hFQ0tfTk9UTlVMTChBKSAgICAgICAgICAgICAgIFwKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6Q2hlY2tOb3ROdWxsKCBcCisgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICInIiAjQSAiJyBtdXN0IG5vdCBiZSBudWxscHRyIiwgKEEpKQorCisjaWZkZWYgTkRFQlVHCisKKyNkZWZpbmUgR09PR0xFX0RMT0coTEVWRUwpIEdPT0dMRV9MT0dfSUYoTEVWRUwsIGZhbHNlKQorCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0soRVhQUkVTU0lPTikgd2hpbGUoZmFsc2UpIEdPT0dMRV9DSEVDSyhFWFBSRVNTSU9OKQorI2RlZmluZSBHT09HTEVfRENIRUNLX09LKEUpIEdPT0dMRV9EQ0hFQ0soOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SXNPayhFKSkKKyNkZWZpbmUgR09PR0xFX0RDSEVDS19FUShBLCBCKSBHT09HTEVfRENIRUNLKChBKSA9PSAoQikpCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTkUoQSwgQikgR09PR0xFX0RDSEVDSygoQSkgIT0gKEIpKQorI2RlZmluZSBHT09HTEVfRENIRUNLX0xUKEEsIEIpIEdPT0dMRV9EQ0hFQ0soKEEpIDwgIChCKSkKKyNkZWZpbmUgR09PR0xFX0RDSEVDS19MRShBLCBCKSBHT09HTEVfRENIRUNLKChBKSA8PSAoQikpCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfR1QoQSwgQikgR09PR0xFX0RDSEVDSygoQSkgPiAgKEIpKQorI2RlZmluZSBHT09HTEVfRENIRUNLX0dFKEEsIEIpIEdPT0dMRV9EQ0hFQ0soKEEpID49IChCKSkKKworI2Vsc2UgIC8vIE5ERUJVRworCisjZGVmaW5lIEdPT0dMRV9ETE9HIEdPT0dMRV9MT0cKKworI2RlZmluZSBHT09HTEVfRENIRUNLICAgIEdPT0dMRV9DSEVDSworI2RlZmluZSBHT09HTEVfRENIRUNLX09LIEdPT0dMRV9DSEVDS19PSworI2RlZmluZSBHT09HTEVfRENIRUNLX0VRIEdPT0dMRV9DSEVDS19FUQorI2RlZmluZSBHT09HTEVfRENIRUNLX05FIEdPT0dMRV9DSEVDS19ORQorI2RlZmluZSBHT09HTEVfRENIRUNLX0xUIEdPT0dMRV9DSEVDS19MVAorI2RlZmluZSBHT09HTEVfRENIRUNLX0xFIEdPT0dMRV9DSEVDS19MRQorI2RlZmluZSBHT09HTEVfRENIRUNLX0dUIEdPT0dMRV9DSEVDS19HVAorI2RlZmluZSBHT09HTEVfRENIRUNLX0dFIEdPT0dMRV9DSEVDS19HRQorCisjZW5kaWYgIC8vICFOREVCVUcKKwordHlwZWRlZiB2b2lkIExvZ0hhbmRsZXIoTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKTsKKworLy8gVGhlIHByb3RvYnVmIGxpYnJhcnkgc29tZXRpbWVzIHdyaXRlcyB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcyB0bworLy8gc3RkZXJyLiAgVGhlc2UgbWVzc2FnZXMgYXJlIHByaW1hcmlseSB1c2VmdWwgZm9yIGRldmVsb3BlcnMsIGJ1dCBtYXkKKy8vIGFsc28gaGVscCBlbmQgdXNlcnMgZmlndXJlIG91dCBhIHByb2JsZW0uICBJZiB5b3Ugd291bGQgcHJlZmVyIHRoYXQKKy8vIHRoZXNlIG1lc3NhZ2VzIGJlIHNlbnQgc29tZXdoZXJlIG90aGVyIHRoYW4gc3RkZXJyLCBjYWxsIFNldExvZ0hhbmRsZXIoKQorLy8gdG8gc2V0IHlvdXIgb3duIGhhbmRsZXIuICBUaGlzIHJldHVybnMgdGhlIG9sZCBoYW5kbGVyLiAgU2V0IHRoZSBoYW5kbGVyCisvLyB0byBudWxscHRyIHRvIGlnbm9yZSBsb2cgbWVzc2FnZXMgKGJ1dCBzZWUgYWxzbyBMb2dTaWxlbmNlciwgYmVsb3cpLgorLy8KKy8vIE9idmlvdXNseSwgU2V0TG9nSGFuZGxlciBpcyBub3QgdGhyZWFkLXNhZmUuICBZb3Ugc2hvdWxkIG9ubHkgY2FsbCBpdAorLy8gYXQgaW5pdGlhbGl6YXRpb24gdGltZSwgYW5kIHByb2JhYmx5IG5vdCBmcm9tIGxpYnJhcnkgY29kZS4gIElmIHlvdQorLy8gc2ltcGx5IHdhbnQgdG8gc3VwcHJlc3MgbG9nIG1lc3NhZ2VzIHRlbXBvcmFyaWx5IChlLmcuIGJlY2F1c2UgeW91CisvLyBoYXZlIHNvbWUgY29kZSB0aGF0IHRlbmRzIHRvIHRyaWdnZXIgdGhlbSBmcmVxdWVudGx5IGFuZCB5b3Uga25vdworLy8gdGhlIHdhcm5pbmdzIGFyZSBub3QgaW1wb3J0YW50IHRvIHlvdSksIHVzZSB0aGUgTG9nU2lsZW5jZXIgY2xhc3MKKy8vIGJlbG93LgorUFJPVE9CVUZfRVhQT1JUIExvZ0hhbmRsZXIqIFNldExvZ0hhbmRsZXIoTG9nSGFuZGxlciogbmV3X2Z1bmMpOworCisvLyBDcmVhdGUgYSBMb2dTaWxlbmNlciBpZiB5b3Ugd2FudCB0byB0ZW1wb3JhcmlseSBzdXBwcmVzcyBhbGwgbG9nCisvLyBtZXNzYWdlcy4gIEFzIGxvbmcgYXMgYW55IExvZ1NpbGVuY2VyIG9iamVjdHMgZXhpc3QsIG5vbi1mYXRhbAorLy8gbG9nIG1lc3NhZ2VzIHdpbGwgYmUgZGlzY2FyZGVkICh0aGUgY3VycmVudCBMb2dIYW5kbGVyIHdpbGwgKm5vdCoKKy8vIGJlIGNhbGxlZCkuICBDb25zdHJ1Y3RpbmcgYSBMb2dTaWxlbmNlciBpcyB0aHJlYWQtc2FmZS4gIFlvdSBtYXkKKy8vIGFjY2lkZW50YWxseSBzdXBwcmVzcyBsb2cgbWVzc2FnZXMgb2NjdXJyaW5nIGluIGFub3RoZXIgdGhyZWFkLCBidXQKKy8vIHNpbmNlIG1lc3NhZ2VzIGFyZSBnZW5lcmFsbHkgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LCB0aGlzIGlzbid0CisvLyBhIGJpZyBkZWFsLiAgSWYgeW91IHdhbnQgdG8gaW50ZXJjZXB0IGxvZyBtZXNzYWdlcywgdXNlIFNldExvZ0hhbmRsZXIoKS4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBMb2dTaWxlbmNlciB7CisgcHVibGljOgorICBMb2dTaWxlbmNlcigpOworICB+TG9nU2lsZW5jZXIoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19MT0dHSU5HX0hfCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hY3Jvcy5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTlhOGI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYWNyb3MuaApAQCAtMCwwICsxLDkzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTUFDUk9TX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUFDUk9TX0hfXworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKyN1bmRlZiBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMKKyNkZWZpbmUgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFR5cGVOYW1lKSBcCisgIFR5cGVOYW1lKGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7ICAgICAgICAgICAgICAgXAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBUeXBlTmFtZSYpID0gZGVsZXRlCisKKyN1bmRlZiBHT09HTEVfRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTCisjZGVmaW5lIEdPT0dMRV9ESVNBTExPV19JTVBMSUNJVF9DT05TVFJVQ1RPUlMoVHlwZU5hbWUpIFwKKyAgVHlwZU5hbWUoKSA9IGRlbGV0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUeXBlTmFtZShjb25zdCBUeXBlTmFtZSYpID0gZGVsZXRlOyAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGUKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZnJvbSBnb29nbGUzL2Jhc2UvYmFzaWN0eXBlcy5oCisKKy8vIFRoZSBHT09HTEVfQVJSQVlTSVpFKGFycikgbWFjcm8gcmV0dXJucyB0aGUgIyBvZiBlbGVtZW50cyBpbiBhbiBhcnJheSBhcnIuCisvLyBUaGUgZXhwcmVzc2lvbiBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudCwgYW5kIHRoZXJlZm9yZSBjYW4gYmUKKy8vIHVzZWQgaW4gZGVmaW5pbmcgbmV3IGFycmF5cywgZm9yIGV4YW1wbGUuCisvLworLy8gR09PR0xFX0FSUkFZU0laRSBjYXRjaGVzIGEgZmV3IHR5cGUgZXJyb3JzLiAgSWYgeW91IHNlZSBhIGNvbXBpbGVyIGVycm9yCisvLworLy8gICAid2FybmluZzogZGl2aXNpb24gYnkgemVybyBpbiAuLi4iCisvLworLy8gd2hlbiB1c2luZyBHT09HTEVfQVJSQVlTSVpFLCB5b3UgYXJlICh3cm9uZ2Z1bGx5KSBnaXZpbmcgaXQgYSBwb2ludGVyLgorLy8gWW91IHNob3VsZCBvbmx5IHVzZSBHT09HTEVfQVJSQVlTSVpFIG9uIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFycmF5cy4KKy8vCisvLyBUaGUgZm9sbG93aW5nIGNvbW1lbnRzIGFyZSBvbiB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscywgYW5kIGNhbgorLy8gYmUgaWdub3JlZCBieSB0aGUgdXNlcnMuCisvLworLy8gQVJSQVlTSVpFKGFycikgd29ya3MgYnkgaW5zcGVjdGluZyBzaXplb2YoYXJyKSAodGhlICMgb2YgYnl0ZXMgaW4KKy8vIHRoZSBhcnJheSkgYW5kIHNpemVvZigqKGFycikpICh0aGUgIyBvZiBieXRlcyBpbiBvbmUgYXJyYXkKKy8vIGVsZW1lbnQpLiAgSWYgdGhlIGZvcm1lciBpcyBkaXZpc2libGUgYnkgdGhlIGxhdHRlciwgcGVyaGFwcyBhcnIgaXMKKy8vIGluZGVlZCBhbiBhcnJheSwgaW4gd2hpY2ggY2FzZSB0aGUgZGl2aXNpb24gcmVzdWx0IGlzIHRoZSAjIG9mCisvLyBlbGVtZW50cyBpbiB0aGUgYXJyYXkuICBPdGhlcndpc2UsIGFyciBjYW5ub3QgcG9zc2libHkgYmUgYW4gYXJyYXksCisvLyBhbmQgd2UgZ2VuZXJhdGUgYSBjb21waWxlciBlcnJvciB0byBwcmV2ZW50IHRoZSBjb2RlIGZyb20KKy8vIGNvbXBpbGluZy4KKy8vCisvLyBTaW5jZSB0aGUgc2l6ZSBvZiBib29sIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQsIHdlIG5lZWQgdG8gY2FzdAorLy8gIShzaXplb2YoYSkgJiBzaXplb2YoKihhKSkpIHRvIHNpemVfdCBpbiBvcmRlciB0byBlbnN1cmUgdGhlIGZpbmFsCisvLyByZXN1bHQgaGFzIHR5cGUgc2l6ZV90LgorLy8KKy8vIFRoaXMgbWFjcm8gaXMgbm90IHBlcmZlY3QgYXMgaXQgd3JvbmdmdWxseSBhY2NlcHRzIGNlcnRhaW4KKy8vIHBvaW50ZXJzLCBuYW1lbHkgd2hlcmUgdGhlIHBvaW50ZXIgc2l6ZSBpcyBkaXZpc2libGUgYnkgdGhlIHBvaW50ZWUKKy8vIHNpemUuICBTaW5jZSBhbGwgb3VyIGNvZGUgaGFzIHRvIGdvIHRocm91Z2ggYSAzMi1iaXQgY29tcGlsZXIsCisvLyB3aGVyZSBhIHBvaW50ZXIgaXMgNCBieXRlcywgdGhpcyBtZWFucyBhbGwgcG9pbnRlcnMgdG8gYSB0eXBlIHdob3NlCisvLyBzaXplIGlzIDMgb3IgZ3JlYXRlciB0aGFuIDQgd2lsbCBiZSAocmlnaHRlb3VzbHkpIHJlamVjdGVkLgorLy8KKy8vIEt1ZG9zIHRvIEpvcmcgQnJvd24gZm9yIHRoaXMgc2ltcGxlIGFuZCBlbGVnYW50IGltcGxlbWVudGF0aW9uLgorCisjdW5kZWYgR09PR0xFX0FSUkFZU0laRQorI2RlZmluZSBHT09HTEVfQVJSQVlTSVpFKGEpIFwKKyAgKChzaXplb2YoYSkgLyBzaXplb2YoKihhKSkpIC8gXAorICAgc3RhdGljX2Nhc3Q8c2l6ZV90PighKHNpemVvZihhKSAlIHNpemVvZigqKGEpKSkpKQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTUFDUk9TX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXBfdXRpbC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXBfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTA5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmgKQEAgLTAsMCArMSw3NjkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBmcm9tIGdvb2dsZTMvdXRpbC9ndGwvbWFwX3V0aWwuaAorLy8gQXV0aG9yOiBBbnRvbiBDYXJ2ZXIKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfTUFQX1VUSUxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19NQVBfVVRJTF9IX18KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKy8vIExvY2FsIGltcGxlbWVudGF0aW9uIG9mIFJlbW92ZUNvbnN0IHRvIGF2b2lkIGluY2x1ZGluZyBiYXNlL3R5cGVfdHJhaXRzLmguCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IFJlbW92ZUNvbnN0IHsgdHlwZWRlZiBUIHR5cGU7IH07Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IFJlbW92ZUNvbnN0PGNvbnN0IFQ+IDogUmVtb3ZlQ29uc3Q8VD4ge307Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8KKy8vIEZpbmQqKCkKKy8vCisKKy8vIFJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IGlmIGl0CisvLyBleGlzdHMuIENyYXNoZXMgb3RoZXJ3aXNlLgorLy8KKy8vIFRoaXMgaXMgaW50ZW5kZWQgYXMgYSByZXBsYWNlbWVudCBmb3Igb3BlcmF0b3JbXSBhcyBhbiBydmFsdWUgKGZvciByZWFkaW5nKQorLy8gd2hlbiB0aGUga2V5IGlzIGd1YXJhbnRlZWQgdG8gZXhpc3QuCisvLworLy8gb3BlcmF0b3JbXSBmb3IgbG9va3VwIGlzIGRpc2NvdXJhZ2VkIGZvciBzZXZlcmFsIHJlYXNvbnM6CisvLyAgKiBJdCBoYXMgYSBzaWRlLWVmZmVjdCBvZiBpbnNlcnRpbmcgbWlzc2luZyBrZXlzCisvLyAgKiBJdCBpcyBub3QgdGhyZWFkLXNhZmUgKGV2ZW4gd2hlbiBpdCBpcyBub3QgaW5zZXJ0aW5nLCBpdCBjYW4gc3RpbGwKKy8vICAgICAgY2hvb3NlIHRvIHJlc2l6ZSB0aGUgdW5kZXJseWluZyBzdG9yYWdlKQorLy8gICogSXQgaW52YWxpZGF0ZXMgaXRlcmF0b3JzICh3aGVuIGl0IGNob29zZXMgdG8gcmVzaXplKQorLy8gICogSXQgZGVmYXVsdCBjb25zdHJ1Y3RzIGEgdmFsdWUgb2JqZWN0IGV2ZW4gaWYgaXQgZG9lc24ndCBuZWVkIHRvCisvLworLy8gVGhpcyB2ZXJzaW9uIGFzc3VtZXMgdGhlIGtleSBpcyBwcmludGFibGUsIGFuZCBpbmNsdWRlcyBpdCBpbiB0aGUgZmF0YWwgbG9nCisvLyBtZXNzYWdlLgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Citjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYKK0ZpbmRPckRpZShjb25zdCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLAorICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSkgeworICB0eXBlbmFtZSBDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IGNvbGxlY3Rpb24uZmluZChrZXkpOworICBHT09HTEVfQ0hFQ0soaXQgIT0gY29sbGVjdGlvbi5lbmQoKSkgPDwgIk1hcCBrZXkgbm90IGZvdW5kOiAiIDw8IGtleTsKKyAgcmV0dXJuIGl0LT5zZWNvbmQ7Cit9CisKKy8vIFNhbWUgYXMgYWJvdmUsIGJ1dCByZXR1cm5zIGEgbm9uLWNvbnN0IHJlZmVyZW5jZS4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uPgordHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUmCitGaW5kT3JEaWUoQ29sbGVjdGlvbiYgY29sbGVjdGlvbiwgIC8vIE5PTElOVAorICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSkgeworICB0eXBlbmFtZSBDb2xsZWN0aW9uOjppdGVyYXRvciBpdCA9IGNvbGxlY3Rpb24uZmluZChrZXkpOworICBHT09HTEVfQ0hFQ0soaXQgIT0gY29sbGVjdGlvbi5lbmQoKSkgPDwgIk1hcCBrZXkgbm90IGZvdW5kOiAiIDw8IGtleTsKKyAgcmV0dXJuIGl0LT5zZWNvbmQ7Cit9CisKKy8vIFNhbWUgYXMgRmluZE9yRGllIGFib3ZlLCBidXQgZG9lc24ndCBsb2cgdGhlIGtleSBvbiBmYWlsdXJlLgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Citjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYKK0ZpbmRPckRpZU5vUHJpbnQoY29uc3QgQ29sbGVjdGlvbiYgY29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZSYga2V5KSB7CisgIHR5cGVuYW1lIENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29sbGVjdGlvbi5maW5kKGtleSk7CisgIEdPT0dMRV9DSEVDSyhpdCAhPSBjb2xsZWN0aW9uLmVuZCgpKSA8PCAiTWFwIGtleSBub3QgZm91bmQiOworICByZXR1cm4gaXQtPnNlY29uZDsKK30KKworLy8gU2FtZSBhcyBhYm92ZSwgYnV0IHJldHVybnMgYSBub24tY29uc3QgcmVmZXJlbmNlLgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Cit0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYKK0ZpbmRPckRpZU5vUHJpbnQoQ29sbGVjdGlvbiYgY29sbGVjdGlvbiwgIC8vIE5PTElOVAorICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlJiBrZXkpIHsKKyAgdHlwZW5hbWUgQ29sbGVjdGlvbjo6aXRlcmF0b3IgaXQgPSBjb2xsZWN0aW9uLmZpbmQoa2V5KTsKKyAgR09PR0xFX0NIRUNLKGl0ICE9IGNvbGxlY3Rpb24uZW5kKCkpIDw8ICJNYXAga2V5IG5vdCBmb3VuZCI7CisgIHJldHVybiBpdC0+c2Vjb25kOworfQorCisvLyBSZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBpZiBpdAorLy8gZXhpc3RzLCBvdGhlcndpc2UgcmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgcHJvdmlkZWQgZGVmYXVsdCB2YWx1ZS4KKy8vCisvLyBXQVJOSU5HOiBJZiBhIHRlbXBvcmFyeSBvYmplY3QgaXMgcGFzc2VkIGFzIHRoZSBkZWZhdWx0ICJ2YWx1ZSwiCisvLyB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoYXQgdGVtcG9yYXJ5IG9iamVjdCwKKy8vIHdoaWNoIHdpbGwgYmUgZGVzdHJveWVkIGF0IHRoZSBlbmQgb2YgdGhlIHN0YXRlbWVudC4gQSBjb21tb24KKy8vIGV4YW1wbGU6IGlmIHlvdSBoYXZlIGEgbWFwIHdpdGggc3RyaW5nIHZhbHVlcywgYW5kIHlvdSBwYXNzIGEgY2hhcioKKy8vIGFzIHRoZSBkZWZhdWx0ICJ2YWx1ZSwiIGVpdGhlciB1c2UgdGhlIHJldHVybmVkIHZhbHVlIGltbWVkaWF0ZWx5CisvLyBvciBzdG9yZSBpdCBpbiBhIHN0cmluZyAobm90IHN0cmluZyYpLgorLy8gRGV0YWlsczogaHR0cDovL2dvL2ZpbmR3aXRoZGVmYXVsdAordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Citjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYKK0ZpbmRXaXRoRGVmYXVsdChjb25zdCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSwKKyAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYgdmFsdWUpIHsKKyAgdHlwZW5hbWUgQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb2xsZWN0aW9uLmZpbmQoa2V5KTsKKyAgaWYgKGl0ID09IGNvbGxlY3Rpb24uZW5kKCkpIHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKyAgcmV0dXJuIGl0LT5zZWNvbmQ7Cit9CisKKy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjb25zdCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBpZiBpdAorLy8gZXhpc3RzLCBvciBudWxscHRyIG90aGVyd2lzZS4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uPgorY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUqCitGaW5kT3JOdWxsKGNvbnN0IENvbGxlY3Rpb24mIGNvbGxlY3Rpb24sCisgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSkgeworICB0eXBlbmFtZSBDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IGNvbGxlY3Rpb24uZmluZChrZXkpOworICBpZiAoaXQgPT0gY29sbGVjdGlvbi5lbmQoKSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAmaXQtPnNlY29uZDsKK30KKworLy8gU2FtZSBhcyBhYm92ZSBidXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5vbi1jb25zdCB2YWx1ZS4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uPgordHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUqCitGaW5kT3JOdWxsKENvbGxlY3Rpb24mIGNvbGxlY3Rpb24sICAvLyBOT0xJTlQKKyAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZSYga2V5KSB7CisgIHR5cGVuYW1lIENvbGxlY3Rpb246Oml0ZXJhdG9yIGl0ID0gY29sbGVjdGlvbi5maW5kKGtleSk7CisgIGlmIChpdCA9PSBjb2xsZWN0aW9uLmVuZCgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuICZpdC0+c2Vjb25kOworfQorCisvLyBSZXR1cm5zIHRoZSBwb2ludGVyIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5LiBJZiBub25lIGlzIGZvdW5kLAorLy8gbnVsbHB0ciBpcyByZXR1cm5lZC4gVGhlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgd2l0aCBhIG1hcCBvZiBrZXlzIHRvCisvLyBwb2ludGVycy4KKy8vCisvLyBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBtaXNzaW5nIGtleSBhbmQgYSBrZXkgbWFwcGVkCisvLyB0byBudWxscHRyLgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Cit0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZQorRmluZFB0ck9yTnVsbChjb25zdCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlJiBrZXkpIHsKKyAgdHlwZW5hbWUgQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb2xsZWN0aW9uLmZpbmQoa2V5KTsKKyAgaWYgKGl0ID09IGNvbGxlY3Rpb24uZW5kKCkpIHsKKyAgICByZXR1cm4gdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUoKTsKKyAgfQorICByZXR1cm4gaXQtPnNlY29uZDsKK30KKworLy8gU2FtZSBhcyBhYm92ZSwgZXhjZXB0IHRha2VzIG5vbi1jb25zdCByZWZlcmVuY2UgdG8gY29sbGVjdGlvbi4KKy8vCisvLyBUaGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCBmb3IgY29udGFpbmVycyB0aGF0IHByb3BhZ2F0ZSBjb25zdG5lc3MgdG8gdGhlCisvLyBwb2ludGVlLCBzdWNoIGFzIGJvb3N0OjpwdHJfbWFwLgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Cit0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZQorRmluZFB0ck9yTnVsbChDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLCAgLy8gTk9MSU5UCisgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSkgeworICB0eXBlbmFtZSBDb2xsZWN0aW9uOjppdGVyYXRvciBpdCA9IGNvbGxlY3Rpb24uZmluZChrZXkpOworICBpZiAoaXQgPT0gY29sbGVjdGlvbi5lbmQoKSkgeworICAgIHJldHVybiB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSgpOworICB9CisgIHJldHVybiBpdC0+c2Vjb25kOworfQorCisvLyBGaW5kcyB0aGUgcG9pbnRlciB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBpbiBhIG1hcCB3aG9zZSB2YWx1ZXMKKy8vIGFyZSBsaW5rZWRfcHRycy4gUmV0dXJucyBudWxscHRyIGlmIGtleSBpcyBub3QgZm91bmQuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbj4KK3R5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OnNlY29uZF90eXBlOjplbGVtZW50X3R5cGUqCitGaW5kTGlua2VkUHRyT3JOdWxsKGNvbnN0IENvbGxlY3Rpb24mIGNvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSkgeworICB0eXBlbmFtZSBDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IGNvbGxlY3Rpb24uZmluZChrZXkpOworICBpZiAoaXQgPT0gY29sbGVjdGlvbi5lbmQoKSkgeworICAgIHJldHVybiAwOworICB9CisgIC8vIFNpbmNlIGxpbmtlZF9wdHI6OmdldCgpIGlzIGEgY29uc3QgbWVtYmVyIHJldHVybmluZyBhIG5vbiBjb25zdCwKKyAgLy8gd2UgZG8gbm90IG5lZWQgYSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gdGFraW5nIGEgbm9uIGNvbnN0IGNvbGxlY3Rpb24uCisgIHJldHVybiBpdC0+c2Vjb25kLmdldCgpOworfQorCisvLyBTYW1lIGFzIGFib3ZlLCBidXQgZGllcyBpZiB0aGUga2V5IGlzIG5vdCBmb3VuZC4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uPgordHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGU6OmVsZW1lbnRfdHlwZSYKK0ZpbmRMaW5rZWRQdHJPckRpZShjb25zdCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSkgeworICB0eXBlbmFtZSBDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IGNvbGxlY3Rpb24uZmluZChrZXkpOworICBHT09HTEVfQ0hFQ0soaXQgIT0gY29sbGVjdGlvbi5lbmQoKSkgPDwgICJrZXkgbm90IGZvdW5kOiAiIDw8IGtleTsKKyAgLy8gU2luY2UgbGlua2VkX3B0cjo6b3BlcmF0b3IqKCkgaXMgYSBjb25zdCBtZW1iZXIgcmV0dXJuaW5nIGEgbm9uIGNvbnN0LAorICAvLyB3ZSBkbyBub3QgbmVlZCBhIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiB0YWtpbmcgYSBub24gY29uc3QgY29sbGVjdGlvbi4KKyAgcmV0dXJuICppdC0+c2Vjb25kOworfQorCisvLyBGaW5kcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIGNvcGllcyBpdCB0byAqdmFsdWUgKGlmIG5vdAorLy8gbnVsbHB0cikuIFJldHVybnMgZmFsc2UgaWYgdGhlIGtleSB3YXMgbm90IGZvdW5kLCB0cnVlIG90aGVyd2lzZS4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uLCBjbGFzcyBLZXksIGNsYXNzIFZhbHVlPgorYm9vbCBGaW5kQ29weShjb25zdCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICBjb25zdCBLZXkmIGtleSwKKyAgICAgICAgICAgICAgVmFsdWUqIGNvbnN0IHZhbHVlKSB7CisgIHR5cGVuYW1lIENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29sbGVjdGlvbi5maW5kKGtleSk7CisgIGlmIChpdCA9PSBjb2xsZWN0aW9uLmVuZCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICh2YWx1ZSkgeworICAgICp2YWx1ZSA9IGl0LT5zZWNvbmQ7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vCisvLyBDb250YWlucyooKQorLy8KKworLy8gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGNvbnRhaW5zIHRoZSBnaXZlbiBrZXkuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbiwgY2xhc3MgS2V5PgorYm9vbCBDb250YWluc0tleShjb25zdCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLCBjb25zdCBLZXkmIGtleSkgeworICByZXR1cm4gY29sbGVjdGlvbi5maW5kKGtleSkgIT0gY29sbGVjdGlvbi5lbmQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGNvbnRhaW5zIHRoZSBnaXZlbiBrZXktdmFsdWUKKy8vIHBhaXIuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbiwgY2xhc3MgS2V5LCBjbGFzcyBWYWx1ZT4KK2Jvb2wgQ29udGFpbnNLZXlWYWx1ZVBhaXIoY29uc3QgQ29sbGVjdGlvbiYgY29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5JiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlJiB2YWx1ZSkgeworICB0eXBlZGVmIHR5cGVuYW1lIENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiByYW5nZSA9IGNvbGxlY3Rpb24uZXF1YWxfcmFuZ2Uoa2V5KTsKKyAgZm9yIChjb25zdF9pdGVyYXRvciBpdCA9IHJhbmdlLmZpcnN0OyBpdCAhPSByYW5nZS5zZWNvbmQ7ICsraXQpIHsKKyAgICBpZiAoaXQtPnNlY29uZCA9PSB2YWx1ZSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8KKy8vIEluc2VydCooKQorLy8KKworLy8gSW5zZXJ0cyB0aGUgZ2l2ZW4ga2V5LXZhbHVlIHBhaXIgaW50byB0aGUgY29sbGVjdGlvbi4gUmV0dXJucyB0cnVlIGlmIGFuZAorLy8gb25seSBpZiB0aGUga2V5IGZyb20gdGhlIGdpdmVuIHBhaXIgZGlkbid0IHByZXZpb3VzbHkgZXhpc3QuIE90aGVyd2lzZSwgdGhlCisvLyB2YWx1ZSBpbiB0aGUgbWFwIGlzIHJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIGZyb20gdGhlIGdpdmVuIHBhaXIuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbj4KK2Jvb2wgSW5zZXJ0T3JVcGRhdGUoQ29sbGVjdGlvbiogY29uc3QgY29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZSYgdnQpIHsKKyAgc3RkOjpwYWlyPHR5cGVuYW1lIENvbGxlY3Rpb246Oml0ZXJhdG9yLCBib29sPiByZXQgPSBjb2xsZWN0aW9uLT5pbnNlcnQodnQpOworICBpZiAoIXJldC5zZWNvbmQpIHsKKyAgICAvLyB1cGRhdGUKKyAgICByZXQuZmlyc3QtPnNlY29uZCA9IHZ0LnNlY29uZDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFNhbWUgYXMgYWJvdmUsIGV4Y2VwdCB0aGF0IHRoZSBrZXkgYW5kIHZhbHVlIGFyZSBwYXNzZWQgc2VwYXJhdGVseS4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uPgorYm9vbCBJbnNlcnRPclVwZGF0ZShDb2xsZWN0aW9uKiBjb25zdCBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlJiBrZXksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OnNlY29uZF90eXBlJiB2YWx1ZSkgeworICByZXR1cm4gSW5zZXJ0T3JVcGRhdGUoCisgICAgICBjb2xsZWN0aW9uLCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlKGtleSwgdmFsdWUpKTsKK30KKworLy8gSW5zZXJ0cy91cGRhdGVzIGFsbCB0aGUga2V5LXZhbHVlIHBhaXJzIGZyb20gdGhlIHJhbmdlIGRlZmluZWQgYnkgdGhlCisvLyBpdGVyYXRvcnMgImZpcnN0IiBhbmQgImxhc3QiIGludG8gdGhlIGdpdmVuIGNvbGxlY3Rpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbiwgY2xhc3MgSW5wdXRJdGVyYXRvcj4KK3ZvaWQgSW5zZXJ0T3JVcGRhdGVNYW55KENvbGxlY3Rpb24qIGNvbnN0IGNvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QpIHsKKyAgZm9yICg7IGZpcnN0ICE9IGxhc3Q7ICsrZmlyc3QpIHsKKyAgICBJbnNlcnRPclVwZGF0ZShjb2xsZWN0aW9uLCAqZmlyc3QpOworICB9Cit9CisKKy8vIENoYW5nZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBrZXkgaW4gYSBtYXAgb3IgaGFzaF9tYXAKKy8vIG9mIHRoZSBmb3JtIG1hcDxLZXksIFZhbHVlKj4gd2hpY2ggb3ducyB0aGUgb2JqZWN0cyBwb2ludGVkIHRvIGJ5IHRoZQorLy8gdmFsdWUgcG9pbnRlcnMuICBJZiB0aGVyZSB3YXMgYW4gZXhpc3RpbmcgdmFsdWUgZm9yIHRoZSBrZXksIGl0IGlzIGRlbGV0ZWQuCisvLyBUcnVlIGluZGljYXRlcyBhbiBpbnNlcnQgdG9vayBwbGFjZSwgZmFsc2UgaW5kaWNhdGVzIGFuIHVwZGF0ZSArIGRlbGV0ZS4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uPgorYm9vbCBJbnNlcnRBbmREZWxldGVFeGlzdGluZygKKyAgICBDb2xsZWN0aW9uKiBjb25zdCBjb2xsZWN0aW9uLAorICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSwKKyAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYgdmFsdWUpIHsKKyAgc3RkOjpwYWlyPHR5cGVuYW1lIENvbGxlY3Rpb246Oml0ZXJhdG9yLCBib29sPiByZXQgPQorICAgICAgY29sbGVjdGlvbi0+aW5zZXJ0KHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGUoa2V5LCB2YWx1ZSkpOworICBpZiAoIXJldC5zZWNvbmQpIHsKKyAgICBkZWxldGUgcmV0LmZpcnN0LT5zZWNvbmQ7CisgICAgcmV0LmZpcnN0LT5zZWNvbmQgPSB2YWx1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEluc2VydHMgdGhlIGdpdmVuIGtleSBhbmQgdmFsdWUgaW50byB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBpZiBhbmQgb25seSBpZiB0aGUKKy8vIGdpdmVuIGtleSBkaWQgTk9UIGFscmVhZHkgZXhpc3QgaW4gdGhlIGNvbGxlY3Rpb24uIElmIHRoZSBrZXkgcHJldmlvdXNseQorLy8gZXhpc3RlZCBpbiB0aGUgY29sbGVjdGlvbiwgdGhlIHZhbHVlIGlzIG5vdCBjaGFuZ2VkLiBSZXR1cm5zIHRydWUgaWYgdGhlCisvLyBrZXktdmFsdWUgcGFpciB3YXMgaW5zZXJ0ZWQ7IHJldHVybnMgZmFsc2UgaWYgdGhlIGtleSB3YXMgYWxyZWFkeSBwcmVzZW50LgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Citib29sIEluc2VydElmTm90UHJlc2VudChDb2xsZWN0aW9uKiBjb25zdCBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZSYgdnQpIHsKKyAgcmV0dXJuIGNvbGxlY3Rpb24tPmluc2VydCh2dCkuc2Vjb25kOworfQorCisvLyBTYW1lIGFzIGFib3ZlIGV4Y2VwdCB0aGUga2V5IGFuZCB2YWx1ZSBhcmUgcGFzc2VkIHNlcGFyYXRlbHkuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbj4KK2Jvb2wgSW5zZXJ0SWZOb3RQcmVzZW50KAorICAgIENvbGxlY3Rpb24qIGNvbnN0IGNvbGxlY3Rpb24sCisgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZSYga2V5LAorICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OnNlY29uZF90eXBlJiB2YWx1ZSkgeworICByZXR1cm4gSW5zZXJ0SWZOb3RQcmVzZW50KAorICAgICAgY29sbGVjdGlvbiwgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZShrZXksIHZhbHVlKSk7Cit9CisKKy8vIFNhbWUgYXMgYWJvdmUgZXhjZXB0IGRpZXMgaWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY29sbGVjdGlvbi4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uPgordm9pZCBJbnNlcnRPckRpZShDb2xsZWN0aW9uKiBjb25zdCBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlJiB2YWx1ZSkgeworICBHT09HTEVfQ0hFQ0soSW5zZXJ0SWZOb3RQcmVzZW50KGNvbGxlY3Rpb24sIHZhbHVlKSkKKyAgICAgIDw8ICJkdXBsaWNhdGUgdmFsdWU6ICIgPDwgdmFsdWU7Cit9CisKKy8vIFNhbWUgYXMgYWJvdmUgZXhjZXB0IGRvZXNuJ3QgbG9nIHRoZSB2YWx1ZSBvbiBlcnJvci4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uPgordm9pZCBJbnNlcnRPckRpZU5vUHJpbnQoQ29sbGVjdGlvbiogY29uc3QgY29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGUmIHZhbHVlKSB7CisgIEdPT0dMRV9DSEVDSyhJbnNlcnRJZk5vdFByZXNlbnQoY29sbGVjdGlvbiwgdmFsdWUpKSA8PCAiZHVwbGljYXRlIHZhbHVlLiI7Cit9CisKKy8vIEluc2VydHMgdGhlIGtleS12YWx1ZSBwYWlyIGludG8gdGhlIGNvbGxlY3Rpb24uIERpZXMgaWYga2V5IHdhcyBhbHJlYWR5CisvLyBwcmVzZW50LgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Cit2b2lkIEluc2VydE9yRGllKENvbGxlY3Rpb24qIGNvbnN0IGNvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSwKKyAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUmIGRhdGEpIHsKKyAgR09PR0xFX0NIRUNLKEluc2VydElmTm90UHJlc2VudChjb2xsZWN0aW9uLCBrZXksIGRhdGEpKQorICAgICAgPDwgImR1cGxpY2F0ZSBrZXk6ICIgPDwga2V5OworfQorCisvLyBTYW1lIGFzIGFib3ZlIGV4Y2VwdCBkb2Vzbid0IGxvZyB0aGUga2V5IG9uIGVycm9yLgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Cit2b2lkIEluc2VydE9yRGllTm9QcmludCgKKyAgICBDb2xsZWN0aW9uKiBjb25zdCBjb2xsZWN0aW9uLAorICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSwKKyAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYgZGF0YSkgeworICBHT09HTEVfQ0hFQ0soSW5zZXJ0SWZOb3RQcmVzZW50KGNvbGxlY3Rpb24sIGtleSwgZGF0YSkpIDw8ICJkdXBsaWNhdGUga2V5LiI7Cit9CisKKy8vIEluc2VydHMgYSBuZXcga2V5IGFuZCBkZWZhdWx0LWluaXRpYWxpemVkIHZhbHVlLiBEaWVzIGlmIHRoZSBrZXkgd2FzIGFscmVhZHkKKy8vIHByZXNlbnQuIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhbHVlLiBFeGFtcGxlIHVzYWdlOgorLy8KKy8vIG1hcDxpbnQsIFNvbWVQcm90bz4gbTsKKy8vIFNvbWVQcm90byYgcHJvdG8gPSBJbnNlcnRLZXlPckRpZSgmbSwgMyk7CisvLyBwcm90by5zZXRfZmllbGQoImZvbyIpOwordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Cit0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYgSW5zZXJ0S2V5T3JEaWUoCisgICAgQ29sbGVjdGlvbiogY29uc3QgY29sbGVjdGlvbiwKKyAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlJiBrZXkpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHN0ZDo6cGFpcjx0eXBlbmFtZSBDb2xsZWN0aW9uOjppdGVyYXRvciwgYm9vbD4gcmVzID0KKyAgICAgIGNvbGxlY3Rpb24tPmluc2VydCh2YWx1ZV90eXBlKGtleSwgdHlwZW5hbWUgdmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUoKSkpOworICBHT09HTEVfQ0hFQ0socmVzLnNlY29uZCkgPDwgImR1cGxpY2F0ZSBrZXk6ICIgPDwga2V5OworICByZXR1cm4gcmVzLmZpcnN0LT5zZWNvbmQ7Cit9CisKKy8vCisvLyBMb29rdXAqKCkKKy8vCisKKy8vIExvb2tzIHVwIGEgZ2l2ZW4ga2V5IGFuZCB2YWx1ZSBwYWlyIGluIGEgY29sbGVjdGlvbiBhbmQgaW5zZXJ0cyB0aGUga2V5LXZhbHVlCisvLyBwYWlyIGlmIGl0J3Mgbm90IGFscmVhZHkgcHJlc2VudC4gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFsdWUgYXNzb2NpYXRlZAorLy8gd2l0aCB0aGUga2V5LgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Cit0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYKK0xvb2t1cE9ySW5zZXJ0KENvbGxlY3Rpb24qIGNvbnN0IGNvbGxlY3Rpb24sCisgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlJiB2dCkgeworICByZXR1cm4gY29sbGVjdGlvbi0+aW5zZXJ0KHZ0KS5maXJzdC0+c2Vjb25kOworfQorCisvLyBTYW1lIGFzIGFib3ZlIGV4Y2VwdCB0aGUga2V5LXZhbHVlIGFyZSBwYXNzZWQgc2VwYXJhdGVseS4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uPgordHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUmCitMb29rdXBPckluc2VydChDb2xsZWN0aW9uKiBjb25zdCBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZSYga2V5LAorICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUmIHZhbHVlKSB7CisgIHJldHVybiBMb29rdXBPckluc2VydCgKKyAgICAgIGNvbGxlY3Rpb24sIHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGUoa2V5LCB2YWx1ZSkpOworfQorCisvLyBDb3VudHMgdGhlIG51bWJlciBvZiBlcXVpdmFsZW50IGVsZW1lbnRzIGluIHRoZSBnaXZlbiAic2VxdWVuY2UiLCBhbmQgc3RvcmVzCisvLyB0aGUgcmVzdWx0cyBpbiAiY291bnRfbWFwIiB3aXRoIGVsZW1lbnQgYXMgdGhlIGtleSBhbmQgY291bnQgYXMgdGhlIHZhbHVlLgorLy8KKy8vIEV4YW1wbGU6CisvLyAgIHZlY3RvcjxzdHJpbmc+IHYgPSB7ImEiLCAiYiIsICJjIiwgImEiLCAiYiJ9OworLy8gICBtYXA8c3RyaW5nLCBpbnQ+IG07CisvLyAgIEFkZFRva2VuQ291bnRzKHYsIDEsICZtKTsKKy8vICAgYXNzZXJ0KG1bImEiXSA9PSAyKTsKKy8vICAgYXNzZXJ0KG1bImIiXSA9PSAyKTsKKy8vICAgYXNzZXJ0KG1bImMiXSA9PSAxKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXF1ZW5jZSwgdHlwZW5hbWUgQ29sbGVjdGlvbj4KK3ZvaWQgQWRkVG9rZW5Db3VudHMoCisgICAgY29uc3QgU2VxdWVuY2UmIHNlcXVlbmNlLAorICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OnNlY29uZF90eXBlJiBpbmNyZW1lbnQsCisgICAgQ29sbGVjdGlvbiogY29uc3QgY291bnRfbWFwKSB7CisgIGZvciAodHlwZW5hbWUgU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc2VxdWVuY2UuYmVnaW4oKTsKKyAgICAgICBpdCAhPSBzZXF1ZW5jZS5lbmQoKTsgKytpdCkgeworICAgIHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OnNlY29uZF90eXBlJiB2YWx1ZSA9CisgICAgICAgIExvb2t1cE9ySW5zZXJ0KGNvdW50X21hcCwgKml0LAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSgpKTsKKyAgICB2YWx1ZSArPSBpbmNyZW1lbnQ7CisgIH0KK30KKworLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGtleS4gSWYgbm90IGZvdW5kLCBhIHZhbHVlCisvLyBpcyBkZWZhdWx0IGNvbnN0cnVjdGVkIG9uIHRoZSBoZWFwIGFuZCBhZGRlZCB0byB0aGUgbWFwLgorLy8KKy8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBjb250YWluZXJzIG9mIHRoZSBmb3JtIG1hcDxLZXksIFZhbHVlKj4sIHdoZXJlCisvLyBpbnNlcnRpbmcgYSBuZXcga2V5LCB2YWx1ZSBwYWlyIGludm9sdmVzIGNvbnN0cnVjdGluZyBhIG5ldyBoZWFwLWFsbG9jYXRlZAorLy8gVmFsdWUsIGFuZCBzdG9yaW5nIGEgcG9pbnRlciB0byB0aGF0IGluIHRoZSBjb2xsZWN0aW9uLgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Cit0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYKK0xvb2t1cE9ySW5zZXJ0TmV3KENvbGxlY3Rpb24qIGNvbnN0IGNvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlJiBrZXkpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czwKKyAgICB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZT46OnZhbHVlX3R5cGUgRWxlbWVudDsKKyAgc3RkOjpwYWlyPHR5cGVuYW1lIENvbGxlY3Rpb246Oml0ZXJhdG9yLCBib29sPiByZXQgPQorICAgICAgY29sbGVjdGlvbi0+aW5zZXJ0KHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGUoCisgICAgICAgICAga2V5LAorICAgICAgICAgIHN0YXRpY19jYXN0PHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OnNlY29uZF90eXBlPihudWxscHRyKSkpOworICBpZiAocmV0LnNlY29uZCkgeworICAgIHJldC5maXJzdC0+c2Vjb25kID0gbmV3IEVsZW1lbnQoKTsKKyAgfQorICByZXR1cm4gcmV0LmZpcnN0LT5zZWNvbmQ7Cit9CisKKy8vIFNhbWUgYXMgYWJvdmUgYnV0IGNvbnN0cnVjdHMgdGhlIHZhbHVlIHVzaW5nIHRoZSBzaW5nbGUtYXJndW1lbnQgY29uc3RydWN0b3IKKy8vIGFuZCB0aGUgZ2l2ZW4gImFyZyIuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbiwgY2xhc3MgQXJnPgordHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUmCitMb29rdXBPckluc2VydE5ldyhDb2xsZWN0aW9uKiBjb25zdCBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZSYga2V5LAorICAgICAgICAgICAgICAgICAgY29uc3QgQXJnJiBhcmcpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czwKKyAgICB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZT46OnZhbHVlX3R5cGUgRWxlbWVudDsKKyAgc3RkOjpwYWlyPHR5cGVuYW1lIENvbGxlY3Rpb246Oml0ZXJhdG9yLCBib29sPiByZXQgPQorICAgICAgY29sbGVjdGlvbi0+aW5zZXJ0KHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGUoCisgICAgICAgICAga2V5LAorICAgICAgICAgIHN0YXRpY19jYXN0PHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OnNlY29uZF90eXBlPihudWxscHRyKSkpOworICBpZiAocmV0LnNlY29uZCkgeworICAgIHJldC5maXJzdC0+c2Vjb25kID0gbmV3IEVsZW1lbnQoYXJnKTsKKyAgfQorICByZXR1cm4gcmV0LmZpcnN0LT5zZWNvbmQ7Cit9CisKKy8vIExvb2t1cCBvZiBsaW5rZWQvc2hhcmVkIHBvaW50ZXJzIGlzIHVzZWQgaW4gdHdvIHNjZW5hcmlvczoKKy8vCisvLyBVc2UgTG9va3VwT3JJbnNlcnROZXdMaW5rZWRQdHIgaWYgdGhlIGNvbnRhaW5lciBvd25zIHRoZSBlbGVtZW50cy4KKy8vIEluIHRoaXMgY2FzZSBpdCBpcyBmaW5lIHdvcmtpbmcgd2l0aCB0aGUgcmF3IHBvaW50ZXIgYXMgbG9uZyBhcyBpdCBpcworLy8gZ3VhcmFudGVlZCB0aGF0IG5vIG90aGVyIHRocmVhZCBjYW4gZGVsZXRlL3VwZGF0ZSBhbiBhY2Nlc3NlZCBlbGVtZW50LgorLy8gQSBtdXRleCB3aWxsIG5lZWQgdG8gbG9jayB0aGUgY29udGFpbmVyIG9wZXJhdGlvbiBhcyB3ZWxsIGFzIHRoZSB1c2UKKy8vIG9mIHRoZSByZXR1cm5lZCBlbGVtZW50cy4gRmluZGluZyBhbiBlbGVtZW50IG1heSBiZSBwZXJmb3JtZWQgdXNpbmcKKy8vIEZpbmRMaW5rZWRQdHIqKCkuCisvLworLy8gVXNlIExvb2t1cE9ySW5zZXJ0TmV3U2hhcmVkUHRyIGlmIHRoZSBjb250YWluZXIgZG9lcyBub3Qgb3duIHRoZSBlbGVtZW50cworLy8gZm9yIHRoZWlyIHdob2xlIGxpZmV0aW1lLiBUaGlzIGlzIHR5cGljYWxseSB0aGUgY2FzZSB3aGVuIGEgcmVhZGVyIGFsbG93cworLy8gcGFyYWxsZWwgdXBkYXRlcyB0byB0aGUgY29udGFpbmVyLiBJbiB0aGlzIGNhc2UgYSBNdXRleCBvbmx5IG5lZWRzIHRvIGxvY2sKKy8vIGNvbnRhaW5lciBvcGVyYXRpb25zLCBidXQgYWxsIGVsZW1lbnQgb3BlcmF0aW9ucyBtdXN0IGJlIHBlcmZvcm1lZCBvbiB0aGUKKy8vIHNoYXJlZCBwb2ludGVyLiBGaW5kaW5nIGFuIGVsZW1lbnQgbXVzdCBiZSBwZXJmb3JtZWQgdXNpbmcgRmluZFB0ciooKSBhbmQKKy8vIGNhbm5vdCBiZSBkb25lIHdpdGggRmluZExpbmtlZFB0ciooKSBldmVuIHRob3VnaCBpdCBjb21waWxlcy4KKworLy8gTG9va3VwIGEga2V5IGluIGEgbWFwIG9yIGhhc2hfbWFwIHdob3NlIHZhbHVlcyBhcmUgbGlua2VkX3B0cnMuICBJZiBpdCBpcworLy8gbWlzc2luZywgc2V0IGNvbGxlY3Rpb25ba2V5XS5yZXNldChuZXcgVmFsdWU6OmVsZW1lbnRfdHlwZSkgYW5kIHJldHVybiB0aGF0LgorLy8gVmFsdWU6OmVsZW1lbnRfdHlwZSBtdXN0IGJlIGRlZmF1bHQgY29uc3RydWN0YWJsZS4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uPgordHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGU6OmVsZW1lbnRfdHlwZSoKK0xvb2t1cE9ySW5zZXJ0TmV3TGlua2VkUHRyKAorICAgIENvbGxlY3Rpb24qIGNvbnN0IGNvbGxlY3Rpb24sCisgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZSYga2V5KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUgVmFsdWU7CisgIHN0ZDo6cGFpcjx0eXBlbmFtZSBDb2xsZWN0aW9uOjppdGVyYXRvciwgYm9vbD4gcmV0ID0KKyAgICAgIGNvbGxlY3Rpb24tPmluc2VydCh0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlKGtleSwgVmFsdWUoKSkpOworICBpZiAocmV0LnNlY29uZCkgeworICAgIHJldC5maXJzdC0+c2Vjb25kLnJlc2V0KG5ldyB0eXBlbmFtZSBWYWx1ZTo6ZWxlbWVudF90eXBlKTsKKyAgfQorICByZXR1cm4gcmV0LmZpcnN0LT5zZWNvbmQuZ2V0KCk7Cit9CisKKy8vIEEgdmFyaWFudCBvZiBMb29rdXBPckluc2VydE5ld0xpbmtlZFB0ciB3aGVyZSB0aGUgdmFsdWUgaXMgY29uc3RydWN0ZWQgdXNpbmcKKy8vIGEgc2luZ2xlLXBhcmFtZXRlciBjb25zdHJ1Y3Rvci4gIE5vdGU6IHRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudCBpcyBjb21wdXRlZAorLy8gZXZlbiBpZiBpdCB3aWxsIG5vdCBiZSB1c2VkLCBzbyBvbmx5IHZhbHVlcyBjaGVhcCB0byBjb21wdXRlIHNob3VsZCBiZSBwYXNzZWQKKy8vIGhlcmUuICBPbiB0aGUgb3RoZXIgaGFuZCBpdCBkb2VzIG5vdCBtYXR0ZXIgaG93IGV4cGVuc2l2ZSB0aGUgY29uc3RydWN0aW9uIG9mCisvLyB0aGUgYWN0dWFsIHN0b3JlZCB2YWx1ZSBpcywgYXMgdGhhdCBvbmx5IG9jY3VycyBpZiBuZWNlc3NhcnkuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbiwgY2xhc3MgQXJnPgordHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGU6OmVsZW1lbnRfdHlwZSoKK0xvb2t1cE9ySW5zZXJ0TmV3TGlua2VkUHRyKAorICAgIENvbGxlY3Rpb24qIGNvbnN0IGNvbGxlY3Rpb24sCisgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZSYga2V5LAorICAgIGNvbnN0IEFyZyYgYXJnKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUgVmFsdWU7CisgIHN0ZDo6cGFpcjx0eXBlbmFtZSBDb2xsZWN0aW9uOjppdGVyYXRvciwgYm9vbD4gcmV0ID0KKyAgICAgIGNvbGxlY3Rpb24tPmluc2VydCh0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlKGtleSwgVmFsdWUoKSkpOworICBpZiAocmV0LnNlY29uZCkgeworICAgIHJldC5maXJzdC0+c2Vjb25kLnJlc2V0KG5ldyB0eXBlbmFtZSBWYWx1ZTo6ZWxlbWVudF90eXBlKGFyZykpOworICB9CisgIHJldHVybiByZXQuZmlyc3QtPnNlY29uZC5nZXQoKTsKK30KKworLy8gTG9va3VwIGEga2V5IGluIGEgbWFwIG9yIGhhc2hfbWFwIHdob3NlIHZhbHVlcyBhcmUgc2hhcmVkX3B0cnMuICBJZiBpdCBpcworLy8gbWlzc2luZywgc2V0IGNvbGxlY3Rpb25ba2V5XS5yZXNldChuZXcgVmFsdWU6OmVsZW1lbnRfdHlwZSkuIFVubGlrZQorLy8gTG9va3VwT3JJbnNlcnROZXdMaW5rZWRQdHIsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2hhcmVkX3B0ciBpbnN0ZWFkIG9mCisvLyB0aGUgcmF3IHBvaW50ZXIuIFZhbHVlOjplbGVtZW50X3R5cGUgbXVzdCBiZSBkZWZhdWx0IGNvbnN0cnVjdGFibGUuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbj4KK3R5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OnNlY29uZF90eXBlJgorTG9va3VwT3JJbnNlcnROZXdTaGFyZWRQdHIoCisgICAgQ29sbGVjdGlvbiogY29uc3QgY29sbGVjdGlvbiwKKyAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlJiBrZXkpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSBTaGFyZWRQdHI7CisgIHR5cGVkZWYgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGU6OmVsZW1lbnRfdHlwZSBFbGVtZW50OworICBzdGQ6OnBhaXI8dHlwZW5hbWUgQ29sbGVjdGlvbjo6aXRlcmF0b3IsIGJvb2w+IHJldCA9CisgICAgICBjb2xsZWN0aW9uLT5pbnNlcnQodHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZShrZXksIFNoYXJlZFB0cigpKSk7CisgIGlmIChyZXQuc2Vjb25kKSB7CisgICAgcmV0LmZpcnN0LT5zZWNvbmQucmVzZXQobmV3IEVsZW1lbnQoKSk7CisgIH0KKyAgcmV0dXJuIHJldC5maXJzdC0+c2Vjb25kOworfQorCisvLyBBIHZhcmlhbnQgb2YgTG9va3VwT3JJbnNlcnROZXdTaGFyZWRQdHIgd2hlcmUgdGhlIHZhbHVlIGlzIGNvbnN0cnVjdGVkIHVzaW5nCisvLyBhIHNpbmdsZS1wYXJhbWV0ZXIgY29uc3RydWN0b3IuICBOb3RlOiB0aGUgY29uc3RydWN0b3IgYXJndW1lbnQgaXMgY29tcHV0ZWQKKy8vIGV2ZW4gaWYgaXQgd2lsbCBub3QgYmUgdXNlZCwgc28gb25seSB2YWx1ZXMgY2hlYXAgdG8gY29tcHV0ZSBzaG91bGQgYmUgcGFzc2VkCisvLyBoZXJlLiAgT24gdGhlIG90aGVyIGhhbmQgaXQgZG9lcyBub3QgbWF0dGVyIGhvdyBleHBlbnNpdmUgdGhlIGNvbnN0cnVjdGlvbiBvZgorLy8gdGhlIGFjdHVhbCBzdG9yZWQgdmFsdWUgaXMsIGFzIHRoYXQgb25seSBvY2N1cnMgaWYgbmVjZXNzYXJ5LgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24sIGNsYXNzIEFyZz4KK3R5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OnNlY29uZF90eXBlJgorTG9va3VwT3JJbnNlcnROZXdTaGFyZWRQdHIoCisgICAgQ29sbGVjdGlvbiogY29uc3QgY29sbGVjdGlvbiwKKyAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlJiBrZXksCisgICAgY29uc3QgQXJnJiBhcmcpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSBTaGFyZWRQdHI7CisgIHR5cGVkZWYgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGU6OmVsZW1lbnRfdHlwZSBFbGVtZW50OworICBzdGQ6OnBhaXI8dHlwZW5hbWUgQ29sbGVjdGlvbjo6aXRlcmF0b3IsIGJvb2w+IHJldCA9CisgICAgICBjb2xsZWN0aW9uLT5pbnNlcnQodHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZShrZXksIFNoYXJlZFB0cigpKSk7CisgIGlmIChyZXQuc2Vjb25kKSB7CisgICAgcmV0LmZpcnN0LT5zZWNvbmQucmVzZXQobmV3IEVsZW1lbnQoYXJnKSk7CisgIH0KKyAgcmV0dXJuIHJldC5maXJzdC0+c2Vjb25kOworfQorCisvLworLy8gTWlzYyBVdGlsaXR5IEZ1bmN0aW9ucworLy8KKworLy8gVXBkYXRlcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkuIElmIHRoZSBrZXkgd2FzIG5vdCBhbHJlYWR5CisvLyBwcmVzZW50LCB0aGVuIHRoZSBrZXktdmFsdWUgcGFpciBhcmUgaW5zZXJ0ZWQgYW5kICJwcmV2aW91cyIgaXMgdW5jaGFuZ2VkLiBJZgorLy8gdGhlIGtleSB3YXMgYWxyZWFkeSBwcmVzZW50LCB0aGUgdmFsdWUgaXMgdXBkYXRlZCBhbmQgIipwcmV2aW91cyIgd2lsbAorLy8gY29udGFpbiBhIGNvcHkgb2YgdGhlIG9sZCB2YWx1ZS4KKy8vCisvLyBJbnNlcnRPclJldHVybkV4aXN0aW5nIGhhcyBjb21wbGVtZW50YXJ5IGJlaGF2aW9yIHRoYXQgcmV0dXJucyB0aGUKKy8vIGFkZHJlc3Mgb2YgYW4gYWxyZWFkeSBleGlzdGluZyB2YWx1ZSwgcmF0aGVyIHRoYW4gdXBkYXRpbmcgaXQuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbj4KK2Jvb2wgVXBkYXRlUmV0dXJuQ29weShDb2xsZWN0aW9uKiBjb25zdCBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUqIHByZXZpb3VzKSB7CisgIHN0ZDo6cGFpcjx0eXBlbmFtZSBDb2xsZWN0aW9uOjppdGVyYXRvciwgYm9vbD4gcmV0ID0KKyAgICAgIGNvbGxlY3Rpb24tPmluc2VydCh0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlKGtleSwgdmFsdWUpKTsKKyAgaWYgKCFyZXQuc2Vjb25kKSB7CisgICAgLy8gdXBkYXRlCisgICAgaWYgKHByZXZpb3VzKSB7CisgICAgICAqcHJldmlvdXMgPSByZXQuZmlyc3QtPnNlY29uZDsKKyAgICB9CisgICAgcmV0LmZpcnN0LT5zZWNvbmQgPSB2YWx1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFNhbWUgYXMgYWJvdmUgZXhjZXB0IHRoYXQgdGhlIGtleSBhbmQgdmFsdWUgYXJlIHBhc3NlZCBhcyBhIHBhaXIuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbj4KK2Jvb2wgVXBkYXRlUmV0dXJuQ29weShDb2xsZWN0aW9uKiBjb25zdCBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGUmIHZ0LAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OnNlY29uZF90eXBlKiBwcmV2aW91cykgeworICBzdGQ6OnBhaXI8dHlwZW5hbWUgQ29sbGVjdGlvbjo6aXRlcmF0b3IsIGJvb2w+IHJldCA9IGNvbGxlY3Rpb24tPmluc2VydCh2dCk7CisgIGlmICghcmV0LnNlY29uZCkgeworICAgIC8vIHVwZGF0ZQorICAgIGlmIChwcmV2aW91cykgeworICAgICAgKnByZXZpb3VzID0gcmV0LmZpcnN0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldC5maXJzdC0+c2Vjb25kID0gdnQuc2Vjb25kOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gVHJpZXMgdG8gaW5zZXJ0IHRoZSBnaXZlbiBrZXktdmFsdWUgcGFpciBpbnRvIHRoZSBjb2xsZWN0aW9uLiBSZXR1cm5zIG51bGxwdHIgaWYKKy8vIHRoZSBpbnNlcnQgc3VjY2VlZHMuIE90aGVyd2lzZSwgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGV4aXN0aW5nIHZhbHVlLgorLy8KKy8vIFRoaXMgY29tcGxlbWVudHMgVXBkYXRlUmV0dXJuQ29weSBpbiB0aGF0IGl0IGFsbG93cyB0byB1cGRhdGUgb25seSBhZnRlcgorLy8gdmVyaWZ5aW5nIHRoZSBvbGQgdmFsdWUgYW5kIHN0aWxsIGluc2VydCBxdWlja2x5IHdpdGhvdXQgaGF2aW5nIHRvIGxvb2sgdXAKKy8vIHR3aWNlLiBVbmxpa2UgVXBkYXRlUmV0dXJuQ29weSB0aGlzIGFsc28gZG9lcyBub3QgY29tZSB3aXRoIHRoZSBpc3N1ZSBvZiBhbgorLy8gdW5kZWZpbmVkIHByZXZpb3VzKiBpbiBjYXNlIG5ldyBkYXRhIHdhcyBpbnNlcnRlZC4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uPgordHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUqIEluc2VydE9yUmV0dXJuRXhpc3RpbmcoCisgICAgQ29sbGVjdGlvbiogY29uc3QgY29sbGVjdGlvbiwgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZSYgdnQpIHsKKyAgc3RkOjpwYWlyPHR5cGVuYW1lIENvbGxlY3Rpb246Oml0ZXJhdG9yLCBib29sPiByZXQgPSBjb2xsZWN0aW9uLT5pbnNlcnQodnQpOworICBpZiAocmV0LnNlY29uZCkgeworICAgIHJldHVybiBudWxscHRyOyAgLy8gSW5zZXJ0ZWQsIG5vIGV4aXN0aW5nIHByZXZpb3VzIHZhbHVlLgorICB9IGVsc2UgeworICAgIHJldHVybiAmcmV0LmZpcnN0LT5zZWNvbmQ7ICAvLyBSZXR1cm4gYWRkcmVzcyBvZiBhbHJlYWR5IGV4aXN0aW5nIHZhbHVlLgorICB9Cit9CisKKy8vIFNhbWUgYXMgYWJvdmUsIGV4Y2VwdCBmb3IgZXhwbGljaXQga2V5IGFuZCBkYXRhLgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Cit0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSogSW5zZXJ0T3JSZXR1cm5FeGlzdGluZygKKyAgICBDb2xsZWN0aW9uKiBjb25zdCBjb2xsZWN0aW9uLAorICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSwKKyAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYgZGF0YSkgeworICByZXR1cm4gSW5zZXJ0T3JSZXR1cm5FeGlzdGluZyhjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlKGtleSwgZGF0YSkpOworfQorCisvLyBFcmFzZXMgdGhlIGNvbGxlY3Rpb24gaXRlbSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXksIGFuZCByZXR1cm5zIHRoZSB2YWx1ZQorLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQga2V5LiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHZhbHVlIChpLmUuLCB0aGUKKy8vIG1hcHBlZF90eXBlKSBpcyBhIHBvaW50ZXIuIFJldHVybnMgbnVsbHB0ciBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgaW4gdGhlCisvLyBjb2xsZWN0aW9uLgorLy8KKy8vIEV4YW1wbGVzOgorLy8gICBtYXA8c3RyaW5nLCBNeVR5cGUqPiBteV9tYXA7CisvLworLy8gT25lIGxpbmUgY2xlYW51cDoKKy8vICAgICBkZWxldGUgRXJhc2VLZXlSZXR1cm5WYWx1ZVB0cigmbXlfbWFwLCAiYWJjIik7CisvLworLy8gVXNlIHJldHVybmVkIHZhbHVlOgorLy8gICAgIHN0ZDo6dW5pcXVlX3B0cjxNeVR5cGU+IHZhbHVlX3B0cigKKy8vICAgICAgICAgRXJhc2VLZXlSZXR1cm5WYWx1ZVB0cigmbXlfbWFwLCAiYWJjIikpOworLy8gICAgIGlmICh2YWx1ZV9wdHIuZ2V0KCkpCisvLyAgICAgICB2YWx1ZV9wdHItPkRvU29tZXRoaW5nKCk7CisvLwordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Cit0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSBFcmFzZUtleVJldHVyblZhbHVlUHRyKAorICAgIENvbGxlY3Rpb24qIGNvbnN0IGNvbGxlY3Rpb24sCisgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZSYga2V5KSB7CisgIHR5cGVuYW1lIENvbGxlY3Rpb246Oml0ZXJhdG9yIGl0ID0gY29sbGVjdGlvbi0+ZmluZChrZXkpOworICBpZiAoaXQgPT0gY29sbGVjdGlvbi0+ZW5kKCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSB2ID0gaXQtPnNlY29uZDsKKyAgY29sbGVjdGlvbi0+ZXJhc2UoaXQpOworICByZXR1cm4gdjsKK30KKworLy8gSW5zZXJ0cyBhbGwgdGhlIGtleXMgZnJvbSBtYXBfY29udGFpbmVyIGludG8ga2V5X2NvbnRhaW5lciwgd2hpY2ggbXVzdAorLy8gc3VwcG9ydCBpbnNlcnQoTWFwQ29udGFpbmVyOjprZXlfdHlwZSkuCisvLworLy8gTm90ZTogYW55IGluaXRpYWwgY29udGVudHMgb2YgdGhlIGtleV9jb250YWluZXIgYXJlIG5vdCBjbGVhcmVkLgordGVtcGxhdGUgPGNsYXNzIE1hcENvbnRhaW5lciwgY2xhc3MgS2V5Q29udGFpbmVyPgordm9pZCBJbnNlcnRLZXlzRnJvbU1hcChjb25zdCBNYXBDb250YWluZXImIG1hcF9jb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEtleUNvbnRhaW5lcioga2V5X2NvbnRhaW5lcikgeworICBHT09HTEVfQ0hFQ0soa2V5X2NvbnRhaW5lciAhPSBudWxscHRyKTsKKyAgZm9yICh0eXBlbmFtZSBNYXBDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWFwX2NvbnRhaW5lci5iZWdpbigpOworICAgICAgIGl0ICE9IG1hcF9jb250YWluZXIuZW5kKCk7ICsraXQpIHsKKyAgICBrZXlfY29udGFpbmVyLT5pbnNlcnQoaXQtPmZpcnN0KTsKKyAgfQorfQorCisvLyBBcHBlbmRzIGFsbCB0aGUga2V5cyBmcm9tIG1hcF9jb250YWluZXIgaW50byBrZXlfY29udGFpbmVyLCB3aGljaCBtdXN0CisvLyBzdXBwb3J0IHB1c2hfYmFjayhNYXBDb250YWluZXI6OmtleV90eXBlKS4KKy8vCisvLyBOb3RlOiBhbnkgaW5pdGlhbCBjb250ZW50cyBvZiB0aGUga2V5X2NvbnRhaW5lciBhcmUgbm90IGNsZWFyZWQuCit0ZW1wbGF0ZSA8Y2xhc3MgTWFwQ29udGFpbmVyLCBjbGFzcyBLZXlDb250YWluZXI+Cit2b2lkIEFwcGVuZEtleXNGcm9tTWFwKGNvbnN0IE1hcENvbnRhaW5lciYgbWFwX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgS2V5Q29udGFpbmVyKiBrZXlfY29udGFpbmVyKSB7CisgIEdPT0dMRV9DSEVDSyhrZXlfY29udGFpbmVyICE9IG51bGxwdHIpOworICBmb3IgKHR5cGVuYW1lIE1hcENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXBfY29udGFpbmVyLmJlZ2luKCk7CisgICAgICAgaXQgIT0gbWFwX2NvbnRhaW5lci5lbmQoKTsgKytpdCkgeworICAgIGtleV9jb250YWluZXItPnB1c2hfYmFjayhpdC0+Zmlyc3QpOworICB9Cit9CisKKy8vIEEgbW9yZSBzcGVjaWFsaXplZCBvdmVybG9hZCBvZiBBcHBlbmRLZXlzRnJvbU1hcCB0byBvcHRpbWl6ZSByZWFsbG9jYXRpb25zCisvLyBmb3IgdGhlIGNvbW1vbiBjYXNlIGluIHdoaWNoIHdlJ3JlIGFwcGVuZGluZyBrZXlzIHRvIGEgdmVjdG9yIGFuZCBoZW5jZSBjYW4KKy8vIChhbmQgc29tZXRpbWVzIHNob3VsZCkgY2FsbCByZXNlcnZlKCkgZmlyc3QuCisvLworLy8gKEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHBsYXkgU0ZJTkFFIGdhbWVzIHRvIGNhbGwgcmVzZXJ2ZSgpIGZvciBhbnkKKy8vIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIGl0LCBidXQgdGhpcyBzZWVtcyB0byBnZXQgdXMgOTklIG9mIHdoYXQgd2UgbmVlZAorLy8gd2l0aG91dCB0aGUgY29tcGxleGl0eSBvZiBhIFNGSU5BRS1iYXNlZCBzb2x1dGlvbi4pCit0ZW1wbGF0ZSA8Y2xhc3MgTWFwQ29udGFpbmVyLCBjbGFzcyBLZXlUeXBlPgordm9pZCBBcHBlbmRLZXlzRnJvbU1hcChjb25zdCBNYXBDb250YWluZXImIG1hcF9jb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEtleVR5cGU+KiBrZXlfY29udGFpbmVyKSB7CisgIEdPT0dMRV9DSEVDSyhrZXlfY29udGFpbmVyICE9IG51bGxwdHIpOworICAvLyBXZSBub3cgaGF2ZSB0aGUgb3Bwb3J0dW5pdHkgdG8gY2FsbCByZXNlcnZlKCkuIENhbGxpbmcgcmVzZXJ2ZSgpIGV2ZXJ5CisgIC8vIHRpbWUgaXMgYSBiYWQgaWRlYSBmb3Igc29tZSB1c2UgY2FzZXM6IGxpYnN0ZGMrKydzIGltcGxlbWVudGF0aW9uIG9mCisgIC8vIHZlY3Rvcjw+OjpyZXNlcnZlKCkgcmVzaXplcyB0aGUgdmVjdG9yJ3MgYmFja2luZyBzdG9yZSB0byBleGFjdGx5IHRoZQorICAvLyBnaXZlbiBzaXplICh1bmxlc3MgaXQncyBhbHJlYWR5IGF0IGxlYXN0IHRoYXQgYmlnKS4gQmVjYXVzZSBvZiB0aGlzLAorICAvLyB0aGUgdXNlIGNhc2UgdGhhdCBpbnZvbHZlcyBhcHBlbmRpbmcgYSBsb3Qgb2Ygc21hbGwgbWFwcyAodG90YWwgc2l6ZQorICAvLyBOKSBvbmUgYnkgb25lIHRvIGEgdmVjdG9yIHdvdWxkIGJlIE8oTl4yKS4gQnV0IG5ldmVyIGNhbGxpbmcgcmVzZXJ2ZSgpCisgIC8vIGxvc2VzIHRoZSBvcHBvcnR1bml0eSB0byBpbXByb3ZlIHRoZSB1c2UgY2FzZSBvZiBhZGRpbmcgZnJvbSBhIGxhcmdlCisgIC8vIG1hcCB0byBhbiBlbXB0eSB2ZWN0b3IgKHRoaXMgaW1wcm92ZXMgcGVyZm9ybWFuY2UgYnkgdXAgdG8gMzMlKS4gQQorICAvLyBudW1iZXIgb2YgaGV1cmlzdGljcyBhcmUgcG9zc2libGU7IHNlZSB0aGUgZGlzY3Vzc2lvbiBpbgorICAvLyBjbC8zNDA4MTY5Ni4gSGVyZSB3ZSB1c2UgdGhlIHNpbXBsZXN0IG9uZS4KKyAgaWYgKGtleV9jb250YWluZXItPmVtcHR5KCkpIHsKKyAgICBrZXlfY29udGFpbmVyLT5yZXNlcnZlKG1hcF9jb250YWluZXIuc2l6ZSgpKTsKKyAgfQorICBmb3IgKHR5cGVuYW1lIE1hcENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXBfY29udGFpbmVyLmJlZ2luKCk7CisgICAgICAgaXQgIT0gbWFwX2NvbnRhaW5lci5lbmQoKTsgKytpdCkgeworICAgIGtleV9jb250YWluZXItPnB1c2hfYmFjayhpdC0+Zmlyc3QpOworICB9Cit9CisKKy8vIEluc2VydHMgYWxsIHRoZSB2YWx1ZXMgZnJvbSBtYXBfY29udGFpbmVyIGludG8gdmFsdWVfY29udGFpbmVyLCB3aGljaCBtdXN0CisvLyBzdXBwb3J0IHB1c2hfYmFjayhNYXBDb250YWluZXI6Om1hcHBlZF90eXBlKS4KKy8vCisvLyBOb3RlOiBhbnkgaW5pdGlhbCBjb250ZW50cyBvZiB0aGUgdmFsdWVfY29udGFpbmVyIGFyZSBub3QgY2xlYXJlZC4KK3RlbXBsYXRlIDxjbGFzcyBNYXBDb250YWluZXIsIGNsYXNzIFZhbHVlQ29udGFpbmVyPgordm9pZCBBcHBlbmRWYWx1ZXNGcm9tTWFwKGNvbnN0IE1hcENvbnRhaW5lciYgbWFwX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUNvbnRhaW5lciogdmFsdWVfY29udGFpbmVyKSB7CisgIEdPT0dMRV9DSEVDSyh2YWx1ZV9jb250YWluZXIgIT0gbnVsbHB0cik7CisgIGZvciAodHlwZW5hbWUgTWFwQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBpdCA9IG1hcF9jb250YWluZXIuYmVnaW4oKTsKKyAgICAgICBpdCAhPSBtYXBfY29udGFpbmVyLmVuZCgpOyArK2l0KSB7CisgICAgdmFsdWVfY29udGFpbmVyLT5wdXNoX2JhY2soaXQtPnNlY29uZCk7CisgIH0KK30KKworLy8gQSBtb3JlIHNwZWNpYWxpemVkIG92ZXJsb2FkIG9mIEFwcGVuZFZhbHVlc0Zyb21NYXAgdG8gb3B0aW1pemUgcmVhbGxvY2F0aW9ucworLy8gZm9yIHRoZSBjb21tb24gY2FzZSBpbiB3aGljaCB3ZSdyZSBhcHBlbmRpbmcgdmFsdWVzIHRvIGEgdmVjdG9yIGFuZCBoZW5jZQorLy8gY2FuIChhbmQgc29tZXRpbWVzIHNob3VsZCkgY2FsbCByZXNlcnZlKCkgZmlyc3QuCisvLworLy8gKEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHBsYXkgU0ZJTkFFIGdhbWVzIHRvIGNhbGwgcmVzZXJ2ZSgpIGZvciBhbnkKKy8vIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIGl0LCBidXQgdGhpcyBzZWVtcyB0byBnZXQgdXMgOTklIG9mIHdoYXQgd2UgbmVlZAorLy8gd2l0aG91dCB0aGUgY29tcGxleGl0eSBvZiBhIFNGSU5BRS1iYXNlZCBzb2x1dGlvbi4pCit0ZW1wbGF0ZSA8Y2xhc3MgTWFwQ29udGFpbmVyLCBjbGFzcyBWYWx1ZVR5cGU+Cit2b2lkIEFwcGVuZFZhbHVlc0Zyb21NYXAoY29uc3QgTWFwQ29udGFpbmVyJiBtYXBfY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlVHlwZT4qIHZhbHVlX2NvbnRhaW5lcikgeworICBHT09HTEVfQ0hFQ0sodmFsdWVfY29udGFpbmVyICE9IG51bGxwdHIpOworICAvLyBTZWUgQXBwZW5kS2V5c0Zyb21NYXAgZm9yIHdoeSB0aGlzIGlzIGRvbmUuCisgIGlmICh2YWx1ZV9jb250YWluZXItPmVtcHR5KCkpIHsKKyAgICB2YWx1ZV9jb250YWluZXItPnJlc2VydmUobWFwX2NvbnRhaW5lci5zaXplKCkpOworICB9CisgIGZvciAodHlwZW5hbWUgTWFwQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBpdCA9IG1hcF9jb250YWluZXIuYmVnaW4oKTsKKyAgICAgICBpdCAhPSBtYXBfY29udGFpbmVyLmVuZCgpOyArK2l0KSB7CisgICAgdmFsdWVfY29udGFpbmVyLT5wdXNoX2JhY2soaXQtPnNlY29uZCk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX01BUF9VVElMX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRodXRpbC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRodXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTZiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hdGh1dGlsLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfTUFUSFVUSUxfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX01BVEhVVElMX0hfCisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBMaWtlIHN0ZDo6bWFrZV91bnNpZ25lZF90IGV4Y2VwdCBmbG9hdGluZyBwb2ludCB0eXBlcyBtYXAgdG8gdGhlbXNlbHZlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordXNpbmcgTWFrZVVuc2lnbmVkVCA9CisgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSwgc3RkOjptYWtlX3Vuc2lnbmVkPFQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb21tb25fdHlwZTxUPj46OnR5cGU6OnR5cGU7CisKKy8vIExpa2Ugc3RkOjppc25hbigpIGV4Y2VwdCBhIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgaXMgZGVmaW5lZCBmb3IgYWxsIG51bWVyaWMKKy8vIHR5cGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsCisgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgorYm9vbCBJc05hbihUIC8qdmFsKi8pIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50Pjo6dHlwZSA9IDA+Citib29sIElzTmFuKFQgdmFsKSB7CisgIHJldHVybiBzdGQ6OmlzbmFuKHZhbCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEFsbW9zdEVxdWFscyhUIGEsIFQgYikgeworICByZXR1cm4gYSA9PSBiOworfQordGVtcGxhdGU8PgoraW5saW5lIGJvb2wgQWxtb3N0RXF1YWxzKGZsb2F0IGEsIGZsb2F0IGIpIHsKKyAgcmV0dXJuIGZhYnMoYSAtIGIpIDwgMzIgKiBGTFRfRVBTSUxPTjsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGJvb2wgQWxtb3N0RXF1YWxzKGRvdWJsZSBhLCBkb3VibGUgYikgeworICByZXR1cm4gZmFicyhhIC0gYikgPCAzMiAqIERCTF9FUFNJTE9OOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworY2xhc3MgTWF0aFV0aWwgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBUIFNpZ24oVCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA9PSBUKDApIHx8IGludGVybmFsOjpJc05hbih2YWx1ZSkpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlID4gVCgwKSA/IDEgOiAtMTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgYm9vbCBBbG1vc3RFcXVhbHMoVCBhLCBUIGIpIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OkFsbW9zdEVxdWFscyhhLCBiKTsKKyAgfQorCisgIC8vIExhcmdlc3Qgb2YgdHdvIHZhbHVlcy4KKyAgLy8gV29ya3MgY29ycmVjdGx5IGZvciBzcGVjaWFsIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4KKyAgLy8gTm90ZTogMC4wIGFuZCAtMC4wIGFyZSBub3QgZGlmZmVyZW50aWF0ZWQgYnkgTWF4IChNYXgoMC4wLCAtMC4wKSBpcyAtMC4wKSwKKyAgLy8gd2hpY2ggc2hvdWxkIGJlIE9LIGJlY2F1c2UsIGFsdGhvdWdoIHRoZXkgKGNhbikgaGF2ZSBkaWZmZXJlbnQKKyAgLy8gYml0IHJlcHJlc2VudGF0aW9uLCB0aGV5IGFyZSBvYnNlcnZhYmx5IHRoZSBzYW1lIHdoZW4gZXhhbWluZWQKKyAgLy8gd2l0aCBhcml0aG1ldGljIGFuZCAoaW4pZXF1YWxpdHkgb3BlcmF0b3JzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIFQgTWF4KGNvbnN0IFQgeCwgY29uc3QgVCB5KSB7CisgICAgcmV0dXJuIGludGVybmFsOjpJc05hbih4KSB8fCB4ID4geSA/IHggOiB5OworICB9CisKKyAgLy8gQWJzb2x1dGUgdmFsdWUgb2YgeAorICAvLyBXb3JrcyBjb3JyZWN0bHkgZm9yIHVuc2lnbmVkIHR5cGVzIGFuZAorICAvLyBmb3Igc3BlY2lhbCBmbG9hdGluZyBwb2ludCB2YWx1ZXMuCisgIC8vIE5vdGU6IDAuMCBhbmQgLTAuMCBhcmUgbm90IGRpZmZlcmVudGlhdGVkIGJ5IEFicyAoQWJzKDAuMCkgaXMgLTAuMCksCisgIC8vIHdoaWNoIHNob3VsZCBiZSBPSzogc2VlIHRoZSBjb21tZW50IGZvciBNYXggYWJvdmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBUIEFicyhjb25zdCBUIHgpIHsKKyAgICByZXR1cm4geCA+IFQoMCkgPyB4IDogLXg7CisgIH0KKworICAvLyBBYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBudW1iZXJzLgorICAvLyBXb3JrcyBjb3JyZWN0bHkgZm9yIHNpZ25lZCB0eXBlcyBhbmQgc3BlY2lhbCBmbG9hdGluZyBwb2ludCB2YWx1ZXMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgdHlwZW5hbWUgaW50ZXJuYWw6Ok1ha2VVbnNpZ25lZFQ8VD4gQWJzRGlmZihjb25zdCBUIHgsIGNvbnN0IFQgeSkgeworICAgIC8vIENhcnJpZXMgb3V0IGFyaXRobWV0aWMgYXMgdW5zaWduZWQgdG8gYXZvaWQgb3ZlcmZsb3cuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6TWFrZVVuc2lnbmVkVDxUPiBSOworICAgIHJldHVybiB4ID4geSA/IFIoeCkgLSBSKHkpIDogUih5KSAtIFIoeCk7CisgIH0KKworICAvLyBJZiB0d28gKHVzdWFsbHkgZmxvYXRpbmcgcG9pbnQpIG51bWJlcnMgYXJlIHdpdGhpbiBhIGNlcnRhaW4KKyAgLy8gZnJhY3Rpb24gb2YgdGhlaXIgbWFnbml0dWRlIG9yIHdpdGhpbiBhIGNlcnRhaW4gYWJzb2x1dGUgbWFyZ2luIG9mIGVycm9yLgorICAvLyBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBmb2xsb3dpbmcgYnV0IGZhc3RlcjoKKyAgLy8gICBXaXRoaW5GcmFjdGlvbih4LCB5LCBmcmFjdGlvbikgIHx8ICBXaXRoaW5NYXJnaW4oeCwgeSwgbWFyZ2luKQorICAvLyBFLmcuIFdpdGhpbkZyYWN0aW9uKDAuMCwgMWUtMTAsIDFlLTUpIGlzIGZhbHNlIGJ1dAorICAvLyAgICAgIFdpdGhpbkZyYWN0aW9uT3JNYXJnaW4oMC4wLCAxZS0xMCwgMWUtNSwgMWUtNSkgaXMgdHJ1ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgc3RhdGljIGJvb2wgV2l0aGluRnJhY3Rpb25Pck1hcmdpbihjb25zdCBUIHgsIGNvbnN0IFQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUIGZyYWN0aW9uLCBjb25zdCBUIG1hcmdpbik7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBNYXRoVXRpbDo6V2l0aGluRnJhY3Rpb25Pck1hcmdpbihjb25zdCBUIHgsIGNvbnN0IFQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCBmcmFjdGlvbiwgY29uc3QgVCBtYXJnaW4pIHsKKyAgLy8gTm90IGp1c3QgIjAgPD0gZnJhY3Rpb24iIHRvIGZvb2wgdGhlIGNvbXBpbGVyIGZvciB1bnNpZ25lZCB0eXBlcy4KKyAgR09PR0xFX0RDSEVDSygoVCgwKSA8IGZyYWN0aW9uIHx8IFQoMCkgPT0gZnJhY3Rpb24pICYmCisgICAgICAgICBmcmFjdGlvbiA8IFQoMSkgJiYKKyAgICAgICAgIG1hcmdpbiA+PSBUKDApKTsKKworICAvLyBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB3aWxsIGNvbnZlcnQgdGhlIGlmKCkgY29uZGl0aW9uIHRvIGEgY29uc3RhbnQsCisgIC8vIHdoaWNoIHdpbGwgY2F1c2UgdGhlIGNvbXBpbGVyIHRvIGdlbmVyYXRlIGNvZGUgZm9yIGVpdGhlciB0aGUgImlmIiBwYXJ0CisgIC8vIG9yIHRoZSAidGhlbiIgcGFydC4gIEluIHRoaXMgd2F5IHdlIGF2b2lkIGEgY29tcGlsZXIgd2FybmluZworICAvLyBhYm91dCBhIHBvdGVudGlhbCBpbnRlZ2VyIG92ZXJmbG93IGluIGNyb3NzdG9vbCB2MTIgKGdjYyA0LjMuMSkuCisgIGlmIChzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyKSB7CisgICAgcmV0dXJuIHggPT0geTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIXN0ZDo6aXNmaW5pdGUoeCkgfHwgIXN0ZDo6aXNmaW5pdGUoeSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgVCByZWxhdGl2ZV9tYXJnaW4gPSBzdGF0aWNfY2FzdDxUPihmcmFjdGlvbiAqIE1heChBYnMoeCksIEFicyh5KSkpOworICAgIHJldHVybiBBYnNEaWZmKHgsIHkpIDw9IE1heChtYXJnaW4sIHJlbGF0aXZlX21hcmdpbik7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX01BVEhVVElMX0hfCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL211dGV4LmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL211dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1OTk5MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbXV0ZXguaApAQCAtMCwwICsxLDIxOCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfTVVURVhfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX01VVEVYX0hfCisKKyNpbmNsdWRlIDxtdXRleD4KKworI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9TVVBQT1JUX1dJTkRPV1NfWFAKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworLy8gR2V0TWVzc2FnZSBjb25mbGljdHMgd2l0aCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0TWVzc2FnZSgpLgorI2lmZGVmIEdldE1lc3NhZ2UKKyN1bmRlZiBHZXRNZXNzYWdlCisjZW5kaWYKKworI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFjcm9zLmg+CisKKy8vIERlZmluZSB0aHJlYWQtc2FmZXR5IGFubm90YXRpb25zIGZvciB1c2UgYmVsb3csIGlmIHdlIGFyZSBidWlsZGluZyB3aXRoCisvLyBDbGFuZy4KKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykgJiYgIWRlZmluZWQoU1dJRykKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FDUVVJUkUoLi4uKSBcCisgIF9fYXR0cmlidXRlX18oKGFjcXVpcmVfY2FwYWJpbGl0eShfX1ZBX0FSR1NfXykpKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUkVMRUFTRSguLi4pIFwKKyAgX19hdHRyaWJ1dGVfXygocmVsZWFzZV9jYXBhYmlsaXR5KF9fVkFfQVJHU19fKSkpCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TQ09QRURfQ0FQQUJJTElUWSBfX2F0dHJpYnV0ZV9fKChzY29wZWRfbG9ja2FibGUpKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ0FQQUJJTElUWSh4KSBfX2F0dHJpYnV0ZV9fKChjYXBhYmlsaXR5KHgpKSkKKyNlbHNlCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BQ1FVSVJFKC4uLikKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1JFTEVBU0UoLi4uKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU0NPUEVEX0NBUEFCSUxJVFkKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NBUEFCSUxJVFkoeCkKKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL211dGV4LmgKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0xJTktFUl9JTklUSUFMSVpFRAorCisjaWZkZWYgR09PR0xFX1BST1RPQlVGX1NVUFBPUlRfV0lORE9XU19YUAorCisvLyBUaGlzIGNsYXNzIGlzIGEgbGlnaHR3ZWlnaHQgcmVwbGFjZW1lbnQgZm9yIHN0ZDo6bXV0ZXggb24gV2luZG93cyBwbGF0Zm9ybXMuCisvLyBzdGQ6Om11dGV4IGRvZXMgbm90IHdvcmsgb24gV2luZG93cyBYUCBTUDIgd2l0aCB0aGUgbGF0ZXN0IFZDKysgbGlicmFyaWVzLAorLy8gYmVjYXVzZSBpdCB1dGlsaXplcyB0aGUgQ29uY3VycmVuY3kgUnVudGltZSB0aGF0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIFdpbmRvd3MKKy8vIFhQIFNQMyBhbmQgYWJvdmUuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgQ3JpdGljYWxTZWN0aW9uTG9jayB7CisgcHVibGljOgorICBDcml0aWNhbFNlY3Rpb25Mb2NrKCkgeyBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZjcml0aWNhbF9zZWN0aW9uXyk7IH0KKyAgfkNyaXRpY2FsU2VjdGlvbkxvY2soKSB7IERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmY3JpdGljYWxfc2VjdGlvbl8pOyB9CisgIHZvaWQgbG9jaygpIHsgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmNyaXRpY2FsX3NlY3Rpb25fKTsgfQorICB2b2lkIHVubG9jaygpIHsgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmNyaXRpY2FsX3NlY3Rpb25fKTsgfQorCisgcHJpdmF0ZToKKyAgQ1JJVElDQUxfU0VDVElPTiBjcml0aWNhbF9zZWN0aW9uXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ3JpdGljYWxTZWN0aW9uTG9jayk7Cit9OworCisjZW5kaWYKKworLy8gSW4gTVNWQyBzdGQ6Om11dGV4IGRvZXMgbm90IGhhdmUgYSBjb25zdGV4cHIgY29uc3RydWN0b3IuCisvLyBUaGlzIHdyYXBwZXIgbWFrZXMgdGhlIGNvbnN0cnVjdG9yIGNvbnN0ZXhwci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQ2FsbE9uY2VJbml0aWFsaXplZE11dGV4IHsKKyBwdWJsaWM6CisgIGNvbnN0ZXhwciBDYWxsT25jZUluaXRpYWxpemVkTXV0ZXgoKSA6IGZsYWdfe30sIGJ1Zl97fSB7fQorICB+Q2FsbE9uY2VJbml0aWFsaXplZE11dGV4KCkgeyBnZXQoKS5+VCgpOyB9CisKKyAgdm9pZCBsb2NrKCkgeyBnZXQoKS5sb2NrKCk7IH0KKyAgdm9pZCB1bmxvY2soKSB7IGdldCgpLnVubG9jaygpOyB9CisKKyBwcml2YXRlOgorICBUJiBnZXQoKSB7CisgICAgc3RkOjpjYWxsX29uY2UoZmxhZ18sIFsmXSB7IDo6bmV3IChzdGF0aWNfY2FzdDx2b2lkKj4oJmJ1Zl8pKSBUKCk7IH0pOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFQmPihidWZfKTsKKyAgfQorCisgIHN0ZDo6b25jZV9mbGFnIGZsYWdfOworICBhbGlnbmFzKFQpIGNoYXIgYnVmX1tzaXplb2YoVCldOworfTsKKworLy8gTXV0ZXggaXMgYSBuYXR1cmFsIHR5cGUgdG8gd3JhcC4gQXMgYm90aCBnb29nbGUgYW5kIG90aGVyIG9yZ2FuaXphdGlvbiBoYXZlCisvLyBzcGVjaWFsaXplZCBtdXRleGVzLiBnUlBDIGFsc28gcHJvdmlkZXMgYW4gaW5qZWN0aW9uIG1lY2hhbmlzbSBmb3IgY3VzdG9tCisvLyBtdXRleGVzLgorY2xhc3MgR09PR0xFX1BST1RPQlVGX0NBUEFCSUxJVFkoIm11dGV4IikgUFJPVE9CVUZfRVhQT1JUIFdyYXBwZWRNdXRleCB7CisgcHVibGljOgorI2lmIGRlZmluZWQoX19RTlhfXykKKyAgY29uc3RleHByIFdyYXBwZWRNdXRleCgpID0gZGVmYXVsdDsKKyNlbHNlCisgIGNvbnN0ZXhwciBXcmFwcGVkTXV0ZXgoKSB7fQorI2VuZGlmCisgIHZvaWQgTG9jaygpIEdPT0dMRV9QUk9UT0JVRl9BQ1FVSVJFKCkgeyBtdV8ubG9jaygpOyB9CisgIHZvaWQgVW5sb2NrKCkgR09PR0xFX1BST1RPQlVGX1JFTEVBU0UoKSB7IG11Xy51bmxvY2soKTsgfQorICAvLyBDcmFzaCBpZiB0aGlzIE11dGV4IGlzIG5vdCBoZWxkIGV4Y2x1c2l2ZWx5IGJ5IHRoaXMgdGhyZWFkLgorICAvLyBNYXkgZmFpbCB0byBjcmFzaCB3aGVuIGl0IHNob3VsZDsgd2lsbCBuZXZlciBjcmFzaCB3aGVuIGl0IHNob3VsZCBub3QuCisgIHZvaWQgQXNzZXJ0SGVsZCgpIGNvbnN0IHt9CisKKyBwcml2YXRlOgorI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX1NVUFBPUlRfV0lORE9XU19YUCkKKyAgQ2FsbE9uY2VJbml0aWFsaXplZE11dGV4PENyaXRpY2FsU2VjdGlvbkxvY2s+IG11X3t9OworI2VsaWYgZGVmaW5lZChfV0lOMzIpCisgIENhbGxPbmNlSW5pdGlhbGl6ZWRNdXRleDxzdGQ6Om11dGV4PiBtdV97fTsKKyNlbHNlCisgIHN0ZDo6bXV0ZXggbXVfe307CisjZW5kaWYKK307CisKK3VzaW5nIE11dGV4ID0gV3JhcHBlZE11dGV4OworCisvLyBNdXRleExvY2sobXUpIGFjcXVpcmVzIG11IHdoZW4gY29uc3RydWN0ZWQgYW5kIHJlbGVhc2VzIGl0IHdoZW4gZGVzdHJveWVkLgorY2xhc3MgR09PR0xFX1BST1RPQlVGX1NDT1BFRF9DQVBBQklMSVRZIFBST1RPQlVGX0VYUE9SVCBNdXRleExvY2sgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTXV0ZXhMb2NrKE11dGV4KiBtdSkgR09PR0xFX1BST1RPQlVGX0FDUVVJUkUobXUpIDogbXVfKG11KSB7CisgICAgdGhpcy0+bXVfLT5Mb2NrKCk7CisgIH0KKyAgfk11dGV4TG9jaygpIEdPT0dMRV9QUk9UT0JVRl9SRUxFQVNFKCkgeyB0aGlzLT5tdV8tPlVubG9jaygpOyB9CisKKyBwcml2YXRlOgorICBNdXRleCAqY29uc3QgbXVfOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXV0ZXhMb2NrKTsKK307CisKKy8vIFRPRE8oa2VudG9uKTogIEltcGxlbWVudCB0aGVzZT8gIEhhcmQgdG8gaW1wbGVtZW50IHBvcnRhYmx5LgordHlwZWRlZiBNdXRleExvY2sgUmVhZGVyTXV0ZXhMb2NrOwordHlwZWRlZiBNdXRleExvY2sgV3JpdGVyTXV0ZXhMb2NrOworCisvLyBNdXRleExvY2tNYXliZSBpcyBsaWtlIE11dGV4TG9jaywgYnV0IGlzIGEgbm8tb3Agd2hlbiBtdSBpcyBudWxscHRyLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIE11dGV4TG9ja01heWJlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE11dGV4TG9ja01heWJlKE11dGV4ICptdSkgOgorICAgIG11XyhtdSkgeyBpZiAodGhpcy0+bXVfICE9IG51bGxwdHIpIHsgdGhpcy0+bXVfLT5Mb2NrKCk7IH0gfQorICB+TXV0ZXhMb2NrTWF5YmUoKSB7IGlmICh0aGlzLT5tdV8gIT0gbnVsbHB0cikgeyB0aGlzLT5tdV8tPlVubG9jaygpOyB9IH0KKyBwcml2YXRlOgorICBNdXRleCAqY29uc3QgbXVfOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXV0ZXhMb2NrTWF5YmUpOworfTsKKworI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRExPQ0FMKQordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIFRocmVhZExvY2FsU3RvcmFnZSB7CisgcHVibGljOgorICBUaHJlYWRMb2NhbFN0b3JhZ2UoKSB7CisgICAgcHRocmVhZF9rZXlfY3JlYXRlKCZrZXlfLCAmVGhyZWFkTG9jYWxTdG9yYWdlOjpEZWxldGUpOworICB9CisgIH5UaHJlYWRMb2NhbFN0b3JhZ2UoKSB7CisgICAgcHRocmVhZF9rZXlfZGVsZXRlKGtleV8pOworICB9CisgIFQqIEdldCgpIHsKKyAgICBUKiByZXN1bHQgPSBzdGF0aWNfY2FzdDxUKj4ocHRocmVhZF9nZXRzcGVjaWZpYyhrZXlfKSk7CisgICAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICByZXN1bHQgPSBuZXcgVCgpOworICAgICAgcHRocmVhZF9zZXRzcGVjaWZpYyhrZXlfLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgRGVsZXRlKHZvaWQqIHZhbHVlKSB7CisgICAgZGVsZXRlIHN0YXRpY19jYXN0PFQqPih2YWx1ZSk7CisgIH0KKyAgcHRocmVhZF9rZXlfdCBrZXlfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUaHJlYWRMb2NhbFN0b3JhZ2UpOworfTsKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gV2UgbWFkZSB0aGVzZSBpbnRlcm5hbCBzbyB0aGF0IHRoZXkgd291bGQgc2hvdyB1cCBhcyBzdWNoIGluIHRoZSBkb2NzLAorLy8gYnV0IHdlIGRvbid0IHdhbnQgdG8gc3RpY2sgImludGVybmFsOjoiIGluIGZyb250IG9mIHRoZW0gZXZlcnl3aGVyZS4KK3VzaW5nIGludGVybmFsOjpNdXRleDsKK3VzaW5nIGludGVybmFsOjpNdXRleExvY2s7Cit1c2luZyBpbnRlcm5hbDo6UmVhZGVyTXV0ZXhMb2NrOwordXNpbmcgaW50ZXJuYWw6OldyaXRlck11dGV4TG9jazsKK3VzaW5nIGludGVybmFsOjpNdXRleExvY2tNYXliZTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyN1bmRlZiBHT09HTEVfUFJPVE9CVUZfQUNRVUlSRQorI3VuZGVmIEdPT0dMRV9QUk9UT0JVRl9SRUxFQVNFCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX01VVEVYX0hfCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MGQzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaApAQCAtMCwwICsxLDU1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfT05DRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX09OQ0VfSF9fCisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKwordXNpbmcgb25jZV9mbGFnID0gc3RkOjpvbmNlX2ZsYWc7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KK3ZvaWQgY2FsbF9vbmNlKEFyZ3MmJi4uLiBhcmdzICkgeworICBzdGQ6OmNhbGxfb25jZShzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19PTkNFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wbGF0Zm9ybV9tYWNyb3MuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwZmFmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmgKQEAgLTAsMCArMSwxMzggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9QTEFURk9STV9NQUNST1NfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1BMQVRGT1JNX01BQ1JPU19IXworCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QTEFURk9STV9FUlJPUiBcCisjZXJyb3IgIkhvc3QgcGxhdGZvcm0gd2FzIG5vdCBkZXRlY3RlZCBhcyBzdXBwb3J0ZWQgYnkgcHJvdG9idWYiCisKKy8vIFByb2Nlc3NvciBhcmNoaXRlY3R1cmUgZGV0ZWN0aW9uLiAgRm9yIG1vcmUgaW5mbyBvbiB3aGF0J3MgZGVmaW5lZCwgc2VlOgorLy8gICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYjAwODRrYXkuYXNweAorLy8gICBodHRwOi8vd3d3LmFnbmVyLm9yZy9vcHRpbWl6ZS9jYWxsaW5nX2NvbnZlbnRpb25zLnBkZgorLy8gICBvciB3aXRoIGdjYywgcnVuOiAiZWNobyB8IGdjYyAtRSAtZE0gLSIKKyNpZiBkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9YNjQgMQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQgMQorI2VsaWYgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9JQTMyIDEKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfMzJfQklUIDEKKyNlbGlmIGRlZmluZWQoX19RTlhfXykKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfQVJNX1FOWCAxCisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfNjRfQklUIDEKKyNlbHNlCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzMyX0JJVCAxCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoX01fQVJNKSB8fCBkZWZpbmVkKF9fQVJNRUxfXykKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfQVJNIDEKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfMzJfQklUIDEKKyNlbGlmIGRlZmluZWQoX01fQVJNNjQpCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIX0FSTSAxCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzY0X0JJVCAxCisjZWxpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9BQVJDSDY0IDEKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfNjRfQklUIDEKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCisjaWYgZGVmaW5lZChfX0xQNjRfXykKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfTUlQUzY0IDEKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfNjRfQklUIDEKKyNlbHNlCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIX01JUFMgMQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fcG5hY2xfXykKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfMzJfQklUIDEKKyNlbGlmIGRlZmluZWQoc3BhcmMpCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIX1NQQVJDIDEKKyNpZiBkZWZpbmVkKF9fc3BhcmNfdjlfXykgfHwgZGVmaW5lZChfX3NwYXJjdjkpIHx8IGRlZmluZWQoX19hcmNoNjRfXykKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfNjRfQklUIDEKKyNlbHNlCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzMyX0JJVCAxCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoX1BPV0VSKSB8fCBkZWZpbmVkKF9fcG93ZXJwYzY0X18pIHx8IGRlZmluZWQoX19QUEM2NF9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9QT1dFUiAxCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzY0X0JJVCAxCisjZWxpZiBkZWZpbmVkKF9fUFBDX18pCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIX1BQQyAxCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzMyX0JJVCAxCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorIyBpZiAoKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gNykpIHx8IChfX0dOVUNfXyA+IDQpKQorLy8gV2UgZmFsbGJhY2sgdG8gdGhlIGdlbmVyaWMgQ2xhbmcvR0NDID49IDQuNyBpbXBsZW1lbnRhdGlvbiBpbiBhdG9taWNvcHMuaAorIyBlbGlmIGRlZmluZWQoX19jbGFuZ19fKQorIyAgaWYgIV9faGFzX2V4dGVuc2lvbihjX2F0b21pYykKK0dPT0dMRV9QUk9UT0JVRl9QTEFURk9STV9FUlJPUgorIyAgZW5kaWYKKy8vIFdlIGZhbGxiYWNrIHRvIHRoZSBnZW5lcmljIENsYW5nL0dDQyA+PSA0LjcgaW1wbGVtZW50YXRpb24gaW4gYXRvbWljb3BzLmgKKyMgZW5kaWYKKyMgaWYgX19MUDY0X18KKyMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQgMQorIyBlbHNlCisjICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfMzJfQklUIDEKKyMgZW5kaWYKKyNlbHNlCitHT09HTEVfUFJPVE9CVUZfUExBVEZPUk1fRVJST1IKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0FQUExFX18pCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9PU19BUFBMRQorI2luY2x1ZGUgPEF2YWlsYWJpbGl0eS5oPgorI2luY2x1ZGUgPFRhcmdldENvbmRpdGlvbmFscy5oPgorI2lmIFRBUkdFVF9PU19JUEhPTkUKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX09TX0lQSE9ORQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fRU1TQ1JJUFRFTl9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfT1NfRU1TQ1JJUFRFTgorI2VsaWYgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX09TX05BQ0wKKyNlbGlmIGRlZmluZWQoc3VuKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfT1NfU09MQVJJUworI2VsaWYgZGVmaW5lZChfQUlYKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfT1NfQUlYCisjZWxpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfT1NfQU5EUk9JRAorI2VuZGlmCisKKyN1bmRlZiBHT09HTEVfUFJPVE9CVUZfUExBVEZPUk1fRVJST1IKKworI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX09TX0FORFJPSUQpIHx8IGRlZmluZWQoR09PR0xFX1BST1RPQlVGX09TX0lQSE9ORSkKKy8vIEFuZHJvaWQgbmRrIGRvZXMgbm90IHN1cHBvcnQgdGhlIF9fdGhyZWFkIGtleXdvcmQgdmVyeSB3ZWxsIHlldC4gSGVyZQorLy8gd2UgdXNlIHB0aHJlYWRfa2V5X2NyZWF0ZSgpL3B0aHJlYWRfZ2V0c3BlY2lmaWMoKS8uLi4gbWV0aG9kcyBmb3IKKy8vIFRMUyBzdXBwb3J0IG9uIGFuZHJvaWQuCisvLyBpT1MgYWxzbyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBfX3RocmVhZCBrZXl3b3JkLgorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFETE9DQUwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEKSAmJiBfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEIDwgMTA3MAorLy8gX190aHJlYWQga2V5d29yZCByZXF1aXJlcyBhdCBsZWFzdCAxMC43CisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9OT19USFJFQURMT0NBTAorI2VuZGlmCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BMQVRGT1JNX01BQ1JPU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wb3J0LmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDc0Y2IxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wb3J0LmgKQEAgLTAsMCArMSw0MTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19QT1JUX0hfCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19QT1JUX0hfCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BsYXRmb3JtX21hY3Jvcy5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworI3VuZGVmIFBST1RPQlVGX0xJVFRMRV9FTkRJQU4KKyNpZmRlZiBfV0lOMzIKKyAgLy8gQXNzdW1pbmcgd2luZG93cyBpcyBhbHdheXMgbGl0dGxlLWVuZGlhbi4KKyAgLy8gVE9ETyh4aWFvZmVuZyk6IFRoZSBQUk9UT0JVRl9MSVRUTEVfRU5ESUFOIGlzIG5vdCBvbmx5IHVzZWQgZm9yCisgIC8vIG9wdGltaXphdGlvbiBidXQgYWxzbyBmb3IgY29ycmVjdG5lc3MuIFdlIHNob3VsZCBkZWZpbmUgYW4KKyAgLy8gZGlmZmVyZW50IG1hY3JvIHRvIHRlc3QgdGhlIGJpZy1lbmRpYW4gY29kZSBwYXRoIGluIGNvZGVkX3N0cmVhbS4KKyAgI2lmICFkZWZpbmVkKFBST1RPQlVGX0RJU0FCTEVfTElUVExFX0VORElBTl9PUFRfRk9SX1RFU1QpCisgICAgI2RlZmluZSBQUk9UT0JVRl9MSVRUTEVfRU5ESUFOIDEKKyAgI2VuZGlmCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTMwMCAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQorLy8gSWYgTVNWQyBoYXMgIi9SVENjIiBzZXQsIGl0IHdpbGwgY29tcGxhaW4gYWJvdXQgdHJ1bmNhdGluZyBjYXN0cyBhdAorLy8gcnVudGltZS4gIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGludGVudGlvbmFsIHRydW5jYXRpbmcgY2FzdHMuCisjcHJhZ21hIHJ1bnRpbWVfY2hlY2tzKCJjIiwgb2ZmKQorI2VuZGlmCisjZWxzZQorI2lmZGVmIF9fQVBQTEVfXworI2luY2x1ZGUgPG1hY2hpbmUvZW5kaWFuLmg+ICAvLyBfX0JZVEVfT1JERVIKKyNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pCisjaW5jbHVkZSA8c3lzL2VuZGlhbi5oPiAgLy8gX19CWVRFX09SREVSCisjZWxpZiAoZGVmaW5lZChzdW4pIHx8IGRlZmluZWQoX19zdW4pKSAmJiAoZGVmaW5lZChfX1NWUjQpIHx8IGRlZmluZWQoX19zdnI0X18pKQorI2luY2x1ZGUgPHN5cy9pc2FfZGVmcy5oPiAgLy8gX19CWVRFX09SREVSCisjZWxpZiBkZWZpbmVkKF9BSVgpIHx8IGRlZmluZWQoX19UT1NfQUlYX18pCisjaW5jbHVkZSA8c3lzL21hY2hpbmUuaD4gIC8vIEJZVEVfT1JERVIKKyNlbHNlCisjaWYgIWRlZmluZWQoX19RTlhfXykKKyNpbmNsdWRlIDxlbmRpYW4uaD4gIC8vIF9fQllURV9PUkRFUgorI2VuZGlmCisjZW5kaWYKKyNpZiAoKGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX18pICYmICFkZWZpbmVkKF9fQklHX0VORElBTl9fKSkgfHwgICBcCisgICAgIChkZWZpbmVkKF9fQllURV9PUkRFUikgJiYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTikgfHwgXAorICAgICAoZGVmaW5lZChCWVRFX09SREVSKSAmJiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4pKSAmJiAgICAgIFwKKyAgICAhZGVmaW5lZChQUk9UT0JVRl9ESVNBQkxFX0xJVFRMRV9FTkRJQU5fT1BUX0ZPUl9URVNUKQorI2RlZmluZSBQUk9UT0JVRl9MSVRUTEVfRU5ESUFOIDEKKyNlbmRpZgorI2VuZGlmCisKKy8vIFRoZXNlICNpbmNsdWRlcyBhcmUgZm9yIHRoZSBieXRlIHN3YXAgZnVuY3Rpb25zIGRlY2xhcmVkIGxhdGVyIG9uLgorI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBOT0xJTlQoYnVpbGQvaW5jbHVkZSkKKyNpbmNsdWRlIDxpbnRyaW4uaD4KKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorI2luY2x1ZGUgPGxpYmtlcm4vT1NCeXRlT3JkZXIuaD4KKyNlbGlmIGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9fQU5EUk9JRF9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKyNlbmRpZgorCisvLyBMZWdhY3k6IHNvbWUgdXNlcnMgcmVmZXJlbmNlIHRoZXNlIChpbnRlcm5hbC1vbmx5KSBtYWNyb3MgZXZlbiB0aG91Z2ggd2UKKy8vIGRvbid0IG5lZWQgdGhlbSBhbnkgbW9yZS4KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKFBST1RPQlVGX1VTRV9ETExTKQorICAjaWZkZWYgTElCUFJPVE9CVUZfRVhQT1JUUworICAgICNkZWZpbmUgTElCUFJPVE9CVUZfRVhQT1JUIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorICAjZWxzZQorICAgICNkZWZpbmUgTElCUFJPVE9CVUZfRVhQT1JUIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorICAjZW5kaWYKKyAgI2lmZGVmIExJQlBST1RPQ19FWFBPUlRTCisgICAgI2RlZmluZSBMSUJQUk9UT0NfRVhQT1JUICAgX19kZWNsc3BlYyhkbGxleHBvcnQpCisgICNlbHNlCisgICAgI2RlZmluZSBMSUJQUk9UT0NfRVhQT1JUICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisgICNlbmRpZgorI2Vsc2UKKyAgI2RlZmluZSBMSUJQUk9UT0JVRl9FWFBPUlQKKyAgI2RlZmluZSBMSUJQUk9UT0NfRVhQT1JUCisjZW5kaWYKKworI2RlZmluZSBQUk9UT0JVRl9SVU5USU1FX0RFUFJFQ0FURUQobWVzc2FnZSkgUFJPVE9CVUZfREVQUkVDQVRFRF9NU0cobWVzc2FnZSkKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1JVTlRJTUVfREVQUkVDQVRFRChtZXNzYWdlKSBcCisgIFBST1RPQlVGX0RFUFJFQ0FURURfTVNHKG1lc3NhZ2UpCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGZyb20gZ29vZ2xlMy9iYXNlL3BvcnQuaAorCisjaWYgKGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pIHx8IF9fY3BsdXNwbHVzID49IDIwMTEwM0wgfHwgXAorICAgICAoZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTkwMCkpCisvLyBEZWZpbmUgdGhpcyB0byAxIGlmIHRoZSBjb2RlIGlzIGNvbXBpbGVkIGluIEMrKzExIG1vZGU7IGxlYXZlIGl0CisvLyB1bmRlZmluZWQgb3RoZXJ3aXNlLiAgRG8gTk9UIGRlZmluZSBpdCB0byAwIC0tIHRoYXQgY2F1c2VzCisvLyAnI2lmZGVmIExBTkdfQ1hYMTEnIHRvIGJlaGF2ZSBkaWZmZXJlbnRseSBmcm9tICcjaWYgTEFOR19DWFgxMScuCisjZGVmaW5lIExBTkdfQ1hYMTEgMQorI2Vsc2UKKyNlcnJvciAiUHJvdG9idWYgcmVxdWlyZXMgYXQgbGVhc3QgQysrMTEuIgorI2VuZGlmCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKwordXNpbmcgQ29uc3RTdHJpbmdQYXJhbSA9IGNvbnN0IHN0ZDo6c3RyaW5nICY7CisKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7CisKK3R5cGVkZWYgaW50OF90IGludDg7Cit0eXBlZGVmIGludDE2X3QgaW50MTY7Cit0eXBlZGVmIGludDMyX3QgaW50MzI7Cit0eXBlZGVmIGludDY0X3QgaW50NjQ7CisKK3R5cGVkZWYgdWludDhfdCB1aW50ODsKK3R5cGVkZWYgdWludDE2X3QgdWludDE2OwordHlwZWRlZiB1aW50MzJfdCB1aW50MzI7Cit0eXBlZGVmIHVpbnQ2NF90IHVpbnQ2NDsKKworc3RhdGljIGNvbnN0IGludDMyIGtpbnQzMm1heCA9IDB4N0ZGRkZGRkY7CitzdGF0aWMgY29uc3QgaW50MzIga2ludDMybWluID0gLWtpbnQzMm1heCAtIDE7CitzdGF0aWMgY29uc3QgaW50NjQga2ludDY0bWF4ID0gaW50NjRfdHsweDdGRkZGRkZGRkZGRkZGRkZ9Oworc3RhdGljIGNvbnN0IGludDY0IGtpbnQ2NG1pbiA9IC1raW50NjRtYXggLSAxOworc3RhdGljIGNvbnN0IHVpbnQzMiBrdWludDMybWF4ID0gMHhGRkZGRkZGRnU7CitzdGF0aWMgY29uc3QgdWludDY0IGt1aW50NjRtYXggPSB1aW50NjRfdHsweEZGRkZGRkZGRkZGRkZGRkZ1fTsKKworI2lmIGRlZmluZWQoQUREUkVTU19TQU5JVElaRVIpIHx8IGRlZmluZWQoVEhSRUFEX1NBTklUSVpFUikgfHxcCisgICAgZGVmaW5lZChNRU1PUllfU0FOSVRJWkVSKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmICAvLyBfX2NwbHVzcGx1cwordWludDE2X3QgX19zYW5pdGl6ZXJfdW5hbGlnbmVkX2xvYWQxNihjb25zdCB2b2lkICpwKTsKK3VpbnQzMl90IF9fc2FuaXRpemVyX3VuYWxpZ25lZF9sb2FkMzIoY29uc3Qgdm9pZCAqcCk7Cit1aW50NjRfdCBfX3Nhbml0aXplcl91bmFsaWduZWRfbG9hZDY0KGNvbnN0IHZvaWQgKnApOwordm9pZCBfX3Nhbml0aXplcl91bmFsaWduZWRfc3RvcmUxNih2b2lkICpwLCB1aW50MTZfdCB2KTsKK3ZvaWQgX19zYW5pdGl6ZXJfdW5hbGlnbmVkX3N0b3JlMzIodm9pZCAqcCwgdWludDMyX3Qgdik7Cit2b2lkIF9fc2FuaXRpemVyX3VuYWxpZ25lZF9zdG9yZTY0KHZvaWQgKnAsIHVpbnQ2NF90IHYpOworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCisKK2lubGluZSB1aW50MTZfdCBHT09HTEVfVU5BTElHTkVEX0xPQUQxNihjb25zdCB2b2lkICpwKSB7CisgIHJldHVybiBfX3Nhbml0aXplcl91bmFsaWduZWRfbG9hZDE2KHApOworfQorCitpbmxpbmUgdWludDMyX3QgR09PR0xFX1VOQUxJR05FRF9MT0FEMzIoY29uc3Qgdm9pZCAqcCkgeworICByZXR1cm4gX19zYW5pdGl6ZXJfdW5hbGlnbmVkX2xvYWQzMihwKTsKK30KKworaW5saW5lIHVpbnQ2NF90IEdPT0dMRV9VTkFMSUdORURfTE9BRDY0KGNvbnN0IHZvaWQgKnApIHsKKyAgcmV0dXJuIF9fc2FuaXRpemVyX3VuYWxpZ25lZF9sb2FkNjQocCk7Cit9CisKK2lubGluZSB2b2lkIEdPT0dMRV9VTkFMSUdORURfU1RPUkUxNih2b2lkICpwLCB1aW50MTZfdCB2KSB7CisgIF9fc2FuaXRpemVyX3VuYWxpZ25lZF9zdG9yZTE2KHAsIHYpOworfQorCitpbmxpbmUgdm9pZCBHT09HTEVfVU5BTElHTkVEX1NUT1JFMzIodm9pZCAqcCwgdWludDMyX3QgdikgeworICBfX3Nhbml0aXplcl91bmFsaWduZWRfc3RvcmUzMihwLCB2KTsKK30KKworaW5saW5lIHZvaWQgR09PR0xFX1VOQUxJR05FRF9TVE9SRTY0KHZvaWQgKnAsIHVpbnQ2NF90IHYpIHsKKyAgX19zYW5pdGl6ZXJfdW5hbGlnbmVkX3N0b3JlNjQocCwgdik7Cit9CisKKyNlbGlmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX1VTRV9VTkFMSUdORUQpICYmIEdPT0dMRV9QUk9UT0JVRl9VU0VfVU5BTElHTkVECisKKyNkZWZpbmUgR09PR0xFX1VOQUxJR05FRF9MT0FEMTYoX3ApICgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZfdCAqPihfcCkpCisjZGVmaW5lIEdPT0dMRV9VTkFMSUdORURfTE9BRDMyKF9wKSAoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oX3ApKQorI2RlZmluZSBHT09HTEVfVU5BTElHTkVEX0xPQUQ2NChfcCkgKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KF9wKSkKKworI2RlZmluZSBHT09HTEVfVU5BTElHTkVEX1NUT1JFMTYoX3AsIF92YWwpICgqcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCAqPihfcCkgPSAoX3ZhbCkpCisjZGVmaW5lIEdPT0dMRV9VTkFMSUdORURfU1RPUkUzMihfcCwgX3ZhbCkgKCpyZWludGVycHJldF9jYXN0PHVpbnQzMl90ICo+KF9wKSA9IChfdmFsKSkKKyNkZWZpbmUgR09PR0xFX1VOQUxJR05FRF9TVE9SRTY0KF9wLCBfdmFsKSAoKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgKj4oX3ApID0gKF92YWwpKQorCisjZWxzZQoraW5saW5lIHVpbnQxNl90IEdPT0dMRV9VTkFMSUdORURfTE9BRDE2KGNvbnN0IHZvaWQgKnApIHsKKyAgdWludDE2X3QgdDsKKyAgbWVtY3B5KCZ0LCBwLCBzaXplb2YgdCk7CisgIHJldHVybiB0OworfQorCitpbmxpbmUgdWludDMyX3QgR09PR0xFX1VOQUxJR05FRF9MT0FEMzIoY29uc3Qgdm9pZCAqcCkgeworICB1aW50MzJfdCB0OworICBtZW1jcHkoJnQsIHAsIHNpemVvZiB0KTsKKyAgcmV0dXJuIHQ7Cit9CisKK2lubGluZSB1aW50NjRfdCBHT09HTEVfVU5BTElHTkVEX0xPQUQ2NChjb25zdCB2b2lkICpwKSB7CisgIHVpbnQ2NF90IHQ7CisgIG1lbWNweSgmdCwgcCwgc2l6ZW9mIHQpOworICByZXR1cm4gdDsKK30KKworaW5saW5lIHZvaWQgR09PR0xFX1VOQUxJR05FRF9TVE9SRTE2KHZvaWQgKnAsIHVpbnQxNl90IHYpIHsKKyAgbWVtY3B5KHAsICZ2LCBzaXplb2Ygdik7Cit9CisKK2lubGluZSB2b2lkIEdPT0dMRV9VTkFMSUdORURfU1RPUkUzMih2b2lkICpwLCB1aW50MzJfdCB2KSB7CisgIG1lbWNweShwLCAmdiwgc2l6ZW9mIHYpOworfQorCitpbmxpbmUgdm9pZCBHT09HTEVfVU5BTElHTkVEX1NUT1JFNjQodm9pZCAqcCwgdWludDY0X3QgdikgeworICBtZW1jcHkocCwgJnYsIHNpemVvZiB2KTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfT1NfTkFDTCkgXAorICAgIHx8IChkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiBkZWZpbmVkKF9fY2xhbmdfXykgXAorICAgICAgICAmJiAoX19jbGFuZ19tYWpvcl9fID09IDMgJiYgX19jbGFuZ19taW5vcl9fID09IDgpIFwKKyAgICAgICAgJiYgKF9fY2xhbmdfcGF0Y2hsZXZlbF9fIDwgMjc1NDgwKSkKKyMgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VU0VfUE9SVEFCTEVfTE9HMgorI2VuZGlmCisKKy8vIFRoZSBmb2xsb3dpbmcgZ3VhcmFudGVlcyBkZWNsYXJhdGlvbiBvZiB0aGUgYnl0ZSBzd2FwIGZ1bmN0aW9ucy4KKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBic3dhcF8xNih4KSBfYnl0ZXN3YXBfdXNob3J0KHgpCisjZGVmaW5lIGJzd2FwXzMyKHgpIF9ieXRlc3dhcF91bG9uZyh4KQorI2RlZmluZSBic3dhcF82NCh4KSBfYnl0ZXN3YXBfdWludDY0KHgpCisKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorLy8gTWFjIE9TIFggLyBEYXJ3aW4gZmVhdHVyZXMKKyNkZWZpbmUgYnN3YXBfMTYoeCkgT1NTd2FwSW50MTYoeCkKKyNkZWZpbmUgYnN3YXBfMzIoeCkgT1NTd2FwSW50MzIoeCkKKyNkZWZpbmUgYnN3YXBfNjQoeCkgT1NTd2FwSW50NjQoeCkKKworI2VsaWYgIWRlZmluZWQoX19saW51eF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKworI2lmbmRlZiBic3dhcF8xNgorc3RhdGljIGlubGluZSB1aW50MTZfdCBic3dhcF8xNih1aW50MTZfdCB4KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oKCh4ICYgMHhGRikgPDwgOCkgfCAoKHggJiAweEZGMDApID4+IDgpKTsKK30KKyNkZWZpbmUgYnN3YXBfMTYoeCkgYnN3YXBfMTYoeCkKKyNlbmRpZgorCisjaWZuZGVmIGJzd2FwXzMyCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJzd2FwXzMyKHVpbnQzMl90IHgpIHsKKyAgcmV0dXJuICgoKHggJiAweEZGKSA8PCAyNCkgfAorICAgICAgICAgICgoeCAmIDB4RkYwMCkgPDwgOCkgfAorICAgICAgICAgICgoeCAmIDB4RkYwMDAwKSA+PiA4KSB8CisgICAgICAgICAgKCh4ICYgMHhGRjAwMDAwMCkgPj4gMjQpKTsKK30KKyNkZWZpbmUgYnN3YXBfMzIoeCkgYnN3YXBfMzIoeCkKKyNlbmRpZgorCisjaWZuZGVmIGJzd2FwXzY0CitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGJzd2FwXzY0KHVpbnQ2NF90IHgpIHsKKyAgcmV0dXJuICgoKHggJiB1aW50NjRfdHsweEZGdX0pIDw8IDU2KSB8ICgoeCAmIHVpbnQ2NF90ezB4RkYwMHV9KSA8PCA0MCkgfAorICAgICAgICAgICgoeCAmIHVpbnQ2NF90ezB4RkYwMDAwdX0pIDw8IDI0KSB8CisgICAgICAgICAgKCh4ICYgdWludDY0X3R7MHhGRjAwMDAwMHV9KSA8PCA4KSB8CisgICAgICAgICAgKCh4ICYgdWludDY0X3R7MHhGRjAwMDAwMDAwdX0pID4+IDgpIHwKKyAgICAgICAgICAoKHggJiB1aW50NjRfdHsweEZGMDAwMDAwMDAwMHV9KSA+PiAyNCkgfAorICAgICAgICAgICgoeCAmIHVpbnQ2NF90ezB4RkYwMDAwMDAwMDAwMDB1fSkgPj4gNDApIHwKKyAgICAgICAgICAoKHggJiB1aW50NjRfdHsweEZGMDAwMDAwMDAwMDAwMDB1fSkgPj4gNTYpKTsKK30KKyNkZWZpbmUgYnN3YXBfNjQoeCkgYnN3YXBfNjQoeCkKKyNlbmRpZgorCisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZnJvbSBnb29nbGUzL3V0aWwvYml0cy9iaXRzLmgKKworY2xhc3MgQml0cyB7CisgcHVibGljOgorICBzdGF0aWMgdWludDMyX3QgTG9nMkZsb29yTm9uWmVybyh1aW50MzJfdCBuKSB7CisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyAgcmV0dXJuIDMxIF4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9fYnVpbHRpbl9jbHoobikpOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgdW5zaWduZWQgbG9uZyB3aGVyZTsKKyAgX0JpdFNjYW5SZXZlcnNlKCZ3aGVyZSwgbik7CisgIHJldHVybiB3aGVyZTsKKyNlbHNlCisgIHJldHVybiBMb2cyRmxvb3JOb25aZXJvX1BvcnRhYmxlKG4pOworI2VuZGlmCisgIH0KKworICBzdGF0aWMgdWludDMyX3QgTG9nMkZsb29yTm9uWmVybzY0KHVpbnQ2NF90IG4pIHsKKyAgICAvLyBPbGRlciB2ZXJzaW9ucyBvZiBjbGFuZyBydW4gaW50byBhbiBpbnN0cnVjdGlvbi1zZWxlY3Rpb24gZmFpbHVyZSB3aGVuCisgICAgLy8gaXQgZW5jb3VudGVycyBfX2J1aWx0aW5fY2x6bGw6CisgICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL25hdGl2ZWNsaWVudC9pc3N1ZXMvZGV0YWlsP2lkPTQzOTUKKyAgICAvLyBUaGlzIGluY2x1ZGVzIGFybS1uYWNsLWNsYW5nIGFuZCBjbGFuZyBpbiBvbGRlciBBbmRyb2lkIE5ESyB2ZXJzaW9ucy4KKyAgICAvLyBUbyB3b3JrIGFyb3VuZCB0aGlzLCB3aGVuIHdlIGJ1aWxkIHdpdGggdGhvc2Ugd2UgdXNlIHRoZSBwb3J0YWJsZQorICAgIC8vIGltcGxlbWVudGF0aW9uIGluc3RlYWQuCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoR09PR0xFX1BST1RPQlVGX1VTRV9QT1JUQUJMRV9MT0cyKQorICByZXR1cm4gNjMgXiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oX19idWlsdGluX2NsemxsKG4pKTsKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fWDY0KQorICB1bnNpZ25lZCBsb25nIHdoZXJlOworICBfQml0U2NhblJldmVyc2U2NCgmd2hlcmUsIG4pOworICByZXR1cm4gd2hlcmU7CisjZWxzZQorICByZXR1cm4gTG9nMkZsb29yTm9uWmVybzY0X1BvcnRhYmxlKG4pOworI2VuZGlmCisgIH0KKyBwcml2YXRlOgorICBzdGF0aWMgaW50IExvZzJGbG9vck5vblplcm9fUG9ydGFibGUodWludDMyX3QgbikgeworICAgIGlmIChuID09IDApCisgICAgICByZXR1cm4gLTE7CisgICAgaW50IGxvZyA9IDA7CisgICAgdWludDMyX3QgdmFsdWUgPSBuOworICAgIGZvciAoaW50IGkgPSA0OyBpID49IDA7IC0taSkgeworICAgICAgaW50IHNoaWZ0ID0gKDEgPDwgaSk7CisgICAgICB1aW50MzJfdCB4ID0gdmFsdWUgPj4gc2hpZnQ7CisgICAgICBpZiAoeCAhPSAwKSB7CisgICAgICAgIHZhbHVlID0geDsKKyAgICAgICAgbG9nICs9IHNoaWZ0OworICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQodmFsdWUgPT0gMSk7CisgICAgcmV0dXJuIGxvZzsKKyAgfQorCisgIHN0YXRpYyBpbnQgTG9nMkZsb29yTm9uWmVybzY0X1BvcnRhYmxlKHVpbnQ2NF90IG4pIHsKKyAgICBjb25zdCB1aW50MzJfdCB0b3BiaXRzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG4gPj4gMzIpOworICAgIGlmICh0b3BiaXRzID09IDApIHsKKyAgICAgIC8vIFRvcCBiaXRzIGFyZSB6ZXJvLCBzbyBzY2FuIGluIGJvdHRvbSBiaXRzCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihMb2cyRmxvb3JOb25aZXJvKHN0YXRpY19jYXN0PHVpbnQzMl90PihuKSkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gMzIgKyBzdGF0aWNfY2FzdDxpbnQ+KExvZzJGbG9vck5vblplcm8odG9wYml0cykpOworICAgIH0KKyAgfQorfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZnJvbSBnb29nbGUzL3V0aWwvZW5kaWFuL2VuZGlhbi5oCitQUk9UT0JVRl9FWFBPUlQgdWludDMyX3QgZ2h0b25sKHVpbnQzMl90IHgpOworCitjbGFzcyBCaWdFbmRpYW4geworIHB1YmxpYzoKKyNpZmRlZiBQUk9UT0JVRl9MSVRUTEVfRU5ESUFOCisKKyAgc3RhdGljIHVpbnQxNl90IEZyb21Ib3N0MTYodWludDE2X3QgeCkgeyByZXR1cm4gYnN3YXBfMTYoeCk7IH0KKyAgc3RhdGljIHVpbnQxNl90IFRvSG9zdDE2KHVpbnQxNl90IHgpIHsgcmV0dXJuIGJzd2FwXzE2KHgpOyB9CisKKyAgc3RhdGljIHVpbnQzMl90IEZyb21Ib3N0MzIodWludDMyX3QgeCkgeyByZXR1cm4gYnN3YXBfMzIoeCk7IH0KKyAgc3RhdGljIHVpbnQzMl90IFRvSG9zdDMyKHVpbnQzMl90IHgpIHsgcmV0dXJuIGJzd2FwXzMyKHgpOyB9CisKKyAgc3RhdGljIHVpbnQ2NF90IEZyb21Ib3N0NjQodWludDY0X3QgeCkgeyByZXR1cm4gYnN3YXBfNjQoeCk7IH0KKyAgc3RhdGljIHVpbnQ2NF90IFRvSG9zdDY0KHVpbnQ2NF90IHgpIHsgcmV0dXJuIGJzd2FwXzY0KHgpOyB9CisKKyAgc3RhdGljIGJvb2wgSXNMaXR0bGVFbmRpYW4oKSB7IHJldHVybiB0cnVlOyB9CisKKyNlbHNlCisKKyAgc3RhdGljIHVpbnQxNl90IEZyb21Ib3N0MTYodWludDE2X3QgeCkgeyByZXR1cm4geDsgfQorICBzdGF0aWMgdWludDE2X3QgVG9Ib3N0MTYodWludDE2X3QgeCkgeyByZXR1cm4geDsgfQorCisgIHN0YXRpYyB1aW50MzJfdCBGcm9tSG9zdDMyKHVpbnQzMl90IHgpIHsgcmV0dXJuIHg7IH0KKyAgc3RhdGljIHVpbnQzMl90IFRvSG9zdDMyKHVpbnQzMl90IHgpIHsgcmV0dXJuIHg7IH0KKworICBzdGF0aWMgdWludDY0X3QgRnJvbUhvc3Q2NCh1aW50NjRfdCB4KSB7IHJldHVybiB4OyB9CisgIHN0YXRpYyB1aW50NjRfdCBUb0hvc3Q2NCh1aW50NjRfdCB4KSB7IHJldHVybiB4OyB9CisKKyAgc3RhdGljIGJvb2wgSXNMaXR0bGVFbmRpYW4oKSB7IHJldHVybiBmYWxzZTsgfQorCisjZW5kaWYgLyogRU5ESUFOICovCisKKyAgLy8gRnVuY3Rpb25zIHRvIGRvIHVuYWxpZ25lZCBsb2FkcyBhbmQgc3RvcmVzIGluIGJpZy1lbmRpYW4gb3JkZXIuCisgIHN0YXRpYyB1aW50MTZfdCBMb2FkMTYoY29uc3Qgdm9pZCAqcCkgeworICAgIHJldHVybiBUb0hvc3QxNihHT09HTEVfVU5BTElHTkVEX0xPQUQxNihwKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBTdG9yZTE2KHZvaWQgKnAsIHVpbnQxNl90IHYpIHsKKyAgICBHT09HTEVfVU5BTElHTkVEX1NUT1JFMTYocCwgRnJvbUhvc3QxNih2KSk7CisgIH0KKworICBzdGF0aWMgdWludDMyX3QgTG9hZDMyKGNvbnN0IHZvaWQgKnApIHsKKyAgICByZXR1cm4gVG9Ib3N0MzIoR09PR0xFX1VOQUxJR05FRF9MT0FEMzIocCkpOworICB9CisKKyAgc3RhdGljIHZvaWQgU3RvcmUzMih2b2lkICpwLCB1aW50MzJfdCB2KSB7CisgICAgR09PR0xFX1VOQUxJR05FRF9TVE9SRTMyKHAsIEZyb21Ib3N0MzIodikpOworICB9CisKKyAgc3RhdGljIHVpbnQ2NF90IExvYWQ2NChjb25zdCB2b2lkICpwKSB7CisgICAgcmV0dXJuIFRvSG9zdDY0KEdPT0dMRV9VTkFMSUdORURfTE9BRDY0KHApKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFN0b3JlNjQodm9pZCAqcCwgdWludDY0X3QgdikgeworICAgIEdPT0dMRV9VTkFMSUdORURfU1RPUkU2NChwLCBGcm9tSG9zdDY0KHYpKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX1BPUlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjMGZhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzLmNjCkBAIC0wLDAgKzEsMjYyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzLmg+CisKKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBzdGF0dXNfaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKworaW5saW5lIHN0ZDo6c3RyaW5nIFN0YXR1c0NvZGVUb1N0cmluZyhTdGF0dXNDb2RlIGNvZGUpIHsKKyAgc3dpdGNoIChjb2RlKSB7CisgICAgY2FzZSBTdGF0dXNDb2RlOjprT2s6CisgICAgICByZXR1cm4gIk9LIjsKKyAgICBjYXNlIFN0YXR1c0NvZGU6OmtDYW5jZWxsZWQ6CisgICAgICByZXR1cm4gIkNBTkNFTExFRCI7CisgICAgY2FzZSBTdGF0dXNDb2RlOjprVW5rbm93bjoKKyAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgICAgY2FzZSBTdGF0dXNDb2RlOjprSW52YWxpZEFyZ3VtZW50OgorICAgICAgcmV0dXJuICJJTlZBTElEX0FSR1VNRU5UIjsKKyAgICBjYXNlIFN0YXR1c0NvZGU6OmtEZWFkbGluZUV4Y2VlZGVkOgorICAgICAgcmV0dXJuICJERUFETElORV9FWENFRURFRCI7CisgICAgY2FzZSBTdGF0dXNDb2RlOjprTm90Rm91bmQ6CisgICAgICByZXR1cm4gIk5PVF9GT1VORCI7CisgICAgY2FzZSBTdGF0dXNDb2RlOjprQWxyZWFkeUV4aXN0czoKKyAgICAgIHJldHVybiAiQUxSRUFEWV9FWElTVFMiOworICAgIGNhc2UgU3RhdHVzQ29kZTo6a1Blcm1pc3Npb25EZW5pZWQ6CisgICAgICByZXR1cm4gIlBFUk1JU1NJT05fREVOSUVEIjsKKyAgICBjYXNlIFN0YXR1c0NvZGU6OmtVbmF1dGhlbnRpY2F0ZWQ6CisgICAgICByZXR1cm4gIlVOQVVUSEVOVElDQVRFRCI7CisgICAgY2FzZSBTdGF0dXNDb2RlOjprUmVzb3VyY2VFeGhhdXN0ZWQ6CisgICAgICByZXR1cm4gIlJFU09VUkNFX0VYSEFVU1RFRCI7CisgICAgY2FzZSBTdGF0dXNDb2RlOjprRmFpbGVkUHJlY29uZGl0aW9uOgorICAgICAgcmV0dXJuICJGQUlMRURfUFJFQ09ORElUSU9OIjsKKyAgICBjYXNlIFN0YXR1c0NvZGU6OmtBYm9ydGVkOgorICAgICAgcmV0dXJuICJBQk9SVEVEIjsKKyAgICBjYXNlIFN0YXR1c0NvZGU6OmtPdXRPZlJhbmdlOgorICAgICAgcmV0dXJuICJPVVRfT0ZfUkFOR0UiOworICAgIGNhc2UgU3RhdHVzQ29kZTo6a1VuaW1wbGVtZW50ZWQ6CisgICAgICByZXR1cm4gIlVOSU1QTEVNRU5URUQiOworICAgIGNhc2UgU3RhdHVzQ29kZTo6a0ludGVybmFsOgorICAgICAgcmV0dXJuICJJTlRFUk5BTCI7CisgICAgY2FzZSBTdGF0dXNDb2RlOjprVW5hdmFpbGFibGU6CisgICAgICByZXR1cm4gIlVOQVZBSUxBQkxFIjsKKyAgICBjYXNlIFN0YXR1c0NvZGU6OmtEYXRhTG9zczoKKyAgICAgIHJldHVybiAiREFUQV9MT1NTIjsKKyAgfQorCisgIC8vIE5vIGRlZmF1bHQgY2xhdXNlLCBjbGFuZyB3aWxsIGFib3J0IGlmIGEgY29kZSBpcyBtaXNzaW5nIGZyb20KKyAgLy8gYWJvdmUgc3dpdGNoLgorICByZXR1cm4gIlVOS05PV04iOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworU3RhdHVzOjpTdGF0dXMoKSA6IGVycm9yX2NvZGVfKFN0YXR1c0NvZGU6OmtPaykge30KKworU3RhdHVzOjpTdGF0dXMoU3RhdHVzQ29kZSBlcnJvcl9jb2RlLCBTdHJpbmdQaWVjZSBlcnJvcl9tZXNzYWdlKQorICAgIDogZXJyb3JfY29kZV8oZXJyb3JfY29kZSkgeworICBpZiAoZXJyb3JfY29kZSAhPSBTdGF0dXNDb2RlOjprT2spIHsKKyAgICBlcnJvcl9tZXNzYWdlXyA9IGVycm9yX21lc3NhZ2UuVG9TdHJpbmcoKTsKKyAgfQorfQorCitTdGF0dXM6OlN0YXR1cyhjb25zdCBTdGF0dXMmIG90aGVyKQorICAgIDogZXJyb3JfY29kZV8ob3RoZXIuZXJyb3JfY29kZV8pLCBlcnJvcl9tZXNzYWdlXyhvdGhlci5lcnJvcl9tZXNzYWdlXykgeworfQorCitTdGF0dXMmIFN0YXR1czo6b3BlcmF0b3I9KGNvbnN0IFN0YXR1cyYgb3RoZXIpIHsKKyAgZXJyb3JfY29kZV8gPSBvdGhlci5lcnJvcl9jb2RlXzsKKyAgZXJyb3JfbWVzc2FnZV8gPSBvdGhlci5lcnJvcl9tZXNzYWdlXzsKKyAgcmV0dXJuICp0aGlzOworfQorCitib29sIFN0YXR1czo6b3BlcmF0b3I9PShjb25zdCBTdGF0dXMmIHgpIGNvbnN0IHsKKyAgcmV0dXJuIGVycm9yX2NvZGVfID09IHguZXJyb3JfY29kZV8gJiYKKyAgICAgIGVycm9yX21lc3NhZ2VfID09IHguZXJyb3JfbWVzc2FnZV87Cit9CisKK3N0ZDo6c3RyaW5nIFN0YXR1czo6VG9TdHJpbmcoKSBjb25zdCB7CisgIGlmIChlcnJvcl9jb2RlXyA9PSBTdGF0dXNDb2RlOjprT2spIHsKKyAgICByZXR1cm4gIk9LIjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZXJyb3JfbWVzc2FnZV8uZW1wdHkoKSkgeworICAgICAgcmV0dXJuIFN0YXR1c0NvZGVUb1N0cmluZyhlcnJvcl9jb2RlXyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBTdGF0dXNDb2RlVG9TdHJpbmcoZXJyb3JfY29kZV8pICsgIjoiICsgZXJyb3JfbWVzc2FnZV87CisgICAgfQorICB9Cit9CisKK1N0YXR1cyBPa1N0YXR1cygpIHsgcmV0dXJuIFN0YXR1cygpOyB9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBTdGF0dXMmIHgpIHsKKyAgb3MgPDwgeC5Ub1N0cmluZygpOworICByZXR1cm4gb3M7Cit9CisKK2Jvb2wgSXNBYm9ydGVkKGNvbnN0IFN0YXR1cyYgc3RhdHVzKSB7CisgIHJldHVybiBzdGF0dXMuY29kZSgpID09IFN0YXR1c0NvZGU6OmtBYm9ydGVkOworfQorCitib29sIElzQWxyZWFkeUV4aXN0cyhjb25zdCBTdGF0dXMmIHN0YXR1cykgeworICByZXR1cm4gc3RhdHVzLmNvZGUoKSA9PSBTdGF0dXNDb2RlOjprQWxyZWFkeUV4aXN0czsKK30KKworYm9vbCBJc0NhbmNlbGxlZChjb25zdCBTdGF0dXMmIHN0YXR1cykgeworICByZXR1cm4gc3RhdHVzLmNvZGUoKSA9PSBTdGF0dXNDb2RlOjprQ2FuY2VsbGVkOworfQorCitib29sIElzRGF0YUxvc3MoY29uc3QgU3RhdHVzJiBzdGF0dXMpIHsKKyAgcmV0dXJuIHN0YXR1cy5jb2RlKCkgPT0gU3RhdHVzQ29kZTo6a0RhdGFMb3NzOworfQorCitib29sIElzRGVhZGxpbmVFeGNlZWRlZChjb25zdCBTdGF0dXMmIHN0YXR1cykgeworICByZXR1cm4gc3RhdHVzLmNvZGUoKSA9PSBTdGF0dXNDb2RlOjprRGVhZGxpbmVFeGNlZWRlZDsKK30KKworYm9vbCBJc0ZhaWxlZFByZWNvbmRpdGlvbihjb25zdCBTdGF0dXMmIHN0YXR1cykgeworICByZXR1cm4gc3RhdHVzLmNvZGUoKSA9PSBTdGF0dXNDb2RlOjprRmFpbGVkUHJlY29uZGl0aW9uOworfQorCitib29sIElzSW50ZXJuYWwoY29uc3QgU3RhdHVzJiBzdGF0dXMpIHsKKyAgcmV0dXJuIHN0YXR1cy5jb2RlKCkgPT0gU3RhdHVzQ29kZTo6a0ludGVybmFsOworfQorCitib29sIElzSW52YWxpZEFyZ3VtZW50KGNvbnN0IFN0YXR1cyYgc3RhdHVzKSB7CisgIHJldHVybiBzdGF0dXMuY29kZSgpID09IFN0YXR1c0NvZGU6OmtJbnZhbGlkQXJndW1lbnQ7Cit9CisKK2Jvb2wgSXNOb3RGb3VuZChjb25zdCBTdGF0dXMmIHN0YXR1cykgeworICByZXR1cm4gc3RhdHVzLmNvZGUoKSA9PSBTdGF0dXNDb2RlOjprTm90Rm91bmQ7Cit9CisKK2Jvb2wgSXNPdXRPZlJhbmdlKGNvbnN0IFN0YXR1cyYgc3RhdHVzKSB7CisgIHJldHVybiBzdGF0dXMuY29kZSgpID09IFN0YXR1c0NvZGU6OmtPdXRPZlJhbmdlOworfQorCitib29sIElzUGVybWlzc2lvbkRlbmllZChjb25zdCBTdGF0dXMmIHN0YXR1cykgeworICByZXR1cm4gc3RhdHVzLmNvZGUoKSA9PSBTdGF0dXNDb2RlOjprUGVybWlzc2lvbkRlbmllZDsKK30KKworYm9vbCBJc1Jlc291cmNlRXhoYXVzdGVkKGNvbnN0IFN0YXR1cyYgc3RhdHVzKSB7CisgIHJldHVybiBzdGF0dXMuY29kZSgpID09IFN0YXR1c0NvZGU6OmtSZXNvdXJjZUV4aGF1c3RlZDsKK30KKworYm9vbCBJc1VuYXV0aGVudGljYXRlZChjb25zdCBTdGF0dXMmIHN0YXR1cykgeworICByZXR1cm4gc3RhdHVzLmNvZGUoKSA9PSBTdGF0dXNDb2RlOjprVW5hdXRoZW50aWNhdGVkOworfQorCitib29sIElzVW5hdmFpbGFibGUoY29uc3QgU3RhdHVzJiBzdGF0dXMpIHsKKyAgcmV0dXJuIHN0YXR1cy5jb2RlKCkgPT0gU3RhdHVzQ29kZTo6a1VuYXZhaWxhYmxlOworfQorCitib29sIElzVW5pbXBsZW1lbnRlZChjb25zdCBTdGF0dXMmIHN0YXR1cykgeworICByZXR1cm4gc3RhdHVzLmNvZGUoKSA9PSBTdGF0dXNDb2RlOjprVW5pbXBsZW1lbnRlZDsKK30KKworYm9vbCBJc1Vua25vd24oY29uc3QgU3RhdHVzJiBzdGF0dXMpIHsKKyAgcmV0dXJuIHN0YXR1cy5jb2RlKCkgPT0gU3RhdHVzQ29kZTo6a1Vua25vd247Cit9CisKK1N0YXR1cyBBYm9ydGVkRXJyb3IoU3RyaW5nUGllY2UgbWVzc2FnZSkgeworICByZXR1cm4gU3RhdHVzKFN0YXR1c0NvZGU6OmtBYm9ydGVkLCBtZXNzYWdlKTsKK30KKworU3RhdHVzIEFscmVhZHlFeGlzdHNFcnJvcihTdHJpbmdQaWVjZSBtZXNzYWdlKSB7CisgIHJldHVybiBTdGF0dXMoU3RhdHVzQ29kZTo6a0FscmVhZHlFeGlzdHMsIG1lc3NhZ2UpOworfQorCitTdGF0dXMgQ2FuY2VsbGVkRXJyb3IoU3RyaW5nUGllY2UgbWVzc2FnZSkgeworICByZXR1cm4gU3RhdHVzKFN0YXR1c0NvZGU6OmtDYW5jZWxsZWQsIG1lc3NhZ2UpOworfQorCitTdGF0dXMgRGF0YUxvc3NFcnJvcihTdHJpbmdQaWVjZSBtZXNzYWdlKSB7CisgIHJldHVybiBTdGF0dXMoU3RhdHVzQ29kZTo6a0RhdGFMb3NzLCBtZXNzYWdlKTsKK30KKworU3RhdHVzIERlYWRsaW5lRXhjZWVkZWRFcnJvcihTdHJpbmdQaWVjZSBtZXNzYWdlKSB7CisgIHJldHVybiBTdGF0dXMoU3RhdHVzQ29kZTo6a0RlYWRsaW5lRXhjZWVkZWQsIG1lc3NhZ2UpOworfQorCitTdGF0dXMgRmFpbGVkUHJlY29uZGl0aW9uRXJyb3IoU3RyaW5nUGllY2UgbWVzc2FnZSkgeworICByZXR1cm4gU3RhdHVzKFN0YXR1c0NvZGU6OmtGYWlsZWRQcmVjb25kaXRpb24sIG1lc3NhZ2UpOworfQorCitTdGF0dXMgSW50ZXJuYWxFcnJvcihTdHJpbmdQaWVjZSBtZXNzYWdlKSB7CisgIHJldHVybiBTdGF0dXMoU3RhdHVzQ29kZTo6a0ludGVybmFsLCBtZXNzYWdlKTsKK30KKworU3RhdHVzIEludmFsaWRBcmd1bWVudEVycm9yKFN0cmluZ1BpZWNlIG1lc3NhZ2UpIHsKKyAgcmV0dXJuIFN0YXR1cyhTdGF0dXNDb2RlOjprSW52YWxpZEFyZ3VtZW50LCBtZXNzYWdlKTsKK30KKworU3RhdHVzIE5vdEZvdW5kRXJyb3IoU3RyaW5nUGllY2UgbWVzc2FnZSkgeworICByZXR1cm4gU3RhdHVzKFN0YXR1c0NvZGU6OmtOb3RGb3VuZCwgbWVzc2FnZSk7Cit9CisKK1N0YXR1cyBPdXRPZlJhbmdlRXJyb3IoU3RyaW5nUGllY2UgbWVzc2FnZSkgeworICByZXR1cm4gU3RhdHVzKFN0YXR1c0NvZGU6OmtPdXRPZlJhbmdlLCBtZXNzYWdlKTsKK30KKworU3RhdHVzIFBlcm1pc3Npb25EZW5pZWRFcnJvcihTdHJpbmdQaWVjZSBtZXNzYWdlKSB7CisgIHJldHVybiBTdGF0dXMoU3RhdHVzQ29kZTo6a1Blcm1pc3Npb25EZW5pZWQsIG1lc3NhZ2UpOworfQorCitTdGF0dXMgUmVzb3VyY2VFeGhhdXN0ZWRFcnJvcihTdHJpbmdQaWVjZSBtZXNzYWdlKSB7CisgIHJldHVybiBTdGF0dXMoU3RhdHVzQ29kZTo6a1Jlc291cmNlRXhoYXVzdGVkLCBtZXNzYWdlKTsKK30KKworU3RhdHVzIFVuYXV0aGVudGljYXRlZEVycm9yKFN0cmluZ1BpZWNlIG1lc3NhZ2UpIHsKKyAgcmV0dXJuIFN0YXR1cyhTdGF0dXNDb2RlOjprVW5hdXRoZW50aWNhdGVkLCBtZXNzYWdlKTsKK30KKworU3RhdHVzIFVuYXZhaWxhYmxlRXJyb3IoU3RyaW5nUGllY2UgbWVzc2FnZSkgeworICByZXR1cm4gU3RhdHVzKFN0YXR1c0NvZGU6OmtVbmF2YWlsYWJsZSwgbWVzc2FnZSk7Cit9CisKK1N0YXR1cyBVbmltcGxlbWVudGVkRXJyb3IoU3RyaW5nUGllY2UgbWVzc2FnZSkgeworICByZXR1cm4gU3RhdHVzKFN0YXR1c0NvZGU6OmtVbmltcGxlbWVudGVkLCBtZXNzYWdlKTsKK30KKworU3RhdHVzIFVua25vd25FcnJvcihTdHJpbmdQaWVjZSBtZXNzYWdlKSB7CisgIHJldHVybiBTdGF0dXMoU3RhdHVzQ29kZTo6a1Vua25vd24sIG1lc3NhZ2UpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc3RhdHVzX2ludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODU4Y2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaApAQCAtMCwwICsxLDE5NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUQVRVU19IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RBVFVTX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2UuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBzdGF0dXNfaW50ZXJuYWwgeworCisvLyBUaGVzZSB2YWx1ZXMgbXVzdCBtYXRjaCBlcnJvciBjb2RlcyBkZWZpbmVkIGluIGdvb2dsZS9ycGMvY29kZS5wcm90by4KK2VudW0gY2xhc3MgU3RhdHVzQ29kZSA6IGludCB7CisgIGtPayA9IDAsCisgIGtDYW5jZWxsZWQgPSAxLAorICBrVW5rbm93biA9IDIsCisgIGtJbnZhbGlkQXJndW1lbnQgPSAzLAorICBrRGVhZGxpbmVFeGNlZWRlZCA9IDQsCisgIGtOb3RGb3VuZCA9IDUsCisgIGtBbHJlYWR5RXhpc3RzID0gNiwKKyAga1Blcm1pc3Npb25EZW5pZWQgPSA3LAorICBrVW5hdXRoZW50aWNhdGVkID0gMTYsCisgIGtSZXNvdXJjZUV4aGF1c3RlZCA9IDgsCisgIGtGYWlsZWRQcmVjb25kaXRpb24gPSA5LAorICBrQWJvcnRlZCA9IDEwLAorICBrT3V0T2ZSYW5nZSA9IDExLAorICBrVW5pbXBsZW1lbnRlZCA9IDEyLAorICBrSW50ZXJuYWwgPSAxMywKKyAga1VuYXZhaWxhYmxlID0gMTQsCisgIGtEYXRhTG9zcyA9IDE1LAorfTsKKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFN0YXR1cyB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGEgInN1Y2Nlc3NmdWwiIHN0YXR1cy4KKyAgU3RhdHVzKCk7CisKKyAgLy8gQ3JlYXRlIGEgc3RhdHVzIGluIHRoZSBjYW5vbmljYWwgZXJyb3Igc3BhY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgIC8vIGNvZGUsIGFuZCBlcnJvciBtZXNzYWdlLiAgSWYgImNvZGUgPT0gMCIsIGVycm9yX21lc3NhZ2UgaXMKKyAgLy8gaWdub3JlZCBhbmQgYSBTdGF0dXMgb2JqZWN0IGlkZW50aWNhbCB0byBTdGF0dXM6OmtPayBpcworICAvLyBjb25zdHJ1Y3RlZC4KKyAgU3RhdHVzKFN0YXR1c0NvZGUgZXJyb3JfY29kZSwgU3RyaW5nUGllY2UgZXJyb3JfbWVzc2FnZSk7CisgIFN0YXR1cyhjb25zdCBTdGF0dXMmKTsKKyAgU3RhdHVzJiBvcGVyYXRvcj0oY29uc3QgU3RhdHVzJiB4KTsKKyAgflN0YXR1cygpIHt9CisKKyAgLy8gQWNjZXNzb3IKKyAgYm9vbCBvaygpIGNvbnN0IHsgcmV0dXJuIGVycm9yX2NvZGVfID09IFN0YXR1c0NvZGU6OmtPazsgfQorICBTdGF0dXNDb2RlIGNvZGUoKSBjb25zdCB7IHJldHVybiBlcnJvcl9jb2RlXzsgfQorICBTdHJpbmdQaWVjZSBtZXNzYWdlKCkgY29uc3QgeworICAgIHJldHVybiBlcnJvcl9tZXNzYWdlXzsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdGF0dXMmIHgpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgU3RhdHVzJiB4KSBjb25zdCB7CisgICAgcmV0dXJuICFvcGVyYXRvcj09KHgpOworICB9CisKKyAgLy8gUmV0dXJuIGEgY29tYmluYXRpb24gb2YgdGhlIGVycm9yIGNvZGUgbmFtZSBhbmQgbWVzc2FnZS4KKyAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdDsKKworIHByaXZhdGU6CisgIFN0YXR1c0NvZGUgZXJyb3JfY29kZV87CisgIHN0ZDo6c3RyaW5nIGVycm9yX21lc3NhZ2VfOworfTsKKworLy8gUmV0dXJucyBhbiBPSyBzdGF0dXMsIGVxdWl2YWxlbnQgdG8gYSBkZWZhdWx0IGNvbnN0cnVjdGVkIGluc3RhbmNlLiBQcmVmZXIKKy8vIHVzYWdlIG9mIGBPa1N0YXR1cygpYCB3aGVuIGNvbnN0cnVjdGluZyBzdWNoIGFuIE9LIHN0YXR1cy4KK1BST1RPQlVGX0VYUE9SVCBTdGF0dXMgT2tTdGF0dXMoKTsKKworLy8gUHJpbnRzIGEgaHVtYW4tcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgJ3gnIHRvICdvcycuCitQUk9UT0JVRl9FWFBPUlQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFN0YXR1cyYgeCk7CisKKy8vIFRoZXNlIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyByZXR1cm4gYHRydWVgIGlmIGEgZ2l2ZW4gc3RhdHVzIG1hdGNoZXMgdGhlCisvLyBgU3RhdHVzQ29kZWAgZXJyb3IgY29kZSBvZiBpdHMgYXNzb2NpYXRlZCBmdW5jdGlvbi4KK1BST1RPQlVGX0VYUE9SVCBib29sIElzQWJvcnRlZChjb25zdCBTdGF0dXMmIHN0YXR1cyk7CitQUk9UT0JVRl9FWFBPUlQgYm9vbCBJc0FscmVhZHlFeGlzdHMoY29uc3QgU3RhdHVzJiBzdGF0dXMpOworUFJPVE9CVUZfRVhQT1JUIGJvb2wgSXNDYW5jZWxsZWQoY29uc3QgU3RhdHVzJiBzdGF0dXMpOworUFJPVE9CVUZfRVhQT1JUIGJvb2wgSXNEYXRhTG9zcyhjb25zdCBTdGF0dXMmIHN0YXR1cyk7CitQUk9UT0JVRl9FWFBPUlQgYm9vbCBJc0RlYWRsaW5lRXhjZWVkZWQoY29uc3QgU3RhdHVzJiBzdGF0dXMpOworUFJPVE9CVUZfRVhQT1JUIGJvb2wgSXNGYWlsZWRQcmVjb25kaXRpb24oY29uc3QgU3RhdHVzJiBzdGF0dXMpOworUFJPVE9CVUZfRVhQT1JUIGJvb2wgSXNJbnRlcm5hbChjb25zdCBTdGF0dXMmIHN0YXR1cyk7CitQUk9UT0JVRl9FWFBPUlQgYm9vbCBJc0ludmFsaWRBcmd1bWVudChjb25zdCBTdGF0dXMmIHN0YXR1cyk7CitQUk9UT0JVRl9FWFBPUlQgYm9vbCBJc05vdEZvdW5kKGNvbnN0IFN0YXR1cyYgc3RhdHVzKTsKK1BST1RPQlVGX0VYUE9SVCBib29sIElzT3V0T2ZSYW5nZShjb25zdCBTdGF0dXMmIHN0YXR1cyk7CitQUk9UT0JVRl9FWFBPUlQgYm9vbCBJc1Blcm1pc3Npb25EZW5pZWQoY29uc3QgU3RhdHVzJiBzdGF0dXMpOworUFJPVE9CVUZfRVhQT1JUIGJvb2wgSXNSZXNvdXJjZUV4aGF1c3RlZChjb25zdCBTdGF0dXMmIHN0YXR1cyk7CitQUk9UT0JVRl9FWFBPUlQgYm9vbCBJc1VuYXV0aGVudGljYXRlZChjb25zdCBTdGF0dXMmIHN0YXR1cyk7CitQUk9UT0JVRl9FWFBPUlQgYm9vbCBJc1VuYXZhaWxhYmxlKGNvbnN0IFN0YXR1cyYgc3RhdHVzKTsKK1BST1RPQlVGX0VYUE9SVCBib29sIElzVW5pbXBsZW1lbnRlZChjb25zdCBTdGF0dXMmIHN0YXR1cyk7CitQUk9UT0JVRl9FWFBPUlQgYm9vbCBJc1Vua25vd24oY29uc3QgU3RhdHVzJiBzdGF0dXMpOworCisvLyBUaGVzZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgY3JlYXRlIGFuIGBTdGF0dXNgIG9iamVjdCB3aXRoIGFuIGVycm9yIGNvZGUgYXMKKy8vIGluZGljYXRlZCBieSB0aGUgYXNzb2NpYXRlZCBmdW5jdGlvbiBuYW1lLCB1c2luZyB0aGUgZXJyb3IgbWVzc2FnZSBwYXNzZWQgaW4KKy8vIGBtZXNzYWdlYC4KKy8vCisvLyBUaGVzZSBmdW5jdGlvbnMgYXJlIGludGVudGlvbmFsbHkgbmFtZWQgYCpFcnJvcmAgcmF0aGVyIHRoYW4gYCpTdGF0dXNgIHRvCisvLyBtYXRjaCB0aGUgbmFtZXMgZnJvbSBBYnNlaWw6CisvLyBodHRwczovL2dpdGh1Yi5jb20vYWJzZWlsL2Fic2VpbC1jcHAvYmxvYi8yZTk1MzJjYzZjNzAxYTgzMjNkMGNmZmI0Njg5OTlhYjgwNDA5NWFiL2Fic2wvc3RhdHVzL3N0YXR1cy5oI0w3MTYKK1BST1RPQlVGX0VYUE9SVCBTdGF0dXMgQWJvcnRlZEVycm9yKFN0cmluZ1BpZWNlIG1lc3NhZ2UpOworUFJPVE9CVUZfRVhQT1JUIFN0YXR1cyBBbHJlYWR5RXhpc3RzRXJyb3IoU3RyaW5nUGllY2UgbWVzc2FnZSk7CitQUk9UT0JVRl9FWFBPUlQgU3RhdHVzIENhbmNlbGxlZEVycm9yKFN0cmluZ1BpZWNlIG1lc3NhZ2UpOworUFJPVE9CVUZfRVhQT1JUIFN0YXR1cyBEYXRhTG9zc0Vycm9yKFN0cmluZ1BpZWNlIG1lc3NhZ2UpOworUFJPVE9CVUZfRVhQT1JUIFN0YXR1cyBEZWFkbGluZUV4Y2VlZGVkRXJyb3IoU3RyaW5nUGllY2UgbWVzc2FnZSk7CitQUk9UT0JVRl9FWFBPUlQgU3RhdHVzIEZhaWxlZFByZWNvbmRpdGlvbkVycm9yKFN0cmluZ1BpZWNlIG1lc3NhZ2UpOworUFJPVE9CVUZfRVhQT1JUIFN0YXR1cyBJbnRlcm5hbEVycm9yKFN0cmluZ1BpZWNlIG1lc3NhZ2UpOworUFJPVE9CVUZfRVhQT1JUIFN0YXR1cyBJbnZhbGlkQXJndW1lbnRFcnJvcihTdHJpbmdQaWVjZSBtZXNzYWdlKTsKK1BST1RPQlVGX0VYUE9SVCBTdGF0dXMgTm90Rm91bmRFcnJvcihTdHJpbmdQaWVjZSBtZXNzYWdlKTsKK1BST1RPQlVGX0VYUE9SVCBTdGF0dXMgT3V0T2ZSYW5nZUVycm9yKFN0cmluZ1BpZWNlIG1lc3NhZ2UpOworUFJPVE9CVUZfRVhQT1JUIFN0YXR1cyBQZXJtaXNzaW9uRGVuaWVkRXJyb3IoU3RyaW5nUGllY2UgbWVzc2FnZSk7CitQUk9UT0JVRl9FWFBPUlQgU3RhdHVzIFJlc291cmNlRXhoYXVzdGVkRXJyb3IoU3RyaW5nUGllY2UgbWVzc2FnZSk7CitQUk9UT0JVRl9FWFBPUlQgU3RhdHVzIFVuYXV0aGVudGljYXRlZEVycm9yKFN0cmluZ1BpZWNlIG1lc3NhZ2UpOworUFJPVE9CVUZfRVhQT1JUIFN0YXR1cyBVbmF2YWlsYWJsZUVycm9yKFN0cmluZ1BpZWNlIG1lc3NhZ2UpOworUFJPVE9CVUZfRVhQT1JUIFN0YXR1cyBVbmltcGxlbWVudGVkRXJyb3IoU3RyaW5nUGllY2UgbWVzc2FnZSk7CitQUk9UT0JVRl9FWFBPUlQgU3RhdHVzIFVua25vd25FcnJvcihTdHJpbmdQaWVjZSBtZXNzYWdlKTsKKworfSAgLy8gbmFtZXNwYWNlIHN0YXR1c19pbnRlcm5hbAorCit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OnV0aWw6OnN0YXR1c19pbnRlcm5hbDo6U3RhdHVzOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNfaW50ZXJuYWw6OlN0YXR1c0NvZGU7CisKK3VzaW5nIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6c3RhdHVzX2ludGVybmFsOjpJc0Fib3J0ZWQ7Cit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OnV0aWw6OnN0YXR1c19pbnRlcm5hbDo6SXNBbHJlYWR5RXhpc3RzOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNfaW50ZXJuYWw6OklzQ2FuY2VsbGVkOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNfaW50ZXJuYWw6OklzRGF0YUxvc3M7Cit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OnV0aWw6OnN0YXR1c19pbnRlcm5hbDo6SXNEZWFkbGluZUV4Y2VlZGVkOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNfaW50ZXJuYWw6OklzRmFpbGVkUHJlY29uZGl0aW9uOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNfaW50ZXJuYWw6OklzSW50ZXJuYWw7Cit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OnV0aWw6OnN0YXR1c19pbnRlcm5hbDo6SXNJbnZhbGlkQXJndW1lbnQ7Cit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OnV0aWw6OnN0YXR1c19pbnRlcm5hbDo6SXNOb3RGb3VuZDsKK3VzaW5nIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6c3RhdHVzX2ludGVybmFsOjpJc091dE9mUmFuZ2U7Cit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OnV0aWw6OnN0YXR1c19pbnRlcm5hbDo6SXNQZXJtaXNzaW9uRGVuaWVkOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNfaW50ZXJuYWw6OklzUmVzb3VyY2VFeGhhdXN0ZWQ7Cit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OnV0aWw6OnN0YXR1c19pbnRlcm5hbDo6SXNVbmF1dGhlbnRpY2F0ZWQ7Cit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OnV0aWw6OnN0YXR1c19pbnRlcm5hbDo6SXNVbmF2YWlsYWJsZTsKK3VzaW5nIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6c3RhdHVzX2ludGVybmFsOjpJc1VuaW1wbGVtZW50ZWQ7Cit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OnV0aWw6OnN0YXR1c19pbnRlcm5hbDo6SXNVbmtub3duOworCit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OnV0aWw6OnN0YXR1c19pbnRlcm5hbDo6QWJvcnRlZEVycm9yOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNfaW50ZXJuYWw6OkFscmVhZHlFeGlzdHNFcnJvcjsKK3VzaW5nIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6c3RhdHVzX2ludGVybmFsOjpDYW5jZWxsZWRFcnJvcjsKK3VzaW5nIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6c3RhdHVzX2ludGVybmFsOjpEYXRhTG9zc0Vycm9yOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNfaW50ZXJuYWw6OkRlYWRsaW5lRXhjZWVkZWRFcnJvcjsKK3VzaW5nIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6c3RhdHVzX2ludGVybmFsOjpGYWlsZWRQcmVjb25kaXRpb25FcnJvcjsKK3VzaW5nIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6c3RhdHVzX2ludGVybmFsOjpJbnRlcm5hbEVycm9yOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNfaW50ZXJuYWw6OkludmFsaWRBcmd1bWVudEVycm9yOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNfaW50ZXJuYWw6Ok5vdEZvdW5kRXJyb3I7Cit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OnV0aWw6OnN0YXR1c19pbnRlcm5hbDo6T2tTdGF0dXM7Cit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OnV0aWw6OnN0YXR1c19pbnRlcm5hbDo6T3V0T2ZSYW5nZUVycm9yOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNfaW50ZXJuYWw6OlBlcm1pc3Npb25EZW5pZWRFcnJvcjsKK3VzaW5nIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6c3RhdHVzX2ludGVybmFsOjpSZXNvdXJjZUV4aGF1c3RlZEVycm9yOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNfaW50ZXJuYWw6OlVuYXV0aGVudGljYXRlZEVycm9yOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNfaW50ZXJuYWw6OlVuYXZhaWxhYmxlRXJyb3I7Cit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OnV0aWw6OnN0YXR1c19pbnRlcm5hbDo6VW5pbXBsZW1lbnRlZEVycm9yOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNfaW50ZXJuYWw6OlVua25vd25FcnJvcjsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVEFUVVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzX21hY3Jvcy5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNfbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3ZmY0YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzX21hY3Jvcy5oCkBAIC0wLDAgKzEsODkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBGcm9tOiB1dGlsL3Rhc2svY29udHJpYi9zdGF0dXNfbWFjcm9zL3N0YXR1c19tYWNyb3MuaAorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVEFUVVNfTUFDUk9TX0hfCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVEFUVVNfTUFDUk9TX0hfCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CisKKy8vIFJ1biBhIGNvbW1hbmQgdGhhdCByZXR1cm5zIGEgdXRpbDo6U3RhdHVzLiAgSWYgdGhlIGNhbGxlZCBjb2RlIHJldHVybnMgYW4KKy8vIGVycm9yIHN0YXR1cywgcmV0dXJuIHRoYXQgc3RhdHVzIHVwIG91dCBvZiB0aGlzIG1ldGhvZCB0b28uCisvLworLy8gRXhhbXBsZToKKy8vICAgUkVUVVJOX0lGX0VSUk9SKERvVGhpbmdzKDQpKTsKKyNkZWZpbmUgUkVUVVJOX0lGX0VSUk9SKGV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogVXNpbmcgX3N0YXR1cyBiZWxvdyB0byBhdm9pZCBjYXB0dXJlIHByb2JsZW1zIGlmIGV4cHIgaXMgInN0YXR1cyIuICovIFwKKyAgICBjb25zdCBQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OnV0aWw6OlN0YXR1cyBfc3RhdHVzID0gKGV4cHIpOyAgICAgICAgICAgICAgXAorICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCFfc3RhdHVzLm9rKCkpKSByZXR1cm4gX3N0YXR1czsgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8vIEludGVybmFsIGhlbHBlciBmb3IgY29uY2F0ZW5hdGluZyBtYWNybyB2YWx1ZXMuCisjZGVmaW5lIFNUQVRVU19NQUNST1NfQ09OQ0FUX05BTUVfSU5ORVIoeCwgeSkgeCMjeQorI2RlZmluZSBTVEFUVVNfTUFDUk9TX0NPTkNBVF9OQU1FKHgsIHkpIFNUQVRVU19NQUNST1NfQ09OQ0FUX05BTUVfSU5ORVIoeCwgeSkKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1N0YXR1cyBEb0Fzc2lnbk9yUmV0dXJuKFQmIGxocywgU3RhdHVzT3I8VD4gcmVzdWx0KSB7CisgIGlmIChyZXN1bHQub2soKSkgeworICAgIGxocyA9IHJlc3VsdC52YWx1ZSgpOworICB9CisgIHJldHVybiByZXN1bHQuc3RhdHVzKCk7Cit9CisKKyNkZWZpbmUgQVNTSUdOX09SX1JFVFVSTl9JTVBMKHN0YXR1cywgbGhzLCByZXhwcikgXAorICBTdGF0dXMgc3RhdHVzID0gRG9Bc3NpZ25PclJldHVybihsaHMsIChyZXhwcikpOyBcCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCFzdGF0dXMub2soKSkpIHJldHVybiBzdGF0dXM7CisKKy8vIEV4ZWN1dGVzIGFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIGEgdXRpbDo6U3RhdHVzT3IsIGV4dHJhY3RpbmcgaXRzIHZhbHVlCisvLyBpbnRvIHRoZSB2YXJpYWJsZSBkZWZpbmVkIGJ5IGxocyAob3IgcmV0dXJuaW5nIG9uIGVycm9yKS4KKy8vCisvLyBFeGFtcGxlOiBBc3NpZ25pbmcgdG8gYW4gZXhpc3RpbmcgdmFsdWUKKy8vICAgVmFsdWVUeXBlIHZhbHVlOworLy8gICBBU1NJR05fT1JfUkVUVVJOKHZhbHVlLCBNYXliZUdldFZhbHVlKGFyZykpOworLy8KKy8vIFdBUk5JTkc6IEFTU0lHTl9PUl9SRVRVUk4gZXhwYW5kcyBpbnRvIG11bHRpcGxlIHN0YXRlbWVudHM7IGl0IGNhbm5vdCBiZSB1c2VkCisvLyAgaW4gYSBzaW5nbGUgc3RhdGVtZW50IChlLmcuIGFzIHRoZSBib2R5IG9mIGFuIGlmIHN0YXRlbWVudCB3aXRob3V0IHt9KSEKKyNkZWZpbmUgQVNTSUdOX09SX1JFVFVSTihsaHMsIHJleHByKSBcCisgIEFTU0lHTl9PUl9SRVRVUk5fSU1QTCggXAorICAgICAgU1RBVFVTX01BQ1JPU19DT05DQVRfTkFNRShfc3RhdHVzX29yX3ZhbHVlLCBfX0NPVU5URVJfXyksIGxocywgcmV4cHIpOworCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUQVRVU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNfdGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5ZWRmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzX3Rlc3QuY2MKQEAgLTAsMCArMSwyNzggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHsKKworVEVTVChTdGF0dXMsIENvbnN0cnVjdG9yKSB7CisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprT2ssCisgICAgICAgICAgICB1dGlsOjpTdGF0dXModXRpbDo6U3RhdHVzQ29kZTo6a09rLCAiIikuY29kZSgpKTsKKyAgRVhQRUNUX0VRKHV0aWw6OlN0YXR1c0NvZGU6OmtDYW5jZWxsZWQsCisgICAgICAgICAgICB1dGlsOjpTdGF0dXModXRpbDo6U3RhdHVzQ29kZTo6a0NhbmNlbGxlZCwgIiIpLmNvZGUoKSk7CisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprVW5rbm93biwKKyAgICAgICAgICAgIHV0aWw6OlN0YXR1cyh1dGlsOjpTdGF0dXNDb2RlOjprVW5rbm93biwgIiIpLmNvZGUoKSk7CisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprSW52YWxpZEFyZ3VtZW50LAorICAgICAgICAgICAgdXRpbDo6U3RhdHVzKHV0aWw6OlN0YXR1c0NvZGU6OmtJbnZhbGlkQXJndW1lbnQsICIiKS5jb2RlKCkpOworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a0RlYWRsaW5lRXhjZWVkZWQsCisgICAgICAgICAgICB1dGlsOjpTdGF0dXModXRpbDo6U3RhdHVzQ29kZTo6a0RlYWRsaW5lRXhjZWVkZWQsICIiKS5jb2RlKCkpOworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a05vdEZvdW5kLAorICAgICAgICAgICAgdXRpbDo6U3RhdHVzKHV0aWw6OlN0YXR1c0NvZGU6OmtOb3RGb3VuZCwgIiIpLmNvZGUoKSk7CisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprQWxyZWFkeUV4aXN0cywKKyAgICAgICAgICAgIHV0aWw6OlN0YXR1cyh1dGlsOjpTdGF0dXNDb2RlOjprQWxyZWFkeUV4aXN0cywgIiIpLmNvZGUoKSk7CisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprUGVybWlzc2lvbkRlbmllZCwKKyAgICAgICAgICAgIHV0aWw6OlN0YXR1cyh1dGlsOjpTdGF0dXNDb2RlOjprUGVybWlzc2lvbkRlbmllZCwgIiIpLmNvZGUoKSk7CisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprVW5hdXRoZW50aWNhdGVkLAorICAgICAgICAgICAgdXRpbDo6U3RhdHVzKHV0aWw6OlN0YXR1c0NvZGU6OmtVbmF1dGhlbnRpY2F0ZWQsICIiKS5jb2RlKCkpOworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a1Jlc291cmNlRXhoYXVzdGVkLAorICAgICAgICAgICAgdXRpbDo6U3RhdHVzKHV0aWw6OlN0YXR1c0NvZGU6OmtSZXNvdXJjZUV4aGF1c3RlZCwgIiIpLmNvZGUoKSk7CisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprRmFpbGVkUHJlY29uZGl0aW9uLAorICAgICAgICAgICAgdXRpbDo6U3RhdHVzKHV0aWw6OlN0YXR1c0NvZGU6OmtGYWlsZWRQcmVjb25kaXRpb24sICIiKS5jb2RlKCkpOworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a0Fib3J0ZWQsCisgICAgICAgICAgICB1dGlsOjpTdGF0dXModXRpbDo6U3RhdHVzQ29kZTo6a0Fib3J0ZWQsICIiKS5jb2RlKCkpOworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a091dE9mUmFuZ2UsCisgICAgICAgICAgICB1dGlsOjpTdGF0dXModXRpbDo6U3RhdHVzQ29kZTo6a091dE9mUmFuZ2UsICIiKS5jb2RlKCkpOworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a1VuaW1wbGVtZW50ZWQsCisgICAgICAgICAgICB1dGlsOjpTdGF0dXModXRpbDo6U3RhdHVzQ29kZTo6a1VuaW1wbGVtZW50ZWQsICIiKS5jb2RlKCkpOworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a0ludGVybmFsLAorICAgICAgICAgICAgdXRpbDo6U3RhdHVzKHV0aWw6OlN0YXR1c0NvZGU6OmtJbnRlcm5hbCwgIiIpLmNvZGUoKSk7CisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprVW5hdmFpbGFibGUsCisgICAgICAgICAgICB1dGlsOjpTdGF0dXModXRpbDo6U3RhdHVzQ29kZTo6a1VuYXZhaWxhYmxlLCAiIikuY29kZSgpKTsKKyAgRVhQRUNUX0VRKHV0aWw6OlN0YXR1c0NvZGU6OmtEYXRhTG9zcywKKyAgICAgICAgICAgIHV0aWw6OlN0YXR1cyh1dGlsOjpTdGF0dXNDb2RlOjprRGF0YUxvc3MsICIiKS5jb2RlKCkpOworfQorCitURVNUKFN0YXR1cywgQ29uc3RydWN0b3JaZXJvKSB7CisgIHV0aWw6OlN0YXR1cyBzdGF0dXModXRpbDo6U3RhdHVzQ29kZTo6a09rLCAibXNnIik7CisgIEVYUEVDVF9UUlVFKHN0YXR1cy5vaygpKTsKKyAgRVhQRUNUX0VRKCJPSyIsIHN0YXR1cy5Ub1N0cmluZygpKTsKKyAgRVhQRUNUX0VRKHV0aWw6Ok9rU3RhdHVzKCksIHN0YXR1cyk7Cit9CisKK1RFU1QoU3RhdHVzLCBDb252ZW5pZW5jZUNvbnN0cnVjdG9ycykgeworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a09rLCB1dGlsOjpPa1N0YXR1cygpLmNvZGUoKSk7CisgIEVYUEVDVF9FUSgiIiwgdXRpbDo6T2tTdGF0dXMoKS5tZXNzYWdlKCkpOworCisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprQ2FuY2VsbGVkLCB1dGlsOjpDYW5jZWxsZWRFcnJvcigiIikuY29kZSgpKTsKKyAgRVhQRUNUX0VRKCIiLCB1dGlsOjpDYW5jZWxsZWRFcnJvcigiIikubWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCB1dGlsOjpDYW5jZWxsZWRFcnJvcigiZm9vIikubWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXIiLCB1dGlsOjpDYW5jZWxsZWRFcnJvcigiYmFyIikubWVzc2FnZSgpKTsKKworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a1Vua25vd24sIHV0aWw6OlVua25vd25FcnJvcigiIikuY29kZSgpKTsKKyAgRVhQRUNUX0VRKCIiLCB1dGlsOjpVbmtub3duRXJyb3IoIiIpLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgdXRpbDo6VW5rbm93bkVycm9yKCJmb28iKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoImJhciIsIHV0aWw6OlVua25vd25FcnJvcigiYmFyIikubWVzc2FnZSgpKTsKKworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a0ludmFsaWRBcmd1bWVudCwKKyAgICAgICAgICAgIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKCIiKS5jb2RlKCkpOworICBFWFBFQ1RfRVEoIiIsIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKCIiKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoImZvbyIsIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKCJmb28iKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoImJhciIsIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKCJiYXIiKS5tZXNzYWdlKCkpOworCisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprRGVhZGxpbmVFeGNlZWRlZCwKKyAgICAgICAgICAgIHV0aWw6OkRlYWRsaW5lRXhjZWVkZWRFcnJvcigiIikuY29kZSgpKTsKKyAgRVhQRUNUX0VRKCIiLCB1dGlsOjpEZWFkbGluZUV4Y2VlZGVkRXJyb3IoIiIpLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgdXRpbDo6RGVhZGxpbmVFeGNlZWRlZEVycm9yKCJmb28iKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoImJhciIsIHV0aWw6OkRlYWRsaW5lRXhjZWVkZWRFcnJvcigiYmFyIikubWVzc2FnZSgpKTsKKworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a05vdEZvdW5kLCB1dGlsOjpOb3RGb3VuZEVycm9yKCIiKS5jb2RlKCkpOworICBFWFBFQ1RfRVEoIiIsIHV0aWw6Ok5vdEZvdW5kRXJyb3IoIiIpLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgdXRpbDo6Tm90Rm91bmRFcnJvcigiZm9vIikubWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXIiLCB1dGlsOjpOb3RGb3VuZEVycm9yKCJiYXIiKS5tZXNzYWdlKCkpOworCisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprQWxyZWFkeUV4aXN0cywKKyAgICAgICAgICAgIHV0aWw6OkFscmVhZHlFeGlzdHNFcnJvcigiIikuY29kZSgpKTsKKyAgRVhQRUNUX0VRKCIiLCB1dGlsOjpBbHJlYWR5RXhpc3RzRXJyb3IoIiIpLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgdXRpbDo6QWxyZWFkeUV4aXN0c0Vycm9yKCJmb28iKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoImJhciIsIHV0aWw6OkFscmVhZHlFeGlzdHNFcnJvcigiYmFyIikubWVzc2FnZSgpKTsKKworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a1Blcm1pc3Npb25EZW5pZWQsCisgICAgICAgICAgICB1dGlsOjpQZXJtaXNzaW9uRGVuaWVkRXJyb3IoIiIpLmNvZGUoKSk7CisgIEVYUEVDVF9FUSgiIiwgdXRpbDo6UGVybWlzc2lvbkRlbmllZEVycm9yKCIiKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoImZvbyIsIHV0aWw6OlBlcm1pc3Npb25EZW5pZWRFcnJvcigiZm9vIikubWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXIiLCB1dGlsOjpQZXJtaXNzaW9uRGVuaWVkRXJyb3IoImJhciIpLm1lc3NhZ2UoKSk7CisKKyAgRVhQRUNUX0VRKHV0aWw6OlN0YXR1c0NvZGU6OmtVbmF1dGhlbnRpY2F0ZWQsCisgICAgICAgICAgICB1dGlsOjpVbmF1dGhlbnRpY2F0ZWRFcnJvcigiIikuY29kZSgpKTsKKyAgRVhQRUNUX0VRKCIiLCB1dGlsOjpVbmF1dGhlbnRpY2F0ZWRFcnJvcigiIikubWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCB1dGlsOjpVbmF1dGhlbnRpY2F0ZWRFcnJvcigiZm9vIikubWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXIiLCB1dGlsOjpVbmF1dGhlbnRpY2F0ZWRFcnJvcigiYmFyIikubWVzc2FnZSgpKTsKKworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a1Jlc291cmNlRXhoYXVzdGVkLAorICAgICAgICAgICAgdXRpbDo6UmVzb3VyY2VFeGhhdXN0ZWRFcnJvcigiIikuY29kZSgpKTsKKyAgRVhQRUNUX0VRKCIiLCB1dGlsOjpSZXNvdXJjZUV4aGF1c3RlZEVycm9yKCIiKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoImZvbyIsIHV0aWw6OlJlc291cmNlRXhoYXVzdGVkRXJyb3IoImZvbyIpLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgiYmFyIiwgdXRpbDo6UmVzb3VyY2VFeGhhdXN0ZWRFcnJvcigiYmFyIikubWVzc2FnZSgpKTsKKworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a0ZhaWxlZFByZWNvbmRpdGlvbiwKKyAgICAgICAgICAgIHV0aWw6OkZhaWxlZFByZWNvbmRpdGlvbkVycm9yKCIiKS5jb2RlKCkpOworICBFWFBFQ1RfRVEoIiIsIHV0aWw6OkZhaWxlZFByZWNvbmRpdGlvbkVycm9yKCIiKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoImZvbyIsIHV0aWw6OkZhaWxlZFByZWNvbmRpdGlvbkVycm9yKCJmb28iKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoImJhciIsIHV0aWw6OkZhaWxlZFByZWNvbmRpdGlvbkVycm9yKCJiYXIiKS5tZXNzYWdlKCkpOworCisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprQWJvcnRlZCwgdXRpbDo6QWJvcnRlZEVycm9yKCIiKS5jb2RlKCkpOworICBFWFBFQ1RfRVEoIiIsIHV0aWw6OkFib3J0ZWRFcnJvcigiIikubWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCB1dGlsOjpBYm9ydGVkRXJyb3IoImZvbyIpLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgiYmFyIiwgdXRpbDo6QWJvcnRlZEVycm9yKCJiYXIiKS5tZXNzYWdlKCkpOworCisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprT3V0T2ZSYW5nZSwgdXRpbDo6T3V0T2ZSYW5nZUVycm9yKCIiKS5jb2RlKCkpOworICBFWFBFQ1RfRVEoIiIsIHV0aWw6Ok91dE9mUmFuZ2VFcnJvcigiIikubWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCB1dGlsOjpPdXRPZlJhbmdlRXJyb3IoImZvbyIpLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgiYmFyIiwgdXRpbDo6T3V0T2ZSYW5nZUVycm9yKCJiYXIiKS5tZXNzYWdlKCkpOworCisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprVW5pbXBsZW1lbnRlZCwKKyAgICAgICAgICAgIHV0aWw6OlVuaW1wbGVtZW50ZWRFcnJvcigiIikuY29kZSgpKTsKKyAgRVhQRUNUX0VRKCIiLCB1dGlsOjpVbmltcGxlbWVudGVkRXJyb3IoIiIpLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgdXRpbDo6VW5pbXBsZW1lbnRlZEVycm9yKCJmb28iKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoImJhciIsIHV0aWw6OlVuaW1wbGVtZW50ZWRFcnJvcigiYmFyIikubWVzc2FnZSgpKTsKKworICBFWFBFQ1RfRVEodXRpbDo6U3RhdHVzQ29kZTo6a0ludGVybmFsLCB1dGlsOjpJbnRlcm5hbEVycm9yKCIiKS5jb2RlKCkpOworICBFWFBFQ1RfRVEoIiIsIHV0aWw6OkludGVybmFsRXJyb3IoIiIpLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgdXRpbDo6SW50ZXJuYWxFcnJvcigiZm9vIikubWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXIiLCB1dGlsOjpJbnRlcm5hbEVycm9yKCJiYXIiKS5tZXNzYWdlKCkpOworCisgIEVYUEVDVF9FUSh1dGlsOjpTdGF0dXNDb2RlOjprVW5hdmFpbGFibGUsIHV0aWw6OlVuYXZhaWxhYmxlRXJyb3IoIiIpLmNvZGUoKSk7CisgIEVYUEVDVF9FUSgiIiwgdXRpbDo6VW5hdmFpbGFibGVFcnJvcigiIikubWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCB1dGlsOjpVbmF2YWlsYWJsZUVycm9yKCJmb28iKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoImJhciIsIHV0aWw6OlVuYXZhaWxhYmxlRXJyb3IoImJhciIpLm1lc3NhZ2UoKSk7CisKKyAgRVhQRUNUX0VRKHV0aWw6OlN0YXR1c0NvZGU6OmtEYXRhTG9zcywgdXRpbDo6RGF0YUxvc3NFcnJvcigiIikuY29kZSgpKTsKKyAgRVhQRUNUX0VRKCIiLCB1dGlsOjpEYXRhTG9zc0Vycm9yKCIiKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoImZvbyIsIHV0aWw6OkRhdGFMb3NzRXJyb3IoImZvbyIpLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgiYmFyIiwgdXRpbDo6RGF0YUxvc3NFcnJvcigiYmFyIikubWVzc2FnZSgpKTsKK30KKworVEVTVChTdGF0dXMsIENvbnZlbmllbmNlVGVzdHMpIHsKKyAgRVhQRUNUX1RSVUUodXRpbDo6T2tTdGF0dXMoKS5vaygpKTsKKyAgRVhQRUNUX1RSVUUodXRpbDo6SXNDYW5jZWxsZWQodXRpbDo6Q2FuY2VsbGVkRXJyb3IoIiIpKSk7CisgIEVYUEVDVF9UUlVFKHV0aWw6OklzVW5rbm93bih1dGlsOjpVbmtub3duRXJyb3IoIiIpKSk7CisgIEVYUEVDVF9UUlVFKHV0aWw6OklzSW52YWxpZEFyZ3VtZW50KHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKCIiKSkpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpJc0RlYWRsaW5lRXhjZWVkZWQodXRpbDo6RGVhZGxpbmVFeGNlZWRlZEVycm9yKCIiKSkpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpJc05vdEZvdW5kKHV0aWw6Ok5vdEZvdW5kRXJyb3IoIiIpKSk7CisgIEVYUEVDVF9UUlVFKHV0aWw6OklzQWxyZWFkeUV4aXN0cyh1dGlsOjpBbHJlYWR5RXhpc3RzRXJyb3IoIiIpKSk7CisgIEVYUEVDVF9UUlVFKHV0aWw6OklzUGVybWlzc2lvbkRlbmllZCh1dGlsOjpQZXJtaXNzaW9uRGVuaWVkRXJyb3IoIiIpKSk7CisgIEVYUEVDVF9UUlVFKHV0aWw6OklzVW5hdXRoZW50aWNhdGVkKHV0aWw6OlVuYXV0aGVudGljYXRlZEVycm9yKCIiKSkpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpJc1Jlc291cmNlRXhoYXVzdGVkKHV0aWw6OlJlc291cmNlRXhoYXVzdGVkRXJyb3IoIiIpKSk7CisgIEVYUEVDVF9UUlVFKHV0aWw6OklzRmFpbGVkUHJlY29uZGl0aW9uKHV0aWw6OkZhaWxlZFByZWNvbmRpdGlvbkVycm9yKCIiKSkpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpJc0Fib3J0ZWQodXRpbDo6QWJvcnRlZEVycm9yKCIiKSkpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpJc091dE9mUmFuZ2UodXRpbDo6T3V0T2ZSYW5nZUVycm9yKCIiKSkpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpJc1VuaW1wbGVtZW50ZWQodXRpbDo6VW5pbXBsZW1lbnRlZEVycm9yKCIiKSkpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpJc0ludGVybmFsKHV0aWw6OkludGVybmFsRXJyb3IoIiIpKSk7CisgIEVYUEVDVF9UUlVFKHV0aWw6OklzVW5hdmFpbGFibGUodXRpbDo6VW5hdmFpbGFibGVFcnJvcigiIikpKTsKKyAgRVhQRUNUX1RSVUUodXRpbDo6SXNEYXRhTG9zcyh1dGlsOjpEYXRhTG9zc0Vycm9yKCIiKSkpOworfQorCitURVNUKFN0YXR1cywgRW1wdHkpIHsKKyAgdXRpbDo6U3RhdHVzIHN0YXR1czsKKyAgRVhQRUNUX1RSVUUoc3RhdHVzLm9rKCkpOworICBFWFBFQ1RfRVEodXRpbDo6T2tTdGF0dXMoKSwgc3RhdHVzKTsKKyAgRVhQRUNUX0VRKHV0aWw6OlN0YXR1c0NvZGU6OmtPaywgc3RhdHVzLmNvZGUoKSk7CisgIEVYUEVDVF9FUSgiT0siLCBzdGF0dXMuVG9TdHJpbmcoKSk7Cit9CisKK1RFU1QoU3RhdHVzLCBDaGVja09LKSB7CisgIHV0aWw6OlN0YXR1cyBzdGF0dXM7CisgIEdPT0dMRV9DSEVDS19PSyhzdGF0dXMpOworICBHT09HTEVfQ0hFQ0tfT0soc3RhdHVzKSA8PCAiRmFpbGVkIjsKKyAgR09PR0xFX0RDSEVDS19PSyhzdGF0dXMpIDw8ICJGYWlsZWQiOworfQorCitURVNUKFN0YXR1cywgRXJyb3JNZXNzYWdlKSB7CisgIHV0aWw6OlN0YXR1cyBzdGF0dXMgPSB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigiIik7CisgIEVYUEVDVF9GQUxTRShzdGF0dXMub2soKSk7CisgIEVYUEVDVF9FUSgiIiwgc3RhdHVzLm1lc3NhZ2UoKS5Ub1N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJJTlZBTElEX0FSR1VNRU5UIiwgc3RhdHVzLlRvU3RyaW5nKCkpOworICBzdGF0dXMgPSB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigibXNnIik7CisgIEVYUEVDVF9GQUxTRShzdGF0dXMub2soKSk7CisgIEVYUEVDVF9FUSgibXNnIiwgc3RhdHVzLm1lc3NhZ2UoKS5Ub1N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJJTlZBTElEX0FSR1VNRU5UOm1zZyIsIHN0YXR1cy5Ub1N0cmluZygpKTsKKyAgc3RhdHVzID0gdXRpbDo6U3RhdHVzKHV0aWw6OlN0YXR1c0NvZGU6OmtPaywgIm1zZyIpOworICBFWFBFQ1RfVFJVRShzdGF0dXMub2soKSk7CisgIEVYUEVDVF9FUSgiIiwgc3RhdHVzLm1lc3NhZ2UoKS5Ub1N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJPSyIsIHN0YXR1cy5Ub1N0cmluZygpKTsKK30KKworVEVTVChTdGF0dXMsIENvcHkpIHsKKyAgdXRpbDo6U3RhdHVzIGEgPSB1dGlsOjpVbmtub3duRXJyb3IoIm1lc3NhZ2UiKTsKKyAgdXRpbDo6U3RhdHVzIGIoYSk7CisgIEFTU0VSVF9FUShhLlRvU3RyaW5nKCksIGIuVG9TdHJpbmcoKSk7Cit9CisKK1RFU1QoU3RhdHVzLCBBc3NpZ24pIHsKKyAgdXRpbDo6U3RhdHVzIGEgPSB1dGlsOjpVbmtub3duRXJyb3IoIm1lc3NhZ2UiKTsKKyAgdXRpbDo6U3RhdHVzIGI7CisgIGIgPSBhOworICBBU1NFUlRfRVEoYS5Ub1N0cmluZygpLCBiLlRvU3RyaW5nKCkpOworfQorCitURVNUKFN0YXR1cywgQXNzaWduRW1wdHkpIHsKKyAgdXRpbDo6U3RhdHVzIGEgPSB1dGlsOjpVbmtub3duRXJyb3IoIm1lc3NhZ2UiKTsKKyAgdXRpbDo6U3RhdHVzIGI7CisgIGEgPSBiOworICBBU1NFUlRfRVEoc3RkOjpzdHJpbmcoIk9LIiksIGEuVG9TdHJpbmcoKSk7CisgIEFTU0VSVF9UUlVFKGIub2soKSk7CisgIEFTU0VSVF9UUlVFKGEub2soKSk7Cit9CisKK1RFU1QoU3RhdHVzLCBFcXVhbHNPSykgeyBBU1NFUlRfRVEodXRpbDo6T2tTdGF0dXMoKSwgdXRpbDo6U3RhdHVzKCkpOyB9CisKK1RFU1QoU3RhdHVzLCBFcXVhbHNTYW1lKSB7CisgIGNvbnN0IHV0aWw6OlN0YXR1cyBhID0gdXRpbDo6Q2FuY2VsbGVkRXJyb3IoIm1lc3NhZ2UiKTsKKyAgY29uc3QgdXRpbDo6U3RhdHVzIGIgPSB1dGlsOjpDYW5jZWxsZWRFcnJvcigibWVzc2FnZSIpOworICBBU1NFUlRfRVEoYSwgYik7Cit9CisKK1RFU1QoU3RhdHVzLCBFcXVhbHNDb3B5KSB7CisgIGNvbnN0IHV0aWw6OlN0YXR1cyBhID0gdXRpbDo6Q2FuY2VsbGVkRXJyb3IoIm1lc3NhZ2UiKTsKKyAgY29uc3QgdXRpbDo6U3RhdHVzIGIgPSBhOworICBBU1NFUlRfRVEoYSwgYik7Cit9CisKK1RFU1QoU3RhdHVzLCBFcXVhbHNEaWZmZXJlbnRDb2RlKSB7CisgIGNvbnN0IHV0aWw6OlN0YXR1cyBhID0gdXRpbDo6Q2FuY2VsbGVkRXJyb3IoIm1lc3NhZ2UiKTsKKyAgY29uc3QgdXRpbDo6U3RhdHVzIGIgPSB1dGlsOjpVbmtub3duRXJyb3IoIm1lc3NhZ2UiKTsKKyAgQVNTRVJUX05FKGEsIGIpOworfQorCitURVNUKFN0YXR1cywgRXF1YWxzRGlmZmVyZW50TWVzc2FnZSkgeworICBjb25zdCB1dGlsOjpTdGF0dXMgYSA9IHV0aWw6OkNhbmNlbGxlZEVycm9yKCJtZXNzYWdlIik7CisgIGNvbnN0IHV0aWw6OlN0YXR1cyBiID0gdXRpbDo6Q2FuY2VsbGVkRXJyb3IoImFub3RoZXIiKTsKKyAgQVNTRVJUX05FKGEsIGIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvci5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwYTE3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3IuY2MKQEAgLTAsMCArMSw0OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3IuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBzdGF0dXNvcl9pbnRlcm5hbCB7CisKK3ZvaWQgU3RhdHVzT3JIZWxwZXI6OkNyYXNoKGNvbnN0IFN0YXR1cyYgc3RhdHVzKSB7CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJBdHRlbXB0aW5nIHRvIGZldGNoIHZhbHVlIGluc3RlYWQgb2YgaGFuZGxpbmcgZXJyb3IgIgorICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMuVG9TdHJpbmcoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHN0YXR1c29yX2ludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBlNjAzZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3IuaApAQCAtMCwwICsxLDI1MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFN0YXR1c09yPFQ+IGlzIHRoZSB1bmlvbiBvZiBhIFN0YXR1cyBvYmplY3QgYW5kIGEgVAorLy8gb2JqZWN0LiBTdGF0dXNPciBtb2RlbHMgdGhlIGNvbmNlcHQgb2YgYW4gb2JqZWN0IHRoYXQgaXMgZWl0aGVyIGEKKy8vIHVzYWJsZSB2YWx1ZSwgb3IgYW4gZXJyb3IgU3RhdHVzIGV4cGxhaW5pbmcgd2h5IHN1Y2ggYSB2YWx1ZSBpcworLy8gbm90IHByZXNlbnQuIFRvIHRoaXMgZW5kLCBTdGF0dXNPcjxUPiBkb2VzIG5vdCBhbGxvdyBpdHMgU3RhdHVzCisvLyB2YWx1ZSB0byBiZSBPa1N0YXR1cygpLiBGdXJ0aGVyLCBTdGF0dXNPcjxUKj4gZG9lcyBub3QgYWxsb3cgdGhlCisvLyBjb250YWluZWQgcG9pbnRlciB0byBiZSBudWxscHRyLgorLy8KKy8vIFRoZSBwcmltYXJ5IHVzZS1jYXNlIGZvciBTdGF0dXNPcjxUPiBpcyBhcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEKKy8vIGZ1bmN0aW9uIHdoaWNoIG1heSBmYWlsLgorLy8KKy8vIEV4YW1wbGUgY2xpZW50IHVzYWdlIGZvciBhIFN0YXR1c09yPFQ+LCB3aGVyZSBUIGlzIG5vdCBhIHBvaW50ZXI6CisvLworLy8gIFN0YXR1c09yPGZsb2F0PiByZXN1bHQgPSBEb0JpZ0NhbGN1bGF0aW9uVGhhdENvdWxkRmFpbCgpOworLy8gIGlmIChyZXN1bHQub2soKSkgeworLy8gICAgZmxvYXQgYW5zd2VyID0gcmVzdWx0LnZhbHVlKCk7CisvLyAgICBwcmludGYoIkJpZyBjYWxjdWxhdGlvbiB5aWVsZGVkOiAlZiIsIGFuc3dlcik7CisvLyAgfSBlbHNlIHsKKy8vICAgIExPRyhFUlJPUikgPDwgcmVzdWx0LnN0YXR1cygpOworLy8gIH0KKy8vCisvLyBFeGFtcGxlIGNsaWVudCB1c2FnZSBmb3IgYSBTdGF0dXNPcjxUKj46CisvLworLy8gIFN0YXR1c09yPEZvbyo+IHJlc3VsdCA9IEZvb0ZhY3Rvcnk6Ok1ha2VOZXdGb28oYXJnKTsKKy8vICBpZiAocmVzdWx0Lm9rKCkpIHsKKy8vICAgIHN0ZDo6dW5pcXVlX3B0cjxGb28+IGZvbyhyZXN1bHQudmFsdWUoKSk7CisvLyAgICBmb28tPkRvU29tZXRoaW5nQ29vbCgpOworLy8gIH0gZWxzZSB7CisvLyAgICBMT0coRVJST1IpIDw8IHJlc3VsdC5zdGF0dXMoKTsKKy8vICB9CisvLworLy8gRXhhbXBsZSBmYWN0b3J5IGltcGxlbWVudGF0aW9uIHJldHVybmluZyBTdGF0dXNPcjxUKj46CisvLworLy8gIFN0YXR1c09yPEZvbyo+IEZvb0ZhY3Rvcnk6Ok1ha2VOZXdGb28oaW50IGFyZykgeworLy8gICAgaWYgKGFyZyA8PSAwKSB7CisvLyAgICAgIHJldHVybiBJbnZhbGlkQXJndW1lbnRFcnJvcigiQXJnIG11c3QgYmUgcG9zaXRpdmUiKTsKKy8vICAgIH0gZWxzZSB7CisvLyAgICAgIHJldHVybiBuZXcgRm9vKGFyZyk7CisvLyAgICB9CisvLyAgfQorLy8KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RBVFVTT1JfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUQVRVU09SX0hfCisKKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2Ugc3RhdHVzb3JfaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgU3RhdHVzT3IgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBmcmllbmQgY2xhc3MgU3RhdHVzT3I7CisKKyBwdWJsaWM6CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworCisgIC8vIENvbnN0cnVjdCBhIG5ldyBTdGF0dXNPciB3aXRoIFN0YXR1czo6VU5LTk9XTiBzdGF0dXMuCisgIC8vIENvbnN0cnVjdCBhIG5ldyBTdGF0dXNPciB3aXRoIFVua25vd25FcnJvcigpIHN0YXR1cy4KKyAgZXhwbGljaXQgU3RhdHVzT3IoKTsKKworICAvLyBDb25zdHJ1Y3QgYSBuZXcgU3RhdHVzT3Igd2l0aCB0aGUgZ2l2ZW4gbm9uLW9rIHN0YXR1cy4gQWZ0ZXIgY2FsbGluZworICAvLyB0aGlzIGNvbnN0cnVjdG9yLCBjYWxscyB0byB2YWx1ZSgpIHdpbGwgQ0hFQ0stZmFpbC4KKyAgLy8KKyAgLy8gTk9URTogTm90IGV4cGxpY2l0IC0gd2Ugd2FudCB0byB1c2UgU3RhdHVzT3I8VD4gYXMgYSByZXR1cm4KKyAgLy8gdmFsdWUsIHNvIGl0IGlzIGNvbnZlbmllbnQgYW5kIHNlbnNpYmxlIHRvIGJlIGFibGUgdG8gZG8gJ3JldHVybgorICAvLyBTdGF0dXMoKScgd2hlbiB0aGUgcmV0dXJuIHR5cGUgaXMgU3RhdHVzT3I8VD4uCisgIC8vCisgIC8vIFJFUVVJUkVTOiBzdGF0dXMgIT0gT2tTdGF0dXMoKS4gVGhpcyByZXF1aXJlbWVudCBpcyBEQ0hFQ0tlZC4KKyAgLy8gSW4gb3B0aW1pemVkIGJ1aWxkcywgcGFzc2luZyBPa1N0YXR1cygpIGhlcmUgd2lsbCBoYXZlIHRoZSBlZmZlY3QKKyAgLy8gb2YgcGFzc2luZyBQb3NpeEVycm9yU3BhY2U6OkVJTlZBTCBhcyBhIGZhbGxiYWNrLgorICBTdGF0dXNPcihjb25zdCBTdGF0dXMmIHN0YXR1cyk7ICAvLyBOT0xJTlQKKworICAvLyBDb25zdHJ1Y3QgYSBuZXcgU3RhdHVzT3Igd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuIElmIFQgaXMgYSBwbGFpbiBwb2ludGVyLAorICAvLyB2YWx1ZSBtdXN0IG5vdCBiZSBudWxscHRyLiBBZnRlciBjYWxsaW5nIHRoaXMgY29uc3RydWN0b3IsIGNhbGxzIHRvCisgIC8vIHZhbHVlKCkgd2lsbCBzdWNjZWVkLCBhbmQgY2FsbHMgdG8gc3RhdHVzKCkgd2lsbCByZXR1cm4gT0suCisgIC8vCisgIC8vIE5PVEU6IE5vdCBleHBsaWNpdCAtIHdlIHdhbnQgdG8gdXNlIFN0YXR1c09yPFQ+IGFzIGEgcmV0dXJuIHR5cGUKKyAgLy8gc28gaXQgaXMgY29udmVuaWVudCBhbmQgc2Vuc2libGUgdG8gYmUgYWJsZSB0byBkbyAncmV0dXJuIFQoKScKKyAgLy8gd2hlbiB3aGVuIHRoZSByZXR1cm4gdHlwZSBpcyBTdGF0dXNPcjxUPi4KKyAgLy8KKyAgLy8gUkVRVUlSRVM6IGlmIFQgaXMgYSBwbGFpbiBwb2ludGVyLCB2YWx1ZSAhPSBudWxscHRyLiBUaGlzIHJlcXVpcmVtZW50IGlzCisgIC8vIERDSEVDS2VkLiBJbiBvcHRpbWl6ZWQgYnVpbGRzLCBwYXNzaW5nIGEgbnVsbCBwb2ludGVyIGhlcmUgd2lsbCBoYXZlCisgIC8vIHRoZSBlZmZlY3Qgb2YgcGFzc2luZyBQb3NpeEVycm9yU3BhY2U6OkVJTlZBTCBhcyBhIGZhbGxiYWNrLgorICBTdGF0dXNPcihjb25zdCBUJiB2YWx1ZSk7ICAvLyBOT0xJTlQKKworICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICBTdGF0dXNPcihjb25zdCBTdGF0dXNPciYgb3RoZXIpOworCisgIC8vIENvbnZlcnNpb24gY29weSBjb25zdHJ1Y3RvciwgVCBtdXN0IGJlIGNvcHkgY29uc3RydWN0aWJsZSBmcm9tIFUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgU3RhdHVzT3IoY29uc3QgU3RhdHVzT3I8VT4mIG90aGVyKTsKKworICAvLyBBc3NpZ25tZW50IG9wZXJhdG9yLgorICBTdGF0dXNPciYgb3BlcmF0b3I9KGNvbnN0IFN0YXR1c09yJiBvdGhlcik7CisKKyAgLy8gQ29udmVyc2lvbiBhc3NpZ25tZW50IG9wZXJhdG9yLCBUIG11c3QgYmUgYXNzaWduYWJsZSBmcm9tIFUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgU3RhdHVzT3ImIG9wZXJhdG9yPShjb25zdCBTdGF0dXNPcjxVPiYgb3RoZXIpOworCisgIC8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gb3VyIHN0YXR1cy4gSWYgdGhpcyBjb250YWlucyBhIFQsIHRoZW4KKyAgLy8gcmV0dXJucyBPa1N0YXR1cygpLgorICBjb25zdCBTdGF0dXMmIHN0YXR1cygpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhpcy0+c3RhdHVzKCkub2soKQorICBib29sIG9rKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byBvdXIgY3VycmVudCB2YWx1ZSwgb3IgQ0hFQ0stZmFpbHMgaWYgIXRoaXMtPm9rKCkuCisgIGNvbnN0IFQmIHZhbHVlICgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgU3RhdHVzIHN0YXR1c187CisgIFQgdmFsdWVfOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMgZm9yIFN0YXR1c09yPFQ+CisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBTdGF0dXNPckhlbHBlciB7CisgcHVibGljOgorICAvLyBNb3ZlIHR5cGUtYWdub3N0aWMgZXJyb3IgaGFuZGxpbmcgdG8gdGhlIC5jYy4KKyAgc3RhdGljIHZvaWQgQ3Jhc2goY29uc3QgdXRpbDo6U3RhdHVzJiBzdGF0dXMpOworCisgIC8vIEN1c3RvbWl6ZWQgYmVoYXZpb3IgZm9yIFN0YXR1c09yPFQ+IHZzLiBTdGF0dXNPcjxUKj4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgc3RydWN0IFNwZWNpYWxpemU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IFN0YXR1c09ySGVscGVyOjpTcGVjaWFsaXplIHsKKyAgLy8gRm9yIG5vbi1wb2ludGVyIFQsIGEgcmVmZXJlbmNlIGNhbiBuZXZlciBiZSBudWxscHRyLgorICBzdGF0aWMgaW5saW5lIGJvb2wgSXNWYWx1ZU51bGwoY29uc3QgVCYgLyp0Ki8pIHsgcmV0dXJuIGZhbHNlOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IFN0YXR1c09ySGVscGVyOjpTcGVjaWFsaXplPFQqPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBJc1ZhbHVlTnVsbChjb25zdCBUKiB0KSB7IHJldHVybiB0ID09IG51bGxwdHI7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIFN0YXR1c09yPFQ+OjpTdGF0dXNPcigpIDogc3RhdHVzXyh1dGlsOjpVbmtub3duRXJyb3IoIiIpKSB7fQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIFN0YXR1c09yPFQ+OjpTdGF0dXNPcihjb25zdCBTdGF0dXMmIHN0YXR1cykgeworICBpZiAoc3RhdHVzLm9rKCkpIHsKKyAgICBzdGF0dXNfID0gdXRpbDo6SW50ZXJuYWxFcnJvcigiT2tTdGF0dXMoKSBpcyBub3QgYSB2YWxpZCBhcmd1bWVudC4iKTsKKyAgfSBlbHNlIHsKKyAgICBzdGF0dXNfID0gc3RhdHVzOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgU3RhdHVzT3I8VD46OlN0YXR1c09yKGNvbnN0IFQmIHZhbHVlKSB7CisgIGlmIChTdGF0dXNPckhlbHBlcjo6U3BlY2lhbGl6ZTxUPjo6SXNWYWx1ZU51bGwodmFsdWUpKSB7CisgICAgc3RhdHVzXyA9IHV0aWw6OkludGVybmFsRXJyb3IoIm51bGxwdHIgaXMgbm90IGEgdmFsaWQgYXJndW1lbnQuIik7CisgIH0gZWxzZSB7CisgICAgc3RhdHVzXyA9IHV0aWw6Ok9rU3RhdHVzKCk7CisgICAgdmFsdWVfID0gdmFsdWU7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBTdGF0dXNPcjxUPjo6U3RhdHVzT3IoY29uc3QgU3RhdHVzT3I8VD4mIG90aGVyKQorICAgIDogc3RhdHVzXyhvdGhlci5zdGF0dXNfKSwgdmFsdWVfKG90aGVyLnZhbHVlXykgeworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIFN0YXR1c09yPFQ+JiBTdGF0dXNPcjxUPjo6b3BlcmF0b3I9KGNvbnN0IFN0YXR1c09yPFQ+JiBvdGhlcikgeworICBzdGF0dXNfID0gb3RoZXIuc3RhdHVzXzsKKyAgdmFsdWVfID0gb3RoZXIudmFsdWVfOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBVPgoraW5saW5lIFN0YXR1c09yPFQ+OjpTdGF0dXNPcihjb25zdCBTdGF0dXNPcjxVPiYgb3RoZXIpCisgICAgOiBzdGF0dXNfKG90aGVyLnN0YXR1c18pLCB2YWx1ZV8ob3RoZXIuc3RhdHVzXy5vaygpID8gb3RoZXIudmFsdWVfIDogVCgpKSB7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBVPgoraW5saW5lIFN0YXR1c09yPFQ+JiBTdGF0dXNPcjxUPjo6b3BlcmF0b3I9KGNvbnN0IFN0YXR1c09yPFU+JiBvdGhlcikgeworICBzdGF0dXNfID0gb3RoZXIuc3RhdHVzXzsKKyAgaWYgKHN0YXR1c18ub2soKSkgdmFsdWVfID0gb3RoZXIudmFsdWVfOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgY29uc3QgU3RhdHVzJiBTdGF0dXNPcjxUPjo6c3RhdHVzKCkgY29uc3QgeworICByZXR1cm4gc3RhdHVzXzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBib29sIFN0YXR1c09yPFQ+OjpvaygpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXR1cygpLm9rKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgY29uc3QgVCYgU3RhdHVzT3I8VD46OnZhbHVlKCkgY29uc3QgeworICBpZiAoIXN0YXR1c18ub2soKSkgeworICAgIFN0YXR1c09ySGVscGVyOjpDcmFzaChzdGF0dXNfKTsKKyAgfQorICByZXR1cm4gdmFsdWVfOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc3RhdHVzb3JfaW50ZXJuYWwKKwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpzdGF0dXNvcl9pbnRlcm5hbDo6U3RhdHVzT3I7CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RBVFVTT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3JfdGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3JfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDNhZGNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvcl90ZXN0LmNjCkBAIC0wLDAgKzEsMjcyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvci5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIHsKKworY2xhc3MgQmFzZTEgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+QmFzZTEoKSB7fQorICBpbnQgcGFkOworfTsKKworY2xhc3MgQmFzZTIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+QmFzZTIoKSB7fQorICBpbnQgeWV0b3RoZXJwYWQ7Cit9OworCitjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UxLCBwdWJsaWMgQmFzZTIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+RGVyaXZlZCgpIHt9CisgIGludCBldmVubW9yZXBhZDsKK307CisKK2NsYXNzIENvcHlOb0Fzc2lnbiB7CisgcHVibGljOgorICBleHBsaWNpdCBDb3B5Tm9Bc3NpZ24oaW50IHZhbHVlKSA6IGZvbyh2YWx1ZSkge30KKyAgQ29weU5vQXNzaWduKGNvbnN0IENvcHlOb0Fzc2lnbiYgb3RoZXIpIDogZm9vKG90aGVyLmZvbykge30KKyAgaW50IGZvbzsKKyBwcml2YXRlOgorICBjb25zdCBDb3B5Tm9Bc3NpZ24mIG9wZXJhdG9yPShjb25zdCBDb3B5Tm9Bc3NpZ24mKTsKK307CisKK1RFU1QoU3RhdHVzT3IsIFRlc3REZWZhdWx0Q3RvcikgeworICBTdGF0dXNPcjxpbnQ+IHRoaW5nOworICBFWFBFQ1RfRkFMU0UodGhpbmcub2soKSk7CisgIEVYUEVDVF9FUSh1dGlsOjpVbmtub3duRXJyb3IoIiIpLCB0aGluZy5zdGF0dXMoKSk7Cit9CisKK1RFU1QoU3RhdHVzT3IsIFRlc3RTdGF0dXNDdG9yKSB7CisgIFN0YXR1c09yPGludD4gdGhpbmcodXRpbDo6Q2FuY2VsbGVkRXJyb3IoIiIpKTsKKyAgRVhQRUNUX0ZBTFNFKHRoaW5nLm9rKCkpOworICBFWFBFQ1RfRVEodXRpbDo6Q2FuY2VsbGVkRXJyb3IoIiIpLCB0aGluZy5zdGF0dXMoKSk7Cit9CisKK1RFU1QoU3RhdHVzT3IsIFRlc3RWYWx1ZUN0b3IpIHsKKyAgY29uc3QgaW50IGtJID0gNDsKKyAgU3RhdHVzT3I8aW50PiB0aGluZyhrSSk7CisgIEVYUEVDVF9UUlVFKHRoaW5nLm9rKCkpOworICBFWFBFQ1RfRVEoa0ksIHRoaW5nLnZhbHVlKCkpOworfQorCitURVNUKFN0YXR1c09yLCBUZXN0Q29weUN0b3JTdGF0dXNPaykgeworICBjb25zdCBpbnQga0kgPSA0OworICBTdGF0dXNPcjxpbnQ+IG9yaWdpbmFsKGtJKTsKKyAgU3RhdHVzT3I8aW50PiBjb3B5KG9yaWdpbmFsKTsKKyAgRVhQRUNUX0VRKG9yaWdpbmFsLnN0YXR1cygpLCBjb3B5LnN0YXR1cygpKTsKKyAgRVhQRUNUX0VRKG9yaWdpbmFsLnZhbHVlKCksIGNvcHkudmFsdWUoKSk7Cit9CisKK1RFU1QoU3RhdHVzT3IsIFRlc3RDb3B5Q3RvclN0YXR1c05vdE9rKSB7CisgIFN0YXR1c09yPGludD4gb3JpZ2luYWwodXRpbDo6Q2FuY2VsbGVkRXJyb3IoIiIpKTsKKyAgU3RhdHVzT3I8aW50PiBjb3B5KG9yaWdpbmFsKTsKKyAgRVhQRUNUX0VRKG9yaWdpbmFsLnN0YXR1cygpLCBjb3B5LnN0YXR1cygpKTsKK30KKworVEVTVChTdGF0dXNPciwgVGVzdENvcHlDdG9yU3RhdHVzT0tDb252ZXJ0aW5nKSB7CisgIGNvbnN0IGludCBrSSA9IDQ7CisgIFN0YXR1c09yPGludD4gICAgb3JpZ2luYWwoa0kpOworICBTdGF0dXNPcjxkb3VibGU+IGNvcHkob3JpZ2luYWwpOworICBFWFBFQ1RfRVEob3JpZ2luYWwuc3RhdHVzKCksIGNvcHkuc3RhdHVzKCkpOworICBFWFBFQ1RfRVEob3JpZ2luYWwudmFsdWUoKSwgY29weS52YWx1ZSgpKTsKK30KKworVEVTVChTdGF0dXNPciwgVGVzdENvcHlDdG9yU3RhdHVzTm90T2tDb252ZXJ0aW5nKSB7CisgIFN0YXR1c09yPGludD4gb3JpZ2luYWwodXRpbDo6Q2FuY2VsbGVkRXJyb3IoIiIpKTsKKyAgU3RhdHVzT3I8ZG91YmxlPiBjb3B5KG9yaWdpbmFsKTsKKyAgRVhQRUNUX0VRKG9yaWdpbmFsLnN0YXR1cygpLCBjb3B5LnN0YXR1cygpKTsKK30KKworVEVTVChTdGF0dXNPciwgVGVzdEFzc2lnbm1lbnRTdGF0dXNPaykgeworICBjb25zdCBpbnQga0kgPSA0OworICBTdGF0dXNPcjxpbnQ+IHNvdXJjZShrSSk7CisgIFN0YXR1c09yPGludD4gdGFyZ2V0OworICB0YXJnZXQgPSBzb3VyY2U7CisgIEVYUEVDVF9FUShzb3VyY2Uuc3RhdHVzKCksIHRhcmdldC5zdGF0dXMoKSk7CisgIEVYUEVDVF9FUShzb3VyY2UudmFsdWUoKSwgdGFyZ2V0LnZhbHVlKCkpOworfQorCitURVNUKFN0YXR1c09yLCBUZXN0QXNzaWdubWVudFN0YXR1c05vdE9rKSB7CisgIFN0YXR1c09yPGludD4gc291cmNlKHV0aWw6OkNhbmNlbGxlZEVycm9yKCIiKSk7CisgIFN0YXR1c09yPGludD4gdGFyZ2V0OworICB0YXJnZXQgPSBzb3VyY2U7CisgIEVYUEVDVF9FUShzb3VyY2Uuc3RhdHVzKCksIHRhcmdldC5zdGF0dXMoKSk7Cit9CisKK1RFU1QoU3RhdHVzT3IsIFRlc3RBc3NpZ25tZW50U3RhdHVzT0tDb252ZXJ0aW5nKSB7CisgIGNvbnN0IGludCBrSSA9IDQ7CisgIFN0YXR1c09yPGludD4gICAgc291cmNlKGtJKTsKKyAgU3RhdHVzT3I8ZG91YmxlPiB0YXJnZXQ7CisgIHRhcmdldCA9IHNvdXJjZTsKKyAgRVhQRUNUX0VRKHNvdXJjZS5zdGF0dXMoKSwgdGFyZ2V0LnN0YXR1cygpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUShzb3VyY2UudmFsdWUoKSwgdGFyZ2V0LnZhbHVlKCkpOworfQorCitURVNUKFN0YXR1c09yLCBUZXN0QXNzaWdubWVudFN0YXR1c05vdE9rQ29udmVydGluZykgeworICBTdGF0dXNPcjxpbnQ+IHNvdXJjZSh1dGlsOjpDYW5jZWxsZWRFcnJvcigiIikpOworICBTdGF0dXNPcjxkb3VibGU+IHRhcmdldDsKKyAgdGFyZ2V0ID0gc291cmNlOworICBFWFBFQ1RfRVEoc291cmNlLnN0YXR1cygpLCB0YXJnZXQuc3RhdHVzKCkpOworfQorCitURVNUKFN0YXR1c09yLCBUZXN0U3RhdHVzKSB7CisgIFN0YXR1c09yPGludD4gZ29vZCg0KTsKKyAgRVhQRUNUX1RSVUUoZ29vZC5vaygpKTsKKyAgU3RhdHVzT3I8aW50PiBiYWQodXRpbDo6Q2FuY2VsbGVkRXJyb3IoIiIpKTsKKyAgRVhQRUNUX0ZBTFNFKGJhZC5vaygpKTsKKyAgRVhQRUNUX0VRKHV0aWw6OkNhbmNlbGxlZEVycm9yKCIiKSwgYmFkLnN0YXR1cygpKTsKK30KKworVEVTVChTdGF0dXNPciwgVGVzdFZhbHVlKSB7CisgIGNvbnN0IGludCBrSSA9IDQ7CisgIFN0YXR1c09yPGludD4gdGhpbmcoa0kpOworICBFWFBFQ1RfRVEoa0ksIHRoaW5nLnZhbHVlKCkpOworfQorCitURVNUKFN0YXR1c09yLCBUZXN0VmFsdWVDb25zdCkgeworICBjb25zdCBpbnQga0kgPSA0OworICBjb25zdCBTdGF0dXNPcjxpbnQ+IHRoaW5nKGtJKTsKKyAgRVhQRUNUX0VRKGtJLCB0aGluZy52YWx1ZSgpKTsKK30KKworVEVTVChTdGF0dXNPciwgVGVzdFBvaW50ZXJEZWZhdWx0Q3RvcikgeworICBTdGF0dXNPcjxpbnQqPiB0aGluZzsKKyAgRVhQRUNUX0ZBTFNFKHRoaW5nLm9rKCkpOworICBFWFBFQ1RfRVEodXRpbDo6VW5rbm93bkVycm9yKCIiKSwgdGhpbmcuc3RhdHVzKCkpOworfQorCitURVNUKFN0YXR1c09yLCBUZXN0UG9pbnRlclN0YXR1c0N0b3IpIHsKKyAgU3RhdHVzT3I8aW50Kj4gdGhpbmcodXRpbDo6Q2FuY2VsbGVkRXJyb3IoIiIpKTsKKyAgRVhQRUNUX0ZBTFNFKHRoaW5nLm9rKCkpOworICBFWFBFQ1RfRVEodXRpbDo6Q2FuY2VsbGVkRXJyb3IoIiIpLCB0aGluZy5zdGF0dXMoKSk7Cit9CisKK1RFU1QoU3RhdHVzT3IsIFRlc3RQb2ludGVyVmFsdWVDdG9yKSB7CisgIGNvbnN0IGludCBrSSA9IDQ7CisgIFN0YXR1c09yPGNvbnN0IGludCo+IHRoaW5nKCZrSSk7CisgIEVYUEVDVF9UUlVFKHRoaW5nLm9rKCkpOworICBFWFBFQ1RfRVEoJmtJLCB0aGluZy52YWx1ZSgpKTsKK30KKworVEVTVChTdGF0dXNPciwgVGVzdFBvaW50ZXJDb3B5Q3RvclN0YXR1c09rKSB7CisgIGNvbnN0IGludCBrSSA9IDA7CisgIFN0YXR1c09yPGNvbnN0IGludCo+IG9yaWdpbmFsKCZrSSk7CisgIFN0YXR1c09yPGNvbnN0IGludCo+IGNvcHkob3JpZ2luYWwpOworICBFWFBFQ1RfRVEob3JpZ2luYWwuc3RhdHVzKCksIGNvcHkuc3RhdHVzKCkpOworICBFWFBFQ1RfRVEob3JpZ2luYWwudmFsdWUoKSwgY29weS52YWx1ZSgpKTsKK30KKworVEVTVChTdGF0dXNPciwgVGVzdFBvaW50ZXJDb3B5Q3RvclN0YXR1c05vdE9rKSB7CisgIFN0YXR1c09yPGludCo+IG9yaWdpbmFsKHV0aWw6OkNhbmNlbGxlZEVycm9yKCIiKSk7CisgIFN0YXR1c09yPGludCo+IGNvcHkob3JpZ2luYWwpOworICBFWFBFQ1RfRVEob3JpZ2luYWwuc3RhdHVzKCksIGNvcHkuc3RhdHVzKCkpOworfQorCitURVNUKFN0YXR1c09yLCBUZXN0UG9pbnRlckNvcHlDdG9yU3RhdHVzT0tDb252ZXJ0aW5nKSB7CisgIERlcml2ZWQgZGVyaXZlZDsKKyAgU3RhdHVzT3I8RGVyaXZlZCo+IG9yaWdpbmFsKCZkZXJpdmVkKTsKKyAgU3RhdHVzT3I8QmFzZTIqPiAgIGNvcHkob3JpZ2luYWwpOworICBFWFBFQ1RfRVEob3JpZ2luYWwuc3RhdHVzKCksIGNvcHkuc3RhdHVzKCkpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8Y29uc3QgQmFzZTIqPihvcmlnaW5hbC52YWx1ZSgpKSwgY29weS52YWx1ZSgpKTsKK30KKworVEVTVChTdGF0dXNPciwgVGVzdFBvaW50ZXJDb3B5Q3RvclN0YXR1c05vdE9rQ29udmVydGluZykgeworICBTdGF0dXNPcjxEZXJpdmVkKj4gb3JpZ2luYWwodXRpbDo6Q2FuY2VsbGVkRXJyb3IoIiIpKTsKKyAgU3RhdHVzT3I8QmFzZTIqPiAgIGNvcHkob3JpZ2luYWwpOworICBFWFBFQ1RfRVEob3JpZ2luYWwuc3RhdHVzKCksIGNvcHkuc3RhdHVzKCkpOworfQorCitURVNUKFN0YXR1c09yLCBUZXN0UG9pbnRlckFzc2lnbm1lbnRTdGF0dXNPaykgeworICBjb25zdCBpbnQga0kgPSAwOworICBTdGF0dXNPcjxjb25zdCBpbnQqPiBzb3VyY2UoJmtJKTsKKyAgU3RhdHVzT3I8Y29uc3QgaW50Kj4gdGFyZ2V0OworICB0YXJnZXQgPSBzb3VyY2U7CisgIEVYUEVDVF9FUShzb3VyY2Uuc3RhdHVzKCksIHRhcmdldC5zdGF0dXMoKSk7CisgIEVYUEVDVF9FUShzb3VyY2UudmFsdWUoKSwgdGFyZ2V0LnZhbHVlKCkpOworfQorCitURVNUKFN0YXR1c09yLCBUZXN0UG9pbnRlckFzc2lnbm1lbnRTdGF0dXNOb3RPaykgeworICBTdGF0dXNPcjxpbnQqPiBzb3VyY2UodXRpbDo6Q2FuY2VsbGVkRXJyb3IoIiIpKTsKKyAgU3RhdHVzT3I8aW50Kj4gdGFyZ2V0OworICB0YXJnZXQgPSBzb3VyY2U7CisgIEVYUEVDVF9FUShzb3VyY2Uuc3RhdHVzKCksIHRhcmdldC5zdGF0dXMoKSk7Cit9CisKK1RFU1QoU3RhdHVzT3IsIFRlc3RQb2ludGVyQXNzaWdubWVudFN0YXR1c09LQ29udmVydGluZykgeworICBEZXJpdmVkIGRlcml2ZWQ7CisgIFN0YXR1c09yPERlcml2ZWQqPiBzb3VyY2UoJmRlcml2ZWQpOworICBTdGF0dXNPcjxCYXNlMio+ICAgdGFyZ2V0OworICB0YXJnZXQgPSBzb3VyY2U7CisgIEVYUEVDVF9FUShzb3VyY2Uuc3RhdHVzKCksIHRhcmdldC5zdGF0dXMoKSk7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxjb25zdCBCYXNlMio+KHNvdXJjZS52YWx1ZSgpKSwgdGFyZ2V0LnZhbHVlKCkpOworfQorCitURVNUKFN0YXR1c09yLCBUZXN0UG9pbnRlckFzc2lnbm1lbnRTdGF0dXNOb3RPa0NvbnZlcnRpbmcpIHsKKyAgU3RhdHVzT3I8RGVyaXZlZCo+IHNvdXJjZSh1dGlsOjpDYW5jZWxsZWRFcnJvcigiIikpOworICBTdGF0dXNPcjxCYXNlMio+ICAgdGFyZ2V0OworICB0YXJnZXQgPSBzb3VyY2U7CisgIEVYUEVDVF9FUShzb3VyY2Uuc3RhdHVzKCksIHRhcmdldC5zdGF0dXMoKSk7Cit9CisKK1RFU1QoU3RhdHVzT3IsIFRlc3RQb2ludGVyU3RhdHVzKSB7CisgIGNvbnN0IGludCBrSSA9IDA7CisgIFN0YXR1c09yPGNvbnN0IGludCo+IGdvb2QoJmtJKTsKKyAgRVhQRUNUX1RSVUUoZ29vZC5vaygpKTsKKyAgU3RhdHVzT3I8Y29uc3QgaW50Kj4gYmFkKHV0aWw6OkNhbmNlbGxlZEVycm9yKCIiKSk7CisgIEVYUEVDVF9FUSh1dGlsOjpDYW5jZWxsZWRFcnJvcigiIiksIGJhZC5zdGF0dXMoKSk7Cit9CisKK1RFU1QoU3RhdHVzT3IsIFRlc3RQb2ludGVyVmFsdWUpIHsKKyAgY29uc3QgaW50IGtJID0gMDsKKyAgU3RhdHVzT3I8Y29uc3QgaW50Kj4gdGhpbmcoJmtJKTsKKyAgRVhQRUNUX0VRKCZrSSwgdGhpbmcudmFsdWUoKSk7Cit9CisKK1RFU1QoU3RhdHVzT3IsIFRlc3RQb2ludGVyVmFsdWVDb25zdCkgeworICBjb25zdCBpbnQga0kgPSAwOworICBjb25zdCBTdGF0dXNPcjxjb25zdCBpbnQqPiB0aGluZygma0kpOworICBFWFBFQ1RfRVEoJmtJLCB0aGluZy52YWx1ZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyNjBkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaApAQCAtMCwwICsxLDkwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gZnJvbSBnb29nbGUzL3V0aWwvZ3RsL3N0bF91dGlsLmgKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RMX1VUSUxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVExfVVRJTF9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworLy8gTXVzdCBiZSBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+ICAvLyBOT0xJTlQKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBJbnNpZGUgR29vZ2xlLCB0aGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgYSBob3JyaWJsZSwgZGlzZ3VzdGluZyBoYWNrIGluIHdoaWNoCisvLyB3ZSByZWFjaCBpbnRvIHRoZSBzdHJpbmcncyBwcml2YXRlIGltcGxlbWVudGF0aW9uIGFuZCByZXNpemUgaXQgd2l0aG91dAorLy8gaW5pdGlhbGl6aW5nIHRoZSBuZXcgYnl0ZXMuICBJbiBzb21lIGNhc2VzIGRvaW5nIHRoaXMgY2FuIHNpZ25pZmljYW50bHkKKy8vIGltcHJvdmUgcGVyZm9ybWFuY2UuICBIb3dldmVyLCBzaW5jZSBpdCdzIHRvdGFsbHkgbm9uLXBvcnRhYmxlIGl0IGhhcyBubworLy8gcGxhY2UgaW4gb3BlbiBzb3VyY2UgY29kZS4gIEZlZWwgZnJlZSB0byBmaWxsIHRoaXMgZnVuY3Rpb24gaW4gd2l0aCB5b3VyCisvLyBvd24gZGlzZ3VzdGluZyBoYWNrIGlmIHlvdSB3YW50IHRoZSBwZXJmIGJvb3N0LgoraW5saW5lIHZvaWQgU1RMU3RyaW5nUmVzaXplVW5pbml0aWFsaXplZChzdGQ6OnN0cmluZyogcywgc2l6ZV90IG5ld19zaXplKSB7CisgIHMtPnJlc2l6ZShuZXdfc2l6ZSk7Cit9CisKKy8vIEFzIGFib3ZlLCBidXQgd2UgbWFrZSBzdXJlIHRvIGZvbGxvdyBhbW9ydGl6ZWQgZ3Jvd3RoIGluIHdoaWNoIHdlIGFsd2F5cworLy8gaW5jcmVhc2UgdGhlIGNhcGFjaXR5IGJ5IGF0IGxlYXN0IGEgY29uc3RhbnQgZmFjdG9yID4xLgoraW5saW5lIHZvaWQgU1RMU3RyaW5nUmVzaXplVW5pbml0aWFsaXplZEFtb3J0aXplZChzdGQ6OnN0cmluZyogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5ld19zaXplKSB7CisgIGNvbnN0IHNpemVfdCBjYXAgPSBzLT5jYXBhY2l0eSgpOworICBpZiAobmV3X3NpemUgPiBjYXApIHsKKyAgICAvLyBNYWtlIHN1cmUgdG8gYWx3YXlzIGdyb3cgYnkgYXQgbGVhc3QgYSBmYWN0b3Igb2YgMnguCisgICAgcy0+cmVzZXJ2ZShzdGQ6Om1heDxzaXplX3Q+KG5ld19zaXplLCAyICogY2FwKSk7CisgIH0KKyAgU1RMU3RyaW5nUmVzaXplVW5pbml0aWFsaXplZChzLCBuZXdfc2l6ZSk7Cit9CisKKy8vIFJldHVybiBhIG11dGFibGUgY2hhciogcG9pbnRpbmcgdG8gYSBzdHJpbmcncyBpbnRlcm5hbCBidWZmZXIsCisvLyB3aGljaCBtYXkgbm90IGJlIG51bGwtdGVybWluYXRlZC4gV3JpdGluZyB0aHJvdWdoIHRoaXMgcG9pbnRlciB3aWxsCisvLyBtb2RpZnkgdGhlIHN0cmluZy4KKy8vCisvLyBzdHJpbmdfYXNfYXJyYXkoJnN0cilbaV0gaXMgdmFsaWQgZm9yIDAgPD0gaSA8IHN0ci5zaXplKCkgdW50aWwgdGhlCisvLyBuZXh0IGNhbGwgdG8gYSBzdHJpbmcgbWV0aG9kIHRoYXQgaW52YWxpZGF0ZXMgaXRlcmF0b3JzLgorLy8KKy8vIEFzIG9mIDIwMDYtMDQsIHRoZXJlIGlzIG5vIHN0YW5kYXJkLWJsZXNzZWQgd2F5IG9mIGdldHRpbmcgYQorLy8gbXV0YWJsZSByZWZlcmVuY2UgdG8gYSBzdHJpbmcncyBpbnRlcm5hbCBidWZmZXIuIEhvd2V2ZXIsIGlzc3VlIDUzMAorLy8gKGh0dHA6Ly93d3cub3Blbi1zdGQub3JnL0pUQzEvU0MyMi9XRzIxL2RvY3MvbHdnLWFjdGl2ZS5odG1sIzUzMCkKKy8vIHByb3Bvc2VzIHRoaXMgYXMgdGhlIG1ldGhvZC4gQWNjb3JkaW5nIHRvIE1hdHQgQXVzdGVybiwgdGhpcyBzaG91bGQKKy8vIGFscmVhZHkgd29yayBvbiBhbGwgY3VycmVudCBpbXBsZW1lbnRhdGlvbnMuCitpbmxpbmUgY2hhciogc3RyaW5nX2FzX2FycmF5KHN0ZDo6c3RyaW5nKiBzdHIpIHsKKyAgLy8gRE8gTk9UIFVTRSBjb25zdF9jYXN0PGNoYXIqPihzdHItPmRhdGEoKSkhIFNlZSB0aGUgdW5pdHRlc3QgZm9yIHdoeS4KKyAgcmV0dXJuIHN0ci0+ZW1wdHkoKSA/IG51bGxwdHIgOiAmKnN0ci0+YmVnaW4oKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+ICAvLyBOT0xJTlQKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RMX1VUSUxfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTg4MDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5jYwpAQCAtMCwwICsxLDI1NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8b3N0cmVhbT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBzdHJpbmdwaWVjZV9pbnRlcm5hbCB7CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG8sIFN0cmluZ1BpZWNlIHBpZWNlKSB7CisgIG8ud3JpdGUocGllY2UuZGF0YSgpLCBwaWVjZS5zaXplKCkpOworICByZXR1cm4gbzsKK30KKwordm9pZCBTdHJpbmdQaWVjZTo6TG9nRmF0YWxTaXplVG9vQmlnKHNpemVfdCBzaXplLCBjb25zdCBjaGFyKiBkZXRhaWxzKSB7CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJzaXplIHRvbyBiaWc6ICIgPDwgc2l6ZSA8PCAiIGRldGFpbHM6ICIgPDwgZGV0YWlsczsKK30KKwordm9pZCBTdHJpbmdQaWVjZTo6Q29weVRvU3RyaW5nKHN0ZDo6c3RyaW5nKiB0YXJnZXQpIGNvbnN0IHsKKyAgdGFyZ2V0LT5hc3NpZ24ocHRyXywgbGVuZ3RoXyk7Cit9CisKK3ZvaWQgU3RyaW5nUGllY2U6OkFwcGVuZFRvU3RyaW5nKHN0ZDo6c3RyaW5nKiB0YXJnZXQpIGNvbnN0IHsKKyAgdGFyZ2V0LT5hcHBlbmQocHRyXywgbGVuZ3RoXyk7Cit9CisKK2Jvb2wgU3RyaW5nUGllY2U6OkNvbnN1bWUoU3RyaW5nUGllY2UgeCkgeworICBpZiAoc3RhcnRzX3dpdGgoeCkpIHsKKyAgICBwdHJfICs9IHgubGVuZ3RoXzsKKyAgICBsZW5ndGhfIC09IHgubGVuZ3RoXzsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgU3RyaW5nUGllY2U6OkNvbnN1bWVGcm9tRW5kKFN0cmluZ1BpZWNlIHgpIHsKKyAgaWYgKGVuZHNfd2l0aCh4KSkgeworICAgIGxlbmd0aF8gLT0geC5sZW5ndGhfOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworU3RyaW5nUGllY2U6OnNpemVfdHlwZSBTdHJpbmdQaWVjZTo6Y29weShjaGFyKiBidWYsIHNpemVfdHlwZSBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zKSBjb25zdCB7CisgIHNpemVfdHlwZSByZXQgPSBzdGQ6Om1pbihsZW5ndGhfIC0gcG9zLCBuKTsKKyAgbWVtY3B5KGJ1ZiwgcHRyXyArIHBvcywgcmV0KTsKKyAgcmV0dXJuIHJldDsKK30KKworYm9vbCBTdHJpbmdQaWVjZTo6Y29udGFpbnMoU3RyaW5nUGllY2UgcykgY29uc3QgeworICByZXR1cm4gZmluZChzLCAwKSAhPSBucG9zOworfQorCitTdHJpbmdQaWVjZTo6c2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kKFN0cmluZ1BpZWNlIHMsIHNpemVfdHlwZSBwb3MpIGNvbnN0IHsKKyAgaWYgKGxlbmd0aF8gPD0gMCB8fCBwb3MgPiBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGxlbmd0aF8pKSB7CisgICAgaWYgKGxlbmd0aF8gPT0gMCAmJiBwb3MgPT0gMCAmJiBzLmxlbmd0aF8gPT0gMCkgcmV0dXJuIDA7CisgICAgcmV0dXJuIG5wb3M7CisgIH0KKyAgY29uc3QgY2hhciAqcmVzdWx0ID0gc3RkOjpzZWFyY2gocHRyXyArIHBvcywgcHRyXyArIGxlbmd0aF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHRyXywgcy5wdHJfICsgcy5sZW5ndGhfKTsKKyAgcmV0dXJuIHJlc3VsdCA9PSBwdHJfICsgbGVuZ3RoXyA/IG5wb3MgOiByZXN1bHQgLSBwdHJfOworfQorCitTdHJpbmdQaWVjZTo6c2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kKGNoYXIgYywgc2l6ZV90eXBlIHBvcykgY29uc3QgeworICBpZiAobGVuZ3RoXyA8PSAwIHx8IHBvcyA+PSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGxlbmd0aF8pKSB7CisgICAgcmV0dXJuIG5wb3M7CisgIH0KKyAgY29uc3QgY2hhciogcmVzdWx0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KAorICAgICAgbWVtY2hyKHB0cl8gKyBwb3MsIGMsIGxlbmd0aF8gLSBwb3MpKTsKKyAgcmV0dXJuIHJlc3VsdCAhPSBudWxscHRyID8gcmVzdWx0IC0gcHRyXyA6IG5wb3M7Cit9CisKK1N0cmluZ1BpZWNlOjpzaXplX3R5cGUgU3RyaW5nUGllY2U6OnJmaW5kKFN0cmluZ1BpZWNlIHMsIHNpemVfdHlwZSBwb3MpIGNvbnN0IHsKKyAgaWYgKGxlbmd0aF8gPCBzLmxlbmd0aF8pIHJldHVybiBucG9zOworICBjb25zdCBzaXplX3QgdWxlbiA9IGxlbmd0aF87CisgIGlmIChzLmxlbmd0aF8gPT0gMCkgcmV0dXJuIHN0ZDo6bWluKHVsZW4sIHBvcyk7CisKKyAgY29uc3QgY2hhciogbGFzdCA9IHB0cl8gKyBzdGQ6Om1pbih1bGVuIC0gcy5sZW5ndGhfLCBwb3MpICsgcy5sZW5ndGhfOworICBjb25zdCBjaGFyKiByZXN1bHQgPSBzdGQ6OmZpbmRfZW5kKHB0cl8sIGxhc3QsIHMucHRyXywgcy5wdHJfICsgcy5sZW5ndGhfKTsKKyAgcmV0dXJuIHJlc3VsdCAhPSBsYXN0ID8gcmVzdWx0IC0gcHRyXyA6IG5wb3M7Cit9CisKKy8vIFNlYXJjaCByYW5nZSBpcyBbMC4ucG9zXSBpbmNsdXNpdmUuICBJZiBwb3MgPT0gbnBvcywgc2VhcmNoIGV2ZXJ5dGhpbmcuCitTdHJpbmdQaWVjZTo6c2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpyZmluZChjaGFyIGMsIHNpemVfdHlwZSBwb3MpIGNvbnN0IHsKKyAgLy8gTm90ZTogbWVtcmNocigpIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cy4KKyAgaWYgKGVtcHR5KCkpIHJldHVybiBucG9zOworICBmb3IgKHNpemVfdHlwZSBpID0gc3RkOjptaW4ocG9zLCBsZW5ndGhfIC0gMSk7OyAtLWkpIHsKKyAgICBpZiAocHRyX1tpXSA9PSBjKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgaWYgKGkgPT0gMCkgYnJlYWs7CisgIH0KKyAgcmV0dXJuIG5wb3M7Cit9CisKKy8vIEZvciBlYWNoIGNoYXJhY3RlciBpbiBjaGFyYWN0ZXJzX3dhbnRlZCwgc2V0cyB0aGUgaW5kZXggY29ycmVzcG9uZGluZworLy8gdG8gdGhlIEFTQ0lJIGNvZGUgb2YgdGhhdCBjaGFyYWN0ZXIgdG8gMSBpbiB0YWJsZS4gIFRoaXMgaXMgdXNlZCBieQorLy8gdGhlIGZpbmRfLipfb2YgbWV0aG9kcyBiZWxvdyB0byB0ZWxsIHdoZXRoZXIgb3Igbm90IGEgY2hhcmFjdGVyIGlzIGluCisvLyB0aGUgbG9va3VwIHRhYmxlIGluIGNvbnN0YW50IHRpbWUuCisvLyBUaGUgYXJndW1lbnQgYHRhYmxlJyBtdXN0IGJlIGFuIGFycmF5IHRoYXQgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsCisvLyB0aGUgcG9zc2libGUgdmFsdWVzIG9mIGFuIHVuc2lnbmVkIGNoYXIuICBUaHVzIGl0IHNob3VsZCBiZSBiZSBkZWNsYXJlZAorLy8gYXMgZm9sbG93czoKKy8vICAgYm9vbCB0YWJsZVtVQ0hBUl9NQVggKyAxXQorc3RhdGljIGlubGluZSB2b2lkIEJ1aWxkTG9va3VwVGFibGUoU3RyaW5nUGllY2UgY2hhcmFjdGVyc193YW50ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiB0YWJsZSkgeworICBjb25zdCBTdHJpbmdQaWVjZTo6c2l6ZV90eXBlIGxlbmd0aCA9IGNoYXJhY3RlcnNfd2FudGVkLmxlbmd0aCgpOworICBjb25zdCBjaGFyKiBjb25zdCBkYXRhID0gY2hhcmFjdGVyc193YW50ZWQuZGF0YSgpOworICBmb3IgKFN0cmluZ1BpZWNlOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgIHRhYmxlW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGRhdGFbaV0pXSA9IHRydWU7CisgIH0KK30KKworU3RyaW5nUGllY2U6OnNpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZF9maXJzdF9vZihTdHJpbmdQaWVjZSBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zKSBjb25zdCB7CisgIGlmIChlbXB0eSgpIHx8IHMuZW1wdHkoKSkgeworICAgIHJldHVybiBucG9zOworICB9CisgIC8vIEF2b2lkIHRoZSBjb3N0IG9mIEJ1aWxkTG9va3VwVGFibGUoKSBmb3IgYSBzaW5nbGUtY2hhcmFjdGVyIHNlYXJjaC4KKyAgaWYgKHMubGVuZ3RoXyA9PSAxKSByZXR1cm4gZmluZF9maXJzdF9vZihzLnB0cl9bMF0sIHBvcyk7CisKKyAgYm9vbCBsb29rdXBbVUNIQVJfTUFYICsgMV0gPSB7IGZhbHNlIH07CisgIEJ1aWxkTG9va3VwVGFibGUocywgbG9va3VwKTsKKyAgZm9yIChzaXplX3R5cGUgaSA9IHBvczsgaSA8IGxlbmd0aF87ICsraSkgeworICAgIGlmIChsb29rdXBbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocHRyX1tpXSldKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5wb3M7Cit9CisKK1N0cmluZ1BpZWNlOjpzaXplX3R5cGUgU3RyaW5nUGllY2U6OmZpbmRfZmlyc3Rfbm90X29mKFN0cmluZ1BpZWNlIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zKSBjb25zdCB7CisgIGlmIChlbXB0eSgpKSByZXR1cm4gbnBvczsKKyAgaWYgKHMuZW1wdHkoKSkgcmV0dXJuIDA7CisgIC8vIEF2b2lkIHRoZSBjb3N0IG9mIEJ1aWxkTG9va3VwVGFibGUoKSBmb3IgYSBzaW5nbGUtY2hhcmFjdGVyIHNlYXJjaC4KKyAgaWYgKHMubGVuZ3RoXyA9PSAxKSByZXR1cm4gZmluZF9maXJzdF9ub3Rfb2Yocy5wdHJfWzBdLCBwb3MpOworCisgIGJvb2wgbG9va3VwW1VDSEFSX01BWCArIDFdID0geyBmYWxzZSB9OworICBCdWlsZExvb2t1cFRhYmxlKHMsIGxvb2t1cCk7CisgIGZvciAoc2l6ZV90eXBlIGkgPSBwb3M7IGkgPCBsZW5ndGhfOyArK2kpIHsKKyAgICBpZiAoIWxvb2t1cFtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihwdHJfW2ldKV0pIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorICByZXR1cm4gbnBvczsKK30KKworU3RyaW5nUGllY2U6OnNpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZF9maXJzdF9ub3Rfb2YoY2hhciBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIHBvcykgY29uc3QgeworICBpZiAoZW1wdHkoKSkgcmV0dXJuIG5wb3M7CisKKyAgZm9yICg7IHBvcyA8IHN0YXRpY19jYXN0PHNpemVfdHlwZT4obGVuZ3RoXyk7ICsrcG9zKSB7CisgICAgaWYgKHB0cl9bcG9zXSAhPSBjKSB7CisgICAgICByZXR1cm4gcG9zOworICAgIH0KKyAgfQorICByZXR1cm4gbnBvczsKK30KKworU3RyaW5nUGllY2U6OnNpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZF9sYXN0X29mKFN0cmluZ1BpZWNlIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIHBvcykgY29uc3QgeworICBpZiAoZW1wdHkoKSB8fCBzLmVtcHR5KCkpIHJldHVybiBucG9zOworICAvLyBBdm9pZCB0aGUgY29zdCBvZiBCdWlsZExvb2t1cFRhYmxlKCkgZm9yIGEgc2luZ2xlLWNoYXJhY3RlciBzZWFyY2guCisgIGlmIChzLmxlbmd0aF8gPT0gMSkgcmV0dXJuIGZpbmRfbGFzdF9vZihzLnB0cl9bMF0sIHBvcyk7CisKKyAgYm9vbCBsb29rdXBbVUNIQVJfTUFYICsgMV0gPSB7IGZhbHNlIH07CisgIEJ1aWxkTG9va3VwVGFibGUocywgbG9va3VwKTsKKyAgZm9yIChzaXplX3R5cGUgaSA9IHN0ZDo6bWluKHBvcywgbGVuZ3RoXyAtIDEpOzsgLS1pKSB7CisgICAgaWYgKGxvb2t1cFtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihwdHJfW2ldKV0pIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgICBpZiAoaSA9PSAwKSBicmVhazsKKyAgfQorICByZXR1cm4gbnBvczsKK30KKworU3RyaW5nUGllY2U6OnNpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZF9sYXN0X25vdF9vZihTdHJpbmdQaWVjZSBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zKSBjb25zdCB7CisgIGlmIChlbXB0eSgpKSByZXR1cm4gbnBvczsKKworICBzaXplX3R5cGUgaSA9IHN0ZDo6bWluKHBvcywgbGVuZ3RoKCkgLSAxKTsKKyAgaWYgKHMuZW1wdHkoKSkgcmV0dXJuIGk7CisKKyAgLy8gQXZvaWQgdGhlIGNvc3Qgb2YgQnVpbGRMb29rdXBUYWJsZSgpIGZvciBhIHNpbmdsZS1jaGFyYWN0ZXIgc2VhcmNoLgorICBpZiAocy5sZW5ndGhfID09IDEpIHJldHVybiBmaW5kX2xhc3Rfbm90X29mKHMucHRyX1swXSwgcG9zKTsKKworICBib29sIGxvb2t1cFtVQ0hBUl9NQVggKyAxXSA9IHsgZmFsc2UgfTsKKyAgQnVpbGRMb29rdXBUYWJsZShzLCBsb29rdXApOworICBmb3IgKDs7IC0taSkgeworICAgIGlmICghbG9va3VwW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHB0cl9baV0pXSkgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIGlmIChpID09IDApIGJyZWFrOworICB9CisgIHJldHVybiBucG9zOworfQorCitTdHJpbmdQaWVjZTo6c2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kX2xhc3Rfbm90X29mKGNoYXIgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIHBvcykgY29uc3QgeworICBpZiAoZW1wdHkoKSkgcmV0dXJuIG5wb3M7CisgIHNpemVfdHlwZSBpID0gc3RkOjptaW4ocG9zLCBsZW5ndGhfIC0gMSk7CisgIGZvciAoOzsgLS1pKSB7CisgICAgaWYgKHB0cl9baV0gIT0gYykgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIGlmIChpID09IDApIGJyZWFrOworICB9CisgIHJldHVybiBucG9zOworfQorCitTdHJpbmdQaWVjZSBTdHJpbmdQaWVjZTo6c3Vic3RyKHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuKSBjb25zdCB7CisgIGlmIChwb3MgPiBsZW5ndGgoKSkgcG9zID0gbGVuZ3RoKCk7CisgIGlmIChuID4gbGVuZ3RoXyAtIHBvcykgbiA9IGxlbmd0aCgpIC0gcG9zOworICByZXR1cm4gU3RyaW5nUGllY2UocHRyXyArIHBvcywgbik7Cit9CisKK2NvbnN0IFN0cmluZ1BpZWNlOjpzaXplX3R5cGUgU3RyaW5nUGllY2U6Om5wb3MgPSBzaXplX3R5cGUoLTEpOworCit9ICAvLyBuYW1lc3BhY2Ugc3RyaW5ncGllY2VfaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2M2UyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmgKQEAgLTAsMCArMSw0MDIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBIFN0cmluZ1BpZWNlIHBvaW50cyB0byBwYXJ0IG9yIGFsbCBvZiBhIHN0cmluZywgQ29yZCwgZG91YmxlLXF1b3RlZCBzdHJpbmcKKy8vIGxpdGVyYWwsIG9yIG90aGVyIHN0cmluZy1saWtlIG9iamVjdC4gIEEgU3RyaW5nUGllY2UgZG9lcyAqbm90KiBvd24gdGhlCisvLyBzdHJpbmcgdG8gd2hpY2ggaXQgcG9pbnRzLiAgQSBTdHJpbmdQaWVjZSBpcyBub3QgbnVsbC10ZXJtaW5hdGVkLgorLy8KKy8vIFlvdSBjYW4gdXNlIFN0cmluZ1BpZWNlIGFzIGEgZnVuY3Rpb24gb3IgbWV0aG9kIHBhcmFtZXRlci4gIEEgU3RyaW5nUGllY2UKKy8vIHBhcmFtZXRlciBjYW4gcmVjZWl2ZSBhIGRvdWJsZS1xdW90ZWQgc3RyaW5nIGxpdGVyYWwgYXJndW1lbnQsIGEgImNvbnN0CisvLyBjaGFyKiIgYXJndW1lbnQsIGEgc3RyaW5nIGFyZ3VtZW50LCBvciBhIFN0cmluZ1BpZWNlIGFyZ3VtZW50IHdpdGggbm8gZGF0YQorLy8gY29weWluZy4gIFN5c3RlbWF0aWMgdXNlIG9mIFN0cmluZ1BpZWNlIGZvciBhcmd1bWVudHMgcmVkdWNlcyBkYXRhCisvLyBjb3BpZXMgYW5kIHN0cmxlbigpIGNhbGxzLgorLy8KKy8vIFByZWZlciBwYXNzaW5nIFN0cmluZ1BpZWNlcyBieSB2YWx1ZToKKy8vICAgdm9pZCBNeUZ1bmN0aW9uKFN0cmluZ1BpZWNlIGFyZyk7CisvLyBJZiBjaXJjdW1zdGFuY2VzIHJlcXVpcmUsIHlvdSBtYXkgYWxzbyBwYXNzIGJ5IGNvbnN0IHJlZmVyZW5jZToKKy8vICAgdm9pZCBNeUZ1bmN0aW9uKGNvbnN0IFN0cmluZ1BpZWNlJiBhcmcpOyAgLy8gbm90IHByZWZlcnJlZAorLy8gQm90aCBvZiB0aGVzZSBoYXZlIHRoZSBzYW1lIGxpZmV0aW1lIHNlbWFudGljcy4gIFBhc3NpbmcgYnkgdmFsdWUKKy8vIGdlbmVyYXRlcyBzbGlnaHRseSBzbWFsbGVyIGNvZGUuICBGb3IgbW9yZSBkaXNjdXNzaW9uLCBzZWUgdGhlIHRocmVhZAorLy8gZ28vc3RyaW5ncGllY2VieXZhbHVlIG9uIGMtdXNlcnMuCisvLworLy8gU3RyaW5nUGllY2UgaXMgYWxzbyBzdWl0YWJsZSBmb3IgbG9jYWwgdmFyaWFibGVzIGlmIHlvdSBrbm93IHRoYXQKKy8vIHRoZSBsaWZldGltZSBvZiB0aGUgdW5kZXJseWluZyBvYmplY3QgaXMgbG9uZ2VyIHRoYW4gdGhlIGxpZmV0aW1lCisvLyBvZiB5b3VyIFN0cmluZ1BpZWNlIHZhcmlhYmxlLgorLy8KKy8vIEJld2FyZSBvZiBiaW5kaW5nIGEgU3RyaW5nUGllY2UgdG8gYSB0ZW1wb3Jhcnk6CisvLyAgIFN0cmluZ1BpZWNlIHNwID0gb2JqLk1ldGhvZFJldHVybmluZ1N0cmluZygpOyAgLy8gQkFEOiBsaWZldGltZSBwcm9ibGVtCisvLworLy8gVGhpcyBjb2RlIGlzIG9rYXk6CisvLyAgIHN0cmluZyBzdHIgPSBvYmouTWV0aG9kUmV0dXJuaW5nU3RyaW5nKCk7ICAvLyBzdHIgb3ducyBpdHMgY29udGVudHMKKy8vICAgU3RyaW5nUGllY2Ugc3Aoc3RyKTsgIC8vIEdPT0QsIGJlY2F1c2Ugc3RyIG91dGxpdmVzIHNwCisvLworLy8gU3RyaW5nUGllY2UgaXMgc29tZXRpbWVzIGEgcG9vciBjaG9pY2UgZm9yIGEgcmV0dXJuIHZhbHVlIGFuZCB1c3VhbGx5IGEgcG9vcgorLy8gY2hvaWNlIGZvciBhIGRhdGEgbWVtYmVyLiAgSWYgeW91IGRvIHVzZSBhIFN0cmluZ1BpZWNlIHRoaXMgd2F5LCBpdCBpcyB5b3VyCisvLyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhlIFN0cmluZ1BpZWNlCisvLyBvdXRsaXZlcyB0aGUgU3RyaW5nUGllY2UuCisvLworLy8gQSBTdHJpbmdQaWVjZSBtYXkgcmVwcmVzZW50IGp1c3QgcGFydCBvZiBhIHN0cmluZzsgdGh1cyB0aGUgbmFtZSAiUGllY2UiLgorLy8gRm9yIGV4YW1wbGUsIHdoZW4gc3BsaXR0aW5nIGEgc3RyaW5nLCB2ZWN0b3I8U3RyaW5nUGllY2U+IGlzIGEgbmF0dXJhbCBkYXRhCisvLyB0eXBlIGZvciB0aGUgb3V0cHV0LiAgRm9yIGFub3RoZXIgZXhhbXBsZSwgYSBDb3JkIGlzIGEgbm9uLWNvbnRpZ3VvdXMsCisvLyBwb3RlbnRpYWxseSB2ZXJ5IGxvbmcgc3RyaW5nLWxpa2Ugb2JqZWN0LiAgVGhlIENvcmQgY2xhc3MgaGFzIGFuIGludGVyZmFjZQorLy8gdGhhdCBpdGVyYXRpdmVseSBwcm92aWRlcyBTdHJpbmdQaWVjZSBvYmplY3RzIHRoYXQgcG9pbnQgdG8gdGhlCisvLyBzdWNjZXNzaXZlIHBpZWNlcyBvZiBhIENvcmQgb2JqZWN0LgorLy8KKy8vIEEgU3RyaW5nUGllY2UgaXMgbm90IG51bGwtdGVybWluYXRlZC4gIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgc2NhbnMgYQorLy8gU3RyaW5nUGllY2UsIHlvdSBtdXN0IGNoZWNrIGl0cyBsZW5ndGggYmVmb3JlIHJlYWRpbmcgYW55IGNoYXJhY3RlcnMuCisvLyBDb21tb24gaWRpb21zIHRoYXQgd29yayBvbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5ncyBkbyBub3Qgd29yayBvbgorLy8gU3RyaW5nUGllY2Ugb2JqZWN0cy4KKy8vCisvLyBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIGNyZWF0ZSBhIG51bGwgU3RyaW5nUGllY2U6CisvLyAgIFN0cmluZ1BpZWNlKCkKKy8vICAgU3RyaW5nUGllY2UobnVsbHB0cikKKy8vICAgU3RyaW5nUGllY2UobnVsbHB0ciwgMCkKKy8vIEZvciBhbGwgb2YgdGhlIGFib3ZlLCBzcC5kYXRhKCkgPT0gbnVsbHB0ciwgc3AubGVuZ3RoKCkgPT0gMCwKKy8vIGFuZCBzcC5lbXB0eSgpID09IHRydWUuICBBbHNvLCBpZiB5b3UgY3JlYXRlIGEgU3RyaW5nUGllY2Ugd2l0aAorLy8gYSBub24tbnVsbCBwb2ludGVyIHRoZW4gc3AuZGF0YSgpICE9IG51bGxwdHIuICBPbmNlIGNyZWF0ZWQsCisvLyBzcC5kYXRhKCkgd2lsbCBzdGF5IGVpdGhlciBudWxscHRyIG9yIG5vdC1udWxscHRyLCBleGNlcHQgaWYgeW91IGNhbGwKKy8vIHNwLmNsZWFyKCkgb3Igc3Auc2V0KCkuCisvLworLy8gVGh1cywgeW91IGNhbiB1c2UgU3RyaW5nUGllY2UobnVsbHB0cikgdG8gc2lnbmFsIGFuIG91dC1vZi1iYW5kIHZhbHVlCisvLyB0aGF0IGlzIGRpZmZlcmVudCBmcm9tIG90aGVyIFN0cmluZ1BpZWNlIHZhbHVlcy4gIFRoaXMgaXMgc2ltaWxhcgorLy8gdG8gdGhlIHdheSB0aGF0IGNvbnN0IGNoYXIqIHAxID0gbnVsbHB0cjsgaXMgZGlmZmVyZW50IGZyb20KKy8vIGNvbnN0IGNoYXIqIHAyID0gIiI7LgorLy8KKy8vIFRoZXJlIGFyZSBtYW55IHdheXMgdG8gY3JlYXRlIGFuIGVtcHR5IFN0cmluZ1BpZWNlOgorLy8gICBTdHJpbmdQaWVjZSgpCisvLyAgIFN0cmluZ1BpZWNlKG51bGxwdHIpCisvLyAgIFN0cmluZ1BpZWNlKG51bGxwdHIsIDApCisvLyAgIFN0cmluZ1BpZWNlKCIiKQorLy8gICBTdHJpbmdQaWVjZSgiIiwgMCkKKy8vICAgU3RyaW5nUGllY2UoImFiY2RlZiIsIDApCisvLyAgIFN0cmluZ1BpZWNlKCJhYmNkZWYiKzYsIDApCisvLyBGb3IgYWxsIG9mIHRoZSBhYm92ZSwgc3AubGVuZ3RoKCkgd2lsbCBiZSAwIGFuZCBzcC5lbXB0eSgpIHdpbGwgYmUgdHJ1ZS4KKy8vIEZvciBzb21lIGVtcHR5IFN0cmluZ1BpZWNlIHZhbHVlcywgc3AuZGF0YSgpIHdpbGwgYmUgbnVsbHB0ci4KKy8vIEZvciBzb21lIGVtcHR5IFN0cmluZ1BpZWNlIHZhbHVlcywgc3AuZGF0YSgpIHdpbGwgbm90IGJlIG51bGxwdHIuCisvLworLy8gQmUgY2FyZWZ1bCBub3QgdG8gY29uZnVzZTogbnVsbCBTdHJpbmdQaWVjZSBhbmQgZW1wdHkgU3RyaW5nUGllY2UuCisvLyBUaGUgc2V0IG9mIGVtcHR5IFN0cmluZ1BpZWNlcyBwcm9wZXJseSBpbmNsdWRlcyB0aGUgc2V0IG9mIG51bGwgU3RyaW5nUGllY2VzLgorLy8gVGhhdCBpcywgZXZlcnkgbnVsbCBTdHJpbmdQaWVjZSBpcyBhbiBlbXB0eSBTdHJpbmdQaWVjZSwKKy8vIGJ1dCBzb21lIG5vbi1udWxsIFN0cmluZ1BpZWNlcyBhcmUgZW1wdHkgU3RyaW5ncGllY2VzIHRvby4KKy8vCisvLyBBbGwgZW1wdHkgU3RyaW5nUGllY2UgdmFsdWVzIGNvbXBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlci4KKy8vIEV2ZW4gYSBudWxsIFN0cmluZ1BpZWNlcyBjb21wYXJlcyBlcXVhbCB0byBhIG5vbi1udWxsIGVtcHR5IFN0cmluZ1BpZWNlOgorLy8gIFN0cmluZ1BpZWNlKCkgPT0gU3RyaW5nUGllY2UoIiIsIDApCisvLyAgU3RyaW5nUGllY2UobnVsbHB0cikgPT0gU3RyaW5nUGllY2UoImFiYyIsIDApCisvLyAgU3RyaW5nUGllY2UobnVsbHB0ciwgMCkgPT0gU3RyaW5nUGllY2UoImFiY2RlZiIrNiwgMCkKKy8vCisvLyBMb29rIGNhcmVmdWxseSBhdCB0aGlzIGV4YW1wbGU6CisvLyAgIFN0cmluZ1BpZWNlKCIiKSA9PSBudWxscHRyCisvLyBUcnVlIG9yIGZhbHNlPyAgVFJVRSwgYmVjYXVzZSBTdHJpbmdQaWVjZTo6b3BlcmF0b3I9PSBjb252ZXJ0cworLy8gdGhlIHJpZ2h0LWhhbmQgc2lkZSBmcm9tIG51bGxwdHIgdG8gU3RyaW5nUGllY2UobnVsbHB0ciksCisvLyBhbmQgdGhlbiBjb21wYXJlcyB0d28gemVyby1sZW5ndGggc3BhbnMgb2YgY2hhcmFjdGVycy4KKy8vIEhvd2V2ZXIsIHdlIGFyZSB3b3JraW5nIHRvIG1ha2UgdGhpcyBleGFtcGxlIHByb2R1Y2UgYSBjb21waWxlIGVycm9yLgorLy8KKy8vIFN1cHBvc2UgeW91IHdhbnQgdG8gd3JpdGU6CisvLyAgIGJvb2wgVGVzdFdoYXQ/KFN0cmluZ1BpZWNlIHNwKSB7IHJldHVybiBzcCA9PSBudWxscHRyOyB9ICAvLyBCQUQKKy8vIERvIG5vdCBkbyB0aGF0LiAgV3JpdGUgb25lIG9mIHRoZXNlIGluc3RlYWQ6CisvLyAgIGJvb2wgVGVzdE51bGwoU3RyaW5nUGllY2Ugc3ApIHsgcmV0dXJuIHNwLmRhdGEoKSA9PSBudWxscHRyOyB9CisvLyAgIGJvb2wgVGVzdEVtcHR5KFN0cmluZ1BpZWNlIHNwKSB7IHJldHVybiBzcC5lbXB0eSgpOyB9CisvLyBUaGUgaW50ZW50IG9mIFRlc3RXaGF0PyBpcyB1bmNsZWFyLiAgRGlkIHlvdSBtZWFuIFRlc3ROdWxsIG9yIFRlc3RFbXB0eT8KKy8vIFJpZ2h0IG5vdywgVGVzdFdoYXQ/IGJlaGF2ZXMgbGlrZXMgVGVzdEVtcHR5LgorLy8gV2UgYXJlIHdvcmtpbmcgdG8gbWFrZSBUZXN0V2hhdD8gcHJvZHVjZSBhIGNvbXBpbGUgZXJyb3IuCisvLyBUZXN0TnVsbCBpcyBnb29kIHRvIHRlc3QgZm9yIGFuIG91dC1vZi1iYW5kIHNpZ25hbC4KKy8vIFRlc3RFbXB0eSBpcyBnb29kIHRvIHRlc3QgZm9yIGFuIGVtcHR5IFN0cmluZ1BpZWNlLgorLy8KKy8vIENhdmVhdHMgKGFnYWluKToKKy8vICgxKSBUaGUgbGlmZXRpbWUgb2YgdGhlIHBvaW50ZWQtdG8gc3RyaW5nIChvciBwaWVjZSBvZiBhIHN0cmluZykKKy8vICAgICBtdXN0IGJlIGxvbmdlciB0aGFuIHRoZSBsaWZldGltZSBvZiB0aGUgU3RyaW5nUGllY2UuCisvLyAoMikgVGhlcmUgbWF5IG9yIG1heSBub3QgYmUgYSAnXDAnIGNoYXJhY3RlciBhZnRlciB0aGUgZW5kIG9mCisvLyAgICAgU3RyaW5nUGllY2UgZGF0YS4KKy8vICgzKSBBIG51bGwgU3RyaW5nUGllY2UgaXMgZW1wdHkuCisvLyAgICAgQW4gZW1wdHkgU3RyaW5nUGllY2UgbWF5IG9yIG1heSBub3QgYmUgYSBudWxsIFN0cmluZ1BpZWNlLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVFJJTkdQSUVDRV9IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RSSU5HUElFQ0VfSF8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaWYgZGVmaW5lZChfX2NwcF9saWJfc3RyaW5nX3ZpZXcpCisjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2Ugc3RyaW5ncGllY2VfaW50ZXJuYWwgeworCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgU3RyaW5nUGllY2UgeworIHB1YmxpYzoKKyAgdXNpbmcgdHJhaXRzX3R5cGUgPSBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+OworICB1c2luZyB2YWx1ZV90eXBlID0gY2hhcjsKKyAgdXNpbmcgcG9pbnRlciA9IGNoYXIqOworICB1c2luZyBjb25zdF9wb2ludGVyID0gY29uc3QgY2hhcio7CisgIHVzaW5nIHJlZmVyZW5jZSA9IGNoYXImOworICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSBjb25zdCBjaGFyJjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBjb25zdCBjaGFyKjsKKyAgdXNpbmcgaXRlcmF0b3IgPSBjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj47CisgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB1c2luZyBzaXplX3R5cGUgPSBzaXplX3Q7CisgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHN0ZDo6cHRyZGlmZl90OworCisgcHJpdmF0ZToKKyAgY29uc3QgY2hhciogcHRyXzsKKyAgc2l6ZV90eXBlIGxlbmd0aF87CisKKyAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3R5cGUga01heFNpemUgPQorICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8ZGlmZmVyZW5jZV90eXBlPjo6bWF4KSgpOworCisgIHN0YXRpYyBzaXplX3R5cGUgQ2hlY2tTaXplKHNpemVfdHlwZSBzaXplKSB7CisjaWYgIWRlZmluZWQoTkRFQlVHKSB8fCBkZWZpbmVkKF9GT1JUSUZZX1NPVVJDRSkgJiYgX0ZPUlRJRllfU09VUkNFID4gMAorICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKHNpemUgPiBrTWF4U2l6ZSkpIHsKKyAgICAgIC8vIFNvbWUgcGVvcGxlIGdyZXAgZm9yIHRoaXMgbWVzc2FnZSBpbiBsb2dzCisgICAgICAvLyBzbyB0YWtlIGNhcmUgaWYgeW91IGV2ZXIgY2hhbmdlIGl0LgorICAgICAgTG9nRmF0YWxTaXplVG9vQmlnKHNpemUsICJzdHJpbmcgbGVuZ3RoIGV4Y2VlZHMgbWF4IHNpemUiKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIC8vIE91dC1vZi1saW5lIGVycm9yIHBhdGguCisgIHN0YXRpYyB2b2lkIExvZ0ZhdGFsU2l6ZVRvb0JpZyhzaXplX3R5cGUgc2l6ZSwgY29uc3QgY2hhciogZGV0YWlscyk7CisKKyBwdWJsaWM6CisgIC8vIFdlIHByb3ZpZGUgbm9uLWV4cGxpY2l0IHNpbmdsZXRvbiBjb25zdHJ1Y3RvcnMgc28gdXNlcnMgY2FuIHBhc3MKKyAgLy8gaW4gYSAiY29uc3QgY2hhcioiIG9yIGEgInN0cmluZyIgd2hlcmV2ZXIgYSAiU3RyaW5nUGllY2UiIGlzCisgIC8vIGV4cGVjdGVkLgorICAvLworICAvLyBTdHlsZSBndWlkZSBleGNlcHRpb24gZ3JhbnRlZDoKKyAgLy8gaHR0cDovL2dvdG8vc3R5bGUtZ3VpZGUtZXhjZXB0aW9uLTIwOTc4Mjg4CisgIFN0cmluZ1BpZWNlKCkgOiBwdHJfKG51bGxwdHIpLCBsZW5ndGhfKDApIHt9CisKKyAgU3RyaW5nUGllY2UoY29uc3QgY2hhciogc3RyKSAgLy8gTk9MSU5UKHJ1bnRpbWUvZXhwbGljaXQpCisgICAgICA6IHB0cl8oc3RyKSwgbGVuZ3RoXygwKSB7CisgICAgaWYgKHN0ciAhPSBudWxscHRyKSB7CisgICAgICBsZW5ndGhfID0gQ2hlY2tTaXplKHN0cmxlbihzdHIpKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgQWxsb2NhdG9yPgorICBTdHJpbmdQaWVjZSggIC8vIE5PTElOVChydW50aW1lL2V4cGxpY2l0KQorICAgICAgY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwgQWxsb2NhdG9yPiYgc3RyKQorICAgICAgOiBwdHJfKHN0ci5kYXRhKCkpLCBsZW5ndGhfKDApIHsKKyAgICBsZW5ndGhfID0gQ2hlY2tTaXplKHN0ci5zaXplKCkpOworICB9CisKKyNpZiBkZWZpbmVkKF9fY3BwX2xpYl9zdHJpbmdfdmlldykKKyAgU3RyaW5nUGllY2UoICAvLyBOT0xJTlQocnVudGltZS9leHBsaWNpdCkKKyAgICAgIHN0ZDo6c3RyaW5nX3ZpZXcgc3RyKQorICAgICAgOiBwdHJfKHN0ci5kYXRhKCkpLCBsZW5ndGhfKDApIHsKKyAgICBsZW5ndGhfID0gQ2hlY2tTaXplKHN0ci5zaXplKCkpOworICB9CisjZW5kaWYKKworICBTdHJpbmdQaWVjZShjb25zdCBjaGFyKiBvZmZzZXQsIHNpemVfdHlwZSBsZW4pCisgICAgICA6IHB0cl8ob2Zmc2V0KSwgbGVuZ3RoXyhDaGVja1NpemUobGVuKSkge30KKworICAvLyBkYXRhKCkgbWF5IHJldHVybiBhIHBvaW50ZXIgdG8gYSBidWZmZXIgd2l0aCBlbWJlZGRlZCBOVUxzLCBhbmQgdGhlCisgIC8vIHJldHVybmVkIGJ1ZmZlciBtYXkgb3IgbWF5IG5vdCBiZSBudWxsIHRlcm1pbmF0ZWQuICBUaGVyZWZvcmUgaXQgaXMKKyAgLy8gdHlwaWNhbGx5IGEgbWlzdGFrZSB0byBwYXNzIGRhdGEoKSB0byBhIHJvdXRpbmUgdGhhdCBleHBlY3RzIGEgTlVMCisgIC8vIHRlcm1pbmF0ZWQgc3RyaW5nLgorICBjb25zdF9wb2ludGVyIGRhdGEoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9CisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoXzsgfQorICBzaXplX3R5cGUgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoXzsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoXyA9PSAwOyB9CisKKyAgY2hhciBvcGVyYXRvcltdKHNpemVfdHlwZSBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBsZW5ndGhfKTsKKyAgICByZXR1cm4gcHRyX1tpXTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlX3ByZWZpeChzaXplX3R5cGUgbikgeworICAgIGFzc2VydChsZW5ndGhfID49IG4pOworICAgIHB0cl8gKz0gbjsKKyAgICBsZW5ndGhfIC09IG47CisgIH0KKworICB2b2lkIHJlbW92ZV9zdWZmaXgoc2l6ZV90eXBlIG4pIHsKKyAgICBhc3NlcnQobGVuZ3RoXyA+PSBuKTsKKyAgICBsZW5ndGhfIC09IG47CisgIH0KKworICAvLyByZXR1cm5zIHstMSwgMCwgMX0KKyAgaW50IGNvbXBhcmUoU3RyaW5nUGllY2UgeCkgY29uc3QgeworICAgIHNpemVfdHlwZSBtaW5fc2l6ZSA9IGxlbmd0aF8gPCB4Lmxlbmd0aF8gPyBsZW5ndGhfIDogeC5sZW5ndGhfOworICAgIGludCByID0gbWVtY21wKHB0cl8sIHgucHRyXywgc3RhdGljX2Nhc3Q8c2l6ZV90PihtaW5fc2l6ZSkpOworICAgIGlmIChyIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChyID4gMCkgcmV0dXJuIDE7CisgICAgaWYgKGxlbmd0aF8gPCB4Lmxlbmd0aF8pIHJldHVybiAtMTsKKyAgICBpZiAobGVuZ3RoXyA+IHgubGVuZ3RoXykgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzdGQ6OnN0cmluZyBhc19zdHJpbmcoKSBjb25zdCB7IHJldHVybiBUb1N0cmluZygpOyB9CisgIC8vIFdlIGFsc28gZGVmaW5lIFRvU3RyaW5nKCkgaGVyZSwgc2luY2UgbWFueSBvdGhlciBzdHJpbmctbGlrZQorICAvLyBpbnRlcmZhY2VzIG5hbWUgdGhlIHJvdXRpbmUgdGhhdCBjb252ZXJ0cyB0byBhIEMrKyBzdHJpbmcKKyAgLy8gIlRvU3RyaW5nIiwgYW5kIGl0J3MgY29uZnVzaW5nIHRvIGhhdmUgdGhlIG1ldGhvZCB0aGF0IGRvZXMgdGhhdAorICAvLyBmb3IgYSBTdHJpbmdQaWVjZSBiZSBjYWxsZWQgImFzX3N0cmluZygpIi4gIFdlIGFsc28gbGVhdmUgdGhlCisgIC8vICJhc19zdHJpbmcoKSIgbWV0aG9kIGRlZmluZWQgaGVyZSBmb3IgZXhpc3RpbmcgY29kZS4KKyAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCB7CisgICAgaWYgKHB0cl8gPT0gbnVsbHB0cikgcmV0dXJuICIiOworICAgIHJldHVybiBzdGQ6OnN0cmluZyhkYXRhKCksIHN0YXRpY19jYXN0PHNpemVfdHlwZT4oc2l6ZSgpKSk7CisgIH0KKworICBleHBsaWNpdCBvcGVyYXRvciBzdGQ6OnN0cmluZygpIGNvbnN0IHsgcmV0dXJuIFRvU3RyaW5nKCk7IH0KKworICB2b2lkIENvcHlUb1N0cmluZyhzdGQ6OnN0cmluZyogdGFyZ2V0KSBjb25zdDsKKyAgdm9pZCBBcHBlbmRUb1N0cmluZyhzdGQ6OnN0cmluZyogdGFyZ2V0KSBjb25zdDsKKworICBib29sIHN0YXJ0c193aXRoKFN0cmluZ1BpZWNlIHgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGxlbmd0aF8gPj0geC5sZW5ndGhfKSAmJgorICAgICAgICAgICAobWVtY21wKHB0cl8sIHgucHRyXywgc3RhdGljX2Nhc3Q8c2l6ZV90Pih4Lmxlbmd0aF8pKSA9PSAwKTsKKyAgfQorCisgIGJvb2wgZW5kc193aXRoKFN0cmluZ1BpZWNlIHgpIGNvbnN0IHsKKyAgICByZXR1cm4gKChsZW5ndGhfID49IHgubGVuZ3RoXykgJiYKKyAgICAgICAgICAgIChtZW1jbXAocHRyXyArIChsZW5ndGhfLXgubGVuZ3RoXyksIHgucHRyXywKKyAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90Pih4Lmxlbmd0aF8pKSA9PSAwKSk7CisgIH0KKworICAvLyBDaGVja3Mgd2hldGhlciBTdHJpbmdQaWVjZSBzdGFydHMgd2l0aCB4IGFuZCBpZiBzbyBhZHZhbmNlcyB0aGUgYmVnaW5uaW5nCisgIC8vIG9mIGl0IHRvIHBhc3QgdGhlIG1hdGNoLiAgSXQncyBiYXNpY2FsbHkgYSBzaG9ydGN1dCBmb3Igc3RhcnRzX3dpdGgKKyAgLy8gZm9sbG93ZWQgYnkgcmVtb3ZlX3ByZWZpeC4KKyAgYm9vbCBDb25zdW1lKFN0cmluZ1BpZWNlIHgpOworICAvLyBMaWtlIGFib3ZlIGJ1dCBmb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorICBib29sIENvbnN1bWVGcm9tRW5kKFN0cmluZ1BpZWNlIHgpOworCisgIC8vIHN0YW5kYXJkIFNUTCBjb250YWluZXIgYm9pbGVycGxhdGUKKyAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBucG9zOworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gcHRyXyArIGxlbmd0aF87IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IocHRyXyArIGxlbmd0aF8pOworICB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihwdHJfKTsKKyAgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBsZW5ndGhfOyB9CisgIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIGxlbmd0aF87IH0KKworICAvLyBjcHBsaW50LnB5IGVtaXRzIGEgZmFsc2UgcG9zaXRpdmUgW2J1aWxkL2luY2x1ZGVfd2hhdF95b3VfdXNlXQorICBzaXplX3R5cGUgY29weShjaGFyKiBidWYsIHNpemVfdHlwZSBuLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7ICAvLyBOT0xJTlQKKworICBib29sIGNvbnRhaW5zKFN0cmluZ1BpZWNlIHMpIGNvbnN0OworCisgIHNpemVfdHlwZSBmaW5kKFN0cmluZ1BpZWNlIHMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdDsKKyAgc2l6ZV90eXBlIGZpbmQoY2hhciBjLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7CisgIHNpemVfdHlwZSByZmluZChTdHJpbmdQaWVjZSBzLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Q7CisgIHNpemVfdHlwZSByZmluZChjaGFyIGMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdDsKKworICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihTdHJpbmdQaWVjZSBzLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7CisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNoYXIgYywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gZmluZChjLCBwb3MpOworICB9CisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihTdHJpbmdQaWVjZSBzLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7CisgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjaGFyIGMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdDsKKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihTdHJpbmdQaWVjZSBzLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Q7CisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY2hhciBjLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3QgeworICAgIHJldHVybiByZmluZChjLCBwb3MpOworICB9CisgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKFN0cmluZ1BpZWNlIHMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdDsKKyAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY2hhciBjLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Q7CisKKyAgU3RyaW5nUGllY2Ugc3Vic3RyKHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuID0gbnBvcykgY29uc3Q7Cit9OworCisvLyBUaGlzIGxhcmdlIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW5saW5lIHNvIHRoYXQgaW4gYSBmYWlybHkgY29tbW9uIGNhc2Ugd2hlcmUKKy8vIG9uZSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgbGl0ZXJhbCwgdGhlIGNvbXBpbGVyIGNhbiBlbGlkZSBhIGxvdCBvZiB0aGUKKy8vIGZvbGxvd2luZyBjb21wYXJpc29ucy4KK2lubGluZSBib29sIG9wZXJhdG9yPT0oU3RyaW5nUGllY2UgeCwgU3RyaW5nUGllY2UgeSkgeworICBTdHJpbmdQaWVjZTo6c2l6ZV90eXBlIGxlbiA9IHguc2l6ZSgpOworICBpZiAobGVuICE9IHkuc2l6ZSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHguZGF0YSgpID09IHkuZGF0YSgpIHx8IGxlbiA8PSAwIHx8CisgICAgICBtZW1jbXAoeC5kYXRhKCksIHkuZGF0YSgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGxlbikpID09IDA7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oU3RyaW5nUGllY2UgeCwgU3RyaW5nUGllY2UgeSkgeworICByZXR1cm4gISh4ID09IHkpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoU3RyaW5nUGllY2UgeCwgU3RyaW5nUGllY2UgeSkgeworICBjb25zdCBTdHJpbmdQaWVjZTo6c2l6ZV90eXBlIG1pbl9zaXplID0KKyAgICAgIHguc2l6ZSgpIDwgeS5zaXplKCkgPyB4LnNpemUoKSA6IHkuc2l6ZSgpOworICBjb25zdCBpbnQgciA9IG1lbWNtcCh4LmRhdGEoKSwgeS5kYXRhKCksIHN0YXRpY19jYXN0PHNpemVfdD4obWluX3NpemUpKTsKKyAgcmV0dXJuIChyIDwgMCkgfHwgKHIgPT0gMCAmJiB4LnNpemUoKSA8IHkuc2l6ZSgpKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+KFN0cmluZ1BpZWNlIHgsIFN0cmluZ1BpZWNlIHkpIHsKKyAgcmV0dXJuIHkgPCB4OworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KFN0cmluZ1BpZWNlIHgsIFN0cmluZ1BpZWNlIHkpIHsKKyAgcmV0dXJuICEoeCA+IHkpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KFN0cmluZ1BpZWNlIHgsIFN0cmluZ1BpZWNlIHkpIHsKKyAgcmV0dXJuICEoeCA8IHkpOworfQorCisvLyBhbGxvdyBTdHJpbmdQaWVjZSB0byBiZSBsb2dnZWQKK2V4dGVybiBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvLCBTdHJpbmdQaWVjZSBwaWVjZSk7CisKK30gIC8vIG5hbWVzcGFjZSBzdHJpbmdwaWVjZV9pbnRlcm5hbAorCit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OnN0cmluZ3BpZWNlX2ludGVybmFsOjpTdHJpbmdQaWVjZTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKK0dPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRV9ERUNMQVJBVElPTl9TVEFSVAordGVtcGxhdGU8PiBzdHJ1Y3QgaGFzaDxTdHJpbmdQaWVjZT4geworICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBTdHJpbmdQaWVjZSYgcykgY29uc3QgeworICAgIHNpemVfdCByZXN1bHQgPSAwOworICAgIGZvciAoY29uc3QgY2hhciAqc3RyID0gcy5kYXRhKCksICplbmQgPSBzdHIgKyBzLnNpemUoKTsgc3RyIDwgZW5kOyBzdHIrKykgeworICAgICAgcmVzdWx0ID0gNSAqIHJlc3VsdCArIHN0YXRpY19jYXN0PHNpemVfdD4oKnN0cik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KK307CitHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0VfREVDTEFSQVRJT05fRU5ECisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gU1RSSU5HU19TVFJJTkdQSUVDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZV91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5MDRjYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw2OTUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5oPgorCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB7CitURVNUKFN0cmluZ1BpZWNlLCBDdG9yKSB7CisgIHsKKyAgICAvLyBOdWxsLgorICAgIFN0cmluZ1BpZWNlIHMxMDsKKyAgICBFWFBFQ1RfVFJVRShzMTAuZGF0YSgpID09IG51bGxwdHIpOworICAgIEVYUEVDVF9FUSgwLCBzMTAubGVuZ3RoKCkpOworICB9CisKKyAgeworICAgIC8vIGNvbnN0IGNoYXIqIHdpdGhvdXQgbGVuZ3RoLgorICAgIGNvbnN0IGNoYXIqIGhlbGxvID0gImhlbGxvIjsKKyAgICBTdHJpbmdQaWVjZSBzMjAoaGVsbG8pOworICAgIEVYUEVDVF9UUlVFKHMyMC5kYXRhKCkgPT0gaGVsbG8pOworICAgIEVYUEVDVF9FUSg1LCBzMjAubGVuZ3RoKCkpOworCisgICAgLy8gY29uc3QgY2hhciogd2l0aCBsZW5ndGguCisgICAgU3RyaW5nUGllY2UgczIxKGhlbGxvLCA0KTsKKyAgICBFWFBFQ1RfVFJVRShzMjEuZGF0YSgpID09IGhlbGxvKTsKKyAgICBFWFBFQ1RfRVEoNCwgczIxLmxlbmd0aCgpKTsKKworICAgIC8vIE5vdCByZWNvbW1lbmRlZCwgYnV0IHZhbGlkIEMrKworICAgIFN0cmluZ1BpZWNlIHMyMihoZWxsbywgNik7CisgICAgRVhQRUNUX1RSVUUoczIyLmRhdGEoKSA9PSBoZWxsbyk7CisgICAgRVhQRUNUX0VRKDYsIHMyMi5sZW5ndGgoKSk7CisgIH0KKworICB7CisgICAgLy8gc3RkOjpzdHJpbmcuCisgICAgc3RkOjpzdHJpbmcgaG9sYSA9ICJob2xhIjsKKyAgICBTdHJpbmdQaWVjZSBzMzAoaG9sYSk7CisgICAgRVhQRUNUX1RSVUUoczMwLmRhdGEoKSA9PSBob2xhLmRhdGEoKSk7CisgICAgRVhQRUNUX0VRKDQsIHMzMC5sZW5ndGgoKSk7CisKKyAgICAvLyBzdGQ6OnN0cmluZyB3aXRoIGVtYmVkZGVkICdcMCcuCisgICAgaG9sYS5wdXNoX2JhY2soJ1wwJyk7CisgICAgaG9sYS5hcHBlbmQoImgyIik7CisgICAgaG9sYS5wdXNoX2JhY2soJ1wwJyk7CisgICAgU3RyaW5nUGllY2UgczMxKGhvbGEpOworICAgIEVYUEVDVF9UUlVFKHMzMS5kYXRhKCkgPT0gaG9sYS5kYXRhKCkpOworICAgIEVYUEVDVF9FUSg4LCBzMzEubGVuZ3RoKCkpOworICB9CisKKyNpZiBkZWZpbmVkKEhBU19HTE9CQUxfU1RSSU5HKQorICB7CisgICAgLy8gOjpzdHJpbmcKKyAgICBzdGQ6OnN0cmluZyBib25qb3VyID0gImJvbmpvdXIiOworICAgIFN0cmluZ1BpZWNlIHM0MChib25qb3VyKTsKKyAgICBFWFBFQ1RfVFJVRShzNDAuZGF0YSgpID09IGJvbmpvdXIuZGF0YSgpKTsKKyAgICBFWFBFQ1RfRVEoNywgczQwLmxlbmd0aCgpKTsKKyAgfQorI2VuZGlmCisKKyAgLy8gVE9ETyhtZWMpOiBTdHJpbmdQaWVjZShTdHJpbmdQaWVjZSB4LCBpbnQgcG9zKTsKKyAgLy8gVE9ETyhtZWMpOiBTdHJpbmdQaWVjZShTdHJpbmdQaWVjZSB4LCBpbnQgcG9zLCBpbnQgbGVuKTsKKyAgLy8gVE9ETyhtZWMpOiBTdHJpbmdQaWVjZShjb25zdCBTdHJpbmdQaWVjZSYpOworfQorCitURVNUKFN0cmluZ1BpZWNlLCBTVExDb21wYXJhdG9yKSB7CisgIHN0ZDo6c3RyaW5nIHMxKCJmb28iKTsKKyAgc3RkOjpzdHJpbmcgczIoImJhciIpOworICBzdGQ6OnN0cmluZyBzMygiYmF6Iik7CisKKyAgU3RyaW5nUGllY2UgcDEoczEpOworICBTdHJpbmdQaWVjZSBwMihzMik7CisgIFN0cmluZ1BpZWNlIHAzKHMzKTsKKworICB0eXBlZGVmIHN0ZDo6bWFwPFN0cmluZ1BpZWNlLCBpbnQ+IFRlc3RNYXA7CisgIFRlc3RNYXAgbWFwOworCisgIG1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIocDEsIDApKTsKKyAgbWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihwMiwgMSkpOworICBtYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHAzLCAyKSk7CisgIEVYUEVDVF9FUShtYXAuc2l6ZSgpLCAzKTsKKworICBUZXN0TWFwOjpjb25zdF9pdGVyYXRvciBpdGVyID0gbWFwLmJlZ2luKCk7CisgIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDEpOworICArK2l0ZXI7CisgIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDIpOworICArK2l0ZXI7CisgIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDApOworICArK2l0ZXI7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gbWFwLmVuZCgpKTsKKworICBUZXN0TWFwOjppdGVyYXRvciBuZXdfaXRlciA9IG1hcC5maW5kKCJ6b3QiKTsKKyAgRVhQRUNUX1RSVUUobmV3X2l0ZXIgPT0gbWFwLmVuZCgpKTsKKworICBuZXdfaXRlciA9IG1hcC5maW5kKCJiYXIiKTsKKyAgRVhQRUNUX1RSVUUobmV3X2l0ZXIgIT0gbWFwLmVuZCgpKTsKKworICBtYXAuZXJhc2UobmV3X2l0ZXIpOworICBFWFBFQ1RfRVEobWFwLnNpemUoKSwgMik7CisKKyAgaXRlciA9IG1hcC5iZWdpbigpOworICBFWFBFQ1RfRVEoaXRlci0+c2Vjb25kLCAyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfRVEoaXRlci0+c2Vjb25kLCAwKTsKKyAgKytpdGVyOworICBFWFBFQ1RfVFJVRShpdGVyID09IG1hcC5lbmQoKSk7Cit9CisKK1RFU1QoU3RyaW5nUGllY2UsIENvbXBhcmlzb25PcGVyYXRvcnMpIHsKKyNkZWZpbmUgQ09NUEFSRShyZXN1bHQsIG9wLCB4LCB5KSBcCisgIEVYUEVDVF9FUShyZXN1bHQsIFN0cmluZ1BpZWNlKCh4KSkgb3AgU3RyaW5nUGllY2UoKHkpKSk7IFwKKyAgRVhQRUNUX0VRKHJlc3VsdCwgU3RyaW5nUGllY2UoKHgpKS5jb21wYXJlKFN0cmluZ1BpZWNlKCh5KSkpIG9wIDApCisKKyAgQ09NUEFSRSh0cnVlLCA9PSwgIiIsICAgIiIpOworICBDT01QQVJFKHRydWUsID09LCAiIiwgbnVsbHB0cik7CisgIENPTVBBUkUodHJ1ZSwgPT0sIG51bGxwdHIsICIiKTsKKyAgQ09NUEFSRSh0cnVlLCA9PSwgImEiLCAgImEiKTsKKyAgQ09NUEFSRSh0cnVlLCA9PSwgImFhIiwgImFhIik7CisgIENPTVBBUkUoZmFsc2UsID09LCAiYSIsICAiIik7CisgIENPTVBBUkUoZmFsc2UsID09LCAiIiwgICAiYSIpOworICBDT01QQVJFKGZhbHNlLCA9PSwgImEiLCAgImIiKTsKKyAgQ09NUEFSRShmYWxzZSwgPT0sICJhIiwgICJhYSIpOworICBDT01QQVJFKGZhbHNlLCA9PSwgImFhIiwgImEiKTsKKworICBDT01QQVJFKGZhbHNlLCAhPSwgIiIsICAgIiIpOworICBDT01QQVJFKGZhbHNlLCAhPSwgImEiLCAgImEiKTsKKyAgQ09NUEFSRShmYWxzZSwgIT0sICJhYSIsICJhYSIpOworICBDT01QQVJFKHRydWUsICE9LCAiYSIsICAiIik7CisgIENPTVBBUkUodHJ1ZSwgIT0sICIiLCAgICJhIik7CisgIENPTVBBUkUodHJ1ZSwgIT0sICJhIiwgICJiIik7CisgIENPTVBBUkUodHJ1ZSwgIT0sICJhIiwgICJhYSIpOworICBDT01QQVJFKHRydWUsICE9LCAiYWEiLCAiYSIpOworCisgIENPTVBBUkUodHJ1ZSwgPCwgImEiLCAgImIiKTsKKyAgQ09NUEFSRSh0cnVlLCA8LCAiYSIsICAiYWEiKTsKKyAgQ09NUEFSRSh0cnVlLCA8LCAiYWEiLCAiYiIpOworICBDT01QQVJFKHRydWUsIDwsICJhYSIsICJiYiIpOworICBDT01QQVJFKGZhbHNlLCA8LCAiYSIsICAiYSIpOworICBDT01QQVJFKGZhbHNlLCA8LCAiYiIsICAiYSIpOworICBDT01QQVJFKGZhbHNlLCA8LCAiYWEiLCAiYSIpOworICBDT01QQVJFKGZhbHNlLCA8LCAiYiIsICAiYWEiKTsKKyAgQ09NUEFSRShmYWxzZSwgPCwgImJiIiwgImFhIik7CisKKyAgQ09NUEFSRSh0cnVlLCA8PSwgImEiLCAgImEiKTsKKyAgQ09NUEFSRSh0cnVlLCA8PSwgImEiLCAgImIiKTsKKyAgQ09NUEFSRSh0cnVlLCA8PSwgImEiLCAgImFhIik7CisgIENPTVBBUkUodHJ1ZSwgPD0sICJhYSIsICJiIik7CisgIENPTVBBUkUodHJ1ZSwgPD0sICJhYSIsICJiYiIpOworICBDT01QQVJFKGZhbHNlLCA8PSwgImIiLCAgImEiKTsKKyAgQ09NUEFSRShmYWxzZSwgPD0sICJhYSIsICJhIik7CisgIENPTVBBUkUoZmFsc2UsIDw9LCAiYiIsICAiYWEiKTsKKyAgQ09NUEFSRShmYWxzZSwgPD0sICJiYiIsICJhYSIpOworCisgIENPTVBBUkUoZmFsc2UsID49LCAiYSIsICAiYiIpOworICBDT01QQVJFKGZhbHNlLCA+PSwgImEiLCAgImFhIik7CisgIENPTVBBUkUoZmFsc2UsID49LCAiYWEiLCAiYiIpOworICBDT01QQVJFKGZhbHNlLCA+PSwgImFhIiwgImJiIik7CisgIENPTVBBUkUodHJ1ZSwgPj0sICJhIiwgICJhIik7CisgIENPTVBBUkUodHJ1ZSwgPj0sICJiIiwgICJhIik7CisgIENPTVBBUkUodHJ1ZSwgPj0sICJhYSIsICJhIik7CisgIENPTVBBUkUodHJ1ZSwgPj0sICJiIiwgICJhYSIpOworICBDT01QQVJFKHRydWUsID49LCAiYmIiLCAiYWEiKTsKKworICBDT01QQVJFKGZhbHNlLCA+LCAiYSIsICAiYSIpOworICBDT01QQVJFKGZhbHNlLCA+LCAiYSIsICAiYiIpOworICBDT01QQVJFKGZhbHNlLCA+LCAiYSIsICAiYWEiKTsKKyAgQ09NUEFSRShmYWxzZSwgPiwgImFhIiwgImIiKTsKKyAgQ09NUEFSRShmYWxzZSwgPiwgImFhIiwgImJiIik7CisgIENPTVBBUkUodHJ1ZSwgPiwgImIiLCAgImEiKTsKKyAgQ09NUEFSRSh0cnVlLCA+LCAiYWEiLCAiYSIpOworICBDT01QQVJFKHRydWUsID4sICJiIiwgICJhYSIpOworICBDT01QQVJFKHRydWUsID4sICJiYiIsICJhYSIpOworCisgIHN0ZDo6c3RyaW5nIHg7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICB4ICs9ICdhJzsKKyAgICBzdGQ6OnN0cmluZyB5ID0geDsKKyAgICBDT01QQVJFKHRydWUsID09LCB4LCB5KTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgeworICAgICAgc3RkOjpzdHJpbmcgeiA9IHg7CisgICAgICB6W2pdID0gJ2InOyAgICAgICAvLyBEaWZmZXJzIGluIHBvc2l0aW9uICdqJworICAgICAgQ09NUEFSRShmYWxzZSwgPT0sIHgsIHopOworICAgICAgQ09NUEFSRSh0cnVlLCA8LCB4LCB6KTsKKyAgICAgIENPTVBBUkUodHJ1ZSwgPiwgeiwgeCk7CisgICAgICBpZiAoaiArIDEgPCBpKSB7CisgICAgICAgIHpbaiArIDFdID0gJ0EnOyAgLy8gRGlmZmVycyBpbiBwb3NpdGlvbiAnaisxJyBhcyB3ZWxsCisgICAgICAgIENPTVBBUkUoZmFsc2UsID09LCB4LCB6KTsKKyAgICAgICAgQ09NUEFSRSh0cnVlLCA8LCB4LCB6KTsKKyAgICAgICAgQ09NUEFSRSh0cnVlLCA+LCB6LCB4KTsKKyAgICAgICAgeltqICsgMV0gPSAneic7ICAvLyBEaWZmZXJzIGluIHBvc2l0aW9uICdqKzEnIGFzIHdlbGwKKyAgICAgICAgQ09NUEFSRShmYWxzZSwgPT0sIHgsIHopOworICAgICAgICBDT01QQVJFKHRydWUsIDwsIHgsIHopOworICAgICAgICBDT01QQVJFKHRydWUsID4sIHosIHgpOworICAgICAgfQorICAgIH0KKyAgfQorCisjdW5kZWYgQ09NUEFSRQorfQorCitURVNUKFN0cmluZ1BpZWNlLCBTVEwxKSB7CisgIGNvbnN0IFN0cmluZ1BpZWNlIGEoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Iik7CisgIGNvbnN0IFN0cmluZ1BpZWNlIGIoImFiYyIpOworICBjb25zdCBTdHJpbmdQaWVjZSBjKCJ4eXoiKTsKKyAgY29uc3QgU3RyaW5nUGllY2UgZCgiZm9vYmFyIik7CisgIGNvbnN0IFN0cmluZ1BpZWNlIGU7CisgIHN0ZDo6c3RyaW5nIHRlbXAoIjEyMyIpOworICB0ZW1wICs9ICdcMCc7CisgIHRlbXAgKz0gIjQ1NiI7CisgIGNvbnN0IFN0cmluZ1BpZWNlIGYodGVtcCk7CisKKyAgRVhQRUNUX0VRKGFbNl0sICdnJyk7CisgIEVYUEVDVF9FUShiWzBdLCAnYScpOworICBFWFBFQ1RfRVEoY1syXSwgJ3onKTsKKyAgRVhQRUNUX0VRKGZbM10sICdcMCcpOworICBFWFBFQ1RfRVEoZls1XSwgJzUnKTsKKworICBFWFBFQ1RfRVEoKmQuZGF0YSgpLCAnZicpOworICBFWFBFQ1RfRVEoZC5kYXRhKClbNV0sICdyJyk7CisgIEVYUEVDVF9UUlVFKGUuZGF0YSgpID09IG51bGxwdHIpOworCisgIEVYUEVDVF9FUSgqYS5iZWdpbigpLCAnYScpOworICBFWFBFQ1RfRVEoKihiLmJlZ2luKCkgKyAyKSwgJ2MnKTsKKyAgRVhQRUNUX0VRKCooYy5lbmQoKSAtIDEpLCAneicpOworCisgIEVYUEVDVF9FUSgqYS5yYmVnaW4oKSwgJ3onKTsKKyAgRVhQRUNUX0VRKCooYi5yYmVnaW4oKSArIDIpLCAnYScpOworICBFWFBFQ1RfRVEoKihjLnJlbmQoKSAtIDEpLCAneCcpOworICBFWFBFQ1RfVFJVRShhLnJiZWdpbigpICsgMjYgPT0gYS5yZW5kKCkpOworCisgIEVYUEVDVF9FUShhLnNpemUoKSwgMjYpOworICBFWFBFQ1RfRVEoYi5zaXplKCksIDMpOworICBFWFBFQ1RfRVEoYy5zaXplKCksIDMpOworICBFWFBFQ1RfRVEoZC5zaXplKCksIDYpOworICBFWFBFQ1RfRVEoZS5zaXplKCksIDApOworICBFWFBFQ1RfRVEoZi5zaXplKCksIDcpOworCisgIEVYUEVDVF9UUlVFKCFkLmVtcHR5KCkpOworICBFWFBFQ1RfVFJVRShkLmJlZ2luKCkgIT0gZC5lbmQoKSk7CisgIEVYUEVDVF9UUlVFKGQuYmVnaW4oKSArIDYgPT0gZC5lbmQoKSk7CisKKyAgRVhQRUNUX1RSVUUoZS5lbXB0eSgpKTsKKyAgRVhQRUNUX1RSVUUoZS5iZWdpbigpID09IGUuZW5kKCkpOworCisgIEVYUEVDVF9HRShhLm1heF9zaXplKCksIGEuY2FwYWNpdHkoKSk7CisgIEVYUEVDVF9HRShhLmNhcGFjaXR5KCksIGEuc2l6ZSgpKTsKKworICBjaGFyIGJ1Zls0XSA9IHsgJyUnLCAnJScsICclJywgJyUnIH07CisgIEVYUEVDVF9FUShhLmNvcHkoYnVmLCA0KSwgNCk7CisgIEVYUEVDVF9FUShidWZbMF0sIGFbMF0pOworICBFWFBFQ1RfRVEoYnVmWzFdLCBhWzFdKTsKKyAgRVhQRUNUX0VRKGJ1ZlsyXSwgYVsyXSk7CisgIEVYUEVDVF9FUShidWZbM10sIGFbM10pOworICBFWFBFQ1RfRVEoYS5jb3B5KGJ1ZiwgMywgNyksIDMpOworICBFWFBFQ1RfRVEoYnVmWzBdLCBhWzddKTsKKyAgRVhQRUNUX0VRKGJ1ZlsxXSwgYVs4XSk7CisgIEVYUEVDVF9FUShidWZbMl0sIGFbOV0pOworICBFWFBFQ1RfRVEoYnVmWzNdLCBhWzNdKTsKKyAgRVhQRUNUX0VRKGMuY29weShidWYsIDk5KSwgMyk7CisgIEVYUEVDVF9FUShidWZbMF0sIGNbMF0pOworICBFWFBFQ1RfRVEoYnVmWzFdLCBjWzFdKTsKKyAgRVhQRUNUX0VRKGJ1ZlsyXSwgY1syXSk7CisgIEVYUEVDVF9FUShidWZbM10sIGFbM10pOworfQorCisvLyBTZXBhcmF0ZWQgZnJvbSBTVEwxKCkgYmVjYXVzZSBzb21lIGNvbXBpbGVycyBwcm9kdWNlIGFuIG92ZXJseQorLy8gbGFyZ2Ugc3RhY2sgZnJhbWUgZm9yIHRoZSBjb21iaW5lZCBmdW5jdGlvbi4KK1RFU1QoU3RyaW5nUGllY2UsIFNUTDIpIHsKKyAgY29uc3QgU3RyaW5nUGllY2UgYSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKTsKKyAgY29uc3QgU3RyaW5nUGllY2UgYigiYWJjIik7CisgIGNvbnN0IFN0cmluZ1BpZWNlIGMoInh5eiIpOworICBjb25zdCBTdHJpbmdQaWVjZSBlOworICBjb25zdCBTdHJpbmdQaWVjZSBmKCIxMjMiICJcMCIgIjQ1NiIsIDcpOworCisgIEVYUEVDVF9FUShTdHJpbmdQaWVjZTo6bnBvcywgc3RkOjpzdHJpbmc6Om5wb3MpOworCisgIEVYUEVDVF9FUShhLmZpbmQoYiksIDApOworICBFWFBFQ1RfRVEoYS5maW5kKGIsIDEpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIEVYUEVDVF9FUShhLmZpbmQoYyksIDIzKTsKKyAgRVhQRUNUX0VRKGEuZmluZChjLCA5KSwgMjMpOworICBFWFBFQ1RfRVEoYS5maW5kKGMsIFN0cmluZ1BpZWNlOjpucG9zKSwgU3RyaW5nUGllY2U6Om5wb3MpOworICBFWFBFQ1RfRVEoYi5maW5kKGMpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIEVYUEVDVF9FUShiLmZpbmQoYywgU3RyaW5nUGllY2U6Om5wb3MpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIEVYUEVDVF9FUShhLmZpbmQoZSksIDApOworICBFWFBFQ1RfRVEoYS5maW5kKGUsIDE3KSwgMTcpOworICBTdHJpbmdQaWVjZSBnKCJ4eCBub3QgZm91bmQgYmIiKTsKKyAgRVhQRUNUX0VRKGEuZmluZChnKSwgU3RyaW5nUGllY2U6Om5wb3MpOworICAvLyBlbXB0eSBzdHJpbmcgbm9uc2Vuc2UKKyAgRVhQRUNUX0VRKGUuZmluZChiKSwgU3RyaW5nUGllY2U6Om5wb3MpOworICBFWFBFQ1RfRVEoZS5maW5kKGIsIDcpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisKKyAgc2l6ZV90IGVtcHR5X3NlYXJjaF9wb3MgPSBzdGQ6OnN0cmluZygpLmZpbmQoc3RkOjpzdHJpbmcoKSk7CisgIEVYUEVDVF9FUShlLmZpbmQoZSksIGVtcHR5X3NlYXJjaF9wb3MpOworICBFWFBFQ1RfRVEoZS5maW5kKGUsIDQpLCBzdGQ6OnN0cmluZygpLmZpbmQoc3RkOjpzdHJpbmcoKSwgNCkpOworCisgIEVYUEVDVF9FUShhLmZpbmQoJ2EnKSwgMCk7CisgIEVYUEVDVF9FUShhLmZpbmQoJ2MnKSwgMik7CisgIEVYUEVDVF9FUShhLmZpbmQoJ3onKSwgMjUpOworICBFWFBFQ1RfRVEoYS5maW5kKCckJyksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGEuZmluZCgnXDAnKSwgU3RyaW5nUGllY2U6Om5wb3MpOworICBFWFBFQ1RfRVEoZi5maW5kKCdcMCcpLCAzKTsKKyAgRVhQRUNUX0VRKGYuZmluZCgnMycpLCAyKTsKKyAgRVhQRUNUX0VRKGYuZmluZCgnNScpLCA1KTsKKyAgRVhQRUNUX0VRKGcuZmluZCgnbycpLCA0KTsKKyAgRVhQRUNUX0VRKGcuZmluZCgnbycsIDQpLCA0KTsKKyAgRVhQRUNUX0VRKGcuZmluZCgnbycsIDUpLCA4KTsKKyAgRVhQRUNUX0VRKGEuZmluZCgnYicsIDUpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIC8vIGVtcHR5IHN0cmluZyBub25zZW5zZQorICBFWFBFQ1RfRVEoZS5maW5kKCdcMCcpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIEVYUEVDVF9FUShlLmZpbmQoJ1wwJywgNyksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGUuZmluZCgneCcpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIEVYUEVDVF9FUShlLmZpbmQoJ3gnLCA3KSwgU3RyaW5nUGllY2U6Om5wb3MpOworCisgIEVYUEVDVF9FUShhLnJmaW5kKGIpLCAwKTsKKyAgRVhQRUNUX0VRKGEucmZpbmQoYiwgMSksIDApOworICBFWFBFQ1RfRVEoYS5yZmluZChjKSwgMjMpOworICBFWFBFQ1RfRVEoYS5yZmluZChjLCAyMiksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGEucmZpbmQoYywgMSksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGEucmZpbmQoYywgMCksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGIucmZpbmQoYyksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGIucmZpbmQoYywgMCksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGEucmZpbmQoZSksIGEuYXNfc3RyaW5nKCkucmZpbmQoc3RkOjpzdHJpbmcoKSkpOworICBFWFBFQ1RfRVEoYS5yZmluZChlLCAxNyksIDE3KTsKKyAgRVhQRUNUX0VRKGEucmZpbmQoZyksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGUucmZpbmQoYiksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGUucmZpbmQoYiwgNyksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgLy8gZW1wdHkgc3RyaW5nIG5vbnNlbnNlCisgIEVYUEVDVF9FUShlLnJmaW5kKGUsIDcpLCBzdGQ6OnN0cmluZygpLnJmaW5kKHN0ZDo6c3RyaW5nKCkpKTsKKyAgRVhQRUNUX0VRKGUucmZpbmQoZSksIHN0ZDo6c3RyaW5nKCkucmZpbmQoc3RkOjpzdHJpbmcoKSkpOworCisgIEVYUEVDVF9FUShnLnJmaW5kKCdvJyksIDgpOworICBFWFBFQ1RfRVEoZy5yZmluZCgncScpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIEVYUEVDVF9FUShnLnJmaW5kKCdvJywgOCksIDgpOworICBFWFBFQ1RfRVEoZy5yZmluZCgnbycsIDcpLCA0KTsKKyAgRVhQRUNUX0VRKGcucmZpbmQoJ28nLCAzKSwgU3RyaW5nUGllY2U6Om5wb3MpOworICBFWFBFQ1RfRVEoZi5yZmluZCgnXDAnKSwgMyk7CisgIEVYUEVDVF9FUShmLnJmaW5kKCdcMCcsIDEyKSwgMyk7CisgIEVYUEVDVF9FUShmLnJmaW5kKCczJyksIDIpOworICBFWFBFQ1RfRVEoZi5yZmluZCgnNScpLCA1KTsKKyAgLy8gZW1wdHkgc3RyaW5nIG5vbnNlbnNlCisgIEVYUEVDVF9FUShlLnJmaW5kKCdvJyksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGUucmZpbmQoJ28nLCA3KSwgU3RyaW5nUGllY2U6Om5wb3MpOworCisgIEVYUEVDVF9FUShhLmZpbmRfZmlyc3Rfb2YoYiksIDApOworICBFWFBFQ1RfRVEoYS5maW5kX2ZpcnN0X29mKGIsIDApLCAwKTsKKyAgRVhQRUNUX0VRKGEuZmluZF9maXJzdF9vZihiLCAxKSwgMSk7CisgIEVYUEVDVF9FUShhLmZpbmRfZmlyc3Rfb2YoYiwgMiksIDIpOworICBFWFBFQ1RfRVEoYS5maW5kX2ZpcnN0X29mKGIsIDMpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIEVYUEVDVF9FUShhLmZpbmRfZmlyc3Rfb2YoYyksIDIzKTsKKyAgRVhQRUNUX0VRKGEuZmluZF9maXJzdF9vZihjLCAyMyksIDIzKTsKKyAgRVhQRUNUX0VRKGEuZmluZF9maXJzdF9vZihjLCAyNCksIDI0KTsKKyAgRVhQRUNUX0VRKGEuZmluZF9maXJzdF9vZihjLCAyNSksIDI1KTsKKyAgRVhQRUNUX0VRKGEuZmluZF9maXJzdF9vZihjLCAyNiksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGcuZmluZF9maXJzdF9vZihiKSwgMTMpOworICBFWFBFQ1RfRVEoZy5maW5kX2ZpcnN0X29mKGMpLCAwKTsKKyAgRVhQRUNUX0VRKGEuZmluZF9maXJzdF9vZihmKSwgU3RyaW5nUGllY2U6Om5wb3MpOworICBFWFBFQ1RfRVEoZi5maW5kX2ZpcnN0X29mKGEpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIC8vIGVtcHR5IHN0cmluZyBub25zZW5zZQorICBFWFBFQ1RfRVEoYS5maW5kX2ZpcnN0X29mKGUpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIEVYUEVDVF9FUShlLmZpbmRfZmlyc3Rfb2YoYiksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGUuZmluZF9maXJzdF9vZihlKSwgU3RyaW5nUGllY2U6Om5wb3MpOworCisgIEVYUEVDVF9FUShhLmZpbmRfZmlyc3Rfbm90X29mKGIpLCAzKTsKKyAgRVhQRUNUX0VRKGEuZmluZF9maXJzdF9ub3Rfb2YoYyksIDApOworICBFWFBFQ1RfRVEoYi5maW5kX2ZpcnN0X25vdF9vZihhKSwgU3RyaW5nUGllY2U6Om5wb3MpOworICBFWFBFQ1RfRVEoYy5maW5kX2ZpcnN0X25vdF9vZihhKSwgU3RyaW5nUGllY2U6Om5wb3MpOworICBFWFBFQ1RfRVEoZi5maW5kX2ZpcnN0X25vdF9vZihhKSwgMCk7CisgIEVYUEVDVF9FUShhLmZpbmRfZmlyc3Rfbm90X29mKGYpLCAwKTsKKyAgRVhQRUNUX0VRKGEuZmluZF9maXJzdF9ub3Rfb2YoZSksIDApOworICAvLyBlbXB0eSBzdHJpbmcgbm9uc2Vuc2UKKyAgRVhQRUNUX0VRKGUuZmluZF9maXJzdF9ub3Rfb2YoYSksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGUuZmluZF9maXJzdF9ub3Rfb2YoZSksIFN0cmluZ1BpZWNlOjpucG9zKTsKKworICBTdHJpbmdQaWVjZSBoKCI9PT09Iik7CisgIEVYUEVDVF9FUShoLmZpbmRfZmlyc3Rfbm90X29mKCc9JyksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGguZmluZF9maXJzdF9ub3Rfb2YoJz0nLCAzKSwgU3RyaW5nUGllY2U6Om5wb3MpOworICBFWFBFQ1RfRVEoaC5maW5kX2ZpcnN0X25vdF9vZignXDAnKSwgMCk7CisgIEVYUEVDVF9FUShnLmZpbmRfZmlyc3Rfbm90X29mKCd4JyksIDIpOworICBFWFBFQ1RfRVEoZi5maW5kX2ZpcnN0X25vdF9vZignXDAnKSwgMCk7CisgIEVYUEVDVF9FUShmLmZpbmRfZmlyc3Rfbm90X29mKCdcMCcsIDMpLCA0KTsKKyAgRVhQRUNUX0VRKGYuZmluZF9maXJzdF9ub3Rfb2YoJ1wwJywgMiksIDIpOworICAvLyBlbXB0eSBzdHJpbmcgbm9uc2Vuc2UKKyAgRVhQRUNUX0VRKGUuZmluZF9maXJzdF9ub3Rfb2YoJ3gnKSwgU3RyaW5nUGllY2U6Om5wb3MpOworICBFWFBFQ1RfRVEoZS5maW5kX2ZpcnN0X25vdF9vZignXDAnKSwgU3RyaW5nUGllY2U6Om5wb3MpOworCisgIC8vICBTdHJpbmdQaWVjZSBnKCJ4eCBub3QgZm91bmQgYmIiKTsKKyAgU3RyaW5nUGllY2UgaSgiNTYiKTsKKyAgRVhQRUNUX0VRKGguZmluZF9sYXN0X29mKGEpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIEVYUEVDVF9FUShnLmZpbmRfbGFzdF9vZihhKSwgZy5zaXplKCktMSk7CisgIEVYUEVDVF9FUShhLmZpbmRfbGFzdF9vZihiKSwgMik7CisgIEVYUEVDVF9FUShhLmZpbmRfbGFzdF9vZihjKSwgYS5zaXplKCktMSk7CisgIEVYUEVDVF9FUShmLmZpbmRfbGFzdF9vZihpKSwgNik7CisgIEVYUEVDVF9FUShhLmZpbmRfbGFzdF9vZignYScpLCAwKTsKKyAgRVhQRUNUX0VRKGEuZmluZF9sYXN0X29mKCdiJyksIDEpOworICBFWFBFQ1RfRVEoYS5maW5kX2xhc3Rfb2YoJ3onKSwgMjUpOworICBFWFBFQ1RfRVEoYS5maW5kX2xhc3Rfb2YoJ2EnLCA1KSwgMCk7CisgIEVYUEVDVF9FUShhLmZpbmRfbGFzdF9vZignYicsIDUpLCAxKTsKKyAgRVhQRUNUX0VRKGEuZmluZF9sYXN0X29mKCdiJywgMCksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGEuZmluZF9sYXN0X29mKCd6JywgMjUpLCAyNSk7CisgIEVYUEVDVF9FUShhLmZpbmRfbGFzdF9vZigneicsIDI0KSwgU3RyaW5nUGllY2U6Om5wb3MpOworICBFWFBFQ1RfRVEoZi5maW5kX2xhc3Rfb2YoaSwgNSksIDUpOworICBFWFBFQ1RfRVEoZi5maW5kX2xhc3Rfb2YoaSwgNiksIDYpOworICBFWFBFQ1RfRVEoZi5maW5kX2xhc3Rfb2YoYSwgNCksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgLy8gZW1wdHkgc3RyaW5nIG5vbnNlbnNlCisgIEVYUEVDVF9FUShmLmZpbmRfbGFzdF9vZihlKSwgU3RyaW5nUGllY2U6Om5wb3MpOworICBFWFBFQ1RfRVEoZi5maW5kX2xhc3Rfb2YoZSwgNCksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGUuZmluZF9sYXN0X29mKGUpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIEVYUEVDVF9FUShlLmZpbmRfbGFzdF9vZihmKSwgU3RyaW5nUGllY2U6Om5wb3MpOworICBFWFBFQ1RfRVEoZS5maW5kX2xhc3Rfb2YoZSwgNCksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGUuZmluZF9sYXN0X29mKGYsIDQpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisKKyAgRVhQRUNUX0VRKGEuZmluZF9sYXN0X25vdF9vZihiKSwgYS5zaXplKCktMSk7CisgIEVYUEVDVF9FUShhLmZpbmRfbGFzdF9ub3Rfb2YoYyksIDIyKTsKKyAgRVhQRUNUX0VRKGIuZmluZF9sYXN0X25vdF9vZihhKSwgU3RyaW5nUGllY2U6Om5wb3MpOworICBFWFBFQ1RfRVEoYi5maW5kX2xhc3Rfbm90X29mKGIpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIEVYUEVDVF9FUShmLmZpbmRfbGFzdF9ub3Rfb2YoaSksIDQpOworICBFWFBFQ1RfRVEoYS5maW5kX2xhc3Rfbm90X29mKGMsIDI0KSwgMjIpOworICBFWFBFQ1RfRVEoYS5maW5kX2xhc3Rfbm90X29mKGIsIDMpLCAzKTsKKyAgRVhQRUNUX0VRKGEuZmluZF9sYXN0X25vdF9vZihiLCAyKSwgU3RyaW5nUGllY2U6Om5wb3MpOworICAvLyBlbXB0eSBzdHJpbmcgbm9uc2Vuc2UKKyAgRVhQRUNUX0VRKGYuZmluZF9sYXN0X25vdF9vZihlKSwgZi5zaXplKCktMSk7CisgIEVYUEVDVF9FUShmLmZpbmRfbGFzdF9ub3Rfb2YoZSwgNCksIDQpOworICBFWFBFQ1RfRVEoZS5maW5kX2xhc3Rfbm90X29mKGUpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIEVYUEVDVF9FUShlLmZpbmRfbGFzdF9ub3Rfb2YoZiksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGUuZmluZF9sYXN0X25vdF9vZihlLCA0KSwgU3RyaW5nUGllY2U6Om5wb3MpOworICBFWFBFQ1RfRVEoZS5maW5kX2xhc3Rfbm90X29mKGYsIDQpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisKKyAgRVhQRUNUX0VRKGguZmluZF9sYXN0X25vdF9vZigneCcpLCBoLnNpemUoKSAtIDEpOworICBFWFBFQ1RfRVEoaC5maW5kX2xhc3Rfbm90X29mKCc9JyksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGIuZmluZF9sYXN0X25vdF9vZignYycpLCAxKTsKKyAgRVhQRUNUX0VRKGguZmluZF9sYXN0X25vdF9vZigneCcsIDIpLCAyKTsKKyAgRVhQRUNUX0VRKGguZmluZF9sYXN0X25vdF9vZignPScsIDIpLCBTdHJpbmdQaWVjZTo6bnBvcyk7CisgIEVYUEVDVF9FUShiLmZpbmRfbGFzdF9ub3Rfb2YoJ2InLCAxKSwgMCk7CisgIC8vIGVtcHR5IHN0cmluZyBub25zZW5zZQorICBFWFBFQ1RfRVEoZS5maW5kX2xhc3Rfbm90X29mKCd4JyksIFN0cmluZ1BpZWNlOjpucG9zKTsKKyAgRVhQRUNUX0VRKGUuZmluZF9sYXN0X25vdF9vZignXDAnKSwgU3RyaW5nUGllY2U6Om5wb3MpOworCisgIEVYUEVDVF9FUShhLnN1YnN0cigwLCAzKSwgYik7CisgIEVYUEVDVF9FUShhLnN1YnN0cigyMyksIGMpOworICBFWFBFQ1RfRVEoYS5zdWJzdHIoMjMsIDMpLCBjKTsKKyAgRVhQRUNUX0VRKGEuc3Vic3RyKDIzLCA5OSksIGMpOworICBFWFBFQ1RfRVEoYS5zdWJzdHIoMCksIGEpOworICBFWFBFQ1RfRVEoYS5zdWJzdHIoMywgMiksICJkZSIpOworICAvLyBlbXB0eSBzdHJpbmcgbm9uc2Vuc2UKKyAgRVhQRUNUX0VRKGEuc3Vic3RyKDk5LCAyKSwgZSk7CisgIEVYUEVDVF9FUShlLnN1YnN0cig5OSksIGUpOworICBFWFBFQ1RfRVEoZS5zdWJzdHIoMCwgOTkpLCBlKTsKKyAgRVhQRUNUX0VRKGUuc3Vic3RyKDk5LCA5OSksIGUpOworICAvLyB1c2Ugb2YgbnBvcworICBFWFBFQ1RfRVEoYS5zdWJzdHIoMCwgU3RyaW5nUGllY2U6Om5wb3MpLCBhKTsKKyAgRVhQRUNUX0VRKGEuc3Vic3RyKDIzLCBTdHJpbmdQaWVjZTo6bnBvcyksIGMpOworICBFWFBFQ1RfRVEoYS5zdWJzdHIoU3RyaW5nUGllY2U6Om5wb3MsIDApLCBlKTsKKyAgRVhQRUNUX0VRKGEuc3Vic3RyKFN0cmluZ1BpZWNlOjpucG9zLCAxKSwgZSk7CisgIEVYUEVDVF9FUShhLnN1YnN0cihTdHJpbmdQaWVjZTo6bnBvcywgU3RyaW5nUGllY2U6Om5wb3MpLCBlKTsKK30KKworVEVTVChTdHJpbmdQaWVjZSwgQ3VzdG9tKSB7CisgIFN0cmluZ1BpZWNlIGEoImZvb2JhciIpOworICBzdGQ6OnN0cmluZyBzMSgiMTIzIik7CisgIHMxICs9ICdcMCc7CisgIHMxICs9ICI0NTYiOworICBTdHJpbmdQaWVjZSBiKHMxKTsKKyAgU3RyaW5nUGllY2UgZTsKKyAgc3RkOjpzdHJpbmcgczI7CisKKyAgLy8gQ29weVRvU3RyaW5nCisgIGEuQ29weVRvU3RyaW5nKCZzMik7CisgIEVYUEVDVF9FUShzMi5zaXplKCksIDYpOworICBFWFBFQ1RfRVEoczIsICJmb29iYXIiKTsKKyAgYi5Db3B5VG9TdHJpbmcoJnMyKTsKKyAgRVhQRUNUX0VRKHMyLnNpemUoKSwgNyk7CisgIEVYUEVDVF9FUShzMSwgczIpOworICBlLkNvcHlUb1N0cmluZygmczIpOworICBFWFBFQ1RfVFJVRShzMi5lbXB0eSgpKTsKKworICAvLyBBcHBlbmRUb1N0cmluZworICBzMi5lcmFzZSgpOworICBhLkFwcGVuZFRvU3RyaW5nKCZzMik7CisgIEVYUEVDVF9FUShzMi5zaXplKCksIDYpOworICBFWFBFQ1RfRVEoczIsICJmb29iYXIiKTsKKyAgYS5BcHBlbmRUb1N0cmluZygmczIpOworICBFWFBFQ1RfRVEoczIuc2l6ZSgpLCAxMik7CisgIEVYUEVDVF9FUShzMiwgImZvb2JhcmZvb2JhciIpOworCisgIC8vIHN0YXJ0c193aXRoCisgIEVYUEVDVF9UUlVFKGEuc3RhcnRzX3dpdGgoYSkpOworICBFWFBFQ1RfVFJVRShhLnN0YXJ0c193aXRoKCJmb28iKSk7CisgIEVYUEVDVF9UUlVFKGEuc3RhcnRzX3dpdGgoZSkpOworICBFWFBFQ1RfVFJVRShiLnN0YXJ0c193aXRoKHMxKSk7CisgIEVYUEVDVF9UUlVFKGIuc3RhcnRzX3dpdGgoYikpOworICBFWFBFQ1RfVFJVRShiLnN0YXJ0c193aXRoKGUpKTsKKyAgRVhQRUNUX1RSVUUoZS5zdGFydHNfd2l0aCgiIikpOworICBFWFBFQ1RfVFJVRSghYS5zdGFydHNfd2l0aChiKSk7CisgIEVYUEVDVF9UUlVFKCFiLnN0YXJ0c193aXRoKGEpKTsKKyAgRVhQRUNUX1RSVUUoIWUuc3RhcnRzX3dpdGgoYSkpOworCisgIC8vIGVuZHMgd2l0aAorICBFWFBFQ1RfVFJVRShhLmVuZHNfd2l0aChhKSk7CisgIEVYUEVDVF9UUlVFKGEuZW5kc193aXRoKCJiYXIiKSk7CisgIEVYUEVDVF9UUlVFKGEuZW5kc193aXRoKGUpKTsKKyAgRVhQRUNUX1RSVUUoYi5lbmRzX3dpdGgoczEpKTsKKyAgRVhQRUNUX1RSVUUoYi5lbmRzX3dpdGgoYikpOworICBFWFBFQ1RfVFJVRShiLmVuZHNfd2l0aChlKSk7CisgIEVYUEVDVF9UUlVFKGUuZW5kc193aXRoKCIiKSk7CisgIEVYUEVDVF9UUlVFKCFhLmVuZHNfd2l0aChiKSk7CisgIEVYUEVDVF9UUlVFKCFiLmVuZHNfd2l0aChhKSk7CisgIEVYUEVDVF9UUlVFKCFlLmVuZHNfd2l0aChhKSk7CisKKyAgLy8gcmVtb3ZlX3ByZWZpeAorICBTdHJpbmdQaWVjZSBjKGEpOworICBjLnJlbW92ZV9wcmVmaXgoMyk7CisgIEVYUEVDVF9FUShjLCAiYmFyIik7CisgIGMgPSBhOworICBjLnJlbW92ZV9wcmVmaXgoMCk7CisgIEVYUEVDVF9FUShjLCBhKTsKKyAgYy5yZW1vdmVfcHJlZml4KGMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKGMsIGUpOworCisgIC8vIHJlbW92ZV9zdWZmaXgKKyAgYyA9IGE7CisgIGMucmVtb3ZlX3N1ZmZpeCgzKTsKKyAgRVhQRUNUX0VRKGMsICJmb28iKTsKKyAgYyA9IGE7CisgIGMucmVtb3ZlX3N1ZmZpeCgwKTsKKyAgRVhQRUNUX0VRKGMsIGEpOworICBjLnJlbW92ZV9zdWZmaXgoYy5zaXplKCkpOworICBFWFBFQ1RfRVEoYywgZSk7CisKKyAgYyA9IFN0cmluZ1BpZWNlKCJmb29iYXIiLCA3KTsKKworICAvLyBhc19zdHJpbmcKKyAgc3RkOjpzdHJpbmcgczMoYS5hc19zdHJpbmcoKS5jX3N0cigpLCA3KTsKKyAgRVhQRUNUX0VRKGMsIHMzKTsKKyAgc3RkOjpzdHJpbmcgczQoZS5hc19zdHJpbmcoKSk7CisgIEVYUEVDVF9UUlVFKHM0LmVtcHR5KCkpOworCisgIC8vIFRvU3RyaW5nCisgIHsKKyAgICBzdGQ6OnN0cmluZyBzNShhLlRvU3RyaW5nKCkuY19zdHIoKSwgNyk7CisgICAgRVhQRUNUX0VRKGMsIHM1KTsKKyAgICBzdGQ6OnN0cmluZyBzNihlLlRvU3RyaW5nKCkpOworICAgIEVYUEVDVF9UUlVFKHM2LmVtcHR5KCkpOworICB9CisKKyAgLy8gQ29uc3VtZQorICB7CisgICAgU3RyaW5nUGllY2Ugc3RyKCJmb29iYXIiKTsKKyAgICBFWFBFQ1RfVFJVRShzdHIuQ29uc3VtZSgiZm9vIikpOworICAgIEVYUEVDVF9FUShzdHIsICJiYXIiKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RyLkNvbnN1bWUoImZvbyIpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RyLkNvbnN1bWUoImJhcmJhciIpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RyLkNvbnN1bWUoImFyIikpOworICAgIEVYUEVDVF9FUShzdHIsICJiYXIiKTsKKyAgfQorCisgIHsKKyAgICBTdHJpbmdQaWVjZSBzdHIoImZvb2JhciIpOworICAgIEVYUEVDVF9UUlVFKHN0ci5Db25zdW1lRnJvbUVuZCgiYmFyIikpOworICAgIEVYUEVDVF9FUShzdHIsICJmb28iKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RyLkNvbnN1bWVGcm9tRW5kKCJiYXIiKSk7CisgICAgRVhQRUNUX0ZBTFNFKHN0ci5Db25zdW1lRnJvbUVuZCgiZm9vZm9vIikpOworICAgIEVYUEVDVF9GQUxTRShzdHIuQ29uc3VtZUZyb21FbmQoImZvIikpOworICAgIEVYUEVDVF9FUShzdHIsICJmb28iKTsKKyAgfQorfQorCitURVNUKFN0cmluZ1BpZWNlLCBDb250YWlucykgeworICBTdHJpbmdQaWVjZSBhKCJhYmNkZWZnIik7CisgIFN0cmluZ1BpZWNlIGIoImFiY2QiKTsKKyAgU3RyaW5nUGllY2UgYygiZWZnIik7CisgIFN0cmluZ1BpZWNlIGQoImdoIik7CisgIEVYUEVDVF9UUlVFKGEuY29udGFpbnMoYikpOworICBFWFBFQ1RfVFJVRShhLmNvbnRhaW5zKGMpKTsKKyAgRVhQRUNUX1RSVUUoIWEuY29udGFpbnMoZCkpOworfQorCitURVNUKFN0cmluZ1BpZWNlLCBOdWxsSW5wdXQpIHsKKyAgLy8gd2UgdXNlZCB0byBjcmFzaCBoZXJlLCBidXQgbm93IHdlIGRvbid0LgorICBTdHJpbmdQaWVjZSBzKG51bGxwdHIpOworICBFWFBFQ1RfRVEocy5kYXRhKCksIChjb25zdCBjaGFyKiludWxscHRyKTsKKyAgRVhQRUNUX0VRKHMuc2l6ZSgpLCAwKTsKKworICAvLyAuVG9TdHJpbmcoKSBvbiBhIFN0cmluZ1BpZWNlIHdpdGggbnVsbHB0ciBzaG91bGQgcHJvZHVjZSB0aGUgZW1wdHkgc3RyaW5nLgorICBFWFBFQ1RfRVEoIiIsIHMuVG9TdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiIiwgcy5hc19zdHJpbmcoKSk7Cit9CisKK1RFU1QoU3RyaW5nUGllY2UsIENvbXBhcmlzb25zMikgeworICBTdHJpbmdQaWVjZSBhYmMoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Iik7CisKKyAgLy8gY2hlY2sgY29tcGFyaXNvbiBvcGVyYXRpb25zIG9uIHN0cmluZ3MgbG9uZ2VyIHRoYW4gNCBieXRlcy4KKyAgRVhQRUNUX0VRKGFiYywgU3RyaW5nUGllY2UoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikpOworICBFWFBFQ1RfRVEoYWJjLmNvbXBhcmUoU3RyaW5nUGllY2UoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikpLCAwKTsKKworICBFWFBFQ1RfTFQoYWJjLCBTdHJpbmdQaWVjZSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4enoiKSk7CisgIEVYUEVDVF9MVChhYmMuY29tcGFyZShTdHJpbmdQaWVjZSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4enoiKSksIDApOworCisgIEVYUEVDVF9HVChhYmMsIFN0cmluZ1BpZWNlKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eSIpKTsKKyAgRVhQRUNUX0dUKGFiYy5jb21wYXJlKFN0cmluZ1BpZWNlKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eSIpKSwgMCk7CisKKyAgLy8gc3RhcnRzX3dpdGgKKyAgRVhQRUNUX1RSVUUoYWJjLnN0YXJ0c193aXRoKGFiYykpOworICBFWFBFQ1RfVFJVRShhYmMuc3RhcnRzX3dpdGgoImFiY2RlZmdoaWprbG0iKSk7CisgIEVYUEVDVF9UUlVFKCFhYmMuc3RhcnRzX3dpdGgoImFiY2RlZmd1dnd4eXoiKSk7CisKKyAgLy8gZW5kc193aXRoCisgIEVYUEVDVF9UUlVFKGFiYy5lbmRzX3dpdGgoYWJjKSk7CisgIEVYUEVDVF9UUlVFKCFhYmMuZW5kc193aXRoKCJhYmNkZWZndXZ3eHl6IikpOworICBFWFBFQ1RfVFJVRShhYmMuZW5kc193aXRoKCJub3BxcnN0dXZ3eHl6IikpOworfQorCitURVNUKENvbXBhcmlzb25PcHNUZXN0LCBTdHJpbmdDb21wYXJlTm90QW1iaWd1b3VzKSB7CisgIEVYUEVDVF9FUSgiaGVsbG8iLCBzdGQ6OnN0cmluZygiaGVsbG8iKSk7CisgIEVYUEVDVF9MVCgiaGVsbG8iLCBzdGQ6OnN0cmluZygid29ybGQiKSk7Cit9CisKK1RFU1QoQ29tcGFyaXNvbk9wc1Rlc3QsIEhldGVyb2dlbm91c1N0cmluZ1BpZWNlRXF1YWxzKSB7CisgIEVYUEVDVF9FUShTdHJpbmdQaWVjZSgiaGVsbG8iKSwgc3RkOjpzdHJpbmcoImhlbGxvIikpOworICBFWFBFQ1RfRVEoImhlbGxvIiwgU3RyaW5nUGllY2UoImhlbGxvIikpOworfQorCitURVNUKEZpbmRPbmVDaGFyVGVzdCwgRWRnZUNhc2VzKSB7CisgIFN0cmluZ1BpZWNlIGEoInh4eXl5eHgiKTsKKworICAvLyBTZXQgYSA9ICJ4eXl5eCIuCisgIGEucmVtb3ZlX3ByZWZpeCgxKTsKKyAgYS5yZW1vdmVfc3VmZml4KDEpOworCisgIEVYUEVDVF9FUSgwLCBhLmZpbmQoJ3gnKSk7CisgIEVYUEVDVF9FUSgwLCBhLmZpbmQoJ3gnLCAwKSk7CisgIEVYUEVDVF9FUSg0LCBhLmZpbmQoJ3gnLCAxKSk7CisgIEVYUEVDVF9FUSg0LCBhLmZpbmQoJ3gnLCA0KSk7CisgIEVYUEVDVF9FUShTdHJpbmdQaWVjZTo6bnBvcywgYS5maW5kKCd4JywgNSkpOworCisgIEVYUEVDVF9FUSg0LCBhLnJmaW5kKCd4JykpOworICBFWFBFQ1RfRVEoNCwgYS5yZmluZCgneCcsIDUpKTsKKyAgRVhQRUNUX0VRKDQsIGEucmZpbmQoJ3gnLCA0KSk7CisgIEVYUEVDVF9FUSgwLCBhLnJmaW5kKCd4JywgMykpOworICBFWFBFQ1RfRVEoMCwgYS5yZmluZCgneCcsIDApKTsKKworICAvLyBTZXQgYSA9ICJ5eXkiLgorICBhLnJlbW92ZV9wcmVmaXgoMSk7CisgIGEucmVtb3ZlX3N1ZmZpeCgxKTsKKworICBFWFBFQ1RfRVEoU3RyaW5nUGllY2U6Om5wb3MsIGEuZmluZCgneCcpKTsKKyAgRVhQRUNUX0VRKFN0cmluZ1BpZWNlOjpucG9zLCBhLnJmaW5kKCd4JykpOworfQorCisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKyNpZm5kZWYgTkRFQlVHCitURVNUKE5vbk5lZ2F0aXZlTGVuVGVzdCwgTm9uTmVnYXRpdmVMZW4pIHsKKyAgRVhQRUNUX0RFQVRIKFN0cmluZ1BpZWNlKCJ4eXoiLCAtMSksICJzdHJpbmcgbGVuZ3RoIGV4Y2VlZHMgbWF4IHNpemUiKTsKK30KKyNlbmRpZiAgLy8gbmRlZiBERUJVRworI2VuZGlmICAvLyBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmFkNGMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuY2MKQEAgLTAsMCArMSwxNzUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBmcm9tIGdvb2dsZTMvYmFzZS9zdHJpbmdwcmludGYuY2MKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+IC8vIEZvciB2YV9saXN0IGFuZCByZWxhdGVkIG9wZXJhdGlvbnMKKyNpbmNsdWRlIDxzdGRpby5oPiAvLyBNU1ZDIHJlcXVpcmVzIHRoaXMgZm9yIF92c25wcmludGYKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisjaWZkZWYgX01TQ19WRVIKKyNpZm5kZWYgdmFfY29weQorLy8gRGVmaW5lIHZhX2NvcHkgZm9yIE1TVkMuIFRoaXMgaXMgYSBoYWNrLCBhc3N1bWluZyB2YV9saXN0IGlzIHNpbXBseSBhCisvLyBwb2ludGVyIGludG8gdGhlIHN0YWNrIGFuZCBpcyBzYWZlIHRvIGNvcHkuCisjZGVmaW5lIHZhX2NvcHkoZGVzdCwgc3JjKSAoKGRlc3QpID0gKHNyYykpCisjZW5kaWYKKyNlbmRpZgorCit2b2lkIFN0cmluZ0FwcGVuZFYoc3RkOjpzdHJpbmcqIGRzdCwgY29uc3QgY2hhciogZm9ybWF0LCB2YV9saXN0IGFwKSB7CisgIC8vIEZpcnN0IHRyeSB3aXRoIGEgc21hbGwgZml4ZWQgc2l6ZSBidWZmZXIKKyAgc3RhdGljIGNvbnN0IGludCBrU3BhY2VMZW5ndGggPSAxMDI0OworICBjaGFyIHNwYWNlW2tTcGFjZUxlbmd0aF07CisKKyAgLy8gSXQncyBwb3NzaWJsZSBmb3IgbWV0aG9kcyB0aGF0IHVzZSBhIHZhX2xpc3QgdG8gaW52YWxpZGF0ZQorICAvLyB0aGUgZGF0YSBpbiBpdCB1cG9uIHVzZS4gIFRoZSBmaXggaXMgdG8gbWFrZSBhIGNvcHkKKyAgLy8gb2YgdGhlIHN0cnVjdHVyZSBiZWZvcmUgdXNpbmcgaXQgYW5kIHVzZSB0aGF0IGNvcHkgaW5zdGVhZC4KKyAgdmFfbGlzdCBiYWNrdXBfYXA7CisgIHZhX2NvcHkoYmFja3VwX2FwLCBhcCk7CisgIGludCByZXN1bHQgPSB2c25wcmludGYoc3BhY2UsIGtTcGFjZUxlbmd0aCwgZm9ybWF0LCBiYWNrdXBfYXApOworICB2YV9lbmQoYmFja3VwX2FwKTsKKworICBpZiAocmVzdWx0IDwga1NwYWNlTGVuZ3RoKSB7CisgICAgaWYgKHJlc3VsdCA+PSAwKSB7CisgICAgICAvLyBOb3JtYWwgY2FzZSAtLSBldmVyeXRoaW5nIGZpdC4KKyAgICAgIGRzdC0+YXBwZW5kKHNwYWNlLCByZXN1bHQpOworICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIF9NU0NfVkVSCisgICAgeworICAgICAgLy8gRXJyb3Igb3IgTVNWQyBydW5uaW5nIG91dCBvZiBzcGFjZS4gIE1TVkMgOC4wIGFuZCBoaWdoZXIKKyAgICAgIC8vIGNhbiBiZSBhc2tlZCBhYm91dCBzcGFjZSBuZWVkZWQgd2l0aCB0aGUgc3BlY2lhbCBpZGlvbSBiZWxvdzoKKyAgICAgIHZhX2NvcHkoYmFja3VwX2FwLCBhcCk7CisgICAgICByZXN1bHQgPSB2c25wcmludGYobnVsbHB0ciwgMCwgZm9ybWF0LCBiYWNrdXBfYXApOworICAgICAgdmFfZW5kKGJhY2t1cF9hcCk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgLy8gSnVzdCBhbiBlcnJvci4KKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvLyBJbmNyZWFzZSB0aGUgYnVmZmVyIHNpemUgdG8gdGhlIHNpemUgcmVxdWVzdGVkIGJ5IHZzbnByaW50ZiwKKyAgLy8gcGx1cyBvbmUgZm9yIHRoZSBjbG9zaW5nIFwwLgorICBpbnQgbGVuZ3RoID0gcmVzdWx0KzE7CisgIGNoYXIqIGJ1ZiA9IG5ldyBjaGFyW2xlbmd0aF07CisKKyAgLy8gUmVzdG9yZSB0aGUgdmFfbGlzdCBiZWZvcmUgd2UgdXNlIGl0IGFnYWluCisgIHZhX2NvcHkoYmFja3VwX2FwLCBhcCk7CisgIHJlc3VsdCA9IHZzbnByaW50ZihidWYsIGxlbmd0aCwgZm9ybWF0LCBiYWNrdXBfYXApOworICB2YV9lbmQoYmFja3VwX2FwKTsKKworICBpZiAocmVzdWx0ID49IDAgJiYgcmVzdWx0IDwgbGVuZ3RoKSB7CisgICAgLy8gSXQgZml0CisgICAgZHN0LT5hcHBlbmQoYnVmLCByZXN1bHQpOworICB9CisgIGRlbGV0ZVtdIGJ1ZjsKK30KKworc3RkOjpzdHJpbmcgU3RyaW5nUHJpbnRmKGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIFN0cmluZ0FwcGVuZFYoJnJlc3VsdCwgZm9ybWF0LCBhcCk7CisgIHZhX2VuZChhcCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nJiBTU3RyaW5nUHJpbnRmKHN0ZDo6c3RyaW5nKiBkc3QsIGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworICBkc3QtPmNsZWFyKCk7CisgIFN0cmluZ0FwcGVuZFYoZHN0LCBmb3JtYXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKyAgcmV0dXJuICpkc3Q7Cit9CisKK3ZvaWQgU3RyaW5nQXBwZW5kRihzdGQ6OnN0cmluZyogZHN0LCBjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgU3RyaW5nQXBwZW5kVihkc3QsIGZvcm1hdCwgYXApOworICB2YV9lbmQoYXApOworfQorCisvLyBNYXggYXJndW1lbnRzIHN1cHBvcnRlZCBieSBTdHJpbmdQcmludFZlY3RvcgorY29uc3QgaW50IGtTdHJpbmdQcmludGZWZWN0b3JNYXhBcmdzID0gMzI7CisKKy8vIEFuIGVtcHR5IGJsb2NrIG9mIHplcm8gZm9yIGZpbGxlciBhcmd1bWVudHMuICBUaGlzIGlzIGNvbnN0IHNvIHRoYXQgaWYKKy8vIHByaW50ZiB0cmllcyB0byB3cml0ZSB0byBpdCAodmlhICVuKSB0aGVuIHRoZSBwcm9ncmFtIGdldHMgYSBTSUdTRUdWCisvLyBhbmQgd2UgY2FuIGZpeCB0aGUgcHJvYmxlbSBvciBwcm90ZWN0IGFnYWluc3QgYW4gYXR0YWNrLgorc3RhdGljIGNvbnN0IGNoYXIgc3RyaW5nX3ByaW50Zl9lbXB0eV9ibG9ja1syNTZdID0geyAnXDAnIH07CisKK3N0ZDo6c3RyaW5nIFN0cmluZ1ByaW50ZlZlY3Rvcihjb25zdCBjaGFyKiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB2KSB7CisgIEdPT0dMRV9DSEVDS19MRSh2LnNpemUoKSwga1N0cmluZ1ByaW50ZlZlY3Rvck1heEFyZ3MpCisgICAgICA8PCAiU3RyaW5nUHJpbnRmVmVjdG9yIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHVwIHRvICIKKyAgICAgIDw8IGtTdHJpbmdQcmludGZWZWN0b3JNYXhBcmdzIDw8ICIgYXJndW1lbnRzLiAiCisgICAgICA8PCAiRmVlbCBmcmVlIHRvIGFkZCBzdXBwb3J0IGZvciBtb3JlIGlmIHlvdSBuZWVkIGl0LiI7CisKKyAgLy8gQWRkIGZpbGxlciBhcmd1bWVudHMgc28gdGhhdCBib2d1cyBmb3JtYXQrYXJncyBoYXZlIGEgaGFyZGVyIHRpbWUKKyAgLy8gY3Jhc2hpbmcgdGhlIHByb2dyYW0sIGNvcnJ1cHRpbmcgdGhlIHByb2dyYW0gKCVuKSwKKyAgLy8gb3IgZGlzcGxheWluZyByYW5kb20gY2h1bmtzIG9mIG1lbW9yeSB0byB1c2Vycy4KKworICBjb25zdCBjaGFyKiBjc3RyW2tTdHJpbmdQcmludGZWZWN0b3JNYXhBcmdzXTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgKytpKSB7CisgICAgY3N0cltpXSA9IHZbaV0uY19zdHIoKTsKKyAgfQorICBmb3IgKGludCBpID0gdi5zaXplKCk7IGkgPCBHT09HTEVfQVJSQVlTSVpFKGNzdHIpOyArK2kpIHsKKyAgICBjc3RyW2ldID0gJnN0cmluZ19wcmludGZfZW1wdHlfYmxvY2tbMF07CisgIH0KKworICAvLyBJIGRvIG5vdCBrbm93IGFueSB3YXkgdG8gcGFzcyBrU3RyaW5nUHJpbnRmVmVjdG9yTWF4QXJncyBhcmd1bWVudHMsCisgIC8vIG9yIGFueSB3YXkgdG8gYnVpbGQgYSB2YV9saXN0IGJ5IGhhbmQsIG9yIGFueSBBUEkgZm9yIHByaW50ZgorICAvLyB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJndW1lbnRzLiAgVGhlIGJlc3QgSSBjYW4gZG8gaXMgc3RpY2sKKyAgLy8gdGhpcyBDT01QSUxFX0FTU0VSVCByaWdodCBuZXh0IHRvIHRoZSBhY3R1YWwgc3RhdGVtZW50LgorCisgIHN0YXRpY19hc3NlcnQoa1N0cmluZ1ByaW50ZlZlY3Rvck1heEFyZ3MgPT0gMzIsICJhcmdfY291bnRfbWlzbWF0Y2giKTsKKyAgcmV0dXJuIFN0cmluZ1ByaW50Zihmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgY3N0clswXSwgY3N0clsxXSwgY3N0clsyXSwgY3N0clszXSwgY3N0cls0XSwKKyAgICAgICAgICAgICAgICAgICAgICBjc3RyWzVdLCBjc3RyWzZdLCBjc3RyWzddLCBjc3RyWzhdLCBjc3RyWzldLAorICAgICAgICAgICAgICAgICAgICAgIGNzdHJbMTBdLCBjc3RyWzExXSwgY3N0clsxMl0sIGNzdHJbMTNdLCBjc3RyWzE0XSwKKyAgICAgICAgICAgICAgICAgICAgICBjc3RyWzE1XSwgY3N0clsxNl0sIGNzdHJbMTddLCBjc3RyWzE4XSwgY3N0clsxOV0sCisgICAgICAgICAgICAgICAgICAgICAgY3N0clsyMF0sIGNzdHJbMjFdLCBjc3RyWzIyXSwgY3N0clsyM10sIGNzdHJbMjRdLAorICAgICAgICAgICAgICAgICAgICAgIGNzdHJbMjVdLCBjc3RyWzI2XSwgY3N0clsyN10sIGNzdHJbMjhdLCBjc3RyWzI5XSwKKyAgICAgICAgICAgICAgICAgICAgICBjc3RyWzMwXSwgY3N0clszMV0pOworfQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzg1OGJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaApAQCAtMCwwICsxLDg1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gZnJvbSBnb29nbGUzL2Jhc2Uvc3RyaW5ncHJpbnRmLmgKKy8vCisvLyBQcmludGYgdmFyaWFudHMgdGhhdCBwbGFjZSB0aGVpciBvdXRwdXQgaW4gYSBDKysgc3RyaW5nLgorLy8KKy8vIFVzYWdlOgorLy8gICAgICBzdHJpbmcgcmVzdWx0ID0gU3RyaW5nUHJpbnRmKCIlZCAlc1xuIiwgMTAsICJoZWxsbyIpOworLy8gICAgICBTU3RyaW5nUHJpbnRmKCZyZXN1bHQsICIlZCAlc1xuIiwgMTAsICJoZWxsbyIpOworLy8gICAgICBTdHJpbmdBcHBlbmRGKCZyZXN1bHQsICIlZCAlc1xuIiwgMjAsICJ0aGVyZSIpOworCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVFJJTkdQUklOVEZfSAorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RSSU5HUFJJTlRGX0gKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vIFJldHVybiBhIEMrKyBzdHJpbmcKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gc3RkOjpzdHJpbmcgU3RyaW5nUHJpbnRmKGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKTsKKworLy8gU3RvcmUgcmVzdWx0IGludG8gYSBzdXBwbGllZCBzdHJpbmcgYW5kIHJldHVybiBpdAorUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBjb25zdCBzdGQ6OnN0cmluZyYgU1N0cmluZ1ByaW50ZihzdGQ6OnN0cmluZyogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7CisKKy8vIEFwcGVuZCByZXN1bHQgdG8gYSBzdXBwbGllZCBzdHJpbmcKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gdm9pZCBTdHJpbmdBcHBlbmRGKHN0ZDo6c3RyaW5nKiBkc3QsIGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7CisKKy8vIExvd2VyLWxldmVsIHJvdXRpbmUgdGhhdCB0YWtlcyBhIHZhX2xpc3QgYW5kIGFwcGVuZHMgdG8gYSBzcGVjaWZpZWQKKy8vIHN0cmluZy4gIEFsbCBvdGhlciByb3V0aW5lcyBhcmUganVzdCBjb252ZW5pZW5jZSB3cmFwcGVycyBhcm91bmQgaXQuCitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIHZvaWQgU3RyaW5nQXBwZW5kVihzdGQ6OnN0cmluZyogZHN0LCBjb25zdCBjaGFyKiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFwKTsKKworLy8gVGhlIG1heCBhcmd1bWVudHMgc3VwcG9ydGVkIGJ5IFN0cmluZ1ByaW50ZlZlY3RvcgorUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBjb25zdCBpbnQga1N0cmluZ1ByaW50ZlZlY3Rvck1heEFyZ3M7CisKKy8vIFlvdSBjYW4gdXNlIHRoaXMgdmVyc2lvbiB3aGVuIGFsbCB5b3VyIGFyZ3VtZW50cyBhcmUgc3RyaW5ncywgYnV0CisvLyB5b3UgZG9uJ3Qga25vdyBob3cgbWFueSBhcmd1bWVudHMgeW91J2xsIGhhdmUgYXQgY29tcGlsZSB0aW1lLgorLy8gU3RyaW5nUHJpbnRmVmVjdG9yIHdpbGwgTE9HKEZBVEFMKSBpZiB2LnNpemUoKSA+IGtTdHJpbmdQcmludGZWZWN0b3JNYXhBcmdzCitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIHN0ZDo6c3RyaW5nIFN0cmluZ1ByaW50ZlZlY3RvcigKKyAgICBjb25zdCBjaGFyKiBmb3JtYXQsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgdik7CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVFJJTkdQUklOVEZfSApkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmVjZDJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxNTUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBmcm9tIGdvb2dsZTMvYmFzZS9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGNlcnJubz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB7CisKK1RFU1QoU3RyaW5nUHJpbnRmVGVzdCwgRW1wdHkpIHsKKyNpZiAwCisgIC8vIGdjYyAyLjk1LjMsIGdjYyA0LjEuMCwgYW5kIGdjYyA0LjIuMiBhbGwgd2FybiBhYm91dCB0aGlzOgorICAvLyB3YXJuaW5nOiB6ZXJvLWxlbmd0aCBwcmludGYgZm9ybWF0IHN0cmluZy4KKyAgLy8gc28gd2UgZG8gbm90IGFsbG93IHRoZW0gaW4gZ29vZ2xlMy4KKyAgRVhQRUNUX0VRKCIiLCBTdHJpbmdQcmludGYoIiIpKTsKKyNlbmRpZgorICBFWFBFQ1RfRVEoIiIsIFN0cmluZ1ByaW50ZigiJXMiLCBzdGQ6OnN0cmluZygpLmNfc3RyKCkpKTsKKyAgRVhQRUNUX0VRKCIiLCBTdHJpbmdQcmludGYoIiVzIiwgIiIpKTsKK30KKworVEVTVChTdHJpbmdQcmludGZUZXN0LCBNaXNjKSB7CisvLyBNU1ZDIGFuZCBtaW5ndyBkb2VzIG5vdCBzdXBwb3J0ICQgZm9ybWF0IHNwZWNpZmllci4KKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pCisgIEVYUEVDVF9FUSgiMTIzaGVsbG8gdyIsIFN0cmluZ1ByaW50ZigiJTMkZCUyJHMgJTEkYyIsICd3JywgImhlbGxvIiwgMTIzKSk7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorfQorCitURVNUKFN0cmluZ0FwcGVuZEZUZXN0LCBFbXB0eSkgeworICBzdGQ6OnN0cmluZyB2YWx1ZSgiSGVsbG8iKTsKKyAgY29uc3QgY2hhciogZW1wdHkgPSAiIjsKKyAgU3RyaW5nQXBwZW5kRigmdmFsdWUsICIlcyIsIGVtcHR5KTsKKyAgRVhQRUNUX0VRKCJIZWxsbyIsIHZhbHVlKTsKK30KKworVEVTVChTdHJpbmdBcHBlbmRGVGVzdCwgRW1wdHlTdHJpbmcpIHsKKyAgc3RkOjpzdHJpbmcgdmFsdWUoIkhlbGxvIik7CisgIFN0cmluZ0FwcGVuZEYoJnZhbHVlLCAiJXMiLCAiIik7CisgIEVYUEVDVF9FUSgiSGVsbG8iLCB2YWx1ZSk7Cit9CisKK1RFU1QoU3RyaW5nQXBwZW5kRlRlc3QsIFN0cmluZykgeworICBzdGQ6OnN0cmluZyB2YWx1ZSgiSGVsbG8iKTsKKyAgU3RyaW5nQXBwZW5kRigmdmFsdWUsICIgJXMiLCAiV29ybGQiKTsKKyAgRVhQRUNUX0VRKCJIZWxsbyBXb3JsZCIsIHZhbHVlKTsKK30KKworVEVTVChTdHJpbmdBcHBlbmRGVGVzdCwgSW50KSB7CisgIHN0ZDo6c3RyaW5nIHZhbHVlKCJIZWxsbyIpOworICBTdHJpbmdBcHBlbmRGKCZ2YWx1ZSwgIiAlZCIsIDEyMyk7CisgIEVYUEVDVF9FUSgiSGVsbG8gMTIzIiwgdmFsdWUpOworfQorCitURVNUKFN0cmluZ1ByaW50ZlRlc3QsIE11bHRpYnl0ZSkgeworICAvLyBJZiB3ZSBhcmUgaW4gbXVsdGlieXRlIG1vZGUgYW5kIGZlZWQgaW52YWxpZCBtdWx0aWJ5dGUgc2VxdWVuY2UsCisgIC8vIFN0cmluZ1ByaW50ZiBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mIHJ1bm5pbmcKKyAgLy8gb3V0IG9mIG1lbW9yeSB3aGlsZSB0cnlpbmcgdG8gZGV0ZXJtaW5lIGRlc3RpbmF0aW9uIGJ1ZmZlciBzaXplLgorICAvLyBzZWUgYi80MTk0NTQzLgorCisgIGNoYXIqIG9sZF9sb2NhbGVfYyA9IHNldGxvY2FsZShMQ19DVFlQRSwgbnVsbHB0cik7CisgIEFTU0VSVF9UUlVFKG9sZF9sb2NhbGVfYyAhPSBudWxscHRyKTsKKyAgc3RkOjpzdHJpbmcgb2xkX2xvY2FsZSA9IG9sZF9sb2NhbGVfYzsKKyAgLy8gUHVzaCBsb2NhbGUgd2l0aCBtdWx0aWJ5dGUgbW9kZQorICBzZXRsb2NhbGUoTENfQ1RZUEUsICJlbl9VUy51dGY4Iik7CisKKyAgY29uc3QgY2hhciBrSW52YWxpZENvZGVQb2ludFtdID0gIlwzNzVcMDY3cyI7CisgIHN0ZDo6c3RyaW5nIHZhbHVlID0gU3RyaW5nUHJpbnRmKCIlLipzIiwgMywga0ludmFsaWRDb2RlUG9pbnQpOworCisgIC8vIEluIHNvbWUgdmVyc2lvbnMgb2YgZ2xpYmMgKGUuZy4gZWdsaWJjLTIuMTEuMSwgYWthIEdSVEV2MiksIHNucHJpbnRmCisgIC8vIHJldHVybnMgZXJyb3IgZ2l2ZW4gYW4gaW52YWxpZCBjb2RlcG9pbnQuIE90aGVyIHZlcnNpb25zCisgIC8vIChlLmcuIGVnbGliYy0yLjE1LCBha2EgcHJlLUdSVEV2MykgZW1pdCB0aGUgY29kZXBvaW50IHZlcmJhdGltLgorICAvLyBXZSB0ZXN0IHRoYXQgdGhlIG91dHB1dCBpcyBvbmUgb2YgdGhlIGFib3ZlLgorICBFWFBFQ1RfVFJVRSh2YWx1ZS5lbXB0eSgpIHx8IHZhbHVlID09IGtJbnZhbGlkQ29kZVBvaW50KTsKKworICAvLyBSZXBlYXQgd2l0aCBsb25nZXIgc3RyaW5nLCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZHluYW1pY2FsbHkKKyAgLy8gYWxsb2NhdGVkIHBhdGggaW4gU3RyaW5nQXBwZW5kViBpcyBoYW5kbGVkIGNvcnJlY3RseS4KKyAgY29uc3Qgc2l6ZV90IG4gPSAyMDQ4OworICBzdGQ6OmFycmF5PGNoYXIsIG4gKyAxPiBidWY7CisgIG1lbXNldCgmYnVmWzBdLCAnICcsIG4gLSAzKTsKKyAgbWVtY3B5KCZidWZbMF0gKyBuIC0gMywga0ludmFsaWRDb2RlUG9pbnQsIDQpOworICB2YWx1ZSA9IFN0cmluZ1ByaW50ZigiJS4qcyIsIG4sICZidWZbMF0pOworICAvLyBTZWUgR1JURXYyIHZzLiBHUlRFdjMgY29tbWVudCBhYm92ZS4KKyAgRVhQRUNUX1RSVUUodmFsdWUuZW1wdHkoKSB8fCB2YWx1ZSA9PSAmYnVmWzBdKTsKKworICBzZXRsb2NhbGUoTENfQ1RZUEUsIG9sZF9sb2NhbGUuY19zdHIoKSk7Cit9CisKK1RFU1QoU3RyaW5nUHJpbnRmVGVzdCwgTm9NdWx0aWJ5dGUpIHsKKyAgLy8gTm8gbXVsdGlieXRlIGhhbmRsaW5nLCBidXQgdGhlIHN0cmluZyBjb250YWlucyBmdW5ueSBjaGFycy4KKyAgY2hhciogb2xkX2xvY2FsZV9jID0gc2V0bG9jYWxlKExDX0NUWVBFLCBudWxscHRyKTsKKyAgQVNTRVJUX1RSVUUob2xkX2xvY2FsZV9jICE9IG51bGxwdHIpOworICBzdGQ6OnN0cmluZyBvbGRfbG9jYWxlID0gb2xkX2xvY2FsZV9jOworICBzZXRsb2NhbGUoTENfQ1RZUEUsICJQT1NJWCIpOworICBzdGQ6OnN0cmluZyB2YWx1ZSA9IFN0cmluZ1ByaW50ZigiJS4qcyIsIDMsICJcMzc1XDA2N3MiKTsKKyAgc2V0bG9jYWxlKExDX0NUWVBFLCBvbGRfbG9jYWxlLmNfc3RyKCkpOworICBFWFBFQ1RfRVEoIlwzNzVcMDY3cyIsIHZhbHVlKTsKK30KKworVEVTVChTdHJpbmdQcmludGZUZXN0LCBEb250T3ZlcndyaXRlRXJybm8pIHsKKyAgLy8gQ2hlY2sgdGhhdCBlcnJubyBpc24ndCBvdmVyd3JpdHRlbiB1bmxlc3Mgd2UncmUgcHJpbnRpbmcKKyAgLy8gc29tZXRoaW5nIHNpZ25pZmljYW50bHkgbGFyZ2VyIHRoYW4gd2hhdCBwZW9wbGUgYXJlIG5vcm1hbGx5CisgIC8vIHByaW50aW5nIGluIHRoZWlyIGJhZGx5IHdyaXR0ZW4gUExPRygpIHN0YXRlbWVudHMuCisgIGVycm5vID0gRUNISUxEOworICBzdGQ6OnN0cmluZyB2YWx1ZSA9IFN0cmluZ1ByaW50ZigiSGVsbG8sICVzISIsICJXb3JsZCIpOworICBFWFBFQ1RfRVEoRUNISUxELCBlcnJubyk7Cit9CisKK1RFU1QoU3RyaW5nUHJpbnRmVGVzdCwgTGFyZ2VCdWYpIHsKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgbGFyZ2UgYnVmZmVyIGlzIGhhbmRsZWQgY29ycmVjdGx5LgorICBpbnQgbiA9IDIwNDg7CisgIGNoYXIqIGJ1ZiA9IG5ldyBjaGFyW24rMV07CisgIG1lbXNldChidWYsICcgJywgbik7CisgIGJ1ZltuXSA9IDA7CisgIHN0ZDo6c3RyaW5nIHZhbHVlID0gU3RyaW5nUHJpbnRmKCIlcyIsIGJ1Zik7CisgIEVYUEVDVF9FUShidWYsIHZhbHVlKTsKKyAgZGVsZXRlW10gYnVmOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzNTczNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkLmNjCkBAIC0wLDAgKzEsNjE3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBqcm1AZ29vZ2xlLmNvbSAoSmltIE1lZWhhbikKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGVzZSBmb3VyLWJ5dGUgZW50cmllcyBjb21wYWN0bHkgZW5jb2RlIGhvdyBtYW55IGJ5dGVzIDAuLjI1NSB0byBkZWxldGUKKy8vIGluIG1ha2luZyBhIHN0cmluZyByZXBsYWNlbWVudCwgaG93IG1hbnkgYnl0ZXMgdG8gYWRkIDAuLjI1NSwgYW5kIHRoZSBvZmZzZXQKKy8vIDAuLjY0ay0xIG9mIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgaW4gcmVtYXBfc3RyaW5nLgorc3RydWN0IFJlbWFwRW50cnkgeworICB1aW50OF90IGRlbGV0ZV9ieXRlczsKKyAgdWludDhfdCBhZGRfYnl0ZXM7CisgIHVpbnQxNl90IGJ5dGVzX29mZnNldDsKK307CisKKy8vIEV4aXQgdHlwZSBjb2RlcyBmb3Igc3RhdGUgdGFibGVzLiBBbGwgYnV0IHRoZSBmaXJzdCBnZXQgc3R1ZmZlZCBpbnRvCisvLyBzaWduZWQgb25lLWJ5dGUgZW50cmllcy4gVGhlIGZpcnN0IGlzIG9ubHkgZ2VuZXJhdGVkIGJ5IGV4ZWN1dGFibGUgY29kZS4KKy8vIFRvIGRpc3Rpbmd1aXNoIGZyb20gbmV4dC1zdGF0ZSBlbnRyaWVzLCB0aGVzZSBtdXN0IGJlIGNvbnRpZ3VvdXMgYW5kCisvLyBhbGwgPD0ga0V4aXROb25lCit0eXBlZGVmIGVudW0geworICBrRXhpdERzdFNwYWNlRnVsbCA9IDIzOSwKKyAga0V4aXRJbGxlZ2FsU3RydWN0dXJlLCAgLy8gMjQwCisgIGtFeGl0T0ssICAgICAgICAgICAgICAgIC8vIDI0MQorICBrRXhpdFJlamVjdCwgICAgICAgICAgICAvLyAuLi4KKyAga0V4aXRSZXBsYWNlMSwKKyAga0V4aXRSZXBsYWNlMiwKKyAga0V4aXRSZXBsYWNlMywKKyAga0V4aXRSZXBsYWNlMjEsCisgIGtFeGl0UmVwbGFjZTMxLAorICBrRXhpdFJlcGxhY2UzMiwKKyAga0V4aXRSZXBsYWNlT2Zmc2V0MSwKKyAga0V4aXRSZXBsYWNlT2Zmc2V0MiwKKyAga0V4aXRSZXBsYWNlMVMwLAorICBrRXhpdFNwZWNpYWwsCisgIGtFeGl0RG9BZ2FpbiwKKyAga0V4aXRSZWplY3RBbHQsCisgIGtFeGl0Tm9uZSAgICAgICAgICAgICAgIC8vIDI1NQorfSBFeGl0UmVhc29uOworCisKKy8vIFRoaXMgc3RydWN0IHJlcHJlc2VudHMgb25lIGVudGlyZSBzdGF0ZSB0YWJsZS4gVGhlIHRocmVlIGluaXRpYWxpemVkIGJ5dGUKKy8vIGFyZWFzIGFyZSBzdGF0ZV90YWJsZSwgcmVtYXBfYmFzZSwgYW5kIHJlbWFwX3N0cmluZy4gc3RhdGUwIGFuZCBzdGF0ZTBfc2l6ZQorLy8gZ2l2ZSB0aGUgYnl0ZSBvZmZzZXQgYW5kIGxlbmd0aCB3aXRoaW4gc3RhdGVfdGFibGUgb2YgdGhlIGluaXRpYWwgc3RhdGUgLS0KKy8vIHRhYmxlIGxvb2t1cHMgYXJlIGV4cGVjdGVkIHRvIHN0YXJ0IGFuZCBlbmQgaW4gdGhpcyBzdGF0ZSwgYnV0IGZvcgorLy8gdHJ1bmNhdGVkIFVURi04IHN0cmluZ3MsIG1heSBlbmQgaW4gYSBkaWZmZXJlbnQgc3RhdGUuIFRoZXNlIGFsbG93IGEgcXVpY2sKKy8vIHRlc3QgZm9yIHRoYXQgY29uZGl0aW9uLiBlbnRyeV9zaGlmdCBpcyA4IGZvciB0YWJsZXMgc3Vic2NyaXB0ZWQgYnkgYSBmdWxsCisvLyBieXRlIHZhbHVlIGFuZCA2IGZvciBzcGFjZS1vcHRpbWl6ZWQgdGFibGVzIHN1YnNjcmlwdGVkIGJ5IG9ubHkgc2l4CisvLyBzaWduaWZpY2FudCBiaXRzIGluIFVURi04IGNvbnRpbnVhdGlvbiBieXRlcy4KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgdWludDMyX3Qgc3RhdGUwOworICBjb25zdCB1aW50MzJfdCBzdGF0ZTBfc2l6ZTsKKyAgY29uc3QgdWludDMyX3QgdG90YWxfc2l6ZTsKKyAgY29uc3QgaW50IG1heF9leHBhbmQ7CisgIGNvbnN0IGludCBlbnRyeV9zaGlmdDsKKyAgY29uc3QgaW50IGJ5dGVzX3Blcl9lbnRyeTsKKyAgY29uc3QgdWludDMyX3QgbG9zdWI7CisgIGNvbnN0IHVpbnQzMl90IGhpYWRkOworICBjb25zdCB1aW50OF90KiBzdGF0ZV90YWJsZTsKKyAgY29uc3QgUmVtYXBFbnRyeSogcmVtYXBfYmFzZTsKKyAgY29uc3QgdWludDhfdCogcmVtYXBfc3RyaW5nOworICBjb25zdCB1aW50OF90KiBmYXN0X3N0YXRlOworfSBVVEY4U3RhdGVNYWNoaW5lT2JqOworCit0eXBlZGVmIFVURjhTdGF0ZU1hY2hpbmVPYmogVVRGOFNjYW5PYmo7CisKKyNkZWZpbmUgWF9fIChrRXhpdElsbGVnYWxTdHJ1Y3R1cmUpCisjZGVmaW5lIFJKXyAoa0V4aXRSZWplY3QpCisjZGVmaW5lIFMxXyAoa0V4aXRSZXBsYWNlMSkKKyNkZWZpbmUgUzJfIChrRXhpdFJlcGxhY2UyKQorI2RlZmluZSBTM18gKGtFeGl0UmVwbGFjZTMpCisjZGVmaW5lIFMyMSAoa0V4aXRSZXBsYWNlMjEpCisjZGVmaW5lIFMzMSAoa0V4aXRSZXBsYWNlMzEpCisjZGVmaW5lIFMzMiAoa0V4aXRSZXBsYWNlMzIpCisjZGVmaW5lIFQxXyAoa0V4aXRSZXBsYWNlT2Zmc2V0MSkKKyNkZWZpbmUgVDJfIChrRXhpdFJlcGxhY2VPZmZzZXQyKQorI2RlZmluZSBTMTEgKGtFeGl0UmVwbGFjZTFTMCkKKyNkZWZpbmUgU1BfIChrRXhpdFNwZWNpYWwpCisjZGVmaW5lIERfXyAoa0V4aXREb0FnYWluKQorI2RlZmluZSBSSkEgKGtFeGl0UmVqZWN0QWx0KQorCisvLyAgRW50aXJlIHRhYmxlIGhhcyA5IHN0YXRlIGJsb2NrcyBvZiAyNTYgZW50cmllcyBlYWNoCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX1NUQVRFMCA9IDA7ICAgICAvLyBzdGF0ZVswXQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19TVEFURTBfU0laRSA9IDI1NjsgIC8vID1bMV0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfVE9UQUxfU0laRSA9IDIzMDQ7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX01BWF9FWFBBTkRfWDQgPSAwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19TSElGVCA9IDg7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX0JZVEVTID0gMTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfTE9TVUIgPSAweDIwMjAyMDIwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19ISUFERCA9IDB4MDAwMDAwMDA7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzW10gPSB7CisvLyBzdGF0ZVswXSAweDAwMDAwMCBCeXRlIDEKKyAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisKKyAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKK1hfXywgWF9fLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsCisgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLAorICAyLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICA3LCAgIDMsICAgMywKKyAgNCwgICA1LCAgIDUsICAgNSwgICA2LCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKy8vIHN0YXRlWzFdIDB4MDAwMDgwIEJ5dGUgMiBvZiAyCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCisgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCisvLyBzdGF0ZVsyXSAweDAwMDAwMCBCeXRlIDIgb2YgMworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLAorICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworLy8gc3RhdGVbM10gMHgwMDEwMDAgQnl0ZSAyIG9mIDMKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKyAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsCisgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLAorICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKy8vIHN0YXRlWzRdIDB4MDAwMDAwIEJ5dGUgMiBvZiA0CitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywKKyAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsCisgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCisvLyBzdGF0ZVs1XSAweDA0MDAwMCBCeXRlIDIgb2YgNAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywKKyAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsCisgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLAorICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworLy8gc3RhdGVbNl0gMHgxMDAwMDAgQnl0ZSAyIG9mIDQKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKyAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKy8vIHN0YXRlWzddIDB4MDBkMDAwIEJ5dGUgMiBvZiAzCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCisgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLAorICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsCisgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCisvLyBzdGF0ZVs4XSAweDAwZDgwMCBCeXRlIDMgb2YgMworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sICBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywKK1JKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCAgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sCitSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLAorUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sICBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK307CisKKy8vIFJlbWFwIGJhc2VbMF0gPSAoZGVsLCBhZGQsIHN0cmluZ19vZmZzZXQpCitzdGF0aWMgY29uc3QgUmVtYXBFbnRyeSB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19yZW1hcF9iYXNlW10gPSB7Cit7MCwgMCwgMH0gfTsKKworLy8gUmVtYXAgc3RyaW5nWzBdCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19yZW1hcF9zdHJpbmdbXSA9IHsKKzAgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfZmFzdFsyNTZdID0geworMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisKKzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCisxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKworMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCit9OworCitzdGF0aWMgY29uc3QgVVRGOFNjYW5PYmogdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfb2JqID0geworICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19TVEFURTAsCisgIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX1NUQVRFMF9TSVpFLAorICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19UT1RBTF9TSVpFLAorICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19NQVhfRVhQQU5EX1g0LAorICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19TSElGVCwKKyAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfQllURVMsCisgIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX0xPU1VCLAorICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19ISUFERCwKKyAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXMsCisgIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX3JlbWFwX2Jhc2UsCisgIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX3JlbWFwX3N0cmluZywKKyAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfZmFzdAorfTsKKworCisjdW5kZWYgWF9fCisjdW5kZWYgUkpfCisjdW5kZWYgUzFfCisjdW5kZWYgUzJfCisjdW5kZWYgUzNfCisjdW5kZWYgUzIxCisjdW5kZWYgUzMxCisjdW5kZWYgUzMyCisjdW5kZWYgVDFfCisjdW5kZWYgVDJfCisjdW5kZWYgUzExCisjdW5kZWYgU1BfCisjdW5kZWYgRF9fCisjdW5kZWYgUkpBCisKKy8vIFJldHVybiB0cnVlIGlmIGN1cnJlbnQgVGJsIHBvaW50ZXIgaXMgd2l0aGluIHN0YXRlMCByYW5nZQorLy8gTm90ZSB0aGF0IHVuc2lnbmVkIGNvbXBhcmUgY2hlY2tzIGJvdGggZW5kcyBvZiByYW5nZSBzaW11bHRhbmVvdXNseQorc3RhdGljIGlubGluZSBib29sIEluU3RhdGVaZXJvKGNvbnN0IFVURjhTY2FuT2JqKiBzdCwgY29uc3QgdWludDhfdCogVGJsKSB7CisgIGNvbnN0IHVpbnQ4X3QqIFRibDAgPSAmc3QtPnN0YXRlX3RhYmxlW3N0LT5zdGF0ZTBdOworICByZXR1cm4gKHN0YXRpY19jYXN0PHVpbnQzMl90PihUYmwgLSBUYmwwKSA8IHN0LT5zdGF0ZTBfc2l6ZSk7Cit9CisKK25hbWVzcGFjZSB7CisKKy8vIFNjYW4gYSBVVEYtOCBzdHJpbmcgYmFzZWQgb24gc3RhdGUgdGFibGUuCisvLyBBbHdheXMgc2NhbiBjb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXJzCisvLyBTZXQgbnVtYmVyIG9mIGJ5dGVzIHNjYW5uZWQuIFJldHVybiByZWFzb24gZm9yIGV4aXRpbmcKK2ludCBVVEY4R2VuZXJpY1NjYW4oY29uc3QgVVRGOFNjYW5PYmoqIHN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogc3RyLAorICAgICAgICAgICAgICAgICAgICBpbnQgc3RyX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgaW50KiBieXRlc19jb25zdW1lZCkgeworICAqYnl0ZXNfY29uc3VtZWQgPSAwOworICBpZiAoc3RyX2xlbmd0aCA9PSAwKSByZXR1cm4ga0V4aXRPSzsKKworICBpbnQgZXNoaWZ0ID0gc3QtPmVudHJ5X3NoaWZ0OworICBjb25zdCB1aW50OF90KiBpc3JjID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oc3RyKTsKKyAgY29uc3QgdWludDhfdCogc3JjID0gaXNyYzsKKyAgY29uc3QgdWludDhfdCogc3JjbGltaXQgPSBpc3JjICsgc3RyX2xlbmd0aDsKKyAgY29uc3QgdWludDhfdCogc3JjbGltaXQ4ID0gc3RyX2xlbmd0aCA8IDcgPyBpc3JjIDogc3JjbGltaXQgLSA3OworICBjb25zdCB1aW50OF90KiBUYmxfMCA9ICZzdC0+c3RhdGVfdGFibGVbc3QtPnN0YXRlMF07CisKKyBEb0FnYWluOgorICAvLyBEbyBzdGF0ZS10YWJsZSBzY2FuCisgIGludCBlID0gMDsKKyAgdWludDhfdCBjOworICBjb25zdCB1aW50OF90KiBUYmwyID0gJnN0LT5mYXN0X3N0YXRlWzBdOworICBjb25zdCB1aW50MzJfdCBsb3N1YiA9IHN0LT5sb3N1YjsKKyAgY29uc3QgdWludDMyX3QgaGlhZGQgPSBzdC0+aGlhZGQ7CisgIC8vIENoZWNrIGluaXRpYWwgZmV3IGJ5dGVzIG9uZSBhdCBhIHRpbWUgdW50aWwgOC1ieXRlIGFsaWduZWQKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHdoaWxlICgoKCh1aW50cHRyX3Qpc3JjICYgMHgwNykgIT0gMCkgJiYKKyAgICAgICAgIChzcmMgPCBzcmNsaW1pdCkgJiYKKyAgICAgICAgIFRibDJbc3JjWzBdXSA9PSAwKSB7CisgICAgc3JjKys7CisgIH0KKyAgaWYgKCgodWludHB0cl90KXNyYyAmIDB4MDcpID09IDApIHsKKyAgICAvLyBEbyBmYXN0IGZvciBncm91cHMgb2YgOCBpZGVudGl0eSBieXRlcy4KKyAgICAvLyBUaGlzIGNvdmVycyBhIGxvdCBvZiA3LWJpdCBBU0NJSSB+OHggZmFzdGVyIHRoZW4gdGhlIDEtYnl0ZSBsb29wLAorICAgIC8vIGluY2x1ZGluZyBzbG93aW5nIHNsaWdodGx5IG9uIGNyL2xmL2h0CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd2hpbGUgKHNyYyA8IHNyY2xpbWl0OCkgeworICAgICAgdWludDMyX3QgczAxMjMgPSAocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPihzcmMpKVswXTsKKyAgICAgIHVpbnQzMl90IHM0NTY3ID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oc3JjKSlbMV07CisgICAgICBzcmMgKz0gODsKKyAgICAgIC8vIFRoaXMgaXMgYSBmYXN0IHJhbmdlIGNoZWNrIGZvciBhbGwgYnl0ZXMgaW4gW2xvd3N1Yi4uMHg4MC1oaWFkZCkKKyAgICAgIHVpbnQzMl90IHRlbXAgPSAoczAxMjMgLSBsb3N1YikgfCAoczAxMjMgKyBoaWFkZCkgfAorICAgICAgICAgICAgICAgICAgICAgIChzNDU2NyAtIGxvc3ViKSB8IChzNDU2NyArIGhpYWRkKTsKKyAgICAgIGlmICgodGVtcCAmIDB4ODA4MDgwODApICE9IDApIHsKKyAgICAgICAgLy8gV2UgdHlwaWNhbGx5IGVuZCB1cCBoZXJlIG9uIGNyL2xmL2h0OyBzcmMgd2FzIGluY3JlbWVudGVkCisgICAgICAgIGludCBlMDEyMyA9IChUYmwyW3NyY1stOF1dIHwgVGJsMltzcmNbLTddXSkgfAorICAgICAgICAgICAgICAgICAgICAoVGJsMltzcmNbLTZdXSB8IFRibDJbc3JjWy01XV0pOworICAgICAgICBpZiAoZTAxMjMgIT0gMCkgeworICAgICAgICAgIHNyYyAtPSA4OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9ICAgIC8vIEV4aXQgb24gTm9uLWludGVyY2hhbmdlCisgICAgICAgIGUwMTIzID0gKFRibDJbc3JjWy00XV0gfCBUYmwyW3NyY1stM11dKSB8CisgICAgICAgICAgICAgICAgKFRibDJbc3JjWy0yXV0gfCBUYmwyW3NyY1stMV1dKTsKKyAgICAgICAgaWYgKGUwMTIzICE9IDApIHsKKyAgICAgICAgICBzcmMgLT0gNDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAgICAvLyBFeGl0IG9uIE5vbi1pbnRlcmNoYW5nZQorICAgICAgICAvLyBFbHNlIE9LLCBnbyBhcm91bmQgYWdhaW4KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gQnl0ZS1hdC1hLXRpbWUgc2NhbgorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgY29uc3QgdWludDhfdCogVGJsID0gVGJsXzA7CisgIHdoaWxlIChzcmMgPCBzcmNsaW1pdCkgeworICAgIGMgPSAqc3JjOworICAgIGUgPSBUYmxbY107CisgICAgc3JjKys7CisgICAgaWYgKGUgPj0ga0V4aXRJbGxlZ2FsU3RydWN0dXJlKSB7YnJlYWs7fQorICAgIFRibCA9ICZUYmxfMFtlIDw8IGVzaGlmdF07CisgIH0KKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gRXhpdCBwb3NzaWJpbGl0aWVzOgorICAvLyAgU29tZSBleGl0IGNvZGUsICFzdGF0ZTAsIGJhY2sgdXAgb3ZlciBsYXN0IGNoYXIKKyAgLy8gIFNvbWUgZXhpdCBjb2RlLCBzdGF0ZTAsIGJhY2sgdXAgb25lIGJ5dGUgZXhhY3RseQorICAvLyAgc291cmNlIGNvbnN1bWVkLCAhc3RhdGUwLCBiYWNrIHVwIG92ZXIgcGFydGlhbCBjaGFyCisgIC8vICBzb3VyY2UgY29uc3VtZWQsIHN0YXRlMCwgZXhpdCBPSworICAvLyBGb3IgaWxsZWdhbCBieXRlIGluIHN0YXRlMCwgYXZvaWQgYmFja3VwIHVwIG92ZXIgUFJFVklPVVMgY2hhcgorICAvLyBGb3IgdHJ1bmNhdGVkIGxhc3QgY2hhciwgYmFjayB1cCB0byBiZWdpbm5pbmcgb2YgaXQKKworICBpZiAoZSA+PSBrRXhpdElsbGVnYWxTdHJ1Y3R1cmUpIHsKKyAgICAvLyBCYWNrIHVwIG92ZXIgZXhhY3RseSBvbmUgYnl0ZSBvZiByZWplY3RlZC9pbGxlZ2FsIFVURi04IGNoYXJhY3RlcgorICAgIHNyYy0tOworICAgIC8vIEJhY2sgdXAgbW9yZSBpZiBuZWVkZWQKKyAgICBpZiAoIUluU3RhdGVaZXJvKHN0LCBUYmwpKSB7CisgICAgICBkbyB7CisgICAgICAgIHNyYy0tOworICAgICAgfSB3aGlsZSAoKHNyYyA+IGlzcmMpICYmICgoc3JjWzBdICYgMHhjMCkgPT0gMHg4MCkpOworICAgIH0KKyAgfSBlbHNlIGlmICghSW5TdGF0ZVplcm8oc3QsIFRibCkpIHsKKyAgICAvLyBCYWNrIHVwIG92ZXIgdHJ1bmNhdGVkIFVURi04IGNoYXJhY3RlcgorICAgIGUgPSBrRXhpdElsbGVnYWxTdHJ1Y3R1cmU7CisgICAgZG8geworICAgICAgc3JjLS07CisgICAgfSB3aGlsZSAoKHNyYyA+IGlzcmMpICYmICgoc3JjWzBdICYgMHhjMCkgPT0gMHg4MCkpOworICB9IGVsc2UgeworICAgIC8vIE5vcm1hbCB0ZXJtaW5hdGlvbiwgc291cmNlIGZ1bGx5IGNvbnN1bWVkCisgICAgZSA9IGtFeGl0T0s7CisgIH0KKworICBpZiAoZSA9PSBrRXhpdERvQWdhaW4pIHsKKyAgICAvLyBMb29wIGJhY2sgdXAgdG8gdGhlIGZhc3Qgc2NhbgorICAgIGdvdG8gRG9BZ2FpbjsKKyAgfQorCisgICpieXRlc19jb25zdW1lZCA9IHNyYyAtIGlzcmM7CisgIHJldHVybiBlOworfQorCitpbnQgVVRGOEdlbmVyaWNTY2FuRmFzdEFzY2lpKGNvbnN0IFVURjhTY2FuT2JqKiBzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0cl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIGludCogYnl0ZXNfY29uc3VtZWQpIHsKKyAgKmJ5dGVzX2NvbnN1bWVkID0gMDsKKyAgaWYgKHN0cl9sZW5ndGggPT0gMCkgcmV0dXJuIGtFeGl0T0s7CisKKyAgY29uc3QgdWludDhfdCogaXNyYyA9ICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzdHIpOworICBjb25zdCB1aW50OF90KiBzcmMgPSBpc3JjOworICBjb25zdCB1aW50OF90KiBzcmNsaW1pdCA9IGlzcmMgKyBzdHJfbGVuZ3RoOworICBjb25zdCB1aW50OF90KiBzcmNsaW1pdDggPSBzdHJfbGVuZ3RoIDwgNyA/IGlzcmMgOiBzcmNsaW1pdCAtIDc7CisgIGludCBuOworICBpbnQgcmVzdF9jb25zdW1lZDsKKyAgaW50IGV4aXRfcmVhc29uOworICBkbyB7CisgICAgLy8gQ2hlY2sgaW5pdGlhbCBmZXcgYnl0ZXMgb25lIGF0IGEgdGltZSB1bnRpbCA4LWJ5dGUgYWxpZ25lZAorICAgIHdoaWxlICgoKCh1aW50cHRyX3Qpc3JjICYgMHgwNykgIT0gMCkgJiYKKyAgICAgICAgICAgKHNyYyA8IHNyY2xpbWl0KSAmJiAoc3JjWzBdIDwgMHg4MCkpIHsKKyAgICAgIHNyYysrOworICAgIH0KKyAgICBpZiAoKCh1aW50cHRyX3Qpc3JjICYgMHgwNykgPT0gMCkgeworICAgICAgd2hpbGUgKChzcmMgPCBzcmNsaW1pdDgpICYmCisgICAgICAgICAgICAgKCgocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KHNyYylbMF0gfAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihzcmMpWzFdKSAmCisgICAgICAgICAgICAgICAweDgwODA4MDgwKSA9PSAwKSkgeworICAgICAgICBzcmMgKz0gODsKKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKChzcmMgPCBzcmNsaW1pdCkgJiYgKHNyY1swXSA8IDB4ODApKSB7CisgICAgICBzcmMrKzsKKyAgICB9CisgICAgLy8gUnVuIHN0YXRlIHRhYmxlIG9uIHRoZSByZXN0CisgICAgbiA9IHNyYyAtIGlzcmM7CisgICAgZXhpdF9yZWFzb24gPSBVVEY4R2VuZXJpY1NjYW4oc3QsIHN0ciArIG4sIHN0cl9sZW5ndGggLSBuLCAmcmVzdF9jb25zdW1lZCk7CisgICAgc3JjICs9IHJlc3RfY29uc3VtZWQ7CisgIH0gd2hpbGUgKCBleGl0X3JlYXNvbiA9PSBrRXhpdERvQWdhaW4gKTsKKworICAqYnl0ZXNfY29uc3VtZWQgPSBzcmMgLSBpc3JjOworICByZXR1cm4gZXhpdF9yZWFzb247Cit9CisKKy8vIEhhY2s6ICBPbiBzb21lIGNvbXBpbGVycyB0aGUgc3RhdGljIHRhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgYXQgc3RhcnR1cC4KKy8vICAgV2UgY2FuJ3QgdXNlIHRoZW0gdW50aWwgdGhleSBhcmUgaW5pdGlhbGl6ZWQuICBIb3dldmVyLCBzb21lIFByb3RvY29sCisvLyAgIEJ1ZmZlciBwYXJzaW5nIGhhcHBlbnMgYXQgc3RhdGljIGluaXQgdGltZSBhbmQgbWF5IHRyeSB0byB2YWxpZGF0ZQorLy8gICBVVEYtOCBzdHJpbmdzLiAgU2luY2UgVVRGLTggdmFsaWRhdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZworLy8gICBhbnl3YXksIHdlIHNpbXBseSBhbHdheXMgcmV0dXJuIHN1Y2Nlc3MgaWYgaW5pdGlhbGl6YXRpb24gaGFzbid0CisvLyAgIG9jY3VycmVkIHlldC4KKworYm9vbCBtb2R1bGVfaW5pdGlhbGl6ZWRfID0gZmFsc2U7CisKK3N0cnVjdCBJbml0RGV0ZWN0b3IgeworICBJbml0RGV0ZWN0b3IoKSB7CisgICAgbW9kdWxlX2luaXRpYWxpemVkXyA9IHRydWU7CisgIH0KK307CitJbml0RGV0ZWN0b3IgaW5pdF9kZXRlY3RvcjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgSXNTdHJ1Y3R1cmFsbHlWYWxpZFVURjgoY29uc3QgY2hhciogYnVmLCBpbnQgbGVuKSB7CisgIGlmICghbW9kdWxlX2luaXRpYWxpemVkXykgcmV0dXJuIHRydWU7CisKKyAgaW50IGJ5dGVzX2NvbnN1bWVkID0gMDsKKyAgVVRGOEdlbmVyaWNTY2FuRmFzdEFzY2lpKCZ1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGxlbiwgJmJ5dGVzX2NvbnN1bWVkKTsKKyAgcmV0dXJuIChieXRlc19jb25zdW1lZCA9PSBsZW4pOworfQorCitpbnQgVVRGOFNwblN0cnVjdHVyYWxseVZhbGlkKFN0cmluZ1BpZWNlIHN0cikgeworICBpZiAoIW1vZHVsZV9pbml0aWFsaXplZF8pIHJldHVybiBzdHIuc2l6ZSgpOworCisgIGludCBieXRlc19jb25zdW1lZCA9IDA7CisgIFVURjhHZW5lcmljU2NhbkZhc3RBc2NpaSgmdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLmRhdGEoKSwgc3RyLnNpemUoKSwgJmJ5dGVzX2NvbnN1bWVkKTsKKyAgcmV0dXJuIGJ5dGVzX2NvbnN1bWVkOworfQorCisvLyBDb2VyY2UgVVRGLTggYnl0ZSBzdHJpbmcgaW4gc3JjX3N0ciB0byBiZQorLy8gYSBzdHJ1Y3R1cmFsbHktdmFsaWQgZXF1YWwtbGVuZ3RoIHN0cmluZyBieSBzZWxlY3RpdmVseQorLy8gb3ZlcndyaXRpbmcgaWxsZWdhbCBieXRlcyB3aXRoIHJlcGxhY2VfY2hhciAodHlwaWNhbGx5IGJsYW5rKS4KKy8vIHJlcGxhY2VfY2hhciBtdXN0IGJlIGxlZ2FsIHByaW50YWJsZSA3LWJpdCBBc2NpaSAweDIwLi4weDdlLgorLy8gc3JjX3N0ciBpcyByZWFkLW9ubHkuIElmIGFueSBvdmVyd3JpdGluZyBpcyBuZWVkZWQsIGEgbW9kaWZpZWQgYnl0ZSBzdHJpbmcKKy8vIGlzIGNyZWF0ZWQgaW4gaWRzdCwgbGVuZ3RoIGlzcmNsZW4uCisvLworLy8gUmV0dXJucyBwb2ludGVyIHRvIG91dHB1dCBidWZmZXIsIGlzcmMgaWYgbm8gY2hhbmdlcyB3ZXJlIG1hZGUsCisvLyAgb3IgaWRzdCBpZiBzb21lIGJ5dGVzIHdlcmUgY2hhbmdlZC4KKy8vCisvLyBGYXN0IGNhc2U6IGFsbCBpcyBzdHJ1Y3R1cmFsbHkgdmFsaWQgYW5kIG5vIGJ5dGUgY29weWluZyBpcyBkb25lLgorLy8KK2NoYXIqIFVURjhDb2VyY2VUb1N0cnVjdHVyYWxseVZhbGlkKFN0cmluZ1BpZWNlIHNyY19zdHIsIGNoYXIqIGlkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIHJlcGxhY2VfY2hhcikgeworICBjb25zdCBjaGFyKiBpc3JjID0gc3JjX3N0ci5kYXRhKCk7CisgIGNvbnN0IGludCBsZW4gPSBzcmNfc3RyLmxlbmd0aCgpOworICBpbnQgbiA9IFVURjhTcG5TdHJ1Y3R1cmFsbHlWYWxpZChzcmNfc3RyKTsKKyAgaWYgKG4gPT0gbGVuKSB7ICAgICAgICAgICAgICAgLy8gTm9ybWFsIGNhc2UgLS0gYWxsIGlzIGNvb2wsIHJldHVybgorICAgIHJldHVybiBjb25zdF9jYXN0PGNoYXIqPihpc3JjKTsKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLy8gVW51c3VhbCBjYXNlIC0tIGNvcHkgdy9vIGJhZCBieXRlcworICAgIGNvbnN0IGNoYXIqIHNyYyA9IGlzcmM7CisgICAgY29uc3QgY2hhciogc3JjbGltaXQgPSBpc3JjICsgbGVuOworICAgIGNoYXIqIGRzdCA9IGlkc3Q7CisgICAgbWVtbW92ZShkc3QsIHNyYywgbik7ICAgICAgIC8vIENvcHkgaW5pdGlhbCBnb29kIGNodW5rCisgICAgc3JjICs9IG47CisgICAgZHN0ICs9IG47CisgICAgd2hpbGUgKHNyYyA8IHNyY2xpbWl0KSB7ICAgIC8vIHNyYyBwb2ludHMgdG8gYm9ndXMgYnl0ZSBvciBpcyBvZmYgdGhlIGVuZAorICAgICAgZHN0WzBdID0gcmVwbGFjZV9jaGFyOyAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBvbmUgYmFkIGJ5dGUKKyAgICAgIHNyYysrOworICAgICAgZHN0Kys7CisgICAgICBTdHJpbmdQaWVjZSBzdHIyKHNyYywgc3JjbGltaXQgLSBzcmMpOworICAgICAgbiA9IFVURjhTcG5TdHJ1Y3R1cmFsbHlWYWxpZChzdHIyKTsgICAgICAgLy8gc2NhbiB0aGUgcmVtYWluZGVyCisgICAgICBtZW1tb3ZlKGRzdCwgc3JjLCBuKTsgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG5leHQgZ29vZCBjaHVuaworICAgICAgc3JjICs9IG47CisgICAgICBkc3QgKz0gbjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGlkc3Q7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDljNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDcxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIEF1dGhvcjogeHBlbmdAZ29vZ2xlLmNvbSAoUGV0ZXIgUGVuZykKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKworVEVTVChTdHJ1Y3R1cmFsbHlWYWxpZFRlc3QsIFZhbGlkVVRGOFN0cmluZykgeworICAvLyBPbiBHQ0MsIHRoaXMgc3RyaW5nIGNhbiBiZSB3cml0dGVuIGFzOgorICAvLyAgICJhYmNkIDEyMzQgLSBcdTIwMTRcdTIwMTNcdTIyMTIiCisgIC8vIE1TVkMgc2VlbXMgdG8gaW50ZXJwcmV0IFx1IGRpZmZlcmVudGx5LgorICBzdGQ6OnN0cmluZyB2YWxpZF9zdHIoCisgICAgICAiYWJjZCAxMjM0IC0gXDM0MlwyMDBcMjI0XDM0MlwyMDBcMjIzXDM0MlwyMTBcMjIyIC0geHl6Nzg5Iik7CisgIEVYUEVDVF9UUlVFKElzU3RydWN0dXJhbGx5VmFsaWRVVEY4KHZhbGlkX3N0ci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkX3N0ci5zaXplKCkpKTsKKyAgLy8gQWRkaXRpb25hbCBjaGVjayBmb3IgcG9pbnRlciBhbGlnbm1lbnQKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCA4OyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShJc1N0cnVjdHVyYWxseVZhbGlkVVRGOCh2YWxpZF9zdHIuZGF0YSgpICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZF9zdHIuc2l6ZSgpIC0gaSkpOworICB9Cit9CisKK1RFU1QoU3RydWN0dXJhbGx5VmFsaWRUZXN0LCBJbnZhbGlkVVRGOFN0cmluZykgeworICBjb25zdCBzdGQ6OnN0cmluZyBpbnZhbGlkX3N0cigiYWJjZFx4QTBceEIwXHhBMFx4QjBceEEwXHhCMCAtIHh5ejc4OSIpOworICBFWFBFQ1RfRkFMU0UoSXNTdHJ1Y3R1cmFsbHlWYWxpZFVURjgoaW52YWxpZF9zdHIuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZF9zdHIuc2l6ZSgpKSk7CisgIC8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIHBvaW50ZXIgYWxpZ25tZW50CisgIGZvciAoaW50IGkgPSAxOyBpIDwgODsgKytpKSB7CisgICAgRVhQRUNUX0ZBTFNFKElzU3RydWN0dXJhbGx5VmFsaWRVVEY4KGludmFsaWRfc3RyLmRhdGEoKSArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRfc3RyLnNpemUoKSAtIGkpKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0YzhlYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5jYwpAQCAtMCwwICsxLDI0NzkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBmcm9tIGdvb2dsZTMvc3RyaW5ncy9zdHJ1dGlsLmNjCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmbG9hdC5oPiAgICAvLyBGTFRfRElHIGFuZCBEQkxfRElHCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCisjaWZkZWYgX1dJTjMyCisvLyBNU1ZDIGhhcyBvbmx5IF9zbnByaW50Ziwgbm90IHNucHJpbnRmLgorLy8KKy8vIE1pbkdXIGhhcyBib3RoIHNucHJpbnRmIGFuZCBfc25wcmludGYsIGJ1dCB0aGV5IGFwcGVhciB0byBiZSBkaWZmZXJlbnQKKy8vIGZ1bmN0aW9ucy4gIFRoZSBmb3JtZXIgaXMgYnVnZ3kuICBXaGVuIGludm9rZWQgbGlrZSBzbzoKKy8vICAgY2hhciBidWZmZXJbMzJdOworLy8gICBzbnByaW50ZihidWZmZXIsIDMyLCAiJS4qZ1xuIiwgRkxUX0RJRywgMS4yM2UxMGYpOworLy8gaXQgcHJpbnRzICIxLjIzMDAwZSsxMCIuICBUaGlzIGlzIHBsYWlubHkgd3Jvbmc6ICAlZyBzaG91bGQgbmV2ZXIgcHJpbnQKKy8vIHRyYWlsaW5nIHplcm9zIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LiAgRm9yIHNvbWUgcmVhc29uIHRoaXMgYnVnIG9ubHkKKy8vIG9jY3VycyB3aXRoIHNvbWUgaW5wdXQgdmFsdWVzLCBub3QgYWxsLiAgSW4gYW55IGNhc2UsIF9zbnByaW50ZiBkb2VzIHRoZQorLy8gcmlnaHQgdGhpbmcsIHNvIHdlIHVzZSBpdC4KKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBUaGVzZSBhcmUgZGVmaW5lZCBhcyBtYWNyb3Mgb24gc29tZSBwbGF0Zm9ybXMuICAjdW5kZWYgdGhlbSBzbyB0aGF0IHdlIGNhbgorLy8gcmVkZWZpbmUgdGhlbS4KKyN1bmRlZiBpc3hkaWdpdAorI3VuZGVmIGlzcHJpbnQKKworLy8gVGhlIGRlZmluaXRpb25zIG9mIHRoZXNlIGluIGN0eXBlLmggY2hhbmdlIGJhc2VkIG9uIGxvY2FsZS4gIFNpbmNlIG91cgorLy8gc3RyaW5nIG1hbmlwdWxhdGlvbiBpcyBhbGwgaW4gcmVsYXRpb24gdG8gdGhlIHByb3RvY29sIGJ1ZmZlciBhbmQgQysrCisvLyBsYW5ndWFnZXMsIHdlIGFsd2F5cyB3YW50IHRvIHVzZSB0aGUgQyBsb2NhbGUuICBTbywgd2UgcmUtZGVmaW5lIHRoZXNlCisvLyBleGFjdGx5IGFzIHdlIHdhbnQgdGhlbS4KK2lubGluZSBib29sIGlzeGRpZ2l0KGNoYXIgYykgeworICByZXR1cm4gKCcwJyA8PSBjICYmIGMgPD0gJzknKSB8fAorICAgICAgICAgKCdhJyA8PSBjICYmIGMgPD0gJ2YnKSB8fAorICAgICAgICAgKCdBJyA8PSBjICYmIGMgPD0gJ0YnKTsKK30KKworaW5saW5lIGJvb2wgaXNwcmludChjaGFyIGMpIHsKKyAgcmV0dXJuIGMgPj0gMHgyMCAmJiBjIDw9IDB4N0U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJlcGxhY2VDaGFyYWN0ZXJzCisvLyAgICBSZXBsYWNlcyBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgY2hhcmFjdGVyICdyZW1vdmUnIChvciB0aGUgY2hhcmFjdGVycworLy8gICAgaW4gJ3JlbW92ZScpIHdpdGggdGhlIGNoYXJhY3RlciAncmVwbGFjZXdpdGgnLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBSZXBsYWNlQ2hhcmFjdGVycyhzdGQ6OnN0cmluZyAqcywgY29uc3QgY2hhciAqcmVtb3ZlLCBjaGFyIHJlcGxhY2V3aXRoKSB7CisgIGNvbnN0IGNoYXIgKnN0cl9zdGFydCA9IHMtPmNfc3RyKCk7CisgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cl9zdGFydDsKKyAgZm9yIChzdHIgPSBzdHJwYnJrKHN0ciwgcmVtb3ZlKTsKKyAgICAgICBzdHIgIT0gbnVsbHB0cjsKKyAgICAgICBzdHIgPSBzdHJwYnJrKHN0ciArIDEsIHJlbW92ZSkpIHsKKyAgICAoKnMpW3N0ciAtIHN0cl9zdGFydF0gPSByZXBsYWNld2l0aDsKKyAgfQorfQorCit2b2lkIFN0cmlwV2hpdGVzcGFjZShzdGQ6OnN0cmluZyAqc3RyKSB7CisgIGludCBzdHJfbGVuZ3RoID0gc3RyLT5sZW5ndGgoKTsKKworICAvLyBTdHJpcCBvZmYgbGVhZGluZyB3aGl0ZXNwYWNlLgorICBpbnQgZmlyc3QgPSAwOworICB3aGlsZSAoZmlyc3QgPCBzdHJfbGVuZ3RoICYmIGFzY2lpX2lzc3BhY2Uoc3RyLT5hdChmaXJzdCkpKSB7CisgICAgKytmaXJzdDsKKyAgfQorICAvLyBJZiBlbnRpcmUgc3RyaW5nIGlzIHdoaXRlIHNwYWNlLgorICBpZiAoZmlyc3QgPT0gc3RyX2xlbmd0aCkgeworICAgIHN0ci0+Y2xlYXIoKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGZpcnN0ID4gMCkgeworICAgIHN0ci0+ZXJhc2UoMCwgZmlyc3QpOworICAgIHN0cl9sZW5ndGggLT0gZmlyc3Q7CisgIH0KKworICAvLyBTdHJpcCBvZmYgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAgaW50IGxhc3QgPSBzdHJfbGVuZ3RoIC0gMTsKKyAgd2hpbGUgKGxhc3QgPj0gMCAmJiBhc2NpaV9pc3NwYWNlKHN0ci0+YXQobGFzdCkpKSB7CisgICAgLS1sYXN0OworICB9CisgIGlmIChsYXN0ICE9IChzdHJfbGVuZ3RoIC0gMSkgJiYgbGFzdCA+PSAwKSB7CisgICAgc3RyLT5lcmFzZShsYXN0ICsgMSwgc3RkOjpzdHJpbmc6Om5wb3MpOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0cmluZ1JlcGxhY2UoKQorLy8gICAgUmVwbGFjZSB0aGUgIm9sZCIgcGF0dGVybiB3aXRoIHRoZSAibmV3IiBwYXR0ZXJuIGluIGEgc3RyaW5nLAorLy8gICAgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvICJyZXMiLiAgSWYgcmVwbGFjZV9hbGwgaXMgZmFsc2UsCisvLyAgICBpdCBvbmx5IHJlcGxhY2VzIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiAib2xkLiIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBTdHJpbmdSZXBsYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZzLCBjb25zdCBzdGQ6OnN0cmluZyAmb2xkc3ViLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuZXdzdWIsIGJvb2wgcmVwbGFjZV9hbGwsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKnJlcykgeworICBpZiAob2xkc3ViLmVtcHR5KCkpIHsKKyAgICByZXMtPmFwcGVuZChzKTsgIC8vIGlmIGVtcHR5LCBhcHBlbmQgdGhlIGdpdmVuIHN0cmluZy4KKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHN0YXJ0X3BvcyA9IDA7CisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zOworICBkbyB7CisgICAgcG9zID0gcy5maW5kKG9sZHN1Yiwgc3RhcnRfcG9zKTsKKyAgICBpZiAocG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcmVzLT5hcHBlbmQocywgc3RhcnRfcG9zLCBwb3MgLSBzdGFydF9wb3MpOworICAgIHJlcy0+YXBwZW5kKG5ld3N1Yik7CisgICAgc3RhcnRfcG9zID0gcG9zICsgb2xkc3ViLnNpemUoKTsgIC8vIHN0YXJ0IHNlYXJjaGluZyBhZ2FpbiBhZnRlciB0aGUgIm9sZCIKKyAgfSB3aGlsZSAocmVwbGFjZV9hbGwpOworICByZXMtPmFwcGVuZChzLCBzdGFydF9wb3MsIHMubGVuZ3RoKCkgLSBzdGFydF9wb3MpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdHJpbmdSZXBsYWNlKCkKKy8vICAgIEdpdmUgbWUgYSBzdHJpbmcgYW5kIHR3byBwYXR0ZXJucyAib2xkIiBhbmQgIm5ldyIsIGFuZCBJIHJlcGxhY2UKKy8vICAgIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiAib2xkIiBpbiB0aGUgc3RyaW5nIHdpdGggIm5ldyIsIGlmIGl0CisvLyAgICBleGlzdHMuICBJZiAiZ2xvYmFsIiBpcyB0cnVlOyBjYWxsIHRoaXMgcmVwZWF0ZWRseSB1bnRpbCBpdAorLy8gICAgZmFpbHMuICBSRVRVUk4gYSBuZXcgc3RyaW5nLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHJlcGxhY2VtZW50CisvLyAgICBoYXBwZW5lZCBvciBub3QuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0ZDo6c3RyaW5nIFN0cmluZ1JlcGxhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJnMsIGNvbnN0IHN0ZDo6c3RyaW5nICZvbGRzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuZXdzdWIsIGJvb2wgcmVwbGFjZV9hbGwpIHsKKyAgc3RkOjpzdHJpbmcgcmV0OworICBTdHJpbmdSZXBsYWNlKHMsIG9sZHN1YiwgbmV3c3ViLCByZXBsYWNlX2FsbCwgJnJldCk7CisgIHJldHVybiByZXQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNwbGl0U3RyaW5nVXNpbmcoKQorLy8gICAgU3BsaXQgYSBzdHJpbmcgdXNpbmcgYSBjaGFyYWN0ZXIgZGVsaW1pdGVyLiBBcHBlbmQgdGhlIGNvbXBvbmVudHMKKy8vICAgIHRvICdyZXN1bHQnLgorLy8KKy8vIE5vdGU6IEZvciBtdWx0aS1jaGFyYWN0ZXIgZGVsaW1pdGVycywgdGhpcyByb3V0aW5lIHdpbGwgc3BsaXQgb24gKkFOWSogb2YKKy8vIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcsIG5vdCB0aGUgZW50aXJlIHN0cmluZyBhcyBhIHNpbmdsZSBkZWxpbWl0ZXIuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVRSPgorc3RhdGljIGlubGluZSB2b2lkIFNwbGl0U3RyaW5nVG9JdGVyYXRvclVzaW5nKFN0cmluZ1BpZWNlIGZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVsaW0sIElUUiAmcmVzdWx0KSB7CisgIC8vIE9wdGltaXplIHRoZSBjb21tb24gY2FzZSB3aGVyZSBkZWxpbSBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgIGlmIChkZWxpbVswXSAhPSAnXDAnICYmIGRlbGltWzFdID09ICdcMCcpIHsKKyAgICBjaGFyIGMgPSBkZWxpbVswXTsKKyAgICBjb25zdCBjaGFyKiBwID0gZnVsbC5kYXRhKCk7CisgICAgY29uc3QgY2hhciogZW5kID0gcCArIGZ1bGwuc2l6ZSgpOworICAgIHdoaWxlIChwICE9IGVuZCkgeworICAgICAgaWYgKCpwID09IGMpIHsKKyAgICAgICAgKytwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgY2hhciogc3RhcnQgPSBwOworICAgICAgICB3aGlsZSAoKytwICE9IGVuZCAmJiAqcCAhPSBjKTsKKyAgICAgICAgKnJlc3VsdCsrID0gc3RkOjpzdHJpbmcoc3RhcnQsIHAgLSBzdGFydCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgYmVnaW5faW5kZXgsIGVuZF9pbmRleDsKKyAgYmVnaW5faW5kZXggPSBmdWxsLmZpbmRfZmlyc3Rfbm90X29mKGRlbGltKTsKKyAgd2hpbGUgKGJlZ2luX2luZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgZW5kX2luZGV4ID0gZnVsbC5maW5kX2ZpcnN0X29mKGRlbGltLCBiZWdpbl9pbmRleCk7CisgICAgaWYgKGVuZF9pbmRleCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgKnJlc3VsdCsrID0gc3RkOjpzdHJpbmcoZnVsbC5zdWJzdHIoYmVnaW5faW5kZXgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgKnJlc3VsdCsrID0KKyAgICAgICAgc3RkOjpzdHJpbmcoZnVsbC5zdWJzdHIoYmVnaW5faW5kZXgsIChlbmRfaW5kZXggLSBiZWdpbl9pbmRleCkpKTsKKyAgICBiZWdpbl9pbmRleCA9IGZ1bGwuZmluZF9maXJzdF9ub3Rfb2YoZGVsaW0sIGVuZF9pbmRleCk7CisgIH0KK30KKwordm9pZCBTcGxpdFN0cmluZ1VzaW5nKFN0cmluZ1BpZWNlIGZ1bGwsIGNvbnN0IGNoYXIgKmRlbGltLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqcmVzdWx0KSB7CisgIHN0ZDo6YmFja19pbnNlcnRfaXRlcmF0b3I8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ID4gaXQoKnJlc3VsdCk7CisgIFNwbGl0U3RyaW5nVG9JdGVyYXRvclVzaW5nKGZ1bGwsIGRlbGltLCBpdCk7Cit9CisKKy8vIFNwbGl0IGEgc3RyaW5nIHVzaW5nIGEgY2hhcmFjdGVyIGRlbGltaXRlci4gQXBwZW5kIHRoZSBjb21wb25lbnRzCisvLyB0byAncmVzdWx0Jy4gIElmIHRoZXJlIGFyZSBjb25zZWN1dGl2ZSBkZWxpbWl0ZXJzLCB0aGlzIGZ1bmN0aW9uCisvLyB3aWxsIHJldHVybiBjb3JyZXNwb25kaW5nIGVtcHR5IHN0cmluZ3MuIFRoZSBzdHJpbmcgaXMgc3BsaXQgaW50bworLy8gYXQgbW9zdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBwaWVjZXMgZ3JlZWRpbHkuIFRoaXMgbWVhbnMgdGhhdCB0aGUKKy8vIGxhc3QgcGllY2UgbWF5IHBvc3NpYmx5IGJlIHNwbGl0IGZ1cnRoZXIuIFRvIHNwbGl0IGludG8gYXMgbWFueSBwaWVjZXMKKy8vIGFzIHBvc3NpYmxlLCBzcGVjaWZ5IDAgYXMgdGhlIG51bWJlciBvZiBwaWVjZXMuCisvLworLy8gSWYgImZ1bGwiIGlzIHRoZSBlbXB0eSBzdHJpbmcsIHlpZWxkcyBhbiBlbXB0eSBzdHJpbmcgYXMgdGhlIG9ubHkgdmFsdWUuCisvLworLy8gSWYgInBpZWNlcyIgaXMgbmVnYXRpdmUgZm9yIHNvbWUgcmVhc29uLCBpdCByZXR1cm5zIHRoZSB3aG9sZSBzdHJpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RlbXBsYXRlIDx0eXBlbmFtZSBJVFI+CitzdGF0aWMgaW5saW5lIHZvaWQgU3BsaXRTdHJpbmdUb0l0ZXJhdG9yQWxsb3dFbXB0eShTdHJpbmdQaWVjZSBmdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGllY2VzLCBJVFIgJnJlc3VsdCkgeworICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGJlZ2luX2luZGV4LCBlbmRfaW5kZXg7CisgIGJlZ2luX2luZGV4ID0gMDsKKworICBmb3IgKGludCBpID0gMDsgKGkgPCBwaWVjZXMtMSkgfHwgKHBpZWNlcyA9PSAwKTsgaSsrKSB7CisgICAgZW5kX2luZGV4ID0gZnVsbC5maW5kX2ZpcnN0X29mKGRlbGltLCBiZWdpbl9pbmRleCk7CisgICAgaWYgKGVuZF9pbmRleCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgKnJlc3VsdCsrID0gc3RkOjpzdHJpbmcoZnVsbC5zdWJzdHIoYmVnaW5faW5kZXgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgKnJlc3VsdCsrID0KKyAgICAgICAgc3RkOjpzdHJpbmcoZnVsbC5zdWJzdHIoYmVnaW5faW5kZXgsIChlbmRfaW5kZXggLSBiZWdpbl9pbmRleCkpKTsKKyAgICBiZWdpbl9pbmRleCA9IGVuZF9pbmRleCArIDE7CisgIH0KKyAgKnJlc3VsdCsrID0gc3RkOjpzdHJpbmcoZnVsbC5zdWJzdHIoYmVnaW5faW5kZXgpKTsKK30KKwordm9pZCBTcGxpdFN0cmluZ0FsbG93RW1wdHkoU3RyaW5nUGllY2UgZnVsbCwgY29uc3QgY2hhciAqZGVsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKnJlc3VsdCkgeworICBzdGQ6OmJhY2tfaW5zZXJ0X2l0ZXJhdG9yPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiA+IGl0KCpyZXN1bHQpOworICBTcGxpdFN0cmluZ1RvSXRlcmF0b3JBbGxvd0VtcHR5KGZ1bGwsIGRlbGltLCAwLCBpdCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEpvaW5TdHJpbmdzKCkKKy8vICAgIFRoaXMgbWVyZ2VzIGEgdmVjdG9yIG9mIHN0cmluZyBjb21wb25lbnRzIHdpdGggZGVsaW0gaW5zZXJ0ZWQKKy8vICAgIGFzIHNlcGFyYXRlcnMgYmV0d2VlbiBjb21wb25lbnRzLgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RlbXBsYXRlIDxjbGFzcyBJVEVSQVRPUj4KK3N0YXRpYyB2b2lkIEpvaW5TdHJpbmdzSXRlcmF0b3IoY29uc3QgSVRFUkFUT1IgJnN0YXJ0LCBjb25zdCBJVEVSQVRPUiAmZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZWxpbSwgc3RkOjpzdHJpbmcgKnJlc3VsdCkgeworICBHT09HTEVfQ0hFQ0socmVzdWx0ICE9IG51bGxwdHIpOworICByZXN1bHQtPmNsZWFyKCk7CisgIGludCBkZWxpbV9sZW5ndGggPSBzdHJsZW4oZGVsaW0pOworCisgIC8vIFByZWNvbXB1dGUgcmVzdWx0aW5nIGxlbmd0aCBzbyB3ZSBjYW4gcmVzZXJ2ZSgpIG1lbW9yeSBpbiBvbmUgc2hvdC4KKyAgaW50IGxlbmd0aCA9IDA7CisgIGZvciAoSVRFUkFUT1IgaXRlciA9IHN0YXJ0OyBpdGVyICE9IGVuZDsgKytpdGVyKSB7CisgICAgaWYgKGl0ZXIgIT0gc3RhcnQpIHsKKyAgICAgIGxlbmd0aCArPSBkZWxpbV9sZW5ndGg7CisgICAgfQorICAgIGxlbmd0aCArPSBpdGVyLT5zaXplKCk7CisgIH0KKyAgcmVzdWx0LT5yZXNlcnZlKGxlbmd0aCk7CisKKyAgLy8gTm93IGNvbWJpbmUgZXZlcnl0aGluZy4KKyAgZm9yIChJVEVSQVRPUiBpdGVyID0gc3RhcnQ7IGl0ZXIgIT0gZW5kOyArK2l0ZXIpIHsKKyAgICBpZiAoaXRlciAhPSBzdGFydCkgeworICAgICAgcmVzdWx0LT5hcHBlbmQoZGVsaW0sIGRlbGltX2xlbmd0aCk7CisgICAgfQorICAgIHJlc3VsdC0+YXBwZW5kKGl0ZXItPmRhdGEoKSwgaXRlci0+c2l6ZSgpKTsKKyAgfQorfQorCit2b2lkIEpvaW5TdHJpbmdzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmY29tcG9uZW50cywgY29uc3QgY2hhciAqZGVsaW0sCisgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpyZXN1bHQpIHsKKyAgSm9pblN0cmluZ3NJdGVyYXRvcihjb21wb25lbnRzLmJlZ2luKCksIGNvbXBvbmVudHMuZW5kKCksIGRlbGltLCByZXN1bHQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoKQorLy8gICAgVGhpcyBkb2VzIGFsbCB0aGUgdW5lc2NhcGluZyB0aGF0IEMgZG9lczogXG9vbywgXHIsIFxuLCBldGMKKy8vICAgIFJldHVybnMgbGVuZ3RoIG9mIHJlc3VsdGluZyBzdHJpbmcuCisvLyAgICBUaGUgaW1wbGVtZW50YXRpb24gb2YgXHggcGFyc2VzIGFueSBwb3NpdGl2ZSBudW1iZXIgb2YgaGV4IGRpZ2l0cywKKy8vICAgIGJ1dCBpdCBpcyBhbiBlcnJvciBpZiB0aGUgdmFsdWUgcmVxdWlyZXMgbW9yZSB0aGFuIDggYml0cywgYW5kIHRoZQorLy8gICAgcmVzdWx0IGlzIHRydW5jYXRlZCB0byA4IGJpdHMuCisvLworLy8gICAgVGhlIHNlY29uZCBjYWxsIHN0b3JlcyBpdHMgZXJyb3JzIGluIGEgc3VwcGxpZWQgc3RyaW5nIHZlY3Rvci4KKy8vICAgIElmIHRoZSBzdHJpbmcgdmVjdG9yIHBvaW50ZXIgaXMgbnVsbHB0ciwgaXQgcmVwb3J0cyB0aGUgZXJyb3JzIHdpdGggTE9HKCkuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgSVNfT0NUQUxfRElHSVQoYykgKCgoYykgPj0gJzAnKSAmJiAoKGMpIDw9ICc3JykpCisKKy8vIFByb3RvY29sIGJ1ZmZlcnMgZG9lc24ndCBldmVyIGNhcmUgYWJvdXQgZXJyb3JzLCBidXQgSSBkb24ndCB3YW50IHRvIHJlbW92ZQorLy8gdGhlIGNvZGUuCisjZGVmaW5lIExPR19TVFJJTkcoTEVWRUwsIFZFQ1RPUikgR09PR0xFX0xPR19JRihMRVZFTCwgZmFsc2UpCisKK2ludCBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoY29uc3QgY2hhciogc291cmNlLCBjaGFyKiBkZXN0KSB7CisgIHJldHVybiBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoc291cmNlLCBkZXN0LCBudWxscHRyKTsKK30KKworaW50IFVuZXNjYXBlQ0VzY2FwZVNlcXVlbmNlcyhjb25zdCBjaGFyICpzb3VyY2UsIGNoYXIgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqZXJyb3JzKSB7CisgIEdPT0dMRV9EQ0hFQ0soZXJyb3JzID09IG51bGxwdHIpIDw8ICJFcnJvciByZXBvcnRpbmcgbm90IGltcGxlbWVudGVkLiI7CisKKyAgY2hhciogZCA9IGRlc3Q7CisgIGNvbnN0IGNoYXIqIHAgPSBzb3VyY2U7CisKKyAgLy8gU21hbGwgb3B0aW1pemF0aW9uIGZvciBjYXNlIHdoZXJlIHNvdXJjZSA9IGRlc3QgYW5kIHRoZXJlJ3Mgbm8gZXNjYXBpbmcKKyAgd2hpbGUgKCBwID09IGQgJiYgKnAgIT0gJ1wwJyAmJiAqcCAhPSAnXFwnICkKKyAgICBwKyssIGQrKzsKKworICB3aGlsZSAoKnAgIT0gJ1wwJykgeworICAgIGlmICgqcCAhPSAnXFwnKSB7CisgICAgICAqZCsrID0gKnArKzsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICggKisrcCApIHsgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgcGFzdCB0aGUgJ1xcJworICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKSA8PCAiU3RyaW5nIGNhbm5vdCBlbmQgd2l0aCBcXCI7CisgICAgICAgICAgKmQgPSAnXDAnOworICAgICAgICAgIHJldHVybiBkIC0gZGVzdDsgICAvLyB3ZSdyZSBkb25lIHdpdGggcAorICAgICAgICBjYXNlICdhJzogICpkKysgPSAnXGEnOyAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2InOiAgKmQrKyA9ICdcYic7ICBicmVhazsKKyAgICAgICAgY2FzZSAnZic6ICAqZCsrID0gJ1xmJzsgIGJyZWFrOworICAgICAgICBjYXNlICduJzogICpkKysgPSAnXG4nOyAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3InOiAgKmQrKyA9ICdccic7ICBicmVhazsKKyAgICAgICAgY2FzZSAndCc6ICAqZCsrID0gJ1x0JzsgIGJyZWFrOworICAgICAgICBjYXNlICd2JzogICpkKysgPSAnXHYnOyAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xcJzogKmQrKyA9ICdcXCc7ICBicmVhazsKKyAgICAgICAgY2FzZSAnPyc6ICAqZCsrID0gJ1w/JzsgIGJyZWFrOyAgICAvLyBcPyAgV2hvIGtuZXc/CisgICAgICAgIGNhc2UgJ1wnJzogKmQrKyA9ICdcJyc7ICBicmVhazsKKyAgICAgICAgY2FzZSAnIic6ICAqZCsrID0gJ1wiJzsgIGJyZWFrOworICAgICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogIC8vIG9jdGFsIGRpZ2l0OiAxIHRvIDMgZGlnaXRzCisgICAgICAgIGNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiB7CisgICAgICAgICAgY2hhciBjaCA9ICpwIC0gJzAnOworICAgICAgICAgIGlmICggSVNfT0NUQUxfRElHSVQocFsxXSkgKQorICAgICAgICAgICAgY2ggPSBjaCAqIDggKyAqKytwIC0gJzAnOworICAgICAgICAgIGlmICggSVNfT0NUQUxfRElHSVQocFsxXSkgKSAgICAgIC8vIHNhZmUgKGFuZCBlYXN5KSB0byBkbyB0aGlzIHR3aWNlCisgICAgICAgICAgICBjaCA9IGNoICogOCArICorK3AgLSAnMCc7ICAgICAgLy8gbm93IHBvaW50cyBhdCBsYXN0IGRpZ2l0CisgICAgICAgICAgKmQrKyA9IGNoOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgJ3gnOiBjYXNlICdYJzogeworICAgICAgICAgIGlmICghaXN4ZGlnaXQocFsxXSkpIHsKKyAgICAgICAgICAgIGlmIChwWzFdID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKSA8PCAiU3RyaW5nIGNhbm5vdCBlbmQgd2l0aCBcXHgiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKSA8PAorICAgICAgICAgICAgICAgICJcXHggY2Fubm90IGJlIGZvbGxvd2VkIGJ5IG5vbi1oZXggZGlnaXQ6IFxcIiA8PCAqcCA8PCBwWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHVuc2lnbmVkIGludCBjaCA9IDA7CisgICAgICAgICAgY29uc3QgY2hhciAqaGV4X3N0YXJ0ID0gcDsKKyAgICAgICAgICB3aGlsZSAoaXN4ZGlnaXQocFsxXSkpICAvLyBhcmJpdHJhcmlseSBtYW55IGhleCBkaWdpdHMKKyAgICAgICAgICAgIGNoID0gKGNoIDw8IDQpICsgaGV4X2RpZ2l0X3RvX2ludCgqKytwKTsKKyAgICAgICAgICBpZiAoY2ggPiAweEZGKQorICAgICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKQorICAgICAgICAgICAgICAgIDw8ICJWYWx1ZSBvZiAiCisgICAgICAgICAgICAgICAgPDwgIlxcIiA8PCBzdGQ6OnN0cmluZyhoZXhfc3RhcnQsIHAgKyAxIC0gaGV4X3N0YXJ0KQorICAgICAgICAgICAgICAgIDw8ICIgZXhjZWVkcyA4IGJpdHMiOworICAgICAgICAgICpkKysgPSBjaDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2lmIDAgIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgXHUgYW5kIFxVPyAgUmVxdWlyZXMgcnVuZXRvY2hhcigpLgorICAgICAgICBjYXNlICd1JzogeworICAgICAgICAgIC8vIFx1aGhoaCA9PiBjb252ZXJ0IDQgaGV4IGRpZ2l0cyB0byBVVEYtOAorICAgICAgICAgIGNoYXIzMiBydW5lID0gMDsKKyAgICAgICAgICBjb25zdCBjaGFyICpoZXhfc3RhcnQgPSBwOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICBpZiAoaXN4ZGlnaXQocFsxXSkpIHsgIC8vIExvb2sgb25lIGNoYXIgYWhlYWQuCisgICAgICAgICAgICAgIHJ1bmUgPSAocnVuZSA8PCA0KSArIGhleF9kaWdpdF90b19pbnQoKisrcCk7ICAvLyBBZHZhbmNlIHAuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBMT0dfU1RSSU5HKEVSUk9SLCBlcnJvcnMpCisgICAgICAgICAgICAgICAgPDwgIlxcdSBtdXN0IGJlIGZvbGxvd2VkIGJ5IDQgaGV4IGRpZ2l0czogXFwiCisgICAgICAgICAgICAgICAgPDwgIHN0ZDo6c3RyaW5nKGhleF9zdGFydCwgcCsxLWhleF9zdGFydCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBkICs9IHJ1bmV0b2NoYXIoZCwgJnJ1bmUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgJ1UnOiB7CisgICAgICAgICAgLy8gXFVoaGhoaGhoaCA9PiBjb252ZXJ0IDggaGV4IGRpZ2l0cyB0byBVVEYtOAorICAgICAgICAgIGNoYXIzMiBydW5lID0gMDsKKyAgICAgICAgICBjb25zdCBjaGFyICpoZXhfc3RhcnQgPSBwOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICAgICAgICBpZiAoaXN4ZGlnaXQocFsxXSkpIHsgIC8vIExvb2sgb25lIGNoYXIgYWhlYWQuCisgICAgICAgICAgICAgIC8vIERvbid0IGNoYW5nZSBydW5lIHVudGlsIHdlJ3JlIHN1cmUgdGhpcworICAgICAgICAgICAgICAvLyBpcyB3aXRoaW4gdGhlIFVuaWNvZGUgbGltaXQsIGJ1dCBkbyBhZHZhbmNlIHAuCisgICAgICAgICAgICAgIGNoYXIzMiBuZXdydW5lID0gKHJ1bmUgPDwgNCkgKyBoZXhfZGlnaXRfdG9faW50KCorK3ApOworICAgICAgICAgICAgICBpZiAobmV3cnVuZSA+IDB4MTBGRkZGKSB7CisgICAgICAgICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKQorICAgICAgICAgICAgICAgICAgPDwgIlZhbHVlIG9mIFxcIgorICAgICAgICAgICAgICAgICAgPDwgc3RkOjpzdHJpbmcoaGV4X3N0YXJ0LCBwICsgMSAtIGhleF9zdGFydCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgZXhjZWVkcyBVbmljb2RlIGxpbWl0ICgweDEwRkZGRikiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJ1bmUgPSBuZXdydW5lOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBMT0dfU1RSSU5HKEVSUk9SLCBlcnJvcnMpCisgICAgICAgICAgICAgICAgPDwgIlxcVSBtdXN0IGJlIGZvbGxvd2VkIGJ5IDggaGV4IGRpZ2l0czogXFwiCisgICAgICAgICAgICAgICAgPDwgIHN0ZDo6c3RyaW5nKGhleF9zdGFydCwgcCsxLWhleF9zdGFydCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBkICs9IHJ1bmV0b2NoYXIoZCwgJnJ1bmUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBMT0dfU1RSSU5HKEVSUk9SLCBlcnJvcnMpIDw8ICJVbmtub3duIGVzY2FwZSBzZXF1ZW5jZTogXFwiIDw8ICpwOworICAgICAgfQorICAgICAgcCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgcGFzdCBsZXR0ZXIgd2UgZXNjYXBlZAorICAgIH0KKyAgfQorICAqZCA9ICdcMCc7CisgIHJldHVybiBkIC0gZGVzdDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVW5lc2NhcGVDRXNjYXBlU3RyaW5nKCkKKy8vICAgIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMsIGJ1dCBjcmVhdGVzCisvLyAgICBhIG5ldyBzdHJpbmcuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCBhbGxvY2F0aW5nCisvLyAgICBhIGRlc3QgYnVmZmVyLiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBub24gcGVyZm9ybWFuY2UgY3JpdGljYWwKKy8vICAgIHRhc2tzIHN1Y2ggYXMgcHJpbnRpbmcgZGVidWcgbWVzc2FnZXMuIEl0IGlzIHNhZmUgZm9yIHNyYyBhbmQgZGVzdAorLy8gICAgdG8gYmUgdGhlIHNhbWUuCisvLworLy8gICAgVGhlIHNlY29uZCBjYWxsIHN0b3JlcyBpdHMgZXJyb3JzIGluIGEgc3VwcGxpZWQgc3RyaW5nIHZlY3Rvci4KKy8vICAgIElmIHRoZSBzdHJpbmcgdmVjdG9yIHBvaW50ZXIgaXMgbnVsbHB0ciwgaXQgcmVwb3J0cyB0aGUgZXJyb3JzIHdpdGggTE9HKCkuCisvLworLy8gICAgSW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2FsbHMsIHRoZSBsZW5ndGggb2YgZGVzdCBpcyByZXR1cm5lZC4gSW4gdGhlCisvLyAgICB0aGUgdGhpcmQgY2FsbCwgdGhlIG5ldyBzdHJpbmcgaXMgcmV0dXJuZWQuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgVW5lc2NhcGVDRXNjYXBlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzcmMsIHN0ZDo6c3RyaW5nICpkZXN0KSB7CisgIHJldHVybiBVbmVzY2FwZUNFc2NhcGVTdHJpbmcoc3JjLCBkZXN0LCBudWxscHRyKTsKK30KKworaW50IFVuZXNjYXBlQ0VzY2FwZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3JjLCBzdGQ6OnN0cmluZyAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICplcnJvcnMpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gdW5lc2NhcGVkKG5ldyBjaGFyW3NyYy5zaXplKCkgKyAxXSk7CisgIGludCBsZW4gPSBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoc3JjLmNfc3RyKCksIHVuZXNjYXBlZC5nZXQoKSwgZXJyb3JzKTsKKyAgR09PR0xFX0NIRUNLKGRlc3QpOworICBkZXN0LT5hc3NpZ24odW5lc2NhcGVkLmdldCgpLCBsZW4pOworICByZXR1cm4gbGVuOworfQorCitzdGQ6OnN0cmluZyBVbmVzY2FwZUNFc2NhcGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnNyYykgeworICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiB1bmVzY2FwZWQobmV3IGNoYXJbc3JjLnNpemUoKSArIDFdKTsKKyAgaW50IGxlbiA9IFVuZXNjYXBlQ0VzY2FwZVNlcXVlbmNlcyhzcmMuY19zdHIoKSwgdW5lc2NhcGVkLmdldCgpLCBudWxscHRyKTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKHVuZXNjYXBlZC5nZXQoKSwgbGVuKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ0VzY2FwZVN0cmluZygpCisvLyBDSGV4RXNjYXBlU3RyaW5nKCkKKy8vICAgIENvcGllcyAnc3JjJyB0byAnZGVzdCcsIGVzY2FwaW5nIGRhbmdlcm91cyBjaGFyYWN0ZXJzIHVzaW5nCisvLyAgICBDLXN0eWxlIGVzY2FwZSBzZXF1ZW5jZXMuIFRoaXMgaXMgdmVyeSB1c2VmdWwgZm9yIHByZXBhcmluZyBxdWVyeQorLy8gICAgZmxhZ3MuICdzcmMnIGFuZCAnZGVzdCcgc2hvdWxkIG5vdCBvdmVybGFwLiBUaGUgJ0hleCcgdmVyc2lvbiB1c2VzCisvLyAgICBoZXhhZGVjaW1hbCByYXRoZXIgdGhhbiBvY3RhbCBzZXF1ZW5jZXMuCisvLyAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byAnZGVzdCcgKG5vdCBpbmNsdWRpbmcgdGhlIFwwKQorLy8gICAgb3IgLTEgaWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBzcGFjZS4KKy8vCisvLyAgICBDdXJyZW50bHkgb25seSBcbiwgXHIsIFx0LCAiLCAnLCBcIGFuZCAhaXNwcmludCgpIGNoYXJzIGFyZSBlc2NhcGVkLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IENFc2NhcGVJbnRlcm5hbChjb25zdCBjaGFyKiBzcmMsIGludCBzcmNfbGVuLCBjaGFyKiBkZXN0LAorICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZW4sIGJvb2wgdXNlX2hleCwgYm9vbCB1dGY4X3NhZmUpIHsKKyAgY29uc3QgY2hhciogc3JjX2VuZCA9IHNyYyArIHNyY19sZW47CisgIGludCB1c2VkID0gMDsKKyAgYm9vbCBsYXN0X2hleF9lc2NhcGUgPSBmYWxzZTsgLy8gdHJ1ZSBpZiBsYXN0IG91dHB1dCBjaGFyIHdhcyBceE5OCisKKyAgZm9yICg7IHNyYyA8IHNyY19lbmQ7IHNyYysrKSB7CisgICAgaWYgKGRlc3RfbGVuIC0gdXNlZCA8IDIpICAgLy8gTmVlZCBzcGFjZSBmb3IgdHdvIGxldHRlciBlc2NhcGUKKyAgICAgIHJldHVybiAtMTsKKworICAgIGJvb2wgaXNfaGV4X2VzY2FwZSA9IGZhbHNlOworICAgIHN3aXRjaCAoKnNyYykgeworICAgICAgY2FzZSAnXG4nOiBkZXN0W3VzZWQrK10gPSAnXFwnOyBkZXN0W3VzZWQrK10gPSAnbic7ICBicmVhazsKKyAgICAgIGNhc2UgJ1xyJzogZGVzdFt1c2VkKytdID0gJ1xcJzsgZGVzdFt1c2VkKytdID0gJ3InOyAgYnJlYWs7CisgICAgICBjYXNlICdcdCc6IGRlc3RbdXNlZCsrXSA9ICdcXCc7IGRlc3RbdXNlZCsrXSA9ICd0JzsgIGJyZWFrOworICAgICAgY2FzZSAnXCInOiBkZXN0W3VzZWQrK10gPSAnXFwnOyBkZXN0W3VzZWQrK10gPSAnXCInOyBicmVhazsKKyAgICAgIGNhc2UgJ1wnJzogZGVzdFt1c2VkKytdID0gJ1xcJzsgZGVzdFt1c2VkKytdID0gJ1wnJzsgYnJlYWs7CisgICAgICBjYXNlICdcXCc6IGRlc3RbdXNlZCsrXSA9ICdcXCc7IGRlc3RbdXNlZCsrXSA9ICdcXCc7IGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gTm90ZSB0aGF0IGlmIHdlIGVtaXQgXHhOTiBhbmQgdGhlIHNyYyBjaGFyYWN0ZXIgYWZ0ZXIgdGhhdCBpcyBhIGhleAorICAgICAgICAvLyBkaWdpdCB0aGVuIHRoYXQgZGlnaXQgbXVzdCBiZSBlc2NhcGVkIHRvbyB0byBwcmV2ZW50IGl0IGJlaW5nCisgICAgICAgIC8vIGludGVycHJldGVkIGFzIHBhcnQgb2YgdGhlIGNoYXJhY3RlciBjb2RlIGJ5IEMuCisgICAgICAgIGlmICgoIXV0Zjhfc2FmZSB8fCBzdGF0aWNfY2FzdDx1aW50OF90Pigqc3JjKSA8IDB4ODApICYmCisgICAgICAgICAgICAoIWlzcHJpbnQoKnNyYykgfHwKKyAgICAgICAgICAgICAobGFzdF9oZXhfZXNjYXBlICYmIGlzeGRpZ2l0KCpzcmMpKSkpIHsKKyAgICAgICAgICBpZiAoZGVzdF9sZW4gLSB1c2VkIDwgNCkgLy8gbmVlZCBzcGFjZSBmb3IgNCBsZXR0ZXIgZXNjYXBlCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgc3ByaW50ZihkZXN0ICsgdXNlZCwgKHVzZV9oZXggPyAiXFx4JTAyeCIgOiAiXFwlMDNvIiksCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pigqc3JjKSk7CisgICAgICAgICAgaXNfaGV4X2VzY2FwZSA9IHVzZV9oZXg7CisgICAgICAgICAgdXNlZCArPSA0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlc3RbdXNlZCsrXSA9ICpzcmM7IGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGxhc3RfaGV4X2VzY2FwZSA9IGlzX2hleF9lc2NhcGU7CisgIH0KKworICBpZiAoZGVzdF9sZW4gLSB1c2VkIDwgMSkgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyByb29tIGZvciBcMAorICAgIHJldHVybiAtMTsKKworICBkZXN0W3VzZWRdID0gJ1wwJzsgICAvLyBkb2Vzbid0IGNvdW50IHRvd2FyZHMgcmV0dXJuIHZhbHVlIHRob3VnaAorICByZXR1cm4gdXNlZDsKK30KKworLy8gQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBDLXN0eWxlIGVzY2FwZWQgdmVyc2lvbiBvZiAnc3JjJy4KKy8vIEFzc3VtZXMgdGhhdCBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgdXNpbmcgb2N0YWwgc2VxdWVuY2VzLCBhbmQKKy8vIHRoYXQgVVRGLTggYnl0ZXMgYXJlIG5vdCBoYW5kbGVkIHNwZWNpYWxseS4KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IENFc2NhcGVkTGVuZ3RoKFN0cmluZ1BpZWNlIHNyYykgeworICBzdGF0aWMgY2hhciBjX2VzY2FwZWRfbGVuWzI1Nl0gPSB7CisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMiwgMiwgNCwgNCwgMiwgNCwgNCwgIC8vIFx0LCBcbiwgXHIKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDEsIDEsIDIsIDEsIDEsIDEsIDEsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAvLyAiLCAnCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIC8vICcwJy4uJzknCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIC8vICdBJy4uJ08nCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMSwgMSwgMSwgIC8vICdQJy4uJ1onLCAnXCcKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgLy8gJ2EnLi4nbycKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCA0LCAgLy8gJ3AnLi4neicsIERFTAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgfTsKKworICBzaXplX3QgZXNjYXBlZF9sZW4gPSAwOworICBmb3IgKFN0cmluZ1BpZWNlOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBzcmMuc2l6ZSgpOyArK2kpIHsKKyAgICB1bnNpZ25lZCBjaGFyIGMgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihzcmNbaV0pOworICAgIGVzY2FwZWRfbGVuICs9IGNfZXNjYXBlZF9sZW5bY107CisgIH0KKyAgcmV0dXJuIGVzY2FwZWRfbGVuOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFc2NhcGVzICdzcmMnIHVzaW5nIEMtc3R5bGUgZXNjYXBlIHNlcXVlbmNlcywgYW5kIGFwcGVuZHMgdGhlIGVzY2FwZWQgc3RyaW5nCisvLyB0byAnZGVzdCcuIFRoaXMgdmVyc2lvbiBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIENFc2NhcGVJbnRlcm5hbCBhcyBpdCBjb21wdXRlcworLy8gdGhlIHJlcXVpcmVkIHNwYWNlIHVzaW5nIGEgbG9va3VwIHRhYmxlLCBhbmQgYWxzbyBkb2VzIG5vdCBkbyBhbnkgc3BlY2lhbAorLy8gaGFuZGxpbmcgZm9yIEhleCBvciBVVEYtOCBjaGFyYWN0ZXJzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBDRXNjYXBlQW5kQXBwZW5kKFN0cmluZ1BpZWNlIHNyYywgc3RkOjpzdHJpbmcgKmRlc3QpIHsKKyAgc2l6ZV90IGVzY2FwZWRfbGVuID0gQ0VzY2FwZWRMZW5ndGgoc3JjKTsKKyAgaWYgKGVzY2FwZWRfbGVuID09IHNyYy5zaXplKCkpIHsKKyAgICBkZXN0LT5hcHBlbmQoc3JjLmRhdGEoKSwgc3JjLnNpemUoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgc2l6ZV90IGN1cl9kZXN0X2xlbiA9IGRlc3QtPnNpemUoKTsKKyAgZGVzdC0+cmVzaXplKGN1cl9kZXN0X2xlbiArIGVzY2FwZWRfbGVuKTsKKyAgY2hhciogYXBwZW5kX3B0ciA9ICYoKmRlc3QpW2N1cl9kZXN0X2xlbl07CisKKyAgZm9yIChTdHJpbmdQaWVjZTo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgc3JjLnNpemUoKTsgKytpKSB7CisgICAgdW5zaWduZWQgY2hhciBjID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc3JjW2ldKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgJ1xuJzogKmFwcGVuZF9wdHIrKyA9ICdcXCc7ICphcHBlbmRfcHRyKysgPSAnbic7IGJyZWFrOworICAgICAgY2FzZSAnXHInOiAqYXBwZW5kX3B0cisrID0gJ1xcJzsgKmFwcGVuZF9wdHIrKyA9ICdyJzsgYnJlYWs7CisgICAgICBjYXNlICdcdCc6ICphcHBlbmRfcHRyKysgPSAnXFwnOyAqYXBwZW5kX3B0cisrID0gJ3QnOyBicmVhazsKKyAgICAgIGNhc2UgJ1wiJzogKmFwcGVuZF9wdHIrKyA9ICdcXCc7ICphcHBlbmRfcHRyKysgPSAnXCInOyBicmVhazsKKyAgICAgIGNhc2UgJ1wnJzogKmFwcGVuZF9wdHIrKyA9ICdcXCc7ICphcHBlbmRfcHRyKysgPSAnXCcnOyBicmVhazsKKyAgICAgIGNhc2UgJ1xcJzogKmFwcGVuZF9wdHIrKyA9ICdcXCc7ICphcHBlbmRfcHRyKysgPSAnXFwnOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICghaXNwcmludChjKSkgeworICAgICAgICAgICphcHBlbmRfcHRyKysgPSAnXFwnOworICAgICAgICAgICphcHBlbmRfcHRyKysgPSAnMCcgKyBjIC8gNjQ7CisgICAgICAgICAgKmFwcGVuZF9wdHIrKyA9ICcwJyArIChjICUgNjQpIC8gODsKKyAgICAgICAgICAqYXBwZW5kX3B0cisrID0gJzAnICsgYyAlIDg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmFwcGVuZF9wdHIrKyA9IGM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3N0ZDo6c3RyaW5nIENFc2NhcGUoY29uc3Qgc3RkOjpzdHJpbmcgJnNyYykgeworICBzdGQ6OnN0cmluZyBkZXN0OworICBDRXNjYXBlQW5kQXBwZW5kKHNyYywgJmRlc3QpOworICByZXR1cm4gZGVzdDsKK30KKworbmFtZXNwYWNlIHN0cmluZ3MgeworCitzdGQ6OnN0cmluZyBVdGY4U2FmZUNFc2NhcGUoY29uc3Qgc3RkOjpzdHJpbmcgJnNyYykgeworICBjb25zdCBpbnQgZGVzdF9sZW5ndGggPSBzcmMuc2l6ZSgpICogNCArIDE7IC8vIE1heGltdW0gcG9zc2libGUgZXhwYW5zaW9uCisgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IGRlc3QobmV3IGNoYXJbZGVzdF9sZW5ndGhdKTsKKyAgY29uc3QgaW50IGxlbiA9IENFc2NhcGVJbnRlcm5hbChzcmMuZGF0YSgpLCBzcmMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QuZ2V0KCksIGRlc3RfbGVuZ3RoLCBmYWxzZSwgdHJ1ZSk7CisgIEdPT0dMRV9EQ0hFQ0tfR0UobGVuLCAwKTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKGRlc3QuZ2V0KCksIGxlbik7Cit9CisKK3N0ZDo6c3RyaW5nIENIZXhFc2NhcGUoY29uc3Qgc3RkOjpzdHJpbmcgJnNyYykgeworICBjb25zdCBpbnQgZGVzdF9sZW5ndGggPSBzcmMuc2l6ZSgpICogNCArIDE7IC8vIE1heGltdW0gcG9zc2libGUgZXhwYW5zaW9uCisgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IGRlc3QobmV3IGNoYXJbZGVzdF9sZW5ndGhdKTsKKyAgY29uc3QgaW50IGxlbiA9IENFc2NhcGVJbnRlcm5hbChzcmMuZGF0YSgpLCBzcmMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QuZ2V0KCksIGRlc3RfbGVuZ3RoLCB0cnVlLCBmYWxzZSk7CisgIEdPT0dMRV9EQ0hFQ0tfR0UobGVuLCAwKTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKGRlc3QuZ2V0KCksIGxlbik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzdHJpbmdzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0cnRvMzJfYWRhcHRvcigpCisvLyBzdHJ0b3UzMl9hZGFwdG9yKCkKKy8vICAgIEltcGxlbWVudGF0aW9uIG9mIHN0cnRvW3VdbCByZXBsYWNlbWVudHMgdGhhdCBoYXZlIGlkZW50aWNhbAorLy8gICAgb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyBjaGFyYWN0ZXJpc3RpY3MgZm9yIGJvdGggSUxQLTMyIGFuZCBMUC02NAorLy8gICAgcGxhdGZvcm1zLCBpbmNsdWRpbmcgZXJybm8gcHJlc2VydmF0aW9uIGluIGVycm9yLWZyZWUgY2FsbHMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludDMyX3Qgc3RydG8zMl9hZGFwdG9yKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7CisgIGNvbnN0IGludCBzYXZlZF9lcnJubyA9IGVycm5vOworICBlcnJubyA9IDA7CisgIGNvbnN0IGxvbmcgcmVzdWx0ID0gc3RydG9sKG5wdHIsIGVuZHB0ciwgYmFzZSk7CisgIGlmIChlcnJubyA9PSBFUkFOR0UgJiYgcmVzdWx0ID09IExPTkdfTUlOKSB7CisgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpOworICB9IGVsc2UgaWYgKGVycm5vID09IEVSQU5HRSAmJiByZXN1bHQgPT0gTE9OR19NQVgpIHsKKyAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCk7CisgIH0gZWxzZSBpZiAoZXJybm8gPT0gMCAmJiByZXN1bHQgPCBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKSkgeworICAgIGVycm5vID0gRVJBTkdFOworICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKTsKKyAgfSBlbHNlIGlmIChlcnJubyA9PSAwICYmIHJlc3VsdCA+IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpKSB7CisgICAgZXJybm8gPSBFUkFOR0U7CisgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpOworICB9CisgIGlmIChlcnJubyA9PSAwKQorICAgIGVycm5vID0gc2F2ZWRfZXJybm87CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihyZXN1bHQpOworfQorCit1aW50MzJfdCBzdHJ0b3UzMl9hZGFwdG9yKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7CisgIGNvbnN0IGludCBzYXZlZF9lcnJubyA9IGVycm5vOworICBlcnJubyA9IDA7CisgIGNvbnN0IHVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gc3RydG91bChucHRyLCBlbmRwdHIsIGJhc2UpOworICBpZiAoZXJybm8gPT0gRVJBTkdFICYmIHJlc3VsdCA9PSBVTE9OR19NQVgpIHsKKyAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpOworICB9IGVsc2UgaWYgKGVycm5vID09IDAgJiYgcmVzdWx0ID4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSB7CisgICAgZXJybm8gPSBFUkFOR0U7CisgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKTsKKyAgfQorICBpZiAoZXJybm8gPT0gMCkKKyAgICBlcnJubyA9IHNhdmVkX2Vycm5vOworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJlc3VsdCk7Cit9CisKK2lubGluZSBib29sIHNhZmVfcGFyc2Vfc2lnbihzdGQ6OnN0cmluZyAqdGV4dCAvKmlub3V0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqbmVnYXRpdmVfcHRyIC8qb3V0cHV0Ki8pIHsKKyAgY29uc3QgY2hhciogc3RhcnQgPSB0ZXh0LT5kYXRhKCk7CisgIGNvbnN0IGNoYXIqIGVuZCA9IHN0YXJ0ICsgdGV4dC0+c2l6ZSgpOworCisgIC8vIENvbnN1bWUgd2hpdGVzcGFjZS4KKyAgd2hpbGUgKHN0YXJ0IDwgZW5kICYmIChzdGFydFswXSA9PSAnICcpKSB7CisgICAgKytzdGFydDsKKyAgfQorICB3aGlsZSAoc3RhcnQgPCBlbmQgJiYgKGVuZFstMV0gPT0gJyAnKSkgeworICAgIC0tZW5kOworICB9CisgIGlmIChzdGFydCA+PSBlbmQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBDb25zdW1lIHNpZ24uCisgICpuZWdhdGl2ZV9wdHIgPSAoc3RhcnRbMF0gPT0gJy0nKTsKKyAgaWYgKCpuZWdhdGl2ZV9wdHIgfHwgc3RhcnRbMF0gPT0gJysnKSB7CisgICAgKytzdGFydDsKKyAgICBpZiAoc3RhcnQgPj0gZW5kKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgICp0ZXh0ID0gdGV4dC0+c3Vic3RyKHN0YXJ0IC0gdGV4dC0+ZGF0YSgpLCBlbmQgLSBzdGFydCk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50VHlwZT4KK2Jvb2wgc2FmZV9wYXJzZV9wb3NpdGl2ZV9pbnQoc3RkOjpzdHJpbmcgdGV4dCwgSW50VHlwZSAqdmFsdWVfcCkgeworICBpbnQgYmFzZSA9IDEwOworICBJbnRUeXBlIHZhbHVlID0gMDsKKyAgY29uc3QgSW50VHlwZSB2bWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czxJbnRUeXBlPjo6bWF4KCk7CisgIGFzc2VydCh2bWF4ID4gMCk7CisgIGFzc2VydCh2bWF4ID49IGJhc2UpOworICBjb25zdCBJbnRUeXBlIHZtYXhfb3Zlcl9iYXNlID0gdm1heCAvIGJhc2U7CisgIGNvbnN0IGNoYXIqIHN0YXJ0ID0gdGV4dC5kYXRhKCk7CisgIGNvbnN0IGNoYXIqIGVuZCA9IHN0YXJ0ICsgdGV4dC5zaXplKCk7CisgIC8vIGxvb3Agb3ZlciBkaWdpdHMKKyAgZm9yICg7IHN0YXJ0IDwgZW5kOyArK3N0YXJ0KSB7CisgICAgdW5zaWduZWQgY2hhciBjID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc3RhcnRbMF0pOworICAgIGludCBkaWdpdCA9IGMgLSAnMCc7CisgICAgaWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPCAwKSB7CisgICAgICAqdmFsdWVfcCA9IHZhbHVlOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodmFsdWUgPiB2bWF4X292ZXJfYmFzZSkgeworICAgICAgKnZhbHVlX3AgPSB2bWF4OworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWx1ZSAqPSBiYXNlOworICAgIGlmICh2YWx1ZSA+IHZtYXggLSBkaWdpdCkgeworICAgICAgKnZhbHVlX3AgPSB2bWF4OworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWx1ZSArPSBkaWdpdDsKKyAgfQorICAqdmFsdWVfcCA9IHZhbHVlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+Citib29sIHNhZmVfcGFyc2VfbmVnYXRpdmVfaW50KGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXh0LCBJbnRUeXBlICp2YWx1ZV9wKSB7CisgIGludCBiYXNlID0gMTA7CisgIEludFR5cGUgdmFsdWUgPSAwOworICBjb25zdCBJbnRUeXBlIHZtaW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPEludFR5cGU+OjptaW4oKTsKKyAgYXNzZXJ0KHZtaW4gPCAwKTsKKyAgYXNzZXJ0KHZtaW4gPD0gMCAtIGJhc2UpOworICBJbnRUeXBlIHZtaW5fb3Zlcl9iYXNlID0gdm1pbiAvIGJhc2U7CisgIC8vIDIwMDMgYysrIHN0YW5kYXJkIFtleHByLm11bF0KKyAgLy8gIi4uLiB0aGUgc2lnbiBvZiB0aGUgcmVtYWluZGVyIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuIgorICAvLyBBbHRob3VnaCAodm1pbi9iYXNlKSpiYXNlICsgdm1pbiViYXNlIGlzIGFsd2F5cyB2bWluLgorICAvLyAyMDExIGMrKyBzdGFuZGFyZCB0aWdodGVucyB0aGUgc3BlYyBidXQgd2UgY2Fubm90IHJlbHkgb24gaXQuCisgIGlmICh2bWluICUgYmFzZSA+IDApIHsKKyAgICB2bWluX292ZXJfYmFzZSArPSAxOworICB9CisgIGNvbnN0IGNoYXIqIHN0YXJ0ID0gdGV4dC5kYXRhKCk7CisgIGNvbnN0IGNoYXIqIGVuZCA9IHN0YXJ0ICsgdGV4dC5zaXplKCk7CisgIC8vIGxvb3Agb3ZlciBkaWdpdHMKKyAgZm9yICg7IHN0YXJ0IDwgZW5kOyArK3N0YXJ0KSB7CisgICAgdW5zaWduZWQgY2hhciBjID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc3RhcnRbMF0pOworICAgIGludCBkaWdpdCA9IGMgLSAnMCc7CisgICAgaWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPCAwKSB7CisgICAgICAqdmFsdWVfcCA9IHZhbHVlOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodmFsdWUgPCB2bWluX292ZXJfYmFzZSkgeworICAgICAgKnZhbHVlX3AgPSB2bWluOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWx1ZSAqPSBiYXNlOworICAgIGlmICh2YWx1ZSA8IHZtaW4gKyBkaWdpdCkgeworICAgICAgKnZhbHVlX3AgPSB2bWluOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWx1ZSAtPSBkaWdpdDsKKyAgfQorICAqdmFsdWVfcCA9IHZhbHVlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+Citib29sIHNhZmVfaW50X2ludGVybmFsKHN0ZDo6c3RyaW5nIHRleHQsIEludFR5cGUgKnZhbHVlX3ApIHsKKyAgKnZhbHVlX3AgPSAwOworICBib29sIG5lZ2F0aXZlOworICBpZiAoIXNhZmVfcGFyc2Vfc2lnbigmdGV4dCwgJm5lZ2F0aXZlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIW5lZ2F0aXZlKSB7CisgICAgcmV0dXJuIHNhZmVfcGFyc2VfcG9zaXRpdmVfaW50KHRleHQsIHZhbHVlX3ApOworICB9IGVsc2UgeworICAgIHJldHVybiBzYWZlX3BhcnNlX25lZ2F0aXZlX2ludCh0ZXh0LCB2YWx1ZV9wKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50VHlwZT4KK2Jvb2wgc2FmZV91aW50X2ludGVybmFsKHN0ZDo6c3RyaW5nIHRleHQsIEludFR5cGUgKnZhbHVlX3ApIHsKKyAgKnZhbHVlX3AgPSAwOworICBib29sIG5lZ2F0aXZlOworICBpZiAoIXNhZmVfcGFyc2Vfc2lnbigmdGV4dCwgJm5lZ2F0aXZlKSB8fCBuZWdhdGl2ZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gc2FmZV9wYXJzZV9wb3NpdGl2ZV9pbnQodGV4dCwgdmFsdWVfcCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZhc3RJbnRUb0J1ZmZlcigpCisvLyBGYXN0SW50NjRUb0J1ZmZlcigpCisvLyBGYXN0SGV4VG9CdWZmZXIoKQorLy8gRmFzdEhleDY0VG9CdWZmZXIoKQorLy8gRmFzdEhleDMyVG9CdWZmZXIoKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBPZmZzZXQgaW50byBidWZmZXIgd2hlcmUgRmFzdEludDY0VG9CdWZmZXIgcGxhY2VzIHRoZSBlbmQgb2Ygc3RyaW5nCisvLyBudWxsIGNoYXJhY3Rlci4gIEFsc28gdXNlZCBieSBGYXN0SW50NjRUb0J1ZmZlckxlZnQuCitzdGF0aWMgY29uc3QgaW50IGtGYXN0SW50NjRUb0J1ZmZlck9mZnNldCA9IDIxOworCitjaGFyICpGYXN0SW50NjRUb0J1ZmZlcihpbnQ2NF90IGksIGNoYXIqIGJ1ZmZlcikgeworICAvLyBXZSBjb3VsZCBjb2xsYXBzZSB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHNlY3Rpb25zLCBidXQgdGhhdAorICAvLyB3b3VsZCBiZSBzbGlnaHRseSBzbG93ZXIgZm9yIHBvc2l0aXZlIG51bWJlcnMuLi4KKyAgLy8gMjIgYnl0ZXMgaXMgZW5vdWdoIHRvIHN0b3JlIC0yKio2NCwgLTE4NDQ2NzQ0MDczNzA5NTUxNjE2LgorICBjaGFyKiBwID0gYnVmZmVyICsga0Zhc3RJbnQ2NFRvQnVmZmVyT2Zmc2V0OworICAqcC0tID0gJ1wwJzsKKyAgaWYgKGkgPj0gMCkgeworICAgIGRvIHsKKyAgICAgICpwLS0gPSAnMCcgKyBpICUgMTA7CisgICAgICBpIC89IDEwOworICAgIH0gd2hpbGUgKGkgPiAwKTsKKyAgICByZXR1cm4gcCArIDE7CisgIH0gZWxzZSB7CisgICAgLy8gT24gZGlmZmVyZW50IHBsYXRmb3JtcywgJSBhbmQgLyBoYXZlIGRpZmZlcmVudCBiZWhhdmlvcnMgZm9yCisgICAgLy8gbmVnYXRpdmUgbnVtYmVycywgc28gd2UgbmVlZCB0byBqdW1wIHRocm91Z2ggaG9vcHMgdG8gbWFrZSBzdXJlCisgICAgLy8gd2UgZG9uJ3QgZGl2aWRlIG5lZ2F0aXZlIG51bWJlcnMuCisgICAgaWYgKGkgPiAtMTApIHsKKyAgICAgIGkgPSAtaTsKKyAgICAgICpwLS0gPSAnMCcgKyBpOworICAgICAgKnAgPSAnLSc7CisgICAgICByZXR1cm4gcDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZW4ndCBhdCBNSU5fSU5ULCBpbiB3aGljaCBjYXNlIHdlIGNhbid0IHNheSBpID0gLWkKKyAgICAgIGkgPSBpICsgMTA7CisgICAgICBpID0gLWk7CisgICAgICAqcC0tID0gJzAnICsgaSAlIDEwOworICAgICAgLy8gVW5kbyB3aGF0IHdlIGRpZCBhIG1vbWVudCBhZ28KKyAgICAgIGkgPSBpIC8gMTAgKyAxOworICAgICAgZG8geworICAgICAgICAqcC0tID0gJzAnICsgaSAlIDEwOworICAgICAgICBpIC89IDEwOworICAgICAgfSB3aGlsZSAoaSA+IDApOworICAgICAgKnAgPSAnLSc7CisgICAgICByZXR1cm4gcDsKKyAgICB9CisgIH0KK30KKworLy8gT2Zmc2V0IGludG8gYnVmZmVyIHdoZXJlIEZhc3RJbnQzMlRvQnVmZmVyIHBsYWNlcyB0aGUgZW5kIG9mIHN0cmluZworLy8gbnVsbCBjaGFyYWN0ZXIuICBBbHNvIHVzZWQgYnkgRmFzdEludDMyVG9CdWZmZXJMZWZ0CitzdGF0aWMgY29uc3QgaW50IGtGYXN0SW50MzJUb0J1ZmZlck9mZnNldCA9IDExOworCisvLyBZZXMsIHRoaXMgaXMgYSBkdXBsaWNhdGUgb2YgRmFzdEludDY0VG9CdWZmZXIuICBCdXQsIHdlIG5lZWQgdGhpcyBmb3IgdGhlCisvLyBjb21waWxlciB0byBnZW5lcmF0ZSAzMiBiaXQgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMuICBJdCdzIG11Y2ggZmFzdGVyLCBhdAorLy8gbGVhc3Qgd2l0aCAzMiBiaXQgYmluYXJpZXMuCitjaGFyICpGYXN0SW50MzJUb0J1ZmZlcihpbnQzMl90IGksIGNoYXIqIGJ1ZmZlcikgeworICAvLyBXZSBjb3VsZCBjb2xsYXBzZSB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHNlY3Rpb25zLCBidXQgdGhhdAorICAvLyB3b3VsZCBiZSBzbGlnaHRseSBzbG93ZXIgZm9yIHBvc2l0aXZlIG51bWJlcnMuLi4KKyAgLy8gMTIgYnl0ZXMgaXMgZW5vdWdoIHRvIHN0b3JlIC0yKiozMiwgLTQyOTQ5NjcyOTYuCisgIGNoYXIqIHAgPSBidWZmZXIgKyBrRmFzdEludDMyVG9CdWZmZXJPZmZzZXQ7CisgICpwLS0gPSAnXDAnOworICBpZiAoaSA+PSAwKSB7CisgICAgZG8geworICAgICAgKnAtLSA9ICcwJyArIGkgJSAxMDsKKyAgICAgIGkgLz0gMTA7CisgICAgfSB3aGlsZSAoaSA+IDApOworICAgIHJldHVybiBwICsgMTsKKyAgfSBlbHNlIHsKKyAgICAvLyBPbiBkaWZmZXJlbnQgcGxhdGZvcm1zLCAlIGFuZCAvIGhhdmUgZGlmZmVyZW50IGJlaGF2aW9ycyBmb3IKKyAgICAvLyBuZWdhdGl2ZSBudW1iZXJzLCBzbyB3ZSBuZWVkIHRvIGp1bXAgdGhyb3VnaCBob29wcyB0byBtYWtlIHN1cmUKKyAgICAvLyB3ZSBkb24ndCBkaXZpZGUgbmVnYXRpdmUgbnVtYmVycy4KKyAgICBpZiAoaSA+IC0xMCkgeworICAgICAgaSA9IC1pOworICAgICAgKnAtLSA9ICcwJyArIGk7CisgICAgICAqcCA9ICctJzsKKyAgICAgIHJldHVybiBwOworICAgIH0gZWxzZSB7CisgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlbid0IGF0IE1JTl9JTlQsIGluIHdoaWNoIGNhc2Ugd2UgY2FuJ3Qgc2F5IGkgPSAtaQorICAgICAgaSA9IGkgKyAxMDsKKyAgICAgIGkgPSAtaTsKKyAgICAgICpwLS0gPSAnMCcgKyBpICUgMTA7CisgICAgICAvLyBVbmRvIHdoYXQgd2UgZGlkIGEgbW9tZW50IGFnbworICAgICAgaSA9IGkgLyAxMCArIDE7CisgICAgICBkbyB7CisgICAgICAgICpwLS0gPSAnMCcgKyBpICUgMTA7CisgICAgICAgIGkgLz0gMTA7CisgICAgICB9IHdoaWxlIChpID4gMCk7CisgICAgICAqcCA9ICctJzsKKyAgICAgIHJldHVybiBwOworICAgIH0KKyAgfQorfQorCitjaGFyICpGYXN0SGV4VG9CdWZmZXIoaW50IGksIGNoYXIqIGJ1ZmZlcikgeworICBHT09HTEVfQ0hFQ0soaSA+PSAwKSA8PCAiRmFzdEhleFRvQnVmZmVyKCkgd2FudHMgbm9uLW5lZ2F0aXZlIGludGVnZXJzLCBub3QgIiA8PCBpOworCisgIHN0YXRpYyBjb25zdCBjaGFyICpoZXhkaWdpdHMgPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgIGNoYXIgKnAgPSBidWZmZXIgKyAyMTsKKyAgKnAtLSA9ICdcMCc7CisgIGRvIHsKKyAgICAqcC0tID0gaGV4ZGlnaXRzW2kgJiAxNV07ICAgLy8gbW9kIGJ5IDE2CisgICAgaSA+Pj0gNDsgICAgICAgICAgICAgICAgICAgIC8vIGRpdmlkZSBieSAxNgorICB9IHdoaWxlIChpID4gMCk7CisgIHJldHVybiBwICsgMTsKK30KKworY2hhciAqSW50ZXJuYWxGYXN0SGV4VG9CdWZmZXIodWludDY0X3QgdmFsdWUsIGNoYXIqIGJ1ZmZlciwgaW50IG51bV9ieXRlKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICpoZXhkaWdpdHMgPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgIGJ1ZmZlcltudW1fYnl0ZV0gPSAnXDAnOworICBmb3IgKGludCBpID0gbnVtX2J5dGUgLSAxOyBpID49IDA7IGktLSkgeworI2lmZGVmIF9NX1g2NAorICAgIC8vIE1TVkMgeDY0IHBsYXRmb3JtIGhhcyBhIGJ1ZyBvcHRpbWl6aW5nIHRoZSB1aW50MzIodmFsdWUpIGluIHRoZSAjZWxzZQorICAgIC8vIGJsb2NrLiBHaXZlbiB0aGF0IHRoZSB1aW50MzIgY2FzdCB3YXMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBvbiAzMi1iaXQKKyAgICAvLyBwbGF0Zm9ybXMsIHdlIHVzZSA2NC1iaXQgJyYnIGRpcmVjdGx5LgorICAgIGJ1ZmZlcltpXSA9IGhleGRpZ2l0c1t2YWx1ZSAmIDB4Zl07CisjZWxzZQorICAgIGJ1ZmZlcltpXSA9IGhleGRpZ2l0c1t1aW50MzJfdCh2YWx1ZSkgJiAweGZdOworI2VuZGlmCisgICAgdmFsdWUgPj49IDQ7CisgIH0KKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworY2hhciAqRmFzdEhleDY0VG9CdWZmZXIodWludDY0X3QgdmFsdWUsIGNoYXIqIGJ1ZmZlcikgeworICByZXR1cm4gSW50ZXJuYWxGYXN0SGV4VG9CdWZmZXIodmFsdWUsIGJ1ZmZlciwgMTYpOworfQorCitjaGFyICpGYXN0SGV4MzJUb0J1ZmZlcih1aW50MzJfdCB2YWx1ZSwgY2hhciogYnVmZmVyKSB7CisgIHJldHVybiBJbnRlcm5hbEZhc3RIZXhUb0J1ZmZlcih2YWx1ZSwgYnVmZmVyLCA4KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmFzdEludDMyVG9CdWZmZXJMZWZ0KCkKKy8vIEZhc3RVSW50MzJUb0J1ZmZlckxlZnQoKQorLy8gRmFzdEludDY0VG9CdWZmZXJMZWZ0KCkKKy8vIEZhc3RVSW50NjRUb0J1ZmZlckxlZnQoKQorLy8KKy8vIExpa2UgdGhlIEZhc3QqVG9CdWZmZXIoKSBmdW5jdGlvbnMgYWJvdmUsIHRoZXNlIGFyZSBpbnRlbmRlZCBmb3Igc3BlZWQuCisvLyBVbmxpa2UgdGhlIEZhc3QqVG9CdWZmZXIoKSBmdW5jdGlvbnMsIGhvd2V2ZXIsIHRoZXNlIGZ1bmN0aW9ucyB3cml0ZQorLy8gdGhlaXIgb3V0cHV0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAoaGVuY2UgdGhlIG5hbWUsIGFzIHRoZQorLy8gb3V0cHV0IGlzIGxlZnQtYWxpZ25lZCkuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0CisvLyB0aGUgYnVmZmVyIGhhcyBlbm91Z2ggc3BhY2UgdG8gaG9sZCB0aGUgb3V0cHV0LgorLy8KKy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAoaS5lLiB0aGUgbnVsbCBjaGFyYWN0ZXIKKy8vIHRlcm1pbmF0aW5nIHRoZSBzdHJpbmcpLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgY29uc3QgY2hhciB0d29fQVNDSUlfZGlnaXRzWzEwMF1bMl0gPSB7CisgIHsnMCcsJzAnfSwgeycwJywnMSd9LCB7JzAnLCcyJ30sIHsnMCcsJzMnfSwgeycwJywnNCd9LAorICB7JzAnLCc1J30sIHsnMCcsJzYnfSwgeycwJywnNyd9LCB7JzAnLCc4J30sIHsnMCcsJzknfSwKKyAgeycxJywnMCd9LCB7JzEnLCcxJ30sIHsnMScsJzInfSwgeycxJywnMyd9LCB7JzEnLCc0J30sCisgIHsnMScsJzUnfSwgeycxJywnNid9LCB7JzEnLCc3J30sIHsnMScsJzgnfSwgeycxJywnOSd9LAorICB7JzInLCcwJ30sIHsnMicsJzEnfSwgeycyJywnMid9LCB7JzInLCczJ30sIHsnMicsJzQnfSwKKyAgeycyJywnNSd9LCB7JzInLCc2J30sIHsnMicsJzcnfSwgeycyJywnOCd9LCB7JzInLCc5J30sCisgIHsnMycsJzAnfSwgeyczJywnMSd9LCB7JzMnLCcyJ30sIHsnMycsJzMnfSwgeyczJywnNCd9LAorICB7JzMnLCc1J30sIHsnMycsJzYnfSwgeyczJywnNyd9LCB7JzMnLCc4J30sIHsnMycsJzknfSwKKyAgeyc0JywnMCd9LCB7JzQnLCcxJ30sIHsnNCcsJzInfSwgeyc0JywnMyd9LCB7JzQnLCc0J30sCisgIHsnNCcsJzUnfSwgeyc0JywnNid9LCB7JzQnLCc3J30sIHsnNCcsJzgnfSwgeyc0JywnOSd9LAorICB7JzUnLCcwJ30sIHsnNScsJzEnfSwgeyc1JywnMid9LCB7JzUnLCczJ30sIHsnNScsJzQnfSwKKyAgeyc1JywnNSd9LCB7JzUnLCc2J30sIHsnNScsJzcnfSwgeyc1JywnOCd9LCB7JzUnLCc5J30sCisgIHsnNicsJzAnfSwgeyc2JywnMSd9LCB7JzYnLCcyJ30sIHsnNicsJzMnfSwgeyc2JywnNCd9LAorICB7JzYnLCc1J30sIHsnNicsJzYnfSwgeyc2JywnNyd9LCB7JzYnLCc4J30sIHsnNicsJzknfSwKKyAgeyc3JywnMCd9LCB7JzcnLCcxJ30sIHsnNycsJzInfSwgeyc3JywnMyd9LCB7JzcnLCc0J30sCisgIHsnNycsJzUnfSwgeyc3JywnNid9LCB7JzcnLCc3J30sIHsnNycsJzgnfSwgeyc3JywnOSd9LAorICB7JzgnLCcwJ30sIHsnOCcsJzEnfSwgeyc4JywnMid9LCB7JzgnLCczJ30sIHsnOCcsJzQnfSwKKyAgeyc4JywnNSd9LCB7JzgnLCc2J30sIHsnOCcsJzcnfSwgeyc4JywnOCd9LCB7JzgnLCc5J30sCisgIHsnOScsJzAnfSwgeyc5JywnMSd9LCB7JzknLCcyJ30sIHsnOScsJzMnfSwgeyc5JywnNCd9LAorICB7JzknLCc1J30sIHsnOScsJzYnfSwgeyc5JywnNyd9LCB7JzknLCc4J30sIHsnOScsJzknfQorfTsKKworY2hhciogRmFzdFVJbnQzMlRvQnVmZmVyTGVmdCh1aW50MzJfdCB1LCBjaGFyKiBidWZmZXIpIHsKKyAgdWludDMyX3QgZGlnaXRzOworICBjb25zdCBjaGFyICpBU0NJSV9kaWdpdHMgPSBudWxscHRyOworICAvLyBUaGUgaWRlYSBvZiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHRvIHRyaW0gdGhlIG51bWJlciBvZiBkaXZpZGVzIHRvIGFzIGZldworICAvLyBhcyBwb3NzaWJsZSBieSB1c2luZyBtdWx0aXBsaWNhdGlvbiBhbmQgc3VidHJhY3Rpb24gcmF0aGVyIHRoYW4gbW9kICglKSwKKyAgLy8gYW5kIGJ5IG91dHB1dHRpbmcgdHdvIGRpZ2l0cyBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gb25lLgorICAvLyBUaGUgaHVnZS1udW1iZXIgY2FzZSBpcyBmaXJzdCwgaW4gdGhlIGhvcGVzIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgb3V0cHV0CisgIC8vIHRoYXQgY2FzZSBpbiBvbmUgYnJhbmNoLWZyZWUgYmxvY2sgb2YgY29kZSwgYW5kIG9ubHkgb3V0cHV0IGNvbmRpdGlvbmFsCisgIC8vIGJyYW5jaGVzIGludG8gaXQgZnJvbSBiZWxvdy4KKyAgaWYgKHUgPj0gMTAwMDAwMDAwMCkgeyAgLy8gPj0gMSwwMDAsMDAwLDAwMAorICAgIGRpZ2l0cyA9IHUgLyAxMDAwMDAwMDA7ICAvLyAxMDAsMDAwLDAwMAorICAgIEFTQ0lJX2RpZ2l0cyA9IHR3b19BU0NJSV9kaWdpdHNbZGlnaXRzXTsKKyAgICBidWZmZXJbMF0gPSBBU0NJSV9kaWdpdHNbMF07CisgICAgYnVmZmVyWzFdID0gQVNDSUlfZGlnaXRzWzFdOworICAgIGJ1ZmZlciArPSAyOworc3VibHQxMDBfMDAwXzAwMDoKKyAgICB1IC09IGRpZ2l0cyAqIDEwMDAwMDAwMDsgIC8vIDEwMCwwMDAsMDAwCitsdDEwMF8wMDBfMDAwOgorICAgIGRpZ2l0cyA9IHUgLyAxMDAwMDAwOyAgLy8gMSwwMDAsMDAwCisgICAgQVNDSUlfZGlnaXRzID0gdHdvX0FTQ0lJX2RpZ2l0c1tkaWdpdHNdOworICAgIGJ1ZmZlclswXSA9IEFTQ0lJX2RpZ2l0c1swXTsKKyAgICBidWZmZXJbMV0gPSBBU0NJSV9kaWdpdHNbMV07CisgICAgYnVmZmVyICs9IDI7CitzdWJsdDFfMDAwXzAwMDoKKyAgICB1IC09IGRpZ2l0cyAqIDEwMDAwMDA7ICAvLyAxLDAwMCwwMDAKK2x0MV8wMDBfMDAwOgorICAgIGRpZ2l0cyA9IHUgLyAxMDAwMDsgIC8vIDEwLDAwMAorICAgIEFTQ0lJX2RpZ2l0cyA9IHR3b19BU0NJSV9kaWdpdHNbZGlnaXRzXTsKKyAgICBidWZmZXJbMF0gPSBBU0NJSV9kaWdpdHNbMF07CisgICAgYnVmZmVyWzFdID0gQVNDSUlfZGlnaXRzWzFdOworICAgIGJ1ZmZlciArPSAyOworc3VibHQxMF8wMDA6CisgICAgdSAtPSBkaWdpdHMgKiAxMDAwMDsgIC8vIDEwLDAwMAorbHQxMF8wMDA6CisgICAgZGlnaXRzID0gdSAvIDEwMDsKKyAgICBBU0NJSV9kaWdpdHMgPSB0d29fQVNDSUlfZGlnaXRzW2RpZ2l0c107CisgICAgYnVmZmVyWzBdID0gQVNDSUlfZGlnaXRzWzBdOworICAgIGJ1ZmZlclsxXSA9IEFTQ0lJX2RpZ2l0c1sxXTsKKyAgICBidWZmZXIgKz0gMjsKK3N1Ymx0MTAwOgorICAgIHUgLT0gZGlnaXRzICogMTAwOworbHQxMDA6CisgICAgZGlnaXRzID0gdTsKKyAgICBBU0NJSV9kaWdpdHMgPSB0d29fQVNDSUlfZGlnaXRzW2RpZ2l0c107CisgICAgYnVmZmVyWzBdID0gQVNDSUlfZGlnaXRzWzBdOworICAgIGJ1ZmZlclsxXSA9IEFTQ0lJX2RpZ2l0c1sxXTsKKyAgICBidWZmZXIgKz0gMjsKK2RvbmU6CisgICAgKmJ1ZmZlciA9IDA7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfQorCisgIGlmICh1IDwgMTAwKSB7CisgICAgZGlnaXRzID0gdTsKKyAgICBpZiAodSA+PSAxMCkgZ290byBsdDEwMDsKKyAgICAqYnVmZmVyKysgPSAnMCcgKyBkaWdpdHM7CisgICAgZ290byBkb25lOworICB9CisgIGlmICh1ICA8ICAxMDAwMCkgeyAgIC8vIDEwLDAwMAorICAgIGlmICh1ID49IDEwMDApIGdvdG8gbHQxMF8wMDA7CisgICAgZGlnaXRzID0gdSAvIDEwMDsKKyAgICAqYnVmZmVyKysgPSAnMCcgKyBkaWdpdHM7CisgICAgZ290byBzdWJsdDEwMDsKKyAgfQorICBpZiAodSAgPCAgMTAwMDAwMCkgeyAgIC8vIDEsMDAwLDAwMAorICAgIGlmICh1ID49IDEwMDAwMCkgZ290byBsdDFfMDAwXzAwMDsKKyAgICBkaWdpdHMgPSB1IC8gMTAwMDA7ICAvLyAgICAxMCwwMDAKKyAgICAqYnVmZmVyKysgPSAnMCcgKyBkaWdpdHM7CisgICAgZ290byBzdWJsdDEwXzAwMDsKKyAgfQorICBpZiAodSAgPCAgMTAwMDAwMDAwKSB7ICAgLy8gMTAwLDAwMCwwMDAKKyAgICBpZiAodSA+PSAxMDAwMDAwMCkgZ290byBsdDEwMF8wMDBfMDAwOworICAgIGRpZ2l0cyA9IHUgLyAxMDAwMDAwOyAgLy8gICAxLDAwMCwwMDAKKyAgICAqYnVmZmVyKysgPSAnMCcgKyBkaWdpdHM7CisgICAgZ290byBzdWJsdDFfMDAwXzAwMDsKKyAgfQorICAvLyB3ZSBhbHJlYWR5IGtub3cgdGhhdCB1IDwgMSwwMDAsMDAwLDAwMAorICBkaWdpdHMgPSB1IC8gMTAwMDAwMDAwOyAgIC8vIDEwMCwwMDAsMDAwCisgICpidWZmZXIrKyA9ICcwJyArIGRpZ2l0czsKKyAgZ290byBzdWJsdDEwMF8wMDBfMDAwOworfQorCitjaGFyKiBGYXN0SW50MzJUb0J1ZmZlckxlZnQoaW50MzJfdCBpLCBjaGFyKiBidWZmZXIpIHsKKyAgdWludDMyX3QgdSA9IDA7CisgIGlmIChpIDwgMCkgeworICAgICpidWZmZXIrKyA9ICctJzsKKyAgICB1IC09IGk7CisgIH0gZWxzZSB7CisgICAgdSA9IGk7CisgIH0KKyAgcmV0dXJuIEZhc3RVSW50MzJUb0J1ZmZlckxlZnQodSwgYnVmZmVyKTsKK30KKworY2hhciogRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdCh1aW50NjRfdCB1NjQsIGNoYXIqIGJ1ZmZlcikgeworICBpbnQgZGlnaXRzOworICBjb25zdCBjaGFyICpBU0NJSV9kaWdpdHMgPSBudWxscHRyOworCisgIHVpbnQzMl90IHUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odTY0KTsKKyAgaWYgKHUgPT0gdTY0KSByZXR1cm4gRmFzdFVJbnQzMlRvQnVmZmVyTGVmdCh1LCBidWZmZXIpOworCisgIHVpbnQ2NF90IHRvcF8xMV9kaWdpdHMgPSB1NjQgLyAxMDAwMDAwMDAwOworICBidWZmZXIgPSBGYXN0VUludDY0VG9CdWZmZXJMZWZ0KHRvcF8xMV9kaWdpdHMsIGJ1ZmZlcik7CisgIHUgPSB1NjQgLSAodG9wXzExX2RpZ2l0cyAqIDEwMDAwMDAwMDApOworCisgIGRpZ2l0cyA9IHUgLyAxMDAwMDAwMDsgIC8vIDEwLDAwMCwwMDAKKyAgR09PR0xFX0RDSEVDS19MVChkaWdpdHMsIDEwMCk7CisgIEFTQ0lJX2RpZ2l0cyA9IHR3b19BU0NJSV9kaWdpdHNbZGlnaXRzXTsKKyAgYnVmZmVyWzBdID0gQVNDSUlfZGlnaXRzWzBdOworICBidWZmZXJbMV0gPSBBU0NJSV9kaWdpdHNbMV07CisgIGJ1ZmZlciArPSAyOworICB1IC09IGRpZ2l0cyAqIDEwMDAwMDAwOyAgLy8gMTAsMDAwLDAwMAorICBkaWdpdHMgPSB1IC8gMTAwMDAwOyAgLy8gMTAwLDAwMAorICBBU0NJSV9kaWdpdHMgPSB0d29fQVNDSUlfZGlnaXRzW2RpZ2l0c107CisgIGJ1ZmZlclswXSA9IEFTQ0lJX2RpZ2l0c1swXTsKKyAgYnVmZmVyWzFdID0gQVNDSUlfZGlnaXRzWzFdOworICBidWZmZXIgKz0gMjsKKyAgdSAtPSBkaWdpdHMgKiAxMDAwMDA7ICAvLyAxMDAsMDAwCisgIGRpZ2l0cyA9IHUgLyAxMDAwOyAgLy8gMSwwMDAKKyAgQVNDSUlfZGlnaXRzID0gdHdvX0FTQ0lJX2RpZ2l0c1tkaWdpdHNdOworICBidWZmZXJbMF0gPSBBU0NJSV9kaWdpdHNbMF07CisgIGJ1ZmZlclsxXSA9IEFTQ0lJX2RpZ2l0c1sxXTsKKyAgYnVmZmVyICs9IDI7CisgIHUgLT0gZGlnaXRzICogMTAwMDsgIC8vIDEsMDAwCisgIGRpZ2l0cyA9IHUgLyAxMDsKKyAgQVNDSUlfZGlnaXRzID0gdHdvX0FTQ0lJX2RpZ2l0c1tkaWdpdHNdOworICBidWZmZXJbMF0gPSBBU0NJSV9kaWdpdHNbMF07CisgIGJ1ZmZlclsxXSA9IEFTQ0lJX2RpZ2l0c1sxXTsKKyAgYnVmZmVyICs9IDI7CisgIHUgLT0gZGlnaXRzICogMTA7CisgIGRpZ2l0cyA9IHU7CisgICpidWZmZXIrKyA9ICcwJyArIGRpZ2l0czsKKyAgKmJ1ZmZlciA9IDA7CisgIHJldHVybiBidWZmZXI7Cit9CisKK2NoYXIqIEZhc3RJbnQ2NFRvQnVmZmVyTGVmdChpbnQ2NF90IGksIGNoYXIqIGJ1ZmZlcikgeworICB1aW50NjRfdCB1ID0gMDsKKyAgaWYgKGkgPCAwKSB7CisgICAgKmJ1ZmZlcisrID0gJy0nOworICAgIHUgLT0gaTsKKyAgfSBlbHNlIHsKKyAgICB1ID0gaTsKKyAgfQorICByZXR1cm4gRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdCh1LCBidWZmZXIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW1wbGVJdG9hKCkKKy8vICAgIERlc2NyaXB0aW9uOiBjb252ZXJ0cyBhbiBpbnRlZ2VyIHRvIGEgc3RyaW5nLgorLy8KKy8vICAgIFJldHVybiB2YWx1ZTogc3RyaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0ZDo6c3RyaW5nIFNpbXBsZUl0b2EoaW50IGkpIHsKKyAgY2hhciBidWZmZXJba0Zhc3RUb0J1ZmZlclNpemVdOworICByZXR1cm4gKHNpemVvZihpKSA9PSA0KSA/CisgICAgRmFzdEludDMyVG9CdWZmZXIoaSwgYnVmZmVyKSA6CisgICAgRmFzdEludDY0VG9CdWZmZXIoaSwgYnVmZmVyKTsKK30KKworc3RkOjpzdHJpbmcgU2ltcGxlSXRvYSh1bnNpZ25lZCBpbnQgaSkgeworICBjaGFyIGJ1ZmZlcltrRmFzdFRvQnVmZmVyU2l6ZV07CisgIHJldHVybiBzdGQ6OnN0cmluZyhidWZmZXIsIChzaXplb2YoaSkgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRmFzdFVJbnQzMlRvQnVmZmVyTGVmdChpLCBidWZmZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZhc3RVSW50NjRUb0J1ZmZlckxlZnQoaSwgYnVmZmVyKSk7Cit9CisKK3N0ZDo6c3RyaW5nIFNpbXBsZUl0b2EobG9uZyBpKSB7CisgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgcmV0dXJuIChzaXplb2YoaSkgPT0gNCkgPworICAgIEZhc3RJbnQzMlRvQnVmZmVyKGksIGJ1ZmZlcikgOgorICAgIEZhc3RJbnQ2NFRvQnVmZmVyKGksIGJ1ZmZlcik7Cit9CisKK3N0ZDo6c3RyaW5nIFNpbXBsZUl0b2EodW5zaWduZWQgbG9uZyBpKSB7CisgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1ZmZlciwgKHNpemVvZihpKSA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGYXN0VUludDMyVG9CdWZmZXJMZWZ0KGksIGJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdChpLCBidWZmZXIpKTsKK30KKworc3RkOjpzdHJpbmcgU2ltcGxlSXRvYShsb25nIGxvbmcgaSkgeworICBjaGFyIGJ1ZmZlcltrRmFzdFRvQnVmZmVyU2l6ZV07CisgIHJldHVybiAoc2l6ZW9mKGkpID09IDQpID8KKyAgICBGYXN0SW50MzJUb0J1ZmZlcihpLCBidWZmZXIpIDoKKyAgICBGYXN0SW50NjRUb0J1ZmZlcihpLCBidWZmZXIpOworfQorCitzdGQ6OnN0cmluZyBTaW1wbGVJdG9hKHVuc2lnbmVkIGxvbmcgbG9uZyBpKSB7CisgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1ZmZlciwgKHNpemVvZihpKSA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGYXN0VUludDMyVG9CdWZmZXJMZWZ0KGksIGJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdChpLCBidWZmZXIpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlRHRvYSgpCisvLyBTaW1wbGVGdG9hKCkKKy8vIERvdWJsZVRvQnVmZmVyKCkKKy8vIEZsb2F0VG9CdWZmZXIoKQorLy8gICAgV2Ugd2FudCB0byBwcmludCB0aGUgdmFsdWUgd2l0aG91dCBsb3NpbmcgcHJlY2lzaW9uLCBidXQgd2UgYWxzbyBkbworLy8gICAgbm90IHdhbnQgdG8gcHJpbnQgbW9yZSBkaWdpdHMgdGhhbiBuZWNlc3NhcnkuICBUaGlzIHR1cm5zIG91dCB0byBiZQorLy8gICAgdHJpY2tpZXIgdGhhbiBpdCBzb3VuZHMuICBOdW1iZXJzIGxpa2UgMC4yIGNhbm5vdCBiZSByZXByZXNlbnRlZAorLy8gICAgZXhhY3RseSBpbiBiaW5hcnkuICBJZiB3ZSBwcmludCAwLjIgd2l0aCBhIHZlcnkgbGFyZ2UgcHJlY2lzaW9uLAorLy8gICAgZS5nLiAiJS41MGciLCB3ZSBnZXQgIjAuMjAwMDAwMDAwMDAwMDAwMDExMTAyMjMwMjQ2MjUxNTY1NDA0MjM2MzE2NyIuCisvLyAgICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2Ugc2V0IHRoZSBwcmVjaXNpb24gdG9vIGxvdywgd2UgbG9zZQorLy8gICAgc2lnbmlmaWNhbnQgZGlnaXRzIHdoZW4gcHJpbnRpbmcgbnVtYmVycyB0aGF0IGFjdHVhbGx5IG5lZWQgdGhlbS4KKy8vICAgIEl0IHR1cm5zIG91dCB0aGVyZSBpcyBubyBwcmVjaXNpb24gdmFsdWUgdGhhdCBkb2VzIHRoZSByaWdodCB0aGluZworLy8gICAgZm9yIGFsbCBudW1iZXJzLgorLy8KKy8vICAgIE91ciBzdHJhdGVneSBpcyB0byBmaXJzdCB0cnkgcHJpbnRpbmcgd2l0aCBhIHByZWNpc2lvbiB0aGF0IGlzIG5ldmVyCisvLyAgICBvdmVyLXByZWNpc2UsIHRoZW4gcGFyc2UgdGhlIHJlc3VsdCB3aXRoIHN0cnRvZCgpIHRvIHNlZSBpZiBpdAorLy8gICAgbWF0Y2hlcy4gIElmIG5vdCwgd2UgcHJpbnQgYWdhaW4gd2l0aCBhIHByZWNpc2lvbiB0aGF0IHdpbGwgYWx3YXlzCisvLyAgICBnaXZlIGEgcHJlY2lzZSByZXN1bHQsIGJ1dCBtYXkgdXNlIG1vcmUgZGlnaXRzIHRoYW4gbmVjZXNzYXJ5LgorLy8KKy8vICAgIEFuIGFyZ3VhYmx5IGJldHRlciBzdHJhdGVneSB3b3VsZCBiZSB0byB1c2UgdGhlIGFsZ29yaXRobSBkZXNjcmliZWQKKy8vICAgIGluICJIb3cgdG8gUHJpbnQgRmxvYXRpbmctUG9pbnQgTnVtYmVycyBBY2N1cmF0ZWx5IiBieSBTdGVlbGUgJgorLy8gICAgV2hpdGUsIGUuZy4gYXMgaW1wbGVtZW50ZWQgYnkgRGF2aWQgTS4gR2F5J3MgZHRvYSgpLiAgSXQgdHVybnMgb3V0LAorLy8gICAgaG93ZXZlciwgdGhhdCB0aGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9uIGlzIGFib3V0IGFzIGZhc3QgYXMKKy8vICAgIERNRydzIGNvZGUuICBGdXJ0aGVybW9yZSwgRE1HJ3MgY29kZSBsb2NrcyBtdXRleGVzLCB3aGljaCBtZWFucyBpdAorLy8gICAgd2lsbCBub3Qgc2NhbGUgd2VsbCBvbiBtdWx0aS1jb3JlIG1hY2hpbmVzLiAgRE1HJ3MgY29kZSBpcyBzbGlnaHRseQorLy8gICAgbW9yZSBhY2N1cmF0ZSAoaW4gdGhhdCBpdCB3aWxsIG5ldmVyIHVzZSBtb3JlIGRpZ2l0cyB0aGFuCisvLyAgICBuZWNlc3NhcnkpLCBidXQgdGhpcyBpcyBwcm9iYWJseSBpcnJlbGV2YW50IGZvciBtb3N0IHVzZXJzLgorLy8KKy8vICAgIFJvYiBQaWtlIGFuZCBLZW4gVGhvbXBzb24gYWxzbyBoYXZlIGFuIGltcGxlbWVudGF0aW9uIG9mIGR0b2EoKSBpbgorLy8gICAgdGhpcmRfcGFydHkvZm10L2ZsdGZtdC5jYy4gIFRoZWlyIGltcGxlbWVudGF0aW9uIGlzIHNpbWlsYXIgdG8gdGhpcworLy8gICAgb25lIGluIHRoYXQgaXQgbWFrZXMgZ3Vlc3NlcyBhbmQgdGhlbiB1c2VzIHN0cnRvZCgpIHRvIGNoZWNrIHRoZW0uCisvLyAgICBUaGVpciBpbXBsZW1lbnRhdGlvbiBpcyBmYXN0ZXIgYmVjYXVzZSB0aGV5IHVzZSB0aGVpciBvd24gY29kZSB0bworLy8gICAgZ2VuZXJhdGUgdGhlIGRpZ2l0cyBpbiB0aGUgZmlyc3QgcGxhY2UgcmF0aGVyIHRoYW4gdXNlIHNucHJpbnRmKCksCisvLyAgICB0aHVzIGF2b2lkaW5nIGZvcm1hdCBzdHJpbmcgcGFyc2luZyBvdmVyaGVhZC4gIEhvd2V2ZXIsIHRoaXMgbWFrZXMKKy8vICAgIGl0IGNvbnNpZGVyYWJseSBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gdGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiwKKy8vICAgIGFuZCBpdCBpcyBlbWJlZGRlZCBpbiBhIGxhcmdlciBsaWJyYXJ5LiAgSWYgc3BlZWQgdHVybnMgb3V0IHRvIGJlCisvLyAgICBhbiBpc3N1ZSwgd2UgY291bGQgcmUtaW1wbGVtZW50IHRoaXMgaW4gdGVybXMgb2YgdGhlaXIKKy8vICAgIGltcGxlbWVudGF0aW9uLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGQ6OnN0cmluZyBTaW1wbGVEdG9hKGRvdWJsZSB2YWx1ZSkgeworICBjaGFyIGJ1ZmZlcltrRG91YmxlVG9CdWZmZXJTaXplXTsKKyAgcmV0dXJuIERvdWJsZVRvQnVmZmVyKHZhbHVlLCBidWZmZXIpOworfQorCitzdGQ6OnN0cmluZyBTaW1wbGVGdG9hKGZsb2F0IHZhbHVlKSB7CisgIGNoYXIgYnVmZmVyW2tGbG9hdFRvQnVmZmVyU2l6ZV07CisgIHJldHVybiBGbG9hdFRvQnVmZmVyKHZhbHVlLCBidWZmZXIpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgSXNWYWxpZEZsb2F0Q2hhcihjaGFyIGMpIHsKKyAgcmV0dXJuICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgfHwKKyAgICAgICAgIGMgPT0gJ2UnIHx8IGMgPT0gJ0UnIHx8CisgICAgICAgICBjID09ICcrJyB8fCBjID09ICctJzsKK30KKwordm9pZCBEZWxvY2FsaXplUmFkaXgoY2hhciogYnVmZmVyKSB7CisgIC8vIEZhc3QgY2hlY2s6ICBpZiB0aGUgYnVmZmVyIGhhcyBhIG5vcm1hbCBkZWNpbWFsIHBvaW50LCBhc3N1bWUgbm8KKyAgLy8gdHJhbnNsYXRpb24gaXMgbmVlZGVkLgorICBpZiAoc3RyY2hyKGJ1ZmZlciwgJy4nKSAhPSBudWxscHRyKSByZXR1cm47CisKKyAgLy8gRmluZCB0aGUgZmlyc3QgdW5rbm93biBjaGFyYWN0ZXIuCisgIHdoaWxlIChJc1ZhbGlkRmxvYXRDaGFyKCpidWZmZXIpKSArK2J1ZmZlcjsKKworICBpZiAoKmJ1ZmZlciA9PSAnXDAnKSB7CisgICAgLy8gTm8gcmFkaXggY2hhcmFjdGVyIGZvdW5kLgorICAgIHJldHVybjsKKyAgfQorCisgIC8vIFdlIGFyZSBub3cgcG9pbnRpbmcgYXQgdGhlIGxvY2FsZS1zcGVjaWZpYyByYWRpeCBjaGFyYWN0ZXIuICBSZXBsYWNlIGl0CisgIC8vIHdpdGggJy4nLgorICAqYnVmZmVyID0gJy4nOworICArK2J1ZmZlcjsKKworICBpZiAoIUlzVmFsaWRGbG9hdENoYXIoKmJ1ZmZlcikgJiYgKmJ1ZmZlciAhPSAnXDAnKSB7CisgICAgLy8gSXQgYXBwZWFycyB0aGUgcmFkaXggd2FzIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuICBXZSBuZWVkIHRvIHJlbW92ZSB0aGUKKyAgICAvLyBleHRyYSBieXRlcy4KKyAgICBjaGFyKiB0YXJnZXQgPSBidWZmZXI7CisgICAgZG8geyArK2J1ZmZlcjsgfSB3aGlsZSAoIUlzVmFsaWRGbG9hdENoYXIoKmJ1ZmZlcikgJiYgKmJ1ZmZlciAhPSAnXDAnKTsKKyAgICBtZW1tb3ZlKHRhcmdldCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSArIDEpOworICB9Cit9CisKK2NoYXIqIERvdWJsZVRvQnVmZmVyKGRvdWJsZSB2YWx1ZSwgY2hhciogYnVmZmVyKSB7CisgIC8vIERCTF9ESUcgaXMgMTUgZm9yIElFRUUtNzU0IGRvdWJsZXMsIHdoaWNoIGFyZSB1c2VkIG9uIGFsbW9zdCBhbGwKKyAgLy8gcGxhdGZvcm1zIHRoZXNlIGRheXMuICBKdXN0IGluIGNhc2Ugc29tZSBzeXN0ZW0gZXhpc3RzIHdoZXJlIERCTF9ESUcKKyAgLy8gaXMgc2lnbmlmaWNhbnRseSBsYXJnZXIgLS0gYW5kIHJpc2tzIG92ZXJmbG93aW5nIG91ciBidWZmZXIgLS0gd2UgaGF2ZQorICAvLyB0aGlzIGFzc2VydC4KKyAgc3RhdGljX2Fzc2VydChEQkxfRElHIDwgMjAsICJEQkxfRElHX2lzX3Rvb19iaWciKTsKKworICBpZiAodmFsdWUgPT0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7CisgICAgc3RyY3B5KGJ1ZmZlciwgImluZiIpOworICAgIHJldHVybiBidWZmZXI7CisgIH0gZWxzZSBpZiAodmFsdWUgPT0gLXN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgeworICAgIHN0cmNweShidWZmZXIsICItaW5mIik7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfSBlbHNlIGlmIChzdGQ6OmlzbmFuKHZhbHVlKSkgeworICAgIHN0cmNweShidWZmZXIsICJuYW4iKTsKKyAgICByZXR1cm4gYnVmZmVyOworICB9CisKKyAgaW50IHNucHJpbnRmX3Jlc3VsdCA9CisgICAgc25wcmludGYoYnVmZmVyLCBrRG91YmxlVG9CdWZmZXJTaXplLCAiJS4qZyIsIERCTF9ESUcsIHZhbHVlKTsKKworICAvLyBUaGUgc25wcmludGYgc2hvdWxkIG5ldmVyIG92ZXJmbG93IGJlY2F1c2UgdGhlIGJ1ZmZlciBpcyBzaWduaWZpY2FudGx5CisgIC8vIGxhcmdlciB0aGFuIHRoZSBwcmVjaXNpb24gd2UgYXNrZWQgZm9yLgorICBHT09HTEVfRENIRUNLKHNucHJpbnRmX3Jlc3VsdCA+IDAgJiYgc25wcmludGZfcmVzdWx0IDwga0RvdWJsZVRvQnVmZmVyU2l6ZSk7CisKKyAgLy8gV2UgbmVlZCB0byBtYWtlIHBhcnNlZF92YWx1ZSB2b2xhdGlsZSBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8KKyAgLy8gd3JpdGUgaXQgb3V0IHRvIHRoZSBzdGFjay4gIE90aGVyd2lzZSwgaXQgbWF5IGtlZXAgdGhlIHZhbHVlIGluIGEKKyAgLy8gcmVnaXN0ZXIsIGFuZCBpZiBpdCBkb2VzIHRoYXQsIGl0IG1heSBrZWVwIGl0IGFzIGEgbG9uZyBkb3VibGUgaW5zdGVhZAorICAvLyBvZiBhIGRvdWJsZS4gIFRoaXMgbG9uZyBkb3VibGUgbWF5IGhhdmUgZXh0cmEgYml0cyB0aGF0IG1ha2UgaXQgY29tcGFyZQorICAvLyB1bmVxdWFsIHRvICJ2YWx1ZSIgZXZlbiB0aG91Z2ggaXQgd291bGQgYmUgZXhhY3RseSBlcXVhbCBpZiBpdCB3ZXJlCisgIC8vIHRydW5jYXRlZCB0byBhIGRvdWJsZS4KKyAgdm9sYXRpbGUgZG91YmxlIHBhcnNlZF92YWx1ZSA9IGludGVybmFsOjpOb0xvY2FsZVN0cnRvZChidWZmZXIsIG51bGxwdHIpOworICBpZiAocGFyc2VkX3ZhbHVlICE9IHZhbHVlKSB7CisgICAgc25wcmludGZfcmVzdWx0ID0KKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBrRG91YmxlVG9CdWZmZXJTaXplLCAiJS4qZyIsIERCTF9ESUcgKyAyLCB2YWx1ZSk7CisKKyAgICAvLyBTaG91bGQgbmV2ZXIgb3ZlcmZsb3c7IHNlZSBhYm92ZS4KKyAgICBHT09HTEVfRENIRUNLKHNucHJpbnRmX3Jlc3VsdCA+IDAgJiYgc25wcmludGZfcmVzdWx0IDwga0RvdWJsZVRvQnVmZmVyU2l6ZSk7CisgIH0KKworICBEZWxvY2FsaXplUmFkaXgoYnVmZmVyKTsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIGludCBtZW1jYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IGxlbikgeworICBjb25zdCB1bnNpZ25lZCBjaGFyICp1czEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIgKj4oczEpOworICBjb25zdCB1bnNpZ25lZCBjaGFyICp1czIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIgKj4oczIpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBjb25zdCBpbnQgZGlmZiA9CisgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGFzY2lpX3RvbG93ZXIodXMxW2ldKSkpIC0KKyAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYXNjaWlfdG9sb3dlcih1czJbaV0pKSk7CisgICAgaWYgKGRpZmYgIT0gMCkgcmV0dXJuIGRpZmY7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2lubGluZSBib29sIENhc2VFcXVhbChTdHJpbmdQaWVjZSBzMSwgU3RyaW5nUGllY2UgczIpIHsKKyAgaWYgKHMxLnNpemUoKSAhPSBzMi5zaXplKCkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIG1lbWNhc2VjbXAoczEuZGF0YSgpLCBzMi5kYXRhKCksIHMxLnNpemUoKSkgPT0gMDsKK30KKworYm9vbCBzYWZlX3N0cnRvYihTdHJpbmdQaWVjZSBzdHIsIGJvb2wqIHZhbHVlKSB7CisgIEdPT0dMRV9DSEVDSyh2YWx1ZSAhPSBudWxscHRyKSA8PCAibnVsbHB0ciBvdXRwdXQgYm9vbGVhbiBnaXZlbi4iOworICBpZiAoQ2FzZUVxdWFsKHN0ciwgInRydWUiKSB8fCBDYXNlRXF1YWwoc3RyLCAidCIpIHx8CisgICAgICBDYXNlRXF1YWwoc3RyLCAieWVzIikgfHwgQ2FzZUVxdWFsKHN0ciwgInkiKSB8fAorICAgICAgQ2FzZUVxdWFsKHN0ciwgIjEiKSkgeworICAgICp2YWx1ZSA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKENhc2VFcXVhbChzdHIsICJmYWxzZSIpIHx8IENhc2VFcXVhbChzdHIsICJmIikgfHwKKyAgICAgIENhc2VFcXVhbChzdHIsICJubyIpIHx8IENhc2VFcXVhbChzdHIsICJuIikgfHwKKyAgICAgIENhc2VFcXVhbChzdHIsICIwIikpIHsKKyAgICAqdmFsdWUgPSBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgc2FmZV9zdHJ0b2YoY29uc3QgY2hhciogc3RyLCBmbG9hdCogdmFsdWUpIHsKKyAgY2hhciogZW5kcHRyOworICBlcnJubyA9IDA7ICAvLyBlcnJubyBvbmx5IGdldHMgc2V0IG9uIGVycm9ycworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkIChfX2hwdXgpICAvLyBoYXMgbm8gc3RydG9mKCkKKyAgKnZhbHVlID0gaW50ZXJuYWw6Ok5vTG9jYWxlU3RydG9kKHN0ciwgJmVuZHB0cik7CisjZWxzZQorICAqdmFsdWUgPSBzdHJ0b2Yoc3RyLCAmZW5kcHRyKTsKKyNlbmRpZgorICByZXR1cm4gKnN0ciAhPSAwICYmICplbmRwdHIgPT0gMCAmJiBlcnJubyA9PSAwOworfQorCitib29sIHNhZmVfc3RydG9kKGNvbnN0IGNoYXIqIHN0ciwgZG91YmxlKiB2YWx1ZSkgeworICBjaGFyKiBlbmRwdHI7CisgICp2YWx1ZSA9IGludGVybmFsOjpOb0xvY2FsZVN0cnRvZChzdHIsICZlbmRwdHIpOworICBpZiAoZW5kcHRyICE9IHN0cikgeworICAgIHdoaWxlIChhc2NpaV9pc3NwYWNlKCplbmRwdHIpKSArK2VuZHB0cjsKKyAgfQorICAvLyBJZ25vcmUgcmFuZ2UgZXJyb3JzIGZyb20gc3RydG9kLiAgVGhlIHZhbHVlcyBpdAorICAvLyByZXR1cm5zIG9uIHVuZGVyZmxvdyBhbmQgb3ZlcmZsb3cgYXJlIHRoZSByaWdodAorICAvLyBmYWxsYmFjayBpbiBhIHJvYnVzdCBzZXR0aW5nLgorICByZXR1cm4gKnN0ciAhPSAnXDAnICYmICplbmRwdHIgPT0gJ1wwJzsKK30KKworYm9vbCBzYWZlX3N0cnRvMzIoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgaW50MzJfdCAqdmFsdWUpIHsKKyAgcmV0dXJuIHNhZmVfaW50X2ludGVybmFsKHN0ciwgdmFsdWUpOworfQorCitib29sIHNhZmVfc3RydG91MzIoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgdWludDMyX3QgKnZhbHVlKSB7CisgIHJldHVybiBzYWZlX3VpbnRfaW50ZXJuYWwoc3RyLCB2YWx1ZSk7Cit9CisKK2Jvb2wgc2FmZV9zdHJ0bzY0KGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGludDY0X3QgKnZhbHVlKSB7CisgIHJldHVybiBzYWZlX2ludF9pbnRlcm5hbChzdHIsIHZhbHVlKTsKK30KKworYm9vbCBzYWZlX3N0cnRvdTY0KGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIHVpbnQ2NF90ICp2YWx1ZSkgeworICByZXR1cm4gc2FmZV91aW50X2ludGVybmFsKHN0ciwgdmFsdWUpOworfQorCitjaGFyKiBGbG9hdFRvQnVmZmVyKGZsb2F0IHZhbHVlLCBjaGFyKiBidWZmZXIpIHsKKyAgLy8gRkxUX0RJRyBpcyA2IGZvciBJRUVFLTc1NCBmbG9hdHMsIHdoaWNoIGFyZSB1c2VkIG9uIGFsbW9zdCBhbGwKKyAgLy8gcGxhdGZvcm1zIHRoZXNlIGRheXMuICBKdXN0IGluIGNhc2Ugc29tZSBzeXN0ZW0gZXhpc3RzIHdoZXJlIEZMVF9ESUcKKyAgLy8gaXMgc2lnbmlmaWNhbnRseSBsYXJnZXIgLS0gYW5kIHJpc2tzIG92ZXJmbG93aW5nIG91ciBidWZmZXIgLS0gd2UgaGF2ZQorICAvLyB0aGlzIGFzc2VydC4KKyAgc3RhdGljX2Fzc2VydChGTFRfRElHIDwgMTAsICJGTFRfRElHX2lzX3Rvb19iaWciKTsKKworICBpZiAodmFsdWUgPT0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7CisgICAgc3RyY3B5KGJ1ZmZlciwgImluZiIpOworICAgIHJldHVybiBidWZmZXI7CisgIH0gZWxzZSBpZiAodmFsdWUgPT0gLXN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgeworICAgIHN0cmNweShidWZmZXIsICItaW5mIik7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfSBlbHNlIGlmIChzdGQ6OmlzbmFuKHZhbHVlKSkgeworICAgIHN0cmNweShidWZmZXIsICJuYW4iKTsKKyAgICByZXR1cm4gYnVmZmVyOworICB9CisKKyAgaW50IHNucHJpbnRmX3Jlc3VsdCA9CisgICAgc25wcmludGYoYnVmZmVyLCBrRmxvYXRUb0J1ZmZlclNpemUsICIlLipnIiwgRkxUX0RJRywgdmFsdWUpOworCisgIC8vIFRoZSBzbnByaW50ZiBzaG91bGQgbmV2ZXIgb3ZlcmZsb3cgYmVjYXVzZSB0aGUgYnVmZmVyIGlzIHNpZ25pZmljYW50bHkKKyAgLy8gbGFyZ2VyIHRoYW4gdGhlIHByZWNpc2lvbiB3ZSBhc2tlZCBmb3IuCisgIEdPT0dMRV9EQ0hFQ0soc25wcmludGZfcmVzdWx0ID4gMCAmJiBzbnByaW50Zl9yZXN1bHQgPCBrRmxvYXRUb0J1ZmZlclNpemUpOworCisgIGZsb2F0IHBhcnNlZF92YWx1ZTsKKyAgaWYgKCFzYWZlX3N0cnRvZihidWZmZXIsICZwYXJzZWRfdmFsdWUpIHx8IHBhcnNlZF92YWx1ZSAhPSB2YWx1ZSkgeworICAgIHNucHJpbnRmX3Jlc3VsdCA9CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwga0Zsb2F0VG9CdWZmZXJTaXplLCAiJS4qZyIsIEZMVF9ESUcgKyAzLCB2YWx1ZSk7CisKKyAgICAvLyBTaG91bGQgbmV2ZXIgb3ZlcmZsb3c7IHNlZSBhYm92ZS4KKyAgICBHT09HTEVfRENIRUNLKHNucHJpbnRmX3Jlc3VsdCA+IDAgJiYgc25wcmludGZfcmVzdWx0IDwga0Zsb2F0VG9CdWZmZXJTaXplKTsKKyAgfQorCisgIERlbG9jYWxpemVSYWRpeChidWZmZXIpOworICByZXR1cm4gYnVmZmVyOworfQorCituYW1lc3BhY2Ugc3RyaW5ncyB7CisKK0FscGhhTnVtOjpBbHBoYU51bShzdHJpbmdzOjpIZXggaGV4KSB7CisgIGNoYXIgKmNvbnN0IGVuZCA9ICZkaWdpdHNba0Zhc3RUb0J1ZmZlclNpemVdOworICBjaGFyICp3cml0ZXIgPSBlbmQ7CisgIHVpbnQ2NF90IHZhbHVlID0gaGV4LnZhbHVlOworICB1aW50NjRfdCB3aWR0aCA9IGhleC5zcGVjOworICAvLyBXZSBhY2NvbXBsaXNoIG1pbmltdW0gd2lkdGggYnkgT1InaW5nIGluIDB4MTAwMDAgdG8gdGhlIHVzZXIncyB2YWx1ZSwKKyAgLy8gd2hlcmUgMHgxMDAwMCBpcyB0aGUgc21hbGxlc3QgaGV4IG51bWJlciB0aGF0IGlzIGFzIHdpZGUgYXMgdGhlIHVzZXIKKyAgLy8gYXNrZWQgZm9yLgorICB1aW50NjRfdCBtYXNrID0gKHN0YXRpY19jYXN0PHVpbnQ2NF90PigxKSA8PCAoKHdpZHRoIC0gMSkgKiA0KSkgfCB2YWx1ZTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgaGV4ZGlnaXRzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgIGRvIHsKKyAgICAqLS13cml0ZXIgPSBoZXhkaWdpdHNbdmFsdWUgJiAweEZdOworICAgIHZhbHVlID4+PSA0OworICAgIG1hc2sgPj49IDQ7CisgIH0gd2hpbGUgKG1hc2sgIT0gMCk7CisgIHBpZWNlX2RhdGFfID0gd3JpdGVyOworICBwaWVjZV9zaXplXyA9IGVuZCAtIHdyaXRlcjsKK30KKworfSAgLy8gbmFtZXNwYWNlIHN0cmluZ3MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3RyQ2F0KCkKKy8vICAgIFRoaXMgbWVyZ2VzIHRoZSBnaXZlbiBzdHJpbmdzIG9yIGludGVnZXJzLCB3aXRoIG5vIGRlbGltaXRlci4gIFRoaXMKKy8vICAgIGlzIGRlc2lnbmVkIHRvIGJlIHRoZSBmYXN0ZXN0IHBvc3NpYmxlIHdheSB0byBjb25zdHJ1Y3QgYSBzdHJpbmcgb3V0CisvLyAgICBvZiBhIG1peCBvZiByYXcgQyBzdHJpbmdzLCBDKysgc3RyaW5ncywgYW5kIGludGVnZXIgdmFsdWVzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBcHBlbmQgaXMgbWVyZWx5IGEgdmVyc2lvbiBvZiBtZW1jcHkgdGhhdCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBieXRlCisvLyBhZnRlciB0aGUgYXJlYSBqdXN0IG92ZXJ3cml0dGVuLiAgSXQgY29tZXMgaW4gbXVsdGlwbGUgZmxhdm9ycyB0byBtaW5pbWl6ZQorLy8gY2FsbCBvdmVyaGVhZC4KK3N0YXRpYyBjaGFyICpBcHBlbmQxKGNoYXIgKm91dCwgY29uc3QgQWxwaGFOdW0gJngpIHsKKyAgaWYgKHguc2l6ZSgpID4gMCkgeworICAgIG1lbWNweShvdXQsIHguZGF0YSgpLCB4LnNpemUoKSk7CisgICAgb3V0ICs9IHguc2l6ZSgpOworICB9CisgIHJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBjaGFyICpBcHBlbmQyKGNoYXIgKm91dCwgY29uc3QgQWxwaGFOdW0gJngxLCBjb25zdCBBbHBoYU51bSAmeDIpIHsKKyAgaWYgKHgxLnNpemUoKSA+IDApIHsKKyAgICBtZW1jcHkob3V0LCB4MS5kYXRhKCksIHgxLnNpemUoKSk7CisgICAgb3V0ICs9IHgxLnNpemUoKTsKKyAgfQorICBpZiAoeDIuc2l6ZSgpID4gMCkgeworICAgIG1lbWNweShvdXQsIHgyLmRhdGEoKSwgeDIuc2l6ZSgpKTsKKyAgICBvdXQgKz0geDIuc2l6ZSgpOworICB9CisgIHJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBjaGFyICpBcHBlbmQ0KGNoYXIgKm91dCwgY29uc3QgQWxwaGFOdW0gJngxLCBjb25zdCBBbHBoYU51bSAmeDIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSAmeDMsIGNvbnN0IEFscGhhTnVtICZ4NCkgeworICBpZiAoeDEuc2l6ZSgpID4gMCkgeworICAgIG1lbWNweShvdXQsIHgxLmRhdGEoKSwgeDEuc2l6ZSgpKTsKKyAgICBvdXQgKz0geDEuc2l6ZSgpOworICB9CisgIGlmICh4Mi5zaXplKCkgPiAwKSB7CisgICAgbWVtY3B5KG91dCwgeDIuZGF0YSgpLCB4Mi5zaXplKCkpOworICAgIG91dCArPSB4Mi5zaXplKCk7CisgIH0KKyAgaWYgKHgzLnNpemUoKSA+IDApIHsKKyAgICBtZW1jcHkob3V0LCB4My5kYXRhKCksIHgzLnNpemUoKSk7CisgICAgb3V0ICs9IHgzLnNpemUoKTsKKyAgfQorICBpZiAoeDQuc2l6ZSgpID4gMCkgeworICAgIG1lbWNweShvdXQsIHg0LmRhdGEoKSwgeDQuc2l6ZSgpKTsKKyAgICBvdXQgKz0geDQuc2l6ZSgpOworICB9CisgIHJldHVybiBvdXQ7Cit9CisKK3N0ZDo6c3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSAmYSwgY29uc3QgQWxwaGFOdW0gJmIpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzaXplKGEuc2l6ZSgpICsgYi5zaXplKCkpOworICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LmJlZ2luKCk7CisgIGNoYXIgKm91dCA9IEFwcGVuZDIoYmVnaW4sIGEsIGIpOworICBHT09HTEVfRENIRUNLX0VRKG91dCwgYmVnaW4gKyByZXN1bHQuc2l6ZSgpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtICZhLCBjb25zdCBBbHBoYU51bSAmYiwgY29uc3QgQWxwaGFOdW0gJmMpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzaXplKGEuc2l6ZSgpICsgYi5zaXplKCkgKyBjLnNpemUoKSk7CisgIGNoYXIgKmNvbnN0IGJlZ2luID0gJipyZXN1bHQuYmVnaW4oKTsKKyAgY2hhciAqb3V0ID0gQXBwZW5kMihiZWdpbiwgYSwgYik7CisgIG91dCA9IEFwcGVuZDEob3V0LCBjKTsKKyAgR09PR0xFX0RDSEVDS19FUShvdXQsIGJlZ2luICsgcmVzdWx0LnNpemUoKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0ZDo6c3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSAmYSwgY29uc3QgQWxwaGFOdW0gJmIsIGNvbnN0IEFscGhhTnVtICZjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZkKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2l6ZShhLnNpemUoKSArIGIuc2l6ZSgpICsgYy5zaXplKCkgKyBkLnNpemUoKSk7CisgIGNoYXIgKmNvbnN0IGJlZ2luID0gJipyZXN1bHQuYmVnaW4oKTsKKyAgY2hhciAqb3V0ID0gQXBwZW5kNChiZWdpbiwgYSwgYiwgYywgZCk7CisgIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC5zaXplKCkpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGQ6OnN0cmluZyBTdHJDYXQoY29uc3QgQWxwaGFOdW0gJmEsIGNvbnN0IEFscGhhTnVtICZiLCBjb25zdCBBbHBoYU51bSAmYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSAmZCwgY29uc3QgQWxwaGFOdW0gJmUpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzaXplKGEuc2l6ZSgpICsgYi5zaXplKCkgKyBjLnNpemUoKSArIGQuc2l6ZSgpICsgZS5zaXplKCkpOworICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LmJlZ2luKCk7CisgIGNoYXIgKm91dCA9IEFwcGVuZDQoYmVnaW4sIGEsIGIsIGMsIGQpOworICBvdXQgPSBBcHBlbmQxKG91dCwgZSk7CisgIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC5zaXplKCkpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGQ6OnN0cmluZyBTdHJDYXQoY29uc3QgQWxwaGFOdW0gJmEsIGNvbnN0IEFscGhhTnVtICZiLCBjb25zdCBBbHBoYU51bSAmYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSAmZCwgY29uc3QgQWxwaGFOdW0gJmUsIGNvbnN0IEFscGhhTnVtICZmKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2l6ZShhLnNpemUoKSArIGIuc2l6ZSgpICsgYy5zaXplKCkgKyBkLnNpemUoKSArIGUuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICBmLnNpemUoKSk7CisgIGNoYXIgKmNvbnN0IGJlZ2luID0gJipyZXN1bHQuYmVnaW4oKTsKKyAgY2hhciAqb3V0ID0gQXBwZW5kNChiZWdpbiwgYSwgYiwgYywgZCk7CisgIG91dCA9IEFwcGVuZDIob3V0LCBlLCBmKTsKKyAgR09PR0xFX0RDSEVDS19FUShvdXQsIGJlZ2luICsgcmVzdWx0LnNpemUoKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0ZDo6c3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSAmYSwgY29uc3QgQWxwaGFOdW0gJmIsIGNvbnN0IEFscGhhTnVtICZjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZkLCBjb25zdCBBbHBoYU51bSAmZSwgY29uc3QgQWxwaGFOdW0gJmYsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0gJmcpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzaXplKGEuc2l6ZSgpICsgYi5zaXplKCkgKyBjLnNpemUoKSArIGQuc2l6ZSgpICsgZS5zaXplKCkgKworICAgICAgICAgICAgICAgIGYuc2l6ZSgpICsgZy5zaXplKCkpOworICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LmJlZ2luKCk7CisgIGNoYXIgKm91dCA9IEFwcGVuZDQoYmVnaW4sIGEsIGIsIGMsIGQpOworICBvdXQgPSBBcHBlbmQyKG91dCwgZSwgZik7CisgIG91dCA9IEFwcGVuZDEob3V0LCBnKTsKKyAgR09PR0xFX0RDSEVDS19FUShvdXQsIGJlZ2luICsgcmVzdWx0LnNpemUoKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0ZDo6c3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSAmYSwgY29uc3QgQWxwaGFOdW0gJmIsIGNvbnN0IEFscGhhTnVtICZjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZkLCBjb25zdCBBbHBoYU51bSAmZSwgY29uc3QgQWxwaGFOdW0gJmYsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0gJmcsIGNvbnN0IEFscGhhTnVtICZoKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2l6ZShhLnNpemUoKSArIGIuc2l6ZSgpICsgYy5zaXplKCkgKyBkLnNpemUoKSArIGUuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICBmLnNpemUoKSArIGcuc2l6ZSgpICsgaC5zaXplKCkpOworICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LmJlZ2luKCk7CisgIGNoYXIgKm91dCA9IEFwcGVuZDQoYmVnaW4sIGEsIGIsIGMsIGQpOworICBvdXQgPSBBcHBlbmQ0KG91dCwgZSwgZiwgZywgaCk7CisgIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC5zaXplKCkpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGQ6OnN0cmluZyBTdHJDYXQoY29uc3QgQWxwaGFOdW0gJmEsIGNvbnN0IEFscGhhTnVtICZiLCBjb25zdCBBbHBoYU51bSAmYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSAmZCwgY29uc3QgQWxwaGFOdW0gJmUsIGNvbnN0IEFscGhhTnVtICZmLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZnLCBjb25zdCBBbHBoYU51bSAmaCwgY29uc3QgQWxwaGFOdW0gJmkpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzaXplKGEuc2l6ZSgpICsgYi5zaXplKCkgKyBjLnNpemUoKSArIGQuc2l6ZSgpICsgZS5zaXplKCkgKworICAgICAgICAgICAgICAgIGYuc2l6ZSgpICsgZy5zaXplKCkgKyBoLnNpemUoKSArIGkuc2l6ZSgpKTsKKyAgY2hhciAqY29uc3QgYmVnaW4gPSAmKnJlc3VsdC5iZWdpbigpOworICBjaGFyICpvdXQgPSBBcHBlbmQ0KGJlZ2luLCBhLCBiLCBjLCBkKTsKKyAgb3V0ID0gQXBwZW5kNChvdXQsIGUsIGYsIGcsIGgpOworICBvdXQgPSBBcHBlbmQxKG91dCwgaSk7CisgIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC5zaXplKCkpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBJdCdzIHBvc3NpYmxlIHRvIGNhbGwgU3RyQXBwZW5kIHdpdGggYSBjaGFyICogcG9pbnRlciB0aGF0IGlzIHBhcnR3YXkgaW50bworLy8gdGhlIHN0cmluZyB3ZSdyZSBhcHBlbmRpbmcgdG8uICBIb3dldmVyIHRoZSByZXN1bHRzIG9mIHRoaXMgYXJlIHJhbmRvbS4KKy8vIFRoZXJlZm9yZSwgY2hlY2sgZm9yIHRoaXMgaW4gZGVidWcgbW9kZS4gIFVzZSB1bnNpZ25lZCBtYXRoIHNvIHdlIG9ubHkgaGF2ZQorLy8gdG8gZG8gb25lIGNvbXBhcmlzb24uCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTk9fT1ZFUkxBUChkZXN0LCBzcmMpIFwKKyAgICBHT09HTEVfRENIRUNLX0dUKHVpbnRwdHJfdCgoc3JjKS5kYXRhKCkgLSAoZGVzdCkuZGF0YSgpKSwgXAorICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90KChkZXN0KS5zaXplKCkpKQorCit2b2lkIFN0ckFwcGVuZChzdGQ6OnN0cmluZyAqcmVzdWx0LCBjb25zdCBBbHBoYU51bSAmYSkgeworICBHT09HTEVfRENIRUNLX05PX09WRVJMQVAoKnJlc3VsdCwgYSk7CisgIHJlc3VsdC0+YXBwZW5kKGEuZGF0YSgpLCBhLnNpemUoKSk7Cit9CisKK3ZvaWQgU3RyQXBwZW5kKHN0ZDo6c3RyaW5nICpyZXN1bHQsIGNvbnN0IEFscGhhTnVtICZhLCBjb25zdCBBbHBoYU51bSAmYikgeworICBHT09HTEVfRENIRUNLX05PX09WRVJMQVAoKnJlc3VsdCwgYSk7CisgIEdPT0dMRV9EQ0hFQ0tfTk9fT1ZFUkxBUCgqcmVzdWx0LCBiKTsKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBvbGRfc2l6ZSA9IHJlc3VsdC0+c2l6ZSgpOworICByZXN1bHQtPnJlc2l6ZShvbGRfc2l6ZSArIGEuc2l6ZSgpICsgYi5zaXplKCkpOworICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LT5iZWdpbigpOworICBjaGFyICpvdXQgPSBBcHBlbmQyKGJlZ2luICsgb2xkX3NpemUsIGEsIGIpOworICBHT09HTEVfRENIRUNLX0VRKG91dCwgYmVnaW4gKyByZXN1bHQtPnNpemUoKSk7Cit9CisKK3ZvaWQgU3RyQXBwZW5kKHN0ZDo6c3RyaW5nICpyZXN1bHQsIGNvbnN0IEFscGhhTnVtICZhLCBjb25zdCBBbHBoYU51bSAmYiwKKyAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZjKSB7CisgIEdPT0dMRV9EQ0hFQ0tfTk9fT1ZFUkxBUCgqcmVzdWx0LCBhKTsKKyAgR09PR0xFX0RDSEVDS19OT19PVkVSTEFQKCpyZXN1bHQsIGIpOworICBHT09HTEVfRENIRUNLX05PX09WRVJMQVAoKnJlc3VsdCwgYyk7CisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgb2xkX3NpemUgPSByZXN1bHQtPnNpemUoKTsKKyAgcmVzdWx0LT5yZXNpemUob2xkX3NpemUgKyBhLnNpemUoKSArIGIuc2l6ZSgpICsgYy5zaXplKCkpOworICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LT5iZWdpbigpOworICBjaGFyICpvdXQgPSBBcHBlbmQyKGJlZ2luICsgb2xkX3NpemUsIGEsIGIpOworICBvdXQgPSBBcHBlbmQxKG91dCwgYyk7CisgIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC0+c2l6ZSgpKTsKK30KKwordm9pZCBTdHJBcHBlbmQoc3RkOjpzdHJpbmcgKnJlc3VsdCwgY29uc3QgQWxwaGFOdW0gJmEsIGNvbnN0IEFscGhhTnVtICZiLAorICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0gJmMsIGNvbnN0IEFscGhhTnVtICZkKSB7CisgIEdPT0dMRV9EQ0hFQ0tfTk9fT1ZFUkxBUCgqcmVzdWx0LCBhKTsKKyAgR09PR0xFX0RDSEVDS19OT19PVkVSTEFQKCpyZXN1bHQsIGIpOworICBHT09HTEVfRENIRUNLX05PX09WRVJMQVAoKnJlc3VsdCwgYyk7CisgIEdPT0dMRV9EQ0hFQ0tfTk9fT1ZFUkxBUCgqcmVzdWx0LCBkKTsKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBvbGRfc2l6ZSA9IHJlc3VsdC0+c2l6ZSgpOworICByZXN1bHQtPnJlc2l6ZShvbGRfc2l6ZSArIGEuc2l6ZSgpICsgYi5zaXplKCkgKyBjLnNpemUoKSArIGQuc2l6ZSgpKTsKKyAgY2hhciAqY29uc3QgYmVnaW4gPSAmKnJlc3VsdC0+YmVnaW4oKTsKKyAgY2hhciAqb3V0ID0gQXBwZW5kNChiZWdpbiArIG9sZF9zaXplLCBhLCBiLCBjLCBkKTsKKyAgR09PR0xFX0RDSEVDS19FUShvdXQsIGJlZ2luICsgcmVzdWx0LT5zaXplKCkpOworfQorCitpbnQgR2xvYmFsUmVwbGFjZVN1YnN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3Vic3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnJlcGxhY2VtZW50LCBzdGQ6OnN0cmluZyAqcykgeworICBHT09HTEVfQ0hFQ0socyAhPSBudWxscHRyKTsKKyAgaWYgKHMtPmVtcHR5KCkgfHwgc3Vic3RyaW5nLmVtcHR5KCkpCisgICAgcmV0dXJuIDA7CisgIHN0ZDo6c3RyaW5nIHRtcDsKKyAgaW50IG51bV9yZXBsYWNlbWVudHMgPSAwOworICBpbnQgcG9zID0gMDsKKyAgZm9yIChTdHJpbmdQaWVjZTo6c2l6ZV90eXBlIG1hdGNoX3BvcyA9CisgICAgICAgICAgIHMtPmZpbmQoc3Vic3RyaW5nLmRhdGEoKSwgcG9zLCBzdWJzdHJpbmcubGVuZ3RoKCkpOworICAgICAgIG1hdGNoX3BvcyAhPSBzdGQ6OnN0cmluZzo6bnBvczsgcG9zID0gbWF0Y2hfcG9zICsgc3Vic3RyaW5nLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfcG9zID0gcy0+ZmluZChzdWJzdHJpbmcuZGF0YSgpLCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0cmluZy5sZW5ndGgoKSkpIHsKKyAgICArK251bV9yZXBsYWNlbWVudHM7CisgICAgLy8gQXBwZW5kIHRoZSBvcmlnaW5hbCBjb250ZW50IGJlZm9yZSB0aGUgbWF0Y2guCisgICAgdG1wLmFwcGVuZCgqcywgcG9zLCBtYXRjaF9wb3MgLSBwb3MpOworICAgIC8vIEFwcGVuZCB0aGUgcmVwbGFjZW1lbnQgZm9yIHRoZSBtYXRjaC4KKyAgICB0bXAuYXBwZW5kKHJlcGxhY2VtZW50LmJlZ2luKCksIHJlcGxhY2VtZW50LmVuZCgpKTsKKyAgfQorICAvLyBBcHBlbmQgdGhlIGNvbnRlbnQgYWZ0ZXIgdGhlIGxhc3QgbWF0Y2guIElmIG5vIHJlcGxhY2VtZW50cyB3ZXJlIG1hZGUsIHRoZQorICAvLyBvcmlnaW5hbCBzdHJpbmcgaXMgbGVmdCB1bnRvdWNoZWQuCisgIGlmIChudW1fcmVwbGFjZW1lbnRzID4gMCkgeworICAgIHRtcC5hcHBlbmQoKnMsIHBvcywgcy0+bGVuZ3RoKCkgLSBwb3MpOworICAgIHMtPnN3YXAodG1wKTsKKyAgfQorICByZXR1cm4gbnVtX3JlcGxhY2VtZW50czsKK30KKworaW50IENhbGN1bGF0ZUJhc2U2NEVzY2FwZWRMZW4oaW50IGlucHV0X2xlbiwgYm9vbCBkb19wYWRkaW5nKSB7CisgIC8vIEJhc2U2NCBlbmNvZGVzIHRocmVlIGJ5dGVzIG9mIGlucHV0IGF0IGEgdGltZS4gSWYgdGhlIGlucHV0IGlzIG5vdAorICAvLyBkaXZpc2libGUgYnkgdGhyZWUsIHdlIHBhZCBhcyBhcHByb3ByaWF0ZS4KKyAgLy8KKyAgLy8gKGZyb20gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzU0OCkKKyAgLy8gU3BlY2lhbCBwcm9jZXNzaW5nIGlzIHBlcmZvcm1lZCBpZiBmZXdlciB0aGFuIDI0IGJpdHMgYXJlIGF2YWlsYWJsZQorICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhIGJlaW5nIGVuY29kZWQuICBBIGZ1bGwgZW5jb2RpbmcgcXVhbnR1bSBpcworICAvLyBhbHdheXMgY29tcGxldGVkIGF0IHRoZSBlbmQgb2YgYSBxdWFudGl0eS4gIFdoZW4gZmV3ZXIgdGhhbiAyNCBpbnB1dAorICAvLyBiaXRzIGFyZSBhdmFpbGFibGUgaW4gYW4gaW5wdXQgZ3JvdXAsIHplcm8gYml0cyBhcmUgYWRkZWQgKG9uIHRoZQorICAvLyByaWdodCkgdG8gZm9ybSBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgNi1iaXQgZ3JvdXBzLiAgUGFkZGluZyBhdCB0aGUKKyAgLy8gZW5kIG9mIHRoZSBkYXRhIGlzIHBlcmZvcm1lZCB1c2luZyB0aGUgJz0nIGNoYXJhY3Rlci4gIFNpbmNlIGFsbCBiYXNlCisgIC8vIDY0IGlucHV0IGlzIGFuIGludGVncmFsIG51bWJlciBvZiBvY3RldHMsIG9ubHkgdGhlIGZvbGxvd2luZyBjYXNlcworICAvLyBjYW4gYXJpc2U6CisKKworICAvLyBCYXNlNjQgZW5jb2RlcyBlYWNoIHRocmVlIGJ5dGVzIG9mIGlucHV0IGludG8gZm91ciBieXRlcyBvZiBvdXRwdXQuCisgIGludCBsZW4gPSAoaW5wdXRfbGVuIC8gMykgKiA0OworCisgIGlmIChpbnB1dF9sZW4gJSAzID09IDApIHsKKyAgICAvLyAoZnJvbSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTQ4KQorICAgIC8vICgxKSB0aGUgZmluYWwgcXVhbnR1bSBvZiBlbmNvZGluZyBpbnB1dCBpcyBhbiBpbnRlZ3JhbCBtdWx0aXBsZSBvZiAyNAorICAgIC8vIGJpdHM7IGhlcmUsIHRoZSBmaW5hbCB1bml0IG9mIGVuY29kZWQgb3V0cHV0IHdpbGwgYmUgYW4gaW50ZWdyYWwKKyAgICAvLyBtdWx0aXBsZSBvZiA0IGNoYXJhY3RlcnMgd2l0aCBubyAiPSIgcGFkZGluZywKKyAgfSBlbHNlIGlmIChpbnB1dF9sZW4gJSAzID09IDEpIHsKKyAgICAvLyAoZnJvbSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTQ4KQorICAgIC8vICgyKSB0aGUgZmluYWwgcXVhbnR1bSBvZiBlbmNvZGluZyBpbnB1dCBpcyBleGFjdGx5IDggYml0czsgaGVyZSwgdGhlCisgICAgLy8gZmluYWwgdW5pdCBvZiBlbmNvZGVkIG91dHB1dCB3aWxsIGJlIHR3byBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5IHR3bworICAgIC8vICI9IiBwYWRkaW5nIGNoYXJhY3RlcnMsIG9yCisgICAgbGVuICs9IDI7CisgICAgaWYgKGRvX3BhZGRpbmcpIHsKKyAgICAgIGxlbiArPSAyOworICAgIH0KKyAgfSBlbHNlIHsgIC8vIChpbnB1dF9sZW4gJSAzID09IDIpCisgICAgLy8gKGZyb20gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzU0OCkKKyAgICAvLyAoMykgdGhlIGZpbmFsIHF1YW50dW0gb2YgZW5jb2RpbmcgaW5wdXQgaXMgZXhhY3RseSAxNiBiaXRzOyBoZXJlLCB0aGUKKyAgICAvLyBmaW5hbCB1bml0IG9mIGVuY29kZWQgb3V0cHV0IHdpbGwgYmUgdGhyZWUgY2hhcmFjdGVycyBmb2xsb3dlZCBieSBvbmUKKyAgICAvLyAiPSIgcGFkZGluZyBjaGFyYWN0ZXIuCisgICAgbGVuICs9IDM7CisgICAgaWYgKGRvX3BhZGRpbmcpIHsKKyAgICAgIGxlbiArPSAxOworICAgIH0KKyAgfQorCisgIGFzc2VydChsZW4gPj0gaW5wdXRfbGVuKTsgIC8vIG1ha2Ugc3VyZSB3ZSBkaWRuJ3Qgb3ZlcmZsb3cKKyAgcmV0dXJuIGxlbjsKK30KKworLy8gQmFzZTY0RXNjYXBlIGRvZXMgcGFkZGluZywgc28gdGhpcyBjYWxjdWxhdGlvbiBpbmNsdWRlcyBwYWRkaW5nLgoraW50IENhbGN1bGF0ZUJhc2U2NEVzY2FwZWRMZW4oaW50IGlucHV0X2xlbikgeworICByZXR1cm4gQ2FsY3VsYXRlQmFzZTY0RXNjYXBlZExlbihpbnB1dF9sZW4sIHRydWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpbnQgQmFzZTY0VW5lc2NhcGUoKSAtIGJhc2U2NCBkZWNvZGVyCisvLyBpbnQgQmFzZTY0RXNjYXBlKCkgLSBiYXNlNjQgZW5jb2RlcgorLy8gaW50IFdlYlNhZmVCYXNlNjRVbmVzY2FwZSgpIC0gR29vZ2xlJ3MgdmFyaWF0aW9uIG9mIGJhc2U2NCBkZWNvZGVyCisvLyBpbnQgV2ViU2FmZUJhc2U2NEVzY2FwZSgpIC0gR29vZ2xlJ3MgdmFyaWF0aW9uIG9mIGJhc2U2NCBlbmNvZGVyCisvLworLy8gQ2hlY2sgb3V0CisvLyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMDQ1IGZvciBmb3JtYWwgZGVzY3JpcHRpb24sIGJ1dCB3aGF0IHdlCisvLyBjYXJlIGFib3V0IGlzIHRoYXQuLi4KKy8vICAgVGFrZSB0aGUgZW5jb2RlZCBzdHVmZiBpbiBncm91cHMgb2YgNCBjaGFyYWN0ZXJzIGFuZCB0dXJuIGVhY2gKKy8vICAgY2hhcmFjdGVyIGludG8gYSBjb2RlIDAgdG8gNjMgdGh1czoKKy8vICAgICAgICAgICBBLVogbWFwIHRvIDAgdG8gMjUKKy8vICAgICAgICAgICBhLXogbWFwIHRvIDI2IHRvIDUxCisvLyAgICAgICAgICAgMC05IG1hcCB0byA1MiB0byA2MQorLy8gICAgICAgICAgICsoLSBmb3IgV2ViU2FmZSkgbWFwcyB0byA2MgorLy8gICAgICAgICAgIC8oXyBmb3IgV2ViU2FmZSkgbWFwcyB0byA2MworLy8gICBUaGVyZSB3aWxsIGJlIGZvdXIgbnVtYmVycywgYWxsIGxlc3MgdGhhbiA2NCB3aGljaCBjYW4gYmUgcmVwcmVzZW50ZWQKKy8vICAgYnkgYSA2IGRpZ2l0IGJpbmFyeSBudW1iZXIgKGFhYWFhYSwgYmJiYmJiLCBjY2NjY2MsIGRkZGRkZCByZXNwZWN0aXZlbHkpLgorLy8gICBBcnJhbmdlIHRoZSA2IGRpZ2l0IGJpbmFyeSBudW1iZXJzIGludG8gdGhyZWUgYnl0ZXMgYXMgc3VjaDoKKy8vICAgYWFhYWFhYmIgYmJiYmNjY2MgY2NkZGRkZGQKKy8vICAgRXF1YWxzIHNpZ25zIChvbmUgb3IgdHdvKSBhcmUgdXNlZCBhdCB0aGUgZW5kIG9mIHRoZSBlbmNvZGVkIGJsb2NrIHRvCisvLyAgIGluZGljYXRlIHRoYXQgdGhlIHRleHQgd2FzIG5vdCBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHRocmVlIGJ5dGVzIGxvbmcuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBCYXNlNjRVbmVzY2FwZUludGVybmFsKGNvbnN0IGNoYXIgKnNyY19wYXJhbSwgaW50IHN6c3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGVzdCwgaW50IHN6ZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyKiB1bmJhc2U2NCkgeworICBzdGF0aWMgY29uc3QgY2hhciBrUGFkNjRFcXVhbHMgPSAnPSc7CisgIHN0YXRpYyBjb25zdCBjaGFyIGtQYWQ2NERvdCA9ICcuJzsKKworICBpbnQgZGVjb2RlID0gMDsKKyAgaW50IGRlc3RpZHggPSAwOworICBpbnQgc3RhdGUgPSAwOworICB1bnNpZ25lZCBpbnQgY2ggPSAwOworICB1bnNpZ25lZCBpbnQgdGVtcCA9IDA7CisKKyAgLy8gSWYgImNoYXIiIGlzIHNpZ25lZCBieSBkZWZhdWx0LCB1c2luZyAqc3JjIGFzIGFuIGFycmF5IGluZGV4IHJlc3VsdHMgaW4KKyAgLy8gYWNjZXNzaW5nIG5lZ2F0aXZlIGFycmF5IGVsZW1lbnRzLiBUcmVhdCB0aGUgaW5wdXQgYXMgYSBwb2ludGVyIHRvCisgIC8vIHVuc2lnbmVkIGNoYXIgdG8gYXZvaWQgdGhpcy4KKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oc3JjX3BhcmFtKTsKKworICAvLyBUaGUgR0VUX0lOUFVUIG1hY3JvIGdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLCBza2lwcGluZworICAvLyBvdmVyIGFueSB3aGl0ZXNwYWNlLCBhbmQgc3RvcHBpbmcgd2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZQorICAvLyBzdHJpbmcgb3Igd2hlbiB3ZSByZWFkIGFueSBub24tZGF0YSBjaGFyYWN0ZXIuICBUaGUgYXJndW1lbnRzIGFyZQorICAvLyBhbiBhcmJpdHJhcnkgaWRlbnRpZmllciAodXNlZCBhcyBhIGxhYmVsIGZvciBnb3RvKSBhbmQgdGhlIG51bWJlcgorICAvLyBvZiBkYXRhIGJ5dGVzIHRoYXQgbXVzdCByZW1haW4gaW4gdGhlIGlucHV0IHRvIGF2b2lkIGFib3J0aW5nIHRoZQorICAvLyBsb29wLgorI2RlZmluZSBHRVRfSU5QVVQobGFiZWwsIHJlbWFpbikgICAgICAgICAgICAgICAgIFwKKyAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLS1zenNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoID0gKnNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZWNvZGUgPSB1bmJhc2U2NFtjaF07ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGRlY29kZSA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKGFzY2lpX2lzc3BhY2UoY2gpICYmIHN6c3JjID49IHJlbWFpbikgIFwKKyAgICAgICAgZ290byBsYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdGF0ZSA9IDQgLSByZW1haW47ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyAgLy8gaWYgZGVzdCBpcyBudWxsLCB3ZSdyZSBqdXN0IGNoZWNraW5nIHRvIHNlZSBpZiBpdCdzIGxlZ2FsIGlucHV0CisgIC8vIHJhdGhlciB0aGFuIHByb2R1Y2luZyBvdXRwdXQuICAoSSBzdXNwZWN0IHRoaXMgY291bGQganVzdCBiZSBkb25lCisgIC8vIHdpdGggYSByZWdleHAuLi4pLiAgV2UgZHVwbGljYXRlIHRoZSBsb29wIHNvIHRoaXMgdGVzdCBjYW4gYmUKKyAgLy8gb3V0c2lkZSBpdCBpbnN0ZWFkIG9mIGluIGV2ZXJ5IGl0ZXJhdGlvbi4KKworICBpZiAoZGVzdCkgeworICAgIC8vIFRoaXMgbG9vcCBjb25zdW1lcyA0IGlucHV0IGJ5dGVzIGFuZCBwcm9kdWNlcyAzIG91dHB1dCBieXRlcworICAgIC8vIHBlciBpdGVyYXRpb24uICBXZSBjYW4ndCBrbm93IGF0IHRoZSBzdGFydCB0aGF0IHRoZXJlIGlzIGVub3VnaAorICAgIC8vIGRhdGEgbGVmdCBpbiB0aGUgc3RyaW5nIGZvciBhIGZ1bGwgaXRlcmF0aW9uLCBzbyB0aGUgbG9vcCBtYXkKKyAgICAvLyBicmVhayBvdXQgaW4gdGhlIG1pZGRsZTsgaWYgc28gJ3N0YXRlJyB3aWxsIGJlIHNldCB0byB0aGUKKyAgICAvLyBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZC4KKworICAgIHdoaWxlIChzenNyYyA+PSA0KSAgeworICAgICAgLy8gV2UnbGwgc3RhcnQgYnkgb3B0aW1pc3RpY2FsbHkgYXNzdW1pbmcgdGhhdCB0aGUgbmV4dCBmb3VyCisgICAgICAvLyBieXRlcyBvZiB0aGUgc3RyaW5nIChzcmNbMC4uM10pIGFyZSBmb3VyIGdvb2QgZGF0YSBieXRlcworICAgICAgLy8gKHRoYXQgaXMsIG5vIG51bGxzLCB3aGl0ZXNwYWNlLCBwYWRkaW5nIGNoYXJzLCBvciBpbGxlZ2FsCisgICAgICAvLyBjaGFycykuICBXZSBuZWVkIHRvIHRlc3Qgc3JjWzAuLjJdIGZvciBudWxscyBpbmRpdmlkdWFsbHkKKyAgICAgIC8vIGJlZm9yZSBjb25zdHJ1Y3RpbmcgdGVtcCB0byBwcmVzZXJ2ZSB0aGUgcHJvcGVydHkgdGhhdCB3ZQorICAgICAgLy8gbmV2ZXIgcmVhZCBwYXN0IGEgbnVsbCBpbiB0aGUgc3RyaW5nIChubyBtYXR0ZXIgaG93IGxvbmcKKyAgICAgIC8vIHN6c3JjIGNsYWltcyB0aGUgc3RyaW5nIGlzKS4KKworICAgICAgaWYgKCFzcmNbMF0gfHwgIXNyY1sxXSB8fCAhc3JjWzJdIHx8CisgICAgICAgICAgKHRlbXAgPSAoKHVuc2lnbmVkKHVuYmFzZTY0W3NyY1swXV0pIDw8IDE4KSB8CisgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKHVuYmFzZTY0W3NyY1sxXV0pIDw8IDEyKSB8CisgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKHVuYmFzZTY0W3NyY1syXV0pIDw8IDYpIHwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQodW5iYXNlNjRbc3JjWzNdXSkpKSkgJiAweDgwMDAwMDAwKSB7CisgICAgICAgIC8vIElmZiBhbnkgb2YgdGhvc2UgZm91ciBjaGFyYWN0ZXJzIHdhcyBiYWQgKG51bGwsIGlsbGVnYWwsCisgICAgICAgIC8vIHdoaXRlc3BhY2UsIHBhZGRpbmcpLCB0aGVuIHRlbXAncyBoaWdoIGJpdCB3aWxsIGJlIHNldAorICAgICAgICAvLyAoYmVjYXVzZSB1bmJhc2U2NFtdIGlzIC0xIGZvciBhbGwgYmFkIGNoYXJhY3RlcnMpLgorICAgICAgICAvLworICAgICAgICAvLyBXZSdsbCBiYWNrIHVwIGFuZCByZXNvcnQgdG8gdGhlIHNsb3dlciBkZWNvZGVyLCB3aGljaCBrbm93cworICAgICAgICAvLyBob3cgdG8gaGFuZGxlIHRob3NlIGNhc2VzLgorCisgICAgICAgIEdFVF9JTlBVVChmaXJzdCwgNCk7CisgICAgICAgIHRlbXAgPSBkZWNvZGU7CisgICAgICAgIEdFVF9JTlBVVChzZWNvbmQsIDMpOworICAgICAgICB0ZW1wID0gKHRlbXAgPDwgNikgfCBkZWNvZGU7CisgICAgICAgIEdFVF9JTlBVVCh0aGlyZCwgMik7CisgICAgICAgIHRlbXAgPSAodGVtcCA8PCA2KSB8IGRlY29kZTsKKyAgICAgICAgR0VUX0lOUFVUKGZvdXJ0aCwgMSk7CisgICAgICAgIHRlbXAgPSAodGVtcCA8PCA2KSB8IGRlY29kZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdlIHJlYWxseSBkaWQgaGF2ZSBmb3VyIGdvb2QgZGF0YSBieXRlcywgc28gYWR2YW5jZSBmb3VyCisgICAgICAgIC8vIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZy4KKworICAgICAgICBzenNyYyAtPSA0OworICAgICAgICBzcmMgKz0gNDsKKyAgICAgICAgZGVjb2RlID0gLTE7CisgICAgICAgIGNoID0gJ1wwJzsKKyAgICAgIH0KKworICAgICAgLy8gdGVtcCBoYXMgMjQgYml0cyBvZiBpbnB1dCwgc28gd3JpdGUgdGhhdCBvdXQgYXMgdGhyZWUgYnl0ZXMuCisKKyAgICAgIGlmIChkZXN0aWR4KzMgPiBzemRlc3QpIHJldHVybiAtMTsKKyAgICAgIGRlc3RbZGVzdGlkeCsyXSA9IHRlbXA7CisgICAgICB0ZW1wID4+PSA4OworICAgICAgZGVzdFtkZXN0aWR4KzFdID0gdGVtcDsKKyAgICAgIHRlbXAgPj49IDg7CisgICAgICBkZXN0W2Rlc3RpZHhdID0gdGVtcDsKKyAgICAgIGRlc3RpZHggKz0gMzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgd2hpbGUgKHN6c3JjID49IDQpICB7CisgICAgICBpZiAoIXNyY1swXSB8fCAhc3JjWzFdIHx8ICFzcmNbMl0gfHwKKyAgICAgICAgICAodGVtcCA9ICgodW5zaWduZWQodW5iYXNlNjRbc3JjWzBdXSkgPDwgMTgpIHwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQodW5iYXNlNjRbc3JjWzFdXSkgPDwgMTIpIHwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQodW5iYXNlNjRbc3JjWzJdXSkgPDwgNikgfAorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCh1bmJhc2U2NFtzcmNbM11dKSkpKSAmIDB4ODAwMDAwMDApIHsKKyAgICAgICAgR0VUX0lOUFVUKGZpcnN0X25vX2Rlc3QsIDQpOworICAgICAgICBHRVRfSU5QVVQoc2Vjb25kX25vX2Rlc3QsIDMpOworICAgICAgICBHRVRfSU5QVVQodGhpcmRfbm9fZGVzdCwgMik7CisgICAgICAgIEdFVF9JTlBVVChmb3VydGhfbm9fZGVzdCwgMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzenNyYyAtPSA0OworICAgICAgICBzcmMgKz0gNDsKKyAgICAgICAgZGVjb2RlID0gLTE7CisgICAgICAgIGNoID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGRlc3RpZHggKz0gMzsKKyAgICB9CisgIH0KKworI3VuZGVmIEdFVF9JTlBVVAorCisgIC8vIGlmIHRoZSBsb29wIHRlcm1pbmF0ZWQgYmVjYXVzZSB3ZSByZWFkIGEgYmFkIGNoYXJhY3RlciwgcmV0dXJuCisgIC8vIG5vdy4KKyAgaWYgKGRlY29kZSA8IDAgJiYgY2ggIT0gJ1wwJyAmJgorICAgICAgY2ggIT0ga1BhZDY0RXF1YWxzICYmIGNoICE9IGtQYWQ2NERvdCAmJiAhYXNjaWlfaXNzcGFjZShjaCkpCisgICAgcmV0dXJuIC0xOworCisgIGlmIChjaCA9PSBrUGFkNjRFcXVhbHMgfHwgY2ggPT0ga1BhZDY0RG90KSB7CisgICAgLy8gaWYgd2Ugc3RvcHBlZCBieSBoaXR0aW5nIGFuICc9JyBvciAnLicsIHVuLXJlYWQgdGhhdCBjaGFyYWN0ZXIgLS0gd2UnbGwKKyAgICAvLyBsb29rIGF0IGl0IGFnYWluIHdoZW4gd2UgY291bnQgdG8gY2hlY2sgZm9yIHRoZSBwcm9wZXIgbnVtYmVyIG9mCisgICAgLy8gZXF1YWxzIHNpZ25zIGF0IHRoZSBlbmQuCisgICAgKytzenNyYzsKKyAgICAtLXNyYzsKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGlzIGxvb3AgY29uc3VtZXMgMSBpbnB1dCBieXRlIHBlciBpdGVyYXRpb24uICBJdCdzIHVzZWQgdG8KKyAgICAvLyBjbGVhbiB1cCB0aGUgMC0zIGlucHV0IGJ5dGVzIHJlbWFpbmluZyB3aGVuIHRoZSBmaXJzdCwgZmFzdGVyCisgICAgLy8gbG9vcCBmaW5pc2hlcy4gICd0ZW1wJyBjb250YWlucyB0aGUgZGF0YSBmcm9tICdzdGF0ZScgaW5wdXQKKyAgICAvLyBjaGFyYWN0ZXJzIHJlYWQgYnkgdGhlIGZpcnN0IGxvb3AuCisgICAgd2hpbGUgKHN6c3JjID4gMCkgIHsKKyAgICAgIC0tc3pzcmM7CisgICAgICBjaCA9ICpzcmMrKzsKKyAgICAgIGRlY29kZSA9IHVuYmFzZTY0W2NoXTsKKyAgICAgIGlmIChkZWNvZGUgPCAwKSB7CisgICAgICAgIGlmIChhc2NpaV9pc3NwYWNlKGNoKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcMCcpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBrUGFkNjRFcXVhbHMgfHwgY2ggPT0ga1BhZDY0RG90KSB7CisgICAgICAgICAgLy8gYmFjayB1cCBvbmUgY2hhcmFjdGVyOyB3ZSdsbCByZWFkIGl0IGFnYWluIHdoZW4gd2UgY2hlY2sKKyAgICAgICAgICAvLyBmb3IgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHBhZCBjaGFyYWN0ZXJzIGF0IHRoZSBlbmQuCisgICAgICAgICAgKytzenNyYzsKKyAgICAgICAgICAtLXNyYzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gRWFjaCBpbnB1dCBjaGFyYWN0ZXIgZ2l2ZXMgdXMgc2l4IGJpdHMgb2Ygb3V0cHV0LgorICAgICAgdGVtcCA9ICh0ZW1wIDw8IDYpIHwgZGVjb2RlOworICAgICAgKytzdGF0ZTsKKyAgICAgIGlmIChzdGF0ZSA9PSA0KSB7CisgICAgICAgIC8vIElmIHdlJ3ZlIGFjY3VtdWxhdGVkIDI0IGJpdHMgb2Ygb3V0cHV0LCB3cml0ZSB0aGF0IG91dCBhcworICAgICAgICAvLyB0aHJlZSBieXRlcy4KKyAgICAgICAgaWYgKGRlc3QpIHsKKyAgICAgICAgICBpZiAoZGVzdGlkeCszID4gc3pkZXN0KSByZXR1cm4gLTE7CisgICAgICAgICAgZGVzdFtkZXN0aWR4KzJdID0gdGVtcDsKKyAgICAgICAgICB0ZW1wID4+PSA4OworICAgICAgICAgIGRlc3RbZGVzdGlkeCsxXSA9IHRlbXA7CisgICAgICAgICAgdGVtcCA+Pj0gODsKKyAgICAgICAgICBkZXN0W2Rlc3RpZHhdID0gdGVtcDsKKyAgICAgICAgfQorICAgICAgICBkZXN0aWR4ICs9IDM7CisgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgdGVtcCA9IDA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gUHJvY2VzcyB0aGUgbGVmdG92ZXIgZGF0YSBjb250YWluZWQgaW4gJ3RlbXAnIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0LgorICBpbnQgZXhwZWN0ZWRfZXF1YWxzID0gMDsKKyAgc3dpdGNoIChzdGF0ZSkgeworICAgIGNhc2UgMDoKKyAgICAgIC8vIE5vdGhpbmcgbGVmdCBvdmVyOyBvdXRwdXQgaXMgYSBtdWx0aXBsZSBvZiAzIGJ5dGVzLgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6CisgICAgICAvLyBCYWQgaW5wdXQ7IHdlIGhhdmUgNiBiaXRzIGxlZnQgb3Zlci4KKyAgICAgIHJldHVybiAtMTsKKworICAgIGNhc2UgMjoKKyAgICAgIC8vIFByb2R1Y2Ugb25lIG1vcmUgb3V0cHV0IGJ5dGUgZnJvbSB0aGUgMTIgaW5wdXQgYml0cyB3ZSBoYXZlIGxlZnQuCisgICAgICBpZiAoZGVzdCkgeworICAgICAgICBpZiAoZGVzdGlkeCsxID4gc3pkZXN0KSByZXR1cm4gLTE7CisgICAgICAgIHRlbXAgPj49IDQ7CisgICAgICAgIGRlc3RbZGVzdGlkeF0gPSB0ZW1wOworICAgICAgfQorICAgICAgKytkZXN0aWR4OworICAgICAgZXhwZWN0ZWRfZXF1YWxzID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAzOgorICAgICAgLy8gUHJvZHVjZSB0d28gbW9yZSBvdXRwdXQgYnl0ZXMgZnJvbSB0aGUgMTggaW5wdXQgYml0cyB3ZSBoYXZlIGxlZnQuCisgICAgICBpZiAoZGVzdCkgeworICAgICAgICBpZiAoZGVzdGlkeCsyID4gc3pkZXN0KSByZXR1cm4gLTE7CisgICAgICAgIHRlbXAgPj49IDI7CisgICAgICAgIGRlc3RbZGVzdGlkeCsxXSA9IHRlbXA7CisgICAgICAgIHRlbXAgPj49IDg7CisgICAgICAgIGRlc3RbZGVzdGlkeF0gPSB0ZW1wOworICAgICAgfQorICAgICAgZGVzdGlkeCArPSAyOworICAgICAgZXhwZWN0ZWRfZXF1YWxzID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8vIHN0YXRlIHNob3VsZCBoYXZlIG5vIG90aGVyIHZhbHVlcyBhdCB0aGlzIHBvaW50LgorICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlRoaXMgY2FuJ3QgaGFwcGVuOyBiYXNlNjQgZGVjb2RlciBzdGF0ZSA9ICIgPDwgc3RhdGU7CisgIH0KKworICAvLyBUaGUgcmVtYWluZGVyIG9mIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGFsbCB3aGl0ZXNwYWNlLCBtaXhlZCB3aXRoCisgIC8vIGV4YWN0bHkgMCBlcXVhbHMgc2lnbnMsIG9yIGV4YWN0bHkgJ2V4cGVjdGVkX2VxdWFscycgZXF1YWxzCisgIC8vIHNpZ25zLiAgKEFsd2F5cyBhY2NlcHRpbmcgMCBlcXVhbHMgc2lnbnMgaXMgYSBnb29nbGUgZXh0ZW5zaW9uCisgIC8vIG5vdCBjb3ZlcmVkIGluIHRoZSBSRkMsIGFzIGlzIGFjY2VwdGluZyBkb3QgYXMgdGhlIHBhZCBjaGFyYWN0ZXIuKQorCisgIGludCBlcXVhbHMgPSAwOworICB3aGlsZSAoc3pzcmMgPiAwICYmICpzcmMpIHsKKyAgICBpZiAoKnNyYyA9PSBrUGFkNjRFcXVhbHMgfHwgKnNyYyA9PSBrUGFkNjREb3QpCisgICAgICArK2VxdWFsczsKKyAgICBlbHNlIGlmICghYXNjaWlfaXNzcGFjZSgqc3JjKSkKKyAgICAgIHJldHVybiAtMTsKKyAgICAtLXN6c3JjOworICAgICsrc3JjOworICB9CisKKyAgcmV0dXJuIChlcXVhbHMgPT0gMCB8fCBlcXVhbHMgPT0gZXhwZWN0ZWRfZXF1YWxzKSA/IGRlc3RpZHggOiAtMTsKK30KKworLy8gVGhlIGFycmF5cyBiZWxvdyB3ZXJlIGdlbmVyYXRlZCBieSB0aGUgZm9sbG93aW5nIGNvZGUKKy8vICNpbmNsdWRlIDxzeXMvdGltZS5oPgorLy8gI2luY2x1ZGUgPHN0ZGxpYi5oPgorLy8gI2luY2x1ZGUgPHN0cmluZy5oPgorLy8gI2luY2x1ZGUgPHN0ZGlvLmg+CisvLyBtYWluKCkKKy8vIHsKKy8vICAgc3RhdGljIGNvbnN0IGNoYXIgQmFzZTY0W10gPQorLy8gICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKy8vICAgY29uc3QgY2hhciAqcG9zOworLy8gICBpbnQgaWR4LCBpLCBqOworLy8gICBwcmludGYoIiAgICAiKTsKKy8vICAgZm9yIChpID0gMDsgaSA8IDI1NTsgaSArPSA4KSB7CisvLyAgICAgZm9yIChqID0gaTsgaiA8IGkgKyA4OyBqKyspIHsKKy8vICAgICAgIHBvcyA9IHN0cmNocihCYXNlNjQsIGopOworLy8gICAgICAgaWYgKChwb3MgPT0gbnVsbHB0cikgfHwgKGogPT0gMCkpCisvLyAgICAgICAgIGlkeCA9IC0xOworLy8gICAgICAgZWxzZQorLy8gICAgICAgICBpZHggPSBwb3MgLSBCYXNlNjQ7CisvLyAgICAgICBpZiAoaWR4ID09IC0xKQorLy8gICAgICAgICBwcmludGYoIiAlMmQsICAgICAiLCBpZHgpOworLy8gICAgICAgZWxzZQorLy8gICAgICAgICBwcmludGYoIiAlMmQvIiIqJWMqIiIvLCIsIGlkeCwgaik7CisvLyAgICAgfQorLy8gICAgIHByaW50ZigiXG4gICAgIik7CisvLyAgIH0KKy8vIH0KKy8vCisvLyB3aGVyZSB0aGUgdmFsdWUgb2YgIkJhc2U2NFtdIiB3YXMgcmVwbGFjZWQgYnkgb25lIG9mIHRoZSBiYXNlLTY0IGNvbnZlcnNpb24KKy8vIHRhYmxlcyBmcm9tIHRoZSBmdW5jdGlvbnMgYmVsb3cuCitzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIga1VuQmFzZTY0W10gPSB7CisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgNjIvKisqLywgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgNjMvKi8gKi8sCisgIDUyLyowKi8sIDUzLyoxKi8sIDU0LyoyKi8sIDU1LyozKi8sIDU2Lyo0Ki8sIDU3Lyo1Ki8sIDU4Lyo2Ki8sIDU5Lyo3Ki8sCisgIDYwLyo4Ki8sIDYxLyo5Ki8sIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAgMC8qQSovLCAgMS8qQiovLCAgMi8qQyovLCAgMy8qRCovLCAgNC8qRSovLCAgNS8qRiovLCAgNi8qRyovLAorICAgNy8qSCovLCAgOC8qSSovLCAgOS8qSiovLCAxMC8qSyovLCAxMS8qTCovLCAxMi8qTSovLCAxMy8qTiovLCAxNC8qTyovLAorICAxNS8qUCovLCAxNi8qUSovLCAxNy8qUiovLCAxOC8qUyovLCAxOS8qVCovLCAyMC8qVSovLCAyMS8qViovLCAyMi8qVyovLAorICAyMy8qWCovLCAyNC8qWSovLCAyNS8qWiovLCAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgMjYvKmEqLywgMjcvKmIqLywgMjgvKmMqLywgMjkvKmQqLywgMzAvKmUqLywgMzEvKmYqLywgMzIvKmcqLywKKyAgMzMvKmgqLywgMzQvKmkqLywgMzUvKmoqLywgMzYvKmsqLywgMzcvKmwqLywgMzgvKm0qLywgMzkvKm4qLywgNDAvKm8qLywKKyAgNDEvKnAqLywgNDIvKnEqLywgNDMvKnIqLywgNDQvKnMqLywgNDUvKnQqLywgNDYvKnUqLywgNDcvKnYqLywgNDgvKncqLywKKyAgNDkvKngqLywgNTAvKnkqLywgNTEvKnoqLywgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xCit9Oworc3RhdGljIGNvbnN0IHNpZ25lZCBjaGFyIGtVbldlYlNhZmVCYXNlNjRbXSA9IHsKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICA2Mi8qLSovLCAtMSwgICAgICAtMSwKKyAgNTIvKjAqLywgNTMvKjEqLywgNTQvKjIqLywgNTUvKjMqLywgNTYvKjQqLywgNTcvKjUqLywgNTgvKjYqLywgNTkvKjcqLywKKyAgNjAvKjgqLywgNjEvKjkqLywgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgICAwLypBKi8sICAxLypCKi8sICAyLypDKi8sICAzLypEKi8sICA0LypFKi8sICA1LypGKi8sICA2LypHKi8sCisgICA3LypIKi8sICA4LypJKi8sICA5LypKKi8sIDEwLypLKi8sIDExLypMKi8sIDEyLypNKi8sIDEzLypOKi8sIDE0LypPKi8sCisgIDE1LypQKi8sIDE2LypRKi8sIDE3LypSKi8sIDE4LypTKi8sIDE5LypUKi8sIDIwLypVKi8sIDIxLypWKi8sIDIyLypXKi8sCisgIDIzLypYKi8sIDI0LypZKi8sIDI1LypaKi8sIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDYzLypfKi8sCisgIC0xLCAgICAgIDI2LyphKi8sIDI3LypiKi8sIDI4LypjKi8sIDI5LypkKi8sIDMwLyplKi8sIDMxLypmKi8sIDMyLypnKi8sCisgIDMzLypoKi8sIDM0LyppKi8sIDM1LypqKi8sIDM2LyprKi8sIDM3LypsKi8sIDM4LyptKi8sIDM5LypuKi8sIDQwLypvKi8sCisgIDQxLypwKi8sIDQyLypxKi8sIDQzLypyKi8sIDQ0LypzKi8sIDQ1Lyp0Ki8sIDQ2Lyp1Ki8sIDQ3Lyp2Ki8sIDQ4Lyp3Ki8sCisgIDQ5Lyp4Ki8sIDUwLyp5Ki8sIDUxLyp6Ki8sIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMQorfTsKKworaW50IFdlYlNhZmVCYXNlNjRVbmVzY2FwZShjb25zdCBjaGFyICpzcmMsIGludCBzenNyYywgY2hhciAqZGVzdCwgaW50IHN6ZGVzdCkgeworICByZXR1cm4gQmFzZTY0VW5lc2NhcGVJbnRlcm5hbChzcmMsIHN6c3JjLCBkZXN0LCBzemRlc3QsIGtVbldlYlNhZmVCYXNlNjQpOworfQorCitzdGF0aWMgYm9vbCBCYXNlNjRVbmVzY2FwZUludGVybmFsKGNvbnN0IGNoYXIgKnNyYywgaW50IHNsZW4sIHN0ZDo6c3RyaW5nICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWQgY2hhciAqdW5iYXNlNjQpIHsKKyAgLy8gRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgc3RyaW5nLiAgQmFzZTY0IGVuY29kZXMgZXZlcnkgMyBieXRlcyBpbnRvCisgIC8vIDQgY2hhcmFjdGVycy4gIGFueSBsZWZ0b3ZlciBjaGFycyBhcmUgYWRkZWQgZGlyZWN0bHkgZm9yIGdvb2QgbWVhc3VyZS4KKyAgLy8gVGhpcyBpcyBkb2N1bWVudGVkIGluIHRoZSBiYXNlNjQgUkZDOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTQ4CisgIGNvbnN0IGludCBkZXN0X2xlbiA9IDMgKiAoc2xlbiAvIDQpICsgKHNsZW4gJSA0KTsKKworICBkZXN0LT5yZXNpemUoZGVzdF9sZW4pOworCisgIC8vIFdlIGFyZSBnZXR0aW5nIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgYnkgZ2V0dGluZyB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAvLyBzdHJpbmcgYW5kIGNvbnZlcnRpbmcgaXQgaW50byBhIGNoYXIgKi4KKyAgY29uc3QgaW50IGxlbiA9IEJhc2U2NFVuZXNjYXBlSW50ZXJuYWwoc3JjLCBzbGVuLCBzdHJpbmdfYXNfYXJyYXkoZGVzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfbGVuLCB1bmJhc2U2NCk7CisgIGlmIChsZW4gPCAwKSB7CisgICAgZGVzdC0+Y2xlYXIoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBjb3VsZCBiZSBzaG9ydGVyIGlmIHRoZXJlIHdhcyBwYWRkaW5nCisgIEdPT0dMRV9EQ0hFQ0tfTEUobGVuLCBkZXN0X2xlbik7CisgIGRlc3QtPmVyYXNlKGxlbik7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQmFzZTY0VW5lc2NhcGUoU3RyaW5nUGllY2Ugc3JjLCBzdGQ6OnN0cmluZyAqZGVzdCkgeworICByZXR1cm4gQmFzZTY0VW5lc2NhcGVJbnRlcm5hbChzcmMuZGF0YSgpLCBzcmMuc2l6ZSgpLCBkZXN0LCBrVW5CYXNlNjQpOworfQorCitib29sIFdlYlNhZmVCYXNlNjRVbmVzY2FwZShTdHJpbmdQaWVjZSBzcmMsIHN0ZDo6c3RyaW5nICpkZXN0KSB7CisgIHJldHVybiBCYXNlNjRVbmVzY2FwZUludGVybmFsKHNyYy5kYXRhKCksIHNyYy5zaXplKCksIGRlc3QsIGtVbldlYlNhZmVCYXNlNjQpOworfQorCitpbnQgQmFzZTY0RXNjYXBlSW50ZXJuYWwoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3pzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGVzdCwgaW50IHN6ZGVzdCwgY29uc3QgY2hhciAqYmFzZTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9fcGFkZGluZykgeworICBzdGF0aWMgY29uc3QgY2hhciBrUGFkNjQgPSAnPSc7CisKKyAgaWYgKHN6c3JjIDw9IDApIHJldHVybiAwOworCisgIGlmIChzenNyYyAqIDQgPiBzemRlc3QgKiAzKSByZXR1cm4gMDsKKworICBjaGFyICpjdXJfZGVzdCA9IGRlc3Q7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN1cl9zcmMgPSBzcmM7CisKKyAgY2hhciAqbGltaXRfZGVzdCA9IGRlc3QgKyBzemRlc3Q7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxpbWl0X3NyYyA9IHNyYyArIHN6c3JjOworCisgIC8vIFRocmVlIGJ5dGVzIG9mIGRhdGEgZW5jb2RlcyB0byBmb3VyIGNoYXJhY3RlcnMgb2YgY2lwaGVydGV4dC4KKyAgLy8gU28gd2UgY2FuIHB1bXAgdGhyb3VnaCB0aHJlZS1ieXRlIGNodW5rcyBhdG9taWNhbGx5LgorICB3aGlsZSAoY3VyX3NyYyA8IGxpbWl0X3NyYyAtIDMpIHsgIC8vIGtlZXAgZ29pbmcgYXMgbG9uZyBhcyB3ZSBoYXZlID49IDMyIGJpdHMKKyAgICB1aW50MzJfdCBpbiA9IEJpZ0VuZGlhbjo6TG9hZDMyKGN1cl9zcmMpID4+IDg7CisKKyAgICBjdXJfZGVzdFswXSA9IGJhc2U2NFtpbiA+PiAxOF07CisgICAgaW4gJj0gMHgzRkZGRjsKKyAgICBjdXJfZGVzdFsxXSA9IGJhc2U2NFtpbiA+PiAxMl07CisgICAgaW4gJj0gMHhGRkY7CisgICAgY3VyX2Rlc3RbMl0gPSBiYXNlNjRbaW4gPj4gNl07CisgICAgaW4gJj0gMHgzRjsKKyAgICBjdXJfZGVzdFszXSA9IGJhc2U2NFtpbl07CisKKyAgICBjdXJfZGVzdCArPSA0OworICAgIGN1cl9zcmMgKz0gMzsKKyAgfQorICAvLyBUbyBzYXZlIHRpbWUsIHdlIGRpZG4ndCB1cGRhdGUgc3pkZXN0IG9yIHN6c3JjIGluIHRoZSBsb29wLiAgU28gZG8gaXQgbm93LgorICBzemRlc3QgPSBsaW1pdF9kZXN0IC0gY3VyX2Rlc3Q7CisgIHN6c3JjID0gbGltaXRfc3JjIC0gY3VyX3NyYzsKKworICAvKiBub3cgZGVhbCB3aXRoIHRoZSB0YWlsICg8PTMgYnl0ZXMpICovCisgIHN3aXRjaCAoc3pzcmMpIHsKKyAgICBjYXNlIDA6CisgICAgICAvLyBOb3RoaW5nIGxlZnQ7IG5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTogeworICAgICAgLy8gT25lIGJ5dGUgbGVmdDogdGhpcyBlbmNvZGVzIHRvIHR3byBjaGFyYWN0ZXJzLCBhbmQgKG9wdGlvbmFsbHkpCisgICAgICAvLyB0d28gcGFkIGNoYXJhY3RlcnMgdG8gcm91bmQgb3V0IHRoZSBmb3VyLWNoYXJhY3RlciBjaXBoZXJibG9jay4KKyAgICAgIGlmICgoc3pkZXN0IC09IDIpIDwgMCkgcmV0dXJuIDA7CisgICAgICB1aW50MzJfdCBpbiA9IGN1cl9zcmNbMF07CisgICAgICBjdXJfZGVzdFswXSA9IGJhc2U2NFtpbiA+PiAyXTsKKyAgICAgIGluICY9IDB4MzsKKyAgICAgIGN1cl9kZXN0WzFdID0gYmFzZTY0W2luIDw8IDRdOworICAgICAgY3VyX2Rlc3QgKz0gMjsKKyAgICAgIGlmIChkb19wYWRkaW5nKSB7CisgICAgICAgIGlmICgoc3pkZXN0IC09IDIpIDwgMCkgcmV0dXJuIDA7CisgICAgICAgIGN1cl9kZXN0WzBdID0ga1BhZDY0OworICAgICAgICBjdXJfZGVzdFsxXSA9IGtQYWQ2NDsKKyAgICAgICAgY3VyX2Rlc3QgKz0gMjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDI6IHsKKyAgICAgIC8vIFR3byBieXRlcyBsZWZ0OiB0aGlzIGVuY29kZXMgdG8gdGhyZWUgY2hhcmFjdGVycywgYW5kIChvcHRpb25hbGx5KQorICAgICAgLy8gb25lIHBhZCBjaGFyYWN0ZXIgdG8gcm91bmQgb3V0IHRoZSBmb3VyLWNoYXJhY3RlciBjaXBoZXJibG9jay4KKyAgICAgIGlmICgoc3pkZXN0IC09IDMpIDwgMCkgcmV0dXJuIDA7CisgICAgICB1aW50MzJfdCBpbiA9IEJpZ0VuZGlhbjo6TG9hZDE2KGN1cl9zcmMpOworICAgICAgY3VyX2Rlc3RbMF0gPSBiYXNlNjRbaW4gPj4gMTBdOworICAgICAgaW4gJj0gMHgzRkY7CisgICAgICBjdXJfZGVzdFsxXSA9IGJhc2U2NFtpbiA+PiA0XTsKKyAgICAgIGluICY9IDB4MDBGOworICAgICAgY3VyX2Rlc3RbMl0gPSBiYXNlNjRbaW4gPDwgMl07CisgICAgICBjdXJfZGVzdCArPSAzOworICAgICAgaWYgKGRvX3BhZGRpbmcpIHsKKyAgICAgICAgaWYgKChzemRlc3QgLT0gMSkgPCAwKSByZXR1cm4gMDsKKyAgICAgICAgY3VyX2Rlc3RbMF0gPSBrUGFkNjQ7CisgICAgICAgIGN1cl9kZXN0ICs9IDE7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAzOiB7CisgICAgICAvLyBUaHJlZSBieXRlcyBsZWZ0OiBzYW1lIGFzIGluIHRoZSBiaWcgbG9vcCBhYm92ZS4gIFdlIGNhbid0IGRvIHRoaXMgaW4KKyAgICAgIC8vIHRoZSBsb29wIGJlY2F1c2UgdGhlIGxvb3AgYWJvdmUgYWx3YXlzIHJlYWRzIDQgYnl0ZXMsIGFuZCB0aGUgZm91cnRoCisgICAgICAvLyBieXRlIGlzIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW5wdXQuCisgICAgICBpZiAoKHN6ZGVzdCAtPSA0KSA8IDApIHJldHVybiAwOworICAgICAgdWludDMyX3QgaW4gPSAoY3VyX3NyY1swXSA8PCAxNikgKyBCaWdFbmRpYW46OkxvYWQxNihjdXJfc3JjICsgMSk7CisgICAgICBjdXJfZGVzdFswXSA9IGJhc2U2NFtpbiA+PiAxOF07CisgICAgICBpbiAmPSAweDNGRkZGOworICAgICAgY3VyX2Rlc3RbMV0gPSBiYXNlNjRbaW4gPj4gMTJdOworICAgICAgaW4gJj0gMHhGRkY7CisgICAgICBjdXJfZGVzdFsyXSA9IGJhc2U2NFtpbiA+PiA2XTsKKyAgICAgIGluICY9IDB4M0Y7CisgICAgICBjdXJfZGVzdFszXSA9IGJhc2U2NFtpbl07CisgICAgICBjdXJfZGVzdCArPSA0OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAvLyBTaG91bGQgbm90IGJlIHJlYWNoZWQ6IGJsb2NrcyBvZiA0IGJ5dGVzIGFyZSBoYW5kbGVkCisgICAgICAvLyBpbiB0aGUgd2hpbGUgbG9vcCBiZWZvcmUgdGhpcyBzd2l0Y2ggc3RhdGVtZW50LgorICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkxvZ2ljIHByb2JsZW0/IHN6c3JjID0gIiA8PCBzenNyYzsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAoY3VyX2Rlc3QgLSBkZXN0KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIga0Jhc2U2NENoYXJzW10gPQorIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworCitzdGF0aWMgY29uc3QgY2hhciBrV2ViU2FmZUJhc2U2NENoYXJzW10gPQorIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV8iOworCitpbnQgQmFzZTY0RXNjYXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHN6c3JjLCBjaGFyICpkZXN0LCBpbnQgc3pkZXN0KSB7CisgIHJldHVybiBCYXNlNjRFc2NhcGVJbnRlcm5hbChzcmMsIHN6c3JjLCBkZXN0LCBzemRlc3QsIGtCYXNlNjRDaGFycywgdHJ1ZSk7Cit9CitpbnQgV2ViU2FmZUJhc2U2NEVzY2FwZShjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzenNyYywgY2hhciAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzemRlc3QsIGJvb2wgZG9fcGFkZGluZykgeworICByZXR1cm4gQmFzZTY0RXNjYXBlSW50ZXJuYWwoc3JjLCBzenNyYywgZGVzdCwgc3pkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1dlYlNhZmVCYXNlNjRDaGFycywgZG9fcGFkZGluZyk7Cit9CisKK3ZvaWQgQmFzZTY0RXNjYXBlSW50ZXJuYWwoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3pzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpkZXN0LCBib29sIGRvX3BhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJhc2U2NF9jaGFycykgeworICBjb25zdCBpbnQgY2FsY19lc2NhcGVkX3NpemUgPQorICAgIENhbGN1bGF0ZUJhc2U2NEVzY2FwZWRMZW4oc3pzcmMsIGRvX3BhZGRpbmcpOworICBkZXN0LT5yZXNpemUoY2FsY19lc2NhcGVkX3NpemUpOworICBjb25zdCBpbnQgZXNjYXBlZF9sZW4gPSBCYXNlNjRFc2NhcGVJbnRlcm5hbChzcmMsIHN6c3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfYXNfYXJyYXkoZGVzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QtPnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0X2NoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19wYWRkaW5nKTsKKyAgR09PR0xFX0RDSEVDS19FUShjYWxjX2VzY2FwZWRfc2l6ZSwgZXNjYXBlZF9sZW4pOworICBkZXN0LT5lcmFzZShlc2NhcGVkX2xlbik7Cit9CisKK3ZvaWQgQmFzZTY0RXNjYXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHN6c3JjLCBzdGQ6OnN0cmluZyAqZGVzdCwKKyAgICAgICAgICAgICAgICAgIGJvb2wgZG9fcGFkZGluZykgeworICBCYXNlNjRFc2NhcGVJbnRlcm5hbChzcmMsIHN6c3JjLCBkZXN0LCBkb19wYWRkaW5nLCBrQmFzZTY0Q2hhcnMpOworfQorCit2b2lkIFdlYlNhZmVCYXNlNjRFc2NhcGUoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3pzcmMsIHN0ZDo6c3RyaW5nICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9fcGFkZGluZykgeworICBCYXNlNjRFc2NhcGVJbnRlcm5hbChzcmMsIHN6c3JjLCBkZXN0LCBkb19wYWRkaW5nLCBrV2ViU2FmZUJhc2U2NENoYXJzKTsKK30KKwordm9pZCBCYXNlNjRFc2NhcGUoU3RyaW5nUGllY2Ugc3JjLCBzdGQ6OnN0cmluZyAqZGVzdCkgeworICBCYXNlNjRFc2NhcGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oc3JjLmRhdGEoKSksCisgICAgICAgICAgICAgICBzcmMuc2l6ZSgpLCBkZXN0LCB0cnVlKTsKK30KKwordm9pZCBXZWJTYWZlQmFzZTY0RXNjYXBlKFN0cmluZ1BpZWNlIHNyYywgc3RkOjpzdHJpbmcgKmRlc3QpIHsKKyAgV2ViU2FmZUJhc2U2NEVzY2FwZShyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihzcmMuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBzcmMuc2l6ZSgpLCBkZXN0LCBmYWxzZSk7Cit9CisKK3ZvaWQgV2ViU2FmZUJhc2U2NEVzY2FwZVdpdGhQYWRkaW5nKFN0cmluZ1BpZWNlIHNyYywgc3RkOjpzdHJpbmcgKmRlc3QpIHsKKyAgV2ViU2FmZUJhc2U2NEVzY2FwZShyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihzcmMuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBzcmMuc2l6ZSgpLCBkZXN0LCB0cnVlKTsKK30KKworLy8gSGVscGVyIHRvIGFwcGVuZCBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIHN0cmluZyBhcyBVVEY4LCB3aXRob3V0IGJyaW5naW5nCisvLyBpbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLgoraW50IEVuY29kZUFzVVRGOENoYXIodWludDMyX3QgY29kZV9wb2ludCwgY2hhciogb3V0cHV0KSB7CisgIHVpbnQzMl90IHRtcCA9IDA7CisgIGludCBsZW4gPSAwOworICBpZiAoY29kZV9wb2ludCA8PSAweDdmKSB7CisgICAgdG1wID0gY29kZV9wb2ludDsKKyAgICBsZW4gPSAxOworICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0gMHgwN2ZmKSB7CisgICAgdG1wID0gMHgwMDAwYzA4MCB8CisgICAgICAgICgoY29kZV9wb2ludCAmIDB4MDdjMCkgPDwgMikgfAorICAgICAgICAoY29kZV9wb2ludCAmIDB4MDAzZik7CisgICAgbGVuID0gMjsKKyAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IDB4ZmZmZikgeworICAgIHRtcCA9IDB4MDBlMDgwODAgfAorICAgICAgICAoKGNvZGVfcG9pbnQgJiAweGYwMDApIDw8IDQpIHwKKyAgICAgICAgKChjb2RlX3BvaW50ICYgMHgwZmMwKSA8PCAyKSB8CisgICAgICAgIChjb2RlX3BvaW50ICYgMHgwMDNmKTsKKyAgICBsZW4gPSAzOworICB9IGVsc2UgeworICAgIC8vIFVURi0xNiBpcyBvbmx5IGRlZmluZWQgZm9yIGNvZGUgcG9pbnRzIHVwIHRvIDB4MTBGRkZGLCBhbmQgVVRGLTggaXMKKyAgICAvLyBub3JtYWxseSBvbmx5IGRlZmluZWQgdXAgdG8gdGhlcmUgYXMgd2VsbC4KKyAgICB0bXAgPSAweGYwODA4MDgwIHwKKyAgICAgICAgKChjb2RlX3BvaW50ICYgMHgxYzAwMDApIDw8IDYpIHwKKyAgICAgICAgKChjb2RlX3BvaW50ICYgMHgwM2YwMDApIDw8IDQpIHwKKyAgICAgICAgKChjb2RlX3BvaW50ICYgMHgwMDBmYzApIDw8IDIpIHwKKyAgICAgICAgKGNvZGVfcG9pbnQgJiAweDAwM2YpOworICAgIGxlbiA9IDQ7CisgIH0KKyAgdG1wID0gZ2h0b25sKHRtcCk7CisgIG1lbWNweShvdXRwdXQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZ0bXApICsgc2l6ZW9mKHRtcCkgLSBsZW4sIGxlbik7CisgIHJldHVybiBsZW47Cit9CisKKy8vIFRhYmxlIG9mIFVURi04IGNoYXJhY3RlciBsZW5ndGhzLCBiYXNlZCBvbiBmaXJzdCBieXRlCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrVVRGOExlblRibFsyNTZdID0geworICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsCisgICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OworCisvLyBSZXR1cm4gbGVuZ3RoIG9mIGEgc2luZ2xlIFVURi04IHNvdXJjZSBjaGFyYWN0ZXIKK2ludCBVVEY4Rmlyc3RMZXR0ZXJOdW1CeXRlcyhjb25zdCBjaGFyKiBzcmMsIGludCBsZW4pIHsKKyAgaWYgKGxlbiA9PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGtVVEY4TGVuVGJsWypyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzcmMpXTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xlYW5TdHJpbmdMaW5lRW5kaW5ncygpCisvLyAgIENsZWFuIHVwIGEgbXVsdGktbGluZSBzdHJpbmcgdG8gY29uZm9ybSB0byBVbml4IGxpbmUgZW5kaW5ncy4KKy8vICAgUmVhZHMgZnJvbSBzcmMgYW5kIGFwcGVuZHMgdG8gZHN0LCBzbyB1c3VhbGx5IGRzdCBzaG91bGQgYmUgZW1wdHkuCisvLworLy8gICBJZiB0aGVyZSBpcyBubyBsaW5lIGVuZGluZyBhdCB0aGUgZW5kIG9mIGEgbm9uLWVtcHR5IHN0cmluZywgaXQgY2FuCisvLyAgIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuCisvLworLy8gICBGb3VyIGRpZmZlcmVudCB0eXBlcyBvZiBpbnB1dCBhcmUgY29ycmVjdGx5IGhhbmRsZWQ6CisvLworLy8gICAgIC0gVW5peC9MaW51eCBmaWxlczogbGluZSBlbmRpbmcgaXMgTEY6IHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQKKy8vCisvLyAgICAgLSBET1MvV2luZG93cyBmaWxlczogbGluZSBlbmRpbmcgaXMgQ1JMRjogY29udmVydCB0byBMRgorLy8KKy8vICAgICAtIExlZ2FjeSBNYWMgZmlsZXM6IGxpbmUgZW5kaW5nIGlzIENSOiBjb252ZXJ0IHRvIExGCisvLworLy8gICAgIC0gR2FyYmxlZCBmaWxlczogcmFuZG9tIGxpbmUgZW5kaW5nczogY29udmVydCBncmFjZWZ1bGx5CisvLyAgICAgICAgICAgICAgICAgICAgICBsb25lbHkgQ1IsIGxvbmVseSBMRiwgQ1JMRjogY29udmVydCB0byBMRgorLy8KKy8vICAgQHBhcmFtIHNyYyBUaGUgbXVsdGktbGluZSBzdHJpbmcgdG8gY29udmVydAorLy8gICBAcGFyYW0gZHN0IFRoZSBjb252ZXJ0ZWQgc3RyaW5nIGlzIGFwcGVuZGVkIHRvIHRoaXMgc3RyaW5nCisvLyAgIEBwYXJhbSBhdXRvX2VuZF9sYXN0X2xpbmUgQXV0b21hdGljYWxseSB0ZXJtaW5hdGUgdGhlIGxhc3QgbGluZQorLy8KKy8vICAgTGltaXRhdGlvbnM6CisvLworLy8gICAgIFRoaXMgZG9lcyBub3QgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBDUkNSTEYgZmlsZXMgY3JlYXRlZCBieQorLy8gICAgIGJyb2tlbiBwcm9ncmFtcyB0aGF0IGRvIGFub3RoZXIgVW5peC0+RE9TIGNvbnZlcnNpb24gb24gZmlsZXMKKy8vICAgICB0aGF0IGFyZSBhbHJlYWR5IGluIENSTEYgZm9ybWF0LiAgRm9yIHRoaXMsIGEgdHdvLXBhc3MgYXBwcm9hY2gKKy8vICAgICBicnV0ZS1mb3JjZSB3b3VsZCBiZSBuZWVkZWQgdGhhdAorLy8KKy8vICAgICAgICgxKSBkZXRlcm1pbmVzIHRoZSBwcmVzZW5jZSBvZiBMRiAoZmlyc3Qgb25lIGlzIG9rKQorLy8gICAgICAgKDIpIGlmIHllcywgcmVtb3ZlcyBhbnkgQ1IsIGVsc2UgY29udmVydCBldmVyeSBDUiB0byBMRgorCit2b2lkIENsZWFuU3RyaW5nTGluZUVuZGluZ3MoY29uc3Qgc3RkOjpzdHJpbmcgJnNyYywgc3RkOjpzdHJpbmcgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1dG9fZW5kX2xhc3RfbGluZSkgeworICBpZiAoZHN0LT5lbXB0eSgpKSB7CisgICAgZHN0LT5hcHBlbmQoc3JjKTsKKyAgICBDbGVhblN0cmluZ0xpbmVFbmRpbmdzKGRzdCwgYXV0b19lbmRfbGFzdF9saW5lKTsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnN0cmluZyB0bXAgPSBzcmM7CisgICAgQ2xlYW5TdHJpbmdMaW5lRW5kaW5ncygmdG1wLCBhdXRvX2VuZF9sYXN0X2xpbmUpOworICAgIGRzdC0+YXBwZW5kKHRtcCk7CisgIH0KK30KKwordm9pZCBDbGVhblN0cmluZ0xpbmVFbmRpbmdzKHN0ZDo6c3RyaW5nICpzdHIsIGJvb2wgYXV0b19lbmRfbGFzdF9saW5lKSB7CisgIHB0cmRpZmZfdCBvdXRwdXRfcG9zID0gMDsKKyAgYm9vbCByX3NlZW4gPSBmYWxzZTsKKyAgcHRyZGlmZl90IGxlbiA9IHN0ci0+c2l6ZSgpOworCisgIGNoYXIgKnAgPSAmKCpzdHIpWzBdOworCisgIGZvciAocHRyZGlmZl90IGlucHV0X3BvcyA9IDA7IGlucHV0X3BvcyA8IGxlbjspIHsKKyAgICBpZiAoIXJfc2VlbiAmJiBpbnB1dF9wb3MgKyA4IDwgbGVuKSB7CisgICAgICB1aW50NjRfdCB2ID0gR09PR0xFX1VOQUxJR05FRF9MT0FENjQocCArIGlucHV0X3Bvcyk7CisgICAgICAvLyBMb29wIG92ZXIgZ3JvdXBzIG9mIDggYnl0ZXMgYXQgYSB0aW1lIHVudGlsIHdlIGNvbWUgYWNyb3NzCisgICAgICAvLyBhIHdvcmQgdGhhdCBoYXMgYSBieXRlIHdob3NlIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0bworICAgICAgLy8gJ1xyJyAoaS5lLiBjb3VsZCBjb250YWluIGEgXG4gKDB4MGEpIG9yIGEgXHIgKDB4MGQpICkuCisgICAgICAvLworICAgICAgLy8gV2UgdXNlIGEgaGFzX2xlc3MgbWFjcm8gdGhhdCBxdWlja2x5IHRlc3RzIGEgd2hvbGUgNjQtYml0CisgICAgICAvLyB3b3JkIHRvIHNlZSBpZiBhbnkgb2YgdGhlIGJ5dGVzIGhhcyBhIHZhbHVlIDwgTi4KKyAgICAgIC8vCisgICAgICAvLyBGb3IgbW9yZSBkZXRhaWxzLCBzZWU6CisgICAgICAvLyAgIGh0dHA6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvfnNlYW5kZXIvYml0aGFja3MuaHRtbCNIYXNMZXNzSW5Xb3JkCisjZGVmaW5lIGhhc19sZXNzKHgsIG4pICgoKHgpIC0gfjBVTEwgLyAyNTUgKiAobikpICYgfih4KSAmIH4wVUxMIC8gMjU1ICogMTI4KQorICAgICAgaWYgKCFoYXNfbGVzcyh2LCAnXHInICsgMSkpIHsKKyN1bmRlZiBoYXNfbGVzcworICAgICAgICAvLyBObyBieXRlIGluIHRoaXMgd29yZCBoYXMgYSB2YWx1ZSB0aGF0IGNvdWxkIGJlIGEgXHIgb3IgYSBcbgorICAgICAgICBpZiAob3V0cHV0X3BvcyAhPSBpbnB1dF9wb3MpIHsKKyAgICAgICAgICBHT09HTEVfVU5BTElHTkVEX1NUT1JFNjQocCArIG91dHB1dF9wb3MsIHYpOworICAgICAgICB9CisgICAgICAgIGlucHV0X3BvcyArPSA4OworICAgICAgICBvdXRwdXRfcG9zICs9IDg7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICBzdGQ6OnN0cmluZzo6Y29uc3RfcmVmZXJlbmNlIGluID0gcFtpbnB1dF9wb3NdOworICAgIGlmIChpbiA9PSAnXHInKSB7CisgICAgICBpZiAocl9zZWVuKSBwW291dHB1dF9wb3MrK10gPSAnXG4nOworICAgICAgcl9zZWVuID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGluID09ICdcbicpIHsKKyAgICAgIGlmIChpbnB1dF9wb3MgIT0gb3V0cHV0X3BvcykKKyAgICAgICAgcFtvdXRwdXRfcG9zKytdID0gJ1xuJzsKKyAgICAgIGVsc2UKKyAgICAgICAgb3V0cHV0X3BvcysrOworICAgICAgcl9zZWVuID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChyX3NlZW4pIHBbb3V0cHV0X3BvcysrXSA9ICdcbic7CisgICAgICByX3NlZW4gPSBmYWxzZTsKKyAgICAgIGlmIChpbnB1dF9wb3MgIT0gb3V0cHV0X3BvcykKKyAgICAgICAgcFtvdXRwdXRfcG9zKytdID0gaW47CisgICAgICBlbHNlCisgICAgICAgIG91dHB1dF9wb3MrKzsKKyAgICB9CisgICAgaW5wdXRfcG9zKys7CisgIH0KKyAgaWYgKHJfc2VlbiB8fAorICAgICAgKGF1dG9fZW5kX2xhc3RfbGluZSAmJiBvdXRwdXRfcG9zID4gMCAmJiBwW291dHB1dF9wb3MgLSAxXSAhPSAnXG4nKSkgeworICAgIHN0ci0+cmVzaXplKG91dHB1dF9wb3MgKyAxKTsKKyAgICBzdHItPm9wZXJhdG9yW10ob3V0cHV0X3BvcykgPSAnXG4nOworICB9IGVsc2UgaWYgKG91dHB1dF9wb3MgPCBsZW4pIHsKKyAgICBzdHItPnJlc2l6ZShvdXRwdXRfcG9zKTsKKyAgfQorfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOb0xvY2FsZVN0cnRvZCgpCisvLyAgIFRoaXMgY29kZSB3aWxsIG1ha2UgeW91IGNyeS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbmFtZXNwYWNlIHsKKworLy8gUmV0dXJucyBhIHN0cmluZyBpZGVudGljYWwgdG8gKmlucHV0IGV4Y2VwdCB0aGF0IHRoZSBjaGFyYWN0ZXIgcG9pbnRlZCB0bworLy8gYnkgcmFkaXhfcG9zICh3aGljaCBzaG91bGQgYmUgJy4nKSBpcyByZXBsYWNlZCB3aXRoIHRoZSBsb2NhbGUtc3BlY2lmaWMKKy8vIHJhZGl4IGNoYXJhY3Rlci4KK3N0ZDo6c3RyaW5nIExvY2FsaXplUmFkaXgoY29uc3QgY2hhciAqaW5wdXQsIGNvbnN0IGNoYXIgKnJhZGl4X3BvcykgeworICAvLyBEZXRlcm1pbmUgdGhlIGxvY2FsZS1zcGVjaWZpYyByYWRpeCBjaGFyYWN0ZXIgYnkgY2FsbGluZyBzcHJpbnRmKCkgdG8KKyAgLy8gcHJpbnQgdGhlIG51bWJlciAxLjUsIHRoZW4gc3RyaXBwaW5nIG9mZiB0aGUgZGlnaXRzLiAgQXMgZmFyIGFzIEkgY2FuCisgIC8vIHRlbGwsIHRoaXMgaXMgdGhlIG9ubHkgcG9ydGFibGUsIHRocmVhZC1zYWZlIHdheSB0byBnZXQgdGhlIEMgbGlicmFyeQorICAvLyB0byBkaXZ1bGRnZSB0aGUgbG9jYWxlJ3MgcmFkaXggY2hhcmFjdGVyLiAgTm8sIGxvY2FsZWNvbnYoKSBpcyBOT1QKKyAgLy8gdGhyZWFkLXNhZmUuCisgIGNoYXIgdGVtcFsxNl07CisgIGludCBzaXplID0gc25wcmludGYodGVtcCwgc2l6ZW9mKHRlbXApLCAiJS4xZiIsIDEuNSk7CisgIEdPT0dMRV9DSEVDS19FUSh0ZW1wWzBdLCAnMScpOworICBHT09HTEVfQ0hFQ0tfRVEodGVtcFtzaXplIC0gMV0sICc1Jyk7CisgIEdPT0dMRV9DSEVDS19MRShzaXplLCA2KTsKKworICAvLyBOb3cgcmVwbGFjZSB0aGUgJy4nIGluIHRoZSBpbnB1dCB3aXRoIGl0LgorICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5yZXNlcnZlKHN0cmxlbihpbnB1dCkgKyBzaXplIC0gMyk7CisgIHJlc3VsdC5hcHBlbmQoaW5wdXQsIHJhZGl4X3Bvcyk7CisgIHJlc3VsdC5hcHBlbmQodGVtcCArIDEsIHNpemUgLSAyKTsKKyAgcmVzdWx0LmFwcGVuZChyYWRpeF9wb3MgKyAxKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2RvdWJsZSBOb0xvY2FsZVN0cnRvZChjb25zdCBjaGFyICpzdHIsIGNoYXIgKiplbmRwdHIpIHsKKyAgLy8gV2UgY2Fubm90IHNpbXBseSBzZXQgdGhlIGxvY2FsZSB0byAiQyIgdGVtcG9yYXJpbHkgd2l0aCBzZXRsb2NhbGUoKQorICAvLyBhcyB0aGlzIGlzIG5vdCB0aHJlYWQtc2FmZS4gIEluc3RlYWQsIHdlIHRyeSB0byBwYXJzZSBpbiB0aGUgY3VycmVudAorICAvLyBsb2NhbGUgZmlyc3QuICBJZiBwYXJzaW5nIHN0b3BzIGF0IGEgJy4nIGNoYXJhY3RlciwgdGhlbiB0aGlzIGlzIGEKKyAgLy8gcHJldHR5IGdvb2QgaGludCB0aGF0IHdlJ3JlIGFjdHVhbGx5IGluIHNvbWUgb3RoZXIgbG9jYWxlIGluIHdoaWNoCisgIC8vICcuJyBpcyBub3QgdGhlIHJhZGl4IGNoYXJhY3Rlci4KKworICBjaGFyICp0ZW1wX2VuZHB0cjsKKyAgZG91YmxlIHJlc3VsdCA9IHN0cnRvZChzdHIsICZ0ZW1wX2VuZHB0cik7CisgIGlmIChlbmRwdHIgIT0gTlVMTCkgKmVuZHB0ciA9IHRlbXBfZW5kcHRyOworICBpZiAoKnRlbXBfZW5kcHRyICE9ICcuJykgcmV0dXJuIHJlc3VsdDsKKworICAvLyBQYXJzaW5nIGhhbHRlZCBvbiBhICcuJy4gIFBlcmhhcHMgd2UncmUgaW4gYSBkaWZmZXJlbnQgbG9jYWxlPyAgTGV0J3MKKyAgLy8gdHJ5IHRvIHJlcGxhY2UgdGhlICcuJyB3aXRoIGEgbG9jYWxlLXNwZWNpZmljIHJhZGl4IGNoYXJhY3RlciBhbmQKKyAgLy8gdHJ5IGFnYWluLgorICBzdGQ6OnN0cmluZyBsb2NhbGl6ZWQgPSBMb2NhbGl6ZVJhZGl4KHN0ciwgdGVtcF9lbmRwdHIpOworICBjb25zdCBjaGFyICpsb2NhbGl6ZWRfY3N0ciA9IGxvY2FsaXplZC5jX3N0cigpOworICBjaGFyICpsb2NhbGl6ZWRfZW5kcHRyOworICByZXN1bHQgPSBzdHJ0b2QobG9jYWxpemVkX2NzdHIsICZsb2NhbGl6ZWRfZW5kcHRyKTsKKyAgaWYgKChsb2NhbGl6ZWRfZW5kcHRyIC0gbG9jYWxpemVkX2NzdHIpID4gKHRlbXBfZW5kcHRyIC0gc3RyKSkgeworICAgIC8vIFRoaXMgYXR0ZW1wdCBnb3QgZnVydGhlciwgc28gcmVwbGFjaW5nIHRoZSBkZWNpbWFsIG11c3QgaGF2ZSBoZWxwZWQuCisgICAgLy8gVXBkYXRlIGVuZHB0ciB0byBwb2ludCBhdCB0aGUgcmlnaHQgbG9jYXRpb24uCisgICAgaWYgKGVuZHB0ciAhPSBOVUxMKSB7CisgICAgICAvLyBzaXplX2RpZmYgaXMgbm9uLXplcm8gaWYgdGhlIGxvY2FsaXplZCByYWRpeCBoYXMgbXVsdGlwbGUgYnl0ZXMuCisgICAgICBpbnQgc2l6ZV9kaWZmID0gbG9jYWxpemVkLnNpemUoKSAtIHN0cmxlbihzdHIpOworICAgICAgLy8gY29uc3RfY2FzdCBpcyBuZWNlc3NhcnkgdG8gbWF0Y2ggdGhlIHN0cnRvZCgpIGludGVyZmFjZS4KKyAgICAgICplbmRwdHIgPSBjb25zdF9jYXN0PGNoYXIgKj4oCisgICAgICAgICAgc3RyICsgKGxvY2FsaXplZF9lbmRwdHIgLSBsb2NhbGl6ZWRfY3N0ciAtIHNpemVfZGlmZikpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1OGFiZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oCkBAIC0wLDAgKzEsOTUwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gZnJvbSBnb29nbGUzL3N0cmluZ3Mvc3RydXRpbC5oCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUUlVUSUxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVFJVVElMX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxODAwCisjZGVmaW5lIHN0cnRvbGwgIF9zdHJ0b2k2NAorI2RlZmluZSBzdHJ0b3VsbCBfc3RydG91aTY0CisjZWxpZiBkZWZpbmVkKF9fREVDQ1hYKSAmJiBkZWZpbmVkKF9fb3NmX18pCisvLyBIUCBDKysgb24gVHJ1NjQgZG9lcyBub3QgaGF2ZSBzdHJ0b2xsLCBidXQgc3RydG9sIGlzIGFscmVhZHkgNjQtYml0LgorI2RlZmluZSBzdHJ0b2xsIHN0cnRvbAorI2RlZmluZSBzdHJ0b3VsbCBzdHJ0b3VsCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYXNjaWlfaXNhbG51bSgpCisvLyAgICBDaGVjayBpZiBhbiBBU0NJSSBjaGFyYWN0ZXIgaXMgYWxwaGFudW1lcmljLiAgV2UgY2FuJ3QgdXNlIGN0eXBlJ3MKKy8vICAgIGlzYWxudW0oKSBiZWNhdXNlIGl0IGlzIGFmZmVjdGVkIGJ5IGxvY2FsZS4gIFRoaXMgZnVuY3Rpb24gaXMgYXBwbGllZAorLy8gICAgdG8gaWRlbnRpZmllcnMgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciBsYW5ndWFnZSwgbm90IHRvIG5hdHVyYWwtbGFuZ3VhZ2UKKy8vICAgIHN0cmluZ3MsIHNvIGxvY2FsZSBzaG91bGQgbm90IGJlIHRha2VuIGludG8gYWNjb3VudC4KKy8vIGFzY2lpX2lzZGlnaXQoKQorLy8gICAgTGlrZSBhYm92ZSwgYnV0IG9ubHkgYWNjZXB0cyBkaWdpdHMuCisvLyBhc2NpaV9pc3NwYWNlKCkKKy8vICAgIENoZWNrIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBzcGFjZSBjaGFyYWN0ZXIuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lubGluZSBib29sIGFzY2lpX2lzYWxudW0oY2hhciBjKSB7CisgIHJldHVybiAoJ2EnIDw9IGMgJiYgYyA8PSAneicpIHx8CisgICAgICAgICAoJ0EnIDw9IGMgJiYgYyA8PSAnWicpIHx8CisgICAgICAgICAoJzAnIDw9IGMgJiYgYyA8PSAnOScpOworfQorCitpbmxpbmUgYm9vbCBhc2NpaV9pc2RpZ2l0KGNoYXIgYykgeworICByZXR1cm4gKCcwJyA8PSBjICYmIGMgPD0gJzknKTsKK30KKworaW5saW5lIGJvb2wgYXNjaWlfaXNzcGFjZShjaGFyIGMpIHsKKyAgcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHYnIHx8IGMgPT0gJ1xmJyB8fAorICAgICAgYyA9PSAnXHInOworfQorCitpbmxpbmUgYm9vbCBhc2NpaV9pc3VwcGVyKGNoYXIgYykgeworICByZXR1cm4gYyA+PSAnQScgJiYgYyA8PSAnWic7Cit9CisKK2lubGluZSBib29sIGFzY2lpX2lzbG93ZXIoY2hhciBjKSB7CisgIHJldHVybiBjID49ICdhJyAmJiBjIDw9ICd6JzsKK30KKworaW5saW5lIGNoYXIgYXNjaWlfdG91cHBlcihjaGFyIGMpIHsKKyAgcmV0dXJuIGFzY2lpX2lzbG93ZXIoYykgPyBjIC0gKCdhJyAtICdBJykgOiBjOworfQorCitpbmxpbmUgY2hhciBhc2NpaV90b2xvd2VyKGNoYXIgYykgeworICByZXR1cm4gYXNjaWlfaXN1cHBlcihjKSA/IGMgKyAoJ2EnIC0gJ0EnKSA6IGM7Cit9CisKK2lubGluZSBpbnQgaGV4X2RpZ2l0X3RvX2ludChjaGFyIGMpIHsKKyAgLyogQXNzdW1lIEFTQ0lJLiAqLworICBpbnQgeCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpOworICBpZiAoeCA+ICc5JykgeworICAgIHggKz0gOTsKKyAgfQorICByZXR1cm4geCAmIDB4ZjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGFzUHJlZml4U3RyaW5nKCkKKy8vICAgIENoZWNrIGlmIGEgc3RyaW5nIGJlZ2lucyB3aXRoIGEgZ2l2ZW4gcHJlZml4LgorLy8gU3RyaXBQcmVmaXhTdHJpbmcoKQorLy8gICAgR2l2ZW4gYSBzdHJpbmcgYW5kIGEgcHV0YXRpdmUgcHJlZml4LCByZXR1cm5zIHRoZSBzdHJpbmcgbWludXMgdGhlCisvLyAgICBwcmVmaXggc3RyaW5nIGlmIHRoZSBwcmVmaXggbWF0Y2hlcywgb3RoZXJ3aXNlIHRoZSBvcmlnaW5hbAorLy8gICAgc3RyaW5nLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW5saW5lIGJvb2wgSGFzUHJlZml4U3RyaW5nKFN0cmluZ1BpZWNlIHN0ciwgU3RyaW5nUGllY2UgcHJlZml4KSB7CisgIHJldHVybiBzdHIuc2l6ZSgpID49IHByZWZpeC5zaXplKCkgJiYKKyAgICAgICAgIG1lbWNtcChzdHIuZGF0YSgpLCBwcmVmaXguZGF0YSgpLCBwcmVmaXguc2l6ZSgpKSA9PSAwOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgU3RyaXBQcmVmaXhTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4KSB7CisgIGlmIChIYXNQcmVmaXhTdHJpbmcoc3RyLCBwcmVmaXgpKSB7CisgICAgcmV0dXJuIHN0ci5zdWJzdHIocHJlZml4LnNpemUoKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIYXNTdWZmaXhTdHJpbmcoKQorLy8gICAgUmV0dXJuIHRydWUgaWYgc3RyIGVuZHMgaW4gc3VmZml4LgorLy8gU3RyaXBTdWZmaXhTdHJpbmcoKQorLy8gICAgR2l2ZW4gYSBzdHJpbmcgYW5kIGEgcHV0YXRpdmUgc3VmZml4LCByZXR1cm5zIHRoZSBzdHJpbmcgbWludXMgdGhlCisvLyAgICBzdWZmaXggc3RyaW5nIGlmIHRoZSBzdWZmaXggbWF0Y2hlcywgb3RoZXJ3aXNlIHRoZSBvcmlnaW5hbAorLy8gICAgc3RyaW5nLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW5saW5lIGJvb2wgSGFzU3VmZml4U3RyaW5nKFN0cmluZ1BpZWNlIHN0ciwgU3RyaW5nUGllY2Ugc3VmZml4KSB7CisgIHJldHVybiBzdHIuc2l6ZSgpID49IHN1ZmZpeC5zaXplKCkgJiYKKyAgICAgICAgIG1lbWNtcChzdHIuZGF0YSgpICsgc3RyLnNpemUoKSAtIHN1ZmZpeC5zaXplKCksIHN1ZmZpeC5kYXRhKCksCisgICAgICAgICAgICAgICAgc3VmZml4LnNpemUoKSkgPT0gMDsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIFN0cmlwU3VmZml4U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCkgeworICBpZiAoSGFzU3VmZml4U3RyaW5nKHN0ciwgc3VmZml4KSkgeworICAgIHJldHVybiBzdHIuc3Vic3RyKDAsIHN0ci5zaXplKCkgLSBzdWZmaXguc2l6ZSgpKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc3RyOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJlcGxhY2VDaGFyYWN0ZXJzCisvLyAgICBSZXBsYWNlcyBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgY2hhcmFjdGVyICdyZW1vdmUnIChvciB0aGUgY2hhcmFjdGVycworLy8gICAgaW4gJ3JlbW92ZScpIHdpdGggdGhlIGNoYXJhY3RlciAncmVwbGFjZXdpdGgnLgorLy8gICAgR29vZCBmb3Iga2VlcGluZyBodG1sIGNoYXJhY3RlcnMgb3IgcHJvdG9jb2wgY2hhcmFjdGVycyAoXHQpIG91dAorLy8gICAgb2YgcGxhY2VzIHdoZXJlIHRoZXkgbWlnaHQgY2F1c2UgYSBwcm9ibGVtLgorLy8gU3RyaXBXaGl0ZXNwYWNlCisvLyAgICBSZW1vdmVzIHdoaXRlc3BhY2VzIGZyb20gYm90aCBlbmRzIG9mIHRoZSBnaXZlbiBzdHJpbmcuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQUk9UT0JVRl9FWFBPUlQgdm9pZCBSZXBsYWNlQ2hhcmFjdGVycyhzdGQ6OnN0cmluZyogcywgY29uc3QgY2hhciogcmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByZXBsYWNld2l0aCk7CisKK1BST1RPQlVGX0VYUE9SVCB2b2lkIFN0cmlwV2hpdGVzcGFjZShzdGQ6OnN0cmluZyogcyk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExvd2VyU3RyaW5nKCkKKy8vIFVwcGVyU3RyaW5nKCkKKy8vIFRvVXBwZXIoKQorLy8gICAgQ29udmVydCB0aGUgY2hhcmFjdGVycyBpbiAicyIgdG8gbG93ZXJjYXNlIG9yIHVwcGVyY2FzZS4gIEFTQ0lJLW9ubHk6CisvLyAgICB0aGVzZSBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBpZ25vcmUgbG9jYWxlIGJlY2F1c2UgdGhleSBhcmUgYXBwbGllZCB0bworLy8gICAgaWRlbnRpZmllcnMgdXNlZCBpbiB0aGUgUHJvdG9jb2wgQnVmZmVyIGxhbmd1YWdlLCBub3QgdG8gbmF0dXJhbC1sYW5ndWFnZQorLy8gICAgc3RyaW5ncy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lIHZvaWQgTG93ZXJTdHJpbmcoc3RkOjpzdHJpbmcqIHMpIHsKKyAgc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGVuZCA9IHMtPmVuZCgpOworICBmb3IgKHN0ZDo6c3RyaW5nOjppdGVyYXRvciBpID0gcy0+YmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkgeworICAgIC8vIHRvbG93ZXIoKSBjaGFuZ2VzIGJhc2VkIG9uIGxvY2FsZS4gIFdlIGRvbid0IHdhbnQgdGhpcyEKKyAgICBpZiAoJ0EnIDw9ICppICYmICppIDw9ICdaJykgKmkgKz0gJ2EnIC0gJ0EnOworICB9Cit9CisKK2lubGluZSB2b2lkIFVwcGVyU3RyaW5nKHN0ZDo6c3RyaW5nKiBzKSB7CisgIHN0ZDo6c3RyaW5nOjppdGVyYXRvciBlbmQgPSBzLT5lbmQoKTsKKyAgZm9yIChzdGQ6OnN0cmluZzo6aXRlcmF0b3IgaSA9IHMtPmJlZ2luKCk7IGkgIT0gZW5kOyArK2kpIHsKKyAgICAvLyB0b3VwcGVyKCkgY2hhbmdlcyBiYXNlZCBvbiBsb2NhbGUuICBXZSBkb24ndCB3YW50IHRoaXMhCisgICAgaWYgKCdhJyA8PSAqaSAmJiAqaSA8PSAneicpICppICs9ICdBJyAtICdhJzsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBUb1VwcGVyKHN0ZDo6c3RyaW5nKiBzKSB7IFVwcGVyU3RyaW5nKHMpOyB9CisKK2lubGluZSBzdGQ6OnN0cmluZyBUb1VwcGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgIHN0ZDo6c3RyaW5nIG91dCA9IHM7CisgIFVwcGVyU3RyaW5nKCZvdXQpOworICByZXR1cm4gb3V0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdHJpbmdSZXBsYWNlKCkKKy8vICAgIEdpdmUgbWUgYSBzdHJpbmcgYW5kIHR3byBwYXR0ZXJucyAib2xkIiBhbmQgIm5ldyIsIGFuZCBJIHJlcGxhY2UKKy8vICAgIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiAib2xkIiBpbiB0aGUgc3RyaW5nIHdpdGggIm5ldyIsIGlmIGl0CisvLyAgICBleGlzdHMuICBSRVRVUk4gYSBuZXcgc3RyaW5nLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHJlcGxhY2VtZW50CisvLyAgICBoYXBwZW5lZCBvciBub3QuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BST1RPQlVGX0VYUE9SVCBzdGQ6OnN0cmluZyBTdHJpbmdSZXBsYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9sZHN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcGxhY2VfYWxsKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3BsaXRTdHJpbmdVc2luZygpCisvLyAgICBTcGxpdCBhIHN0cmluZyB1c2luZyBhIGNoYXJhY3RlciBkZWxpbWl0ZXIuIEFwcGVuZCB0aGUgY29tcG9uZW50cworLy8gICAgdG8gJ3Jlc3VsdCcuICBJZiB0aGVyZSBhcmUgY29uc2VjdXRpdmUgZGVsaW1pdGVycywgdGhpcyBmdW5jdGlvbiBza2lwcworLy8gICAgb3ZlciBhbGwgb2YgdGhlbS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST1RPQlVGX0VYUE9SVCB2b2lkIFNwbGl0U3RyaW5nVXNpbmcoU3RyaW5nUGllY2UgZnVsbCwgY29uc3QgY2hhciogZGVsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcmVzKTsKKworLy8gU3BsaXQgYSBzdHJpbmcgdXNpbmcgb25lIG9yIG1vcmUgYnl0ZSBkZWxpbWl0ZXJzLCBwcmVzZW50ZWQKKy8vIGFzIGEgbnVsLXRlcm1pbmF0ZWQgYyBzdHJpbmcuIEFwcGVuZCB0aGUgY29tcG9uZW50cyB0byAncmVzdWx0Jy4KKy8vIElmIHRoZXJlIGFyZSBjb25zZWN1dGl2ZSBkZWxpbWl0ZXJzLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuCisvLyBjb3JyZXNwb25kaW5nIGVtcHR5IHN0cmluZ3MuICBJZiB5b3Ugd2FudCB0byBkcm9wIHRoZSBlbXB0eQorLy8gc3RyaW5ncywgdHJ5IFNwbGl0U3RyaW5nVXNpbmcoKS4KKy8vCisvLyBJZiAiZnVsbCIgaXMgdGhlIGVtcHR5IHN0cmluZywgeWllbGRzIGFuIGVtcHR5IHN0cmluZyBhcyB0aGUgb25seSB2YWx1ZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST1RPQlVGX0VYUE9SVCB2b2lkIFNwbGl0U3RyaW5nQWxsb3dFbXB0eShTdHJpbmdQaWVjZSBmdWxsLCBjb25zdCBjaGFyKiBkZWxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHJlc3VsdCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNwbGl0KCkKKy8vICAgIFNwbGl0IGEgc3RyaW5nIHVzaW5nIGEgY2hhcmFjdGVyIGRlbGltaXRlci4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lubGluZSBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU3BsaXQoU3RyaW5nUGllY2UgZnVsbCwgY29uc3QgY2hhciogZGVsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9lbXB0eSA9IHRydWUpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlc3VsdDsKKyAgaWYgKHNraXBfZW1wdHkpIHsKKyAgICBTcGxpdFN0cmluZ1VzaW5nKGZ1bGwsIGRlbGltLCAmcmVzdWx0KTsKKyAgfSBlbHNlIHsKKyAgICBTcGxpdFN0cmluZ0FsbG93RW1wdHkoZnVsbCwgZGVsaW0sICZyZXN1bHQpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEpvaW5TdHJpbmdzKCkKKy8vICAgIFRoZXNlIG1ldGhvZHMgY29uY2F0ZW5hdGUgYSB2ZWN0b3Igb2Ygc3RyaW5ncyBpbnRvIGEgQysrIHN0cmluZywgdXNpbmcKKy8vICAgIHRoZSBDLXN0cmluZyAiZGVsaW0iIGFzIGEgc2VwYXJhdG9yIGJldHdlZW4gY29tcG9uZW50cy4gVGhlcmUgYXJlIHR3bworLy8gICAgZmxhdm9ycyBvZiB0aGUgZnVuY3Rpb24sIG9uZSBmbGF2b3IgcmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIHN0cmluZywKKy8vICAgIGFub3RoZXIgdGFrZXMgYSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgc3RyaW5nLiBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlCisvLyAgICB0YXJnZXQgc3RyaW5nIGlzIGNsZWFyZWQgYW5kIG92ZXJ3cml0dGVuLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUFJPVE9CVUZfRVhQT1JUIHZvaWQgSm9pblN0cmluZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVsaW0sIHN0ZDo6c3RyaW5nKiByZXN1bHQpOworCitpbmxpbmUgc3RkOjpzdHJpbmcgSm9pblN0cmluZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlbGltKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgSm9pblN0cmluZ3MoY29tcG9uZW50cywgZGVsaW0sICZyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoKQorLy8gICAgQ29waWVzICJzb3VyY2UiIHRvICJkZXN0IiwgcmV3cml0aW5nIEMtc3R5bGUgZXNjYXBlIHNlcXVlbmNlcworLy8gICAgLS0gJ1xuJywgJ1xyJywgJ1xcJywgJ1xvb28nLCBldGMgLS0gdG8gdGhlaXIgQVNDSUkKKy8vICAgIGVxdWl2YWxlbnRzLiAgImRlc3QiIG11c3QgYmUgc3VmZmljaWVudGx5IGxhcmdlIHRvIGhvbGQgYWxsCisvLyAgICB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmV3cml0dGVuIHN0cmluZyAoaS5lLiBhdCBsZWFzdCBhcyBsYXJnZQorLy8gICAgYXMgc3RybGVuKHNvdXJjZSkgKyAxIHNob3VsZCBiZSBzYWZlLCBzaW5jZSB0aGUgcmVwbGFjZW1lbnRzCisvLyAgICBhcmUgYWx3YXlzIHNob3J0ZXIgdGhhbiB0aGUgb3JpZ2luYWwgZXNjYXBlZCBzZXF1ZW5jZXMpLiAgSXQncworLy8gICAgc2FmZSBmb3Igc291cmNlIGFuZCBkZXN0IHRvIGJlIHRoZSBzYW1lLiAgUkVUVVJOUyB0aGUgbGVuZ3RoCisvLyAgICBvZiBkZXN0LgorLy8KKy8vICAgIEl0IGFsbG93cyBoZXggc2VxdWVuY2VzIFx4aGgsIG9yIGdlbmVyYWxseSBceGhoaGhoIHdpdGggYW4KKy8vICAgIGFyYml0cmFyeSBudW1iZXIgb2YgaGV4IGRpZ2l0cywgYnV0IGFsbCBvZiB0aGVtIHRvZ2V0aGVyIG11c3QKKy8vICAgIHNwZWNpZnkgYSB2YWx1ZSBvZiBhIHNpbmdsZSBieXRlIChlLmcuIFx4MDA0NSBpcyBlcXVpdmFsZW50CisvLyAgICB0byBceDQ1LCBhbmQgXHgxMjM0IGlzIGVycm9uZW91cykuCisvLworLy8gICAgSXQgYWxzbyBhbGxvd3MgZXNjYXBlIHNlcXVlbmNlcyBvZiB0aGUgZm9ybSBcdWhoaGggKGV4YWN0bHkgZm91cgorLy8gICAgaGV4IGRpZ2l0cywgdXBwZXIgb3IgbG93ZXIgY2FzZSkgb3IgXFVoaGhoaGhoaCAoZXhhY3RseSBlaWdodAorLy8gICAgaGV4IGRpZ2l0cywgdXBwZXIgb3IgbG93ZXIgY2FzZSkgdG8gc3BlY2lmeSBhIFVuaWNvZGUgY29kZQorLy8gICAgcG9pbnQuIFRoZSBkZXN0IGFycmF5IHdpbGwgY29udGFpbiB0aGUgVVRGOC1lbmNvZGVkIHZlcnNpb24gb2YKKy8vICAgIHRoYXQgY29kZS1wb2ludCAoZS5nLiwgaWYgc291cmNlIGNvbnRhaW5zIFx1MjAxOSwgdGhlbiBkZXN0IHdpbGwKKy8vICAgIGNvbnRhaW4gdGhlIHRocmVlIGJ5dGVzIDB4RTIsIDB4ODAsIGFuZCAweDk5KS4KKy8vCisvLyAgICBFcnJvcnM6IEluIHRoZSBmaXJzdCBmb3JtIG9mIHRoZSBjYWxsLCBlcnJvcnMgYXJlIHJlcG9ydGVkIHdpdGgKKy8vICAgIExPRyhFUlJPUikuIFRoZSBzYW1lIGlzIHRydWUgZm9yIHRoZSBzZWNvbmQgZm9ybSBvZiB0aGUgY2FsbCBpZgorLy8gICAgdGhlIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBzdGQ6OnZlY3RvciBpcyBudWxscHRyOyBvdGhlcndpc2UsIGVycm9yCisvLyAgICBtZXNzYWdlcyBhcmUgc3RvcmVkIGluIHRoZSBzdGQ6OnZlY3Rvci4gSW4gZWl0aGVyIGNhc2UsIHRoZSBlZmZlY3Qgb24KKy8vICAgIHRoZSBkZXN0IGFycmF5IGlzIG5vdCBkZWZpbmVkLCBidXQgcmVzdCBvZiB0aGUgc291cmNlIHdpbGwgYmUKKy8vICAgIHByb2Nlc3NlZC4KKy8vICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUFJPVE9CVUZfRVhQT1JUIGludCBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoY29uc3QgY2hhciogc291cmNlLCBjaGFyKiBkZXN0KTsKK1BST1RPQlVGX0VYUE9SVCBpbnQgVW5lc2NhcGVDRXNjYXBlU2VxdWVuY2VzKGNvbnN0IGNoYXIqIHNvdXJjZSwgY2hhciogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogZXJyb3JzKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVW5lc2NhcGVDRXNjYXBlU3RyaW5nKCkKKy8vICAgIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMsIGJ1dCBjcmVhdGVzCisvLyAgICBhIG5ldyBzdHJpbmcuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCBhbGxvY2F0aW5nCisvLyAgICBhIGRlc3QgYnVmZmVyLiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBub24gcGVyZm9ybWFuY2UgY3JpdGljYWwKKy8vICAgIHRhc2tzIHN1Y2ggYXMgcHJpbnRpbmcgZGVidWcgbWVzc2FnZXMuIEl0IGlzIHNhZmUgZm9yIHNyYyBhbmQgZGVzdAorLy8gICAgdG8gYmUgdGhlIHNhbWUuCisvLworLy8gICAgVGhlIHNlY29uZCBjYWxsIHN0b3JlcyBpdHMgZXJyb3JzIGluIGEgc3VwcGxpZWQgc3RyaW5nIHZlY3Rvci4KKy8vICAgIElmIHRoZSBzdHJpbmcgdmVjdG9yIHBvaW50ZXIgaXMgbnVsbHB0ciwgaXQgcmVwb3J0cyB0aGUgZXJyb3JzIHdpdGggTE9HKCkuCisvLworLy8gICAgSW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2FsbHMsIHRoZSBsZW5ndGggb2YgZGVzdCBpcyByZXR1cm5lZC4gSW4gdGhlCisvLyAgICB0aGUgdGhpcmQgY2FsbCwgdGhlIG5ldyBzdHJpbmcgaXMgcmV0dXJuZWQuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BST1RPQlVGX0VYUE9SVCBpbnQgVW5lc2NhcGVDRXNjYXBlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZGVzdCk7CitQUk9UT0JVRl9FWFBPUlQgaW50IFVuZXNjYXBlQ0VzY2FwZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGVycm9ycyk7CitQUk9UT0JVRl9FWFBPUlQgc3RkOjpzdHJpbmcgVW5lc2NhcGVDRXNjYXBlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzcmMpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDRXNjYXBlKCkKKy8vICAgIEVzY2FwZXMgJ3NyYycgdXNpbmcgQy1zdHlsZSBlc2NhcGUgc2VxdWVuY2VzIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcKKy8vICAgIHN0cmluZy4KKy8vCisvLyAgICBFc2NhcGVkIGNoYXJzOiBcbiwgXHIsIFx0LCAiLCAnLCBcLCBhbmQgIWlzcHJpbnQoKS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST1RPQlVGX0VYUE9SVCBzdGQ6OnN0cmluZyBDRXNjYXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzcmMpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDRXNjYXBlQW5kQXBwZW5kKCkKKy8vICAgIEVzY2FwZXMgJ3NyYycgdXNpbmcgQy1zdHlsZSBlc2NhcGUgc2VxdWVuY2VzLCBhbmQgYXBwZW5kcyB0aGUgZXNjYXBlZAorLy8gICAgc3RyaW5nIHRvICdkZXN0Jy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST1RPQlVGX0VYUE9SVCB2b2lkIENFc2NhcGVBbmRBcHBlbmQoU3RyaW5nUGllY2Ugc3JjLCBzdGQ6OnN0cmluZyogZGVzdCk7CisKK25hbWVzcGFjZSBzdHJpbmdzIHsKKy8vIExpa2UgQ0VzY2FwZSgpIGJ1dCBkb2VzIG5vdCBlc2NhcGUgYnl0ZXMgd2l0aCB0aGUgdXBwZXIgYml0IHNldC4KK1BST1RPQlVGX0VYUE9SVCBzdGQ6OnN0cmluZyBVdGY4U2FmZUNFc2NhcGUoY29uc3Qgc3RkOjpzdHJpbmcmIHNyYyk7CisKKy8vIExpa2UgQ0VzY2FwZSgpIGJ1dCB1c2VzIGhleCAoXHgpIGVzY2FwZXMgaW5zdGVhZCBvZiBvY3RhbHMuCitQUk9UT0JVRl9FWFBPUlQgc3RkOjpzdHJpbmcgQ0hleEVzY2FwZShjb25zdCBzdGQ6OnN0cmluZyYgc3JjKTsKK30gIC8vIG5hbWVzcGFjZSBzdHJpbmdzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0cnRvMzIoKQorLy8gc3RydG91MzIoKQorLy8gc3RydG82NCgpCisvLyBzdHJ0b3U2NCgpCisvLyAgICBBcmNoaXRlY3R1cmUtbmV1dHJhbCBwbHVnIGNvbXBhdGlibGUgcmVwbGFjZW1lbnRzIGZvciBzdHJ0b2woKSBhbmQKKy8vICAgIHN0cnRvdWwoKS4gIExvbmcncyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzIG9uIElMUC0zMiBhbmQgTFAtNjQKKy8vICAgIHBsYXRmb3Jtcywgc28gdXNpbmcgdGhlc2UgaXMgc2FmZXIsIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YKKy8vICAgIG92ZXJmbG93IGJlaGF2aW9yLCB0aGFuIHVzaW5nIHRoZSBzdGFuZGFyZCBsaWJjIGZ1bmN0aW9ucy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST1RPQlVGX0VYUE9SVCBpbnQzMl90IHN0cnRvMzJfYWRhcHRvcihjb25zdCBjaGFyKiBucHRyLCBjaGFyKiogZW5kcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYXNlKTsKK1BST1RPQlVGX0VYUE9SVCB1aW50MzJfdCBzdHJ0b3UzMl9hZGFwdG9yKGNvbnN0IGNoYXIqIG5wdHIsIGNoYXIqKiBlbmRwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZSk7CisKK2lubGluZSBpbnQzMl90IHN0cnRvMzIoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpIHsKKyAgaWYgKHNpemVvZihpbnQzMl90KSA9PSBzaXplb2YobG9uZykpCisgICAgcmV0dXJuIHN0cnRvbChucHRyLCBlbmRwdHIsIGJhc2UpOworICBlbHNlCisgICAgcmV0dXJuIHN0cnRvMzJfYWRhcHRvcihucHRyLCBlbmRwdHIsIGJhc2UpOworfQorCitpbmxpbmUgdWludDMyX3Qgc3RydG91MzIoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpIHsKKyAgaWYgKHNpemVvZih1aW50MzJfdCkgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorICAgIHJldHVybiBzdHJ0b3VsKG5wdHIsIGVuZHB0ciwgYmFzZSk7CisgIGVsc2UKKyAgICByZXR1cm4gc3RydG91MzJfYWRhcHRvcihucHRyLCBlbmRwdHIsIGJhc2UpOworfQorCisvLyBGb3Igbm93LCBsb25nIGxvbmcgaXMgNjQtYml0IG9uIGFsbCB0aGUgcGxhdGZvcm1zIHdlIGNhcmUgYWJvdXQsIHNvIHRoZXNlCisvLyBmdW5jdGlvbnMgY2FuIHNpbXBseSBwYXNzIHRoZSBjYWxsIHRvIHN0cnRvW3VdbGwuCitpbmxpbmUgaW50NjRfdCBzdHJ0bzY0KGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGludDY0X3QpID09IHNpemVvZihsb25nIGxvbmcpLAorICAgICAgICAgICAgICAgICJzaXplb2YgaW50NjRfdCBpcyBub3Qgc2l6ZW9mIGxvbmcgbG9uZyIpOworICByZXR1cm4gc3RydG9sbChucHRyLCBlbmRwdHIsIGJhc2UpOworfQorCitpbmxpbmUgdWludDY0X3Qgc3RydG91NjQoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpIHsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YodWludDY0X3QpID09IHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpLAorICAgICAgICAgICAgICAgICJzaXplb2YgdWludDY0X3QgaXMgbm90IHNpemVvZiB1bnNpZ25lZCBsb25nIGxvbmciKTsKKyAgcmV0dXJuIHN0cnRvdWxsKG5wdHIsIGVuZHB0ciwgYmFzZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNhZmVfc3RydG9iKCkKKy8vIHNhZmVfc3RydG8zMigpCisvLyBzYWZlX3N0cnRvdTMyKCkKKy8vIHNhZmVfc3RydG82NCgpCisvLyBzYWZlX3N0cnRvdTY0KCkKKy8vIHNhZmVfc3RydG9mKCkKKy8vIHNhZmVfc3RydG9kKCkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST1RPQlVGX0VYUE9SVCBib29sIHNhZmVfc3RydG9iKFN0cmluZ1BpZWNlIHN0ciwgYm9vbCogdmFsdWUpOworCitQUk9UT0JVRl9FWFBPUlQgYm9vbCBzYWZlX3N0cnRvMzIoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgaW50MzJfdCogdmFsdWUpOworUFJPVE9CVUZfRVhQT1JUIGJvb2wgc2FmZV9zdHJ0b3UzMihjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCB1aW50MzJfdCogdmFsdWUpOworaW5saW5lIGJvb2wgc2FmZV9zdHJ0bzMyKGNvbnN0IGNoYXIqIHN0ciwgaW50MzJfdCogdmFsdWUpIHsKKyAgcmV0dXJuIHNhZmVfc3RydG8zMihzdGQ6OnN0cmluZyhzdHIpLCB2YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBzYWZlX3N0cnRvMzIoU3RyaW5nUGllY2Ugc3RyLCBpbnQzMl90KiB2YWx1ZSkgeworICByZXR1cm4gc2FmZV9zdHJ0bzMyKHN0ci5Ub1N0cmluZygpLCB2YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBzYWZlX3N0cnRvdTMyKGNvbnN0IGNoYXIqIHN0ciwgdWludDMyX3QqIHZhbHVlKSB7CisgIHJldHVybiBzYWZlX3N0cnRvdTMyKHN0ZDo6c3RyaW5nKHN0ciksIHZhbHVlKTsKK30KK2lubGluZSBib29sIHNhZmVfc3RydG91MzIoU3RyaW5nUGllY2Ugc3RyLCB1aW50MzJfdCogdmFsdWUpIHsKKyAgcmV0dXJuIHNhZmVfc3RydG91MzIoc3RyLlRvU3RyaW5nKCksIHZhbHVlKTsKK30KKworUFJPVE9CVUZfRVhQT1JUIGJvb2wgc2FmZV9zdHJ0bzY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGludDY0X3QqIHZhbHVlKTsKK1BST1RPQlVGX0VYUE9SVCBib29sIHNhZmVfc3RydG91NjQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgdWludDY0X3QqIHZhbHVlKTsKK2lubGluZSBib29sIHNhZmVfc3RydG82NChjb25zdCBjaGFyKiBzdHIsIGludDY0X3QqIHZhbHVlKSB7CisgIHJldHVybiBzYWZlX3N0cnRvNjQoc3RkOjpzdHJpbmcoc3RyKSwgdmFsdWUpOworfQoraW5saW5lIGJvb2wgc2FmZV9zdHJ0bzY0KFN0cmluZ1BpZWNlIHN0ciwgaW50NjRfdCogdmFsdWUpIHsKKyAgcmV0dXJuIHNhZmVfc3RydG82NChzdHIuVG9TdHJpbmcoKSwgdmFsdWUpOworfQoraW5saW5lIGJvb2wgc2FmZV9zdHJ0b3U2NChjb25zdCBjaGFyKiBzdHIsIHVpbnQ2NF90KiB2YWx1ZSkgeworICByZXR1cm4gc2FmZV9zdHJ0b3U2NChzdGQ6OnN0cmluZyhzdHIpLCB2YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBzYWZlX3N0cnRvdTY0KFN0cmluZ1BpZWNlIHN0ciwgdWludDY0X3QqIHZhbHVlKSB7CisgIHJldHVybiBzYWZlX3N0cnRvdTY0KHN0ci5Ub1N0cmluZygpLCB2YWx1ZSk7Cit9CisKK1BST1RPQlVGX0VYUE9SVCBib29sIHNhZmVfc3RydG9mKGNvbnN0IGNoYXIqIHN0ciwgZmxvYXQqIHZhbHVlKTsKK1BST1RPQlVGX0VYUE9SVCBib29sIHNhZmVfc3RydG9kKGNvbnN0IGNoYXIqIHN0ciwgZG91YmxlKiB2YWx1ZSk7CitpbmxpbmUgYm9vbCBzYWZlX3N0cnRvZihjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBmbG9hdCogdmFsdWUpIHsKKyAgcmV0dXJuIHNhZmVfc3RydG9mKHN0ci5jX3N0cigpLCB2YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBzYWZlX3N0cnRvZChjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBkb3VibGUqIHZhbHVlKSB7CisgIHJldHVybiBzYWZlX3N0cnRvZChzdHIuY19zdHIoKSwgdmFsdWUpOworfQoraW5saW5lIGJvb2wgc2FmZV9zdHJ0b2YoU3RyaW5nUGllY2Ugc3RyLCBmbG9hdCogdmFsdWUpIHsKKyAgcmV0dXJuIHNhZmVfc3RydG9mKHN0ci5Ub1N0cmluZygpLCB2YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBzYWZlX3N0cnRvZChTdHJpbmdQaWVjZSBzdHIsIGRvdWJsZSogdmFsdWUpIHsKKyAgcmV0dXJuIHNhZmVfc3RydG9kKHN0ci5Ub1N0cmluZygpLCB2YWx1ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZhc3RJbnRUb0J1ZmZlcigpCisvLyBGYXN0SGV4VG9CdWZmZXIoKQorLy8gRmFzdEhleDY0VG9CdWZmZXIoKQorLy8gRmFzdEhleDMyVG9CdWZmZXIoKQorLy8gRmFzdFRpbWVUb0J1ZmZlcigpCisvLyAgICBUaGVzZSBhcmUgaW50ZW5kZWQgZm9yIHNwZWVkLiAgRmFzdEludFRvQnVmZmVyKCkgYXNzdW1lcyB0aGUKKy8vICAgIGludGVnZXIgaXMgbm9uLW5lZ2F0aXZlLiAgRmFzdEhleFRvQnVmZmVyKCkgcHV0cyBvdXRwdXQgaW4KKy8vICAgIGhleCByYXRoZXIgdGhhbiBkZWNpbWFsLiAgRmFzdFRpbWVUb0J1ZmZlcigpIHB1dHMgdGhlIG91dHB1dAorLy8gICAgaW50byBSRkM4MjIgZm9ybWF0LgorLy8KKy8vICAgIEZhc3RIZXg2NFRvQnVmZmVyKCkgcHV0cyBhIDY0LWJpdCB1bnNpZ25lZCB2YWx1ZSBpbiBoZXgtZm9ybWF0LAorLy8gICAgcGFkZGVkIHRvIGV4YWN0bHkgMTYgYnl0ZXMgKHBsdXMgb25lIGJ5dGUgZm9yICdcMCcpCisvLworLy8gICAgRmFzdEhleDMyVG9CdWZmZXIoKSBwdXRzIGEgMzItYml0IHVuc2lnbmVkIHZhbHVlIGluIGhleC1mb3JtYXQsCisvLyAgICBwYWRkZWQgdG8gZXhhY3RseSA4IGJ5dGVzIChwbHVzIG9uZSBieXRlIGZvciAnXDAnKQorLy8KKy8vICAgICAgIEFsbCBmdW5jdGlvbnMgdGFrZSB0aGUgb3V0cHV0IGJ1ZmZlciBhcyBhbiBhcmcuCisvLyAgICBUaGV5IGFsbCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCwKKy8vICAgIHdoaWNoIG1heSBub3QgYmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgYnVmZmVyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBTdWdnZXN0ZWQgYnVmZmVyIHNpemUgZm9yIEZhc3RUb0J1ZmZlciBmdW5jdGlvbnMuICBBbHNvIHdvcmtzIHdpdGgKKy8vIERvdWJsZVRvQnVmZmVyKCkgYW5kIEZsb2F0VG9CdWZmZXIoKS4KK3N0YXRpYyBjb25zdCBpbnQga0Zhc3RUb0J1ZmZlclNpemUgPSAzMjsKKworUFJPVE9CVUZfRVhQT1JUIGNoYXIqIEZhc3RJbnQzMlRvQnVmZmVyKGludDMyX3QgaSwgY2hhciogYnVmZmVyKTsKK1BST1RPQlVGX0VYUE9SVCBjaGFyKiBGYXN0SW50NjRUb0J1ZmZlcihpbnQ2NF90IGksIGNoYXIqIGJ1ZmZlcik7CitjaGFyKiBGYXN0VUludDMyVG9CdWZmZXIodWludDMyX3QgaSwgY2hhciogYnVmZmVyKTsgIC8vIGlubGluZSBiZWxvdworY2hhciogRmFzdFVJbnQ2NFRvQnVmZmVyKHVpbnQ2NF90IGksIGNoYXIqIGJ1ZmZlcik7ICAvLyBpbmxpbmUgYmVsb3cKK1BST1RPQlVGX0VYUE9SVCBjaGFyKiBGYXN0SGV4VG9CdWZmZXIoaW50IGksIGNoYXIqIGJ1ZmZlcik7CitQUk9UT0JVRl9FWFBPUlQgY2hhciogRmFzdEhleDY0VG9CdWZmZXIodWludDY0X3QgaSwgY2hhciogYnVmZmVyKTsKK1BST1RPQlVGX0VYUE9SVCBjaGFyKiBGYXN0SGV4MzJUb0J1ZmZlcih1aW50MzJfdCBpLCBjaGFyKiBidWZmZXIpOworCisvLyBhdCBsZWFzdCAyMiBieXRlcyBsb25nCitpbmxpbmUgY2hhciogRmFzdEludFRvQnVmZmVyKGludCBpLCBjaGFyKiBidWZmZXIpIHsKKyAgcmV0dXJuIChzaXplb2YoaSkgPT0gNCA/CisgICAgICAgICAgRmFzdEludDMyVG9CdWZmZXIoaSwgYnVmZmVyKSA6IEZhc3RJbnQ2NFRvQnVmZmVyKGksIGJ1ZmZlcikpOworfQoraW5saW5lIGNoYXIqIEZhc3RVSW50VG9CdWZmZXIodW5zaWduZWQgaW50IGksIGNoYXIqIGJ1ZmZlcikgeworICByZXR1cm4gKHNpemVvZihpKSA9PSA0ID8KKyAgICAgICAgICBGYXN0VUludDMyVG9CdWZmZXIoaSwgYnVmZmVyKSA6IEZhc3RVSW50NjRUb0J1ZmZlcihpLCBidWZmZXIpKTsKK30KK2lubGluZSBjaGFyKiBGYXN0TG9uZ1RvQnVmZmVyKGxvbmcgaSwgY2hhciogYnVmZmVyKSB7CisgIHJldHVybiAoc2l6ZW9mKGkpID09IDQgPworICAgICAgICAgIEZhc3RJbnQzMlRvQnVmZmVyKGksIGJ1ZmZlcikgOiBGYXN0SW50NjRUb0J1ZmZlcihpLCBidWZmZXIpKTsKK30KK2lubGluZSBjaGFyKiBGYXN0VUxvbmdUb0J1ZmZlcih1bnNpZ25lZCBsb25nIGksIGNoYXIqIGJ1ZmZlcikgeworICByZXR1cm4gKHNpemVvZihpKSA9PSA0ID8KKyAgICAgICAgICBGYXN0VUludDMyVG9CdWZmZXIoaSwgYnVmZmVyKSA6IEZhc3RVSW50NjRUb0J1ZmZlcihpLCBidWZmZXIpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmFzdEludDMyVG9CdWZmZXJMZWZ0KCkKKy8vIEZhc3RVSW50MzJUb0J1ZmZlckxlZnQoKQorLy8gRmFzdEludDY0VG9CdWZmZXJMZWZ0KCkKKy8vIEZhc3RVSW50NjRUb0J1ZmZlckxlZnQoKQorLy8KKy8vIExpa2UgdGhlIEZhc3QqVG9CdWZmZXIoKSBmdW5jdGlvbnMgYWJvdmUsIHRoZXNlIGFyZSBpbnRlbmRlZCBmb3Igc3BlZWQuCisvLyBVbmxpa2UgdGhlIEZhc3QqVG9CdWZmZXIoKSBmdW5jdGlvbnMsIGhvd2V2ZXIsIHRoZXNlIGZ1bmN0aW9ucyB3cml0ZQorLy8gdGhlaXIgb3V0cHV0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAoaGVuY2UgdGhlIG5hbWUsIGFzIHRoZQorLy8gb3V0cHV0IGlzIGxlZnQtYWxpZ25lZCkuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0CisvLyB0aGUgYnVmZmVyIGhhcyBlbm91Z2ggc3BhY2UgdG8gaG9sZCB0aGUgb3V0cHV0LgorLy8KKy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAoaS5lLiB0aGUgbnVsbCBjaGFyYWN0ZXIKKy8vIHRlcm1pbmF0aW5nIHRoZSBzdHJpbmcpLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQUk9UT0JVRl9FWFBPUlQgY2hhciogRmFzdEludDMyVG9CdWZmZXJMZWZ0KGludDMyX3QgaSwgY2hhciogYnVmZmVyKTsKK1BST1RPQlVGX0VYUE9SVCBjaGFyKiBGYXN0VUludDMyVG9CdWZmZXJMZWZ0KHVpbnQzMl90IGksIGNoYXIqIGJ1ZmZlcik7CitQUk9UT0JVRl9FWFBPUlQgY2hhciogRmFzdEludDY0VG9CdWZmZXJMZWZ0KGludDY0X3QgaSwgY2hhciogYnVmZmVyKTsKK1BST1RPQlVGX0VYUE9SVCBjaGFyKiBGYXN0VUludDY0VG9CdWZmZXJMZWZ0KHVpbnQ2NF90IGksIGNoYXIqIGJ1ZmZlcik7CisKKy8vIEp1c3QgZGVmaW5lIHRoZXNlIGluIHRlcm1zIG9mIHRoZSBhYm92ZS4KK2lubGluZSBjaGFyKiBGYXN0VUludDMyVG9CdWZmZXIodWludDMyX3QgaSwgY2hhciogYnVmZmVyKSB7CisgIEZhc3RVSW50MzJUb0J1ZmZlckxlZnQoaSwgYnVmZmVyKTsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KK2lubGluZSBjaGFyKiBGYXN0VUludDY0VG9CdWZmZXIodWludDY0X3QgaSwgY2hhciogYnVmZmVyKSB7CisgIEZhc3RVSW50NjRUb0J1ZmZlckxlZnQoaSwgYnVmZmVyKTsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIFNpbXBsZUJ0b2EoYm9vbCB2YWx1ZSkgeyByZXR1cm4gdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiOyB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbXBsZUl0b2EoKQorLy8gICAgRGVzY3JpcHRpb246IGNvbnZlcnRzIGFuIGludGVnZXIgdG8gYSBzdHJpbmcuCisvLworLy8gICAgUmV0dXJuIHZhbHVlOiBzdHJpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST1RPQlVGX0VYUE9SVCBzdGQ6OnN0cmluZyBTaW1wbGVJdG9hKGludCBpKTsKK1BST1RPQlVGX0VYUE9SVCBzdGQ6OnN0cmluZyBTaW1wbGVJdG9hKHVuc2lnbmVkIGludCBpKTsKK1BST1RPQlVGX0VYUE9SVCBzdGQ6OnN0cmluZyBTaW1wbGVJdG9hKGxvbmcgaSk7CitQUk9UT0JVRl9FWFBPUlQgc3RkOjpzdHJpbmcgU2ltcGxlSXRvYSh1bnNpZ25lZCBsb25nIGkpOworUFJPVE9CVUZfRVhQT1JUIHN0ZDo6c3RyaW5nIFNpbXBsZUl0b2EobG9uZyBsb25nIGkpOworUFJPVE9CVUZfRVhQT1JUIHN0ZDo6c3RyaW5nIFNpbXBsZUl0b2EodW5zaWduZWQgbG9uZyBsb25nIGkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW1wbGVEdG9hKCkKKy8vIFNpbXBsZUZ0b2EoKQorLy8gRG91YmxlVG9CdWZmZXIoKQorLy8gRmxvYXRUb0J1ZmZlcigpCisvLyAgICBEZXNjcmlwdGlvbjogY29udmVydHMgYSBkb3VibGUgb3IgZmxvYXQgdG8gYSBzdHJpbmcgd2hpY2gsIGlmCisvLyAgICBwYXNzZWQgdG8gTm9Mb2NhbGVTdHJ0b2QoKSwgd2lsbCBwcm9kdWNlIHRoZSBleGFjdCBzYW1lIG9yaWdpbmFsIGRvdWJsZQorLy8gICAgKGV4Y2VwdCBpbiBjYXNlIG9mIE5hTjsgYWxsIE5hTnMgYXJlIGNvbnNpZGVyZWQgdGhlIHNhbWUgdmFsdWUpLgorLy8gICAgV2UgdHJ5IHRvIGtlZXAgdGhlIHN0cmluZyBzaG9ydCBidXQgaXQncyBub3QgZ3VhcmFudGVlZCB0byBiZSBhcworLy8gICAgc2hvcnQgYXMgcG9zc2libGUuCisvLworLy8gICAgRG91YmxlVG9CdWZmZXIoKSBhbmQgRmxvYXRUb0J1ZmZlcigpIHdyaXRlIHRoZSB0ZXh0IHRvIHRoZSBnaXZlbgorLy8gICAgYnVmZmVyIGFuZCByZXR1cm4gaXQuICBUaGUgYnVmZmVyIG11c3QgYmUgYXQgbGVhc3QKKy8vICAgIGtEb3VibGVUb0J1ZmZlclNpemUgYnl0ZXMgZm9yIGRvdWJsZXMgYW5kIGtGbG9hdFRvQnVmZmVyU2l6ZQorLy8gICAgYnl0ZXMgZm9yIGZsb2F0cy4gIGtGYXN0VG9CdWZmZXJTaXplIGlzIGFsc28gZ3VhcmFudGVlZCB0byBiZSBsYXJnZQorLy8gICAgZW5vdWdoIHRvIGhvbGQgZWl0aGVyLgorLy8KKy8vICAgIFJldHVybiB2YWx1ZTogc3RyaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQUk9UT0JVRl9FWFBPUlQgc3RkOjpzdHJpbmcgU2ltcGxlRHRvYShkb3VibGUgdmFsdWUpOworUFJPVE9CVUZfRVhQT1JUIHN0ZDo6c3RyaW5nIFNpbXBsZUZ0b2EoZmxvYXQgdmFsdWUpOworCitQUk9UT0JVRl9FWFBPUlQgY2hhciogRG91YmxlVG9CdWZmZXIoZG91YmxlIGksIGNoYXIqIGJ1ZmZlcik7CitQUk9UT0JVRl9FWFBPUlQgY2hhciogRmxvYXRUb0J1ZmZlcihmbG9hdCBpLCBjaGFyKiBidWZmZXIpOworCisvLyBJbiBwcmFjdGljZSwgZG91YmxlcyBzaG91bGQgbmV2ZXIgbmVlZCBtb3JlIHRoYW4gMjQgYnl0ZXMgYW5kIGZsb2F0cworLy8gc2hvdWxkIG5ldmVyIG5lZWQgbW9yZSB0aGFuIDE0IChpbmNsdWRpbmcgbnVsbCB0ZXJtaW5hdG9ycyksIGJ1dCB3ZQorLy8gb3ZlcmVzdGltYXRlIHRvIGJlIHNhZmUuCitzdGF0aWMgY29uc3QgaW50IGtEb3VibGVUb0J1ZmZlclNpemUgPSAzMjsKK3N0YXRpYyBjb25zdCBpbnQga0Zsb2F0VG9CdWZmZXJTaXplID0gMjQ7CisKK25hbWVzcGFjZSBzdHJpbmdzIHsKKworZW51bSBQYWRTcGVjIHsKKyAgTk9fUEFEID0gMSwKKyAgWkVST19QQURfMiwKKyAgWkVST19QQURfMywKKyAgWkVST19QQURfNCwKKyAgWkVST19QQURfNSwKKyAgWkVST19QQURfNiwKKyAgWkVST19QQURfNywKKyAgWkVST19QQURfOCwKKyAgWkVST19QQURfOSwKKyAgWkVST19QQURfMTAsCisgIFpFUk9fUEFEXzExLAorICBaRVJPX1BBRF8xMiwKKyAgWkVST19QQURfMTMsCisgIFpFUk9fUEFEXzE0LAorICBaRVJPX1BBRF8xNSwKKyAgWkVST19QQURfMTYsCit9OworCitzdHJ1Y3QgSGV4IHsKKyAgdWludDY0X3QgdmFsdWU7CisgIGVudW0gUGFkU3BlYyBzcGVjOworICB0ZW1wbGF0ZSA8Y2xhc3MgSW50PgorICBleHBsaWNpdCBIZXgoSW50IHYsIFBhZFNwZWMgcyA9IE5PX1BBRCkKKyAgICAgIDogc3BlYyhzKSB7CisgICAgLy8gUHJldmVudCBzaWduLWV4dGVuc2lvbiBieSBjYXN0aW5nIGludGVnZXJzIHRvCisgICAgLy8gdGhlaXIgdW5zaWduZWQgY291bnRlcnBhcnRzLgorI2lmZGVmIExBTkdfQ1hYMTEKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBzaXplb2YodikgPT0gMSB8fCBzaXplb2YodikgPT0gMiB8fCBzaXplb2YodikgPT0gNCB8fCBzaXplb2YodikgPT0gOCwKKyAgICAgICAgIlVua25vd24gaW50ZWdlciB0eXBlIik7CisjZW5kaWYKKyAgICB2YWx1ZSA9IHNpemVvZih2KSA9PSAxID8gc3RhdGljX2Nhc3Q8dWludDhfdD4odikKKyAgICAgICAgICA6IHNpemVvZih2KSA9PSAyID8gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHYpCisgICAgICAgICAgOiBzaXplb2YodikgPT0gNCA/IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2KQorICAgICAgICAgIDogc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHYpOworICB9Cit9OworCitzdHJ1Y3QgUFJPVE9CVUZfRVhQT1JUIEFscGhhTnVtIHsKKyAgY29uc3QgY2hhciAqcGllY2VfZGF0YV87ICAvLyBtb3ZlIHRoZXNlIHRvIHN0cmluZ19yZWYgZXZlbnR1YWxseQorICBzaXplX3QgcGllY2Vfc2l6ZV87ICAgICAgIC8vIG1vdmUgdGhlc2UgdG8gc3RyaW5nX3JlZiBldmVudHVhbGx5CisKKyAgY2hhciBkaWdpdHNba0Zhc3RUb0J1ZmZlclNpemVdOworCisgIC8vIE5vIGJvb2wgY3RvciAtLSBib29scyBjb252ZXJ0IHRvIGFuIGludGVncmFsIHR5cGUuCisgIC8vIEEgYm9vbCBjdG9yIHdvdWxkIGFsc28gY29udmVydCBpbmNvbWluZyBwb2ludGVycyAoYmxldGNoKS4KKworICBBbHBoYU51bShpbnQgaTMyKQorICAgICAgOiBwaWVjZV9kYXRhXyhkaWdpdHMpLAorICAgICAgICBwaWVjZV9zaXplXyhGYXN0SW50MzJUb0J1ZmZlckxlZnQoaTMyLCBkaWdpdHMpIC0gJmRpZ2l0c1swXSkge30KKyAgQWxwaGFOdW0odW5zaWduZWQgaW50IHUzMikKKyAgICAgIDogcGllY2VfZGF0YV8oZGlnaXRzKSwKKyAgICAgICAgcGllY2Vfc2l6ZV8oRmFzdFVJbnQzMlRvQnVmZmVyTGVmdCh1MzIsIGRpZ2l0cykgLSAmZGlnaXRzWzBdKSB7fQorICBBbHBoYU51bShsb25nIGxvbmcgaTY0KQorICAgICAgOiBwaWVjZV9kYXRhXyhkaWdpdHMpLAorICAgICAgICBwaWVjZV9zaXplXyhGYXN0SW50NjRUb0J1ZmZlckxlZnQoaTY0LCBkaWdpdHMpIC0gJmRpZ2l0c1swXSkge30KKyAgQWxwaGFOdW0odW5zaWduZWQgbG9uZyBsb25nIHU2NCkKKyAgICAgIDogcGllY2VfZGF0YV8oZGlnaXRzKSwKKyAgICAgICAgcGllY2Vfc2l6ZV8oRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdCh1NjQsIGRpZ2l0cykgLSAmZGlnaXRzWzBdKSB7fQorCisgIC8vIE5vdGU6IG9uIHNvbWUgYXJjaGl0ZWN0dXJlcywgImxvbmciIGlzIG9ubHkgMzIgYml0cywgbm90IDY0LCBidXQgdGhlCisgIC8vIHBlcmZvcm1hbmNlIGhpdCBvZiB1c2luZyBGYXN0SW50NjRUb0J1ZmZlckxlZnQgdG8gaGFuZGxlIDMyLWJpdCB2YWx1ZXMKKyAgLy8gaXMgcXVpdGUgbWlub3IuCisgIEFscGhhTnVtKGxvbmcgaTY0KQorICAgICAgOiBwaWVjZV9kYXRhXyhkaWdpdHMpLAorICAgICAgICBwaWVjZV9zaXplXyhGYXN0SW50NjRUb0J1ZmZlckxlZnQoaTY0LCBkaWdpdHMpIC0gJmRpZ2l0c1swXSkge30KKyAgQWxwaGFOdW0odW5zaWduZWQgbG9uZyB1NjQpCisgICAgICA6IHBpZWNlX2RhdGFfKGRpZ2l0cyksCisgICAgICAgIHBpZWNlX3NpemVfKEZhc3RVSW50NjRUb0J1ZmZlckxlZnQodTY0LCBkaWdpdHMpIC0gJmRpZ2l0c1swXSkge30KKworICBBbHBoYU51bShmbG9hdCBmKQorICAgIDogcGllY2VfZGF0YV8oZGlnaXRzKSwgcGllY2Vfc2l6ZV8oc3RybGVuKEZsb2F0VG9CdWZmZXIoZiwgZGlnaXRzKSkpIHt9CisgIEFscGhhTnVtKGRvdWJsZSBmKQorICAgIDogcGllY2VfZGF0YV8oZGlnaXRzKSwgcGllY2Vfc2l6ZV8oc3RybGVuKERvdWJsZVRvQnVmZmVyKGYsIGRpZ2l0cykpKSB7fQorCisgIEFscGhhTnVtKEhleCBoZXgpOworCisgIEFscGhhTnVtKGNvbnN0IGNoYXIqIGNfc3RyKQorICAgICAgOiBwaWVjZV9kYXRhXyhjX3N0ciksIHBpZWNlX3NpemVfKHN0cmxlbihjX3N0cikpIHt9CisgIC8vIFRPRE86IEFkZCBhIHN0cmluZ19yZWYgY29uc3RydWN0b3IsIGV2ZW50dWFsbHkKKyAgLy8gQWxwaGFOdW0oY29uc3QgU3RyaW5nUGllY2UgJnBjKSA6IHBpZWNlKHBjKSB7fQorCisgIEFscGhhTnVtKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpCisgICAgICA6IHBpZWNlX2RhdGFfKHN0ci5kYXRhKCkpLCBwaWVjZV9zaXplXyhzdHIuc2l6ZSgpKSB7fQorCisgIEFscGhhTnVtKFN0cmluZ1BpZWNlIHN0cikKKyAgICAgIDogcGllY2VfZGF0YV8oc3RyLmRhdGEoKSksIHBpZWNlX3NpemVfKHN0ci5zaXplKCkpIHt9CisKKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBwaWVjZV9zaXplXzsgfQorICBjb25zdCBjaGFyICpkYXRhKCkgY29uc3QgeyByZXR1cm4gcGllY2VfZGF0YV87IH0KKworIHByaXZhdGU6CisgIC8vIFVzZSAiOiIgbm90ICc6JworICBBbHBoYU51bShjaGFyIGMpOyAgLy8gTk9MSU5UKHJ1bnRpbWUvZXhwbGljaXQpCisKKyAgLy8gRGlzYWxsb3cgY29weSBhbmQgYXNzaWduLgorICBBbHBoYU51bShjb25zdCBBbHBoYU51bSYpOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBBbHBoYU51bSYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHN0cmluZ3MKKwordXNpbmcgc3RyaW5nczo6QWxwaGFOdW07CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0ckNhdCgpCisvLyAgICBUaGlzIG1lcmdlcyB0aGUgZ2l2ZW4gc3RyaW5ncyBvciBudW1iZXJzLCB3aXRoIG5vIGRlbGltaXRlci4gIFRoaXMKKy8vICAgIGlzIGRlc2lnbmVkIHRvIGJlIHRoZSBmYXN0ZXN0IHBvc3NpYmxlIHdheSB0byBjb25zdHJ1Y3QgYSBzdHJpbmcgb3V0CisvLyAgICBvZiBhIG1peCBvZiByYXcgQyBzdHJpbmdzLCBzdHJpbmdzLCBib29sIHZhbHVlcywKKy8vICAgIGFuZCBudW1lcmljIHZhbHVlcy4KKy8vCisvLyAgICBEb24ndCB1c2UgdGhpcyBmb3IgdXNlci12aXNpYmxlIHN0cmluZ3MuICBUaGUgbG9jYWxpemF0aW9uIHByb2Nlc3MKKy8vICAgIHdvcmtzIHBvb3JseSBvbiBzdHJpbmdzIGJ1aWx0IHVwIG91dCBvZiBmcmFnbWVudHMuCisvLworLy8gICAgRm9yIGNsYXJpdHkgYW5kIHBlcmZvcm1hbmNlLCBkb24ndCB1c2UgU3RyQ2F0IHdoZW4gYXBwZW5kaW5nIHRvIGEKKy8vICAgIHN0cmluZy4gIEluIHBhcnRpY3VsYXIsIGF2b2lkIHVzaW5nIGFueSBvZiB0aGVzZSAoYW50aS0pcGF0dGVybnM6CisvLyAgICAgIHN0ci5hcHBlbmQoU3RyQ2F0KC4uLikKKy8vICAgICAgc3RyICs9IFN0ckNhdCguLi4pCisvLyAgICAgIHN0ciA9IFN0ckNhdChzdHIsIC4uLikKKy8vICAgIHdoZXJlIHRoZSBsYXN0IGlzIHRoZSB3b3JzZSwgd2l0aCB0aGUgcG90ZW50aWFsIHRvIGNoYW5nZSBhIGxvb3AKKy8vICAgIGZyb20gYSBsaW5lYXIgdGltZSBvcGVyYXRpb24gd2l0aCBPKDEpIGR5bmFtaWMgYWxsb2NhdGlvbnMgaW50byBhCisvLyAgICBxdWFkcmF0aWMgdGltZSBvcGVyYXRpb24gd2l0aCBPKG4pIGR5bmFtaWMgYWxsb2NhdGlvbnMuICBTdHJBcHBlbmQKKy8vICAgIGlzIGEgYmV0dGVyIGNob2ljZSB0aGFuIGFueSBvZiB0aGUgYWJvdmUsIHN1YmplY3QgdG8gdGhlIHJlc3RyaWN0aW9uCisvLyAgICBvZiBTdHJBcHBlbmQoJnN0ciwgYSwgYiwgYywgLi4uKSB0aGF0IG5vbmUgb2YgdGhlIGEsIGIsIGMsIC4uLiBtYXkKKy8vICAgIGJlIGEgcmVmZXJlbmNlIGludG8gc3RyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQUk9UT0JVRl9FWFBPUlQgc3RkOjpzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtJiBhLCBjb25zdCBBbHBoYU51bSYgYik7CitQUk9UT0JVRl9FWFBPUlQgc3RkOjpzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtJiBhLCBjb25zdCBBbHBoYU51bSYgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGMpOworUFJPVE9CVUZfRVhQT1JUIHN0ZDo6c3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSYgYSwgY29uc3QgQWxwaGFOdW0mIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBjLCBjb25zdCBBbHBoYU51bSYgZCk7CitQUk9UT0JVRl9FWFBPUlQgc3RkOjpzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtJiBhLCBjb25zdCBBbHBoYU51bSYgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGMsIGNvbnN0IEFscGhhTnVtJiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgZSk7CitQUk9UT0JVRl9FWFBPUlQgc3RkOjpzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtJiBhLCBjb25zdCBBbHBoYU51bSYgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGMsIGNvbnN0IEFscGhhTnVtJiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgZSwgY29uc3QgQWxwaGFOdW0mIGYpOworUFJPVE9CVUZfRVhQT1JUIHN0ZDo6c3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSYgYSwgY29uc3QgQWxwaGFOdW0mIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBjLCBjb25zdCBBbHBoYU51bSYgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGUsIGNvbnN0IEFscGhhTnVtJiBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgZyk7CitQUk9UT0JVRl9FWFBPUlQgc3RkOjpzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtJiBhLCBjb25zdCBBbHBoYU51bSYgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGMsIGNvbnN0IEFscGhhTnVtJiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgZSwgY29uc3QgQWxwaGFOdW0mIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBnLCBjb25zdCBBbHBoYU51bSYgaCk7CitQUk9UT0JVRl9FWFBPUlQgc3RkOjpzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtJiBhLCBjb25zdCBBbHBoYU51bSYgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGMsIGNvbnN0IEFscGhhTnVtJiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgZSwgY29uc3QgQWxwaGFOdW0mIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBnLCBjb25zdCBBbHBoYU51bSYgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGkpOworCitpbmxpbmUgc3RkOjpzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtJiBhKSB7CisgIHJldHVybiBzdGQ6OnN0cmluZyhhLmRhdGEoKSwgYS5zaXplKCkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdHJBcHBlbmQoKQorLy8gICAgU2FtZSBhcyBhYm92ZSwgYnV0IGFkZHMgdGhlIG91dHB1dCB0byB0aGUgZ2l2ZW4gc3RyaW5nLgorLy8gICAgV0FSTklORzogRm9yIHNwZWVkLCBTdHJBcHBlbmQgZG9lcyBub3QgdHJ5IHRvIGNoZWNrIGVhY2ggb2YgaXRzIGlucHV0CisvLyAgICBhcmd1bWVudHMgdG8gYmUgc3VyZSB0aGF0IHRoZXkgYXJlIG5vdCBhIHN1YnNldCBvZiB0aGUgc3RyaW5nIGJlaW5nCisvLyAgICBhcHBlbmRlZCB0by4gIFRoYXQgaXMsIHdoaWxlIHRoaXMgd2lsbCB3b3JrOgorLy8KKy8vICAgIHN0cmluZyBzID0gImZvbyI7CisvLyAgICBzICs9IHM7CisvLworLy8gICAgVGhpcyB3aWxsIG5vdCAobmVjZXNzYXJpbHkpIHdvcms6CisvLworLy8gICAgc3RyaW5nIHMgPSAiZm9vIjsKKy8vICAgIFN0ckFwcGVuZCgmcywgcyk7CisvLworLy8gICAgTm90ZTogd2hpbGUgU3RyQ2F0IHN1cHBvcnRzIGFwcGVuZGluZyB1cCB0byA5IGFyZ3VtZW50cywgU3RyQXBwZW5kCisvLyAgICBpcyBjdXJyZW50bHkgbGltaXRlZCB0byA0LiAgVGhhdCdzIHJhcmVseSBhbiBpc3N1ZSBleGNlcHQgd2hlbgorLy8gICAgYXV0b21hdGljYWxseSB0cmFuc2Zvcm1pbmcgU3RyQ2F0IHRvIFN0ckFwcGVuZCwgYW5kIGNhbiBlYXNpbHkgYmUKKy8vICAgIHdvcmtlZCBhcm91bmQgYXMgY29uc2VjdXRpdmUgY2FsbHMgdG8gU3RyQXBwZW5kIGFyZSBxdWl0ZSBlZmZpY2llbnQuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BST1RPQlVGX0VYUE9SVCB2b2lkIFN0ckFwcGVuZChzdGQ6OnN0cmluZyogZGVzdCwgY29uc3QgQWxwaGFOdW0mIGEpOworUFJPVE9CVUZfRVhQT1JUIHZvaWQgU3RyQXBwZW5kKHN0ZDo6c3RyaW5nKiBkZXN0LCBjb25zdCBBbHBoYU51bSYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgYik7CitQUk9UT0JVRl9FWFBPUlQgdm9pZCBTdHJBcHBlbmQoc3RkOjpzdHJpbmcqIGRlc3QsIGNvbnN0IEFscGhhTnVtJiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBiLCBjb25zdCBBbHBoYU51bSYgYyk7CitQUk9UT0JVRl9FWFBPUlQgdm9pZCBTdHJBcHBlbmQoc3RkOjpzdHJpbmcqIGRlc3QsIGNvbnN0IEFscGhhTnVtJiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBiLCBjb25zdCBBbHBoYU51bSYgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgZCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEpvaW4oKQorLy8gICAgVGhlc2UgbWV0aG9kcyBjb25jYXRlbmF0ZSBhIHJhbmdlIG9mIGNvbXBvbmVudHMgaW50byBhIEMrKyBzdHJpbmcsIHVzaW5nCisvLyAgICB0aGUgQy1zdHJpbmcgImRlbGltIiBhcyBhIHNlcGFyYXRvciBiZXR3ZWVuIGNvbXBvbmVudHMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+Cit2b2lkIEpvaW4oSXRlcmF0b3Igc3RhcnQsIEl0ZXJhdG9yIGVuZCwgY29uc3QgY2hhciogZGVsaW0sCisgICAgICAgICAgc3RkOjpzdHJpbmcqIHJlc3VsdCkgeworICBmb3IgKEl0ZXJhdG9yIGl0ID0gc3RhcnQ7IGl0ICE9IGVuZDsgKytpdCkgeworICAgIGlmIChpdCAhPSBzdGFydCkgeworICAgICAgcmVzdWx0LT5hcHBlbmQoZGVsaW0pOworICAgIH0KKyAgICBTdHJBcHBlbmQocmVzdWx0LCAqaXQpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSYW5nZT4KK3N0ZDo6c3RyaW5nIEpvaW4oY29uc3QgUmFuZ2UmIGNvbXBvbmVudHMsIGNvbnN0IGNoYXIqIGRlbGltKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgSm9pbihjb21wb25lbnRzLmJlZ2luKCksIGNvbXBvbmVudHMuZW5kKCksIGRlbGltLCAmcmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVG9IZXgoKQorLy8gICAgUmV0dXJuIGEgbG93ZXItY2FzZSBoZXggc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBpbnRlZ2VyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUFJPVE9CVUZfRVhQT1JUIHN0ZDo6c3RyaW5nIFRvSGV4KHVpbnQ2NF90IG51bSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdsb2JhbFJlcGxhY2VTdWJzdHJpbmcoKQorLy8gICAgUmVwbGFjZXMgYWxsIGluc3RhbmNlcyBvZiBhIHN1YnN0cmluZyBpbiBhIHN0cmluZy4gIERvZXMgbm90aGluZworLy8gICAgaWYgJ3N1YnN0cmluZycgaXMgZW1wdHkuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVwbGFjZW1lbnRzLgorLy8KKy8vICAgIE5PVEU6IFRoZSBzdHJpbmcgcGllY2VzIG11c3Qgbm90IG92ZXJsYXAgcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST1RPQlVGX0VYUE9SVCBpbnQgR2xvYmFsUmVwbGFjZVN1YnN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3Vic3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXBsYWNlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogcyk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJhc2U2NFVuZXNjYXBlKCkKKy8vICAgIENvbnZlcnRzICJzcmMiIHdoaWNoIGlzIGVuY29kZWQgaW4gQmFzZTY0IHRvIGl0cyBiaW5hcnkgZXF1aXZhbGVudCBhbmQKKy8vICAgIHdyaXRlcyBpdCB0byAiZGVzdCIuIElmIHNyYyBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMsIGRlc3QgaXMgY2xlYXJlZAorLy8gICAgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLiBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST1RPQlVGX0VYUE9SVCBib29sIEJhc2U2NFVuZXNjYXBlKFN0cmluZ1BpZWNlIHNyYywgc3RkOjpzdHJpbmcqIGRlc3QpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJTYWZlQmFzZTY0VW5lc2NhcGUoKQorLy8gICAgVGhpcyBpcyBhIHZhcmlhdGlvbiBvZiBCYXNlNjRVbmVzY2FwZSB3aGljaCB1c2VzICctJyBpbnN0ZWFkIG9mICcrJywgYW5kCisvLyAgICAnXycgaW5zdGVhZCBvZiAnLycuIHNyYyBpcyBub3QgbnVsbCB0ZXJtaW5hdGVkLCBpbnN0ZWFkIHNwZWNpZnkgbGVuLiBJCisvLyAgICByZWNvbW1lbmQgdGhhdCBzbGVuPHN6ZGVzdCwgYnV0IHdlIGhvbm9yIHN6ZGVzdCBhbnl3YXkuCisvLyAgICBSRVRVUk5TIHRoZSBsZW5ndGggb2YgZGVzdCwgb3IgLTEgaWYgc3JjIGNvbnRhaW5zIGludmFsaWQgY2hhcnMuCisKKy8vICAgIFRoZSB2YXJpYXRpb24gdGhhdCBzdG9yZXMgaW50byBhIHN0cmluZyBjbGVhcnMgdGhlIHN0cmluZyBmaXJzdCwgYW5kCisvLyAgICByZXR1cm5zIGZhbHNlICh3aXRoIGRlc3QgZW1wdHkpIGlmIHNyYyBjb250YWlucyBpbnZhbGlkIGNoYXJzOyBmb3IKKy8vICAgIHRoaXMgdmVyc2lvbiBzcmMgYW5kIGRlc3QgbXVzdCBiZSBkaWZmZXJlbnQgc3RyaW5ncy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST1RPQlVGX0VYUE9SVCBpbnQgV2ViU2FmZUJhc2U2NFVuZXNjYXBlKGNvbnN0IGNoYXIqIHNyYywgaW50IHNsZW4sIGNoYXIqIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3pkZXN0KTsKK1BST1RPQlVGX0VYUE9SVCBib29sIFdlYlNhZmVCYXNlNjRVbmVzY2FwZShTdHJpbmdQaWVjZSBzcmMsIHN0ZDo6c3RyaW5nKiBkZXN0KTsKKworLy8gUmV0dXJuIHRoZSBsZW5ndGggdG8gdXNlIGZvciB0aGUgb3V0cHV0IGJ1ZmZlciBnaXZlbiB0byB0aGUgYmFzZTY0IGVzY2FwZQorLy8gcm91dGluZXMuIE1ha2Ugc3VyZSB0byB1c2UgdGhlIHNhbWUgdmFsdWUgZm9yIGRvX3BhZGRpbmcgaW4gYm90aC4KKy8vIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBpbmNvcnJlY3QgcmVzdWx0cyBpZiBnaXZlbiBpbnB1dF9sZW4gdmFsdWVzIHRoYXQKKy8vIGFyZSBleHRyZW1lbHkgaGlnaCwgd2hpY2ggc2hvdWxkIGhhcHBlbiByYXJlbHkuCitQUk9UT0JVRl9FWFBPUlQgaW50IENhbGN1bGF0ZUJhc2U2NEVzY2FwZWRMZW4oaW50IGlucHV0X2xlbiwgYm9vbCBkb19wYWRkaW5nKTsKKy8vIFVzZSB0aGlzIHZlcnNpb24gd2hlbiBjYWxsaW5nIEJhc2U2NEVzY2FwZSB3aXRob3V0IGEgZG9fcGFkZGluZyBhcmcuCitQUk9UT0JVRl9FWFBPUlQgaW50IENhbGN1bGF0ZUJhc2U2NEVzY2FwZWRMZW4oaW50IGlucHV0X2xlbik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJhc2U2NEVzY2FwZSgpCisvLyBXZWJTYWZlQmFzZTY0RXNjYXBlKCkKKy8vICAgIEVuY29kZSAic3JjIiB0byAiZGVzdCIgdXNpbmcgYmFzZTY0IGVuY29kaW5nLgorLy8gICAgc3JjIGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQsIGluc3RlYWQgc3BlY2lmeSBsZW4uCisvLyAgICAnZGVzdCcgc2hvdWxkIGhhdmUgYXQgbGVhc3QgQ2FsY3VsYXRlQmFzZTY0RXNjYXBlZExlbigpIGxlbmd0aC4KKy8vICAgIFJFVFVSTlMgdGhlIGxlbmd0aCBvZiBkZXN0LgorLy8gICAgVGhlIFdlYlNhZmUgdmFyaWF0aW9uIHVzZSAnLScgaW5zdGVhZCBvZiAnKycgYW5kICdfJyBpbnN0ZWFkIG9mICcvJworLy8gICAgc28gdGhhdCB3ZSBjYW4gcGxhY2UgdGhlIG91dCBpbiB0aGUgVVJMIG9yIGNvb2tpZXMgd2l0aG91dCBoYXZpbmcKKy8vICAgIHRvIGVzY2FwZSB0aGVtLiAgSXQgYWxzbyBoYXMgYW4gZXh0cmEgcGFyYW1ldGVyICJkb19wYWRkaW5nIiwKKy8vICAgIHdoaWNoIHdoZW4gc2V0IHRvIGZhbHNlIHdpbGwgcHJldmVudCBwYWRkaW5nIHdpdGggIj0iLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUFJPVE9CVUZfRVhQT1JUIGludCBCYXNlNjRFc2NhcGUoY29uc3QgdW5zaWduZWQgY2hhciogc3JjLCBpbnQgc2xlbiwgY2hhciogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzemRlc3QpOworUFJPVE9CVUZfRVhQT1JUIGludCBXZWJTYWZlQmFzZTY0RXNjYXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYywgaW50IHNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZGVzdCwgaW50IHN6ZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvX3BhZGRpbmcpOworLy8gRW5jb2RlIHNyYyBpbnRvIGRlc3Qgd2l0aCBwYWRkaW5nLgorUFJPVE9CVUZfRVhQT1JUIHZvaWQgQmFzZTY0RXNjYXBlKFN0cmluZ1BpZWNlIHNyYywgc3RkOjpzdHJpbmcqIGRlc3QpOworLy8gRW5jb2RlIHNyYyBpbnRvIGRlc3Qgd2ViLXNhZmVseSB3aXRob3V0IHBhZGRpbmcuCitQUk9UT0JVRl9FWFBPUlQgdm9pZCBXZWJTYWZlQmFzZTY0RXNjYXBlKFN0cmluZ1BpZWNlIHNyYywgc3RkOjpzdHJpbmcqIGRlc3QpOworLy8gRW5jb2RlIHNyYyBpbnRvIGRlc3Qgd2ViLXNhZmVseSB3aXRoIHBhZGRpbmcuCitQUk9UT0JVRl9FWFBPUlQgdm9pZCBXZWJTYWZlQmFzZTY0RXNjYXBlV2l0aFBhZGRpbmcoU3RyaW5nUGllY2Ugc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBkZXN0KTsKKworUFJPVE9CVUZfRVhQT1JUIHZvaWQgQmFzZTY0RXNjYXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYywgaW50IHN6c3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBkZXN0LCBib29sIGRvX3BhZGRpbmcpOworUFJPVE9CVUZfRVhQT1JUIHZvaWQgV2ViU2FmZUJhc2U2NEVzY2FwZShjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmMsIGludCBzenNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGRlc3QsIGJvb2wgZG9fcGFkZGluZyk7CisKK2lubGluZSBib29sIElzVmFsaWRDb2RlUG9pbnQodWludDMyX3QgY29kZV9wb2ludCkgeworICByZXR1cm4gY29kZV9wb2ludCA8IDB4RDgwMCB8fAorICAgICAgICAgKGNvZGVfcG9pbnQgPj0gMHhFMDAwICYmIGNvZGVfcG9pbnQgPD0gMHgxMEZGRkYpOworfQorCitzdGF0aWMgY29uc3QgaW50IFVURm1heCA9IDQ7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbmNvZGVBc1VURjhDaGFyKCkKKy8vICBIZWxwZXIgdG8gYXBwZW5kIGEgVW5pY29kZSBjb2RlIHBvaW50IHRvIGEgc3RyaW5nIGFzIFVURjgsIHdpdGhvdXQgYnJpbmdpbmcKKy8vICBpbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLiBUaGUgb3V0cHV0IGJ1ZmZlciBtdXN0IGJlIGFzIGxlYXN0IDQgYnl0ZXMKKy8vICBsYXJnZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST1RPQlVGX0VYUE9SVCBpbnQgRW5jb2RlQXNVVEY4Q2hhcih1aW50MzJfdCBjb2RlX3BvaW50LCBjaGFyKiBvdXRwdXQpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVVEY4Rmlyc3RMZXR0ZXJOdW1CeXRlcygpCisvLyAgIExlbmd0aCBvZiB0aGUgZmlyc3QgVVRGLTggY2hhcmFjdGVyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUFJPVE9CVUZfRVhQT1JUIGludCBVVEY4Rmlyc3RMZXR0ZXJOdW1CeXRlcyhjb25zdCBjaGFyKiBzcmMsIGludCBsZW4pOworCisvLyBGcm9tIGdvb2dsZTMvdGhpcmRfcGFydHkvYWJzbC9zdHJpbmdzL2VzY2FwaW5nLmgKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xlYW5TdHJpbmdMaW5lRW5kaW5ncygpCisvLyAgIENsZWFuIHVwIGEgbXVsdGktbGluZSBzdHJpbmcgdG8gY29uZm9ybSB0byBVbml4IGxpbmUgZW5kaW5ncy4KKy8vICAgUmVhZHMgZnJvbSBzcmMgYW5kIGFwcGVuZHMgdG8gZHN0LCBzbyB1c3VhbGx5IGRzdCBzaG91bGQgYmUgZW1wdHkuCisvLworLy8gICBJZiB0aGVyZSBpcyBubyBsaW5lIGVuZGluZyBhdCB0aGUgZW5kIG9mIGEgbm9uLWVtcHR5IHN0cmluZywgaXQgY2FuCisvLyAgIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuCisvLworLy8gICBGb3VyIGRpZmZlcmVudCB0eXBlcyBvZiBpbnB1dCBhcmUgY29ycmVjdGx5IGhhbmRsZWQ6CisvLworLy8gICAgIC0gVW5peC9MaW51eCBmaWxlczogbGluZSBlbmRpbmcgaXMgTEY6IHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQKKy8vCisvLyAgICAgLSBET1MvV2luZG93cyBmaWxlczogbGluZSBlbmRpbmcgaXMgQ1JMRjogY29udmVydCB0byBMRgorLy8KKy8vICAgICAtIExlZ2FjeSBNYWMgZmlsZXM6IGxpbmUgZW5kaW5nIGlzIENSOiBjb252ZXJ0IHRvIExGCisvLworLy8gICAgIC0gR2FyYmxlZCBmaWxlczogcmFuZG9tIGxpbmUgZW5kaW5nczogY29udmVydCBncmFjZWZ1bGx5CisvLyAgICAgICAgICAgICAgICAgICAgICBsb25lbHkgQ1IsIGxvbmVseSBMRiwgQ1JMRjogY29udmVydCB0byBMRgorLy8KKy8vICAgQHBhcmFtIHNyYyBUaGUgbXVsdGktbGluZSBzdHJpbmcgdG8gY29udmVydAorLy8gICBAcGFyYW0gZHN0IFRoZSBjb252ZXJ0ZWQgc3RyaW5nIGlzIGFwcGVuZGVkIHRvIHRoaXMgc3RyaW5nCisvLyAgIEBwYXJhbSBhdXRvX2VuZF9sYXN0X2xpbmUgQXV0b21hdGljYWxseSB0ZXJtaW5hdGUgdGhlIGxhc3QgbGluZQorLy8KKy8vICAgTGltaXRhdGlvbnM6CisvLworLy8gICAgIFRoaXMgZG9lcyBub3QgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBDUkNSTEYgZmlsZXMgY3JlYXRlZCBieQorLy8gICAgIGJyb2tlbiBwcm9ncmFtcyB0aGF0IGRvIGFub3RoZXIgVW5peC0+RE9TIGNvbnZlcnNpb24gb24gZmlsZXMKKy8vICAgICB0aGF0IGFyZSBhbHJlYWR5IGluIENSTEYgZm9ybWF0LiAgRm9yIHRoaXMsIGEgdHdvLXBhc3MgYXBwcm9hY2gKKy8vICAgICBicnV0ZS1mb3JjZSB3b3VsZCBiZSBuZWVkZWQgdGhhdAorLy8KKy8vICAgICAgICgxKSBkZXRlcm1pbmVzIHRoZSBwcmVzZW5jZSBvZiBMRiAoZmlyc3Qgb25lIGlzIG9rKQorLy8gICAgICAgKDIpIGlmIHllcywgcmVtb3ZlcyBhbnkgQ1IsIGVsc2UgY29udmVydCBldmVyeSBDUiB0byBMRgorUFJPVE9CVUZfRVhQT1JUIHZvaWQgQ2xlYW5TdHJpbmdMaW5lRW5kaW5ncyhjb25zdCBzdGQ6OnN0cmluZyYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1dG9fZW5kX2xhc3RfbGluZSk7CisKKy8vIFNhbWUgYXMgYWJvdmUsIGJ1dCB0cmFuc2Zvcm1zIHRoZSBhcmd1bWVudCBpbiBwbGFjZS4KK1BST1RPQlVGX0VYUE9SVCB2b2lkIENsZWFuU3RyaW5nTGluZUVuZGluZ3Moc3RkOjpzdHJpbmcqIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvX2VuZF9sYXN0X2xpbmUpOworCituYW1lc3BhY2Ugc3RyaW5ncyB7CitpbmxpbmUgYm9vbCBFbmRzV2l0aChTdHJpbmdQaWVjZSB0ZXh0LCBTdHJpbmdQaWVjZSBzdWZmaXgpIHsKKyAgcmV0dXJuIHN1ZmZpeC5lbXB0eSgpIHx8CisgICAgICAodGV4dC5zaXplKCkgPj0gc3VmZml4LnNpemUoKSAmJgorICAgICAgIG1lbWNtcCh0ZXh0LmRhdGEoKSArICh0ZXh0LnNpemUoKSAtIHN1ZmZpeC5zaXplKCkpLCBzdWZmaXguZGF0YSgpLAorICAgICAgICAgICAgICBzdWZmaXguc2l6ZSgpKSA9PSAwKTsKK30KK30gIC8vIG5hbWVzcGFjZSBzdHJpbmdzCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEEgbG9jYWxlLWluZGVwZW5kZW50IHZlcnNpb24gb2YgdGhlIHN0YW5kYXJkIHN0cnRvZCgpLCB3aGljaCBhbHdheXMKKy8vIHVzZXMgYSBkb3QgYXMgdGhlIGRlY2ltYWwgc2VwYXJhdG9yLgorZG91YmxlIE5vTG9jYWxlU3RydG9kKGNvbnN0IGNoYXIqIHN0ciwgY2hhcioqIGVuZHB0cik7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RSVVRJTF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI5NTU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsODg0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworI2luY2x1ZGUgPGxvY2FsZS5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHsKKworLy8gVE9ETyhrZW50b24pOiAgQ29weSBzdHJ1dGlsIHRlc3RzIGZyb20gZ29vZ2xlMz8KKworVEVTVChTdHJpbmdVdGlsaXR5VGVzdCwgSW1tdW5lVG9Mb2NhbGVzKSB7CisgIC8vIFJlbWVtYmVyIHRoZSBvbGQgbG9jYWxlLgorICBjaGFyKiBvbGRfbG9jYWxlX2NzdHIgPSBzZXRsb2NhbGUoTENfTlVNRVJJQywgbnVsbHB0cik7CisgIEFTU0VSVF9UUlVFKG9sZF9sb2NhbGVfY3N0ciAhPSBudWxscHRyKTsKKyAgc3RkOjpzdHJpbmcgb2xkX2xvY2FsZSA9IG9sZF9sb2NhbGVfY3N0cjsKKworICAvLyBTZXQgdGhlIGxvY2FsZSB0byAiQyIuCisgIEFTU0VSVF9UUlVFKHNldGxvY2FsZShMQ19OVU1FUklDLCAiQyIpICE9IG51bGxwdHIpOworCisgIEVYUEVDVF9FUSgiMS41IiwgU2ltcGxlRHRvYSgxLjUpKTsKKyAgRVhQRUNUX0VRKCIxLjUiLCBTaW1wbGVGdG9hKDEuNSkpOworCisgIGlmIChzZXRsb2NhbGUoTENfTlVNRVJJQywgImVzX0VTIikgPT0gbnVsbHB0ciAmJgorICAgICAgc2V0bG9jYWxlKExDX05VTUVSSUMsICJlc19FUy51dGY4IikgPT0gbnVsbHB0cikgeworICAgIC8vIFNvbWUgc3lzdGVtcyBtYXkgbm90IGhhdmUgdGhlIGRlc2lyZWQgbG9jYWxlIGF2YWlsYWJsZS4KKyAgICBHT09HTEVfTE9HKFdBUk5JTkcpCisgICAgICA8PCAiQ291bGRuJ3Qgc2V0IGxvY2FsZSB0byBlc19FUy4gIFNraXBwaW5nIHRoaXMgdGVzdC4iOworICB9IGVsc2UgeworICAgIEVYUEVDVF9FUSgiMS41IiwgU2ltcGxlRHRvYSgxLjUpKTsKKyAgICBFWFBFQ1RfRVEoIjEuNSIsIFNpbXBsZUZ0b2EoMS41KSk7CisgIH0KKworICAvLyBSZXR1cm4gdG8gb3JpZ2luYWwgbG9jYWxlLgorICBzZXRsb2NhbGUoTENfTlVNRVJJQywgb2xkX2xvY2FsZS5jX3N0cigpKTsKK30KKworI2RlZmluZSBFWFBFQ1RfRVFfQVJSQVkobGVuLCB4LCB5LCBtc2cpICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgKytqKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVYUEVDVF9FUSh4W2pdLCB5W2pdKSA8PCAiIiAjIHggPDwgIiAhPSAiICMgeSAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGJ5dGUgIiA8PCBqIDw8ICI6ICIgPDwgbXNnOyAgXAorICB9CisKK3N0YXRpYyBzdHJ1Y3QgeworICBpbnQgcGxhaW5fbGVuZ3RoOworICBjb25zdCBjaGFyKiBwbGFpbnRleHQ7CisgIGNvbnN0IGNoYXIqIGNpcGhlcnRleHQ7Cit9IGJhc2U2NF90ZXN0c1tdID0geworICAvLyBFbXB0eSBzdHJpbmcuCisgIHsgMCwgIiIsICIifSwKKworICAvLyBCYXNpYyBiaXQgcGF0dGVybnM7CisgIC8vIHZhbHVlcyBvYnRhaW5lZCB3aXRoICJlY2hvIC1uICcuLi4nIHwgdXVlbmNvZGUgLW0gdGVzdCIKKworICB7IDEsICJcMDAwIiwgIkFBPT0iIH0sCisgIHsgMSwgIlwwMDEiLCAiQVE9PSIgfSwKKyAgeyAxLCAiXDAwMiIsICJBZz09IiB9LAorICB7IDEsICJcMDA0IiwgIkJBPT0iIH0sCisgIHsgMSwgIlwwMTAiLCAiQ0E9PSIgfSwKKyAgeyAxLCAiXDAyMCIsICJFQT09IiB9LAorICB7IDEsICJcMDQwIiwgIklBPT0iIH0sCisgIHsgMSwgIlwxMDAiLCAiUUE9PSIgfSwKKyAgeyAxLCAiXDIwMCIsICJnQT09IiB9LAorCisgIHsgMSwgIlwzNzciLCAiL3c9PSIgfSwKKyAgeyAxLCAiXDM3NiIsICIvZz09IiB9LAorICB7IDEsICJcMzc1IiwgIi9RPT0iIH0sCisgIHsgMSwgIlwzNzMiLCAiK3c9PSIgfSwKKyAgeyAxLCAiXDM2NyIsICI5dz09IiB9LAorICB7IDEsICJcMzU3IiwgIjd3PT0iIH0sCisgIHsgMSwgIlwzMzciLCAiM3c9PSIgfSwKKyAgeyAxLCAiXDI3NyIsICJ2dz09IiB9LAorICB7IDEsICJcMTc3IiwgImZ3PT0iIH0sCisgIHsgMiwgIlwwMDBcMDAwIiwgIkFBQT0iIH0sCisgIHsgMiwgIlwwMDBcMDAxIiwgIkFBRT0iIH0sCisgIHsgMiwgIlwwMDBcMDAyIiwgIkFBST0iIH0sCisgIHsgMiwgIlwwMDBcMDA0IiwgIkFBUT0iIH0sCisgIHsgMiwgIlwwMDBcMDEwIiwgIkFBZz0iIH0sCisgIHsgMiwgIlwwMDBcMDIwIiwgIkFCQT0iIH0sCisgIHsgMiwgIlwwMDBcMDQwIiwgIkFDQT0iIH0sCisgIHsgMiwgIlwwMDBcMTAwIiwgIkFFQT0iIH0sCisgIHsgMiwgIlwwMDBcMjAwIiwgIkFJQT0iIH0sCisgIHsgMiwgIlwwMDFcMDAwIiwgIkFRQT0iIH0sCisgIHsgMiwgIlwwMDJcMDAwIiwgIkFnQT0iIH0sCisgIHsgMiwgIlwwMDRcMDAwIiwgIkJBQT0iIH0sCisgIHsgMiwgIlwwMTBcMDAwIiwgIkNBQT0iIH0sCisgIHsgMiwgIlwwMjBcMDAwIiwgIkVBQT0iIH0sCisgIHsgMiwgIlwwNDBcMDAwIiwgIklBQT0iIH0sCisgIHsgMiwgIlwxMDBcMDAwIiwgIlFBQT0iIH0sCisgIHsgMiwgIlwyMDBcMDAwIiwgImdBQT0iIH0sCisKKyAgeyAyLCAiXDM3N1wzNzciLCAiLy84PSIgfSwKKyAgeyAyLCAiXDM3N1wzNzYiLCAiLy80PSIgfSwKKyAgeyAyLCAiXDM3N1wzNzUiLCAiLy8wPSIgfSwKKyAgeyAyLCAiXDM3N1wzNzMiLCAiLy9zPSIgfSwKKyAgeyAyLCAiXDM3N1wzNjciLCAiLy9jPSIgfSwKKyAgeyAyLCAiXDM3N1wzNTciLCAiLys4PSIgfSwKKyAgeyAyLCAiXDM3N1wzMzciLCAiLzk4PSIgfSwKKyAgeyAyLCAiXDM3N1wyNzciLCAiLzc4PSIgfSwKKyAgeyAyLCAiXDM3N1wxNzciLCAiLzM4PSIgfSwKKyAgeyAyLCAiXDM3NlwzNzciLCAiL3Y4PSIgfSwKKyAgeyAyLCAiXDM3NVwzNzciLCAiL2Y4PSIgfSwKKyAgeyAyLCAiXDM3M1wzNzciLCAiKy84PSIgfSwKKyAgeyAyLCAiXDM2N1wzNzciLCAiOS84PSIgfSwKKyAgeyAyLCAiXDM1N1wzNzciLCAiNy84PSIgfSwKKyAgeyAyLCAiXDMzN1wzNzciLCAiMy84PSIgfSwKKyAgeyAyLCAiXDI3N1wzNzciLCAidi84PSIgfSwKKyAgeyAyLCAiXDE3N1wzNzciLCAiZi84PSIgfSwKKworICB7IDMsICJcMDAwXDAwMFwwMDAiLCAiQUFBQSIgfSwKKyAgeyAzLCAiXDAwMFwwMDBcMDAxIiwgIkFBQUIiIH0sCisgIHsgMywgIlwwMDBcMDAwXDAwMiIsICJBQUFDIiB9LAorICB7IDMsICJcMDAwXDAwMFwwMDQiLCAiQUFBRSIgfSwKKyAgeyAzLCAiXDAwMFwwMDBcMDEwIiwgIkFBQUkiIH0sCisgIHsgMywgIlwwMDBcMDAwXDAyMCIsICJBQUFRIiB9LAorICB7IDMsICJcMDAwXDAwMFwwNDAiLCAiQUFBZyIgfSwKKyAgeyAzLCAiXDAwMFwwMDBcMTAwIiwgIkFBQkEiIH0sCisgIHsgMywgIlwwMDBcMDAwXDIwMCIsICJBQUNBIiB9LAorICB7IDMsICJcMDAwXDAwMVwwMDAiLCAiQUFFQSIgfSwKKyAgeyAzLCAiXDAwMFwwMDJcMDAwIiwgIkFBSUEiIH0sCisgIHsgMywgIlwwMDBcMDA0XDAwMCIsICJBQVFBIiB9LAorICB7IDMsICJcMDAwXDAxMFwwMDAiLCAiQUFnQSIgfSwKKyAgeyAzLCAiXDAwMFwwMjBcMDAwIiwgIkFCQUEiIH0sCisgIHsgMywgIlwwMDBcMDQwXDAwMCIsICJBQ0FBIiB9LAorICB7IDMsICJcMDAwXDEwMFwwMDAiLCAiQUVBQSIgfSwKKyAgeyAzLCAiXDAwMFwyMDBcMDAwIiwgIkFJQUEiIH0sCisgIHsgMywgIlwwMDFcMDAwXDAwMCIsICJBUUFBIiB9LAorICB7IDMsICJcMDAyXDAwMFwwMDAiLCAiQWdBQSIgfSwKKyAgeyAzLCAiXDAwNFwwMDBcMDAwIiwgIkJBQUEiIH0sCisgIHsgMywgIlwwMTBcMDAwXDAwMCIsICJDQUFBIiB9LAorICB7IDMsICJcMDIwXDAwMFwwMDAiLCAiRUFBQSIgfSwKKyAgeyAzLCAiXDA0MFwwMDBcMDAwIiwgIklBQUEiIH0sCisgIHsgMywgIlwxMDBcMDAwXDAwMCIsICJRQUFBIiB9LAorICB7IDMsICJcMjAwXDAwMFwwMDAiLCAiZ0FBQSIgfSwKKworICB7IDMsICJcMzc3XDM3N1wzNzciLCAiLy8vLyIgfSwKKyAgeyAzLCAiXDM3N1wzNzdcMzc2IiwgIi8vLysiIH0sCisgIHsgMywgIlwzNzdcMzc3XDM3NSIsICIvLy85IiB9LAorICB7IDMsICJcMzc3XDM3N1wzNzMiLCAiLy8vNyIgfSwKKyAgeyAzLCAiXDM3N1wzNzdcMzY3IiwgIi8vLzMiIH0sCisgIHsgMywgIlwzNzdcMzc3XDM1NyIsICIvLy92IiB9LAorICB7IDMsICJcMzc3XDM3N1wzMzciLCAiLy8vZiIgfSwKKyAgeyAzLCAiXDM3N1wzNzdcMjc3IiwgIi8vKy8iIH0sCisgIHsgMywgIlwzNzdcMzc3XDE3NyIsICIvLzkvIiB9LAorICB7IDMsICJcMzc3XDM3NlwzNzciLCAiLy83LyIgfSwKKyAgeyAzLCAiXDM3N1wzNzVcMzc3IiwgIi8vMy8iIH0sCisgIHsgMywgIlwzNzdcMzczXDM3NyIsICIvL3YvIiB9LAorICB7IDMsICJcMzc3XDM2N1wzNzciLCAiLy9mLyIgfSwKKyAgeyAzLCAiXDM3N1wzNTdcMzc3IiwgIi8rLy8iIH0sCisgIHsgMywgIlwzNzdcMzM3XDM3NyIsICIvOS8vIiB9LAorICB7IDMsICJcMzc3XDI3N1wzNzciLCAiLzcvLyIgfSwKKyAgeyAzLCAiXDM3N1wxNzdcMzc3IiwgIi8zLy8iIH0sCisgIHsgMywgIlwzNzZcMzc3XDM3NyIsICIvdi8vIiB9LAorICB7IDMsICJcMzc1XDM3N1wzNzciLCAiL2YvLyIgfSwKKyAgeyAzLCAiXDM3M1wzNzdcMzc3IiwgIisvLy8iIH0sCisgIHsgMywgIlwzNjdcMzc3XDM3NyIsICI5Ly8vIiB9LAorICB7IDMsICJcMzU3XDM3N1wzNzciLCAiNy8vLyIgfSwKKyAgeyAzLCAiXDMzN1wzNzdcMzc3IiwgIjMvLy8iIH0sCisgIHsgMywgIlwyNzdcMzc3XDM3NyIsICJ2Ly8vIiB9LAorICB7IDMsICJcMTc3XDM3N1wzNzciLCAiZi8vLyIgfSwKKworICAvLyBSYW5kb20gbnVtYmVyczogdmFsdWVzIG9idGFpbmVkIHdpdGgKKyAgLy8KKyAgLy8gICMhIC9iaW4vYmFzaAorICAvLyAgZGQgYnM9JDEgY291bnQ9MSBpZj0vZGV2L3JhbmRvbSBvZj0vdG1wL2Jhci5yYW5kb20KKyAgLy8gIG9kIC1OICQxIC10IG8xIC90bXAvYmFyLnJhbmRvbQorICAvLyAgdXVlbmNvZGUgLW0gdGVzdCA8IC90bXAvYmFyLnJhbmRvbQorICAvLworICAvLyB3aGVyZSAkMSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzICgyLCAzKQorCisgIHsgMiwgIlwyNDNcMzYxIiwgIm8vRT0iIH0sCisgIHsgMiwgIlwwMjRcMTY3IiwgIkZIYz0iIH0sCisgIHsgMiwgIlwzMTNcMjUyIiwgInk2bz0iIH0sCisgIHsgMiwgIlwwNDZcMDQxIiwgIkppRT0iIH0sCisgIHsgMiwgIlwxNDVcMjM2IiwgIlpaND0iIH0sCisgIHsgMiwgIlwyNTRcMzI1IiwgInJOVT0iIH0sCisgIHsgMiwgIlwwNjFcMzMwIiwgIk1kZz0iIH0sCisgIHsgMiwgIlwyNDVcMDMyIiwgInBSbz0iIH0sCisgIHsgMiwgIlwwMDZcMDAwIiwgIkJnQT0iIH0sCisgIHsgMiwgIlwzNzVcMTMxIiwgIi9Waz0iIH0sCisgIHsgMiwgIlwzMDNcMjEwIiwgInc0Zz0iIH0sCisgIHsgMiwgIlwwNDBcMDM3IiwgIklCOD0iIH0sCisgIHsgMiwgIlwyNjFcMzcyIiwgInNmbz0iIH0sCisgIHsgMiwgIlwzMzVcMDE0IiwgIjNRdz0iIH0sCisgIHsgMiwgIlwyMzNcMjE3IiwgIm00OD0iIH0sCisgIHsgMiwgIlwzNzNcMDU2IiwgIit5ND0iIH0sCisgIHsgMiwgIlwyNDdcMjMyIiwgInA1bz0iIH0sCisgIHsgMiwgIlwxMDdcMDUzIiwgIlJ5cz0iIH0sCisgIHsgMiwgIlwyMDRcMDc3IiwgImhEOD0iIH0sCisgIHsgMiwgIlwyNzZcMjExIiwgInZvaz0iIH0sCisgIHsgMiwgIlwzMTNcMTEwIiwgInkwZz0iIH0sCisgIHsgMiwgIlwzNjNcMzc2IiwgIjgvND0iIH0sCisgIHsgMiwgIlwyNTFcMjM0IiwgInFadz0iIH0sCisgIHsgMiwgIlwxMDNcMjYyIiwgIlE3ST0iIH0sCisgIHsgMiwgIlwxNDJcMzEyIiwgIllzbz0iIH0sCisgIHsgMiwgIlwwNjdcMjExIiwgIk40az0iIH0sCisgIHsgMiwgIlwyMjBcMDAxIiwgImtBRT0iIH0sCisgIHsgMiwgIlwxNTJcMjQwIiwgImFxQT0iIH0sCisgIHsgMiwgIlwzNjdcMDYxIiwgIjl6RT0iIH0sCisgIHsgMiwgIlwxMzNcMjU1IiwgIlc2MD0iIH0sCisgIHsgMiwgIlwxNzZcMDM1IiwgImZoMD0iIH0sCisgIHsgMiwgIlwwMzJcMjMxIiwgIkdwaz0iIH0sCisKKyAgeyAzLCAiXDAxM1wwMDdcMTQ0IiwgIkN3ZGsiIH0sCisgIHsgMywgIlwwMzBcMTEyXDEwNiIsICJHRXBHIiB9LAorICB7IDMsICJcMDQ3XDMyNVwwNDYiLCAiSjlVbSIgfSwKKyAgeyAzLCAiXDMxMFwxNjBcMDIyIiwgInlIQVMiIH0sCisgIHsgMywgIlwxMzFcMTAwXDIzNyIsICJXVUNmIiB9LAorICB7IDMsICJcMDY0XDM0MlwxMzQiLCAiTk9KYyIgfSwKKyAgeyAzLCAiXDAxMFwxNzdcMDA0IiwgIkNIOEUiIH0sCisgIHsgMywgIlwzNDVcMTQ3XDIwNSIsICI1V2VGIiB9LAorICB7IDMsICJcMzAwXDM0M1wzNjAiLCAid09QdyIgfSwKKyAgeyAzLCAiXDA2MVwyNDBcMjAxIiwgIk1hQ0IiIH0sCisgIHsgMywgIlwyMjVcMzMzXDA0NCIsICJsZHNrIiB9LAorICB7IDMsICJcMjE1XDEzN1wzNTIiLCAialYvcSIgfSwKKyAgeyAzLCAiXDM3MVwxNDdcMTYwIiwgIitXZHciIH0sCisgIHsgMywgIlwwMzBcMzIwXDA1MSIsICJHTkFwIiB9LAorICB7IDMsICJcMDQ0XDE3NFwyNDEiLCAiSkh5aCIgfSwKKyAgeyAzLCAiXDI2MFwxMjdcMDM3IiwgInNGY2YiIH0sCisgIHsgMywgIlwxMTFcMDQ1XDAzMyIsICJTU1ViIiB9LAorICB7IDMsICJcMjAyXDExNFwxMDciLCAiZ2t4SCIgfSwKKyAgeyAzLCAiXDA1N1wzNzFcMDQyIiwgIkwva2kiIH0sCisgIHsgMywgIlwyMjNcMjQ3XDI0NCIsICJrNmVrIiB9LAorICB7IDMsICJcMDQ3XDIxNlwxNDQiLCAiSjQ1ayIgfSwKKyAgeyAzLCAiXDIwM1wwNzBcMzI3IiwgImd6algiIH0sCisgIHsgMywgIlwyNDdcMTQwXDA3MiIsICJwMkE2IiB9LAorICB7IDMsICJcMTI0XDExNVwxMTYiLCAiVkUxTyIgfSwKKyAgeyAzLCAiXDE1N1wxNjJcMDUwIiwgImIzSW8iIH0sCisgIHsgMywgIlwzNTdcMjIzXDAwNCIsICI3NU1FIiB9LAorICB7IDMsICJcMDUyXDExN1wxNTYiLCAiS2s5dSIgfSwKKyAgeyAzLCAiXDM0N1wxNTRcMDAwIiwgIjUyd0EiIH0sCisgIHsgMywgIlwzMDNcMDEyXDE0MiIsICJ3d3BpIiB9LAorICB7IDMsICJcMDYwXDAzNVwzNjIiLCAiTUIzeSIgfSwKKyAgeyAzLCAiXDEzMFwyMjZcMzYxIiwgIldKYngiIH0sCisgIHsgMywgIlwxNzNcMDEzXDA3MSIsICJld3M1IiB9LAorICB7IDMsICJcMzM2XDAwNFwwMjciLCAiM2dRWCIgfSwKKyAgeyAzLCAiXDM1N1wzNjZcMjM0IiwgIjcvYWMiIH0sCisgIHsgMywgIlwzNTNcMzA0XDExMSIsICI2OFJKIiB9LAorICB7IDMsICJcMDI0XDI2NFwxMzEiLCAiRkxSWiIgfSwKKyAgeyAzLCAiXDA3NVwxMTRcMjUxIiwgIlBVeXAiIH0sCisgIHsgMywgIlwzMTVcMDMxXDIyNSIsICJ6Um1WIiB9LAorICB7IDMsICJcMTU0XDIwMVwyNzYiLCAiYklHKyIgfSwKKyAgeyAzLCAiXDIwMFwwNjZcMDcyIiwgImdEWTYiIH0sCisgIHsgMywgIlwxNDJcMzUwXDI2NyIsICJZdWkzIiB9LAorICB7IDMsICJcMDMzXDAwMFwxNjYiLCAiR3dCMiIgfSwKKyAgeyAzLCAiXDIxMFwwNTVcMDc3IiwgImlDMC8iIH0sCisgIHsgMywgIlwzNDFcMDM3XDEyNCIsICI0UjlVIiB9LAorICB7IDMsICJcMTYxXDEwM1wxNTIiLCAiY1VOcSIgfSwKKyAgeyAzLCAiXDI3MFwxNDJcMTMxIiwgInVHSloiIH0sCisgIHsgMywgIlwzMzdcMDc2XDA3NCIsICIzejQ4IiB9LAorICB7IDMsICJcMzc1XDEwNlwzNjIiLCAiL1VieSIgfSwKKyAgeyAzLCAiXDIyN1wzMDFcMTI3IiwgImw4RlgiIH0sCisgIHsgMywgIlwzNDBcMDAyXDIzNCIsICI0QUtjIiB9LAorICB7IDMsICJcMTIxXDA2NFwwMzMiLCAiVVRRYiIgfSwKKyAgeyAzLCAiXDE1N1wxMzRcMTQzIiwgImIxeGoiIH0sCisgIHsgMywgIlwyNDdcMDU1XDMyNyIsICJweTNYIiB9LAorICB7IDMsICJcMzQwXDE0MlwwMDUiLCAiNEdJRiIgfSwKKyAgeyAzLCAiXDA2MFwyNjBcMTQzIiwgIk1MQmoiIH0sCisgIHsgMywgIlwwNzVcMjAzXDE3MCIsICJQWU40IiB9LAorICB7IDMsICJcMTQzXDE2MFwwMTYiLCAiWTNBTyIgfSwKKyAgeyAzLCAiXDMxM1wwMTNcMDYzIiwgInl3c3oiIH0sCisgIHsgMywgIlwxNzRcMjM2XDEzNSIsICJmSjVkIiB9LAorICB7IDMsICJcMTAzXDA0N1wwMjYiLCAiUXljVyIgfSwKKyAgeyAzLCAiXDM2NVwwMDVcMzQzIiwgIjlRWGoiIH0sCisgIHsgMywgIlwyNzFcMTYwXDIyMyIsICJ1WENUIiB9LAorICB7IDMsICJcMzYyXDI1NVwxNzIiLCAiOHExNiIgfSwKKyAgeyAzLCAiXDExM1wwMTJcMDE1IiwgIlN3b04iIH0sCisKKyAgLy8gdmFyaW91cyBsZW5ndGhzLCBnZW5lcmF0ZWQgYnkgdGhpcyBweXRob24gc2NyaXB0OgorICAvLworICAvLyBmcm9tIHN0cmluZyBpbXBvcnQgbG93ZXJjYXNlIGFzIGxjCisgIC8vIGZvciBpIGluIHJhbmdlKDI3KToKKyAgLy8gICBwcmludCAneyAlMmQsICIlcyIsJXMgIiVzIiB9LCcgJSAoaSwgbGNbOmldLCAnICcgKiAoMjYtaSksCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjWzppXS5lbmNvZGUoJ2Jhc2U2NCcpLnN0cmlwKCkpCisKKyAgeyAgMCwgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIgfSwKKyAgeyAgMSwgImEiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIllRPT0iIH0sCisgIHsgIDIsICJhYiIsICAgICAgICAgICAgICAgICAgICAgICAgICJZV0k9IiB9LAorICB7ICAzLCAiYWJjIiwgICAgICAgICAgICAgICAgICAgICAgICAiWVdKaiIgfSwKKyAgeyAgNCwgImFiY2QiLCAgICAgICAgICAgICAgICAgICAgICAgIllXSmpaQT09IiB9LAorICB7ICA1LCAiYWJjZGUiLCAgICAgICAgICAgICAgICAgICAgICAiWVdKalpHVT0iIH0sCisgIHsgIDYsICJhYmNkZWYiLCAgICAgICAgICAgICAgICAgICAgICJZV0pqWkdWbSIgfSwKKyAgeyAgNywgImFiY2RlZmciLCAgICAgICAgICAgICAgICAgICAgIllXSmpaR1ZtWnc9PSIgfSwKKyAgeyAgOCwgImFiY2RlZmdoIiwgICAgICAgICAgICAgICAgICAgIllXSmpaR1ZtWjJnPSIgfSwKKyAgeyAgOSwgImFiY2RlZmdoaSIsICAgICAgICAgICAgICAgICAgIllXSmpaR1ZtWjJocCIgfSwKKyAgeyAxMCwgImFiY2RlZmdoaWoiLCAgICAgICAgICAgICAgICAgIllXSmpaR1ZtWjJocGFnPT0iIH0sCisgIHsgMTEsICJhYmNkZWZnaGlqayIsICAgICAgICAgICAgICAgICJZV0pqWkdWbVoyaHBhbXM9IiB9LAorICB7IDEyLCAiYWJjZGVmZ2hpamtsIiwgICAgICAgICAgICAgICAiWVdKalpHVm1aMmhwYW10cyIgfSwKKyAgeyAxMywgImFiY2RlZmdoaWprbG0iLCAgICAgICAgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiUT09IiB9LAorICB7IDE0LCAiYWJjZGVmZ2hpamtsbW4iLCAgICAgICAgICAgICAiWVdKalpHVm1aMmhwYW10c2JXND0iIH0sCisgIHsgMTUsICJhYmNkZWZnaGlqa2xtbm8iLCAgICAgICAgICAgICJZV0pqWkdWbVoyaHBhbXRzYlc1diIgfSwKKyAgeyAxNiwgImFiY2RlZmdoaWprbG1ub3AiLCAgICAgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0E9PSIgfSwKKyAgeyAxNywgImFiY2RlZmdoaWprbG1ub3BxIiwgICAgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hFPSIgfSwKKyAgeyAxOCwgImFiY2RlZmdoaWprbG1ub3BxciIsICAgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeSIgfSwKKyAgeyAxOSwgImFiY2RlZmdoaWprbG1ub3BxcnMiLCAgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWN3PT0iIH0sCisgIHsgMjAsICJhYmNkZWZnaGlqa2xtbm9wcXJzdCIsICAgICAgICJZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1E9IiB9LAorICB7IDIxLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1IiwgICAgICAiWVdKalpHVm1aMmhwYW10c2JXNXZjSEZ5YzNSMSIgfSwKKyAgeyAyMiwgImFiY2RlZmdoaWprbG1ub3BxcnN0dXYiLCAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkZz09IiB9LAorICB7IDIzLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnciLCAgICAiWVdKalpHVm1aMmhwYW10c2JXNXZjSEZ5YzNSMWRuYz0iIH0sCisgIHsgMjQsICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3giLCAgICJZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5kNCIgfSwKKyAgeyAyNSwgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHkiLCAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0ZVE9PSIgfSwKKyAgeyAyNiwgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0ZVhvPSIgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworICBjb25zdCBjaGFyKiBwbGFpbnRleHQ7CisgIGNvbnN0IGNoYXIqIGNpcGhlcnRleHQ7Cit9IGJhc2U2NF9zdHJpbmdzW10gPSB7CisgICAgLy8gU29tZSBnb29nbGUgcXVvdGVzCisgICAgLy8gQ2lwaGVydGV4dCBjcmVhdGVkIHdpdGggInV1ZW5jb2RlIChHTlUgc2hhcnV0aWxzKSA0LjYuMyIKKyAgICAvLyAoTm90ZSB0aGF0IHdlJ3JlIHRlc3RpbmcgdGhlIHdlYnNhZmUgZW5jb2RpbmcsIHRob3VnaCwgc28gaWYKKyAgICAvLyB5b3UgYWRkIG1lc3NhZ2VzLCBiZSBzdXJlIHRvIHJ1biAidHIgLS0gJysvJyAnLV8nIiBvbiB0aGUgb3V0cHV0KQorICAgIHsiSSB3YXMgYWx3YXlzIGdvb2QgYXQgbWF0aCBhbmQgc2NpZW5jZSwgYW5kIEkgbmV2ZXIgcmVhbGl6ZWQgIgorICAgICAidGhhdCB3YXMgdW51c3VhbCBvciBzb21laG93IHVuZGVzaXJhYmxlLiBTbyBvbmUgb2YgdGhlIHRoaW5ncyAiCisgICAgICJJIGNhcmUgYSBsb3QgYWJvdXQgaXMgaGVscGluZyB0byByZW1vdmUgdGhhdCBzdGlnbWEsICIKKyAgICAgInRvIHNob3cgZ2lybHMgdGhhdCB5b3UgY2FuIGJlIGZlbWluaW5lLCB5b3UgY2FuIGxpa2UgdGhlIHRoaW5ncyAiCisgICAgICJ0aGF0IGdpcmxzIGxpa2UsIGJ1dCB5b3UgY2FuIGFsc28gYmUgcmVhbGx5IGdvb2QgYXQgdGVjaG5vbG9neS4gIgorICAgICAiWW91IGNhbiBiZSByZWFsbHkgZ29vZCBhdCBidWlsZGluZyB0aGluZ3MuIgorICAgICAiIC0gTWFyaXNzYSBNZXllciwgTmV3c3dlZWssIDIwMTAtMTItMjIiCisgICAgICJcbiIsCisKKyAgICAgIlNTQjNZWE1nWVd4M1lYbHpJR2R2YjJRZ1lYUWdiV0YwYUNCaGJtUWdjMk5wWlc1alpTd2dZVzVrSUVrZyIKKyAgICAgImJtVjJaWElnY21WaGJHbDZaV1FnZEdoaGRDQjNZWE1nZFc1MWMzVmhiQ0J2Y2lCemIyMWxhRzkzSUhWdSIKKyAgICAgIlpHVnphWEpoWW14bExpQlRieUJ2Ym1VZ2IyWWdkR2hsSUhSb2FXNW5jeUJKSUdOaGNtVWdZU0JzYjNRZyIKKyAgICAgIllXSnZkWFFnYVhNZ2FHVnNjR2x1WnlCMGJ5QnlaVzF2ZG1VZ2RHaGhkQ0J6ZEdsbmJXRXNJSFJ2SUhObyIKKyAgICAgImIzY2daMmx5YkhNZ2RHaGhkQ0I1YjNVZ1kyRnVJR0psSUdabGJXbHVhVzVsTENCNWIzVWdZMkZ1SUd4cCIKKyAgICAgImEyVWdkR2hsSUhSb2FXNW5jeUIwYUdGMElHZHBjbXh6SUd4cGEyVXNJR0oxZENCNWIzVWdZMkZ1SUdGcyIKKyAgICAgImMyOGdZbVVnY21WaGJHeDVJR2R2YjJRZ1lYUWdkR1ZqYUc1dmJHOW5lUzRnV1c5MUlHTmhiaUJpWlNCeSIKKyAgICAgIlpXRnNiSGtnWjI5dlpDQmhkQ0JpZFdsc1pHbHVaeUIwYUdsdVozTXVJQzBnVFdGeWFYTnpZU0JOWlhsbCIKKyAgICAgImNpd2dUbVYzYzNkbFpXc3NJREl3TVRBdE1USXRNaklLIn0sCisKKyAgICB7IlR5cGljYWwgZmlyc3QgeWVhciBmb3IgYSBuZXcgY2x1c3RlcjogIgorICAgICAifjAuNSBvdmVyaGVhdGluZyAiCisgICAgICJ+MSBQRFUgZmFpbHVyZSAiCisgICAgICJ+MSByYWNrLW1vdmUgIgorICAgICAifjEgbmV0d29yayByZXdpcmluZyAiCisgICAgICJ+MjAgcmFjayBmYWlsdXJlcyAiCisgICAgICJ+NSByYWNrcyBnbyB3b25reSAiCisgICAgICJ+OCBuZXR3b3JrIG1haW50ZW5hbmNlcyAiCisgICAgICJ+MTIgcm91dGVyIHJlbG9hZHMgIgorICAgICAifjMgcm91dGVyIGZhaWx1cmVzICIKKyAgICAgIn5kb3plbnMgb2YgbWlub3IgMzAtc2Vjb25kIGJsaXBzIGZvciBkbnMgIgorICAgICAifjEwMDAgaW5kaXZpZHVhbCBtYWNoaW5lIGZhaWx1cmVzICIKKyAgICAgIn50aG91c2FuZHMgb2YgaGFyZCBkcml2ZSBmYWlsdXJlcyAiCisgICAgICJzbG93IGRpc2tzLCBiYWQgbWVtb3J5LCBtaXNjb25maWd1cmVkIG1hY2hpbmVzLCBmbGFreSBtYWNoaW5lcywgZXRjLiIKKyAgICAgIiAtIEplZmYgRGVhbiwgVGhlIEpveXMgb2YgUmVhbCBIYXJkd2FyZSIKKyAgICAgIlxuIiwKKworICAgICAiVkhsd2FXTmhiQ0JtYVhKemRDQjVaV0Z5SUdadmNpQmhJRzVsZHlCamJIVnpkR1Z5T2lCLU1DNDFJRzkyIgorICAgICAiWlhKb1pXRjBhVzVuSUg0eElGQkVWU0JtWVdsc2RYSmxJSDR4SUhKaFkyc3RiVzkyWlNCLU1TQnVaWFIzIgorICAgICAiYjNKcklISmxkMmx5YVc1bklINHlNQ0J5WVdOcklHWmhhV3gxY21WeklINDFJSEpoWTJ0eklHZHZJSGR2IgorICAgICAiYm10NUlINDRJRzVsZEhkdmNtc2diV0ZwYm5SbGJtRnVZMlZ6SUg0eE1pQnliM1YwWlhJZ2NtVnNiMkZrIgorICAgICAiY3lCLU15QnliM1YwWlhJZ1ptRnBiSFZ5WlhNZ2ZtUnZlbVZ1Y3lCdlppQnRhVzV2Y2lBek1DMXpaV052IgorICAgICAiYm1RZ1lteHBjSE1nWm05eUlHUnVjeUItTVRBd01DQnBibVJwZG1sa2RXRnNJRzFoWTJocGJtVWdabUZwIgorICAgICAiYkhWeVpYTWdmblJvYjNWellXNWtjeUJ2WmlCb1lYSmtJR1J5YVhabElHWmhhV3gxY21WeklITnNiM2NnIgorICAgICAiWkdsemEzTXNJR0poWkNCdFpXMXZjbmtzSUcxcGMyTnZibVpwWjNWeVpXUWdiV0ZqYUdsdVpYTXNJR1pzIgorICAgICAiWVd0NUlHMWhZMmhwYm1WekxDQmxkR011SUMwZ1NtVm1aaUJFWldGdUxDQlVhR1VnU205NWN5QnZaaUJTIgorICAgICAiWldGc0lFaGhjbVIzWVhKbENnIn0sCisKKyAgICB7IkknbSB0aGUgaGVhZCBvZiB0aGUgd2Vic3BhbSB0ZWFtIGF0IEdvb2dsZS4gICIKKyAgICAgIlRoYXQgbWVhbnMgdGhhdCBpZiB5b3UgdHlwZSB5b3VyIG5hbWUgaW50byBHb29nbGUgYW5kIGdldCBwb3JuIGJhY2ssICIKKyAgICAgIml0J3MgbXkgZmF1bHQuIFVubGVzcyB5b3UncmUgYSBwb3JuIHN0YXIsIGluIHdoaWNoIGNhc2UgcG9ybiBpcyBhICIKKyAgICAgImNvbXBsZXRlbHkgcmVhc29uYWJsZSByZXNwb25zZS4iCisgICAgICIgLSBNYXR0IEN1dHRzLCBHb29nbGUgUGx1cyIKKyAgICAgIlxuIiwKKworICAgICAiU1NkdElIUm9aU0JvWldGa0lHOW1JSFJvWlNCM1pXSnpjR0Z0SUhSbFlXMGdZWFFnUjI5dloyeGxMaUFnIgorICAgICAiVkdoaGRDQnRaV0Z1Y3lCMGFHRjBJR2xtSUhsdmRTQjBlWEJsSUhsdmRYSWdibUZ0WlNCcGJuUnZJRWR2IgorICAgICAiYjJkc1pTQmhibVFnWjJWMElIQnZjbTRnWW1GamF5d2dhWFFuY3lCdGVTQm1ZWFZzZEM0Z1ZXNXNaWE56IgorICAgICAiSUhsdmRTZHlaU0JoSUhCdmNtNGdjM1JoY2l3Z2FXNGdkMmhwWTJnZ1kyRnpaU0J3YjNKdUlHbHpJR0VnIgorICAgICAiWTI5dGNHeGxkR1ZzZVNCeVpXRnpiMjVoWW14bElISmxjM0J2Ym5ObExpQXRJRTFoZEhRZ1EzVjBkSE1zIgorICAgICAiSUVkdmIyZHNaU0JRYkhWekNnIn0sCisKKyAgICB7Ikl0IHdpbGwgc3RpbGwgYmUgYSBsb25nIHRpbWUgYmVmb3JlIG1hY2hpbmVzIGFwcHJvYWNoIGh1bWFuICIKKyAgICAgImludGVsbGlnZW5jZS4gIgorICAgICAiQnV0IGx1Y2tpbHksIG1hY2hpbmVzIGRvbid0IGFjdHVhbGx5IGhhdmUgdG8gYmUgaW50ZWxsaWdlbnQ7ICIKKyAgICAgInRoZXkganVzdCBoYXZlIHRvIGZha2UgaXQuIEFjY2VzcyB0byBhIHdlYWx0aCBvZiBpbmZvcm1hdGlvbiwgIgorICAgICAiY29tYmluZWQgd2l0aCBhIHJ1ZGltZW50YXJ5IGRlY2lzaW9uLW1ha2luZyBjYXBhY2l0eSwgIgorICAgICAiY2FuIG9mdGVuIGJlIGFsbW9zdCBhcyB1c2VmdWwuIE9mIGNvdXJzZSwgdGhlIHJlc3VsdHMgYXJlIGJldHRlciB5ZXQgIgorICAgICAid2hlbiBjb3VwbGVkIHdpdGggaW50ZWxsaWdlbmNlLiBBIHJlZmVyZW5jZSBsaWJyYXJpYW4gd2l0aCBhY2Nlc3MgdG8gIgorICAgICAiYSBnb29kIHNlYXJjaCBlbmdpbmUgaXMgYSBmb3JtaWRhYmxlIHRvb2wuIgorICAgICAiIC0gQ3JhaWcgU2lsdmVyc3RlaW4sIFNpZW1lbnMgUGljdHVyZXMgb2YgdGhlIEZ1dHVyZSwgU3ByaW5nIDIwMDQiCisgICAgICJcbiIsCisKKyAgICAgIlNYUWdkMmxzYkNCemRHbHNiQ0JpWlNCaElHeHZibWNnZEdsdFpTQmlaV1p2Y21VZ2JXRmphR2x1WlhNZyIKKyAgICAgIllYQndjbTloWTJnZ2FIVnRZVzRnYVc1MFpXeHNhV2RsYm1ObExpQkNkWFFnYkhWamEybHNlU3dnYldGaiIKKyAgICAgImFHbHVaWE1nWkc5dUozUWdZV04wZFdGc2JIa2dhR0YyWlNCMGJ5QmlaU0JwYm5SbGJHeHBaMlZ1ZERzZyIKKyAgICAgImRHaGxlU0JxZFhOMElHaGhkbVVnZEc4Z1ptRnJaU0JwZEM0Z1FXTmpaWE56SUhSdklHRWdkMlZoYkhSbyIKKyAgICAgIklHOW1JR2x1Wm05eWJXRjBhVzl1TENCamIyMWlhVzVsWkNCM2FYUm9JR0VnY25Wa2FXMWxiblJoY25rZyIKKyAgICAgIlpHVmphWE5wYjI0dGJXRnJhVzVuSUdOaGNHRmphWFI1TENCallXNGdiMlowWlc0Z1ltVWdZV3h0YjNOMCIKKyAgICAgIklHRnpJSFZ6WldaMWJDNGdUMllnWTI5MWNuTmxMQ0IwYUdVZ2NtVnpkV3gwY3lCaGNtVWdZbVYwZEdWeSIKKyAgICAgIklIbGxkQ0IzYUdWdUlHTnZkWEJzWldRZ2QybDBhQ0JwYm5SbGJHeHBaMlZ1WTJVdUlFRWdjbVZtWlhKbCIKKyAgICAgImJtTmxJR3hwWW5KaGNtbGhiaUIzYVhSb0lHRmpZMlZ6Y3lCMGJ5QmhJR2R2YjJRZ2MyVmhjbU5vSUdWdSIKKyAgICAgIloybHVaU0JwY3lCaElHWnZjbTFwWkdGaWJHVWdkRzl2YkM0Z0xTQkRjbUZwWnlCVGFXeDJaWEp6ZEdWcCIKKyAgICAgImJpd2dVMmxsYldWdWN5QlFhV04wZFhKbGN5QnZaaUIwYUdVZ1JuVjBkWEpsTENCVGNISnBibWNnTWpBdyIKKyAgICAgIk5BbyJ9LAorCisgICAgLy8gRGVnZW5lcmF0ZSBlZGdlIGNhc2UKKyAgICB7IiIsICIifSwKK307CisKK1RFU1QoQmFzZTY0LCBFc2NhcGVBbmRVbmVzY2FwZSkgeworICAvLyBDaGVjayB0aGUgc2hvcnQgc3RyaW5nczsgdGhpcyB0ZXN0cyB0aGUgbWF0aCAoYW5kIGJvdW5kYXJpZXMpCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mKGJhc2U2NF90ZXN0cykgLyBzaXplb2YoYmFzZTY0X3Rlc3RzWzBdKTsgKytpKSB7CisgICAgY2hhciBlbmNvZGVfYnVmZmVyWzEwMF07CisgICAgaW50IGVuY29kZV9sZW5ndGg7CisgICAgY2hhciBkZWNvZGVfYnVmZmVyWzEwMF07CisgICAgaW50IGRlY29kZV9sZW5ndGg7CisgICAgaW50IGNpcGhlcl9sZW5ndGg7CisgICAgc3RkOjpzdHJpbmcgZGVjb2RlX3N0cjsKKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHVuc2lnbmVkX3BsYWludGV4dCA9CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0KTsKKworICAgIFN0cmluZ1BpZWNlIHBsYWludGV4dChiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKKworICAgIGNpcGhlcl9sZW5ndGggPSBzdHJsZW4oYmFzZTY0X3Rlc3RzW2ldLmNpcGhlcnRleHQpOworCisgICAgLy8gVGhlIGJhc2ljIGVzY2FwZSBmdW5jdGlvbjoKKyAgICBtZW1zZXQoZW5jb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGVuY29kZV9idWZmZXIpKTsKKyAgICBlbmNvZGVfbGVuZ3RoID0gQmFzZTY0RXNjYXBlKHVuc2lnbmVkX3BsYWludGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVuY29kZV9idWZmZXIpKTsKKyAgICAvLyAgICBJcyBpdCBvZiB0aGUgZXhwZWN0ZWQgbGVuZ3RoPworICAgIEVYUEVDVF9FUShlbmNvZGVfbGVuZ3RoLCBjaXBoZXJfbGVuZ3RoKTsKKyAgICAvLyBXb3VsZCBpdCBoYXZlIGJlZW4gb2theSB0byBhbGxvY2F0ZSBvbmx5IENhbGN1bGF0ZUJhc2U2NEVzY2FwZUxlbigpPworICAgIEVYUEVDVF9FUShDYWxjdWxhdGVCYXNlNjRFc2NhcGVkTGVuKGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgpLAorICAgICAgICAgICAgICBlbmNvZGVfbGVuZ3RoKTsKKworICAgIC8vICAgIElzIGl0IHRoZSBleHBlY3RlZCBlbmNvZGVkIHZhbHVlPworICAgIEFTU0VSVF9TVFJFUShlbmNvZGVfYnVmZmVyLCBiYXNlNjRfdGVzdHNbaV0uY2lwaGVydGV4dCk7CisKKyAgICAvLyBJZiB3ZSBlbmNvZGUgaXQgaW50byBhIGJ1ZmZlciBvZiBleGFjdGx5IHRoZSByaWdodCBsZW5ndGguLi4KKyAgICBtZW1zZXQoZW5jb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGVuY29kZV9idWZmZXIpKTsKKyAgICBlbmNvZGVfbGVuZ3RoID0KKyAgICAgICAgQmFzZTY0RXNjYXBlKHVuc2lnbmVkX3BsYWludGV4dCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9idWZmZXIsIGNpcGhlcl9sZW5ndGgpOworICAgIC8vICAgIElzIGl0IHN0aWxsIG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/CisgICAgRVhQRUNUX0VRKGVuY29kZV9sZW5ndGgsIGNpcGhlcl9sZW5ndGgpOworCisgICAgLy8gICAgQW5kIGlzIHRoZSB2YWx1ZSBzdGlsbCBjb3JyZWN0PyAgKGkuZS4sIG5vdCBsb3NpbmcgdGhlIGxhc3QgYnl0ZSkKKyAgICBFWFBFQ1RfU1RSRVEoZW5jb2RlX2J1ZmZlciwgYmFzZTY0X3Rlc3RzW2ldLmNpcGhlcnRleHQpOworCisgICAgLy8gSWYgd2UgZGVjb2RlIGl0IGJhY2s6CisgICAgZGVjb2RlX3N0ci5jbGVhcigpOworICAgIEVYUEVDVF9UUlVFKAorICAgICAgICBCYXNlNjRVbmVzY2FwZShTdHJpbmdQaWVjZShlbmNvZGVfYnVmZmVyLCBjaXBoZXJfbGVuZ3RoKSwgJmRlY29kZV9zdHIpKTsKKworICAgIC8vICAgIElzIGl0IG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/CisgICAgRVhQRUNUX0VRKGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgsIGRlY29kZV9zdHIubGVuZ3RoKCkpOworCisgICAgLy8gICAgSXMgaXQgdGhlIGV4cGVjdGVkIGRlY29kZWQgdmFsdWU/CisgICAgRVhQRUNUX0VRKHBsYWludGV4dCwgZGVjb2RlX3N0cik7CisKKyAgICAvLyBMZXQncyB0cnkgd2l0aCBhIHByZS1wb3B1bGF0ZWQgc3RyaW5nLgorICAgIHN0ZDo6c3RyaW5nIGVuY29kZWQoInRoaXMganVuayBzaG91bGQgYmUgaWdub3JlZCIpOworICAgIEJhc2U2NEVzY2FwZSgKKyAgICAgICAgc3RkOjpzdHJpbmcoYmFzZTY0X3Rlc3RzW2ldLnBsYWludGV4dCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCksCisgICAgICAgICZlbmNvZGVkKTsKKyAgICBFWFBFQ1RfRVEoZW5jb2RlZCwgc3RkOjpzdHJpbmcoZW5jb2RlX2J1ZmZlciwgY2lwaGVyX2xlbmd0aCkpOworCisgICAgc3RkOjpzdHJpbmcgZGVjb2RlZCgidGhpcyBqdW5rIHNob3VsZCBiZSBpZ25vcmVkIik7CisgICAgRVhQRUNUX1RSVUUoCisgICAgICAgIEJhc2U2NFVuZXNjYXBlKFN0cmluZ1BpZWNlKGVuY29kZV9idWZmZXIsIGNpcGhlcl9sZW5ndGgpLCAmZGVjb2RlZCkpOworICAgIEVYUEVDVF9FUShkZWNvZGVkLnNpemUoKSwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7CisgICAgRVhQRUNUX0VRX0FSUkFZKGRlY29kZWQuc2l6ZSgpLCBkZWNvZGVkLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBpKTsKKworICAgIC8vIE91ciBkZWNvZGVyIHRyZWF0cyB0aGUgcGFkZGluZyAnPScgY2hhcmFjdGVycyBhdCB0aGUgZW5kIGFzCisgICAgLy8gb3B0aW9uYWwgKGJ1dCBpZiB0aGVyZSBhcmUgYW55LCB0aGVyZSBtdXN0IGJlIHRoZSBjb3JyZWN0CisgICAgLy8gbnVtYmVyIG9mIHRoZW0uKSAgSWYgZW5jb2RlX2J1ZmZlciBoYXMgYW55LCBydW4gc29tZSBhZGRpdGlvbmFsCisgICAgLy8gdGVzdHMgdGhhdCBmaWRkbGUgd2l0aCB0aGVtLgorICAgIGNoYXIqIGZpcnN0X2VxdWFscyA9IHN0cmNocihlbmNvZGVfYnVmZmVyLCAnPScpOworICAgIGlmIChmaXJzdF9lcXVhbHMpIHsKKyAgICAgIC8vIEhvdyBtYW55IGVxdWFscyBzaWducyBkb2VzIHRoZSBzdHJpbmcgc3RhcnQgd2l0aD8KKyAgICAgIGludCBlcXVhbHMgPSAoKihmaXJzdF9lcXVhbHMrMSkgPT0gJz0nKSA/IDIgOiAxOworCisgICAgICAvLyBUcnkgY2hvcHBpbmcgb2ZmIHRoZSBlcXVhbHMgc2lnbihzKSBlbnRpcmVseS4gIFRoZSBkZWNvZGVyCisgICAgICAvLyBzaG91bGQgc3RpbGwgYmUgb2theSB3aXRoIHRoaXMuCisgICAgICBzdGQ6OnN0cmluZyBkZWNvZGVkMigidGhpcyBqdW5rIHNob3VsZCBhbHNvIGJlIGlnbm9yZWQiKTsKKyAgICAgICpmaXJzdF9lcXVhbHMgPSAnXDAnOworICAgICAgRVhQRUNUX1RSVUUoQmFzZTY0VW5lc2NhcGUoCisgICAgICAgICAgU3RyaW5nUGllY2UoZW5jb2RlX2J1ZmZlciwgZmlyc3RfZXF1YWxzIC0gZW5jb2RlX2J1ZmZlciksICZkZWNvZGVkMikpOworICAgICAgRVhQRUNUX0VRKGRlY29kZWQuc2l6ZSgpLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKKyAgICAgIEVYUEVDVF9FUV9BUlJBWShkZWNvZGVkLnNpemUoKSwgZGVjb2RlZCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWludGV4dCwgaSk7CisKKyAgICAgIC8vIE5vdyB0ZXN0IGNob3BwaW5nIG9mZiB0aGUgZXF1YWxzIHNpZ24ocykgYW5kIGFkZGluZworICAgICAgLy8gd2hpdGVzcGFjZS4gIE91ciBkZWNvZGVyIHNob3VsZCBzdGlsbCBhY2NlcHQgdGhpcy4KKyAgICAgIGRlY29kZWQyLmFzc2lnbigidGhpcyBqdW5rIHNob3VsZCBiZSBpZ25vcmVkIik7CisgICAgICAqZmlyc3RfZXF1YWxzID0gJyAnOworICAgICAgKihmaXJzdF9lcXVhbHMrMSkgPSAnXDAnOworICAgICAgRVhQRUNUX1RSVUUoQmFzZTY0VW5lc2NhcGUoCisgICAgICAgICAgU3RyaW5nUGllY2UoZW5jb2RlX2J1ZmZlciwgZmlyc3RfZXF1YWxzIC0gZW5jb2RlX2J1ZmZlciArIDEpLAorICAgICAgICAgICZkZWNvZGVkMikpOworICAgICAgRVhQRUNUX0VRKGRlY29kZWQuc2l6ZSgpLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKKyAgICAgIEVYUEVDVF9FUV9BUlJBWShkZWNvZGVkLnNpemUoKSwgZGVjb2RlZCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWludGV4dCwgaSk7CisKKyAgICAgIC8vIE5vdyBzdGljayBhIGJhZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAgVGhlIGRlY29kZXIKKyAgICAgIC8vIHNob3VsZCByZWZ1c2UgdGhpcyBzdHJpbmcuCisgICAgICBkZWNvZGVkMi5hc3NpZ24oInRoaXMganVuayBzaG91bGQgYmUgaWdub3JlZCIpOworICAgICAgKmZpcnN0X2VxdWFscyA9ICc/JzsKKyAgICAgICooZmlyc3RfZXF1YWxzKzEpID0gJ1wwJzsKKyAgICAgIEVYUEVDVF9UUlVFKAorICAgICAgICAgICFCYXNlNjRVbmVzY2FwZSgKKyAgICAgICAgICAgICAgU3RyaW5nUGllY2UoZW5jb2RlX2J1ZmZlciwgZmlyc3RfZXF1YWxzIC0gZW5jb2RlX2J1ZmZlciArIDEpLAorICAgICAgICAgICAgICAmZGVjb2RlZDIpKTsKKworICAgICAgaW50IGxlbjsKKworICAgICAgLy8gVGVzdCB3aGl0ZXNwYWNlIG1peGVkIHdpdGggdGhlIHBhZGRpbmcuICAoZWcgIkFBID0gPSAiKSAgVGhlCisgICAgICAvLyBkZWNvZGVyIHNob3VsZCBhY2NlcHQgdGhpcy4KKyAgICAgIGlmIChlcXVhbHMgPT0gMikgeworICAgICAgICBzbnByaW50ZihmaXJzdF9lcXVhbHMsIDYsICIgPSA9ICIpOworICAgICAgICBsZW4gPSBmaXJzdF9lcXVhbHMgLSBlbmNvZGVfYnVmZmVyICsgNTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNucHJpbnRmKGZpcnN0X2VxdWFscywgNiwgIiA9ICIpOworICAgICAgICBsZW4gPSBmaXJzdF9lcXVhbHMgLSBlbmNvZGVfYnVmZmVyICsgMzsKKyAgICAgIH0KKyAgICAgIGRlY29kZWQyLmFzc2lnbigidGhpcyBqdW5rIHNob3VsZCBiZSBpZ25vcmVkIik7CisgICAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgICBCYXNlNjRVbmVzY2FwZShTdHJpbmdQaWVjZShlbmNvZGVfYnVmZmVyLCBsZW4pLCAmZGVjb2RlZDIpKTsKKyAgICAgIEVYUEVDVF9FUShkZWNvZGVkLnNpemUoKSwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7CisgICAgICBFWFBFQ1RfRVFfQVJSQVkoZGVjb2RlZC5zaXplKCksIGRlY29kZWQsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbnRleHQsIGkpOworCisgICAgICAvLyBUZXN0IHdoaXRlc3BhY2UgbWl4ZWQgd2l0aCB0aGUgcGFkZGluZywgYnV0IHdpdGggdGhlIHdyb25nCisgICAgICAvLyBudW1iZXIgb2YgZXF1YWxzIHNpZ25zIChlZyAiQUEgPSAiKS4gIFRoZSBkZWNvZGVyIHNob3VsZAorICAgICAgLy8gcmVmdXNlIHRoZXNlIHN0cmluZ3MuCisgICAgICBpZiAoZXF1YWxzID09IDEpIHsKKyAgICAgICAgc25wcmludGYoZmlyc3RfZXF1YWxzLCA2LCAiID0gPSAiKTsKKyAgICAgICAgbGVuID0gZmlyc3RfZXF1YWxzIC0gZW5jb2RlX2J1ZmZlciArIDU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihmaXJzdF9lcXVhbHMsIDYsICIgPSAiKTsKKyAgICAgICAgbGVuID0gZmlyc3RfZXF1YWxzIC0gZW5jb2RlX2J1ZmZlciArIDM7CisgICAgICB9CisgICAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgICAhQmFzZTY0VW5lc2NhcGUoU3RyaW5nUGllY2UoZW5jb2RlX2J1ZmZlciwgbGVuKSwgJmRlY29kZWQyKSk7CisgICAgfQorCisgICAgLy8gQ29vbCEgdGhlIGJhc2ljIEJhc2U2NCBlbmNvZGVyL2RlY29kZXIgd29ya3MuCisgICAgLy8gTGV0J3MgdHJ5IHRoZSBhbHRlcm5hdGUgYWxwaGFiZXQ6IHRyIC0tICcrLycgJy1fJworCisgICAgY2hhciB3ZWJzYWZlWzEwMF07CisgICAgbWVtc2V0KHdlYnNhZmUsIDAsIHNpemVvZih3ZWJzYWZlKSk7CisgICAgc3RybmNweSh3ZWJzYWZlLCBiYXNlNjRfdGVzdHNbaV0uY2lwaGVydGV4dCwgY2lwaGVyX2xlbmd0aCk7CisgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBzaXplb2Yod2Vic2FmZSk7ICsrYykgeworICAgICAgaWYgKCcrJyA9PSB3ZWJzYWZlW2NdKSB7IHdlYnNhZmVbY10gPSAnLSc7IH0KKyAgICAgIGlmICgnLycgPT0gd2Vic2FmZVtjXSkgeyB3ZWJzYWZlW2NdID0gJ18nOyB9CisgICAgfQorCisgICAgLy8gVGhlIHdlYnNhZmUgZXNjYXBlIGZ1bmN0aW9uOgorICAgIG1lbXNldChlbmNvZGVfYnVmZmVyLCAwLCBzaXplb2YoZW5jb2RlX2J1ZmZlcikpOworICAgIGVuY29kZV9sZW5ndGggPSBXZWJTYWZlQmFzZTY0RXNjYXBlKHVuc2lnbmVkX3BsYWludGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVuY29kZV9idWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIC8vICAgIElzIGl0IG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/CisgICAgRVhQRUNUX0VRKGVuY29kZV9sZW5ndGgsIGNpcGhlcl9sZW5ndGgpOworICAgIEVYUEVDVF9FUSgKKyAgICAgICAgQ2FsY3VsYXRlQmFzZTY0RXNjYXBlZExlbihiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoLCB0cnVlKSwKKyAgICAgICAgZW5jb2RlX2xlbmd0aCk7CisKKyAgICAvLyAgICBJcyBpdCB0aGUgZXhwZWN0ZWQgZW5jb2RlZCB2YWx1ZT8KKyAgICBFWFBFQ1RfU1RSRVEoZW5jb2RlX2J1ZmZlciwgd2Vic2FmZSk7CisKKyAgICAvLyAgICBJZiB3ZSBlbmNvZGUgaXQgaW50byBhIGJ1ZmZlciBvZiBleGFjdGx5IHRoZSByaWdodCBsZW5ndGguLi4KKyAgICBtZW1zZXQoZW5jb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGVuY29kZV9idWZmZXIpKTsKKyAgICBlbmNvZGVfbGVuZ3RoID0KKyAgICAgICAgV2ViU2FmZUJhc2U2NEVzY2FwZSh1bnNpZ25lZF9wbGFpbnRleHQsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX2J1ZmZlciwgY2lwaGVyX2xlbmd0aCwgdHJ1ZSk7CisgICAgLy8gICAgSXMgaXQgc3RpbGwgb2YgdGhlIGV4cGVjdGVkIGxlbmd0aD8KKyAgICBFWFBFQ1RfRVEoZW5jb2RlX2xlbmd0aCwgY2lwaGVyX2xlbmd0aCk7CisKKyAgICAvLyAgICBBbmQgaXMgdGhlIHZhbHVlIHN0aWxsIGNvcnJlY3Q/ICAoaS5lLiwgbm90IGxvc2luZyB0aGUgbGFzdCBieXRlKQorICAgIEVYUEVDVF9TVFJFUShlbmNvZGVfYnVmZmVyLCB3ZWJzYWZlKTsKKworICAgIC8vICAgIExldCdzIHRyeSB0aGUgc3RyaW5nIHZlcnNpb24gb2YgdGhlIGVuY29kZXIKKyAgICBlbmNvZGVkID0gInRoaXMganVuayBzaG91bGQgYmUgaWdub3JlZCI7CisgICAgV2ViU2FmZUJhc2U2NEVzY2FwZSgKKyAgICAgICAgdW5zaWduZWRfcGxhaW50ZXh0LCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoLAorICAgICAgICAmZW5jb2RlZCwgdHJ1ZSk7CisgICAgRVhQRUNUX0VRKGVuY29kZWQuc2l6ZSgpLCBjaXBoZXJfbGVuZ3RoKTsKKyAgICBFWFBFQ1RfU1RSRVEoZW5jb2RlZC5jX3N0cigpLCB3ZWJzYWZlKTsKKworICAgIC8vICAgIElmIHdlIGRlY29kZSBpdCBiYWNrOgorICAgIG1lbXNldChkZWNvZGVfYnVmZmVyLCAwLCBzaXplb2YoZGVjb2RlX2J1ZmZlcikpOworICAgIGRlY29kZV9sZW5ndGggPSBXZWJTYWZlQmFzZTY0VW5lc2NhcGUoZW5jb2RlX2J1ZmZlciwgY2lwaGVyX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9idWZmZXIsIHNpemVvZihkZWNvZGVfYnVmZmVyKSk7CisKKyAgICAvLyAgICBJcyBpdCBvZiB0aGUgZXhwZWN0ZWQgbGVuZ3RoPworICAgIEVYUEVDVF9FUShkZWNvZGVfbGVuZ3RoLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKKworICAgIC8vICAgIElzIGl0IHRoZSBleHBlY3RlZCBkZWNvZGVkIHZhbHVlPworICAgIEVYUEVDVF9FUSgwLAorICAgICAgICAgICAgICBtZW1jbXAoZGVjb2RlX2J1ZmZlciwgYmFzZTY0X3Rlc3RzW2ldLnBsYWludGV4dCwgZGVjb2RlX2xlbmd0aCkpOworCisgICAgLy8gICAgSWYgd2UgZGVjb2RlIGl0IGludG8gYSBidWZmZXIgb2YgZXhhY3RseSB0aGUgcmlnaHQgbGVuZ3RoLi4uCisgICAgbWVtc2V0KGRlY29kZV9idWZmZXIsIDAsIHNpemVvZihkZWNvZGVfYnVmZmVyKSk7CisgICAgZGVjb2RlX2xlbmd0aCA9IFdlYlNhZmVCYXNlNjRVbmVzY2FwZShlbmNvZGVfYnVmZmVyLCBjaXBoZXJfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2J1ZmZlciwgZGVjb2RlX2xlbmd0aCk7CisKKyAgICAvLyAgICBJcyBpdCBzdGlsbCBvZiB0aGUgZXhwZWN0ZWQgbGVuZ3RoPworICAgIEVYUEVDVF9FUShkZWNvZGVfbGVuZ3RoLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKKworICAgIC8vICAgIEFuZCBpcyBpdCB0aGUgZXhwZWN0ZWQgZGVjb2RlZCB2YWx1ZT8KKyAgICBFWFBFQ1RfRVEoMCwKKyAgICAgICAgICAgICAgbWVtY21wKGRlY29kZV9idWZmZXIsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbnRleHQsIGRlY29kZV9sZW5ndGgpKTsKKworICAgIC8vIFRyeSB1c2luZyAnLicgZm9yIHRoZSBwYWQgY2hhcmFjdGVyLgorICAgIGZvciAoaW50IGMgPSBjaXBoZXJfbGVuZ3RoIC0gMTsgYyA+PSAwICYmICc9JyA9PSBlbmNvZGVfYnVmZmVyW2NdOyAtLWMpIHsKKyAgICAgIGVuY29kZV9idWZmZXJbY10gPSAnLic7CisgICAgfQorCisgICAgLy8gSWYgd2UgZGVjb2RlIGl0IGJhY2s6CisgICAgbWVtc2V0KGRlY29kZV9idWZmZXIsIDAsIHNpemVvZihkZWNvZGVfYnVmZmVyKSk7CisgICAgZGVjb2RlX2xlbmd0aCA9IFdlYlNhZmVCYXNlNjRVbmVzY2FwZShlbmNvZGVfYnVmZmVyLCBjaXBoZXJfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2J1ZmZlciwgc2l6ZW9mKGRlY29kZV9idWZmZXIpKTsKKworICAgIC8vIElzIGl0IG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/CisgICAgRVhQRUNUX0VRKGRlY29kZV9sZW5ndGgsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgpOworCisgICAgLy8gSXMgaXQgdGhlIGV4cGVjdGVkIGRlY29kZWQgdmFsdWU/CisgICAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICAgIG1lbWNtcChkZWNvZGVfYnVmZmVyLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBkZWNvZGVfbGVuZ3RoKSk7CisKKyAgICAvLyBJZiB3ZSBkZWNvZGUgaXQgaW50byBhIGJ1ZmZlciBvZiBleGFjdGx5IHRoZSByaWdodCBsZW5ndGguLi4KKyAgICBtZW1zZXQoZGVjb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGRlY29kZV9idWZmZXIpKTsKKyAgICBkZWNvZGVfbGVuZ3RoID0gV2ViU2FmZUJhc2U2NFVuZXNjYXBlKGVuY29kZV9idWZmZXIsIGNpcGhlcl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfYnVmZmVyLCBkZWNvZGVfbGVuZ3RoKTsKKworICAgIC8vIElzIGl0IHN0aWxsIG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/CisgICAgRVhQRUNUX0VRKGRlY29kZV9sZW5ndGgsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgpOworCisgICAgLy8gQW5kIGlzIGl0IHRoZSBleHBlY3RlZCBkZWNvZGVkIHZhbHVlPworICAgIEVYUEVDVF9FUSgwLAorICAgICAgICAgICAgICBtZW1jbXAoZGVjb2RlX2J1ZmZlciwgYmFzZTY0X3Rlc3RzW2ldLnBsYWludGV4dCwgZGVjb2RlX2xlbmd0aCkpOworCisgICAgLy8gTGV0J3MgdHJ5IHRoZSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgZGVjb2RlcgorICAgIGRlY29kZWQgPSAidGhpcyBqdW5rIHNob3VsZCBiZSBpZ25vcmVkIjsKKyAgICBFWFBFQ1RfVFJVRShXZWJTYWZlQmFzZTY0VW5lc2NhcGUoU3RyaW5nUGllY2UoZW5jb2RlX2J1ZmZlciwgY2lwaGVyX2xlbmd0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWNvZGVkKSk7CisgICAgRVhQRUNUX0VRKGRlY29kZWQuc2l6ZSgpLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKKyAgICBFWFBFQ1RfRVFfQVJSQVkoZGVjb2RlZC5zaXplKCksIGRlY29kZWQsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbnRleHQsIGkpOworCisgICAgLy8gT2theSEgdGhlIHdlYnNhZmUgQmFzZTY0IGVuY29kZXIvZGVjb2RlciB3b3Jrcy4KKyAgICAvLyBMZXQncyB0cnkgdGhlIHVucGFkZGVkIHZlcnNpb24KKworICAgIGZvciAoaW50IGMgPSAwOyBjIDwgc2l6ZW9mKHdlYnNhZmUpOyArK2MpIHsKKyAgICAgIGlmICgnPScgPT0gd2Vic2FmZVtjXSkgeworICAgICAgICB3ZWJzYWZlW2NdID0gJ1wwJzsKKyAgICAgICAgY2lwaGVyX2xlbmd0aCA9IGM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8vIFRoZSB3ZWJzYWZlIGVzY2FwZSBmdW5jdGlvbjoKKyAgICBtZW1zZXQoZW5jb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGVuY29kZV9idWZmZXIpKTsKKyAgICBlbmNvZGVfbGVuZ3RoID0gV2ViU2FmZUJhc2U2NEVzY2FwZSh1bnNpZ25lZF9wbGFpbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlbmNvZGVfYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgLy8gICAgSXMgaXQgb2YgdGhlIGV4cGVjdGVkIGxlbmd0aD8KKyAgICBFWFBFQ1RfRVEoZW5jb2RlX2xlbmd0aCwgY2lwaGVyX2xlbmd0aCk7CisgICAgRVhQRUNUX0VRKAorICAgICAgICBDYWxjdWxhdGVCYXNlNjRFc2NhcGVkTGVuKGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgsIGZhbHNlKSwKKyAgICAgICAgZW5jb2RlX2xlbmd0aCk7CisKKyAgICAvLyAgICBJcyBpdCB0aGUgZXhwZWN0ZWQgZW5jb2RlZCB2YWx1ZT8KKyAgICBFWFBFQ1RfU1RSRVEoZW5jb2RlX2J1ZmZlciwgd2Vic2FmZSk7CisKKyAgICAvLyAgICBJZiB3ZSBlbmNvZGUgaXQgaW50byBhIGJ1ZmZlciBvZiBleGFjdGx5IHRoZSByaWdodCBsZW5ndGguLi4KKyAgICBtZW1zZXQoZW5jb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGVuY29kZV9idWZmZXIpKTsKKyAgICBlbmNvZGVfbGVuZ3RoID0KKyAgICAgICAgV2ViU2FmZUJhc2U2NEVzY2FwZSh1bnNpZ25lZF9wbGFpbnRleHQsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX2J1ZmZlciwgY2lwaGVyX2xlbmd0aCwgZmFsc2UpOworICAgIC8vICAgIElzIGl0IHN0aWxsIG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/CisgICAgRVhQRUNUX0VRKGVuY29kZV9sZW5ndGgsIGNpcGhlcl9sZW5ndGgpOworCisgICAgLy8gICAgQW5kIGlzIHRoZSB2YWx1ZSBzdGlsbCBjb3JyZWN0PyAgKGkuZS4sIG5vdCBsb3NpbmcgdGhlIGxhc3QgYnl0ZSkKKyAgICBFWFBFQ1RfU1RSRVEoZW5jb2RlX2J1ZmZlciwgd2Vic2FmZSk7CisKKyAgICAvLyBMZXQncyB0cnkgdGhlIChvdGhlcikgc3RyaW5nIHZlcnNpb24gb2YgdGhlIGVuY29kZXIKKyAgICBzdGQ6OnN0cmluZyBwbGFpbihiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKKyAgICBlbmNvZGVkID0gInRoaXMganVuayBzaG91bGQgYmUgaWdub3JlZCI7CisgICAgV2ViU2FmZUJhc2U2NEVzY2FwZShwbGFpbiwgJmVuY29kZWQpOworICAgIEVYUEVDVF9FUShlbmNvZGVkLnNpemUoKSwgY2lwaGVyX2xlbmd0aCk7CisgICAgRVhQRUNUX1NUUkVRKGVuY29kZWQuY19zdHIoKSwgd2Vic2FmZSk7CisKKyAgICAvLyAgICBJZiB3ZSBkZWNvZGUgaXQgYmFjazoKKyAgICBtZW1zZXQoZGVjb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGRlY29kZV9idWZmZXIpKTsKKyAgICBkZWNvZGVfbGVuZ3RoID0gV2ViU2FmZUJhc2U2NFVuZXNjYXBlKGVuY29kZV9idWZmZXIsIGNpcGhlcl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfYnVmZmVyLCBzaXplb2YoZGVjb2RlX2J1ZmZlcikpOworCisgICAgLy8gICAgSXMgaXQgb2YgdGhlIGV4cGVjdGVkIGxlbmd0aD8KKyAgICBFWFBFQ1RfRVEoZGVjb2RlX2xlbmd0aCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7CisKKyAgICAvLyAgICBJcyBpdCB0aGUgZXhwZWN0ZWQgZGVjb2RlZCB2YWx1ZT8KKyAgICBFWFBFQ1RfRVEoMCwKKyAgICAgICAgICAgICAgbWVtY21wKGRlY29kZV9idWZmZXIsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbnRleHQsIGRlY29kZV9sZW5ndGgpKTsKKworICAgIC8vICAgIElmIHdlIGRlY29kZSBpdCBpbnRvIGEgYnVmZmVyIG9mIGV4YWN0bHkgdGhlIHJpZ2h0IGxlbmd0aC4uLgorICAgIG1lbXNldChkZWNvZGVfYnVmZmVyLCAwLCBzaXplb2YoZGVjb2RlX2J1ZmZlcikpOworICAgIGRlY29kZV9sZW5ndGggPSBXZWJTYWZlQmFzZTY0VW5lc2NhcGUoZW5jb2RlX2J1ZmZlciwgY2lwaGVyX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9idWZmZXIsIGRlY29kZV9sZW5ndGgpOworCisgICAgLy8gICAgSXMgaXQgc3RpbGwgb2YgdGhlIGV4cGVjdGVkIGxlbmd0aD8KKyAgICBFWFBFQ1RfRVEoZGVjb2RlX2xlbmd0aCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7CisKKyAgICAvLyAgICBBbmQgaXMgaXQgdGhlIGV4cGVjdGVkIGRlY29kZWQgdmFsdWU/CisgICAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICAgIG1lbWNtcChkZWNvZGVfYnVmZmVyLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBkZWNvZGVfbGVuZ3RoKSk7CisKKworICAgIC8vIExldCdzIHRyeSB0aGUgc3RyaW5nIHZlcnNpb24gb2YgdGhlIGRlY29kZXIKKyAgICBkZWNvZGVkID0gInRoaXMganVuayBzaG91bGQgYmUgaWdub3JlZCI7CisgICAgRVhQRUNUX1RSVUUoV2ViU2FmZUJhc2U2NFVuZXNjYXBlKFN0cmluZ1BpZWNlKGVuY29kZV9idWZmZXIsIGNpcGhlcl9sZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVjb2RlZCkpOworICAgIEVYUEVDVF9FUShkZWNvZGVkLnNpemUoKSwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7CisgICAgRVhQRUNUX0VRX0FSUkFZKGRlY29kZWQuc2l6ZSgpLCBkZWNvZGVkLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBpKTsKKworICAgIC8vIFRoaXMgdmFsdWUgd29ya3MuICBUcnkgdGhlIG5leHQuCisgIH0KKworICAvLyBOb3cgdHJ5IHRoZSBsb25nIHN0cmluZ3MsIHRoaXMgdGVzdHMgdGhlIHN0cmVhbWluZworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZihiYXNlNjRfc3RyaW5ncykgLyBzaXplb2YoYmFzZTY0X3N0cmluZ3NbMF0pOworICAgICAgICsraSkgeworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHVuc2lnbmVkX3BsYWludGV4dCA9CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihiYXNlNjRfc3RyaW5nc1tpXS5wbGFpbnRleHQpOworICAgIGludCBwbGFpbl9sZW5ndGggPSBzdHJsZW4oYmFzZTY0X3N0cmluZ3NbaV0ucGxhaW50ZXh0KTsKKyAgICBpbnQgY2lwaGVyX2xlbmd0aCA9IHN0cmxlbihiYXNlNjRfc3RyaW5nc1tpXS5jaXBoZXJ0ZXh0KTsKKyAgICBzdGQ6OnZlY3RvcjxjaGFyPiBidWZmZXIoY2lwaGVyX2xlbmd0aCArIDEpOworICAgIGludCBlbmNvZGVfbGVuZ3RoID0gV2ViU2FmZUJhc2U2NEVzY2FwZSh1bnNpZ25lZF9wbGFpbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWluX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIEVYUEVDVF9FUShjaXBoZXJfbGVuZ3RoLCBlbmNvZGVfbGVuZ3RoKTsKKyAgICBFWFBFQ1RfRVEoCisgICAgICAgIENhbGN1bGF0ZUJhc2U2NEVzY2FwZWRMZW4ocGxhaW5fbGVuZ3RoLCBmYWxzZSksIGVuY29kZV9sZW5ndGgpOworICAgIGJ1ZmZlclsgZW5jb2RlX2xlbmd0aCBdID0gJ1wwJzsKKyAgICBFWFBFQ1RfU1RSRVEoYmFzZTY0X3N0cmluZ3NbaV0uY2lwaGVydGV4dCwgJmJ1ZmZlclswXSk7CisgIH0KKworICAvLyBWZXJpZnkgdGhlIGJlaGF2aW9yIHdoZW4gZGVjb2RpbmcgYmFkIGRhdGEKKyAgeworICAgIGNvbnN0IGNoYXIqIGJhZF9kYXRhID0gImFiLS8iOworICAgIHN0ZDo6c3RyaW5nIGJ1ZjsKKyAgICBFWFBFQ1RfRkFMU0UoQmFzZTY0VW5lc2NhcGUoU3RyaW5nUGllY2UoYmFkX2RhdGEpLCAmYnVmKSk7CisgICAgRVhQRUNUX1RSVUUoIVdlYlNhZmVCYXNlNjRVbmVzY2FwZShiYWRfZGF0YSwgJmJ1ZikpOworICAgIEVYUEVDVF9UUlVFKGJ1Zi5lbXB0eSgpKTsKKyAgfQorfQorCisvLyBUZXN0IFN0ckNhdCBvZiBpbnRzIGFuZCBsb25ncyBvZiB2YXJpb3VzIHNpemVzIGFuZCBzaWduZGVkbmVzcy4KK1RFU1QoU3RyQ2F0LCBJbnRzKSB7CisgIGNvbnN0IHNob3J0IHMgPSAtMTsgIC8vIE5PTElOVChydW50aW1lL2ludCkKKyAgY29uc3QgdWludDE2X3QgdXMgPSAyOworICBjb25zdCBpbnQgaSA9IC0zOworICBjb25zdCB1bnNpZ25lZCBpbnQgdWkgPSA0OworICBjb25zdCBsb25nIGwgPSAtNTsgICAgICAgICAgICAgICAgIC8vIE5PTElOVChydW50aW1lL2ludCkKKyAgY29uc3QgdW5zaWduZWQgbG9uZyB1bCA9IDY7ICAgICAgICAvLyBOT0xJTlQocnVudGltZS9pbnQpCisgIGNvbnN0IGxvbmcgbG9uZyBsbCA9IC03OyAgICAgICAgICAgLy8gTk9MSU5UKHJ1bnRpbWUvaW50KQorICBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgdWxsID0gODsgIC8vIE5PTElOVChydW50aW1lL2ludCkKKyAgY29uc3QgcHRyZGlmZl90IHB0cmRpZmYgPSAtOTsKKyAgY29uc3Qgc2l6ZV90IHNpemUgPSAxMDsKKyAgY29uc3QgaW50cHRyX3QgaW50cHRyID0gLTEyOworICBjb25zdCB1aW50cHRyX3QgdWludHB0ciA9IDEzOworICBzdGQ6OnN0cmluZyBhbnN3ZXI7CisgIGFuc3dlciA9IFN0ckNhdChzLCB1cyk7CisgIEVYUEVDVF9FUShhbnN3ZXIsICItMTIiKTsKKyAgYW5zd2VyID0gU3RyQ2F0KGksIHVpKTsKKyAgRVhQRUNUX0VRKGFuc3dlciwgIi0zNCIpOworICBhbnN3ZXIgPSBTdHJDYXQobCwgdWwpOworICBFWFBFQ1RfRVEoYW5zd2VyLCAiLTU2Iik7CisgIGFuc3dlciA9IFN0ckNhdChsbCwgdWxsKTsKKyAgRVhQRUNUX0VRKGFuc3dlciwgIi03OCIpOworICBhbnN3ZXIgPSBTdHJDYXQocHRyZGlmZiwgc2l6ZSk7CisgIEVYUEVDVF9FUShhbnN3ZXIsICItOTEwIik7CisgIGFuc3dlciA9IFN0ckNhdChwdHJkaWZmLCBpbnRwdHIpOworICBFWFBFQ1RfRVEoYW5zd2VyLCAiLTktMTIiKTsKKyAgYW5zd2VyID0gU3RyQ2F0KHVpbnRwdHIsIDApOworICBFWFBFQ1RfRVEoYW5zd2VyLCAiMTMwIik7Cit9CisKK2NsYXNzIFJlcGxhY2VDaGFycworICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgY29uc3QgY2hhciosIGNoYXI+PiB7fTsKKworVEVTVF9QKFJlcGxhY2VDaGFycywgUmVwbGFjZXNBbGxPY2N1cmVuY2VzT2ZBbnlDaGFySW5SZXBsYWNlV2l0aEFSZXBsYWNlQ2hhcikgeworICBzdGQ6OnN0cmluZyBleHBlY3RlZCA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOworICBzdGQ6OnN0cmluZyBzdHJpbmdfdG9fcmVwbGFjZV9pbiA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOworICBjb25zdCBjaGFyKiB3aGF0X3RvX3JlcGxhY2UgPSBzdGQ6OmdldDwyPihHZXRQYXJhbSgpKTsKKyAgY2hhciByZXBsYWNlbWVudCA9IHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpOworICBSZXBsYWNlQ2hhcmFjdGVycygmc3RyaW5nX3RvX3JlcGxhY2VfaW4sIHdoYXRfdG9fcmVwbGFjZSwgcmVwbGFjZW1lbnQpOworICBBU1NFUlRfRVEoZXhwZWN0ZWQsIHN0cmluZ190b19yZXBsYWNlX2luKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgUmVwbGFjZSwgUmVwbGFjZUNoYXJzLAorICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoIiIsICIiLCAiIiwgJ18nKSwgICAgLy8gZW1wdHkgc3RyaW5nIHNob3VsZCByZW1haW4gZW1wdHkKKyAgICAgICAgc3RkOjptYWtlX3R1cGxlKCIgIiwgIiAiLCAiIiwgJ18nKSwgIC8vIG5vIHJlcGxhY2VtZW50IHN0cmluZworICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoIiAiLCAiICIsICJfLWFiY2VkZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAnKicpLCAgLy8gcmVwbGFjZW1lbnQgY2hhcmFjdGVyIG5vdCBpbiBzdHJpbmcKKyAgICAgICAgc3RkOjptYWtlX3R1cGxlKCJyZXBsYWNlIiwgIlJlcGxhY2UiLCAiUiIsCisgICAgICAgICAgICAgICAgICAgICAgICAncicpLCAgLy8gcmVwbGFjZSBvbmUgY2hhcmFjdGVyCisgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgibm90X3NwYWNlc19fIiwgIm5vdFxuc3BhY2VzXHQgIiwgIiBcdFxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgJ18nKSwgIC8vIHJlcGxhY2Ugc29tZSBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgICAgICAgc3RkOjptYWtlX3R1cGxlKCJjKysiLCAiY3h4IiwgIngiLAorICAgICAgICAgICAgICAgICAgICAgICAgJysnKSwgIC8vIHNhbWUgY2hhcmFjdGVyIG11bHRpcGxlIHRpbWVzCisgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgicXZ2dnZ2bmcgdiBUIiwgInF1ZXVlaW5nIGEgVCIsICJhZWlvdSIsCisgICAgICAgICAgICAgICAgICAgICAgICAndicpKSk7ICAvLyByZXBsYWNlIGFsbCB2b2V3bHMKKworY2xhc3MgU3RyaXBXcworICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IHt9OworCitURVNUX1AoU3RyaXBXcywgQWx3YXlzU3RyaXBzTGVhZGluZ0FuZFRyYWlsaW5nV2hpdGVzcGFjZSkgeworICBzdGQ6OnN0cmluZyBleHBlY3RlZCA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOworICBzdGQ6OnN0cmluZyBzdHJpbmdfdG9fc3RyaXAgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKKyAgU3RyaXBXaGl0ZXNwYWNlKCZzdHJpbmdfdG9fc3RyaXApOworICBBU1NFUlRfRVEoZXhwZWN0ZWQsIHN0cmluZ190b19zdHJpcCk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKAorICAgIFN0cmlwLCBTdHJpcFdzLAorICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoIiIsICIiKSwgICAvLyBlbXB0eSBzdHJpbmcgc2hvdWxkIHJlbWFpbiBlbXB0eQorICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoIiIsICIgIiksICAvLyBvbmx5IHdzIHNob3VsZCBiZWNvbWUgZW1wdHkKKyAgICAgICAgc3RkOjptYWtlX3R1cGxlKCJubyB3aGl0ZXNwYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbm8gd2hpdGVzcGFjZSIpLCAgLy8gbGVhZGluZyB3cyByZW1vdmVkCisgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgibm8gd2hpdGVzcGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAibm8gd2hpdGVzcGFjZSAiKSwgIC8vIHRyYWlsaW5nIHdzIHJlbW92ZWQKKyAgICAgICAgc3RkOjptYWtlX3R1cGxlKCJubyB3aGl0ZXNwYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbm8gd2hpdGVzcGFjZSAiKSwgIC8vIHNhbWUgbmIuIG9mIGxlYWRpbmcgYW5kIHRyYWlsaW5nCisgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgKKyAgICAgICAgICAgICJubyB3aGl0ZXNwYWNlIiwKKyAgICAgICAgICAgICIgIG5vIHdoaXRlc3BhY2UgIiksICAvLyBkaWZmZXJlbnQgbmIuIG9mIGxlYWRpbmcvdHJhaWxpbmcKKyAgICAgICAgc3RkOjptYWtlX3R1cGxlKCJubyB3aGl0ZXNwYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbm8gd2hpdGVzcGFjZSAgIikpKTsgIC8vIG1vcmUgdHJhaWxpbmcgdGhhbiBsZWFkaW5nCisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMDE2ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuY2MKQEAgLTAsMCArMSwxMzYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2Ugc3RyaW5ncyB7CisKK3VzaW5nIGludGVybmFsOjpTdWJzdGl0dXRlQXJnOworCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXJncyBpbiBhcmdfYXJyYXkgd2hpY2ggd2VyZSBwYXNzZWQgZXhwbGljaXRseQorLy8gdG8gU3Vic3RpdHV0ZSgpLgorc3RhdGljIGludCBDb3VudFN1YnN0aXR1dGVBcmdzKGNvbnN0IFN1YnN0aXR1dGVBcmcqIGNvbnN0KiBhcmdzX2FycmF5KSB7CisgIGludCBjb3VudCA9IDA7CisgIHdoaWxlIChhcmdzX2FycmF5W2NvdW50XSAhPSBudWxscHRyICYmIGFyZ3NfYXJyYXlbY291bnRdLT5zaXplKCkgIT0gLTEpIHsKKyAgICArK2NvdW50OworICB9CisgIHJldHVybiBjb3VudDsKK30KKworc3RkOjpzdHJpbmcgU3Vic3RpdHV0ZShjb25zdCBzdGQ6OnN0cmluZyYgZm9ybWF0LCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmcxLCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmczLCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc1LCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc2LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc3LCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc5KSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgU3Vic3RpdHV0ZUFuZEFwcGVuZCgmcmVzdWx0LCBmb3JtYXQuY19zdHIoKSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICBhcmc1LCBhcmc2LCBhcmc3LCBhcmc4LCBhcmc5KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBTdWJzdGl0dXRlQW5kQXBwZW5kKHN0ZDo6c3RyaW5nKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmcwLCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzIsIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnNCwgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc2LCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc3LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzgsIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzkpIHsKKyAgY29uc3QgU3Vic3RpdHV0ZUFyZyogY29uc3QgYXJnc19hcnJheVtdID0geworICAgICZhcmcwLCAmYXJnMSwgJmFyZzIsICZhcmczLCAmYXJnNCwgJmFyZzUsICZhcmc2LCAmYXJnNywgJmFyZzgsICZhcmc5LCBudWxscHRyCisgIH07CisKKyAgLy8gRGV0ZXJtaW5lIHRvdGFsIHNpemUgbmVlZGVkLgorICBpbnQgc2l6ZSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBmb3JtYXRbaV0gIT0gJ1wwJzsgaSsrKSB7CisgICAgaWYgKGZvcm1hdFtpXSA9PSAnJCcpIHsKKyAgICAgIGlmIChhc2NpaV9pc2RpZ2l0KGZvcm1hdFtpKzFdKSkgeworICAgICAgICBpbnQgaW5kZXggPSBmb3JtYXRbaSsxXSAtICcwJzsKKyAgICAgICAgaWYgKGFyZ3NfYXJyYXlbaW5kZXhdLT5zaXplKCkgPT0gLTEpIHsKKyAgICAgICAgICBHT09HTEVfTE9HKERGQVRBTCkKKyAgICAgICAgICAgIDw8ICJzdHJpbmdzOjpTdWJzdGl0dXRlIGZvcm1hdCBzdHJpbmcgaW52YWxpZDogYXNrZWQgZm9yIFwiJCIKKyAgICAgICAgICAgIDw8IGluZGV4IDw8ICJcIiwgYnV0IG9ubHkgIiA8PCBDb3VudFN1YnN0aXR1dGVBcmdzKGFyZ3NfYXJyYXkpCisgICAgICAgICAgICA8PCAiIGFyZ3Mgd2VyZSBnaXZlbi4gIEZ1bGwgZm9ybWF0IHN0cmluZyB3YXM6IFwiIgorICAgICAgICAgICAgPDwgQ0VzY2FwZShmb3JtYXQpIDw8ICJcIi4iOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzaXplICs9IGFyZ3NfYXJyYXlbaW5kZXhdLT5zaXplKCk7CisgICAgICAgICsraTsgIC8vIFNraXAgbmV4dCBjaGFyLgorICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaSsxXSA9PSAnJCcpIHsKKyAgICAgICAgKytzaXplOworICAgICAgICArK2k7ICAvLyBTa2lwIG5leHQgY2hhci4KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdPT0dMRV9MT0coREZBVEFMKQorICAgICAgICAgIDw8ICJJbnZhbGlkIHN0cmluZ3M6OlN1YnN0aXR1dGUoKSBmb3JtYXQgc3RyaW5nOiBcIiIKKyAgICAgICAgICA8PCBDRXNjYXBlKGZvcm1hdCkgPDwgIlwiLiI7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgKytzaXplOworICAgIH0KKyAgfQorCisgIGlmIChzaXplID09IDApIHJldHVybjsKKworICAvLyBCdWlsZCB0aGUgc3RyaW5nLgorICBpbnQgb3JpZ2luYWxfc2l6ZSA9IG91dHB1dC0+c2l6ZSgpOworICBTVExTdHJpbmdSZXNpemVVbmluaXRpYWxpemVkKG91dHB1dCwgb3JpZ2luYWxfc2l6ZSArIHNpemUpOworICBjaGFyKiB0YXJnZXQgPSBzdHJpbmdfYXNfYXJyYXkob3V0cHV0KSArIG9yaWdpbmFsX3NpemU7CisgIGZvciAoaW50IGkgPSAwOyBmb3JtYXRbaV0gIT0gJ1wwJzsgaSsrKSB7CisgICAgaWYgKGZvcm1hdFtpXSA9PSAnJCcpIHsKKyAgICAgIGlmIChhc2NpaV9pc2RpZ2l0KGZvcm1hdFtpKzFdKSkgeworICAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSBmb3JtYXRbaSsxXSAtICcwJzsKKyAgICAgICAgYXNzZXJ0KGluZGV4IDwgMTApOworICAgICAgICBjb25zdCBTdWJzdGl0dXRlQXJnKiBzcmMgPSBhcmdzX2FycmF5W2luZGV4XTsKKyAgICAgICAgbWVtY3B5KHRhcmdldCwgc3JjLT5kYXRhKCksIHNyYy0+c2l6ZSgpKTsKKyAgICAgICAgdGFyZ2V0ICs9IHNyYy0+c2l6ZSgpOworICAgICAgICArK2k7ICAvLyBTa2lwIG5leHQgY2hhci4KKyAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2krMV0gPT0gJyQnKSB7CisgICAgICAgICp0YXJnZXQrKyA9ICckJzsKKyAgICAgICAgKytpOyAgLy8gU2tpcCBuZXh0IGNoYXIuCisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICp0YXJnZXQrKyA9IGZvcm1hdFtpXTsKKyAgICB9CisgIH0KKworICBHT09HTEVfRENIRUNLX0VRKHRhcmdldCAtIG91dHB1dC0+ZGF0YSgpLCBvdXRwdXQtPnNpemUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzdHJpbmdzCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY4NTFkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oCkBAIC0wLDAgKzEsMTc4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gZnJvbSBnb29nbGUzL3N0cmluZ3Mvc3Vic3RpdHV0ZS5oCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1VCU1RJVFVURV9IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1VCU1RJVFVURV9IXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHN0cmluZ3MgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdHJpbmdzOjpTdWJzdGl0dXRlKCkKKy8vIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoKQorLy8gICBLaW5kIG9mIGxpa2UgU3RyaW5nUHJpbnRmLCBidXQgZGlmZmVyZW50LgorLy8KKy8vICAgRXhhbXBsZToKKy8vICAgICBzdHJpbmcgR2V0TWVzc2FnZShzdHJpbmcgZmlyc3RfbmFtZSwgc3RyaW5nIGxhc3RfbmFtZSwgaW50IGFnZSkgeworLy8gICAgICAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoIk15IG5hbWUgaXMgJDAgJDEgYW5kIEkgYW0gJDIgeWVhcnMgb2xkLiIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9uYW1lLCBsYXN0X25hbWUsIGFnZSk7CisvLyAgICAgfQorLy8KKy8vICAgRGlmZmVyZW5jZXMgZnJvbSBTdHJpbmdQcmludGY6CisvLyAgICogVGhlIGZvcm1hdCBzdHJpbmcgZG9lcyBub3QgaWRlbnRpZnkgdGhlIHR5cGVzIG9mIGFyZ3VtZW50cy4KKy8vICAgICBJbnN0ZWFkLCB0aGUgbWFnaWMgb2YgQysrIGRlYWxzIHdpdGggdGhpcyBmb3IgdXMuICBTZWUgYmVsb3cKKy8vICAgICBmb3IgYSBsaXN0IG9mIGFjY2VwdGVkIHR5cGVzLgorLy8gICAqIFN1YnN0aXR1dGlvbnMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgYXJlIGlkZW50aWZpZWQgYnkgYSAnJCcKKy8vICAgICBmb2xsb3dlZCBieSBhIGRpZ2l0LiAgU28sIHlvdSBjYW4gdXNlIGFyZ3VtZW50cyBvdXQtb2Ytb3JkZXIgYW5kCisvLyAgICAgdXNlIHRoZSBzYW1lIGFyZ3VtZW50IG11bHRpcGxlIHRpbWVzLgorLy8gICAqIEl0J3MgbXVjaCBmYXN0ZXIgdGhhbiBTdHJpbmdQcmludGYuCisvLworLy8gICBTdXBwb3J0ZWQgdHlwZXM6CisvLyAgICogU3RyaW5ncyAoY29uc3QgY2hhciosIGNvbnN0IHN0cmluZyYpCisvLyAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZWFucyB5b3UgZG8gbm90IGhhdmUgdG8gYWRkIC5jX3N0cigpIHRvIGFsbCBvZgorLy8gICAgICAgeW91ciBzdHJpbmdzLiAgSW4gZmFjdCwgeW91IHNob3VsZG4ndDsgaXQgd2lsbCBiZSBzbG93ZXIuCisvLyAgICogaW50MzIsIGludDY0LCB1aW50MzIsIHVpbnQ2NDogIEZvcm1hdHRlZCB1c2luZyBTaW1wbGVJdG9hKCkuCisvLyAgICogZmxvYXQsIGRvdWJsZTogIEZvcm1hdHRlZCB1c2luZyBTaW1wbGVGdG9hKCkgYW5kIFNpbXBsZUR0b2EoKS4KKy8vICAgKiBib29sOiAgUHJpbnRlZCBhcyAidHJ1ZSIgb3IgImZhbHNlIi4KKy8vCisvLyAgIFN1YnN0aXR1dGVBbmRBcHBlbmQoKSBpcyBsaWtlIFN1YnN0aXR1dGUoKSBidXQgYXBwZW5kcyB0aGUgcmVzdWx0IHRvCisvLyAgICpvdXRwdXQuICBFeGFtcGxlOgorLy8KKy8vICAgICBzdHJpbmcgc3RyOworLy8gICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJnN0ciwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeSBuYW1lIGlzICQwICQxIGFuZCBJIGFtICQyIHllYXJzIG9sZC4iLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfbmFtZSwgbGFzdF9uYW1lLCBhZ2UpOworLy8KKy8vICAgU3Vic3RpdHV0ZSgpIGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gU3RyaW5nUHJpbnRmKCkuICBGb3IgdmVyeQorLy8gICBsYXJnZSBzdHJpbmdzLCBpdCBtYXkgYmUgb3JkZXJzIG9mIG1hZ25pdHVkZSBmYXN0ZXIuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7ICAvLyBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorCitjbGFzcyBTdWJzdGl0dXRlQXJnIHsKKyBwdWJsaWM6CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKGNvbnN0IGNoYXIqIHZhbHVlKQorICAgIDogdGV4dF8odmFsdWUpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQorICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyhjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpCisgICAgICA6IHRleHRfKHZhbHVlLmRhdGEoKSksIHNpemVfKHZhbHVlLnNpemUoKSkge30KKyAgaW5saW5lIFN1YnN0aXR1dGVBcmcoY29uc3QgU3RyaW5nUGllY2UgdmFsdWUpCisgICAgICA6IHRleHRfKHZhbHVlLmRhdGEoKSksIHNpemVfKHZhbHVlLnNpemUoKSkge30KKworICAvLyBJbmRpY2F0ZXMgdGhhdCBubyBhcmd1bWVudCB3YXMgZ2l2ZW4uCisgIGlubGluZSBleHBsaWNpdCBTdWJzdGl0dXRlQXJnKCkKKyAgICA6IHRleHRfKG51bGxwdHIpLCBzaXplXygtMSkge30KKworICAvLyBQcmltaXRpdmVzCisgIC8vIFdlIGRvbid0IG92ZXJsb2FkIGZvciBzaWduZWQgYW5kIHVuc2lnbmVkIGNoYXIgYmVjYXVzZSBpZiBwZW9wbGUgYXJlCisgIC8vIGV4cGxpY2l0bHkgZGVjbGFyaW5nIHRoZWlyIGNoYXJzIGFzIHNpZ25lZCBvciB1bnNpZ25lZCB0aGVuIHRoZXkgYXJlCisgIC8vIHByb2JhYmx5IGFjdHVhbGx5IHVzaW5nIHRoZW0gYXMgOC1iaXQgaW50ZWdlcnMgYW5kIHdvdWxkIHByb2JhYmx5CisgIC8vIHByZWZlciBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uLiAgQnV0LCB3ZSBkb24ndCByZWFsbHkga25vdy4gIFNvLCB3ZQorICAvLyBtYWtlIHRoZSBjYWxsZXIgZGVjaWRlIHdoYXQgdG8gZG8uCisgIGlubGluZSBTdWJzdGl0dXRlQXJnKGNoYXIgdmFsdWUpCisgICAgOiB0ZXh0XyhzY3JhdGNoXyksIHNpemVfKDEpIHsgc2NyYXRjaF9bMF0gPSB2YWx1ZTsgfQorICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyhzaG9ydCB2YWx1ZSkKKyAgICA6IHRleHRfKEZhc3RJbnQzMlRvQnVmZmVyKHZhbHVlLCBzY3JhdGNoXykpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQorICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKKyAgICA6IHRleHRfKEZhc3RVSW50MzJUb0J1ZmZlcih2YWx1ZSwgc2NyYXRjaF8pKSwgc2l6ZV8oc3RybGVuKHRleHRfKSkge30KKyAgaW5saW5lIFN1YnN0aXR1dGVBcmcoaW50IHZhbHVlKQorICAgIDogdGV4dF8oRmFzdEludDMyVG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKHVuc2lnbmVkIGludCB2YWx1ZSkKKyAgICA6IHRleHRfKEZhc3RVSW50MzJUb0J1ZmZlcih2YWx1ZSwgc2NyYXRjaF8pKSwgc2l6ZV8oc3RybGVuKHRleHRfKSkge30KKyAgaW5saW5lIFN1YnN0aXR1dGVBcmcobG9uZyB2YWx1ZSkKKyAgICA6IHRleHRfKEZhc3RMb25nVG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKHVuc2lnbmVkIGxvbmcgdmFsdWUpCisgICAgOiB0ZXh0XyhGYXN0VUxvbmdUb0J1ZmZlcih2YWx1ZSwgc2NyYXRjaF8pKSwgc2l6ZV8oc3RybGVuKHRleHRfKSkge30KKyAgaW5saW5lIFN1YnN0aXR1dGVBcmcobG9uZyBsb25nIHZhbHVlKQorICAgIDogdGV4dF8oRmFzdEludDY0VG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSkKKyAgICA6IHRleHRfKEZhc3RVSW50NjRUb0J1ZmZlcih2YWx1ZSwgc2NyYXRjaF8pKSwgc2l6ZV8oc3RybGVuKHRleHRfKSkge30KKyAgaW5saW5lIFN1YnN0aXR1dGVBcmcoZmxvYXQgdmFsdWUpCisgICAgOiB0ZXh0XyhGbG9hdFRvQnVmZmVyKHZhbHVlLCBzY3JhdGNoXykpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQorICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyhkb3VibGUgdmFsdWUpCisgICAgOiB0ZXh0XyhEb3VibGVUb0J1ZmZlcih2YWx1ZSwgc2NyYXRjaF8pKSwgc2l6ZV8oc3RybGVuKHRleHRfKSkge30KKyAgaW5saW5lIFN1YnN0aXR1dGVBcmcoYm9vbCB2YWx1ZSkKKyAgICA6IHRleHRfKHZhbHVlID8gInRydWUiIDogImZhbHNlIiksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisKKyAgaW5saW5lIGNvbnN0IGNoYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiB0ZXh0XzsgfQorICBpbmxpbmUgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgY2hhciogdGV4dF87CisgIGludCBzaXplXzsKKyAgY2hhciBzY3JhdGNoX1trRmFzdFRvQnVmZmVyU2l6ZV07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworUFJPVE9CVUZfRVhQT1JUIHN0ZDo6c3RyaW5nIFN1YnN0aXR1dGUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZvcm1hdCwKKyAgICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnMCA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgICAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzEgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICAgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmcyID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnMyA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgICAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzQgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICAgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc1ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnNiA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgICAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzcgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICAgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc4ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnOSA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCkpOworCitQUk9UT0JVRl9FWFBPUlQgdm9pZCBTdWJzdGl0dXRlQW5kQXBwZW5kKAorICAgIHN0ZDo6c3RyaW5nKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnMCA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgICAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzEgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICAgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmcyID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnMyA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgICAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzQgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICAgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc1ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnNiA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgICAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzcgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICAgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc4ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnOSA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCkpOworCit9ICAvLyBuYW1lc3BhY2Ugc3RyaW5ncworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAvLyBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1VCU1RJVFVURV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWVmOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsLmgKQEAgLTAsMCArMSwxMzggQEAKKy8vIENvcHlyaWdodCAyMDA1IEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyAtLS0tCisvLyBBdXRob3I6IGxhckBnb29nbGUuY29tIChMYXJhbWllIExlYXZpdHQpCisvLworLy8gVGVtcGxhdGUgbWV0YXByb2dyYW1taW5nIHV0aWxpdHkgZnVuY3Rpb25zLgorLy8KKy8vIFRoaXMgY29kZSBpcyBjb21waWxlZCBkaXJlY3RseSBvbiBtYW55IHBsYXRmb3JtcywgaW5jbHVkaW5nIGNsaWVudAorLy8gcGxhdGZvcm1zIGxpa2UgV2luZG93cywgTWFjLCBhbmQgZW1iZWRkZWQgc3lzdGVtcy4gIEJlZm9yZSBtYWtpbmcKKy8vIGFueSBjaGFuZ2VzIGhlcmUsIG1ha2Ugc3VyZSB0aGF0IHlvdSdyZSBub3QgYnJlYWtpbmcgYW55IHBsYXRmb3Jtcy4KKy8vCisvLworLy8gVGhlIG5hbWVzIGNob3NlbiBoZXJlIHJlZmxlY3QgdGhvc2UgdXNlZCBpbiB0cjEgYW5kIHRoZSBib29zdDo6bXBsCisvLyBsaWJyYXJ5LCB0aGVyZSBhcmUgc2ltaWxhciBvcGVyYXRpb25zIHVzZWQgaW4gdGhlIExva2kgbGlicmFyeSBhcworLy8gd2VsbC4gIEkgcHJlZmVyIHRoZSBib29zdCBuYW1lcyBmb3IgMiByZWFzb25zOgorLy8gMS4gIEkgdGhpbmsgdGhhdCBwb3J0aW9ucyBvZiB0aGUgQm9vc3QgbGlicmFyaWVzIGFyZSBtb3JlIGxpa2VseSB0bworLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGMrKyBzdGFuZGFyZC4KKy8vIDIuICBJdCBpcyBub3QgaW1wb3NzaWJsZSB0aGF0IHNvbWUgb2YgdGhlIGJvb3N0IGxpYnJhcmllcyB3aWxsIGJlCisvLyBpbmNsdWRlZCBpbiBvdXIgb3duIGJ1aWxkIGluIHRoZSBmdXR1cmUuCisvLyBCb3RoIG9mIHRoZXNlIG91dGNvbWVzIG1lYW5zIHRoYXQgd2UgbWF5IGJlIGFibGUgdG8gZGlyZWN0bHkgcmVwbGFjZQorLy8gc29tZSBvZiB0aGVzZSB3aXRoIGJvb3N0IGVxdWl2YWxlbnRzLgorLy8KKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1RFTVBMQVRFX1VUSUxfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1RFTVBMQVRFX1VUSUxfSF8KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVHlwZXMgc21hbGxfIGFuZCBiaWdfIGFyZSBndWFyYW50ZWVkIHN1Y2ggdGhhdCBzaXplb2Yoc21hbGxfKSA8CisvLyBzaXplb2YoYmlnXykKK3R5cGVkZWYgY2hhciBzbWFsbF87CisKK3N0cnVjdCBiaWdfIHsKKyAgY2hhciBkdW1teVsyXTsKK307CisKKy8vIElkZW50aXR5IG1ldGFmdW5jdGlvbi4KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IGlkZW50aXR5XyB7CisgIHR5cGVkZWYgVCB0eXBlOworfTsKKworLy8gaW50ZWdyYWxfY29uc3RhbnQsIGRlZmluZWQgaW4gdHIxLCBpcyBhIHdyYXBwZXIgZm9yIGFuIGludGVnZXIKKy8vIHZhbHVlLiBXZSBkb24ndCByZWFsbHkgbmVlZCB0aGlzIGdlbmVyYWxpdHk7IHdlIGNvdWxkIGdldCBhd2F5CisvLyB3aXRoIGhhcmRjb2RpbmcgdGhlIGludGVnZXIgdHlwZSB0byBib29sLiBXZSB1c2UgdGhlIGZ1bGx5CisvLyBnZW5lcmFsIGludGVnZXJfY29uc3RhbnQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0cjEuCisKK3RlbXBsYXRlPGNsYXNzIFQsIFQgdj4KK3N0cnVjdCBpbnRlZ3JhbF9jb25zdGFudCB7CisgIHN0YXRpYyBjb25zdCBUIHZhbHVlID0gdjsKKyAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8VCwgdj4gdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBUIHY+IGNvbnN0IFQgaW50ZWdyYWxfY29uc3RhbnQ8VCwgdj46OnZhbHVlOworCisKKy8vIEFiYnJldmlhdGlvbnM6IHRydWVfdHlwZSBhbmQgZmFsc2VfdHlwZSBhcmUgc3RydWN0cyB0aGF0IHJlcHJlc2VudCBib29sZWFuCisvLyB0cnVlIGFuZCBmYWxzZSB2YWx1ZXMuIEFsc28gZGVmaW5lIHRoZSBib29zdDo6bXBsIHZlcnNpb25zIG9mIHRob3NlIG5hbWVzLAorLy8gdHJ1ZV8gYW5kIGZhbHNlXy4KK3R5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgdHJ1ZT4gIHRydWVfdHlwZTsKK3R5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZmFsc2U+IGZhbHNlX3R5cGU7Cit0eXBlZGVmIHRydWVfdHlwZSAgdHJ1ZV87Cit0eXBlZGVmIGZhbHNlX3R5cGUgZmFsc2VfOworCisvLyBpZl8gaXMgYSB0ZW1wbGF0aXplZCBjb25kaXRpb25hbCBzdGF0ZW1lbnQuCisvLyBpZl88Y29uZCwgQSwgQj4gaXMgYSBjb21waWxlIHRpbWUgZXZhbHVhdGlvbiBvZiBjb25kLgorLy8gaWZfPD46OnR5cGUgY29udGFpbnMgQSBpZiBjb25kIGlzIHRydWUsIEIgb3RoZXJ3aXNlLgordGVtcGxhdGU8Ym9vbCBjb25kLCB0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorc3RydWN0IGlmX3sKKyAgdHlwZWRlZiBBIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorc3RydWN0IGlmXzxmYWxzZSwgQSwgQj4geworICB0eXBlZGVmIEIgdHlwZTsKK307CisKKworLy8gdHlwZV9lcXVhbHNfIGlzIGEgdGVtcGxhdGUgdHlwZSBjb21wYXJhdG9yLCBzaW1pbGFyIHRvIExva2kgSXNTYW1lVHlwZS4KKy8vIHR5cGVfZXF1YWxzXzxBLCBCPjo6dmFsdWUgaXMgdHJ1ZSBpZmYgIkEiIGlzIHRoZSBzYW1lIHR5cGUgYXMgIkIiLgorLy8KKy8vIE5ldyBjb2RlIHNob3VsZCBwcmVmZXIgYmFzZTo6aXNfc2FtZSwgZGVmaW5lZCBpbiBiYXNlL3R5cGVfdHJhaXRzLmguCisvLyBJdCBpcyBmdW5jdGlvbmFsbHkgaWRlbnRpY2FsLCBidXQgaXNfc2FtZSBpcyB0aGUgc3RhbmRhcmQgc3BlbGxpbmcuCit0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorc3RydWN0IHR5cGVfZXF1YWxzXyA6IHB1YmxpYyBmYWxzZV8geworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQT4KK3N0cnVjdCB0eXBlX2VxdWFsc188QSwgQT4gOiBwdWJsaWMgdHJ1ZV8geworfTsKKworLy8gYW5kXyBpcyBhIHRlbXBsYXRlICYmIG9wZXJhdG9yLgorLy8gYW5kXzxBLCBCPjo6dmFsdWUgZXZhbHVhdGVzICJBOjp2YWx1ZSAmJiBCOjp2YWx1ZSIuCit0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorc3RydWN0IGFuZF8gOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKEE6OnZhbHVlICYmIEI6OnZhbHVlKT4geworfTsKKworLy8gb3JfIGlzIGEgdGVtcGxhdGUgfHwgb3BlcmF0b3IuCisvLyBvcl88QSwgQj46OnZhbHVlIGV2YWx1YXRlcyAiQTo6dmFsdWUgfHwgQjo6dmFsdWUiLgordGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KK3N0cnVjdCBvcl8gOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKEE6OnZhbHVlIHx8IEI6OnZhbHVlKT4geworfTsKKworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9URU1QTEFURV9VVElMX0hfCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3NDVlMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDEzMCBAQAorLy8gQ29weXJpZ2h0IDIwMDUgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIC0tLS0KKy8vIEF1dGhvcjogbGFyQGdvb2dsZS5jb20gKExhcmFtaWUgTGVhdml0dCkKKy8vCisvLyBUaGVzZSB0ZXN0cyBhcmUgcmVhbGx5IGNvbXBpbGUgdGltZSB0ZXN0cy4KKy8vIElmIHlvdSB0cnkgdG8gc3RlcCB0aHJvdWdoIHRoaXMgaW4gYSBkZWJ1Z2dlcgorLy8geW91IHdpbGwgbm90IHNlZSBhbnkgZXZhbHVhdGlvbnMsIG1lcmVseSB0aGF0CisvLyB2YWx1ZSBpcyBhc3NpZ25lZCB0cnVlIG9yIGZhbHNlIHNlcXVlbnRpYWxseS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIEdPT0dMRV9OQU1FU1BBQ0UgPSBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDsKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKK25hbWVzcGFjZSB7CisKK1RFU1QoVGVtcGxhdGVVdGlsVGVzdCwgVGVzdFNpemUpIHsKKyAgRVhQRUNUX0dUKHNpemVvZihHT09HTEVfTkFNRVNQQUNFOjpiaWdfKSwgc2l6ZW9mKEdPT0dMRV9OQU1FU1BBQ0U6OnNtYWxsXykpOworfQorCitURVNUKFRlbXBsYXRlVXRpbFRlc3QsIFRlc3RJbnRlZ3JhbENvbnN0YW50cykgeworICAvLyB0ZXN0IHRoZSBidWlsdC1pbiB0eXBlcy4KKyAgRVhQRUNUX1RSVUUodHJ1ZV90eXBlOjp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShmYWxzZV90eXBlOjp2YWx1ZSk7CisKKyAgdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxpbnQsIDE+IG9uZV90eXBlOworICBFWFBFQ1RfRVEoMSwgb25lX3R5cGU6OnZhbHVlKTsKK30KKworVEVTVChUZW1wbGF0ZVV0aWxUZXN0LCBUZXN0VGVtcGxhdGVJZikgeworICB0eXBlZGVmIGlmXzx0cnVlLCB0cnVlX3R5cGUsIGZhbHNlX3R5cGU+Ojp0eXBlIGlmX3RydWU7CisgIEVYUEVDVF9UUlVFKGlmX3RydWU6OnZhbHVlKTsKKworICB0eXBlZGVmIGlmXzxmYWxzZSwgdHJ1ZV90eXBlLCBmYWxzZV90eXBlPjo6dHlwZSBpZl9mYWxzZTsKKyAgRVhQRUNUX0ZBTFNFKGlmX2ZhbHNlOjp2YWx1ZSk7Cit9CisKK1RFU1QoVGVtcGxhdGVVdGlsVGVzdCwgVGVzdFRlbXBsYXRlVHlwZUVxdWFscykgeworICAvLyBDaGVjayB0aGF0IHRoZSBUZW1wbGF0ZVR5cGVFcXVhbHMgd29ya3MgY29ycmVjdGx5LgorICBib29sIHZhbHVlID0gZmFsc2U7CisKKyAgLy8gVGVzdCB0aGUgc2FtZSB0eXBlIGlzIHRydWUuCisgIHZhbHVlID0gdHlwZV9lcXVhbHNfPGludCwgaW50Pjo6dmFsdWU7CisgIEVYUEVDVF9UUlVFKHZhbHVlKTsKKworICAvLyBUZXN0IGRpZmZlcmVudCB0eXBlcyBhcmUgZmFsc2UuCisgIHZhbHVlID0gdHlwZV9lcXVhbHNfPGZsb2F0LCBpbnQ+Ojp2YWx1ZTsKKyAgRVhQRUNUX0ZBTFNFKHZhbHVlKTsKKworICAvLyBUZXN0IHR5cGUgYWxpYXNpbmcuCisgIHR5cGVkZWYgY29uc3QgaW50IGZvbzsKKyAgdmFsdWUgPSB0eXBlX2VxdWFsc188Y29uc3QgZm9vLCBjb25zdCBpbnQ+Ojp2YWx1ZTsKKyAgRVhQRUNUX1RSVUUodmFsdWUpOworfQorCitURVNUKFRlbXBsYXRlVXRpbFRlc3QsIFRlc3RUZW1wbGF0ZUFuZE9yKSB7CisgIC8vIENoZWNrIHRoYXQgdGhlIFRlbXBsYXRlVHlwZUVxdWFscyB3b3JrcyBjb3JyZWN0bHkuCisgIGJvb2wgdmFsdWUgPSBmYWxzZTsKKworICAvLyBZZXMgJiYgWWVzID09IHRydWUuCisgIHZhbHVlID0gYW5kXzx0cnVlXywgdHJ1ZV8+Ojp2YWx1ZTsKKyAgRVhQRUNUX1RSVUUodmFsdWUpOworICAvLyBZZXMgJiYgTm8gPT0gZmFsc2UuCisgIHZhbHVlID0gYW5kXzx0cnVlXywgZmFsc2VfPjo6dmFsdWU7CisgIEVYUEVDVF9GQUxTRSh2YWx1ZSk7CisgIC8vIE5vICYmIFllcyA9PSBmYWxzZS4KKyAgdmFsdWUgPSBhbmRfPGZhbHNlXywgdHJ1ZV8+Ojp2YWx1ZTsKKyAgRVhQRUNUX0ZBTFNFKHZhbHVlKTsKKyAgLy8gTm8gJiYgTm8gPT0gZmFsc2UuCisgIHZhbHVlID0gYW5kXzxmYWxzZV8sIGZhbHNlXz46OnZhbHVlOworICBFWFBFQ1RfRkFMU0UodmFsdWUpOworCisgIC8vIFllcyB8fCBZZXMgPT0gdHJ1ZS4KKyAgdmFsdWUgPSBvcl88dHJ1ZV8sIHRydWVfPjo6dmFsdWU7CisgIEVYUEVDVF9UUlVFKHZhbHVlKTsKKyAgLy8gWWVzIHx8IE5vID09IHRydWUuCisgIHZhbHVlID0gb3JfPHRydWVfLCBmYWxzZV8+Ojp2YWx1ZTsKKyAgRVhQRUNUX1RSVUUodmFsdWUpOworICAvLyBObyB8fCBZZXMgPT0gdHJ1ZS4KKyAgdmFsdWUgPSBvcl88ZmFsc2VfLCB0cnVlXz46OnZhbHVlOworICBFWFBFQ1RfVFJVRSh2YWx1ZSk7CisgIC8vIE5vIHx8IE5vID09IGZhbHNlLgorICB2YWx1ZSA9IG9yXzxmYWxzZV8sIGZhbHNlXz46OnZhbHVlOworICBFWFBFQ1RfRkFMU0UodmFsdWUpOworfQorCitURVNUKFRlbXBsYXRlVXRpbFRlc3QsIFRlc3RJZGVudGl0eSkgeworICBFWFBFQ1RfVFJVRSgKKyAgICAgICh0eXBlX2VxdWFsc188R09PR0xFX05BTUVTUEFDRTo6aWRlbnRpdHlfPGludD46OnR5cGUsIGludD46OnZhbHVlKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgKHR5cGVfZXF1YWxzXzxHT09HTEVfTkFNRVNQQUNFOjppZGVudGl0eV88dm9pZD46OnR5cGUsIHZvaWQ+Ojp2YWx1ZSkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MmNiODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWUuY2MKQEAgLTAsMCArMSwzNjUgQEAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZS5oPgorCisjaW5jbHVkZSA8Y3RpbWU+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworbmFtZXNwYWNlIHsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtTZWNvbmRzUGVyTWludXRlID0gNjA7CitzdGF0aWMgY29uc3QgaW50NjRfdCBrU2Vjb25kc1BlckhvdXIgPSAzNjAwOworc3RhdGljIGNvbnN0IGludDY0X3Qga1NlY29uZHNQZXJEYXkgPSBrU2Vjb25kc1BlckhvdXIgKiAyNDsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtTZWNvbmRzUGVyNDAwWWVhcnMgPQorICAgIGtTZWNvbmRzUGVyRGF5ICogKDQwMCAqIDM2NSArIDQwMCAvIDQgLSAzKTsKKy8vIFNlY29uZHMgZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwIHRvIDE5NzAtMDEtMDFUOjAwOjAwOjAwCitzdGF0aWMgY29uc3QgaW50NjRfdCBrU2Vjb25kc0Zyb21FcmFUb0Vwb2NoID0gNjIxMzU1OTY4MDBMTDsKKy8vIFRoZSByYW5nZSBvZiB0aW1lc3RhbXAgdmFsdWVzIHdlIHN1cHBvcnQuCitzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluVGltZSA9IC02MjEzNTU5NjgwMExMOyAgLy8gMDAwMS0wMS0wMVQwMDowMDowMAorc3RhdGljIGNvbnN0IGludDY0X3Qga01heFRpbWUgPSAyNTM0MDIzMDA3OTlMTDsgIC8vIDk5OTktMTItMzFUMjM6NTk6NTkKKworc3RhdGljIGNvbnN0IGludCBrTmFub3NQZXJNaWxsaXNlY29uZCA9IDEwMDAwMDA7CitzdGF0aWMgY29uc3QgaW50IGtOYW5vc1Blck1pY3Jvc2Vjb25kID0gMTAwMDsKKworLy8gQ291bnQgdGhlIHNlY29uZHMgZnJvbSB0aGUgZ2l2ZW4geWVhciAoc3RhcnQgYXQgSmFuIDEsIDAwOjAwKSB0byAxMDAgeWVhcnMKKy8vIGFmdGVyLgoraW50NjRfdCBTZWNvbmRzUGVyMTAwWWVhcnMoaW50IHllYXIpIHsKKyAgaWYgKHllYXIgJSA0MDAgPT0gMCB8fCB5ZWFyICUgNDAwID4gMzAwKSB7CisgICAgcmV0dXJuIGtTZWNvbmRzUGVyRGF5ICogKDEwMCAqIDM2NSArIDEwMCAvIDQpOworICB9IGVsc2UgeworICAgIHJldHVybiBrU2Vjb25kc1BlckRheSAqICgxMDAgKiAzNjUgKyAxMDAgLyA0IC0gMSk7CisgIH0KK30KKworLy8gQ291bnQgdGhlIHNlY29uZHMgZnJvbSB0aGUgZ2l2ZW4geWVhciAoc3RhcnQgYXQgSmFuIDEsIDAwOjAwKSB0byA0IHllYXJzCisvLyBhZnRlci4KK2ludDY0X3QgU2Vjb25kc1BlcjRZZWFycyhpbnQgeWVhcikgeworICBpZiAoKHllYXIgJSAxMDAgPT0gMCB8fCB5ZWFyICUgMTAwID4gOTYpICYmCisgICAgICAhKHllYXIgJSA0MDAgPT0gMCB8fCB5ZWFyICUgNDAwID4gMzk2KSkgeworICAgIC8vIE5vIGxlYXAgeWVhcnMuCisgICAgcmV0dXJuIGtTZWNvbmRzUGVyRGF5ICogKDQgKiAzNjUpOworICB9IGVsc2UgeworICAgIC8vIE9uZSBsZWFwIHllYXJzLgorICAgIHJldHVybiBrU2Vjb25kc1BlckRheSAqICg0ICogMzY1ICsgMSk7CisgIH0KK30KKworYm9vbCBJc0xlYXBZZWFyKGludCB5ZWFyKSB7CisgIHJldHVybiB5ZWFyICUgNDAwID09IDAgfHwgKHllYXIgJSA0ID09IDAgJiYgeWVhciAlIDEwMCAhPSAwKTsKK30KKworaW50NjRfdCBTZWNvbmRzUGVyWWVhcihpbnQgeWVhcikgeworICByZXR1cm4ga1NlY29uZHNQZXJEYXkgKiAoSXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NSk7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQga0RheXNJbk1vbnRoWzEzXSA9IHsKKyAgMCwgMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMQorfTsKKworaW50NjRfdCBTZWNvbmRzUGVyTW9udGgoaW50IG1vbnRoLCBib29sIGxlYXApIHsKKyAgaWYgKG1vbnRoID09IDIgJiYgbGVhcCkgeworICAgIHJldHVybiBrU2Vjb25kc1BlckRheSAqIChrRGF5c0luTW9udGhbbW9udGhdICsgMSk7CisgIH0KKyAgcmV0dXJuIGtTZWNvbmRzUGVyRGF5ICoga0RheXNJbk1vbnRoW21vbnRoXTsKK30KKworc3RhdGljIGNvbnN0IGludCBrRGF5c1NpbmNlSmFuWzEzXSA9IHsKKyAgMCwgMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQsCit9OworCitib29sIFZhbGlkYXRlRGF0ZVRpbWUoY29uc3QgRGF0ZVRpbWUmIHRpbWUpIHsKKyAgaWYgKHRpbWUueWVhciA8IDEgfHwgdGltZS55ZWFyID4gOTk5OSB8fAorICAgICAgdGltZS5tb250aCA8IDEgfHwgdGltZS5tb250aCA+IDEyIHx8CisgICAgICB0aW1lLmRheSA8IDEgfHwgdGltZS5kYXkgPiAzMSB8fAorICAgICAgdGltZS5ob3VyIDwgMCB8fCB0aW1lLmhvdXIgPiAyMyB8fAorICAgICAgdGltZS5taW51dGUgPCAwIHx8IHRpbWUubWludXRlID4gNTkgfHwKKyAgICAgIHRpbWUuc2Vjb25kIDwgMCB8fCB0aW1lLnNlY29uZCA+IDU5KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICh0aW1lLm1vbnRoID09IDIgJiYgSXNMZWFwWWVhcih0aW1lLnllYXIpKSB7CisgICAgcmV0dXJuIHRpbWUuZGF5IDw9IGtEYXlzSW5Nb250aFt0aW1lLm1vbnRoXSArIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRpbWUuZGF5IDw9IGtEYXlzSW5Nb250aFt0aW1lLm1vbnRoXTsKKyAgfQorfQorCisvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgZWxhcHNlZCBmcm9tIDAwMDEtMDEtMDFUMDA6MDA6MDAgdG8gdGhlIGdpdmVuCisvLyB0aW1lLgoraW50NjRfdCBTZWNvbmRzU2luY2VDb21tb25FcmEoY29uc3QgRGF0ZVRpbWUmIHRpbWUpIHsKKyAgaW50NjRfdCByZXN1bHQgPSAwOworICAvLyBZZWFycyBzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCA5OTk5LgorICBhc3NlcnQodGltZS55ZWFyID49IDEgJiYgdGltZS55ZWFyIDw9IDk5OTkpOworICBpbnQgeWVhciA9IDE7CisgIGlmICgodGltZS55ZWFyIC0geWVhcikgPj0gNDAwKSB7CisgICAgaW50IGNvdW50XzQwMHllYXJzID0gKHRpbWUueWVhciAtIHllYXIpIC8gNDAwOworICAgIHJlc3VsdCArPSBrU2Vjb25kc1BlcjQwMFllYXJzICogY291bnRfNDAweWVhcnM7CisgICAgeWVhciArPSBjb3VudF80MDB5ZWFycyAqIDQwMDsKKyAgfQorICB3aGlsZSAoKHRpbWUueWVhciAtIHllYXIpID49IDEwMCkgeworICAgIHJlc3VsdCArPSBTZWNvbmRzUGVyMTAwWWVhcnMoeWVhcik7CisgICAgeWVhciArPSAxMDA7CisgIH0KKyAgd2hpbGUgKCh0aW1lLnllYXIgLSB5ZWFyKSA+PSA0KSB7CisgICAgcmVzdWx0ICs9IFNlY29uZHNQZXI0WWVhcnMoeWVhcik7CisgICAgeWVhciArPSA0OworICB9CisgIHdoaWxlICh0aW1lLnllYXIgPiB5ZWFyKSB7CisgICAgcmVzdWx0ICs9IFNlY29uZHNQZXJZZWFyKHllYXIpOworICAgICsreWVhcjsKKyAgfQorICAvLyBNb250aHMgc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMTIuCisgIGFzc2VydCh0aW1lLm1vbnRoID49IDEgJiYgdGltZS5tb250aCA8PSAxMik7CisgIGludCBtb250aCA9IHRpbWUubW9udGg7CisgIHJlc3VsdCArPSBrU2Vjb25kc1BlckRheSAqIGtEYXlzU2luY2VKYW5bbW9udGhdOworICBpZiAobW9udGggPiAyICYmIElzTGVhcFllYXIoeWVhcikpIHsKKyAgICByZXN1bHQgKz0ga1NlY29uZHNQZXJEYXk7CisgIH0KKyAgYXNzZXJ0KHRpbWUuZGF5ID49IDEgJiYKKyAgICAgICAgIHRpbWUuZGF5IDw9IChtb250aCA9PSAyICYmIElzTGVhcFllYXIoeWVhcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBrRGF5c0luTW9udGhbbW9udGhdICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtEYXlzSW5Nb250aFttb250aF0pKTsKKyAgcmVzdWx0ICs9IGtTZWNvbmRzUGVyRGF5ICogKHRpbWUuZGF5IC0gMSk7CisgIHJlc3VsdCArPSBrU2Vjb25kc1BlckhvdXIgKiB0aW1lLmhvdXIgKworICAgICAga1NlY29uZHNQZXJNaW51dGUgKiB0aW1lLm1pbnV0ZSArCisgICAgICB0aW1lLnNlY29uZDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gRm9ybWF0IG5hbm9zZWNvbmRzIHdpdGggZWl0aGVyIDMsIDYsIG9yIDkgZGlnaXRzIGRlcGVuZGluZyBvbiB0aGUgcmVxdWlyZWQKKy8vIHByZWNpc2lvbiB0byByZXByZXNlbnQgdGhlIGV4YWN0IHZhbHVlLgorc3RkOjpzdHJpbmcgRm9ybWF0TmFub3MoaW50MzJfdCBuYW5vcykgeworICBpZiAobmFub3MgJSBrTmFub3NQZXJNaWxsaXNlY29uZCA9PSAwKSB7CisgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiJTAzZCIsIG5hbm9zIC8ga05hbm9zUGVyTWlsbGlzZWNvbmQpOworICB9IGVsc2UgaWYgKG5hbm9zICUga05hbm9zUGVyTWljcm9zZWNvbmQgPT0gMCkgeworICAgIHJldHVybiBTdHJpbmdQcmludGYoIiUwNmQiLCBuYW5vcyAvIGtOYW5vc1Blck1pY3Jvc2Vjb25kKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gU3RyaW5nUHJpbnRmKCIlMDlkIiwgbmFub3MpOworICB9Cit9CisKKy8vIFBhcnNlcyBhbiBpbnRlZ2VyIGZyb20gYSBudWxsLXRlcm1pbmF0ZWQgY2hhciBzZXF1ZW5jZS4gVGhlIG1ldGhvZAorLy8gY29uc3VtZXMgYXQgbW9zdCAid2lkdGgiIGNoYXJzLiBSZXR1cm5zIGEgcG9pbnRlciBhZnRlciB0aGUgY29uc3VtZWQKKy8vIGludGVnZXIsIG9yIG51bGxwdHIgaWYgdGhlIGRhdGEgZG9lcyBub3Qgc3RhcnQgd2l0aCBhbiBpbnRlZ2VyIG9yIHRoZQorLy8gaW50ZWdlciB2YWx1ZSBkb2VzIG5vdCBmYWxsIGluIHRoZSByYW5nZSBvZiBbbWluX3ZhbHVlLCBtYXhfdmFsdWVdLgorY29uc3QgY2hhciogUGFyc2VJbnQoY29uc3QgY2hhciogZGF0YSwgaW50IHdpZHRoLCBpbnQgbWluX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgaW50IG1heF92YWx1ZSwgaW50KiByZXN1bHQpIHsKKyAgaWYgKCFhc2NpaV9pc2RpZ2l0KCpkYXRhKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGludCB2YWx1ZSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7ICsraSwgKytkYXRhKSB7CisgICAgaWYgKGFzY2lpX2lzZGlnaXQoKmRhdGEpKSB7CisgICAgICB2YWx1ZSA9IHZhbHVlICogMTAgKyAoKmRhdGEgLSAnMCcpOworICAgIH0gZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKHZhbHVlID49IG1pbl92YWx1ZSAmJiB2YWx1ZSA8PSBtYXhfdmFsdWUpIHsKKyAgICAqcmVzdWx0ID0gdmFsdWU7CisgICAgcmV0dXJuIGRhdGE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK30KKworLy8gQ29uc3VtZXMgdGhlIGZyYWN0aW9uYWwgcGFydHMgb2YgYSBzZWNvbmQgaW50byBuYW5vcy4gRm9yIGV4YW1wbGUsCisvLyAiMDEwIiB3aWxsIGJlIHBhcnNlZCB0byAxMDAwMDAwMCBuYW5vcy4KK2NvbnN0IGNoYXIqIFBhcnNlTmFub3MoY29uc3QgY2hhciogZGF0YSwgaW50MzJfdCogbmFub3MpIHsKKyAgaWYgKCFhc2NpaV9pc2RpZ2l0KCpkYXRhKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGludCB2YWx1ZSA9IDA7CisgIGludCBsZW4gPSAwOworICAvLyBDb25zdW1lIGFzIG1hbnkgZGlnaXRzIGFzIHRoZXJlIGFyZSBidXQgb25seSB0YWtlIHRoZSBmaXJzdCA5IGludG8KKyAgLy8gYWNjb3VudC4KKyAgd2hpbGUgKGFzY2lpX2lzZGlnaXQoKmRhdGEpKSB7CisgICAgaWYgKGxlbiA8IDkpIHsKKyAgICAgIHZhbHVlID0gdmFsdWUgKiAxMCArICpkYXRhIC0gJzAnOworICAgIH0KKyAgICArK2xlbjsKKyAgICArK2RhdGE7CisgIH0KKyAgd2hpbGUgKGxlbiA8IDkpIHsKKyAgICB2YWx1ZSA9IHZhbHVlICogMTA7CisgICAgKytsZW47CisgIH0KKyAgKm5hbm9zID0gdmFsdWU7CisgIHJldHVybiBkYXRhOworfQorCitjb25zdCBjaGFyKiBQYXJzZVRpbWV6b25lT2Zmc2V0KGNvbnN0IGNoYXIqIGRhdGEsIGludDY0X3QqIG9mZnNldCkgeworICAvLyBBY2NlcHQgZm9ybWF0ICJISDpNTSIuIEUuZy4sICIwODowMCIKKyAgaW50IGhvdXI7CisgIGlmICgoZGF0YSA9IFBhcnNlSW50KGRhdGEsIDIsIDAsIDIzLCAmaG91cikpID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoKmRhdGErKyAhPSAnOicpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpbnQgbWludXRlOworICBpZiAoKGRhdGEgPSBQYXJzZUludChkYXRhLCAyLCAwLCA1OSwgJm1pbnV0ZSkpID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICAqb2Zmc2V0ID0gKGhvdXIgKiA2MCArIG1pbnV0ZSkgKiA2MDsKKyAgcmV0dXJuIGRhdGE7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworYm9vbCBTZWNvbmRzVG9EYXRlVGltZShpbnQ2NF90IHNlY29uZHMsIERhdGVUaW1lKiB0aW1lKSB7CisgIGlmIChzZWNvbmRzIDwga01pblRpbWUgfHwgc2Vjb25kcyA+IGtNYXhUaW1lKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIEl0J3MgZWFzaWVyIHRvIGNhbGN1bGF0ZSB0aGUgRGF0ZVRpbWUgc3RhcnRpbmcgZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwCisgIHNlY29uZHMgPSBzZWNvbmRzICsga1NlY29uZHNGcm9tRXJhVG9FcG9jaDsKKyAgaW50IHllYXIgPSAxOworICBpZiAoc2Vjb25kcyA+PSBrU2Vjb25kc1BlcjQwMFllYXJzKSB7CisgICAgaW50IGNvdW50XzQwMHllYXJzID0gc2Vjb25kcyAvIGtTZWNvbmRzUGVyNDAwWWVhcnM7CisgICAgeWVhciArPSA0MDAgKiBjb3VudF80MDB5ZWFyczsKKyAgICBzZWNvbmRzICU9IGtTZWNvbmRzUGVyNDAwWWVhcnM7CisgIH0KKyAgd2hpbGUgKHNlY29uZHMgPj0gU2Vjb25kc1BlcjEwMFllYXJzKHllYXIpKSB7CisgICAgc2Vjb25kcyAtPSBTZWNvbmRzUGVyMTAwWWVhcnMoeWVhcik7CisgICAgeWVhciArPSAxMDA7CisgIH0KKyAgd2hpbGUgKHNlY29uZHMgPj0gU2Vjb25kc1BlcjRZZWFycyh5ZWFyKSkgeworICAgIHNlY29uZHMgLT0gU2Vjb25kc1BlcjRZZWFycyh5ZWFyKTsKKyAgICB5ZWFyICs9IDQ7CisgIH0KKyAgd2hpbGUgKHNlY29uZHMgPj0gU2Vjb25kc1BlclllYXIoeWVhcikpIHsKKyAgICBzZWNvbmRzIC09IFNlY29uZHNQZXJZZWFyKHllYXIpOworICAgIHllYXIgKz0gMTsKKyAgfQorICBib29sIGxlYXAgPSBJc0xlYXBZZWFyKHllYXIpOworICBpbnQgbW9udGggPSAxOworICB3aGlsZSAoc2Vjb25kcyA+PSBTZWNvbmRzUGVyTW9udGgobW9udGgsIGxlYXApKSB7CisgICAgc2Vjb25kcyAtPSBTZWNvbmRzUGVyTW9udGgobW9udGgsIGxlYXApOworICAgICsrbW9udGg7CisgIH0KKyAgaW50IGRheSA9IDEgKyBzZWNvbmRzIC8ga1NlY29uZHNQZXJEYXk7CisgIHNlY29uZHMgJT0ga1NlY29uZHNQZXJEYXk7CisgIGludCBob3VyID0gc2Vjb25kcyAvIGtTZWNvbmRzUGVySG91cjsKKyAgc2Vjb25kcyAlPSBrU2Vjb25kc1BlckhvdXI7CisgIGludCBtaW51dGUgPSBzZWNvbmRzIC8ga1NlY29uZHNQZXJNaW51dGU7CisgIHNlY29uZHMgJT0ga1NlY29uZHNQZXJNaW51dGU7CisgIHRpbWUtPnllYXIgPSB5ZWFyOworICB0aW1lLT5tb250aCA9IG1vbnRoOworICB0aW1lLT5kYXkgPSBkYXk7CisgIHRpbWUtPmhvdXIgPSBob3VyOworICB0aW1lLT5taW51dGUgPSBtaW51dGU7CisgIHRpbWUtPnNlY29uZCA9IHN0YXRpY19jYXN0PGludD4oc2Vjb25kcyk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIERhdGVUaW1lVG9TZWNvbmRzKGNvbnN0IERhdGVUaW1lJiB0aW1lLCBpbnQ2NF90KiBzZWNvbmRzKSB7CisgIGlmICghVmFsaWRhdGVEYXRlVGltZSh0aW1lKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAqc2Vjb25kcyA9IFNlY29uZHNTaW5jZUNvbW1vbkVyYSh0aW1lKSAtIGtTZWNvbmRzRnJvbUVyYVRvRXBvY2g7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEdldEN1cnJlbnRUaW1lKGludDY0X3QqIHNlY29uZHMsIGludDMyX3QqIG5hbm9zKSB7CisgIC8vIFRPRE8oeGlhb2ZlbmcpOiBJbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGlzIGltcGxlbWVudGF0aW9uIChvciBqdXN0CisgIC8vIHJlbW92ZSB0aGlzIG1ldGhvZCBmcm9tIHByb3RvYnVmKS4KKyAgKnNlY29uZHMgPSB0aW1lKG51bGxwdHIpOworICAqbmFub3MgPSAwOworfQorCitzdGQ6OnN0cmluZyBGb3JtYXRUaW1lKGludDY0X3Qgc2Vjb25kcywgaW50MzJfdCBuYW5vcykgeworICBEYXRlVGltZSB0aW1lOworICBpZiAobmFub3MgPCAwIHx8IG5hbm9zID4gOTk5OTk5OTk5IHx8ICFTZWNvbmRzVG9EYXRlVGltZShzZWNvbmRzLCAmdGltZSkpIHsKKyAgICByZXR1cm4gIkludmFsaWRUaW1lIjsKKyAgfQorICBzdGQ6OnN0cmluZyByZXN1bHQgPQorICAgICAgU3RyaW5nUHJpbnRmKCIlMDRkLSUwMmQtJTAyZFQlMDJkOiUwMmQ6JTAyZCIsIHRpbWUueWVhciwgdGltZS5tb250aCwKKyAgICAgICAgICAgICAgICAgICB0aW1lLmRheSwgdGltZS5ob3VyLCB0aW1lLm1pbnV0ZSwgdGltZS5zZWNvbmQpOworICBpZiAobmFub3MgIT0gMCkgeworICAgIHJlc3VsdCArPSAiLiIgKyBGb3JtYXROYW5vcyhuYW5vcyk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICJaIjsKK30KKworYm9vbCBQYXJzZVRpbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLCBpbnQ2NF90KiBzZWNvbmRzLCBpbnQzMl90KiBuYW5vcykgeworICBEYXRlVGltZSB0aW1lOworICBjb25zdCBjaGFyKiBkYXRhID0gdmFsdWUuY19zdHIoKTsKKyAgLy8gV2Ugb25seSBhY2NlcHQ6CisgIC8vICAgWi1ub3JtYWxpemVkOiAyMDE1LTA1LTIwVDEzOjI5OjM1LjEyMFoKKyAgLy8gICBXaXRoIFVUQyBvZmZzZXQ6IDIwMTUtMDUtMjBUMTM6Mjk6MzUuMTIwLTA4OjAwCisKKyAgLy8gUGFyc2UgeWVhcgorICBpZiAoKGRhdGEgPSBQYXJzZUludChkYXRhLCA0LCAxLCA5OTk5LCAmdGltZS55ZWFyKSkgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBFeHBlY3QgJy0nCisgIGlmICgqZGF0YSsrICE9ICctJykgcmV0dXJuIGZhbHNlOworICAvLyBQYXJzZSBtb250aAorICBpZiAoKGRhdGEgPSBQYXJzZUludChkYXRhLCAyLCAxLCAxMiwgJnRpbWUubW9udGgpKSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIEV4cGVjdCAnLScKKyAgaWYgKCpkYXRhKysgIT0gJy0nKSByZXR1cm4gZmFsc2U7CisgIC8vIFBhcnNlIGRheQorICBpZiAoKGRhdGEgPSBQYXJzZUludChkYXRhLCAyLCAxLCAzMSwgJnRpbWUuZGF5KSkgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBFeHBlY3QgJ1QnCisgIGlmICgqZGF0YSsrICE9ICdUJykgcmV0dXJuIGZhbHNlOworICAvLyBQYXJzZSBob3VyCisgIGlmICgoZGF0YSA9IFBhcnNlSW50KGRhdGEsIDIsIDAsIDIzLCAmdGltZS5ob3VyKSkgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBFeHBlY3QgJzonCisgIGlmICgqZGF0YSsrICE9ICc6JykgcmV0dXJuIGZhbHNlOworICAvLyBQYXJzZSBtaW51dGUKKyAgaWYgKChkYXRhID0gUGFyc2VJbnQoZGF0YSwgMiwgMCwgNTksICZ0aW1lLm1pbnV0ZSkpID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gRXhwZWN0ICc6JworICBpZiAoKmRhdGErKyAhPSAnOicpIHJldHVybiBmYWxzZTsKKyAgLy8gUGFyc2Ugc2Vjb25kCisgIGlmICgoZGF0YSA9IFBhcnNlSW50KGRhdGEsIDIsIDAsIDU5LCAmdGltZS5zZWNvbmQpKSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghRGF0ZVRpbWVUb1NlY29uZHModGltZSwgc2Vjb25kcykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gUGFyc2UgbmFub3NlY29uZHMuCisgIGlmICgqZGF0YSA9PSAnLicpIHsKKyAgICArK2RhdGE7CisgICAgLy8gUGFyc2UgbmFub3NlY29uZHMuCisgICAgaWYgKChkYXRhID0gUGFyc2VOYW5vcyhkYXRhLCBuYW5vcykpID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgKm5hbm9zID0gMDsKKyAgfQorICAvLyBQYXJzZSBVVEMgb2Zmc2V0cy4KKyAgaWYgKCpkYXRhID09ICdaJykgeworICAgICsrZGF0YTsKKyAgfSBlbHNlIGlmICgqZGF0YSA9PSAnKycpIHsKKyAgICArK2RhdGE7CisgICAgaW50NjRfdCBvZmZzZXQ7CisgICAgaWYgKChkYXRhID0gUGFyc2VUaW1lem9uZU9mZnNldChkYXRhLCAmb2Zmc2V0KSkgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqc2Vjb25kcyAtPSBvZmZzZXQ7CisgIH0gZWxzZSBpZiAoKmRhdGEgPT0gJy0nKSB7CisgICAgKytkYXRhOworICAgIGludDY0X3Qgb2Zmc2V0OworICAgIGlmICgoZGF0YSA9IFBhcnNlVGltZXpvbmVPZmZzZXQoZGF0YSwgJm9mZnNldCkpID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgKnNlY29uZHMgKz0gb2Zmc2V0OworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBEb25lIHdpdGggcGFyc2luZy4KKyAgcmV0dXJuICpkYXRhID09IDA7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWUuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNmU1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWUuaApAQCAtMCwwICsxLDgyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX1RJTUVfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX1RJTUVfSF8KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitzdHJ1Y3QgRGF0ZVRpbWUgeworICBpbnQgeWVhcjsKKyAgaW50IG1vbnRoOworICBpbnQgZGF5OworICBpbnQgaG91cjsKKyAgaW50IG1pbnV0ZTsKKyAgaW50IHNlY29uZDsKK307CisKKy8vIENvbnZlcnRzIGEgdGltZXN0YW1wIChzZWNvbmRzIGVsYXBzZWQgc2luY2UgMTk3MC0wMS0wMVQwMDowMDowMCwgY291bGQgYmUKKy8vIG5lZ2F0aXZlIHRvIHJlcHJlc2VudCB0aW1lIGJlZm9yZSAxOTcwLTAxLTAxKSB0byBEYXRlVGltZS4gUmV0dXJucyBmYWxzZQorLy8gaWYgdGhlIHRpbWVzdGFtcCBpcyBub3QgaW4gdGhlIHJhbmdlIGJldHdlZW4gMDAwMS0wMS0wMVQwMDowMDowMCBhbmQKKy8vIDk5OTktMTItMzFUMjM6NTk6NTkuCitib29sIFBST1RPQlVGX0VYUE9SVCBTZWNvbmRzVG9EYXRlVGltZShpbnQ2NF90IHNlY29uZHMsIERhdGVUaW1lKiB0aW1lKTsKKy8vIENvbnZlcnRzIERhdGVUaW1lIHRvIGEgdGltZXN0YW1wIChzZWNvbmRzIHNpbmNlIDE5NzAtMDEtMDFUMDA6MDA6MDApLgorLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgRGF0ZVRpbWUgaXMgbm90IHZhbGlkIG9yIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UuCitib29sIFBST1RPQlVGX0VYUE9SVCBEYXRlVGltZVRvU2Vjb25kcyhjb25zdCBEYXRlVGltZSYgdGltZSwgaW50NjRfdCogc2Vjb25kcyk7CisKK3ZvaWQgUFJPVE9CVUZfRVhQT1JUIEdldEN1cnJlbnRUaW1lKGludDY0X3QqIHNlY29uZHMsIGludDMyX3QqIG5hbm9zKTsKKworLy8gRm9ybWF0cyBhIHRpbWUgc3RyaW5nIGluIFJGQzMzMzkgZm9ybWF0LgorLy8KKy8vIEZvciBleGFtcGxlLCAiMjAxNS0wNS0yMFQxMzoyOTozNS4xMjBaIi4gRm9yIG5hbm9zLCAwLCAzLCA2IG9yIDkgZnJhY3Rpb25hbAorLy8gZGlnaXRzIHdpbGwgYmUgdXNlZCBkZXBlbmRpbmcgb24gaG93IG1hbnkgYXJlIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgZXhhY3QKKy8vIHZhbHVlLgorLy8KKy8vIE5vdGUgdGhhdCAibmFub3MiIG11c3QgaW4gdGhlIHJhbmdlIG9mIFswLCA5OTk5OTk5OTldLgorc3RkOjpzdHJpbmcgUFJPVE9CVUZfRVhQT1JUIEZvcm1hdFRpbWUoaW50NjRfdCBzZWNvbmRzLCBpbnQzMl90IG5hbm9zKTsKKy8vIFBhcnNlcyBhIHRpbWUgc3RyaW5nLiBUaGlzIG1ldGhvZCBhY2NlcHRzIFJGQzMzMzkgZGF0ZS90aW1lIHN0cmluZyB3aXRoIFVUQworLy8gb2Zmc2V0LiBGb3IgZXhhbXBsZSwgIjIwMTUtMDUtMjBUMTM6Mjk6MzUuMTIwLTA4OjAwIi4KK2Jvb2wgUFJPVE9CVUZfRVhQT1JUIFBhcnNlVGltZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsIGludDY0X3QqIHNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogbmFub3MpOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19USU1FX0hfCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWVfdGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZTBhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWVfdGVzdC5jYwpAQCAtMCwwICsxLDI2MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWUuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKK3N0YXRpYyBjb25zdCBpbnQ2NCBrU2Vjb25kc1BlckRheSA9IDM2MDAgKiAyNDsKKworLy8gRm9yIERhdGVUaW1lLCB0ZXN0cyB3aWxsIG1vc3RseSBmb2N1cyBvbiB0aGUgZGF0ZSBwYXJ0IGJlY2F1c2UgdGhhdCdzCisvLyB0aGUgdHJpY2t5IG9uZS4KK2ludDY0IENyZWF0ZVRpbWVzdGFtcChpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5KSB7CisgIERhdGVUaW1lIHRpbWU7CisgIHRpbWUueWVhciA9IHllYXI7CisgIHRpbWUubW9udGggPSBtb250aDsKKyAgdGltZS5kYXkgPSBkYXk7CisgIHRpbWUuaG91ciA9IHRpbWUubWludXRlID0gdGltZS5zZWNvbmQgPSAwOworICBpbnQ2NCByZXN1bHQ7CisgIEdPT0dMRV9DSEVDSyhEYXRlVGltZVRvU2Vjb25kcyh0aW1lLCAmcmVzdWx0KSk7CisgIC8vIENoZWNrIHRoYXQgYSByb3VuZHRyaXAgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0LgorICBHT09HTEVfQ0hFQ0soU2Vjb25kc1RvRGF0ZVRpbWUocmVzdWx0LCAmdGltZSkpOworICBHT09HTEVfQ0hFQ0sodGltZS55ZWFyID09IHllYXIpOworICBHT09HTEVfQ0hFQ0sodGltZS5tb250aCA9PSBtb250aCk7CisgIEdPT0dMRV9DSEVDSyh0aW1lLmRheSA9PSBkYXkpOworICByZXR1cm4gcmVzdWx0OworfQorCitURVNUKERhdGVUaW1lVGVzdCwgU2ltcGxlVGltZSkgeworICBEYXRlVGltZSB0aW1lOworICBBU1NFUlRfVFJVRShTZWNvbmRzVG9EYXRlVGltZSgxLCAmdGltZSkpOworICBFWFBFQ1RfRVEoMTk3MCwgdGltZS55ZWFyKTsKKyAgRVhQRUNUX0VRKDEsIHRpbWUubW9udGgpOworICBFWFBFQ1RfRVEoMSwgdGltZS5kYXkpOworICBFWFBFQ1RfRVEoMCwgdGltZS5ob3VyKTsKKyAgRVhQRUNUX0VRKDAsIHRpbWUubWludXRlKTsKKyAgRVhQRUNUX0VRKDEsIHRpbWUuc2Vjb25kKTsKKyAgaW50NjQgc2Vjb25kczsKKyAgQVNTRVJUX1RSVUUoRGF0ZVRpbWVUb1NlY29uZHModGltZSwgJnNlY29uZHMpKTsKKyAgRVhQRUNUX0VRKDEsIHNlY29uZHMpOworCisgIEFTU0VSVF9UUlVFKFNlY29uZHNUb0RhdGVUaW1lKC0xLCAmdGltZSkpOworICBFWFBFQ1RfRVEoMTk2OSwgdGltZS55ZWFyKTsKKyAgRVhQRUNUX0VRKDEyLCB0aW1lLm1vbnRoKTsKKyAgRVhQRUNUX0VRKDMxLCB0aW1lLmRheSk7CisgIEVYUEVDVF9FUSgyMywgdGltZS5ob3VyKTsKKyAgRVhQRUNUX0VRKDU5LCB0aW1lLm1pbnV0ZSk7CisgIEVYUEVDVF9FUSg1OSwgdGltZS5zZWNvbmQpOworICBBU1NFUlRfVFJVRShEYXRlVGltZVRvU2Vjb25kcyh0aW1lLCAmc2Vjb25kcykpOworICBFWFBFQ1RfRVEoLTEsIHNlY29uZHMpOworCisgIERhdGVUaW1lIHN0YXJ0LCBlbmQ7CisgIHN0YXJ0LnllYXIgPSAxOworICBzdGFydC5tb250aCA9IDE7CisgIHN0YXJ0LmRheSA9IDE7CisgIHN0YXJ0LmhvdXIgPSAwOworICBzdGFydC5taW51dGUgPSAwOworICBzdGFydC5zZWNvbmQgPSAwOworICBlbmQueWVhciA9IDk5OTk7CisgIGVuZC5tb250aCA9IDEyOworICBlbmQuZGF5ID0gMzE7CisgIGVuZC5ob3VyID0gMjM7CisgIGVuZC5taW51dGUgPSA1OTsKKyAgZW5kLnNlY29uZCA9IDU5OworICBpbnQ2NCBzdGFydF90aW1lLCBlbmRfdGltZTsKKyAgQVNTRVJUX1RSVUUoRGF0ZVRpbWVUb1NlY29uZHMoc3RhcnQsICZzdGFydF90aW1lKSk7CisgIEFTU0VSVF9UUlVFKERhdGVUaW1lVG9TZWNvbmRzKGVuZCwgJmVuZF90aW1lKSk7CisgIEVYUEVDVF9FUSgzMTU1Mzc4OTc1OTlMTCwgZW5kX3RpbWUgLSBzdGFydF90aW1lKTsKKyAgQVNTRVJUX1RSVUUoU2Vjb25kc1RvRGF0ZVRpbWUoc3RhcnRfdGltZSwgJnRpbWUpKTsKKyAgQVNTRVJUX1RSVUUoRGF0ZVRpbWVUb1NlY29uZHModGltZSwgJnNlY29uZHMpKTsKKyAgRVhQRUNUX0VRKHN0YXJ0X3RpbWUsIHNlY29uZHMpOworICBBU1NFUlRfVFJVRShTZWNvbmRzVG9EYXRlVGltZShlbmRfdGltZSwgJnRpbWUpKTsKKyAgQVNTRVJUX1RSVUUoRGF0ZVRpbWVUb1NlY29uZHModGltZSwgJnNlY29uZHMpKTsKKyAgRVhQRUNUX0VRKGVuZF90aW1lLCBzZWNvbmRzKTsKK30KKworVEVTVChEYXRlVGltZVRlc3QsIERheUluTW9udGhzKSB7CisgIC8vIENoZWNrIHRoYXQgbW9udGggYm91bmRhcmllcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCisgIEVYUEVDVF9FUShrU2Vjb25kc1BlckRheSwKKyAgICAgICAgICAgIENyZWF0ZVRpbWVzdGFtcCgyMDE1LCAxLCAxKSAtIENyZWF0ZVRpbWVzdGFtcCgyMDE0LCAxMiwgMzEpKTsKKyAgRVhQRUNUX0VRKGtTZWNvbmRzUGVyRGF5LAorICAgICAgICAgICAgQ3JlYXRlVGltZXN0YW1wKDIwMTUsIDIsIDEpIC0gQ3JlYXRlVGltZXN0YW1wKDIwMTUsIDEsIDMxKSk7CisgIEVYUEVDVF9FUShrU2Vjb25kc1BlckRheSwKKyAgICAgICAgICAgIENyZWF0ZVRpbWVzdGFtcCgyMDE1LCAzLCAxKSAtIENyZWF0ZVRpbWVzdGFtcCgyMDE1LCAyLCAyOCkpOworICBFWFBFQ1RfRVEoa1NlY29uZHNQZXJEYXksCisgICAgICAgICAgICBDcmVhdGVUaW1lc3RhbXAoMjAxNSwgNCwgMSkgLSBDcmVhdGVUaW1lc3RhbXAoMjAxNSwgMywgMzEpKTsKKyAgRVhQRUNUX0VRKGtTZWNvbmRzUGVyRGF5LAorICAgICAgICAgICAgQ3JlYXRlVGltZXN0YW1wKDIwMTUsIDUsIDEpIC0gQ3JlYXRlVGltZXN0YW1wKDIwMTUsIDQsIDMwKSk7CisgIEVYUEVDVF9FUShrU2Vjb25kc1BlckRheSwKKyAgICAgICAgICAgIENyZWF0ZVRpbWVzdGFtcCgyMDE1LCA2LCAxKSAtIENyZWF0ZVRpbWVzdGFtcCgyMDE1LCA1LCAzMSkpOworICBFWFBFQ1RfRVEoa1NlY29uZHNQZXJEYXksCisgICAgICAgICAgICBDcmVhdGVUaW1lc3RhbXAoMjAxNSwgNywgMSkgLSBDcmVhdGVUaW1lc3RhbXAoMjAxNSwgNiwgMzApKTsKKyAgRVhQRUNUX0VRKGtTZWNvbmRzUGVyRGF5LAorICAgICAgICAgICAgQ3JlYXRlVGltZXN0YW1wKDIwMTUsIDgsIDEpIC0gQ3JlYXRlVGltZXN0YW1wKDIwMTUsIDcsIDMxKSk7CisgIEVYUEVDVF9FUShrU2Vjb25kc1BlckRheSwKKyAgICAgICAgICAgIENyZWF0ZVRpbWVzdGFtcCgyMDE1LCA5LCAxKSAtIENyZWF0ZVRpbWVzdGFtcCgyMDE1LCA4LCAzMSkpOworICBFWFBFQ1RfRVEoa1NlY29uZHNQZXJEYXksCisgICAgICAgICAgICBDcmVhdGVUaW1lc3RhbXAoMjAxNSwgMTAsIDEpIC0gQ3JlYXRlVGltZXN0YW1wKDIwMTUsIDksIDMwKSk7CisgIEVYUEVDVF9FUShrU2Vjb25kc1BlckRheSwKKyAgICAgICAgICAgIENyZWF0ZVRpbWVzdGFtcCgyMDE1LCAxMSwgMSkgLSBDcmVhdGVUaW1lc3RhbXAoMjAxNSwgMTAsIDMxKSk7CisgIEVYUEVDVF9FUShrU2Vjb25kc1BlckRheSwKKyAgICAgICAgICAgIENyZWF0ZVRpbWVzdGFtcCgyMDE1LCAxMiwgMSkgLSBDcmVhdGVUaW1lc3RhbXAoMjAxNSwgMTEsIDMwKSk7CisgIEVYUEVDVF9FUShrU2Vjb25kc1BlckRheSwKKyAgICAgICAgICAgIENyZWF0ZVRpbWVzdGFtcCgyMDE2LCAxLCAxKSAtIENyZWF0ZVRpbWVzdGFtcCgyMDE1LCAxMiwgMzEpKTsKK30KKworVEVTVChEYXRlVGltZVRlc3QsIExlYXBZZWFyKSB7CisgIC8vIE5vbi1sZWFwIHllYXIuCisgIEVYUEVDVF9FUShrU2Vjb25kc1BlckRheSwKKyAgICAgICAgICAgIENyZWF0ZVRpbWVzdGFtcCgyMDE1LCAzLCAxKSAtIENyZWF0ZVRpbWVzdGFtcCgyMDE1LCAyLCAyOCkpOworICAvLyBMZWFwIHllYXIuCisgIEVYUEVDVF9FUShrU2Vjb25kc1BlckRheSwKKyAgICAgICAgICAgIENyZWF0ZVRpbWVzdGFtcCgyMDE2LCAzLCAxKSAtIENyZWF0ZVRpbWVzdGFtcCgyMDE2LCAyLCAyOSkpOworICAvLyBOb24tbGVhcCB5ZWFyLgorICBFWFBFQ1RfRVEoa1NlY29uZHNQZXJEYXksCisgICAgICAgICAgICBDcmVhdGVUaW1lc3RhbXAoMjEwMCwgMywgMSkgLSBDcmVhdGVUaW1lc3RhbXAoMjEwMCwgMiwgMjgpKTsKKyAgLy8gTGVhcCB5ZWFyLgorICBFWFBFQ1RfRVEoa1NlY29uZHNQZXJEYXksCisgICAgICAgICAgICBDcmVhdGVUaW1lc3RhbXAoMjQwMCwgMywgMSkgLSBDcmVhdGVUaW1lc3RhbXAoMjQwMCwgMiwgMjkpKTsKK30KKworVEVTVChEYXRlVGltZVRlc3QsIFdyb25nRGF5cykgeworICBpbnQ2NCBzZWNvbmRzOworICBEYXRlVGltZSB0aW1lOworICB0aW1lLmhvdXIgPSAwOworICB0aW1lLm1pbnV0ZSA9IDA7CisgIHRpbWUuc2Vjb25kID0gMDsKKyAgdGltZS5tb250aCA9IDI7CisKKyAgLy8gTm9uLWxlYXAgeWVhci4KKyAgdGltZS55ZWFyID0gMjAxNTsKKyAgdGltZS5kYXkgPSAyOTsKKyAgQVNTRVJUX0ZBTFNFKERhdGVUaW1lVG9TZWNvbmRzKHRpbWUsICZzZWNvbmRzKSk7CisKKyAgLy8gTGVhcCB5ZWFyLgorICB0aW1lLnllYXIgPSAyMDE2OworICB0aW1lLmRheSA9IDI5OworICBBU1NFUlRfVFJVRShEYXRlVGltZVRvU2Vjb25kcyh0aW1lLCAmc2Vjb25kcykpOworICB0aW1lLmRheSA9IDMwOworICBBU1NFUlRfRkFMU0UoRGF0ZVRpbWVUb1NlY29uZHModGltZSwgJnNlY29uZHMpKTsKKworICAvLyBOb24tbGVhcCB5ZWFyLgorICB0aW1lLnllYXIgPSAyMTAwOworICB0aW1lLmRheSA9IDI5OworICBBU1NFUlRfRkFMU0UoRGF0ZVRpbWVUb1NlY29uZHModGltZSwgJnNlY29uZHMpKTsKKworICAvLyBMZWFwIHllYXIuCisgIHRpbWUueWVhciA9IDI0MDA7CisgIHRpbWUuZGF5ID0gMjk7CisgIEFTU0VSVF9UUlVFKERhdGVUaW1lVG9TZWNvbmRzKHRpbWUsICZzZWNvbmRzKSk7CisgIHRpbWUuZGF5ID0gMzA7CisgIEFTU0VSVF9GQUxTRShEYXRlVGltZVRvU2Vjb25kcyh0aW1lLCAmc2Vjb25kcykpOworCisgIC8vIE5vbi1mZWJydWFyeQorICB0aW1lLnllYXIgPSAyMDE1OworICB0aW1lLm1vbnRoID0gMTsKKyAgdGltZS5kYXkgPSAwOworICBBU1NFUlRfRkFMU0UoRGF0ZVRpbWVUb1NlY29uZHModGltZSwgJnNlY29uZHMpKTsKKyAgdGltZS5kYXkgPSAxOworICBBU1NFUlRfVFJVRShEYXRlVGltZVRvU2Vjb25kcyh0aW1lLCAmc2Vjb25kcykpOworICB0aW1lLmRheSA9IDMxOworICBBU1NFUlRfVFJVRShEYXRlVGltZVRvU2Vjb25kcyh0aW1lLCAmc2Vjb25kcykpOworICB0aW1lLmRheSA9IDMyOworICBBU1NFUlRfRkFMU0UoRGF0ZVRpbWVUb1NlY29uZHModGltZSwgJnNlY29uZHMpKTsKKworICAvLyBCYWQgbW9udGgKKyAgdGltZS55ZWFyID0gMjAxNTsKKyAgdGltZS5tb250aCA9IDA7CisgIHRpbWUuZGF5ID0gMTsKKyAgQVNTRVJUX0ZBTFNFKERhdGVUaW1lVG9TZWNvbmRzKHRpbWUsICZzZWNvbmRzKSk7CisgIHRpbWUubW9udGggPSAxMzsKKyAgQVNTRVJUX0ZBTFNFKERhdGVUaW1lVG9TZWNvbmRzKHRpbWUsICZzZWNvbmRzKSk7Cit9CisKK1RFU1QoRGF0ZVRpbWVUZXN0LCBTdHJpbmdGb3JtYXQpIHsKKyAgRGF0ZVRpbWUgc3RhcnQsIGVuZDsKKyAgc3RhcnQueWVhciA9IDE7CisgIHN0YXJ0Lm1vbnRoID0gMTsKKyAgc3RhcnQuZGF5ID0gMTsKKyAgc3RhcnQuaG91ciA9IDA7CisgIHN0YXJ0Lm1pbnV0ZSA9IDA7CisgIHN0YXJ0LnNlY29uZCA9IDA7CisgIGVuZC55ZWFyID0gOTk5OTsKKyAgZW5kLm1vbnRoID0gMTI7CisgIGVuZC5kYXkgPSAzMTsKKyAgZW5kLmhvdXIgPSAyMzsKKyAgZW5kLm1pbnV0ZSA9IDU5OworICBlbmQuc2Vjb25kID0gNTk7CisgIGludDY0IHN0YXJ0X3RpbWUsIGVuZF90aW1lOworICBBU1NFUlRfVFJVRShEYXRlVGltZVRvU2Vjb25kcyhzdGFydCwgJnN0YXJ0X3RpbWUpKTsKKyAgQVNTRVJUX1RSVUUoRGF0ZVRpbWVUb1NlY29uZHMoZW5kLCAmZW5kX3RpbWUpKTsKKworICBFWFBFQ1RfRVEoIjAwMDEtMDEtMDFUMDA6MDA6MDBaIiwgRm9ybWF0VGltZShzdGFydF90aW1lLCAwKSk7CisgIEVYUEVDVF9FUSgiOTk5OS0xMi0zMVQyMzo1OTo1OVoiLCBGb3JtYXRUaW1lKGVuZF90aW1lLCAwKSk7CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBuYW5vc2Vjb25kcyBwYXJ0IGlzIGZvcm1hdHRlZCBjb3JyZWN0bHkuCisgIEVYUEVDVF9FUSgiMTk3MC0wMS0wMVQwMDowMDowMC4wMTBaIiwgRm9ybWF0VGltZSgwLCAxMDAwMDAwMCkpOworICBFWFBFQ1RfRVEoIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDAwMDEwWiIsIEZvcm1hdFRpbWUoMCwgMTAwMDApKTsKKyAgRVhQRUNUX0VRKCIxOTcwLTAxLTAxVDAwOjAwOjAwLjAwMDAwMDAxMFoiLCBGb3JtYXRUaW1lKDAsIDEwKSk7Cit9CisKK1RFU1QoRGF0ZVRpbWVUZXN0LCBQYXJzZVN0cmluZykgeworICBpbnQ2NCBzZWNvbmRzOworICBpbnQzMiBuYW5vczsKKyAgQVNTRVJUX1RSVUUoUGFyc2VUaW1lKCIwMDAxLTAxLTAxVDAwOjAwOjAwWiIsICZzZWNvbmRzLCAmbmFub3MpKTsKKyAgRVhQRUNUX0VRKCIwMDAxLTAxLTAxVDAwOjAwOjAwWiIsIEZvcm1hdFRpbWUoc2Vjb25kcywgbmFub3MpKTsKKyAgQVNTRVJUX1RSVUUoUGFyc2VUaW1lKCI5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVoiLCAmc2Vjb25kcywgJm5hbm9zKSk7CisgIEVYUEVDVF9FUSgiOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5OTlaIiwgRm9ybWF0VGltZShzZWNvbmRzLCBuYW5vcykpOworCisgIC8vIFRlc3QgdGltZSB6b25lIG9mZnNldHMuCisgIEFTU0VSVF9UUlVFKFBhcnNlVGltZSgiMTk3MC0wMS0wMVQwMDowMDowMC0wODowMCIsICZzZWNvbmRzLCAmbmFub3MpKTsKKyAgRVhQRUNUX0VRKCIxOTcwLTAxLTAxVDA4OjAwOjAwWiIsIEZvcm1hdFRpbWUoc2Vjb25kcywgbmFub3MpKTsKKyAgQVNTRVJUX1RSVUUoUGFyc2VUaW1lKCIxOTcwLTAxLTAxVDAwOjAwOjAwKzA4OjAwIiwgJnNlY29uZHMsICZuYW5vcykpOworICBFWFBFQ1RfRVEoIjE5NjktMTItMzFUMTY6MDA6MDBaIiwgRm9ybWF0VGltZShzZWNvbmRzLCBuYW5vcykpOworCisgIC8vIFRlc3QgbmFub3NlY29uZHMuCisgIEFTU0VSVF9UUlVFKFBhcnNlVGltZSgiMTk3MC0wMS0wMVQwMDowMDowMC4wMVoiLCAmc2Vjb25kcywgJm5hbm9zKSk7CisgIEVYUEVDVF9FUSgiMTk3MC0wMS0wMVQwMDowMDowMC4wMTBaIiwgRm9ybWF0VGltZShzZWNvbmRzLCBuYW5vcykpOworICBBU1NFUlRfVFJVRShQYXJzZVRpbWUoIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDAwMDEtMDg6MDAiLCAmc2Vjb25kcywgJm5hbm9zKSk7CisgIEVYUEVDVF9FUSgiMTk3MC0wMS0wMVQwODowMDowMC4wMDAwMTBaIiwgRm9ybWF0VGltZShzZWNvbmRzLCBuYW5vcykpOworICBBU1NFUlRfVFJVRShQYXJzZVRpbWUoIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDAwMDAwMDErMDg6MDAiLCAmc2Vjb25kcywgJm5hbm9zKSk7CisgIEVYUEVDVF9FUSgiMTk2OS0xMi0zMVQxNjowMDowMC4wMDAwMDAwMTBaIiwgRm9ybWF0VGltZShzZWNvbmRzLCBuYW5vcykpOworICAvLyBGcmFjdGlvbmFsIHBhcnRzIGxlc3MgdGhhbiAxIG5hbm9zZWNvbmQgd2lsbCBiZSBpZ25vcmVkLgorICBBU1NFUlRfVFJVRShQYXJzZVRpbWUoIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDEyMzQ1Njc4OVoiLCAmc2Vjb25kcywgJm5hbm9zKSk7CisgIEVYUEVDVF9FUSgiMTk3MC0wMS0wMVQwMDowMDowMC4wMTIzNDU2NzhaIiwgRm9ybWF0VGltZShzZWNvbmRzLCBuYW5vcykpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfbWVzc2FnZXNfcHJvdG8yLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X21lc3NhZ2VzX3Byb3RvMi5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2I5YzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X21lc3NhZ2VzX3Byb3RvMi5wcm90bwpAQCAtMCwwICsxLDI5NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gVGVzdCBzY2hlbWEgZm9yIHByb3RvMiBtZXNzYWdlcy4gIFRoaXMgdGVzdCBzY2hlbWEgaXMgdXNlZCBieToKKy8vCisvLyAtIGNvbmZvcm1hbmNlIHRlc3RzCisvLworCisvLyBMSU5UOiBBTExPV19HUk9VUFMKKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgcHJvdG9idWZfdGVzdF9tZXNzYWdlcy5wcm90bzI7CisKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1Zl90ZXN0X21lc3NhZ2VzLnByb3RvMiI7CisKKy8vIFRoaXMgaXMgdGhlIGRlZmF1bHQsIGJ1dCB3ZSBzcGVjaWZ5IGl0IGhlcmUgZXhwbGljaXRseS4KK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKKworb3B0aW9uIGNjX2VuYWJsZV9hcmVuYXMgPSB0cnVlOworCisvLyBUaGlzIHByb3RvIGluY2x1ZGVzIGV2ZXJ5IHR5cGUgb2YgZmllbGQgaW4gYm90aCBzaW5ndWxhciBhbmQgcmVwZWF0ZWQKKy8vIGZvcm1zLgorLy8KKy8vIEFsc28sIGNydWNpYWxseSwgYWxsIG1lc3NhZ2VzIGFuZCBlbnVtcyBpbiB0aGlzIGZpbGUgYXJlIGV2ZW50dWFsbHkKKy8vIHN1Ym1lc3NhZ2VzIG9mIHRoaXMgbWVzc2FnZS4gIFNvIGZvciBleGFtcGxlLCBhIGZ1enogdGVzdCBvZiBUZXN0QWxsVHlwZXMKKy8vIGNvdWxkIHRyaWdnZXIgYnVncyB0aGF0IG9jY3VyIGluIGFueSBtZXNzYWdlIHR5cGUgaW4gdGhpcyBmaWxlLiAgV2UgdmVyaWZ5CisvLyB0aGlzIHN0YXlzIHRydWUgaW4gYSB1bml0IHRlc3QuCittZXNzYWdlIFRlc3RBbGxUeXBlc1Byb3RvMiB7CisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDE7CisgICAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzUHJvdG8yIGNvcmVjdXJzaXZlID0gMjsKKyAgfQorCisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgRk9PID0gMDsKKyAgICBCQVIgPSAxOworICAgIEJBWiA9IDI7CisgICAgTkVHID0gLTE7ICAvLyBJbnRlbnRpb25hbGx5IG5lZ2F0aXZlLgorICB9CisKKyAgLy8gU2luZ3VsYXIKKyAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzIgPSAxOworICBvcHRpb25hbCBpbnQ2NCBvcHRpb25hbF9pbnQ2NCA9IDI7CisgIG9wdGlvbmFsIHVpbnQzMiBvcHRpb25hbF91aW50MzIgPSAzOworICBvcHRpb25hbCB1aW50NjQgb3B0aW9uYWxfdWludDY0ID0gNDsKKyAgb3B0aW9uYWwgc2ludDMyIG9wdGlvbmFsX3NpbnQzMiA9IDU7CisgIG9wdGlvbmFsIHNpbnQ2NCBvcHRpb25hbF9zaW50NjQgPSA2OworICBvcHRpb25hbCBmaXhlZDMyIG9wdGlvbmFsX2ZpeGVkMzIgPSA3OworICBvcHRpb25hbCBmaXhlZDY0IG9wdGlvbmFsX2ZpeGVkNjQgPSA4OworICBvcHRpb25hbCBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMiA9IDk7CisgIG9wdGlvbmFsIHNmaXhlZDY0IG9wdGlvbmFsX3NmaXhlZDY0ID0gMTA7CisgIG9wdGlvbmFsIGZsb2F0IG9wdGlvbmFsX2Zsb2F0ID0gMTE7CisgIG9wdGlvbmFsIGRvdWJsZSBvcHRpb25hbF9kb3VibGUgPSAxMjsKKyAgb3B0aW9uYWwgYm9vbCBvcHRpb25hbF9ib29sID0gMTM7CisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9zdHJpbmcgPSAxNDsKKyAgb3B0aW9uYWwgYnl0ZXMgb3B0aW9uYWxfYnl0ZXMgPSAxNTsKKworICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlID0gMTg7CisgIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlUHJvdG8yIG9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSA9IDE5OworCisgIG9wdGlvbmFsIE5lc3RlZEVudW0gb3B0aW9uYWxfbmVzdGVkX2VudW0gPSAyMTsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW1Qcm90bzIgb3B0aW9uYWxfZm9yZWlnbl9lbnVtID0gMjI7CisKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZSA9IDI0IFtjdHlwZSA9IFNUUklOR19QSUVDRV07CisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9jb3JkID0gMjUgW2N0eXBlID0gQ09SRF07CisKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzUHJvdG8yIHJlY3Vyc2l2ZV9tZXNzYWdlID0gMjc7CisKKyAgLy8gUmVwZWF0ZWQKKyAgcmVwZWF0ZWQgaW50MzIgcmVwZWF0ZWRfaW50MzIgPSAzMTsKKyAgcmVwZWF0ZWQgaW50NjQgcmVwZWF0ZWRfaW50NjQgPSAzMjsKKyAgcmVwZWF0ZWQgdWludDMyIHJlcGVhdGVkX3VpbnQzMiA9IDMzOworICByZXBlYXRlZCB1aW50NjQgcmVwZWF0ZWRfdWludDY0ID0gMzQ7CisgIHJlcGVhdGVkIHNpbnQzMiByZXBlYXRlZF9zaW50MzIgPSAzNTsKKyAgcmVwZWF0ZWQgc2ludDY0IHJlcGVhdGVkX3NpbnQ2NCA9IDM2OworICByZXBlYXRlZCBmaXhlZDMyIHJlcGVhdGVkX2ZpeGVkMzIgPSAzNzsKKyAgcmVwZWF0ZWQgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ID0gMzg7CisgIHJlcGVhdGVkIHNmaXhlZDMyIHJlcGVhdGVkX3NmaXhlZDMyID0gMzk7CisgIHJlcGVhdGVkIHNmaXhlZDY0IHJlcGVhdGVkX3NmaXhlZDY0ID0gNDA7CisgIHJlcGVhdGVkIGZsb2F0IHJlcGVhdGVkX2Zsb2F0ID0gNDE7CisgIHJlcGVhdGVkIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgPSA0MjsKKyAgcmVwZWF0ZWQgYm9vbCByZXBlYXRlZF9ib29sID0gNDM7CisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9zdHJpbmcgPSA0NDsKKyAgcmVwZWF0ZWQgYnl0ZXMgcmVwZWF0ZWRfYnl0ZXMgPSA0NTsKKworICByZXBlYXRlZCBOZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlID0gNDg7CisgIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlUHJvdG8yIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSA9IDQ5OworCisgIHJlcGVhdGVkIE5lc3RlZEVudW0gcmVwZWF0ZWRfbmVzdGVkX2VudW0gPSA1MTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW1Qcm90bzIgcmVwZWF0ZWRfZm9yZWlnbl9lbnVtID0gNTI7CisKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZ19waWVjZSA9IDU0IFtjdHlwZSA9IFNUUklOR19QSUVDRV07CisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9jb3JkID0gNTUgW2N0eXBlID0gQ09SRF07CisKKyAgLy8gUGFja2VkCisgIHJlcGVhdGVkIGludDMyIHBhY2tlZF9pbnQzMiA9IDc1IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgaW50NjQgcGFja2VkX2ludDY0ID0gNzYgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCB1aW50MzIgcGFja2VkX3VpbnQzMiA9IDc3IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgdWludDY0IHBhY2tlZF91aW50NjQgPSA3OCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNpbnQzMiBwYWNrZWRfc2ludDMyID0gNzkgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzaW50NjQgcGFja2VkX3NpbnQ2NCA9IDgwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgZml4ZWQzMiBwYWNrZWRfZml4ZWQzMiA9IDgxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgZml4ZWQ2NCBwYWNrZWRfZml4ZWQ2NCA9IDgyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcGFja2VkX3NmaXhlZDMyID0gODMgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQ2NCBwYWNrZWRfc2ZpeGVkNjQgPSA4NCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIGZsb2F0IHBhY2tlZF9mbG9hdCA9IDg1IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgZG91YmxlIHBhY2tlZF9kb3VibGUgPSA4NiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIGJvb2wgcGFja2VkX2Jvb2wgPSA4NyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIE5lc3RlZEVudW0gcGFja2VkX25lc3RlZF9lbnVtID0gODggW3BhY2tlZCA9IHRydWVdOworCisgIC8vIFVucGFja2VkCisgIHJlcGVhdGVkIGludDMyIHVucGFja2VkX2ludDMyID0gODkgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgaW50NjQgdW5wYWNrZWRfaW50NjQgPSA5MCBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCB1aW50MzIgdW5wYWNrZWRfdWludDMyID0gOTEgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgdWludDY0IHVucGFja2VkX3VpbnQ2NCA9IDkyIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHNpbnQzMiB1bnBhY2tlZF9zaW50MzIgPSA5MyBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBzaW50NjQgdW5wYWNrZWRfc2ludDY0ID0gOTQgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgZml4ZWQzMiB1bnBhY2tlZF9maXhlZDMyID0gOTUgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgZml4ZWQ2NCB1bnBhY2tlZF9maXhlZDY0ID0gOTYgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgdW5wYWNrZWRfc2ZpeGVkMzIgPSA5NyBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBzZml4ZWQ2NCB1bnBhY2tlZF9zZml4ZWQ2NCA9IDk4IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIGZsb2F0IHVucGFja2VkX2Zsb2F0ID0gOTkgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgZG91YmxlIHVucGFja2VkX2RvdWJsZSA9IDEwMCBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBib29sIHVucGFja2VkX2Jvb2wgPSAxMDEgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgTmVzdGVkRW51bSB1bnBhY2tlZF9uZXN0ZWRfZW51bSA9IDEwMiBbcGFja2VkID0gZmFsc2VdOworCisgIC8vIE1hcAorICBtYXA8aW50MzIsIGludDMyPiBtYXBfaW50MzJfaW50MzIgPSA1NjsKKyAgbWFwPGludDY0LCBpbnQ2ND4gbWFwX2ludDY0X2ludDY0ID0gNTc7CisgIG1hcDx1aW50MzIsIHVpbnQzMj4gbWFwX3VpbnQzMl91aW50MzIgPSA1ODsKKyAgbWFwPHVpbnQ2NCwgdWludDY0PiBtYXBfdWludDY0X3VpbnQ2NCA9IDU5OworICBtYXA8c2ludDMyLCBzaW50MzI+IG1hcF9zaW50MzJfc2ludDMyID0gNjA7CisgIG1hcDxzaW50NjQsIHNpbnQ2ND4gbWFwX3NpbnQ2NF9zaW50NjQgPSA2MTsKKyAgbWFwPGZpeGVkMzIsIGZpeGVkMzI+IG1hcF9maXhlZDMyX2ZpeGVkMzIgPSA2MjsKKyAgbWFwPGZpeGVkNjQsIGZpeGVkNjQ+IG1hcF9maXhlZDY0X2ZpeGVkNjQgPSA2MzsKKyAgbWFwPHNmaXhlZDMyLCBzZml4ZWQzMj4gbWFwX3NmaXhlZDMyX3NmaXhlZDMyID0gNjQ7CisgIG1hcDxzZml4ZWQ2NCwgc2ZpeGVkNjQ+IG1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCA9IDY1OworICBtYXA8aW50MzIsIGZsb2F0PiBtYXBfaW50MzJfZmxvYXQgPSA2NjsKKyAgbWFwPGludDMyLCBkb3VibGU+IG1hcF9pbnQzMl9kb3VibGUgPSA2NzsKKyAgbWFwPGJvb2wsIGJvb2w+IG1hcF9ib29sX2Jvb2wgPSA2ODsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBtYXBfc3RyaW5nX3N0cmluZyA9IDY5OworICBtYXA8c3RyaW5nLCBieXRlcz4gbWFwX3N0cmluZ19ieXRlcyA9IDcwOworICBtYXA8c3RyaW5nLCBOZXN0ZWRNZXNzYWdlPiBtYXBfc3RyaW5nX25lc3RlZF9tZXNzYWdlID0gNzE7CisgIG1hcDxzdHJpbmcsIEZvcmVpZ25NZXNzYWdlUHJvdG8yPiBtYXBfc3RyaW5nX2ZvcmVpZ25fbWVzc2FnZSA9IDcyOworICBtYXA8c3RyaW5nLCBOZXN0ZWRFbnVtPiBtYXBfc3RyaW5nX25lc3RlZF9lbnVtID0gNzM7CisgIG1hcDxzdHJpbmcsIEZvcmVpZ25FbnVtUHJvdG8yPiBtYXBfc3RyaW5nX2ZvcmVpZ25fZW51bSA9IDc0OworCisgIG9uZW9mIG9uZW9mX2ZpZWxkIHsKKyAgICB1aW50MzIgb25lb2ZfdWludDMyID0gMTExOworICAgIE5lc3RlZE1lc3NhZ2Ugb25lb2ZfbmVzdGVkX21lc3NhZ2UgPSAxMTI7CisgICAgc3RyaW5nIG9uZW9mX3N0cmluZyA9IDExMzsKKyAgICBieXRlcyBvbmVvZl9ieXRlcyA9IDExNDsKKyAgICBib29sIG9uZW9mX2Jvb2wgPSAxMTU7CisgICAgdWludDY0IG9uZW9mX3VpbnQ2NCA9IDExNjsKKyAgICBmbG9hdCBvbmVvZl9mbG9hdCA9IDExNzsKKyAgICBkb3VibGUgb25lb2ZfZG91YmxlID0gMTE4OworICAgIE5lc3RlZEVudW0gb25lb2ZfZW51bSA9IDExOTsKKyAgfQorCisgIC8vIGV4dGVuc2lvbnMKKyAgZXh0ZW5zaW9ucyAxMjAgdG8gMjAwOworCisgIC8vIGdyb3VwcworICBvcHRpb25hbCBncm91cCBEYXRhID0gMjAxIHsKKyAgICBvcHRpb25hbCBpbnQzMiBncm91cF9pbnQzMiA9IDIwMjsKKyAgICBvcHRpb25hbCB1aW50MzIgZ3JvdXBfdWludDMyID0gMjAzOworICB9CisKKyAgLy8gZGVmYXVsdCB2YWx1ZXMKKyAgb3B0aW9uYWwgaW50MzIgZGVmYXVsdF9pbnQzMiA9IDI0MSBbIGRlZmF1bHQgPSAtMTIzNDU2Nzg5XTsKKyAgb3B0aW9uYWwgaW50NjQgZGVmYXVsdF9pbnQ2NCA9IDI0MiBbIGRlZmF1bHQgPSAtOTEyMzQ1Njc4OTEyMzQ1Njc4OV07CisgIG9wdGlvbmFsIHVpbnQzMiBkZWZhdWx0X3VpbnQzMiA9IDI0MyBbIGRlZmF1bHQgPSAyMTIzNDU2Nzg5XTsKKyAgb3B0aW9uYWwgdWludDY0IGRlZmF1bHRfdWludDY0ID0gMjQ0IFsgZGVmYXVsdCA9IDEwMTIzNDU2Nzg5MTIzNDU2Nzg5XTsKKyAgb3B0aW9uYWwgc2ludDMyIGRlZmF1bHRfc2ludDMyID0gMjQ1IFsgZGVmYXVsdCA9IC0xMjM0NTY3ODldOworICBvcHRpb25hbCBzaW50NjQgZGVmYXVsdF9zaW50NjQgPSAyNDYgW2RlZmF1bHQgPSAtOTEyMzQ1Njc4OTEyMzQ1Njc4OV07CisgIG9wdGlvbmFsIGZpeGVkMzIgZGVmYXVsdF9maXhlZDMyID0gMjQ3IFsgZGVmYXVsdCA9IDIxMjM0NTY3ODldOworICBvcHRpb25hbCBmaXhlZDY0IGRlZmF1bHRfZml4ZWQ2NCA9IDI0OCBbIGRlZmF1bHQgPSAxMDEyMzQ1Njc4OTEyMzQ1Njc4OV07CisgIG9wdGlvbmFsIHNmaXhlZDMyIGRlZmF1bHRfc2ZpeGVkMzIgPSAyNDkgWyBkZWZhdWx0ID0gLTEyMzQ1Njc4OV07CisgIG9wdGlvbmFsIHNmaXhlZDY0IGRlZmF1bHRfc2ZpeGVkNjQgPSAyNTAgW2RlZmF1bHQgPSAtOTEyMzQ1Njc4OTEyMzQ1Njc4OV07CisgIG9wdGlvbmFsIGZsb2F0IGRlZmF1bHRfZmxvYXQgPSAyNTEgWyBkZWZhdWx0ID0gOWU5XTsKKyAgb3B0aW9uYWwgZG91YmxlIGRlZmF1bHRfZG91YmxlID0gMjUyIFsgZGVmYXVsdCA9IDdlMjJdOworICBvcHRpb25hbCBib29sIGRlZmF1bHRfYm9vbCA9IDI1MyBbIGRlZmF1bHQgPSB0cnVlXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nID0gMjU0IFsgZGVmYXVsdCA9ICJSb3NlYnVkIl07CisgIG9wdGlvbmFsIGJ5dGVzIGRlZmF1bHRfYnl0ZXMgPSAyNTUgWyBkZWZhdWx0ID0gImpvc2h1YSJdOworCisgIC8vIFRlc3QgZmllbGQtbmFtZS10by1KU09OLW5hbWUgY29udmVudGlvbi4KKyAgLy8gKHByb3RvYnVmIHNheXMgbmFtZXMgY2FuIGJlIGFueSB2YWxpZCBDL0MrKyBpZGVudGlmaWVyLikKKyAgb3B0aW9uYWwgaW50MzIgZmllbGRuYW1lMSA9IDQwMTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGRfbmFtZTIgPSA0MDI7CisgIG9wdGlvbmFsIGludDMyIF9maWVsZF9uYW1lMyA9IDQwMzsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGRfX25hbWU0XyA9IDQwNDsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQwbmFtZTUgPSA0MDU7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkXzBfbmFtZTYgPSA0MDY7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkTmFtZTcgPSA0MDc7CisgIG9wdGlvbmFsIGludDMyIEZpZWxkTmFtZTggPSA0MDg7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkX05hbWU5ID0gNDA5OworICBvcHRpb25hbCBpbnQzMiBGaWVsZF9OYW1lMTAgPSA0MTA7CisgIG9wdGlvbmFsIGludDMyIEZJRUxEX05BTUUxMSA9IDQxMTsKKyAgb3B0aW9uYWwgaW50MzIgRklFTERfbmFtZTEyID0gNDEyOworICBvcHRpb25hbCBpbnQzMiBfX2ZpZWxkX25hbWUxMyA9IDQxMzsKKyAgb3B0aW9uYWwgaW50MzIgX19GaWVsZF9uYW1lMTQgPSA0MTQ7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkX19uYW1lMTUgPSA0MTU7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkX19OYW1lMTYgPSA0MTY7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkX25hbWUxN19fID0gNDE3OworICBvcHRpb25hbCBpbnQzMiBGaWVsZF9uYW1lMThfXyA9IDQxODsKKworICAvLyBSZXNlcnZlZCBmb3IgdW5rbm93biBmaWVsZHMgdGVzdC4KKyAgcmVzZXJ2ZWQgMTAwMCB0byA5OTk5OworCisgIC8vIG1lc3NhZ2Vfc2V0IHRlc3QgY2FzZS4KKyAgbWVzc2FnZSBNZXNzYWdlU2V0Q29ycmVjdCB7CisgICAgb3B0aW9uIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gdHJ1ZTsKKworICAgIGV4dGVuc2lvbnMgNCB0byBtYXg7CisgIH0KKworICBtZXNzYWdlIE1lc3NhZ2VTZXRDb3JyZWN0RXh0ZW5zaW9uMSB7CisgICAgZXh0ZW5kIE1lc3NhZ2VTZXRDb3JyZWN0IHsKKyAgICAgIG9wdGlvbmFsIE1lc3NhZ2VTZXRDb3JyZWN0RXh0ZW5zaW9uMSBtZXNzYWdlX3NldF9leHRlbnNpb24gPSAxNTQ3NzY5OworICAgIH0KKyAgICBvcHRpb25hbCBzdHJpbmcgc3RyID0gMjU7CisgIH0KKworICBtZXNzYWdlIE1lc3NhZ2VTZXRDb3JyZWN0RXh0ZW5zaW9uMiB7CisgICAgZXh0ZW5kIE1lc3NhZ2VTZXRDb3JyZWN0IHsKKyAgICAgIG9wdGlvbmFsIE1lc3NhZ2VTZXRDb3JyZWN0RXh0ZW5zaW9uMiBtZXNzYWdlX3NldF9leHRlbnNpb24gPSA0MTM1MzEyOworICAgIH0KKyAgICBvcHRpb25hbCBpbnQzMiBpID0gOTsKKyAgfQorfQorCittZXNzYWdlIEZvcmVpZ25NZXNzYWdlUHJvdG8yIHsKKyAgb3B0aW9uYWwgaW50MzIgYyA9IDE7Cit9CisKK2VudW0gRm9yZWlnbkVudW1Qcm90bzIgeworICBGT1JFSUdOX0ZPTyA9IDA7CisgIEZPUkVJR05fQkFSID0gMTsKKyAgRk9SRUlHTl9CQVogPSAyOworfQorCitleHRlbmQgVGVzdEFsbFR5cGVzUHJvdG8yIHsKKyAgb3B0aW9uYWwgaW50MzIgZXh0ZW5zaW9uX2ludDMyID0gMTIwOworfQorCittZXNzYWdlIFVua25vd25Ub1Rlc3RBbGxUeXBlcyB7CisgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyID0gMTAwMTsKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZyA9IDEwMDI7CisgIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlUHJvdG8yIG5lc3RlZF9tZXNzYWdlID0gMTAwMzsKKyAgb3B0aW9uYWwgZ3JvdXAgT3B0aW9uYWxHcm91cCA9IDEwMDQgeworICAgIG9wdGlvbmFsIGludDMyIGEgPSAxOworICB9CisgIG9wdGlvbmFsIGJvb2wgb3B0aW9uYWxfYm9vbCA9IDEwMDY7CisgIHJlcGVhdGVkIGludDMyIHJlcGVhdGVkX2ludDMyID0gMTAxMTsKK30KKworbWVzc2FnZSBOdWxsSHlwb3RoZXNpc1Byb3RvMiB7Cit9CisKK21lc3NhZ2UgRW51bU9ubHlQcm90bzIgeworICBlbnVtIEJvb2wgeworICAgIGtGYWxzZSA9IDA7CisgICAga1RydWUgPSAxOworICB9Cit9CisKK21lc3NhZ2UgT25lU3RyaW5nUHJvdG8yIHsKKyAgb3B0aW9uYWwgc3RyaW5nIGRhdGEgPSAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X21lc3NhZ2VzX3Byb3RvMy5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF9tZXNzYWdlc19wcm90bzMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxMjg1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF9tZXNzYWdlc19wcm90bzMucHJvdG8KQEAgLTAsMCArMSwyODggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIFRlc3Qgc2NoZW1hIGZvciBwcm90bzMgbWVzc2FnZXMuICBUaGlzIHRlc3Qgc2NoZW1hIGlzIHVzZWQgYnk6CisvLworLy8gLSBiZW5jaG1hcmtzCisvLyAtIGZ1enogdGVzdHMKKy8vIC0gY29uZm9ybWFuY2UgdGVzdHMKKy8vCisKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIHByb3RvYnVmX3Rlc3RfbWVzc2FnZXMucHJvdG8zOworCitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWZfdGVzdF9tZXNzYWdlcy5wcm90bzMiOworb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gIlByb3RvMyI7CisKKy8vIFRoaXMgaXMgdGhlIGRlZmF1bHQsIGJ1dCB3ZSBzcGVjaWZ5IGl0IGhlcmUgZXhwbGljaXRseS4KK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8iOworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byI7CitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90byI7CisKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKKworLy8gVGhpcyBwcm90byBpbmNsdWRlcyBldmVyeSB0eXBlIG9mIGZpZWxkIGluIGJvdGggc2luZ3VsYXIgYW5kIHJlcGVhdGVkCisvLyBmb3Jtcy4KKy8vCisvLyBBbHNvLCBjcnVjaWFsbHksIGFsbCBtZXNzYWdlcyBhbmQgZW51bXMgaW4gdGhpcyBmaWxlIGFyZSBldmVudHVhbGx5CisvLyBzdWJtZXNzYWdlcyBvZiB0aGlzIG1lc3NhZ2UuICBTbyBmb3IgZXhhbXBsZSwgYSBmdXp6IHRlc3Qgb2YgVGVzdEFsbFR5cGVzCisvLyBjb3VsZCB0cmlnZ2VyIGJ1Z3MgdGhhdCBvY2N1ciBpbiBhbnkgbWVzc2FnZSB0eXBlIGluIHRoaXMgZmlsZS4gIFdlIHZlcmlmeQorLy8gdGhpcyBzdGF5cyB0cnVlIGluIGEgdW5pdCB0ZXN0LgorbWVzc2FnZSBUZXN0QWxsVHlwZXNQcm90bzMgeworICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICAgIGludDMyIGEgPSAxOworICAgIFRlc3RBbGxUeXBlc1Byb3RvMyBjb3JlY3Vyc2l2ZSA9IDI7CisgIH0KKworICBlbnVtIE5lc3RlZEVudW0geworICAgIEZPTyA9IDA7CisgICAgQkFSID0gMTsKKyAgICBCQVogPSAyOworICAgIE5FRyA9IC0xOyAgLy8gSW50ZW50aW9uYWxseSBuZWdhdGl2ZS4KKyAgfQorCisgIGVudW0gQWxpYXNlZEVudW0geworICAgIG9wdGlvbiBhbGxvd19hbGlhcyA9IHRydWU7CisKKyAgICBBTElBU19GT08gPSAwOworICAgIEFMSUFTX0JBUiA9IDE7CisgICAgQUxJQVNfQkFaID0gMjsKKyAgICBNT08gPSAyOworICAgIG1vbyA9IDI7CisgICAgYkF6ID0gMjsKKyAgfQorCisgIC8vIFNpbmd1bGFyCisgIGludDMyIG9wdGlvbmFsX2ludDMyID0gMTsKKyAgaW50NjQgb3B0aW9uYWxfaW50NjQgPSAyOworICB1aW50MzIgb3B0aW9uYWxfdWludDMyID0gMzsKKyAgdWludDY0IG9wdGlvbmFsX3VpbnQ2NCA9IDQ7CisgIHNpbnQzMiBvcHRpb25hbF9zaW50MzIgPSA1OworICBzaW50NjQgb3B0aW9uYWxfc2ludDY0ID0gNjsKKyAgZml4ZWQzMiBvcHRpb25hbF9maXhlZDMyID0gNzsKKyAgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0ID0gODsKKyAgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzIgPSA5OworICBzZml4ZWQ2NCBvcHRpb25hbF9zZml4ZWQ2NCA9IDEwOworICBmbG9hdCBvcHRpb25hbF9mbG9hdCA9IDExOworICBkb3VibGUgb3B0aW9uYWxfZG91YmxlID0gMTI7CisgIGJvb2wgb3B0aW9uYWxfYm9vbCA9IDEzOworICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nID0gMTQ7CisgIGJ5dGVzIG9wdGlvbmFsX2J5dGVzID0gMTU7CisKKyAgTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSA9IDE4OworICBGb3JlaWduTWVzc2FnZSBvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgPSAxOTsKKworICBOZXN0ZWRFbnVtIG9wdGlvbmFsX25lc3RlZF9lbnVtID0gMjE7CisgIEZvcmVpZ25FbnVtIG9wdGlvbmFsX2ZvcmVpZ25fZW51bSA9IDIyOworICBBbGlhc2VkRW51bSBvcHRpb25hbF9hbGlhc2VkX2VudW0gPSAyMzsKKworICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nX3BpZWNlID0gMjQgW2N0eXBlID0gU1RSSU5HX1BJRUNFXTsKKyAgc3RyaW5nIG9wdGlvbmFsX2NvcmQgPSAyNSBbY3R5cGUgPSBDT1JEXTsKKworICBUZXN0QWxsVHlwZXNQcm90bzMgcmVjdXJzaXZlX21lc3NhZ2UgPSAyNzsKKworICAvLyBSZXBlYXRlZAorICByZXBlYXRlZCBpbnQzMiByZXBlYXRlZF9pbnQzMiA9IDMxOworICByZXBlYXRlZCBpbnQ2NCByZXBlYXRlZF9pbnQ2NCA9IDMyOworICByZXBlYXRlZCB1aW50MzIgcmVwZWF0ZWRfdWludDMyID0gMzM7CisgIHJlcGVhdGVkIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgPSAzNDsKKyAgcmVwZWF0ZWQgc2ludDMyIHJlcGVhdGVkX3NpbnQzMiA9IDM1OworICByZXBlYXRlZCBzaW50NjQgcmVwZWF0ZWRfc2ludDY0ID0gMzY7CisgIHJlcGVhdGVkIGZpeGVkMzIgcmVwZWF0ZWRfZml4ZWQzMiA9IDM3OworICByZXBlYXRlZCBmaXhlZDY0IHJlcGVhdGVkX2ZpeGVkNjQgPSAzODsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcmVwZWF0ZWRfc2ZpeGVkMzIgPSAzOTsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgcmVwZWF0ZWRfc2ZpeGVkNjQgPSA0MDsKKyAgcmVwZWF0ZWQgZmxvYXQgcmVwZWF0ZWRfZmxvYXQgPSA0MTsKKyAgcmVwZWF0ZWQgZG91YmxlIHJlcGVhdGVkX2RvdWJsZSA9IDQyOworICByZXBlYXRlZCBib29sIHJlcGVhdGVkX2Jvb2wgPSA0MzsKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZyA9IDQ0OworICByZXBlYXRlZCBieXRlcyByZXBlYXRlZF9ieXRlcyA9IDQ1OworCisgIHJlcGVhdGVkIE5lc3RlZE1lc3NhZ2UgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgPSA0ODsKKyAgcmVwZWF0ZWQgRm9yZWlnbk1lc3NhZ2UgcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlID0gNDk7CisKKyAgcmVwZWF0ZWQgTmVzdGVkRW51bSByZXBlYXRlZF9uZXN0ZWRfZW51bSA9IDUxOworICByZXBlYXRlZCBGb3JlaWduRW51bSByZXBlYXRlZF9mb3JlaWduX2VudW0gPSA1MjsKKworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3BpZWNlID0gNTQgW2N0eXBlID0gU1RSSU5HX1BJRUNFXTsKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX2NvcmQgPSA1NSBbY3R5cGUgPSBDT1JEXTsKKworICAvLyBQYWNrZWQKKyAgcmVwZWF0ZWQgaW50MzIgcGFja2VkX2ludDMyID0gNzUgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBpbnQ2NCBwYWNrZWRfaW50NjQgPSA3NiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHVpbnQzMiBwYWNrZWRfdWludDMyID0gNzcgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCB1aW50NjQgcGFja2VkX3VpbnQ2NCA9IDc4IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ludDMyIHBhY2tlZF9zaW50MzIgPSA3OSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNpbnQ2NCBwYWNrZWRfc2ludDY0ID0gODAgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBmaXhlZDMyIHBhY2tlZF9maXhlZDMyID0gODEgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBmaXhlZDY0IHBhY2tlZF9maXhlZDY0ID0gODIgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQzMiBwYWNrZWRfc2ZpeGVkMzIgPSA4MyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHBhY2tlZF9zZml4ZWQ2NCA9IDg0IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgZmxvYXQgcGFja2VkX2Zsb2F0ID0gODUgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBkb3VibGUgcGFja2VkX2RvdWJsZSA9IDg2IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgYm9vbCBwYWNrZWRfYm9vbCA9IDg3IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgTmVzdGVkRW51bSBwYWNrZWRfbmVzdGVkX2VudW0gPSA4OCBbcGFja2VkID0gdHJ1ZV07CisKKyAgLy8gVW5wYWNrZWQKKyAgcmVwZWF0ZWQgaW50MzIgdW5wYWNrZWRfaW50MzIgPSA4OSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBpbnQ2NCB1bnBhY2tlZF9pbnQ2NCA9IDkwIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHVpbnQzMiB1bnBhY2tlZF91aW50MzIgPSA5MSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCB1aW50NjQgdW5wYWNrZWRfdWludDY0ID0gOTIgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgc2ludDMyIHVucGFja2VkX3NpbnQzMiA9IDkzIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHNpbnQ2NCB1bnBhY2tlZF9zaW50NjQgPSA5NCBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBmaXhlZDMyIHVucGFja2VkX2ZpeGVkMzIgPSA5NSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBmaXhlZDY0IHVucGFja2VkX2ZpeGVkNjQgPSA5NiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBzZml4ZWQzMiB1bnBhY2tlZF9zZml4ZWQzMiA9IDk3IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHVucGFja2VkX3NmaXhlZDY0ID0gOTggW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgZmxvYXQgdW5wYWNrZWRfZmxvYXQgPSA5OSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBkb3VibGUgdW5wYWNrZWRfZG91YmxlID0gMTAwIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIGJvb2wgdW5wYWNrZWRfYm9vbCA9IDEwMSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBOZXN0ZWRFbnVtIHVucGFja2VkX25lc3RlZF9lbnVtID0gMTAyIFtwYWNrZWQgPSBmYWxzZV07CisKKyAgLy8gTWFwCisgIG1hcDxpbnQzMiwgaW50MzI+IG1hcF9pbnQzMl9pbnQzMiA9IDU2OworICBtYXA8aW50NjQsIGludDY0PiBtYXBfaW50NjRfaW50NjQgPSA1NzsKKyAgbWFwPHVpbnQzMiwgdWludDMyPiBtYXBfdWludDMyX3VpbnQzMiA9IDU4OworICBtYXA8dWludDY0LCB1aW50NjQ+IG1hcF91aW50NjRfdWludDY0ID0gNTk7CisgIG1hcDxzaW50MzIsIHNpbnQzMj4gbWFwX3NpbnQzMl9zaW50MzIgPSA2MDsKKyAgbWFwPHNpbnQ2NCwgc2ludDY0PiBtYXBfc2ludDY0X3NpbnQ2NCA9IDYxOworICBtYXA8Zml4ZWQzMiwgZml4ZWQzMj4gbWFwX2ZpeGVkMzJfZml4ZWQzMiA9IDYyOworICBtYXA8Zml4ZWQ2NCwgZml4ZWQ2ND4gbWFwX2ZpeGVkNjRfZml4ZWQ2NCA9IDYzOworICBtYXA8c2ZpeGVkMzIsIHNmaXhlZDMyPiBtYXBfc2ZpeGVkMzJfc2ZpeGVkMzIgPSA2NDsKKyAgbWFwPHNmaXhlZDY0LCBzZml4ZWQ2ND4gbWFwX3NmaXhlZDY0X3NmaXhlZDY0ID0gNjU7CisgIG1hcDxpbnQzMiwgZmxvYXQ+IG1hcF9pbnQzMl9mbG9hdCA9IDY2OworICBtYXA8aW50MzIsIGRvdWJsZT4gbWFwX2ludDMyX2RvdWJsZSA9IDY3OworICBtYXA8Ym9vbCwgYm9vbD4gbWFwX2Jvb2xfYm9vbCA9IDY4OworICBtYXA8c3RyaW5nLCBzdHJpbmc+IG1hcF9zdHJpbmdfc3RyaW5nID0gNjk7CisgIG1hcDxzdHJpbmcsIGJ5dGVzPiBtYXBfc3RyaW5nX2J5dGVzID0gNzA7CisgIG1hcDxzdHJpbmcsIE5lc3RlZE1lc3NhZ2U+IG1hcF9zdHJpbmdfbmVzdGVkX21lc3NhZ2UgPSA3MTsKKyAgbWFwPHN0cmluZywgRm9yZWlnbk1lc3NhZ2U+IG1hcF9zdHJpbmdfZm9yZWlnbl9tZXNzYWdlID0gNzI7CisgIG1hcDxzdHJpbmcsIE5lc3RlZEVudW0+IG1hcF9zdHJpbmdfbmVzdGVkX2VudW0gPSA3MzsKKyAgbWFwPHN0cmluZywgRm9yZWlnbkVudW0+IG1hcF9zdHJpbmdfZm9yZWlnbl9lbnVtID0gNzQ7CisKKyAgb25lb2Ygb25lb2ZfZmllbGQgeworICAgIHVpbnQzMiBvbmVvZl91aW50MzIgPSAxMTE7CisgICAgTmVzdGVkTWVzc2FnZSBvbmVvZl9uZXN0ZWRfbWVzc2FnZSA9IDExMjsKKyAgICBzdHJpbmcgb25lb2Zfc3RyaW5nID0gMTEzOworICAgIGJ5dGVzIG9uZW9mX2J5dGVzID0gMTE0OworICAgIGJvb2wgb25lb2ZfYm9vbCA9IDExNTsKKyAgICB1aW50NjQgb25lb2ZfdWludDY0ID0gMTE2OworICAgIGZsb2F0IG9uZW9mX2Zsb2F0ID0gMTE3OworICAgIGRvdWJsZSBvbmVvZl9kb3VibGUgPSAxMTg7CisgICAgTmVzdGVkRW51bSBvbmVvZl9lbnVtID0gMTE5OworICAgIGdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUgb25lb2ZfbnVsbF92YWx1ZSA9IDEyMDsKKyAgfQorCisgIC8vIFdlbGwta25vd24gdHlwZXMKKyAgZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZSBvcHRpb25hbF9ib29sX3dyYXBwZXIgPSAyMDE7CisgIGdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIG9wdGlvbmFsX2ludDMyX3dyYXBwZXIgPSAyMDI7CisgIGdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlIG9wdGlvbmFsX2ludDY0X3dyYXBwZXIgPSAyMDM7CisgIGdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZSBvcHRpb25hbF91aW50MzJfd3JhcHBlciA9IDIwNDsKKyAgZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlIG9wdGlvbmFsX3VpbnQ2NF93cmFwcGVyID0gMjA1OworICBnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZSBvcHRpb25hbF9mbG9hdF93cmFwcGVyID0gMjA2OworICBnb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUgb3B0aW9uYWxfZG91YmxlX3dyYXBwZXIgPSAyMDc7CisgIGdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZSBvcHRpb25hbF9zdHJpbmdfd3JhcHBlciA9IDIwODsKKyAgZ29vZ2xlLnByb3RvYnVmLkJ5dGVzVmFsdWUgb3B0aW9uYWxfYnl0ZXNfd3JhcHBlciA9IDIwOTsKKworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuQm9vbFZhbHVlIHJlcGVhdGVkX2Jvb2xfd3JhcHBlciA9IDIxMTsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUgcmVwZWF0ZWRfaW50MzJfd3JhcHBlciA9IDIxMjsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUgcmVwZWF0ZWRfaW50NjRfd3JhcHBlciA9IDIxMzsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlIHJlcGVhdGVkX3VpbnQzMl93cmFwcGVyID0gMjE0OworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUgcmVwZWF0ZWRfdWludDY0X3dyYXBwZXIgPSAyMTU7CisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5GbG9hdFZhbHVlIHJlcGVhdGVkX2Zsb2F0X3dyYXBwZXIgPSAyMTY7CisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSByZXBlYXRlZF9kb3VibGVfd3JhcHBlciA9IDIxNzsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlIHJlcGVhdGVkX3N0cmluZ193cmFwcGVyID0gMjE4OworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZSByZXBlYXRlZF9ieXRlc193cmFwcGVyID0gMjE5OworCisgIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiBvcHRpb25hbF9kdXJhdGlvbiA9IDMwMTsKKyAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBvcHRpb25hbF90aW1lc3RhbXAgPSAzMDI7CisgIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2sgb3B0aW9uYWxfZmllbGRfbWFzayA9IDMwMzsKKyAgZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCBvcHRpb25hbF9zdHJ1Y3QgPSAzMDQ7CisgIGdvb2dsZS5wcm90b2J1Zi5Bbnkgb3B0aW9uYWxfYW55ID0gMzA1OworICBnb29nbGUucHJvdG9idWYuVmFsdWUgb3B0aW9uYWxfdmFsdWUgPSAzMDY7CisgIGdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUgb3B0aW9uYWxfbnVsbF92YWx1ZSA9IDMwNzsKKworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gcmVwZWF0ZWRfZHVyYXRpb24gPSAzMTE7CisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgcmVwZWF0ZWRfdGltZXN0YW1wID0gMzEyOworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIHJlcGVhdGVkX2ZpZWxkbWFzayA9IDMxMzsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCByZXBlYXRlZF9zdHJ1Y3QgPSAzMjQ7CisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5BbnkgcmVwZWF0ZWRfYW55ID0gMzE1OworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuVmFsdWUgcmVwZWF0ZWRfdmFsdWUgPSAzMTY7CisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUgcmVwZWF0ZWRfbGlzdF92YWx1ZSA9IDMxNzsKKworICAvLyBUZXN0IGZpZWxkLW5hbWUtdG8tSlNPTi1uYW1lIGNvbnZlbnRpb24uCisgIC8vIChwcm90b2J1ZiBzYXlzIG5hbWVzIGNhbiBiZSBhbnkgdmFsaWQgQy9DKysgaWRlbnRpZmllci4pCisgIGludDMyIGZpZWxkbmFtZTEgPSA0MDE7CisgIGludDMyIGZpZWxkX25hbWUyID0gNDAyOworICBpbnQzMiBfZmllbGRfbmFtZTMgPSA0MDM7CisgIGludDMyIGZpZWxkX19uYW1lNF8gPSA0MDQ7CisgIGludDMyIGZpZWxkMG5hbWU1ID0gNDA1OworICBpbnQzMiBmaWVsZF8wX25hbWU2ID0gNDA2OworICBpbnQzMiBmaWVsZE5hbWU3ID0gNDA3OworICBpbnQzMiBGaWVsZE5hbWU4ID0gNDA4OworICBpbnQzMiBmaWVsZF9OYW1lOSA9IDQwOTsKKyAgaW50MzIgRmllbGRfTmFtZTEwID0gNDEwOworICBpbnQzMiBGSUVMRF9OQU1FMTEgPSA0MTE7CisgIGludDMyIEZJRUxEX25hbWUxMiA9IDQxMjsKKyAgaW50MzIgX19maWVsZF9uYW1lMTMgPSA0MTM7CisgIGludDMyIF9fRmllbGRfbmFtZTE0ID0gNDE0OworICBpbnQzMiBmaWVsZF9fbmFtZTE1ID0gNDE1OworICBpbnQzMiBmaWVsZF9fTmFtZTE2ID0gNDE2OworICBpbnQzMiBmaWVsZF9uYW1lMTdfXyA9IDQxNzsKKyAgaW50MzIgRmllbGRfbmFtZTE4X18gPSA0MTg7CisKKyAgLy8gUmVzZXJ2ZWQgZm9yIHRlc3RpbmcgdW5rbm93biBmaWVsZHMKKyAgcmVzZXJ2ZWQgNTAxIHRvIDUxMDsKK30KKworbWVzc2FnZSBGb3JlaWduTWVzc2FnZSB7CisgIGludDMyIGMgPSAxOworfQorCitlbnVtIEZvcmVpZ25FbnVtIHsKKyAgRk9SRUlHTl9GT08gPSAwOworICBGT1JFSUdOX0JBUiA9IDE7CisgIEZPUkVJR05fQkFaID0gMjsKK30KKworbWVzc2FnZSBOdWxsSHlwb3RoZXNpc1Byb3RvMyB7fQorCittZXNzYWdlIEVudW1Pbmx5UHJvdG8zIHsKKyAgZW51bSBCb29sIHsKKyAgICBrRmFsc2UgPSAwOworICAgIGtUcnVlID0gMTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTVjYjZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MKQEAgLTAsMCArMSw0NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZkZWYgX1dJTjMyCisvLyBWZXJpZnkgdGhhdCAjaW5jbHVkaW5nIHdpbmRvd3MuaCBkb2VzIG5vdCBicmVhayBhbnl0aGluZyAoZS5nLiBiZWNhdXNlCisvLyB3aW5kb3dzLmggI2RlZmluZXMgR2V0TWVzc2FnZSgpIGFzIGEgbWFjcm8pLgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4ZDdiNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmgKQEAgLTAsMCArMSwxMjc3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1RFU1RfVVRJTF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1RFU1RfVVRJTF9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorCisjZGVmaW5lIFVOSVRURVNUIDo6cHJvdG9idWZfdW5pdHRlc3QKKyNkZWZpbmUgVU5JVFRFU1RfSU1QT1JUIDo6cHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0CisvLyBNdXN0IGJlIGluY2x1ZGVkIHdoZW4gdGhlIHByZXByb2Nlc3NvciBzeW1ib2xzIGFib3ZlIGFyZSBkZWZpbmVkLgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaW5jPgorI3VuZGVmIFVOSVRURVNUCisjdW5kZWYgVU5JVFRFU1RfSU1QT1JUCisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisvLyBUaGlzIGZpbGUgZG9lc24ndCB1c2UgdGhlc2UgZGVjbGFyYXRpb25zLCBidXQgc29tZSAuY2MgZmlsZXMgZG8uCituYW1lc3BhY2UgdW5pdHRlc3QgPSA6OnByb3RvYnVmX3VuaXR0ZXN0OworbmFtZXNwYWNlIHVuaXR0ZXN0X2ltcG9ydCA9IDo6cHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OworCituYW1lc3BhY2UgVGVzdFV0aWwgeworCitjbGFzcyBSZWZsZWN0aW9uVGVzdGVyIHsKKyBwdWJsaWM6CisgIC8vIGJhc2VfZGVzY3JpcHRvciBtdXN0IGJlIGEgZGVzY3JpcHRvciBmb3IgVGVzdEFsbFR5cGVzIG9yCisgIC8vIFRlc3RBbGxFeHRlbnNpb25zLiAgSW4gdGhlIGZvcm1lciBjYXNlLCBSZWZsZWN0aW9uVGVzdGVyIGZldGNoZXMgZnJvbQorICAvLyBpdCB0aGUgRmllbGREZXNjcmlwdG9ycyBuZWVkZWQgdG8gdXNlIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZS4gIEluCisgIC8vIHRoZSBsYXR0ZXIgY2FzZSwgUmVmbGVjdGlvblRlc3RlciBzZWFyY2hlcyBmb3IgZXh0ZW5zaW9uIGZpZWxkcyBpbgorICAvLyBpdHMgZmlsZS4KKyAgZXhwbGljaXQgUmVmbGVjdGlvblRlc3Rlcihjb25zdCBEZXNjcmlwdG9yKiBiYXNlX2Rlc2NyaXB0b3IpOworCisgIHZvaWQgU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKTsKKyAgdm9pZCBNb2RpZnlSZXBlYXRlZEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7CisgIHZvaWQgRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKKyAgdm9pZCBFeHBlY3RDbGVhclZpYVJlZmxlY3Rpb24oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAgdm9pZCBTZXRQYWNrZWRGaWVsZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpOworICB2b2lkIEV4cGVjdFBhY2tlZEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAgdm9pZCBSZW1vdmVMYXN0UmVwZWF0ZWRzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKTsKKyAgdm9pZCBSZWxlYXNlTGFzdFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHBlY3RfZXh0ZW5zaW9uc19ub3RudWxsKTsKKyAgdm9pZCBTd2FwUmVwZWF0ZWRzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKTsKKyAgdm9pZCBTZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb051bGxWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKAorICAgICAgTWVzc2FnZSogZnJvbV9tZXNzYWdlLCBNZXNzYWdlKiB0b19tZXNzYWdlKTsKKworICBlbnVtIE1lc3NhZ2VSZWxlYXNlU3RhdGUgeworICAgIElTX05VTEwsCisgICAgQ0FOX0JFX05VTEwsCisgICAgTk9UX05VTEwsCisgIH07CisgIHZvaWQgRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBNZXNzYWdlUmVsZWFzZVN0YXRlIGV4cGVjdGVkX3JlbGVhc2Vfc3RhdGUpOworCisgIC8vIFNldCBhbmQgY2hlY2sgZnVuY3Rpb25zIGZvciBUZXN0T25lb2YyIG1lc3NhZ2VzLiBObyBuZWVkIHRvIGNvbnN0cnVjdAorICAvLyB0aGUgUmVmbGVjdGlvblRlc3RlciBieSBUZXN0QWxsVHlwZXMgbm9yIFRlc3RBbGxFeHRlbnNpb25zLgorICBzdGF0aWMgdm9pZCBTZXRPbmVvZlZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdE9uZW9mU2V0VmlhUmVmbGVjdGlvbihjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKKworIHByaXZhdGU6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisKKyAgY29uc3QgRGVzY3JpcHRvciogYmFzZV9kZXNjcmlwdG9yXzsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGdyb3VwX2FfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlcGVhdGVkX2dyb3VwX2FfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG5lc3RlZF9iXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmb3JlaWduX2NfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGltcG9ydF9kXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBpbXBvcnRfZV87CisKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogbmVzdGVkX2Zvb187CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIG5lc3RlZF9iYXJfOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBuZXN0ZWRfYmF6XzsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZm9yZWlnbl9mb29fOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBmb3JlaWduX2Jhcl87CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGZvcmVpZ25fYmF6XzsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogaW1wb3J0X2Zvb187CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGltcG9ydF9iYXJfOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBpbXBvcnRfYmF6XzsKKworICAvLyBXZSBoYXZlIHRvIHNwbGl0IHRoaXMgaW50byB0aHJlZSBmdW5jdGlvbiBvdGhlcndpc2UgaXQgY3JlYXRlcyBhIHN0YWNrCisgIC8vIGZyYW1lIHNvIGxhcmdlIHRoYXQgaXQgdHJpZ2dlcnMgYSB3YXJuaW5nLgorICB2b2lkIEV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24xKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworICB2b2lkIEV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24yKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworICB2b2lkIEV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24zKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZWZsZWN0aW9uVGVzdGVyKTsKK307CisKK2lubGluZSBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6UmVmbGVjdGlvblRlc3RlcigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBiYXNlX2Rlc2NyaXB0b3IpCisgICAgOiBiYXNlX2Rlc2NyaXB0b3JfKGJhc2VfZGVzY3JpcHRvcikgeworICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCA9IGJhc2VfZGVzY3JpcHRvci0+ZmlsZSgpLT5wb29sKCk7CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2UgPSBiYXNlX2Rlc2NyaXB0b3ItPmZpbGUoKS0+cGFja2FnZSgpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGltcG9ydF9kZXNjcmlwdG9yID0KKyAgICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShwYWNrYWdlICsgIi5UZXN0QWxsVHlwZXMub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKTsKKyAgc3RkOjpzdHJpbmcgaW1wb3J0X3BhY2thZ2UgPQorICAgICAgaW1wb3J0X2Rlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLT5maWxlKCktPnBhY2thZ2UoKTsKKworICBuZXN0ZWRfYl8gPSBwb29sLT5GaW5kRmllbGRCeU5hbWUocGFja2FnZSArICIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuYmIiKTsKKyAgZm9yZWlnbl9jXyA9IHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShwYWNrYWdlICsgIi5Gb3JlaWduTWVzc2FnZS5jIik7CisgIGltcG9ydF9kXyA9IHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShpbXBvcnRfcGFja2FnZSArICIuSW1wb3J0TWVzc2FnZS5kIik7CisgIGltcG9ydF9lXyA9IHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShpbXBvcnRfcGFja2FnZSArICIuUHVibGljSW1wb3J0TWVzc2FnZS5lIik7CisgIG5lc3RlZF9mb29fID0gcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZShwYWNrYWdlICsgIi5UZXN0QWxsVHlwZXMuRk9PIik7CisgIG5lc3RlZF9iYXJfID0gcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZShwYWNrYWdlICsgIi5UZXN0QWxsVHlwZXMuQkFSIik7CisgIG5lc3RlZF9iYXpfID0gcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZShwYWNrYWdlICsgIi5UZXN0QWxsVHlwZXMuQkFaIik7CisgIGZvcmVpZ25fZm9vXyA9IHBvb2wtPkZpbmRFbnVtVmFsdWVCeU5hbWUocGFja2FnZSArICIuRk9SRUlHTl9GT08iKTsKKyAgZm9yZWlnbl9iYXJfID0gcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZShwYWNrYWdlICsgIi5GT1JFSUdOX0JBUiIpOworICBmb3JlaWduX2Jhel8gPSBwb29sLT5GaW5kRW51bVZhbHVlQnlOYW1lKHBhY2thZ2UgKyAiLkZPUkVJR05fQkFaIik7CisgIGltcG9ydF9mb29fID0gcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZShpbXBvcnRfcGFja2FnZSArICIuSU1QT1JUX0ZPTyIpOworICBpbXBvcnRfYmFyXyA9IHBvb2wtPkZpbmRFbnVtVmFsdWVCeU5hbWUoaW1wb3J0X3BhY2thZ2UgKyAiLklNUE9SVF9CQVIiKTsKKyAgaW1wb3J0X2Jhel8gPSBwb29sLT5GaW5kRW51bVZhbHVlQnlOYW1lKGltcG9ydF9wYWNrYWdlICsgIi5JTVBPUlRfQkFaIik7CisKKyAgaWYgKGJhc2VfZGVzY3JpcHRvcl8tPm5hbWUoKSA9PSAiVGVzdEFsbEV4dGVuc2lvbnMiKSB7CisgICAgZ3JvdXBfYV8gPSBwb29sLT5GaW5kRmllbGRCeU5hbWUocGFja2FnZSArICIuT3B0aW9uYWxHcm91cF9leHRlbnNpb24uYSIpOworICAgIHJlcGVhdGVkX2dyb3VwX2FfID0KKyAgICAgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKHBhY2thZ2UgKyAiLlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLmEiKTsKKyAgfSBlbHNlIHsKKyAgICBncm91cF9hXyA9IHBvb2wtPkZpbmRGaWVsZEJ5TmFtZShwYWNrYWdlICsgIi5UZXN0QWxsVHlwZXMuT3B0aW9uYWxHcm91cC5hIik7CisgICAgcmVwZWF0ZWRfZ3JvdXBfYV8gPQorICAgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUocGFja2FnZSArICIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAuYSIpOworICB9CisKKyAgRVhQRUNUX1RSVUUoZ3JvdXBfYV8gIT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKHJlcGVhdGVkX2dyb3VwX2FfICE9IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShuZXN0ZWRfYl8gIT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGZvcmVpZ25fY18gIT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGltcG9ydF9kXyAhPSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoaW1wb3J0X2VfICE9IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShuZXN0ZWRfZm9vXyAhPSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUobmVzdGVkX2Jhcl8gIT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKG5lc3RlZF9iYXpfICE9IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShmb3JlaWduX2Zvb18gIT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGZvcmVpZ25fYmFyXyAhPSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoZm9yZWlnbl9iYXpfICE9IG51bGxwdHIpOworICBFWFBFQ1RfVFJVRShpbXBvcnRfZm9vXyAhPSBudWxscHRyKTsKKyAgRVhQRUNUX1RSVUUoaW1wb3J0X2Jhcl8gIT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKGltcG9ydF9iYXpfICE9IG51bGxwdHIpOworfQorCisvLyBTaG9ydGhhbmQgdG8gZ2V0IGEgRmllbGREZXNjcmlwdG9yIGZvciBhIGZpZWxkIG9mIFRlc3RBbGxUeXBlcy4KK2lubGluZSBjb25zdCBGaWVsZERlc2NyaXB0b3IqIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpGKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0gbnVsbHB0cjsKKyAgaWYgKGJhc2VfZGVzY3JpcHRvcl8tPm5hbWUoKSA9PSAiVGVzdEFsbEV4dGVuc2lvbnMiIHx8CisgICAgICBiYXNlX2Rlc2NyaXB0b3JfLT5uYW1lKCkgPT0gIlRlc3RQYWNrZWRFeHRlbnNpb25zIikgeworICAgIHJlc3VsdCA9IGJhc2VfZGVzY3JpcHRvcl8tPmZpbGUoKS0+RmluZEV4dGVuc2lvbkJ5TmFtZShuYW1lICsgIl9leHRlbnNpb24iKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBiYXNlX2Rlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU5hbWUobmFtZSk7CisgIH0KKyAgR09PR0xFX0NIRUNLKHJlc3VsdCAhPSBudWxscHRyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6U2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigKKyAgICBNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOworCisgIHJlZmxlY3Rpb24tPlNldEludDMyKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ludDMyIiksIDEwMSk7CisgIHJlZmxlY3Rpb24tPlNldEludDY0KG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ludDY0IiksIDEwMik7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBGKCJvcHRpb25hbF91aW50MzIiKSwgMTAzKTsKKyAgcmVmbGVjdGlvbi0+U2V0VUludDY0KG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3VpbnQ2NCIpLCAxMDQpOworICByZWZsZWN0aW9uLT5TZXRJbnQzMihtZXNzYWdlLCBGKCJvcHRpb25hbF9zaW50MzIiKSwgMTA1KTsKKyAgcmVmbGVjdGlvbi0+U2V0SW50NjQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ludDY0IiksIDEwNik7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBGKCJvcHRpb25hbF9maXhlZDMyIiksIDEwNyk7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQ2NChtZXNzYWdlLCBGKCJvcHRpb25hbF9maXhlZDY0IiksIDEwOCk7CisgIHJlZmxlY3Rpb24tPlNldEludDMyKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NmaXhlZDMyIiksIDEwOSk7CisgIHJlZmxlY3Rpb24tPlNldEludDY0KG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NmaXhlZDY0IiksIDExMCk7CisgIHJlZmxlY3Rpb24tPlNldEZsb2F0KG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2Zsb2F0IiksIDExMSk7CisgIHJlZmxlY3Rpb24tPlNldERvdWJsZShtZXNzYWdlLCBGKCJvcHRpb25hbF9kb3VibGUiKSwgMTEyKTsKKyAgcmVmbGVjdGlvbi0+U2V0Qm9vbChtZXNzYWdlLCBGKCJvcHRpb25hbF9ib29sIiksIHRydWUpOworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nIiksICIxMTUiKTsKKyAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2J5dGVzIiksICIxMTYiKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsZ3JvdXAiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBncm91cF9hXywgMTE3KTsKKyAgc3ViX21lc3NhZ2UgPQorICAgICAgcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDExOCk7CisgIHN1Yl9tZXNzYWdlID0KKyAgICAgIHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIGZvcmVpZ25fY18sIDExOSk7CisgIHN1Yl9tZXNzYWdlID0KKyAgICAgIHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgaW1wb3J0X2RfLCAxMjApOworCisgIHJlZmxlY3Rpb24tPlNldEVudW0obWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX2VudW0iKSwgbmVzdGVkX2Jhel8pOworICByZWZsZWN0aW9uLT5TZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpLCBmb3JlaWduX2Jhel8pOworICByZWZsZWN0aW9uLT5TZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9lbnVtIiksIGltcG9ydF9iYXpfKTsKKworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIiksICIxMjQiKTsKKyAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2NvcmQiKSwgIjEyNSIpOworCisgIHN1Yl9tZXNzYWdlID0KKyAgICAgIHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIGltcG9ydF9lXywgMTI2KTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2xhenlfbWVzc2FnZSIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIG5lc3RlZF9iXywgMTI3KTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgRigib3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDEyOCk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICByZWZsZWN0aW9uLT5BZGRJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQzMiIpLCAyMDEpOworICByZWZsZWN0aW9uLT5BZGRJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQ2NCIpLCAyMDIpOworICByZWZsZWN0aW9uLT5BZGRVSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDMyIiksIDIwMyk7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF91aW50NjQiKSwgMjA0KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDMyIiksIDIwNSk7CisgIHJlZmxlY3Rpb24tPkFkZEludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQ2NCIpLCAyMDYpOworICByZWZsZWN0aW9uLT5BZGRVSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQzMiIpLCAyMDcpOworICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQ2NCIpLCAyMDgpOworICByZWZsZWN0aW9uLT5BZGRJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAyMDkpOworICByZWZsZWN0aW9uLT5BZGRJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAyMTApOworICByZWZsZWN0aW9uLT5BZGRGbG9hdChtZXNzYWdlLCBGKCJyZXBlYXRlZF9mbG9hdCIpLCAyMTEpOworICByZWZsZWN0aW9uLT5BZGREb3VibGUobWVzc2FnZSwgRigicmVwZWF0ZWRfZG91YmxlIiksIDIxMik7CisgIHJlZmxlY3Rpb24tPkFkZEJvb2wobWVzc2FnZSwgRigicmVwZWF0ZWRfYm9vbCIpLCB0cnVlKTsKKyAgcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZyIpLCAiMjE1Iik7CisgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9ieXRlcyIpLCAiMjE2Iik7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkZ3JvdXAiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCByZXBlYXRlZF9ncm91cF9hXywgMjE3KTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbmVzdGVkX2JfLCAyMTgpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXywgMjE5KTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgaW1wb3J0X2RfLCAyMjApOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbmVzdGVkX2JfLCAyMjcpOworCisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX2VudW0iKSwgbmVzdGVkX2Jhcl8pOworICByZWZsZWN0aW9uLT5BZGRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLCBmb3JlaWduX2Jhcl8pOworICByZWZsZWN0aW9uLT5BZGRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiksIGltcG9ydF9iYXJfKTsKKworICByZWZsZWN0aW9uLT5BZGRTdHJpbmcobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksICIyMjQiKTsKKyAgcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2NvcmQiKSwgIjIyNSIpOworCisgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KKyAgcmVmbGVjdGlvbi0+QWRkSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50MzIiKSwgMzAxKTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50NjQiKSwgMzAyKTsKKyAgcmVmbGVjdGlvbi0+QWRkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQzMiIpLCAzMDMpOworICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDY0IiksIDMwNCk7CisgIHJlZmxlY3Rpb24tPkFkZEludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQzMiIpLCAzMDUpOworICByZWZsZWN0aW9uLT5BZGRJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50NjQiKSwgMzA2KTsKKyAgcmVmbGVjdGlvbi0+QWRkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkMzIiKSwgMzA3KTsKKyAgcmVmbGVjdGlvbi0+QWRkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkNjQiKSwgMzA4KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMzA5KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMzEwKTsKKyAgcmVmbGVjdGlvbi0+QWRkRmxvYXQobWVzc2FnZSwgRigicmVwZWF0ZWRfZmxvYXQiKSwgMzExKTsKKyAgcmVmbGVjdGlvbi0+QWRkRG91YmxlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2RvdWJsZSIpLCAzMTIpOworICByZWZsZWN0aW9uLT5BZGRCb29sKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Jvb2wiKSwgZmFsc2UpOworICByZWZsZWN0aW9uLT5BZGRTdHJpbmcobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nIiksICIzMTUiKTsKKyAgcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiksICIzMTYiKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIHJlcGVhdGVkX2dyb3VwX2FfLCAzMTcpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDMxOCk7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBmb3JlaWduX2NfLCAzMTkpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBpbXBvcnRfZF8sIDMyMCk7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDMyNyk7CisKKyAgcmVmbGVjdGlvbi0+QWRkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIpLCBuZXN0ZWRfYmF6Xyk7CisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25fYmF6Xyk7CisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X2VudW0iKSwgaW1wb3J0X2Jhel8pOworCisgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgIjMyNCIpOworICByZWZsZWN0aW9uLT5BZGRTdHJpbmcobWVzc2FnZSwgRigicmVwZWF0ZWRfY29yZCIpLCAiMzI1Iik7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICByZWZsZWN0aW9uLT5TZXRJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDMyIiksIDQwMSk7CisgIHJlZmxlY3Rpb24tPlNldEludDY0KG1lc3NhZ2UsIEYoImRlZmF1bHRfaW50NjQiKSwgNDAyKTsKKyAgcmVmbGVjdGlvbi0+U2V0VUludDMyKG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDMyIiksIDQwMyk7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQ2NCIpLCA0MDQpOworICByZWZsZWN0aW9uLT5TZXRJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQzMiIpLCA0MDUpOworICByZWZsZWN0aW9uLT5TZXRJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQ2NCIpLCA0MDYpOworICByZWZsZWN0aW9uLT5TZXRVSW50MzIobWVzc2FnZSwgRigiZGVmYXVsdF9maXhlZDMyIiksIDQwNyk7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkNjQiKSwgNDA4KTsKKyAgcmVmbGVjdGlvbi0+U2V0SW50MzIobWVzc2FnZSwgRigiZGVmYXVsdF9zZml4ZWQzMiIpLCA0MDkpOworICByZWZsZWN0aW9uLT5TZXRJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDY0IiksIDQxMCk7CisgIHJlZmxlY3Rpb24tPlNldEZsb2F0KG1lc3NhZ2UsIEYoImRlZmF1bHRfZmxvYXQiKSwgNDExKTsKKyAgcmVmbGVjdGlvbi0+U2V0RG91YmxlKG1lc3NhZ2UsIEYoImRlZmF1bHRfZG91YmxlIiksIDQxMik7CisgIHJlZmxlY3Rpb24tPlNldEJvb2wobWVzc2FnZSwgRigiZGVmYXVsdF9ib29sIiksIGZhbHNlKTsKKyAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nIiksICI0MTUiKTsKKyAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIEYoImRlZmF1bHRfYnl0ZXMiKSwgIjQxNiIpOworCisgIHJlZmxlY3Rpb24tPlNldEVudW0obWVzc2FnZSwgRigiZGVmYXVsdF9uZXN0ZWRfZW51bSIpLCBuZXN0ZWRfZm9vXyk7CisgIHJlZmxlY3Rpb24tPlNldEVudW0obWVzc2FnZSwgRigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSwgZm9yZWlnbl9mb29fKTsKKyAgcmVmbGVjdGlvbi0+U2V0RW51bShtZXNzYWdlLCBGKCJkZWZhdWx0X2ltcG9ydF9lbnVtIiksIGltcG9ydF9mb29fKTsKKworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSwgIjQyNCIpOworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9jb3JkIiksICI0MjUiKTsKKworICByZWZsZWN0aW9uLT5TZXRVSW50MzIobWVzc2FnZSwgRigib25lb2ZfdWludDMyIiksIDYwMSk7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgRigib25lb2ZfbmVzdGVkX21lc3NhZ2UiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDYwMik7CisgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBGKCJvbmVvZl9zdHJpbmciKSwgIjYwMyIpOworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigib25lb2ZfYnl0ZXMiKSwgIjYwNCIpOworfQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6U2V0T25lb2ZWaWFSZWZsZWN0aW9uKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgTWVzc2FnZSogc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZSgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2xhenlfbWVzc2FnZSIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50NjQoCisgICAgICBzdWJfbWVzc2FnZSwgc3ViX21lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJtb29faW50IiksCisgICAgICAxMDApOworCisgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9jb3JkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAiMTAxIik7CisgIHJlZmxlY3Rpb24tPlNldEludDMyKG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmF6X2ludCIpLCAxMDIpOworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXpfc3RyaW5nIiksCisgICAgICAgICAgICAgICAgICAgICAgICAiMTAzIik7Cit9CisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpFeHBlY3RPbmVvZlNldFZpYVJlZmxlY3Rpb24oCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgc3RkOjpzdHJpbmcgc2NyYXRjaDsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX2NvcmQiKSkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmF6X2ludCIpKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgcmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXpfc3RyaW5nIikpKTsKKworICBjb25zdCBNZXNzYWdlKiBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbGF6eV9tZXNzYWdlIikpOworICBFWFBFQ1RfRVEoMTAwLCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICpzdWJfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgIHN1Yl9tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgibW9vX2ludCIpKSk7CisKKyAgRVhQRUNUX0VRKCIxMDEiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX2NvcmQiKSkpOworICBFWFBFQ1RfRVEoIjEwMSIsCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfY29yZCIpLCAmc2NyYXRjaCkpOworCisgIEVYUEVDVF9FUSgxMDIsIHJlZmxlY3Rpb24tPkdldEludDMyKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmF6X2ludCIpKSk7CisKKyAgRVhQRUNUX0VRKCIxMDMiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmF6X3N0cmluZyIpKSk7CisgIEVYUEVDVF9FUSgiMTAzIiwKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhel9zdHJpbmciKSwgJnNjcmF0Y2gpKTsKK30KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlNldFBhY2tlZEZpZWxkc1ZpYVJlZmxlY3Rpb24oCisgICAgTWVzc2FnZSogbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICByZWZsZWN0aW9uLT5BZGRJbnQzMihtZXNzYWdlLCBGKCJwYWNrZWRfaW50MzIiKSwgNjAxKTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50NjQobWVzc2FnZSwgRigicGFja2VkX2ludDY0IiksIDYwMik7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQzMihtZXNzYWdlLCBGKCJwYWNrZWRfdWludDMyIiksIDYwMyk7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfdWludDY0IiksIDYwNCk7CisgIHJlZmxlY3Rpb24tPkFkZEludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50MzIiKSwgNjA1KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50NjQobWVzc2FnZSwgRigicGFja2VkX3NpbnQ2NCIpLCA2MDYpOworICByZWZsZWN0aW9uLT5BZGRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkMzIiKSwgNjA3KTsKKyAgcmVmbGVjdGlvbi0+QWRkVUludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDY0IiksIDYwOCk7CisgIHJlZmxlY3Rpb24tPkFkZEludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQzMiIpLCA2MDkpOworICByZWZsZWN0aW9uLT5BZGRJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkNjQiKSwgNjEwKTsKKyAgcmVmbGVjdGlvbi0+QWRkRmxvYXQobWVzc2FnZSwgRigicGFja2VkX2Zsb2F0IiksIDYxMSk7CisgIHJlZmxlY3Rpb24tPkFkZERvdWJsZShtZXNzYWdlLCBGKCJwYWNrZWRfZG91YmxlIiksIDYxMik7CisgIHJlZmxlY3Rpb24tPkFkZEJvb2wobWVzc2FnZSwgRigicGFja2VkX2Jvb2wiKSwgdHJ1ZSk7CisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicGFja2VkX2VudW0iKSwgZm9yZWlnbl9iYXJfKTsKKworICByZWZsZWN0aW9uLT5BZGRJbnQzMihtZXNzYWdlLCBGKCJwYWNrZWRfaW50MzIiKSwgNzAxKTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50NjQobWVzc2FnZSwgRigicGFja2VkX2ludDY0IiksIDcwMik7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQzMihtZXNzYWdlLCBGKCJwYWNrZWRfdWludDMyIiksIDcwMyk7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfdWludDY0IiksIDcwNCk7CisgIHJlZmxlY3Rpb24tPkFkZEludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50MzIiKSwgNzA1KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50NjQobWVzc2FnZSwgRigicGFja2VkX3NpbnQ2NCIpLCA3MDYpOworICByZWZsZWN0aW9uLT5BZGRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkMzIiKSwgNzA3KTsKKyAgcmVmbGVjdGlvbi0+QWRkVUludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDY0IiksIDcwOCk7CisgIHJlZmxlY3Rpb24tPkFkZEludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQzMiIpLCA3MDkpOworICByZWZsZWN0aW9uLT5BZGRJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkNjQiKSwgNzEwKTsKKyAgcmVmbGVjdGlvbi0+QWRkRmxvYXQobWVzc2FnZSwgRigicGFja2VkX2Zsb2F0IiksIDcxMSk7CisgIHJlZmxlY3Rpb24tPkFkZERvdWJsZShtZXNzYWdlLCBGKCJwYWNrZWRfZG91YmxlIiksIDcxMik7CisgIHJlZmxlY3Rpb24tPkFkZEJvb2wobWVzc2FnZSwgRigicGFja2VkX2Jvb2wiKSwgZmFsc2UpOworICByZWZsZWN0aW9uLT5BZGRFbnVtKG1lc3NhZ2UsIEYoInBhY2tlZF9lbnVtIiksIGZvcmVpZ25fYmF6Xyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICAvLyBXZSBoYXZlIHRvIHNwbGl0IHRoaXMgaW50byB0aHJlZSBmdW5jdGlvbiBvdGhlcndpc2UgaXQgY3JlYXRlcyBhIHN0YWNrCisgIC8vIGZyYW1lIHNvIGxhcmdlIHRoYXQgaXQgdHJpZ2dlcnMgYSB3YXJuaW5nLgorICBFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uMShtZXNzYWdlKTsKKyAgRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbjIobWVzc2FnZSk7CisgIEV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24zKG1lc3NhZ2UpOworfQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbjEoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIHN0ZDo6c3RyaW5nIHNjcmF0Y2g7CisgIGNvbnN0IE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOworCisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ludDMyIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW50NjQiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF91aW50MzIiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF91aW50NjQiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zaW50MzIiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zaW50NjQiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9maXhlZDMyIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQ2NCIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NmaXhlZDMyIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ZpeGVkNjQiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9mbG9hdCIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2RvdWJsZSIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2Jvb2wiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9ieXRlcyIpKSk7CisKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxncm91cCIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2xhenlfbWVzc2FnZSIpKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgcmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UiKSkpOworCisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxncm91cCIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBncm91cF9hXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpOworICBFWFBFQ1RfVFJVRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIG5lc3RlZF9iXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBmb3JlaWduX2NfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgaW1wb3J0X2RfKSk7CisgIHN1Yl9tZXNzYWdlID0KKyAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZV8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9sYXp5X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisgIHN1Yl9tZXNzYWdlID0KKyAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlIikpOworICBFWFBFQ1RfVFJVRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIG5lc3RlZF9iXykpOworCisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X2VudW0iKSkpOworCisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2NvcmQiKSkpOworCisgIEVYUEVDVF9FUSgxMDEsIHJlZmxlY3Rpb24tPkdldEludDMyKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ludDMyIikpKTsKKyAgRVhQRUNUX0VRKDEwMiwgcmVmbGVjdGlvbi0+R2V0SW50NjQobWVzc2FnZSwgRigib3B0aW9uYWxfaW50NjQiKSkpOworICBFWFBFQ1RfRVEoMTAzLCByZWZsZWN0aW9uLT5HZXRVSW50MzIobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDMyIikpKTsKKyAgRVhQRUNUX0VRKDEwNCwgcmVmbGVjdGlvbi0+R2V0VUludDY0KG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3VpbnQ2NCIpKSk7CisgIEVYUEVDVF9FUSgxMDUsIHJlZmxlY3Rpb24tPkdldEludDMyKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQzMiIpKSk7CisgIEVYUEVDVF9FUSgxMDYsIHJlZmxlY3Rpb24tPkdldEludDY0KG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQ2NCIpKSk7CisgIEVYUEVDVF9FUSgxMDcsIHJlZmxlY3Rpb24tPkdldFVJbnQzMihtZXNzYWdlLCBGKCJvcHRpb25hbF9maXhlZDMyIikpKTsKKyAgRVhQRUNUX0VRKDEwOCwgcmVmbGVjdGlvbi0+R2V0VUludDY0KG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZpeGVkNjQiKSkpOworICBFWFBFQ1RfRVEoMTA5LCByZWZsZWN0aW9uLT5HZXRJbnQzMihtZXNzYWdlLCBGKCJvcHRpb25hbF9zZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9FUSgxMTAsIHJlZmxlY3Rpb24tPkdldEludDY0KG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX0VRKDExMSwgcmVmbGVjdGlvbi0+R2V0RmxvYXQobWVzc2FnZSwgRigib3B0aW9uYWxfZmxvYXQiKSkpOworICBFWFBFQ1RfRVEoMTEyLCByZWZsZWN0aW9uLT5HZXREb3VibGUobWVzc2FnZSwgRigib3B0aW9uYWxfZG91YmxlIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+R2V0Qm9vbChtZXNzYWdlLCBGKCJvcHRpb25hbF9ib29sIikpKTsKKyAgRVhQRUNUX0VRKCIxMTUiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nIikpKTsKKyAgRVhQRUNUX0VRKCIxMTYiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfYnl0ZXMiKSkpOworCisgIEVYUEVDVF9FUSgiMTE1IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyYXRjaCkpOworICBFWFBFQ1RfRVEoIjExNiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9ieXRlcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyYXRjaCkpOworCisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxncm91cCIpKTsKKyAgRVhQRUNUX0VRKDExNywKKyAgICAgICAgICAgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgZ3JvdXBfYV8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKTsKKyAgRVhQRUNUX0VRKDExOCwKKyAgICAgICAgICAgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpOworICBFWFBFQ1RfRVEoMTE5LAorICAgICAgICAgICAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBmb3JlaWduX2NfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9FUSgxMjAsCisgICAgICAgICAgICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGltcG9ydF9kXykpOworICBzdWJfbWVzc2FnZSA9CisgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9FUSgxMjYsCisgICAgICAgICAgICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGltcG9ydF9lXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2xhenlfbWVzc2FnZSIpKTsKKyAgRVhQRUNUX0VRKDEyNywKKyAgICAgICAgICAgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisgIHN1Yl9tZXNzYWdlID0KKyAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlIikpOworICBFWFBFQ1RfRVEoMTI4LAorICAgICAgICAgICAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKKworICBFWFBFQ1RfRVEobmVzdGVkX2Jhel8sCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIikpKTsKKyAgRVhQRUNUX0VRKGZvcmVpZ25fYmF6XywKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKKyAgRVhQRUNUX0VRKGltcG9ydF9iYXpfLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfZW51bSIpKSk7CisKKyAgRVhQRUNUX0VRKCIxMjQiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0VRKCIxMjQiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpLCAmc2NyYXRjaCkpOworCisgIEVYUEVDVF9FUSgiMTI1IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2NvcmQiKSkpOworICBFWFBFQ1RfRVEoIjEyNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9jb3JkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoKSk7CisKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib25lb2ZfYnl0ZXMiKSkpOworICBFWFBFQ1RfRVEoIjYwNCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJvbmVvZl9ieXRlcyIpKSk7CisKKyAgaWYgKGJhc2VfZGVzY3JpcHRvcl8tPm5hbWUoKSA9PSAiVGVzdEFsbFR5cGVzIikgeworICAgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvbmVvZl91aW50MzIiKSkpOworICAgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvbmVvZl9zdHJpbmciKSkpOworICB9IGVsc2UgeworICAgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9uZW9mX3VpbnQzMiIpKSk7CisgICAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib25lb2Zfc3RyaW5nIikpKTsKKyAgICBFWFBFQ1RfRVEoNjAxLCByZWZsZWN0aW9uLT5HZXRVSW50MzIobWVzc2FnZSwgRigib25lb2ZfdWludDMyIikpKTsKKyAgICBFWFBFQ1RfRVEoIjYwMyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJvbmVvZl9zdHJpbmciKSkpOworICAgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib25lb2ZfbmVzdGVkX21lc3NhZ2UiKSk7CisgICAgRVhQRUNUX0VRKDYwMiwKKyAgICAgICAgICAgICAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbjIoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIHN0ZDo6c3RyaW5nIHNjcmF0Y2g7CisgIGNvbnN0IE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQzMiIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50NjQiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQzMiIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDY0IikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50MzIiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQ2NCIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQzMiIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQ2NCIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkMzIiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mbG9hdCIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZG91YmxlIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9ib29sIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIikpKTsKKworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkZ3JvdXAiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIikpKTsKKworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfY29yZCIpKSk7CisKKyAgRVhQRUNUX0VRKDIwMSwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQzMiIpLCAwKSk7CisgIEVYUEVDVF9FUSgyMDIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50NjQiKSwgMCkpOworICBFWFBFQ1RfRVEoMjAzLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDMyIiksIDApKTsKKyAgRVhQRUNUX0VRKDIwNCwKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQ2NCIpLCAwKSk7CisgIEVYUEVDVF9FUSgyMDUsCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQzMiIpLCAwKSk7CisgIEVYUEVDVF9FUSgyMDYsCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQ2NCIpLCAwKSk7CisgIEVYUEVDVF9FUSgyMDcsCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDMyIiksIDApKTsKKyAgRVhQRUNUX0VRKDIwOCwKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkNjQiKSwgMCkpOworICBFWFBFQ1RfRVEoMjA5LAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAwKSk7CisgIEVYUEVDVF9FUSgyMTAsCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDApKTsKKyAgRVhQRUNUX0VRKDIxMSwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRGbG9hdChtZXNzYWdlLCBGKCJyZXBlYXRlZF9mbG9hdCIpLCAwKSk7CisgIEVYUEVDVF9FUSgyMTIsCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZERvdWJsZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9kb3VibGUiKSwgMCkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEJvb2wobWVzc2FnZSwgRigicmVwZWF0ZWRfYm9vbCIpLCAwKSk7CisgIEVYUEVDVF9FUSgiMjE1IiwKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZyIpLCAwKSk7CisgIEVYUEVDVF9FUSgiMjE2IiwKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiksIDApKTsKKworICBFWFBFQ1RfRVEoIjIxNSIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciKSwgMCwgJnNjcmF0Y2gpKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigicmVwZWF0ZWRfYnl0ZXMiKSwgMCwgJnNjcmF0Y2gpKTsKKworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIpLCAwKTsKKyAgRVhQRUNUX0VRKDIxNywgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZF9ncm91cF9hXykpOworICBzdWJfbWVzc2FnZSA9CisgICAgICAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDApOworICBFWFBFQ1RfRVEoMjE4LAorICAgICAgICAgICAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIiksIDApOworICBFWFBFQ1RfRVEoMjE5LAorICAgICAgICAgICAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBmb3JlaWduX2NfKSk7CisgIHN1Yl9tZXNzYWdlID0KKyAgICAgICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwgMCk7CisgIEVYUEVDVF9FUSgyMjAsCisgICAgICAgICAgICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGltcG9ydF9kXykpOworICBzdWJfbWVzc2FnZSA9CisgICAgICAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2xhenlfbWVzc2FnZSIpLCAwKTsKKyAgRVhQRUNUX0VRKDIyNywKKyAgICAgICAgICAgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisKKyAgRVhQRUNUX0VRKG5lc3RlZF9iYXJfLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiksIDApKTsKKyAgRVhQRUNUX0VRKGZvcmVpZ25fYmFyXywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIDApKTsKKyAgRVhQRUNUX0VRKGltcG9ydF9iYXJfLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiksIDApKTsKKworICBFWFBFQ1RfRVEoIjIyNCIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMCkpOworICBFWFBFQ1RfRVEoIjIyNCIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMCwgJnNjcmF0Y2gpKTsKKworICBFWFBFQ1RfRVEoIjIyNSIsCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9jb3JkIiksIDApKTsKKyAgRVhQRUNUX0VRKCIyMjUiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigicmVwZWF0ZWRfY29yZCIpLCAwLCAmc2NyYXRjaCkpOworCisgIEVYUEVDVF9FUSgzMDEsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50MzIiKSwgMSkpOworICBFWFBFQ1RfRVEoMzAyLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDY0IiksIDEpKTsKKyAgRVhQRUNUX0VRKDMwMywKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQzMiIpLCAxKSk7CisgIEVYUEVDVF9FUSgzMDQsCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF91aW50NjQiKSwgMSkpOworICBFWFBFQ1RfRVEoMzA1LAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50MzIiKSwgMSkpOworICBFWFBFQ1RfRVEoMzA2LAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50NjQiKSwgMSkpOworICBFWFBFQ1RfRVEoMzA3LAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQzMiIpLCAxKSk7CisgIEVYUEVDVF9FUSgzMDgsCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDY0IiksIDEpKTsKKyAgRVhQRUNUX0VRKDMwOSwKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMSkpOworICBFWFBFQ1RfRVEoMzEwLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAxKSk7CisgIEVYUEVDVF9FUSgzMTEsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRmxvYXQobWVzc2FnZSwgRigicmVwZWF0ZWRfZmxvYXQiKSwgMSkpOworICBFWFBFQ1RfRVEoMzEyLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWREb3VibGUobWVzc2FnZSwgRigicmVwZWF0ZWRfZG91YmxlIiksIDEpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkQm9vbChtZXNzYWdlLCBGKCJyZXBlYXRlZF9ib29sIiksIDEpKTsKKyAgRVhQRUNUX0VRKCIzMTUiLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmcobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nIiksIDEpKTsKKyAgRVhQRUNUX0VRKCIzMTYiLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmcobWVzc2FnZSwgRigicmVwZWF0ZWRfYnl0ZXMiKSwgMSkpOworCisgIEVYUEVDVF9FUSgiMzE1IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZyIpLCAxLCAmc2NyYXRjaCkpOworICBFWFBFQ1RfRVEoIjMxNiIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBGKCJyZXBlYXRlZF9ieXRlcyIpLCAxLCAmc2NyYXRjaCkpOworCisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZGdyb3VwIiksIDEpOworICBFWFBFQ1RfRVEoMzE3LCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkX2dyb3VwX2FfKSk7CisgIHN1Yl9tZXNzYWdlID0KKyAgICAgICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMSk7CisgIEVYUEVDVF9FUSgzMTgsCisgICAgICAgICAgICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIG5lc3RlZF9iXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UoCisgICAgICBtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMSk7CisgIEVYUEVDVF9FUSgzMTksCisgICAgICAgICAgICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGZvcmVpZ25fY18pKTsKKyAgc3ViX21lc3NhZ2UgPQorICAgICAgJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLCAxKTsKKyAgRVhQRUNUX0VRKDMyMCwKKyAgICAgICAgICAgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgaW1wb3J0X2RfKSk7CisgIHN1Yl9tZXNzYWdlID0KKyAgICAgICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIiksIDEpOworICBFWFBFQ1RfRVEoMzI3LAorICAgICAgICAgICAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKKworICBFWFBFQ1RfRVEobmVzdGVkX2Jhel8sCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX2VudW0iKSwgMSkpOworICBFWFBFQ1RfRVEoZm9yZWlnbl9iYXpfLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEVudW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwgMSkpOworICBFWFBFQ1RfRVEoaW1wb3J0X2Jhel8sCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X2VudW0iKSwgMSkpOworCisgIEVYUEVDVF9FUSgiMzI0IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAxKSk7CisgIEVYUEVDVF9FUSgiMzI0IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAxLCAmc2NyYXRjaCkpOworCisgIEVYUEVDVF9FUSgiMzI1IiwKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2NvcmQiKSwgMSkpOworICBFWFBFQ1RfRVEoIjMyNSIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBGKCJyZXBlYXRlZF9jb3JkIiksIDEsICZzY3JhdGNoKSk7Cit9CisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uMygKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgc3RkOjpzdHJpbmcgc2NyYXRjaDsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfaW50MzIiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDY0IikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF91aW50MzIiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQ2NCIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ludDMyIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9zaW50NjQiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkNjQiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDMyIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9zZml4ZWQ2NCIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfZmxvYXQiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2RvdWJsZSIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfYm9vbCIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9ieXRlcyIpKSk7CisKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9uZXN0ZWRfZW51bSIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfZm9yZWlnbl9lbnVtIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9pbXBvcnRfZW51bSIpKSk7CisKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSkpOworCisgIEVYUEVDVF9FUSg0MDEsIHJlZmxlY3Rpb24tPkdldEludDMyKG1lc3NhZ2UsIEYoImRlZmF1bHRfaW50MzIiKSkpOworICBFWFBFQ1RfRVEoNDAyLCByZWZsZWN0aW9uLT5HZXRJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDY0IikpKTsKKyAgRVhQRUNUX0VRKDQwMywgcmVmbGVjdGlvbi0+R2V0VUludDMyKG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDMyIikpKTsKKyAgRVhQRUNUX0VRKDQwNCwgcmVmbGVjdGlvbi0+R2V0VUludDY0KG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDY0IikpKTsKKyAgRVhQRUNUX0VRKDQwNSwgcmVmbGVjdGlvbi0+R2V0SW50MzIobWVzc2FnZSwgRigiZGVmYXVsdF9zaW50MzIiKSkpOworICBFWFBFQ1RfRVEoNDA2LCByZWZsZWN0aW9uLT5HZXRJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQ2NCIpKSk7CisgIEVYUEVDVF9FUSg0MDcsIHJlZmxlY3Rpb24tPkdldFVJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfRVEoNDA4LCByZWZsZWN0aW9uLT5HZXRVSW50NjQobWVzc2FnZSwgRigiZGVmYXVsdF9maXhlZDY0IikpKTsKKyAgRVhQRUNUX0VRKDQwOSwgcmVmbGVjdGlvbi0+R2V0SW50MzIobWVzc2FnZSwgRigiZGVmYXVsdF9zZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9FUSg0MTAsIHJlZmxlY3Rpb24tPkdldEludDY0KG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ZpeGVkNjQiKSkpOworICBFWFBFQ1RfRVEoNDExLCByZWZsZWN0aW9uLT5HZXRGbG9hdChtZXNzYWdlLCBGKCJkZWZhdWx0X2Zsb2F0IikpKTsKKyAgRVhQRUNUX0VRKDQxMiwgcmVmbGVjdGlvbi0+R2V0RG91YmxlKG1lc3NhZ2UsIEYoImRlZmF1bHRfZG91YmxlIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkdldEJvb2wobWVzc2FnZSwgRigiZGVmYXVsdF9ib29sIikpKTsKKyAgRVhQRUNUX0VRKCI0MTUiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmciKSkpOworICBFWFBFQ1RfRVEoIjQxNiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X2J5dGVzIikpKTsKKworICBFWFBFQ1RfRVEoIjQxNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJkZWZhdWx0X3N0cmluZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyYXRjaCkpOworICBFWFBFQ1RfRVEoIjQxNiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJkZWZhdWx0X2J5dGVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoKSk7CisKKyAgRVhQRUNUX0VRKG5lc3RlZF9mb29fLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJkZWZhdWx0X25lc3RlZF9lbnVtIikpKTsKKyAgRVhQRUNUX0VRKGZvcmVpZ25fZm9vXywKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSkpOworICBFWFBFQ1RfRVEoaW1wb3J0X2Zvb18sCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoImRlZmF1bHRfaW1wb3J0X2VudW0iKSkpOworCisgIEVYUEVDVF9FUSgiNDI0IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0VRKCI0MjQiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIiksICZzY3JhdGNoKSk7CisKKyAgRVhQRUNUX0VRKCI0MjUiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9jb3JkIikpKTsKKyAgRVhQRUNUX0VRKCI0MjUiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9jb3JkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoKSk7Cit9CisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpFeHBlY3RQYWNrZWRGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2ludDMyIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfaW50NjQiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF91aW50MzIiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF91aW50NjQiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50MzIiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50NjQiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDMyIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQ2NCIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDMyIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkNjQiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9mbG9hdCIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2RvdWJsZSIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2Jvb2wiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9lbnVtIikpKTsKKworICBFWFBFQ1RfRVEoNjAxLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQzMiIpLCAwKSk7CisgIEVYUEVDVF9FUSg2MDIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQobWVzc2FnZSwgRigicGFja2VkX2ludDY0IiksIDApKTsKKyAgRVhQRUNUX0VRKDYwMywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX3VpbnQzMiIpLCAwKSk7CisgIEVYUEVDVF9FUSg2MDQsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF91aW50NjQiKSwgMCkpOworICBFWFBFQ1RfRVEoNjA1LCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50MzIiKSwgMCkpOworICBFWFBFQ1RfRVEoNjA2LCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50NjQiKSwgMCkpOworICBFWFBFQ1RfRVEoNjA3LAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkMzIiKSwgMCkpOworICBFWFBFQ1RfRVEoNjA4LAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50NjQobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkNjQiKSwgMCkpOworICBFWFBFQ1RfRVEoNjA5LAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMihtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkMzIiKSwgMCkpOworICBFWFBFQ1RfRVEoNjEwLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkNjQiKSwgMCkpOworICBFWFBFQ1RfRVEoNjExLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEZsb2F0KG1lc3NhZ2UsIEYoInBhY2tlZF9mbG9hdCIpLCAwKSk7CisgIEVYUEVDVF9FUSg2MTIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRG91YmxlKG1lc3NhZ2UsIEYoInBhY2tlZF9kb3VibGUiKSwgMCkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEJvb2wobWVzc2FnZSwgRigicGFja2VkX2Jvb2wiKSwgMCkpOworICBFWFBFQ1RfRVEoZm9yZWlnbl9iYXJfLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInBhY2tlZF9lbnVtIiksIDApKTsKKworICBFWFBFQ1RfRVEoNzAxLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQzMiIpLCAxKSk7CisgIEVYUEVDVF9FUSg3MDIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQobWVzc2FnZSwgRigicGFja2VkX2ludDY0IiksIDEpKTsKKyAgRVhQRUNUX0VRKDcwMywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX3VpbnQzMiIpLCAxKSk7CisgIEVYUEVDVF9FUSg3MDQsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF91aW50NjQiKSwgMSkpOworICBFWFBFQ1RfRVEoNzA1LCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50MzIiKSwgMSkpOworICBFWFBFQ1RfRVEoNzA2LCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50NjQiKSwgMSkpOworICBFWFBFQ1RfRVEoNzA3LAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkMzIiKSwgMSkpOworICBFWFBFQ1RfRVEoNzA4LAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50NjQobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkNjQiKSwgMSkpOworICBFWFBFQ1RfRVEoNzA5LAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMihtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkMzIiKSwgMSkpOworICBFWFBFQ1RfRVEoNzEwLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkNjQiKSwgMSkpOworICBFWFBFQ1RfRVEoNzExLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEZsb2F0KG1lc3NhZ2UsIEYoInBhY2tlZF9mbG9hdCIpLCAxKSk7CisgIEVYUEVDVF9FUSg3MTIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRG91YmxlKG1lc3NhZ2UsIEYoInBhY2tlZF9kb3VibGUiKSwgMSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRCb29sKG1lc3NhZ2UsIEYoInBhY2tlZF9ib29sIiksIDEpKTsKKyAgRVhQRUNUX0VRKGZvcmVpZ25fYmF6XywKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJwYWNrZWRfZW51bSIpLCAxKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkV4cGVjdENsZWFyVmlhUmVmbGVjdGlvbigKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgc3RkOjpzdHJpbmcgc2NyYXRjaDsKKyAgY29uc3QgTWVzc2FnZSogc3ViX21lc3NhZ2U7CisKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW50MzIiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW50NjQiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDMyIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3VpbnQ2NCIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zaW50MzIiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ludDY0IikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQ2NCIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zZml4ZWQ2NCIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9mbG9hdCIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9kb3VibGUiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfYm9vbCIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfYnl0ZXMiKSkpOworCisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKSk7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9sYXp5X21lc3NhZ2UiKSkpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICByZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF91bnZlcmlmaWVkX2xhenlfbWVzc2FnZSIpKSk7CisKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfZW51bSIpKSk7CisKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9jb3JkIikpKTsKKworICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5HZXRJbnQzMihtZXNzYWdlLCBGKCJvcHRpb25hbF9pbnQzMiIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5HZXRJbnQ2NChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbnQ2NCIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5HZXRVSW50MzIobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDMyIikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJvcHRpb25hbF91aW50NjQiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+R2V0SW50MzIobWVzc2FnZSwgRigib3B0aW9uYWxfc2ludDMyIikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkdldEludDY0KG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQ2NCIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5HZXRVSW50MzIobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5HZXRVSW50NjQobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQ2NCIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5HZXRJbnQzMihtZXNzYWdlLCBGKCJvcHRpb25hbF9zZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5HZXRJbnQ2NChtZXNzYWdlLCBGKCJvcHRpb25hbF9zZml4ZWQ2NCIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5HZXRGbG9hdChtZXNzYWdlLCBGKCJvcHRpb25hbF9mbG9hdCIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5HZXREb3VibGUobWVzc2FnZSwgRigib3B0aW9uYWxfZG91YmxlIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkdldEJvb2wobWVzc2FnZSwgRigib3B0aW9uYWxfYm9vbCIpKSk7CisgIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZyIpKSk7CisgIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2J5dGVzIikpKTsKKworICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmF0Y2gpKTsKKyAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigib3B0aW9uYWxfYnl0ZXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmF0Y2gpKTsKKworICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4KKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIikpOworICBFWFBFQ1RfRkFMU0Uoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBncm91cF9hXykpOworICBFWFBFQ1RfRVEoMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBncm91cF9hXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpOworICBFWFBFQ1RfRkFMU0Uoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKKyAgRVhQRUNUX0VRKDAsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIGZvcmVpZ25fY18pKTsKKyAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGZvcmVpZ25fY18pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKTsKKyAgRVhQRUNUX0ZBTFNFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgaW1wb3J0X2RfKSk7CisgIEVYUEVDVF9FUSgwLCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGltcG9ydF9kXykpOworICBzdWJfbWVzc2FnZSA9CisgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9GQUxTRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIGltcG9ydF9lXykpOworICBFWFBFQ1RfRVEoMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZV8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9sYXp5X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9GQUxTRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIG5lc3RlZF9iXykpOworICBFWFBFQ1RfRVEoMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKKyAgc3ViX21lc3NhZ2UgPQorICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9GQUxTRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIG5lc3RlZF9iXykpOworICBFWFBFQ1RfRVEoMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKKworICAvLyBFbnVtcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBlbnVtLgorICBFWFBFQ1RfRVEobmVzdGVkX2Zvb18sCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIikpKTsKKyAgRVhQRUNUX0VRKGZvcmVpZ25fZm9vXywKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKKyAgRVhQRUNUX0VRKGltcG9ydF9mb29fLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfZW51bSIpKSk7CisKKyAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpLCAmc2NyYXRjaCkpOworCisgIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2NvcmQiKSkpOworICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9jb3JkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoKSk7CisKKyAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQzMiIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50NjQiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQzMiIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDY0IikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50MzIiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQ2NCIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQ2NCIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mbG9hdCIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZG91YmxlIikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9ib29sIikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIikpKTsKKworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkZ3JvdXAiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIikpKTsKKworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfY29yZCIpKSk7CisKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9pbnQzMiIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDY0IikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDMyIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDY0IikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ludDMyIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ludDY0IikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkNjQiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9zZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfZmxvYXQiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9kb3VibGUiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9ib29sIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfYnl0ZXMiKSkpOworCisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X25lc3RlZF9lbnVtIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfZm9yZWlnbl9lbnVtIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfaW1wb3J0X2VudW0iKSkpOworCisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3N0cmluZ19waWVjZSIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSkpOworCisgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCisgIEVYUEVDVF9FUSg0MSwgcmVmbGVjdGlvbi0+R2V0SW50MzIobWVzc2FnZSwgRigiZGVmYXVsdF9pbnQzMiIpKSk7CisgIEVYUEVDVF9FUSg0MiwgcmVmbGVjdGlvbi0+R2V0SW50NjQobWVzc2FnZSwgRigiZGVmYXVsdF9pbnQ2NCIpKSk7CisgIEVYUEVDVF9FUSg0MywgcmVmbGVjdGlvbi0+R2V0VUludDMyKG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDMyIikpKTsKKyAgRVhQRUNUX0VRKDQ0LCByZWZsZWN0aW9uLT5HZXRVSW50NjQobWVzc2FnZSwgRigiZGVmYXVsdF91aW50NjQiKSkpOworICBFWFBFQ1RfRVEoLTQ1LCByZWZsZWN0aW9uLT5HZXRJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQzMiIpKSk7CisgIEVYUEVDVF9FUSg0NiwgcmVmbGVjdGlvbi0+R2V0SW50NjQobWVzc2FnZSwgRigiZGVmYXVsdF9zaW50NjQiKSkpOworICBFWFBFQ1RfRVEoNDcsIHJlZmxlY3Rpb24tPkdldFVJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfRVEoNDgsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkNjQiKSkpOworICBFWFBFQ1RfRVEoNDksIHJlZmxlY3Rpb24tPkdldEludDMyKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfRVEoLTUwLCByZWZsZWN0aW9uLT5HZXRJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX0VRKDUxLjUsIHJlZmxlY3Rpb24tPkdldEZsb2F0KG1lc3NhZ2UsIEYoImRlZmF1bHRfZmxvYXQiKSkpOworICBFWFBFQ1RfRVEoNTJlMywgcmVmbGVjdGlvbi0+R2V0RG91YmxlKG1lc3NhZ2UsIEYoImRlZmF1bHRfZG91YmxlIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+R2V0Qm9vbChtZXNzYWdlLCBGKCJkZWZhdWx0X2Jvb2wiKSkpOworICBFWFBFQ1RfRVEoImhlbGxvIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nIikpKTsKKyAgRVhQRUNUX0VRKCJ3b3JsZCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X2J5dGVzIikpKTsKKworICBFWFBFQ1RfRVEoImhlbGxvIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nIiksICZzY3JhdGNoKSk7CisgIEVYUEVDVF9FUSgid29ybGQiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9ieXRlcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoKSk7CisKKyAgRVhQRUNUX0VRKG5lc3RlZF9iYXJfLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJkZWZhdWx0X25lc3RlZF9lbnVtIikpKTsKKyAgRVhQRUNUX0VRKGZvcmVpZ25fYmFyXywKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSkpOworICBFWFBFQ1RfRVEoaW1wb3J0X2Jhcl8sCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoImRlZmF1bHRfaW1wb3J0X2VudW0iKSkpOworCisgIEVYUEVDVF9FUSgiYWJjIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0VRKCJhYmMiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIiksICZzY3JhdGNoKSk7CisKKyAgRVhQRUNUX0VRKCIxMjMiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9jb3JkIikpKTsKKyAgRVhQRUNUX0VRKCIxMjMiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9jb3JkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok1vZGlmeVJlcGVhdGVkRmllbGRzVmlhUmVmbGVjdGlvbigKKyAgICBNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOworCisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50MzIiKSwgMSwgNTAxKTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQ2NCIpLCAxLCA1MDIpOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFVJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF91aW50MzIiKSwgMSwgNTAzKTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRVSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDY0IiksIDEsIDUwNCk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDMyIiksIDEsIDUwNSk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDY0IiksIDEsIDUwNik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkMzIiKSwgMSwgNTA3KTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRVSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQ2NCIpLCAxLCA1MDgpOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDEsIDUwOSk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMSwgNTEwKTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRGbG9hdChtZXNzYWdlLCBGKCJyZXBlYXRlZF9mbG9hdCIpLCAxLCA1MTEpOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZERvdWJsZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9kb3VibGUiKSwgMSwgNTEyKTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRCb29sKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Jvb2wiKSwgMSwgdHJ1ZSk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZyIpLCAxLCAiNTE1Iik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiksIDEsICI1MTYiKTsKKworICBzdWJfbWVzc2FnZSA9CisgICAgICByZWZsZWN0aW9uLT5NdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkZ3JvdXAiKSwgMSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCByZXBlYXRlZF9ncm91cF9hXywgNTE3KTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5NdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDUxOCk7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZSgKKyAgICAgIG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpLCAxKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIGZvcmVpZ25fY18sIDUxOSk7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZSgKKyAgICAgIG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksIDEpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgaW1wb3J0X2RfLCA1MjApOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UoCisgICAgICBtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSwgMSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDUyNyk7CisKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRfZm9vXyk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25fZm9vXyk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0X2Zvb18pOworCisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAxLCAiNTI0Iik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2NvcmQiKSwgMSwgIjUyNSIpOworfQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6UmVtb3ZlTGFzdFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oCisgICAgTWVzc2FnZSogbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IG91dHB1dDsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZSwgJm91dHB1dCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0LnNpemUoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG91dHB1dFtpXTsKKyAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSBjb250aW51ZTsKKworICAgIHJlZmxlY3Rpb24tPlJlbW92ZUxhc3QobWVzc2FnZSwgZmllbGQpOworICB9Cit9CisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpSZWxlYXNlTGFzdFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oCisgICAgTWVzc2FnZSogbWVzc2FnZSwgYm9vbCBleHBlY3RfZXh0ZW5zaW9uc19ub3RudWxsKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gb3V0cHV0OworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKCptZXNzYWdlLCAmb3V0cHV0KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXQuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gb3V0cHV0W2ldOworICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIGNvbnRpbnVlOworICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgY29udGludWU7CisKKyAgICBNZXNzYWdlKiByZWxlYXNlZCA9IHJlZmxlY3Rpb24tPlJlbGVhc2VMYXN0KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICBpZiAoIWZpZWxkLT5pc19leHRlbnNpb24oKSB8fCBleHBlY3RfZXh0ZW5zaW9uc19ub3RudWxsKSB7CisgICAgICBBU1NFUlRfVFJVRShyZWxlYXNlZCAhPSBudWxscHRyKQorICAgICAgICAgIDw8ICJSZWxlYXNlTGFzdCByZXR1cm5lZCBudWxscHRyIGZvcjogIiA8PCBmaWVsZC0+bmFtZSgpOworICAgIH0KKyAgICBkZWxldGUgcmVsZWFzZWQ7CisgIH0KK30KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlN3YXBSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBvdXRwdXQ7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMoKm1lc3NhZ2UsICZvdXRwdXQpOworICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dC5zaXplKCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBvdXRwdXRbaV07CisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgY29udGludWU7CisKKyAgICByZWZsZWN0aW9uLT5Td2FwRWxlbWVudHMobWVzc2FnZSwgZmllbGQsIDAsIDEpOworICB9Cit9CisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjoKKyAgICBTZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb051bGxWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMoKm1lc3NhZ2UsICZmaWVsZHMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGZpZWxkc1tpXTsKKyAgICBpZiAoIWZpZWxkLT5pc19vcHRpb25hbCgpIHx8CisgICAgICAgIGZpZWxkLT5jcHBfdHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKQorICAgICAgY29udGludWU7CisKKyAgICByZWZsZWN0aW9uLT5TZXRBbGxvY2F0ZWRNZXNzYWdlKG1lc3NhZ2UsIG51bGxwdHIsIGZpZWxkKTsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6CisgICAgU2V0QWxsb2NhdGVkT3B0aW9uYWxNZXNzYWdlRmllbGRzVG9NZXNzYWdlVmlhUmVmbGVjdGlvbigKKyAgICAgICAgTWVzc2FnZSogZnJvbV9tZXNzYWdlLCBNZXNzYWdlKiB0b19tZXNzYWdlKSB7CisgIEVYUEVDVF9FUShmcm9tX21lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSwgdG9fbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogZnJvbV9yZWZsZWN0aW9uID0gZnJvbV9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHRvX3JlZmxlY3Rpb24gPSB0b19tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBmcm9tX3JlZmxlY3Rpb24tPkxpc3RGaWVsZHMoKmZyb21fbWVzc2FnZSwgJmZpZWxkcyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZmllbGRzW2ldOworICAgIGlmICghZmllbGQtPmlzX29wdGlvbmFsKCkgfHwKKyAgICAgICAgZmllbGQtPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpCisgICAgICBjb250aW51ZTsKKworICAgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlID0gZnJvbV9yZWZsZWN0aW9uLT5SZWxlYXNlTWVzc2FnZShmcm9tX21lc3NhZ2UsIGZpZWxkKTsKKyAgICB0b19yZWZsZWN0aW9uLT5TZXRBbGxvY2F0ZWRNZXNzYWdlKHRvX21lc3NhZ2UsIHN1Yl9tZXNzYWdlLCBmaWVsZCk7CisgIH0KK30KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok1lc3NhZ2VSZWxlYXNlU3RhdGUgZXhwZWN0ZWRfcmVsZWFzZV9zdGF0ZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworCisgIHN0YXRpYyBjb25zdCBjaGFyKiBmaWVsZHNbXSA9IHsKKyAgICAgICJvcHRpb25hbGdyb3VwIiwKKyAgICAgICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIsCisgICAgICAib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIiwKKyAgICAgICJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIsCisgIH07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShmaWVsZHMpOyBpKyspIHsKKyAgICBNZXNzYWdlKiByZWxlYXNlZCA9IHJlZmxlY3Rpb24tPlJlbGVhc2VNZXNzYWdlKG1lc3NhZ2UsIEYoZmllbGRzW2ldKSk7CisgICAgc3dpdGNoIChleHBlY3RlZF9yZWxlYXNlX3N0YXRlKSB7CisgICAgICBjYXNlIElTX05VTEw6CisgICAgICAgIEVYUEVDVF9UUlVFKHJlbGVhc2VkID09IG51bGxwdHIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTk9UX05VTEw6CisgICAgICAgIEVYUEVDVF9UUlVFKHJlbGVhc2VkICE9IG51bGxwdHIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0FOX0JFX05VTEw6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWxldGUgcmVsZWFzZWQ7CisgICAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKCptZXNzYWdlLCBGKGZpZWxkc1tpXSkpKTsKKyAgfQorfQorCisvLyBDaGVjayB0aGF0IHRoZSBwYXNzZWQtaW4gc2VyaWFsaXphdGlvbiBpcyB0aGUgY2Fub25pY2FsIHNlcmlhbGl6YXRpb24gd2UKKy8vIGV4cGVjdCBmb3IgYSBUZXN0RmllbGRPcmRlcmluZ3MgbWVzc2FnZSBmaWxsZWQgaW4gYnkKKy8vIFNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMoKS4KK2lubGluZSB2b2lkIEV4cGVjdEFsbEZpZWxkc0FuZEV4dGVuc2lvbnNJbk9yZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkKSB7CisgIC8vIFdlIHNldCBlYWNoIGZpZWxkIGluZGl2aWR1YWxseSwgc2VyaWFsaXplIHNlcGFyYXRlbHksIGFuZCBjb25jYXRlbmF0ZSBhbGwKKyAgLy8gdGhlIHN0cmluZ3MgaW4gY2Fub25pY2FsIG9yZGVyIHRvIGRldGVybWluZSB0aGUgZXhwZWN0ZWQgc2VyaWFsaXphdGlvbi4KKyAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQ7CisgIHVuaXR0ZXN0OjpUZXN0RmllbGRPcmRlcmluZ3MgbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRfbXlfaW50KDEpOyAgLy8gRmllbGQgMS4KKyAgbWVzc2FnZS5BcHBlbmRUb1N0cmluZygmZXhwZWN0ZWQpOworICBtZXNzYWdlLkNsZWFyKCk7CisgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpteV9leHRlbnNpb25faW50LCAyMyk7ICAvLyBGaWVsZCA1LgorICBtZXNzYWdlLkFwcGVuZFRvU3RyaW5nKCZleHBlY3RlZCk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgbWVzc2FnZS5zZXRfbXlfc3RyaW5nKCJmb28iKTsgIC8vIEZpZWxkIDExLgorICBtZXNzYWdlLkFwcGVuZFRvU3RyaW5nKCZleHBlY3RlZCk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgbWVzc2FnZS5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om15X2V4dGVuc2lvbl9zdHJpbmcsICJiYXIiKTsgIC8vIEZpZWxkIDUwLgorICBtZXNzYWdlLkFwcGVuZFRvU3RyaW5nKCZleHBlY3RlZCk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgbWVzc2FnZS5zZXRfbXlfZmxvYXQoMS4wKTsgIC8vIEZpZWxkIDEwMS4KKyAgbWVzc2FnZS5BcHBlbmRUb1N0cmluZygmZXhwZWN0ZWQpOworICBtZXNzYWdlLkNsZWFyKCk7CisKKyAgLy8gV2UgZG9uJ3QgRVhQRUNUX0VRKCkgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBwcmludCByYXcgYnl0ZXMgdG8gc3Rkb3V0LgorICBFWFBFQ1RfVFJVRShzZXJpYWxpemVkID09IGV4cGVjdGVkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIFRlc3RVdGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVEVTVF9VVElMX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaW5jIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNDRhZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5pbmMKQEAgLTAsMCArMSwyNDM0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIG5lZWRzIHRvIGJlIGluY2x1ZGVkIGFzIC5pbmMgYXMgaXQgZGVwZW5kcyBvbiB0aGUgbmFtZXNwYWNlcworLy8gKHVuaXR0ZXN0IGFuZCB1bml0dGVzdF9pbXBvcnQpIGJlaW5nIHNldCB1cCBwcm9wZXJseS4gSXQgaXMgYWxzbyBpbmNsdWRlZAorLy8gd2l0aGluIGFuIGVuY2xvc2luZyBuYW1lc3BhY2UgYW5kIHJlcXVpcmVzIGhlYWRlciBmaWxlcyB0byBiZSBpbmNsdWRlZAorLy8gb3V0IG9mIHRoaXMgZmlsZS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgVGVzdFV0aWwgeworCisvLyBTZXQgZXZlcnkgZmllbGQgaW4gdGhlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCitpbmxpbmUgdm9pZCBTZXRBbGxGaWVsZHMoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSk7CitpbmxpbmUgdm9pZCBTZXRPcHRpb25hbEZpZWxkcyhVTklUVEVTVDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKTsKK2lubGluZSB2b2lkIEFkZFJlcGVhdGVkRmllbGRzMShVTklUVEVTVDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKTsKK2lubGluZSB2b2lkIEFkZFJlcGVhdGVkRmllbGRzMihVTklUVEVTVDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKTsKK2lubGluZSB2b2lkIFNldERlZmF1bHRGaWVsZHMoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSk7CitpbmxpbmUgdm9pZCBTZXRPbmVvZkZpZWxkcyhVTklUVEVTVDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKTsKK2lubGluZSB2b2lkIFNldEFsbEV4dGVuc2lvbnMoVU5JVFRFU1Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlKTsKK2lubGluZSB2b2lkIFNldE9uZW9mRmllbGRzKFVOSVRURVNUOjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZSk7CitpbmxpbmUgdm9pZCBTZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKFVOSVRURVNUOjpUZXN0RmllbGRPcmRlcmluZ3MqIG1lc3NhZ2UpOworaW5saW5lIHZvaWQgU2V0UGFja2VkRmllbGRzKFVOSVRURVNUOjpUZXN0UGFja2VkVHlwZXMqIG1lc3NhZ2UpOworaW5saW5lIHZvaWQgU2V0UGFja2VkRXh0ZW5zaW9ucyhVTklUVEVTVDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMqIG1lc3NhZ2UpOworaW5saW5lIHZvaWQgU2V0VW5wYWNrZWRGaWVsZHMoVU5JVFRFU1Q6OlRlc3RVbnBhY2tlZFR5cGVzKiBtZXNzYWdlKTsKK2lubGluZSB2b2lkIFNldE9uZW9mMShVTklUVEVTVDo6VGVzdE9uZW9mMiogbWVzc2FnZSk7CitpbmxpbmUgdm9pZCBTZXRPbmVvZjIoVU5JVFRFU1Q6OlRlc3RPbmVvZjIqIG1lc3NhZ2UpOworCisvLyBVc2UgdGhlIHJlcGVhdGVkIHZlcnNpb25zIG9mIHRoZSBzZXRfKigpIGFjY2Vzc29ycyB0byBtb2RpZnkgYWxsIHRoZQorLy8gcmVwZWF0ZWQgZmllbGRzIG9mIHRoZSBtZXNzYWdlICh3aGljaCBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4KKy8vIGluaXRpYWxpemVkIHdpdGggU2V0KkZpZWxkcygpKS4gIFNldCpGaWVsZHMoKSBpdHNlbGYgb25seSB0ZXN0cworLy8gdGhlIGFkZF8qKCkgYWNjZXNzb3JzLgoraW5saW5lIHZvaWQgTW9kaWZ5UmVwZWF0ZWRGaWVsZHMoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSk7CitpbmxpbmUgdm9pZCBNb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoVU5JVFRFU1Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlKTsKKworLy8gQ2hlY2sgdGhhdCBhbGwgZmllbGRzIGhhdmUgdGhlIHZhbHVlcyB0aGF0IHRoZXkgc2hvdWxkIGhhdmUgYWZ0ZXIKKy8vIFNldCpGaWVsZHMoKSBpcyBjYWxsZWQuCitpbmxpbmUgdm9pZCBFeHBlY3RBbGxGaWVsZHNTZXQoY29uc3QgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSk7CitpbmxpbmUgdm9pZCBFeHBlY3RBbGxFeHRlbnNpb25zU2V0KGNvbnN0IFVOSVRURVNUOjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSk7CitpbmxpbmUgdm9pZCBFeHBlY3RQYWNrZWRGaWVsZHNTZXQoY29uc3QgVU5JVFRFU1Q6OlRlc3RQYWNrZWRUeXBlcyYgbWVzc2FnZSk7CitpbmxpbmUgdm9pZCBFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KAorICAgIGNvbnN0IFVOSVRURVNUOjpUZXN0UGFja2VkRXh0ZW5zaW9ucyYgbWVzc2FnZSk7CitpbmxpbmUgdm9pZCBFeHBlY3RVbnBhY2tlZEZpZWxkc1NldChjb25zdCBVTklUVEVTVDo6VGVzdFVucGFja2VkVHlwZXMmIG1lc3NhZ2UpOworaW5saW5lIHZvaWQgRXhwZWN0VW5wYWNrZWRFeHRlbnNpb25zU2V0KAorICAgIGNvbnN0IFVOSVRURVNUOjpUZXN0VW5wYWNrZWRFeHRlbnNpb25zJiBtZXNzYWdlKTsKK2lubGluZSB2b2lkIEV4cGVjdE9uZW9mU2V0MShjb25zdCBVTklUVEVTVDo6VGVzdE9uZW9mMiYgbWVzc2FnZSk7CitpbmxpbmUgdm9pZCBFeHBlY3RPbmVvZlNldDIoY29uc3QgVU5JVFRFU1Q6OlRlc3RPbmVvZjImIG1lc3NhZ2UpOworCisvLyBFeHBlY3QgdGhhdCB0aGUgbWVzc2FnZSBpcyBtb2RpZmllZCBhcyB3b3VsZCBiZSBleHBlY3RlZCBmcm9tCisvLyBNb2RpZnkqRmllbGRzKCkuCitpbmxpbmUgdm9pZCBFeHBlY3RSZXBlYXRlZEZpZWxkc01vZGlmaWVkKGNvbnN0IFVOSVRURVNUOjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpOworaW5saW5lIHZvaWQgRXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQoCisgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RBbGxFeHRlbnNpb25zJiBtZXNzYWdlKTsKKworLy8gQ2hlY2sgdGhhdCBhbGwgZmllbGRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCitpbmxpbmUgdm9pZCBFeHBlY3RDbGVhcihjb25zdCBVTklUVEVTVDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKTsKK2lubGluZSB2b2lkIEV4cGVjdEV4dGVuc2lvbnNDbGVhcihjb25zdCBVTklUVEVTVDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpOworaW5saW5lIHZvaWQgRXhwZWN0T25lb2ZDbGVhcihjb25zdCBVTklUVEVTVDo6VGVzdE9uZW9mMiYgbWVzc2FnZSk7CisKKy8vIENoZWNrIHRoYXQgYWxsIHJlcGVhdGVkIGZpZWxkcyBoYXZlIGhhZCB0aGVpciBsYXN0IGVsZW1lbnRzIHJlbW92ZWQuCitpbmxpbmUgdm9pZCBFeHBlY3RMYXN0UmVwZWF0ZWRzUmVtb3ZlZChjb25zdCBVTklUVEVTVDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKTsKK2lubGluZSB2b2lkIEV4cGVjdExhc3RSZXBlYXRlZEV4dGVuc2lvbnNSZW1vdmVkKAorICAgIGNvbnN0IFVOSVRURVNUOjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSk7CitpbmxpbmUgdm9pZCBFeHBlY3RMYXN0UmVwZWF0ZWRzUmVsZWFzZWQoY29uc3QgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSk7CitpbmxpbmUgdm9pZCBFeHBlY3RMYXN0UmVwZWF0ZWRFeHRlbnNpb25zUmVsZWFzZWQoCisgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RBbGxFeHRlbnNpb25zJiBtZXNzYWdlKTsKKworLy8gQ2hlY2sgdGhhdCBhbGwgcmVwZWF0ZWQgZmllbGRzIGhhdmUgaGFkIHRoZWlyIGZpcnN0IGFuZCBsYXN0IGVsZW1lbnRzCisvLyBzd2FwcGVkLgoraW5saW5lIHZvaWQgRXhwZWN0UmVwZWF0ZWRzU3dhcHBlZChjb25zdCBVTklUVEVTVDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKTsKK2lubGluZSB2b2lkIEV4cGVjdFJlcGVhdGVkRXh0ZW5zaW9uc1N3YXBwZWQoCisgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RBbGxFeHRlbnNpb25zJiBtZXNzYWdlKTsKKworaW5saW5lIHZvaWQgRXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKGNvbnN0IFVOSVRURVNUOjpUZXN0T25lb2YyJiBtZXNzYWdlKTsKKworfSAgLy8gbmFtZXNwYWNlIFRlc3RVdGlsCisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSkgeworICBTZXRPcHRpb25hbEZpZWxkcyhtZXNzYWdlKTsKKyAgQWRkUmVwZWF0ZWRGaWVsZHMxKG1lc3NhZ2UpOworICBBZGRSZXBlYXRlZEZpZWxkczIobWVzc2FnZSk7CisgIFNldERlZmF1bHRGaWVsZHMobWVzc2FnZSk7CisgIFNldE9uZW9mRmllbGRzKG1lc3NhZ2UpOworfQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6U2V0T3B0aW9uYWxGaWVsZHMoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSkgeworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfaW50MzIoMTAxKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ludDY0KDEwMik7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF91aW50MzIoMTAzKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3VpbnQ2NCgxMDQpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfc2ludDMyKDEwNSk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9zaW50NjQoMTA2KTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ZpeGVkMzIoMTA3KTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ZpeGVkNjQoMTA4KTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3NmaXhlZDMyKDEwOSk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9zZml4ZWQ2NCgxMTApOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZmxvYXQoMTExKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2RvdWJsZSgxMTIpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfYm9vbCh0cnVlKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3N0cmluZygiMTE1Iik7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9ieXRlcygiMTE2Iik7CisKKyAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbGdyb3VwKCktPnNldF9hKDExNyk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDExOCk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCktPnNldF9jKDExOSk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UoKS0+c2V0X2QoMTIwKTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKS0+c2V0X2UoMTI2KTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9sYXp5X21lc3NhZ2UoKS0+c2V0X2JiKDEyNyk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UoKS0+c2V0X2JiKDEyOCk7CisKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX25lc3RlZF9lbnVtKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBWik7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9mb3JlaWduX2VudW0oVU5JVFRFU1Q6OkZPUkVJR05fQkFaKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ltcG9ydF9lbnVtKFVOSVRURVNUX0lNUE9SVDo6SU1QT1JUX0JBWik7CisKKyAgLy8gU3RyaW5nUGllY2UgYW5kIENvcmQgZmllbGRzIGFyZSBvbmx5IGFjY2Vzc2libGUgdmlhIHJlZmxlY3Rpb24gaW4gdGhlCisgIC8vIG9wZW4gc291cmNlIHJlbGVhc2U7IHNlZSBjb21tZW50cyBpbiBjb21waWxlci9jcHAvc3RyaW5nX2ZpZWxkLmNjLgorI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0U3RyaW5nKAorICAgICAgbWVzc2FnZSwKKyAgICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKSwKKyAgICAgICIxMjQiKTsKKyAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRTdHJpbmcoCisgICAgICBtZXNzYWdlLCBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfY29yZCIpLAorICAgICAgIjEyNSIpOworI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpBZGRSZXBlYXRlZEZpZWxkczEoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSkgeworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50MzIoMjAxKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ludDY0KDIwMik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50MzIoMjAzKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3VpbnQ2NCgyMDQpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ludDMyKDIwNSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zaW50NjQoMjA2KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZpeGVkMzIoMjA3KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZpeGVkNjQoMjA4KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NmaXhlZDMyKDIwOSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQ2NCgyMTApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZmxvYXQoMjExKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2RvdWJsZSgyMTIpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfYm9vbCh0cnVlKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3N0cmluZygiMjE1Iik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9ieXRlcygiMjE2Iik7CisKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkZ3JvdXAoKS0+c2V0X2EoMjE3KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigyMTgpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKCktPnNldF9jKDIxOSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSgpLT5zZXRfZCgyMjApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbGF6eV9tZXNzYWdlKCktPnNldF9iYigyMjcpOworCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpCQVIpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9lbnVtKFVOSVRURVNUOjpGT1JFSUdOX0JBUik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbXBvcnRfZW51bShVTklUVEVTVF9JTVBPUlQ6OklNUE9SVF9CQVIpOworCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKyAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5BZGRTdHJpbmcoCisgICAgICBtZXNzYWdlLAorICAgICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLAorICAgICAgIjIyNCIpOworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkFkZFN0cmluZygKKyAgICAgIG1lc3NhZ2UsIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9jb3JkIiksCisgICAgICAiMjI1Iik7CisjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCit9CisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpBZGRSZXBlYXRlZEZpZWxkczIoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSkgeworICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQzMigzMDEpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50NjQoMzAyKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3VpbnQzMigzMDMpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfdWludDY0KDMwNCk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zaW50MzIoMzA1KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NpbnQ2NCgzMDYpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZml4ZWQzMigzMDcpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZml4ZWQ2NCgzMDgpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ZpeGVkMzIoMzA5KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NmaXhlZDY0KDMxMCk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mbG9hdCgzMTEpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZG91YmxlKDMxMik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9ib29sKGZhbHNlKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3N0cmluZygiMzE1Iik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9ieXRlcygiMzE2Iik7CisKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkZ3JvdXAoKS0+c2V0X2EoMzE3KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigzMTgpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKCktPnNldF9jKDMxOSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSgpLT5zZXRfZCgzMjApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbGF6eV9tZXNzYWdlKCktPnNldF9iYigzMjcpOworCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpCQVopOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9lbnVtKFVOSVRURVNUOjpGT1JFSUdOX0JBWik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbXBvcnRfZW51bShVTklUVEVTVF9JTVBPUlQ6OklNUE9SVF9CQVopOworCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKyAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5BZGRTdHJpbmcoCisgICAgICBtZXNzYWdlLAorICAgICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLAorICAgICAgIjMyNCIpOworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkFkZFN0cmluZygKKyAgICAgIG1lc3NhZ2UsIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9jb3JkIiksCisgICAgICAiMzI1Iik7CisjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OlNldERlZmF1bHRGaWVsZHMoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSkgeworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9pbnQzMig0MDEpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9pbnQ2NCg0MDIpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF91aW50MzIoNDAzKTsKKyAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfdWludDY0KDQwNCk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NpbnQzMig0MDUpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9zaW50NjQoNDA2KTsKKyAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfZml4ZWQzMig0MDcpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9maXhlZDY0KDQwOCk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NmaXhlZDMyKDQwOSk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NmaXhlZDY0KDQxMCk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2Zsb2F0KDQxMSk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2RvdWJsZSg0MTIpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9ib29sKGZhbHNlKTsKKyAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfc3RyaW5nKCI0MTUiKTsKKyAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfYnl0ZXMoIjQxNiIpOworCisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X25lc3RlZF9lbnVtKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkZPTyk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ZvcmVpZ25fZW51bShVTklUVEVTVDo6Rk9SRUlHTl9GT08pOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9pbXBvcnRfZW51bShVTklUVEVTVF9JTVBPUlQ6OklNUE9SVF9GT08pOworCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKyAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRTdHJpbmcoCisgICAgICBtZXNzYWdlLAorICAgICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoImRlZmF1bHRfc3RyaW5nX3BpZWNlIiksICI0MjQiKTsKKyAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRTdHJpbmcoCisgICAgICBtZXNzYWdlLCBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgiZGVmYXVsdF9jb3JkIiksCisgICAgICAiNDI1Iik7CisjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6Ok1vZGlmeVJlcGVhdGVkRmllbGRzKFVOSVRURVNUOjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ludDMyKDEsIDUwMSk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9pbnQ2NCgxLCA1MDIpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfdWludDMyKDEsIDUwMyk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF91aW50NjQoMSwgNTA0KTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX3NpbnQzMigxLCA1MDUpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc2ludDY0KDEsIDUwNik7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9maXhlZDMyKDEsIDUwNyk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9maXhlZDY0KDEsIDUwOCk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zZml4ZWQzMigxLCA1MDkpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc2ZpeGVkNjQoMSwgNTEwKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2Zsb2F0KDEsIDUxMSk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9kb3VibGUoMSwgNTEyKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2Jvb2woMSwgdHJ1ZSk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zdHJpbmcoMSwgIjUxNSIpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfYnl0ZXMoMSwgIjUxNiIpOworCisgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRncm91cCgxKS0+c2V0X2EoNTE3KTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgxKS0+c2V0X2JiKDUxOCk7CisgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLT5zZXRfYyg1MTkpOworICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlKDEpLT5zZXRfZCg1MjApOworICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX2xhenlfbWVzc2FnZSgxKS0+c2V0X2JiKDUyNyk7CisKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX25lc3RlZF9lbnVtKDEsIFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkZPTyk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9mb3JlaWduX2VudW0oMSwgVU5JVFRFU1Q6OkZPUkVJR05fRk9PKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ltcG9ydF9lbnVtKDEsIFVOSVRURVNUX0lNUE9SVDo6SU1QT1JUX0ZPTyk7CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldFJlcGVhdGVkU3RyaW5nKAorICAgICAgbWVzc2FnZSwKKyAgICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMSwKKyAgICAgICI1MjQiKTsKKyAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRSZXBlYXRlZFN0cmluZygKKyAgICAgIG1lc3NhZ2UsIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9jb3JkIiksIDEsCisgICAgICAiNTI1Iik7CisjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW5saW5lIHZvaWQgVGVzdFV0aWw6OlNldE9uZW9mRmllbGRzKFVOSVRURVNUOjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+c2V0X29uZW9mX3VpbnQzMig2MDEpOworICBtZXNzYWdlLT5tdXRhYmxlX29uZW9mX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig2MDIpOworICBtZXNzYWdlLT5zZXRfb25lb2Zfc3RyaW5nKCI2MDMiKTsKKyAgbWVzc2FnZS0+c2V0X29uZW9mX2J5dGVzKCI2MDQiKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KAorICAgIGNvbnN0IFVOSVRURVNUOjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpIHsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ludDY0KCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF91aW50MzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3VpbnQ2NCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ludDMyKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zaW50NjQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NmaXhlZDMyKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZmxvYXQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2RvdWJsZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfYm9vbCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9ieXRlcygpKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbGdyb3VwKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9sYXp5X21lc3NhZ2UoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlKCkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxncm91cCgpLmhhc19hKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuaGFzX2JiKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpLmhhc19jKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlKCkuaGFzX2QoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkuaGFzX2UoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfbGF6eV9tZXNzYWdlKCkuaGFzX2JiKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlKCkuaGFzX2JiKCkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9lbnVtKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9lbnVtKCkpOworCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nX3BpZWNlKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9jb3JkKCkpOworI2VuZGlmCisKKyAgRVhQRUNUX0VRKDEwMSwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKDEwMiwgbWVzc2FnZS5vcHRpb25hbF9pbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKDEwMywgbWVzc2FnZS5vcHRpb25hbF91aW50MzIoKSk7CisgIEVYUEVDVF9FUSgxMDQsIG1lc3NhZ2Uub3B0aW9uYWxfdWludDY0KCkpOworICBFWFBFQ1RfRVEoMTA1LCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQzMigpKTsKKyAgRVhQRUNUX0VRKDEwNiwgbWVzc2FnZS5vcHRpb25hbF9zaW50NjQoKSk7CisgIEVYUEVDVF9FUSgxMDcsIG1lc3NhZ2Uub3B0aW9uYWxfZml4ZWQzMigpKTsKKyAgRVhQRUNUX0VRKDEwOCwgbWVzc2FnZS5vcHRpb25hbF9maXhlZDY0KCkpOworICBFWFBFQ1RfRVEoMTA5LCBtZXNzYWdlLm9wdGlvbmFsX3NmaXhlZDMyKCkpOworICBFWFBFQ1RfRVEoMTEwLCBtZXNzYWdlLm9wdGlvbmFsX3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoMTExLCBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoMTEyLCBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9ib29sKCkpOworICBFWFBFQ1RfRVEoIjExNSIsIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoIjExNiIsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMoKSk7CisKKyAgRVhQRUNUX0VRKDExNywgbWVzc2FnZS5vcHRpb25hbGdyb3VwKCkuYSgpKTsKKyAgRVhQRUNUX0VRKDExOCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworICBFWFBFQ1RfRVEoMTE5LCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpLmMoKSk7CisgIEVYUEVDVF9FUSgxMjAsIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UoKS5kKCkpOworICBFWFBFQ1RfRVEoMTI2LCBtZXNzYWdlLm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSgpLmUoKSk7CisgIEVYUEVDVF9FUSgxMjcsIG1lc3NhZ2Uub3B0aW9uYWxfbGF6eV9tZXNzYWdlKCkuYmIoKSk7CisgIEVYUEVDVF9FUSgxMjgsIG1lc3NhZ2Uub3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UoKS5iYigpKTsKKworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6QkFaLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9lbnVtKCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OkZPUkVJR05fQkFaLCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUX0lNUE9SVDo6SU1QT1JUX0JBWiwgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfZW51bSgpKTsKKworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXNfc2l6ZSgpKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZGdyb3VwX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtX3NpemUoKSk7CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfcGllY2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfY29yZF9zaXplKCkpOworI2VuZGlmCisKKyAgRVhQRUNUX0VRKDIwMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMigwKSk7CisgIEVYUEVDVF9FUSgyMDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQoMCkpOworICBFWFBFQ1RfRVEoMjAzLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMigwKSk7CisgIEVYUEVDVF9FUSgyMDQsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0KDApKTsKKyAgRVhQRUNUX0VRKDIwNSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIoMCkpOworICBFWFBFQ1RfRVEoMjA2LCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSgyMDcsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMigwKSk7CisgIEVYUEVDVF9FUSgyMDgsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCgwKSk7CisgIEVYUEVDVF9FUSgyMDksIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoMjEwLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDIxMSwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdCgwKSk7CisgIEVYUEVDVF9FUSgyMTIsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5yZXBlYXRlZF9ib29sKDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZygwKSk7CisgIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcygwKSk7CisKKyAgRVhQRUNUX0VRKDIxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwKDApLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApLmMoKSk7CisgIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UoMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UoMCkuYmIoKSk7CisKKworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpGT1JFSUdOX0JBUiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1RfSU1QT1JUOjpJTVBPUlRfQkFSLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtKDApKTsKKworICBFWFBFQ1RfRVEoMzAxLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyKDEpKTsKKyAgRVhQRUNUX0VRKDMwMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCgxKSk7CisgIEVYUEVDVF9FUSgzMDMsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyKDEpKTsKKyAgRVhQRUNUX0VRKDMwNCwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQoMSkpOworICBFWFBFQ1RfRVEoMzA1LCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMigxKSk7CisgIEVYUEVDVF9FUSgzMDYsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0KDEpKTsKKyAgRVhQRUNUX0VRKDMwNywgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyKDEpKTsKKyAgRVhQRUNUX0VRKDMwOCwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0KDEpKTsKKyAgRVhQRUNUX0VRKDMwOSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigxKSk7CisgIEVYUEVDVF9FUSgzMTAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMSkpOworICBFWFBFQ1RfRVEoMzExLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0KDEpKTsKKyAgRVhQRUNUX0VRKDMxMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5yZXBlYXRlZF9ib29sKDEpKTsKKyAgRVhQRUNUX0VRKCIzMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZygxKSk7CisgIEVYUEVDVF9FUSgiMzE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcygxKSk7CisKKyAgRVhQRUNUX0VRKDMxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwKDEpLmEoKSk7CisgIEVYUEVDVF9FUSgzMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMSkuYmIoKSk7CisgIEVYUEVDVF9FUSgzMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLmMoKSk7CisgIEVYUEVDVF9FUSgzMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UoMSkuZCgpKTsKKyAgRVhQRUNUX0VRKDMyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UoMSkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBWiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSgxKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rk9SRUlHTl9CQVosIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDEpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUX0lNUE9SVDo6SU1QT1JUX0JBWiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bSgxKSk7CisKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50MzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50NjQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDMyKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X3VpbnQ2NCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9zaW50MzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDY0KCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9zZml4ZWQzMigpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9zZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9mbG9hdCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9kb3VibGUoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYm9vbCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9zdHJpbmcoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYnl0ZXMoKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9uZXN0ZWRfZW51bSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW1wb3J0X2VudW0oKSk7CisKKworICBFWFBFQ1RfRVEoNDAxLCBtZXNzYWdlLmRlZmF1bHRfaW50MzIoKSk7CisgIEVYUEVDVF9FUSg0MDIsIG1lc3NhZ2UuZGVmYXVsdF9pbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKDQwMywgbWVzc2FnZS5kZWZhdWx0X3VpbnQzMigpKTsKKyAgRVhQRUNUX0VRKDQwNCwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKDQwNSwgbWVzc2FnZS5kZWZhdWx0X3NpbnQzMigpKTsKKyAgRVhQRUNUX0VRKDQwNiwgbWVzc2FnZS5kZWZhdWx0X3NpbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKDQwNywgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSg0MDgsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDY0KCkpOworICBFWFBFQ1RfRVEoNDA5LCBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSg0MTAsIG1lc3NhZ2UuZGVmYXVsdF9zZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0VRKDQxMSwgbWVzc2FnZS5kZWZhdWx0X2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoNDEyLCBtZXNzYWdlLmRlZmF1bHRfZG91YmxlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5kZWZhdWx0X2Jvb2woKSk7CisgIEVYUEVDVF9FUSgiNDE1IiwgbWVzc2FnZS5kZWZhdWx0X3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCI0MTYiLCBtZXNzYWdlLmRlZmF1bHRfYnl0ZXMoKSk7CisKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkZPTywgbWVzc2FnZS5kZWZhdWx0X25lc3RlZF9lbnVtKCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OkZPUkVJR05fRk9PLCBtZXNzYWdlLmRlZmF1bHRfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1RfSU1QT1JUOjpJTVBPUlRfRk9PLCBtZXNzYWdlLmRlZmF1bHRfaW1wb3J0X2VudW0oKSk7CisKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2ZfdWludDMyKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2ZfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vbmVvZl9zdHJpbmcoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29uZW9mX2J5dGVzKCkpOworCisgIEVYUEVDVF9FUSgiNjA0IiwgbWVzc2FnZS5vbmVvZl9ieXRlcygpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6RXhwZWN0Q2xlYXIoY29uc3QgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSkgeworICAvLyBoYXNfYmxhaCgpIHNob3VsZCBpbml0aWFsbHkgYmUgZmFsc2UgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ludDY0KCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfdWludDMyKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfdWludDY0KCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ludDMyKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ludDY0KCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZml4ZWQzMigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zZml4ZWQzMigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZmxvYXQoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9kb3VibGUoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9ib29sKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfYnl0ZXMoKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsZ3JvdXAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbGF6eV9tZXNzYWdlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UoKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9lbnVtKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X2VudW0oKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3N0cmluZ19waWVjZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2NvcmQoKSk7CisKKyAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB6ZXJvIG9yIHNvbWV0aGluZyBsaWtlIGl0LgorICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfaW50NjQoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX3VpbnQzMigpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfdWludDY0KCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9zaW50MzIoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfZml4ZWQzMigpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9ib29sKCkpOworICBFWFBFQ1RfRVEoIiIsIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoIiIsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMoKSk7CisKKyAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsZ3JvdXAoKS5oYXNfYSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpLmhhc19jKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSgpLmhhc19kKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKS5oYXNfZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfbGF6eV9tZXNzYWdlKCkuaGFzX2JiKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF91bnZlcmlmaWVkX2xhenlfbWVzc2FnZSgpLmhhc19iYigpKTsKKworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbGdyb3VwKCkuYSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5iYigpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkuYygpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UoKS5kKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKS5lKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9sYXp5X21lc3NhZ2UoKS5iYigpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UoKS5iYigpKTsKKworICAvLyBFbnVtcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBlbnVtLgorICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6Rk9PLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9lbnVtKCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OkZPUkVJR05fRk9PLCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUX0lNUE9SVDo6SU1QT1JUX0ZPTywgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfZW51bSgpKTsKKworCisgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUoKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bV9zaXplKCkpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19waWVjZV9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9jb3JkX3NpemUoKSk7CisKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9pbnQzMigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50NjQoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3VpbnQzMigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDY0KCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zaW50MzIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3NpbnQ2NCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQzMigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9mbG9hdCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZG91YmxlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9ib29sKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zdHJpbmcoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2J5dGVzKCkpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X25lc3RlZF9lbnVtKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2ltcG9ydF9lbnVtKCkpOworCisKKyAgLy8gRmllbGRzIHdpdGggZGVmYXVsdHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyAoZHVoKS4KKyAgRVhQRUNUX0VRKDQxLCBtZXNzYWdlLmRlZmF1bHRfaW50MzIoKSk7CisgIEVYUEVDVF9FUSg0MiwgbWVzc2FnZS5kZWZhdWx0X2ludDY0KCkpOworICBFWFBFQ1RfRVEoNDMsIG1lc3NhZ2UuZGVmYXVsdF91aW50MzIoKSk7CisgIEVYUEVDVF9FUSg0NCwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKC00NSwgbWVzc2FnZS5kZWZhdWx0X3NpbnQzMigpKTsKKyAgRVhQRUNUX0VRKDQ2LCBtZXNzYWdlLmRlZmF1bHRfc2ludDY0KCkpOworICBFWFBFQ1RfRVEoNDcsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDMyKCkpOworICBFWFBFQ1RfRVEoNDgsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDY0KCkpOworICBFWFBFQ1RfRVEoNDksIG1lc3NhZ2UuZGVmYXVsdF9zZml4ZWQzMigpKTsKKyAgRVhQRUNUX0VRKC01MCwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoNTEuNSwgbWVzc2FnZS5kZWZhdWx0X2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoNTJlMywgbWVzc2FnZS5kZWZhdWx0X2RvdWJsZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5kZWZhdWx0X2Jvb2woKSk7CisgIEVYUEVDVF9FUSgiaGVsbG8iLCBtZXNzYWdlLmRlZmF1bHRfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoIndvcmxkIiwgbWVzc2FnZS5kZWZhdWx0X2J5dGVzKCkpOworCisgIEVYUEVDVF9FUShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UuZGVmYXVsdF9uZXN0ZWRfZW51bSgpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpGT1JFSUdOX0JBUiwgbWVzc2FnZS5kZWZhdWx0X2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUX0lNUE9SVDo6SU1QT1JUX0JBUiwgbWVzc2FnZS5kZWZhdWx0X2ltcG9ydF9lbnVtKCkpOworCisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX3VpbnQzMigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX25lc3RlZF9tZXNzYWdlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2Zfc3RyaW5nKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2ZfYnl0ZXMoKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OkV4cGVjdFJlcGVhdGVkRmllbGRzTW9kaWZpZWQoCisgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSkgeworICAvLyBNb2RpZnlSZXBlYXRlZEZpZWxkcyBvbmx5IHNldHMgdGhlIHNlY29uZCByZXBlYXRlZCBlbGVtZW50IG9mIGVhY2gKKyAgLy8gZmllbGQuICBJbiBhZGRpdGlvbiB0byB2ZXJpZnlpbmcgdGhpcywgd2UgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgZmlyc3QKKyAgLy8gZWxlbWVudCBhbmQgc2l6ZSB3ZXJlICpub3QqIG1vZGlmaWVkLgorICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9ib29sX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlc19zaXplKCkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW1fc2l6ZSgpKTsKKworI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19waWVjZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9jb3JkX3NpemUoKSk7CisjZW5kaWYKKworICBFWFBFQ1RfRVEoMjAxLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDIwMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSgyMDMsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyKDApKTsKKyAgRVhQRUNUX0VRKDIwNCwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQoMCkpOworICBFWFBFQ1RfRVEoMjA1LCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMigwKSk7CisgIEVYUEVDVF9FUSgyMDYsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0KDApKTsKKyAgRVhQRUNUX0VRKDIwNywgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDIwOCwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDIwOSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigwKSk7CisgIEVYUEVDVF9FUSgyMTAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoMjExLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0KDApKTsKKyAgRVhQRUNUX0VRKDIxMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLnJlcGVhdGVkX2Jvb2woMCkpOworICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKDApKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzKDApKTsKKworICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAoMCkuYSgpKTsKKyAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKS5iYigpKTsKKyAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSgwKS5kKCkpOworICBFWFBFQ1RfRVEoMjI3LCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZSgwKS5iYigpKTsKKworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpGT1JFSUdOX0JBUiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1RfSU1QT1JUOjpJTVBPUlRfQkFSLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtKDApKTsKKworCisgIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgorICBFWFBFQ1RfRVEoNTAxLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyKDEpKTsKKyAgRVhQRUNUX0VRKDUwMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCgxKSk7CisgIEVYUEVDVF9FUSg1MDMsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyKDEpKTsKKyAgRVhQRUNUX0VRKDUwNCwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQoMSkpOworICBFWFBFQ1RfRVEoNTA1LCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMigxKSk7CisgIEVYUEVDVF9FUSg1MDYsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0KDEpKTsKKyAgRVhQRUNUX0VRKDUwNywgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyKDEpKTsKKyAgRVhQRUNUX0VRKDUwOCwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0KDEpKTsKKyAgRVhQRUNUX0VRKDUwOSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigxKSk7CisgIEVYUEVDVF9FUSg1MTAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMSkpOworICBFWFBFQ1RfRVEoNTExLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0KDEpKTsKKyAgRVhQRUNUX0VRKDUxMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLnJlcGVhdGVkX2Jvb2woMSkpOworICBFWFBFQ1RfRVEoIjUxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKDEpKTsKKyAgRVhQRUNUX0VRKCI1MTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzKDEpKTsKKworICBFWFBFQ1RfRVEoNTE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAoMSkuYSgpKTsKKyAgRVhQRUNUX0VRKDUxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgxKS5iYigpKTsKKyAgRVhQRUNUX0VRKDUxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMSkuYygpKTsKKyAgRVhQRUNUX0VRKDUyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSgxKS5kKCkpOworICBFWFBFQ1RfRVEoNTI3LCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZSgxKS5iYigpKTsKKworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6Rk9PLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtKDEpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpGT1JFSUdOX0ZPTywgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMSkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1RfSU1QT1JUOjpJTVBPUlRfRk9PLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtKDEpKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpTZXRQYWNrZWRGaWVsZHMoVU5JVFRFU1Q6OlRlc3RQYWNrZWRUeXBlcyogbWVzc2FnZSkgeworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ludDMyKDYwMSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfaW50NjQoNjAyKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF91aW50MzIoNjAzKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF91aW50NjQoNjA0KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zaW50MzIoNjA1KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zaW50NjQoNjA2KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9maXhlZDMyKDYwNyk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZml4ZWQ2NCg2MDgpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NmaXhlZDMyKDYwOSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ZpeGVkNjQoNjEwKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9mbG9hdCg2MTEpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2RvdWJsZSg2MTIpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2Jvb2wodHJ1ZSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZW51bShVTklUVEVTVDo6Rk9SRUlHTl9CQVIpOworICAvLyBhZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9pbnQzMig3MDEpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ludDY0KDcwMik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDMyKDcwMyk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDY0KDcwNCk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ludDMyKDcwNSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ludDY0KDcwNik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZml4ZWQzMig3MDcpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ZpeGVkNjQoNzA4KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zZml4ZWQzMig3MDkpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NmaXhlZDY0KDcxMCk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZmxvYXQoNzExKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9kb3VibGUoNzEyKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9ib29sKGZhbHNlKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9lbnVtKFVOSVRURVNUOjpGT1JFSUdOX0JBWik7Cit9CisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpTZXRVbnBhY2tlZEZpZWxkcyhVTklUVEVTVDo6VGVzdFVucGFja2VkVHlwZXMqIG1lc3NhZ2UpIHsKKyAgLy8gVGhlIHZhbHVlcyBhcHBsaWVkIGhlcmUgbXVzdCBtYXRjaCB0aG9zZSBvZiBTZXRQYWNrZWRGaWVsZHMuCisKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2ludDMyKDYwMSk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9pbnQ2NCg2MDIpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfdWludDMyKDYwMyk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF91aW50NjQoNjA0KTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX3NpbnQzMig2MDUpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfc2ludDY0KDYwNik7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9maXhlZDMyKDYwNyk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9maXhlZDY0KDYwOCk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9zZml4ZWQzMig2MDkpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfc2ZpeGVkNjQoNjEwKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2Zsb2F0KDYxMSk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9kb3VibGUoNjEyKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2Jvb2wodHJ1ZSk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9lbnVtKFVOSVRURVNUOjpGT1JFSUdOX0JBUik7CisgIC8vIGFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZAorICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfaW50MzIoNzAxKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2ludDY0KDcwMik7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF91aW50MzIoNzAzKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX3VpbnQ2NCg3MDQpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfc2ludDMyKDcwNSk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9zaW50NjQoNzA2KTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2ZpeGVkMzIoNzA3KTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2ZpeGVkNjQoNzA4KTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX3NmaXhlZDMyKDcwOSk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9zZml4ZWQ2NCg3MTApOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfZmxvYXQoNzExKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2RvdWJsZSg3MTIpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfYm9vbChmYWxzZSk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9lbnVtKFVOSVRURVNUOjpGT1JFSUdOX0JBWik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc1NldCgKKyAgICBjb25zdCBVTklUVEVTVDo6VGVzdFBhY2tlZFR5cGVzJiBtZXNzYWdlKSB7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9pbnQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfaW50NjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3VpbnQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfdWludDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zaW50MzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZml4ZWQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9mbG9hdF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZG91YmxlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9ib29sX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9lbnVtX3NpemUoKSk7CisKKyAgRVhQRUNUX0VRKDYwMSwgbWVzc2FnZS5wYWNrZWRfaW50MzIoMCkpOworICBFWFBFQ1RfRVEoNjAyLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSg2MDMsIG1lc3NhZ2UucGFja2VkX3VpbnQzMigwKSk7CisgIEVYUEVDVF9FUSg2MDQsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSg2MDUsIG1lc3NhZ2UucGFja2VkX3NpbnQzMigwKSk7CisgIEVYUEVDVF9FUSg2MDYsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSg2MDcsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoNjA4LCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDYwOSwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoNjEwLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NCgwKSk7CisgIEVYUEVDVF9FUSg2MTEsIG1lc3NhZ2UucGFja2VkX2Zsb2F0KDApKTsKKyAgRVhQRUNUX0VRKDYxMiwgbWVzc2FnZS5wYWNrZWRfZG91YmxlKDApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5wYWNrZWRfYm9vbCgwKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rk9SRUlHTl9CQVIsIG1lc3NhZ2UucGFja2VkX2VudW0oMCkpOworCisgIEVYUEVDVF9FUSg3MDEsIG1lc3NhZ2UucGFja2VkX2ludDMyKDEpKTsKKyAgRVhQRUNUX0VRKDcwMiwgbWVzc2FnZS5wYWNrZWRfaW50NjQoMSkpOworICBFWFBFQ1RfRVEoNzAzLCBtZXNzYWdlLnBhY2tlZF91aW50MzIoMSkpOworICBFWFBFQ1RfRVEoNzA0LCBtZXNzYWdlLnBhY2tlZF91aW50NjQoMSkpOworICBFWFBFQ1RfRVEoNzA1LCBtZXNzYWdlLnBhY2tlZF9zaW50MzIoMSkpOworICBFWFBFQ1RfRVEoNzA2LCBtZXNzYWdlLnBhY2tlZF9zaW50NjQoMSkpOworICBFWFBFQ1RfRVEoNzA3LCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyKDEpKTsKKyAgRVhQRUNUX0VRKDcwOCwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NCgxKSk7CisgIEVYUEVDVF9FUSg3MDksIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyKDEpKTsKKyAgRVhQRUNUX0VRKDcxMCwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkNjQoMSkpOworICBFWFBFQ1RfRVEoNzExLCBtZXNzYWdlLnBhY2tlZF9mbG9hdCgxKSk7CisgIEVYUEVDVF9FUSg3MTIsIG1lc3NhZ2UucGFja2VkX2RvdWJsZSgxKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLnBhY2tlZF9ib29sKDEpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpGT1JFSUdOX0JBWiwgbWVzc2FnZS5wYWNrZWRfZW51bSgxKSk7Cit9CisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpFeHBlY3RVbnBhY2tlZEZpZWxkc1NldCgKKyAgICBjb25zdCBVTklUVEVTVDo6VGVzdFVucGFja2VkVHlwZXMmIG1lc3NhZ2UpIHsKKyAgLy8gVGhlIHZhbHVlcyBleHBlY3RlZCBoZXJlIG11c3QgbWF0Y2ggdGhvc2Ugb2YgRXhwZWN0UGFja2VkRmllbGRzU2V0LgorCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2ludDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2ludDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX3VpbnQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS51bnBhY2tlZF91aW50NjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfc2ludDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX3NpbnQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS51bnBhY2tlZF9maXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2ZpeGVkNjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfc2ZpeGVkNjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfZmxvYXRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfZG91YmxlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2Jvb2xfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UudW5wYWNrZWRfZW51bV9zaXplKCkpOworCisgIEVYUEVDVF9FUSg2MDEsIG1lc3NhZ2UudW5wYWNrZWRfaW50MzIoMCkpOworICBFWFBFQ1RfRVEoNjAyLCBtZXNzYWdlLnVucGFja2VkX2ludDY0KDApKTsKKyAgRVhQRUNUX0VRKDYwMywgbWVzc2FnZS51bnBhY2tlZF91aW50MzIoMCkpOworICBFWFBFQ1RfRVEoNjA0LCBtZXNzYWdlLnVucGFja2VkX3VpbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSg2MDUsIG1lc3NhZ2UudW5wYWNrZWRfc2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDYwNiwgbWVzc2FnZS51bnBhY2tlZF9zaW50NjQoMCkpOworICBFWFBFQ1RfRVEoNjA3LCBtZXNzYWdlLnVucGFja2VkX2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoNjA4LCBtZXNzYWdlLnVucGFja2VkX2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoNjA5LCBtZXNzYWdlLnVucGFja2VkX3NmaXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDYxMCwgbWVzc2FnZS51bnBhY2tlZF9zZml4ZWQ2NCgwKSk7CisgIEVYUEVDVF9FUSg2MTEsIG1lc3NhZ2UudW5wYWNrZWRfZmxvYXQoMCkpOworICBFWFBFQ1RfRVEoNjEyLCBtZXNzYWdlLnVucGFja2VkX2RvdWJsZSgwKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UudW5wYWNrZWRfYm9vbCgwKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rk9SRUlHTl9CQVIsIG1lc3NhZ2UudW5wYWNrZWRfZW51bSgwKSk7CisKKyAgRVhQRUNUX0VRKDcwMSwgbWVzc2FnZS51bnBhY2tlZF9pbnQzMigxKSk7CisgIEVYUEVDVF9FUSg3MDIsIG1lc3NhZ2UudW5wYWNrZWRfaW50NjQoMSkpOworICBFWFBFQ1RfRVEoNzAzLCBtZXNzYWdlLnVucGFja2VkX3VpbnQzMigxKSk7CisgIEVYUEVDVF9FUSg3MDQsIG1lc3NhZ2UudW5wYWNrZWRfdWludDY0KDEpKTsKKyAgRVhQRUNUX0VRKDcwNSwgbWVzc2FnZS51bnBhY2tlZF9zaW50MzIoMSkpOworICBFWFBFQ1RfRVEoNzA2LCBtZXNzYWdlLnVucGFja2VkX3NpbnQ2NCgxKSk7CisgIEVYUEVDVF9FUSg3MDcsIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQzMigxKSk7CisgIEVYUEVDVF9FUSg3MDgsIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQ2NCgxKSk7CisgIEVYUEVDVF9FUSg3MDksIG1lc3NhZ2UudW5wYWNrZWRfc2ZpeGVkMzIoMSkpOworICBFWFBFQ1RfRVEoNzEwLCBtZXNzYWdlLnVucGFja2VkX3NmaXhlZDY0KDEpKTsKKyAgRVhQRUNUX0VRKDcxMSwgbWVzc2FnZS51bnBhY2tlZF9mbG9hdCgxKSk7CisgIEVYUEVDVF9FUSg3MTIsIG1lc3NhZ2UudW5wYWNrZWRfZG91YmxlKDEpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UudW5wYWNrZWRfYm9vbCgxKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rk9SRUlHTl9CQVosIG1lc3NhZ2UudW5wYWNrZWRfZW51bSgxKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEV4dGVuc2lvbnMKKy8vCisvLyBBbGwgdGhpcyBjb2RlIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0byB0aGUgYWJvdmUgY29kZSBleGNlcHQgdGhhdCBpdCdzCisvLyBtYW5pcHVsYXRpbmcgZXh0ZW5zaW9uIGZpZWxkcyBpbnN0ZWFkIG9mIG5vcm1hbCBvbmVzLgorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucyhVTklUVEVTVDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24sIDEwMSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uLCAxMDIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb24sIDEwMyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbiwgMTA0KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uLCAxMDUpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb24sIDEwNik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb24sIDEwNyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb24sIDEwOCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAxMDkpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbiwgMTEwKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9mbG9hdF9leHRlbnNpb24sIDExMSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbiwgMTEyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbiwgdHJ1ZSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiwgIjExNSIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbiwgIjExNiIpOworCisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uKS0+c2V0X2EoMTE3KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgLT5zZXRfYmIoMTE4KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgIC0+c2V0X2MoMTE5KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgLT5zZXRfZCgxMjApOworCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgVU5JVFRFU1Q6OkZPUkVJR05fQkFaKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBVTklUVEVTVF9JTVBPUlQ6OklNUE9SVF9CQVopOworCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgIjEyNCIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uLCAiMTI1Iik7CisKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgIC0+c2V0X2UoMTI2KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgIC0+c2V0X2JiKDEyNyk7CisgIG1lc3NhZ2UKKyAgICAgIC0+TXV0YWJsZUV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgLT5zZXRfYmIoMTI4KTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uLCAyMDEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiwgMjAyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uLCAyMDMpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24sIDIwNCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiwgMjA1KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uLCAyMDYpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uLCAyMDcpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uLCAyMDgpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMjA5KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDIxMCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uLCAyMTEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24sIDIxMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24sIHRydWUpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24sICIyMTUiKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24sICIyMTYiKTsKKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uKS0+c2V0X2EoMjE3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pCisgICAgICAtPnNldF9iYigyMTgpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pCisgICAgICAtPnNldF9jKDIxOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgLT5zZXRfZCgyMjApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24pLT5zZXRfYmIoMjI3KTsKKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBUik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVOSVRURVNUOjpGT1JFSUdOX0JBUik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgVU5JVFRFU1RfSU1QT1JUOjpJTVBPUlRfQkFSKTsKKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24sICIyMjQiKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbiwgIjIyNSIpOworCisgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24sIDMwMSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uLCAzMDIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24sIDMwMyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiwgMzA0KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uLCAzMDUpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24sIDMwNik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24sIDMwNyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24sIDMwOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAzMDkpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMzEwKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24sIDMxMSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiwgMzEyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiwgZmFsc2UpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24sICIzMTUiKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24sICIzMTYiKTsKKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uKS0+c2V0X2EoMzE3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pCisgICAgICAtPnNldF9iYigzMTgpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pCisgICAgICAtPnNldF9jKDMxOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgLT5zZXRfZCgzMjApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24pLT5zZXRfYmIoMzI3KTsKKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBWik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVOSVRURVNUOjpGT1JFSUdOX0JBWik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgVU5JVFRFU1RfSU1QT1JUOjpJTVBPUlRfQkFaKTsKKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24sICIzMjQiKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbiwgIjMyNSIpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2ludDMyX2V4dGVuc2lvbiwgNDAxKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2ludDY0X2V4dGVuc2lvbiwgNDAyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb24sIDQwMyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uLCA0MDQpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbiwgNDA1KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb24sIDQwNik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbiwgNDA3KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uLCA0MDgpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCA0MDkpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCA0MTApOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uLCA0MTEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbiwgNDEyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uLCBmYWxzZSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uLCAiNDE1Iik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9ieXRlc19leHRlbnNpb24sICI0MTYiKTsKKworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6Rk9PKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBVTklUVEVTVDo6Rk9SRUlHTl9GT08pOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgVU5JVFRFU1RfSU1QT1JUOjpJTVBPUlRfRk9PKTsKKworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgIjQyNCIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfY29yZF9leHRlbnNpb24sICI0MjUiKTsKKworICBTZXRPbmVvZkZpZWxkcyhtZXNzYWdlKTsKK30KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OlNldE9uZW9mRmllbGRzKFVOSVRURVNUOjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZSkgeworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9uZW9mX3VpbnQzMl9leHRlbnNpb24sIDYwMSk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24oVU5JVFRFU1Q6Om9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgIC0+c2V0X2JiKDYwMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6b25lb2Zfc3RyaW5nX2V4dGVuc2lvbiwgIjYwMyIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9uZW9mX2J5dGVzX2V4dGVuc2lvbiwgIjYwNCIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKAorICAgIFVOSVRURVNUOjpUZXN0RmllbGRPcmRlcmluZ3MqIG1lc3NhZ2UpIHsKKyAgR09PR0xFX0NIRUNLKG1lc3NhZ2UpOworICBtZXNzYWdlLT5zZXRfbXlfaW50KDEpOworICBtZXNzYWdlLT5zZXRfbXlfc3RyaW5nKCJmb28iKTsKKyAgbWVzc2FnZS0+c2V0X215X2Zsb2F0KDEuMCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6bXlfZXh0ZW5zaW9uX2ludCwgMjMpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om15X2V4dGVuc2lvbl9zdHJpbmcsICJiYXIiKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6TW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zKAorICAgIFVOSVRURVNUOjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZSkgeworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwgMSwgNTAxKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24sIDEsIDUwMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiwgMSwgNTAzKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uLCAxLCA1MDQpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24sIDEsIDUwNSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgMSwgNTA2KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiwgMSwgNTA3KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiwgMSwgNTA4KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDEsIDUwOSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxLCA1MTApOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiwgMSwgNTExKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uLCAxLCA1MTIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uLCAxLCB0cnVlKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uLCAxLCAiNTE1Iik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uLCAxLCAiNTE2Iik7CisKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24sIDEpLT5zZXRfYSg1MTcpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24sIDEpCisgICAgICAtPnNldF9iYig1MTgpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAxKQorICAgICAgLT5zZXRfYyg1MTkpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24sIDEpCisgICAgICAtPnNldF9kKDUyMCk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24sIDEpCisgICAgICAtPnNldF9iYig1MjcpOworCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6Rk9PKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgVU5JVFRFU1Q6OkZPUkVJR05fRk9PKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24sIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBVTklUVEVTVF9JTVBPUlQ6OklNUE9SVF9GT08pOworCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgMSwgIjUyNCIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAxLCAiNTI1Iik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQoCisgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RBbGxFeHRlbnNpb25zJiBtZXNzYWdlKSB7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgbWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgbWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKAorICAgICAgVU5JVFRFU1Q6Om9wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbikuaGFzX2EoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pCisgICAgICAgICAgICAgICAgICAuaGFzX2JiKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgICAgICAgICAgICAgIC5oYXNfYygpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgICAgICAgICAgICAgIC5oYXNfZCgpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgICAgICAuaGFzX2UoKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb24pLmhhc19iYigpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgICAgIC5oYXNfYmIoKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0VRKDEwMSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMTAyLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgxMDMsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgxMDQsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgxMDUsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgxMDYsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgxMDcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMTA4LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDEwOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMTEwLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgxMTEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9mbG9hdF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDExMiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgiMTE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKCIxMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0VRKDExNywgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uKS5hKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAxMTgsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKS5iYigpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMTE5LAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLmMoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDEyMCwKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24pLmQoKSk7CisKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBWiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpGT1JFSUdOX0JBWiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVF9JTVBPUlQ6OklNUE9SVF9CQVosCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0VRKCIxMjQiLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKCIxMjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfY29yZF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMTI2LAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24pCisgICAgICAgICAgLmUoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDEyNywKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uKS5iYigpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMTI4LAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgICAgICAuYmIoKSk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbikpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKAorICAgICAgMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsCisgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbikpOworCisgIEFTU0VSVF9FUSgyLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0VRKDIwMSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjAyLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgyMDMsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgyMDQsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgyMDUsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgyMDYsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgyMDcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjA4LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIwOSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIxMCwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIxMSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjEyLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uLCAwKSk7CisKKyAgRVhQRUNUX0VRKDIxNywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiwgMCkuYSgpKTsKKyAgRVhQRUNUX0VRKDIxOCwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24sIDApCisgICAgICAgICAgICAgICAgLmJiKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAyMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAwKQorICAgICAgICAgICAgICAgLmMoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDIyMCwKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24sIDApLmQoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDIyNywKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uLCAwKS5iYigpKTsKKworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6QkFSLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OkZPUkVJR05fQkFSLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUX0lNUE9SVDo6SU1QT1JUX0JBUiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24sIDApKTsKKworICBFWFBFQ1RfRVEoIjIyNCIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoIjIyNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbiwgMCkpOworCisgIEVYUEVDVF9FUSgzMDEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDMwMiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoMzAzLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoMzA0LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoMzA1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoMzA2LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoMzA3LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDMwOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgzMDksCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgzMTAsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgzMTEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDMxMiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoIjMxNSIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoIjMxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24sIDEpKTsKKworICBFWFBFQ1RfRVEoMzE3LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uLCAxKS5hKCkpOworICBFWFBFQ1RfRVEoMzE4LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiwgMSkKKyAgICAgICAgICAgICAgICAuYmIoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDMxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sIDEpCisgICAgICAgICAgICAgICAuYygpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMzIwLAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiwgMSkuZCgpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMzI3LAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24sIDEpLmJiKCkpOworCisgIEVYUEVDVF9FUShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpCQVosCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rk9SRUlHTl9CQVosCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1RfSU1QT1JUOjpJTVBPUlRfQkFaLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiwgMSkpOworCisgIEVYUEVDVF9FUSgiMzI0IiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgiMzI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAxKSk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfdWludDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfY29yZF9leHRlbnNpb24pKTsKKworICBFWFBFQ1RfRVEoNDAxLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDQwMiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSg0MDMsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDQwNCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfdWludDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoNDA1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSg0MDYsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDQwNywgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDQwOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDQwOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSg0MTAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoNDExLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDQxMiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfYm9vbF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKCI0MTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgiNDE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkZPTywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OkZPUkVJR05fRk9PLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoVU5JVFRFU1RfSU1QT1JUOjpJTVBPUlRfRk9PLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0VRKCI0MjQiLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoIjQyNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9uZW9mX3VpbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b25lb2ZfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvbmVvZl9zdHJpbmdfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvbmVvZl9ieXRlc19leHRlbnNpb24pKTsKKworICBFWFBFQ1RfRVEoNjAxLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b25lb2ZfdWludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoCisgICAgICA2MDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvbmVvZl9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pLmJiKCkpOworICBFWFBFQ1RfRVEoIjYwMyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvbmVvZl9zdHJpbmdfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgiNjA0IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9uZW9mX2J5dGVzX2V4dGVuc2lvbikpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIoCisgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RBbGxFeHRlbnNpb25zJiBtZXNzYWdlKSB7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKTsKKyAgRVhQRUNUX0VRKCIiLCBzZXJpYWxpemVkKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuQnl0ZVNpemVMb25nKCkpOworCisgIC8vIGhhc19ibGFoKCkgc2hvdWxkIGluaXRpYWxseSBiZSBmYWxzZSBmb3IgYWxsIG9wdGlvbmFsIGZpZWxkcy4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9ieXRlc19leHRlbnNpb24pKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgbWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgbWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKAorICAgICAgVU5JVFRFU1Q6Om9wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB6ZXJvIG9yIHNvbWV0aGluZyBsaWtlIGl0LgorICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgiIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKCIiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uKSk7CisKKyAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24pLmhhc19hKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgICAgICAgICAgICAgICAuaGFzX2JiKCkpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgICAgICAuaGFzX2MoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgICAgIC5oYXNfZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24pCisgICAgICAgICAgLmhhc19lKCkpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbikuaGFzX2JiKCkpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uKQorICAgICAgICAgIC5oYXNfYmIoKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbikuYSgpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMCwKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pLmJiKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAwLAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLmMoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24pLmQoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDAsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgICAgICAuZSgpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb24pLmJiKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAwLAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgICAgICAuYmIoKSk7CisKKyAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkZPTywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpGT1JFSUdOX0ZPTywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVF9JTVBPUlQ6OklNUE9SVF9GT08sCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0VRKCIiLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKCIiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6b3B0aW9uYWxfY29yZF9leHRlbnNpb24pKTsKKworICAvLyBSZXBlYXRlZCBmaWVsZHMgYXJlIGVtcHR5LgorICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9FUSgwLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9pbnQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3NpbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfYm9vbF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3N0cmluZ19leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9jb3JkX2V4dGVuc2lvbikpOworCisgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCisgIEVYUEVDVF9FUSg0MSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSg0MiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSg0MywgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoNDQsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKC00NSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoNDYsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDQ3LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoNDgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSg0OSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgtNTAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoNTEuNSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSg1MmUzLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgiaGVsbG8iLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgid29ybGQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9ieXRlc19leHRlbnNpb24pKTsKKworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6QkFSLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rk9SRUlHTl9CQVIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVF9JTVBPUlQ6OklNUE9SVF9CQVIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb24pKTsKKworICBFWFBFQ1RfRVEoImFiYyIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6ZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgiMTIzIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OmRlZmF1bHRfY29yZF9leHRlbnNpb24pKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9uZW9mX3VpbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6Om9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikuaGFzX2JiKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oVU5JVFRFU1Q6Om9uZW9mX3N0cmluZ19leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKFVOSVRURVNUOjpvbmVvZl9ieXRlc19leHRlbnNpb24pKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQoCisgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RBbGxFeHRlbnNpb25zJiBtZXNzYWdlKSB7CisgIC8vIE1vZGlmeVJlcGVhdGVkRmllbGRzIG9ubHkgc2V0cyB0aGUgc2Vjb25kIHJlcGVhdGVkIGVsZW1lbnQgb2YgZWFjaAorICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdAorICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsCisgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoCisgICAgICAyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsCisgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsCisgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uKSk7CisKKyAgQVNTRVJUX0VRKDIsCisgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24pKTsKKworICBFWFBFQ1RfRVEoMjAxLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgyMDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIwMywgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIwNCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIwNSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIwNiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIwNywgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgyMDgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjA5LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjEwLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjExLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgyMTIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoIjIxNSIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24sIDApKTsKKworICBFWFBFQ1RfRVEoMjE3LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uLCAwKS5hKCkpOworICBFWFBFQ1RfRVEoMjE4LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiwgMCkKKyAgICAgICAgICAgICAgICAuYmIoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDIxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sIDApCisgICAgICAgICAgICAgICAuYygpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMjIwLAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiwgMCkuZCgpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMjI3LAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24sIDApLmJiKCkpOworCisgIEVYUEVDVF9FUShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpCQVIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rk9SRUlHTl9CQVIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1RfSU1QT1JUOjpJTVBPUlRfQkFSLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiwgMCkpOworCisgIEVYUEVDVF9FUSgiMjI0IiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgiMjI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAwKSk7CisKKyAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuCisgIEVYUEVDVF9FUSg1MDEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDUwMiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNTAzLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNTA0LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNTA1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNTA2LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNTA3LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDUwOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg1MDksCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg1MTAsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg1MTEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDUxMiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgiNTE1IiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgiNTE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiwgMSkpOworCisgIEVYUEVDVF9FUSg1MTcsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24sIDEpLmEoKSk7CisgIEVYUEVDVF9FUSg1MTgsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uLCAxKQorICAgICAgICAgICAgICAgIC5iYigpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgNTE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMSkKKyAgICAgICAgICAgICAgIC5jKCkpOworICBFWFBFQ1RfRVEoCisgICAgICA1MjAsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uLCAxKS5kKCkpOworICBFWFBFQ1RfRVEoCisgICAgICA1MjcsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiwgMSkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkZPTywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpGT1JFSUdOX0ZPTywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVF9JTVBPUlQ6OklNUE9SVF9GT08sCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uLCAxKSk7CisKKyAgRVhQRUNUX0VRKCI1MjQiLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKCI1MjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24sIDEpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6U2V0UGFja2VkRXh0ZW5zaW9ucygKKyAgICBVTklUVEVTVDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uLCA2MDEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb24sIDYwMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb24sIDYwMyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb24sIDYwNCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb24sIDYwNSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb24sIDYwNik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uLCA2MDcpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiwgNjA4KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCA2MDkpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDYxMCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbiwgNjExKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiwgNjEyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpwYWNrZWRfYm9vbF9leHRlbnNpb24sIHRydWUpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgVU5JVFRFU1Q6OkZPUkVJR05fQkFSKTsKKyAgLy8gYWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbiwgNzAxKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uLCA3MDIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uLCA3MDMpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uLCA3MDQpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uLCA3MDUpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uLCA3MDYpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiwgNzA3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24sIDcwOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbiwgNzA5KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKFVOSVRURVNUOjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCA3MTApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb24sIDcxMSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb24sIDcxMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uLCBmYWxzZSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uLCBVTklUVEVTVDo6Rk9SRUlHTl9CQVopOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KAorICAgIGNvbnN0IFVOSVRURVNUOjpUZXN0UGFja2VkRXh0ZW5zaW9ucyYgbWVzc2FnZSkgeworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpwYWNrZWRfYm9vbF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0VRKDYwMSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDYwMiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDYwMywgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSg2MDQsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNjA1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDYwNiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSg2MDcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDYwOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNjA5LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNjEwLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNjExLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNjEyLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OkZPUkVJR05fQkFSLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNzAxLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNzAyLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNzAzLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDcwNCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg3MDUsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNzA2LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDcwNywgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNzA4LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg3MDksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg3MTAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg3MTEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg3MTIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OkZPUkVJR05fQkFaLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgMSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpFeHBlY3RVbnBhY2tlZEV4dGVuc2lvbnNTZXQoCisgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RVbnBhY2tlZEV4dGVuc2lvbnMmIG1lc3NhZ2UpIHsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6dW5wYWNrZWRfaW50MzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnVucGFja2VkX2ludDY0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjp1bnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnVucGFja2VkX3VpbnQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6dW5wYWNrZWRfc2ludDMyX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjp1bnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnVucGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnVucGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnVucGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjp1bnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6dW5wYWNrZWRfZmxvYXRfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnVucGFja2VkX2RvdWJsZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6dW5wYWNrZWRfYm9vbF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6dW5wYWNrZWRfZW51bV9leHRlbnNpb24pKTsKKworICBFWFBFQ1RfRVEoNjAxLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6dW5wYWNrZWRfaW50MzJfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSg2MDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjp1bnBhY2tlZF9pbnQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDYwMywgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX3VpbnQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDYwNCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX3VpbnQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDYwNSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX3NpbnQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDYwNiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX3NpbnQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDYwNywgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSg2MDgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjp1bnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNjA5LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNjEwLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNjExLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6dW5wYWNrZWRfZmxvYXRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSg2MTIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjp1bnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSh0cnVlLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6dW5wYWNrZWRfYm9vbF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpGT1JFSUdOX0JBUiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjp1bnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNzAxLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6dW5wYWNrZWRfaW50MzJfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg3MDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjp1bnBhY2tlZF9pbnQ2NF9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDcwMywgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX3VpbnQzMl9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDcwNCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX3VpbnQ2NF9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDcwNSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX3NpbnQzMl9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDcwNiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX3NpbnQ2NF9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDcwNywgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg3MDgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjp1bnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNzA5LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNzEwLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNzExLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6dW5wYWNrZWRfZmxvYXRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg3MTIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjp1bnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnVucGFja2VkX2Jvb2xfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rk9SRUlHTl9CQVosCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6dW5wYWNrZWRfZW51bV9leHRlbnNpb24sIDEpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6RXhwZWN0TGFzdFJlcGVhdGVkc1JlbW92ZWQoCisgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSkgeworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9ib29sX3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlc19zaXplKCkpOworCisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9zaXplKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bV9zaXplKCkpOworCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3BpZWNlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2NvcmRfc2l6ZSgpKTsKKyNlbmRpZgorCisgIC8vIFRlc3QgdGhhdCB0aGUgcmVtYWluaW5nIGVsZW1lbnQgaXMgdGhlIGNvcnJlY3Qgb25lLgorICBFWFBFQ1RfRVEoMjAxLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDIwMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSgyMDMsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyKDApKTsKKyAgRVhQRUNUX0VRKDIwNCwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQoMCkpOworICBFWFBFQ1RfRVEoMjA1LCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMigwKSk7CisgIEVYUEVDVF9FUSgyMDYsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0KDApKTsKKyAgRVhQRUNUX0VRKDIwNywgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDIwOCwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDIwOSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigwKSk7CisgIEVYUEVDVF9FUSgyMTAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoMjExLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0KDApKTsKKyAgRVhQRUNUX0VRKDIxMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLnJlcGVhdGVkX2Jvb2woMCkpOworICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKDApKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzKDApKTsKKworICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAoMCkuYSgpKTsKKyAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKS5iYigpKTsKKyAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSgwKS5kKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlKDApLmQoKSk7CisKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSgwKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6Rk9SRUlHTl9CQVIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUX0lNUE9SVDo6SU1QT1JUX0JBUiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bSgwKSk7Cit9CisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpFeHBlY3RMYXN0UmVwZWF0ZWRFeHRlbnNpb25zUmVtb3ZlZCgKKyAgICBjb25zdCBVTklUVEVTVDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpIHsKKyAgLy8gVGVzdCB0aGF0IG9uZSBlbGVtZW50IHdhcyByZW1vdmVkLgorICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbikpOworCisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgxLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKAorICAgICAgMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgxLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDEsCisgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgxLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbikpOworCisgIEFTU0VSVF9FUSgxLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgLy8gVGVzdCB0aGF0IHRoZSByZW1haW5pbmcgZWxlbWVudCBpcyB0aGUgY29ycmVjdCBvbmUuCisgIEVYUEVDVF9FUSgyMDEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIwMiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjAzLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjA0LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjA1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjA2LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjA3LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIwOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgyMDksCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgyMTAsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgyMTEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIxMiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgiMjE1IiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiwgMCkpOworCisgIEVYUEVDVF9FUSgyMTcsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24sIDApLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uLCAwKQorICAgICAgICAgICAgICAgIC5iYigpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMjE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMCkKKyAgICAgICAgICAgICAgIC5jKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAyMjAsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uLCAwKS5kKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAyMjcsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiwgMCkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBUiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpGT1JFSUdOX0JBUiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVF9JTVBPUlQ6OklNUE9SVF9CQVIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uLCAwKSk7CisKKyAgRVhQRUNUX0VRKCIyMjQiLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKCIyMjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24sIDApKTsKK30KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OkV4cGVjdExhc3RSZXBlYXRlZHNSZWxlYXNlZCgKKyAgICBjb25zdCBVTklUVEVTVDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKSB7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUoKSk7CisKKyAgRVhQRUNUX0VRKDIxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwKDApLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApLmMoKSk7CisgIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UoMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSgwKS5kKCkpOworfQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6RXhwZWN0TGFzdFJlcGVhdGVkRXh0ZW5zaW9uc1JlbGVhc2VkKAorICAgIGNvbnN0IFVOSVRURVNUOjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSkgeworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMSwKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgKKyAgICAgIDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMSwKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgxLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0VRKDIxNywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiwgMCkuYSgpKTsKKyAgRVhQRUNUX0VRKDIxOCwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24sIDApCisgICAgICAgICAgICAgICAgLmJiKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAyMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAwKQorICAgICAgICAgICAgICAgLmMoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDIyMCwKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24sIDApLmQoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDIyNywKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uLCAwKS5iYigpKTsKK30KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OkV4cGVjdFJlcGVhdGVkc1N3YXBwZWQoCisgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSkgeworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9ib29sX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlc19zaXplKCkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bV9zaXplKCkpOworCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3BpZWNlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2NvcmRfc2l6ZSgpKTsKKyNlbmRpZgorCisgIC8vIFRlc3QgdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgc2Vjb25kIGVsZW1lbnQgYXJlIGZsaXBwZWQuCisgIEVYUEVDVF9FUSgyMDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIoMSkpOworICBFWFBFQ1RfRVEoMjAyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0KDEpKTsKKyAgRVhQRUNUX0VRKDIwMywgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIoMSkpOworICBFWFBFQ1RfRVEoMjA0LCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCgxKSk7CisgIEVYUEVDVF9FUSgyMDUsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyKDEpKTsKKyAgRVhQRUNUX0VRKDIwNiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQoMSkpOworICBFWFBFQ1RfRVEoMjA3LCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIoMSkpOworICBFWFBFQ1RfRVEoMjA4LCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQoMSkpOworICBFWFBFQ1RfRVEoMjA5LCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDEpKTsKKyAgRVhQRUNUX0VRKDIxMCwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCgxKSk7CisgIEVYUEVDVF9FUSgyMTEsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQoMSkpOworICBFWFBFQ1RfRVEoMjEyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgxKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCgxKSk7CisgIEVYUEVDVF9FUSgiMjE1IiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcoMSkpOworICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMoMSkpOworCisgIEVYUEVDVF9FUSgyMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cCgxKS5hKCkpOworICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDEpLmJiKCkpOworICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgxKS5jKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlKDEpLmQoKSk7CisgIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UoMSkuZCgpKTsKKworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtKDEpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpGT1JFSUdOX0JBUiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMSkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1RfSU1QT1JUOjpJTVBPUlRfQkFSLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtKDEpKTsKKworICBFWFBFQ1RfRVEoMzAxLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDMwMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSgzMDMsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyKDApKTsKKyAgRVhQRUNUX0VRKDMwNCwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQoMCkpOworICBFWFBFQ1RfRVEoMzA1LCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMigwKSk7CisgIEVYUEVDVF9FUSgzMDYsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0KDApKTsKKyAgRVhQRUNUX0VRKDMwNywgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDMwOCwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDMwOSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigwKSk7CisgIEVYUEVDVF9FUSgzMTAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoMzExLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0KDApKTsKKyAgRVhQRUNUX0VRKDMxMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5yZXBlYXRlZF9ib29sKDApKTsKKyAgRVhQRUNUX0VRKCIzMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZygwKSk7CisgIEVYUEVDVF9FUSgiMzE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcygwKSk7CisKKyAgRVhQRUNUX0VRKDMxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwKDApLmEoKSk7CisgIEVYUEVDVF9FUSgzMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgzMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApLmMoKSk7CisgIEVYUEVDVF9FUSgzMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UoMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDMyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSgwKS5kKCkpOworCisgIEVYUEVDVF9FUShVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpCQVosIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0oMCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OkZPUkVJR05fQkFaLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgwKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVF9JTVBPUlQ6OklNUE9SVF9CQVosIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0oMCkpOworfQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zU3dhcHBlZCgKKyAgICBjb25zdCBVTklUVEVTVDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpIHsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24pKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgKKyAgICAgIDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoVU5JVFRFU1Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24pKTsKKworICBBU1NFUlRfRVEoMiwKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZShVTklUVEVTVDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKFVOSVRURVNUOjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9FUSgyMDEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDIwMiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoMjAzLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoMjA0LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoMjA1LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoMjA2LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoMjA3LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDIwOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgyMDksCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgyMTAsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgyMTEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDIxMiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgiMjE1IiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiwgMSkpOworCisgIEVYUEVDVF9FUSgyMTcsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24sIDEpLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uLCAxKQorICAgICAgICAgICAgICAgIC5iYigpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMjE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMSkKKyAgICAgICAgICAgICAgIC5jKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAyMjAsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uLCAxKS5kKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAyMjcsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiwgMSkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkJBUiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpGT1JFSUdOX0JBUiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVF9JTVBPUlQ6OklNUE9SVF9CQVIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uLCAxKSk7CisKKyAgRVhQRUNUX0VRKCIyMjQiLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKCIyMjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24sIDEpKTsKKworICBFWFBFQ1RfRVEoMzAxLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgzMDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDMwMywgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDMwNCwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDMwNSwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDMwNiwgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDMwNywgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgzMDgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMzA5LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMzEwLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMzExLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgzMTIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKCIzMTUiLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKCIzMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uLCAwKSk7CisKKyAgRVhQRUNUX0VRKDMxNywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiwgMCkuYSgpKTsKKyAgRVhQRUNUX0VRKDMxOCwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24sIDApCisgICAgICAgICAgICAgICAgLmJiKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAzMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAwKQorICAgICAgICAgICAgICAgLmMoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDMyMCwKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24sIDApLmQoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDMyNywKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uLCAwKS5iYigpKTsKKworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6QkFaLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoVU5JVFRFU1Q6OkZPUkVJR05fQkFaLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oVU5JVFRFU1Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUX0lNUE9SVDo6SU1QT1JUX0JBWiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24sIDApKTsKKworICBFWFBFQ1RfRVEoIjMyNCIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihVTklUVEVTVDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoIjMyNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKFVOSVRURVNUOjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbiwgMCkpOworfQorCitpbmxpbmUgdm9pZCBUZXN0VXRpbDo6U2V0T25lb2YxKFVOSVRURVNUOjpUZXN0T25lb2YyKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPm11dGFibGVfZm9vX2xhenlfbWVzc2FnZSgpLT5zZXRfbW9vX2ludCgxMDApOworICBtZXNzYWdlLT5zZXRfYmFyX3N0cmluZygiMTAxIik7CisgIG1lc3NhZ2UtPnNldF9iYXpfaW50KDEwMik7CisgIG1lc3NhZ2UtPnNldF9iYXpfc3RyaW5nKCIxMDMiKTsKK30KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OlNldE9uZW9mMihVTklUVEVTVDo6VGVzdE9uZW9mMiogbWVzc2FnZSkgeworICBtZXNzYWdlLT5zZXRfZm9vX2ludCgyMDApOworICBtZXNzYWdlLT5zZXRfYmFyX2VudW0oVU5JVFRFU1Q6OlRlc3RPbmVvZjI6OkJBWik7CisgIG1lc3NhZ2UtPnNldF9iYXpfaW50KDIwMik7CisgIG1lc3NhZ2UtPnNldF9iYXpfc3RyaW5nKCIyMDMiKTsKK30KKworaW5saW5lIHZvaWQgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MShjb25zdCBVTklUVEVTVDo6VGVzdE9uZW9mMiYgbWVzc2FnZSkgeworICBFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2xhenlfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5mb29fbGF6eV9tZXNzYWdlKCkuaGFzX21vb19pbnQoKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfYmFyX3N0cmluZygpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfYmF6X2ludCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfYmF6X3N0cmluZygpKTsKKworICBBU1NFUlRfRVEoMCwgbWVzc2FnZS5mb29fbGF6eV9tZXNzYWdlKCkuY29yZ2VfaW50X3NpemUoKSk7CisKKyAgRVhQRUNUX0VRKDEwMCwgbWVzc2FnZS5mb29fbGF6eV9tZXNzYWdlKCkubW9vX2ludCgpKTsKKyAgRVhQRUNUX0VRKCIxMDEiLCBtZXNzYWdlLmJhcl9zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgxMDIsIG1lc3NhZ2UuYmF6X2ludCgpKTsKKyAgRVhQRUNUX0VRKCIxMDMiLCBtZXNzYWdlLmJhel9zdHJpbmcoKSk7Cit9CisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDIoY29uc3QgVU5JVFRFU1Q6OlRlc3RPbmVvZjImIG1lc3NhZ2UpIHsKKyAgRXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19pbnQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Jhcl9lbnVtKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19iYXpfaW50KCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19iYXpfc3RyaW5nKCkpOworCisgIEVYUEVDVF9FUSgyMDAsIG1lc3NhZ2UuZm9vX2ludCgpKTsKKyAgRVhQRUNUX0VRKFVOSVRURVNUOjpUZXN0T25lb2YyOjpCQVosIG1lc3NhZ2UuYmFyX2VudW0oKSk7CisgIEVYUEVDVF9FUSgyMDIsIG1lc3NhZ2UuYmF6X2ludCgpKTsKKyAgRVhQRUNUX0VRKCIyMDMiLCBtZXNzYWdlLmJhel9zdHJpbmcoKSk7Cit9CisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpFeHBlY3RPbmVvZkNsZWFyKGNvbnN0IFVOSVRURVNUOjpUZXN0T25lb2YyJiBtZXNzYWdlKSB7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29faW50KCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19ieXRlcygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19lbnVtKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29ncm91cCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19sYXp5X21lc3NhZ2UoKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Jhcl9pbnQoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19iYXJfc3RyaW5nKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfYmFyX2J5dGVzKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfYmFyX2VudW0oKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Jhel9pbnQoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19iYXpfc3RyaW5nKCkpOworCisgIEVYUEVDVF9FUShVTklUVEVTVDo6VGVzdE9uZW9mMjo6Rk9PX05PVF9TRVQsIG1lc3NhZ2UuZm9vX2Nhc2UoKSk7CisgIEVYUEVDVF9FUShVTklUVEVTVDo6VGVzdE9uZW9mMjo6QkFSX05PVF9TRVQsIG1lc3NhZ2UuYmFyX2Nhc2UoKSk7Cit9CisKK2lubGluZSB2b2lkIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YoCisgICAgY29uc3QgVU5JVFRFU1Q6OlRlc3RPbmVvZjImIG1lc3NhZ2UpIHsKKyAgaW50IGNvdW50ID0gMDsKKyAgaWYgKG1lc3NhZ2UuaGFzX2Zvb19pbnQoKSkgY291bnQrKzsKKyAgaWYgKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSkgY291bnQrKzsKKyAgaWYgKG1lc3NhZ2UuaGFzX2Zvb19ieXRlcygpKSBjb3VudCsrOworICBpZiAobWVzc2FnZS5oYXNfZm9vX2VudW0oKSkgY291bnQrKzsKKyAgaWYgKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpIGNvdW50Kys7CisgIGlmIChtZXNzYWdlLmhhc19mb29ncm91cCgpKSBjb3VudCsrOworICBpZiAobWVzc2FnZS5oYXNfZm9vX2xhenlfbWVzc2FnZSgpKSBjb3VudCsrOworICBFWFBFQ1RfTEUoY291bnQsIDEpOworICBjb3VudCA9IDA7CisgIGlmIChtZXNzYWdlLmhhc19iYXJfaW50KCkpIGNvdW50Kys7CisgIGlmIChtZXNzYWdlLmhhc19iYXJfc3RyaW5nKCkpIGNvdW50Kys7CisgIGlmIChtZXNzYWdlLmhhc19iYXJfYnl0ZXMoKSkgY291bnQrKzsKKyAgaWYgKG1lc3NhZ2UuaGFzX2Jhcl9lbnVtKCkpIGNvdW50Kys7CisgIEVYUEVDVF9UUlVFKGNvdW50ID09IDAgfHwgY291bnQgPT0gMSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbDIuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MGFmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbDIuaApAQCAtMCwwICsxLDEwNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1RFU1RfVVRJTDJfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9URVNUX1VUSUwyX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIFRlc3RVdGlsIHsKKworLy8gVHJhbnNsYXRlIG5ldC9wcm90bzIvKiAtPiBnb29nbGUvcHJvdG9idWYvKgoraW5saW5lIHN0ZDo6c3RyaW5nIFRyYW5zbGF0ZVBhdGhUb09wZW5zb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGdvb2dsZTNfcGF0aCkgeworICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSAibmV0L3Byb3RvMi8iOworICBHT09HTEVfQ0hFQ0soZ29vZ2xlM19wYXRoLmZpbmQocHJlZml4KSA9PSAwKSA8PCBnb29nbGUzX3BhdGg7CisgIHN0ZDo6c3RyaW5nIHBhdGggPSBnb29nbGUzX3BhdGguc3Vic3RyKHByZWZpeC5zaXplKCkpOworCisgIHBhdGggPSBTdHJpbmdSZXBsYWNlKHBhdGgsICJpbnRlcm5hbC8iLCAiIiwgZmFsc2UpOworICBwYXRoID0gU3RyaW5nUmVwbGFjZShwYXRoLCAicHJvdG8vIiwgIiIsIGZhbHNlKTsKKyAgcGF0aCA9IFN0cmluZ1JlcGxhY2UocGF0aCwgInB1YmxpYy8iLCAiIiwgZmFsc2UpOworICByZXR1cm4gImdvb2dsZS9wcm90b2J1Zi8iICsgcGF0aDsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIE1heWJlVHJhbnNsYXRlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgZ29vZ2xlM19wYXRoKSB7CisgIHN0ZDo6c3RyaW5nIHBhdGggPSBnb29nbGUzX3BhdGg7CisgIHBhdGggPSBUcmFuc2xhdGVQYXRoVG9PcGVuc291cmNlKHBhdGgpOworICByZXR1cm4gcGF0aDsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIFRlc3RTb3VyY2VEaXIoKSB7CisgIHJldHVybiBnb29nbGU6OnByb3RvYnVmOjpUZXN0U291cmNlRGlyKCk7Cit9CisKK2lubGluZSBzdGQ6OnN0cmluZyBHZXRUZXN0RGF0YVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIGdvb2dsZTNfcGF0aCkgeworICByZXR1cm4gVGVzdFNvdXJjZURpcigpICsgIi8iICsgTWF5YmVUcmFuc2xhdGVQYXRoKGdvb2dsZTNfcGF0aCk7Cit9CisKKy8vIENoZWNrcyB0aGUgZXF1YWxpdHkgb2YgIm1lc3NhZ2UiIGFuZCBzZXJpYWxpemVkIHByb3RvIG9mIHR5cGUgIlByb3RvVHlwZSIuCisvLyBEbyBub3QgZGlyZWN0bHkgY29tcGFyZSB0d28gc2VyaWFsaXplZCBwcm90b3MuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9UeXBlPgorYm9vbCBFcXVhbHNUb1NlcmlhbGl6ZWQoY29uc3QgUHJvdG9UeXBlJiBtZXNzYWdlLCBjb25zdCBzdGQ6OnN0cmluZyYgZGF0YSkgeworICBQcm90b1R5cGUgb3RoZXI7CisgIG90aGVyLlBhcnNlUGFydGlhbEZyb21TdHJpbmcoZGF0YSk7CisgIHJldHVybiB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkVxdWFscyhtZXNzYWdlLCBvdGhlcik7Cit9CisKKy8vIFdyYXBzIGlvOjpBcnJheUlucHV0U3RyZWFtIHdoaWxlIGNoZWNraW5nIGFnYWluc3QgYm91bmQuIFdoZW4gYSBibG9ja2luZworLy8gc3RyZWFtIGlzIHVzZWQgd2l0aCBib3VuZGVkIGxlbmd0aCwgcHJvdG8gcGFyc2luZyBtdXN0IG5vdCBhY2Nlc3MgYmV5b25kIHRoZQorLy8gYm91bmQuIE90aGVyd2lzZSwgaXQgY2FuIHJlc3VsdCBpbiB1bmludGVuZGVkIGJsb2NrLCB0aGVuIGRlYWRsb2NrLgorY2xhc3MgQm91bmRlZEFycmF5SW5wdXRTdHJlYW0gOiBwdWJsaWMgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0geworIHB1YmxpYzoKKyAgQm91bmRlZEFycmF5SW5wdXRTdHJlYW0oY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpCisgICAgICA6IHN0cmVhbV8oZGF0YSwgc2l6ZSksIGJvdW5kXyhzaXplKSB7fQorICB+Qm91bmRlZEFycmF5SW5wdXRTdHJlYW0oKSBvdmVycmlkZSB7fQorCisgIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSBvdmVycmlkZSB7CisgICAgR09PR0xFX0NIRUNLX0xUKHN0cmVhbV8uQnl0ZUNvdW50KCksIGJvdW5kXyk7CisgICAgcmV0dXJuIHN0cmVhbV8uTmV4dChkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIEJhY2tVcChpbnQgY291bnQpIG92ZXJyaWRlIHsgc3RyZWFtXy5CYWNrVXAoY291bnQpOyB9CisgIGJvb2wgU2tpcChpbnQgY291bnQpIG92ZXJyaWRlIHsgcmV0dXJuIHN0cmVhbV8uU2tpcChjb3VudCk7IH0KKyAgaW50NjRfdCBCeXRlQ291bnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBzdHJlYW1fLkJ5dGVDb3VudCgpOyB9CisKKyBwcml2YXRlOgorICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBzdHJlYW1fOworICBpbnQgYm91bmRfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIFRlc3RVdGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVEVTVF9VVElMMl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGYxYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCkBAIC0wLDAgKzEsMTk5MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKwordm9pZCBUZXN0VXRpbExpdGU6OlNldEFsbEZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSogbWVzc2FnZSkgeworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfaW50MzIoMTAxKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ludDY0KDEwMik7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF91aW50MzIoMTAzKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3VpbnQ2NCgxMDQpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfc2ludDMyKDEwNSk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9zaW50NjQoMTA2KTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ZpeGVkMzIoMTA3KTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ZpeGVkNjQoMTA4KTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3NmaXhlZDMyKDEwOSk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9zZml4ZWQ2NCgxMTApOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZmxvYXQoMTExKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2RvdWJsZSgxMTIpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfYm9vbCh0cnVlKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3N0cmluZygiMTE1Iik7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9ieXRlcygiMTE2Iik7CisKKyAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbGdyb3VwKCktPnNldF9hKDExNyk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDExOCk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCktPnNldF9jKDExOSk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UoKS0+c2V0X2QoMTIwKTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKS0+c2V0X2UoMTI2KTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9sYXp5X21lc3NhZ2UoKS0+c2V0X2JiKDEyNyk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UoKS0+c2V0X2JiKDEyOCk7CisKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX25lc3RlZF9lbnVtKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVopOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZm9yZWlnbl9lbnVtKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ltcG9ydF9lbnVtKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFaKTsKKworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ludDMyKDIwMSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQ2NCgyMDIpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfdWludDMyKDIwMyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50NjQoMjA0KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NpbnQzMigyMDUpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ludDY0KDIwNik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9maXhlZDMyKDIwNyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9maXhlZDY0KDIwOCk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQzMigyMDkpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ZpeGVkNjQoMjEwKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2Zsb2F0KDIxMSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9kb3VibGUoMjEyKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2Jvb2wodHJ1ZSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zdHJpbmcoIjIxNSIpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfYnl0ZXMoIjIxNiIpOworCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZGdyb3VwKCktPnNldF9hKDIxNyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMjE4KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgpLT5zZXRfYygyMTkpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UoKS0+c2V0X2QoMjIwKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2xhenlfbWVzc2FnZSgpLT5zZXRfYmIoMjI3KTsKKworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0odW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBUik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mb3JlaWduX2VudW0odW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW1wb3J0X2VudW0odW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVIpOworCisKKyAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgorICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50MzIoMzAxKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ludDY0KDMwMik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50MzIoMzAzKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3VpbnQ2NCgzMDQpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ludDMyKDMwNSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zaW50NjQoMzA2KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZpeGVkMzIoMzA3KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZpeGVkNjQoMzA4KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NmaXhlZDMyKDMwOSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQ2NCgzMTApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZmxvYXQoMzExKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2RvdWJsZSgzMTIpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfYm9vbChmYWxzZSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zdHJpbmcoIjMxNSIpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfYnl0ZXMoIjMxNiIpOworCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZGdyb3VwKCktPnNldF9hKDMxNyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMzE4KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgpLT5zZXRfYygzMTkpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UoKS0+c2V0X2QoMzIwKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2xhenlfbWVzc2FnZSgpLT5zZXRfYmIoMzI3KTsKKworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0odW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mb3JlaWduX2VudW0odW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVopOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW1wb3J0X2VudW0odW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVopOworCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9pbnQzMig0MDEpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9pbnQ2NCg0MDIpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF91aW50MzIoNDAzKTsKKyAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfdWludDY0KDQwNCk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NpbnQzMig0MDUpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9zaW50NjQoNDA2KTsKKyAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfZml4ZWQzMig0MDcpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9maXhlZDY0KDQwOCk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NmaXhlZDMyKDQwOSk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NmaXhlZDY0KDQxMCk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2Zsb2F0KDQxMSk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2RvdWJsZSg0MTIpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9ib29sKGZhbHNlKTsKKyAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfc3RyaW5nKCI0MTUiKTsKKyAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfYnl0ZXMoIjQxNiIpOworCisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X25lc3RlZF9lbnVtKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08pOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9mb3JlaWduX2VudW0odW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08pOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9pbXBvcnRfZW51bSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTyk7CisKKworICBtZXNzYWdlLT5zZXRfb25lb2ZfdWludDMyKDYwMSk7CisgIG1lc3NhZ2UtPm11dGFibGVfb25lb2ZfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDYwMik7CisgIG1lc3NhZ2UtPnNldF9vbmVvZl9zdHJpbmcoIjYwMyIpOworICBtZXNzYWdlLT5zZXRfb25lb2ZfYnl0ZXMoIjYwNCIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpNb2RpZnlSZXBlYXRlZEZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSogbWVzc2FnZSkgeworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfaW50MzIoMSwgNTAxKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ludDY0KDEsIDUwMik7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF91aW50MzIoMSwgNTAzKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX3VpbnQ2NCgxLCA1MDQpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc2ludDMyKDEsIDUwNSk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zaW50NjQoMSwgNTA2KTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ZpeGVkMzIoMSwgNTA3KTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ZpeGVkNjQoMSwgNTA4KTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX3NmaXhlZDMyKDEsIDUwOSk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zZml4ZWQ2NCgxLCA1MTApOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfZmxvYXQoMSwgNTExKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2RvdWJsZSgxLCA1MTIpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfYm9vbCgxLCB0cnVlKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX3N0cmluZygxLCAiNTE1Iik7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9ieXRlcygxLCAiNTE2Iik7CisKKyAgbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZGdyb3VwKDEpLT5zZXRfYSg1MTcpOworICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDEpLT5zZXRfYmIoNTE4KTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMSktPnNldF9jKDUxOSk7CisgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UoMSktPnNldF9kKDUyMCk7CisgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfbGF6eV9tZXNzYWdlKDEpLT5zZXRfYmIoNTI3KTsKKworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfbmVzdGVkX2VudW0oMSwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTyk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9mb3JlaWduX2VudW0oMSwgdW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08pOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfaW1wb3J0X2VudW0oMSwgdW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9GT08pOworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEZpZWxkc1NldCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSYgbWVzc2FnZSkgeworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW50NjQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3VpbnQzMigpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfdWludDY0KCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zaW50MzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NpbnQ2NCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZml4ZWQzMigpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NmaXhlZDY0KCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9mbG9hdCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZG91YmxlKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9ib29sKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2J5dGVzKCkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsZ3JvdXAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2xhenlfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UoKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbGdyb3VwKCkuaGFzX2EoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkuaGFzX2MoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UoKS5oYXNfZCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKS5oYXNfZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9sYXp5X21lc3NhZ2UoKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UoKS5oYXNfYmIoKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX2VudW0oKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X2VudW0oKSk7CisKKworICBFWFBFQ1RfRVEoMTAxLCBtZXNzYWdlLm9wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoMTAyLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0KCkpOworICBFWFBFQ1RfRVEoMTAzLCBtZXNzYWdlLm9wdGlvbmFsX3VpbnQzMigpKTsKKyAgRVhQRUNUX0VRKDEwNCwgbWVzc2FnZS5vcHRpb25hbF91aW50NjQoKSk7CisgIEVYUEVDVF9FUSgxMDUsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDMyKCkpOworICBFWFBFQ1RfRVEoMTA2LCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKDEwNywgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyKCkpOworICBFWFBFQ1RfRVEoMTA4LCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9FUSgxMDksIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSgxMTAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9FUSgxMTEsIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQoKSk7CisgIEVYUEVDVF9FUSgxMTIsIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKCkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbWVzc2FnZS5vcHRpb25hbF9ib29sKCkpOworICBFWFBFQ1RfRVEoIjExNSIsIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoIjExNiIsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMoKSk7CisKKyAgRVhQRUNUX0VRKDExNywgbWVzc2FnZS5vcHRpb25hbGdyb3VwKCkuYSgpKTsKKyAgRVhQRUNUX0VRKDExOCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworICBFWFBFQ1RfRVEoMTE5LCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpLmMoKSk7CisgIEVYUEVDVF9FUSgxMjAsIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UoKS5kKCkpOworICBFWFBFQ1RfRVEoMTI2LCBtZXNzYWdlLm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSgpLmUoKSk7CisgIEVYUEVDVF9FUSgxMjcsIG1lc3NhZ2Uub3B0aW9uYWxfbGF6eV9tZXNzYWdlKCkuYmIoKSk7CisgIEVYUEVDVF9FUSgxMjgsIG1lc3NhZ2Uub3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UoKS5iYigpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfZW51bSgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaLCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFaLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9lbnVtKCkpOworCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9ib29sX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlc19zaXplKCkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW1fc2l6ZSgpKTsKKworCisgIEVYUEVDVF9FUSgyMDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIoMCkpOworICBFWFBFQ1RfRVEoMjAyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0KDApKTsKKyAgRVhQRUNUX0VRKDIwMywgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIoMCkpOworICBFWFBFQ1RfRVEoMjA0LCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSgyMDUsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDIwNiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQoMCkpOworICBFWFBFQ1RfRVEoMjA3LCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoMjA4LCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoMjA5LCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDIxMCwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCgwKSk7CisgIEVYUEVDVF9FUSgyMTEsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQoMCkpOworICBFWFBFQ1RfRVEoMjEyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgwKSk7CisgIEVYUEVDVF9FUSh0cnVlLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2woMCkpOworICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKDApKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzKDApKTsKKworICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAoMCkuYSgpKTsKKyAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKS5iYigpKTsKKyAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSgwKS5kKCkpOworICBFWFBFQ1RfRVEoMjI3LCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZSgwKS5iYigpKTsKKworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFSLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBUiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bSgwKSk7CisKKyAgRVhQRUNUX0VRKDMwMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMigxKSk7CisgIEVYUEVDVF9FUSgzMDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQoMSkpOworICBFWFBFQ1RfRVEoMzAzLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMigxKSk7CisgIEVYUEVDVF9FUSgzMDQsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0KDEpKTsKKyAgRVhQRUNUX0VRKDMwNSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIoMSkpOworICBFWFBFQ1RfRVEoMzA2LCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCgxKSk7CisgIEVYUEVDVF9FUSgzMDcsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMigxKSk7CisgIEVYUEVDVF9FUSgzMDgsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCgxKSk7CisgIEVYUEVDVF9FUSgzMDksIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMSkpOworICBFWFBFQ1RfRVEoMzEwLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDEpKTsKKyAgRVhQRUNUX0VRKDMxMSwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdCgxKSk7CisgIEVYUEVDVF9FUSgzMTIsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDEpKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2woMSkpOworICBFWFBFQ1RfRVEoIjMxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKDEpKTsKKyAgRVhQRUNUX0VRKCIzMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzKDEpKTsKKworICBFWFBFQ1RfRVEoMzE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAoMSkuYSgpKTsKKyAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgxKS5iYigpKTsKKyAgRVhQRUNUX0VRKDMxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMSkuYygpKTsKKyAgRVhQRUNUX0VRKDMyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSgxKS5kKCkpOworICBFWFBFQ1RfRVEoMzI3LCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZSgxKS5iYigpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVosIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0oMSkpOworCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ludDMyKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ludDY0KCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X3VpbnQzMigpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF91aW50NjQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDMyKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X3NpbnQ2NCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9maXhlZDMyKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZmxvYXQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZG91YmxlKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2Jvb2woKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc3RyaW5nKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2J5dGVzKCkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfbmVzdGVkX2VudW0oKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ltcG9ydF9lbnVtKCkpOworCisKKyAgRVhQRUNUX0VRKDQwMSwgbWVzc2FnZS5kZWZhdWx0X2ludDMyKCkpOworICBFWFBFQ1RfRVEoNDAyLCBtZXNzYWdlLmRlZmF1bHRfaW50NjQoKSk7CisgIEVYUEVDVF9FUSg0MDMsIG1lc3NhZ2UuZGVmYXVsdF91aW50MzIoKSk7CisgIEVYUEVDVF9FUSg0MDQsIG1lc3NhZ2UuZGVmYXVsdF91aW50NjQoKSk7CisgIEVYUEVDVF9FUSg0MDUsIG1lc3NhZ2UuZGVmYXVsdF9zaW50MzIoKSk7CisgIEVYUEVDVF9FUSg0MDYsIG1lc3NhZ2UuZGVmYXVsdF9zaW50NjQoKSk7CisgIEVYUEVDVF9FUSg0MDcsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDMyKCkpOworICBFWFBFQ1RfRVEoNDA4LCBtZXNzYWdlLmRlZmF1bHRfZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0VRKDQwOSwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDMyKCkpOworICBFWFBFQ1RfRVEoNDEwLCBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9FUSg0MTEsIG1lc3NhZ2UuZGVmYXVsdF9mbG9hdCgpKTsKKyAgRVhQRUNUX0VRKDQxMiwgbWVzc2FnZS5kZWZhdWx0X2RvdWJsZSgpKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLmRlZmF1bHRfYm9vbCgpKTsKKyAgRVhQRUNUX0VRKCI0MTUiLCBtZXNzYWdlLmRlZmF1bHRfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoIjQxNiIsIG1lc3NhZ2UuZGVmYXVsdF9ieXRlcygpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTywgbWVzc2FnZS5kZWZhdWx0X25lc3RlZF9lbnVtKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08sIG1lc3NhZ2UuZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTywgbWVzc2FnZS5kZWZhdWx0X2ltcG9ydF9lbnVtKCkpOworCisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX3VpbnQzMigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX25lc3RlZF9tZXNzYWdlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2Zfc3RyaW5nKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vbmVvZl9ieXRlcygpKTsKKworICBFWFBFQ1RfRVEoIjYwNCIsIG1lc3NhZ2Uub25lb2ZfYnl0ZXMoKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbExpdGU6OkV4cGVjdENsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlJiBtZXNzYWdlKSB7CisgIC8vIGhhc19ibGFoKCkgc2hvdWxkIGluaXRpYWxseSBiZSBmYWxzZSBmb3IgYWxsIG9wdGlvbmFsIGZpZWxkcy4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW50NjQoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF91aW50MzIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF91aW50NjQoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zaW50MzIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zaW50NjQoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9maXhlZDMyKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NmaXhlZDMyKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9mbG9hdCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2RvdWJsZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2Jvb2woKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9ieXRlcygpKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxncm91cCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9sYXp5X21lc3NhZ2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF91bnZlcmlmaWVkX2xhenlfbWVzc2FnZSgpKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX2VudW0oKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbXBvcnRfZW51bSgpKTsKKworCisgIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gemVybyBvciBzb21ldGhpbmcgbGlrZSBpdC4KKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0KCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF91aW50MzIoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX3VpbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDMyKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9zaW50NjQoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX3NmaXhlZDMyKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9zZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSgpKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLm9wdGlvbmFsX2Jvb2woKSk7CisgIEVYUEVDVF9FUSgiIiwgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiIiwgbWVzc2FnZS5vcHRpb25hbF9ieXRlcygpKTsKKworICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxncm91cCgpLmhhc19hKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmhhc19iYigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkuaGFzX2MoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlKCkuaGFzX2QoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSgpLmhhc19lKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9sYXp5X21lc3NhZ2UoKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlKCkuaGFzX2JiKCkpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsZ3JvdXAoKS5hKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKS5jKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSgpLmQoKSk7CisKKyAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08sIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTywgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTywgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfZW51bSgpKTsKKworCisgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUoKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bV9zaXplKCkpOworCisKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9pbnQzMigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50NjQoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3VpbnQzMigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDY0KCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zaW50MzIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3NpbnQ2NCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQzMigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9mbG9hdCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZG91YmxlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9ib29sKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zdHJpbmcoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2J5dGVzKCkpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X25lc3RlZF9lbnVtKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2ltcG9ydF9lbnVtKCkpOworCisKKyAgLy8gRmllbGRzIHdpdGggZGVmYXVsdHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyAoZHVoKS4KKyAgRVhQRUNUX0VRKDQxLCBtZXNzYWdlLmRlZmF1bHRfaW50MzIoKSk7CisgIEVYUEVDVF9FUSg0MiwgbWVzc2FnZS5kZWZhdWx0X2ludDY0KCkpOworICBFWFBFQ1RfRVEoNDMsIG1lc3NhZ2UuZGVmYXVsdF91aW50MzIoKSk7CisgIEVYUEVDVF9FUSg0NCwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKC00NSwgbWVzc2FnZS5kZWZhdWx0X3NpbnQzMigpKTsKKyAgRVhQRUNUX0VRKDQ2LCBtZXNzYWdlLmRlZmF1bHRfc2ludDY0KCkpOworICBFWFBFQ1RfRVEoNDcsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDMyKCkpOworICBFWFBFQ1RfRVEoNDgsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDY0KCkpOworICBFWFBFQ1RfRVEoNDksIG1lc3NhZ2UuZGVmYXVsdF9zZml4ZWQzMigpKTsKKyAgRVhQRUNUX0VRKC01MCwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoNTEuNSwgbWVzc2FnZS5kZWZhdWx0X2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoNTJlMywgbWVzc2FnZS5kZWZhdWx0X2RvdWJsZSgpKTsKKyAgRVhQRUNUX0VRKHRydWUsIG1lc3NhZ2UuZGVmYXVsdF9ib29sKCkpOworICBFWFBFQ1RfRVEoImhlbGxvIiwgbWVzc2FnZS5kZWZhdWx0X3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJ3b3JsZCIsIG1lc3NhZ2UuZGVmYXVsdF9ieXRlcygpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBUiwgbWVzc2FnZS5kZWZhdWx0X25lc3RlZF9lbnVtKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIsIG1lc3NhZ2UuZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBUiwgbWVzc2FnZS5kZWZhdWx0X2ltcG9ydF9lbnVtKCkpOworCisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX3VpbnQzMigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX25lc3RlZF9tZXNzYWdlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2Zfc3RyaW5nKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2ZfYnl0ZXMoKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbExpdGU6OkV4cGVjdFJlcGVhdGVkRmllbGRzTW9kaWZpZWQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUmIG1lc3NhZ2UpIHsKKyAgLy8gTW9kaWZ5UmVwZWF0ZWRGaWVsZHMgb25seSBzZXRzIHRoZSBzZWNvbmQgcmVwZWF0ZWQgZWxlbWVudCBvZiBlYWNoCisgIC8vIGZpZWxkLiAgSW4gYWRkaXRpb24gdG8gdmVyaWZ5aW5nIHRoaXMsIHdlIGFsc28gdmVyaWZ5IHRoYXQgdGhlIGZpcnN0CisgIC8vIGVsZW1lbnQgYW5kIHNpemUgd2VyZSAqbm90KiBtb2RpZmllZC4KKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXNfc2l6ZSgpKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZGdyb3VwX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtX3NpemUoKSk7CisKKworICBFWFBFQ1RfRVEoMjAxLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDIwMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSgyMDMsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyKDApKTsKKyAgRVhQRUNUX0VRKDIwNCwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQoMCkpOworICBFWFBFQ1RfRVEoMjA1LCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMigwKSk7CisgIEVYUEVDVF9FUSgyMDYsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0KDApKTsKKyAgRVhQRUNUX0VRKDIwNywgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDIwOCwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDIwOSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigwKSk7CisgIEVYUEVDVF9FUSgyMTAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoMjExLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0KDApKTsKKyAgRVhQRUNUX0VRKDIxMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMCkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbWVzc2FnZS5yZXBlYXRlZF9ib29sKDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZygwKSk7CisgIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcygwKSk7CisKKyAgRVhQRUNUX0VRKDIxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwKDApLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApLmMoKSk7CisgIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UoMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UoMCkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0oMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFSLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtKDApKTsKKworCisgIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgorICBFWFBFQ1RfRVEoNTAxLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyKDEpKTsKKyAgRVhQRUNUX0VRKDUwMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCgxKSk7CisgIEVYUEVDVF9FUSg1MDMsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyKDEpKTsKKyAgRVhQRUNUX0VRKDUwNCwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQoMSkpOworICBFWFBFQ1RfRVEoNTA1LCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMigxKSk7CisgIEVYUEVDVF9FUSg1MDYsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0KDEpKTsKKyAgRVhQRUNUX0VRKDUwNywgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyKDEpKTsKKyAgRVhQRUNUX0VRKDUwOCwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0KDEpKTsKKyAgRVhQRUNUX0VRKDUwOSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigxKSk7CisgIEVYUEVDVF9FUSg1MTAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMSkpOworICBFWFBFQ1RfRVEoNTExLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0KDEpKTsKKyAgRVhQRUNUX0VRKDUxMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMSkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbWVzc2FnZS5yZXBlYXRlZF9ib29sKDEpKTsKKyAgRVhQRUNUX0VRKCI1MTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZygxKSk7CisgIEVYUEVDVF9FUSgiNTE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcygxKSk7CisKKyAgRVhQRUNUX0VRKDUxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwKDEpLmEoKSk7CisgIEVYUEVDVF9FUSg1MTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMSkuYmIoKSk7CisgIEVYUEVDVF9FUSg1MTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLmMoKSk7CisgIEVYUEVDVF9FUSg1MjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UoMSkuZCgpKTsKKyAgRVhQRUNUX0VRKDUyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UoMSkuYmIoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08sIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0oMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08sIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfRk9PLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtKDEpKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpTZXRQYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9pbnQzMig2MDEpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ludDY0KDYwMik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDMyKDYwMyk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDY0KDYwNCk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ludDMyKDYwNSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ludDY0KDYwNik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZml4ZWQzMig2MDcpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ZpeGVkNjQoNjA4KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zZml4ZWQzMig2MDkpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NmaXhlZDY0KDYxMCk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZmxvYXQoNjExKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9kb3VibGUoNjEyKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9ib29sKHRydWUpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2VudW0odW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIpOworICAvLyBhZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9pbnQzMig3MDEpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ludDY0KDcwMik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDMyKDcwMyk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDY0KDcwNCk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ludDMyKDcwNSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ludDY0KDcwNik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZml4ZWQzMig3MDcpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ZpeGVkNjQoNzA4KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zZml4ZWQzMig3MDkpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NmaXhlZDY0KDcxMCk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZmxvYXQoNzExKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9kb3VibGUoNzEyKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9ib29sKGZhbHNlKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9lbnVtKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6TW9kaWZ5UGFja2VkRmllbGRzKHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfaW50MzIoMSwgODAxKTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9pbnQ2NCgxLCA4MDIpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX3VpbnQzMigxLCA4MDMpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX3VpbnQ2NCgxLCA4MDQpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX3NpbnQzMigxLCA4MDUpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX3NpbnQ2NCgxLCA4MDYpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX2ZpeGVkMzIoMSwgODA3KTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9maXhlZDY0KDEsIDgwOCk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfc2ZpeGVkMzIoMSwgODA5KTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9zZml4ZWQ2NCgxLCA4MTApOworICBtZXNzYWdlLT5zZXRfcGFja2VkX2Zsb2F0KDEsIDgxMSk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfZG91YmxlKDEsIDgxMik7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfYm9vbCgxLCB0cnVlKTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9lbnVtKDEsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRmllbGRzU2V0KAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlJiBtZXNzYWdlKSB7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9pbnQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfaW50NjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3VpbnQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfdWludDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zaW50MzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZml4ZWQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9mbG9hdF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZG91YmxlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9ib29sX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9lbnVtX3NpemUoKSk7CisKKyAgRVhQRUNUX0VRKDYwMSwgbWVzc2FnZS5wYWNrZWRfaW50MzIoMCkpOworICBFWFBFQ1RfRVEoNjAyLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSg2MDMsIG1lc3NhZ2UucGFja2VkX3VpbnQzMigwKSk7CisgIEVYUEVDVF9FUSg2MDQsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSg2MDUsIG1lc3NhZ2UucGFja2VkX3NpbnQzMigwKSk7CisgIEVYUEVDVF9FUSg2MDYsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSg2MDcsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoNjA4LCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDYwOSwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoNjEwLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NCgwKSk7CisgIEVYUEVDVF9FUSg2MTEsIG1lc3NhZ2UucGFja2VkX2Zsb2F0KDApKTsKKyAgRVhQRUNUX0VRKDYxMiwgbWVzc2FnZS5wYWNrZWRfZG91YmxlKDApKTsKKyAgRVhQRUNUX0VRKHRydWUsIG1lc3NhZ2UucGFja2VkX2Jvb2woMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIsIG1lc3NhZ2UucGFja2VkX2VudW0oMCkpOworCisgIEVYUEVDVF9FUSg3MDEsIG1lc3NhZ2UucGFja2VkX2ludDMyKDEpKTsKKyAgRVhQRUNUX0VRKDcwMiwgbWVzc2FnZS5wYWNrZWRfaW50NjQoMSkpOworICBFWFBFQ1RfRVEoNzAzLCBtZXNzYWdlLnBhY2tlZF91aW50MzIoMSkpOworICBFWFBFQ1RfRVEoNzA0LCBtZXNzYWdlLnBhY2tlZF91aW50NjQoMSkpOworICBFWFBFQ1RfRVEoNzA1LCBtZXNzYWdlLnBhY2tlZF9zaW50MzIoMSkpOworICBFWFBFQ1RfRVEoNzA2LCBtZXNzYWdlLnBhY2tlZF9zaW50NjQoMSkpOworICBFWFBFQ1RfRVEoNzA3LCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyKDEpKTsKKyAgRVhQRUNUX0VRKDcwOCwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NCgxKSk7CisgIEVYUEVDVF9FUSg3MDksIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyKDEpKTsKKyAgRVhQRUNUX0VRKDcxMCwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkNjQoMSkpOworICBFWFBFQ1RfRVEoNzExLCBtZXNzYWdlLnBhY2tlZF9mbG9hdCgxKSk7CisgIEVYUEVDVF9FUSg3MTIsIG1lc3NhZ2UucGFja2VkX2RvdWJsZSgxKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5wYWNrZWRfYm9vbCgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiwgbWVzc2FnZS5wYWNrZWRfZW51bSgxKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZENsZWFyKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlJiBtZXNzYWdlKSB7CisgIC8vIFBhY2tlZCByZXBlYXRlZCBmaWVsZHMgYXJlIGVtcHR5LgorICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX2ludDY0X3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF91aW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfc2ludDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9zaW50NjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZmxvYXRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX2RvdWJsZV9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfYm9vbF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZW51bV9zaXplKCkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRGaWVsZHNNb2RpZmllZCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSYgbWVzc2FnZSkgeworICAvLyBEbyB0aGUgc2FtZSBmb3IgcGFja2VkIHJlcGVhdGVkIGZpZWxkcy4KKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2ludDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfdWludDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF91aW50NjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NpbnQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ludDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkNjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2Zsb2F0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9kb3VibGVfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2Jvb2xfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2VudW1fc2l6ZSgpKTsKKworICBFWFBFQ1RfRVEoNjAxLCBtZXNzYWdlLnBhY2tlZF9pbnQzMigwKSk7CisgIEVYUEVDVF9FUSg2MDIsIG1lc3NhZ2UucGFja2VkX2ludDY0KDApKTsKKyAgRVhQRUNUX0VRKDYwMywgbWVzc2FnZS5wYWNrZWRfdWludDMyKDApKTsKKyAgRVhQRUNUX0VRKDYwNCwgbWVzc2FnZS5wYWNrZWRfdWludDY0KDApKTsKKyAgRVhQRUNUX0VRKDYwNSwgbWVzc2FnZS5wYWNrZWRfc2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDYwNiwgbWVzc2FnZS5wYWNrZWRfc2ludDY0KDApKTsKKyAgRVhQRUNUX0VRKDYwNywgbWVzc2FnZS5wYWNrZWRfZml4ZWQzMigwKSk7CisgIEVYUEVDVF9FUSg2MDgsIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoNjA5LCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQzMigwKSk7CisgIEVYUEVDVF9FUSg2MTAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDYxMSwgbWVzc2FnZS5wYWNrZWRfZmxvYXQoMCkpOworICBFWFBFQ1RfRVEoNjEyLCBtZXNzYWdlLnBhY2tlZF9kb3VibGUoMCkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbWVzc2FnZS5wYWNrZWRfYm9vbCgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBUiwgbWVzc2FnZS5wYWNrZWRfZW51bSgwKSk7CisgIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgorICBFWFBFQ1RfRVEoODAxLCBtZXNzYWdlLnBhY2tlZF9pbnQzMigxKSk7CisgIEVYUEVDVF9FUSg4MDIsIG1lc3NhZ2UucGFja2VkX2ludDY0KDEpKTsKKyAgRVhQRUNUX0VRKDgwMywgbWVzc2FnZS5wYWNrZWRfdWludDMyKDEpKTsKKyAgRVhQRUNUX0VRKDgwNCwgbWVzc2FnZS5wYWNrZWRfdWludDY0KDEpKTsKKyAgRVhQRUNUX0VRKDgwNSwgbWVzc2FnZS5wYWNrZWRfc2ludDMyKDEpKTsKKyAgRVhQRUNUX0VRKDgwNiwgbWVzc2FnZS5wYWNrZWRfc2ludDY0KDEpKTsKKyAgRVhQRUNUX0VRKDgwNywgbWVzc2FnZS5wYWNrZWRfZml4ZWQzMigxKSk7CisgIEVYUEVDVF9FUSg4MDgsIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjQoMSkpOworICBFWFBFQ1RfRVEoODA5LCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQzMigxKSk7CisgIEVYUEVDVF9FUSg4MTAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0KDEpKTsKKyAgRVhQRUNUX0VRKDgxMSwgbWVzc2FnZS5wYWNrZWRfZmxvYXQoMSkpOworICBFWFBFQ1RfRVEoODEyLCBtZXNzYWdlLnBhY2tlZF9kb3VibGUoMSkpOworICBFWFBFQ1RfRVEodHJ1ZSwgbWVzc2FnZS5wYWNrZWRfYm9vbCgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTywgbWVzc2FnZS5wYWNrZWRfZW51bSgxKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEV4dGVuc2lvbnMKKy8vCisvLyBBbGwgdGhpcyBjb2RlIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0byB0aGUgYWJvdmUgY29kZSBleGNlcHQgdGhhdCBpdCdzCisvLyBtYW5pcHVsYXRpbmcgZXh0ZW5zaW9uIGZpZWxkcyBpbnN0ZWFkIG9mIG5vcm1hbCBvbmVzLgorLy8KKy8vIEkgZ2F2ZSB1cCBvbiB0aGUgODAtY2hhciBsaW1pdCBoZXJlLiAgU29ycnkuCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpTZXRBbGxFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb25fbGl0ZSwgMTAxKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb25fbGl0ZSwgMTAyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uX2xpdGUsIDEwMyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl9saXRlLCAxMDQpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb25fbGl0ZSwgMTA1KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUsIDEwNik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMTA3KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbl9saXRlLCAxMDgpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCAxMDkpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAxMTApOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbl9saXRlLCAxMTEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb25fbGl0ZSwgMTEyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbl9saXRlLCB0cnVlKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUsICIxMTUiKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ieXRlc19leHRlbnNpb25fbGl0ZSwgIjExNiIpOworCisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUpLT5zZXRfYSgxMTcpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkKKyAgICAgIC0+c2V0X2JiKDExOCk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkKKyAgICAgIC0+c2V0X2MoMTE5KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAtPnNldF9kKDEyMCk7CisgIG1lc3NhZ2UKKyAgICAgIC0+TXV0YWJsZUV4dGVuc2lvbigKKyAgICAgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKQorICAgICAgLT5zZXRfZSgxMjYpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAtPnNldF9iYigxMjcpOworICBtZXNzYWdlCisgICAgICAtPk11dGFibGVFeHRlbnNpb24oCisgICAgICAgICAgdW5pdHRlc3Q6Om9wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKQorICAgICAgLT5zZXRfYmIoMTI4KTsKKworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVopOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVopOworCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlLCAyMDEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlLCAyMDIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSwgMjAzKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUsIDIwNCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlLCAyMDUpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSwgMjA2KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlLCAyMDcpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDIwOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDIwOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDIxMCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUsIDIxMSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlLCAyMTIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUsIHRydWUpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSwgIjIxNSIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlLCAiMjE2Iik7CisKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl9saXRlKS0+c2V0X2EoMjE3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkKKyAgICAgIC0+c2V0X2JiKDIxOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKQorICAgICAgLT5zZXRfYygyMTkpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKQorICAgICAgLT5zZXRfZCgyMjApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkKKyAgICAgIC0+c2V0X2JiKDIyNyk7CisKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFSKTsKKworCisgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSwgMzAxKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSwgMzAyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUsIDMwMyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlLCAzMDQpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSwgMzA1KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUsIDMwNik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMzA3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlLCAzMDgpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCAzMDkpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAzMTApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlLCAzMTEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSwgMzEyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlLCBmYWxzZSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlLCAiMzE1Iik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUsICIzMTYiKTsKKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUpLT5zZXRfYSgzMTcpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKQorICAgICAgLT5zZXRfYmIoMzE4KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAtPnNldF9jKDMxOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAtPnNldF9kKDMyMCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKQorICAgICAgLT5zZXRfYmIoMzI3KTsKKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVopOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVopOworCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uX2xpdGUsIDQwMSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQ2NF9leHRlbnNpb25fbGl0ZSwgNDAyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb25fbGl0ZSwgNDAzKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb25fbGl0ZSwgNDA0KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQzMl9leHRlbnNpb25fbGl0ZSwgNDA1KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25fbGl0ZSwgNDA2KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDQwNyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbl9saXRlLCA0MDgpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDQwOSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgNDEwKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbl9saXRlLCA0MTEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbl9saXRlLCA0MTIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYm9vbF9leHRlbnNpb25fbGl0ZSwgZmFsc2UpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl9saXRlLCAiNDE1Iik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ieXRlc19leHRlbnNpb25fbGl0ZSwgIjQxNiIpOworCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08pOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08pOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTyk7CisKKworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX3VpbnQzMl9leHRlbnNpb25fbGl0ZSwgNjAxKTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAtPnNldF9iYig2MDIpOworICA7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2Zfc3RyaW5nX2V4dGVuc2lvbl9saXRlLCAiNjAzIik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUsICI2MDQiKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6TW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zKAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSwgMSwgNTAxKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSwgMSwgNTAyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUsIDEsIDUwMyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlLCAxLCA1MDQpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSwgMSwgNTA1KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUsIDEsIDUwNik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMSwgNTA3KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlLCAxLCA1MDgpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCAxLCA1MDkpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAxLCA1MTApOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlLCAxLCA1MTEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSwgMSwgNTEyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlLCAxLCB0cnVlKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUsIDEsICI1MTUiKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb25fbGl0ZSwgMSwgIjUxNiIpOworCisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUsIDEpCisgICAgICAtPnNldF9hKDUxNyk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlLCAxKQorICAgICAgLT5zZXRfYmIoNTE4KTsKKyAgbWVzc2FnZQorICAgICAgLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUsIDEpCisgICAgICAtPnNldF9jKDUxOSk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlLCAxKQorICAgICAgLT5zZXRfZCg1MjApOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUsIDEpCisgICAgICAtPnNldF9iYig1MjcpOworCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6Rk9PKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTyk7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKSB7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mbG9hdF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl9saXRlKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgbWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKAorICAgICAgdW5pdHRlc3Q6Om9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKworICBFWFBFQ1RfVFJVRSgKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbl9saXRlKS5oYXNfYSgpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAgICAgLmhhc19iYigpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKQorICAgICAgICAgIC5oYXNfYygpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAgICAgLmhhc19kKCkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIG1lc3NhZ2UKKyAgICAgICAgICAuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAgICAgLmhhc19lKCkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAgICAgLmhhc19iYigpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZQorICAgICAgICAgICAgICAgICAgLkdldEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAgICAgICAgICAgICAuaGFzX2JiKCkpOworCisgIEVYUEVDVF9UUlVFKAorICAgICAgbWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgbWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSkpOworCisKKyAgRVhQRUNUX0VRKDEwMSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgxMDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMTAzLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMTA0LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMTA1LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMTA2LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMTA3LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDEwOCwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgxMDksCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDExMCwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMTExLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDExMiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKHRydWUsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgiMTE1IiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKCIxMTYiLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl9saXRlKSk7CisKKyAgRVhQRUNUX0VRKDExNywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbl9saXRlKS5hKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAxMTgsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAgICAgLmJiKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAxMTksCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKQorICAgICAgICAgIC5jKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAxMjAsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAgICAgLmQoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDEyNiwKKyAgICAgIG1lc3NhZ2UKKyAgICAgICAgICAuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAgICAgLmUoKSk7CisgIEVYUEVDVF9FUSgxMjcsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKQorICAgICAgICAgICAgICAgIC5iYigpKTsKKyAgRVhQRUNUX0VRKDEyOCwKKyAgICAgICAgICAgIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAuR2V0RXh0ZW5zaW9uKAorICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAgICAgICAgICAgLmJiKCkpOworCisgIEVYUEVDVF9FUSgKKyAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVosCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgdW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVosCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFaLAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlKSk7CisKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsCisgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb25fbGl0ZSkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSgKKyAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSgKKyAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoCisgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgKKyAgICAgIDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgKKyAgICAgIDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKAorICAgICAgMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKAorICAgICAgMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSkpOworCisKKyAgRVhQRUNUX0VRKDIwMSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoMjAyLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSgyMDMsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSgyMDQsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSgyMDUsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSgyMDYsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSgyMDcsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoMjA4LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMjA5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMjEwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDIxMSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoMjEyLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEodHJ1ZSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSgiMjE1IiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKCIyMTYiLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlLCAwKSk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgMjE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSwgMCkuYSgpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMjE4LAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlLCAwKQorICAgICAgICAgIC5iYigpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMjE5LAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMCkKKyAgICAgICAgICAuYygpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMjIwLAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlLCAwKQorICAgICAgICAgIC5kKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAyMjcsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlLCAwKQorICAgICAgICAgIC5iYigpKTsKKworICBFWFBFQ1RfRVEoCisgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFSLAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSLAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoCisgICAgICB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBUiwKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSwgMCkpOworCisKKyAgRVhQRUNUX0VRKDMwMSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoMzAyLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSgzMDMsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSgzMDQsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSgzMDUsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSgzMDYsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSgzMDcsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoMzA4LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMzA5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMzEwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDMxMSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoMzEyLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoZmFsc2UsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoIjMxNSIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSgiMzE2IiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb25fbGl0ZSwgMSkpOworCisgIEVYUEVDVF9FUSgKKyAgICAgIDMxNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUsIDEpLmEoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDMxOCwKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMSkKKyAgICAgICAgICAuYmIoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDMxOSwKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUsIDEpCisgICAgICAgICAgLmMoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDMyMCwKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMSkKKyAgICAgICAgICAuZCgpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMzI3LAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMSkKKyAgICAgICAgICAuYmIoKSk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiwKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoCisgICAgICB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiwKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgdW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVosCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYm9vbF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUpKTsKKworICBFWFBFQ1RfVFJVRSgKKyAgICAgIG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgbWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgbWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKworCisgIEVYUEVDVF9FUSg0MDEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSg0MDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSg0MDMsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoNDA0LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDQwNSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSg0MDYsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoNDA3LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoNDA4LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoNDA5LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDQxMCwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSg0MTEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSg0MTIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2RvdWJsZV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKCI0MTUiLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgiNDE2IiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbl9saXRlKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08sCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoCisgICAgICB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTywKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9GT08sCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSkpOworCisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX3VpbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkKKyAgICAgICAgICAuaGFzX2JiKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b25lb2Zfc3RyaW5nX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9ieXRlc19leHRlbnNpb25fbGl0ZSkpOworCisgIEVYUEVDVF9FUSg2MDEsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl91aW50MzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgNjAyLAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKS5iYigpKTsKKyAgRVhQRUNUX0VRKCI2MDMiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2Zfc3RyaW5nX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgiNjA0IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX2J5dGVzX2V4dGVuc2lvbl9saXRlKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbExpdGU6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcigKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKSB7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKTsKKyAgRVhQRUNUX0VRKCIiLCBzZXJpYWxpemVkKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuQnl0ZVNpemVMb25nKCkpOworCisgIC8vIGhhc19ibGFoKCkgc2hvdWxkIGluaXRpYWxseSBiZSBmYWxzZSBmb3IgYWxsIG9wdGlvbmFsIGZpZWxkcy4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgbWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYm9vbF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl9saXRlKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKworICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgbWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKworCisgIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gemVybyBvciBzb21ldGhpbmcgbGlrZSBpdC4KKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mbG9hdF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoZmFsc2UsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYm9vbF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoIiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKCIiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUpKTsKKworICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4KKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUpLmhhc19hKCkpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAgICAgLmhhc19iYigpKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkKKyAgICAgICAgICAuaGFzX2MoKSk7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkKKyAgICAgICAgICAuaGFzX2QoKSk7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIG1lc3NhZ2UKKyAgICAgICAgICAuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAgICAgLmhhc19lKCkpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKQorICAgICAgICAgIC5oYXNfYmIoKSk7CisKKyAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb25fbGl0ZSkuYSgpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKQorICAgICAgICAgICAgIC5iYigpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkKKyAgICAgICAgICAgICAuYygpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKQorICAgICAgICAgICAgIC5kKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZQorICAgICAgICAgICAgICAgICAgIC5HZXRFeHRlbnNpb24oCisgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpCisgICAgICAgICAgICAgICAgICAgLmUoKSk7CisgIEVYUEVDVF9FUSgwLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkKKyAgICAgICAgICAgICAgICAuYmIoKSk7CisKKyAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KKyAgRVhQRUNUX0VRKAorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTywKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoCisgICAgICB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTywKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgdW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9GT08sCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKworCisgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb25fbGl0ZSkpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSgKKyAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSgKKyAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoCisgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSkpOworCisKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2RvdWJsZV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYm9vbF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ieXRlc19leHRlbnNpb25fbGl0ZSkpOworCisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSkpOworCisKKyAgLy8gRmllbGRzIHdpdGggZGVmYXVsdHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyAoZHVoKS4KKyAgRVhQRUNUX0VRKDQxLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoNDIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSg0MywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSg0NCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgtNDUsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoNDYsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoNDcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDQ4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSg0OSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgtNTAsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoNTEuNSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDUyZTMsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKHRydWUsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKCJoZWxsbyIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKCJ3b3JsZCIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ieXRlc19leHRlbnNpb25fbGl0ZSkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFSLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgdW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFSLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfdWludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkKKyAgICAgICAgICAuaGFzX2JiKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX3N0cmluZ19leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX2J5dGVzX2V4dGVuc2lvbl9saXRlKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbExpdGU6OkV4cGVjdFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpIHsKKyAgLy8gTW9kaWZ5UmVwZWF0ZWRGaWVsZHMgb25seSBzZXRzIHRoZSBzZWNvbmQgcmVwZWF0ZWQgZWxlbWVudCBvZiBlYWNoCisgIC8vIGZpZWxkLiAgSW4gYWRkaXRpb24gdG8gdmVyaWZ5aW5nIHRoaXMsIHdlIGFsc28gdmVyaWZ5IHRoYXQgdGhlIGZpcnN0CisgIC8vIGVsZW1lbnQgYW5kIHNpemUgd2VyZSAqbm90KiBtb2RpZmllZC4KKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLAorICAgICAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwKKyAgICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKAorICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKAorICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSgKKyAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKAorICAgICAgMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKAorICAgICAgMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoCisgICAgICAyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoCisgICAgICAyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlKSk7CisKKworICBFWFBFQ1RfRVEoMjAxLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSgyMDIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDIwMywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDIwNCwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDIwNSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDIwNiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDIwNywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSgyMDgsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoCisgICAgICAyMDksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoCisgICAgICAyMTAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoMjExLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSgyMTIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSh0cnVlLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoIjIxNiIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKworICBFWFBFQ1RfRVEoCisgICAgICAyMTcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl9saXRlLCAwKS5hKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAyMTgsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUsIDApCisgICAgICAgICAgLmJiKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAyMTksCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlLCAwKQorICAgICAgICAgIC5jKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAyMjAsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUsIDApCisgICAgICAgICAgLmQoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDIyNywKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUsIDApCisgICAgICAgICAgLmJiKCkpOworCisgIEVYUEVDVF9FUSgKKyAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKAorICAgICAgdW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFSLAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlLCAwKSk7CisKKworICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KKyAgRVhQRUNUX0VRKDUwMSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoNTAyLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSg1MDMsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSg1MDQsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSg1MDUsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSg1MDYsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSg1MDcsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoNTA4LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgNTA5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgNTEwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDUxMSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoNTEyLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEodHJ1ZSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSgiNTE1IiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKCI1MTYiLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlLCAxKSk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgNTE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSwgMSkuYSgpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgNTE4LAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlLCAxKQorICAgICAgICAgIC5iYigpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgNTE5LAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMSkKKyAgICAgICAgICAuYygpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgNTIwLAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlLCAxKQorICAgICAgICAgIC5kKCkpOworICBFWFBFQ1RfRVEoCisgICAgICA1MjcsCisgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlLCAxKQorICAgICAgICAgIC5iYigpKTsKKworICBFWFBFQ1RfRVEoCisgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6Rk9PLAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PLAorICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoCisgICAgICB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTywKKyAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSwgMSkpOworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbExpdGU6OlNldFBhY2tlZEV4dGVuc2lvbnMoCisgICAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSogbWVzc2FnZSkgeworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSwgNjAxKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUsIDYwMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSwgNjAzKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlLCA2MDQpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUsIDYwNSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSwgNjA2KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgNjA3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgNjA4KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDYwOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCA2MTApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSwgNjExKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlLCA2MTIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbl9saXRlLCB0cnVlKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSKTsKKyAgLy8gYWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlLCA3MDEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSwgNzAyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlLCA3MDMpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUsIDcwNCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSwgNzA1KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlLCA3MDYpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlLCA3MDcpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlLCA3MDgpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgNzA5KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDcxMCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlLCA3MTEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUsIDcxMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUsIGZhbHNlKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6TW9kaWZ5UGFja2VkRXh0ZW5zaW9ucygKKyAgICB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlLCAxLCA4MDEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSwgMSwgODAyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlLCAxLCA4MDMpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUsIDEsIDgwNCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSwgMSwgODA1KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlLCAxLCA4MDYpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlLCAxLCA4MDcpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlLCAxLCA4MDgpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMSwgODA5KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDEsIDgxMCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlLCAxLCA4MTEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUsIDEsIDgxMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUsIDEsIHRydWUpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpIHsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKworICBFWFBFQ1RfRVEoNjAxLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoNjAyLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoNjAzLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDYwNCwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSg2MDUsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoNjA2LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDYwNywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoNjA4LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSg2MDksCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSg2MTAsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSg2MTEsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSg2MTIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEodHJ1ZSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDcwMSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDcwMiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDcwMywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSg3MDQsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoNzA1LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDcwNiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSg3MDcsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDcwOCwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoNzA5LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoNzEwLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoNzExLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoNzEyLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKGZhbHNlLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSwgMSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zQ2xlYXIoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSkgeworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zTW9kaWZpZWQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSkgeworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoNjAxLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoNjAyLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoNjAzLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDYwNCwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSg2MDUsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoNjA2LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDYwNywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoNjA4LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSg2MDksCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSg2MTAsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSg2MTEsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSg2MTIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEodHJ1ZSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDApKTsKKworICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KKyAgRVhQRUNUX0VRKDgwMSwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDgwMiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDgwMywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSg4MDQsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoODA1LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDgwNiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSg4MDcsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDgwOCwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoODA5LAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoODEwLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoODExLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoODEyLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKHRydWUsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlLCAxKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZWRmOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVEVTVF9VVElMX0xJVEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9URVNUX1VUSUxfTElURV9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIHVuaXR0ZXN0ID0gcHJvdG9idWZfdW5pdHRlc3Q7CituYW1lc3BhY2UgdW5pdHRlc3RfaW1wb3J0ID0gcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OworCitjbGFzcyBUZXN0VXRpbExpdGUgeworIHB1YmxpYzoKKyAgLy8gU2V0IGV2ZXJ5IGZpZWxkIGluIHRoZSBtZXNzYWdlIHRvIGEgdW5pcXVlIHZhbHVlLgorICBzdGF0aWMgdm9pZCBTZXRBbGxGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXRBbGxFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXRQYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXRQYWNrZWRFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUqIG1lc3NhZ2UpOworCisgIC8vIFVzZSB0aGUgcmVwZWF0ZWQgdmVyc2lvbnMgb2YgdGhlIHNldF8qKCkgYWNjZXNzb3JzIHRvIG1vZGlmeSBhbGwgdGhlCisgIC8vIHJlcGVhdGVkIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSAod2hpY2ggc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuCisgIC8vIGluaXRpYWxpemVkIHdpdGggU2V0KkZpZWxkcygpKS4gIFNldCpGaWVsZHMoKSBpdHNlbGYgb25seSB0ZXN0cworICAvLyB0aGUgYWRkXyooKSBhY2Nlc3NvcnMuCisgIHN0YXRpYyB2b2lkIE1vZGlmeVJlcGVhdGVkRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlKiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgTW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zKAorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zTGl0ZSogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIE1vZGlmeVBhY2tlZEZpZWxkcyh1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIE1vZGlmeVBhY2tlZEV4dGVuc2lvbnMoCisgICAgICB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlKiBtZXNzYWdlKTsKKworICAvLyBDaGVjayB0aGF0IGFsbCBmaWVsZHMgaGF2ZSB0aGUgdmFsdWVzIHRoYXQgdGhleSBzaG91bGQgaGF2ZSBhZnRlcgorICAvLyBTZXQqRmllbGRzKCkgaXMgY2FsbGVkLgorICBzdGF0aWMgdm9pZCBFeHBlY3RBbGxGaWVsZHNTZXQoY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RBbGxFeHRlbnNpb25zU2V0KAorICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdFBhY2tlZEZpZWxkc1NldCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpOworCisgIC8vIEV4cGVjdCB0aGF0IHRoZSBtZXNzYWdlIGlzIG1vZGlmaWVkIGFzIHdvdWxkIGJlIGV4cGVjdGVkIGZyb20KKyAgLy8gTW9kaWZ5KkZpZWxkcygpLgorICBzdGF0aWMgdm9pZCBFeHBlY3RSZXBlYXRlZEZpZWxkc01vZGlmaWVkKAorICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRGaWVsZHNNb2RpZmllZCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0UGFja2VkRXh0ZW5zaW9uc01vZGlmaWVkKAorICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgZmllbGRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgIHN0YXRpYyB2b2lkIEV4cGVjdENsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0RXh0ZW5zaW9uc0NsZWFyKAorICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdFBhY2tlZENsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0UGFja2VkRXh0ZW5zaW9uc0NsZWFyKAorICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSk7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFV0aWxMaXRlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9URVNUX1VUSUxfTElURV9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvYmFkX3V0Zjhfc3RyaW5nIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9iYWRfdXRmOF9zdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzMzdlYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvYmFkX3V0Zjhfc3RyaW5nCkBAIC0wLDAgKzEgQEAKK3IB/wpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MjU5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2VfbWFwcyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2VfbWFwcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzBhNGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9tYXBzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2Vfb25lb2ZfaW1wbGVtZW50ZWQgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlX29uZW9mX2ltcGxlbWVudGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NGNhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlX29uZW9mX2ltcGxlbWVudGVkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2VfcHJvdG8zIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9wcm90bzMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2NDZhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2VfcHJvdG8zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZSBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTI4ZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fcGFja2VkX2ZpZWxkc19tZXNzYWdlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvbWFwX3Rlc3RfZGF0YS50eHQgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL21hcF90ZXN0X2RhdGEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjcyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL21hcF90ZXN0X2RhdGEudHh0CkBAIC0wLDAgKzEsMTQwIEBACittYXBfaW50MzJfaW50MzIgeworICBrZXk6IDAKKyAgdmFsdWU6IDAKK30KK21hcF9pbnQzMl9pbnQzMiB7CisgIGtleTogMQorICB2YWx1ZTogMQorfQorbWFwX2ludDY0X2ludDY0IHsKKyAga2V5OiAwCisgIHZhbHVlOiAwCit9CittYXBfaW50NjRfaW50NjQgeworICBrZXk6IDEKKyAgdmFsdWU6IDEKK30KK21hcF91aW50MzJfdWludDMyIHsKKyAga2V5OiAwCisgIHZhbHVlOiAwCit9CittYXBfdWludDMyX3VpbnQzMiB7CisgIGtleTogMQorICB2YWx1ZTogMQorfQorbWFwX3VpbnQ2NF91aW50NjQgeworICBrZXk6IDAKKyAgdmFsdWU6IDAKK30KK21hcF91aW50NjRfdWludDY0IHsKKyAga2V5OiAxCisgIHZhbHVlOiAxCit9CittYXBfc2ludDMyX3NpbnQzMiB7CisgIGtleTogMAorICB2YWx1ZTogMAorfQorbWFwX3NpbnQzMl9zaW50MzIgeworICBrZXk6IDEKKyAgdmFsdWU6IDEKK30KK21hcF9zaW50NjRfc2ludDY0IHsKKyAga2V5OiAwCisgIHZhbHVlOiAwCit9CittYXBfc2ludDY0X3NpbnQ2NCB7CisgIGtleTogMQorICB2YWx1ZTogMQorfQorbWFwX2ZpeGVkMzJfZml4ZWQzMiB7CisgIGtleTogMAorICB2YWx1ZTogMAorfQorbWFwX2ZpeGVkMzJfZml4ZWQzMiB7CisgIGtleTogMQorICB2YWx1ZTogMQorfQorbWFwX2ZpeGVkNjRfZml4ZWQ2NCB7CisgIGtleTogMAorICB2YWx1ZTogMAorfQorbWFwX2ZpeGVkNjRfZml4ZWQ2NCB7CisgIGtleTogMQorICB2YWx1ZTogMQorfQorbWFwX3NmaXhlZDMyX3NmaXhlZDMyIHsKKyAga2V5OiAwCisgIHZhbHVlOiAwCit9CittYXBfc2ZpeGVkMzJfc2ZpeGVkMzIgeworICBrZXk6IDEKKyAgdmFsdWU6IDEKK30KK21hcF9zZml4ZWQ2NF9zZml4ZWQ2NCB7CisgIGtleTogMAorICB2YWx1ZTogMAorfQorbWFwX3NmaXhlZDY0X3NmaXhlZDY0IHsKKyAga2V5OiAxCisgIHZhbHVlOiAxCit9CittYXBfaW50MzJfZmxvYXQgeworICBrZXk6IDAKKyAgdmFsdWU6IDAKK30KK21hcF9pbnQzMl9mbG9hdCB7CisgIGtleTogMQorICB2YWx1ZTogMQorfQorbWFwX2ludDMyX2RvdWJsZSB7CisgIGtleTogMAorICB2YWx1ZTogMAorfQorbWFwX2ludDMyX2RvdWJsZSB7CisgIGtleTogMQorICB2YWx1ZTogMQorfQorbWFwX2Jvb2xfYm9vbCB7CisgIGtleTogZmFsc2UKKyAgdmFsdWU6IGZhbHNlCit9CittYXBfYm9vbF9ib29sIHsKKyAga2V5OiB0cnVlCisgIHZhbHVlOiB0cnVlCit9CittYXBfc3RyaW5nX3N0cmluZyB7CisgIGtleTogIjAiCisgIHZhbHVlOiAiMCIKK30KK21hcF9zdHJpbmdfc3RyaW5nIHsKKyAga2V5OiAiMSIKKyAgdmFsdWU6ICIxIgorfQorbWFwX2ludDMyX2J5dGVzIHsKKyAga2V5OiAwCisgIHZhbHVlOiAiMCIKK30KK21hcF9pbnQzMl9ieXRlcyB7CisgIGtleTogMQorICB2YWx1ZTogIjEiCit9CittYXBfaW50MzJfZW51bSB7CisgIGtleTogMAorICB2YWx1ZTogTUFQX0VOVU1fQkFSCit9CittYXBfaW50MzJfZW51bSB7CisgIGtleTogMQorICB2YWx1ZTogTUFQX0VOVU1fQkFaCit9CittYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlIHsKKyAga2V5OiAwCisgIHZhbHVlIHsKKyAgICBjOiAwCisgIH0KK30KK21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UgeworICBrZXk6IDEKKyAgdmFsdWUgeworICAgIGM6IDEKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4NzRiNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQKQEAgLTAsMCArMSwxMzQgQEAKK29wdGlvbmFsX2ludDMyOiAxMDEKK29wdGlvbmFsX2ludDY0OiAxMDIKK29wdGlvbmFsX3VpbnQzMjogMTAzCitvcHRpb25hbF91aW50NjQ6IDEwNAorb3B0aW9uYWxfc2ludDMyOiAxMDUKK29wdGlvbmFsX3NpbnQ2NDogMTA2CitvcHRpb25hbF9maXhlZDMyOiAxMDcKK29wdGlvbmFsX2ZpeGVkNjQ6IDEwOAorb3B0aW9uYWxfc2ZpeGVkMzI6IDEwOQorb3B0aW9uYWxfc2ZpeGVkNjQ6IDExMAorb3B0aW9uYWxfZmxvYXQ6IDExMQorb3B0aW9uYWxfZG91YmxlOiAxMTIKK29wdGlvbmFsX2Jvb2w6IHRydWUKK29wdGlvbmFsX3N0cmluZzogIjExNSIKK29wdGlvbmFsX2J5dGVzOiAiMTE2IgorT3B0aW9uYWxHcm91cCB7CisgIGE6IDExNworfQorb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgeworICBiYjogMTE4Cit9CitvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgeworICBjOiAxMTkKK30KK29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIHsKKyAgZDogMTIwCit9CitvcHRpb25hbF9uZXN0ZWRfZW51bTogQkFaCitvcHRpb25hbF9mb3JlaWduX2VudW06IEZPUkVJR05fQkFaCitvcHRpb25hbF9pbXBvcnRfZW51bTogSU1QT1JUX0JBWgorb3B0aW9uYWxfc3RyaW5nX3BpZWNlOiAiMTI0Igorb3B0aW9uYWxfY29yZDogIjEyNSIKK29wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSB7CisgIGU6IDEyNgorfQorb3B0aW9uYWxfbGF6eV9tZXNzYWdlIHsKKyAgYmI6IDEyNworfQorcmVwZWF0ZWRfaW50MzI6IDIwMQorcmVwZWF0ZWRfaW50MzI6IDMwMQorcmVwZWF0ZWRfaW50NjQ6IDIwMgorcmVwZWF0ZWRfaW50NjQ6IDMwMgorcmVwZWF0ZWRfdWludDMyOiAyMDMKK3JlcGVhdGVkX3VpbnQzMjogMzAzCityZXBlYXRlZF91aW50NjQ6IDIwNAorcmVwZWF0ZWRfdWludDY0OiAzMDQKK3JlcGVhdGVkX3NpbnQzMjogMjA1CityZXBlYXRlZF9zaW50MzI6IDMwNQorcmVwZWF0ZWRfc2ludDY0OiAyMDYKK3JlcGVhdGVkX3NpbnQ2NDogMzA2CityZXBlYXRlZF9maXhlZDMyOiAyMDcKK3JlcGVhdGVkX2ZpeGVkMzI6IDMwNworcmVwZWF0ZWRfZml4ZWQ2NDogMjA4CityZXBlYXRlZF9maXhlZDY0OiAzMDgKK3JlcGVhdGVkX3NmaXhlZDMyOiAyMDkKK3JlcGVhdGVkX3NmaXhlZDMyOiAzMDkKK3JlcGVhdGVkX3NmaXhlZDY0OiAyMTAKK3JlcGVhdGVkX3NmaXhlZDY0OiAzMTAKK3JlcGVhdGVkX2Zsb2F0OiAyMTEKK3JlcGVhdGVkX2Zsb2F0OiAzMTEKK3JlcGVhdGVkX2RvdWJsZTogMjEyCityZXBlYXRlZF9kb3VibGU6IDMxMgorcmVwZWF0ZWRfYm9vbDogdHJ1ZQorcmVwZWF0ZWRfYm9vbDogZmFsc2UKK3JlcGVhdGVkX3N0cmluZzogIjIxNSIKK3JlcGVhdGVkX3N0cmluZzogIjMxNSIKK3JlcGVhdGVkX2J5dGVzOiAiMjE2IgorcmVwZWF0ZWRfYnl0ZXM6ICIzMTYiCitSZXBlYXRlZEdyb3VwIHsKKyAgYTogMjE3Cit9CitSZXBlYXRlZEdyb3VwIHsKKyAgYTogMzE3Cit9CityZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7CisgIGJiOiAyMTgKK30KK3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsKKyAgYmI6IDMxOAorfQorcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIHsKKyAgYzogMjE5Cit9CityZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UgeworICBjOiAzMTkKK30KK3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIHsKKyAgZDogMjIwCit9CityZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSB7CisgIGQ6IDMyMAorfQorcmVwZWF0ZWRfbmVzdGVkX2VudW06IEJBUgorcmVwZWF0ZWRfbmVzdGVkX2VudW06IEJBWgorcmVwZWF0ZWRfZm9yZWlnbl9lbnVtOiBGT1JFSUdOX0JBUgorcmVwZWF0ZWRfZm9yZWlnbl9lbnVtOiBGT1JFSUdOX0JBWgorcmVwZWF0ZWRfaW1wb3J0X2VudW06IElNUE9SVF9CQVIKK3JlcGVhdGVkX2ltcG9ydF9lbnVtOiBJTVBPUlRfQkFaCityZXBlYXRlZF9zdHJpbmdfcGllY2U6ICIyMjQiCityZXBlYXRlZF9zdHJpbmdfcGllY2U6ICIzMjQiCityZXBlYXRlZF9jb3JkOiAiMjI1IgorcmVwZWF0ZWRfY29yZDogIjMyNSIKK3JlcGVhdGVkX2xhenlfbWVzc2FnZSB7CisgIGJiOiAyMjcKK30KK3JlcGVhdGVkX2xhenlfbWVzc2FnZSB7CisgIGJiOiAzMjcKK30KK2RlZmF1bHRfaW50MzI6IDQwMQorZGVmYXVsdF9pbnQ2NDogNDAyCitkZWZhdWx0X3VpbnQzMjogNDAzCitkZWZhdWx0X3VpbnQ2NDogNDA0CitkZWZhdWx0X3NpbnQzMjogNDA1CitkZWZhdWx0X3NpbnQ2NDogNDA2CitkZWZhdWx0X2ZpeGVkMzI6IDQwNworZGVmYXVsdF9maXhlZDY0OiA0MDgKK2RlZmF1bHRfc2ZpeGVkMzI6IDQwOQorZGVmYXVsdF9zZml4ZWQ2NDogNDEwCitkZWZhdWx0X2Zsb2F0OiA0MTEKK2RlZmF1bHRfZG91YmxlOiA0MTIKK2RlZmF1bHRfYm9vbDogZmFsc2UKK2RlZmF1bHRfc3RyaW5nOiAiNDE1IgorZGVmYXVsdF9ieXRlczogIjQxNiIKK2RlZmF1bHRfbmVzdGVkX2VudW06IEZPTworZGVmYXVsdF9mb3JlaWduX2VudW06IEZPUkVJR05fRk9PCitkZWZhdWx0X2ltcG9ydF9lbnVtOiBJTVBPUlRfRk9PCitkZWZhdWx0X3N0cmluZ19waWVjZTogIjQyNCIKK2RlZmF1bHRfY29yZDogIjQyNSIKK29uZW9mX3VpbnQzMjogNjAxCitvbmVvZl9uZXN0ZWRfbWVzc2FnZSB7CisgIGJiOiA2MDIKK30KK29uZW9mX3N0cmluZzogIjYwMyIKK29uZW9mX2J5dGVzOiAiNjA0IgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX29uZW9mX2ltcGxlbWVudGVkLnR4dCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9vbmVvZl9pbXBsZW1lbnRlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzODljOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9vbmVvZl9pbXBsZW1lbnRlZC50eHQKQEAgLTAsMCArMSwxMzIgQEAKK29wdGlvbmFsX2ludDMyOiAxMDEKK29wdGlvbmFsX2ludDY0OiAxMDIKK29wdGlvbmFsX3VpbnQzMjogMTAzCitvcHRpb25hbF91aW50NjQ6IDEwNAorb3B0aW9uYWxfc2ludDMyOiAxMDUKK29wdGlvbmFsX3NpbnQ2NDogMTA2CitvcHRpb25hbF9maXhlZDMyOiAxMDcKK29wdGlvbmFsX2ZpeGVkNjQ6IDEwOAorb3B0aW9uYWxfc2ZpeGVkMzI6IDEwOQorb3B0aW9uYWxfc2ZpeGVkNjQ6IDExMAorb3B0aW9uYWxfZmxvYXQ6IDExMQorb3B0aW9uYWxfZG91YmxlOiAxMTIKK29wdGlvbmFsX2Jvb2w6IHRydWUKK29wdGlvbmFsX3N0cmluZzogIjExNSIKK29wdGlvbmFsX2J5dGVzOiAiMTE2IgorT3B0aW9uYWxHcm91cCB7CisgIGE6IDExNworfQorb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgeworICBiYjogMTE4Cit9CitvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgeworICBjOiAxMTkKK30KK29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIHsKKyAgZDogMTIwCit9CitvcHRpb25hbF9uZXN0ZWRfZW51bTogQkFaCitvcHRpb25hbF9mb3JlaWduX2VudW06IEZPUkVJR05fQkFaCitvcHRpb25hbF9pbXBvcnRfZW51bTogSU1QT1JUX0JBWgorb3B0aW9uYWxfc3RyaW5nX3BpZWNlOiAiMTI0Igorb3B0aW9uYWxfY29yZDogIjEyNSIKK29wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSB7CisgIGU6IDEyNgorfQorb3B0aW9uYWxfbGF6eV9tZXNzYWdlIHsKKyAgYmI6IDEyNworfQorb3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UgeworICBiYjogMTI4Cit9CityZXBlYXRlZF9pbnQzMjogMjAxCityZXBlYXRlZF9pbnQzMjogMzAxCityZXBlYXRlZF9pbnQ2NDogMjAyCityZXBlYXRlZF9pbnQ2NDogMzAyCityZXBlYXRlZF91aW50MzI6IDIwMworcmVwZWF0ZWRfdWludDMyOiAzMDMKK3JlcGVhdGVkX3VpbnQ2NDogMjA0CityZXBlYXRlZF91aW50NjQ6IDMwNAorcmVwZWF0ZWRfc2ludDMyOiAyMDUKK3JlcGVhdGVkX3NpbnQzMjogMzA1CityZXBlYXRlZF9zaW50NjQ6IDIwNgorcmVwZWF0ZWRfc2ludDY0OiAzMDYKK3JlcGVhdGVkX2ZpeGVkMzI6IDIwNworcmVwZWF0ZWRfZml4ZWQzMjogMzA3CityZXBlYXRlZF9maXhlZDY0OiAyMDgKK3JlcGVhdGVkX2ZpeGVkNjQ6IDMwOAorcmVwZWF0ZWRfc2ZpeGVkMzI6IDIwOQorcmVwZWF0ZWRfc2ZpeGVkMzI6IDMwOQorcmVwZWF0ZWRfc2ZpeGVkNjQ6IDIxMAorcmVwZWF0ZWRfc2ZpeGVkNjQ6IDMxMAorcmVwZWF0ZWRfZmxvYXQ6IDIxMQorcmVwZWF0ZWRfZmxvYXQ6IDMxMQorcmVwZWF0ZWRfZG91YmxlOiAyMTIKK3JlcGVhdGVkX2RvdWJsZTogMzEyCityZXBlYXRlZF9ib29sOiB0cnVlCityZXBlYXRlZF9ib29sOiBmYWxzZQorcmVwZWF0ZWRfc3RyaW5nOiAiMjE1IgorcmVwZWF0ZWRfc3RyaW5nOiAiMzE1IgorcmVwZWF0ZWRfYnl0ZXM6ICIyMTYiCityZXBlYXRlZF9ieXRlczogIjMxNiIKK1JlcGVhdGVkR3JvdXAgeworICBhOiAyMTcKK30KK1JlcGVhdGVkR3JvdXAgeworICBhOiAzMTcKK30KK3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsKKyAgYmI6IDIxOAorfQorcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgeworICBiYjogMzE4Cit9CityZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UgeworICBjOiAyMTkKK30KK3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSB7CisgIGM6IDMxOQorfQorcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgeworICBkOiAyMjAKK30KK3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIHsKKyAgZDogMzIwCit9CityZXBlYXRlZF9uZXN0ZWRfZW51bTogQkFSCityZXBlYXRlZF9uZXN0ZWRfZW51bTogQkFaCityZXBlYXRlZF9mb3JlaWduX2VudW06IEZPUkVJR05fQkFSCityZXBlYXRlZF9mb3JlaWduX2VudW06IEZPUkVJR05fQkFaCityZXBlYXRlZF9pbXBvcnRfZW51bTogSU1QT1JUX0JBUgorcmVwZWF0ZWRfaW1wb3J0X2VudW06IElNUE9SVF9CQVoKK3JlcGVhdGVkX3N0cmluZ19waWVjZTogIjIyNCIKK3JlcGVhdGVkX3N0cmluZ19waWVjZTogIjMyNCIKK3JlcGVhdGVkX2NvcmQ6ICIyMjUiCityZXBlYXRlZF9jb3JkOiAiMzI1IgorcmVwZWF0ZWRfbGF6eV9tZXNzYWdlIHsKKyAgYmI6IDIyNworfQorcmVwZWF0ZWRfbGF6eV9tZXNzYWdlIHsKKyAgYmI6IDMyNworfQorZGVmYXVsdF9pbnQzMjogNDAxCitkZWZhdWx0X2ludDY0OiA0MDIKK2RlZmF1bHRfdWludDMyOiA0MDMKK2RlZmF1bHRfdWludDY0OiA0MDQKK2RlZmF1bHRfc2ludDMyOiA0MDUKK2RlZmF1bHRfc2ludDY0OiA0MDYKK2RlZmF1bHRfZml4ZWQzMjogNDA3CitkZWZhdWx0X2ZpeGVkNjQ6IDQwOAorZGVmYXVsdF9zZml4ZWQzMjogNDA5CitkZWZhdWx0X3NmaXhlZDY0OiA0MTAKK2RlZmF1bHRfZmxvYXQ6IDQxMQorZGVmYXVsdF9kb3VibGU6IDQxMgorZGVmYXVsdF9ib29sOiBmYWxzZQorZGVmYXVsdF9zdHJpbmc6ICI0MTUiCitkZWZhdWx0X2J5dGVzOiAiNDE2IgorZGVmYXVsdF9uZXN0ZWRfZW51bTogRk9PCitkZWZhdWx0X2ZvcmVpZ25fZW51bTogRk9SRUlHTl9GT08KK2RlZmF1bHRfaW1wb3J0X2VudW06IElNUE9SVF9GT08KK2RlZmF1bHRfc3RyaW5nX3BpZWNlOiAiNDI0IgorZGVmYXVsdF9jb3JkOiAiNDI1Igorb25lb2ZfYnl0ZXM6ICI2MDQiCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfcG9pbnR5LnR4dCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9wb2ludHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ODAyNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfcG9pbnR5LnR4dApAQCAtMCwwICsxLDEzNyBAQAorb3B0aW9uYWxfaW50MzI6IDEwMQorb3B0aW9uYWxfaW50NjQ6IDEwMgorb3B0aW9uYWxfdWludDMyOiAxMDMKK29wdGlvbmFsX3VpbnQ2NDogMTA0CitvcHRpb25hbF9zaW50MzI6IDEwNQorb3B0aW9uYWxfc2ludDY0OiAxMDYKK29wdGlvbmFsX2ZpeGVkMzI6IDEwNworb3B0aW9uYWxfZml4ZWQ2NDogMTA4CitvcHRpb25hbF9zZml4ZWQzMjogMTA5CitvcHRpb25hbF9zZml4ZWQ2NDogMTEwCitvcHRpb25hbF9mbG9hdDogMTExCitvcHRpb25hbF9kb3VibGU6IDExMgorb3B0aW9uYWxfYm9vbDogdHJ1ZQorb3B0aW9uYWxfc3RyaW5nOiAiMTE1Igorb3B0aW9uYWxfYnl0ZXM6ICIxMTYiCitPcHRpb25hbEdyb3VwIDwKKyAgYTogMTE3Cis+CitvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSA8CisgIGJiOiAxMTgKKz4KK29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSA8CisgIGM6IDExOQorPgorb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgPAorICBkOiAxMjAKKz4KK29wdGlvbmFsX25lc3RlZF9lbnVtOiBCQVoKK29wdGlvbmFsX2ZvcmVpZ25fZW51bTogRk9SRUlHTl9CQVoKK29wdGlvbmFsX2ltcG9ydF9lbnVtOiBJTVBPUlRfQkFaCitvcHRpb25hbF9zdHJpbmdfcGllY2U6ICIxMjQiCitvcHRpb25hbF9jb3JkOiAiMTI1Igorb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlIDwKKyAgZTogMTI2Cis+CitvcHRpb25hbF9sYXp5X21lc3NhZ2UgPAorICBiYjogMTI3Cis+CitvcHRpb25hbF91bnZlcmlmaWVkX2xhenlfbWVzc2FnZSA8CisgIGJiOiAxMjgKKz4KK3JlcGVhdGVkX2ludDMyOiAyMDEKK3JlcGVhdGVkX2ludDMyOiAzMDEKK3JlcGVhdGVkX2ludDY0OiAyMDIKK3JlcGVhdGVkX2ludDY0OiAzMDIKK3JlcGVhdGVkX3VpbnQzMjogMjAzCityZXBlYXRlZF91aW50MzI6IDMwMworcmVwZWF0ZWRfdWludDY0OiAyMDQKK3JlcGVhdGVkX3VpbnQ2NDogMzA0CityZXBlYXRlZF9zaW50MzI6IDIwNQorcmVwZWF0ZWRfc2ludDMyOiAzMDUKK3JlcGVhdGVkX3NpbnQ2NDogMjA2CityZXBlYXRlZF9zaW50NjQ6IDMwNgorcmVwZWF0ZWRfZml4ZWQzMjogMjA3CityZXBlYXRlZF9maXhlZDMyOiAzMDcKK3JlcGVhdGVkX2ZpeGVkNjQ6IDIwOAorcmVwZWF0ZWRfZml4ZWQ2NDogMzA4CityZXBlYXRlZF9zZml4ZWQzMjogMjA5CityZXBlYXRlZF9zZml4ZWQzMjogMzA5CityZXBlYXRlZF9zZml4ZWQ2NDogMjEwCityZXBlYXRlZF9zZml4ZWQ2NDogMzEwCityZXBlYXRlZF9mbG9hdDogMjExCityZXBlYXRlZF9mbG9hdDogMzExCityZXBlYXRlZF9kb3VibGU6IDIxMgorcmVwZWF0ZWRfZG91YmxlOiAzMTIKK3JlcGVhdGVkX2Jvb2w6IHRydWUKK3JlcGVhdGVkX2Jvb2w6IGZhbHNlCityZXBlYXRlZF9zdHJpbmc6ICIyMTUiCityZXBlYXRlZF9zdHJpbmc6ICIzMTUiCityZXBlYXRlZF9ieXRlczogIjIxNiIKK3JlcGVhdGVkX2J5dGVzOiAiMzE2IgorUmVwZWF0ZWRHcm91cCA8CisgIGE6IDIxNworPgorUmVwZWF0ZWRHcm91cCA8CisgIGE6IDMxNworPgorcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgPAorICBiYjogMjE4Cis+CityZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSA8CisgIGJiOiAzMTgKKz4KK3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSA8CisgIGM6IDIxOQorPgorcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIDwKKyAgYzogMzE5Cis+CityZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSA8CisgIGQ6IDIyMAorPgorcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgPAorICBkOiAzMjAKKz4KK3JlcGVhdGVkX25lc3RlZF9lbnVtOiBCQVIKK3JlcGVhdGVkX25lc3RlZF9lbnVtOiBCQVoKK3JlcGVhdGVkX2ZvcmVpZ25fZW51bTogRk9SRUlHTl9CQVIKK3JlcGVhdGVkX2ZvcmVpZ25fZW51bTogRk9SRUlHTl9CQVoKK3JlcGVhdGVkX2ltcG9ydF9lbnVtOiBJTVBPUlRfQkFSCityZXBlYXRlZF9pbXBvcnRfZW51bTogSU1QT1JUX0JBWgorcmVwZWF0ZWRfc3RyaW5nX3BpZWNlOiAiMjI0IgorcmVwZWF0ZWRfc3RyaW5nX3BpZWNlOiAiMzI0IgorcmVwZWF0ZWRfY29yZDogIjIyNSIKK3JlcGVhdGVkX2NvcmQ6ICIzMjUiCityZXBlYXRlZF9sYXp5X21lc3NhZ2UgPAorICBiYjogMjI3Cis+CityZXBlYXRlZF9sYXp5X21lc3NhZ2UgPAorICBiYjogMzI3Cis+CitkZWZhdWx0X2ludDMyOiA0MDEKK2RlZmF1bHRfaW50NjQ6IDQwMgorZGVmYXVsdF91aW50MzI6IDQwMworZGVmYXVsdF91aW50NjQ6IDQwNAorZGVmYXVsdF9zaW50MzI6IDQwNQorZGVmYXVsdF9zaW50NjQ6IDQwNgorZGVmYXVsdF9maXhlZDMyOiA0MDcKK2RlZmF1bHRfZml4ZWQ2NDogNDA4CitkZWZhdWx0X3NmaXhlZDMyOiA0MDkKK2RlZmF1bHRfc2ZpeGVkNjQ6IDQxMAorZGVmYXVsdF9mbG9hdDogNDExCitkZWZhdWx0X2RvdWJsZTogNDEyCitkZWZhdWx0X2Jvb2w6IGZhbHNlCitkZWZhdWx0X3N0cmluZzogIjQxNSIKK2RlZmF1bHRfYnl0ZXM6ICI0MTYiCitkZWZhdWx0X25lc3RlZF9lbnVtOiBGT08KK2RlZmF1bHRfZm9yZWlnbl9lbnVtOiBGT1JFSUdOX0ZPTworZGVmYXVsdF9pbXBvcnRfZW51bTogSU1QT1JUX0ZPTworZGVmYXVsdF9zdHJpbmdfcGllY2U6ICI0MjQiCitkZWZhdWx0X2NvcmQ6ICI0MjUiCitvbmVvZl91aW50MzI6IDYwMQorb25lb2ZfbmVzdGVkX21lc3NhZ2UgPAorICBiYjogNjAyCis+CitvbmVvZl9zdHJpbmc6ICI2MDMiCitvbmVvZl9ieXRlczogIjYwNCIKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9wb2ludHlfb25lb2YudHh0IGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX3BvaW50eV9vbmVvZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkMzM2NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9wb2ludHlfb25lb2YudHh0CkBAIC0wLDAgKzEsMTMyIEBACitvcHRpb25hbF9pbnQzMjogMTAxCitvcHRpb25hbF9pbnQ2NDogMTAyCitvcHRpb25hbF91aW50MzI6IDEwMworb3B0aW9uYWxfdWludDY0OiAxMDQKK29wdGlvbmFsX3NpbnQzMjogMTA1CitvcHRpb25hbF9zaW50NjQ6IDEwNgorb3B0aW9uYWxfZml4ZWQzMjogMTA3CitvcHRpb25hbF9maXhlZDY0OiAxMDgKK29wdGlvbmFsX3NmaXhlZDMyOiAxMDkKK29wdGlvbmFsX3NmaXhlZDY0OiAxMTAKK29wdGlvbmFsX2Zsb2F0OiAxMTEKK29wdGlvbmFsX2RvdWJsZTogMTEyCitvcHRpb25hbF9ib29sOiB0cnVlCitvcHRpb25hbF9zdHJpbmc6ICIxMTUiCitvcHRpb25hbF9ieXRlczogIjExNiIKK09wdGlvbmFsR3JvdXAgPAorICBhOiAxMTcKKz4KK29wdGlvbmFsX25lc3RlZF9tZXNzYWdlIDwKKyAgYmI6IDExOAorPgorb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIDwKKyAgYzogMTE5Cis+CitvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSA8CisgIGQ6IDEyMAorPgorb3B0aW9uYWxfbmVzdGVkX2VudW06IEJBWgorb3B0aW9uYWxfZm9yZWlnbl9lbnVtOiBGT1JFSUdOX0JBWgorb3B0aW9uYWxfaW1wb3J0X2VudW06IElNUE9SVF9CQVoKK29wdGlvbmFsX3N0cmluZ19waWVjZTogIjEyNCIKK29wdGlvbmFsX2NvcmQ6ICIxMjUiCitvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UgPAorICBlOiAxMjYKKz4KK29wdGlvbmFsX2xhenlfbWVzc2FnZSA8CisgIGJiOiAxMjcKKz4KK29wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlIDwKKyAgYmI6IDEyOAorPgorcmVwZWF0ZWRfaW50MzI6IDIwMQorcmVwZWF0ZWRfaW50MzI6IDMwMQorcmVwZWF0ZWRfaW50NjQ6IDIwMgorcmVwZWF0ZWRfaW50NjQ6IDMwMgorcmVwZWF0ZWRfdWludDMyOiAyMDMKK3JlcGVhdGVkX3VpbnQzMjogMzAzCityZXBlYXRlZF91aW50NjQ6IDIwNAorcmVwZWF0ZWRfdWludDY0OiAzMDQKK3JlcGVhdGVkX3NpbnQzMjogMjA1CityZXBlYXRlZF9zaW50MzI6IDMwNQorcmVwZWF0ZWRfc2ludDY0OiAyMDYKK3JlcGVhdGVkX3NpbnQ2NDogMzA2CityZXBlYXRlZF9maXhlZDMyOiAyMDcKK3JlcGVhdGVkX2ZpeGVkMzI6IDMwNworcmVwZWF0ZWRfZml4ZWQ2NDogMjA4CityZXBlYXRlZF9maXhlZDY0OiAzMDgKK3JlcGVhdGVkX3NmaXhlZDMyOiAyMDkKK3JlcGVhdGVkX3NmaXhlZDMyOiAzMDkKK3JlcGVhdGVkX3NmaXhlZDY0OiAyMTAKK3JlcGVhdGVkX3NmaXhlZDY0OiAzMTAKK3JlcGVhdGVkX2Zsb2F0OiAyMTEKK3JlcGVhdGVkX2Zsb2F0OiAzMTEKK3JlcGVhdGVkX2RvdWJsZTogMjEyCityZXBlYXRlZF9kb3VibGU6IDMxMgorcmVwZWF0ZWRfYm9vbDogdHJ1ZQorcmVwZWF0ZWRfYm9vbDogZmFsc2UKK3JlcGVhdGVkX3N0cmluZzogIjIxNSIKK3JlcGVhdGVkX3N0cmluZzogIjMxNSIKK3JlcGVhdGVkX2J5dGVzOiAiMjE2IgorcmVwZWF0ZWRfYnl0ZXM6ICIzMTYiCitSZXBlYXRlZEdyb3VwIDwKKyAgYTogMjE3Cis+CitSZXBlYXRlZEdyb3VwIDwKKyAgYTogMzE3Cis+CityZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSA8CisgIGJiOiAyMTgKKz4KK3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlIDwKKyAgYmI6IDMxOAorPgorcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIDwKKyAgYzogMjE5Cis+CityZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UgPAorICBjOiAzMTkKKz4KK3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIDwKKyAgZDogMjIwCis+CityZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSA8CisgIGQ6IDMyMAorPgorcmVwZWF0ZWRfbmVzdGVkX2VudW06IEJBUgorcmVwZWF0ZWRfbmVzdGVkX2VudW06IEJBWgorcmVwZWF0ZWRfZm9yZWlnbl9lbnVtOiBGT1JFSUdOX0JBUgorcmVwZWF0ZWRfZm9yZWlnbl9lbnVtOiBGT1JFSUdOX0JBWgorcmVwZWF0ZWRfaW1wb3J0X2VudW06IElNUE9SVF9CQVIKK3JlcGVhdGVkX2ltcG9ydF9lbnVtOiBJTVBPUlRfQkFaCityZXBlYXRlZF9zdHJpbmdfcGllY2U6ICIyMjQiCityZXBlYXRlZF9zdHJpbmdfcGllY2U6ICIzMjQiCityZXBlYXRlZF9jb3JkOiAiMjI1IgorcmVwZWF0ZWRfY29yZDogIjMyNSIKK3JlcGVhdGVkX2xhenlfbWVzc2FnZSA8CisgIGJiOiAyMjcKKz4KK3JlcGVhdGVkX2xhenlfbWVzc2FnZSA8CisgIGJiOiAzMjcKKz4KK2RlZmF1bHRfaW50MzI6IDQwMQorZGVmYXVsdF9pbnQ2NDogNDAyCitkZWZhdWx0X3VpbnQzMjogNDAzCitkZWZhdWx0X3VpbnQ2NDogNDA0CitkZWZhdWx0X3NpbnQzMjogNDA1CitkZWZhdWx0X3NpbnQ2NDogNDA2CitkZWZhdWx0X2ZpeGVkMzI6IDQwNworZGVmYXVsdF9maXhlZDY0OiA0MDgKK2RlZmF1bHRfc2ZpeGVkMzI6IDQwOQorZGVmYXVsdF9zZml4ZWQ2NDogNDEwCitkZWZhdWx0X2Zsb2F0OiA0MTEKK2RlZmF1bHRfZG91YmxlOiA0MTIKK2RlZmF1bHRfYm9vbDogZmFsc2UKK2RlZmF1bHRfc3RyaW5nOiAiNDE1IgorZGVmYXVsdF9ieXRlczogIjQxNiIKK2RlZmF1bHRfbmVzdGVkX2VudW06IEZPTworZGVmYXVsdF9mb3JlaWduX2VudW06IEZPUkVJR05fRk9PCitkZWZhdWx0X2ltcG9ydF9lbnVtOiBJTVBPUlRfRk9PCitkZWZhdWx0X3N0cmluZ19waWVjZTogIjQyNCIKK2RlZmF1bHRfY29yZDogIjQyNSIKK29uZW9mX2J5dGVzOiAiNjA0IgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGEudHh0IGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjM2EwM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQKQEAgLTAsMCArMSwxMzcgQEAKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dOiAxMDEKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQ2NF9leHRlbnNpb25dOiAxMDIKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uXTogMTAzCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl06IDEwNAorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb25dOiAxMDUKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uXTogMTA2CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25dOiAxMDcKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbl06IDEwOAorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbl06IDEwOQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbl06IDExMAorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbl06IDExMQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb25dOiAxMTIKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9ib29sX2V4dGVuc2lvbl06IHRydWUKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uXTogIjExNSIKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9ieXRlc19leHRlbnNpb25dOiAiMTE2IgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uXSB7CisgIGE6IDExNworfQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0geworICBiYjogMTE4Cit9CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl0geworICBjOiAxMTkKK30KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgZDogMTIwCit9CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXTogQkFaCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl06IEZPUkVJR05fQkFaCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXTogSU1QT1JUX0JBWgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb25dOiAiMTI0IgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uXTogIjEyNSIKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uXSB7CisgIGU6IDEyNgorfQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgYmI6IDEyNworfQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl0geworICBiYjogMTI4Cit9CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXTogMjAxCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXTogMzAxCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uXTogMjAyCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uXTogMzAyCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl06IDIwMworW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25dOiAzMDMKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uXTogMjA0CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl06IDMwNAorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25dOiAyMDUKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uXTogMzA1CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl06IDIwNgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25dOiAzMDYKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl06IDIwNworW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXTogMzA3CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25dOiAyMDgKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl06IDMwOAorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl06IDIwOQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl06IDMwOQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl06IDIxMAorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl06IDMxMAorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl06IDIxMQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl06IDMxMQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25dOiAyMTIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uXTogMzEyCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfYm9vbF9leHRlbnNpb25dOiB0cnVlCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfYm9vbF9leHRlbnNpb25dOiBmYWxzZQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25dOiAiMjE1IgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25dOiAiMzE1IgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl06ICIyMTYiCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uXTogIjMxNiIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl0geworICBhOiAyMTcKK30KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl0geworICBhOiAzMTcKK30KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgYmI6IDIxOAorfQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0geworICBiYjogMzE4Cit9CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl0geworICBjOiAyMTkKK30KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uXSB7CisgIGM6IDMxOQorfQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0geworICBkOiAyMjAKK30KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgZDogMzIwCit9CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXTogQkFSCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXTogQkFaCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl06IEZPUkVJR05fQkFSCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl06IEZPUkVJR05fQkFaCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXTogSU1QT1JUX0JBUgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl06IElNUE9SVF9CQVoKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXTogIjIyNCIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXTogIjMyNCIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9jb3JkX2V4dGVuc2lvbl06ICIyMjUiCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfY29yZF9leHRlbnNpb25dOiAiMzI1IgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgYmI6IDIyNworfQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgYmI6IDMyNworfQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uXTogNDAxCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9pbnQ2NF9leHRlbnNpb25dOiA0MDIKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3VpbnQzMl9leHRlbnNpb25dOiA0MDMKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3VpbnQ2NF9leHRlbnNpb25dOiA0MDQKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3NpbnQzMl9leHRlbnNpb25dOiA0MDUKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25dOiA0MDYKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uXTogNDA3CitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbl06IDQwOAorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uXTogNDA5CitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25dOiA0MTAKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbl06IDQxMQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbl06IDQxMgorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfYm9vbF9leHRlbnNpb25dOiBmYWxzZQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl06ICI0MTUiCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9ieXRlc19leHRlbnNpb25dOiAiNDE2IgorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXTogRk9PCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uXTogRk9SRUlHTl9GT08KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbl06IElNUE9SVF9GT08KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb25dOiAiNDI0IgorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfY29yZF9leHRlbnNpb25dOiAiNDI1IgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9uZW9mX3VpbnQzMl9leHRlbnNpb25dOiA2MDEKK1twcm90b2J1Zl91bml0dGVzdC5vbmVvZl9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgYmI6IDYwMgorfQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9uZW9mX3N0cmluZ19leHRlbnNpb25dOiAiNjAzIgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9uZW9mX2J5dGVzX2V4dGVuc2lvbl06ICI2MDQiCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YV9wb2ludHkudHh0IGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGFfcG9pbnR5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjMzY2E3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGFfcG9pbnR5LnR4dApAQCAtMCwwICsxLDEzNyBAQAorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl06IDEwMQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbl06IDEwMgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb25dOiAxMDMKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uXTogMTA0CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl06IDEwNQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb25dOiAxMDYKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbl06IDEwNworW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uXTogMTA4CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uXTogMTA5CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uXTogMTEwCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uXTogMTExCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbl06IDExMgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uXTogdHJ1ZQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25dOiAiMTE1IgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl06ICIxMTYiCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxncm91cF9leHRlbnNpb25dIDwKKyAgYTogMTE3Cis+CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXSA8CisgIGJiOiAxMTgKKz4KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uXSA8CisgIGM6IDExOQorPgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0gPAorICBkOiAxMjAKKz4KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25dOiBCQVoKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uXTogRk9SRUlHTl9CQVoKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb25dOiBJTVBPUlRfQkFaCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl06ICIxMjQiCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfY29yZF9leHRlbnNpb25dOiAiMTI1IgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25dIDwKKyAgZTogMTI2Cis+CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl0gPAorICBiYjogMTI3Cis+CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uXSA8CisgIGJiOiAxMjgKKz4KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dOiAyMDEKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dOiAzMDEKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25dOiAyMDIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25dOiAzMDIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uXTogMjAzCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl06IDMwMworW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25dOiAyMDQKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uXTogMzA0CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl06IDIwNQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25dOiAzMDUKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uXTogMjA2CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl06IDMwNgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXTogMjA3CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25dOiAzMDcKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl06IDIwOAorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uXTogMzA4CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uXTogMjA5CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uXTogMzA5CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uXTogMjEwCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uXTogMzEwCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uXTogMjExCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uXTogMzExCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl06IDIxMgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25dOiAzMTIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9ib29sX2V4dGVuc2lvbl06IHRydWUKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9ib29sX2V4dGVuc2lvbl06IGZhbHNlCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl06ICIyMTUiCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl06ICIzMTUiCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uXTogIjIxNiIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9ieXRlc19leHRlbnNpb25dOiAiMzE2IgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uXSA8CisgIGE6IDIxNworPgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uXSA8CisgIGE6IDMxNworPgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0gPAorICBiYjogMjE4Cis+CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXSA8CisgIGJiOiAzMTgKKz4KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uXSA8CisgIGM6IDIxOQorPgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25dIDwKKyAgYzogMzE5Cis+CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uXSA8CisgIGQ6IDIyMAorPgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0gPAorICBkOiAzMjAKKz4KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25dOiBCQVIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25dOiBCQVoKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uXTogRk9SRUlHTl9CQVIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uXTogRk9SRUlHTl9CQVoKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25dOiBJTVBPUlRfQkFSCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXTogSU1QT1JUX0JBWgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb25dOiAiMjI0IgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb25dOiAiMzI0IgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uXTogIjIyNSIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9jb3JkX2V4dGVuc2lvbl06ICIzMjUiCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl0gPAorICBiYjogMjI3Cis+CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl0gPAorICBiYjogMzI3Cis+CitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9pbnQzMl9leHRlbnNpb25dOiA0MDEKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ludDY0X2V4dGVuc2lvbl06IDQwMgorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl06IDQwMworW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfdWludDY0X2V4dGVuc2lvbl06IDQwNAorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbl06IDQwNQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbl06IDQwNgorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb25dOiA0MDcKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uXTogNDA4CitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb25dOiA0MDkKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbl06IDQxMAorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uXTogNDExCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uXTogNDEyCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9ib29sX2V4dGVuc2lvbl06IGZhbHNlCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uXTogIjQxNSIKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2J5dGVzX2V4dGVuc2lvbl06ICI0MTYiCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb25dOiBGT08KK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb25dOiBGT1JFSUdOX0ZPTworW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXTogSU1QT1JUX0ZPTworW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl06ICI0MjQiCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9jb3JkX2V4dGVuc2lvbl06ICI0MjUiCitbcHJvdG9idWZfdW5pdHRlc3Qub25lb2ZfdWludDMyX2V4dGVuc2lvbl06IDYwMQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0gPAorICBiYjogNjAyCis+CitbcHJvdG9idWZfdW5pdHRlc3Qub25lb2Zfc3RyaW5nX2V4dGVuc2lvbl06ICI2MDMiCitbcHJvdG9idWZfdW5pdHRlc3Qub25lb2ZfYnl0ZXNfZXh0ZW5zaW9uXTogIjYwNCIKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2Mjg4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCkBAIC0wLDAgKzEsMjE1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gZW11bGF0ZXMgZ29vZ2xlMy9maWxlL2Jhc2UvZmlsZS5jYworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOICAvLyB5ZWFoLCByaWdodAorI2luY2x1ZGUgPHdpbmRvd3MuaD4gICAgICAgICAvLyBGaW5kKkZpbGUoKS4gIDooCisvLyAjaW5jbHVkZSA8ZGlyZWN0Lmg+CisjZWxzZQorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9pb193aW4zMi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworI2lmZGVmIF9XSU4zMgorLy8gV2luZG93cyBkb2Vzbid0IGhhdmUgc3ltYm9saWMgbGlua3MuCisjZGVmaW5lIGxzdGF0IHN0YXQKKy8vIERPIE5PVCBpbmNsdWRlIDxpby5oPiwgaW5zdGVhZCBjcmVhdGUgZnVuY3Rpb25zIGluIGlvX3dpbjMyLntoLGNjfSBhbmQgaW1wb3J0CisvLyB0aGVtIGxpa2Ugd2UgZG8gYmVsb3cuCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjphY2Nlc3M7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbzo6d2luMzI6OmNoZGlyOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjpmb3BlbjsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6bWtkaXI7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbzo6d2luMzI6OnN0YXQ7CisjZW5kaWYKKworYm9vbCBGaWxlOjpFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgcmV0dXJuIGFjY2VzcyhuYW1lLmNfc3RyKCksIEZfT0spID09IDA7Cit9CisKK2Jvb2wgRmlsZTo6UmVhZEZpbGVUb1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3RkOjpzdHJpbmcqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRleHRfbW9kZSkgeworICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgRklMRSogZmlsZSA9IGZvcGVuKG5hbWUuY19zdHIoKSwgdGV4dF9tb2RlID8gInJ0IiA6ICJyYiIpOworICBpZiAoZmlsZSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzaXplX3QgbiA9IGZyZWFkKGJ1ZmZlciwgMSwgc2l6ZW9mKGJ1ZmZlciksIGZpbGUpOworICAgIGlmIChuIDw9IDApIGJyZWFrOworICAgIG91dHB1dC0+YXBwZW5kKGJ1ZmZlciwgbik7CisgIH0KKworICBpbnQgZXJyb3IgPSBmZXJyb3IoZmlsZSk7CisgIGlmIChmY2xvc2UoZmlsZSkgIT0gMCkgcmV0dXJuIGZhbHNlOworICByZXR1cm4gZXJyb3IgPT0gMDsKK30KKwordm9pZCBGaWxlOjpSZWFkRmlsZVRvU3RyaW5nT3JEaWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6c3RyaW5nKiBvdXRwdXQpIHsKKyAgR09PR0xFX0NIRUNLKFJlYWRGaWxlVG9TdHJpbmcobmFtZSwgb3V0cHV0KSkgPDwgIkNvdWxkIG5vdCByZWFkOiAiIDw8IG5hbWU7Cit9CisKK2Jvb2wgRmlsZTo6V3JpdGVTdHJpbmdUb0ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICBGSUxFKiBmaWxlID0gZm9wZW4obmFtZS5jX3N0cigpLCAid2IiKTsKKyAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJmb3BlbigiIDw8IG5hbWUgPDwgIiwgXCJ3YlwiKTogIiA8PCBzdHJlcnJvcihlcnJubyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGZ3cml0ZShjb250ZW50cy5kYXRhKCksIDEsIGNvbnRlbnRzLnNpemUoKSwgZmlsZSkgIT0gY29udGVudHMuc2l6ZSgpKSB7CisgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgImZ3cml0ZSgiIDw8IG5hbWUgPDwgIik6ICIgPDwgc3RyZXJyb3IoZXJybm8pOworICAgIGZjbG9zZShmaWxlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoZmNsb3NlKGZpbGUpICE9IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRmlsZTo6V3JpdGVTdHJpbmdUb0ZpbGVPckRpZShjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgRklMRSogZmlsZSA9IGZvcGVuKG5hbWUuY19zdHIoKSwgIndiIik7CisgIEdPT0dMRV9DSEVDSyhmaWxlICE9IE5VTEwpCisgICAgICA8PCAiZm9wZW4oIiA8PCBuYW1lIDw8ICIsIFwid2JcIik6ICIgPDwgc3RyZXJyb3IoZXJybm8pOworICBHT09HTEVfQ0hFQ0tfRVEoZndyaXRlKGNvbnRlbnRzLmRhdGEoKSwgMSwgY29udGVudHMuc2l6ZSgpLCBmaWxlKSwKKyAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLnNpemUoKSkKKyAgICAgIDw8ICJmd3JpdGUoIiA8PCBuYW1lIDw8ICIpOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKKyAgR09PR0xFX0NIRUNLKGZjbG9zZShmaWxlKSA9PSAwKQorICAgICAgPDwgImZjbG9zZSgiIDw8IG5hbWUgPDwgIik6ICIgPDwgc3RyZXJyb3IoZXJybm8pOworfQorCitib29sIEZpbGU6OkNyZWF0ZURpcihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50IG1vZGUpIHsKKyAgaWYgKCFuYW1lLmVtcHR5KCkpIHsKKyAgICBHT09HTEVfQ0hFQ0tfT0sobmFtZVtuYW1lLnNpemUoKSAtIDFdICE9ICcuJyk7CisgIH0KKyAgcmV0dXJuIG1rZGlyKG5hbWUuY19zdHIoKSwgbW9kZSkgPT0gMDsKK30KKworYm9vbCBGaWxlOjpSZWN1cnNpdmVseUNyZWF0ZURpcihjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgaW50IG1vZGUpIHsKKyAgaWYgKENyZWF0ZURpcihwYXRoLCBtb2RlKSkgcmV0dXJuIHRydWU7CisKKyAgaWYgKEV4aXN0cyhwYXRoKSkgcmV0dXJuIGZhbHNlOworCisgIC8vIFRyeSBjcmVhdGluZyB0aGUgcGFyZW50LgorICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHNsYXNocG9zID0gcGF0aC5maW5kX2xhc3Rfb2YoJy8nKTsKKyAgaWYgKHNsYXNocG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgLy8gTm8gcGFyZW50IGdpdmVuLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiBSZWN1cnNpdmVseUNyZWF0ZURpcihwYXRoLnN1YnN0cigwLCBzbGFzaHBvcyksIG1vZGUpICYmCisgICAgICAgICBDcmVhdGVEaXIocGF0aCwgbW9kZSk7Cit9CisKK3ZvaWQgRmlsZTo6RGVsZXRlUmVjdXJzaXZlbHkoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHZvaWQqIGR1bW15MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZHVtbXkyKSB7CisgIGlmIChuYW1lLmVtcHR5KCkpIHJldHVybjsKKworICAvLyBXZSBkb24ndCBjYXJlIHRvbyBtdWNoIGFib3V0IGVycm9yIGNoZWNraW5nIGhlcmUgc2luY2UgdGhpcyBpcyBvbmx5IHVzZWQKKyAgLy8gaW4gdGVzdHMgdG8gZGVsZXRlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyB0aGF0IGFyZSB1bmRlciAvdG1wIGFueXdheS4KKworI2lmZGVmIF9NU0NfVkVSCisgIC8vIFRoaXMgaW50ZXJmYWNlIGlzIHNvIHdlaXJkLgorICBXSU4zMl9GSU5EX0RBVEFBIGZpbmRfZGF0YTsKKyAgSEFORExFIGZpbmRfaGFuZGxlID0gRmluZEZpcnN0RmlsZUEoKG5hbWUgKyAiLyoiKS5jX3N0cigpLCAmZmluZF9kYXRhKTsKKyAgaWYgKGZpbmRfaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgLy8gSnVzdCBkZWxldGUgaXQsIHdoYXRldmVyIGl0IGlzLgorICAgIERlbGV0ZUZpbGVBKG5hbWUuY19zdHIoKSk7CisgICAgUmVtb3ZlRGlyZWN0b3J5QShuYW1lLmNfc3RyKCkpOworICAgIHJldHVybjsKKyAgfQorCisgIGRvIHsKKyAgICBzdGQ6OnN0cmluZyBlbnRyeV9uYW1lID0gZmluZF9kYXRhLmNGaWxlTmFtZTsKKyAgICBpZiAoZW50cnlfbmFtZSAhPSAiLiIgJiYgZW50cnlfbmFtZSAhPSAiLi4iKSB7CisgICAgICBzdGQ6OnN0cmluZyBwYXRoID0gbmFtZSArICIvIiArIGVudHJ5X25hbWU7CisgICAgICBpZiAoZmluZF9kYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpIHsKKyAgICAgICAgRGVsZXRlUmVjdXJzaXZlbHkocGF0aCwgTlVMTCwgTlVMTCk7CisgICAgICAgIFJlbW92ZURpcmVjdG9yeUEocGF0aC5jX3N0cigpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERlbGV0ZUZpbGVBKHBhdGguY19zdHIoKSk7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlKEZpbmROZXh0RmlsZUEoZmluZF9oYW5kbGUsICZmaW5kX2RhdGEpKTsKKyAgRmluZENsb3NlKGZpbmRfaGFuZGxlKTsKKworICBSZW1vdmVEaXJlY3RvcnlBKG5hbWUuY19zdHIoKSk7CisjZWxzZQorICAvLyBVc2Ugb3BlbmRpcigpISAgWWF5IQorICAvLyBsc3RhdCA9IERvbid0IGZvbGxvdyBzeW1ib2xpYyBsaW5rcy4KKyAgc3RydWN0IHN0YXQgc3RhdHM7CisgIGlmIChsc3RhdChuYW1lLmNfc3RyKCksICZzdGF0cykgIT0gMCkgcmV0dXJuOworCisgIGlmIChTX0lTRElSKHN0YXRzLnN0X21vZGUpKSB7CisgICAgRElSKiBkaXIgPSBvcGVuZGlyKG5hbWUuY19zdHIoKSk7CisgICAgaWYgKGRpciAhPSBOVUxMKSB7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdHJ1Y3QgZGlyZW50KiBlbnRyeSA9IHJlYWRkaXIoZGlyKTsKKyAgICAgICAgaWYgKGVudHJ5ID09IE5VTEwpIGJyZWFrOworICAgICAgICBzdGQ6OnN0cmluZyBlbnRyeV9uYW1lID0gZW50cnktPmRfbmFtZTsKKyAgICAgICAgaWYgKGVudHJ5X25hbWUgIT0gIi4iICYmIGVudHJ5X25hbWUgIT0gIi4uIikgeworICAgICAgICAgIERlbGV0ZVJlY3Vyc2l2ZWx5KG5hbWUgKyAiLyIgKyBlbnRyeV9uYW1lLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGNsb3NlZGlyKGRpcik7CisgICAgcm1kaXIobmFtZS5jX3N0cigpKTsKKworICB9IGVsc2UgaWYgKFNfSVNSRUcoc3RhdHMuc3RfbW9kZSkpIHsKKyAgICByZW1vdmUobmFtZS5jX3N0cigpKTsKKyAgfQorI2VuZGlmCit9CisKK2Jvb2wgRmlsZTo6Q2hhbmdlV29ya2luZ0RpcmVjdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgbmV3X3dvcmtpbmdfZGlyZWN0b3J5KSB7CisgIHJldHVybiBjaGRpcihuZXdfd29ya2luZ19kaXJlY3RvcnkuY19zdHIoKSkgPT0gMDsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMThmNjg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaApAQCAtMCwwICsxLDEwNyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vIGVtdWxhdGVzIGdvb2dsZTMvZmlsZS9iYXNlL2ZpbGUuaAorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9URVNUSU5HX0ZJTEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9URVNUSU5HX0ZJTEVfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY29uc3QgaW50IERFRkFVTFRfRklMRV9NT0RFID0gMDc3NzsKKworLy8gUHJvdG9jb2wgYnVmZmVyIGNvZGUgb25seSB1c2VzIGEgY291cGxlIHN0YXRpYyBtZXRob2RzIG9mIEZpbGUsIGFuZCBvbmx5CisvLyBpbiB0ZXN0cy4KK2NsYXNzIEZpbGUgeworIHB1YmxpYzoKKyAgLy8gQ2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzLgorICBzdGF0aWMgYm9vbCBFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOworCisgIC8vIFJlYWQgYW4gZW50aXJlIGZpbGUgdG8gYSBzdHJpbmcuICBSZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZQorICAvLyBvdGhlcndpc2UuCisgIHN0YXRpYyBib29sIFJlYWRGaWxlVG9TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6c3RyaW5nKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0ZXh0X21vZGUgPSBmYWxzZSk7CisKKyAgLy8gU2FtZSBhcyBhYm92ZSwgYnV0IGNyYXNoIG9uIGZhaWx1cmUuCisgIHN0YXRpYyB2b2lkIFJlYWRGaWxlVG9TdHJpbmdPckRpZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRwdXQpOworCisgIC8vIENyZWF0ZSBhIGZpbGUgYW5kIHdyaXRlIGEgc3RyaW5nIHRvIGl0LgorICBzdGF0aWMgYm9vbCBXcml0ZVN0cmluZ1RvRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgY3Jhc2ggb24gZmFpbHVyZS4KKyAgc3RhdGljIHZvaWQgV3JpdGVTdHJpbmdUb0ZpbGVPckRpZShjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOworCisgIC8vIENyZWF0ZSBhIGRpcmVjdG9yeS4KKyAgc3RhdGljIGJvb2wgQ3JlYXRlRGlyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQgbW9kZSk7CisKKyAgLy8gQ3JlYXRlIGEgZGlyZWN0b3J5IGFuZCBhbGwgcGFyZW50IGRpcmVjdG9yaWVzIGlmIG5lY2Vzc2FyeS4KKyAgc3RhdGljIGJvb2wgUmVjdXJzaXZlbHlDcmVhdGVEaXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGludCBtb2RlKTsKKworICAvLyBJZiAibmFtZSIgaXMgYSBmaWxlLCB3ZSBkZWxldGUgaXQuICBJZiBpdCBpcyBhIGRpcmVjdG9yeSwgd2UKKyAgLy8gY2FsbCBEZWxldGVSZWN1cnNpdmVseSgpIGZvciBlYWNoIGZpbGUgb3IgZGlyZWN0b3J5IChvdGhlciB0aGFuCisgIC8vIGRvdCBhbmQgZG91YmxlLWRvdCkgd2l0aGluIGl0LCBhbmQgdGhlbiBkZWxldGUgdGhlIGRpcmVjdG9yeSBpdHNlbGYuCisgIC8vIFRoZSAiZHVtbXkiIHBhcmFtZXRlcnMgaGF2ZSBhIG1lYW5pbmcgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICAvLyBtZXRob2QgYnV0IHRoZXkgYXJlIG5vdCB1c2VkIGFueXdoZXJlIGluIHByb3RvY29sIGJ1ZmZlcnMuCisgIHN0YXRpYyB2b2lkIERlbGV0ZVJlY3Vyc2l2ZWx5KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCB2b2lkKiBkdW1teTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGR1bW15Mik7CisKKyAgLy8gQ2hhbmdlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIGdpdmVuIGRpcmVjdG9yeS4KKyAgc3RhdGljIGJvb2wgQ2hhbmdlV29ya2luZ0RpcmVjdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgbmV3X3dvcmtpbmdfZGlyZWN0b3J5KTsKKworICBzdGF0aWMgYm9vbCBHZXRDb250ZW50cyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3RkOjpzdHJpbmcqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKmlzX2RlZmF1bHQqLykgeworICAgIHJldHVybiBSZWFkRmlsZVRvU3RyaW5nKG5hbWUsIG91dHB1dCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBHZXRDb250ZW50c0FzVGV4dChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3RkOjpzdHJpbmcqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKmlzX2RlZmF1bHQqLykgeworICAgIHJldHVybiBSZWFkRmlsZVRvU3RyaW5nKG5hbWUsIG91dHB1dCwgdHJ1ZSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBTZXRDb250ZW50cyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qaXNfZGVmYXVsdCovKSB7CisgICAgcmV0dXJuIFdyaXRlU3RyaW5nVG9GaWxlKGNvbnRlbnRzLCBuYW1lKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpbGUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1RFU1RJTkdfRklMRV9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzNDNmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjCkBAIC0wLDAgKzEsMzAyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gZW11bGF0ZXMgZ29vZ2xlMy90ZXN0aW5nL2Jhc2UvcHVibGljL2dvb2dsZXRlc3QuY2MKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2lvX3dpbjMyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgX01TQ19WRVIKKy8vICNpbmNsdWRlIDxkaXJlY3QuaD4KKyNlbHNlCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisjaWZkZWYgX1dJTjMyCisvLyBETyBOT1QgaW5jbHVkZSA8aW8uaD4sIGluc3RlYWQgY3JlYXRlIGZ1bmN0aW9ucyBpbiBpb193aW4zMi57aCxjY30gYW5kIGltcG9ydAorLy8gdGhlbSBsaWtlIHdlIGRvIGJlbG93LgordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjpjbG9zZTsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6ZHVwMjsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6ZHVwOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OndpbjMyOjpta2RpcjsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjp3aW4zMjo6b3BlbjsKKyNlbmRpZgorCisjaWZuZGVmIE9fQklOQVJZCisjaWZkZWYgX09fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZIF9PX0JJTkFSWQorI2Vsc2UKKyNkZWZpbmUgT19CSU5BUlkgMCAgICAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgcGxhdGZvcm0gZG9lc24ndCBuZWVkIGl0LgorI2VuZGlmCisjZW5kaWYKKworc3RkOjpzdHJpbmcgVGVzdFNvdXJjZURpcigpIHsKKyNpZm5kZWYgR09PR0xFX1RISVJEX1BBUlRZX1BST1RPQlVGCisjaWZkZWYgR09PR0xFX1BST1RPQlVGX1RFU1RfU09VUkNFX1BBVEgKKyAgcmV0dXJuIEdPT0dMRV9QUk9UT0JVRl9URVNUX1NPVVJDRV9QQVRIOworI2Vsc2UKKyNpZm5kZWYgX01TQ19WRVIKKyAgLy8gYXV0b21ha2Ugc2V0cyB0aGUgInNyY2RpciIgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgIGNoYXIqIHJlc3VsdCA9IGdldGVudigic3JjZGlyIik7CisgIGlmIChyZXN1bHQgIT0gTlVMTCkgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyNlbmRpZiAgLy8gX01TQ19WRVIKKworICAvLyBMb29rIGZvciB0aGUgInNyYyIgZGlyZWN0b3J5LgorICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiLiI7CisKKyAgLy8gS2VlcCBsb29raW5nIGZ1cnRoZXIgdXAgdGhlIGRpcmVjdG9yeSB0cmVlIHVudGlsIHdlIGZpbmQKKyAgLy8gc3JjLy4uLi9kZXNjcmlwdG9yLmNjLiBJdCBpcyBpbXBvcnRhbnQgdG8gbG9vayBmb3IgYSBwYXJ0aWN1bGFyIGZpbGUsCisgIC8vIGtlZXBpbmcgaW4gbWluZCB0aGF0IHdpdGggQmF6ZWwgYnVpbGRzIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIHVuZGVyCisgIC8vIGJhemVsLWJpbi8gbG9va3Mgc2ltaWxhciB0byB0aGUgbWFpbiBkaXJlY3RvcnkgdHJlZSBpbiB0aGUgR2l0IHJlcG8uCisgIHdoaWxlICghRmlsZTo6RXhpc3RzKHByZWZpeCArICIvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmNjIikpIHsKKyAgICBpZiAoIUZpbGU6OkV4aXN0cyhwcmVmaXgpKSB7CisgICAgICBHT09HTEVfTE9HKEZBVEFMKQorICAgICAgICA8PCAiQ291bGQgbm90IGZpbmQgcHJvdG9idWYgc291cmNlIGNvZGUuICBQbGVhc2UgcnVuIHRlc3RzIGZyb20gIgorICAgICAgICAgICAic29tZXdoZXJlIHdpdGhpbiB0aGUgcHJvdG9idWYgc291cmNlIHBhY2thZ2UuIjsKKyAgICB9CisgICAgcHJlZml4ICs9ICIvLi4iOworICB9CisgIHJldHVybiBwcmVmaXggKyAiL3NyYyI7CisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9URVNUX1NPVVJDRV9QQVRICisjZWxzZQorICByZXR1cm4gInRoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYyI7CisjZW5kaWYgIC8vIEdPT0dMRV9USElSRF9QQVJUWV9QUk9UT0JVRgorfQorCituYW1lc3BhY2UgeworCitzdGQ6OnN0cmluZyBHZXRUZW1wb3JhcnlEaXJlY3RvcnlOYW1lKCkgeworICAvLyBUZXN0cyBydW4gdW5kZXIgQmF6ZWwgInNob3VsZCBub3QiIHVzZSAvdG1wLiBCYXplbCBzZXRzIHRoaXMgZW52aXJvbm1lbnQKKyAgLy8gdmFyaWFibGUgZm9yIHRlc3RzIHRvIHVzZSBpbnN0ZWFkLgorICBjaGFyICpmcm9tX2Vudmlyb25tZW50ID0gZ2V0ZW52KCJURVNUX1RNUERJUiIpOworICBpZiAoZnJvbV9lbnZpcm9ubWVudCAhPSBOVUxMICYmIGZyb21fZW52aXJvbm1lbnRbMF0gIT0gJ1wwJykgeworICAgIHJldHVybiBzdGQ6OnN0cmluZyhmcm9tX2Vudmlyb25tZW50KSArICIvcHJvdG9idWZfdG1wZGlyIjsKKyAgfQorCisgIC8vIHRtcG5hbSgpIGlzIGdlbmVyYWxseSBub3QgY29uc2lkZXJlZCBzYWZlIGJ1dCB3ZSdyZSBvbmx5IHVzaW5nIGl0IGZvcgorICAvLyB0ZXN0aW5nLiAgV2UgY2Fubm90IHVzZSB0bXBmaWxlKCkgb3IgbWtzdGVtcCgpIHNpbmNlIHdlJ3JlIGNyZWF0aW5nIGEKKyAgLy8gZGlyZWN0b3J5LgorICBjaGFyIGJbTF90bXBuYW0gKyAxXTsgICAgIC8vIEhQVVggbXVsdGl0aHJlYWQgcmV0dXJuIDAgaWYgcyBpcyAwCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gdG1wbmFtKGIpOworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNpZmRlZiBfV0lOMzIKKyAgLy8gQXZvaWQgYSB0cmFpbGluZyBkb3QgYnkgY2hhbmdpbmcgaXQgdG8gYW4gdW5kZXJzY29yZS4gT24gV2luMzIgdGhlIG5hbWVzIG9mCisgIC8vIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBjYW4sIGJ1dCBzaG91bGQgbm90LCBlbmQgd2l0aCBkb3QuCisgIC8vCisgIC8vIEluIE1TLURPUyBhbmQgRkFUMTYgZmlsZXN5c3RlbSB0aGUgZmlsZW5hbWVzIHdlcmUgOGRvdDMgc3R5bGUgc28gaXQgZGlkbid0CisgIC8vIG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIG5hbWUgZW5kaW5nIGluIGRvdCB3aXRob3V0IGFuIGV4dGVuc2lvbiwgc28gdGhlIHNoZWxsCisgIC8vIHNpbGVudGx5IGlnbm9yZWQgdHJhaWxpbmcgZG90cy4gVG8gdGhpcyBkYXkgdGhlIFdpbjMyIEFQSSBzdGlsbCBtYWludGFpbnMKKyAgLy8gdGhpcyBiZWhhdmlvciBhbmQgc2lsZW50bHkgaWdub3JlcyB0cmFpbGluZyBkb3RzIGluIHBhdGggYXJndW1lbnRzIG9mCisgIC8vIGZ1bmN0aW9ucyBzdWNoIGFzIENyZWF0ZUZpbGV7QSxXfS4gRXZlbiBQT1NJWCBBUEkgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zCisgIC8vIHNlZW0gdG8gd3JhcCB0aGUgV2luMzIgQVBJIGZ1bmN0aW9ucyAoZS5nLiBDcmVhdGVEaXJlY3RvcnlBKSBhbmQgYmVoYXZlCisgIC8vIHRoaXMgd2F5LgorICAvLyBJdCdzIHBvc3NpYmxlIHRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgYW5kIGNyZWF0ZSBmaWxlcyAvIGRpcmVjdG9yaWVzIHdpdGgKKyAgLy8gdHJhaWxpbmcgZG90cyAodXNpbmcgQ3JlYXRlRmlsZVcgLyBDcmVhdGVEaXJlY3RvcnlXIGFuZCBwcmVmaXhpbmcgdGhlIHBhdGgKKyAgLy8gd2l0aCAiXFw/XCIpIGJ1dCB0aGVzZSB3aWxsIGJlIGRlZ2VuZXJhdGUgaW4gdGhlIHNlbnNlIHRoYXQgeW91IGNhbm5vdAorICAvLyBjaGRpciBpbnRvIHN1Y2ggZGlyZWN0b3JpZXMgKG9yIG5hdmlnYXRlIGludG8gdGhlbSB3aXRoIFdpbmRvd3MgRXhwbG9yZXIpCisgIC8vIG5vciBjYW4geW91IG9wZW4gc3VjaCBmaWxlcyB3aXRoIHNvbWUgcHJvZ3JhbXMgKGUuZy4gTm90ZXBhZCkuCisgIGlmIChyZXN1bHRbcmVzdWx0LnNpemUoKSAtIDFdID09ICcuJykgeworICAgIHJlc3VsdFtyZXN1bHQuc2l6ZSgpIC0gMV0gPSAnXyc7CisgIH0KKyAgLy8gT24gV2luMzIsIHRtcG5hbSgpIHJldHVybnMgYSBmaWxlIHByZWZpeGVkIHdpdGggJ1wnLCBidXQgd2hpY2ggaXMgc3VwcG9zZWQKKyAgLy8gdG8gYmUgdXNlZCBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIFdURj8KKyAgaWYgKEhhc1ByZWZpeFN0cmluZyhyZXN1bHQsICJcXCIpKSB7CisgICAgcmVzdWx0LmVyYXNlKDAsIDEpOworICB9CisgIC8vIFRoZSBXaW4zMiBBUEkgYWNjZXB0cyBmb3J3YXJkIHNsYXNoZXMgYXMgYSBwYXRoIGRlbGltaXRlciBhcyBsb25nIGFzIHRoZQorICAvLyBwYXRoIGRvZXNuJ3QgdXNlIHRoZSAiXFw/XCIgcHJlZml4LgorICAvLyBMZXQncyBhdm9pZCBjb25mdXNpb24gYW5kIHVzZSBvbmx5IGZvcndhcmQgc2xhc2hlcy4KKyAgcmVzdWx0ID0gU3RyaW5nUmVwbGFjZShyZXN1bHQsICJcXCIsICIvIiwgdHJ1ZSk7CisjZW5kaWYgIC8vIF9XSU4zMgorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBDcmVhdGVzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBvbiBkZW1hbmQgYW5kIGRlbGV0ZXMgaXQgd2hlbiB0aGUgcHJvY2VzcworLy8gcXVpdHMuCitjbGFzcyBUZW1wRGlyRGVsZXRlciB7CisgcHVibGljOgorICBUZW1wRGlyRGVsZXRlcigpIHt9CisgIH5UZW1wRGlyRGVsZXRlcigpIHsKKyAgICBpZiAoIW5hbWVfLmVtcHR5KCkpIHsKKyAgICAgIEZpbGU6OkRlbGV0ZVJlY3Vyc2l2ZWx5KG5hbWVfLCBOVUxMLCBOVUxMKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBHZXRUZW1wRGlyKCkgeworICAgIGlmIChuYW1lXy5lbXB0eSgpKSB7CisgICAgICBuYW1lXyA9IEdldFRlbXBvcmFyeURpcmVjdG9yeU5hbWUoKTsKKyAgICAgIEdPT0dMRV9DSEVDSyhta2RpcihuYW1lXy5jX3N0cigpLCAwNzc3KSA9PSAwKSA8PCBzdHJlcnJvcihlcnJubyk7CisKKyAgICAgIC8vIFN0aWNrIGEgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgdGVsbHMgcGVvcGxlIHdoYXQgdGhpcyBpcywgaW4gY2FzZQorICAgICAgLy8gd2UgYWJvcnQgYW5kIGRvbid0IGdldCBhIGNoYW5jZSB0byBkZWxldGUgaXQuCisgICAgICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKCIiLCBuYW1lXyArICIvVEVNUF9ESVJfRk9SX1BST1RPQlVGX1RFU1RTIik7CisgICAgfQorICAgIHJldHVybiBuYW1lXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZV87Cit9OworCitUZW1wRGlyRGVsZXRlciB0ZW1wX2Rpcl9kZWxldGVyXzsKKworfSAgLy8gbmFtZXNwYWNlCisKK3N0ZDo6c3RyaW5nIFRlc3RUZW1wRGlyKCkgeyByZXR1cm4gdGVtcF9kaXJfZGVsZXRlcl8uR2V0VGVtcERpcigpOyB9CisKKy8vIFRPRE8oa2VudG9uKTogIFNoYXJlIGR1cGxpY2F0ZWQgY29kZSBiZWxvdy4gIFRvbyBidXN5L2xhenkgZm9yIG5vdy4KKworc3RhdGljIHN0ZDo6c3RyaW5nIHN0ZG91dF9jYXB0dXJlX2ZpbGVuYW1lXzsKK3N0YXRpYyBzdGQ6OnN0cmluZyBzdGRlcnJfY2FwdHVyZV9maWxlbmFtZV87CitzdGF0aWMgaW50IG9yaWdpbmFsX3N0ZG91dF8gPSAtMTsKK3N0YXRpYyBpbnQgb3JpZ2luYWxfc3RkZXJyXyA9IC0xOworCit2b2lkIENhcHR1cmVUZXN0U3Rkb3V0KCkgeworICBHT09HTEVfQ0hFQ0tfRVEob3JpZ2luYWxfc3Rkb3V0XywgLTEpIDw8ICJBbHJlYWR5IGNhcHR1cmluZy4iOworCisgIHN0ZG91dF9jYXB0dXJlX2ZpbGVuYW1lXyA9IFRlc3RUZW1wRGlyKCkgKyAiL2NhcHR1cmVkX3N0ZG91dCI7CisKKyAgaW50IGZkID0gb3BlbihzdGRvdXRfY2FwdHVyZV9maWxlbmFtZV8uY19zdHIoKSwKKyAgICAgICAgICAgICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX0JJTkFSWSwgMDc3Nyk7CisgIEdPT0dMRV9DSEVDSyhmZCA+PSAwKSA8PCAib3BlbjogIiA8PCBzdHJlcnJvcihlcnJubyk7CisKKyAgb3JpZ2luYWxfc3Rkb3V0XyA9IGR1cCgxKTsKKyAgY2xvc2UoMSk7CisgIGR1cDIoZmQsIDEpOworICBjbG9zZShmZCk7Cit9CisKK3ZvaWQgQ2FwdHVyZVRlc3RTdGRlcnIoKSB7CisgIEdPT0dMRV9DSEVDS19FUShvcmlnaW5hbF9zdGRlcnJfLCAtMSkgPDwgIkFscmVhZHkgY2FwdHVyaW5nLiI7CisKKyAgc3RkZXJyX2NhcHR1cmVfZmlsZW5hbWVfID0gVGVzdFRlbXBEaXIoKSArICIvY2FwdHVyZWRfc3RkZXJyIjsKKworICBpbnQgZmQgPSBvcGVuKHN0ZGVycl9jYXB0dXJlX2ZpbGVuYW1lXy5jX3N0cigpLAorICAgICAgICAgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fQklOQVJZLCAwNzc3KTsKKyAgR09PR0xFX0NIRUNLKGZkID49IDApIDw8ICJvcGVuOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKKworICBvcmlnaW5hbF9zdGRlcnJfID0gZHVwKDIpOworICBjbG9zZSgyKTsKKyAgZHVwMihmZCwgMik7CisgIGNsb3NlKGZkKTsKK30KKworc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRUZXN0U3Rkb3V0KCkgeworICBHT09HTEVfQ0hFQ0tfTkUob3JpZ2luYWxfc3Rkb3V0XywgLTEpIDw8ICJOb3QgY2FwdHVyaW5nLiI7CisKKyAgY2xvc2UoMSk7CisgIGR1cDIob3JpZ2luYWxfc3Rkb3V0XywgMSk7CisgIG9yaWdpbmFsX3N0ZG91dF8gPSAtMTsKKworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIEZpbGU6OlJlYWRGaWxlVG9TdHJpbmdPckRpZShzdGRvdXRfY2FwdHVyZV9maWxlbmFtZV8sICZyZXN1bHQpOworCisgIHJlbW92ZShzdGRvdXRfY2FwdHVyZV9maWxlbmFtZV8uY19zdHIoKSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRUZXN0U3RkZXJyKCkgeworICBHT09HTEVfQ0hFQ0tfTkUob3JpZ2luYWxfc3RkZXJyXywgLTEpIDw8ICJOb3QgY2FwdHVyaW5nLiI7CisKKyAgY2xvc2UoMik7CisgIGR1cDIob3JpZ2luYWxfc3RkZXJyXywgMik7CisgIG9yaWdpbmFsX3N0ZGVycl8gPSAtMTsKKworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIEZpbGU6OlJlYWRGaWxlVG9TdHJpbmdPckRpZShzdGRlcnJfY2FwdHVyZV9maWxlbmFtZV8sICZyZXN1bHQpOworCisgIHJlbW92ZShzdGRlcnJfY2FwdHVyZV9maWxlbmFtZV8uY19zdHIoKSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworU2NvcGVkTWVtb3J5TG9nKiBTY29wZWRNZW1vcnlMb2c6OmFjdGl2ZV9sb2dfID0gTlVMTDsKKworU2NvcGVkTWVtb3J5TG9nOjpTY29wZWRNZW1vcnlMb2coKSB7CisgIEdPT0dMRV9DSEVDSyhhY3RpdmVfbG9nXyA9PSBOVUxMKTsKKyAgYWN0aXZlX2xvZ18gPSB0aGlzOworICBvbGRfaGFuZGxlcl8gPSBTZXRMb2dIYW5kbGVyKCZIYW5kbGVMb2cpOworfQorCitTY29wZWRNZW1vcnlMb2c6On5TY29wZWRNZW1vcnlMb2coKSB7CisgIFNldExvZ0hhbmRsZXIob2xkX2hhbmRsZXJfKTsKKyAgYWN0aXZlX2xvZ18gPSBOVUxMOworfQorCitjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIFNjb3BlZE1lbW9yeUxvZzo6R2V0TWVzc2FnZXMoTG9nTGV2ZWwgbGV2ZWwpIHsKKyAgR09PR0xFX0NIRUNLKGxldmVsID09IEVSUk9SIHx8CisgICAgICAgICAgICAgICBsZXZlbCA9PSBXQVJOSU5HKTsKKyAgcmV0dXJuIG1lc3NhZ2VzX1tsZXZlbF07Cit9CisKK3ZvaWQgU2NvcGVkTWVtb3J5TG9nOjpIYW5kbGVMb2coTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgR09PR0xFX0NIRUNLKGFjdGl2ZV9sb2dfICE9IE5VTEwpOworICBpZiAobGV2ZWwgPT0gRVJST1IgfHwgbGV2ZWwgPT0gV0FSTklORykgeworICAgIGFjdGl2ZV9sb2dfLT5tZXNzYWdlc19bbGV2ZWxdLnB1c2hfYmFjayhtZXNzYWdlKTsKKyAgfQorfQorCituYW1lc3BhY2UgeworCisvLyBGb3JjZSBzaHV0ZG93biBhdCBwcm9jZXNzIGV4aXQgc28gdGhhdCB3ZSBjYW4gdGVzdCBmb3IgbWVtb3J5IGxlYWtzLiAgVG8KKy8vIGFjdHVhbGx5IGNoZWNrIGZvciBsZWFrcywgSSBzdWdnZXN0IHVzaW5nIHRoZSBoZWFwIGNoZWNrZXIgaW5jbHVkZWQgd2l0aAorLy8gZ29vZ2xlLXBlcmZ0b29scy4gIFNldCBpdCB0byAiZHJhY29uaWFuIiBtb2RlIHRvIGVuc3VyZSB0aGF0IGV2ZXJ5IGxhc3QKKy8vIGNhbGwgdG8gbWFsbG9jKCkgaGFzIGEgY29ycmVzcG9uZGluZyBmcmVlKCkuCitzdHJ1Y3QgRm9yY2VTaHV0ZG93biB7CisgIH5Gb3JjZVNodXRkb3duKCkgeworICAgIFNodXRkb3duUHJvdG9idWZMaWJyYXJ5KCk7CisgICAgLy8gVGVzdCB0byBzaHV0ZG93biB0aGUgbGlicmFyeSB0d2ljZSwgd2hpY2ggc2hvdWxkIHN1Y2NlZWQuCisgICAgU2h1dGRvd25Qcm90b2J1ZkxpYnJhcnkoKTsKKyAgfQorfSBmb3JjZV9zaHV0ZG93bjsKKworfSAgLy8gbmFtZXNwYWNlCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwYzY5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmgKQEAgLTAsMCArMSwxMDQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyBlbXVsYXRlcyBnb29nbGUzL3Rlc3RpbmcvYmFzZS9wdWJsaWMvZ29vZ2xldGVzdC5oCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0dPT0dMRVRFU1RfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9HT09HTEVURVNUX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorLy8gRGlzYWJsZSBkZWF0aCB0ZXN0cyBpZiB3ZSB1c2UgZXhjZXB0aW9ucyBpbiBDSEVDSygpLgorI2lmICFQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUyAmJiBkZWZpbmVkKEdURVNUX0hBU19ERUFUSF9URVNUKSAmJiBcCisgICAgIUdURVNUX09TX1dJTkRPV1MKKyNkZWZpbmUgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKyNlbmRpZgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vIFdoZW4gcnVubmluZyB1bml0dGVzdHMsIGdldCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBjb2RlLgorc3RkOjpzdHJpbmcgVGVzdFNvdXJjZURpcigpOworCisvLyBXaGVuIHJ1bm5pbmcgdW5pdHRlc3RzLCBnZXQgYSBkaXJlY3Rvcnkgd2hlcmUgdGVtcG9yYXJ5IGZpbGVzIG1heSBiZQorLy8gcGxhY2VkLgorc3RkOjpzdHJpbmcgVGVzdFRlbXBEaXIoKTsKKworLy8gQ2FwdHVyZSBhbGwgdGV4dCB3cml0dGVuIHRvIHN0ZG91dCBvciBzdGRlcnIuCit2b2lkIENhcHR1cmVUZXN0U3Rkb3V0KCk7Cit2b2lkIENhcHR1cmVUZXN0U3RkZXJyKCk7CisKKy8vIFN0b3AgY2FwdHVyaW5nIHN0ZG91dCBvciBzdGRlcnIgYW5kIHJldHVybiB0aGUgdGV4dCBjYXB0dXJlZC4KK3N0ZDo6c3RyaW5nIEdldENhcHR1cmVkVGVzdFN0ZG91dCgpOworc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRUZXN0U3RkZXJyKCk7CisKKy8vIEZvciB1c2Ugd2l0aCBTY29wZWRNZW1vcnlMb2c6OkdldE1lc3NhZ2VzKCkuICBJbnNpZGUgR29vZ2xlIHRoZSBMb2dMZXZlbAorLy8gY29uc3RhbnRzIGRvbid0IGhhdmUgdGhlIExPR0xFVkVMXyBwcmVmaXgsIHNvIHRoZSBjb2RlIHRoYXQgdXNlZAorLy8gU2NvcGVkTWVtb3J5TG9nIHJlZmVycyB0byBMT0dMRVZFTF9FUlJPUiBhcyBqdXN0IEVSUk9SLgorI3VuZGVmIEVSUk9SICAvLyBkZWZlbmQgYWdhaW5zdCBwcm9taXNjdW91cyB3aW5kb3dzLmgKK3N0YXRpYyBjb25zdCBMb2dMZXZlbCBFUlJPUiA9IExPR0xFVkVMX0VSUk9SOworc3RhdGljIGNvbnN0IExvZ0xldmVsIFdBUk5JTkcgPSBMT0dMRVZFTF9XQVJOSU5HOworCisvLyBSZWNlaXZlcyBjb3BpZXMgb2YgYWxsIExPRyhFUlJPUikgbWVzc2FnZXMgd2hpbGUgaW4gc2NvcGUuICBTYW1wbGUgdXNhZ2U6CisvLyAgIHsKKy8vICAgICBTY29wZWRNZW1vcnlMb2cgbG9nOyAgLy8gY29uc3RydWN0b3IgcmVnaXN0ZXJzIG9iamVjdCBhcyBhIGxvZyBzaW5rCisvLyAgICAgU29tZVJvdXRpbmVUaGF0TWF5TG9nTWVzc2FnZXMoKTsKKy8vICAgICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgd2FybmluZ3MgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworLy8gICB9ICAvLyBkZXN0cnVjdG9yIHVucmVnaXN0ZXJzIG9iamVjdCBhcyBhIGxvZyBzaW5rCisvLyBUaGlzIGlzIGEgZHVtbXkgaW1wbGVtZW50YXRpb24gd2hpY2ggY292ZXJzIG9ubHkgd2hhdCBpcyB1c2VkIGJ5IHByb3RvY29sCisvLyBidWZmZXIgdW5pdCB0ZXN0cy4KK2NsYXNzIFNjb3BlZE1lbW9yeUxvZyB7CisgcHVibGljOgorICBTY29wZWRNZW1vcnlMb2coKTsKKyAgdmlydHVhbCB+U2NvcGVkTWVtb3J5TG9nKCk7CisKKyAgLy8gRmV0Y2hlcyBhbGwgbWVzc2FnZXMgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgbGV2ZWwuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgR2V0TWVzc2FnZXMoTG9nTGV2ZWwgZXJyb3IpOworCisgcHJpdmF0ZToKKyAgc3RkOjptYXA8TG9nTGV2ZWwsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiA+IG1lc3NhZ2VzXzsKKyAgTG9nSGFuZGxlciogb2xkX2hhbmRsZXJfOworCisgIHN0YXRpYyB2b2lkIEhhbmRsZUxvZyhMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOworCisgIHN0YXRpYyBTY29wZWRNZW1vcnlMb2cqIGFjdGl2ZV9sb2dfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTY29wZWRNZW1vcnlMb2cpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0dPT0dMRVRFU1RfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNndW56aXAuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNndW56aXAuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmODE3MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYwpAQCAtMCwwICsxLDg0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBicmlhbm9sc29uQGdvb2dsZS5jb20gKEJyaWFuIE9sc29uKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGVzdCBwcm9ncmFtIHRvIHZlcmlmeSB0aGF0IEd6aXBJbnB1dFN0cmVhbSBpcyBjb21wYXRpYmxlIHdpdGggY29tbWFuZCBsaW5lCisvLyBndW56aXAgb3IgamF2YS51dGlsLnppcC5HemlwSW5wdXRTdHJlYW0KKy8vCisvLyBSZWFkcyBnemlwIHN0cmVhbSBvbiBzdGFuZGFyZCBpbnB1dCBhbmQgd3JpdGVzIGRlY29tcHJlc3NlZCBkYXRhIHRvIHN0YW5kYXJkCisvLyBvdXRwdXQuCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpZm5kZWYgU1RESU5fRklMRU5PCisjZGVmaW5lIFNURElOX0ZJTEVOTyAwCisjZW5kaWYKKyNpZm5kZWYgU1RET1VUX0ZJTEVOTworI2RlZmluZSBTVERPVVRfRklMRU5PIDEKKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpGaWxlSW5wdXRTdHJlYW07Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbzo6R3ppcElucHV0U3RyZWFtOworCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhcioqIGFyZ3YpIHsKKyAgRmlsZUlucHV0U3RyZWFtIGZpbihTVERJTl9GSUxFTk8pOworICBHemlwSW5wdXRTdHJlYW0gaW4oJmZpbik7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBjb25zdCB2b2lkKiBpbnB0cjsKKyAgICBpbnQgaW5sZW47CisgICAgYm9vbCBvazsKKyAgICBvayA9IGluLk5leHQoJmlucHRyLCAmaW5sZW4pOworICAgIGlmICghb2spIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaW5sZW4gPiAwKSB7CisgICAgICBpbnQgZXJyID0gd3JpdGUoU1RET1VUX0ZJTEVOTywgaW5wdHIsIGlubGVuKTsKKyAgICAgIGlmIChlcnIgIT0gaW5sZW4pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3cml0ZSB1bmV4cGVjdGVkbHkgcmV0dXJuZWQgJWQuXG4iLCBlcnIpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNnemlwLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOGQwNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNnemlwLmNjCkBAIC0wLDAgKzEsODcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGJyaWFub2xzb25AZ29vZ2xlLmNvbSAoQnJpYW4gT2xzb24pCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUZXN0IHByb2dyYW0gdG8gdmVyaWZ5IHRoYXQgR3ppcE91dHB1dFN0cmVhbSBpcyBjb21wYXRpYmxlIHdpdGggY29tbWFuZCBsaW5lCisvLyBnemlwIG9yIGphdmEudXRpbC56aXAuR3ppcE91dHB1dFN0cmVhbQorLy8KKy8vIFJlYWRzIGRhdGEgb24gc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlcyBjb21wcmVzc2VkIGd6aXAgc3RyZWFtIHRvIHN0YW5kYXJkCisvLyBvdXRwdXQuCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpZm5kZWYgU1RESU5fRklMRU5PCisjZGVmaW5lIFNURElOX0ZJTEVOTyAwCisjZW5kaWYKKyNpZm5kZWYgU1RET1VUX0ZJTEVOTworI2RlZmluZSBTVERPVVRfRklMRU5PIDEKKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpGaWxlT3V0cHV0U3RyZWFtOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86Okd6aXBPdXRwdXRTdHJlYW07CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiogYXJndikgeworICBGaWxlT3V0cHV0U3RyZWFtIGZvdXQoU1RET1VUX0ZJTEVOTyk7CisgIEd6aXBPdXRwdXRTdHJlYW0gb3V0KCZmb3V0KTsKKyAgaW50IHJlYWRsZW47CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB2b2lkKiBvdXRwdHI7CisgICAgaW50IG91dGxlbjsKKyAgICBib29sIG9rOworICAgIGRvIHsKKyAgICAgIG9rID0gb3V0Lk5leHQoJm91dHB0ciwgJm91dGxlbik7CisgICAgICBpZiAoIW9rKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gd2hpbGUgKG91dGxlbiA8PSAwKTsKKyAgICByZWFkbGVuID0gcmVhZChTVERJTl9GSUxFTk8sIG91dHB0ciwgb3V0bGVuKTsKKyAgICBpZiAocmVhZGxlbiA8PSAwKSB7CisgICAgICBvdXQuQmFja1VwKG91dGxlbik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHJlYWRsZW4gPCBvdXRsZW4pIHsKKyAgICAgIG91dC5CYWNrVXAob3V0bGVuIC0gcmVhZGxlbik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTk4N2QzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5jYwpAQCAtMCwwICsxLDI3NDYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGpzY2hvcnJAZ29vZ2xlLmNvbSAoSm9zZXBoIFNjaG9ycikKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hbnkuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9zdHJ0b2QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXBfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCituYW1lc3BhY2UgeworCitpbmxpbmUgYm9vbCBJc0hleE51bWJlcihjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiAoc3RyLmxlbmd0aCgpID49IDIgJiYgc3RyWzBdID09ICcwJyAmJgorICAgICAgICAgIChzdHJbMV0gPT0gJ3gnIHx8IHN0clsxXSA9PSAnWCcpKTsKK30KKworaW5saW5lIGJvb2wgSXNPY3ROdW1iZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gKHN0ci5sZW5ndGgoKSA+PSAyICYmIHN0clswXSA9PSAnMCcgJiYKKyAgICAgICAgICAoc3RyWzFdID49ICcwJyAmJiBzdHJbMV0gPCAnOCcpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Citjb25zdCBjaGFyIGtEZWJ1Z1N0cmluZ1NpbGVudE1hcmtlcltdID0gIiI7Citjb25zdCBjaGFyIGtEZWJ1Z1N0cmluZ1NpbGVudE1hcmtlckZvckRldGVjdGlvbltdID0gIlx0ICI7CisKKy8vIENvbnRyb2xzIGluc2VydGlvbiBvZiBrRGVidWdTdHJpbmdTaWxlbnRNYXJrZXIuCitQUk9UT0JVRl9FWFBPUlQgc3RkOjphdG9taWM8Ym9vbD4gZW5hYmxlX2RlYnVnX3RleHRfZm9ybWF0X21hcmtlcjsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCitzdGQ6OnN0cmluZyBNZXNzYWdlOjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgZGVidWdfc3RyaW5nOworCisgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgcHJpbnRlci5TZXRFeHBhbmRBbnkodHJ1ZSk7CisgIHByaW50ZXIuU2V0SW5zZXJ0U2lsZW50TWFya2VyKGludGVybmFsOjplbmFibGVfZGVidWdfdGV4dF9mb3JtYXRfbWFya2VyLmxvYWQoCisgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSk7CisKKyAgcHJpbnRlci5QcmludFRvU3RyaW5nKCp0aGlzLCAmZGVidWdfc3RyaW5nKTsKKworICByZXR1cm4gZGVidWdfc3RyaW5nOworfQorCitzdGQ6OnN0cmluZyBNZXNzYWdlOjpTaG9ydERlYnVnU3RyaW5nKCkgY29uc3QgeworICBzdGQ6OnN0cmluZyBkZWJ1Z19zdHJpbmc7CisKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBwcmludGVyLlNldFNpbmdsZUxpbmVNb2RlKHRydWUpOworICBwcmludGVyLlNldEV4cGFuZEFueSh0cnVlKTsKKyAgcHJpbnRlci5TZXRJbnNlcnRTaWxlbnRNYXJrZXIoaW50ZXJuYWw6OmVuYWJsZV9kZWJ1Z190ZXh0X2Zvcm1hdF9tYXJrZXIubG9hZCgKKyAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpKTsKKworICBwcmludGVyLlByaW50VG9TdHJpbmcoKnRoaXMsICZkZWJ1Z19zdHJpbmcpOworICAvLyBTaW5nbGUgbGluZSBtb2RlIGN1cnJlbnRseSBtaWdodCBoYXZlIGFuIGV4dHJhIHNwYWNlIGF0IHRoZSBlbmQuCisgIGlmICghZGVidWdfc3RyaW5nLmVtcHR5KCkgJiYgZGVidWdfc3RyaW5nW2RlYnVnX3N0cmluZy5zaXplKCkgLSAxXSA9PSAnICcpIHsKKyAgICBkZWJ1Z19zdHJpbmcucmVzaXplKGRlYnVnX3N0cmluZy5zaXplKCkgLSAxKTsKKyAgfQorCisgIHJldHVybiBkZWJ1Z19zdHJpbmc7Cit9CisKK3N0ZDo6c3RyaW5nIE1lc3NhZ2U6OlV0ZjhEZWJ1Z1N0cmluZygpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgZGVidWdfc3RyaW5nOworCisgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgcHJpbnRlci5TZXRVc2VVdGY4U3RyaW5nRXNjYXBpbmcodHJ1ZSk7CisgIHByaW50ZXIuU2V0RXhwYW5kQW55KHRydWUpOworICBwcmludGVyLlNldEluc2VydFNpbGVudE1hcmtlcihpbnRlcm5hbDo6ZW5hYmxlX2RlYnVnX3RleHRfZm9ybWF0X21hcmtlci5sb2FkKAorICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpOworCisgIHByaW50ZXIuUHJpbnRUb1N0cmluZygqdGhpcywgJmRlYnVnX3N0cmluZyk7CisKKyAgcmV0dXJuIGRlYnVnX3N0cmluZzsKK30KKwordm9pZCBNZXNzYWdlOjpQcmludERlYnVnU3RyaW5nKCkgY29uc3QgeyBwcmludGYoIiVzIiwgRGVidWdTdHJpbmcoKS5jX3N0cigpKTsgfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIHBhcnNlIGluZm9ybWF0aW9uIHRyZWUgY2xhc3MuCit2b2lkIFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWU6OlJlY29yZExvY2F0aW9uKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIFRleHRGb3JtYXQ6OlBhcnNlTG9jYXRpb25SYW5nZSByYW5nZSkgeworICBsb2NhdGlvbnNfW2ZpZWxkXS5wdXNoX2JhY2socmFuZ2UpOworfQorCitUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlKiBUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlOjpDcmVhdGVOZXN0ZWQoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAvLyBPd25lZCBieSB1cyBpbiB0aGUgbWFwLgorICBhdXRvJiB2ZWMgPSBuZXN0ZWRfW2ZpZWxkXTsKKyAgdmVjLmVtcGxhY2VfYmFjayhuZXcgVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSgpKTsKKyAgcmV0dXJuIHZlYy5iYWNrKCkuZ2V0KCk7Cit9CisKK3ZvaWQgQ2hlY2tGaWVsZEluZGV4KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgeworICBpZiAoZmllbGQgPT0gbnVsbHB0cikgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiBpbmRleCA9PSAtMSkgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiSW5kZXggbXVzdCBiZSBpbiByYW5nZSBvZiByZXBlYXRlZCBmaWVsZCB2YWx1ZXMuICIKKyAgICAgICAgICAgICAgICA8PCAiRmllbGQ6ICIgPDwgZmllbGQtPm5hbWUoKTsKKyAgfSBlbHNlIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgaW5kZXggIT0gLTEpIHsKKyAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkluZGV4IG11c3QgYmUgLTEgZm9yIHNpbmd1bGFyIGZpZWxkcy4iCisgICAgICAgICAgICAgICAgPDwgIkZpZWxkOiAiIDw8IGZpZWxkLT5uYW1lKCk7CisgIH0KK30KKworVGV4dEZvcm1hdDo6UGFyc2VMb2NhdGlvblJhbmdlIFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWU6OkdldExvY2F0aW9uUmFuZ2UoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7CisgIENoZWNrRmllbGRJbmRleChmaWVsZCwgaW5kZXgpOworICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICBpbmRleCA9IDA7CisgIH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxUZXh0Rm9ybWF0OjpQYXJzZUxvY2F0aW9uUmFuZ2U+KiBsb2NhdGlvbnMgPQorICAgICAgRmluZE9yTnVsbChsb2NhdGlvbnNfLCBmaWVsZCk7CisgIGlmIChsb2NhdGlvbnMgPT0gbnVsbHB0ciB8fAorICAgICAgaW5kZXggPj0gc3RhdGljX2Nhc3Q8aW50NjRfdD4obG9jYXRpb25zLT5zaXplKCkpKSB7CisgICAgcmV0dXJuIFRleHRGb3JtYXQ6OlBhcnNlTG9jYXRpb25SYW5nZSgpOworICB9CisKKyAgcmV0dXJuICgqbG9jYXRpb25zKVtpbmRleF07Cit9CisKK1RleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWUqIFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWU6OkdldFRyZWVGb3JOZXN0ZWQoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7CisgIENoZWNrRmllbGRJbmRleChmaWVsZCwgaW5kZXgpOworICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICBpbmRleCA9IDA7CisgIH0KKworICBhdXRvIGl0ID0gbmVzdGVkXy5maW5kKGZpZWxkKTsKKyAgaWYgKGl0ID09IG5lc3RlZF8uZW5kKCkgfHwgaW5kZXggPj0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oaXQtPnNlY29uZC5zaXplKCkpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICByZXR1cm4gaXQtPnNlY29uZFtpbmRleF0uZ2V0KCk7Cit9CisKK25hbWVzcGFjZSB7CisvLyBUaGVzZSBmdW5jdGlvbnMgaW1wbGVtZW50IHRoZSBiZWhhdmlvciBvZiB0aGUgImRlZmF1bHQiIFRleHRGb3JtYXQ6OkZpbmRlciwKKy8vIHRoZXkgYXJlIGRlZmluZWQgYXMgc3RhbmRhbG9uZSB0byBiZSBjYWxsZWQgd2hlbiBmaW5kZXJfIGlzIG51bGxwdHIuCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIERlZmF1bHRGaW5kZXJGaW5kRXh0ZW5zaW9uKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7CisgIHJldHVybiBkZXNjcmlwdG9yLT5maWxlKCktPnBvb2woKS0+RmluZEV4dGVuc2lvbkJ5UHJpbnRhYmxlTmFtZShkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Cit9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvciogRGVmYXVsdEZpbmRlckZpbmRFeHRlbnNpb25CeU51bWJlcigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbnVtYmVyKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5maWxlKCktPnBvb2woKS0+RmluZEV4dGVuc2lvbkJ5TnVtYmVyKGRlc2NyaXB0b3IsIG51bWJlcik7Cit9CisKK2NvbnN0IERlc2NyaXB0b3IqIERlZmF1bHRGaW5kZXJGaW5kQW55VHlwZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgaWYgKHByZWZpeCAhPSBpbnRlcm5hbDo6a1R5cGVHb29nbGVBcGlzQ29tUHJlZml4ICYmCisgICAgICBwcmVmaXggIT0gaW50ZXJuYWw6OmtUeXBlR29vZ2xlUHJvZENvbVByZWZpeCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBtZXNzYWdlLkdldERlc2NyaXB0b3IoKS0+ZmlsZSgpLT5wb29sKCktPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShuYW1lKTsKK30KK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVybmFsIGNsYXNzIGZvciBwYXJzaW5nIGFuIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIGEgUHJvdG9jb2wgTWVzc2FnZS4KKy8vIFRoaXMgY2xhc3MgbWFrZXMgdXNlIG9mIHRoZSBQcm90b2NvbCBNZXNzYWdlIGNvbXBpbGVyJ3MgdG9rZW5pemVyIGZvdW5kCisvLyBpbiAvL25ldC9wcm90bzIvaW8vcHVibGljL3Rva2VuaXplci5oLiBOb3RlIHRoYXQgY2xhc3MncyBQYXJzZQorLy8gbWV0aG9kIGlzICpub3QqIHRocmVhZC1zYWZlIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGluIGEgc2luZ2xlIHRocmVhZCBhdAorLy8gYSB0aW1lLgorCisvLyBNYWtlcyBjb2RlIHNsaWdodGx5IG1vcmUgcmVhZGFibGUuICBUaGUgbWVhbmluZyBvZiAiRE8oZm9vKSIgaXMKKy8vICJFeGVjdXRlIGZvbyBhbmQgZmFpbCBpZiBpdCBmYWlscy4iLCB3aGVyZSBmYWlsdXJlIGlzIGluZGljYXRlZCBieQorLy8gcmV0dXJuaW5nIGZhbHNlLiBCb3Jyb3dlZCBmcm9tIHBhcnNlci5jYyAoVGhhbmtzIEtlbnRvbiEpLgorI2RlZmluZSBETyhTVEFURU1FTlQpIFwKKyAgaWYgKFNUQVRFTUVOVCkgeyAgICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgXAorICAgIHJldHVybiBmYWxzZTsgICAgIFwKKyAgfQorCitjbGFzcyBUZXh0Rm9ybWF0OjpQYXJzZXI6OlBhcnNlckltcGwgeworIHB1YmxpYzoKKyAgLy8gRGV0ZXJtaW5lcyBpZiByZXBlYXRlZCB2YWx1ZXMgZm9yIG5vbi1yZXBlYXRlZCBmaWVsZHMgYW5kCisgIC8vIG9uZW9mcyBhcmUgcGVybWl0dGVkLCBlLmcuLCB0aGUgc3RyaW5nICJmb286IDEgZm9vOiAyIiBmb3IgYQorICAvLyByZXF1aXJlZC9vcHRpb25hbCBmaWVsZCBuYW1lZCAiZm9vIiwgb3IgImJhejogMSBiYXI6IDIiCisgIC8vIHdoZXJlICJiYXoiIGFuZCAiYmFyIiBhcmUgbWVtYmVycyBvZiB0aGUgc2FtZSBvbmVvZi4KKyAgZW51bSBTaW5ndWxhck92ZXJ3cml0ZVBvbGljeSB7CisgICAgQUxMT1dfU0lOR1VMQVJfT1ZFUldSSVRFUyA9IDAsICAgLy8gdGhlIGxhc3QgdmFsdWUgaXMgcmV0YWluZWQKKyAgICBGT1JCSURfU0lOR1VMQVJfT1ZFUldSSVRFUyA9IDEsICAvLyBhbiBlcnJvciBpcyBpc3N1ZWQKKyAgfTsKKworICBQYXJzZXJJbXBsKGNvbnN0IERlc2NyaXB0b3IqIHJvb3RfbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dF9zdHJlYW0sCisgICAgICAgICAgICAgaW86OkVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IsCisgICAgICAgICAgICAgY29uc3QgVGV4dEZvcm1hdDo6RmluZGVyKiBmaW5kZXIsIFBhcnNlSW5mb1RyZWUqIHBhcnNlX2luZm9fdHJlZSwKKyAgICAgICAgICAgICBTaW5ndWxhck92ZXJ3cml0ZVBvbGljeSBzaW5ndWxhcl9vdmVyd3JpdGVfcG9saWN5LAorICAgICAgICAgICAgIGJvb2wgYWxsb3dfY2FzZV9pbnNlbnNpdGl2ZV9maWVsZCwgYm9vbCBhbGxvd191bmtub3duX2ZpZWxkLAorICAgICAgICAgICAgIGJvb2wgYWxsb3dfdW5rbm93bl9leHRlbnNpb24sIGJvb2wgYWxsb3dfdW5rbm93bl9lbnVtLAorICAgICAgICAgICAgIGJvb2wgYWxsb3dfZmllbGRfbnVtYmVyLCBib29sIGFsbG93X3JlbGF4ZWRfd2hpdGVzcGFjZSwKKyAgICAgICAgICAgICBib29sIGFsbG93X3BhcnRpYWwsIGludCByZWN1cnNpb25fbGltaXQpCisgICAgICA6IGVycm9yX2NvbGxlY3Rvcl8oZXJyb3JfY29sbGVjdG9yKSwKKyAgICAgICAgZmluZGVyXyhmaW5kZXIpLAorICAgICAgICBwYXJzZV9pbmZvX3RyZWVfKHBhcnNlX2luZm9fdHJlZSksCisgICAgICAgIHRva2VuaXplcl9lcnJvcl9jb2xsZWN0b3JfKHRoaXMpLAorICAgICAgICB0b2tlbml6ZXJfKGlucHV0X3N0cmVhbSwgJnRva2VuaXplcl9lcnJvcl9jb2xsZWN0b3JfKSwKKyAgICAgICAgcm9vdF9tZXNzYWdlX3R5cGVfKHJvb3RfbWVzc2FnZV90eXBlKSwKKyAgICAgICAgc2luZ3VsYXJfb3ZlcndyaXRlX3BvbGljeV8oc2luZ3VsYXJfb3ZlcndyaXRlX3BvbGljeSksCisgICAgICAgIGFsbG93X2Nhc2VfaW5zZW5zaXRpdmVfZmllbGRfKGFsbG93X2Nhc2VfaW5zZW5zaXRpdmVfZmllbGQpLAorICAgICAgICBhbGxvd191bmtub3duX2ZpZWxkXyhhbGxvd191bmtub3duX2ZpZWxkKSwKKyAgICAgICAgYWxsb3dfdW5rbm93bl9leHRlbnNpb25fKGFsbG93X3Vua25vd25fZXh0ZW5zaW9uKSwKKyAgICAgICAgYWxsb3dfdW5rbm93bl9lbnVtXyhhbGxvd191bmtub3duX2VudW0pLAorICAgICAgICBhbGxvd19maWVsZF9udW1iZXJfKGFsbG93X2ZpZWxkX251bWJlciksCisgICAgICAgIGFsbG93X3BhcnRpYWxfKGFsbG93X3BhcnRpYWwpLAorICAgICAgICBpbml0aWFsX3JlY3Vyc2lvbl9saW1pdF8ocmVjdXJzaW9uX2xpbWl0KSwKKyAgICAgICAgcmVjdXJzaW9uX2xpbWl0XyhyZWN1cnNpb25fbGltaXQpLAorICAgICAgICBoYWRfc2lsZW50X21hcmtlcl8oZmFsc2UpLAorICAgICAgICBoYWRfZXJyb3JzXyhmYWxzZSkgeworICAgIC8vIEZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIHByb3RvMSwgd2UgbmVlZCB0byBhbGxvdyB0aGUgJ2YnIHN1ZmZpeAorICAgIC8vIGZvciBmbG9hdHMuCisgICAgdG9rZW5pemVyXy5zZXRfYWxsb3dfZl9hZnRlcl9mbG9hdCh0cnVlKTsKKworICAgIC8vICcjJyBzdGFydHMgYSBjb21tZW50LgorICAgIHRva2VuaXplcl8uc2V0X2NvbW1lbnRfc3R5bGUoaW86OlRva2VuaXplcjo6U0hfQ09NTUVOVF9TVFlMRSk7CisKKyAgICBpZiAoYWxsb3dfcmVsYXhlZF93aGl0ZXNwYWNlKSB7CisgICAgICB0b2tlbml6ZXJfLnNldF9yZXF1aXJlX3NwYWNlX2FmdGVyX251bWJlcihmYWxzZSk7CisgICAgICB0b2tlbml6ZXJfLnNldF9hbGxvd19tdWx0aWxpbmVfc3RyaW5ncyh0cnVlKTsKKyAgICB9CisKKyAgICAvLyBDb25zdW1lIHRoZSBzdGFydGluZyB0b2tlbi4KKyAgICB0b2tlbml6ZXJfLk5leHQoKTsKKyAgfQorICB+UGFyc2VySW1wbCgpIHt9CisKKyAgLy8gUGFyc2VzIHRoZSBBU0NJSSByZXByZXNlbnRhdGlvbiBzcGVjaWZpZWQgaW4gaW5wdXQgYW5kIHNhdmVzIHRoZQorICAvLyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBvdXRwdXQgcG9pbnRlciAoYSBNZXNzYWdlKS4gUmV0dXJucworICAvLyBmYWxzZSBpZiBhbiBlcnJvciBvY2N1cnMgKGFuIGVycm9yIHdpbGwgYWxzbyBiZSBsb2dnZWQgdG8KKyAgLy8gR09PR0xFX0xPRyhFUlJPUikpLgorICBib29sIFBhcnNlKE1lc3NhZ2UqIG91dHB1dCkgeworICAgIC8vIENvbnN1bWUgZmllbGRzIHVudGlsIHdlIGNhbm5vdCBkbyBzbyBhbnltb3JlLgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0VORCkpIHsKKyAgICAgICAgLy8gRW5zdXJlcyByZWN1cnNpb24gbGltaXQgcHJvcGVybHkgdW53aW5kZWQsIGJ1dCBvbmx5IGZvciBzdWNjZXNzCisgICAgICAgIC8vIGNhc2VzLiBUaGlzIGltcGxpY2l0bHkgYXZvaWRzIHRoZSBjaGVjayB3aGVuIGBQYXJzZWAgcmV0dXJucyBmYWxzZQorICAgICAgICAvLyB2aWEgYERPKC4uLilgLgorICAgICAgICBHT09HTEVfRENIRUNLKGhhZF9lcnJvcnNfIHx8IHJlY3Vyc2lvbl9saW1pdF8gPT0gaW5pdGlhbF9yZWN1cnNpb25fbGltaXRfKQorICAgICAgICAgICAgPDwgIlJlY3Vyc2lvbiBsaW1pdCBhdCBlbmQgb2YgcGFyc2Ugc2hvdWxkIGJlICIKKyAgICAgICAgICAgIDw8IGluaXRpYWxfcmVjdXJzaW9uX2xpbWl0XyA8PCAiLCBidXQgd2FzICIgPDwgcmVjdXJzaW9uX2xpbWl0XworICAgICAgICAgICAgPDwgIi4gRGlmZmVyZW5jZSBvZiAiIDw8IGluaXRpYWxfcmVjdXJzaW9uX2xpbWl0XyAtIHJlY3Vyc2lvbl9saW1pdF8KKyAgICAgICAgICAgIDw8ICIgc3RhY2sgZnJhbWVzIG5vdCBhY2NvdW50ZWQgZm9yIHN0YWNrIHVud2luZC4iOworCisgICAgICAgIHJldHVybiAhaGFkX2Vycm9yc187CisgICAgICB9CisKKyAgICAgIERPKENvbnN1bWVGaWVsZChvdXRwdXQpKTsKKyAgICB9CisgIH0KKworICBib29sIFBhcnNlRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgTWVzc2FnZSogb3V0cHV0KSB7CisgICAgYm9vbCBzdWM7CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBzdWMgPSBDb25zdW1lRmllbGRNZXNzYWdlKG91dHB1dCwgb3V0cHV0LT5HZXRSZWZsZWN0aW9uKCksIGZpZWxkKTsKKyAgICB9IGVsc2UgeworICAgICAgc3VjID0gQ29uc3VtZUZpZWxkVmFsdWUob3V0cHV0LCBvdXRwdXQtPkdldFJlZmxlY3Rpb24oKSwgZmllbGQpOworICAgIH0KKyAgICByZXR1cm4gc3VjICYmIExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9FTkQpOworICB9CisKKyAgdm9pZCBSZXBvcnRFcnJvcihpbnQgbGluZSwgaW50IGNvbCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBoYWRfZXJyb3JzXyA9IHRydWU7CisgICAgaWYgKGVycm9yX2NvbGxlY3Rvcl8gPT0gbnVsbHB0cikgeworICAgICAgaWYgKGxpbmUgPj0gMCkgeworICAgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRXJyb3IgcGFyc2luZyB0ZXh0LWZvcm1hdCAiCisgICAgICAgICAgICAgICAgICAgPDwgcm9vdF9tZXNzYWdlX3R5cGVfLT5mdWxsX25hbWUoKSA8PCAiOiAiIDw8IChsaW5lICsgMSkKKyAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgKGNvbCArIDEpIDw8ICI6ICIgPDwgbWVzc2FnZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJFcnJvciBwYXJzaW5nIHRleHQtZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICA8PCByb290X21lc3NhZ2VfdHlwZV8tPmZ1bGxfbmFtZSgpIDw8ICI6ICIgPDwgbWVzc2FnZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IobGluZSwgY29sLCBtZXNzYWdlKTsKKyAgICB9CisgIH0KKworICB2b2lkIFJlcG9ydFdhcm5pbmcoaW50IGxpbmUsIGludCBjb2wsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgICAgaWYgKGVycm9yX2NvbGxlY3Rvcl8gPT0gbnVsbHB0cikgeworICAgICAgaWYgKGxpbmUgPj0gMCkgeworICAgICAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJXYXJuaW5nIHBhcnNpbmcgdGV4dC1mb3JtYXQgIgorICAgICAgICAgICAgICAgICAgICAgPDwgcm9vdF9tZXNzYWdlX3R5cGVfLT5mdWxsX25hbWUoKSA8PCAiOiAiIDw8IChsaW5lICsgMSkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI6IiA8PCAoY29sICsgMSkgPDwgIjogIiA8PCBtZXNzYWdlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiV2FybmluZyBwYXJzaW5nIHRleHQtZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJvb3RfbWVzc2FnZV90eXBlXy0+ZnVsbF9uYW1lKCkgPDwgIjogIiA8PCBtZXNzYWdlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRXYXJuaW5nKGxpbmUsIGNvbCwgbWVzc2FnZSk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3RleHByIGludDMyX3Qga2ludDMybWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCk7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga3VpbnQzMm1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKTsKKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtpbnQ2NG1pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpOworICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga2ludDY0bWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCk7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga3VpbnQ2NG1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKTsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyc2VySW1wbCk7CisKKyAgLy8gUmVwb3J0cyBhbiBlcnJvciB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIHdpdGggaW5mb3JtYXRpb24gaW5kaWNhdGluZworICAvLyB0aGUgcG9zaXRpb24gKGFzIGRlcml2ZWQgZnJvbSB0aGUgY3VycmVudCB0b2tlbikuCisgIHZvaWQgUmVwb3J0RXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBSZXBvcnRFcnJvcih0b2tlbml6ZXJfLmN1cnJlbnQoKS5saW5lLCB0b2tlbml6ZXJfLmN1cnJlbnQoKS5jb2x1bW4sCisgICAgICAgICAgICAgICAgbWVzc2FnZSk7CisgIH0KKworICAvLyBSZXBvcnRzIGEgd2FybmluZyB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIHdpdGggaW5mb3JtYXRpb24gaW5kaWNhdGluZworICAvLyB0aGUgcG9zaXRpb24gKGFzIGRlcml2ZWQgZnJvbSB0aGUgY3VycmVudCB0b2tlbikuCisgIHZvaWQgUmVwb3J0V2FybmluZyhjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICAgIFJlcG9ydFdhcm5pbmcodG9rZW5pemVyXy5jdXJyZW50KCkubGluZSwgdG9rZW5pemVyXy5jdXJyZW50KCkuY29sdW1uLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZSk7CisgIH0KKworICAvLyBDb25zdW1lcyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gc3RhcnRpbmcgZGVsaW1pdGVyLgorICAvLyBUaGlzIG1ldGhvZCBjaGVja3MgdG8gc2VlIHRoYXQgdGhlIGVuZCBkZWxpbWl0ZXIgYXQgdGhlIGNvbmNsdXNpb24gb2YKKyAgLy8gdGhlIGNvbnN1bXB0aW9uIG1hdGNoZXMgdGhlIHN0YXJ0aW5nIGRlbGltaXRlciBwYXNzZWQgaW4gaGVyZS4KKyAgYm9vbCBDb25zdW1lTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBzdGQ6OnN0cmluZyBkZWxpbWl0ZXIpIHsKKyAgICB3aGlsZSAoIUxvb2tpbmdBdCgiPiIpICYmICFMb29raW5nQXQoIn0iKSkgeworICAgICAgRE8oQ29uc3VtZUZpZWxkKG1lc3NhZ2UpKTsKKyAgICB9CisKKyAgICAvLyBDb25maXJtIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIGVuZGluZyBkZWxpbWl0ZXIuCisgICAgRE8oQ29uc3VtZShkZWxpbWl0ZXIpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENvbnN1bWUgZWl0aGVyICI8IiBvciAieyIuCisgIGJvb2wgQ29uc3VtZU1lc3NhZ2VEZWxpbWl0ZXIoc3RkOjpzdHJpbmcqIGRlbGltaXRlcikgeworICAgIGlmIChUcnlDb25zdW1lKCI8IikpIHsKKyAgICAgICpkZWxpbWl0ZXIgPSAiPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIERPKENvbnN1bWUoInsiKSk7CisgICAgICAqZGVsaW1pdGVyID0gIn0iOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisKKyAgLy8gQ29uc3VtZXMgdGhlIGN1cnJlbnQgZmllbGQgKGFzIHJldHVybmVkIGJ5IHRoZSB0b2tlbml6ZXIpIG9uIHRoZQorICAvLyBwYXNzZWQgaW4gbWVzc2FnZS4KKyAgYm9vbCBDb25zdW1lRmllbGQoTWVzc2FnZSogbWVzc2FnZSkgeworICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWU7CisgICAgYm9vbCByZXNlcnZlZF9maWVsZCA9IGZhbHNlOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBudWxscHRyOworICAgIGludCBzdGFydF9saW5lID0gdG9rZW5pemVyXy5jdXJyZW50KCkubGluZTsKKyAgICBpbnQgc3RhcnRfY29sdW1uID0gdG9rZW5pemVyXy5jdXJyZW50KCkuY29sdW1uOworCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBhbnlfdHlwZV91cmxfZmllbGQ7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBhbnlfdmFsdWVfZmllbGQ7CisgICAgaWYgKGludGVybmFsOjpHZXRBbnlGaWVsZERlc2NyaXB0b3JzKCptZXNzYWdlLCAmYW55X3R5cGVfdXJsX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYW55X3ZhbHVlX2ZpZWxkKSAmJgorICAgICAgICBUcnlDb25zdW1lKCJbIikpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGZ1bGxfdHlwZV9uYW1lLCBwcmVmaXg7CisgICAgICBETyhDb25zdW1lQW55VHlwZVVybCgmZnVsbF90eXBlX25hbWUsICZwcmVmaXgpKTsKKyAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeF9hbmRfZnVsbF90eXBlX25hbWUgPQorICAgICAgICAgIFN0ckNhdChwcmVmaXgsIGZ1bGxfdHlwZV9uYW1lKTsKKyAgICAgIERPKENvbnN1bWVCZWZvcmVXaGl0ZXNwYWNlKCJdIikpOworICAgICAgVHJ5Q29uc3VtZVdoaXRlc3BhY2UoKTsKKyAgICAgIC8vICc6JyBpcyBvcHRpb25hbCBiZXR3ZWVuIG1lc3NhZ2UgbGFiZWxzIGFuZCB2YWx1ZXMuCisgICAgICBpZiAoVHJ5Q29uc3VtZUJlZm9yZVdoaXRlc3BhY2UoIjoiKSkgeworICAgICAgICBUcnlDb25zdW1lV2hpdGVzcGFjZSgpOworICAgICAgfQorICAgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZF92YWx1ZTsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3IqIHZhbHVlX2Rlc2NyaXB0b3IgPQorICAgICAgICAgIGZpbmRlcl8gPyBmaW5kZXJfLT5GaW5kQW55VHlwZSgqbWVzc2FnZSwgcHJlZml4LCBmdWxsX3R5cGVfbmFtZSkKKyAgICAgICAgICAgICAgICAgIDogRGVmYXVsdEZpbmRlckZpbmRBbnlUeXBlKCptZXNzYWdlLCBwcmVmaXgsIGZ1bGxfdHlwZV9uYW1lKTsKKyAgICAgIGlmICh2YWx1ZV9kZXNjcmlwdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgUmVwb3J0RXJyb3IoIkNvdWxkIG5vdCBmaW5kIHR5cGUgXCIiICsgcHJlZml4X2FuZF9mdWxsX3R5cGVfbmFtZSArCisgICAgICAgICAgICAgICAgICAgICJcIiBzdG9yZWQgaW4gZ29vZ2xlLnByb3RvYnVmLkFueS4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgRE8oQ29uc3VtZUFueVZhbHVlKHZhbHVlX2Rlc2NyaXB0b3IsICZzZXJpYWxpemVkX3ZhbHVlKSk7CisgICAgICBpZiAoc2luZ3VsYXJfb3ZlcndyaXRlX3BvbGljeV8gPT0gRk9SQklEX1NJTkdVTEFSX09WRVJXUklURVMpIHsKKyAgICAgICAgLy8gRmFpbCBpZiBhbnlfdHlwZV91cmxfZmllbGQgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQuCisgICAgICAgIGlmICgoIWFueV90eXBlX3VybF9maWVsZC0+aXNfcmVwZWF0ZWQoKSAmJgorICAgICAgICAgICAgIHJlZmxlY3Rpb24tPkhhc0ZpZWxkKCptZXNzYWdlLCBhbnlfdHlwZV91cmxfZmllbGQpKSB8fAorICAgICAgICAgICAgKCFhbnlfdmFsdWVfZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYKKyAgICAgICAgICAgICByZWZsZWN0aW9uLT5IYXNGaWVsZCgqbWVzc2FnZSwgYW55X3ZhbHVlX2ZpZWxkKSkpIHsKKyAgICAgICAgICBSZXBvcnRFcnJvcigiTm9uLXJlcGVhdGVkIEFueSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuIik7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgYW55X3R5cGVfdXJsX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwcmVmaXhfYW5kX2Z1bGxfdHlwZV9uYW1lKSk7CisgICAgICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgYW55X3ZhbHVlX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShzZXJpYWxpemVkX3ZhbHVlKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKFRyeUNvbnN1bWUoIlsiKSkgeworICAgICAgLy8gRXh0ZW5zaW9uLgorICAgICAgRE8oQ29uc3VtZUZ1bGxUeXBlTmFtZSgmZmllbGRfbmFtZSkpOworICAgICAgRE8oQ29uc3VtZUJlZm9yZVdoaXRlc3BhY2UoIl0iKSk7CisgICAgICBUcnlDb25zdW1lV2hpdGVzcGFjZSgpOworCisgICAgICBmaWVsZCA9IGZpbmRlcl8gPyBmaW5kZXJfLT5GaW5kRXh0ZW5zaW9uKG1lc3NhZ2UsIGZpZWxkX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgOiBEZWZhdWx0RmluZGVyRmluZEV4dGVuc2lvbihtZXNzYWdlLCBmaWVsZF9uYW1lKTsKKworICAgICAgaWYgKGZpZWxkID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKCFhbGxvd191bmtub3duX2ZpZWxkXyAmJiAhYWxsb3dfdW5rbm93bl9leHRlbnNpb25fKSB7CisgICAgICAgICAgUmVwb3J0RXJyb3IoIkV4dGVuc2lvbiBcIiIgKyBmaWVsZF9uYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAiXCIgaXMgbm90IGRlZmluZWQgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICJpcyBub3QgYW4gZXh0ZW5zaW9uIG9mIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFJlcG9ydFdhcm5pbmcoIklnbm9yaW5nIGV4dGVuc2lvbiBcIiIgKyBmaWVsZF9uYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJcIiB3aGljaCBpcyBub3QgZGVmaW5lZCBvciBpcyBub3QgYW4gZXh0ZW5zaW9uIG9mIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBETyhDb25zdW1lSWRlbnRpZmllckJlZm9yZVdoaXRlc3BhY2UoJmZpZWxkX25hbWUpKTsKKyAgICAgIFRyeUNvbnN1bWVXaGl0ZXNwYWNlKCk7CisKKyAgICAgIGludDMyX3QgZmllbGRfbnVtYmVyOworICAgICAgaWYgKGFsbG93X2ZpZWxkX251bWJlcl8gJiYgc2FmZV9zdHJ0bzMyKGZpZWxkX25hbWUsICZmaWVsZF9udW1iZXIpKSB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yLT5Jc0V4dGVuc2lvbk51bWJlcihmaWVsZF9udW1iZXIpKSB7CisgICAgICAgICAgZmllbGQgPSBmaW5kZXJfCisgICAgICAgICAgICAgICAgICAgICAgPyBmaW5kZXJfLT5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZGVzY3JpcHRvciwgZmllbGRfbnVtYmVyKQorICAgICAgICAgICAgICAgICAgICAgIDogRGVmYXVsdEZpbmRlckZpbmRFeHRlbnNpb25CeU51bWJlcihkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9udW1iZXIpOworICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3ItPklzUmVzZXJ2ZWROdW1iZXIoZmllbGRfbnVtYmVyKSkgeworICAgICAgICAgIHJlc2VydmVkX2ZpZWxkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TnVtYmVyKGZpZWxkX251bWJlcik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpZWxkID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKGZpZWxkX25hbWUpOworICAgICAgICAvLyBHcm91cCBuYW1lcyBhcmUgZXhwZWN0ZWQgdG8gYmUgY2FwaXRhbGl6ZWQgYXMgdGhleSBhcHBlYXIgaW4gdGhlCisgICAgICAgIC8vIC5wcm90byBmaWxlLCB3aGljaCBhY3R1YWxseSBtYXRjaGVzIHRoZWlyIHR5cGUgbmFtZXMsIG5vdCB0aGVpcgorICAgICAgICAvLyBmaWVsZCBuYW1lcy4KKyAgICAgICAgaWYgKGZpZWxkID09IG51bGxwdHIpIHsKKyAgICAgICAgICBzdGQ6OnN0cmluZyBsb3dlcl9maWVsZF9uYW1lID0gZmllbGRfbmFtZTsKKyAgICAgICAgICBMb3dlclN0cmluZygmbG93ZXJfZmllbGRfbmFtZSk7CisgICAgICAgICAgZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUobG93ZXJfZmllbGRfbmFtZSk7CisgICAgICAgICAgLy8gSWYgdGhlIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggd29ya2VkIGJ1dCB0aGUgZmllbGQgaXMgTk9UIGEgZ3JvdXAsCisgICAgICAgICAgaWYgKGZpZWxkICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgICAgZmllbGQtPnR5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICAgICAgICAgIGZpZWxkID0gbnVsbHB0cjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQWdhaW4sIHNwZWNpYWwtY2FzZSBncm91cCBuYW1lcyBhcyBkZXNjcmliZWQgYWJvdmUuCisgICAgICAgIGlmIChmaWVsZCAhPSBudWxscHRyICYmIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQICYmCisgICAgICAgICAgICBmaWVsZC0+bWVzc2FnZV90eXBlKCktPm5hbWUoKSAhPSBmaWVsZF9uYW1lKSB7CisgICAgICAgICAgZmllbGQgPSBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpZWxkID09IG51bGxwdHIgJiYgYWxsb3dfY2FzZV9pbnNlbnNpdGl2ZV9maWVsZF8pIHsKKyAgICAgICAgICBzdGQ6OnN0cmluZyBsb3dlcl9maWVsZF9uYW1lID0gZmllbGRfbmFtZTsKKyAgICAgICAgICBMb3dlclN0cmluZygmbG93ZXJfZmllbGRfbmFtZSk7CisgICAgICAgICAgZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUobG93ZXJfZmllbGRfbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmllbGQgPT0gbnVsbHB0cikgeworICAgICAgICAgIHJlc2VydmVkX2ZpZWxkID0gZGVzY3JpcHRvci0+SXNSZXNlcnZlZE5hbWUoZmllbGRfbmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGZpZWxkID09IG51bGxwdHIgJiYgIXJlc2VydmVkX2ZpZWxkKSB7CisgICAgICAgIGlmICghYWxsb3dfdW5rbm93bl9maWVsZF8pIHsKKyAgICAgICAgICBSZXBvcnRFcnJvcigiTWVzc2FnZSB0eXBlIFwiIiArIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIGZpZWxkIG5hbWVkIFwiIiArIGZpZWxkX25hbWUgKyAiXCIuIik7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFJlcG9ydFdhcm5pbmcoIk1lc3NhZ2UgdHlwZSBcIiIgKyBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIGZpZWxkIG5hbWVkIFwiIiArIGZpZWxkX25hbWUgKyAiXCIuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTa2lwcyB1bmtub3duIG9yIHJlc2VydmVkIGZpZWxkcy4KKyAgICBpZiAoZmllbGQgPT0gbnVsbHB0cikgeworICAgICAgR09PR0xFX0NIRUNLKGFsbG93X3Vua25vd25fZmllbGRfIHx8IGFsbG93X3Vua25vd25fZXh0ZW5zaW9uXyB8fCByZXNlcnZlZF9maWVsZCk7CisKKyAgICAgIC8vIFRyeSB0byBndWVzcyB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkLgorICAgICAgLy8gSWYgdGhpcyBmaWVsZCBpcyBub3QgYSBtZXNzYWdlLCB0aGVyZSBzaG91bGQgYmUgYSAiOiIgYmV0d2VlbiB0aGUKKyAgICAgIC8vIGZpZWxkIG5hbWUgYW5kIHRoZSBmaWVsZCB2YWx1ZSBhbmQgYWxzbyB0aGUgZmllbGQgdmFsdWUgc2hvdWxkIG5vdAorICAgICAgLy8gc3RhcnQgd2l0aCAieyIgb3IgIjwiIHdoaWNoIGluZGljYXRlcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZSBib2R5LgorICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gIjoiIG9yIHRoZXJlIGlzIGEgInsiIG9yICI8IiBhZnRlciAiOiIsIHRoaXMgZmllbGQgaGFzCisgICAgICAvLyB0byBiZSBhIG1lc3NhZ2Ugb3IgdGhlIGlucHV0IGlzIGlsbC1mb3JtZWQuCisgICAgICBpZiAoVHJ5Q29uc3VtZUJlZm9yZVdoaXRlc3BhY2UoIjoiKSkgeworICAgICAgICBUcnlDb25zdW1lV2hpdGVzcGFjZSgpOworICAgICAgICBpZiAoIUxvb2tpbmdBdCgieyIpICYmICFMb29raW5nQXQoIjwiKSkgeworICAgICAgICAgIHJldHVybiBTa2lwRmllbGRWYWx1ZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gU2tpcEZpZWxkTWVzc2FnZSgpOworICAgIH0KKworICAgIGlmIChzaW5ndWxhcl9vdmVyd3JpdGVfcG9saWN5XyA9PSBGT1JCSURfU0lOR1VMQVJfT1ZFUldSSVRFUykgeworICAgICAgLy8gRmFpbCBpZiB0aGUgZmllbGQgaXMgbm90IHJlcGVhdGVkIGFuZCBpdCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZC4KKyAgICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgcmVmbGVjdGlvbi0+SGFzRmllbGQoKm1lc3NhZ2UsIGZpZWxkKSkgeworICAgICAgICBSZXBvcnRFcnJvcigiTm9uLXJlcGVhdGVkIGZpZWxkIFwiIiArIGZpZWxkX25hbWUgKworICAgICAgICAgICAgICAgICAgICAiXCIgaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBGYWlsIGlmIHRoZSBmaWVsZCBpcyBhIG1lbWJlciBvZiBhIG9uZW9mIGFuZCBhbm90aGVyIG1lbWJlciBoYXMgYWxyZWFkeQorICAgICAgLy8gYmVlbiBzcGVjaWZpZWQuCisgICAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKTsKKyAgICAgIGlmIChvbmVvZiAhPSBudWxscHRyICYmIHJlZmxlY3Rpb24tPkhhc09uZW9mKCptZXNzYWdlLCBvbmVvZikpIHsKKyAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBvdGhlcl9maWVsZCA9CisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRPbmVvZkZpZWxkRGVzY3JpcHRvcigqbWVzc2FnZSwgb25lb2YpOworICAgICAgICBSZXBvcnRFcnJvcigiRmllbGQgXCIiICsgZmllbGRfbmFtZSArCisgICAgICAgICAgICAgICAgICAgICJcIiBpcyBzcGVjaWZpZWQgYWxvbmcgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICJmaWVsZCBcIiIgKworICAgICAgICAgICAgICAgICAgICBvdGhlcl9maWVsZC0+bmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgIlwiLCBhbm90aGVyIG1lbWJlciAiCisgICAgICAgICAgICAgICAgICAgICJvZiBvbmVvZiBcIiIgKworICAgICAgICAgICAgICAgICAgICBvbmVvZi0+bmFtZSgpICsgIlwiLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgLy8gUGVyZm9ybSBzcGVjaWFsIGhhbmRsaW5nIGZvciBlbWJlZGRlZCBtZXNzYWdlIHR5cGVzLgorICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgLy8gJzonIGlzIG9wdGlvbmFsIGhlcmUuCisgICAgICBib29sIGNvbnN1bWVkX3NlbWljb2xvbiA9IFRyeUNvbnN1bWVCZWZvcmVXaGl0ZXNwYWNlKCI6Iik7CisgICAgICBpZiAoY29uc3VtZWRfc2VtaWNvbG9uKSB7CisgICAgICAgIFRyeUNvbnN1bWVXaGl0ZXNwYWNlKCk7CisgICAgICB9CisgICAgICBpZiAoY29uc3VtZWRfc2VtaWNvbG9uICYmIGZpZWxkLT5vcHRpb25zKCkud2VhaygpICYmCisgICAgICAgICAgTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX1NUUklORykpIHsKKyAgICAgICAgLy8gd2UgYXJlIGdldHRpbmcgYSBieXRlcyBzdHJpbmcgZm9yIGEgd2VhayBmaWVsZC4KKyAgICAgICAgc3RkOjpzdHJpbmcgdG1wOworICAgICAgICBETyhDb25zdW1lU3RyaW5nKCZ0bXApKTsKKyAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkgPQorICAgICAgICAgICAgZmluZGVyXyA/IGZpbmRlcl8tPkZpbmRFeHRlbnNpb25GYWN0b3J5KGZpZWxkKSA6IG51bGxwdHI7CisgICAgICAgIHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkLCBmYWN0b3J5KQorICAgICAgICAgICAgLT5QYXJzZUZyb21TdHJpbmcodG1wKTsKKyAgICAgICAgZ290byBsYWJlbF9za2lwX3BhcnNpbmc7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vICc6JyBpcyByZXF1aXJlZCBoZXJlLgorICAgICAgRE8oQ29uc3VtZUJlZm9yZVdoaXRlc3BhY2UoIjoiKSk7CisgICAgICBUcnlDb25zdW1lV2hpdGVzcGFjZSgpOworICAgIH0KKworICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiBUcnlDb25zdW1lKCJbIikpIHsKKyAgICAgIC8vIFNob3J0IHJlcGVhdGVkIGZvcm1hdCwgZS5nLiAgImZvbzogWzEsIDIsIDNdIi4KKyAgICAgIGlmICghVHJ5Q29uc3VtZSgiXSIpKSB7CisgICAgICAgIC8vICJmb286IFtdIiBpcyB0cmVhdGVkIGFzIGVtcHR5LgorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgICAgICAgLy8gUGVyZm9ybSBzcGVjaWFsIGhhbmRsaW5nIGZvciBlbWJlZGRlZCBtZXNzYWdlIHR5cGVzLgorICAgICAgICAgICAgRE8oQ29uc3VtZUZpZWxkTWVzc2FnZShtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBETyhDb25zdW1lRmllbGRWYWx1ZShtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoVHJ5Q29uc3VtZSgiXSIpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgRE8oQ29uc3VtZSgiLCIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIERPKENvbnN1bWVGaWVsZE1lc3NhZ2UobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQpKTsKKyAgICB9IGVsc2UgeworICAgICAgRE8oQ29uc3VtZUZpZWxkVmFsdWUobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQpKTsKKyAgICB9CisgIGxhYmVsX3NraXBfcGFyc2luZzoKKyAgICAvLyBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBmaWVsZHMgbWF5IG9wdGlvbmFsbHkgYmUgc2VwYXJhdGVkIGJ5IGNvbW1hcyBvcgorICAgIC8vIHNlbWljb2xvbnMuCisgICAgVHJ5Q29uc3VtZSgiOyIpIHx8IFRyeUNvbnN1bWUoIiwiKTsKKworICAgIGlmIChmaWVsZC0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKSkgeworICAgICAgUmVwb3J0V2FybmluZygidGV4dCBmb3JtYXQgY29udGFpbnMgZGVwcmVjYXRlZCBmaWVsZCBcIiIgKyBmaWVsZF9uYW1lICsKKyAgICAgICAgICAgICAgICAgICAgIlwiIik7CisgICAgfQorCisgICAgLy8gSWYgYSBwYXJzZSBpbmZvIHRyZWUgZXhpc3RzLCBhZGQgdGhlIGxvY2F0aW9uIGZvciB0aGUgcGFyc2VkCisgICAgLy8gZmllbGQuCisgICAgaWYgKHBhcnNlX2luZm9fdHJlZV8gIT0gbnVsbHB0cikgeworICAgICAgaW50IGVuZF9saW5lID0gdG9rZW5pemVyXy5wcmV2aW91cygpLmxpbmU7CisgICAgICBpbnQgZW5kX2NvbHVtbiA9IHRva2VuaXplcl8ucHJldmlvdXMoKS5lbmRfY29sdW1uOworCisgICAgICBSZWNvcmRMb2NhdGlvbihwYXJzZV9pbmZvX3RyZWVfLCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgIFBhcnNlTG9jYXRpb25SYW5nZShQYXJzZUxvY2F0aW9uKHN0YXJ0X2xpbmUsIHN0YXJ0X2NvbHVtbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VMb2NhdGlvbihlbmRfbGluZSwgZW5kX2NvbHVtbikpKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFNraXBzIHRoZSBuZXh0IGZpZWxkIGluY2x1ZGluZyB0aGUgZmllbGQncyBuYW1lIGFuZCB2YWx1ZS4KKyAgYm9vbCBTa2lwRmllbGQoKSB7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZTsKKyAgICBpZiAoVHJ5Q29uc3VtZSgiWyIpKSB7CisgICAgICAvLyBFeHRlbnNpb24gbmFtZSBvciB0eXBlIFVSTC4KKyAgICAgIERPKENvbnN1bWVUeXBlVXJsT3JGdWxsVHlwZU5hbWUoJmZpZWxkX25hbWUpKTsKKyAgICAgIERPKENvbnN1bWVCZWZvcmVXaGl0ZXNwYWNlKCJdIikpOworICAgIH0gZWxzZSB7CisgICAgICBETyhDb25zdW1lSWRlbnRpZmllckJlZm9yZVdoaXRlc3BhY2UoJmZpZWxkX25hbWUpKTsKKyAgICB9CisgICAgVHJ5Q29uc3VtZVdoaXRlc3BhY2UoKTsKKworICAgIC8vIFRyeSB0byBndWVzcyB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkLgorICAgIC8vIElmIHRoaXMgZmllbGQgaXMgbm90IGEgbWVzc2FnZSwgdGhlcmUgc2hvdWxkIGJlIGEgIjoiIGJldHdlZW4gdGhlCisgICAgLy8gZmllbGQgbmFtZSBhbmQgdGhlIGZpZWxkIHZhbHVlIGFuZCBhbHNvIHRoZSBmaWVsZCB2YWx1ZSBzaG91bGQgbm90CisgICAgLy8gc3RhcnQgd2l0aCAieyIgb3IgIjwiIHdoaWNoIGluZGljYXRlcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZSBib2R5LgorICAgIC8vIElmIHRoZXJlIGlzIG5vICI6IiBvciB0aGVyZSBpcyBhICJ7IiBvciAiPCIgYWZ0ZXIgIjoiLCB0aGlzIGZpZWxkIGhhcworICAgIC8vIHRvIGJlIGEgbWVzc2FnZSBvciB0aGUgaW5wdXQgaXMgaWxsLWZvcm1lZC4KKyAgICBpZiAoVHJ5Q29uc3VtZUJlZm9yZVdoaXRlc3BhY2UoIjoiKSkgeworICAgICAgVHJ5Q29uc3VtZVdoaXRlc3BhY2UoKTsKKyAgICAgIGlmICghTG9va2luZ0F0KCJ7IikgJiYgIUxvb2tpbmdBdCgiPCIpKSB7CisgICAgICAgIERPKFNraXBGaWVsZFZhbHVlKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRE8oU2tpcEZpZWxkTWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgRE8oU2tpcEZpZWxkTWVzc2FnZSgpKTsKKyAgICB9CisgICAgLy8gRm9yIGhpc3RvcmljYWwgcmVhc29ucywgZmllbGRzIG1heSBvcHRpb25hbGx5IGJlIHNlcGFyYXRlZCBieSBjb21tYXMgb3IKKyAgICAvLyBzZW1pY29sb25zLgorICAgIFRyeUNvbnN1bWUoIjsiKSB8fCBUcnlDb25zdW1lKCIsIik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIENvbnN1bWVGaWVsZE1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgICBpZiAoLS1yZWN1cnNpb25fbGltaXRfIDwgMCkgeworICAgICAgUmVwb3J0RXJyb3IoCisgICAgICAgICAgU3RyQ2F0KCJNZXNzYWdlIGlzIHRvbyBkZWVwLCB0aGUgcGFyc2VyIGV4Y2VlZGVkIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJjb25maWd1cmVkIHJlY3Vyc2lvbiBsaW1pdCBvZiAiLAorICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3JlY3Vyc2lvbl9saW1pdF8sICIuIikpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBJZiB0aGUgcGFyc2UgaW5mb3JtYXRpb24gdHJlZSBpcyBub3QgbnVsbHB0ciwgY3JlYXRlIGEgbmVzdGVkIG9uZQorICAgIC8vIGZvciB0aGUgbmVzdGVkIG1lc3NhZ2UuCisgICAgUGFyc2VJbmZvVHJlZSogcGFyZW50ID0gcGFyc2VfaW5mb190cmVlXzsKKyAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgIHBhcnNlX2luZm9fdHJlZV8gPSBDcmVhdGVOZXN0ZWQocGFyZW50LCBmaWVsZCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZGVsaW1pdGVyOworICAgIERPKENvbnN1bWVNZXNzYWdlRGVsaW1pdGVyKCZkZWxpbWl0ZXIpKTsKKyAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9CisgICAgICAgIGZpbmRlcl8gPyBmaW5kZXJfLT5GaW5kRXh0ZW5zaW9uRmFjdG9yeShmaWVsZCkgOiBudWxscHRyOworICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgRE8oQ29uc3VtZU1lc3NhZ2UocmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBmaWVsZCwgZmFjdG9yeSksCisgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXIpKTsKKyAgICB9IGVsc2UgeworICAgICAgRE8oQ29uc3VtZU1lc3NhZ2UocmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgZmllbGQsIGZhY3RvcnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyKSk7CisgICAgfQorCisgICAgKytyZWN1cnNpb25fbGltaXRfOworCisgICAgLy8gUmVzZXQgdGhlIHBhcnNlIGluZm9ybWF0aW9uIHRyZWUuCisgICAgcGFyc2VfaW5mb190cmVlXyA9IHBhcmVudDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFNraXBzIHRoZSB3aG9sZSBib2R5IG9mIGEgbWVzc2FnZSBpbmNsdWRpbmcgdGhlIGJlZ2lubmluZyBkZWxpbWl0ZXIgYW5kCisgIC8vIHRoZSBlbmRpbmcgZGVsaW1pdGVyLgorICBib29sIFNraXBGaWVsZE1lc3NhZ2UoKSB7CisgICAgaWYgKC0tcmVjdXJzaW9uX2xpbWl0XyA8IDApIHsKKyAgICAgIFJlcG9ydEVycm9yKAorICAgICAgICAgIFN0ckNhdCgiTWVzc2FnZSBpcyB0b28gZGVlcCwgdGhlIHBhcnNlciBleGNlZWRlZCB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAiY29uZmlndXJlZCByZWN1cnNpb24gbGltaXQgb2YgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9yZWN1cnNpb25fbGltaXRfLCAiLiIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBkZWxpbWl0ZXI7CisgICAgRE8oQ29uc3VtZU1lc3NhZ2VEZWxpbWl0ZXIoJmRlbGltaXRlcikpOworICAgIHdoaWxlICghTG9va2luZ0F0KCI+IikgJiYgIUxvb2tpbmdBdCgifSIpKSB7CisgICAgICBETyhTa2lwRmllbGQoKSk7CisgICAgfQorICAgIERPKENvbnN1bWUoZGVsaW1pdGVyKSk7CisKKyAgICArK3JlY3Vyc2lvbl9saW1pdF87CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIENvbnN1bWVGaWVsZFZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworLy8gRGVmaW5lIGFuIGVhc3kgdG8gdXNlIG1hY3JvIGZvciBzZXR0aW5nIGZpZWxkcy4gVGhpcyBtYWNybyBjaGVja3MKKy8vIHRvIHNlZSBpZiB0aGUgZmllbGQgaXMgcmVwZWF0ZWQgKGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byB1c2UgdGhlIEFkZAorLy8gbWV0aG9kcyBvciBub3QgKGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byB1c2UgdGhlIFNldCBtZXRob2RzKS4KKyNkZWZpbmUgU0VUX0ZJRUxEKENQUFRZUEUsIFZBTFVFKSAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVmbGVjdGlvbi0+QWRkIyNDUFBUWVBFKG1lc3NhZ2UsIGZpZWxkLCBWQUxVRSk7IFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlZmxlY3Rpb24tPlNldCMjQ1BQVFlQRShtZXNzYWdlLCBmaWVsZCwgVkFMVUUpOyBcCisgIH0KKworICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7CisgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgIERPKENvbnN1bWVTaWduZWRJbnRlZ2VyKCZ2YWx1ZSwga2ludDMybWF4KSk7CisgICAgICAgIFNFVF9GSUVMRChJbnQzMiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4odmFsdWUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjogeworICAgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgICAgRE8oQ29uc3VtZVVuc2lnbmVkSW50ZWdlcigmdmFsdWUsIGt1aW50MzJtYXgpKTsKKyAgICAgICAgU0VUX0ZJRUxEKFVJbnQzMiwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDogeworICAgICAgICBpbnQ2NF90IHZhbHVlOworICAgICAgICBETyhDb25zdW1lU2lnbmVkSW50ZWdlcigmdmFsdWUsIGtpbnQ2NG1heCkpOworICAgICAgICBTRVRfRklFTEQoSW50NjQsIHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDogeworICAgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgICAgRE8oQ29uc3VtZVVuc2lnbmVkSW50ZWdlcigmdmFsdWUsIGt1aW50NjRtYXgpKTsKKyAgICAgICAgU0VUX0ZJRUxEKFVJbnQ2NCwgdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKKyAgICAgICAgZG91YmxlIHZhbHVlOworICAgICAgICBETyhDb25zdW1lRG91YmxlKCZ2YWx1ZSkpOworICAgICAgICBTRVRfRklFTEQoRmxvYXQsIGlvOjpTYWZlRG91YmxlVG9GbG9hdCh2YWx1ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7CisgICAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgICAgRE8oQ29uc3VtZURvdWJsZSgmdmFsdWUpKTsKKyAgICAgICAgU0VUX0ZJRUxEKERvdWJsZSwgdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlOworICAgICAgICBETyhDb25zdW1lU3RyaW5nKCZ2YWx1ZSkpOworICAgICAgICBTRVRfRklFTEQoU3RyaW5nLCBzdGQ6Om1vdmUodmFsdWUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6IHsKKyAgICAgICAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JTlRFR0VSKSkgeworICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOworICAgICAgICAgIERPKENvbnN1bWVVbnNpZ25lZEludGVnZXIoJnZhbHVlLCAxKSk7CisgICAgICAgICAgU0VUX0ZJRUxEKEJvb2wsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZTsKKyAgICAgICAgICBETyhDb25zdW1lSWRlbnRpZmllcigmdmFsdWUpKTsKKyAgICAgICAgICBpZiAodmFsdWUgPT0gInRydWUiIHx8IHZhbHVlID09ICJUcnVlIiB8fCB2YWx1ZSA9PSAidCIpIHsKKyAgICAgICAgICAgIFNFVF9GSUVMRChCb29sLCB0cnVlKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJmYWxzZSIgfHwgdmFsdWUgPT0gIkZhbHNlIiB8fCB2YWx1ZSA9PSAiZiIpIHsKKyAgICAgICAgICAgIFNFVF9GSUVMRChCb29sLCBmYWxzZSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJlcG9ydEVycm9yKCJJbnZhbGlkIHZhbHVlIGZvciBib29sZWFuIGZpZWxkIFwiIiArIGZpZWxkLT5uYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIlwiLiBWYWx1ZTogXCIiICsgdmFsdWUgKyAiXCIuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOiB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlOworICAgICAgICBpbnQ2NF90IGludF92YWx1ZSA9IGtpbnQ2NG1heDsKKyAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZSA9IGZpZWxkLT5lbnVtX3R5cGUoKTsKKyAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9IG51bGxwdHI7CisKKyAgICAgICAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSKSkgeworICAgICAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZ2YWx1ZSkpOworICAgICAgICAgIC8vIEZpbmQgdGhlIGVudW1lcmF0aW9uIHZhbHVlLgorICAgICAgICAgIGVudW1fdmFsdWUgPSBlbnVtX3R5cGUtPkZpbmRWYWx1ZUJ5TmFtZSh2YWx1ZSk7CisKKyAgICAgICAgfSBlbHNlIGlmIChMb29raW5nQXQoIi0iKSB8fAorICAgICAgICAgICAgICAgICAgIExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JTlRFR0VSKSkgeworICAgICAgICAgIERPKENvbnN1bWVTaWduZWRJbnRlZ2VyKCZpbnRfdmFsdWUsIGtpbnQzMm1heCkpOworICAgICAgICAgIHZhbHVlID0gU3RyQ2F0KGludF92YWx1ZSk7ICAvLyBmb3IgZXJyb3IgcmVwb3J0aW5nCisgICAgICAgICAgZW51bV92YWx1ZSA9IGVudW1fdHlwZS0+RmluZFZhbHVlQnlOdW1iZXIoaW50X3ZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgaW50ZWdlciBvciBpZGVudGlmaWVyLCBnb3Q6ICIgKworICAgICAgICAgICAgICAgICAgICAgIHRva2VuaXplcl8uY3VycmVudCgpLnRleHQpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbnVtX3ZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICBpZiAoaW50X3ZhbHVlICE9IGtpbnQ2NG1heCAmJgorICAgICAgICAgICAgICByZWZsZWN0aW9uLT5TdXBwb3J0c1Vua25vd25FbnVtVmFsdWVzKCkpIHsKKyAgICAgICAgICAgIFNFVF9GSUVMRChFbnVtVmFsdWUsIGludF92YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd191bmtub3duX2VudW1fKSB7CisgICAgICAgICAgICBSZXBvcnRFcnJvcigiVW5rbm93biBlbnVtZXJhdGlvbiB2YWx1ZSBvZiBcIiIgKyB2YWx1ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiXCIgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZCBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPm5hbWUoKSArICJcIi4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUmVwb3J0V2FybmluZygiVW5rbm93biBlbnVtZXJhdGlvbiB2YWx1ZSBvZiBcIiIgKyB2YWx1ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGQgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPm5hbWUoKSArICJcIi4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFNFVF9GSUVMRChFbnVtLCBlbnVtX3ZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6IHsKKyAgICAgICAgLy8gV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLiBQdXQgaGVyZSBpbnN0ZWFkIG9mIGEgZGVmYXVsdAorICAgICAgICAvLyBzbyB0aGF0IGlmIG5ldyB0eXBlcyBhcmUgYWRkZWQsIHdlIGdldCBhIG5pY2UgY29tcGlsZXIgd2FybmluZy4KKyAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlJlYWNoZWQgYW4gdW5pbnRlbmRlZCBzdGF0ZTogQ1BQVFlQRV9NRVNTQUdFIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorI3VuZGVmIFNFVF9GSUVMRAorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBTa2lwRmllbGRWYWx1ZSgpIHsKKyAgICBpZiAoLS1yZWN1cnNpb25fbGltaXRfIDwgMCkgeworICAgICAgUmVwb3J0RXJyb3IoCisgICAgICAgICAgU3RyQ2F0KCJNZXNzYWdlIGlzIHRvbyBkZWVwLCB0aGUgcGFyc2VyIGV4Y2VlZGVkIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJjb25maWd1cmVkIHJlY3Vyc2lvbiBsaW1pdCBvZiAiLAorICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3JlY3Vyc2lvbl9saW1pdF8sICIuIikpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfU1RSSU5HKSkgeworICAgICAgd2hpbGUgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkcpKSB7CisgICAgICAgIHRva2VuaXplcl8uTmV4dCgpOworICAgICAgfQorICAgICAgKytyZWN1cnNpb25fbGltaXRfOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChUcnlDb25zdW1lKCJbIikpIHsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmICghTG9va2luZ0F0KCJ7IikgJiYgIUxvb2tpbmdBdCgiPCIpKSB7CisgICAgICAgICAgRE8oU2tpcEZpZWxkVmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRE8oU2tpcEZpZWxkTWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoVHJ5Q29uc3VtZSgiXSIpKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgRE8oQ29uc3VtZSgiLCIpKTsKKyAgICAgIH0KKyAgICAgICsrcmVjdXJzaW9uX2xpbWl0XzsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBQb3NzaWJsZSBmaWVsZCB2YWx1ZXMgb3RoZXIgdGhhbiBzdHJpbmc6CisgICAgLy8gICAxMjM0NSAgICAgICAgPT4gVFlQRV9JTlRFR0VSCisgICAgLy8gICAtMTIzNDUgICAgICAgPT4gVFlQRV9TWU1CT0wgKyBUWVBFX0lOVEVHRVIKKyAgICAvLyAgIDEuMjM0NSAgICAgICA9PiBUWVBFX0ZMT0FUCisgICAgLy8gICAtMS4yMzQ1ICAgICAgPT4gVFlQRV9TWU1CT0wgKyBUWVBFX0ZMT0FUCisgICAgLy8gICBpbmYgICAgICAgICAgPT4gVFlQRV9JREVOVElGSUVSCisgICAgLy8gICAtaW5mICAgICAgICAgPT4gVFlQRV9TWU1CT0wgKyBUWVBFX0lERU5USUZJRVIKKyAgICAvLyAgIFRZUEVfSU5URUdFUiA9PiBUWVBFX0lERU5USUZJRVIKKyAgICAvLyBEaXZpZGVzIHRoZW0gaW50byB0d28gZ3JvdXAsIG9uZSB3aXRoIFRZUEVfU1lNQk9MCisgICAgLy8gYW5kIHRoZSBvdGhlciB3aXRob3V0OgorICAgIC8vICAgR3JvdXAgb25lOgorICAgIC8vICAgICAxMjM0NSAgICAgICAgPT4gVFlQRV9JTlRFR0VSCisgICAgLy8gICAgIDEuMjM0NSAgICAgICA9PiBUWVBFX0ZMT0FUCisgICAgLy8gICAgIGluZiAgICAgICAgICA9PiBUWVBFX0lERU5USUZJRVIKKyAgICAvLyAgICAgVFlQRV9JTlRFR0VSID0+IFRZUEVfSURFTlRJRklFUgorICAgIC8vICAgR3JvdXAgdHdvOgorICAgIC8vICAgICAtMTIzNDUgICAgICAgPT4gVFlQRV9TWU1CT0wgKyBUWVBFX0lOVEVHRVIKKyAgICAvLyAgICAgLTEuMjM0NSAgICAgID0+IFRZUEVfU1lNQk9MICsgVFlQRV9GTE9BVAorICAgIC8vICAgICAtaW5mICAgICAgICAgPT4gVFlQRV9TWU1CT0wgKyBUWVBFX0lERU5USUZJRVIKKyAgICAvLyBBcyB3ZSBjYW4gc2VlLCB0aGUgZmllbGQgdmFsdWUgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgJy0nIGFuZCBvbmUgb2YKKyAgICAvLyBUWVBFX0lOVEVHRVIsIFRZUEVfRkxPQVQgYW5kIFRZUEVfSURFTlRJRklFUi4KKyAgICBib29sIGhhc19taW51cyA9IFRyeUNvbnN1bWUoIi0iKTsKKyAgICBpZiAoIUxvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JTlRFR0VSKSAmJgorICAgICAgICAhTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0ZMT0FUKSAmJgorICAgICAgICAhTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIpKSB7CisgICAgICBzdGQ6OnN0cmluZyB0ZXh0ID0gdG9rZW5pemVyXy5jdXJyZW50KCkudGV4dDsKKyAgICAgIFJlcG9ydEVycm9yKCJDYW5ub3Qgc2tpcCBmaWVsZCB2YWx1ZSwgdW5leHBlY3RlZCB0b2tlbjogIiArIHRleHQpOworICAgICAgKytyZWN1cnNpb25fbGltaXRfOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBDb21iaW5hdGlvbiBvZiAnLScgYW5kIFRZUEVfSURFTlRJRklFUiBtYXkgcmVzdWx0IGluIGFuIGludmFsaWQgZmllbGQKKyAgICAvLyB2YWx1ZSB3aGlsZSBvdGhlciBjb21iaW5hdGlvbnMgYWxsIGdlbmVyYXRlIHZhbGlkIHZhbHVlcy4KKyAgICAvLyBXZSBjaGVjayBpZiB0aGUgdmFsdWUgb2YgdGhpcyBjb21iaW5hdGlvbiBpcyB2YWxpZCBoZXJlLgorICAgIC8vIFRZUEVfSURFTlRJRklFUiBhZnRlciBhICctJyBzaG91bGQgYmUgb25lIG9mIHRoZSBmbG9hdCB2YWx1ZXMgbGlzdGVkCisgICAgLy8gYmVsb3c6CisgICAgLy8gICBpbmYsIGluZmYsIGluZmluaXR5LCBuYW4KKyAgICBpZiAoaGFzX21pbnVzICYmIExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSKSkgeworICAgICAgc3RkOjpzdHJpbmcgdGV4dCA9IHRva2VuaXplcl8uY3VycmVudCgpLnRleHQ7CisgICAgICBMb3dlclN0cmluZygmdGV4dCk7CisgICAgICBpZiAodGV4dCAhPSAiaW5mIiAmJgorICAgICAgICAgIHRleHQgIT0gImluZmluaXR5IiAmJiB0ZXh0ICE9ICJuYW4iKSB7CisgICAgICAgIFJlcG9ydEVycm9yKCJJbnZhbGlkIGZsb2F0IG51bWJlcjogIiArIHRleHQpOworICAgICAgICArK3JlY3Vyc2lvbl9saW1pdF87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgdG9rZW5pemVyXy5OZXh0KCk7CisgICAgKytyZWN1cnNpb25fbGltaXRfOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHRva2VuJ3MgdGV4dCBpcyBlcXVhbCB0byB0aGF0IHNwZWNpZmllZC4KKyAgYm9vbCBMb29raW5nQXQoY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpIHsKKyAgICByZXR1cm4gdG9rZW5pemVyXy5jdXJyZW50KCkudGV4dCA9PSB0ZXh0OworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHRva2VuJ3MgdHlwZSBpcyBlcXVhbCB0byB0aGF0IHNwZWNpZmllZC4KKyAgYm9vbCBMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRva2VuVHlwZSB0b2tlbl90eXBlKSB7CisgICAgcmV0dXJuIHRva2VuaXplcl8uY3VycmVudCgpLnR5cGUgPT0gdG9rZW5fdHlwZTsKKyAgfQorCisgIC8vIENvbnN1bWVzIGFuIGlkZW50aWZpZXIgYW5kIHNhdmVzIGl0cyB2YWx1ZSBpbiB0aGUgaWRlbnRpZmllciBwYXJhbWV0ZXIuCisgIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIHRva2VuIGlzIG5vdCBvZiB0eXBlIElERU5USUZJRVIuCisgIGJvb2wgQ29uc3VtZUlkZW50aWZpZXIoc3RkOjpzdHJpbmcqIGlkZW50aWZpZXIpIHsKKyAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIpKSB7CisgICAgICAqaWRlbnRpZmllciA9IHRva2VuaXplcl8uY3VycmVudCgpLnRleHQ7CisgICAgICB0b2tlbml6ZXJfLk5leHQoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIElmIGFsbG93X2ZpZWxkX251bWVyXyBvciBhbGxvd191bmtub3duX2ZpZWxkXyBpcyB0cnVlLCB3ZSBzaG91bGQgYWJsZQorICAgIC8vIHRvIHBhcnNlIGludGVnZXIgaWRlbnRpZmllcnMuCisgICAgaWYgKChhbGxvd19maWVsZF9udW1iZXJfIHx8IGFsbG93X3Vua25vd25fZmllbGRfIHx8CisgICAgICAgICBhbGxvd191bmtub3duX2V4dGVuc2lvbl8pICYmCisgICAgICAgIExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JTlRFR0VSKSkgeworICAgICAgKmlkZW50aWZpZXIgPSB0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0OworICAgICAgdG9rZW5pemVyXy5OZXh0KCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgaWRlbnRpZmllciwgZ290OiAiICsgdG9rZW5pemVyXy5jdXJyZW50KCkudGV4dCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gU2ltaWxhciB0byBgQ29uc3VtZUlkZW50aWZpZXJgLCBidXQgYW55IGZvbGxvd2luZyB3aGl0ZXNwYWNlIHRva2VuIG1heQorICAvLyBiZSByZXBvcnRlZC4KKyAgYm9vbCBDb25zdW1lSWRlbnRpZmllckJlZm9yZVdoaXRlc3BhY2Uoc3RkOjpzdHJpbmcqIGlkZW50aWZpZXIpIHsKKyAgICB0b2tlbml6ZXJfLnNldF9yZXBvcnRfd2hpdGVzcGFjZSh0cnVlKTsKKyAgICBib29sIHJlc3VsdCA9IENvbnN1bWVJZGVudGlmaWVyKGlkZW50aWZpZXIpOworICAgIHRva2VuaXplcl8uc2V0X3JlcG9ydF93aGl0ZXNwYWNlKGZhbHNlKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLy8gQ29uc3VtZSBhIHN0cmluZyBvZiBmb3JtICI8aWQxPi48aWQyPi4uLi48aWROPiIuCisgIGJvb2wgQ29uc3VtZUZ1bGxUeXBlTmFtZShzdGQ6OnN0cmluZyogbmFtZSkgeworICAgIERPKENvbnN1bWVJZGVudGlmaWVyKG5hbWUpKTsKKyAgICB3aGlsZSAoVHJ5Q29uc3VtZSgiLiIpKSB7CisgICAgICBzdGQ6OnN0cmluZyBwYXJ0OworICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJnBhcnQpKTsKKyAgICAgICpuYW1lICs9ICIuIjsKKyAgICAgICpuYW1lICs9IHBhcnQ7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBDb25zdW1lVHlwZVVybE9yRnVsbFR5cGVOYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIobmFtZSkpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzdGQ6OnN0cmluZyBjb25uZWN0b3I7CisgICAgICBpZiAoVHJ5Q29uc3VtZSgiLiIpKSB7CisgICAgICAgIGNvbm5lY3RvciA9ICIuIjsKKyAgICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgiLyIpKSB7CisgICAgICAgIGNvbm5lY3RvciA9ICIvIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc3RkOjpzdHJpbmcgcGFydDsKKyAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZwYXJ0KSk7CisgICAgICAqbmFtZSArPSBjb25uZWN0b3I7CisgICAgICAqbmFtZSArPSBwYXJ0OworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENvbnN1bWVzIGEgc3RyaW5nIGFuZCBzYXZlcyBpdHMgdmFsdWUgaW4gdGhlIHRleHQgcGFyYW1ldGVyLgorICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSB0b2tlbiBpcyBub3Qgb2YgdHlwZSBTVFJJTkcuCisgIGJvb2wgQ29uc3VtZVN0cmluZyhzdGQ6OnN0cmluZyogdGV4dCkgeworICAgIGlmICghTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX1NUUklORykpIHsKKyAgICAgIFJlcG9ydEVycm9yKCJFeHBlY3RlZCBzdHJpbmcsIGdvdDogIiArIHRva2VuaXplcl8uY3VycmVudCgpLnRleHQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRleHQtPmNsZWFyKCk7CisgICAgd2hpbGUgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkcpKSB7CisgICAgICBpbzo6VG9rZW5pemVyOjpQYXJzZVN0cmluZ0FwcGVuZCh0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0LCB0ZXh0KTsKKworICAgICAgdG9rZW5pemVyXy5OZXh0KCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBDb25zdW1lcyBhIHVpbnQ2NF90IGFuZCBzYXZlcyBpdHMgdmFsdWUgaW4gdGhlIHZhbHVlIHBhcmFtZXRlci4KKyAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgdG9rZW4gaXMgbm90IG9mIHR5cGUgSU5URUdFUi4KKyAgYm9vbCBDb25zdW1lVW5zaWduZWRJbnRlZ2VyKHVpbnQ2NF90KiB2YWx1ZSwgdWludDY0X3QgbWF4X3ZhbHVlKSB7CisgICAgaWYgKCFMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfSU5URUdFUikpIHsKKyAgICAgIFJlcG9ydEVycm9yKCJFeHBlY3RlZCBpbnRlZ2VyLCBnb3Q6ICIgKyB0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWlvOjpUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcih0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0LCBtYXhfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKSB7CisgICAgICBSZXBvcnRFcnJvcigiSW50ZWdlciBvdXQgb2YgcmFuZ2UgKCIgKyB0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0ICsgIikiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0b2tlbml6ZXJfLk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENvbnN1bWVzIGFuIGludDY0X3QgYW5kIHNhdmVzIGl0cyB2YWx1ZSBpbiB0aGUgdmFsdWUgcGFyYW1ldGVyLgorICAvLyBOb3RlIHRoYXQgc2luY2UgdGhlIHRva2VuaXplciBkb2VzIG5vdCBzdXBwb3J0IG5lZ2F0aXZlIG51bWJlcnMsCisgIC8vIHdlIGFjdHVhbGx5IG1heSBjb25zdW1lIGFuIGFkZGl0aW9uYWwgdG9rZW4gKGZvciB0aGUgbWludXMgc2lnbikgaW4gdGhpcworICAvLyBtZXRob2QuIFJldHVybnMgZmFsc2UgaWYgdGhlIHRva2VuIGlzIG5vdCBhbiBpbnRlZ2VyCisgIC8vIChzaWduZWQgb3Igb3RoZXJ3aXNlKS4KKyAgYm9vbCBDb25zdW1lU2lnbmVkSW50ZWdlcihpbnQ2NF90KiB2YWx1ZSwgdWludDY0X3QgbWF4X3ZhbHVlKSB7CisgICAgYm9vbCBuZWdhdGl2ZSA9IGZhbHNlOworCisgICAgaWYgKFRyeUNvbnN1bWUoIi0iKSkgeworICAgICAgbmVnYXRpdmUgPSB0cnVlOworICAgICAgLy8gVHdvJ3MgY29tcGxlbWVudCBhbHdheXMgYWxsb3dzIG9uZSBtb3JlIG5lZ2F0aXZlIGludGVnZXIgdGhhbgorICAgICAgLy8gcG9zaXRpdmUuCisgICAgICArK21heF92YWx1ZTsKKyAgICB9CisKKyAgICB1aW50NjRfdCB1bnNpZ25lZF92YWx1ZTsKKworICAgIERPKENvbnN1bWVVbnNpZ25lZEludGVnZXIoJnVuc2lnbmVkX3ZhbHVlLCBtYXhfdmFsdWUpKTsKKworICAgIGlmIChuZWdhdGl2ZSkgeworICAgICAgaWYgKChzdGF0aWNfY2FzdDx1aW50NjRfdD4oa2ludDY0bWF4KSArIDEpID09IHVuc2lnbmVkX3ZhbHVlKSB7CisgICAgICAgICp2YWx1ZSA9IGtpbnQ2NG1pbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICp2YWx1ZSA9IC1zdGF0aWNfY2FzdDxpbnQ2NF90Pih1bnNpZ25lZF92YWx1ZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICp2YWx1ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KHVuc2lnbmVkX3ZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENvbnN1bWVzIGEgZG91YmxlIGFuZCBzYXZlcyBpdHMgdmFsdWUgaW4gdGhlIHZhbHVlIHBhcmFtZXRlci4KKyAgLy8gQWNjZXB0cyBkZWNpbWFsIG51bWJlcnMgb25seSwgcmVqZWN0cyBoZXggb3Igb2N0IG51bWJlcnMuCisgIGJvb2wgQ29uc3VtZVVuc2lnbmVkRGVjaW1hbEFzRG91YmxlKGRvdWJsZSogdmFsdWUsIHVpbnQ2NF90IG1heF92YWx1ZSkgeworICAgIGlmICghTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7CisgICAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgaW50ZWdlciwgZ290OiAiICsgdG9rZW5pemVyXy5jdXJyZW50KCkudGV4dCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQgPSB0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0OworICAgIGlmIChJc0hleE51bWJlcih0ZXh0KSB8fCBJc09jdE51bWJlcih0ZXh0KSkgeworICAgICAgUmVwb3J0RXJyb3IoIkV4cGVjdCBhIGRlY2ltYWwgbnVtYmVyLCBnb3Q6ICIgKyB0ZXh0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50NjRfdCB1aW50NjRfdmFsdWU7CisgICAgaWYgKGlvOjpUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcih0ZXh0LCBtYXhfdmFsdWUsICZ1aW50NjRfdmFsdWUpKSB7CisgICAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KHVpbnQ2NF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFVpbnQ2NCBvdmVyZmxvdywgYXR0ZW1wdCB0byBwYXJzZSBhcyBhIGRvdWJsZSBpbnN0ZWFkLgorICAgICAgKnZhbHVlID0gaW86OlRva2VuaXplcjo6UGFyc2VGbG9hdCh0ZXh0KTsKKyAgICB9CisKKyAgICB0b2tlbml6ZXJfLk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENvbnN1bWVzIGEgZG91YmxlIGFuZCBzYXZlcyBpdHMgdmFsdWUgaW4gdGhlIHZhbHVlIHBhcmFtZXRlci4KKyAgLy8gTm90ZSB0aGF0IHNpbmNlIHRoZSB0b2tlbml6ZXIgZG9lcyBub3Qgc3VwcG9ydCBuZWdhdGl2ZSBudW1iZXJzLAorICAvLyB3ZSBhY3R1YWxseSBtYXkgY29uc3VtZSBhbiBhZGRpdGlvbmFsIHRva2VuIChmb3IgdGhlIG1pbnVzIHNpZ24pIGluIHRoaXMKKyAgLy8gbWV0aG9kLiBSZXR1cm5zIGZhbHNlIGlmIHRoZSB0b2tlbiBpcyBub3QgYSBkb3VibGUKKyAgLy8gKHNpZ25lZCBvciBvdGhlcndpc2UpLgorICBib29sIENvbnN1bWVEb3VibGUoZG91YmxlKiB2YWx1ZSkgeworICAgIGJvb2wgbmVnYXRpdmUgPSBmYWxzZTsKKworICAgIGlmIChUcnlDb25zdW1lKCItIikpIHsKKyAgICAgIG5lZ2F0aXZlID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBBIGRvdWJsZSBjYW4gYWN0dWFsbHkgYmUgYW4gaW50ZWdlciwgYWNjb3JkaW5nIHRvIHRoZSB0b2tlbml6ZXIuCisgICAgLy8gVGhlcmVmb3JlLCB3ZSBtdXN0IGNoZWNrIGJvdGggY2FzZXMgaGVyZS4KKyAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7CisgICAgICAvLyBXZSBoYXZlIGZvdW5kIGFuIGludGVnZXIgdmFsdWUgZm9yIHRoZSBkb3VibGUuCisgICAgICBETyhDb25zdW1lVW5zaWduZWREZWNpbWFsQXNEb3VibGUodmFsdWUsIGt1aW50NjRtYXgpKTsKKyAgICB9IGVsc2UgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9GTE9BVCkpIHsKKyAgICAgIC8vIFdlIGhhdmUgZm91bmQgYSBmbG9hdCB2YWx1ZSBmb3IgdGhlIGRvdWJsZS4KKyAgICAgICp2YWx1ZSA9IGlvOjpUb2tlbml6ZXI6OlBhcnNlRmxvYXQodG9rZW5pemVyXy5jdXJyZW50KCkudGV4dCk7CisKKyAgICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgdG9rZW4gYXMgY29uc3VtZWQuCisgICAgICB0b2tlbml6ZXJfLk5leHQoKTsKKyAgICB9IGVsc2UgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSKSkgeworICAgICAgc3RkOjpzdHJpbmcgdGV4dCA9IHRva2VuaXplcl8uY3VycmVudCgpLnRleHQ7CisgICAgICBMb3dlclN0cmluZygmdGV4dCk7CisgICAgICBpZiAodGV4dCA9PSAiaW5mIiB8fAorICAgICAgICAgIHRleHQgPT0gImluZmluaXR5IikgeworICAgICAgICAqdmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgICAgICAgIHRva2VuaXplcl8uTmV4dCgpOworICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJuYW4iKSB7CisgICAgICAgICp2YWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCk7CisgICAgICAgIHRva2VuaXplcl8uTmV4dCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUmVwb3J0RXJyb3IoIkV4cGVjdGVkIGRvdWJsZSwgZ290OiAiICsgdGV4dCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgUmVwb3J0RXJyb3IoIkV4cGVjdGVkIGRvdWJsZSwgZ290OiAiICsgdG9rZW5pemVyXy5jdXJyZW50KCkudGV4dCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG5lZ2F0aXZlKSB7CisgICAgICAqdmFsdWUgPSAtKnZhbHVlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gQ29uc3VtZXMgQW55Ojp0eXBlX3VybCB2YWx1ZSwgb2YgZm9ybSAidHlwZS5nb29nbGVhcGlzLmNvbS9mdWxsLnR5cGUuTmFtZSIKKyAgLy8gb3IgInR5cGUuZ29vZ2xlcHJvZC5jb20vZnVsbC50eXBlLk5hbWUiCisgIGJvb2wgQ29uc3VtZUFueVR5cGVVcmwoc3RkOjpzdHJpbmcqIGZ1bGxfdHlwZV9uYW1lLCBzdGQ6OnN0cmluZyogcHJlZml4KSB7CisgICAgLy8gVE9ETyhzYWl0bykgRXh0ZW5kIENvbnN1bWUoKSB0byBjb25zdW1lIG11bHRpcGxlIHRva2VucyBhdCBvbmNlLCBzbyB0aGF0CisgICAgLy8gdGhpcyBjb2RlIGNhbiBiZSB3cml0dGVuIGFzIGp1c3QgRE8oQ29uc3VtZShrR29vZ2xlQXBpc1R5cGVQcmVmaXgpKS4KKyAgICBETyhDb25zdW1lSWRlbnRpZmllcihwcmVmaXgpKTsKKyAgICB3aGlsZSAoVHJ5Q29uc3VtZSgiLiIpKSB7CisgICAgICBzdGQ6OnN0cmluZyB1cmw7CisgICAgICBETyhDb25zdW1lSWRlbnRpZmllcigmdXJsKSk7CisgICAgICAqcHJlZml4ICs9ICIuIiArIHVybDsKKyAgICB9CisgICAgRE8oQ29uc3VtZSgiLyIpKTsKKyAgICAqcHJlZml4ICs9ICIvIjsKKyAgICBETyhDb25zdW1lRnVsbFR5cGVOYW1lKGZ1bGxfdHlwZV9uYW1lKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIEEgaGVscGVyIGZ1bmN0aW9uIGZvciByZWNvbnN0cnVjdGluZyBBbnk6OnZhbHVlLiBDb25zdW1lcyBhIHRleHQgb2YKKyAgLy8gZnVsbF90eXBlX25hbWUsIHRoZW4gc2VyaWFsaXplcyBpdCBpbnRvIHNlcmlhbGl6ZWRfdmFsdWUuCisgIGJvb2wgQ29uc3VtZUFueVZhbHVlKGNvbnN0IERlc2NyaXB0b3IqIHZhbHVlX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBzZXJpYWxpemVkX3ZhbHVlKSB7CisgICAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGZhY3Rvcnk7CisgICAgY29uc3QgTWVzc2FnZSogdmFsdWVfcHJvdG90eXBlID0gZmFjdG9yeS5HZXRQcm90b3R5cGUodmFsdWVfZGVzY3JpcHRvcik7CisgICAgaWYgKHZhbHVlX3Byb3RvdHlwZSA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlPiB2YWx1ZSh2YWx1ZV9wcm90b3R5cGUtPk5ldygpKTsKKyAgICBzdGQ6OnN0cmluZyBzdWJfZGVsaW1pdGVyOworICAgIERPKENvbnN1bWVNZXNzYWdlRGVsaW1pdGVyKCZzdWJfZGVsaW1pdGVyKSk7CisgICAgRE8oQ29uc3VtZU1lc3NhZ2UodmFsdWUuZ2V0KCksIHN1Yl9kZWxpbWl0ZXIpKTsKKworICAgIGlmIChhbGxvd19wYXJ0aWFsXykgeworICAgICAgdmFsdWUtPkFwcGVuZFBhcnRpYWxUb1N0cmluZyhzZXJpYWxpemVkX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCF2YWx1ZS0+SXNJbml0aWFsaXplZCgpKSB7CisgICAgICAgIFJlcG9ydEVycm9yKAorICAgICAgICAgICAgIlZhbHVlIG9mIHR5cGUgXCIiICsgdmFsdWVfZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgKworICAgICAgICAgICAgIlwiIHN0b3JlZCBpbiBnb29nbGUucHJvdG9idWYuQW55IGhhcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICB2YWx1ZS0+QXBwZW5kVG9TdHJpbmcoc2VyaWFsaXplZF92YWx1ZSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gQ29uc3VtZXMgYSB0b2tlbiBhbmQgY29uZmlybXMgdGhhdCBpdCBtYXRjaGVzIHRoYXQgc3BlY2lmaWVkIGluIHRoZQorICAvLyB2YWx1ZSBwYXJhbWV0ZXIuIFJldHVybnMgZmFsc2UgaWYgdGhlIHRva2VuIGZvdW5kIGRvZXMgbm90IG1hdGNoIHRoYXQKKyAgLy8gd2hpY2ggd2FzIHNwZWNpZmllZC4KKyAgYm9vbCBDb25zdW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjdXJyZW50X3ZhbHVlID0gdG9rZW5pemVyXy5jdXJyZW50KCkudGV4dDsKKworICAgIGlmIChjdXJyZW50X3ZhbHVlICE9IHZhbHVlKSB7CisgICAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgXCIiICsgdmFsdWUgKyAiXCIsIGZvdW5kIFwiIiArIGN1cnJlbnRfdmFsdWUgKworICAgICAgICAgICAgICAgICAgIlwiLiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRva2VuaXplcl8uTmV4dCgpOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBTaW1pbGFyIHRvIGBDb25zdW1lYCwgYnV0IHRoZSBmb2xsb3dpbmcgdG9rZW4gbWF5IGJlIHRva2VuaXplZCBhcworICAvLyBUWVBFX1dISVRFU1BBQ0UuCisgIGJvb2wgQ29uc3VtZUJlZm9yZVdoaXRlc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgLy8gUmVwb3J0IHdoaXRlc3BhY2UgYWZ0ZXIgdGhpcyB0b2tlbiwgYnV0IG9ubHkgb25jZS4KKyAgICB0b2tlbml6ZXJfLnNldF9yZXBvcnRfd2hpdGVzcGFjZSh0cnVlKTsKKyAgICBib29sIHJlc3VsdCA9IENvbnN1bWUodmFsdWUpOworICAgIHRva2VuaXplcl8uc2V0X3JlcG9ydF93aGl0ZXNwYWNlKGZhbHNlKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLy8gQXR0ZW1wdHMgdG8gY29uc3VtZSB0aGUgc3VwcGxpZWQgdmFsdWUuIFJldHVybnMgZmFsc2UgaWYgYSB0aGUKKyAgLy8gdG9rZW4gZm91bmQgZG9lcyBub3QgbWF0Y2ggdGhlIHZhbHVlIHNwZWNpZmllZC4KKyAgYm9vbCBUcnlDb25zdW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIGlmICh0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0ID09IHZhbHVlKSB7CisgICAgICB0b2tlbml6ZXJfLk5leHQoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gU2ltaWxhciB0byBgVHJ5Q29uc3VtZWAsIGJ1dCB0aGUgZm9sbG93aW5nIHRva2VuIG1heSBiZSB0b2tlbml6ZWQgYXMKKyAgLy8gVFlQRV9XSElURVNQQUNFLgorICBib29sIFRyeUNvbnN1bWVCZWZvcmVXaGl0ZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIC8vIFJlcG9ydCB3aGl0ZXNwYWNlIGFmdGVyIHRoaXMgdG9rZW4sIGJ1dCBvbmx5IG9uY2UuCisgICAgdG9rZW5pemVyXy5zZXRfcmVwb3J0X3doaXRlc3BhY2UodHJ1ZSk7CisgICAgYm9vbCByZXN1bHQgPSBUcnlDb25zdW1lKHZhbHVlKTsKKyAgICB0b2tlbml6ZXJfLnNldF9yZXBvcnRfd2hpdGVzcGFjZShmYWxzZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGJvb2wgVHJ5Q29uc3VtZVdoaXRlc3BhY2UoKSB7CisgICAgaGFkX3NpbGVudF9tYXJrZXJfID0gZmFsc2U7CisgICAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9XSElURVNQQUNFKSkgeworICAgICAgaWYgKHRva2VuaXplcl8uY3VycmVudCgpLnRleHQgPT0KKyAgICAgICAgICBTdHJDYXQoIiAiLCBpbnRlcm5hbDo6a0RlYnVnU3RyaW5nU2lsZW50TWFya2VyRm9yRGV0ZWN0aW9uKSkgeworICAgICAgICBoYWRfc2lsZW50X21hcmtlcl8gPSB0cnVlOworICAgICAgfQorICAgICAgdG9rZW5pemVyXy5OZXh0KCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQW4gaW50ZXJuYWwgaW5zdGFuY2Ugb2YgdGhlIFRva2VuaXplcidzIGVycm9yIGNvbGxlY3RvciwgdXNlZCB0bworICAvLyBjb2xsZWN0IGFueSBiYXNlLWxldmVsIHBhcnNlIGVycm9ycyBhbmQgZmVlZCB0aGVtIHRvIHRoZSBQYXJzZXJJbXBsLgorICBjbGFzcyBQYXJzZXJFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBpbzo6RXJyb3JDb2xsZWN0b3IgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IFBhcnNlckVycm9yQ29sbGVjdG9yKFRleHRGb3JtYXQ6OlBhcnNlcjo6UGFyc2VySW1wbCogcGFyc2VyKQorICAgICAgICA6IHBhcnNlcl8ocGFyc2VyKSB7fQorCisgICAgflBhcnNlckVycm9yQ29sbGVjdG9yKCkgb3ZlcnJpZGUge30KKworICAgIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSBvdmVycmlkZSB7CisgICAgICBwYXJzZXJfLT5SZXBvcnRFcnJvcihsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOworICAgIH0KKworICAgIHZvaWQgQWRkV2FybmluZyhpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIG92ZXJyaWRlIHsKKyAgICAgIHBhcnNlcl8tPlJlcG9ydFdhcm5pbmcobGluZSwgY29sdW1uLCBtZXNzYWdlKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhcnNlckVycm9yQ29sbGVjdG9yKTsKKyAgICBUZXh0Rm9ybWF0OjpQYXJzZXI6OlBhcnNlckltcGwqIHBhcnNlcl87CisgIH07CisKKyAgaW86OkVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3JfOworICBjb25zdCBUZXh0Rm9ybWF0OjpGaW5kZXIqIGZpbmRlcl87CisgIFBhcnNlSW5mb1RyZWUqIHBhcnNlX2luZm9fdHJlZV87CisgIFBhcnNlckVycm9yQ29sbGVjdG9yIHRva2VuaXplcl9lcnJvcl9jb2xsZWN0b3JfOworICBpbzo6VG9rZW5pemVyIHRva2VuaXplcl87CisgIGNvbnN0IERlc2NyaXB0b3IqIHJvb3RfbWVzc2FnZV90eXBlXzsKKyAgU2luZ3VsYXJPdmVyd3JpdGVQb2xpY3kgc2luZ3VsYXJfb3ZlcndyaXRlX3BvbGljeV87CisgIGNvbnN0IGJvb2wgYWxsb3dfY2FzZV9pbnNlbnNpdGl2ZV9maWVsZF87CisgIGNvbnN0IGJvb2wgYWxsb3dfdW5rbm93bl9maWVsZF87CisgIGNvbnN0IGJvb2wgYWxsb3dfdW5rbm93bl9leHRlbnNpb25fOworICBjb25zdCBib29sIGFsbG93X3Vua25vd25fZW51bV87CisgIGNvbnN0IGJvb2wgYWxsb3dfZmllbGRfbnVtYmVyXzsKKyAgY29uc3QgYm9vbCBhbGxvd19wYXJ0aWFsXzsKKyAgY29uc3QgaW50IGluaXRpYWxfcmVjdXJzaW9uX2xpbWl0XzsKKyAgaW50IHJlY3Vyc2lvbl9saW1pdF87CisgIGJvb2wgaGFkX3NpbGVudF9tYXJrZXJfOworICBib29sIGhhZF9lcnJvcnNfOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcm5hbCBjbGFzcyBmb3Igd3JpdGluZyB0ZXh0IHRvIHRoZSBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0uIEFkYXB0ZWQKKy8vIGZyb20gdGhlIFByaW50ZXIgZm91bmQgaW4gLy9uZXQvcHJvdG8yL2lvL3B1YmxpYy9wcmludGVyLmgKK2NsYXNzIFRleHRGb3JtYXQ6OlByaW50ZXI6OlRleHRHZW5lcmF0b3IKKyAgICA6IHB1YmxpYyBUZXh0Rm9ybWF0OjpCYXNlVGV4dEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBUZXh0R2VuZXJhdG9yKGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0aWFsX2luZGVudF9sZXZlbCkKKyAgICAgIDogb3V0cHV0XyhvdXRwdXQpLAorICAgICAgICBidWZmZXJfKG51bGxwdHIpLAorICAgICAgICBidWZmZXJfc2l6ZV8oMCksCisgICAgICAgIGF0X3N0YXJ0X29mX2xpbmVfKHRydWUpLAorICAgICAgICBmYWlsZWRfKGZhbHNlKSwKKyAgICAgICAgaW5zZXJ0X3NpbGVudF9tYXJrZXJfKGZhbHNlKSwKKyAgICAgICAgaW5kZW50X2xldmVsXyhpbml0aWFsX2luZGVudF9sZXZlbCksCisgICAgICAgIGluaXRpYWxfaW5kZW50X2xldmVsXyhpbml0aWFsX2luZGVudF9sZXZlbCkge30KKworICBleHBsaWNpdCBUZXh0R2VuZXJhdG9yKGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5zZXJ0X3NpbGVudF9tYXJrZXIsIGludCBpbml0aWFsX2luZGVudF9sZXZlbCkKKyAgICAgIDogb3V0cHV0XyhvdXRwdXQpLAorICAgICAgICBidWZmZXJfKG51bGxwdHIpLAorICAgICAgICBidWZmZXJfc2l6ZV8oMCksCisgICAgICAgIGF0X3N0YXJ0X29mX2xpbmVfKHRydWUpLAorICAgICAgICBmYWlsZWRfKGZhbHNlKSwKKyAgICAgICAgaW5zZXJ0X3NpbGVudF9tYXJrZXJfKGluc2VydF9zaWxlbnRfbWFya2VyKSwKKyAgICAgICAgaW5kZW50X2xldmVsXyhpbml0aWFsX2luZGVudF9sZXZlbCksCisgICAgICAgIGluaXRpYWxfaW5kZW50X2xldmVsXyhpbml0aWFsX2luZGVudF9sZXZlbCkge30KKworICB+VGV4dEdlbmVyYXRvcigpIG92ZXJyaWRlIHsKKyAgICAvLyBPbmx5IEJhY2tVcCgpIGlmIHdlJ3JlIHN1cmUgd2UndmUgc3VjY2Vzc2Z1bGx5IGNhbGxlZCBOZXh0KCkgYXQgbGVhc3QKKyAgICAvLyBvbmNlLgorICAgIGlmICghZmFpbGVkXykgeworICAgICAgb3V0cHV0Xy0+QmFja1VwKGJ1ZmZlcl9zaXplXyk7CisgICAgfQorICB9CisKKyAgLy8gSW5kZW50IHRleHQgYnkgdHdvIHNwYWNlcy4gIEFmdGVyIGNhbGxpbmcgSW5kZW50KCksIHR3byBzcGFjZXMgd2lsbCBiZQorICAvLyBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvZiB0ZXh0LiAgSW5kZW50KCkgbWF5IGJlIGNhbGxlZAorICAvLyBtdWx0aXBsZSB0aW1lcyB0byBwcm9kdWNlIGRlZXBlciBpbmRlbnRzLgorICB2b2lkIEluZGVudCgpIG92ZXJyaWRlIHsgKytpbmRlbnRfbGV2ZWxfOyB9CisKKyAgLy8gUmVkdWNlcyB0aGUgY3VycmVudCBpbmRlbnQgbGV2ZWwgYnkgdHdvIHNwYWNlcywgb3IgY3Jhc2hlcyBpZiB0aGUgaW5kZW50CisgIC8vIGxldmVsIGlzIHplcm8uCisgIHZvaWQgT3V0ZGVudCgpIG92ZXJyaWRlIHsKKyAgICBpZiAoaW5kZW50X2xldmVsXyA9PSAwIHx8IGluZGVudF9sZXZlbF8gPCBpbml0aWFsX2luZGVudF9sZXZlbF8pIHsKKyAgICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiIE91dGRlbnQoKSB3aXRob3V0IG1hdGNoaW5nIEluZGVudCgpLiI7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLS1pbmRlbnRfbGV2ZWxfOworICB9CisKKyAgc2l6ZV90IEdldEN1cnJlbnRJbmRlbnRhdGlvblNpemUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIDIgKiBpbmRlbnRfbGV2ZWxfOworICB9CisKKyAgLy8gUHJpbnQgdGV4dCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgeworICAgIGlmIChpbmRlbnRfbGV2ZWxfID4gMCkgeworICAgICAgc2l6ZV90IHBvcyA9IDA7ICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdlJ3ZlIHdyaXR0ZW4gc28gZmFyLgorICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKHRleHRbaV0gPT0gJ1xuJykgeworICAgICAgICAgIC8vIFNhdyBuZXdsaW5lLiAgSWYgdGhlcmUgaXMgbW9yZSB0ZXh0LCB3ZSBtYXkgbmVlZCB0byBpbnNlcnQgYW4KKyAgICAgICAgICAvLyBpbmRlbnQgaGVyZS4gIFNvLCB3cml0ZSB3aGF0IHdlIGhhdmUgc28gZmFyLCBpbmNsdWRpbmcgdGhlICdcbicuCisgICAgICAgICAgV3JpdGUodGV4dCArIHBvcywgaSAtIHBvcyArIDEpOworICAgICAgICAgIHBvcyA9IGkgKyAxOworCisgICAgICAgICAgLy8gU2V0dGluZyB0aGlzIHRydWUgd2lsbCBjYXVzZSB0aGUgbmV4dCBXcml0ZSgpIHRvIGluc2VydCBhbiBpbmRlbnQKKyAgICAgICAgICAvLyBmaXJzdC4KKyAgICAgICAgICBhdF9zdGFydF9vZl9saW5lXyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIFdyaXRlIHRoZSByZXN0LgorICAgICAgV3JpdGUodGV4dCArIHBvcywgc2l6ZSAtIHBvcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIFdyaXRlKHRleHQsIHNpemUpOworICAgICAgaWYgKHNpemUgPiAwICYmIHRleHRbc2l6ZSAtIDFdID09ICdcbicpIHsKKyAgICAgICAgYXRfc3RhcnRfb2ZfbGluZV8gPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFRydWUgaWYgYW55IHdyaXRlIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBmYWlsZWQuICAoV2UgZG9uJ3QganVzdAorICAvLyBjcmFzaCBpbiB0aGlzIGNhc2UgYmVjYXVzZSB0aGlzIGlzIGFuIEkvTyBmYWlsdXJlLCBub3QgYSBwcm9ncmFtbWluZworICAvLyBlcnJvci4pCisgIGJvb2wgZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gZmFpbGVkXzsgfQorCisgIHZvaWQgUHJpbnRNYXliZVdpdGhNYXJrZXIoU3RyaW5nUGllY2UgdGV4dCkgeworICAgIFByaW50KHRleHQuZGF0YSgpLCB0ZXh0LnNpemUoKSk7CisgICAgaWYgKENvbnN1bWVJbnNlcnRTaWxlbnRNYXJrZXIoKSkgeworICAgICAgUHJpbnRMaXRlcmFsKGludGVybmFsOjprRGVidWdTdHJpbmdTaWxlbnRNYXJrZXIpOworICAgIH0KKyAgfQorCisgIHZvaWQgUHJpbnRNYXliZVdpdGhNYXJrZXIoU3RyaW5nUGllY2UgdGV4dF9oZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIHRleHRfdGFpbCkgeworICAgIFByaW50KHRleHRfaGVhZC5kYXRhKCksIHRleHRfaGVhZC5zaXplKCkpOworICAgIGlmIChDb25zdW1lSW5zZXJ0U2lsZW50TWFya2VyKCkpIHsKKyAgICAgIFByaW50TGl0ZXJhbChpbnRlcm5hbDo6a0RlYnVnU3RyaW5nU2lsZW50TWFya2VyKTsKKyAgICB9CisgICAgUHJpbnQodGV4dF90YWlsLmRhdGEoKSwgdGV4dF90YWlsLnNpemUoKSk7CisgIH0KKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXh0R2VuZXJhdG9yKTsKKworICB2b2lkIFdyaXRlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKGZhaWxlZF8pIHJldHVybjsKKyAgICBpZiAoc2l6ZSA9PSAwKSByZXR1cm47CisKKyAgICBpZiAoYXRfc3RhcnRfb2ZfbGluZV8pIHsKKyAgICAgIC8vIEluc2VydCBhbiBpbmRlbnQuCisgICAgICBhdF9zdGFydF9vZl9saW5lXyA9IGZhbHNlOworICAgICAgV3JpdGVJbmRlbnQoKTsKKyAgICAgIGlmIChmYWlsZWRfKSByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHN0YXRpY19jYXN0PGludDY0X3Q+KHNpemUpID4gYnVmZmVyX3NpemVfKSB7CisgICAgICAvLyBEYXRhIGV4Y2VlZHMgc3BhY2UgaW4gdGhlIGJ1ZmZlci4gIENvcHkgd2hhdCB3ZSBjYW4gYW5kIHJlcXVlc3QgYQorICAgICAgLy8gbmV3IGJ1ZmZlci4KKyAgICAgIGlmIChidWZmZXJfc2l6ZV8gPiAwKSB7CisgICAgICAgIG1lbWNweShidWZmZXJfLCBkYXRhLCBidWZmZXJfc2l6ZV8pOworICAgICAgICBkYXRhICs9IGJ1ZmZlcl9zaXplXzsKKyAgICAgICAgc2l6ZSAtPSBidWZmZXJfc2l6ZV87CisgICAgICB9CisgICAgICB2b2lkKiB2b2lkX2J1ZmZlciA9IG51bGxwdHI7CisgICAgICBmYWlsZWRfID0gIW91dHB1dF8tPk5leHQoJnZvaWRfYnVmZmVyLCAmYnVmZmVyX3NpemVfKTsKKyAgICAgIGlmIChmYWlsZWRfKSByZXR1cm47CisgICAgICBidWZmZXJfID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4odm9pZF9idWZmZXIpOworICAgIH0KKworICAgIC8vIEJ1ZmZlciBpcyBiaWcgZW5vdWdoIHRvIHJlY2VpdmUgdGhlIGRhdGE7IGNvcHkgaXQuCisgICAgbWVtY3B5KGJ1ZmZlcl8sIGRhdGEsIHNpemUpOworICAgIGJ1ZmZlcl8gKz0gc2l6ZTsKKyAgICBidWZmZXJfc2l6ZV8gLT0gc2l6ZTsKKyAgfQorCisgIHZvaWQgV3JpdGVJbmRlbnQoKSB7CisgICAgaWYgKGluZGVudF9sZXZlbF8gPT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBHT09HTEVfRENIRUNLKCFmYWlsZWRfKTsKKyAgICBpbnQgc2l6ZSA9IEdldEN1cnJlbnRJbmRlbnRhdGlvblNpemUoKTsKKworICAgIHdoaWxlIChzaXplID4gYnVmZmVyX3NpemVfKSB7CisgICAgICAvLyBEYXRhIGV4Y2VlZHMgc3BhY2UgaW4gdGhlIGJ1ZmZlci4gV3JpdGUgd2hhdCB3ZSBjYW4gYW5kIHJlcXVlc3QgYSBuZXcKKyAgICAgIC8vIGJ1ZmZlci4KKyAgICAgIGlmIChidWZmZXJfc2l6ZV8gPiAwKSB7CisgICAgICAgIG1lbXNldChidWZmZXJfLCAnICcsIGJ1ZmZlcl9zaXplXyk7CisgICAgICB9CisgICAgICBzaXplIC09IGJ1ZmZlcl9zaXplXzsKKyAgICAgIHZvaWQqIHZvaWRfYnVmZmVyOworICAgICAgZmFpbGVkXyA9ICFvdXRwdXRfLT5OZXh0KCZ2b2lkX2J1ZmZlciwgJmJ1ZmZlcl9zaXplXyk7CisgICAgICBpZiAoZmFpbGVkXykgcmV0dXJuOworICAgICAgYnVmZmVyXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHZvaWRfYnVmZmVyKTsKKyAgICB9CisKKyAgICAvLyBCdWZmZXIgaXMgYmlnIGVub3VnaCB0byByZWNlaXZlIHRoZSBkYXRhOyBjb3B5IGl0LgorICAgIG1lbXNldChidWZmZXJfLCAnICcsIHNpemUpOworICAgIGJ1ZmZlcl8gKz0gc2l6ZTsKKyAgICBidWZmZXJfc2l6ZV8gLT0gc2l6ZTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiBpbnNlcnRfc2lsZW50X21hcmtlcl8uIElmIGl0IGlzIHRydWUsIHNldCBpdAorICAvLyB0byBmYWxzZSBhcyB3ZSBhc3N1bWUgdGhhdCBhIHNpbGVudCBtYXJrZXIgaXMgaW5zZXJ0ZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMKKyAgLy8gZnVuY3Rpb24uCisgIGJvb2wgQ29uc3VtZUluc2VydFNpbGVudE1hcmtlcigpIHsKKyAgICBpZiAoaW5zZXJ0X3NpbGVudF9tYXJrZXJfKSB7CisgICAgICBpbnNlcnRfc2lsZW50X21hcmtlcl8gPSBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIGNvbnN0IG91dHB1dF87CisgIGNoYXIqIGJ1ZmZlcl87CisgIGludCBidWZmZXJfc2l6ZV87CisgIGJvb2wgYXRfc3RhcnRfb2ZfbGluZV87CisgIGJvb2wgZmFpbGVkXzsKKyAgLy8gVGhpcyBmbGFnIGlzIGZhbHNlIHdoZW4gaW5zZXJ0aW5nIHNpbGVudCBtYXJrZXIgaXMgZGlzYWJsZWQgb3IgYSBzaWxlbnQKKyAgLy8gbWFya2VyIGhhcyBiZWVuIGluc2VydGVkLgorICBib29sIGluc2VydF9zaWxlbnRfbWFya2VyXzsKKworICBpbnQgaW5kZW50X2xldmVsXzsKKyAgaW50IGluaXRpYWxfaW5kZW50X2xldmVsXzsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEFuIGludGVybmFsIGZpZWxkIHZhbHVlIHByaW50ZXIgdGhhdCBtYXkgaW5zZXJ0IGEgc2lsZW50IG1hcmtlciBpbgorLy8gIERlYnVnU3RyaW5ncy4KK2NsYXNzIFRleHRGb3JtYXQ6OlByaW50ZXI6OkRlYnVnU3RyaW5nRmllbGRWYWx1ZVByaW50ZXIKKyAgICA6IHB1YmxpYyBUZXh0Rm9ybWF0OjpGYXN0RmllbGRWYWx1ZVByaW50ZXIgeworIHB1YmxpYzoKKyAgdm9pZCBQcmludE1lc3NhZ2VTdGFydChjb25zdCBNZXNzYWdlJiAvKm1lc3NhZ2UqLywgaW50IC8qZmllbGRfaW5kZXgqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypmaWVsZF9jb3VudCovLCBib29sIHNpbmdsZV9saW5lX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIC8vIFRoaXMgaXMgc2FmZSBhcyBvbmx5IFRleHRHZW5lcmF0b3IgaXMgdXNlZCB3aXRoCisgICAgLy8gRGVidWdTdHJpbmdGaWVsZFZhbHVlUHJpbnRlci4KKyAgICBUZXh0R2VuZXJhdG9yKiB0ZXh0X2dlbmVyYXRvciA9IHN0YXRpY19jYXN0PFRleHRHZW5lcmF0b3IqPihnZW5lcmF0b3IpOworICAgIGlmIChzaW5nbGVfbGluZV9tb2RlKSB7CisgICAgICB0ZXh0X2dlbmVyYXRvci0+UHJpbnRNYXliZVdpdGhNYXJrZXIoIiAiLCAieyAiKTsKKyAgICB9IGVsc2UgeworICAgICAgdGV4dF9nZW5lcmF0b3ItPlByaW50TWF5YmVXaXRoTWFya2VyKCIgIiwgIntcbiIpOworICAgIH0KKyAgfQorfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQW4gaW50ZXJuYWwgZmllbGQgdmFsdWUgcHJpbnRlciB0aGF0IGVzY2FwZSBVVEY4IHN0cmluZ3MuCitjbGFzcyBUZXh0Rm9ybWF0OjpQcmludGVyOjpGYXN0RmllbGRWYWx1ZVByaW50ZXJVdGY4RXNjYXBpbmcKKyAgICA6IHB1YmxpYyBUZXh0Rm9ybWF0OjpQcmludGVyOjpEZWJ1Z1N0cmluZ0ZpZWxkVmFsdWVQcmludGVyIHsKKyBwdWJsaWM6CisgIHZvaWQgUHJpbnRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbCwKKyAgICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0OjpCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgZ2VuZXJhdG9yLT5QcmludExpdGVyYWwoIlwiIik7CisgICAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhzdHJpbmdzOjpVdGY4U2FmZUNFc2NhcGUodmFsKSk7CisgICAgZ2VuZXJhdG9yLT5QcmludExpdGVyYWwoIlwiIik7CisgIH0KKyAgdm9pZCBQcmludEJ5dGVzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwsCisgICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0OjpCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEZhc3RGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRTdHJpbmcodmFsLCBnZW5lcmF0b3IpOworICB9Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkZWZhdWx0IEZpbmRlciBmb3IgZXh0ZW5zaW9ucy4KK1RleHRGb3JtYXQ6OkZpbmRlcjo6fkZpbmRlcigpIHt9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvciogVGV4dEZvcm1hdDo6RmluZGVyOjpGaW5kRXh0ZW5zaW9uKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdCB7CisgIHJldHVybiBEZWZhdWx0RmluZGVyRmluZEV4dGVuc2lvbihtZXNzYWdlLCBuYW1lKTsKK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKiBUZXh0Rm9ybWF0OjpGaW5kZXI6OkZpbmRFeHRlbnNpb25CeU51bWJlcigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbnVtYmVyKSBjb25zdCB7CisgIHJldHVybiBEZWZhdWx0RmluZGVyRmluZEV4dGVuc2lvbkJ5TnVtYmVyKGRlc2NyaXB0b3IsIG51bWJlcik7Cit9CisKK2NvbnN0IERlc2NyaXB0b3IqIFRleHRGb3JtYXQ6OkZpbmRlcjo6RmluZEFueVR5cGUoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3QgeworICByZXR1cm4gRGVmYXVsdEZpbmRlckZpbmRBbnlUeXBlKG1lc3NhZ2UsIHByZWZpeCwgbmFtZSk7Cit9CisKK01lc3NhZ2VGYWN0b3J5KiBUZXh0Rm9ybWF0OjpGaW5kZXI6OkZpbmRFeHRlbnNpb25GYWN0b3J5KAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogLypmaWVsZCovKSBjb25zdCB7CisgIHJldHVybiBudWxscHRyOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGV4dEZvcm1hdDo6UGFyc2VyOjpQYXJzZXIoKQorICAgIDogZXJyb3JfY29sbGVjdG9yXyhudWxscHRyKSwKKyAgICAgIGZpbmRlcl8obnVsbHB0ciksCisgICAgICBwYXJzZV9pbmZvX3RyZWVfKG51bGxwdHIpLAorICAgICAgYWxsb3dfcGFydGlhbF8oZmFsc2UpLAorICAgICAgYWxsb3dfY2FzZV9pbnNlbnNpdGl2ZV9maWVsZF8oZmFsc2UpLAorICAgICAgYWxsb3dfdW5rbm93bl9maWVsZF8oZmFsc2UpLAorICAgICAgYWxsb3dfdW5rbm93bl9leHRlbnNpb25fKGZhbHNlKSwKKyAgICAgIGFsbG93X3Vua25vd25fZW51bV8oZmFsc2UpLAorICAgICAgYWxsb3dfZmllbGRfbnVtYmVyXyhmYWxzZSksCisgICAgICBhbGxvd19yZWxheGVkX3doaXRlc3BhY2VfKGZhbHNlKSwKKyAgICAgIGFsbG93X3Npbmd1bGFyX292ZXJ3cml0ZXNfKGZhbHNlKSwKKyAgICAgIHJlY3Vyc2lvbl9saW1pdF8oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSkge30KKworVGV4dEZvcm1hdDo6UGFyc2VyOjp+UGFyc2VyKCkge30KKworbmFtZXNwYWNlIHsKKworYm9vbCBDaGVja1BhcnNlSW5wdXRTaXplKFN0cmluZ1BpZWNlIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKSB7CisgIGlmIChpbnB1dC5zaXplKCkgPiBJTlRfTUFYKSB7CisgICAgZXJyb3JfY29sbGVjdG9yLT5BZGRFcnJvcigKKyAgICAgICAgLTEsIDAsCisgICAgICAgIFN0ckNhdCgKKyAgICAgICAgICAgICJJbnB1dCBzaXplIHRvbyBsYXJnZTogIiwgc3RhdGljX2Nhc3Q8aW50NjRfdD4oaW5wdXQuc2l6ZSgpKSwKKyAgICAgICAgICAgICIgYnl0ZXMiLCAiID4gIiwgSU5UX01BWCwgIiBieXRlcy4iKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworYm9vbCBUZXh0Rm9ybWF0OjpQYXJzZXI6OlBhcnNlKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5DbGVhcigpOworCisgIFBhcnNlckltcGw6OlNpbmd1bGFyT3ZlcndyaXRlUG9saWN5IG92ZXJ3cml0ZXNfcG9saWN5ID0KKyAgICAgIGFsbG93X3Npbmd1bGFyX292ZXJ3cml0ZXNfID8gUGFyc2VySW1wbDo6QUxMT1dfU0lOR1VMQVJfT1ZFUldSSVRFUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQYXJzZXJJbXBsOjpGT1JCSURfU0lOR1VMQVJfT1ZFUldSSVRFUzsKKworICBQYXJzZXJJbXBsIHBhcnNlcihvdXRwdXQtPkdldERlc2NyaXB0b3IoKSwgaW5wdXQsIGVycm9yX2NvbGxlY3Rvcl8sIGZpbmRlcl8sCisgICAgICAgICAgICAgICAgICAgIHBhcnNlX2luZm9fdHJlZV8sIG92ZXJ3cml0ZXNfcG9saWN5LAorICAgICAgICAgICAgICAgICAgICBhbGxvd19jYXNlX2luc2Vuc2l0aXZlX2ZpZWxkXywgYWxsb3dfdW5rbm93bl9maWVsZF8sCisgICAgICAgICAgICAgICAgICAgIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uXywgYWxsb3dfdW5rbm93bl9lbnVtXywKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dfZmllbGRfbnVtYmVyXywgYWxsb3dfcmVsYXhlZF93aGl0ZXNwYWNlXywKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dfcGFydGlhbF8sIHJlY3Vyc2lvbl9saW1pdF8pOworICByZXR1cm4gTWVyZ2VVc2luZ0ltcGwoaW5wdXQsIG91dHB1dCwgJnBhcnNlcik7Cit9CisKK2Jvb2wgVGV4dEZvcm1hdDo6UGFyc2VyOjpQYXJzZUZyb21TdHJpbmcoQ29uc3RTdHJpbmdQYXJhbSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7CisgIERPKENoZWNrUGFyc2VJbnB1dFNpemUoaW5wdXQsIGVycm9yX2NvbGxlY3Rvcl8pKTsKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXRfc3RyZWFtKGlucHV0LmRhdGEoKSwgaW5wdXQuc2l6ZSgpKTsKKyAgcmV0dXJuIFBhcnNlKCZpbnB1dF9zdHJlYW0sIG91dHB1dCk7Cit9CisKK2Jvb2wgVGV4dEZvcm1hdDo6UGFyc2VyOjpNZXJnZShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7CisgIFBhcnNlckltcGwgcGFyc2VyKG91dHB1dC0+R2V0RGVzY3JpcHRvcigpLCBpbnB1dCwgZXJyb3JfY29sbGVjdG9yXywgZmluZGVyXywKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VfaW5mb190cmVlXywgUGFyc2VySW1wbDo6QUxMT1dfU0lOR1VMQVJfT1ZFUldSSVRFUywKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dfY2FzZV9pbnNlbnNpdGl2ZV9maWVsZF8sIGFsbG93X3Vua25vd25fZmllbGRfLAorICAgICAgICAgICAgICAgICAgICBhbGxvd191bmtub3duX2V4dGVuc2lvbl8sIGFsbG93X3Vua25vd25fZW51bV8sCisgICAgICAgICAgICAgICAgICAgIGFsbG93X2ZpZWxkX251bWJlcl8sIGFsbG93X3JlbGF4ZWRfd2hpdGVzcGFjZV8sCisgICAgICAgICAgICAgICAgICAgIGFsbG93X3BhcnRpYWxfLCByZWN1cnNpb25fbGltaXRfKTsKKyAgcmV0dXJuIE1lcmdlVXNpbmdJbXBsKGlucHV0LCBvdXRwdXQsICZwYXJzZXIpOworfQorCitib29sIFRleHRGb3JtYXQ6OlBhcnNlcjo6TWVyZ2VGcm9tU3RyaW5nKENvbnN0U3RyaW5nUGFyYW0gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCkgeworICBETyhDaGVja1BhcnNlSW5wdXRTaXplKGlucHV0LCBlcnJvcl9jb2xsZWN0b3JfKSk7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShpbnB1dC5kYXRhKCksIGlucHV0LnNpemUoKSk7CisgIHJldHVybiBNZXJnZSgmaW5wdXRfc3RyZWFtLCBvdXRwdXQpOworfQorCitib29sIFRleHRGb3JtYXQ6OlBhcnNlcjo6TWVyZ2VVc2luZ0ltcGwoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIC8qIGlucHV0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZXJJbXBsKiBwYXJzZXJfaW1wbCkgeworICBpZiAoIXBhcnNlcl9pbXBsLT5QYXJzZShvdXRwdXQpKSByZXR1cm4gZmFsc2U7CisgIGlmICghYWxsb3dfcGFydGlhbF8gJiYgIW91dHB1dC0+SXNJbml0aWFsaXplZCgpKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1pc3NpbmdfZmllbGRzOworICAgIG91dHB1dC0+RmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCZtaXNzaW5nX2ZpZWxkcyk7CisgICAgcGFyc2VyX2ltcGwtPlJlcG9ydEVycm9yKC0xLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luKG1pc3NpbmdfZmllbGRzLCAiLCAiKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFRleHRGb3JtYXQ6OlBhcnNlcjo6UGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShpbnB1dC5kYXRhKCksIGlucHV0LnNpemUoKSk7CisgIFBhcnNlckltcGwgcGFyc2VyKAorICAgICAgb3V0cHV0LT5HZXREZXNjcmlwdG9yKCksICZpbnB1dF9zdHJlYW0sIGVycm9yX2NvbGxlY3Rvcl8sIGZpbmRlcl8sCisgICAgICBwYXJzZV9pbmZvX3RyZWVfLCBQYXJzZXJJbXBsOjpBTExPV19TSU5HVUxBUl9PVkVSV1JJVEVTLAorICAgICAgYWxsb3dfY2FzZV9pbnNlbnNpdGl2ZV9maWVsZF8sIGFsbG93X3Vua25vd25fZmllbGRfLAorICAgICAgYWxsb3dfdW5rbm93bl9leHRlbnNpb25fLCBhbGxvd191bmtub3duX2VudW1fLCBhbGxvd19maWVsZF9udW1iZXJfLAorICAgICAgYWxsb3dfcmVsYXhlZF93aGl0ZXNwYWNlXywgYWxsb3dfcGFydGlhbF8sIHJlY3Vyc2lvbl9saW1pdF8pOworICByZXR1cm4gcGFyc2VyLlBhcnNlRmllbGQoZmllbGQsIG91dHB1dCk7Cit9CisKKy8qIHN0YXRpYyAqLyBib29sIFRleHRGb3JtYXQ6OlBhcnNlKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCkgeworICByZXR1cm4gUGFyc2VyKCkuUGFyc2UoaW5wdXQsIG91dHB1dCk7Cit9CisKKy8qIHN0YXRpYyAqLyBib29sIFRleHRGb3JtYXQ6Ok1lcmdlKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCkgeworICByZXR1cm4gUGFyc2VyKCkuTWVyZ2UoaW5wdXQsIG91dHB1dCk7Cit9CisKKy8qIHN0YXRpYyAqLyBib29sIFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhDb25zdFN0cmluZ1BhcmFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCkgeworICByZXR1cm4gUGFyc2VyKCkuUGFyc2VGcm9tU3RyaW5nKGlucHV0LCBvdXRwdXQpOworfQorCisvKiBzdGF0aWMgKi8gYm9vbCBUZXh0Rm9ybWF0OjpNZXJnZUZyb21TdHJpbmcoQ29uc3RTdHJpbmdQYXJhbSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBvdXRwdXQpIHsKKyAgcmV0dXJuIFBhcnNlcigpLk1lcmdlRnJvbVN0cmluZyhpbnB1dCwgb3V0cHV0KTsKK30KKworI3VuZGVmIERPCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUZXh0Rm9ybWF0OjpCYXNlVGV4dEdlbmVyYXRvcjo6fkJhc2VUZXh0R2VuZXJhdG9yKCkge30KKworbmFtZXNwYWNlIHsKKworLy8gQSBCYXNlVGV4dEdlbmVyYXRvciB0aGF0IHdyaXRlcyB0byBhIHN0cmluZy4KK2NsYXNzIFN0cmluZ0Jhc2VUZXh0R2VuZXJhdG9yIDogcHVibGljIFRleHRGb3JtYXQ6OkJhc2VUZXh0R2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIHZvaWQgUHJpbnQoY29uc3QgY2hhciogdGV4dCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKKyAgICBvdXRwdXRfLmFwcGVuZCh0ZXh0LCBzaXplKTsKKyAgfQorCisvLyBTb21lIGNvbXBpbGVycyBkbyBub3Qgc3VwcG9ydCByZWYtcXVhbGlmaWVycyBldmVuIGluIEMrKzExIG1vZGUuCisvLyBEaXNhYmxlIHRoZSBvcHRpbWl6YXRpb24gZm9yIG5vdyBhbmQgcmV2aXNpdCBpdCBsYXRlci4KKyNpZiAwICAvLyBMQU5HX0NYWDExCisgIHN0ZDo6c3RyaW5nIENvbnN1bWUoKSAmJiB7IHJldHVybiBzdGQ6Om1vdmUob3V0cHV0Xyk7IH0KKyNlbHNlICAvLyAhTEFOR19DWFgxMQorICBjb25zdCBzdGQ6OnN0cmluZyYgR2V0KCkgeyByZXR1cm4gb3V0cHV0XzsgfQorI2VuZGlmICAvLyBMQU5HX0NYWDExCisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBvdXRwdXRfOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBGaWVsZFZhbHVlUHJpbnRlci4gV2UganVzdCBkZWxlZ2F0ZSB0aGUKKy8vIGltcGxlbWVudGF0aW9uIHRvIHRoZSBkZWZhdWx0IEZhc3RGaWVsZFZhbHVlUHJpbnRlciB0byBhdm9pZCBkdXBsaWNhdGluZyB0aGUKKy8vIGxvZ2ljLgorVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OkZpZWxkVmFsdWVQcmludGVyKCkge30KK1RleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjp+RmllbGRWYWx1ZVByaW50ZXIoKSB7fQorCisjaWYgMCAgLy8gTEFOR19DWFgxMQorI2RlZmluZSBGT1JXQVJEX0lNUEwoZm4sIC4uLikgICAgICAgICAgICBcCisgIFN0cmluZ0Jhc2VUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcjsgICAgIFwKKyAgZGVsZWdhdGVfLmZuKF9fVkFfQVJHU19fLCAmZ2VuZXJhdG9yKTsgXAorICByZXR1cm4gc3RkOjptb3ZlKGdlbmVyYXRvcikuQ29uc3VtZSgpCisjZWxzZSAgLy8gIUxBTkdfQ1hYMTEKKyNkZWZpbmUgRk9SV0FSRF9JTVBMKGZuLCAuLi4pICAgICAgICAgICAgXAorICBTdHJpbmdCYXNlVGV4dEdlbmVyYXRvciBnZW5lcmF0b3I7ICAgICBcCisgIGRlbGVnYXRlXy5mbihfX1ZBX0FSR1NfXywgJmdlbmVyYXRvcik7IFwKKyAgcmV0dXJuIGdlbmVyYXRvci5HZXQoKQorI2VuZGlmICAvLyBMQU5HX0NYWDExCisKK3N0ZDo6c3RyaW5nIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpQcmludEJvb2woYm9vbCB2YWwpIGNvbnN0IHsKKyAgRk9SV0FSRF9JTVBMKFByaW50Qm9vbCwgdmFsKTsKK30KK3N0ZDo6c3RyaW5nIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpQcmludEludDMyKGludDMyX3QgdmFsKSBjb25zdCB7CisgIEZPUldBUkRfSU1QTChQcmludEludDMyLCB2YWwpOworfQorc3RkOjpzdHJpbmcgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50VUludDMyKHVpbnQzMl90IHZhbCkgY29uc3QgeworICBGT1JXQVJEX0lNUEwoUHJpbnRVSW50MzIsIHZhbCk7Cit9CitzdGQ6OnN0cmluZyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRJbnQ2NChpbnQ2NF90IHZhbCkgY29uc3QgeworICBGT1JXQVJEX0lNUEwoUHJpbnRJbnQ2NCwgdmFsKTsKK30KK3N0ZDo6c3RyaW5nIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpQcmludFVJbnQ2NCh1aW50NjRfdCB2YWwpIGNvbnN0IHsKKyAgRk9SV0FSRF9JTVBMKFByaW50VUludDY0LCB2YWwpOworfQorc3RkOjpzdHJpbmcgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50RmxvYXQoZmxvYXQgdmFsKSBjb25zdCB7CisgIEZPUldBUkRfSU1QTChQcmludEZsb2F0LCB2YWwpOworfQorc3RkOjpzdHJpbmcgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50RG91YmxlKGRvdWJsZSB2YWwpIGNvbnN0IHsKKyAgRk9SV0FSRF9JTVBMKFByaW50RG91YmxlLCB2YWwpOworfQorc3RkOjpzdHJpbmcgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50U3RyaW5nKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwpIGNvbnN0IHsKKyAgRk9SV0FSRF9JTVBMKFByaW50U3RyaW5nLCB2YWwpOworfQorc3RkOjpzdHJpbmcgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50Qnl0ZXMoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbCkgY29uc3QgeworICByZXR1cm4gUHJpbnRTdHJpbmcodmFsKTsKK30KK3N0ZDo6c3RyaW5nIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpQcmludEVudW0oCisgICAgaW50MzJfdCB2YWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdCB7CisgIEZPUldBUkRfSU1QTChQcmludEVudW0sIHZhbCwgbmFtZSk7Cit9CitzdGQ6OnN0cmluZyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRGaWVsZE5hbWUoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIEZPUldBUkRfSU1QTChQcmludEZpZWxkTmFtZSwgbWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQpOworfQorc3RkOjpzdHJpbmcgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50TWVzc2FnZVN0YXJ0KAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGludCBmaWVsZF9pbmRleCwgaW50IGZpZWxkX2NvdW50LAorICAgIGJvb2wgc2luZ2xlX2xpbmVfbW9kZSkgY29uc3QgeworICBGT1JXQVJEX0lNUEwoUHJpbnRNZXNzYWdlU3RhcnQsIG1lc3NhZ2UsIGZpZWxkX2luZGV4LCBmaWVsZF9jb3VudCwKKyAgICAgICAgICAgICAgIHNpbmdsZV9saW5lX21vZGUpOworfQorc3RkOjpzdHJpbmcgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50TWVzc2FnZUVuZCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBpbnQgZmllbGRfaW5kZXgsIGludCBmaWVsZF9jb3VudCwKKyAgICBib29sIHNpbmdsZV9saW5lX21vZGUpIGNvbnN0IHsKKyAgRk9SV0FSRF9JTVBMKFByaW50TWVzc2FnZUVuZCwgbWVzc2FnZSwgZmllbGRfaW5kZXgsIGZpZWxkX2NvdW50LAorICAgICAgICAgICAgICAgc2luZ2xlX2xpbmVfbW9kZSk7Cit9CisjdW5kZWYgRk9SV0FSRF9JTVBMCisKK1RleHRGb3JtYXQ6OkZhc3RGaWVsZFZhbHVlUHJpbnRlcjo6RmFzdEZpZWxkVmFsdWVQcmludGVyKCkge30KK1RleHRGb3JtYXQ6OkZhc3RGaWVsZFZhbHVlUHJpbnRlcjo6fkZhc3RGaWVsZFZhbHVlUHJpbnRlcigpIHt9Cit2b2lkIFRleHRGb3JtYXQ6OkZhc3RGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRCb29sKAorICAgIGJvb2wgdmFsLCBCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCB7CisgIGlmICh2YWwpIHsKKyAgICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgidHJ1ZSIpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRvci0+UHJpbnRMaXRlcmFsKCJmYWxzZSIpOworICB9Cit9Cit2b2lkIFRleHRGb3JtYXQ6OkZhc3RGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRJbnQzMigKKyAgICBpbnQzMl90IHZhbCwgQmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3QgeworICBnZW5lcmF0b3ItPlByaW50U3RyaW5nKFN0ckNhdCh2YWwpKTsKK30KK3ZvaWQgVGV4dEZvcm1hdDo6RmFzdEZpZWxkVmFsdWVQcmludGVyOjpQcmludFVJbnQzMigKKyAgICB1aW50MzJfdCB2YWwsIEJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhTdHJDYXQodmFsKSk7Cit9Cit2b2lkIFRleHRGb3JtYXQ6OkZhc3RGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRJbnQ2NCgKKyAgICBpbnQ2NF90IHZhbCwgQmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3QgeworICBnZW5lcmF0b3ItPlByaW50U3RyaW5nKFN0ckNhdCh2YWwpKTsKK30KK3ZvaWQgVGV4dEZvcm1hdDo6RmFzdEZpZWxkVmFsdWVQcmludGVyOjpQcmludFVJbnQ2NCgKKyAgICB1aW50NjRfdCB2YWwsIEJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhTdHJDYXQodmFsKSk7Cit9Cit2b2lkIFRleHRGb3JtYXQ6OkZhc3RGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRGbG9hdCgKKyAgICBmbG9hdCB2YWwsIEJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyghc3RkOjppc25hbih2YWwpID8gU2ltcGxlRnRvYSh2YWwpIDogIm5hbiIpOworfQordm9pZCBUZXh0Rm9ybWF0OjpGYXN0RmllbGRWYWx1ZVByaW50ZXI6OlByaW50RG91YmxlKAorICAgIGRvdWJsZSB2YWwsIEJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyghc3RkOjppc25hbih2YWwpID8gU2ltcGxlRHRvYSh2YWwpIDogIm5hbiIpOworfQordm9pZCBUZXh0Rm9ybWF0OjpGYXN0RmllbGRWYWx1ZVByaW50ZXI6OlByaW50RW51bSgKKyAgICBpbnQzMl90IC8qdmFsKi8sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgIEJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhuYW1lKTsKK30KKwordm9pZCBUZXh0Rm9ybWF0OjpGYXN0RmllbGRWYWx1ZVByaW50ZXI6OlByaW50U3RyaW5nKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwsIEJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgZ2VuZXJhdG9yLT5QcmludExpdGVyYWwoIlwiIik7CisgIGdlbmVyYXRvci0+UHJpbnRTdHJpbmcoQ0VzY2FwZSh2YWwpKTsKKyAgZ2VuZXJhdG9yLT5QcmludExpdGVyYWwoIlwiIik7Cit9Cit2b2lkIFRleHRGb3JtYXQ6OkZhc3RGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRCeXRlcygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsLCBCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCB7CisgIFByaW50U3RyaW5nKHZhbCwgZ2VuZXJhdG9yKTsKK30KK3ZvaWQgVGV4dEZvcm1hdDo6RmFzdEZpZWxkVmFsdWVQcmludGVyOjpQcmludEZpZWxkTmFtZSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBpbnQgLypmaWVsZF9pbmRleCovLCBpbnQgLypmaWVsZF9jb3VudCovLAorICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgQmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3QgeworICBQcmludEZpZWxkTmFtZShtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCwgZ2VuZXJhdG9yKTsKK30KK3ZvaWQgVGV4dEZvcm1hdDo6RmFzdEZpZWxkVmFsdWVQcmludGVyOjpQcmludEZpZWxkTmFtZSgKKyAgICBjb25zdCBNZXNzYWdlJiAvKm1lc3NhZ2UqLywgY29uc3QgUmVmbGVjdGlvbiogLypyZWZsZWN0aW9uKi8sCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgQmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3QgeworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgZ2VuZXJhdG9yLT5QcmludExpdGVyYWwoIlsiKTsKKyAgICBnZW5lcmF0b3ItPlByaW50U3RyaW5nKGZpZWxkLT5QcmludGFibGVOYW1lRm9yRXh0ZW5zaW9uKCkpOworICAgIGdlbmVyYXRvci0+UHJpbnRMaXRlcmFsKCJdIik7CisgIH0gZWxzZSBpZiAoZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICAvLyBHcm91cHMgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggdGhlaXIgb3JpZ2luYWwgY2FwaXRhbGl6YXRpb24uCisgICAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhmaWVsZC0+bWVzc2FnZV90eXBlKCktPm5hbWUoKSk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhmaWVsZC0+bmFtZSgpKTsKKyAgfQorfQordm9pZCBUZXh0Rm9ybWF0OjpGYXN0RmllbGRWYWx1ZVByaW50ZXI6OlByaW50TWVzc2FnZVN0YXJ0KAorICAgIGNvbnN0IE1lc3NhZ2UmIC8qbWVzc2FnZSovLCBpbnQgLypmaWVsZF9pbmRleCovLCBpbnQgLypmaWVsZF9jb3VudCovLAorICAgIGJvb2wgc2luZ2xlX2xpbmVfbW9kZSwgQmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3QgeworICBpZiAoc2luZ2xlX2xpbmVfbW9kZSkgeworICAgIGdlbmVyYXRvci0+UHJpbnRMaXRlcmFsKCIgeyAiKTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgiIHtcbiIpOworICB9Cit9Citib29sIFRleHRGb3JtYXQ6OkZhc3RGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRNZXNzYWdlQ29udGVudCgKKyAgICBjb25zdCBNZXNzYWdlJiAvKm1lc3NhZ2UqLywgaW50IC8qZmllbGRfaW5kZXgqLywgaW50IC8qZmllbGRfY291bnQqLywKKyAgICBib29sIC8qc2luZ2xlX2xpbmVfbW9kZSovLCBCYXNlVGV4dEdlbmVyYXRvciogLypnZW5lcmF0b3IqLykgY29uc3QgeworICByZXR1cm4gZmFsc2U7ICAvLyBVc2UgdGhlIGRlZmF1bHQgcHJpbnRpbmcgZnVuY3Rpb24uCit9Cit2b2lkIFRleHRGb3JtYXQ6OkZhc3RGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRNZXNzYWdlRW5kKAorICAgIGNvbnN0IE1lc3NhZ2UmIC8qbWVzc2FnZSovLCBpbnQgLypmaWVsZF9pbmRleCovLCBpbnQgLypmaWVsZF9jb3VudCovLAorICAgIGJvb2wgc2luZ2xlX2xpbmVfbW9kZSwgQmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3QgeworICBpZiAoc2luZ2xlX2xpbmVfbW9kZSkgeworICAgIGdlbmVyYXRvci0+UHJpbnRMaXRlcmFsKCJ9ICIpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRvci0+UHJpbnRMaXRlcmFsKCJ9XG4iKTsKKyAgfQorfQorCituYW1lc3BhY2UgeworCisvLyBBIGxlZ2FjeSBjb21wYXRpYmlsaXR5IHdyYXBwZXIuIFRha2VzIG93bmVyc2hpcCBvZiB0aGUgZGVsZWdhdGUuCitjbGFzcyBGaWVsZFZhbHVlUHJpbnRlcldyYXBwZXIgOiBwdWJsaWMgVGV4dEZvcm1hdDo6RmFzdEZpZWxkVmFsdWVQcmludGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEZpZWxkVmFsdWVQcmludGVyV3JhcHBlcigKKyAgICAgIGNvbnN0IFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyKiBkZWxlZ2F0ZSkKKyAgICAgIDogZGVsZWdhdGVfKGRlbGVnYXRlKSB7fQorCisgIHZvaWQgU2V0RGVsZWdhdGUoY29uc3QgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXIqIGRlbGVnYXRlKSB7CisgICAgZGVsZWdhdGVfLnJlc2V0KGRlbGVnYXRlKTsKKyAgfQorCisgIHZvaWQgUHJpbnRCb29sKGJvb2wgdmFsLAorICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0OjpCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhkZWxlZ2F0ZV8tPlByaW50Qm9vbCh2YWwpKTsKKyAgfQorICB2b2lkIFByaW50SW50MzIoaW50MzJfdCB2YWwsCisgICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0OjpCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhkZWxlZ2F0ZV8tPlByaW50SW50MzIodmFsKSk7CisgIH0KKyAgdm9pZCBQcmludFVJbnQzMih1aW50MzJfdCB2YWwsCisgICAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdDo6QmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGdlbmVyYXRvci0+UHJpbnRTdHJpbmcoZGVsZWdhdGVfLT5QcmludFVJbnQzMih2YWwpKTsKKyAgfQorICB2b2lkIFByaW50SW50NjQoaW50NjRfdCB2YWwsCisgICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0OjpCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhkZWxlZ2F0ZV8tPlByaW50SW50NjQodmFsKSk7CisgIH0KKyAgdm9pZCBQcmludFVJbnQ2NCh1aW50NjRfdCB2YWwsCisgICAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdDo6QmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGdlbmVyYXRvci0+UHJpbnRTdHJpbmcoZGVsZWdhdGVfLT5QcmludFVJbnQ2NCh2YWwpKTsKKyAgfQorICB2b2lkIFByaW50RmxvYXQoZmxvYXQgdmFsLAorICAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdDo6QmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGdlbmVyYXRvci0+UHJpbnRTdHJpbmcoZGVsZWdhdGVfLT5QcmludEZsb2F0KHZhbCkpOworICB9CisgIHZvaWQgUHJpbnREb3VibGUoZG91YmxlIHZhbCwKKyAgICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0OjpCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhkZWxlZ2F0ZV8tPlByaW50RG91YmxlKHZhbCkpOworICB9CisgIHZvaWQgUHJpbnRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbCwKKyAgICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0OjpCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhkZWxlZ2F0ZV8tPlByaW50U3RyaW5nKHZhbCkpOworICB9CisgIHZvaWQgUHJpbnRCeXRlcyhjb25zdCBzdGQ6OnN0cmluZyYgdmFsLAorICAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdDo6QmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGdlbmVyYXRvci0+UHJpbnRTdHJpbmcoZGVsZWdhdGVfLT5QcmludEJ5dGVzKHZhbCkpOworICB9CisgIHZvaWQgUHJpbnRFbnVtKGludDMyX3QgdmFsLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdDo6QmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGdlbmVyYXRvci0+UHJpbnRTdHJpbmcoZGVsZWdhdGVfLT5QcmludEVudW0odmFsLCBuYW1lKSk7CisgIH0KKyAgdm9pZCBQcmludEZpZWxkTmFtZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBpbnQgLypmaWVsZF9pbmRleCovLAorICAgICAgICAgICAgICAgICAgICAgIGludCAvKmZpZWxkX2NvdW50Ki8sIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0OjpCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgZ2VuZXJhdG9yLT5QcmludFN0cmluZygKKyAgICAgICAgZGVsZWdhdGVfLT5QcmludEZpZWxkTmFtZShtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCkpOworICB9CisgIHZvaWQgUHJpbnRGaWVsZE5hbWUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgIFRleHRGb3JtYXQ6OkJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBnZW5lcmF0b3ItPlByaW50U3RyaW5nKAorICAgICAgICBkZWxlZ2F0ZV8tPlByaW50RmllbGROYW1lKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkKSk7CisgIH0KKyAgdm9pZCBQcmludE1lc3NhZ2VTdGFydCgKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGludCBmaWVsZF9pbmRleCwgaW50IGZpZWxkX2NvdW50LAorICAgICAgYm9vbCBzaW5nbGVfbGluZV9tb2RlLAorICAgICAgVGV4dEZvcm1hdDo6QmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGdlbmVyYXRvci0+UHJpbnRTdHJpbmcoZGVsZWdhdGVfLT5QcmludE1lc3NhZ2VTdGFydCgKKyAgICAgICAgbWVzc2FnZSwgZmllbGRfaW5kZXgsIGZpZWxkX2NvdW50LCBzaW5nbGVfbGluZV9tb2RlKSk7CisgIH0KKyAgdm9pZCBQcmludE1lc3NhZ2VFbmQoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBpbnQgZmllbGRfaW5kZXgsIGludCBmaWVsZF9jb3VudCwKKyAgICAgIGJvb2wgc2luZ2xlX2xpbmVfbW9kZSwKKyAgICAgIFRleHRGb3JtYXQ6OkJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBnZW5lcmF0b3ItPlByaW50U3RyaW5nKGRlbGVnYXRlXy0+UHJpbnRNZXNzYWdlRW5kKAorICAgICAgICBtZXNzYWdlLCBmaWVsZF9pbmRleCwgZmllbGRfY291bnQsIHNpbmdsZV9saW5lX21vZGUpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyPiBkZWxlZ2F0ZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworY29uc3QgY2hhciogY29uc3QgVGV4dEZvcm1hdDo6UHJpbnRlcjo6a0RvTm90UGFyc2UgPQorICAgICJETyBOT1QgUEFSU0U6IGZpZWxkcyBtYXkgYmUgc3RyaXBwZWQgYW5kIG1pc3NpbmcuXG4iOworCitUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludGVyKCkKKyAgICA6IGluaXRpYWxfaW5kZW50X2xldmVsXygwKSwKKyAgICAgIHNpbmdsZV9saW5lX21vZGVfKGZhbHNlKSwKKyAgICAgIHVzZV9maWVsZF9udW1iZXJfKGZhbHNlKSwKKyAgICAgIHVzZV9zaG9ydF9yZXBlYXRlZF9wcmltaXRpdmVzXyhmYWxzZSksCisgICAgICBpbnNlcnRfc2lsZW50X21hcmtlcl8oZmFsc2UpLAorICAgICAgaGlkZV91bmtub3duX2ZpZWxkc18oZmFsc2UpLAorICAgICAgcHJpbnRfbWVzc2FnZV9maWVsZHNfaW5faW5kZXhfb3JkZXJfKGZhbHNlKSwKKyAgICAgIGV4cGFuZF9hbnlfKGZhbHNlKSwKKyAgICAgIHRydW5jYXRlX3N0cmluZ19maWVsZF9sb25nZXJfdGhhbl8oMExMKSwKKyAgICAgIGZpbmRlcl8obnVsbHB0cikgeworICBTZXRVc2VVdGY4U3RyaW5nRXNjYXBpbmcoZmFsc2UpOworfQorCit2b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlNldFVzZVV0ZjhTdHJpbmdFc2NhcGluZyhib29sIGFzX3V0ZjgpIHsKKyAgU2V0RGVmYXVsdEZpZWxkVmFsdWVQcmludGVyKGFzX3V0ZjggPyBuZXcgRmFzdEZpZWxkVmFsdWVQcmludGVyVXRmOEVzY2FwaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgRGVidWdTdHJpbmdGaWVsZFZhbHVlUHJpbnRlcigpKTsKK30KKwordm9pZCBUZXh0Rm9ybWF0OjpQcmludGVyOjpTZXREZWZhdWx0RmllbGRWYWx1ZVByaW50ZXIoCisgICAgY29uc3QgRmllbGRWYWx1ZVByaW50ZXIqIHByaW50ZXIpIHsKKyAgZGVmYXVsdF9maWVsZF92YWx1ZV9wcmludGVyXy5yZXNldChuZXcgRmllbGRWYWx1ZVByaW50ZXJXcmFwcGVyKHByaW50ZXIpKTsKK30KKwordm9pZCBUZXh0Rm9ybWF0OjpQcmludGVyOjpTZXREZWZhdWx0RmllbGRWYWx1ZVByaW50ZXIoCisgICAgY29uc3QgRmFzdEZpZWxkVmFsdWVQcmludGVyKiBwcmludGVyKSB7CisgIGRlZmF1bHRfZmllbGRfdmFsdWVfcHJpbnRlcl8ucmVzZXQocHJpbnRlcik7Cit9CisKK2Jvb2wgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UmVnaXN0ZXJGaWVsZFZhbHVlUHJpbnRlcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBjb25zdCBGaWVsZFZhbHVlUHJpbnRlciogcHJpbnRlcikgeworICBpZiAoZmllbGQgPT0gbnVsbHB0ciB8fCBwcmludGVyID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RkOjp1bmlxdWVfcHRyPEZpZWxkVmFsdWVQcmludGVyV3JhcHBlcj4gd3JhcHBlcigKKyAgICAgIG5ldyBGaWVsZFZhbHVlUHJpbnRlcldyYXBwZXIobnVsbHB0cikpOworICBhdXRvIHBhaXIgPSBjdXN0b21fcHJpbnRlcnNfLmluc2VydChzdGQ6Om1ha2VfcGFpcihmaWVsZCwgbnVsbHB0cikpOworICBpZiAocGFpci5zZWNvbmQpIHsKKyAgICB3cmFwcGVyLT5TZXREZWxlZ2F0ZShwcmludGVyKTsKKyAgICBwYWlyLmZpcnN0LT5zZWNvbmQgPSBzdGQ6Om1vdmUod3JhcHBlcik7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UmVnaXN0ZXJGaWVsZFZhbHVlUHJpbnRlcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBjb25zdCBGYXN0RmllbGRWYWx1ZVByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKGZpZWxkID09IG51bGxwdHIgfHwgcHJpbnRlciA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGF1dG8gcGFpciA9IGN1c3RvbV9wcmludGVyc18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGZpZWxkLCBudWxscHRyKSk7CisgIGlmIChwYWlyLnNlY29uZCkgeworICAgIHBhaXIuZmlyc3QtPnNlY29uZC5yZXNldChwcmludGVyKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBUZXh0Rm9ybWF0OjpQcmludGVyOjpSZWdpc3Rlck1lc3NhZ2VQcmludGVyKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE1lc3NhZ2VQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChkZXNjcmlwdG9yID09IG51bGxwdHIgfHwgcHJpbnRlciA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGF1dG8gcGFpciA9CisgICAgICBjdXN0b21fbWVzc2FnZV9wcmludGVyc18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGRlc2NyaXB0b3IsIG51bGxwdHIpKTsKKyAgaWYgKHBhaXIuc2Vjb25kKSB7CisgICAgcGFpci5maXJzdC0+c2Vjb25kLnJlc2V0KHByaW50ZXIpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50VG9TdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0cHV0KSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0sob3V0cHV0KSA8PCAib3V0cHV0IHNwZWNpZmllZCBpcyBudWxscHRyIjsKKworICBvdXRwdXQtPmNsZWFyKCk7CisgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbShvdXRwdXQpOworCisgIHJldHVybiBQcmludChtZXNzYWdlLCAmb3V0cHV0X3N0cmVhbSk7Cit9CisKK2Jvb2wgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRVbmtub3duRmllbGRzVG9TdHJpbmcoCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywgc3RkOjpzdHJpbmcqIG91dHB1dCkgY29uc3QgeworICBHT09HTEVfRENIRUNLKG91dHB1dCkgPDwgIm91dHB1dCBzcGVjaWZpZWQgaXMgbnVsbHB0ciI7CisKKyAgb3V0cHV0LT5jbGVhcigpOworICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0ob3V0cHV0KTsKKyAgcmV0dXJuIFByaW50VW5rbm93bkZpZWxkcyh1bmtub3duX2ZpZWxkcywgJm91dHB1dF9zdHJlYW0pOworfQorCitib29sIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIFRleHRHZW5lcmF0b3IgZ2VuZXJhdG9yKG91dHB1dCwgaW5zZXJ0X3NpbGVudF9tYXJrZXJfLCBpbml0aWFsX2luZGVudF9sZXZlbF8pOworCisgIFByaW50KG1lc3NhZ2UsICZnZW5lcmF0b3IpOworCisgIC8vIE91dHB1dCBmYWxzZSBpZiB0aGUgZ2VuZXJhdG9yIGZhaWxlZCBpbnRlcm5hbGx5LgorICByZXR1cm4gIWdlbmVyYXRvci5mYWlsZWQoKTsKK30KKworLy8gTWF4aW11bSByZWN1cnNpb24gZGVwdGggZm9yIGhldXJpc3RpY2FsbHkgcHJpbnRpbmcgb3V0IGxlbmd0aC1kZWxpbWl0ZWQKKy8vIHVua25vd24gZmllbGRzIGFzIG1lc3NhZ2VzLgorc3RhdGljIGNvbnN0ZXhwciBpbnQga1Vua25vd25GaWVsZFJlY3Vyc2lvbkxpbWl0ID0gMTA7CisKK2Jvb2wgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRVbmtub3duRmllbGRzKAorICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3Iob3V0cHV0LCBpbml0aWFsX2luZGVudF9sZXZlbF8pOworCisgIFByaW50VW5rbm93bkZpZWxkcyh1bmtub3duX2ZpZWxkcywgJmdlbmVyYXRvciwga1Vua25vd25GaWVsZFJlY3Vyc2lvbkxpbWl0KTsKKworICAvLyBPdXRwdXQgZmFsc2UgaWYgdGhlIGdlbmVyYXRvciBmYWlsZWQgaW50ZXJuYWxseS4KKyAgcmV0dXJuICFnZW5lcmF0b3IuZmFpbGVkKCk7Cit9CisKK25hbWVzcGFjZSB7CisvLyBDb21wYXJpc29uIGZ1bmN0b3IgZm9yIHNvcnRpbmcgRmllbGREZXNjcmlwdG9ycyBieSBmaWVsZCBpbmRleC4KKy8vIE5vcm1hbCBmaWVsZHMgaGF2ZSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIGV4dGVuc2lvbnMuCitzdHJ1Y3QgRmllbGRJbmRleFNvcnRlciB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGxlZnQsCisgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJpZ2h0KSBjb25zdCB7CisgICAgaWYgKGxlZnQtPmlzX2V4dGVuc2lvbigpICYmIHJpZ2h0LT5pc19leHRlbnNpb24oKSkgeworICAgICAgcmV0dXJuIGxlZnQtPm51bWJlcigpIDwgcmlnaHQtPm51bWJlcigpOworICAgIH0gZWxzZSBpZiAobGVmdC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHJpZ2h0LT5pc19leHRlbnNpb24oKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBsZWZ0LT5pbmRleCgpIDwgcmlnaHQtPmluZGV4KCk7CisgICAgfQorICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworYm9vbCBUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludEFueShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB0eXBlX3VybF9maWVsZDsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZV9maWVsZDsKKyAgaWYgKCFpbnRlcm5hbDo6R2V0QW55RmllbGREZXNjcmlwdG9ycyhtZXNzYWdlLCAmdHlwZV91cmxfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2ZpZWxkKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICAvLyBFeHRyYWN0IHRoZSBmdWxsIHR5cGUgbmFtZSBmcm9tIHRoZSB0eXBlX3VybCBmaWVsZC4KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfdXJsID0gcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIHR5cGVfdXJsX2ZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgdXJsX3ByZWZpeDsKKyAgc3RkOjpzdHJpbmcgZnVsbF90eXBlX25hbWU7CisgIGlmICghaW50ZXJuYWw6OlBhcnNlQW55VHlwZVVybCh0eXBlX3VybCwgJnVybF9wcmVmaXgsICZmdWxsX3R5cGVfbmFtZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBQcmludCB0aGUgInZhbHVlIiBpbiB0ZXh0LgorICBjb25zdCBEZXNjcmlwdG9yKiB2YWx1ZV9kZXNjcmlwdG9yID0KKyAgICAgIGZpbmRlcl8gPyBmaW5kZXJfLT5GaW5kQW55VHlwZShtZXNzYWdlLCB1cmxfcHJlZml4LCBmdWxsX3R5cGVfbmFtZSkKKyAgICAgICAgICAgICAgOiBEZWZhdWx0RmluZGVyRmluZEFueVR5cGUobWVzc2FnZSwgdXJsX3ByZWZpeCwgZnVsbF90eXBlX25hbWUpOworICBpZiAodmFsdWVfZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiQ2FuJ3QgcHJpbnQgcHJvdG8gY29udGVudDogcHJvdG8gdHlwZSAiIDw8IHR5cGVfdXJsCisgICAgICAgICAgICAgICAgIDw8ICIgbm90IGZvdW5kIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGZhY3Rvcnk7CisgIHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlPiB2YWx1ZV9tZXNzYWdlKAorICAgICAgZmFjdG9yeS5HZXRQcm90b3R5cGUodmFsdWVfZGVzY3JpcHRvciktPk5ldygpKTsKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZF92YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCB2YWx1ZV9maWVsZCk7CisgIGlmICghdmFsdWVfbWVzc2FnZS0+UGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWRfdmFsdWUpKSB7CisgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCB0eXBlX3VybCA8PCAiOiBmYWlsZWQgdG8gcGFyc2UgY29udGVudHMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgiWyIpOworICBnZW5lcmF0b3ItPlByaW50U3RyaW5nKHR5cGVfdXJsKTsKKyAgZ2VuZXJhdG9yLT5QcmludExpdGVyYWwoIl0iKTsKKyAgY29uc3QgRmFzdEZpZWxkVmFsdWVQcmludGVyKiBwcmludGVyID0gR2V0RmllbGRQcmludGVyKHZhbHVlX2ZpZWxkKTsKKyAgcHJpbnRlci0+UHJpbnRNZXNzYWdlU3RhcnQobWVzc2FnZSwgLTEsIDAsIHNpbmdsZV9saW5lX21vZGVfLCBnZW5lcmF0b3IpOworICBnZW5lcmF0b3ItPkluZGVudCgpOworICBQcmludCgqdmFsdWVfbWVzc2FnZSwgZ2VuZXJhdG9yKTsKKyAgZ2VuZXJhdG9yLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50TWVzc2FnZUVuZChtZXNzYWdlLCAtMSwgMCwgc2luZ2xlX2xpbmVfbW9kZV8sIGdlbmVyYXRvcik7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3QgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIGlmICghcmVmbGVjdGlvbikgeworICAgIC8vIFRoaXMgbWVzc2FnZSBkb2VzIG5vdCBwcm92aWRlIGFueSB3YXkgdG8gZGVzY3JpYmUgaXRzIHN0cnVjdHVyZS4KKyAgICAvLyBQYXJzZSBpdCBhZ2FpbiBpbiBhbiBVbmtub3duRmllbGRTZXQsIGFuZCBkaXNwbGF5IHRoaXMgaW5zdGVhZC4KKyAgICBVbmtub3duRmllbGRTZXQgdW5rbm93bl9maWVsZHM7CisgICAgeworICAgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZCA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0KHNlcmlhbGl6ZWQuZGF0YSgpLCBzZXJpYWxpemVkLnNpemUoKSk7CisgICAgICB1bmtub3duX2ZpZWxkcy5QYXJzZUZyb21aZXJvQ29weVN0cmVhbSgmaW5wdXQpOworICAgIH0KKyAgICBQcmludFVua25vd25GaWVsZHModW5rbm93bl9maWVsZHMsIGdlbmVyYXRvciwga1Vua25vd25GaWVsZFJlY3Vyc2lvbkxpbWl0KTsKKyAgICByZXR1cm47CisgIH0KKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOworICBhdXRvIGl0ciA9IGN1c3RvbV9tZXNzYWdlX3ByaW50ZXJzXy5maW5kKGRlc2NyaXB0b3IpOworICBpZiAoaXRyICE9IGN1c3RvbV9tZXNzYWdlX3ByaW50ZXJzXy5lbmQoKSkgeworICAgIGl0ci0+c2Vjb25kLT5QcmludChtZXNzYWdlLCBzaW5nbGVfbGluZV9tb2RlXywgZ2VuZXJhdG9yKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpID09IGludGVybmFsOjprQW55RnVsbFR5cGVOYW1lICYmIGV4cGFuZF9hbnlfICYmCisgICAgICBQcmludEFueShtZXNzYWdlLCBnZW5lcmF0b3IpKSB7CisgICAgcmV0dXJuOworICB9CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgaWYgKGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5tYXBfZW50cnkoKSkgeworICAgIGZpZWxkcy5wdXNoX2JhY2soZGVzY3JpcHRvci0+ZmllbGQoMCkpOworICAgIGZpZWxkcy5wdXNoX2JhY2soZGVzY3JpcHRvci0+ZmllbGQoMSkpOworICB9IGVsc2UgeworICAgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHNPbWl0U3RyaXBwZWQobWVzc2FnZSwgJmZpZWxkcyk7CisgICAgaWYgKHJlZmxlY3Rpb24tPklzTWVzc2FnZVN0cmlwcGVkKG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpKSkgeworICAgICAgZ2VuZXJhdG9yLT5QcmludChrRG9Ob3RQYXJzZSwgc3RkOjpzdHJsZW4oa0RvTm90UGFyc2UpKTsKKyAgICB9CisgIH0KKworICBpZiAocHJpbnRfbWVzc2FnZV9maWVsZHNfaW5faW5kZXhfb3JkZXJfKSB7CisgICAgc3RkOjpzb3J0KGZpZWxkcy5iZWdpbigpLCBmaWVsZHMuZW5kKCksIEZpZWxkSW5kZXhTb3J0ZXIoKSk7CisgIH0KKyAgZm9yIChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkIDogZmllbGRzKSB7CisgICAgUHJpbnRGaWVsZChtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCwgZ2VuZXJhdG9yKTsKKyAgfQorICBpZiAoIWhpZGVfdW5rbm93bl9maWVsZHNfKSB7CisgICAgUHJpbnRVbmtub3duRmllbGRzKHJlZmxlY3Rpb24tPkdldFVua25vd25GaWVsZHMobWVzc2FnZSksIGdlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAga1Vua25vd25GaWVsZFJlY3Vyc2lvbkxpbWl0KTsKKyAgfQorfQorCit2b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50RmllbGRWYWx1ZVRvU3RyaW5nKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dHB1dCkgY29uc3QgeworICBHT09HTEVfRENIRUNLKG91dHB1dCkgPDwgIm91dHB1dCBzcGVjaWZpZWQgaXMgbnVsbHB0ciI7CisKKyAgb3V0cHV0LT5jbGVhcigpOworICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0ob3V0cHV0KTsKKyAgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3IoJm91dHB1dF9zdHJlYW0sIGluaXRpYWxfaW5kZW50X2xldmVsXyk7CisKKyAgUHJpbnRGaWVsZFZhbHVlKG1lc3NhZ2UsIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLCBmaWVsZCwgaW5kZXgsICZnZW5lcmF0b3IpOworfQorCitjbGFzcyBNYXBFbnRyeU1lc3NhZ2VDb21wYXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE1hcEVudHJ5TWVzc2FnZUNvbXBhcmF0b3IoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikKKyAgICAgIDogZmllbGRfKGRlc2NyaXB0b3ItPmZpZWxkKDApKSB7fQorCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBNZXNzYWdlKiBhLCBjb25zdCBNZXNzYWdlKiBiKSB7CisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IGEtPkdldFJlZmxlY3Rpb24oKTsKKyAgICBzd2l0Y2ggKGZpZWxkXy0+Y3BwX3R5cGUoKSkgeworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogeworICAgICAgICBib29sIGZpcnN0ID0gcmVmbGVjdGlvbi0+R2V0Qm9vbCgqYSwgZmllbGRfKTsKKyAgICAgICAgYm9vbCBzZWNvbmQgPSByZWZsZWN0aW9uLT5HZXRCb29sKCpiLCBmaWVsZF8pOworICAgICAgICByZXR1cm4gZmlyc3QgPCBzZWNvbmQ7CisgICAgICB9CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjogeworICAgICAgICBpbnQzMl90IGZpcnN0ID0gcmVmbGVjdGlvbi0+R2V0SW50MzIoKmEsIGZpZWxkXyk7CisgICAgICAgIGludDMyX3Qgc2Vjb25kID0gcmVmbGVjdGlvbi0+R2V0SW50MzIoKmIsIGZpZWxkXyk7CisgICAgICAgIHJldHVybiBmaXJzdCA8IHNlY29uZDsKKyAgICAgIH0KKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OiB7CisgICAgICAgIGludDY0X3QgZmlyc3QgPSByZWZsZWN0aW9uLT5HZXRJbnQ2NCgqYSwgZmllbGRfKTsKKyAgICAgICAgaW50NjRfdCBzZWNvbmQgPSByZWZsZWN0aW9uLT5HZXRJbnQ2NCgqYiwgZmllbGRfKTsKKyAgICAgICAgcmV0dXJuIGZpcnN0IDwgc2Vjb25kOworICAgICAgfQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7CisgICAgICAgIHVpbnQzMl90IGZpcnN0ID0gcmVmbGVjdGlvbi0+R2V0VUludDMyKCphLCBmaWVsZF8pOworICAgICAgICB1aW50MzJfdCBzZWNvbmQgPSByZWZsZWN0aW9uLT5HZXRVSW50MzIoKmIsIGZpZWxkXyk7CisgICAgICAgIHJldHVybiBmaXJzdCA8IHNlY29uZDsKKyAgICAgIH0KKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDogeworICAgICAgICB1aW50NjRfdCBmaXJzdCA9IHJlZmxlY3Rpb24tPkdldFVJbnQ2NCgqYSwgZmllbGRfKTsKKyAgICAgICAgdWludDY0X3Qgc2Vjb25kID0gcmVmbGVjdGlvbi0+R2V0VUludDY0KCpiLCBmaWVsZF8pOworICAgICAgICByZXR1cm4gZmlyc3QgPCBzZWNvbmQ7CisgICAgICB9CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZmlyc3QgPSByZWZsZWN0aW9uLT5HZXRTdHJpbmcoKmEsIGZpZWxkXyk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHNlY29uZCA9IHJlZmxlY3Rpb24tPkdldFN0cmluZygqYiwgZmllbGRfKTsKKyAgICAgICAgcmV0dXJuIGZpcnN0IDwgc2Vjb25kOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJJbnZhbGlkIGtleSBmb3IgbWFwIGZpZWxkLiI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF87Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworY2xhc3MgTWFwRmllbGRQcmludGVySGVscGVyIHsKKyBwdWJsaWM6CisgIC8vIER5bmFtaWNNYXBTb3J0ZXI6OlNvcnQgY2Fubm90IGJlIHVzZWQgYmVjYXVzZSBpdCBlbmZvcmNlcyBzeW5jaW5nIHdpdGgKKyAgLy8gcmVwZWF0ZWQgZmllbGQuCisgIHN0YXRpYyBib29sIFNvcnRNYXAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IE1lc3NhZ2UqPiogc29ydGVkX21hcF9maWVsZCk7CisgIHN0YXRpYyB2b2lkIENvcHlLZXkoY29uc3QgTWFwS2V5JiBrZXksIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjKTsKKyAgc3RhdGljIHZvaWQgQ29weVZhbHVlKGNvbnN0IE1hcFZhbHVlUmVmJiB2YWx1ZSwgTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzYyk7Cit9OworCisvLyBSZXR1cm5zIHRydWUgaWYgZWxlbWVudHMgY29udGFpbmVkIGluIHNvcnRlZF9tYXBfZmllbGQgbmVlZCB0byBiZSByZWxlYXNlZC4KK2Jvb2wgTWFwRmllbGRQcmludGVySGVscGVyOjpTb3J0TWFwKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBNZXNzYWdlKj4qIHNvcnRlZF9tYXBfZmllbGQpIHsKKyAgYm9vbCBuZWVkX3JlbGVhc2UgPSBmYWxzZTsKKyAgY29uc3QgTWFwRmllbGRCYXNlJiBiYXNlID0gKnJlZmxlY3Rpb24tPkdldE1hcERhdGEobWVzc2FnZSwgZmllbGQpOworCisgIGlmIChiYXNlLklzUmVwZWF0ZWRGaWVsZFZhbGlkKCkpIHsKKyAgICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+JiBtYXBfZmllbGQgPQorICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFB0ckZpZWxkSW50ZXJuYWw8TWVzc2FnZT4obWVzc2FnZSwgZmllbGQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwX2ZpZWxkLnNpemUoKTsgKytpKSB7CisgICAgICBzb3J0ZWRfbWFwX2ZpZWxkLT5wdXNoX2JhY2soCisgICAgICAgICAgY29uc3RfY2FzdDxSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+Kj4oJm1hcF9maWVsZCktPk11dGFibGUoaSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBUT0RPKHRlYm9yaW5nKTogRm9yIHBlcmZvcm1hbmNlLCBpbnN0ZWFkIG9mIGNyZWF0aW5nIG1hcCBlbnRyeSBtZXNzYWdlCisgICAgLy8gZm9yIGVhY2ggZWxlbWVudCwganVzdCBzdG9yZSBtYXAga2V5cyBhbmQgc29ydCB0aGVtLgorICAgIGNvbnN0IERlc2NyaXB0b3IqIG1hcF9lbnRyeV9kZXNjID0gZmllbGQtPm1lc3NhZ2VfdHlwZSgpOworICAgIGNvbnN0IE1lc3NhZ2UqIHByb3RvdHlwZSA9CisgICAgICAgIHJlZmxlY3Rpb24tPkdldE1lc3NhZ2VGYWN0b3J5KCktPkdldFByb3RvdHlwZShtYXBfZW50cnlfZGVzYyk7CisgICAgZm9yIChNYXBJdGVyYXRvciBpdGVyID0KKyAgICAgICAgICAgICByZWZsZWN0aW9uLT5NYXBCZWdpbihjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZSksIGZpZWxkKTsKKyAgICAgICAgIGl0ZXIgIT0gcmVmbGVjdGlvbi0+TWFwRW5kKGNvbnN0X2Nhc3Q8TWVzc2FnZSo+KCZtZXNzYWdlKSwgZmllbGQpOworICAgICAgICAgKytpdGVyKSB7CisgICAgICBNZXNzYWdlKiBtYXBfZW50cnlfbWVzc2FnZSA9IHByb3RvdHlwZS0+TmV3KCk7CisgICAgICBDb3B5S2V5KGl0ZXIuR2V0S2V5KCksIG1hcF9lbnRyeV9tZXNzYWdlLCBtYXBfZW50cnlfZGVzYy0+ZmllbGQoMCkpOworICAgICAgQ29weVZhbHVlKGl0ZXIuR2V0VmFsdWVSZWYoKSwgbWFwX2VudHJ5X21lc3NhZ2UsCisgICAgICAgICAgICAgICAgbWFwX2VudHJ5X2Rlc2MtPmZpZWxkKDEpKTsKKyAgICAgIHNvcnRlZF9tYXBfZmllbGQtPnB1c2hfYmFjayhtYXBfZW50cnlfbWVzc2FnZSk7CisgICAgfQorICAgIG5lZWRfcmVsZWFzZSA9IHRydWU7CisgIH0KKworICBNYXBFbnRyeU1lc3NhZ2VDb21wYXJhdG9yIGNvbXBhcmF0b3IoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKTsKKyAgc3RkOjpzdGFibGVfc29ydChzb3J0ZWRfbWFwX2ZpZWxkLT5iZWdpbigpLCBzb3J0ZWRfbWFwX2ZpZWxkLT5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yKTsKKyAgcmV0dXJuIG5lZWRfcmVsZWFzZTsKK30KKwordm9pZCBNYXBGaWVsZFByaW50ZXJIZWxwZXI6OkNvcHlLZXkoY29uc3QgTWFwS2V5JiBrZXksIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2MpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgc3dpdGNoIChmaWVsZF9kZXNjLT5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJOb3Qgc3VwcG9ydGVkLiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgZmllbGRfZGVzYywga2V5LkdldFN0cmluZ1ZhbHVlKCkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgICAgcmVmbGVjdGlvbi0+U2V0SW50NjQobWVzc2FnZSwgZmllbGRfZGVzYywga2V5LkdldEludDY0VmFsdWUoKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6CisgICAgICByZWZsZWN0aW9uLT5TZXRJbnQzMihtZXNzYWdlLCBmaWVsZF9kZXNjLCBrZXkuR2V0SW50MzJWYWx1ZSgpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICByZWZsZWN0aW9uLT5TZXRVSW50NjQobWVzc2FnZSwgZmllbGRfZGVzYywga2V5LkdldFVJbnQ2NFZhbHVlKCkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBmaWVsZF9kZXNjLCBrZXkuR2V0VUludDMyVmFsdWUoKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKKyAgICAgIHJlZmxlY3Rpb24tPlNldEJvb2wobWVzc2FnZSwgZmllbGRfZGVzYywga2V5LkdldEJvb2xWYWx1ZSgpKTsKKyAgICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkIE1hcEZpZWxkUHJpbnRlckhlbHBlcjo6Q29weVZhbHVlKGNvbnN0IE1hcFZhbHVlUmVmJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIHN3aXRjaCAoZmllbGRfZGVzYy0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKKyAgICAgIHJlZmxlY3Rpb24tPlNldERvdWJsZShtZXNzYWdlLCBmaWVsZF9kZXNjLCB2YWx1ZS5HZXREb3VibGVWYWx1ZSgpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDoKKyAgICAgIHJlZmxlY3Rpb24tPlNldEZsb2F0KG1lc3NhZ2UsIGZpZWxkX2Rlc2MsIHZhbHVlLkdldEZsb2F0VmFsdWUoKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgIHJlZmxlY3Rpb24tPlNldEVudW1WYWx1ZShtZXNzYWdlLCBmaWVsZF9kZXNjLCB2YWx1ZS5HZXRFbnVtVmFsdWUoKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTogeworICAgICAgTWVzc2FnZSogc3ViX21lc3NhZ2UgPSB2YWx1ZS5HZXRNZXNzYWdlVmFsdWUoKS5OZXcoKTsKKyAgICAgIHN1Yl9tZXNzYWdlLT5Db3B5RnJvbSh2YWx1ZS5HZXRNZXNzYWdlVmFsdWUoKSk7CisgICAgICByZWZsZWN0aW9uLT5TZXRBbGxvY2F0ZWRNZXNzYWdlKG1lc3NhZ2UsIHN1Yl9tZXNzYWdlLCBmaWVsZF9kZXNjKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIGZpZWxkX2Rlc2MsIHZhbHVlLkdldFN0cmluZ1ZhbHVlKCkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgICAgcmVmbGVjdGlvbi0+U2V0SW50NjQobWVzc2FnZSwgZmllbGRfZGVzYywgdmFsdWUuR2V0SW50NjRWYWx1ZSgpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgIHJlZmxlY3Rpb24tPlNldEludDMyKG1lc3NhZ2UsIGZpZWxkX2Rlc2MsIHZhbHVlLkdldEludDMyVmFsdWUoKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgcmVmbGVjdGlvbi0+U2V0VUludDY0KG1lc3NhZ2UsIGZpZWxkX2Rlc2MsIHZhbHVlLkdldFVJbnQ2NFZhbHVlKCkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBmaWVsZF9kZXNjLCB2YWx1ZS5HZXRVSW50MzJWYWx1ZSgpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgICAgcmVmbGVjdGlvbi0+U2V0Qm9vbChtZXNzYWdlLCBmaWVsZF9kZXNjLCB2YWx1ZS5HZXRCb29sVmFsdWUoKSk7CisgICAgICByZXR1cm47CisgIH0KK30KK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit2b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50RmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCB7CisgIGlmICh1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlc18gJiYgZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYKKyAgICAgIGZpZWxkLT5jcHBfdHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcgJiYKKyAgICAgIGZpZWxkLT5jcHBfdHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgUHJpbnRTaG9ydFJlcGVhdGVkRmllbGQobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQsIGdlbmVyYXRvcik7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50IGNvdW50ID0gMDsKKworICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBjb3VudCA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCk7CisgIH0gZWxzZSBpZiAocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgZmllbGQpIHx8CisgICAgICAgICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5vcHRpb25zKCkubWFwX2VudHJ5KCkpIHsKKyAgICBjb3VudCA9IDE7CisgIH0KKworICBzdGQ6OnZlY3Rvcjxjb25zdCBNZXNzYWdlKj4gc29ydGVkX21hcF9maWVsZDsKKyAgYm9vbCBuZWVkX3JlbGVhc2UgPSBmYWxzZTsKKyAgYm9vbCBpc19tYXAgPSBmaWVsZC0+aXNfbWFwKCk7CisgIGlmIChpc19tYXApIHsKKyAgICBuZWVkX3JlbGVhc2UgPSBpbnRlcm5hbDo6TWFwRmllbGRQcmludGVySGVscGVyOjpTb3J0TWFwKAorICAgICAgICBtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCwgJnNvcnRlZF9tYXBfZmllbGQpOworICB9CisKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgKytqKSB7CisgICAgY29uc3QgaW50IGZpZWxkX2luZGV4ID0gZmllbGQtPmlzX3JlcGVhdGVkKCkgPyBqIDogLTE7CisKKyAgICBQcmludEZpZWxkTmFtZShtZXNzYWdlLCBmaWVsZF9pbmRleCwgY291bnQsIHJlZmxlY3Rpb24sIGZpZWxkLCBnZW5lcmF0b3IpOworCisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBjb25zdCBGYXN0RmllbGRWYWx1ZVByaW50ZXIqIHByaW50ZXIgPSBHZXRGaWVsZFByaW50ZXIoZmllbGQpOworICAgICAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPQorICAgICAgICAgIGZpZWxkLT5pc19yZXBlYXRlZCgpCisgICAgICAgICAgICAgID8gKGlzX21hcCA/ICpzb3J0ZWRfbWFwX2ZpZWxkW2pdCisgICAgICAgICAgICAgICAgICAgICAgICA6IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBmaWVsZCwgaikpCisgICAgICAgICAgICAgIDogcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBmaWVsZCk7CisgICAgICBwcmludGVyLT5QcmludE1lc3NhZ2VTdGFydChzdWJfbWVzc2FnZSwgZmllbGRfaW5kZXgsIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX2xpbmVfbW9kZV8sIGdlbmVyYXRvcik7CisgICAgICBnZW5lcmF0b3ItPkluZGVudCgpOworICAgICAgaWYgKCFwcmludGVyLT5QcmludE1lc3NhZ2VDb250ZW50KHN1Yl9tZXNzYWdlLCBmaWVsZF9pbmRleCwgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX2xpbmVfbW9kZV8sIGdlbmVyYXRvcikpIHsKKyAgICAgICAgUHJpbnQoc3ViX21lc3NhZ2UsIGdlbmVyYXRvcik7CisgICAgICB9CisgICAgICBnZW5lcmF0b3ItPk91dGRlbnQoKTsKKyAgICAgIHByaW50ZXItPlByaW50TWVzc2FnZUVuZChzdWJfbWVzc2FnZSwgZmllbGRfaW5kZXgsIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZV9saW5lX21vZGVfLCBnZW5lcmF0b3IpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0b3ItPlByaW50TWF5YmVXaXRoTWFya2VyKCI6ICIpOworICAgICAgLy8gV3JpdGUgdGhlIGZpZWxkIHZhbHVlLgorICAgICAgUHJpbnRGaWVsZFZhbHVlKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkLCBmaWVsZF9pbmRleCwgZ2VuZXJhdG9yKTsKKyAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgeworICAgICAgICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgiICIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuZXJhdG9yLT5QcmludExpdGVyYWwoIlxuIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKG5lZWRfcmVsZWFzZSkgeworICAgIGZvciAoY29uc3QgTWVzc2FnZSogbWVzc2FnZV90b19kZWxldGUgOiBzb3J0ZWRfbWFwX2ZpZWxkKSB7CisgICAgICBkZWxldGUgbWVzc2FnZV90b19kZWxldGU7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRTaG9ydFJlcGVhdGVkRmllbGQoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgLy8gUHJpbnQgcHJpbWl0aXZlIHJlcGVhdGVkIGZpZWxkIGluIHNob3J0IGZvcm0uCisgIGludCBzaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkKTsKKyAgUHJpbnRGaWVsZE5hbWUobWVzc2FnZSwgLypmaWVsZF9pbmRleD0qLy0xLCAvKmZpZWxkX2NvdW50PSovc2l6ZSwgcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgZmllbGQsIGdlbmVyYXRvcik7CisgIGdlbmVyYXRvci0+UHJpbnRNYXliZVdpdGhNYXJrZXIoIjogIiwgIlsiKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBpZiAoaSA+IDApIGdlbmVyYXRvci0+UHJpbnRMaXRlcmFsKCIsICIpOworICAgIFByaW50RmllbGRWYWx1ZShtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCwgaSwgZ2VuZXJhdG9yKTsKKyAgfQorICBpZiAoc2luZ2xlX2xpbmVfbW9kZV8pIHsKKyAgICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgiXSAiKTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgiXVxuIik7CisgIH0KK30KKwordm9pZCBUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludEZpZWxkTmFtZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfaW5kZXgsIGludCBmaWVsZF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCB7CisgIC8vIGlmIHVzZV9maWVsZF9udW1iZXJfIGlzIHRydWUsIHByaW50cyBmaWVsZCBudW1iZXIgaW5zdGVhZAorICAvLyBvZiBmaWVsZCBuYW1lLgorICBpZiAodXNlX2ZpZWxkX251bWJlcl8pIHsKKyAgICBnZW5lcmF0b3ItPlByaW50U3RyaW5nKFN0ckNhdChmaWVsZC0+bnVtYmVyKCkpKTsKKyAgICByZXR1cm47CisgIH0KKworICBjb25zdCBGYXN0RmllbGRWYWx1ZVByaW50ZXIqIHByaW50ZXIgPSBHZXRGaWVsZFByaW50ZXIoZmllbGQpOworICBwcmludGVyLT5QcmludEZpZWxkTmFtZShtZXNzYWdlLCBmaWVsZF9pbmRleCwgZmllbGRfY291bnQsIHJlZmxlY3Rpb24sIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IpOworfQorCit2b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50RmllbGRWYWx1ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyhmaWVsZC0+aXNfcmVwZWF0ZWQoKSB8fCAoaW5kZXggPT0gLTEpKQorICAgICAgPDwgIkluZGV4IG11c3QgYmUgLTEgZm9yIG5vbi1yZXBlYXRlZCBmaWVsZHMiOworCisgIGNvbnN0IEZhc3RGaWVsZFZhbHVlUHJpbnRlciogcHJpbnRlciA9IEdldEZpZWxkUHJpbnRlcihmaWVsZCk7CisKKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworI2RlZmluZSBPVVRQVVRfRklFTEQoQ1BQVFlQRSwgTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50ZXItPlByaW50IyNNRVRIT0QoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgPyByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZCMjTUVUSE9EKG1lc3NhZ2UsIGZpZWxkLCBpbmRleCkgXAorICAgICAgICAgICAgOiByZWZsZWN0aW9uLT5HZXQjI01FVEhPRChtZXNzYWdlLCBmaWVsZCksICAgICAgICAgICAgICAgXAorICAgICAgICBnZW5lcmF0b3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJyZWFrCisKKyAgICBPVVRQVVRfRklFTEQoSU5UMzIsIEludDMyKTsKKyAgICBPVVRQVVRfRklFTEQoSU5UNjQsIEludDY0KTsKKyAgICBPVVRQVVRfRklFTEQoVUlOVDMyLCBVSW50MzIpOworICAgIE9VVFBVVF9GSUVMRChVSU5UNjQsIFVJbnQ2NCk7CisgICAgT1VUUFVUX0ZJRUxEKEZMT0FULCBGbG9hdCk7CisgICAgT1VUUFVUX0ZJRUxEKERPVUJMRSwgRG91YmxlKTsKKyAgICBPVVRQVVRfRklFTEQoQk9PTCwgQm9vbCk7CisjdW5kZWYgT1VUUFVUX0ZJRUxECisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKKyAgICAgIHN0ZDo6c3RyaW5nIHNjcmF0Y2g7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUgPQorICAgICAgICAgIGZpZWxkLT5pc19yZXBlYXRlZCgpCisgICAgICAgICAgICAgID8gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgZmllbGQsIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoKQorICAgICAgICAgICAgICA6IHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwgJnNjcmF0Y2gpOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcqIHZhbHVlX3RvX3ByaW50ID0gJnZhbHVlOworICAgICAgc3RkOjpzdHJpbmcgdHJ1bmNhdGVkX3ZhbHVlOworICAgICAgaWYgKHRydW5jYXRlX3N0cmluZ19maWVsZF9sb25nZXJfdGhhbl8gPiAwICYmCisgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90Pih0cnVuY2F0ZV9zdHJpbmdfZmllbGRfbG9uZ2VyX3RoYW5fKSA8CisgICAgICAgICAgICAgIHZhbHVlLnNpemUoKSkgeworICAgICAgICB0cnVuY2F0ZWRfdmFsdWUgPSB2YWx1ZS5zdWJzdHIoMCwgdHJ1bmNhdGVfc3RyaW5nX2ZpZWxkX2xvbmdlcl90aGFuXykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4uPHRydW5jYXRlZD4uLi4iOworICAgICAgICB2YWx1ZV90b19wcmludCA9ICZ0cnVuY2F0ZWRfdmFsdWU7CisgICAgICB9CisgICAgICBpZiAoZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7CisgICAgICAgIHByaW50ZXItPlByaW50U3RyaW5nKCp2YWx1ZV90b19wcmludCwgZ2VuZXJhdG9yKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZmllbGQtPnR5cGUoKSwgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnRCeXRlcygqdmFsdWVfdG9fcHJpbnQsIGdlbmVyYXRvcik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOiB7CisgICAgICBpbnQgZW51bV92YWx1ZSA9CisgICAgICAgICAgZmllbGQtPmlzX3JlcGVhdGVkKCkKKyAgICAgICAgICAgICAgPyByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEVudW1WYWx1ZShtZXNzYWdlLCBmaWVsZCwgaW5kZXgpCisgICAgICAgICAgICAgIDogcmVmbGVjdGlvbi0+R2V0RW51bVZhbHVlKG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fZGVzYyA9CisgICAgICAgICAgZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU51bWJlcihlbnVtX3ZhbHVlKTsKKyAgICAgIGlmIChlbnVtX2Rlc2MgIT0gbnVsbHB0cikgeworICAgICAgICBwcmludGVyLT5QcmludEVudW0oZW51bV92YWx1ZSwgZW51bV9kZXNjLT5uYW1lKCksIGdlbmVyYXRvcik7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBPcmRpbmFyaWx5LCBlbnVtX2Rlc2Mgc2hvdWxkIG5vdCBiZSBudWxsLCBiZWNhdXNlIHByb3RvMiBoYXMgdGhlCisgICAgICAgIC8vIGludmFyaWFudCB0aGF0IHNldCBlbnVtIGZpZWxkIHZhbHVlcyBtdXN0IGJlIGluLXJhbmdlLCBidXQgd2l0aCB0aGUKKyAgICAgICAgLy8gbmV3IGludGVnZXItYmFzZWQgQVBJIGZvciBlbnVtcyAob3IgdGhlIFJlcGVhdGVkRmllbGQ8aW50PiBsb29waG9sZSksCisgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgdXNlciB0byBmb3JjZSBhbiB1bmtub3duIGludGVnZXIgdmFsdWUuICBTbyB3ZQorICAgICAgICAvLyBzaW1wbHkgdXNlIHRoZSBpbnRlZ2VyIHZhbHVlIGl0c2VsZiBhcyB0aGUgZW51bSB2YWx1ZSBuYW1lIGluIHRoaXMKKyAgICAgICAgLy8gY2FzZS4KKyAgICAgICAgcHJpbnRlci0+UHJpbnRFbnVtKGVudW1fdmFsdWUsIFN0ckNhdChlbnVtX3ZhbHVlKSwgZ2VuZXJhdG9yKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICBQcmludChmaWVsZC0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgICAgICAgID8gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkLCBpbmRleCkKKyAgICAgICAgICAgICAgICA6IHJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpLAorICAgICAgICAgICAgZ2VuZXJhdG9yKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHN0YXRpYyAqLyBib29sIFRleHRGb3JtYXQ6OlByaW50KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICByZXR1cm4gUHJpbnRlcigpLlByaW50KG1lc3NhZ2UsIG91dHB1dCk7Cit9CisKKy8qIHN0YXRpYyAqLyBib29sIFRleHRGb3JtYXQ6OlByaW50VW5rbm93bkZpZWxkcygKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLCBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICByZXR1cm4gUHJpbnRlcigpLlByaW50VW5rbm93bkZpZWxkcyh1bmtub3duX2ZpZWxkcywgb3V0cHV0KTsKK30KKworLyogc3RhdGljICovIGJvb2wgVGV4dEZvcm1hdDo6UHJpbnRUb1N0cmluZyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0cHV0KSB7CisgIHJldHVybiBQcmludGVyKCkuUHJpbnRUb1N0cmluZyhtZXNzYWdlLCBvdXRwdXQpOworfQorCisvKiBzdGF0aWMgKi8gYm9vbCBUZXh0Rm9ybWF0OjpQcmludFVua25vd25GaWVsZHNUb1N0cmluZygKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLCBzdGQ6OnN0cmluZyogb3V0cHV0KSB7CisgIHJldHVybiBQcmludGVyKCkuUHJpbnRVbmtub3duRmllbGRzVG9TdHJpbmcodW5rbm93bl9maWVsZHMsIG91dHB1dCk7Cit9CisKKy8qIHN0YXRpYyAqLyB2b2lkIFRleHRGb3JtYXQ6OlByaW50RmllbGRWYWx1ZVRvU3RyaW5nKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCwKKyAgICBzdGQ6OnN0cmluZyogb3V0cHV0KSB7CisgIHJldHVybiBQcmludGVyKCkuUHJpbnRGaWVsZFZhbHVlVG9TdHJpbmcobWVzc2FnZSwgZmllbGQsIGluZGV4LCBvdXRwdXQpOworfQorCisvKiBzdGF0aWMgKi8gYm9vbCBUZXh0Rm9ybWF0OjpQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgTWVzc2FnZSogbWVzc2FnZSkgeworICByZXR1cm4gUGFyc2VyKCkuUGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZyhpbnB1dCwgZmllbGQsIG1lc3NhZ2UpOworfQorCit2b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50VW5rbm93bkZpZWxkcygKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLCBUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IsCisgICAgaW50IHJlY3Vyc2lvbl9idWRnZXQpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbnVtYmVyID0gU3RyQ2F0KGZpZWxkLm51bWJlcigpKTsKKworICAgIHN3aXRjaCAoZmllbGQudHlwZSgpKSB7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQ6CisgICAgICAgIGdlbmVyYXRvci0+UHJpbnRTdHJpbmcoZmllbGRfbnVtYmVyKTsKKyAgICAgICAgZ2VuZXJhdG9yLT5QcmludE1heWJlV2l0aE1hcmtlcigiOiAiKTsKKyAgICAgICAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhTdHJDYXQoZmllbGQudmFyaW50KCkpKTsKKyAgICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7CisgICAgICAgICAgZ2VuZXJhdG9yLT5QcmludExpdGVyYWwoIiAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVEMzI6IHsKKyAgICAgICAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhmaWVsZF9udW1iZXIpOworICAgICAgICBnZW5lcmF0b3ItPlByaW50TWF5YmVXaXRoTWFya2VyKCI6ICIsICIweCIpOworICAgICAgICBnZW5lcmF0b3ItPlByaW50U3RyaW5nKAorICAgICAgICAgICAgU3RyQ2F0KHN0cmluZ3M6OkhleChmaWVsZC5maXhlZDMyKCksIHN0cmluZ3M6OlpFUk9fUEFEXzgpKSk7CisgICAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgeworICAgICAgICAgIGdlbmVyYXRvci0+UHJpbnRMaXRlcmFsKCIgIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2VuZXJhdG9yLT5QcmludExpdGVyYWwoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0OiB7CisgICAgICAgIGdlbmVyYXRvci0+UHJpbnRTdHJpbmcoZmllbGRfbnVtYmVyKTsKKyAgICAgICAgZ2VuZXJhdG9yLT5QcmludE1heWJlV2l0aE1hcmtlcigiOiAiLCAiMHgiKTsKKyAgICAgICAgZ2VuZXJhdG9yLT5QcmludFN0cmluZygKKyAgICAgICAgICAgIFN0ckNhdChzdHJpbmdzOjpIZXgoZmllbGQuZml4ZWQ2NCgpLCBzdHJpbmdzOjpaRVJPX1BBRF8xNikpKTsKKyAgICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7CisgICAgICAgICAgZ2VuZXJhdG9yLT5QcmludExpdGVyYWwoIiAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQ6IHsKKyAgICAgICAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhmaWVsZF9udW1iZXIpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUgPSBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCk7CisgICAgICAgIC8vIFdlIGNyZWF0ZSBhIENvZGVkSW5wdXRTdHJlYW0gc28gdGhhdCB3ZSBjYW4gYWRoZXJlIHRvIG91ciByZWN1cnNpb24KKyAgICAgICAgLy8gYnVkZ2V0IHdoZW4gd2UgYXR0ZW1wdCB0byBwYXJzZSB0aGUgZGF0YS4gVW5rbm93bkZpZWxkU2V0IHBhcnNpbmcgaXMKKyAgICAgICAgLy8gcmVjdXJzaXZlIGJlY2F1c2Ugb2YgZ3JvdXBzLgorICAgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0oCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih2YWx1ZS5kYXRhKCkpLCB2YWx1ZS5zaXplKCkpOworICAgICAgICBpbnB1dF9zdHJlYW0uU2V0UmVjdXJzaW9uTGltaXQocmVjdXJzaW9uX2J1ZGdldCk7CisgICAgICAgIFVua25vd25GaWVsZFNldCBlbWJlZGRlZF91bmtub3duX2ZpZWxkczsKKyAgICAgICAgaWYgKCF2YWx1ZS5lbXB0eSgpICYmIHJlY3Vyc2lvbl9idWRnZXQgPiAwICYmCisgICAgICAgICAgICBlbWJlZGRlZF91bmtub3duX2ZpZWxkcy5QYXJzZUZyb21Db2RlZFN0cmVhbSgmaW5wdXRfc3RyZWFtKSkgeworICAgICAgICAgIC8vIFRoaXMgZmllbGQgaXMgcGFyc2VhYmxlIGFzIGEgTWVzc2FnZS4KKyAgICAgICAgICAvLyBTbyBpdCBpcyBwcm9iYWJseSBhbiBlbWJlZGRlZCBtZXNzYWdlLgorICAgICAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgeworICAgICAgICAgICAgZ2VuZXJhdG9yLT5QcmludE1heWJlV2l0aE1hcmtlcigiICIsICJ7ICIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5lcmF0b3ItPlByaW50TWF5YmVXaXRoTWFya2VyKCIgIiwgIntcbiIpOworICAgICAgICAgICAgZ2VuZXJhdG9yLT5JbmRlbnQoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgUHJpbnRVbmtub3duRmllbGRzKGVtYmVkZGVkX3Vua25vd25fZmllbGRzLCBnZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbl9idWRnZXQgLSAxKTsKKyAgICAgICAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZV8pIHsKKyAgICAgICAgICAgIGdlbmVyYXRvci0+UHJpbnRMaXRlcmFsKCJ9ICIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5lcmF0b3ItPk91dGRlbnQoKTsKKyAgICAgICAgICAgIGdlbmVyYXRvci0+UHJpbnRMaXRlcmFsKCJ9XG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gVGhpcyBmaWVsZCBpcyBub3QgcGFyc2VhYmxlIGFzIGEgTWVzc2FnZSAob3Igd2UgcmFuIG91dCBvZgorICAgICAgICAgIC8vIHJlY3Vyc2lvbiBidWRnZXQpLiBTbyBpdCBpcyBwcm9iYWJseSBqdXN0IGEgcGxhaW4gc3RyaW5nLgorICAgICAgICAgIGdlbmVyYXRvci0+UHJpbnRNYXliZVdpdGhNYXJrZXIoIjogIiwgIlwiIik7CisgICAgICAgICAgZ2VuZXJhdG9yLT5QcmludFN0cmluZyhDRXNjYXBlKHZhbHVlKSk7CisgICAgICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7CisgICAgICAgICAgICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgiXCIgIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbmVyYXRvci0+UHJpbnRMaXRlcmFsKCJcIlxuIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6CisgICAgICAgIGdlbmVyYXRvci0+UHJpbnRTdHJpbmcoZmllbGRfbnVtYmVyKTsKKyAgICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7CisgICAgICAgICAgZ2VuZXJhdG9yLT5QcmludE1heWJlV2l0aE1hcmtlcigiICIsICJ7ICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdlbmVyYXRvci0+UHJpbnRNYXliZVdpdGhNYXJrZXIoIiAiLCAie1xuIik7CisgICAgICAgICAgZ2VuZXJhdG9yLT5JbmRlbnQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBGb3IgZ3JvdXBzLCB3ZSByZWN1cnNlIHdpdGhvdXQgY2hlY2tpbmcgdGhlIGJ1ZGdldC4gVGhpcyBpcyBPSywKKyAgICAgICAgLy8gYmVjYXVzZSBpZiB0aGUgZ3JvdXBzIHdlcmUgdG9vIGRlZXBseSBuZXN0ZWQgdGhlbiB3ZSB3b3VsZCBoYXZlCisgICAgICAgIC8vIGFscmVhZHkgcmVqZWN0ZWQgdGhlIG1lc3NhZ2Ugd2hlbiB3ZSBvcmlnaW5hbGx5IHBhcnNlZCBpdC4KKyAgICAgICAgUHJpbnRVbmtub3duRmllbGRzKGZpZWxkLmdyb3VwKCksIGdlbmVyYXRvciwgcmVjdXJzaW9uX2J1ZGdldCAtIDEpOworICAgICAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZV8pIHsKKyAgICAgICAgICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgifSAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZW5lcmF0b3ItPk91dGRlbnQoKTsKKyAgICAgICAgICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgifVxuIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMGJlZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmgKQEAgLTAsMCArMSw2OTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGpzY2hvcnJAZ29vZ2xlLmNvbSAoSm9zZXBoIFNjaG9ycikKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFV0aWxpdGllcyBmb3IgcHJpbnRpbmcgYW5kIHBhcnNpbmcgcHJvdG9jb2wgbWVzc2FnZXMgaW4gYSBodW1hbi1yZWFkYWJsZSwKKy8vIHRleHQtYmFzZWQgZm9ybWF0LgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9URVhUX0ZPUk1BVF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1RFWFRfRk9STUFUX0hfXworCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworI2lmZGVmIFNXSUcKKyNlcnJvciAiWW91IGNhbm5vdCBTV0lHIHByb3RvIGhlYWRlcnMiCisjZW5kaWYKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCituYW1lc3BhY2UgaW50ZXJuYWwgeworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBjb25zdCBjaGFyIGtEZWJ1Z1N0cmluZ1NpbGVudE1hcmtlclsxXTsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gY29uc3QgY2hhciBrRGVidWdTdHJpbmdTaWxlbnRNYXJrZXJGb3JEZXRlY3Rpb25bM107Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworbmFtZXNwYWNlIGlvIHsKK2NsYXNzIEVycm9yQ29sbGVjdG9yOyAgLy8gdG9rZW5pemVyLmgKK30KKworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHByb3RvY29sIGJ1ZmZlciB0ZXh0IGZvcm1hdCwgY29sbG9xdWlhbGx5IGtub3duIGFzIHRleHQKKy8vIHByb3RvLiAgUHJpbnRpbmcgYW5kIHBhcnNpbmcgcHJvdG9jb2wgbWVzc2FnZXMgaW4gdGV4dCBmb3JtYXQgaXMgdXNlZnVsIGZvcgorLy8gZGVidWdnaW5nIGFuZCBodW1hbiBlZGl0aW5nIG9mIG1lc3NhZ2VzLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgcmVhbGx5IGEgbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgb25seSBzdGF0aWMgbWV0aG9kcy4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBUZXh0Rm9ybWF0IHsKKyBwdWJsaWM6CisgIC8vIE91dHB1dHMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBtZXNzYWdlIHRvIHRoZSBnaXZlbgorICAvLyBvdXRwdXQgc3RyZWFtLiBSZXR1cm5zIGZhbHNlIGlmIHByaW50aW5nIGZhaWxzLgorICBzdGF0aWMgYm9vbCBQcmludChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisKKyAgLy8gUHJpbnQgdGhlIGZpZWxkcyBpbiBhbiBVbmtub3duRmllbGRTZXQuICBUaGV5IGFyZSBwcmludGVkIGJ5IHRhZyBudW1iZXIKKyAgLy8gb25seS4gIEVtYmVkZGVkIG1lc3NhZ2VzIGFyZSBoZXVyaXN0aWNhbGx5IGlkZW50aWZpZWQgYnkgYXR0ZW1wdGluZyB0bworICAvLyBwYXJzZSB0aGVtLiBSZXR1cm5zIGZhbHNlIGlmIHByaW50aW5nIGZhaWxzLgorICBzdGF0aWMgYm9vbCBQcmludFVua25vd25GaWVsZHMoY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KTsKKworICAvLyBMaWtlIFByaW50KCksIGJ1dCBvdXRwdXRzIGRpcmVjdGx5IHRvIGEgc3RyaW5nLgorICAvLyBOb3RlOiBvdXRwdXQgd2lsbCBiZSBjbGVhcmVkIHByaW9yIHRvIHByaW50aW5nLCBhbmQgd2lsbCBiZSBsZWZ0IGVtcHR5CisgIC8vIGV2ZW4gaWYgcHJpbnRpbmcgZmFpbHMuIFJldHVybnMgZmFsc2UgaWYgcHJpbnRpbmcgZmFpbHMuCisgIHN0YXRpYyBib29sIFByaW50VG9TdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgc3RkOjpzdHJpbmcqIG91dHB1dCk7CisKKyAgLy8gTGlrZSBQcmludFVua25vd25GaWVsZHMoKSwgYnV0IG91dHB1dHMgZGlyZWN0bHkgdG8gYSBzdHJpbmcuIFJldHVybnMKKyAgLy8gZmFsc2UgaWYgcHJpbnRpbmcgZmFpbHMuCisgIHN0YXRpYyBib29sIFByaW50VW5rbm93bkZpZWxkc1RvU3RyaW5nKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRwdXQpOworCisgIC8vIE91dHB1dHMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgc3VwcGxpZWQgb24KKyAgLy8gdGhlIG1lc3NhZ2Ugc3VwcGxpZWQuIEZvciBub24tcmVwZWF0ZWQgZmllbGRzLCBhbiBpbmRleCBvZiAtMSBtdXN0CisgIC8vIGJlIHN1cHBsaWVkLiBOb3RlIHRoYXQgdGhpcyBtZXRob2Qgd2lsbCBwcmludCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYQorICAvLyBmaWVsZCBpZiBpdCBpcyBub3Qgc2V0LgorICBzdGF0aWMgdm9pZCBQcmludEZpZWxkVmFsdWVUb1N0cmluZyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRwdXQpOworCisgIGNsYXNzIFBST1RPQlVGX0VYUE9SVCBCYXNlVGV4dEdlbmVyYXRvciB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB+QmFzZVRleHRHZW5lcmF0b3IoKTsKKworICAgIHZpcnR1YWwgdm9pZCBJbmRlbnQoKSB7fQorICAgIHZpcnR1YWwgdm9pZCBPdXRkZW50KCkge30KKyAgICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGluZGVudGF0aW9uIHNpemUgaW4gY2hhcmFjdGVycy4KKyAgICB2aXJ0dWFsIHNpemVfdCBHZXRDdXJyZW50SW5kZW50YXRpb25TaXplKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCisgICAgLy8gUHJpbnQgdGV4dCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICB2aXJ0dWFsIHZvaWQgUHJpbnQoY29uc3QgY2hhciogdGV4dCwgc2l6ZV90IHNpemUpID0gMDsKKworICAgIHZvaWQgUHJpbnRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeyBQcmludChzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpKTsgfQorCisgICAgdGVtcGxhdGUgPHNpemVfdCBuPgorICAgIHZvaWQgUHJpbnRMaXRlcmFsKGNvbnN0IGNoYXIgKCZ0ZXh0KVtuXSkgeworICAgICAgUHJpbnQodGV4dCwgbiAtIDEpOyAgLy8gbiBpbmNsdWRlcyB0aGUgdGVybWluYXRpbmcgemVybyBjaGFyYWN0ZXIuCisgICAgfQorICB9OworCisgIC8vIFRoZSBkZWZhdWx0IHByaW50ZXIgdGhhdCBjb252ZXJ0cyBzY2FsYXIgdmFsdWVzIGZyb20gZmllbGRzIGludG8gdGhlaXIKKyAgLy8gc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICAvLyBZb3UgY2FuIGRlcml2ZSBmcm9tIHRoaXMgRmFzdEZpZWxkVmFsdWVQcmludGVyIGlmIHlvdSB3YW50IHRvIGhhdmUgZmllbGRzCisgIC8vIHRvIGJlIHByaW50ZWQgaW4gYSBkaWZmZXJlbnQgd2F5IGFuZCByZWdpc3RlciBpdCBhdCB0aGUgUHJpbnRlci4KKyAgY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEZhc3RGaWVsZFZhbHVlUHJpbnRlciB7CisgICBwdWJsaWM6CisgICAgRmFzdEZpZWxkVmFsdWVQcmludGVyKCk7CisgICAgdmlydHVhbCB+RmFzdEZpZWxkVmFsdWVQcmludGVyKCk7CisgICAgdmlydHVhbCB2b2lkIFByaW50Qm9vbChib29sIHZhbCwgQmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIFByaW50SW50MzIoaW50MzJfdCB2YWwsIEJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBQcmludFVJbnQzMih1aW50MzJfdCB2YWwsIEJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBQcmludEludDY0KGludDY0X3QgdmFsLCBCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgUHJpbnRVSW50NjQodWludDY0X3QgdmFsLCBCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgUHJpbnRGbG9hdChmbG9hdCB2YWwsIEJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBQcmludERvdWJsZShkb3VibGUgdmFsLCBCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgUHJpbnRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIFByaW50Qnl0ZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgUHJpbnRFbnVtKGludDMyX3QgdmFsLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBQcmludEZpZWxkTmFtZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBpbnQgZmllbGRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9jb3VudCwgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIFByaW50RmllbGROYW1lKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBQcmludE1lc3NhZ2VTdGFydChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBpbnQgZmllbGRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9jb3VudCwgYm9vbCBzaW5nbGVfbGluZV9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdDsKKyAgICAvLyBBbGxvd3MgdG8gb3ZlcnJpZGUgdGhlIGxvZ2ljIG9uIGhvdyB0byBwcmludCB0aGUgY29udGVudCBvZiBhIG1lc3NhZ2UuCisgICAgLy8gUmV0dXJuIGZhbHNlIHRvIHVzZSB0aGUgZGVmYXVsdCBwcmludGluZyBsb2dpYy4gTm90ZSB0aGF0IGl0IGlzIGxlZ2FsIGZvcgorICAgIC8vIHRoaXMgZnVuY3Rpb24gdG8gcHJpbnQgc29tZXRoaW5nIGFuZCB0aGVuIHJldHVybiBmYWxzZSB0byB1c2UgdGhlIGRlZmF1bHQKKyAgICAvLyBjb250ZW50IHByaW50aW5nIChhbHRob3VnaCBhdCB0aGF0IHBvaW50IGl0IHdvdWxkIGJlaGF2ZSBzaW1pbGFybHkgdG8KKyAgICAvLyBQcmludE1lc3NhZ2VTdGFydCkuCisgICAgdmlydHVhbCBib29sIFByaW50TWVzc2FnZUNvbnRlbnQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgaW50IGZpZWxkX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9jb3VudCwgYm9vbCBzaW5nbGVfbGluZV9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBQcmludE1lc3NhZ2VFbmQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgaW50IGZpZWxkX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX2NvdW50LCBib29sIHNpbmdsZV9saW5lX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdDsKKworICAgcHJpdmF0ZToKKyAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmFzdEZpZWxkVmFsdWVQcmludGVyKTsKKyAgfTsKKworICAvLyBEZXByZWNhdGVkOiBwbGVhc2UgdXNlIEZhc3RGaWVsZFZhbHVlUHJpbnRlciBpbnN0ZWFkLgorICBjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRmllbGRWYWx1ZVByaW50ZXIgeworICAgcHVibGljOgorICAgIEZpZWxkVmFsdWVQcmludGVyKCk7CisgICAgdmlydHVhbCB+RmllbGRWYWx1ZVByaW50ZXIoKTsKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFByaW50Qm9vbChib29sIHZhbCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBQcmludEludDMyKGludDMyX3QgdmFsKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFByaW50VUludDMyKHVpbnQzMl90IHZhbCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBQcmludEludDY0KGludDY0X3QgdmFsKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFByaW50VUludDY0KHVpbnQ2NF90IHZhbCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBQcmludEZsb2F0KGZsb2F0IHZhbCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBQcmludERvdWJsZShkb3VibGUgdmFsKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFByaW50U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwpIGNvbnN0OworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgUHJpbnRCeXRlcyhjb25zdCBzdGQ6OnN0cmluZyYgdmFsKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFByaW50RW51bShpbnQzMl90IHZhbCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0OworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgUHJpbnRGaWVsZE5hbWUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFByaW50TWVzc2FnZVN0YXJ0KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfaW5kZXgsIGludCBmaWVsZF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2luZ2xlX2xpbmVfbW9kZSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBQcmludE1lc3NhZ2VFbmQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgaW50IGZpZWxkX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbmdsZV9saW5lX21vZGUpIGNvbnN0OworCisgICBwcml2YXRlOgorICAgIEZhc3RGaWVsZFZhbHVlUHJpbnRlciBkZWxlZ2F0ZV87CisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpZWxkVmFsdWVQcmludGVyKTsKKyAgfTsKKworICBjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTWVzc2FnZVByaW50ZXIgeworICAgcHVibGljOgorICAgIE1lc3NhZ2VQcmludGVyKCkge30KKyAgICB2aXJ0dWFsIH5NZXNzYWdlUHJpbnRlcigpIHt9CisgICAgdmlydHVhbCB2b2lkIFByaW50KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGJvb2wgc2luZ2xlX2xpbmVfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3QgPSAwOworCisgICBwcml2YXRlOgorICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXNzYWdlUHJpbnRlcik7CisgIH07CisKKyAgLy8gSW50ZXJmYWNlIHRoYXQgUHJpbnRlcnMgb3IgUGFyc2VycyBjYW4gdXNlIHRvIGZpbmQgZXh0ZW5zaW9ucywgb3IgdHlwZXMKKyAgLy8gcmVmZXJlbmNlZCBpbiBBbnkgbWVzc2FnZXMuCisgIGNsYXNzIFBST1RPQlVGX0VYUE9SVCBGaW5kZXIgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgfkZpbmRlcigpOworCisgICAgLy8gVHJ5IHRvIGZpbmQgYW4gZXh0ZW5zaW9uIG9mICptZXNzYWdlIGJ5IGZ1bGx5LXF1YWxpZmllZCBmaWVsZAorICAgIC8vIG5hbWUuICBSZXR1cm5zIG51bGxwdHIgaWYgbm8gZXh0ZW5zaW9uIGlzIGtub3duIGZvciB0aGlzIG5hbWUgb3IgbnVtYmVyLgorICAgIC8vIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIGV4dGVuc2lvbnMgYWxyZWFkeSBrbm93biBieSB0aGUgbWVzc2FnZS4KKyAgICB2aXJ0dWFsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbihNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdDsKKworICAgIC8vIFNpbWlsYXIgdG8gRmluZEV4dGVuc2lvbiwgYnV0IHVzZXMgYSBEZXNjcmlwdG9yIGFuZCB0aGUgZXh0ZW5zaW9uIG51bWJlcgorICAgIC8vIGluc3RlYWQgb2YgdXNpbmcgYSBNZXNzYWdlIGFuZCB0aGUgbmFtZSB3aGVuIGRvaW5nIHRoZSBsb29rIHVwLgorICAgIHZpcnR1YWwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uQnlOdW1iZXIoCisgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBudW1iZXIpIGNvbnN0OworCisgICAgLy8gRmluZCB0aGUgbWVzc2FnZSB0eXBlIGZvciBhbiBBbnkgcHJvdG8uCisgICAgLy8gUmV0dXJucyBudWxscHRyIGlmIG5vIG1lc3NhZ2UgaXMga25vd24gZm9yIHRoaXMgbmFtZS4KKyAgICAvLyBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvbmx5IGFjY2VwdHMgcHJlZml4ZXMgb2YgdHlwZS5nb29nbGVwcm9kLmNvbS8gb3IKKyAgICAvLyB0eXBlLmdvb2dsZWFwaXMuY29tLywgYW5kIHNlYXJjaGVzIHRoZSBEZXNjcmlwdG9yUG9vbCBvZiB0aGUgcGFyZW50CisgICAgLy8gbWVzc2FnZS4KKyAgICB2aXJ0dWFsIGNvbnN0IERlc2NyaXB0b3IqIEZpbmRBbnlUeXBlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0OworCisgICAgLy8gRmluZCB0aGUgbWVzc2FnZSBmYWN0b3J5IGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIGZpZWxkLiBUaGlzIGNhbiBiZSB1c2VkCisgICAgLy8gdG8gZ2VuZXJhbGl6ZSB0aGUgUGFyc2VyIHRvIGFkZCBleHRlbnNpb24gZmllbGRzIHRvIGEgbWVzc2FnZSBpbiB0aGUgc2FtZQorICAgIC8vIHdheSBhcyB0aGUgImlucHV0IiBtZXNzYWdlIGZvciB0aGUgUGFyc2VyLgorICAgIHZpcnR1YWwgTWVzc2FnZUZhY3RvcnkqIEZpbmRFeHRlbnNpb25GYWN0b3J5KAorICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgfTsKKworICAvLyBDbGFzcyBmb3IgdGhvc2UgdXNlcnMgd2hpY2ggcmVxdWlyZSBtb3JlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgaG93CisgIC8vIGEgcHJvdG9idWZmZXIgbWVzc2FnZSBpcyBwcmludGVkIG91dC4KKyAgY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFByaW50ZXIgeworICAgcHVibGljOgorICAgIFByaW50ZXIoKTsKKworICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6UHJpbnQKKyAgICBib29sIFByaW50KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgICAvLyBMaWtlIFRleHRGb3JtYXQ6OlByaW50VW5rbm93bkZpZWxkcworICAgIGJvb2wgUHJpbnRVbmtub3duRmllbGRzKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6UHJpbnRUb1N0cmluZworICAgIGJvb2wgUHJpbnRUb1N0cmluZyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBzdGQ6OnN0cmluZyogb3V0cHV0KSBjb25zdDsKKyAgICAvLyBMaWtlIFRleHRGb3JtYXQ6OlByaW50VW5rbm93bkZpZWxkc1RvU3RyaW5nCisgICAgYm9vbCBQcmludFVua25vd25GaWVsZHNUb1N0cmluZyhjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dHB1dCkgY29uc3Q7CisgICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpQcmludEZpZWxkVmFsdWVUb1N0cmluZworICAgIHZvaWQgUHJpbnRGaWVsZFZhbHVlVG9TdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRwdXQpIGNvbnN0OworCisgICAgLy8gQWRqdXN0IHRoZSBpbml0aWFsIGluZGVudCBsZXZlbCBvZiBhbGwgb3V0cHV0LiAgRWFjaCBpbmRlbnQgbGV2ZWwgaXMKKyAgICAvLyBlcXVhbCB0byB0d28gc3BhY2VzLgorICAgIHZvaWQgU2V0SW5pdGlhbEluZGVudExldmVsKGludCBpbmRlbnRfbGV2ZWwpIHsKKyAgICAgIGluaXRpYWxfaW5kZW50X2xldmVsXyA9IGluZGVudF9sZXZlbDsKKyAgICB9CisKKyAgICAvLyBJZiBwcmludGluZyBpbiBzaW5nbGUgbGluZSBtb2RlLCB0aGVuIHRoZSBlbnRpcmUgbWVzc2FnZSB3aWxsIGJlIG91dHB1dAorICAgIC8vIG9uIGEgc2luZ2xlIGxpbmUgd2l0aCBubyBsaW5lIGJyZWFrcy4KKyAgICB2b2lkIFNldFNpbmdsZUxpbmVNb2RlKGJvb2wgc2luZ2xlX2xpbmVfbW9kZSkgeworICAgICAgc2luZ2xlX2xpbmVfbW9kZV8gPSBzaW5nbGVfbGluZV9tb2RlOworICAgIH0KKworICAgIGJvb2wgSXNJblNpbmdsZUxpbmVNb2RlKCkgY29uc3QgeyByZXR1cm4gc2luZ2xlX2xpbmVfbW9kZV87IH0KKworICAgIC8vIElmIHVzZV9maWVsZF9udW1iZXIgaXMgdHJ1ZSwgdXNlcyBmaWVsZCBudW1iZXIgaW5zdGVhZCBvZiBmaWVsZCBuYW1lLgorICAgIHZvaWQgU2V0VXNlRmllbGROdW1iZXIoYm9vbCB1c2VfZmllbGRfbnVtYmVyKSB7CisgICAgICB1c2VfZmllbGRfbnVtYmVyXyA9IHVzZV9maWVsZF9udW1iZXI7CisgICAgfQorCisgICAgLy8gU2V0IHRydWUgdG8gcHJpbnQgcmVwZWF0ZWQgcHJpbWl0aXZlcyBpbiBhIGZvcm1hdCBsaWtlOgorICAgIC8vICAgZmllbGRfbmFtZTogWzEsIDIsIDMsIDRdCisgICAgLy8gaW5zdGVhZCBvZiBwcmludGluZyBlYWNoIHZhbHVlIG9uIGl0cyBvd24gbGluZS4gIFNob3J0IGZvcm1hdCBhcHBsaWVzCisgICAgLy8gb25seSB0byBwcmltaXRpdmUgdmFsdWVzIC0tIGkuZS4gZXZlcnl0aGluZyBleGNlcHQgc3RyaW5ncyBhbmQKKyAgICAvLyBzdWItbWVzc2FnZXMvZ3JvdXBzLgorICAgIHZvaWQgU2V0VXNlU2hvcnRSZXBlYXRlZFByaW1pdGl2ZXMoYm9vbCB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlcykgeworICAgICAgdXNlX3Nob3J0X3JlcGVhdGVkX3ByaW1pdGl2ZXNfID0gdXNlX3Nob3J0X3JlcGVhdGVkX3ByaW1pdGl2ZXM7CisgICAgfQorCisgICAgLy8gU2V0IHRydWUgdG8gb3V0cHV0IFVURi04IGluc3RlYWQgb2YgQVNDSUkuICBUaGUgb25seSBkaWZmZXJlbmNlCisgICAgLy8gaXMgdGhhdCBieXRlcyA+PSAweDgwIGluIHN0cmluZyBmaWVsZHMgd2lsbCBub3QgYmUgZXNjYXBlZCwKKyAgICAvLyBiZWNhdXNlIHRoZXkgYXJlIGFzc3VtZWQgdG8gYmUgcGFydCBvZiBVVEYtOCBtdWx0aS1ieXRlCisgICAgLy8gc2VxdWVuY2VzLiBUaGlzIHdpbGwgY2hhbmdlIHRoZSBkZWZhdWx0IEZhc3RGaWVsZFZhbHVlUHJpbnRlci4KKyAgICB2b2lkIFNldFVzZVV0ZjhTdHJpbmdFc2NhcGluZyhib29sIGFzX3V0ZjgpOworCisgICAgLy8gU2V0IHRoZSBkZWZhdWx0IEZhc3RGaWVsZFZhbHVlUHJpbnRlciB0aGF0IGlzIHVzZWQgZm9yIGFsbCBmaWVsZHMgdGhhdAorICAgIC8vIGRvbid0IGhhdmUgYSBmaWVsZC1zcGVjaWZpYyBwcmludGVyIHJlZ2lzdGVyZWQuCisgICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHRoZSBwcmludGVyLgorICAgIHZvaWQgU2V0RGVmYXVsdEZpZWxkVmFsdWVQcmludGVyKGNvbnN0IEZhc3RGaWVsZFZhbHVlUHJpbnRlciogcHJpbnRlcik7CisKKyAgICBQUk9UT0JVRl9ERVBSRUNBVEVEX01TRygiUGxlYXNlIHVzZSBGYXN0RmllbGRWYWx1ZVByaW50ZXIiKQorICAgIHZvaWQgU2V0RGVmYXVsdEZpZWxkVmFsdWVQcmludGVyKGNvbnN0IEZpZWxkVmFsdWVQcmludGVyKiBwcmludGVyKTsKKworICAgIC8vIFNldHMgd2hldGhlciB3ZSB3YW50IHRvIGhpZGUgdW5rbm93biBmaWVsZHMgb3Igbm90LgorICAgIC8vIFVzdWFsbHkgdW5rbm93biBmaWVsZHMgYXJlIHByaW50ZWQgaW4gYSBnZW5lcmljIHdheSB0aGF0IGluY2x1ZGVzIHRoZQorICAgIC8vIHRhZyBudW1iZXIgb2YgdGhlIGZpZWxkIGluc3RlYWQgb2YgZmllbGQgbmFtZS4gSG93ZXZlciwgc29tZXRpbWVzIGl0CisgICAgLy8gaXMgdXNlZnVsIHRvIGJlIGFibGUgdG8gcHJpbnQgdGhlIG1lc3NhZ2Ugd2l0aG91dCB1bmtub3duIGZpZWxkcyAoZS5nLgorICAgIC8vIGZvciB0aGUgcHl0aG9uIHByb3RvYnVmIHZlcnNpb24gdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgYmV0d2VlbiBpdHMgcHVyZQorICAgIC8vIHB5dGhvbiBhbmQgYysrIGltcGxlbWVudGF0aW9ucykuCisgICAgdm9pZCBTZXRIaWRlVW5rbm93bkZpZWxkcyhib29sIGhpZGUpIHsgaGlkZV91bmtub3duX2ZpZWxkc18gPSBoaWRlOyB9CisKKyAgICAvLyBJZiBwcmludF9tZXNzYWdlX2ZpZWxkc19pbl9pbmRleF9vcmRlciBpcyB0cnVlLCBmaWVsZHMgb2YgYSBwcm90byBtZXNzYWdlCisgICAgLy8gd2lsbCBiZSBwcmludGVkIHVzaW5nIHRoZSBvcmRlciBkZWZpbmVkIGluIHNvdXJjZSBjb2RlIGluc3RlYWQgb2YgdGhlCisgICAgLy8gZmllbGQgbnVtYmVyLCBleHRlbnNpb25zIHdpbGwgYmUgcHJpbnRlZCBhdCB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlCisgICAgLy8gYW5kIHRoZWlyIHJlbGF0aXZlIG9yZGVyIGlzIGRldGVybWluZWQgYnkgdGhlIGV4dGVuc2lvbiBudW1iZXIuCisgICAgLy8gQnkgZGVmYXVsdCwgdXNlIHRoZSBmaWVsZCBudW1iZXIgb3JkZXIuCisgICAgdm9pZCBTZXRQcmludE1lc3NhZ2VGaWVsZHNJbkluZGV4T3JkZXIoCisgICAgICAgIGJvb2wgcHJpbnRfbWVzc2FnZV9maWVsZHNfaW5faW5kZXhfb3JkZXIpIHsKKyAgICAgIHByaW50X21lc3NhZ2VfZmllbGRzX2luX2luZGV4X29yZGVyXyA9CisgICAgICAgICAgcHJpbnRfbWVzc2FnZV9maWVsZHNfaW5faW5kZXhfb3JkZXI7CisgICAgfQorCisgICAgLy8gSWYgZXhwYW5kPT10cnVlLCBleHBhbmQgZ29vZ2xlLnByb3RvYnVmLkFueSBwYXlsb2Fkcy4gVGhlIG91dHB1dAorICAgIC8vIHdpbGwgYmUgb2YgZm9ybQorICAgIC8vICAgIFt0eXBlX3VybF0geyA8dmFsdWVfcHJpbnRlZF9pbl90ZXh0PiB9CisgICAgLy8KKyAgICAvLyBJZiBleHBhbmQ9PWZhbHNlLCBwcmludCBBbnkgdXNpbmcgdGhlIGRlZmF1bHQgcHJpbnRlci4gVGhlIG91dHB1dCB3aWxsCisgICAgLy8gbG9vayBsaWtlCisgICAgLy8gICAgdHlwZV91cmw6ICI8dHlwZV91cmw+IiAgdmFsdWU6ICJzZXJpYWxpemVkX2NvbnRlbnQiCisgICAgdm9pZCBTZXRFeHBhbmRBbnkoYm9vbCBleHBhbmQpIHsgZXhwYW5kX2FueV8gPSBleHBhbmQ7IH0KKworICAgIC8vIFNldCBob3cgcGFyc2VyIGZpbmRzIG1lc3NhZ2UgZm9yIEFueSBwYXlsb2Fkcy4KKyAgICB2b2lkIFNldEZpbmRlcihjb25zdCBGaW5kZXIqIGZpbmRlcikgeyBmaW5kZXJfID0gZmluZGVyOyB9CisKKyAgICAvLyBJZiBub24temVybywgd2UgdHJ1bmNhdGUgYWxsIHN0cmluZyBmaWVsZHMgdGhhdCBhcmUgIGxvbmdlciB0aGFuCisgICAgLy8gdGhpcyB0aHJlc2hvbGQuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSBwcm90byBtZXNzYWdlIGhhcyB2ZXJ5IGxvbmcKKyAgICAvLyBzdHJpbmdzLCBlLmcuLCBkdW1wIG9mIGVuY29kZWQgaW1hZ2UgZmlsZS4KKyAgICAvLworICAgIC8vIE5PVEUoaGZnb25nKTogIFNldHRpbmcgYSBub24temVybyB2YWx1ZSBicmVha3Mgcm91bmQtdHJpcCBzYWZlCisgICAgLy8gcHJvcGVydHkgb2YgVGV4dEZvcm1hdDo6UHJpbnRlci4gIFRoYXQgaXMsIGZyb20gdGhlIHByaW50ZWQgbWVzc2FnZSwgd2UKKyAgICAvLyBjYW5ub3QgZnVsbHkgcmVjb3ZlciB0aGUgb3JpZ2luYWwgc3RyaW5nIGZpZWxkIGFueSBtb3JlLgorICAgIHZvaWQgU2V0VHJ1bmNhdGVTdHJpbmdGaWVsZExvbmdlclRoYW4oCisgICAgICAgIGNvbnN0IGludDY0X3QgdHJ1bmNhdGVfc3RyaW5nX2ZpZWxkX2xvbmdlcl90aGFuKSB7CisgICAgICB0cnVuY2F0ZV9zdHJpbmdfZmllbGRfbG9uZ2VyX3RoYW5fID0gdHJ1bmNhdGVfc3RyaW5nX2ZpZWxkX2xvbmdlcl90aGFuOworICAgIH0KKworICAgIC8vIFJlZ2lzdGVyIGEgY3VzdG9tIGZpZWxkLXNwZWNpZmljIEZhc3RGaWVsZFZhbHVlUHJpbnRlciBmb3IgZmllbGRzCisgICAgLy8gd2l0aCBhIHBhcnRpY3VsYXIgRmllbGREZXNjcmlwdG9yLgorICAgIC8vIFJldHVybnMgInRydWUiIGlmIHRoZSByZWdpc3RyYXRpb24gc3VjY2VlZGVkLCBvciAiZmFsc2UiLCBpZiB0aGVyZSBpcworICAgIC8vIGFscmVhZHkgYSBwcmludGVyIGZvciB0aGF0IEZpZWxkRGVzY3JpcHRvci4KKyAgICAvLyBUYWtlcyBvd25lcnNoaXAgb2YgdGhlIHByaW50ZXIgb24gc3VjY2Vzc2Z1bCByZWdpc3RyYXRpb24uCisgICAgYm9vbCBSZWdpc3RlckZpZWxkVmFsdWVQcmludGVyKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhc3RGaWVsZFZhbHVlUHJpbnRlciogcHJpbnRlcik7CisKKyAgICBQUk9UT0JVRl9ERVBSRUNBVEVEX01TRygiUGxlYXNlIHVzZSBGYXN0RmllbGRWYWx1ZVByaW50ZXIiKQorICAgIGJvb2wgUmVnaXN0ZXJGaWVsZFZhbHVlUHJpbnRlcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZFZhbHVlUHJpbnRlciogcHJpbnRlcik7CisKKyAgICAvLyBSZWdpc3RlciBhIGN1c3RvbSBtZXNzYWdlLXNwZWNpZmljIE1lc3NhZ2VQcmludGVyIGZvciBtZXNzYWdlcyB3aXRoIGEKKyAgICAvLyBwYXJ0aWN1bGFyIERlc2NyaXB0b3IuCisgICAgLy8gUmV0dXJucyAidHJ1ZSIgaWYgdGhlIHJlZ2lzdHJhdGlvbiBzdWNjZWVkZWQsIG9yICJmYWxzZSIgaWYgdGhlcmUgaXMKKyAgICAvLyBhbHJlYWR5IGEgcHJpbnRlciBmb3IgdGhhdCBEZXNjcmlwdG9yLgorICAgIGJvb2wgUmVnaXN0ZXJNZXNzYWdlUHJpbnRlcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlUHJpbnRlciogcHJpbnRlcik7CisKKyAgIHByaXZhdGU6CisgICAgZnJpZW5kIHN0ZDo6c3RyaW5nIE1lc3NhZ2U6OkRlYnVnU3RyaW5nKCkgY29uc3Q7CisgICAgZnJpZW5kIHN0ZDo6c3RyaW5nIE1lc3NhZ2U6OlNob3J0RGVidWdTdHJpbmcoKSBjb25zdDsKKyAgICBmcmllbmQgc3RkOjpzdHJpbmcgTWVzc2FnZTo6VXRmOERlYnVnU3RyaW5nKCkgY29uc3Q7CisKKyAgICAvLyBTZXRzIHdoZXRoZXIgKkRlYnVnU3RyaW5nIHNob3VsZCBpbnNlcnQgYSBzaWxlbnQgbWFya2VyLgorICAgIHZvaWQgU2V0SW5zZXJ0U2lsZW50TWFya2VyKGJvb2wgdikgeyBpbnNlcnRfc2lsZW50X21hcmtlcl8gPSB2OyB9CisKKyAgICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGFuIGludGVybmFsIGNsYXNzIHVzZWQgdG8gcHJpbnQgdGhlIHRleHQKKyAgICAvLyBvdXRwdXQgdG8gdGhlIE91dHB1dFN0cmVhbSAoc2VlIHRleHRfZm9ybWF0LmNjIGZvciBpbXBsZW1lbnRhdGlvbikuCisgICAgY2xhc3MgVGV4dEdlbmVyYXRvcjsKKworICAgIC8vIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgYW4gaW50ZXJuYWwgY2xhc3MgdXNlZCB0byBwcmludCBmaWVsZCB2YWx1ZXMgZm9yCisgICAgLy8gRGVidWdTdHJpbmcgQVBJcyAoc2VlIHRleHRfZm9ybWF0LmNjIGZvciBpbXBsZW1lbnRhdGlvbikuCisgICAgY2xhc3MgRGVidWdTdHJpbmdGaWVsZFZhbHVlUHJpbnRlcjsKKworICAgIC8vIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgYW4gaW50ZXJuYWwgY2xhc3MgdXNlZCB0byBwcmludCBVVEYtOCBlc2NhcGVkCisgICAgLy8gc3RyaW5ncyAoc2VlIHRleHRfZm9ybWF0LmNjIGZvciBpbXBsZW1lbnRhdGlvbikuCisgICAgY2xhc3MgRmFzdEZpZWxkVmFsdWVQcmludGVyVXRmOEVzY2FwaW5nOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtEb05vdFBhcnNlOworCisgICAgLy8gSW50ZXJuYWwgUHJpbnQgbWV0aG9kLCB1c2VkIGZvciB3cml0aW5nIHRvIHRoZSBPdXRwdXRTdHJlYW0gdmlhCisgICAgLy8gdGhlIFRleHRHZW5lcmF0b3IgY2xhc3MuCisgICAgdm9pZCBQcmludChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0OworCisgICAgLy8gUHJpbnQgYSBzaW5nbGUgZmllbGQuCisgICAgdm9pZCBQcmludEZpZWxkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgIFRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Q7CisKKyAgICAvLyBQcmludCBhIHJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZCBpbiBzaG9ydCBmb3JtLgorICAgIHZvaWQgUHJpbnRTaG9ydFJlcGVhdGVkRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdDsKKworICAgIC8vIFByaW50IHRoZSBuYW1lIG9mIGEgZmllbGQgLS0gaS5lLiBldmVyeXRoaW5nIHRoYXQgY29tZXMgYmVmb3JlIHRoZQorICAgIC8vICc6JyBmb3IgYSBzaW5nbGUgbmFtZS92YWx1ZSBwYWlyLgorICAgIHZvaWQgUHJpbnRGaWVsZE5hbWUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgaW50IGZpZWxkX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX2NvdW50LCBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Q7CisKKyAgICAvLyBPdXRwdXRzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIHN1cHBsaWVkIG9uCisgICAgLy8gdGhlIG1lc3NhZ2Ugc3VwcGxpZWQgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgbm90IHNldC4KKyAgICB2b2lkIFByaW50RmllbGRWYWx1ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0OworCisgICAgLy8gUHJpbnQgdGhlIGZpZWxkcyBpbiBhbiBVbmtub3duRmllbGRTZXQuICBUaGV5IGFyZSBwcmludGVkIGJ5IHRhZyBudW1iZXIKKyAgICAvLyBvbmx5LiAgRW1iZWRkZWQgbWVzc2FnZXMgYXJlIGhldXJpc3RpY2FsbHkgaWRlbnRpZmllZCBieSBhdHRlbXB0aW5nIHRvCisgICAgLy8gcGFyc2UgdGhlbSAoc3ViamVjdCB0byB0aGUgcmVjdXJzaW9uIGJ1ZGdldCkuCisgICAgdm9pZCBQcmludFVua25vd25GaWVsZHMoY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3Vyc2lvbl9idWRnZXQpIGNvbnN0OworCisgICAgYm9vbCBQcmludEFueShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0OworCisgICAgY29uc3QgRmFzdEZpZWxkVmFsdWVQcmludGVyKiBHZXRGaWVsZFByaW50ZXIoCisgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgICAgIGF1dG8gaXQgPSBjdXN0b21fcHJpbnRlcnNfLmZpbmQoZmllbGQpOworICAgICAgcmV0dXJuIGl0ID09IGN1c3RvbV9wcmludGVyc18uZW5kKCkgPyBkZWZhdWx0X2ZpZWxkX3ZhbHVlX3ByaW50ZXJfLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgfQorCisgICAgaW50IGluaXRpYWxfaW5kZW50X2xldmVsXzsKKyAgICBib29sIHNpbmdsZV9saW5lX21vZGVfOworICAgIGJvb2wgdXNlX2ZpZWxkX251bWJlcl87CisgICAgYm9vbCB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlc187CisgICAgYm9vbCBpbnNlcnRfc2lsZW50X21hcmtlcl87CisgICAgYm9vbCBoaWRlX3Vua25vd25fZmllbGRzXzsKKyAgICBib29sIHByaW50X21lc3NhZ2VfZmllbGRzX2luX2luZGV4X29yZGVyXzsKKyAgICBib29sIGV4cGFuZF9hbnlfOworICAgIGludDY0X3QgdHJ1bmNhdGVfc3RyaW5nX2ZpZWxkX2xvbmdlcl90aGFuXzsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBGYXN0RmllbGRWYWx1ZVByaW50ZXI+IGRlZmF1bHRfZmllbGRfdmFsdWVfcHJpbnRlcl87CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBGaWVsZERlc2NyaXB0b3IqLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEZhc3RGaWVsZFZhbHVlUHJpbnRlcj4+CisgICAgICAgIEN1c3RvbVByaW50ZXJNYXA7CisgICAgQ3VzdG9tUHJpbnRlck1hcCBjdXN0b21fcHJpbnRlcnNfOworCisgICAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBEZXNjcmlwdG9yKiwgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IE1lc3NhZ2VQcmludGVyPj4KKyAgICAgICAgQ3VzdG9tTWVzc2FnZVByaW50ZXJNYXA7CisgICAgQ3VzdG9tTWVzc2FnZVByaW50ZXJNYXAgY3VzdG9tX21lc3NhZ2VfcHJpbnRlcnNfOworCisgICAgY29uc3QgRmluZGVyKiBmaW5kZXJfOworICB9OworCisgIC8vIFBhcnNlcyBhIHRleHQtZm9ybWF0IHByb3RvY29sIG1lc3NhZ2UgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIHRvCisgIC8vIHRoZSBnaXZlbiBtZXNzYWdlIG9iamVjdC4gVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIGh1bWFuLXJlYWRhYmxlCisgIC8vIHNlcmlhbGl6YXRpb24gZm9ybWF0IHdyaXR0ZW4gYnkgUHJpbnQoKS4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuIFRoZQorICAvLyBtZXNzYWdlIGlzIGNsZWFyZWQgZmlyc3QsIGV2ZW4gaWYgdGhlIGZ1bmN0aW9uIGZhaWxzIC0tIFNlZSBNZXJnZSgpIHRvCisgIC8vIGF2b2lkIHRoaXMgYmVoYXZpb3IuCisgIC8vCisgIC8vIEV4YW1wbGUgaW5wdXQ6ICJ1c2VyIHtcbiBpZDogMTIzIGV4dHJhIHsgZ2VuZGVyOiBNQUxFIGxhbmd1YWdlOiAnZW4nIH1cbn0iCisgIC8vCisgIC8vIE9uZSBjb21tb24gdXNlIGZvciB0aGlzIGZ1bmN0aW9uIGlzIHBhcnNpbmcgaGFuZHdyaXR0ZW4gc3RyaW5ncyBpbiB0ZXN0CisgIC8vIGNvZGUuCisgIC8vCisgIC8vIElmIHlvdSB3b3VsZCBsaWtlIHRvIHJlYWQgYSBwcm90b2NvbCBidWZmZXIgc2VyaWFsaXplZCBpbiB0aGUKKyAgLy8gKG5vbi1odW1hbi1yZWFkYWJsZSkgYmluYXJ5IHdpcmUgZm9ybWF0LCBzZWUKKyAgLy8gZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGU6OlBhcnNlRnJvbVN0cmluZygpLgorICBzdGF0aWMgYm9vbCBQYXJzZShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIE1lc3NhZ2UqIG91dHB1dCk7CisgIC8vIExpa2UgUGFyc2UoKSwgYnV0IHJlYWRzIGRpcmVjdGx5IGZyb20gYSBzdHJpbmcuCisgIHN0YXRpYyBib29sIFBhcnNlRnJvbVN0cmluZyhDb25zdFN0cmluZ1BhcmFtIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQpOworCisgIC8vIExpa2UgUGFyc2UoKSwgYnV0IHRoZSBkYXRhIGlzIG1lcmdlZCBpbnRvIHRoZSBnaXZlbiBtZXNzYWdlLCBhcyBpZgorICAvLyB1c2luZyBNZXNzYWdlOjpNZXJnZUZyb20oKS4KKyAgc3RhdGljIGJvb2wgTWVyZ2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQpOworICAvLyBMaWtlIE1lcmdlKCksIGJ1dCByZWFkcyBkaXJlY3RseSBmcm9tIGEgc3RyaW5nLgorICBzdGF0aWMgYm9vbCBNZXJnZUZyb21TdHJpbmcoQ29uc3RTdHJpbmdQYXJhbSBpbnB1dCwgTWVzc2FnZSogb3V0cHV0KTsKKworICAvLyBQYXJzZSB0aGUgZ2l2ZW4gdGV4dCBhcyBhIHNpbmdsZSBmaWVsZCB2YWx1ZSBhbmQgc3RvcmUgaXQgaW50byB0aGUKKyAgLy8gZ2l2ZW4gZmllbGQgb2YgdGhlIGdpdmVuIG1lc3NhZ2UuIElmIHRoZSBmaWVsZCBpcyBhIHJlcGVhdGVkIGZpZWxkLAorICAvLyB0aGUgbmV3IHZhbHVlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZAorICBzdGF0aWMgYm9vbCBQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UpOworCisgIC8vIEEgbG9jYXRpb24gaW4gdGhlIHBhcnNlZCB0ZXh0LgorICBzdHJ1Y3QgUGFyc2VMb2NhdGlvbiB7CisgICAgaW50IGxpbmU7CisgICAgaW50IGNvbHVtbjsKKworICAgIFBhcnNlTG9jYXRpb24oKSA6IGxpbmUoLTEpLCBjb2x1bW4oLTEpIHt9CisgICAgUGFyc2VMb2NhdGlvbihpbnQgbGluZV9wYXJhbSwgaW50IGNvbHVtbl9wYXJhbSkKKyAgICAgICAgOiBsaW5lKGxpbmVfcGFyYW0pLCBjb2x1bW4oY29sdW1uX3BhcmFtKSB7fQorICB9OworCisgIC8vIEEgcmFuZ2Ugb2YgbG9jYXRpb25zIGluIHRoZSBwYXJzZWQgdGV4dCwgaW5jbHVkaW5nIGBzdGFydGAgYW5kIGV4Y2x1ZGluZworICAvLyBgZW5kYC4KKyAgc3RydWN0IFBhcnNlTG9jYXRpb25SYW5nZSB7CisgICAgUGFyc2VMb2NhdGlvbiBzdGFydDsKKyAgICBQYXJzZUxvY2F0aW9uIGVuZDsKKyAgICBQYXJzZUxvY2F0aW9uUmFuZ2UoKSA6IHN0YXJ0KCksIGVuZCgpIHt9CisgICAgUGFyc2VMb2NhdGlvblJhbmdlKFBhcnNlTG9jYXRpb24gc3RhcnRfcGFyYW0sIFBhcnNlTG9jYXRpb24gZW5kX3BhcmFtKQorICAgICAgICA6IHN0YXJ0KHN0YXJ0X3BhcmFtKSwgZW5kKGVuZF9wYXJhbSkge30KKyAgfTsKKworICAvLyBEYXRhIHN0cnVjdHVyZSB3aGljaCBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUgbG9jYXRpb25zIG9mIGVhY2ggZmllbGQKKyAgLy8gdmFsdWUgcGFyc2VkIGZyb20gdGhlIHRleHQuCisgIGNsYXNzIFBST1RPQlVGX0VYUE9SVCBQYXJzZUluZm9UcmVlIHsKKyAgIHB1YmxpYzoKKyAgICBQYXJzZUluZm9UcmVlKCkgPSBkZWZhdWx0OworICAgIFBhcnNlSW5mb1RyZWUoY29uc3QgUGFyc2VJbmZvVHJlZSYpID0gZGVsZXRlOworICAgIFBhcnNlSW5mb1RyZWUmIG9wZXJhdG9yPShjb25zdCBQYXJzZUluZm9UcmVlJikgPSBkZWxldGU7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBwYXJzZSBsb2NhdGlvbiByYW5nZSBmb3IgaW5kZXgtdGggdmFsdWUgb2YgdGhlIGZpZWxkIGluCisgICAgLy8gdGhlIHBhcnNlZCB0ZXh0LiBJZiBub25lIGV4aXN0cywgcmV0dXJucyBhIGxvY2F0aW9uIHdpdGggc3RhcnQgYW5kIGVuZAorICAgIC8vIGxpbmUgLTEuIEluZGV4IHNob3VsZCBiZSAtMSBmb3Igbm90LXJlcGVhdGVkIGZpZWxkcy4KKyAgICBQYXJzZUxvY2F0aW9uUmFuZ2UgR2V0TG9jYXRpb25SYW5nZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3Q7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBzdGFydGluZyBwYXJzZSBsb2NhdGlvbiBmb3IgaW5kZXgtdGggdmFsdWUgb2YgdGhlIGZpZWxkIGluCisgICAgLy8gdGhlIHBhcnNlZCB0ZXh0LiBJZiBub25lIGV4aXN0cywgcmV0dXJucyBhIGxvY2F0aW9uIHdpdGggbGluZSA9IC0xLiBJbmRleAorICAgIC8vIHNob3VsZCBiZSAtMSBmb3Igbm90LXJlcGVhdGVkIGZpZWxkcy4KKyAgICBQYXJzZUxvY2F0aW9uIEdldExvY2F0aW9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgeworICAgICAgcmV0dXJuIEdldExvY2F0aW9uUmFuZ2UoZmllbGQsIGluZGV4KS5zdGFydDsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBwYXJzZSBpbmZvIHRyZWUgZm9yIHRoZSBnaXZlbiBmaWVsZCwgd2hpY2ggbXVzdCBiZSBhIG1lc3NhZ2UKKyAgICAvLyB0eXBlLiBUaGUgbmVzdGVkIGluZm9ybWF0aW9uIHRyZWUgaXMgb3duZWQgYnkgdGhlIHJvb3QgdHJlZSBhbmQgd2lsbCBiZQorICAgIC8vIGRlbGV0ZWQgd2hlbiBpdCBpcyBkZWxldGVkLgorICAgIFBhcnNlSW5mb1RyZWUqIEdldFRyZWVGb3JOZXN0ZWQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3Q7CisKKyAgIHByaXZhdGU6CisgICAgLy8gQWxsb3cgdGhlIHRleHQgZm9ybWF0IHBhcnNlciB0byByZWNvcmQgaW5mb3JtYXRpb24gaW50byB0aGUgdHJlZS4KKyAgICBmcmllbmQgY2xhc3MgVGV4dEZvcm1hdDsKKworICAgIC8vIFJlY29yZHMgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgbG9jYXRpb25zIG9mIGEgc2luZ2xlIHZhbHVlIGZvciBhIGZpZWxkLgorICAgIHZvaWQgUmVjb3JkTG9jYXRpb24oY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgUGFyc2VMb2NhdGlvblJhbmdlIHJhbmdlKTsKKworICAgIC8vIENyZWF0ZSBhbmQgcmVjb3JkcyBhIG5lc3RlZCB0cmVlIGZvciBhIG5lc3RlZCBtZXNzYWdlIGZpZWxkLgorICAgIFBhcnNlSW5mb1RyZWUqIENyZWF0ZU5lc3RlZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworICAgIC8vIERlZmluZXMgdGhlIG1hcCBmcm9tIHRoZSBpbmRleC10aCBmaWVsZCBkZXNjcmlwdG9yIHRvIGl0cyBwYXJzZSBsb2NhdGlvbi4KKyAgICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IEZpZWxkRGVzY3JpcHRvciosIHN0ZDo6dmVjdG9yPFBhcnNlTG9jYXRpb25SYW5nZT4+CisgICAgICAgIExvY2F0aW9uTWFwOworCisgICAgLy8gRGVmaW5lcyB0aGUgbWFwIGZyb20gdGhlIGluZGV4LXRoIGZpZWxkIGRlc2NyaXB0b3IgdG8gdGhlIG5lc3RlZCBwYXJzZQorICAgIC8vIGluZm8gdHJlZS4KKyAgICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IEZpZWxkRGVzY3JpcHRvciosCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8UGFyc2VJbmZvVHJlZT4+PgorICAgICAgICBOZXN0ZWRNYXA7CisKKyAgICBMb2NhdGlvbk1hcCBsb2NhdGlvbnNfOworICAgIE5lc3RlZE1hcCBuZXN0ZWRfOworICB9OworCisgIC8vIEZvciBtb3JlIGNvbnRyb2wgb3ZlciBwYXJzaW5nLCB1c2UgdGhpcyBjbGFzcy4KKyAgY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFBhcnNlciB7CisgICBwdWJsaWM6CisgICAgUGFyc2VyKCk7CisgICAgflBhcnNlcigpOworCisgICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpQYXJzZSgpLgorICAgIGJvb2wgUGFyc2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQpOworICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKCkuCisgICAgYm9vbCBQYXJzZUZyb21TdHJpbmcoQ29uc3RTdHJpbmdQYXJhbSBpbnB1dCwgTWVzc2FnZSogb3V0cHV0KTsKKyAgICAvLyBMaWtlIFRleHRGb3JtYXQ6Ok1lcmdlKCkuCisgICAgYm9vbCBNZXJnZShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIE1lc3NhZ2UqIG91dHB1dCk7CisgICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpNZXJnZUZyb21TdHJpbmcoKS4KKyAgICBib29sIE1lcmdlRnJvbVN0cmluZyhDb25zdFN0cmluZ1BhcmFtIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQpOworCisgICAgLy8gU2V0IHdoZXJlIHRvIHJlcG9ydCBwYXJzZSBlcnJvcnMuICBJZiBudWxscHRyICh0aGUgZGVmYXVsdCksIGVycm9ycyB3aWxsCisgICAgLy8gYmUgcHJpbnRlZCB0byBzdGRlcnIuCisgICAgdm9pZCBSZWNvcmRFcnJvcnNUbyhpbzo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3RvcikgeworICAgICAgZXJyb3JfY29sbGVjdG9yXyA9IGVycm9yX2NvbGxlY3RvcjsKKyAgICB9CisKKyAgICAvLyBTZXQgaG93IHBhcnNlciBmaW5kcyBleHRlbnNpb25zLiAgSWYgbnVsbHB0ciAodGhlIGRlZmF1bHQpLCB0aGUKKyAgICAvLyBwYXJzZXIgd2lsbCB1c2UgdGhlIHN0YW5kYXJkIFJlZmxlY3Rpb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aAorICAgIC8vIHRoZSBtZXNzYWdlIGJlaW5nIHBhcnNlZC4KKyAgICB2b2lkIFNldEZpbmRlcihjb25zdCBGaW5kZXIqIGZpbmRlcikgeyBmaW5kZXJfID0gZmluZGVyOyB9CisKKyAgICAvLyBTZXRzIHdoZXJlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJzZSB3aWxsIGJlIHdyaXR0ZW4uIElmCisgICAgLy8gbnVsbHB0cgorICAgIC8vICh0aGUgZGVmYXVsdCksIHRoZW4gbm8gbG9jYXRpb24gd2lsbCBiZSB3cml0dGVuLgorICAgIHZvaWQgV3JpdGVMb2NhdGlvbnNUbyhQYXJzZUluZm9UcmVlKiB0cmVlKSB7IHBhcnNlX2luZm9fdHJlZV8gPSB0cmVlOyB9CisKKyAgICAvLyBOb3JtYWxseSBwYXJzaW5nIGZhaWxzIGlmLCBhZnRlciBwYXJzaW5nLCBvdXRwdXQtPklzSW5pdGlhbGl6ZWQoKQorICAgIC8vIHJldHVybnMgZmFsc2UuICBDYWxsIEFsbG93UGFydGlhbE1lc3NhZ2UodHJ1ZSkgdG8gc2tpcCB0aGlzIGNoZWNrLgorICAgIHZvaWQgQWxsb3dQYXJ0aWFsTWVzc2FnZShib29sIGFsbG93KSB7IGFsbG93X3BhcnRpYWxfID0gYWxsb3c7IH0KKworICAgIC8vIEFsbG93IGZpZWxkIG5hbWVzIHRvIGJlIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgorICAgIC8vIFRoaXMgaXMgbm90IGFkdmlzYWJsZSBpZiB0aGVyZSBhcmUgZmllbGRzIHRoYXQgb25seSBkaWZmZXIgaW4gY2FzZSwgb3IKKyAgICAvLyBpZiB5b3Ugd2FudCB0byBlbmZvcmNlIHdyaXRpbmcgaW4gdGhlIGNhbm9uaWNhbCBmb3JtLgorICAgIC8vIFRoaXMgaXMgJ2ZhbHNlJyBieSBkZWZhdWx0LgorICAgIHZvaWQgQWxsb3dDYXNlSW5zZW5zaXRpdmVGaWVsZChib29sIGFsbG93KSB7CisgICAgICBhbGxvd19jYXNlX2luc2Vuc2l0aXZlX2ZpZWxkXyA9IGFsbG93OworICAgIH0KKworICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6UGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZworICAgIGJvb2wgUGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCk7CisKKyAgICAvLyBXaGVuIGFuIHVua25vd24gZXh0ZW5zaW9uIGlzIG1ldCwgcGFyc2luZyB3aWxsIGZhaWwgaWYgdGhpcyBvcHRpb24gaXMKKyAgICAvLyBzZXQgdG8gZmFsc2UgKHRoZSBkZWZhdWx0KS4gSWYgdHJ1ZSwgdW5rbm93biBleHRlbnNpb25zIHdpbGwgYmUgaWdub3JlZAorICAgIC8vIGFuZCBhIHdhcm5pbmcgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC4KKyAgICAvLyBCZXdhcmUhIFNldHRpbmcgdGhpcyBvcHRpb24gdHJ1ZSBtYXkgaGlkZSBzb21lIGVycm9ycyAoZS5nLiBzcGVsbGluZworICAgIC8vIGVycm9yIG9uIGV4dGVuc2lvbiBuYW1lKS4gIFRoaXMgYWxsb3dzIGRhdGEgbG9zczsgdW5saWtlIGJpbmFyeSBmb3JtYXQsCisgICAgLy8gdGV4dCBmb3JtYXQgY2Fubm90IHByZXNlcnZlIHVua25vd24gZXh0ZW5zaW9ucy4gIEF2b2lkIHVzaW5nIHRoaXMgb3B0aW9uCisgICAgLy8gaWYgcG9zc2libGUuCisgICAgdm9pZCBBbGxvd1Vua25vd25FeHRlbnNpb24oYm9vbCBhbGxvdykgeyBhbGxvd191bmtub3duX2V4dGVuc2lvbl8gPSBhbGxvdzsgfQorCisgICAgLy8gV2hlbiBhbiB1bmtub3duIGZpZWxkIGlzIG1ldCwgcGFyc2luZyB3aWxsIGZhaWwgaWYgdGhpcyBvcHRpb24gaXMgc2V0CisgICAgLy8gdG8gZmFsc2UgKHRoZSBkZWZhdWx0KS4gSWYgdHJ1ZSwgdW5rbm93biBmaWVsZHMgd2lsbCBiZSBpZ25vcmVkIGFuZAorICAgIC8vIGEgd2FybmluZyBtZXNzYWdlIHdpbGwgYmUgZ2VuZXJhdGVkLgorICAgIC8vIEJld2FyZSEgU2V0dGluZyB0aGlzIG9wdGlvbiB0cnVlIG1heSBoaWRlIHNvbWUgZXJyb3JzIChlLmcuIHNwZWxsaW5nCisgICAgLy8gZXJyb3Igb24gZmllbGQgbmFtZSkuIFRoaXMgYWxsb3dzIGRhdGEgbG9zczsgdW5saWtlIGJpbmFyeSBmb3JtYXQsIHRleHQKKyAgICAvLyBmb3JtYXQgY2Fubm90IHByZXNlcnZlIHVua25vd24gZmllbGRzLiAgQXZvaWQgdXNpbmcgdGhpcyBvcHRpb24KKyAgICAvLyBpZiBwb3NzaWJsZS4KKyAgICB2b2lkIEFsbG93VW5rbm93bkZpZWxkKGJvb2wgYWxsb3cpIHsgYWxsb3dfdW5rbm93bl9maWVsZF8gPSBhbGxvdzsgfQorCisKKyAgICB2b2lkIEFsbG93RmllbGROdW1iZXIoYm9vbCBhbGxvdykgeyBhbGxvd19maWVsZF9udW1iZXJfID0gYWxsb3c7IH0KKworICAgIC8vIFNldHMgbWF4aW11bSByZWN1cnNpb24gZGVwdGggd2hpY2ggcGFyc2VyIGNhbiB1c2UuIFRoaXMgaXMgZWZmZWN0aXZlbHkKKyAgICAvLyB0aGUgbWF4aW11bSBhbGxvd2VkIG5lc3Rpbmcgb2YgcHJvdG8gbWVzc2FnZXMuCisgICAgdm9pZCBTZXRSZWN1cnNpb25MaW1pdChpbnQgbGltaXQpIHsgcmVjdXJzaW9uX2xpbWl0XyA9IGxpbWl0OyB9CisKKyAgIHByaXZhdGU6CisgICAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhbiBpbnRlcm5hbCBjbGFzcyB1c2VkIHRvIHBhcnNlIHRleHQKKyAgICAvLyByZXByZXNlbnRhdGlvbnMgKHNlZSB0ZXh0X2Zvcm1hdC5jYyBmb3IgaW1wbGVtZW50YXRpb24pLgorICAgIGNsYXNzIFBhcnNlckltcGw7CisKKyAgICAvLyBMaWtlIFRleHRGb3JtYXQ6Ok1lcmdlKCkuICBUaGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gaXMgdXNlZAorICAgIC8vIHRvIGRvIHRoZSBwYXJzaW5nLgorICAgIGJvb2wgTWVyZ2VVc2luZ0ltcGwoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZXJJbXBsKiBwYXJzZXJfaW1wbCk7CisKKyAgICBpbzo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3Rvcl87CisgICAgY29uc3QgRmluZGVyKiBmaW5kZXJfOworICAgIFBhcnNlSW5mb1RyZWUqIHBhcnNlX2luZm9fdHJlZV87CisgICAgYm9vbCBhbGxvd19wYXJ0aWFsXzsKKyAgICBib29sIGFsbG93X2Nhc2VfaW5zZW5zaXRpdmVfZmllbGRfOworICAgIGJvb2wgYWxsb3dfdW5rbm93bl9maWVsZF87CisgICAgYm9vbCBhbGxvd191bmtub3duX2V4dGVuc2lvbl87CisgICAgYm9vbCBhbGxvd191bmtub3duX2VudW1fOworICAgIGJvb2wgYWxsb3dfZmllbGRfbnVtYmVyXzsKKyAgICBib29sIGFsbG93X3JlbGF4ZWRfd2hpdGVzcGFjZV87CisgICAgYm9vbCBhbGxvd19zaW5ndWxhcl9vdmVyd3JpdGVzXzsKKyAgICBpbnQgcmVjdXJzaW9uX2xpbWl0XzsKKyAgfTsKKworCisgcHJpdmF0ZToKKyAgLy8gSGFjazogUGFyc2VJbmZvVHJlZSBkZWNsYXJlcyBUZXh0Rm9ybWF0IGFzIGEgZnJpZW5kIHdoaWNoIHNob3VsZCBleHRlbmQKKyAgLy8gdGhlIGZyaWVuZHNoaXAgdG8gVGV4dEZvcm1hdDo6UGFyc2VyOjpQYXJzZXJJbXBsLCBidXQgdW5mb3J0dW5hdGVseSBzb21lCisgIC8vIG9sZCBjb21waWxlcnMgKGUuZy4gR0NDIDMuNC42KSBkb24ndCBpbXBsZW1lbnQgdGhpcyBjb3JyZWN0bHkuIFdlIHByb3ZpZGUKKyAgLy8gaGVscGVycyBmb3IgUGFyc2VySW1wbCB0byBjYWxsIG1ldGhvZHMgb2YgUGFyc2VJbmZvVHJlZS4KKyAgc3RhdGljIGlubGluZSB2b2lkIFJlY29yZExvY2F0aW9uKFBhcnNlSW5mb1RyZWUqIGluZm9fdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUxvY2F0aW9uUmFuZ2UgbG9jYXRpb24pOworICBzdGF0aWMgaW5saW5lIFBhcnNlSW5mb1RyZWUqIENyZWF0ZU5lc3RlZChQYXJzZUluZm9UcmVlKiBpbmZvX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXh0Rm9ybWF0KTsKK307CisKK2lubGluZSB2b2lkIFRleHRGb3JtYXQ6OlJlY29yZExvY2F0aW9uKFBhcnNlSW5mb1RyZWUqIGluZm9fdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUxvY2F0aW9uUmFuZ2UgbG9jYXRpb24pIHsKKyAgaW5mb190cmVlLT5SZWNvcmRMb2NhdGlvbihmaWVsZCwgbG9jYXRpb24pOworfQorCitpbmxpbmUgVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSogVGV4dEZvcm1hdDo6Q3JlYXRlTmVzdGVkKAorICAgIFBhcnNlSW5mb1RyZWUqIGluZm9fdHJlZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICByZXR1cm4gaW5mb190cmVlLT5DcmVhdGVOZXN0ZWQoZmllbGQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVEVYVF9GT1JNQVRfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjZmMmYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDIyODAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGpzY2hvcnJAZ29vZ2xlLmNvbSAoSm9zZXBoIFNjaG9ycikKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FueS5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbDIuaD4KKworCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCituYW1lc3BhY2UgaW50ZXJuYWwgeworLy8gQ29udHJvbHMgaW5zZXJ0aW9uIG9mIERFQlVHX1NUUklOR19TSUxFTlRfTUFSS0VSLgorZXh0ZXJuIFBST1RPQlVGX0VYUE9SVCBzdGQ6OmF0b21pYzxib29sPiBlbmFibGVfZGVidWdfdGV4dF9mb3JtYXRfbWFya2VyOworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIENhbid0IHVzZSBhbiBhbm9ueW1vdXMgbmFtZXNwYWNlIGhlcmUgZHVlIHRvIGJyb2tlbm5lc3Mgb2YgVHJ1NjQgY29tcGlsZXIuCituYW1lc3BhY2UgdGV4dF9mb3JtYXRfdW5pdHRlc3QgeworCit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRGVidWdTdHJpbmdTaWxlbnRNYXJrZXI7CisKKy8vIEEgYmFzaWMgc3RyaW5nIHdpdGggZGlmZmVyZW50IGVzY2FwYWJsZSBjaGFyYWN0ZXJzIGZvciB0ZXN0aW5nLgorY29uc3Qgc3RkOjpzdHJpbmcga0VzY2FwZVRlc3RTdHJpbmcgPQorICAgICJcIkEgc3RyaW5nIHdpdGggJyBjaGFyYWN0ZXJzIFxuIGFuZCBcciBuZXdsaW5lcyBhbmQgXHQgdGFicyBhbmQgXDAwMSAiCisgICAgInNsYXNoZXMgXFwgYW5kICBtdWx0aXBsZSAgIHNwYWNlcyI7CisKKy8vIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFib3ZlIHN0cmluZyB3aXRoIGFsbCB0aGUgY2hhcmFjdGVycyBlc2NhcGVkLgorY29uc3Qgc3RkOjpzdHJpbmcga0VzY2FwZVRlc3RTdHJpbmdFc2NhcGVkID0KKyAgICAiXCJcXFwiQSBzdHJpbmcgd2l0aCBcXCcgY2hhcmFjdGVycyBcXG4gYW5kIFxcciBuZXdsaW5lcyAiCisgICAgImFuZCBcXHQgdGFicyBhbmQgXFwwMDEgc2xhc2hlcyBcXFxcIGFuZCAgbXVsdGlwbGUgICBzcGFjZXNcIiI7CisKK2NsYXNzIFRleHRGb3JtYXRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0U3VpdGUoKSB7CisgICAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkdldENvbnRlbnRzKAorICAgICAgICBUZXN0VXRpbDo6R2V0VGVzdERhdGFQYXRoKAorICAgICAgICAgICAgIm5ldC9wcm90bzIvaW50ZXJuYWwvIgorICAgICAgICAgICAgInRlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfb25lb2ZfaW1wbGVtZW50ZWQudHh0IiksCisgICAgICAgICZzdGF0aWNfcHJvdG9fdGV4dF9mb3JtYXRfLCB0cnVlKSk7CisgICAgQ2xlYW5TdHJpbmdMaW5lRW5kaW5ncygmc3RhdGljX3Byb3RvX3RleHRfZm9ybWF0XywgZmFsc2UpOworICB9CisKKyAgVGV4dEZvcm1hdFRlc3QoKSA6IHByb3RvX3RleHRfZm9ybWF0XyhzdGF0aWNfcHJvdG9fdGV4dF9mb3JtYXRfKSB7fQorCisgcHJvdGVjdGVkOgorICAvLyBUZXh0IGZvcm1hdCByZWFkIGZyb20gdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHByb3RvX3RleHRfZm9ybWF0XzsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBwcm90b187CisKKyBwcml2YXRlOgorICBzdGF0aWMgc3RkOjpzdHJpbmcgc3RhdGljX3Byb3RvX3RleHRfZm9ybWF0XzsKK307CitzdGQ6OnN0cmluZyBUZXh0Rm9ybWF0VGVzdDo6c3RhdGljX3Byb3RvX3RleHRfZm9ybWF0XzsKKworY2xhc3MgVGV4dEZvcm1hdEV4dGVuc2lvbnNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0U3VpdGUoKSB7CisgICAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkdldENvbnRlbnRzKAorICAgICAgICBUZXN0VXRpbDo6R2V0VGVzdERhdGFQYXRoKCJuZXQvcHJvdG8yL2ludGVybmFsL3Rlc3RkYXRhLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dCIpLAorICAgICAgICAmc3RhdGljX3Byb3RvX3RleHRfZm9ybWF0XywgdHJ1ZSkpOworICAgIENsZWFuU3RyaW5nTGluZUVuZGluZ3MoJnN0YXRpY19wcm90b190ZXh0X2Zvcm1hdF8sIGZhbHNlKTsKKyAgfQorCisgIFRleHRGb3JtYXRFeHRlbnNpb25zVGVzdCgpIDogcHJvdG9fdGV4dF9mb3JtYXRfKHN0YXRpY19wcm90b190ZXh0X2Zvcm1hdF8pIHt9CisKKyBwcm90ZWN0ZWQ6CisgIC8vIERlYnVnIHN0cmluZyByZWFkIGZyb20gdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHByb3RvX3RleHRfZm9ybWF0XzsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIHByb3RvXzsKKworIHByaXZhdGU6CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBzdGF0aWNfcHJvdG9fdGV4dF9mb3JtYXRfOworfTsKK3N0ZDo6c3RyaW5nIFRleHRGb3JtYXRFeHRlbnNpb25zVGVzdDo6c3RhdGljX3Byb3RvX3RleHRfZm9ybWF0XzsKKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBCYXNpYykgeworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZwcm90b18pOworICBzdGQ6OnN0cmluZyBhY3R1YWxfcHJvdG9fdGV4dF9mb3JtYXQ7CisgIFRleHRGb3JtYXQ6OlByaW50VG9TdHJpbmcocHJvdG9fLCAmYWN0dWFsX3Byb3RvX3RleHRfZm9ybWF0KTsKKyAgRVhQRUNUX0VRKGFjdHVhbF9wcm90b190ZXh0X2Zvcm1hdCwgcHJvdG9fdGV4dF9mb3JtYXRfKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRFeHRlbnNpb25zVGVzdCwgRXh0ZW5zaW9ucykgeworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmcHJvdG9fKTsKKyAgc3RkOjpzdHJpbmcgYWN0dWFsX3Byb3RvX3RleHRfZm9ybWF0OworICBUZXh0Rm9ybWF0OjpQcmludFRvU3RyaW5nKHByb3RvXywgJmFjdHVhbF9wcm90b190ZXh0X2Zvcm1hdCk7CisgIEVYUEVDVF9FUShhY3R1YWxfcHJvdG9fdGV4dF9mb3JtYXQsIHByb3RvX3RleHRfZm9ybWF0Xyk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgU2hvcnREZWJ1Z1N0cmluZykgeworICBwcm90b18uc2V0X29wdGlvbmFsX2ludDMyKDEpOworICBwcm90b18uc2V0X29wdGlvbmFsX3N0cmluZygiaGVsbG8iKTsKKyAgcHJvdG9fLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDIpOworICBwcm90b18ubXV0YWJsZV9vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKTsKKworICBFWFBFQ1RfRVEocHJvdG9fLlNob3J0RGVidWdTdHJpbmcoKSwKKyAgICAgICAgICAgIFN0ckNhdCgib3B0aW9uYWxfaW50MzI6ICIsIGtEZWJ1Z1N0cmluZ1NpbGVudE1hcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsX3N0cmluZzogXCJoZWxsb1wiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgeyBiYjogMiB9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIHsgfSIpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBTaG9ydFByaW1pdGl2ZVJlcGVhdGVkcykgeworICBwcm90b18uc2V0X29wdGlvbmFsX2ludDMyKDEyMyk7CisgIHByb3RvXy5hZGRfcmVwZWF0ZWRfaW50MzIoNDU2KTsKKyAgcHJvdG9fLmFkZF9yZXBlYXRlZF9pbnQzMig3ODkpOworICBwcm90b18uYWRkX3JlcGVhdGVkX3N0cmluZygiZm9vIik7CisgIHByb3RvXy5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJiYXIiKTsKKyAgcHJvdG9fLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMik7CisgIHByb3RvXy5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDMpOworICBwcm90b18uYWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7CisgIHByb3RvXy5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0odW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSKTsKKworICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIHByaW50ZXIuU2V0VXNlU2hvcnRSZXBlYXRlZFByaW1pdGl2ZXModHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIHRleHQ7CisgIEVYUEVDVF9UUlVFKHByaW50ZXIuUHJpbnRUb1N0cmluZyhwcm90b18sICZ0ZXh0KSk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgIm9wdGlvbmFsX2ludDMyOiAxMjNcbiIKKyAgICAgICJyZXBlYXRlZF9pbnQzMjogWzQ1NiwgNzg5XVxuIgorICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJmb29cIlxuIgorICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJiYXJcIlxuIgorICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHtcbiAgYmI6IDJcbn1cbiIKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7XG4gIGJiOiAzXG59XG4iCisgICAgICAicmVwZWF0ZWRfbmVzdGVkX2VudW06IFtGT08sIEJBUl1cbiIsCisgICAgICB0ZXh0KTsKKworICAvLyBWZXJpZnkgdGhhdCBhbnkgZXhpc3RpbmcgZGF0YSBpbiB0aGUgc3RyaW5nIGlzIGNsZWFyZWQgd2hlbiBQcmludFRvU3RyaW5nKCkKKyAgLy8gaXMgY2FsbGVkLgorICB0ZXh0ID0gImp1c3Qgc29tZSBkYXRhIGhlcmUuLi5cblxuYmxhaCBibGFoIjsKKyAgRVhQRUNUX1RSVUUocHJpbnRlci5QcmludFRvU3RyaW5nKHByb3RvXywgJnRleHQpKTsKKworICBFWFBFQ1RfRVEoCisgICAgICAib3B0aW9uYWxfaW50MzI6IDEyM1xuIgorICAgICAgInJlcGVhdGVkX2ludDMyOiBbNDU2LCA3ODldXG4iCisgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcImZvb1wiXG4iCisgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcImJhclwiXG4iCisgICAgICAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Uge1xuICBiYjogMlxufVxuIgorICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHtcbiAgYmI6IDNcbn1cbiIKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfZW51bTogW0ZPTywgQkFSXVxuIiwKKyAgICAgIHRleHQpOworCisgIC8vIFRyeSBpbiBzaW5nbGUtbGluZSBtb2RlLgorICBwcmludGVyLlNldFNpbmdsZUxpbmVNb2RlKHRydWUpOworICBFWFBFQ1RfVFJVRShwcmludGVyLlByaW50VG9TdHJpbmcocHJvdG9fLCAmdGV4dCkpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJvcHRpb25hbF9pbnQzMjogMTIzICIKKyAgICAgICJyZXBlYXRlZF9pbnQzMjogWzQ1NiwgNzg5XSAiCisgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcImZvb1wiICIKKyAgICAgICJyZXBlYXRlZF9zdHJpbmc6IFwiYmFyXCIgIgorICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsgYmI6IDIgfSAiCisgICAgICAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgeyBiYjogMyB9ICIKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfZW51bTogW0ZPTywgQkFSXSAiLAorICAgICAgdGV4dCk7Cit9CisKKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBTdHJpbmdFc2NhcGUpIHsKKyAgLy8gU2V0IHRoZSBzdHJpbmcgdmFsdWUgdG8gdGVzdC4KKyAgcHJvdG9fLnNldF9vcHRpb25hbF9zdHJpbmcoa0VzY2FwZVRlc3RTdHJpbmcpOworCisgIC8vIEdldCB0aGUgRGVidWdTdHJpbmcgZnJvbSB0aGUgcHJvdG8uCisgIHN0ZDo6c3RyaW5nIGRlYnVnX3N0cmluZyA9IHByb3RvXy5EZWJ1Z1N0cmluZygpOworICBzdGQ6OnN0cmluZyB1dGY4X2RlYnVnX3N0cmluZyA9IHByb3RvXy5VdGY4RGVidWdTdHJpbmcoKTsKKworICAvLyBIYXJkY29kZSBhIGNvcnJlY3QgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgorICBzdGQ6OnN0cmluZyBjb3JyZWN0X3N0cmluZyA9CisgICAgICBTdHJDYXQoIm9wdGlvbmFsX3N0cmluZzogIiwga0RlYnVnU3RyaW5nU2lsZW50TWFya2VyLAorICAgICAgICAgICAgICAgICAgIGtFc2NhcGVUZXN0U3RyaW5nRXNjYXBlZCwgIlxuIik7CisKKyAgLy8gQ29tcGFyZS4KKyAgRVhQRUNUX0VRKGNvcnJlY3Rfc3RyaW5nLCBkZWJ1Z19zdHJpbmcpOworICAvLyBVVEYtOCBzdHJpbmcgaXMgdGhlIHNhbWUgYXMgbm9uLVVURi04IGJlY2F1c2UKKyAgLy8gdGhlIHByb3RvY29sIGJ1ZmZlciBjb250YWlucyBubyBVVEYtOCB0ZXh0LgorICBFWFBFQ1RfRVEoY29ycmVjdF9zdHJpbmcsIHV0ZjhfZGVidWdfc3RyaW5nKTsKKworICBzdGQ6OnN0cmluZyBleHBlY3RlZF9zaG9ydF9kZWJ1Z19zdHJpbmcgPSBTdHJDYXQoCisgICAgICAib3B0aW9uYWxfc3RyaW5nOiAiLCBrRGVidWdTdHJpbmdTaWxlbnRNYXJrZXIsIGtFc2NhcGVUZXN0U3RyaW5nRXNjYXBlZCk7CisgIEVYUEVDVF9FUShleHBlY3RlZF9zaG9ydF9kZWJ1Z19zdHJpbmcsIHByb3RvXy5TaG9ydERlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFV0ZjhEZWJ1Z1N0cmluZykgeworICAvLyBTZXQgdGhlIHN0cmluZyB2YWx1ZSB0byB0ZXN0LgorICBwcm90b18uc2V0X29wdGlvbmFsX3N0cmluZygiXDM1MFwyNjBcMjY3XDM0NlwyNTVcMjE0Iik7CisgIHByb3RvXy5zZXRfb3B0aW9uYWxfYnl0ZXMoIlwzNTBcMjYwXDI2N1wzNDZcMjU1XDIxNCIpOworCisgIC8vIEdldCB0aGUgRGVidWdTdHJpbmcgZnJvbSB0aGUgcHJvdG8uCisgIHN0ZDo6c3RyaW5nIGRlYnVnX3N0cmluZyA9IHByb3RvXy5EZWJ1Z1N0cmluZygpOworICBzdGQ6OnN0cmluZyB1dGY4X2RlYnVnX3N0cmluZyA9IHByb3RvXy5VdGY4RGVidWdTdHJpbmcoKTsKKworICAvLyBIYXJkY29kZSBhIGNvcnJlY3QgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgorICBzdGQ6OnN0cmluZyBjb3JyZWN0X3V0Zjhfc3RyaW5nID0KKyAgICAgIFN0ckNhdCgib3B0aW9uYWxfc3RyaW5nOiAiLCBrRGVidWdTdHJpbmdTaWxlbnRNYXJrZXIsCisgICAgICAgICAgICAgICAgICAgIlwiXDM1MFwyNjBcMjY3XDM0NlwyNTVcMjE0XCJcbiIKKyAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxfYnl0ZXM6IFwiXFwzNTBcXDI2MFxcMjY3XFwzNDZcXDI1NVxcMjE0XCJcbiIpOworICBzdGQ6OnN0cmluZyBjb3JyZWN0X3N0cmluZyA9CisgICAgICBTdHJDYXQoIm9wdGlvbmFsX3N0cmluZzogIiwga0RlYnVnU3RyaW5nU2lsZW50TWFya2VyLAorICAgICAgICAgICAgICAgICAgICJcIlxcMzUwXFwyNjBcXDI2N1xcMzQ2XFwyNTVcXDIxNFwiXG4iCisgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsX2J5dGVzOiBcIlxcMzUwXFwyNjBcXDI2N1xcMzQ2XFwyNTVcXDIxNFwiXG4iKTsKKworICAvLyBDb21wYXJlLgorICBFWFBFQ1RfRVEoY29ycmVjdF91dGY4X3N0cmluZywgdXRmOF9kZWJ1Z19zdHJpbmcpOworICBFWFBFQ1RfRVEoY29ycmVjdF9zdHJpbmcsIGRlYnVnX3N0cmluZyk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUHJpbnRVbmtub3duRmllbGRzKSB7CisgIC8vIFRlc3QgcHJpbnRpbmcgb2YgdW5rbm93biBmaWVsZHMgaW4gYSBtZXNzYWdlLgorCisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2U7CisgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMgPSBtZXNzYWdlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKKworICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KDUsIDEpOworICB1bmtub3duX2ZpZWxkcy0+QWRkRml4ZWQzMig1LCAyKTsKKyAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkNjQoNSwgMyk7CisgIHVua25vd25fZmllbGRzLT5BZGRMZW5ndGhEZWxpbWl0ZWQoNSwgIjQiKTsKKyAgdW5rbm93bl9maWVsZHMtPkFkZEdyb3VwKDUpLT5BZGRWYXJpbnQoMTAsIDUpOworCisgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQoOCwgMSk7CisgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQoOCwgMik7CisgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQoOCwgMyk7CisKKyAgRVhQRUNUX0VRKFN0ckNhdCgiNTogIiwga0RlYnVnU3RyaW5nU2lsZW50TWFya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICIxXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIjU6IDB4MDAwMDAwMDJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiNTogMHgwMDAwMDAwMDAwMDAwMDAzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIjU6IFwiNFwiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIjUge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgIDEwOiA1XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiODogMVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICI4OiAyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIjg6IDNcbiIpLAorICAgICAgICAgICAgbWVzc2FnZS5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludFVua25vd25GaWVsZHNIaWRkZW4pIHsKKyAgLy8gVGVzdCBwcmludGluZyBvZiB1bmtub3duIGZpZWxkcyBpbiBhIG1lc3NhZ2Ugd2hlbiBzdXBwcmVzc2VkLgorCisgIHVuaXR0ZXN0OjpPbmVTdHJpbmcgbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRfZGF0YSgiZGF0YSIpOworICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzID0gbWVzc2FnZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CisKKyAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCg1LCAxKTsKKyAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkMzIoNSwgMik7CisgIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDY0KDUsIDMpOworICB1bmtub3duX2ZpZWxkcy0+QWRkTGVuZ3RoRGVsaW1pdGVkKDUsICI0Iik7CisgIHVua25vd25fZmllbGRzLT5BZGRHcm91cCg1KS0+QWRkVmFyaW50KDEwLCA1KTsKKworICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KDgsIDEpOworICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KDgsIDIpOworICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KDgsIDMpOworCisgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgcHJpbnRlci5TZXRIaWRlVW5rbm93bkZpZWxkcyh0cnVlKTsKKyAgc3RkOjpzdHJpbmcgb3V0cHV0OworICBwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJm91dHB1dCk7CisKKyAgRVhQRUNUX0VRKCJkYXRhOiBcImRhdGFcIlxuIiwgb3V0cHV0KTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludFVua25vd25NZXNzYWdlKSB7CisgIC8vIFRlc3QgaGV1cmlzdGljIHByaW50aW5nIG9mIG1lc3NhZ2VzIGluIGFuIFVua25vd25GaWVsZFNldC4KKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgLy8gQ2FzZXMgd2hpY2ggc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyBzdWItbWVzc2FnZXMuCisKKyAgLy8gJ2EnIGlzIGEgdmFsaWQgRklYRUQ2NCB0YWcsIHNvIGZvciB0aGUgc3RyaW5nIHRvIGJlIHBhcnNlYWJsZSBhcyBhIG1lc3NhZ2UKKyAgLy8gaXQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IDggYnl0ZXMuICBTaW5jZSB0aGlzIHN0cmluZyBvbmx5IGhhcyB0d28KKyAgLy8gc3Vic2VxdWVudCBieXRlcywgaXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBzdHJpbmcuCisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiYWJjIik7CisKKyAgLy8gJ2QnIGhhcHBlbnMgdG8gYmUgYSB2YWxpZCBFTkRHUk9VUCB0YWcuICBTbywKKyAgLy8gVW5rbm93bkZpZWxkU2V0OjpNZXJnZUZyb21Db2RlZFN0cmVhbSgpIHdpbGwgc3VjY2Vzc2Z1bGx5IHBhcnNlICJkZWYiLCBidXQKKyAgLy8gdGhlIENvbnN1bWVkRW50aXJlTWVzc2FnZSgpIGNoZWNrIHNob3VsZCBmYWlsLgorICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoImRlZiIpOworCisgIC8vIEEgemVyby1sZW5ndGggc3RyaW5nIHNob3VsZCBuZXZlciBiZSBpbnRlcnByZXRlZCBhcyBhIG1lc3NhZ2UgZXZlbiB0aG91Z2gKKyAgLy8gaXQgaXMgdGVjaG5pY2FsbHkgdmFsaWQgYXMgb25lLgorICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoIiIpOworCisgIC8vIENhc2Ugd2hpY2ggc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGEgc3ViLW1lc3NhZ2UuCisKKyAgLy8gQW4gYWN0dWFsIG5lc3RlZCBtZXNzYWdlIHdpdGggY29udGVudCBzaG91bGQgYWx3YXlzIGJlIGludGVycHJldGVkIGFzIGEKKyAgLy8gbmVzdGVkIG1lc3NhZ2UuCisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxMjMpOworCisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIHN0ZDo6c3RyaW5nIHRleHQ7CisgIFVua25vd25GaWVsZFNldCB1bmtub3duX2ZpZWxkczsKKyAgRVhQRUNUX1RSVUUodW5rbm93bl9maWVsZHMuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UHJpbnRVbmtub3duRmllbGRzVG9TdHJpbmcodW5rbm93bl9maWVsZHMsICZ0ZXh0KSk7CisgIC8vIEZpZWxkIDQ0IGFuZCA0OCBjYW4gYmUgcHJpbnRlZCBpbiBhbnkgb3JkZXIuCisgIEVYUEVDVF9USEFUKHRleHQsIHRlc3Rpbmc6Okhhc1N1YnN0cigiNDQ6IFwiYWJjXCJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0NDogXCJkZWZcIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQ0OiBcIlwiXG4iKSk7CisgIEVYUEVDVF9USEFUKHRleHQsIHRlc3Rpbmc6Okhhc1N1YnN0cigiNDgge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgMTogMTIzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIikpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50RGVlcGx5TmVzdGVkVW5rbm93bk1lc3NhZ2UpIHsKKyAgLy8gQ3JlYXRlIGEgZGVlcGx5IG5lc3RlZCBtZXNzYWdlLgorICBzdGF0aWMgY29uc3RleHByIGludCBrTmVzdGluZ0RlcHRoID0gMjUwMDA7CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtVbmtub3duRmllbGROdW1iZXIgPSAxOworICBzdGQ6OnZlY3RvcjxpbnQ+IGxlbmd0aHM7CisgIGxlbmd0aHMucmVzZXJ2ZShrTmVzdGluZ0RlcHRoKTsKKyAgbGVuZ3Rocy5wdXNoX2JhY2soMCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga05lc3RpbmdEZXB0aCAtIDE7ICsraSkgeworICAgIGxlbmd0aHMucHVzaF9iYWNrKAorICAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRhZ1NpemUoCisgICAgICAgICAgICBrVW5rbm93bkZpZWxkTnVtYmVyLCBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQllURVMpICsKKyAgICAgICAgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpMZW5ndGhEZWxpbWl0ZWRTaXplKGxlbmd0aHMuYmFjaygpKSk7CisgIH0KKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgeworICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gemVyb19jb3B5X3N0cmVhbSgmc2VyaWFsaXplZCk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX3N0cmVhbSgmemVyb19jb3B5X3N0cmVhbSk7CisgICAgZm9yIChpbnQgaSA9IGtOZXN0aW5nRGVwdGggLSAxOyBpID49IDA7IC0taSkgeworICAgICAgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZygKKyAgICAgICAgICBrVW5rbm93bkZpZWxkTnVtYmVyLAorICAgICAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgJmNvZGVkX3N0cmVhbSk7CisgICAgICBjb2RlZF9zdHJlYW0uV3JpdGVWYXJpbnQzMihsZW5ndGhzW2ldKTsKKyAgICB9CisgIH0KKworICAvLyBQYXJzZSB0aGUgZGF0YSBhbmQgdmVyaWZ5IHRoYXQgd2UgY2FuIHByaW50IGl0IHdpdGhvdXQgb3ZlcmZsb3dpbmcgdGhlCisgIC8vIHN0YWNrLgorICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlOworICBBU1NFUlRfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7CisgIHN0ZDo6c3RyaW5nIHRleHQ7CisgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludE1lc3NhZ2VXaXRoSW5kZW50KSB7CisgIC8vIFRlc3QgYWRkaW5nIGFuIGluaXRpYWwgaW5kZW50IHRvIHByaW50aW5nLgorCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoImFiYyIpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoImRlZiIpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMTIzKTsKKworICBzdGQ6OnN0cmluZyB0ZXh0OworICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIHByaW50ZXIuU2V0SW5pdGlhbEluZGVudExldmVsKDEpOworICBFWFBFQ1RfVFJVRShwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIiAgcmVwZWF0ZWRfc3RyaW5nOiBcImFiY1wiXG4iCisgICAgICAiICByZXBlYXRlZF9zdHJpbmc6IFwiZGVmXCJcbiIKKyAgICAgICIgIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHtcbiIKKyAgICAgICIgICAgYmI6IDEyM1xuIgorICAgICAgIiAgfVxuIiwKKyAgICAgIHRleHQpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50TWVzc2FnZVNpbmdsZUxpbmUpIHsKKyAgLy8gVGVzdCBwcmludGluZyBhIG1lc3NhZ2Ugb24gYSBzaW5nbGUgbGluZS4KKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJhYmMiKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJkZWYiKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDEyMyk7CisKKyAgc3RkOjpzdHJpbmcgdGV4dDsKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBwcmludGVyLlNldEluaXRpYWxJbmRlbnRMZXZlbCgxKTsKKyAgcHJpbnRlci5TZXRTaW5nbGVMaW5lTW9kZSh0cnVlKTsKKyAgRVhQRUNUX1RSVUUocHJpbnRlci5QcmludFRvU3RyaW5nKG1lc3NhZ2UsICZ0ZXh0KSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICIgIHJlcGVhdGVkX3N0cmluZzogXCJhYmNcIiByZXBlYXRlZF9zdHJpbmc6IFwiZGVmXCIgIgorICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsgYmI6IDEyMyB9ICIsCisgICAgICB0ZXh0KTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludEJ1ZmZlclRvb1NtYWxsKSB7CisgIC8vIFRlc3QgcHJpbnRpbmcgYSBtZXNzYWdlIHRvIGEgYnVmZmVyIHRoYXQgaXMgdG9vIHNtYWxsLgorCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoImFiYyIpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoImRlZiIpOworCisgIGNoYXIgYnVmZmVyWzFdID0gIiI7CisgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKGJ1ZmZlciwgMSk7CisgIEVYUEVDVF9GQUxTRShUZXh0Rm9ybWF0OjpQcmludChtZXNzYWdlLCAmb3V0cHV0X3N0cmVhbSkpOworICBFWFBFQ1RfRVEoYnVmZmVyWzBdLCAncicpOworICBFWFBFQ1RfRVEob3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSwgMSk7Cit9CisKKy8vIEEgcHJpbnRlciB0aGF0IGFwcGVuZHMgJ3UnIHRvIGFsbCB1bnNpZ25lZCBpbnQzMi4KK2NsYXNzIEN1c3RvbVVJbnQzMkZpZWxkVmFsdWVQcmludGVyIDogcHVibGljIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyIHsKKyBwdWJsaWM6CisgIHN0ZDo6c3RyaW5nIFByaW50VUludDMyKHVpbnQzMl90IHZhbCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBTdHJDYXQoRmllbGRWYWx1ZVByaW50ZXI6OlByaW50VUludDMyKHZhbCksICJ1Iik7CisgIH0KK307CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgRGVmYXVsdEN1c3RvbUZpZWxkUHJpbnRlcikgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfdWludDMyKDQyKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfdWludDMyKDEpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF91aW50MzIoMik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3VpbnQzMigzKTsKKworICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIHByaW50ZXIuU2V0RGVmYXVsdEZpZWxkVmFsdWVQcmludGVyKG5ldyBDdXN0b21VSW50MzJGaWVsZFZhbHVlUHJpbnRlcigpKTsKKyAgLy8gTGV0J3Mgc2VlIGlmIHRoYXQgd29ya3Mgd2VsbCB0b2dldGhlciB3aXRoIHRoZSByZXBlYXRlZCBwcmltaXRpdmVzOgorICBwcmludGVyLlNldFVzZVNob3J0UmVwZWF0ZWRQcmltaXRpdmVzKHRydWUpOworICBzdGQ6OnN0cmluZyB0ZXh0OworICBwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpOworICBFWFBFQ1RfRVEoIm9wdGlvbmFsX3VpbnQzMjogNDJ1XG5yZXBlYXRlZF91aW50MzI6IFsxdSwgMnUsIDN1XVxuIiwgdGV4dCk7Cit9CisKK2NsYXNzIEN1c3RvbUludDMyRmllbGRWYWx1ZVByaW50ZXIgOiBwdWJsaWMgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXIgeworIHB1YmxpYzoKKyAgc3RkOjpzdHJpbmcgUHJpbnRJbnQzMihpbnQzMl90IHZhbCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBTdHJDYXQoInZhbHVlLWlzKCIsIEZpZWxkVmFsdWVQcmludGVyOjpQcmludEludDMyKHZhbCksICIpIik7CisgIH0KK307CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgRmllbGRTcGVjaWZpY0N1c3RvbVByaW50ZXIpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX2ludDMyKDQyKTsgIC8vIFRoaXMgd2lsbCBiZSBoYW5kbGVkIGJ5IG91ciBQcmludGVyLgorICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9pbnQzMig0Mik7ICAvLyBUaGlzIHdpbGwgYmUgcHJpbnRlZCBhcyBudW1iZXIuCisKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBFWFBFQ1RfVFJVRShwcmludGVyLlJlZ2lzdGVyRmllbGRWYWx1ZVByaW50ZXIoCisgICAgICBtZXNzYWdlLkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpLAorICAgICAgbmV3IEN1c3RvbUludDMyRmllbGRWYWx1ZVByaW50ZXIoKSkpOworICBzdGQ6OnN0cmluZyB0ZXh0OworICBwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpOworICBFWFBFQ1RfRVEoIm9wdGlvbmFsX2ludDMyOiB2YWx1ZS1pcyg0MilcbnJlcGVhdGVkX2ludDMyOiA0MlxuIiwgdGV4dCk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgRmllbGRTcGVjaWZpY0N1c3RvbVByaW50ZXJSZWdpc3RlclNhbWVGaWVsZFR3aWNlKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGNvbnN0IGZpZWxkID0KKyAgICAgIG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIik7CisgIEFTU0VSVF9UUlVFKHByaW50ZXIuUmVnaXN0ZXJGaWVsZFZhbHVlUHJpbnRlcigKKyAgICAgIGZpZWxkLCBuZXcgQ3VzdG9tSW50MzJGaWVsZFZhbHVlUHJpbnRlcigpKSk7CisgIGNvbnN0IFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyKiBjb25zdCByZWplY3RlZCA9CisgICAgICBuZXcgQ3VzdG9tSW50MzJGaWVsZFZhbHVlUHJpbnRlcigpOworICBBU1NFUlRfRkFMU0UocHJpbnRlci5SZWdpc3RlckZpZWxkVmFsdWVQcmludGVyKGZpZWxkLCByZWplY3RlZCkpOworICBkZWxldGUgcmVqZWN0ZWQ7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgRXJyb3JDYXNlc1JlZ2lzdGVyaW5nRmllbGRWYWx1ZVByaW50ZXJTaG91bGRGYWlsKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICAvLyBudWxscHRyIHByaW50ZXIuCisgIEVYUEVDVF9GQUxTRShwcmludGVyLlJlZ2lzdGVyRmllbGRWYWx1ZVByaW50ZXIoCisgICAgICBtZXNzYWdlLkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpLAorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXIqPihudWxscHRyKSkpOworICBFWFBFQ1RfRkFMU0UocHJpbnRlci5SZWdpc3RlckZpZWxkVmFsdWVQcmludGVyKAorICAgICAgbWVzc2FnZS5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50MzIiKSwKKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IFRleHRGb3JtYXQ6OkZhc3RGaWVsZFZhbHVlUHJpbnRlcio+KG51bGxwdHIpKSk7CisgIC8vIEJlY2F1c2UgcmVnaXN0cmF0aW9uIGZhaWxzLCB0aGUgb3duZXJzaGlwIG9mIHRoaXMgcHJpbnRlciBpcyBuZXZlciB0YWtlbi4KKyAgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXIgbXlfZmllbGRfcHJpbnRlcjsKKyAgLy8gbnVsbHB0ciBmaWVsZAorICBFWFBFQ1RfRkFMU0UocHJpbnRlci5SZWdpc3RlckZpZWxkVmFsdWVQcmludGVyKG51bGxwdHIsICZteV9maWVsZF9wcmludGVyKSk7Cit9CisKK2NsYXNzIEN1c3RvbU1lc3NhZ2VGaWVsZFZhbHVlUHJpbnRlciA6IHB1YmxpYyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlciB7CisgcHVibGljOgorICBzdGQ6OnN0cmluZyBQcmludEludDMyKGludDMyX3QgdikgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBTdHJDYXQoRmllbGRWYWx1ZVByaW50ZXI6OlByaW50SW50MzIodiksICIgICMgeCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzOjpIZXgodikpOworICB9CisKKyAgc3RkOjpzdHJpbmcgUHJpbnRNZXNzYWdlU3RhcnQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgaW50IGZpZWxkX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2luZ2xlX2xpbmVfbW9kZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmIChzaW5nbGVfbGluZV9tb2RlKSB7CisgICAgICByZXR1cm4gIiB7ICI7CisgICAgfQorICAgIHJldHVybiBTdHJDYXQoIiB7ICAjICIsIG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpLT5uYW1lKCksICI6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pbmRleCwgIlxuIik7CisgIH0KK307CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgQ3VzdG9tUHJpbnRlckZvckNvbW1lbnRzKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCk7CisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSgpLT5zZXRfZCg0Mik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlKCktPnNldF9kKDQzKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UoKS0+c2V0X2QoNDQpOworICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIEN1c3RvbU1lc3NhZ2VGaWVsZFZhbHVlUHJpbnRlciBteV9maWVsZF9wcmludGVyOworICBwcmludGVyLlNldERlZmF1bHRGaWVsZFZhbHVlUHJpbnRlcihuZXcgQ3VzdG9tTWVzc2FnZUZpZWxkVmFsdWVQcmludGVyKCkpOworICBzdGQ6OnN0cmluZyB0ZXh0OworICBwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpOworICBFWFBFQ1RfRVEoCisgICAgICAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgeyAgIyBOZXN0ZWRNZXNzYWdlOiAtMVxuIgorICAgICAgIn1cbiIKKyAgICAgICJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSB7ICAjIEltcG9ydE1lc3NhZ2U6IC0xXG4iCisgICAgICAiICBkOiA0MiAgIyB4MmFcbiIKKyAgICAgICJ9XG4iCisgICAgICAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgeyAgIyBOZXN0ZWRNZXNzYWdlOiAwXG4iCisgICAgICAifVxuIgorICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsgICMgTmVzdGVkTWVzc2FnZTogMVxuIgorICAgICAgIn1cbiIKKyAgICAgICJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSB7ICAjIEltcG9ydE1lc3NhZ2U6IDBcbiIKKyAgICAgICIgIGQ6IDQzICAjIHgyYlxuIgorICAgICAgIn1cbiIKKyAgICAgICJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSB7ICAjIEltcG9ydE1lc3NhZ2U6IDFcbiIKKyAgICAgICIgIGQ6IDQ0ICAjIHgyY1xuIgorICAgICAgIn1cbiIsCisgICAgICB0ZXh0KTsKK30KKworY2xhc3MgQ3VzdG9tTWVzc2FnZUNvbnRlbnRGaWVsZFZhbHVlUHJpbnRlcgorICAgIDogcHVibGljIFRleHRGb3JtYXQ6OkZhc3RGaWVsZFZhbHVlUHJpbnRlciB7CisgcHVibGljOgorICBib29sIFByaW50TWVzc2FnZUNvbnRlbnQoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBpbnQgZmllbGRfaW5kZXgsIGludCBmaWVsZF9jb3VudCwKKyAgICAgIGJvb2wgc2luZ2xlX2xpbmVfbW9kZSwKKyAgICAgIFRleHRGb3JtYXQ6OkJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBpZiAobWVzc2FnZS5CeXRlU2l6ZUxvbmcoKSA+IDApIHsKKyAgICAgIGdlbmVyYXRvci0+UHJpbnRTdHJpbmcoCisgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiIyBSRURBQ1RFRCwgJDAgYnl0ZXNcbiIsIG1lc3NhZ2UuQnl0ZVNpemVMb25nKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgQ3VzdG9tUHJpbnRlckZvck1lc3NhZ2VDb250ZW50KSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCk7CisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSgpLT5zZXRfZCg0Mik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlKCktPnNldF9kKDQzKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UoKS0+c2V0X2QoNDQpOworICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIEN1c3RvbU1lc3NhZ2VDb250ZW50RmllbGRWYWx1ZVByaW50ZXIgbXlfZmllbGRfcHJpbnRlcjsKKyAgcHJpbnRlci5TZXREZWZhdWx0RmllbGRWYWx1ZVByaW50ZXIoCisgICAgICBuZXcgQ3VzdG9tTWVzc2FnZUNvbnRlbnRGaWVsZFZhbHVlUHJpbnRlcigpKTsKKyAgc3RkOjpzdHJpbmcgdGV4dDsKKyAgcHJpbnRlci5QcmludFRvU3RyaW5nKG1lc3NhZ2UsICZ0ZXh0KTsKKyAgRVhQRUNUX0VRKAorICAgICAgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHtcbiIKKyAgICAgICJ9XG4iCisgICAgICAib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2Uge1xuIgorICAgICAgIiAgIyBSRURBQ1RFRCwgMiBieXRlc1xuIgorICAgICAgIn1cbiIKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7XG4iCisgICAgICAifVxuIgorICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Uge1xuIgorICAgICAgIiAgIyBSRURBQ1RFRCwgMiBieXRlc1xuIgorICAgICAgIn1cbiIKKyAgICAgICJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSB7XG4iCisgICAgICAiICAjIFJFREFDVEVELCAyIGJ5dGVzXG4iCisgICAgICAifVxuIiwKKyAgICAgIHRleHQpOworfQorCitjbGFzcyBDdXN0b21NdWx0aWxpbmVDb21tZW50UHJpbnRlciA6IHB1YmxpYyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlciB7CisgcHVibGljOgorICBzdGQ6OnN0cmluZyBQcmludE1lc3NhZ2VTdGFydChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBpbnQgZmllbGRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaW5nbGVfbGluZV9jb21tZW50KSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFN0ckNhdCgiIHsgICMgMVxuIiwgIiAgIyAyXG4iKTsKKyAgfQorfTsKKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBDdXN0b21QcmludGVyRm9yTXVsdGlsaW5lQ29tbWVudHMpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKTsKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlKCktPnNldF9kKDQyKTsKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBDdXN0b21NZXNzYWdlRmllbGRWYWx1ZVByaW50ZXIgbXlfZmllbGRfcHJpbnRlcjsKKyAgcHJpbnRlci5TZXREZWZhdWx0RmllbGRWYWx1ZVByaW50ZXIobmV3IEN1c3RvbU11bHRpbGluZUNvbW1lbnRQcmludGVyKCkpOworICBzdGQ6OnN0cmluZyB0ZXh0OworICBwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpOworICBFWFBFQ1RfRVEoCisgICAgICAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgeyAgIyAxXG4iCisgICAgICAiICAjIDJcbiIKKyAgICAgICJ9XG4iCisgICAgICAib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgeyAgIyAxXG4iCisgICAgICAiICAjIDJcbiIKKyAgICAgICIgIGQ6IDQyXG4iCisgICAgICAifVxuIiwKKyAgICAgIHRleHQpOworfQorCisvLyBBY2hpZXZlIGVmZmVjdHMgc2ltaWxhciB0byBTZXRVc2VTaG9ydFJlcGVhdGVkUHJpbWl0aXZlcyBmb3IgbWVzc2FnZXMsIHVzaW5nCisvLyBSZWdpc3RlckZpZWxkVmFsdWVQcmludGVyLiBVc2UgdGhpcyB0byB0ZXN0IHRoZSB2ZXJzaW9uIG9mIFByaW50RmllbGROYW1lCisvLyB0aGF0IGFjY2VwdHMgcmVwZWF0ZWQgZmllbGQgaW5kZXggYW5kIGNvdW50LgorY2xhc3MgQ29tcGFjdFJlcGVhdGVkRmllbGRQcmludGVyIDogcHVibGljIFRleHRGb3JtYXQ6OkZhc3RGaWVsZFZhbHVlUHJpbnRlciB7CisgcHVibGljOgorICB2b2lkIFByaW50RmllbGROYW1lKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGludCBmaWVsZF9pbmRleCwgaW50IGZpZWxkX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0OjpCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKGZpZWxkX2luZGV4ID09IDAgfHwgZmllbGRfaW5kZXggPT0gLTEpIHsKKyAgICAgIGdlbmVyYXRvci0+UHJpbnRTdHJpbmcoZmllbGQtPm5hbWUoKSk7CisgICAgfQorICB9CisgIC8vIFRvIHByZXZlbnQgY29tcGlsZXIgY29tcGxhaW5pbmcgYWJvdXQgV292ZXJsb2FkZWQtdmlydHVhbAorICB2b2lkIFByaW50RmllbGROYW1lKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0OjpCYXNlVGV4dEdlbmVyYXRvciogZ2VuZXJhdG9yKSBjb25zdCBvdmVycmlkZSB7CisgIH0KKyAgdm9pZCBQcmludE1lc3NhZ2VTdGFydCgKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGludCBmaWVsZF9pbmRleCwgaW50IGZpZWxkX2NvdW50LAorICAgICAgYm9vbCBzaW5nbGVfbGluZV9tb2RlLAorICAgICAgVGV4dEZvcm1hdDo6QmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmIChmaWVsZF9pbmRleCA9PSAwIHx8IGZpZWxkX2luZGV4ID09IC0xKSB7CisgICAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZSkgeworICAgICAgICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgiIHsgIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgiIHtcbiIpOworICAgICAgfQorICAgIH0KKyAgfQorICB2b2lkIFByaW50TWVzc2FnZUVuZCgKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGludCBmaWVsZF9pbmRleCwgaW50IGZpZWxkX2NvdW50LAorICAgICAgYm9vbCBzaW5nbGVfbGluZV9tb2RlLAorICAgICAgVGV4dEZvcm1hdDo6QmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmIChmaWVsZF9pbmRleCA9PSBmaWVsZF9jb3VudCAtIDEgfHwgZmllbGRfaW5kZXggPT0gLTEpIHsKKyAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlKSB7CisgICAgICAgIGdlbmVyYXRvci0+UHJpbnRMaXRlcmFsKCJ9ICIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuZXJhdG9yLT5QcmludExpdGVyYWwoIn1cbiIpOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBDb21wYWN0UmVwZWF0ZWRGaWVsZFByaW50ZXIpIHsKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBBU1NFUlRfVFJVRShwcmludGVyLlJlZ2lzdGVyRmllbGRWYWx1ZVByaW50ZXIoCisgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZWZhdWx0X2luc3RhbmNlKCkKKyAgICAgICAgICAuZGVzY3JpcHRvcigpCisgICAgICAgICAgLT5GaW5kRmllbGRCeU51bWJlcigKKyAgICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6a1JlcGVhdGVkTmVzdGVkTWVzc2FnZUZpZWxkTnVtYmVyKSwKKyAgICAgIG5ldyBDb21wYWN0UmVwZWF0ZWRGaWVsZFByaW50ZXIpKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDIpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMyk7CisKKyAgc3RkOjpzdHJpbmcgdGV4dDsKKyAgQVNTRVJUX1RSVUUocHJpbnRlci5QcmludFRvU3RyaW5nKG1lc3NhZ2UsICZ0ZXh0KSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7XG4iCisgICAgICAiICBiYjogMVxuIgorICAgICAgIiAgYmI6IDJcbiIKKyAgICAgICIgIGJiOiAzXG4iCisgICAgICAifVxuIiwKKyAgICAgIHRleHQpOworfQorCisvLyBQcmludCBzdHJpbmdzIGludG8gbXVsdGlwbGUgbGluZSwgd2l0aCBpbmRlbnRhdGlvbi4gVXNlIHRoaXMgdG8gdGVzdAorLy8gQmFzZVRleHRHZW5lcmF0b3I6OkluZGVudCBhbmQgQmFzZVRleHRHZW5lcmF0b3I6Ok91dGRlbnQuCitjbGFzcyBNdWx0aWxpbmVTdHJpbmdQcmludGVyIDogcHVibGljIFRleHRGb3JtYXQ6OkZhc3RGaWVsZFZhbHVlUHJpbnRlciB7CisgcHVibGljOgorICB2b2lkIFByaW50U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwsCisgICAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdDo6QmFzZVRleHRHZW5lcmF0b3IqIGdlbmVyYXRvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGdlbmVyYXRvci0+SW5kZW50KCk7CisgICAgaW50IGxhc3RfcG9zID0gMDsKKyAgICBpbnQgbmV3bGluZV9wb3MgPSB2YWwuZmluZCgnXG4nKTsKKyAgICB3aGlsZSAobmV3bGluZV9wb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGdlbmVyYXRvci0+UHJpbnRMaXRlcmFsKCJcbiIpOworICAgICAgVGV4dEZvcm1hdDo6RmFzdEZpZWxkVmFsdWVQcmludGVyOjpQcmludFN0cmluZygKKyAgICAgICAgICB2YWwuc3Vic3RyKGxhc3RfcG9zLCBuZXdsaW5lX3BvcyArIDEgLSBsYXN0X3BvcyksIGdlbmVyYXRvcik7CisgICAgICBsYXN0X3BvcyA9IG5ld2xpbmVfcG9zICsgMTsKKyAgICAgIG5ld2xpbmVfcG9zID0gdmFsLmZpbmQoJ1xuJywgbGFzdF9wb3MpOworICAgIH0KKyAgICBpZiAobGFzdF9wb3MgPCB2YWwuc2l6ZSgpKSB7CisgICAgICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgiXG4iKTsKKyAgICAgIFRleHRGb3JtYXQ6OkZhc3RGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRTdHJpbmcodmFsLnN1YnN0cihsYXN0X3BvcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcik7CisgICAgfQorICAgIGdlbmVyYXRvci0+T3V0ZGVudCgpOworICB9Cit9OworCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIE11bHRpbGluZVN0cmluZ1ByaW50ZXIpIHsKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBBU1NFUlRfVFJVRShwcmludGVyLlJlZ2lzdGVyRmllbGRWYWx1ZVByaW50ZXIoCisgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZWZhdWx0X2luc3RhbmNlKCkKKyAgICAgICAgICAuZGVzY3JpcHRvcigpCisgICAgICAgICAgLT5GaW5kRmllbGRCeU51bWJlcigKKyAgICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6a09wdGlvbmFsU3RyaW5nRmllbGROdW1iZXIpLAorICAgICAgbmV3IE11bHRpbGluZVN0cmluZ1ByaW50ZXIpKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3N0cmluZygiZmlyc3QgbGluZVxuc2Vjb25kIGxpbmVcbnRoaXJkIGxpbmUiKTsKKworICBzdGQ6OnN0cmluZyB0ZXh0OworICBBU1NFUlRfVFJVRShwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIm9wdGlvbmFsX3N0cmluZzogXG4iCisgICAgICAiICBcImZpcnN0IGxpbmVcXG5cIlxuIgorICAgICAgIiAgXCJzZWNvbmQgbGluZVxcblwiXG4iCisgICAgICAiICBcInRoaXJkIGxpbmVcIlxuIiwKKyAgICAgIHRleHQpOworfQorCitjbGFzcyBDdXN0b21OZXN0ZWRNZXNzYWdlUHJpbnRlciA6IHB1YmxpYyBUZXh0Rm9ybWF0OjpNZXNzYWdlUHJpbnRlciB7CisgcHVibGljOgorICBDdXN0b21OZXN0ZWRNZXNzYWdlUHJpbnRlcigpIHt9CisgIH5DdXN0b21OZXN0ZWRNZXNzYWdlUHJpbnRlcigpIG92ZXJyaWRlIHt9CisgIHZvaWQgUHJpbnQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgYm9vbCBzaW5nbGVfbGluZV9tb2RlLAorICAgICAgICAgICAgIFRleHRGb3JtYXQ6OkJhc2VUZXh0R2VuZXJhdG9yKiBnZW5lcmF0b3IpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBnZW5lcmF0b3ItPlByaW50TGl0ZXJhbCgiY3VzdG9tIik7CisgIH0KK307CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgQ3VzdG9tTWVzc2FnZVByaW50ZXIpIHsKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBwcmludGVyLlJlZ2lzdGVyTWVzc2FnZVByaW50ZXIoCisgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCkuZGVzY3JpcHRvcigpLAorICAgICAgbmV3IEN1c3RvbU5lc3RlZE1lc3NhZ2VQcmludGVyKTsKKworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIHN0ZDo6c3RyaW5nIHRleHQ7CisgIEVYUEVDVF9UUlVFKHByaW50ZXIuUHJpbnRUb1N0cmluZyhtZXNzYWdlLCAmdGV4dCkpOworICBFWFBFQ1RfRVEoIiIsIHRleHQpOworCisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMSk7CisgIEVYUEVDVF9UUlVFKHByaW50ZXIuUHJpbnRUb1N0cmluZyhtZXNzYWdlLCAmdGV4dCkpOworICBFWFBFQ1RfRVEoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHtcbiAgY3VzdG9tfVxuIiwgdGV4dCk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUGFyc2VCYXNpYykgeworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0ocHJvdG9fdGV4dF9mb3JtYXRfLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvX3RleHRfZm9ybWF0Xy5zaXplKCkpOworICBUZXh0Rm9ybWF0OjpQYXJzZSgmaW5wdXRfc3RyZWFtLCAmcHJvdG9fKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChwcm90b18pOworfQorCitURVNUX0YoVGV4dEZvcm1hdEV4dGVuc2lvbnNUZXN0LCBQYXJzZUV4dGVuc2lvbnMpIHsKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXRfc3RyZWFtKHByb3RvX3RleHRfZm9ybWF0Xy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b190ZXh0X2Zvcm1hdF8uc2l6ZSgpKTsKKyAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KHByb3RvXyk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUGFyc2VFbnVtRmllbGRGcm9tTnVtYmVyKSB7CisgIC8vIENyZWF0ZSBhIHBhcnNlIHN0cmluZyB3aXRoIGEgbnVtZXJpY2FsIHZhbHVlIGZvciBhbiBlbnVtIGZpZWxkLgorICBzdGQ6OnN0cmluZyBwYXJzZV9zdHJpbmcgPQorICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgib3B0aW9uYWxfbmVzdGVkX2VudW06ICQwIiwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKKyAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKHBhcnNlX3N0cmluZywgJnByb3RvXykpOworICBFWFBFQ1RfVFJVRShwcm90b18uaGFzX29wdGlvbmFsX25lc3RlZF9lbnVtKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLCBwcm90b18ub3B0aW9uYWxfbmVzdGVkX2VudW0oKSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUGFyc2VFbnVtRmllbGRGcm9tTmVnYXRpdmVOdW1iZXIpIHsKKyAgQVNTRVJUX0xUKHVuaXR0ZXN0OjpTUEFSU0VfRSwgMCk7CisgIHN0ZDo6c3RyaW5nIHBhcnNlX3N0cmluZyA9CisgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKCJzcGFyc2VfZW51bTogJDAiLCB1bml0dGVzdDo6U1BBUlNFX0UpOworICB1bml0dGVzdDo6U3BhcnNlRW51bU1lc3NhZ2UgcHJvdG87CisgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhwYXJzZV9zdHJpbmcsICZwcm90bykpOworICBFWFBFQ1RfVFJVRShwcm90by5oYXNfc3BhcnNlX2VudW0oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6U1BBUlNFX0UsIHByb3RvLnNwYXJzZV9lbnVtKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50VW5rbm93bkVudW1GaWVsZFByb3RvMykgeworICBwcm90bzNfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBwcm90bzsKKworICBwcm90by5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0oCisgICAgICBzdGF0aWNfY2FzdDxwcm90bzNfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bT4oMTApKTsKKyAgcHJvdG8uYWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtKAorICAgICAgc3RhdGljX2Nhc3Q8cHJvdG8zX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW0+KC0xMCkpOworICBwcm90by5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0oCisgICAgICBzdGF0aWNfY2FzdDxwcm90bzNfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bT4oMjE0NzQ4MzY0NykpOworICBwcm90by5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0oCisgICAgICBzdGF0aWNfY2FzdDxwcm90bzNfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bT4oLTIxNDc0ODM2NDgpKTsKKworICBFWFBFQ1RfRVEoU3RyQ2F0KCJyZXBlYXRlZF9uZXN0ZWRfZW51bTogIiwga0RlYnVnU3RyaW5nU2lsZW50TWFya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICIxMFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9uZXN0ZWRfZW51bTogLTEwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX25lc3RlZF9lbnVtOiAyMTQ3NDgzNjQ3XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX25lc3RlZF9lbnVtOiAtMjE0NzQ4MzY0OFxuIiksCisgICAgICAgICAgICBwcm90by5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQYXJzZVVua25vd25FbnVtRmllbGRQcm90bzMpIHsKKyAgcHJvdG8zX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgcHJvdG87CisgIHN0ZDo6c3RyaW5nIHBhcnNlX3N0cmluZyA9CisgICAgICAicmVwZWF0ZWRfbmVzdGVkX2VudW06IFsxMCwgLTEwLCAyMTQ3NDgzNjQ3LCAtMjE0NzQ4MzY0OF0iOworICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcocGFyc2Vfc3RyaW5nLCAmcHJvdG8pKTsKKyAgQVNTRVJUX0VRKDQsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSk7CisgIEVYUEVDVF9FUSgxMCwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX2VudW0oMCkpOworICBFWFBFQ1RfRVEoLTEwLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfZW51bSgxKSk7CisgIEVYUEVDVF9FUSgyMTQ3NDgzNjQ3LCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfZW51bSgyKSk7CisgIEVYUEVDVF9FUSgtMjE0NzQ4MzY0OCwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX2VudW0oMykpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlU3RyaW5nRXNjYXBlKSB7CisgIC8vIENyZWF0ZSBhIHBhcnNlIHN0cmluZyB3aXRoIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC4KKyAgc3RkOjpzdHJpbmcgcGFyc2Vfc3RyaW5nID0KKyAgICAgICJvcHRpb25hbF9zdHJpbmc6ICIgKyBrRXNjYXBlVGVzdFN0cmluZ0VzY2FwZWQgKyAiXG4iOworCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShwYXJzZV9zdHJpbmcuZGF0YSgpLCBwYXJzZV9zdHJpbmcuc2l6ZSgpKTsKKyAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7CisKKyAgLy8gQ29tcGFyZS4KKyAgRVhQRUNUX0VRKGtFc2NhcGVUZXN0U3RyaW5nLCBwcm90b18ub3B0aW9uYWxfc3RyaW5nKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlQ29uY2F0ZW5hdGVkU3RyaW5nKSB7CisgIC8vIENyZWF0ZSBhIHBhcnNlIHN0cmluZyB3aXRoIG11bHRpcGxlIHBhcnRzIG9uIG9uZSBsaW5lLgorICBzdGQ6OnN0cmluZyBwYXJzZV9zdHJpbmcgPSAib3B0aW9uYWxfc3RyaW5nOiBcImZvb1wiIFwiYmFyXCJcbiI7CisKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXRfc3RyZWFtMShwYXJzZV9zdHJpbmcuZGF0YSgpLCBwYXJzZV9zdHJpbmcuc2l6ZSgpKTsKKyAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbTEsICZwcm90b18pOworCisgIC8vIENvbXBhcmUuCisgIEVYUEVDVF9FUSgiZm9vYmFyIiwgcHJvdG9fLm9wdGlvbmFsX3N0cmluZygpKTsKKworICAvLyBDcmVhdGUgYSBwYXJzZSBzdHJpbmcgd2l0aCBtdWx0aXBsZSBwYXJ0cyBvbiBzZXBhcmF0ZSBsaW5lcy4KKyAgcGFyc2Vfc3RyaW5nID0KKyAgICAgICJvcHRpb25hbF9zdHJpbmc6IFwiZm9vXCJcbiIKKyAgICAgICJcImJhclwiXG4iOworCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbTIocGFyc2Vfc3RyaW5nLmRhdGEoKSwgcGFyc2Vfc3RyaW5nLnNpemUoKSk7CisgIFRleHRGb3JtYXQ6OlBhcnNlKCZpbnB1dF9zdHJlYW0yLCAmcHJvdG9fKTsKKworICAvLyBDb21wYXJlLgorICBFWFBFQ1RfRVEoImZvb2JhciIsIHByb3RvXy5vcHRpb25hbF9zdHJpbmcoKSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUGFyc2VGbG9hdFdpdGhTdWZmaXgpIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGNhbiBwYXJzZSBhIGZsb2F0aW5nLXBvaW50IHZhbHVlIHdpdGggJ2YnIGFwcGVuZGVkIHRvIHRoZQorICAvLyBlbmQuICBUaGlzIGlzIG5lZWRlZCBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCBwcm90bzEuCisKKyAgLy8gSGF2ZSBpdCBwYXJzZSBhIGZsb2F0IHdpdGggdGhlICdmJyBzdWZmaXguCisgIHN0ZDo6c3RyaW5nIHBhcnNlX3N0cmluZyA9ICJvcHRpb25hbF9mbG9hdDogMS4wZlxuIjsKKworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0ocGFyc2Vfc3RyaW5nLmRhdGEoKSwgcGFyc2Vfc3RyaW5nLnNpemUoKSk7CisKKyAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7CisKKyAgLy8gQ29tcGFyZS4KKyAgRVhQRUNUX0VRKDEuMCwgcHJvdG9fLm9wdGlvbmFsX2Zsb2F0KCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlU2hvcnRSZXBlYXRlZEZvcm0pIHsKKyAgc3RkOjpzdHJpbmcgcGFyc2Vfc3RyaW5nID0KKyAgICAgIC8vIE1peGVkIHNob3J0LWZvcm0gYW5kIGxvbmctZm9ybSBhcmUgc2ltcGx5IGNvbmNhdGVuYXRlZC4KKyAgICAgICJyZXBlYXRlZF9pbnQzMjogMVxuIgorICAgICAgInJlcGVhdGVkX2ludDMyOiBbNDU2LCA3ODldXG4iCisgICAgICAicmVwZWF0ZWRfbmVzdGVkX2VudW06IFsgIEZPTyAsQkFSLCAjIGNvbW1lbnRcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgM11cbiIKKyAgICAgIC8vIE5vdGUgdGhhdCB3aGlsZSB0aGUgcHJpbnRlciB3b24ndCBwcmludCByZXBlYXRlZCBzdHJpbmdzIGluIHNob3J0LWZvcm0sCisgICAgICAvLyB0aGUgcGFyc2VyIHdpbGwgYWNjZXB0IHRoZW0uCisgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBbIFwiZm9vXCIsICdiYXInIF1cbiIKKyAgICAgIC8vIFJlcGVhdGVkIG1lc3NhZ2UKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZTogWyB7IGJiOiAxIH0sIHsgYmIgOiAyIH1dXG4iCisgICAgICAvLyBSZXBlYXRlZCBncm91cAorICAgICAgIlJlcGVhdGVkR3JvdXAgW3sgYTogMyB9LHsgYTogNCB9XVxuIjsKKworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcocGFyc2Vfc3RyaW5nLCAmcHJvdG9fKSk7CisKKyAgQVNTRVJUX0VRKDMsIHByb3RvXy5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgcHJvdG9fLnJlcGVhdGVkX2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDQ1NiwgcHJvdG9fLnJlcGVhdGVkX2ludDMyKDEpKTsKKyAgRVhQRUNUX0VRKDc4OSwgcHJvdG9fLnJlcGVhdGVkX2ludDMyKDIpKTsKKworICBBU1NFUlRfRVEoMywgcHJvdG9fLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sIHByb3RvXy5yZXBlYXRlZF9uZXN0ZWRfZW51bSgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIHByb3RvXy5yZXBlYXRlZF9uZXN0ZWRfZW51bSgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosIHByb3RvXy5yZXBlYXRlZF9uZXN0ZWRfZW51bSgyKSk7CisKKyAgQVNTRVJUX0VRKDIsIHByb3RvXy5yZXBlYXRlZF9zdHJpbmdfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBwcm90b18ucmVwZWF0ZWRfc3RyaW5nKDApKTsKKyAgRVhQRUNUX0VRKCJiYXIiLCBwcm90b18ucmVwZWF0ZWRfc3RyaW5nKDEpKTsKKworICBBU1NFUlRfRVEoMiwgcHJvdG9fLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgxLCBwcm90b18ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgyLCBwcm90b18ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMSkuYmIoKSk7CisKKyAgQVNTRVJUX0VRKDIsIHByb3RvXy5yZXBlYXRlZGdyb3VwX3NpemUoKSk7CisgIEVYUEVDVF9FUSgzLCBwcm90b18ucmVwZWF0ZWRncm91cCgwKS5hKCkpOworICBFWFBFQ1RfRVEoNCwgcHJvdG9fLnJlcGVhdGVkZ3JvdXAoMSkuYSgpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQYXJzZVNob3J0UmVwZWF0ZWRXaXRoVHJhaWxpbmdDb21tYSkgeworICBzdGQ6OnN0cmluZyBwYXJzZV9zdHJpbmcgPSAicmVwZWF0ZWRfaW50MzI6IFs0NTYsXVxuIjsKKyAgQVNTRVJUX0ZBTFNFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhwYXJzZV9zdHJpbmcsICZwcm90b18pKTsKKyAgcGFyc2Vfc3RyaW5nID0gInJlcGVhdGVkX25lc3RlZF9lbnVtOiBbICBGT08gLCBdIjsKKyAgQVNTRVJUX0ZBTFNFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhwYXJzZV9zdHJpbmcsICZwcm90b18pKTsKKyAgcGFyc2Vfc3RyaW5nID0gInJlcGVhdGVkX3N0cmluZzogWyBcImZvb1wiLCBdIjsKKyAgQVNTRVJUX0ZBTFNFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhwYXJzZV9zdHJpbmcsICZwcm90b18pKTsKKyAgcGFyc2Vfc3RyaW5nID0gInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlOiBbIHsgYmI6IDEgfSwgXSI7CisgIEFTU0VSVF9GQUxTRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcocGFyc2Vfc3RyaW5nLCAmcHJvdG9fKSk7CisgIHBhcnNlX3N0cmluZyA9ICJSZXBlYXRlZEdyb3VwIFt7IGE6IDMgfSxdXG4iOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlU2hvcnRSZXBlYXRlZEVtcHR5KSB7CisgIHN0ZDo6c3RyaW5nIHBhcnNlX3N0cmluZyA9CisgICAgICAicmVwZWF0ZWRfaW50MzI6IFtdXG4iCisgICAgICAicmVwZWF0ZWRfbmVzdGVkX2VudW06IFtdXG4iCisgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBbXVxuIgorICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlOiBbXVxuIgorICAgICAgIlJlcGVhdGVkR3JvdXAgW11cbiI7CisKKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKHBhcnNlX3N0cmluZywgJnByb3RvXykpOworCisgIEVYUEVDVF9FUSgwLCBwcm90b18ucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIHByb3RvXy5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgcHJvdG9fLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgcHJvdG9fLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBwcm90b18ucmVwZWF0ZWRncm91cF9zaXplKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlU2hvcnRSZXBlYXRlZENvbmNhdGVuYXRlZFdpdGhFbXB0eSkgeworICBzdGQ6OnN0cmluZyBwYXJzZV9zdHJpbmcgPQorICAgICAgLy8gU3RhcnRpbmcgd2l0aCBlbXB0eSBbXSBzaG91bGQgaGF2ZSBubyBpbXBhY3QuCisgICAgICAicmVwZWF0ZWRfaW50MzI6IFtdXG4iCisgICAgICAicmVwZWF0ZWRfbmVzdGVkX2VudW06IFtdXG4iCisgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBbXVxuIgorICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlOiBbXVxuIgorICAgICAgIlJlcGVhdGVkR3JvdXAgW11cbiIKKyAgICAgIC8vIE1peGVkIHNob3J0LWZvcm0gYW5kIGxvbmctZm9ybSBhcmUgc2ltcGx5IGNvbmNhdGVuYXRlZC4KKyAgICAgICJyZXBlYXRlZF9pbnQzMjogMVxuIgorICAgICAgInJlcGVhdGVkX2ludDMyOiBbNDU2LCA3ODldXG4iCisgICAgICAicmVwZWF0ZWRfbmVzdGVkX2VudW06IFsgIEZPTyAsQkFSLCAjIGNvbW1lbnRcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgM11cbiIKKyAgICAgIC8vIE5vdGUgdGhhdCB3aGlsZSB0aGUgcHJpbnRlciB3b24ndCBwcmludCByZXBlYXRlZCBzdHJpbmdzIGluIHNob3J0LWZvcm0sCisgICAgICAvLyB0aGUgcGFyc2VyIHdpbGwgYWNjZXB0IHRoZW0uCisgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBbIFwiZm9vXCIsICdiYXInIF1cbiIKKyAgICAgIC8vIFJlcGVhdGVkIG1lc3NhZ2UKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZTogWyB7IGJiOiAxIH0sIHsgYmIgOiAyIH1dXG4iCisgICAgICAvLyBSZXBlYXRlZCBncm91cAorICAgICAgIlJlcGVhdGVkR3JvdXAgW3sgYTogMyB9LHsgYTogNCB9XVxuIgorICAgICAgLy8gQWRkaW5nIGVtcHR5IFtdIHNob3VsZCBoYXZlIG5vIGltcGFjdC4KKyAgICAgICJyZXBlYXRlZF9pbnQzMjogW11cbiIKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfZW51bTogW11cbiIKKyAgICAgICJyZXBlYXRlZF9zdHJpbmc6IFtdXG4iCisgICAgICAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2U6IFtdXG4iCisgICAgICAiUmVwZWF0ZWRHcm91cCBbXVxuIjsKKworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcocGFyc2Vfc3RyaW5nLCAmcHJvdG9fKSk7CisKKyAgQVNTRVJUX0VRKDMsIHByb3RvXy5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgcHJvdG9fLnJlcGVhdGVkX2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDQ1NiwgcHJvdG9fLnJlcGVhdGVkX2ludDMyKDEpKTsKKyAgRVhQRUNUX0VRKDc4OSwgcHJvdG9fLnJlcGVhdGVkX2ludDMyKDIpKTsKKworICBBU1NFUlRfRVEoMywgcHJvdG9fLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sIHByb3RvXy5yZXBlYXRlZF9uZXN0ZWRfZW51bSgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIHByb3RvXy5yZXBlYXRlZF9uZXN0ZWRfZW51bSgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosIHByb3RvXy5yZXBlYXRlZF9uZXN0ZWRfZW51bSgyKSk7CisKKyAgQVNTRVJUX0VRKDIsIHByb3RvXy5yZXBlYXRlZF9zdHJpbmdfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBwcm90b18ucmVwZWF0ZWRfc3RyaW5nKDApKTsKKyAgRVhQRUNUX0VRKCJiYXIiLCBwcm90b18ucmVwZWF0ZWRfc3RyaW5nKDEpKTsKKworICBBU1NFUlRfRVEoMiwgcHJvdG9fLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgxLCBwcm90b18ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgyLCBwcm90b18ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMSkuYmIoKSk7CisKKyAgQVNTRVJUX0VRKDIsIHByb3RvXy5yZXBlYXRlZGdyb3VwX3NpemUoKSk7CisgIEVYUEVDVF9FUSgzLCBwcm90b18ucmVwZWF0ZWRncm91cCgwKS5hKCkpOworICBFWFBFQ1RfRVEoNCwgcHJvdG9fLnJlcGVhdGVkZ3JvdXAoMSkuYSgpKTsKK30KKworCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIENvbW1lbnRzKSB7CisgIC8vIFRlc3QgdGhhdCBjb21tZW50cyBhcmUgaWdub3JlZC4KKworICBzdGQ6OnN0cmluZyBwYXJzZV9zdHJpbmcgPQorICAgICAgIm9wdGlvbmFsX2ludDMyOiAxICAjIGEgY29tbWVudFxuIgorICAgICAgIm9wdGlvbmFsX2ludDY0OiAyICAjIGFub3RoZXIgY29tbWVudCI7CisKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXRfc3RyZWFtKHBhcnNlX3N0cmluZy5kYXRhKCksIHBhcnNlX3N0cmluZy5zaXplKCkpOworCisgIFRleHRGb3JtYXQ6OlBhcnNlKCZpbnB1dF9zdHJlYW0sICZwcm90b18pOworCisgIC8vIENvbXBhcmUuCisgIEVYUEVDVF9FUSgxLCBwcm90b18ub3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSgyLCBwcm90b18ub3B0aW9uYWxfaW50NjQoKSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgT3B0aW9uYWxDb2xvbikgeworICAvLyBUZXN0IHRoYXQgd2UgY2FuIHBsYWNlIGEgJzonIGFmdGVyIHRoZSBmaWVsZCBuYW1lIG9mIGEgbmVzdGVkIG1lc3NhZ2UsCisgIC8vIGV2ZW4gdGhvdWdoIHdlIGRvbid0IGhhdmUgdG8uCisKKyAgc3RkOjpzdHJpbmcgcGFyc2Vfc3RyaW5nID0gIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlOiB7IGJiOiAxfVxuIjsKKworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0ocGFyc2Vfc3RyaW5nLmRhdGEoKSwgcGFyc2Vfc3RyaW5nLnNpemUoKSk7CisKKyAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7CisKKyAgLy8gQ29tcGFyZS4KKyAgRVhQRUNUX1RSVUUocHJvdG9fLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKDEsIHByb3RvXy5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworfQorCisvLyBTb21lIHBsYXRmb3JtcyAoZS5nLiBXaW5kb3dzKSBpbnNpc3Qgb24gcGFkZGluZyB0aGUgZXhwb25lbnQgdG8gdGhyZWUKKy8vIGRpZ2l0cyB3aGVuIG9uZSBvciB0d28gd291bGQgYmUganVzdCBmaW5lLgorc3RhdGljIHN0ZDo6c3RyaW5nIFJlbW92ZVJlZHVuZGFudFplcm9zKHN0ZDo6c3RyaW5nIHRleHQpIHsKKyAgdGV4dCA9IFN0cmluZ1JlcGxhY2UodGV4dCwgImUrMCIsICJlKyIsIHRydWUpOworICB0ZXh0ID0gU3RyaW5nUmVwbGFjZSh0ZXh0LCAiZS0wIiwgImUtIiwgdHJ1ZSk7CisgIHJldHVybiB0ZXh0OworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50RXhvdGljKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9pbnQ2NChpbnQ2NF90ey05MjIzMzcyMDM2ODU0Nzc1ODA3fSAtIDEpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF91aW50NjQodWludDY0X3R7MTg0NDY3NDQwNzM3MDk1NTE2MTV1fSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxMjMuNDU2KTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjNlMjEpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yM2UtMTgpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKC1zdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9OYU4oKSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgtc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9OYU4oKSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZShzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OnNpZ25hbGluZ19OYU4oKSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgtc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpzaWduYWxpbmdfTmFOKCkpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoc3RkOjpzdHJpbmcoIlwwMDBcMDAxXGFcYlxmXG5cclx0XHZcXFwnXCIiLCAxMikpOworCisgIC8vIEZ1biBzdG9yeTogIFdlIHVzZWQgdG8gdXNlIDEuMjNlMjIgaW5zdGVhZCBvZiAxLjIzZTIxIGFib3ZlLCBidXQgdGhpcworICAvLyAgIHNlZW1lZCB0byB0cmlnZ2VyIGFuIG9kZCBjYXNlIG9uIE1pbkdXL0dDQyAzLjQuNSB3aGVyZSBHQ0MncyBwYXJzaW5nIG9mCisgIC8vICAgdGhlIHZhbHVlIGRpZmZlcmVkIGZyb20gc3RydG9kKCkncyBwYXJzaW5nLiAgVGhhdCBpcyB0byBzYXksIHRoZQorICAvLyAgIGZvbGxvd2luZyBhc3NlcnRpb24gZmFpbHMgb24gTWluR1c6CisgIC8vICAgICBhc3NlcnQoMS4yM2UyMiA9PSBzdHJ0b2QoIjEuMjNlMjIiLCBudWxscHRyKSk7CisgIC8vICAgQXMgYSByZXN1bHQsIFNpbXBsZUR0b2EoKSB3b3VsZCBwcmludCB0aGUgdmFsdWUgYXMKKyAgLy8gICAiMS4yMzAwMDAwMDAwMDAwMDAxZSsyMiIgdG8gbWFrZSBzdXJlIHN0cnRvZCgpIHByb2R1Y2UgdGhlIGV4YWN0IHNhbWUKKyAgLy8gICByZXN1bHQuICBPdXIgZ29hbCBpcyB0byB0ZXN0IHJ1bnRpbWUgcGFyc2luZywgbm90IGNvbXBpbGUtdGltZSBwYXJzaW5nLAorICAvLyAgIHNvIHRoaXMgd2Fzbid0IG91ciBwcm9ibGVtLiAgSXQgd2FzIGZvdW5kIHRoYXQgdXNpbmcgMS4yM2UyMSBkaWQgbm90CisgIC8vICAgaGF2ZSB0aGlzIHByb2JsZW0sIHNvIHdlIHN3aXRjaGVkIHRvIHRoYXQgaW5zdGVhZC4KKworICBFWFBFQ1RfRVEoCisgICAgICBTdHJDYXQoInJlcGVhdGVkX2ludDY0OiAiLCBrRGVidWdTdHJpbmdTaWxlbnRNYXJrZXIsCisgICAgICAgICAgICAgICAgICAgIi05MjIzMzcyMDM2ODU0Nzc1ODA4XG4iCisgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX3VpbnQ2NDogMTg0NDY3NDQwNzM3MDk1NTE2MTVcbiIKKyAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiAxMjMuNDU2XG4iCisgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yM2UrMjFcbiIKKyAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzZS0xOFxuIgorICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IGluZlxuIgorICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IC1pbmZcbiIKKyAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiBuYW5cbiIKKyAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiBuYW5cbiIKKyAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiBuYW5cbiIKKyAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiBuYW5cbiIKKyAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfc3RyaW5nOiAiCisgICAgICAgICAgICAgICAgICAgIlwiXFwwMDBcXDAwMVxcMDA3XFwwMTBcXDAxNFxcblxcclxcdFxcMDEzXFxcXFxcJ1xcXCJcIlxuIiksCisgICAgICBSZW1vdmVSZWR1bmRhbnRaZXJvcyhtZXNzYWdlLkRlYnVnU3RyaW5nKCkpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludEZsb2F0UHJlY2lzaW9uKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjApOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIzKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yMzQpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIzNDUpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIzNDU2KTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yZTEwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yM2UxMCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2Zsb2F0KDEuMjM0ZTEwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yMzQ1ZTEwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yMzQ1NmUxMCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMyk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDUpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Nik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nyk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2NzgpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Njc4OSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5OCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODcpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Njc4OTg3Nik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODc2NSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODc2NTQpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Njc4OTg3NjU0Myk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjJlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjNlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0ZTEwMCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDVlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTZlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ZTEwMCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2NzhlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODllMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4ZTEwMCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODdlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4NzZlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4NzY1ZTEwMCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODc2NTRlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4NzY1NDNlMTAwKTsKKworICBFWFBFQ1RfRVEoU3RyQ2F0KCJyZXBlYXRlZF9mbG9hdDogIiwga0RlYnVnU3RyaW5nU2lsZW50TWFya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICIxXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAxLjJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjM0XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAxLjIzNDVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjM0NTZcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMmUrMTBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjNlKzEwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAxLjIzNGUrMTBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjM0NWUrMTBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjM0NTZlKzEwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yM1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1NlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4NzY1XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NjU0XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NjU0M1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMmUrMTAwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yM2UrMTAwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzRlKzEwMFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NWUrMTAwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1NmUrMTAwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1NjdlKzEwMFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3OGUrMTAwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OWUrMTAwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OThlKzEwMFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4N2UrMTAwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NmUrMTAwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NjVlKzEwMFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4NzY1NGUrMTAwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NjU0M2UrMTAwXG4iKSwKKyAgICAgICAgICAgIFJlbW92ZVJlZHVuZGFudFplcm9zKG1lc3NhZ2UuRGVidWdTdHJpbmcoKSkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIEFsbG93UGFydGlhbCkgeworICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7CisgIFRleHRGb3JtYXQ6OlBhcnNlciBwYXJzZXI7CisgIHBhcnNlci5BbGxvd1BhcnRpYWxNZXNzYWdlKHRydWUpOworICBFWFBFQ1RfVFJVRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJhOiAxIiwgJm1lc3NhZ2UpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UuYSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2IoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19jKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlRXhvdGljKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAorICAgICAgInJlcGVhdGVkX2ludDMyOiAtMVxuIgorICAgICAgInJlcGVhdGVkX2ludDMyOiAtMjE0NzQ4MzY0OFxuIgorICAgICAgInJlcGVhdGVkX2ludDY0OiAtMVxuIgorICAgICAgInJlcGVhdGVkX2ludDY0OiAtOTIyMzM3MjAzNjg1NDc3NTgwOFxuIgorICAgICAgInJlcGVhdGVkX3VpbnQzMjogNDI5NDk2NzI5NVxuIgorICAgICAgInJlcGVhdGVkX3VpbnQzMjogMjE0NzQ4MzY0OFxuIgorICAgICAgInJlcGVhdGVkX3VpbnQ2NDogMTg0NDY3NDQwNzM3MDk1NTE2MTVcbiIKKyAgICAgICJyZXBlYXRlZF91aW50NjQ6IDkyMjMzNzIwMzY4NTQ3NzU4MDhcbiIKKyAgICAgICJyZXBlYXRlZF9kb3VibGU6IDEyMy4wXG4iCisgICAgICAicmVwZWF0ZWRfZG91YmxlOiAxMjMuNVxuIgorICAgICAgInJlcGVhdGVkX2RvdWJsZTogMC4xMjVcbiIKKyAgICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjNFMTdcbiIKKyAgICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM1RSsyMlxuIgorICAgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzVlLTE4XG4iCisgICAgICAicmVwZWF0ZWRfZG91YmxlOiAxMjMuNDU2Nzg5XG4iCisgICAgICAicmVwZWF0ZWRfZG91YmxlOiBpbmZcbiIKKyAgICAgICJyZXBlYXRlZF9kb3VibGU6IEluZmluaXR5XG4iCisgICAgICAicmVwZWF0ZWRfZG91YmxlOiAtaW5mXG4iCisgICAgICAicmVwZWF0ZWRfZG91YmxlOiAtSW5maW5pdHlcbiIKKyAgICAgICJyZXBlYXRlZF9kb3VibGU6IG5hblxuIgorICAgICAgInJlcGVhdGVkX2RvdWJsZTogTmFOXG4iCisgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcIlxcMDAwXFwwMDFcXGFcXGJcXGZcXG5cXHJcXHRcXHZcXFxcXFwnXFxcIlwiXG4iLAorICAgICAgJm1lc3NhZ2UpKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoLTEsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIoMCkpOworICBFWFBFQ1RfRVEoLTIxNDc0ODM2NDgsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIoMSkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUoKSk7CisgIEVYUEVDVF9FUSgtMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCgwKSk7CisgIEVYUEVDVF9FUShpbnQ2NF90ey05MjIzMzcyMDM2ODU0Nzc1ODA3fSAtIDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQoMSkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoNDI5NDk2NzI5NXUsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyKDApKTsKKyAgRVhQRUNUX0VRKDIxNDc0ODM2NDh1LCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMigxKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0X3NpemUoKSk7CisgIEVYUEVDVF9FUSh1aW50NjRfdHsxODQ0Njc0NDA3MzcwOTU1MTYxNXV9LCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCgwKSk7CisgIEVYUEVDVF9FUSh1aW50NjRfdHs5MjIzMzcyMDM2ODU0Nzc1ODA4dX0sIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0KDEpKTsKKworICBBU1NFUlRfRVEoMTMsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgxMjMuMCwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMCkpOworICBFWFBFQ1RfRVEoMTIzLjUsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDEpKTsKKyAgRVhQRUNUX0VRKDAuMTI1LCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgyKSk7CisgIEVYUEVDVF9FUSgxLjIzRTE3LCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgzKSk7CisgIEVYUEVDVF9FUSgxLjIzNUUyMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoNCkpOworICBFWFBFQ1RfRVEoMS4yMzVFLTE4LCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSg1KSk7CisgIEVYUEVDVF9FUSgxMjMuNDU2Nzg5LCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSg2KSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSg3KSwKKyAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSg4KSwKKyAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSg5KSwKKyAgICAgICAgICAgIC1zdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMTApLAorICAgICAgICAgICAgLXN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7CisgIEVYUEVDVF9UUlVFKHN0ZDo6aXNuYW4obWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMTEpKSk7CisgIEVYUEVDVF9UUlVFKHN0ZDo6aXNuYW4obWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMTIpKSk7CisKKyAgLy8gTm90ZTogIFNpbmNlIHRoZXNlIHN0cmluZyBsaXRlcmFscyBoYXZlIFwwJ3MgaW4gdGhlbSwgd2UgbXVzdCBleHBsaWNpdGx5CisgIC8vIHBhc3MgdGhlaXIgc2l6ZXMgdG8gc3RyaW5nJ3MgY29uc3RydWN0b3IuCisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcoIlwwMDBcMDAxXGFcYlxmXG5cclx0XHZcXFwnXCIiLCAxMiksCisgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZygwKSk7CisKKyAgQVNTRVJUX1RSVUUoCisgICAgICBUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoInJlcGVhdGVkX2Zsb2F0OiAzLjQwMjgyMzVlKzM4XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAtMy40MDI4MjM1ZSszOFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogMy40MDI4MjM1Njc3OTczMzdlKzM4XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAtMy40MDI4MjM1Njc3OTczMzdlKzM4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0KDApLCBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWF4KCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9mbG9hdCgxKSwgLXN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjptYXgoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0KDIpLCBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0KDMpLCAtc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkpOworCit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUHJpbnRGaWVsZHNJbkluZGV4T3JkZXIpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RGaWVsZE9yZGVyaW5ncyBtZXNzYWdlOworICAvLyBGaWVsZHMgYXJlIGxpc3RlZCBpbiBpbmRleCBvcmRlciBpbnN0ZWFkIG9mIGZpZWxkIG51bWJlci4KKyAgbWVzc2FnZS5zZXRfbXlfc3RyaW5nKCJzdHIiKTsgIC8vIEZpZWxkIG51bWJlciAxMQorICBtZXNzYWdlLnNldF9teV9pbnQoMTIzNDUpOyAgICAgLy8gRmllbGQgbnVtYmVyIDEKKyAgbWVzc2FnZS5zZXRfbXlfZmxvYXQoMC45OTkpOyAgIC8vIEZpZWxkIG51bWJlciAxMDEKKyAgLy8gRXh0ZW5zaW9ucyBhcmUgbGlzdGVkIGJhc2VkIG9uIHRoZSBvcmRlciBvZiBleHRlbnNpb24gbnVtYmVyLgorICAvLyBFeHRlbnNpb24gbnVtYmVyIDEyLgorICBtZXNzYWdlCisgICAgICAuTXV0YWJsZUV4dGVuc2lvbigKKyAgICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEV4dGVuc2lvbk9yZGVyaW5nczI6OnRlc3RfZXh0X29yZGVyaW5nczIpCisgICAgICAtPnNldF9teV9zdHJpbmcoImV4dF9zdHIyIik7CisgIC8vIEV4dGVuc2lvbiBudW1iZXIgMTMuCisgIG1lc3NhZ2UKKyAgICAgIC5NdXRhYmxlRXh0ZW5zaW9uKAorICAgICAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RXh0ZW5zaW9uT3JkZXJpbmdzMTo6dGVzdF9leHRfb3JkZXJpbmdzMSkKKyAgICAgIC0+c2V0X215X3N0cmluZygiZXh0X3N0cjEiKTsKKyAgLy8gRXh0ZW5zaW9uIG51bWJlciAxNC4KKyAgbWVzc2FnZQorICAgICAgLk11dGFibGVFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RFeHRlbnNpb25PcmRlcmluZ3MyOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0RXh0ZW5zaW9uT3JkZXJpbmdzMzo6dGVzdF9leHRfb3JkZXJpbmdzMykKKyAgICAgIC0+c2V0X215X3N0cmluZygiZXh0X3N0cjMiKTsKKyAgLy8gRXh0ZW5zaW9uIG51bWJlciA1MC4KKyAgKm1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6bXlfZXh0ZW5zaW9uX3N0cmluZykgPSAiZXh0X3N0cjAiOworCisgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgc3RkOjpzdHJpbmcgdGV4dDsKKworICAvLyBCeSBkZWZhdWx0LCBwcmludCBpbiBmaWVsZCBudW1iZXIgb3JkZXIuCisgIC8vIG15X2ludDogMTIzNDUKKyAgLy8gbXlfc3RyaW5nOiAic3RyIgorICAvLyBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdEV4dGVuc2lvbk9yZGVyaW5nczIudGVzdF9leHRfb3JkZXJpbmdzMl0geworICAvLyAgIG15X3N0cmluZzogImV4dF9zdHIyIgorICAvLyB9CisgIC8vIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0RXh0ZW5zaW9uT3JkZXJpbmdzMS50ZXN0X2V4dF9vcmRlcmluZ3MxXSB7CisgIC8vICAgbXlfc3RyaW5nOiAiZXh0X3N0cjEiCisgIC8vIH0KKyAgLy8gW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RFeHRlbnNpb25PcmRlcmluZ3MyLlRlc3RFeHRlbnNpb25PcmRlcmluZ3MzLnRlc3RfZXh0X29yZGVyaW5nczNdCisgIC8vIHsKKyAgLy8gICBteV9zdHJpbmc6ICJleHRfc3RyMyIKKyAgLy8gfQorICAvLyBbcHJvdG9idWZfdW5pdHRlc3QubXlfZXh0ZW5zaW9uX3N0cmluZ106ICJleHRfc3RyMCIKKyAgLy8gbXlfZmxvYXQ6IDAuOTk5CisgIHByaW50ZXIuUHJpbnRUb1N0cmluZyhtZXNzYWdlLCAmdGV4dCk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJteV9pbnQ6IDEyMzQ1XG5teV9zdHJpbmc6ICIKKyAgICAgICJcInN0clwiXG5bcHJvdG9idWZfdW5pdHRlc3QuVGVzdEV4dGVuc2lvbk9yZGVyaW5nczIudGVzdF9leHRfb3JkZXJpbmdzMl0gIgorICAgICAgIntcbiAgbXlfc3RyaW5nOiAiCisgICAgICAiXCJleHRfc3RyMlwiXG59XG5bcHJvdG9idWZfdW5pdHRlc3QuVGVzdEV4dGVuc2lvbk9yZGVyaW5nczEudGVzdF9leHRfIgorICAgICAgIm9yZGVyaW5nczFdIHtcbiAgbXlfc3RyaW5nOiAiCisgICAgICAiXCJleHRfc3RyMVwiXG59XG5bcHJvdG9idWZfdW5pdHRlc3QuVGVzdEV4dGVuc2lvbk9yZGVyaW5nczIuIgorICAgICAgIlRlc3RFeHRlbnNpb25PcmRlcmluZ3MzLnRlc3RfZXh0X29yZGVyaW5nczNdIHtcbiAgbXlfc3RyaW5nOiAiCisgICAgICAiXCJleHRfc3RyM1wiXG59XG5bcHJvdG9idWZfdW5pdHRlc3QubXlfZXh0ZW5zaW9uX3N0cmluZ106ICIKKyAgICAgICJcImV4dF9zdHIwXCJcbm15X2Zsb2F0OiAwLjk5OVxuIiwKKyAgICAgIHRleHQpOworCisgIC8vIFByaW50IGluIGluZGV4IG9yZGVyLgorICAvLyBteV9zdHJpbmc6ICJzdHIiCisgIC8vIG15X2ludDogMTIzNDUKKyAgLy8gbXlfZmxvYXQ6IDAuOTk5CisgIC8vIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0RXh0ZW5zaW9uT3JkZXJpbmdzMi50ZXN0X2V4dF9vcmRlcmluZ3MyXSB7CisgIC8vICAgbXlfc3RyaW5nOiAiZXh0X3N0cjIiCisgIC8vIH0KKyAgLy8gW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RFeHRlbnNpb25PcmRlcmluZ3MxLnRlc3RfZXh0X29yZGVyaW5nczFdIHsKKyAgLy8gICBteV9zdHJpbmc6ICJleHRfc3RyMSIKKyAgLy8gfQorICAvLyBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdEV4dGVuc2lvbk9yZGVyaW5nczIuVGVzdEV4dGVuc2lvbk9yZGVyaW5nczMudGVzdF9leHRfb3JkZXJpbmdzM10KKyAgLy8geworICAvLyAgIG15X3N0cmluZzogImV4dF9zdHIzIgorICAvLyB9CisgIC8vIFtwcm90b2J1Zl91bml0dGVzdC5teV9leHRlbnNpb25fc3RyaW5nXTogImV4dF9zdHIwIgorICBwcmludGVyLlNldFByaW50TWVzc2FnZUZpZWxkc0luSW5kZXhPcmRlcih0cnVlKTsKKyAgcHJpbnRlci5QcmludFRvU3RyaW5nKG1lc3NhZ2UsICZ0ZXh0KTsKKyAgRVhQRUNUX0VRKAorICAgICAgIm15X3N0cmluZzogXCJzdHJcIlxubXlfaW50OiAxMjM0NVxubXlfZmxvYXQ6ICIKKyAgICAgICIwLjk5OVxuW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RFeHRlbnNpb25PcmRlcmluZ3MyLnRlc3RfZXh0X29yZGVyaW5nczJdICIKKyAgICAgICJ7XG4gIG15X3N0cmluZzogIgorICAgICAgIlwiZXh0X3N0cjJcIlxufVxuW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RFeHRlbnNpb25PcmRlcmluZ3MxLnRlc3RfZXh0XyIKKyAgICAgICJvcmRlcmluZ3MxXSB7XG4gIG15X3N0cmluZzogIgorICAgICAgIlwiZXh0X3N0cjFcIlxufVxuW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RFeHRlbnNpb25PcmRlcmluZ3MyLiIKKyAgICAgICJUZXN0RXh0ZW5zaW9uT3JkZXJpbmdzMy50ZXN0X2V4dF9vcmRlcmluZ3MzXSB7XG4gIG15X3N0cmluZzogIgorICAgICAgIlwiZXh0X3N0cjNcIlxufVxuW3Byb3RvYnVmX3VuaXR0ZXN0Lm15X2V4dGVuc2lvbl9zdHJpbmddOiBcImV4dF9zdHIwXCJcbiIsCisgICAgICB0ZXh0KTsKK30KKworY2xhc3MgVGV4dEZvcm1hdFBhcnNlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIEV4cGVjdEZhaWx1cmUoY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0LCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBpbnQgY29sKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+IHByb3RvKG5ldyB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKTsKKyAgICBFeHBlY3RGYWlsdXJlKGlucHV0LCBtZXNzYWdlLCBsaW5lLCBjb2wsIHByb3RvLmdldCgpKTsKKyAgfQorCisgIHZvaWQgRXhwZWN0RmFpbHVyZShjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsIGludCBjb2wsIE1lc3NhZ2UqIHByb3RvKSB7CisgICAgRXhwZWN0TWVzc2FnZShpbnB1dCwgbWVzc2FnZSwgbGluZSwgY29sLCBwcm90bywgZmFsc2UpOworICB9CisKKyAgdm9pZCBFeHBlY3RNZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSwgaW50IGNvbCwgTWVzc2FnZSogcHJvdG8sIGJvb2wgZXhwZWN0ZWRfcmVzdWx0KSB7CisgICAgTW9ja0Vycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKKyAgICBwYXJzZXJfLlJlY29yZEVycm9yc1RvKCZlcnJvcl9jb2xsZWN0b3IpOworICAgIEVYUEVDVF9FUShleHBlY3RlZF9yZXN1bHQsIHBhcnNlcl8uUGFyc2VGcm9tU3RyaW5nKGlucHV0LCBwcm90bykpCisgICAgICAgIDw8IGlucHV0IDw8ICIgLT4gIiA8PCBwcm90by0+RGVidWdTdHJpbmcoKTsKKyAgICBFWFBFQ1RfRVEoU3RyQ2F0KGxpbmUsICI6IiwgY29sLCAiOiAiLCBtZXNzYWdlLCAiXG4iKSwKKyAgICAgICAgICAgICAgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKKyAgICBwYXJzZXJfLlJlY29yZEVycm9yc1RvKG51bGxwdHIpOworICB9CisKKyAgdm9pZCBFeHBlY3RTdWNjZXNzQW5kVHJlZShjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQsIE1lc3NhZ2UqIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWUqIGluZm9fdHJlZSkgeworICAgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgICAgcGFyc2VyXy5SZWNvcmRFcnJvcnNUbygmZXJyb3JfY29sbGVjdG9yKTsKKyAgICBwYXJzZXJfLldyaXRlTG9jYXRpb25zVG8oaW5mb190cmVlKTsKKyAgICBFWFBFQ1RfVFJVRShwYXJzZXJfLlBhcnNlRnJvbVN0cmluZyhpbnB1dCwgcHJvdG8pKTsKKyAgICBwYXJzZXJfLldyaXRlTG9jYXRpb25zVG8obnVsbHB0cik7CisgICAgcGFyc2VyXy5SZWNvcmRFcnJvcnNUbyhudWxscHRyKTsKKyAgfQorCisgIHZvaWQgRXhwZWN0TG9jYXRpb24oVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSogdHJlZSwgY29uc3QgRGVzY3JpcHRvciogZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSwgaW50IGluZGV4LCBpbnQgc3RhcnRfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfY29sdW1uLCBpbnQgZW5kX2xpbmUsIGludCBlbmRfY29sdW1uKSB7CisgICAgVGV4dEZvcm1hdDo6UGFyc2VMb2NhdGlvblJhbmdlIHJhbmdlID0KKyAgICAgICAgdHJlZS0+R2V0TG9jYXRpb25SYW5nZShkLT5GaW5kRmllbGRCeU5hbWUoZmllbGRfbmFtZSksIGluZGV4KTsKKyAgICBFWFBFQ1RfRVEoc3RhcnRfbGluZSwgcmFuZ2Uuc3RhcnQubGluZSk7CisgICAgRVhQRUNUX0VRKHN0YXJ0X2NvbHVtbiwgcmFuZ2Uuc3RhcnQuY29sdW1uKTsKKyAgICBFWFBFQ1RfRVEoZW5kX2xpbmUsIHJhbmdlLmVuZC5saW5lKTsKKyAgICBFWFBFQ1RfRVEoZW5kX2NvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbik7CisgICAgVGV4dEZvcm1hdDo6UGFyc2VMb2NhdGlvbiBzdGFydF9sb2NhdGlvbiA9CisgICAgICAgIHRyZWUtPkdldExvY2F0aW9uKGQtPkZpbmRGaWVsZEJ5TmFtZShmaWVsZF9uYW1lKSwgaW5kZXgpOworICAgIEVYUEVDVF9FUShzdGFydF9saW5lLCBzdGFydF9sb2NhdGlvbi5saW5lKTsKKyAgICBFWFBFQ1RfRVEoc3RhcnRfY29sdW1uLCBzdGFydF9sb2NhdGlvbi5jb2x1bW4pOworICB9CisKKyAgLy8gQW4gZXJyb3IgY29sbGVjdG9yIHdoaWNoIHNpbXBseSBjb25jYXRlbmF0ZXMgYWxsIGl0cyBlcnJvcnMgaW50byBhIGJpZworICAvLyBibG9jayBvZiB0ZXh0IHdoaWNoIGNhbiBiZSBjaGVja2VkLgorICBjbGFzcyBNb2NrRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgaW86OkVycm9yQ29sbGVjdG9yIHsKKyAgIHB1YmxpYzoKKyAgICBNb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQorICAgIH5Nb2NrRXJyb3JDb2xsZWN0b3IoKSBvdmVycmlkZSB7fQorCisgICAgc3RkOjpzdHJpbmcgdGV4dF87CisKKyAgICAvLyBpbXBsZW1lbnRzIEVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB2b2lkIEFkZEVycm9yKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgb3ZlcnJpZGUgeworICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmdGV4dF8sICIkMDokMTogJDJcbiIsIGxpbmUgKyAxLCBjb2x1bW4gKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgICB9CisKKyAgICB2b2lkIEFkZFdhcm5pbmcoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSBvdmVycmlkZSB7CisgICAgICBBZGRFcnJvcihsaW5lLCBjb2x1bW4sICJXQVJOSU5HOiIgKyBtZXNzYWdlKTsKKyAgICB9CisgIH07CisKKyAgVGV4dEZvcm1hdDo6UGFyc2VyIHBhcnNlcl87Cit9OworCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFBhcnNlSW5mb1RyZWVCdWlsZGluZykgeworICBzdGQ6OnVuaXF1ZV9wdHI8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlcz4gbWVzc2FnZShuZXcgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGQgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7CisKKyAgc3RkOjpzdHJpbmcgc3RyaW5nRGF0YSA9CisgICAgICAib3B0aW9uYWxfaW50MzI6IDFcbiIKKyAgICAgICJvcHRpb25hbF9pbnQ2NDogMlxuIgorICAgICAgIiAgb3B0aW9uYWxfZG91YmxlOiAyLjRcbiIKKyAgICAgICJyZXBlYXRlZF9pbnQzMjogNVxuIgorICAgICAgInJlcGVhdGVkX2ludDMyOiAxMFxuIgorICAgICAgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIDxcbiIKKyAgICAgICIgIGJiOiA3OFxuIgorICAgICAgIj5cbiIKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSA8XG4iCisgICAgICAiICBiYjogNzlcbiIKKyAgICAgICI+XG4iCisgICAgICAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgPFxuIgorICAgICAgIiAgYmI6IDgwXG4iCisgICAgICAiPiI7CisKKyAgVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSB0cmVlOworICBFeHBlY3RTdWNjZXNzQW5kVHJlZShzdHJpbmdEYXRhLCBtZXNzYWdlLmdldCgpLCAmdHJlZSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgdGhlIHRyZWUgaGFzIHRoZSBjb3JyZWN0IHBvc2l0aW9ucy4KKyAgRXhwZWN0TG9jYXRpb24oJnRyZWUsIGQsICJvcHRpb25hbF9pbnQzMiIsIC0xLCAwLCAwLCAwLCAxNyk7CisgIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAib3B0aW9uYWxfaW50NjQiLCAtMSwgMSwgMCwgMSwgMTcpOworICBFeHBlY3RMb2NhdGlvbigmdHJlZSwgZCwgIm9wdGlvbmFsX2RvdWJsZSIsIC0xLCAyLCAyLCAyLCAyMik7CisKKyAgRXhwZWN0TG9jYXRpb24oJnRyZWUsIGQsICJyZXBlYXRlZF9pbnQzMiIsIDAsIDMsIDAsIDMsIDE3KTsKKyAgRXhwZWN0TG9jYXRpb24oJnRyZWUsIGQsICJyZXBlYXRlZF9pbnQzMiIsIDEsIDQsIDAsIDQsIDE4KTsKKworICBFeHBlY3RMb2NhdGlvbigmdHJlZSwgZCwgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiwgLTEsIDUsIDAsIDcsIDEpOworICBFeHBlY3RMb2NhdGlvbigmdHJlZSwgZCwgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiwgMCwgOCwgMCwgMTAsIDEpOworICBFeHBlY3RMb2NhdGlvbigmdHJlZSwgZCwgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiwgMSwgMTEsIDAsIDEzLCAxKTsKKworICAvLyBDaGVjayBmb3IgZmllbGRzIG5vdCBzZXQuIEZvciBhbiBpbnZhbGlkIGZpZWxkLCB0aGUgc3RhcnQgYW5kIGVuZCBsb2NhdGlvbnMKKyAgLy8gcmV0dXJuZWQgc2hvdWxkIGJlIC0xLCAtMS4KKyAgRXhwZWN0TG9jYXRpb24oJnRyZWUsIGQsICJyZXBlYXRlZF9pbnQ2NCIsIDAsIC0xLCAtMSwgLTEsIC0xKTsKKyAgRXhwZWN0TG9jYXRpb24oJnRyZWUsIGQsICJyZXBlYXRlZF9pbnQzMiIsIDYsIC0xLCAtMSwgLTEsIC0xKTsKKyAgRXhwZWN0TG9jYXRpb24oJnRyZWUsIGQsICJzb21lX3Vua25vd25fZmllbGQiLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworCisgIC8vIFZlcmlmeSBpbnNpZGUgdGhlIG5lc3RlZCBtZXNzYWdlLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG5lc3RlZF9maWVsZCA9CisgICAgICBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIik7CisKKyAgVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSogbmVzdGVkX3RyZWUgPQorICAgICAgdHJlZS5HZXRUcmVlRm9yTmVzdGVkKG5lc3RlZF9maWVsZCwgLTEpOworICBFeHBlY3RMb2NhdGlvbihuZXN0ZWRfdHJlZSwgbmVzdGVkX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgImJiIiwgLTEsIDYsIDIsIDYsCisgICAgICAgICAgICAgICAgIDgpOworCisgIC8vIFZlcmlmeSBpbnNpZGUgYW5vdGhlciBuZXN0ZWQgbWVzc2FnZS4KKyAgbmVzdGVkX2ZpZWxkID0gZC0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpOworICBuZXN0ZWRfdHJlZSA9IHRyZWUuR2V0VHJlZUZvck5lc3RlZChuZXN0ZWRfZmllbGQsIDApOworICBFeHBlY3RMb2NhdGlvbihuZXN0ZWRfdHJlZSwgbmVzdGVkX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgImJiIiwgLTEsIDksIDIsIDksCisgICAgICAgICAgICAgICAgIDgpOworCisgIG5lc3RlZF90cmVlID0gdHJlZS5HZXRUcmVlRm9yTmVzdGVkKG5lc3RlZF9maWVsZCwgMSk7CisgIEV4cGVjdExvY2F0aW9uKG5lc3RlZF90cmVlLCBuZXN0ZWRfZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCAiYmIiLCAtMSwgMTIsIDIsIDEyLAorICAgICAgICAgICAgICAgICA4KTsKKworICAvLyBWZXJpZnkgYSBudWxscHRyIHRyZWUgZm9yIGFuIHVua25vd24gbmVzdGVkIGZpZWxkLgorICBUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlKiB1bmtub3duX25lc3RlZF90cmVlID0KKyAgICAgIHRyZWUuR2V0VHJlZUZvck5lc3RlZChuZXN0ZWRfZmllbGQsIDIpOworCisgIEVYUEVDVF9FUShudWxscHRyLCB1bmtub3duX25lc3RlZF90cmVlKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPiBtZXNzYWdlKG5ldyB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZCA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKworI2RlZmluZSBFWFBFQ1RfRklFTEQobmFtZSwgdmFsdWUsIHZhbHVlc3RyaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdmFsdWVzdHJpbmcsIGQtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfIiAjbmFtZSksIG1lc3NhZ2UuZ2V0KCkpKTsgXAorICBFWFBFQ1RfRVEodmFsdWUsIG1lc3NhZ2UtPm9wdGlvbmFsXyMjbmFtZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFWFBFQ1RfVFJVRShtZXNzYWdlLT5oYXNfb3B0aW9uYWxfIyNuYW1lKCkpOworCisjZGVmaW5lIEVYUEVDVF9CT09MX0ZJRUxEKG5hbWUsIHZhbHVlLCB2YWx1ZXN0cmluZykgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcoICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2YWx1ZXN0cmluZywgZC0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF8iICNuYW1lKSwgbWVzc2FnZS5nZXQoKSkpOyBcCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UtPm9wdGlvbmFsXyMjbmFtZSgpID09IHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UtPmhhc19vcHRpb25hbF8jI25hbWUoKSk7CisKKyNkZWZpbmUgRVhQRUNUX0ZMT0FUX0ZJRUxEKG5hbWUsIHZhbHVlLCB2YWx1ZXN0cmluZykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZyggICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHZhbHVlc3RyaW5nLCBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsXyIgI25hbWUpLCBtZXNzYWdlLmdldCgpKSk7IFwKKyAgRVhQRUNUX0ZMT0FUX0VRKHZhbHVlLCBtZXNzYWdlLT5vcHRpb25hbF8jI25hbWUoKSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS0+aGFzX29wdGlvbmFsXyMjbmFtZSgpKTsKKworI2RlZmluZSBFWFBFQ1RfRE9VQkxFX0ZJRUxEKG5hbWUsIHZhbHVlLCB2YWx1ZXN0cmluZykgICAgICAgICAgICAgICAgICAgICAgXAorICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdmFsdWVzdHJpbmcsIGQtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfIiAjbmFtZSksIG1lc3NhZ2UuZ2V0KCkpKTsgXAorICBFWFBFQ1RfRE9VQkxFX0VRKHZhbHVlLCBtZXNzYWdlLT5vcHRpb25hbF8jI25hbWUoKSk7ICAgICAgICAgICAgICAgICAgICAgXAorICBFWFBFQ1RfVFJVRShtZXNzYWdlLT5oYXNfb3B0aW9uYWxfIyNuYW1lKCkpOworCisjZGVmaW5lIEVYUEVDVF9JTlZBTElEKG5hbWUsIHZhbHVlc3RyaW5nKSAgICAgICAgICAgICBcCisgIEVYUEVDVF9GQUxTRShUZXh0Rm9ybWF0OjpQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKCBcCisgICAgICB2YWx1ZXN0cmluZywgZC0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF8iICNuYW1lKSwgbWVzc2FnZS5nZXQoKSkpOworCisgIC8vIGludDMyCisgIEVYUEVDVF9GSUVMRChpbnQzMiwgMSwgIjEiKTsKKyAgRVhQRUNUX0ZJRUxEKGludDMyLCAtMSwgIi0xIik7CisgIEVYUEVDVF9GSUVMRChpbnQzMiwgMHgxMjM0LCAiMHgxMjM0Iik7CisgIEVYUEVDVF9JTlZBTElEKGludDMyLCAiYSIpOworICBFWFBFQ1RfSU5WQUxJRChpbnQzMiwgIjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSIpOworICBFWFBFQ1RfSU5WQUxJRChpbnQzMiwgIjEsMiIpOworCisgIC8vIGludDY0CisgIEVYUEVDVF9GSUVMRChpbnQ2NCwgMSwgIjEiKTsKKyAgRVhQRUNUX0ZJRUxEKGludDY0LCAtMSwgIi0xIik7CisgIEVYUEVDVF9GSUVMRChpbnQ2NCwgMHgxMjM0NTY3ODEyMzQ1Njc4TEwsICIweDEyMzQ1Njc4MTIzNDU2NzgiKTsKKyAgRVhQRUNUX0lOVkFMSUQoaW50NjQsICJhIik7CisgIEVYUEVDVF9JTlZBTElEKGludDY0LCAiOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5Iik7CisgIEVYUEVDVF9JTlZBTElEKGludDY0LCAiMSwyIik7CisKKyAgLy8gdWludDY0CisgIEVYUEVDVF9GSUVMRCh1aW50NjQsIDEsICIxIik7CisgIEVYUEVDVF9GSUVMRCh1aW50NjQsIDB4ZjIzNDU2NzgxMjM0NTY3OFVMTCwgIjB4ZjIzNDU2NzgxMjM0NTY3OCIpOworICBFWFBFQ1RfSU5WQUxJRCh1aW50NjQsICItMSIpOworICBFWFBFQ1RfSU5WQUxJRCh1aW50NjQsICJhIik7CisgIEVYUEVDVF9JTlZBTElEKHVpbnQ2NCwgIjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSIpOworICBFWFBFQ1RfSU5WQUxJRCh1aW50NjQsICIxLDIiKTsKKworICAvLyBmaXhlZDMyCisgIEVYUEVDVF9GSUVMRChmaXhlZDMyLCAxLCAiMSIpOworICBFWFBFQ1RfRklFTEQoZml4ZWQzMiwgMHgxMjM0NTY3OCwgIjB4MTIzNDU2NzgiKTsKKyAgRVhQRUNUX0lOVkFMSUQoZml4ZWQzMiwgIi0xIik7CisgIEVYUEVDVF9JTlZBTElEKGZpeGVkMzIsICJhIik7CisgIEVYUEVDVF9JTlZBTElEKGZpeGVkMzIsICI5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkiKTsKKyAgRVhQRUNUX0lOVkFMSUQoZml4ZWQzMiwgIjEsMiIpOworCisgIC8vIGZpeGVkNjQKKyAgRVhQRUNUX0ZJRUxEKGZpeGVkNjQsIDEsICIxIik7CisgIEVYUEVDVF9GSUVMRChmaXhlZDY0LCAweDEyMzQ1Njc4MTIzNDU2NzhVTEwsICIweDEyMzQ1Njc4MTIzNDU2NzgiKTsKKyAgRVhQRUNUX0lOVkFMSUQoZml4ZWQ2NCwgIi0xIik7CisgIEVYUEVDVF9JTlZBTElEKGZpeGVkNjQsICJhIik7CisgIEVYUEVDVF9JTlZBTElEKGZpeGVkNjQsICI5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkiKTsKKyAgRVhQRUNUX0lOVkFMSUQoZml4ZWQ2NCwgIjEsMiIpOworCisgIC8vIGJvb2wKKyAgRVhQRUNUX0JPT0xfRklFTEQoYm9vbCwgdHJ1ZSwgInRydWUiKTsKKyAgRVhQRUNUX0JPT0xfRklFTEQoYm9vbCwgZmFsc2UsICJmYWxzZSIpOworICBFWFBFQ1RfQk9PTF9GSUVMRChib29sLCB0cnVlLCAiMSIpOworICBFWFBFQ1RfQk9PTF9GSUVMRChib29sLCB0cnVlLCAidCIpOworICBFWFBFQ1RfQk9PTF9GSUVMRChib29sLCBmYWxzZSwgIjAiKTsKKyAgRVhQRUNUX0JPT0xfRklFTEQoYm9vbCwgZmFsc2UsICJmIik7CisgIEVYUEVDVF9GSUVMRChib29sLCB0cnVlLCAiVHJ1ZSIpOworICBFWFBFQ1RfRklFTEQoYm9vbCwgZmFsc2UsICJGYWxzZSIpOworICBFWFBFQ1RfSU5WQUxJRChib29sLCAidFJ1ZSIpOworICBFWFBFQ1RfSU5WQUxJRChib29sLCAiZmFMc2UiKTsKKyAgRVhQRUNUX0lOVkFMSUQoYm9vbCwgIjIiKTsKKyAgRVhQRUNUX0lOVkFMSUQoYm9vbCwgIi0wIik7CisgIEVYUEVDVF9JTlZBTElEKGJvb2wsICJvbiIpOworICBFWFBFQ1RfSU5WQUxJRChib29sLCAiYSIpOworCisgIC8vIGZsb2F0CisgIEVYUEVDVF9GSUVMRChmbG9hdCwgMSwgIjEiKTsKKyAgRVhQRUNUX0ZMT0FUX0ZJRUxEKGZsb2F0LCAxLjUsICIxLjUiKTsKKyAgRVhQRUNUX0ZMT0FUX0ZJRUxEKGZsb2F0LCAxLjVlMywgIjEuNWUzIik7CisgIEVYUEVDVF9GTE9BVF9GSUVMRChmbG9hdCwgLTQuNTUsICItNC41NSIpOworICBFWFBFQ1RfSU5WQUxJRChmbG9hdCwgImEiKTsKKyAgRVhQRUNUX0lOVkFMSUQoZmxvYXQsICIxLDIiKTsKKworICAvLyBkb3VibGUKKyAgRVhQRUNUX0ZJRUxEKGRvdWJsZSwgMSwgIjEiKTsKKyAgRVhQRUNUX0ZJRUxEKGRvdWJsZSwgLTEsICItMSIpOworICBFWFBFQ1RfRE9VQkxFX0ZJRUxEKGRvdWJsZSwgMi4zLCAiMi4zIik7CisgIEVYUEVDVF9ET1VCTEVfRklFTEQoZG91YmxlLCAzZTUsICIzZTUiKTsKKyAgRVhQRUNUX0lOVkFMSUQoZG91YmxlLCAiYSIpOworICBFWFBFQ1RfSU5WQUxJRChkb3VibGUsICIxLDIiKTsKKyAgLy8gUmVqZWN0cyBoZXggYW5kIG9jdCBudW1iZXJzIGZvciBhIGRvdWJsZSBmaWVsZC4KKyAgRVhQRUNUX0lOVkFMSUQoZG91YmxlLCAiMHhmIik7CisgIEVYUEVDVF9JTlZBTElEKGRvdWJsZSwgIjAxMiIpOworCisgIC8vIHN0cmluZworICBFWFBFQ1RfRklFTEQoc3RyaW5nLCAiaGVsbG8iLCAiXCJoZWxsb1wiIik7CisgIEVYUEVDVF9GSUVMRChzdHJpbmcsICItMS44NyIsICInLTEuODcnIik7CisgIEVYUEVDVF9JTlZBTElEKHN0cmluZywgImhlbGxvIik7ICAvLyB3aXRob3V0IHF1b3RlIGZvciB2YWx1ZQorCisgIC8vIGVudW0KKyAgRVhQRUNUX0ZJRUxEKG5lc3RlZF9lbnVtLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsICJCQVIiKTsKKyAgRVhQRUNUX0ZJRUxEKG5lc3RlZF9lbnVtLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosCisgICAgICAgICAgICAgICBTdHJDYXQodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKSk7CisgIEVYUEVDVF9JTlZBTElEKG5lc3RlZF9lbnVtLCAiRk9PQkFSIik7CisKKyAgLy8gbWVzc2FnZQorICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKAorICAgICAgIjxiYjoxMj4iLCBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiksIG1lc3NhZ2UuZ2V0KCkpKTsKKyAgRVhQRUNUX0VRKDEyLCBtZXNzYWdlLT5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLT5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9JTlZBTElEKG5lc3RlZF9tZXNzYWdlLCAiYW55Iik7CisKKyN1bmRlZiBFWFBFQ1RfRklFTEQKKyN1bmRlZiBFWFBFQ1RfQk9PTF9GSUVMRAorI3VuZGVmIEVYUEVDVF9GTE9BVF9GSUVMRAorI3VuZGVmIEVYUEVDVF9ET1VCTEVfRklFTEQKKyN1bmRlZiBFWFBFQ1RfSU5WQUxJRAorfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIEludmFsaWRUb2tlbikgeworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9ib29sOiB0cnVlXG4tNVxuIiwgIkV4cGVjdGVkIGlkZW50aWZpZXIsIGdvdDogLSIsIDIsCisgICAgICAgICAgICAgICAgMSk7CisKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfYm9vbDogdHJ1ZSFcbiIsICJFeHBlY3RlZCBpZGVudGlmaWVyLCBnb3Q6ICEiLCAxLCAyMCk7CisgIEV4cGVjdEZhaWx1cmUoIlwic29tZSBzdHJpbmdcIiIsICJFeHBlY3RlZCBpZGVudGlmaWVyLCBnb3Q6IFwic29tZSBzdHJpbmdcIiIsCisgICAgICAgICAgICAgICAgMSwgMSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgSW52YWxpZEZpZWxkTmFtZSkgeworICBFeHBlY3RGYWlsdXJlKAorICAgICAgImludmFsaWRfZmllbGQ6IHNvbWV2YWx1ZVxuIiwKKyAgICAgICJNZXNzYWdlIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcIiBoYXMgbm8gZmllbGQgbmFtZWQgIgorICAgICAgIlwiaW52YWxpZF9maWVsZFwiLiIsCisgICAgICAxLCAxNCk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgSW52YWxpZENhcGl0YWxpemF0aW9uKSB7CisgIC8vIFdlIHJlcXVpcmUgdGhhdCBncm91cCBuYW1lcyBiZSBleGFjdGx5IGFzIHRoZXkgYXBwZWFyIGluIHRoZSAucHJvdG8uCisgIEV4cGVjdEZhaWx1cmUoCisgICAgICAib3B0aW9uYWxncm91cCB7XG5hOiAxNVxufVxuIiwKKyAgICAgICJNZXNzYWdlIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcIiBoYXMgbm8gZmllbGQgbmFtZWQgIgorICAgICAgIlwib3B0aW9uYWxncm91cFwiLiIsCisgICAgICAxLCAxNSk7CisgIEV4cGVjdEZhaWx1cmUoCisgICAgICAiT1BUSU9OQUxncm91cCB7XG5hOiAxNVxufVxuIiwKKyAgICAgICJNZXNzYWdlIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcIiBoYXMgbm8gZmllbGQgbmFtZWQgIgorICAgICAgIlwiT1BUSU9OQUxncm91cFwiLiIsCisgICAgICAxLCAxNSk7CisgIEV4cGVjdEZhaWx1cmUoCisgICAgICAiT3B0aW9uYWxfRG91YmxlOiAxMC4wXG4iLAorICAgICAgIk1lc3NhZ2UgdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1wiIGhhcyBubyBmaWVsZCBuYW1lZCAiCisgICAgICAiXCJPcHRpb25hbF9Eb3VibGVcIi4iLAorICAgICAgMSwgMTYpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIEFsbG93SWdub3JlQ2FwaXRhbGl6YXRpb25FcnJvcikgeworICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIHByb3RvOworCisgIC8vIFRoZXNlIGZpZWxkcyBoYXZlIGEgbWlzbWF0Y2hpbmcgY2FzZS4KKyAgRVhQRUNUX0ZBTFNFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoIk9wdGlvbmFsX0RvdWJsZTogMTAuMCIsICZwcm90bykpOworICBFWFBFQ1RfRkFMU0UocGFyc2VyLlBhcnNlRnJvbVN0cmluZygib1B0SW9OYUxnUm9VcCB7IGE6IDE1IH0iLCAmcHJvdG8pKTsKKworICAvLyAuLi4gYnV0IGFyZSBwYXJzZWQgY29ycmVjdGx5IGlmIHdlIG1hdGNoIGNhc2UgaW5zZW5zaXRpdmUuCisgIHBhcnNlci5BbGxvd0Nhc2VJbnNlbnNpdGl2ZUZpZWxkKHRydWUpOworICBFWFBFQ1RfVFJVRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJPcHRpb25hbF9Eb3VibGU6IDEwLjAiLCAmcHJvdG8pKTsKKyAgRVhQRUNUX0VRKDEwLjAsIHByb3RvLm9wdGlvbmFsX2RvdWJsZSgpKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLlBhcnNlRnJvbVN0cmluZygib1B0SW9OYUxnUm9VcCB7IGE6IDE1IH0iLCAmcHJvdG8pKTsKKyAgRVhQRUNUX0VRKDE1LCBwcm90by5vcHRpb25hbGdyb3VwKCkuYSgpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBJbnZhbGlkRmllbGRWYWx1ZXMpIHsKKyAgLy8gSW52YWxpZCB2YWx1ZXMgZm9yIGEgZG91YmxlL2Zsb2F0IGZpZWxkLgorICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9kb3VibGU6IFwiaGVsbG9cIlxuIiwKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZG91YmxlLCBnb3Q6IFwiaGVsbG9cIiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfZG91YmxlOiB0cnVlXG4iLCAiRXhwZWN0ZWQgZG91YmxlLCBnb3Q6IHRydWUiLCAxLCAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2RvdWJsZTogIVxuIiwgIkV4cGVjdGVkIGRvdWJsZSwgZ290OiAhIiwgMSwgMTgpOworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9kb3VibGUge1xuICBcbn1cbiIsICJFeHBlY3RlZCBcIjpcIiwgZm91bmQgXCJ7XCIuIiwgMSwKKyAgICAgICAgICAgICAgICAxNyk7CisKKyAgLy8gSW52YWxpZCB2YWx1ZXMgZm9yIGEgc2lnbmVkIGludGVnZXIgZmllbGQuCisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2ludDMyOiBcImhlbGxvXCJcbiIsCisgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGludGVnZXIsIGdvdDogXCJoZWxsb1wiIiwgMSwgMTcpOworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9pbnQzMjogdHJ1ZVxuIiwgIkV4cGVjdGVkIGludGVnZXIsIGdvdDogdHJ1ZSIsIDEsIDE3KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzI6IDQuNVxuIiwgIkV4cGVjdGVkIGludGVnZXIsIGdvdDogNC41IiwgMSwgMTcpOworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9pbnQzMjogIVxuIiwgIkV4cGVjdGVkIGludGVnZXIsIGdvdDogISIsIDEsIDE3KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzIge1xuIFxufVxuIiwgIkV4cGVjdGVkIFwiOlwiLCBmb3VuZCBcIntcIi4iLCAxLAorICAgICAgICAgICAgICAgIDE2KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzI6IDB4ODAwMDAwMDBcbiIsCisgICAgICAgICAgICAgICAgIkludGVnZXIgb3V0IG9mIHJhbmdlICgweDgwMDAwMDAwKSIsIDEsIDE3KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50NjQ6IDB4ODAwMDAwMDAwMDAwMDAwMFxuIiwKKyAgICAgICAgICAgICAgICAiSW50ZWdlciBvdXQgb2YgcmFuZ2UgKDB4ODAwMDAwMDAwMDAwMDAwMCkiLCAxLCAxNyk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2ludDMyOiAtMHg4MDAwMDAwMVxuIiwKKyAgICAgICAgICAgICAgICAiSW50ZWdlciBvdXQgb2YgcmFuZ2UgKDB4ODAwMDAwMDEpIiwgMSwgMTgpOworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9pbnQ2NDogLTB4ODAwMDAwMDAwMDAwMDAwMVxuIiwKKyAgICAgICAgICAgICAgICAiSW50ZWdlciBvdXQgb2YgcmFuZ2UgKDB4ODAwMDAwMDAwMDAwMDAwMSkiLCAxLCAxOCk7CisKKyAgLy8gSW52YWxpZCB2YWx1ZXMgZm9yIGFuIHVuc2lnbmVkIGludGVnZXIgZmllbGQuCisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQ2NDogXCJoZWxsb1wiXG4iLAorICAgICAgICAgICAgICAgICJFeHBlY3RlZCBpbnRlZ2VyLCBnb3Q6IFwiaGVsbG9cIiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfdWludDY0OiB0cnVlXG4iLCAiRXhwZWN0ZWQgaW50ZWdlciwgZ290OiB0cnVlIiwgMSwKKyAgICAgICAgICAgICAgICAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQ2NDogNC41XG4iLCAiRXhwZWN0ZWQgaW50ZWdlciwgZ290OiA0LjUiLCAxLCAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQ2NDogLTVcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLCBnb3Q6IC0iLCAxLCAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQ2NDogIVxuIiwgIkV4cGVjdGVkIGludGVnZXIsIGdvdDogISIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfdWludDY0IHtcbiBcbn1cbiIsICJFeHBlY3RlZCBcIjpcIiwgZm91bmQgXCJ7XCIuIiwgMSwKKyAgICAgICAgICAgICAgICAxNyk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQzMjogMHgxMDAwMDAwMDBcbiIsCisgICAgICAgICAgICAgICAgIkludGVnZXIgb3V0IG9mIHJhbmdlICgweDEwMDAwMDAwMCkiLCAxLCAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQ2NDogMHgxMDAwMDAwMDAwMDAwMDAwMFxuIiwKKyAgICAgICAgICAgICAgICAiSW50ZWdlciBvdXQgb2YgcmFuZ2UgKDB4MTAwMDAwMDAwMDAwMDAwMDApIiwgMSwgMTgpOworCisgIC8vIEludmFsaWQgdmFsdWVzIGZvciBhIGJvb2xlYW4gZmllbGQuCisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2Jvb2w6IFwiaGVsbG9cIlxuIiwKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaWRlbnRpZmllciwgZ290OiBcImhlbGxvXCIiLCAxLCAxNik7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2Jvb2w6IDVcbiIsICJJbnRlZ2VyIG91dCBvZiByYW5nZSAoNSkiLCAxLCAxNik7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2Jvb2w6IC03LjVcbiIsICJFeHBlY3RlZCBpZGVudGlmaWVyLCBnb3Q6IC0iLCAxLCAxNik7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2Jvb2w6ICFcbiIsICJFeHBlY3RlZCBpZGVudGlmaWVyLCBnb3Q6ICEiLCAxLCAxNik7CisKKyAgRXhwZWN0RmFpbHVyZSgKKyAgICAgICJvcHRpb25hbF9ib29sOiBtZWhcbiIsCisgICAgICAiSW52YWxpZCB2YWx1ZSBmb3IgYm9vbGVhbiBmaWVsZCBcIm9wdGlvbmFsX2Jvb2xcIi4gVmFsdWU6IFwibWVoXCIuIiwgMiwKKyAgICAgIDEpOworCisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2Jvb2wge1xuIFxufVxuIiwgIkV4cGVjdGVkIFwiOlwiLCBmb3VuZCBcIntcIi4iLCAxLAorICAgICAgICAgICAgICAgIDE1KTsKKworICAvLyBJbnZhbGlkIHZhbHVlcyBmb3IgYSBzdHJpbmcgZmllbGQuCisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3N0cmluZzogdHJ1ZVxuIiwgIkV4cGVjdGVkIHN0cmluZywgZ290OiB0cnVlIiwgMSwgMTgpOworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9zdHJpbmc6IDVcbiIsICJFeHBlY3RlZCBzdHJpbmcsIGdvdDogNSIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfc3RyaW5nOiAtNy41XG4iLCAiRXhwZWN0ZWQgc3RyaW5nLCBnb3Q6IC0iLCAxLCAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3N0cmluZzogIVxuIiwgIkV4cGVjdGVkIHN0cmluZywgZ290OiAhIiwgMSwgMTgpOworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9zdHJpbmcge1xuIFxufVxuIiwgIkV4cGVjdGVkIFwiOlwiLCBmb3VuZCBcIntcIi4iLCAxLAorICAgICAgICAgICAgICAgIDE3KTsKKworICAvLyBJbnZhbGlkIHZhbHVlcyBmb3IgYW4gZW51bWVyYXRpb24gZmllbGQuCisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX25lc3RlZF9lbnVtOiBcImhlbGxvXCJcbiIsCisgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGludGVnZXIgb3IgaWRlbnRpZmllciwgZ290OiBcImhlbGxvXCIiLCAxLCAyMyk7CisKKyAgLy8gVmFsaWQgdG9rZW4sIGJ1dCBlbnVtIHZhbHVlIGlzIG5vdCBkZWZpbmVkLgorICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9uZXN0ZWRfZW51bTogNVxuIiwKKyAgICAgICAgICAgICAgICAiVW5rbm93biBlbnVtZXJhdGlvbiB2YWx1ZSBvZiBcIjVcIiBmb3IgZmllbGQgIgorICAgICAgICAgICAgICAgICJcIm9wdGlvbmFsX25lc3RlZF9lbnVtXCIuIiwKKyAgICAgICAgICAgICAgICAyLCAxKTsKKyAgLy8gV2UgY29uc3VtZSB0aGUgbmVnYXRpdmUgc2lnbiwgc28gdGhlIGVycm9yIHBvc2l0aW9uIHN0YXJ0cyBvbmUgY2hhcmFjdGVyCisgIC8vIGxhdGVyLgorICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9uZXN0ZWRfZW51bTogLTcuNVxuIiwgIkV4cGVjdGVkIGludGVnZXIsIGdvdDogNy41IiwgMSwKKyAgICAgICAgICAgICAgICAyNCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX25lc3RlZF9lbnVtOiAhXG4iLAorICAgICAgICAgICAgICAgICJFeHBlY3RlZCBpbnRlZ2VyIG9yIGlkZW50aWZpZXIsIGdvdDogISIsIDEsIDIzKTsKKworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9uZXN0ZWRfZW51bTogZ3JhaFxuIiwKKyAgICAgICAgICAgICAgICAiVW5rbm93biBlbnVtZXJhdGlvbiB2YWx1ZSBvZiBcImdyYWhcIiBmb3IgZmllbGQgIgorICAgICAgICAgICAgICAgICJcIm9wdGlvbmFsX25lc3RlZF9lbnVtXCIuIiwKKyAgICAgICAgICAgICAgICAyLCAxKTsKKworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9uZXN0ZWRfZW51bSB7XG4gXG59XG4iLAorICAgICAgICAgICAgICAgICJFeHBlY3RlZCBcIjpcIiwgZm91bmQgXCJ7XCIuIiwgMSwgMjIpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIE1lc3NhZ2VEZWxpbWl0ZXJzKSB7CisgIC8vIE5vbi1tYXRjaGluZyBkZWxpbWl0ZXJzLgorICBFeHBlY3RGYWlsdXJlKCJPcHRpb25hbEdyb3VwIDxcbiBcbn1cbiIsICJFeHBlY3RlZCBcIj5cIiwgZm91bmQgXCJ9XCIuIiwgMywKKyAgICAgICAgICAgICAgICAxKTsKKworICAvLyBJbnZhbGlkIGRlbGltaXRlcnMuCisgIEV4cGVjdEZhaWx1cmUoIk9wdGlvbmFsR3JvdXAgW1xuIFxuXVxuIiwgIkV4cGVjdGVkIFwie1wiLCBmb3VuZCBcIltcIi4iLCAxLAorICAgICAgICAgICAgICAgIDE1KTsKKworICAvLyBVbmVuZGluZyBtZXNzYWdlLgorICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7XG4gXG5iYjogMTE4XG4iLAorICAgICAgICAgICAgICAgICJFeHBlY3RlZCBpZGVudGlmaWVyLCBnb3Q6ICIsIDQsIDEpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFVua25vd25FeHRlbnNpb24pIHsKKyAgLy8gTm9uLW1hdGNoaW5nIGRlbGltaXRlcnMuCisgIEV4cGVjdEZhaWx1cmUoIltibGFoYmxhaF06IDEyMyIsCisgICAgICAgICAgICAgICAgIkV4dGVuc2lvbiBcImJsYWhibGFoXCIgaXMgbm90IGRlZmluZWQgb3IgaXMgbm90IGFuICIKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIG9mIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXCIuIiwKKyAgICAgICAgICAgICAgICAxLCAxMSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgTWlzc2luZ1JlcXVpcmVkKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgRXhwZWN0RmFpbHVyZSgiYTogMSIsICJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiBiLCBjIiwgMCwgMSwKKyAgICAgICAgICAgICAgICAmbWVzc2FnZSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgUGFyc2VEdXBsaWNhdGVSZXF1aXJlZCkgeworICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7CisgIEV4cGVjdEZhaWx1cmUoImE6IDEgYjogMiBjOiAzIGE6IDEiLAorICAgICAgICAgICAgICAgICJOb24tcmVwZWF0ZWQgZmllbGQgXCJhXCIgaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLiIsIDEsIDE3LAorICAgICAgICAgICAgICAgICZtZXNzYWdlKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBQYXJzZUR1cGxpY2F0ZU9wdGlvbmFsKSB7CisgIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSBtZXNzYWdlOworICBFeHBlY3RGYWlsdXJlKCJjOiAxIGM6IDIiLAorICAgICAgICAgICAgICAgICJOb24tcmVwZWF0ZWQgZmllbGQgXCJjXCIgaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLiIsIDEsIDcsCisgICAgICAgICAgICAgICAgJm1lc3NhZ2UpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIE1lcmdlRHVwbGljYXRlUmVxdWlyZWQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOworICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOworICBFWFBFQ1RfVFJVRShwYXJzZXIuTWVyZ2VGcm9tU3RyaW5nKCJhOiAxIGI6IDIgYzogMyBhOiA0IiwgJm1lc3NhZ2UpKTsKKyAgRVhQRUNUX0VRKDQsIG1lc3NhZ2UuYSgpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBNZXJnZUR1cGxpY2F0ZU9wdGlvbmFsKSB7CisgIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSBtZXNzYWdlOworICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOworICBFWFBFQ1RfVFJVRShwYXJzZXIuTWVyZ2VGcm9tU3RyaW5nKCJjOiAxIGM6IDIiLCAmbWVzc2FnZSkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5jKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIEV4cGxpY2l0RGVsaW1pdGVycykgeworICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7CisgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygiYToxLGI6MjtjOjMiLCAmbWVzc2FnZSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5hKCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5iKCkpOworICBFWFBFQ1RfRVEoMywgbWVzc2FnZS5jKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFByaW50RXJyb3JzVG9TdGRlcnIpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVycm9yczsKKworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKKyAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIHByb3RvOworICAgIEVYUEVDVF9GQUxTRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoIm5vX3N1Y2hfZmllbGQ6IDEiLCAmcHJvdG8pKTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisKKyAgQVNTRVJUX0VRKDEsIGVycm9ycy5zaXplKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAiRXJyb3IgcGFyc2luZyB0ZXh0LWZvcm1hdCBwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXM6ICIKKyAgICAgICIxOjE0OiBNZXNzYWdlIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcIiBoYXMgbm8gZmllbGQgIgorICAgICAgIm5hbWVkIFwibm9fc3VjaF9maWVsZFwiLiIsCisgICAgICBlcnJvcnNbMF0pOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIEZhaWxzT25Ub2tlbml6YXRpb25FcnJvcikgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXJyb3JzOworCisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgcHJvdG87CisgICAgRVhQRUNUX0ZBTFNFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygiXDAyMCIsICZwcm90bykpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKworICBBU1NFUlRfRVEoMSwgZXJyb3JzLnNpemUoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJFcnJvciBwYXJzaW5nIHRleHQtZm9ybWF0IHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlczogIgorICAgICAgIjE6MTogSW52YWxpZCBjb250cm9sIGNoYXJhY3RlcnMgZW5jb3VudGVyZWQgaW4gdGV4dC4iLAorICAgICAgZXJyb3JzWzBdKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBQYXJzZURlcHJlY2F0ZWRGaWVsZCkgeworICB1bml0dGVzdDo6VGVzdERlcHJlY2F0ZWRGaWVsZHMgbWVzc2FnZTsKKyAgRXhwZWN0TWVzc2FnZSgiZGVwcmVjYXRlZF9pbnQzMjogNDIiLAorICAgICAgICAgICAgICAgICJXQVJOSU5HOnRleHQgZm9ybWF0IGNvbnRhaW5zIGRlcHJlY2F0ZWQgZmllbGQgIgorICAgICAgICAgICAgICAgICJcImRlcHJlY2F0ZWRfaW50MzJcIiIsCisgICAgICAgICAgICAgICAgMSwgMjEsICZtZXNzYWdlLCB0cnVlKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBTZXRSZWN1cnNpb25MaW1pdCkgeworICBjb25zdCBjaGFyKiBmb3JtYXQgPSAiY2hpbGQ6IHsgJDAgfSI7CisgIHN0ZDo6c3RyaW5nIGlucHV0OworICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSBpbnB1dCA9IHN0cmluZ3M6OlN1YnN0aXR1dGUoZm9ybWF0LCBpbnB1dCk7CisKKyAgdW5pdHRlc3Q6Ok5lc3RlZFRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBFeHBlY3RTdWNjZXNzQW5kVHJlZShpbnB1dCwgJm1lc3NhZ2UsIG51bGxwdHIpOworCisgIGlucHV0ID0gc3RyaW5nczo6U3Vic3RpdHV0ZShmb3JtYXQsIGlucHV0KTsKKyAgcGFyc2VyXy5TZXRSZWN1cnNpb25MaW1pdCgxMDApOworICBFeHBlY3RNZXNzYWdlKGlucHV0LAorICAgICAgICAgICAgICAgICJNZXNzYWdlIGlzIHRvbyBkZWVwLCB0aGUgcGFyc2VyIGV4Y2VlZGVkIHRoZSBjb25maWd1cmVkICIKKyAgICAgICAgICAgICAgICAicmVjdXJzaW9uIGxpbWl0IG9mIDEwMC4iLAorICAgICAgICAgICAgICAgIDEsIDkwOCwgJm1lc3NhZ2UsIGZhbHNlKTsKKworICBwYXJzZXJfLlNldFJlY3Vyc2lvbkxpbWl0KDEwMSk7CisgIEV4cGVjdFN1Y2Nlc3NBbmRUcmVlKGlucHV0LCAmbWVzc2FnZSwgbnVsbHB0cik7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgU2V0UmVjdXJzaW9uTGltaXRVbmtub3duRmllbGRWYWx1ZSkgeworICBjb25zdCBjaGFyKiBmb3JtYXQgPSAiWyQwXSI7CisgIHN0ZDo6c3RyaW5nIGlucHV0ID0gIlwidGVzdF92YWx1ZVwiIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA5OTsgKytpKSBpbnB1dCA9IHN0cmluZ3M6OlN1YnN0aXR1dGUoZm9ybWF0LCBpbnB1dCk7CisgIHN0ZDo6c3RyaW5nIG5vdF9kZWVwX2lucHV0ID0gU3RyQ2F0KCJ1bmtub3duX25lc3RlZF9hcnJheTogIiwgaW5wdXQpOworCisgIHBhcnNlcl8uQWxsb3dVbmtub3duRmllbGQodHJ1ZSk7CisgIHBhcnNlcl8uU2V0UmVjdXJzaW9uTGltaXQoMTAwKTsKKworICB1bml0dGVzdDo6TmVzdGVkVGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIEV4cGVjdFN1Y2Nlc3NBbmRUcmVlKG5vdF9kZWVwX2lucHV0LCAmbWVzc2FnZSwgbnVsbHB0cik7CisKKyAgaW5wdXQgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKGZvcm1hdCwgaW5wdXQpOworICBzdGQ6OnN0cmluZyBkZWVwX2lucHV0ID0gU3RyQ2F0KCJ1bmtub3duX25lc3RlZF9hcnJheTogIiwgaW5wdXQpOworICBFeHBlY3RNZXNzYWdlKAorICAgICAgZGVlcF9pbnB1dCwKKyAgICAgICJXQVJOSU5HOk1lc3NhZ2UgdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0Lk5lc3RlZFRlc3RBbGxUeXBlc1wiIGhhcyBubyAiCisgICAgICAiZmllbGQgbmFtZWQgXCJ1bmtub3duX25lc3RlZF9hcnJheVwiLlxuMToxMjM6IE1lc3NhZ2UgaXMgdG9vIGRlZXAsIHRoZSAiCisgICAgICAicGFyc2VyIGV4Y2VlZGVkIHRoZSBjb25maWd1cmVkIHJlY3Vyc2lvbiBsaW1pdCBvZiAxMDAuIiwKKyAgICAgIDEsIDIxLCAmbWVzc2FnZSwgZmFsc2UpOworCisgIHBhcnNlcl8uU2V0UmVjdXJzaW9uTGltaXQoMTAxKTsKKyAgRXhwZWN0U3VjY2Vzc0FuZFRyZWUoZGVlcF9pbnB1dCwgJm1lc3NhZ2UsIG51bGxwdHIpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFNldFJlY3Vyc2lvbkxpbWl0VW5rbm93bkZpZWxkTWVzc2FnZSkgeworICBjb25zdCBjaGFyKiBmb3JtYXQgPSAidW5rbm93bl9jaGlsZDogeyAkMCB9IjsKKyAgc3RkOjpzdHJpbmcgaW5wdXQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIGlucHV0ID0gc3RyaW5nczo6U3Vic3RpdHV0ZShmb3JtYXQsIGlucHV0KTsKKworICBwYXJzZXJfLkFsbG93VW5rbm93bkZpZWxkKHRydWUpOworICBwYXJzZXJfLlNldFJlY3Vyc2lvbkxpbWl0KDEwMCk7CisKKyAgdW5pdHRlc3Q6Ok5lc3RlZFRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBFeHBlY3RTdWNjZXNzQW5kVHJlZShpbnB1dCwgJm1lc3NhZ2UsIG51bGxwdHIpOworCisgIGlucHV0ID0gc3RyaW5nczo6U3Vic3RpdHV0ZShmb3JtYXQsIGlucHV0KTsKKyAgRXhwZWN0TWVzc2FnZSgKKyAgICAgIGlucHV0LAorICAgICAgIldBUk5JTkc6TWVzc2FnZSB0eXBlIFwicHJvdG9idWZfdW5pdHRlc3QuTmVzdGVkVGVzdEFsbFR5cGVzXCIgaGFzIG5vICIKKyAgICAgICJmaWVsZCBuYW1lZCBcInVua25vd25fY2hpbGRcIi5cbjE6MTcxNjogTWVzc2FnZSBpcyB0b28gZGVlcCwgdGhlIHBhcnNlciAiCisgICAgICAiZXhjZWVkZWQgdGhlIGNvbmZpZ3VyZWQgcmVjdXJzaW9uIGxpbWl0IG9mIDEwMC4iLAorICAgICAgMSwgMTQsICZtZXNzYWdlLCBmYWxzZSk7CisKKyAgcGFyc2VyXy5TZXRSZWN1cnNpb25MaW1pdCgxMDEpOworICBFeHBlY3RTdWNjZXNzQW5kVHJlZShpbnB1dCwgJm1lc3NhZ2UsIG51bGxwdHIpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFBhcnNlQW55RmllbGRXaXRoQWRkaXRpb25hbFdoaXRlU3BhY2VzKSB7CisgIEFueSBhbnk7CisgIHN0ZDo6c3RyaW5nIHBhcnNlX3N0cmluZyA9CisgICAgICAiW3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXSBcdCA6ICBcdCB7XG4iCisgICAgICAiICBvcHRpb25hbF9pbnQzMjogMzIxXG4iCisgICAgICAiICBvcHRpb25hbF9zdHJpbmc6IFwidGVzdHN0cjBcIlxuIgorICAgICAgIn1cbiI7CisKKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKHBhcnNlX3N0cmluZywgJmFueSkpOworCisgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgcHJpbnRlci5TZXRFeHBhbmRBbnkodHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIHRleHQ7CisgIEFTU0VSVF9UUlVFKHByaW50ZXIuUHJpbnRUb1N0cmluZyhhbnksICZ0ZXh0KSk7CisgIEVYUEVDVF9FUSh0ZXh0LAorICAgICAgICAgICAgIlt0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc10ge1xuIgorICAgICAgICAgICAgIiAgb3B0aW9uYWxfaW50MzI6IDMyMVxuIgorICAgICAgICAgICAgIiAgb3B0aW9uYWxfc3RyaW5nOiBcInRlc3RzdHIwXCJcbiIKKyAgICAgICAgICAgICJ9XG4iKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBQYXJzZUV4dGVuc2lvbkZpZWxkV2l0aEFkZGl0aW9uYWxXaGl0ZVNwYWNlcykgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgcHJvdG87CisgIHN0ZDo6c3RyaW5nIHBhcnNlX3N0cmluZyA9CisgICAgICAiW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0gICA6IFx0IDEwMVxuIgorICAgICAgIltwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQ2NF9leHRlbnNpb25dIFx0IDogMTAyXG4iOworCisgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhwYXJzZV9zdHJpbmcsICZwcm90bykpOworCisgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgc3RkOjpzdHJpbmcgdGV4dDsKKyAgQVNTRVJUX1RSVUUocHJpbnRlci5QcmludFRvU3RyaW5nKHByb3RvLCAmdGV4dCkpOworICBFWFBFQ1RfRVEodGV4dCwKKyAgICAgICAgICAgICJbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXTogMTAxXG4iCisgICAgICAgICAgICAiW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbl06IDEwMlxuIik7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgUGFyc2VOb3JtYWxGaWVsZFdpdGhBZGRpdGlvbmFsV2hpdGVTcGFjZXMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBwcm90bzsKKyAgc3RkOjpzdHJpbmcgcGFyc2Vfc3RyaW5nID0KKyAgICAgICJyZXBlYXRlZF9pbnQzMiAgOiBcdCAxXG4iCisgICAgICAicmVwZWF0ZWRfaW50MzI6IDJcbiIKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZToge1xuIgorICAgICAgIiAgYmI6IDNcbiIKKyAgICAgICJ9XG4iCisgICAgICAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgIDogXHQge1xuIgorICAgICAgIiAgYmI6IDRcbiIKKyAgICAgICJ9XG4iCisgICAgICAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgICAgIHtcbiIKKyAgICAgICIgIGJiOiA1XG4iCisgICAgICAifVxuIjsKKworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcocGFyc2Vfc3RyaW5nLCAmcHJvdG8pKTsKKworICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIHN0ZDo6c3RyaW5nIHRleHQ7CisgIEFTU0VSVF9UUlVFKHByaW50ZXIuUHJpbnRUb1N0cmluZyhwcm90bywgJnRleHQpKTsKKyAgRVhQRUNUX0VRKHRleHQsCisgICAgICAgICAgICAicmVwZWF0ZWRfaW50MzI6IDFcbiIKKyAgICAgICAgICAgICJyZXBlYXRlZF9pbnQzMjogMlxuIgorICAgICAgICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHtcbiIKKyAgICAgICAgICAgICIgIGJiOiAzXG4iCisgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHtcbiIKKyAgICAgICAgICAgICIgIGJiOiA0XG4iCisgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHtcbiIKKyAgICAgICAgICAgICIgIGJiOiA1XG4iCisgICAgICAgICAgICAifVxuIik7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgUGFyc2VTa2lwcGVkRmllbGRXaXRoQWRkaXRpb25hbFdoaXRlU3BhY2VzKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgcHJvdG87CisgIFRleHRGb3JtYXQ6OlBhcnNlciBwYXJzZXI7CisgIHBhcnNlci5BbGxvd1Vua25vd25GaWVsZCh0cnVlKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJvcHRpb25hbF9pbnQzMjogMzIxXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duX2ZpZWxkMSAgIDogXHQgMTIzNDVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltzb21ld2hlcmUudW5rbm93bl9leHRlbnNpb24xXSAgIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdW5rbm93bl9maWVsZDIgXHQgOiAgIDEyMzQ1XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbc29tZXdoZXJlLnVua25vd25fZXh0ZW5zaW9uMl0gICAgOiBcdCB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHVua25vd25fZmllbGQzICAgICBcdCA6ICAgMTIzNDVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgW3NvbWV3aGVyZS51bmtub3duX2V4dGVuc2lvbjNdICAgIFx0IDogICB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdW5rbm93bl9maWVsZDQ6ICAgMTBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBbc29tZXdoZXJlLnVua25vd25fZXh0ZW5zaW9uNF0gXHQge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvdG8pKTsKKyAgc3RkOjpzdHJpbmcgdGV4dDsKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBBU1NFUlRfVFJVRShwcmludGVyLlByaW50VG9TdHJpbmcocHJvdG8sICZ0ZXh0KSk7CisgIEVYUEVDVF9FUSh0ZXh0LCAib3B0aW9uYWxfaW50MzI6IDMyMVxuIik7Cit9CisKK2NsYXNzIFRleHRGb3JtYXRNZXNzYWdlU2V0VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyBjb25zdCBjaGFyIHByb3RvX3RleHRfZm9ybWF0X1tdOworfTsKK2NvbnN0IGNoYXIgVGV4dEZvcm1hdE1lc3NhZ2VTZXRUZXN0Ojpwcm90b190ZXh0X2Zvcm1hdF9bXSA9CisgICAgIm1lc3NhZ2Vfc2V0IHtcbiIKKyAgICAiICBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xXSB7XG4iCisgICAgIiAgICBpOiAyM1xuIgorICAgICIgIH1cbiIKKyAgICAiICBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yXSB7XG4iCisgICAgIiAgICBzdHI6IFwiZm9vXCJcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiI7CisKK1RFU1RfRihUZXh0Rm9ybWF0TWVzc2FnZVNldFRlc3QsIFNlcmlhbGl6ZSkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRDb250YWluZXIgcHJvdG87CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEqIGl0ZW1fYSA9CisgICAgICBwcm90by5tdXRhYmxlX21lc3NhZ2Vfc2V0KCktPk11dGFibGVFeHRlbnNpb24oCisgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKTsKKyAgaXRlbV9hLT5zZXRfaSgyMyk7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIqIGl0ZW1fYiA9CisgICAgICBwcm90by5tdXRhYmxlX21lc3NhZ2Vfc2V0KCktPk11dGFibGVFeHRlbnNpb24oCisgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKTsKKyAgaXRlbV9iLT5zZXRfc3RyKCJmb28iKTsKKyAgc3RkOjpzdHJpbmcgYWN0dWFsX3Byb3RvX3RleHRfZm9ybWF0OworICBUZXh0Rm9ybWF0OjpQcmludFRvU3RyaW5nKHByb3RvLCAmYWN0dWFsX3Byb3RvX3RleHRfZm9ybWF0KTsKKyAgRVhQRUNUX0VRKHByb3RvX3RleHRfZm9ybWF0XywgYWN0dWFsX3Byb3RvX3RleHRfZm9ybWF0KTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRNZXNzYWdlU2V0VGVzdCwgRGVzZXJpYWxpemUpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyIHByb3RvOworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcocHJvdG9fdGV4dF9mb3JtYXRfLCAmcHJvdG8pKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMjMsCisgICAgICBwcm90by5tZXNzYWdlX3NldCgpCisgICAgICAgICAgLkdldEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKQorICAgICAgICAgIC5pKCkpOworICBFWFBFQ1RfRVEoCisgICAgICAiZm9vIiwKKyAgICAgIHByb3RvLm1lc3NhZ2Vfc2V0KCkKKyAgICAgICAgICAuR2V0RXh0ZW5zaW9uKAorICAgICAgICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yOjptZXNzYWdlX3NldF9leHRlbnNpb24pCisgICAgICAgICAgLnN0cigpKTsKKworICAvLyBFbnN1cmUgdGhhdCB0aGVzZSBhcmUgdGhlIG9ubHkgZW50cmllcyBwcmVzZW50LgorICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBkZXNjcmlwdG9yczsKKyAgcHJvdG8ubWVzc2FnZV9zZXQoKS5HZXRSZWZsZWN0aW9uKCktPkxpc3RGaWVsZHMocHJvdG8ubWVzc2FnZV9zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3JzKTsKKyAgRVhQRUNUX0VRKDIsIGRlc2NyaXB0b3JzLnNpemUoKSk7Cit9CisKK1RFU1QoVGV4dEZvcm1hdFVua25vd25GaWVsZFRlc3QsIFRlc3RVbmtub3duRmllbGQpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBwcm90bzsKKyAgVGV4dEZvcm1hdDo6UGFyc2VyIHBhcnNlcjsKKyAgLy8gVW5rbm93biBmaWVsZCBpcyBub3QgcGVybWl0dGVkIGJ5IGRlZmF1bHQuCisgIEVYUEVDVF9GQUxTRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJ1bmtub3duX2ZpZWxkOiAxMjM0NSIsICZwcm90bykpOworICBFWFBFQ1RfRkFMU0UocGFyc2VyLlBhcnNlRnJvbVN0cmluZygiMTIzNDU2Nzg6IDEyMzQ1IiwgJnByb3RvKSk7CisKKyAgcGFyc2VyLkFsbG93VW5rbm93bkZpZWxkKHRydWUpOworICBFWFBFQ1RfVFJVRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJ1bmtub3duX2ZpZWxkOiAxMjM0NSIsICZwcm90bykpOworICBFWFBFQ1RfVFJVRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJ1bmtub3duX2ZpZWxkOiAtMTIzNDUiLCAmcHJvdG8pKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLlBhcnNlRnJvbVN0cmluZygidW5rbm93bl9maWVsZDogMS4yMzQ1IiwgJnByb3RvKSk7CisgIEVYUEVDVF9UUlVFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoInVua25vd25fZmllbGQ6IC0xLjIzNDUiLCAmcHJvdG8pKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLlBhcnNlRnJvbVN0cmluZygidW5rbm93bl9maWVsZDogMS4yMzQ1ZiIsICZwcm90bykpOworICBFWFBFQ1RfVFJVRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJ1bmtub3duX2ZpZWxkOiAtMS4yMzQ1ZiIsICZwcm90bykpOworICBFWFBFQ1RfVFJVRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJ1bmtub3duX2ZpZWxkOiBpbmYiLCAmcHJvdG8pKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLlBhcnNlRnJvbVN0cmluZygidW5rbm93bl9maWVsZDogLWluZiIsICZwcm90bykpOworICBFWFBFQ1RfVFJVRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJ1bmtub3duX2ZpZWxkOiBUWVBFX1NUUklORyIsICZwcm90bykpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIHBhcnNlci5QYXJzZUZyb21TdHJpbmcoInVua25vd25fZmllbGQ6IFwic3RyaW5nIHZhbHVlXCIiLCAmcHJvdG8pKTsKKyAgLy8gSW52YWxpZCBmaWVsZCB2YWx1ZQorICBFWFBFQ1RfRkFMU0UocGFyc2VyLlBhcnNlRnJvbVN0cmluZygidW5rbm93bl9maWVsZDogLVRZUEVfU1RSSU5HIiwgJnByb3RvKSk7CisgIC8vIFR3byBvciBtb3JlIHVua25vd24gZmllbGRzCisgIEVYUEVDVF9UUlVFKAorICAgICAgcGFyc2VyLlBhcnNlRnJvbVN0cmluZygidW5rbm93bl9maWVsZDE6IFRZUEVfU1RSSU5HXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duX2ZpZWxkMjogMTIzNDUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvdG8pKTsKKyAgLy8gVW5rbm93biBuZXN0ZWQgbWVzc2FnZQorICBFWFBFQ1RfVFJVRSgKKyAgICAgIHBhcnNlci5QYXJzZUZyb21TdHJpbmcoInVua25vd25fbWVzc2FnZTE6IHt9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duX21lc3NhZ2UyIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdW5rbm93bl9maWVsZDogMTIzNDVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd25fbWVzc2FnZTMgPFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB1bmtub3duX25lc3RlZF9tZXNzYWdlIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB1bmtub3duX2ZpZWxkOiAxMjM0NVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3RvKSk7CisgIC8vIFVubWF0Y2hlZCBkZWxpbWl0ZXJzIGZvciBtZXNzYWdlIGJvZHkKKyAgRVhQRUNUX0ZBTFNFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoInVua25vd25fbWVzc2FnZTogez4iLCAmcHJvdG8pKTsKKyAgLy8gVW5rbm93biBleHRlbnNpb24KKyAgRVhQRUNUX1RSVUUoCisgICAgICBwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJbc29tZXdoZXJlLnVua25vd25fZXh0ZW5zaW9uMV06IDEyMzQ1XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbc29tZXdoZXJlLnVua25vd25fZXh0ZW5zaW9uMl0ge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB1bmtub3duX2ZpZWxkOiAxMjM0NVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90bykpOworICAvLyBVbmtub3duIGZpZWxkcyBiZXR3ZWVuIGtub3duIGZpZWxkcworICBBU1NFUlRfVFJVRSgKKyAgICAgIHBhcnNlci5QYXJzZUZyb21TdHJpbmcoIm9wdGlvbmFsX2ludDMyOiAxXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duX2ZpZWxkOiAxMjM0NVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxfc3RyaW5nOiBcInN0cmluZ1wiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duX21lc3NhZ2UgeyB1bmtub3duOiAwIH1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHsgYmI6IDIgfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90bykpOworICBFWFBFQ1RfRVEoMSwgcHJvdG8ub3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSgic3RyaW5nIiwgcHJvdG8ub3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoMiwgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5iYigpKTsKKworICAvLyBVbmtub3duIGZpZWxkIHdpdGggbnVtZXJpYyB0YWcgbnVtYmVyIGluc3RlYWQgb2YgaWRlbnRpZmllci4KKyAgRVhQRUNUX1RSVUUocGFyc2VyLlBhcnNlRnJvbVN0cmluZygiMTIzNDU2Nzg6IDEyMzQ1IiwgJnByb3RvKSk7CisKKyAgLy8gTmVzdGVkIHVua25vd24gZXh0ZW5zaW9ucy4KKyAgRVhQRUNUX1RSVUUoCisgICAgICBwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJbdGVzdC5leHRlbnNpb24xXSA8XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHVua25vd25fbmVzdGVkX21lc3NhZ2UgPFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIFt0ZXN0LmV4dGVuc2lvbjJdIDxcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIHVua25vd25fZmllbGQ6IDEyMzQ1XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgPlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICA+XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3RvKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgcGFyc2VyLlBhcnNlRnJvbVN0cmluZygiW3Rlc3QuZXh0ZW5zaW9uMV0ge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB1bmtub3duX25lc3RlZF9tZXNzYWdlIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBbdGVzdC5leHRlbnNpb24yXSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICB1bmtub3duX2ZpZWxkOiAxMjM0NVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIH1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90bykpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIHBhcnNlci5QYXJzZUZyb21TdHJpbmcoIlt0ZXN0LmV4dGVuc2lvbjFdIDxcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgc29tZV91bmtub3duX2ZpZWxkczogPFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHVua25vd25fZmllbGQ6IDEyMzQ1XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgID5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvdG8pKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJbdGVzdC5leHRlbnNpb24xXSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHNvbWVfdW5rbm93bl9maWVsZHM6IHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB1bmtub3duX2ZpZWxkOiAxMjM0NVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3RvKSk7CisKKyAgLy8gVW5rbm93biBmaWVsZCB3aXRoIGNvbXBhY3QgcmVwZXRpdGlvbi4KKyAgRVhQRUNUX1RSVUUocGFyc2VyLlBhcnNlRnJvbVN0cmluZygidW5rbm93bl9maWVsZDogWzEsIDJdIiwgJnByb3RvKSk7CisgIC8vIFVua25vd24gZmllbGQgd2l0aCBjb21wYWN0IHJlcGV0aXRpb24gb2Ygc29tZSB1bmtub3duIGVudW0uCisgIEVYUEVDVF9UUlVFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoInVua25vd25fZmllbGQ6IFtWQUwxLCBWQUwyXSIsICZwcm90bykpOworICAvLyBVbmtub3duIGZpZWxkIHdpdGggY29tcGFjdCByZXBldGl0aW9uIHdpdGggc3ViLW1lc3NhZ2UuCisgIEVYUEVDVF9UUlVFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoInVua25vd25fZmllbGQ6IFt7YToxfSwgPGI6Mj5dIiwgJnByb3RvKSk7Cit9CisKK1RFU1QoVGV4dEZvcm1hdFVua25vd25GaWVsZFRlc3QsIFRlc3RBbnlJblVua25vd25GaWVsZCkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIHByb3RvOworICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOworICBwYXJzZXIuQWxsb3dVbmtub3duRmllbGQodHJ1ZSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgcGFyc2VyLlBhcnNlRnJvbVN0cmluZygidW5rbm93biB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFt0eXBlLmdvb2dsZWFwaXMuY29tL2Zvby5iYXJdIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90bykpOworfQorCitURVNUKFRleHRGb3JtYXRVbmtub3duRmllbGRUZXN0LCBUZXN0VW5rbm93bkV4dGVuc2lvbikgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIHByb3RvOworICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOworICBzdGQ6OnN0cmluZyBtZXNzYWdlX3dpdGhfZXh0ID0KKyAgICAgICJbdGVzdC5leHRlbnNpb24xXSB7XG4iCisgICAgICAiICBzb21lX3Vua25vd25fZmllbGRzOiB7XG4iCisgICAgICAiICAgIHVua25vd25fZmllbGQ6IDEyMzQ1XG4iCisgICAgICAiICB9XG4iCisgICAgICAifSI7CisgIC8vIFVua25vd24gZXh0ZW5zaW9ucyBhcmUgbm90IHBlcm1pdHRlZCBieSBkZWZhdWx0LgorICBFWFBFQ1RfRkFMU0UocGFyc2VyLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlX3dpdGhfZXh0LCAmcHJvdG8pKTsKKyAgLy8gQWxsb3dVbmtub3duRmllbGQgaW1wbGllcyBBbGxvd1Vua25vd25FeHRlbnNpb24uCisgIHBhcnNlci5BbGxvd1Vua25vd25GaWVsZCh0cnVlKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlX3dpdGhfZXh0LCAmcHJvdG8pKTsKKworICBwYXJzZXIuQWxsb3dVbmtub3duRmllbGQoZmFsc2UpOworICBFWFBFQ1RfRkFMU0UocGFyc2VyLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlX3dpdGhfZXh0LCAmcHJvdG8pKTsKKyAgcGFyc2VyLkFsbG93VW5rbm93bkV4dGVuc2lvbih0cnVlKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlX3dpdGhfZXh0LCAmcHJvdG8pKTsKKyAgLy8gVW5rbm93biBmaWVsZHMgYXJlIHN0aWxsIG5vdCBhY2NlcHRlZC4KKyAgRVhQRUNUX0ZBTFNFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoInVua25vd25fZmllbGQ6IDEiLCAmcHJvdG8pKTsKK30KKworVEVTVChUZXh0Rm9ybWF0RmxvYXRpbmdQb2ludFRlc3QsIFByZXNlcnZlc05lZ2F0aXZlMCkgeworICBwcm90bzNfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBpbl9tZXNzYWdlOworICBpbl9tZXNzYWdlLnNldF9vcHRpb25hbF9mbG9hdCgtMC4wZik7CisgIGluX21lc3NhZ2Uuc2V0X29wdGlvbmFsX2RvdWJsZSgtMC4wKTsKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkOworICBFWFBFQ1RfVFJVRShwcmludGVyLlByaW50VG9TdHJpbmcoaW5fbWVzc2FnZSwgJnNlcmlhbGl6ZWQpKTsKKyAgcHJvdG8zX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgb3V0X21lc3NhZ2U7CisgIFRleHRGb3JtYXQ6OlBhcnNlciBwYXJzZXI7CisgIEVYUEVDVF9UUlVFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCwgJm91dF9tZXNzYWdlKSk7CisgIEVYUEVDVF9FUShpbl9tZXNzYWdlLm9wdGlvbmFsX2Zsb2F0KCksIG91dF9tZXNzYWdlLm9wdGlvbmFsX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoc3RkOjpzaWduYml0KGluX21lc3NhZ2Uub3B0aW9uYWxfZmxvYXQoKSksCisgICAgICAgICAgICBzdGQ6OnNpZ25iaXQob3V0X21lc3NhZ2Uub3B0aW9uYWxfZmxvYXQoKSkpOworICBFWFBFQ1RfRVEoaW5fbWVzc2FnZS5vcHRpb25hbF9kb3VibGUoKSwgb3V0X21lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKCkpOworICBFWFBFQ1RfRVEoc3RkOjpzaWduYml0KGluX21lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKCkpLAorICAgICAgICAgICAgc3RkOjpzaWduYml0KG91dF9tZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSgpKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXh0X2Zvcm1hdF91bml0dGVzdAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wYi5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnBiLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOGEwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wYi5jYwpAQCAtMCwwICsxLDMwNyBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wYi5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworUFJPVE9CVUZfUFJBR01BX0lOSVRfU0VHCisKK25hbWVzcGFjZSBfcGIgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDsKK25hbWVzcGFjZSBfcGJpID0gX3BiOjppbnRlcm5hbDsKKworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK1BST1RPQlVGX0NPTlNURVhQUiBUaW1lc3RhbXA6OlRpbWVzdGFtcCgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8uc2Vjb25kc18pKi9pbnQ2NF90ezB9CisgICwgLypkZWNsdHlwZShfaW1wbF8ubmFub3NfKSovMAorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX0ge30KK3N0cnVjdCBUaW1lc3RhbXBEZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIFRpbWVzdGFtcERlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5UaW1lc3RhbXBEZWZhdWx0VHlwZUludGVybmFsKCkge30KKyAgdW5pb24geworICAgIFRpbWVzdGFtcCBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBUaW1lc3RhbXBEZWZhdWx0VHlwZUludGVybmFsIF9UaW1lc3RhbXBfZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK3N0YXRpYyA6Ol9wYjo6TWV0YWRhdGEgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZnRpbWVzdGFtcF8yZXByb3RvWzFdOworc3RhdGljIGNvbnN0ZXhwciA6Ol9wYjo6RW51bURlc2NyaXB0b3IgY29uc3QqKiBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0aW1lc3RhbXBfMmVwcm90byA9IG51bGxwdHI7CitzdGF0aWMgY29uc3RleHByIDo6X3BiOjpTZXJ2aWNlRGVzY3JpcHRvciBjb25zdCoqIGZpbGVfbGV2ZWxfc2VydmljZV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZnRpbWVzdGFtcF8yZXByb3RvID0gbnVsbHB0cjsKKworY29uc3QgdWludDMyX3QgVGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0aW1lc3RhbXBfMmVwcm90bzo6b2Zmc2V0c1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0geworICB+MHUsICAvLyBubyBfaGFzX2JpdHNfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VGltZXN0YW1wLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgfjB1LCAgLy8gbm8gX2V4dGVuc2lvbnNfCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlRpbWVzdGFtcCwgX2ltcGxfLnNlY29uZHNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpUaW1lc3RhbXAsIF9pbXBsXy5uYW5vc18pLAorfTsKK3N0YXRpYyBjb25zdCA6Ol9wYmk6Ok1pZ3JhdGlvblNjaGVtYSBzY2hlbWFzW10gUFJPVE9CVUZfU0VDVElPTl9WQVJJQUJMRShwcm90b2Rlc2NfY29sZCkgPSB7CisgIHsgMCwgLTEsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlRpbWVzdGFtcCl9LAorfTsKKworc3RhdGljIGNvbnN0IDo6X3BiOjpNZXNzYWdlKiBjb25zdCBmaWxlX2RlZmF1bHRfaW5zdGFuY2VzW10gPSB7CisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X1RpbWVzdGFtcF9kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCit9OworCitjb25zdCBjaGFyIGRlc2NyaXB0b3JfdGFibGVfcHJvdG9kZWZfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0aW1lc3RhbXBfMmVwcm90b1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0KKyAgIlxuXDAzN2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG9cMDIyXDAxN2dvb2dsIgorICAiZS5wcm90b2J1ZlwiK1xuXHRUaW1lc3RhbXBcMDIyXDAxN1xuXDAwN3NlY29uZHNcMDMwXDAwMSBcMDAxKFwwMDMiCisgICJcMDIyXHJcblwwMDVuYW5vc1wwMzBcMDAyIFwwMDEoXDAwNUJcMjA1XDAwMVxuXDAyM2NvbS5nb29nbGUucHJvdG9idWZCIgorICAiXDAxNlRpbWVzdGFtcFByb3RvUFwwMDFaMmdvb2dsZS5nb2xhbmcub3JnL3BybyIKKyAgInRvYnVmL3R5cGVzL2tub3duL3RpbWVzdGFtcHBiXDM3MFwwMDFcMDAxXDI0MlwwMDJcMDAzR1BCXDI1MlwwMDIiCisgICJcMDM2R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYlwwMDZwcm90bzMiCisgIDsKK3N0YXRpYyA6Ol9wYmk6Om9uY2VfZmxhZyBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmdGltZXN0YW1wXzJlcHJvdG9fb25jZTsKK2NvbnN0IDo6X3BiaTo6RGVzY3JpcHRvclRhYmxlIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0aW1lc3RhbXBfMmVwcm90byA9IHsKKyAgICBmYWxzZSwgZmFsc2UsIDIzOSwgZGVzY3JpcHRvcl90YWJsZV9wcm90b2RlZl9nb29nbGVfMmZwcm90b2J1Zl8yZnRpbWVzdGFtcF8yZXByb3RvLAorICAgICJnb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvIiwKKyAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnRpbWVzdGFtcF8yZXByb3RvX29uY2UsIG51bGxwdHIsIDAsIDEsCisgICAgc2NoZW1hcywgZmlsZV9kZWZhdWx0X2luc3RhbmNlcywgVGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0aW1lc3RhbXBfMmVwcm90bzo6b2Zmc2V0cywKKyAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmdGltZXN0YW1wXzJlcHJvdG8sIGZpbGVfbGV2ZWxfZW51bV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZnRpbWVzdGFtcF8yZXByb3RvLAorICAgIGZpbGVfbGV2ZWxfc2VydmljZV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZnRpbWVzdGFtcF8yZXByb3RvLAorfTsKK1BST1RPQlVGX0FUVFJJQlVURV9XRUFLIGNvbnN0IDo6X3BiaTo6RGVzY3JpcHRvclRhYmxlKiBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmdGltZXN0YW1wXzJlcHJvdG9fZ2V0dGVyKCkgeworICByZXR1cm4gJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0aW1lc3RhbXBfMmVwcm90bzsKK30KKworLy8gRm9yY2UgcnVubmluZyBBZGREZXNjcmlwdG9ycygpIGF0IGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gdGltZS4KK1BST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMiBzdGF0aWMgOjpfcGJpOjpBZGREZXNjcmlwdG9yc1J1bm5lciBkeW5hbWljX2luaXRfZHVtbXlfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0aW1lc3RhbXBfMmVwcm90bygmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnRpbWVzdGFtcF8yZXByb3RvKTsKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGltZXN0YW1wOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKK307CisKK1RpbWVzdGFtcDo6VGltZXN0YW1wKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCkKK30KK1RpbWVzdGFtcDo6VGltZXN0YW1wKGNvbnN0IFRpbWVzdGFtcCYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgVGltZXN0YW1wKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLnNlY29uZHNfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubmFub3NfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIDo6bWVtY3B5KCZfaW1wbF8uc2Vjb25kc18sICZmcm9tLl9pbXBsXy5zZWNvbmRzXywKKyAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8ubmFub3NfKSAtCisgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5zZWNvbmRzXykpICsgc2l6ZW9mKF9pbXBsXy5uYW5vc18pKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCkKK30KKworaW5saW5lIHZvaWQgVGltZXN0YW1wOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5zZWNvbmRzXyl7aW50NjRfdHswfX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW5vc18pezB9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgfTsKK30KKworVGltZXN0YW1wOjp+VGltZXN0YW1wKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuVGltZXN0YW1wKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgVGltZXN0YW1wOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworfQorCit2b2lkIFRpbWVzdGFtcDo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgVGltZXN0YW1wOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXApCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIDo6bWVtc2V0KCZfaW1wbF8uc2Vjb25kc18sIDAsIHN0YXRpY19jYXN0PHNpemVfdD4oCisgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLm5hbm9zXykgLQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5zZWNvbmRzXykpICsgc2l6ZW9mKF9pbXBsXy5uYW5vc18pKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5DbGVhcjw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworfQorCitjb25zdCBjaGFyKiBUaW1lc3RhbXA6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gaW50NjQgc2Vjb25kcyA9IDE7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA4KSkgeworICAgICAgICAgIF9pbXBsXy5zZWNvbmRzXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBpbnQzMiBuYW5vcyA9IDI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxNikpIHsKKyAgICAgICAgICBfaW1wbF8ubmFub3NfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50MzIoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIFRpbWVzdGFtcDo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuVGltZXN0YW1wKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIGludDY0IHNlY29uZHMgPSAxOworICBpZiAodGhpcy0+X2ludGVybmFsX3NlY29uZHMoKSAhPSAwKSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50NjRUb0FycmF5KDEsIHRoaXMtPl9pbnRlcm5hbF9zZWNvbmRzKCksIHRhcmdldCk7CisgIH0KKworICAvLyBpbnQzMiBuYW5vcyA9IDI7CisgIGlmICh0aGlzLT5faW50ZXJuYWxfbmFub3MoKSAhPSAwKSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDIsIHRoaXMtPl9pbnRlcm5hbF9uYW5vcygpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCkKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IFRpbWVzdGFtcDo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXApCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyBpbnQ2NCBzZWNvbmRzID0gMTsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9zZWNvbmRzKCkgIT0gMCkgeworICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6SW50NjRTaXplUGx1c09uZSh0aGlzLT5faW50ZXJuYWxfc2Vjb25kcygpKTsKKyAgfQorCisgIC8vIGludDMyIG5hbm9zID0gMjsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9uYW5vcygpICE9IDApIHsKKyAgICB0b3RhbF9zaXplICs9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZVBsdXNPbmUodGhpcy0+X2ludGVybmFsX25hbm9zKCkpOworICB9CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgVGltZXN0YW1wOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgVGltZXN0YW1wOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKlRpbWVzdGFtcDo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgVGltZXN0YW1wOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8VGltZXN0YW1wKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBUaW1lc3RhbXAmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXApCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBpZiAoZnJvbS5faW50ZXJuYWxfc2Vjb25kcygpICE9IDApIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF9zZWNvbmRzKGZyb20uX2ludGVybmFsX3NlY29uZHMoKSk7CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX25hbm9zKCkgIT0gMCkgeworICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X25hbm9zKGZyb20uX2ludGVybmFsX25hbm9zKCkpOworICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIFRpbWVzdGFtcDo6Q29weUZyb20oY29uc3QgVGltZXN0YW1wJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXApCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBUaW1lc3RhbXA6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFRpbWVzdGFtcDo6SW50ZXJuYWxTd2FwKFRpbWVzdGFtcCogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Om1lbXN3YXA8CisgICAgICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoVGltZXN0YW1wLCBfaW1wbF8ubmFub3NfKQorICAgICAgKyBzaXplb2YoVGltZXN0YW1wOjpfaW1wbF8ubmFub3NfKQorICAgICAgLSBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoVGltZXN0YW1wLCBfaW1wbF8uc2Vjb25kc18pPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLnNlY29uZHNfKSwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmb3RoZXItPl9pbXBsXy5zZWNvbmRzXykpOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgVGltZXN0YW1wOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnRpbWVzdGFtcF8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0aW1lc3RhbXBfMmVwcm90b19vbmNlLAorICAgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZnRpbWVzdGFtcF8yZXByb3RvWzBdKTsKK30KKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlRpbWVzdGFtcCoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpUaW1lc3RhbXAgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpUaW1lc3RhbXAgPihhcmVuYSk7Cit9CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wYi5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDM3ZDExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucGIuaApAQCAtMCwwICsxLDI3OCBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bworCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZnRpbWVzdGFtcF8yZXByb3RvCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZnRpbWVzdGFtcF8yZXByb3RvCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKyNpZiBQUk9UT0JVRl9WRVJTSU9OIDwgMzAyMTAwMAorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiBQbGVhc2UgdXBkYXRlCisjZXJyb3IgeW91ciBoZWFkZXJzLgorI2VuZGlmCisjaWYgMzAyMTAwOSA8IFBST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTgorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIG9sZGVyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCisjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gUGxlYXNlCisjZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21ldGFkYXRhX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorI2RlZmluZSBQUk9UT0JVRl9JTlRFUk5BTF9FWFBPUlRfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0aW1lc3RhbXBfMmVwcm90byBQUk9UT0JVRl9FWFBPUlQKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCituYW1lc3BhY2UgaW50ZXJuYWwgeworY2xhc3MgQW55TWV0YWRhdGE7Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IHVzZSB0aGVzZSBtZW1iZXJzLgorc3RydWN0IFBST1RPQlVGX0VYUE9SVCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZnRpbWVzdGFtcF8yZXByb3RvIHsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG9mZnNldHNbXTsKK307CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RGVzY3JpcHRvclRhYmxlIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0aW1lc3RhbXBfMmVwcm90bzsKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCitjbGFzcyBUaW1lc3RhbXA7CitzdHJ1Y3QgVGltZXN0YW1wRGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gVGltZXN0YW1wRGVmYXVsdFR5cGVJbnRlcm5hbCBfVGltZXN0YW1wX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlRpbWVzdGFtcCogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VGltZXN0YW1wPihBcmVuYSopOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBUaW1lc3RhbXAgZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuVGltZXN0YW1wKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgVGltZXN0YW1wKCkgOiBUaW1lc3RhbXAobnVsbHB0cikge30KKyAgflRpbWVzdGFtcCgpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgVGltZXN0YW1wKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgVGltZXN0YW1wKGNvbnN0IFRpbWVzdGFtcCYgZnJvbSk7CisgIFRpbWVzdGFtcChUaW1lc3RhbXAmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogVGltZXN0YW1wKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgVGltZXN0YW1wJiBvcGVyYXRvcj0oY29uc3QgVGltZXN0YW1wJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBUaW1lc3RhbXAmIG9wZXJhdG9yPShUaW1lc3RhbXAmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgVGltZXN0YW1wJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgVGltZXN0YW1wKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFRpbWVzdGFtcCo+KAorICAgICAgICAgICAgICAgJl9UaW1lc3RhbXBfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAwOworCisgIGZyaWVuZCB2b2lkIHN3YXAoVGltZXN0YW1wJiBhLCBUaW1lc3RhbXAmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoVGltZXN0YW1wKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChUaW1lc3RhbXAqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFRpbWVzdGFtcCogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxUaW1lc3RhbXA+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgVGltZXN0YW1wJiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IFRpbWVzdGFtcCYgZnJvbSkgeworICAgIFRpbWVzdGFtcDo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKFRpbWVzdGFtcCogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgVGltZXN0YW1wKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrU2Vjb25kc0ZpZWxkTnVtYmVyID0gMSwKKyAgICBrTmFub3NGaWVsZE51bWJlciA9IDIsCisgIH07CisgIC8vIGludDY0IHNlY29uZHMgPSAxOworICB2b2lkIGNsZWFyX3NlY29uZHMoKTsKKyAgaW50NjRfdCBzZWNvbmRzKCkgY29uc3Q7CisgIHZvaWQgc2V0X3NlY29uZHMoaW50NjRfdCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGludDY0X3QgX2ludGVybmFsX3NlY29uZHMoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X3NlY29uZHMoaW50NjRfdCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBpbnQzMiBuYW5vcyA9IDI7CisgIHZvaWQgY2xlYXJfbmFub3MoKTsKKyAgaW50MzJfdCBuYW5vcygpIGNvbnN0OworICB2b2lkIHNldF9uYW5vcyhpbnQzMl90IHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgaW50MzJfdCBfaW50ZXJuYWxfbmFub3MoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X25hbm9zKGludDMyX3QgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXApCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIGludDY0X3Qgc2Vjb25kc187CisgICAgaW50MzJfdCBuYW5vc187CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZnRpbWVzdGFtcF8yZXByb3RvOworfTsKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfX0dOVUNfXworICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3N0cmljdC1hbGlhc2luZyIKKyNlbmRpZiAgLy8gX19HTlVDX18KKy8vIFRpbWVzdGFtcAorCisvLyBpbnQ2NCBzZWNvbmRzID0gMTsKK2lubGluZSB2b2lkIFRpbWVzdGFtcDo6Y2xlYXJfc2Vjb25kcygpIHsKKyAgX2ltcGxfLnNlY29uZHNfID0gaW50NjRfdHswfTsKK30KK2lubGluZSBpbnQ2NF90IFRpbWVzdGFtcDo6X2ludGVybmFsX3NlY29uZHMoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uc2Vjb25kc187Cit9CitpbmxpbmUgaW50NjRfdCBUaW1lc3RhbXA6OnNlY29uZHMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcC5zZWNvbmRzKQorICByZXR1cm4gX2ludGVybmFsX3NlY29uZHMoKTsKK30KK2lubGluZSB2b2lkIFRpbWVzdGFtcDo6X2ludGVybmFsX3NldF9zZWNvbmRzKGludDY0X3QgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5zZWNvbmRzXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgVGltZXN0YW1wOjpzZXRfc2Vjb25kcyhpbnQ2NF90IHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfc2Vjb25kcyh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcC5zZWNvbmRzKQorfQorCisvLyBpbnQzMiBuYW5vcyA9IDI7CitpbmxpbmUgdm9pZCBUaW1lc3RhbXA6OmNsZWFyX25hbm9zKCkgeworICBfaW1wbF8ubmFub3NfID0gMDsKK30KK2lubGluZSBpbnQzMl90IFRpbWVzdGFtcDo6X2ludGVybmFsX25hbm9zKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm5hbm9zXzsKK30KK2lubGluZSBpbnQzMl90IFRpbWVzdGFtcDo6bmFub3MoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcC5uYW5vcykKKyAgcmV0dXJuIF9pbnRlcm5hbF9uYW5vcygpOworfQoraW5saW5lIHZvaWQgVGltZXN0YW1wOjpfaW50ZXJuYWxfc2V0X25hbm9zKGludDMyX3QgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5uYW5vc18gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIFRpbWVzdGFtcDo6c2V0X25hbm9zKGludDMyX3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9uYW5vcyh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcC5uYW5vcykKK30KKworI2lmZGVmIF9fR05VQ19fCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYgIC8vIF9fR05VQ19fCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCisKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2dvb2dsZV8yZnByb3RvYnVmXzJmdGltZXN0YW1wXzJlcHJvdG8KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyZGY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvCkBAIC0wLDAgKzEsMTQ3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOworCitvcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMiOworb3B0aW9uIGNjX2VuYWJsZV9hcmVuYXMgPSB0cnVlOworb3B0aW9uIGdvX3BhY2thZ2UgPSAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vdGltZXN0YW1wcGIiOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJUaW1lc3RhbXBQcm90byI7CitvcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7CitvcHRpb24gb2JqY19jbGFzc19wcmVmaXggPSAiR1BCIjsKKworLy8gQSBUaW1lc3RhbXAgcmVwcmVzZW50cyBhIHBvaW50IGluIHRpbWUgaW5kZXBlbmRlbnQgb2YgYW55IHRpbWUgem9uZSBvciBsb2NhbAorLy8gY2FsZW5kYXIsIGVuY29kZWQgYXMgYSBjb3VudCBvZiBzZWNvbmRzIGFuZCBmcmFjdGlvbnMgb2Ygc2Vjb25kcyBhdAorLy8gbmFub3NlY29uZCByZXNvbHV0aW9uLiBUaGUgY291bnQgaXMgcmVsYXRpdmUgdG8gYW4gZXBvY2ggYXQgVVRDIG1pZG5pZ2h0IG9uCisvLyBKYW51YXJ5IDEsIDE5NzAsIGluIHRoZSBwcm9sZXB0aWMgR3JlZ29yaWFuIGNhbGVuZGFyIHdoaWNoIGV4dGVuZHMgdGhlCisvLyBHcmVnb3JpYW4gY2FsZW5kYXIgYmFja3dhcmRzIHRvIHllYXIgb25lLgorLy8KKy8vIEFsbCBtaW51dGVzIGFyZSA2MCBzZWNvbmRzIGxvbmcuIExlYXAgc2Vjb25kcyBhcmUgInNtZWFyZWQiIHNvIHRoYXQgbm8gbGVhcAorLy8gc2Vjb25kIHRhYmxlIGlzIG5lZWRlZCBmb3IgaW50ZXJwcmV0YXRpb24sIHVzaW5nIGEgWzI0LWhvdXIgbGluZWFyCisvLyBzbWVhcl0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vdGltZS9zbWVhcikuCisvLworLy8gVGhlIHJhbmdlIGlzIGZyb20gMDAwMS0wMS0wMVQwMDowMDowMFogdG8gOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5OTlaLiBCeQorLy8gcmVzdHJpY3RpbmcgdG8gdGhhdCByYW5nZSwgd2UgZW5zdXJlIHRoYXQgd2UgY2FuIGNvbnZlcnQgdG8gYW5kIGZyb20gW1JGQworLy8gMzMzOV0oaHR0cHM6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMzMzkudHh0KSBkYXRlIHN0cmluZ3MuCisvLworLy8gIyBFeGFtcGxlcworLy8KKy8vIEV4YW1wbGUgMTogQ29tcHV0ZSBUaW1lc3RhbXAgZnJvbSBQT1NJWCBgdGltZSgpYC4KKy8vCisvLyAgICAgVGltZXN0YW1wIHRpbWVzdGFtcDsKKy8vICAgICB0aW1lc3RhbXAuc2V0X3NlY29uZHModGltZShOVUxMKSk7CisvLyAgICAgdGltZXN0YW1wLnNldF9uYW5vcygwKTsKKy8vCisvLyBFeGFtcGxlIDI6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gUE9TSVggYGdldHRpbWVvZmRheSgpYC4KKy8vCisvLyAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisvLyAgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisvLworLy8gICAgIFRpbWVzdGFtcCB0aW1lc3RhbXA7CisvLyAgICAgdGltZXN0YW1wLnNldF9zZWNvbmRzKHR2LnR2X3NlYyk7CisvLyAgICAgdGltZXN0YW1wLnNldF9uYW5vcyh0di50dl91c2VjICogMTAwMCk7CisvLworLy8gRXhhbXBsZSAzOiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIFdpbjMyIGBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgpYC4KKy8vCisvLyAgICAgRklMRVRJTUUgZnQ7CisvLyAgICAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoJmZ0KTsKKy8vICAgICBVSU5UNjQgdGlja3MgPSAoKChVSU5UNjQpZnQuZHdIaWdoRGF0ZVRpbWUpIDw8IDMyKSB8IGZ0LmR3TG93RGF0ZVRpbWU7CisvLworLy8gICAgIC8vIEEgV2luZG93cyB0aWNrIGlzIDEwMCBuYW5vc2Vjb25kcy4gV2luZG93cyBlcG9jaCAxNjAxLTAxLTAxVDAwOjAwOjAwWgorLy8gICAgIC8vIGlzIDExNjQ0NDczNjAwIHNlY29uZHMgYmVmb3JlIFVuaXggZXBvY2ggMTk3MC0wMS0wMVQwMDowMDowMFouCisvLyAgICAgVGltZXN0YW1wIHRpbWVzdGFtcDsKKy8vICAgICB0aW1lc3RhbXAuc2V0X3NlY29uZHMoKElOVDY0KSAoKHRpY2tzIC8gMTAwMDAwMDApIC0gMTE2NDQ0NzM2MDBMTCkpOworLy8gICAgIHRpbWVzdGFtcC5zZXRfbmFub3MoKElOVDMyKSAoKHRpY2tzICUgMTAwMDAwMDApICogMTAwKSk7CisvLworLy8gRXhhbXBsZSA0OiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIEphdmEgYFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpYC4KKy8vCisvLyAgICAgbG9uZyBtaWxsaXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKy8vCisvLyAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IFRpbWVzdGFtcC5uZXdCdWlsZGVyKCkuc2V0U2Vjb25kcyhtaWxsaXMgLyAxMDAwKQorLy8gICAgICAgICAuc2V0TmFub3MoKGludCkgKChtaWxsaXMgJSAxMDAwKSAqIDEwMDAwMDApKS5idWlsZCgpOworLy8KKy8vCisvLyBFeGFtcGxlIDU6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gSmF2YSBgSW5zdGFudC5ub3coKWAuCisvLworLy8gICAgIEluc3RhbnQgbm93ID0gSW5zdGFudC5ub3coKTsKKy8vCisvLyAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9CisvLyAgICAgICAgIFRpbWVzdGFtcC5uZXdCdWlsZGVyKCkuc2V0U2Vjb25kcyhub3cuZ2V0RXBvY2hTZWNvbmQoKSkKKy8vICAgICAgICAgICAgIC5zZXROYW5vcyhub3cuZ2V0TmFubygpKS5idWlsZCgpOworLy8KKy8vCisvLyBFeGFtcGxlIDY6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gY3VycmVudCB0aW1lIGluIFB5dGhvbi4KKy8vCisvLyAgICAgdGltZXN0YW1wID0gVGltZXN0YW1wKCkKKy8vICAgICB0aW1lc3RhbXAuR2V0Q3VycmVudFRpbWUoKQorLy8KKy8vICMgSlNPTiBNYXBwaW5nCisvLworLy8gSW4gSlNPTiBmb3JtYXQsIHRoZSBUaW1lc3RhbXAgdHlwZSBpcyBlbmNvZGVkIGFzIGEgc3RyaW5nIGluIHRoZQorLy8gW1JGQyAzMzM5XShodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQpIGZvcm1hdC4gVGhhdCBpcywgdGhlCisvLyBmb3JtYXQgaXMgInt5ZWFyfS17bW9udGh9LXtkYXl9VHtob3VyfTp7bWlufTp7c2VjfVsue2ZyYWNfc2VjfV1aIgorLy8gd2hlcmUge3llYXJ9IGlzIGFsd2F5cyBleHByZXNzZWQgdXNpbmcgZm91ciBkaWdpdHMgd2hpbGUge21vbnRofSwge2RheX0sCisvLyB7aG91cn0sIHttaW59LCBhbmQge3NlY30gYXJlIHplcm8tcGFkZGVkIHRvIHR3byBkaWdpdHMgZWFjaC4gVGhlIGZyYWN0aW9uYWwKKy8vIHNlY29uZHMsIHdoaWNoIGNhbiBnbyB1cCB0byA5IGRpZ2l0cyAoaS5lLiB1cCB0byAxIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiksCisvLyBhcmUgb3B0aW9uYWwuIFRoZSAiWiIgc3VmZml4IGluZGljYXRlcyB0aGUgdGltZXpvbmUgKCJVVEMiKTsgdGhlIHRpbWV6b25lCisvLyBpcyByZXF1aXJlZC4gQSBwcm90bzMgSlNPTiBzZXJpYWxpemVyIHNob3VsZCBhbHdheXMgdXNlIFVUQyAoYXMgaW5kaWNhdGVkIGJ5CisvLyAiWiIpIHdoZW4gcHJpbnRpbmcgdGhlIFRpbWVzdGFtcCB0eXBlIGFuZCBhIHByb3RvMyBKU09OIHBhcnNlciBzaG91bGQgYmUKKy8vIGFibGUgdG8gYWNjZXB0IGJvdGggVVRDIGFuZCBvdGhlciB0aW1lem9uZXMgKGFzIGluZGljYXRlZCBieSBhbiBvZmZzZXQpLgorLy8KKy8vIEZvciBleGFtcGxlLCAiMjAxNy0wMS0xNVQwMTozMDoxNS4wMVoiIGVuY29kZXMgMTUuMDEgc2Vjb25kcyBwYXN0CisvLyAwMTozMCBVVEMgb24gSmFudWFyeSAxNSwgMjAxNy4KKy8vCisvLyBJbiBKYXZhU2NyaXB0LCBvbmUgY2FuIGNvbnZlcnQgYSBEYXRlIG9iamVjdCB0byB0aGlzIGZvcm1hdCB1c2luZyB0aGUKKy8vIHN0YW5kYXJkCisvLyBbdG9JU09TdHJpbmcoKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZS90b0lTT1N0cmluZykKKy8vIG1ldGhvZC4gSW4gUHl0aG9uLCBhIHN0YW5kYXJkIGBkYXRldGltZS5kYXRldGltZWAgb2JqZWN0IGNhbiBiZSBjb252ZXJ0ZWQKKy8vIHRvIHRoaXMgZm9ybWF0IHVzaW5nCisvLyBbYHN0cmZ0aW1lYF0oaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMi9saWJyYXJ5L3RpbWUuaHRtbCN0aW1lLnN0cmZ0aW1lKSB3aXRoCisvLyB0aGUgdGltZSBmb3JtYXQgc3BlYyAnJVktJW0tJWRUJUg6JU06JVMuJWZaJy4gTGlrZXdpc2UsIGluIEphdmEsIG9uZSBjYW4gdXNlCisvLyB0aGUgSm9kYSBUaW1lJ3MgW2BJU09EYXRlVGltZUZvcm1hdC5kYXRlVGltZSgpYF0oCisvLyBodHRwOi8vd3d3LmpvZGEub3JnL2pvZGEtdGltZS9hcGlkb2NzL29yZy9qb2RhL3RpbWUvZm9ybWF0L0lTT0RhdGVUaW1lRm9ybWF0Lmh0bWwjZGF0ZVRpbWUlMkQlMkQKKy8vICkgdG8gb2J0YWluIGEgZm9ybWF0dGVyIGNhcGFibGUgb2YgZ2VuZXJhdGluZyB0aW1lc3RhbXBzIGluIHRoaXMgZm9ybWF0LgorLy8KKy8vCittZXNzYWdlIFRpbWVzdGFtcCB7CisgIC8vIFJlcHJlc2VudHMgc2Vjb25kcyBvZiBVVEMgdGltZSBzaW5jZSBVbml4IGVwb2NoCisgIC8vIDE5NzAtMDEtMDFUMDA6MDA6MDBaLiBNdXN0IGJlIGZyb20gMDAwMS0wMS0wMVQwMDowMDowMFogdG8KKyAgLy8gOTk5OS0xMi0zMVQyMzo1OTo1OVogaW5jbHVzaXZlLgorICBpbnQ2NCBzZWNvbmRzID0gMTsKKworICAvLyBOb24tbmVnYXRpdmUgZnJhY3Rpb25zIG9mIGEgc2Vjb25kIGF0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbi4gTmVnYXRpdmUKKyAgLy8gc2Vjb25kIHZhbHVlcyB3aXRoIGZyYWN0aW9ucyBtdXN0IHN0aWxsIGhhdmUgbm9uLW5lZ2F0aXZlIG5hbm9zIHZhbHVlcworICAvLyB0aGF0IGNvdW50IGZvcndhcmQgaW4gdGltZS4gTXVzdCBiZSBmcm9tIDAgdG8gOTk5LDk5OSw5OTkKKyAgLy8gaW5jbHVzaXZlLgorICBpbnQzMiBuYW5vcyA9IDI7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI5YmJiOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdHlwZS5wYi5jYwpAQCAtMCwwICsxLDIxNTcgQEAKKy8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisvLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi90eXBlLnByb3RvCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdHlwZS5wYi5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworUFJPVE9CVUZfUFJBR01BX0lOSVRfU0VHCisKK25hbWVzcGFjZSBfcGIgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDsKK25hbWVzcGFjZSBfcGJpID0gX3BiOjppbnRlcm5hbDsKKworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK1BST1RPQlVGX0NPTlNURVhQUiBUeXBlOjpUeXBlKAorICAgIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZCk6IF9pbXBsX3sKKyAgICAvKmRlY2x0eXBlKF9pbXBsXy5maWVsZHNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5vbmVvZnNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8ubmFtZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnNvdXJjZV9jb250ZXh0XykqL251bGxwdHIKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5zeW50YXhfKSovMAorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX0ge30KK3N0cnVjdCBUeXBlRGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBUeXBlRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgflR5cGVEZWZhdWx0VHlwZUludGVybmFsKCkge30KKyAgdW5pb24geworICAgIFR5cGUgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgVHlwZURlZmF1bHRUeXBlSW50ZXJuYWwgX1R5cGVfZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9DT05TVEVYUFIgRmllbGQ6OkZpZWxkKAorICAgIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZCk6IF9pbXBsX3sKKyAgICAvKmRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXykqL3t9CisgICwgLypkZWNsdHlwZShfaW1wbF8ubmFtZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnR5cGVfdXJsXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uanNvbl9uYW1lXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uZGVmYXVsdF92YWx1ZV8pKi97Jjo6X3BiaTo6Zml4ZWRfYWRkcmVzc19lbXB0eV9zdHJpbmcsIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmtpbmRfKSovMAorICAsIC8qZGVjbHR5cGUoX2ltcGxfLmNhcmRpbmFsaXR5XykqLzAKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5udW1iZXJfKSovMAorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm9uZW9mX2luZGV4XykqLzAKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5wYWNrZWRfKSovZmFsc2UKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319IHt9CitzdHJ1Y3QgRmllbGREZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIEZpZWxkRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgfkZpZWxkRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBGaWVsZCBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBGaWVsZERlZmF1bHRUeXBlSW50ZXJuYWwgX0ZpZWxkX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIEVudW06OkVudW0oCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLmVudW12YWx1ZV8pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKSove30KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5uYW1lXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uc291cmNlX2NvbnRleHRfKSovbnVsbHB0cgorICAsIC8qZGVjbHR5cGUoX2ltcGxfLnN5bnRheF8pKi8wCisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fSB7fQorc3RydWN0IEVudW1EZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIEVudW1EZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+RW51bURlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgRW51bSBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBFbnVtRGVmYXVsdFR5cGVJbnRlcm5hbCBfRW51bV9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBFbnVtVmFsdWU6OkVudW1WYWx1ZSgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8ub3B0aW9uc18pKi97fQorICAsIC8qZGVjbHR5cGUoX2ltcGxfLm5hbWVfKSoveyY6Ol9wYmk6OmZpeGVkX2FkZHJlc3NfZW1wdHlfc3RyaW5nLCA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fX0KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5udW1iZXJfKSovMAorICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX0ge30KK3N0cnVjdCBFbnVtVmFsdWVEZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIEVudW1WYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5FbnVtVmFsdWVEZWZhdWx0VHlwZUludGVybmFsKCkge30KKyAgdW5pb24geworICAgIEVudW1WYWx1ZSBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBFbnVtVmFsdWVEZWZhdWx0VHlwZUludGVybmFsIF9FbnVtVmFsdWVfZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9DT05TVEVYUFIgT3B0aW9uOjpPcHRpb24oCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLm5hbWVfKSoveyY6Ol9wYmk6OmZpeGVkX2FkZHJlc3NfZW1wdHlfc3RyaW5nLCA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fX0KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy52YWx1ZV8pKi9udWxscHRyCisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fSB7fQorc3RydWN0IE9wdGlvbkRlZmF1bHRUeXBlSW50ZXJuYWwgeworICBQUk9UT0JVRl9DT05TVEVYUFIgT3B0aW9uRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgfk9wdGlvbkRlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgT3B0aW9uIF9pbnN0YW5jZTsKKyAgfTsKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIE9wdGlvbkRlZmF1bHRUeXBlSW50ZXJuYWwgX09wdGlvbl9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorc3RhdGljIDo6X3BiOjpNZXRhZGF0YSBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvWzVdOworc3RhdGljIGNvbnN0IDo6X3BiOjpFbnVtRGVzY3JpcHRvciogZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvWzNdOworc3RhdGljIGNvbnN0ZXhwciA6Ol9wYjo6U2VydmljZURlc2NyaXB0b3IgY29uc3QqKiBmaWxlX2xldmVsX3NlcnZpY2VfZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG8gPSBudWxscHRyOworCitjb25zdCB1aW50MzJfdCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90bzo6b2Zmc2V0c1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0geworICB+MHUsICAvLyBubyBfaGFzX2JpdHNfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VHlwZSwgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpUeXBlLCBfaW1wbF8ubmFtZV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlR5cGUsIF9pbXBsXy5maWVsZHNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpUeXBlLCBfaW1wbF8ub25lb2ZzXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VHlwZSwgX2ltcGxfLm9wdGlvbnNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpUeXBlLCBfaW1wbF8uc291cmNlX2NvbnRleHRfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpUeXBlLCBfaW1wbF8uc3ludGF4XyksCisgIH4wdSwgIC8vIG5vIF9oYXNfYml0c18KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZCwgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZCwgX2ltcGxfLmtpbmRfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZCwgX2ltcGxfLmNhcmRpbmFsaXR5XyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGQsIF9pbXBsXy5udW1iZXJfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZCwgX2ltcGxfLm5hbWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZCwgX2ltcGxfLnR5cGVfdXJsXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGQsIF9pbXBsXy5vbmVvZl9pbmRleF8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkLCBfaW1wbF8ucGFja2VkXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGQsIF9pbXBsXy5vcHRpb25zXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGQsIF9pbXBsXy5qc29uX25hbWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZCwgX2ltcGxfLmRlZmF1bHRfdmFsdWVfKSwKKyAgfjB1LCAgLy8gbm8gX2hhc19iaXRzXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW0sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bSwgX2ltcGxfLm5hbWVfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtLCBfaW1wbF8uZW51bXZhbHVlXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bSwgX2ltcGxfLm9wdGlvbnNfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtLCBfaW1wbF8uc291cmNlX2NvbnRleHRfKSwKKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtLCBfaW1wbF8uc3ludGF4XyksCisgIH4wdSwgIC8vIG5vIF9oYXNfYml0c18KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWUsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlLCBfaW1wbF8ubmFtZV8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZSwgX2ltcGxfLm51bWJlcl8pLAorICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZSwgX2ltcGxfLm9wdGlvbnNfKSwKKyAgfjB1LCAgLy8gbm8gX2hhc19iaXRzXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiwgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24sIF9pbXBsXy5uYW1lXyksCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uLCBfaW1wbF8udmFsdWVfKSwKK307CitzdGF0aWMgY29uc3QgOjpfcGJpOjpNaWdyYXRpb25TY2hlbWEgc2NoZW1hc1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0geworICB7IDAsIC0xLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpUeXBlKX0sCisgIHsgMTIsIC0xLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZCl9LAorICB7IDI4LCAtMSwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bSl9LAorICB7IDM5LCAtMSwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlKX0sCisgIHsgNDgsIC0xLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24pfSwKK307CisKK3N0YXRpYyBjb25zdCA6Ol9wYjo6TWVzc2FnZSogY29uc3QgZmlsZV9kZWZhdWx0X2luc3RhbmNlc1tdID0geworICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9UeXBlX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfRmllbGRfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9FbnVtX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfRW51bVZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfT3B0aW9uX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKK307CisKK2NvbnN0IGNoYXIgZGVzY3JpcHRvcl90YWJsZV9wcm90b2RlZl9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90b1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0KKyAgIlxuXDAzMmdvb2dsZS9wcm90b2J1Zi90eXBlLnByb3RvXDAyMlwwMTdnb29nbGUucHJvIgorICAidG9idWZcMDMyXDAzMWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG9cMDMyJGdvb2dsZSIKKyAgIi9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90b1wiXDMyN1wwMDFcblwwMDRUeXBlXDAyMiIKKyAgIlwwMTRcblwwMDRuYW1lXDAzMFwwMDEgXDAwMShcdFwwMjImXG5cMDA2ZmllbGRzXDAzMFwwMDIgXDAwMyhcMDEzMlwwMjYuZ29vZ2xlLnAiCisgICJyb3RvYnVmLkZpZWxkXDAyMlwwMTZcblwwMDZvbmVvZnNcMDMwXDAwMyBcMDAzKFx0XDAyMihcblwwMDdvcHRpb25zIgorICAiXDAzMFwwMDQgXDAwMyhcMDEzMlwwMjcuZ29vZ2xlLnByb3RvYnVmLk9wdGlvblwwMjI2XG5cMDE2c291cmMiCisgICJlX2NvbnRleHRcMDMwXDAwNSBcMDAxKFwwMTMyXDAzNi5nb29nbGUucHJvdG9idWYuU291cmNlIgorICAiQ29udGV4dFwwMjJcJ1xuXDAwNnN5bnRheFwwMzBcMDA2IFwwMDEoXDAxNjJcMDI3Lmdvb2dsZS5wcm90b2J1IgorICAiZi5TeW50YXhcIlwzMjVcMDA1XG5cMDA1RmllbGRcMDIyKVxuXDAwNGtpbmRcMDMwXDAwMSBcMDAxKFwwMTYyXDAzMy5nb29nbCIKKyAgImUucHJvdG9idWYuRmllbGQuS2luZFwwMjI3XG5cMDEzY2FyZGluYWxpdHlcMDMwXDAwMiBcMDAxIgorICAiKFwwMTYyXCIuZ29vZ2xlLnByb3RvYnVmLkZpZWxkLkNhcmRpbmFsaXR5XDAyMlwwMTYiCisgICJcblwwMDZudW1iZXJcMDMwXDAwMyBcMDAxKFwwMDVcMDIyXDAxNFxuXDAwNG5hbWVcMDMwXDAwNCBcMDAxKFx0XDAyMlwwMjBcblwwMTB0eXBlX3VybCIKKyAgIlwwMzBcMDA2IFwwMDEoXHRcMDIyXDAyM1xuXDAxM29uZW9mX2luZGV4XDAzMFwwMDcgXDAwMShcMDA1XDAyMlwwMTZcblwwMDZwYWNrZWRcMDMwXDAxMCAiCisgICJcMDAxKFwwMTBcMDIyKFxuXDAwN29wdGlvbnNcMDMwXHQgXDAwMyhcMDEzMlwwMjcuZ29vZ2xlLnByb3RvYnVmLk8iCisgICJwdGlvblwwMjJcMDIxXG5cdGpzb25fbmFtZVwwMzBcbiBcMDAxKFx0XDAyMlwwMjVcblxyZGVmYXVsdF92YWx1IgorICAiZVwwMzBcMDEzIFwwMDEoXHRcIlwzMTBcMDAyXG5cMDA0S2luZFwwMjJcMDIwXG5cMDE0VFlQRV9VTktOT1dOXDAyMFwwMDBcMDIyXDAxN1xuXDAxM1RZIgorICAiUEVfRE9VQkxFXDAyMFwwMDFcMDIyXDAxNlxuXG5UWVBFX0ZMT0FUXDAyMFwwMDJcMDIyXDAxNlxuXG5UWVBFX0lOVDYiCisgICI0XDAyMFwwMDNcMDIyXDAxN1xuXDAxM1RZUEVfVUlOVDY0XDAyMFwwMDRcMDIyXDAxNlxuXG5UWVBFX0lOVDMyXDAyMFwwMDVcMDIyXDAyMFxuXDAxNCIKKyAgIlRZUEVfRklYRUQ2NFwwMjBcMDA2XDAyMlwwMjBcblwwMTRUWVBFX0ZJWEVEMzJcMDIwXDAwN1wwMjJcclxuXHRUWVBFIgorICAiX0JPT0xcMDIwXDAxMFwwMjJcMDE3XG5cMDEzVFlQRV9TVFJJTkdcMDIwXHRcMDIyXDAxNlxuXG5UWVBFX0dST1VQXDAyMFxuIgorICAiXDAyMlwwMjBcblwwMTRUWVBFX01FU1NBR0VcMDIwXDAxM1wwMjJcMDE2XG5cblRZUEVfQllURVNcMDIwXDAxNFwwMjJcMDE3XG5cMDEzVFkiCisgICJQRV9VSU5UMzJcMDIwXHJcMDIyXHJcblx0VFlQRV9FTlVNXDAyMFwwMTZcMDIyXDAyMVxuXHJUWVBFX1NGSVhFIgorICAiRDMyXDAyMFwwMTdcMDIyXDAyMVxuXHJUWVBFX1NGSVhFRDY0XDAyMFwwMjBcMDIyXDAxN1xuXDAxM1RZUEVfU0lOVDMyXDAyMCIKKyAgIlwwMjFcMDIyXDAxN1xuXDAxM1RZUEVfU0lOVDY0XDAyMFwwMjJcInRcblwwMTNDYXJkaW5hbGl0eVwwMjJcMDI3XG5cMDIzQ0FSIgorICAiRElOQUxJVFlfVU5LTk9XTlwwMjBcMDAwXDAyMlwwMzBcblwwMjRDQVJESU5BTElUWV9PUFRJT04iCisgICJBTFwwMjBcMDAxXDAyMlwwMzBcblwwMjRDQVJESU5BTElUWV9SRVFVSVJFRFwwMjBcMDAyXDAyMlwwMzBcblwwMjRDQVJESU4iCisgICJBTElUWV9SRVBFQVRFRFwwMjBcMDAzXCJcMzE2XDAwMVxuXDAwNEVudW1cMDIyXDAxNFxuXDAwNG5hbWVcMDMwXDAwMSBcMDAxKFx0XDAyMiIKKyAgIi1cblx0ZW51bXZhbHVlXDAzMFwwMDIgXDAwMyhcMDEzMlwwMzIuZ29vZ2xlLnByb3RvYnVmLkVudSIKKyAgIm1WYWx1ZVwwMjIoXG5cMDA3b3B0aW9uc1wwMzBcMDAzIFwwMDMoXDAxMzJcMDI3Lmdvb2dsZS5wcm90b2J1IgorICAiZi5PcHRpb25cMDIyNlxuXDAxNnNvdXJjZV9jb250ZXh0XDAzMFwwMDQgXDAwMShcMDEzMlwwMzYuZ29vZ2wiCisgICJlLnByb3RvYnVmLlNvdXJjZUNvbnRleHRcMDIyXCdcblwwMDZzeW50YXhcMDMwXDAwNSBcMDAxKFwwMTYiCisgICIyXDAyNy5nb29nbGUucHJvdG9idWYuU3ludGF4XCJTXG5cdEVudW1WYWx1ZVwwMjJcMDE0IgorICAiXG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyXDAxNlxuXDAwNm51bWJlclwwMzBcMDAyIFwwMDEoXDAwNVwwMjIoXG5cMDA3b3B0aW9uc1wwMzAiCisgICJcMDAzIFwwMDMoXDAxMzJcMDI3Lmdvb2dsZS5wcm90b2J1Zi5PcHRpb25cIjtcblwwMDZPcHRpb24iCisgICJcMDIyXDAxNFxuXDAwNG5hbWVcMDMwXDAwMSBcMDAxKFx0XDAyMiNcblwwMDV2YWx1ZVwwMzBcMDAyIFwwMDEoXDAxMzJcMDI0Lmdvb2dsZS5wIgorICAicm90b2J1Zi5BbnkqLlxuXDAwNlN5bnRheFwwMjJcMDIxXG5cclNZTlRBWF9QUk9UTzJcMDIwXDAwMCIKKyAgIlwwMjJcMDIxXG5cclNZTlRBWF9QUk9UTzNcMDIwXDAwMUJ7XG5cMDIzY29tLmdvb2dsZS5wcm90b2IiCisgICJ1ZkJcdFR5cGVQcm90b1BcMDAxWi1nb29nbGUuZ29sYW5nLm9yZy9wcm90byIKKyAgImJ1Zi90eXBlcy9rbm93bi90eXBlcGJcMzcwXDAwMVwwMDFcMjQyXDAwMlwwMDNHUEJcMjUyXDAwMlwwMzZHb29nbGUiCisgICIuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiXDAwNnByb3RvMyIKKyAgOworc3RhdGljIGNvbnN0IDo6X3BiaTo6RGVzY3JpcHRvclRhYmxlKiBjb25zdCBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvX2RlcHNbMl0gPSB7CisgICY6OmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZhbnlfMmVwcm90bywKKyAgJjo6ZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnNvdXJjZV81ZmNvbnRleHRfMmVwcm90bywKK307CitzdGF0aWMgOjpfcGJpOjpvbmNlX2ZsYWcgZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90b19vbmNlOworY29uc3QgOjpfcGJpOjpEZXNjcmlwdG9yVGFibGUgZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90byA9IHsKKyAgICBmYWxzZSwgZmFsc2UsIDE1OTIsIGRlc2NyaXB0b3JfdGFibGVfcHJvdG9kZWZfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG8sCisgICAgImdvb2dsZS9wcm90b2J1Zi90eXBlLnByb3RvIiwKKyAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90b19vbmNlLCBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvX2RlcHMsIDIsIDUsCisgICAgc2NoZW1hcywgZmlsZV9kZWZhdWx0X2luc3RhbmNlcywgVGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG86Om9mZnNldHMsCisgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90bywgZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvLAorICAgIGZpbGVfbGV2ZWxfc2VydmljZV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90bywKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfV0VBSyBjb25zdCA6Ol9wYmk6OkRlc2NyaXB0b3JUYWJsZSogZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90b19nZXR0ZXIoKSB7CisgIHJldHVybiAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90bzsKK30KKworLy8gRm9yY2UgcnVubmluZyBBZGREZXNjcmlwdG9ycygpIGF0IGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gdGltZS4KK1BST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMiBzdGF0aWMgOjpfcGJpOjpBZGREZXNjcmlwdG9yc1J1bm5lciBkeW5hbWljX2luaXRfZHVtbXlfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG8oJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG8pOworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvciogRmllbGRfS2luZF9kZXNjcmlwdG9yKCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFzc2lnbkRlc2NyaXB0b3JzKCZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvKTsKKyAgcmV0dXJuIGZpbGVfbGV2ZWxfZW51bV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90b1swXTsKK30KK2Jvb2wgRmllbGRfS2luZF9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgIGNhc2UgNDoKKyAgICBjYXNlIDU6CisgICAgY2FzZSA2OgorICAgIGNhc2UgNzoKKyAgICBjYXNlIDg6CisgICAgY2FzZSA5OgorICAgIGNhc2UgMTA6CisgICAgY2FzZSAxMToKKyAgICBjYXNlIDEyOgorICAgIGNhc2UgMTM6CisgICAgY2FzZSAxNDoKKyAgICBjYXNlIDE1OgorICAgIGNhc2UgMTY6CisgICAgY2FzZSAxNzoKKyAgICBjYXNlIDE4OgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisjaWYgKF9fY3BsdXNwbHVzIDwgMjAxNzAzKSAmJiAoIWRlZmluZWQoX01TQ19WRVIpIHx8IChfTVNDX1ZFUiA+PSAxOTAwICYmIF9NU0NfVkVSIDwgMTkxMikpCitjb25zdGV4cHIgRmllbGRfS2luZCBGaWVsZDo6VFlQRV9VTktOT1dOOworY29uc3RleHByIEZpZWxkX0tpbmQgRmllbGQ6OlRZUEVfRE9VQkxFOworY29uc3RleHByIEZpZWxkX0tpbmQgRmllbGQ6OlRZUEVfRkxPQVQ7Citjb25zdGV4cHIgRmllbGRfS2luZCBGaWVsZDo6VFlQRV9JTlQ2NDsKK2NvbnN0ZXhwciBGaWVsZF9LaW5kIEZpZWxkOjpUWVBFX1VJTlQ2NDsKK2NvbnN0ZXhwciBGaWVsZF9LaW5kIEZpZWxkOjpUWVBFX0lOVDMyOworY29uc3RleHByIEZpZWxkX0tpbmQgRmllbGQ6OlRZUEVfRklYRUQ2NDsKK2NvbnN0ZXhwciBGaWVsZF9LaW5kIEZpZWxkOjpUWVBFX0ZJWEVEMzI7Citjb25zdGV4cHIgRmllbGRfS2luZCBGaWVsZDo6VFlQRV9CT09MOworY29uc3RleHByIEZpZWxkX0tpbmQgRmllbGQ6OlRZUEVfU1RSSU5HOworY29uc3RleHByIEZpZWxkX0tpbmQgRmllbGQ6OlRZUEVfR1JPVVA7Citjb25zdGV4cHIgRmllbGRfS2luZCBGaWVsZDo6VFlQRV9NRVNTQUdFOworY29uc3RleHByIEZpZWxkX0tpbmQgRmllbGQ6OlRZUEVfQllURVM7Citjb25zdGV4cHIgRmllbGRfS2luZCBGaWVsZDo6VFlQRV9VSU5UMzI7Citjb25zdGV4cHIgRmllbGRfS2luZCBGaWVsZDo6VFlQRV9FTlVNOworY29uc3RleHByIEZpZWxkX0tpbmQgRmllbGQ6OlRZUEVfU0ZJWEVEMzI7Citjb25zdGV4cHIgRmllbGRfS2luZCBGaWVsZDo6VFlQRV9TRklYRUQ2NDsKK2NvbnN0ZXhwciBGaWVsZF9LaW5kIEZpZWxkOjpUWVBFX1NJTlQzMjsKK2NvbnN0ZXhwciBGaWVsZF9LaW5kIEZpZWxkOjpUWVBFX1NJTlQ2NDsKK2NvbnN0ZXhwciBGaWVsZF9LaW5kIEZpZWxkOjpLaW5kX01JTjsKK2NvbnN0ZXhwciBGaWVsZF9LaW5kIEZpZWxkOjpLaW5kX01BWDsKK2NvbnN0ZXhwciBpbnQgRmllbGQ6OktpbmRfQVJSQVlTSVpFOworI2VuZGlmICAvLyAoX19jcGx1c3BsdXMgPCAyMDE3MDMpICYmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDE5MDAgJiYgX01TQ19WRVIgPCAxOTEyKSkKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvciogRmllbGRfQ2FyZGluYWxpdHlfZGVzY3JpcHRvcigpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBc3NpZ25EZXNjcmlwdG9ycygmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90byk7CisgIHJldHVybiBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG9bMV07Cit9Citib29sIEZpZWxkX0NhcmRpbmFsaXR5X0lzVmFsaWQoaW50IHZhbHVlKSB7CisgIHN3aXRjaCAodmFsdWUpIHsKKyAgICBjYXNlIDA6CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICBjYXNlIDM6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZiAoX19jcGx1c3BsdXMgPCAyMDE3MDMpICYmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID49IDE5MDAgJiYgX01TQ19WRVIgPCAxOTEyKSkKK2NvbnN0ZXhwciBGaWVsZF9DYXJkaW5hbGl0eSBGaWVsZDo6Q0FSRElOQUxJVFlfVU5LTk9XTjsKK2NvbnN0ZXhwciBGaWVsZF9DYXJkaW5hbGl0eSBGaWVsZDo6Q0FSRElOQUxJVFlfT1BUSU9OQUw7Citjb25zdGV4cHIgRmllbGRfQ2FyZGluYWxpdHkgRmllbGQ6OkNBUkRJTkFMSVRZX1JFUVVJUkVEOworY29uc3RleHByIEZpZWxkX0NhcmRpbmFsaXR5IEZpZWxkOjpDQVJESU5BTElUWV9SRVBFQVRFRDsKK2NvbnN0ZXhwciBGaWVsZF9DYXJkaW5hbGl0eSBGaWVsZDo6Q2FyZGluYWxpdHlfTUlOOworY29uc3RleHByIEZpZWxkX0NhcmRpbmFsaXR5IEZpZWxkOjpDYXJkaW5hbGl0eV9NQVg7Citjb25zdGV4cHIgaW50IEZpZWxkOjpDYXJkaW5hbGl0eV9BUlJBWVNJWkU7CisjZW5kaWYgIC8vIChfX2NwbHVzcGx1cyA8IDIwMTcwMykgJiYgKCFkZWZpbmVkKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPj0gMTkwMCAmJiBfTVNDX1ZFUiA8IDE5MTIpKQorY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1EZXNjcmlwdG9yKiBTeW50YXhfZGVzY3JpcHRvcigpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBc3NpZ25EZXNjcmlwdG9ycygmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90byk7CisgIHJldHVybiBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG9bMl07Cit9Citib29sIFN5bnRheF9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFR5cGU6Ol9JbnRlcm5hbCB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQmIHNvdXJjZV9jb250ZXh0KGNvbnN0IFR5cGUqIG1zZyk7Cit9OworCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCYKK1R5cGU6Ol9JbnRlcm5hbDo6c291cmNlX2NvbnRleHQoY29uc3QgVHlwZSogbXNnKSB7CisgIHJldHVybiAqbXNnLT5faW1wbF8uc291cmNlX2NvbnRleHRfOworfQordm9pZCBUeXBlOjpjbGVhcl9zb3VyY2VfY29udGV4dCgpIHsKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIgJiYgX2ltcGxfLnNvdXJjZV9jb250ZXh0XyAhPSBudWxscHRyKSB7CisgICAgZGVsZXRlIF9pbXBsXy5zb3VyY2VfY29udGV4dF87CisgIH0KKyAgX2ltcGxfLnNvdXJjZV9jb250ZXh0XyA9IG51bGxwdHI7Cit9CitUeXBlOjpUeXBlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlR5cGUpCit9CitUeXBlOjpUeXBlKGNvbnN0IFR5cGUmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIFR5cGUqIGNvbnN0IF90aGlzID0gdGhpczsgKHZvaWQpX3RoaXM7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8uZmllbGRzXyl7ZnJvbS5faW1wbF8uZmllbGRzX30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5vbmVvZnNfKXtmcm9tLl9pbXBsXy5vbmVvZnNffQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKXtmcm9tLl9pbXBsXy5vcHRpb25zX30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnNvdXJjZV9jb250ZXh0Xyl7bnVsbHB0cn0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zeW50YXhfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF9uYW1lKCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW1wbF8ubmFtZV8uU2V0KGZyb20uX2ludGVybmFsX25hbWUoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfc291cmNlX2NvbnRleHQoKSkgeworICAgIF90aGlzLT5faW1wbF8uc291cmNlX2NvbnRleHRfID0gbmV3IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0KCpmcm9tLl9pbXBsXy5zb3VyY2VfY29udGV4dF8pOworICB9CisgIF90aGlzLT5faW1wbF8uc3ludGF4XyA9IGZyb20uX2ltcGxfLnN5bnRheF87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5UeXBlKQorfQorCitpbmxpbmUgdm9pZCBUeXBlOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5maWVsZHNfKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5vbmVvZnNfKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXyl7YXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubmFtZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zb3VyY2VfY29udGV4dF8pe251bGxwdHJ9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uc3ludGF4Xyl7MH0KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICB9OworICBfaW1wbF8ubmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCit9CisKK1R5cGU6On5UeXBlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuVHlwZSkKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIFR5cGU6OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy5maWVsZHNfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5vbmVvZnNfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5vcHRpb25zXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworICBfaW1wbF8ubmFtZV8uRGVzdHJveSgpOworICBpZiAodGhpcyAhPSBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkpIGRlbGV0ZSBfaW1wbF8uc291cmNlX2NvbnRleHRfOworfQorCit2b2lkIFR5cGU6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIFR5cGU6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlR5cGUpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy5maWVsZHNfLkNsZWFyKCk7CisgIF9pbXBsXy5vbmVvZnNfLkNsZWFyKCk7CisgIF9pbXBsXy5vcHRpb25zXy5DbGVhcigpOworICBfaW1wbF8ubmFtZV8uQ2xlYXJUb0VtcHR5KCk7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyICYmIF9pbXBsXy5zb3VyY2VfY29udGV4dF8gIT0gbnVsbHB0cikgeworICAgIGRlbGV0ZSBfaW1wbF8uc291cmNlX2NvbnRleHRfOworICB9CisgIF9pbXBsXy5zb3VyY2VfY29udGV4dF8gPSBudWxscHRyOworICBfaW1wbF8uc3ludGF4XyA9IDA7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogVHlwZTo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxMCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgQ0hLXyg6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLlR5cGUubmFtZSIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkIGZpZWxkcyA9IDI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxOCkpIHsKKyAgICAgICAgICBwdHIgLT0gMTsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9hZGRfZmllbGRzKCksIHB0cik7CisgICAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgICBpZiAoIWN0eC0+RGF0YUF2YWlsYWJsZShwdHIpKSBicmVhazsKKyAgICAgICAgICB9IHdoaWxlICg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkV4cGVjdFRhZzwxOD4ocHRyKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgc3RyaW5nIG9uZW9mcyA9IDM7CisgICAgICBjYXNlIDM6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAyNikpIHsKKyAgICAgICAgICBwdHIgLT0gMTsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX2FkZF9vbmVvZnMoKTsKKyAgICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgQ0hLXyg6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLlR5cGUub25lb2ZzIikpOworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8MjY+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT3B0aW9uIG9wdGlvbnMgPSA0OworICAgICAgY2FzZSA0OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMzQpKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfYWRkX29wdGlvbnMoKSwgcHRyKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDM0PihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQgc291cmNlX2NvbnRleHQgPSA1OworICAgICAgY2FzZSA1OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNDIpKSB7CisgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX211dGFibGVfc291cmNlX2NvbnRleHQoKSwgcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gLmdvb2dsZS5wcm90b2J1Zi5TeW50YXggc3ludGF4ID0gNjsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDQ4KSkgeworICAgICAgICAgIHVpbnQ2NF90IHZhbCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICBfaW50ZXJuYWxfc2V0X3N5bnRheChzdGF0aWNfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3ludGF4Pih2YWwpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBUeXBlOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5UeXBlKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKCF0aGlzLT5faW50ZXJuYWxfbmFtZSgpLmVtcHR5KCkpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKAorICAgICAgdGhpcy0+X2ludGVybmFsX25hbWUoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX25hbWUoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLlR5cGUubmFtZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDEsIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCksIHRhcmdldCk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkIGZpZWxkcyA9IDI7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9maWVsZHNfc2l6ZSgpKTsgaSA8IG47IGkrKykgeworICAgIGNvbnN0IGF1dG8mIHJlcGZpZWxkID0gdGhpcy0+X2ludGVybmFsX2ZpZWxkcyhpKTsKKyAgICB0YXJnZXQgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoMiwgcmVwZmllbGQsIHJlcGZpZWxkLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIG9uZW9mcyA9IDM7CisgIGZvciAoaW50IGkgPSAwLCBuID0gdGhpcy0+X2ludGVybmFsX29uZW9mc19zaXplKCk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiBzID0gdGhpcy0+X2ludGVybmFsX29uZW9mcyhpKTsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKAorICAgICAgcy5kYXRhKCksIHN0YXRpY19jYXN0PGludD4ocy5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLlR5cGUub25lb2ZzIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZygzLCBzLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PcHRpb24gb3B0aW9ucyA9IDQ7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9vcHRpb25zX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9vcHRpb25zKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg0LCByZXBmaWVsZCwgcmVwZmllbGQuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICAvLyAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQgc291cmNlX2NvbnRleHQgPSA1OworICBpZiAodGhpcy0+X2ludGVybmFsX2hhc19zb3VyY2VfY29udGV4dCgpKSB7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSg1LCBfSW50ZXJuYWw6OnNvdXJjZV9jb250ZXh0KHRoaXMpLAorICAgICAgICBfSW50ZXJuYWw6OnNvdXJjZV9jb250ZXh0KHRoaXMpLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgLy8gLmdvb2dsZS5wcm90b2J1Zi5TeW50YXggc3ludGF4ID0gNjsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9zeW50YXgoKSAhPSAwKSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bVRvQXJyYXkoCisgICAgICA2LCB0aGlzLT5faW50ZXJuYWxfc3ludGF4KCksIHRhcmdldCk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuVHlwZSkKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IFR5cGU6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuVHlwZSkKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGQgZmllbGRzID0gMjsKKyAgdG90YWxfc2l6ZSArPSAxVUwgKiB0aGlzLT5faW50ZXJuYWxfZmllbGRzX3NpemUoKTsKKyAgZm9yIChjb25zdCBhdXRvJiBtc2cgOiB0aGlzLT5faW1wbF8uZmllbGRzXykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKG1zZyk7CisgIH0KKworICAvLyByZXBlYXRlZCBzdHJpbmcgb25lb2ZzID0gMzsKKyAgdG90YWxfc2l6ZSArPSAxICoKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RnJvbUludFNpemUoX2ltcGxfLm9uZW9mc18uc2l6ZSgpKTsKKyAgZm9yIChpbnQgaSA9IDAsIG4gPSBfaW1wbF8ub25lb2ZzXy5zaXplKCk7IGkgPCBuOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICBfaW1wbF8ub25lb2ZzXy5HZXQoaSkpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PcHRpb24gb3B0aW9ucyA9IDQ7CisgIHRvdGFsX3NpemUgKz0gMVVMICogdGhpcy0+X2ludGVybmFsX29wdGlvbnNfc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy5vcHRpb25zXykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKG1zZyk7CisgIH0KKworICAvLyBzdHJpbmcgbmFtZSA9IDE7CisgIGlmICghdGhpcy0+X2ludGVybmFsX25hbWUoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkpOworICB9CisKKyAgLy8gLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb250ZXh0IHNvdXJjZV9jb250ZXh0ID0gNTsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9oYXNfc291cmNlX2NvbnRleHQoKSkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZSgKKyAgICAgICAgKl9pbXBsXy5zb3VyY2VfY29udGV4dF8pOworICB9CisKKyAgLy8gLmdvb2dsZS5wcm90b2J1Zi5TeW50YXggc3ludGF4ID0gNjsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9zeW50YXgoKSAhPSAwKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPl9pbnRlcm5hbF9zeW50YXgoKSk7CisgIH0KKworICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBUeXBlOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgVHlwZTo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpUeXBlOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBUeXBlOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8VHlwZSo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgVHlwZSY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlR5cGUpCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfdGhpcy0+X2ltcGxfLmZpZWxkc18uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLmZpZWxkc18pOworICBfdGhpcy0+X2ltcGxfLm9uZW9mc18uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLm9uZW9mc18pOworICBfdGhpcy0+X2ltcGxfLm9wdGlvbnNfLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5vcHRpb25zXyk7CisgIGlmICghZnJvbS5faW50ZXJuYWxfbmFtZSgpLmVtcHR5KCkpIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF9uYW1lKGZyb20uX2ludGVybmFsX25hbWUoKSk7CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc19zb3VyY2VfY29udGV4dCgpKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9tdXRhYmxlX3NvdXJjZV9jb250ZXh0KCktPjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0OjpNZXJnZUZyb20oCisgICAgICAgIGZyb20uX2ludGVybmFsX3NvdXJjZV9jb250ZXh0KCkpOworICB9CisgIGlmIChmcm9tLl9pbnRlcm5hbF9zeW50YXgoKSAhPSAwKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfc3ludGF4KGZyb20uX2ludGVybmFsX3N5bnRheCgpKTsKKyAgfQorICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBUeXBlOjpDb3B5RnJvbShjb25zdCBUeXBlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5UeXBlKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgVHlwZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVHlwZTo6SW50ZXJuYWxTd2FwKFR5cGUqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgYXV0byogbGhzX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGF1dG8qIHJoc19hcmVuYSA9IG90aGVyLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX2ltcGxfLmZpZWxkc18uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLmZpZWxkc18pOworICBfaW1wbF8ub25lb2ZzXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8ub25lb2ZzXyk7CisgIF9pbXBsXy5vcHRpb25zXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW1wbF8ub3B0aW9uc18pOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLm5hbWVfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5uYW1lXywgcmhzX2FyZW5hCisgICk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6bWVtc3dhcDwKKyAgICAgIFBST1RPQlVGX0ZJRUxEX09GRlNFVChUeXBlLCBfaW1wbF8uc3ludGF4XykKKyAgICAgICsgc2l6ZW9mKFR5cGU6Ol9pbXBsXy5zeW50YXhfKQorICAgICAgLSBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoVHlwZSwgX2ltcGxfLnNvdXJjZV9jb250ZXh0Xyk+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8uc291cmNlX2NvbnRleHRfKSwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmb3RoZXItPl9pbXBsXy5zb3VyY2VfY29udGV4dF8pKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIFR5cGU6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG9bMF0pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIEZpZWxkOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKK307CisKK0ZpZWxkOjpGaWVsZCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWVsZCkKK30KK0ZpZWxkOjpGaWVsZChjb25zdCBGaWVsZCYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgRmllbGQqIGNvbnN0IF90aGlzID0gdGhpczsgKHZvaWQpX3RoaXM7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8ub3B0aW9uc18pe2Zyb20uX2ltcGxfLm9wdGlvbnNffQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm5hbWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8udHlwZV91cmxfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uanNvbl9uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmRlZmF1bHRfdmFsdWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ua2luZF8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5jYXJkaW5hbGl0eV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5udW1iZXJfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ub25lb2ZfaW5kZXhfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ucGFja2VkXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8ubmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmICghZnJvbS5faW50ZXJuYWxfbmFtZSgpLmVtcHR5KCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLm5hbWVfLlNldChmcm9tLl9pbnRlcm5hbF9uYW1lKCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICBfaW1wbF8udHlwZV91cmxfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLnR5cGVfdXJsXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF90eXBlX3VybCgpLmVtcHR5KCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLnR5cGVfdXJsXy5TZXQoZnJvbS5faW50ZXJuYWxfdHlwZV91cmwoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIF9pbXBsXy5qc29uX25hbWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLmpzb25fbmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmICghZnJvbS5faW50ZXJuYWxfanNvbl9uYW1lKCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW1wbF8uanNvbl9uYW1lXy5TZXQoZnJvbS5faW50ZXJuYWxfanNvbl9uYW1lKCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICBfaW1wbF8uZGVmYXVsdF92YWx1ZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8uZGVmYXVsdF92YWx1ZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmICghZnJvbS5faW50ZXJuYWxfZGVmYXVsdF92YWx1ZSgpLmVtcHR5KCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLmRlZmF1bHRfdmFsdWVfLlNldChmcm9tLl9pbnRlcm5hbF9kZWZhdWx0X3ZhbHVlKCksIAorICAgICAgX3RoaXMtPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorICA6Om1lbWNweSgmX2ltcGxfLmtpbmRfLCAmZnJvbS5faW1wbF8ua2luZF8sCisgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLnBhY2tlZF8pIC0KKyAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLmtpbmRfKSkgKyBzaXplb2YoX2ltcGxfLnBhY2tlZF8pKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpZWxkKQorfQorCitpbmxpbmUgdm9pZCBGaWVsZDo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8ub3B0aW9uc18pe2FyZW5hfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm5hbWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8udHlwZV91cmxfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uanNvbl9uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLmRlZmF1bHRfdmFsdWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ua2luZF8pezB9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uY2FyZGluYWxpdHlfKXswfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm51bWJlcl8pezB9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ub25lb2ZfaW5kZXhfKXswfQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnBhY2tlZF8pe2ZhbHNlfQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgIH07CisgIF9pbXBsXy5uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgX2ltcGxfLnR5cGVfdXJsXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy50eXBlX3VybF8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIF9pbXBsXy5qc29uX25hbWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLmpzb25fbmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIF9pbXBsXy5kZWZhdWx0X3ZhbHVlXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5kZWZhdWx0X3ZhbHVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKK30KKworRmllbGQ6On5GaWVsZCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpZWxkKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgRmllbGQ6OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy5vcHRpb25zXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworICBfaW1wbF8ubmFtZV8uRGVzdHJveSgpOworICBfaW1wbF8udHlwZV91cmxfLkRlc3Ryb3koKTsKKyAgX2ltcGxfLmpzb25fbmFtZV8uRGVzdHJveSgpOworICBfaW1wbF8uZGVmYXVsdF92YWx1ZV8uRGVzdHJveSgpOworfQorCit2b2lkIEZpZWxkOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIF9pbXBsXy5fY2FjaGVkX3NpemVfLlNldChzaXplKTsKK30KKwordm9pZCBGaWVsZDo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGQpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy5vcHRpb25zXy5DbGVhcigpOworICBfaW1wbF8ubmFtZV8uQ2xlYXJUb0VtcHR5KCk7CisgIF9pbXBsXy50eXBlX3VybF8uQ2xlYXJUb0VtcHR5KCk7CisgIF9pbXBsXy5qc29uX25hbWVfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8uZGVmYXVsdF92YWx1ZV8uQ2xlYXJUb0VtcHR5KCk7CisgIDo6bWVtc2V0KCZfaW1wbF8ua2luZF8sIDAsIHN0YXRpY19jYXN0PHNpemVfdD4oCisgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmX2ltcGxfLnBhY2tlZF8pIC0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8ua2luZF8pKSArIHNpemVvZihfaW1wbF8ucGFja2VkXykpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIEZpZWxkOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIC5nb29nbGUucHJvdG9idWYuRmllbGQuS2luZCBraW5kID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDgpKSB7CisgICAgICAgICAgdWludDY0X3QgdmFsID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgIF9pbnRlcm5hbF9zZXRfa2luZChzdGF0aWNfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRfS2luZD4odmFsKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gLmdvb2dsZS5wcm90b2J1Zi5GaWVsZC5DYXJkaW5hbGl0eSBjYXJkaW5hbGl0eSA9IDI7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxNikpIHsKKyAgICAgICAgICB1aW50NjRfdCB2YWwgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgX2ludGVybmFsX3NldF9jYXJkaW5hbGl0eShzdGF0aWNfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRfQ2FyZGluYWxpdHk+KHZhbCkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIGludDMyIG51bWJlciA9IDM7CisgICAgICBjYXNlIDM6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAyNCkpIHsKKyAgICAgICAgICBfaW1wbF8ubnVtYmVyXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDMyKCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBzdHJpbmcgbmFtZSA9IDQ7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAzNCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgQ0hLXyg6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkLm5hbWUiKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gc3RyaW5nIHR5cGVfdXJsID0gNjsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDUwKSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfdHlwZV91cmwoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgQ0hLXyg6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkLnR5cGVfdXJsIikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIGludDMyIG9uZW9mX2luZGV4ID0gNzsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDU2KSkgeworICAgICAgICAgIF9pbXBsXy5vbmVvZl9pbmRleF8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQzMigmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gYm9vbCBwYWNrZWQgPSA4OworICAgICAgY2FzZSA4OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gNjQpKSB7CisgICAgICAgICAgX2ltcGxfLnBhY2tlZF8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQ2NCgmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PcHRpb24gb3B0aW9ucyA9IDk7CisgICAgICBjYXNlIDk6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA3NCkpIHsKKyAgICAgICAgICBwdHIgLT0gMTsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgICAgIHB0ciA9IGN0eC0+UGFyc2VNZXNzYWdlKF9pbnRlcm5hbF9hZGRfb3B0aW9ucygpLCBwdHIpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8NzQ+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHN0cmluZyBqc29uX25hbWUgPSAxMDsKKyAgICAgIGNhc2UgMTA6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA4MikpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX2pzb25fbmFtZSgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICBDSEtfKDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuRmllbGQuanNvbl9uYW1lIikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gMTE7CisgICAgICBjYXNlIDExOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gOTApKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV9kZWZhdWx0X3ZhbHVlKCk7CisgICAgICAgICAgcHRyID0gOjpfcGJpOjpJbmxpbmVHcmVlZHlTdHJpbmdQYXJzZXIoc3RyLCBwdHIsIGN0eCk7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgIENIS18oOjpfcGJpOjpWZXJpZnlVVEY4KHN0ciwgImdvb2dsZS5wcm90b2J1Zi5GaWVsZC5kZWZhdWx0X3ZhbHVlIikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIEZpZWxkOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZCkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkLktpbmQga2luZCA9IDE7CisgIGlmICh0aGlzLT5faW50ZXJuYWxfa2luZCgpICE9IDApIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKKyAgICAgIDEsIHRoaXMtPl9pbnRlcm5hbF9raW5kKCksIHRhcmdldCk7CisgIH0KKworICAvLyAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkLkNhcmRpbmFsaXR5IGNhcmRpbmFsaXR5ID0gMjsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9jYXJkaW5hbGl0eSgpICE9IDApIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKKyAgICAgIDIsIHRoaXMtPl9pbnRlcm5hbF9jYXJkaW5hbGl0eSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gaW50MzIgbnVtYmVyID0gMzsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9udW1iZXIoKSAhPSAwKSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDMsIHRoaXMtPl9pbnRlcm5hbF9udW1iZXIoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHN0cmluZyBuYW1lID0gNDsKKyAgaWYgKCF0aGlzLT5faW50ZXJuYWxfbmFtZSgpLmVtcHR5KCkpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKAorICAgICAgdGhpcy0+X2ludGVybmFsX25hbWUoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX25hbWUoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkLm5hbWUiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICA0LCB0aGlzLT5faW50ZXJuYWxfbmFtZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gc3RyaW5nIHR5cGVfdXJsID0gNjsKKyAgaWYgKCF0aGlzLT5faW50ZXJuYWxfdHlwZV91cmwoKS5lbXB0eSgpKSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZygKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF90eXBlX3VybCgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pih0aGlzLT5faW50ZXJuYWxfdHlwZV91cmwoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkLnR5cGVfdXJsIik7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgICAgNiwgdGhpcy0+X2ludGVybmFsX3R5cGVfdXJsKCksIHRhcmdldCk7CisgIH0KKworICAvLyBpbnQzMiBvbmVvZl9pbmRleCA9IDc7CisgIGlmICh0aGlzLT5faW50ZXJuYWxfb25lb2ZfaW5kZXgoKSAhPSAwKSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDcsIHRoaXMtPl9pbnRlcm5hbF9vbmVvZl9pbmRleCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gYm9vbCBwYWNrZWQgPSA4OworICBpZiAodGhpcy0+X2ludGVybmFsX3BhY2tlZCgpICE9IDApIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSg4LCB0aGlzLT5faW50ZXJuYWxfcGFja2VkKCksIHRhcmdldCk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk9wdGlvbiBvcHRpb25zID0gOTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwKKyAgICAgIG4gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4odGhpcy0+X2ludGVybmFsX29wdGlvbnNfc2l6ZSgpKTsgaSA8IG47IGkrKykgeworICAgIGNvbnN0IGF1dG8mIHJlcGZpZWxkID0gdGhpcy0+X2ludGVybmFsX29wdGlvbnMoaSk7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICAgIEludGVybmFsV3JpdGVNZXNzYWdlKDksIHJlcGZpZWxkLCByZXBmaWVsZC5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIHN0cmluZyBqc29uX25hbWUgPSAxMDsKKyAgaWYgKCF0aGlzLT5faW50ZXJuYWxfanNvbl9uYW1lKCkuZW1wdHkoKSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICB0aGlzLT5faW50ZXJuYWxfanNvbl9uYW1lKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9qc29uX25hbWUoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkLmpzb25fbmFtZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDEwLCB0aGlzLT5faW50ZXJuYWxfanNvbl9uYW1lKCksIHRhcmdldCk7CisgIH0KKworICAvLyBzdHJpbmcgZGVmYXVsdF92YWx1ZSA9IDExOworICBpZiAoIXRoaXMtPl9pbnRlcm5hbF9kZWZhdWx0X3ZhbHVlKCkuZW1wdHkoKSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICB0aGlzLT5faW50ZXJuYWxfZGVmYXVsdF92YWx1ZSgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pih0aGlzLT5faW50ZXJuYWxfZGVmYXVsdF92YWx1ZSgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGQuZGVmYXVsdF92YWx1ZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDExLCB0aGlzLT5faW50ZXJuYWxfZGVmYXVsdF92YWx1ZSgpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkKQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgRmllbGQ6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGQpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk9wdGlvbiBvcHRpb25zID0gOTsKKyAgdG90YWxfc2l6ZSArPSAxVUwgKiB0aGlzLT5faW50ZXJuYWxfb3B0aW9uc19zaXplKCk7CisgIGZvciAoY29uc3QgYXV0byYgbXNnIDogdGhpcy0+X2ltcGxfLm9wdGlvbnNfKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUobXNnKTsKKyAgfQorCisgIC8vIHN0cmluZyBuYW1lID0gNDsKKyAgaWYgKCF0aGlzLT5faW50ZXJuYWxfbmFtZSgpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgdGhpcy0+X2ludGVybmFsX25hbWUoKSk7CisgIH0KKworICAvLyBzdHJpbmcgdHlwZV91cmwgPSA2OworICBpZiAoIXRoaXMtPl9pbnRlcm5hbF90eXBlX3VybCgpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgdGhpcy0+X2ludGVybmFsX3R5cGVfdXJsKCkpOworICB9CisKKyAgLy8gc3RyaW5nIGpzb25fbmFtZSA9IDEwOworICBpZiAoIXRoaXMtPl9pbnRlcm5hbF9qc29uX25hbWUoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9qc29uX25hbWUoKSk7CisgIH0KKworICAvLyBzdHJpbmcgZGVmYXVsdF92YWx1ZSA9IDExOworICBpZiAoIXRoaXMtPl9pbnRlcm5hbF9kZWZhdWx0X3ZhbHVlKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICB0aGlzLT5faW50ZXJuYWxfZGVmYXVsdF92YWx1ZSgpKTsKKyAgfQorCisgIC8vIC5nb29nbGUucHJvdG9idWYuRmllbGQuS2luZCBraW5kID0gMTsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9raW5kKCkgIT0gMCkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5faW50ZXJuYWxfa2luZCgpKTsKKyAgfQorCisgIC8vIC5nb29nbGUucHJvdG9idWYuRmllbGQuQ2FyZGluYWxpdHkgY2FyZGluYWxpdHkgPSAyOworICBpZiAodGhpcy0+X2ludGVybmFsX2NhcmRpbmFsaXR5KCkgIT0gMCkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5faW50ZXJuYWxfY2FyZGluYWxpdHkoKSk7CisgIH0KKworICAvLyBpbnQzMiBudW1iZXIgPSAzOworICBpZiAodGhpcy0+X2ludGVybmFsX251bWJlcigpICE9IDApIHsKKyAgICB0b3RhbF9zaXplICs9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZVBsdXNPbmUodGhpcy0+X2ludGVybmFsX251bWJlcigpKTsKKyAgfQorCisgIC8vIGludDMyIG9uZW9mX2luZGV4ID0gNzsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9vbmVvZl9pbmRleCgpICE9IDApIHsKKyAgICB0b3RhbF9zaXplICs9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZVBsdXNPbmUodGhpcy0+X2ludGVybmFsX29uZW9mX2luZGV4KCkpOworICB9CisKKyAgLy8gYm9vbCBwYWNrZWQgPSA4OworICBpZiAodGhpcy0+X2ludGVybmFsX3BhY2tlZCgpICE9IDApIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICB9CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgRmllbGQ6Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBGaWVsZDo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpGaWVsZDo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgRmllbGQ6Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxGaWVsZCo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgRmllbGQmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZCkKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF90aGlzLT5faW1wbF8ub3B0aW9uc18uTWVyZ2VGcm9tKGZyb20uX2ltcGxfLm9wdGlvbnNfKTsKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF9uYW1lKCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X25hbWUoZnJvbS5faW50ZXJuYWxfbmFtZSgpKTsKKyAgfQorICBpZiAoIWZyb20uX2ludGVybmFsX3R5cGVfdXJsKCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X3R5cGVfdXJsKGZyb20uX2ludGVybmFsX3R5cGVfdXJsKCkpOworICB9CisgIGlmICghZnJvbS5faW50ZXJuYWxfanNvbl9uYW1lKCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X2pzb25fbmFtZShmcm9tLl9pbnRlcm5hbF9qc29uX25hbWUoKSk7CisgIH0KKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF9kZWZhdWx0X3ZhbHVlKCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X2RlZmF1bHRfdmFsdWUoZnJvbS5faW50ZXJuYWxfZGVmYXVsdF92YWx1ZSgpKTsKKyAgfQorICBpZiAoZnJvbS5faW50ZXJuYWxfa2luZCgpICE9IDApIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF9raW5kKGZyb20uX2ludGVybmFsX2tpbmQoKSk7CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX2NhcmRpbmFsaXR5KCkgIT0gMCkgeworICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X2NhcmRpbmFsaXR5KGZyb20uX2ludGVybmFsX2NhcmRpbmFsaXR5KCkpOworICB9CisgIGlmIChmcm9tLl9pbnRlcm5hbF9udW1iZXIoKSAhPSAwKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfbnVtYmVyKGZyb20uX2ludGVybmFsX251bWJlcigpKTsKKyAgfQorICBpZiAoZnJvbS5faW50ZXJuYWxfb25lb2ZfaW5kZXgoKSAhPSAwKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfb25lb2ZfaW5kZXgoZnJvbS5faW50ZXJuYWxfb25lb2ZfaW5kZXgoKSk7CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX3BhY2tlZCgpICE9IDApIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF9wYWNrZWQoZnJvbS5faW50ZXJuYWxfcGFja2VkKCkpOworICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIEZpZWxkOjpDb3B5RnJvbShjb25zdCBGaWVsZCYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGQpCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBGaWVsZDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRmllbGQ6OkludGVybmFsU3dhcChGaWVsZCogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBhdXRvKiBsaHNfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgYXV0byogcmhzX2FyZW5hID0gb3RoZXItPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8ub3B0aW9uc18uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLm9wdGlvbnNfKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5uYW1lXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8ubmFtZV8sIHJoc19hcmVuYQorICApOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOjpJbnRlcm5hbFN3YXAoCisgICAgICAmX2ltcGxfLnR5cGVfdXJsXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8udHlwZV91cmxfLCByaHNfYXJlbmEKKyAgKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5qc29uX25hbWVfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy5qc29uX25hbWVfLCByaHNfYXJlbmEKKyAgKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5kZWZhdWx0X3ZhbHVlXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8uZGVmYXVsdF92YWx1ZV8sIHJoc19hcmVuYQorICApOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Om1lbXN3YXA8CisgICAgICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoRmllbGQsIF9pbXBsXy5wYWNrZWRfKQorICAgICAgKyBzaXplb2YoRmllbGQ6Ol9pbXBsXy5wYWNrZWRfKQorICAgICAgLSBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoRmllbGQsIF9pbXBsXy5raW5kXyk+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZfaW1wbF8ua2luZF8pLAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZvdGhlci0+X2ltcGxfLmtpbmRfKSk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBGaWVsZDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90b19vbmNlLAorICAgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90b1sxXSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgRW51bTo6X0ludGVybmFsIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCYgc291cmNlX2NvbnRleHQoY29uc3QgRW51bSogbXNnKTsKK307CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0JgorRW51bTo6X0ludGVybmFsOjpzb3VyY2VfY29udGV4dChjb25zdCBFbnVtKiBtc2cpIHsKKyAgcmV0dXJuICptc2ctPl9pbXBsXy5zb3VyY2VfY29udGV4dF87Cit9Cit2b2lkIEVudW06OmNsZWFyX3NvdXJjZV9jb250ZXh0KCkgeworICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0ciAmJiBfaW1wbF8uc291cmNlX2NvbnRleHRfICE9IG51bGxwdHIpIHsKKyAgICBkZWxldGUgX2ltcGxfLnNvdXJjZV9jb250ZXh0XzsKKyAgfQorICBfaW1wbF8uc291cmNlX2NvbnRleHRfID0gbnVsbHB0cjsKK30KK0VudW06OkVudW0oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQpCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgU2hhcmVkQ3RvcihhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRW51bSkKK30KK0VudW06OkVudW0oY29uc3QgRW51bSYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgRW51bSogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5lbnVtdmFsdWVfKXtmcm9tLl9pbXBsXy5lbnVtdmFsdWVffQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKXtmcm9tLl9pbXBsXy5vcHRpb25zX30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnNvdXJjZV9jb250ZXh0Xyl7bnVsbHB0cn0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zeW50YXhfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF9uYW1lKCkuZW1wdHkoKSkgeworICAgIF90aGlzLT5faW1wbF8ubmFtZV8uU2V0KGZyb20uX2ludGVybmFsX25hbWUoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfc291cmNlX2NvbnRleHQoKSkgeworICAgIF90aGlzLT5faW1wbF8uc291cmNlX2NvbnRleHRfID0gbmV3IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0KCpmcm9tLl9pbXBsXy5zb3VyY2VfY29udGV4dF8pOworICB9CisgIF90aGlzLT5faW1wbF8uc3ludGF4XyA9IGZyb20uX2ltcGxfLnN5bnRheF87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtKQorfQorCitpbmxpbmUgdm9pZCBFbnVtOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5lbnVtdmFsdWVfKXthcmVuYX0KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXyl7YXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubmFtZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5zb3VyY2VfY29udGV4dF8pe251bGxwdHJ9CisgICAgLCBkZWNsdHlwZShfaW1wbF8uc3ludGF4Xyl7MH0KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICB9OworICBfaW1wbF8ubmFtZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCit9CisKK0VudW06On5FbnVtKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRW51bSkKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIEVudW06OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7CisgIF9pbXBsXy5lbnVtdmFsdWVfLn5SZXBlYXRlZFB0ckZpZWxkKCk7CisgIF9pbXBsXy5vcHRpb25zXy5+UmVwZWF0ZWRQdHJGaWVsZCgpOworICBfaW1wbF8ubmFtZV8uRGVzdHJveSgpOworICBpZiAodGhpcyAhPSBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkpIGRlbGV0ZSBfaW1wbF8uc291cmNlX2NvbnRleHRfOworfQorCit2b2lkIEVudW06OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIEVudW06OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW0pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy5lbnVtdmFsdWVfLkNsZWFyKCk7CisgIF9pbXBsXy5vcHRpb25zXy5DbGVhcigpOworICBfaW1wbF8ubmFtZV8uQ2xlYXJUb0VtcHR5KCk7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyICYmIF9pbXBsXy5zb3VyY2VfY29udGV4dF8gIT0gbnVsbHB0cikgeworICAgIGRlbGV0ZSBfaW1wbF8uc291cmNlX2NvbnRleHRfOworICB9CisgIF9pbXBsXy5zb3VyY2VfY29udGV4dF8gPSBudWxscHRyOworICBfaW1wbF8uc3ludGF4XyA9IDA7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogRW51bTo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSAxMCkpIHsKKyAgICAgICAgICBhdXRvIHN0ciA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgICAgQ0hLXyg6Ol9wYmk6OlZlcmlmeVVURjgoc3RyLCAiZ29vZ2xlLnByb3RvYnVmLkVudW0ubmFtZSIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZSBlbnVtdmFsdWUgPSAyOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTgpKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfYWRkX2VudW12YWx1ZSgpLCBwdHIpOworICAgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICAgICAgaWYgKCFjdHgtPkRhdGFBdmFpbGFibGUocHRyKSkgYnJlYWs7CisgICAgICAgICAgfSB3aGlsZSAoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpFeHBlY3RUYWc8MTg+KHB0cikpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT3B0aW9uIG9wdGlvbnMgPSAzOworICAgICAgY2FzZSAzOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMjYpKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfYWRkX29wdGlvbnMoKSwgcHRyKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDI2PihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQgc291cmNlX2NvbnRleHQgPSA0OworICAgICAgY2FzZSA0OgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMzQpKSB7CisgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX211dGFibGVfc291cmNlX2NvbnRleHQoKSwgcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gLmdvb2dsZS5wcm90b2J1Zi5TeW50YXggc3ludGF4ID0gNTsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDQwKSkgeworICAgICAgICAgIHVpbnQ2NF90IHZhbCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICBfaW50ZXJuYWxfc2V0X3N5bnRheChzdGF0aWNfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3ludGF4Pih2YWwpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBFbnVtOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKCF0aGlzLT5faW50ZXJuYWxfbmFtZSgpLmVtcHR5KCkpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKAorICAgICAgdGhpcy0+X2ludGVybmFsX25hbWUoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX25hbWUoKS5sZW5ndGgoKSksCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkVudW0ubmFtZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDEsIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCksIHRhcmdldCk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZSBlbnVtdmFsdWUgPSAyOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfZW51bXZhbHVlX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9lbnVtdmFsdWUoaSk7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICAgIEludGVybmFsV3JpdGVNZXNzYWdlKDIsIHJlcGZpZWxkLCByZXBmaWVsZC5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT3B0aW9uIG9wdGlvbnMgPSAzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLAorICAgICAgbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5faW50ZXJuYWxfb3B0aW9uc19zaXplKCkpOyBpIDwgbjsgaSsrKSB7CisgICAgY29uc3QgYXV0byYgcmVwZmllbGQgPSB0aGlzLT5faW50ZXJuYWxfb3B0aW9ucyhpKTsKKyAgICB0YXJnZXQgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoMywgcmVwZmllbGQsIHJlcGZpZWxkLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgLy8gLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb250ZXh0IHNvdXJjZV9jb250ZXh0ID0gNDsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF9oYXNfc291cmNlX2NvbnRleHQoKSkgeworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgSW50ZXJuYWxXcml0ZU1lc3NhZ2UoNCwgX0ludGVybmFsOjpzb3VyY2VfY29udGV4dCh0aGlzKSwKKyAgICAgICAgX0ludGVybmFsOjpzb3VyY2VfY29udGV4dCh0aGlzKS5HZXRDYWNoZWRTaXplKCksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIC5nb29nbGUucHJvdG9idWYuU3ludGF4IHN5bnRheCA9IDU7CisgIGlmICh0aGlzLT5faW50ZXJuYWxfc3ludGF4KCkgIT0gMCkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAorICAgICAgNSwgdGhpcy0+X2ludGVybmFsX3N5bnRheCgpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkVudW0pCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBFbnVtOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW0pCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZSBlbnVtdmFsdWUgPSAyOworICB0b3RhbF9zaXplICs9IDFVTCAqIHRoaXMtPl9pbnRlcm5hbF9lbnVtdmFsdWVfc2l6ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IHRoaXMtPl9pbXBsXy5lbnVtdmFsdWVfKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUobXNnKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT3B0aW9uIG9wdGlvbnMgPSAzOworICB0b3RhbF9zaXplICs9IDFVTCAqIHRoaXMtPl9pbnRlcm5hbF9vcHRpb25zX3NpemUoKTsKKyAgZm9yIChjb25zdCBhdXRvJiBtc2cgOiB0aGlzLT5faW1wbF8ub3B0aW9uc18pIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZShtc2cpOworICB9CisKKyAgLy8gc3RyaW5nIG5hbWUgPSAxOworICBpZiAoIXRoaXMtPl9pbnRlcm5hbF9uYW1lKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICB0aGlzLT5faW50ZXJuYWxfbmFtZSgpKTsKKyAgfQorCisgIC8vIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dCBzb3VyY2VfY29udGV4dCA9IDQ7CisgIGlmICh0aGlzLT5faW50ZXJuYWxfaGFzX3NvdXJjZV9jb250ZXh0KCkpIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUoCisgICAgICAgICpfaW1wbF8uc291cmNlX2NvbnRleHRfKTsKKyAgfQorCisgIC8vIC5nb29nbGUucHJvdG9idWYuU3ludGF4IHN5bnRheCA9IDU7CisgIGlmICh0aGlzLT5faW50ZXJuYWxfc3ludGF4KCkgIT0gMCkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5faW50ZXJuYWxfc3ludGF4KCkpOworICB9CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgRW51bTo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIEVudW06Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqRW51bTo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgRW51bTo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PEVudW0qPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IEVudW0mPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX3RoaXMtPl9pbXBsXy5lbnVtdmFsdWVfLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5lbnVtdmFsdWVfKTsKKyAgX3RoaXMtPl9pbXBsXy5vcHRpb25zXy5NZXJnZUZyb20oZnJvbS5faW1wbF8ub3B0aW9uc18pOworICBpZiAoIWZyb20uX2ludGVybmFsX25hbWUoKS5lbXB0eSgpKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfbmFtZShmcm9tLl9pbnRlcm5hbF9uYW1lKCkpOworICB9CisgIGlmIChmcm9tLl9pbnRlcm5hbF9oYXNfc291cmNlX2NvbnRleHQoKSkgeworICAgIF90aGlzLT5faW50ZXJuYWxfbXV0YWJsZV9zb3VyY2VfY29udGV4dCgpLT46OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dDo6TWVyZ2VGcm9tKAorICAgICAgICBmcm9tLl9pbnRlcm5hbF9zb3VyY2VfY29udGV4dCgpKTsKKyAgfQorICBpZiAoZnJvbS5faW50ZXJuYWxfc3ludGF4KCkgIT0gMCkgeworICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X3N5bnRheChmcm9tLl9pbnRlcm5hbF9zeW50YXgoKSk7CisgIH0KKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgRW51bTo6Q29weUZyb20oY29uc3QgRW51bSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bSkKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIEVudW06OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEVudW06OkludGVybmFsU3dhcChFbnVtKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIGF1dG8qIGxoc19hcmVuYSA9IEdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBhdXRvKiByaHNfYXJlbmEgPSBvdGhlci0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIF9pbXBsXy5lbnVtdmFsdWVfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5lbnVtdmFsdWVfKTsKKyAgX2ltcGxfLm9wdGlvbnNfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbXBsXy5vcHRpb25zXyk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8ubmFtZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLm5hbWVfLCByaHNfYXJlbmEKKyAgKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjptZW1zd2FwPAorICAgICAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKEVudW0sIF9pbXBsXy5zeW50YXhfKQorICAgICAgKyBzaXplb2YoRW51bTo6X2ltcGxfLnN5bnRheF8pCisgICAgICAtIFBST1RPQlVGX0ZJRUxEX09GRlNFVChFbnVtLCBfaW1wbF8uc291cmNlX2NvbnRleHRfKT4oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJl9pbXBsXy5zb3VyY2VfY29udGV4dF8pLAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZvdGhlci0+X2ltcGxfLnNvdXJjZV9jb250ZXh0XykpOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgRW51bTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90b19vbmNlLAorICAgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90b1syXSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgRW51bVZhbHVlOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKK307CisKK0VudW1WYWx1ZTo6RW51bVZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZSkKK30KK0VudW1WYWx1ZTo6RW51bVZhbHVlKGNvbnN0IEVudW1WYWx1ZSYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgRW51bVZhbHVlKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLm9wdGlvbnNfKXtmcm9tLl9pbXBsXy5vcHRpb25zX30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLm51bWJlcl8pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX2ltcGxfLm5hbWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoIWZyb20uX2ludGVybmFsX25hbWUoKS5lbXB0eSgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5uYW1lXy5TZXQoZnJvbS5faW50ZXJuYWxfbmFtZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgX3RoaXMtPl9pbXBsXy5udW1iZXJfID0gZnJvbS5faW1wbF8ubnVtYmVyXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZSkKK30KKworaW5saW5lIHZvaWQgRW51bVZhbHVlOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5vcHRpb25zXyl7YXJlbmF9CisgICAgLCBkZWNsdHlwZShfaW1wbF8ubmFtZV8pe30KKyAgICAsIGRlY2x0eXBlKF9pbXBsXy5udW1iZXJfKXswfQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgIH07CisgIF9pbXBsXy5uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKK30KKworRW51bVZhbHVlOjp+RW51bVZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgRW51bVZhbHVlOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8ub3B0aW9uc18uflJlcGVhdGVkUHRyRmllbGQoKTsKKyAgX2ltcGxfLm5hbWVfLkRlc3Ryb3koKTsKK30KKwordm9pZCBFbnVtVmFsdWU6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIEVudW1WYWx1ZTo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfaW1wbF8ub3B0aW9uc18uQ2xlYXIoKTsKKyAgX2ltcGxfLm5hbWVfLkNsZWFyVG9FbXB0eSgpOworICBfaW1wbF8ubnVtYmVyXyA9IDA7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogRW51bVZhbHVlOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIHN0cmluZyBuYW1lID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDEwKSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICBDSEtfKDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuRW51bVZhbHVlLm5hbWUiKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gaW50MzIgbnVtYmVyID0gMjsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDE2KSkgeworICAgICAgICAgIF9pbXBsXy5udW1iZXJfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50MzIoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT3B0aW9uIG9wdGlvbnMgPSAzOworICAgICAgY2FzZSAzOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMjYpKSB7CisgICAgICAgICAgcHRyIC09IDE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBwdHIgPSBjdHgtPlBhcnNlTWVzc2FnZShfaW50ZXJuYWxfYWRkX29wdGlvbnMoKSwgcHRyKTsKKyAgICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5EYXRhQXZhaWxhYmxlKHB0cikpIGJyZWFrOworICAgICAgICAgIH0gd2hpbGUgKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RXhwZWN0VGFnPDI2PihwdHIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBFbnVtVmFsdWU6Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZSkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyBzdHJpbmcgbmFtZSA9IDE7CisgIGlmICghdGhpcy0+X2ludGVybmFsX25hbWUoKS5lbXB0eSgpKSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZygKKyAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWUubmFtZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDEsIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCksIHRhcmdldCk7CisgIH0KKworICAvLyBpbnQzMiBudW1iZXIgPSAyOworICBpZiAodGhpcy0+X2ludGVybmFsX251bWJlcigpICE9IDApIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMiwgdGhpcy0+X2ludGVybmFsX251bWJlcigpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PcHRpb24gb3B0aW9ucyA9IDM7CisgIGZvciAodW5zaWduZWQgaSA9IDAsCisgICAgICBuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPl9pbnRlcm5hbF9vcHRpb25zX3NpemUoKSk7IGkgPCBuOyBpKyspIHsKKyAgICBjb25zdCBhdXRvJiByZXBmaWVsZCA9IHRoaXMtPl9pbnRlcm5hbF9vcHRpb25zKGkpOworICAgIHRhcmdldCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSgzLCByZXBmaWVsZCwgcmVwZmllbGQuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlKQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgRW51bVZhbHVlOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZSkKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT3B0aW9uIG9wdGlvbnMgPSAzOworICB0b3RhbF9zaXplICs9IDFVTCAqIHRoaXMtPl9pbnRlcm5hbF9vcHRpb25zX3NpemUoKTsKKyAgZm9yIChjb25zdCBhdXRvJiBtc2cgOiB0aGlzLT5faW1wbF8ub3B0aW9uc18pIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZShtc2cpOworICB9CisKKyAgLy8gc3RyaW5nIG5hbWUgPSAxOworICBpZiAoIXRoaXMtPl9pbnRlcm5hbF9uYW1lKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICB0aGlzLT5faW50ZXJuYWxfbmFtZSgpKTsKKyAgfQorCisgIC8vIGludDMyIG51bWJlciA9IDI7CisgIGlmICh0aGlzLT5faW50ZXJuYWxfbnVtYmVyKCkgIT0gMCkgeworICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplUGx1c09uZSh0aGlzLT5faW50ZXJuYWxfbnVtYmVyKCkpOworICB9CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgRW51bVZhbHVlOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgRW51bVZhbHVlOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkVudW1WYWx1ZTo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgRW51bVZhbHVlOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8RW51bVZhbHVlKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBFbnVtVmFsdWUmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWUpCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfdGhpcy0+X2ltcGxfLm9wdGlvbnNfLk1lcmdlRnJvbShmcm9tLl9pbXBsXy5vcHRpb25zXyk7CisgIGlmICghZnJvbS5faW50ZXJuYWxfbmFtZSgpLmVtcHR5KCkpIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF9uYW1lKGZyb20uX2ludGVybmFsX25hbWUoKSk7CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX251bWJlcigpICE9IDApIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF9udW1iZXIoZnJvbS5faW50ZXJuYWxfbnVtYmVyKCkpOworICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIEVudW1WYWx1ZTo6Q29weUZyb20oY29uc3QgRW51bVZhbHVlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWUpCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBFbnVtVmFsdWU6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEVudW1WYWx1ZTo6SW50ZXJuYWxTd2FwKEVudW1WYWx1ZSogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBhdXRvKiBsaHNfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgYXV0byogcmhzX2FyZW5hID0gb3RoZXItPkdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8ub3B0aW9uc18uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ltcGxfLm9wdGlvbnNfKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy5uYW1lXywgbGhzX2FyZW5hLAorICAgICAgJm90aGVyLT5faW1wbF8ubmFtZV8sIHJoc19hcmVuYQorICApOworICBzd2FwKF9pbXBsXy5udW1iZXJfLCBvdGhlci0+X2ltcGxfLm51bWJlcl8pOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgRW51bVZhbHVlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvWzNdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBPcHRpb246Ol9JbnRlcm5hbCB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSYgdmFsdWUoY29uc3QgT3B0aW9uKiBtc2cpOworfTsKKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSYKK09wdGlvbjo6X0ludGVybmFsOjp2YWx1ZShjb25zdCBPcHRpb24qIG1zZykgeworICByZXR1cm4gKm1zZy0+X2ltcGxfLnZhbHVlXzsKK30KK3ZvaWQgT3B0aW9uOjpjbGVhcl92YWx1ZSgpIHsKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIgJiYgX2ltcGxfLnZhbHVlXyAhPSBudWxscHRyKSB7CisgICAgZGVsZXRlIF9pbXBsXy52YWx1ZV87CisgIH0KKyAgX2ltcGxfLnZhbHVlXyA9IG51bGxwdHI7Cit9CitPcHRpb246Ok9wdGlvbig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5PcHRpb24pCit9CitPcHRpb246Ok9wdGlvbihjb25zdCBPcHRpb24mIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIE9wdGlvbiogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy5uYW1lXyl7fQorICAgICwgZGVjbHR5cGUoX2ltcGxfLnZhbHVlXyl7bnVsbHB0cn0KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX2ltcGxfLm5hbWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoIWZyb20uX2ludGVybmFsX25hbWUoKS5lbXB0eSgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy5uYW1lXy5TZXQoZnJvbS5faW50ZXJuYWxfbmFtZSgpLCAKKyAgICAgIF90aGlzLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc192YWx1ZSgpKSB7CisgICAgX3RoaXMtPl9pbXBsXy52YWx1ZV8gPSBuZXcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSgqZnJvbS5faW1wbF8udmFsdWVfKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuT3B0aW9uKQorfQorCitpbmxpbmUgdm9pZCBPcHRpb246OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLm5hbWVfKXt9CisgICAgLCBkZWNsdHlwZShfaW1wbF8udmFsdWVfKXtudWxscHRyfQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgIH07CisgIF9pbXBsXy5uYW1lXy5Jbml0RGVmYXVsdCgpOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKK30KKworT3B0aW9uOjp+T3B0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuT3B0aW9uKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgT3B0aW9uOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworICBfaW1wbF8ubmFtZV8uRGVzdHJveSgpOworICBpZiAodGhpcyAhPSBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkpIGRlbGV0ZSBfaW1wbF8udmFsdWVfOworfQorCit2b2lkIE9wdGlvbjo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgT3B0aW9uOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5PcHRpb24pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy5uYW1lXy5DbGVhclRvRW1wdHkoKTsKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIgJiYgX2ltcGxfLnZhbHVlXyAhPSBudWxscHRyKSB7CisgICAgZGVsZXRlIF9pbXBsXy52YWx1ZV87CisgIH0KKyAgX2ltcGxfLnZhbHVlXyA9IG51bGxwdHI7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogT3B0aW9uOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIHN0cmluZyBuYW1lID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDEwKSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICBDSEtfKDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuT3B0aW9uLm5hbWUiKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gLmdvb2dsZS5wcm90b2J1Zi5BbnkgdmFsdWUgPSAyOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTgpKSB7CisgICAgICAgICAgcHRyID0gY3R4LT5QYXJzZU1lc3NhZ2UoX2ludGVybmFsX211dGFibGVfdmFsdWUoKSwgcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICB9ICAvLyBzd2l0Y2gKKyAgaGFuZGxlX3VudXN1YWw6CisgICAgaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkgeworICAgICAgQ0hLXyhwdHIpOworICAgICAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7CisgICAgICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogT3B0aW9uOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5PcHRpb24pCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gc3RyaW5nIG5hbWUgPSAxOworICBpZiAoIXRoaXMtPl9pbnRlcm5hbF9uYW1lKCkuZW1wdHkoKSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICB0aGlzLT5faW50ZXJuYWxfbmFtZSgpLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pih0aGlzLT5faW50ZXJuYWxfbmFtZSgpLmxlbmd0aCgpKSwKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuT3B0aW9uLm5hbWUiKTsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgICAxLCB0aGlzLT5faW50ZXJuYWxfbmFtZSgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gLmdvb2dsZS5wcm90b2J1Zi5BbnkgdmFsdWUgPSAyOworICBpZiAodGhpcy0+X2ludGVybmFsX2hhc192YWx1ZSgpKSB7CisgICAgdGFyZ2V0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBJbnRlcm5hbFdyaXRlTWVzc2FnZSgyLCBfSW50ZXJuYWw6OnZhbHVlKHRoaXMpLAorICAgICAgICBfSW50ZXJuYWw6OnZhbHVlKHRoaXMpLkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLk9wdGlvbikKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IE9wdGlvbjo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5PcHRpb24pCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyBzdHJpbmcgbmFtZSA9IDE7CisgIGlmICghdGhpcy0+X2ludGVybmFsX25hbWUoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgIHRoaXMtPl9pbnRlcm5hbF9uYW1lKCkpOworICB9CisKKyAgLy8gLmdvb2dsZS5wcm90b2J1Zi5BbnkgdmFsdWUgPSAyOworICBpZiAodGhpcy0+X2ludGVybmFsX2hhc192YWx1ZSgpKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplKAorICAgICAgICAqX2ltcGxfLnZhbHVlXyk7CisgIH0KKworICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBPcHRpb246Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBPcHRpb246Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqT3B0aW9uOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBPcHRpb246Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxPcHRpb24qPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IE9wdGlvbiY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk9wdGlvbikKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGlmICghZnJvbS5faW50ZXJuYWxfbmFtZSgpLmVtcHR5KCkpIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF9uYW1lKGZyb20uX2ludGVybmFsX25hbWUoKSk7CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX2hhc192YWx1ZSgpKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9tdXRhYmxlX3ZhbHVlKCktPjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBbnk6Ok1lcmdlRnJvbSgKKyAgICAgICAgZnJvbS5faW50ZXJuYWxfdmFsdWUoKSk7CisgIH0KKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgT3B0aW9uOjpDb3B5RnJvbShjb25zdCBPcHRpb24mIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk9wdGlvbikKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIE9wdGlvbjo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgT3B0aW9uOjpJbnRlcm5hbFN3YXAoT3B0aW9uKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIGF1dG8qIGxoc19hcmVuYSA9IEdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBhdXRvKiByaHNfYXJlbmEgPSBvdGhlci0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8ubmFtZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLm5hbWVfLCByaHNfYXJlbmEKKyAgKTsKKyAgc3dhcChfaW1wbF8udmFsdWVfLCBvdGhlci0+X2ltcGxfLnZhbHVlXyk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBPcHRpb246OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG9bNF0pOworfQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VHlwZSoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpUeXBlID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VHlwZSA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGQgPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW0gPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZSA+KEFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZSA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbioKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24gPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24gPihhcmVuYSk7Cit9CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdHlwZS5wYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjdmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuaApAQCAtMCwwICsxLDI1NzEgQEAKKy8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisvLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi90eXBlLnByb3RvCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90bworCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisjaWYgUFJPVE9CVUZfVkVSU0lPTiA8IDMwMjEwMDAKKyNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCisjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gUGxlYXNlIHVwZGF0ZQorI2Vycm9yIHlvdXIgaGVhZGVycy4KKyNlbmRpZgorI2lmIDMwMjEwMDkgPCBQUk9UT0JVRl9NSU5fUFJPVE9DX1ZFUlNJT04KKyNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhbiBvbGRlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcworI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuIFBsZWFzZQorI2Vycm9yIHJlZ2VuZXJhdGUgdGhpcyBmaWxlIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYy4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYW55LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnBiLmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKyNkZWZpbmUgUFJPVE9CVUZfSU5URVJOQUxfRVhQT1JUX2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvIFBST1RPQlVGX0VYUE9SVAorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBBbnlNZXRhZGF0YTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCisKKy8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCAtLSBkbyBub3QgdXNlIHRoZXNlIG1lbWJlcnMuCitzdHJ1Y3QgUFJPVE9CVUZfRVhQT1JUIFRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvIHsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG9mZnNldHNbXTsKK307CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RGVzY3JpcHRvclRhYmxlIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG87CitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorY2xhc3MgRW51bTsKK3N0cnVjdCBFbnVtRGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gRW51bURlZmF1bHRUeXBlSW50ZXJuYWwgX0VudW1fZGVmYXVsdF9pbnN0YW5jZV87CitjbGFzcyBFbnVtVmFsdWU7CitzdHJ1Y3QgRW51bVZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gRW51bVZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCBfRW51bVZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgRmllbGQ7CitzdHJ1Y3QgRmllbGREZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBGaWVsZERlZmF1bHRUeXBlSW50ZXJuYWwgX0ZpZWxkX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgT3B0aW9uOworc3RydWN0IE9wdGlvbkRlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIE9wdGlvbkRlZmF1bHRUeXBlSW50ZXJuYWwgX09wdGlvbl9kZWZhdWx0X2luc3RhbmNlXzsKK2NsYXNzIFR5cGU7CitzdHJ1Y3QgVHlwZURlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIFR5cGVEZWZhdWx0VHlwZUludGVybmFsIF9UeXBlX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW0qIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW0+KEFyZW5hKik7Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWU+KEFyZW5hKik7Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGQqIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlR5cGUqIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlR5cGU+KEFyZW5hKik7CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCisKK2VudW0gRmllbGRfS2luZCA6IGludCB7CisgIEZpZWxkX0tpbmRfVFlQRV9VTktOT1dOID0gMCwKKyAgRmllbGRfS2luZF9UWVBFX0RPVUJMRSA9IDEsCisgIEZpZWxkX0tpbmRfVFlQRV9GTE9BVCA9IDIsCisgIEZpZWxkX0tpbmRfVFlQRV9JTlQ2NCA9IDMsCisgIEZpZWxkX0tpbmRfVFlQRV9VSU5UNjQgPSA0LAorICBGaWVsZF9LaW5kX1RZUEVfSU5UMzIgPSA1LAorICBGaWVsZF9LaW5kX1RZUEVfRklYRUQ2NCA9IDYsCisgIEZpZWxkX0tpbmRfVFlQRV9GSVhFRDMyID0gNywKKyAgRmllbGRfS2luZF9UWVBFX0JPT0wgPSA4LAorICBGaWVsZF9LaW5kX1RZUEVfU1RSSU5HID0gOSwKKyAgRmllbGRfS2luZF9UWVBFX0dST1VQID0gMTAsCisgIEZpZWxkX0tpbmRfVFlQRV9NRVNTQUdFID0gMTEsCisgIEZpZWxkX0tpbmRfVFlQRV9CWVRFUyA9IDEyLAorICBGaWVsZF9LaW5kX1RZUEVfVUlOVDMyID0gMTMsCisgIEZpZWxkX0tpbmRfVFlQRV9FTlVNID0gMTQsCisgIEZpZWxkX0tpbmRfVFlQRV9TRklYRUQzMiA9IDE1LAorICBGaWVsZF9LaW5kX1RZUEVfU0ZJWEVENjQgPSAxNiwKKyAgRmllbGRfS2luZF9UWVBFX1NJTlQzMiA9IDE3LAorICBGaWVsZF9LaW5kX1RZUEVfU0lOVDY0ID0gMTgsCisgIEZpZWxkX0tpbmRfRmllbGRfS2luZF9JTlRfTUlOX1NFTlRJTkVMX0RPX05PVF9VU0VfID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKCksCisgIEZpZWxkX0tpbmRfRmllbGRfS2luZF9JTlRfTUFYX1NFTlRJTkVMX0RPX05PVF9VU0VfID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkKK307CitQUk9UT0JVRl9FWFBPUlQgYm9vbCBGaWVsZF9LaW5kX0lzVmFsaWQoaW50IHZhbHVlKTsKK2NvbnN0ZXhwciBGaWVsZF9LaW5kIEZpZWxkX0tpbmRfS2luZF9NSU4gPSBGaWVsZF9LaW5kX1RZUEVfVU5LTk9XTjsKK2NvbnN0ZXhwciBGaWVsZF9LaW5kIEZpZWxkX0tpbmRfS2luZF9NQVggPSBGaWVsZF9LaW5kX1RZUEVfU0lOVDY0OworY29uc3RleHByIGludCBGaWVsZF9LaW5kX0tpbmRfQVJSQVlTSVpFID0gRmllbGRfS2luZF9LaW5kX01BWCArIDE7CisKK1BST1RPQlVGX0VYUE9SVCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3IqIEZpZWxkX0tpbmRfZGVzY3JpcHRvcigpOwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmllbGRfS2luZF9OYW1lKFQgZW51bV90X3ZhbHVlKSB7CisgIHN0YXRpY19hc3NlcnQoOjpzdGQ6OmlzX3NhbWU8VCwgRmllbGRfS2luZD46OnZhbHVlIHx8CisgICAgOjpzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSwKKyAgICAiSW5jb3JyZWN0IHR5cGUgcGFzc2VkIHRvIGZ1bmN0aW9uIEZpZWxkX0tpbmRfTmFtZS4iKTsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6TmFtZU9mRW51bSgKKyAgICBGaWVsZF9LaW5kX2Rlc2NyaXB0b3IoKSwgZW51bV90X3ZhbHVlKTsKK30KK2lubGluZSBib29sIEZpZWxkX0tpbmRfUGFyc2UoCisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkNvbnN0U3RyaW5nUGFyYW0gbmFtZSwgRmllbGRfS2luZCogdmFsdWUpIHsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VOYW1lZEVudW08RmllbGRfS2luZD4oCisgICAgRmllbGRfS2luZF9kZXNjcmlwdG9yKCksIG5hbWUsIHZhbHVlKTsKK30KK2VudW0gRmllbGRfQ2FyZGluYWxpdHkgOiBpbnQgeworICBGaWVsZF9DYXJkaW5hbGl0eV9DQVJESU5BTElUWV9VTktOT1dOID0gMCwKKyAgRmllbGRfQ2FyZGluYWxpdHlfQ0FSRElOQUxJVFlfT1BUSU9OQUwgPSAxLAorICBGaWVsZF9DYXJkaW5hbGl0eV9DQVJESU5BTElUWV9SRVFVSVJFRCA9IDIsCisgIEZpZWxkX0NhcmRpbmFsaXR5X0NBUkRJTkFMSVRZX1JFUEVBVEVEID0gMywKKyAgRmllbGRfQ2FyZGluYWxpdHlfRmllbGRfQ2FyZGluYWxpdHlfSU5UX01JTl9TRU5USU5FTF9ET19OT1RfVVNFXyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpLAorICBGaWVsZF9DYXJkaW5hbGl0eV9GaWVsZF9DYXJkaW5hbGl0eV9JTlRfTUFYX1NFTlRJTkVMX0RPX05PVF9VU0VfID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkKK307CitQUk9UT0JVRl9FWFBPUlQgYm9vbCBGaWVsZF9DYXJkaW5hbGl0eV9Jc1ZhbGlkKGludCB2YWx1ZSk7Citjb25zdGV4cHIgRmllbGRfQ2FyZGluYWxpdHkgRmllbGRfQ2FyZGluYWxpdHlfQ2FyZGluYWxpdHlfTUlOID0gRmllbGRfQ2FyZGluYWxpdHlfQ0FSRElOQUxJVFlfVU5LTk9XTjsKK2NvbnN0ZXhwciBGaWVsZF9DYXJkaW5hbGl0eSBGaWVsZF9DYXJkaW5hbGl0eV9DYXJkaW5hbGl0eV9NQVggPSBGaWVsZF9DYXJkaW5hbGl0eV9DQVJESU5BTElUWV9SRVBFQVRFRDsKK2NvbnN0ZXhwciBpbnQgRmllbGRfQ2FyZGluYWxpdHlfQ2FyZGluYWxpdHlfQVJSQVlTSVpFID0gRmllbGRfQ2FyZGluYWxpdHlfQ2FyZGluYWxpdHlfTUFYICsgMTsKKworUFJPVE9CVUZfRVhQT1JUIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvciogRmllbGRfQ2FyZGluYWxpdHlfZGVzY3JpcHRvcigpOwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmllbGRfQ2FyZGluYWxpdHlfTmFtZShUIGVudW1fdF92YWx1ZSkgeworICBzdGF0aWNfYXNzZXJ0KDo6c3RkOjppc19zYW1lPFQsIEZpZWxkX0NhcmRpbmFsaXR5Pjo6dmFsdWUgfHwKKyAgICA6OnN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLAorICAgICJJbmNvcnJlY3QgdHlwZSBwYXNzZWQgdG8gZnVuY3Rpb24gRmllbGRfQ2FyZGluYWxpdHlfTmFtZS4iKTsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6TmFtZU9mRW51bSgKKyAgICBGaWVsZF9DYXJkaW5hbGl0eV9kZXNjcmlwdG9yKCksIGVudW1fdF92YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBGaWVsZF9DYXJkaW5hbGl0eV9QYXJzZSgKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Q29uc3RTdHJpbmdQYXJhbSBuYW1lLCBGaWVsZF9DYXJkaW5hbGl0eSogdmFsdWUpIHsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VOYW1lZEVudW08RmllbGRfQ2FyZGluYWxpdHk+KAorICAgIEZpZWxkX0NhcmRpbmFsaXR5X2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpOworfQorZW51bSBTeW50YXggOiBpbnQgeworICBTWU5UQVhfUFJPVE8yID0gMCwKKyAgU1lOVEFYX1BST1RPMyA9IDEsCisgIFN5bnRheF9JTlRfTUlOX1NFTlRJTkVMX0RPX05PVF9VU0VfID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKCksCisgIFN5bnRheF9JTlRfTUFYX1NFTlRJTkVMX0RPX05PVF9VU0VfID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkKK307CitQUk9UT0JVRl9FWFBPUlQgYm9vbCBTeW50YXhfSXNWYWxpZChpbnQgdmFsdWUpOworY29uc3RleHByIFN5bnRheCBTeW50YXhfTUlOID0gU1lOVEFYX1BST1RPMjsKK2NvbnN0ZXhwciBTeW50YXggU3ludGF4X01BWCA9IFNZTlRBWF9QUk9UTzM7Citjb25zdGV4cHIgaW50IFN5bnRheF9BUlJBWVNJWkUgPSBTeW50YXhfTUFYICsgMTsKKworUFJPVE9CVUZfRVhQT1JUIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvciogU3ludGF4X2Rlc2NyaXB0b3IoKTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIFN5bnRheF9OYW1lKFQgZW51bV90X3ZhbHVlKSB7CisgIHN0YXRpY19hc3NlcnQoOjpzdGQ6OmlzX3NhbWU8VCwgU3ludGF4Pjo6dmFsdWUgfHwKKyAgICA6OnN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLAorICAgICJJbmNvcnJlY3QgdHlwZSBwYXNzZWQgdG8gZnVuY3Rpb24gU3ludGF4X05hbWUuIik7CisgIHJldHVybiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Ok5hbWVPZkVudW0oCisgICAgU3ludGF4X2Rlc2NyaXB0b3IoKSwgZW51bV90X3ZhbHVlKTsKK30KK2lubGluZSBib29sIFN5bnRheF9QYXJzZSgKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Q29uc3RTdHJpbmdQYXJhbSBuYW1lLCBTeW50YXgqIHZhbHVlKSB7CisgIHJldHVybiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPFN5bnRheD4oCisgICAgU3ludGF4X2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpOworfQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgVHlwZSBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5UeXBlKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgVHlwZSgpIDogVHlwZShudWxscHRyKSB7fQorICB+VHlwZSgpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgVHlwZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIFR5cGUoY29uc3QgVHlwZSYgZnJvbSk7CisgIFR5cGUoVHlwZSYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBUeXBlKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgVHlwZSYgb3BlcmF0b3I9KGNvbnN0IFR5cGUmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIFR5cGUmIG9wZXJhdG9yPShUeXBlJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IFR5cGUmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBUeXBlKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFR5cGUqPigKKyAgICAgICAgICAgICAgICZfVHlwZV9kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDA7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChUeXBlJiBhLCBUeXBlJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKFR5cGUqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKFR5cGUqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFR5cGUqIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8VHlwZT4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBUeXBlJiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IFR5cGUmIGZyb20pIHsKKyAgICBUeXBlOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoVHlwZSogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5UeXBlIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IFR5cGUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtGaWVsZHNGaWVsZE51bWJlciA9IDIsCisgICAga09uZW9mc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrT3B0aW9uc0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrU291cmNlQ29udGV4dEZpZWxkTnVtYmVyID0gNSwKKyAgICBrU3ludGF4RmllbGROdW1iZXIgPSA2LAorICB9OworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkIGZpZWxkcyA9IDI7CisgIGludCBmaWVsZHNfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX2ZpZWxkc19zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9maWVsZHMoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkKiBtdXRhYmxlX2ZpZWxkcyhpbnQgaW5kZXgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkID4qCisgICAgICBtdXRhYmxlX2ZpZWxkcygpOworICBwcml2YXRlOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGQmIF9pbnRlcm5hbF9maWVsZHMoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkKiBfaW50ZXJuYWxfYWRkX2ZpZWxkcygpOworICBwdWJsaWM6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZCYgZmllbGRzKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZCogYWRkX2ZpZWxkcygpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkID4mCisgICAgICBmaWVsZHMoKSBjb25zdDsKKworICAvLyByZXBlYXRlZCBzdHJpbmcgb25lb2ZzID0gMzsKKyAgaW50IG9uZW9mc19zaXplKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGludCBfaW50ZXJuYWxfb25lb2ZzX3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX29uZW9mcygpOworICBjb25zdCBzdGQ6OnN0cmluZyYgb25lb2ZzKGludCBpbmRleCkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX29uZW9mcyhpbnQgaW5kZXgpOworICB2b2lkIHNldF9vbmVvZnMoaW50IGluZGV4LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9vbmVvZnMoaW50IGluZGV4LCBzdGQ6OnN0cmluZyYmIHZhbHVlKTsKKyAgdm9pZCBzZXRfb25lb2ZzKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9vbmVvZnMoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBzdGQ6OnN0cmluZyogYWRkX29uZW9mcygpOworICB2b2lkIGFkZF9vbmVvZnMoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBhZGRfb25lb2ZzKHN0ZDo6c3RyaW5nJiYgdmFsdWUpOworICB2b2lkIGFkZF9vbmVvZnMoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIGFkZF9vbmVvZnMoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+JiBvbmVvZnMoKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KiBtdXRhYmxlX29uZW9mcygpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX29uZW9mcyhpbnQgaW5kZXgpIGNvbnN0OworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX2FkZF9vbmVvZnMoKTsKKyAgcHVibGljOgorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT3B0aW9uIG9wdGlvbnMgPSA0OworICBpbnQgb3B0aW9uc19zaXplKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGludCBfaW50ZXJuYWxfb3B0aW9uc19zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9vcHRpb25zKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24qIG11dGFibGVfb3B0aW9ucyhpbnQgaW5kZXgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiA+KgorICAgICAgbXV0YWJsZV9vcHRpb25zKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24mIF9pbnRlcm5hbF9vcHRpb25zKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24qIF9pbnRlcm5hbF9hZGRfb3B0aW9ucygpOworICBwdWJsaWM6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24mIG9wdGlvbnMoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogYWRkX29wdGlvbnMoKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24gPiYKKyAgICAgIG9wdGlvbnMoKSBjb25zdDsKKworICAvLyBzdHJpbmcgbmFtZSA9IDE7CisgIHZvaWQgY2xlYXJfbmFtZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X25hbWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9uYW1lKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgIHB1YmxpYzoKKworICAvLyAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQgc291cmNlX2NvbnRleHQgPSA1OworICBib29sIGhhc19zb3VyY2VfY29udGV4dCgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfc291cmNlX2NvbnRleHQoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3NvdXJjZV9jb250ZXh0KCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0JiBzb3VyY2VfY29udGV4dCgpIGNvbnN0OworICBQUk9UT0JVRl9OT0RJU0NBUkQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIHJlbGVhc2Vfc291cmNlX2NvbnRleHQoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIG11dGFibGVfc291cmNlX2NvbnRleHQoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX3NvdXJjZV9jb250ZXh0KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0KiBzb3VyY2VfY29udGV4dCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0JiBfaW50ZXJuYWxfc291cmNlX2NvbnRleHQoKSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIF9pbnRlcm5hbF9tdXRhYmxlX3NvdXJjZV9jb250ZXh0KCk7CisgIHB1YmxpYzoKKyAgdm9pZCB1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF9zb3VyY2VfY29udGV4dCgKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0KiBzb3VyY2VfY29udGV4dCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0KiB1bnNhZmVfYXJlbmFfcmVsZWFzZV9zb3VyY2VfY29udGV4dCgpOworCisgIC8vIC5nb29nbGUucHJvdG9idWYuU3ludGF4IHN5bnRheCA9IDY7CisgIHZvaWQgY2xlYXJfc3ludGF4KCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTeW50YXggc3ludGF4KCkgY29uc3Q7CisgIHZvaWQgc2V0X3N5bnRheCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3ludGF4IHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheCBfaW50ZXJuYWxfc3ludGF4KCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9zeW50YXgoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlR5cGUpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGQgPiBmaWVsZHNfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiBvbmVvZnNfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uID4gb3B0aW9uc187CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogc291cmNlX2NvbnRleHRfOworICAgIGludCBzeW50YXhfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRmllbGQgZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuRmllbGQpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBGaWVsZCgpIDogRmllbGQobnVsbHB0cikge30KKyAgfkZpZWxkKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBGaWVsZCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIEZpZWxkKGNvbnN0IEZpZWxkJiBmcm9tKTsKKyAgRmllbGQoRmllbGQmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogRmllbGQoKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBGaWVsZCYgb3BlcmF0b3I9KGNvbnN0IEZpZWxkJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBGaWVsZCYgb3BlcmF0b3I9KEZpZWxkJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IEZpZWxkJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgRmllbGQqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRmllbGQqPigKKyAgICAgICAgICAgICAgICZfRmllbGRfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAxOworCisgIGZyaWVuZCB2b2lkIHN3YXAoRmllbGQmIGEsIEZpZWxkJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKEZpZWxkKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChGaWVsZCogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRmllbGQqIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8RmllbGQ+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgRmllbGQmIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgRmllbGQmIGZyb20pIHsKKyAgICBGaWVsZDo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKEZpZWxkKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEZpZWxkKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdHlwZWRlZiBGaWVsZF9LaW5kIEtpbmQ7CisgIHN0YXRpYyBjb25zdGV4cHIgS2luZCBUWVBFX1VOS05PV04gPQorICAgIEZpZWxkX0tpbmRfVFlQRV9VTktOT1dOOworICBzdGF0aWMgY29uc3RleHByIEtpbmQgVFlQRV9ET1VCTEUgPQorICAgIEZpZWxkX0tpbmRfVFlQRV9ET1VCTEU7CisgIHN0YXRpYyBjb25zdGV4cHIgS2luZCBUWVBFX0ZMT0FUID0KKyAgICBGaWVsZF9LaW5kX1RZUEVfRkxPQVQ7CisgIHN0YXRpYyBjb25zdGV4cHIgS2luZCBUWVBFX0lOVDY0ID0KKyAgICBGaWVsZF9LaW5kX1RZUEVfSU5UNjQ7CisgIHN0YXRpYyBjb25zdGV4cHIgS2luZCBUWVBFX1VJTlQ2NCA9CisgICAgRmllbGRfS2luZF9UWVBFX1VJTlQ2NDsKKyAgc3RhdGljIGNvbnN0ZXhwciBLaW5kIFRZUEVfSU5UMzIgPQorICAgIEZpZWxkX0tpbmRfVFlQRV9JTlQzMjsKKyAgc3RhdGljIGNvbnN0ZXhwciBLaW5kIFRZUEVfRklYRUQ2NCA9CisgICAgRmllbGRfS2luZF9UWVBFX0ZJWEVENjQ7CisgIHN0YXRpYyBjb25zdGV4cHIgS2luZCBUWVBFX0ZJWEVEMzIgPQorICAgIEZpZWxkX0tpbmRfVFlQRV9GSVhFRDMyOworICBzdGF0aWMgY29uc3RleHByIEtpbmQgVFlQRV9CT09MID0KKyAgICBGaWVsZF9LaW5kX1RZUEVfQk9PTDsKKyAgc3RhdGljIGNvbnN0ZXhwciBLaW5kIFRZUEVfU1RSSU5HID0KKyAgICBGaWVsZF9LaW5kX1RZUEVfU1RSSU5HOworICBzdGF0aWMgY29uc3RleHByIEtpbmQgVFlQRV9HUk9VUCA9CisgICAgRmllbGRfS2luZF9UWVBFX0dST1VQOworICBzdGF0aWMgY29uc3RleHByIEtpbmQgVFlQRV9NRVNTQUdFID0KKyAgICBGaWVsZF9LaW5kX1RZUEVfTUVTU0FHRTsKKyAgc3RhdGljIGNvbnN0ZXhwciBLaW5kIFRZUEVfQllURVMgPQorICAgIEZpZWxkX0tpbmRfVFlQRV9CWVRFUzsKKyAgc3RhdGljIGNvbnN0ZXhwciBLaW5kIFRZUEVfVUlOVDMyID0KKyAgICBGaWVsZF9LaW5kX1RZUEVfVUlOVDMyOworICBzdGF0aWMgY29uc3RleHByIEtpbmQgVFlQRV9FTlVNID0KKyAgICBGaWVsZF9LaW5kX1RZUEVfRU5VTTsKKyAgc3RhdGljIGNvbnN0ZXhwciBLaW5kIFRZUEVfU0ZJWEVEMzIgPQorICAgIEZpZWxkX0tpbmRfVFlQRV9TRklYRUQzMjsKKyAgc3RhdGljIGNvbnN0ZXhwciBLaW5kIFRZUEVfU0ZJWEVENjQgPQorICAgIEZpZWxkX0tpbmRfVFlQRV9TRklYRUQ2NDsKKyAgc3RhdGljIGNvbnN0ZXhwciBLaW5kIFRZUEVfU0lOVDMyID0KKyAgICBGaWVsZF9LaW5kX1RZUEVfU0lOVDMyOworICBzdGF0aWMgY29uc3RleHByIEtpbmQgVFlQRV9TSU5UNjQgPQorICAgIEZpZWxkX0tpbmRfVFlQRV9TSU5UNjQ7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBLaW5kX0lzVmFsaWQoaW50IHZhbHVlKSB7CisgICAgcmV0dXJuIEZpZWxkX0tpbmRfSXNWYWxpZCh2YWx1ZSk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBLaW5kIEtpbmRfTUlOID0KKyAgICBGaWVsZF9LaW5kX0tpbmRfTUlOOworICBzdGF0aWMgY29uc3RleHByIEtpbmQgS2luZF9NQVggPQorICAgIEZpZWxkX0tpbmRfS2luZF9NQVg7CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IEtpbmRfQVJSQVlTSVpFID0KKyAgICBGaWVsZF9LaW5kX0tpbmRfQVJSQVlTSVpFOworICBzdGF0aWMgaW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtRGVzY3JpcHRvcioKKyAgS2luZF9kZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBGaWVsZF9LaW5kX2Rlc2NyaXB0b3IoKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBzdGF0aWMgaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBLaW5kX05hbWUoVCBlbnVtX3RfdmFsdWUpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KDo6c3RkOjppc19zYW1lPFQsIEtpbmQ+Ojp2YWx1ZSB8fAorICAgICAgOjpzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSwKKyAgICAgICJJbmNvcnJlY3QgdHlwZSBwYXNzZWQgdG8gZnVuY3Rpb24gS2luZF9OYW1lLiIpOworICAgIHJldHVybiBGaWVsZF9LaW5kX05hbWUoZW51bV90X3ZhbHVlKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgS2luZF9QYXJzZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Q29uc3RTdHJpbmdQYXJhbSBuYW1lLAorICAgICAgS2luZCogdmFsdWUpIHsKKyAgICByZXR1cm4gRmllbGRfS2luZF9QYXJzZShuYW1lLCB2YWx1ZSk7CisgIH0KKworICB0eXBlZGVmIEZpZWxkX0NhcmRpbmFsaXR5IENhcmRpbmFsaXR5OworICBzdGF0aWMgY29uc3RleHByIENhcmRpbmFsaXR5IENBUkRJTkFMSVRZX1VOS05PV04gPQorICAgIEZpZWxkX0NhcmRpbmFsaXR5X0NBUkRJTkFMSVRZX1VOS05PV047CisgIHN0YXRpYyBjb25zdGV4cHIgQ2FyZGluYWxpdHkgQ0FSRElOQUxJVFlfT1BUSU9OQUwgPQorICAgIEZpZWxkX0NhcmRpbmFsaXR5X0NBUkRJTkFMSVRZX09QVElPTkFMOworICBzdGF0aWMgY29uc3RleHByIENhcmRpbmFsaXR5IENBUkRJTkFMSVRZX1JFUVVJUkVEID0KKyAgICBGaWVsZF9DYXJkaW5hbGl0eV9DQVJESU5BTElUWV9SRVFVSVJFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBDYXJkaW5hbGl0eSBDQVJESU5BTElUWV9SRVBFQVRFRCA9CisgICAgRmllbGRfQ2FyZGluYWxpdHlfQ0FSRElOQUxJVFlfUkVQRUFURUQ7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBDYXJkaW5hbGl0eV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICAgIHJldHVybiBGaWVsZF9DYXJkaW5hbGl0eV9Jc1ZhbGlkKHZhbHVlKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIENhcmRpbmFsaXR5IENhcmRpbmFsaXR5X01JTiA9CisgICAgRmllbGRfQ2FyZGluYWxpdHlfQ2FyZGluYWxpdHlfTUlOOworICBzdGF0aWMgY29uc3RleHByIENhcmRpbmFsaXR5IENhcmRpbmFsaXR5X01BWCA9CisgICAgRmllbGRfQ2FyZGluYWxpdHlfQ2FyZGluYWxpdHlfTUFYOworICBzdGF0aWMgY29uc3RleHByIGludCBDYXJkaW5hbGl0eV9BUlJBWVNJWkUgPQorICAgIEZpZWxkX0NhcmRpbmFsaXR5X0NhcmRpbmFsaXR5X0FSUkFZU0laRTsKKyAgc3RhdGljIGlubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bURlc2NyaXB0b3IqCisgIENhcmRpbmFsaXR5X2Rlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEZpZWxkX0NhcmRpbmFsaXR5X2Rlc2NyaXB0b3IoKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBzdGF0aWMgaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBDYXJkaW5hbGl0eV9OYW1lKFQgZW51bV90X3ZhbHVlKSB7CisgICAgc3RhdGljX2Fzc2VydCg6OnN0ZDo6aXNfc2FtZTxULCBDYXJkaW5hbGl0eT46OnZhbHVlIHx8CisgICAgICA6OnN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLAorICAgICAgIkluY29ycmVjdCB0eXBlIHBhc3NlZCB0byBmdW5jdGlvbiBDYXJkaW5hbGl0eV9OYW1lLiIpOworICAgIHJldHVybiBGaWVsZF9DYXJkaW5hbGl0eV9OYW1lKGVudW1fdF92YWx1ZSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIENhcmRpbmFsaXR5X1BhcnNlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpDb25zdFN0cmluZ1BhcmFtIG5hbWUsCisgICAgICBDYXJkaW5hbGl0eSogdmFsdWUpIHsKKyAgICByZXR1cm4gRmllbGRfQ2FyZGluYWxpdHlfUGFyc2UobmFtZSwgdmFsdWUpOworICB9CisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrT3B0aW9uc0ZpZWxkTnVtYmVyID0gOSwKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gNCwKKyAgICBrVHlwZVVybEZpZWxkTnVtYmVyID0gNiwKKyAgICBrSnNvbk5hbWVGaWVsZE51bWJlciA9IDEwLAorICAgIGtEZWZhdWx0VmFsdWVGaWVsZE51bWJlciA9IDExLAorICAgIGtLaW5kRmllbGROdW1iZXIgPSAxLAorICAgIGtDYXJkaW5hbGl0eUZpZWxkTnVtYmVyID0gMiwKKyAgICBrTnVtYmVyRmllbGROdW1iZXIgPSAzLAorICAgIGtPbmVvZkluZGV4RmllbGROdW1iZXIgPSA3LAorICAgIGtQYWNrZWRGaWVsZE51bWJlciA9IDgsCisgIH07CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT3B0aW9uIG9wdGlvbnMgPSA5OworICBpbnQgb3B0aW9uc19zaXplKCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGludCBfaW50ZXJuYWxfb3B0aW9uc19zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9vcHRpb25zKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24qIG11dGFibGVfb3B0aW9ucyhpbnQgaW5kZXgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiA+KgorICAgICAgbXV0YWJsZV9vcHRpb25zKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24mIF9pbnRlcm5hbF9vcHRpb25zKGludCBpbmRleCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24qIF9pbnRlcm5hbF9hZGRfb3B0aW9ucygpOworICBwdWJsaWM6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24mIG9wdGlvbnMoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogYWRkX29wdGlvbnMoKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24gPiYKKyAgICAgIG9wdGlvbnMoKSBjb25zdDsKKworICAvLyBzdHJpbmcgbmFtZSA9IDQ7CisgIHZvaWQgY2xlYXJfbmFtZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X25hbWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF9uYW1lKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgIHB1YmxpYzoKKworICAvLyBzdHJpbmcgdHlwZV91cmwgPSA2OworICB2b2lkIGNsZWFyX3R5cGVfdXJsKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlX3VybCgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X3R5cGVfdXJsKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfdHlwZV91cmwoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX3R5cGVfdXJsKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF90eXBlX3VybChzdGQ6OnN0cmluZyogdHlwZV91cmwpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX3R5cGVfdXJsKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF90eXBlX3VybChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfdHlwZV91cmwoKTsKKyAgcHVibGljOgorCisgIC8vIHN0cmluZyBqc29uX25hbWUgPSAxMDsKKyAgdm9pZCBjbGVhcl9qc29uX25hbWUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25fbmFtZSgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAgPSBjb25zdCBzdGQ6OnN0cmluZyYsIHR5cGVuYW1lLi4uIEFyZ1Q+CisgIHZvaWQgc2V0X2pzb25fbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX2pzb25fbmFtZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2VfanNvbl9uYW1lKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9qc29uX25hbWUoc3RkOjpzdHJpbmcqIGpzb25fbmFtZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfanNvbl9uYW1lKCkgY29uc3Q7CisgIGlubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FIHZvaWQgX2ludGVybmFsX3NldF9qc29uX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX2pzb25fbmFtZSgpOworICBwdWJsaWM6CisKKyAgLy8gc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSAxMTsKKyAgdm9pZCBjbGVhcl9kZWZhdWx0X3ZhbHVlKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0X3ZhbHVlKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfZGVmYXVsdF92YWx1ZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX2RlZmF1bHRfdmFsdWUoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX2RlZmF1bHRfdmFsdWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2RlZmF1bHRfdmFsdWUoc3RkOjpzdHJpbmcqIGRlZmF1bHRfdmFsdWUpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX2RlZmF1bHRfdmFsdWUoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X2RlZmF1bHRfdmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX2RlZmF1bHRfdmFsdWUoKTsKKyAgcHVibGljOgorCisgIC8vIC5nb29nbGUucHJvdG9idWYuRmllbGQuS2luZCBraW5kID0gMTsKKyAgdm9pZCBjbGVhcl9raW5kKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZF9LaW5kIGtpbmQoKSBjb25zdDsKKyAgdm9pZCBzZXRfa2luZCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRfS2luZCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZF9LaW5kIF9pbnRlcm5hbF9raW5kKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9raW5kKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZF9LaW5kIHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIC5nb29nbGUucHJvdG9idWYuRmllbGQuQ2FyZGluYWxpdHkgY2FyZGluYWxpdHkgPSAyOworICB2b2lkIGNsZWFyX2NhcmRpbmFsaXR5KCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZF9DYXJkaW5hbGl0eSBjYXJkaW5hbGl0eSgpIGNvbnN0OworICB2b2lkIHNldF9jYXJkaW5hbGl0eSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRfQ2FyZGluYWxpdHkgdmFsdWUpOworICBwcml2YXRlOgorICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRfQ2FyZGluYWxpdHkgX2ludGVybmFsX2NhcmRpbmFsaXR5KCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9jYXJkaW5hbGl0eSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRfQ2FyZGluYWxpdHkgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gaW50MzIgbnVtYmVyID0gMzsKKyAgdm9pZCBjbGVhcl9udW1iZXIoKTsKKyAgaW50MzJfdCBudW1iZXIoKSBjb25zdDsKKyAgdm9pZCBzZXRfbnVtYmVyKGludDMyX3QgdmFsdWUpOworICBwcml2YXRlOgorICBpbnQzMl90IF9pbnRlcm5hbF9udW1iZXIoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X251bWJlcihpbnQzMl90IHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIGludDMyIG9uZW9mX2luZGV4ID0gNzsKKyAgdm9pZCBjbGVhcl9vbmVvZl9pbmRleCgpOworICBpbnQzMl90IG9uZW9mX2luZGV4KCkgY29uc3Q7CisgIHZvaWQgc2V0X29uZW9mX2luZGV4KGludDMyX3QgdmFsdWUpOworICBwcml2YXRlOgorICBpbnQzMl90IF9pbnRlcm5hbF9vbmVvZl9pbmRleCgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfb25lb2ZfaW5kZXgoaW50MzJfdCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBib29sIHBhY2tlZCA9IDg7CisgIHZvaWQgY2xlYXJfcGFja2VkKCk7CisgIGJvb2wgcGFja2VkKCkgY29uc3Q7CisgIHZvaWQgc2V0X3BhY2tlZChib29sIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgYm9vbCBfaW50ZXJuYWxfcGFja2VkKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9wYWNrZWQoYm9vbCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiA+IG9wdGlvbnNfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgbmFtZV87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciB0eXBlX3VybF87CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBqc29uX25hbWVfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgZGVmYXVsdF92YWx1ZV87CisgICAgaW50IGtpbmRfOworICAgIGludCBjYXJkaW5hbGl0eV87CisgICAgaW50MzJfdCBudW1iZXJfOworICAgIGludDMyX3Qgb25lb2ZfaW5kZXhfOworICAgIGJvb2wgcGFja2VkXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEVudW0gZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuRW51bSkgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIEVudW0oKSA6IEVudW0obnVsbHB0cikge30KKyAgfkVudW0oKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIEVudW0oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBFbnVtKGNvbnN0IEVudW0mIGZyb20pOworICBFbnVtKEVudW0mJiBmcm9tKSBub2V4Y2VwdAorICAgIDogRW51bSgpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIEVudW0mIG9wZXJhdG9yPShjb25zdCBFbnVtJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBFbnVtJiBvcGVyYXRvcj0oRW51bSYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBFbnVtJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgRW51bSogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbnVtKj4oCisgICAgICAgICAgICAgICAmX0VudW1fZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAyOworCisgIGZyaWVuZCB2b2lkIHN3YXAoRW51bSYgYSwgRW51bSYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChFbnVtKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChFbnVtKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBFbnVtKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPEVudW0+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgRW51bSYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBFbnVtJiBmcm9tKSB7CisgICAgRW51bTo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKEVudW0qIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuRW51bSI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBFbnVtKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrRW51bXZhbHVlRmllbGROdW1iZXIgPSAyLAorICAgIGtPcHRpb25zRmllbGROdW1iZXIgPSAzLAorICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtTb3VyY2VDb250ZXh0RmllbGROdW1iZXIgPSA0LAorICAgIGtTeW50YXhGaWVsZE51bWJlciA9IDUsCisgIH07CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlIGVudW12YWx1ZSA9IDI7CisgIGludCBlbnVtdmFsdWVfc2l6ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBpbnQgX2ludGVybmFsX2VudW12YWx1ZV9zaXplKCkgY29uc3Q7CisgIHB1YmxpYzoKKyAgdm9pZCBjbGVhcl9lbnVtdmFsdWUoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZSogbXV0YWJsZV9lbnVtdmFsdWUoaW50IGluZGV4KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWUgPioKKyAgICAgIG11dGFibGVfZW51bXZhbHVlKCk7CisgIHByaXZhdGU6CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWUmIF9pbnRlcm5hbF9lbnVtdmFsdWUoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZSogX2ludGVybmFsX2FkZF9lbnVtdmFsdWUoKTsKKyAgcHVibGljOgorICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlJiBlbnVtdmFsdWUoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZSogYWRkX2VudW12YWx1ZSgpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZSA+JgorICAgICAgZW51bXZhbHVlKCkgY29uc3Q7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PcHRpb24gb3B0aW9ucyA9IDM7CisgIGludCBvcHRpb25zX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9vcHRpb25zX3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX29wdGlvbnMoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogbXV0YWJsZV9vcHRpb25zKGludCBpbmRleCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uID4qCisgICAgICBtdXRhYmxlX29wdGlvbnMoKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiYgX2ludGVybmFsX29wdGlvbnMoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogX2ludGVybmFsX2FkZF9vcHRpb25zKCk7CisgIHB1YmxpYzoKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiYgb3B0aW9ucyhpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uKiBhZGRfb3B0aW9ucygpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiA+JgorICAgICAgb3B0aW9ucygpIGNvbnN0OworCisgIC8vIHN0cmluZyBuYW1lID0gMTsKKyAgdm9pZCBjbGVhcl9uYW1lKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX25hbWUoc3RkOjpzdHJpbmcqIG5hbWUpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX25hbWUoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgcHVibGljOgorCisgIC8vIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dCBzb3VyY2VfY29udGV4dCA9IDQ7CisgIGJvb2wgaGFzX3NvdXJjZV9jb250ZXh0KCkgY29uc3Q7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX2hhc19zb3VyY2VfY29udGV4dCgpIGNvbnN0OworICBwdWJsaWM6CisgIHZvaWQgY2xlYXJfc291cmNlX2NvbnRleHQoKTsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQmIHNvdXJjZV9jb250ZXh0KCkgY29uc3Q7CisgIFBST1RPQlVGX05PRElTQ0FSRCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogcmVsZWFzZV9zb3VyY2VfY29udGV4dCgpOworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogbXV0YWJsZV9zb3VyY2VfY29udGV4dCgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfc291cmNlX2NvbnRleHQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIHNvdXJjZV9jb250ZXh0KTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQmIF9pbnRlcm5hbF9zb3VyY2VfY29udGV4dCgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogX2ludGVybmFsX211dGFibGVfc291cmNlX2NvbnRleHQoKTsKKyAgcHVibGljOgorICB2b2lkIHVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkX3NvdXJjZV9jb250ZXh0KAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIHNvdXJjZV9jb250ZXh0KTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIHVuc2FmZV9hcmVuYV9yZWxlYXNlX3NvdXJjZV9jb250ZXh0KCk7CisKKyAgLy8gLmdvb2dsZS5wcm90b2J1Zi5TeW50YXggc3ludGF4ID0gNTsKKyAgdm9pZCBjbGVhcl9zeW50YXgoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheCBzeW50YXgoKSBjb25zdDsKKyAgdm9pZCBzZXRfc3ludGF4KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTeW50YXggdmFsdWUpOworICBwcml2YXRlOgorICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3ludGF4IF9pbnRlcm5hbF9zeW50YXgoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X3N5bnRheCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3ludGF4IHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRW51bSkKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWUgPiBlbnVtdmFsdWVfOworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uID4gb3B0aW9uc187CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogc291cmNlX2NvbnRleHRfOworICAgIGludCBzeW50YXhfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZ0eXBlXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRW51bVZhbHVlIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZSkgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIEVudW1WYWx1ZSgpIDogRW51bVZhbHVlKG51bGxwdHIpIHt9CisgIH5FbnVtVmFsdWUoKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIEVudW1WYWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIEVudW1WYWx1ZShjb25zdCBFbnVtVmFsdWUmIGZyb20pOworICBFbnVtVmFsdWUoRW51bVZhbHVlJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IEVudW1WYWx1ZSgpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIEVudW1WYWx1ZSYgb3BlcmF0b3I9KGNvbnN0IEVudW1WYWx1ZSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgRW51bVZhbHVlJiBvcGVyYXRvcj0oRW51bVZhbHVlJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IEVudW1WYWx1ZSYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gKmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IEVudW1WYWx1ZSogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbnVtVmFsdWUqPigKKyAgICAgICAgICAgICAgICZfRW51bVZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9CisgICAgMzsKKworICBmcmllbmQgdm9pZCBzd2FwKEVudW1WYWx1ZSYgYSwgRW51bVZhbHVlJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKEVudW1WYWx1ZSogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICBHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICAjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdlbmVyaWNTd2FwKHRoaXMsIG90aGVyKTsKKyAgICB9CisgIH0KKyAgdm9pZCBVbnNhZmVBcmVuYVN3YXAoRW51bVZhbHVlKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBFbnVtVmFsdWUqIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8RW51bVZhbHVlPihhcmVuYSk7CisgIH0KKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlGcm9tOworICB2b2lkIENvcHlGcm9tKGNvbnN0IEVudW1WYWx1ZSYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBFbnVtVmFsdWUmIGZyb20pIHsKKyAgICBFbnVtVmFsdWU6Ok1lcmdlSW1wbCgqdGhpcywgZnJvbSk7CisgIH0KKyAgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgTWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZyk7CisgIHB1YmxpYzoKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IGZpbmFsOworICB2b2lkIEludGVybmFsU3dhcChFbnVtVmFsdWUqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuRW51bVZhbHVlIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEVudW1WYWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXzsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDsKKworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga09wdGlvbnNGaWVsZE51bWJlciA9IDMsCisgICAga05hbWVGaWVsZE51bWJlciA9IDEsCisgICAga051bWJlckZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PcHRpb24gb3B0aW9ucyA9IDM7CisgIGludCBvcHRpb25zX3NpemUoKSBjb25zdDsKKyAgcHJpdmF0ZToKKyAgaW50IF9pbnRlcm5hbF9vcHRpb25zX3NpemUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX29wdGlvbnMoKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogbXV0YWJsZV9vcHRpb25zKGludCBpbmRleCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uID4qCisgICAgICBtdXRhYmxlX29wdGlvbnMoKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiYgX2ludGVybmFsX29wdGlvbnMoaW50IGluZGV4KSBjb25zdDsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogX2ludGVybmFsX2FkZF9vcHRpb25zKCk7CisgIHB1YmxpYzoKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiYgb3B0aW9ucyhpbnQgaW5kZXgpIGNvbnN0OworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uKiBhZGRfb3B0aW9ucygpOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiA+JgorICAgICAgb3B0aW9ucygpIGNvbnN0OworCisgIC8vIHN0cmluZyBuYW1lID0gMTsKKyAgdm9pZCBjbGVhcl9uYW1lKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgUFJPVE9CVUZfTk9ESVNDQVJEIHN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX25hbWUoc3RkOjpzdHJpbmcqIG5hbWUpOworICBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyYgX2ludGVybmFsX25hbWUoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgcHVibGljOgorCisgIC8vIGludDMyIG51bWJlciA9IDI7CisgIHZvaWQgY2xlYXJfbnVtYmVyKCk7CisgIGludDMyX3QgbnVtYmVyKCkgY29uc3Q7CisgIHZvaWQgc2V0X251bWJlcihpbnQzMl90IHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgaW50MzJfdCBfaW50ZXJuYWxfbnVtYmVyKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9udW1iZXIoaW50MzJfdCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZSkKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24gPiBvcHRpb25zXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIG5hbWVfOworICAgIGludDMyX3QgbnVtYmVyXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIE9wdGlvbiBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5PcHRpb24pICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBPcHRpb24oKSA6IE9wdGlvbihudWxscHRyKSB7fQorICB+T3B0aW9uKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBPcHRpb24oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBPcHRpb24oY29uc3QgT3B0aW9uJiBmcm9tKTsKKyAgT3B0aW9uKE9wdGlvbiYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBPcHRpb24oKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBPcHRpb24mIG9wZXJhdG9yPShjb25zdCBPcHRpb24mIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIE9wdGlvbiYgb3BlcmF0b3I9KE9wdGlvbiYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBPcHRpb24mIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBPcHRpb24qIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgT3B0aW9uKj4oCisgICAgICAgICAgICAgICAmX09wdGlvbl9kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDQ7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChPcHRpb24mIGEsIE9wdGlvbiYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChPcHRpb24qIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKE9wdGlvbiogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgT3B0aW9uKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPE9wdGlvbj4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBPcHRpb24mIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgT3B0aW9uJiBmcm9tKSB7CisgICAgT3B0aW9uOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoT3B0aW9uKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLk9wdGlvbiI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBPcHRpb24oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtWYWx1ZUZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgLy8gc3RyaW5nIG5hbWUgPSAxOworICB2b2lkIGNsZWFyX25hbWUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF9uYW1lKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKTsKKyAgc3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZShzdGQ6OnN0cmluZyogbmFtZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfbmFtZSgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICBwdWJsaWM6CisKKyAgLy8gLmdvb2dsZS5wcm90b2J1Zi5BbnkgdmFsdWUgPSAyOworICBib29sIGhhc192YWx1ZSgpIGNvbnN0OworICBwcml2YXRlOgorICBib29sIF9pbnRlcm5hbF9oYXNfdmFsdWUoKSBjb25zdDsKKyAgcHVibGljOgorICB2b2lkIGNsZWFyX3ZhbHVlKCk7CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBbnkmIHZhbHVlKCkgY29uc3Q7CisgIFBST1RPQlVGX05PRElTQ0FSRCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QW55KiByZWxlYXNlX3ZhbHVlKCk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBbnkqIG11dGFibGVfdmFsdWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX3ZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBbnkqIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSYgX2ludGVybmFsX3ZhbHVlKCkgY29uc3Q7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBbnkqIF9pbnRlcm5hbF9tdXRhYmxlX3ZhbHVlKCk7CisgIHB1YmxpYzoKKyAgdm9pZCB1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF92YWx1ZSgKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBbnkqIHZhbHVlKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSogdW5zYWZlX2FyZW5hX3JlbGVhc2VfdmFsdWUoKTsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk9wdGlvbikKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QW55KiB2YWx1ZV87CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZnR5cGVfMmVwcm90bzsKK307CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzdHJpY3QtYWxpYXNpbmciCisjZW5kaWYgIC8vIF9fR05VQ19fCisvLyBUeXBlCisKKy8vIHN0cmluZyBuYW1lID0gMTsKK2lubGluZSB2b2lkIFR5cGU6OmNsZWFyX25hbWUoKSB7CisgIF9pbXBsXy5uYW1lXy5DbGVhclRvRW1wdHkoKTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgVHlwZTo6bmFtZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVHlwZS5uYW1lKQorICByZXR1cm4gX2ludGVybmFsX25hbWUoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCwgdHlwZW5hbWUuLi4gQXJnVD4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCit2b2lkIFR5cGU6OnNldF9uYW1lKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgCisgX2ltcGxfLm5hbWVfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVHlwZS5uYW1lKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBUeXBlOjptdXRhYmxlX25hbWUoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlR5cGUubmFtZSkKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBUeXBlOjpfaW50ZXJuYWxfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIFR5cGU6Ol9pbnRlcm5hbF9zZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5uYW1lXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogVHlwZTo6X2ludGVybmFsX211dGFibGVfbmFtZSgpIHsKKyAgCisgIHJldHVybiBfaW1wbF8ubmFtZV8uTXV0YWJsZShHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFR5cGU6OnJlbGVhc2VfbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLlR5cGUubmFtZSkKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5SZWxlYXNlKCk7Cit9CitpbmxpbmUgdm9pZCBUeXBlOjpzZXRfYWxsb2NhdGVkX25hbWUoc3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWUgIT0gbnVsbHB0cikgeworICAgIAorICB9IGVsc2UgeworICAgIAorICB9CisgIF9pbXBsXy5uYW1lXy5TZXRBbGxvY2F0ZWQobmFtZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5uYW1lXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlR5cGUubmFtZSkKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZCBmaWVsZHMgPSAyOworaW5saW5lIGludCBUeXBlOjpfaW50ZXJuYWxfZmllbGRzX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZmllbGRzXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IFR5cGU6OmZpZWxkc19zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2ZpZWxkc19zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBUeXBlOjpjbGVhcl9maWVsZHMoKSB7CisgIF9pbXBsXy5maWVsZHNfLkNsZWFyKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkKiBUeXBlOjptdXRhYmxlX2ZpZWxkcyhpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlR5cGUuZmllbGRzKQorICByZXR1cm4gX2ltcGxfLmZpZWxkc18uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZCA+KgorVHlwZTo6bXV0YWJsZV9maWVsZHMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlR5cGUuZmllbGRzKQorICByZXR1cm4gJl9pbXBsXy5maWVsZHNfOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZCYgVHlwZTo6X2ludGVybmFsX2ZpZWxkcyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5maWVsZHNfLkdldChpbmRleCk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkJiBUeXBlOjpmaWVsZHMoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlR5cGUuZmllbGRzKQorICByZXR1cm4gX2ludGVybmFsX2ZpZWxkcyhpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkKiBUeXBlOjpfaW50ZXJuYWxfYWRkX2ZpZWxkcygpIHsKKyAgcmV0dXJuIF9pbXBsXy5maWVsZHNfLkFkZCgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZCogVHlwZTo6YWRkX2ZpZWxkcygpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkKiBfYWRkID0gX2ludGVybmFsX2FkZF9maWVsZHMoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuVHlwZS5maWVsZHMpCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGQgPiYKK1R5cGU6OmZpZWxkcygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlR5cGUuZmllbGRzKQorICByZXR1cm4gX2ltcGxfLmZpZWxkc187Cit9CisKKy8vIHJlcGVhdGVkIHN0cmluZyBvbmVvZnMgPSAzOworaW5saW5lIGludCBUeXBlOjpfaW50ZXJuYWxfb25lb2ZzX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ub25lb2ZzXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IFR5cGU6Om9uZW9mc19zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX29uZW9mc19zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBUeXBlOjpjbGVhcl9vbmVvZnMoKSB7CisgIF9pbXBsXy5vbmVvZnNfLkNsZWFyKCk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFR5cGU6OmFkZF9vbmVvZnMoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9hZGRfb25lb2ZzKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuVHlwZS5vbmVvZnMpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgVHlwZTo6X2ludGVybmFsX29uZW9mcyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5vbmVvZnNfLkdldChpbmRleCk7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIFR5cGU6Om9uZW9mcyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVHlwZS5vbmVvZnMpCisgIHJldHVybiBfaW50ZXJuYWxfb25lb2ZzKGluZGV4KTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogVHlwZTo6bXV0YWJsZV9vbmVvZnMoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5UeXBlLm9uZW9mcykKKyAgcmV0dXJuIF9pbXBsXy5vbmVvZnNfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIHZvaWQgVHlwZTo6c2V0X29uZW9mcyhpbnQgaW5kZXgsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBfaW1wbF8ub25lb2ZzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVHlwZS5vbmVvZnMpCit9CitpbmxpbmUgdm9pZCBUeXBlOjpzZXRfb25lb2ZzKGludCBpbmRleCwgc3RkOjpzdHJpbmcmJiB2YWx1ZSkgeworICBfaW1wbF8ub25lb2ZzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHN0ZDo6bW92ZSh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5UeXBlLm9uZW9mcykKK30KK2lubGluZSB2b2lkIFR5cGU6OnNldF9vbmVvZnMoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICBHT09HTEVfRENIRUNLKHZhbHVlICE9IG51bGxwdHIpOworICBfaW1wbF8ub25lb2ZzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5UeXBlLm9uZW9mcykKK30KK2lubGluZSB2b2lkIFR5cGU6OnNldF9vbmVvZnMoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgX2ltcGxfLm9uZW9mc18uTXV0YWJsZShpbmRleCktPmFzc2lnbigKKyAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLlR5cGUub25lb2ZzKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBUeXBlOjpfaW50ZXJuYWxfYWRkX29uZW9mcygpIHsKKyAgcmV0dXJuIF9pbXBsXy5vbmVvZnNfLkFkZCgpOworfQoraW5saW5lIHZvaWQgVHlwZTo6YWRkX29uZW9mcyhjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgX2ltcGxfLm9uZW9mc18uQWRkKCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlR5cGUub25lb2ZzKQorfQoraW5saW5lIHZvaWQgVHlwZTo6YWRkX29uZW9mcyhzdGQ6OnN0cmluZyYmIHZhbHVlKSB7CisgIF9pbXBsXy5vbmVvZnNfLkFkZChzdGQ6Om1vdmUodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuVHlwZS5vbmVvZnMpCit9CitpbmxpbmUgdm9pZCBUeXBlOjphZGRfb25lb2ZzKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0sodmFsdWUgIT0gbnVsbHB0cik7CisgIF9pbXBsXy5vbmVvZnNfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX2NoYXI6Z29vZ2xlLnByb3RvYnVmLlR5cGUub25lb2ZzKQorfQoraW5saW5lIHZvaWQgVHlwZTo6YWRkX29uZW9mcyhjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgX2ltcGxfLm9uZW9mc18uQWRkKCktPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLlR5cGUub25lb2ZzKQorfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPHN0ZDo6c3RyaW5nPiYKK1R5cGU6Om9uZW9mcygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlR5cGUub25lb2ZzKQorICByZXR1cm4gX2ltcGxfLm9uZW9mc187Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8c3RkOjpzdHJpbmc+KgorVHlwZTo6bXV0YWJsZV9vbmVvZnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlR5cGUub25lb2ZzKQorICByZXR1cm4gJl9pbXBsXy5vbmVvZnNfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk9wdGlvbiBvcHRpb25zID0gNDsKK2lubGluZSBpbnQgVHlwZTo6X2ludGVybmFsX29wdGlvbnNfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IFR5cGU6Om9wdGlvbnNfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9vcHRpb25zX3NpemUoKTsKK30KK2lubGluZSB2b2lkIFR5cGU6OmNsZWFyX29wdGlvbnMoKSB7CisgIF9pbXBsXy5vcHRpb25zXy5DbGVhcigpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24qIFR5cGU6Om11dGFibGVfb3B0aW9ucyhpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlR5cGUub3B0aW9ucykKKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiA+KgorVHlwZTo6bXV0YWJsZV9vcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5UeXBlLm9wdGlvbnMpCisgIHJldHVybiAmX2ltcGxfLm9wdGlvbnNfOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24mIFR5cGU6Ol9pbnRlcm5hbF9vcHRpb25zKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm9wdGlvbnNfLkdldChpbmRleCk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiYgVHlwZTo6b3B0aW9ucyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVHlwZS5vcHRpb25zKQorICByZXR1cm4gX2ludGVybmFsX29wdGlvbnMoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24qIFR5cGU6Ol9pbnRlcm5hbF9hZGRfb3B0aW9ucygpIHsKKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXy5BZGQoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uKiBUeXBlOjphZGRfb3B0aW9ucygpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogX2FkZCA9IF9pbnRlcm5hbF9hZGRfb3B0aW9ucygpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5UeXBlLm9wdGlvbnMpCisgIHJldHVybiBfYWRkOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uID4mCitUeXBlOjpvcHRpb25zKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuVHlwZS5vcHRpb25zKQorICByZXR1cm4gX2ltcGxfLm9wdGlvbnNfOworfQorCisvLyAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQgc291cmNlX2NvbnRleHQgPSA1OworaW5saW5lIGJvb2wgVHlwZTo6X2ludGVybmFsX2hhc19zb3VyY2VfY29udGV4dCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRoaXMgIT0gaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpICYmIF9pbXBsXy5zb3VyY2VfY29udGV4dF8gIT0gbnVsbHB0cjsKK30KK2lubGluZSBib29sIFR5cGU6Omhhc19zb3VyY2VfY29udGV4dCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfc291cmNlX2NvbnRleHQoKTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCYgVHlwZTo6X2ludGVybmFsX3NvdXJjZV9jb250ZXh0KCkgY29uc3QgeworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogcCA9IF9pbXBsXy5zb3VyY2VfY29udGV4dF87CisgIHJldHVybiBwICE9IG51bGxwdHIgPyAqcCA6IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQmPigKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfU291cmNlQ29udGV4dF9kZWZhdWx0X2luc3RhbmNlXyk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQmIFR5cGU6OnNvdXJjZV9jb250ZXh0KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5UeXBlLnNvdXJjZV9jb250ZXh0KQorICByZXR1cm4gX2ludGVybmFsX3NvdXJjZV9jb250ZXh0KCk7Cit9CitpbmxpbmUgdm9pZCBUeXBlOjp1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF9zb3VyY2VfY29udGV4dCgKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogc291cmNlX2NvbnRleHQpIHsKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPihfaW1wbF8uc291cmNlX2NvbnRleHRfKTsKKyAgfQorICBfaW1wbF8uc291cmNlX2NvbnRleHRfID0gc291cmNlX2NvbnRleHQ7CisgIGlmIChzb3VyY2VfY29udGV4dCkgeworICAgIAorICB9IGVsc2UgeworICAgIAorICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuVHlwZS5zb3VyY2VfY29udGV4dCkKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogVHlwZTo6cmVsZWFzZV9zb3VyY2VfY29udGV4dCgpIHsKKyAgCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0KiB0ZW1wID0gX2ltcGxfLnNvdXJjZV9jb250ZXh0XzsKKyAgX2ltcGxfLnNvdXJjZV9jb250ZXh0XyA9IG51bGxwdHI7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGF1dG8qIG9sZCA9ICByZWludGVycHJldF9jYXN0PDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSo+KHRlbXApOworICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7IGRlbGV0ZSBvbGQ7IH0KKyNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgaWYgKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpICE9IG51bGxwdHIpIHsKKyAgICB0ZW1wID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpEdXBsaWNhdGVJZk5vbk51bGwodGVtcCk7CisgIH0KKyNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICByZXR1cm4gdGVtcDsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogVHlwZTo6dW5zYWZlX2FyZW5hX3JlbGVhc2Vfc291cmNlX2NvbnRleHQoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5UeXBlLnNvdXJjZV9jb250ZXh0KQorICAKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIHRlbXAgPSBfaW1wbF8uc291cmNlX2NvbnRleHRfOworICBfaW1wbF8uc291cmNlX2NvbnRleHRfID0gbnVsbHB0cjsKKyAgcmV0dXJuIHRlbXA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIFR5cGU6Ol9pbnRlcm5hbF9tdXRhYmxlX3NvdXJjZV9jb250ZXh0KCkgeworICAKKyAgaWYgKF9pbXBsXy5zb3VyY2VfY29udGV4dF8gPT0gbnVsbHB0cikgeworICAgIGF1dG8qIHAgPSBDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQ+KEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgICBfaW1wbF8uc291cmNlX2NvbnRleHRfID0gcDsKKyAgfQorICByZXR1cm4gX2ltcGxfLnNvdXJjZV9jb250ZXh0XzsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogVHlwZTo6bXV0YWJsZV9zb3VyY2VfY29udGV4dCgpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIF9tc2cgPSBfaW50ZXJuYWxfbXV0YWJsZV9zb3VyY2VfY29udGV4dCgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuVHlwZS5zb3VyY2VfY29udGV4dCkKKyAgcmV0dXJuIF9tc2c7Cit9CitpbmxpbmUgdm9pZCBUeXBlOjpzZXRfYWxsb2NhdGVkX3NvdXJjZV9jb250ZXh0KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0KiBzb3VyY2VfY29udGV4dCkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIG1lc3NhZ2VfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgaWYgKG1lc3NhZ2VfYXJlbmEgPT0gbnVsbHB0cikgeworICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPihfaW1wbF8uc291cmNlX2NvbnRleHRfKTsKKyAgfQorICBpZiAoc291cmNlX2NvbnRleHQpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIHN1Ym1lc3NhZ2VfYXJlbmEgPQorICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPihzb3VyY2VfY29udGV4dCkpOworICAgIGlmIChtZXNzYWdlX2FyZW5hICE9IHN1Ym1lc3NhZ2VfYXJlbmEpIHsKKyAgICAgIHNvdXJjZV9jb250ZXh0ID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZXRPd25lZE1lc3NhZ2UoCisgICAgICAgICAgbWVzc2FnZV9hcmVuYSwgc291cmNlX2NvbnRleHQsIHN1Ym1lc3NhZ2VfYXJlbmEpOworICAgIH0KKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBfaW1wbF8uc291cmNlX2NvbnRleHRfID0gc291cmNlX2NvbnRleHQ7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5UeXBlLnNvdXJjZV9jb250ZXh0KQorfQorCisvLyAuZ29vZ2xlLnByb3RvYnVmLlN5bnRheCBzeW50YXggPSA2OworaW5saW5lIHZvaWQgVHlwZTo6Y2xlYXJfc3ludGF4KCkgeworICBfaW1wbF8uc3ludGF4XyA9IDA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheCBUeXBlOjpfaW50ZXJuYWxfc3ludGF4KCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTeW50YXggPihfaW1wbF8uc3ludGF4Xyk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheCBUeXBlOjpzeW50YXgoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlR5cGUuc3ludGF4KQorICByZXR1cm4gX2ludGVybmFsX3N5bnRheCgpOworfQoraW5saW5lIHZvaWQgVHlwZTo6X2ludGVybmFsX3NldF9zeW50YXgoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheCB2YWx1ZSkgeworICAKKyAgX2ltcGxfLnN5bnRheF8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIFR5cGU6OnNldF9zeW50YXgoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X3N5bnRheCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlR5cGUuc3ludGF4KQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEZpZWxkCisKKy8vIC5nb29nbGUucHJvdG9idWYuRmllbGQuS2luZCBraW5kID0gMTsKK2lubGluZSB2b2lkIEZpZWxkOjpjbGVhcl9raW5kKCkgeworICBfaW1wbF8ua2luZF8gPSAwOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZF9LaW5kIEZpZWxkOjpfaW50ZXJuYWxfa2luZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRfS2luZCA+KF9pbXBsXy5raW5kXyk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkX0tpbmQgRmllbGQ6OmtpbmQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLmtpbmQpCisgIHJldHVybiBfaW50ZXJuYWxfa2luZCgpOworfQoraW5saW5lIHZvaWQgRmllbGQ6Ol9pbnRlcm5hbF9zZXRfa2luZCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRfS2luZCB2YWx1ZSkgeworICAKKyAgX2ltcGxfLmtpbmRfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZDo6c2V0X2tpbmQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkX0tpbmQgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9raW5kKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGQua2luZCkKK30KKworLy8gLmdvb2dsZS5wcm90b2J1Zi5GaWVsZC5DYXJkaW5hbGl0eSBjYXJkaW5hbGl0eSA9IDI7CitpbmxpbmUgdm9pZCBGaWVsZDo6Y2xlYXJfY2FyZGluYWxpdHkoKSB7CisgIF9pbXBsXy5jYXJkaW5hbGl0eV8gPSAwOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZF9DYXJkaW5hbGl0eSBGaWVsZDo6X2ludGVybmFsX2NhcmRpbmFsaXR5KCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZF9DYXJkaW5hbGl0eSA+KF9pbXBsXy5jYXJkaW5hbGl0eV8pOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZF9DYXJkaW5hbGl0eSBGaWVsZDo6Y2FyZGluYWxpdHkoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLmNhcmRpbmFsaXR5KQorICByZXR1cm4gX2ludGVybmFsX2NhcmRpbmFsaXR5KCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZDo6X2ludGVybmFsX3NldF9jYXJkaW5hbGl0eSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRfQ2FyZGluYWxpdHkgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5jYXJkaW5hbGl0eV8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEZpZWxkOjpzZXRfY2FyZGluYWxpdHkoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkX0NhcmRpbmFsaXR5IHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfY2FyZGluYWxpdHkodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZC5jYXJkaW5hbGl0eSkKK30KKworLy8gaW50MzIgbnVtYmVyID0gMzsKK2lubGluZSB2b2lkIEZpZWxkOjpjbGVhcl9udW1iZXIoKSB7CisgIF9pbXBsXy5udW1iZXJfID0gMDsKK30KK2lubGluZSBpbnQzMl90IEZpZWxkOjpfaW50ZXJuYWxfbnVtYmVyKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm51bWJlcl87Cit9CitpbmxpbmUgaW50MzJfdCBGaWVsZDo6bnVtYmVyKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZC5udW1iZXIpCisgIHJldHVybiBfaW50ZXJuYWxfbnVtYmVyKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZDo6X2ludGVybmFsX3NldF9udW1iZXIoaW50MzJfdCB2YWx1ZSkgeworICAKKyAgX2ltcGxfLm51bWJlcl8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEZpZWxkOjpzZXRfbnVtYmVyKGludDMyX3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9udW1iZXIodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZC5udW1iZXIpCit9CisKKy8vIHN0cmluZyBuYW1lID0gNDsKK2lubGluZSB2b2lkIEZpZWxkOjpjbGVhcl9uYW1lKCkgeworICBfaW1wbF8ubmFtZV8uQ2xlYXJUb0VtcHR5KCk7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpZWxkOjpuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZC5uYW1lKQorICByZXR1cm4gX2ludGVybmFsX25hbWUoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCwgdHlwZW5hbWUuLi4gQXJnVD4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCit2b2lkIEZpZWxkOjpzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIAorIF9pbXBsXy5uYW1lXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLm5hbWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpZWxkOjptdXRhYmxlX25hbWUoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLm5hbWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmllbGQ6Ol9pbnRlcm5hbF9uYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm5hbWVfLkdldCgpOworfQoraW5saW5lIHZvaWQgRmllbGQ6Ol9pbnRlcm5hbF9zZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5uYW1lXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmllbGQ6Ol9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKSB7CisgIAorICByZXR1cm4gX2ltcGxfLm5hbWVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWVsZDo6cmVsZWFzZV9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmllbGQubmFtZSkKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5SZWxlYXNlKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZDo6c2V0X2FsbG9jYXRlZF9uYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lICE9IG51bGxwdHIpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBfaW1wbF8ubmFtZV8uU2V0QWxsb2NhdGVkKG5hbWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ubmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWVsZC5uYW1lKQorfQorCisvLyBzdHJpbmcgdHlwZV91cmwgPSA2OworaW5saW5lIHZvaWQgRmllbGQ6OmNsZWFyX3R5cGVfdXJsKCkgeworICBfaW1wbF8udHlwZV91cmxfLkNsZWFyVG9FbXB0eSgpOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBGaWVsZDo6dHlwZV91cmwoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLnR5cGVfdXJsKQorICByZXR1cm4gX2ludGVybmFsX3R5cGVfdXJsKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBGaWVsZDo6c2V0X3R5cGVfdXJsKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgCisgX2ltcGxfLnR5cGVfdXJsXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLnR5cGVfdXJsKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWVsZDo6bXV0YWJsZV90eXBlX3VybCgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfdHlwZV91cmwoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLnR5cGVfdXJsKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpZWxkOjpfaW50ZXJuYWxfdHlwZV91cmwoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8udHlwZV91cmxfLkdldCgpOworfQoraW5saW5lIHZvaWQgRmllbGQ6Ol9pbnRlcm5hbF9zZXRfdHlwZV91cmwoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIAorICBfaW1wbF8udHlwZV91cmxfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWVsZDo6X2ludGVybmFsX211dGFibGVfdHlwZV91cmwoKSB7CisgIAorICByZXR1cm4gX2ltcGxfLnR5cGVfdXJsXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmllbGQ6OnJlbGVhc2VfdHlwZV91cmwoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZC50eXBlX3VybCkKKyAgcmV0dXJuIF9pbXBsXy50eXBlX3VybF8uUmVsZWFzZSgpOworfQoraW5saW5lIHZvaWQgRmllbGQ6OnNldF9hbGxvY2F0ZWRfdHlwZV91cmwoc3RkOjpzdHJpbmcqIHR5cGVfdXJsKSB7CisgIGlmICh0eXBlX3VybCAhPSBudWxscHRyKSB7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgIH0KKyAgX2ltcGxfLnR5cGVfdXJsXy5TZXRBbGxvY2F0ZWQodHlwZV91cmwsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8udHlwZV91cmxfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLnR5cGVfdXJsXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLnR5cGVfdXJsKQorfQorCisvLyBpbnQzMiBvbmVvZl9pbmRleCA9IDc7CitpbmxpbmUgdm9pZCBGaWVsZDo6Y2xlYXJfb25lb2ZfaW5kZXgoKSB7CisgIF9pbXBsXy5vbmVvZl9pbmRleF8gPSAwOworfQoraW5saW5lIGludDMyX3QgRmllbGQ6Ol9pbnRlcm5hbF9vbmVvZl9pbmRleCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5vbmVvZl9pbmRleF87Cit9CitpbmxpbmUgaW50MzJfdCBGaWVsZDo6b25lb2ZfaW5kZXgoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLm9uZW9mX2luZGV4KQorICByZXR1cm4gX2ludGVybmFsX29uZW9mX2luZGV4KCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZDo6X2ludGVybmFsX3NldF9vbmVvZl9pbmRleChpbnQzMl90IHZhbHVlKSB7CisgIAorICBfaW1wbF8ub25lb2ZfaW5kZXhfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZDo6c2V0X29uZW9mX2luZGV4KGludDMyX3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9vbmVvZl9pbmRleCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLm9uZW9mX2luZGV4KQorfQorCisvLyBib29sIHBhY2tlZCA9IDg7CitpbmxpbmUgdm9pZCBGaWVsZDo6Y2xlYXJfcGFja2VkKCkgeworICBfaW1wbF8ucGFja2VkXyA9IGZhbHNlOworfQoraW5saW5lIGJvb2wgRmllbGQ6Ol9pbnRlcm5hbF9wYWNrZWQoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ucGFja2VkXzsKK30KK2lubGluZSBib29sIEZpZWxkOjpwYWNrZWQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLnBhY2tlZCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9wYWNrZWQoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkOjpfaW50ZXJuYWxfc2V0X3BhY2tlZChib29sIHZhbHVlKSB7CisgIAorICBfaW1wbF8ucGFja2VkXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgRmllbGQ6OnNldF9wYWNrZWQoYm9vbCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X3BhY2tlZCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLnBhY2tlZCkKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PcHRpb24gb3B0aW9ucyA9IDk7CitpbmxpbmUgaW50IEZpZWxkOjpfaW50ZXJuYWxfb3B0aW9uc19zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm9wdGlvbnNfLnNpemUoKTsKK30KK2lubGluZSBpbnQgRmllbGQ6Om9wdGlvbnNfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9vcHRpb25zX3NpemUoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkOjpjbGVhcl9vcHRpb25zKCkgeworICBfaW1wbF8ub3B0aW9uc18uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uKiBGaWVsZDo6bXV0YWJsZV9vcHRpb25zKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGQub3B0aW9ucykKKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiA+KgorRmllbGQ6Om11dGFibGVfb3B0aW9ucygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmllbGQub3B0aW9ucykKKyAgcmV0dXJuICZfaW1wbF8ub3B0aW9uc187Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiYgRmllbGQ6Ol9pbnRlcm5hbF9vcHRpb25zKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm9wdGlvbnNfLkdldChpbmRleCk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiYgRmllbGQ6Om9wdGlvbnMoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLm9wdGlvbnMpCisgIHJldHVybiBfaW50ZXJuYWxfb3B0aW9ucyhpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogRmllbGQ6Ol9pbnRlcm5hbF9hZGRfb3B0aW9ucygpIHsKKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXy5BZGQoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uKiBGaWVsZDo6YWRkX29wdGlvbnMoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24qIF9hZGQgPSBfaW50ZXJuYWxfYWRkX29wdGlvbnMoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmllbGQub3B0aW9ucykKKyAgcmV0dXJuIF9hZGQ7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24gPiYKK0ZpZWxkOjpvcHRpb25zKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmllbGQub3B0aW9ucykKKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXzsKK30KKworLy8gc3RyaW5nIGpzb25fbmFtZSA9IDEwOworaW5saW5lIHZvaWQgRmllbGQ6OmNsZWFyX2pzb25fbmFtZSgpIHsKKyAgX2ltcGxfLmpzb25fbmFtZV8uQ2xlYXJUb0VtcHR5KCk7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpZWxkOjpqc29uX25hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLmpzb25fbmFtZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9qc29uX25hbWUoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCwgdHlwZW5hbWUuLi4gQXJnVD4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCit2b2lkIEZpZWxkOjpzZXRfanNvbl9uYW1lKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgCisgX2ltcGxfLmpzb25fbmFtZV8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZC5qc29uX25hbWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpZWxkOjptdXRhYmxlX2pzb25fbmFtZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfanNvbl9uYW1lKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZC5qc29uX25hbWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmllbGQ6Ol9pbnRlcm5hbF9qc29uX25hbWUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uanNvbl9uYW1lXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkOjpfaW50ZXJuYWxfc2V0X2pzb25fbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5qc29uX25hbWVfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWVsZDo6X2ludGVybmFsX211dGFibGVfanNvbl9uYW1lKCkgeworICAKKyAgcmV0dXJuIF9pbXBsXy5qc29uX25hbWVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWVsZDo6cmVsZWFzZV9qc29uX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZC5qc29uX25hbWUpCisgIHJldHVybiBfaW1wbF8uanNvbl9uYW1lXy5SZWxlYXNlKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZDo6c2V0X2FsbG9jYXRlZF9qc29uX25hbWUoc3RkOjpzdHJpbmcqIGpzb25fbmFtZSkgeworICBpZiAoanNvbl9uYW1lICE9IG51bGxwdHIpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBfaW1wbF8uanNvbl9uYW1lXy5TZXRBbGxvY2F0ZWQoanNvbl9uYW1lLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLmpzb25fbmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uanNvbl9uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLmpzb25fbmFtZSkKK30KKworLy8gc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSAxMTsKK2lubGluZSB2b2lkIEZpZWxkOjpjbGVhcl9kZWZhdWx0X3ZhbHVlKCkgeworICBfaW1wbF8uZGVmYXVsdF92YWx1ZV8uQ2xlYXJUb0VtcHR5KCk7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEZpZWxkOjpkZWZhdWx0X3ZhbHVlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZC5kZWZhdWx0X3ZhbHVlKQorICByZXR1cm4gX2ludGVybmFsX2RlZmF1bHRfdmFsdWUoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCwgdHlwZW5hbWUuLi4gQXJnVD4KK2lubGluZSBQUk9UT0JVRl9BTFdBWVNfSU5MSU5FCit2b2lkIEZpZWxkOjpzZXRfZGVmYXVsdF92YWx1ZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIAorIF9pbXBsXy5kZWZhdWx0X3ZhbHVlXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLmRlZmF1bHRfdmFsdWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEZpZWxkOjptdXRhYmxlX2RlZmF1bHRfdmFsdWUoKSB7CisgIHN0ZDo6c3RyaW5nKiBfcyA9IF9pbnRlcm5hbF9tdXRhYmxlX2RlZmF1bHRfdmFsdWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkLmRlZmF1bHRfdmFsdWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRmllbGQ6Ol9pbnRlcm5hbF9kZWZhdWx0X3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLmRlZmF1bHRfdmFsdWVfLkdldCgpOworfQoraW5saW5lIHZvaWQgRmllbGQ6Ol9pbnRlcm5hbF9zZXRfZGVmYXVsdF92YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5kZWZhdWx0X3ZhbHVlXy5TZXQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRmllbGQ6Ol9pbnRlcm5hbF9tdXRhYmxlX2RlZmF1bHRfdmFsdWUoKSB7CisgIAorICByZXR1cm4gX2ltcGxfLmRlZmF1bHRfdmFsdWVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBGaWVsZDo6cmVsZWFzZV9kZWZhdWx0X3ZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmllbGQuZGVmYXVsdF92YWx1ZSkKKyAgcmV0dXJuIF9pbXBsXy5kZWZhdWx0X3ZhbHVlXy5SZWxlYXNlKCk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZDo6c2V0X2FsbG9jYXRlZF9kZWZhdWx0X3ZhbHVlKHN0ZDo6c3RyaW5nKiBkZWZhdWx0X3ZhbHVlKSB7CisgIGlmIChkZWZhdWx0X3ZhbHVlICE9IG51bGxwdHIpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBfaW1wbF8uZGVmYXVsdF92YWx1ZV8uU2V0QWxsb2NhdGVkKGRlZmF1bHRfdmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8uZGVmYXVsdF92YWx1ZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8uZGVmYXVsdF92YWx1ZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWVsZC5kZWZhdWx0X3ZhbHVlKQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEVudW0KKworLy8gc3RyaW5nIG5hbWUgPSAxOworaW5saW5lIHZvaWQgRW51bTo6Y2xlYXJfbmFtZSgpIHsKKyAgX2ltcGxfLm5hbWVfLkNsZWFyVG9FbXB0eSgpOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBFbnVtOjpuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtLm5hbWUpCisgIHJldHVybiBfaW50ZXJuYWxfbmFtZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgRW51bTo6c2V0X25hbWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyAKKyBfaW1wbF8ubmFtZV8uU2V0KHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtLm5hbWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEVudW06Om11dGFibGVfbmFtZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bS5uYW1lKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEVudW06Ol9pbnRlcm5hbF9uYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm5hbWVfLkdldCgpOworfQoraW5saW5lIHZvaWQgRW51bTo6X2ludGVybmFsX3NldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAKKyAgX2ltcGxfLm5hbWVfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBFbnVtOjpfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCkgeworICAKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogRW51bTo6cmVsZWFzZV9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRW51bS5uYW1lKQorICByZXR1cm4gX2ltcGxfLm5hbWVfLlJlbGVhc2UoKTsKK30KK2lubGluZSB2b2lkIEVudW06OnNldF9hbGxvY2F0ZWRfbmFtZShzdGQ6OnN0cmluZyogbmFtZSkgeworICBpZiAobmFtZSAhPSBudWxscHRyKSB7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgIH0KKyAgX2ltcGxfLm5hbWVfLlNldEFsbG9jYXRlZChuYW1lLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLm5hbWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLm5hbWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRW51bS5uYW1lKQorfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZSBlbnVtdmFsdWUgPSAyOworaW5saW5lIGludCBFbnVtOjpfaW50ZXJuYWxfZW51bXZhbHVlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8uZW51bXZhbHVlXy5zaXplKCk7Cit9CitpbmxpbmUgaW50IEVudW06OmVudW12YWx1ZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ludGVybmFsX2VudW12YWx1ZV9zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtOjpjbGVhcl9lbnVtdmFsdWUoKSB7CisgIF9pbXBsXy5lbnVtdmFsdWVfLkNsZWFyKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZSogRW51bTo6bXV0YWJsZV9lbnVtdmFsdWUoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5FbnVtLmVudW12YWx1ZSkKKyAgcmV0dXJuIF9pbXBsXy5lbnVtdmFsdWVfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZXBlYXRlZFB0ckZpZWxkPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RW51bVZhbHVlID4qCitFbnVtOjptdXRhYmxlX2VudW12YWx1ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRW51bS5lbnVtdmFsdWUpCisgIHJldHVybiAmX2ltcGxfLmVudW12YWx1ZV87Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZSYgRW51bTo6X2ludGVybmFsX2VudW12YWx1ZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5lbnVtdmFsdWVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZSYgRW51bTo6ZW51bXZhbHVlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtLmVudW12YWx1ZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9lbnVtdmFsdWUoaW5kZXgpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpFbnVtVmFsdWUqIEVudW06Ol9pbnRlcm5hbF9hZGRfZW51bXZhbHVlKCkgeworICByZXR1cm4gX2ltcGxfLmVudW12YWx1ZV8uQWRkKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZSogRW51bTo6YWRkX2VudW12YWx1ZSgpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZSogX2FkZCA9IF9pbnRlcm5hbF9hZGRfZW51bXZhbHVlKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkVudW0uZW51bXZhbHVlKQorICByZXR1cm4gX2FkZDsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkVudW1WYWx1ZSA+JgorRW51bTo6ZW51bXZhbHVlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRW51bS5lbnVtdmFsdWUpCisgIHJldHVybiBfaW1wbF8uZW51bXZhbHVlXzsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PcHRpb24gb3B0aW9ucyA9IDM7CitpbmxpbmUgaW50IEVudW06Ol9pbnRlcm5hbF9vcHRpb25zX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ub3B0aW9uc18uc2l6ZSgpOworfQoraW5saW5lIGludCBFbnVtOjpvcHRpb25zX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfb3B0aW9uc19zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtOjpjbGVhcl9vcHRpb25zKCkgeworICBfaW1wbF8ub3B0aW9uc18uQ2xlYXIoKTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uKiBFbnVtOjptdXRhYmxlX29wdGlvbnMoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5FbnVtLm9wdGlvbnMpCisgIHJldHVybiBfaW1wbF8ub3B0aW9uc18uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24gPioKK0VudW06Om11dGFibGVfb3B0aW9ucygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRW51bS5vcHRpb25zKQorICByZXR1cm4gJl9pbXBsXy5vcHRpb25zXzsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uJiBFbnVtOjpfaW50ZXJuYWxfb3B0aW9ucyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24mIEVudW06Om9wdGlvbnMoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW0ub3B0aW9ucykKKyAgcmV0dXJuIF9pbnRlcm5hbF9vcHRpb25zKGluZGV4KTsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6T3B0aW9uKiBFbnVtOjpfaW50ZXJuYWxfYWRkX29wdGlvbnMoKSB7CisgIHJldHVybiBfaW1wbF8ub3B0aW9uc18uQWRkKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogRW51bTo6YWRkX29wdGlvbnMoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24qIF9hZGQgPSBfaW50ZXJuYWxfYWRkX29wdGlvbnMoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRW51bS5vcHRpb25zKQorICByZXR1cm4gX2FkZDsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiA+JgorRW51bTo6b3B0aW9ucygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkVudW0ub3B0aW9ucykKKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXzsKK30KKworLy8gLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb250ZXh0IHNvdXJjZV9jb250ZXh0ID0gNDsKK2lubGluZSBib29sIEVudW06Ol9pbnRlcm5hbF9oYXNfc291cmNlX2NvbnRleHQoKSBjb25zdCB7CisgIHJldHVybiB0aGlzICE9IGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSAmJiBfaW1wbF8uc291cmNlX2NvbnRleHRfICE9IG51bGxwdHI7Cit9CitpbmxpbmUgYm9vbCBFbnVtOjpoYXNfc291cmNlX2NvbnRleHQoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfaGFzX3NvdXJjZV9jb250ZXh0KCk7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQmIEVudW06Ol9pbnRlcm5hbF9zb3VyY2VfY29udGV4dCgpIGNvbnN0IHsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIHAgPSBfaW1wbF8uc291cmNlX2NvbnRleHRfOworICByZXR1cm4gcCAhPSBudWxscHRyID8gKnAgOiByZWludGVycHJldF9jYXN0PGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0Jj4oCisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X1NvdXJjZUNvbnRleHRfZGVmYXVsdF9pbnN0YW5jZV8pOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0JiBFbnVtOjpzb3VyY2VfY29udGV4dCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bS5zb3VyY2VfY29udGV4dCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9zb3VyY2VfY29udGV4dCgpOworfQoraW5saW5lIHZvaWQgRW51bTo6dW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfc291cmNlX2NvbnRleHQoCisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIHNvdXJjZV9jb250ZXh0KSB7CisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKSB7CisgICAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VMaXRlKj4oX2ltcGxfLnNvdXJjZV9jb250ZXh0Xyk7CisgIH0KKyAgX2ltcGxfLnNvdXJjZV9jb250ZXh0XyA9IHNvdXJjZV9jb250ZXh0OworICBpZiAoc291cmNlX2NvbnRleHQpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkVudW0uc291cmNlX2NvbnRleHQpCit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIEVudW06OnJlbGVhc2Vfc291cmNlX2NvbnRleHQoKSB7CisgIAorICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogdGVtcCA9IF9pbXBsXy5zb3VyY2VfY29udGV4dF87CisgIF9pbXBsXy5zb3VyY2VfY29udGV4dF8gPSBudWxscHRyOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICBhdXRvKiBvbGQgPSAgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPih0ZW1wKTsKKyAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikgeyBkZWxldGUgb2xkOyB9CisjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSAhPSBudWxscHRyKSB7CisgICAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICB9CisjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgcmV0dXJuIHRlbXA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIEVudW06OnVuc2FmZV9hcmVuYV9yZWxlYXNlX3NvdXJjZV9jb250ZXh0KCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRW51bS5zb3VyY2VfY29udGV4dCkKKyAgCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0KiB0ZW1wID0gX2ltcGxfLnNvdXJjZV9jb250ZXh0XzsKKyAgX2ltcGxfLnNvdXJjZV9jb250ZXh0XyA9IG51bGxwdHI7CisgIHJldHVybiB0ZW1wOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0KiBFbnVtOjpfaW50ZXJuYWxfbXV0YWJsZV9zb3VyY2VfY29udGV4dCgpIHsKKyAgCisgIGlmIChfaW1wbF8uc291cmNlX2NvbnRleHRfID09IG51bGxwdHIpIHsKKyAgICBhdXRvKiBwID0gQ3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0PihHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgICAgX2ltcGxfLnNvdXJjZV9jb250ZXh0XyA9IHA7CisgIH0KKyAgcmV0dXJuIF9pbXBsXy5zb3VyY2VfY29udGV4dF87Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlNvdXJjZUNvbnRleHQqIEVudW06Om11dGFibGVfc291cmNlX2NvbnRleHQoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTb3VyY2VDb250ZXh0KiBfbXNnID0gX2ludGVybmFsX211dGFibGVfc291cmNlX2NvbnRleHQoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW0uc291cmNlX2NvbnRleHQpCisgIHJldHVybiBfbXNnOworfQoraW5saW5lIHZvaWQgRW51bTo6c2V0X2FsbG9jYXRlZF9zb3VyY2VfY29udGV4dCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U291cmNlQ29udGV4dCogc291cmNlX2NvbnRleHQpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBtZXNzYWdlX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGlmIChtZXNzYWdlX2FyZW5hID09IG51bGxwdHIpIHsKKyAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VMaXRlKj4oX2ltcGxfLnNvdXJjZV9jb250ZXh0Xyk7CisgIH0KKyAgaWYgKHNvdXJjZV9jb250ZXh0KSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBzdWJtZXNzYWdlX2FyZW5hID0KKyAgICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEdldE93bmluZ0FyZW5hKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VMaXRlKj4oc291cmNlX2NvbnRleHQpKTsKKyAgICBpZiAobWVzc2FnZV9hcmVuYSAhPSBzdWJtZXNzYWdlX2FyZW5hKSB7CisgICAgICBzb3VyY2VfY29udGV4dCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2V0T3duZWRNZXNzYWdlKAorICAgICAgICAgIG1lc3NhZ2VfYXJlbmEsIHNvdXJjZV9jb250ZXh0LCBzdWJtZXNzYWdlX2FyZW5hKTsKKyAgICB9CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgIH0KKyAgX2ltcGxfLnNvdXJjZV9jb250ZXh0XyA9IHNvdXJjZV9jb250ZXh0OworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRW51bS5zb3VyY2VfY29udGV4dCkKK30KKworLy8gLmdvb2dsZS5wcm90b2J1Zi5TeW50YXggc3ludGF4ID0gNTsKK2lubGluZSB2b2lkIEVudW06OmNsZWFyX3N5bnRheCgpIHsKKyAgX2ltcGxfLnN5bnRheF8gPSAwOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTeW50YXggRW51bTo6X2ludGVybmFsX3N5bnRheCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3ludGF4ID4oX2ltcGxfLnN5bnRheF8pOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTeW50YXggRW51bTo6c3ludGF4KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtLnN5bnRheCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9zeW50YXgoKTsKK30KK2lubGluZSB2b2lkIEVudW06Ol9pbnRlcm5hbF9zZXRfc3ludGF4KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTeW50YXggdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5zeW50YXhfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBFbnVtOjpzZXRfc3ludGF4KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTeW50YXggdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9zeW50YXgodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtLnN5bnRheCkKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFbnVtVmFsdWUKKworLy8gc3RyaW5nIG5hbWUgPSAxOworaW5saW5lIHZvaWQgRW51bVZhbHVlOjpjbGVhcl9uYW1lKCkgeworICBfaW1wbF8ubmFtZV8uQ2xlYXJUb0VtcHR5KCk7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEVudW1WYWx1ZTo6bmFtZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlLm5hbWUpCisgIHJldHVybiBfaW50ZXJuYWxfbmFtZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwLCB0eXBlbmFtZS4uLiBBcmdUPgoraW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUKK3ZvaWQgRW51bVZhbHVlOjpzZXRfbmFtZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncykgeworIAorIF9pbXBsXy5uYW1lXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZS5uYW1lKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBFbnVtVmFsdWU6Om11dGFibGVfbmFtZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfbmFtZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlLm5hbWUpCisgIHJldHVybiBfczsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgRW51bVZhbHVlOjpfaW50ZXJuYWxfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5uYW1lXy5HZXQoKTsKK30KK2lubGluZSB2b2lkIEVudW1WYWx1ZTo6X2ludGVybmFsX3NldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAKKyAgX2ltcGxfLm5hbWVfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBFbnVtVmFsdWU6Ol9pbnRlcm5hbF9tdXRhYmxlX25hbWUoKSB7CisgIAorICByZXR1cm4gX2ltcGxfLm5hbWVfLk11dGFibGUoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBFbnVtVmFsdWU6OnJlbGVhc2VfbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZS5uYW1lKQorICByZXR1cm4gX2ltcGxfLm5hbWVfLlJlbGVhc2UoKTsKK30KK2lubGluZSB2b2lkIEVudW1WYWx1ZTo6c2V0X2FsbG9jYXRlZF9uYW1lKHN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lICE9IG51bGxwdHIpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBfaW1wbF8ubmFtZV8uU2V0QWxsb2NhdGVkKG5hbWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8ubmFtZV8uSXNEZWZhdWx0KCkpIHsKKyAgICBfaW1wbF8ubmFtZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWUubmFtZSkKK30KKworLy8gaW50MzIgbnVtYmVyID0gMjsKK2lubGluZSB2b2lkIEVudW1WYWx1ZTo6Y2xlYXJfbnVtYmVyKCkgeworICBfaW1wbF8ubnVtYmVyXyA9IDA7Cit9CitpbmxpbmUgaW50MzJfdCBFbnVtVmFsdWU6Ol9pbnRlcm5hbF9udW1iZXIoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8ubnVtYmVyXzsKK30KK2lubGluZSBpbnQzMl90IEVudW1WYWx1ZTo6bnVtYmVyKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWUubnVtYmVyKQorICByZXR1cm4gX2ludGVybmFsX251bWJlcigpOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlOjpfaW50ZXJuYWxfc2V0X251bWJlcihpbnQzMl90IHZhbHVlKSB7CisgIAorICBfaW1wbF8ubnVtYmVyXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlOjpzZXRfbnVtYmVyKGludDMyX3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF9udW1iZXIodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWUubnVtYmVyKQorfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk9wdGlvbiBvcHRpb25zID0gMzsKK2lubGluZSBpbnQgRW51bVZhbHVlOjpfaW50ZXJuYWxfb3B0aW9uc19zaXplKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm9wdGlvbnNfLnNpemUoKTsKK30KK2lubGluZSBpbnQgRW51bVZhbHVlOjpvcHRpb25zX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBfaW50ZXJuYWxfb3B0aW9uc19zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtVmFsdWU6OmNsZWFyX29wdGlvbnMoKSB7CisgIF9pbXBsXy5vcHRpb25zXy5DbGVhcigpOworfQoraW5saW5lIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24qIEVudW1WYWx1ZTo6bXV0YWJsZV9vcHRpb25zKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlLm9wdGlvbnMpCisgIHJldHVybiBfaW1wbF8ub3B0aW9uc18uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24gPioKK0VudW1WYWx1ZTo6bXV0YWJsZV9vcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWUub3B0aW9ucykKKyAgcmV0dXJuICZfaW1wbF8ub3B0aW9uc187Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiYgRW51bVZhbHVlOjpfaW50ZXJuYWxfb3B0aW9ucyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5vcHRpb25zXy5HZXQoaW5kZXgpOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24mIEVudW1WYWx1ZTo6b3B0aW9ucyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlLm9wdGlvbnMpCisgIHJldHVybiBfaW50ZXJuYWxfb3B0aW9ucyhpbmRleCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogRW51bVZhbHVlOjpfaW50ZXJuYWxfYWRkX29wdGlvbnMoKSB7CisgIHJldHVybiBfaW1wbF8ub3B0aW9uc18uQWRkKCk7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogRW51bVZhbHVlOjphZGRfb3B0aW9ucygpIHsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok9wdGlvbiogX2FkZCA9IF9pbnRlcm5hbF9hZGRfb3B0aW9ucygpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWUub3B0aW9ucykKKyAgcmV0dXJuIF9hZGQ7Cit9CitpbmxpbmUgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlcGVhdGVkUHRyRmllbGQ8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpPcHRpb24gPiYKK0VudW1WYWx1ZTo6b3B0aW9ucygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZS5vcHRpb25zKQorICByZXR1cm4gX2ltcGxfLm9wdGlvbnNfOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE9wdGlvbgorCisvLyBzdHJpbmcgbmFtZSA9IDE7CitpbmxpbmUgdm9pZCBPcHRpb246OmNsZWFyX25hbWUoKSB7CisgIF9pbXBsXy5uYW1lXy5DbGVhclRvRW1wdHkoKTsKK30KK2lubGluZSBjb25zdCBzdGQ6OnN0cmluZyYgT3B0aW9uOjpuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5PcHRpb24ubmFtZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF9uYW1lKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBPcHRpb246OnNldF9uYW1lKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgCisgX2ltcGxfLm5hbWVfLlNldChzdGF0aWNfY2FzdDxBcmdUMCAmJj4oYXJnMCksIGFyZ3MuLi4sIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuT3B0aW9uLm5hbWUpCit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIE9wdGlvbjo6bXV0YWJsZV9uYW1lKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV9uYW1lKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5PcHRpb24ubmFtZSkKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBPcHRpb246Ol9pbnRlcm5hbF9uYW1lKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLm5hbWVfLkdldCgpOworfQoraW5saW5lIHZvaWQgT3B0aW9uOjpfaW50ZXJuYWxfc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIAorICBfaW1wbF8ubmFtZV8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIE9wdGlvbjo6X2ludGVybmFsX211dGFibGVfbmFtZSgpIHsKKyAgCisgIHJldHVybiBfaW1wbF8ubmFtZV8uTXV0YWJsZShHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIE9wdGlvbjo6cmVsZWFzZV9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuT3B0aW9uLm5hbWUpCisgIHJldHVybiBfaW1wbF8ubmFtZV8uUmVsZWFzZSgpOworfQoraW5saW5lIHZvaWQgT3B0aW9uOjpzZXRfYWxsb2NhdGVkX25hbWUoc3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWUgIT0gbnVsbHB0cikgeworICAgIAorICB9IGVsc2UgeworICAgIAorICB9CisgIF9pbXBsXy5uYW1lXy5TZXRBbGxvY2F0ZWQobmFtZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKF9pbXBsXy5uYW1lXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy5uYW1lXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLk9wdGlvbi5uYW1lKQorfQorCisvLyAuZ29vZ2xlLnByb3RvYnVmLkFueSB2YWx1ZSA9IDI7CitpbmxpbmUgYm9vbCBPcHRpb246Ol9pbnRlcm5hbF9oYXNfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiB0aGlzICE9IGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSAmJiBfaW1wbF8udmFsdWVfICE9IG51bGxwdHI7Cit9CitpbmxpbmUgYm9vbCBPcHRpb246Omhhc192YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbnRlcm5hbF9oYXNfdmFsdWUoKTsKK30KK2lubGluZSBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QW55JiBPcHRpb246Ol9pbnRlcm5hbF92YWx1ZSgpIGNvbnN0IHsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSogcCA9IF9pbXBsXy52YWx1ZV87CisgIHJldHVybiBwICE9IG51bGxwdHIgPyAqcCA6IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSY+KAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9BbnlfZGVmYXVsdF9pbnN0YW5jZV8pOworfQoraW5saW5lIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBbnkmIE9wdGlvbjo6dmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk9wdGlvbi52YWx1ZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF92YWx1ZSgpOworfQoraW5saW5lIHZvaWQgT3B0aW9uOjp1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF92YWx1ZSgKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QW55KiB2YWx1ZSkgeworICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikgeworICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSo+KF9pbXBsXy52YWx1ZV8pOworICB9CisgIF9pbXBsXy52YWx1ZV8gPSB2YWx1ZTsKKyAgaWYgKHZhbHVlKSB7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3Vuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5PcHRpb24udmFsdWUpCit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSogT3B0aW9uOjpyZWxlYXNlX3ZhbHVlKCkgeworICAKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSogdGVtcCA9IF9pbXBsXy52YWx1ZV87CisgIF9pbXBsXy52YWx1ZV8gPSBudWxscHRyOworI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fUkVMRUFTRQorICBhdXRvKiBvbGQgPSAgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPih0ZW1wKTsKKyAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICBpZiAoR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cikgeyBkZWxldGUgb2xkOyB9CisjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9SRUxFQVNFCisgIGlmIChHZXRBcmVuYUZvckFsbG9jYXRpb24oKSAhPSBudWxscHRyKSB7CisgICAgdGVtcCA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6RHVwbGljYXRlSWZOb25OdWxsKHRlbXApOworICB9CisjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1JFTEVBU0UKKyAgcmV0dXJuIHRlbXA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSogT3B0aW9uOjp1bnNhZmVfYXJlbmFfcmVsZWFzZV92YWx1ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLk9wdGlvbi52YWx1ZSkKKyAgCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBbnkqIHRlbXAgPSBfaW1wbF8udmFsdWVfOworICBfaW1wbF8udmFsdWVfID0gbnVsbHB0cjsKKyAgcmV0dXJuIHRlbXA7Cit9CitpbmxpbmUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFueSogT3B0aW9uOjpfaW50ZXJuYWxfbXV0YWJsZV92YWx1ZSgpIHsKKyAgCisgIGlmIChfaW1wbF8udmFsdWVfID09IG51bGxwdHIpIHsKKyAgICBhdXRvKiBwID0gQ3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBbnk+KEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgICBfaW1wbF8udmFsdWVfID0gcDsKKyAgfQorICByZXR1cm4gX2ltcGxfLnZhbHVlXzsKK30KK2lubGluZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QW55KiBPcHRpb246Om11dGFibGVfdmFsdWUoKSB7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBbnkqIF9tc2cgPSBfaW50ZXJuYWxfbXV0YWJsZV92YWx1ZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuT3B0aW9uLnZhbHVlKQorICByZXR1cm4gX21zZzsKK30KK2lubGluZSB2b2lkIE9wdGlvbjo6c2V0X2FsbG9jYXRlZF92YWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QW55KiB2YWx1ZSkgeworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIG1lc3NhZ2VfYXJlbmEgPSBHZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgaWYgKG1lc3NhZ2VfYXJlbmEgPT0gbnVsbHB0cikgeworICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPihfaW1wbF8udmFsdWVfKTsKKyAgfQorICBpZiAodmFsdWUpIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIHN1Ym1lc3NhZ2VfYXJlbmEgPQorICAgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsR2V0T3duaW5nQXJlbmEoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUqPih2YWx1ZSkpOworICAgIGlmIChtZXNzYWdlX2FyZW5hICE9IHN1Ym1lc3NhZ2VfYXJlbmEpIHsKKyAgICAgIHZhbHVlID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZXRPd25lZE1lc3NhZ2UoCisgICAgICAgICAgbWVzc2FnZV9hcmVuYSwgdmFsdWUsIHN1Ym1lc3NhZ2VfYXJlbmEpOworICAgIH0KKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBfaW1wbF8udmFsdWVfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5PcHRpb24udmFsdWUpCit9CisKKyNpZmRlZiBfX0dOVUNfXworICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorI2VuZGlmICAvLyBfX0dOVUNfXworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCisKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNfcHJvdG9fZW51bTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkX0tpbmQ+IDogOjpzdGQ6OnRydWVfdHlwZSB7fTsKK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRfS2luZD4oKSB7CisgIHJldHVybiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmllbGRfS2luZF9kZXNjcmlwdG9yKCk7Cit9Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNfcHJvdG9fZW51bTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkX0NhcmRpbmFsaXR5PiA6IDo6c3RkOjp0cnVlX3R5cGUge307Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvcjwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZpZWxkX0NhcmRpbmFsaXR5PigpIHsKKyAgcmV0dXJuIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGaWVsZF9DYXJkaW5hbGl0eV9kZXNjcmlwdG9yKCk7Cit9Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNfcHJvdG9fZW51bTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheD4gOiA6OnN0ZDo6dHJ1ZV90eXBlIHt9OwordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3I8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTeW50YXg+KCkgeworICByZXR1cm4gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN5bnRheF9kZXNjcmlwdG9yKCk7Cit9CisKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2dvb2dsZV8yZnByb3RvYnVmXzJmdHlwZV8yZXByb3RvCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmNmE2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdHlwZS5wcm90bwpAQCAtMCwwICsxLDE4NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvIjsKKworb3B0aW9uIGNzaGFycF9uYW1lc3BhY2UgPSAiR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzIjsKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiVHlwZVByb3RvIjsKK29wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKK29wdGlvbiBvYmpjX2NsYXNzX3ByZWZpeCA9ICJHUEIiOworb3B0aW9uIGdvX3BhY2thZ2UgPSAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vdHlwZXBiIjsKKworLy8gQSBwcm90b2NvbCBidWZmZXIgbWVzc2FnZSB0eXBlLgorbWVzc2FnZSBUeXBlIHsKKyAgLy8gVGhlIGZ1bGx5IHF1YWxpZmllZCBtZXNzYWdlIG5hbWUuCisgIHN0cmluZyBuYW1lID0gMTsKKyAgLy8gVGhlIGxpc3Qgb2YgZmllbGRzLgorICByZXBlYXRlZCBGaWVsZCBmaWVsZHMgPSAyOworICAvLyBUaGUgbGlzdCBvZiB0eXBlcyBhcHBlYXJpbmcgaW4gYG9uZW9mYCBkZWZpbml0aW9ucyBpbiB0aGlzIHR5cGUuCisgIHJlcGVhdGVkIHN0cmluZyBvbmVvZnMgPSAzOworICAvLyBUaGUgcHJvdG9jb2wgYnVmZmVyIG9wdGlvbnMuCisgIHJlcGVhdGVkIE9wdGlvbiBvcHRpb25zID0gNDsKKyAgLy8gVGhlIHNvdXJjZSBjb250ZXh0LgorICBTb3VyY2VDb250ZXh0IHNvdXJjZV9jb250ZXh0ID0gNTsKKyAgLy8gVGhlIHNvdXJjZSBzeW50YXguCisgIFN5bnRheCBzeW50YXggPSA2OworfQorCisvLyBBIHNpbmdsZSBmaWVsZCBvZiBhIG1lc3NhZ2UgdHlwZS4KK21lc3NhZ2UgRmllbGQgeworICAvLyBCYXNpYyBmaWVsZCB0eXBlcy4KKyAgZW51bSBLaW5kIHsKKyAgICAvLyBGaWVsZCB0eXBlIHVua25vd24uCisgICAgVFlQRV9VTktOT1dOID0gMDsKKyAgICAvLyBGaWVsZCB0eXBlIGRvdWJsZS4KKyAgICBUWVBFX0RPVUJMRSA9IDE7CisgICAgLy8gRmllbGQgdHlwZSBmbG9hdC4KKyAgICBUWVBFX0ZMT0FUID0gMjsKKyAgICAvLyBGaWVsZCB0eXBlIGludDY0LgorICAgIFRZUEVfSU5UNjQgPSAzOworICAgIC8vIEZpZWxkIHR5cGUgdWludDY0LgorICAgIFRZUEVfVUlOVDY0ID0gNDsKKyAgICAvLyBGaWVsZCB0eXBlIGludDMyLgorICAgIFRZUEVfSU5UMzIgPSA1OworICAgIC8vIEZpZWxkIHR5cGUgZml4ZWQ2NC4KKyAgICBUWVBFX0ZJWEVENjQgPSA2OworICAgIC8vIEZpZWxkIHR5cGUgZml4ZWQzMi4KKyAgICBUWVBFX0ZJWEVEMzIgPSA3OworICAgIC8vIEZpZWxkIHR5cGUgYm9vbC4KKyAgICBUWVBFX0JPT0wgPSA4OworICAgIC8vIEZpZWxkIHR5cGUgc3RyaW5nLgorICAgIFRZUEVfU1RSSU5HID0gOTsKKyAgICAvLyBGaWVsZCB0eXBlIGdyb3VwLiBQcm90bzIgc3ludGF4IG9ubHksIGFuZCBkZXByZWNhdGVkLgorICAgIFRZUEVfR1JPVVAgPSAxMDsKKyAgICAvLyBGaWVsZCB0eXBlIG1lc3NhZ2UuCisgICAgVFlQRV9NRVNTQUdFID0gMTE7CisgICAgLy8gRmllbGQgdHlwZSBieXRlcy4KKyAgICBUWVBFX0JZVEVTID0gMTI7CisgICAgLy8gRmllbGQgdHlwZSB1aW50MzIuCisgICAgVFlQRV9VSU5UMzIgPSAxMzsKKyAgICAvLyBGaWVsZCB0eXBlIGVudW0uCisgICAgVFlQRV9FTlVNID0gMTQ7CisgICAgLy8gRmllbGQgdHlwZSBzZml4ZWQzMi4KKyAgICBUWVBFX1NGSVhFRDMyID0gMTU7CisgICAgLy8gRmllbGQgdHlwZSBzZml4ZWQ2NC4KKyAgICBUWVBFX1NGSVhFRDY0ID0gMTY7CisgICAgLy8gRmllbGQgdHlwZSBzaW50MzIuCisgICAgVFlQRV9TSU5UMzIgPSAxNzsKKyAgICAvLyBGaWVsZCB0eXBlIHNpbnQ2NC4KKyAgICBUWVBFX1NJTlQ2NCA9IDE4OworICB9CisKKyAgLy8gV2hldGhlciBhIGZpZWxkIGlzIG9wdGlvbmFsLCByZXF1aXJlZCwgb3IgcmVwZWF0ZWQuCisgIGVudW0gQ2FyZGluYWxpdHkgeworICAgIC8vIEZvciBmaWVsZHMgd2l0aCB1bmtub3duIGNhcmRpbmFsaXR5LgorICAgIENBUkRJTkFMSVRZX1VOS05PV04gPSAwOworICAgIC8vIEZvciBvcHRpb25hbCBmaWVsZHMuCisgICAgQ0FSRElOQUxJVFlfT1BUSU9OQUwgPSAxOworICAgIC8vIEZvciByZXF1aXJlZCBmaWVsZHMuIFByb3RvMiBzeW50YXggb25seS4KKyAgICBDQVJESU5BTElUWV9SRVFVSVJFRCA9IDI7CisgICAgLy8gRm9yIHJlcGVhdGVkIGZpZWxkcy4KKyAgICBDQVJESU5BTElUWV9SRVBFQVRFRCA9IDM7CisgIH0KKworICAvLyBUaGUgZmllbGQgdHlwZS4KKyAgS2luZCBraW5kID0gMTsKKyAgLy8gVGhlIGZpZWxkIGNhcmRpbmFsaXR5LgorICBDYXJkaW5hbGl0eSBjYXJkaW5hbGl0eSA9IDI7CisgIC8vIFRoZSBmaWVsZCBudW1iZXIuCisgIGludDMyIG51bWJlciA9IDM7CisgIC8vIFRoZSBmaWVsZCBuYW1lLgorICBzdHJpbmcgbmFtZSA9IDQ7CisgIC8vIFRoZSBmaWVsZCB0eXBlIFVSTCwgd2l0aG91dCB0aGUgc2NoZW1lLCBmb3IgbWVzc2FnZSBvciBlbnVtZXJhdGlvbgorICAvLyB0eXBlcy4gRXhhbXBsZTogYCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiYC4KKyAgc3RyaW5nIHR5cGVfdXJsID0gNjsKKyAgLy8gVGhlIGluZGV4IG9mIHRoZSBmaWVsZCB0eXBlIGluIGBUeXBlLm9uZW9mc2AsIGZvciBtZXNzYWdlIG9yIGVudW1lcmF0aW9uCisgIC8vIHR5cGVzLiBUaGUgZmlyc3QgdHlwZSBoYXMgaW5kZXggMTsgemVybyBtZWFucyB0aGUgdHlwZSBpcyBub3QgaW4gdGhlIGxpc3QuCisgIGludDMyIG9uZW9mX2luZGV4ID0gNzsKKyAgLy8gV2hldGhlciB0byB1c2UgYWx0ZXJuYXRpdmUgcGFja2VkIHdpcmUgcmVwcmVzZW50YXRpb24uCisgIGJvb2wgcGFja2VkID0gODsKKyAgLy8gVGhlIHByb3RvY29sIGJ1ZmZlciBvcHRpb25zLgorICByZXBlYXRlZCBPcHRpb24gb3B0aW9ucyA9IDk7CisgIC8vIFRoZSBmaWVsZCBKU09OIG5hbWUuCisgIHN0cmluZyBqc29uX25hbWUgPSAxMDsKKyAgLy8gVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGZpZWxkLiBQcm90bzIgc3ludGF4IG9ubHkuCisgIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gMTE7Cit9CisKKy8vIEVudW0gdHlwZSBkZWZpbml0aW9uLgorbWVzc2FnZSBFbnVtIHsKKyAgLy8gRW51bSB0eXBlIG5hbWUuCisgIHN0cmluZyBuYW1lID0gMTsKKyAgLy8gRW51bSB2YWx1ZSBkZWZpbml0aW9ucy4KKyAgcmVwZWF0ZWQgRW51bVZhbHVlIGVudW12YWx1ZSA9IDI7CisgIC8vIFByb3RvY29sIGJ1ZmZlciBvcHRpb25zLgorICByZXBlYXRlZCBPcHRpb24gb3B0aW9ucyA9IDM7CisgIC8vIFRoZSBzb3VyY2UgY29udGV4dC4KKyAgU291cmNlQ29udGV4dCBzb3VyY2VfY29udGV4dCA9IDQ7CisgIC8vIFRoZSBzb3VyY2Ugc3ludGF4LgorICBTeW50YXggc3ludGF4ID0gNTsKK30KKworLy8gRW51bSB2YWx1ZSBkZWZpbml0aW9uLgorbWVzc2FnZSBFbnVtVmFsdWUgeworICAvLyBFbnVtIHZhbHVlIG5hbWUuCisgIHN0cmluZyBuYW1lID0gMTsKKyAgLy8gRW51bSB2YWx1ZSBudW1iZXIuCisgIGludDMyIG51bWJlciA9IDI7CisgIC8vIFByb3RvY29sIGJ1ZmZlciBvcHRpb25zLgorICByZXBlYXRlZCBPcHRpb24gb3B0aW9ucyA9IDM7Cit9CisKKy8vIEEgcHJvdG9jb2wgYnVmZmVyIG9wdGlvbiwgd2hpY2ggY2FuIGJlIGF0dGFjaGVkIHRvIGEgbWVzc2FnZSwgZmllbGQsCisvLyBlbnVtZXJhdGlvbiwgZXRjLgorbWVzc2FnZSBPcHRpb24geworICAvLyBUaGUgb3B0aW9uJ3MgbmFtZS4gRm9yIHByb3RvYnVmIGJ1aWx0LWluIG9wdGlvbnMgKG9wdGlvbnMgZGVmaW5lZCBpbgorICAvLyBkZXNjcmlwdG9yLnByb3RvKSwgdGhpcyBpcyB0aGUgc2hvcnQgbmFtZS4gRm9yIGV4YW1wbGUsIGAibWFwX2VudHJ5ImAuCisgIC8vIEZvciBjdXN0b20gb3B0aW9ucywgaXQgc2hvdWxkIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZS4gRm9yIGV4YW1wbGUsCisgIC8vIGAiZ29vZ2xlLmFwaS5odHRwImAuCisgIHN0cmluZyBuYW1lID0gMTsKKyAgLy8gVGhlIG9wdGlvbidzIHZhbHVlIHBhY2tlZCBpbiBhbiBBbnkgbWVzc2FnZS4gSWYgdGhlIHZhbHVlIGlzIGEgcHJpbWl0aXZlLAorICAvLyB0aGUgY29ycmVzcG9uZGluZyB3cmFwcGVyIHR5cGUgZGVmaW5lZCBpbiBnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8KKyAgLy8gc2hvdWxkIGJlIHVzZWQuIElmIHRoZSB2YWx1ZSBpcyBhbiBlbnVtLCBpdCBzaG91bGQgYmUgc3RvcmVkIGFzIGFuIGludDMyCisgIC8vIHZhbHVlIHVzaW5nIHRoZSBnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSB0eXBlLgorICBBbnkgdmFsdWUgPSAyOworfQorCisvLyBUaGUgc3ludGF4IGluIHdoaWNoIGEgcHJvdG9jb2wgYnVmZmVyIGVsZW1lbnQgaXMgZGVmaW5lZC4KK2VudW0gU3ludGF4IHsKKyAgLy8gU3ludGF4IGBwcm90bzJgLgorICBTWU5UQVhfUFJPVE8yID0gMDsKKyAgLy8gU3ludGF4IGBwcm90bzNgLgorICBTWU5UQVhfUFJPVE8zID0gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYjBiZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvCkBAIC0wLDAgKzEsMTQxOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIEEgcHJvdG8gZmlsZSB3ZSB3aWxsIHVzZSBmb3IgdW5pdCB0ZXN0aW5nLgorLy8KKy8vIExJTlQ6IEFMTE9XX0dST1VQUywgTEVHQUNZX05BTUVTCisKK3N5bnRheCA9ICJwcm90bzIiOworCisvLyBTb21lIGdlbmVyaWNfc2VydmljZXMgb3B0aW9uKHMpIGFkZGVkIGF1dG9tYXRpY2FsbHkuCisvLyBTZWU6ICBodHRwOi8vZ28vcHJvdG8yLWdlbmVyaWMtc2VydmljZXMtZGVmYXVsdAorb3B0aW9uIGNjX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgICAgLy8gYXV0by1hZGRlZAorb3B0aW9uIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IHRydWU7ICAgLy8gYXV0by1hZGRlZAorb3B0aW9uIHB5X2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgICAgLy8gYXV0by1hZGRlZAorb3B0aW9uIGNjX2VuYWJsZV9hcmVuYXMgPSB0cnVlOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8iOworCisvLyBXZSBkb24ndCBwdXQgdGhpcyBpbiBhIHBhY2thZ2Ugd2l0aGluIHByb3RvMiBiZWNhdXNlIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisvLyB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBkb2Vzbid0IGRlcGVuZCBvbiBiZWluZyBpbiB0aGUgcHJvdG8yIG5hbWVzcGFjZS4KKy8vIEluIHRlc3RfdXRpbC5oIHdlIGRvICJ1c2luZyBuYW1lc3BhY2UgdW5pdHRlc3QgPSBwcm90b2J1Zl91bml0dGVzdCIuCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCisvLyBQcm90b3Mgb3B0aW1pemVkIGZvciBTUEVFRCB1c2UgYSBzdHJpY3Qgc3VwZXJzZXQgb2YgdGhlIGdlbmVyYXRlZCBjb2RlCisvLyBvZiBlcXVpdmFsZW50IG9uZXMgb3B0aW1pemVkIGZvciBDT0RFX1NJWkUsIHNvIHdlIHNob3VsZCBvcHRpbWl6ZSBhbGwgb3VyCisvLyB0ZXN0cyBmb3Igc3BlZWQgdW5sZXNzIGV4cGxpY2l0bHkgdGVzdGluZyBjb2RlIHNpemUgb3B0aW1pemF0aW9uLgorb3B0aW9uIG9wdGltaXplX2ZvciA9IFNQRUVEOworCitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiVW5pdHRlc3RQcm90byI7CisKKy8vIFRoaXMgcHJvdG8gaW5jbHVkZXMgZXZlcnkgdHlwZSBvZiBmaWVsZCBpbiBib3RoIHNpbmd1bGFyIGFuZCByZXBlYXRlZAorLy8gZm9ybXMuCittZXNzYWdlIFRlc3RBbGxUeXBlcyB7CisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgLy8gVGhlIGZpZWxkIG5hbWUgImIiIGZhaWxzIHRvIGNvbXBpbGUgaW4gcHJvdG8xIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGgKKyAgICAvLyBhIGxvY2FsIHZhcmlhYmxlIG5hbWVkICJiIiBpbiBvbmUgb2YgdGhlIGdlbmVyYXRlZCBtZXRob2RzLiAgRG9oLgorICAgIC8vIFRoaXMgZmlsZSBuZWVkcyB0byBjb21waWxlIGluIHByb3RvMSB0byB0ZXN0IGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgorICAgIG9wdGlvbmFsIGludDMyIGJiID0gMTsKKyAgfQorCisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgRk9PID0gMTsKKyAgICBCQVIgPSAyOworICAgIEJBWiA9IDM7CisgICAgTkVHID0gLTE7ICAvLyBJbnRlbnRpb25hbGx5IG5lZ2F0aXZlLgorICB9CisKKyAgLy8gU2luZ3VsYXIKKyAgb3B0aW9uYWwgICAgaW50MzIgb3B0aW9uYWxfaW50MzIgICAgPSAgMTsKKyAgb3B0aW9uYWwgICAgaW50NjQgb3B0aW9uYWxfaW50NjQgICAgPSAgMjsKKyAgb3B0aW9uYWwgICB1aW50MzIgb3B0aW9uYWxfdWludDMyICAgPSAgMzsKKyAgb3B0aW9uYWwgICB1aW50NjQgb3B0aW9uYWxfdWludDY0ICAgPSAgNDsKKyAgb3B0aW9uYWwgICBzaW50MzIgb3B0aW9uYWxfc2ludDMyICAgPSAgNTsKKyAgb3B0aW9uYWwgICBzaW50NjQgb3B0aW9uYWxfc2ludDY0ICAgPSAgNjsKKyAgb3B0aW9uYWwgIGZpeGVkMzIgb3B0aW9uYWxfZml4ZWQzMiAgPSAgNzsKKyAgb3B0aW9uYWwgIGZpeGVkNjQgb3B0aW9uYWxfZml4ZWQ2NCAgPSAgODsKKyAgb3B0aW9uYWwgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzIgPSAgOTsKKyAgb3B0aW9uYWwgc2ZpeGVkNjQgb3B0aW9uYWxfc2ZpeGVkNjQgPSAxMDsKKyAgb3B0aW9uYWwgICAgZmxvYXQgb3B0aW9uYWxfZmxvYXQgICAgPSAxMTsKKyAgb3B0aW9uYWwgICBkb3VibGUgb3B0aW9uYWxfZG91YmxlICAgPSAxMjsKKyAgb3B0aW9uYWwgICAgIGJvb2wgb3B0aW9uYWxfYm9vbCAgICAgPSAxMzsKKyAgb3B0aW9uYWwgICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nICAgPSAxNDsKKyAgb3B0aW9uYWwgICAgYnl0ZXMgb3B0aW9uYWxfYnl0ZXMgICAgPSAxNTsKKworICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwID0gMTYgeworICAgIG9wdGlvbmFsIGludDMyIGEgPSAxNzsKKyAgfQorCisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgPSAxODsKKyAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSA9IDE5OworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZSBvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgPSAyMDsKKworICBvcHRpb25hbCBOZXN0ZWRFbnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfbmVzdGVkX2VudW0gICAgID0gMjE7CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9mb3JlaWduX2VudW0gICAgPSAyMjsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW0gICAgb3B0aW9uYWxfaW1wb3J0X2VudW0gICAgID0gMjM7CisKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZSA9IDI0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfY29yZCA9IDI1IFtjdHlwZT1DT1JEXTsKKworICAvLyBEZWZpbmVkIGluIHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8KKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LlB1YmxpY0ltcG9ydE1lc3NhZ2UKKyAgICAgIG9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSA9IDI2OworCisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbGF6eV9tZXNzYWdlID0gMjcgW2xhenk9dHJ1ZV07CisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UgPSAyOCBbdW52ZXJpZmllZF9sYXp5PXRydWVdOworCisgIC8vIFJlcGVhdGVkCisgIHJlcGVhdGVkICAgIGludDMyIHJlcGVhdGVkX2ludDMyICAgID0gMzE7CisgIHJlcGVhdGVkICAgIGludDY0IHJlcGVhdGVkX2ludDY0ICAgID0gMzI7CisgIHJlcGVhdGVkICAgdWludDMyIHJlcGVhdGVkX3VpbnQzMiAgID0gMzM7CisgIHJlcGVhdGVkICAgdWludDY0IHJlcGVhdGVkX3VpbnQ2NCAgID0gMzQ7CisgIHJlcGVhdGVkICAgc2ludDMyIHJlcGVhdGVkX3NpbnQzMiAgID0gMzU7CisgIHJlcGVhdGVkICAgc2ludDY0IHJlcGVhdGVkX3NpbnQ2NCAgID0gMzY7CisgIHJlcGVhdGVkICBmaXhlZDMyIHJlcGVhdGVkX2ZpeGVkMzIgID0gMzc7CisgIHJlcGVhdGVkICBmaXhlZDY0IHJlcGVhdGVkX2ZpeGVkNjQgID0gMzg7CisgIHJlcGVhdGVkIHNmaXhlZDMyIHJlcGVhdGVkX3NmaXhlZDMyID0gMzk7CisgIHJlcGVhdGVkIHNmaXhlZDY0IHJlcGVhdGVkX3NmaXhlZDY0ID0gNDA7CisgIHJlcGVhdGVkICAgIGZsb2F0IHJlcGVhdGVkX2Zsb2F0ICAgID0gNDE7CisgIHJlcGVhdGVkICAgZG91YmxlIHJlcGVhdGVkX2RvdWJsZSAgID0gNDI7CisgIHJlcGVhdGVkICAgICBib29sIHJlcGVhdGVkX2Jvb2wgICAgID0gNDM7CisgIHJlcGVhdGVkICAgc3RyaW5nIHJlcGVhdGVkX3N0cmluZyAgID0gNDQ7CisgIHJlcGVhdGVkICAgIGJ5dGVzIHJlcGVhdGVkX2J5dGVzICAgID0gNDU7CisKKyAgcmVwZWF0ZWQgZ3JvdXAgUmVwZWF0ZWRHcm91cCA9IDQ2IHsKKyAgICBvcHRpb25hbCBpbnQzMiBhID0gNDc7CisgIH0KKworICByZXBlYXRlZCBOZXN0ZWRNZXNzYWdlICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgID0gNDg7CisgIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UgPSA0OTsKKyAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2UgcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgID0gNTA7CisKKyAgcmVwZWF0ZWQgTmVzdGVkRW51bSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkX25lc3RlZF9lbnVtICAgICA9IDUxOworICByZXBlYXRlZCBGb3JlaWduRW51bSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfZm9yZWlnbl9lbnVtICAgID0gNTI7CisgIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtICAgIHJlcGVhdGVkX2ltcG9ydF9lbnVtICAgICA9IDUzOworCisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfcGllY2UgPSA1NCBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX2NvcmQgPSA1NSBbY3R5cGU9Q09SRF07CisKKyAgcmVwZWF0ZWQgTmVzdGVkTWVzc2FnZSByZXBlYXRlZF9sYXp5X21lc3NhZ2UgPSA1NyBbbGF6eT10cnVlXTsKKworICAvLyBTaW5ndWxhciB3aXRoIGRlZmF1bHRzCisgIG9wdGlvbmFsICAgIGludDMyIGRlZmF1bHRfaW50MzIgICAgPSA2MSBbZGVmYXVsdCA9ICA0MSAgICBdOworICBvcHRpb25hbCAgICBpbnQ2NCBkZWZhdWx0X2ludDY0ICAgID0gNjIgW2RlZmF1bHQgPSAgNDIgICAgXTsKKyAgb3B0aW9uYWwgICB1aW50MzIgZGVmYXVsdF91aW50MzIgICA9IDYzIFtkZWZhdWx0ID0gIDQzICAgIF07CisgIG9wdGlvbmFsICAgdWludDY0IGRlZmF1bHRfdWludDY0ICAgPSA2NCBbZGVmYXVsdCA9ICA0NCAgICBdOworICBvcHRpb25hbCAgIHNpbnQzMiBkZWZhdWx0X3NpbnQzMiAgID0gNjUgW2RlZmF1bHQgPSAtNDUgICAgXTsKKyAgb3B0aW9uYWwgICBzaW50NjQgZGVmYXVsdF9zaW50NjQgICA9IDY2IFtkZWZhdWx0ID0gIDQ2ICAgIF07CisgIG9wdGlvbmFsICBmaXhlZDMyIGRlZmF1bHRfZml4ZWQzMiAgPSA2NyBbZGVmYXVsdCA9ICA0NyAgICBdOworICBvcHRpb25hbCAgZml4ZWQ2NCBkZWZhdWx0X2ZpeGVkNjQgID0gNjggW2RlZmF1bHQgPSAgNDggICAgXTsKKyAgb3B0aW9uYWwgc2ZpeGVkMzIgZGVmYXVsdF9zZml4ZWQzMiA9IDY5IFtkZWZhdWx0ID0gIDQ5ICAgIF07CisgIG9wdGlvbmFsIHNmaXhlZDY0IGRlZmF1bHRfc2ZpeGVkNjQgPSA3MCBbZGVmYXVsdCA9IC01MCAgICBdOworICBvcHRpb25hbCAgICBmbG9hdCBkZWZhdWx0X2Zsb2F0ICAgID0gNzEgW2RlZmF1bHQgPSAgNTEuNSAgXTsKKyAgb3B0aW9uYWwgICBkb3VibGUgZGVmYXVsdF9kb3VibGUgICA9IDcyIFtkZWZhdWx0ID0gIDUyZTMgIF07CisgIG9wdGlvbmFsICAgICBib29sIGRlZmF1bHRfYm9vbCAgICAgPSA3MyBbZGVmYXVsdCA9IHRydWUgICBdOworICBvcHRpb25hbCAgIHN0cmluZyBkZWZhdWx0X3N0cmluZyAgID0gNzQgW2RlZmF1bHQgPSAiaGVsbG8iXTsKKyAgb3B0aW9uYWwgICAgYnl0ZXMgZGVmYXVsdF9ieXRlcyAgICA9IDc1IFtkZWZhdWx0ID0gIndvcmxkIl07CisKKyAgb3B0aW9uYWwgTmVzdGVkRW51bSAgZGVmYXVsdF9uZXN0ZWRfZW51bSAgPSA4MSBbZGVmYXVsdCA9IEJBUiAgICAgICAgXTsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW0gZGVmYXVsdF9mb3JlaWduX2VudW0gPSA4MiBbZGVmYXVsdCA9IEZPUkVJR05fQkFSXTsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW0KKyAgICAgIGRlZmF1bHRfaW1wb3J0X2VudW0gPSA4MyBbZGVmYXVsdCA9IElNUE9SVF9CQVJdOworCisgIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3N0cmluZ19waWVjZSA9IDg0IFtjdHlwZT1TVFJJTkdfUElFQ0UsZGVmYXVsdD0iYWJjIl07CisgIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X2NvcmQgPSA4NSBbY3R5cGU9Q09SRCxkZWZhdWx0PSIxMjMiXTsKKworICAvLyBGb3Igb25lb2YgdGVzdAorICBvbmVvZiBvbmVvZl9maWVsZCB7CisgICAgdWludDMyIG9uZW9mX3VpbnQzMiA9IDExMTsKKyAgICBOZXN0ZWRNZXNzYWdlIG9uZW9mX25lc3RlZF9tZXNzYWdlID0gMTEyOworICAgIHN0cmluZyBvbmVvZl9zdHJpbmcgPSAxMTM7CisgICAgYnl0ZXMgb25lb2ZfYnl0ZXMgPSAxMTQ7CisgIH0KK30KKworLy8gVGhpcyBwcm90byBpbmNsdWRlcyBhIHJlY3Vyc2l2ZWx5IG5lc3RlZCBtZXNzYWdlLgorbWVzc2FnZSBOZXN0ZWRUZXN0QWxsVHlwZXMgeworICBvcHRpb25hbCBOZXN0ZWRUZXN0QWxsVHlwZXMgY2hpbGQgPSAxOworICBvcHRpb25hbCBUZXN0QWxsVHlwZXMgcGF5bG9hZCA9IDI7CisgIHJlcGVhdGVkIE5lc3RlZFRlc3RBbGxUeXBlcyByZXBlYXRlZF9jaGlsZCA9IDM7CisgIG9wdGlvbmFsIE5lc3RlZFRlc3RBbGxUeXBlcyBsYXp5X2NoaWxkID0gNCBbbGF6eT10cnVlXTsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIGVhZ2VyX2NoaWxkID0gNSBbbGF6eT1mYWxzZV07Cit9CisKK21lc3NhZ2UgVGVzdERlcHJlY2F0ZWRGaWVsZHMgeworICBvcHRpb25hbCBpbnQzMiBkZXByZWNhdGVkX2ludDMyID0gMSBbZGVwcmVjYXRlZD10cnVlXTsKKyAgb25lb2Ygb25lb2ZfZmllbGRzIHsKKyAgICBpbnQzMiBkZXByZWNhdGVkX2ludDMyX2luX29uZW9mID0gMiBbZGVwcmVjYXRlZD10cnVlXTsKKyAgfQorfQorCittZXNzYWdlIFRlc3REZXByZWNhdGVkTWVzc2FnZSB7CisgIG9wdGlvbiBkZXByZWNhdGVkID0gdHJ1ZTsKK30KKworLy8gRGVmaW5lIHRoZXNlIGFmdGVyIFRlc3RBbGxUeXBlcyB0byBtYWtlIHN1cmUgdGhlIGNvbXBpbGVyIGNhbiBoYW5kbGUKKy8vIHRoYXQuCittZXNzYWdlIEZvcmVpZ25NZXNzYWdlIHsKKyAgb3B0aW9uYWwgaW50MzIgYyA9IDE7CisgIG9wdGlvbmFsIGludDMyIGQgPSAyOworfQorCitlbnVtIEZvcmVpZ25FbnVtIHsKKyAgRk9SRUlHTl9GT08gPSA0OworICBGT1JFSUdOX0JBUiA9IDU7CisgIEZPUkVJR05fQkFaID0gNjsKK30KKworbWVzc2FnZSBUZXN0UmVzZXJ2ZWRGaWVsZHMgeworICByZXNlcnZlZCAyLCAxNSwgOSB0byAxMTsKKyAgcmVzZXJ2ZWQgImJhciIsICJiYXoiOworfQorCittZXNzYWdlIFRlc3RBbGxFeHRlbnNpb25zIHsKKyAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKK30KKworZXh0ZW5kIFRlc3RBbGxFeHRlbnNpb25zIHsKKyAgLy8gU2luZ3VsYXIKKyAgb3B0aW9uYWwgICAgaW50MzIgb3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICAgID0gIDE7CisgIG9wdGlvbmFsICAgIGludDY0IG9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbiAgICA9ICAyOworICBvcHRpb25hbCAgIHVpbnQzMiBvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uICAgPSAgMzsKKyAgb3B0aW9uYWwgICB1aW50NjQgb3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbiAgID0gIDQ7CisgIG9wdGlvbmFsICAgc2ludDMyIG9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb24gICA9ICA1OworICBvcHRpb25hbCAgIHNpbnQ2NCBvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uICAgPSAgNjsKKyAgb3B0aW9uYWwgIGZpeGVkMzIgb3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb24gID0gIDc7CisgIG9wdGlvbmFsICBmaXhlZDY0IG9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uICA9ICA4OworICBvcHRpb25hbCBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb24gPSAgOTsKKyAgb3B0aW9uYWwgc2ZpeGVkNjQgb3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uID0gMTA7CisgIG9wdGlvbmFsICAgIGZsb2F0IG9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbiAgICA9IDExOworICBvcHRpb25hbCAgIGRvdWJsZSBvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uICAgPSAxMjsKKyAgb3B0aW9uYWwgICAgIGJvb2wgb3B0aW9uYWxfYm9vbF9leHRlbnNpb24gICAgID0gMTM7CisgIG9wdGlvbmFsICAgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24gICA9IDE0OworICBvcHRpb25hbCAgICBieXRlcyBvcHRpb25hbF9ieXRlc19leHRlbnNpb24gICAgPSAxNTsKKworICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiA9IDE2IHsKKyAgICBvcHRpb25hbCBpbnQzMiBhID0gMTc7CisgIH0KKworICBvcHRpb25hbCBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gPSAxODsKKyAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2Ugb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiA9IDE5OworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZQorICAgIG9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiA9IDIwOworCisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtIG9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbiA9IDIxOworICBvcHRpb25hbCBGb3JlaWduRW51bSBvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uID0gMjI7CisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtCisgICAgb3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uID0gMjM7CisKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb24gPSAyNCBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uID0gMjUgW2N0eXBlPUNPUkRdOworCisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5QdWJsaWNJbXBvcnRNZXNzYWdlCisgICAgb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiA9IDI2OworCisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlCisgICAgb3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiA9IDI3IFtsYXp5PXRydWVdOworICBvcHRpb25hbCBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZQorICAgIG9wdGlvbmFsX3VudmVyaWZpZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiA9IDI4IFt1bnZlcmlmaWVkX2xhenk9dHJ1ZV07CisKKyAgLy8gUmVwZWF0ZWQKKyAgcmVwZWF0ZWQgICAgaW50MzIgcmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgID0gMzE7CisgIHJlcGVhdGVkICAgIGludDY0IHJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICA9IDMyOworICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAgPSAzMzsKKyAgcmVwZWF0ZWQgICB1aW50NjQgcmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgID0gMzQ7CisgIHJlcGVhdGVkICAgc2ludDMyIHJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICA9IDM1OworICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAgPSAzNjsKKyAgcmVwZWF0ZWQgIGZpeGVkMzIgcmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gID0gMzc7CisgIHJlcGVhdGVkICBmaXhlZDY0IHJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICA9IDM4OworICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24gPSAzOTsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgcmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uID0gNDA7CisgIHJlcGVhdGVkICAgIGZsb2F0IHJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICA9IDQxOworICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAgPSA0MjsKKyAgcmVwZWF0ZWQgICAgIGJvb2wgcmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgID0gNDM7CisgIHJlcGVhdGVkICAgc3RyaW5nIHJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICA9IDQ0OworICByZXBlYXRlZCAgICBieXRlcyByZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAgPSA0NTsKKworICByZXBlYXRlZCBncm91cCBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbiA9IDQ2IHsKKyAgICBvcHRpb25hbCBpbnQzMiBhID0gNDc7CisgIH0KKworICByZXBlYXRlZCBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gPSA0ODsKKyAgcmVwZWF0ZWQgRm9yZWlnbk1lc3NhZ2UgcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiA9IDQ5OworICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZQorICAgIHJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiA9IDUwOworCisgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtIHJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiA9IDUxOworICByZXBlYXRlZCBGb3JlaWduRW51bSByZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uID0gNTI7CisgIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtCisgICAgcmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uID0gNTM7CisKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24gPSA1NCBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uID0gNTUgW2N0eXBlPUNPUkRdOworCisgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlCisgICAgcmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiA9IDU3IFtsYXp5PXRydWVdOworCisgIC8vIFNpbmd1bGFyIHdpdGggZGVmYXVsdHMKKyAgb3B0aW9uYWwgICAgaW50MzIgZGVmYXVsdF9pbnQzMl9leHRlbnNpb24gICAgPSA2MSBbZGVmYXVsdCA9ICA0MSAgICBdOworICBvcHRpb25hbCAgICBpbnQ2NCBkZWZhdWx0X2ludDY0X2V4dGVuc2lvbiAgICA9IDYyIFtkZWZhdWx0ID0gIDQyICAgIF07CisgIG9wdGlvbmFsICAgdWludDMyIGRlZmF1bHRfdWludDMyX2V4dGVuc2lvbiAgID0gNjMgW2RlZmF1bHQgPSAgNDMgICAgXTsKKyAgb3B0aW9uYWwgICB1aW50NjQgZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uICAgPSA2NCBbZGVmYXVsdCA9ICA0NCAgICBdOworICBvcHRpb25hbCAgIHNpbnQzMiBkZWZhdWx0X3NpbnQzMl9leHRlbnNpb24gICA9IDY1IFtkZWZhdWx0ID0gLTQ1ICAgIF07CisgIG9wdGlvbmFsICAgc2ludDY0IGRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbiAgID0gNjYgW2RlZmF1bHQgPSAgNDYgICAgXTsKKyAgb3B0aW9uYWwgIGZpeGVkMzIgZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbiAgPSA2NyBbZGVmYXVsdCA9ICA0NyAgICBdOworICBvcHRpb25hbCAgZml4ZWQ2NCBkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uICA9IDY4IFtkZWZhdWx0ID0gIDQ4ICAgIF07CisgIG9wdGlvbmFsIHNmaXhlZDMyIGRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uID0gNjkgW2RlZmF1bHQgPSAgNDkgICAgXTsKKyAgb3B0aW9uYWwgc2ZpeGVkNjQgZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb24gPSA3MCBbZGVmYXVsdCA9IC01MCAgICBdOworICBvcHRpb25hbCAgICBmbG9hdCBkZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbiAgICA9IDcxIFtkZWZhdWx0ID0gIDUxLjUgIF07CisgIG9wdGlvbmFsICAgZG91YmxlIGRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbiAgID0gNzIgW2RlZmF1bHQgPSAgNTJlMyAgXTsKKyAgb3B0aW9uYWwgICAgIGJvb2wgZGVmYXVsdF9ib29sX2V4dGVuc2lvbiAgICAgPSA3MyBbZGVmYXVsdCA9IHRydWUgICBdOworICBvcHRpb25hbCAgIHN0cmluZyBkZWZhdWx0X3N0cmluZ19leHRlbnNpb24gICA9IDc0IFtkZWZhdWx0ID0gImhlbGxvIl07CisgIG9wdGlvbmFsICAgIGJ5dGVzIGRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uICAgID0gNzUgW2RlZmF1bHQgPSAid29ybGQiXTsKKworICBvcHRpb25hbCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bQorICAgIGRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uID0gODEgW2RlZmF1bHQgPSBCQVJdOworICBvcHRpb25hbCBGb3JlaWduRW51bQorICAgIGRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiA9IDgyIFtkZWZhdWx0ID0gRk9SRUlHTl9CQVJdOworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bQorICAgIGRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uID0gODMgW2RlZmF1bHQgPSBJTVBPUlRfQkFSXTsKKworICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uID0gODQgW2N0eXBlPVNUUklOR19QSUVDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJhYmMiXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfY29yZF9leHRlbnNpb24gPSA4NSBbY3R5cGU9Q09SRCwgZGVmYXVsdD0iMTIzIl07CisKKyAgLy8gRm9yIG9uZW9mIHRlc3QKKyAgb3B0aW9uYWwgdWludDMyIG9uZW9mX3VpbnQzMl9leHRlbnNpb24gPSAxMTE7CisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlIG9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiA9IDExMjsKKyAgb3B0aW9uYWwgc3RyaW5nIG9uZW9mX3N0cmluZ19leHRlbnNpb24gPSAxMTM7CisgIG9wdGlvbmFsIGJ5dGVzIG9uZW9mX2J5dGVzX2V4dGVuc2lvbiA9IDExNDsKK30KKworbWVzc2FnZSBUZXN0R3JvdXAgeworICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwID0gMTYgeworICAgIG9wdGlvbmFsIGludDMyIGEgPSAxNzsKKyAgfQorICBvcHRpb25hbCBGb3JlaWduRW51bSBvcHRpb25hbF9mb3JlaWduX2VudW0gPSAyMjsKK30KKworbWVzc2FnZSBUZXN0R3JvdXBFeHRlbnNpb24geworICBleHRlbnNpb25zIDEgdG8gbWF4OworfQorCittZXNzYWdlIFRlc3ROZXN0ZWRFeHRlbnNpb24geworICBleHRlbmQgVGVzdEFsbEV4dGVuc2lvbnMgeworICAgIC8vIENoZWNrIGZvciBidWcgd2hlcmUgc3RyaW5nIGV4dGVuc2lvbnMgZGVjbGFyZWQgaW4gdGVzdGVkIHNjb3BlIGRpZCBub3QKKyAgICAvLyBjb21waWxlLgorICAgIG9wdGlvbmFsIHN0cmluZyB0ZXN0ID0gMTAwMiBbZGVmYXVsdD0idGVzdCJdOworICAgIC8vIFVzZWQgdG8gdGVzdCBpZiBnZW5lcmF0ZWQgZXh0ZW5zaW9uIG5hbWUgaXMgY29ycmVjdCB3aGVuIHRoZXJlIGFyZQorICAgIC8vIHVuZGVyc2NvcmVzLgorICAgIG9wdGlvbmFsIHN0cmluZyBuZXN0ZWRfc3RyaW5nX2V4dGVuc2lvbiA9IDEwMDM7CisgIH0KKworICBleHRlbmQgVGVzdEdyb3VwRXh0ZW5zaW9uIHsKKyAgICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiA9IDE2IHsKKyAgICAgIG9wdGlvbmFsIGludDMyIGEgPSAxNzsKKyAgICB9CisgICAgb3B0aW9uYWwgRm9yZWlnbkVudW0gb3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiA9IDIyOworICB9Cit9CisKK21lc3NhZ2UgVGVzdENoaWxkRXh0ZW5zaW9uIHsKKyAgb3B0aW9uYWwgc3RyaW5nIGEgPSAxOworICBvcHRpb25hbCBzdHJpbmcgYiA9IDI7CisgIG9wdGlvbmFsIFRlc3RBbGxFeHRlbnNpb25zIG9wdGlvbmFsX2V4dGVuc2lvbiA9IDM7Cit9CisKKy8vIEVtdWxhdGVzIHdpcmVmb3JtYXQgZGF0YSBvZiBUZXN0Q2hpbGRFeHRlbnNpb24gd2l0aCBkeW5hbWljIGV4dGVuc2lvbgorLy8gKER5bmFtaWNFeHRlbnNpb24pLgorbWVzc2FnZSBUZXN0Q2hpbGRFeHRlbnNpb25EYXRhIHsKKyAgbWVzc2FnZSBOZXN0ZWRUZXN0QWxsRXh0ZW5zaW9uc0RhdGEgeworICAgIG1lc3NhZ2UgTmVzdGVkRHluYW1pY0V4dGVuc2lvbnMgeworICAgICAgb3B0aW9uYWwgaW50MzIgYSA9IDE7CisgICAgICBvcHRpb25hbCBpbnQzMiBiID0gMjsKKyAgICB9CisgICAgb3B0aW9uYWwgTmVzdGVkRHluYW1pY0V4dGVuc2lvbnMgZHluYW1pYyA9IDQwOTcwNzAwODsKKyAgfQorICBvcHRpb25hbCBzdHJpbmcgYSA9IDE7CisgIG9wdGlvbmFsIHN0cmluZyBiID0gMjsKKyAgb3B0aW9uYWwgTmVzdGVkVGVzdEFsbEV4dGVuc2lvbnNEYXRhIG9wdGlvbmFsX2V4dGVuc2lvbiA9IDM7Cit9CisKK21lc3NhZ2UgVGVzdE5lc3RlZENoaWxkRXh0ZW5zaW9uIHsKKyAgb3B0aW9uYWwgaW50MzIgYSA9IDE7CisgIG9wdGlvbmFsIFRlc3RDaGlsZEV4dGVuc2lvbiBjaGlsZCA9IDI7Cit9CisKKy8vIEVtdWxhdGVzIHdpcmVmb3JtYXQgZGF0YSBvZiBUZXN0TmVzdGVkQ2hpbGRFeHRlbnNpb24gd2l0aCBkeW5hbWljIGV4dGVuc2lvbgorLy8gKER5bmFtaWNFeHRlbnNpb24pLgorbWVzc2FnZSBUZXN0TmVzdGVkQ2hpbGRFeHRlbnNpb25EYXRhIHsKKyAgb3B0aW9uYWwgaW50MzIgYSA9IDE7CisgIG9wdGlvbmFsIFRlc3RDaGlsZEV4dGVuc2lvbkRhdGEgY2hpbGQgPSAyOworfQorCisvLyBXZSBoYXZlIHNlcGFyYXRlIG1lc3NhZ2VzIGZvciB0ZXN0aW5nIHJlcXVpcmVkIGZpZWxkcyBiZWNhdXNlIGl0J3MKKy8vIGFubm95aW5nIHRvIGhhdmUgdG8gZmlsbCBpbiByZXF1aXJlZCBmaWVsZHMgaW4gVGVzdFByb3RvIGluIG9yZGVyIHRvCisvLyBkbyBhbnl0aGluZyB3aXRoIGl0LiAgTm90ZSB0aGF0IHdlIGRvbid0IG5lZWQgdG8gdGVzdCBldmVyeSB0eXBlIG9mCisvLyByZXF1aXJlZCBmaWxlZCBiZWNhdXNlIHRoZSBjb2RlIG91dHB1dCBpcyBiYXNpY2FsbHkgaWRlbnRpY2FsIHRvCisvLyBvcHRpb25hbCBmaWVsZHMgZm9yIGFsbCB0eXBlcy4KK21lc3NhZ2UgVGVzdFJlcXVpcmVkIHsKKyAgcmVxdWlyZWQgaW50MzIgYSA9IDE7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MiA9IDI7CisgIHJlcXVpcmVkIGludDMyIGIgPSAzOworCisgIGV4dGVuZCBUZXN0QWxsRXh0ZW5zaW9ucyB7CisgICAgb3B0aW9uYWwgVGVzdFJlcXVpcmVkIHNpbmdsZSA9IDEwMDA7CisgICAgcmVwZWF0ZWQgVGVzdFJlcXVpcmVkIG11bHRpICA9IDEwMDE7CisgIH0KKworICAvLyBQYWQgdGhlIGZpZWxkIGNvdW50IHRvIDMyIHNvIHRoYXQgd2UgY2FuIHRlc3QgdGhhdCBJc0luaXRpYWxpemVkKCkKKyAgLy8gcHJvcGVybHkgY2hlY2tzIG11bHRpcGxlIGVsZW1lbnRzIG9mIGhhc19iaXRzXy4KKyAgb3B0aW9uYWwgaW50MzIgZHVtbXk0ICA9ICA0OworICBvcHRpb25hbCBpbnQzMiBkdW1teTUgID0gIDU7CisgIG9wdGlvbmFsIGludDMyIGR1bW15NiAgPSAgNjsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXk3ICA9ICA3OworICBvcHRpb25hbCBpbnQzMiBkdW1teTggID0gIDg7CisgIG9wdGlvbmFsIGludDMyIGR1bW15OSAgPSAgOTsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxMCA9IDEwOworICBvcHRpb25hbCBpbnQzMiBkdW1teTExID0gMTE7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MTIgPSAxMjsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxMyA9IDEzOworICBvcHRpb25hbCBpbnQzMiBkdW1teTE0ID0gMTQ7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MTUgPSAxNTsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxNiA9IDE2OworICBvcHRpb25hbCBpbnQzMiBkdW1teTE3ID0gMTc7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MTggPSAxODsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxOSA9IDE5OworICBvcHRpb25hbCBpbnQzMiBkdW1teTIwID0gMjA7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MjEgPSAyMTsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkyMiA9IDIyOworICBvcHRpb25hbCBpbnQzMiBkdW1teTIzID0gMjM7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MjQgPSAyNDsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkyNSA9IDI1OworICBvcHRpb25hbCBpbnQzMiBkdW1teTI2ID0gMjY7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MjcgPSAyNzsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkyOCA9IDI4OworICBvcHRpb25hbCBpbnQzMiBkdW1teTI5ID0gMjk7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MzAgPSAzMDsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkzMSA9IDMxOworICBvcHRpb25hbCBpbnQzMiBkdW1teTMyID0gMzI7CisKKyAgcmVxdWlyZWQgaW50MzIgYyA9IDMzOworCisgIC8vIEFkZCBhbiBvcHRpb25hbCBjaGlsZCBtZXNzYWdlIHRvIG1ha2UgdGhpcyBub24tdHJpdmlhbCBmb3IgZ28vcGRsYXp5LgorICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSBvcHRpb25hbF9mb3JlaWduID0gMzQ7Cit9CisKK21lc3NhZ2UgVGVzdFJlcXVpcmVkRm9yZWlnbiB7CisgIG9wdGlvbmFsIFRlc3RSZXF1aXJlZCBvcHRpb25hbF9tZXNzYWdlID0gMTsKKyAgcmVwZWF0ZWQgVGVzdFJlcXVpcmVkIHJlcGVhdGVkX21lc3NhZ2UgPSAyOworICBvcHRpb25hbCBpbnQzMiBkdW1teSA9IDM7Cit9CisKK21lc3NhZ2UgVGVzdFJlcXVpcmVkTWVzc2FnZSB7CisgIG9wdGlvbmFsIFRlc3RSZXF1aXJlZCBvcHRpb25hbF9tZXNzYWdlID0gMTsKKyAgcmVwZWF0ZWQgVGVzdFJlcXVpcmVkIHJlcGVhdGVkX21lc3NhZ2UgPSAyOworICByZXF1aXJlZCBUZXN0UmVxdWlyZWQgcmVxdWlyZWRfbWVzc2FnZSA9IDM7Cit9CisKK21lc3NhZ2UgVGVzdE5lc3RlZFJlcXVpcmVkRm9yZWlnbiB7CisgIG9wdGlvbmFsIFRlc3ROZXN0ZWRSZXF1aXJlZEZvcmVpZ24gY2hpbGQgPSAxOworICBvcHRpb25hbCBUZXN0UmVxdWlyZWRGb3JlaWduIHBheWxvYWQgPSAyOworICBvcHRpb25hbCBpbnQzMiBkdW1teSA9IDM7Cit9CisKKy8vIFRlc3QgdGhhdCB3ZSBjYW4gdXNlIE5lc3RlZE1lc3NhZ2UgZnJvbSBvdXRzaWRlIFRlc3RBbGxUeXBlcy4KK21lc3NhZ2UgVGVzdEZvcmVpZ25OZXN0ZWQgeworICBvcHRpb25hbCBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSBmb3JlaWduX25lc3RlZCA9IDE7Cit9CisKKy8vIFRlc3RFbXB0eU1lc3NhZ2UgaXMgdXNlZCB0byB0ZXN0IHVua25vd24gZmllbGQgc3VwcG9ydC4KK21lc3NhZ2UgVGVzdEVtcHR5TWVzc2FnZSB7Cit9CisKKy8vIExpa2UgYWJvdmUsIGJ1dCBkZWNsYXJlIGFsbCBmaWVsZCBudW1iZXJzIGFzIHBvdGVudGlhbCBleHRlbnNpb25zLiAgTm8KKy8vIGFjdHVhbCBleHRlbnNpb25zIHNob3VsZCBldmVyIGJlIGRlZmluZWQgZm9yIHRoaXMgdHlwZS4KK21lc3NhZ2UgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIHsKKyAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKK30KKworLy8gTmVlZGVkIGZvciBhIFB5dGhvbiB0ZXN0LgorbWVzc2FnZSBUZXN0UGlja2xlTmVzdGVkTWVzc2FnZSB7CisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgb3B0aW9uYWwgaW50MzIgYmIgPSAxOworICAgIG1lc3NhZ2UgTmVzdGVkTmVzdGVkTWVzc2FnZSB7CisgICAgICBvcHRpb25hbCBpbnQzMiBjYyA9IDE7CisgICAgfQorICB9Cit9CisKK21lc3NhZ2UgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIHsKKyAgZXh0ZW5zaW9ucyA0MjsKKyAgZXh0ZW5zaW9ucyA0MTQzIHRvIDQyNDM7CisgIGV4dGVuc2lvbnMgNjU1MzYgdG8gbWF4OworfQorCisvLyBUZXN0IHRoYXQgcmVhbGx5IGxhcmdlIHRhZyBudW1iZXJzIGRvbid0IGJyZWFrIGFueXRoaW5nLgorbWVzc2FnZSBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgeworICAvLyBUaGUgbGFyZ2VzdCBwb3NzaWJsZSB0YWcgbnVtYmVyIGlzIDJeMjggLSAxLCBzaW5jZSB0aGUgd2lyZSBmb3JtYXQgdXNlcworICAvLyB0aHJlZSBiaXRzIHRvIGNvbW11bmljYXRlIHdpcmUgdHlwZS4KKyAgb3B0aW9uYWwgaW50MzIgYSA9IDE7CisgIG9wdGlvbmFsIGludDMyIGJiID0gMjY4NDM1NDU1OworfQorCittZXNzYWdlIFRlc3RSZWN1cnNpdmVNZXNzYWdlIHsKKyAgb3B0aW9uYWwgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgYSA9IDE7CisgIG9wdGlvbmFsIGludDMyIGkgPSAyOworfQorCisvLyBUZXN0IHRoYXQgbXV0dWFsIHJlY3Vyc2lvbiB3b3Jrcy4KK21lc3NhZ2UgVGVzdE11dHVhbFJlY3Vyc2lvbkEgeworICBtZXNzYWdlIFN1Yk1lc3NhZ2UgeworICAgIG9wdGlvbmFsIFRlc3RNdXR1YWxSZWN1cnNpb25CIGIgPSAxOworICB9CisgIG9wdGlvbmFsIFRlc3RNdXR1YWxSZWN1cnNpb25CIGJiID0gMTsKKyAgb3B0aW9uYWwgZ3JvdXAgU3ViR3JvdXAgPSAyIHsKKyAgICBvcHRpb25hbCBTdWJNZXNzYWdlIHN1Yl9tZXNzYWdlID0gMzsgIC8vIE5lZWRlZCBiZWNhdXNlIG9mIGJ1ZyBpbiBqYXZhdGVzdAorICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBub3RfaW5fdGhpc19zY2MgPSA0OworICB9Cit9CisKK21lc3NhZ2UgVGVzdE11dHVhbFJlY3Vyc2lvbkIgeworICBvcHRpb25hbCBUZXN0TXV0dWFsUmVjdXJzaW9uQSBhID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzIgPSAyOworfQorCittZXNzYWdlIFRlc3RJc0luaXRpYWxpemVkIHsKKyAgbWVzc2FnZSBTdWJNZXNzYWdlIHsKKyAgICBvcHRpb25hbCBncm91cCBTdWJHcm91cCA9IDEgeworICAgICAgcmVxdWlyZWQgaW50MzIgaSA9IDI7CisgICAgfQorICB9CisgIG9wdGlvbmFsIFN1Yk1lc3NhZ2Ugc3ViX21lc3NhZ2UgPSAxOworfQorCisvLyBUZXN0IHRoYXQgZ3JvdXBzIGhhdmUgZGlzam9pbnQgZmllbGQgbnVtYmVycyBmcm9tIHRoZWlyIHNpYmxpbmdzIGFuZAorLy8gcGFyZW50cy4gIFRoaXMgaXMgTk9UIHBvc3NpYmxlIGluIHByb3RvMTsgb25seSBnb29nbGUucHJvdG9idWYuICBXaGVuIGF0dGVtcHRpbmcKKy8vIHRvIGNvbXBpbGUgd2l0aCBwcm90bzEsIHRoaXMgd2lsbCBlbWl0IGFuIGVycm9yOyBzbyB3ZSBvbmx5IGluY2x1ZGUgaXQKKy8vIGluIHByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvLgorbWVzc2FnZSBUZXN0RHVwRmllbGROdW1iZXIgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMQorICBvcHRpb25hbCBpbnQzMiBhID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMQorICBvcHRpb25hbCBncm91cCBGb28gPSAyIHsgb3B0aW9uYWwgaW50MzIgYSA9IDE7IH0gIC8vIE5PX1BST1RPMQorICBvcHRpb25hbCBncm91cCBCYXIgPSAzIHsgb3B0aW9uYWwgaW50MzIgYSA9IDE7IH0gIC8vIE5PX1BST1RPMQorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMQorCisvLyBBZGRpdGlvbmFsIG1lc3NhZ2VzIGZvciB0ZXN0aW5nIGxhenkgZmllbGRzLgorbWVzc2FnZSBUZXN0RWFnZXJNZXNzYWdlIHsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIHN1Yl9tZXNzYWdlID0gMSBbbGF6eT1mYWxzZV07Cit9CittZXNzYWdlIFRlc3RMYXp5TWVzc2FnZSB7CisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBzdWJfbWVzc2FnZSA9IDEgW2xhenk9dHJ1ZV07Cit9CittZXNzYWdlIFRlc3RFYWdlck1heWJlTGF6eSB7CisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgb3B0aW9uYWwgVGVzdFBhY2tlZFR5cGVzIHBhY2tlZCA9IDE7CisgIH0KKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIG1lc3NhZ2VfZm9vID0gMTsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIG1lc3NhZ2VfYmFyID0gMjsKKyAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSBtZXNzYWdlX2JheiA9IDM7Cit9CisvLyBOZWVkZWQgZm9yIGEgUHl0aG9uIHRlc3QuCittZXNzYWdlIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyB7CisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgcmVwZWF0ZWQgaW50MzIgbmVzdGVkbWVzc2FnZV9yZXBlYXRlZF9pbnQzMiA9IDE7CisgICAgcmVwZWF0ZWQgRm9yZWlnbk1lc3NhZ2UgbmVzdGVkbWVzc2FnZV9yZXBlYXRlZF9mb3JlaWdubWVzc2FnZSA9IDI7CisgIH0KKyAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSA9IDE7Cit9CisKKworLy8gVGVzdCBhbiBlbnVtIHRoYXQgaGFzIG11bHRpcGxlIHZhbHVlcyB3aXRoIHRoZSBzYW1lIG51bWJlci4KK2VudW0gVGVzdEVudW1XaXRoRHVwVmFsdWUgeworICBvcHRpb24gYWxsb3dfYWxpYXMgPSB0cnVlOworCisgIEZPTzEgPSAxOworICBCQVIxID0gMjsKKyAgQkFaID0gMzsKKyAgRk9PMiA9IDE7CisgIEJBUjIgPSAyOworfQorCisvLyBUZXN0IGFuIGVudW0gd2l0aCBsYXJnZSwgdW5vcmRlcmVkIHZhbHVlcy4KK2VudW0gVGVzdFNwYXJzZUVudW0geworICBTUEFSU0VfQSA9IDEyMzsKKyAgU1BBUlNFX0IgPSA2MjM3NDsKKyAgU1BBUlNFX0MgPSAxMjU4OTIzNDsKKyAgU1BBUlNFX0QgPSAtMTU7CisgIFNQQVJTRV9FID0gLTUzNDUyOworICBTUEFSU0VfRiA9IDA7CisgIFNQQVJTRV9HID0gMjsKK30KKworLy8gVGVzdCBtZXNzYWdlIHdpdGggQ2FtZWxDYXNlIGZpZWxkIG5hbWVzLiAgVGhpcyB2aW9sYXRlcyBQcm90b2NvbCBCdWZmZXIKKy8vIHN0YW5kYXJkIHN0eWxlLgorbWVzc2FnZSBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyB7CisgIG9wdGlvbmFsIGludDMyIFByaW1pdGl2ZUZpZWxkID0gMTsKKyAgb3B0aW9uYWwgc3RyaW5nIFN0cmluZ0ZpZWxkID0gMjsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW0gRW51bUZpZWxkID0gMzsKKyAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2UgTWVzc2FnZUZpZWxkID0gNDsKKyAgb3B0aW9uYWwgc3RyaW5nIFN0cmluZ1BpZWNlRmllbGQgPSA1IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICBvcHRpb25hbCBzdHJpbmcgQ29yZEZpZWxkID0gNiBbY3R5cGU9Q09SRF07CisKKyAgcmVwZWF0ZWQgaW50MzIgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZCA9IDc7CisgIHJlcGVhdGVkIHN0cmluZyBSZXBlYXRlZFN0cmluZ0ZpZWxkID0gODsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gUmVwZWF0ZWRFbnVtRmllbGQgPSA5OworICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSBSZXBlYXRlZE1lc3NhZ2VGaWVsZCA9IDEwOworICByZXBlYXRlZCBzdHJpbmcgUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkID0gMTEgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIHJlcGVhdGVkIHN0cmluZyBSZXBlYXRlZENvcmRGaWVsZCA9IDEyIFtjdHlwZT1DT1JEXTsKK30KKworCisvLyBXZSBsaXN0IGZpZWxkcyBvdXQgb2Ygb3JkZXIsIHRvIGVuc3VyZSB0aGF0IHdlJ3JlIHVzaW5nIGZpZWxkIG51bWJlciBhbmQgbm90CisvLyBmaWVsZCBpbmRleCB0byBkZXRlcm1pbmUgc2VyaWFsaXphdGlvbiBvcmRlci4KK21lc3NhZ2UgVGVzdEZpZWxkT3JkZXJpbmdzIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG15X3N0cmluZyA9IDExOworICBleHRlbnNpb25zIDIgdG8gMTA7CisgIG9wdGlvbmFsIGludDY0IG15X2ludCA9IDE7CisgIGV4dGVuc2lvbnMgMTIgdG8gMTAwOworICBvcHRpb25hbCBmbG9hdCBteV9mbG9hdCA9IDEwMTsKKyAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKKyAgICBvcHRpb25hbCBpbnQ2NCBvbyA9IDI7CisgICAgLy8gVGhlIGZpZWxkIG5hbWUgImIiIGZhaWxzIHRvIGNvbXBpbGUgaW4gcHJvdG8xIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGgKKyAgICAvLyBhIGxvY2FsIHZhcmlhYmxlIG5hbWVkICJiIiBpbiBvbmUgb2YgdGhlIGdlbmVyYXRlZCBtZXRob2RzLiAgRG9oLgorICAgIC8vIFRoaXMgZmlsZSBuZWVkcyB0byBjb21waWxlIGluIHByb3RvMSB0byB0ZXN0IGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgorICAgIG9wdGlvbmFsIGludDMyIGJiID0gMTsKKyAgfQorCisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgID0gMjAwOworfQorCitleHRlbmQgVGVzdEZpZWxkT3JkZXJpbmdzIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG15X2V4dGVuc2lvbl9zdHJpbmcgPSA1MDsKKyAgb3B0aW9uYWwgaW50MzIgbXlfZXh0ZW5zaW9uX2ludCA9IDU7Cit9CisKK21lc3NhZ2UgVGVzdEV4dGVuc2lvbk9yZGVyaW5nczEgeworICBleHRlbmQgVGVzdEZpZWxkT3JkZXJpbmdzIHsKKyAgICBvcHRpb25hbCBUZXN0RXh0ZW5zaW9uT3JkZXJpbmdzMSB0ZXN0X2V4dF9vcmRlcmluZ3MxID0gMTM7CisgIH0KKyAgb3B0aW9uYWwgc3RyaW5nIG15X3N0cmluZyA9IDE7Cit9CisKK21lc3NhZ2UgVGVzdEV4dGVuc2lvbk9yZGVyaW5nczIgeworICBleHRlbmQgVGVzdEZpZWxkT3JkZXJpbmdzIHsKKyAgICBvcHRpb25hbCBUZXN0RXh0ZW5zaW9uT3JkZXJpbmdzMiB0ZXN0X2V4dF9vcmRlcmluZ3MyID0gMTI7CisgIH0KKyAgbWVzc2FnZSBUZXN0RXh0ZW5zaW9uT3JkZXJpbmdzMyB7CisgICAgZXh0ZW5kIFRlc3RGaWVsZE9yZGVyaW5ncyB7CisgICAgICBvcHRpb25hbCBUZXN0RXh0ZW5zaW9uT3JkZXJpbmdzMyB0ZXN0X2V4dF9vcmRlcmluZ3MzID0gMTQ7CisgICAgfQorICAgIG9wdGlvbmFsIHN0cmluZyBteV9zdHJpbmcgPSAxOworICB9CisgIG9wdGlvbmFsIHN0cmluZyBteV9zdHJpbmcgPSAxOworfQorCittZXNzYWdlIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyB7CisgIG9wdGlvbmFsIGJ5dGVzIGVzY2FwZWRfYnl0ZXMgPSAxIFtkZWZhdWx0ID0gIlwwXDAwMVxhXGJcZlxuXHJcdFx2XFxcJ1wiXHhmZSJdOworICBvcHRpb25hbCB1aW50MzIgbGFyZ2VfdWludDMyID0gMiBbZGVmYXVsdCA9IDB4RkZGRkZGRkZdOworICBvcHRpb25hbCB1aW50NjQgbGFyZ2VfdWludDY0ID0gMyBbZGVmYXVsdCA9IDB4RkZGRkZGRkZGRkZGRkZGRl07CisgIG9wdGlvbmFsICBpbnQzMiBzbWFsbF9pbnQzMiAgPSA0IFtkZWZhdWx0ID0gLTB4N0ZGRkZGRkZdOworICBvcHRpb25hbCAgaW50NjQgc21hbGxfaW50NjQgID0gNSBbZGVmYXVsdCA9IC0weDdGRkZGRkZGRkZGRkZGRkZdOworICBvcHRpb25hbCAgaW50MzIgcmVhbGx5X3NtYWxsX2ludDMyID0gMjEgW2RlZmF1bHQgPSAtMHg4MDAwMDAwMF07CisgIG9wdGlvbmFsICBpbnQ2NCByZWFsbHlfc21hbGxfaW50NjQgPSAyMiBbZGVmYXVsdCA9IC0weDgwMDAwMDAwMDAwMDAwMDBdOworCisgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGhlcmUgaXMgVVRGLTggZm9yICJcdTEyMzQiLiAgKFdlIGNvdWxkIGFsc28ganVzdCB0eXBlCisgIC8vIHRoZSBVVEYtOCB0ZXh0IGRpcmVjdGx5IGludG8gdGhpcyB0ZXh0IGZpbGUgcmF0aGVyIHRoYW4gZXNjYXBlIGl0LCBidXQKKyAgLy8gbG90cyBvZiBwZW9wbGUgdXNlIGVkaXRvcnMgdGhhdCB3b3VsZCBiZSBjb25mdXNlZCBieSB0aGlzLikKKyAgb3B0aW9uYWwgc3RyaW5nIHV0Zjhfc3RyaW5nID0gNiBbZGVmYXVsdCA9ICJcMzQxXDIxMFwyNjQiXTsKKworICAvLyBUZXN0cyBmb3Igc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCisgIG9wdGlvbmFsIGZsb2F0IHplcm9fZmxvYXQgPSA3IFtkZWZhdWx0ID0gMF07CisgIG9wdGlvbmFsIGZsb2F0IG9uZV9mbG9hdCA9IDggW2RlZmF1bHQgPSAxXTsKKyAgb3B0aW9uYWwgZmxvYXQgc21hbGxfZmxvYXQgPSA5IFtkZWZhdWx0ID0gMS41XTsKKyAgb3B0aW9uYWwgZmxvYXQgbmVnYXRpdmVfb25lX2Zsb2F0ID0gMTAgW2RlZmF1bHQgPSAtMV07CisgIG9wdGlvbmFsIGZsb2F0IG5lZ2F0aXZlX2Zsb2F0ID0gMTEgW2RlZmF1bHQgPSAtMS41XTsKKyAgLy8gVXNpbmcgZXhwb25lbnRzCisgIG9wdGlvbmFsIGZsb2F0IGxhcmdlX2Zsb2F0ID0gMTIgW2RlZmF1bHQgPSAyRThdOworICBvcHRpb25hbCBmbG9hdCBzbWFsbF9uZWdhdGl2ZV9mbG9hdCA9IDEzIFtkZWZhdWx0ID0gLThlLTI4XTsKKworICAvLyBUZXh0IGZvciBub25maW5pdGUgZmxvYXRpbmctcG9pbnQgdmFsdWVzLgorICBvcHRpb25hbCBkb3VibGUgaW5mX2RvdWJsZSA9IDE0IFtkZWZhdWx0ID0gaW5mXTsKKyAgb3B0aW9uYWwgZG91YmxlIG5lZ19pbmZfZG91YmxlID0gMTUgW2RlZmF1bHQgPSAtaW5mXTsKKyAgb3B0aW9uYWwgZG91YmxlIG5hbl9kb3VibGUgPSAxNiBbZGVmYXVsdCA9IG5hbl07CisgIG9wdGlvbmFsIGZsb2F0IGluZl9mbG9hdCA9IDE3IFtkZWZhdWx0ID0gaW5mXTsKKyAgb3B0aW9uYWwgZmxvYXQgbmVnX2luZl9mbG9hdCA9IDE4IFtkZWZhdWx0ID0gLWluZl07CisgIG9wdGlvbmFsIGZsb2F0IG5hbl9mbG9hdCA9IDE5IFtkZWZhdWx0ID0gbmFuXTsKKworICAvLyBUZXN0cyBmb3IgQysrIHRyaWdyYXBocy4KKyAgLy8gVHJpZ3JhcGhzIHNob3VsZCBiZSBlc2NhcGVkIGluIEMrKyBnZW5lcmF0ZWQgZmlsZXMsIGJ1dCB0aGV5IHNob3VsZCBub3QgYmUKKyAgLy8gZXNjYXBlZCBmb3Igb3RoZXIgbGFuZ3VhZ2VzLgorICAvLyBOb3RlIHRoYXQgaW4gLnByb3RvIGZpbGUsICJcPyIgaXMgYSB2YWxpZCB3YXkgdG8gZXNjYXBlID8gaW4gc3RyaW5nCisgIC8vIGxpdGVyYWxzLgorICBvcHRpb25hbCBzdHJpbmcgY3BwX3RyaWdyYXBoID0gMjAgW2RlZmF1bHQgPSAiPyBcPyA/PyBcPz8gXD8/PyA/Py8gP1w/LSJdOworCisgIC8vIFN0cmluZyBkZWZhdWx0cyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXIgJ1wwMDAnCisgIG9wdGlvbmFsIHN0cmluZyBzdHJpbmdfd2l0aF96ZXJvICAgICAgID0gMjMgW2RlZmF1bHQgPSAiaGVsXDAwMGxvIl07CisgIG9wdGlvbmFsICBieXRlcyBieXRlc193aXRoX3plcm8gICAgICAgID0gMjQgW2RlZmF1bHQgPSAid29yXDAwMGxkIl07CisgIG9wdGlvbmFsIHN0cmluZyBzdHJpbmdfcGllY2Vfd2l0aF96ZXJvID0gMjUgW2N0eXBlPVNUUklOR19QSUVDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iYWJcMDAwYyJdOworICBvcHRpb25hbCBzdHJpbmcgY29yZF93aXRoX3plcm8gICAgICAgICA9IDI2IFtjdHlwZT1DT1JELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIxMlwwMDAzIl07CisgIG9wdGlvbmFsIHN0cmluZyByZXBsYWNlbWVudF9zdHJpbmcgICAgID0gMjcgW2RlZmF1bHQ9IiR7dW5rbm93bn0iXTsKK30KKworbWVzc2FnZSBTcGFyc2VFbnVtTWVzc2FnZSB7CisgIG9wdGlvbmFsIFRlc3RTcGFyc2VFbnVtIHNwYXJzZV9lbnVtID0gMTsKK30KKworLy8gVGVzdCBTdHJpbmcgYW5kIEJ5dGVzOiBzdHJpbmcgaXMgZm9yIHZhbGlkIFVURi04IHN0cmluZ3MKK21lc3NhZ2UgT25lU3RyaW5nIHsKKyAgb3B0aW9uYWwgc3RyaW5nIGRhdGEgPSAxOworfQorCittZXNzYWdlIE1vcmVTdHJpbmcgeworICByZXBlYXRlZCBzdHJpbmcgZGF0YSA9IDE7Cit9CisKK21lc3NhZ2UgT25lQnl0ZXMgeworICBvcHRpb25hbCBieXRlcyBkYXRhID0gMTsKK30KKworbWVzc2FnZSBNb3JlQnl0ZXMgeworICByZXBlYXRlZCBieXRlcyBkYXRhID0gMTsKK30KKworbWVzc2FnZSBNYW55T3B0aW9uYWxTdHJpbmcgeworICBvcHRpb25hbCBzdHJpbmcgc3RyMSA9IDE7CisgIG9wdGlvbmFsIHN0cmluZyBzdHIyID0gMjsKKyAgb3B0aW9uYWwgc3RyaW5nIHN0cjMgPSAzOworICBvcHRpb25hbCBzdHJpbmcgc3RyNCA9IDQ7CisgIG9wdGlvbmFsIHN0cmluZyBzdHI1ID0gNTsKKyAgb3B0aW9uYWwgc3RyaW5nIHN0cjYgPSA2OworICBvcHRpb25hbCBzdHJpbmcgc3RyNyA9IDc7CisgIG9wdGlvbmFsIHN0cmluZyBzdHI4ID0gODsKKyAgb3B0aW9uYWwgc3RyaW5nIHN0cjkgPSA5OworICBvcHRpb25hbCBzdHJpbmcgc3RyMTAgPSAxMDsKKyAgb3B0aW9uYWwgc3RyaW5nIHN0cjExID0gMTE7CisgIG9wdGlvbmFsIHN0cmluZyBzdHIxMiA9IDEyOworICBvcHRpb25hbCBzdHJpbmcgc3RyMTMgPSAxMzsKKyAgb3B0aW9uYWwgc3RyaW5nIHN0cjE0ID0gMTQ7CisgIG9wdGlvbmFsIHN0cmluZyBzdHIxNSA9IDE1OworICBvcHRpb25hbCBzdHJpbmcgc3RyMTYgPSAxNjsKKyAgb3B0aW9uYWwgc3RyaW5nIHN0cjE3ID0gMTc7CisgIG9wdGlvbmFsIHN0cmluZyBzdHIxOCA9IDE4OworICBvcHRpb25hbCBzdHJpbmcgc3RyMTkgPSAxOTsKKyAgb3B0aW9uYWwgc3RyaW5nIHN0cjIwID0gMjA7CisgIG9wdGlvbmFsIHN0cmluZyBzdHIyMSA9IDIxOworICBvcHRpb25hbCBzdHJpbmcgc3RyMjIgPSAyMjsKKyAgb3B0aW9uYWwgc3RyaW5nIHN0cjIzID0gMjM7CisgIG9wdGlvbmFsIHN0cmluZyBzdHIyNCA9IDI0OworICBvcHRpb25hbCBzdHJpbmcgc3RyMjUgPSAyNTsKKyAgb3B0aW9uYWwgc3RyaW5nIHN0cjI2ID0gMjY7CisgIG9wdGlvbmFsIHN0cmluZyBzdHIyNyA9IDI3OworICBvcHRpb25hbCBzdHJpbmcgc3RyMjggPSAyODsKKyAgb3B0aW9uYWwgc3RyaW5nIHN0cjI5ID0gMjk7CisgIG9wdGlvbmFsIHN0cmluZyBzdHIzMCA9IDMwOworICBvcHRpb25hbCBzdHJpbmcgc3RyMzEgPSAzMTsKKyAgb3B0aW9uYWwgc3RyaW5nIHN0cjMyID0gMzI7Cit9CisKKy8vIFRlc3QgaW50MzIsIHVpbnQzMiwgaW50NjQsIHVpbnQ2NCwgYW5kIGJvb2wgYXJlIGFsbCBjb21wYXRpYmxlCittZXNzYWdlIEludDMyTWVzc2FnZSB7CisgIG9wdGlvbmFsIGludDMyIGRhdGEgPSAxOworfQorCittZXNzYWdlIFVpbnQzMk1lc3NhZ2UgeworICBvcHRpb25hbCB1aW50MzIgZGF0YSA9IDE7Cit9CisKK21lc3NhZ2UgSW50NjRNZXNzYWdlIHsKKyAgb3B0aW9uYWwgaW50NjQgZGF0YSA9IDE7Cit9CisKK21lc3NhZ2UgVWludDY0TWVzc2FnZSB7CisgIG9wdGlvbmFsIHVpbnQ2NCBkYXRhID0gMTsKK30KKworbWVzc2FnZSBCb29sTWVzc2FnZSB7CisgIG9wdGlvbmFsIGJvb2wgZGF0YSA9IDE7Cit9CisKKy8vIFRlc3Qgb25lb2ZzLgorbWVzc2FnZSBUZXN0T25lb2YgeworICBvbmVvZiBmb28geworICAgIGludDMyIGZvb19pbnQgPSAxOworICAgIHN0cmluZyBmb29fc3RyaW5nID0gMjsKKyAgICBUZXN0QWxsVHlwZXMgZm9vX21lc3NhZ2UgPSAzOworICAgIGdyb3VwIEZvb0dyb3VwID0gNCB7CisgICAgICBvcHRpb25hbCBpbnQzMiBhID0gNTsKKyAgICAgIG9wdGlvbmFsIHN0cmluZyBiID0gNjsKKyAgICB9CisgIH0KK30KKworbWVzc2FnZSBUZXN0T25lb2ZCYWNrd2FyZHNDb21wYXRpYmxlIHsKKyAgb3B0aW9uYWwgaW50MzIgZm9vX2ludCA9IDE7CisgIG9wdGlvbmFsIHN0cmluZyBmb29fc3RyaW5nID0gMjsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIGZvb19tZXNzYWdlID0gMzsKKyAgb3B0aW9uYWwgZ3JvdXAgRm9vR3JvdXAgPSA0IHsKKyAgICBvcHRpb25hbCBpbnQzMiBhID0gNTsKKyAgICBvcHRpb25hbCBzdHJpbmcgYiA9IDY7CisgIH0KK30KKworbWVzc2FnZSBUZXN0T25lb2YyIHsKKyAgb25lb2YgZm9vIHsKKyAgICBpbnQzMiBmb29faW50ID0gMTsKKyAgICBzdHJpbmcgZm9vX3N0cmluZyA9IDI7CisgICAgc3RyaW5nIGZvb19jb3JkID0gMyBbY3R5cGU9Q09SRF07CisgICAgc3RyaW5nIGZvb19zdHJpbmdfcGllY2UgPSA0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICAgIGJ5dGVzIGZvb19ieXRlcyA9IDU7CisgICAgTmVzdGVkRW51bSBmb29fZW51bSA9IDY7CisgICAgTmVzdGVkTWVzc2FnZSBmb29fbWVzc2FnZSA9IDc7CisgICAgZ3JvdXAgRm9vR3JvdXAgPSA4IHsKKyAgICAgIG9wdGlvbmFsIGludDMyIGEgPSA5OworICAgICAgb3B0aW9uYWwgc3RyaW5nIGIgPSAxMDsKKyAgICB9CisgICAgTmVzdGVkTWVzc2FnZSBmb29fbGF6eV9tZXNzYWdlID0gMTEgW2xhenk9dHJ1ZV07CisgIH0KKworICBvbmVvZiBiYXIgeworICAgIGludDMyIGJhcl9pbnQgPSAxMiBbZGVmYXVsdCA9IDVdOworICAgIHN0cmluZyBiYXJfc3RyaW5nID0gMTMgW2RlZmF1bHQgPSAiU1RSSU5HIl07CisgICAgc3RyaW5nIGJhcl9jb3JkID0gMTQgW2N0eXBlPUNPUkQsIGRlZmF1bHQgPSAiQ09SRCJdOworICAgIHN0cmluZyBiYXJfc3RyaW5nX3BpZWNlID0gMTUgW2N0eXBlPVNUUklOR19QSUVDRSwgZGVmYXVsdCA9ICJTUElFQ0UiXTsKKyAgICBieXRlcyBiYXJfYnl0ZXMgPSAxNiBbZGVmYXVsdCA9ICJCWVRFUyJdOworICAgIE5lc3RlZEVudW0gYmFyX2VudW0gPSAxNyBbZGVmYXVsdCA9IEJBUl07CisgICAgc3RyaW5nIGJhcl9zdHJpbmdfd2l0aF9lbXB0eV9kZWZhdWx0ID0gMjAgW2RlZmF1bHQgPSAiIl07CisgICAgc3RyaW5nIGJhcl9jb3JkX3dpdGhfZW1wdHlfZGVmYXVsdCA9IDIxIFtjdHlwZT1DT1JELCBkZWZhdWx0ID0gIiJdOworICAgIHN0cmluZyBiYXJfc3RyaW5nX3BpZWNlX3dpdGhfZW1wdHlfZGVmYXVsdCA9IDIyIFtjdHlwZT1TVFJJTkdfUElFQ0UsIGRlZmF1bHQgPSAiIl07CisgICAgYnl0ZXMgYmFyX2J5dGVzX3dpdGhfZW1wdHlfZGVmYXVsdCA9IDIzIFtkZWZhdWx0ID0gIiJdOworICB9CisKKyAgb3B0aW9uYWwgaW50MzIgYmF6X2ludCA9IDE4OworICBvcHRpb25hbCBzdHJpbmcgYmF6X3N0cmluZyA9IDE5IFtkZWZhdWx0ID0gIkJBWiJdOworCisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgb3B0aW9uYWwgaW50NjQgbW9vX2ludCA9IDE7CisgICAgcmVwZWF0ZWQgaW50MzIgY29yZ2VfaW50ID0gMjsKKyAgfQorCisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgRk9PID0gMTsKKyAgICBCQVIgPSAyOworICAgIEJBWiA9IDM7CisgIH0KK30KKworbWVzc2FnZSBUZXN0UmVxdWlyZWRPbmVvZiB7CisgIG9uZW9mIGZvbyB7CisgICAgaW50MzIgZm9vX2ludCA9IDE7CisgICAgc3RyaW5nIGZvb19zdHJpbmcgPSAyOworICAgIE5lc3RlZE1lc3NhZ2UgZm9vX21lc3NhZ2UgPSAzOworICB9CisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgcmVxdWlyZWQgZG91YmxlIHJlcXVpcmVkX2RvdWJsZSA9IDE7CisgIH0KK30KKworCisvLyBUZXN0IG1lc3NhZ2VzIGZvciBwYWNrZWQgZmllbGRzCisKK21lc3NhZ2UgVGVzdFBhY2tlZFR5cGVzIHsKKyAgcmVwZWF0ZWQgICAgaW50MzIgcGFja2VkX2ludDMyICAgID0gIDkwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgaW50NjQgcGFja2VkX2ludDY0ICAgID0gIDkxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICB1aW50MzIgcGFja2VkX3VpbnQzMiAgID0gIDkyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICB1aW50NjQgcGFja2VkX3VpbnQ2NCAgID0gIDkzIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBzaW50MzIgcGFja2VkX3NpbnQzMiAgID0gIDk0IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBzaW50NjQgcGFja2VkX3NpbnQ2NCAgID0gIDk1IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgIGZpeGVkMzIgcGFja2VkX2ZpeGVkMzIgID0gIDk2IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgIGZpeGVkNjQgcGFja2VkX2ZpeGVkNjQgID0gIDk3IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcGFja2VkX3NmaXhlZDMyID0gIDk4IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgcGFja2VkX3NmaXhlZDY0ID0gIDk5IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgZmxvYXQgcGFja2VkX2Zsb2F0ICAgID0gMTAwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBkb3VibGUgcGFja2VkX2RvdWJsZSAgID0gMTAxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgIGJvb2wgcGFja2VkX2Jvb2wgICAgID0gMTAyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gcGFja2VkX2VudW0gID0gMTAzIFtwYWNrZWQgPSB0cnVlXTsKK30KKworLy8gQSBtZXNzYWdlIHdpdGggdGhlIHNhbWUgZmllbGRzIGFzIFRlc3RQYWNrZWRUeXBlcywgYnV0IHdpdGhvdXQgcGFja2luZy4gVXNlZAorLy8gdG8gdGVzdCBwYWNrZWQgPC0+IHVucGFja2VkIHdpcmUgY29tcGF0aWJpbGl0eS4KK21lc3NhZ2UgVGVzdFVucGFja2VkVHlwZXMgeworICByZXBlYXRlZCAgICBpbnQzMiB1bnBhY2tlZF9pbnQzMiAgICA9ICA5MCBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgICBpbnQ2NCB1bnBhY2tlZF9pbnQ2NCAgICA9ICA5MSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgIHVpbnQzMiB1bnBhY2tlZF91aW50MzIgICA9ICA5MiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgIHVpbnQ2NCB1bnBhY2tlZF91aW50NjQgICA9ICA5MyBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgIHNpbnQzMiB1bnBhY2tlZF9zaW50MzIgICA9ICA5NCBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgIHNpbnQ2NCB1bnBhY2tlZF9zaW50NjQgICA9ICA5NSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgZml4ZWQzMiB1bnBhY2tlZF9maXhlZDMyICA9ICA5NiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgZml4ZWQ2NCB1bnBhY2tlZF9maXhlZDY0ICA9ICA5NyBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBzZml4ZWQzMiB1bnBhY2tlZF9zZml4ZWQzMiA9ICA5OCBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBzZml4ZWQ2NCB1bnBhY2tlZF9zZml4ZWQ2NCA9ICA5OSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgICBmbG9hdCB1bnBhY2tlZF9mbG9hdCAgICA9IDEwMCBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgIGRvdWJsZSB1bnBhY2tlZF9kb3VibGUgICA9IDEwMSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgICAgYm9vbCB1bnBhY2tlZF9ib29sICAgICA9IDEwMiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBGb3JlaWduRW51bSB1bnBhY2tlZF9lbnVtICA9IDEwMyBbcGFja2VkID0gZmFsc2VdOworfQorCittZXNzYWdlIFRlc3RQYWNrZWRFeHRlbnNpb25zIHsKKyAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKK30KKworZXh0ZW5kIFRlc3RQYWNrZWRFeHRlbnNpb25zIHsKKyAgcmVwZWF0ZWQgICAgaW50MzIgcGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICA9ICA5MCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgIGludDY0IHBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICAgPSAgOTEgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHVpbnQzMiBwYWNrZWRfdWludDMyX2V4dGVuc2lvbiAgID0gIDkyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICB1aW50NjQgcGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICA9ICA5MyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgc2ludDMyIHBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICAgPSAgOTQgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHNpbnQ2NCBwYWNrZWRfc2ludDY0X2V4dGVuc2lvbiAgID0gIDk1IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgIGZpeGVkMzIgcGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICA9ICA5NiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICBmaXhlZDY0IHBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiAgPSAgOTcgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQzMiBwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uID0gIDk4IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgcGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiA9ICA5OSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgIGZsb2F0IHBhY2tlZF9mbG9hdF9leHRlbnNpb24gICAgPSAxMDAgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIGRvdWJsZSBwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgID0gMTAxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgIGJvb2wgcGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICA9IDEwMiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtIHBhY2tlZF9lbnVtX2V4dGVuc2lvbiAgPSAxMDMgW3BhY2tlZCA9IHRydWVdOworfQorCittZXNzYWdlIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgeworICBleHRlbnNpb25zIDEgdG8gbWF4OworfQorCitleHRlbmQgVGVzdFVucGFja2VkRXh0ZW5zaW9ucyB7CisgIHJlcGVhdGVkICAgIGludDMyIHVucGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICA9ICA5MCBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgICBpbnQ2NCB1bnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICAgPSAgOTEgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICB1aW50MzIgdW5wYWNrZWRfdWludDMyX2V4dGVuc2lvbiAgID0gIDkyIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgdWludDY0IHVucGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICA9ICA5MyBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgIHNpbnQzMiB1bnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICAgPSAgOTQgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICBzaW50NjQgdW5wYWNrZWRfc2ludDY0X2V4dGVuc2lvbiAgID0gIDk1IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICBmaXhlZDMyIHVucGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICA9ICA5NiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgZml4ZWQ2NCB1bnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiAgPSAgOTcgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgdW5wYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uID0gIDk4IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHVucGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiA9ICA5OSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgICBmbG9hdCB1bnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICAgPSAxMDAgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICBkb3VibGUgdW5wYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgID0gMTAxIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgICBib29sIHVucGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICA9IDEwMiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBGb3JlaWduRW51bSB1bnBhY2tlZF9lbnVtX2V4dGVuc2lvbiAgPSAxMDMgW3BhY2tlZCA9IGZhbHNlXTsKK30KKworLy8gVXNlZCBieSBFeHRlbnNpb25TZXRUZXN0L0R5bmFtaWNFeHRlbnNpb25zLiAgVGhlIHRlc3QgYWN0dWFsbHkgYnVpbGRzCisvLyBhIHNldCBvZiBleHRlbnNpb25zIHRvIFRlc3RBbGxFeHRlbnNpb25zIGR5bmFtaWNhbGx5LCBiYXNlZCBvbiB0aGUgZmllbGRzCisvLyBvZiB0aGlzIG1lc3NhZ2UgdHlwZS4KK21lc3NhZ2UgVGVzdER5bmFtaWNFeHRlbnNpb25zIHsKKyAgZW51bSBEeW5hbWljRW51bVR5cGUgeworICAgIERZTkFNSUNfRk9PID0gMjIwMDsKKyAgICBEWU5BTUlDX0JBUiA9IDIyMDE7CisgICAgRFlOQU1JQ19CQVogPSAyMjAyOworICB9CisgIG1lc3NhZ2UgRHluYW1pY01lc3NhZ2VUeXBlIHsKKyAgICBvcHRpb25hbCBpbnQzMiBkeW5hbWljX2ZpZWxkID0gMjEwMDsKKyAgfQorCisgIG9wdGlvbmFsIGZpeGVkMzIgc2NhbGFyX2V4dGVuc2lvbiA9IDIwMDA7CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtIGVudW1fZXh0ZW5zaW9uID0gMjAwMTsKKyAgb3B0aW9uYWwgRHluYW1pY0VudW1UeXBlIGR5bmFtaWNfZW51bV9leHRlbnNpb24gPSAyMDAyOworCisgIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlIG1lc3NhZ2VfZXh0ZW5zaW9uID0gMjAwMzsKKyAgb3B0aW9uYWwgRHluYW1pY01lc3NhZ2VUeXBlIGR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24gPSAyMDA0OworCisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9leHRlbnNpb24gPSAyMDA1OworICByZXBlYXRlZCBzaW50MzIgcGFja2VkX2V4dGVuc2lvbiA9IDIwMDYgW3BhY2tlZCA9IHRydWVdOworfQorCittZXNzYWdlIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIHsKKyAgLy8gUGFyc2luZyByZXBlYXRlZCBmaXhlZCBzaXplIHZhbHVlcyB1c2VkIHRvIGZhaWwuIFRoaXMgbWVzc2FnZSBuZWVkcyB0byBiZQorICAvLyB1c2VkIGluIG9yZGVyIHRvIGdldCBhIHRhZyBvZiB0aGUgcmlnaHQgc2l6ZTsgYWxsIG9mIHRoZSByZXBlYXRlZCBmaWVsZHMKKyAgLy8gaW4gVGVzdEFsbFR5cGVzIGRpZG4ndCB0cmlnZ2VyIHRoZSBjaGVjay4KKyAgcmVwZWF0ZWQgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyID0gMTI7CisgIC8vIENoZWNrIGZvciBhIHZhcmludCB0eXBlLCBqdXN0IGZvciBnb29kIG1lYXN1cmUuCisgIHJlcGVhdGVkIGludDMyICAgcmVwZWF0ZWRfaW50MzIgICA9IDEzOworCisgIC8vIFRoZXNlIGhhdmUgdHdvLWJ5dGUgdGFncy4KKyAgcmVwZWF0ZWQgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ID0gMjA0NjsKKyAgcmVwZWF0ZWQgaW50NjQgICByZXBlYXRlZF9pbnQ2NCAgID0gMjA0NzsKKworICAvLyBUaHJlZSBieXRlIHRhZ3MuCisgIHJlcGVhdGVkIGZsb2F0ICAgcmVwZWF0ZWRfZmxvYXQgICA9IDI2MjE0MjsKKyAgcmVwZWF0ZWQgdWludDY0ICByZXBlYXRlZF91aW50NjQgID0gMjYyMTQzOworfQorCisvLyBUZXN0IHRoYXQgaWYgYW4gb3B0aW9uYWwgb3IgcmVxdWlyZWQgbWVzc2FnZS9ncm91cCBmaWVsZCBhcHBlYXJzIG11bHRpcGxlCisvLyB0aW1lcyBpbiB0aGUgaW5wdXQsIHRoZXkgbmVlZCB0byBiZSBtZXJnZWQuCittZXNzYWdlIFRlc3RQYXJzaW5nTWVyZ2UgeworICAvLyBSZXBlYXRlZEZpZWxkc0dlbmVyYXRvciBkZWZpbmVzIG1hdGNoaW5nIGZpZWxkIHR5cGVzIGFzIFRlc3RQYXJzaW5nTWVyZ2UsCisgIC8vIGV4Y2VwdCB0aGF0IGFsbCBmaWVsZHMgYXJlIHJlcGVhdGVkLiBJbiB0aGUgdGVzdHMsIHdlIHdpbGwgc2VyaWFsaXplIHRoZQorICAvLyBSZXBlYXRlZEZpZWxkc0dlbmVyYXRvciB0byBieXRlcywgYW5kIHBhcnNlIHRoZSBieXRlcyB0byBUZXN0UGFyc2luZ01lcmdlLgorICAvLyBSZXBlYXRlZCBmaWVsZHMgaW4gUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IgYXJlIGV4cGVjdGVkIHRvIGJlIG1lcmdlZCBpbnRvCisgIC8vIHRoZSBjb3JyZXNwb25kaW5nIHJlcXVpcmVkL29wdGlvbmFsIGZpZWxkcyBpbiBUZXN0UGFyc2luZ01lcmdlLgorICBtZXNzYWdlIFJlcGVhdGVkRmllbGRzR2VuZXJhdG9yIHsKKyAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgZmllbGQxID0gMTsKKyAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgZmllbGQyID0gMjsKKyAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgZmllbGQzID0gMzsKKyAgICByZXBlYXRlZCBncm91cCBHcm91cDEgPSAxMCB7CisgICAgICBvcHRpb25hbCBUZXN0QWxsVHlwZXMgZmllbGQxID0gMTE7CisgICAgfQorICAgIHJlcGVhdGVkIGdyb3VwIEdyb3VwMiA9IDIwIHsKKyAgICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBmaWVsZDEgPSAyMTsKKyAgICB9CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzIGV4dDEgPSAxMDAwOworICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcyBleHQyID0gMTAwMTsKKyAgfQorICByZXF1aXJlZCBUZXN0QWxsVHlwZXMgcmVxdWlyZWRfYWxsX3R5cGVzID0gMTsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIG9wdGlvbmFsX2FsbF90eXBlcyA9IDI7CisgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcyByZXBlYXRlZF9hbGxfdHlwZXMgPSAzOworICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwID0gMTAgeworICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBvcHRpb25hbF9ncm91cF9hbGxfdHlwZXMgPSAxMTsKKyAgfQorICByZXBlYXRlZCBncm91cCBSZXBlYXRlZEdyb3VwID0gMjAgeworICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyByZXBlYXRlZF9ncm91cF9hbGxfdHlwZXMgPSAyMTsKKyAgfQorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworICBleHRlbmQgVGVzdFBhcnNpbmdNZXJnZSB7CisgICAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIG9wdGlvbmFsX2V4dCA9IDEwMDA7CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzIHJlcGVhdGVkX2V4dCA9IDEwMDE7CisgIH0KK30KKworLy8gVGVzdCB0aGF0IHRoZSBjb3JyZWN0IGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgcGFyc2VGcm9tIGluIGEgY29ybmVyIGNhc2UKKy8vIGludm9sdmluZyBtZXJnaW5nLCBleHRlbnNpb25zLCBhbmQgcmVxdWlyZWQgZmllbGRzLgorbWVzc2FnZSBUZXN0TWVyZ2VFeGNlcHRpb24geworICBvcHRpb25hbCBUZXN0QWxsRXh0ZW5zaW9ucyBhbGxfZXh0ZW5zaW9ucyA9IDE7Cit9CisKK21lc3NhZ2UgVGVzdENvbW1lbnRJbmplY3Rpb25NZXNzYWdlIHsKKyAgLy8gKi8gPC0gVGhpcyBzaG91bGQgbm90IGNsb3NlIHRoZSBnZW5lcmF0ZWQgZG9jIGNvbW1lbnQKKyAgb3B0aW9uYWwgc3RyaW5nIGEgPSAxIFtkZWZhdWx0PSIqLyA8LSBOZWl0aGVyIHNob3VsZCB0aGlzLiJdOworfQorCisvLyBVc2VkIHRvIGNoZWNrIHRoYXQgdGhlIGMrKyBjb2RlIGdlbmVyYXRvciByZS1vcmRlcnMgbWVzc2FnZXMgdG8gcmVkdWNlCisvLyBwYWRkaW5nLgorbWVzc2FnZSBUZXN0TWVzc2FnZVNpemUgeworICBvcHRpb25hbCBib29sIG0xID0gMTsKKyAgb3B0aW9uYWwgaW50NjQgbTIgPSAyOworICBvcHRpb25hbCBib29sIG0zID0gMzsKKyAgb3B0aW9uYWwgc3RyaW5nIG00ID0gNDsKKyAgb3B0aW9uYWwgaW50MzIgbTUgPSA1OworICBvcHRpb25hbCBpbnQ2NCBtNiA9IDY7Cit9CisKKworLy8gVGVzdCB0aGF0IFJQQyBzZXJ2aWNlcyB3b3JrLgorbWVzc2FnZSBGb29SZXF1ZXN0ICB7fQorbWVzc2FnZSBGb29SZXNwb25zZSB7fQorCittZXNzYWdlIEZvb0NsaWVudE1lc3NhZ2Uge30KK21lc3NhZ2UgRm9vU2VydmVyTWVzc2FnZXt9CisKK3NlcnZpY2UgVGVzdFNlcnZpY2UgeworICBycGMgRm9vKEZvb1JlcXVlc3QpIHJldHVybnMgKEZvb1Jlc3BvbnNlKTsKKyAgcnBjIEJhcihCYXJSZXF1ZXN0KSByZXR1cm5zIChCYXJSZXNwb25zZSk7Cit9CisKKworbWVzc2FnZSBCYXJSZXF1ZXN0ICB7fQorbWVzc2FnZSBCYXJSZXNwb25zZSB7fQorCittZXNzYWdlIFRlc3RKc29uTmFtZSB7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkX25hbWUxID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgZmllbGROYW1lMiA9IDI7CisgIG9wdGlvbmFsIGludDMyIEZpZWxkTmFtZTMgPSAzOworICBvcHRpb25hbCBpbnQzMiBfZmllbGRfbmFtZTQgPSA0OworICBvcHRpb25hbCBpbnQzMiBGSUVMRF9OQU1FNSA9IDU7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkX25hbWU2ID0gNiBbanNvbl9uYW1lID0gIkB0eXBlIl07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkbmFtZTcgPSA3OworfQorCittZXNzYWdlIFRlc3RIdWdlRmllbGROdW1iZXJzIHsKKyAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzIgPSA1MzY4NzAwMDA7CisgIG9wdGlvbmFsIGludDMyIGZpeGVkXzMyID0gNTM2ODcwMDAxOworICByZXBlYXRlZCBpbnQzMiByZXBlYXRlZF9pbnQzMiA9IDUzNjg3MDAwMiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBpbnQzMiBwYWNrZWRfaW50MzIgPSA1MzY4NzAwMDMgW3BhY2tlZCA9IHRydWVdOworCisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtIG9wdGlvbmFsX2VudW0gPSA1MzY4NzAwMDQ7CisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9zdHJpbmcgPSA1MzY4NzAwMDU7CisgIG9wdGlvbmFsIGJ5dGVzIG9wdGlvbmFsX2J5dGVzID0gNTM2ODcwMDA2OworICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSBvcHRpb25hbF9tZXNzYWdlID0gNTM2ODcwMDA3OworCisgIG9wdGlvbmFsIGdyb3VwIE9wdGlvbmFsR3JvdXAgPSA1MzY4NzAwMDggeworICAgIG9wdGlvbmFsIGludDMyIGdyb3VwX2EgPSA1MzY4NzAwMDk7CisgIH0KKworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHN0cmluZ19zdHJpbmdfbWFwID0gNTM2ODcwMDEwOworCisgIG9uZW9mIG9uZW9mX2ZpZWxkIHsKKyAgICB1aW50MzIgb25lb2ZfdWludDMyID0gNTM2ODcwMDExOworICAgIFRlc3RBbGxUeXBlcyBvbmVvZl90ZXN0X2FsbF90eXBlcyA9IDUzNjg3MDAxMjsKKyAgICBzdHJpbmcgb25lb2Zfc3RyaW5nID0gNTM2ODcwMDEzOworICAgIGJ5dGVzIG9uZW9mX2J5dGVzID0gNTM2ODcwMDE0OworICB9CisKKyAgZXh0ZW5zaW9ucyAgNTM2ODYwMDAwIHRvIDUzNjg2OTk5OTsKK30KKworZXh0ZW5kIFRlc3RIdWdlRmllbGROdW1iZXJzIHsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIHRlc3RfYWxsX3R5cGVzID0gNTM2ODYwMDAwOworfQorCittZXNzYWdlIFRlc3RFeHRlbnNpb25JbnNpZGVUYWJsZSB7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMSA9IDE7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMiA9IDI7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkMyA9IDM7CisgIG9wdGlvbmFsIGludDMyIGZpZWxkNCA9IDQ7CisgIGV4dGVuc2lvbnMgNSB0byA1OworICBvcHRpb25hbCBpbnQzMiBmaWVsZDYgPSA2OworICBvcHRpb25hbCBpbnQzMiBmaWVsZDcgPSA3OworICBvcHRpb25hbCBpbnQzMiBmaWVsZDggPSA4OworICBvcHRpb25hbCBpbnQzMiBmaWVsZDkgPSA5OworICBvcHRpb25hbCBpbnQzMiBmaWVsZDEwID0gMTA7Cit9CisKK2V4dGVuZCBUZXN0RXh0ZW5zaW9uSW5zaWRlVGFibGUgeworICBvcHRpb25hbCBpbnQzMiB0ZXN0X2V4dGVuc2lvbl9pbnNpZGVfdGFibGVfZXh0ZW5zaW9uID0gNTsKK30KKworLy8gTk9URShiLzIwMjk5NjU0NCk6IEludGVudGlvbmFsbHkgbmVzdGVkIHRvIG1pcnJvciBnby9nbGVwLgorbWVzc2FnZSBUZXN0TmVzdGVkR3JvdXBFeHRlbnNpb25PdXRlciB7CisgIG9wdGlvbmFsIGdyb3VwIExheWVyMU9wdGlvbmFsR3JvdXAgPSAxIHsKKyAgICByZXBlYXRlZCBncm91cCBMYXllcjJSZXBlYXRlZEdyb3VwID0gMiB7CisgICAgICBleHRlbnNpb25zIDMKKyAgICAgICAgLy8gTk9URTogZXh0ZW5zaW9uIG1ldGFkYXRhIGlzIG5vdCBzdXBwb3J0ZWQgZHVlIHRvIHRhcmdldHMgc3VjaCBhcworICAgICAgICAvLyBgLy90aGlyZF9wYXJ0eS9wcm90b2J1Zl9sZWdhY3lfb3BlbnNvdXJjZS9zcmM6c2hlbGxfc2NyaXB0c190ZXN0YCwKKyAgICAgICAgLy8gZWVlIGh0dHBzOi8vc2NyZWVuc2hvdC5nb29nbGVwbGV4LmNvbS9BeHoyUUQ4bnhqZHB5RkYKKyAgICAgICAgLy9bbWV0YWRhdGEgPSB7CisgICAgICAgIC8vIE5PVEU6IGNhbid0IHdyaXRlIHR5cGUgdGhlcmUgZHVlIHRvIHNvbWUgY2xldmVyIGJ1aWxkIGdlbiBjb2RlIGF0CisgICAgICAgIC8vIGh0dHA6Ly9nb29nbGUzL25ldC9wcm90bzIvaW50ZXJuYWwvQlVJTEQ7bD0xMjQ3O3JjbD00MTEwOTA4NjIKKyAgICAgICAgLy8gdHlwZTogInByb3RvYnVmX3VuaXR0ZXN0LlRlc3ROZXN0ZWRHcm91cEV4dGVuc2lvbklubmVyRXh0ZW5zaW9uIiwKKyAgICAgICAgLy8gbmFtZTogImlubmVyIiwKKyAgICAgICAgLy8gfV0KKyAgICAgICAgOworICAgICAgb3B0aW9uYWwgc3RyaW5nIGFub3RoZXJfZmllbGQgPSA2OworICAgIH0KKyAgICByZXBlYXRlZCBncm91cCBMYXllcjJBbm90aGVyT3B0aW9uYWxSZXBlYXRlZEdyb3VwID0gNCB7CisgICAgICBvcHRpb25hbCBzdHJpbmcgYnV0X3doeV90aG8gPSA1OworICAgIH0KKyAgfQorfQorCittZXNzYWdlIFRlc3ROZXN0ZWRHcm91cEV4dGVuc2lvbklubmVyRXh0ZW5zaW9uIHsKKyAgb3B0aW9uYWwgc3RyaW5nIGlubmVyX25hbWU9IDE7Cit9CisKK2V4dGVuZCBUZXN0TmVzdGVkR3JvdXBFeHRlbnNpb25PdXRlci5MYXllcjFPcHRpb25hbEdyb3VwLkxheWVyMlJlcGVhdGVkR3JvdXAgeworICBvcHRpb25hbCBUZXN0TmVzdGVkR3JvdXBFeHRlbnNpb25Jbm5lckV4dGVuc2lvbiBpbm5lciA9IDM7Cit9CisKK2VudW0gVmVyeUxhcmdlRW51bSB7CisgIEVOVU1fTEFCRUxfREVGQVVMVCA9IDA7CisgIEVOVU1fTEFCRUxfMSA9IDE7CisgIEVOVU1fTEFCRUxfMiA9IDI7CisgIEVOVU1fTEFCRUxfMyA9IDM7CisgIEVOVU1fTEFCRUxfNCA9IDQ7CisgIEVOVU1fTEFCRUxfNSA9IDU7CisgIEVOVU1fTEFCRUxfNiA9IDY7CisgIEVOVU1fTEFCRUxfNyA9IDc7CisgIEVOVU1fTEFCRUxfOCA9IDg7CisgIEVOVU1fTEFCRUxfOSA9IDk7CisgIEVOVU1fTEFCRUxfMTAgPSAxMDsKKyAgRU5VTV9MQUJFTF8xMSA9IDExOworICBFTlVNX0xBQkVMXzEyID0gMTI7CisgIEVOVU1fTEFCRUxfMTMgPSAxMzsKKyAgRU5VTV9MQUJFTF8xNCA9IDE0OworICBFTlVNX0xBQkVMXzE1ID0gMTU7CisgIEVOVU1fTEFCRUxfMTYgPSAxNjsKKyAgRU5VTV9MQUJFTF8xNyA9IDE3OworICBFTlVNX0xBQkVMXzE4ID0gMTg7CisgIEVOVU1fTEFCRUxfMTkgPSAxOTsKKyAgRU5VTV9MQUJFTF8yMCA9IDIwOworICBFTlVNX0xBQkVMXzIxID0gMjE7CisgIEVOVU1fTEFCRUxfMjIgPSAyMjsKKyAgRU5VTV9MQUJFTF8yMyA9IDIzOworICBFTlVNX0xBQkVMXzI0ID0gMjQ7CisgIEVOVU1fTEFCRUxfMjUgPSAyNTsKKyAgRU5VTV9MQUJFTF8yNiA9IDI2OworICBFTlVNX0xBQkVMXzI3ID0gMjc7CisgIEVOVU1fTEFCRUxfMjggPSAyODsKKyAgRU5VTV9MQUJFTF8yOSA9IDI5OworICBFTlVNX0xBQkVMXzMwID0gMzA7CisgIEVOVU1fTEFCRUxfMzEgPSAzMTsKKyAgRU5VTV9MQUJFTF8zMiA9IDMyOworICBFTlVNX0xBQkVMXzMzID0gMzM7CisgIEVOVU1fTEFCRUxfMzQgPSAzNDsKKyAgRU5VTV9MQUJFTF8zNSA9IDM1OworICBFTlVNX0xBQkVMXzM2ID0gMzY7CisgIEVOVU1fTEFCRUxfMzcgPSAzNzsKKyAgRU5VTV9MQUJFTF8zOCA9IDM4OworICBFTlVNX0xBQkVMXzM5ID0gMzk7CisgIEVOVU1fTEFCRUxfNDAgPSA0MDsKKyAgRU5VTV9MQUJFTF80MSA9IDQxOworICBFTlVNX0xBQkVMXzQyID0gNDI7CisgIEVOVU1fTEFCRUxfNDMgPSA0MzsKKyAgRU5VTV9MQUJFTF80NCA9IDQ0OworICBFTlVNX0xBQkVMXzQ1ID0gNDU7CisgIEVOVU1fTEFCRUxfNDYgPSA0NjsKKyAgRU5VTV9MQUJFTF80NyA9IDQ3OworICBFTlVNX0xBQkVMXzQ4ID0gNDg7CisgIEVOVU1fTEFCRUxfNDkgPSA0OTsKKyAgRU5VTV9MQUJFTF81MCA9IDUwOworICBFTlVNX0xBQkVMXzUxID0gNTE7CisgIEVOVU1fTEFCRUxfNTIgPSA1MjsKKyAgRU5VTV9MQUJFTF81MyA9IDUzOworICBFTlVNX0xBQkVMXzU0ID0gNTQ7CisgIEVOVU1fTEFCRUxfNTUgPSA1NTsKKyAgRU5VTV9MQUJFTF81NiA9IDU2OworICBFTlVNX0xBQkVMXzU3ID0gNTc7CisgIEVOVU1fTEFCRUxfNTggPSA1ODsKKyAgRU5VTV9MQUJFTF81OSA9IDU5OworICBFTlVNX0xBQkVMXzYwID0gNjA7CisgIEVOVU1fTEFCRUxfNjEgPSA2MTsKKyAgRU5VTV9MQUJFTF82MiA9IDYyOworICBFTlVNX0xBQkVMXzYzID0gNjM7CisgIEVOVU1fTEFCRUxfNjQgPSA2NDsKKyAgRU5VTV9MQUJFTF82NSA9IDY1OworICBFTlVNX0xBQkVMXzY2ID0gNjY7CisgIEVOVU1fTEFCRUxfNjcgPSA2NzsKKyAgRU5VTV9MQUJFTF82OCA9IDY4OworICBFTlVNX0xBQkVMXzY5ID0gNjk7CisgIEVOVU1fTEFCRUxfNzAgPSA3MDsKKyAgRU5VTV9MQUJFTF83MSA9IDcxOworICBFTlVNX0xBQkVMXzcyID0gNzI7CisgIEVOVU1fTEFCRUxfNzMgPSA3MzsKKyAgRU5VTV9MQUJFTF83NCA9IDc0OworICBFTlVNX0xBQkVMXzc1ID0gNzU7CisgIEVOVU1fTEFCRUxfNzYgPSA3NjsKKyAgRU5VTV9MQUJFTF83NyA9IDc3OworICBFTlVNX0xBQkVMXzc4ID0gNzg7CisgIEVOVU1fTEFCRUxfNzkgPSA3OTsKKyAgRU5VTV9MQUJFTF84MCA9IDgwOworICBFTlVNX0xBQkVMXzgxID0gODE7CisgIEVOVU1fTEFCRUxfODIgPSA4MjsKKyAgRU5VTV9MQUJFTF84MyA9IDgzOworICBFTlVNX0xBQkVMXzg0ID0gODQ7CisgIEVOVU1fTEFCRUxfODUgPSA4NTsKKyAgRU5VTV9MQUJFTF84NiA9IDg2OworICBFTlVNX0xBQkVMXzg3ID0gODc7CisgIEVOVU1fTEFCRUxfODggPSA4ODsKKyAgRU5VTV9MQUJFTF84OSA9IDg5OworICBFTlVNX0xBQkVMXzkwID0gOTA7CisgIEVOVU1fTEFCRUxfOTEgPSA5MTsKKyAgRU5VTV9MQUJFTF85MiA9IDkyOworICBFTlVNX0xBQkVMXzkzID0gOTM7CisgIEVOVU1fTEFCRUxfOTQgPSA5NDsKKyAgRU5VTV9MQUJFTF85NSA9IDk1OworICBFTlVNX0xBQkVMXzk2ID0gOTY7CisgIEVOVU1fTEFCRUxfOTcgPSA5NzsKKyAgRU5VTV9MQUJFTF85OCA9IDk4OworICBFTlVNX0xBQkVMXzk5ID0gOTk7CisgIEVOVU1fTEFCRUxfMTAwID0gMTAwOworfTsKKworbWVzc2FnZSBUZXN0RXh0ZW5zaW9uUmFuZ2VTZXJpYWxpemUgeworICBvcHRpb25hbCBpbnQzMiBmb29fb25lID0gMTsKKworICBleHRlbnNpb25zIDIgdG8gMjsKKyAgZXh0ZW5zaW9ucyAzIHRvIDQ7CisKKyAgb3B0aW9uYWwgaW50MzIgZm9vX3R3byA9IDY7CisgIG9wdGlvbmFsIGludDMyIGZvb190aHJlZSA9IDc7CisKKyAgZXh0ZW5zaW9ucyA5IHRvIDEwOworCisgIG9wdGlvbmFsIGludDMyIGZvb19mb3VyID0gMTM7CisKKyAgZXh0ZW5zaW9ucyAxNSB0byAxNTsKKyAgZXh0ZW5zaW9ucyAxNyB0byAxNzsKKyAgZXh0ZW5zaW9ucyAxOSB0byAxOTsKKworICBleHRlbmQgVGVzdEV4dGVuc2lvblJhbmdlU2VyaWFsaXplIHsKKyAgICBvcHRpb25hbCBpbnQzMiBiYXJfb25lID0gMjsKKyAgICBvcHRpb25hbCBpbnQzMiBiYXJfdHdvID0gNDsKKworICAgIG9wdGlvbmFsIGludDMyIGJhcl90aHJlZSA9IDEwOworCisgICAgb3B0aW9uYWwgaW50MzIgYmFyX2ZvdXIgPSAxNTsKKyAgICBvcHRpb25hbCBpbnQzMiBiYXJfZml2ZSA9IDE5OworICB9Cit9CisKK21lc3NhZ2UgVGVzdFZlcmlmeUludDMyU2ltcGxlIHsKKyAgICBvcHRpb25hbCBpbnQzMiBvcHRpb25hbF9pbnQzMl8xID0gMTsKKyAgICBvcHRpb25hbCBpbnQzMiBvcHRpb25hbF9pbnQzMl8yID0gMjsKKyAgICBvcHRpb25hbCBpbnQzMiBvcHRpb25hbF9pbnQzMl82MyA9IDYzOworICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyXzY0ID0gNjQ7Cit9CisKK21lc3NhZ2UgVGVzdFZlcmlmeUludDMyIHsKKyAgICBvcHRpb25hbCBpbnQzMiBvcHRpb25hbF9pbnQzMl8xID0gMTsKKyAgICBvcHRpb25hbCBpbnQzMiBvcHRpb25hbF9pbnQzMl8yID0gMjsKKyAgICBvcHRpb25hbCBpbnQzMiBvcHRpb25hbF9pbnQzMl82MyA9IDYzOworICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyXzY0ID0gNjQ7CisKKyAgICBvcHRpb25hbCBUZXN0QWxsVHlwZXMgb3B0aW9uYWxfYWxsX3R5cGVzID0gOTsKKyAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgcmVwZWF0ZWRfYWxsX3R5cGVzID0gMTA7Cit9CisKK21lc3NhZ2UgVGVzdFZlcmlmeU1vc3RseUludDMyIHsKKyAgICBvcHRpb25hbCBpbnQ2NCBvcHRpb25hbF9pbnQ2NF8zMCA9IDMwOworCisgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzJfMSA9IDE7CisgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzJfMiA9IDI7CisgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzJfMyA9IDM7CisgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzJfNCA9IDQ7CisgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzJfNjMgPSA2MzsKKyAgICBvcHRpb25hbCBpbnQzMiBvcHRpb25hbF9pbnQzMl82NCA9IDY0OworCisgICAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIG9wdGlvbmFsX2FsbF90eXBlcyA9IDk7CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzIHJlcGVhdGVkX2FsbF90eXBlcyA9IDEwOworfQorCittZXNzYWdlIFRlc3RWZXJpZnlNb3N0bHlJbnQzMkJpZ0ZpZWxkTnVtYmVyIHsKKyAgICBvcHRpb25hbCBpbnQ2NCBvcHRpb25hbF9pbnQ2NF8zMCA9IDMwOworICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyXzMwMCA9IDMwMDsKKworICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyXzEgPSAxOworICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyXzIgPSAyOworICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyXzMgPSAzOworICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyXzQgPSA0OworICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyXzYzID0gNjM7CisgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzJfNjQgPSA2NDsKKworICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBvcHRpb25hbF9hbGxfdHlwZXMgPSA5OworICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcyByZXBlYXRlZF9hbGxfdHlwZXMgPSAxMDsKK30KKworbWVzc2FnZSBUZXN0VmVyaWZ5VWludDMyU2ltcGxlIHsKKyAgICBvcHRpb25hbCB1aW50MzIgb3B0aW9uYWxfdWludDMyXzEgPSAxOworICAgIG9wdGlvbmFsIHVpbnQzMiBvcHRpb25hbF91aW50MzJfMiA9IDI7CisgICAgb3B0aW9uYWwgdWludDMyIG9wdGlvbmFsX3VpbnQzMl82MyA9IDYzOworICAgIG9wdGlvbmFsIHVpbnQzMiBvcHRpb25hbF91aW50MzJfNjQgPSA2NDsKK30KKworbWVzc2FnZSBUZXN0VmVyaWZ5VWludDMyIHsKKyAgICBvcHRpb25hbCB1aW50MzIgb3B0aW9uYWxfdWludDMyXzEgPSAxOworICAgIG9wdGlvbmFsIHVpbnQzMiBvcHRpb25hbF91aW50MzJfMiA9IDI7CisgICAgb3B0aW9uYWwgdWludDMyIG9wdGlvbmFsX3VpbnQzMl82MyA9IDYzOworICAgIG9wdGlvbmFsIHVpbnQzMiBvcHRpb25hbF91aW50MzJfNjQgPSA2NDsKKworICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBvcHRpb25hbF9hbGxfdHlwZXMgPSA5OworICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcyByZXBlYXRlZF9hbGxfdHlwZXMgPSAxMDsKK30KKworbWVzc2FnZSBUZXN0VmVyaWZ5T25lVWludDMyIHsKKyAgICBvcHRpb25hbCB1aW50MzIgb3B0aW9uYWxfdWludDMyXzEgPSAxOworICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyXzIgPSAyOworICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyXzYzID0gNjM7CisgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzJfNjQgPSA2NDsKKworICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBvcHRpb25hbF9hbGxfdHlwZXMgPSA5OworICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcyByZXBlYXRlZF9hbGxfdHlwZXMgPSAxMDsKK30KKworbWVzc2FnZSBUZXN0VmVyaWZ5T25lSW50MzJCaWdGaWVsZE51bWJlciB7CisgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzJfNjUgPSA2NTsKKworICAgIG9wdGlvbmFsIGludDY0IG9wdGlvbmFsX2ludDY0XzEgPSAxOworICAgIG9wdGlvbmFsIGludDY0IG9wdGlvbmFsX2ludDY0XzIgPSAyOworICAgIG9wdGlvbmFsIGludDY0IG9wdGlvbmFsX2ludDY0XzYzID0gNjM7CisgICAgb3B0aW9uYWwgaW50NjQgb3B0aW9uYWxfaW50NjRfNjQgPSA2NDsKKworICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBvcHRpb25hbF9hbGxfdHlwZXMgPSA5OworICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcyByZXBlYXRlZF9hbGxfdHlwZXMgPSAxMDsKK30KKworbWVzc2FnZSBUZXN0VmVyaWZ5SW50MzJCaWdGaWVsZE51bWJlciB7CisgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzJfMTAwMCA9IDEwMDA7CisgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzJfNjUgPSA2NTsKKworICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyXzEgPSAxOworICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyXzIgPSAyOworICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyXzYzID0gNjM7CisgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzJfNjQgPSA2NDsKKworICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBvcHRpb25hbF9hbGxfdHlwZXMgPSA5OworICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcyByZXBlYXRlZF9hbGxfdHlwZXMgPSAxMDsKK30KKworbWVzc2FnZSBUZXN0VmVyaWZ5VWludDMyQmlnRmllbGROdW1iZXIgeworICAgIG9wdGlvbmFsIHVpbnQzMiBvcHRpb25hbF91aW50MzJfMTAwMCA9IDEwMDA7CisgICAgb3B0aW9uYWwgdWludDMyIG9wdGlvbmFsX3VpbnQzMl82NSA9IDY1OworCisgICAgb3B0aW9uYWwgdWludDMyIG9wdGlvbmFsX3VpbnQzMl8xID0gMTsKKyAgICBvcHRpb25hbCB1aW50MzIgb3B0aW9uYWxfdWludDMyXzIgPSAyOworICAgIG9wdGlvbmFsIHVpbnQzMiBvcHRpb25hbF91aW50MzJfNjMgPSA2MzsKKyAgICBvcHRpb25hbCB1aW50MzIgb3B0aW9uYWxfdWludDMyXzY0ID0gNjQ7CisKKyAgICBvcHRpb25hbCBUZXN0QWxsVHlwZXMgb3B0aW9uYWxfYWxsX3R5cGVzID0gOTsKKyAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgcmVwZWF0ZWRfYWxsX3R5cGVzID0gMTA7Cit9CisKK21lc3NhZ2UgVGVzdFZlcmlmeUJpZ0ZpZWxkTnVtYmVyVWludDMyIHsKKyAgbWVzc2FnZSBOZXN0ZWQgeworICAgIG9wdGlvbmFsIHVpbnQzMiBvcHRpb25hbF91aW50MzJfNTAwMCA9IDUwMDA7CisgICAgb3B0aW9uYWwgdWludDMyIG9wdGlvbmFsX3VpbnQzMl8xMDAwID0gMTAwMDsKKyAgICBvcHRpb25hbCB1aW50MzIgb3B0aW9uYWxfdWludDMyXzY2ID0gNjY7CisgICAgb3B0aW9uYWwgdWludDMyIG9wdGlvbmFsX3VpbnQzMl82NSA9IDY1OworCisgICAgb3B0aW9uYWwgdWludDMyIG9wdGlvbmFsX3VpbnQzMl8xID0gMTsKKyAgICBvcHRpb25hbCB1aW50MzIgb3B0aW9uYWxfdWludDMyXzIgPSAyOworICAgIG9wdGlvbmFsIHVpbnQzMiBvcHRpb25hbF91aW50MzJfNjMgPSA2MzsKKyAgICBvcHRpb25hbCB1aW50MzIgb3B0aW9uYWxfdWludDMyXzY0ID0gNjQ7CisKKyAgICBvcHRpb25hbCBOZXN0ZWQgb3B0aW9uYWxfbmVzdGVkID0gOTsKKyAgICByZXBlYXRlZCBOZXN0ZWQgcmVwZWF0ZWRfbmVzdGVkID0gMTA7CisgIH0KKyAgb3B0aW9uYWwgTmVzdGVkIG9wdGlvbmFsX25lc3RlZCA9IDE7Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzMTczOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucHJvdG8KQEAgLTAsMCArMSw0MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIHByb3RvMl9hcmVuYV91bml0dGVzdDsKKworb3B0aW9uIGNjX2VuYWJsZV9hcmVuYXMgPSB0cnVlOworCittZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiBkID0gMTsKK30KKworbWVzc2FnZSBBcmVuYU1lc3NhZ2UgeworICByZXBlYXRlZCBOZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlID0gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NDE2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvCkBAIC0wLDAgKzEsNDY2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBiZW5qeUBnb29nbGUuY29tIChCZW5qeSBXZWluYmVyZ2VyKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gQSBwcm90byBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgImN1c3RvbSBvcHRpb25zIiBmZWF0dXJlIG9mIGdvb2dsZS5wcm90b2J1Zi4KKworc3ludGF4ID0gInByb3RvMiI7CisKKy8vIFNvbWUgZ2VuZXJpY19zZXJ2aWNlcyBvcHRpb24ocykgYWRkZWQgYXV0b21hdGljYWxseS4KKy8vIFNlZTogIGh0dHA6Ly9nby9wcm90bzItZ2VuZXJpYy1zZXJ2aWNlcy1kZWZhdWx0CitvcHRpb24gY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IHRydWU7ICAgIC8vIGF1dG8tYWRkZWQKK29wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgLy8gYXV0by1hZGRlZAorb3B0aW9uIHB5X2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOworCisvLyBBIGN1c3RvbSBmaWxlIG9wdGlvbiAoZGVmaW5lZCBiZWxvdykuCitvcHRpb24gKGZpbGVfb3B0MSkgPSA5ODc2NTQzMjEwOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8iOworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byI7CisKKy8vIFdlIGRvbid0IHB1dCB0aGlzIGluIGEgcGFja2FnZSB3aXRoaW4gcHJvdG8yIGJlY2F1c2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUKKy8vIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGRvZXNuJ3QgZGVwZW5kIG9uIGJlaW5nIGluIHRoZSBwcm90bzIgbmFtZXNwYWNlLgorcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworLy8gU29tZSBzaW1wbGUgdGVzdCBjdXN0b20gb3B0aW9ucyBvZiB2YXJpb3VzIHR5cGVzLgorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIHsKKyAgb3B0aW9uYWwgdWludDY0IGZpbGVfb3B0MSA9IDc3MzY5NzQ7Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgeworICBvcHRpb25hbCBpbnQzMiBtZXNzYWdlX29wdDEgPSA3NzM5MDM2OworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyB7CisgIG9wdGlvbmFsIGZpeGVkNjQgZmllbGRfb3B0MSA9IDc3NDA5MzY7CisgIC8vIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIHRoYXQgd2UgY29ycmVjdGx5IHJlZ2lzdGVyIGRlZmF1bHQgdmFsdWVzIGZvcgorICAvLyBleHRlbnNpb24gb3B0aW9ucy4KKyAgb3B0aW9uYWwgaW50MzIgZmllbGRfb3B0MiA9IDc3NTM5MTMgW2RlZmF1bHQgPSA0Ml07Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zIHsKKyAgb3B0aW9uYWwgaW50MzIgb25lb2Zfb3B0MSA9IDc3NDAxMTE7Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgeworICBvcHRpb25hbCBzZml4ZWQzMiBlbnVtX29wdDEgPSA3NzUzNTc2OworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMgeworICBvcHRpb25hbCBpbnQzMiBlbnVtX3ZhbHVlX29wdDEgPSAxNTYwNjc4OworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIHsKKyAgb3B0aW9uYWwgc2ludDY0IHNlcnZpY2Vfb3B0MSA9IDc4ODc2NTA7Cit9CisKK2VudW0gTWV0aG9kT3B0MSB7CisgIE1FVEhPRE9QVDFfVkFMMSA9IDE7CisgIE1FVEhPRE9QVDFfVkFMMiA9IDI7Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyB7CisgIG9wdGlvbmFsIE1ldGhvZE9wdDEgbWV0aG9kX29wdDEgPSA3ODkwODYwOworfQorCisvLyBBIHRlc3QgbWVzc2FnZSB3aXRoIGN1c3RvbSBvcHRpb25zIGF0IGFsbCBwb3NzaWJsZSBsb2NhdGlvbnMgKGFuZCBhbHNvIHNvbWUKKy8vIHJlZ3VsYXIgb3B0aW9ucywgdG8gbWFrZSBzdXJlIHRoZXkgaW50ZXJhY3QgbmljZWx5KS4KK21lc3NhZ2UgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyB7CisgIG9wdGlvbiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IGZhbHNlOworICBvcHRpb24gKG1lc3NhZ2Vfb3B0MSkgPSAtNTY7CisKKyAgb3B0aW9uYWwgc3RyaW5nIGZpZWxkMSA9IDEgW2N0eXBlID0gQ09SRCwgKGZpZWxkX29wdDEpID0gODc2NTQzMjEwOV07CisKKyAgb25lb2YgQW5PbmVvZiB7CisgICAgb3B0aW9uIChvbmVvZl9vcHQxKSA9IC05OTsKKworICAgIGludDMyIG9uZW9mX2ZpZWxkID0gMjsKKyAgfQorCisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbWFwX2ZpZWxkID0gMyBbKGZpZWxkX29wdDEpID0gMTIzNDVdOworCisgIGVudW0gQW5FbnVtIHsKKyAgICBvcHRpb24gKGVudW1fb3B0MSkgPSAtNzg5OworCisgICAgQU5FTlVNX1ZBTDEgPSAxOworICAgIEFORU5VTV9WQUwyID0gMiBbKGVudW1fdmFsdWVfb3B0MSkgPSAxMjNdOworICB9Cit9CisKKy8vIEEgdGVzdCBSUEMgc2VydmljZSB3aXRoIGN1c3RvbSBvcHRpb25zIGF0IGFsbCBwb3NzaWJsZSBsb2NhdGlvbnMgKGFuZCBhbHNvCisvLyBzb21lIHJlZ3VsYXIgb3B0aW9ucywgdG8gbWFrZSBzdXJlIHRoZXkgaW50ZXJhY3QgbmljZWx5KS4KK21lc3NhZ2UgQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCB7fQorCittZXNzYWdlIEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlIHt9CisKK21lc3NhZ2UgQ3VzdG9tT3B0aW9uRm9vQ2xpZW50TWVzc2FnZSB7fQorCittZXNzYWdlIEN1c3RvbU9wdGlvbkZvb1NlcnZlck1lc3NhZ2Uge30KKworc2VydmljZSBUZXN0U2VydmljZVdpdGhDdXN0b21PcHRpb25zIHsKKyAgb3B0aW9uIChzZXJ2aWNlX29wdDEpID0gLTk4NzY1NDMyMTA7CisKKyAgcnBjIEZvbyhDdXN0b21PcHRpb25Gb29SZXF1ZXN0KSByZXR1cm5zIChDdXN0b21PcHRpb25Gb29SZXNwb25zZSkgeworICAgIG9wdGlvbiAobWV0aG9kX29wdDEpID0gTUVUSE9ET1BUMV9WQUwyOworICB9Cit9CisKKy8vIE9wdGlvbnMgb2YgZXZlcnkgcG9zc2libGUgZmllbGQgdHlwZSwgc28gd2UgY2FuIHRlc3QgdGhlbSBhbGwgZXhoYXVzdGl2ZWx5LgorCittZXNzYWdlIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIHsKKyAgZW51bSBUZXN0RW51bVR5cGUgeworICAgIFRFU1RfT1BUSU9OX0VOVU1fVFlQRTEgPSAyMjsKKyAgICBURVNUX09QVElPTl9FTlVNX1RZUEUyID0gLTIzOworICB9Cit9CisKK21lc3NhZ2UgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSB7fQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIHsKKyAgb3B0aW9uYWwgYm9vbCBib29sX29wdCA9IDc3MDYwOTA7CisgIG9wdGlvbmFsIGludDMyIGludDMyX29wdCA9IDc3MDU3MDk7CisgIG9wdGlvbmFsIGludDY0IGludDY0X29wdCA9IDc3MDU1NDI7CisgIG9wdGlvbmFsIHVpbnQzMiB1aW50MzJfb3B0ID0gNzcwNDg4MDsKKyAgb3B0aW9uYWwgdWludDY0IHVpbnQ2NF9vcHQgPSA3NzAyMzY3OworICBvcHRpb25hbCBzaW50MzIgc2ludDMyX29wdCA9IDc3MDE1Njg7CisgIG9wdGlvbmFsIHNpbnQ2NCBzaW50NjRfb3B0ID0gNzcwMDg2MzsKKyAgb3B0aW9uYWwgZml4ZWQzMiBmaXhlZDMyX29wdCA9IDc3MDAzMDc7CisgIG9wdGlvbmFsIGZpeGVkNjQgZml4ZWQ2NF9vcHQgPSA3NzAwMTk0OworICBvcHRpb25hbCBzZml4ZWQzMiBzZml4ZWQzMl9vcHQgPSA3Njk4NjQ1OworICBvcHRpb25hbCBzZml4ZWQ2NCBzZml4ZWQ2NF9vcHQgPSA3Njg1NDc1OworICBvcHRpb25hbCBmbG9hdCBmbG9hdF9vcHQgPSA3Njc1MzkwOworICBvcHRpb25hbCBkb3VibGUgZG91YmxlX29wdCA9IDc2NzMyOTM7CisgIG9wdGlvbmFsIHN0cmluZyBzdHJpbmdfb3B0ID0gNzY3MzI4NTsKKyAgb3B0aW9uYWwgYnl0ZXMgYnl0ZXNfb3B0ID0gNzY3MzIzODsKKyAgb3B0aW9uYWwgRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW0uVGVzdEVudW1UeXBlIGVudW1fb3B0ID0gNzY3MzIzMzsKKyAgb3B0aW9uYWwgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSBtZXNzYWdlX3R5cGVfb3B0ID0gNzY2NTk2NzsKK30KKworbWVzc2FnZSBDdXN0b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzIHsKKyAgb3B0aW9uIChib29sX29wdCkgPSBmYWxzZTsKKyAgb3B0aW9uIChpbnQzMl9vcHQpID0gLTB4ODAwMDAwMDA7CisgIG9wdGlvbiAoaW50NjRfb3B0KSA9IC0weDgwMDAwMDAwMDAwMDAwMDA7CisgIG9wdGlvbiAodWludDMyX29wdCkgPSAwOworICBvcHRpb24gKHVpbnQ2NF9vcHQpID0gMDsKKyAgb3B0aW9uIChzaW50MzJfb3B0KSA9IC0weDgwMDAwMDAwOworICBvcHRpb24gKHNpbnQ2NF9vcHQpID0gLTB4ODAwMDAwMDAwMDAwMDAwMDsKKyAgb3B0aW9uIChmaXhlZDMyX29wdCkgPSAwOworICBvcHRpb24gKGZpeGVkNjRfb3B0KSA9IDA7CisgIG9wdGlvbiAoc2ZpeGVkMzJfb3B0KSA9IC0weDgwMDAwMDAwOworICBvcHRpb24gKHNmaXhlZDY0X29wdCkgPSAtMHg4MDAwMDAwMDAwMDAwMDAwOworfQorCittZXNzYWdlIEN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMgeworICBvcHRpb24gKGJvb2xfb3B0KSA9IHRydWU7CisgIG9wdGlvbiAoaW50MzJfb3B0KSA9IDB4N0ZGRkZGRkY7CisgIG9wdGlvbiAoaW50NjRfb3B0KSA9IDB4N0ZGRkZGRkZGRkZGRkZGRjsKKyAgb3B0aW9uICh1aW50MzJfb3B0KSA9IDB4RkZGRkZGRkY7CisgIG9wdGlvbiAodWludDY0X29wdCkgPSAweEZGRkZGRkZGRkZGRkZGRkY7CisgIG9wdGlvbiAoc2ludDMyX29wdCkgPSAweDdGRkZGRkZGOworICBvcHRpb24gKHNpbnQ2NF9vcHQpID0gMHg3RkZGRkZGRkZGRkZGRkZGOworICBvcHRpb24gKGZpeGVkMzJfb3B0KSA9IDB4RkZGRkZGRkY7CisgIG9wdGlvbiAoZml4ZWQ2NF9vcHQpID0gMHhGRkZGRkZGRkZGRkZGRkZGOworICBvcHRpb24gKHNmaXhlZDMyX29wdCkgPSAweDdGRkZGRkZGOworICBvcHRpb24gKHNmaXhlZDY0X29wdCkgPSAweDdGRkZGRkZGRkZGRkZGRkY7Cit9CisKK21lc3NhZ2UgQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMgeworICBvcHRpb24gKGludDMyX29wdCkgPSAtMTAwOyAgLy8gVG8gdGVzdCBzaWduLWV4dGVuc2lvbi4KKyAgb3B0aW9uIChmbG9hdF9vcHQpID0gMTIuMzQ1Njc4OTsKKyAgb3B0aW9uIChkb3VibGVfb3B0KSA9IDEuMjM0NTY3ODkwMTIzNDU2Nzg5OworICBvcHRpb24gKHN0cmluZ19vcHQpID0gIkhlbGxvLCBcIldvcmxkXCIiOworICBvcHRpb24gKGJ5dGVzX29wdCkgPSAiSGVsbG9cMFdvcmxkIjsKKyAgb3B0aW9uIChlbnVtX29wdCkgPSBURVNUX09QVElPTl9FTlVNX1RZUEUyOworfQorCittZXNzYWdlIFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMgeworICBvcHRpb24gKGZsb2F0X29wdCkgPSAxMjsKKyAgb3B0aW9uIChkb3VibGVfb3B0KSA9IDE1NDsKK30KKworbWVzc2FnZSBTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzIHsKKyAgb3B0aW9uIChmbG9hdF9vcHQpID0gLTEyOworICBvcHRpb24gKGRvdWJsZV9vcHQpID0gLTE1NDsKK30KKworLy8gT3B0aW9ucyBvZiBjb21wbGV4IG1lc3NhZ2UgdHlwZXMsIHRoZW1zZWx2ZXMgY29tYmluZWQgYW5kIGV4dGVuZGVkIGluCisvLyB2YXJpb3VzIHdheXMuCisKK21lc3NhZ2UgQ29tcGxleE9wdGlvblR5cGUxIHsKKyAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgZm9vMiA9IDI7CisgIG9wdGlvbmFsIGludDMyIGZvbzMgPSAzOworICByZXBlYXRlZCBpbnQzMiBmb280ID0gNDsKKworICBleHRlbnNpb25zIDEwMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgQ29tcGxleE9wdGlvblR5cGUyIHsKKyAgb3B0aW9uYWwgQ29tcGxleE9wdGlvblR5cGUxIGJhciA9IDE7CisgIG9wdGlvbmFsIGludDMyIGJheiA9IDI7CisKKyAgbWVzc2FnZSBDb21wbGV4T3B0aW9uVHlwZTQgeworICAgIG9wdGlvbmFsIGludDMyIHdhbGRvID0gMTsKKworICAgIGV4dGVuZCBnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgeworICAgICAgb3B0aW9uYWwgQ29tcGxleE9wdGlvblR5cGU0IGNvbXBsZXhfb3B0NCA9IDc2MzM1NDY7CisgICAgfQorICB9CisKKyAgb3B0aW9uYWwgQ29tcGxleE9wdGlvblR5cGU0IGZyZWQgPSAzOworICByZXBlYXRlZCBDb21wbGV4T3B0aW9uVHlwZTQgYmFybmV5ID0gNDsKKworICBleHRlbnNpb25zIDEwMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgQ29tcGxleE9wdGlvblR5cGUzIHsKKyAgb3B0aW9uYWwgaW50MzIgbW9vID0gMTsKKworICBvcHRpb25hbCBncm91cCBDb21wbGV4T3B0aW9uVHlwZTUgPSAyIHsKKyAgICBvcHRpb25hbCBpbnQzMiBwbHVnaCA9IDM7CisgIH0KK30KKworZXh0ZW5kIENvbXBsZXhPcHRpb25UeXBlMSB7CisgIG9wdGlvbmFsIGludDMyIG1vb28gPSA3NjYzNzA3OworICBvcHRpb25hbCBDb21wbGV4T3B0aW9uVHlwZTMgY29yZ2UgPSA3NjYzNDQyOworfQorCitleHRlbmQgQ29tcGxleE9wdGlvblR5cGUyIHsKKyAgb3B0aW9uYWwgaW50MzIgZ3JhdWx0ID0gNzY1MDkyNzsKKyAgb3B0aW9uYWwgQ29tcGxleE9wdGlvblR5cGUxIGdhcnBseSA9IDc2NDk5OTI7Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgeworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdC5Db21wbGV4T3B0aW9uVHlwZTEgY29tcGxleF9vcHQxID0gNzY0Njc1NjsKKyAgb3B0aW9uYWwgQ29tcGxleE9wdGlvblR5cGUyIGNvbXBsZXhfb3B0MiA9IDc2MzY5NDk7CisgIG9wdGlvbmFsIENvbXBsZXhPcHRpb25UeXBlMyBjb21wbGV4X29wdDMgPSA3NjM2NDYzOworICBvcHRpb25hbCBncm91cCBDb21wbGV4T3B0NiA9IDc1OTU0NjggeworICAgIG9wdGlvbmFsIGludDMyIHh5enp5ID0gNzU5Mzk1MTsKKyAgfQorfQorCisvLyBOb3RlIHRoYXQgd2UgdHJ5IHZhcmlvdXMgZGlmZmVyZW50IHdheXMgb2YgbmFtaW5nIHRoZSBzYW1lIGV4dGVuc2lvbi4KK21lc3NhZ2UgVmFyaW91c0NvbXBsZXhPcHRpb25zIHsKKyAgb3B0aW9uICgucHJvdG9idWZfdW5pdHRlc3QuY29tcGxleF9vcHQxKS5mb28gPSA0MjsKKyAgb3B0aW9uIChwcm90b2J1Zl91bml0dGVzdC5jb21wbGV4X29wdDEpLigucHJvdG9idWZfdW5pdHRlc3QubW9vbykgPSAzMjQ7CisgIG9wdGlvbiAoLnByb3RvYnVmX3VuaXR0ZXN0LmNvbXBsZXhfb3B0MSkuKHByb3RvYnVmX3VuaXR0ZXN0LmNvcmdlKS5tb28gPSA4NzY7CisgIG9wdGlvbiAocHJvdG9idWZfdW5pdHRlc3QuY29tcGxleF9vcHQxKS5mb280ID0gOTk7CisgIG9wdGlvbiAocHJvdG9idWZfdW5pdHRlc3QuY29tcGxleF9vcHQxKS5mb280ID0gODg7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS5iYXogPSA5ODc7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS4oZ3JhdWx0KSA9IDY1NDsKKyAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJhci5mb28gPSA3NDM7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS5iYXIuKG1vb28pID0gMTk5OTsKKyAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJhci4ocHJvdG9idWZfdW5pdHRlc3QuY29yZ2UpLm1vbyA9IDIwMDg7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS4oZ2FycGx5KS5mb28gPSA3NDE7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS4oZ2FycGx5KS4oLnByb3RvYnVmX3VuaXR0ZXN0Lm1vb28pID0gMTk5ODsKKyAgb3B0aW9uIChjb21wbGV4X29wdDIpLihwcm90b2J1Zl91bml0dGVzdC5nYXJwbHkpLihjb3JnZSkubW9vID0gMjEyMTsKKyAgb3B0aW9uIChDb21wbGV4T3B0aW9uVHlwZTIuQ29tcGxleE9wdGlvblR5cGU0LmNvbXBsZXhfb3B0NCkud2FsZG8gPSAxOTcxOworICBvcHRpb24gKGNvbXBsZXhfb3B0MikuZnJlZC53YWxkbyA9IDMyMTsKKyAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJhcm5leSA9IHsKKyAgICB3YWxkbzogMTAxCisgIH07CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS5iYXJuZXkgPSB7CisgICAgd2FsZG86IDIxMgorICB9OworICBvcHRpb24gKHByb3RvYnVmX3VuaXR0ZXN0LmNvbXBsZXhfb3B0MykubW9vID0gOTsKKyAgb3B0aW9uIChjb21wbGV4X29wdDMpLmNvbXBsZXhvcHRpb250eXBlNS5wbHVnaCA9IDIyOworICBvcHRpb24gKGNvbXBsZXhvcHQ2KS54eXp6eSA9IDI0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlZmluaXRpb25zIGZvciB0ZXN0aW5nIGFnZ3JlZ2F0ZSBvcHRpb24gcGFyc2luZy4KKy8vIFNlZSBkZXNjcmlwdG9yX3VuaXR0ZXN0LmNjLgorCittZXNzYWdlIEFnZ3JlZ2F0ZU1lc3NhZ2VTZXQgeworICBvcHRpb24gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlOworCisgIGV4dGVuc2lvbnMgNCB0byBtYXg7Cit9CisKK21lc3NhZ2UgQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQgeworICBleHRlbmQgQWdncmVnYXRlTWVzc2FnZVNldCB7CisgICAgb3B0aW9uYWwgQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQgbWVzc2FnZV9zZXRfZXh0ZW5zaW9uID0gMTU0NDc1NDI7CisgIH0KKyAgb3B0aW9uYWwgc3RyaW5nIHMgPSAxOworfQorCisvLyBBIGhlbHBlciB0eXBlIHVzZWQgdG8gdGVzdCBhZ2dyZWdhdGUgb3B0aW9uIHBhcnNpbmcKK21lc3NhZ2UgQWdncmVnYXRlIHsKKyAgb3B0aW9uYWwgaW50MzIgaSA9IDE7CisgIG9wdGlvbmFsIHN0cmluZyBzID0gMjsKKworICAvLyBBIG5lc3RlZCBvYmplY3QKKyAgb3B0aW9uYWwgQWdncmVnYXRlIHN1YiA9IDM7CisKKyAgLy8gVG8gdGVzdCB0aGUgcGFyc2luZyBvZiBleHRlbnNpb25zIGluc2lkZSBhZ2dyZWdhdGUgdmFsdWVzCisgIG9wdGlvbmFsIGdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyBmaWxlID0gNDsKKyAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyB7CisgICAgb3B0aW9uYWwgQWdncmVnYXRlIG5lc3RlZCA9IDE1NDc2OTAzOworICB9CisKKyAgLy8gQW4gZW1iZWRkZWQgbWVzc2FnZSBzZXQKKyAgb3B0aW9uYWwgQWdncmVnYXRlTWVzc2FnZVNldCBtc2V0ID0gNTsKKworICAvLyBBbiBhbnkKKyAgb3B0aW9uYWwgZ29vZ2xlLnByb3RvYnVmLkFueSBhbnkgPSA2OworfQorCisvLyBBbGxvdyBBZ2dyZWdhdGUgdG8gYmUgdXNlZCBhcyBhbiBvcHRpb24gYXQgYWxsIHBvc3NpYmxlIGxvY2F0aW9ucworLy8gaW4gdGhlIC5wcm90byBncmFtbWFyLgorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyB7CisgIG9wdGlvbmFsIEFnZ3JlZ2F0ZSBmaWxlb3B0ID0gMTU0Nzg0Nzk7Cit9CitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIHsKKyAgb3B0aW9uYWwgQWdncmVnYXRlIG1zZ29wdCA9IDE1NDgwMDg4OworfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgeworICBvcHRpb25hbCBBZ2dyZWdhdGUgZmllbGRvcHQgPSAxNTQ4MTM3NDsKK30KK2V4dGVuZCBnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgeworICBvcHRpb25hbCBBZ2dyZWdhdGUgZW51bW9wdCA9IDE1NDgzMjE4OworfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIHsKKyAgb3B0aW9uYWwgQWdncmVnYXRlIGVudW12YWxvcHQgPSAxNTQ4NjkyMTsKK30KK2V4dGVuZCBnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMgeworICBvcHRpb25hbCBBZ2dyZWdhdGUgc2VydmljZW9wdCA9IDE1NDk3MTQ1OworfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zIHsKKyAgb3B0aW9uYWwgQWdncmVnYXRlIG1ldGhvZG9wdCA9IDE1NTEyNzEzOworfQorCisvLyBUcnkgdXNpbmcgQWdncmVnYXRlT3B0aW9uIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGhlIHByb3RvIGdyYW1tYXIKK29wdGlvbiAoZmlsZW9wdCkgPSB7CisgIHM6ICdGaWxlQW5ub3RhdGlvbicKKyAgLy8gQWxzbyB0ZXN0IHRoZSBoYW5kbGluZyBvZiBjb21tZW50cworICAvKiBvZiBib3RoIHR5cGVzICovCisgIGk6IDEwMAorCisgIHN1YiB7IHM6ICdOZXN0ZWRGaWxlQW5ub3RhdGlvbicgfQorCisgIC8vIEluY2x1ZGUgYSBnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgYW5kIHJlY3Vyc2l2ZWx5IGV4dGVuZCBpdCB3aXRoCisgIC8vIGFub3RoZXIgZmlsZW9wdC4KKyAgZmlsZSB7CisgICAgW3Byb3RvYnVmX3VuaXR0ZXN0LmZpbGVvcHRdIHsgczogJ0ZpbGVFeHRlbnNpb25Bbm5vdGF0aW9uJyB9CisgIH0KKworICAvLyBBIG1lc3NhZ2Ugc2V0IGluc2lkZSBhbiBvcHRpb24gdmFsdWUKKyAgbXNldCB7CisgICAgW3Byb3RvYnVmX3VuaXR0ZXN0LkFnZ3JlZ2F0ZU1lc3NhZ2VTZXRFbGVtZW50Lm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbl0geworICAgICAgczogJ0VtYmVkZGVkTWVzc2FnZVNldEVsZW1lbnQnCisgICAgfQorICB9CisKKyAgYW55IHsKKyAgICBbdHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2J1Zl91bml0dGVzdC5BZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudF0geworICAgICAgczogJ0VtYmVkZGVkTWVzc2FnZVNldEVsZW1lbnQnCisgICAgfQorICB9Cit9OworCittZXNzYWdlIEFnZ3JlZ2F0ZU1lc3NhZ2UgeworICBvcHRpb24gKG1zZ29wdCkgPSB7CisgICAgaTogMTAxCisgICAgczogJ01lc3NhZ2VBbm5vdGF0aW9uJworICB9OworCisgIG9wdGlvbmFsIGludDMyIGZpZWxkbmFtZSA9IDEgWyhmaWVsZG9wdCkgPSB7IHM6ICdGaWVsZEFubm90YXRpb24nIH1dOworfQorCitzZXJ2aWNlIEFnZ3JlZ2F0ZVNlcnZpY2UgeworICBvcHRpb24gKHNlcnZpY2VvcHQpID0geworICAgIHM6ICdTZXJ2aWNlQW5ub3RhdGlvbicKKyAgfTsKKworICBycGMgTWV0aG9kKEFnZ3JlZ2F0ZU1lc3NhZ2UpIHJldHVybnMgKEFnZ3JlZ2F0ZU1lc3NhZ2UpIHsKKyAgICBvcHRpb24gKG1ldGhvZG9wdCkgPSB7CisgICAgICBzOiAnTWV0aG9kQW5ub3RhdGlvbicKKyAgICB9OworICB9Cit9CisKK2VudW0gQWdncmVnYXRlRW51bSB7CisgIG9wdGlvbiAoZW51bW9wdCkgPSB7CisgICAgczogJ0VudW1Bbm5vdGF0aW9uJworICB9OworCisgIFZBTFVFID0gMSBbKGVudW12YWxvcHQpID0geyBzOiAnRW51bVZhbHVlQW5ub3RhdGlvbicgfV07Cit9CisKKy8vIFRlc3QgY3VzdG9tIG9wdGlvbnMgZm9yIG5lc3RlZCB0eXBlLgorbWVzc2FnZSBOZXN0ZWRPcHRpb25UeXBlIHsKKyAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKKyAgICBvcHRpb24gKG1lc3NhZ2Vfb3B0MSkgPSAxMDAxOworCisgICAgb3B0aW9uYWwgaW50MzIgbmVzdGVkX2ZpZWxkID0gMSBbKGZpZWxkX29wdDEpID0gMTAwMl07CisgIH0KKyAgZW51bSBOZXN0ZWRFbnVtIHsKKyAgICBvcHRpb24gKGVudW1fb3B0MSkgPSAxMDAzOworCisgICAgTkVTVEVEX0VOVU1fVkFMVUUgPSAxIFsoZW51bV92YWx1ZV9vcHQxKSA9IDEwMDRdOworICB9CisgIGV4dGVuZCBnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgeworICAgIG9wdGlvbmFsIGludDMyIG5lc3RlZF9leHRlbnNpb24gPSA3OTEyNTczIFsoZmllbGRfb3B0MikgPSAxMDA1XTsKKyAgfQorfQorCisvLyBDdXN0b20gbWVzc2FnZSBvcHRpb24gdGhhdCBoYXMgYSByZXF1aXJlZCBlbnVtIGZpZWxkLgorLy8gV0FSTklORzogdGhpcyBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCEKK21lc3NhZ2UgT2xkT3B0aW9uVHlwZSB7CisgIGVudW0gVGVzdEVudW0geworICAgIE9MRF9WQUxVRSA9IDA7CisgIH0KKyAgcmVxdWlyZWQgVGVzdEVudW0gdmFsdWUgPSAxOworfQorCisvLyBVcGRhdGVkIHZlcnNpb24gb2YgdGhlIGN1c3RvbSBvcHRpb24gYWJvdmUuCittZXNzYWdlIE5ld09wdGlvblR5cGUgeworICBlbnVtIFRlc3RFbnVtIHsKKyAgICBPTERfVkFMVUUgPSAwOworICAgIE5FV19WQUxVRSA9IDE7CisgIH0KKyAgcmVxdWlyZWQgVGVzdEVudW0gdmFsdWUgPSAxOworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIHsKKyAgb3B0aW9uYWwgT2xkT3B0aW9uVHlwZSByZXF1aXJlZF9lbnVtX29wdCA9IDEwNjE2MTgwNzsKK30KKworLy8gVGVzdCBtZXNzYWdlIHVzaW5nIHRoZSAicmVxdWlyZWRfZW51bV9vcHQiIG9wdGlvbiBkZWZpbmVkIGFib3ZlLgorbWVzc2FnZSBUZXN0TWVzc2FnZVdpdGhSZXF1aXJlZEVudW1PcHRpb24geworICBvcHRpb24gKHJlcXVpcmVkX2VudW1fb3B0KSA9IHsKKyAgICB2YWx1ZTogT0xEX1ZBTFVFCisgIH07Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhOThhZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wcm90bwpAQCAtMCwwICsxLDU4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkczsKKworb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gIkRyb3BVbmtub3ducyI7CitvcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9idWYuVGVzdFByb3RvcyI7CisKK21lc3NhZ2UgRm9vIHsKKyAgZW51bSBOZXN0ZWRFbnVtIHsKKyAgICBGT08gPSAwOworICAgIEJBUiA9IDE7CisgICAgQkFaID0gMjsKKyAgfQorICBpbnQzMiBpbnQzMl92YWx1ZSA9IDE7CisgIE5lc3RlZEVudW0gZW51bV92YWx1ZSA9IDI7Cit9CisKK21lc3NhZ2UgRm9vV2l0aEV4dHJhRmllbGRzIHsKKyAgZW51bSBOZXN0ZWRFbnVtIHsKKyAgICBGT08gPSAwOworICAgIEJBUiA9IDE7CisgICAgQkFaID0gMjsKKyAgICBNT08gPSAzOworICB9CisgIGludDMyIGludDMyX3ZhbHVlID0gMTsKKyAgTmVzdGVkRW51bSBlbnVtX3ZhbHVlID0gMjsKKyAgaW50MzIgZXh0cmFfaW50MzJfdmFsdWUgPSAzOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGIwZjliCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucHJvdG8KQEAgLTAsMCArMSw1MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIEEgcHJvdG8gZmlsZSB3aGljaCBpbXBvcnRzIGEgcHJvdG8gZmlsZSB0aGF0IHVzZXMgb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFLgorCitzeW50YXggPSAicHJvdG8yIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byI7CisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKKy8vIFdlIG9wdGltaXplIGZvciBzcGVlZCBoZXJlLCBidXQgd2UgYXJlIGltcG9ydGluZyBhIHByb3RvIHRoYXQgaXMgb3B0aW1pemVkCisvLyBmb3IgY29kZSBzaXplLgorb3B0aW9uIG9wdGltaXplX2ZvciA9IFNQRUVEOworCittZXNzYWdlIFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUgeworICAvLyBUZXN0IHRoYXQgZW1iZWRkaW5nIGEgbWVzc2FnZSB3aGljaCBoYXMgb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFIGludG8KKyAgLy8gb25lIG9wdGltaXplZCBmb3Igc3BlZWQgd29ya3MuCisgIG9wdGlvbmFsIFRlc3RPcHRpbWl6ZWRGb3JTaXplIG9wdGlvbmFsX21lc3NhZ2UgPSAxOworICByZXBlYXRlZCBUZXN0T3B0aW1pemVkRm9yU2l6ZSByZXBlYXRlZF9tZXNzYWdlID0gMjsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDQzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnByb3RvCkBAIC0wLDAgKzEsMzggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLiAgKEF0IG9uZSBwb2ludCB0aGlzIHdvdWxkbid0IGNvbXBpbGUKKy8vIGNvcnJlY3RseS4pCisKK3N5bnRheCA9ICJwcm90bzIiOwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MDBhMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucHJvdG8KQEAgLTAsMCArMSwxMDQ4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gQSBwcm90byBmaWxlIHRoYXQgaGFzIGFuIGV4dHJlbWVseSBsYXJnZSBkZXNjcmlwdG9yLiAgVXNlZCB0byB0ZXN0IHRoYXQKKy8vIGRlc2NyaXB0b3JzIG92ZXIgNjRrIGRvbid0IGJyZWFrIGxhbmd1YWdlLXNwZWNpZmljIGxpbWl0cyBpbiBnZW5lcmF0ZWQgY29kZSwKKy8vIHN1Y2ggYXMgdGhlIHN0cmluZyBsaXRlcmFsIGxlbmd0aCBsaW1pdCBpbiBKYXZhLgorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CisKKy8vIEF2b2lkIGdlbmVyYXRpbmcgaW5zYW5lbHkgbG9uZyBtZXRob2RzLgorb3B0aW9uIG9wdGltaXplX2ZvciA9IENPREVfU0laRTsKKworbWVzc2FnZSBUZXN0RW5vcm1vdXNEZXNjcmlwdG9yIHsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEgPSAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yID0gMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMyA9IDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQgPSA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ID0gNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNiA9IDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcgPSA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ID0gOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOSA9IDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwID0gMTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExID0gMTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyID0gMTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzID0gMTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0ID0gMTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1ID0gMTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2ID0gMTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3ID0gMTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4ID0gMTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5ID0gMTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwID0gMjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxID0gMjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyID0gMjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzID0gMjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0ID0gMjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1ID0gMjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2ID0gMjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3ID0gMjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4ID0gMjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5ID0gMjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwID0gMzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxID0gMzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyID0gMzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzID0gMzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0ID0gMzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1ID0gMzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2ID0gMzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3ID0gMzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4ID0gMzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5ID0gMzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwID0gNDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxID0gNDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyID0gNDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzID0gNDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0ID0gNDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1ID0gNDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2ID0gNDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3ID0gNDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4ID0gNDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5ID0gNDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwID0gNTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxID0gNTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyID0gNTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzID0gNTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0ID0gNTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1ID0gNTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2ID0gNTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3ID0gNTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4ID0gNTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5ID0gNTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwID0gNjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxID0gNjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyID0gNjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzID0gNjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0ID0gNjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1ID0gNjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2ID0gNjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3ID0gNjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4ID0gNjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5ID0gNjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwID0gNzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxID0gNzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyID0gNzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczID0gNzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0ID0gNzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1ID0gNzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2ID0gNzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3ID0gNzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4ID0gNzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5ID0gNzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwID0gODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxID0gODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyID0gODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzID0gODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0ID0gODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1ID0gODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2ID0gODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3ID0gODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4ID0gODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5ID0gODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwID0gOTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxID0gOTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyID0gOTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzID0gOTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0ID0gOTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1ID0gOTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2ID0gOTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3ID0gOTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4ID0gOTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5ID0gOTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwMCA9IDEwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTAxID0gMTAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDIgPSAxMDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwMyA9IDEwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTA0ID0gMTA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDUgPSAxMDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwNiA9IDEwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTA3ID0gMTA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDggPSAxMDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwOSA9IDEwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTEwID0gMTEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTEgPSAxMTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExMiA9IDExMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTEzID0gMTEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTQgPSAxMTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExNSA9IDExNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTE2ID0gMTE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTcgPSAxMTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExOCA9IDExOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTE5ID0gMTE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjAgPSAxMjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyMSA9IDEyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTIyID0gMTIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjMgPSAxMjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyNCA9IDEyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTI1ID0gMTI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjYgPSAxMjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyNyA9IDEyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTI4ID0gMTI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjkgPSAxMjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzMCA9IDEzMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTMxID0gMTMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzIgPSAxMzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzMyA9IDEzMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTM0ID0gMTM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzUgPSAxMzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzNiA9IDEzNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTM3ID0gMTM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzggPSAxMzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzOSA9IDEzOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQwID0gMTQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDEgPSAxNDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0MiA9IDE0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQzID0gMTQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDQgPSAxNDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0NSA9IDE0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQ2ID0gMTQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDcgPSAxNDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0OCA9IDE0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQ5ID0gMTQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTAgPSAxNTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1MSA9IDE1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTUyID0gMTUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTMgPSAxNTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1NCA9IDE1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTU1ID0gMTU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTYgPSAxNTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1NyA9IDE1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTU4ID0gMTU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTkgPSAxNTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2MCA9IDE2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTYxID0gMTYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjIgPSAxNjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2MyA9IDE2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTY0ID0gMTY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjUgPSAxNjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2NiA9IDE2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTY3ID0gMTY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjggPSAxNjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2OSA9IDE2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTcwID0gMTcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzEgPSAxNzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3MiA9IDE3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTczID0gMTczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzQgPSAxNzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3NSA9IDE3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTc2ID0gMTc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzcgPSAxNzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3OCA9IDE3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTc5ID0gMTc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODAgPSAxODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4MSA9IDE4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTgyID0gMTgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODMgPSAxODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4NCA9IDE4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTg1ID0gMTg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODYgPSAxODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4NyA9IDE4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTg4ID0gMTg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODkgPSAxODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5MCA9IDE5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTkxID0gMTkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTIgPSAxOTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5MyA9IDE5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTk0ID0gMTk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTUgPSAxOTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5NiA9IDE5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTk3ID0gMTk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTggPSAxOTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5OSA9IDE5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjAwID0gMjAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDEgPSAyMDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwMiA9IDIwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjAzID0gMjAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDQgPSAyMDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwNSA9IDIwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjA2ID0gMjA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDcgPSAyMDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwOCA9IDIwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjA5ID0gMjA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTAgPSAyMTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxMSA9IDIxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjEyID0gMjEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTMgPSAyMTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxNCA9IDIxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjE1ID0gMjE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTYgPSAyMTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxNyA9IDIxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjE4ID0gMjE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTkgPSAyMTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyMCA9IDIyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjIxID0gMjIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjIgPSAyMjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyMyA9IDIyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjI0ID0gMjI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjUgPSAyMjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyNiA9IDIyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjI3ID0gMjI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjggPSAyMjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyOSA9IDIyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjMwID0gMjMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzEgPSAyMzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzMiA9IDIzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjMzID0gMjMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzQgPSAyMzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzNSA9IDIzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjM2ID0gMjM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzcgPSAyMzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzOCA9IDIzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjM5ID0gMjM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDAgPSAyNDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0MSA9IDI0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQyID0gMjQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDMgPSAyNDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0NCA9IDI0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQ1ID0gMjQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDYgPSAyNDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0NyA9IDI0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQ4ID0gMjQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDkgPSAyNDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1MCA9IDI1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjUxID0gMjUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTIgPSAyNTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1MyA9IDI1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjU0ID0gMjU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTUgPSAyNTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1NiA9IDI1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjU3ID0gMjU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTggPSAyNTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1OSA9IDI1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjYwID0gMjYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjEgPSAyNjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2MiA9IDI2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjYzID0gMjYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjQgPSAyNjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2NSA9IDI2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjY2ID0gMjY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjcgPSAyNjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2OCA9IDI2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjY5ID0gMjY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzAgPSAyNzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3MSA9IDI3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjcyID0gMjcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzMgPSAyNzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3NCA9IDI3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjc1ID0gMjc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzYgPSAyNzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3NyA9IDI3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjc4ID0gMjc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzkgPSAyNzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4MCA9IDI4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjgxID0gMjgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODIgPSAyODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4MyA9IDI4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjg0ID0gMjg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODUgPSAyODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4NiA9IDI4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjg3ID0gMjg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODggPSAyODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4OSA9IDI4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjkwID0gMjkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTEgPSAyOTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5MiA9IDI5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjkzID0gMjkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTQgPSAyOTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5NSA9IDI5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjk2ID0gMjk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTcgPSAyOTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5OCA9IDI5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjk5ID0gMjk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDAgPSAzMDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwMSA9IDMwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzAyID0gMzAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDMgPSAzMDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwNCA9IDMwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzA1ID0gMzA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDYgPSAzMDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwNyA9IDMwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzA4ID0gMzA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDkgPSAzMDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxMCA9IDMxMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzExID0gMzExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTIgPSAzMTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxMyA9IDMxMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzE0ID0gMzE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTUgPSAzMTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxNiA9IDMxNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzE3ID0gMzE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTggPSAzMTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxOSA9IDMxOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzIwID0gMzIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjEgPSAzMjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyMiA9IDMyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzIzID0gMzIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjQgPSAzMjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyNSA9IDMyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzI2ID0gMzI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjcgPSAzMjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyOCA9IDMyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzI5ID0gMzI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzAgPSAzMzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzMSA9IDMzMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzMyID0gMzMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzMgPSAzMzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzNCA9IDMzNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzM1ID0gMzM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzYgPSAzMzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzNyA9IDMzNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzM4ID0gMzM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzkgPSAzMzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0MCA9IDM0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQxID0gMzQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDIgPSAzNDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0MyA9IDM0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQ0ID0gMzQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDUgPSAzNDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0NiA9IDM0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQ3ID0gMzQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDggPSAzNDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0OSA9IDM0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzUwID0gMzUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTEgPSAzNTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1MiA9IDM1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzUzID0gMzUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTQgPSAzNTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1NSA9IDM1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzU2ID0gMzU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTcgPSAzNTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1OCA9IDM1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzU5ID0gMzU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjAgPSAzNjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2MSA9IDM2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzYyID0gMzYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjMgPSAzNjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2NCA9IDM2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzY1ID0gMzY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjYgPSAzNjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2NyA9IDM2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzY4ID0gMzY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjkgPSAzNjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3MCA9IDM3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzcxID0gMzcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzIgPSAzNzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3MyA9IDM3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzc0ID0gMzc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzUgPSAzNzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3NiA9IDM3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzc3ID0gMzc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzggPSAzNzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3OSA9IDM3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzgwID0gMzgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODEgPSAzODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4MiA9IDM4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzgzID0gMzgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODQgPSAzODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4NSA9IDM4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzg2ID0gMzg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODcgPSAzODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4OCA9IDM4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzg5ID0gMzg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTAgPSAzOTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5MSA9IDM5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzkyID0gMzkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTMgPSAzOTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5NCA9IDM5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzk1ID0gMzk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTYgPSAzOTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5NyA9IDM5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzk4ID0gMzk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTkgPSAzOTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwMCA9IDQwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDAxID0gNDAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDIgPSA0MDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwMyA9IDQwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDA0ID0gNDA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDUgPSA0MDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwNiA9IDQwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDA3ID0gNDA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDggPSA0MDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwOSA9IDQwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDEwID0gNDEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTEgPSA0MTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxMiA9IDQxMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDEzID0gNDEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTQgPSA0MTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxNSA9IDQxNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDE2ID0gNDE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTcgPSA0MTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxOCA9IDQxOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDE5ID0gNDE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjAgPSA0MjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyMSA9IDQyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDIyID0gNDIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjMgPSA0MjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyNCA9IDQyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDI1ID0gNDI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjYgPSA0MjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyNyA9IDQyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDI4ID0gNDI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjkgPSA0MjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzMCA9IDQzMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDMxID0gNDMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzIgPSA0MzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzMyA9IDQzMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDM0ID0gNDM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzUgPSA0MzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzNiA9IDQzNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDM3ID0gNDM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzggPSA0MzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzOSA9IDQzOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQwID0gNDQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDEgPSA0NDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0MiA9IDQ0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQzID0gNDQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDQgPSA0NDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0NSA9IDQ0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQ2ID0gNDQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDcgPSA0NDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0OCA9IDQ0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQ5ID0gNDQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTAgPSA0NTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1MSA9IDQ1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDUyID0gNDUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTMgPSA0NTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1NCA9IDQ1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDU1ID0gNDU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTYgPSA0NTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1NyA9IDQ1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDU4ID0gNDU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTkgPSA0NTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2MCA9IDQ2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDYxID0gNDYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjIgPSA0NjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2MyA9IDQ2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDY0ID0gNDY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjUgPSA0NjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2NiA9IDQ2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDY3ID0gNDY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjggPSA0NjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2OSA9IDQ2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDcwID0gNDcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzEgPSA0NzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3MiA9IDQ3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDczID0gNDczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzQgPSA0NzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3NSA9IDQ3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDc2ID0gNDc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzcgPSA0NzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3OCA9IDQ3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDc5ID0gNDc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODAgPSA0ODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4MSA9IDQ4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDgyID0gNDgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODMgPSA0ODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4NCA9IDQ4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDg1ID0gNDg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODYgPSA0ODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4NyA9IDQ4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDg4ID0gNDg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODkgPSA0ODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5MCA9IDQ5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDkxID0gNDkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTIgPSA0OTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5MyA9IDQ5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDk0ID0gNDk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTUgPSA0OTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5NiA9IDQ5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDk3ID0gNDk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTggPSA0OTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5OSA9IDQ5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTAwID0gNTAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDEgPSA1MDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwMiA9IDUwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTAzID0gNTAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDQgPSA1MDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwNSA9IDUwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTA2ID0gNTA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDcgPSA1MDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwOCA9IDUwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTA5ID0gNTA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTAgPSA1MTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxMSA9IDUxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTEyID0gNTEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTMgPSA1MTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxNCA9IDUxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTE1ID0gNTE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTYgPSA1MTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxNyA9IDUxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTE4ID0gNTE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTkgPSA1MTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyMCA9IDUyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTIxID0gNTIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjIgPSA1MjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyMyA9IDUyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTI0ID0gNTI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjUgPSA1MjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyNiA9IDUyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTI3ID0gNTI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjggPSA1MjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyOSA9IDUyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTMwID0gNTMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzEgPSA1MzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzMiA9IDUzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTMzID0gNTMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzQgPSA1MzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzNSA9IDUzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTM2ID0gNTM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzcgPSA1MzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzOCA9IDUzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTM5ID0gNTM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDAgPSA1NDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0MSA9IDU0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQyID0gNTQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDMgPSA1NDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0NCA9IDU0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQ1ID0gNTQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDYgPSA1NDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0NyA9IDU0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQ4ID0gNTQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDkgPSA1NDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1MCA9IDU1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTUxID0gNTUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTIgPSA1NTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1MyA9IDU1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTU0ID0gNTU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTUgPSA1NTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1NiA9IDU1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTU3ID0gNTU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTggPSA1NTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1OSA9IDU1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTYwID0gNTYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjEgPSA1NjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2MiA9IDU2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTYzID0gNTYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjQgPSA1NjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2NSA9IDU2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTY2ID0gNTY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjcgPSA1NjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2OCA9IDU2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTY5ID0gNTY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzAgPSA1NzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3MSA9IDU3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTcyID0gNTcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzMgPSA1NzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3NCA9IDU3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTc1ID0gNTc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzYgPSA1NzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3NyA9IDU3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTc4ID0gNTc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzkgPSA1NzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4MCA9IDU4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTgxID0gNTgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODIgPSA1ODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4MyA9IDU4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTg0ID0gNTg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODUgPSA1ODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4NiA9IDU4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTg3ID0gNTg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODggPSA1ODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4OSA9IDU4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTkwID0gNTkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTEgPSA1OTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5MiA9IDU5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTkzID0gNTkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTQgPSA1OTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5NSA9IDU5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTk2ID0gNTk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTcgPSA1OTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5OCA9IDU5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTk5ID0gNTk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDAgPSA2MDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwMSA9IDYwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjAyID0gNjAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDMgPSA2MDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwNCA9IDYwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjA1ID0gNjA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDYgPSA2MDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwNyA9IDYwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjA4ID0gNjA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDkgPSA2MDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxMCA9IDYxMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjExID0gNjExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTIgPSA2MTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxMyA9IDYxMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjE0ID0gNjE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTUgPSA2MTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxNiA9IDYxNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjE3ID0gNjE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTggPSA2MTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxOSA9IDYxOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjIwID0gNjIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjEgPSA2MjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyMiA9IDYyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjIzID0gNjIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjQgPSA2MjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyNSA9IDYyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjI2ID0gNjI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjcgPSA2MjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyOCA9IDYyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjI5ID0gNjI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzAgPSA2MzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzMSA9IDYzMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjMyID0gNjMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzMgPSA2MzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzNCA9IDYzNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjM1ID0gNjM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzYgPSA2MzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzNyA9IDYzNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjM4ID0gNjM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzkgPSA2MzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0MCA9IDY0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQxID0gNjQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDIgPSA2NDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0MyA9IDY0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQ0ID0gNjQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDUgPSA2NDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0NiA9IDY0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQ3ID0gNjQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDggPSA2NDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0OSA9IDY0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjUwID0gNjUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTEgPSA2NTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1MiA9IDY1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjUzID0gNjUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTQgPSA2NTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1NSA9IDY1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjU2ID0gNjU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTcgPSA2NTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1OCA9IDY1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjU5ID0gNjU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjAgPSA2NjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2MSA9IDY2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjYyID0gNjYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjMgPSA2NjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2NCA9IDY2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjY1ID0gNjY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjYgPSA2NjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2NyA9IDY2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjY4ID0gNjY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjkgPSA2NjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3MCA9IDY3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjcxID0gNjcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzIgPSA2NzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3MyA9IDY3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjc0ID0gNjc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzUgPSA2NzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3NiA9IDY3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjc3ID0gNjc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzggPSA2NzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3OSA9IDY3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjgwID0gNjgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODEgPSA2ODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4MiA9IDY4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjgzID0gNjgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODQgPSA2ODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4NSA9IDY4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjg2ID0gNjg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODcgPSA2ODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4OCA9IDY4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjg5ID0gNjg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTAgPSA2OTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5MSA9IDY5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjkyID0gNjkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTMgPSA2OTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5NCA9IDY5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjk1ID0gNjk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTYgPSA2OTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5NyA9IDY5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjk4ID0gNjk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTkgPSA2OTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwMCA9IDcwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzAxID0gNzAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDIgPSA3MDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwMyA9IDcwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzA0ID0gNzA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDUgPSA3MDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwNiA9IDcwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzA3ID0gNzA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDggPSA3MDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwOSA9IDcwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzEwID0gNzEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTEgPSA3MTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxMiA9IDcxMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzEzID0gNzEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTQgPSA3MTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxNSA9IDcxNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzE2ID0gNzE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTcgPSA3MTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxOCA9IDcxOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzE5ID0gNzE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjAgPSA3MjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyMSA9IDcyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzIyID0gNzIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjMgPSA3MjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyNCA9IDcyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzI1ID0gNzI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjYgPSA3MjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyNyA9IDcyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzI4ID0gNzI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjkgPSA3MjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczMCA9IDczMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzMxID0gNzMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzIgPSA3MzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczMyA9IDczMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzM0ID0gNzM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzUgPSA3MzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczNiA9IDczNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzM3ID0gNzM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzggPSA3MzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczOSA9IDczOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQwID0gNzQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDEgPSA3NDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0MiA9IDc0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQzID0gNzQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDQgPSA3NDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0NSA9IDc0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQ2ID0gNzQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDcgPSA3NDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0OCA9IDc0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQ5ID0gNzQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTAgPSA3NTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1MSA9IDc1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzUyID0gNzUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTMgPSA3NTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1NCA9IDc1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzU1ID0gNzU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTYgPSA3NTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1NyA9IDc1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzU4ID0gNzU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTkgPSA3NTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2MCA9IDc2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzYxID0gNzYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjIgPSA3NjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2MyA9IDc2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzY0ID0gNzY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjUgPSA3NjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2NiA9IDc2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzY3ID0gNzY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjggPSA3NjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2OSA9IDc2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzcwID0gNzcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzEgPSA3NzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3MiA9IDc3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzczID0gNzczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzQgPSA3NzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3NSA9IDc3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzc2ID0gNzc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzcgPSA3NzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3OCA9IDc3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzc5ID0gNzc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODAgPSA3ODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4MSA9IDc4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzgyID0gNzgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODMgPSA3ODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4NCA9IDc4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzg1ID0gNzg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODYgPSA3ODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4NyA9IDc4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzg4ID0gNzg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODkgPSA3ODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5MCA9IDc5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzkxID0gNzkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTIgPSA3OTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5MyA9IDc5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzk0ID0gNzk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTUgPSA3OTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5NiA9IDc5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzk3ID0gNzk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTggPSA3OTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5OSA9IDc5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODAwID0gODAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDEgPSA4MDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwMiA9IDgwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODAzID0gODAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDQgPSA4MDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwNSA9IDgwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODA2ID0gODA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDcgPSA4MDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwOCA9IDgwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODA5ID0gODA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTAgPSA4MTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxMSA9IDgxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODEyID0gODEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTMgPSA4MTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxNCA9IDgxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODE1ID0gODE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTYgPSA4MTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxNyA9IDgxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODE4ID0gODE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTkgPSA4MTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyMCA9IDgyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODIxID0gODIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjIgPSA4MjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyMyA9IDgyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODI0ID0gODI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjUgPSA4MjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyNiA9IDgyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODI3ID0gODI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjggPSA4MjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyOSA9IDgyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODMwID0gODMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzEgPSA4MzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzMiA9IDgzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODMzID0gODMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzQgPSA4MzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzNSA9IDgzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODM2ID0gODM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzcgPSA4MzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzOCA9IDgzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODM5ID0gODM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDAgPSA4NDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0MSA9IDg0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQyID0gODQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDMgPSA4NDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0NCA9IDg0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQ1ID0gODQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDYgPSA4NDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0NyA9IDg0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQ4ID0gODQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDkgPSA4NDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1MCA9IDg1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODUxID0gODUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTIgPSA4NTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1MyA9IDg1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODU0ID0gODU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTUgPSA4NTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1NiA9IDg1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODU3ID0gODU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTggPSA4NTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1OSA9IDg1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODYwID0gODYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjEgPSA4NjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2MiA9IDg2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODYzID0gODYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjQgPSA4NjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2NSA9IDg2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODY2ID0gODY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjcgPSA4NjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2OCA9IDg2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODY5ID0gODY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzAgPSA4NzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3MSA9IDg3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODcyID0gODcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzMgPSA4NzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3NCA9IDg3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODc1ID0gODc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzYgPSA4NzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3NyA9IDg3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODc4ID0gODc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzkgPSA4NzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4MCA9IDg4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODgxID0gODgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODIgPSA4ODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4MyA9IDg4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODg0ID0gODg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODUgPSA4ODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4NiA9IDg4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODg3ID0gODg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODggPSA4ODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4OSA9IDg4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODkwID0gODkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTEgPSA4OTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5MiA9IDg5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODkzID0gODkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTQgPSA4OTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5NSA9IDg5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODk2ID0gODk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTcgPSA4OTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5OCA9IDg5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODk5ID0gODk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDAgPSA5MDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwMSA9IDkwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTAyID0gOTAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDMgPSA5MDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwNCA9IDkwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTA1ID0gOTA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDYgPSA5MDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwNyA9IDkwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTA4ID0gOTA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDkgPSA5MDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxMCA9IDkxMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTExID0gOTExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTIgPSA5MTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxMyA9IDkxMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTE0ID0gOTE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTUgPSA5MTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxNiA9IDkxNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTE3ID0gOTE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTggPSA5MTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxOSA9IDkxOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTIwID0gOTIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjEgPSA5MjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyMiA9IDkyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTIzID0gOTIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjQgPSA5MjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyNSA9IDkyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTI2ID0gOTI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjcgPSA5MjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyOCA9IDkyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTI5ID0gOTI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzAgPSA5MzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzMSA9IDkzMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTMyID0gOTMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzMgPSA5MzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzNCA9IDkzNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTM1ID0gOTM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzYgPSA5MzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzNyA9IDkzNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTM4ID0gOTM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzkgPSA5MzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0MCA9IDk0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQxID0gOTQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDIgPSA5NDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0MyA9IDk0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQ0ID0gOTQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDUgPSA5NDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0NiA9IDk0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQ3ID0gOTQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDggPSA5NDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0OSA9IDk0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTUwID0gOTUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTEgPSA5NTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1MiA9IDk1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTUzID0gOTUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTQgPSA5NTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1NSA9IDk1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTU2ID0gOTU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTcgPSA5NTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1OCA9IDk1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTU5ID0gOTU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjAgPSA5NjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2MSA9IDk2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTYyID0gOTYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjMgPSA5NjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2NCA9IDk2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTY1ID0gOTY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjYgPSA5NjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2NyA9IDk2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTY4ID0gOTY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjkgPSA5NjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3MCA9IDk3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTcxID0gOTcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzIgPSA5NzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3MyA9IDk3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTc0ID0gOTc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzUgPSA5NzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3NiA9IDk3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTc3ID0gOTc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzggPSA5NzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3OSA9IDk3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTgwID0gOTgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODEgPSA5ODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4MiA9IDk4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTgzID0gOTgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODQgPSA5ODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4NSA9IDk4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTg2ID0gOTg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODcgPSA5ODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4OCA9IDk4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTg5ID0gOTg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTAgPSA5OTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5MSA9IDk5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTkyID0gOTkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTMgPSA5OTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5NCA9IDk5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTk1ID0gOTk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTYgPSA5OTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5NyA9IDk5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTk4ID0gOTk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTkgPSA5OTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwMDAgPSAxMDAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMDNlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90bwpAQCAtMCwwICsxLDczIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gQSBwcm90byBmaWxlIHdoaWNoIGlzIGltcG9ydGVkIGJ5IHVuaXR0ZXN0LnByb3RvIHRvIHRlc3QgaW1wb3J0aW5nLgorCitzeW50YXggPSAicHJvdG8yIjsKKworLy8gV2UgZG9uJ3QgcHV0IHRoaXMgaW4gYSBwYWNrYWdlIHdpdGhpbiBwcm90bzIgYmVjYXVzZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorLy8gdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgZG9lc24ndCBkZXBlbmQgb24gYmVpbmcgaW4gdGhlIHByb3RvMiBuYW1lc3BhY2UuCisvLyBJbiB0ZXN0X3V0aWwuaCB3ZSBkbworLy8gInVzaW5nIG5hbWVzcGFjZSB1bml0dGVzdF9pbXBvcnQgPSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQiLgorcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKKworLy8gRXhlcmNpc2UgdGhlIGphdmFfcGFja2FnZSBvcHRpb24uCitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYudGVzdCI7CisKKy8vIERvIG5vdCBzZXQgYSBqYXZhX291dGVyX2NsYXNzbmFtZSBoZXJlIHRvIHZlcmlmeSB0aGF0IFByb3RvMiB3b3JrcyB3aXRob3V0CisvLyBvbmUuCisKKy8vIFRlc3QgcHVibGljIGltcG9ydAoraW1wb3J0IHB1YmxpYyAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8iOworCittZXNzYWdlIEltcG9ydE1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiBkID0gMTsKK30KKworZW51bSBJbXBvcnRFbnVtIHsKKyAgSU1QT1JUX0ZPTyA9IDc7CisgIElNUE9SVF9CQVIgPSA4OworICBJTVBPUlRfQkFaID0gOTsKK30KKworCisvLyBUbyB1c2UgYW4gZW51bSBpbiBhIG1hcCwgaXQgbXVzdCBoYXMgdGhlIGZpcnN0IHZhbHVlIGFzIDAuCitlbnVtIEltcG9ydEVudW1Gb3JNYXAgeworICBVTktOT1dOID0gMDsKKyAgRk9PID0gMTsKKyAgQkFSID0gMjsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YWZhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvCkBAIC0wLDAgKzEsNTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLworLy8gVGhpcyBpcyBsaWtlIHVuaXR0ZXN0X2ltcG9ydC5wcm90byBidXQgd2l0aCBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUUuCisKK3N5bnRheCA9ICJwcm90bzIiOworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CisKK2ltcG9ydCBwdWJsaWMgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucHJvdG8iOworCittZXNzYWdlIEltcG9ydE1lc3NhZ2VMaXRlIHsKKyAgb3B0aW9uYWwgaW50MzIgZCA9IDE7Cit9CisKK2VudW0gSW1wb3J0RW51bUxpdGUgeworICBJTVBPUlRfTElURV9GT08gPSA3OworICBJTVBPUlRfTElURV9CQVIgPSA4OworICBJTVBPUlRfTElURV9CQVogPSA5OworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYWY3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8KQEAgLTAsMCArMSw0MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogbGl1amlzaUBnb29nbGUuY29tIChQaGVybCBMaXUpCisKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydDsKKworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3QiOworCittZXNzYWdlIFB1YmxpY0ltcG9ydE1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiBlID0gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1NDljMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnByb3RvCkBAIC0wLDAgKzEsNDMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGxpdWppc2lAZ29vZ2xlLmNvbSAoUGhlcmwgTGl1KQorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CisKK21lc3NhZ2UgUHVibGljSW1wb3J0TWVzc2FnZUxpdGUgeworICBvcHRpb25hbCBpbnQzMiBlID0gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXMucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNWVmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzLnByb3RvCkBAIC0wLDAgKzEsNzUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHRyYWZhY3pAZ29vZ2xlLmNvbSAoVG9kZCBSYWZhY3opCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBBIHByb3RvIGZpbGUgd2Ugd2lsbCB1c2UgZm9yIHVuaXQgdGVzdGluZy4KKworc3ludGF4ID0gInByb3RvMiI7CisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2N1c3RvbV9vcHRpb24ucHJvdG8iOworCisvLyBTb21lIGdlbmVyaWNfc2VydmljZXMgb3B0aW9uKHMpIGFkZGVkIGF1dG9tYXRpY2FsbHkuCisvLyBTZWU6ICBodHRwOi8vZ28vcHJvdG8yLWdlbmVyaWMtc2VydmljZXMtZGVmYXVsdAorb3B0aW9uIGNjX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgIC8vIGF1dG8tYWRkZWQKK29wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAvLyBhdXRvLWFkZGVkCitvcHRpb24gcHlfZ2VuZXJpY19zZXJ2aWNlcyA9IHRydWU7ICAgLy8gYXV0by1hZGRlZAorb3B0aW9uIGNjX2VuYWJsZV9hcmVuYXMgPSB0cnVlOworCisvLyBXZSBkb24ndCBwdXQgdGhpcyBpbiBhIHBhY2thZ2Ugd2l0aGluIHByb3RvMiBiZWNhdXNlIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisvLyB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBkb2Vzbid0IGRlcGVuZCBvbiBiZWluZyBpbiB0aGUgcHJvdG8yIG5hbWVzcGFjZS4KKy8vIEluIHRlc3RfdXRpbC5oIHdlIGRvICJ1c2luZyBuYW1lc3BhY2UgdW5pdHRlc3QgPSBwcm90b2J1Zl91bml0dGVzdCIuCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0LmxhenlfaW1wb3J0czsKKworLy8gUHJvdG9zIG9wdGltaXplZCBmb3IgU1BFRUQgdXNlIGEgc3RyaWN0IHN1cGVyc2V0IG9mIHRoZSBnZW5lcmF0ZWQgY29kZQorLy8gb2YgZXF1aXZhbGVudCBvbmVzIG9wdGltaXplZCBmb3IgQ09ERV9TSVpFLCBzbyB3ZSBzaG91bGQgb3B0aW1pemUgYWxsIG91cgorLy8gdGVzdHMgZm9yIHNwZWVkIHVubGVzcyBleHBsaWNpdGx5IHRlc3RpbmcgY29kZSBzaXplIG9wdGltaXphdGlvbi4KK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKKworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIlVuaXR0ZXN0TGF6eUltcG9ydHNQcm90byI7CisKKy8vIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgdG8gdGVzdCB0aGF0IHRoZSBwcm90byBmaWxlCisvLyB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmb2xsb3dpbmcgZmllbGQgdHlwZXMgaXMKKy8vIG5vdCBidWlsdCB3aGVuIHRoaXMgcHJvdG8gZmlsZSBpcyBidWlsdC4gVGhlbiB0ZXN0CisvLyB0aGF0IGNhbGxpbmcgbWVzc2FnZV90eXBlKCkgZXRjIHdpbGwgYnVpbGQgdGhlIGNvcnJlY3QKKy8vIGRlc2NyaXB0b3IgbGF6aWx5IGFuZCByZXR1cm4gaXQuCisKK21lc3NhZ2UgSW1wb3J0ZWRNZXNzYWdlIHsKKyAgb3B0aW9uYWwgTGF6eU1lc3NhZ2UgbGF6eV9tZXNzYWdlID0gMTsKK30KKworbWVzc2FnZSBNZXNzYWdlQ3VzdG9tT3B0aW9uIHsKK30KKworbWVzc2FnZSBNZXNzYWdlQ3VzdG9tT3B0aW9uMiB7CisgIG9wdGlvbiAobGF6eV9lbnVtX29wdGlvbikgPSBMQVpZX0VOVU1fMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfY3VzdG9tX29wdGlvbi5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjQzODI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19jdXN0b21fb3B0aW9uLnByb3RvCkBAIC0wLDAgKzEsNjcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHRyYWZhY3pAZ29vZ2xlLmNvbSAoVG9kZCBSYWZhY3opCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBBIHByb3RvIGZpbGUgd2Ugd2lsbCB1c2UgZm9yIHVuaXQgdGVzdGluZy4KKworc3ludGF4ID0gInByb3RvMiI7CisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xhenlfZGVwZW5kZW5jaWVzX2VudW0ucHJvdG8iOworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byI7CisKKy8vIFNvbWUgZ2VuZXJpY19zZXJ2aWNlcyBvcHRpb24ocykgYWRkZWQgYXV0b21hdGljYWxseS4KKy8vIFNlZTogIGh0dHA6Ly9nby9wcm90bzItZ2VuZXJpYy1zZXJ2aWNlcy1kZWZhdWx0CitvcHRpb24gY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IHRydWU7ICAgLy8gYXV0by1hZGRlZAorb3B0aW9uIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IHRydWU7IC8vIGF1dG8tYWRkZWQKK29wdGlvbiBweV9nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAvLyBhdXRvLWFkZGVkCitvcHRpb24gY2NfZW5hYmxlX2FyZW5hcyA9IHRydWU7CisKKy8vIFdlIGRvbid0IHB1dCB0aGlzIGluIGEgcGFja2FnZSB3aXRoaW4gcHJvdG8yIGJlY2F1c2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUKKy8vIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGRvZXNuJ3QgZGVwZW5kIG9uIGJlaW5nIGluIHRoZSBwcm90bzIgbmFtZXNwYWNlLgorLy8gSW4gdGVzdF91dGlsLmggd2UgZG8gInVzaW5nIG5hbWVzcGFjZSB1bml0dGVzdCA9IHByb3RvYnVmX3VuaXR0ZXN0Ii4KK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3QubGF6eV9pbXBvcnRzOworCisvLyBQcm90b3Mgb3B0aW1pemVkIGZvciBTUEVFRCB1c2UgYSBzdHJpY3Qgc3VwZXJzZXQgb2YgdGhlIGdlbmVyYXRlZCBjb2RlCisvLyBvZiBlcXVpdmFsZW50IG9uZXMgb3B0aW1pemVkIGZvciBDT0RFX1NJWkUsIHNvIHdlIHNob3VsZCBvcHRpbWl6ZSBhbGwgb3VyCisvLyB0ZXN0cyBmb3Igc3BlZWQgdW5sZXNzIGV4cGxpY2l0bHkgdGVzdGluZyBjb2RlIHNpemUgb3B0aW1pemF0aW9uLgorb3B0aW9uIG9wdGltaXplX2ZvciA9IFNQRUVEOworCitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiVW5pdHRlc3RMYXp5SW1wb3J0c0N1c3RvbU9wdGlvblByb3RvIjsKKworbWVzc2FnZSBMYXp5TWVzc2FnZSB7CisgIG9wdGlvbmFsIGludDMyIGEgPSAxOworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIHsKKyAgb3B0aW9uYWwgTGF6eUVudW0gbGF6eV9lbnVtX29wdGlvbiA9IDEzODU5NjMzNSBbZGVmYXVsdCA9IExBWllfRU5VTV8xXTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGF6eV9kZXBlbmRlbmNpZXNfZW51bS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmU2NGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9sYXp5X2RlcGVuZGVuY2llc19lbnVtLnByb3RvCkBAIC0wLDAgKzEsNjEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHRyYWZhY3pAZ29vZ2xlLmNvbSAoVG9kZCBSYWZhY3opCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBBIHByb3RvIGZpbGUgd2Ugd2lsbCB1c2UgZm9yIHVuaXQgdGVzdGluZy4KKworc3ludGF4ID0gInByb3RvMiI7CisKKy8vIFNvbWUgZ2VuZXJpY19zZXJ2aWNlcyBvcHRpb24ocykgYWRkZWQgYXV0b21hdGljYWxseS4KKy8vIFNlZTogIGh0dHA6Ly9nby9wcm90bzItZ2VuZXJpYy1zZXJ2aWNlcy1kZWZhdWx0CitvcHRpb24gY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IHRydWU7ICAgLy8gYXV0by1hZGRlZAorb3B0aW9uIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IHRydWU7IC8vIGF1dG8tYWRkZWQKK29wdGlvbiBweV9nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAvLyBhdXRvLWFkZGVkCitvcHRpb24gY2NfZW5hYmxlX2FyZW5hcyA9IHRydWU7CisKKy8vIFdlIGRvbid0IHB1dCB0aGlzIGluIGEgcGFja2FnZSB3aXRoaW4gcHJvdG8yIGJlY2F1c2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUKKy8vIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGRvZXNuJ3QgZGVwZW5kIG9uIGJlaW5nIGluIHRoZSBwcm90bzIgbmFtZXNwYWNlLgorLy8gSW4gdGVzdF91dGlsLmggd2UgZG8gInVzaW5nIG5hbWVzcGFjZSB1bml0dGVzdCA9IHByb3RvYnVmX3VuaXR0ZXN0Ii4KK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3QubGF6eV9pbXBvcnRzOworCisvLyBQcm90b3Mgb3B0aW1pemVkIGZvciBTUEVFRCB1c2UgYSBzdHJpY3Qgc3VwZXJzZXQgb2YgdGhlIGdlbmVyYXRlZCBjb2RlCisvLyBvZiBlcXVpdmFsZW50IG9uZXMgb3B0aW1pemVkIGZvciBDT0RFX1NJWkUsIHNvIHdlIHNob3VsZCBvcHRpbWl6ZSBhbGwgb3VyCisvLyB0ZXN0cyBmb3Igc3BlZWQgdW5sZXNzIGV4cGxpY2l0bHkgdGVzdGluZyBjb2RlIHNpemUgb3B0aW1pemF0aW9uLgorb3B0aW9uIG9wdGltaXplX2ZvciA9IFNQRUVEOworCitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiVW5pdHRlc3RMYXp5SW1wb3J0c0VudW1Qcm90byI7CisKK2VudW0gTGF6eUVudW0geworICBMQVpZX0VOVU1fMCA9IDA7CisgIExBWllfRU5VTV8xID0gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTBkNGE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnByb3RvCkBAIC0wLDAgKzEsNTIwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIFRoaXMgaXMgbGlrZSB1bml0dGVzdC5wcm90byBidXQgd2l0aCBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUUuCisKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wcm90byI7CisKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOworCisvLyBTYW1lIGFzIFRlc3RBbGxUeXBlcyBidXQgd2l0aCB0aGUgbGl0ZSBydW50aW1lLgorbWVzc2FnZSBUZXN0QWxsVHlwZXNMaXRlIHsKKyAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKKyAgICBvcHRpb25hbCBpbnQzMiBiYiA9IDE7CisgICAgb3B0aW9uYWwgaW50NjQgY2MgPSAyOworICB9CisKKyAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlMiB7CisgICAgb3B0aW9uYWwgaW50MzIgZGQgPSAxOworICB9CisKKyAgZW51bSBOZXN0ZWRFbnVtIHsKKyAgICBGT08gPSAxOworICAgIEJBUiA9IDI7CisgICAgQkFaID0gMzsKKyAgfQorCisgIC8vIFNpbmd1bGFyCisgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyID0gMTsKKyAgb3B0aW9uYWwgaW50NjQgb3B0aW9uYWxfaW50NjQgPSAyOworICBvcHRpb25hbCB1aW50MzIgb3B0aW9uYWxfdWludDMyID0gMzsKKyAgb3B0aW9uYWwgdWludDY0IG9wdGlvbmFsX3VpbnQ2NCA9IDQ7CisgIG9wdGlvbmFsIHNpbnQzMiBvcHRpb25hbF9zaW50MzIgPSA1OworICBvcHRpb25hbCBzaW50NjQgb3B0aW9uYWxfc2ludDY0ID0gNjsKKyAgb3B0aW9uYWwgZml4ZWQzMiBvcHRpb25hbF9maXhlZDMyID0gNzsKKyAgb3B0aW9uYWwgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0ID0gODsKKyAgb3B0aW9uYWwgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzIgPSA5OworICBvcHRpb25hbCBzZml4ZWQ2NCBvcHRpb25hbF9zZml4ZWQ2NCA9IDEwOworICBvcHRpb25hbCBmbG9hdCBvcHRpb25hbF9mbG9hdCA9IDExOworICBvcHRpb25hbCBkb3VibGUgb3B0aW9uYWxfZG91YmxlID0gMTI7CisgIG9wdGlvbmFsIGJvb2wgb3B0aW9uYWxfYm9vbCA9IDEzOworICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nID0gMTQ7CisgIG9wdGlvbmFsIGJ5dGVzIG9wdGlvbmFsX2J5dGVzID0gMTU7CisKKyAgb3B0aW9uYWwgZ3JvdXAgT3B0aW9uYWxHcm91cCA9IDE2IHsKKyAgICBvcHRpb25hbCBpbnQzMiBhID0gMTc7CisgIH0KKworICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlID0gMTg7CisgIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlTGl0ZSBvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgPSAxOTsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2VMaXRlIG9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlID0KKyAgICAgIDIwOworCisgIG9wdGlvbmFsIE5lc3RlZEVudW0gb3B0aW9uYWxfbmVzdGVkX2VudW0gPSAyMTsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW1MaXRlIG9wdGlvbmFsX2ZvcmVpZ25fZW51bSA9IDIyOworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bUxpdGUgb3B0aW9uYWxfaW1wb3J0X2VudW0gPSAyMzsKKworICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nX3BpZWNlID0gMjQgW2N0eXBlID0gU1RSSU5HX1BJRUNFXTsKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX2NvcmQgPSAyNSBbY3R5cGUgPSBDT1JEXTsKKworICAvLyBEZWZpbmVkIGluIHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8KKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LlB1YmxpY0ltcG9ydE1lc3NhZ2VMaXRlCisgICAgICBvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UgPSAyNjsKKworICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX2xhenlfbWVzc2FnZSA9IDI3IFtsYXp5ID0gdHJ1ZV07CisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfdW52ZXJpZmllZF9sYXp5X21lc3NhZ2UgPSAyOAorICAgICAgW3VudmVyaWZpZWRfbGF6eSA9IHRydWVdOworCisgIC8vIFJlcGVhdGVkCisgIHJlcGVhdGVkIGludDMyIHJlcGVhdGVkX2ludDMyID0gMzE7CisgIHJlcGVhdGVkIGludDY0IHJlcGVhdGVkX2ludDY0ID0gMzI7CisgIHJlcGVhdGVkIHVpbnQzMiByZXBlYXRlZF91aW50MzIgPSAzMzsKKyAgcmVwZWF0ZWQgdWludDY0IHJlcGVhdGVkX3VpbnQ2NCA9IDM0OworICByZXBlYXRlZCBzaW50MzIgcmVwZWF0ZWRfc2ludDMyID0gMzU7CisgIHJlcGVhdGVkIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgPSAzNjsKKyAgcmVwZWF0ZWQgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyID0gMzc7CisgIHJlcGVhdGVkIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NCA9IDM4OworICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9IDM5OworICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDQwOworICByZXBlYXRlZCBmbG9hdCByZXBlYXRlZF9mbG9hdCA9IDQxOworICByZXBlYXRlZCBkb3VibGUgcmVwZWF0ZWRfZG91YmxlID0gNDI7CisgIHJlcGVhdGVkIGJvb2wgcmVwZWF0ZWRfYm9vbCA9IDQzOworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nID0gNDQ7CisgIHJlcGVhdGVkIGJ5dGVzIHJlcGVhdGVkX2J5dGVzID0gNDU7CisKKyAgcmVwZWF0ZWQgZ3JvdXAgUmVwZWF0ZWRHcm91cCA9IDQ2IHsKKyAgICBvcHRpb25hbCBpbnQzMiBhID0gNDc7CisgIH0KKworICByZXBlYXRlZCBOZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlID0gNDg7CisgIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlTGl0ZSByZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UgPSA0OTsKKyAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2VMaXRlIHJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlID0KKyAgICAgIDUwOworCisgIHJlcGVhdGVkIE5lc3RlZEVudW0gcmVwZWF0ZWRfbmVzdGVkX2VudW0gPSA1MTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW1MaXRlIHJlcGVhdGVkX2ZvcmVpZ25fZW51bSA9IDUyOworICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bUxpdGUgcmVwZWF0ZWRfaW1wb3J0X2VudW0gPSA1MzsKKworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3BpZWNlID0gNTQgW2N0eXBlID0gU1RSSU5HX1BJRUNFXTsKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX2NvcmQgPSA1NSBbY3R5cGUgPSBDT1JEXTsKKworICByZXBlYXRlZCBOZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX2xhenlfbWVzc2FnZSA9IDU3IFtsYXp5ID0gdHJ1ZV07CisKKyAgLy8gU2luZ3VsYXIgd2l0aCBkZWZhdWx0cworICBvcHRpb25hbCBpbnQzMiBkZWZhdWx0X2ludDMyID0gNjEgW2RlZmF1bHQgPSA0MV07CisgIG9wdGlvbmFsIGludDY0IGRlZmF1bHRfaW50NjQgPSA2MiBbZGVmYXVsdCA9IDQyXTsKKyAgb3B0aW9uYWwgdWludDMyIGRlZmF1bHRfdWludDMyID0gNjMgW2RlZmF1bHQgPSA0M107CisgIG9wdGlvbmFsIHVpbnQ2NCBkZWZhdWx0X3VpbnQ2NCA9IDY0IFtkZWZhdWx0ID0gNDRdOworICBvcHRpb25hbCBzaW50MzIgZGVmYXVsdF9zaW50MzIgPSA2NSBbZGVmYXVsdCA9IC00NV07CisgIG9wdGlvbmFsIHNpbnQ2NCBkZWZhdWx0X3NpbnQ2NCA9IDY2IFtkZWZhdWx0ID0gNDZdOworICBvcHRpb25hbCBmaXhlZDMyIGRlZmF1bHRfZml4ZWQzMiA9IDY3IFtkZWZhdWx0ID0gNDddOworICBvcHRpb25hbCBmaXhlZDY0IGRlZmF1bHRfZml4ZWQ2NCA9IDY4IFtkZWZhdWx0ID0gNDhdOworICBvcHRpb25hbCBzZml4ZWQzMiBkZWZhdWx0X3NmaXhlZDMyID0gNjkgW2RlZmF1bHQgPSA0OV07CisgIG9wdGlvbmFsIHNmaXhlZDY0IGRlZmF1bHRfc2ZpeGVkNjQgPSA3MCBbZGVmYXVsdCA9IC01MF07CisgIG9wdGlvbmFsIGZsb2F0IGRlZmF1bHRfZmxvYXQgPSA3MSBbZGVmYXVsdCA9IDUxLjVdOworICBvcHRpb25hbCBkb3VibGUgZGVmYXVsdF9kb3VibGUgPSA3MiBbZGVmYXVsdCA9IDUyZTNdOworICBvcHRpb25hbCBib29sIGRlZmF1bHRfYm9vbCA9IDczIFtkZWZhdWx0ID0gdHJ1ZV07CisgIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3N0cmluZyA9IDc0IFtkZWZhdWx0ID0gImhlbGxvIl07CisgIG9wdGlvbmFsIGJ5dGVzIGRlZmF1bHRfYnl0ZXMgPSA3NSBbZGVmYXVsdCA9ICJ3b3JsZCJdOworCisgIG9wdGlvbmFsIE5lc3RlZEVudW0gZGVmYXVsdF9uZXN0ZWRfZW51bSA9IDgxIFtkZWZhdWx0ID0gQkFSXTsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW1MaXRlIGRlZmF1bHRfZm9yZWlnbl9lbnVtID0gODIKKyAgICAgIFtkZWZhdWx0ID0gRk9SRUlHTl9MSVRFX0JBUl07CisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtTGl0ZSBkZWZhdWx0X2ltcG9ydF9lbnVtID0gODMKKyAgICAgIFtkZWZhdWx0ID0gSU1QT1JUX0xJVEVfQkFSXTsKKworICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9zdHJpbmdfcGllY2UgPSA4NAorICAgICAgW2N0eXBlID0gU1RSSU5HX1BJRUNFLCBkZWZhdWx0ID0gImFiYyJdOworICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9jb3JkID0gODUgW2N0eXBlID0gQ09SRCwgZGVmYXVsdCA9ICIxMjMiXTsKKworICAvLyBGb3Igb25lb2YgdGVzdAorICBvbmVvZiBvbmVvZl9maWVsZCB7CisgICAgdWludDMyIG9uZW9mX3VpbnQzMiA9IDExMTsKKyAgICBOZXN0ZWRNZXNzYWdlIG9uZW9mX25lc3RlZF9tZXNzYWdlID0gMTEyOworICAgIHN0cmluZyBvbmVvZl9zdHJpbmcgPSAxMTM7CisgICAgYnl0ZXMgb25lb2ZfYnl0ZXMgPSAxMTQ7CisgICAgTmVzdGVkTWVzc2FnZSBvbmVvZl9sYXp5X25lc3RlZF9tZXNzYWdlID0gMTE1IFtsYXp5ID0gdHJ1ZV07CisgICAgTmVzdGVkTWVzc2FnZTIgb25lb2ZfbmVzdGVkX21lc3NhZ2UyID0gMTE3OworICB9CisKKyAgLy8gVGVzdHMgdG9TdHJpbmcgZm9yIG5vbi1yZXBlYXRlZCBmaWVsZHMgd2l0aCBhIGxpc3Qgc3VmZml4CisgIG9wdGlvbmFsIGludDMyIGRlY2VwdGl2ZWx5X25hbWVkX2xpc3QgPSAxMTY7Cit9CisKK21lc3NhZ2UgRm9yZWlnbk1lc3NhZ2VMaXRlIHsKKyAgb3B0aW9uYWwgaW50MzIgYyA9IDE7Cit9CisKK2VudW0gRm9yZWlnbkVudW1MaXRlIHsKKyAgRk9SRUlHTl9MSVRFX0ZPTyA9IDQ7CisgIEZPUkVJR05fTElURV9CQVogPSA2OworICBGT1JFSUdOX0xJVEVfQkFSID0gNTsKK30KKworbWVzc2FnZSBUZXN0UGFja2VkVHlwZXNMaXRlIHsKKyAgcmVwZWF0ZWQgaW50MzIgcGFja2VkX2ludDMyID0gOTAgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBpbnQ2NCBwYWNrZWRfaW50NjQgPSA5MSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHVpbnQzMiBwYWNrZWRfdWludDMyID0gOTIgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCB1aW50NjQgcGFja2VkX3VpbnQ2NCA9IDkzIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ludDMyIHBhY2tlZF9zaW50MzIgPSA5NCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNpbnQ2NCBwYWNrZWRfc2ludDY0ID0gOTUgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBmaXhlZDMyIHBhY2tlZF9maXhlZDMyID0gOTYgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBmaXhlZDY0IHBhY2tlZF9maXhlZDY0ID0gOTcgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQzMiBwYWNrZWRfc2ZpeGVkMzIgPSA5OCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHBhY2tlZF9zZml4ZWQ2NCA9IDk5IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgZmxvYXQgcGFja2VkX2Zsb2F0ID0gMTAwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgZG91YmxlIHBhY2tlZF9kb3VibGUgPSAxMDEgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBib29sIHBhY2tlZF9ib29sID0gMTAyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW1MaXRlIHBhY2tlZF9lbnVtID0gMTAzIFtwYWNrZWQgPSB0cnVlXTsKK30KKworbWVzc2FnZSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgeworICBleHRlbnNpb25zIDEgdG8gbWF4OworfQorCitleHRlbmQgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIHsKKyAgLy8gU2luZ3VsYXIKKyAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uX2xpdGUgPSAxOworICBvcHRpb25hbCBpbnQ2NCBvcHRpb25hbF9pbnQ2NF9leHRlbnNpb25fbGl0ZSA9IDI7CisgIG9wdGlvbmFsIHVpbnQzMiBvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgPSAzOworICBvcHRpb25hbCB1aW50NjQgb3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl9saXRlID0gNDsKKyAgb3B0aW9uYWwgc2ludDMyIG9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb25fbGl0ZSA9IDU7CisgIG9wdGlvbmFsIHNpbnQ2NCBvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgPSA2OworICBvcHRpb25hbCBmaXhlZDMyIG9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgPSA3OworICBvcHRpb25hbCBmaXhlZDY0IG9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgPSA4OworICBvcHRpb25hbCBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSA9IDk7CisgIG9wdGlvbmFsIHNmaXhlZDY0IG9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlID0gMTA7CisgIG9wdGlvbmFsIGZsb2F0IG9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbl9saXRlID0gMTE7CisgIG9wdGlvbmFsIGRvdWJsZSBvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgPSAxMjsKKyAgb3B0aW9uYWwgYm9vbCBvcHRpb25hbF9ib29sX2V4dGVuc2lvbl9saXRlID0gMTM7CisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgPSAxNDsKKyAgb3B0aW9uYWwgYnl0ZXMgb3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgPSAxNTsKKworICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlID0gMTYgeworICAgIG9wdGlvbmFsIGludDMyIGEgPSAxNzsKKyAgfQorCisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZQorICAgICAgb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgPSAxODsKKyAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2VMaXRlIG9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSA9IDE5OworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZUxpdGUKKyAgICAgIG9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gMjA7CisKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtIG9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlID0gMjE7CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtTGl0ZSBvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUgPSAyMjsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW1MaXRlCisgICAgICBvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSA9IDIzOworCisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uX2xpdGUgPSAyNAorICAgICAgW2N0eXBlID0gU1RSSU5HX1BJRUNFXTsKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uX2xpdGUgPSAyNSBbY3R5cGUgPSBDT1JEXTsKKworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuUHVibGljSW1wb3J0TWVzc2FnZUxpdGUKKyAgICAgIG9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSA9IDI2OworCisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgPQorICAgICAgMjcgW2xhenkgPSB0cnVlXTsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlCisgICAgICBvcHRpb25hbF91bnZlcmlmaWVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSA9IDI4CisgICAgICBbdW52ZXJpZmllZF9sYXp5ID0gdHJ1ZV07CisKKyAgLy8gUmVwZWF0ZWQKKyAgcmVwZWF0ZWQgaW50MzIgcmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgPSAzMTsKKyAgcmVwZWF0ZWQgaW50NjQgcmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgPSAzMjsKKyAgcmVwZWF0ZWQgdWludDMyIHJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSA9IDMzOworICByZXBlYXRlZCB1aW50NjQgcmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlID0gMzQ7CisgIHJlcGVhdGVkIHNpbnQzMiByZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgPSAzNTsKKyAgcmVwZWF0ZWQgc2ludDY0IHJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSA9IDM2OworICByZXBlYXRlZCBmaXhlZDMyIHJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgPSAzNzsKKyAgcmVwZWF0ZWQgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlID0gMzg7CisgIHJlcGVhdGVkIHNmaXhlZDMyIHJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlID0gMzk7CisgIHJlcGVhdGVkIHNmaXhlZDY0IHJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlID0gNDA7CisgIHJlcGVhdGVkIGZsb2F0IHJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlID0gNDE7CisgIHJlcGVhdGVkIGRvdWJsZSByZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgPSA0MjsKKyAgcmVwZWF0ZWQgYm9vbCByZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlID0gNDM7CisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgPSA0NDsKKyAgcmVwZWF0ZWQgYnl0ZXMgcmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgPSA0NTsKKworICByZXBlYXRlZCBncm91cCBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlID0gNDYgeworICAgIG9wdGlvbmFsIGludDMyIGEgPSA0NzsKKyAgfQorCisgIHJlcGVhdGVkIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZQorICAgICAgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgPSA0ODsKKyAgcmVwZWF0ZWQgRm9yZWlnbk1lc3NhZ2VMaXRlIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSA9IDQ5OworICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZUxpdGUKKyAgICAgIHJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gNTA7CisKKyAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtIHJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlID0gNTE7CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtTGl0ZSByZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUgPSA1MjsKKyAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW1MaXRlCisgICAgICByZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSA9IDUzOworCisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uX2xpdGUgPSA1NAorICAgICAgW2N0eXBlID0gU1RSSU5HX1BJRUNFXTsKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uX2xpdGUgPSA1NSBbY3R5cGUgPSBDT1JEXTsKKworICByZXBlYXRlZCBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UgcmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0KKyAgICAgIDU3IFtsYXp5ID0gdHJ1ZV07CisKKyAgLy8gU2luZ3VsYXIgd2l0aCBkZWZhdWx0cworICBvcHRpb25hbCBpbnQzMiBkZWZhdWx0X2ludDMyX2V4dGVuc2lvbl9saXRlID0gNjEgW2RlZmF1bHQgPSA0MV07CisgIG9wdGlvbmFsIGludDY0IGRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgPSA2MiBbZGVmYXVsdCA9IDQyXTsKKyAgb3B0aW9uYWwgdWludDMyIGRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl9saXRlID0gNjMgW2RlZmF1bHQgPSA0M107CisgIG9wdGlvbmFsIHVpbnQ2NCBkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb25fbGl0ZSA9IDY0IFtkZWZhdWx0ID0gNDRdOworICBvcHRpb25hbCBzaW50MzIgZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgPSA2NSBbZGVmYXVsdCA9IC00NV07CisgIG9wdGlvbmFsIHNpbnQ2NCBkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25fbGl0ZSA9IDY2IFtkZWZhdWx0ID0gNDZdOworICBvcHRpb25hbCBmaXhlZDMyIGRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSA9IDY3IFtkZWZhdWx0ID0gNDddOworICBvcHRpb25hbCBmaXhlZDY0IGRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSA9IDY4IFtkZWZhdWx0ID0gNDhdOworICBvcHRpb25hbCBzZml4ZWQzMiBkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlID0gNjkgW2RlZmF1bHQgPSA0OV07CisgIG9wdGlvbmFsIHNmaXhlZDY0IGRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgPSA3MCBbZGVmYXVsdCA9IC01MF07CisgIG9wdGlvbmFsIGZsb2F0IGRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgPSA3MSBbZGVmYXVsdCA9IDUxLjVdOworICBvcHRpb25hbCBkb3VibGUgZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgPSA3MiBbZGVmYXVsdCA9IDUyZTNdOworICBvcHRpb25hbCBib29sIGRlZmF1bHRfYm9vbF9leHRlbnNpb25fbGl0ZSA9IDczIFtkZWZhdWx0ID0gdHJ1ZV07CisgIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3N0cmluZ19leHRlbnNpb25fbGl0ZSA9IDc0IFtkZWZhdWx0ID0gImhlbGxvIl07CisgIG9wdGlvbmFsIGJ5dGVzIGRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgPSA3NSBbZGVmYXVsdCA9ICJ3b3JsZCJdOworCisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bSBkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlID0gODEKKyAgICAgIFtkZWZhdWx0ID0gQkFSXTsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW1MaXRlIGRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlID0gODIKKyAgICAgIFtkZWZhdWx0ID0gRk9SRUlHTl9MSVRFX0JBUl07CisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtTGl0ZQorICAgICAgZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSA9IDgzIFtkZWZhdWx0ID0gSU1QT1JUX0xJVEVfQkFSXTsKKworICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uX2xpdGUgPSA4NAorICAgICAgW2N0eXBlID0gU1RSSU5HX1BJRUNFLCBkZWZhdWx0ID0gImFiYyJdOworICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9jb3JkX2V4dGVuc2lvbl9saXRlID0gODUKKyAgICAgIFtjdHlwZSA9IENPUkQsIGRlZmF1bHQgPSAiMTIzIl07CisKKyAgLy8gRm9yIG9uZW9mIHRlc3QKKyAgb3B0aW9uYWwgdWludDMyIG9uZW9mX3VpbnQzMl9leHRlbnNpb25fbGl0ZSA9IDExMTsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlIG9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0KKyAgICAgIDExMjsKKyAgb3B0aW9uYWwgc3RyaW5nIG9uZW9mX3N0cmluZ19leHRlbnNpb25fbGl0ZSA9IDExMzsKKyAgb3B0aW9uYWwgYnl0ZXMgb25lb2ZfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgPSAxMTQ7Cit9CisKK21lc3NhZ2UgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIHsKKyAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKK30KKworZXh0ZW5kIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSB7CisgIHJlcGVhdGVkIGludDMyIHBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSA9IDkwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgaW50NjQgcGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlID0gOTEgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCB1aW50MzIgcGFja2VkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSA9IDkyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgdWludDY0IHBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgPSA5MyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNpbnQzMiBwYWNrZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlID0gOTQgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzaW50NjQgcGFja2VkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSA9IDk1IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgZml4ZWQzMiBwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSA9IDk2IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgZml4ZWQ2NCBwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSA9IDk3IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlID0gOTggW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQ2NCBwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgPSA5OSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIGZsb2F0IHBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSA9IDEwMCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIGRvdWJsZSBwYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlID0gMTAxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgYm9vbCBwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSA9IDEwMiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtTGl0ZSBwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSA9IDEwMyBbcGFja2VkID0gdHJ1ZV07Cit9CisKK21lc3NhZ2UgVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUgeworICBleHRlbmQgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIHsKKyAgICBvcHRpb25hbCBpbnQzMiBuZXN0ZWRfZXh0ZW5zaW9uID0gMTIzNDU7CisgIH0KK30KKworLy8gVGVzdCB0aGF0IGRlcHJlY2F0ZWQgZmllbGRzIHdvcmsuICBXZSBvbmx5IHZlcmlmeSB0aGF0IHRoZXkgY29tcGlsZSAoYXQgb25lCisvLyBwb2ludCB0aGlzIGZhaWxlZCkuCittZXNzYWdlIFRlc3REZXByZWNhdGVkTGl0ZSB7CisgIG9wdGlvbmFsIGludDMyIGRlcHJlY2F0ZWRfZmllbGQgPSAxIFtkZXByZWNhdGVkID0gdHJ1ZV07CisgIHJlcXVpcmVkIGludDMyIGRlcHJlY2F0ZWRfZmllbGQyID0gMiBbZGVwcmVjYXRlZCA9IHRydWVdOworICBvcHRpb25hbCBzdHJpbmcgZGVwcmVjYXRlZF9maWVsZDMgPSAzIFtkZXByZWNhdGVkID0gdHJ1ZV07CisgIG9wdGlvbmFsIFRlc3REZXByZWNhdGVkTGl0ZSBkZXByZWNhdGVkX2ZpZWxkNCA9IDQgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKK30KKworLy8gU2VlIHRoZSBjb21tZW50cyBvZiB0aGUgc2FtZSB0eXBlIGluIHVuaXR0ZXN0LnByb3RvLgorbWVzc2FnZSBUZXN0UGFyc2luZ01lcmdlTGl0ZSB7CisgIG1lc3NhZ2UgUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IgeworICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlc0xpdGUgZmllbGQxID0gMTsKKyAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXNMaXRlIGZpZWxkMiA9IDI7CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZSBmaWVsZDMgPSAzOworICAgIHJlcGVhdGVkIGdyb3VwIEdyb3VwMSA9IDEwIHsKKyAgICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUgZmllbGQxID0gMTE7CisgICAgfQorICAgIHJlcGVhdGVkIGdyb3VwIEdyb3VwMiA9IDIwIHsKKyAgICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUgZmllbGQxID0gMjE7CisgICAgfQorICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlc0xpdGUgZXh0MSA9IDEwMDA7CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZSBleHQyID0gMTAwMTsKKyAgfQorICByZXF1aXJlZCBUZXN0QWxsVHlwZXNMaXRlIHJlcXVpcmVkX2FsbF90eXBlcyA9IDE7CisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUgb3B0aW9uYWxfYWxsX3R5cGVzID0gMjsKKyAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZSByZXBlYXRlZF9hbGxfdHlwZXMgPSAzOworICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwID0gMTAgeworICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUgb3B0aW9uYWxfZ3JvdXBfYWxsX3R5cGVzID0gMTE7CisgIH0KKyAgcmVwZWF0ZWQgZ3JvdXAgUmVwZWF0ZWRHcm91cCA9IDIwIHsKKyAgICBvcHRpb25hbCBUZXN0QWxsVHlwZXNMaXRlIHJlcGVhdGVkX2dyb3VwX2FsbF90eXBlcyA9IDIxOworICB9CisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7CisgIGV4dGVuZCBUZXN0UGFyc2luZ01lcmdlTGl0ZSB7CisgICAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZSBvcHRpb25hbF9leHQgPSAxMDAwOworICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlc0xpdGUgcmVwZWF0ZWRfZXh0ID0gMTAwMTsKKyAgfQorfQorCisvLyBUZXN0IHRoYXQgdGhlIGNvcnJlY3QgZXhjZXB0aW9uIGlzIHRocm93biBieSBwYXJzZUZyb20gaW4gYSBjb3JuZXIgY2FzZQorLy8gaW52b2x2aW5nIG1lcmdpbmcsIGV4dGVuc2lvbnMsIGFuZCByZXF1aXJlZCBmaWVsZHMuCittZXNzYWdlIFRlc3RNZXJnZUV4Y2VwdGlvbkxpdGUgeworICBvcHRpb25hbCBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgYWxsX2V4dGVuc2lvbnMgPSAxOworfQorCisvLyBUZXN0RW1wdHlNZXNzYWdlTGl0ZSBpcyB1c2VkIHRvIHRlc3QgdW5rbm93biBmaWVsZHMgc3VwcG9ydCBpbiBsaXRlIG1vZGUuCittZXNzYWdlIFRlc3RFbXB0eU1lc3NhZ2VMaXRlIHt9CisKKy8vIExpa2UgYWJvdmUsIGJ1dCBkZWNsYXJlIGFsbCBmaWVsZCBudW1iZXJzIGFzIHBvdGVudGlhbCBleHRlbnNpb25zLiAgTm8KKy8vIGFjdHVhbCBleHRlbnNpb25zIHNob3VsZCBldmVyIGJlIGRlZmluZWQgZm9yIHRoaXMgdHlwZS4KK21lc3NhZ2UgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zTGl0ZSB7CisgIGV4dGVuc2lvbnMgMSB0byBtYXg7Cit9CisKK2VudW0gVjFFbnVtTGl0ZSB7CisgIFYxX0ZJUlNUID0gMTsKK30KKworZW51bSBWMkVudW1MaXRlIHsKKyAgVjJfRklSU1QgPSAxOworICBWMl9TRUNPTkQgPSAyOworfQorCittZXNzYWdlIFYxTWVzc2FnZUxpdGUgeworICByZXF1aXJlZCBpbnQzMiBpbnRfZmllbGQgPSAxOworICBvcHRpb25hbCBWMUVudW1MaXRlIGVudW1fZmllbGQgPSAyIFtkZWZhdWx0ID0gVjFfRklSU1RdOworfQorCittZXNzYWdlIFYyTWVzc2FnZUxpdGUgeworICByZXF1aXJlZCBpbnQzMiBpbnRfZmllbGQgPSAxOworICBvcHRpb25hbCBWMkVudW1MaXRlIGVudW1fZmllbGQgPSAyIFtkZWZhdWx0ID0gVjJfRklSU1RdOworfQorCittZXNzYWdlIFRlc3RIdWdlRmllbGROdW1iZXJzTGl0ZSB7CisgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyID0gNTM2ODcwMDAwOworICBvcHRpb25hbCBpbnQzMiBmaXhlZF8zMiA9IDUzNjg3MDAwMTsKKyAgcmVwZWF0ZWQgaW50MzIgcmVwZWF0ZWRfaW50MzIgPSA1MzY4NzAwMDIgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgaW50MzIgcGFja2VkX2ludDMyID0gNTM2ODcwMDAzIFtwYWNrZWQgPSB0cnVlXTsKKworICBvcHRpb25hbCBGb3JlaWduRW51bUxpdGUgb3B0aW9uYWxfZW51bSA9IDUzNjg3MDAwNDsKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZyA9IDUzNjg3MDAwNTsKKyAgb3B0aW9uYWwgYnl0ZXMgb3B0aW9uYWxfYnl0ZXMgPSA1MzY4NzAwMDY7CisgIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlTGl0ZSBvcHRpb25hbF9tZXNzYWdlID0gNTM2ODcwMDA3OworCisgIG9wdGlvbmFsIGdyb3VwIE9wdGlvbmFsR3JvdXAgPSA1MzY4NzAwMDggeworICAgIG9wdGlvbmFsIGludDMyIGdyb3VwX2EgPSA1MzY4NzAwMDk7CisgIH0KKworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHN0cmluZ19zdHJpbmdfbWFwID0gNTM2ODcwMDEwOworCisgIG9uZW9mIG9uZW9mX2ZpZWxkIHsKKyAgICB1aW50MzIgb25lb2ZfdWludDMyID0gNTM2ODcwMDExOworICAgIFRlc3RBbGxUeXBlc0xpdGUgb25lb2ZfdGVzdF9hbGxfdHlwZXMgPSA1MzY4NzAwMTI7CisgICAgc3RyaW5nIG9uZW9mX3N0cmluZyA9IDUzNjg3MDAxMzsKKyAgICBieXRlcyBvbmVvZl9ieXRlcyA9IDUzNjg3MDAxNDsKKyAgfQorCisgIGV4dGVuc2lvbnMgNTM2ODYwMDAwIHRvIDUzNjg2OTk5OTsKK30KKworZXh0ZW5kIFRlc3RIdWdlRmllbGROdW1iZXJzTGl0ZSB7CisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUgdGVzdF9hbGxfdHlwZXNfbGl0ZSA9IDUzNjg2MDAwMDsKK30KKworbWVzc2FnZSBUZXN0T25lb2ZQYXJzaW5nTGl0ZSB7CisgIG9uZW9mIG9uZW9mX2ZpZWxkIHsKKyAgICBpbnQzMiBvbmVvZl9pbnQzMiA9IDE7CisgICAgVGVzdEFsbFR5cGVzTGl0ZSBvbmVvZl9zdWJtZXNzYWdlID0gMjsKKyAgICBzdHJpbmcgb25lb2Zfc3RyaW5nID0gMzsKKyAgICBieXRlcyBvbmVvZl9ieXRlcyA9IDQgW2RlZmF1bHQgPSAiZGVmYXVsdCBieXRlcyJdOworICAgIHN0cmluZyBvbmVvZl9zdHJpbmdfY29yZCA9IDUgW2N0eXBlID0gQ09SRCwgZGVmYXVsdCA9ICJkZWZhdWx0IENvcmQiXTsKKyAgICBieXRlcyBvbmVvZl9ieXRlc19jb3JkID0gNiBbY3R5cGUgPSBDT1JEXTsKKyAgICBzdHJpbmcgb25lb2Zfc3RyaW5nX3N0cmluZ19waWVjZSA9IDcgW2N0eXBlID0gU1RSSU5HX1BJRUNFXTsKKyAgICBieXRlcyBvbmVvZl9ieXRlc19zdHJpbmdfcGllY2UgPSA4CisgICAgICAgIFtjdHlwZSA9IFNUUklOR19QSUVDRSwgZGVmYXVsdCA9ICJkZWZhdWx0IFN0cmluZ1BpZWNlIl07CisgICAgVjJFbnVtTGl0ZSBvbmVvZl9lbnVtID0gOTsKKyAgfQorfQorCittZXNzYWdlIFRlc3RNZXNzYWdlU2V0TGl0ZSB7CisgIG9wdGlvbiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IHRydWU7CisKKyAgZXh0ZW5zaW9ucyAxMDAgdG8gbWF4OworfQorCisvLyBUaGUgZm9sbG93aW5nIGZvdXIgbWVzc2FnZXMgYXJlIHNldCB1cCB0byB0ZXN0IGZvciB3aXJlIGNvbXBhdGliaWxpdHkgYmV0d2VlbgorLy8gcGFja2VkIGFuZCBub24tcGFja2VkIHJlcGVhdGVkIGZpZWxkcy4gV2UgdXNlIHRoZSBmaWVsZCBudW1iZXIgMjA0OCwgYmVjYXVzZQorLy8gdGhhdCBpcyBsYXJnZSBlbm91Z2ggdG8gcmVxdWlyZSBhIDMtYnl0ZSB2YXJpbnQgZm9yIHRoZSB0YWcuCittZXNzYWdlIFBhY2tlZEludDMyIHsKKyAgcmVwZWF0ZWQgaW50MzIgcmVwZWF0ZWRfaW50MzIgPSAyMDQ4IFtwYWNrZWQgPSB0cnVlXTsKK30KKworbWVzc2FnZSBOb25QYWNrZWRJbnQzMiB7CisgIHJlcGVhdGVkIGludDMyIHJlcGVhdGVkX2ludDMyID0gMjA0ODsKK30KKworbWVzc2FnZSBQYWNrZWRGaXhlZDMyIHsKKyAgcmVwZWF0ZWQgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyID0gMjA0OCBbcGFja2VkID0gdHJ1ZV07Cit9CisKK21lc3NhZ2UgTm9uUGFja2VkRml4ZWQzMiB7CisgIHJlcGVhdGVkIGZpeGVkMzIgcmVwZWF0ZWRfZml4ZWQzMiA9IDIwNDg7Cit9CisKKy8vIFRlc3QgYW4gZW51bSB0aGF0IGhhcyBtdWx0aXBsZSB2YWx1ZXMgd2l0aCB0aGUgc2FtZSBudW1iZXIuCittZXNzYWdlIER1cEVudW0geworICBlbnVtIFRlc3RFbnVtV2l0aER1cFZhbHVlTGl0ZSB7CisgICAgb3B0aW9uIGFsbG93X2FsaWFzID0gdHJ1ZTsKKworICAgIEZPTzEgPSAxOworICAgIEJBUjEgPSAyOworICAgIEJBWiA9IDM7CisgICAgRk9PMiA9IDE7CisgICAgQkFSMiA9IDI7CisgIH0KK30KKworbWVzc2FnZSBSZWN1cnNpdmVNZXNzYWdlIHsKKyAgb3B0aW9uYWwgUmVjdXJzaXZlTWVzc2FnZSByZWN1cnNlID0gMTsKKyAgb3B0aW9uYWwgYnl0ZXMgcGF5bG9hZCA9IDI7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTQ3MDE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wcm90bwpAQCAtMCwwICsxLDQ3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIFRlc3RzIHRoYXQgYSAibGl0ZSIgbWVzc2FnZSBjYW4gaW1wb3J0IGEgcmVndWxhciBtZXNzYWdlLgorCitzeW50YXggPSAicHJvdG8yIjsKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIjsKKworb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKKworbWVzc2FnZSBUZXN0TGl0ZUltcG9ydHNOb25saXRlIHsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSAxOworCisgIC8vIFZlcmlmaWVzIHRoYXQgdHJhbnNpdGl2ZSByZXF1aXJlZCBmaWVsZHMgZ2VuZXJhdGVzIHZhbGlkIGNvZGUuCisgIG9wdGlvbmFsIFRlc3RSZXF1aXJlZCBtZXNzYWdlX3dpdGhfcmVxdWlyZWQgPSAyOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOTQ5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8KQEAgLTAsMCArMSwxMDEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgc2ltaWxhciB0byB1bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnByb3RvLCBidXQgZG9lcyBub3QKKy8vIGhhdmUgYSBUZXN0TWVzc2FnZVNldCwgc28gaXQgY2FuIGJlIGRvd25ncmFkZWQgdG8gcHJvdG8xLgorCitzeW50YXggPSAicHJvdG8yIjsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wcm90byI7CisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKKworbWVzc2FnZSBUZXN0TWVzc2FnZVNldENvbnRhaW5lciB7CisgIG9wdGlvbmFsIHByb3RvMl93aXJlZm9ybWF0X3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0ID0gMTsKK30KKworbWVzc2FnZSBOZXN0ZWRUZXN0TWVzc2FnZVNldENvbnRhaW5lciB7CisgIG9wdGlvbmFsIFRlc3RNZXNzYWdlU2V0Q29udGFpbmVyIGNvbnRhaW5lciA9IDE7CisgIG9wdGlvbmFsIE5lc3RlZFRlc3RNZXNzYWdlU2V0Q29udGFpbmVyIGNoaWxkID0gMjsKK30KKworbWVzc2FnZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgeworICBleHRlbmQgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXQgeworICAgIG9wdGlvbmFsIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBtZXNzYWdlX3NldF9leHRlbnNpb24gPSAxNTQ1MDA4OworICB9CisgIG9wdGlvbmFsIGludDMyIGkgPSAxNTsKKyAgb3B0aW9uYWwgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXQgcmVjdXJzaXZlID0gMTY7CisgIG9wdGlvbmFsIHN0cmluZyB0ZXN0X2FsaWFzaW5nID0gMTcgW2N0eXBlID0gU1RSSU5HX1BJRUNFXTsKK30KKworbWVzc2FnZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgeworICBleHRlbmQgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXQgeworICAgIG9wdGlvbmFsIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBtZXNzYWdlX3NldF9leHRlbnNpb24gPSAxNTQ3NzY5OworICB9CisgIG9wdGlvbmFsIHN0cmluZyBzdHIgPSAyNTsKK30KKworbWVzc2FnZSBOZXN0ZWRUZXN0SW50IHsKKyAgb3B0aW9uYWwgZml4ZWQzMiBhID0gMTsKKyAgb3B0aW9uYWwgTmVzdGVkVGVzdEludCBjaGlsZCA9IDI7Cit9CisKK21lc3NhZ2UgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24zIHsKKyAgZXh0ZW5kIHByb3RvMl93aXJlZm9ybWF0X3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0IHsKKyAgICBvcHRpb25hbCBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjMgbWVzc2FnZV9zZXRfZXh0ZW5zaW9uID0gMTk1MjczMTI5OworICB9CisgIG9wdGlvbmFsIE5lc3RlZFRlc3RJbnQgbXNnID0gMzU7Cit9CisKKy8vIFRoaXMgbWVzc2FnZSB3YXMgdXNlZCB0byBnZW5lcmF0ZQorLy8gLy9uZXQvcHJvdG8yL3B5dGhvbi9pbnRlcm5hbC90ZXN0ZGF0YS9tZXNzYWdlX3NldF9tZXNzYWdlLCBidXQgaXMgY29tbWVudGVkCisvLyBvdXQgc2luY2UgaXQgbXVzdCBub3QgYWN0dWFsbHkgZXhpc3QgaW4gY29kZSwgdG8gc2ltdWxhdGUgYW4gInVua25vd24iCisvLyBleHRlbnNpb24uCisvLyBtZXNzYWdlIFRlc3RNZXNzYWdlU2V0VW5rbm93bkV4dGVuc2lvbiB7CisvLyAgIGV4dGVuZCBUZXN0TWVzc2FnZVNldCB7CisvLyAgICAgb3B0aW9uYWwgVGVzdE1lc3NhZ2VTZXRVbmtub3duRXh0ZW5zaW9uIG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiA9IDU2MTQxNDIxOworLy8gICB9CisvLyAgIG9wdGlvbmFsIGludDY0IGEgPSAxOworLy8gfQorCisvLyBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0IGlzIGVxdWl2YWxlbnQgdG8gdGhpcy4KK21lc3NhZ2UgUmF3TWVzc2FnZVNldCB7CisgIHJlcGVhdGVkIGdyb3VwIEl0ZW0gPSAxIHsKKyAgICByZXF1aXJlZCBpbnQzMiB0eXBlX2lkID0gMjsKKyAgICByZXF1aXJlZCBieXRlcyBtZXNzYWdlID0gMzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTQzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucHJvdG8KQEAgLTAsMCArMSw1MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBtZXNzYWdlcyBmb3IgdGVzdGluZyBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdC4KKworc3ludGF4ID0gInByb3RvMiI7CitwYWNrYWdlIHByb3RvMl93aXJlZm9ybWF0X3VuaXR0ZXN0OworCitvcHRpb24gY2NfZW5hYmxlX2FyZW5hcyA9IHRydWU7CitvcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7CitvcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MiOworCisvLyBBIG1lc3NhZ2Ugd2l0aCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdC4KK21lc3NhZ2UgVGVzdE1lc3NhZ2VTZXQgeworICBvcHRpb24gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlOworICBleHRlbnNpb25zIDQgdG8gbWF4OworfQorCittZXNzYWdlIFRlc3RNZXNzYWdlU2V0V2lyZUZvcm1hdENvbnRhaW5lciB7CisgIG9wdGlvbmFsIFRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0ID0gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NGFmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnByb3RvCkBAIC0wLDAgKzEsMTM4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBwcm90byBmaWxlIHVzZWQgdG8gdGVzdCBhIG1lc3NhZ2UgdHlwZSB3aXRoIG5vIGV4cGxpY2l0IGZpZWxkIHByZXNlbmNlLgorCitzeW50YXggPSAicHJvdG8zIjsKKworLy8gV2Ugd2FudCB0byB0ZXN0IGVtYmVkZGVkIHByb3RvMiBtZXNzYWdlcywgc28gaW5jbHVkZSBzb21lIHByb3RvMiB0eXBlcy4KK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIjsKKworcGFja2FnZSBwcm90bzJfbm9maWVsZHByZXNlbmNlX3VuaXR0ZXN0OworCisvLyBUaGlzIHByb3RvIGluY2x1ZGVzIGV2ZXJ5IHR5cGUgb2YgZmllbGQgaW4gYm90aCBzaW5ndWxhciBhbmQgcmVwZWF0ZWQKKy8vIGZvcm1zLgorbWVzc2FnZSBUZXN0QWxsVHlwZXMgeworICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICAgIGludDMyIGJiID0gMTsKKyAgfQorCisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgRk9PID0gMDsKKyAgICBCQVIgPSAxOworICAgIEJBWiA9IDI7CisgIH0KKworICAvLyBTaW5ndWxhcgorICAvLyBUT0RPOiByZW1vdmUgJ29wdGlvbmFsJyBsYWJlbHMgYXMgc29vbiBhcyBDTCA2OTE4ODA3NyBpcyBMR1RNJ2QgdG8gbWFrZQorICAvLyAnb3B0aW9uYWwnIG9wdGlvbmFsLgorICAgICBpbnQzMiBvcHRpb25hbF9pbnQzMiAgICA9ICAxOworICAgICBpbnQ2NCBvcHRpb25hbF9pbnQ2NCAgICA9ICAyOworICAgIHVpbnQzMiBvcHRpb25hbF91aW50MzIgICA9ICAzOworICAgIHVpbnQ2NCBvcHRpb25hbF91aW50NjQgICA9ICA0OworICAgIHNpbnQzMiBvcHRpb25hbF9zaW50MzIgICA9ICA1OworICAgIHNpbnQ2NCBvcHRpb25hbF9zaW50NjQgICA9ICA2OworICAgZml4ZWQzMiBvcHRpb25hbF9maXhlZDMyICA9ICA3OworICAgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0ICA9ICA4OworICBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMiA9ICA5OworICBzZml4ZWQ2NCBvcHRpb25hbF9zZml4ZWQ2NCA9IDEwOworICAgICBmbG9hdCBvcHRpb25hbF9mbG9hdCAgICA9IDExOworICAgIGRvdWJsZSBvcHRpb25hbF9kb3VibGUgICA9IDEyOworICAgICAgYm9vbCBvcHRpb25hbF9ib29sICAgICA9IDEzOworICAgIHN0cmluZyBvcHRpb25hbF9zdHJpbmcgICA9IDE0OworICAgICBieXRlcyBvcHRpb25hbF9ieXRlcyAgICA9IDE1OworCisgIE5lc3RlZE1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgPSAxODsKKyAgRm9yZWlnbk1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSA9IDE5OworICBwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMgICAgICAgICBvcHRpb25hbF9wcm90bzJfbWVzc2FnZSA9IDIwOworCisgIE5lc3RlZEVudW0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9uZXN0ZWRfZW51bSAgICAgPSAyMTsKKyAgRm9yZWlnbkVudW0gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ZvcmVpZ25fZW51bSAgICA9IDIyOworICAvLyBOLkIuOiBwcm90bzItZW51bS10eXBlIGZpZWxkcyBub3QgYWxsb3dlZCwgYmVjYXVzZSB0aGVpciBkZWZhdWx0IHZhbHVlcworICAvLyBtaWdodCBub3QgYmUgemVyby4KKyAgLy9vcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bSAgICAgICAgICBvcHRpb25hbF9wcm90bzJfZW51bSAgICAgPSAyMzsKKworICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nX3BpZWNlID0gMjQgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIHN0cmluZyBvcHRpb25hbF9jb3JkID0gMjUgW2N0eXBlPUNPUkRdOworCisgIE5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbGF6eV9tZXNzYWdlID0gMzAgW2xhenk9dHJ1ZV07CisKKyAgLy8gUmVwZWF0ZWQKKyAgcmVwZWF0ZWQgICAgaW50MzIgcmVwZWF0ZWRfaW50MzIgICAgPSAzMTsKKyAgcmVwZWF0ZWQgICAgaW50NjQgcmVwZWF0ZWRfaW50NjQgICAgPSAzMjsKKyAgcmVwZWF0ZWQgICB1aW50MzIgcmVwZWF0ZWRfdWludDMyICAgPSAzMzsKKyAgcmVwZWF0ZWQgICB1aW50NjQgcmVwZWF0ZWRfdWludDY0ICAgPSAzNDsKKyAgcmVwZWF0ZWQgICBzaW50MzIgcmVwZWF0ZWRfc2ludDMyICAgPSAzNTsKKyAgcmVwZWF0ZWQgICBzaW50NjQgcmVwZWF0ZWRfc2ludDY0ICAgPSAzNjsKKyAgcmVwZWF0ZWQgIGZpeGVkMzIgcmVwZWF0ZWRfZml4ZWQzMiAgPSAzNzsKKyAgcmVwZWF0ZWQgIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NCAgPSAzODsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcmVwZWF0ZWRfc2ZpeGVkMzIgPSAzOTsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgcmVwZWF0ZWRfc2ZpeGVkNjQgPSA0MDsKKyAgcmVwZWF0ZWQgICAgZmxvYXQgcmVwZWF0ZWRfZmxvYXQgICAgPSA0MTsKKyAgcmVwZWF0ZWQgICBkb3VibGUgcmVwZWF0ZWRfZG91YmxlICAgPSA0MjsKKyAgcmVwZWF0ZWQgICAgIGJvb2wgcmVwZWF0ZWRfYm9vbCAgICAgPSA0MzsKKyAgcmVwZWF0ZWQgICBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nICAgPSA0NDsKKyAgcmVwZWF0ZWQgICAgYnl0ZXMgcmVwZWF0ZWRfYnl0ZXMgICAgPSA0NTsKKworICByZXBlYXRlZCBOZXN0ZWRNZXNzYWdlICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgID0gNDg7CisgIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UgPSA0OTsKKyAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzICAgICAgICAgcmVwZWF0ZWRfcHJvdG8yX21lc3NhZ2UgID0gNTA7CisKKyAgcmVwZWF0ZWQgTmVzdGVkRW51bSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkX25lc3RlZF9lbnVtICAgICA9IDUxOworICByZXBlYXRlZCBGb3JlaWduRW51bSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfZm9yZWlnbl9lbnVtICAgID0gNTI7CisKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZ19waWVjZSA9IDU0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfY29yZCA9IDU1IFtjdHlwZT1DT1JEXTsKKworICByZXBlYXRlZCBOZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX2xhenlfbWVzc2FnZSA9IDU3IFtsYXp5PXRydWVdOworCisgIG9uZW9mIG9uZW9mX2ZpZWxkIHsKKyAgICB1aW50MzIgb25lb2ZfdWludDMyID0gMTExOworICAgIE5lc3RlZE1lc3NhZ2Ugb25lb2ZfbmVzdGVkX21lc3NhZ2UgPSAxMTI7CisgICAgc3RyaW5nIG9uZW9mX3N0cmluZyA9IDExMzsKKyAgICBOZXN0ZWRFbnVtIG9uZW9mX2VudW0gPSAxMTQ7CisgIH0KK30KKworbWVzc2FnZSBUZXN0UHJvdG8yUmVxdWlyZWQgeworICBwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQgcHJvdG8yID0gMTsKK30KKworLy8gRGVmaW5lIHRoZXNlIGFmdGVyIFRlc3RBbGxUeXBlcyB0byBtYWtlIHN1cmUgdGhlIGNvbXBpbGVyIGNhbiBoYW5kbGUKKy8vIHRoYXQuCittZXNzYWdlIEZvcmVpZ25NZXNzYWdlIHsKKyAgaW50MzIgYyA9IDE7Cit9CisKK2VudW0gRm9yZWlnbkVudW0geworICBGT1JFSUdOX0ZPTyA9IDA7CisgIEZPUkVJR05fQkFSID0gMTsKKyAgRk9SRUlHTl9CQVogPSAyOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YTBkMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8KQEAgLTAsMCArMSw1MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Qubm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0OworCisKKy8vICpfZ2VuZXJpY19zZXJ2aWNlcyBhcmUgZmFsc2UgYnkgZGVmYXVsdC4KKworbWVzc2FnZSBUZXN0TWVzc2FnZSB7CisgIG9wdGlvbmFsIGludDMyIGEgPSAxOworICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCitlbnVtIFRlc3RFbnVtIHsgRk9PID0gMTsgfQorCitleHRlbmQgVGVzdE1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiB0ZXN0X2V4dGVuc2lvbiA9IDEwMDA7Cit9CisKK3NlcnZpY2UgVGVzdFNlcnZpY2UgeworICBycGMgRm9vKFRlc3RNZXNzYWdlKSByZXR1cm5zIChUZXN0TWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOWNjN2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90bwpAQCAtMCwwICsxLDY3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gQSBwcm90byBmaWxlIHdoaWNoIHVzZXMgb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFLgorCitzeW50YXggPSAicHJvdG8yIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIjsKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworb3B0aW9uIG9wdGltaXplX2ZvciA9IENPREVfU0laRTsKKworbWVzc2FnZSBUZXN0T3B0aW1pemVkRm9yU2l6ZSB7CisgIG9wdGlvbmFsIGludDMyIGkgPSAxOworICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSBtc2cgPSAxOTsKKworICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworCisgIGV4dGVuZCBUZXN0T3B0aW1pemVkRm9yU2l6ZSB7CisgICAgb3B0aW9uYWwgaW50MzIgdGVzdF9leHRlbnNpb24gPSAxMjM0OworICAgIG9wdGlvbmFsIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgdGVzdF9leHRlbnNpb24yID0gMTIzNTsKKyAgfQorCisgIG9uZW9mIGZvbyB7CisgICAgaW50MzIgaW50ZWdlcl9maWVsZCA9IDI7CisgICAgc3RyaW5nIHN0cmluZ19maWVsZCA9IDM7CisgIH0KK30KKworbWVzc2FnZSBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIHsKKyAgcmVxdWlyZWQgaW50MzIgeCA9IDE7Cit9CisKK21lc3NhZ2UgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSB7CisgIG9wdGlvbmFsIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgbyA9IDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOTEzMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wcm90bwpAQCAtMCwwICsxLDcxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgcHJvdG8zX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDsKK29wdGlvbiBvYmpjX2NsYXNzX3ByZWZpeCA9ICJVbmtub3duRW51bXMiOworCitvcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9idWYuVGVzdFByb3RvcyI7CisKK2VudW0gTXlFbnVtIHsKKyAgRk9PID0gMDsKKyAgQkFSID0gMTsKKyAgQkFaID0gMjsKK30KKworZW51bSBNeUVudW1QbHVzRXh0cmEgeworICBFX0ZPTyA9IDA7CisgIEVfQkFSID0gMTsKKyAgRV9CQVogPSAyOworICBFX0VYVFJBID0gMzsKK30KKworbWVzc2FnZSBNeU1lc3NhZ2UgeworICBNeUVudW0gZSA9IDE7CisgIHJlcGVhdGVkIE15RW51bSByZXBlYXRlZF9lID0gMjsKKyAgcmVwZWF0ZWQgTXlFbnVtIHJlcGVhdGVkX3BhY2tlZF9lID0gMyBbcGFja2VkPXRydWVdOworICByZXBlYXRlZCBNeUVudW1QbHVzRXh0cmEgcmVwZWF0ZWRfcGFja2VkX3VuZXhwZWN0ZWRfZSA9IDQ7ICAvLyBub3QgcGFja2VkCisgIG9uZW9mIG8geworICAgIE15RW51bSBvbmVvZl9lXzEgPSA1OworICAgIE15RW51bSBvbmVvZl9lXzIgPSA2OworICB9Cit9CisKK21lc3NhZ2UgTXlNZXNzYWdlUGx1c0V4dHJhIHsKKyAgTXlFbnVtUGx1c0V4dHJhIGUgPSAxOworICByZXBlYXRlZCBNeUVudW1QbHVzRXh0cmEgcmVwZWF0ZWRfZSA9IDI7CisgIHJlcGVhdGVkIE15RW51bVBsdXNFeHRyYSByZXBlYXRlZF9wYWNrZWRfZSA9IDMgW3BhY2tlZD10cnVlXTsKKyAgcmVwZWF0ZWQgTXlFbnVtUGx1c0V4dHJhIHJlcGVhdGVkX3BhY2tlZF91bmV4cGVjdGVkX2UgPSA0IFtwYWNrZWQ9dHJ1ZV07CisgIG9uZW9mIG8geworICAgIE15RW51bVBsdXNFeHRyYSBvbmVvZl9lXzEgPSA1OworICAgIE15RW51bVBsdXNFeHRyYSBvbmVvZl9lXzIgPSA2OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRmNDI5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wcm90bwpAQCAtMCwwICsxLDUwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgcHJvdG8yX3ByZXNlcnZlX3Vua25vd25fZW51bV91bml0dGVzdDsKKworZW51bSBNeUVudW0geworICBGT08gPSAwOworICBCQVIgPSAxOworICBCQVogPSAyOworfQorCittZXNzYWdlIE15TWVzc2FnZSB7CisgIG9wdGlvbmFsIE15RW51bSBlID0gMTsKKyAgcmVwZWF0ZWQgTXlFbnVtIHJlcGVhdGVkX2UgPSAyOworICByZXBlYXRlZCBNeUVudW0gcmVwZWF0ZWRfcGFja2VkX2UgPSAzIFtwYWNrZWQ9dHJ1ZV07CisgIHJlcGVhdGVkIE15RW51bSByZXBlYXRlZF9wYWNrZWRfdW5leHBlY3RlZF9lID0gNDsgIC8vIG5vdCBwYWNrZWQKKyAgb25lb2YgbyB7CisgICAgTXlFbnVtIG9uZW9mX2VfMSA9IDU7CisgICAgTXlFbnVtIG9uZW9mX2VfMiA9IDY7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwZjQwMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnByb3RvCkBAIC0wLDAgKzEsMjI5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgcHJvdG8zX3VuaXR0ZXN0OworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8iOworCitvcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7CisKKy8vIFRoaXMgcHJvdG8gaW5jbHVkZXMgZXZlcnkgdHlwZSBvZiBmaWVsZCBpbiBib3RoIHNpbmd1bGFyIGFuZCByZXBlYXRlZAorLy8gZm9ybXMuCittZXNzYWdlIFRlc3RBbGxUeXBlcyB7CisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgLy8gVGhlIGZpZWxkIG5hbWUgImIiIGZhaWxzIHRvIGNvbXBpbGUgaW4gcHJvdG8xIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGgKKyAgICAvLyBhIGxvY2FsIHZhcmlhYmxlIG5hbWVkICJiIiBpbiBvbmUgb2YgdGhlIGdlbmVyYXRlZCBtZXRob2RzLiAgRG9oLgorICAgIC8vIFRoaXMgZmlsZSBuZWVkcyB0byBjb21waWxlIGluIHByb3RvMSB0byB0ZXN0IGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgorICAgIGludDMyIGJiID0gMTsKKyAgfQorCisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgWkVSTyA9IDA7CisgICAgRk9PID0gMTsKKyAgICBCQVIgPSAyOworICAgIEJBWiA9IDM7CisgICAgTkVHID0gLTE7ICAvLyBJbnRlbnRpb25hbGx5IG5lZ2F0aXZlLgorICB9CisKKyAgLy8gU2luZ3VsYXIKKyAgaW50MzIgb3B0aW9uYWxfaW50MzIgPSAxOworICBpbnQ2NCBvcHRpb25hbF9pbnQ2NCA9IDI7CisgIHVpbnQzMiBvcHRpb25hbF91aW50MzIgPSAzOworICB1aW50NjQgb3B0aW9uYWxfdWludDY0ID0gNDsKKyAgc2ludDMyIG9wdGlvbmFsX3NpbnQzMiA9IDU7CisgIHNpbnQ2NCBvcHRpb25hbF9zaW50NjQgPSA2OworICBmaXhlZDMyIG9wdGlvbmFsX2ZpeGVkMzIgPSA3OworICBmaXhlZDY0IG9wdGlvbmFsX2ZpeGVkNjQgPSA4OworICBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMiA9IDk7CisgIHNmaXhlZDY0IG9wdGlvbmFsX3NmaXhlZDY0ID0gMTA7CisgIGZsb2F0IG9wdGlvbmFsX2Zsb2F0ID0gMTE7CisgIGRvdWJsZSBvcHRpb25hbF9kb3VibGUgPSAxMjsKKyAgYm9vbCBvcHRpb25hbF9ib29sID0gMTM7CisgIHN0cmluZyBvcHRpb25hbF9zdHJpbmcgPSAxNDsKKyAgYnl0ZXMgb3B0aW9uYWxfYnl0ZXMgPSAxNTsKKworICAvLyBHcm91cHMgYXJlIG5vdCBhbGxvd2VkIGluIHByb3RvMy4KKyAgLy8gb3B0aW9uYWwgZ3JvdXAgT3B0aW9uYWxHcm91cCA9IDE2IHsKKyAgLy8gICBvcHRpb25hbCBpbnQzMiBhID0gMTc7CisgIC8vIH0KKworICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlID0gMTg7CisgIEZvcmVpZ25NZXNzYWdlIG9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSA9IDE5OworICBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZSBvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSA9IDIwOworCisgIE5lc3RlZEVudW0gb3B0aW9uYWxfbmVzdGVkX2VudW0gPSAyMTsKKyAgRm9yZWlnbkVudW0gb3B0aW9uYWxfZm9yZWlnbl9lbnVtID0gMjI7CisKKyAgLy8gT21pdHRlZCAoY29tcGFyZWQgdG8gdW5pdHRlc3QucHJvdG8pIGJlY2F1c2UgcHJvdG8yIGVudW1zIGFyZSBub3QgYWxsb3dlZAorICAvLyBpbnNpZGUgcHJvdG8yIG1lc3NhZ2VzLgorICAvLworICAvLyBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bSAgICBvcHRpb25hbF9pbXBvcnRfZW51bSAgPSAyMzsKKworICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nX3BpZWNlID0gMjQgW2N0eXBlID0gU1RSSU5HX1BJRUNFXTsKKyAgc3RyaW5nIG9wdGlvbmFsX2NvcmQgPSAyNSBbY3R5cGUgPSBDT1JEXTsKKworICAvLyBEZWZpbmVkIGluIHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8KKyAgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LlB1YmxpY0ltcG9ydE1lc3NhZ2Ugb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlID0KKyAgICAgIDI2OworCisgIE5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbGF6eV9tZXNzYWdlID0gMjcgW2xhenkgPSB0cnVlXTsKKyAgTmVzdGVkTWVzc2FnZSBvcHRpb25hbF91bnZlcmlmaWVkX2xhenlfbWVzc2FnZSA9IDI4IFt1bnZlcmlmaWVkX2xhenkgPSB0cnVlXTsKKyAgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2Ugb3B0aW9uYWxfbGF6eV9pbXBvcnRfbWVzc2FnZSA9IDExNQorICAgICAgW2xhenkgPSB0cnVlXTsKKworICAvLyBSZXBlYXRlZAorICByZXBlYXRlZCBpbnQzMiByZXBlYXRlZF9pbnQzMiA9IDMxOworICByZXBlYXRlZCBpbnQ2NCByZXBlYXRlZF9pbnQ2NCA9IDMyOworICByZXBlYXRlZCB1aW50MzIgcmVwZWF0ZWRfdWludDMyID0gMzM7CisgIHJlcGVhdGVkIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgPSAzNDsKKyAgcmVwZWF0ZWQgc2ludDMyIHJlcGVhdGVkX3NpbnQzMiA9IDM1OworICByZXBlYXRlZCBzaW50NjQgcmVwZWF0ZWRfc2ludDY0ID0gMzY7CisgIHJlcGVhdGVkIGZpeGVkMzIgcmVwZWF0ZWRfZml4ZWQzMiA9IDM3OworICByZXBlYXRlZCBmaXhlZDY0IHJlcGVhdGVkX2ZpeGVkNjQgPSAzODsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcmVwZWF0ZWRfc2ZpeGVkMzIgPSAzOTsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgcmVwZWF0ZWRfc2ZpeGVkNjQgPSA0MDsKKyAgcmVwZWF0ZWQgZmxvYXQgcmVwZWF0ZWRfZmxvYXQgPSA0MTsKKyAgcmVwZWF0ZWQgZG91YmxlIHJlcGVhdGVkX2RvdWJsZSA9IDQyOworICByZXBlYXRlZCBib29sIHJlcGVhdGVkX2Jvb2wgPSA0MzsKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZyA9IDQ0OworICByZXBlYXRlZCBieXRlcyByZXBlYXRlZF9ieXRlcyA9IDQ1OworCisgIC8vIEdyb3VwcyBhcmUgbm90IGFsbG93ZWQgaW4gcHJvdG8zLgorICAvLyByZXBlYXRlZCBncm91cCBSZXBlYXRlZEdyb3VwID0gNDYgeworICAvLyAgIG9wdGlvbmFsIGludDMyIGEgPSA0NzsKKyAgLy8gfQorCisgIHJlcGVhdGVkIE5lc3RlZE1lc3NhZ2UgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgPSA0ODsKKyAgcmVwZWF0ZWQgRm9yZWlnbk1lc3NhZ2UgcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlID0gNDk7CisgIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlIHJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlID0gNTA7CisKKyAgcmVwZWF0ZWQgTmVzdGVkRW51bSByZXBlYXRlZF9uZXN0ZWRfZW51bSA9IDUxOworICByZXBlYXRlZCBGb3JlaWduRW51bSByZXBlYXRlZF9mb3JlaWduX2VudW0gPSA1MjsKKworICAvLyBPbWl0dGVkIChjb21wYXJlZCB0byB1bml0dGVzdC5wcm90bykgYmVjYXVzZSBwcm90bzIgZW51bXMgYXJlIG5vdCBhbGxvd2VkCisgIC8vIGluc2lkZSBwcm90bzIgbWVzc2FnZXMuCisgIC8vCisgIC8vIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtICAgIHJlcGVhdGVkX2ltcG9ydF9lbnVtICA9IDUzOworCisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfcGllY2UgPSA1NCBbY3R5cGUgPSBTVFJJTkdfUElFQ0VdOworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfY29yZCA9IDU1IFtjdHlwZSA9IENPUkRdOworCisgIHJlcGVhdGVkIE5lc3RlZE1lc3NhZ2UgcmVwZWF0ZWRfbGF6eV9tZXNzYWdlID0gNTcgW2xhenkgPSB0cnVlXTsKKworICBvbmVvZiBvbmVvZl9maWVsZCB7CisgICAgdWludDMyIG9uZW9mX3VpbnQzMiA9IDExMTsKKyAgICBOZXN0ZWRNZXNzYWdlIG9uZW9mX25lc3RlZF9tZXNzYWdlID0gMTEyOworICAgIHN0cmluZyBvbmVvZl9zdHJpbmcgPSAxMTM7CisgICAgYnl0ZXMgb25lb2ZfYnl0ZXMgPSAxMTQ7CisgIH0KK30KKworLy8gVGVzdCBtZXNzYWdlcyBmb3IgcGFja2VkIGZpZWxkcworCittZXNzYWdlIFRlc3RQYWNrZWRUeXBlcyB7CisgIHJlcGVhdGVkIGludDMyIHBhY2tlZF9pbnQzMiA9IDkwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgaW50NjQgcGFja2VkX2ludDY0ID0gOTEgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCB1aW50MzIgcGFja2VkX3VpbnQzMiA9IDkyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgdWludDY0IHBhY2tlZF91aW50NjQgPSA5MyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNpbnQzMiBwYWNrZWRfc2ludDMyID0gOTQgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzaW50NjQgcGFja2VkX3NpbnQ2NCA9IDk1IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgZml4ZWQzMiBwYWNrZWRfZml4ZWQzMiA9IDk2IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgZml4ZWQ2NCBwYWNrZWRfZml4ZWQ2NCA9IDk3IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcGFja2VkX3NmaXhlZDMyID0gOTggW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQ2NCBwYWNrZWRfc2ZpeGVkNjQgPSA5OSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIGZsb2F0IHBhY2tlZF9mbG9hdCA9IDEwMCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIGRvdWJsZSBwYWNrZWRfZG91YmxlID0gMTAxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgYm9vbCBwYWNrZWRfYm9vbCA9IDEwMiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtIHBhY2tlZF9lbnVtID0gMTAzIFtwYWNrZWQgPSB0cnVlXTsKK30KKworLy8gRXhwbGljaXRseSBzZXQgcGFja2VkIHRvIGZhbHNlCittZXNzYWdlIFRlc3RVbnBhY2tlZFR5cGVzIHsKKyAgcmVwZWF0ZWQgaW50MzIgcmVwZWF0ZWRfaW50MzIgPSAxIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIGludDY0IHJlcGVhdGVkX2ludDY0ID0gMiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCB1aW50MzIgcmVwZWF0ZWRfdWludDMyID0gMyBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCB1aW50NjQgcmVwZWF0ZWRfdWludDY0ID0gNCBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBzaW50MzIgcmVwZWF0ZWRfc2ludDMyID0gNSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBzaW50NjQgcmVwZWF0ZWRfc2ludDY0ID0gNiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBmaXhlZDMyIHJlcGVhdGVkX2ZpeGVkMzIgPSA3IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NCA9IDggW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcmVwZWF0ZWRfc2ZpeGVkMzIgPSA5IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHJlcGVhdGVkX3NmaXhlZDY0ID0gMTAgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgZmxvYXQgcmVwZWF0ZWRfZmxvYXQgPSAxMSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBkb3VibGUgcmVwZWF0ZWRfZG91YmxlID0gMTIgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgYm9vbCByZXBlYXRlZF9ib29sID0gMTMgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0gcmVwZWF0ZWRfbmVzdGVkX2VudW0gPSAxNCBbcGFja2VkID0gZmFsc2VdOworfQorCisvLyBUaGlzIHByb3RvIGluY2x1ZGVzIGEgcmVjdXJzaXZlbHkgbmVzdGVkIG1lc3NhZ2UuCittZXNzYWdlIE5lc3RlZFRlc3RBbGxUeXBlcyB7CisgIE5lc3RlZFRlc3RBbGxUeXBlcyBjaGlsZCA9IDE7CisgIFRlc3RBbGxUeXBlcyBwYXlsb2FkID0gMjsKK30KKworLy8gRGVmaW5lIHRoZXNlIGFmdGVyIFRlc3RBbGxUeXBlcyB0byBtYWtlIHN1cmUgdGhlIGNvbXBpbGVyIGNhbiBoYW5kbGUKKy8vIHRoYXQuCittZXNzYWdlIEZvcmVpZ25NZXNzYWdlIHsKKyAgaW50MzIgYyA9IDE7Cit9CisKK2VudW0gRm9yZWlnbkVudW0geworICBGT1JFSUdOX1pFUk8gPSAwOworICBGT1JFSUdOX0ZPTyA9IDQ7CisgIEZPUkVJR05fQkFSID0gNTsKKyAgRk9SRUlHTl9CQVogPSA2OworfQorCisvLyBUZXN0RW1wdHlNZXNzYWdlIGlzIHVzZWQgdG8gdGVzdCBiZWhhdmlvciBvZiB1bmtub3duIGZpZWxkcy4KK21lc3NhZ2UgVGVzdEVtcHR5TWVzc2FnZSB7fQorCisvLyBUZXN0TWVzc2FnZVdpdGhEdW1teSBpcyBhbHNvIHVzZWQgdG8gdGVzdCBiZWhhdmlvciBvZiB1bmtub3duIGZpZWxkcy4KK21lc3NhZ2UgVGVzdE1lc3NhZ2VXaXRoRHVtbXkgeworICAvLyBUaGlzIGZpZWxkIGlzIG9ubHkgaGVyZSBmb3IgdHJpZ2dlcmluZyBjb3B5LW9uLXdyaXRlOyBpdCdzIG5vdCBpbnRlbmRlZCB0bworICAvLyBiZSBzZXJpYWxpemVkLgorICBib29sIGR1bW15ID0gNTM2ODcwOTExOworfQorCisvLyBTYW1lIGxheW91dCBhcyBUZXN0T25lb2YyIGluIHVuaXR0ZXN0LnByb3RvIHRvIHRlc3QgdW5rbm93biBlbnVtIHZhbHVlCisvLyBwYXJzaW5nIGJlaGF2aW9yIGluIG9uZW9mLgorbWVzc2FnZSBUZXN0T25lb2YyIHsKKyAgb25lb2YgZm9vIHsKKyAgICBOZXN0ZWRFbnVtIGZvb19lbnVtID0gNjsKKyAgfQorCisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgVU5LTk9XTiA9IDA7CisgICAgRk9PID0gMTsKKyAgICBCQVIgPSAyOworICAgIEJBWiA9IDM7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjNmNkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnByb3RvCkBAIC0wLDAgKzEsMjM2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvIjsKKworcGFja2FnZSBwcm90bzNfYXJlbmFfdW5pdHRlc3Q7CisKKy8vIFRoaXMgcHJvdG8gaW5jbHVkZXMgZXZlcnkgdHlwZSBvZiBmaWVsZCBpbiBib3RoIHNpbmd1bGFyIGFuZCByZXBlYXRlZAorLy8gZm9ybXMuCittZXNzYWdlIFRlc3RBbGxUeXBlcyB7CisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgLy8gVGhlIGZpZWxkIG5hbWUgImIiIGZhaWxzIHRvIGNvbXBpbGUgaW4gcHJvdG8xIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGgKKyAgICAvLyBhIGxvY2FsIHZhcmlhYmxlIG5hbWVkICJiIiBpbiBvbmUgb2YgdGhlIGdlbmVyYXRlZCBtZXRob2RzLiAgRG9oLgorICAgIC8vIFRoaXMgZmlsZSBuZWVkcyB0byBjb21waWxlIGluIHByb3RvMSB0byB0ZXN0IGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgorICAgIGludDMyIGJiID0gMTsKKyAgfQorCisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgWkVSTyA9IDA7CisgICAgRk9PID0gMTsKKyAgICBCQVIgPSAyOworICAgIEJBWiA9IDM7CisgICAgTkVHID0gLTE7ICAvLyBJbnRlbnRpb25hbGx5IG5lZ2F0aXZlLgorICB9CisKKyAgLy8gU2luZ3VsYXIKKyAgICAgaW50MzIgb3B0aW9uYWxfaW50MzIgICAgPSAgMTsKKyAgICAgaW50NjQgb3B0aW9uYWxfaW50NjQgICAgPSAgMjsKKyAgICB1aW50MzIgb3B0aW9uYWxfdWludDMyICAgPSAgMzsKKyAgICB1aW50NjQgb3B0aW9uYWxfdWludDY0ICAgPSAgNDsKKyAgICBzaW50MzIgb3B0aW9uYWxfc2ludDMyICAgPSAgNTsKKyAgICBzaW50NjQgb3B0aW9uYWxfc2ludDY0ICAgPSAgNjsKKyAgIGZpeGVkMzIgb3B0aW9uYWxfZml4ZWQzMiAgPSAgNzsKKyAgIGZpeGVkNjQgb3B0aW9uYWxfZml4ZWQ2NCAgPSAgODsKKyAgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzIgPSAgOTsKKyAgc2ZpeGVkNjQgb3B0aW9uYWxfc2ZpeGVkNjQgPSAxMDsKKyAgICAgZmxvYXQgb3B0aW9uYWxfZmxvYXQgICAgPSAxMTsKKyAgICBkb3VibGUgb3B0aW9uYWxfZG91YmxlICAgPSAxMjsKKyAgICAgIGJvb2wgb3B0aW9uYWxfYm9vbCAgICAgPSAxMzsKKyAgICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nICAgPSAxNDsKKyAgICAgYnl0ZXMgb3B0aW9uYWxfYnl0ZXMgICAgPSAxNTsKKworICAvLyBHcm91cHMgYXJlIG5vdCBhbGxvd2VkIGluIHByb3RvMy4KKyAgLy8gb3B0aW9uYWwgZ3JvdXAgT3B0aW9uYWxHcm91cCA9IDE2IHsKKyAgLy8gICBvcHRpb25hbCBpbnQzMiBhID0gMTc7CisgIC8vIH0KKworICBOZXN0ZWRNZXNzYWdlICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgID0gMTg7CisgIEZvcmVpZ25NZXNzYWdlICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgPSAxOTsKKyAgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2Ugb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgID0gMjA7CisKKyAgTmVzdGVkRW51bSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX25lc3RlZF9lbnVtICAgICA9IDIxOworICBGb3JlaWduRW51bSAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfZm9yZWlnbl9lbnVtICAgID0gMjI7CisKKyAgLy8gT21pdHRlZCAoY29tcGFyZWQgdG8gdW5pdHRlc3QucHJvdG8pIGJlY2F1c2UgcHJvdG8yIGVudW1zIGFyZSBub3QgYWxsb3dlZAorICAvLyBpbnNpZGUgcHJvdG8yIG1lc3NhZ2VzLgorICAvLworICAvLyBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bSAgICBvcHRpb25hbF9pbXBvcnRfZW51bSAgPSAyMzsKKworICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nX3BpZWNlID0gMjQgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIHN0cmluZyBvcHRpb25hbF9jb3JkID0gMjUgW2N0eXBlPUNPUkRdOworCisgIC8vIERlZmluZWQgaW4gdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wcm90bworICBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuUHVibGljSW1wb3J0TWVzc2FnZQorICAgICAgb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlID0gMjY7CisKKyAgTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9sYXp5X21lc3NhZ2UgPSAyNyBbbGF6eT10cnVlXTsKKyAgTmVzdGVkTWVzc2FnZSBvcHRpb25hbF91bnZlcmlmaWVkX2xhenlfbWVzc2FnZSA9IDI4IFt1bnZlcmlmaWVkX2xhenk9dHJ1ZV07CisgIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlIG9wdGlvbmFsX2xhenlfaW1wb3J0X21lc3NhZ2UgPSAxMTUKKyAgICAgIFtsYXp5ID0gdHJ1ZV07CisKKyAgLy8gUmVwZWF0ZWQKKyAgcmVwZWF0ZWQgICAgaW50MzIgcmVwZWF0ZWRfaW50MzIgICAgPSAzMTsKKyAgcmVwZWF0ZWQgICAgaW50NjQgcmVwZWF0ZWRfaW50NjQgICAgPSAzMjsKKyAgcmVwZWF0ZWQgICB1aW50MzIgcmVwZWF0ZWRfdWludDMyICAgPSAzMzsKKyAgcmVwZWF0ZWQgICB1aW50NjQgcmVwZWF0ZWRfdWludDY0ICAgPSAzNDsKKyAgcmVwZWF0ZWQgICBzaW50MzIgcmVwZWF0ZWRfc2ludDMyICAgPSAzNTsKKyAgcmVwZWF0ZWQgICBzaW50NjQgcmVwZWF0ZWRfc2ludDY0ICAgPSAzNjsKKyAgcmVwZWF0ZWQgIGZpeGVkMzIgcmVwZWF0ZWRfZml4ZWQzMiAgPSAzNzsKKyAgcmVwZWF0ZWQgIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NCAgPSAzODsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcmVwZWF0ZWRfc2ZpeGVkMzIgPSAzOTsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgcmVwZWF0ZWRfc2ZpeGVkNjQgPSA0MDsKKyAgcmVwZWF0ZWQgICAgZmxvYXQgcmVwZWF0ZWRfZmxvYXQgICAgPSA0MTsKKyAgcmVwZWF0ZWQgICBkb3VibGUgcmVwZWF0ZWRfZG91YmxlICAgPSA0MjsKKyAgcmVwZWF0ZWQgICAgIGJvb2wgcmVwZWF0ZWRfYm9vbCAgICAgPSA0MzsKKyAgcmVwZWF0ZWQgICBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nICAgPSA0NDsKKyAgcmVwZWF0ZWQgICAgYnl0ZXMgcmVwZWF0ZWRfYnl0ZXMgICAgPSA0NTsKKworICAvLyBPcHRpb25hbAorICBvcHRpb25hbCAgICBpbnQzMiBwcm90bzNfb3B0aW9uYWxfaW50MzIgICAgPSAxMTY7CisgIG9wdGlvbmFsICAgIGludDY0IHByb3RvM19vcHRpb25hbF9pbnQ2NCAgICA9IDExNzsKKyAgb3B0aW9uYWwgICB1aW50MzIgcHJvdG8zX29wdGlvbmFsX3VpbnQzMiAgID0gMTE4OworICBvcHRpb25hbCAgIHVpbnQ2NCBwcm90bzNfb3B0aW9uYWxfdWludDY0ICAgPSAxMTk7CisgIG9wdGlvbmFsICAgc2ludDMyIHByb3RvM19vcHRpb25hbF9zaW50MzIgICA9IDEyMDsKKyAgb3B0aW9uYWwgICBzaW50NjQgcHJvdG8zX29wdGlvbmFsX3NpbnQ2NCAgID0gMTIxOworICBvcHRpb25hbCAgZml4ZWQzMiBwcm90bzNfb3B0aW9uYWxfZml4ZWQzMiAgPSAxMjI7CisgIG9wdGlvbmFsICBmaXhlZDY0IHByb3RvM19vcHRpb25hbF9maXhlZDY0ICA9IDEyMzsKKyAgb3B0aW9uYWwgc2ZpeGVkMzIgcHJvdG8zX29wdGlvbmFsX3NmaXhlZDMyID0gMTI0OworICBvcHRpb25hbCBzZml4ZWQ2NCBwcm90bzNfb3B0aW9uYWxfc2ZpeGVkNjQgPSAxMjU7CisgIG9wdGlvbmFsICAgIGZsb2F0IHByb3RvM19vcHRpb25hbF9mbG9hdCAgICA9IDEyNjsKKyAgb3B0aW9uYWwgICBkb3VibGUgcHJvdG8zX29wdGlvbmFsX2RvdWJsZSAgID0gMTI3OworICBvcHRpb25hbCAgICAgYm9vbCBwcm90bzNfb3B0aW9uYWxfYm9vbCAgICAgPSAxMjg7CisgIG9wdGlvbmFsICAgc3RyaW5nIHByb3RvM19vcHRpb25hbF9zdHJpbmcgICA9IDEyOTsKKyAgb3B0aW9uYWwgICAgYnl0ZXMgcHJvdG8zX29wdGlvbmFsX2J5dGVzICAgID0gMTMwOworCisgIC8vIEdyb3VwcyBhcmUgbm90IGFsbG93ZWQgaW4gcHJvdG8zLgorICAvLyByZXBlYXRlZCBncm91cCBSZXBlYXRlZEdyb3VwID0gNDYgeworICAvLyAgIG9wdGlvbmFsIGludDMyIGEgPSA0NzsKKyAgLy8gfQorCisgIHJlcGVhdGVkIE5lc3RlZE1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAgPSA0ODsKKyAgcmVwZWF0ZWQgRm9yZWlnbk1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSA9IDQ5OworICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZSByZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAgPSA1MDsKKworICByZXBlYXRlZCBOZXN0ZWRFbnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfbmVzdGVkX2VudW0gICAgID0gNTE7CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZF9mb3JlaWduX2VudW0gICAgPSA1MjsKKworICAvLyBPbWl0dGVkIChjb21wYXJlZCB0byB1bml0dGVzdC5wcm90bykgYmVjYXVzZSBwcm90bzIgZW51bXMgYXJlIG5vdCBhbGxvd2VkCisgIC8vIGluc2lkZSBwcm90bzIgbWVzc2FnZXMuCisgIC8vCisgIC8vIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtICAgIHJlcGVhdGVkX2ltcG9ydF9lbnVtICA9IDUzOworCisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfcGllY2UgPSA1NCBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX2NvcmQgPSA1NSBbY3R5cGU9Q09SRF07CisKKyAgcmVwZWF0ZWQgTmVzdGVkTWVzc2FnZSByZXBlYXRlZF9sYXp5X21lc3NhZ2UgPSA1NyBbbGF6eT10cnVlXTsKKworICBvbmVvZiBvbmVvZl9maWVsZCB7CisgICAgdWludDMyIG9uZW9mX3VpbnQzMiA9IDExMTsKKyAgICBOZXN0ZWRNZXNzYWdlIG9uZW9mX25lc3RlZF9tZXNzYWdlID0gMTEyOworICAgIHN0cmluZyBvbmVvZl9zdHJpbmcgPSAxMTM7CisgICAgYnl0ZXMgb25lb2ZfYnl0ZXMgPSAxMTQ7CisgIH0KK30KKworLy8gVGVzdCBtZXNzYWdlcyBmb3IgcGFja2VkIGZpZWxkcworCittZXNzYWdlIFRlc3RQYWNrZWRUeXBlcyB7CisgIHJlcGVhdGVkICAgIGludDMyIHBhY2tlZF9pbnQzMiAgICA9ICA5MCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgIGludDY0IHBhY2tlZF9pbnQ2NCAgICA9ICA5MSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgdWludDMyIHBhY2tlZF91aW50MzIgICA9ICA5MiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgdWludDY0IHBhY2tlZF91aW50NjQgICA9ICA5MyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgc2ludDMyIHBhY2tlZF9zaW50MzIgICA9ICA5NCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgc2ludDY0IHBhY2tlZF9zaW50NjQgICA9ICA5NSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICBmaXhlZDMyIHBhY2tlZF9maXhlZDMyICA9ICA5NiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICBmaXhlZDY0IHBhY2tlZF9maXhlZDY0ICA9ICA5NyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDMyIHBhY2tlZF9zZml4ZWQzMiA9ICA5OCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHBhY2tlZF9zZml4ZWQ2NCA9ICA5OSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgIGZsb2F0IHBhY2tlZF9mbG9hdCAgICA9IDEwMCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgZG91YmxlIHBhY2tlZF9kb3VibGUgICA9IDEwMSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgICBib29sIHBhY2tlZF9ib29sICAgICA9IDEwMiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtIHBhY2tlZF9lbnVtICA9IDEwMyBbcGFja2VkID0gdHJ1ZV07Cit9CisKKy8vIEV4cGxpY2l0bHkgc2V0IHBhY2tlZCB0byBmYWxzZQorbWVzc2FnZSBUZXN0VW5wYWNrZWRUeXBlcyB7CisgIHJlcGVhdGVkICAgIGludDMyIHJlcGVhdGVkX2ludDMyICAgID0gIDEgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICAgaW50NjQgcmVwZWF0ZWRfaW50NjQgICAgPSAgMiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzIgICA9ICAzIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgdWludDY0IHJlcGVhdGVkX3VpbnQ2NCAgID0gIDQgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICBzaW50MzIgcmVwZWF0ZWRfc2ludDMyICAgPSAgNSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgICA9ICA2IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICBmaXhlZDMyIHJlcGVhdGVkX2ZpeGVkMzIgID0gIDcgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NCAgPSAgOCBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9ICA5IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHJlcGVhdGVkX3NmaXhlZDY0ID0gMTAgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICAgZmxvYXQgcmVwZWF0ZWRfZmxvYXQgICAgPSAxMSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgICA9IDEyIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgICBib29sIHJlcGVhdGVkX2Jvb2wgICAgID0gMTMgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0gcmVwZWF0ZWRfbmVzdGVkX2VudW0gPSAxNCBbcGFja2VkID0gZmFsc2VdOworfQorCisvLyBUaGlzIHByb3RvIGluY2x1ZGVzIGEgcmVjdXJzaXZlbHkgbmVzdGVkIG1lc3NhZ2UuCittZXNzYWdlIE5lc3RlZFRlc3RBbGxUeXBlcyB7CisgIE5lc3RlZFRlc3RBbGxUeXBlcyBjaGlsZCA9IDE7CisgIFRlc3RBbGxUeXBlcyBwYXlsb2FkID0gMjsKKyAgcmVwZWF0ZWQgTmVzdGVkVGVzdEFsbFR5cGVzIHJlcGVhdGVkX2NoaWxkID0gMzsKK30KKworLy8gRGVmaW5lIHRoZXNlIGFmdGVyIFRlc3RBbGxUeXBlcyB0byBtYWtlIHN1cmUgdGhlIGNvbXBpbGVyIGNhbiBoYW5kbGUKKy8vIHRoYXQuCittZXNzYWdlIEZvcmVpZ25NZXNzYWdlIHsKKyAgaW50MzIgYyA9IDE7Cit9CisKK2VudW0gRm9yZWlnbkVudW0geworICBGT1JFSUdOX1pFUk8gPSAwOworICBGT1JFSUdOX0ZPTyA9IDQ7CisgIEZPUkVJR05fQkFSID0gNTsKKyAgRk9SRUlHTl9CQVogPSA2OworfQorCisvLyBUZXN0RW1wdHlNZXNzYWdlIGlzIHVzZWQgdG8gdGVzdCBiZWhhdmlvciBvZiB1bmtub3duIGZpZWxkcy4KK21lc3NhZ2UgVGVzdEVtcHR5TWVzc2FnZSB7Cit9CisKKy8vIE5lZWRlZCBmb3IgYSBQeXRob24gdGVzdC4KK21lc3NhZ2UgVGVzdFBpY2tsZU5lc3RlZE1lc3NhZ2UgeworICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICAgIGludDMyIGJiID0gMTsKKyAgICBtZXNzYWdlIE5lc3RlZE5lc3RlZE1lc3NhZ2UgeworICAgICAgaW50MzIgY2MgPSAxOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0MjE4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucHJvdG8KQEAgLTAsMCArMSwyMDUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBwcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdDsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvIjsKKworb3B0aW9uIGNjX2VuYWJsZV9hcmVuYXMgPSB0cnVlOworb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKKworLy8gVGhpcyBwcm90byBpbmNsdWRlcyBldmVyeSB0eXBlIG9mIGZpZWxkIGluIGJvdGggc2luZ3VsYXIgYW5kIHJlcGVhdGVkCisvLyBmb3Jtcy4KK21lc3NhZ2UgVGVzdEFsbFR5cGVzIHsKKyAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKKyAgICAvLyBUaGUgZmllbGQgbmFtZSAiYiIgZmFpbHMgdG8gY29tcGlsZSBpbiBwcm90bzEgYmVjYXVzZSBpdCBjb25mbGljdHMgd2l0aAorICAgIC8vIGEgbG9jYWwgdmFyaWFibGUgbmFtZWQgImIiIGluIG9uZSBvZiB0aGUgZ2VuZXJhdGVkIG1ldGhvZHMuICBEb2guCisgICAgLy8gVGhpcyBmaWxlIG5lZWRzIHRvIGNvbXBpbGUgaW4gcHJvdG8xIHRvIHRlc3QgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkuCisgICAgaW50MzIgYmIgPSAxOworICB9CisKKyAgZW51bSBOZXN0ZWRFbnVtIHsKKyAgICBaRVJPID0gMDsKKyAgICBGT08gPSAxOworICAgIEJBUiA9IDI7CisgICAgQkFaID0gMzsKKyAgICBORUcgPSAtMTsgIC8vIEludGVudGlvbmFsbHkgbmVnYXRpdmUuCisgIH0KKworICAvLyBTaW5ndWxhcgorICBpbnQzMiBvcHRpb25hbF9pbnQzMiA9IDE7CisgIGludDY0IG9wdGlvbmFsX2ludDY0ID0gMjsKKyAgdWludDMyIG9wdGlvbmFsX3VpbnQzMiA9IDM7CisgIHVpbnQ2NCBvcHRpb25hbF91aW50NjQgPSA0OworICBzaW50MzIgb3B0aW9uYWxfc2ludDMyID0gNTsKKyAgc2ludDY0IG9wdGlvbmFsX3NpbnQ2NCA9IDY7CisgIGZpeGVkMzIgb3B0aW9uYWxfZml4ZWQzMiA9IDc7CisgIGZpeGVkNjQgb3B0aW9uYWxfZml4ZWQ2NCA9IDg7CisgIHNmaXhlZDMyIG9wdGlvbmFsX3NmaXhlZDMyID0gOTsKKyAgc2ZpeGVkNjQgb3B0aW9uYWxfc2ZpeGVkNjQgPSAxMDsKKyAgZmxvYXQgb3B0aW9uYWxfZmxvYXQgPSAxMTsKKyAgZG91YmxlIG9wdGlvbmFsX2RvdWJsZSA9IDEyOworICBib29sIG9wdGlvbmFsX2Jvb2wgPSAxMzsKKyAgc3RyaW5nIG9wdGlvbmFsX3N0cmluZyA9IDE0OworICBieXRlcyBvcHRpb25hbF9ieXRlcyA9IDE1OworCisgIC8vIEdyb3VwcyBhcmUgbm90IGFsbG93ZWQgaW4gcHJvdG8zLgorICAvLyBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwID0gMTYgeworICAvLyAgIG9wdGlvbmFsIGludDMyIGEgPSAxNzsKKyAgLy8gfQorCisgIE5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgPSAxODsKKyAgRm9yZWlnbk1lc3NhZ2Ugb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlID0gMTk7CisgIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlIG9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlID0gMjA7CisKKyAgTmVzdGVkRW51bSBvcHRpb25hbF9uZXN0ZWRfZW51bSA9IDIxOworICBGb3JlaWduRW51bSBvcHRpb25hbF9mb3JlaWduX2VudW0gPSAyMjsKKworICAvLyBPbWl0dGVkIChjb21wYXJlZCB0byB1bml0dGVzdC5wcm90bykgYmVjYXVzZSBwcm90bzIgZW51bXMgYXJlIG5vdCBhbGxvd2VkCisgIC8vIGluc2lkZSBwcm90bzIgbWVzc2FnZXMuCisgIC8vCisgIC8vIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtICAgIG9wdGlvbmFsX2ltcG9ydF9lbnVtICA9IDIzOworCisgIHN0cmluZyBvcHRpb25hbF9zdHJpbmdfcGllY2UgPSAyNCBbY3R5cGUgPSBTVFJJTkdfUElFQ0VdOworICBzdHJpbmcgb3B0aW9uYWxfY29yZCA9IDI1IFtjdHlwZSA9IENPUkRdOworCisgIC8vIERlZmluZWQgaW4gdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wcm90bworICBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuUHVibGljSW1wb3J0TWVzc2FnZSBvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UgPQorICAgICAgMjY7CisKKyAgTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9sYXp5X21lc3NhZ2UgPSAyNyBbbGF6eSA9IHRydWVdOworCisgIC8vIFJlcGVhdGVkCisgIHJlcGVhdGVkIGludDMyIHJlcGVhdGVkX2ludDMyID0gMzE7CisgIHJlcGVhdGVkIGludDY0IHJlcGVhdGVkX2ludDY0ID0gMzI7CisgIHJlcGVhdGVkIHVpbnQzMiByZXBlYXRlZF91aW50MzIgPSAzMzsKKyAgcmVwZWF0ZWQgdWludDY0IHJlcGVhdGVkX3VpbnQ2NCA9IDM0OworICByZXBlYXRlZCBzaW50MzIgcmVwZWF0ZWRfc2ludDMyID0gMzU7CisgIHJlcGVhdGVkIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgPSAzNjsKKyAgcmVwZWF0ZWQgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyID0gMzc7CisgIHJlcGVhdGVkIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NCA9IDM4OworICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9IDM5OworICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDQwOworICByZXBlYXRlZCBmbG9hdCByZXBlYXRlZF9mbG9hdCA9IDQxOworICByZXBlYXRlZCBkb3VibGUgcmVwZWF0ZWRfZG91YmxlID0gNDI7CisgIHJlcGVhdGVkIGJvb2wgcmVwZWF0ZWRfYm9vbCA9IDQzOworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nID0gNDQ7CisgIHJlcGVhdGVkIGJ5dGVzIHJlcGVhdGVkX2J5dGVzID0gNDU7CisKKyAgLy8gR3JvdXBzIGFyZSBub3QgYWxsb3dlZCBpbiBwcm90bzMuCisgIC8vIHJlcGVhdGVkIGdyb3VwIFJlcGVhdGVkR3JvdXAgPSA0NiB7CisgIC8vICAgb3B0aW9uYWwgaW50MzIgYSA9IDQ3OworICAvLyB9CisKKyAgcmVwZWF0ZWQgTmVzdGVkTWVzc2FnZSByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSA9IDQ4OworICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSByZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UgPSA0OTsKKyAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2UgcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgPSA1MDsKKworICByZXBlYXRlZCBOZXN0ZWRFbnVtIHJlcGVhdGVkX25lc3RlZF9lbnVtID0gNTE7CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtIHJlcGVhdGVkX2ZvcmVpZ25fZW51bSA9IDUyOworCisgIC8vIE9taXR0ZWQgKGNvbXBhcmVkIHRvIHVuaXR0ZXN0LnByb3RvKSBiZWNhdXNlIHByb3RvMiBlbnVtcyBhcmUgbm90IGFsbG93ZWQKKyAgLy8gaW5zaWRlIHByb3RvMiBtZXNzYWdlcy4KKyAgLy8KKyAgLy8gcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW0gICAgcmVwZWF0ZWRfaW1wb3J0X2VudW0gID0gNTM7CisKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZ19waWVjZSA9IDU0IFtjdHlwZSA9IFNUUklOR19QSUVDRV07CisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9jb3JkID0gNTUgW2N0eXBlID0gQ09SRF07CisKKyAgcmVwZWF0ZWQgTmVzdGVkTWVzc2FnZSByZXBlYXRlZF9sYXp5X21lc3NhZ2UgPSA1NyBbbGF6eSA9IHRydWVdOworCisgIG9uZW9mIG9uZW9mX2ZpZWxkIHsKKyAgICB1aW50MzIgb25lb2ZfdWludDMyID0gMTExOworICAgIE5lc3RlZE1lc3NhZ2Ugb25lb2ZfbmVzdGVkX21lc3NhZ2UgPSAxMTI7CisgICAgc3RyaW5nIG9uZW9mX3N0cmluZyA9IDExMzsKKyAgICBieXRlcyBvbmVvZl9ieXRlcyA9IDExNDsKKyAgfQorfQorCisvLyBUZXN0IG1lc3NhZ2VzIGZvciBwYWNrZWQgZmllbGRzCisKK21lc3NhZ2UgVGVzdFBhY2tlZFR5cGVzIHsKKyAgcmVwZWF0ZWQgaW50MzIgcGFja2VkX2ludDMyID0gOTAgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBpbnQ2NCBwYWNrZWRfaW50NjQgPSA5MSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHVpbnQzMiBwYWNrZWRfdWludDMyID0gOTIgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCB1aW50NjQgcGFja2VkX3VpbnQ2NCA9IDkzIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ludDMyIHBhY2tlZF9zaW50MzIgPSA5NCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNpbnQ2NCBwYWNrZWRfc2ludDY0ID0gOTUgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBmaXhlZDMyIHBhY2tlZF9maXhlZDMyID0gOTYgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBmaXhlZDY0IHBhY2tlZF9maXhlZDY0ID0gOTcgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQzMiBwYWNrZWRfc2ZpeGVkMzIgPSA5OCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHBhY2tlZF9zZml4ZWQ2NCA9IDk5IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgZmxvYXQgcGFja2VkX2Zsb2F0ID0gMTAwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgZG91YmxlIHBhY2tlZF9kb3VibGUgPSAxMDEgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBib29sIHBhY2tlZF9ib29sID0gMTAyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gcGFja2VkX2VudW0gPSAxMDMgW3BhY2tlZCA9IHRydWVdOworfQorCisvLyBFeHBsaWNpdGx5IHNldCBwYWNrZWQgdG8gZmFsc2UKK21lc3NhZ2UgVGVzdFVucGFja2VkVHlwZXMgeworICByZXBlYXRlZCBpbnQzMiByZXBlYXRlZF9pbnQzMiA9IDEgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgaW50NjQgcmVwZWF0ZWRfaW50NjQgPSAyIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHVpbnQzMiByZXBlYXRlZF91aW50MzIgPSAzIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgPSA0IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHNpbnQzMiByZXBlYXRlZF9zaW50MzIgPSA1IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgPSA2IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIGZpeGVkMzIgcmVwZWF0ZWRfZml4ZWQzMiA9IDcgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ID0gOCBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9IDkgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgcmVwZWF0ZWRfc2ZpeGVkNjQgPSAxMCBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBmbG9hdCByZXBlYXRlZF9mbG9hdCA9IDExIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgPSAxMiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBib29sIHJlcGVhdGVkX2Jvb2wgPSAxMyBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bSByZXBlYXRlZF9uZXN0ZWRfZW51bSA9IDE0IFtwYWNrZWQgPSBmYWxzZV07Cit9CisKKy8vIFRoaXMgcHJvdG8gaW5jbHVkZXMgYSByZWN1cnNpdmVseSBuZXN0ZWQgbWVzc2FnZS4KK21lc3NhZ2UgTmVzdGVkVGVzdEFsbFR5cGVzIHsKKyAgTmVzdGVkVGVzdEFsbFR5cGVzIGNoaWxkID0gMTsKKyAgVGVzdEFsbFR5cGVzIHBheWxvYWQgPSAyOworfQorCisvLyBEZWZpbmUgdGhlc2UgYWZ0ZXIgVGVzdEFsbFR5cGVzIHRvIG1ha2Ugc3VyZSB0aGUgY29tcGlsZXIgY2FuIGhhbmRsZQorLy8gdGhhdC4KK21lc3NhZ2UgRm9yZWlnbk1lc3NhZ2UgeworICBpbnQzMiBjID0gMTsKK30KKworZW51bSBGb3JlaWduRW51bSB7CisgIEZPUkVJR05fWkVSTyA9IDA7CisgIEZPUkVJR05fRk9PID0gNDsKKyAgRk9SRUlHTl9CQVIgPSA1OworICBGT1JFSUdOX0JBWiA9IDY7Cit9CisKKy8vIFRlc3RFbXB0eU1lc3NhZ2UgaXMgdXNlZCB0byB0ZXN0IGJlaGF2aW9yIG9mIHVua25vd24gZmllbGRzLgorbWVzc2FnZSBUZXN0RW1wdHlNZXNzYWdlIHt9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzdiYjAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wcm90bwpAQCAtMCwwICsxLDIwNCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIHByb3RvM19saXRlX3VuaXR0ZXN0OworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8iOworCitvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworCisvLyBUaGlzIHByb3RvIGluY2x1ZGVzIGV2ZXJ5IHR5cGUgb2YgZmllbGQgaW4gYm90aCBzaW5ndWxhciBhbmQgcmVwZWF0ZWQKKy8vIGZvcm1zLgorbWVzc2FnZSBUZXN0QWxsVHlwZXMgeworICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICAgIC8vIFRoZSBmaWVsZCBuYW1lICJiIiBmYWlscyB0byBjb21waWxlIGluIHByb3RvMSBiZWNhdXNlIGl0IGNvbmZsaWN0cyB3aXRoCisgICAgLy8gYSBsb2NhbCB2YXJpYWJsZSBuYW1lZCAiYiIgaW4gb25lIG9mIHRoZSBnZW5lcmF0ZWQgbWV0aG9kcy4gIERvaC4KKyAgICAvLyBUaGlzIGZpbGUgbmVlZHMgdG8gY29tcGlsZSBpbiBwcm90bzEgdG8gdGVzdCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4KKyAgICBpbnQzMiBiYiA9IDE7CisgIH0KKworICBlbnVtIE5lc3RlZEVudW0geworICAgIFpFUk8gPSAwOworICAgIEZPTyA9IDE7CisgICAgQkFSID0gMjsKKyAgICBCQVogPSAzOworICAgIE5FRyA9IC0xOyAgLy8gSW50ZW50aW9uYWxseSBuZWdhdGl2ZS4KKyAgfQorCisgIC8vIFNpbmd1bGFyCisgIGludDMyIG9wdGlvbmFsX2ludDMyID0gMTsKKyAgaW50NjQgb3B0aW9uYWxfaW50NjQgPSAyOworICB1aW50MzIgb3B0aW9uYWxfdWludDMyID0gMzsKKyAgdWludDY0IG9wdGlvbmFsX3VpbnQ2NCA9IDQ7CisgIHNpbnQzMiBvcHRpb25hbF9zaW50MzIgPSA1OworICBzaW50NjQgb3B0aW9uYWxfc2ludDY0ID0gNjsKKyAgZml4ZWQzMiBvcHRpb25hbF9maXhlZDMyID0gNzsKKyAgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0ID0gODsKKyAgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzIgPSA5OworICBzZml4ZWQ2NCBvcHRpb25hbF9zZml4ZWQ2NCA9IDEwOworICBmbG9hdCBvcHRpb25hbF9mbG9hdCA9IDExOworICBkb3VibGUgb3B0aW9uYWxfZG91YmxlID0gMTI7CisgIGJvb2wgb3B0aW9uYWxfYm9vbCA9IDEzOworICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nID0gMTQ7CisgIGJ5dGVzIG9wdGlvbmFsX2J5dGVzID0gMTU7CisKKyAgLy8gR3JvdXBzIGFyZSBub3QgYWxsb3dlZCBpbiBwcm90bzMuCisgIC8vIG9wdGlvbmFsIGdyb3VwIE9wdGlvbmFsR3JvdXAgPSAxNiB7CisgIC8vICAgb3B0aW9uYWwgaW50MzIgYSA9IDE3OworICAvLyB9CisKKyAgTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSA9IDE4OworICBGb3JlaWduTWVzc2FnZSBvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgPSAxOTsKKyAgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2Ugb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgPSAyMDsKKworICBOZXN0ZWRFbnVtIG9wdGlvbmFsX25lc3RlZF9lbnVtID0gMjE7CisgIEZvcmVpZ25FbnVtIG9wdGlvbmFsX2ZvcmVpZ25fZW51bSA9IDIyOworCisgIC8vIE9taXR0ZWQgKGNvbXBhcmVkIHRvIHVuaXR0ZXN0LnByb3RvKSBiZWNhdXNlIHByb3RvMiBlbnVtcyBhcmUgbm90IGFsbG93ZWQKKyAgLy8gaW5zaWRlIHByb3RvMiBtZXNzYWdlcy4KKyAgLy8KKyAgLy8gb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW0gICAgb3B0aW9uYWxfaW1wb3J0X2VudW0gID0gMjM7CisKKyAgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZSA9IDI0IFtjdHlwZSA9IFNUUklOR19QSUVDRV07CisgIHN0cmluZyBvcHRpb25hbF9jb3JkID0gMjUgW2N0eXBlID0gQ09SRF07CisKKyAgLy8gRGVmaW5lZCBpbiB1bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvCisgIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5QdWJsaWNJbXBvcnRNZXNzYWdlIG9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSA9CisgICAgICAyNjsKKworICBOZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX2xhenlfbWVzc2FnZSA9IDI3IFtsYXp5ID0gdHJ1ZV07CisKKyAgLy8gUmVwZWF0ZWQKKyAgcmVwZWF0ZWQgaW50MzIgcmVwZWF0ZWRfaW50MzIgPSAzMTsKKyAgcmVwZWF0ZWQgaW50NjQgcmVwZWF0ZWRfaW50NjQgPSAzMjsKKyAgcmVwZWF0ZWQgdWludDMyIHJlcGVhdGVkX3VpbnQzMiA9IDMzOworICByZXBlYXRlZCB1aW50NjQgcmVwZWF0ZWRfdWludDY0ID0gMzQ7CisgIHJlcGVhdGVkIHNpbnQzMiByZXBlYXRlZF9zaW50MzIgPSAzNTsKKyAgcmVwZWF0ZWQgc2ludDY0IHJlcGVhdGVkX3NpbnQ2NCA9IDM2OworICByZXBlYXRlZCBmaXhlZDMyIHJlcGVhdGVkX2ZpeGVkMzIgPSAzNzsKKyAgcmVwZWF0ZWQgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ID0gMzg7CisgIHJlcGVhdGVkIHNmaXhlZDMyIHJlcGVhdGVkX3NmaXhlZDMyID0gMzk7CisgIHJlcGVhdGVkIHNmaXhlZDY0IHJlcGVhdGVkX3NmaXhlZDY0ID0gNDA7CisgIHJlcGVhdGVkIGZsb2F0IHJlcGVhdGVkX2Zsb2F0ID0gNDE7CisgIHJlcGVhdGVkIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgPSA0MjsKKyAgcmVwZWF0ZWQgYm9vbCByZXBlYXRlZF9ib29sID0gNDM7CisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9zdHJpbmcgPSA0NDsKKyAgcmVwZWF0ZWQgYnl0ZXMgcmVwZWF0ZWRfYnl0ZXMgPSA0NTsKKworICAvLyBHcm91cHMgYXJlIG5vdCBhbGxvd2VkIGluIHByb3RvMy4KKyAgLy8gcmVwZWF0ZWQgZ3JvdXAgUmVwZWF0ZWRHcm91cCA9IDQ2IHsKKyAgLy8gICBvcHRpb25hbCBpbnQzMiBhID0gNDc7CisgIC8vIH0KKworICByZXBlYXRlZCBOZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlID0gNDg7CisgIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSA9IDQ5OworICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZSByZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSA9IDUwOworCisgIHJlcGVhdGVkIE5lc3RlZEVudW0gcmVwZWF0ZWRfbmVzdGVkX2VudW0gPSA1MTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gcmVwZWF0ZWRfZm9yZWlnbl9lbnVtID0gNTI7CisKKyAgLy8gT21pdHRlZCAoY29tcGFyZWQgdG8gdW5pdHRlc3QucHJvdG8pIGJlY2F1c2UgcHJvdG8yIGVudW1zIGFyZSBub3QgYWxsb3dlZAorICAvLyBpbnNpZGUgcHJvdG8yIG1lc3NhZ2VzLgorICAvLworICAvLyByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bSAgICByZXBlYXRlZF9pbXBvcnRfZW51bSAgPSA1MzsKKworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3BpZWNlID0gNTQgW2N0eXBlID0gU1RSSU5HX1BJRUNFXTsKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX2NvcmQgPSA1NSBbY3R5cGUgPSBDT1JEXTsKKworICByZXBlYXRlZCBOZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX2xhenlfbWVzc2FnZSA9IDU3IFtsYXp5ID0gdHJ1ZV07CisKKyAgb25lb2Ygb25lb2ZfZmllbGQgeworICAgIHVpbnQzMiBvbmVvZl91aW50MzIgPSAxMTE7CisgICAgTmVzdGVkTWVzc2FnZSBvbmVvZl9uZXN0ZWRfbWVzc2FnZSA9IDExMjsKKyAgICBzdHJpbmcgb25lb2Zfc3RyaW5nID0gMTEzOworICAgIGJ5dGVzIG9uZW9mX2J5dGVzID0gMTE0OworICB9Cit9CisKKy8vIFRlc3QgbWVzc2FnZXMgZm9yIHBhY2tlZCBmaWVsZHMKKworbWVzc2FnZSBUZXN0UGFja2VkVHlwZXMgeworICByZXBlYXRlZCBpbnQzMiBwYWNrZWRfaW50MzIgPSA5MCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIGludDY0IHBhY2tlZF9pbnQ2NCA9IDkxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgdWludDMyIHBhY2tlZF91aW50MzIgPSA5MiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHVpbnQ2NCBwYWNrZWRfdWludDY0ID0gOTMgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzaW50MzIgcGFja2VkX3NpbnQzMiA9IDk0IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ludDY0IHBhY2tlZF9zaW50NjQgPSA5NSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIGZpeGVkMzIgcGFja2VkX2ZpeGVkMzIgPSA5NiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIGZpeGVkNjQgcGFja2VkX2ZpeGVkNjQgPSA5NyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDMyIHBhY2tlZF9zZml4ZWQzMiA9IDk4IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgcGFja2VkX3NmaXhlZDY0ID0gOTkgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBmbG9hdCBwYWNrZWRfZmxvYXQgPSAxMDAgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBkb3VibGUgcGFja2VkX2RvdWJsZSA9IDEwMSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIGJvb2wgcGFja2VkX2Jvb2wgPSAxMDIgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBGb3JlaWduRW51bSBwYWNrZWRfZW51bSA9IDEwMyBbcGFja2VkID0gdHJ1ZV07Cit9CisKKy8vIEV4cGxpY2l0bHkgc2V0IHBhY2tlZCB0byBmYWxzZQorbWVzc2FnZSBUZXN0VW5wYWNrZWRUeXBlcyB7CisgIHJlcGVhdGVkIGludDMyIHJlcGVhdGVkX2ludDMyID0gMSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBpbnQ2NCByZXBlYXRlZF9pbnQ2NCA9IDIgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgdWludDMyIHJlcGVhdGVkX3VpbnQzMiA9IDMgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgdWludDY0IHJlcGVhdGVkX3VpbnQ2NCA9IDQgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgc2ludDMyIHJlcGVhdGVkX3NpbnQzMiA9IDUgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgc2ludDY0IHJlcGVhdGVkX3NpbnQ2NCA9IDYgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyID0gNyBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBmaXhlZDY0IHJlcGVhdGVkX2ZpeGVkNjQgPSA4IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHNmaXhlZDMyIHJlcGVhdGVkX3NmaXhlZDMyID0gOSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDEwIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIGZsb2F0IHJlcGVhdGVkX2Zsb2F0ID0gMTEgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgZG91YmxlIHJlcGVhdGVkX2RvdWJsZSA9IDEyIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIGJvb2wgcmVwZWF0ZWRfYm9vbCA9IDEzIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtIHJlcGVhdGVkX25lc3RlZF9lbnVtID0gMTQgW3BhY2tlZCA9IGZhbHNlXTsKK30KKworLy8gVGhpcyBwcm90byBpbmNsdWRlcyBhIHJlY3Vyc2l2ZWx5IG5lc3RlZCBtZXNzYWdlLgorbWVzc2FnZSBOZXN0ZWRUZXN0QWxsVHlwZXMgeworICBOZXN0ZWRUZXN0QWxsVHlwZXMgY2hpbGQgPSAxOworICBUZXN0QWxsVHlwZXMgcGF5bG9hZCA9IDI7Cit9CisKKy8vIERlZmluZSB0aGVzZSBhZnRlciBUZXN0QWxsVHlwZXMgdG8gbWFrZSBzdXJlIHRoZSBjb21waWxlciBjYW4gaGFuZGxlCisvLyB0aGF0LgorbWVzc2FnZSBGb3JlaWduTWVzc2FnZSB7CisgIGludDMyIGMgPSAxOworfQorCitlbnVtIEZvcmVpZ25FbnVtIHsKKyAgRk9SRUlHTl9aRVJPID0gMDsKKyAgRk9SRUlHTl9GT08gPSA0OworICBGT1JFSUdOX0JBUiA9IDU7CisgIEZPUkVJR05fQkFaID0gNjsKK30KKworLy8gVGVzdEVtcHR5TWVzc2FnZSBpcyB1c2VkIHRvIHRlc3QgYmVoYXZpb3Igb2YgdW5rbm93biBmaWVsZHMuCittZXNzYWdlIFRlc3RFbXB0eU1lc3NhZ2Uge30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfb3B0aW9uYWwucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlkMTcxOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX29wdGlvbmFsLnByb3RvCkBAIC0wLDAgKzEsMTAwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iOworCitvcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7CitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYudGVzdGluZy5wcm90byI7CisKK21lc3NhZ2UgVGVzdFByb3RvM09wdGlvbmFsIHsKKyAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKKyAgICAvLyBUaGUgZmllbGQgbmFtZSAiYiIgZmFpbHMgdG8gY29tcGlsZSBpbiBwcm90bzEgYmVjYXVzZSBpdCBjb25mbGljdHMgd2l0aAorICAgIC8vIGEgbG9jYWwgdmFyaWFibGUgbmFtZWQgImIiIGluIG9uZSBvZiB0aGUgZ2VuZXJhdGVkIG1ldGhvZHMuICBEb2guCisgICAgLy8gVGhpcyBmaWxlIG5lZWRzIHRvIGNvbXBpbGUgaW4gcHJvdG8xIHRvIHRlc3QgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkuCisgICAgb3B0aW9uYWwgaW50MzIgYmIgPSAxOworICB9CisKKyAgZW51bSBOZXN0ZWRFbnVtIHsKKyAgICBVTlNQRUNJRklFRCA9IDA7CisgICAgRk9PID0gMTsKKyAgICBCQVIgPSAyOworICAgIEJBWiA9IDM7CisgICAgTkVHID0gLTE7ICAvLyBJbnRlbnRpb25hbGx5IG5lZ2F0aXZlLgorICB9CisKKyAgLy8gU2luZ3VsYXIKKyAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzIgPSAxOworICBvcHRpb25hbCBpbnQ2NCBvcHRpb25hbF9pbnQ2NCA9IDI7CisgIG9wdGlvbmFsIHVpbnQzMiBvcHRpb25hbF91aW50MzIgPSAzOworICBvcHRpb25hbCB1aW50NjQgb3B0aW9uYWxfdWludDY0ID0gNDsKKyAgb3B0aW9uYWwgc2ludDMyIG9wdGlvbmFsX3NpbnQzMiA9IDU7CisgIG9wdGlvbmFsIHNpbnQ2NCBvcHRpb25hbF9zaW50NjQgPSA2OworICBvcHRpb25hbCBmaXhlZDMyIG9wdGlvbmFsX2ZpeGVkMzIgPSA3OworICBvcHRpb25hbCBmaXhlZDY0IG9wdGlvbmFsX2ZpeGVkNjQgPSA4OworICBvcHRpb25hbCBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMiA9IDk7CisgIG9wdGlvbmFsIHNmaXhlZDY0IG9wdGlvbmFsX3NmaXhlZDY0ID0gMTA7CisgIG9wdGlvbmFsIGZsb2F0IG9wdGlvbmFsX2Zsb2F0ID0gMTE7CisgIG9wdGlvbmFsIGRvdWJsZSBvcHRpb25hbF9kb3VibGUgPSAxMjsKKyAgb3B0aW9uYWwgYm9vbCBvcHRpb25hbF9ib29sID0gMTM7CisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9zdHJpbmcgPSAxNDsKKyAgb3B0aW9uYWwgYnl0ZXMgb3B0aW9uYWxfYnl0ZXMgPSAxNTsKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX2NvcmQgPSAxNiBbY3R5cGUgPSBDT1JEXTsKKworICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlID0gMTg7CisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2UgbGF6eV9uZXN0ZWRfbWVzc2FnZSA9IDE5IFtsYXp5ID0gdHJ1ZV07CisgIG9wdGlvbmFsIE5lc3RlZEVudW0gb3B0aW9uYWxfbmVzdGVkX2VudW0gPSAyMTsKKworICAvLyBBZGQgc29tZSBub24tb3B0aW9uYWwgZmllbGRzIHRvIHZlcmlmeSB3ZSBjYW4gbWl4IHRoZW0uCisgIGludDMyIHNpbmd1bGFyX2ludDMyID0gMjI7CisgIGludDY0IHNpbmd1bGFyX2ludDY0ID0gMjM7Cit9CisKK21lc3NhZ2UgVGVzdFByb3RvM09wdGlvbmFsTWVzc2FnZSB7CisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgc3RyaW5nIHMgPSAxOworICB9CisKKyAgTmVzdGVkTWVzc2FnZSBuZXN0ZWRfbWVzc2FnZSA9IDE7CisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgPSAyOworfQorCittZXNzYWdlIFByb3RvM09wdGlvbmFsRXh0ZW5zaW9ucyB7CisgIG9wdGlvbiAocHJvdG9idWZfdW5pdHRlc3QuUHJvdG8zT3B0aW9uYWxFeHRlbnNpb25zLmV4dF9ub19vcHRpb25hbCkgPSA4OworICBvcHRpb24gKHByb3RvYnVmX3VuaXR0ZXN0LlByb3RvM09wdGlvbmFsRXh0ZW5zaW9ucy5leHRfd2l0aF9vcHRpb25hbCkgPSAxNjsKKworICBleHRlbmQgZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIHsKKyAgICBpbnQzMiBleHRfbm9fb3B0aW9uYWwgPSAzNTU4ODY3Mjg7CisgICAgb3B0aW9uYWwgaW50MzIgZXh0X3dpdGhfb3B0aW9uYWwgPSAzNTU4ODY3Mjk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTA3NTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnByb3RvCkBAIC0wLDAgKzEsMTE0IEBACitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworb3B0aW9uIGNzaGFycF9uYW1lc3BhY2UgPSAiR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MiOworb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3QiOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8iOworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvYXBpLnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8iOworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucHJvdG8iOworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byI7CitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi90eXBlLnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvIjsKKworLy8gVGVzdCB0aGF0IHdlIGNhbiBpbmNsdWRlIGFsbCB3ZWxsLWtub3duIHR5cGVzLgorLy8gRWFjaCB3cmFwcGVyIHR5cGUgaXMgaW5jbHVkZWQgc2VwYXJhdGVseSwgYXMgbGFuZ3VhZ2VzCisvLyBtYXAgaGFuZGxlIGRpZmZlcmVudCB3cmFwcGVycyBpbiBkaWZmZXJlbnQgd2F5cy4KK21lc3NhZ2UgVGVzdFdlbGxLbm93blR5cGVzIHsKKyAgZ29vZ2xlLnByb3RvYnVmLkFueSBhbnlfZmllbGQgPSAxOworICBnb29nbGUucHJvdG9idWYuQXBpIGFwaV9maWVsZCA9IDI7CisgIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiBkdXJhdGlvbl9maWVsZCA9IDM7CisgIGdvb2dsZS5wcm90b2J1Zi5FbXB0eSBlbXB0eV9maWVsZCA9IDQ7CisgIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2sgZmllbGRfbWFza19maWVsZCA9IDU7CisgIGdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb250ZXh0IHNvdXJjZV9jb250ZXh0X2ZpZWxkID0gNjsKKyAgZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCBzdHJ1Y3RfZmllbGQgPSA3OworICBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIHRpbWVzdGFtcF9maWVsZCA9IDg7CisgIGdvb2dsZS5wcm90b2J1Zi5UeXBlIHR5cGVfZmllbGQgPSA5OworICBnb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUgZG91YmxlX2ZpZWxkID0gMTA7CisgIGdvb2dsZS5wcm90b2J1Zi5GbG9hdFZhbHVlIGZsb2F0X2ZpZWxkID0gMTE7CisgIGdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlIGludDY0X2ZpZWxkID0gMTI7CisgIGdvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZSB1aW50NjRfZmllbGQgPSAxMzsKKyAgZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUgaW50MzJfZmllbGQgPSAxNDsKKyAgZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlIHVpbnQzMl9maWVsZCA9IDE1OworICBnb29nbGUucHJvdG9idWYuQm9vbFZhbHVlIGJvb2xfZmllbGQgPSAxNjsKKyAgZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlIHN0cmluZ19maWVsZCA9IDE3OworICBnb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZSBieXRlc19maWVsZCA9IDE4OworICAvLyBQYXJ0IG9mIHN0cnVjdCwgYnV0IHVzZWZ1bCB0byBiZSBhYmxlIHRvIHRlc3Qgc2VwYXJhdGVseQorICBnb29nbGUucHJvdG9idWYuVmFsdWUgdmFsdWVfZmllbGQgPSAxOTsKK30KKworLy8gQSByZXBlYXRlZCBmaWVsZCBmb3IgZWFjaCB3ZWxsLWtub3duIHR5cGUuCittZXNzYWdlIFJlcGVhdGVkV2VsbEtub3duVHlwZXMgeworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuQW55IGFueV9maWVsZCA9IDE7CisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5BcGkgYXBpX2ZpZWxkID0gMjsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIGR1cmF0aW9uX2ZpZWxkID0gMzsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLkVtcHR5IGVtcHR5X2ZpZWxkID0gNDsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayBmaWVsZF9tYXNrX2ZpZWxkID0gNTsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQgc291cmNlX2NvbnRleHRfZmllbGQgPSA2OworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuU3RydWN0IHN0cnVjdF9maWVsZCA9IDc7CisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgdGltZXN0YW1wX2ZpZWxkID0gODsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLlR5cGUgdHlwZV9maWVsZCA9IDk7CisgIC8vIFRoZXNlIGRvbid0IGFjdHVhbGx5IG1ha2UgYSBsb3Qgb2Ygc2Vuc2UsIGJ1dCB0aGV5J3JlIG5vdCBwcm9oaWJpdGVkLi4uCisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSBkb3VibGVfZmllbGQgPSAxMDsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLkZsb2F0VmFsdWUgZmxvYXRfZmllbGQgPSAxMTsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUgaW50NjRfZmllbGQgPSAxMjsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlIHVpbnQ2NF9maWVsZCA9IDEzOworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSBpbnQzMl9maWVsZCA9IDE0OworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUgdWludDMyX2ZpZWxkID0gMTU7CisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUgYm9vbF9maWVsZCA9IDE2OworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUgc3RyaW5nX2ZpZWxkID0gMTc7CisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlIGJ5dGVzX2ZpZWxkID0gMTg7Cit9CisKK21lc3NhZ2UgT25lb2ZXZWxsS25vd25UeXBlcyB7CisgIG9uZW9mIG9uZW9mX2ZpZWxkIHsKKyAgICBnb29nbGUucHJvdG9idWYuQW55IGFueV9maWVsZCA9IDE7CisgICAgZ29vZ2xlLnByb3RvYnVmLkFwaSBhcGlfZmllbGQgPSAyOworICAgIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiBkdXJhdGlvbl9maWVsZCA9IDM7CisgICAgZ29vZ2xlLnByb3RvYnVmLkVtcHR5IGVtcHR5X2ZpZWxkID0gNDsKKyAgICBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIGZpZWxkX21hc2tfZmllbGQgPSA1OworICAgIGdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb250ZXh0IHNvdXJjZV9jb250ZXh0X2ZpZWxkID0gNjsKKyAgICBnb29nbGUucHJvdG9idWYuU3RydWN0IHN0cnVjdF9maWVsZCA9IDc7CisgICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCB0aW1lc3RhbXBfZmllbGQgPSA4OworICAgIGdvb2dsZS5wcm90b2J1Zi5UeXBlIHR5cGVfZmllbGQgPSA5OworICAgIGdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSBkb3VibGVfZmllbGQgPSAxMDsKKyAgICBnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZSBmbG9hdF9maWVsZCA9IDExOworICAgIGdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlIGludDY0X2ZpZWxkID0gMTI7CisgICAgZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlIHVpbnQ2NF9maWVsZCA9IDEzOworICAgIGdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIGludDMyX2ZpZWxkID0gMTQ7CisgICAgZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlIHVpbnQzMl9maWVsZCA9IDE1OworICAgIGdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUgYm9vbF9maWVsZCA9IDE2OworICAgIGdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZSBzdHJpbmdfZmllbGQgPSAxNzsKKyAgICBnb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZSBieXRlc19maWVsZCA9IDE4OworICB9Cit9CisKKy8vIEEgbWFwIGZpZWxkIGZvciBlYWNoIHdlbGwta25vd24gdHlwZS4gV2Ugb25seQorLy8gbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgdmFsdWUgcGFydCBvZiB0aGUgbWFwIGJlaW5nIHRoZQorLy8gd2VsbC1rbm93biB0eXBlcywgYXMgbWVzc2FnZXMgY2FuJ3QgYmUgbWFwIGtleXMuCittZXNzYWdlIE1hcFdlbGxLbm93blR5cGVzIHsKKyAgbWFwPGludDMyLGdvb2dsZS5wcm90b2J1Zi5Bbnk+IGFueV9maWVsZCA9IDE7CisgIG1hcDxpbnQzMixnb29nbGUucHJvdG9idWYuQXBpPiBhcGlfZmllbGQgPSAyOworICBtYXA8aW50MzIsZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uPiBkdXJhdGlvbl9maWVsZCA9IDM7CisgIG1hcDxpbnQzMixnb29nbGUucHJvdG9idWYuRW1wdHk+IGVtcHR5X2ZpZWxkID0gNDsKKyAgbWFwPGludDMyLGdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2s+IGZpZWxkX21hc2tfZmllbGQgPSA1OworICBtYXA8aW50MzIsZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvbnRleHQ+IHNvdXJjZV9jb250ZXh0X2ZpZWxkID0gNjsKKyAgbWFwPGludDMyLGdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3Q+IHN0cnVjdF9maWVsZCA9IDc7CisgIG1hcDxpbnQzMixnb29nbGUucHJvdG9idWYuVGltZXN0YW1wPiB0aW1lc3RhbXBfZmllbGQgPSA4OworICBtYXA8aW50MzIsZ29vZ2xlLnByb3RvYnVmLlR5cGU+IHR5cGVfZmllbGQgPSA5OworICBtYXA8aW50MzIsZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlPiBkb3VibGVfZmllbGQgPSAxMDsKKyAgbWFwPGludDMyLGdvb2dsZS5wcm90b2J1Zi5GbG9hdFZhbHVlPiBmbG9hdF9maWVsZCA9IDExOworICBtYXA8aW50MzIsZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWU+IGludDY0X2ZpZWxkID0gMTI7CisgIG1hcDxpbnQzMixnb29nbGUucHJvdG9idWYuVUludDY0VmFsdWU+IHVpbnQ2NF9maWVsZCA9IDEzOworICBtYXA8aW50MzIsZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWU+IGludDMyX2ZpZWxkID0gMTQ7CisgIG1hcDxpbnQzMixnb29nbGUucHJvdG9idWYuVUludDMyVmFsdWU+IHVpbnQzMl9maWVsZCA9IDE1OworICBtYXA8aW50MzIsZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZT4gYm9vbF9maWVsZCA9IDE2OworICBtYXA8aW50MzIsZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlPiBzdHJpbmdfZmllbGQgPSAxNzsKKyAgbWFwPGludDMyLGdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlPiBieXRlc19maWVsZCA9IDE4OworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjMzU4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuY2MKQEAgLTAsMCArMSwzNTAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3RjdGFibGVfZGVjbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV90Y3RhYmxlX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcGFyc2VfY29udGV4dC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NvbnN0IFVua25vd25GaWVsZFNldCYgVW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKCkgeworICBzdGF0aWMgYXV0byBpbnN0YW5jZSA9IGludGVybmFsOjpPblNodXRkb3duRGVsZXRlKG5ldyBVbmtub3duRmllbGRTZXQoKSk7CisgIHJldHVybiAqaW5zdGFuY2U7Cit9CisKK3ZvaWQgVW5rbm93bkZpZWxkU2V0OjpDbGVhckZhbGxiYWNrKCkgeworICBHT09HTEVfRENIRUNLKCFmaWVsZHNfLmVtcHR5KCkpOworICBpbnQgbiA9IGZpZWxkc18uc2l6ZSgpOworICBkbyB7CisgICAgKGZpZWxkc18pWy0tbl0uRGVsZXRlKCk7CisgIH0gd2hpbGUgKG4gPiAwKTsKKyAgZmllbGRzXy5jbGVhcigpOworfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6SW50ZXJuYWxNZXJnZUZyb20oY29uc3QgVW5rbm93bkZpZWxkU2V0JiBvdGhlcikgeworICBpbnQgb3RoZXJfZmllbGRfY291bnQgPSBvdGhlci5maWVsZF9jb3VudCgpOworICBpZiAob3RoZXJfZmllbGRfY291bnQgPiAwKSB7CisgICAgZmllbGRzXy5yZXNlcnZlKGZpZWxkc18uc2l6ZSgpICsgb3RoZXJfZmllbGRfY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXJfZmllbGRfY291bnQ7IGkrKykgeworICAgICAgZmllbGRzXy5wdXNoX2JhY2soKG90aGVyLmZpZWxkc18pW2ldKTsKKyAgICAgIGZpZWxkc18uYmFjaygpLkRlZXBDb3B5KChvdGhlci5maWVsZHNfKVtpXSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVW5rbm93bkZpZWxkU2V0OjpNZXJnZUZyb20oY29uc3QgVW5rbm93bkZpZWxkU2V0JiBvdGhlcikgeworICBpbnQgb3RoZXJfZmllbGRfY291bnQgPSBvdGhlci5maWVsZF9jb3VudCgpOworICBpZiAob3RoZXJfZmllbGRfY291bnQgPiAwKSB7CisgICAgZmllbGRzXy5yZXNlcnZlKGZpZWxkc18uc2l6ZSgpICsgb3RoZXJfZmllbGRfY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXJfZmllbGRfY291bnQ7IGkrKykgeworICAgICAgZmllbGRzXy5wdXNoX2JhY2soKG90aGVyLmZpZWxkc18pW2ldKTsKKyAgICAgIGZpZWxkc18uYmFjaygpLkRlZXBDb3B5KChvdGhlci5maWVsZHNfKVtpXSk7CisgICAgfQorICB9Cit9CisKKy8vIEEgc3BlY2lhbGl6ZWQgTWVyZ2VGcm9tIGZvciBwZXJmb3JtYW5jZSB3aGVuIHdlIGFyZSBtZXJnaW5nIGZyb20gYW4gVUZTIHRoYXQKKy8vIGlzIHRlbXBvcmFyeSBhbmQgY2FuIGJlIGRlc3Ryb3llZCBpbiB0aGUgcHJvY2Vzcy4KK3ZvaWQgVW5rbm93bkZpZWxkU2V0OjpNZXJnZUZyb21BbmREZXN0cm95KFVua25vd25GaWVsZFNldCogb3RoZXIpIHsKKyAgaWYgKGZpZWxkc18uZW1wdHkoKSkgeworICAgIGZpZWxkc18gPSBzdGQ6Om1vdmUob3RoZXItPmZpZWxkc18pOworICB9IGVsc2UgeworICAgIGZpZWxkc18uaW5zZXJ0KGZpZWxkc18uZW5kKCksCisgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3Iob3RoZXItPmZpZWxkc18uYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3Iob3RoZXItPmZpZWxkc18uZW5kKCkpKTsKKyAgfQorICBvdGhlci0+ZmllbGRzXy5jbGVhcigpOworfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6TWVyZ2VUb0ludGVybmFsTWV0YWRhdGEoCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiBvdGhlciwgaW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGEqIG1ldGFkYXRhKSB7CisgIG1ldGFkYXRhLT5tdXRhYmxlX3Vua25vd25fZmllbGRzPFVua25vd25GaWVsZFNldD4oKS0+TWVyZ2VGcm9tKG90aGVyKTsKK30KKworc2l6ZV90IFVua25vd25GaWVsZFNldDo6U3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKSBjb25zdCB7CisgIGlmIChmaWVsZHNfLmVtcHR5KCkpIHJldHVybiAwOworCisgIHNpemVfdCB0b3RhbF9zaXplID0gc2l6ZW9mKFVua25vd25GaWVsZCkgKiBmaWVsZHNfLmNhcGFjaXR5KCk7CisKKyAgZm9yIChjb25zdCBVbmtub3duRmllbGQmIGZpZWxkIDogZmllbGRzXykgeworICAgIHN3aXRjaCAoZmllbGQudHlwZSgpKSB7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOgorICAgICAgICB0b3RhbF9zaXplICs9IHNpemVvZigqZmllbGQuZGF0YV8ubGVuZ3RoX2RlbGltaXRlZF8uc3RyaW5nX3ZhbHVlKSArCisgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlN0cmluZ1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAqZmllbGQuZGF0YV8ubGVuZ3RoX2RlbGltaXRlZF8uc3RyaW5nX3ZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9HUk9VUDoKKyAgICAgICAgdG90YWxfc2l6ZSArPSBmaWVsZC5kYXRhXy5ncm91cF8tPlNwYWNlVXNlZExvbmcoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3NpemVfdCBVbmtub3duRmllbGRTZXQ6OlNwYWNlVXNlZExvbmcoKSBjb25zdCB7CisgIHJldHVybiBzaXplb2YoKnRoaXMpICsgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpOworfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6QWRkVmFyaW50KGludCBudW1iZXIsIHVpbnQ2NF90IHZhbHVlKSB7CisgIFVua25vd25GaWVsZCBmaWVsZDsKKyAgZmllbGQubnVtYmVyXyA9IG51bWJlcjsKKyAgZmllbGQuU2V0VHlwZShVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5UKTsKKyAgZmllbGQuZGF0YV8udmFyaW50XyA9IHZhbHVlOworICBmaWVsZHNfLnB1c2hfYmFjayhmaWVsZCk7Cit9CisKK3ZvaWQgVW5rbm93bkZpZWxkU2V0OjpBZGRGaXhlZDMyKGludCBudW1iZXIsIHVpbnQzMl90IHZhbHVlKSB7CisgIFVua25vd25GaWVsZCBmaWVsZDsKKyAgZmllbGQubnVtYmVyXyA9IG51bWJlcjsKKyAgZmllbGQuU2V0VHlwZShVbmtub3duRmllbGQ6OlRZUEVfRklYRUQzMik7CisgIGZpZWxkLmRhdGFfLmZpeGVkMzJfID0gdmFsdWU7CisgIGZpZWxkc18ucHVzaF9iYWNrKGZpZWxkKTsKK30KKwordm9pZCBVbmtub3duRmllbGRTZXQ6OkFkZEZpeGVkNjQoaW50IG51bWJlciwgdWludDY0X3QgdmFsdWUpIHsKKyAgVW5rbm93bkZpZWxkIGZpZWxkOworICBmaWVsZC5udW1iZXJfID0gbnVtYmVyOworICBmaWVsZC5TZXRUeXBlKFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0KTsKKyAgZmllbGQuZGF0YV8uZml4ZWQ2NF8gPSB2YWx1ZTsKKyAgZmllbGRzXy5wdXNoX2JhY2soZmllbGQpOworfQorCitzdGQ6OnN0cmluZyogVW5rbm93bkZpZWxkU2V0OjpBZGRMZW5ndGhEZWxpbWl0ZWQoaW50IG51bWJlcikgeworICBVbmtub3duRmllbGQgZmllbGQ7CisgIGZpZWxkLm51bWJlcl8gPSBudW1iZXI7CisgIGZpZWxkLlNldFR5cGUoVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICBmaWVsZC5kYXRhXy5sZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWUgPSBuZXcgc3RkOjpzdHJpbmc7CisgIGZpZWxkc18ucHVzaF9iYWNrKGZpZWxkKTsKKyAgcmV0dXJuIGZpZWxkLmRhdGFfLmxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZTsKK30KKworCitVbmtub3duRmllbGRTZXQqIFVua25vd25GaWVsZFNldDo6QWRkR3JvdXAoaW50IG51bWJlcikgeworICBVbmtub3duRmllbGQgZmllbGQ7CisgIGZpZWxkLm51bWJlcl8gPSBudW1iZXI7CisgIGZpZWxkLlNldFR5cGUoVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQKTsKKyAgZmllbGQuZGF0YV8uZ3JvdXBfID0gbmV3IFVua25vd25GaWVsZFNldDsKKyAgZmllbGRzXy5wdXNoX2JhY2soZmllbGQpOworICByZXR1cm4gZmllbGQuZGF0YV8uZ3JvdXBfOworfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6QWRkRmllbGQoY29uc3QgVW5rbm93bkZpZWxkJiBmaWVsZCkgeworICBmaWVsZHNfLnB1c2hfYmFjayhmaWVsZCk7CisgIGZpZWxkc18uYmFjaygpLkRlZXBDb3B5KGZpZWxkKTsKK30KKwordm9pZCBVbmtub3duRmllbGRTZXQ6OkRlbGV0ZVN1YnJhbmdlKGludCBzdGFydCwgaW50IG51bSkgeworICAvLyBEZWxldGUgdGhlIHNwZWNpZmllZCBmaWVsZHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICAoZmllbGRzXylbaSArIHN0YXJ0XS5EZWxldGUoKTsKKyAgfQorICAvLyBTbGlkZSBkb3duIHRoZSByZW1haW5pbmcgZmllbGRzLgorICBmb3IgKHNpemVfdCBpID0gc3RhcnQgKyBudW07IGkgPCBmaWVsZHNfLnNpemUoKTsgKytpKSB7CisgICAgKGZpZWxkc18pW2kgLSBudW1dID0gKGZpZWxkc18pW2ldOworICB9CisgIC8vIFBvcCBvZmYgdGhlICMgb2YgZGVsZXRlZCBmaWVsZHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICBmaWVsZHNfLnBvcF9iYWNrKCk7CisgIH0KK30KKwordm9pZCBVbmtub3duRmllbGRTZXQ6OkRlbGV0ZUJ5TnVtYmVyKGludCBudW1iZXIpIHsKKyAgc2l6ZV90IGxlZnQgPSAwOyAgLy8gVGhlIG51bWJlciBvZiBmaWVsZHMgbGVmdCBhZnRlciBkZWxldGlvbi4KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaWVsZHNfLnNpemUoKTsgKytpKSB7CisgICAgVW5rbm93bkZpZWxkKiBmaWVsZCA9ICYoZmllbGRzXylbaV07CisgICAgaWYgKGZpZWxkLT5udW1iZXIoKSA9PSBudW1iZXIpIHsKKyAgICAgIGZpZWxkLT5EZWxldGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGkgIT0gbGVmdCkgeworICAgICAgICAoZmllbGRzXylbbGVmdF0gPSAoZmllbGRzXylbaV07CisgICAgICB9CisgICAgICArK2xlZnQ7CisgICAgfQorICB9CisgIGZpZWxkc18ucmVzaXplKGxlZnQpOworfQorCitib29sIFVua25vd25GaWVsZFNldDo6TWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisgIFVua25vd25GaWVsZFNldCBvdGhlcjsKKyAgaWYgKGludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwTWVzc2FnZShpbnB1dCwgJm90aGVyKSAmJgorICAgICAgaW5wdXQtPkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKSB7CisgICAgTWVyZ2VGcm9tQW5kRGVzdHJveSgmb3RoZXIpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIFVua25vd25GaWVsZFNldDo6UGFyc2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisgIENsZWFyKCk7CisgIHJldHVybiBNZXJnZUZyb21Db2RlZFN0cmVhbShpbnB1dCk7Cit9CisKK2Jvb2wgVW5rbm93bkZpZWxkU2V0OjpQYXJzZUZyb21aZXJvQ29weVN0cmVhbShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoaW5wdXQpOworICByZXR1cm4gKFBhcnNlRnJvbUNvZGVkU3RyZWFtKCZjb2RlZF9pbnB1dCkgJiYKKyAgICAgICAgICBjb2RlZF9pbnB1dC5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKSk7Cit9CisKK2Jvb2wgVW5rbm93bkZpZWxkU2V0OjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgeworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dChkYXRhLCBzaXplKTsKKyAgcmV0dXJuIFBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKCZpbnB1dCk7Cit9CisKK2Jvb2wgVW5rbm93bkZpZWxkU2V0OjpTZXJpYWxpemVUb1N0cmluZyhzdGQ6OnN0cmluZyogb3V0cHV0KSBjb25zdCB7CisgIGNvbnN0IHNpemVfdCBzaXplID0KKyAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoKnRoaXMpOworICBTVExTdHJpbmdSZXNpemVVbmluaXRpYWxpemVkQW1vcnRpemVkKG91dHB1dCwgc2l6ZSk7CisgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICp0aGlzLCByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNoYXIqPihvdXRwdXQtPmRhdGEoKSkpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVW5rbm93bkZpZWxkU2V0OjpTZXJpYWxpemVUb0NvZGVkU3RyZWFtKAorICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKCp0aGlzLCBvdXRwdXQpOworICByZXR1cm4gIW91dHB1dC0+SGFkRXJyb3IoKTsKK30KK3ZvaWQgVW5rbm93bkZpZWxkOjpEZWxldGUoKSB7CisgIHN3aXRjaCAodHlwZSgpKSB7CisgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgIGRlbGV0ZSBkYXRhXy5sZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9HUk9VUDoKKyAgICAgIGRlbGV0ZSBkYXRhXy5ncm91cF87CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBVbmtub3duRmllbGQ6OkRlZXBDb3B5KGNvbnN0IFVua25vd25GaWVsZCYgb3RoZXIpIHsKKyAgKHZvaWQpb3RoZXI7ICAvLyBQYXJhbWV0ZXIgaXMgdXNlZCBieSBHb29nbGUtaW50ZXJuYWwgY29kZS4KKyAgc3dpdGNoICh0eXBlKCkpIHsKKyAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOgorICAgICAgZGF0YV8ubGVuZ3RoX2RlbGltaXRlZF8uc3RyaW5nX3ZhbHVlID0KKyAgICAgICAgICBuZXcgc3RkOjpzdHJpbmcoKmRhdGFfLmxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9HUk9VUDogeworICAgICAgVW5rbm93bkZpZWxkU2V0KiBncm91cCA9IG5ldyBVbmtub3duRmllbGRTZXQoKTsKKyAgICAgIGdyb3VwLT5JbnRlcm5hbE1lcmdlRnJvbSgqZGF0YV8uZ3JvdXBfKTsKKyAgICAgIGRhdGFfLmdyb3VwXyA9IGdyb3VwOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCisKK3VpbnQ4X3QqIFVua25vd25GaWVsZDo6SW50ZXJuYWxTZXJpYWxpemVMZW5ndGhEZWxpbWl0ZWROb1RhZygKKyAgICB1aW50OF90KiB0YXJnZXQsIGlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDS19FUShUWVBFX0xFTkdUSF9ERUxJTUlURUQsIHR5cGUoKSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhID0gKmRhdGFfLmxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZTsKKyAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheShkYXRhLnNpemUoKSwgdGFyZ2V0KTsKKyAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVJhdyhkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIHRhcmdldCk7CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2NsYXNzIFVua25vd25GaWVsZFBhcnNlckhlbHBlciB7CisgcHVibGljOgorICBleHBsaWNpdCBVbmtub3duRmllbGRQYXJzZXJIZWxwZXIoVW5rbm93bkZpZWxkU2V0KiB1bmtub3duKQorICAgICAgOiB1bmtub3duXyh1bmtub3duKSB7fQorCisgIHZvaWQgQWRkVmFyaW50KHVpbnQzMl90IG51bSwgdWludDY0X3QgdmFsdWUpIHsKKyAgICB1bmtub3duXy0+QWRkVmFyaW50KG51bSwgdmFsdWUpOworICB9CisgIHZvaWQgQWRkRml4ZWQ2NCh1aW50MzJfdCBudW0sIHVpbnQ2NF90IHZhbHVlKSB7CisgICAgdW5rbm93bl8tPkFkZEZpeGVkNjQobnVtLCB2YWx1ZSk7CisgIH0KKyAgY29uc3QgY2hhciogUGFyc2VMZW5ndGhEZWxpbWl0ZWQodWludDMyX3QgbnVtLCBjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlQ29udGV4dCogY3R4KSB7CisgICAgc3RkOjpzdHJpbmcqIHMgPSB1bmtub3duXy0+QWRkTGVuZ3RoRGVsaW1pdGVkKG51bSk7CisgICAgaW50IHNpemUgPSBSZWFkU2l6ZSgmcHRyKTsKKyAgICBHT09HTEVfUFJPVE9CVUZfUEFSU0VSX0FTU0VSVChwdHIpOworICAgIHJldHVybiBjdHgtPlJlYWRTdHJpbmcocHRyLCBzaXplLCBzKTsKKyAgfQorICBjb25zdCBjaGFyKiBQYXJzZUdyb3VwKHVpbnQzMl90IG51bSwgY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCkgeworICAgIFVua25vd25GaWVsZFBhcnNlckhlbHBlciBjaGlsZCh1bmtub3duXy0+QWRkR3JvdXAobnVtKSk7CisgICAgcmV0dXJuIGN0eC0+UGFyc2VHcm91cCgmY2hpbGQsIHB0ciwgbnVtICogOCArIDMpOworICB9CisgIHZvaWQgQWRkRml4ZWQzMih1aW50MzJfdCBudW0sIHVpbnQzMl90IHZhbHVlKSB7CisgICAgdW5rbm93bl8tPkFkZEZpeGVkMzIobnVtLCB2YWx1ZSk7CisgIH0KKworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIFBhcnNlQ29udGV4dCogY3R4KSB7CisgICAgcmV0dXJuIFdpcmVGb3JtYXRQYXJzZXIoKnRoaXMsIHB0ciwgY3R4KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duXzsKK307CisKK2NvbnN0IGNoYXIqIFVua25vd25Hcm91cFBhcnNlKFVua25vd25GaWVsZFNldCogdW5rbm93biwgY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VDb250ZXh0KiBjdHgpIHsKKyAgVW5rbm93bkZpZWxkUGFyc2VySGVscGVyIGZpZWxkX3BhcnNlcih1bmtub3duKTsKKyAgcmV0dXJuIFdpcmVGb3JtYXRQYXJzZXIoZmllbGRfcGFyc2VyLCBwdHIsIGN0eCk7Cit9CisKK2NvbnN0IGNoYXIqIFVua25vd25GaWVsZFBhcnNlKHVpbnQ2NF90IHRhZywgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHRyLCBQYXJzZUNvbnRleHQqIGN0eCkgeworICBVbmtub3duRmllbGRQYXJzZXJIZWxwZXIgZmllbGRfcGFyc2VyKHVua25vd24pOworICByZXR1cm4gRmllbGRQYXJzZXIodGFnLCBmaWVsZF9wYXJzZXIsIHB0ciwgY3R4KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWEyY2JiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oCkBAIC0wLDAgKzEsNDA3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gQ29udGFpbnMgY2xhc3NlcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdW5yZWNvZ25pemVkIGZpZWxkcyBzZWVuIHdoaWxlCisvLyBwYXJzaW5nIGEgcHJvdG9jb2wgbWVzc2FnZS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVU5LTk9XTl9GSUVMRF9TRVRfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VTktOT1dOX0ZJRUxEX1NFVF9IX18KKworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wYXJzZV9jb250ZXh0Lmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCisjaWZkZWYgU1dJRworI2Vycm9yICJZb3UgY2Fubm90IFNXSUcgcHJvdG8gaGVhZGVycyIKKyNlbmRpZgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworY2xhc3MgSW50ZXJuYWxNZXRhZGF0YTsgICAgICAgICAgIC8vIG1ldGFkYXRhX2xpdGUuaAorY2xhc3MgV2lyZUZvcm1hdDsgICAgICAgICAgICAgICAgIC8vIHdpcmVfZm9ybWF0LmgKK2NsYXNzIE1lc3NhZ2VTZXRGaWVsZFNraXBwZXJVc2luZ0NvcmQ7CisvLyBleHRlbnNpb25fc2V0X2hlYXZ5LmNjCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworY2xhc3MgTWVzc2FnZTsgICAgICAgLy8gbWVzc2FnZS5oCitjbGFzcyBVbmtub3duRmllbGQ7ICAvLyBiZWxvdworCisvLyBBbiBVbmtub3duRmllbGRTZXQgY29udGFpbnMgZmllbGRzIHRoYXQgd2VyZSBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nIGEKKy8vIG1lc3NhZ2UgYnV0IHdlcmUgbm90IGRlZmluZWQgYnkgaXRzIHR5cGUuICBLZWVwaW5nIHRyYWNrIG9mIHRoZXNlIGNhbiBiZQorLy8gdXNlZnVsLCBlc3BlY2lhbGx5IGluIHRoYXQgdGhleSBtYXkgYmUgd3JpdHRlbiBpZiB0aGUgbWVzc2FnZSBpcyBzZXJpYWxpemVkCisvLyBhZ2FpbiB3aXRob3V0IGJlaW5nIGNsZWFyZWQgaW4gYmV0d2Vlbi4gIFRoaXMgbWVhbnMgdGhhdCBzb2Z0d2FyZSB3aGljaAorLy8gc2ltcGx5IHJlY2VpdmVzIG1lc3NhZ2VzIGFuZCBmb3J3YXJkcyB0aGVtIHRvIG90aGVyIHNlcnZlcnMgZG9lcyBub3QgbmVlZAorLy8gdG8gYmUgdXBkYXRlZCBldmVyeSB0aW1lIGEgbmV3IGZpZWxkIGlzIGFkZGVkIHRvIHRoZSBtZXNzYWdlIGRlZmluaXRpb24uCisvLworLy8gVG8gZ2V0IHRoZSBVbmtub3duRmllbGRTZXQgYXR0YWNoZWQgdG8gYW55IG1lc3NhZ2UsIGNhbGwKKy8vIFJlZmxlY3Rpb246OkdldFVua25vd25GaWVsZHMoKS4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIG5lY2Vzc2FyaWx5IHRpZWQgdG8gdGhlIHByb3RvY29sIGJ1ZmZlciB3aXJlIGZvcm1hdCwgdW5saWtlCisvLyB0aGUgUmVmbGVjdGlvbiBpbnRlcmZhY2Ugd2hpY2ggaXMgaW5kZXBlbmRlbnQgb2YgYW55IHNlcmlhbGl6YXRpb24gc2NoZW1lLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFVua25vd25GaWVsZFNldCB7CisgcHVibGljOgorICBVbmtub3duRmllbGRTZXQoKTsKKyAgflVua25vd25GaWVsZFNldCgpOworCisgIC8vIFJlbW92ZSBhbGwgZmllbGRzLgorICBpbmxpbmUgdm9pZCBDbGVhcigpOworCisgIC8vIFJlbW92ZSBhbGwgZmllbGRzIGFuZCBkZWFsbG9jYXRlIGludGVybmFsIGRhdGEgb2JqZWN0cworICB2b2lkIENsZWFyQW5kRnJlZU1lbW9yeSgpOworCisgIC8vIElzIHRoaXMgc2V0IGVtcHR5PworICBpbmxpbmUgYm9vbCBlbXB0eSgpIGNvbnN0OworCisgIC8vIE1lcmdlIHRoZSBjb250ZW50cyBvZiBzb21lIG90aGVyIFVua25vd25GaWVsZFNldCB3aXRoIHRoaXMgb25lLgorICB2b2lkIE1lcmdlRnJvbShjb25zdCBVbmtub3duRmllbGRTZXQmIG90aGVyKTsKKworICAvLyBTaW1pbGFyIHRvIGFib3ZlLCBidXQgdGhpcyBmdW5jdGlvbiB3aWxsIGRlc3Ryb3kgdGhlIGNvbnRlbnRzIG9mIG90aGVyLgorICB2b2lkIE1lcmdlRnJvbUFuZERlc3Ryb3koVW5rbm93bkZpZWxkU2V0KiBvdGhlcik7CisKKyAgLy8gTWVyZ2UgdGhlIGNvbnRlbnRzIGFuIFVua25vd25GaWVsZFNldCB3aXRoIHRoZSBVbmtub3duRmllbGRTZXQgaW4KKyAgLy8gKm1ldGFkYXRhLCBpZiB0aGVyZSBpcyBvbmUuICBJZiAqbWV0YWRhdGEgZG9lc24ndCBoYXZlIGFuIFVua25vd25GaWVsZFNldAorICAvLyB0aGVuIGFkZCBvbmUgdG8gaXQgYW5kIG1ha2UgaXQgYmUgYSBjb3B5IG9mIHRoZSBmaXJzdCBhcmcuCisgIHN0YXRpYyB2b2lkIE1lcmdlVG9JbnRlcm5hbE1ldGFkYXRhKGNvbnN0IFVua25vd25GaWVsZFNldCYgb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhKiBtZXRhZGF0YSk7CisKKyAgLy8gU3dhcHMgdGhlIGNvbnRlbnRzIG9mIHNvbWUgb3RoZXIgVW5rbm93bkZpZWxkU2V0IHdpdGggdGhpcyBvbmUuCisgIGlubGluZSB2b2lkIFN3YXAoVW5rbm93bkZpZWxkU2V0KiB4KTsKKworICAvLyBDb21wdXRlcyAoYW4gZXN0aW1hdGUgb2YpIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IHVzZWQgZm9yCisgIC8vIHN0b3JpbmcgdGhlIHVua25vd24gZmllbGRzIGluIG1lbW9yeS4gRG9lcyBOT1QgaW5jbHVkZQorICAvLyBzaXplb2YoKnRoaXMpIGluIHRoZSBjYWxjdWxhdGlvbi4KKyAgc2l6ZV90IFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGZMb25nKCkgY29uc3Q7CisKKyAgaW50IFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjpUb0ludFNpemUoU3BhY2VVc2VkRXhjbHVkaW5nU2VsZkxvbmcoKSk7CisgIH0KKworICAvLyBWZXJzaW9uIG9mIFNwYWNlVXNlZCgpIGluY2x1ZGluZyBzaXplb2YoKnRoaXMpLgorICBzaXplX3QgU3BhY2VVc2VkTG9uZygpIGNvbnN0OworCisgIGludCBTcGFjZVVzZWQoKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6VG9JbnRTaXplKFNwYWNlVXNlZExvbmcoKSk7IH0KKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmllbGRzIHByZXNlbnQgaW4gdGhlIFVua25vd25GaWVsZFNldC4KKyAgaW5saW5lIGludCBmaWVsZF9jb3VudCgpIGNvbnN0OworICAvLyBHZXQgYSBmaWVsZCBpbiB0aGUgc2V0LCB3aGVyZSAwIDw9IGluZGV4IDwgZmllbGRfY291bnQoKS4gIFRoZSBmaWVsZHMKKyAgLy8gYXBwZWFyIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgYWRkZWQuCisgIGlubGluZSBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkKGludCBpbmRleCkgY29uc3Q7CisgIC8vIEdldCBhIG11dGFibGUgcG9pbnRlciB0byBhIGZpZWxkIGluIHRoZSBzZXQsIHdoZXJlCisgIC8vIDAgPD0gaW5kZXggPCBmaWVsZF9jb3VudCgpLiAgVGhlIGZpZWxkcyBhcHBlYXIgaW4gdGhlIG9yZGVyIGluIHdoaWNoCisgIC8vIHRoZXkgd2VyZSBhZGRlZC4KKyAgaW5saW5lIFVua25vd25GaWVsZCogbXV0YWJsZV9maWVsZChpbnQgaW5kZXgpOworCisgIC8vIEFkZGluZyBmaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdm9pZCBBZGRWYXJpbnQoaW50IG51bWJlciwgdWludDY0X3QgdmFsdWUpOworICB2b2lkIEFkZEZpeGVkMzIoaW50IG51bWJlciwgdWludDMyX3QgdmFsdWUpOworICB2b2lkIEFkZEZpeGVkNjQoaW50IG51bWJlciwgdWludDY0X3QgdmFsdWUpOworICB2b2lkIEFkZExlbmd0aERlbGltaXRlZChpbnQgbnVtYmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGQ6OnN0cmluZyogQWRkTGVuZ3RoRGVsaW1pdGVkKGludCBudW1iZXIpOworICBVbmtub3duRmllbGRTZXQqIEFkZEdyb3VwKGludCBudW1iZXIpOworCisgIC8vIEFkZHMgYW4gdW5rbm93biBmaWVsZCBmcm9tIGFub3RoZXIgc2V0LgorICB2b2lkIEFkZEZpZWxkKGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQpOworCisgIC8vIERlbGV0ZSBmaWVsZHMgd2l0aCBpbmRpY2VzIGluIHRoZSByYW5nZSBbc3RhcnQgLi4gc3RhcnQrbnVtLTFdLgorICAvLyBDYXV0aW9uOiBpbXBsZW1lbnRhdGlvbiBtb3ZlcyBhbGwgZmllbGRzIHdpdGggaW5kaWNlcyBbc3RhcnQrbnVtIC4uIF0uCisgIHZvaWQgRGVsZXRlU3VicmFuZ2UoaW50IHN0YXJ0LCBpbnQgbnVtKTsKKworICAvLyBEZWxldGUgYWxsIGZpZWxkcyB3aXRoIGEgc3BlY2lmaWMgZmllbGQgbnVtYmVyLiBUaGUgb3JkZXIgb2YgbGVmdCBmaWVsZHMKKyAgLy8gaXMgcHJlc2VydmVkLgorICAvLyBDYXV0aW9uOiBpbXBsZW1lbnRhdGlvbiBtb3ZlcyBhbGwgZmllbGRzIGFmdGVyIHRoZSBmaXJzdCBkZWxldGVkIGZpZWxkLgorICB2b2lkIERlbGV0ZUJ5TnVtYmVyKGludCBudW1iZXIpOworCisgIC8vIFBhcnNpbmcgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRoZXNlIHdvcmsgZXhhY3RseSBsaWtlIHRoZSBzaW1pbGFybHktbmFtZWQgbWV0aG9kcyBvZiBNZXNzYWdlLgorCisgIGJvb2wgTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgYm9vbCBQYXJzZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICBib29sIFBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCk7CisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpOworICBpbmxpbmUgYm9vbCBQYXJzZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEpIHsKKyAgICByZXR1cm4gUGFyc2VGcm9tQXJyYXkoZGF0YS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4oZGF0YS5zaXplKCkpKTsKKyAgfQorCisgIC8vIE1lcmdlcyB0aGlzIG1lc3NhZ2UncyB1bmtub3duIGZpZWxkIGRhdGEgKGlmIGFueSkuICBUaGlzIHdvcmtzIHdoZXRoZXIKKyAgLy8gdGhlIG1lc3NhZ2UgaXMgYSBsaXRlIG9yIGZ1bGwgcHJvdG8gKGZvciBsZWdhY3kgcmVhc29ucywgbGl0ZSBhbmQgZnVsbAorICAvLyByZXR1cm4gZGlmZmVyZW50IHR5cGVzIGZvciBNZXNzYWdlVHlwZTo6dW5rbm93bl9maWVsZHMoKSkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNZXNzYWdlVHlwZT4KKyAgYm9vbCBNZXJnZUZyb21NZXNzYWdlKGNvbnN0IE1lc3NhZ2VUeXBlJiBtZXNzYWdlKTsKKworICAvLyBTZXJpYWxpemF0aW9uLgorICBib29sIFNlcmlhbGl6ZVRvU3RyaW5nKHN0ZDo6c3RyaW5nKiBvdXRwdXQpIGNvbnN0OworICBib29sIFNlcmlhbGl6ZVRvQ29kZWRTdHJlYW0oaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICBzdGF0aWMgY29uc3QgVW5rbm93bkZpZWxkU2V0JiBkZWZhdWx0X2luc3RhbmNlKCk7CisKKyBwcml2YXRlOgorICAvLyBGb3IgSW50ZXJuYWxNZXJnZUZyb20KKyAgZnJpZW5kIGNsYXNzIFVua25vd25GaWVsZDsKKyAgLy8gTWVyZ2VzIGZyb20gb3RoZXIgVW5rbm93bkZpZWxkU2V0LiBUaGlzIG1ldGhvZCBhc3N1bWVzLCB0aGF0IHRoaXMgb2JqZWN0CisgIC8vIGlzIG5ld2x5IGNyZWF0ZWQgYW5kIGhhcyBubyBmaWVsZHMuCisgIHZvaWQgSW50ZXJuYWxNZXJnZUZyb20oY29uc3QgVW5rbm93bkZpZWxkU2V0JiBvdGhlcik7CisgIHZvaWQgQ2xlYXJGYWxsYmFjaygpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxNZXNzYWdlLCBNZXNzYWdlVHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KKyAgYm9vbCBJbnRlcm5hbE1lcmdlRnJvbU1lc3NhZ2UoY29uc3QgTWVzc2FnZVR5cGUmIG1lc3NhZ2UpIHsKKyAgICBNZXJnZUZyb20obWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldFVua25vd25GaWVsZHMobWVzc2FnZSkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPE1lc3NhZ2VMaXRlLCBNZXNzYWdlVHlwZT46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICFzdGQ6OmlzX2Jhc2Vfb2Y8TWVzc2FnZSwgTWVzc2FnZVR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICBpbnQ+Ojp0eXBlID0gMD4KKyAgYm9vbCBJbnRlcm5hbE1lcmdlRnJvbU1lc3NhZ2UoY29uc3QgTWVzc2FnZVR5cGUmIG1lc3NhZ2UpIHsKKyAgICBjb25zdCBhdXRvJiB1bmtub3duX2ZpZWxkcyA9IG1lc3NhZ2UudW5rbm93bl9maWVsZHMoKTsKKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBhcnJheV9zdHJlYW0odW5rbm93bl9maWVsZHMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duX2ZpZWxkcy5zaXplKCkpOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGNvZGVkX3N0cmVhbSgmYXJyYXlfc3RyZWFtKTsKKyAgICByZXR1cm4gTWVyZ2VGcm9tQ29kZWRTdHJlYW0oJmNvZGVkX3N0cmVhbSk7CisgIH0KKworICBzdGQ6OnZlY3RvcjxVbmtub3duRmllbGQ+IGZpZWxkc187CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhVbmtub3duRmllbGRTZXQpOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworaW5saW5lIHZvaWQgV3JpdGVWYXJpbnQodWludDMyX3QgbnVtLCB1aW50NjRfdCB2YWwsIFVua25vd25GaWVsZFNldCogdW5rbm93bikgeworICB1bmtub3duLT5BZGRWYXJpbnQobnVtLCB2YWwpOworfQoraW5saW5lIHZvaWQgV3JpdGVMZW5ndGhEZWxpbWl0ZWQodWludDMyX3QgbnVtLCBTdHJpbmdQaWVjZSB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd24pIHsKKyAgdW5rbm93bi0+QWRkTGVuZ3RoRGVsaW1pdGVkKG51bSktPmFzc2lnbih2YWwuZGF0YSgpLCB2YWwuc2l6ZSgpKTsKK30KKworUFJPVE9CVUZfRVhQT1JUCitjb25zdCBjaGFyKiBVbmtub3duR3JvdXBQYXJzZShVbmtub3duRmllbGRTZXQqIHVua25vd24sIGNvbnN0IGNoYXIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlQ29udGV4dCogY3R4KTsKK1BST1RPQlVGX0VYUE9SVAorY29uc3QgY2hhciogVW5rbm93bkZpZWxkUGFyc2UodWludDY0X3QgdGFnLCBVbmtub3duRmllbGRTZXQqIHVua25vd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwdHIsIFBhcnNlQ29udGV4dCogY3R4KTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFJlcHJlc2VudHMgb25lIGZpZWxkIGluIGFuIFVua25vd25GaWVsZFNldC4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBVbmtub3duRmllbGQgeworIHB1YmxpYzoKKyAgZW51bSBUeXBlIHsKKyAgICBUWVBFX1ZBUklOVCwKKyAgICBUWVBFX0ZJWEVEMzIsCisgICAgVFlQRV9GSVhFRDY0LAorICAgIFRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICBUWVBFX0dST1VQCisgIH07CisKKyAgLy8gVGhlIGZpZWxkJ3MgZmllbGQgbnVtYmVyLCBhcyBzZWVuIG9uIHRoZSB3aXJlLgorICBpbmxpbmUgaW50IG51bWJlcigpIGNvbnN0OworCisgIC8vIFRoZSBmaWVsZCB0eXBlLgorICBpbmxpbmUgVHlwZSB0eXBlKCkgY29uc3Q7CisKKyAgLy8gQWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRWFjaCBtZXRob2Qgd29ya3Mgb25seSBmb3IgVW5rbm93bkZpZWxkcyBvZiB0aGUgY29ycmVzcG9uZGluZyB0eXBlLgorCisgIGlubGluZSB1aW50NjRfdCB2YXJpbnQoKSBjb25zdDsKKyAgaW5saW5lIHVpbnQzMl90IGZpeGVkMzIoKSBjb25zdDsKKyAgaW5saW5lIHVpbnQ2NF90IGZpeGVkNjQoKSBjb25zdDsKKyAgaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBsZW5ndGhfZGVsaW1pdGVkKCkgY29uc3Q7CisgIGlubGluZSBjb25zdCBVbmtub3duRmllbGRTZXQmIGdyb3VwKCkgY29uc3Q7CisKKyAgaW5saW5lIHZvaWQgc2V0X3ZhcmludCh1aW50NjRfdCB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9maXhlZDMyKHVpbnQzMl90IHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2ZpeGVkNjQodWludDY0X3QgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbGVuZ3RoX2RlbGltaXRlZChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgc3RkOjpzdHJpbmcqIG11dGFibGVfbGVuZ3RoX2RlbGltaXRlZCgpOworICBpbmxpbmUgVW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX2dyb3VwKCk7CisKKyAgaW5saW5lIHNpemVfdCBHZXRMZW5ndGhEZWxpbWl0ZWRTaXplKCkgY29uc3Q7CisgIHVpbnQ4X3QqIEludGVybmFsU2VyaWFsaXplTGVuZ3RoRGVsaW1pdGVkTm9UYWcoCisgICAgICB1aW50OF90KiB0YXJnZXQsIGlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0OworCisKKyAgLy8gSWYgdGhpcyBVbmtub3duRmllbGQgY29udGFpbnMgYSBwb2ludGVyLCBkZWxldGUgaXQuCisgIHZvaWQgRGVsZXRlKCk7CisKKyAgLy8gTWFrZSBhIGRlZXAgY29weSBvZiBhbnkgcG9pbnRlcnMgaW4gdGhpcyBVbmtub3duRmllbGQuCisgIHZvaWQgRGVlcENvcHkoY29uc3QgVW5rbm93bkZpZWxkJiBvdGhlcik7CisKKyAgLy8gU2V0IHRoZSB3aXJlIHR5cGUgb2YgdGhpcyBVbmtub3duRmllbGQuIFNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiB0aGlzCisgIC8vIFVua25vd25GaWVsZCBpcyBiZWluZyBjcmVhdGVkLgorICBpbmxpbmUgdm9pZCBTZXRUeXBlKFR5cGUgdHlwZSk7CisKKyAgdW5pb24gTGVuZ3RoRGVsaW1pdGVkIHsKKyAgICBzdGQ6OnN0cmluZyogc3RyaW5nX3ZhbHVlOworICB9OworCisgIHVpbnQzMl90IG51bWJlcl87CisgIHVpbnQzMl90IHR5cGVfOworICB1bmlvbiB7CisgICAgdWludDY0X3QgdmFyaW50XzsKKyAgICB1aW50MzJfdCBmaXhlZDMyXzsKKyAgICB1aW50NjRfdCBmaXhlZDY0XzsKKyAgICBtdXRhYmxlIHVuaW9uIExlbmd0aERlbGltaXRlZCBsZW5ndGhfZGVsaW1pdGVkXzsKKyAgICBVbmtub3duRmllbGRTZXQqIGdyb3VwXzsKKyAgfSBkYXRhXzsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGlubGluZSBpbXBsZW1lbnRhdGlvbnMKKworaW5saW5lIFVua25vd25GaWVsZFNldDo6VW5rbm93bkZpZWxkU2V0KCkge30KKworaW5saW5lIFVua25vd25GaWVsZFNldDo6flVua25vd25GaWVsZFNldCgpIHsgQ2xlYXIoKTsgfQorCitpbmxpbmUgdm9pZCBVbmtub3duRmllbGRTZXQ6OkNsZWFyQW5kRnJlZU1lbW9yeSgpIHsgQ2xlYXIoKTsgfQorCitpbmxpbmUgdm9pZCBVbmtub3duRmllbGRTZXQ6OkNsZWFyKCkgeworICBpZiAoIWZpZWxkc18uZW1wdHkoKSkgeworICAgIENsZWFyRmFsbGJhY2soKTsKKyAgfQorfQorCitpbmxpbmUgYm9vbCBVbmtub3duRmllbGRTZXQ6OmVtcHR5KCkgY29uc3QgeyByZXR1cm4gZmllbGRzXy5lbXB0eSgpOyB9CisKK2lubGluZSB2b2lkIFVua25vd25GaWVsZFNldDo6U3dhcChVbmtub3duRmllbGRTZXQqIHgpIHsKKyAgZmllbGRzXy5zd2FwKHgtPmZpZWxkc18pOworfQorCitpbmxpbmUgaW50IFVua25vd25GaWVsZFNldDo6ZmllbGRfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGZpZWxkc18uc2l6ZSgpKTsKK30KK2lubGluZSBjb25zdCBVbmtub3duRmllbGQmIFVua25vd25GaWVsZFNldDo6ZmllbGQoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiAoZmllbGRzXylbc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmRleCldOworfQoraW5saW5lIFVua25vd25GaWVsZCogVW5rbm93bkZpZWxkU2V0OjptdXRhYmxlX2ZpZWxkKGludCBpbmRleCkgeworICByZXR1cm4gJihmaWVsZHNfKVtzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGV4KV07Cit9CisKK2lubGluZSB2b2lkIFVua25vd25GaWVsZFNldDo6QWRkTGVuZ3RoRGVsaW1pdGVkKGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgQWRkTGVuZ3RoRGVsaW1pdGVkKG51bWJlciktPmFzc2lnbih2YWx1ZSk7Cit9CisKKworCisKK2lubGluZSBpbnQgVW5rbm93bkZpZWxkOjpudW1iZXIoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG51bWJlcl8pOyB9CitpbmxpbmUgVW5rbm93bkZpZWxkOjpUeXBlIFVua25vd25GaWVsZDo6dHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGU+KHR5cGVfKTsKK30KKworaW5saW5lIHVpbnQ2NF90IFVua25vd25GaWVsZDo6dmFyaW50KCkgY29uc3QgeworICBhc3NlcnQodHlwZSgpID09IFRZUEVfVkFSSU5UKTsKKyAgcmV0dXJuIGRhdGFfLnZhcmludF87Cit9CitpbmxpbmUgdWludDMyX3QgVW5rbm93bkZpZWxkOjpmaXhlZDMyKCkgY29uc3QgeworICBhc3NlcnQodHlwZSgpID09IFRZUEVfRklYRUQzMik7CisgIHJldHVybiBkYXRhXy5maXhlZDMyXzsKK30KK2lubGluZSB1aW50NjRfdCBVbmtub3duRmllbGQ6OmZpeGVkNjQoKSBjb25zdCB7CisgIGFzc2VydCh0eXBlKCkgPT0gVFlQRV9GSVhFRDY0KTsKKyAgcmV0dXJuIGRhdGFfLmZpeGVkNjRfOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBVbmtub3duRmllbGQ6Omxlbmd0aF9kZWxpbWl0ZWQoKSBjb25zdCB7CisgIGFzc2VydCh0eXBlKCkgPT0gVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKKyAgcmV0dXJuICpkYXRhXy5sZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWU7Cit9CitpbmxpbmUgY29uc3QgVW5rbm93bkZpZWxkU2V0JiBVbmtub3duRmllbGQ6Omdyb3VwKCkgY29uc3QgeworICBhc3NlcnQodHlwZSgpID09IFRZUEVfR1JPVVApOworICByZXR1cm4gKmRhdGFfLmdyb3VwXzsKK30KKworaW5saW5lIHZvaWQgVW5rbm93bkZpZWxkOjpzZXRfdmFyaW50KHVpbnQ2NF90IHZhbHVlKSB7CisgIGFzc2VydCh0eXBlKCkgPT0gVFlQRV9WQVJJTlQpOworICBkYXRhXy52YXJpbnRfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBVbmtub3duRmllbGQ6OnNldF9maXhlZDMyKHVpbnQzMl90IHZhbHVlKSB7CisgIGFzc2VydCh0eXBlKCkgPT0gVFlQRV9GSVhFRDMyKTsKKyAgZGF0YV8uZml4ZWQzMl8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIFVua25vd25GaWVsZDo6c2V0X2ZpeGVkNjQodWludDY0X3QgdmFsdWUpIHsKKyAgYXNzZXJ0KHR5cGUoKSA9PSBUWVBFX0ZJWEVENjQpOworICBkYXRhXy5maXhlZDY0XyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgVW5rbm93bkZpZWxkOjpzZXRfbGVuZ3RoX2RlbGltaXRlZChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgYXNzZXJ0KHR5cGUoKSA9PSBUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICBkYXRhXy5sZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWUtPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIFVua25vd25GaWVsZDo6bXV0YWJsZV9sZW5ndGhfZGVsaW1pdGVkKCkgeworICBhc3NlcnQodHlwZSgpID09IFRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisgIHJldHVybiBkYXRhXy5sZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWU7Cit9CitpbmxpbmUgVW5rbm93bkZpZWxkU2V0KiBVbmtub3duRmllbGQ6Om11dGFibGVfZ3JvdXAoKSB7CisgIGFzc2VydCh0eXBlKCkgPT0gVFlQRV9HUk9VUCk7CisgIHJldHVybiBkYXRhXy5ncm91cF87Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWVzc2FnZVR5cGU+Citib29sIFVua25vd25GaWVsZFNldDo6TWVyZ2VGcm9tTWVzc2FnZShjb25zdCBNZXNzYWdlVHlwZSYgbWVzc2FnZSkgeworICAvLyBTRklOQUUgd2lsbCByb3V0ZSB0byB0aGUgcmlnaHQgdmVyc2lvbi4KKyAgcmV0dXJuIEludGVybmFsTWVyZ2VGcm9tTWVzc2FnZShtZXNzYWdlKTsKK30KKworCitpbmxpbmUgc2l6ZV90IFVua25vd25GaWVsZDo6R2V0TGVuZ3RoRGVsaW1pdGVkU2l6ZSgpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDS19FUShUWVBFX0xFTkdUSF9ERUxJTUlURUQsIHR5cGUoKSk7CisgIHJldHVybiBkYXRhXy5sZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWUtPnNpemUoKTsKK30KKworaW5saW5lIHZvaWQgVW5rbm93bkZpZWxkOjpTZXRUeXBlKFR5cGUgdHlwZSkgeworICB0eXBlXyA9IHR5cGU7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9VTktOT1dOX0ZJRUxEX1NFVF9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOWE1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNjg1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyB0ZXN0IGlzIHRlc3RpbmcgYSBsb3QgbW9yZSB0aGFuIGp1c3QgdGhlIFVua25vd25GaWVsZFNldCBjbGFzcy4gIEl0CisvLyB0ZXN0cyBoYW5kbGluZyBvZiB1bmtub3duIGZpZWxkcyB0aHJvdWdob3V0IHRoZSBzeXN0ZW0uCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYWxsYmFjay5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tdXRleC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7CisKK2NsYXNzIFVua25vd25GaWVsZFNldFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIGRlc2NyaXB0b3JfID0gdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpOworICAgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJmFsbF9maWVsZHNfKTsKKyAgICBhbGxfZmllbGRzXy5TZXJpYWxpemVUb1N0cmluZygmYWxsX2ZpZWxkc19kYXRhXyk7CisgICAgQVNTRVJUX1RSVUUoZW1wdHlfbWVzc2FnZV8uUGFyc2VGcm9tU3RyaW5nKGFsbF9maWVsZHNfZGF0YV8pKTsKKyAgICB1bmtub3duX2ZpZWxkc18gPSBlbXB0eV9tZXNzYWdlXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CisgIH0KKworICBjb25zdCBVbmtub3duRmllbGQqIEdldEZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU5hbWUobmFtZSk7CisgICAgaWYgKGZpZWxkID09IG51bGxwdHIpIHJldHVybiBudWxscHRyOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGlmICh1bmtub3duX2ZpZWxkc18tPmZpZWxkKGkpLm51bWJlcigpID09IGZpZWxkLT5udW1iZXIoKSkgeworICAgICAgICByZXR1cm4gJnVua25vd25fZmllbGRzXy0+ZmllbGQoaSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gQ29uc3RydWN0cyBhIHByb3RvY29sIGJ1ZmZlciB3aGljaCBjb250YWlucyBmaWVsZHMgd2l0aCBhbGwgdGhlIHNhbWUKKyAgLy8gbnVtYmVycyBhcyBhbGxfZmllbGRzX2RhdGFfIGV4Y2VwdCB0aGF0IGVhY2ggZmllbGQgaXMgc29tZSBvdGhlciB3aXJlCisgIC8vIHR5cGUuCisgIHN0ZDo6c3RyaW5nIEdldEJpemFycm9EYXRhKCkgeworICAgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIGJpemFycm9fbWVzc2FnZTsKKyAgICBVbmtub3duRmllbGRTZXQqIGJpemFycm9fdW5rbm93bl9maWVsZHMgPQorICAgICAgICBiaXphcnJvX21lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGNvbnN0IFVua25vd25GaWVsZCYgdW5rbm93bl9maWVsZCA9IHVua25vd25fZmllbGRzXy0+ZmllbGQoaSk7CisgICAgICBpZiAodW5rbm93bl9maWVsZC50eXBlKCkgPT0gVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCkgeworICAgICAgICBiaXphcnJvX3Vua25vd25fZmllbGRzLT5BZGRGaXhlZDMyKHVua25vd25fZmllbGQubnVtYmVyKCksIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYml6YXJyb191bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KHVua25vd25fZmllbGQubnVtYmVyKCksIDEpOworICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisgICAgRVhQRUNUX1RSVUUoYml6YXJyb19tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKSk7CisgICAgcmV0dXJuIGRhdGE7CisgIH0KKworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBhbGxfZmllbGRzXzsKKyAgc3RkOjpzdHJpbmcgYWxsX2ZpZWxkc19kYXRhXzsKKworICAvLyBBbiBlbXB0eSBtZXNzYWdlIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZyb20gYWxsX2ZpZWxkc19kYXRhXy4gIFNvLCBpdCBoYXMKKyAgLy8gdW5rbm93biBmaWVsZHMgb2YgZXZlcnkgdHlwZS4KKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgZW1wdHlfbWVzc2FnZV87CisgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHNfOworfTsKKworbmFtZXNwYWNlIHsKKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIEFsbEZpZWxkc1ByZXNlbnQpIHsKKyAgLy8gVmVyaWZpZXMgdGhlIGZvbGxvd2luZzoKKyAgLy8gLS1hbGwgdW5rbm93biB0YWdzIGJlbG9uZyB0byBUZXN0QWxsVHlwZXMuCisgIC8vIC0tYWxsIGZpZWxkcyBpbiBUZXN0QWxsVHlwZXMgaXMgcHJlc2VudCBpbiBVbmtub3duRmllbGRTZXQgZXhjZXB0IHVuc2V0CisgIC8vICAgb25lb2YgZmllbGRzLgorICAvLworICAvLyBTaG91bGQgaGFuZGxlIHJlcGVhdGVkIGZpZWxkcyB0aGF0IG1heSBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4KKyAgLy8gVW5rbm93bkZpZWxkU2V0LgorCisgIGludCBub25fb25lb2ZfY291bnQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoIWRlc2NyaXB0b3JfLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICBub25fb25lb2ZfY291bnQrKzsKKyAgICB9CisgIH0KKworICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+IHVua25vd25fdGFnczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkc18tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIHVua25vd25fdGFncy5pbnNlcnQodW5rbm93bl9maWVsZHNfLT5maWVsZChpKS5udW1iZXIoKSk7CisgIH0KKworICBmb3IgKHVpbnQzMl90IHQgOiB1bmtub3duX3RhZ3MpIHsKKyAgICBFWFBFQ1RfTkUoZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TnVtYmVyKHQpLCBudWxscHRyKTsKKyAgfQorCisgIEVYUEVDVF9FUShub25fb25lb2ZfY291bnQgKyBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbF9jb3VudCgpLAorICAgICAgICAgICAgdW5rbm93bl90YWdzLnNpemUoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBWYXJpbnQpIHsKKyAgY29uc3QgVW5rbm93bkZpZWxkKiBmaWVsZCA9IEdldEZpZWxkKCJvcHRpb25hbF9pbnQzMiIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBudWxscHRyKTsKKworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwgZmllbGQtPnR5cGUoKSk7CisgIEVYUEVDVF9FUShhbGxfZmllbGRzXy5vcHRpb25hbF9pbnQzMigpLCBmaWVsZC0+dmFyaW50KCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgRml4ZWQzMikgeworICBjb25zdCBVbmtub3duRmllbGQqIGZpZWxkID0gR2V0RmllbGQoIm9wdGlvbmFsX2ZpeGVkMzIiKTsKKyAgQVNTRVJUX1RSVUUoZmllbGQgIT0gbnVsbHB0cik7CisKKyAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyLCBmaWVsZC0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKGFsbF9maWVsZHNfLm9wdGlvbmFsX2ZpeGVkMzIoKSwgZmllbGQtPmZpeGVkMzIoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBGaXhlZDY0KSB7CisgIGNvbnN0IFVua25vd25GaWVsZCogZmllbGQgPSBHZXRGaWVsZCgib3B0aW9uYWxfZml4ZWQ2NCIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBudWxscHRyKTsKKworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVENjQsIGZpZWxkLT50eXBlKCkpOworICBFWFBFQ1RfRVEoYWxsX2ZpZWxkc18ub3B0aW9uYWxfZml4ZWQ2NCgpLCBmaWVsZC0+Zml4ZWQ2NCgpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIExlbmd0aERlbGltaXRlZCkgeworICBjb25zdCBVbmtub3duRmllbGQqIGZpZWxkID0gR2V0RmllbGQoIm9wdGlvbmFsX3N0cmluZyIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBudWxscHRyKTsKKworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQsIGZpZWxkLT50eXBlKCkpOworICBFWFBFQ1RfRVEoYWxsX2ZpZWxkc18ub3B0aW9uYWxfc3RyaW5nKCksIGZpZWxkLT5sZW5ndGhfZGVsaW1pdGVkKCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgR3JvdXApIHsKKyAgY29uc3QgVW5rbm93bkZpZWxkKiBmaWVsZCA9IEdldEZpZWxkKCJvcHRpb25hbGdyb3VwIik7CisgIEFTU0VSVF9UUlVFKGZpZWxkICE9IG51bGxwdHIpOworCisgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfR1JPVVAsIGZpZWxkLT50eXBlKCkpOworICBBU1NFUlRfRVEoMSwgZmllbGQtPmdyb3VwKCkuZmllbGRfY291bnQoKSk7CisKKyAgY29uc3QgVW5rbm93bkZpZWxkJiBuZXN0ZWRfZmllbGQgPSBmaWVsZC0+Z3JvdXAoKS5maWVsZCgwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBuZXN0ZWRfZmllbGRfZGVzY3JpcHRvciA9CisgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpPcHRpb25hbEdyb3VwOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgiYSIpOworICBBU1NFUlRfVFJVRShuZXN0ZWRfZmllbGRfZGVzY3JpcHRvciAhPSBudWxscHRyKTsKKworICBFWFBFQ1RfRVEobmVzdGVkX2ZpZWxkX2Rlc2NyaXB0b3ItPm51bWJlcigpLCBuZXN0ZWRfZmllbGQubnVtYmVyKCkpOworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwgbmVzdGVkX2ZpZWxkLnR5cGUoKSk7CisgIEVYUEVDVF9FUShhbGxfZmllbGRzXy5vcHRpb25hbGdyb3VwKCkuYSgpLCBuZXN0ZWRfZmllbGQudmFyaW50KCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgU2VyaWFsaXplRmFzdEFuZFNsb3dBcmVFcXVpdmFsZW50KSB7CisgIGludCBzaXplID0KKyAgICAgIFdpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZShlbXB0eV9tZXNzYWdlXy51bmtub3duX2ZpZWxkcygpKTsKKyAgc3RkOjpzdHJpbmcgc2xvd19idWZmZXI7CisgIHN0ZDo6c3RyaW5nIGZhc3RfYnVmZmVyOworICBzbG93X2J1ZmZlci5yZXNpemUoc2l6ZSk7CisgIGZhc3RfYnVmZmVyLnJlc2l6ZShzaXplKTsKKworICB1aW50OF90KiB0YXJnZXQgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oOjpnb29nbGU6OnByb3RvYnVmOjpzdHJpbmdfYXNfYXJyYXkoJmZhc3RfYnVmZmVyKSk7CisgIHVpbnQ4X3QqIHJlc3VsdCA9IFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgZW1wdHlfbWVzc2FnZV8udW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKKyAgRVhQRUNUX0VRKHNpemUsIHJlc3VsdCAtIHRhcmdldCk7CisKKyAgeworICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSByYXdfc3RyZWFtKDo6Z29vZ2xlOjpwcm90b2J1Zjo6c3RyaW5nX2FzX2FycmF5KCZzbG93X2J1ZmZlciksIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJnJhd19zdHJlYW0pOworICAgIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoZW1wdHlfbWVzc2FnZV8udW5rbm93bl9maWVsZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRfc3RyZWFtKTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKKyAgfQorICBFWFBFQ1RfVFJVRShmYXN0X2J1ZmZlciA9PSBzbG93X2J1ZmZlcik7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBTZXJpYWxpemUpIHsKKyAgLy8gQ2hlY2sgdGhhdCBzZXJpYWxpemluZyB0aGUgVW5rbm93bkZpZWxkU2V0IHByb2R1Y2VzIHRoZSBvcmlnaW5hbCBkYXRhCisgIC8vIGFnYWluLgorCisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIGVtcHR5X21lc3NhZ2VfLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKworICAvLyBEb24ndCB1c2UgRVhQRUNUX0VRIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkdW1wIHJhdyBiaW5hcnkgZGF0YSB0bworICAvLyBzdGRvdXQuCisgIEVYUEVDVF9UUlVFKGRhdGEgPT0gYWxsX2ZpZWxkc19kYXRhXyk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBQYXJzZVZpYVJlZmxlY3Rpb24pIHsKKyAgLy8gTWFrZSBzdXJlIGZpZWxkcyBhcmUgcHJvcGVybHkgcGFyc2VkIHRvIHRoZSBVbmtub3duRmllbGRTZXQgd2hlbiBwYXJzaW5nCisgIC8vIHZpYSByZWZsZWN0aW9uLgorCisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2U7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChhbGxfZmllbGRzX2RhdGFfLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9maWVsZHNfZGF0YV8uc2l6ZSgpKTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7CisgIEFTU0VSVF9UUlVFKFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgJm1lc3NhZ2UpKTsKKworICBFWFBFQ1RfRVEobWVzc2FnZS5EZWJ1Z1N0cmluZygpLCBlbXB0eV9tZXNzYWdlXy5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFNlcmlhbGl6ZVZpYVJlZmxlY3Rpb24pIHsKKyAgLy8gTWFrZSBzdXJlIGZpZWxkcyBhcmUgcHJvcGVybHkgd3JpdHRlbiBmcm9tIHRoZSBVbmtub3duRmllbGRTZXQgd2hlbgorICAvLyBzZXJpYWxpemluZyB2aWEgcmVmbGVjdGlvbi4KKworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIHsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmRhdGEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOworICAgIHNpemVfdCBzaXplID0gV2lyZUZvcm1hdDo6Qnl0ZVNpemUoZW1wdHlfbWVzc2FnZV8pOworICAgIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhlbXB0eV9tZXNzYWdlXywgc2l6ZSwgJm91dHB1dCk7CisgICAgQVNTRVJUX0ZBTFNFKG91dHB1dC5IYWRFcnJvcigpKTsKKyAgfQorCisgIC8vIERvbid0IHVzZSBFWFBFQ1RfRVEgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGR1bXAgcmF3IGJpbmFyeSBkYXRhIHRvCisgIC8vIHN0ZG91dC4KKyAgRVhQRUNUX1RSVUUoZGF0YSA9PSBhbGxfZmllbGRzX2RhdGFfKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIENvcHlGcm9tKSB7CisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2U7CisKKyAgbWVzc2FnZS5Db3B5RnJvbShlbXB0eV9tZXNzYWdlXyk7CisKKyAgRVhQRUNUX0VRKGVtcHR5X21lc3NhZ2VfLkRlYnVnU3RyaW5nKCksIG1lc3NhZ2UuRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBTd2FwKSB7CisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG90aGVyX21lc3NhZ2U7CisgIEFTU0VSVF9UUlVFKG90aGVyX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKEdldEJpemFycm9EYXRhKCkpKTsKKworICBFWFBFQ1RfR1QoZW1wdHlfbWVzc2FnZV8udW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpLCAwKTsKKyAgRVhQRUNUX0dUKG90aGVyX21lc3NhZ2UudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpLCAwKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZGVidWdfc3RyaW5nID0gZW1wdHlfbWVzc2FnZV8uRGVidWdTdHJpbmcoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgb3RoZXJfZGVidWdfc3RyaW5nID0gb3RoZXJfbWVzc2FnZS5EZWJ1Z1N0cmluZygpOworICBFWFBFQ1RfTkUoZGVidWdfc3RyaW5nLCBvdGhlcl9kZWJ1Z19zdHJpbmcpOworCisgIGVtcHR5X21lc3NhZ2VfLlN3YXAoJm90aGVyX21lc3NhZ2UpOworICBFWFBFQ1RfRVEoZGVidWdfc3RyaW5nLCBvdGhlcl9tZXNzYWdlLkRlYnVnU3RyaW5nKCkpOworICBFWFBFQ1RfRVEob3RoZXJfZGVidWdfc3RyaW5nLCBlbXB0eV9tZXNzYWdlXy5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFN3YXBXaXRoU2VsZikgeworICBjb25zdCBzdGQ6OnN0cmluZyBkZWJ1Z19zdHJpbmcgPSBlbXB0eV9tZXNzYWdlXy5EZWJ1Z1N0cmluZygpOworICBFWFBFQ1RfR1QoZW1wdHlfbWVzc2FnZV8udW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpLCAwKTsKKworICBlbXB0eV9tZXNzYWdlXy5Td2FwKCZlbXB0eV9tZXNzYWdlXyk7CisgIEVYUEVDVF9HVChlbXB0eV9tZXNzYWdlXy51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCksIDApOworICBFWFBFQ1RfRVEoZGVidWdfc3RyaW5nLCBlbXB0eV9tZXNzYWdlXy5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIE1lcmdlRnJvbSkgeworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBzb3VyY2UsIGRlc3RpbmF0aW9uOworCisgIGRlc3RpbmF0aW9uLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEsIDEpOworICBkZXN0aW5hdGlvbi5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgzLCAyKTsKKyAgc291cmNlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDIsIDMpOworICBzb3VyY2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMywgNCk7CisKKyAgZGVzdGluYXRpb24uTWVyZ2VGcm9tKHNvdXJjZSk7CisKKyAgc3RkOjpzdHJpbmcgZGVzdGluYXRpb25fdGV4dDsKKyAgVGV4dEZvcm1hdDo6UHJpbnRUb1N0cmluZyhkZXN0aW5hdGlvbiwgJmRlc3RpbmF0aW9uX3RleHQpOworICBFWFBFQ1RfRVEoCisgICAgICAvLyBOb3RlOiAgVGhlIG9yZGVyaW5nIG9mIGZpZWxkcyBoZXJlIGRlcGVuZHMgb24gdGhlIG9yZGVyaW5nIG9mIGFkZHMKKyAgICAgIC8vICAgYW5kIG1lcmdpbmcsIGFib3ZlLgorICAgICAgIjE6IDFcbiIKKyAgICAgICIzOiAyXG4iCisgICAgICAiMjogM1xuIgorICAgICAgIjM6IDRcbiIsCisgICAgICBkZXN0aW5hdGlvbl90ZXh0KTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIE1lcmdlRnJvbU1lc3NhZ2UpIHsKKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2Ugc291cmNlLCBkZXN0aW5hdGlvbjsKKworICBkZXN0aW5hdGlvbi5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgxLCAxKTsKKyAgZGVzdGluYXRpb24ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMywgMik7CisgIHNvdXJjZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgyLCAzKTsKKyAgc291cmNlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDMsIDQpOworCisgIGRlc3RpbmF0aW9uLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tTWVzc2FnZShzb3VyY2UpOworCisgIHN0ZDo6c3RyaW5nIGRlc3RpbmF0aW9uX3RleHQ7CisgIFRleHRGb3JtYXQ6OlByaW50VG9TdHJpbmcoZGVzdGluYXRpb24sICZkZXN0aW5hdGlvbl90ZXh0KTsKKyAgRVhQRUNUX0VRKAorICAgICAgLy8gTm90ZTogIFRoZSBvcmRlcmluZyBvZiBmaWVsZHMgaGVyZSBkZXBlbmRzIG9uIHRoZSBvcmRlcmluZyBvZiBhZGRzCisgICAgICAvLyAgIGFuZCBtZXJnaW5nLCBhYm92ZS4KKyAgICAgICIxOiAxXG4iCisgICAgICAiMzogMlxuIgorICAgICAgIjI6IDNcbiIKKyAgICAgICIzOiA0XG4iLAorICAgICAgZGVzdGluYXRpb25fdGV4dCk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBNZXJnZUZyb21NZXNzYWdlTGl0ZSkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSBzb3VyY2U7CisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlTGl0ZSBkZXN0aW5hdGlvbjsKKworICBzb3VyY2Uuc2V0X29wdGlvbmFsX2ZpeGVkMzIoNDIpOworICBkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcoc291cmNlLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworCisgIFVua25vd25GaWVsZFNldCB1bmtub3duX2ZpZWxkX3NldDsKKyAgRVhQRUNUX1RSVUUodW5rbm93bl9maWVsZF9zZXQuTWVyZ2VGcm9tTWVzc2FnZShkZXN0aW5hdGlvbikpOworICBFWFBFQ1RfRVEodW5rbm93bl9maWVsZF9zZXQuZmllbGRfY291bnQoKSwgMSk7CisKKyAgY29uc3QgVW5rbm93bkZpZWxkJiB1bmtub3duX2ZpZWxkID0gdW5rbm93bl9maWVsZF9zZXQuZmllbGQoMCk7CisgIEVYUEVDVF9FUSh1bmtub3duX2ZpZWxkLm51bWJlcigpLCA3KTsKKyAgRVhQRUNUX0VRKHVua25vd25fZmllbGQuZml4ZWQzMigpLCA0Mik7Cit9CisKKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIENsZWFyKSB7CisgIC8vIENsZWFyIHRoZSBzZXQuCisgIGVtcHR5X21lc3NhZ2VfLkNsZWFyKCk7CisgIEVYUEVDVF9FUSgwLCB1bmtub3duX2ZpZWxkc18tPmZpZWxkX2NvdW50KCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgQ2xlYXJBbmRGcmVlTWVtb3J5KSB7CisgIEVYUEVDVF9HVCh1bmtub3duX2ZpZWxkc18tPmZpZWxkX2NvdW50KCksIDApOworICB1bmtub3duX2ZpZWxkc18tPkNsZWFyQW5kRnJlZU1lbW9yeSgpOworICBFWFBFQ1RfRVEoMCwgdW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpKTsKKyAgdW5rbm93bl9maWVsZHNfLT5BZGRWYXJpbnQoMTIzNDU2LCA2NTQzMjEpOworICBFWFBFQ1RfRVEoMSwgdW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFBhcnNlS25vd25BbmRVbmtub3duKSB7CisgIC8vIFRlc3QgbWl4aW5nIGtub3duIGFuZCB1bmtub3duIGZpZWxkcyB3aGVuIHBhcnNpbmcuCisKKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2Ugc291cmNlOworICBzb3VyY2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMTIzNDU2LCA2NTQzMjEpOworICBzdGQ6OnN0cmluZyBkYXRhOworICBBU1NFUlRfVFJVRShzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpKTsKKworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIGRlc3RpbmF0aW9uOworICBBU1NFUlRfVFJVRShkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcoYWxsX2ZpZWxkc19kYXRhXyArIGRhdGEpKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KGRlc3RpbmF0aW9uKTsKKyAgQVNTRVJUX0VRKDEsIGRlc3RpbmF0aW9uLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5ULAorICAgICAgICAgICAgZGVzdGluYXRpb24udW5rbm93bl9maWVsZHMoKS5maWVsZCgwKS50eXBlKCkpOworICBFWFBFQ1RfRVEoNjU0MzIxLCBkZXN0aW5hdGlvbi51bmtub3duX2ZpZWxkcygpLmZpZWxkKDApLnZhcmludCgpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFdyb25nVHlwZVRyZWF0ZWRBc1Vua25vd24pIHsKKyAgLy8gVGVzdCB0aGF0IGZpZWxkcyBvZiB0aGUgd3Jvbmcgd2lyZSB0eXBlIGFyZSB0cmVhdGVkIGxpa2UgdW5rbm93biBmaWVsZHMKKyAgLy8gd2hlbiBwYXJzaW5nLgorCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgYWxsX3R5cGVzX21lc3NhZ2U7CisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIGVtcHR5X21lc3NhZ2U7CisgIHN0ZDo6c3RyaW5nIGJpemFycm9fZGF0YSA9IEdldEJpemFycm9EYXRhKCk7CisgIEFTU0VSVF9UUlVFKGFsbF90eXBlc19tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhiaXphcnJvX2RhdGEpKTsKKyAgQVNTRVJUX1RSVUUoZW1wdHlfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoYml6YXJyb19kYXRhKSk7CisKKyAgLy8gQWxsIGZpZWxkcyBzaG91bGQgaGF2ZSBiZWVuIGludGVycHJldGVkIGFzIHVua25vd24sIHNvIHRoZSBkZWJ1ZyBzdHJpbmdzCisgIC8vIHNob3VsZCBiZSB0aGUgc2FtZS4KKyAgRVhQRUNUX0VRKGVtcHR5X21lc3NhZ2UuRGVidWdTdHJpbmcoKSwgYWxsX3R5cGVzX21lc3NhZ2UuRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBXcm9uZ1R5cGVUcmVhdGVkQXNVbmtub3duVmlhUmVmbGVjdGlvbikgeworICAvLyBTYW1lIGFzIFdyb25nVHlwZVRyZWF0ZWRBc1Vua25vd24gYnV0IHZpYSB0aGUgcmVmbGVjdGlvbiBpbnRlcmZhY2UuCisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBhbGxfdHlwZXNfbWVzc2FnZTsKKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgZW1wdHlfbWVzc2FnZTsKKyAgc3RkOjpzdHJpbmcgYml6YXJyb19kYXRhID0gR2V0Qml6YXJyb0RhdGEoKTsKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGJpemFycm9fZGF0YS5kYXRhKCksIGJpemFycm9fZGF0YS5zaXplKCkpOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgQVNTRVJUX1RSVUUoV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmYWxsX3R5cGVzX21lc3NhZ2UpKTsKKyAgQVNTRVJUX1RSVUUoZW1wdHlfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoYml6YXJyb19kYXRhKSk7CisKKyAgRVhQRUNUX0VRKGVtcHR5X21lc3NhZ2UuRGVidWdTdHJpbmcoKSwgYWxsX3R5cGVzX21lc3NhZ2UuRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBVbmtub3duRXh0ZW5zaW9ucykgeworICAvLyBNYWtlIHN1cmUgZmllbGRzIGFyZSBwcm9wZXJseSBwYXJzZWQgdG8gdGhlIFVua25vd25GaWVsZFNldCBldmVuIHdoZW4KKyAgLy8gdGhleSBhcmUgZGVjbGFyZWQgYXMgZXh0ZW5zaW9uIG51bWJlcnMuCisKKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBtZXNzYWdlOworICBBU1NFUlRfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhhbGxfZmllbGRzX2RhdGFfKSk7CisKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuRGVidWdTdHJpbmcoKSwgZW1wdHlfbWVzc2FnZV8uRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBVbmtub3duRXh0ZW5zaW9uc1JlZmxlY3Rpb24pIHsKKyAgLy8gU2FtZSBhcyBVbmtub3duRXh0ZW5zaW9ucyBleGNlcHQgcGFyc2luZyB2aWEgcmVmbGVjdGlvbi4KKworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIG1lc3NhZ2U7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChhbGxfZmllbGRzX2RhdGFfLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9maWVsZHNfZGF0YV8uc2l6ZSgpKTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7CisgIEFTU0VSVF9UUlVFKFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgJm1lc3NhZ2UpKTsKKworICBFWFBFQ1RfRVEobWVzc2FnZS5EZWJ1Z1N0cmluZygpLCBlbXB0eV9tZXNzYWdlXy5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFdyb25nRXh0ZW5zaW9uVHlwZVRyZWF0ZWRBc1Vua25vd24pIHsKKyAgLy8gVGVzdCB0aGF0IGZpZWxkcyBvZiB0aGUgd3Jvbmcgd2lyZSB0eXBlIGFyZSB0cmVhdGVkIGxpa2UgdW5rbm93biBmaWVsZHMKKyAgLy8gd2hlbiBwYXJzaW5nIGV4dGVuc2lvbnMuCisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIGFsbF9leHRlbnNpb25zX21lc3NhZ2U7CisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIGVtcHR5X21lc3NhZ2U7CisgIHN0ZDo6c3RyaW5nIGJpemFycm9fZGF0YSA9IEdldEJpemFycm9EYXRhKCk7CisgIEFTU0VSVF9UUlVFKGFsbF9leHRlbnNpb25zX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGJpemFycm9fZGF0YSkpOworICBBU1NFUlRfVFJVRShlbXB0eV9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhiaXphcnJvX2RhdGEpKTsKKworICAvLyBBbGwgZmllbGRzIHNob3VsZCBoYXZlIGJlZW4gaW50ZXJwcmV0ZWQgYXMgdW5rbm93biwgc28gdGhlIGRlYnVnIHN0cmluZ3MKKyAgLy8gc2hvdWxkIGJlIHRoZSBzYW1lLgorICBFWFBFQ1RfRVEoZW1wdHlfbWVzc2FnZS5EZWJ1Z1N0cmluZygpLCBhbGxfZXh0ZW5zaW9uc19tZXNzYWdlLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgVW5rbm93bkVudW1WYWx1ZSkgeworICB1c2luZyB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM7CisgIHVzaW5nIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM7CisgIHVzaW5nIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogc2luZ3VsYXJfZmllbGQgPQorICAgICAgVGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX2VudW0iKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXBlYXRlZF9maWVsZCA9CisgICAgICBUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIpOworICBBU1NFUlRfVFJVRShzaW5ndWxhcl9maWVsZCAhPSBudWxscHRyKTsKKyAgQVNTRVJUX1RSVUUocmVwZWF0ZWRfZmllbGQgIT0gbnVsbHB0cik7CisKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKworICB7CisgICAgVGVzdEVtcHR5TWVzc2FnZSBlbXB0eV9tZXNzYWdlOworICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMgPSBlbXB0eV9tZXNzYWdlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKKyAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KHNpbmd1bGFyX2ZpZWxkLT5udW1iZXIoKSwgVGVzdEFsbFR5cGVzOjpCQVIpOworICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQoc2luZ3VsYXJfZmllbGQtPm51bWJlcigpLCA1KTsgIC8vIG5vdCB2YWxpZAorICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQocmVwZWF0ZWRfZmllbGQtPm51bWJlcigpLCBUZXN0QWxsVHlwZXM6OkZPTyk7CisgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChyZXBlYXRlZF9maWVsZC0+bnVtYmVyKCksIDQpOyAgLy8gbm90IHZhbGlkCisgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChyZXBlYXRlZF9maWVsZC0+bnVtYmVyKCksIFRlc3RBbGxUeXBlczo6QkFaKTsKKyAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KHJlcGVhdGVkX2ZpZWxkLT5udW1iZXIoKSwgNik7ICAvLyBub3QgdmFsaWQKKyAgICBlbXB0eV9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgfQorCisgIHsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgICBBU1NFUlRfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgRVhQRUNUX0VRKFRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9lbnVtKCkpOworICAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSk7CisgICAgRVhQRUNUX0VRKFRlc3RBbGxUeXBlczo6Rk9PLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtKDApKTsKKyAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVosIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0oMSkpOworCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcyA9IG1lc3NhZ2UudW5rbm93bl9maWVsZHMoKTsKKyAgICBBU1NFUlRfRVEoMywgdW5rbm93bl9maWVsZHMuZmllbGRfY291bnQoKSk7CisKKyAgICBFWFBFQ1RfRVEoc2luZ3VsYXJfZmllbGQtPm51bWJlcigpLCB1bmtub3duX2ZpZWxkcy5maWVsZCgwKS5udW1iZXIoKSk7CisgICAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQsIHVua25vd25fZmllbGRzLmZpZWxkKDApLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKDUsIHVua25vd25fZmllbGRzLmZpZWxkKDApLnZhcmludCgpKTsKKworICAgIEVYUEVDVF9FUShyZXBlYXRlZF9maWVsZC0+bnVtYmVyKCksIHVua25vd25fZmllbGRzLmZpZWxkKDEpLm51bWJlcigpKTsKKyAgICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwgdW5rbm93bl9maWVsZHMuZmllbGQoMSkudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoNCwgdW5rbm93bl9maWVsZHMuZmllbGQoMSkudmFyaW50KCkpOworCisgICAgRVhQRUNUX0VRKHJlcGVhdGVkX2ZpZWxkLT5udW1iZXIoKSwgdW5rbm93bl9maWVsZHMuZmllbGQoMikubnVtYmVyKCkpOworICAgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5ULCB1bmtub3duX2ZpZWxkcy5maWVsZCgyKS50eXBlKCkpOworICAgIEVYUEVDVF9FUSg2LCB1bmtub3duX2ZpZWxkcy5maWVsZCgyKS52YXJpbnQoKSk7CisgIH0KKworICB7CisgICAgdXNpbmcgdW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbjsKKyAgICB1c2luZyB1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uOworCisgICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgICBBU1NFUlRfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgRVhQRUNUX0VRKFRlc3RBbGxUeXBlczo6QkFSLAorICAgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24pKTsKKyAgICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbikpOworICAgIEVYUEVDVF9FUShUZXN0QWxsVHlwZXM6OkZPTywKKyAgICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24ocmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uLCAwKSk7CisgICAgRVhQRUNUX0VRKFRlc3RBbGxUeXBlczo6QkFaLAorICAgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24sIDEpKTsKKworICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMgPSBtZXNzYWdlLnVua25vd25fZmllbGRzKCk7CisgICAgQVNTRVJUX0VRKDMsIHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCkpOworCisgICAgRVhQRUNUX0VRKHNpbmd1bGFyX2ZpZWxkLT5udW1iZXIoKSwgdW5rbm93bl9maWVsZHMuZmllbGQoMCkubnVtYmVyKCkpOworICAgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5ULCB1bmtub3duX2ZpZWxkcy5maWVsZCgwKS50eXBlKCkpOworICAgIEVYUEVDVF9FUSg1LCB1bmtub3duX2ZpZWxkcy5maWVsZCgwKS52YXJpbnQoKSk7CisKKyAgICBFWFBFQ1RfRVEocmVwZWF0ZWRfZmllbGQtPm51bWJlcigpLCB1bmtub3duX2ZpZWxkcy5maWVsZCgxKS5udW1iZXIoKSk7CisgICAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQsIHVua25vd25fZmllbGRzLmZpZWxkKDEpLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKDQsIHVua25vd25fZmllbGRzLmZpZWxkKDEpLnZhcmludCgpKTsKKworICAgIEVYUEVDVF9FUShyZXBlYXRlZF9maWVsZC0+bnVtYmVyKCksIHVua25vd25fZmllbGRzLmZpZWxkKDIpLm51bWJlcigpKTsKKyAgICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwgdW5rbm93bl9maWVsZHMuZmllbGQoMikudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoNiwgdW5rbm93bl9maWVsZHMuZmllbGQoMikudmFyaW50KCkpOworICB9Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKSB7CisgIFVua25vd25GaWVsZFNldCBlbXB0eTsKKyAgZW1wdHkuQWRkVmFyaW50KDEsIDApOworICBFWFBFQ1RfRVEoc2l6ZW9mKFVua25vd25GaWVsZCksIGVtcHR5LlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBTcGFjZVVzZWQpIHsKKyAgLy8gS2VlcCBzaGFkb3cgdmVjdG9ycyB0byBhdm9pZCBtYWtpbmcgYXNzdW1wdGlvbnMgYWJvdXQgaXRzIGNhcGFjaXR5IGdyb3d0aC4KKyAgLy8gV2UgaW1pdGF0ZSB0aGUgcHVzaCBiYWNrIGNhbGxzIGhlcmUgdG8gZGV0ZXJtaW5lIHRoZSBleHBlY3RlZCBjYXBhY2l0eS4KKyAgc3RkOjp2ZWN0b3I8VW5rbm93bkZpZWxkPiBzaGFkb3dfdmVjdG9yLCBzaGFkb3dfdmVjdG9yX2dyb3VwOworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBlbXB0eV9tZXNzYWdlOworCisgIC8vIE1ha2Ugc3VyZSBhbiB1bmtub3duIGZpZWxkIHNldCBoYXMgemVybyBzcGFjZSB1c2VkIHVudGlsIGEgZmllbGQgaXMKKyAgLy8gYWN0dWFsbHkgYWRkZWQuCisgIGNvbnN0IHNpemVfdCBiYXNlID0gZW1wdHlfbWVzc2FnZS5TcGFjZVVzZWRMb25nKCk7CisgIHN0ZDo6c3RyaW5nKiBzdHIgPSBudWxscHRyOworICBVbmtub3duRmllbGRTZXQqIGdyb3VwID0gbnVsbHB0cjsKKyAgY29uc3QgYXV0byB0b3RhbCA9IFsmXSB7CisgICAgc2l6ZV90IHJlc3VsdCA9IGJhc2U7CisgICAgcmVzdWx0ICs9IHNoYWRvd192ZWN0b3IuY2FwYWNpdHkoKSAqIHNpemVvZihVbmtub3duRmllbGQpOworICAgIHJlc3VsdCArPSBzaGFkb3dfdmVjdG9yX2dyb3VwLmNhcGFjaXR5KCkgKiBzaXplb2YoVW5rbm93bkZpZWxkKTsKKyAgICBpZiAoc3RyICE9IG51bGxwdHIpIHsKKyAgICAgIHJlc3VsdCArPSBzaXplb2Yoc3RkOjpzdHJpbmcpOworICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBzc29fY2FwYWNpdHkgPSBzdGQ6OnN0cmluZygpLmNhcGFjaXR5KCk7CisgICAgICBpZiAoc3RyLT5jYXBhY2l0eSgpID4gc3NvX2NhcGFjaXR5KSByZXN1bHQgKz0gc3RyLT5jYXBhY2l0eSgpOworICAgIH0KKyAgICBpZiAoZ3JvdXAgIT0gbnVsbHB0cikgeworICAgICAgcmVzdWx0ICs9IHNpemVvZihVbmtub3duRmllbGRTZXQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9OworCisgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMgPSBlbXB0eV9tZXNzYWdlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKKyAgRVhQRUNUX0VRKHRvdGFsKCksIGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkTG9uZygpKTsKKworICAvLyBNYWtlIHN1cmUgZWFjaCB0aGluZyB3ZSBhZGQgdG8gdGhlIHNldCBpbmNyZWFzZXMgdGhlIFNwYWNlVXNlZExvbmcoKS4KKyAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCgxLCAwKTsKKyAgc2hhZG93X3ZlY3Rvci5lbXBsYWNlX2JhY2soKTsKKyAgRVhQRUNUX0VRKHRvdGFsKCksIGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkTG9uZygpKSA8PCAiVmFyIjsKKworICBzdHIgPSB1bmtub3duX2ZpZWxkcy0+QWRkTGVuZ3RoRGVsaW1pdGVkKDEpOworICBzaGFkb3dfdmVjdG9yLmVtcGxhY2VfYmFjaygpOworICBFWFBFQ1RfRVEodG90YWwoKSwgZW1wdHlfbWVzc2FnZS5TcGFjZVVzZWRMb25nKCkpIDw8ICJTdHIiOworCisgIHN0ci0+YXNzaWduKHNpemVvZihzdGQ6OnN0cmluZykgKyAxLCAneCcpOworICBFWFBFQ1RfRVEodG90YWwoKSwgZW1wdHlfbWVzc2FnZS5TcGFjZVVzZWRMb25nKCkpIDw8ICJTdHIyIjsKKworICBncm91cCA9IHVua25vd25fZmllbGRzLT5BZGRHcm91cCgxKTsKKyAgc2hhZG93X3ZlY3Rvci5lbXBsYWNlX2JhY2soKTsKKyAgRVhQRUNUX0VRKHRvdGFsKCksIGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkTG9uZygpKSA8PCAiR3JvdXAiOworCisgIGdyb3VwLT5BZGRWYXJpbnQoMSwgMCk7CisgIHNoYWRvd192ZWN0b3JfZ3JvdXAuZW1wbGFjZV9iYWNrKCk7CisgIEVYUEVDVF9FUSh0b3RhbCgpLCBlbXB0eV9tZXNzYWdlLlNwYWNlVXNlZExvbmcoKSkgPDwgIkdyb3VwMiI7CisKKyAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCgxLCAwKTsKKyAgc2hhZG93X3ZlY3Rvci5lbXBsYWNlX2JhY2soKTsKKyAgRVhQRUNUX0VRKHRvdGFsKCksIGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkTG9uZygpKSA8PCAiVmFyMiI7Cit9CisKKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIEVtcHR5KSB7CisgIFVua25vd25GaWVsZFNldCB1bmtub3duX2ZpZWxkczsKKyAgRVhQRUNUX1RSVUUodW5rbm93bl9maWVsZHMuZW1wdHkoKSk7CisgIHVua25vd25fZmllbGRzLkFkZFZhcmludCg2LCAxMjMpOworICBFWFBFQ1RfRkFMU0UodW5rbm93bl9maWVsZHMuZW1wdHkoKSk7CisgIHVua25vd25fZmllbGRzLkNsZWFyKCk7CisgIEVYUEVDVF9UUlVFKHVua25vd25fZmllbGRzLmVtcHR5KCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgRGVsZXRlU3VicmFuZ2UpIHsKKyAgLy8gRXhoYXVzdGl2ZWx5IHRlc3QgdGhlIGRlbGV0aW9uIG9mIGV2ZXJ5IHBvc3NpYmxlIHN1YnJhbmdlIGluIGFycmF5cyBvZiBhbGwKKyAgLy8gc2l6ZXMgZnJvbSAwIHRocm91Z2ggOS4KKyAgZm9yIChpbnQgc2l6ZSA9IDA7IHNpemUgPCAxMDsgKytzaXplKSB7CisgICAgZm9yIChpbnQgbnVtID0gMDsgbnVtIDw9IHNpemU7ICsrbnVtKSB7CisgICAgICBmb3IgKGludCBzdGFydCA9IDA7IHN0YXJ0IDwgc2l6ZSAtIG51bTsgKytzdGFydCkgeworICAgICAgICAvLyBDcmVhdGUgYSBzZXQgd2l0aCAic2l6ZSIgZmllbGRzLgorICAgICAgICBVbmtub3duRmllbGRTZXQgdW5rbm93bjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICB1bmtub3duLkFkZEZpeGVkMzIoaSwgaSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRGVsZXRlIHRoZSBzcGVjaWZpZWQgc3VicmFuZ2UuCisgICAgICAgIHVua25vd24uRGVsZXRlU3VicmFuZ2Uoc3RhcnQsIG51bSk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcmVzdWx0aW5nIGZpZWxkIHZhbHVlcyBhcmUgc3RpbGwgY29ycmVjdC4KKyAgICAgICAgRVhQRUNUX0VRKHNpemUgLSBudW0sIHVua25vd24uZmllbGRfY291bnQoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bi5maWVsZF9jb3VudCgpOyArK2kpIHsKKyAgICAgICAgICBpZiAoaSA8IHN0YXJ0KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaSwgdW5rbm93bi5maWVsZChpKS5maXhlZDMyKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaSArIG51bSwgdW5rbm93bi5maWVsZChpKS5maXhlZDMyKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIENoZWNrRGVsZXRlQnlOdW1iZXIoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgZmllbGRfbnVtYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsZXRlZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgZXhwZWN0ZWRfZmllbGRfbnVibWVycykgeworICBVbmtub3duRmllbGRTZXQgdW5rbm93bl9maWVsZHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfbnVtYmVycy5zaXplKCk7ICsraSkgeworICAgIHVua25vd25fZmllbGRzLkFkZEZpeGVkMzIoZmllbGRfbnVtYmVyc1tpXSwgaSk7CisgIH0KKyAgdW5rbm93bl9maWVsZHMuRGVsZXRlQnlOdW1iZXIoZGVsZXRlZF9udW1iZXIpOworICBBU1NFUlRfRVEoZXhwZWN0ZWRfZmllbGRfbnVibWVycy5zaXplKCksIHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkX2ZpZWxkX251Ym1lcnMuc2l6ZSgpOyArK2kpIHsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfZmllbGRfbnVibWVyc1tpXSwgdW5rbm93bl9maWVsZHMuZmllbGQoaSkubnVtYmVyKCkpOworICB9Cit9CisKKyNkZWZpbmUgTUFLRV9WRUNUT1IoeCkgc3RkOjp2ZWN0b3I8aW50Pih4LCB4ICsgR09PR0xFX0FSUkFZU0laRSh4KSkKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBEZWxldGVCeU51bWJlcikgeworICBDaGVja0RlbGV0ZUJ5TnVtYmVyKHN0ZDo6dmVjdG9yPGludD4oKSwgMSwgc3RkOjp2ZWN0b3I8aW50PigpKTsKKyAgc3RhdGljIGNvbnN0IGludCBrVGVzdEZpZWxkTnVtYmVyczFbXSA9IHsxLCAyLCAzfTsKKyAgc3RhdGljIGNvbnN0IGludCBrRmllbGROdW1iZXJUb0RlbGV0ZTEgPSAxOworICBzdGF0aWMgY29uc3QgaW50IGtFeHBlY3RlZEZpZWxkTnVtYmVyczFbXSA9IHsyLCAzfTsKKyAgQ2hlY2tEZWxldGVCeU51bWJlcihNQUtFX1ZFQ1RPUihrVGVzdEZpZWxkTnVtYmVyczEpLCBrRmllbGROdW1iZXJUb0RlbGV0ZTEsCisgICAgICAgICAgICAgICAgICAgICAgTUFLRV9WRUNUT1Ioa0V4cGVjdGVkRmllbGROdW1iZXJzMSkpOworICBzdGF0aWMgY29uc3QgaW50IGtUZXN0RmllbGROdW1iZXJzMltdID0gezEsIDIsIDN9OworICBzdGF0aWMgY29uc3QgaW50IGtGaWVsZE51bWJlclRvRGVsZXRlMiA9IDI7CisgIHN0YXRpYyBjb25zdCBpbnQga0V4cGVjdGVkRmllbGROdW1iZXJzMltdID0gezEsIDN9OworICBDaGVja0RlbGV0ZUJ5TnVtYmVyKE1BS0VfVkVDVE9SKGtUZXN0RmllbGROdW1iZXJzMiksIGtGaWVsZE51bWJlclRvRGVsZXRlMiwKKyAgICAgICAgICAgICAgICAgICAgICBNQUtFX1ZFQ1RPUihrRXhwZWN0ZWRGaWVsZE51bWJlcnMyKSk7CisgIHN0YXRpYyBjb25zdCBpbnQga1Rlc3RGaWVsZE51bWJlcnMzW10gPSB7MSwgMiwgM307CisgIHN0YXRpYyBjb25zdCBpbnQga0ZpZWxkTnVtYmVyVG9EZWxldGUzID0gMzsKKyAgc3RhdGljIGNvbnN0IGludCBrRXhwZWN0ZWRGaWVsZE51bWJlcnMzW10gPSB7MSwgMn07CisgIENoZWNrRGVsZXRlQnlOdW1iZXIoTUFLRV9WRUNUT1Ioa1Rlc3RGaWVsZE51bWJlcnMzKSwga0ZpZWxkTnVtYmVyVG9EZWxldGUzLAorICAgICAgICAgICAgICAgICAgICAgIE1BS0VfVkVDVE9SKGtFeHBlY3RlZEZpZWxkTnVtYmVyczMpKTsKKyAgc3RhdGljIGNvbnN0IGludCBrVGVzdEZpZWxkTnVtYmVyczRbXSA9IHsxLCAyLCAxLCA0LCAxfTsKKyAgc3RhdGljIGNvbnN0IGludCBrRmllbGROdW1iZXJUb0RlbGV0ZTQgPSAxOworICBzdGF0aWMgY29uc3QgaW50IGtFeHBlY3RlZEZpZWxkTnVtYmVyczRbXSA9IHsyLCA0fTsKKyAgQ2hlY2tEZWxldGVCeU51bWJlcihNQUtFX1ZFQ1RPUihrVGVzdEZpZWxkTnVtYmVyczQpLCBrRmllbGROdW1iZXJUb0RlbGV0ZTQsCisgICAgICAgICAgICAgICAgICAgICAgTUFLRV9WRUNUT1Ioa0V4cGVjdGVkRmllbGROdW1iZXJzNCkpOworICBzdGF0aWMgY29uc3QgaW50IGtUZXN0RmllbGROdW1iZXJzNVtdID0gezEsIDIsIDMsIDQsIDV9OworICBzdGF0aWMgY29uc3QgaW50IGtGaWVsZE51bWJlclRvRGVsZXRlNSA9IDY7CisgIHN0YXRpYyBjb25zdCBpbnQga0V4cGVjdGVkRmllbGROdW1iZXJzNVtdID0gezEsIDIsIDMsIDQsIDV9OworICBDaGVja0RlbGV0ZUJ5TnVtYmVyKE1BS0VfVkVDVE9SKGtUZXN0RmllbGROdW1iZXJzNSksIGtGaWVsZE51bWJlclRvRGVsZXRlNSwKKyAgICAgICAgICAgICAgICAgICAgICBNQUtFX1ZFQ1RPUihrRXhwZWN0ZWRGaWVsZE51bWJlcnM1KSk7Cit9CisjdW5kZWYgTUFLRV9WRUNUT1IKKworfSAgLy8gbmFtZXNwYWNlCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWwuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZGVsaW1pdGVkX21lc3NhZ2VfdXRpbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGM2MzNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWwuY2MKQEAgLTAsMCArMSwxMjggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBZGFwdGVkIGZyb20gdGhlIHBhdGNoIG9mIGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9wdWxsLzcxMCBmb3IgZGV0YWlscy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKKworYm9vbCBTZXJpYWxpemVEZWxpbWl0ZWRUb0ZpbGVEZXNjcmlwdG9yKGNvbnN0IE1lc3NhZ2VMaXRlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlX2Rlc2NyaXB0b3IpIHsKKyAgaW86OkZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0KGZpbGVfZGVzY3JpcHRvcik7CisgIHJldHVybiBTZXJpYWxpemVEZWxpbWl0ZWRUb1plcm9Db3B5U3RyZWFtKG1lc3NhZ2UsICZvdXRwdXQpOworfQorCitib29sIFNlcmlhbGl6ZURlbGltaXRlZFRvT3N0cmVhbShjb25zdCBNZXNzYWdlTGl0ZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSogb3V0cHV0KSB7CisgIHsKKyAgICBpbzo6T3N0cmVhbU91dHB1dFN0cmVhbSB6ZXJvX2NvcHlfb3V0cHV0KG91dHB1dCk7CisgICAgaWYgKCFTZXJpYWxpemVEZWxpbWl0ZWRUb1plcm9Db3B5U3RyZWFtKG1lc3NhZ2UsICZ6ZXJvX2NvcHlfb3V0cHV0KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gb3V0cHV0LT5nb29kKCk7Cit9CisKK2Jvb2wgUGFyc2VEZWxpbWl0ZWRGcm9tWmVyb0NvcHlTdHJlYW0oTWVzc2FnZUxpdGUqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogY2xlYW5fZW9mKSB7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KGlucHV0KTsKKyAgcmV0dXJuIFBhcnNlRGVsaW1pdGVkRnJvbUNvZGVkU3RyZWFtKG1lc3NhZ2UsICZjb2RlZF9pbnB1dCwgY2xlYW5fZW9mKTsKK30KKworYm9vbCBQYXJzZURlbGltaXRlZEZyb21Db2RlZFN0cmVhbShNZXNzYWdlTGl0ZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBjbGVhbl9lb2YpIHsKKyAgaWYgKGNsZWFuX2VvZiAhPSBudWxscHRyKSAqY2xlYW5fZW9mID0gZmFsc2U7CisgIGludCBzdGFydCA9IGlucHV0LT5DdXJyZW50UG9zaXRpb24oKTsKKworICAvLyBSZWFkIHRoZSBzaXplLgorICB1aW50MzJfdCBzaXplOworICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJnNpemUpKSB7CisgICAgaWYgKGNsZWFuX2VvZiAhPSBudWxscHRyKSAqY2xlYW5fZW9mID0gaW5wdXQtPkN1cnJlbnRQb3NpdGlvbigpID09IHN0YXJ0OworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEdldCB0aGUgcG9zaXRpb24gYWZ0ZXIgYW55IHNpemUgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgKGFuZCBvbmx5IHRoZSBtZXNzYWdlCisgIC8vIGl0c2VsZiByZW1haW5zKS4KKyAgaW50IHBvc2l0aW9uX2FmdGVyX3NpemUgPSBpbnB1dC0+Q3VycmVudFBvc2l0aW9uKCk7CisKKyAgLy8gVGVsbCB0aGUgc3RyZWFtIG5vdCB0byByZWFkIGJleW9uZCB0aGF0IHNpemUuCisgIGlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGlucHV0LT5QdXNoTGltaXQoc3RhdGljX2Nhc3Q8aW50PihzaXplKSk7CisKKyAgLy8gUGFyc2UgdGhlIG1lc3NhZ2UuCisgIGlmICghbWVzc2FnZS0+TWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW5wdXQpKSByZXR1cm4gZmFsc2U7CisgIGlmICghaW5wdXQtPkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKSByZXR1cm4gZmFsc2U7CisgIGlmIChpbnB1dC0+Q3VycmVudFBvc2l0aW9uKCkgLSBwb3NpdGlvbl9hZnRlcl9zaXplICE9IHN0YXRpY19jYXN0PGludD4oc2l6ZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFJlbGVhc2UgdGhlIGxpbWl0LgorICBpbnB1dC0+UG9wTGltaXQobGltaXQpOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIFNlcmlhbGl6ZURlbGltaXRlZFRvWmVyb0NvcHlTdHJlYW0oY29uc3QgTWVzc2FnZUxpdGUmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dChvdXRwdXQpOworICByZXR1cm4gU2VyaWFsaXplRGVsaW1pdGVkVG9Db2RlZFN0cmVhbShtZXNzYWdlLCAmY29kZWRfb3V0cHV0KTsKK30KKworYm9vbCBTZXJpYWxpemVEZWxpbWl0ZWRUb0NvZGVkU3RyZWFtKGNvbnN0IE1lc3NhZ2VMaXRlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIC8vIFdyaXRlIHRoZSBzaXplLgorICBzaXplX3Qgc2l6ZSA9IG1lc3NhZ2UuQnl0ZVNpemVMb25nKCk7CisgIGlmIChzaXplID4gSU5UX01BWCkgcmV0dXJuIGZhbHNlOworCisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2l6ZSkpOworCisgIC8vIFdyaXRlIHRoZSBjb250ZW50LgorICB1aW50OF90KiBidWZmZXIgPQorICAgICAgb3V0cHV0LT5HZXREaXJlY3RCdWZmZXJGb3JOQnl0ZXNBbmRBZHZhbmNlKHN0YXRpY19jYXN0PGludD4oc2l6ZSkpOworICBpZiAoYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAvLyBPcHRpbWl6YXRpb246IFRoZSBtZXNzYWdlIGZpdHMgaW4gb25lIGJ1ZmZlciwgc28gdXNlIHRoZSBmYXN0ZXIKKyAgICAvLyBkaXJlY3QtdG8tYXJyYXkgc2VyaWFsaXphdGlvbiBwYXRoLgorICAgIG1lc3NhZ2UuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShidWZmZXIpOworICB9IGVsc2UgeworICAgIC8vIFNsaWdodGx5LXNsb3dlciBwYXRoIHdoZW4gdGhlIG1lc3NhZ2UgaXMgbXVsdGlwbGUgYnVmZmVycy4KKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhvdXRwdXQpOworICAgIGlmIChvdXRwdXQtPkhhZEVycm9yKCkpIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZGVsaW1pdGVkX21lc3NhZ2VfdXRpbC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODYyNWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWwuaApAQCAtMCwwICsxLDEwOSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEFkYXB0ZWQgZnJvbSB0aGUgcGF0Y2ggb2Yga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL3B1bGwvNzEwIGZvciBkZXRhaWxzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9VVElMX0RFTElNSVRFRF9NRVNTQUdFX1VUSUxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VVElMX0RFTElNSVRFRF9NRVNTQUdFX1VUSUxfSF9fCisKKworI2luY2x1ZGUgPG9zdHJlYW0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKKworLy8gV3JpdGUgYSBzaW5nbGUgc2l6ZS1kZWxpbWl0ZWQgbWVzc2FnZSBmcm9tIHRoZSBnaXZlbiBzdHJlYW0uIERlbGltaXRlZAorLy8gZm9ybWF0IGFsbG93cyBhIHNpbmdsZSBmaWxlIG9yIHN0cmVhbSB0byBjb250YWluIG11bHRpcGxlIG1lc3NhZ2VzLAorLy8gd2hlcmVhcyBub3JtYWxseSB3cml0aW5nIG11bHRpcGxlIG5vbi1kZWxpbWl0ZWQgbWVzc2FnZXMgdG8gdGhlIHNhbWUKKy8vIHN0cmVhbSB3b3VsZCBjYXVzZSB0aGVtIHRvIGJlIG1lcmdlZC4gQSBkZWxpbWl0ZWQgbWVzc2FnZSBpcyBhIHZhcmludAorLy8gZW5jb2RpbmcgdGhlIG1lc3NhZ2Ugc2l6ZSBmb2xsb3dlZCBieSBhIG1lc3NhZ2Ugb2YgZXhhY3RseSB0aGF0IHNpemUuCisvLworLy8gTm90ZSB0aGF0IGlmIHlvdSB3YW50IHRvICpyZWFkKiBhIGRlbGltaXRlZCBtZXNzYWdlIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IKKy8vIG9yIGlzdHJlYW0sIHlvdSB3aWxsIG5lZWQgdG8gY29uc3RydWN0IGFuIGlvOjpGaWxlSW5wdXRTdHJlYW0gb3IKKy8vIGlvOjpPc3RyZWFtSW5wdXRTdHJlYW0gKGltcGxlbWVudGF0aW9ucyBvZiBpbzo6WmVyb0NvcHlTdHJlYW0pIGFuZCB1c2UgdGhlCisvLyB1dGlsaXR5IGZ1bmN0aW9uIFBhcnNlRGVsaW1pdGVkRnJvbVplcm9Db3B5U3RyZWFtKCkuIFlvdSBtdXN0IHRoZW4KKy8vIGNvbnRpbnVlIHRvIHVzZSB0aGUgc2FtZSBaZXJvQ29weUlucHV0U3RyZWFtIHRvIHJlYWQgYWxsIGZ1cnRoZXIgZGF0YSBmcm9tCisvLyB0aGUgc3RyZWFtIHVudGlsIEVPRi4gVGhpcyBpcyBiZWNhdXNlIHRoZXNlIFplcm9Db3B5SW5wdXRTdHJlYW0KKy8vIGltcGxlbWVudGF0aW9ucyBhcmUgYnVmZmVyZWQ6IHRoZXkgcmVhZCBhIGJpZyBjaHVuayBvZiBkYXRhIGF0IGEgdGltZSwKKy8vIHRoZW4gcGFyc2UgaXQuIEFzIGEgcmVzdWx0LCB0aGV5IG1heSByZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGUgZGVsaW1pdGVkCisvLyBtZXNzYWdlLiBUaGVyZSBpcyBubyB3YXkgZm9yIHRoZW0gdG8gcHVzaCB0aGUgZXh0cmEgZGF0YSBiYWNrIGludG8gdGhlCisvLyB1bmRlcmx5aW5nIHNvdXJjZSwgc28gaW5zdGVhZCB5b3UgbXVzdCBrZWVwIHVzaW5nIHRoZSBzYW1lIHN0cmVhbSBvYmplY3QuCitib29sIFBST1RPQlVGX0VYUE9SVCBTZXJpYWxpemVEZWxpbWl0ZWRUb0ZpbGVEZXNjcmlwdG9yKAorICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBtZXNzYWdlLCBpbnQgZmlsZV9kZXNjcmlwdG9yKTsKKworYm9vbCBQUk9UT0JVRl9FWFBPUlQgU2VyaWFsaXplRGVsaW1pdGVkVG9Pc3RyZWFtKGNvbnN0IE1lc3NhZ2VMaXRlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSogb3V0cHV0KTsKKworLy8gUmVhZCBhIHNpbmdsZSBzaXplLWRlbGltaXRlZCBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIHN0cmVhbS4gRGVsaW1pdGVkCisvLyBmb3JtYXQgYWxsb3dzIGEgc2luZ2xlIGZpbGUgb3Igc3RyZWFtIHRvIGNvbnRhaW4gbXVsdGlwbGUgbWVzc2FnZXMsCisvLyB3aGVyZWFzIG5vcm1hbGx5IHBhcnNpbmcgY29uc3VtZXMgdGhlIGVudGlyZSBpbnB1dC4gQSBkZWxpbWl0ZWQgbWVzc2FnZQorLy8gaXMgYSB2YXJpbnQgZW5jb2RpbmcgdGhlIG1lc3NhZ2Ugc2l6ZSBmb2xsb3dlZCBieSBhIG1lc3NhZ2Ugb2YgZXhhY3RseQorLy8gdGhhdCBzaXplLgorLy8KKy8vIElmIHxjbGVhbl9lb2Z8IGlzIG5vdCBOVUxMLCB0aGVuIGl0IHdpbGwgYmUgc2V0IHRvIGluZGljYXRlIHdoZXRoZXIgdGhlCisvLyBzdHJlYW0gZW5kZWQgY2xlYW5seS4gVGhhdCBpcywgaWYgdGhlIHN0cmVhbSBlbmRzIHdpdGhvdXQgdGhpcyBtZXRob2QKKy8vIGhhdmluZyByZWFkIGFueSBkYXRhIGF0IGFsbCBmcm9tIGl0LCB0aGVuICpjbGVhbl9lb2Ygd2lsbCBiZSBzZXQgdHJ1ZSwKKy8vIG90aGVyd2lzZSBpdCB3aWxsIGJlIHNldCBmYWxzZS4gTm90ZSB0aGF0IHRoZXNlIG1ldGhvZHMgcmV0dXJuIGZhbHNlCisvLyBvbiBFT0YsIGJ1dCB0aGV5IGFsc28gcmV0dXJuIGZhbHNlIG9uIG90aGVyIGVycm9ycywgc28gfGNsZWFuX2VvZnwgaXMKKy8vIG5lZWRlZCB0byBkaXN0aW5ndWlzaCBhIGNsZWFuIGVuZCBmcm9tIGVycm9ycy4KK2Jvb2wgUFJPVE9CVUZfRVhQT1JUIFBhcnNlRGVsaW1pdGVkRnJvbVplcm9Db3B5U3RyZWFtKAorICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlLCBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIGJvb2wqIGNsZWFuX2VvZik7CisKK2Jvb2wgUFJPVE9CVUZfRVhQT1JUIFBhcnNlRGVsaW1pdGVkRnJvbUNvZGVkU3RyZWFtKE1lc3NhZ2VMaXRlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogY2xlYW5fZW9mKTsKKworLy8gV3JpdGUgYSBzaW5nbGUgc2l6ZS1kZWxpbWl0ZWQgbWVzc2FnZSBmcm9tIHRoZSBnaXZlbiBzdHJlYW0uIERlbGltaXRlZAorLy8gZm9ybWF0IGFsbG93cyBhIHNpbmdsZSBmaWxlIG9yIHN0cmVhbSB0byBjb250YWluIG11bHRpcGxlIG1lc3NhZ2VzLAorLy8gd2hlcmVhcyBub3JtYWxseSB3cml0aW5nIG11bHRpcGxlIG5vbi1kZWxpbWl0ZWQgbWVzc2FnZXMgdG8gdGhlIHNhbWUKKy8vIHN0cmVhbSB3b3VsZCBjYXVzZSB0aGVtIHRvIGJlIG1lcmdlZC4gQSBkZWxpbWl0ZWQgbWVzc2FnZSBpcyBhIHZhcmludAorLy8gZW5jb2RpbmcgdGhlIG1lc3NhZ2Ugc2l6ZSBmb2xsb3dlZCBieSBhIG1lc3NhZ2Ugb2YgZXhhY3RseSB0aGF0IHNpemUuCitib29sIFBST1RPQlVGX0VYUE9SVCBTZXJpYWxpemVEZWxpbWl0ZWRUb1plcm9Db3B5U3RyZWFtKAorICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBtZXNzYWdlLCBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisKK2Jvb2wgUFJPVE9CVUZfRVhQT1JUIFNlcmlhbGl6ZURlbGltaXRlZFRvQ29kZWRTdHJlYW0oCisgICAgY29uc3QgTWVzc2FnZUxpdGUmIG1lc3NhZ2UsIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9VVElMX0RFTElNSVRFRF9NRVNTQUdFX1VUSUxfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZGVsaW1pdGVkX21lc3NhZ2VfdXRpbF90ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDgzYTY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2RlbGltaXRlZF9tZXNzYWdlX3V0aWxfdGVzdC5jYwpAQCAtMCwwICsxLDExNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEFkYXB0ZWQgZnJvbSB0aGUgcGF0Y2ggb2Yga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL3B1bGwvNzEwIGZvciBkZXRhaWxzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvZGVsaW1pdGVkX21lc3NhZ2VfdXRpbC5oPgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworCitURVNUKERlbGltaXRlZE1lc3NhZ2VVdGlsVGVzdCwgRGVsaW1pdGVkTWVzc2FnZXMpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworCisgIHsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UxOworICAgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UxKTsKKyAgICBFWFBFQ1RfVFJVRShTZXJpYWxpemVEZWxpbWl0ZWRUb09zdHJlYW0obWVzc2FnZTEsICZzdHJlYW0pKTsKKworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMgbWVzc2FnZTI7CisgICAgVGVzdFV0aWw6OlNldFBhY2tlZEZpZWxkcygmbWVzc2FnZTIpOworICAgIEVYUEVDVF9UUlVFKFNlcmlhbGl6ZURlbGltaXRlZFRvT3N0cmVhbShtZXNzYWdlMiwgJnN0cmVhbSkpOworICB9CisKKyAgeworICAgIGJvb2wgY2xlYW5fZW9mOworICAgIGlvOjpJc3RyZWFtSW5wdXRTdHJlYW0genN0cmVhbSgmc3RyZWFtKTsKKworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTE7CisgICAgY2xlYW5fZW9mID0gdHJ1ZTsKKyAgICBFWFBFQ1RfVFJVRShQYXJzZURlbGltaXRlZEZyb21aZXJvQ29weVN0cmVhbSgmbWVzc2FnZTEsCisgICAgICAgICZ6c3RyZWFtLCAmY2xlYW5fZW9mKSk7CisgICAgRVhQRUNUX0ZBTFNFKGNsZWFuX2VvZik7CisgICAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMSk7CisKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UyOworICAgIGNsZWFuX2VvZiA9IHRydWU7CisgICAgRVhQRUNUX1RSVUUoUGFyc2VEZWxpbWl0ZWRGcm9tWmVyb0NvcHlTdHJlYW0oJm1lc3NhZ2UyLAorICAgICAgICAmenN0cmVhbSwgJmNsZWFuX2VvZikpOworICAgIEVYUEVDVF9GQUxTRShjbGVhbl9lb2YpOworICAgIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRGaWVsZHNTZXQobWVzc2FnZTIpOworCisgICAgY2xlYW5fZW9mID0gZmFsc2U7CisgICAgRVhQRUNUX0ZBTFNFKFBhcnNlRGVsaW1pdGVkRnJvbVplcm9Db3B5U3RyZWFtKCZtZXNzYWdlMiwKKyAgICAgICAgJnpzdHJlYW0sICZjbGVhbl9lb2YpKTsKKyAgICBFWFBFQ1RfVFJVRShjbGVhbl9lb2YpOworICB9Cit9CisKK1RFU1QoRGVsaW1pdGVkTWVzc2FnZVV0aWxUZXN0LCBGYWlsc0F0RW5kT2ZTdHJlYW0pIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gZnVsbF9zdHJlYW07CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHBhcnRpYWxfc3RyZWFtOworCisgIHsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtZXNzYWdlLnNldF9jKDQyKTsKKyAgICBtZXNzYWdlLnNldF9kKDI0KTsKKyAgICBFWFBFQ1RfVFJVRShTZXJpYWxpemVEZWxpbWl0ZWRUb09zdHJlYW0obWVzc2FnZSwgJmZ1bGxfc3RyZWFtKSk7CisKKyAgICBzdGQ6OnN0cmluZyBmdWxsX291dHB1dCA9IGZ1bGxfc3RyZWFtLnN0cigpOworICAgIEFTU0VSVF9HVChmdWxsX291dHB1dC5zaXplKCksIHNpemVfdHsyfSk7CisgICAgQVNTRVJUX0VRKGZ1bGxfb3V0cHV0WzBdLCA0KTsKKworICAgIHBhcnRpYWxfc3RyZWFtIDw8IGZ1bGxfb3V0cHV0WzBdIDw8IGZ1bGxfb3V0cHV0WzFdIDw8IGZ1bGxfb3V0cHV0WzJdOworICB9CisKKyAgeworICAgIGJvb2wgY2xlYW5fZW9mOworICAgIGlvOjpJc3RyZWFtSW5wdXRTdHJlYW0genN0cmVhbSgmcGFydGlhbF9zdHJlYW0pOworCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlIG1lc3NhZ2U7CisgICAgY2xlYW5fZW9mID0gdHJ1ZTsKKyAgICBFWFBFQ1RfRkFMU0UoUGFyc2VEZWxpbWl0ZWRGcm9tWmVyb0NvcHlTdHJlYW0oJm1lc3NhZ2UsCisgICAgICAgICZ6c3RyZWFtLCAmY2xlYW5fZW9mKSk7CisgICAgRVhQRUNUX0ZBTFNFKGNsZWFuX2VvZik7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX2NvbXBhcmF0b3IuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDhlODY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX2NvbXBhcmF0b3IuY2MKQEAgLTAsMCArMSwyMTAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtzcm9rYUBnb29nbGUuY29tIChLcnp5c3p0b2YgU3Jva2EpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmg+CisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWF0aHV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworCitGaWVsZENvbXBhcmF0b3I6OkZpZWxkQ29tcGFyYXRvcigpIHt9CitGaWVsZENvbXBhcmF0b3I6On5GaWVsZENvbXBhcmF0b3IoKSB7fQorCitTaW1wbGVGaWVsZENvbXBhcmF0b3I6OlNpbXBsZUZpZWxkQ29tcGFyYXRvcigpCisgICAgOiBmbG9hdF9jb21wYXJpc29uXyhFWEFDVCksCisgICAgICB0cmVhdF9uYW5fYXNfZXF1YWxfKGZhbHNlKSwKKyAgICAgIGhhc19kZWZhdWx0X3RvbGVyYW5jZV8oZmFsc2UpIHt9CisKK1NpbXBsZUZpZWxkQ29tcGFyYXRvcjo6flNpbXBsZUZpZWxkQ29tcGFyYXRvcigpIHt9CisKK0ZpZWxkQ29tcGFyYXRvcjo6Q29tcGFyaXNvblJlc3VsdCBTaW1wbGVGaWVsZENvbXBhcmF0b3I6OlNpbXBsZUNvbXBhcmUoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZV8xLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlXzIsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4XzEsIGludCBpbmRleF8yLAorICAgIGNvbnN0IHV0aWw6OkZpZWxkQ29udGV4dCogLypmaWVsZF9jb250ZXh0Ki8pIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbl8xID0gbWVzc2FnZV8xLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbl8yID0gbWVzc2FnZV8yLkdldFJlZmxlY3Rpb24oKTsKKworICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIENPTVBBUkVfRklFTEQoTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIFJlc3VsdEZyb21Cb29sZWFuKENvbXBhcmUjI01FVEhPRCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICpmaWVsZCwgcmVmbGVjdGlvbl8xLT5HZXRSZXBlYXRlZCMjTUVUSE9EKG1lc3NhZ2VfMSwgZmllbGQsIGluZGV4XzEpLCBcCisgICAgICAgIHJlZmxlY3Rpb25fMi0+R2V0UmVwZWF0ZWQjI01FVEhPRChtZXNzYWdlXzIsIGZpZWxkLCBpbmRleF8yKSkpOyAgICAgICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIFJlc3VsdEZyb21Cb29sZWFuKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENvbXBhcmUjI01FVEhPRCgqZmllbGQsIHJlZmxlY3Rpb25fMS0+R2V0IyNNRVRIT0QobWVzc2FnZV8xLCBmaWVsZCksICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0aW9uXzItPkdldCMjTUVUSE9EKG1lc3NhZ2VfMiwgZmllbGQpKSk7ICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJyZWFrOyAgLy8gTWFrZSBzdXJlIG5vIGZhbGwtdGhyb3VnaCBpcyBpbnRyb2R1Y2VkLgorCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKKyAgICAgIENPTVBBUkVfRklFTEQoQm9vbCk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgICAgQ09NUEFSRV9GSUVMRChEb3VibGUpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICBDT01QQVJFX0ZJRUxEKEVudW0pOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgQ09NUEFSRV9GSUVMRChGbG9hdCk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6CisgICAgICBDT01QQVJFX0ZJRUxEKEludDMyKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIENPTVBBUkVfRklFTEQoSW50NjQpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICAvLyBBbGxvY2F0ZSBzY3JhdGNoIHN0cmluZ3MgdG8gc3RvcmUgdGhlIHJlc3VsdCBpZiBhIGNvbnZlcnNpb24gaXMKKyAgICAgICAgLy8gbmVlZGVkLgorICAgICAgICBzdGQ6OnN0cmluZyBzY3JhdGNoMTsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2NyYXRjaDI7CisgICAgICAgIHJldHVybiBSZXN1bHRGcm9tQm9vbGVhbigKKyAgICAgICAgICAgIENvbXBhcmVTdHJpbmcoKmZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0aW9uXzEtPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV8xLCBmaWVsZCwgaW5kZXhfMSwgJnNjcmF0Y2gxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmbGVjdGlvbl8yLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfMiwgZmllbGQsIGluZGV4XzIsICZzY3JhdGNoMikpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFsbG9jYXRlIHNjcmF0Y2ggc3RyaW5ncyB0byBzdG9yZSB0aGUgcmVzdWx0IGlmIGEgY29udmVyc2lvbiBpcworICAgICAgICAvLyBuZWVkZWQuCisgICAgICAgIHN0ZDo6c3RyaW5nIHNjcmF0Y2gxOworICAgICAgICBzdGQ6OnN0cmluZyBzY3JhdGNoMjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdEZyb21Cb29sZWFuKENvbXBhcmVTdHJpbmcoCisgICAgICAgICAgICAqZmllbGQsCisgICAgICAgICAgICByZWZsZWN0aW9uXzEtPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlXzEsIGZpZWxkLCAmc2NyYXRjaDEpLAorICAgICAgICAgICAgcmVmbGVjdGlvbl8yLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZV8yLCBmaWVsZCwgJnNjcmF0Y2gyKSkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgQ09NUEFSRV9GSUVMRChVSW50MzIpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIENPTVBBUkVfRklFTEQoVUludDY0KTsKKworI3VuZGVmIENPTVBBUkVfRklFTEQKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICByZXR1cm4gUkVDVVJTRTsKKworICAgIGRlZmF1bHQ6CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiTm8gY29tcGFyaXNvbiBjb2RlIGZvciBmaWVsZCAiIDw8IGZpZWxkLT5mdWxsX25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiIG9mIENwcFR5cGUgPSAiIDw8IGZpZWxkLT5jcHBfdHlwZSgpOworICAgICAgcmV0dXJuIERJRkZFUkVOVDsKKyAgfQorfQorCitib29sIFNpbXBsZUZpZWxkQ29tcGFyYXRvcjo6Q29tcGFyZVdpdGhEaWZmZXJlbmNlcigKKyAgICBNZXNzYWdlRGlmZmVyZW5jZXIqIGRpZmZlcmVuY2VyLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwgY29uc3QgdXRpbDo6RmllbGRDb250ZXh0KiBmaWVsZF9jb250ZXh0KSB7CisgIHJldHVybiBkaWZmZXJlbmNlci0+Q29tcGFyZShtZXNzYWdlMSwgbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9jb250ZXh0LT5wYXJlbnRfZmllbGRzKCkpOworfQorCit2b2lkIFNpbXBsZUZpZWxkQ29tcGFyYXRvcjo6U2V0RGVmYXVsdEZyYWN0aW9uQW5kTWFyZ2luKGRvdWJsZSBmcmFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcmdpbikgeworICBkZWZhdWx0X3RvbGVyYW5jZV8gPSBUb2xlcmFuY2UoZnJhY3Rpb24sIG1hcmdpbik7CisgIGhhc19kZWZhdWx0X3RvbGVyYW5jZV8gPSB0cnVlOworfQorCit2b2lkIFNpbXBsZUZpZWxkQ29tcGFyYXRvcjo6U2V0RnJhY3Rpb25BbmRNYXJnaW4oY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZnJhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcmdpbikgeworICBHT09HTEVfQ0hFQ0soRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUID09IGZpZWxkLT5jcHBfdHlwZSgpIHx8CisgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEUgPT0gZmllbGQtPmNwcF90eXBlKCkpCisgICAgICA8PCAiRmllbGQgaGFzIHRvIGJlIGZsb2F0IG9yIGRvdWJsZSB0eXBlLiBGaWVsZCBuYW1lIGlzOiAiCisgICAgICA8PCBmaWVsZC0+ZnVsbF9uYW1lKCk7CisgIG1hcF90b2xlcmFuY2VfW2ZpZWxkXSA9IFRvbGVyYW5jZShmcmFjdGlvbiwgbWFyZ2luKTsKK30KKworYm9vbCBTaW1wbGVGaWVsZENvbXBhcmF0b3I6OkNvbXBhcmVEb3VibGUoY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZV8xLCBkb3VibGUgdmFsdWVfMikgeworICByZXR1cm4gQ29tcGFyZURvdWJsZU9yRmxvYXQoZmllbGQsIHZhbHVlXzEsIHZhbHVlXzIpOworfQorCitib29sIFNpbXBsZUZpZWxkQ29tcGFyYXRvcjo6Q29tcGFyZUVudW0oY29uc3QgRmllbGREZXNjcmlwdG9yJiAvKmZpZWxkKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWVfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZV8yKSB7CisgIHJldHVybiB2YWx1ZV8xLT5udW1iZXIoKSA9PSB2YWx1ZV8yLT5udW1iZXIoKTsKK30KKworYm9vbCBTaW1wbGVGaWVsZENvbXBhcmF0b3I6OkNvbXBhcmVGbG9hdChjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWx1ZV8xLCBmbG9hdCB2YWx1ZV8yKSB7CisgIHJldHVybiBDb21wYXJlRG91YmxlT3JGbG9hdChmaWVsZCwgdmFsdWVfMSwgdmFsdWVfMik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBTaW1wbGVGaWVsZENvbXBhcmF0b3I6OkNvbXBhcmVEb3VibGVPckZsb2F0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB2YWx1ZV8xLCBUIHZhbHVlXzIpIHsKKyAgaWYgKHZhbHVlXzEgPT0gdmFsdWVfMikgeworICAgIC8vIENvdmVycyAraW5mIGFuZCAtaW5mICh3aGljaCBhcmUgbm90IHdpdGhpbiBtYXJnaW4gb3IgZnJhY3Rpb24gb2YKKyAgICAvLyB0aGVtc2VsdmVzKSwgYW5kIGlzIGEgc2hvcnRjdXQgZm9yIGZpbml0ZSB2YWx1ZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoZmxvYXRfY29tcGFyaXNvbl8gPT0gRVhBQ1QpIHsKKyAgICBpZiAodHJlYXRfbmFuX2FzX2VxdWFsXyAmJiBzdGQ6OmlzbmFuKHZhbHVlXzEpICYmIHN0ZDo6aXNuYW4odmFsdWVfMikpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgaWYgKHRyZWF0X25hbl9hc19lcXVhbF8gJiYgc3RkOjppc25hbih2YWx1ZV8xKSAmJiBzdGQ6OmlzbmFuKHZhbHVlXzIpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gZmxvYXRfY29tcGFyaXNvbl8gPT0gQVBQUk9YSU1BVEUgY292ZXJzIHR3byB1c2UgY2FzZXMuCisgICAgVG9sZXJhbmNlKiB0b2xlcmFuY2UgPSBGaW5kT3JOdWxsKG1hcF90b2xlcmFuY2VfLCAmZmllbGQpOworICAgIGlmICh0b2xlcmFuY2UgPT0gTlVMTCAmJiBoYXNfZGVmYXVsdF90b2xlcmFuY2VfKSB7CisgICAgICB0b2xlcmFuY2UgPSAmZGVmYXVsdF90b2xlcmFuY2VfOworICAgIH0KKyAgICBpZiAodG9sZXJhbmNlID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBNYXRoVXRpbDo6QWxtb3N0RXF1YWxzKHZhbHVlXzEsIHZhbHVlXzIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBVc2UgdXNlci1wcm92aWRlZCBmcmFjdGlvbiBhbmQgbWFyZ2luLiBTaW5jZSB0aGV5IGFyZSBzdG9yZWQgYXMKKyAgICAgIC8vIGRvdWJsZXMsIHdlIGV4cGxpY2l0bHkgY2FzdCB0aGVtIHRvIHR5cGVzIG9mIHZhbHVlcyBwcm92aWRlZC4gVGhpcworICAgICAgLy8gaXMgdmVyeSBsaWtlbHkgdG8gZmFpbCBpZiBwcm92aWRlZCB2YWx1ZXMgYXJlIG5vdCBudW1lcmljLgorICAgICAgcmV0dXJuIE1hdGhVdGlsOjpXaXRoaW5GcmFjdGlvbk9yTWFyZ2luKAorICAgICAgICAgIHZhbHVlXzEsIHZhbHVlXzIsIHN0YXRpY19jYXN0PFQ+KHRvbGVyYW5jZS0+ZnJhY3Rpb24pLAorICAgICAgICAgIHN0YXRpY19jYXN0PFQ+KHRvbGVyYW5jZS0+bWFyZ2luKSk7CisgICAgfQorICB9Cit9CisKK0ZpZWxkQ29tcGFyYXRvcjo6Q29tcGFyaXNvblJlc3VsdCBTaW1wbGVGaWVsZENvbXBhcmF0b3I6OlJlc3VsdEZyb21Cb29sZWFuKAorICAgIGJvb2wgYm9vbGVhbl9yZXN1bHQpIGNvbnN0IHsKKyAgcmV0dXJuIGJvb2xlYW5fcmVzdWx0ID8gRmllbGRDb21wYXJhdG9yOjpTQU1FIDogRmllbGRDb21wYXJhdG9yOjpESUZGRVJFTlQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MDZkYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvci5oCkBAIC0wLDAgKzEsMjg4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gRGVmaW5lcyBjbGFzc2VzIGZvciBmaWVsZCBjb21wYXJpc29uLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9VVElMX0ZJRUxEX0NPTVBBUkFUT1JfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VVElMX0ZJRUxEX0NPTVBBUkFUT1JfSF9fCisKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIE1lc3NhZ2U7CitjbGFzcyBFbnVtVmFsdWVEZXNjcmlwdG9yOworY2xhc3MgRmllbGREZXNjcmlwdG9yOworCituYW1lc3BhY2UgdXRpbCB7CisKK2NsYXNzIEZpZWxkQ29udGV4dDsKK2NsYXNzIE1lc3NhZ2VEaWZmZXJlbmNlcjsKKworLy8gQmFzZSBjbGFzcyBzcGVjaWZ5aW5nIHRoZSBpbnRlcmZhY2UgZm9yIGNvbXBhcmluZyBwcm90b2NvbCBidWZmZXIgZmllbGRzLgorLy8gUmVndWxhciB1c2VycyBzaG91bGQgY29uc2lkZXIgdXNpbmcgb3Igc3ViY2xhc3NpbmcgRGVmYXVsdEZpZWxkQ29tcGFyYXRvcgorLy8gcmF0aGVyIHRoYW4gdGhpcyBpbnRlcmZhY2UuCisvLyBDdXJyZW50bHksIHRoaXMgZG9lcyBub3Qgc3VwcG9ydCBjb21wYXJpbmcgdW5rbm93biBmaWVsZHMuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRmllbGRDb21wYXJhdG9yIHsKKyBwdWJsaWM6CisgIEZpZWxkQ29tcGFyYXRvcigpOworICB2aXJ0dWFsIH5GaWVsZENvbXBhcmF0b3IoKTsKKworICBlbnVtIENvbXBhcmlzb25SZXN1bHQgeworICAgIFNBTUUsICAgICAgIC8vIENvbXBhcmVkIGZpZWxkcyBhcmUgZXF1YWwuIEluIGNhc2Ugb2YgY29tcGFyaW5nIHN1Ym1lc3NhZ2VzLAorICAgICAgICAgICAgICAgIC8vIHVzZXIgc2hvdWxkIG5vdCByZWN1cnNpdmVseSBjb21wYXJlIHRoZWlyIGNvbnRlbnRzLgorICAgIERJRkZFUkVOVCwgIC8vIENvbXBhcmVkIGZpZWxkcyBhcmUgZGlmZmVyZW50LiBJbiBjYXNlIG9mIGNvbXBhcmluZworICAgICAgICAgICAgICAgIC8vIHN1Ym1lc3NhZ2VzLCB1c2VyIHNob3VsZCBub3QgcmVjdXJzaXZlbHkgY29tcGFyZSB0aGVpcgorICAgICAgICAgICAgICAgIC8vIGNvbnRlbnRzLgorICAgIFJFQ1VSU0UsICAgIC8vIENvbXBhcmVkIHN1Ym1lc3NhZ2VzIG5lZWQgdG8gYmUgY29tcGFyZWQgcmVjdXJzaXZlbHkuCisgICAgICAgICAgICAgICAgLy8gRmllbGRDb21wYXJhdG9yIGRvZXMgbm90IHNwZWNpZnkgdGhlIHNlbWFudGljcyBvZiByZWN1cnNpdmUKKyAgICAgICAgICAgICAgICAvLyBjb21wYXJpc29uLiBUaGlzIHZhbHVlIHNob3VsZCBub3QgYmUgcmV0dXJuZWQgZm9yIHNpbXBsZQorICAgICAgICAgICAgICAgIC8vIHZhbHVlcy4KKyAgfTsKKworICAvLyBDb21wYXJlcyB0aGUgdmFsdWVzIG9mIGEgZmllbGQgaW4gdHdvIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlcy4KKyAgLy8gUmV0dXJucyBTQU1FIG9yIERJRkZFUkVOVCBmb3Igc2ltcGxlIHZhbHVlcywgYW5kIFNBTUUsIERJRkZFUkVOVCBvciBSRUNVUlNFCisgIC8vIGZvciBzdWJtZXNzYWdlcy4gUmV0dXJuaW5nIFJFQ1VSU0UgZm9yIGZpZWxkcyBub3QgYmVpbmcgc3VibWVzc2FnZXMgaXMKKyAgLy8gaWxsZWdhbC4KKyAgLy8gSW4gY2FzZSB0aGUgZ2l2ZW4gRmllbGREZXNjcmlwdG9yIHBvaW50cyB0byBhIHJlcGVhdGVkIGZpZWxkLCB0aGUgaW5kaWNlcworICAvLyBuZWVkIHRvIGJlIHZhbGlkLiBPdGhlcndpc2UgdGhleSBzaG91bGQgYmUgaWdub3JlZC4KKyAgLy8KKyAgLy8gRmllbGRDb250ZXh0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpYyBpbnN0YW5jZXMgb2YgdGhlCisgIC8vIGZpZWxkcyBiZWluZyBjb21wYXJlZCwgdmVyc3VzIEZpZWxkRGVzY3JpcHRvciB3aGljaCBvbmx5IGNvbnRhaW5zIGdlbmVyYWwKKyAgLy8gdHlwZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmllbGRzLgorICB2aXJ0dWFsIENvbXBhcmlzb25SZXN1bHQgQ29tcGFyZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2VfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1dGlsOjpGaWVsZENvbnRleHQqIGZpZWxkX2NvbnRleHQpID0gMDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWVsZENvbXBhcmF0b3IpOworfTsKKworLy8gQmFzaWMgaW1wbGVtZW50YXRpb24gb2YgRmllbGRDb21wYXJhdG9yLiAgU3VwcG9ydHMgdGhyZWUgbW9kZXMgb2YgZmxvYXRpbmcKKy8vIHBvaW50IHZhbHVlIGNvbXBhcmlzb246IGV4YWN0LCBhcHByb3hpbWF0ZSB1c2luZyBNYXRoVXRpbDo6QWxtb3N0RXF1YWwKKy8vIG1ldGhvZCwgYW5kIGFyYml0cmFyaWx5IHByZWNpc2UgdXNpbmcgTWF0aFV0aWw6OldpdGhpbkZyYWN0aW9uT3JNYXJnaW4uCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgU2ltcGxlRmllbGRDb21wYXJhdG9yIDogcHVibGljIEZpZWxkQ29tcGFyYXRvciB7CisgcHVibGljOgorICBlbnVtIEZsb2F0Q29tcGFyaXNvbiB7CisgICAgRVhBQ1QsICAgICAgICAvLyBGbG9hdHMgYW5kIGRvdWJsZXMgYXJlIGNvbXBhcmVkIGV4YWN0bHkuCisgICAgQVBQUk9YSU1BVEUsICAvLyBGbG9hdHMgYW5kIGRvdWJsZXMgYXJlIGNvbXBhcmVkIHVzaW5nIHRoZQorICAgICAgICAgICAgICAgICAgLy8gTWF0aFV0aWw6OkFsbW9zdEVxdWFsIG1ldGhvZCBvcgorICAgICAgICAgICAgICAgICAgLy8gTWF0aFV0aWw6OldpdGhpbkZyYWN0aW9uT3JNYXJnaW4gbWV0aG9kLgorICAgIC8vIFRPRE8oa3Nyb2thKTogSW50cm9kdWNlIHRoaXJkIHZhbHVlIHRvIGRpZmZlcmVudGlhdGUgdXNlcyBvZiBBbG1vc3RFcXVhbAorICAgIC8vICAgICAgICAgICAgICAgYW5kIFdpdGhpbkZyYWN0aW9uT3JNYXJnaW4uCisgIH07CisKKyAgLy8gQ3JlYXRlcyBuZXcgY29tcGFyYXRvciB3aXRoIGZsb2F0IGNvbXBhcmlzb24gc2V0IHRvIEVYQUNULgorICBTaW1wbGVGaWVsZENvbXBhcmF0b3IoKTsKKworICB+U2ltcGxlRmllbGRDb21wYXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBzZXRfZmxvYXRfY29tcGFyaXNvbihGbG9hdENvbXBhcmlzb24gZmxvYXRfY29tcGFyaXNvbikgeworICAgIGZsb2F0X2NvbXBhcmlzb25fID0gZmxvYXRfY29tcGFyaXNvbjsKKyAgfQorCisgIEZsb2F0Q29tcGFyaXNvbiBmbG9hdF9jb21wYXJpc29uKCkgY29uc3QgeyByZXR1cm4gZmxvYXRfY29tcGFyaXNvbl87IH0KKworICAvLyBTZXQgd2hldGhlciB0aGUgRmllbGRDb21wYXJhdG9yIHNoYWxsIHRyZWF0IGZsb2F0cyBvciBkb3VibGVzIHRoYXQgYXJlIGJvdGgKKyAgLy8gTmFOIGFzIGVxdWFsICh0cmVhdF9uYW5fYXNfZXF1YWwgPSB0cnVlKSBvciBhcyBkaWZmZXJlbnQKKyAgLy8gKHRyZWF0X25hbl9hc19lcXVhbCA9IGZhbHNlKS4gRGVmYXVsdCBpcyB0cmVhdGluZyBOYU5zIGFsd2F5cyBhcyBkaWZmZXJlbnQuCisgIHZvaWQgc2V0X3RyZWF0X25hbl9hc19lcXVhbChib29sIHRyZWF0X25hbl9hc19lcXVhbCkgeworICAgIHRyZWF0X25hbl9hc19lcXVhbF8gPSB0cmVhdF9uYW5fYXNfZXF1YWw7CisgIH0KKworICBib29sIHRyZWF0X25hbl9hc19lcXVhbCgpIGNvbnN0IHsgcmV0dXJuIHRyZWF0X25hbl9hc19lcXVhbF87IH0KKworICAvLyBTZXRzIHRoZSBmcmFjdGlvbiBhbmQgbWFyZ2luIGZvciB0aGUgZmxvYXQgY29tcGFyaXNvbiBvZiBhIGdpdmVuIGZpZWxkLgorICAvLyBVc2VzIE1hdGhVdGlsOjpXaXRoaW5GcmFjdGlvbk9yTWFyZ2luIHRvIGNvbXBhcmUgdGhlIHZhbHVlcy4KKyAgLy8KKyAgLy8gUkVRVUlSRVM6IGZpZWxkLT5jcHBfdHlwZSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFIG9yCisgIC8vICAgICAgICAgICBmaWVsZC0+Y3BwX3R5cGUgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUCisgIC8vIFJFUVVJUkVTOiBmbG9hdF9jb21wYXJpc29uXyA9PSBBUFBST1hJTUFURQorICB2b2lkIFNldEZyYWN0aW9uQW5kTWFyZ2luKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGRvdWJsZSBmcmFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWFyZ2luKTsKKworICAvLyBTZXRzIHRoZSBmcmFjdGlvbiBhbmQgbWFyZ2luIGZvciB0aGUgZmxvYXQgY29tcGFyaXNvbiBvZiBhbGwgZmxvYXQgYW5kCisgIC8vIGRvdWJsZSBmaWVsZHMsIHVubGVzcyBhIGZpZWxkIGhhcyBiZWVuIGdpdmVuIGEgc3BlY2lmaWMgc2V0dGluZyB2aWEKKyAgLy8gU2V0RnJhY3Rpb25BbmRNYXJnaW4oKSBhYm92ZS4KKyAgLy8gVXNlcyBNYXRoVXRpbDo6V2l0aGluRnJhY3Rpb25Pck1hcmdpbiB0byBjb21wYXJlIHRoZSB2YWx1ZXMuCisgIC8vCisgIC8vIFJFUVVJUkVTOiBmbG9hdF9jb21wYXJpc29uXyA9PSBBUFBST1hJTUFURQorICB2b2lkIFNldERlZmF1bHRGcmFjdGlvbkFuZE1hcmdpbihkb3VibGUgZnJhY3Rpb24sIGRvdWJsZSBtYXJnaW4pOworCisgcHJvdGVjdGVkOgorICAvLyBSZXR1cm5zIHRoZSBjb21wYXJpc29uIHJlc3VsdCBmb3IgdGhlIGdpdmVuIGZpZWxkIGluIHR3byBtZXNzYWdlcy4KKyAgLy8KKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZGlyZWN0bHkgYnkgRGVmYXVsdEZpZWxkQ29tcGFyYXRvcjo6Q29tcGFyZS4KKyAgLy8gU3ViY2xhc3NlcyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGNvbXBhcmUgZmllbGRzIHRoZXkgZG8gbm90IG5lZWQgdG8KKyAgLy8gaGFuZGxlIHNwZWNpYWxseS4KKyAgQ29tcGFyaXNvblJlc3VsdCBTaW1wbGVDb21wYXJlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2VfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2VfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1dGlsOjpGaWVsZENvbnRleHQqIGZpZWxkX2NvbnRleHQpOworCisgIC8vIENvbXBhcmUgdXNpbmcgdGhlIHByb3ZpZGVkIG1lc3NhZ2VfZGlmZmVyZW5jZXIuIEZvciBleGFtcGxlLCBhIHN1YmNsYXNzIGNhbgorICAvLyB1c2UgdGhpcyBtZXRob2QgdG8gY29tcGFyZSBzb21lIGZpZWxkIGluIGEgY2VydGFpbiB3YXkgdXNpbmcgdGhlIHNhbWUKKyAgLy8gbWVzc2FnZV9kaWZmZXJlbmNlciBpbnN0YW5jZSBhbmQgdGhlIGZpZWxkIGNvbnRleHQuCisgIGJvb2wgQ29tcGFyZVdpdGhEaWZmZXJlbmNlcihNZXNzYWdlRGlmZmVyZW5jZXIqIGRpZmZlcmVuY2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXRpbDo6RmllbGRDb250ZXh0KiBmaWVsZF9jb250ZXh0KTsKKworICAvLyBSZXR1cm5zIEZpZWxkQ29tcGFyYXRvcjo6U0FNRSBpZiBib29sZWFuX3Jlc3VsdCBpcyB0cnVlIGFuZAorICAvLyBGaWVsZENvbXBhcmF0b3I6OkRJRkZFUkVOVCBvdGhlcndpc2UuCisgIENvbXBhcmlzb25SZXN1bHQgUmVzdWx0RnJvbUJvb2xlYW4oYm9vbCBib29sZWFuX3Jlc3VsdCkgY29uc3Q7CisKKyBwcml2YXRlOgorICAvLyBEZWZpbmVzIHRoZSB0b2xlcmFuY2UgZm9yIGZsb2F0aW5nIHBvaW50IGNvbXBhcmlzb24gKGZyYWN0aW9uIGFuZCBtYXJnaW4pLgorICBzdHJ1Y3QgVG9sZXJhbmNlIHsKKyAgICBkb3VibGUgZnJhY3Rpb247CisgICAgZG91YmxlIG1hcmdpbjsKKyAgICBUb2xlcmFuY2UoKSA6IGZyYWN0aW9uKDAuMCksIG1hcmdpbigwLjApIHt9CisgICAgVG9sZXJhbmNlKGRvdWJsZSBmLCBkb3VibGUgbSkgOiBmcmFjdGlvbihmKSwgbWFyZ2luKG0pIHt9CisgIH07CisKKyAgLy8gRGVmaW5lcyB0aGUgbWFwIHRvIHN0b3JlIHRoZSB0b2xlcmFuY2VzIGZvciBmbG9hdGluZyBwb2ludCBjb21wYXJpc29uLgorICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IEZpZWxkRGVzY3JpcHRvciosIFRvbGVyYW5jZT4gVG9sZXJhbmNlTWFwOworCisgIGZyaWVuZCBjbGFzcyBNZXNzYWdlRGlmZmVyZW5jZXI7CisgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBnZXQgZXhlY3V0ZWQgd2hlbiBDb21wYXJlRmllbGRzIGlzIGNhbGxlZCBmb3IgdGhlCisgIC8vIGJhc2ljIHR5cGVzIChpbnN0ZWFkIG9mIHN1Ym1lc3NhZ2VzKS4gVGhleSByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLiBPbmUKKyAgLy8gY2FuIHVzZSBSZXN1bHRGcm9tQm9vbGVhbigpIHRvIGNvbnZlcnQgdGhhdCBib29sZWFuIHRvIGEgQ29tcGFyaXNvblJlc3VsdAorICAvLyB2YWx1ZS4KKyAgYm9vbCBDb21wYXJlQm9vbChjb25zdCBGaWVsZERlc2NyaXB0b3ImIC8qIHVudXNlZCAqLywgYm9vbCB2YWx1ZV8xLAorICAgICAgICAgICAgICAgICAgIGJvb2wgdmFsdWVfMikgeworICAgIHJldHVybiB2YWx1ZV8xID09IHZhbHVlXzI7CisgIH0KKworICAvLyBVc2VzIENvbXBhcmVEb3VibGVPckZsb2F0LCBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IGJvdGggQ29tcGFyZURvdWJsZSBhbmQKKyAgLy8gQ29tcGFyZUZsb2F0LgorICBib29sIENvbXBhcmVEb3VibGUoY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCwgZG91YmxlIHZhbHVlXzEsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWVfMik7CisKKyAgYm9vbCBDb21wYXJlRW51bShjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlXzEsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWVfMik7CisKKyAgLy8gVXNlcyBDb21wYXJlRG91YmxlT3JGbG9hdCwgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBib3RoIENvbXBhcmVEb3VibGUgYW5kCisgIC8vIENvbXBhcmVGbG9hdC4KKyAgYm9vbCBDb21wYXJlRmxvYXQoY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCwgZmxvYXQgdmFsdWVfMSwgZmxvYXQgdmFsdWVfMik7CisKKyAgYm9vbCBDb21wYXJlSW50MzIoY29uc3QgRmllbGREZXNjcmlwdG9yJiAvKiB1bnVzZWQgKi8sIGludDMyX3QgdmFsdWVfMSwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZV8yKSB7CisgICAgcmV0dXJuIHZhbHVlXzEgPT0gdmFsdWVfMjsKKyAgfQorCisgIGJvb2wgQ29tcGFyZUludDY0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgLyogdW51c2VkICovLCBpbnQ2NF90IHZhbHVlXzEsCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWVfMikgeworICAgIHJldHVybiB2YWx1ZV8xID09IHZhbHVlXzI7CisgIH0KKworICBib29sIENvbXBhcmVTdHJpbmcoY29uc3QgRmllbGREZXNjcmlwdG9yJiAvKiB1bnVzZWQgKi8sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWVfMSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlXzIpIHsKKyAgICByZXR1cm4gdmFsdWVfMSA9PSB2YWx1ZV8yOworICB9CisKKyAgYm9vbCBDb21wYXJlVUludDMyKGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgLyogdW51c2VkICovLCB1aW50MzJfdCB2YWx1ZV8xLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVfMikgeworICAgIHJldHVybiB2YWx1ZV8xID09IHZhbHVlXzI7CisgIH0KKworICBib29sIENvbXBhcmVVSW50NjQoY29uc3QgRmllbGREZXNjcmlwdG9yJiAvKiB1bnVzZWQgKi8sIHVpbnQ2NF90IHZhbHVlXzEsCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZV8yKSB7CisgICAgcmV0dXJuIHZhbHVlXzEgPT0gdmFsdWVfMjsKKyAgfQorCisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBDb21wYXJlRG91YmxlIGFuZCBDb21wYXJlRmxvYXQgdG8gYXZvaWQgY29kZQorICAvLyBkdXBsaWNhdGlvbi4gVGhlcmUgYXJlIG5vIGNoZWNrcyBkb25lIGFnYWluc3QgdHlwZXMgb2YgdGhlIHZhbHVlcyBwYXNzZWQsCisgIC8vIGJ1dCBpdCdzIGxpa2VseSB0byBmYWlsIGlmIHBhc3NlZCBub24tbnVtZXJpYyBhcmd1bWVudHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBib29sIENvbXBhcmVEb3VibGVPckZsb2F0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQsIFQgdmFsdWVfMSwgVCB2YWx1ZV8yKTsKKworICBGbG9hdENvbXBhcmlzb24gZmxvYXRfY29tcGFyaXNvbl87CisKKyAgLy8gSWYgdHJ1ZSwgZmxvYXRzIGFuZCBkb3VibGVzIHRoYXQgYXJlIGJvdGggTmFOIGFyZSBjb25zaWRlcmVkIHRvIGJlCisgIC8vIGVxdWFsLiBPdGhlcndpc2UsIHR3byBmbG9hdHMgb3IgZG91YmxlcyB0aGF0IGFyZSBOYU4gYXJlIGNvbnNpZGVyZWQgdG8gYmUKKyAgLy8gZGlmZmVyZW50LgorICBib29sIHRyZWF0X25hbl9hc19lcXVhbF87CisKKyAgLy8gVHJ1ZSBpZmYgZGVmYXVsdF90b2xlcmFuY2VfIGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0LgorICAvLworICAvLyBJZiBmYWxzZSwgdGhlbiB0aGUgZGVmYXVsdCB0b2xlcmFuY2UgZm9yIGZsb2F0cyBhbmQgZG91YmxlcyBpcyB0aGF0IHdoaWNoCisgIC8vIGlzIHVzZWQgYnkgTWF0aFV0aWw6OkFsbW9zdEVxdWFscygpLgorICBib29sIGhhc19kZWZhdWx0X3RvbGVyYW5jZV87CisKKyAgLy8gRGVmYXVsdCBmbG9hdC9kb3VibGUgdG9sZXJhbmNlLiBPbmx5IG1lYW5pbmdmdWwgaWYKKyAgLy8gaGFzX2RlZmF1bHRfdG9sZXJhbmNlXyA9PSB0cnVlLgorICBUb2xlcmFuY2UgZGVmYXVsdF90b2xlcmFuY2VfOworCisgIC8vIEZpZWxkLXNwZWNpZmljIGZsb2F0L2RvdWJsZSB0b2xlcmFuY2VzLCB3aGljaCBvdmVycmlkZSBhbnkgZGVmYXVsdCBmb3IKKyAgLy8gdGhvc2UgcGFydGljdWxhciBmaWVsZHMuCisgIFRvbGVyYW5jZU1hcCBtYXBfdG9sZXJhbmNlXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ltcGxlRmllbGRDb21wYXJhdG9yKTsKK307CisKKy8vIERlZmF1bHQgZmllbGQgY29tcGFyaXNvbjogdXNlIHRoZSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBGaWVsZENvbXBhcmF0b3IuCisjaWZkZWYgUFJPVE9CVUZfRlVUVVJFX0JSRUFLSU5HX0NIQU5HRVMKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBEZWZhdWx0RmllbGRDb21wYXJhdG9yIGZpbmFsCisgICAgOiBwdWJsaWMgU2ltcGxlRmllbGRDb21wYXJhdG9yCisjZWxzZSAgIC8vIFBST1RPQlVGX0ZVVFVSRV9CUkVBS0lOR19DSEFOR0VTCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRGVmYXVsdEZpZWxkQ29tcGFyYXRvciA6IHB1YmxpYyBTaW1wbGVGaWVsZENvbXBhcmF0b3IKKyNlbmRpZiAgLy8gUFJPVE9CVUZfRlVUVVJFX0JSRUFLSU5HX0NIQU5HRVMKK3sKKyBwdWJsaWM6CisgIENvbXBhcmlzb25SZXN1bHQgQ29tcGFyZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlXzEsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2VfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1dGlsOjpGaWVsZENvbnRleHQqIGZpZWxkX2NvbnRleHQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gU2ltcGxlQ29tcGFyZShtZXNzYWdlXzEsIG1lc3NhZ2VfMiwgZmllbGQsIGluZGV4XzEsIGluZGV4XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfY29udGV4dCk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9GSUVMRF9DT01QQVJBVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX2NvbXBhcmF0b3JfdGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4MDI3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yX3Rlc3QuY2MKQEAgLTAsMCArMSw1MDUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtzcm9rYUBnb29nbGUuY29tIChLcnp5c3p0b2YgU3Jva2EpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmg+CisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hdGh1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSB7CisKK3VzaW5nIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM7CisKK2NsYXNzIERlZmF1bHRGaWVsZENvbXBhcmF0b3JUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBkZXNjcmlwdG9yXyA9IFRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpOyB9CisKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIERlZmF1bHRGaWVsZENvbXBhcmF0b3IgY29tcGFyYXRvcl87CisgIFRlc3RBbGxUeXBlcyBtZXNzYWdlXzFfOworICBUZXN0QWxsVHlwZXMgbWVzc2FnZV8yXzsKK307CisKK1RFU1RfRihEZWZhdWx0RmllbGRDb21wYXJhdG9yVGVzdCwgUmVjdXJzZXNJbnRvR3JvdXApIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsZ3JvdXAiKTsKKyAgRVhQRUNUX0VRKAorICAgICAgRmllbGRDb21wYXJhdG9yOjpSRUNVUlNFLAorICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZCwgLTEsIC0xLCBudWxscHRyKSk7Cit9CisKK1RFU1RfRihEZWZhdWx0RmllbGRDb21wYXJhdG9yVGVzdCwgUmVjdXJzZXNJbnRvTmVzdGVkTWVzc2FnZSkgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KKyAgICAgIGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIik7CisgIEVYUEVDVF9FUSgKKyAgICAgIEZpZWxkQ29tcGFyYXRvcjo6UkVDVVJTRSwKKyAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGQsIC0xLCAtMSwgbnVsbHB0cikpOworfQorCitURVNUX0YoRGVmYXVsdEZpZWxkQ29tcGFyYXRvclRlc3QsIFJlY3Vyc2VzSW50b0ZvcmVpZ25NZXNzYWdlKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPQorICAgICAgZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIik7CisgIEVYUEVDVF9FUSgKKyAgICAgIEZpZWxkQ29tcGFyYXRvcjo6UkVDVVJTRSwKKyAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGQsIC0xLCAtMSwgbnVsbHB0cikpOworfQorCitURVNUX0YoRGVmYXVsdEZpZWxkQ29tcGFyYXRvclRlc3QsIEludDMyQ29tcGFyaXNvbikgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50MzIiKTsKKyAgbWVzc2FnZV8xXy5zZXRfb3B0aW9uYWxfaW50MzIoMSk7CisgIG1lc3NhZ2VfMl8uc2V0X29wdGlvbmFsX2ludDMyKDEpOworCisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OlNBTUUsIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCwgLTEsIC0xLCBudWxscHRyKSk7CisKKyAgbWVzc2FnZV8yXy5zZXRfb3B0aW9uYWxfaW50MzIoLTEpOworICBFWFBFQ1RfRVEoCisgICAgICBGaWVsZENvbXBhcmF0b3I6OkRJRkZFUkVOVCwKKyAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGQsIC0xLCAtMSwgbnVsbHB0cikpOworfQorCitURVNUX0YoRGVmYXVsdEZpZWxkQ29tcGFyYXRvclRlc3QsIEludDY0Q29tcGFyaXNvbikgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50NjQiKTsKKyAgbWVzc2FnZV8xXy5zZXRfb3B0aW9uYWxfaW50NjQoMUwpOworICBtZXNzYWdlXzJfLnNldF9vcHRpb25hbF9pbnQ2NCgxTCk7CisKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6U0FNRSwgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLCAtMSwgLTEsIG51bGxwdHIpKTsKKworICBtZXNzYWdlXzJfLnNldF9vcHRpb25hbF9pbnQ2NCgtMUwpOworICBFWFBFQ1RfRVEoCisgICAgICBGaWVsZENvbXBhcmF0b3I6OkRJRkZFUkVOVCwKKyAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGQsIC0xLCAtMSwgbnVsbHB0cikpOworfQorCitURVNUX0YoRGVmYXVsdEZpZWxkQ29tcGFyYXRvclRlc3QsIFVJbnQzMkNvbXBhcmlzb24pIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9CisgICAgICBkZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF91aW50MzIiKTsKKyAgbWVzc2FnZV8xXy5zZXRfb3B0aW9uYWxfdWludDMyKDEpOworICBtZXNzYWdlXzJfLnNldF9vcHRpb25hbF91aW50MzIoMSk7CisKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6U0FNRSwgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLCAtMSwgLTEsIG51bGxwdHIpKTsKKworICBtZXNzYWdlXzJfLnNldF9vcHRpb25hbF91aW50MzIoMik7CisgIEVYUEVDVF9FUSgKKyAgICAgIEZpZWxkQ29tcGFyYXRvcjo6RElGRkVSRU5ULAorICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZCwgLTEsIC0xLCBudWxscHRyKSk7Cit9CisKK1RFU1RfRihEZWZhdWx0RmllbGRDb21wYXJhdG9yVGVzdCwgVUludDY0Q29tcGFyaXNvbikgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KKyAgICAgIGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX3VpbnQ2NCIpOworICBtZXNzYWdlXzFfLnNldF9vcHRpb25hbF91aW50NjQoMUwpOworICBtZXNzYWdlXzJfLnNldF9vcHRpb25hbF91aW50NjQoMUwpOworCisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OlNBTUUsIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCwgLTEsIC0xLCBudWxscHRyKSk7CisKKyAgbWVzc2FnZV8yXy5zZXRfb3B0aW9uYWxfdWludDY0KDJMKTsKKyAgRVhQRUNUX0VRKAorICAgICAgRmllbGRDb21wYXJhdG9yOjpESUZGRVJFTlQsCisgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkLCAtMSwgLTEsIG51bGxwdHIpKTsKK30KKworVEVTVF9GKERlZmF1bHRGaWVsZENvbXBhcmF0b3JUZXN0LCBCb29sZWFuQ29tcGFyaXNvbikgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfYm9vbCIpOworICBtZXNzYWdlXzFfLnNldF9vcHRpb25hbF9ib29sKHRydWUpOworICBtZXNzYWdlXzJfLnNldF9vcHRpb25hbF9ib29sKHRydWUpOworCisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OlNBTUUsIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCwgLTEsIC0xLCBudWxscHRyKSk7CisKKyAgbWVzc2FnZV8yXy5zZXRfb3B0aW9uYWxfYm9vbChmYWxzZSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIEZpZWxkQ29tcGFyYXRvcjo6RElGRkVSRU5ULAorICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZCwgLTEsIC0xLCBudWxscHRyKSk7Cit9CisKK1RFU1RfRihEZWZhdWx0RmllbGRDb21wYXJhdG9yVGVzdCwgRW51bUNvbXBhcmlzb24pIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9CisgICAgICBkZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIpOworICBtZXNzYWdlXzFfLnNldF9vcHRpb25hbF9uZXN0ZWRfZW51bShUZXN0QWxsVHlwZXM6OkJBUik7CisgIG1lc3NhZ2VfMl8uc2V0X29wdGlvbmFsX25lc3RlZF9lbnVtKFRlc3RBbGxUeXBlczo6QkFSKTsKKworICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpTQU1FLCBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQsIC0xLCAtMSwgbnVsbHB0cikpOworCisgIG1lc3NhZ2VfMl8uc2V0X29wdGlvbmFsX25lc3RlZF9lbnVtKFRlc3RBbGxUeXBlczo6QkFaKTsKKyAgRVhQRUNUX0VRKAorICAgICAgRmllbGRDb21wYXJhdG9yOjpESUZGRVJFTlQsCisgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkLCAtMSwgLTEsIG51bGxwdHIpKTsKK30KKworVEVTVF9GKERlZmF1bHRGaWVsZENvbXBhcmF0b3JUZXN0LCBTdHJpbmdDb21wYXJpc29uKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPQorICAgICAgZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfc3RyaW5nIik7CisgIG1lc3NhZ2VfMV8uc2V0X29wdGlvbmFsX3N0cmluZygiZm9vIik7CisgIG1lc3NhZ2VfMl8uc2V0X29wdGlvbmFsX3N0cmluZygiZm9vIik7CisKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6U0FNRSwgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLCAtMSwgLTEsIG51bGxwdHIpKTsKKworICBtZXNzYWdlXzJfLnNldF9vcHRpb25hbF9zdHJpbmcoImJhciIpOworICBFWFBFQ1RfRVEoCisgICAgICBGaWVsZENvbXBhcmF0b3I6OkRJRkZFUkVOVCwKKyAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGQsIC0xLCAtMSwgbnVsbHB0cikpOworfQorCitURVNUX0YoRGVmYXVsdEZpZWxkQ29tcGFyYXRvclRlc3QsIEZsb2F0aW5nUG9pbnRDb21wYXJpc29uRXhhY3QpIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9mbG9hdCA9CisgICAgICBkZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9mbG9hdCIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2RvdWJsZSA9CisgICAgICBkZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9kb3VibGUiKTsKKworICBtZXNzYWdlXzFfLnNldF9vcHRpb25hbF9mbG9hdCgwLjFmKTsKKyAgbWVzc2FnZV8yXy5zZXRfb3B0aW9uYWxfZmxvYXQoMC4xZik7CisgIG1lc3NhZ2VfMV8uc2V0X29wdGlvbmFsX2RvdWJsZSgwLjEpOworICBtZXNzYWdlXzJfLnNldF9vcHRpb25hbF9kb3VibGUoMC4xKTsKKworICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpTQU1FLAorICAgICAgICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZF9mbG9hdCwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OlNBTUUsCisgICAgICAgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkX2RvdWJsZSwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisKKyAgbWVzc2FnZV8yXy5zZXRfb3B0aW9uYWxfZmxvYXQoMC4yZik7CisgIG1lc3NhZ2VfMl8uc2V0X29wdGlvbmFsX2RvdWJsZSgwLjIpOworCisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OkRJRkZFUkVOVCwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZmxvYXQsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOworICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpESUZGRVJFTlQsCisgICAgICAgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkX2RvdWJsZSwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7Cit9CisKK1RFU1RfRihEZWZhdWx0RmllbGRDb21wYXJhdG9yVGVzdCwgRmxvYXRpbmdQb2ludENvbXBhcmlzb25BcHByb3hpbWF0ZSkgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Zsb2F0ID0KKyAgICAgIGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2Zsb2F0Iik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZG91YmxlID0KKyAgICAgIGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2RvdWJsZSIpOworCisgIG1lc3NhZ2VfMV8uc2V0X29wdGlvbmFsX2Zsb2F0KDIuMzAwMDA1Zik7CisgIG1lc3NhZ2VfMl8uc2V0X29wdGlvbmFsX2Zsb2F0KDIuMzAwMDA2Zik7CisgIG1lc3NhZ2VfMV8uc2V0X29wdGlvbmFsX2RvdWJsZSgyLjMwMDAwMDAwMDAwMDAwMDMpOworICBtZXNzYWdlXzJfLnNldF9vcHRpb25hbF9kb3VibGUoMi4zMDAwMDAwMDAwMDAwMDA3KTsKKworICAvLyBBcHByb3hpbWF0ZSBjb21wYXJpc29uIGRlcGVuZHMgb24gTWF0aFV0aWwsIHNvIHdlIGFzc2VydCBvbiBNYXRoVXRpbAorICAvLyByZXN1bHRzIGZpcnN0IHRvIGNoZWNrIGlmIHRoYXQncyB3aGVyZSB0aGUgZmFpbHVyZSB3YXMgaW50cm9kdWNlZC4KKyAgQVNTRVJUX05FKG1lc3NhZ2VfMV8ub3B0aW9uYWxfZmxvYXQoKSwgbWVzc2FnZV8yXy5vcHRpb25hbF9mbG9hdCgpKTsKKyAgQVNTRVJUX05FKG1lc3NhZ2VfMV8ub3B0aW9uYWxfZG91YmxlKCksIG1lc3NhZ2VfMl8ub3B0aW9uYWxfZG91YmxlKCkpOworICBBU1NFUlRfVFJVRShNYXRoVXRpbDo6QWxtb3N0RXF1YWxzKG1lc3NhZ2VfMV8ub3B0aW9uYWxfZmxvYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlXzJfLm9wdGlvbmFsX2Zsb2F0KCkpKTsKKyAgQVNTRVJUX1RSVUUoTWF0aFV0aWw6OkFsbW9zdEVxdWFscyhtZXNzYWdlXzFfLm9wdGlvbmFsX2RvdWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfMl8ub3B0aW9uYWxfZG91YmxlKCkpKTsKKworICAvLyBEZWZhdWx0RmllbGRDb21wYXJhdG9yJ3MgZGVmYXVsdCBmbG9hdCBjb21wYXJpc29uIG1vZGUgaXMgRVhBQ1QuCisgIEFTU0VSVF9FUShEZWZhdWx0RmllbGRDb21wYXJhdG9yOjpFWEFDVCwgY29tcGFyYXRvcl8uZmxvYXRfY29tcGFyaXNvbigpKTsKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6RElGRkVSRU5ULAorICAgICAgICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZF9mbG9hdCwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OkRJRkZFUkVOVCwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZG91YmxlLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKKworICBjb21wYXJhdG9yXy5zZXRfZmxvYXRfY29tcGFyaXNvbihEZWZhdWx0RmllbGRDb21wYXJhdG9yOjpBUFBST1hJTUFURSk7CisKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6U0FNRSwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZmxvYXQsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOworICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpTQU1FLAorICAgICAgICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZF9kb3VibGUsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOworfQorCitURVNUX0YoRGVmYXVsdEZpZWxkQ29tcGFyYXRvclRlc3QsIEZsb2F0aW5nUG9pbnRDb21wYXJpc29uVHJlYXROYU5zQXNFcXVhbCkgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Zsb2F0ID0KKyAgICAgIGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2Zsb2F0Iik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZG91YmxlID0KKyAgICAgIGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2RvdWJsZSIpOworCisgIG1lc3NhZ2VfMV8uc2V0X29wdGlvbmFsX2Zsb2F0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpxdWlldF9OYU4oKSk7CisgIG1lc3NhZ2VfMl8uc2V0X29wdGlvbmFsX2Zsb2F0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpxdWlldF9OYU4oKSk7CisgIG1lc3NhZ2VfMV8uc2V0X29wdGlvbmFsX2RvdWJsZShzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OnF1aWV0X05hTigpKTsKKyAgbWVzc2FnZV8yXy5zZXRfb3B0aW9uYWxfZG91YmxlKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCkpOworCisgIC8vIERlZmF1bHRGaWVsZENvbXBhcmF0b3IncyBkZWZhdWx0IGZsb2F0IGNvbXBhcmlzb24gbW9kZSBpcyBFWEFDVCB3aXRoCisgIC8vIHRyZWF0aW5nIE5hTnMgYXMgZGlmZmVyZW50LgorICBBU1NFUlRfRVEoRGVmYXVsdEZpZWxkQ29tcGFyYXRvcjo6RVhBQ1QsIGNvbXBhcmF0b3JfLmZsb2F0X2NvbXBhcmlzb24oKSk7CisgIEFTU0VSVF9FUShmYWxzZSwgY29tcGFyYXRvcl8udHJlYXRfbmFuX2FzX2VxdWFsKCkpOworICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpESUZGRVJFTlQsCisgICAgICAgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkX2Zsb2F0LCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6RElGRkVSRU5ULAorICAgICAgICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZF9kb3VibGUsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOworICBjb21wYXJhdG9yXy5zZXRfZmxvYXRfY29tcGFyaXNvbihEZWZhdWx0RmllbGRDb21wYXJhdG9yOjpBUFBST1hJTUFURSk7CisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OkRJRkZFUkVOVCwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZmxvYXQsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOworICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpESUZGRVJFTlQsCisgICAgICAgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkX2RvdWJsZSwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisKKyAgY29tcGFyYXRvcl8uc2V0X3RyZWF0X25hbl9hc19lcXVhbCh0cnVlKTsKKyAgQVNTRVJUX0VRKHRydWUsIGNvbXBhcmF0b3JfLnRyZWF0X25hbl9hc19lcXVhbCgpKTsKKyAgY29tcGFyYXRvcl8uc2V0X2Zsb2F0X2NvbXBhcmlzb24oRGVmYXVsdEZpZWxkQ29tcGFyYXRvcjo6RVhBQ1QpOworICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpTQU1FLAorICAgICAgICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZF9mbG9hdCwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OlNBTUUsCisgICAgICAgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkX2RvdWJsZSwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisgIGNvbXBhcmF0b3JfLnNldF9mbG9hdF9jb21wYXJpc29uKERlZmF1bHRGaWVsZENvbXBhcmF0b3I6OkFQUFJPWElNQVRFKTsKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6U0FNRSwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZmxvYXQsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOworICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpTQU1FLAorICAgICAgICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZF9kb3VibGUsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOworfQorCitURVNUX0YoRGVmYXVsdEZpZWxkQ29tcGFyYXRvclRlc3QsCisgICAgICAgRmxvYXRpbmdQb2ludENvbXBhcmlzb25XaXRoaW5GcmFjdGlvbk9yTWFyZ2luKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZmxvYXQgPQorICAgICAgZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfZmxvYXQiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kb3VibGUgPQorICAgICAgZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfZG91YmxlIik7CisKKyAgbWVzc2FnZV8xXy5zZXRfb3B0aW9uYWxfZmxvYXQoMTAwLjBmKTsKKyAgbWVzc2FnZV8yXy5zZXRfb3B0aW9uYWxfZmxvYXQoMTA5LjlmKTsKKyAgbWVzc2FnZV8xXy5zZXRfb3B0aW9uYWxfZG91YmxlKDEwMC4wKTsKKyAgbWVzc2FnZV8yXy5zZXRfb3B0aW9uYWxfZG91YmxlKDEwOS45KTsKKworICBjb21wYXJhdG9yXy5zZXRfZmxvYXRfY29tcGFyaXNvbihEZWZhdWx0RmllbGRDb21wYXJhdG9yOjpBUFBST1hJTUFURSk7CisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OkRJRkZFUkVOVCwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZmxvYXQsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOworICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpESUZGRVJFTlQsCisgICAgICAgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkX2RvdWJsZSwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisKKyAgLy8gU2hvdWxkIGZhaWwgc2luY2UgdGhlIGZyYWN0aW9uIGlzIHRvbyBsb3cuCisgIGNvbXBhcmF0b3JfLlNldEZyYWN0aW9uQW5kTWFyZ2luKGZpZWxkX2Zsb2F0LCAwLjAxLCAwLjApOworICBjb21wYXJhdG9yXy5TZXRGcmFjdGlvbkFuZE1hcmdpbihmaWVsZF9kb3VibGUsIDAuMDEsIDAuMCk7CisKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6RElGRkVSRU5ULAorICAgICAgICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZF9mbG9hdCwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OkRJRkZFUkVOVCwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZG91YmxlLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKKworICAvLyBTaG91bGQgZmFpbCBzaW5jZSB0aGUgbWFyZ2luIGlzIHRvbyBsb3cuCisgIGNvbXBhcmF0b3JfLlNldEZyYWN0aW9uQW5kTWFyZ2luKGZpZWxkX2Zsb2F0LCAwLjAsIDkuMCk7CisgIGNvbXBhcmF0b3JfLlNldEZyYWN0aW9uQW5kTWFyZ2luKGZpZWxkX2RvdWJsZSwgMC4wLCA5LjApOworICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpESUZGRVJFTlQsCisgICAgICAgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkX2Zsb2F0LCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6RElGRkVSRU5ULAorICAgICAgICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZF9kb3VibGUsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOworCisgIC8vIFNob3VsZCBzdWNjZWVkIHNpbmNlIHRoZSBmcmFjdGlvbiBpcyBoaWdoIGVub3VnaC4KKyAgY29tcGFyYXRvcl8uU2V0RnJhY3Rpb25BbmRNYXJnaW4oZmllbGRfZmxvYXQsIDAuMiwgMC4wKTsKKyAgY29tcGFyYXRvcl8uU2V0RnJhY3Rpb25BbmRNYXJnaW4oZmllbGRfZG91YmxlLCAwLjIsIDAuMCk7CisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OlNBTUUsCisgICAgICAgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkX2Zsb2F0LCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6U0FNRSwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZG91YmxlLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKKworICAvLyBTaG91bGQgc3VjY2VlZCBzaW5jZSB0aGUgbWFyZ2luIGlzIGhpZ2ggZW5vdWdoLgorICBjb21wYXJhdG9yXy5TZXRGcmFjdGlvbkFuZE1hcmdpbihmaWVsZF9mbG9hdCwgMC4wLCAxMC4wKTsKKyAgY29tcGFyYXRvcl8uU2V0RnJhY3Rpb25BbmRNYXJnaW4oZmllbGRfZG91YmxlLCAwLjAsIDEwLjApOworICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpTQU1FLAorICAgICAgICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZF9mbG9hdCwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OlNBTUUsCisgICAgICAgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkX2RvdWJsZSwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisKKyAgLy8gU2V0dGluZyB2YWx1ZXMgZm9yIG9uZSBvZiB0aGUgZmllbGRzIHNob3VsZCBub3QgYWZmZWN0IHRoZSBvdGhlci4KKyAgY29tcGFyYXRvcl8uU2V0RnJhY3Rpb25BbmRNYXJnaW4oZmllbGRfZG91YmxlLCAwLjAsIDAuMCk7CisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OlNBTUUsCisgICAgICAgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkX2Zsb2F0LCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6RElGRkVSRU5ULAorICAgICAgICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZF9kb3VibGUsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOworCisgIC8vICtpbmYgc2hvdWxkIGJlIGVxdWFsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG5vdCB0ZWNobmljYWxseSB3aXRoaW4gbWFyZ2luIG9yCisgIC8vIGZyYWN0aW9uLgorICBtZXNzYWdlXzFfLnNldF9vcHRpb25hbF9mbG9hdChzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSk7CisgIG1lc3NhZ2VfMl8uc2V0X29wdGlvbmFsX2Zsb2F0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKTsKKyAgbWVzc2FnZV8xXy5zZXRfb3B0aW9uYWxfZG91YmxlKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7CisgIG1lc3NhZ2VfMl8uc2V0X29wdGlvbmFsX2RvdWJsZShzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpOworICBjb21wYXJhdG9yXy5TZXRGcmFjdGlvbkFuZE1hcmdpbihmaWVsZF9mbG9hdCwgMC4wLCAwLjApOworICBjb21wYXJhdG9yXy5TZXRGcmFjdGlvbkFuZE1hcmdpbihmaWVsZF9kb3VibGUsIDAuMCwgMC4wKTsKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6U0FNRSwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZmxvYXQsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOworICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpTQU1FLAorICAgICAgICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZF9kb3VibGUsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOworCisgIC8vIC1pbmYgc2hvdWxkIGJlIGVxdWFsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG5vdCB0ZWNobmljYWxseSB3aXRoaW4gbWFyZ2luIG9yCisgIC8vIGZyYWN0aW9uLgorICBtZXNzYWdlXzFfLnNldF9vcHRpb25hbF9mbG9hdCgtc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkpOworICBtZXNzYWdlXzJfLnNldF9vcHRpb25hbF9mbG9hdCgtc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkpOworICBtZXNzYWdlXzFfLnNldF9vcHRpb25hbF9kb3VibGUoLXN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7CisgIG1lc3NhZ2VfMl8uc2V0X29wdGlvbmFsX2RvdWJsZSgtc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKTsKKyAgY29tcGFyYXRvcl8uU2V0RnJhY3Rpb25BbmRNYXJnaW4oZmllbGRfZmxvYXQsIDAuMCwgMC4wKTsKKyAgY29tcGFyYXRvcl8uU2V0RnJhY3Rpb25BbmRNYXJnaW4oZmllbGRfZG91YmxlLCAwLjAsIDAuMCk7CisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OlNBTUUsCisgICAgICAgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkX2Zsb2F0LCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6U0FNRSwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZG91YmxlLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKKworICAvLyBGaW5pdGUgdmFsdWVzIGFuZCBpbmYgc2hvdWxkIG5vdCBiZSBlcXVhbCwgZXZlbiBmb3IgYSBwb3NpdGl2ZSBmcmFjdGlvbi4KKyAgbWVzc2FnZV8xXy5zZXRfb3B0aW9uYWxfZmxvYXQoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkpOworICBtZXNzYWdlXzJfLnNldF9vcHRpb25hbF9mbG9hdCgwLjBmKTsKKyAgbWVzc2FnZV8xXy5zZXRfb3B0aW9uYWxfZG91YmxlKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7CisgIG1lc3NhZ2VfMl8uc2V0X29wdGlvbmFsX2RvdWJsZSgwLjApOworICBjb21wYXJhdG9yXy5TZXRGcmFjdGlvbkFuZE1hcmdpbihmaWVsZF9mbG9hdCwgMC4xLCAwLjApOworICBjb21wYXJhdG9yXy5TZXRGcmFjdGlvbkFuZE1hcmdpbihmaWVsZF9kb3VibGUsIDAuMSwgMC4wKTsKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6RElGRkVSRU5ULAorICAgICAgICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZF9mbG9hdCwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OkRJRkZFUkVOVCwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZG91YmxlLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKK30KKworVEVTVF9GKERlZmF1bHRGaWVsZENvbXBhcmF0b3JUZXN0LAorICAgICAgIEZsb2F0aW5nUG9pbnRDb21wYXJpc29uV2l0aGluRGVmYXVsdEZyYWN0aW9uT3JNYXJnaW4pIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9mbG9hdCA9CisgICAgICBkZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9mbG9hdCIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2RvdWJsZSA9CisgICAgICBkZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9kb3VibGUiKTsKKworICBtZXNzYWdlXzFfLnNldF9vcHRpb25hbF9mbG9hdCgxMDAuMGYpOworICBtZXNzYWdlXzJfLnNldF9vcHRpb25hbF9mbG9hdCgxMDkuOWYpOworICBtZXNzYWdlXzFfLnNldF9vcHRpb25hbF9kb3VibGUoMTAwLjApOworICBtZXNzYWdlXzJfLnNldF9vcHRpb25hbF9kb3VibGUoMTA5LjkpOworCisgIGNvbXBhcmF0b3JfLnNldF9mbG9hdF9jb21wYXJpc29uKERlZmF1bHRGaWVsZENvbXBhcmF0b3I6OkFQUFJPWElNQVRFKTsKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6RElGRkVSRU5ULAorICAgICAgICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZF9mbG9hdCwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OkRJRkZFUkVOVCwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZG91YmxlLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKKworICAvLyBTZXQgZGVmYXVsdCBmcmFjdGlvbiBhbmQgbWFyZ2luLgorICBjb21wYXJhdG9yXy5TZXREZWZhdWx0RnJhY3Rpb25BbmRNYXJnaW4oMC4wMSwgMC4wKTsKKworICAvLyBGbG9hdCBjb21wYXJpc29ucyBzaG91bGQgZmFpbCBzaW5jZSB0aGUgZnJhY3Rpb24gaXMgdG9vIGxvdy4KKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6RElGRkVSRU5ULAorICAgICAgICAgICAgY29tcGFyYXRvcl8uQ29tcGFyZShtZXNzYWdlXzFfLCBtZXNzYWdlXzJfLCBmaWVsZF9mbG9hdCwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OkRJRkZFUkVOVCwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZG91YmxlLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKKworICAvLyBTZXQgZmllbGQtc3BlY2lmaWMgZnJhY3Rpb24gYW5kIG1hcmdpbiBmb3Igb25lIGZpZWxkIChmaWVsZF9mbG9hdCkgYnV0IG5vdAorICAvLyB0aGUgb3RoZXIgKGZpZWxkX2RvdWJsZSkKKyAgY29tcGFyYXRvcl8uU2V0RnJhY3Rpb25BbmRNYXJnaW4oZmllbGRfZmxvYXQsIDAuMiwgMC4wKTsKKworICAvLyBUaGUgZmllbGQgd2l0aCB0aGUgb3ZlcnJpZGUgc2hvdWxkIHN1Y2NlZWQsIHNpbmNlIGl0cyBmaWVsZC1zcGVjaWZpYworICAvLyBmcmFjdGlvbiBpcyBoaWdoIGVub3VnaC4KKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6U0FNRSwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZmxvYXQsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOworICAvLyBUaGUgZmllbGQgd2l0aCBubyBvdmVycmlkZSBzaG91bGQgZmFpbCwgc2luY2UgdGhlIGRlZmF1bHQgZnJhY3Rpb24gaXMgdG9vCisgIC8vIGxvdworICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpESUZGRVJFTlQsCisgICAgICAgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkX2RvdWJsZSwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisKKyAgLy8gU2V0IHRoZSBkZWZhdWx0IGZyYWN0aW9uIGFuZCBtYXJnaW4gaGlnaCBlbm91Z2ggc28gdGhhdCBmaWVsZHMgdGhhdCB1c2UKKyAgLy8gdGhlIGRlZmF1bHQgc2hvdWxkIHN1Y2NlZWQKKyAgY29tcGFyYXRvcl8uU2V0RGVmYXVsdEZyYWN0aW9uQW5kTWFyZ2luKDAuMiwgMC4wKTsKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6U0FNRSwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZG91YmxlLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKKworICAvLyBUaGUgZmllbGQgd2l0aCBhbiBvdmVycmlkZSBzaG91bGQgc3RpbGwgYmUgT0sKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6U0FNRSwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZmxvYXQsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOworCisgIC8vIFNldCBmcmFjdGlvbiBhbmQgbWFyZ2luIGZvciB0aGUgZmllbGQgd2l0aCBhbiBvdmVycmlkZSB0byBiZSB0b28gbG93CisgIGNvbXBhcmF0b3JfLlNldEZyYWN0aW9uQW5kTWFyZ2luKGZpZWxkX2Zsb2F0LCAwLjAxLCAwLjApOworCisgIC8vIE5vdyBvdXIgZGVmYXVsdCBpcyBoaWdoIGVub3VnaCBidXQgZmllbGRfZmxvYXQncyBvdmVycmlkZSBpcyB0b28gbG93LgorICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpESUZGRVJFTlQsCisgICAgICAgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkX2Zsb2F0LCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6U0FNRSwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGRfZG91YmxlLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKK30KKworLy8gU2ltcGxlIHRlc3QgY2hlY2tpbmcgd2hldGhlciB3ZSBjb21wYXJlIHZhbHVlcyBhdCBjb3JyZWN0IGluZGljZXMuCitURVNUX0YoRGVmYXVsdEZpZWxkQ29tcGFyYXRvclRlc3QsIFJlcGVhdGVkRmllbGRDb21wYXJpc29uKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPQorICAgICAgZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfc3RyaW5nIik7CisKKyAgbWVzc2FnZV8xXy5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJmb28iKTsKKyAgbWVzc2FnZV8xXy5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJiYXIiKTsKKyAgbWVzc2FnZV8yXy5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJiYXIiKTsKKyAgbWVzc2FnZV8yXy5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJiYXoiKTsKKworICBFWFBFQ1RfRVEoRmllbGRDb21wYXJhdG9yOjpESUZGRVJFTlQsCisgICAgICAgICAgICBjb21wYXJhdG9yXy5Db21wYXJlKG1lc3NhZ2VfMV8sIG1lc3NhZ2VfMl8sIGZpZWxkLCAwLCAwLCBudWxscHRyKSk7CisgIEVYUEVDVF9FUShGaWVsZENvbXBhcmF0b3I6OkRJRkZFUkVOVCwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGQsIDEsIDEsIG51bGxwdHIpKTsKKyAgRVhQRUNUX0VRKEZpZWxkQ29tcGFyYXRvcjo6U0FNRSwKKyAgICAgICAgICAgIGNvbXBhcmF0b3JfLkNvbXBhcmUobWVzc2FnZV8xXywgbWVzc2FnZV8yXywgZmllbGQsIDEsIDAsIG51bGxwdHIpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDBlNTkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbC5jYwpAQCAtMCwwICsxLDcyMCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWwuaD4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CisKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkTWFzazsKKworc3RkOjpzdHJpbmcgRmllbGRNYXNrVXRpbDo6VG9TdHJpbmcoY29uc3QgRmllbGRNYXNrJiBtYXNrKSB7CisgIHJldHVybiBKb2luKG1hc2sucGF0aHMoKSwgIiwiKTsKK30KKwordm9pZCBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKFN0cmluZ1BpZWNlIHN0ciwgRmllbGRNYXNrKiBvdXQpIHsKKyAgb3V0LT5DbGVhcigpOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGF0aHMgPSBTcGxpdChzdHIsICIsIik7CisgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGggOiBwYXRocykgeworICAgIGlmIChwYXRoLmVtcHR5KCkpIGNvbnRpbnVlOworICAgIG91dC0+YWRkX3BhdGhzKHBhdGgpOworICB9Cit9CisKK2Jvb2wgRmllbGRNYXNrVXRpbDo6U25ha2VDYXNlVG9DYW1lbENhc2UoU3RyaW5nUGllY2UgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5jbGVhcigpOworICBib29sIGFmdGVyX3VuZGVyc2NvcmUgPSBmYWxzZTsKKyAgZm9yIChjaGFyIGlucHV0X2NoYXIgOiBpbnB1dCkgeworICAgIGlmIChpbnB1dF9jaGFyID49ICdBJyAmJiBpbnB1dF9jaGFyIDw9ICdaJykgeworICAgICAgLy8gVGhlIGZpZWxkIG5hbWUgbXVzdCBub3QgY29udGFpbiB1cHBlcmNhc2UgbGV0dGVycy4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGFmdGVyX3VuZGVyc2NvcmUpIHsKKyAgICAgIGlmIChpbnB1dF9jaGFyID49ICdhJyAmJiBpbnB1dF9jaGFyIDw9ICd6JykgeworICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhpbnB1dF9jaGFyICsgJ0EnIC0gJ2EnKTsKKyAgICAgICAgYWZ0ZXJfdW5kZXJzY29yZSA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIGNoYXJhY3RlciBhZnRlciBhICJfIiBtdXN0IGJlIGEgbG93ZXJjYXNlIGxldHRlci4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoaW5wdXRfY2hhciA9PSAnXycpIHsKKyAgICAgIGFmdGVyX3VuZGVyc2NvcmUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBvdXRwdXQtPnB1c2hfYmFjayhpbnB1dF9jaGFyKTsKKyAgICB9CisgIH0KKyAgaWYgKGFmdGVyX3VuZGVyc2NvcmUpIHsKKyAgICAvLyBUcmFpbGluZyAiXyIuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIEZpZWxkTWFza1V0aWw6OkNhbWVsQ2FzZVRvU25ha2VDYXNlKFN0cmluZ1BpZWNlIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0cHV0KSB7CisgIG91dHB1dC0+Y2xlYXIoKTsKKyAgZm9yIChjb25zdCBjaGFyIGMgOiBpbnB1dCkgeworICAgIGlmIChjID09ICdfJykgeworICAgICAgLy8gVGhlIGZpZWxkIG5hbWUgbXVzdCBub3QgY29udGFpbiAiXyJzLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgIG91dHB1dC0+cHVzaF9iYWNrKCdfJyk7CisgICAgICBvdXRwdXQtPnB1c2hfYmFjayhjICsgJ2EnIC0gJ0EnKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0cHV0LT5wdXNoX2JhY2soYyk7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIEZpZWxkTWFza1V0aWw6OlRvSnNvblN0cmluZyhjb25zdCBGaWVsZE1hc2smIG1hc2ssIHN0ZDo6c3RyaW5nKiBvdXQpIHsKKyAgb3V0LT5jbGVhcigpOworICBmb3IgKGludCBpID0gMDsgaSA8IG1hc2sucGF0aHNfc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCA9IG1hc2sucGF0aHMoaSk7CisgICAgc3RkOjpzdHJpbmcgY2FtZWxjYXNlX3BhdGg7CisgICAgaWYgKCFTbmFrZUNhc2VUb0NhbWVsQ2FzZShwYXRoLCAmY2FtZWxjYXNlX3BhdGgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChpID4gMCkgeworICAgICAgb3V0LT5wdXNoX2JhY2soJywnKTsKKyAgICB9CisgICAgb3V0LT5hcHBlbmQoY2FtZWxjYXNlX3BhdGgpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIEZpZWxkTWFza1V0aWw6OkZyb21Kc29uU3RyaW5nKFN0cmluZ1BpZWNlIHN0ciwgRmllbGRNYXNrKiBvdXQpIHsKKyAgb3V0LT5DbGVhcigpOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGF0aHMgPSBTcGxpdChzdHIsICIsIik7CisgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGggOiBwYXRocykgeworICAgIGlmIChwYXRoLmVtcHR5KCkpIGNvbnRpbnVlOworICAgIHN0ZDo6c3RyaW5nIHNuYWtlY2FzZV9wYXRoOworICAgIGlmICghQ2FtZWxDYXNlVG9TbmFrZUNhc2UocGF0aCwgJnNuYWtlY2FzZV9wYXRoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBvdXQtPmFkZF9wYXRocyhzbmFrZWNhc2VfcGF0aCk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRmllbGRNYXNrVXRpbDo6R2V0RmllbGREZXNjcmlwdG9ycygKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBTdHJpbmdQaWVjZSBwYXRoLAorICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBmaWVsZF9kZXNjcmlwdG9ycykgeworICBpZiAoZmllbGRfZGVzY3JpcHRvcnMgIT0gbnVsbHB0cikgeworICAgIGZpZWxkX2Rlc2NyaXB0b3JzLT5jbGVhcigpOworICB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXJ0cyA9IFNwbGl0KHBhdGgsICIuIik7CisgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkX25hbWUgOiBwYXJ0cykgeworICAgIGlmIChkZXNjcmlwdG9yID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZShmaWVsZF9uYW1lKTsKKyAgICBpZiAoZmllbGQgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoZmllbGRfZGVzY3JpcHRvcnMgIT0gbnVsbHB0cikgeworICAgICAgZmllbGRfZGVzY3JpcHRvcnMtPnB1c2hfYmFjayhmaWVsZCk7CisgICAgfQorICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYKKyAgICAgICAgZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIGRlc2NyaXB0b3IgPSBmaWVsZC0+bWVzc2FnZV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc2NyaXB0b3IgPSBudWxscHRyOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGaWVsZE1hc2tVdGlsOjpHZXRGaWVsZE1hc2tGb3JBbGxGaWVsZHMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkTWFzayogb3V0KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgb3V0LT5hZGRfcGF0aHMoZGVzY3JpcHRvci0+ZmllbGQoaSktPm5hbWUoKSk7CisgIH0KK30KKworbmFtZXNwYWNlIHsKKy8vIEEgRmllbGRNYXNrVHJlZSByZXByZXNlbnRzIGEgRmllbGRNYXNrIGluIGEgdHJlZSBzdHJ1Y3R1cmUuIEZvciBleGFtcGxlLAorLy8gZ2l2ZW4gYSBGaWVsZE1hc2sgImZvby5iYXIsZm9vLmJheixiYXIuYmF6IiwgdGhlIEZpZWxkTWFza1RyZWUgd2lsbCBiZToKKy8vCisvLyAgIFtyb290XSAtKy0gZm9vIC0rLSBiYXIKKy8vICAgICAgICAgICB8ICAgICAgIHwKKy8vICAgICAgICAgICB8ICAgICAgICstIGJhegorLy8gICAgICAgICAgIHwKKy8vICAgICAgICAgICArLSBiYXIgLS0tIGJhegorLy8KKy8vIEluIHRoZSB0cmVlLCBlYWNoIGxlYWYgbm9kZSByZXByZXNlbnRzIGEgZmllbGQgcGF0aC4KK2NsYXNzIEZpZWxkTWFza1RyZWUgeworIHB1YmxpYzoKKyAgRmllbGRNYXNrVHJlZSgpOworICB+RmllbGRNYXNrVHJlZSgpOworCisgIHZvaWQgTWVyZ2VGcm9tRmllbGRNYXNrKGNvbnN0IEZpZWxkTWFzayYgbWFzayk7CisgIHZvaWQgTWVyZ2VUb0ZpZWxkTWFzayhGaWVsZE1hc2sqIG1hc2spOworCisgIC8vIEFkZCBhIGZpZWxkIHBhdGggaW50byB0aGUgdHJlZS4gSW4gYSBGaWVsZE1hc2ssIGVhY2ggZmllbGQgcGF0aCBtYXRjaGVzCisgIC8vIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIGFsc28gYWxsIGl0cyBzdWItZmllbGRzLiBJZiB0aGUgZmllbGQgcGF0aCB0bworICAvLyBhZGQgaXMgYSBzdWItcGF0aCBvZiBhbiBleGlzdGluZyBmaWVsZCBwYXRoIGluIHRoZSB0cmVlIChpLmUuLCBhIGxlYWYKKyAgLy8gbm9kZSksIGl0IG1lYW5zIHRoZSB0cmVlIGFscmVhZHkgbWF0Y2hlcyB0aGUgZ2l2ZW4gcGF0aCBzbyBub3RoaW5nIHdpbGwKKyAgLy8gYmUgYWRkZWQgdG8gdGhlIHRyZWUuIElmIHRoZSBwYXRoIG1hdGNoZXMgYW4gZXhpc3Rpbmcgbm9uLWxlYWYgbm9kZSBpbiB0aGUKKyAgLy8gdHJlZSwgdGhhdCBub24tbGVhZiBub2RlIHdpbGwgYmUgdHVybmVkIGludG8gYSBsZWFmIG5vZGUgd2l0aCBhbGwgaXRzCisgIC8vIGNoaWxkcmVuIHJlbW92ZWQgYmVjYXVzZSB0aGUgcGF0aCBtYXRjaGVzIGFsbCB0aGUgbm9kZSdzIGNoaWxkcmVuLgorICB2b2lkIEFkZFBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOworCisgIC8vIFJlbW92ZSBhIHBhdGggZnJvbSB0aGUgdHJlZS4KKyAgLy8gSWYgdGhlIHBhdGggaXMgYSBzdWItcGF0aCBvZiBhbiBleGlzdGluZyBmaWVsZCBwYXRoIGluIHRoZSB0cmVlLCBpdCBtZWFucworICAvLyB3ZSBuZWVkIHJlbW92ZSB0aGUgZXhpc3RpbmcgZmllbGQgcGF0aCBhbmQgYWRkIGFsbCBzdWItcGF0aHMgZXhjZXB0CisgIC8vIHNwZWNpZmllZCBwYXRoLiBJZiB0aGUgcGF0aCBtYXRjaGVzIGFuIGV4aXN0aW5nIG5vZGUgaW4gdGhlIHRyZWUsIHRoaXMgbm9kZQorICAvLyB3aWxsIGJlIG1vdmVkLgorICB2b2lkIFJlbW92ZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisgIC8vIENhbGN1bGF0ZSB0aGUgaW50ZXJzZWN0aW9uIHBhcnQgb2YgYSBmaWVsZCBwYXRoIHdpdGggdGhpcyB0cmVlIGFuZCBhZGQKKyAgLy8gdGhlIGludGVyc2VjdGlvbiBmaWVsZCBwYXRoIGludG8gb3V0LgorICB2b2lkIEludGVyc2VjdFBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIEZpZWxkTWFza1RyZWUqIG91dCk7CisKKyAgLy8gTWVyZ2UgYWxsIGZpZWxkcyBzcGVjaWZpZWQgYnkgdGhpcyB0cmVlIGZyb20gb25lIG1lc3NhZ2UgdG8gYW5vdGhlci4KKyAgdm9pZCBNZXJnZU1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgc291cmNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZE1hc2tVdGlsOjpNZXJnZU9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIGRlc3RpbmF0aW9uKSB7CisgICAgLy8gRG8gbm90aGluZyBpZiB0aGUgdHJlZSBpcyBlbXB0eS4KKyAgICBpZiAocm9vdF8uY2hpbGRyZW4uZW1wdHkoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBNZXJnZU1lc3NhZ2UoJnJvb3RfLCBzb3VyY2UsIG9wdGlvbnMsIGRlc3RpbmF0aW9uKTsKKyAgfQorCisgIC8vIEFkZCByZXF1aXJlZCBmaWVsZCBwYXRoIG9mIHRoZSBtZXNzYWdlIHRvIHRoaXMgdHJlZSBiYXNlZCBvbiBjdXJyZW50IHRyZWUKKyAgLy8gc3RydWN0dXJlLiBJZiBhIG1lc3NhZ2UgaXMgcHJlc2VudCBpbiB0aGUgdHJlZSwgYWRkIHRoZSBwYXRoIG9mIGl0cworICAvLyByZXF1aXJlZCBmaWVsZCB0byB0aGUgdHJlZS4gVGhpcyBpcyB0byBtYWtlIHN1cmUgdGhhdCBhZnRlciB0cmltbWluZyBhCisgIC8vIG1lc3NhZ2Ugd2l0aCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCwgY2hlY2sgSXNJbml0aWFsaXplZCgpIHdpbGwgbm90IGZhaWwuCisgIHZvaWQgQWRkUmVxdWlyZWRGaWVsZFBhdGgoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlIHRyZWUgaXMgZW1wdHkuCisgICAgaWYgKHJvb3RfLmNoaWxkcmVuLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgQWRkUmVxdWlyZWRGaWVsZFBhdGgoJnJvb3RfLCBkZXNjcmlwdG9yKTsKKyAgfQorCisgIC8vIFRyaW1zIGFsbCBmaWVsZHMgbm90IHNwZWNpZmllZCBieSB0aGlzIHRyZWUgZnJvbSB0aGUgZ2l2ZW4gbWVzc2FnZS4KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtZXNzYWdlIGlzIG1vZGlmaWVkLgorICBib29sIFRyaW1NZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgICAvLyBEbyBub3RoaW5nIGlmIHRoZSB0cmVlIGlzIGVtcHR5LgorICAgIGlmIChyb290Xy5jaGlsZHJlbi5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBUcmltTWVzc2FnZSgmcm9vdF8sIG1lc3NhZ2UpOworICB9CisKKyBwcml2YXRlOgorICBzdHJ1Y3QgTm9kZSB7CisgICAgTm9kZSgpIHt9CisKKyAgICB+Tm9kZSgpIHsgQ2xlYXJDaGlsZHJlbigpOyB9CisKKyAgICB2b2lkIENsZWFyQ2hpbGRyZW4oKSB7CisgICAgICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBOb2RlKj46Oml0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uYmVnaW4oKTsKKyAgICAgICAgICAgaXQgIT0gY2hpbGRyZW4uZW5kKCk7ICsraXQpIHsKKyAgICAgICAgZGVsZXRlIGl0LT5zZWNvbmQ7CisgICAgICB9CisgICAgICBjaGlsZHJlbi5jbGVhcigpOworICAgIH0KKworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBOb2RlKj4gY2hpbGRyZW47CisKKyAgIHByaXZhdGU6CisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE5vZGUpOworICB9OworCisgIC8vIE1lcmdlIGEgc3ViLXRyZWUgdG8gbWFzay4gVGhpcyBtZXRob2QgYWRkcyB0aGUgZmllbGQgcGF0aHMgcmVwcmVzZW50ZWQKKyAgLy8gYnkgYWxsIGxlYWYgbm9kZXMgZGVzY2VuZGVkIGZyb20gIm5vZGUiIHRvIG1hc2suCisgIHZvaWQgTWVyZ2VUb0ZpZWxkTWFzayhjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LCBjb25zdCBOb2RlKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRNYXNrKiBvdXQpOworCisgIC8vIE1lcmdlIGFsbCBsZWFmIG5vZGVzIG9mIGEgc3ViLXRyZWUgdG8gYW5vdGhlciB0cmVlLgorICB2b2lkIE1lcmdlTGVhZk5vZGVzVG9UcmVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgsIGNvbnN0IE5vZGUqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRNYXNrVHJlZSogb3V0KTsKKworICAvLyBNZXJnZSBhbGwgZmllbGRzIHNwZWNpZmllZCBieSBhIHN1Yi10cmVlIGZyb20gb25lIG1lc3NhZ2UgdG8gYW5vdGhlci4KKyAgdm9pZCBNZXJnZU1lc3NhZ2UoY29uc3QgTm9kZSogbm9kZSwgY29uc3QgTWVzc2FnZSYgc291cmNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZE1hc2tVdGlsOjpNZXJnZU9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIGRlc3RpbmF0aW9uKTsKKworICAvLyBBZGQgcmVxdWlyZWQgZmllbGQgcGF0aCBvZiB0aGUgbWVzc2FnZSB0byB0aGlzIHRyZWUgYmFzZWQgb24gY3VycmVudCB0cmVlCisgIC8vIHN0cnVjdHVyZS4gSWYgYSBtZXNzYWdlIGlzIHByZXNlbnQgaW4gdGhlIHRyZWUsIGFkZCB0aGUgcGF0aCBvZiBpdHMKKyAgLy8gcmVxdWlyZWQgZmllbGQgdG8gdGhlIHRyZWUuIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoYXQgYWZ0ZXIgdHJpbW1pbmcgYQorICAvLyBtZXNzYWdlIHdpdGggcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQsIGNoZWNrIElzSW5pdGlhbGl6ZWQoKSB3aWxsIG5vdCBmYWlsLgorICB2b2lkIEFkZFJlcXVpcmVkRmllbGRQYXRoKE5vZGUqIG5vZGUsIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisgIC8vIFRyaW1zIGFsbCBmaWVsZHMgbm90IHNwZWNpZmllZCBieSB0aGlzIHN1Yi10cmVlIGZyb20gdGhlIGdpdmVuIG1lc3NhZ2UuCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWVzc2FnZSBpcyBhY3R1YWxseSBtb2RpZmllZAorICBib29sIFRyaW1NZXNzYWdlKGNvbnN0IE5vZGUqIG5vZGUsIE1lc3NhZ2UqIG1lc3NhZ2UpOworCisgIE5vZGUgcm9vdF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpZWxkTWFza1RyZWUpOworfTsKKworRmllbGRNYXNrVHJlZTo6RmllbGRNYXNrVHJlZSgpIHt9CisKK0ZpZWxkTWFza1RyZWU6On5GaWVsZE1hc2tUcmVlKCkge30KKwordm9pZCBGaWVsZE1hc2tUcmVlOjpNZXJnZUZyb21GaWVsZE1hc2soY29uc3QgRmllbGRNYXNrJiBtYXNrKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFzay5wYXRoc19zaXplKCk7ICsraSkgeworICAgIEFkZFBhdGgobWFzay5wYXRocyhpKSk7CisgIH0KK30KKwordm9pZCBGaWVsZE1hc2tUcmVlOjpNZXJnZVRvRmllbGRNYXNrKEZpZWxkTWFzayogbWFzaykgeworICBNZXJnZVRvRmllbGRNYXNrKCIiLCAmcm9vdF8sIG1hc2spOworfQorCit2b2lkIEZpZWxkTWFza1RyZWU6Ok1lcmdlVG9GaWVsZE1hc2soY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOb2RlKiBub2RlLCBGaWVsZE1hc2sqIG91dCkgeworICBpZiAobm9kZS0+Y2hpbGRyZW4uZW1wdHkoKSkgeworICAgIGlmIChwcmVmaXguZW1wdHkoKSkgeworICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdCBub2RlLgorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvdXQtPmFkZF9wYXRocyhwcmVmaXgpOworICAgIHJldHVybjsKKyAgfQorICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBOb2RlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbm9kZS0+Y2hpbGRyZW4uYmVnaW4oKTsKKyAgICAgICBpdCAhPSBub2RlLT5jaGlsZHJlbi5lbmQoKTsgKytpdCkgeworICAgIHN0ZDo6c3RyaW5nIGN1cnJlbnRfcGF0aCA9CisgICAgICAgIHByZWZpeC5lbXB0eSgpID8gaXQtPmZpcnN0IDogcHJlZml4ICsgIi4iICsgaXQtPmZpcnN0OworICAgIE1lcmdlVG9GaWVsZE1hc2soY3VycmVudF9wYXRoLCBpdC0+c2Vjb25kLCBvdXQpOworICB9Cit9CisKK3ZvaWQgRmllbGRNYXNrVHJlZTo6QWRkUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGFydHMgPSBTcGxpdChwYXRoLCAiLiIpOworICBpZiAocGFydHMuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBib29sIG5ld19icmFuY2ggPSBmYWxzZTsKKyAgTm9kZSogbm9kZSA9ICZyb290XzsKKyAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyYgbm9kZV9uYW1lIDogcGFydHMpIHsKKyAgICBpZiAoIW5ld19icmFuY2ggJiYgbm9kZSAhPSAmcm9vdF8gJiYgbm9kZS0+Y2hpbGRyZW4uZW1wdHkoKSkgeworICAgICAgLy8gUGF0aCBtYXRjaGVzIGFuIGV4aXN0aW5nIGxlYWYgbm9kZS4gVGhpcyBtZWFucyB0aGUgcGF0aCBpcyBhbHJlYWR5CisgICAgICAvLyBjb3ZlcmVkIGJ5IHRoaXMgdHJlZSAoZm9yIGV4YW1wbGUsIGFkZGluZyAiZm9vLmJhci5iYXoiIHRvIGEgdHJlZQorICAgICAgLy8gd2hpY2ggYWxyZWFkeSBjb250YWlucyAiZm9vLmJhciIpLgorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBOb2RlKiYgY2hpbGQgPSBub2RlLT5jaGlsZHJlbltub2RlX25hbWVdOworICAgIGlmIChjaGlsZCA9PSBudWxscHRyKSB7CisgICAgICBuZXdfYnJhbmNoID0gdHJ1ZTsKKyAgICAgIGNoaWxkID0gbmV3IE5vZGUoKTsKKyAgICB9CisgICAgbm9kZSA9IGNoaWxkOworICB9CisgIGlmICghbm9kZS0+Y2hpbGRyZW4uZW1wdHkoKSkgeworICAgIG5vZGUtPkNsZWFyQ2hpbGRyZW4oKTsKKyAgfQorfQorCit2b2lkIEZpZWxkTWFza1RyZWU6OlJlbW92ZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBpZiAocm9vdF8uY2hpbGRyZW4uZW1wdHkoKSkgeworICAgIC8vIE5vdGhpbmcgdG8gYmUgcmVtb3ZlZCBmcm9tIGFuIGVtcHR5IHRyZWUuIFdlIHNob3J0Y3V0IGl0IGhlcmUgc28gYW4gZW1wdHkKKyAgICAvLyB0cmVlIHdvbid0IGJlIGludGVycHJldGVkIGFzIGEgZmllbGQgbWFzayBjb250YWluaW5nIGFsbCBmaWVsZHMgYnkgdGhlCisgICAgLy8gY29kZSBiZWxvdy4KKyAgICByZXR1cm47CisgIH0KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhcnRzID0gU3BsaXQocGF0aCwgIi4iKTsKKyAgaWYgKHBhcnRzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc3RkOjp2ZWN0b3I8Tm9kZSo+IG5vZGVzKHBhcnRzLnNpemUoKSk7CisgIE5vZGUqIG5vZGUgPSAmcm9vdF87CisgIGNvbnN0IERlc2NyaXB0b3IqIGN1cnJlbnRfZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgIE5vZGUqIG5ld19icmFuY2hfbm9kZSA9IG51bGxwdHI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMuc2l6ZSgpOyArK2kpIHsKKyAgICBub2Rlc1tpXSA9IG5vZGU7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0KKyAgICAgICAgY3VycmVudF9kZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUocGFydHNbaV0pOworICAgIGlmIChmaWVsZF9kZXNjcmlwdG9yID09IG51bGxwdHIgfHwKKyAgICAgICAgKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UgJiYKKyAgICAgICAgIGkgIT0gcGFydHMuc2l6ZSgpIC0gMSkpIHsKKyAgICAgIC8vIEludmFsaWQgcGF0aC4KKyAgICAgIGlmIChuZXdfYnJhbmNoX25vZGUgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBJZiBhZGQgYW55IG5ldyBub2RlcywgY2xlYW51cC4KKyAgICAgICAgbmV3X2JyYW5jaF9ub2RlLT5DbGVhckNoaWxkcmVuKCk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG5vZGUtPmNoaWxkcmVuLmVtcHR5KCkpIHsKKyAgICAgIGlmIChuZXdfYnJhbmNoX25vZGUgPT0gbnVsbHB0cikgeworICAgICAgICBuZXdfYnJhbmNoX25vZGUgPSBub2RlOworICAgICAgfQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50X2Rlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7ICsraikgeworICAgICAgICBub2RlLT5jaGlsZHJlbltjdXJyZW50X2Rlc2NyaXB0b3ItPmZpZWxkKGopLT5uYW1lKCldID0gbmV3IE5vZGUoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKENvbnRhaW5zS2V5KG5vZGUtPmNoaWxkcmVuLCBwYXJ0c1tpXSkpIHsKKyAgICAgIG5vZGUgPSBub2RlLT5jaGlsZHJlbltwYXJ0c1tpXV07CisgICAgICBpZiAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgICBjdXJyZW50X2Rlc2NyaXB0b3IgPSBmaWVsZF9kZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gUGF0aCBkb2VzIG5vdCBleGlzdC4KKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgLy8gUmVtb3ZlIHBhdGguCisgIGZvciAoaW50IGkgPSBwYXJ0cy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgIGRlbGV0ZSBub2Rlc1tpXS0+Y2hpbGRyZW5bcGFydHNbaV1dOworICAgIG5vZGVzW2ldLT5jaGlsZHJlbi5lcmFzZShwYXJ0c1tpXSk7CisgICAgaWYgKCFub2Rlc1tpXS0+Y2hpbGRyZW4uZW1wdHkoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRmllbGRNYXNrVHJlZTo6SW50ZXJzZWN0UGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgRmllbGRNYXNrVHJlZSogb3V0KSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXJ0cyA9IFNwbGl0KHBhdGgsICIuIik7CisgIGlmIChwYXJ0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIGNvbnN0IE5vZGUqIG5vZGUgPSAmcm9vdF87CisgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIG5vZGVfbmFtZSA6IHBhcnRzKSB7CisgICAgaWYgKG5vZGUtPmNoaWxkcmVuLmVtcHR5KCkpIHsKKyAgICAgIGlmIChub2RlICE9ICZyb290XykgeworICAgICAgICBvdXQtPkFkZFBhdGgocGF0aCk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IE5vZGUqIHJlc3VsdCA9IEZpbmRQdHJPck51bGwobm9kZS0+Y2hpbGRyZW4sIG5vZGVfbmFtZSk7CisgICAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAvLyBObyBpbnRlcnNlY3Rpb24gZm91bmQuCisgICAgICByZXR1cm47CisgICAgfQorICAgIG5vZGUgPSByZXN1bHQ7CisgIH0KKyAgLy8gTm93IHdlIGZvdW5kIGEgbWF0Y2hpbmcgbm9kZSB3aXRoIHRoZSBnaXZlbiBwYXRoLiBBZGQgYWxsIGxlYWYgbm9kZXMKKyAgLy8gdG8gb3V0LgorICBNZXJnZUxlYWZOb2Rlc1RvVHJlZShwYXRoLCBub2RlLCBvdXQpOworfQorCit2b2lkIEZpZWxkTWFza1RyZWU6Ok1lcmdlTGVhZk5vZGVzVG9UcmVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5vZGUqIG5vZGUsIEZpZWxkTWFza1RyZWUqIG91dCkgeworICBpZiAobm9kZS0+Y2hpbGRyZW4uZW1wdHkoKSkgeworICAgIG91dC0+QWRkUGF0aChwcmVmaXgpOworICB9CisgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIE5vZGUqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBub2RlLT5jaGlsZHJlbi5iZWdpbigpOworICAgICAgIGl0ICE9IG5vZGUtPmNoaWxkcmVuLmVuZCgpOyArK2l0KSB7CisgICAgc3RkOjpzdHJpbmcgY3VycmVudF9wYXRoID0KKyAgICAgICAgcHJlZml4LmVtcHR5KCkgPyBpdC0+Zmlyc3QgOiBwcmVmaXggKyAiLiIgKyBpdC0+Zmlyc3Q7CisgICAgTWVyZ2VMZWFmTm9kZXNUb1RyZWUoY3VycmVudF9wYXRoLCBpdC0+c2Vjb25kLCBvdXQpOworICB9Cit9CisKK3ZvaWQgRmllbGRNYXNrVHJlZTo6TWVyZ2VNZXNzYWdlKGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0IE1lc3NhZ2UmIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkTWFza1V0aWw6Ok1lcmdlT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIGRlc3RpbmF0aW9uKSB7CisgIEdPT0dMRV9EQ0hFQ0soIW5vZGUtPmNoaWxkcmVuLmVtcHR5KCkpOworICBjb25zdCBSZWZsZWN0aW9uKiBzb3VyY2VfcmVmbGVjdGlvbiA9IHNvdXJjZS5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIGRlc3RpbmF0aW9uX3JlZmxlY3Rpb24gPSBkZXN0aW5hdGlvbi0+R2V0UmVmbGVjdGlvbigpOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gc291cmNlLkdldERlc2NyaXB0b3IoKTsKKyAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTm9kZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG5vZGUtPmNoaWxkcmVuLmJlZ2luKCk7CisgICAgICAgaXQgIT0gbm9kZS0+Y2hpbGRyZW4uZW5kKCk7ICsraXQpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSA9IGl0LT5maXJzdDsKKyAgICBjb25zdCBOb2RlKiBjaGlsZCA9IGl0LT5zZWNvbmQ7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZShmaWVsZF9uYW1lKTsKKyAgICBpZiAoZmllbGQgPT0gbnVsbHB0cikgeworICAgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkNhbm5vdCBmaW5kIGZpZWxkIFwiIiA8PCBmaWVsZF9uYW1lIDw8ICJcIiBpbiBtZXNzYWdlICIKKyAgICAgICAgICAgICAgICAgPDwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFjaGlsZC0+Y2hpbGRyZW4uZW1wdHkoKSkgeworICAgICAgLy8gU3ViLXBhdGhzIGFyZSBvbmx5IGFsbG93ZWQgZm9yIHNpbmd1bGFyIG1lc3NhZ2UgZmllbGRzLgorICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpIHx8CisgICAgICAgICAgZmllbGQtPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkZpZWxkIFwiIiA8PCBmaWVsZF9uYW1lIDw8ICJcIiBpbiBtZXNzYWdlICIKKyAgICAgICAgICAgICAgICAgICA8PCBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgbm90IGEgc2luZ3VsYXIgbWVzc2FnZSBmaWVsZCBhbmQgY2Fubm90ICIKKyAgICAgICAgICAgICAgICAgICA8PCAiaGF2ZSBzdWItZmllbGRzLiI7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgTWVyZ2VNZXNzYWdlKGNoaWxkLCBzb3VyY2VfcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShzb3VyY2UsIGZpZWxkKSwgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl9yZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZShkZXN0aW5hdGlvbiwgZmllbGQpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIENPUFlfVkFMVUUoVFlQRSwgTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI1RZUEU6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc291cmNlX3JlZmxlY3Rpb24tPkhhc0ZpZWxkKHNvdXJjZSwgZmllbGQpKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkZXN0aW5hdGlvbl9yZWZsZWN0aW9uLT5TZXQjI05hbWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRlc3RpbmF0aW9uLCBmaWVsZCwgc291cmNlX3JlZmxlY3Rpb24tPkdldCMjTmFtZShzb3VyY2UsIGZpZWxkKSk7IFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkZXN0aW5hdGlvbl9yZWZsZWN0aW9uLT5DbGVhckZpZWxkKGRlc3RpbmF0aW9uLCBmaWVsZCk7ICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyAgICAgICAgQ09QWV9WQUxVRShCT09MLCBCb29sKQorICAgICAgICBDT1BZX1ZBTFVFKElOVDMyLCBJbnQzMikKKyAgICAgICAgQ09QWV9WQUxVRShJTlQ2NCwgSW50NjQpCisgICAgICAgIENPUFlfVkFMVUUoVUlOVDMyLCBVSW50MzIpCisgICAgICAgIENPUFlfVkFMVUUoVUlOVDY0LCBVSW50NjQpCisgICAgICAgIENPUFlfVkFMVUUoRkxPQVQsIEZsb2F0KQorICAgICAgICBDT1BZX1ZBTFVFKERPVUJMRSwgRG91YmxlKQorICAgICAgICBDT1BZX1ZBTFVFKEVOVU0sIEVudW0pCisgICAgICAgIENPUFlfVkFMVUUoU1RSSU5HLCBTdHJpbmcpCisjdW5kZWYgQ09QWV9WQUxVRQorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOiB7CisgICAgICAgICAgaWYgKG9wdGlvbnMucmVwbGFjZV9tZXNzYWdlX2ZpZWxkcygpKSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvbl9yZWZsZWN0aW9uLT5DbGVhckZpZWxkKGRlc3RpbmF0aW9uLCBmaWVsZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb3VyY2VfcmVmbGVjdGlvbi0+SGFzRmllbGQoc291cmNlLCBmaWVsZCkpIHsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uX3JlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKGRlc3RpbmF0aW9uLCBmaWVsZCkKKyAgICAgICAgICAgICAgICAtPk1lcmdlRnJvbShzb3VyY2VfcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShzb3VyY2UsIGZpZWxkKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChvcHRpb25zLnJlcGxhY2VfcmVwZWF0ZWRfZmllbGRzKCkpIHsKKyAgICAgICAgZGVzdGluYXRpb25fcmVmbGVjdGlvbi0+Q2xlYXJGaWVsZChkZXN0aW5hdGlvbiwgZmllbGQpOworICAgICAgfQorICAgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworI2RlZmluZSBDT1BZX1JFUEVBVEVEX1ZBTFVFKFRZUEUsIE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNUWVBFOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHNpemUgPSBzb3VyY2VfcmVmbGVjdGlvbi0+RmllbGRTaXplKHNvdXJjZSwgZmllbGQpOyAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGRlc3RpbmF0aW9uX3JlZmxlY3Rpb24tPkFkZCMjTmFtZSggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZGVzdGluYXRpb24sIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHNvdXJjZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZCMjTmFtZShzb3VyY2UsIGZpZWxkLCBpKSk7IFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisgICAgICAgIENPUFlfUkVQRUFURURfVkFMVUUoQk9PTCwgQm9vbCkKKyAgICAgICAgQ09QWV9SRVBFQVRFRF9WQUxVRShJTlQzMiwgSW50MzIpCisgICAgICAgIENPUFlfUkVQRUFURURfVkFMVUUoSU5UNjQsIEludDY0KQorICAgICAgICBDT1BZX1JFUEVBVEVEX1ZBTFVFKFVJTlQzMiwgVUludDMyKQorICAgICAgICBDT1BZX1JFUEVBVEVEX1ZBTFVFKFVJTlQ2NCwgVUludDY0KQorICAgICAgICBDT1BZX1JFUEVBVEVEX1ZBTFVFKEZMT0FULCBGbG9hdCkKKyAgICAgICAgQ09QWV9SRVBFQVRFRF9WQUxVRShET1VCTEUsIERvdWJsZSkKKyAgICAgICAgQ09QWV9SRVBFQVRFRF9WQUxVRShFTlVNLCBFbnVtKQorICAgICAgICBDT1BZX1JFUEVBVEVEX1ZBTFVFKFNUUklORywgU3RyaW5nKQorI3VuZGVmIENPUFlfUkVQRUFURURfVkFMVUUKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTogeworICAgICAgICAgIGludCBzaXplID0gc291cmNlX3JlZmxlY3Rpb24tPkZpZWxkU2l6ZShzb3VyY2UsIGZpZWxkKTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgZGVzdGluYXRpb25fcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShkZXN0aW5hdGlvbiwgZmllbGQpCisgICAgICAgICAgICAgICAgLT5NZXJnZUZyb20oCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2Uoc291cmNlLCBmaWVsZCwgaSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIEZpZWxkTWFza1RyZWU6OkFkZFJlcXVpcmVkRmllbGRQYXRoKE5vZGUqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgY29uc3QgaW50MzJfdCBmaWVsZF9jb3VudCA9IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7CisgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBmaWVsZF9jb3VudDsgKytpbmRleCkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yLT5maWVsZChpbmRleCk7CisgICAgaWYgKGZpZWxkLT5pc19yZXF1aXJlZCgpKSB7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbm9kZV9uYW1lID0gZmllbGQtPm5hbWUoKTsKKyAgICAgIE5vZGUqJiBjaGlsZCA9IG5vZGUtPmNoaWxkcmVuW25vZGVfbmFtZV07CisgICAgICBpZiAoY2hpbGQgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBBZGQgcmVxdWlyZWQgZmllbGQgcGF0aCB0byB0aGUgdHJlZQorICAgICAgICBjaGlsZCA9IG5ldyBOb2RlKCk7CisgICAgICB9IGVsc2UgaWYgKGNoaWxkLT5jaGlsZHJlbi5lbXB0eSgpKSB7CisgICAgICAgIC8vIElmIHRoZSByZXF1aXJlZCBmaWVsZCBpcyBpbiB0aGUgdHJlZSBhbmQgZG9lcyBub3QgaGF2ZSBhbnkgY2hpbGRyZW4sCisgICAgICAgIC8vIGRvIG5vdGhpbmcuCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLy8gQWRkIHJlcXVpcmVkIGZpZWxkIGluIHRoZSBjaGlsZHJlbiB0byB0aGUgdHJlZSBpZiB0aGUgZmllbGQgaXMgbWVzc2FnZS4KKyAgICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgICBBZGRSZXF1aXJlZEZpZWxkUGF0aChjaGlsZCwgZmllbGQtPm1lc3NhZ2VfdHlwZSgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTm9kZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4uZmluZChmaWVsZC0+bmFtZSgpKTsKKyAgICAgIGlmIChpdCAhPSBub2RlLT5jaGlsZHJlbi5lbmQoKSkgeworICAgICAgICAvLyBBZGQgcmVxdWlyZWQgZmllbGRzIGluIHRoZSBjaGlsZHJlbiB0byB0aGUKKyAgICAgICAgLy8gdHJlZSBpZiB0aGUgZmllbGQgaXMgYSBtZXNzYWdlIGFuZCBwcmVzZW50IGluIHRoZSB0cmVlLgorICAgICAgICBOb2RlKiBjaGlsZCA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmICghY2hpbGQtPmNoaWxkcmVuLmVtcHR5KCkpIHsKKyAgICAgICAgICBBZGRSZXF1aXJlZEZpZWxkUGF0aChjaGlsZCwgZmllbGQtPm1lc3NhZ2VfdHlwZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCitib29sIEZpZWxkTWFza1RyZWU6OlRyaW1NZXNzYWdlKGNvbnN0IE5vZGUqIG5vZGUsIE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgR09PR0xFX0RDSEVDSyghbm9kZS0+Y2hpbGRyZW4uZW1wdHkoKSk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IGludDMyX3QgZmllbGRfY291bnQgPSBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOworICBib29sIG1vZGlmaWVkID0gZmFsc2U7CisgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBmaWVsZF9jb3VudDsgKytpbmRleCkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yLT5maWVsZChpbmRleCk7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIE5vZGUqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPQorICAgICAgICBub2RlLT5jaGlsZHJlbi5maW5kKGZpZWxkLT5uYW1lKCkpOworICAgIGlmIChpdCA9PSBub2RlLT5jaGlsZHJlbi5lbmQoKSkgeworICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgIGlmIChyZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIGZpZWxkKSAhPSAwKSB7CisgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocmVmbGVjdGlvbi0+SGFzRmllbGQoKm1lc3NhZ2UsIGZpZWxkKSkgeworICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmVmbGVjdGlvbi0+Q2xlYXJGaWVsZChtZXNzYWdlLCBmaWVsZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgICBOb2RlKiBjaGlsZCA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmICghY2hpbGQtPmNoaWxkcmVuLmVtcHR5KCkgJiYgcmVmbGVjdGlvbi0+SGFzRmllbGQoKm1lc3NhZ2UsIGZpZWxkKSkgeworICAgICAgICAgIGJvb2wgbmVzdGVkTWVzc2FnZUNoYW5nZWQgPQorICAgICAgICAgICAgICBUcmltTWVzc2FnZShjaGlsZCwgcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgZmllbGQpKTsKKyAgICAgICAgICBtb2RpZmllZCA9IG5lc3RlZE1lc3NhZ2VDaGFuZ2VkIHx8IG1vZGlmaWVkOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBtb2RpZmllZDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgRmllbGRNYXNrVXRpbDo6VG9DYW5vbmljYWxGb3JtKGNvbnN0IEZpZWxkTWFzayYgbWFzaywgRmllbGRNYXNrKiBvdXQpIHsKKyAgRmllbGRNYXNrVHJlZSB0cmVlOworICB0cmVlLk1lcmdlRnJvbUZpZWxkTWFzayhtYXNrKTsKKyAgb3V0LT5DbGVhcigpOworICB0cmVlLk1lcmdlVG9GaWVsZE1hc2sob3V0KTsKK30KKwordm9pZCBGaWVsZE1hc2tVdGlsOjpVbmlvbihjb25zdCBGaWVsZE1hc2smIG1hc2sxLCBjb25zdCBGaWVsZE1hc2smIG1hc2syLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZE1hc2sqIG91dCkgeworICBGaWVsZE1hc2tUcmVlIHRyZWU7CisgIHRyZWUuTWVyZ2VGcm9tRmllbGRNYXNrKG1hc2sxKTsKKyAgdHJlZS5NZXJnZUZyb21GaWVsZE1hc2sobWFzazIpOworICBvdXQtPkNsZWFyKCk7CisgIHRyZWUuTWVyZ2VUb0ZpZWxkTWFzayhvdXQpOworfQorCit2b2lkIEZpZWxkTWFza1V0aWw6OkludGVyc2VjdChjb25zdCBGaWVsZE1hc2smIG1hc2sxLCBjb25zdCBGaWVsZE1hc2smIG1hc2syLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRNYXNrKiBvdXQpIHsKKyAgRmllbGRNYXNrVHJlZSB0cmVlLCBpbnRlcnNlY3Rpb247CisgIHRyZWUuTWVyZ2VGcm9tRmllbGRNYXNrKG1hc2sxKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXNrMi5wYXRoc19zaXplKCk7ICsraSkgeworICAgIHRyZWUuSW50ZXJzZWN0UGF0aChtYXNrMi5wYXRocyhpKSwgJmludGVyc2VjdGlvbik7CisgIH0KKyAgb3V0LT5DbGVhcigpOworICBpbnRlcnNlY3Rpb24uTWVyZ2VUb0ZpZWxkTWFzayhvdXQpOworfQorCit2b2lkIEZpZWxkTWFza1V0aWw6OlN1YnRyYWN0KGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkTWFzayYgbWFzazEsIGNvbnN0IEZpZWxkTWFzayYgbWFzazIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkTWFzayogb3V0KSB7CisgIGlmIChtYXNrMS5wYXRocygpLmVtcHR5KCkpIHsKKyAgICBvdXQtPkNsZWFyKCk7CisgICAgcmV0dXJuOworICB9CisgIEZpZWxkTWFza1RyZWUgdHJlZTsKKyAgdHJlZS5NZXJnZUZyb21GaWVsZE1hc2sobWFzazEpOworICBmb3IgKGludCBpID0gMDsgaSA8IG1hc2syLnBhdGhzX3NpemUoKTsgKytpKSB7CisgICAgdHJlZS5SZW1vdmVQYXRoKG1hc2syLnBhdGhzKGkpLCBkZXNjcmlwdG9yKTsKKyAgfQorICBvdXQtPkNsZWFyKCk7CisgIHRyZWUuTWVyZ2VUb0ZpZWxkTWFzayhvdXQpOworfQorCitib29sIEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKFN0cmluZ1BpZWNlIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkTWFzayYgbWFzaykgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1hc2sucGF0aHNfc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWFza19wYXRoID0gbWFzay5wYXRocyhpKTsKKyAgICBpZiAocGF0aCA9PSBtYXNrX3BhdGgpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAobWFza19wYXRoLmxlbmd0aCgpIDwgcGF0aC5sZW5ndGgoKSkgeworICAgICAgLy8gQWxzbyBjaGVjayB3aGV0aGVyIG1hc2sucGF0aHMoaSkgaXMgYSBwcmVmaXggb2YgcGF0aC4KKyAgICAgIGlmIChwYXRoLnN1YnN0cigwLCBtYXNrX3BhdGgubGVuZ3RoKCkgKyAxKS5jb21wYXJlKG1hc2tfcGF0aCArICIuIikgPT0KKyAgICAgICAgICAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgRmllbGRNYXNrVXRpbDo6TWVyZ2VNZXNzYWdlVG8oY29uc3QgTWVzc2FnZSYgc291cmNlLCBjb25zdCBGaWVsZE1hc2smIG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lcmdlT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogZGVzdGluYXRpb24pIHsKKyAgR09PR0xFX0NIRUNLKHNvdXJjZS5HZXREZXNjcmlwdG9yKCkgPT0gZGVzdGluYXRpb24tPkdldERlc2NyaXB0b3IoKSk7CisgIC8vIEJ1aWxkIGEgRmllbGRNYXNrVHJlZSBhbmQgd2FsayB0aHJvdWdoIHRoZSB0cmVlIHRvIG1lcmdlIGFsbCBzcGVjaWZpZWQKKyAgLy8gZmllbGRzLgorICBGaWVsZE1hc2tUcmVlIHRyZWU7CisgIHRyZWUuTWVyZ2VGcm9tRmllbGRNYXNrKG1hc2spOworICB0cmVlLk1lcmdlTWVzc2FnZShzb3VyY2UsIG9wdGlvbnMsIGRlc3RpbmF0aW9uKTsKK30KKworYm9vbCBGaWVsZE1hc2tVdGlsOjpUcmltTWVzc2FnZShjb25zdCBGaWVsZE1hc2smIG1hc2ssIE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgLy8gQnVpbGQgYSBGaWVsZE1hc2tUcmVlIGFuZCB3YWxrIHRocm91Z2ggdGhlIHRyZWUgdG8gbWVyZ2UgYWxsIHNwZWNpZmllZAorICAvLyBmaWVsZHMuCisgIEZpZWxkTWFza1RyZWUgdHJlZTsKKyAgdHJlZS5NZXJnZUZyb21GaWVsZE1hc2sobWFzayk7CisgIHJldHVybiB0cmVlLlRyaW1NZXNzYWdlKEdPT0dMRV9DSEVDS19OT1ROVUxMKG1lc3NhZ2UpKTsKK30KKworYm9vbCBGaWVsZE1hc2tVdGlsOjpUcmltTWVzc2FnZShjb25zdCBGaWVsZE1hc2smIG1hc2ssIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyaW1PcHRpb25zJiBvcHRpb25zKSB7CisgIC8vIEJ1aWxkIGEgRmllbGRNYXNrVHJlZSBhbmQgd2FsayB0aHJvdWdoIHRoZSB0cmVlIHRvIG1lcmdlIGFsbCBzcGVjaWZpZWQKKyAgLy8gZmllbGRzLgorICBGaWVsZE1hc2tUcmVlIHRyZWU7CisgIHRyZWUuTWVyZ2VGcm9tRmllbGRNYXNrKG1hc2spOworICAvLyBJZiBrZWVwX3JlcXVpcmVkX2ZpZWxkcyBpcyB0cnVlLCBpbXBsaWNpdGx5IGFkZCByZXF1aXJlZCBmaWVsZHMgb2YKKyAgLy8gYSBtZXNzYWdlIHByZXNlbnQgaW4gdGhlIHRyZWUgdG8gcHJldmVudCBmcm9tIHRyaW1taW5nLgorICBpZiAob3B0aW9ucy5rZWVwX3JlcXVpcmVkX2ZpZWxkcygpKSB7CisgICAgdHJlZS5BZGRSZXF1aXJlZEZpZWxkUGF0aChHT09HTEVfQ0hFQ0tfTk9UTlVMTChtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkpKTsKKyAgfQorICByZXR1cm4gdHJlZS5UcmltTWVzc2FnZShHT09HTEVfQ0hFQ0tfTk9UTlVMTChtZXNzYWdlKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWwuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTFhMzMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbC5oCkBAIC0wLDAgKzEsMjYzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gRGVmaW5lcyB1dGlsaXRpZXMgZm9yIHRoZSBGaWVsZE1hc2sgd2VsbCBrbm93biB0eXBlLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9VVElMX0ZJRUxEX01BU0tfVVRJTF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1VUSUxfRklFTERfTUFTS19VVElMX0hfXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEZpZWxkTWFza1V0aWwgeworICB0eXBlZGVmIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkTWFzayBGaWVsZE1hc2s7CisKKyBwdWJsaWM6CisgIC8vIENvbnZlcnRzIEZpZWxkTWFzayB0by9mcm9tIHN0cmluZywgZm9ybWF0dGVkIGJ5IHNlcGFyYXRpbmcgZWFjaCBwYXRoCisgIC8vIHdpdGggYSBjb21tYSAoZS5nLiwgImZvb19iYXIsYmF6LnF1eiIpLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgVG9TdHJpbmcoY29uc3QgRmllbGRNYXNrJiBtYXNrKTsKKyAgc3RhdGljIHZvaWQgRnJvbVN0cmluZyhTdHJpbmdQaWVjZSBzdHIsIEZpZWxkTWFzayogb3V0KTsKKworICAvLyBQb3B1bGF0ZXMgdGhlIEZpZWxkTWFzayB3aXRoIHRoZSBwYXRocyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWVsZHMgd2l0aCB0aGUKKyAgLy8gZ2l2ZW4gbnVtYmVycywgYWZ0ZXIgY2hlY2tpbmcgdGhhdCBhbGwgZmllbGQgbnVtYmVycyBhcmUgdmFsaWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgdm9pZCBGcm9tRmllbGROdW1iZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiBmaWVsZF9udW1iZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkTWFzayogb3V0KSB7CisgICAgZm9yIChjb25zdCBhdXRvIGZpZWxkX251bWJlciA6IGZpZWxkX251bWJlcnMpIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzYyA9CisgICAgICAgICAgVDo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU51bWJlcihmaWVsZF9udW1iZXIpOworICAgICAgR09PR0xFX0NIRUNLKGZpZWxkX2Rlc2MgIT0gbnVsbHB0cikKKyAgICAgICAgICA8PCAiSW52YWxpZCBmaWVsZCBudW1iZXIgZm9yICIgPDwgVDo6ZGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKSA8PCAiOiAiCisgICAgICAgICAgPDwgZmllbGRfbnVtYmVyOworICAgICAgQWRkUGF0aFRvRmllbGRNYXNrPFQ+KGZpZWxkX2Rlc2MtPmxvd2VyY2FzZV9uYW1lKCksIG91dCk7CisgICAgfQorICB9CisKKyAgLy8gQ29udmVydHMgRmllbGRNYXNrIHRvL2Zyb20gc3RyaW5nLCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHByb3RvMyBKU09OCisgIC8vIHNwZWMgZm9yIEZpZWxkTWFzayAoZS5nLiwgImZvb0JhcixiYXoucXV6IikuIElmIHRoZSBmaWVsZCBuYW1lIGlzIG5vdAorICAvLyBzdHlsZSBjb25mb3JtaW5nIChpLmUuLCBub3Qgc25ha2VfY2FzZSB3aGVuIGNvbnZlcnRlZCB0byBzdHJpbmcsIG9yIG5vdAorICAvLyBjYW1lbENhc2Ugd2hlbiBjb252ZXJ0ZWQgZnJvbSBzdHJpbmcpLCB0aGUgY29udmVyc2lvbiB3aWxsIGZhaWwuCisgIHN0YXRpYyBib29sIFRvSnNvblN0cmluZyhjb25zdCBGaWVsZE1hc2smIG1hc2ssIHN0ZDo6c3RyaW5nKiBvdXQpOworICBzdGF0aWMgYm9vbCBGcm9tSnNvblN0cmluZyhTdHJpbmdQaWVjZSBzdHIsIEZpZWxkTWFzayogb3V0KTsKKworICAvLyBHZXQgdGhlIGRlc2NyaXB0b3JzIG9mIHRoZSBmaWVsZHMgd2hpY2ggdGhlIGdpdmVuIHBhdGggZnJvbSB0aGUgbWVzc2FnZQorICAvLyBkZXNjcmlwdG9yIHRyYXZlcnNlcywgaWYgZmllbGRfZGVzY3JpcHRvcnMgaXMgbm90IG51bGwuCisgIC8vIFJldHVybiBmYWxzZSBpZiB0aGUgcGF0aCBpcyBub3QgdmFsaWQsIGFuZCB0aGUgY29udGVudCBvZiBmaWVsZF9kZXNjcmlwdG9ycworICAvLyBpcyB1bnNwZWNpZmllZC4KKyAgc3RhdGljIGJvb2wgR2V0RmllbGREZXNjcmlwdG9ycygKKyAgICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIFN0cmluZ1BpZWNlIHBhdGgsCisgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogZmllbGRfZGVzY3JpcHRvcnMpOworCisgIC8vIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGlzIHZhbGlkIGZvciB0eXBlIFQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgYm9vbCBJc1ZhbGlkUGF0aChTdHJpbmdQaWVjZSBwYXRoKSB7CisgICAgcmV0dXJuIEdldEZpZWxkRGVzY3JpcHRvcnMoVDo6ZGVzY3JpcHRvcigpLCBwYXRoLCBudWxscHRyKTsKKyAgfQorCisgIC8vIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBGaWVsZE1hc2sgaXMgdmFsaWQgZm9yIHR5cGUgVC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBib29sIElzVmFsaWRGaWVsZE1hc2soY29uc3QgRmllbGRNYXNrJiBtYXNrKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXNrLnBhdGhzX3NpemUoKTsgKytpKSB7CisgICAgICBpZiAoIUdldEZpZWxkRGVzY3JpcHRvcnMoVDo6ZGVzY3JpcHRvcigpLCBtYXNrLnBhdGhzKGkpLCBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gQWRkcyBhIHBhdGggdG8gRmllbGRNYXNrIGFmdGVyIGNoZWNraW5nIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgdmFsaWQuCisgIC8vIFRoaXMgbWV0aG9kIGNoZWNrLWZhaWxzIGlmIHRoZSBwYXRoIGlzIG5vdCBhIHZhbGlkIHBhdGggZm9yIHR5cGUgVC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyB2b2lkIEFkZFBhdGhUb0ZpZWxkTWFzayhTdHJpbmdQaWVjZSBwYXRoLCBGaWVsZE1hc2sqIG1hc2spIHsKKyAgICBHT09HTEVfQ0hFQ0soSXNWYWxpZFBhdGg8VD4ocGF0aCkpIDw8IHBhdGg7CisgICAgbWFzay0+YWRkX3BhdGhzKHN0ZDo6c3RyaW5nKHBhdGgpKTsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGaWVsZE1hc2sgd2l0aCBhbGwgZmllbGRzIG9mIHR5cGUgVC4gVGhpcyBGaWVsZE1hc2sgb25seQorICAvLyBjb250YWlucyBmaWVsZHMgb2YgVCBidXQgbm90IGFueSBzdWItbWVzc2FnZSBmaWVsZHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgRmllbGRNYXNrIEdldEZpZWxkTWFza0ZvckFsbEZpZWxkcygpIHsKKyAgICBGaWVsZE1hc2sgb3V0OworICAgIEdldEZpZWxkTWFza0ZvckFsbEZpZWxkcyhUOjpkZXNjcmlwdG9yKCksICZvdXQpOworICAgIHJldHVybiBvdXQ7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX0RFUFJFQ0FURURfTVNHKCJVc2UgKm91dCA9IEdldEZpZWxkTWFza0ZvckFsbEZpZWxkcygpIGluc3RlYWQiKQorICBzdGF0aWMgdm9pZCBHZXRGaWVsZE1hc2tGb3JBbGxGaWVsZHMoRmllbGRNYXNrKiBvdXQpIHsKKyAgICBHZXRGaWVsZE1hc2tGb3JBbGxGaWVsZHMoVDo6ZGVzY3JpcHRvcigpLCBvdXQpOworICB9CisgIC8vIFRoaXMgZmxhdm9yIHRha2VzIHRoZSBwcm90b2J1ZiB0eXBlIGRlc2NyaXB0b3IgYXMgYW4gYXJndW1lbnQuCisgIC8vIFVzZWZ1bCB3aGVuIHRoZSB0eXBlIGlzIG5vdCBrbm93biBhdCBjb21waWxlIHRpbWUuCisgIHN0YXRpYyB2b2lkIEdldEZpZWxkTWFza0ZvckFsbEZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRNYXNrKiBvdXQpOworCisgIC8vIENvbnZlcnRzIGEgRmllbGRNYXNrIHRvIHRoZSBjYW5vbmljYWwgZm9ybS4gSXQgd2lsbDoKKyAgLy8gICAxLiBSZW1vdmUgcGF0aHMgdGhhdCBhcmUgY292ZXJlZCBieSBhbm90aGVyIHBhdGguIEZvciBleGFtcGxlLAorICAvLyAgICAgICJmb28uYmFyIiBpcyBjb3ZlcmVkIGJ5ICJmb28iIGFuZCB3aWxsIGJlIHJlbW92ZWQgaWYgImZvbyIKKyAgLy8gICAgICBpcyBhbHNvIGluIHRoZSBGaWVsZE1hc2suCisgIC8vICAgMi4gU29ydCBhbGwgcGF0aHMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgorICBzdGF0aWMgdm9pZCBUb0Nhbm9uaWNhbEZvcm0oY29uc3QgRmllbGRNYXNrJiBtYXNrLCBGaWVsZE1hc2sqIG91dCk7CisKKyAgLy8gQ3JlYXRlcyBhbiB1bmlvbiBvZiB0d28gRmllbGRNYXNrcy4KKyAgc3RhdGljIHZvaWQgVW5pb24oY29uc3QgRmllbGRNYXNrJiBtYXNrMSwgY29uc3QgRmllbGRNYXNrJiBtYXNrMiwKKyAgICAgICAgICAgICAgICAgICAgRmllbGRNYXNrKiBvdXQpOworCisgIC8vIENyZWF0ZXMgYW4gaW50ZXJzZWN0aW9uIG9mIHR3byBGaWVsZE1hc2tzLgorICBzdGF0aWMgdm9pZCBJbnRlcnNlY3QoY29uc3QgRmllbGRNYXNrJiBtYXNrMSwgY29uc3QgRmllbGRNYXNrJiBtYXNrMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkTWFzayogb3V0KTsKKworICAvLyBTdWJ0cmFjdHMgbWFzazIgZnJvbSBtYXNrMSBiYXNlIG9mIHR5cGUgVC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyB2b2lkIFN1YnRyYWN0KGNvbnN0IEZpZWxkTWFzayYgbWFzazEsIGNvbnN0IEZpZWxkTWFzayYgbWFzazIsCisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkTWFzayogb3V0KSB7CisgICAgU3VidHJhY3QoVDo6ZGVzY3JpcHRvcigpLCBtYXNrMSwgbWFzazIsIG91dCk7CisgIH0KKyAgLy8gVGhpcyBmbGF2b3IgdGFrZXMgdGhlIHByb3RvYnVmIHR5cGUgZGVzY3JpcHRvciBhcyBhbiBhcmd1bWVudC4KKyAgLy8gVXNlZnVsIHdoZW4gdGhlIHR5cGUgaXMgbm90IGtub3duIGF0IGNvbXBpbGUgdGltZS4KKyAgc3RhdGljIHZvaWQgU3VidHJhY3QoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgRmllbGRNYXNrJiBtYXNrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGRNYXNrJiBtYXNrMiwgRmllbGRNYXNrKiBvdXQpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBwYXRoIGlzIGNvdmVyZWQgYnkgdGhlIGdpdmVuIEZpZWxkTWFzay4gTm90ZSB0aGF0IHBhdGgKKyAgLy8gImZvby5iYXIiIGNvdmVycyBhbGwgcGF0aHMgbGlrZSAiZm9vLmJhci5iYXoiLCAiZm9vLmJhci5xdXoueCIsIGV0Yy4KKyAgLy8gQWxzbyBub3RlIHRoYXQgcGFyZW50IHBhdGhzIGFyZSBub3QgY292ZXJlZCBieSBleHBsaWNpdCBjaGlsZCBwYXRoLCBpLmUuCisgIC8vICJmb28uYmFyIiBkb2VzIE5PVCBjb3ZlciAiZm9vIiwgZXZlbiBpZiAiYmFyIiBpcyB0aGUgb25seSBjaGlsZC4KKyAgc3RhdGljIGJvb2wgSXNQYXRoSW5GaWVsZE1hc2soU3RyaW5nUGllY2UgcGF0aCwgY29uc3QgRmllbGRNYXNrJiBtYXNrKTsKKworICBjbGFzcyBNZXJnZU9wdGlvbnM7CisgIC8vIE1lcmdlcyBmaWVsZHMgc3BlY2lmaWVkIGluIGEgRmllbGRNYXNrIGludG8gYW5vdGhlciBtZXNzYWdlLgorICBzdGF0aWMgdm9pZCBNZXJnZU1lc3NhZ2VUbyhjb25zdCBNZXNzYWdlJiBzb3VyY2UsIGNvbnN0IEZpZWxkTWFzayYgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVyZ2VPcHRpb25zJiBvcHRpb25zLCBNZXNzYWdlKiBkZXN0aW5hdGlvbik7CisKKyAgY2xhc3MgVHJpbU9wdGlvbnM7CisgIC8vIFJlbW92ZXMgZnJvbSAnbWVzc2FnZScgYW55IGZpZWxkIHRoYXQgaXMgbm90IHJlcHJlc2VudGVkIGluIHRoZSBnaXZlbgorICAvLyBGaWVsZE1hc2suIElmIHRoZSBGaWVsZE1hc2sgaXMgZW1wdHksIGRvZXMgbm90aGluZy4KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtZXNzYWdlIGlzIG1vZGlmaWVkLgorICBzdGF0aWMgYm9vbCBUcmltTWVzc2FnZShjb25zdCBGaWVsZE1hc2smIG1hc2ssIE1lc3NhZ2UqIG1lc3NhZ2UpOworCisgIC8vIFJlbW92ZXMgZnJvbSAnbWVzc2FnZScgYW55IGZpZWxkIHRoYXQgaXMgbm90IHJlcHJlc2VudGVkIGluIHRoZSBnaXZlbgorICAvLyBGaWVsZE1hc2sgd2l0aCBjdXN0b21pemVkIFRyaW1PcHRpb25zLgorICAvLyBJZiB0aGUgRmllbGRNYXNrIGlzIGVtcHR5LCBkb2VzIG5vdGhpbmcuCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWVzc2FnZSBpcyBtb2RpZmllZC4KKyAgc3RhdGljIGJvb2wgVHJpbU1lc3NhZ2UoY29uc3QgRmllbGRNYXNrJiBtYXNrLCBNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmltT3B0aW9ucyYgb3B0aW9ucyk7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU25ha2VDYXNlQ2FtZWxDYXNlVGVzdDsKKyAgLy8gQ29udmVydHMgYSBmaWVsZCBuYW1lIGZyb20gc25ha2VfY2FzZSB0byBjYW1lbENhc2U6CisgIC8vICAgMS4gRXZlcnkgY2hhcmFjdGVyIGFmdGVyICJfIiB3aWxsIGJlIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuCisgIC8vICAgMi4gQWxsICJfInMgYXJlIHJlbW92ZWQuCisgIC8vIFRoZSBjb252ZXJzaW9uIHdpbGwgZmFpbCBpZjoKKyAgLy8gICAxLiBUaGUgZmllbGQgbmFtZSBjb250YWlucyB1cHBlcmNhc2UgbGV0dGVycy4KKyAgLy8gICAyLiBBbnkgY2hhcmFjdGVyIGFmdGVyIGEgIl8iIGlzIG5vdCBhIGxvd2VyY2FzZSBsZXR0ZXIuCisgIC8vIElmIHRoZSBjb252ZXJzaW9uIHN1Y2NlZWRzLCBpdCdzIGd1YXJhbnRlZWQgdGhhdCB0aGUgcmVzdWx0ZWQKKyAgLy8gY2FtZWxDYXNlIG5hbWUgd2lsbCB5aWVsZCB0aGUgb3JpZ2luYWwgc25ha2VfY2FzZSBuYW1lIHdoZW4KKyAgLy8gY29udmVydGVkIHVzaW5nIENhbWVsQ2FzZVRvU25ha2VDYXNlKCkuCisgIC8vCisgIC8vIE5vdGUgdGhhdCB0aGUgaW5wdXQgY2FuIGNvbnRhaW4gY2hhcmFjdGVycyBub3QgYWxsb3dlZCBpbiBDIGlkZW50aWZpZXJzLgorICAvLyBGb3IgZXhhbXBsZSwgImZvb19iYXIsYmF6X3F1eiIgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gImZvb0JhcixiYXpRdXoiCisgIC8vIHN1Y2Nlc3NmdWxseS4KKyAgc3RhdGljIGJvb2wgU25ha2VDYXNlVG9DYW1lbENhc2UoU3RyaW5nUGllY2UgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRwdXQpOworICAvLyBDb252ZXJ0cyBhIGZpZWxkIG5hbWUgZnJvbSBjYW1lbENhc2UgdG8gc25ha2VfY2FzZToKKyAgLy8gICAxLiBFdmVyeSB1cHBlcmNhc2UgbGV0dGVyIGlzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2Ugd2l0aCBhbiBhZGRpdGlvbmFsCisgIC8vICAgICAgcHJlY2VkaW5nICJfIi4KKyAgLy8gVGhlIGNvbnZlcnNpb24gd2lsbCBmYWlsIGlmOgorICAvLyAgIDEuIFRoZSBmaWVsZCBuYW1lIGNvbnRhaW5zICJfInMuCisgIC8vIElmIHRoZSBjb252ZXJzaW9uIHN1Y2NlZWRzLCBpdCdzIGd1YXJhbnRlZWQgdGhhdCB0aGUgcmVzdWx0ZWQKKyAgLy8gc25ha2VfY2FzZSBuYW1lIHdpbGwgeWllbGQgdGhlIG9yaWdpbmFsIGNhbWVsQ2FzZSBuYW1lIHdoZW4KKyAgLy8gY29udmVydGVkIHVzaW5nIFNuYWtlQ2FzZVRvQ2FtZWxDYXNlKCkuCisgIC8vCisgIC8vIE5vdGUgdGhhdCB0aGUgaW5wdXQgY2FuIGNvbnRhaW4gY2hhcmFjdGVycyBub3QgYWxsb3dlZCBpbiBDIGlkZW50aWZpZXJzLgorICAvLyBGb3IgZXhhbXBsZSwgImZvb0JhcixiYXpRdXoiIHdpbGwgYmUgY29udmVydGVkIHRvICJmb29fYmFyLGJhel9xdXoiCisgIC8vIHN1Y2Nlc3NmdWxseS4KKyAgc3RhdGljIGJvb2wgQ2FtZWxDYXNlVG9TbmFrZUNhc2UoU3RyaW5nUGllY2UgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRwdXQpOworfTsKKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEZpZWxkTWFza1V0aWw6Ok1lcmdlT3B0aW9ucyB7CisgcHVibGljOgorICBNZXJnZU9wdGlvbnMoKQorICAgICAgOiByZXBsYWNlX21lc3NhZ2VfZmllbGRzXyhmYWxzZSksIHJlcGxhY2VfcmVwZWF0ZWRfZmllbGRzXyhmYWxzZSkge30KKyAgLy8gV2hlbiBtZXJnaW5nIG1lc3NhZ2UgZmllbGRzLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBtZXJnZSB0aGUKKyAgLy8gY29udGVudCBvZiB0d28gbWVzc2FnZSBmaWVsZHMgdG9nZXRoZXIuIElmIHlvdSBpbnN0ZWFkIHdhbnQgdG8gdXNlCisgIC8vIHRoZSBmaWVsZCBmcm9tIHRoZSBzb3VyY2UgbWVzc2FnZSB0byByZXBsYWNlIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkCisgIC8vIGluIHRoZSBkZXN0aW5hdGlvbiBtZXNzYWdlLCBzZXQgdGhpcyBmbGFnIHRvIHRydWUuIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwKKyAgLy8gc3BlY2lmaWVkIHN1Ym1lc3NhZ2UgZmllbGRzIHRoYXQgYXJlIG1pc3NpbmcgaW4gc291cmNlIHdpbGwgYmUgY2xlYXJlZCBpbgorICAvLyBkZXN0aW5hdGlvbi4KKyAgdm9pZCBzZXRfcmVwbGFjZV9tZXNzYWdlX2ZpZWxkcyhib29sIHZhbHVlKSB7CisgICAgcmVwbGFjZV9tZXNzYWdlX2ZpZWxkc18gPSB2YWx1ZTsKKyAgfQorICBib29sIHJlcGxhY2VfbWVzc2FnZV9maWVsZHMoKSBjb25zdCB7IHJldHVybiByZXBsYWNlX21lc3NhZ2VfZmllbGRzXzsgfQorICAvLyBUaGUgZGVmYXVsdCBtZXJnaW5nIGJlaGF2aW9yIHdpbGwgYXBwZW5kIGVudHJpZXMgZnJvbSB0aGUgc291cmNlCisgIC8vIHJlcGVhdGVkIGZpZWxkIHRvIHRoZSBkZXN0aW5hdGlvbiByZXBlYXRlZCBmaWVsZC4gSWYgeW91IG9ubHkgd2FudAorICAvLyB0byBrZWVwIHRoZSBlbnRyaWVzIGZyb20gdGhlIHNvdXJjZSByZXBlYXRlZCBmaWVsZCwgc2V0IHRoaXMgZmxhZworICAvLyB0byB0cnVlLgorICB2b2lkIHNldF9yZXBsYWNlX3JlcGVhdGVkX2ZpZWxkcyhib29sIHZhbHVlKSB7CisgICAgcmVwbGFjZV9yZXBlYXRlZF9maWVsZHNfID0gdmFsdWU7CisgIH0KKyAgYm9vbCByZXBsYWNlX3JlcGVhdGVkX2ZpZWxkcygpIGNvbnN0IHsgcmV0dXJuIHJlcGxhY2VfcmVwZWF0ZWRfZmllbGRzXzsgfQorCisgcHJpdmF0ZToKKyAgYm9vbCByZXBsYWNlX21lc3NhZ2VfZmllbGRzXzsKKyAgYm9vbCByZXBsYWNlX3JlcGVhdGVkX2ZpZWxkc187Cit9OworCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRmllbGRNYXNrVXRpbDo6VHJpbU9wdGlvbnMgeworIHB1YmxpYzoKKyAgVHJpbU9wdGlvbnMoKSA6IGtlZXBfcmVxdWlyZWRfZmllbGRzXyhmYWxzZSkge30KKyAgLy8gV2hlbiB0cmltbWluZyBtZXNzYWdlIGZpZWxkcywgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gdHJpbSByZXF1aXJlZAorICAvLyBmaWVsZHMgb2YgdGhlIHByZXNlbnQgbWVzc2FnZSBpZiB0aGV5IGFyZSBub3Qgc3BlY2lmaWVkIGluIHRoZSBmaWVsZCBtYXNrLgorICAvLyBJZiB5b3UgaW5zdGVhZCB3YW50IHRvIGtlZXAgcmVxdWlyZWQgZmllbGRzIG9mIHRoZSBwcmVzZW50IG1lc3NhZ2UgZXZlbgorICAvLyB3aGVuIHRoZXkgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGZpZWxkIG1hc2ssIHNldCB0aGlzIGZsYWcgdG8gdHJ1ZS4KKyAgdm9pZCBzZXRfa2VlcF9yZXF1aXJlZF9maWVsZHMoYm9vbCB2YWx1ZSkgeyBrZWVwX3JlcXVpcmVkX2ZpZWxkc18gPSB2YWx1ZTsgfQorICBib29sIGtlZXBfcmVxdWlyZWRfZmllbGRzKCkgY29uc3QgeyByZXR1cm4ga2VlcF9yZXF1aXJlZF9maWVsZHNfOyB9CisKKyBwcml2YXRlOgorICBib29sIGtlZXBfcmVxdWlyZWRfZmllbGRzXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9GSUVMRF9NQVNLX1VUSUxfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsX3Rlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhZDczOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWxfdGVzdC5jYwpAQCAtMCwwICsxLDgzNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWwuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKKworY2xhc3MgU25ha2VDYXNlQ2FtZWxDYXNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RkOjpzdHJpbmcgU25ha2VDYXNlVG9DYW1lbENhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0KSB7CisgICAgc3RkOjpzdHJpbmcgb3V0cHV0OworICAgIGlmIChGaWVsZE1hc2tVdGlsOjpTbmFrZUNhc2VUb0NhbWVsQ2FzZShpbnB1dCwgJm91dHB1dCkpIHsKKyAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiI0ZBSUwjIjsKKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBDYW1lbENhc2VUb1NuYWtlQ2FzZShjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQpIHsKKyAgICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisgICAgaWYgKEZpZWxkTWFza1V0aWw6OkNhbWVsQ2FzZVRvU25ha2VDYXNlKGlucHV0LCAmb3V0cHV0KSkgeworICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICIjRkFJTCMiOworICAgIH0KKyAgfQorfTsKKworbmFtZXNwYWNlIHsKKworVEVTVF9GKFNuYWtlQ2FzZUNhbWVsQ2FzZVRlc3QsIFNuYWtlVG9DYW1lbCkgeworICBFWFBFQ1RfRVEoImZvb0JhciIsIFNuYWtlQ2FzZVRvQ2FtZWxDYXNlKCJmb29fYmFyIikpOworICBFWFBFQ1RfRVEoIkZvb0JhciIsIFNuYWtlQ2FzZVRvQ2FtZWxDYXNlKCJfZm9vX2JhciIpKTsKKyAgRVhQRUNUX0VRKCJmb28zQmFyIiwgU25ha2VDYXNlVG9DYW1lbENhc2UoImZvbzNfYmFyIikpOworICAvLyBObyB1cHBlcmNhc2UgbGV0dGVyIGlzIGFsbG93ZWQuCisgIEVYUEVDVF9FUSgiI0ZBSUwjIiwgU25ha2VDYXNlVG9DYW1lbENhc2UoIkZvbyIpKTsKKyAgLy8gQW55IGNoYXJhY3RlciBhZnRlciBhICJfIiBtdXN0IGJlIGEgbG93ZXJjYXNlIGxldHRlci4KKyAgLy8gICAxLiAiXyIgY2Fubm90IGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgIl8iLgorICAvLyAgIDIuICJfIiBjYW5ub3QgYmUgZm9sbG93ZWQgYnkgYSBkaWdpdC4KKyAgLy8gICAzLiAiXyIgY2Fubm90IGFwcGVhciBhcyB0aGUgbGFzdCBjaGFyYWN0ZXIuCisgIEVYUEVDVF9FUSgiI0ZBSUwjIiwgU25ha2VDYXNlVG9DYW1lbENhc2UoImZvb19fYmFyIikpOworICBFWFBFQ1RfRVEoIiNGQUlMIyIsIFNuYWtlQ2FzZVRvQ2FtZWxDYXNlKCJmb29fM2JhciIpKTsKKyAgRVhQRUNUX0VRKCIjRkFJTCMiLCBTbmFrZUNhc2VUb0NhbWVsQ2FzZSgiZm9vX2Jhcl8iKSk7Cit9CisKK1RFU1RfRihTbmFrZUNhc2VDYW1lbENhc2VUZXN0LCBDYW1lbFRvU25ha2UpIHsKKyAgRVhQRUNUX0VRKCJmb29fYmFyIiwgQ2FtZWxDYXNlVG9TbmFrZUNhc2UoImZvb0JhciIpKTsKKyAgRVhQRUNUX0VRKCJfZm9vX2JhciIsIENhbWVsQ2FzZVRvU25ha2VDYXNlKCJGb29CYXIiKSk7CisgIEVYUEVDVF9FUSgiZm9vM19iYXIiLCBDYW1lbENhc2VUb1NuYWtlQ2FzZSgiZm9vM0JhciIpKTsKKyAgLy8gIl8icyBhcmUgbm90IGFsbG93ZWQuCisgIEVYUEVDVF9FUSgiI0ZBSUwjIiwgQ2FtZWxDYXNlVG9TbmFrZUNhc2UoImZvb19iYXIiKSk7Cit9CisKK1RFU1RfRihTbmFrZUNhc2VDYW1lbENhc2VUZXN0LCBSb3VuZFRyaXBUZXN0KSB7CisgIC8vIEVudW1lcmF0ZXMgYWxsIHBvc3NpYmxlIHNuYWtlX2Nhc2UgbmFtZXMgYW5kIHRlc3QgdGhhdCBjb252ZXJ0aW5nIGl0IHRvCisgIC8vIGNhbWVsQ2FzZSBhbmQgdGhlbiB0byBzbmFrZV9jYXNlIGFnYWluIHdpbGwgeWllbGQgdGhlIG9yaWdpbmFsIG5hbWUuCisgIHN0ZDo6c3RyaW5nIG5hbWUgPSAiX19fYWJjMTIzIjsKKyAgc3RkOjpzb3J0KG5hbWUuYmVnaW4oKSwgbmFtZS5lbmQoKSk7CisgIGRvIHsKKyAgICBzdGQ6OnN0cmluZyBjYW1lbE5hbWUgPSBTbmFrZUNhc2VUb0NhbWVsQ2FzZShuYW1lKTsKKyAgICBpZiAoY2FtZWxOYW1lICE9ICIjRkFJTCMiKSB7CisgICAgICBFWFBFQ1RfRVEobmFtZSwgQ2FtZWxDYXNlVG9TbmFrZUNhc2UoY2FtZWxOYW1lKSk7CisgICAgfQorICB9IHdoaWxlIChzdGQ6Om5leHRfcGVybXV0YXRpb24obmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpKSk7CisKKyAgLy8gRW51bWVyYXRlcyBhbGwgcG9zc2libGUgY2FtZWxDYXNlIG5hbWVzIGFuZCB0ZXN0IHRoYXQgY29udmVydGluZyBpdCB0bworICAvLyBzbmFrZV9jYXNlIGFuZCB0aGVuIHRvIGNhbWVsQ2FzZSBhZ2FpbiB3aWxsIHlpZWxkIHRoZSBvcmlnaW5hbCBuYW1lLgorICBuYW1lID0gImFiY0FCQzEyMyI7CisgIHN0ZDo6c29ydChuYW1lLmJlZ2luKCksIG5hbWUuZW5kKCkpOworICBkbyB7CisgICAgc3RkOjpzdHJpbmcgY2FtZWxOYW1lID0gQ2FtZWxDYXNlVG9TbmFrZUNhc2UobmFtZSk7CisgICAgaWYgKGNhbWVsTmFtZSAhPSAiI0ZBSUwjIikgeworICAgICAgRVhQRUNUX0VRKG5hbWUsIFNuYWtlQ2FzZVRvQ2FtZWxDYXNlKGNhbWVsTmFtZSkpOworICAgIH0KKyAgfSB3aGlsZSAoc3RkOjpuZXh0X3Blcm11dGF0aW9uKG5hbWUuYmVnaW4oKSwgbmFtZS5lbmQoKSkpOworfQorCit1c2luZyBnb29nbGU6OnByb3RvYnVmOjpGaWVsZE1hc2s7Cit1c2luZyBwcm90b2J1Zl91bml0dGVzdDo6TmVzdGVkVGVzdEFsbFR5cGVzOwordXNpbmcgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczsKK3VzaW5nIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ7Cit1c2luZyBwcm90b2J1Zl91bml0dGVzdDo6VGVzdFJlcXVpcmVkTWVzc2FnZTsKKworVEVTVChGaWVsZE1hc2tVdGlsVGVzdCwgU3RyaW5nRm9ybWF0KSB7CisgIEZpZWxkTWFzayBtYXNrOworICBFWFBFQ1RfRVEoIiIsIEZpZWxkTWFza1V0aWw6OlRvU3RyaW5nKG1hc2spKTsKKyAgbWFzay5hZGRfcGF0aHMoImZvb19iYXIiKTsKKyAgRVhQRUNUX0VRKCJmb29fYmFyIiwgRmllbGRNYXNrVXRpbDo6VG9TdHJpbmcobWFzaykpOworICBtYXNrLmFkZF9wYXRocygiYmF6X3F1eiIpOworICBFWFBFQ1RfRVEoImZvb19iYXIsYmF6X3F1eiIsIEZpZWxkTWFza1V0aWw6OlRvU3RyaW5nKG1hc2spKTsKKworICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCIiLCAmbWFzayk7CisgIEVYUEVDVF9FUSgwLCBtYXNrLnBhdGhzX3NpemUoKSk7CisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoImZvb0JhciIsICZtYXNrKTsKKyAgRVhQRUNUX0VRKDEsIG1hc2sucGF0aHNfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29CYXIiLCBtYXNrLnBhdGhzKDApKTsKKyAgRmllbGRNYXNrVXRpbDo6RnJvbVN0cmluZygiZm9vQmFyLGJhelF1eiIsICZtYXNrKTsKKyAgRVhQRUNUX0VRKDIsIG1hc2sucGF0aHNfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29CYXIiLCBtYXNrLnBhdGhzKDApKTsKKyAgRVhQRUNUX0VRKCJiYXpRdXoiLCBtYXNrLnBhdGhzKDEpKTsKK30KKworVEVTVChGaWVsZE1hc2tVdGlsVGVzdCwgSnNvblN0cmluZ0Zvcm1hdCkgeworICBGaWVsZE1hc2sgbWFzazsKKyAgc3RkOjpzdHJpbmcgdmFsdWU7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OlRvSnNvblN0cmluZyhtYXNrLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKCIiLCB2YWx1ZSk7CisgIG1hc2suYWRkX3BhdGhzKCJmb29fYmFyIik7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OlRvSnNvblN0cmluZyhtYXNrLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKCJmb29CYXIiLCB2YWx1ZSk7CisgIG1hc2suYWRkX3BhdGhzKCJiYXJfcXV6Iik7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OlRvSnNvblN0cmluZyhtYXNrLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKCJmb29CYXIsYmFyUXV6IiwgdmFsdWUpOworCisgIEZpZWxkTWFza1V0aWw6OkZyb21Kc29uU3RyaW5nKCIiLCAmbWFzayk7CisgIEVYUEVDVF9FUSgwLCBtYXNrLnBhdGhzX3NpemUoKSk7CisgIEZpZWxkTWFza1V0aWw6OkZyb21Kc29uU3RyaW5nKCJmb29CYXIiLCAmbWFzayk7CisgIEVYUEVDVF9FUSgxLCBtYXNrLnBhdGhzX3NpemUoKSk7CisgIEVYUEVDVF9FUSgiZm9vX2JhciIsIG1hc2sucGF0aHMoMCkpOworICBGaWVsZE1hc2tVdGlsOjpGcm9tSnNvblN0cmluZygiZm9vQmFyLGJhelF1eiIsICZtYXNrKTsKKyAgRVhQRUNUX0VRKDIsIG1hc2sucGF0aHNfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29fYmFyIiwgbWFzay5wYXRocygwKSk7CisgIEVYUEVDVF9FUSgiYmF6X3F1eiIsIG1hc2sucGF0aHMoMSkpOworfQorCitURVNUKEZpZWxkTWFza1V0aWxUZXN0LCBGcm9tRmllbGROdW1iZXJzKSB7CisgIEZpZWxkTWFzayBtYXNrOworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBmaWVsZF9udW1iZXJzID0geworICAgICAgVGVzdEFsbFR5cGVzOjprT3B0aW9uYWxJbnQ2NEZpZWxkTnVtYmVyLAorICAgICAgVGVzdEFsbFR5cGVzOjprT3B0aW9uYWxCb29sRmllbGROdW1iZXIsCisgICAgICBUZXN0QWxsVHlwZXM6OmtSZXBlYXRlZFN0cmluZ0ZpZWxkTnVtYmVyLAorICB9OworICBGaWVsZE1hc2tVdGlsOjpGcm9tRmllbGROdW1iZXJzPFRlc3RBbGxUeXBlcz4oZmllbGRfbnVtYmVycywgJm1hc2spOworICBBU1NFUlRfRVEoMywgbWFzay5wYXRoc19zaXplKCkpOworICBFWFBFQ1RfRVEoIm9wdGlvbmFsX2ludDY0IiwgbWFzay5wYXRocygwKSk7CisgIEVYUEVDVF9FUSgib3B0aW9uYWxfYm9vbCIsIG1hc2sucGF0aHMoMSkpOworICBFWFBFQ1RfRVEoInJlcGVhdGVkX3N0cmluZyIsIG1hc2sucGF0aHMoMikpOworfQorCitURVNUKEZpZWxkTWFza1V0aWxUZXN0LCBHZXRGaWVsZERlc2NyaXB0b3JzKSB7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkX2Rlc2NyaXB0b3JzOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpHZXRGaWVsZERlc2NyaXB0b3JzKAorICAgICAgVGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCksICJvcHRpb25hbF9pbnQzMiIsICZmaWVsZF9kZXNjcmlwdG9ycykpOworICBFWFBFQ1RfRVEoMSwgZmllbGRfZGVzY3JpcHRvcnMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJvcHRpb25hbF9pbnQzMiIsIGZpZWxkX2Rlc2NyaXB0b3JzWzBdLT5uYW1lKCkpOworICBFWFBFQ1RfRkFMU0UoRmllbGRNYXNrVXRpbDo6R2V0RmllbGREZXNjcmlwdG9ycygKKyAgICAgIFRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpLCAib3B0aW9uYWxfbm9uZXhpc3QiLCBudWxscHRyKSk7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OkdldEZpZWxkRGVzY3JpcHRvcnMoVGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfZGVzY3JpcHRvcnMpKTsKKyAgRVhQRUNUX0VRKDIsIGZpZWxkX2Rlc2NyaXB0b3JzLnNpemUoKSk7CisgIEVYUEVDVF9FUSgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiLCBmaWVsZF9kZXNjcmlwdG9yc1swXS0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYiIsIGZpZWxkX2Rlc2NyaXB0b3JzWzFdLT5uYW1lKCkpOworICBFWFBFQ1RfRkFMU0UoRmllbGRNYXNrVXRpbDo6R2V0RmllbGREZXNjcmlwdG9ycygKKyAgICAgIFRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpLCAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Uubm9uZXhpc3QiLCBudWxscHRyKSk7CisgIC8vIEZpZWxkTWFzayBjYW5ub3QgYmUgdXNlZCB0byBzcGVjaWZ5IHN1Yi1maWVsZHMgb2YgYSByZXBlYXRlZCBtZXNzYWdlLgorICBFWFBFQ1RfRkFMU0UoRmllbGRNYXNrVXRpbDo6R2V0RmllbGREZXNjcmlwdG9ycygKKyAgICAgIFRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpLCAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYmIiLCBudWxscHRyKSk7Cit9CisKK1RFU1QoRmllbGRNYXNrVXRpbFRlc3QsIFRlc3RJc1ZhaWxkUGF0aCkgeworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1ZhbGlkUGF0aDxUZXN0QWxsVHlwZXM+KCJvcHRpb25hbF9pbnQzMiIpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpZWxkTWFza1V0aWw6OklzVmFsaWRQYXRoPFRlc3RBbGxUeXBlcz4oIm9wdGlvbmFsX25vbmV4aXN0IikpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEZpZWxkTWFza1V0aWw6OklzVmFsaWRQYXRoPFRlc3RBbGxUeXBlcz4oIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiIikpOworICBFWFBFQ1RfRkFMU0UoRmllbGRNYXNrVXRpbDo6SXNWYWxpZFBhdGg8VGVzdEFsbFR5cGVzPigKKyAgICAgICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5ub25leGlzdCIpKTsKKyAgLy8gRmllbGRNYXNrIGNhbm5vdCBiZSB1c2VkIHRvIHNwZWNpZnkgc3ViLWZpZWxkcyBvZiBhIHJlcGVhdGVkIG1lc3NhZ2UuCisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIEZpZWxkTWFza1V0aWw6OklzVmFsaWRQYXRoPFRlc3RBbGxUeXBlcz4oInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmJiIikpOworfQorCitURVNUKEZpZWxkTWFza1V0aWxUZXN0LCBUZXN0SXNWYWxpZEZpZWxkTWFzaykgeworICBGaWVsZE1hc2sgbWFzazsKKyAgRmllbGRNYXNrVXRpbDo6RnJvbVN0cmluZygib3B0aW9uYWxfaW50MzIsb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIiLCAmbWFzayk7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OklzVmFsaWRGaWVsZE1hc2s8VGVzdEFsbFR5cGVzPihtYXNrKSk7CisKKyAgRmllbGRNYXNrVXRpbDo6RnJvbVN0cmluZygKKyAgICAgICJvcHRpb25hbF9pbnQzMixvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYixvcHRpb25hbF9ub25leGlzdCIsICZtYXNrKTsKKyAgRVhQRUNUX0ZBTFNFKEZpZWxkTWFza1V0aWw6OklzVmFsaWRGaWVsZE1hc2s8VGVzdEFsbFR5cGVzPihtYXNrKSk7Cit9CisKK1RFU1QoRmllbGRNYXNrVXRpbFRlc3QsIFRlc3RHZXRGaWVsZE1hc2tGb3JBbGxGaWVsZHMpIHsKKyAgRmllbGRNYXNrIG1hc2s7CisgIG1hc2sgPSBGaWVsZE1hc2tVdGlsOjpHZXRGaWVsZE1hc2tGb3JBbGxGaWVsZHM8VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlPigpOworICBFWFBFQ1RfRVEoMSwgbWFzay5wYXRoc19zaXplKCkpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygiYmIiLCBtYXNrKSk7CisKKyAgbWFzayA9IEZpZWxkTWFza1V0aWw6OkdldEZpZWxkTWFza0ZvckFsbEZpZWxkczxUZXN0QWxsVHlwZXM+KCk7CisgIEVYUEVDVF9FUSg3NiwgbWFzay5wYXRoc19zaXplKCkpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygib3B0aW9uYWxfaW50MzIiLCBtYXNrKSk7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKCJvcHRpb25hbF9pbnQ2NCIsIG1hc2spKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soIm9wdGlvbmFsX3VpbnQzMiIsIG1hc2spKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soIm9wdGlvbmFsX3VpbnQ2NCIsIG1hc2spKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soIm9wdGlvbmFsX3NpbnQzMiIsIG1hc2spKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soIm9wdGlvbmFsX3NpbnQ2NCIsIG1hc2spKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soIm9wdGlvbmFsX2ZpeGVkMzIiLCBtYXNrKSk7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKCJvcHRpb25hbF9maXhlZDY0IiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygib3B0aW9uYWxfc2ZpeGVkMzIiLCBtYXNrKSk7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKCJvcHRpb25hbF9zZml4ZWQ2NCIsIG1hc2spKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soIm9wdGlvbmFsX2Zsb2F0IiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygib3B0aW9uYWxfZG91YmxlIiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygib3B0aW9uYWxfYm9vbCIsIG1hc2spKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soIm9wdGlvbmFsX3N0cmluZyIsIG1hc2spKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soIm9wdGlvbmFsX2J5dGVzIiwgbWFzaykpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIsIG1hc2spKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIiwgbWFzaykpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIsIG1hc2spKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soIm9wdGlvbmFsX25lc3RlZF9lbnVtIiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygib3B0aW9uYWxfZm9yZWlnbl9lbnVtIiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygib3B0aW9uYWxfaW1wb3J0X2VudW0iLCBtYXNrKSk7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKCJyZXBlYXRlZF9pbnQzMiIsIG1hc2spKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soInJlcGVhdGVkX2ludDY0IiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygicmVwZWF0ZWRfdWludDMyIiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygicmVwZWF0ZWRfdWludDY0IiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygicmVwZWF0ZWRfc2ludDMyIiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygicmVwZWF0ZWRfc2ludDY0IiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygicmVwZWF0ZWRfZml4ZWQzMiIsIG1hc2spKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soInJlcGVhdGVkX2ZpeGVkNjQiLCBtYXNrKSk7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKCJyZXBlYXRlZF9zZml4ZWQzMiIsIG1hc2spKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soInJlcGVhdGVkX3NmaXhlZDY0IiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygicmVwZWF0ZWRfZmxvYXQiLCBtYXNrKSk7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKCJyZXBlYXRlZF9kb3VibGUiLCBtYXNrKSk7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKCJyZXBlYXRlZF9ib29sIiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygicmVwZWF0ZWRfc3RyaW5nIiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygicmVwZWF0ZWRfYnl0ZXMiLCBtYXNrKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiwgbWFzaykpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiLCBtYXNrKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygicmVwZWF0ZWRfbmVzdGVkX2VudW0iLCBtYXNrKSk7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iLCBtYXNrKSk7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIsIG1hc2spKTsKK30KKworVEVTVChGaWVsZE1hc2tVdGlsVGVzdCwgVGVzdFRvQ2Fub25pY2FsRm9ybSkgeworICBGaWVsZE1hc2sgaW4sIG91dDsKKyAgLy8gUGF0aHMgd2lsbCBiZSBzb3J0ZWQuCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoImJhei5xdXosYmFyLGZvbyIsICZpbik7CisgIEZpZWxkTWFza1V0aWw6OlRvQ2Fub25pY2FsRm9ybShpbiwgJm91dCk7CisgIEVYUEVDVF9FUSgiYmFyLGJhei5xdXosZm9vIiwgRmllbGRNYXNrVXRpbDo6VG9TdHJpbmcob3V0KSk7CisgIC8vIER1cGxpY2F0ZWQgcGF0aHMgd2lsbCBiZSByZW1vdmVkLgorICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJmb28sYmFyLGZvbyIsICZpbik7CisgIEZpZWxkTWFza1V0aWw6OlRvQ2Fub25pY2FsRm9ybShpbiwgJm91dCk7CisgIEVYUEVDVF9FUSgiYmFyLGZvbyIsIEZpZWxkTWFza1V0aWw6OlRvU3RyaW5nKG91dCkpOworICAvLyBTdWItcGF0aHMgb2Ygb3RoZXIgcGF0aHMgd2lsbCBiZSByZW1vdmVkLgorICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJmb28uYjEsYmFyLmIxLGZvby5iMixiYXIiLCAmaW4pOworICBGaWVsZE1hc2tVdGlsOjpUb0Nhbm9uaWNhbEZvcm0oaW4sICZvdXQpOworICBFWFBFQ1RfRVEoImJhcixmb28uYjEsZm9vLmIyIiwgRmllbGRNYXNrVXRpbDo6VG9TdHJpbmcob3V0KSk7CisKKyAgLy8gVGVzdCBtb3JlIGRlZXBseSBuZXN0ZWQgY2FzZXMuCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoCisgICAgICAiZm9vLmJhci5iYXoxLCIKKyAgICAgICJmb28uYmFyLmJhejIucXV6LCIKKyAgICAgICJmb28uYmFyLmJhejIiLAorICAgICAgJmluKTsKKyAgRmllbGRNYXNrVXRpbDo6VG9DYW5vbmljYWxGb3JtKGluLCAmb3V0KTsKKyAgRVhQRUNUX0VRKCJmb28uYmFyLmJhejEsZm9vLmJhci5iYXoyIiwgRmllbGRNYXNrVXRpbDo6VG9TdHJpbmcob3V0KSk7CisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoCisgICAgICAiZm9vLmJhci5iYXoxLCIKKyAgICAgICJmb28uYmFyLmJhejIsIgorICAgICAgImZvby5iYXIuYmF6Mi5xdXoiLAorICAgICAgJmluKTsKKyAgRmllbGRNYXNrVXRpbDo6VG9DYW5vbmljYWxGb3JtKGluLCAmb3V0KTsKKyAgRVhQRUNUX0VRKCJmb28uYmFyLmJhejEsZm9vLmJhci5iYXoyIiwgRmllbGRNYXNrVXRpbDo6VG9TdHJpbmcob3V0KSk7CisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoCisgICAgICAiZm9vLmJhci5iYXoxLCIKKyAgICAgICJmb28uYmFyLmJhejIsIgorICAgICAgImZvby5iYXIuYmF6Mi5xdXosIgorICAgICAgImZvby5iYXIiLAorICAgICAgJmluKTsKKyAgRmllbGRNYXNrVXRpbDo6VG9DYW5vbmljYWxGb3JtKGluLCAmb3V0KTsKKyAgRVhQRUNUX0VRKCJmb28uYmFyIiwgRmllbGRNYXNrVXRpbDo6VG9TdHJpbmcob3V0KSk7CisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoCisgICAgICAiZm9vLmJhci5iYXoxLCIKKyAgICAgICJmb28uYmFyLmJhejIsIgorICAgICAgImZvby5iYXIuYmF6Mi5xdXosIgorICAgICAgImZvbyIsCisgICAgICAmaW4pOworICBGaWVsZE1hc2tVdGlsOjpUb0Nhbm9uaWNhbEZvcm0oaW4sICZvdXQpOworICBFWFBFQ1RfRVEoImZvbyIsIEZpZWxkTWFza1V0aWw6OlRvU3RyaW5nKG91dCkpOworfQorCitURVNUKEZpZWxkTWFza1V0aWxUZXN0LCBUZXN0VW5pb24pIHsKKyAgRmllbGRNYXNrIG1hc2sxLCBtYXNrMiwgb3V0OworICAvLyBUZXN0IGNhc2VzIHdpdGhvdXQgb3ZlcmxhcHBpbmcuCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoImZvbyxiYXoiLCAmbWFzazEpOworICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJiYXIscXV6IiwgJm1hc2syKTsKKyAgRmllbGRNYXNrVXRpbDo6VW5pb24obWFzazEsIG1hc2syLCAmb3V0KTsKKyAgRVhQRUNUX0VRKCJiYXIsYmF6LGZvbyxxdXoiLCBGaWVsZE1hc2tVdGlsOjpUb1N0cmluZyhvdXQpKTsKKyAgLy8gT3ZlcmxhcCB3aXRoIGR1cGxpY2F0ZWQgcGF0aHMuCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoImZvbyxiYXouYmIiLCAmbWFzazEpOworICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJiYXouYmIscXV6IiwgJm1hc2syKTsKKyAgRmllbGRNYXNrVXRpbDo6VW5pb24obWFzazEsIG1hc2syLCAmb3V0KTsKKyAgRVhQRUNUX0VRKCJiYXouYmIsZm9vLHF1eiIsIEZpZWxkTWFza1V0aWw6OlRvU3RyaW5nKG91dCkpOworICAvLyBPdmVybGFwIHdpdGggcGF0aHMgY292ZXJpbmcgc29tZSBvdGhlciBwYXRocy4KKyAgRmllbGRNYXNrVXRpbDo6RnJvbVN0cmluZygiZm9vLmJhci5iYXoscXV6IiwgJm1hc2sxKTsKKyAgRmllbGRNYXNrVXRpbDo6RnJvbVN0cmluZygiZm9vLmJhcixiYXIiLCAmbWFzazIpOworICBGaWVsZE1hc2tVdGlsOjpVbmlvbihtYXNrMSwgbWFzazIsICZvdXQpOworICBFWFBFQ1RfRVEoImJhcixmb28uYmFyLHF1eiIsIEZpZWxkTWFza1V0aWw6OlRvU3RyaW5nKG91dCkpOworfQorCitURVNUKEZpZWxkTWFza1V0aWxUZXN0LCBUZXN0SW50ZXJzZWN0KSB7CisgIEZpZWxkTWFzayBtYXNrMSwgbWFzazIsIG91dDsKKyAgLy8gVGVzdCBjYXNlcyB3aXRob3V0IG92ZXJsYXBwaW5nLgorICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJmb28sYmF6IiwgJm1hc2sxKTsKKyAgRmllbGRNYXNrVXRpbDo6RnJvbVN0cmluZygiYmFyLHF1eiIsICZtYXNrMik7CisgIEZpZWxkTWFza1V0aWw6OkludGVyc2VjdChtYXNrMSwgbWFzazIsICZvdXQpOworICBFWFBFQ1RfRVEoIiIsIEZpZWxkTWFza1V0aWw6OlRvU3RyaW5nKG91dCkpOworICAvLyBPdmVybGFwIHdpdGggZHVwbGljYXRlZCBwYXRocy4KKyAgRmllbGRNYXNrVXRpbDo6RnJvbVN0cmluZygiZm9vLGJhei5iYiIsICZtYXNrMSk7CisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoImJhei5iYixxdXoiLCAmbWFzazIpOworICBGaWVsZE1hc2tVdGlsOjpJbnRlcnNlY3QobWFzazEsIG1hc2syLCAmb3V0KTsKKyAgRVhQRUNUX0VRKCJiYXouYmIiLCBGaWVsZE1hc2tVdGlsOjpUb1N0cmluZyhvdXQpKTsKKyAgLy8gT3ZlcmxhcCB3aXRoIHBhdGhzIGNvdmVyaW5nIHNvbWUgb3RoZXIgcGF0aHMuCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoImZvby5iYXIuYmF6LHF1eiIsICZtYXNrMSk7CisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoImZvby5iYXIsYmFyIiwgJm1hc2syKTsKKyAgRmllbGRNYXNrVXRpbDo6SW50ZXJzZWN0KG1hc2sxLCBtYXNrMiwgJm91dCk7CisgIEVYUEVDVF9FUSgiZm9vLmJhci5iYXoiLCBGaWVsZE1hc2tVdGlsOjpUb1N0cmluZyhvdXQpKTsKK30KKworVEVTVChGaWVsZE1hc2tVdGlsVGVzdCwgVGVzdFN1YnRyYWN0KSB7CisgIEZpZWxkTWFzayBtYXNrMSwgbWFzazIsIG91dDsKKyAgLy8gTm9ybWFsIGNhc2UuCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoCisgICAgICAib3B0aW9uYWxfaW50MzIsb3B0aW9uYWxfdWludDY0LG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLG9wdGlvbmFsX2ZvcmVpZ25fIgorICAgICAgIm1lc3NhZ2UscmVwZWF0ZWRfaW50MzIscmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlLHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLiIKKyAgICAgICJiYiIsCisgICAgICAmbWFzazEpOworCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoCisgICAgICAib3B0aW9uYWxfaW50MzIsb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIsb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlLmMsIgorICAgICAgInJlcGVhdGVkX2ludDMyLHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmJiLHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZS5mLCIKKyAgICAgICJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UuZCxyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5iYixyZXBlYXRlZF91aW50MzIiLAorICAgICAgJm1hc2syKTsKKworICBGaWVsZE1hc2tVdGlsOjpTdWJ0cmFjdDxUZXN0QWxsVHlwZXM+KG1hc2sxLCBtYXNrMiwgJm91dCk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UuZCxvcHRpb25hbF91aW50NjQscmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlLmMiLAorICAgICAgRmllbGRNYXNrVXRpbDo6VG9TdHJpbmcob3V0KSk7CisKKyAgLy8gbWFzazEgaXMgZW1wdHkuCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoIiIsICZtYXNrMSk7CisgIEZpZWxkTWFza1V0aWw6OlN1YnRyYWN0PFRlc3RBbGxUeXBlcz4obWFzazEsIG1hc2syLCAmb3V0KTsKKyAgRVhQRUNUX0VRKCIiLCBGaWVsZE1hc2tVdGlsOjpUb1N0cmluZyhvdXQpKTsKKworICAvLyBtYXNrMSBpcyAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiIGFuZCBtYXNrMiBpcworICAvLyAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Uubm9uZXhpc3RfZmllbGQiLgorICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIsICZtYXNrMSk7CisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLm5vbmV4aXN0X2ZpZWxkIiwgJm1hc2syKTsKKyAgRmllbGRNYXNrVXRpbDo6U3VidHJhY3Q8VGVzdEFsbFR5cGVzPihtYXNrMSwgbWFzazIsICZvdXQpOworICBFWFBFQ1RfRVEoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiwgRmllbGRNYXNrVXRpbDo6VG9TdHJpbmcob3V0KSk7CisKKyAgLy8gbWFzazEgaXMgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiBhbmQgbWFzazIgaXMKKyAgLy8gIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIi4KKyAgRmllbGRNYXNrVXRpbDo6RnJvbVN0cmluZygib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiLCAmbWFzazEpOworICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIsICZtYXNrMik7CisgIEZpZWxkTWFza1V0aWw6OlN1YnRyYWN0PFRlc3RBbGxUeXBlcz4obWFzazEsIG1hc2syLCAmb3V0KTsKKyAgRVhQRUNUX0VRKCIiLCBGaWVsZE1hc2tVdGlsOjpUb1N0cmluZyhvdXQpKTsKKworICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGIvNzI3Mjc1NTAKKyAgRmllbGRNYXNrVXRpbDo6RnJvbVN0cmluZygib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlLmMiLCAmbWFzazEpOworICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2Usb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXNrMik7CisgIEZpZWxkTWFza1V0aWw6OlN1YnRyYWN0PFRlc3RBbGxUeXBlcz4obWFzazEsIG1hc2syLCAmb3V0KTsKKyAgRVhQRUNUX0VRKCIiLCBGaWVsZE1hc2tVdGlsOjpUb1N0cmluZyhvdXQpKTsKK30KKworVEVTVChGaWVsZE1hc2tVdGlsVGVzdCwgVGVzdElzcGF0aEluRmllbGRNYXNrKSB7CisgIEZpZWxkTWFzayBtYXNrOworICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJmb28uYmFyIiwgJm1hc2spOworICBFWFBFQ1RfRkFMU0UoRmllbGRNYXNrVXRpbDo6SXNQYXRoSW5GaWVsZE1hc2soIiIsIG1hc2spKTsKKyAgRVhQRUNUX0ZBTFNFKEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKCJmb28iLCBtYXNrKSk7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OklzUGF0aEluRmllbGRNYXNrKCJmb28uYmFyIiwgbWFzaykpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygiZm9vLmJhci5iYXoiLCBtYXNrKSk7CisgIEVYUEVDVF9GQUxTRShGaWVsZE1hc2tVdGlsOjpJc1BhdGhJbkZpZWxkTWFzaygiZm9vLmJhcjAuYmF6IiwgbWFzaykpOworfQorCitURVNUKEZpZWxkTWFza1V0aWxUZXN0LCBNZXJnZU1lc3NhZ2UpIHsKKyAgVGVzdEFsbFR5cGVzIHNyYywgZHN0OworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZzcmMpOworICBGaWVsZE1hc2tVdGlsOjpNZXJnZU9wdGlvbnMgb3B0aW9uczsKKworI2RlZmluZSBURVNUX01FUkdFX09ORV9QUklNSVRJVkVfRklFTEQoZmllbGRfbmFtZSkgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVGVzdEFsbFR5cGVzIHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcC5zZXRfIyNmaWVsZF9uYW1lKHNyYy5maWVsZF9uYW1lKCkpOyAgICAgICAgICAgICAgICAgIFwKKyAgICBGaWVsZE1hc2sgbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFzay5hZGRfcGF0aHMoI2ZpZWxkX25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdC5DbGVhcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGaWVsZE1hc2tVdGlsOjpNZXJnZU1lc3NhZ2VUbyhzcmMsIG1hc2ssIG9wdGlvbnMsICZkc3QpOyBcCisgICAgRVhQRUNUX0VRKHRtcC5EZWJ1Z1N0cmluZygpLCBkc3QuRGVidWdTdHJpbmcoKSk7ICAgICAgICAgXAorICAgIHNyYy5jbGVhcl8jI2ZpZWxkX25hbWUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bXAuY2xlYXJfIyNmaWVsZF9uYW1lKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRmllbGRNYXNrVXRpbDo6TWVyZ2VNZXNzYWdlVG8oc3JjLCBtYXNrLCBvcHRpb25zLCAmZHN0KTsgXAorICAgIEVYUEVDVF9FUSh0bXAuRGVidWdTdHJpbmcoKSwgZHN0LkRlYnVnU3RyaW5nKCkpOyAgICAgICAgIFwKKyAgfQorICBURVNUX01FUkdFX09ORV9QUklNSVRJVkVfRklFTEQob3B0aW9uYWxfaW50MzIpCisgIFRFU1RfTUVSR0VfT05FX1BSSU1JVElWRV9GSUVMRChvcHRpb25hbF9pbnQ2NCkKKyAgVEVTVF9NRVJHRV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX3VpbnQzMikKKyAgVEVTVF9NRVJHRV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX3VpbnQ2NCkKKyAgVEVTVF9NRVJHRV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX3NpbnQzMikKKyAgVEVTVF9NRVJHRV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX3NpbnQ2NCkKKyAgVEVTVF9NRVJHRV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX2ZpeGVkMzIpCisgIFRFU1RfTUVSR0VfT05FX1BSSU1JVElWRV9GSUVMRChvcHRpb25hbF9maXhlZDY0KQorICBURVNUX01FUkdFX09ORV9QUklNSVRJVkVfRklFTEQob3B0aW9uYWxfc2ZpeGVkMzIpCisgIFRFU1RfTUVSR0VfT05FX1BSSU1JVElWRV9GSUVMRChvcHRpb25hbF9zZml4ZWQ2NCkKKyAgVEVTVF9NRVJHRV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX2Zsb2F0KQorICBURVNUX01FUkdFX09ORV9QUklNSVRJVkVfRklFTEQob3B0aW9uYWxfZG91YmxlKQorICBURVNUX01FUkdFX09ORV9QUklNSVRJVkVfRklFTEQob3B0aW9uYWxfYm9vbCkKKyAgVEVTVF9NRVJHRV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX3N0cmluZykKKyAgVEVTVF9NRVJHRV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX2J5dGVzKQorICBURVNUX01FUkdFX09ORV9QUklNSVRJVkVfRklFTEQob3B0aW9uYWxfbmVzdGVkX2VudW0pCisgIFRFU1RfTUVSR0VfT05FX1BSSU1JVElWRV9GSUVMRChvcHRpb25hbF9mb3JlaWduX2VudW0pCisgIFRFU1RfTUVSR0VfT05FX1BSSU1JVElWRV9GSUVMRChvcHRpb25hbF9pbXBvcnRfZW51bSkKKyN1bmRlZiBURVNUX01FUkdFX09ORV9QUklNSVRJVkVfRklFTEQKKworI2RlZmluZSBURVNUX01FUkdFX09ORV9GSUVMRChmaWVsZF9uYW1lKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVGVzdEFsbFR5cGVzIHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICp0bXAubXV0YWJsZV8jI2ZpZWxkX25hbWUoKSA9IHNyYy5maWVsZF9uYW1lKCk7ICAgICAgICAgIFwKKyAgICBGaWVsZE1hc2sgbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFzay5hZGRfcGF0aHMoI2ZpZWxkX25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdC5DbGVhcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGaWVsZE1hc2tVdGlsOjpNZXJnZU1lc3NhZ2VUbyhzcmMsIG1hc2ssIG9wdGlvbnMsICZkc3QpOyBcCisgICAgRVhQRUNUX0VRKHRtcC5EZWJ1Z1N0cmluZygpLCBkc3QuRGVidWdTdHJpbmcoKSk7ICAgICAgICAgXAorICB9CisgIFRFU1RfTUVSR0VfT05FX0ZJRUxEKG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKQorICBURVNUX01FUkdFX09ORV9GSUVMRChvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UpCisgIFRFU1RfTUVSR0VfT05FX0ZJRUxEKG9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlKQorCisgIFRFU1RfTUVSR0VfT05FX0ZJRUxEKHJlcGVhdGVkX2ludDMyKQorICBURVNUX01FUkdFX09ORV9GSUVMRChyZXBlYXRlZF9pbnQ2NCkKKyAgVEVTVF9NRVJHRV9PTkVfRklFTEQocmVwZWF0ZWRfdWludDMyKQorICBURVNUX01FUkdFX09ORV9GSUVMRChyZXBlYXRlZF91aW50NjQpCisgIFRFU1RfTUVSR0VfT05FX0ZJRUxEKHJlcGVhdGVkX3NpbnQzMikKKyAgVEVTVF9NRVJHRV9PTkVfRklFTEQocmVwZWF0ZWRfc2ludDY0KQorICBURVNUX01FUkdFX09ORV9GSUVMRChyZXBlYXRlZF9maXhlZDMyKQorICBURVNUX01FUkdFX09ORV9GSUVMRChyZXBlYXRlZF9maXhlZDY0KQorICBURVNUX01FUkdFX09ORV9GSUVMRChyZXBlYXRlZF9zZml4ZWQzMikKKyAgVEVTVF9NRVJHRV9PTkVfRklFTEQocmVwZWF0ZWRfc2ZpeGVkNjQpCisgIFRFU1RfTUVSR0VfT05FX0ZJRUxEKHJlcGVhdGVkX2Zsb2F0KQorICBURVNUX01FUkdFX09ORV9GSUVMRChyZXBlYXRlZF9kb3VibGUpCisgIFRFU1RfTUVSR0VfT05FX0ZJRUxEKHJlcGVhdGVkX2Jvb2wpCisgIFRFU1RfTUVSR0VfT05FX0ZJRUxEKHJlcGVhdGVkX3N0cmluZykKKyAgVEVTVF9NRVJHRV9PTkVfRklFTEQocmVwZWF0ZWRfYnl0ZXMpCisgIFRFU1RfTUVSR0VfT05FX0ZJRUxEKHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorICBURVNUX01FUkdFX09ORV9GSUVMRChyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UpCisgIFRFU1RfTUVSR0VfT05FX0ZJRUxEKHJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlKQorICBURVNUX01FUkdFX09ORV9GSUVMRChyZXBlYXRlZF9uZXN0ZWRfZW51bSkKKyAgVEVTVF9NRVJHRV9PTkVfRklFTEQocmVwZWF0ZWRfZm9yZWlnbl9lbnVtKQorICBURVNUX01FUkdFX09ORV9GSUVMRChyZXBlYXRlZF9pbXBvcnRfZW51bSkKKyN1bmRlZiBURVNUX01FUkdFX09ORV9GSUVMRAorCisgIC8vIFRlc3QgbWVyZ2UgbmVzdGVkIGZpZWxkcy4KKyAgTmVzdGVkVGVzdEFsbFR5cGVzIG5lc3RlZF9zcmMsIG5lc3RlZF9kc3Q7CisgIG5lc3RlZF9zcmMubXV0YWJsZV9jaGlsZCgpLT5tdXRhYmxlX3BheWxvYWQoKS0+c2V0X29wdGlvbmFsX2ludDMyKDEyMzQpOworICBuZXN0ZWRfc3JjLm11dGFibGVfY2hpbGQoKQorICAgICAgLT5tdXRhYmxlX2NoaWxkKCkKKyAgICAgIC0+bXV0YWJsZV9wYXlsb2FkKCkKKyAgICAgIC0+c2V0X29wdGlvbmFsX2ludDMyKDU2NzgpOworICBGaWVsZE1hc2sgbWFzazsKKyAgRmllbGRNYXNrVXRpbDo6RnJvbVN0cmluZygiY2hpbGQucGF5bG9hZCIsICZtYXNrKTsKKyAgRmllbGRNYXNrVXRpbDo6TWVyZ2VNZXNzYWdlVG8obmVzdGVkX3NyYywgbWFzaywgb3B0aW9ucywgJm5lc3RlZF9kc3QpOworICBFWFBFQ1RfRVEoMTIzNCwgbmVzdGVkX2RzdC5jaGlsZCgpLnBheWxvYWQoKS5vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKDAsIG5lc3RlZF9kc3QuY2hpbGQoKS5jaGlsZCgpLnBheWxvYWQoKS5vcHRpb25hbF9pbnQzMigpKTsKKworICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJjaGlsZC5jaGlsZC5wYXlsb2FkIiwgJm1hc2spOworICBGaWVsZE1hc2tVdGlsOjpNZXJnZU1lc3NhZ2VUbyhuZXN0ZWRfc3JjLCBtYXNrLCBvcHRpb25zLCAmbmVzdGVkX2RzdCk7CisgIEVYUEVDVF9FUSgxMjM0LCBuZXN0ZWRfZHN0LmNoaWxkKCkucGF5bG9hZCgpLm9wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoNTY3OCwgbmVzdGVkX2RzdC5jaGlsZCgpLmNoaWxkKCkucGF5bG9hZCgpLm9wdGlvbmFsX2ludDMyKCkpOworCisgIG5lc3RlZF9kc3QuQ2xlYXIoKTsKKyAgRmllbGRNYXNrVXRpbDo6RnJvbVN0cmluZygiY2hpbGQuY2hpbGQucGF5bG9hZCIsICZtYXNrKTsKKyAgRmllbGRNYXNrVXRpbDo6TWVyZ2VNZXNzYWdlVG8obmVzdGVkX3NyYywgbWFzaywgb3B0aW9ucywgJm5lc3RlZF9kc3QpOworICBFWFBFQ1RfRVEoMCwgbmVzdGVkX2RzdC5jaGlsZCgpLnBheWxvYWQoKS5vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKDU2NzgsIG5lc3RlZF9kc3QuY2hpbGQoKS5jaGlsZCgpLnBheWxvYWQoKS5vcHRpb25hbF9pbnQzMigpKTsKKworICBuZXN0ZWRfZHN0LkNsZWFyKCk7CisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoImNoaWxkIiwgJm1hc2spOworICBGaWVsZE1hc2tVdGlsOjpNZXJnZU1lc3NhZ2VUbyhuZXN0ZWRfc3JjLCBtYXNrLCBvcHRpb25zLCAmbmVzdGVkX2RzdCk7CisgIEVYUEVDVF9FUSgxMjM0LCBuZXN0ZWRfZHN0LmNoaWxkKCkucGF5bG9hZCgpLm9wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoNTY3OCwgbmVzdGVkX2RzdC5jaGlsZCgpLmNoaWxkKCkucGF5bG9hZCgpLm9wdGlvbmFsX2ludDMyKCkpOworCisgIC8vIFRlc3QgTWVyZ2VPcHRpb25zLgorCisgIG5lc3RlZF9kc3QuQ2xlYXIoKTsKKyAgbmVzdGVkX2RzdC5tdXRhYmxlX2NoaWxkKCktPm11dGFibGVfcGF5bG9hZCgpLT5zZXRfb3B0aW9uYWxfaW50NjQoNDMyMSk7CisgIC8vIE1lc3NhZ2UgZmllbGRzIHdpbGwgYmUgbWVyZ2VkIGJ5IGRlZmF1bHQuCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoImNoaWxkLnBheWxvYWQiLCAmbWFzayk7CisgIEZpZWxkTWFza1V0aWw6Ok1lcmdlTWVzc2FnZVRvKG5lc3RlZF9zcmMsIG1hc2ssIG9wdGlvbnMsICZuZXN0ZWRfZHN0KTsKKyAgRVhQRUNUX0VRKDEyMzQsIG5lc3RlZF9kc3QuY2hpbGQoKS5wYXlsb2FkKCkub3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSg0MzIxLCBuZXN0ZWRfZHN0LmNoaWxkKCkucGF5bG9hZCgpLm9wdGlvbmFsX2ludDY0KCkpOworICAvLyBDaGFuZ2UgdGhlIGJlaGF2aW9yIHRvIHJlcGxhY2UgbWVzc2FnZSBmaWVsZHMuCisgIG9wdGlvbnMuc2V0X3JlcGxhY2VfbWVzc2FnZV9maWVsZHModHJ1ZSk7CisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoImNoaWxkLnBheWxvYWQiLCAmbWFzayk7CisgIEZpZWxkTWFza1V0aWw6Ok1lcmdlTWVzc2FnZVRvKG5lc3RlZF9zcmMsIG1hc2ssIG9wdGlvbnMsICZuZXN0ZWRfZHN0KTsKKyAgRVhQRUNUX0VRKDEyMzQsIG5lc3RlZF9kc3QuY2hpbGQoKS5wYXlsb2FkKCkub3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSgwLCBuZXN0ZWRfZHN0LmNoaWxkKCkucGF5bG9hZCgpLm9wdGlvbmFsX2ludDY0KCkpOworCisgIC8vIEJ5IGRlZmF1bHQsIGZpZWxkcyBtaXNzaW5nIGluIHNvdXJjZSBhcmUgbm90IGNsZWFyZWQgaW4gZGVzdGluYXRpb24uCisgIG9wdGlvbnMuc2V0X3JlcGxhY2VfbWVzc2FnZV9maWVsZHMoZmFsc2UpOworICBuZXN0ZWRfZHN0Lm11dGFibGVfcGF5bG9hZCgpOworICBFWFBFQ1RfVFJVRShuZXN0ZWRfZHN0Lmhhc19wYXlsb2FkKCkpOworICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJwYXlsb2FkIiwgJm1hc2spOworICBGaWVsZE1hc2tVdGlsOjpNZXJnZU1lc3NhZ2VUbyhuZXN0ZWRfc3JjLCBtYXNrLCBvcHRpb25zLCAmbmVzdGVkX2RzdCk7CisgIEVYUEVDVF9UUlVFKG5lc3RlZF9kc3QuaGFzX3BheWxvYWQoKSk7CisgIC8vIEJ1dCB0aGV5IGFyZSBjbGVhcmVkIHdoZW4gcmVwbGFjaW5nIG1lc3NhZ2UgZmllbGRzLgorICBvcHRpb25zLnNldF9yZXBsYWNlX21lc3NhZ2VfZmllbGRzKHRydWUpOworICBuZXN0ZWRfZHN0LkNsZWFyKCk7CisgIG5lc3RlZF9kc3QubXV0YWJsZV9wYXlsb2FkKCk7CisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoInBheWxvYWQiLCAmbWFzayk7CisgIEZpZWxkTWFza1V0aWw6Ok1lcmdlTWVzc2FnZVRvKG5lc3RlZF9zcmMsIG1hc2ssIG9wdGlvbnMsICZuZXN0ZWRfZHN0KTsKKyAgRVhQRUNUX0ZBTFNFKG5lc3RlZF9kc3QuaGFzX3BheWxvYWQoKSk7CisKKyAgbmVzdGVkX3NyYy5tdXRhYmxlX3BheWxvYWQoKS0+YWRkX3JlcGVhdGVkX2ludDMyKDEyMzQpOworICBuZXN0ZWRfZHN0Lm11dGFibGVfcGF5bG9hZCgpLT5hZGRfcmVwZWF0ZWRfaW50MzIoNTY3OCk7CisgIC8vIFJlcGVhdGVkIGZpZWxkcyB3aWxsIGJlIGFwcGVuZGVkIGJ5IGRlZmF1bHQuCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoInBheWxvYWQucmVwZWF0ZWRfaW50MzIiLCAmbWFzayk7CisgIEZpZWxkTWFza1V0aWw6Ok1lcmdlTWVzc2FnZVRvKG5lc3RlZF9zcmMsIG1hc2ssIG9wdGlvbnMsICZuZXN0ZWRfZHN0KTsKKyAgQVNTRVJUX0VRKDIsIG5lc3RlZF9kc3QucGF5bG9hZCgpLnJlcGVhdGVkX2ludDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSg1Njc4LCBuZXN0ZWRfZHN0LnBheWxvYWQoKS5yZXBlYXRlZF9pbnQzMigwKSk7CisgIEVYUEVDVF9FUSgxMjM0LCBuZXN0ZWRfZHN0LnBheWxvYWQoKS5yZXBlYXRlZF9pbnQzMigxKSk7CisgIC8vIENoYW5nZSB0aGUgYmVoYXZpb3IgdG8gcmVwbGFjZSByZXBlYXRlZCBmaWVsZHMuCisgIG9wdGlvbnMuc2V0X3JlcGxhY2VfcmVwZWF0ZWRfZmllbGRzKHRydWUpOworICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJwYXlsb2FkLnJlcGVhdGVkX2ludDMyIiwgJm1hc2spOworICBGaWVsZE1hc2tVdGlsOjpNZXJnZU1lc3NhZ2VUbyhuZXN0ZWRfc3JjLCBtYXNrLCBvcHRpb25zLCAmbmVzdGVkX2RzdCk7CisgIEFTU0VSVF9FUSgxLCBuZXN0ZWRfZHN0LnBheWxvYWQoKS5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMTIzNCwgbmVzdGVkX2RzdC5wYXlsb2FkKCkucmVwZWF0ZWRfaW50MzIoMCkpOworfQorCitURVNUKEZpZWxkTWFza1V0aWxUZXN0LCBUcmltTWVzc2FnZSkgeworI2RlZmluZSBURVNUX1RSSU1fT05FX1BSSU1JVElWRV9GSUVMRChmaWVsZF9uYW1lKSAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUZXN0QWxsVHlwZXMgbXNnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZyk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgVGVzdEFsbFR5cGVzIHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bXAuc2V0XyMjZmllbGRfbmFtZShtc2cuZmllbGRfbmFtZSgpKTsgICAgICAgICAgXAorICAgIEZpZWxkTWFzayBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFzay5hZGRfcGF0aHMoI2ZpZWxkX25hbWUpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGaWVsZE1hc2tVdGlsOjpUcmltTWVzc2FnZShtYXNrLCAmbXNnKTsgICAgICAgICAgXAorICAgIEVYUEVDVF9FUSh0bXAuRGVidWdTdHJpbmcoKSwgbXNnLkRlYnVnU3RyaW5nKCkpOyBcCisgIH0KKyAgVEVTVF9UUklNX09ORV9QUklNSVRJVkVfRklFTEQob3B0aW9uYWxfaW50MzIpCisgIFRFU1RfVFJJTV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX2ludDY0KQorICBURVNUX1RSSU1fT05FX1BSSU1JVElWRV9GSUVMRChvcHRpb25hbF91aW50MzIpCisgIFRFU1RfVFJJTV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX3VpbnQ2NCkKKyAgVEVTVF9UUklNX09ORV9QUklNSVRJVkVfRklFTEQob3B0aW9uYWxfc2ludDMyKQorICBURVNUX1RSSU1fT05FX1BSSU1JVElWRV9GSUVMRChvcHRpb25hbF9zaW50NjQpCisgIFRFU1RfVFJJTV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX2ZpeGVkMzIpCisgIFRFU1RfVFJJTV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX2ZpeGVkNjQpCisgIFRFU1RfVFJJTV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX3NmaXhlZDMyKQorICBURVNUX1RSSU1fT05FX1BSSU1JVElWRV9GSUVMRChvcHRpb25hbF9zZml4ZWQ2NCkKKyAgVEVTVF9UUklNX09ORV9QUklNSVRJVkVfRklFTEQob3B0aW9uYWxfZmxvYXQpCisgIFRFU1RfVFJJTV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX2RvdWJsZSkKKyAgVEVTVF9UUklNX09ORV9QUklNSVRJVkVfRklFTEQob3B0aW9uYWxfYm9vbCkKKyAgVEVTVF9UUklNX09ORV9QUklNSVRJVkVfRklFTEQob3B0aW9uYWxfc3RyaW5nKQorICBURVNUX1RSSU1fT05FX1BSSU1JVElWRV9GSUVMRChvcHRpb25hbF9ieXRlcykKKyAgVEVTVF9UUklNX09ORV9QUklNSVRJVkVfRklFTEQob3B0aW9uYWxfbmVzdGVkX2VudW0pCisgIFRFU1RfVFJJTV9PTkVfUFJJTUlUSVZFX0ZJRUxEKG9wdGlvbmFsX2ZvcmVpZ25fZW51bSkKKyAgVEVTVF9UUklNX09ORV9QUklNSVRJVkVfRklFTEQob3B0aW9uYWxfaW1wb3J0X2VudW0pCisjdW5kZWYgVEVTVF9UUklNX09ORV9QUklNSVRJVkVfRklFTEQKKworI2RlZmluZSBURVNUX1RSSU1fT05FX0ZJRUxEKGZpZWxkX25hbWUpICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUZXN0QWxsVHlwZXMgbXNnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZyk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgVGVzdEFsbFR5cGVzIHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqdG1wLm11dGFibGVfIyNmaWVsZF9uYW1lKCkgPSBtc2cuZmllbGRfbmFtZSgpOyAgXAorICAgIEZpZWxkTWFzayBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFzay5hZGRfcGF0aHMoI2ZpZWxkX25hbWUpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGaWVsZE1hc2tVdGlsOjpUcmltTWVzc2FnZShtYXNrLCAmbXNnKTsgICAgICAgICAgXAorICAgIEVYUEVDVF9FUSh0bXAuRGVidWdTdHJpbmcoKSwgbXNnLkRlYnVnU3RyaW5nKCkpOyBcCisgIH0KKyAgVEVTVF9UUklNX09ORV9GSUVMRChvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSkKKyAgVEVTVF9UUklNX09ORV9GSUVMRChvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UpCisgIFRFU1RfVFJJTV9PTkVfRklFTEQob3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UpCisKKyAgVEVTVF9UUklNX09ORV9GSUVMRChyZXBlYXRlZF9pbnQzMikKKyAgVEVTVF9UUklNX09ORV9GSUVMRChyZXBlYXRlZF9pbnQ2NCkKKyAgVEVTVF9UUklNX09ORV9GSUVMRChyZXBlYXRlZF91aW50MzIpCisgIFRFU1RfVFJJTV9PTkVfRklFTEQocmVwZWF0ZWRfdWludDY0KQorICBURVNUX1RSSU1fT05FX0ZJRUxEKHJlcGVhdGVkX3NpbnQzMikKKyAgVEVTVF9UUklNX09ORV9GSUVMRChyZXBlYXRlZF9zaW50NjQpCisgIFRFU1RfVFJJTV9PTkVfRklFTEQocmVwZWF0ZWRfZml4ZWQzMikKKyAgVEVTVF9UUklNX09ORV9GSUVMRChyZXBlYXRlZF9maXhlZDY0KQorICBURVNUX1RSSU1fT05FX0ZJRUxEKHJlcGVhdGVkX3NmaXhlZDMyKQorICBURVNUX1RSSU1fT05FX0ZJRUxEKHJlcGVhdGVkX3NmaXhlZDY0KQorICBURVNUX1RSSU1fT05FX0ZJRUxEKHJlcGVhdGVkX2Zsb2F0KQorICBURVNUX1RSSU1fT05FX0ZJRUxEKHJlcGVhdGVkX2RvdWJsZSkKKyAgVEVTVF9UUklNX09ORV9GSUVMRChyZXBlYXRlZF9ib29sKQorICBURVNUX1RSSU1fT05FX0ZJRUxEKHJlcGVhdGVkX3N0cmluZykKKyAgVEVTVF9UUklNX09ORV9GSUVMRChyZXBlYXRlZF9ieXRlcykKKyAgVEVTVF9UUklNX09ORV9GSUVMRChyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKKyAgVEVTVF9UUklNX09ORV9GSUVMRChyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UpCisgIFRFU1RfVFJJTV9PTkVfRklFTEQocmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UpCisgIFRFU1RfVFJJTV9PTkVfRklFTEQocmVwZWF0ZWRfbmVzdGVkX2VudW0pCisgIFRFU1RfVFJJTV9PTkVfRklFTEQocmVwZWF0ZWRfZm9yZWlnbl9lbnVtKQorICBURVNUX1RSSU1fT05FX0ZJRUxEKHJlcGVhdGVkX2ltcG9ydF9lbnVtKQorI3VuZGVmIFRFU1RfVFJJTV9PTkVfRklFTEQKKworICAvLyBUZXN0IHRyaW0gbmVzdGVkIGZpZWxkcy4KKyAgTmVzdGVkVGVzdEFsbFR5cGVzIG5lc3RlZF9tc2c7CisgIG5lc3RlZF9tc2cubXV0YWJsZV9jaGlsZCgpLT5tdXRhYmxlX3BheWxvYWQoKS0+c2V0X29wdGlvbmFsX2ludDMyKDEyMzQpOworICBuZXN0ZWRfbXNnLm11dGFibGVfY2hpbGQoKQorICAgICAgLT5tdXRhYmxlX2NoaWxkKCkKKyAgICAgIC0+bXV0YWJsZV9wYXlsb2FkKCkKKyAgICAgIC0+c2V0X29wdGlvbmFsX2ludDMyKDU2NzgpOworICBOZXN0ZWRUZXN0QWxsVHlwZXMgdHJpbW1lZF9tc2cobmVzdGVkX21zZyk7CisgIEZpZWxkTWFzayBtYXNrOworICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJjaGlsZC5wYXlsb2FkIiwgJm1hc2spOworICBGaWVsZE1hc2tVdGlsOjpUcmltTWVzc2FnZShtYXNrLCAmdHJpbW1lZF9tc2cpOworICBFWFBFQ1RfRVEoMTIzNCwgdHJpbW1lZF9tc2cuY2hpbGQoKS5wYXlsb2FkKCkub3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSgwLCB0cmltbWVkX21zZy5jaGlsZCgpLmNoaWxkKCkucGF5bG9hZCgpLm9wdGlvbmFsX2ludDMyKCkpOworCisgIHRyaW1tZWRfbXNnID0gbmVzdGVkX21zZzsKKyAgRmllbGRNYXNrVXRpbDo6RnJvbVN0cmluZygiY2hpbGQuY2hpbGQucGF5bG9hZCIsICZtYXNrKTsKKyAgRmllbGRNYXNrVXRpbDo6VHJpbU1lc3NhZ2UobWFzaywgJnRyaW1tZWRfbXNnKTsKKyAgRVhQRUNUX0VRKDAsIHRyaW1tZWRfbXNnLmNoaWxkKCkucGF5bG9hZCgpLm9wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoNTY3OCwgdHJpbW1lZF9tc2cuY2hpbGQoKS5jaGlsZCgpLnBheWxvYWQoKS5vcHRpb25hbF9pbnQzMigpKTsKKworICB0cmltbWVkX21zZyA9IG5lc3RlZF9tc2c7CisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoImNoaWxkIiwgJm1hc2spOworICBGaWVsZE1hc2tVdGlsOjpUcmltTWVzc2FnZShtYXNrLCAmdHJpbW1lZF9tc2cpOworICBFWFBFQ1RfRVEoMTIzNCwgdHJpbW1lZF9tc2cuY2hpbGQoKS5wYXlsb2FkKCkub3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9FUSg1Njc4LCB0cmltbWVkX21zZy5jaGlsZCgpLmNoaWxkKCkucGF5bG9hZCgpLm9wdGlvbmFsX2ludDMyKCkpOworCisgIHRyaW1tZWRfbXNnID0gbmVzdGVkX21zZzsKKyAgRmllbGRNYXNrVXRpbDo6RnJvbVN0cmluZygiY2hpbGQuY2hpbGQiLCAmbWFzayk7CisgIEZpZWxkTWFza1V0aWw6OlRyaW1NZXNzYWdlKG1hc2ssICZ0cmltbWVkX21zZyk7CisgIEVYUEVDVF9FUSgwLCB0cmltbWVkX21zZy5jaGlsZCgpLnBheWxvYWQoKS5vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKDU2NzgsIHRyaW1tZWRfbXNnLmNoaWxkKCkuY2hpbGQoKS5wYXlsb2FkKCkub3B0aW9uYWxfaW50MzIoKSk7CisKKyAgLy8gVmVyaWZ5IHRoYW4gYW4gZW1wdHkgRmllbGRNYXNrIHRyaW1zIG5vdGhpbmcKKyAgVGVzdEFsbFR5cGVzIGFsbF90eXBlc19tc2c7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJmFsbF90eXBlc19tc2cpOworICBUZXN0QWxsVHlwZXMgdHJpbW1lZF9hbGxfdHlwZXMoYWxsX3R5cGVzX21zZyk7CisgIEZpZWxkTWFzayBlbXB0eV9tYXNrOworICBGaWVsZE1hc2tVdGlsOjpUcmltTWVzc2FnZShlbXB0eV9tYXNrLCAmdHJpbW1lZF9hbGxfdHlwZXMpOworICBFWFBFQ1RfRVEodHJpbW1lZF9hbGxfdHlwZXMuRGVidWdTdHJpbmcoKSwgYWxsX3R5cGVzX21zZy5EZWJ1Z1N0cmluZygpKTsKKworICAvLyBUZXN0IHRyaW0gcmVxdWlyZWQgZmllbGRzIHdpdGgga2VlcF9yZXF1aXJlZF9maWVsZHMgaXMgc2V0IHRydWUuCisgIEZpZWxkTWFza1V0aWw6OlRyaW1PcHRpb25zIG9wdGlvbnM7CisgIFRlc3RSZXF1aXJlZCByZXF1aXJlZF9tc2dfMTsKKyAgcmVxdWlyZWRfbXNnXzEuc2V0X2EoMTIzNCk7CisgIHJlcXVpcmVkX21zZ18xLnNldF9iKDM0NTYpOworICByZXF1aXJlZF9tc2dfMS5zZXRfYyg1Njc4KTsKKyAgVGVzdFJlcXVpcmVkIHRyaW1tZWRfcmVxdWlyZWRfbXNnXzEocmVxdWlyZWRfbXNnXzEpOworICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJkdW1teTIiLCAmbWFzayk7CisgIG9wdGlvbnMuc2V0X2tlZXBfcmVxdWlyZWRfZmllbGRzKHRydWUpOworICBGaWVsZE1hc2tVdGlsOjpUcmltTWVzc2FnZShtYXNrLCAmdHJpbW1lZF9yZXF1aXJlZF9tc2dfMSwgb3B0aW9ucyk7CisgIEVYUEVDVF9FUSh0cmltbWVkX3JlcXVpcmVkX21zZ18xLkRlYnVnU3RyaW5nKCksIHJlcXVpcmVkX21zZ18xLkRlYnVnU3RyaW5nKCkpOworCisgIC8vIFRlc3QgdHJpbSByZXF1aXJlZCBmaWVsZHMgd2l0aCBrZWVwX3JlcXVpcmVkX2ZpZWxkcyBpcyBzZXQgZmFsc2UuCisgIHJlcXVpcmVkX21zZ18xLmNsZWFyX2EoKTsKKyAgcmVxdWlyZWRfbXNnXzEuY2xlYXJfYigpOworICByZXF1aXJlZF9tc2dfMS5jbGVhcl9jKCk7CisgIG9wdGlvbnMuc2V0X2tlZXBfcmVxdWlyZWRfZmllbGRzKGZhbHNlKTsKKyAgRmllbGRNYXNrVXRpbDo6VHJpbU1lc3NhZ2UobWFzaywgJnRyaW1tZWRfcmVxdWlyZWRfbXNnXzEsIG9wdGlvbnMpOworICBFWFBFQ1RfRVEodHJpbW1lZF9yZXF1aXJlZF9tc2dfMS5EZWJ1Z1N0cmluZygpLCByZXF1aXJlZF9tc2dfMS5EZWJ1Z1N0cmluZygpKTsKKworICAvLyBUZXN0IHRyaW0gcmVxdWlyZWQgbWVzc2FnZSB3aXRoIGtlZXBfcmVxdWlyZWRfZmllbGRzIGlzIHNldCB0cnVlLgorICBUZXN0UmVxdWlyZWRNZXNzYWdlIHJlcXVpcmVkX21zZ18yOworICByZXF1aXJlZF9tc2dfMi5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2EoMTIzNCk7CisgIHJlcXVpcmVkX21zZ18yLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpLT5zZXRfYigzNDU2KTsKKyAgcmVxdWlyZWRfbXNnXzIubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCktPnNldF9jKDU2NzgpOworICByZXF1aXJlZF9tc2dfMi5tdXRhYmxlX3JlcXVpcmVkX21lc3NhZ2UoKS0+c2V0X2EoMTIzNCk7CisgIHJlcXVpcmVkX21zZ18yLm11dGFibGVfcmVxdWlyZWRfbWVzc2FnZSgpLT5zZXRfYigzNDU2KTsKKyAgcmVxdWlyZWRfbXNnXzIubXV0YWJsZV9yZXF1aXJlZF9tZXNzYWdlKCktPnNldF9jKDU2NzgpOworICByZXF1aXJlZF9tc2dfMi5tdXRhYmxlX3JlcXVpcmVkX21lc3NhZ2UoKS0+c2V0X2R1bW15Mig3ODkwKTsKKyAgVGVzdFJlcXVpcmVkKiByZXBlYXRlZF9tc2cgPSByZXF1aXJlZF9tc2dfMi5hZGRfcmVwZWF0ZWRfbWVzc2FnZSgpOworICByZXBlYXRlZF9tc2ctPnNldF9hKDEyMzQpOworICByZXBlYXRlZF9tc2ctPnNldF9iKDM0NTYpOworICByZXBlYXRlZF9tc2ctPnNldF9jKDU2NzgpOworICBUZXN0UmVxdWlyZWRNZXNzYWdlIHRyaW1tZWRfcmVxdWlyZWRfbXNnXzIocmVxdWlyZWRfbXNnXzIpOworICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKCJvcHRpb25hbF9tZXNzYWdlLmR1bW15MiIsICZtYXNrKTsKKyAgb3B0aW9ucy5zZXRfa2VlcF9yZXF1aXJlZF9maWVsZHModHJ1ZSk7CisgIHJlcXVpcmVkX21zZ18yLmNsZWFyX3JlcGVhdGVkX21lc3NhZ2UoKTsKKyAgcmVxdWlyZWRfbXNnXzIubXV0YWJsZV9yZXF1aXJlZF9tZXNzYWdlKCktPmNsZWFyX2R1bW15MigpOworICBGaWVsZE1hc2tVdGlsOjpUcmltTWVzc2FnZShtYXNrLCAmdHJpbW1lZF9yZXF1aXJlZF9tc2dfMiwgb3B0aW9ucyk7CisgIEVYUEVDVF9FUSh0cmltbWVkX3JlcXVpcmVkX21zZ18yLkRlYnVnU3RyaW5nKCksIHJlcXVpcmVkX21zZ18yLkRlYnVnU3RyaW5nKCkpOworCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoInJlcXVpcmVkX21lc3NhZ2UiLCAmbWFzayk7CisgIHJlcXVpcmVkX21zZ18yLm11dGFibGVfcmVxdWlyZWRfbWVzc2FnZSgpLT5zZXRfZHVtbXkyKDc4OTApOworICB0cmltbWVkX3JlcXVpcmVkX21zZ18yLm11dGFibGVfcmVxdWlyZWRfbWVzc2FnZSgpLT5zZXRfZHVtbXkyKDc4OTApOworICByZXF1aXJlZF9tc2dfMi5jbGVhcl9vcHRpb25hbF9tZXNzYWdlKCk7CisgIEZpZWxkTWFza1V0aWw6OlRyaW1NZXNzYWdlKG1hc2ssICZ0cmltbWVkX3JlcXVpcmVkX21zZ18yLCBvcHRpb25zKTsKKyAgRVhQRUNUX0VRKHRyaW1tZWRfcmVxdWlyZWRfbXNnXzIuRGVidWdTdHJpbmcoKSwgcmVxdWlyZWRfbXNnXzIuRGVidWdTdHJpbmcoKSk7CisKKyAgLy8gVGVzdCB0cmltIHJlcXVpcmVkIG1lc3NhZ2Ugd2l0aCBrZWVwX3JlcXVpcmVkX2ZpZWxkcyBpcyBzZXQgZmFsc2UuCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoInJlcXVpcmVkX21lc3NhZ2UuZHVtbXkyIiwgJm1hc2spOworICByZXF1aXJlZF9tc2dfMi5tdXRhYmxlX3JlcXVpcmVkX21lc3NhZ2UoKS0+Y2xlYXJfYSgpOworICByZXF1aXJlZF9tc2dfMi5tdXRhYmxlX3JlcXVpcmVkX21lc3NhZ2UoKS0+Y2xlYXJfYigpOworICByZXF1aXJlZF9tc2dfMi5tdXRhYmxlX3JlcXVpcmVkX21lc3NhZ2UoKS0+Y2xlYXJfYygpOworICBvcHRpb25zLnNldF9rZWVwX3JlcXVpcmVkX2ZpZWxkcyhmYWxzZSk7CisgIEZpZWxkTWFza1V0aWw6OlRyaW1NZXNzYWdlKG1hc2ssICZ0cmltbWVkX3JlcXVpcmVkX21zZ18yLCBvcHRpb25zKTsKKyAgRVhQRUNUX0VRKHRyaW1tZWRfcmVxdWlyZWRfbXNnXzIuRGVidWdTdHJpbmcoKSwgcmVxdWlyZWRfbXNnXzIuRGVidWdTdHJpbmcoKSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgdHJpbW1pbmcgYW4gZW1wdHkgbWVzc2FnZSBoYXMgbm8gZWZmZWN0LiBJbiBwYXJ0aWN1bGFyLCBmaWVsZHMKKyAgLy8gbWVudGlvbmVkIGluIHRoZSBmaWVsZCBtYXNrIHNob3VsZCBub3QgYmUgY3JlYXRlZCBvciBjaGFuZ2VkLgorICBUZXN0QWxsVHlwZXMgZW1wdHlfbXNnOworICBGaWVsZE1hc2tVdGlsOjpGcm9tU3RyaW5nKAorICAgICAgIm9wdGlvbmFsX2ludDMyLG9wdGlvbmFsX2J5dGVzLG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiIiwgJm1hc2spOworICBGaWVsZE1hc2tVdGlsOjpUcmltTWVzc2FnZShtYXNrLCAmZW1wdHlfbXNnKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X21zZy5oYXNfb3B0aW9uYWxfaW50MzIoKSk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9tc2cuaGFzX29wdGlvbmFsX2J5dGVzKCkpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfbXNnLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKworICAvLyBWZXJpZnkgdHJpbW1pbmcgb2Ygb25lb2YgZmllbGRzLiBUaGlzIHNob3VsZCB3b3JrIGFzIGV4cGVjdGVkIGV2ZW4gaWYKKyAgLy8gbXVsdGlwbGUgZWxlbWVudHMgb2YgdGhlIHNhbWUgb25lb2YgYXJlIGluY2x1ZGVkIGluIHRoZSBGaWVsZE1hc2suCisgIFRlc3RBbGxUeXBlcyBvbmVvZl9tc2c7CisgIG9uZW9mX21zZy5zZXRfb25lb2ZfdWludDMyKDExKTsKKyAgRmllbGRNYXNrVXRpbDo6RnJvbVN0cmluZygib25lb2ZfdWludDMyLG9uZW9mX25lc3RlZF9tZXNzYWdlLmJiIiwgJm1hc2spOworICBGaWVsZE1hc2tVdGlsOjpUcmltTWVzc2FnZShtYXNrLCAmb25lb2ZfbXNnKTsKKyAgRVhQRUNUX0VRKDExLCBvbmVvZl9tc2cub25lb2ZfdWludDMyKCkpOworfQorCitURVNUKEZpZWxkTWFza1V0aWxUZXN0LCBUcmltTWVzc2FnZVJldHVyblZhbHVlKSB7CisgIEZpZWxkTWFzayBtYXNrOworICBUZXN0QWxsVHlwZXMgdHJpbWVkX21zZzsKKyAgVGVzdEFsbFR5cGVzIGRlZmF1bHRfbXNnOworCisgIC8vIEZpZWxkIG1hc2sgb24gb3B0aW9uYWwgZmllbGQuCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoIm9wdGlvbmFsX2ludDMyIiwgJm1hc2spOworCisgIC8vIFZlcmlmeSB0aGF0IGlmIGEgbWVzc2FnZSBpcyB1cGRhdGVkIGJ5IEZpZWxkTWFza1V0aWw6OlRyaW1NZXNzYWdlKCksIHRoZQorICAvLyBmdW5jdGlvbiByZXR1cm5zIHRydWUuCisgIC8vIFRlc3Qgb24gcHJpbWFyeSBmaWVsZC4KKyAgdHJpbWVkX21zZy5zZXRfb3B0aW9uYWxfc3RyaW5nKCJhYmMiKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6VHJpbU1lc3NhZ2UobWFzaywgJnRyaW1lZF9tc2cpKTsKKyAgRVhQRUNUX0VRKHRyaW1lZF9tc2cuRGVidWdTdHJpbmcoKSwgZGVmYXVsdF9tc2cuRGVidWdTdHJpbmcoKSk7CisgIHRyaW1lZF9tc2cuQ2xlYXIoKTsKKworICAvLyBUZXN0IG9uIHJlcGVhdGVkIHByaW1hcnkgZmllbGQuCisgIHRyaW1lZF9tc2cuYWRkX3JlcGVhdGVkX3N0cmluZygiYWJjIik7CisgIHRyaW1lZF9tc2cuYWRkX3JlcGVhdGVkX3N0cmluZygiZGVmIik7CisgIEVYUEVDVF9UUlVFKEZpZWxkTWFza1V0aWw6OlRyaW1NZXNzYWdlKG1hc2ssICZ0cmltZWRfbXNnKSk7CisgIEVYUEVDVF9FUSh0cmltZWRfbXNnLkRlYnVnU3RyaW5nKCksIGRlZmF1bHRfbXNnLkRlYnVnU3RyaW5nKCkpOworICB0cmltZWRfbXNnLkNsZWFyKCk7CisKKyAgLy8gVGVzdCBvbiBuZXN0ZWQgbWVzc2FnZS4KKyAgdHJpbWVkX21zZy5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxMjMpOworICBFWFBFQ1RfVFJVRShGaWVsZE1hc2tVdGlsOjpUcmltTWVzc2FnZShtYXNrLCAmdHJpbWVkX21zZykpOworICBFWFBFQ1RfRVEodHJpbWVkX21zZy5EZWJ1Z1N0cmluZygpLCBkZWZhdWx0X21zZy5EZWJ1Z1N0cmluZygpKTsKKyAgdHJpbWVkX21zZy5DbGVhcigpOworCisgIC8vIFRlc3Qgb24gcmVwZWF0ZWQgbmVzdGVkIG1lc3NhZ2UuCisgIHRyaW1lZF9tc2cuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxMjMpOworICB0cmltZWRfbXNnLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoNDU2KTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6VHJpbU1lc3NhZ2UobWFzaywgJnRyaW1lZF9tc2cpKTsKKyAgRVhQRUNUX0VRKHRyaW1lZF9tc2cuRGVidWdTdHJpbmcoKSwgZGVmYXVsdF9tc2cuRGVidWdTdHJpbmcoKSk7CisgIHRyaW1lZF9tc2cuQ2xlYXIoKTsKKworICAvLyBUZXN0IG9uIG9uZW9mIGZpZWxkLgorICB0cmltZWRfbXNnLnNldF9vbmVvZl91aW50MzIoMTIzKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRNYXNrVXRpbDo6VHJpbU1lc3NhZ2UobWFzaywgJnRyaW1lZF9tc2cpKTsKKyAgRVhQRUNUX0VRKHRyaW1lZF9tc2cuRGVidWdTdHJpbmcoKSwgZGVmYXVsdF9tc2cuRGVidWdTdHJpbmcoKSk7CisgIHRyaW1lZF9tc2cuQ2xlYXIoKTsKKworICAvLyBJZiB0aGVyZSBpcyBubyBmaWVsZCBzZXQgb3RoZXIgdGhlbiB0aG9zZSB3aGl0ZWxpc3RlZCwKKyAgLy8gRmllbGRNYXNrVXRpbDo6VHJpbU1lc3NhZ2UoKSBzaG91bGQgcmV0dXJuIGZhbHNlLgorICB0cmltZWRfbXNnLnNldF9vcHRpb25hbF9pbnQzMigxMjMpOworICBFWFBFQ1RfRkFMU0UoRmllbGRNYXNrVXRpbDo6VHJpbU1lc3NhZ2UobWFzaywgJnRyaW1lZF9tc2cpKTsKKyAgRVhQRUNUX0VRKHRyaW1lZF9tc2cub3B0aW9uYWxfaW50MzIoKSwgMTIzKTsKKyAgdHJpbWVkX21zZy5DbGVhcigpOworCisgIC8vIEZpZWxkIG1hc2sgb24gcmVwZWF0ZWQgZmllbGQuCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoInJlcGVhdGVkX3N0cmluZyIsICZtYXNrKTsKKyAgdHJpbWVkX21zZy5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJhYmMiKTsKKyAgdHJpbWVkX21zZy5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJkZWYiKTsKKyAgRVhQRUNUX0ZBTFNFKEZpZWxkTWFza1V0aWw6OlRyaW1NZXNzYWdlKG1hc2ssICZ0cmltZWRfbXNnKSk7CisgIEVYUEVDVF9FUSh0cmltZWRfbXNnLnJlcGVhdGVkX3N0cmluZygwKSwgImFiYyIpOworICBFWFBFQ1RfRVEodHJpbWVkX21zZy5yZXBlYXRlZF9zdHJpbmcoMSksICJkZWYiKTsKKyAgdHJpbWVkX21zZy5DbGVhcigpOworCisgIC8vIEZpZWxkIG1hc2sgb24gbmVzdGVkIG1lc3NhZ2UuCisgIEZpZWxkTWFza1V0aWw6OkZyb21TdHJpbmcoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiIiwgJm1hc2spOworICB0cmltZWRfbXNnLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDEyMyk7CisgIEVYUEVDVF9GQUxTRShGaWVsZE1hc2tVdGlsOjpUcmltTWVzc2FnZShtYXNrLCAmdHJpbWVkX21zZykpOworICBFWFBFQ1RfRVEodHJpbWVkX21zZy5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCksIDEyMyk7CisgIHRyaW1lZF9tc2cuQ2xlYXIoKTsKKworICAvLyBUT0RPKGIvMzI0NDMzMjApOiBmaWVsZCBtYXNrIG9uIHJlcGVhdGVkIG5lc3RlZCBtZXNzYWdlIGlzIG5vdCB5ZXQKKyAgLy8gc3VwcG9ydGVkLgorfQorCisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2NvbnN0YW50cy5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2NvbnN0YW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZGVkODYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvY29uc3RhbnRzLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX0NPTlNUQU5UU19IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfQ09OU1RBTlRTX0hfXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGNvbnN0YW50cyB1c2VkIGJ5IC8vbmV0L3Byb3RvMi91dGlsL2NvbnZlcnRlci4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisvLyBQcmVmaXggZm9yIHR5cGUgVVJMcy4KK2NvbnN0IGNoYXIga1R5cGVTZXJ2aWNlQmFzZVVybFtdID0gInR5cGUuZ29vZ2xlYXBpcy5jb20iOworCisvLyBGb3JtYXQgc3RyaW5nIGZvciBSRkMzMzM5IHRpbWVzdGFtcCBmb3JtYXR0aW5nLgorY29uc3QgY2hhciBrUmZjMzMzOVRpbWVGb3JtYXRbXSA9ICIlRTRZLSVtLSVkVCVIOiVNOiVTIjsKKworLy8gU2FtZSBhcyBhYm92ZSwgYnV0IHRoZSB5ZWFyIHZhbHVlIGlzIG5vdCB6ZXJvLXBhZGRlZCBpLmUuIHRoaXMgYWNjZXB0cworLy8gdGltZXN0YW1wcyBsaWtlICIxLTAxLTAwMDFUMjM6NTk6NTlaIiBpbnN0ZWFkIG9mICIwMDAxLTAxLTAwMDFUMjM6NTk6NTlaIi4KK2NvbnN0IGNoYXIga1JmYzMzMzlUaW1lRm9ybWF0Tm9QYWRkaW5nW10gPSAiJVktJW0tJWRUJUg6JU06JVMiOworCisvLyBNaW5pbXVtIHNlY29uZHMgYWxsb3dlZCBpbiBhIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgdmFsdWUuCitjb25zdCBpbnQ2NF90IGtUaW1lc3RhbXBNaW5TZWNvbmRzID0gLTYyMTM1NTk2ODAwTEw7CisKKy8vIE1heGltdW0gc2Vjb25kcyBhbGxvd2VkIGluIGEgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCB2YWx1ZS4KK2NvbnN0IGludDY0X3Qga1RpbWVzdGFtcE1heFNlY29uZHMgPSAyNTM0MDIzMDA3OTlMTDsKKworLy8gTWluaW11bSBzZWNvbmRzIGFsbG93ZWQgaW4gYSBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gdmFsdWUuCitjb25zdCBpbnQ2NF90IGtEdXJhdGlvbk1pblNlY29uZHMgPSAtMzE1NTc2MDAwMDAwTEw7CisKKy8vIE1heGltdW0gc2Vjb25kcyBhbGxvd2VkIGluIGEgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIHZhbHVlLgorY29uc3QgaW50NjRfdCBrRHVyYXRpb25NYXhTZWNvbmRzID0gMzE1NTc2MDAwMDAwTEw7CisKKy8vIE5hbm8gc2Vjb25kcyBpbiBhIHNlY29uZC4KK2NvbnN0IGludDMyX3Qga05hbm9zUGVyU2Vjb25kID0gMTAwMDAwMDAwMDsKKworLy8gVHlwZSB1cmwgcmVwcmVzZW50aW5nIE5VTEwgdmFsdWVzIGluIGdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QgdHlwZS4KK2NvbnN0IGNoYXIga1N0cnVjdE51bGxWYWx1ZVR5cGVVcmxbXSA9CisgICAgInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZSI7CisKKy8vIFR5cGUgc3RyaW5nIGZvciBnb29nbGUucHJvdG9idWYuU3RydWN0Citjb25zdCBjaGFyIGtTdHJ1Y3RUeXBlW10gPSAiZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCI7CisKKy8vIFR5cGUgc3RyaW5nIGZvciBzdHJ1Y3QucHJvdG8ncyBnb29nbGUucHJvdG9idWYuVmFsdWUgdmFsdWUgdHlwZS4KK2NvbnN0IGNoYXIga1N0cnVjdFZhbHVlVHlwZVtdID0gImdvb2dsZS5wcm90b2J1Zi5WYWx1ZSI7CisKKy8vIFR5cGUgc3RyaW5nIGZvciBzdHJ1Y3QucHJvdG8ncyBnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlIHZhbHVlIHR5cGUuCitjb25zdCBjaGFyIGtTdHJ1Y3RMaXN0VmFsdWVUeXBlW10gPSAiZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZSI7CisKKy8vIFR5cGUgc3RyaW5nIGZvciBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wCitjb25zdCBjaGFyIGtUaW1lc3RhbXBUeXBlW10gPSAiZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCI7CisKKy8vIFR5cGUgc3RyaW5nIGZvciBnb29nbGUucHJvdG9idWYuRHVyYXRpb24KK2NvbnN0IGNoYXIga0R1cmF0aW9uVHlwZVtdID0gImdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiI7CisKKy8vIFR5cGUgVVJMIGZvciBzdHJ1Y3QgdmFsdWUgdHlwZSBnb29nbGUucHJvdG9idWYuVmFsdWUKK2NvbnN0IGNoYXIga1N0cnVjdFZhbHVlVHlwZVVybFtdID0gInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlZhbHVlIjsKKworLy8gVHlwZSBzdHJpbmcgZm9yIGdvb2dsZS5wcm90b2J1Zi5BbnkKK2NvbnN0IGNoYXIga0FueVR5cGVbXSA9ICJnb29nbGUucHJvdG9idWYuQW55IjsKKworLy8gVGhlIHByb3RvYnVmIG9wdGlvbiBuYW1lIG9mIGpzcGIubWVzc2FnZV9pZDsKK2NvbnN0IGNoYXIga09wdGlvbkpzcGJNZXNzYWdlSWRbXSA9ICJqc3BiLm1lc3NhZ2VfaWQiOworCit9ICAvLyBuYW1lc3BhY2UgY29udmVydGVyCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX0NPTlNUQU5UU19IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kYXRhcGllY2UuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGF0YXBpZWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlN2FhODQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGF0YXBpZWNlLmNjCkBAIC0wLDAgKzEsNDQxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RhdGFwaWVjZS5oPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3RydWN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3V0aWxpdHkuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWF0aHV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKK3VzaW5nIHV0aWw6OlN0YXR1czsKKworbmFtZXNwYWNlIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPgordXRpbDo6U3RhdHVzT3I8VG8+IFZhbGlkYXRlTnVtYmVyQ29udmVyc2lvbihUbyBhZnRlciwgRnJvbSBiZWZvcmUpIHsKKyAgaWYgKGFmdGVyID09IGJlZm9yZSAmJgorICAgICAgTWF0aFV0aWw6OlNpZ248RnJvbT4oYmVmb3JlKSA9PSBNYXRoVXRpbDo6U2lnbjxUbz4oYWZ0ZXIpKSB7CisgICAgcmV0dXJuIGFmdGVyOworICB9IGVsc2UgeworICAgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigKKyAgICAgICAgc3RkOjppc19pbnRlZ3JhbDxGcm9tPjo6dmFsdWUgICAgICAgPyBWYWx1ZUFzU3RyaW5nKGJlZm9yZSkKKyAgICAgICAgOiBzdGQ6OmlzX3NhbWU8RnJvbSwgZG91YmxlPjo6dmFsdWUgPyBEb3VibGVBc1N0cmluZyhiZWZvcmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRmxvYXRBc1N0cmluZyhiZWZvcmUpKTsKKyAgfQorfQorCisvLyBGb3IgZ2VuZXJhbCBjb252ZXJzaW9uIGJldHdlZW4KKy8vICAgICBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBkb3VibGUgYW5kIGZsb2F0CisvLyBleGNlcHQgY29udmVyc2lvbiBiZXR3ZWVuIGRvdWJsZSBhbmQgZmxvYXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+Cit1dGlsOjpTdGF0dXNPcjxUbz4gTnVtYmVyQ29udmVydEFuZENoZWNrKEZyb20gYmVmb3JlKSB7CisgIGlmIChzdGQ6OmlzX3NhbWU8RnJvbSwgVG8+Ojp2YWx1ZSkgcmV0dXJuIGJlZm9yZTsKKworICBUbyBhZnRlciA9IHN0YXRpY19jYXN0PFRvPihiZWZvcmUpOworICByZXR1cm4gVmFsaWRhdGVOdW1iZXJDb252ZXJzaW9uKGFmdGVyLCBiZWZvcmUpOworfQorCisvLyBGb3IgY29udmVyc2lvbiB0byBpbnRlZ2VyIHR5cGVzIChpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0KSBmcm9tIGZsb2F0aW5nCisvLyBwb2ludCB0eXBlcyAoZG91YmxlLCBmbG9hdCkgb25seS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4KK3V0aWw6OlN0YXR1c09yPFRvPiBGbG9hdGluZ1BvaW50VG9JbnRDb252ZXJ0QW5kQ2hlY2soRnJvbSBiZWZvcmUpIHsKKyAgaWYgKHN0ZDo6aXNfc2FtZTxGcm9tLCBUbz46OnZhbHVlKSByZXR1cm4gYmVmb3JlOworCisgIFRvIGFmdGVyID0gc3RhdGljX2Nhc3Q8VG8+KGJlZm9yZSk7CisgIHJldHVybiBWYWxpZGF0ZU51bWJlckNvbnZlcnNpb24oYWZ0ZXIsIGJlZm9yZSk7Cit9CisKKy8vIEZvciBjb252ZXJzaW9uIGJldHdlZW4gZG91YmxlIGFuZCBmbG9hdCBvbmx5LgordXRpbDo6U3RhdHVzT3I8ZG91YmxlPiBGbG9hdFRvRG91YmxlKGZsb2F0IGJlZm9yZSkgeworICAvLyBDYXN0aW5nIGZsb2F0IHRvIGRvdWJsZSBzaG91bGQganVzdCB3b3JrIGFzIGRvdWJsZSBoYXMgbW9yZSBwcmVjaXNpb24KKyAgLy8gdGhhbiBmbG9hdC4KKyAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4oYmVmb3JlKTsKK30KKwordXRpbDo6U3RhdHVzT3I8ZmxvYXQ+IERvdWJsZVRvRmxvYXQoZG91YmxlIGJlZm9yZSkgeworICBpZiAoc3RkOjppc25hbihiZWZvcmUpKSB7CisgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpxdWlldF9OYU4oKTsKKyAgfSBlbHNlIGlmICghc3RkOjppc2Zpbml0ZShiZWZvcmUpKSB7CisgICAgLy8gQ29udmVydGluZyBhIGRvdWJsZSAraW5mLy1pbmYgdG8gZmxvYXQgc2hvdWxkIGp1c3Qgd29yay4KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJlZm9yZSk7CisgIH0gZWxzZSBpZiAoYmVmb3JlID4gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46Om1heCgpIHx8CisgICAgICAgICAgICAgYmVmb3JlIDwgLXN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjptYXgoKSkgeworICAgIC8vIFNvbWUgZG91YmxlcyBhcmUgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3QgZmxvYXQsIGJ1dCBhZnRlcgorICAgIC8vIHJvdW5kaW5nIHRoZXkgd2lsbCBiZSBlcXVhbCB0byB0aGUgbGFyZ2VzdCBmbG9hdC4KKyAgICAvLyBXZSBjYW4ndCBqdXN0IGF0dGVtcHQgdGhlIGNvbnZlcnNpb24gYmVjYXVzZSB0aGF0IGhhcyBVQiBpZgorICAgIC8vIHRoZSB2YWx1ZSByZWFsbHkgaXMgb3V0LW9mLXJhbmdlLgorICAgIC8vIEhlcmUgd2UgdGFrZSBhZHZhbnRhZ2UgdGhhdCAxLzItaW5nIGEgbGFyZ2UgZmxvYXRpbmcgcG9pbnQKKyAgICAvLyB3aWxsIG5vdCBsb3NlIHByZWNpc2lvbi4KKyAgICBkb3VibGUgaGFsZl9iZWZvcmUgPSBiZWZvcmUgKiAwLjU7CisgICAgaWYgKGhhbGZfYmVmb3JlIDwgc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46Om1heCgpICYmCisgICAgICAgIGhhbGZfYmVmb3JlID4gLXN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjptYXgoKSkgeworICAgICAgY29uc3QgZmxvYXQgaGFsZl9mbWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46Om1heCgpICogMC41ZjsKKyAgICAgIC8vIElmIGFmdGVyIGJlaW5nIGN1dCBpbiBoYWxmLCB0aGUgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBsYXJnZXN0IGZsb2F0LAorICAgICAgLy8gdGhlbiBpdCdzIHNhZmUgdG8gY29udmVydCBpdCB0byBmbG9hdC4gIEltcG9ydGFudGx5LCB0aGlzIGNvbnZlcnNpb24KKyAgICAgIC8vIHJvdW5kcyBpbiB0aGUgc2FtZSB3YXkgdGhhdCB0aGUgb3JpZ2luYWwgZG9lcy4KKyAgICAgIGZsb2F0IGhhbGZfYWZ0ZXIgPSBzdGF0aWNfY2FzdDxmbG9hdD4oaGFsZl9iZWZvcmUpOworICAgICAgaWYgKGhhbGZfYWZ0ZXIgPD0gaGFsZl9mbWF4ICYmIGhhbGZfYWZ0ZXIgPj0gLWhhbGZfZm1heCkgeworICAgICAgICByZXR1cm4gaGFsZl9hZnRlciArIGhhbGZfYWZ0ZXI7CisgICAgICB9CisgICAgfQorICAgIC8vIERvdWJsZSB2YWx1ZSBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiBmbG9hdC4KKyAgICByZXR1cm4gdXRpbDo6SW52YWxpZEFyZ3VtZW50RXJyb3IoRG91YmxlQXNTdHJpbmcoYmVmb3JlKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihiZWZvcmUpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit1dGlsOjpTdGF0dXNPcjxpbnQzMl90PiBEYXRhUGllY2U6OlRvSW50MzIoKSBjb25zdCB7CisgIGlmICh0eXBlXyA9PSBUWVBFX1NUUklORykKKyAgICByZXR1cm4gU3RyaW5nVG9OdW1iZXI8aW50MzJfdD4oc2FmZV9zdHJ0bzMyKTsKKworICBpZiAodHlwZV8gPT0gVFlQRV9ET1VCTEUpCisgICAgcmV0dXJuIEZsb2F0aW5nUG9pbnRUb0ludENvbnZlcnRBbmRDaGVjazxpbnQzMl90LCBkb3VibGU+KGRvdWJsZV8pOworCisgIGlmICh0eXBlXyA9PSBUWVBFX0ZMT0FUKQorICAgIHJldHVybiBGbG9hdGluZ1BvaW50VG9JbnRDb252ZXJ0QW5kQ2hlY2s8aW50MzJfdCwgZmxvYXQ+KGZsb2F0Xyk7CisKKyAgcmV0dXJuIEdlbmVyaWNDb252ZXJ0PGludDMyX3Q+KCk7Cit9CisKK3V0aWw6OlN0YXR1c09yPHVpbnQzMl90PiBEYXRhUGllY2U6OlRvVWludDMyKCkgY29uc3QgeworICBpZiAodHlwZV8gPT0gVFlQRV9TVFJJTkcpCisgICAgcmV0dXJuIFN0cmluZ1RvTnVtYmVyPHVpbnQzMl90PihzYWZlX3N0cnRvdTMyKTsKKworICBpZiAodHlwZV8gPT0gVFlQRV9ET1VCTEUpCisgICAgcmV0dXJuIEZsb2F0aW5nUG9pbnRUb0ludENvbnZlcnRBbmRDaGVjazx1aW50MzJfdCwgZG91YmxlPihkb3VibGVfKTsKKworICBpZiAodHlwZV8gPT0gVFlQRV9GTE9BVCkKKyAgICByZXR1cm4gRmxvYXRpbmdQb2ludFRvSW50Q29udmVydEFuZENoZWNrPHVpbnQzMl90LCBmbG9hdD4oZmxvYXRfKTsKKworICByZXR1cm4gR2VuZXJpY0NvbnZlcnQ8dWludDMyX3Q+KCk7Cit9CisKK3V0aWw6OlN0YXR1c09yPGludDY0X3Q+IERhdGFQaWVjZTo6VG9JbnQ2NCgpIGNvbnN0IHsKKyAgaWYgKHR5cGVfID09IFRZUEVfU1RSSU5HKQorICAgIHJldHVybiBTdHJpbmdUb051bWJlcjxpbnQ2NF90PihzYWZlX3N0cnRvNjQpOworCisgIGlmICh0eXBlXyA9PSBUWVBFX0RPVUJMRSkKKyAgICByZXR1cm4gRmxvYXRpbmdQb2ludFRvSW50Q29udmVydEFuZENoZWNrPGludDY0X3QsIGRvdWJsZT4oZG91YmxlXyk7CisKKyAgaWYgKHR5cGVfID09IFRZUEVfRkxPQVQpCisgICAgcmV0dXJuIEZsb2F0aW5nUG9pbnRUb0ludENvbnZlcnRBbmRDaGVjazxpbnQ2NF90LCBmbG9hdD4oZmxvYXRfKTsKKworICByZXR1cm4gR2VuZXJpY0NvbnZlcnQ8aW50NjRfdD4oKTsKK30KKwordXRpbDo6U3RhdHVzT3I8dWludDY0X3Q+IERhdGFQaWVjZTo6VG9VaW50NjQoKSBjb25zdCB7CisgIGlmICh0eXBlXyA9PSBUWVBFX1NUUklORykKKyAgICByZXR1cm4gU3RyaW5nVG9OdW1iZXI8dWludDY0X3Q+KHNhZmVfc3RydG91NjQpOworCisgIGlmICh0eXBlXyA9PSBUWVBFX0RPVUJMRSkKKyAgICByZXR1cm4gRmxvYXRpbmdQb2ludFRvSW50Q29udmVydEFuZENoZWNrPHVpbnQ2NF90LCBkb3VibGU+KGRvdWJsZV8pOworCisgIGlmICh0eXBlXyA9PSBUWVBFX0ZMT0FUKQorICAgIHJldHVybiBGbG9hdGluZ1BvaW50VG9JbnRDb252ZXJ0QW5kQ2hlY2s8dWludDY0X3QsIGZsb2F0PihmbG9hdF8pOworCisgIHJldHVybiBHZW5lcmljQ29udmVydDx1aW50NjRfdD4oKTsKK30KKwordXRpbDo6U3RhdHVzT3I8ZG91YmxlPiBEYXRhUGllY2U6OlRvRG91YmxlKCkgY29uc3QgeworICBpZiAodHlwZV8gPT0gVFlQRV9GTE9BVCkgeworICAgIHJldHVybiBGbG9hdFRvRG91YmxlKGZsb2F0Xyk7CisgIH0KKyAgaWYgKHR5cGVfID09IFRZUEVfU1RSSU5HKSB7CisgICAgaWYgKHN0cl8gPT0gIkluZmluaXR5IikgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKKyAgICBpZiAoc3RyXyA9PSAiLUluZmluaXR5IikgcmV0dXJuIC1zdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgICAgaWYgKHN0cl8gPT0gIk5hTiIpIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OnF1aWV0X05hTigpOworICAgIHV0aWw6OlN0YXR1c09yPGRvdWJsZT4gdmFsdWUgPSBTdHJpbmdUb051bWJlcjxkb3VibGU+KHNhZmVfc3RydG9kKTsKKyAgICBpZiAodmFsdWUub2soKSAmJiAhc3RkOjppc2Zpbml0ZSh2YWx1ZS52YWx1ZSgpKSkgeworICAgICAgLy8gc2FmZV9zdHJ0b2QgY29udmVydHMgb3V0LW9mLXJhbmdlIHZhbHVlcyB0byAraW5mLy1pbmYsIGJ1dCB3ZSB3YW50CisgICAgICAvLyB0byByZXBvcnQgdGhlbSBhcyBlcnJvcnMuCisgICAgICByZXR1cm4gdXRpbDo6SW52YWxpZEFyZ3VtZW50RXJyb3IoU3RyQ2F0KCJcIiIsIHN0cl8sICJcIiIpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgfQorICByZXR1cm4gR2VuZXJpY0NvbnZlcnQ8ZG91YmxlPigpOworfQorCit1dGlsOjpTdGF0dXNPcjxmbG9hdD4gRGF0YVBpZWNlOjpUb0Zsb2F0KCkgY29uc3QgeworICBpZiAodHlwZV8gPT0gVFlQRV9ET1VCTEUpIHsKKyAgICByZXR1cm4gRG91YmxlVG9GbG9hdChkb3VibGVfKTsKKyAgfQorICBpZiAodHlwZV8gPT0gVFlQRV9TVFJJTkcpIHsKKyAgICBpZiAoc3RyXyA9PSAiSW5maW5pdHkiKSByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisgICAgaWYgKHN0cl8gPT0gIi1JbmZpbml0eSIpIHJldHVybiAtc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisgICAgaWYgKHN0cl8gPT0gIk5hTiIpIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6cXVpZXRfTmFOKCk7CisgICAgLy8gU2FmZVN0clRvRmxvYXQoKSBpcyB1c2VkIGluc3RlYWQgb2Ygc2FmZV9zdHJ0b2YoKSBiZWNhdXNlIHRoZSBsYXRlcgorICAgIC8vIGRvZXMgbm90IGZhaWwgb24gaW5wdXRzIGxpa2UgU2ltcGxlRHRvYShEQkxfTUFYKS4KKyAgICByZXR1cm4gU3RyaW5nVG9OdW1iZXI8ZmxvYXQ+KFNhZmVTdHJUb0Zsb2F0KTsKKyAgfQorICByZXR1cm4gR2VuZXJpY0NvbnZlcnQ8ZmxvYXQ+KCk7Cit9CisKK3V0aWw6OlN0YXR1c09yPGJvb2w+IERhdGFQaWVjZTo6VG9Cb29sKCkgY29uc3QgeworICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgY2FzZSBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gYm9vbF87CisgICAgY2FzZSBUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiBTdHJpbmdUb051bWJlcjxib29sPihzYWZlX3N0cnRvYik7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigKKyAgICAgICAgICBWYWx1ZUFzU3RyaW5nT3JEZWZhdWx0KCJXcm9uZyB0eXBlLiBDYW5ub3QgY29udmVydCB0byBCb29sLiIpKTsKKyAgfQorfQorCit1dGlsOjpTdGF0dXNPcjxzdGQ6OnN0cmluZz4gRGF0YVBpZWNlOjpUb1N0cmluZygpIGNvbnN0IHsKKyAgc3dpdGNoICh0eXBlXykgeworICAgIGNhc2UgVFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoc3RyXyk7CisgICAgY2FzZSBUWVBFX0JZVEVTOiB7CisgICAgICBzdGQ6OnN0cmluZyBiYXNlNjQ7CisgICAgICBCYXNlNjRFc2NhcGUoc3RyXywgJmJhc2U2NCk7CisgICAgICByZXR1cm4gYmFzZTY0OworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKAorICAgICAgICAgIFZhbHVlQXNTdHJpbmdPckRlZmF1bHQoIkNhbm5vdCBjb252ZXJ0IHRvIHN0cmluZy4iKSk7CisgIH0KK30KKworc3RkOjpzdHJpbmcgRGF0YVBpZWNlOjpWYWx1ZUFzU3RyaW5nT3JEZWZhdWx0KAorICAgIFN0cmluZ1BpZWNlIGRlZmF1bHRfc3RyaW5nKSBjb25zdCB7CisgIHN3aXRjaCAodHlwZV8pIHsKKyAgICBjYXNlIFRZUEVfSU5UMzI6CisgICAgICByZXR1cm4gU3RyQ2F0KGkzMl8pOworICAgIGNhc2UgVFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiBTdHJDYXQoaTY0Xyk7CisgICAgY2FzZSBUWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiBTdHJDYXQodTMyXyk7CisgICAgY2FzZSBUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiBTdHJDYXQodTY0Xyk7CisgICAgY2FzZSBUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiBEb3VibGVBc1N0cmluZyhkb3VibGVfKTsKKyAgICBjYXNlIFRZUEVfRkxPQVQ6CisgICAgICByZXR1cm4gRmxvYXRBc1N0cmluZyhmbG9hdF8pOworICAgIGNhc2UgVFlQRV9CT09MOgorICAgICAgcmV0dXJuIFNpbXBsZUJ0b2EoYm9vbF8pOworICAgIGNhc2UgVFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gU3RyQ2F0KCJcIiIsIHN0cl8uVG9TdHJpbmcoKSwgIlwiIik7CisgICAgY2FzZSBUWVBFX0JZVEVTOiB7CisgICAgICBzdGQ6OnN0cmluZyBiYXNlNjQ7CisgICAgICBXZWJTYWZlQmFzZTY0RXNjYXBlKHN0cl8sICZiYXNlNjQpOworICAgICAgcmV0dXJuIFN0ckNhdCgiXCIiLCBiYXNlNjQsICJcIiIpOworICAgIH0KKyAgICBjYXNlIFRZUEVfTlVMTDoKKyAgICAgIHJldHVybiAibnVsbCI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzdGQ6OnN0cmluZyhkZWZhdWx0X3N0cmluZyk7CisgIH0KK30KKwordXRpbDo6U3RhdHVzT3I8c3RkOjpzdHJpbmc+IERhdGFQaWVjZTo6VG9CeXRlcygpIGNvbnN0IHsKKyAgaWYgKHR5cGVfID09IFRZUEVfQllURVMpIHJldHVybiBzdHJfLlRvU3RyaW5nKCk7CisgIGlmICh0eXBlXyA9PSBUWVBFX1NUUklORykgeworICAgIHN0ZDo6c3RyaW5nIGRlY29kZWQ7CisgICAgaWYgKCFEZWNvZGVCYXNlNjQoc3RyXywgJmRlY29kZWQpKSB7CisgICAgICByZXR1cm4gdXRpbDo6SW52YWxpZEFyZ3VtZW50RXJyb3IoCisgICAgICAgICAgVmFsdWVBc1N0cmluZ09yRGVmYXVsdCgiSW52YWxpZCBkYXRhIGluIGlucHV0LiIpKTsKKyAgICB9CisgICAgcmV0dXJuIGRlY29kZWQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKFZhbHVlQXNTdHJpbmdPckRlZmF1bHQoCisgICAgICAgICJXcm9uZyB0eXBlLiBPbmx5IFN0cmluZyBvciBCeXRlcyBjYW4gYmUgY29udmVydGVkIHRvIEJ5dGVzLiIpKTsKKyAgfQorfQorCit1dGlsOjpTdGF0dXNPcjxpbnQ+IERhdGFQaWVjZTo6VG9FbnVtKGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVudW0qIGVudW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfbG93ZXJfY2FtZWxfZm9yX2VudW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNhc2VfaW5zZW5zaXRpdmVfZW51bV9wYXJzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yZV91bmtub3duX2VudW1fdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBpc191bmtub3duX2VudW1fdmFsdWUpIGNvbnN0IHsKKyAgaWYgKHR5cGVfID09IFRZUEVfTlVMTCkgcmV0dXJuIGdvb2dsZTo6cHJvdG9idWY6Ok5VTExfVkFMVUU7CisKKyAgaWYgKHR5cGVfID09IFRZUEVfU1RSSU5HKSB7CisgICAgLy8gRmlyc3QgdHJ5IHRoZSBnaXZlbiB2YWx1ZSBhcyBhIG5hbWUuCisgICAgc3RkOjpzdHJpbmcgZW51bV9uYW1lID0gc3RkOjpzdHJpbmcoc3RyXyk7CisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlKiB2YWx1ZSA9CisgICAgICAgIEZpbmRFbnVtVmFsdWVCeU5hbWVPck51bGwoZW51bV90eXBlLCBlbnVtX25hbWUpOworICAgIGlmICh2YWx1ZSAhPSBudWxscHRyKSByZXR1cm4gdmFsdWUtPm51bWJlcigpOworCisgICAgLy8gQ2hlY2sgaWYgaW50IHZlcnNpb24gb2YgZW51bSBpcyBzZW50IGFzIHN0cmluZy4KKyAgICB1dGlsOjpTdGF0dXNPcjxpbnQzMl90PiBpbnRfdmFsdWUgPSBUb0ludDMyKCk7CisgICAgaWYgKGludF92YWx1ZS5vaygpKSB7CisgICAgICBpZiAoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlKiBlbnVtX3ZhbHVlID0KKyAgICAgICAgICAgICAgRmluZEVudW1WYWx1ZUJ5TnVtYmVyT3JOdWxsKGVudW1fdHlwZSwgaW50X3ZhbHVlLnZhbHVlKCkpKSB7CisgICAgICAgIHJldHVybiBlbnVtX3ZhbHVlLT5udW1iZXIoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOZXh0IHRyeSBhIG5vcm1hbGl6ZWQgbmFtZS4KKyAgICBib29sIHNob3VsZF9ub3JtYWxpemVfZW51bSA9CisgICAgICAgIGNhc2VfaW5zZW5zaXRpdmVfZW51bV9wYXJzaW5nIHx8IHVzZV9sb3dlcl9jYW1lbF9mb3JfZW51bXM7CisgICAgaWYgKHNob3VsZF9ub3JtYWxpemVfZW51bSkgeworICAgICAgZm9yIChzdGQ6OnN0cmluZzo6aXRlcmF0b3IgaXQgPSBlbnVtX25hbWUuYmVnaW4oKTsgaXQgIT0gZW51bV9uYW1lLmVuZCgpOworICAgICAgICAgICArK2l0KSB7CisgICAgICAgICppdCA9ICppdCA9PSAnLScgPyAnXycgOiBhc2NpaV90b3VwcGVyKCppdCk7CisgICAgICB9CisgICAgICB2YWx1ZSA9IEZpbmRFbnVtVmFsdWVCeU5hbWVPck51bGwoZW51bV90eXBlLCBlbnVtX25hbWUpOworICAgICAgaWYgKHZhbHVlICE9IG51bGxwdHIpIHJldHVybiB2YWx1ZS0+bnVtYmVyKCk7CisgICAgfQorCisgICAgLy8gSWYgdXNlX2xvd2VyX2NhbWVsX2Zvcl9lbnVtcyBpcyB0cnVlIHRyeSB3aXRoIGVudW0gbmFtZSB3aXRob3V0CisgICAgLy8gdW5kZXJzY29yZS4gVGhpcyB3aWxsIGFsc28gYWNjZXB0IGNhbWVsIGNhc2UgbmFtZXMgYXMgdGhlIGVudW1fbmFtZSBoYXMKKyAgICAvLyBiZWVuIG5vcm1hbGl6ZWQgYmVmb3JlLgorICAgIGlmICh1c2VfbG93ZXJfY2FtZWxfZm9yX2VudW1zKSB7CisgICAgICB2YWx1ZSA9IEZpbmRFbnVtVmFsdWVCeU5hbWVXaXRob3V0VW5kZXJzY29yZU9yTnVsbChlbnVtX3R5cGUsIGVudW1fbmFtZSk7CisgICAgICBpZiAodmFsdWUgIT0gbnVsbHB0cikgcmV0dXJuIHZhbHVlLT5udW1iZXIoKTsKKyAgICB9CisKKyAgICAvLyBJZiBpZ25vcmVfdW5rbm93bl9lbnVtX3ZhbHVlcyBpcyB0cnVlIGFuIHVua25vd24gZW51bSB2YWx1ZSBpcyBpZ25vcmVkLgorICAgIGlmIChpZ25vcmVfdW5rbm93bl9lbnVtX3ZhbHVlcykgeworICAgICAgKmlzX3Vua25vd25fZW51bV92YWx1ZSA9IHRydWU7CisgICAgICBpZiAoZW51bV90eXBlLT5lbnVtdmFsdWVfc2l6ZSgpID4gMCkgeworICAgICAgICByZXR1cm4gZW51bV90eXBlLT5lbnVtdmFsdWUoMCkubnVtYmVyKCk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgdmFsdWUgaXMgYWN0dWFsbHkgZGVjbGFyZWQgaW4gdGhlCisgICAgLy8gZW51bSBiZWNhdXNlIHdlIHByZXNlcnZlIHVua25vd24gZW51bSB2YWx1ZXMgYXMgd2VsbC4KKyAgICByZXR1cm4gVG9JbnQzMigpOworICB9CisgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigKKyAgICAgIFZhbHVlQXNTdHJpbmdPckRlZmF1bHQoIkNhbm5vdCBmaW5kIGVudW0gd2l0aCBnaXZlbiB2YWx1ZS4iKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUbz4KK3V0aWw6OlN0YXR1c09yPFRvPiBEYXRhUGllY2U6OkdlbmVyaWNDb252ZXJ0KCkgY29uc3QgeworICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgY2FzZSBUWVBFX0lOVDMyOgorICAgICAgcmV0dXJuIE51bWJlckNvbnZlcnRBbmRDaGVjazxUbywgaW50MzJfdD4oaTMyXyk7CisgICAgY2FzZSBUWVBFX0lOVDY0OgorICAgICAgcmV0dXJuIE51bWJlckNvbnZlcnRBbmRDaGVjazxUbywgaW50NjRfdD4oaTY0Xyk7CisgICAgY2FzZSBUWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiBOdW1iZXJDb252ZXJ0QW5kQ2hlY2s8VG8sIHVpbnQzMl90Pih1MzJfKTsKKyAgICBjYXNlIFRZUEVfVUlOVDY0OgorICAgICAgcmV0dXJuIE51bWJlckNvbnZlcnRBbmRDaGVjazxUbywgdWludDY0X3Q+KHU2NF8pOworICAgIGNhc2UgVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gTnVtYmVyQ29udmVydEFuZENoZWNrPFRvLCBkb3VibGU+KGRvdWJsZV8pOworICAgIGNhc2UgVFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiBOdW1iZXJDb252ZXJ0QW5kQ2hlY2s8VG8sIGZsb2F0PihmbG9hdF8pOworICAgIGRlZmF1bHQ6ICAvLyBUWVBFX0VOVU0sIFRZUEVfU1RSSU5HLCBUWVBFX0NPUkQsIFRZUEVfQk9PTAorICAgICAgcmV0dXJuIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKFZhbHVlQXNTdHJpbmdPckRlZmF1bHQoCisgICAgICAgICAgIldyb25nIHR5cGUuIEJvb2wsIEVudW0sIFN0cmluZyBhbmQgQ29yZCBub3Qgc3VwcG9ydGVkIGluICIKKyAgICAgICAgICAiR2VuZXJpY0NvbnZlcnQuIikpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUbz4KK3V0aWw6OlN0YXR1c09yPFRvPiBEYXRhUGllY2U6OlN0cmluZ1RvTnVtYmVyKGJvb2wgKCpmdW5jKShTdHJpbmdQaWVjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbyopKSBjb25zdCB7CisgIGlmIChzdHJfLnNpemUoKSA+IDAgJiYgKHN0cl9bMF0gPT0gJyAnIHx8IHN0cl9bc3RyXy5zaXplKCkgLSAxXSA9PSAnICcpKSB7CisgICAgcmV0dXJuIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKFN0ckNhdCgiXCIiLCBzdHJfLCAiXCIiKSk7CisgIH0KKyAgVG8gcmVzdWx0OworICBpZiAoZnVuYyhzdHJfLCAmcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDsKKyAgcmV0dXJuIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKAorICAgICAgU3RyQ2F0KCJcIiIsIHN0ZDo6c3RyaW5nKHN0cl8pLCAiXCIiKSk7Cit9CisKK2Jvb2wgRGF0YVBpZWNlOjpEZWNvZGVCYXNlNjQoU3RyaW5nUGllY2Ugc3JjLCBzdGQ6OnN0cmluZyogZGVzdCkgY29uc3QgeworICAvLyBUcnkgd2ViLXNhZmUgZGVjb2RlIGZpcnN0LCBpZiBpdCBmYWlscywgdHJ5IHRoZSBub24td2ViLXNhZmUgZGVjb2RlLgorICBpZiAoV2ViU2FmZUJhc2U2NFVuZXNjYXBlKHNyYywgZGVzdCkpIHsKKyAgICBpZiAodXNlX3N0cmljdF9iYXNlNjRfZGVjb2RpbmdfKSB7CisgICAgICAvLyBJbiBzdHJpY3QgbW9kZSwgY2hlY2sgaWYgdGhlIGVzY2FwZWQgdmVyc2lvbiBnaXZlcyB1cyB0aGUgc2FtZSB2YWx1ZSBhcworICAgICAgLy8gdW5lc2NhcGVkLgorICAgICAgc3RkOjpzdHJpbmcgZW5jb2RlZDsKKyAgICAgIC8vIFdlYlNhZmVCYXNlNjRFc2NhcGUgZG9lcyBubyBwYWRkaW5nIGJ5IGRlZmF1bHQuCisgICAgICBXZWJTYWZlQmFzZTY0RXNjYXBlKCpkZXN0LCAmZW5jb2RlZCk7CisgICAgICAvLyBSZW1vdmUgdHJhaWxpbmcgcGFkZGluZyAnPScgY2hhcmFjdGVycyBiZWZvcmUgY29tcGFyaXNvbi4KKyAgICAgIFN0cmluZ1BpZWNlIHNyY19ub19wYWRkaW5nID0gU3RyaW5nUGllY2Uoc3JjKS5zdWJzdHIoCisgICAgICAgICAgMCwgSGFzU3VmZml4U3RyaW5nKHNyYywgIj0iKSA/IHNyYy5maW5kX2xhc3Rfbm90X29mKCc9JykgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3JjLmxlbmd0aCgpKTsKKyAgICAgIHJldHVybiBlbmNvZGVkID09IHNyY19ub19wYWRkaW5nOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmIChCYXNlNjRVbmVzY2FwZShzcmMsIGRlc3QpKSB7CisgICAgaWYgKHVzZV9zdHJpY3RfYmFzZTY0X2RlY29kaW5nXykgeworICAgICAgc3RkOjpzdHJpbmcgZW5jb2RlZDsKKyAgICAgIEJhc2U2NEVzY2FwZShyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihkZXN0LT5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QtPmxlbmd0aCgpLCAmZW5jb2RlZCwgZmFsc2UpOworICAgICAgU3RyaW5nUGllY2Ugc3JjX25vX3BhZGRpbmcgPSBTdHJpbmdQaWVjZShzcmMpLnN1YnN0cigKKyAgICAgICAgICAwLCBIYXNTdWZmaXhTdHJpbmcoc3JjLCAiPSIpID8gc3JjLmZpbmRfbGFzdF9ub3Rfb2YoJz0nKSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzcmMubGVuZ3RoKCkpOworICAgICAgcmV0dXJuIGVuY29kZWQgPT0gc3JjX25vX3BhZGRpbmc7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIERhdGFQaWVjZTo6SW50ZXJuYWxDb3B5KGNvbnN0IERhdGFQaWVjZSYgb3RoZXIpIHsKKyAgdHlwZV8gPSBvdGhlci50eXBlXzsKKyAgdXNlX3N0cmljdF9iYXNlNjRfZGVjb2RpbmdfID0gb3RoZXIudXNlX3N0cmljdF9iYXNlNjRfZGVjb2RpbmdfOworICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgY2FzZSBUWVBFX0lOVDMyOgorICAgIGNhc2UgVFlQRV9JTlQ2NDoKKyAgICBjYXNlIFRZUEVfVUlOVDMyOgorICAgIGNhc2UgVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBUWVBFX0RPVUJMRToKKyAgICBjYXNlIFRZUEVfRkxPQVQ6CisgICAgY2FzZSBUWVBFX0JPT0w6CisgICAgY2FzZSBUWVBFX0VOVU06CisgICAgY2FzZSBUWVBFX05VTEw6CisgICAgY2FzZSBUWVBFX0JZVEVTOgorICAgIGNhc2UgVFlQRV9TVFJJTkc6IHsKKyAgICAgIHN0cl8gPSBvdGhlci5zdHJfOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kYXRhcGllY2UuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kYXRhcGllY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDA4MzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RhdGFwaWVjZS5oCkBAIC0wLDAgKzEsMjE5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9EQVRBUElFQ0VfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX0RBVEFQSUVDRV9IX18KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CitjbGFzcyBQcm90b1dyaXRlcjsKKworLy8gQ29udGFpbmVyIGZvciBhIHNpbmdsZSBwaWVjZSBvZiBkYXRhIHRvZ2V0aGVyIHdpdGggaXRzIGRhdGEgdHlwZS4KKy8vCisvLyBGb3IgcHJpbWl0aXZlIHR5cGVzIChpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBkb3VibGUsIGZsb2F0LCBib29sKSwKKy8vIHRoZSBkYXRhIGlzIHN0b3JlZCBieSB2YWx1ZS4KKy8vCisvLyBGb3Igc3RyaW5nLCBhIFN0cmluZ1BpZWNlIGlzIHN0b3JlZC4gRm9yIENvcmQsIGEgcG9pbnRlciB0byBDb3JkIGlzIHN0b3JlZC4KKy8vIEp1c3QgbGlrZSBTdHJpbmdQaWVjZSwgdGhlIERhdGFQaWVjZSBjbGFzcyBkb2VzIG5vdCBvd24gdGhlIHN0b3JhZ2UgZm9yCisvLyB0aGUgYWN0dWFsIHN0cmluZyBvciBDb3JkLCBzbyBpdCBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGd1YXJhbnRlZQorLy8gdGhhdCB0aGUgdW5kZXJseWluZyBzdG9yYWdlIGlzIHN0aWxsIHZhbGlkIHdoZW4gdGhlIERhdGFQaWVjZSBpcyBhY2Nlc3NlZC4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBEYXRhUGllY2UgeworIHB1YmxpYzoKKyAgLy8gSWRlbnRpZmllcyBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICAvLyBUaGVzZSBhcmUgdGhlIHR5cGVzIHN1cHBvcnRlZCBieSBEYXRhUGllY2UuCisgIGVudW0gVHlwZSB7CisgICAgVFlQRV9JTlQzMiA9IDEsCisgICAgVFlQRV9JTlQ2NCA9IDIsCisgICAgVFlQRV9VSU5UMzIgPSAzLAorICAgIFRZUEVfVUlOVDY0ID0gNCwKKyAgICBUWVBFX0RPVUJMRSA9IDUsCisgICAgVFlQRV9GTE9BVCA9IDYsCisgICAgVFlQRV9CT09MID0gNywKKyAgICBUWVBFX0VOVU0gPSA4LAorICAgIFRZUEVfU1RSSU5HID0gOSwKKyAgICBUWVBFX0JZVEVTID0gMTAsCisgICAgVFlQRV9OVUxMID0gMTEsICAvLyBleHBsaWNpdCBOVUxMIHR5cGUKKyAgfTsKKworICAvLyBDb25zdHJ1Y3RvcnMgYW5kIERlc3RydWN0b3IKKyAgZXhwbGljaXQgRGF0YVBpZWNlKGNvbnN0IGludDMyX3QgdmFsdWUpCisgICAgICA6IHR5cGVfKFRZUEVfSU5UMzIpLCBpMzJfKHZhbHVlKSwgdXNlX3N0cmljdF9iYXNlNjRfZGVjb2RpbmdfKGZhbHNlKSB7fQorICBleHBsaWNpdCBEYXRhUGllY2UoY29uc3QgaW50NjRfdCB2YWx1ZSkKKyAgICAgIDogdHlwZV8oVFlQRV9JTlQ2NCksIGk2NF8odmFsdWUpLCB1c2Vfc3RyaWN0X2Jhc2U2NF9kZWNvZGluZ18oZmFsc2UpIHt9CisgIGV4cGxpY2l0IERhdGFQaWVjZShjb25zdCB1aW50MzJfdCB2YWx1ZSkKKyAgICAgIDogdHlwZV8oVFlQRV9VSU5UMzIpLCB1MzJfKHZhbHVlKSwgdXNlX3N0cmljdF9iYXNlNjRfZGVjb2RpbmdfKGZhbHNlKSB7fQorICBleHBsaWNpdCBEYXRhUGllY2UoY29uc3QgdWludDY0X3QgdmFsdWUpCisgICAgICA6IHR5cGVfKFRZUEVfVUlOVDY0KSwgdTY0Xyh2YWx1ZSksIHVzZV9zdHJpY3RfYmFzZTY0X2RlY29kaW5nXyhmYWxzZSkge30KKyAgZXhwbGljaXQgRGF0YVBpZWNlKGNvbnN0IGRvdWJsZSB2YWx1ZSkKKyAgICAgIDogdHlwZV8oVFlQRV9ET1VCTEUpLAorICAgICAgICBkb3VibGVfKHZhbHVlKSwKKyAgICAgICAgdXNlX3N0cmljdF9iYXNlNjRfZGVjb2RpbmdfKGZhbHNlKSB7fQorICBleHBsaWNpdCBEYXRhUGllY2UoY29uc3QgZmxvYXQgdmFsdWUpCisgICAgICA6IHR5cGVfKFRZUEVfRkxPQVQpLCBmbG9hdF8odmFsdWUpLCB1c2Vfc3RyaWN0X2Jhc2U2NF9kZWNvZGluZ18oZmFsc2UpIHt9CisgIGV4cGxpY2l0IERhdGFQaWVjZShjb25zdCBib29sIHZhbHVlKQorICAgICAgOiB0eXBlXyhUWVBFX0JPT0wpLCBib29sXyh2YWx1ZSksIHVzZV9zdHJpY3RfYmFzZTY0X2RlY29kaW5nXyhmYWxzZSkge30KKyAgRGF0YVBpZWNlKFN0cmluZ1BpZWNlIHZhbHVlLCBib29sIHVzZV9zdHJpY3RfYmFzZTY0X2RlY29kaW5nKQorICAgICAgOiB0eXBlXyhUWVBFX1NUUklORyksCisgICAgICAgIHN0cl8odmFsdWUpLAorICAgICAgICB1c2Vfc3RyaWN0X2Jhc2U2NF9kZWNvZGluZ18odXNlX3N0cmljdF9iYXNlNjRfZGVjb2RpbmcpIHt9CisgIC8vIENvbnN0cnVjdG9yIGZvciBieXRlcy4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgbm90IHVzZWQuCisgIERhdGFQaWVjZShTdHJpbmdQaWVjZSB2YWx1ZSwgYm9vbCAvKmR1bW15Ki8sIGJvb2wgdXNlX3N0cmljdF9iYXNlNjRfZGVjb2RpbmcpCisgICAgICA6IHR5cGVfKFRZUEVfQllURVMpLAorICAgICAgICBzdHJfKHZhbHVlKSwKKyAgICAgICAgdXNlX3N0cmljdF9iYXNlNjRfZGVjb2RpbmdfKHVzZV9zdHJpY3RfYmFzZTY0X2RlY29kaW5nKSB7fQorCisgIERhdGFQaWVjZShjb25zdCBEYXRhUGllY2UmIHIpIDogdHlwZV8oci50eXBlXykgeyBJbnRlcm5hbENvcHkocik7IH0KKworICBEYXRhUGllY2UmIG9wZXJhdG9yPShjb25zdCBEYXRhUGllY2UmIHgpIHsKKyAgICBJbnRlcm5hbENvcHkoeCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIERhdGFQaWVjZSBOdWxsRGF0YSgpIHsgcmV0dXJuIERhdGFQaWVjZShUWVBFX05VTEwsIDApOyB9CisKKyAgdmlydHVhbCB+RGF0YVBpZWNlKCkgeworICB9CisKKyAgLy8gQWNjZXNzb3JzCisgIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgYm9vbCB1c2Vfc3RyaWN0X2Jhc2U2NF9kZWNvZGluZygpIHsgcmV0dXJuIHVzZV9zdHJpY3RfYmFzZTY0X2RlY29kaW5nXzsgfQorCisgIFN0cmluZ1BpZWNlIHN0cigpIGNvbnN0IHsKKyAgICBHT09HTEVfTE9HX0lGKERGQVRBTCwgdHlwZV8gIT0gVFlQRV9TVFJJTkcpIDw8ICJOb3QgYSBzdHJpbmcgdHlwZS4iOworICAgIHJldHVybiBzdHJfOworICB9CisKKworICAvLyBQYXJzZXMsIGNhc3RzIG9yIGNvbnZlcnRzIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIERhdGFQaWVjZSBpbnRvIGFuIGludDMyLgorICB1dGlsOjpTdGF0dXNPcjxpbnQzMl90PiBUb0ludDMyKCkgY29uc3Q7CisKKyAgLy8gUGFyc2VzLCBjYXN0cyBvciBjb252ZXJ0cyB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBEYXRhUGllY2UgaW50byBhIHVpbnQzMi4KKyAgdXRpbDo6U3RhdHVzT3I8dWludDMyX3Q+IFRvVWludDMyKCkgY29uc3Q7CisKKyAgLy8gUGFyc2VzLCBjYXN0cyBvciBjb252ZXJ0cyB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBEYXRhUGllY2UgaW50byBhbiBpbnQ2NC4KKyAgdXRpbDo6U3RhdHVzT3I8aW50NjRfdD4gVG9JbnQ2NCgpIGNvbnN0OworCisgIC8vIFBhcnNlcywgY2FzdHMgb3IgY29udmVydHMgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgRGF0YVBpZWNlIGludG8gYSB1aW50NjQuCisgIHV0aWw6OlN0YXR1c09yPHVpbnQ2NF90PiBUb1VpbnQ2NCgpIGNvbnN0OworCisgIC8vIFBhcnNlcywgY2FzdHMgb3IgY29udmVydHMgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgRGF0YVBpZWNlIGludG8gYSBkb3VibGUuCisgIHV0aWw6OlN0YXR1c09yPGRvdWJsZT4gVG9Eb3VibGUoKSBjb25zdDsKKworICAvLyBQYXJzZXMsIGNhc3RzIG9yIGNvbnZlcnRzIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIERhdGFQaWVjZSBpbnRvIGEgZmxvYXQuCisgIHV0aWw6OlN0YXR1c09yPGZsb2F0PiBUb0Zsb2F0KCkgY29uc3Q7CisKKyAgLy8gUGFyc2VzLCBjYXN0cyBvciBjb252ZXJ0cyB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBEYXRhUGllY2UgaW50byBhIGJvb2wuCisgIHV0aWw6OlN0YXR1c09yPGJvb2w+IFRvQm9vbCgpIGNvbnN0OworCisgIC8vIFBhcnNlcywgY2FzdHMgb3IgY29udmVydHMgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgRGF0YVBpZWNlIGludG8gYSBzdHJpbmcuCisgIHV0aWw6OlN0YXR1c09yPHN0ZDo6c3RyaW5nPiBUb1N0cmluZygpIGNvbnN0OworCisgIC8vIFRyaWVzIHRvIGNvbnZlcnQgdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGlzIGRhdGFwaWVjZSB0byBzdHJpbmcuIElmIHRoZQorICAvLyBjb252ZXJzaW9uIGZhaWxzLCBpdCByZXR1cm5zIHRoZSBkZWZhdWx0X3N0cmluZy4KKyAgc3RkOjpzdHJpbmcgVmFsdWVBc1N0cmluZ09yRGVmYXVsdChTdHJpbmdQaWVjZSBkZWZhdWx0X3N0cmluZykgY29uc3Q7CisKKyAgdXRpbDo6U3RhdHVzT3I8c3RkOjpzdHJpbmc+IFRvQnl0ZXMoKSBjb25zdDsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBQcm90b1dyaXRlcjsKKworICAvLyBEaXNhbGxvdyBpbXBsaWNpdCBjb25zdHJ1Y3Rvci4KKyAgRGF0YVBpZWNlKCk7CisKKyAgLy8gSGVscGVyIHRvIGNyZWF0ZSBOVUxMIG9yIEVOVU0gdHlwZXMuCisgIERhdGFQaWVjZShUeXBlIHR5cGUsIGludDMyX3QgdmFsKQorICAgICAgOiB0eXBlXyh0eXBlKSwgaTMyXyh2YWwpLCB1c2Vfc3RyaWN0X2Jhc2U2NF9kZWNvZGluZ18oZmFsc2UpIHt9CisKKyAgLy8gU2FtZSBhcyB0aGUgVG9FbnVtKCkgbWV0aG9kIGFib3ZlIGJ1dCB3aXRoIGFkZGl0aW9uYWwgZmxhZyB0byBpZ25vcmUKKyAgLy8gdW5rbm93biBlbnVtIHZhbHVlcy4KKyAgdXRpbDo6U3RhdHVzT3I8aW50PiBUb0VudW0oY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bSogZW51bV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9sb3dlcl9jYW1lbF9mb3JfZW51bXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzZV9pbnNlbnNpdGl2ZV9lbnVtX3BhcnNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaWdub3JlX3Vua25vd25fZW51bV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGlzX3Vua25vd25fZW51bV92YWx1ZSkgY29uc3Q7CisKKyAgLy8gRm9yIG51bWVyaWMgY29udmVyc2lvbiBiZXR3ZWVuCisgIC8vICAgICBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBkb3VibGUsIGZsb2F0IGFuZCBib29sCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUbz4KKyAgdXRpbDo6U3RhdHVzT3I8VG8+IEdlbmVyaWNDb252ZXJ0KCkgY29uc3Q7CisKKyAgLy8gRm9yIGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgdG8KKyAgLy8gICAgIGludDMyLCBpbnQ2NCwgdWludDMyLCB1aW50NjQsIGRvdWJsZSwgZmxvYXQgYW5kIGJvb2wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFRvPgorICB1dGlsOjpTdGF0dXNPcjxUbz4gU3RyaW5nVG9OdW1iZXIoYm9vbCAoKmZ1bmMpKFN0cmluZ1BpZWNlLCBUbyopKSBjb25zdDsKKworICAvLyBEZWNvZGVzIGEgYmFzZTY0IHN0cmluZy4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCisgIGJvb2wgRGVjb2RlQmFzZTY0KFN0cmluZ1BpZWNlIHNyYywgc3RkOjpzdHJpbmcqIGRlc3QpIGNvbnN0OworCisgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoaXMgRGF0YVBpZWNlIHdpdGggJ290aGVyJy4KKyAgdm9pZCBJbnRlcm5hbENvcHkoY29uc3QgRGF0YVBpZWNlJiBvdGhlcik7CisKKyAgLy8gRGF0YSB0eXBlIGZvciB0aGlzIHBpZWNlIG9mIGRhdGEuCisgIFR5cGUgdHlwZV87CisKKyAgLy8gU3RvcmVkIHBpZWNlIG9mIGRhdGEuCisgIHVuaW9uIHsKKyAgICBpbnQzMl90IGkzMl87CisgICAgaW50NjRfdCBpNjRfOworICAgIHVpbnQzMl90IHUzMl87CisgICAgdWludDY0X3QgdTY0XzsKKyAgICBkb3VibGUgZG91YmxlXzsKKyAgICBmbG9hdCBmbG9hdF87CisgICAgYm9vbCBib29sXzsKKyAgICBTdHJpbmdQaWVjZSBzdHJfOworICB9OworCisgIC8vIFVzZXMgYSBzdHJpY3RlciB2ZXJzaW9uIG9mIGJhc2U2NCBkZWNvZGluZyBmb3IgYnl0ZSBmaWVsZHMuCisgIGJvb2wgdXNlX3N0cmljdF9iYXNlNjRfZGVjb2RpbmdfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnRlcgorfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX0RBVEFQSUVDRV9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjYxY2RhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyLmNjCkBAIC0wLDAgKzEsNjQyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyLmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBjb252ZXJ0ZXIgeworCituYW1lc3BhY2UgeworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgc3RyaW5nIHZhbHVlIHRvIGdpdmVuIGRhdGEgdHlwZSBieSBjYWxsaW5nIHRoZQorLy8gcGFzc2VkIGNvbnZlcnRlciBmdW5jdGlvbiBvbiB0aGUgRGF0YVBpZWNlIGNyZWF0ZWQgZnJvbSAidmFsdWUiIGFyZ3VtZW50LgorLy8gSWYgdmFsdWUgaXMgZW1wdHkgb3IgaWYgY29udmVyc2lvbiBmYWlscywgdGhlIGRlZmF1bHRfdmFsdWUgaXMgcmV0dXJuZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgQ29udmVydFRvKFN0cmluZ1BpZWNlIHZhbHVlLAorICAgICAgICAgICAgdXRpbDo6U3RhdHVzT3I8VD4gKERhdGFQaWVjZTo6KmNvbnZlcnRlcl9mbikoKSBjb25zdCwKKyAgICAgICAgICAgIFQgZGVmYXVsdF92YWx1ZSkgeworICBpZiAodmFsdWUuZW1wdHkoKSkgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIHV0aWw6OlN0YXR1c09yPFQ+IHJlc3VsdCA9IChEYXRhUGllY2UodmFsdWUsIHRydWUpLipjb252ZXJ0ZXJfZm4pKCk7CisgIHJldHVybiByZXN1bHQub2soKSA/IHJlc3VsdC52YWx1ZSgpIDogZGVmYXVsdF92YWx1ZTsKK30KK30gIC8vIG5hbWVzcGFjZQorCitEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXI6OkRlZmF1bHRWYWx1ZU9iamVjdFdyaXRlcigKKyAgICBUeXBlUmVzb2x2ZXIqIHR5cGVfcmVzb2x2ZXIsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgT2JqZWN0V3JpdGVyKiBvdykKKyAgICA6IHR5cGVpbmZvXyhUeXBlSW5mbzo6TmV3VHlwZUluZm8odHlwZV9yZXNvbHZlcikpLAorICAgICAgb3duX3R5cGVpbmZvXyh0cnVlKSwKKyAgICAgIHR5cGVfKHR5cGUpLAorICAgICAgY3VycmVudF8obnVsbHB0ciksCisgICAgICByb290XyhudWxscHRyKSwKKyAgICAgIHN1cHByZXNzX2VtcHR5X2xpc3RfKGZhbHNlKSwKKyAgICAgIHByZXNlcnZlX3Byb3RvX2ZpZWxkX25hbWVzXyhmYWxzZSksCisgICAgICB1c2VfaW50c19mb3JfZW51bXNfKGZhbHNlKSwKKyAgICAgIG93Xyhvdykge30KKworRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyOjp+RGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyKCkgeworICBpZiAob3duX3R5cGVpbmZvXykgeworICAgIGRlbGV0ZSB0eXBlaW5mb187CisgIH0KK30KKworRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyKiBEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXI6OlJlbmRlckJvb2woCisgICAgU3RyaW5nUGllY2UgbmFtZSwgYm9vbCB2YWx1ZSkgeworICBpZiAoY3VycmVudF8gPT0gbnVsbHB0cikgeworICAgIG93Xy0+UmVuZGVyQm9vbChuYW1lLCB2YWx1ZSk7CisgIH0gZWxzZSB7CisgICAgUmVuZGVyRGF0YVBpZWNlKG5hbWUsIERhdGFQaWVjZSh2YWx1ZSkpOworICB9CisgIHJldHVybiB0aGlzOworfQorCitEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXIqIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlcjo6UmVuZGVySW50MzIoCisgICAgU3RyaW5nUGllY2UgbmFtZSwgaW50MzJfdCB2YWx1ZSkgeworICBpZiAoY3VycmVudF8gPT0gbnVsbHB0cikgeworICAgIG93Xy0+UmVuZGVySW50MzIobmFtZSwgdmFsdWUpOworICB9IGVsc2UgeworICAgIFJlbmRlckRhdGFQaWVjZShuYW1lLCBEYXRhUGllY2UodmFsdWUpKTsKKyAgfQorICByZXR1cm4gdGhpczsKK30KKworRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyKiBEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXI6OlJlbmRlclVpbnQzMigKKyAgICBTdHJpbmdQaWVjZSBuYW1lLCB1aW50MzJfdCB2YWx1ZSkgeworICBpZiAoY3VycmVudF8gPT0gbnVsbHB0cikgeworICAgIG93Xy0+UmVuZGVyVWludDMyKG5hbWUsIHZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICBSZW5kZXJEYXRhUGllY2UobmFtZSwgRGF0YVBpZWNlKHZhbHVlKSk7CisgIH0KKyAgcmV0dXJuIHRoaXM7Cit9CisKK0RlZmF1bHRWYWx1ZU9iamVjdFdyaXRlciogRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyOjpSZW5kZXJJbnQ2NCgKKyAgICBTdHJpbmdQaWVjZSBuYW1lLCBpbnQ2NF90IHZhbHVlKSB7CisgIGlmIChjdXJyZW50XyA9PSBudWxscHRyKSB7CisgICAgb3dfLT5SZW5kZXJJbnQ2NChuYW1lLCB2YWx1ZSk7CisgIH0gZWxzZSB7CisgICAgUmVuZGVyRGF0YVBpZWNlKG5hbWUsIERhdGFQaWVjZSh2YWx1ZSkpOworICB9CisgIHJldHVybiB0aGlzOworfQorCitEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXIqIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlcjo6UmVuZGVyVWludDY0KAorICAgIFN0cmluZ1BpZWNlIG5hbWUsIHVpbnQ2NF90IHZhbHVlKSB7CisgIGlmIChjdXJyZW50XyA9PSBudWxscHRyKSB7CisgICAgb3dfLT5SZW5kZXJVaW50NjQobmFtZSwgdmFsdWUpOworICB9IGVsc2UgeworICAgIFJlbmRlckRhdGFQaWVjZShuYW1lLCBEYXRhUGllY2UodmFsdWUpKTsKKyAgfQorICByZXR1cm4gdGhpczsKK30KKworRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyKiBEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXI6OlJlbmRlckRvdWJsZSgKKyAgICBTdHJpbmdQaWVjZSBuYW1lLCBkb3VibGUgdmFsdWUpIHsKKyAgaWYgKGN1cnJlbnRfID09IG51bGxwdHIpIHsKKyAgICBvd18tPlJlbmRlckRvdWJsZShuYW1lLCB2YWx1ZSk7CisgIH0gZWxzZSB7CisgICAgUmVuZGVyRGF0YVBpZWNlKG5hbWUsIERhdGFQaWVjZSh2YWx1ZSkpOworICB9CisgIHJldHVybiB0aGlzOworfQorCitEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXIqIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlcjo6UmVuZGVyRmxvYXQoCisgICAgU3RyaW5nUGllY2UgbmFtZSwgZmxvYXQgdmFsdWUpIHsKKyAgaWYgKGN1cnJlbnRfID09IG51bGxwdHIpIHsKKyAgICBvd18tPlJlbmRlckJvb2wobmFtZSwgdmFsdWUpOworICB9IGVsc2UgeworICAgIFJlbmRlckRhdGFQaWVjZShuYW1lLCBEYXRhUGllY2UodmFsdWUpKTsKKyAgfQorICByZXR1cm4gdGhpczsKK30KKworRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyKiBEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXI6OlJlbmRlclN0cmluZygKKyAgICBTdHJpbmdQaWVjZSBuYW1lLCBTdHJpbmdQaWVjZSB2YWx1ZSkgeworICBpZiAoY3VycmVudF8gPT0gbnVsbHB0cikgeworICAgIG93Xy0+UmVuZGVyU3RyaW5nKG5hbWUsIHZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBTaW5jZSBTdHJpbmdQaWVjZSBpcyBlc3NlbnRpYWxseSBhIHBvaW50ZXIsIHRha2VzIGEgY29weSBvZiAidmFsdWUiIHRvCisgICAgLy8gYXZvaWQgb3duZXJzaGlwIGlzc3Vlcy4KKyAgICBzdHJpbmdfdmFsdWVzXy5lbXBsYWNlX2JhY2sobmV3IHN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgICAgUmVuZGVyRGF0YVBpZWNlKG5hbWUsIERhdGFQaWVjZSgqc3RyaW5nX3ZhbHVlc18uYmFjaygpLCB0cnVlKSk7CisgIH0KKyAgcmV0dXJuIHRoaXM7Cit9CisKK0RlZmF1bHRWYWx1ZU9iamVjdFdyaXRlciogRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyOjpSZW5kZXJCeXRlcygKKyAgICBTdHJpbmdQaWVjZSBuYW1lLCBTdHJpbmdQaWVjZSB2YWx1ZSkgeworICBpZiAoY3VycmVudF8gPT0gbnVsbHB0cikgeworICAgIG93Xy0+UmVuZGVyQnl0ZXMobmFtZSwgdmFsdWUpOworICB9IGVsc2UgeworICAgIC8vIFNpbmNlIFN0cmluZ1BpZWNlIGlzIGVzc2VudGlhbGx5IGEgcG9pbnRlciwgdGFrZXMgYSBjb3B5IG9mICJ2YWx1ZSIgdG8KKyAgICAvLyBhdm9pZCBvd25lcnNoaXAgaXNzdWVzLgorICAgIHN0cmluZ192YWx1ZXNfLmVtcGxhY2VfYmFjayhuZXcgc3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgICBSZW5kZXJEYXRhUGllY2UobmFtZSwgRGF0YVBpZWNlKCpzdHJpbmdfdmFsdWVzXy5iYWNrKCksIGZhbHNlLCB0cnVlKSk7CisgIH0KKyAgcmV0dXJuIHRoaXM7Cit9CisKK0RlZmF1bHRWYWx1ZU9iamVjdFdyaXRlciogRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyOjpSZW5kZXJOdWxsKAorICAgIFN0cmluZ1BpZWNlIG5hbWUpIHsKKyAgaWYgKGN1cnJlbnRfID09IG51bGxwdHIpIHsKKyAgICBvd18tPlJlbmRlck51bGwobmFtZSk7CisgIH0gZWxzZSB7CisgICAgUmVuZGVyRGF0YVBpZWNlKG5hbWUsIERhdGFQaWVjZTo6TnVsbERhdGEoKSk7CisgIH0KKyAgcmV0dXJuIHRoaXM7Cit9CisKK3ZvaWQgRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyOjpSZWdpc3RlckZpZWxkU2NydWJDYWxsQmFjaygKKyAgICBGaWVsZFNjcnViQ2FsbEJhY2sgZmllbGRfc2NydWJfY2FsbGJhY2spIHsKKyAgZmllbGRfc2NydWJfY2FsbGJhY2tfID0gc3RkOjptb3ZlKGZpZWxkX3NjcnViX2NhbGxiYWNrKTsKK30KKworRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyOjpOb2RlKiBEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXI6OkNyZWF0ZU5ld05vZGUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqIHR5cGUsIE5vZGVLaW5kIGtpbmQsCisgICAgY29uc3QgRGF0YVBpZWNlJiBkYXRhLCBib29sIGlzX3BsYWNlaG9sZGVyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcGF0aCwgYm9vbCBzdXBwcmVzc19lbXB0eV9saXN0LAorICAgIGJvb2wgcHJlc2VydmVfcHJvdG9fZmllbGRfbmFtZXMsIGJvb2wgdXNlX2ludHNfZm9yX2VudW1zLAorICAgIEZpZWxkU2NydWJDYWxsQmFjayBmaWVsZF9zY3J1Yl9jYWxsYmFjaykgeworICByZXR1cm4gbmV3IE5vZGUobmFtZSwgdHlwZSwga2luZCwgZGF0YSwgaXNfcGxhY2Vob2xkZXIsIHBhdGgsCisgICAgICAgICAgICAgICAgICBzdXBwcmVzc19lbXB0eV9saXN0LCBwcmVzZXJ2ZV9wcm90b19maWVsZF9uYW1lcywKKyAgICAgICAgICAgICAgICAgIHVzZV9pbnRzX2Zvcl9lbnVtcywgc3RkOjptb3ZlKGZpZWxkX3NjcnViX2NhbGxiYWNrKSk7Cit9CisKK0RlZmF1bHRWYWx1ZU9iamVjdFdyaXRlcjo6Tm9kZTo6Tm9kZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogdHlwZSwgTm9kZUtpbmQga2luZCwKKyAgICBjb25zdCBEYXRhUGllY2UmIGRhdGEsIGJvb2wgaXNfcGxhY2Vob2xkZXIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwYXRoLCBib29sIHN1cHByZXNzX2VtcHR5X2xpc3QsCisgICAgYm9vbCBwcmVzZXJ2ZV9wcm90b19maWVsZF9uYW1lcywgYm9vbCB1c2VfaW50c19mb3JfZW51bXMsCisgICAgRmllbGRTY3J1YkNhbGxCYWNrIGZpZWxkX3NjcnViX2NhbGxiYWNrKQorICAgIDogbmFtZV8obmFtZSksCisgICAgICB0eXBlXyh0eXBlKSwKKyAgICAgIGtpbmRfKGtpbmQpLAorICAgICAgaXNfYW55XyhmYWxzZSksCisgICAgICBkYXRhXyhkYXRhKSwKKyAgICAgIGlzX3BsYWNlaG9sZGVyXyhpc19wbGFjZWhvbGRlciksCisgICAgICBwYXRoXyhwYXRoKSwKKyAgICAgIHN1cHByZXNzX2VtcHR5X2xpc3RfKHN1cHByZXNzX2VtcHR5X2xpc3QpLAorICAgICAgcHJlc2VydmVfcHJvdG9fZmllbGRfbmFtZXNfKHByZXNlcnZlX3Byb3RvX2ZpZWxkX25hbWVzKSwKKyAgICAgIHVzZV9pbnRzX2Zvcl9lbnVtc18odXNlX2ludHNfZm9yX2VudW1zKSwKKyAgICAgIGZpZWxkX3NjcnViX2NhbGxiYWNrXyhzdGQ6Om1vdmUoZmllbGRfc2NydWJfY2FsbGJhY2spKSB7fQorCitEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXI6Ok5vZGUqIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlcjo6Tm9kZTo6RmluZENoaWxkKAorICAgIFN0cmluZ1BpZWNlIG5hbWUpIHsKKyAgaWYgKG5hbWUuZW1wdHkoKSB8fCBraW5kXyAhPSBPQkpFQ1QpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBmb3IgKE5vZGUqIGNoaWxkIDogY2hpbGRyZW5fKSB7CisgICAgaWYgKGNoaWxkLT5uYW1lKCkgPT0gbmFtZSkgeworICAgICAgcmV0dXJuIGNoaWxkOworICAgIH0KKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKwordm9pZCBEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXI6Ok5vZGU6OldyaXRlVG8oT2JqZWN0V3JpdGVyKiBvdykgeworICBpZiAoa2luZF8gPT0gUFJJTUlUSVZFKSB7CisgICAgT2JqZWN0V3JpdGVyOjpSZW5kZXJEYXRhUGllY2VUbyhkYXRhXywgbmFtZV8sIG93KTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBSZW5kZXIgbWFwcy4gRW1wdHkgbWFwcyBhcmUgcmVuZGVyZWQgYXMgInt9Ii4KKyAgaWYgKGtpbmRfID09IE1BUCkgeworICAgIG93LT5TdGFydE9iamVjdChuYW1lXyk7CisgICAgV3JpdGVDaGlsZHJlbihvdyk7CisgICAgb3ctPkVuZE9iamVjdCgpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFdyaXRlIG91dCBsaXN0cy4gSWYgd2UgZGlkbid0IGhhdmUgYW55IGxpc3QgaW4gcmVzcG9uc2UsIHdyaXRlIG91dCBlbXB0eQorICAvLyBsaXN0LgorICBpZiAoa2luZF8gPT0gTElTVCkgeworICAgIC8vIFN1cHByZXNzIGVtcHR5IGxpc3RzIGlmIHJlcXVlc3RlZC4KKyAgICBpZiAoc3VwcHJlc3NfZW1wdHlfbGlzdF8gJiYgaXNfcGxhY2Vob2xkZXJfKSByZXR1cm47CisKKyAgICBvdy0+U3RhcnRMaXN0KG5hbWVfKTsKKyAgICBXcml0ZUNoaWxkcmVuKG93KTsKKyAgICBvdy0+RW5kTGlzdCgpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIElmIGlzX3BsYWNlaG9sZGVyXyA9IHRydWUsIHdlIGRpZG4ndCBzZWUgdGhpcyBub2RlIGluIHRoZSByZXNwb25zZSwgc28KKyAgLy8gc2tpcCBvdXRwdXQuCisgIGlmIChpc19wbGFjZWhvbGRlcl8pIHJldHVybjsKKworICBvdy0+U3RhcnRPYmplY3QobmFtZV8pOworICBXcml0ZUNoaWxkcmVuKG93KTsKKyAgb3ctPkVuZE9iamVjdCgpOworfQorCit2b2lkIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlcjo6Tm9kZTo6V3JpdGVDaGlsZHJlbihPYmplY3RXcml0ZXIqIG93KSB7CisgIGZvciAoTm9kZSogY2hpbGQgOiBjaGlsZHJlbl8pIHsKKyAgICBjaGlsZC0+V3JpdGVUbyhvdyk7CisgIH0KK30KKworY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyOjpOb2RlOjpHZXRNYXBWYWx1ZVR5cGUoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgZm91bmRfdHlwZSwgY29uc3QgVHlwZUluZm8qIHR5cGVpbmZvKSB7CisgIC8vIElmIHRoaXMgZmllbGQgaXMgYSBtYXAsIHdlIHNob3VsZCB1c2UgdGhlIHR5cGUgb2YgaXRzICJWYWx1ZSIgYXMKKyAgLy8gdGhlIHR5cGUgb2YgdGhlIGNoaWxkIG5vZGUuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZm91bmRfdHlwZS5maWVsZHNfc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCYgc3ViX2ZpZWxkID0gZm91bmRfdHlwZS5maWVsZHMoaSk7CisgICAgaWYgKHN1Yl9maWVsZC5udW1iZXIoKSAhPSAyKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHN1Yl9maWVsZC5raW5kKCkgIT0gZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfTUVTU0FHRSkgeworICAgICAgLy8gVGhpcyBtYXAncyB2YWx1ZSB0eXBlIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS4gV2UgZG9uJ3QgbmVlZCB0bworICAgICAgLy8gZ2V0IHRoZSBmaWVsZF90eXBlIGluIHRoaXMgY2FzZS4KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB1dGlsOjpTdGF0dXNPcjxjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKj4gc3ViX3R5cGUgPQorICAgICAgICB0eXBlaW5mby0+UmVzb2x2ZVR5cGVVcmwoc3ViX2ZpZWxkLnR5cGVfdXJsKCkpOworICAgIGlmICghc3ViX3R5cGUub2soKSkgeworICAgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiQ2Fubm90IHJlc29sdmUgdHlwZSAnIiA8PCBzdWJfZmllbGQudHlwZV91cmwoKSA8PCAiJy4iOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gc3ViX3R5cGUudmFsdWUoKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3ZvaWQgRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyOjpOb2RlOjpQb3B1bGF0ZUNoaWxkcmVuKAorICAgIGNvbnN0IFR5cGVJbmZvKiB0eXBlaW5mbykgeworICAvLyBJZ25vcmVzIHdlbGwga25vd24gdHlwZXMgdGhhdCBkb24ndCByZXF1aXJlIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGluZyB0aGVpcgorICAvLyBwcmltaXRpdmUgY2hpbGRyZW4uIEZvciB0eXBlICJBbnkiLCB3ZSBvbmx5IHBvcHVsYXRlIGl0cyBjaGlsZHJlbiB3aGVuIHRoZQorICAvLyAiQHR5cGUiIGZpZWxkIGlzIHNldC4KKyAgLy8gVE9ETyh0c3VuKTogcmVtb3ZlICJrU3RydWN0VmFsdWVUeXBlIiBmcm9tIHRoZSBsaXN0LiBJdCdzIGJlaW5nIGNoZWNrZWQKKyAgLy8gICAgIG5vdyBiZWNhdXNlIG9mIGEgYnVnIGluIHRoZSB0b29sLWNoYWluIHRoYXQgY2F1c2VzIHRoZSAib25lb2ZfaW5kZXgiCisgIC8vICAgICBvZiBrU3RydWN0VmFsdWVUeXBlIHRvIG5vdCBiZSBzZXQgY29ycmVjdGx5LgorICBpZiAodHlwZV8gPT0gbnVsbHB0ciB8fCB0eXBlXy0+bmFtZSgpID09IGtBbnlUeXBlIHx8CisgICAgICB0eXBlXy0+bmFtZSgpID09IGtTdHJ1Y3RUeXBlIHx8IHR5cGVfLT5uYW1lKCkgPT0ga1RpbWVzdGFtcFR5cGUgfHwKKyAgICAgIHR5cGVfLT5uYW1lKCkgPT0ga0R1cmF0aW9uVHlwZSB8fCB0eXBlXy0+bmFtZSgpID09IGtTdHJ1Y3RWYWx1ZVR5cGUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc3RkOjp2ZWN0b3I8Tm9kZSo+IG5ld19jaGlsZHJlbjsKKyAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG9yaWdfY2hpbGRyZW5fbWFwOworCisgIC8vIENyZWF0ZXMgYSBtYXAgb2YgY2hpbGQgbm9kZXMgdG8gc3BlZWQgdXAgbG9va3VwLgorICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuXy5zaXplKCk7ICsraSkgeworICAgIEluc2VydElmTm90UHJlc2VudCgmb3JpZ19jaGlsZHJlbl9tYXAsIGNoaWxkcmVuX1tpXS0+bmFtZV8sIGkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlXy0+ZmllbGRzX3NpemUoKTsgKytpKSB7CisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQmIGZpZWxkID0gdHlwZV8tPmZpZWxkcyhpKTsKKworICAgIC8vIFRoaXMgY29kZSBpcyBjaGVja2luZyBpZiB0aGUgZmllbGQgdG8gYmUgYWRkZWQgdG8gdGhlIHRyZWUgc2hvdWxkIGJlCisgICAgLy8gc2NydWJiZWQgb3Igbm90IGJ5IGNhbGxpbmcgdGhlIGZpZWxkX3NjcnViX2NhbGxiYWNrXyBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGF0aDsKKyAgICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKyAgICAgIHBhdGguaW5zZXJ0KHBhdGguYmVnaW4oKSwgcGF0aF8uYmVnaW4oKSwgcGF0aF8uZW5kKCkpOworICAgIH0KKyAgICBwYXRoLnB1c2hfYmFjayhmaWVsZC5uYW1lKCkpOworICAgIGlmIChmaWVsZF9zY3J1Yl9jYWxsYmFja18gJiYgZmllbGRfc2NydWJfY2FsbGJhY2tfKHBhdGgsICZmaWVsZCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgaW50Pjo6aXRlcmF0b3IgZm91bmQgPQorICAgICAgICBvcmlnX2NoaWxkcmVuX21hcC5maW5kKGZpZWxkLm5hbWUoKSk7CisgICAgLy8gSWYgdGhlIGNoaWxkIGZpZWxkIGhhcyBhbHJlYWR5IGJlZW4gc2V0LCB3ZSBqdXN0IGFkZCBpdCB0byB0aGUgbmV3IGxpc3QKKyAgICAvLyBvZiBjaGlsZHJlbi4KKyAgICBpZiAoZm91bmQgIT0gb3JpZ19jaGlsZHJlbl9tYXAuZW5kKCkpIHsKKyAgICAgIG5ld19jaGlsZHJlbi5wdXNoX2JhY2soY2hpbGRyZW5fW2ZvdW5kLT5zZWNvbmRdKTsKKyAgICAgIGNoaWxkcmVuX1tmb3VuZC0+c2Vjb25kXSA9IG51bGxwdHI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKiBmaWVsZF90eXBlID0gbnVsbHB0cjsKKyAgICBib29sIGlzX21hcCA9IGZhbHNlOworICAgIE5vZGVLaW5kIGtpbmQgPSBQUklNSVRJVkU7CisKKyAgICBpZiAoZmllbGQua2luZCgpID09IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX01FU1NBR0UpIHsKKyAgICAgIGtpbmQgPSBPQkpFQ1Q7CisgICAgICB1dGlsOjpTdGF0dXNPcjxjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKj4gZm91bmRfcmVzdWx0ID0KKyAgICAgICAgICB0eXBlaW5mby0+UmVzb2x2ZVR5cGVVcmwoZmllbGQudHlwZV91cmwoKSk7CisgICAgICBpZiAoIWZvdW5kX3Jlc3VsdC5vaygpKSB7CisgICAgICAgIC8vICJmaWVsZCIgaXMgb2YgYW4gdW5rbm93biB0eXBlLgorICAgICAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJDYW5ub3QgcmVzb2x2ZSB0eXBlICciIDw8IGZpZWxkLnR5cGVfdXJsKCkgPDwgIicuIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqIGZvdW5kX3R5cGUgPSBmb3VuZF9yZXN1bHQudmFsdWUoKTsKKyAgICAgICAgaXNfbWFwID0gSXNNYXAoZmllbGQsICpmb3VuZF90eXBlKTsKKworICAgICAgICBpZiAoIWlzX21hcCkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSBmb3VuZF90eXBlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIElmIHRoaXMgZmllbGQgaXMgYSBtYXAsIHdlIHNob3VsZCB1c2UgdGhlIHR5cGUgb2YgaXRzICJWYWx1ZSIgYXMKKyAgICAgICAgICAvLyB0aGUgdHlwZSBvZiB0aGUgY2hpbGQgbm9kZS4KKyAgICAgICAgICBmaWVsZF90eXBlID0gR2V0TWFwVmFsdWVUeXBlKCpmb3VuZF90eXBlLCB0eXBlaW5mbyk7CisgICAgICAgICAga2luZCA9IE1BUDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmICghaXNfbWFwICYmCisgICAgICAgIGZpZWxkLmNhcmRpbmFsaXR5KCkgPT0gZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OkNBUkRJTkFMSVRZX1JFUEVBVEVEKSB7CisgICAgICBraW5kID0gTElTVDsKKyAgICB9CisKKyAgICAvLyBJZiBvbmVvZl9pbmRleCgpICE9IDAsIHRoZSBjaGlsZCBmaWVsZCBpcyBwYXJ0IG9mIGEgIm9uZW9mIiwgd2hpY2ggbWVhbnMKKyAgICAvLyB0aGUgY2hpbGQgZmllbGQgaXMgb3B0aW9uYWwgYW5kIHdlIHNob3VsZG4ndCBwb3B1bGF0ZSBpdHMgZGVmYXVsdAorICAgIC8vIHByaW1pdGl2ZSB2YWx1ZS4KKyAgICBpZiAoZmllbGQub25lb2ZfaW5kZXgoKSAhPSAwICYmIGtpbmQgPT0gUFJJTUlUSVZFKSBjb250aW51ZTsKKworICAgIC8vIElmIHRoZSBjaGlsZCBmaWVsZCBpcyBvZiBwcmltaXRpdmUgdHlwZSwgc2V0cyBpdHMgZGF0YSB0byB0aGUgZGVmYXVsdAorICAgIC8vIHZhbHVlIG9mIGl0cyB0eXBlLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxOb2RlPiBjaGlsZCgKKyAgICAgICAgbmV3IE5vZGUocHJlc2VydmVfcHJvdG9fZmllbGRfbmFtZXNfID8gZmllbGQubmFtZSgpIDogZmllbGQuanNvbl9uYW1lKCksCisgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsIGtpbmQsCisgICAgICAgICAgICAgICAgIGtpbmQgPT0gUFJJTUlUSVZFID8gQ3JlYXRlRGVmYXVsdERhdGFQaWVjZUZvckZpZWxkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCwgdHlwZWluZm8sIHVzZV9pbnRzX2Zvcl9lbnVtc18pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRGF0YVBpZWNlOjpOdWxsRGF0YSgpLAorICAgICAgICAgICAgICAgICB0cnVlLCBwYXRoLCBzdXBwcmVzc19lbXB0eV9saXN0XywgcHJlc2VydmVfcHJvdG9fZmllbGRfbmFtZXNfLAorICAgICAgICAgICAgICAgICB1c2VfaW50c19mb3JfZW51bXNfLCBmaWVsZF9zY3J1Yl9jYWxsYmFja18pKTsKKyAgICBuZXdfY2hpbGRyZW4ucHVzaF9iYWNrKGNoaWxkLnJlbGVhc2UoKSk7CisgIH0KKyAgLy8gQWRkcyBhbGwgbGVmdG92ZXIgbm9kZXMgaW4gY2hpbGRyZW5fIHRvIHRoZSBiZWdpbm5pbmcgb2YgbmV3X2NoaWxkLgorICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuXy5zaXplKCk7ICsraSkgeworICAgIGlmIChjaGlsZHJlbl9baV0gPT0gbnVsbHB0cikgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIG5ld19jaGlsZHJlbi5pbnNlcnQobmV3X2NoaWxkcmVuLmJlZ2luKCksIGNoaWxkcmVuX1tpXSk7CisgICAgY2hpbGRyZW5fW2ldID0gbnVsbHB0cjsKKyAgfQorICBjaGlsZHJlbl8uc3dhcChuZXdfY2hpbGRyZW4pOworfQorCit2b2lkIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlcjo6TWF5YmVQb3B1bGF0ZUNoaWxkcmVuT2ZBbnkoTm9kZSogbm9kZSkgeworICAvLyBJZiB0aGlzIGlzIGFuICJBbnkiIG5vZGUgd2l0aCAiQHR5cGUiIGFscmVhZHkgZ2l2ZW4gYW5kIG5vIG90aGVyIGNoaWxkcmVuCisgIC8vIGhhdmUgYmVlbiBhZGRlZCwgcG9wdWxhdGVzIGl0cyBjaGlsZHJlbi4KKyAgaWYgKG5vZGUgIT0gbnVsbHB0ciAmJiBub2RlLT5pc19hbnkoKSAmJiBub2RlLT50eXBlKCkgIT0gbnVsbHB0ciAmJgorICAgICAgbm9kZS0+dHlwZSgpLT5uYW1lKCkgIT0ga0FueVR5cGUgJiYgbm9kZS0+bnVtYmVyX29mX2NoaWxkcmVuKCkgPT0gMSkgeworICAgIG5vZGUtPlBvcHVsYXRlQ2hpbGRyZW4odHlwZWluZm9fKTsKKyAgfQorfQorCitEYXRhUGllY2UgRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyOjpGaW5kRW51bURlZmF1bHQoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQmIGZpZWxkLCBjb25zdCBUeXBlSW5mbyogdHlwZWluZm8sCisgICAgYm9vbCB1c2VfaW50c19mb3JfZW51bXMpIHsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bSogZW51bV90eXBlID0KKyAgICAgIHR5cGVpbmZvLT5HZXRFbnVtQnlUeXBlVXJsKGZpZWxkLnR5cGVfdXJsKCkpOworICBpZiAoIWVudW1fdHlwZSkgeworICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgIkNvdWxkIG5vdCBmaW5kIGVudW0gd2l0aCB0eXBlICciIDw8IGZpZWxkLnR5cGVfdXJsKCkKKyAgICAgICAgICAgICAgICAgPDwgIiciOworICAgIHJldHVybiBEYXRhUGllY2U6Ok51bGxEYXRhKCk7CisgIH0KKyAgaWYgKCFmaWVsZC5kZWZhdWx0X3ZhbHVlKCkuZW1wdHkoKSkgeworICAgIGlmICghdXNlX2ludHNfZm9yX2VudW1zKSB7CisgICAgICByZXR1cm4gRGF0YVBpZWNlKGZpZWxkLmRlZmF1bHRfdmFsdWUoKSwgdHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbnVtX2RlZmF1bHRfdmFsdWVfbmFtZSA9IGZpZWxkLmRlZmF1bHRfdmFsdWUoKTsKKyAgICAgIGZvciAoaW50IGVudW1faW5kZXggPSAwOyBlbnVtX2luZGV4IDwgZW51bV90eXBlLT5lbnVtdmFsdWVfc2l6ZSgpOworICAgICAgICAgICArK2VudW1faW5kZXgpIHsKKyAgICAgICAgYXV0byYgZW51bV92YWx1ZSA9IGVudW1fdHlwZS0+ZW51bXZhbHVlKGVudW1faW5kZXgpOworICAgICAgICBpZiAoZW51bV92YWx1ZS5uYW1lKCkgPT0gZW51bV9kZWZhdWx0X3ZhbHVlX25hbWUpCisgICAgICAgICAgcmV0dXJuIERhdGFQaWVjZShlbnVtX3ZhbHVlLm51bWJlcigpKTsKKyAgICAgIH0KKyAgICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgIkNvdWxkIG5vdCBmaW5kIGVudW0gdmFsdWUgJyIgPDwgZW51bV9kZWZhdWx0X3ZhbHVlX25hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiJyB3aXRoIHR5cGUgJyIgPDwgZmllbGQudHlwZV91cmwoKSA8PCAiJyI7CisgICAgICByZXR1cm4gRGF0YVBpZWNlOjpOdWxsRGF0YSgpOworICAgIH0KKyAgfQorICAvLyBXZSB0cmVhdCB0aGUgZmlyc3QgdmFsdWUgYXMgdGhlIGRlZmF1bHQgaWYgbm9uZSBpcyBzcGVjaWZpZWQuCisgIHJldHVybiBlbnVtX3R5cGUtPmVudW12YWx1ZV9zaXplKCkgPiAwCisgICAgICAgICAgICAgPyAodXNlX2ludHNfZm9yX2VudW1zCisgICAgICAgICAgICAgICAgICAgID8gRGF0YVBpZWNlKGVudW1fdHlwZS0+ZW51bXZhbHVlKDApLm51bWJlcigpKQorICAgICAgICAgICAgICAgICAgICA6IERhdGFQaWVjZShlbnVtX3R5cGUtPmVudW12YWx1ZSgwKS5uYW1lKCksIHRydWUpKQorICAgICAgICAgICAgIDogRGF0YVBpZWNlOjpOdWxsRGF0YSgpOworfQorCitEYXRhUGllY2UgRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyOjpDcmVhdGVEZWZhdWx0RGF0YVBpZWNlRm9yRmllbGQoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQmIGZpZWxkLCBjb25zdCBUeXBlSW5mbyogdHlwZWluZm8sCisgICAgYm9vbCB1c2VfaW50c19mb3JfZW51bXMpIHsKKyAgc3dpdGNoIChmaWVsZC5raW5kKCkpIHsKKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0RPVUJMRTogeworICAgICAgcmV0dXJuIERhdGFQaWVjZShDb252ZXJ0VG88ZG91YmxlPigKKyAgICAgICAgICBmaWVsZC5kZWZhdWx0X3ZhbHVlKCksICZEYXRhUGllY2U6OlRvRG91YmxlLCBzdGF0aWNfY2FzdDxkb3VibGU+KDApKSk7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfRkxPQVQ6IHsKKyAgICAgIHJldHVybiBEYXRhUGllY2UoQ29udmVydFRvPGZsb2F0PigKKyAgICAgICAgICBmaWVsZC5kZWZhdWx0X3ZhbHVlKCksICZEYXRhUGllY2U6OlRvRmxvYXQsIHN0YXRpY19jYXN0PGZsb2F0PigwKSkpOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0lOVDY0OgorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfU0lOVDY0OgorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfU0ZJWEVENjQ6IHsKKyAgICAgIHJldHVybiBEYXRhUGllY2UoQ29udmVydFRvPGludDY0X3Q+KAorICAgICAgICAgIGZpZWxkLmRlZmF1bHRfdmFsdWUoKSwgJkRhdGFQaWVjZTo6VG9JbnQ2NCwgc3RhdGljX2Nhc3Q8aW50NjRfdD4oMCkpKTsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9VSU5UNjQ6CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9GSVhFRDY0OiB7CisgICAgICByZXR1cm4gRGF0YVBpZWNlKENvbnZlcnRUbzx1aW50NjRfdD4oZmllbGQuZGVmYXVsdF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEYXRhUGllY2U6OlRvVWludDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PigwKSkpOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0lOVDMyOgorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfU0lOVDMyOgorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfU0ZJWEVEMzI6IHsKKyAgICAgIHJldHVybiBEYXRhUGllY2UoQ29udmVydFRvPGludDMyX3Q+KAorICAgICAgICAgIGZpZWxkLmRlZmF1bHRfdmFsdWUoKSwgJkRhdGFQaWVjZTo6VG9JbnQzMiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oMCkpKTsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9CT09MOiB7CisgICAgICByZXR1cm4gRGF0YVBpZWNlKAorICAgICAgICAgIENvbnZlcnRUbzxib29sPihmaWVsZC5kZWZhdWx0X3ZhbHVlKCksICZEYXRhUGllY2U6OlRvQm9vbCwgZmFsc2UpKTsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9TVFJJTkc6IHsKKyAgICAgIHJldHVybiBEYXRhUGllY2UoZmllbGQuZGVmYXVsdF92YWx1ZSgpLCB0cnVlKTsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9CWVRFUzogeworICAgICAgcmV0dXJuIERhdGFQaWVjZShmaWVsZC5kZWZhdWx0X3ZhbHVlKCksIGZhbHNlLCB0cnVlKTsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9VSU5UMzI6CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9GSVhFRDMyOiB7CisgICAgICByZXR1cm4gRGF0YVBpZWNlKENvbnZlcnRUbzx1aW50MzJfdD4oZmllbGQuZGVmYXVsdF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEYXRhUGllY2U6OlRvVWludDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PigwKSkpOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0VOVU06IHsKKyAgICAgIHJldHVybiBGaW5kRW51bURlZmF1bHQoZmllbGQsIHR5cGVpbmZvLCB1c2VfaW50c19mb3JfZW51bXMpOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICByZXR1cm4gRGF0YVBpZWNlOjpOdWxsRGF0YSgpOworICAgIH0KKyAgfQorfQorCitEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXIqIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlcjo6U3RhcnRPYmplY3QoCisgICAgU3RyaW5nUGllY2UgbmFtZSkgeworICBpZiAoY3VycmVudF8gPT0gbnVsbHB0cikgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXRoOworICAgIHJvb3RfLnJlc2V0KENyZWF0ZU5ld05vZGUoc3RkOjpzdHJpbmcobmFtZSksICZ0eXBlXywgT0JKRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVBpZWNlOjpOdWxsRGF0YSgpLCBmYWxzZSwgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzX2VtcHR5X2xpc3RfLCBwcmVzZXJ2ZV9wcm90b19maWVsZF9uYW1lc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfaW50c19mb3JfZW51bXNfLCBmaWVsZF9zY3J1Yl9jYWxsYmFja18pKTsKKyAgICByb290Xy0+UG9wdWxhdGVDaGlsZHJlbih0eXBlaW5mb18pOworICAgIGN1cnJlbnRfID0gcm9vdF8uZ2V0KCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKyAgTWF5YmVQb3B1bGF0ZUNoaWxkcmVuT2ZBbnkoY3VycmVudF8pOworICBOb2RlKiBjaGlsZCA9IGN1cnJlbnRfLT5GaW5kQ2hpbGQobmFtZSk7CisgIGlmIChjdXJyZW50Xy0+a2luZCgpID09IExJU1QgfHwgY3VycmVudF8tPmtpbmQoKSA9PSBNQVAgfHwgY2hpbGQgPT0gbnVsbHB0cikgeworICAgIC8vIElmIGN1cnJlbnRfIGlzIGEgbGlzdCBvciBhIG1hcCBub2RlLCB3ZSBzaG91bGQgY3JlYXRlIGEgbmV3IGNoaWxkIGFuZCB1c2UKKyAgICAvLyB0aGUgdHlwZSBvZiBjdXJyZW50XyBhcyB0aGUgdHlwZSBvZiB0aGUgbmV3IGNoaWxkLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxOb2RlPiBub2RlKAorICAgICAgICBDcmVhdGVOZXdOb2RlKHN0ZDo6c3RyaW5nKG5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICgoY3VycmVudF8tPmtpbmQoKSA9PSBMSVNUIHx8IGN1cnJlbnRfLT5raW5kKCkgPT0gTUFQKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjdXJyZW50Xy0+dHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHIpLAorICAgICAgICAgICAgICAgICAgICAgIE9CSkVDVCwgRGF0YVBpZWNlOjpOdWxsRGF0YSgpLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9PSBudWxscHRyID8gY3VycmVudF8tPnBhdGgoKSA6IGNoaWxkLT5wYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3NfZW1wdHlfbGlzdF8sIHByZXNlcnZlX3Byb3RvX2ZpZWxkX25hbWVzXywKKyAgICAgICAgICAgICAgICAgICAgICB1c2VfaW50c19mb3JfZW51bXNfLCBmaWVsZF9zY3J1Yl9jYWxsYmFja18pKTsKKyAgICBjaGlsZCA9IG5vZGUuZ2V0KCk7CisgICAgY3VycmVudF8tPkFkZENoaWxkKG5vZGUucmVsZWFzZSgpKTsKKyAgfQorCisgIGNoaWxkLT5zZXRfaXNfcGxhY2Vob2xkZXIoZmFsc2UpOworICBpZiAoY2hpbGQtPmtpbmQoKSA9PSBPQkpFQ1QgJiYgY2hpbGQtPm51bWJlcl9vZl9jaGlsZHJlbigpID09IDApIHsKKyAgICBjaGlsZC0+UG9wdWxhdGVDaGlsZHJlbih0eXBlaW5mb18pOworICB9CisKKyAgc3RhY2tfLnB1c2goY3VycmVudF8pOworICBjdXJyZW50XyA9IGNoaWxkOworICByZXR1cm4gdGhpczsKK30KKworRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyKiBEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXI6OkVuZE9iamVjdCgpIHsKKyAgaWYgKHN0YWNrXy5lbXB0eSgpKSB7CisgICAgLy8gVGhlIHJvb3Qgb2JqZWN0IGVuZHMgaGVyZS4gV3JpdGVzIG91dCB0aGUgdHJlZS4KKyAgICBXcml0ZVJvb3QoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorICBjdXJyZW50XyA9IHN0YWNrXy50b3AoKTsKKyAgc3RhY2tfLnBvcCgpOworICByZXR1cm4gdGhpczsKK30KKworRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyKiBEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXI6OlN0YXJ0TGlzdCgKKyAgICBTdHJpbmdQaWVjZSBuYW1lKSB7CisgIGlmIChjdXJyZW50XyA9PSBudWxscHRyKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhdGg7CisgICAgcm9vdF8ucmVzZXQoQ3JlYXRlTmV3Tm9kZShzdGQ6OnN0cmluZyhuYW1lKSwgJnR5cGVfLCBMSVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVBpZWNlOjpOdWxsRGF0YSgpLCBmYWxzZSwgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzX2VtcHR5X2xpc3RfLCBwcmVzZXJ2ZV9wcm90b19maWVsZF9uYW1lc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfaW50c19mb3JfZW51bXNfLCBmaWVsZF9zY3J1Yl9jYWxsYmFja18pKTsKKyAgICBjdXJyZW50XyA9IHJvb3RfLmdldCgpOworICAgIHJldHVybiB0aGlzOworICB9CisgIE1heWJlUG9wdWxhdGVDaGlsZHJlbk9mQW55KGN1cnJlbnRfKTsKKyAgTm9kZSogY2hpbGQgPSBjdXJyZW50Xy0+RmluZENoaWxkKG5hbWUpOworICBpZiAoY2hpbGQgPT0gbnVsbHB0ciB8fCBjaGlsZC0+a2luZCgpICE9IExJU1QpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Tm9kZT4gbm9kZShDcmVhdGVOZXdOb2RlKAorICAgICAgICBzdGQ6OnN0cmluZyhuYW1lKSwgbnVsbHB0ciwgTElTVCwgRGF0YVBpZWNlOjpOdWxsRGF0YSgpLCBmYWxzZSwKKyAgICAgICAgY2hpbGQgPT0gbnVsbHB0ciA/IGN1cnJlbnRfLT5wYXRoKCkgOiBjaGlsZC0+cGF0aCgpLAorICAgICAgICBzdXBwcmVzc19lbXB0eV9saXN0XywgcHJlc2VydmVfcHJvdG9fZmllbGRfbmFtZXNfLCB1c2VfaW50c19mb3JfZW51bXNfLAorICAgICAgICBmaWVsZF9zY3J1Yl9jYWxsYmFja18pKTsKKyAgICBjaGlsZCA9IG5vZGUuZ2V0KCk7CisgICAgY3VycmVudF8tPkFkZENoaWxkKG5vZGUucmVsZWFzZSgpKTsKKyAgfQorICBjaGlsZC0+c2V0X2lzX3BsYWNlaG9sZGVyKGZhbHNlKTsKKworICBzdGFja18ucHVzaChjdXJyZW50Xyk7CisgIGN1cnJlbnRfID0gY2hpbGQ7CisgIHJldHVybiB0aGlzOworfQorCit2b2lkIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlcjo6V3JpdGVSb290KCkgeworICByb290Xy0+V3JpdGVUbyhvd18pOworICByb290Xy5yZXNldChudWxscHRyKTsKKyAgY3VycmVudF8gPSBudWxscHRyOworfQorCitEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXIqIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlcjo6RW5kTGlzdCgpIHsKKyAgaWYgKHN0YWNrXy5lbXB0eSgpKSB7CisgICAgV3JpdGVSb290KCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKyAgY3VycmVudF8gPSBzdGFja18udG9wKCk7CisgIHN0YWNrXy5wb3AoKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK3ZvaWQgRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyOjpSZW5kZXJEYXRhUGllY2UoU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YVBpZWNlJiBkYXRhKSB7CisgIE1heWJlUG9wdWxhdGVDaGlsZHJlbk9mQW55KGN1cnJlbnRfKTsKKyAgaWYgKGN1cnJlbnRfLT50eXBlKCkgIT0gbnVsbHB0ciAmJiBjdXJyZW50Xy0+dHlwZSgpLT5uYW1lKCkgPT0ga0FueVR5cGUgJiYKKyAgICAgIG5hbWUgPT0gIkB0eXBlIikgeworICAgIHV0aWw6OlN0YXR1c09yPHN0ZDo6c3RyaW5nPiBkYXRhX3N0cmluZyA9IGRhdGEuVG9TdHJpbmcoKTsKKyAgICBpZiAoZGF0YV9zdHJpbmcub2soKSkgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZ192YWx1ZSA9IGRhdGFfc3RyaW5nLnZhbHVlKCk7CisgICAgICAvLyBJZiB0aGUgdHlwZSBvZiBjdXJyZW50XyBpcyAiQW55IiBhbmQgaXRzICJAdHlwZSIgZmllbGQgaXMgYmVpbmcgc2V0CisgICAgICAvLyBoZXJlLCBzZXRzIHRoZSB0eXBlIG9mIGN1cnJlbnRfIHRvIGJlIHRoZSB0eXBlIHNwZWNpZmllZCBieSB0aGUKKyAgICAgIC8vICJAdHlwZSIuCisgICAgICB1dGlsOjpTdGF0dXNPcjxjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKj4gZm91bmRfdHlwZSA9CisgICAgICAgICAgdHlwZWluZm9fLT5SZXNvbHZlVHlwZVVybChzdHJpbmdfdmFsdWUpOworICAgICAgaWYgKCFmb3VuZF90eXBlLm9rKCkpIHsKKyAgICAgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIHJlc29sdmUgdHlwZSAnIiA8PCBzdHJpbmdfdmFsdWUgPDwgIicuIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN1cnJlbnRfLT5zZXRfdHlwZShmb3VuZF90eXBlLnZhbHVlKCkpOworICAgICAgfQorICAgICAgY3VycmVudF8tPnNldF9pc19hbnkodHJ1ZSk7CisgICAgICAvLyBJZiB0aGUgIkB0eXBlIiBmaWVsZCBpcyBwbGFjZWQgYWZ0ZXIgb3RoZXIgZmllbGRzLCB3ZSBzaG91bGQgcG9wdWxhdGUKKyAgICAgIC8vIG90aGVyIGNoaWxkcmVuIG9mIHByaW1pdGl2ZSB0eXBlIG5vdy4gT3RoZXJ3aXNlLCB3ZSBzaG91bGQgd2FpdCB1bnRpbAorICAgICAgLy8gdGhlIGZpcnN0IHZhbHVlIGZpZWxkIGlzIHJlbmRlcmVkIGJlZm9yZSB3ZSBwb3B1bGF0ZSB0aGUgY2hpbGRyZW4sCisgICAgICAvLyBiZWNhdXNlIHRoZSAidmFsdWUiIGZpZWxkIG9mIGEgQW55IG1lc3NhZ2UgY291bGQgYmUgb21pdHRlZC4KKyAgICAgIGlmIChjdXJyZW50Xy0+bnVtYmVyX29mX2NoaWxkcmVuKCkgPiAxICYmIGN1cnJlbnRfLT50eXBlKCkgIT0gbnVsbHB0cikgeworICAgICAgICBjdXJyZW50Xy0+UG9wdWxhdGVDaGlsZHJlbih0eXBlaW5mb18pOworICAgICAgfQorICAgIH0KKyAgfQorICBOb2RlKiBjaGlsZCA9IGN1cnJlbnRfLT5GaW5kQ2hpbGQobmFtZSk7CisgIGlmIChjaGlsZCA9PSBudWxscHRyIHx8IGNoaWxkLT5raW5kKCkgIT0gUFJJTUlUSVZFKSB7CisgICAgLy8gTm8gY2hpbGRyZW4gYXJlIGZvdW5kLCBjcmVhdGVzIGEgbmV3IGNoaWxkLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxOb2RlPiBub2RlKAorICAgICAgICBDcmVhdGVOZXdOb2RlKHN0ZDo6c3RyaW5nKG5hbWUpLCBudWxscHRyLCBQUklNSVRJVkUsIGRhdGEsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID09IG51bGxwdHIgPyBjdXJyZW50Xy0+cGF0aCgpIDogY2hpbGQtPnBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc19lbXB0eV9saXN0XywgcHJlc2VydmVfcHJvdG9fZmllbGRfbmFtZXNfLAorICAgICAgICAgICAgICAgICAgICAgIHVzZV9pbnRzX2Zvcl9lbnVtc18sIGZpZWxkX3NjcnViX2NhbGxiYWNrXykpOworICAgIGN1cnJlbnRfLT5BZGRDaGlsZChub2RlLnJlbGVhc2UoKSk7CisgIH0gZWxzZSB7CisgICAgY2hpbGQtPnNldF9kYXRhKGRhdGEpOworICAgIGNoaWxkLT5zZXRfaXNfcGxhY2Vob2xkZXIoZmFsc2UpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllMTY3MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5oCkBAIC0wLDAgKzEsMzMyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9ERUZBVUxUX1ZBTFVFX09CSkVDVFdSSVRFUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfREVGQVVMVF9WQUxVRV9PQkpFQ1RXUklURVJfSF9fCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RhdGFwaWVjZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF93cml0ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm8uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlci5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKKy8vIEFuIE9iamVjdFdyaXRlciB0aGF0IHJlbmRlcnMgbm9uLXJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZHMgb2YgcHJvdG8gbWVzc2FnZXMKKy8vIHdpdGggdGhlaXIgZGVmYXVsdCB2YWx1ZXMuIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlciBob2xkcyBvYmplY3RzLCBsaXN0cyBhbmQKKy8vIGZpZWxkcyBpdCByZWNlaXZlcyBpbiBhIHRyZWUgc3RydWN0dXJlIGFuZCB3cml0ZXMgdGhlbSBvdXQgdG8gYW5vdGhlcgorLy8gT2JqZWN0V3JpdGVyIHdoZW4gRW5kT2JqZWN0KCkgaXMgY2FsbGVkIG9uIHRoZSByb290IG9iamVjdC4gSXQgYWxzbyB3cml0ZXMKKy8vIG91dCBhbGwgbm9uLXJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZHMgdGhhdCBoYXZlbid0IGJlZW4gZXhwbGljaXRseSByZW5kZXJlZAorLy8gd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlcyAoMCBmb3IgbnVtYmVycywgIiIgZm9yIHN0cmluZ3MsIGV0YykuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyIDogcHVibGljIE9iamVjdFdyaXRlciB7CisgcHVibGljOgorICAvLyBBIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNoZWNrIHdoZXRoZXIgYSBmaWVsZCBuZWVkcyB0byBiZSBzY3J1YmJlZC4KKyAgLy8KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBzaG91bGQgbm90IGJlIHByZXNlbnQgaW4gdGhlIG91dHB1dC4gUmV0dXJucworICAvLyBmYWxzZSBvdGhlcndpc2UuCisgIC8vCisgIC8vIFRoZSAncGF0aCcgcGFyYW1ldGVyIGlzIGEgdmVjdG9yIG9mIHBhdGggdG8gdGhlIGZpZWxkIGZyb20gcm9vdC4gRm9yCisgIC8vIGV4YW1wbGU6IGlmIGEgbmVzdGVkIGZpZWxkICJhLmIuYyIgKGIgaXMgdGhlIHBhcmVudCBtZXNzYWdlIGZpZWxkIG9mIGMgYW5kCisgIC8vIGEgaXMgdGhlIHBhcmVudCBtZXNzYWdlIGZpZWxkIG9mIGIpLCB0aGVuIHRoZSB2ZWN0b3Igc2hvdWxkIGNvbnRhaW4geyAiYSIsCisgIC8vICJiIiwgImMiIH0uCisgIC8vCisgIC8vIFRoZSBGaWVsZCogc2hvdWxkIHBvaW50IHRvIHRoZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCBvZiAiYyIuCisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxib29sKAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiAvKnBhdGggb2YgdGhlIGZpZWxkKi8sCisgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogLypmaWVsZCovKT4KKyAgICAgIEZpZWxkU2NydWJDYWxsQmFjazsKKworICBEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXIoVHlwZVJlc29sdmVyKiB0eXBlX3Jlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFdyaXRlciogb3cpOworCisgIH5EZWZhdWx0VmFsdWVPYmplY3RXcml0ZXIoKSBvdmVycmlkZTsKKworICAvLyBPYmplY3RXcml0ZXIgbWV0aG9kcy4KKyAgRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyKiBTdGFydE9iamVjdChTdHJpbmdQaWVjZSBuYW1lKSBvdmVycmlkZTsKKworICBEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXIqIEVuZE9iamVjdCgpIG92ZXJyaWRlOworCisgIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlciogU3RhcnRMaXN0KFN0cmluZ1BpZWNlIG5hbWUpIG92ZXJyaWRlOworCisgIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlciogRW5kTGlzdCgpIG92ZXJyaWRlOworCisgIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlciogUmVuZGVyQm9vbChTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB2YWx1ZSkgb3ZlcnJpZGU7CisKKyAgRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyKiBSZW5kZXJJbnQzMihTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUpIG92ZXJyaWRlOworCisgIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlciogUmVuZGVyVWludDMyKFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKSBvdmVycmlkZTsKKworICBEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXIqIFJlbmRlckludDY0KFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSkgb3ZlcnJpZGU7CisKKyAgRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyKiBSZW5kZXJVaW50NjQoU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWUpIG92ZXJyaWRlOworCisgIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlciogUmVuZGVyRG91YmxlKFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSkgb3ZlcnJpZGU7CisKKyAgRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyKiBSZW5kZXJGbG9hdChTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbHVlKSBvdmVycmlkZTsKKworICBEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXIqIFJlbmRlclN0cmluZyhTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSB2YWx1ZSkgb3ZlcnJpZGU7CisgIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlciogUmVuZGVyQnl0ZXMoU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSB2YWx1ZSkgb3ZlcnJpZGU7CisKKyAgRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyKiBSZW5kZXJOdWxsKFN0cmluZ1BpZWNlIG5hbWUpIG92ZXJyaWRlOworCisgIC8vIFJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmb3Igc2NydWJiaW5nIG9mIGZpZWxkcy4KKyAgdm9pZCBSZWdpc3RlckZpZWxkU2NydWJDYWxsQmFjayhGaWVsZFNjcnViQ2FsbEJhY2sgZmllbGRfc2NydWJfY2FsbGJhY2spOworCisgIC8vIElmIHNldCB0byB0cnVlLCBlbXB0eSBsaXN0cyBhcmUgc3VwcHJlc3NlZCBmcm9tIG91dHB1dCB3aGVuIGRlZmF1bHQgdmFsdWVzCisgIC8vIGFyZSB3cml0dGVuLgorICB2b2lkIHNldF9zdXBwcmVzc19lbXB0eV9saXN0KGJvb2wgdmFsdWUpIHsgc3VwcHJlc3NfZW1wdHlfbGlzdF8gPSB2YWx1ZTsgfQorCisgIC8vIElmIHNldCB0byB0cnVlLCBvcmlnaW5hbCBwcm90byBmaWVsZCBuYW1lcyBhcmUgdXNlZAorICB2b2lkIHNldF9wcmVzZXJ2ZV9wcm90b19maWVsZF9uYW1lcyhib29sIHZhbHVlKSB7CisgICAgcHJlc2VydmVfcHJvdG9fZmllbGRfbmFtZXNfID0gdmFsdWU7CisgIH0KKworICAvLyBJZiBzZXQgdG8gdHJ1ZSwgZW51bXMgYXJlIHJlbmRlcmVkIGFzIGludHMgZnJvbSBvdXRwdXQgd2hlbiBkZWZhdWx0IHZhbHVlcworICAvLyBhcmUgd3JpdHRlbi4KKyAgdm9pZCBzZXRfcHJpbnRfZW51bXNfYXNfaW50cyhib29sIHZhbHVlKSB7IHVzZV9pbnRzX2Zvcl9lbnVtc18gPSB2YWx1ZTsgfQorCisgcHJvdGVjdGVkOgorICBlbnVtIE5vZGVLaW5kIHsKKyAgICBQUklNSVRJVkUgPSAwLAorICAgIE9CSkVDVCA9IDEsCisgICAgTElTVCA9IDIsCisgICAgTUFQID0gMywKKyAgfTsKKworICAvLyAiTm9kZSIgcmVwcmVzZW50cyBhIG5vZGUgaW4gdGhlIHRyZWUgdGhhdCBob2xkcyB0aGUgaW5wdXQgb2YKKyAgLy8gRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyLgorICBjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTm9kZSB7CisgICBwdWJsaWM6CisgICAgTm9kZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogdHlwZSwKKyAgICAgICAgIE5vZGVLaW5kIGtpbmQsIGNvbnN0IERhdGFQaWVjZSYgZGF0YSwgYm9vbCBpc19wbGFjZWhvbGRlciwKKyAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcGF0aCwgYm9vbCBzdXBwcmVzc19lbXB0eV9saXN0LAorICAgICAgICAgYm9vbCBwcmVzZXJ2ZV9wcm90b19maWVsZF9uYW1lcywgYm9vbCB1c2VfaW50c19mb3JfZW51bXMsCisgICAgICAgICBGaWVsZFNjcnViQ2FsbEJhY2sgZmllbGRfc2NydWJfY2FsbGJhY2spOworICAgIHZpcnR1YWwgfk5vZGUoKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuXy5zaXplKCk7ICsraSkgeworICAgICAgICBkZWxldGUgY2hpbGRyZW5fW2ldOworICAgICAgfQorICAgIH0KKworICAgIC8vIEFkZHMgYSBjaGlsZCB0byB0aGlzIG5vZGUuIFRha2VzIG93bmVyc2hpcCBvZiB0aGlzIGNoaWxkLgorICAgIHZvaWQgQWRkQ2hpbGQoTm9kZSogY2hpbGQpIHsgY2hpbGRyZW5fLnB1c2hfYmFjayhjaGlsZCk7IH0KKworICAgIC8vIEZpbmRzIHRoZSBjaGlsZCBnaXZlbiBpdHMgbmFtZS4KKyAgICBOb2RlKiBGaW5kQ2hpbGQoU3RyaW5nUGllY2UgbmFtZSk7CisKKyAgICAvLyBQb3B1bGF0ZXMgY2hpbGRyZW4gb2YgdGhpcyBOb2RlIGJhc2VkIG9uIGl0cyB0eXBlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeQorICAgIC8vIGNoaWxkcmVuIGNyZWF0ZWQsIHRoZXkgd2lsbCBiZSBtZXJnZWQgdG8gdGhlIHJlc3VsdC4gQ2FsbGVyIHNob3VsZCBwYXNzCisgICAgLy8gaW4gVHlwZUluZm8gZm9yIGxvb2tpbmcgdXAgdHlwZXMgb2YgdGhlIGNoaWxkcmVuLgorICAgIHZpcnR1YWwgdm9pZCBQb3B1bGF0ZUNoaWxkcmVuKGNvbnN0IFR5cGVJbmZvKiB0eXBlaW5mbyk7CisKKyAgICAvLyBJZiB0aGlzIG5vZGUgaXMgYSBsZWFmIChoYXMgZGF0YSksIHdyaXRlcyB0aGUgY3VycmVudCBub2RlIHRvIHRoZQorICAgIC8vIE9iamVjdFdyaXRlcjsgaWYgbm90LCB0aGVuIHJlY3Vyc2l2ZWx5IHdyaXRlcyB0aGUgY2hpbGRyZW4gdG8gdGhlCisgICAgLy8gT2JqZWN0V3JpdGVyLgorICAgIHZpcnR1YWwgdm9pZCBXcml0ZVRvKE9iamVjdFdyaXRlciogb3cpOworCisgICAgLy8gQWNjZXNzb3JzCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwYXRoKCkgY29uc3QgeyByZXR1cm4gcGF0aF87IH0KKworICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqIHR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorCisgICAgdm9pZCBzZXRfdHlwZShjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKiB0eXBlKSB7IHR5cGVfID0gdHlwZTsgfQorCisgICAgTm9kZUtpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIGtpbmRfOyB9CisKKyAgICBpbnQgbnVtYmVyX29mX2NoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4gY2hpbGRyZW5fLnNpemUoKTsgfQorCisgICAgdm9pZCBzZXRfZGF0YShjb25zdCBEYXRhUGllY2UmIGRhdGEpIHsgZGF0YV8gPSBkYXRhOyB9CisKKyAgICBib29sIGlzX2FueSgpIGNvbnN0IHsgcmV0dXJuIGlzX2FueV87IH0KKworICAgIHZvaWQgc2V0X2lzX2FueShib29sIGlzX2FueSkgeyBpc19hbnlfID0gaXNfYW55OyB9CisKKyAgICB2b2lkIHNldF9pc19wbGFjZWhvbGRlcihib29sIGlzX3BsYWNlaG9sZGVyKSB7CisgICAgICBpc19wbGFjZWhvbGRlcl8gPSBpc19wbGFjZWhvbGRlcjsKKyAgICB9CisKKyAgIHByb3RlY3RlZDoKKyAgICAvLyBSZXR1cm5zIHRoZSBWYWx1ZSBUeXBlIG9mIGEgbWFwIGdpdmVuIHRoZSBUeXBlIG9mIHRoZSBtYXAgZW50cnkgYW5kIGEKKyAgICAvLyBUeXBlSW5mbyBpbnN0YW5jZS4KKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKiBHZXRNYXBWYWx1ZVR5cGUoCisgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIGZvdW5kX3R5cGUsIGNvbnN0IFR5cGVJbmZvKiB0eXBlaW5mbyk7CisKKyAgICAvLyBDYWxscyBXcml0ZVRvKCkgb24gZXZlcnkgY2hpbGQgaW4gY2hpbGRyZW5fLgorICAgIHZvaWQgV3JpdGVDaGlsZHJlbihPYmplY3RXcml0ZXIqIG93KTsKKworICAgIC8vIFRoZSBuYW1lIG9mIHRoaXMgbm9kZS4KKyAgICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgICAvLyBnb29nbGU6OnByb3RvYnVmOjpUeXBlIG9mIHRoaXMgbm9kZS4gT3duZWQgYnkgVHlwZUluZm8uCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogdHlwZV87CisgICAgLy8gVGhlIGtpbmQgb2YgdGhpcyBub2RlLgorICAgIE5vZGVLaW5kIGtpbmRfOworICAgIC8vIFdoZXRoZXIgdGhpcyBpcyBhIG5vZGUgZm9yICJBbnkiLgorICAgIGJvb2wgaXNfYW55XzsKKyAgICAvLyBUaGUgZGF0YSBvZiB0aGlzIG5vZGUgd2hlbiBpdCBpcyBhIGxlYWYgbm9kZS4KKyAgICBEYXRhUGllY2UgZGF0YV87CisgICAgLy8gQ2hpbGRyZW4gb2YgdGhpcyBub2RlLgorICAgIHN0ZDo6dmVjdG9yPE5vZGUqPiBjaGlsZHJlbl87CisgICAgLy8gV2hldGhlciB0aGlzIG5vZGUgaXMgYSBwbGFjZWhvbGRlciBmb3IgYW4gb2JqZWN0IG9yIGxpc3QgYXV0b21hdGljYWxseQorICAgIC8vIGdlbmVyYXRlZCB3aGVuIGNyZWF0aW5nIHRoZSBwYXJlbnQgbm9kZS4gU2hvdWxkIGJlIHNldCB0byBmYWxzZSBhZnRlcgorICAgIC8vIHRoZSBwYXJlbnQgbm9kZSdzIFN0YXJ0T2JqZWN0KCkvU3RhcnRMaXN0KCkgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRoaXMKKyAgICAvLyBub2RlJ3MgbmFtZS4KKyAgICBib29sIGlzX3BsYWNlaG9sZGVyXzsKKworICAgIC8vIFBhdGggb2YgdGhlIGZpZWxkIG9mIHRoaXMgbm9kZQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXRoXzsKKworICAgIC8vIFdoZXRoZXIgdG8gc3VwcHJlc3MgZW1wdHkgbGlzdCBvdXRwdXQuCisgICAgYm9vbCBzdXBwcmVzc19lbXB0eV9saXN0XzsKKworICAgIC8vIFdoZXRoZXIgdG8gcHJlc2VydmUgb3JpZ2luYWwgcHJvdG8gZmllbGQgbmFtZXMKKyAgICBib29sIHByZXNlcnZlX3Byb3RvX2ZpZWxkX25hbWVzXzsKKworICAgIC8vIFdoZXRoZXIgdG8gYWx3YXlzIHByaW50IGVudW1zIGFzIGludHMKKyAgICBib29sIHVzZV9pbnRzX2Zvcl9lbnVtc187CisKKyAgICAvLyBGdW5jdGlvbiBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBhIGZpZWxkIG5lZWRzIHRvIGJlIHNjcnViYmVkIG9yIG5vdC4KKyAgICBGaWVsZFNjcnViQ2FsbEJhY2sgZmllbGRfc2NydWJfY2FsbGJhY2tfOworCisgICBwcml2YXRlOgorICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOb2RlKTsKKyAgfTsKKworICAvLyBDcmVhdGVzIGEgbmV3IE5vZGUgYW5kIHJldHVybnMgaXQuIENhbGxlciBvd25zIG1lbW9yeSBvZiByZXR1cm5lZCBvYmplY3QuCisgIHZpcnR1YWwgTm9kZSogQ3JlYXRlTmV3Tm9kZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqIHR5cGUsIE5vZGVLaW5kIGtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhUGllY2UmIGRhdGEsIGJvb2wgaXNfcGxhY2Vob2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1cHByZXNzX2VtcHR5X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZXNlcnZlX3Byb3RvX2ZpZWxkX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfaW50c19mb3JfZW51bXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFNjcnViQ2FsbEJhY2sgZmllbGRfc2NydWJfY2FsbGJhY2spOworCisgIC8vIENyZWF0ZXMgYSBEYXRhUGllY2UgY29udGFpbmluZyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgdHlwZSBvZiB0aGUgZmllbGQuCisgIHN0YXRpYyBEYXRhUGllY2UgQ3JlYXRlRGVmYXVsdERhdGFQaWVjZUZvckZpZWxkKAorICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQmIGZpZWxkLCBjb25zdCBUeXBlSW5mbyogdHlwZWluZm8pIHsKKyAgICByZXR1cm4gQ3JlYXRlRGVmYXVsdERhdGFQaWVjZUZvckZpZWxkKGZpZWxkLCB0eXBlaW5mbywgZmFsc2UpOworICB9CisKKyAgLy8gU2FtZSBhcyB0aGUgYWJvdmUgYnV0IHdpdGggYSBmbGFnIHRvIHVzZSBpbnRzIGluc3RlYWQgb2YgZW51bSBuYW1lcy4KKyAgc3RhdGljIERhdGFQaWVjZSBDcmVhdGVEZWZhdWx0RGF0YVBpZWNlRm9yRmllbGQoCisgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCYgZmllbGQsIGNvbnN0IFR5cGVJbmZvKiB0eXBlaW5mbywKKyAgICAgIGJvb2wgdXNlX2ludHNfZm9yX2VudW1zKTsKKworIHByb3RlY3RlZDoKKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gY3VycmVudCBOb2RlIGluIHRyZWUuCisgIE5vZGUqIGN1cnJlbnQoKSB7IHJldHVybiBjdXJyZW50XzsgfQorCisgcHJpdmF0ZToKKyAgLy8gUG9wdWxhdGVzIGNoaWxkcmVuIG9mICJub2RlIiBpZiBpdCBpcyBhbiAiYW55IiBOb2RlIGFuZCBpdHMgcmVhbCB0eXBlIGhhcworICAvLyBiZWVuIGdpdmVuLgorICB2b2lkIE1heWJlUG9wdWxhdGVDaGlsZHJlbk9mQW55KE5vZGUqIG5vZGUpOworCisgIC8vIFdyaXRlcyB0aGUgcm9vdF8gbm9kZSB0byBvd18gYW5kIHJlc2V0cyB0aGUgcm9vdF8gYW5kIGN1cnJlbnRfIHBvaW50ZXIgdG8KKyAgLy8gbnVsbHB0ci4KKyAgdm9pZCBXcml0ZVJvb3QoKTsKKworICAvLyBBZGRzIG9yIHJlcGxhY2VzIHRoZSBkYXRhXyBvZiBhIHByaW1pdGl2ZSBjaGlsZCBub2RlLgorICB2b2lkIFJlbmRlckRhdGFQaWVjZShTdHJpbmdQaWVjZSBuYW1lLCBjb25zdCBEYXRhUGllY2UmIGRhdGEpOworCisgIC8vIFJldHVybnMgdGhlIGRlZmF1bHQgZW51bSB2YWx1ZSBhcyBhIERhdGFQaWVjZSwgb3IgdGhlIGZpcnN0IGVudW0gdmFsdWUgaWYKKyAgLy8gdGhlcmUgaXMgbm8gZGVmYXVsdC4gRm9yIHByb3RvMywgd2hlcmUgd2UgY2Fubm90IHNwZWNpZnkgYW4gZXhwbGljaXQKKyAgLy8gZGVmYXVsdCwgYSB6ZXJvIHZhbHVlIHdpbGwgYWx3YXlzIGJlIHJldHVybmVkLgorICBzdGF0aWMgRGF0YVBpZWNlIEZpbmRFbnVtRGVmYXVsdChjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCYgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGVJbmZvKiB0eXBlaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfaW50c19mb3JfZW51bXMpOworCisgIC8vIFR5cGUgaW5mb3JtYXRpb24gZm9yIGFsbCB0aGUgdHlwZXMgdXNlZCBpbiB0aGUgZGVzY3JpcHRvci4gVXNlZCB0byBmaW5kCisgIC8vIGdvb2dsZTo6cHJvdG9idWY6OlR5cGUgb2YgbmVzdGVkIG1lc3NhZ2VzL2VudW1zLgorICBjb25zdCBUeXBlSW5mbyogdHlwZWluZm9fOworICAvLyBXaGV0aGVyIHRoZSBUeXBlSW5mbyBvYmplY3QgaXMgb3duZWQgYnkgdGhpcyBjbGFzcy4KKyAgYm9vbCBvd25fdHlwZWluZm9fOworICAvLyBnb29nbGU6OnByb3RvYnVmOjpUeXBlIG9mIHRoZSByb290IG1lc3NhZ2UgdHlwZS4KKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZV87CisgIC8vIEhvbGRzIGNvcGllcyBvZiBzdHJpbmdzIHBhc3NlZCB0byBSZW5kZXJTdHJpbmcuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4+IHN0cmluZ192YWx1ZXNfOworCisgIC8vIFRoZSBjdXJyZW50IE5vZGUuIE93bmVkIGJ5IGl0cyBwYXJlbnRzLgorICBOb2RlKiBjdXJyZW50XzsKKyAgLy8gVGhlIHJvb3QgTm9kZS4KKyAgc3RkOjp1bmlxdWVfcHRyPE5vZGU+IHJvb3RfOworICAvLyBUaGUgc3RhY2sgdG8gaG9sZCB0aGUgcGF0aCBvZiBOb2RlcyBmcm9tIGN1cnJlbnRfIHRvIHJvb3RfOworICBzdGQ6OnN0YWNrPE5vZGUqPiBzdGFja187CisKKyAgLy8gV2hldGhlciB0byBzdXBwcmVzcyBvdXRwdXQgb2YgZW1wdHkgbGlzdHMuCisgIGJvb2wgc3VwcHJlc3NfZW1wdHlfbGlzdF87CisKKyAgLy8gV2hldGhlciB0byBwcmVzZXJ2ZSBvcmlnaW5hbCBwcm90byBmaWVsZCBuYW1lcworICBib29sIHByZXNlcnZlX3Byb3RvX2ZpZWxkX25hbWVzXzsKKworICAvLyBXaGV0aGVyIHRvIGFsd2F5cyBwcmludCBlbnVtcyBhcyBpbnRzCisgIGJvb2wgdXNlX2ludHNfZm9yX2VudW1zXzsKKworICAvLyBGdW5jdGlvbiBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBhIGZpZWxkIG5lZWRzIHRvIGJlIHNjcnViYmVkIG9yIG5vdC4KKyAgRmllbGRTY3J1YkNhbGxCYWNrIGZpZWxkX3NjcnViX2NhbGxiYWNrXzsKKworICBPYmplY3RXcml0ZXIqIG93XzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9ERUZBVUxUX1ZBTFVFX09CSkVDVFdSSVRFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZiMTRkYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0LmNjCkBAIC0wLDAgKzEsMTkxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9leHBlY3Rpbmdfb2JqZWN0d3JpdGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpEZWZhdWx0VmFsdWVUZXN0OworCisvLyBCYXNlIGNsYXNzIGZvciBzZXR0aW5nIHVwIHJlcXVpcmVkIHN0YXRlIGZvciBydW5uaW5nIGRlZmF1bHQgdmFsdWVzIHRlc3RzIG9uCisvLyBkaWZmZXJlbnQgZGVzY3JpcHRvcnMuCitjbGFzcyBCYXNlRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0ZXN0aW5nOjpUeXBlSW5mb1NvdXJjZT4geworIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgQmFzZURlZmF1bHRWYWx1ZU9iamVjdFdyaXRlclRlc3QoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikKKyAgICAgIDogaGVscGVyXyhHZXRQYXJhbSgpKSwgbW9ja18oKSwgZXhwZWN0c18oJm1vY2tfKSB7CisgICAgaGVscGVyXy5SZXNldFR5cGVJbmZvKGRlc2NyaXB0b3IpOworICAgIHRlc3RpbmdfLnJlc2V0KGhlbHBlcl8uTmV3RGVmYXVsdFZhbHVlV3JpdGVyKAorICAgICAgICBzdGQ6OnN0cmluZyhrVHlwZVNlcnZpY2VCYXNlVXJsKSArICIvIiArIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLAorICAgICAgICAmbW9ja18pKTsKKyAgfQorCisgIH5CYXNlRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyVGVzdCgpIG92ZXJyaWRlIHt9CisKKyAgVHlwZUluZm9UZXN0SGVscGVyIGhlbHBlcl87CisgIE1vY2tPYmplY3RXcml0ZXIgbW9ja187CisgIEV4cGVjdGluZ09iamVjdFdyaXRlciBleHBlY3RzXzsKKyAgc3RkOjp1bmlxdWVfcHRyPERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlcj4gdGVzdGluZ187Cit9OworCisvLyBUZXN0cyB0byBjb3ZlciBzb21lIGJhc2ljIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlciB1c2UgY2FzZXMuIE1vcmUgdGVzdHMgYXJlCisvLyBpbiB0aGUgbWFyc2hhbGxpbmdfdGVzdC5jYyBhbmQgdHJhbnNsYXRvcl9pbnRlZ3JhdGlvbl90ZXN0LmNjLgorY2xhc3MgRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyVGVzdCA6IHB1YmxpYyBCYXNlRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyVGVzdCB7CisgcHJvdGVjdGVkOgorICBEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXJUZXN0KCkKKyAgICAgIDogQmFzZURlZmF1bHRWYWx1ZU9iamVjdFdyaXRlclRlc3QoRGVmYXVsdFZhbHVlVGVzdDo6ZGVzY3JpcHRvcigpKSB7fQorICB+RGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyVGVzdCgpIG92ZXJyaWRlIHt9Cit9OworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoRGlmZmVyZW50VHlwZUluZm9Tb3VyY2VUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlVTRV9UWVBFX1JFU09MVkVSKSk7CisKK1RFU1RfUChEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXJUZXN0LCBFbXB0eSkgeworICAvLyBTZXQgZXhwZWN0YXRpb24KKyAgZXhwZWN0c18uU3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlckRvdWJsZSgiZG91YmxlVmFsdWUiLCAwLjApCisgICAgICAtPlN0YXJ0TGlzdCgicmVwZWF0ZWREb3VibGUiKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+UmVuZGVyRmxvYXQoImZsb2F0VmFsdWUiLCAwLjApCisgICAgICAtPlJlbmRlckludDY0KCJpbnQ2NFZhbHVlIiwgMCkKKyAgICAgIC0+UmVuZGVyVWludDY0KCJ1aW50NjRWYWx1ZSIsIDApCisgICAgICAtPlJlbmRlckludDMyKCJpbnQzMlZhbHVlIiwgMCkKKyAgICAgIC0+UmVuZGVyVWludDMyKCJ1aW50MzJWYWx1ZSIsIDApCisgICAgICAtPlJlbmRlckJvb2woImJvb2xWYWx1ZSIsIGZhbHNlKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInN0cmluZ1ZhbHVlIiwgIiIpCisgICAgICAtPlJlbmRlckJ5dGVzKCJieXRlc1ZhbHVlIiwgIiIpCisgICAgICAtPlJlbmRlclN0cmluZygiZW51bVZhbHVlIiwgIkVOVU1fRklSU1QiKQorICAgICAgLT5FbmRPYmplY3QoKTsKKworICAvLyBBY3R1YWwgdGVzdGluZworICB0ZXN0aW5nXy0+U3RhcnRPYmplY3QoIiIpLT5FbmRPYmplY3QoKTsKK30KKworVEVTVF9QKERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlclRlc3QsIE5vbkRlZmF1bHREb3VibGUpIHsKKyAgLy8gU2V0IGV4cGVjdGF0aW9uCisgIGV4cGVjdHNfLlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJEb3VibGUoImRvdWJsZVZhbHVlIiwgMS4wKQorICAgICAgLT5TdGFydExpc3QoInJlcGVhdGVkRG91YmxlIikKKyAgICAgIC0+RW5kTGlzdCgpCisgICAgICAtPlJlbmRlckZsb2F0KCJmbG9hdFZhbHVlIiwgMC4wKQorICAgICAgLT5SZW5kZXJJbnQ2NCgiaW50NjRWYWx1ZSIsIDApCisgICAgICAtPlJlbmRlclVpbnQ2NCgidWludDY0VmFsdWUiLCAwKQorICAgICAgLT5SZW5kZXJJbnQzMigiaW50MzJWYWx1ZSIsIDApCisgICAgICAtPlJlbmRlclVpbnQzMigidWludDMyVmFsdWUiLCAwKQorICAgICAgLT5SZW5kZXJCb29sKCJib29sVmFsdWUiLCBmYWxzZSkKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJzdHJpbmdWYWx1ZSIsICIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImVudW1WYWx1ZSIsICJFTlVNX0ZJUlNUIikKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisKKyAgLy8gQWN0dWFsIHRlc3RpbmcKKyAgdGVzdGluZ18tPlN0YXJ0T2JqZWN0KCIiKS0+UmVuZGVyRG91YmxlKCJkb3VibGVWYWx1ZSIsIDEuMCktPkVuZE9iamVjdCgpOworfQorCitURVNUX1AoRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyVGVzdCwgU2hvdWxkUmV0YWluVW5rbm93bkZpZWxkKSB7CisgIC8vIFNldCBleHBlY3RhdGlvbgorICBleHBlY3RzXy5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyRG91YmxlKCJkb3VibGVWYWx1ZSIsIDEuMCkKKyAgICAgIC0+U3RhcnRMaXN0KCJyZXBlYXRlZERvdWJsZSIpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5SZW5kZXJGbG9hdCgiZmxvYXRWYWx1ZSIsIDAuMCkKKyAgICAgIC0+UmVuZGVySW50NjQoImludDY0VmFsdWUiLCAwKQorICAgICAgLT5SZW5kZXJVaW50NjQoInVpbnQ2NFZhbHVlIiwgMCkKKyAgICAgIC0+UmVuZGVySW50MzIoImludDMyVmFsdWUiLCAwKQorICAgICAgLT5SZW5kZXJVaW50MzIoInVpbnQzMlZhbHVlIiwgMCkKKyAgICAgIC0+UmVuZGVyQm9vbCgiYm9vbFZhbHVlIiwgZmFsc2UpCisgICAgICAtPlJlbmRlclN0cmluZygic3RyaW5nVmFsdWUiLCAiIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ1bmtub3duIiwgImFiYyIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJ1bmtub3duT2JqZWN0IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ1bmtub3duIiwgImRlZiIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPlJlbmRlclN0cmluZygiZW51bVZhbHVlIiwgIkVOVU1fRklSU1QiKQorICAgICAgLT5FbmRPYmplY3QoKTsKKworICAvLyBBY3R1YWwgdGVzdGluZworICB0ZXN0aW5nXy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlckRvdWJsZSgiZG91YmxlVmFsdWUiLCAxLjApCisgICAgICAtPlJlbmRlclN0cmluZygidW5rbm93biIsICJhYmMiKQorICAgICAgLT5TdGFydE9iamVjdCgidW5rbm93bk9iamVjdCIpCisgICAgICAtPlJlbmRlclN0cmluZygidW5rbm93biIsICJkZWYiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKK30KKworCitjbGFzcyBEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXJTdXBwcmVzc0xpc3RUZXN0CisgICAgOiBwdWJsaWMgQmFzZURlZmF1bHRWYWx1ZU9iamVjdFdyaXRlclRlc3QgeworIHByb3RlY3RlZDoKKyAgRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyU3VwcHJlc3NMaXN0VGVzdCgpCisgICAgICA6IEJhc2VEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXJUZXN0KERlZmF1bHRWYWx1ZVRlc3Q6OmRlc2NyaXB0b3IoKSkgeworICAgIHRlc3RpbmdfLT5zZXRfc3VwcHJlc3NfZW1wdHlfbGlzdCh0cnVlKTsKKyAgfQorICB+RGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyU3VwcHJlc3NMaXN0VGVzdCgpIG92ZXJyaWRlIHt9Cit9OworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoRGlmZmVyZW50VHlwZUluZm9Tb3VyY2VUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlclN1cHByZXNzTGlzdFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlVTRV9UWVBFX1JFU09MVkVSKSk7CisKK1RFU1RfUChEZWZhdWx0VmFsdWVPYmplY3RXcml0ZXJTdXBwcmVzc0xpc3RUZXN0LCBFbXB0eSkgeworICAvLyBTZXQgZXhwZWN0YXRpb24uIEVtcHR5IGxpc3RzIHNob3VsZCBiZSBzdXBwcmVzc2VkLgorICBleHBlY3RzXy5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyRG91YmxlKCJkb3VibGVWYWx1ZSIsIDAuMCkKKyAgICAgIC0+UmVuZGVyRmxvYXQoImZsb2F0VmFsdWUiLCAwLjApCisgICAgICAtPlJlbmRlckludDY0KCJpbnQ2NFZhbHVlIiwgMCkKKyAgICAgIC0+UmVuZGVyVWludDY0KCJ1aW50NjRWYWx1ZSIsIDApCisgICAgICAtPlJlbmRlckludDMyKCJpbnQzMlZhbHVlIiwgMCkKKyAgICAgIC0+UmVuZGVyVWludDMyKCJ1aW50MzJWYWx1ZSIsIDApCisgICAgICAtPlJlbmRlckJvb2woImJvb2xWYWx1ZSIsIGZhbHNlKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInN0cmluZ1ZhbHVlIiwgIiIpCisgICAgICAtPlJlbmRlckJ5dGVzKCJieXRlc1ZhbHVlIiwgIiIpCisgICAgICAtPlJlbmRlclN0cmluZygiZW51bVZhbHVlIiwgIkVOVU1fRklSU1QiKQorICAgICAgLT5FbmRPYmplY3QoKTsKKworICAvLyBBY3R1YWwgdGVzdGluZworICB0ZXN0aW5nXy0+U3RhcnRPYmplY3QoIiIpLT5FbmRPYmplY3QoKTsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgY29udmVydGVyCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZXJyb3JfbGlzdGVuZXIuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZXJyb3JfbGlzdGVuZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4MzA3YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9lcnJvcl9saXN0ZW5lci5jYwpAQCAtMCwwICsxLDQyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2Vycm9yX2xpc3RlbmVyLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBjb252ZXJ0ZXIgeworCisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9lcnJvcl9saXN0ZW5lci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2Vycm9yX2xpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5YzUwMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9lcnJvcl9saXN0ZW5lci5oCkBAIC0wLDAgKzEsMTA5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9FUlJPUl9MSVNURU5FUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfRVJST1JfTElTVEVORVJfSF9fCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2xvY2F0aW9uX3RyYWNrZXIuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBjb252ZXJ0ZXIgeworCisvLyBJbnRlcmZhY2UgZm9yIGVycm9yIGxpc3RlbmVyLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEVycm9yTGlzdGVuZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+RXJyb3JMaXN0ZW5lcigpIHt9CisKKyAgLy8gUmVwb3J0cyBhbiBpbnZhbGlkIG5hbWUgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLgorICB2aXJ0dWFsIHZvaWQgSW52YWxpZE5hbWUoY29uc3QgTG9jYXRpb25UcmFja2VySW50ZXJmYWNlJiBsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBpbnZhbGlkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBtZXNzYWdlKSA9IDA7CisKKyAgLy8gUmVwb3J0cyBhbiBpbnZhbGlkIHZhbHVlIGZvciBhIGZpZWxkLgorICB2aXJ0dWFsIHZvaWQgSW52YWxpZFZhbHVlKGNvbnN0IExvY2F0aW9uVHJhY2tlckludGVyZmFjZSYgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIHR5cGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSB2YWx1ZSkgPSAwOworCisgIC8vIFJlcG9ydHMgYSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkLgorICB2aXJ0dWFsIHZvaWQgTWlzc2luZ0ZpZWxkKGNvbnN0IExvY2F0aW9uVHJhY2tlckludGVyZmFjZSYgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG1pc3NpbmdfbmFtZSkgPSAwOworCisgcHJvdGVjdGVkOgorICBFcnJvckxpc3RlbmVyKCkge30KKworIHByaXZhdGU6CisgIC8vIERvIG5vdCBhZGQgYW55IGRhdGEgbWVtYmVycyB0byB0aGlzIGNsYXNzLgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRXJyb3JMaXN0ZW5lcik7Cit9OworCisvLyBBbiBlcnJvciBsaXN0ZW5lciB0aGF0IGlnbm9yZXMgYWxsIGVycm9ycy4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBOb29wRXJyb3JMaXN0ZW5lciA6IHB1YmxpYyBFcnJvckxpc3RlbmVyIHsKKyBwdWJsaWM6CisgIE5vb3BFcnJvckxpc3RlbmVyKCkge30KKyAgfk5vb3BFcnJvckxpc3RlbmVyKCkgb3ZlcnJpZGUge30KKworICB2b2lkIEludmFsaWROYW1lKGNvbnN0IExvY2F0aW9uVHJhY2tlckludGVyZmFjZSYgLypsb2MqLywKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSAvKiBpbnZhbGlkX25hbWUgKi8sCisgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgLyogbWVzc2FnZSAqLykgb3ZlcnJpZGUge30KKworICB2b2lkIEludmFsaWRWYWx1ZShjb25zdCBMb2NhdGlvblRyYWNrZXJJbnRlcmZhY2UmIC8qbG9jKi8sCisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIC8qIHR5cGVfbmFtZSAqLywKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgLyogdmFsdWUgKi8pIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBNaXNzaW5nRmllbGQoY29uc3QgTG9jYXRpb25UcmFja2VySW50ZXJmYWNlJiAvKiBsb2MgKi8sCisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIC8qIG1pc3NpbmdfbmFtZSAqLykgb3ZlcnJpZGUge30KKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOb29wRXJyb3JMaXN0ZW5lcik7Cit9OworCisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9FUlJPUl9MSVNURU5FUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9leHBlY3Rpbmdfb2JqZWN0d3JpdGVyLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZXhwZWN0aW5nX29iamVjdHdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZmUyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZXhwZWN0aW5nX29iamVjdHdyaXRlci5oCkBAIC0wLDAgKzEsMjUwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9FWFBFQ1RJTkdfT0JKRUNUV1JJVEVSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9FWFBFQ1RJTkdfT0JKRUNUV1JJVEVSX0hfXworCisvLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiBPYmplY3RXcml0ZXIgdGhhdCBhdXRvbWF0aWNhbGx5IHNldHMgdGhlCisvLyBnbW9jayBleHBlY3RhdGlvbnMgZm9yIHRoZSByZXNwb25zZSB0byBhIG1ldGhvZC4gRXZlcnkgbWV0aG9kCisvLyByZXR1cm5zIHRoZSBvYmplY3QgaXRzZWxmIGZvciBjaGFpbmluZy4KKy8vCisvLyBVc2FnZToKKy8vICAgLy8gU2V0dXAKKy8vICAgTW9ja09iamVjdFdyaXRlciBtb2NrOworLy8gICBFeHBlY3RpbmdPYmplY3RXcml0ZXIgb3coJm1vY2spOworLy8KKy8vICAgLy8gU2V0IGV4cGVjdGF0aW9uCisvLyAgIG93LlN0YXJ0T2JqZWN0KCIiKQorLy8gICAgICAgLT5SZW5kZXJTdHJpbmcoImtleSIsICJ2YWx1ZSIpCisvLyAgICAgLT5FbmRPYmplY3QoKTsKKy8vCisvLyAgIC8vIEFjdHVhbCB0ZXN0aW5nCisvLyAgIG1vY2suU3RhcnRPYmplY3QoU3RyaW5nUGllY2UoKSkKKy8vICAgICAgICAgLT5SZW5kZXJTdHJpbmcoImtleSIsICJ2YWx1ZSIpCisvLyAgICAgICAtPkVuZE9iamVjdCgpOworCisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3dyaXRlci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgY29udmVydGVyIHsKKwordXNpbmcgdGVzdGluZzo6RXE7Cit1c2luZyB0ZXN0aW5nOjpJc0VtcHR5OwordXNpbmcgdGVzdGluZzo6TmFuU2Vuc2l0aXZlRG91YmxlRXE7Cit1c2luZyB0ZXN0aW5nOjpOYW5TZW5zaXRpdmVGbG9hdEVxOwordXNpbmcgdGVzdGluZzo6UmV0dXJuOwordXNpbmcgdGVzdGluZzo6U3RyRXE7Cit1c2luZyB0ZXN0aW5nOjpUeXBlZEVxOworCitjbGFzcyBNb2NrT2JqZWN0V3JpdGVyIDogcHVibGljIE9iamVjdFdyaXRlciB7CisgcHVibGljOgorICBNb2NrT2JqZWN0V3JpdGVyKCkge30KKworICBNT0NLX01FVEhPRChPYmplY3RXcml0ZXIqLCBTdGFydE9iamVjdCwgKFN0cmluZ1BpZWNlKSwgKG92ZXJyaWRlKSk7CisgIE1PQ0tfTUVUSE9EKE9iamVjdFdyaXRlciosIEVuZE9iamVjdCwgKCksIChvdmVycmlkZSkpOworICBNT0NLX01FVEhPRChPYmplY3RXcml0ZXIqLCBTdGFydExpc3QsIChTdHJpbmdQaWVjZSksIChvdmVycmlkZSkpOworICBNT0NLX01FVEhPRChPYmplY3RXcml0ZXIqLCBFbmRMaXN0LCAoKSwgKG92ZXJyaWRlKSk7CisgIE1PQ0tfTUVUSE9EKE9iamVjdFdyaXRlciosIFJlbmRlckJvb2wsIChTdHJpbmdQaWVjZSwgYm9vbCksIChvdmVycmlkZSkpOworICBNT0NLX01FVEhPRChPYmplY3RXcml0ZXIqLCBSZW5kZXJJbnQzMiwgKFN0cmluZ1BpZWNlLCBpbnQzMl90KSwKKyAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7CisgIE1PQ0tfTUVUSE9EKE9iamVjdFdyaXRlciosIFJlbmRlclVpbnQzMiwgKFN0cmluZ1BpZWNlLCB1aW50MzJfdCksCisgICAgICAgICAgICAgIChvdmVycmlkZSkpOworICBNT0NLX01FVEhPRChPYmplY3RXcml0ZXIqLCBSZW5kZXJJbnQ2NCwgKFN0cmluZ1BpZWNlLCBpbnQ2NF90KSwKKyAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7CisgIE1PQ0tfTUVUSE9EKE9iamVjdFdyaXRlciosIFJlbmRlclVpbnQ2NCwgKFN0cmluZ1BpZWNlLCB1aW50NjRfdCksCisgICAgICAgICAgICAgIChvdmVycmlkZSkpOworICBNT0NLX01FVEhPRChPYmplY3RXcml0ZXIqLCBSZW5kZXJEb3VibGUsIChTdHJpbmdQaWVjZSwgZG91YmxlKSwKKyAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7CisgIE1PQ0tfTUVUSE9EKE9iamVjdFdyaXRlciosIFJlbmRlckZsb2F0LCAoU3RyaW5nUGllY2UsIGZsb2F0KSwKKyAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7CisgIE1PQ0tfTUVUSE9EKE9iamVjdFdyaXRlciosIFJlbmRlclN0cmluZywKKyAgICAgICAgICAgICAgKFN0cmluZ1BpZWNlLCBTdHJpbmdQaWVjZSksIChvdmVycmlkZSkpOworICBNT0NLX01FVEhPRChPYmplY3RXcml0ZXIqLCBSZW5kZXJCeXRlcywgKFN0cmluZ1BpZWNlLCBTdHJpbmdQaWVjZSksCisgICAgICAgICAgICAgIChvdmVycmlkZSkpOworICBNT0NLX01FVEhPRChPYmplY3RXcml0ZXIqLCBSZW5kZXJOdWxsLCAoU3RyaW5nUGllY2UpLCAob3ZlcnJpZGUpKTsKK307CisKK2NsYXNzIEV4cGVjdGluZ09iamVjdFdyaXRlciA6IHB1YmxpYyBPYmplY3RXcml0ZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRXhwZWN0aW5nT2JqZWN0V3JpdGVyKE1vY2tPYmplY3RXcml0ZXIqIG1vY2spIDogbW9ja18obW9jaykge30KKworICBPYmplY3RXcml0ZXIqIFN0YXJ0T2JqZWN0KFN0cmluZ1BpZWNlIG5hbWUpIG92ZXJyaWRlIHsKKyAgICAobmFtZS5lbXB0eSgpID8gRVhQRUNUX0NBTEwoKm1vY2tfLCBTdGFydE9iamVjdChJc0VtcHR5KCkpKQorICAgICAgICAgICAgICAgICAgOiBFWFBFQ1RfQ0FMTCgqbW9ja18sIFN0YXJ0T2JqZWN0KEVxKHN0ZDo6c3RyaW5nKG5hbWUpKSkpKQorICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKG1vY2tfKSkKKyAgICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIE9iamVjdFdyaXRlciogRW5kT2JqZWN0KCkgb3ZlcnJpZGUgeworICAgIEVYUEVDVF9DQUxMKCptb2NrXywgRW5kT2JqZWN0KCkpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4obW9ja18pKQorICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgT2JqZWN0V3JpdGVyKiBTdGFydExpc3QoU3RyaW5nUGllY2UgbmFtZSkgb3ZlcnJpZGUgeworICAgIChuYW1lLmVtcHR5KCkgPyBFWFBFQ1RfQ0FMTCgqbW9ja18sIFN0YXJ0TGlzdChJc0VtcHR5KCkpKQorICAgICAgICAgICAgICAgICAgOiBFWFBFQ1RfQ0FMTCgqbW9ja18sIFN0YXJ0TGlzdChFcShzdGQ6OnN0cmluZyhuYW1lKSkpKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybihtb2NrXykpCisgICAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBPYmplY3RXcml0ZXIqIEVuZExpc3QoKSBvdmVycmlkZSB7CisgICAgRVhQRUNUX0NBTEwoKm1vY2tfLCBFbmRMaXN0KCkpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4obW9ja18pKQorICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgT2JqZWN0V3JpdGVyKiBSZW5kZXJCb29sKFN0cmluZ1BpZWNlIG5hbWUsIGJvb2wgdmFsdWUpIG92ZXJyaWRlIHsKKyAgICAobmFtZS5lbXB0eSgpCisgICAgICAgICA/IEVYUEVDVF9DQUxMKCptb2NrXywgUmVuZGVyQm9vbChJc0VtcHR5KCksIFR5cGVkRXE8Ym9vbD4odmFsdWUpKSkKKyAgICAgICAgIDogRVhQRUNUX0NBTEwoKm1vY2tfLAorICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJCb29sKEVxKHN0ZDo6c3RyaW5nKG5hbWUpKSwgVHlwZWRFcTxib29sPih2YWx1ZSkpKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybihtb2NrXykpCisgICAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBPYmplY3RXcml0ZXIqIFJlbmRlckludDMyKFN0cmluZ1BpZWNlIG5hbWUsIGludDMyX3QgdmFsdWUpIG92ZXJyaWRlIHsKKyAgICAobmFtZS5lbXB0eSgpCisgICAgICAgICA/IEVYUEVDVF9DQUxMKCptb2NrXywgUmVuZGVySW50MzIoSXNFbXB0eSgpLCBUeXBlZEVxPGludDMyX3Q+KHZhbHVlKSkpCisgICAgICAgICA6IEVYUEVDVF9DQUxMKCptb2NrXywgUmVuZGVySW50MzIoRXEoc3RkOjpzdHJpbmcobmFtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkRXE8aW50MzJfdD4odmFsdWUpKSkpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4obW9ja18pKQorICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgT2JqZWN0V3JpdGVyKiBSZW5kZXJVaW50MzIoU3RyaW5nUGllY2UgbmFtZSwgdWludDMyX3QgdmFsdWUpIG92ZXJyaWRlIHsKKyAgICAobmFtZS5lbXB0eSgpID8gRVhQRUNUX0NBTEwoKm1vY2tfLCBSZW5kZXJVaW50MzIoSXNFbXB0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlZEVxPHVpbnQzMl90Pih2YWx1ZSkpKQorICAgICAgICAgICAgICAgICAgOiBFWFBFQ1RfQ0FMTCgqbW9ja18sIFJlbmRlclVpbnQzMihFcShzdGQ6OnN0cmluZyhuYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkRXE8dWludDMyX3Q+KHZhbHVlKSkpKQorICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKG1vY2tfKSkKKyAgICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIE9iamVjdFdyaXRlciogUmVuZGVySW50NjQoU3RyaW5nUGllY2UgbmFtZSwgaW50NjRfdCB2YWx1ZSkgb3ZlcnJpZGUgeworICAgIChuYW1lLmVtcHR5KCkKKyAgICAgICAgID8gRVhQRUNUX0NBTEwoKm1vY2tfLCBSZW5kZXJJbnQ2NChJc0VtcHR5KCksIFR5cGVkRXE8aW50NjRfdD4odmFsdWUpKSkKKyAgICAgICAgIDogRVhQRUNUX0NBTEwoKm1vY2tfLCBSZW5kZXJJbnQ2NChFcShzdGQ6OnN0cmluZyhuYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRFcTxpbnQ2NF90Pih2YWx1ZSkpKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybihtb2NrXykpCisgICAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBPYmplY3RXcml0ZXIqIFJlbmRlclVpbnQ2NChTdHJpbmdQaWVjZSBuYW1lLCB1aW50NjRfdCB2YWx1ZSkgb3ZlcnJpZGUgeworICAgIChuYW1lLmVtcHR5KCkgPyBFWFBFQ1RfQ0FMTCgqbW9ja18sIFJlbmRlclVpbnQ2NChJc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkRXE8dWludDY0X3Q+KHZhbHVlKSkpCisgICAgICAgICAgICAgICAgICA6IEVYUEVDVF9DQUxMKCptb2NrXywgUmVuZGVyVWludDY0KEVxKHN0ZDo6c3RyaW5nKG5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRFcTx1aW50NjRfdD4odmFsdWUpKSkpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4obW9ja18pKQorICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgT2JqZWN0V3JpdGVyKiBSZW5kZXJEb3VibGUoU3RyaW5nUGllY2UgbmFtZSwgZG91YmxlIHZhbHVlKSBvdmVycmlkZSB7CisgICAgKG5hbWUuZW1wdHkoKQorICAgICAgICAgPyBFWFBFQ1RfQ0FMTCgqbW9ja18sCisgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlckRvdWJsZShJc0VtcHR5KCksIE5hblNlbnNpdGl2ZURvdWJsZUVxKHZhbHVlKSkpCisgICAgICAgICA6IEVYUEVDVF9DQUxMKCptb2NrXywgUmVuZGVyRG91YmxlKEVxKHN0ZDo6c3RyaW5nKG5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFuU2Vuc2l0aXZlRG91YmxlRXEodmFsdWUpKSkpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4obW9ja18pKQorICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgT2JqZWN0V3JpdGVyKiBSZW5kZXJGbG9hdChTdHJpbmdQaWVjZSBuYW1lLCBmbG9hdCB2YWx1ZSkgb3ZlcnJpZGUgeworICAgIChuYW1lLmVtcHR5KCkKKyAgICAgICAgID8gRVhQRUNUX0NBTEwoKm1vY2tfLAorICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJGbG9hdChJc0VtcHR5KCksIE5hblNlbnNpdGl2ZUZsb2F0RXEodmFsdWUpKSkKKyAgICAgICAgIDogRVhQRUNUX0NBTEwoKm1vY2tfLCBSZW5kZXJGbG9hdChFcShzdGQ6OnN0cmluZyhuYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFuU2Vuc2l0aXZlRmxvYXRFcSh2YWx1ZSkpKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybihtb2NrXykpCisgICAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBPYmplY3RXcml0ZXIqIFJlbmRlclN0cmluZyhTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSB2YWx1ZSkgb3ZlcnJpZGUgeworICAgIChuYW1lLmVtcHR5KCkgPyBFWFBFQ1RfQ0FMTCgqbW9ja18sIFJlbmRlclN0cmluZyhJc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkRXE8U3RyaW5nUGllY2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcodmFsdWUpKSkpCisgICAgICAgICAgICAgICAgICA6IEVYUEVDVF9DQUxMKCptb2NrXywgUmVuZGVyU3RyaW5nKEVxKHN0ZDo6c3RyaW5nKG5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRFcTxTdHJpbmdQaWVjZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyh2YWx1ZSkpKSkpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4obW9ja18pKQorICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworICAgIHJldHVybiB0aGlzOworICB9CisgIHZpcnR1YWwgT2JqZWN0V3JpdGVyKiBSZW5kZXJCeXRlcyhTdHJpbmdQaWVjZSBuYW1lLCBTdHJpbmdQaWVjZSB2YWx1ZSkgeworICAgIChuYW1lLmVtcHR5KCkKKyAgICAgICAgID8gRVhQRUNUX0NBTEwoKm1vY2tfLCBSZW5kZXJCeXRlcyhJc0VtcHR5KCksIFR5cGVkRXE8U3RyaW5nUGllY2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLlRvU3RyaW5nKCkpKSkKKyAgICAgICAgIDogRVhQRUNUX0NBTEwoKm1vY2tfLAorICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJCeXRlcyhFcShzdGQ6OnN0cmluZyhuYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkRXE8U3RyaW5nUGllY2U+KHZhbHVlLlRvU3RyaW5nKCkpKSkpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4obW9ja18pKQorICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgT2JqZWN0V3JpdGVyKiBSZW5kZXJOdWxsKFN0cmluZ1BpZWNlIG5hbWUpIG92ZXJyaWRlIHsKKyAgICAobmFtZS5lbXB0eSgpID8gRVhQRUNUX0NBTEwoKm1vY2tfLCBSZW5kZXJOdWxsKElzRW1wdHkoKSkpCisgICAgICAgICAgICAgICAgICA6IEVYUEVDVF9DQUxMKCptb2NrXywgUmVuZGVyTnVsbChFcShzdGQ6OnN0cmluZyhuYW1lKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgLldpbGxPbmNlKFJldHVybihtb2NrXykpCisgICAgICAgICAgICAgICAgICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgTW9ja09iamVjdFdyaXRlciogbW9ja187CisKKyAgR09PR0xFX0RJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhFeHBlY3RpbmdPYmplY3RXcml0ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnRlcgorfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX0VYUEVDVElOR19PQkpFQ1RXUklURVJfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZmllbGRfbWFza191dGlsaXR5LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2ZpZWxkX21hc2tfdXRpbGl0eS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFiZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2ZpZWxkX21hc2tfdXRpbGl0eS5jYwpAQCAtMCwwICsxLDIxOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9maWVsZF9tYXNrX3V0aWxpdHkuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3V0aWxpdHkuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzX21hY3Jvcy5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKK25hbWVzcGFjZSB7CisKKy8vIEFwcGVuZHMgYSBGaWVsZE1hc2sgcGF0aCBzZWdtZW50IHRvIGEgcHJlZml4Lgorc3RkOjpzdHJpbmcgQXBwZW5kUGF0aFNlZ21lbnRUb1ByZWZpeChTdHJpbmdQaWVjZSBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIHNlZ21lbnQpIHsKKyAgaWYgKHByZWZpeC5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHNlZ21lbnQpOworICB9CisgIGlmIChzZWdtZW50LmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcocHJlZml4KTsKKyAgfQorICAvLyBJZiB0aGUgc2VnbWVudCBpcyBhIG1hcCBrZXksIGFwcGVuZHMgaXQgdG8gdGhlIHByZWZpeCB3aXRob3V0IHRoZSAiLiIuCisgIGlmIChIYXNQcmVmaXhTdHJpbmcoc2VnbWVudCwgIltcIiIpKSB7CisgICAgcmV0dXJuIFN0ckNhdChwcmVmaXgsIHNlZ21lbnQpOworICB9CisgIHJldHVybiBTdHJDYXQocHJlZml4LCAiLiIsIHNlZ21lbnQpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworc3RkOjpzdHJpbmcgQ29udmVydEZpZWxkTWFza1BhdGgoY29uc3QgU3RyaW5nUGllY2UgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRlckNhbGxiYWNrIGNvbnZlcnRlcikgeworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5yZXNlcnZlKHBhdGguc2l6ZSgpIDw8IDEpOworCisgIGJvb2wgaXNfcXVvdGVkID0gZmFsc2U7CisgIGJvb2wgaXNfZXNjYXBpbmcgPSBmYWxzZTsKKyAgaW50IGN1cnJlbnRfc2VnbWVudF9zdGFydCA9IDA7CisKKyAgLy8gTG9vcHMgdW50aWwgMSBwYXNzZWQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgdG8gbWFrZSBoYW5kbGluZyB0aGUgbGFzdAorICAvLyBzZWdtZW50IGVhc2llci4KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gcGF0aC5zaXplKCk7ICsraSkgeworICAgIC8vIE91dHB1dHMgcXVvdGVkIHN0cmluZyBhcy1pcy4KKyAgICBpZiAoaXNfcXVvdGVkKSB7CisgICAgICBpZiAoaSA9PSBwYXRoLnNpemUoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5wdXNoX2JhY2socGF0aFtpXSk7CisgICAgICBpZiAoaXNfZXNjYXBpbmcpIHsKKyAgICAgICAgaXNfZXNjYXBpbmcgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAocGF0aFtpXSA9PSAnXFwnKSB7CisgICAgICAgIGlzX2VzY2FwaW5nID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAocGF0aFtpXSA9PSAnXCInKSB7CisgICAgICAgIGN1cnJlbnRfc2VnbWVudF9zdGFydCA9IGkgKyAxOworICAgICAgICBpc19xdW90ZWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoaSA9PSBwYXRoLnNpemUoKSB8fCBwYXRoW2ldID09ICcuJyB8fCBwYXRoW2ldID09ICcoJyB8fAorICAgICAgICBwYXRoW2ldID09ICcpJyB8fCBwYXRoW2ldID09ICdcIicpIHsKKyAgICAgIHJlc3VsdCArPSBjb252ZXJ0ZXIoCisgICAgICAgICAgcGF0aC5zdWJzdHIoY3VycmVudF9zZWdtZW50X3N0YXJ0LCBpIC0gY3VycmVudF9zZWdtZW50X3N0YXJ0KSk7CisgICAgICBpZiAoaSA8IHBhdGguc2l6ZSgpKSB7CisgICAgICAgIHJlc3VsdC5wdXNoX2JhY2socGF0aFtpXSk7CisgICAgICB9CisgICAgICBjdXJyZW50X3NlZ21lbnRfc3RhcnQgPSBpICsgMTsKKyAgICB9CisgICAgaWYgKGkgPCBwYXRoLnNpemUoKSAmJiBwYXRoW2ldID09ICdcIicpIHsKKyAgICAgIGlzX3F1b3RlZCA9IHRydWU7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3V0aWw6OlN0YXR1cyBEZWNvZGVDb21wYWN0RmllbGRNYXNrUGF0aHMoU3RyaW5nUGllY2UgcGF0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhTaW5rQ2FsbGJhY2sgcGF0aF9zaW5rKSB7CisgIHN0ZDo6c3RhY2s8c3RkOjpzdHJpbmc+IHByZWZpeDsKKyAgaW50IGxlbmd0aCA9IHBhdGhzLmxlbmd0aCgpOworICBpbnQgcHJldmlvdXNfcG9zaXRpb24gPSAwOworICBib29sIGluX21hcF9rZXkgPSBmYWxzZTsKKyAgYm9vbCBpc19lc2NhcGluZyA9IGZhbHNlOworICAvLyBMb29wcyB1bnRpbCAxIHBhc3NlZCB0aGUgZW5kIG9mIHRoZSBpbnB1dCB0byBtYWtlIHRoZSBoYW5kbGUgb2YgdGhlIGxhc3QKKyAgLy8gc2VnbWVudCBlYXNpZXIuCisgIGZvciAoaW50IGkgPSAwOyBpIDw9IGxlbmd0aDsgKytpKSB7CisgICAgaWYgKGkgIT0gbGVuZ3RoKSB7CisgICAgICAvLyBTa2lwcyBldmVyeXRoaW5nIGluIGEgbWFwIGtleSB1bnRpbCB3ZSBoaXQgdGhlIGVuZCBvZiBpdCwgd2hpY2ggaXMKKyAgICAgIC8vIG1hcmtlZCBieSBhbiB1bi1lc2NhcGVkICciJyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhICddJy4KKyAgICAgIGlmIChpbl9tYXBfa2V5KSB7CisgICAgICAgIGlmIChpc19lc2NhcGluZykgeworICAgICAgICAgIGlzX2VzY2FwaW5nID0gZmFsc2U7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhdGhzW2ldID09ICdcXCcpIHsKKyAgICAgICAgICBpc19lc2NhcGluZyA9IHRydWU7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhdGhzW2ldICE9ICdcIicpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBVbi1lc2NhcGVkICciJyBtdXN0IGJlIGZvbGxvd2VkIHdpdGggYSAnXScuCisgICAgICAgIGlmIChpID49IGxlbmd0aCAtIDEgfHwgcGF0aHNbaSArIDFdICE9ICddJykgeworICAgICAgICAgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcihTdHJDYXQoCisgICAgICAgICAgICAgICJJbnZhbGlkIEZpZWxkTWFzayAnIiwgcGF0aHMsCisgICAgICAgICAgICAgICInLiBNYXAga2V5cyBzaG91bGQgYmUgcmVwcmVzZW50ZWQgYXMgW1wic29tZV9rZXlcIl0uIikpOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBlbmQgb2YgdGhlIG1hcCBrZXkgKCJcIl0iKSBoYXMgYmVlbiBmb3VuZC4KKyAgICAgICAgaW5fbWFwX2tleSA9IGZhbHNlOworICAgICAgICAvLyBTa2lwcyAnXScuCisgICAgICAgIGkrKzsKKyAgICAgICAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGtleSBlbmRzIGF0IHRoZSBlbmQgb2YgYSBwYXRoIHNlZ21lbnQuCisgICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSAmJiBwYXRoc1tpICsgMV0gIT0gJy4nICYmIHBhdGhzW2kgKyAxXSAhPSAnLCcgJiYKKyAgICAgICAgICAgIHBhdGhzW2kgKyAxXSAhPSAnKScgJiYgcGF0aHNbaSArIDFdICE9ICcoJykgeworICAgICAgICAgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcihTdHJDYXQoCisgICAgICAgICAgICAgICJJbnZhbGlkIEZpZWxkTWFzayAnIiwgcGF0aHMsCisgICAgICAgICAgICAgICInLiBNYXAga2V5cyBzaG91bGQgYmUgYXQgdGhlIGVuZCBvZiBhIHBhdGggc2VnbWVudC4iKSk7CisgICAgICAgIH0KKyAgICAgICAgaXNfZXNjYXBpbmcgPSBmYWxzZTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIFdlIGFyZSBub3QgaW4gYSBtYXAga2V5LCBsb29rIGZvciB0aGUgc3RhcnQgb2Ygb25lLgorICAgICAgaWYgKHBhdGhzW2ldID09ICdbJykgeworICAgICAgICBpZiAoaSA+PSBsZW5ndGggLSAxIHx8IHBhdGhzW2kgKyAxXSAhPSAnXCInKSB7CisgICAgICAgICAgcmV0dXJuIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKFN0ckNhdCgKKyAgICAgICAgICAgICAgIkludmFsaWQgRmllbGRNYXNrICciLCBwYXRocywKKyAgICAgICAgICAgICAgIicuIE1hcCBrZXlzIHNob3VsZCBiZSByZXByZXNlbnRlZCBhcyBbXCJzb21lX2tleVwiXS4iKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gIltcIiIgc3RhcnRzIGEgbWFwIGtleS4KKyAgICAgICAgaW5fbWFwX2tleSA9IHRydWU7CisgICAgICAgIGkrKzsgIC8vIFNraXBzIHRoZSAnXCInLgorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIC8vIElmIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBub3QgYSBzcGVjaWFsIGNoYXJhY3RlciAoJywnLCAnKCcgb3IgJyknKSwKKyAgICAgIC8vIGNvbnRpbnVlIHRvIHRoZSBuZXh0LgorICAgICAgaWYgKHBhdGhzW2ldICE9ICcsJyAmJiBwYXRoc1tpXSAhPSAnKScgJiYgcGF0aHNbaV0gIT0gJygnKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICAvLyBHZXRzIHRoZSBjdXJyZW50IHNlZ21lbnQgLSBzdWItc3RyaW5nIGJldHdlZW4gcHJldmlvdXMgcG9zaXRpb24gKGFmdGVyCisgICAgLy8gJygnLCAnKScsICcsJywgb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQpIGFuZCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICBTdHJpbmdQaWVjZSBzZWdtZW50ID0KKyAgICAgICAgcGF0aHMuc3Vic3RyKHByZXZpb3VzX3Bvc2l0aW9uLCBpIC0gcHJldmlvdXNfcG9zaXRpb24pOworICAgIHN0ZDo6c3RyaW5nIGN1cnJlbnRfcHJlZml4ID0gcHJlZml4LmVtcHR5KCkgPyAiIiA6IHByZWZpeC50b3AoKTsKKworICAgIGlmIChpIDwgbGVuZ3RoICYmIHBhdGhzW2ldID09ICcoJykgeworICAgICAgLy8gQnVpbGRzIGEgcHJlZml4IGFuZCBzYXZlIGl0IGludG8gdGhlIHN0YWNrLgorICAgICAgcHJlZml4LnB1c2goQXBwZW5kUGF0aFNlZ21lbnRUb1ByZWZpeChjdXJyZW50X3ByZWZpeCwgc2VnbWVudCkpOworICAgIH0gZWxzZSBpZiAoIXNlZ21lbnQuZW1wdHkoKSkgeworICAgICAgLy8gV2hlbiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgJyknLCAnLCcgb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24gaGFzCisgICAgICAvLyBwYXNzZWQgdGhlIGVuZCBvZiB0aGUgaW5wdXQsIGJ1aWxkcyBhbmQgb3V0cHV0cyBhIG5ldyBwYXRocyBieQorICAgICAgLy8gY29uY2F0ZW5hdGluZyB0aGUgbGFzdCBwcmVmaXggd2l0aCB0aGUgY3VycmVudCBzZWdtZW50LgorICAgICAgUkVUVVJOX0lGX0VSUk9SKAorICAgICAgICAgIHBhdGhfc2luayhBcHBlbmRQYXRoU2VnbWVudFRvUHJlZml4KGN1cnJlbnRfcHJlZml4LCBzZWdtZW50KSkpOworICAgIH0KKworICAgIC8vIFJlbW92ZXMgdGhlIGxhc3QgcHJlZml4IGFmdGVyIHNlZWluZyBhICcpJy4KKyAgICBpZiAoaSA8IGxlbmd0aCAmJiBwYXRoc1tpXSA9PSAnKScpIHsKKyAgICAgIGlmIChwcmVmaXguZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gdXRpbDo6SW52YWxpZEFyZ3VtZW50RXJyb3IoCisgICAgICAgICAgICBTdHJDYXQoIkludmFsaWQgRmllbGRNYXNrICciLCBwYXRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJy4gQ2Fubm90IGZpbmQgbWF0Y2hpbmcgJygnIGZvciBhbGwgJyknLiIpKTsKKyAgICAgIH0KKyAgICAgIHByZWZpeC5wb3AoKTsKKyAgICB9CisgICAgcHJldmlvdXNfcG9zaXRpb24gPSBpICsgMTsKKyAgfQorICBpZiAoaW5fbWFwX2tleSkgeworICAgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigKKyAgICAgICAgU3RyQ2F0KCJJbnZhbGlkIEZpZWxkTWFzayAnIiwgcGF0aHMsCisgICAgICAgICAgICAgICAgICAgICAiJy4gQ2Fubm90IGZpbmQgbWF0Y2hpbmcgJ10nIGZvciBhbGwgJ1snLiIpKTsKKyAgfQorICBpZiAoIXByZWZpeC5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKAorICAgICAgICBTdHJDYXQoIkludmFsaWQgRmllbGRNYXNrICciLCBwYXRocywKKyAgICAgICAgICAgICAgICAgICAgICInLiBDYW5ub3QgZmluZCBtYXRjaGluZyAnKScgZm9yIGFsbCAnKCcuIikpOworICB9CisgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnRlcgorfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2ZpZWxkX21hc2tfdXRpbGl0eS5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2ZpZWxkX21hc2tfdXRpbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ODIzMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZmllbGRfbWFza191dGlsaXR5LmgKQEAgLTAsMCArMSw3NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEZpZWxkTWFzayByZWxhdGVkIHV0aWxpdHkgbWV0aG9kcy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9GSUVMRF9NQVNLX1VUSUxJVFlfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX0ZJRUxEX01BU0tfVVRJTElUWV9IX18KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RhY2s+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgY29udmVydGVyIHsKKwordHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c3RyaW5nKFN0cmluZ1BpZWNlKT4gQ29udmVydGVyQ2FsbGJhY2s7Cit0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dXRpbDo6U3RhdHVzKFN0cmluZ1BpZWNlKT4gUGF0aFNpbmtDYWxsYmFjazsKKworLy8gQXBwbGllcyBhICdjb252ZXJ0ZXInIHRvIGVhY2ggc2VnbWVudCBvZiBhIEZpZWxkTWFzayBwYXRoIGFuZCByZXR1cm5zIHRoZQorLy8gcmVzdWx0LiBRdW90ZWQgc3RyaW5ncyBpbiB0aGUgJ3BhdGgnIGFyZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBhcy1pcyB3aXRob3V0CisvLyBjb252ZXJ0aW5nIHRoZWlyIGNvbnRlbnQuIEVzY2FwaW5nIGlzIHN1cHBvcnRlZCB3aXRoaW4gcXVvdGVkIHN0cmluZ3MuCisvLyBGb3IgZXhhbXBsZSwgImFiXCJfYyIgd2lsbCBiZSByZXR1cm5lZCBhcyAiYWJcIl9jIiB3aXRob3V0IGFueSBjaGFuZ2VzLgorc3RkOjpzdHJpbmcgQ29udmVydEZpZWxkTWFza1BhdGgoY29uc3QgU3RyaW5nUGllY2UgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRlckNhbGxiYWNrIGNvbnZlcnRlcik7CisKKy8vIERlY29kZXMgYSBjb21wYWN0IGxpc3Qgb2YgRmllbGRNYXNrcy4gRm9yIGV4YW1wbGUsICJhLmIsYS5jLmQsYS5jLmUiIHdpbGwgYmUKKy8vIGRlY29kZWQgaW50byBhIGxpc3Qgb2YgZmllbGQgcGF0aHMgLSAiYS5iIiwgImEuYy5kIiwgImEuYy5lIi4gQW5kIHRoZSByZXN1bHRzCisvLyB3aWxsIGJlIHNlbnQgdG8gJ3BhdGhfc2luaycsIGkuZS4gJ3BhdGhfc2luaycgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXIKKy8vIHJlc3VsdGluZyBwYXRoLgorLy8gTm90ZSB0aGF0IHdlIGFsc28gc3VwcG9ydCBBcGlhcnkgc3R5bGUgRmllbGRNYXNrIGZvcm0uIFRoZSBhYm92ZSBleGFtcGxlIGluCisvLyB0aGUgQXBpYXJ5IHN0eWxlIHdpbGwgbG9vayBsaWtlICJhLmIsYS5jKGQsZSkiLgordXRpbDo6U3RhdHVzIERlY29kZUNvbXBhY3RGaWVsZE1hc2tQYXRocyhTdHJpbmdQaWVjZSBwYXRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aFNpbmtDYWxsYmFjayBwYXRoX3NpbmspOworCit9ICAvLyBuYW1lc3BhY2UgY29udmVydGVyCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfRklFTERfTUFTS19VVElMSVRZX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fZXNjYXBpbmcuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9lc2NhcGluZy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGZhOGNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fZXNjYXBpbmcuY2MKQEAgLTAsMCArMSwzNzIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9lc2NhcGluZy5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgY29udmVydGVyIHsKKworbmFtZXNwYWNlIHsKKworLy8gQXJyYXkgb2YgaGV4IGNoYXJhY3RlcnMgZm9yIGNvbnZlcnNpb24gdG8gaGV4Lgorc3RhdGljIGNvbnN0IGNoYXIga0hleFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCisvLyBDaGFyYWN0ZXJzIDB4MDAgdG8gMHg5ZiBhcmUgdmVyeSBjb21tb25seSB1c2VkLCBzbyB3ZSBwcm92aWRlIGEgc3BlY2lhbAorLy8gdGFibGUgbG9va3VwLgorLy8KKy8vIEZvciB1bmljb2RlIGNvZGUgcG9pbnQgY2ggPCAweGEwOgorLy8ga0NvbW1vbkVzY2FwZXNbY2hdIGlzIHRoZSBlc2NhcGVkIHN0cmluZyBvZiBjaCwgaWYgZXNjYXBpbmcgaXMgbmVlZGVkOworLy8gICAgICAgICAgICAgICAgICAgIG9yIGFuIGVtcHR5IHN0cmluZywgaWYgZXNjYXBpbmcgaXMgbm90IG5lZWRlZC4KK3N0YXRpYyBjb25zdCBjaGFyIGtDb21tb25Fc2NhcGVzWzE2MF1bN10gPSB7CisgICAgLy8gQzAgKEFTQ0lJIGFuZCBkZXJpdmF0aXZlcykgY29udHJvbCBjaGFyYWN0ZXJzCisgICAgIlxcdTAwMDAiLCAiXFx1MDAwMSIsICJcXHUwMDAyIiwgIlxcdTAwMDMiLCAgLy8gMHgwMAorICAgICJcXHUwMDA0IiwgIlxcdTAwMDUiLCAiXFx1MDAwNiIsICJcXHUwMDA3IiwgIlxcYiIsICJcXHQiLCAiXFxuIiwgIlxcdTAwMGIiLAorICAgICJcXGYiLCAiXFxyIiwgIlxcdTAwMGUiLCAiXFx1MDAwZiIsICJcXHUwMDEwIiwgIlxcdTAwMTEiLCAiXFx1MDAxMiIsCisgICAgIlxcdTAwMTMiLCAgLy8gMHgxMAorICAgICJcXHUwMDE0IiwgIlxcdTAwMTUiLCAiXFx1MDAxNiIsICJcXHUwMDE3IiwgIlxcdTAwMTgiLCAiXFx1MDAxOSIsICJcXHUwMDFhIiwKKyAgICAiXFx1MDAxYiIsICJcXHUwMDFjIiwgIlxcdTAwMWQiLCAiXFx1MDAxZSIsICJcXHUwMDFmIiwKKyAgICAvLyBFc2NhcGluZyBvZiAiIGFuZCBcIGFyZSByZXF1aXJlZCBieSB3d3cuanNvbi5vcmcgc3RyaW5nIGRlZmluaXRpb24uCisgICAgLy8gRXNjYXBpbmcgb2YgPCBhbmQgPiBhcmUgcmVxdWlyZWQgZm9yIEhUTUwgc2VjdXJpdHkuCisgICAgIiIsICIiLCAiXFxcIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDIwCisgICAgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICAvLyAweDMwCisgICAgIiIsICIiLCAiIiwgIiIsICJcXHUwMDNjIiwgIiIsICJcXHUwMDNlIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLAorICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4NDAKKyAgICAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgICAgICAvLyAweDUwCisgICAgIiIsICIiLCAiIiwgIiIsICJcXFxcIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAgLy8gMHg2MAorICAgICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAgICAgIC8vIDB4NzAKKyAgICAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIlxcdTAwN2YiLAorICAgIC8vIEMxIChJU08gODg1OSBhbmQgVW5pY29kZSkgZXh0ZW5kZWQgY29udHJvbCBjaGFyYWN0ZXJzCisgICAgIlxcdTAwODAiLCAiXFx1MDA4MSIsICJcXHUwMDgyIiwgIlxcdTAwODMiLCAgLy8gMHg4MAorICAgICJcXHUwMDg0IiwgIlxcdTAwODUiLCAiXFx1MDA4NiIsICJcXHUwMDg3IiwgIlxcdTAwODgiLCAiXFx1MDA4OSIsICJcXHUwMDhhIiwKKyAgICAiXFx1MDA4YiIsICJcXHUwMDhjIiwgIlxcdTAwOGQiLCAiXFx1MDA4ZSIsICJcXHUwMDhmIiwgIlxcdTAwOTAiLCAiXFx1MDA5MSIsCisgICAgIlxcdTAwOTIiLCAiXFx1MDA5MyIsICAvLyAweDkwCisgICAgIlxcdTAwOTQiLCAiXFx1MDA5NSIsICJcXHUwMDk2IiwgIlxcdTAwOTciLCAiXFx1MDA5OCIsICJcXHUwMDk5IiwgIlxcdTAwOWEiLAorICAgICJcXHUwMDliIiwgIlxcdTAwOWMiLCAiXFx1MDA5ZCIsICJcXHUwMDllIiwgIlxcdTAwOWYifTsKKworLy8gRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gY2hhciB2YWx1ZSBpcyBhIHVuaWNvZGUgc3Vycm9nYXRlIGNvZGUgdW5pdCAoZWl0aGVyCisvLyBoaWdoLXN1cnJvZ2F0ZSBvciBsb3ctc3Vycm9nYXRlKS4KK2lubGluZSBib29sIElzU3Vycm9nYXRlKHVpbnQzMl90IGMpIHsKKyAgLy8gT3B0aW1pemVkIGZvcm0gb2Y6CisgIC8vIHJldHVybiBjID49IGtNaW5IaWdoU3Vycm9nYXRlICYmIGMgPD0ga01heExvd1N1cnJvZ2F0ZTsKKyAgLy8gKFJlZHVjZWQgZnJvbSAzIEFMVSBpbnN0cnVjdGlvbnMgdG8gMiBBTFUgaW5zdHJ1Y3Rpb25zKQorICByZXR1cm4gKGMgJiAweGZmZmZmODAwKSA9PSBKc29uRXNjYXBpbmc6OmtNaW5IaWdoU3Vycm9nYXRlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHVuaWNvZGUgY29kZSBwb2ludCBjcCBpcyBhIHZhbGlkCisvLyB1bmljb2RlIGNvZGUgcG9pbnQgKGkuZS4gaW4gdGhlIHJhbmdlIDAgPD0gY3AgPD0ga01heENvZGVQb2ludCkuCitpbmxpbmUgYm9vbCBJc1ZhbGlkQ29kZVBvaW50KHVpbnQzMl90IGNwKSB7CisgIHJldHVybiBjcCA8PSBKc29uRXNjYXBpbmc6OmtNYXhDb2RlUG9pbnQ7Cit9CisKKy8vIFJldHVybnMgdGhlIGxvdyBzdXJyb2dhdGUgZm9yIHRoZSBnaXZlbiB1bmljb2RlIGNvZGUgcG9pbnQuIFRoZSByZXN1bHQgaXMKKy8vIG1lYW5pbmdsZXNzIGlmIHRoZSBnaXZlbiBjb2RlIHBvaW50IGlzIG5vdCBhIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVyLgoraW5saW5lIHVpbnQxNl90IFRvTG93U3Vycm9nYXRlKHVpbnQzMl90IGNwKSB7CisgIHJldHVybiAoY3AgJgorICAgICAgICAgIChKc29uRXNjYXBpbmc6OmtNYXhMb3dTdXJyb2dhdGUgLSBKc29uRXNjYXBpbmc6OmtNaW5Mb3dTdXJyb2dhdGUpKSArCisgICAgICAgICBKc29uRXNjYXBpbmc6OmtNaW5Mb3dTdXJyb2dhdGU7Cit9CisKKy8vIFJldHVybnMgdGhlIGhpZ2ggc3Vycm9nYXRlIGZvciB0aGUgZ2l2ZW4gdW5pY29kZSBjb2RlIHBvaW50LiBUaGUgcmVzdWx0IGlzCisvLyBtZWFuaW5nbGVzcyBpZiB0aGUgZ2l2ZW4gY29kZSBwb2ludCBpcyBub3QgYSBzdXBwbGVtZW50YXJ5IGNoYXJhY3Rlci4KK2lubGluZSB1aW50MTZfdCBUb0hpZ2hTdXJyb2dhdGUodWludDMyX3QgY3ApIHsKKyAgcmV0dXJuIChjcCA+PiAxMCkgKyAoSnNvbkVzY2FwaW5nOjprTWluSGlnaFN1cnJvZ2F0ZSAtCisgICAgICAgICAgICAgICAgICAgICAgIChKc29uRXNjYXBpbmc6OmtNaW5TdXBwbGVtZW50YXJ5Q29kZVBvaW50ID4+IDEwKSk7Cit9CisKKy8vIElucHV0IHN0ciBpcyBlbmNvZGVkIGluIFVURi04LiBBIHVuaWNvZGUgY29kZSBwb2ludCBjb3VsZCBiZSBlbmNvZGVkIGluCisvLyBVVEYtOCB1c2luZyBhbnl3aGVyZSBmcm9tIDEgdG8gNCBjaGFyYWN0ZXJzLCBhbmQgaXQgY291bGQgc3BhbiBtdWx0aXBsZQorLy8gcmVhZHMgb2YgdGhlIEJ5dGVTb3VyY2UuCisvLworLy8gVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbmV4dCB1bmljb2RlIGNvZGUgcG9pbnQgZnJvbSB0aGUgaW5wdXQgKHN0cikgYXQKKy8vIHRoZSBnaXZlbiBwb3NpdGlvbiAoaW5kZXgpLCB0YWtpbmcgaW50byBhY2NvdW50IGFueSBsZWZ0LW92ZXIgcGFydGlhbAorLy8gY29kZSBwb2ludCBmcm9tIHRoZSBwcmV2aW91cyBpdGVyYXRpb24gKGNwKSwgdG9nZXRoZXIgd2l0aCB0aGUgbnVtYmVyCisvLyBvZiBjaGFyYWN0ZXJzIGxlZnQgdG8gcmVhZCB0byBjb21wbGV0ZSB0aGlzIGNvZGUgcG9pbnQgKG51bV9sZWZ0KS4KKy8vCisvLyBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgaW5wdXQgKHN0cikgaXMgdmFsaWQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uCisvLyAoaW5kZXgpLiBJbiBvcmRlciB3b3JkcywgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBjb3VsZCBiZSByZWFkIHN1Y2Nlc3NmdWxseS4KKy8vCisvLyBUaGUgY29kZSBwb2ludCByZWFkIChwYXJ0aWFsIG9yIGNvbXBsZXRlKSBpcyBzdG9yZWQgaW4gKGNwKS4gVXBvbiByZXR1cm4sCisvLyAobnVtX2xlZnQpIHN0b3JlcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBoYXMgeWV0IHRvIGJlIHJlYWQgaW4KKy8vIG9yZGVyIHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50IHVuaWNvZGUgY29kZSBwb2ludC4gSWYgdGhlIHJlYWQgaXMgY29tcGxldGUsCisvLyB0aGVuIChudW1fbGVmdCkgaXMgMC4gQWxzbywgKG51bV9yZWFkKSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZC4KKy8vCisvLyBSZXR1cm5zIGZhbHNlIGlmIHdlIGVuY291bnRlciBhbiBpbnZhbGlkIFVURi04IHN0cmluZy4gUmV0dXJucyB0cnVlCisvLyBvdGhlcndpc2UsIGluY2x1ZGluZyB0aGUgY2FzZSB3aGVuIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGlucHV0IChzdHIpCisvLyBiZWZvcmUgYSBjb21wbGV0ZSB1bmljb2RlIGNvZGUgcG9pbnQgaXMgcmVhZC4KK2Jvb2wgUmVhZENvZGVQb2ludChTdHJpbmdQaWVjZSBzdHIsIGludCBpbmRleCwgdWludDMyX3QqIGNwLAorICAgICAgICAgICAgICAgICAgIGludCogbnVtX2xlZnQsIGludCogbnVtX3JlYWQpIHsKKyAgaWYgKCpudW1fbGVmdCA9PSAwKSB7CisgICAgLy8gTGFzdCByZWFkIHdhcyBjb21wbGV0ZS4gU3RhcnQgcmVhZGluZyBhIG5ldyB1bmljb2RlIGNvZGUgcG9pbnQuCisgICAgKmNwID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oc3RyW2luZGV4KytdKTsKKyAgICAqbnVtX3JlYWQgPSAxOworICAgIC8vIFRoZSBsZW5ndGggb2YgdGhlIGNvZGUgcG9pbnQgaXMgZGV0ZXJtaW5lZCBmcm9tIHJlYWRpbmcgdGhlIGZpcnN0IGJ5dGUuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgZmlyc3QgYnl0ZSBpcyBiZXR3ZWVuOgorICAgIC8vICAgIDAuLjB4N2Y6IHRoYXQncyB0aGUgdmFsdWUgb2YgdGhlIGNvZGUgcG9pbnQuCisgICAgLy8gMHg4MC4uMHhiZjogPGludmFsaWQ+CisgICAgLy8gMHhjMC4uMHhkZjogMTEtYml0IGNvZGUgcG9pbnQgZW5jb2RlZCBpbiAyIGJ5dGVzLgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMTAtNiwgYml0IDUtMAorICAgIC8vIDB4ZTAuLjB4ZWY6IDE2LWJpdCBjb2RlIHBvaW50IGVuY29kZWQgaW4gMyBieXRlcy4KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGJpdCAxNS0xMiwgYml0IDExLTYsIGJpdCA1LTAKKyAgICAvLyAweGYwLi4weGY3OiAyMS1iaXQgY29kZSBwb2ludCBlbmNvZGVkIGluIDQgYnl0ZXMuCisgICAgLy8gICAgICAgICAgICAgYml0IDIwLTE4LCBiaXQgMTctMTIsIGJpdCAxMS02LCBiaXQgNS0wCisgICAgLy8gMHhmOC4uMHhmZjogPGludmFsaWQ+CisgICAgLy8KKyAgICAvLyBNZWFuaW5nIG9mIGVhY2ggYml0OgorICAgIC8vIDxtc2I+IGJpdCA3OiAwIC0gc2luZ2xlIGJ5dGUgY29kZSBwb2ludDogYml0cyA2LTAgYXJlIHZhbHVlcy4KKyAgICAvLyAgICAgICAgICAgICAgMSAtIG11bHRpYnl0ZSBjb2RlIHBvaW50CisgICAgLy8gICAgICAgYml0IDY6IDAgLSBzdWJzZXF1ZW50IGJ5dGVzIG9mIG11bHRpYnl0ZSBjb2RlIHBvaW50OgorICAgIC8vICAgICAgICAgICAgICAgICAgYml0cyA1LTAgYXJlIHZhbHVlcy4KKyAgICAvLyAgICAgICAgICAgICAgMSAtIGZpcnN0IGJ5dGUgb2YgbXVsdGlieXRlIGNvZGUgcG9pbnQKKyAgICAvLyAgICAgICBiaXQgNTogMCAtIGZpcnN0IGJ5dGUgb2YgMi1ieXRlIGNvZGUgcG9pbnQ6IGJpdHMgNC0wIGFyZSB2YWx1ZXMuCisgICAgLy8gICAgICAgICAgICAgIDEgLSBmaXJzdCBieXRlIG9mIGNvZGUgcG9pbnQgd2l0aCA+PSAzIGJ5dGVzLgorICAgIC8vICAgICAgIGJpdCA0OiAwIC0gZmlyc3QgYnl0ZSBvZiAzLWJ5dGUgY29kZSBwb2ludDogYml0cyAzLTAgYXJlIHZhbHVlcy4KKyAgICAvLyAgICAgICAgICAgICAgMSAtIGZpcnN0IGJ5dGUgb2YgY29kZSBwb2ludCB3aXRoID49IDQgYnl0ZXMuCisgICAgLy8gICAgICAgYml0IDM6IDAgLSBmaXJzdCBieXRlIG9mIDQtYnl0ZSBjb2RlIHBvaW50OiBiaXRzIDItMCBhcmUgdmFsdWVzLgorICAgIC8vICAgICAgICAgICAgICAxIC0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24uCisgICAgaWYgKCpjcCA8PSAweDdmKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCpjcCA8PSAweGJmKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmICgqY3AgPD0gMHhkZikgeworICAgICAgKmNwICY9IDB4MWY7CisgICAgICAqbnVtX2xlZnQgPSAxOworICAgIH0gZWxzZSBpZiAoKmNwIDw9IDB4ZWYpIHsKKyAgICAgICpjcCAmPSAweDBmOworICAgICAgKm51bV9sZWZ0ID0gMjsKKyAgICB9IGVsc2UgaWYgKCpjcCA8PSAweGY3KSB7CisgICAgICAqY3AgJj0gMHgwNzsKKyAgICAgICpudW1fbGVmdCA9IDM7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gTGFzdCByZWFkIHdhcyBwYXJ0aWFsLiBJbml0aWFsaXplIG51bV9yZWFkIHRvIDAgYW5kIGNvbnRpbnVlIHJlYWRpbmcKKyAgICAvLyB0aGUgbGFzdCB1bmljb2RlIGNvZGUgcG9pbnQuCisgICAgKm51bV9yZWFkID0gMDsKKyAgfQorICB3aGlsZSAoKm51bV9sZWZ0ID4gMCAmJiBpbmRleCA8IHN0ci5zaXplKCkpIHsKKyAgICB1aW50MzJfdCBjaCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHN0cltpbmRleCsrXSk7CisgICAgLS0oKm51bV9sZWZ0KTsKKyAgICArKygqbnVtX3JlYWQpOworICAgICpjcCA9ICgqY3AgPDwgNikgfCAoY2ggJiAweDNmKTsKKyAgICBpZiAoY2ggPCAweDgwIHx8IGNoID4gMHhiZikgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiAqbnVtX2xlZnQgPiAwIHx8ICghSXNTdXJyb2dhdGUoKmNwKSAmJiBJc1ZhbGlkQ29kZVBvaW50KCpjcCkpOworfQorCisvLyBTdG9yZXMgdGhlIDE2LWJpdCB1bmljb2RlIGNvZGUgcG9pbnQgYXMgaXRzIGhleGFkZWNpbWFsIGRpZ2l0cyBpbiBidWZmZXIKKy8vIGFuZCByZXR1cm5zIGEgU3RyaW5nUGllY2UgdGhhdCBwb2ludHMgdG8gdGhpcyBidWZmZXIuIFRoZSBpbnB1dCBidWZmZXIgbmVlZHMKKy8vIHRvIGJlIGF0IGxlYXN0IDYgYnl0ZXMgbG9uZy4KK1N0cmluZ1BpZWNlIFRvSGV4KHVpbnQxNl90IGNwLCBjaGFyKiBidWZmZXIpIHsKKyAgYnVmZmVyWzVdID0ga0hleFtjcCAmIDB4MGZdOworICBjcCA+Pj0gNDsKKyAgYnVmZmVyWzRdID0ga0hleFtjcCAmIDB4MGZdOworICBjcCA+Pj0gNDsKKyAgYnVmZmVyWzNdID0ga0hleFtjcCAmIDB4MGZdOworICBjcCA+Pj0gNDsKKyAgYnVmZmVyWzJdID0ga0hleFtjcCAmIDB4MGZdOworICByZXR1cm4gU3RyaW5nUGllY2UoYnVmZmVyLCA2KTsKK30KKworLy8gU3RvcmVzIHRoZSAzMi1iaXQgdW5pY29kZSBjb2RlIHBvaW50IGFzIGl0cyBoZXhhZGVjaW1hbCBkaWdpdHMgaW4gYnVmZmVyCisvLyBhbmQgcmV0dXJucyBhIFN0cmluZ1BpZWNlIHRoYXQgcG9pbnRzIHRvIHRoaXMgYnVmZmVyLiBUaGUgaW5wdXQgYnVmZmVyIG5lZWRzCisvLyB0byBiZSBhdCBsZWFzdCAxMiBieXRlcyBsb25nLgorU3RyaW5nUGllY2UgVG9TdXJyb2dhdGVIZXgodWludDMyX3QgY3AsIGNoYXIqIGJ1ZmZlcikgeworICB1aW50MTZfdCBsb3cgPSBUb0xvd1N1cnJvZ2F0ZShjcCk7CisgIHVpbnQxNl90IGhpZ2ggPSBUb0hpZ2hTdXJyb2dhdGUoY3ApOworCisgIGJ1ZmZlclsxMV0gPSBrSGV4W2xvdyAmIDB4MGZdOworICBsb3cgPj49IDQ7CisgIGJ1ZmZlclsxMF0gPSBrSGV4W2xvdyAmIDB4MGZdOworICBsb3cgPj49IDQ7CisgIGJ1ZmZlcls5XSA9IGtIZXhbbG93ICYgMHgwZl07CisgIGxvdyA+Pj0gNDsKKyAgYnVmZmVyWzhdID0ga0hleFtsb3cgJiAweDBmXTsKKworICBidWZmZXJbNV0gPSBrSGV4W2hpZ2ggJiAweDBmXTsKKyAgaGlnaCA+Pj0gNDsKKyAgYnVmZmVyWzRdID0ga0hleFtoaWdoICYgMHgwZl07CisgIGhpZ2ggPj49IDQ7CisgIGJ1ZmZlclszXSA9IGtIZXhbaGlnaCAmIDB4MGZdOworICBoaWdoID4+PSA0OworICBidWZmZXJbMl0gPSBrSGV4W2hpZ2ggJiAweDBmXTsKKworICByZXR1cm4gU3RyaW5nUGllY2UoYnVmZmVyLCAxMik7Cit9CisKKy8vIElmIHRoZSBnaXZlbiB1bmljb2RlIGNvZGUgcG9pbnQgbmVlZHMgZXNjYXBpbmcsIHRoZW4gcmV0dXJucyB0aGUKKy8vIGVzY2FwZWQgZm9ybS4gVGhlIHJldHVybmVkIFN0cmluZ1BpZWNlIGVpdGhlciBwb2ludHMgdG8gc3RhdGljYWxseQorLy8gcHJlLWFsbG9jYXRlZCBjaGFyW10gb3IgdG8gdGhlIGdpdmVuIGJ1ZmZlci4gVGhlIGlucHV0IGJ1ZmZlciBuZWVkcworLy8gdG8gYmUgYXQgbGVhc3QgMTIgYnl0ZXMgbG9uZy4KKy8vCisvLyBJZiB0aGUgZ2l2ZW4gdW5pY29kZSBjb2RlIHBvaW50IGRvZXMgbm90IG5lZWQgZXNjYXBpbmcsIGFuIGVtcHR5CisvLyBTdHJpbmdQaWVjZSBpcyByZXR1cm5lZC4KK1N0cmluZ1BpZWNlIEVzY2FwZUNvZGVQb2ludCh1aW50MzJfdCBjcCwgY2hhciogYnVmZmVyKSB7CisgIGlmIChjcCA8IDB4YTApIHJldHVybiBrQ29tbW9uRXNjYXBlc1tjcF07CisgIHN3aXRjaCAoY3ApIHsKKyAgICAvLyBUaGVzZSBhcmUgbm90IHJlcXVpcmVkIGJ5IGpzb24gc3BlYworICAgIC8vIGJ1dCB1c2VkIHRvIHByZXZlbnQgc2VjdXJpdHkgYnVncyBpbiBqYXZhc2NyaXB0LgorICAgIGNhc2UgMHhmZWZmOiAgLy8gWmVybyB3aWR0aCBuby1icmVhayBzcGFjZQorICAgIGNhc2UgMHhmZmY5OiAgLy8gSW50ZXJsaW5lYXIgYW5ub3RhdGlvbiBhbmNob3IKKyAgICBjYXNlIDB4ZmZmYTogIC8vIEludGVybGluZWFyIGFubm90YXRpb24gc2VwYXJhdG9yCisgICAgY2FzZSAweGZmZmI6ICAvLyBJbnRlcmxpbmVhciBhbm5vdGF0aW9uIHRlcm1pbmF0b3IKKworICAgIGNhc2UgMHgwMGFkOiAgLy8gU29mdC1oeXBoZW4KKyAgICBjYXNlIDB4MDZkZDogIC8vIEFyYWJpYyBlbmQgb2YgYXlhaAorICAgIGNhc2UgMHgwNzBmOiAgLy8gU3lyaWFjIGFiYnJldmlhdGlvbiBtYXJrCisgICAgY2FzZSAweDE3YjQ6ICAvLyBLaG1lciB2b3dlbCBpbmhlcmVudCBBcQorICAgIGNhc2UgMHgxN2I1OiAgLy8gS2htZXIgdm93ZWwgaW5oZXJlbnQgQWEKKyAgICAgIHJldHVybiBUb0hleChjcCwgYnVmZmVyKTsKKworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoKGNwID49IDB4MDYwMCAmJiBjcCA8PSAweDA2MDMpIHx8ICAvLyBBcmFiaWMgc2lnbnMKKyAgICAgICAgICAoY3AgPj0gMHgyMDBiICYmIGNwIDw9IDB4MjAwZikgfHwgIC8vIFplcm8gd2lkdGggZXRjLgorICAgICAgICAgIChjcCA+PSAweDIwMjggJiYgY3AgPD0gMHgyMDJlKSB8fCAgLy8gU2VwYXJhdG9ycyBldGMuCisgICAgICAgICAgKGNwID49IDB4MjA2MCAmJiBjcCA8PSAweDIwNjQpIHx8ICAvLyBJbnZpc2libGUgZXRjLgorICAgICAgICAgIChjcCA+PSAweDIwNmEgJiYgY3AgPD0gMHgyMDZmKSkgeyAgLy8gU2hhcGluZyBldGMuCisgICAgICAgIHJldHVybiBUb0hleChjcCwgYnVmZmVyKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNwID09IDB4MDAwZTAwMDEgfHwgICAgICAgICAgICAgICAgICAgICAgICAvLyBMYW5ndWFnZSB0YWcKKyAgICAgICAgICAoY3AgPj0gMHgwMDAxZDE3MyAmJiBjcCA8PSAweDAwMDFkMTdhKSB8fCAgLy8gTXVzaWMgZm9ybWF0dGluZworICAgICAgICAgIChjcCA+PSAweDAwMGUwMDIwICYmIGNwIDw9IDB4MDAwZTAwN2YpKSB7ICAvLyBUQUcgc3ltYm9scworICAgICAgICByZXR1cm4gVG9TdXJyb2dhdGVIZXgoY3AsIGJ1ZmZlcik7CisgICAgICB9CisgIH0KKyAgcmV0dXJuIFN0cmluZ1BpZWNlKCk7Cit9CisKKy8vIFRyaWVzIHRvIGVzY2FwZSB0aGUgZ2l2ZW4gY29kZSBwb2ludCBmaXJzdC4gSWYgdGhlIGdpdmVuIGNvZGUgcG9pbnQKKy8vIGRvZXMgbm90IG5lZWQgdG8gYmUgZXNjYXBlZCwgYnV0IGZvcmNlX291dHB1dCBpcyB0cnVlLCB0aGVuIHJlbmRlcgorLy8gdGhlIGdpdmVuIG11bHRpLWJ5dGUgY29kZSBwb2ludCBpbiBVVEY4IGluIHRoZSBidWZmZXIgYW5kIHJldHVybnMgaXQuCitTdHJpbmdQaWVjZSBFc2NhcGVDb2RlUG9pbnQodWludDMyX3QgY3AsIGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlX291dHB1dCkgeworICBTdHJpbmdQaWVjZSBzcCA9IEVzY2FwZUNvZGVQb2ludChjcCwgYnVmZmVyKTsKKyAgaWYgKGZvcmNlX291dHB1dCAmJiBzcC5lbXB0eSgpKSB7CisgICAgYnVmZmVyWzVdID0gKGNwICYgMHgzZikgfCAweDgwOworICAgIGNwID4+PSA2OworICAgIGlmIChjcCA8PSAweDFmKSB7CisgICAgICBidWZmZXJbNF0gPSBjcCB8IDB4YzA7CisgICAgICBzcCA9IFN0cmluZ1BpZWNlKGJ1ZmZlciArIDQsIDIpOworICAgICAgcmV0dXJuIHNwOworICAgIH0KKyAgICBidWZmZXJbNF0gPSAoY3AgJiAweDNmKSB8IDB4ODA7CisgICAgY3AgPj49IDY7CisgICAgaWYgKGNwIDw9IDB4MGYpIHsKKyAgICAgIGJ1ZmZlclszXSA9IGNwIHwgMHhlMDsKKyAgICAgIHNwID0gU3RyaW5nUGllY2UoYnVmZmVyICsgMywgMyk7CisgICAgICByZXR1cm4gc3A7CisgICAgfQorICAgIGJ1ZmZlclszXSA9IChjcCAmIDB4M2YpIHwgMHg4MDsKKyAgICBidWZmZXJbMl0gPSAoKGNwID4+IDYpICYgMHgwNykgfCAweGYwOworICAgIHNwID0gU3RyaW5nUGllY2UoYnVmZmVyICsgMiwgNCk7CisgIH0KKyAgcmV0dXJuIHNwOworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBKc29uRXNjYXBpbmc6OkVzY2FwZShzdHJpbmdzOjpCeXRlU291cmNlKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nczo6Qnl0ZVNpbmsqIG91dHB1dCkgeworICBjaGFyIGJ1ZmZlclsxMl0gPSAiXFx1ZGVhZFxcdWJlZSI7CisgIHVpbnQzMl90IGNwID0gMDsgICAvLyBDdXJyZW50IHVuaWNvZGUgY29kZSBwb2ludC4KKyAgaW50IG51bV9sZWZ0ID0gMDsgIC8vIE51bSBvZiBjaGFycyB0byByZWFkIHRvIGNvbXBsZXRlIHRoZSBjb2RlIHBvaW50LgorICB3aGlsZSAoaW5wdXQtPkF2YWlsYWJsZSgpID4gMCkgeworICAgIFN0cmluZ1BpZWNlIHN0ciA9IGlucHV0LT5QZWVrKCk7CisgICAgU3RyaW5nUGllY2UgZXNjYXBlZDsKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IG51bV9yZWFkOworICAgIGJvb2wgb2s7CisgICAgYm9vbCBjcF93YXNfc3BsaXQgPSBudW1fbGVmdCA+IDA7CisgICAgLy8gTG9vcCB1bnRpbCB3ZSBlbmNvdW50ZXIgZWl0aGVyCisgICAgLy8gICBpKSBhIGNvZGUgcG9pbnQgdGhhdCBuZWVkcyB0byBiZSBlc2NhcGVkOyBvcgorICAgIC8vICBpaSkgYSBzcGxpdCBjb2RlIHBvaW50IGlzIGNvbXBsZXRlbHkgcmVhZDsgb3IKKyAgICAvLyBpaWkpIGEgY2hhcmFjdGVyIHRoYXQgaXMgbm90IGEgdmFsaWQgdXRmODsgb3IKKyAgICAvLyAgaXYpIGVuZCBvZiB0aGUgU3RyaW5nUGllY2Ugc3RyIGlzIHJlYWNoZWQuCisgICAgZG8geworICAgICAgb2sgPSBSZWFkQ29kZVBvaW50KHN0ciwgaSwgJmNwLCAmbnVtX2xlZnQsICZudW1fcmVhZCk7CisgICAgICBpZiAobnVtX2xlZnQgPiAwIHx8ICFvaykgYnJlYWs7ICAvLyBjYXNlIGlpaSBvciBpdgorICAgICAgZXNjYXBlZCA9IEVzY2FwZUNvZGVQb2ludChjcCwgYnVmZmVyLCBjcF93YXNfc3BsaXQpOworICAgICAgaWYgKCFlc2NhcGVkLmVtcHR5KCkpIGJyZWFrOyAgLy8gY2FzZSBpIG9yIGlpCisgICAgICBpICs9IG51bV9yZWFkOworICAgICAgbnVtX3JlYWQgPSAwOworICAgIH0gd2hpbGUgKGkgPCBzdHIubGVuZ3RoKCkpOyAgLy8gY2FzZSBpdgorICAgIC8vIEZpcnN0IGNvcHkgdGhlIHVuLWVzY2FwZWQgcHJlZml4LCBpZiBhbnksIHRvIHRoZSBvdXRwdXQgQnl0ZVNpbmsuCisgICAgaWYgKGkgPiAwKSBpbnB1dC0+Q29weVRvKG91dHB1dCwgaSk7CisgICAgaWYgKG51bV9yZWFkID4gMCkgaW5wdXQtPlNraXAobnVtX3JlYWQpOworICAgIGlmICghb2spIHsKKyAgICAgIC8vIENhc2UgaWlpOiBSZXBvcnQgZXJyb3IuCisgICAgICAvLyBUT0RPKHdwb29uKTogQWRkIGVycm9yIHJlcG9ydGluZy4KKyAgICAgIG51bV9sZWZ0ID0gMDsKKyAgICB9IGVsc2UgaWYgKG51bV9sZWZ0ID09IDAgJiYgIWVzY2FwZWQuZW1wdHkoKSkgeworICAgICAgLy8gQ2FzZSBpIG9yIGlpOiBBcHBlbmQgdGhlIGVzY2FwZWQgY29kZSBwb2ludCB0byB0aGUgb3V0cHV0IEJ5dGVTaW5rLgorICAgICAgb3V0cHV0LT5BcHBlbmQoZXNjYXBlZC5kYXRhKCksIGVzY2FwZWQuc2l6ZSgpKTsKKyAgICB9CisgIH0KKyAgaWYgKG51bV9sZWZ0ID4gMCkgeworICAgIC8vIFRyZWF0IGFzIGNhc2UgaWlpOiByZXBvcnQgZXJyb3IuCisgICAgLy8gVE9ETyh3cG9vbik6IEFkZCBlcnJvciByZXBvcnRpbmcuCisgIH0KK30KKwordm9pZCBKc29uRXNjYXBpbmc6OkVzY2FwZShTdHJpbmdQaWVjZSBpbnB1dCwgc3RyaW5nczo6Qnl0ZVNpbmsqIG91dHB1dCkgeworICBjb25zdCBzaXplX3QgbGVuID0gaW5wdXQubGVuZ3RoKCk7CisgIGNvbnN0IGNoYXIqIHAgPSBpbnB1dC5kYXRhKCk7CisKKyAgYm9vbCBjYW5fc2tpcF9lc2NhcGluZyA9IHRydWU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBjaGFyIGMgPSBwW2ldOworICAgIGlmIChjIDwgMHgyMCB8fCBjID49IDB4N0YgfHwgYyA9PSAnIicgfHwgYyA9PSAnPCcgfHwgYyA9PSAnPicgfHwKKyAgICAgICAgYyA9PSAnXFwnKSB7CisgICAgICBjYW5fc2tpcF9lc2NhcGluZyA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGNhbl9za2lwX2VzY2FwaW5nKSB7CisgICAgb3V0cHV0LT5BcHBlbmQoaW5wdXQuZGF0YSgpLCBpbnB1dC5sZW5ndGgoKSk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nczo6QXJyYXlCeXRlU291cmNlIHNvdXJjZShpbnB1dCk7CisgICAgRXNjYXBlKCZzb3VyY2UsIG91dHB1dCk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnRlcgorfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fZXNjYXBpbmcuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX2VzY2FwaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1NGYyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX2VzY2FwaW5nLmgKQEAgLTAsMCArMSw5OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfSlNPTl9FU0NBUElOR19IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfSlNPTl9FU0NBUElOR19IX18KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW0uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKK2NsYXNzIEpzb25Fc2NhcGluZyB7CisgcHVibGljOgorICAvLyBUaGUgbWluaW11bSB2YWx1ZSBvZiBhIHVuaWNvZGUgaGlnaC1zdXJyb2dhdGUgY29kZSB1bml0IGluIHRoZSB1dGYtMTYKKyAgLy8gZW5jb2RpbmcuIEEgaGlnaC1zdXJyb2dhdGUgaXMgYWxzbyBrbm93biBhcyBhIGxlYWRpbmctc3Vycm9nYXRlLgorICAvLyBTZWUgaHR0cDovL3d3dy51bmljb2RlLm9yZy9nbG9zc2FyeS8jaGlnaF9zdXJyb2dhdGVfY29kZV91bml0CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3Qga01pbkhpZ2hTdXJyb2dhdGUgPSAweGQ4MDA7CisKKyAgLy8gVGhlIG1heGltdW0gdmFsdWUgb2YgYSB1bmljaWRlIGhpZ2gtc3Vycm9nYXRlIGNvZGUgdW5pdCBpbiB0aGUgdXRmLTE2CisgIC8vIGVuY29kaW5nLiBBIGhpZ2gtc3Vycm9nYXRlIGlzIGFsc28ga25vd24gYXMgYSBsZWFkaW5nLXN1cnJvZ2F0ZS4KKyAgLy8gU2VlIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvZ2xvc3NhcnkvI2hpZ2hfc3Vycm9nYXRlX2NvZGVfdW5pdAorICBzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IGtNYXhIaWdoU3Vycm9nYXRlID0gMHhkYmZmOworCisgIC8vIFRoZSBtaW5pbXVtIHZhbHVlIG9mIGEgdW5pY29kZSBsb3ctc3Vycm9nYXRlIGNvZGUgdW5pdCBpbiB0aGUgdXRmLTE2CisgIC8vIGVuY29kaW5nLiBBIGxvdy1zdXJyb2dhdGUgaXMgYWxzbyBrbm93biBhcyBhIHRyYWlsaW5nLXN1cnJvZ2F0ZS4KKyAgLy8gU2VlIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvZ2xvc3NhcnkvI2xvd19zdXJyb2dhdGVfY29kZV91bml0CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3Qga01pbkxvd1N1cnJvZ2F0ZSA9IDB4ZGMwMDsKKworICAvLyBUaGUgbWF4aW11bSB2YWx1ZSBvZiBhIHVuaWNvZGUgbG93LXN1cnJvZ2F0ZSBjb2RlIHVuaXQgaW4gdGhlIHV0Zi0xNgorICAvLyBlbmNvZGluZy4gQSBsb3ctc3Vycm9nYXRlIGlzIGFsc28ga25vd24gYXMgYSB0cmFpbGluZyBzdXJyb2dhdGUuCisgIC8vIFNlZSBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2dsb3NzYXJ5LyNsb3dfc3Vycm9nYXRlX2NvZGVfdW5pdAorICBzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IGtNYXhMb3dTdXJyb2dhdGUgPSAweGRmZmY7CisKKyAgLy8gVGhlIG1pbmltdW0gdmFsdWUgb2YgYSB1bmljb2RlIHN1cHBsZW1lbnRhcnkgY29kZSBwb2ludC4KKyAgLy8gU2VlIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvZ2xvc3NhcnkvI3N1cHBsZW1lbnRhcnlfY29kZV9wb2ludAorICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNaW5TdXBwbGVtZW50YXJ5Q29kZVBvaW50ID0gMHgwMTAwMDA7CisKKyAgLy8gVGhlIG1pbmltdW0gdmFsdWUgb2YgYSB1bmljb2RlIGNvZGUgcG9pbnQuCisgIC8vIFNlZSBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2dsb3NzYXJ5LyNjb2RlX3BvaW50CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01pbkNvZGVQb2ludCA9IDB4MDAwMDAwOworCisgIC8vIFRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgdW5pY29kZSBjb2RlIHBvaW50LgorICAvLyBTZWUgaHR0cDovL3d3dy51bmljb2RlLm9yZy9nbG9zc2FyeS8jY29kZV9wb2ludAorICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhDb2RlUG9pbnQgPSAweDEwZmZmZjsKKworICBKc29uRXNjYXBpbmcoKSB7fQorICB2aXJ0dWFsIH5Kc29uRXNjYXBpbmcoKSB7fQorCisgIC8vIEVzY2FwZSB0aGUgZ2l2ZW4gQnl0ZVNvdXJjZSB0byB0aGUgZ2l2ZW4gQnl0ZVNpbmsuCisgIHN0YXRpYyB2b2lkIEVzY2FwZShzdHJpbmdzOjpCeXRlU291cmNlKiBpbnB1dCwgc3RyaW5nczo6Qnl0ZVNpbmsqIG91dHB1dCk7CisKKyAgLy8gRXNjYXBlIHRoZSBnaXZlbiBCeXRlU291cmNlIHRvIHRoZSBnaXZlbiBCeXRlU2luay4KKyAgLy8gVGhpcyBpcyBvcHRpbWl6ZWQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBzdHJpbmcgaXMgYWxsIHByaW50YWJsZSA3LWJpdAorICAvLyBBU0NJSSBhbmQgZG9lcyBub3QgY29udGFpbiBhIGZldyBvdGhlciBjaGFyYWN0ZXJzIChzdWNoIGFzIHF1b3RlcykuCisgIHN0YXRpYyB2b2lkIEVzY2FwZShTdHJpbmdQaWVjZSBpbnB1dCwgc3RyaW5nczo6Qnl0ZVNpbmsqIG91dHB1dCk7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSnNvbkVzY2FwaW5nKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9KU09OX0VTQ0FQSU5HX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhODZmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXIuY2MKQEAgLTAsMCArMSwxOTAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXIuaD4KKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2Nhc3RzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdXRpbGl0eS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9lc2NhcGluZy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgY29udmVydGVyIHsKKworCitKc29uT2JqZWN0V3JpdGVyOjp+SnNvbk9iamVjdFdyaXRlcigpIHsKKyAgaWYgKGVsZW1lbnRfICYmICFlbGVtZW50Xy0+aXNfcm9vdCgpKSB7CisgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiSnNvbk9iamVjdFdyaXRlciB3YXMgbm90IGZ1bGx5IGNsb3NlZC4iOworICB9Cit9CisKK0pzb25PYmplY3RXcml0ZXIqIEpzb25PYmplY3RXcml0ZXI6OlN0YXJ0T2JqZWN0KFN0cmluZ1BpZWNlIG5hbWUpIHsKKyAgV3JpdGVQcmVmaXgobmFtZSk7CisgIFdyaXRlQ2hhcigneycpOworICBQdXNoT2JqZWN0KCk7CisgIHJldHVybiB0aGlzOworfQorCitKc29uT2JqZWN0V3JpdGVyKiBKc29uT2JqZWN0V3JpdGVyOjpFbmRPYmplY3QoKSB7CisgIFBvcCgpOworICBXcml0ZUNoYXIoJ30nKTsKKyAgaWYgKGVsZW1lbnQoKSAmJiBlbGVtZW50KCktPmlzX3Jvb3QoKSkgTmV3TGluZSgpOworICByZXR1cm4gdGhpczsKK30KKworSnNvbk9iamVjdFdyaXRlciogSnNvbk9iamVjdFdyaXRlcjo6U3RhcnRMaXN0KFN0cmluZ1BpZWNlIG5hbWUpIHsKKyAgV3JpdGVQcmVmaXgobmFtZSk7CisgIFdyaXRlQ2hhcignWycpOworICBQdXNoQXJyYXkoKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0pzb25PYmplY3RXcml0ZXIqIEpzb25PYmplY3RXcml0ZXI6OkVuZExpc3QoKSB7CisgIFBvcCgpOworICBXcml0ZUNoYXIoJ10nKTsKKyAgaWYgKGVsZW1lbnQoKS0+aXNfcm9vdCgpKSBOZXdMaW5lKCk7CisgIHJldHVybiB0aGlzOworfQorCitKc29uT2JqZWN0V3JpdGVyKiBKc29uT2JqZWN0V3JpdGVyOjpSZW5kZXJCb29sKFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdmFsdWUpIHsKKyAgcmV0dXJuIFJlbmRlclNpbXBsZShuYW1lLCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworfQorCitKc29uT2JqZWN0V3JpdGVyKiBKc29uT2JqZWN0V3JpdGVyOjpSZW5kZXJJbnQzMihTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSkgeworICByZXR1cm4gUmVuZGVyU2ltcGxlKG5hbWUsIFN0ckNhdCh2YWx1ZSkpOworfQorCitKc29uT2JqZWN0V3JpdGVyKiBKc29uT2JqZWN0V3JpdGVyOjpSZW5kZXJVaW50MzIoU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkgeworICByZXR1cm4gUmVuZGVyU2ltcGxlKG5hbWUsIFN0ckNhdCh2YWx1ZSkpOworfQorCitKc29uT2JqZWN0V3JpdGVyKiBKc29uT2JqZWN0V3JpdGVyOjpSZW5kZXJJbnQ2NChTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSkgeworICBXcml0ZVByZWZpeChuYW1lKTsKKyAgV3JpdGVDaGFyKCciJyk7CisgIFdyaXRlUmF3U3RyaW5nKFN0ckNhdCh2YWx1ZSkpOworICBXcml0ZUNoYXIoJyInKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0pzb25PYmplY3RXcml0ZXIqIEpzb25PYmplY3RXcml0ZXI6OlJlbmRlclVpbnQ2NChTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlKSB7CisgIFdyaXRlUHJlZml4KG5hbWUpOworICBXcml0ZUNoYXIoJyInKTsKKyAgV3JpdGVSYXdTdHJpbmcoU3RyQ2F0KHZhbHVlKSk7CisgIFdyaXRlQ2hhcignIicpOworICByZXR1cm4gdGhpczsKK30KKworSnNvbk9iamVjdFdyaXRlciogSnNvbk9iamVjdFdyaXRlcjo6UmVuZGVyRG91YmxlKFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlKSB7CisgIGlmIChzdGQ6OmlzZmluaXRlKHZhbHVlKSkgeworICAgIHJldHVybiBSZW5kZXJTaW1wbGUobmFtZSwgU2ltcGxlRHRvYSh2YWx1ZSkpOworICB9CisKKyAgLy8gUmVuZGVyIHF1b3RlZCB3aXRoIE5hTi9JbmZpbml0eS1hd2FyZSBEb3VibGVBc1N0cmluZy4KKyAgcmV0dXJuIFJlbmRlclN0cmluZyhuYW1lLCBEb3VibGVBc1N0cmluZyh2YWx1ZSkpOworfQorCitKc29uT2JqZWN0V3JpdGVyKiBKc29uT2JqZWN0V3JpdGVyOjpSZW5kZXJGbG9hdChTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsdWUpIHsKKyAgaWYgKHN0ZDo6aXNmaW5pdGUodmFsdWUpKSB7CisgICAgcmV0dXJuIFJlbmRlclNpbXBsZShuYW1lLCBTaW1wbGVGdG9hKHZhbHVlKSk7CisgIH0KKworICAvLyBSZW5kZXIgcXVvdGVkIHdpdGggTmFOL0luZmluaXR5LWF3YXJlIEZsb2F0QXNTdHJpbmcuCisgIHJldHVybiBSZW5kZXJTdHJpbmcobmFtZSwgRmxvYXRBc1N0cmluZyh2YWx1ZSkpOworfQorCitKc29uT2JqZWN0V3JpdGVyKiBKc29uT2JqZWN0V3JpdGVyOjpSZW5kZXJTdHJpbmcoU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSB2YWx1ZSkgeworICBXcml0ZVByZWZpeChuYW1lKTsKKyAgV3JpdGVDaGFyKCciJyk7CisgIEpzb25Fc2NhcGluZzo6RXNjYXBlKHZhbHVlLCAmc2lua18pOworICBXcml0ZUNoYXIoJyInKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0pzb25PYmplY3RXcml0ZXIqIEpzb25PYmplY3RXcml0ZXI6OlJlbmRlckJ5dGVzKFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSB2YWx1ZSkgeworICBXcml0ZVByZWZpeChuYW1lKTsKKyAgc3RkOjpzdHJpbmcgYmFzZTY0OworCisgIGlmICh1c2Vfd2Vic2FmZV9iYXNlNjRfZm9yX2J5dGVzXykKKyAgICBXZWJTYWZlQmFzZTY0RXNjYXBlV2l0aFBhZGRpbmcoc3RkOjpzdHJpbmcodmFsdWUpLCAmYmFzZTY0KTsKKyAgZWxzZQorICAgIEJhc2U2NEVzY2FwZSh2YWx1ZSwgJmJhc2U2NCk7CisKKyAgV3JpdGVDaGFyKCciJyk7CisgIC8vIFRPRE8od3Bvb24pOiBDb25zaWRlciBhIEJ5dGVTaW5rIHNvbHV0aW9uIHRoYXQgd3JpdGVzIHRoZSBiYXNlNjQgYnl0ZXMKKyAgLy8gICAgICAgICAgICAgIGRpcmVjdGx5IHRvIHRoZSBzdHJlYW0sIHJhdGhlciB0aGFuIGZpcnN0IHB1dHRpbmcgdGhlbQorICAvLyAgICAgICAgICAgICAgaW50byBhIHN0cmluZyBhbmQgdGhlbiB3cml0aW5nIHRoZW0gdG8gdGhlIHN0cmVhbS4KKyAgc3RyZWFtXy0+V3JpdGVSYXcoYmFzZTY0LmRhdGEoKSwgYmFzZTY0LnNpemUoKSk7CisgIFdyaXRlQ2hhcignIicpOworICByZXR1cm4gdGhpczsKK30KKworSnNvbk9iamVjdFdyaXRlciogSnNvbk9iamVjdFdyaXRlcjo6UmVuZGVyTnVsbChTdHJpbmdQaWVjZSBuYW1lKSB7CisgIHJldHVybiBSZW5kZXJTaW1wbGUobmFtZSwgIm51bGwiKTsKK30KKworSnNvbk9iamVjdFdyaXRlciogSnNvbk9iamVjdFdyaXRlcjo6UmVuZGVyTnVsbEFzRW1wdHkoU3RyaW5nUGllY2UgbmFtZSkgeworICByZXR1cm4gUmVuZGVyU2ltcGxlKG5hbWUsICIiKTsKK30KKwordm9pZCBKc29uT2JqZWN0V3JpdGVyOjpXcml0ZVByZWZpeChTdHJpbmdQaWVjZSBuYW1lKSB7CisgIGJvb2wgbm90X2ZpcnN0ID0gIWVsZW1lbnQoKS0+aXNfZmlyc3QoKTsKKyAgaWYgKG5vdF9maXJzdCkgV3JpdGVDaGFyKCcsJyk7CisgIGlmIChub3RfZmlyc3QgfHwgIWVsZW1lbnQoKS0+aXNfcm9vdCgpKSBOZXdMaW5lKCk7CisgIGlmICghbmFtZS5lbXB0eSgpIHx8IGVsZW1lbnQoKS0+aXNfanNvbl9vYmplY3QoKSkgeworICAgIFdyaXRlQ2hhcignIicpOworICAgIGlmICghbmFtZS5lbXB0eSgpKSB7CisgICAgICBKc29uRXNjYXBpbmc6OkVzY2FwZShuYW1lLCAmc2lua18pOworICAgIH0KKyAgICBXcml0ZVJhd1N0cmluZygiXCI6Iik7CisgICAgaWYgKCFpbmRlbnRfc3RyaW5nXy5lbXB0eSgpKSBXcml0ZUNoYXIoJyAnKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY29udmVydGVyCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXIuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiN2RmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXIuaApAQCAtMCwwICsxLDI3OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfSlNPTl9PQkpFQ1RXUklURVJfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX0pTT05fT0JKRUNUV1JJVEVSX0hfXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvc3RydWN0dXJlZF9vYmplY3R3cml0ZXIuaD4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisvLyBjbGFuZy1mb3JtYXQgb24KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKKworLy8gQW4gT2JqZWN0V3JpdGVyIGltcGxlbWVudGF0aW9uIHRoYXQgb3V0cHV0cyBKU09OLiBUaGlzIE9iamVjdFdyaXRlcgorLy8gc3VwcG9ydHMgd3JpdGluZyBhIGNvbXBhY3QgZm9ybSBvciBhIHByZXR0eSBwcmludGVkIGZvcm0uCisvLworLy8gU2FtcGxlIHVzYWdlOgorLy8gICBzdHJpbmcgb3V0cHV0OworLy8gICBTdHJpbmdPdXRwdXRTdHJlYW0qIHN0cl9zdHJlYW0gPSBuZXcgU3RyaW5nT3V0cHV0U3RyZWFtKCZvdXRwdXQpOworLy8gICBDb2RlZE91dHB1dFN0cmVhbSogb3V0X3N0cmVhbSA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShzdHJfc3RyZWFtKTsKKy8vICAgSnNvbk9iamVjdFdyaXRlciogb3cgPSBuZXcgSnNvbk9iamVjdFdyaXRlcigiICAiLCBvdXRfc3RyZWFtKTsKKy8vICAgb3ctPlN0YXJ0T2JqZWN0KCIiKQorLy8gICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAidmFsdWUiKQorLy8gICAgICAgLT5SZW5kZXJTdHJpbmcoImVtcHR5c3RyaW5nIiwgc3RyaW5nKCkpCisvLyAgICAgICAtPlN0YXJ0T2JqZWN0KCJuZXN0ZWQiKQorLy8gICAgICAgICAtPlJlbmRlckludDY0KCJsaWdodCIsIDI5OTc5MjQ1OCk7CisvLyAgICAgICAgIC0+UmVuZGVyRG91YmxlKCJwaSIsIDMuMTQxNTkyNjUzNTg5NzkzKTsKKy8vICAgICAgIC0+RW5kT2JqZWN0KCkKKy8vICAgICAgIC0+U3RhcnRMaXN0KCJlbXB0eSIpCisvLyAgICAgICAtPkVuZExpc3QoKQorLy8gICAgIC0+RW5kT2JqZWN0KCk7CisvLworLy8gQW5kIHRoZW4gdGhlIG91dHB1dCBzdHJpbmcgd291bGQgYmVjb21lOgorLy8geworLy8gICAibmFtZSI6ICJ2YWx1ZSIsCisvLyAgICJlbXB0eXN0cmluZyI6ICIiLAorLy8gICAibmVzdGVkIjogeworLy8gICAgICJsaWdodCI6ICIyOTk3OTI0NTgiLAorLy8gICAgICJwaSI6IDMuMTQxNTkyNjUzNTg5NzkzCisvLyAgIH0sCisvLyAgICJlbXB0eSI6IFtdCisvLyB9CisvLworLy8gSnNvbk9iamVjdFdyaXRlciBkb2VzIG5vdCB2YWxpZGF0ZSBpZiBjYWxscyBhY3R1YWxseSByZXN1bHQgaW4gdmFsaWQgSlNPTi4KKy8vIEZvciBleGFtcGxlLCBwYXNzaW5nIGFuIGVtcHR5IG5hbWUgd2hlbiBvbmUgd291bGQgYmUgcmVxdWlyZWQgd29uJ3QgcmVzdWx0CisvLyBpbiBhbiBlcnJvciwganVzdCBhbiBpbnZhbGlkIG91dHB1dC4KKy8vCisvLyBOb3RlIHRoYXQgYWxsIGludDY0IGFuZCB1aW50NjQgYXJlIHJlbmRlcmVkIGFzIHN0cmluZ3MgaW5zdGVhZCBvZiBudW1iZXJzLgorLy8gVGhpcyBpcyBiZWNhdXNlIEphdmFTY3JpcHQgcGFyc2VzIG51bWJlcnMgYXMgNjQtYml0IGZsb2F0IHRodXMgaW50NjQgYW5kCisvLyB1aW50NjQgd291bGQgbG9zZSBwcmVjaXNpb24gaWYgcmVuZGVyZWQgYXMgbnVtYmVycy4KKy8vCisvLyBKc29uT2JqZWN0V3JpdGVyIGlzIHRocmVhZC11bnNhZmUuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgSnNvbk9iamVjdFdyaXRlciA6IHB1YmxpYyBTdHJ1Y3R1cmVkT2JqZWN0V3JpdGVyIHsKKyBwdWJsaWM6CisgIEpzb25PYmplY3RXcml0ZXIoU3RyaW5nUGllY2UgaW5kZW50X3N0cmluZywgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXQpCisgICAgICA6IGVsZW1lbnRfKG5ldyBFbGVtZW50KC8qcGFyZW50PSovbnVsbHB0ciwgLyppc19qc29uX29iamVjdD0qL2ZhbHNlKSksCisgICAgICAgIHN0cmVhbV8ob3V0KSwKKyAgICAgICAgc2lua18ob3V0KSwKKyAgICAgICAgaW5kZW50X3N0cmluZ18oaW5kZW50X3N0cmluZyksCisgICAgICAgIGluZGVudF9jaGFyXygnXDAnKSwKKyAgICAgICAgaW5kZW50X2NvdW50XygwKSwKKyAgICAgICAgdXNlX3dlYnNhZmVfYmFzZTY0X2Zvcl9ieXRlc18oZmFsc2UpIHsKKyAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhIHRyaXZpYWwgc2VxdWVuY2Ugb2YgaW5kZW50IGNoYXJhY3RlcnMuCisgICAgaWYgKCFpbmRlbnRfc3RyaW5nLmVtcHR5KCkpIHsKKyAgICAgIGluZGVudF9jaGFyXyA9IGluZGVudF9zdHJpbmdbMF07CisgICAgICBpbmRlbnRfY291bnRfID0gaW5kZW50X3N0cmluZy5sZW5ndGgoKTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgaW5kZW50X3N0cmluZy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIGlmIChpbmRlbnRfY2hhcl8gIT0gaW5kZW50X3N0cmluZ19baV0pIHsKKyAgICAgICAgICBpbmRlbnRfY2hhcl8gPSAnXDAnOworICAgICAgICAgIGluZGVudF9jb3VudF8gPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIH5Kc29uT2JqZWN0V3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgLy8gT2JqZWN0V3JpdGVyIG1ldGhvZHMuCisgIEpzb25PYmplY3RXcml0ZXIqIFN0YXJ0T2JqZWN0KFN0cmluZ1BpZWNlIG5hbWUpIG92ZXJyaWRlOworICBKc29uT2JqZWN0V3JpdGVyKiBFbmRPYmplY3QoKSBvdmVycmlkZTsKKyAgSnNvbk9iamVjdFdyaXRlciogU3RhcnRMaXN0KFN0cmluZ1BpZWNlIG5hbWUpIG92ZXJyaWRlOworICBKc29uT2JqZWN0V3JpdGVyKiBFbmRMaXN0KCkgb3ZlcnJpZGU7CisgIEpzb25PYmplY3RXcml0ZXIqIFJlbmRlckJvb2woU3RyaW5nUGllY2UgbmFtZSwgYm9vbCB2YWx1ZSkgb3ZlcnJpZGU7CisgIEpzb25PYmplY3RXcml0ZXIqIFJlbmRlckludDMyKFN0cmluZ1BpZWNlIG5hbWUsIGludDMyX3QgdmFsdWUpIG92ZXJyaWRlOworICBKc29uT2JqZWN0V3JpdGVyKiBSZW5kZXJVaW50MzIoU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKSBvdmVycmlkZTsKKyAgSnNvbk9iamVjdFdyaXRlciogUmVuZGVySW50NjQoU3RyaW5nUGllY2UgbmFtZSwgaW50NjRfdCB2YWx1ZSkgb3ZlcnJpZGU7CisgIEpzb25PYmplY3RXcml0ZXIqIFJlbmRlclVpbnQ2NChTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWUpIG92ZXJyaWRlOworICBKc29uT2JqZWN0V3JpdGVyKiBSZW5kZXJEb3VibGUoU3RyaW5nUGllY2UgbmFtZSwgZG91YmxlIHZhbHVlKSBvdmVycmlkZTsKKyAgSnNvbk9iamVjdFdyaXRlciogUmVuZGVyRmxvYXQoU3RyaW5nUGllY2UgbmFtZSwgZmxvYXQgdmFsdWUpIG92ZXJyaWRlOworICBKc29uT2JqZWN0V3JpdGVyKiBSZW5kZXJTdHJpbmcoU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIHZhbHVlKSBvdmVycmlkZTsKKyAgSnNvbk9iamVjdFdyaXRlciogUmVuZGVyQnl0ZXMoU3RyaW5nUGllY2UgbmFtZSwgU3RyaW5nUGllY2UgdmFsdWUpIG92ZXJyaWRlOworICBKc29uT2JqZWN0V3JpdGVyKiBSZW5kZXJOdWxsKFN0cmluZ1BpZWNlIG5hbWUpIG92ZXJyaWRlOworICB2aXJ0dWFsIEpzb25PYmplY3RXcml0ZXIqIFJlbmRlck51bGxBc0VtcHR5KFN0cmluZ1BpZWNlIG5hbWUpOworCisgIHZvaWQgc2V0X3VzZV93ZWJzYWZlX2Jhc2U2NF9mb3JfYnl0ZXMoYm9vbCB2YWx1ZSkgeworICAgIHVzZV93ZWJzYWZlX2Jhc2U2NF9mb3JfYnl0ZXNfID0gdmFsdWU7CisgIH0KKworIHByb3RlY3RlZDoKKyAgY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEVsZW1lbnQgOiBwdWJsaWMgQmFzZUVsZW1lbnQgeworICAgcHVibGljOgorICAgIEVsZW1lbnQoRWxlbWVudCogcGFyZW50LCBib29sIGlzX2pzb25fb2JqZWN0KQorICAgICAgICA6IEJhc2VFbGVtZW50KHBhcmVudCksCisgICAgICAgICAgaXNfZmlyc3RfKHRydWUpLAorICAgICAgICAgIGlzX2pzb25fb2JqZWN0Xyhpc19qc29uX29iamVjdCkge30KKworICAgIC8vIENhbGxlZCBiZWZvcmUgZWFjaCBmaWVsZCBvZiB0aGUgRWxlbWVudCBpcyB0byBiZSBwcm9jZXNzZWQuCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgKHByb2Nlc3NpbmcgdGhlIGZpcnN0IGZpZWxkKS4KKyAgICBib29sIGlzX2ZpcnN0KCkgeworICAgICAgaWYgKGlzX2ZpcnN0XykgeworICAgICAgICBpc19maXJzdF8gPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gV2hldGhlciB3ZSBhcmUgY3VycmVudGx5IHJlbmRlcmluZyBpbnNpZGUgYSBKU09OIG9iamVjdCAoaS5lLiwgYmV0d2VlbgorICAgIC8vIFN0YXJ0T2JqZWN0KCkgYW5kIEVuZE9iamVjdCgpKS4KKyAgICBib29sIGlzX2pzb25fb2JqZWN0KCkgY29uc3QgeyByZXR1cm4gaXNfanNvbl9vYmplY3RfOyB9CisKKyAgIHByaXZhdGU6CisgICAgYm9vbCBpc19maXJzdF87CisgICAgYm9vbCBpc19qc29uX29iamVjdF87CisKKyAgICBHT09HTEVfRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKEVsZW1lbnQpOworICB9OworCisgIEVsZW1lbnQqIGVsZW1lbnQoKSBvdmVycmlkZSB7IHJldHVybiBlbGVtZW50Xy5nZXQoKTsgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEJ5dGVTaW5rV3JhcHBlciA6IHB1YmxpYyBzdHJpbmdzOjpCeXRlU2luayB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgQnl0ZVNpbmtXcmFwcGVyKGlvOjpDb2RlZE91dHB1dFN0cmVhbSogc3RyZWFtKSA6IHN0cmVhbV8oc3RyZWFtKSB7fQorICAgIH5CeXRlU2lua1dyYXBwZXIoKSBvdmVycmlkZSB7fQorCisgICAgLy8gQnl0ZVNpbmsgbWV0aG9kcy4KKyAgICB2b2lkIEFwcGVuZChjb25zdCBjaGFyKiBieXRlcywgc2l6ZV90IG4pIG92ZXJyaWRlIHsKKyAgICAgIHN0cmVhbV8tPldyaXRlUmF3KGJ5dGVzLCBuKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBzdHJlYW1fOworCisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEJ5dGVTaW5rV3JhcHBlcik7CisgIH07CisKKyAgLy8gUmVuZGVycyBhIHNpbXBsZSB2YWx1ZSBhcyBhIHN0cmluZy4gQnkgZGVmYXVsdCBhbGwgbm9uLXN0cmluZyBSZW5kZXIKKyAgLy8gbWV0aG9kcyBjb252ZXJ0IHRoZWlyIGFyZ3VtZW50IHRvIGEgc3RyaW5nIGFuZCBjYWxsIHRoaXMgbWV0aG9kLiBUaGlzCisgIC8vIG1ldGhvZCBjYW4gdGhlbiBiZSB1c2VkIHRvIHJlbmRlciB0aGUgc2ltcGxlIHZhbHVlIHdpdGhvdXQgZXNjYXBpbmcgaXQuCisgIEpzb25PYmplY3RXcml0ZXIqIFJlbmRlclNpbXBsZShTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgdmFsdWUpIHsKKyAgICBXcml0ZVByZWZpeChuYW1lKTsKKyAgICBXcml0ZVJhd1N0cmluZyh2YWx1ZSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvLyBQdXNoZXMgYSBuZXcgSlNPTiBhcnJheSBlbGVtZW50IHRvIHRoZSBzdGFjay4KKyAgdm9pZCBQdXNoQXJyYXkoKSB7CisgICAgZWxlbWVudF8ucmVzZXQobmV3IEVsZW1lbnQoZWxlbWVudF8ucmVsZWFzZSgpLCAvKmlzX2pzb25fb2JqZWN0PSovZmFsc2UpKTsKKyAgfQorCisgIC8vIFB1c2hlcyBhIG5ldyBKU09OIG9iamVjdCBlbGVtZW50IHRvIHRoZSBzdGFjay4KKyAgdm9pZCBQdXNoT2JqZWN0KCkgeworICAgIGVsZW1lbnRfLnJlc2V0KG5ldyBFbGVtZW50KGVsZW1lbnRfLnJlbGVhc2UoKSwgLyppc19qc29uX29iamVjdD0qL3RydWUpKTsKKyAgfQorCisgIC8vIFBvcHMgYW4gZWxlbWVudCBvZmYgb2YgdGhlIHN0YWNrIGFuZCBkZWxldGVzIHRoZSBwb3BwZWQgZWxlbWVudC4KKyAgdm9pZCBQb3AoKSB7CisgICAgYm9vbCBuZWVkc19uZXdsaW5lID0gIWVsZW1lbnRfLT5pc19maXJzdCgpOworICAgIGVsZW1lbnRfLnJlc2V0KGVsZW1lbnRfLT5wb3A8RWxlbWVudD4oKSk7CisgICAgaWYgKG5lZWRzX25ld2xpbmUpIE5ld0xpbmUoKTsKKyAgfQorCisgIC8vIElmIHByZXR0eSBwcmludGluZyBpcyBlbmFibGVkLCB0aGlzIHdpbGwgd3JpdGUgYSBuZXdsaW5lIHRvIHRoZSBvdXRwdXQsCisgIC8vIGZvbGxvd2VkIGJ5IG9wdGlvbmFsIGluZGVudGF0aW9uLiBPdGhlcndpc2UgdGhpcyBtZXRob2QgaXMgYSBub29wLgorICB2b2lkIE5ld0xpbmUoKSB7CisgICAgaWYgKCFpbmRlbnRfc3RyaW5nXy5lbXB0eSgpKSB7CisgICAgICBzaXplX3QgbGVuID0gc2l6ZW9mKCdcbicpICsgKGluZGVudF9zdHJpbmdfLnNpemUoKSAqIGVsZW1lbnQoKS0+bGV2ZWwoKSk7CisKKyAgICAgIC8vIFRha2UgdGhlIHNsb3ctcGF0aCBpZiB3ZSBkb24ndCBoYXZlIHN1ZmZpY2llbnQgY2hhcmFjdGVycyByZW1haW5pbmcgaW4KKyAgICAgIC8vIG91ciBidWZmZXIgb3Igd2UgaGF2ZSBhIG5vbi10cml2aWFsIGluZGVudCBzdHJpbmcgd2hpY2ggd291bGQgcHJldmVudAorICAgICAgLy8gdXMgZnJvbSB1c2luZyBtZW1zZXQuCisgICAgICB1aW50OF90KiBvdXQgPSBudWxscHRyOworICAgICAgaWYgKGluZGVudF9jb3VudF8gPiAwKSB7CisgICAgICAgIG91dCA9IHN0cmVhbV8tPkdldERpcmVjdEJ1ZmZlckZvck5CeXRlc0FuZEFkdmFuY2UobGVuKTsKKyAgICAgIH0KKworICAgICAgaWYgKG91dCAhPSBudWxscHRyKSB7CisgICAgICAgIG91dFswXSA9ICdcbic7CisgICAgICAgIG1lbXNldCgmb3V0WzFdLCBpbmRlbnRfY2hhcl8sIGxlbiAtIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2xvdyBwYXRoLCBubyBjb250aWd1b3VzIG91dHB1dCBidWZmZXIgYXZhaWxhYmxlLgorICAgICAgICBXcml0ZUNoYXIoJ1xuJyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudCgpLT5sZXZlbCgpOyBpKyspIHsKKyAgICAgICAgICBzdHJlYW1fLT5Xcml0ZVJhdyhpbmRlbnRfc3RyaW5nXy5jX3N0cigpLCBpbmRlbnRfc3RyaW5nXy5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBXcml0ZXMgYSBwcmVmaXguIFRoaXMgd2lsbCB3cml0ZSBvdXQgYW55IHByZXR0eSBwcmludGluZyBhbmQKKyAgLy8gY29tbWFzIHRoYXQgYXJlIHJlcXVpcmVkLCBmb2xsb3dlZCBieSB0aGUgbmFtZSBhbmQgYSAnOicgaWYKKyAgLy8gdGhlIG5hbWUgaXMgbm90IG51bGwuCisgIHZvaWQgV3JpdGVQcmVmaXgoU3RyaW5nUGllY2UgbmFtZSk7CisKKyAgLy8gV3JpdGVzIGFuIGluZGl2aWR1YWwgY2hhcmFjdGVyIHRvIHRoZSBvdXRwdXQuCisgIHZvaWQgV3JpdGVDaGFyKGNvbnN0IGNoYXIgYykgeyBzdHJlYW1fLT5Xcml0ZVJhdygmYywgc2l6ZW9mKGMpKTsgfQorCisgIC8vIFdyaXRlcyBhIHN0cmluZyB0byB0aGUgb3V0cHV0LgorICB2b2lkIFdyaXRlUmF3U3RyaW5nKFN0cmluZ1BpZWNlIHMpIHsKKyAgICBzdHJlYW1fLT5Xcml0ZVJhdyhzLmRhdGEoKSwgcy5sZW5ndGgoKSk7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8RWxlbWVudD4gZWxlbWVudF87CisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogc3RyZWFtXzsKKyAgQnl0ZVNpbmtXcmFwcGVyIHNpbmtfOworICBjb25zdCBzdGQ6OnN0cmluZyBpbmRlbnRfc3RyaW5nXzsKKworICAvLyBGb3IgdGhlIGNvbW1vbiBjYXNlIG9mIGluZGVudCBiZWluZyBhIHNpbmdsZSBjaGFyYWN0ZXIgcmVwZWF0ZWQuCisgIGNoYXIgaW5kZW50X2NoYXJfOworICBpbnQgaW5kZW50X2NvdW50XzsKKworICAvLyBXaGV0aGVyIHRvIHVzZSByZWd1bGFyIG9yIHdlYnNhZmUgYmFzZTY0IGVuY29kaW5nIGZvciBieXRlIGZpZWxkcy4gRGVmYXVsdHMKKyAgLy8gdG8gcmVndWxhciBiYXNlNjQgZW5jb2RpbmcuCisgIGJvb2wgdXNlX3dlYnNhZmVfYmFzZTY0X2Zvcl9ieXRlc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhKc29uT2JqZWN0V3JpdGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9KU09OX09CSkVDVFdSSVRFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlcl90ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjZjJjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlcl90ZXN0LmNjCkBAIC0wLDAgKzEsMzE1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyLmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBjb252ZXJ0ZXIgeworCit1c2luZyBpbzo6Q29kZWRPdXRwdXRTdHJlYW07Cit1c2luZyBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtOworCitjbGFzcyBKc29uT2JqZWN0V3JpdGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgSnNvbk9iamVjdFdyaXRlclRlc3QoKQorICAgICAgOiBzdHJfc3RyZWFtXyhuZXcgU3RyaW5nT3V0cHV0U3RyZWFtKCZvdXRwdXRfKSksCisgICAgICAgIG91dF9zdHJlYW1fKG5ldyBDb2RlZE91dHB1dFN0cmVhbShzdHJfc3RyZWFtXykpLAorICAgICAgICBvd18obnVsbHB0cikge30KKworICB+SnNvbk9iamVjdFdyaXRlclRlc3QoKSBvdmVycmlkZSB7IGRlbGV0ZSBvd187IH0KKworICBzdGQ6OnN0cmluZyBDbG9zZVN0cmVhbUFuZEdldFN0cmluZygpIHsKKyAgICBkZWxldGUgb3V0X3N0cmVhbV87CisgICAgZGVsZXRlIHN0cl9zdHJlYW1fOworICAgIHJldHVybiBvdXRwdXRfOworICB9CisKKyAgc3RkOjpzdHJpbmcgb3V0cHV0XzsKKyAgU3RyaW5nT3V0cHV0U3RyZWFtKiBjb25zdCBzdHJfc3RyZWFtXzsKKyAgQ29kZWRPdXRwdXRTdHJlYW0qIGNvbnN0IG91dF9zdHJlYW1fOworICBKc29uT2JqZWN0V3JpdGVyKiBvd187Cit9OworCitURVNUX0YoSnNvbk9iamVjdFdyaXRlclRlc3QsIEVtcHR5Um9vdE9iamVjdCkgeworICBvd18gPSBuZXcgSnNvbk9iamVjdFdyaXRlcigiIiwgb3V0X3N0cmVhbV8pOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKS0+RW5kT2JqZWN0KCk7CisgIEVYUEVDVF9FUSgie30iLCBDbG9zZVN0cmVhbUFuZEdldFN0cmluZygpKTsKK30KKworVEVTVF9GKEpzb25PYmplY3RXcml0ZXJUZXN0LCBFbXB0eU9iamVjdCkgeworICBvd18gPSBuZXcgSnNvbk9iamVjdFdyaXRlcigiIiwgb3V0X3N0cmVhbV8pOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInRlc3QiLCAidmFsdWUiKQorICAgICAgLT5TdGFydE9iamVjdCgiZW1wdHkiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgRVhQRUNUX0VRKCJ7XCJ0ZXN0XCI6XCJ2YWx1ZVwiLFwiZW1wdHlcIjp7fX0iLCBDbG9zZVN0cmVhbUFuZEdldFN0cmluZygpKTsKK30KKworVEVTVF9GKEpzb25PYmplY3RXcml0ZXJUZXN0LCBFbXB0eVJvb3RMaXN0KSB7CisgIG93XyA9IG5ldyBKc29uT2JqZWN0V3JpdGVyKCIiLCBvdXRfc3RyZWFtXyk7CisgIG93Xy0+U3RhcnRMaXN0KCIiKS0+RW5kTGlzdCgpOworICBFWFBFQ1RfRVEoIltdIiwgQ2xvc2VTdHJlYW1BbmRHZXRTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihKc29uT2JqZWN0V3JpdGVyVGVzdCwgRW1wdHlMaXN0KSB7CisgIG93XyA9IG5ldyBKc29uT2JqZWN0V3JpdGVyKCIiLCBvdXRfc3RyZWFtXyk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygidGVzdCIsICJ2YWx1ZSIpCisgICAgICAtPlN0YXJ0TGlzdCgiZW1wdHkiKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIEVYUEVDVF9FUSgie1widGVzdFwiOlwidmFsdWVcIixcImVtcHR5XCI6W119IiwgQ2xvc2VTdHJlYW1BbmRHZXRTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihKc29uT2JqZWN0V3JpdGVyVGVzdCwgRW1wdHlPYmplY3RLZXkpIHsKKyAgb3dfID0gbmV3IEpzb25PYmplY3RXcml0ZXIoIiIsIG91dF9zdHJlYW1fKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlJlbmRlclN0cmluZygiIiwgInZhbHVlIiktPkVuZE9iamVjdCgpOworICBFWFBFQ1RfRVEoIntcIlwiOlwidmFsdWVcIn0iLCBDbG9zZVN0cmVhbUFuZEdldFN0cmluZygpKTsKK30KKworVEVTVF9GKEpzb25PYmplY3RXcml0ZXJUZXN0LCBPYmplY3RJbk9iamVjdCkgeworICBvd18gPSBuZXcgSnNvbk9iamVjdFdyaXRlcigiIiwgb3V0X3N0cmVhbV8pOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgibmVzdGVkIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJmaWVsZCIsICJ2YWx1ZSIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBFWFBFQ1RfRVEoIntcIm5lc3RlZFwiOntcImZpZWxkXCI6XCJ2YWx1ZVwifX0iLCBDbG9zZVN0cmVhbUFuZEdldFN0cmluZygpKTsKK30KKworVEVTVF9GKEpzb25PYmplY3RXcml0ZXJUZXN0LCBMaXN0SW5PYmplY3QpIHsKKyAgb3dfID0gbmV3IEpzb25PYmplY3RXcml0ZXIoIiIsIG91dF9zdHJlYW1fKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRMaXN0KCJuZXN0ZWQiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIiIsICJ2YWx1ZSIpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgRVhQRUNUX0VRKCJ7XCJuZXN0ZWRcIjpbXCJ2YWx1ZVwiXX0iLCBDbG9zZVN0cmVhbUFuZEdldFN0cmluZygpKTsKK30KKworVEVTVF9GKEpzb25PYmplY3RXcml0ZXJUZXN0LCBPYmplY3RJbkxpc3QpIHsKKyAgb3dfID0gbmV3IEpzb25PYmplY3RXcml0ZXIoIiIsIG91dF9zdHJlYW1fKTsKKyAgb3dfLT5TdGFydExpc3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImZpZWxkIiwgInZhbHVlIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kTGlzdCgpOworICBFWFBFQ1RfRVEoIlt7XCJmaWVsZFwiOlwidmFsdWVcIn1dIiwgQ2xvc2VTdHJlYW1BbmRHZXRTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihKc29uT2JqZWN0V3JpdGVyVGVzdCwgTGlzdEluTGlzdCkgeworICBvd18gPSBuZXcgSnNvbk9iamVjdFdyaXRlcigiIiwgb3V0X3N0cmVhbV8pOworICBvd18tPlN0YXJ0TGlzdCgiIikKKyAgICAgIC0+U3RhcnRMaXN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIiIsICJ2YWx1ZSIpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5FbmRMaXN0KCk7CisgIEVYUEVDVF9FUSgiW1tcInZhbHVlXCJdXSIsIENsb3NlU3RyZWFtQW5kR2V0U3RyaW5nKCkpOworfQorCitURVNUX0YoSnNvbk9iamVjdFdyaXRlclRlc3QsIFJlbmRlclByaW1pdGl2ZXMpIHsKKyAgb3dfID0gbmV3IEpzb25PYmplY3RXcml0ZXIoIiIsIG91dF9zdHJlYW1fKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyQm9vbCgiYm9vbCIsIHRydWUpCisgICAgICAtPlJlbmRlckRvdWJsZSgiZG91YmxlIiwgc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXgoKSkKKyAgICAgIC0+UmVuZGVyRmxvYXQoImZsb2F0Iiwgc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46Om1heCgpKQorICAgICAgLT5SZW5kZXJJbnQzMigiaW50Iiwgc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKCkpCisgICAgICAtPlJlbmRlckludDY0KCJsb25nIiwgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKCkpCisgICAgICAtPlJlbmRlckJ5dGVzKCJieXRlcyIsICJhYnJhY2FkYWJyYSIpCisgICAgICAtPlJlbmRlclN0cmluZygic3RyaW5nIiwgInN0cmluZyIpCisgICAgICAtPlJlbmRlckJ5dGVzKCJlbXB0eWJ5dGVzIiwgIiIpCisgICAgICAtPlJlbmRlclN0cmluZygiZW1wdHlzdHJpbmciLCBzdGQ6OnN0cmluZygpKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIntcImJvb2xcIjp0cnVlLCIKKyAgICAgICJcImRvdWJsZVwiOiIgKworICAgICAgICAgIFZhbHVlQXNTdHJpbmc8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpKSArCisgICAgICAgICAgIiwiCisgICAgICAgICAgIlwiZmxvYXRcIjoiICsKKyAgICAgICAgICBWYWx1ZUFzU3RyaW5nPGZsb2F0PihzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWF4KCkpICsKKyAgICAgICAgICAiLCIKKyAgICAgICAgICAiXCJpbnRcIjotMjE0NzQ4MzY0OCwiCisgICAgICAgICAgIlwibG9uZ1wiOlwiLTkyMjMzNzIwMzY4NTQ3NzU4MDhcIiwiCisgICAgICAgICAgIlwiYnl0ZXNcIjpcIllXSnlZV05oWkdGaWNtRT1cIiwiCisgICAgICAgICAgIlwic3RyaW5nXCI6XCJzdHJpbmdcIiwiCisgICAgICAgICAgIlwiZW1wdHlieXRlc1wiOlwiXCIsIgorICAgICAgICAgICJcImVtcHR5c3RyaW5nXCI6XCJcIn0iLAorICAgICAgQ2xvc2VTdHJlYW1BbmRHZXRTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihKc29uT2JqZWN0V3JpdGVyVGVzdCwgQnl0ZXNFbmNvZGVzQXNOb25XZWJTYWZlQmFzZTY0KSB7CisgIHN0ZDo6c3RyaW5nIHM7CisgIHMucHVzaF9iYWNrKCdcMzc3Jyk7CisgIHMucHVzaF9iYWNrKCdcMzU3Jyk7CisgIG93XyA9IG5ldyBKc29uT2JqZWN0V3JpdGVyKCIiLCBvdXRfc3RyZWFtXyk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpLT5SZW5kZXJCeXRlcygiYnl0ZXMiLCBzKS0+RW5kT2JqZWN0KCk7CisgIC8vIE5vbi13ZWItc2FmZSB3b3VsZCBlbmNvZGUgdGhpcyBhcyAiLys4PSIKKyAgRVhQRUNUX0VRKCJ7XCJieXRlc1wiOlwiLys4PVwifSIsIENsb3NlU3RyZWFtQW5kR2V0U3RyaW5nKCkpOworfQorCitURVNUX0YoSnNvbk9iamVjdFdyaXRlclRlc3QsIFByZXR0eVByaW50TGlzdCkgeworICBvd18gPSBuZXcgSnNvbk9iamVjdFdyaXRlcigiICIsIG91dF9zdHJlYW1fKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRMaXN0KCJpdGVtcyIpCisgICAgICAtPlJlbmRlclN0cmluZygiIiwgIml0ZW0xIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAiaXRlbTIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIiIsICJpdGVtMyIpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5TdGFydExpc3QoImVtcHR5IikKKyAgICAgIC0+RW5kTGlzdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBFWFBFQ1RfRVEoCisgICAgICAie1xuIgorICAgICAgIiBcIml0ZW1zXCI6IFtcbiIKKyAgICAgICIgIFwiaXRlbTFcIixcbiIKKyAgICAgICIgIFwiaXRlbTJcIixcbiIKKyAgICAgICIgIFwiaXRlbTNcIlxuIgorICAgICAgIiBdLFxuIgorICAgICAgIiBcImVtcHR5XCI6IFtdXG4iCisgICAgICAifVxuIiwKKyAgICAgIENsb3NlU3RyZWFtQW5kR2V0U3RyaW5nKCkpOworfQorCitURVNUX0YoSnNvbk9iamVjdFdyaXRlclRlc3QsIFByZXR0eVByaW50T2JqZWN0KSB7CisgIG93XyA9IG5ldyBKc29uT2JqZWN0V3JpdGVyKCIgIiwgb3V0X3N0cmVhbV8pOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgiaXRlbXMiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImtleTEiLCAiaXRlbTEiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImtleTIiLCAiaXRlbTIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImtleTMiLCAiaXRlbTMiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5TdGFydE9iamVjdCgiZW1wdHkiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIntcbiIKKyAgICAgICIgXCJpdGVtc1wiOiB7XG4iCisgICAgICAiICBcImtleTFcIjogXCJpdGVtMVwiLFxuIgorICAgICAgIiAgXCJrZXkyXCI6IFwiaXRlbTJcIixcbiIKKyAgICAgICIgIFwia2V5M1wiOiBcIml0ZW0zXCJcbiIKKyAgICAgICIgfSxcbiIKKyAgICAgICIgXCJlbXB0eVwiOiB7fVxuIgorICAgICAgIn1cbiIsCisgICAgICBDbG9zZVN0cmVhbUFuZEdldFN0cmluZygpKTsKK30KKworVEVTVF9GKEpzb25PYmplY3RXcml0ZXJUZXN0LCBQcmV0dHlQcmludEVtcHR5T2JqZWN0SW5FbXB0eUxpc3QpIHsKKyAgb3dfID0gbmV3IEpzb25PYmplY3RXcml0ZXIoIiAiLCBvdXRfc3RyZWFtXyk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0TGlzdCgibGlzdCIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJ7XG4iCisgICAgICAiIFwibGlzdFwiOiBbXG4iCisgICAgICAiICB7fVxuIgorICAgICAgIiBdXG4iCisgICAgICAifVxuIiwKKyAgICAgIENsb3NlU3RyZWFtQW5kR2V0U3RyaW5nKCkpOworfQorCitURVNUX0YoSnNvbk9iamVjdFdyaXRlclRlc3QsIFByZXR0eVByaW50RG91YmxlSW5kZW50KSB7CisgIG93XyA9IG5ldyBKc29uT2JqZWN0V3JpdGVyKCIgICIsIG91dF9zdHJlYW1fKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyQm9vbCgiYm9vbCIsIHRydWUpCisgICAgICAtPlJlbmRlckludDMyKCJpbnQiLCA0MikKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJ7XG4iCisgICAgICAiICBcImJvb2xcIjogdHJ1ZSxcbiIKKyAgICAgICIgIFwiaW50XCI6IDQyXG4iCisgICAgICAifVxuIiwKKyAgICAgIENsb3NlU3RyZWFtQW5kR2V0U3RyaW5nKCkpOworfQorCitURVNUX0YoSnNvbk9iamVjdFdyaXRlclRlc3QsIFN0cmluZ3NFc2NhcGVkQW5kRW5jbG9zZWRJbkRvdWJsZVF1b3RlcykgeworICBvd18gPSBuZXcgSnNvbk9iamVjdFdyaXRlcigiIiwgb3V0X3N0cmVhbV8pOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKS0+UmVuZGVyU3RyaW5nKCJzdHJpbmciLCAiJzw+JmFtcDtcXFwiXHJcbiIpLT5FbmRPYmplY3QoKTsKKyAgRVhQRUNUX0VRKCJ7XCJzdHJpbmdcIjpcIidcXHUwMDNjXFx1MDAzZSZhbXA7XFxcXFxcXCJcXHJcXG5cIn0iLAorICAgICAgICAgICAgQ2xvc2VTdHJlYW1BbmRHZXRTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihKc29uT2JqZWN0V3JpdGVyVGVzdCwgU3RyaW5naWZpY2F0aW9uKSB7CisgIG93XyA9IG5ldyBKc29uT2JqZWN0V3JpdGVyKCIiLCBvdXRfc3RyZWFtXyk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlckRvdWJsZSgiZG91YmxlX25hbiIsIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCkpCisgICAgICAtPlJlbmRlckZsb2F0KCJmbG9hdF9uYW4iLCBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6cXVpZXRfTmFOKCkpCisgICAgICAtPlJlbmRlckRvdWJsZSgiZG91YmxlX3BvcyIsIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkKKyAgICAgIC0+UmVuZGVyRmxvYXQoImZsb2F0X3BvcyIsIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKQorICAgICAgLT5SZW5kZXJEb3VibGUoImRvdWJsZV9uZWciLCAtc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKQorICAgICAgLT5SZW5kZXJGbG9hdCgiZmxvYXRfbmVnIiwgLXN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIntcImRvdWJsZV9uYW5cIjpcIk5hTlwiLCIKKyAgICAgICJcImZsb2F0X25hblwiOlwiTmFOXCIsIgorICAgICAgIlwiZG91YmxlX3Bvc1wiOlwiSW5maW5pdHlcIiwiCisgICAgICAiXCJmbG9hdF9wb3NcIjpcIkluZmluaXR5XCIsIgorICAgICAgIlwiZG91YmxlX25lZ1wiOlwiLUluZmluaXR5XCIsIgorICAgICAgIlwiZmxvYXRfbmVnXCI6XCItSW5maW5pdHlcIn0iLAorICAgICAgQ2xvc2VTdHJlYW1BbmRHZXRTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihKc29uT2JqZWN0V3JpdGVyVGVzdCwgVGVzdFJlZ3VsYXJCeXRlRW5jb2RpbmcpIHsKKyAgb3dfID0gbmV3IEpzb25PYmplY3RXcml0ZXIoIiIsIG91dF9zdHJlYW1fKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyQnl0ZXMoImJ5dGVzIiwgIlx4MDNceGVmXHhjMCIpCisgICAgICAtPkVuZE9iamVjdCgpOworCisgIC8vIFRlc3QgdGhhdCB3ZSBnZXQgcmVndWxhciAobm9uIHdlYnNhZmUpIGJhc2U2NCBlbmNvZGluZyBvbiBieXRlIGZpZWxkcyBieQorICAvLyBkZWZhdWx0LgorICBFWFBFQ1RfRVEoIntcImJ5dGVzXCI6XCJBKy9BXCJ9IiwgQ2xvc2VTdHJlYW1BbmRHZXRTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihKc29uT2JqZWN0V3JpdGVyVGVzdCwgVGVzdFdlYnNhZmVCeXRlRW5jb2RpbmcpIHsKKyAgb3dfID0gbmV3IEpzb25PYmplY3RXcml0ZXIoIiIsIG91dF9zdHJlYW1fKTsKKyAgb3dfLT5zZXRfdXNlX3dlYnNhZmVfYmFzZTY0X2Zvcl9ieXRlcyh0cnVlKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyQnl0ZXMoImJ5dGVzIiwgIlx4MDNceGVmXHhjMFx4MTAiKQorICAgICAgLT5FbmRPYmplY3QoKTsKKworICAvLyBUZXN0IHRoYXQgd2UgZ2V0IHdlYnNhZmUgYmFzZTY0IGVuY29kaW5nIHdoZW4gZXhwbGljaXRseSBhc2tlZC4KKyAgRVhQRUNUX0VRKCJ7XCJieXRlc1wiOlwiQS1fQUVBPT1cIn0iLCBDbG9zZVN0cmVhbUFuZEdldFN0cmluZygpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnRlcgorfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlci5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzNGRiYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuY2MKQEAgLTAsMCArMSw5OTUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfd3JpdGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9lc2NhcGluZy5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKKworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKKy8vIE51bWJlciBvZiBkaWdpdHMgaW4gYW4gZXNjYXBlZCBVVEYtMTYgY29kZSB1bml0ICgnXFwnICd1JyBYIFggWCBYKQorc3RhdGljIGNvbnN0IGludCBrVW5pY29kZUVzY2FwZWRMZW5ndGggPSA2OworCitzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0TWF4UmVjdXJzaW9uRGVwdGggPSAxMDA7CisKKy8vIFRoZXNlIGNhbm5vdCBiZSBjb25zdGV4cHIgZm9yIHBvcnRhYmlsaXR5IHdpdGggVlMyMDE1Lgorc3RhdGljIGNvbnN0IFN0cmluZ1BpZWNlIGtLZXl3b3JkVHJ1ZSA9ICJ0cnVlIjsKK3N0YXRpYyBjb25zdCBTdHJpbmdQaWVjZSBrS2V5d29yZEZhbHNlID0gImZhbHNlIjsKK3N0YXRpYyBjb25zdCBTdHJpbmdQaWVjZSBrS2V5d29yZE51bGwgPSAibnVsbCI7CisKK2lubGluZSBib29sIElzTGV0dGVyKGNoYXIgYykgeworICByZXR1cm4gKCdhJyA8PSBjICYmIGMgPD0gJ3onKSB8fCAoJ0EnIDw9IGMgJiYgYyA8PSAnWicpIHx8IChjID09ICdfJykgfHwKKyAgICAgICAgIChjID09ICckJyk7Cit9CisKK2lubGluZSBib29sIElzQWxwaGFudW1lcmljKGNoYXIgYykgeworICByZXR1cm4gSXNMZXR0ZXIoYykgfHwgKCcwJyA8PSBjICYmIGMgPD0gJzknKTsKK30KKworLy8gSW5kaWNhdGVzIGEgY2hhcmFjdGVyIG1heSBub3QgYmUgcGFydCBvZiBhbiB1bnF1b3RlZCBrZXkuCitpbmxpbmUgYm9vbCBJc0tleVNlcGFyYXRvcihjaGFyIGMpIHsKKyAgcmV0dXJuIChhc2NpaV9pc3NwYWNlKGMpIHx8IGMgPT0gJyInIHx8IGMgPT0gJ1wnJyB8fCBjID09ICd7JyB8fAorICAgICAgICAgIGMgPT0gJ30nIHx8IGMgPT0gJ1snIHx8IGMgPT0gJ10nIHx8IGMgPT0gJzonIHx8IGMgPT0gJywnKTsKK30KKworaW5saW5lIHZvaWQgUmVwbGFjZUludmFsaWRDb2RlUG9pbnRzKFN0cmluZ1BpZWNlIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmVwbGFjZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGRzdCkgeworICB3aGlsZSAoIXN0ci5lbXB0eSgpKSB7CisgICAgaW50IG5fdmFsaWRfYnl0ZXMgPSBpbnRlcm5hbDo6VVRGOFNwblN0cnVjdHVyYWxseVZhbGlkKHN0cik7CisgICAgU3RyaW5nUGllY2UgdmFsaWRfcGFydCA9IHN0ci5zdWJzdHIoMCwgbl92YWxpZF9ieXRlcyk7CisgICAgU3RyQXBwZW5kKGRzdCwgdmFsaWRfcGFydCk7CisKKyAgICBpZiAobl92YWxpZF9ieXRlcyA9PSBzdHIuc2l6ZSgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBBcHBlbmQgcmVwbGFjZW1lbnQgdmFsdWUuCisgICAgU3RyQXBwZW5kKGRzdCwgcmVwbGFjZW1lbnQpOworCisgICAgLy8gTW92ZSBwYXN0IHZhbGlkIGJ5dGVzICsgb25lIGludmFsaWQgYnl0ZS4KKyAgICBzdHIucmVtb3ZlX3ByZWZpeChuX3ZhbGlkX2J5dGVzICsgMSk7CisgIH0KK30KKworc3RhdGljIGJvb2wgQ29uc3VtZUtleShTdHJpbmdQaWVjZSogaW5wdXQsIFN0cmluZ1BpZWNlKiBrZXkpIHsKKyAgaWYgKGlucHV0LT5lbXB0eSgpIHx8ICFJc0xldHRlcigoKmlucHV0KVswXSkpIHJldHVybiBmYWxzZTsKKyAgaW50IGxlbiA9IDE7CisgIGZvciAoOyBsZW4gPCBpbnB1dC0+c2l6ZSgpOyArK2xlbikgeworICAgIGlmICghSXNBbHBoYW51bWVyaWMoKCppbnB1dClbbGVuXSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAqa2V5ID0gU3RyaW5nUGllY2UoaW5wdXQtPmRhdGEoKSwgbGVuKTsKKyAgKmlucHV0ID0gU3RyaW5nUGllY2UoaW5wdXQtPmRhdGEoKSArIGxlbiwgaW5wdXQtPnNpemUoKSAtIGxlbik7CisgIHJldHVybiB0cnVlOworfQorCisvLyBTYW1lIGFzICdDb25zdW1lS2V5JywgYnV0IGFsbG93cyBhIHdpZGVuZWQgc2V0IG9mIGtleSBjaGFyYWN0ZXJzLgorc3RhdGljIGJvb2wgQ29uc3VtZUtleVBlcm1pc3NpdmUoU3RyaW5nUGllY2UqIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UqIGtleSkgeworICBpZiAoaW5wdXQtPmVtcHR5KCkgfHwgIUlzTGV0dGVyKCgqaW5wdXQpWzBdKSkgcmV0dXJuIGZhbHNlOworICBpbnQgbGVuID0gMTsKKyAgZm9yICg7IGxlbiA8IGlucHV0LT5zaXplKCk7ICsrbGVuKSB7CisgICAgaWYgKElzS2V5U2VwYXJhdG9yKCgqaW5wdXQpW2xlbl0pKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgKmtleSA9IFN0cmluZ1BpZWNlKGlucHV0LT5kYXRhKCksIGxlbik7CisgICppbnB1dCA9IFN0cmluZ1BpZWNlKGlucHV0LT5kYXRhKCkgKyBsZW4sIGlucHV0LT5zaXplKCkgLSBsZW4pOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgTWF0Y2hLZXkoU3RyaW5nUGllY2UgaW5wdXQpIHsKKyAgcmV0dXJuICFpbnB1dC5lbXB0eSgpICYmIElzTGV0dGVyKGlucHV0WzBdKTsKK30KKworSnNvblN0cmVhbVBhcnNlcjo6SnNvblN0cmVhbVBhcnNlcihPYmplY3RXcml0ZXIqIG93KQorICAgIDogb3dfKG93KSwKKyAgICAgIHN0YWNrXygpLAorICAgICAgbGVmdG92ZXJfKCksCisgICAgICBqc29uXygpLAorICAgICAgcF8oKSwKKyAgICAgIGtleV8oKSwKKyAgICAgIGtleV9zdG9yYWdlXygpLAorICAgICAgZmluaXNoaW5nXyhmYWxzZSksCisgICAgICBzZWVuX25vbl93aGl0ZXNwYWNlXyhmYWxzZSksCisgICAgICBhbGxvd19ub19yb290X2VsZW1lbnRfKGZhbHNlKSwKKyAgICAgIHBhcnNlZF8oKSwKKyAgICAgIHBhcnNlZF9zdG9yYWdlXygpLAorICAgICAgc3RyaW5nX29wZW5fKDApLAorICAgICAgY2h1bmtfc3RvcmFnZV8oKSwKKyAgICAgIGNvZXJjZV90b191dGY4XyhmYWxzZSksCisgICAgICB1dGY4X3JlcGxhY2VtZW50X2NoYXJhY3Rlcl8oIiAiKSwKKyAgICAgIGFsbG93X2VtcHR5X251bGxfKGZhbHNlKSwKKyAgICAgIGFsbG93X3Blcm1pc3NpdmVfa2V5X25hbWluZ18oZmFsc2UpLAorICAgICAgbG9vc2VfZmxvYXRfbnVtYmVyX2NvbnZlcnNpb25fKGZhbHNlKSwKKyAgICAgIHJlY3Vyc2lvbl9kZXB0aF8oMCksCisgICAgICBtYXhfcmVjdXJzaW9uX2RlcHRoXyhrRGVmYXVsdE1heFJlY3Vyc2lvbkRlcHRoKSB7CisgIC8vIEluaXRpYWxpemUgdGhlIHN0YWNrIHdpdGggYSBzaW5nbGUgdmFsdWUgdG8gYmUgcGFyc2VkLgorICBzdGFja18ucHVzaChWQUxVRSk7Cit9CisKK0pzb25TdHJlYW1QYXJzZXI6On5Kc29uU3RyZWFtUGFyc2VyKCkge30KKworCit1dGlsOjpTdGF0dXMgSnNvblN0cmVhbVBhcnNlcjo6UGFyc2UoU3RyaW5nUGllY2UganNvbikgeworICBTdHJpbmdQaWVjZSBjaHVuayA9IGpzb247CisgIC8vIElmIHdlIGhhdmUgbGVmdG92ZXJzIGZyb20gYSBwcmV2aW91cyBjaHVuaywgYXBwZW5kIHRoZSBuZXcgY2h1bmsgdG8gaXQKKyAgLy8gYW5kIGNyZWF0ZSBhIG5ldyBTdHJpbmdQaWVjZSBwb2ludGluZyBhdCB0aGUgc3RyaW5nJ3MgZGF0YS4gVGhpcyBjb3VsZAorICAvLyBiZSBsYXJnZSBidXQgd2UgcmVseSBvbiB0aGUgY2h1bmtzIHRvIGJlIHNtYWxsLCBhc3N1bWluZyB0aGV5IGFyZQorICAvLyBmcmFnbWVudHMgb2YgYSBDb3JkLgorICBpZiAoIWxlZnRvdmVyXy5lbXB0eSgpKSB7CisgICAgLy8gRG9uJ3QgcG9pbnQgY2h1bmsgdG8gbGVmdG92ZXJfIGJlY2F1c2UgbGVmdG92ZXJfIHdpbGwgYmUgdXBkYXRlZCBpbgorICAgIC8vIFBhcnNlQ2h1bmsoY2h1bmspLgorICAgIGNodW5rX3N0b3JhZ2VfLnN3YXAobGVmdG92ZXJfKTsKKyAgICBTdHJBcHBlbmQoJmNodW5rX3N0b3JhZ2VfLCBqc29uKTsKKyAgICBjaHVuayA9IFN0cmluZ1BpZWNlKGNodW5rX3N0b3JhZ2VfKTsKKyAgfQorCisgIC8vIEZpbmQgdGhlIHN0cnVjdHVyYWxseSB2YWxpZCBVVEY4IHByZWZpeCBhbmQgcGFyc2Ugb25seSB0aGF0LgorICBpbnQgbiA9IGludGVybmFsOjpVVEY4U3BuU3RydWN0dXJhbGx5VmFsaWQoY2h1bmspOworICBpZiAobiA+IDApIHsKKyAgICB1dGlsOjpTdGF0dXMgc3RhdHVzID0gUGFyc2VDaHVuayhjaHVuay5zdWJzdHIoMCwgbikpOworCisgICAgLy8gQW55IGxlZnRvdmVyIGNoYXJhY3RlcnMgYXJlIHN0YXNoZWQgaW4gbGVmdG92ZXJfIGZvciBsYXRlciBwYXJzaW5nIHdoZW4KKyAgICAvLyB0aGVyZSBpcyBtb3JlIGRhdGEgYXZhaWxhYmxlLgorICAgIFN0ckFwcGVuZCgmbGVmdG92ZXJfLCBjaHVuay5zdWJzdHIobikpOworICAgIHJldHVybiBzdGF0dXM7CisgIH0gZWxzZSB7CisgICAgbGVmdG92ZXJfLmFzc2lnbihjaHVuay5kYXRhKCksIGNodW5rLnNpemUoKSk7CisgICAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworICB9Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uU3RyZWFtUGFyc2VyOjpGaW5pc2hQYXJzZSgpIHsKKyAgLy8gSWYgd2UgZG8gbm90IGV4cGVjdCBhbnl0aGluZyBhbmQgdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIHBhcnNlIHdlJ3JlIGFsbAorICAvLyBkb25lLgorICBpZiAoc3RhY2tfLmVtcHR5KCkgJiYgbGVmdG92ZXJfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7CisgIH0KKworICAvLyBMaWZldGltZSBuZWVkcyB0byBsYXN0IHVudGlsIFJ1blBhcnNlciByZXR1cm5zLCBzbyBrZWVwIHRoaXMgdmFyaWFibGUKKyAgLy8gb3V0c2lkZSBvZiB0aGUgY29lcmNlX3RvX3V0ZjggYmxvY2suCisgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gc2NyYXRjaDsKKworICBib29sIGlzX3ZhbGlkX3V0ZjggPSBpbnRlcm5hbDo6SXNTdHJ1Y3R1cmFsbHlWYWxpZFVURjgobGVmdG92ZXJfKTsKKyAgaWYgKGNvZXJjZV90b191dGY4XyAmJiAhaXNfdmFsaWRfdXRmOCkgeworICAgIHNjcmF0Y2gucmVzZXQobmV3IHN0ZDo6c3RyaW5nKTsKKyAgICBzY3JhdGNoLT5yZXNlcnZlKGxlZnRvdmVyXy5zaXplKCkgKiB1dGY4X3JlcGxhY2VtZW50X2NoYXJhY3Rlcl8uc2l6ZSgpKTsKKyAgICBSZXBsYWNlSW52YWxpZENvZGVQb2ludHMobGVmdG92ZXJfLCB1dGY4X3JlcGxhY2VtZW50X2NoYXJhY3Rlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2guZ2V0KCkpOworICAgIHBfID0ganNvbl8gPSAqc2NyYXRjaDsKKyAgfSBlbHNlIHsKKyAgICBwXyA9IGpzb25fID0gbGVmdG92ZXJfOworICAgIGlmICghaXNfdmFsaWRfdXRmOCkgeworICAgICAgcmV0dXJuIFJlcG9ydEZhaWx1cmUoIkVuY291bnRlcmVkIG5vbiBVVEYtOCBjb2RlIHBvaW50cy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6Ok5PTl9VVEZfOCk7CisgICAgfQorICB9CisKKyAgLy8gUGFyc2UgdGhlIHJlbWFpbmRlciBpbiBmaW5pc2hpbmcgbW9kZSwgd2hpY2ggcmVwb3J0cyBlcnJvcnMgZm9yIHRoaW5ncyBsaWtlCisgIC8vIHVudGVybWluYXRlZCBzdHJpbmdzIG9yIHVua25vd24gdG9rZW5zIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgcmV0cmllZC4KKyAgZmluaXNoaW5nXyA9IHRydWU7CisgIHV0aWw6OlN0YXR1cyByZXN1bHQgPSBSdW5QYXJzZXIoKTsKKyAgaWYgKHJlc3VsdC5vaygpKSB7CisgICAgU2tpcFdoaXRlc3BhY2UoKTsKKyAgICBpZiAoIXBfLmVtcHR5KCkpIHsKKyAgICAgIHJlc3VsdCA9CisgICAgICAgICAgUmVwb3J0RmFpbHVyZSgiUGFyc2luZyB0ZXJtaW5hdGVkIGJlZm9yZSBlbmQgb2YgaW5wdXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpQQVJTSU5HX1RFUk1JTkFURURfQkVGT1JFX0VORF9PRl9JTlBVVCk7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uU3RyZWFtUGFyc2VyOjpQYXJzZUNodW5rKFN0cmluZ1BpZWNlIGNodW5rKSB7CisgIC8vIERvIG5vdCBkbyBhbnkgd29yayBpZiB0aGUgY2h1bmsgaXMgZW1wdHkuCisgIGlmIChjaHVuay5lbXB0eSgpKSByZXR1cm4gdXRpbDo6U3RhdHVzKCk7CisKKyAgcF8gPSBqc29uXyA9IGNodW5rOworCisgIGZpbmlzaGluZ18gPSBmYWxzZTsKKyAgdXRpbDo6U3RhdHVzIHJlc3VsdCA9IFJ1blBhcnNlcigpOworICBpZiAoIXJlc3VsdC5vaygpKSByZXR1cm4gcmVzdWx0OworCisgIFNraXBXaGl0ZXNwYWNlKCk7CisgIGlmIChwXy5lbXB0eSgpKSB7CisgICAgLy8gSWYgd2UgcGFyc2VkIGV2ZXJ5dGhpbmcgd2UgaGFkLCBjbGVhciB0aGUgbGVmdG92ZXIuCisgICAgbGVmdG92ZXJfLmNsZWFyKCk7CisgIH0gZWxzZSB7CisgICAgLy8gSWYgd2UgZG8gbm90IGV4cGVjdCBhbnl0aGluZyBpLmUuIHN0YWNrIGlzIGVtcHR5LCBhbmQgd2UgaGF2ZSBub24tZW1wdHkKKyAgICAvLyBzdHJpbmcgbGVmdCB0byBwYXJzZSwgd2UgcmVwb3J0IGFuIGVycm9yLgorICAgIGlmIChzdGFja18uZW1wdHkoKSkgeworICAgICAgcmV0dXJuIFJlcG9ydEZhaWx1cmUoCisgICAgICAgICAgIlBhcnNpbmcgdGVybWluYXRlZCBiZWZvcmUgZW5kIG9mIGlucHV0LiIsCisgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OlBBUlNJTkdfVEVSTUlOQVRFRF9CRUZPUkVfRU5EX09GX0lOUFVUKTsKKyAgICB9CisgICAgLy8gSWYgd2UgZXhwZWN0IGZ1dHVyZSBkYXRhIGkuZS4gc3RhY2sgaXMgbm9uLWVtcHR5LCBhbmQgd2UgaGF2ZSBzb21lCisgICAgLy8gdW5wYXJzZWQgZGF0YSBsZWZ0LCB3ZSBzYXZlIGl0IGZvciBsYXRlciBwYXJzZS4KKyAgICBsZWZ0b3Zlcl8gPSBzdGQ6OnN0cmluZyhwXyk7CisgIH0KKyAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworfQorCitib29sIEpzb25TdHJlYW1QYXJzZXI6OklzSW5wdXRBbGxXaGl0ZVNwYWNlcyhUb2tlblR5cGUgdHlwZSkgeworICAvLyBDb25jbHVkZSB0aGUgd2hvbGUgaW5wdXQgaXMgZnVsbCBvZiB3aGl0ZSBzcGFjZXMgYnk6CisgIC8vIC0gaXQgaXMgYXQgdGhlIGZpbmlzaGluZyBzdGFnZQorICAvLyAtIHdlIGhhdmUgcnVuIG91dCBvZiB0aGUgaW5wdXQgZGF0YQorICAvLyAtIGhhdmVuJ3Qgc2VlbiBub24td2hpdGVzcGFjZSBjaGFyIHNvIGZhcgorICBpZiAoZmluaXNoaW5nXyAmJiBwXy5lbXB0eSgpICYmIHR5cGUgPT0gVU5LTk9XTiAmJiAhc2Vlbl9ub25fd2hpdGVzcGFjZV8pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uU3RyZWFtUGFyc2VyOjpSdW5QYXJzZXIoKSB7CisgIHdoaWxlICghc3RhY2tfLmVtcHR5KCkpIHsKKyAgICBQYXJzZVR5cGUgdHlwZSA9IHN0YWNrXy50b3AoKTsKKyAgICBUb2tlblR5cGUgdCA9IChzdHJpbmdfb3Blbl8gPT0gMCkgPyBHZXROZXh0VG9rZW5UeXBlKCkgOiBCRUdJTl9TVFJJTkc7CisgICAgc3RhY2tfLnBvcCgpOworICAgIHV0aWw6OlN0YXR1cyByZXN1bHQ7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIFZBTFVFOgorICAgICAgICBpZiAoYWxsb3dfbm9fcm9vdF9lbGVtZW50XyAmJiBJc0lucHV0QWxsV2hpdGVTcGFjZXModCkpIHsKKyAgICAgICAgICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gUGFyc2VWYWx1ZSh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgT0JKX01JRDoKKyAgICAgICAgcmVzdWx0ID0gUGFyc2VPYmplY3RNaWQodCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEVOVFJZOgorICAgICAgICByZXN1bHQgPSBQYXJzZUVudHJ5KHQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBFTlRSWV9NSUQ6CisgICAgICAgIHJlc3VsdCA9IFBhcnNlRW50cnlNaWQodCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEFSUkFZX1ZBTFVFOgorICAgICAgICByZXN1bHQgPSBQYXJzZUFycmF5VmFsdWUodCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEFSUkFZX01JRDoKKyAgICAgICAgcmVzdWx0ID0gUGFyc2VBcnJheU1pZCh0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJlc3VsdCA9CisgICAgICAgICAgICB1dGlsOjpJbnRlcm5hbEVycm9yKFN0ckNhdCgiVW5rbm93biBwYXJzZSB0eXBlOiAiLCB0eXBlKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIXJlc3VsdC5vaygpKSB7CisgICAgICAvLyBJZiB3ZSB3ZXJlIGNhbmNlbGxlZCwgc2F2ZSBvdXIgc3RhdGUgYW5kIHRyeSBhZ2FpbiBsYXRlci4KKyAgICAgIGlmICghZmluaXNoaW5nXyAmJiB1dGlsOjpJc0NhbmNlbGxlZChyZXN1bHQpKSB7CisgICAgICAgIHN0YWNrXy5wdXNoKHR5cGUpOworICAgICAgICAvLyBJZiB3ZSBoYXZlIGEga2V5IHdlIHN0aWxsIG5lZWQgdG8gcmVuZGVyLCBtYWtlIHN1cmUgdG8gc2F2ZSBvZmYgdGhlCisgICAgICAgIC8vIGNvbnRlbnRzIGluIG91ciBvd24gc3RvcmFnZS4KKyAgICAgICAgaWYgKCFrZXlfLmVtcHR5KCkgJiYga2V5X3N0b3JhZ2VfLmVtcHR5KCkpIHsKKyAgICAgICAgICBTdHJBcHBlbmQoJmtleV9zdG9yYWdlXywga2V5Xyk7CisgICAgICAgICAga2V5XyA9IFN0cmluZ1BpZWNlKGtleV9zdG9yYWdlXyk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gdXRpbDo6U3RhdHVzKCk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgfQorICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uU3RyZWFtUGFyc2VyOjpQYXJzZVZhbHVlKFRva2VuVHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQkVHSU5fT0JKRUNUOgorICAgICAgcmV0dXJuIEhhbmRsZUJlZ2luT2JqZWN0KCk7CisgICAgY2FzZSBCRUdJTl9BUlJBWToKKyAgICAgIHJldHVybiBIYW5kbGVCZWdpbkFycmF5KCk7CisgICAgY2FzZSBCRUdJTl9TVFJJTkc6CisgICAgICByZXR1cm4gUGFyc2VTdHJpbmcoKTsKKyAgICBjYXNlIEJFR0lOX05VTUJFUjoKKyAgICAgIHJldHVybiBQYXJzZU51bWJlcigpOworICAgIGNhc2UgQkVHSU5fVFJVRToKKyAgICAgIHJldHVybiBQYXJzZVRydWUoKTsKKyAgICBjYXNlIEJFR0lOX0ZBTFNFOgorICAgICAgcmV0dXJuIFBhcnNlRmFsc2UoKTsKKyAgICBjYXNlIEJFR0lOX05VTEw6CisgICAgICByZXR1cm4gUGFyc2VOdWxsKCk7CisgICAgY2FzZSBVTktOT1dOOgorICAgICAgcmV0dXJuIFJlcG9ydFVua25vd24oIkV4cGVjdGVkIGEgdmFsdWUuIiwgUGFyc2VFcnJvclR5cGU6OkVYUEVDVEVEX1ZBTFVFKTsKKyAgICBkZWZhdWx0OiB7CisgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGhhdmluZyBiZWVuIGN1dCBvZmYgd2hpbGUgcGFyc2luZywgd2FpdCBmb3IgbW9yZSBkYXRhLgorICAgICAgLy8gVGhpcyBoYW5kbGVzIHRoaW5ncyBsaWtlICdmYWxzJyBiZWluZyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHdlCisgICAgICAvLyBkb24ndCBrbm93IGlmIHRoZSBuZXh0IGNoYXIgd291bGQgYmUgZSwgY29tcGxldGluZyBpdCwgb3Igc29tZXRoaW5nCisgICAgICAvLyBlbHNlLCBtYWtpbmcgaXQgaW52YWxpZC4KKyAgICAgIGlmICghZmluaXNoaW5nXyAmJiBwXy5sZW5ndGgoKSA8IGtLZXl3b3JkRmFsc2UubGVuZ3RoKCkpIHsKKyAgICAgICAgcmV0dXJuIHV0aWw6OkNhbmNlbGxlZEVycm9yKCIiKTsKKyAgICAgIH0KKworICAgICAgaWYgKGFsbG93X2VtcHR5X251bGxfICYmIElzRW1wdHlOdWxsQWxsb3dlZCh0eXBlKSkgeworICAgICAgICByZXR1cm4gUGFyc2VFbXB0eU51bGwoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBSZXBvcnRGYWlsdXJlKCJVbmV4cGVjdGVkIHRva2VuLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6VU5FWFBFQ1RFRF9UT0tFTik7CisgICAgfQorICB9Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uU3RyZWFtUGFyc2VyOjpQYXJzZVN0cmluZygpIHsKKyAgdXRpbDo6U3RhdHVzIHJlc3VsdCA9IFBhcnNlU3RyaW5nSGVscGVyKCk7CisgIGlmIChyZXN1bHQub2soKSkgeworICAgIG93Xy0+UmVuZGVyU3RyaW5nKGtleV8sIHBhcnNlZF8pOworICAgIGtleV8gPSBTdHJpbmdQaWVjZSgpOworICAgIHBhcnNlZF8gPSBTdHJpbmdQaWVjZSgpOworICAgIHBhcnNlZF9zdG9yYWdlXy5jbGVhcigpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uU3RyZWFtUGFyc2VyOjpQYXJzZVN0cmluZ0hlbHBlcigpIHsKKyAgLy8gSWYgd2UgaGF2ZW4ndCBzZWVuIHRoZSBzdGFydCBxdW90ZSwgZ3JhYiBpdCBhbmQgcmVtZW1iZXIgaXQgZm9yIGxhdGVyLgorICBpZiAoc3RyaW5nX29wZW5fID09IDApIHsKKyAgICBzdHJpbmdfb3Blbl8gPSAqcF8uZGF0YSgpOworICAgIEdPT0dMRV9EQ0hFQ0soc3RyaW5nX29wZW5fID09ICdcIicgfHwgc3RyaW5nX29wZW5fID09ICdcJycpOworICAgIEFkdmFuY2UoKTsKKyAgfQorICAvLyBUcmFjayB3aGVyZSB3ZSBsYXN0IGNvcGllZCBkYXRhIGZyb20gc28gd2UgY2FuIG1pbmltaXplIGNvcHlpbmcuCisgIGNvbnN0IGNoYXIqIGxhc3QgPSBwXy5kYXRhKCk7CisgIHdoaWxlICghcF8uZW1wdHkoKSkgeworICAgIGNvbnN0IGNoYXIqIGRhdGEgPSBwXy5kYXRhKCk7CisgICAgaWYgKCpkYXRhID09ICdcXCcpIHsKKyAgICAgIC8vIFdlJ3JlIGFib3V0IHRvIGhhbmRsZSBhbiBlc2NhcGUsIGNvcHkgYWxsIGJ5dGVzIGZyb20gbGFzdCB0byBkYXRhLgorICAgICAgaWYgKGxhc3QgPCBkYXRhKSB7CisgICAgICAgIHBhcnNlZF9zdG9yYWdlXy5hcHBlbmQobGFzdCwgZGF0YSAtIGxhc3QpOworICAgICAgfQorICAgICAgLy8gSWYgd2UgcmFuIG91dCBvZiBzdHJpbmcgYWZ0ZXIgdGhlIFwsIGNhbmNlbCBvciByZXBvcnQgYW4gZXJyb3IKKyAgICAgIC8vIGRlcGVuZGluZyBvbiBpZiB3ZSBleHBlY3QgbW9yZSBkYXRhIGxhdGVyLgorICAgICAgaWYgKHBfLmxlbmd0aCgpID09IDEpIHsKKyAgICAgICAgaWYgKCFmaW5pc2hpbmdfKSB7CisgICAgICAgICAgcmV0dXJuIHV0aWw6OkNhbmNlbGxlZEVycm9yKCIiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVwb3J0RmFpbHVyZSgiQ2xvc2luZyBxdW90ZSBleHBlY3RlZCBpbiBzdHJpbmcuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OkVYUEVDVEVEX0NMT1NJTkdfUVVPVEUpOworICAgICAgfQorICAgICAgLy8gUGFyc2UgYSB1bmljb2RlIGVzY2FwZSBpZiB3ZSBmb3VuZCBcdSBpbiB0aGUgc3RyaW5nLgorICAgICAgaWYgKGRhdGFbMV0gPT0gJ3UnKSB7CisgICAgICAgIHV0aWw6OlN0YXR1cyByZXN1bHQgPSBQYXJzZVVuaWNvZGVFc2NhcGUoKTsKKyAgICAgICAgaWYgKCFyZXN1bHQub2soKSkgeworICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gTW92ZSBsYXN0IHBvaW50ZXIgcGFzdCB0aGUgdW5pY29kZSBlc2NhcGUgYW5kIGNvbnRpbnVlLgorICAgICAgICBsYXN0ID0gcF8uZGF0YSgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIC8vIEhhbmRsZSB0aGUgc3RhbmRhcmQgc2V0IG9mIGJhY2tzbGFzaC1lc2NhcGVkIGNoYXJhY3RlcnMuCisgICAgICBzd2l0Y2ggKGRhdGFbMV0pIHsKKyAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgcGFyc2VkX3N0b3JhZ2VfLnB1c2hfYmFjaygnXGInKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgcGFyc2VkX3N0b3JhZ2VfLnB1c2hfYmFjaygnXGYnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgcGFyc2VkX3N0b3JhZ2VfLnB1c2hfYmFjaygnXG4nKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgcGFyc2VkX3N0b3JhZ2VfLnB1c2hfYmFjaygnXHInKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgcGFyc2VkX3N0b3JhZ2VfLnB1c2hfYmFjaygnXHQnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgcGFyc2VkX3N0b3JhZ2VfLnB1c2hfYmFjaygnXHYnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBwYXJzZWRfc3RvcmFnZV8ucHVzaF9iYWNrKGRhdGFbMV0pOworICAgICAgfQorICAgICAgLy8gV2UgaGFuZGxlZCB0d28gY2hhcmFjdGVycywgc28gYWR2YW5jZSBwYXN0IHRoZW0gYW5kIGNvbnRpbnVlLgorICAgICAgcF8ucmVtb3ZlX3ByZWZpeCgyKTsKKyAgICAgIGxhc3QgPSBwXy5kYXRhKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLy8gSWYgd2UgZm91bmQgdGhlIGNsb3NpbmcgcXVvdGUgbm90ZSBpdCwgYWR2YW5jZSBwYXN0IGl0LCBhbmQgcmV0dXJuLgorICAgIGlmICgqZGF0YSA9PSBzdHJpbmdfb3Blbl8pIHsKKyAgICAgIC8vIElmIHdlIGRpZG4ndCBjb3B5IGFueXRoaW5nLCByZXVzZSB0aGUgaW5wdXQgYnVmZmVyLgorICAgICAgaWYgKHBhcnNlZF9zdG9yYWdlXy5lbXB0eSgpKSB7CisgICAgICAgIHBhcnNlZF8gPSBTdHJpbmdQaWVjZShsYXN0LCBkYXRhIC0gbGFzdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobGFzdCA8IGRhdGEpIHsKKyAgICAgICAgICBwYXJzZWRfc3RvcmFnZV8uYXBwZW5kKGxhc3QsIGRhdGEgLSBsYXN0KTsKKyAgICAgICAgfQorICAgICAgICBwYXJzZWRfID0gU3RyaW5nUGllY2UocGFyc2VkX3N0b3JhZ2VfKTsKKyAgICAgIH0KKyAgICAgIC8vIENsZWFyIHRoZSBxdW90ZSBjaGFyIHNvIG5leHQgdGltZSB3ZSB0cnkgdG8gcGFyc2UgYSBzdHJpbmcgd2UnbGwKKyAgICAgIC8vIHN0YXJ0IGZyZXNoLgorICAgICAgc3RyaW5nX29wZW5fID0gMDsKKyAgICAgIEFkdmFuY2UoKTsKKyAgICAgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKKyAgICB9CisgICAgLy8gTm9ybWFsIGNoYXJhY3RlciwganVzdCBhZHZhbmNlIHBhc3QgaXQuCisgICAgQWR2YW5jZSgpOworICB9CisgIC8vIElmIHdlIHJhbiBvdXQgb2YgY2hhcmFjdGVycywgY29weSBvdmVyIHdoYXQgd2UgaGF2ZSBzbyBmYXIuCisgIGlmIChsYXN0IDwgcF8uZGF0YSgpKSB7CisgICAgcGFyc2VkX3N0b3JhZ2VfLmFwcGVuZChsYXN0LCBwXy5kYXRhKCkgLSBsYXN0KTsKKyAgfQorICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCB0aGUgY2xvc2luZyBxdW90ZSBidXQgd2UgZXhwZWN0IG1vcmUgZGF0YSwgY2FuY2VsIGZvciBub3cKKyAgaWYgKCFmaW5pc2hpbmdfKSB7CisgICAgcmV0dXJuIHV0aWw6OkNhbmNlbGxlZEVycm9yKCIiKTsKKyAgfQorICAvLyBFbmQgb2Ygc3RyaW5nIHJlYWNoZWQgd2l0aG91dCBhIGNsb3NpbmcgcXVvdGUsIHJlcG9ydCBhbiBlcnJvci4KKyAgc3RyaW5nX29wZW5fID0gMDsKKyAgcmV0dXJuIFJlcG9ydEZhaWx1cmUoIkNsb3NpbmcgcXVvdGUgZXhwZWN0ZWQgaW4gc3RyaW5nLiIsCisgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9DTE9TSU5HX1FVT1RFKTsKK30KKworLy8gQ29udmVydHMgYSB1bmljb2RlIGVzY2FwZWQgY2hhcmFjdGVyIHRvIGEgZGVjaW1hbCB2YWx1ZSBzdG9yZWQgaW4gYSBjaGFyMzIKKy8vIGZvciB1c2UgaW4gVVRGOCBlbmNvZGluZyB1dGlsaXR5LiAgV2UgYXNzdW1lIHRoYXQgc3RyIGJlZ2lucyB3aXRoIFx1aGhoaCBhbmQKKy8vIGNvbnZlcnQgdGhhdCBmcm9tIHRoZSBoZXggbnVtYmVyIHRvIGEgZGVjaW1hbCB2YWx1ZS4KKy8vCisvLyBUaGVyZSBhcmUgc29tZSBzZWN1cml0eSBleHBsb2l0cyB3aXRoIFVURi04IHRoYXQgd2Ugc2hvdWxkIGJlIGNhcmVmdWwgb2Y6CisvLyAgIC0gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzYvI1VURi04X0V4cGxvaXQKKy8vICAgLSBodHRwOi8vc2l0ZXMvaW50bC1lbmcvZGVzaWduLWd1aWRlL2NvcmUtYXBwbGljYXRpb24KK3V0aWw6OlN0YXR1cyBKc29uU3RyZWFtUGFyc2VyOjpQYXJzZVVuaWNvZGVFc2NhcGUoKSB7CisgIGlmIChwXy5sZW5ndGgoKSA8IGtVbmljb2RlRXNjYXBlZExlbmd0aCkgeworICAgIGlmICghZmluaXNoaW5nXykgeworICAgICAgcmV0dXJuIHV0aWw6OkNhbmNlbGxlZEVycm9yKCIiKTsKKyAgICB9CisgICAgcmV0dXJuIFJlcG9ydEZhaWx1cmUoIklsbGVnYWwgaGV4IHN0cmluZy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpJTExFR0FMX0hFWF9TVFJJTkcpOworICB9CisgIEdPT0dMRV9EQ0hFQ0tfRVEoJ1xcJywgcF8uZGF0YSgpWzBdKTsKKyAgR09PR0xFX0RDSEVDS19FUSgndScsIHBfLmRhdGEoKVsxXSk7CisgIHVpbnQzMl90IGNvZGUgPSAwOworICBmb3IgKGludCBpID0gMjsgaSA8IGtVbmljb2RlRXNjYXBlZExlbmd0aDsgKytpKSB7CisgICAgaWYgKCFpc3hkaWdpdChwXy5kYXRhKClbaV0pKSB7CisgICAgICByZXR1cm4gUmVwb3J0RmFpbHVyZSgiSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpJTlZBTElEX0VTQ0FQRV9TRVFVRU5DRSk7CisgICAgfQorICAgIGNvZGUgPSAoY29kZSA8PCA0KSArIGhleF9kaWdpdF90b19pbnQocF8uZGF0YSgpW2ldKTsKKyAgfQorICBpZiAoY29kZSA+PSBKc29uRXNjYXBpbmc6OmtNaW5IaWdoU3Vycm9nYXRlICYmCisgICAgICBjb2RlIDw9IEpzb25Fc2NhcGluZzo6a01heEhpZ2hTdXJyb2dhdGUpIHsKKyAgICBpZiAocF8ubGVuZ3RoKCkgPCAyICoga1VuaWNvZGVFc2NhcGVkTGVuZ3RoKSB7CisgICAgICBpZiAoIWZpbmlzaGluZ18pIHsKKyAgICAgICAgcmV0dXJuIHV0aWw6OkNhbmNlbGxlZEVycm9yKCIiKTsKKyAgICAgIH0KKyAgICAgIGlmICghY29lcmNlX3RvX3V0ZjhfKSB7CisgICAgICAgIHJldHVybiBSZXBvcnRGYWlsdXJlKCJNaXNzaW5nIGxvdyBzdXJyb2dhdGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6Ok1JU1NJTkdfTE9XX1NVUlJPR0FURSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChwXy5kYXRhKClba1VuaWNvZGVFc2NhcGVkTGVuZ3RoXSA9PSAnXFwnICYmCisgICAgICAgICAgICAgICBwXy5kYXRhKClba1VuaWNvZGVFc2NhcGVkTGVuZ3RoICsgMV0gPT0gJ3UnKSB7CisgICAgICB1aW50MzJfdCBsb3dfY29kZSA9IDA7CisgICAgICBmb3IgKGludCBpID0ga1VuaWNvZGVFc2NhcGVkTGVuZ3RoICsgMjsgaSA8IDIgKiBrVW5pY29kZUVzY2FwZWRMZW5ndGg7CisgICAgICAgICAgICsraSkgeworICAgICAgICBpZiAoIWlzeGRpZ2l0KHBfLmRhdGEoKVtpXSkpIHsKKyAgICAgICAgICByZXR1cm4gUmVwb3J0RmFpbHVyZSgiSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6SU5WQUxJRF9FU0NBUEVfU0VRVUVOQ0UpOworICAgICAgICB9CisgICAgICAgIGxvd19jb2RlID0gKGxvd19jb2RlIDw8IDQpICsgaGV4X2RpZ2l0X3RvX2ludChwXy5kYXRhKClbaV0pOworICAgICAgfQorICAgICAgaWYgKGxvd19jb2RlID49IEpzb25Fc2NhcGluZzo6a01pbkxvd1N1cnJvZ2F0ZSAmJgorICAgICAgICAgIGxvd19jb2RlIDw9IEpzb25Fc2NhcGluZzo6a01heExvd1N1cnJvZ2F0ZSkgeworICAgICAgICAvLyBDb252ZXJ0IFVURi0xNiBzdXJyb2dhdGUgcGFpciB0byAyMS1iaXQgVW5pY29kZSBjb2RlcG9pbnQuCisgICAgICAgIGNvZGUgPSAoKChjb2RlICYgMHgzRkYpIDw8IDEwKSB8IChsb3dfY29kZSAmIDB4M0ZGKSkgKworICAgICAgICAgICAgICAgSnNvbkVzY2FwaW5nOjprTWluU3VwcGxlbWVudGFyeUNvZGVQb2ludDsKKyAgICAgICAgLy8gQWR2YW5jZSBwYXN0IHRoZSBmaXJzdCBjb2RlIHVuaXQgZXNjYXBlLgorICAgICAgICBwXy5yZW1vdmVfcHJlZml4KGtVbmljb2RlRXNjYXBlZExlbmd0aCk7CisgICAgICB9IGVsc2UgaWYgKCFjb2VyY2VfdG9fdXRmOF8pIHsKKyAgICAgICAgcmV0dXJuIFJlcG9ydEZhaWx1cmUoIkludmFsaWQgbG93IHN1cnJvZ2F0ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6SU5WQUxJRF9MT1dfU1VSUk9HQVRFKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFjb2VyY2VfdG9fdXRmOF8pIHsKKyAgICAgIHJldHVybiBSZXBvcnRGYWlsdXJlKCJNaXNzaW5nIGxvdyBzdXJyb2dhdGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpNSVNTSU5HX0xPV19TVVJST0dBVEUpOworICAgIH0KKyAgfQorICBpZiAoIWNvZXJjZV90b191dGY4XyAmJiAhSXNWYWxpZENvZGVQb2ludChjb2RlKSkgeworICAgIHJldHVybiBSZXBvcnRGYWlsdXJlKCJJbnZhbGlkIHVuaWNvZGUgY29kZSBwb2ludC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpJTlZBTElEX1VOSUNPREUpOworICB9CisgIGNoYXIgYnVmW1VURm1heF07CisgIGludCBsZW4gPSBFbmNvZGVBc1VURjhDaGFyKGNvZGUsIGJ1Zik7CisgIC8vIEFkdmFuY2UgcGFzdCB0aGUgW2ZpbmFsXSBjb2RlIHVuaXQgZXNjYXBlLgorICBwXy5yZW1vdmVfcHJlZml4KGtVbmljb2RlRXNjYXBlZExlbmd0aCk7CisgIHBhcnNlZF9zdG9yYWdlXy5hcHBlbmQoYnVmLCBsZW4pOworICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uU3RyZWFtUGFyc2VyOjpQYXJzZU51bWJlcigpIHsKKyAgTnVtYmVyUmVzdWx0IG51bWJlcjsKKyAgdXRpbDo6U3RhdHVzIHJlc3VsdCA9IFBhcnNlTnVtYmVySGVscGVyKCZudW1iZXIpOworICBpZiAocmVzdWx0Lm9rKCkpIHsKKyAgICBzd2l0Y2ggKG51bWJlci50eXBlKSB7CisgICAgICBjYXNlIE51bWJlclJlc3VsdDo6RE9VQkxFOgorICAgICAgICBvd18tPlJlbmRlckRvdWJsZShrZXlfLCBudW1iZXIuZG91YmxlX3ZhbCk7CisgICAgICAgIGtleV8gPSBTdHJpbmdQaWVjZSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBOdW1iZXJSZXN1bHQ6OklOVDoKKyAgICAgICAgb3dfLT5SZW5kZXJJbnQ2NChrZXlfLCBudW1iZXIuaW50X3ZhbCk7CisgICAgICAgIGtleV8gPSBTdHJpbmdQaWVjZSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBOdW1iZXJSZXN1bHQ6OlVJTlQ6CisgICAgICAgIG93Xy0+UmVuZGVyVWludDY0KGtleV8sIG51bWJlci51aW50X3ZhbCk7CisgICAgICAgIGtleV8gPSBTdHJpbmdQaWVjZSgpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFJlcG9ydEZhaWx1cmUoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OlVOQUJMRV9UT19QQVJTRV9OVU1CRVIpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit1dGlsOjpTdGF0dXMgSnNvblN0cmVhbVBhcnNlcjo6UGFyc2VEb3VibGVIZWxwZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJSZXN1bHQqIHJlc3VsdCkgeworICBpZiAoIXNhZmVfc3RydG9kKG51bWJlciwgJnJlc3VsdC0+ZG91YmxlX3ZhbCkpIHsKKyAgICByZXR1cm4gUmVwb3J0RmFpbHVyZSgiVW5hYmxlIHRvIHBhcnNlIG51bWJlci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpVTkFCTEVfVE9fUEFSU0VfTlVNQkVSKTsKKyAgfQorICBpZiAoIWxvb3NlX2Zsb2F0X251bWJlcl9jb252ZXJzaW9uXyAmJiAhc3RkOjppc2Zpbml0ZShyZXN1bHQtPmRvdWJsZV92YWwpKSB7CisgICAgcmV0dXJuIFJlcG9ydEZhaWx1cmUoIk51bWJlciBleGNlZWRzIHRoZSByYW5nZSBvZiBkb3VibGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6TlVNQkVSX0VYQ0VFRFNfUkFOR0VfRE9VQkxFKTsKKyAgfQorICByZXN1bHQtPnR5cGUgPSBOdW1iZXJSZXN1bHQ6OkRPVUJMRTsKKyAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworfQorCit1dGlsOjpTdGF0dXMgSnNvblN0cmVhbVBhcnNlcjo6UGFyc2VOdW1iZXJIZWxwZXIoTnVtYmVyUmVzdWx0KiByZXN1bHQpIHsKKyAgY29uc3QgY2hhciogZGF0YSA9IHBfLmRhdGEoKTsKKyAgaW50IGxlbmd0aCA9IHBfLmxlbmd0aCgpOworCisgIC8vIExvb2sgZm9yIHRoZSBmaXJzdCBub24tbnVtZXJpYyBjaGFyYWN0ZXIsIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAgaW50IGluZGV4ID0gMDsKKyAgYm9vbCBmbG9hdGluZyA9IGZhbHNlOworICBib29sIG5lZ2F0aXZlID0gZGF0YVtpbmRleF0gPT0gJy0nOworICAvLyBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdGhhdCBjYW5ub3QgYmUgcGFydCBvZiB0aGUgbnVtYmVyLiBBbG9uZyB0aGUgd2F5CisgIC8vIGRldGVjdCBpZiB0aGUgbnVtYmVyIG5lZWRzIHRvIGJlIHBhcnNlZCBhcyBhIGRvdWJsZS4KKyAgLy8gTm90ZSB0aGF0IHRoaXMgcmVzdHJpY3RzIG51bWJlcnMgdG8gdGhlIEpTT04gc3BlY2lmaWNhdGlvbiwgc28gZm9yIGV4YW1wbGUKKyAgLy8gd2UgZG8gbm90IHN1cHBvcnQgaGV4IG9yIG9jdGFsIG5vdGF0aW9ucy4KKyAgZm9yICg7IGluZGV4IDwgbGVuZ3RoOyArK2luZGV4KSB7CisgICAgY2hhciBjID0gZGF0YVtpbmRleF07CisgICAgaWYgKGlzZGlnaXQoYykpIGNvbnRpbnVlOworICAgIGlmIChjID09ICcuJyB8fCBjID09ICdlJyB8fCBjID09ICdFJykgeworICAgICAgZmxvYXRpbmcgPSB0cnVlOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChjID09ICcrJyB8fCBjID09ICctJyB8fCBjID09ICd4JykgY29udGludWU7CisgICAgLy8gTm90IGEgdmFsaWQgbnVtYmVyIGNoYXJhY3RlciwgYnJlYWsgb3V0LgorICAgIGJyZWFrOworICB9CisKKyAgLy8gSWYgdGhlIGVudGlyZSBpbnB1dCBpcyBhIHZhbGlkIG51bWJlciwgYW5kIHdlIG1heSBoYXZlIG1vcmUgY29udGVudCBpbiB0aGUKKyAgLy8gZnV0dXJlLCB3ZSBhYm9ydCBmb3Igbm93IGFuZCByZXN1bWUgd2hlbiB3ZSBrbm93IG1vcmUuCisgIGlmIChpbmRleCA9PSBsZW5ndGggJiYgIWZpbmlzaGluZ18pIHsKKyAgICByZXR1cm4gdXRpbDo6Q2FuY2VsbGVkRXJyb3IoIiIpOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc3RyaW5nIGNvbnRhaW5pbmcganVzdCB0aGUgbnVtYmVyLCBzbyB3ZSBjYW4gdXNlIHNhZmVfc3RydG9YCisgIHN0ZDo6c3RyaW5nIG51bWJlciA9IHN0ZDo6c3RyaW5nKHBfLnN1YnN0cigwLCBpbmRleCkpOworCisgIC8vIEZsb2F0aW5nIHBvaW50IG51bWJlciwgcGFyc2UgYXMgYSBkb3VibGUuCisgIGlmIChmbG9hdGluZykgeworICAgIHV0aWw6OlN0YXR1cyBzdGF0dXMgPSBQYXJzZURvdWJsZUhlbHBlcihudW1iZXIsIHJlc3VsdCk7CisgICAgaWYgKHN0YXR1cy5vaygpKSB7CisgICAgICBwXy5yZW1vdmVfcHJlZml4KGluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKKyAgfQorCisgIC8vIFBvc2l0aXZlIG5vbi1mbG9hdGluZyBwb2ludCBudW1iZXIsIHBhcnNlIGFzIGEgdWludDY0X3QuCisgIGlmICghbmVnYXRpdmUpIHsKKyAgICAvLyBPY3RhbC9IZXggbnVtYmVycyBhcmUgbm90IHZhbGlkIEpTT04gdmFsdWVzLgorICAgIGlmIChudW1iZXIubGVuZ3RoKCkgPj0gMiAmJiBudW1iZXJbMF0gPT0gJzAnKSB7CisgICAgICByZXR1cm4gUmVwb3J0RmFpbHVyZSgKKyAgICAgICAgICAiT2N0YWwvaGV4IG51bWJlcnMgYXJlIG5vdCB2YWxpZCBKU09OIHZhbHVlcy4iLAorICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpPQ1RBTF9PUl9IRVhfQVJFX05PVF9WQUxJRF9KU09OX1ZBTFVFUyk7CisgICAgfQorICAgIGlmIChzYWZlX3N0cnRvdTY0KG51bWJlciwgJnJlc3VsdC0+dWludF92YWwpKSB7CisgICAgICByZXN1bHQtPnR5cGUgPSBOdW1iZXJSZXN1bHQ6OlVJTlQ7CisgICAgICBwXy5yZW1vdmVfcHJlZml4KGluZGV4KTsKKyAgICAgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIHRvbyBsYXJnZSwgcGFyc2UgaXQgYXMgZG91YmxlLgorICAgICAgdXRpbDo6U3RhdHVzIHN0YXR1cyA9IFBhcnNlRG91YmxlSGVscGVyKG51bWJlciwgcmVzdWx0KTsKKyAgICAgIGlmIChzdGF0dXMub2soKSkgeworICAgICAgICBwXy5yZW1vdmVfcHJlZml4KGluZGV4KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICB9CisKKyAgLy8gT2N0YWwvSGV4IG51bWJlcnMgYXJlIG5vdCB2YWxpZCBKU09OIHZhbHVlcy4KKyAgaWYgKG51bWJlci5sZW5ndGgoKSA+PSAzICYmIG51bWJlclsxXSA9PSAnMCcpIHsKKyAgICByZXR1cm4gUmVwb3J0RmFpbHVyZSgKKyAgICAgICAgIk9jdGFsL2hleCBudW1iZXJzIGFyZSBub3QgdmFsaWQgSlNPTiB2YWx1ZXMuIiwKKyAgICAgICAgUGFyc2VFcnJvclR5cGU6Ok9DVEFMX09SX0hFWF9BUkVfTk9UX1ZBTElEX0pTT05fVkFMVUVTKTsKKyAgfQorICAvLyBOZWdhdGl2ZSBub24tZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBwYXJzZSBhcyBhbiBpbnQ2NF90LgorICBpZiAoc2FmZV9zdHJ0bzY0KG51bWJlciwgJnJlc3VsdC0+aW50X3ZhbCkpIHsKKyAgICByZXN1bHQtPnR5cGUgPSBOdW1iZXJSZXN1bHQ6OklOVDsKKyAgICBwXy5yZW1vdmVfcHJlZml4KGluZGV4KTsKKyAgICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7CisgIH0gZWxzZSB7CisgICAgLy8gSWYgdGhlIHZhbHVlIGlzIHRvbyBsYXJnZSwgcGFyc2UgaXQgYXMgZG91YmxlLgorICAgIHV0aWw6OlN0YXR1cyBzdGF0dXMgPSBQYXJzZURvdWJsZUhlbHBlcihudW1iZXIsIHJlc3VsdCk7CisgICAgaWYgKHN0YXR1cy5vaygpKSB7CisgICAgICBwXy5yZW1vdmVfcHJlZml4KGluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKKyAgfQorfQorCit1dGlsOjpTdGF0dXMgSnNvblN0cmVhbVBhcnNlcjo6SGFuZGxlQmVnaW5PYmplY3QoKSB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEoJ3snLCAqcF8uZGF0YSgpKTsKKyAgQWR2YW5jZSgpOworICBvd18tPlN0YXJ0T2JqZWN0KGtleV8pOworICBhdXRvIHN0YXR1cyA9IEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKGtleV8pOworICBpZiAoIXN0YXR1cy5vaygpKSB7CisgICAgcmV0dXJuIHN0YXR1czsKKyAgfQorICBrZXlfID0gU3RyaW5nUGllY2UoKTsKKyAgc3RhY2tfLnB1c2goRU5UUlkpOworICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uU3RyZWFtUGFyc2VyOjpQYXJzZU9iamVjdE1pZChUb2tlblR5cGUgdHlwZSkgeworICBpZiAodHlwZSA9PSBVTktOT1dOKSB7CisgICAgcmV0dXJuIFJlcG9ydFVua25vd24oIkV4cGVjdGVkICwgb3IgfSBhZnRlciBrZXk6dmFsdWUgcGFpci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9DT01NQV9PUl9CUkFDRVMpOworICB9CisKKyAgLy8gT2JqZWN0IGlzIGNvbXBsZXRlLCBhZHZhbmNlIHBhc3QgdGhlIGNvbW1hIGFuZCByZW5kZXIgdGhlIEVuZE9iamVjdC4KKyAgaWYgKHR5cGUgPT0gRU5EX09CSkVDVCkgeworICAgIEFkdmFuY2UoKTsKKyAgICBvd18tPkVuZE9iamVjdCgpOworICAgIC0tcmVjdXJzaW9uX2RlcHRoXzsKKyAgICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7CisgIH0KKyAgLy8gRm91bmQgYSBjb21tYSwgYWR2YW5jZSBwYXN0IGl0IGFuZCBnZXQgcmVhZHkgZm9yIGFuIGVudHJ5LgorICBpZiAodHlwZSA9PSBWQUxVRV9TRVBBUkFUT1IpIHsKKyAgICBBZHZhbmNlKCk7CisgICAgc3RhY2tfLnB1c2goRU5UUlkpOworICAgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKKyAgfQorICAvLyBJbGxlZ2FsIHRva2VuIGFmdGVyIGtleTp2YWx1ZSBwYWlyLgorICByZXR1cm4gUmVwb3J0RmFpbHVyZSgiRXhwZWN0ZWQgLCBvciB9IGFmdGVyIGtleTp2YWx1ZSBwYWlyLiIsCisgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9DT01NQV9PUl9CUkFDRVMpOworfQorCit1dGlsOjpTdGF0dXMgSnNvblN0cmVhbVBhcnNlcjo6UGFyc2VFbnRyeShUb2tlblR5cGUgdHlwZSkgeworICBpZiAodHlwZSA9PSBVTktOT1dOKSB7CisgICAgcmV0dXJuIFJlcG9ydFVua25vd24oIkV4cGVjdGVkIGFuIG9iamVjdCBrZXkgb3IgfS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9PQkpFQ1RfS0VZX09SX0JSQUNFUyk7CisgIH0KKworICAvLyBDbG9zZSB0aGUgb2JqZWN0IGFuZCByZXR1cm4uIFRoaXMgYWxsb3dzIGZvciB0cmFpbGluZyBjb21tYXMuCisgIGlmICh0eXBlID09IEVORF9PQkpFQ1QpIHsKKyAgICBvd18tPkVuZE9iamVjdCgpOworICAgIEFkdmFuY2UoKTsKKyAgICAtLXJlY3Vyc2lvbl9kZXB0aF87CisgICAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworICB9CisKKyAgdXRpbDo6U3RhdHVzIHJlc3VsdDsKKyAgaWYgKHR5cGUgPT0gQkVHSU5fU1RSSU5HKSB7CisgICAgLy8gS2V5IGlzIGEgc3RyaW5nIChzdGFuZGFyZCBKU09OKSwgcGFyc2UgaXQgYW5kIHN0b3JlIHRoZSBzdHJpbmcuCisgICAgcmVzdWx0ID0gUGFyc2VTdHJpbmdIZWxwZXIoKTsKKyAgICBpZiAocmVzdWx0Lm9rKCkpIHsKKyAgICAgIGtleV9zdG9yYWdlXy5jbGVhcigpOworICAgICAgaWYgKCFwYXJzZWRfc3RvcmFnZV8uZW1wdHkoKSkgeworICAgICAgICBwYXJzZWRfc3RvcmFnZV8uc3dhcChrZXlfc3RvcmFnZV8pOworICAgICAgICBrZXlfID0gU3RyaW5nUGllY2Uoa2V5X3N0b3JhZ2VfKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGtleV8gPSBwYXJzZWRfOworICAgICAgfQorICAgICAgcGFyc2VkXyA9IFN0cmluZ1BpZWNlKCk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUgPT0gQkVHSU5fS0VZKSB7CisgICAgLy8gS2V5IGlzIGEgYmFyZSBrZXkgKGJhY2sgY29tcGF0KSwgY3JlYXRlIGEgU3RyaW5nUGllY2UgcG9pbnRpbmcgdG8gaXQuCisgICAgcmVzdWx0ID0gUGFyc2VLZXkoKTsKKyAgfSBlbHNlIGlmICh0eXBlID09IEJFR0lOX05VTEwgfHwgdHlwZSA9PSBCRUdJTl9UUlVFIHx8IHR5cGUgPT0gQkVHSU5fRkFMU0UpIHsKKyAgICAvLyBLZXkgbWF5IGJlIGEgYmFyZSBrZXkgdGhhdCBiZWdpbnMgd2l0aCBhIHJlc2VydmVkIHdvcmQuCisgICAgcmVzdWx0ID0gUGFyc2VLZXkoKTsKKyAgICBpZiAocmVzdWx0Lm9rKCkgJiYgKGtleV8gPT0ga0tleXdvcmROdWxsIHx8IGtleV8gPT0ga0tleXdvcmRUcnVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBrZXlfID09IGtLZXl3b3JkRmFsc2UpKSB7CisgICAgICByZXN1bHQgPSBSZXBvcnRGYWlsdXJlKCJFeHBlY3RlZCBhbiBvYmplY3Qga2V5IG9yIH0uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OkVYUEVDVEVEX09CSkVDVF9LRVlfT1JfQlJBQ0VTKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gVW5rbm93biBrZXkgdHlwZSwgcmVwb3J0IGFuIGVycm9yLgorICAgIHJlc3VsdCA9IFJlcG9ydEZhaWx1cmUoIkV4cGVjdGVkIGFuIG9iamVjdCBrZXkgb3IgfS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OkVYUEVDVEVEX09CSkVDVF9LRVlfT1JfQlJBQ0VTKTsKKyAgfQorICAvLyBPbiBzdWNjZXNzIHdlIG5leHQgZXhwZWN0IGFuIGVudHJ5IG1pZCAnOicgdGhlbiBhbiBvYmplY3QgbWlkICcsJyBvciAnfScKKyAgaWYgKHJlc3VsdC5vaygpKSB7CisgICAgc3RhY2tfLnB1c2goT0JKX01JRCk7CisgICAgc3RhY2tfLnB1c2goRU5UUllfTUlEKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit1dGlsOjpTdGF0dXMgSnNvblN0cmVhbVBhcnNlcjo6UGFyc2VFbnRyeU1pZChUb2tlblR5cGUgdHlwZSkgeworICBpZiAodHlwZSA9PSBVTktOT1dOKSB7CisgICAgcmV0dXJuIFJlcG9ydFVua25vd24oIkV4cGVjdGVkIDogYmV0d2VlbiBrZXk6dmFsdWUgcGFpci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9DT0xPTik7CisgIH0KKyAgaWYgKHR5cGUgPT0gRU5UUllfU0VQQVJBVE9SKSB7CisgICAgQWR2YW5jZSgpOworICAgIHN0YWNrXy5wdXNoKFZBTFVFKTsKKyAgICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7CisgIH0KKyAgcmV0dXJuIFJlcG9ydEZhaWx1cmUoIkV4cGVjdGVkIDogYmV0d2VlbiBrZXk6dmFsdWUgcGFpci4iLAorICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6RVhQRUNURURfQ09MT04pOworfQorCit1dGlsOjpTdGF0dXMgSnNvblN0cmVhbVBhcnNlcjo6SGFuZGxlQmVnaW5BcnJheSgpIHsKKyAgR09PR0xFX0RDSEVDS19FUSgnWycsICpwXy5kYXRhKCkpOworICBBZHZhbmNlKCk7CisgIG93Xy0+U3RhcnRMaXN0KGtleV8pOworICBrZXlfID0gU3RyaW5nUGllY2UoKTsKKyAgc3RhY2tfLnB1c2goQVJSQVlfVkFMVUUpOworICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uU3RyZWFtUGFyc2VyOjpQYXJzZUFycmF5VmFsdWUoVG9rZW5UeXBlIHR5cGUpIHsKKyAgaWYgKHR5cGUgPT0gVU5LTk9XTikgeworICAgIHJldHVybiBSZXBvcnRVbmtub3duKCJFeHBlY3RlZCBhIHZhbHVlIG9yIF0gd2l0aGluIGFuIGFycmF5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OkVYUEVDVEVEX1ZBTFVFX09SX0JSQUNLRVQpOworICB9CisKKyAgaWYgKHR5cGUgPT0gRU5EX0FSUkFZKSB7CisgICAgb3dfLT5FbmRMaXN0KCk7CisgICAgQWR2YW5jZSgpOworICAgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKKyAgfQorCisgIC8vIFRoZSBQYXJzZVZhbHVlIGNhbGwgbWF5IHB1c2ggc29tZXRoaW5nIG9udG8gdGhlIHN0YWNrIHNvIHdlIG5lZWQgdG8gbWFrZQorICAvLyBzdXJlIGFuIEFSUkFZX01JRCBpcyBhZnRlciBpdCwgc28gd2UgcHVzaCBpdCBvbiBub3cuIEFsc28sIHRoZSBwYXJzaW5nIG9mCisgIC8vIGVtcHR5LW51bGwgYXJyYXkgdmFsdWUgaXMgcmVseWluZyBvbiB0aGlzIEFSUkFZX01JRCB0b2tlbi4KKyAgc3RhY2tfLnB1c2goQVJSQVlfTUlEKTsKKyAgdXRpbDo6U3RhdHVzIHJlc3VsdCA9IFBhcnNlVmFsdWUodHlwZSk7CisgIGlmICh1dGlsOjpJc0NhbmNlbGxlZChyZXN1bHQpKSB7CisgICAgLy8gSWYgd2Ugd2VyZSBjYW5jZWxsZWQsIHBvcCBiYWNrIG9mZiB0aGUgQVJSQVlfTUlEIHNvIHdlIGRvbid0IHRyeSB0bworICAgIC8vIHB1c2ggaXQgb24gYWdhaW4gd2hlbiB3ZSB0cnkgb3Zlci4KKyAgICBzdGFja18ucG9wKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordXRpbDo6U3RhdHVzIEpzb25TdHJlYW1QYXJzZXI6OlBhcnNlQXJyYXlNaWQoVG9rZW5UeXBlIHR5cGUpIHsKKyAgaWYgKHR5cGUgPT0gVU5LTk9XTikgeworICAgIHJldHVybiBSZXBvcnRVbmtub3duKCJFeHBlY3RlZCAsIG9yIF0gYWZ0ZXIgYXJyYXkgdmFsdWUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6RVhQRUNURURfQ09NTUFfT1JfQlJBQ0tFVCk7CisgIH0KKworICBpZiAodHlwZSA9PSBFTkRfQVJSQVkpIHsKKyAgICBvd18tPkVuZExpc3QoKTsKKyAgICBBZHZhbmNlKCk7CisgICAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworICB9CisKKyAgLy8gRm91bmQgYSBjb21tYSwgYWR2YW5jZSBwYXN0IGl0IGFuZCBleHBlY3QgYW4gYXJyYXkgdmFsdWUgbmV4dC4KKyAgaWYgKHR5cGUgPT0gVkFMVUVfU0VQQVJBVE9SKSB7CisgICAgQWR2YW5jZSgpOworICAgIHN0YWNrXy5wdXNoKEFSUkFZX1ZBTFVFKTsKKyAgICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7CisgIH0KKyAgLy8gSWxsZWdhbCB0b2tlbiBhZnRlciBhcnJheSB2YWx1ZS4KKyAgcmV0dXJuIFJlcG9ydEZhaWx1cmUoIkV4cGVjdGVkICwgb3IgXSBhZnRlciBhcnJheSB2YWx1ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6RVhQRUNURURfQ09NTUFfT1JfQlJBQ0tFVCk7Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uU3RyZWFtUGFyc2VyOjpQYXJzZVRydWUoKSB7CisgIG93Xy0+UmVuZGVyQm9vbChrZXlfLCB0cnVlKTsKKyAga2V5XyA9IFN0cmluZ1BpZWNlKCk7CisgIHBfLnJlbW92ZV9wcmVmaXgoa0tleXdvcmRUcnVlLmxlbmd0aCgpKTsKKyAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworfQorCit1dGlsOjpTdGF0dXMgSnNvblN0cmVhbVBhcnNlcjo6UGFyc2VGYWxzZSgpIHsKKyAgb3dfLT5SZW5kZXJCb29sKGtleV8sIGZhbHNlKTsKKyAga2V5XyA9IFN0cmluZ1BpZWNlKCk7CisgIHBfLnJlbW92ZV9wcmVmaXgoa0tleXdvcmRGYWxzZS5sZW5ndGgoKSk7CisgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKK30KKwordXRpbDo6U3RhdHVzIEpzb25TdHJlYW1QYXJzZXI6OlBhcnNlTnVsbCgpIHsKKyAgb3dfLT5SZW5kZXJOdWxsKGtleV8pOworICBrZXlfID0gU3RyaW5nUGllY2UoKTsKKyAgcF8ucmVtb3ZlX3ByZWZpeChrS2V5d29yZE51bGwubGVuZ3RoKCkpOworICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uU3RyZWFtUGFyc2VyOjpQYXJzZUVtcHR5TnVsbCgpIHsKKyAgb3dfLT5SZW5kZXJOdWxsKGtleV8pOworICBrZXlfID0gU3RyaW5nUGllY2UoKTsKKyAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworfQorCitib29sIEpzb25TdHJlYW1QYXJzZXI6OklzRW1wdHlOdWxsQWxsb3dlZChUb2tlblR5cGUgdHlwZSkgeworICBpZiAoc3RhY2tfLmVtcHR5KCkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIChzdGFja18udG9wKCkgPT0gQVJSQVlfTUlEICYmIHR5cGUgPT0gVkFMVUVfU0VQQVJBVE9SKSB8fAorICAgICAgICAgc3RhY2tfLnRvcCgpID09IE9CSl9NSUQ7Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uU3RyZWFtUGFyc2VyOjpSZXBvcnRGYWlsdXJlKFN0cmluZ1BpZWNlIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZSBwYXJzZV9jb2RlKSB7CisgICh2b2lkKXBhcnNlX2NvZGU7ICAvLyBQYXJhbWV0ZXIgaXMgdXNlZCBpbiBHb29nbGUtaW50ZXJuYWwgY29kZS4KKyAgc3RhdGljIGNvbnN0IGludCBrQ29udGV4dExlbmd0aCA9IDIwOworICBjb25zdCBjaGFyKiBwX3N0YXJ0ID0gcF8uZGF0YSgpOworICBjb25zdCBjaGFyKiBqc29uX3N0YXJ0ID0ganNvbl8uZGF0YSgpOworICBjb25zdCBjaGFyKiBiZWdpbiA9IHN0ZDo6bWF4KHBfc3RhcnQgLSBrQ29udGV4dExlbmd0aCwganNvbl9zdGFydCk7CisgIGNvbnN0IGNoYXIqIGVuZCA9CisgICAgICBzdGQ6Om1pbihwX3N0YXJ0ICsga0NvbnRleHRMZW5ndGgsIGpzb25fc3RhcnQgKyBqc29uXy5zaXplKCkpOworICBTdHJpbmdQaWVjZSBzZWdtZW50KGJlZ2luLCBlbmQgLSBiZWdpbik7CisgIHN0ZDo6c3RyaW5nIGxvY2F0aW9uKHBfc3RhcnQgLSBiZWdpbiwgJyAnKTsKKyAgbG9jYXRpb24ucHVzaF9iYWNrKCdeJyk7CisgIGF1dG8gc3RhdHVzID0gdXRpbDo6SW52YWxpZEFyZ3VtZW50RXJyb3IoCisgICAgICBTdHJDYXQobWVzc2FnZSwgIlxuIiwgc2VnbWVudCwgIlxuIiwgbG9jYXRpb24pKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKwordXRpbDo6U3RhdHVzIEpzb25TdHJlYW1QYXJzZXI6OlJlcG9ydFVua25vd24oU3RyaW5nUGllY2UgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlIHBhcnNlX2NvZGUpIHsKKyAgLy8gSWYgd2UgYXJlbid0IGZpbmlzaGluZyB0aGUgcGFyc2UsIGNhbmNlbCBwYXJzaW5nIGFuZCB0cnkgbGF0ZXIuCisgIGlmICghZmluaXNoaW5nXykgeworICAgIHJldHVybiB1dGlsOjpDYW5jZWxsZWRFcnJvcigiIik7CisgIH0KKyAgaWYgKHBfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gUmVwb3J0RmFpbHVyZShTdHJDYXQoIlVuZXhwZWN0ZWQgZW5kIG9mIHN0cmluZy4gIiwgbWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfY29kZSk7CisgIH0KKyAgcmV0dXJuIFJlcG9ydEZhaWx1cmUobWVzc2FnZSwgcGFyc2VfY29kZSk7Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uU3RyZWFtUGFyc2VyOjpJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgKKyAgICBTdHJpbmdQaWVjZSBrZXkpIGNvbnN0IHsKKyAgaWYgKCsrcmVjdXJzaW9uX2RlcHRoXyA+IG1heF9yZWN1cnNpb25fZGVwdGhfKSB7CisgICAgcmV0dXJuIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKFN0ckNhdCgKKyAgICAgICAgIk1lc3NhZ2UgdG9vIGRlZXAuIE1heCByZWN1cnNpb24gZGVwdGggcmVhY2hlZCBmb3Iga2V5ICciLCBrZXksICInIikpOworICB9CisgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKK30KKwordm9pZCBKc29uU3RyZWFtUGFyc2VyOjpTa2lwV2hpdGVzcGFjZSgpIHsKKyAgd2hpbGUgKCFwXy5lbXB0eSgpICYmIGFzY2lpX2lzc3BhY2UoKnBfLmRhdGEoKSkpIHsKKyAgICBBZHZhbmNlKCk7CisgIH0KKyAgaWYgKCFwXy5lbXB0eSgpICYmICFhc2NpaV9pc3NwYWNlKCpwXy5kYXRhKCkpKSB7CisgICAgc2Vlbl9ub25fd2hpdGVzcGFjZV8gPSB0cnVlOworICB9Cit9CisKK3ZvaWQgSnNvblN0cmVhbVBhcnNlcjo6QWR2YW5jZSgpIHsKKyAgLy8gQWR2YW5jZSBieSBtb3Zpbmcgb25lIFVURjggY2hhcmFjdGVyIHdoaWxlIG1ha2luZyBzdXJlIHdlIGRvbid0IGdvIGJleW9uZAorICAvLyB0aGUgbGVuZ3RoIG9mIFN0cmluZ1BpZWNlLgorICBwXy5yZW1vdmVfcHJlZml4KHN0ZDo6bWluPGludD4oCisgICAgICBwXy5sZW5ndGgoKSwgVVRGOEZpcnN0TGV0dGVyTnVtQnl0ZXMocF8uZGF0YSgpLCBwXy5sZW5ndGgoKSkpKTsKK30KKwordXRpbDo6U3RhdHVzIEpzb25TdHJlYW1QYXJzZXI6OlBhcnNlS2V5KCkgeworICBTdHJpbmdQaWVjZSBvcmlnaW5hbCA9IHBfOworCisgIGlmIChhbGxvd19wZXJtaXNzaXZlX2tleV9uYW1pbmdfKSB7CisgICAgaWYgKCFDb25zdW1lS2V5UGVybWlzc2l2ZSgmcF8sICZrZXlfKSkgeworICAgICAgcmV0dXJuIFJlcG9ydEZhaWx1cmUoIkludmFsaWQga2V5IG9yIHZhcmlhYmxlIG5hbWUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpJTlZBTElEX0tFWV9PUl9WQVJJQUJMRV9OQU1FKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFDb25zdW1lS2V5KCZwXywgJmtleV8pKSB7CisgICAgICByZXR1cm4gUmVwb3J0RmFpbHVyZSgiSW52YWxpZCBrZXkgb3IgdmFyaWFibGUgbmFtZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OklOVkFMSURfS0VZX09SX1ZBUklBQkxFX05BTUUpOworICAgIH0KKyAgfQorCisgIC8vIElmIHdlIGNvbnN1bWVkIGV2ZXJ5dGhpbmcgYnV0IGV4cGVjdCBtb3JlIGRhdGEsIHJlc2V0IHBfIGFuZCBjYW5jZWwgc2luY2UKKyAgLy8gd2UgY2FuJ3Qga25vdyBpZiB0aGUga2V5IHdhcyBjb21wbGV0ZSBvciBub3QuCisgIGlmICghZmluaXNoaW5nXyAmJiBwXy5lbXB0eSgpKSB7CisgICAgcF8gPSBvcmlnaW5hbDsKKyAgICByZXR1cm4gdXRpbDo6Q2FuY2VsbGVkRXJyb3IoIiIpOworICB9CisgIC8vIFNpbmNlIHdlIGFyZW4ndCB1c2luZyB0aGUga2V5IHN0b3JhZ2UsIGNsZWFyIGl0IG91dC4KKyAga2V5X3N0b3JhZ2VfLmNsZWFyKCk7CisgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKK30KKworSnNvblN0cmVhbVBhcnNlcjo6VG9rZW5UeXBlIEpzb25TdHJlYW1QYXJzZXI6OkdldE5leHRUb2tlblR5cGUoKSB7CisgIFNraXBXaGl0ZXNwYWNlKCk7CisKKyAgaW50IHNpemUgPSBwXy5zaXplKCk7CisgIGlmIChzaXplID09IDApIHsKKyAgICAvLyBJZiB3ZSByYW4gb3V0IG9mIGRhdGEsIHJlcG9ydCB1bmtub3duIGFuZCB3ZSdsbCBwbGFjZSB0aGUgcHJldmlvdXMgcGFyc2UKKyAgICAvLyB0eXBlIG9udG8gdGhlIHN0YWNrIGFuZCB0cnkgYWdhaW4gd2hlbiB3ZSBoYXZlIG1vcmUgZGF0YS4KKyAgICByZXR1cm4gVU5LTk9XTjsKKyAgfQorICAvLyBUT0RPKHN2ZW4pOiBTcGxpdCB0aGlzIG1ldGhvZCBiYXNlZCBvbiBjb250ZXh0IHNpbmNlIGRpZmZlcmVudCBjb250ZXh0cworICAvLyBzdXBwb3J0IGRpZmZlcmVudCB0b2tlbnMuIFdvdWxkIHNsaWdodGx5IHNwZWVkIHVwIHByb2Nlc3Npbmc/CisgIGNvbnN0IGNoYXIqIGRhdGEgPSBwXy5kYXRhKCk7CisgIFN0cmluZ1BpZWNlIGRhdGFfdmlldyA9IFN0cmluZ1BpZWNlKGRhdGEsIHNpemUpOworICBpZiAoKmRhdGEgPT0gJ1wiJyB8fCAqZGF0YSA9PSAnXCcnKSByZXR1cm4gQkVHSU5fU1RSSU5HOworICBpZiAoKmRhdGEgPT0gJy0nIHx8ICgnMCcgPD0gKmRhdGEgJiYgKmRhdGEgPD0gJzknKSkgeworICAgIHJldHVybiBCRUdJTl9OVU1CRVI7CisgIH0KKyAgaWYgKHNpemUgPj0ga0tleXdvcmRUcnVlLmxlbmd0aCgpICYmCisgICAgICBIYXNQcmVmaXhTdHJpbmcoZGF0YV92aWV3LCBrS2V5d29yZFRydWUpKSB7CisgICAgcmV0dXJuIEJFR0lOX1RSVUU7CisgIH0KKyAgaWYgKHNpemUgPj0ga0tleXdvcmRGYWxzZS5sZW5ndGgoKSAmJgorICAgICAgSGFzUHJlZml4U3RyaW5nKGRhdGFfdmlldywga0tleXdvcmRGYWxzZSkpIHsKKyAgICByZXR1cm4gQkVHSU5fRkFMU0U7CisgIH0KKyAgaWYgKHNpemUgPj0ga0tleXdvcmROdWxsLmxlbmd0aCgpICYmCisgICAgICBIYXNQcmVmaXhTdHJpbmcoZGF0YV92aWV3LCBrS2V5d29yZE51bGwpKSB7CisgICAgcmV0dXJuIEJFR0lOX05VTEw7CisgIH0KKyAgaWYgKCpkYXRhID09ICd7JykgcmV0dXJuIEJFR0lOX09CSkVDVDsKKyAgaWYgKCpkYXRhID09ICd9JykgcmV0dXJuIEVORF9PQkpFQ1Q7CisgIGlmICgqZGF0YSA9PSAnWycpIHJldHVybiBCRUdJTl9BUlJBWTsKKyAgaWYgKCpkYXRhID09ICddJykgcmV0dXJuIEVORF9BUlJBWTsKKyAgaWYgKCpkYXRhID09ICc6JykgcmV0dXJuIEVOVFJZX1NFUEFSQVRPUjsKKyAgaWYgKCpkYXRhID09ICcsJykgcmV0dXJuIFZBTFVFX1NFUEFSQVRPUjsKKyAgaWYgKE1hdGNoS2V5KHBfKSkgeworICAgIHJldHVybiBCRUdJTl9LRVk7CisgIH0KKworICAvLyBXZSBkb24ndCBrbm93IHRoYXQgd2UgbmVjZXNzYXJpbHkgaGF2ZSBhbiBpbnZhbGlkIHRva2VuIGhlcmUsIGp1c3QgdGhhdCB3ZQorICAvLyBjYW4ndCBwYXJzZSB3aGF0IHdlIGhhdmUgc28gZmFyLiBTbyB3ZSBkb24ndCByZXBvcnQgYW4gZXJyb3IgYW5kIGp1c3QKKyAgLy8gcmV0dXJuIFVOS05PV04gc28gd2UgY2FuIHRyeSBhZ2FpbiBsYXRlciB3aGVuIHdlIGhhdmUgbW9yZSBkYXRhLCBvciBpZiB3ZQorICAvLyBmaW5pc2ggYW5kIHdlIGhhdmUgbGVmdG92ZXJzLgorICByZXR1cm4gVU5LTk9XTjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnRlcgorfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZjE3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyLmgKQEAgLTAsMCArMSwzNTAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX0pTT05fU1RSRUFNX1BBUlNFUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfSlNPTl9TVFJFQU1fUEFSU0VSX0hfXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKKworY2xhc3MgT2JqZWN0V3JpdGVyOworCisvLyBBIEpTT04gcGFyc2VyIHRoYXQgY2FuIHBhcnNlIGEgc3RyZWFtIG9mIEpTT04gY2h1bmtzIHJhdGhlciB0aGFuIG5lZWRpbmcgdGhlCisvLyBlbnRpcmUgSlNPTiBzdHJpbmcgdXAgZnJvbnQuIEl0IGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgcGFyc2VyIGluCisvLyAvL25ldC9wcm90by9qc29uL2pzb24tcGFyc2VyLmggdGhhdCBoYXMgYmVlbiBjaGFuZ2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5czoKKy8vIC0gQ2hhbmdlZCBmcm9tIHJlY3Vyc2lvbiB0byBhbiBleHBsaWNpdCBzdGFjayB0byBhbGxvdyByZXN1bXB0aW9uCisvLyAtIEFkZGVkIHN1cHBvcnQgZm9yIGludDY0IGFuZCB1aW50NjQgbnVtYmVycworLy8gLSBSZW1vdmVkIHN1cHBvcnQgZm9yIG9jdGFsIGFuZCBkZWNpbWFsIGVzY2FwZXMKKy8vIC0gUmVtb3ZlZCBzdXBwb3J0IGZvciBudW1lcmljIGtleXMKKy8vIC0gUmVtb3ZlZCBzdXBwb3J0IGZvciBmdW5jdGlvbnMgKGphdmFzY3JpcHQpCisvLyAtIFJlbW92ZWQgc29tZSBsYXgtY29tbWEgc3VwcG9ydCAoYnV0IGtlcHQgdHJhaWxpbmcgY29tbWEgc3VwcG9ydCkKKy8vIC0gV3JpdGVzIGRpcmVjdGx5IHRvIGFuIE9iamVjdFdyaXRlciByYXRoZXIgdGhhbiB1c2luZyBzdWJjbGFzc2luZworLy8KKy8vIEhlcmUgaXMgYW4gZXhhbXBsZSB1c2FnZToKKy8vIEpzb25TdHJlYW1QYXJzZXIgcGFyc2VyKG93Xy5nZXQoKSk7CisvLyB1dGlsOjpTdGF0dXMgcmVzdWx0ID0gcGFyc2VyLlBhcnNlKGNodW5rMSk7CisvLyByZXN1bHQuVXBkYXRlKHBhcnNlci5QYXJzZShjaHVuazIpKTsKKy8vIHJlc3VsdC5VcGRhdGUocGFyc2VyLkZpbmlzaFBhcnNlKCkpOworLy8gR09PR0xFX0RDSEVDSyhyZXN1bHQub2soKSkgPDwgIkZhaWxlZCB0byBwYXJzZSBKU09OIjsKKy8vCisvLyBUaGlzIHBhcnNlciBpcyB0aHJlYWQtY29tcGF0aWJsZSBhcyBsb25nIGFzIG9ubHkgb25lIHRocmVhZCBpcyBjYWxsaW5nIGEKKy8vIFBhcnNlKCkgbWV0aG9kIGF0IGEgdGltZS4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBKc29uU3RyZWFtUGFyc2VyIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBKc29uU3RyZWFtUGFyc2VyIHRoYXQgd2lsbCB3cml0ZSB0byB0aGUgZ2l2ZW4gT2JqZWN0V3JpdGVyLgorICBleHBsaWNpdCBKc29uU3RyZWFtUGFyc2VyKE9iamVjdFdyaXRlciogb3cpOworICB2aXJ0dWFsIH5Kc29uU3RyZWFtUGFyc2VyKCk7CisKKyAgLy8gUGFyc2VzIGEgVVRGLTggZW5jb2RlZCBKU09OIHN0cmluZyBmcm9tIGEgU3RyaW5nUGllY2UuIElmIHRoZSByZXR1cm5lZAorICAvLyBzdGF0dXMgaXMgbm9uLW9rLCB0aGUgc3RhdHVzIG1pZ2h0IGNvbnRhaW4gYSBwYXlsb2FkIFBhcnNlRXJyb3JUeXBlIHdpdGgKKyAgLy8gdHlwZV91cmwga1BhcnNlRXJyb3JUeXBlVXJsIGFuZCBhIHBheWxvYWQgY29udGFpbmluZyBzdHJpbmcgc25pcHBldCBvZiB0aGUKKyAgLy8gZXJyb3Igd2l0aCB0eXBlX3VybCBrUGFyc2VFcnJvclNuaXBwZXRVcmwuCisgIHV0aWw6OlN0YXR1cyBQYXJzZShTdHJpbmdQaWVjZSBqc29uKTsKKworCisgIC8vIEZpbmlzaCBwYXJzaW5nIHRoZSBKU09OIHN0cmluZy4gSWYgdGhlIHJldHVybmVkIHN0YXR1cyBpcyBub24tb2ssIHRoZQorICAvLyBzdGF0dXMgbWlnaHQgY29udGFpbiBhIHBheWxvYWQgUGFyc2VFcnJvclR5cGUgd2l0aCB0eXBlX3VybAorICAvLyBrUGFyc2VFcnJvclR5cGVVcmwgYW5kIGEgcGF5bG9hZCBjb250YWluaW5nIHN0cmluZyBzbmlwcGV0IG9mIHRoZSBlcnJvcgorICAvLyB3aXRoIHR5cGVfdXJsIGtQYXJzZUVycm9yU25pcHBldFVybC4KKyAgdXRpbDo6U3RhdHVzIEZpbmlzaFBhcnNlKCk7CisKKworICAvLyBTZXRzIHRoZSBtYXggcmVjdXJzaW9uIGRlcHRoIG9mIEpTT04gbWVzc2FnZSB0byBiZSBkZXNlcmlhbGl6ZWQuIEpTT04KKyAgLy8gbWVzc2FnZXMgb3ZlciB0aGlzIGRlcHRoIHdpbGwgZmFpbCB0byBiZSBkZXNlcmlhbGl6ZWQuCisgIC8vIERlZmF1bHQgdmFsdWUgaXMgMTAwLgorICB2b2lkIHNldF9tYXhfcmVjdXJzaW9uX2RlcHRoKGludCBtYXhfZGVwdGgpIHsKKyAgICBtYXhfcmVjdXJzaW9uX2RlcHRoXyA9IG1heF9kZXB0aDsKKyAgfQorCisgIC8vIERlbm90ZXMgdGhlIGNhdXNlIG9mIGVycm9yLgorICBlbnVtIFBhcnNlRXJyb3JUeXBlIHsKKyAgICBVTktOT1dOX1BBUlNFX0VSUk9SLAorICAgIE9DVEFMX09SX0hFWF9BUkVfTk9UX1ZBTElEX0pTT05fVkFMVUVTLAorICAgIEVYUEVDVEVEX0NPTE9OLAorICAgIEVYUEVDVEVEX0NPTU1BX09SX0JSQUNLRVQsCisgICAgRVhQRUNURURfVkFMVUUsCisgICAgRVhQRUNURURfQ09NTUFfT1JfQlJBQ0VTLAorICAgIEVYUEVDVEVEX09CSkVDVF9LRVlfT1JfQlJBQ0VTLAorICAgIEVYUEVDVEVEX1ZBTFVFX09SX0JSQUNLRVQsCisgICAgSU5WQUxJRF9LRVlfT1JfVkFSSUFCTEVfTkFNRSwKKyAgICBOT05fVVRGXzgsCisgICAgUEFSU0lOR19URVJNSU5BVEVEX0JFRk9SRV9FTkRfT0ZfSU5QVVQsCisgICAgVU5FWFBFQ1RFRF9UT0tFTiwKKyAgICBFWFBFQ1RFRF9DTE9TSU5HX1FVT1RFLAorICAgIElMTEVHQUxfSEVYX1NUUklORywKKyAgICBJTlZBTElEX0VTQ0FQRV9TRVFVRU5DRSwKKyAgICBNSVNTSU5HX0xPV19TVVJST0dBVEUsCisgICAgSU5WQUxJRF9MT1dfU1VSUk9HQVRFLAorICAgIElOVkFMSURfVU5JQ09ERSwKKyAgICBVTkFCTEVfVE9fUEFSU0VfTlVNQkVSLAorICAgIE5VTUJFUl9FWENFRURTX1JBTkdFX0RPVUJMRQorICB9OworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEpzb25TdHJlYW1QYXJzZXJUZXN0OworICAvLyBSZXR1cm4gdGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLgorICBpbnQgcmVjdXJzaW9uX2RlcHRoKCkgeyByZXR1cm4gcmVjdXJzaW9uX2RlcHRoXzsgfQorCisgIGVudW0gVG9rZW5UeXBlIHsKKyAgICBCRUdJTl9TVFJJTkcsICAgICAvLyAiIG9yICcKKyAgICBCRUdJTl9OVU1CRVIsICAgICAvLyAtIG9yIGRpZ2l0CisgICAgQkVHSU5fVFJVRSwgICAgICAgLy8gdHJ1ZQorICAgIEJFR0lOX0ZBTFNFLCAgICAgIC8vIGZhbHNlCisgICAgQkVHSU5fTlVMTCwgICAgICAgLy8gbnVsbAorICAgIEJFR0lOX09CSkVDVCwgICAgIC8vIHsKKyAgICBFTkRfT0JKRUNULCAgICAgICAvLyB9CisgICAgQkVHSU5fQVJSQVksICAgICAgLy8gWworICAgIEVORF9BUlJBWSwgICAgICAgIC8vIF0KKyAgICBFTlRSWV9TRVBBUkFUT1IsICAvLyA6CisgICAgVkFMVUVfU0VQQVJBVE9SLCAgLy8gLAorICAgIEJFR0lOX0tFWSwgICAgICAgIC8vIGxldHRlciwgXywgJCBvciBkaWdpdC4gIE11c3QgYmVnaW4gd2l0aCBub24tZGlnaXQKKyAgICBVTktOT1dOICAgICAgICAgICAvLyBVbmtub3duIHRva2VuIG9yIHdlIHJhbiBvdXQgb2YgdGhlIHN0cmVhbS4KKyAgfTsKKworICBlbnVtIFBhcnNlVHlwZSB7CisgICAgVkFMVUUsICAgICAgICAvLyBFeHBlY3RzIGEgeywgWywgdHJ1ZSwgZmFsc2UsIG51bGwsIHN0cmluZyBvciBudW1iZXIKKyAgICBPQkpfTUlELCAgICAgIC8vIEV4cGVjdHMgYSAnLCcgb3IgfQorICAgIEVOVFJZLCAgICAgICAgLy8gRXhwZWN0cyBhIGtleSBvciB9CisgICAgRU5UUllfTUlELCAgICAvLyBFeHBlY3RzIGEgOgorICAgIEFSUkFZX1ZBTFVFLCAgLy8gRXhwZWN0cyBhIHZhbHVlIG9yIF0KKyAgICBBUlJBWV9NSUQgICAgIC8vIEV4cGVjdHMgYSAnLCcgb3IgXQorICB9OworCisgIC8vIEhvbGRzIHRoZSByZXN1bHQgb2YgcGFyc2luZyBhIG51bWJlcgorICBzdHJ1Y3QgTnVtYmVyUmVzdWx0IHsKKyAgICBlbnVtIFR5cGUgeyBET1VCTEUsIElOVCwgVUlOVCB9OworICAgIFR5cGUgdHlwZTsKKyAgICB1bmlvbiB7CisgICAgICBkb3VibGUgZG91YmxlX3ZhbDsKKyAgICAgIGludDY0X3QgaW50X3ZhbDsKKyAgICAgIHVpbnQ2NF90IHVpbnRfdmFsOworICAgIH07CisgIH07CisKKyAgLy8gUGFyc2VzIGEgc2luZ2xlIGNodW5rIG9mIEpTT04sIHJldHVybmluZyBhbiBlcnJvciBpZiB0aGUgSlNPTiB3YXMgaW52YWxpZC4KKyAgdXRpbDo6U3RhdHVzIFBhcnNlQ2h1bmsoU3RyaW5nUGllY2UgY2h1bmspOworCisgIC8vIFJ1bnMgdGhlIHBhcnNlciBiYXNlZCBvbiBzdGFja18gYW5kIHBfLCB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHkgb3IgcF8gcnVucworICAvLyBvdXQgb2YgZGF0YS4gSWYgd2UgdW5leHBlY3RlZGx5IHJ1biBvdXQgb2YgcF8gd2UgcHVzaCB0aGUgbGF0ZXN0IGJhY2sgb250bworICAvLyB0aGUgc3RhY2sgYW5kIHJldHVybi4KKyAgdXRpbDo6U3RhdHVzIFJ1blBhcnNlcigpOworCisgIC8vIFBhcnNlcyBhIHZhbHVlIGZyb20gcF8gYW5kIHdyaXRlcyBpdCB0byBvd18uCisgIC8vIEEgdmFsdWUgbWF5IGJlIGFuIG9iamVjdCwgYXJyYXksIHRydWUsIGZhbHNlLCBudWxsLCBzdHJpbmcgb3IgbnVtYmVyLgorICB1dGlsOjpTdGF0dXMgUGFyc2VWYWx1ZShUb2tlblR5cGUgdHlwZSk7CisKKyAgLy8gUGFyc2VzIGEgc3RyaW5nIGFuZCB3cml0ZXMgaXQgb3V0IHRvIHRoZSBvd18uCisgIHV0aWw6OlN0YXR1cyBQYXJzZVN0cmluZygpOworCisgIC8vIFBhcnNlcyBhIHN0cmluZywgc3RvcmluZyB0aGUgcmVzdWx0IGluIHBhcnNlZF8uCisgIHV0aWw6OlN0YXR1cyBQYXJzZVN0cmluZ0hlbHBlcigpOworCisgIC8vIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBpbiBzdHJpbmdzLiBJdCByZXR1cm5zIGFuCisgIC8vIGVycm9yIHdoZW4gdGhlcmUncyBhIHBhcnNpbmcgZXJyb3IsIGVpdGhlciB0aGUgc2l6ZSBpcyBub3QgdGhlIGV4cGVjdGVkCisgIC8vIHNpemUgb3IgYSBjaGFyYWN0ZXIgaXMgbm90IGEgaGV4IGRpZ2l0LiAgV2hlbiBpdCByZXR1cm5zIHN0ciB3aWxsIGNvbnRhaW4KKyAgLy8gd2hhdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcGFyc2VkIHNvIGZhci4KKyAgdXRpbDo6U3RhdHVzIFBhcnNlVW5pY29kZUVzY2FwZSgpOworCisgIC8vIEV4cGVjdHMgcF8gdG8gcG9pbnQgdG8gYSBKU09OIG51bWJlciwgd3JpdGVzIHRoZSBudW1iZXIgdG8gdGhlIHdyaXRlciB1c2luZworICAvLyB0aGUgYXBwcm9wcmlhdGUgUmVuZGVyIG1ldGhvZCBiYXNlZCBvbiB0aGUgdHlwZSBvZiBudW1iZXIuCisgIHV0aWw6OlN0YXR1cyBQYXJzZU51bWJlcigpOworCisgIC8vIFBhcnNlIGEgbnVtYmVyIGludG8gYSBOdW1iZXJSZXN1bHQsIHJlcG9ydGluZyBhbiBlcnJvciBpZiBubyBudW1iZXIgY291bGQKKyAgLy8gYmUgcGFyc2VkLiBUaGlzIG1ldGhvZCB3aWxsIHRyeSB0byBwYXJzZSBpbnRvIGEgdWludDY0LCBpbnQ2NCwgb3IgZG91YmxlCisgIC8vIGJhc2VkIG9uIHdoZXRoZXIgdGhlIG51bWJlciB3YXMgcG9zaXRpdmUgb3IgbmVnYXRpdmUgb3IgaGFkIGEgZGVjaW1hbAorICAvLyBjb21wb25lbnQuCisgIHV0aWw6OlN0YXR1cyBQYXJzZU51bWJlckhlbHBlcihOdW1iZXJSZXN1bHQqIHJlc3VsdCk7CisKKyAgLy8gUGFyc2UgYSBudW1iZXIgYXMgZG91YmxlIGludG8gYSBOdW1iZXJSZXN1bHQuCisgIHV0aWw6OlN0YXR1cyBQYXJzZURvdWJsZUhlbHBlcihjb25zdCBzdGQ6OnN0cmluZyYgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyUmVzdWx0KiByZXN1bHQpOworCisgIC8vIEhhbmRsZXMgYSB7IGR1cmluZyBwYXJzaW5nIG9mIGEgdmFsdWUuCisgIHV0aWw6OlN0YXR1cyBIYW5kbGVCZWdpbk9iamVjdCgpOworCisgIC8vIFBhcnNlcyBmcm9tIHRoZSBFTlRSWSBzdGF0ZS4KKyAgdXRpbDo6U3RhdHVzIFBhcnNlRW50cnkoVG9rZW5UeXBlIHR5cGUpOworCisgIC8vIFBhcnNlcyBmcm9tIHRoZSBFTlRSWV9NSUQgc3RhdGUuCisgIHV0aWw6OlN0YXR1cyBQYXJzZUVudHJ5TWlkKFRva2VuVHlwZSB0eXBlKTsKKworICAvLyBQYXJzZXMgZnJvbSB0aGUgT0JKX01JRCBzdGF0ZS4KKyAgdXRpbDo6U3RhdHVzIFBhcnNlT2JqZWN0TWlkKFRva2VuVHlwZSB0eXBlKTsKKworICAvLyBIYW5kbGVzIGEgWyBkdXJpbmcgcGFyc2luZyBvZiBhIHZhbHVlLgorICB1dGlsOjpTdGF0dXMgSGFuZGxlQmVnaW5BcnJheSgpOworCisgIC8vIFBhcnNlcyBmcm9tIHRoZSBBUlJBWV9WQUxVRSBzdGF0ZS4KKyAgdXRpbDo6U3RhdHVzIFBhcnNlQXJyYXlWYWx1ZShUb2tlblR5cGUgdHlwZSk7CisKKyAgLy8gUGFyc2VzIGZyb20gdGhlIEFSUkFZX01JRCBzdGF0ZS4KKyAgdXRpbDo6U3RhdHVzIFBhcnNlQXJyYXlNaWQoVG9rZW5UeXBlIHR5cGUpOworCisgIC8vIEV4cGVjdHMgcF8gdG8gcG9pbnQgdG8gYW4gdW5xdW90ZWQgbGl0ZXJhbAorICB1dGlsOjpTdGF0dXMgUGFyc2VUcnVlKCk7CisgIHV0aWw6OlN0YXR1cyBQYXJzZUZhbHNlKCk7CisgIHV0aWw6OlN0YXR1cyBQYXJzZU51bGwoKTsKKyAgdXRpbDo6U3RhdHVzIFBhcnNlRW1wdHlOdWxsKCk7CisKKyAgLy8gV2hldGhlciBhbiBlbXB0eS1udWxsIGlzIGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQgc3RhdGUuCisgIGJvb2wgSXNFbXB0eU51bGxBbGxvd2VkKFRva2VuVHlwZSB0eXBlKTsKKworICAvLyBXaGV0aGVyIHRoZSB3aG9sZSBpbnB1dCBpcyBhbGwgd2hpdGVzcGFjZXMuCisgIGJvb2wgSXNJbnB1dEFsbFdoaXRlU3BhY2VzKFRva2VuVHlwZSB0eXBlKTsKKworICAvLyBSZXBvcnQgYSBmYWlsdXJlIGFzIGEgdXRpbDo6U3RhdHVzLgorICB1dGlsOjpTdGF0dXMgUmVwb3J0RmFpbHVyZShTdHJpbmdQaWVjZSBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZSBwYXJzZV9jb2RlKTsKKworICAvLyBSZXBvcnQgYSBmYWlsdXJlIGR1ZSB0byBhbiBVTktOT1dOIHRva2VuIHR5cGUuIFdlIGNoZWNrIGlmIHdlIGhpdCB0aGUKKyAgLy8gZW5kIG9mIHRoZSBzdHJlYW0gYW5kIGlmIHdlJ3JlIGZpbmlzaGluZyBvciBub3QgdG8gZGV0ZWN0IHdoYXQgdHlwZSBvZgorICAvLyBzdGF0dXMgdG8gcmV0dXJuIGluIHRoaXMgY2FzZS4KKyAgdXRpbDo6U3RhdHVzIFJlcG9ydFVua25vd24oU3RyaW5nUGllY2UgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGUgcGFyc2VfY29kZSk7CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIHJlY3Vyc2lvbiBkZXB0aCBhbmQgaW5jcmVtZW50IGl0LiBJdCB3aWxsIHJldHVybgorICAvLyBPa1N0YXR1cygpIGlmIHRoZSBjdXJyZW50IGRlcHRoIGlzIGFsbG93ZWQuIE90aGVyd2lzZSBhbiBlcnJvciBpcyByZXR1cm5lZC4KKyAgLy8ga2V5IGlzIHVzZWQgZm9yIGVycm9yIHJlcG9ydGluZy4KKyAgdXRpbDo6U3RhdHVzIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKFN0cmluZ1BpZWNlIGtleSkgY29uc3Q7CisKKyAgLy8gQWR2YW5jZSBwXyBwYXN0IGFsbCB3aGl0ZXNwYWNlIG9yIHVudGlsIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAgdm9pZCBTa2lwV2hpdGVzcGFjZSgpOworCisgIC8vIEFkdmFuY2UgcF8gb25lIFVURi04IGNoYXJhY3RlcgorICB2b2lkIEFkdmFuY2UoKTsKKworICAvLyBFeHBlY3RzIHBfIHRvIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBrZXkuCisgIHV0aWw6OlN0YXR1cyBQYXJzZUtleSgpOworCisgIC8vIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgbmV4dCB0b2tlbiBhdCBwXy4KKyAgVG9rZW5UeXBlIEdldE5leHRUb2tlblR5cGUoKTsKKworICAvLyBUaGUgb2JqZWN0IHdyaXRlciB0byB3cml0ZSBwYXJzZSBldmVudHMgdG8uCisgIE9iamVjdFdyaXRlciogb3dfOworCisgIC8vIFRoZSBzdGFjayBvZiBwYXJzaW5nIHdlIHN0aWxsIG5lZWQgdG8gZG8uIFdoZW4gdGhlIHN0YWNrIHJ1bnMgZW1wdHkgd2Ugd2lsbAorICAvLyBoYXZlIHBhcnNlZCBhIHNpbmdsZSB2YWx1ZSBmcm9tIHRoZSByb290IChlLmcuIGFuIG9iamVjdCBvciBsaXN0KS4KKyAgc3RkOjpzdGFjazxQYXJzZVR5cGU+IHN0YWNrXzsKKworICAvLyBDb250YWlucyBhbnkgbGVmdG92ZXIgdGV4dCBmcm9tIGEgcHJldmlvdXMgY2h1bmsgdGhhdCB3ZSB3ZXJlbid0IGFibGUgdG8KKyAgLy8gZnVsbHkgcGFyc2UsIGZvciBleGFtcGxlIHRoZSBzdGFydCBvZiBhIGtleSBvciBudW1iZXIuCisgIHN0ZDo6c3RyaW5nIGxlZnRvdmVyXzsKKworICAvLyBUaGUgY3VycmVudCBjaHVuayBvZiBKU09OIGJlaW5nIHBhcnNlZC4gUHJpbWFyaWx5IHVzZWQgZm9yIHByb3ZpZGluZworICAvLyBjb250ZXh0IGR1cmluZyBlcnJvciByZXBvcnRpbmcuCisgIFN0cmluZ1BpZWNlIGpzb25fOworCisgIC8vIEEgcG9pbnRlciB3aXRoaW4gdGhlIGN1cnJlbnQgSlNPTiBiZWluZyBwYXJzZWQsIHVzZWQgdG8gdHJhY2sgbG9jYXRpb24uCisgIFN0cmluZ1BpZWNlIHBfOworCisgIC8vIFN0b3JlcyB0aGUgbGFzdCBrZXkgcmVhZCwgYXMgd2Ugc2VwYXJhdGUgcGFyc2luZyBvZiBrZXlzIGFuZCB2YWx1ZXMuCisgIFN0cmluZ1BpZWNlIGtleV87CisKKyAgLy8gU3RvcmFnZSBmb3Iga2V5XyBpZiB3ZSBuZWVkIHRvIGtlZXAgb3duZXJzaGlwLCBmb3IgZXhhbXBsZSBiZXR3ZWVuIGNodW5rcworICAvLyBvciBpZiB0aGUga2V5IHdhcyB1bmVzY2FwZWQgZnJvbSBhIEpTT04gc3RyaW5nLgorICBzdGQ6OnN0cmluZyBrZXlfc3RvcmFnZV87CisKKyAgLy8gVHJ1ZSBkdXJpbmcgdGhlIEZpbmlzaFBhcnNlKCkgY2FsbCwgc28gd2Uga25vdyB0aGF0IGFueSBlcnJvcnMgYXJlIGZhdGFsLgorICAvLyBGb3IgZXhhbXBsZSBhbiB1bnRlcm1pbmF0ZWQgc3RyaW5nIHdpbGwgbm9ybWFsbHkgcmVzdWx0IGluIGNhbmNlbGxpbmcgYW5kCisgIC8vIHRyeWluZyBkdXJpbmcgdGhlIG5leHQgY2h1bmssIGJ1dCBkdXJpbmcgRmluaXNoUGFyc2UoKSBpdCBpcyBhbiBlcnJvci4KKyAgYm9vbCBmaW5pc2hpbmdfOworCisgIC8vIFdoZXRoZXIgbm9uIHdoaXRlc3BhY2UgdG9rZW5zIGhhdmUgYmVlbiBzZWVuIGR1cmluZyBwYXJzaW5nLgorICAvLyBJdCBpcyB1c2VkIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiBhIHB1cmUgd2hpdGVzcGFjZSBzdHJlYW0gaW5wdXQuCisgIGJvb2wgc2Vlbl9ub25fd2hpdGVzcGFjZV87CisKKyAgLy8gVGhlIEpzb25TdHJlYW1QYXJzZXIgcmVxdWlyZXMgYSByb290IGVsZW1lbnQgYnkgZGVmYXVsdCBhbmQgaXQgd2lsbCByYWlzZQorICAvLyBlcnJvciBpZiB0aGUgcm9vdCBlbGVtZW50IGlzIG1pc3NpbmcuIElmIGBhbGxvd19ub19yb290X2VsZW1lbnRfYCBpcyB0cnVlLAorICAvLyB0aGUgSnNvblN0cmVhbVBhcnNlciBjYW4gYWxzbyBoYW5kbGUgdGhpcyBjYXNlLgorICBib29sIGFsbG93X25vX3Jvb3RfZWxlbWVudF87CisKKyAgLy8gU3RyaW5nIHdlIHBhcnNlZCBkdXJpbmcgYSBjYWxsIHRvIFBhcnNlU3RyaW5nSGVscGVyKCkuCisgIFN0cmluZ1BpZWNlIHBhcnNlZF87CisKKyAgLy8gU3RvcmFnZSBmb3IgdGhlIHN0cmluZyB3ZSBwYXJzZWQuIFRoaXMgbWF5IGJlIGVtcHR5IGlmIHRoZSBzdHJpbmcgd2FzIGFibGUKKyAgLy8gdG8gYmUgcGFyc2VkIGRpcmVjdGx5IGZyb20gdGhlIGlucHV0LgorICBzdGQ6OnN0cmluZyBwYXJzZWRfc3RvcmFnZV87CisKKyAgLy8gVGhlIGNoYXJhY3RlciB0aGF0IG9wZW5lZCB0aGUgc3RyaW5nLCBlaXRoZXIgJyBvciAiLgorICAvLyBBIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgc3RyaW5nIHBhcnNpbmcgaXMgbm90IGluIHByb2Nlc3MuCisgIGNoYXIgc3RyaW5nX29wZW5fOworCisgIC8vIFN0b3JhZ2UgZm9yIHRoZSBjaHVuayB0aGF0IGFyZSBiZWluZyBwYXJzZWQgaW4gUGFyc2VDaHVuaygpLgorICBzdGQ6OnN0cmluZyBjaHVua19zdG9yYWdlXzsKKworICAvLyBXaGV0aGVyIHRvIGFsbG93IG5vbiBVVEYtOCBlbmNvZGVkIGlucHV0IGFuZCByZXBsYWNlIGludmFsaWQgY29kZSBwb2ludHMuCisgIGJvb2wgY29lcmNlX3RvX3V0ZjhfOworCisgIC8vIFJlcGxhY2VtZW50IGNoYXJhY3RlciBmb3IgaW52YWxpZCBVVEYtOCBjb2RlIHBvaW50cy4KKyAgc3RkOjpzdHJpbmcgdXRmOF9yZXBsYWNlbWVudF9jaGFyYWN0ZXJfOworCisgIC8vIFdoZXRoZXIgYWxsb3dzIGVtcHR5IHN0cmluZyByZXByZXNlbnRlZCBudWxsIGFycmF5IHZhbHVlIG9yIG9iamVjdCBlbnRyeQorICAvLyB2YWx1ZS4KKyAgYm9vbCBhbGxvd19lbXB0eV9udWxsXzsKKworICAvLyBXaGV0aGVyIHVucXVvdGVkIG9iamVjdCBrZXlzIGNhbiBjb250YWluIGVtYmVkZGVkIG5vbi1hbHBoYW51bWVyaWMKKyAgLy8gY2hhcmFjdGVycyB3aGVuIHRoaXMgaXMgdW5hbWJpZ3VvdXMgZm9yIHBhcnNpbmcuCisgIGJvb2wgYWxsb3dfcGVybWlzc2l2ZV9rZXlfbmFtaW5nXzsKKworICAvLyBXaGV0aGVyIGFsbG93cyBvdXQtb2YtcmFuZ2UgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBvciByZWplY3QgdGhlbS4KKyAgYm9vbCBsb29zZV9mbG9hdF9udW1iZXJfY29udmVyc2lvbl87CisKKyAgLy8gVHJhY2tzIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLgorICBtdXRhYmxlIGludCByZWN1cnNpb25fZGVwdGhfOworCisgIC8vIE1heGltdW0gYWxsb3dlZCByZWN1cnNpb24gZGVwdGguCisgIGludCBtYXhfcmVjdXJzaW9uX2RlcHRoXzsKKworICBHT09HTEVfRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKEpzb25TdHJlYW1QYXJzZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnRlcgorfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX0pTT05fU1RSRUFNX1BBUlNFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDE1N2EyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlcl90ZXN0LmNjCkBAIC0wLDAgKzEsOTc5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlci5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2V4cGVjdGluZ19vYmplY3R3cml0ZXIuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3dyaXRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgY29udmVydGVyIHsKKwordXNpbmcgUGFyc2VFcnJvclR5cGUgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6Y29udmVydGVyOjpKc29uU3RyZWFtUGFyc2VyOjpQYXJzZUVycm9yVHlwZTsKKworCisvLyBUZXN0cyBmb3IgdGhlIEpTT04gU3RyZWFtIFBhcnNlci4gVGhlc2UgdGVzdHMgYXJlIGludGVuZGVkIHRvIGJlCisvLyBjb21wcmVoZW5zaXZlIGFuZCBjb3ZlciB0aGUgZm9sbG93aW5nOgorLy8KKy8vIFBvc2l0aXZlIHRlc3RzOgorLy8gLSB0cnVlLCBmYWxzZSwgbnVsbAorLy8gLSBlbXB0eSBvYmplY3Qgb3IgYXJyYXkuCisvLyAtIG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZSBkb3VibGUgYW5kIGludCwgdW5zaWduZWQgaW50CisvLyAtIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlZCBzdHJpbmdzCisvLyAtIHN0cmluZyBrZXksIHVucXVvdGVkIGtleSwgbnVtZXJpYyBrZXkKKy8vIC0gYXJyYXkgY29udGFpbmluZyBhcnJheSwgb2JqZWN0LCB2YWx1ZQorLy8gLSBvYmplY3QgY29udGFpbmluZyBhcnJheSwgb2JqZWN0LCB2YWx1ZQorLy8gLSB1bmljb2RlIGhhbmRsaW5nIGluIHN0cmluZ3MKKy8vIC0gYXNjaWkgZXNjYXBpbmcgKFxiLCBcZiwgXG4sIFxyLCBcdCwgXHYpCisvLyAtIHRyYWlsaW5nIGNvbW1hcworLy8KKy8vIE5lZ2F0aXZlIHRlc3RzOgorLy8gLSBpbGxlZ2FsIGxpdGVyYWxzCisvLyAtIG1pc21hdGNoZWQgcXVvdGVzIGZhaWx1cmUgb24gc3RyaW5ncworLy8gLSB1bnRlcm1pbmF0ZWQgc3RyaW5nIGZhaWx1cmUKKy8vIC0gdW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nIGZhaWx1cmUKKy8vIC0gbWlzbWF0Y2hlZCBvYmplY3QgYW5kIGFycmF5IGNsb3NpbmcKKy8vIC0gRmFpbHVyZSB0byBjbG9zZSBhcnJheSBvciBvYmplY3QKKy8vIC0gbnVtYmVycyB0b28gbGFyZ2UKKy8vIC0gaW52YWxpZCB1bmljb2RlIGVzY2FwZXMuCisvLyAtIGludmFsaWQgdW5pY29kZSBzZXF1ZW5jZXMuCisvLyAtIG51bWJlcnMgYXMga2V5cworLy8KKy8vIEZvciBlYWNoIHRlc3Qgd2Ugc3BsaXQgdGhlIGlucHV0IHN0cmluZyBvbiBldmVyeSBwb3NzaWJsZSBjaGFyYWN0ZXIgdG8gZW5zdXJlCisvLyB0aGUgcGFyc2VyIGlzIGFibGUgdG8gaGFuZGxlIGFyYml0cmFyaWx5IHNwbGl0IGlucHV0IGZvciBhbGwgY2FzZXMuIFdlIGFsc28KKy8vIGRvIGEgZmluYWwgdGVzdCBvZiB0aGUgZW50aXJlIHRlc3QgY2FzZSBvbmUgY2hhcmFjdGVyIGF0IGEgdGltZS4KKy8vCisvLyBJdCBpcyB2ZXJpZmllZCB0aGF0IGV4cGVjdGVkIGNhbGxzIHRvIHRoZSBtb2NrZWQgb2JqZWN0cyBhcmUgaW4gc2VxdWVuY2UuCitjbGFzcyBKc29uU3RyZWFtUGFyc2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgSnNvblN0cmVhbVBhcnNlclRlc3QoKSA6IG1vY2tfKCksIG93XygmbW9ja18pIHt9CisgIH5Kc29uU3RyZWFtUGFyc2VyVGVzdCgpIG92ZXJyaWRlIHt9CisKKyAgdXRpbDo6U3RhdHVzIFJ1blRlc3QoU3RyaW5nUGllY2UganNvbiwgaW50IHNwbGl0LAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoSnNvblN0cmVhbVBhcnNlciopPiBzZXR1cCkgeworICAgIEpzb25TdHJlYW1QYXJzZXIgcGFyc2VyKCZtb2NrXyk7CisgICAgc2V0dXAoJnBhcnNlcik7CisKKyAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHNwbGl0ID09IGxlbmd0aCwgdGVzdCBwYXJzaW5nIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lLgorICAgIGlmIChzcGxpdCA9PSBqc29uLmxlbmd0aCgpKSB7CisgICAgICBHT09HTEVfTE9HKElORk8pIDw8ICJUZXN0aW5nIHNwbGl0IGV2ZXJ5IGNoYXI6ICIgPDwganNvbjsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwganNvbi5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgIFN0cmluZ1BpZWNlIHNpbmdsZSA9IGpzb24uc3Vic3RyKGksIDEpOworICAgICAgICB1dGlsOjpTdGF0dXMgcmVzdWx0ID0gcGFyc2VyLlBhcnNlKHNpbmdsZSk7CisgICAgICAgIGlmICghcmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcGFyc2VyLkZpbmlzaFBhcnNlKCk7CisgICAgfQorCisgICAgLy8gTm9ybWFsIGNhc2UsIHNwbGl0IGF0IHRoZSBzcGxpdCBwb2ludCBhbmQgcGFyc2UgdHdvIHN1YnN0cmluZ3MuCisgICAgU3RyaW5nUGllY2UgZmlyc3QgPSBqc29uLnN1YnN0cigwLCBzcGxpdCk7CisgICAgU3RyaW5nUGllY2UgcmVzdCA9IGpzb24uc3Vic3RyKHNwbGl0KTsKKyAgICBHT09HTEVfTE9HKElORk8pIDw8ICJUZXN0aW5nIHNwbGl0OiAiIDw8IGZpcnN0IDw8ICI+PCIgPDwgcmVzdDsKKyAgICB1dGlsOjpTdGF0dXMgcmVzdWx0ID0gcGFyc2VyLlBhcnNlKGZpcnN0KTsKKyAgICBpZiAocmVzdWx0Lm9rKCkpIHsKKyAgICAgIHJlc3VsdCA9IHBhcnNlci5QYXJzZShyZXN0KTsKKyAgICAgIGlmIChyZXN1bHQub2soKSkgeworICAgICAgICByZXN1bHQgPSBwYXJzZXIuRmluaXNoUGFyc2UoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlc3VsdC5vaygpKSB7CisgICAgICBFWFBFQ1RfRVEocGFyc2VyLnJlY3Vyc2lvbl9kZXB0aCgpLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHZvaWQgRG9UZXN0KAorICAgICAgU3RyaW5nUGllY2UganNvbiwgaW50IHNwbGl0LAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEpzb25TdHJlYW1QYXJzZXIqKT4gc2V0dXAgPSBbXShKc29uU3RyZWFtUGFyc2VyKiBwKSB7CisgICAgICB9KSB7CisgICAgdXRpbDo6U3RhdHVzIHJlc3VsdCA9IFJ1blRlc3QoanNvbiwgc3BsaXQsIHNldHVwKTsKKyAgICBpZiAoIXJlc3VsdC5vaygpKSB7CisgICAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8IHJlc3VsdDsKKyAgICB9CisgICAgRVhQRUNUX1RSVUUocmVzdWx0Lm9rKCkpOworICB9CisKKyAgdm9pZCBEb0Vycm9yVGVzdCgKKyAgICAgIFN0cmluZ1BpZWNlIGpzb24sIGludCBzcGxpdCwgU3RyaW5nUGllY2UgZXJyb3JfcHJlZml4LAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEpzb25TdHJlYW1QYXJzZXIqKT4gc2V0dXAgPSBbXShKc29uU3RyZWFtUGFyc2VyKiBwKSB7CisgICAgICB9KSB7CisgICAgdXRpbDo6U3RhdHVzIHJlc3VsdCA9IFJ1blRlc3QoanNvbiwgc3BsaXQsIHNldHVwKTsKKyAgICBFWFBFQ1RfVFJVRSh1dGlsOjpJc0ludmFsaWRBcmd1bWVudChyZXN1bHQpKTsKKyAgICBTdHJpbmdQaWVjZSBlcnJvcl9tZXNzYWdlKHJlc3VsdC5tZXNzYWdlKCkpOworICAgIEVYUEVDVF9FUShlcnJvcl9wcmVmaXgsIGVycm9yX21lc3NhZ2Uuc3Vic3RyKDAsIGVycm9yX3ByZWZpeC5zaXplKCkpKTsKKyAgfQorCisgIHZvaWQgRG9FcnJvclRlc3QoCisgICAgICBTdHJpbmdQaWVjZSBqc29uLCBpbnQgc3BsaXQsIFN0cmluZ1BpZWNlIGVycm9yX3ByZWZpeCwKKyAgICAgIFBhcnNlRXJyb3JUeXBlIGV4cGVjdGVkX3BhcnNlX2Vycm9yX3R5cGUsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoSnNvblN0cmVhbVBhcnNlciopPiBzZXR1cCA9IFtdKEpzb25TdHJlYW1QYXJzZXIqIHApIHsKKyAgICAgIH0pIHsKKyAgICB1dGlsOjpTdGF0dXMgcmVzdWx0ID0gUnVuVGVzdChqc29uLCBzcGxpdCwgc2V0dXApOworICAgIEVYUEVDVF9UUlVFKHV0aWw6OklzSW52YWxpZEFyZ3VtZW50KHJlc3VsdCkpOworICAgIFN0cmluZ1BpZWNlIGVycm9yX21lc3NhZ2UocmVzdWx0Lm1lc3NhZ2UoKSk7CisgICAgRVhQRUNUX0VRKGVycm9yX3ByZWZpeCwgZXJyb3JfbWVzc2FnZS5zdWJzdHIoMCwgZXJyb3JfcHJlZml4LnNpemUoKSkpOworICB9CisKKworI2lmbmRlZiBfTVNDX1ZFUgorICAvLyBUT0RPKHhpYW9mZW5nKTogV2UgaGF2ZSB0byBkaXNhYmxlIEluU2VxdWVuY2UgY2hlY2sgZm9yIE1TVkMgYmVjYXVzZSBpdAorICAvLyBjYXVzZXMgc3RhY2sgb3ZlcmZsb3cgZHVlIHRvIGl0cyB1c2Ugb2YgYSBsaW5rZWQgbGlzdCB0aGF0IGlzIGRlc3RydWN0ZWQKKyAgLy8gcmVjdXJzaXZlbHkuCisgIDo6dGVzdGluZzo6SW5TZXF1ZW5jZSBpbl9zZXF1ZW5jZV87CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorICBNb2NrT2JqZWN0V3JpdGVyIG1vY2tfOworICBFeHBlY3RpbmdPYmplY3RXcml0ZXIgb3dfOworfTsKKworCisvLyBQb3NpdGl2ZSB0ZXN0cworCisvLyAtIHRydWUsIGZhbHNlLCBudWxsCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIFNpbXBsZVRydWUpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gInRydWUiOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5SZW5kZXJCb29sKCIiLCB0cnVlKTsKKyAgICBEb1Rlc3Qoc3RyLCBpKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIFNpbXBsZUZhbHNlKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJmYWxzZSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlJlbmRlckJvb2woIiIsIGZhbHNlKTsKKyAgICBEb1Rlc3Qoc3RyLCBpKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIFNpbXBsZU51bGwpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gIm51bGwiOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5SZW5kZXJOdWxsKCIiKTsKKyAgICBEb1Rlc3Qoc3RyLCBpKTsKKyAgfQorfQorCisvLyAtIGVtcHR5IG9iamVjdCBhbmQgYXJyYXkuCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIEVtcHR5T2JqZWN0KSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJ7fSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlN0YXJ0T2JqZWN0KCIiKS0+RW5kT2JqZWN0KCk7CisgICAgRG9UZXN0KHN0ciwgaSk7CisgIH0KK30KKworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBFbXB0eUxpc3QpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gIltdIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uU3RhcnRMaXN0KCIiKS0+RW5kTGlzdCgpOworICAgIERvVGVzdChzdHIsIGkpOworICB9Cit9CisKKy8vIC0gbmVnYXRpdmUgYW5kIHBvc2l0aXZlIGRvdWJsZSBhbmQgaW50LCB1bnNpZ25lZCBpbnQKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgU2ltcGxlRG91YmxlKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICI0Mi41IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uUmVuZGVyRG91YmxlKCIiLCA0Mi41KTsKKyAgICBEb1Rlc3Qoc3RyLCBpKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIFNjaWVudGlmaWNEb3VibGUpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gIjEuMjM0NWUtMTAiOworICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlJlbmRlckRvdWJsZSgiIiwgMS4yMzQ1ZS0xMCk7CisgICAgRG9UZXN0KHN0ciwgaSk7CisgIH0KK30KKworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBTaW1wbGVOZWdhdGl2ZURvdWJsZSkgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiLTEwNDUuMjM1IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uUmVuZGVyRG91YmxlKCIiLCAtMTA0NS4yMzUpOworICAgIERvVGVzdChzdHIsIGkpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgU2ltcGxlSW50KSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICIxMjM0NTYiOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5SZW5kZXJVaW50NjQoIiIsIDEyMzQ1Nik7CisgICAgRG9UZXN0KHN0ciwgaSk7CisgIH0KK30KKworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBTaW1wbGVOZWdhdGl2ZUludCkgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiLTc5NDk3ODIzNTUzMTYyNzY1IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uUmVuZGVySW50NjQoIiIsIGludDY0X3R7LTc5NDk3ODIzNTUzMTYyNzY1fSk7CisgICAgRG9UZXN0KHN0ciwgaSk7CisgIH0KK30KKworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBTaW1wbGVVbnNpZ25lZEludCkgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiMTE3Nzk0OTc4MjM1NTMxNjI3NjUiOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5SZW5kZXJVaW50NjQoIiIsIHVpbnQ2NF90ezExNzc5NDk3ODIzNTUzMTYyNzY1dX0pOworICAgIERvVGVzdChzdHIsIGkpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgT2N0YWxOdW1iZXJJc0ludmFsaWQpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gIjAxMjM0IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJPY3RhbC9oZXggbnVtYmVycyBhcmUgbm90IHZhbGlkIEpTT04gdmFsdWVzLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6Ok9DVEFMX09SX0hFWF9BUkVfTk9UX1ZBTElEX0pTT05fVkFMVUVTKTsKKyAgfQorICBzdHIgPSAiLTAxMjM0IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJPY3RhbC9oZXggbnVtYmVycyBhcmUgbm90IHZhbGlkIEpTT04gdmFsdWVzLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6Ok9DVEFMX09SX0hFWF9BUkVfTk9UX1ZBTElEX0pTT05fVkFMVUVTKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIEhleE51bWJlcklzSW52YWxpZCkgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiMHgxMjM0IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJPY3RhbC9oZXggbnVtYmVycyBhcmUgbm90IHZhbGlkIEpTT04gdmFsdWVzLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6Ok9DVEFMX09SX0hFWF9BUkVfTk9UX1ZBTElEX0pTT05fVkFMVUVTKTsKKyAgfQorICBzdHIgPSAiLTB4MTIzNCI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgRG9FcnJvclRlc3Qoc3RyLCBpLCAiT2N0YWwvaGV4IG51bWJlcnMgYXJlIG5vdCB2YWxpZCBKU09OIHZhbHVlcy4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpPQ1RBTF9PUl9IRVhfQVJFX05PVF9WQUxJRF9KU09OX1ZBTFVFUyk7CisgIH0KKyAgc3RyID0gIjEyeDM0IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJVbmFibGUgdG8gcGFyc2UgbnVtYmVyLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OlVOQUJMRV9UT19QQVJTRV9OVU1CRVIpOworICB9Cit9CisKKy8vIC0gc2luZ2xlIGFuZCBkb3VibGUgcXVvdGVkIHN0cmluZ3MKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgRW1wdHlEb3VibGVRdW90ZWRTdHJpbmcpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gIlwiXCIiOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5SZW5kZXJTdHJpbmcoIiIsICIiKTsKKyAgICBEb1Rlc3Qoc3RyLCBpKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIEVtcHR5U2luZ2xlUXVvdGVkU3RyaW5nKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICInJyI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlJlbmRlclN0cmluZygiIiwgIiIpOworICAgIERvVGVzdChzdHIsIGkpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgU2ltcGxlRG91YmxlUXVvdGVkU3RyaW5nKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJcIlNvbWUgU3RyaW5nXCIiOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5SZW5kZXJTdHJpbmcoIiIsICJTb21lIFN0cmluZyIpOworICAgIERvVGVzdChzdHIsIGkpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgU2ltcGxlU2luZ2xlUXVvdGVkU3RyaW5nKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICInQW5vdGhlciBTdHJpbmcnIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uUmVuZGVyU3RyaW5nKCIiLCAiQW5vdGhlciBTdHJpbmciKTsKKyAgICBEb1Rlc3Qoc3RyLCBpKTsKKyAgfQorfQorCisvLyAtIHN0cmluZyBrZXksIHVucXVvdGVkIGtleSwgbnVtZXJpYyBrZXkKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgT2JqZWN0S2V5VHlwZXMpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0KKyAgICAgICJ7J3MnOiB0cnVlLCBcImRcIjogZmFsc2UsIGtleTogbnVsbCwgc25ha2Vfa2V5OiBbXSwgY2FtZWxLZXk6IHt9fSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlN0YXJ0T2JqZWN0KCIiKQorICAgICAgICAtPlJlbmRlckJvb2woInMiLCB0cnVlKQorICAgICAgICAtPlJlbmRlckJvb2woImQiLCBmYWxzZSkKKyAgICAgICAgLT5SZW5kZXJOdWxsKCJrZXkiKQorICAgICAgICAtPlN0YXJ0TGlzdCgic25ha2Vfa2V5IikKKyAgICAgICAgLT5FbmRMaXN0KCkKKyAgICAgICAgLT5TdGFydE9iamVjdCgiY2FtZWxLZXkiKQorICAgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAgIC0+RW5kT2JqZWN0KCk7CisgICAgRG9UZXN0KHN0ciwgaSk7CisgIH0KK30KKworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBVbnF1b3RlZE9iamVjdEtleVdpdGhSZXNlcnZlZFByZWZ4ZXMpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gInsgbnVsbGtleTogXCJhXCIsIHRydWVrZXk6IFwiYlwiLCBmYWxzZWtleTogXCJjXCJ9IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uU3RhcnRPYmplY3QoIiIpCisgICAgICAgIC0+UmVuZGVyU3RyaW5nKCJudWxsa2V5IiwgImEiKQorICAgICAgICAtPlJlbmRlclN0cmluZygidHJ1ZWtleSIsICJiIikKKyAgICAgICAgLT5SZW5kZXJTdHJpbmcoImZhbHNla2V5IiwgImMiKQorICAgICAgICAtPkVuZE9iamVjdCgpOworICAgIERvVGVzdChzdHIsIGkpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgVW5xdW90ZWRPYmplY3RLZXlXaXRoUmVzZXJ2ZWRLZXl3b3JkKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJ7IG51bGw6IFwiYVwiLCB0cnVlOiBcImJcIiwgZmFsc2U6IFwiY1wifSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgRG9FcnJvclRlc3Qoc3RyLCBpLCAiRXhwZWN0ZWQgYW4gb2JqZWN0IGtleSBvciB9LiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OkVYUEVDVEVEX09CSkVDVF9LRVlfT1JfQlJBQ0VTKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIFVucXVvdGVkT2JqZWN0S2V5V2l0aEVtYmVkZGVkTm9uQWxwaGFudW1lcmljKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJ7IGZvby1iYXItYmF6OiBcImFcIn0iOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIkV4cGVjdGVkIDogYmV0d2VlbiBrZXk6dmFsdWUgcGFpci4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9DT0xPTik7CisgIH0KK30KKworCisvLyAtIGFycmF5IGNvbnRhaW5pbmcgcHJpbWl0aXZlIHZhbHVlcyAodHJ1ZSwgZmFsc2UsIG51bGwsIG51bSwgc3RyaW5nKQorVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBBcnJheVByaW1pdGl2ZVZhbHVlcykgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiW3RydWUsIGZhbHNlLCBudWxsLCAnb25lJywgXCJ0d29cIl0iOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5TdGFydExpc3QoIiIpCisgICAgICAgIC0+UmVuZGVyQm9vbCgiIiwgdHJ1ZSkKKyAgICAgICAgLT5SZW5kZXJCb29sKCIiLCBmYWxzZSkKKyAgICAgICAgLT5SZW5kZXJOdWxsKCIiKQorICAgICAgICAtPlJlbmRlclN0cmluZygiIiwgIm9uZSIpCisgICAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAidHdvIikKKyAgICAgICAgLT5FbmRMaXN0KCk7CisgICAgRG9UZXN0KHN0ciwgaSk7CisgIH0KK30KKworLy8gLSBhcnJheSBjb250YWluaW5nIGFycmF5LCBvYmplY3QKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgQXJyYXlDb21wbGV4VmFsdWVzKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9CisgICAgICAiW1syMiwgLTEyNywgNDUuMywgLTEwNTYuNCwgMTE3Nzk0OTc4MjM1NTMxNjI3NjVdLCB7J2tleSc6IHRydWV9XSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlN0YXJ0TGlzdCgiIikKKyAgICAgICAgLT5TdGFydExpc3QoIiIpCisgICAgICAgIC0+UmVuZGVyVWludDY0KCIiLCAyMikKKyAgICAgICAgLT5SZW5kZXJJbnQ2NCgiIiwgLTEyNykKKyAgICAgICAgLT5SZW5kZXJEb3VibGUoIiIsIDQ1LjMpCisgICAgICAgIC0+UmVuZGVyRG91YmxlKCIiLCAtMTA1Ni40KQorICAgICAgICAtPlJlbmRlclVpbnQ2NCgiIiwgdWludDY0X3R7MTE3Nzk0OTc4MjM1NTMxNjI3NjV1fSkKKyAgICAgICAgLT5FbmRMaXN0KCkKKyAgICAgICAgLT5TdGFydE9iamVjdCgiIikKKyAgICAgICAgLT5SZW5kZXJCb29sKCJrZXkiLCB0cnVlKQorICAgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAgIC0+RW5kTGlzdCgpOworICAgIERvVGVzdChzdHIsIGkpOworICB9Cit9CisKKworLy8gLSBvYmplY3QgY29udGFpbmluZyBhcnJheSwgb2JqZWN0LCB2YWx1ZSAodHJ1ZSwgZmFsc2UsIG51bGwsIG51bSwgc3RyaW5nKQorVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBPYmplY3RWYWx1ZXMpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0KKyAgICAgICJ7dDogdHJ1ZSwgZjogZmFsc2UsIG46IG51bGwsIHM6ICdhIHN0cmluZycsIGQ6IFwiYW5vdGhlciBzdHJpbmdcIiwgcGk6ICIKKyAgICAgICIyMiwgbmk6IC0xMjcsIHBkOiA0NS4zLCBuZDogLTEwNTYuNCwgcGw6IDExNzc5NDk3ODIzNTUzMTYyNzY1LCBsOiBbW11dLCAiCisgICAgICAibzogeydrZXknOiB0cnVlfX0iOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5TdGFydE9iamVjdCgiIikKKyAgICAgICAgLT5SZW5kZXJCb29sKCJ0IiwgdHJ1ZSkKKyAgICAgICAgLT5SZW5kZXJCb29sKCJmIiwgZmFsc2UpCisgICAgICAgIC0+UmVuZGVyTnVsbCgibiIpCisgICAgICAgIC0+UmVuZGVyU3RyaW5nKCJzIiwgImEgc3RyaW5nIikKKyAgICAgICAgLT5SZW5kZXJTdHJpbmcoImQiLCAiYW5vdGhlciBzdHJpbmciKQorICAgICAgICAtPlJlbmRlclVpbnQ2NCgicGkiLCAyMikKKyAgICAgICAgLT5SZW5kZXJJbnQ2NCgibmkiLCAtMTI3KQorICAgICAgICAtPlJlbmRlckRvdWJsZSgicGQiLCA0NS4zKQorICAgICAgICAtPlJlbmRlckRvdWJsZSgibmQiLCAtMTA1Ni40KQorICAgICAgICAtPlJlbmRlclVpbnQ2NCgicGwiLCB1aW50NjRfdHsxMTc3OTQ5NzgyMzU1MzE2Mjc2NXV9KQorICAgICAgICAtPlN0YXJ0TGlzdCgibCIpCisgICAgICAgIC0+U3RhcnRMaXN0KCIiKQorICAgICAgICAtPkVuZExpc3QoKQorICAgICAgICAtPkVuZExpc3QoKQorICAgICAgICAtPlN0YXJ0T2JqZWN0KCJvIikKKyAgICAgICAgLT5SZW5kZXJCb29sKCJrZXkiLCB0cnVlKQorICAgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAgIC0+RW5kT2JqZWN0KCk7CisgICAgRG9UZXN0KHN0ciwgaSk7CisgIH0KK30KKworCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIFJlamVjdE5vblV0ZjhXaGVuTm90Q29lcmNlZCkgeworICBTdHJpbmdQaWVjZSBqc29uID0gIntcImFkZHJlc3NcIjpceEZGXCLXl9eo15XXqdeqIDIzLCDXqNei16DXoNeULCDXmdep16jXkNecXCJ9IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0ganNvbi5sZW5ndGgoKTsgKytpKSB7CisgICAgRG9FcnJvclRlc3QoanNvbiwgaSwgIkVuY291bnRlcmVkIG5vbiBVVEYtOCBjb2RlIHBvaW50cy4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpOT05fVVRGXzgpOworICB9CisgIGpzb24gPSAie1wiYWRkcmVzc1wiOiBcIteX16jXldep16ogMjMsXHhGRteo16LXoNeg15QsINeZ16nXqNeQ15xcIn0iOworICBmb3IgKGludCBpID0gMDsgaSA8PSBqc29uLmxlbmd0aCgpOyArK2kpIHsKKyAgICBEb0Vycm9yVGVzdChqc29uLCBpLCAiRW5jb3VudGVyZWQgbm9uIFVURi04IGNvZGUgcG9pbnRzLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6Ok5PTl9VVEZfOCk7CisgIH0KKyAgRG9FcnJvclRlc3QoIlx4RkZ7fSIsIDAsICJFbmNvdW50ZXJlZCBub24gVVRGLTggY29kZSBwb2ludHMuIiwKKyAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6Ok5PTl9VVEZfOCk7Cit9CisKKy8vIC0gdW5pY29kZSBoYW5kbGluZyBpbiBzdHJpbmdzCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIFVuaWNvZGVFc2NhcGluZykgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiW1wiXFx1MDYzOVxcdTA2MzFcXHUwNjI4XFx1MDY0OVwiXSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlN0YXJ0TGlzdCgiIikKKyAgICAgICAgLT5SZW5kZXJTdHJpbmcoIiIsICJceEQ4XHhCOVx4RDhceEIxXHhEOFx4QThceEQ5XHg4OSIpCisgICAgICAgIC0+RW5kTGlzdCgpOworICAgIERvVGVzdChzdHIsIGkpOworICB9Cit9CisKKy8vIC0gdW5pY29kZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXIgaGFuZGxpbmcgaW4gc3RyaW5ncworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBVbmljb2RlU3Vycm9nYXRlUGFpckVzY2FwaW5nKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9CisgICAgICAiW1wiXFx1MGJlZVxcdWQ4MDBcXHVkZGYxXFx1RDgwQ1xcdUREQTRcXHVEODNkXFx1ZEMxRFxcdUQ4M0NcXHVERjZGXCJdIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uU3RhcnRMaXN0KCIiKQorICAgICAgICAtPlJlbmRlclN0cmluZygiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIlx4RTBceEFGXHhBRVx4RjBceDkwXHg4N1x4QjFceEYwXHg5M1x4ODZceEE0XHhGMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIlx4OUZceDkwXHg5RFx4RjBceDlGXHg4RFx4QUYiKQorICAgICAgICAtPkVuZExpc3QoKTsKKyAgICBEb1Rlc3Qoc3RyLCBpKTsKKyAgfQorfQorCisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgVW5pY29kZUVzY2FwaW5nSW52YWxpZENvZGVQb2ludFdoZW5Ob3RDb2VyY2VkKSB7CisgIC8vIEEgbG93IHN1cnJvZ2F0ZSBhbG9uZS4KKyAgU3RyaW5nUGllY2Ugc3RyID0gIltcIlxcdWRlMzZcIl0iOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIkludmFsaWQgdW5pY29kZSBjb2RlIHBvaW50LiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OklOVkFMSURfVU5JQ09ERSk7CisgIH0KK30KKworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBVbmljb2RlRXNjYXBpbmdNaXNzaW5nTG93U3Vycm9nYXRlV2hlbk5vdENvZXJjZWQpIHsKKyAgLy8gQSBoaWdoIHN1cnJvZ2F0ZSBhbG9uZS4KKyAgU3RyaW5nUGllY2Ugc3RyID0gIltcIlxcdWQ4M2RcIl0iOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIk1pc3NpbmcgbG93IHN1cnJvZ2F0ZS4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpNSVNTSU5HX0xPV19TVVJST0dBVEUpOworICB9CisgIC8vIEEgaGlnaCBzdXJyb2dhdGUgd2l0aCBzb21lIHRyYWlsaW5nIGNoYXJhY3RlcnMuCisgIHN0ciA9ICJbXCJcXHVkODNkfHVkZTM2XCJdIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJNaXNzaW5nIGxvdyBzdXJyb2dhdGUuIiwKKyAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6TUlTU0lOR19MT1dfU1VSUk9HQVRFKTsKKyAgfQorICAvLyBBIGhpZ2ggc3Vycm9nYXRlIHdpdGggaGFsZiBhIGxvdyBzdXJyb2dhdGUuCisgIHN0ciA9ICJbXCJcXHVkODNkXFx1ZGUtLVwiXSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgRG9FcnJvclRlc3Qoc3RyLCBpLCAiSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UuIiwKKyAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6SU5WQUxJRF9FU0NBUEVfU0VRVUVOQ0UpOworICB9CisgIC8vIFR3byBoaWdoIHN1cnJvZ2F0ZXMuCisgIHN0ciA9ICJbXCJcXHVkODNkXFx1ZDgzZFwiXSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgRG9FcnJvclRlc3Qoc3RyLCBpLCAiSW52YWxpZCBsb3cgc3Vycm9nYXRlLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OklOVkFMSURfTE9XX1NVUlJPR0FURSk7CisgIH0KK30KKworLy8gLSBhc2NpaSBlc2NhcGluZyAoXGIsIFxmLCBcbiwgXHIsIFx0LCBcdikKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgQXNjaWlFc2NhcGluZykgeworICBTdHJpbmdQaWVjZSBzdHIgPQorICAgICAgIltcIlxcYlwiLCBcIlxcbmluZ1wiLCBcInRlc3RcXGZcIiwgXCJcXHJcXHRcIiwgXCJ0ZXN0XFxcXFxcdmluZ1wiXSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlN0YXJ0TGlzdCgiIikKKyAgICAgICAgLT5SZW5kZXJTdHJpbmcoIiIsICJcYiIpCisgICAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAiXG5pbmciKQorICAgICAgICAtPlJlbmRlclN0cmluZygiIiwgInRlc3RcZiIpCisgICAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAiXHJcdCIpCisgICAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAidGVzdFxcXHZpbmciKQorICAgICAgICAtPkVuZExpc3QoKTsKKyAgICBEb1Rlc3Qoc3RyLCBpKTsKKyAgfQorfQorCisvLyAtIHRyYWlsaW5nIGNvbW1hcywgd2Ugc3VwcG9ydCBhIHNpbmdsZSB0cmFpbGluZyBjb21tYSBidXQgbm8gaW50ZXJuYWwgY29tbWFzLgorVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBUcmFpbGluZ0NvbW1hcykgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiW1snYScsdHJ1ZSxdLCB7YjogbnVsbCx9LF0iOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5TdGFydExpc3QoIiIpCisgICAgICAgIC0+U3RhcnRMaXN0KCIiKQorICAgICAgICAtPlJlbmRlclN0cmluZygiIiwgImEiKQorICAgICAgICAtPlJlbmRlckJvb2woIiIsIHRydWUpCisgICAgICAgIC0+RW5kTGlzdCgpCisgICAgICAgIC0+U3RhcnRPYmplY3QoIiIpCisgICAgICAgIC0+UmVuZGVyTnVsbCgiYiIpCisgICAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgICAgLT5FbmRMaXN0KCk7CisgICAgRG9UZXN0KHN0ciwgaSk7CisgIH0KK30KKworLy8gTmVnYXRpdmUgdGVzdHMKKworLy8gaWxsZWdhbCBsaXRlcmFscworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBFeHRyYVRleHRBZnRlclRydWUpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gInRydWVlIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uUmVuZGVyQm9vbCgiIiwgdHJ1ZSk7CisgICAgRG9FcnJvclRlc3Qoc3RyLCBpLCAiUGFyc2luZyB0ZXJtaW5hdGVkIGJlZm9yZSBlbmQgb2YgaW5wdXQuIiwKKyAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6UEFSU0lOR19URVJNSU5BVEVEX0JFRk9SRV9FTkRfT0ZfSU5QVVQpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgSW52YWxpZE51bWJlckRhc2hPbmx5KSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICItIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJVbmFibGUgdG8gcGFyc2UgbnVtYmVyLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OlVOQUJMRV9UT19QQVJTRV9OVU1CRVIpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgSW52YWxpZE51bWJlckRhc2hOYW1lKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICItZm9vIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJVbmFibGUgdG8gcGFyc2UgbnVtYmVyLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OlVOQUJMRV9UT19QQVJTRV9OVU1CRVIpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgSW52YWxpZExpdGVyYWxJbkFycmF5KSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJbbnVsZV0iOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5TdGFydExpc3QoIiIpOworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIlVuZXhwZWN0ZWQgdG9rZW4uIiwgUGFyc2VFcnJvclR5cGU6OlVORVhQRUNURURfVE9LRU4pOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgSW52YWxpZExpdGVyYWxJbk9iamVjdCkgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiezEyM2ZhbHNlfSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlN0YXJ0T2JqZWN0KCIiKTsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJFeHBlY3RlZCBhbiBvYmplY3Qga2V5IG9yIH0uIiwKKyAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6RVhQRUNURURfT0JKRUNUX0tFWV9PUl9CUkFDRVMpOworICB9Cit9CisKKy8vIG1pc21hdGNoZWQgcXVvdGVzIGZhaWx1cmUgb24gc3RyaW5ncworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBNaXNtYXRjaGVkU2luZ2xlUXVvdGVkTGl0ZXJhbCkgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiJ1NvbWUgc3RyXCIiOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIkNsb3NpbmcgcXVvdGUgZXhwZWN0ZWQgaW4gc3RyaW5nLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OkVYUEVDVEVEX0NMT1NJTkdfUVVPVEUpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgTWlzbWF0Y2hlZERvdWJsZVF1b3RlZExpdGVyYWwpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gIlwiQW5vdGhlciBzdHJpbmcgdGhhdCBlbmRzIHBvb3JseSEnIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJDbG9zaW5nIHF1b3RlIGV4cGVjdGVkIGluIHN0cmluZy4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9DTE9TSU5HX1FVT1RFKTsKKyAgfQorfQorCisvLyB1bnRlcm1pbmF0ZWQgc3RyaW5ncworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBVbnRlcm1pbmF0ZWRMaXRlcmFsU3RyaW5nKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJcIkZvcmdvdCB0aGUgcmVzdCBvZiBpIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJDbG9zaW5nIHF1b3RlIGV4cGVjdGVkIGluIHN0cmluZy4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9DTE9TSU5HX1FVT1RFKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIFVudGVybWluYXRlZFN0cmluZ0VzY2FwZSkgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiXCJGb3Jnb3QgdGhlIHJlc3Qgb2YgXFwiOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIkNsb3NpbmcgcXVvdGUgZXhwZWN0ZWQgaW4gc3RyaW5nLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OkVYUEVDVEVEX0NMT1NJTkdfUVVPVEUpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgVW50ZXJtaW5hdGVkU3RyaW5nSW5BcnJheSkgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiW1wiRm9yZ290IHRvIGNsb3NlIHRoZSBzdHJpbmddIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uU3RhcnRMaXN0KCIiKTsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJDbG9zaW5nIHF1b3RlIGV4cGVjdGVkIGluIHN0cmluZy4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9DTE9TSU5HX1FVT1RFKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIFVudGVybWluYXRlZFN0cmluZ0luT2JqZWN0KSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJ7ZjogXCJGb3Jnb3QgdG8gY2xvc2UgdGhlIHN0cmluZ30iOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5TdGFydE9iamVjdCgiIik7CisgICAgRG9FcnJvclRlc3Qoc3RyLCBpLCAiQ2xvc2luZyBxdW90ZSBleHBlY3RlZCBpbiBzdHJpbmcuIiwKKyAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6RVhQRUNURURfQ0xPU0lOR19RVU9URSk7CisgIH0KK30KKworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBVbnRlcm1pbmF0ZWRPYmplY3QpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gInsiOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5TdGFydE9iamVjdCgiIik7CisgICAgRG9FcnJvclRlc3Qoc3RyLCBpLCAiVW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OkVYUEVDVEVEX09CSkVDVF9LRVlfT1JfQlJBQ0VTKTsKKyAgfQorfQorCisKKy8vIG1pc21hdGNoZWQgb2JqZWN0IGFuZCBhcnJheSBjbG9zaW5nCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIE1pc21hdGNoZWRDbG9zZU9iamVjdCkgeworICBTdHJpbmdQaWVjZSBzdHIgPSAieydrZXknOiB0cnVlXSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlN0YXJ0T2JqZWN0KCIiKS0+UmVuZGVyQm9vbCgia2V5IiwgdHJ1ZSk7CisgICAgRG9FcnJvclRlc3Qoc3RyLCBpLCAiRXhwZWN0ZWQgLCBvciB9IGFmdGVyIGtleTp2YWx1ZSBwYWlyLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OkVYUEVDVEVEX0NPTU1BX09SX0JSQUNFUyk7CisgIH0KK30KKworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBNaXNtYXRjaGVkQ2xvc2VBcnJheSkgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiW3RydWUsIG51bGx9IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uU3RhcnRMaXN0KCIiKS0+UmVuZGVyQm9vbCgiIiwgdHJ1ZSktPlJlbmRlck51bGwoIiIpOworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIkV4cGVjdGVkICwgb3IgXSBhZnRlciBhcnJheSB2YWx1ZS4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9DT01NQV9PUl9CUkFDS0VUKTsKKyAgfQorfQorCisvLyBJbnZhbGlkIG9iamVjdCBrZXlzLgorVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBJbnZhbGlkTnVtZXJpY09iamVjdEtleSkgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiezQyOiB0cnVlfSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlN0YXJ0T2JqZWN0KCIiKTsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJFeHBlY3RlZCBhbiBvYmplY3Qga2V5IG9yIH0uIiwKKyAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6RVhQRUNURURfT0JKRUNUX0tFWV9PUl9CUkFDRVMpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgSW52YWxpZExpdGVyYWxPYmplY3RJbk9iamVjdCkgeworICBTdHJpbmdQaWVjZSBzdHIgPSAie3tib2I6IHRydWV9fSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlN0YXJ0T2JqZWN0KCIiKTsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJFeHBlY3RlZCBhbiBvYmplY3Qga2V5IG9yIH0uIiwKKyAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6RVhQRUNURURfT0JKRUNUX0tFWV9PUl9CUkFDRVMpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgSW52YWxpZExpdGVyYWxBcnJheUluT2JqZWN0KSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJ7W251bGxdfSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlN0YXJ0T2JqZWN0KCIiKTsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJFeHBlY3RlZCBhbiBvYmplY3Qga2V5IG9yIH0uIiwKKyAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6RVhQRUNURURfT0JKRUNUX0tFWV9PUl9CUkFDRVMpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgSW52YWxpZExpdGVyYWxWYWx1ZUluT2JqZWN0KSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJ7ZmFsc2V9IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uU3RhcnRPYmplY3QoIiIpOworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIkV4cGVjdGVkIGFuIG9iamVjdCBrZXkgb3IgfS4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9PQkpFQ1RfS0VZX09SX0JSQUNFUyk7CisgIH0KK30KKworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBNaXNzaW5nQ29sb25BZnRlclN0cmluZ0luT2JqZWN0KSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJ7XCJrZXlcIn0iOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5TdGFydE9iamVjdCgiIik7CisgICAgRG9FcnJvclRlc3Qoc3RyLCBpLCAiRXhwZWN0ZWQgOiBiZXR3ZWVuIGtleTp2YWx1ZSBwYWlyLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OkVYUEVDVEVEX0NPTE9OKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIE1pc3NpbmdDb2xvbkFmdGVyS2V5SW5PYmplY3QpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gIntrZXl9IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uU3RhcnRPYmplY3QoIiIpOworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIkV4cGVjdGVkIDogYmV0d2VlbiBrZXk6dmFsdWUgcGFpci4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9DT0xPTik7CisgIH0KK30KKworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBFbmRPZlRleHRBZnRlcktleUluT2JqZWN0KSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJ7a2V5IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uU3RhcnRPYmplY3QoIiIpOworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIlVuZXhwZWN0ZWQgZW5kIG9mIHN0cmluZy4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9DT0xPTik7CisgIH0KK30KKworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBNaXNzaW5nVmFsdWVBZnRlckNvbG9uSW5PYmplY3QpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gIntrZXk6fSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlN0YXJ0T2JqZWN0KCIiKTsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJVbmV4cGVjdGVkIHRva2VuLiIsIFBhcnNlRXJyb3JUeXBlOjpVTkVYUEVDVEVEX1RPS0VOKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIE1pc3NpbmdDb21tYUJldHdlZW5PYmplY3RFbnRyaWVzKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJ7a2V5OjIwICdoZWxsbyc6IHRydWV9IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uU3RhcnRPYmplY3QoIiIpLT5SZW5kZXJVaW50NjQoImtleSIsIDIwKTsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJFeHBlY3RlZCAsIG9yIH0gYWZ0ZXIga2V5OnZhbHVlIHBhaXIuIiwKKyAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6RVhQRUNURURfQ09NTUFfT1JfQlJBQ0VTKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIEludmFsaWRMaXRlcmFsQXNPYmplY3RLZXkpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gIntmYWxzZTogMjB9IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uU3RhcnRPYmplY3QoIiIpOworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIkV4cGVjdGVkIGFuIG9iamVjdCBrZXkgb3IgfS4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9PQkpFQ1RfS0VZX09SX0JSQUNFUyk7CisgIH0KK30KKworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBFeHRyYUNoYXJhY3RlcnNBZnRlck9iamVjdCkgeworICBTdHJpbmdQaWVjZSBzdHIgPSAie319IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uU3RhcnRPYmplY3QoIiIpLT5FbmRPYmplY3QoKTsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJQYXJzaW5nIHRlcm1pbmF0ZWQgYmVmb3JlIGVuZCBvZiBpbnB1dC4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpQQVJTSU5HX1RFUk1JTkFURURfQkVGT1JFX0VORF9PRl9JTlBVVCk7CisgIH0KK30KKworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBQb3NpdGl2ZU51bWJlclRvb0JpZ0lzRG91YmxlKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICIxODQ0Njc0NDA3MzcwOTU1MTYxNiI7ICAvLyAyXjY0CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlJlbmRlckRvdWJsZSgiIiwgMTg0NDY3NDQwNzM3MDk1NTIwMDAuMCk7CisgICAgRG9UZXN0KHN0ciwgaSk7CisgIH0KK30KKworVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBOZWdhdGl2ZU51bWJlclRvb0JpZ0lzRG91YmxlKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICItMTg0NDY3NDQwNzM3MDk1NTE2MTYiOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5SZW5kZXJEb3VibGUoIiIsIC0xODQ0Njc0NDA3MzcwOTU1MTYxNi4wKTsKKyAgICBEb1Rlc3Qoc3RyLCBpKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIERvdWJsZVRvb0JpZykgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiWzEuODk3NjllKzMwOF0iOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5TdGFydExpc3QoIiIpOworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIk51bWJlciBleGNlZWRzIHRoZSByYW5nZSBvZiBkb3VibGUuIiwKKyAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6TlVNQkVSX0VYQ0VFRFNfUkFOR0VfRE9VQkxFKTsKKyAgfQorICBzdHIgPSAiWy0xLjg5NzY5ZSszMDhdIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uU3RhcnRMaXN0KCIiKTsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJOdW1iZXIgZXhjZWVkcyB0aGUgcmFuZ2Ugb2YgZG91YmxlLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6Ok5VTUJFUl9FWENFRURTX1JBTkdFX0RPVUJMRSk7CisgIH0KK30KKworCisvLyBpbnZhbGlkIGJhcmUgYmFja3NsYXNoLgorVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBVbmZpbmlzaGVkRXNjYXBlKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJcIlxcIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJDbG9zaW5nIHF1b3RlIGV4cGVjdGVkIGluIHN0cmluZy4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpFWFBFQ1RFRF9DTE9TSU5HX1FVT1RFKTsKKyAgfQorfQorCisvLyBpbnZhbGlkIGJhcmUgYmFja3NsYXNoIHUuCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIFVuZmluaXNoZWRVbmljb2RlRXNjYXBlKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJcIlxcdSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgRG9FcnJvclRlc3Qoc3RyLCBpLCAiSWxsZWdhbCBoZXggc3RyaW5nLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OklMTEVHQUxfSEVYX1NUUklORyk7CisgIH0KK30KKworLy8gaW52YWxpZCB1bmljb2RlIHNlcXVlbmNlLgorVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBVbmljb2RlRXNjYXBlQ3V0T2ZmKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJcIlxcdTEyIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJJbGxlZ2FsIGhleCBzdHJpbmcuIiwKKyAgICAgICAgICAgICAgICBQYXJzZUVycm9yVHlwZTo6SUxMRUdBTF9IRVhfU1RSSU5HKTsKKyAgfQorfQorCisvLyBpbnZhbGlkIHVuaWNvZGUgc2VxdWVuY2UgKHZhbGlkIGluIG1vZGVybiBFY21hU2NyaXB0IGJ1dCBub3QgaW4gSlNPTikuCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIEJyYWNrZXRlZFVuaWNvZGVFc2NhcGUpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gIlwiXFx1ezFmMzZmfVwiIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZS4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpJTlZBTElEX0VTQ0FQRV9TRVFVRU5DRSk7CisgIH0KK30KKworCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIFVuaWNvZGVFc2NhcGVJbnZhbGlkQ2hhcmFjdGVycykgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiXCJcXHUxMiQ0aGVsbG8iOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIkludmFsaWQgZXNjYXBlIHNlcXVlbmNlLiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OklOVkFMSURfRVNDQVBFX1NFUVVFTkNFKTsKKyAgfQorfQorCisvLyBpbnZhbGlkIHVuaWNvZGUgc2VxdWVuY2UgaW4gbG93IGhhbGYgc3Vycm9nYXRlOiBnIGlzIG5vdCBhIGhleCBkaWdpdC4KK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgVW5pY29kZUVzY2FwZUxvd0hhbGZTdXJyb2dhdGVJbnZhbGlkQ2hhcmFjdGVycykgeworICBTdHJpbmdQaWVjZSBzdHIgPSAiXCJcXHVkODAwXFx1ZGNmZ1wiIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZS4iLAorICAgICAgICAgICAgICAgIFBhcnNlRXJyb3JUeXBlOjpJTlZBTElEX0VTQ0FQRV9TRVFVRU5DRSk7CisgIH0KK30KKworLy8gRXh0cmEgY29tbWFzIHdpdGggYW4gb2JqZWN0IG9yIGFycmF5LgorVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBFeHRyYUNvbW1hSW5PYmplY3QpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gInsnazEnOiB0cnVlLCwnazInOiBmYWxzZX0iOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5TdGFydE9iamVjdCgiIiktPlJlbmRlckJvb2woImsxIiwgdHJ1ZSk7CisgICAgRG9FcnJvclRlc3Qoc3RyLCBpLCAiRXhwZWN0ZWQgYW4gb2JqZWN0IGtleSBvciB9LiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OkVYUEVDVEVEX09CSkVDVF9LRVlfT1JfQlJBQ0VTKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIEV4dHJhQ29tbWFJbkFycmF5KSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJbdHJ1ZSwsZmFsc2V9IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uU3RhcnRMaXN0KCIiKS0+UmVuZGVyQm9vbCgiIiwgdHJ1ZSk7CisgICAgRG9FcnJvclRlc3Qoc3RyLCBpLCAiVW5leHBlY3RlZCB0b2tlbi4iLCBQYXJzZUVycm9yVHlwZTo6VU5FWFBFQ1RFRF9UT0tFTik7CisgIH0KK30KKworLy8gRXh0cmEgdGV4dCBiZXlvbmQgZW5kIG9mIHZhbHVlLgorVEVTVF9GKEpzb25TdHJlYW1QYXJzZXJUZXN0LCBFeHRyYVRleHRBZnRlckxpdGVyYWwpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gIidoZWxsbycsICd3b3JsZCciOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5SZW5kZXJTdHJpbmcoIiIsICJoZWxsbyIpOworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIlBhcnNpbmcgdGVybWluYXRlZCBiZWZvcmUgZW5kIG9mIGlucHV0LiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OlBBUlNJTkdfVEVSTUlOQVRFRF9CRUZPUkVfRU5EX09GX0lOUFVUKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIEV4dHJhVGV4dEFmdGVyT2JqZWN0KSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJ7J2tleSc6IHRydWV9ICdvb3BzJyI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgb3dfLlN0YXJ0T2JqZWN0KCIiKS0+UmVuZGVyQm9vbCgia2V5IiwgdHJ1ZSktPkVuZE9iamVjdCgpOworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIlBhcnNpbmcgdGVybWluYXRlZCBiZWZvcmUgZW5kIG9mIGlucHV0LiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OlBBUlNJTkdfVEVSTUlOQVRFRF9CRUZPUkVfRU5EX09GX0lOUFVUKTsKKyAgfQorfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIEV4dHJhVGV4dEFmdGVyQXJyYXkpIHsKKyAgU3RyaW5nUGllY2Ugc3RyID0gIltudWxsXSAnb29wcyciOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5TdGFydExpc3QoIiIpLT5SZW5kZXJOdWxsKCIiKS0+RW5kTGlzdCgpOworICAgIERvRXJyb3JUZXN0KHN0ciwgaSwgIlBhcnNpbmcgdGVybWluYXRlZCBiZWZvcmUgZW5kIG9mIGlucHV0LiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OlBBUlNJTkdfVEVSTUlOQVRFRF9CRUZPUkVfRU5EX09GX0lOUFVUKTsKKyAgfQorfQorCisvLyBSYW5kb20gdW5rbm93biB0ZXh0IGluIHRoZSB2YWx1ZS4KK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgVW5rbm93bkNoYXJhY3RlcnNBc1ZhbHVlKSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICIqJiMyNSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ci5sZW5ndGgoKTsgKytpKSB7CisgICAgRG9FcnJvclRlc3Qoc3RyLCBpLCAiRXhwZWN0ZWQgYSB2YWx1ZS4iLCBQYXJzZUVycm9yVHlwZTo6RVhQRUNURURfVkFMVUUpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgVW5rbm93bkNoYXJhY3RlcnNJbkFycmF5KSB7CisgIFN0cmluZ1BpZWNlIHN0ciA9ICJbKiYjMjVdIjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICBvd18uU3RhcnRMaXN0KCIiKTsKKyAgICBEb0Vycm9yVGVzdChzdHIsIGksICJFeHBlY3RlZCBhIHZhbHVlIG9yIF0gd2l0aGluIGFuIGFycmF5LiIsCisgICAgICAgICAgICAgICAgUGFyc2VFcnJvclR5cGU6OkVYUEVDVEVEX1ZBTFVFX09SX0JSQUNLRVQpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgVW5rbm93bkNoYXJhY3RlcnNJbk9iamVjdCkgeworICBTdHJpbmdQaWVjZSBzdHIgPSAieydrZXknOiAqJiMyNX0iOworICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHIubGVuZ3RoKCk7ICsraSkgeworICAgIG93Xy5TdGFydE9iamVjdCgiIik7CisgICAgRG9FcnJvclRlc3Qoc3RyLCBpLCAiRXhwZWN0ZWQgYSB2YWx1ZS4iLCBQYXJzZUVycm9yVHlwZTo6RVhQRUNURURfVkFMVUUpOworICB9Cit9CisKK1RFU1RfRihKc29uU3RyZWFtUGFyc2VyVGVzdCwgRGVlcE5lc3RKc29uTm90RXhjZWVkTGltaXQpIHsKKyAgaW50IGNvdW50ID0gOTk7CisgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgU3RyQXBwZW5kKCZzdHIsICJ7J2EnOiIpOworICB9CisgIFN0ckFwcGVuZCgmc3RyLCAieyduZXN0NjQnOid2MScsICduZXN0NjQnOiBmYWxzZSwgJ25lc3Q2NCc6IFsndjInXX0iKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgU3RyQXBwZW5kKCZzdHIsICJ9Iik7CisgIH0KKyAgb3dfLlN0YXJ0T2JqZWN0KCIiKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgb3dfLlN0YXJ0T2JqZWN0KCJhIik7CisgIH0KKyAgb3dfLlJlbmRlclN0cmluZygibmVzdDY0IiwgInYxIikKKyAgICAgIC0+UmVuZGVyQm9vbCgibmVzdDY0IiwgZmFsc2UpCisgICAgICAtPlN0YXJ0TGlzdCgibmVzdDY0IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAidjIiKQorICAgICAgLT5FbmRMaXN0KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgIG93Xy5FbmRPYmplY3QoKTsKKyAgfQorICBvd18uRW5kT2JqZWN0KCk7CisgIERvVGVzdChzdHIsIDApOworfQorCitURVNUX0YoSnNvblN0cmVhbVBhcnNlclRlc3QsIERlZXBOZXN0SnNvbkV4Y2VlZExpbWl0KSB7CisgIGludCBjb3VudCA9IDk4OworICBzdGQ6OnN0cmluZyBzdHI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgIFN0ckFwcGVuZCgmc3RyLCAieydhJzoiKTsKKyAgfQorICAvLyBTdXBwb3J0cyB0cmFpbGluZyBjb21tYXMuCisgIFN0ckFwcGVuZCgmc3RyLAorICAgICAgICAgICAgICAgICAgInsnbmVzdDExJyA6IFt7J25lc3QxMicgOiBudWxsLH0sXSwiCisgICAgICAgICAgICAgICAgICAiJ25lc3QyMScgOiB7J25lc3QyMicgOiB7J25lc3QyMycgOiBmYWxzZX19fSIpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICBTdHJBcHBlbmQoJnN0ciwgIn0iKTsKKyAgfQorICBEb0Vycm9yVGVzdChzdHIsIDAsCisgICAgICAgICAgICAgICJNZXNzYWdlIHRvbyBkZWVwLiBNYXggcmVjdXJzaW9uIGRlcHRoIHJlYWNoZWQgZm9yIGtleSAnbmVzdDIyJyIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29udmVydGVyCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvbG9jYXRpb25fdHJhY2tlci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2xvY2F0aW9uX3RyYWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGZlZmNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2xvY2F0aW9uX3RyYWNrZXIuaApAQCAtMCwwICsxLDcwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9MT0NBVElPTl9UUkFDS0VSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9MT0NBVElPTl9UUkFDS0VSX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKKy8vIExvY2F0aW9uVHJhY2tlckludGVyZmFjZSBpcyBhbiBpbnRlcmZhY2UgZm9yIGNsYXNzZXMgdGhhdCB0cmFjaworLy8gdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgcHVycG9zZSBvZiBlcnJvciByZXBvcnRpbmcuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTG9jYXRpb25UcmFja2VySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkxvY2F0aW9uVHJhY2tlckludGVyZmFjZSgpIHt9CisKKyAgLy8gUmV0dXJucyB0aGUgb2JqZWN0IGxvY2F0aW9uIGFzIGh1bWFuIHJlYWRhYmxlIHN0cmluZy4KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0ID0gMDsKKworIHByb3RlY3RlZDoKKyAgTG9jYXRpb25UcmFja2VySW50ZXJmYWNlKCkge30KKworIHByaXZhdGU6CisgIC8vIFBsZWFzZSBkbyBub3QgYWRkIGFueSBkYXRhIG1lbWJlcnMgdG8gdGhpcyBjbGFzcy4KKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExvY2F0aW9uVHJhY2tlckludGVyZmFjZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY29udmVydGVyCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfTE9DQVRJT05fVFJBQ0tFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9tb2NrX2Vycm9yX2xpc3RlbmVyLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvbW9ja19lcnJvcl9saXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYmRkODgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvbW9ja19lcnJvcl9saXN0ZW5lci5oCkBAIC0wLDAgKzEsNjggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX01PQ0tfRVJST1JfTElTVEVORVJfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX01PQ0tfRVJST1JfTElTVEVORVJfSF9fCisKKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZXJyb3JfbGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9sb2NhdGlvbl90cmFja2VyLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBjb252ZXJ0ZXIgeworCitjbGFzcyBNb2NrRXJyb3JMaXN0ZW5lciA6IHB1YmxpYyBFcnJvckxpc3RlbmVyIHsKKyBwdWJsaWM6CisgIE1vY2tFcnJvckxpc3RlbmVyKCkge30KKyAgfk1vY2tFcnJvckxpc3RlbmVyKCkgb3ZlcnJpZGUge30KKworICBNT0NLX01FVEhPRCh2b2lkLCBJbnZhbGlkTmFtZSwKKyAgICAgICAgICAgICAgKGNvbnN0IExvY2F0aW9uVHJhY2tlckludGVyZmFjZSYgbG9jLAorICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgdW5rbm93bl9uYW1lLCBTdHJpbmdQaWVjZSBtZXNzYWdlKSwKKyAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7CisgIE1PQ0tfTUVUSE9EKHZvaWQsIEludmFsaWRWYWx1ZSwKKyAgICAgICAgICAgICAgKGNvbnN0IExvY2F0aW9uVHJhY2tlckludGVyZmFjZSYgbG9jLCBTdHJpbmdQaWVjZSB0eXBlX25hbWUsCisgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSB2YWx1ZSksCisgICAgICAgICAgICAgIChvdmVycmlkZSkpOworICBNT0NLX01FVEhPRCh2b2lkLCBNaXNzaW5nRmllbGQsCisgICAgICAgICAgICAgIChjb25zdCBMb2NhdGlvblRyYWNrZXJJbnRlcmZhY2UmIGxvYywKKyAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG1pc3NpbmdfbmFtZSksCisgICAgICAgICAgICAgIChvdmVycmlkZSkpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnRlcgorfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX01PQ0tfRVJST1JfTElTVEVORVJfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X2xvY2F0aW9uX3RyYWNrZXIuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3RfbG9jYXRpb25fdHJhY2tlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ODIxZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X2xvY2F0aW9uX3RyYWNrZXIuaApAQCAtMCwwICsxLDY0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9PQkpFQ1RfTE9DQVRJT05fVFJBQ0tFUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfT0JKRUNUX0xPQ0FUSU9OX1RSQUNLRVJfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvbG9jYXRpb25fdHJhY2tlci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgY29udmVydGVyIHsKKworLy8gQW4gZW1wdHkgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgTG9jYXRpb25UcmFja2VySW50ZXJmYWNlLgorY2xhc3MgT2JqZWN0TG9jYXRpb25UcmFja2VyIDogcHVibGljIExvY2F0aW9uVHJhY2tlckludGVyZmFjZSB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGFuIGVtcHR5IGxvY2F0aW9uIHRyYWNrZXIuCisgIE9iamVjdExvY2F0aW9uVHJhY2tlcigpIHt9CisKKyAgfk9iamVjdExvY2F0aW9uVHJhY2tlcigpIG92ZXJyaWRlIHt9CisKKyAgLy8gUmV0dXJucyBlbXB0eSBiZWNhdXNlIG5vdGhpbmcgaXMgdHJhY2tlZC4KKyAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiIjsgfQorCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE9iamVjdExvY2F0aW9uVHJhY2tlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY29udmVydGVyCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfT0JKRUNUX0xPQ0FUSU9OX1RSQUNLRVJfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3NvdXJjZS5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF9zb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzc2NzJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF9zb3VyY2UuaApAQCAtMCwwICsxLDg1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9PQkpFQ1RfU09VUkNFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9PQkpFQ1RfU09VUkNFX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBjb252ZXJ0ZXIgeworCitjbGFzcyBPYmplY3RXcml0ZXI7CisKKy8vIEFuIE9iamVjdFNvdXJjZSBpcyBhbnl0aGluZyB0aGF0IGNhbiB3cml0ZSB0byBhbiBPYmplY3RXcml0ZXIuCisvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSB0eXBpY2FsbHkgcHJvdmlkZSBjb25zdHJ1Y3RvcnMgb3IKKy8vIGZhY3RvcnkgbWV0aG9kcyB0byBjcmVhdGUgYW4gaW5zdGFuY2UgYmFzZWQgb24gc29tZSBzb3VyY2UgZGF0YSwgZm9yCisvLyBleGFtcGxlLCBhIGNoYXJhY3RlciBzdHJlYW0sIG9yIHByb3RvYnVmLgorLy8KKy8vIERlcml2ZWQgY2xhc3NlcyBjb3VsZCBiZSB0aHJlYWQtdW5zYWZlLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIE9iamVjdFNvdXJjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5PYmplY3RTb3VyY2UoKSB7fQorCisgIC8vIFdyaXRlcyB0byB0aGUgT2JqZWN0V3JpdGVyCisgIHZpcnR1YWwgdXRpbDo6U3RhdHVzIFdyaXRlVG8oT2JqZWN0V3JpdGVyKiBvdykgY29uc3QgeworICAgIHJldHVybiBOYW1lZFdyaXRlVG8oIiIsIG93KTsKKyAgfQorCisgIC8vIFdyaXRlcyB0byB0aGUgT2JqZWN0V3JpdGVyIHdpdGggYSBjdXN0b20gbmFtZSBmb3IgdGhlIG1lc3NhZ2UuCisgIC8vIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IGNoYWluIE9iamVjdFNvdXJjZSB0b2dldGhlciBieSBlbWJlZGRpbmcgb25lCisgIC8vIHdpdGhpbiBhbm90aGVyLgorICB2aXJ0dWFsIHV0aWw6OlN0YXR1cyBOYW1lZFdyaXRlVG8oU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFdyaXRlciogb3cpIGNvbnN0ID0gMDsKKworIHByb3RlY3RlZDoKKyAgT2JqZWN0U291cmNlKCkge30KKworIHByaXZhdGU6CisgIC8vIERvIG5vdCBhZGQgYW55IGRhdGEgbWVtYmVycyB0byB0aGlzIGNsYXNzLgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoT2JqZWN0U291cmNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9PQkpFQ1RfU09VUkNFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF93cml0ZXIuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3dyaXRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGFiZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF93cml0ZXIuY2MKQEAgLTAsMCArMSw5MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfd3JpdGVyLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kYXRhcGllY2UuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKKy8vIHN0YXRpYwordm9pZCBPYmplY3RXcml0ZXI6OlJlbmRlckRhdGFQaWVjZVRvKGNvbnN0IERhdGFQaWVjZSYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBuYW1lLCBPYmplY3RXcml0ZXIqIG93KSB7CisgIHN3aXRjaCAoZGF0YS50eXBlKCkpIHsKKyAgICBjYXNlIERhdGFQaWVjZTo6VFlQRV9JTlQzMjogeworICAgICAgb3ctPlJlbmRlckludDMyKG5hbWUsIGRhdGEuVG9JbnQzMigpLnZhbHVlKCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGF0YVBpZWNlOjpUWVBFX0lOVDY0OiB7CisgICAgICBvdy0+UmVuZGVySW50NjQobmFtZSwgZGF0YS5Ub0ludDY0KCkudmFsdWUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEYXRhUGllY2U6OlRZUEVfVUlOVDMyOiB7CisgICAgICBvdy0+UmVuZGVyVWludDMyKG5hbWUsIGRhdGEuVG9VaW50MzIoKS52YWx1ZSgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERhdGFQaWVjZTo6VFlQRV9VSU5UNjQ6IHsKKyAgICAgIG93LT5SZW5kZXJVaW50NjQobmFtZSwgZGF0YS5Ub1VpbnQ2NCgpLnZhbHVlKCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGF0YVBpZWNlOjpUWVBFX0RPVUJMRTogeworICAgICAgb3ctPlJlbmRlckRvdWJsZShuYW1lLCBkYXRhLlRvRG91YmxlKCkudmFsdWUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEYXRhUGllY2U6OlRZUEVfRkxPQVQ6IHsKKyAgICAgIG93LT5SZW5kZXJGbG9hdChuYW1lLCBkYXRhLlRvRmxvYXQoKS52YWx1ZSgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERhdGFQaWVjZTo6VFlQRV9CT09MOiB7CisgICAgICBvdy0+UmVuZGVyQm9vbChuYW1lLCBkYXRhLlRvQm9vbCgpLnZhbHVlKCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGF0YVBpZWNlOjpUWVBFX1NUUklORzogeworICAgICAgb3ctPlJlbmRlclN0cmluZyhuYW1lLCBkYXRhLlRvU3RyaW5nKCkudmFsdWUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEYXRhUGllY2U6OlRZUEVfQllURVM6IHsKKyAgICAgIG93LT5SZW5kZXJCeXRlcyhuYW1lLCBkYXRhLlRvQnl0ZXMoKS52YWx1ZSgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERhdGFQaWVjZTo6VFlQRV9OVUxMOiB7CisgICAgICBvdy0+UmVuZGVyTnVsbChuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworCit9ICAvLyBuYW1lc3BhY2UgY29udmVydGVyCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3dyaXRlci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF93cml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQwOTViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF93cml0ZXIuaApAQCAtMCwwICsxLDE1MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfT0JKRUNUX1dSSVRFUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfT0JKRUNUX1dSSVRFUl9IX18KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBjb252ZXJ0ZXIgeworCisKK2NsYXNzIERhdGFQaWVjZTsKKworLy8gQW4gT2JqZWN0V3JpdGVyIGlzIGFuIGludGVyZmFjZSBmb3Igd3JpdGluZyBhIHN0cmVhbSBvZiBldmVudHMKKy8vIHJlcHJlc2VudGluZyBvYmplY3RzIGFuZCBjb2xsZWN0aW9ucy4gSW1wbGVtZW50YXRpb24gb2YgdGhpcworLy8gaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGFuIG9iamVjdCBzdHJlYW0gdG8gYW4gaW4tbWVtb3J5CisvLyBzdHJ1Y3R1cmUsIHByb3RvYnVmcywgSlNPTiwgWE1MLCBvciBhbnkgb3RoZXIgb3V0cHV0IGZvcm1hdAorLy8gZGVzaXJlZC4gVGhlIE9iamVjdFNvdXJjZSBpbnRlcmZhY2UgaXMgdHlwaWNhbGx5IHVzZWQgYXMgdGhlCisvLyBzb3VyY2Ugb2YgYW4gb2JqZWN0IHN0cmVhbS4KKy8vCisvLyBTZWUgSnNvbk9iamVjdFdyaXRlciBmb3IgYSBzYW1wbGUgaW1wbGVtZW50YXRpb24gb2YgT2JqZWN0V3JpdGVyCisvLyBhbmQgaXRzIHVzZS4KKy8vCisvLyBEZXJpdmVkIGNsYXNzZXMgY291bGQgYmUgdGhyZWFkLXVuc2FmZS4KKy8vCisvLyBUT0RPKHhpbmIpOiBzZWVtcyBsaWtlIGEgcHJpbWUgY2FuZGlkYXRlIHRvIGFwcGx5IHRoZSBSQUlJIHBhcmFkaWdtCisvLyBhbmQgZ2V0IHJpZCB0aGUgbmVlZCB0byBjYWxsIEVuZFhYWCgpLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIE9iamVjdFdyaXRlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5PYmplY3RXcml0ZXIoKSB7fQorCisgIC8vIFN0YXJ0cyBhbiBvYmplY3QuIElmIHRoZSBuYW1lIGlzIGVtcHR5LCB0aGUgb2JqZWN0IHdpbGwgbm90IGJlIG5hbWVkLgorICB2aXJ0dWFsIE9iamVjdFdyaXRlciogU3RhcnRPYmplY3QoU3RyaW5nUGllY2UgbmFtZSkgPSAwOworCisgIC8vIEVuZHMgYW4gb2JqZWN0LgorICB2aXJ0dWFsIE9iamVjdFdyaXRlciogRW5kT2JqZWN0KCkgPSAwOworCisgIC8vIFN0YXJ0cyBhIGxpc3QuIElmIHRoZSBuYW1lIGlzIGVtcHR5LCB0aGUgbGlzdCB3aWxsIG5vdCBiZSBuYW1lZC4KKyAgdmlydHVhbCBPYmplY3RXcml0ZXIqIFN0YXJ0TGlzdChTdHJpbmdQaWVjZSBuYW1lKSA9IDA7CisKKyAgLy8gRW5kcyBhIGxpc3QuCisgIHZpcnR1YWwgT2JqZWN0V3JpdGVyKiBFbmRMaXN0KCkgPSAwOworCisgIC8vIFJlbmRlcnMgYSBib29sZWFuIHZhbHVlLgorICB2aXJ0dWFsIE9iamVjdFdyaXRlciogUmVuZGVyQm9vbChTdHJpbmdQaWVjZSBuYW1lLCBib29sIHZhbHVlKSA9IDA7CisKKyAgLy8gUmVuZGVycyBhbiAzMi1iaXQgaW50ZWdlciB2YWx1ZS4KKyAgdmlydHVhbCBPYmplY3RXcml0ZXIqIFJlbmRlckludDMyKFN0cmluZ1BpZWNlIG5hbWUsIGludDMyX3QgdmFsdWUpID0gMDsKKworICAvLyBSZW5kZXJzIGFuIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlLgorICB2aXJ0dWFsIE9iamVjdFdyaXRlciogUmVuZGVyVWludDMyKFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpID0gMDsKKworICAvLyBSZW5kZXJzIGEgNjQtYml0IGludGVnZXIgdmFsdWUuCisgIHZpcnR1YWwgT2JqZWN0V3JpdGVyKiBSZW5kZXJJbnQ2NChTdHJpbmdQaWVjZSBuYW1lLCBpbnQ2NF90IHZhbHVlKSA9IDA7CisKKyAgLy8gUmVuZGVycyBhbiA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciB2YWx1ZS4KKyAgdmlydHVhbCBPYmplY3RXcml0ZXIqIFJlbmRlclVpbnQ2NChTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlKSA9IDA7CisKKworICAvLyBSZW5kZXJzIGEgZG91YmxlIHZhbHVlLgorICB2aXJ0dWFsIE9iamVjdFdyaXRlciogUmVuZGVyRG91YmxlKFN0cmluZ1BpZWNlIG5hbWUsIGRvdWJsZSB2YWx1ZSkgPSAwOworICAvLyBSZW5kZXJzIGEgZmxvYXQgdmFsdWUuCisgIHZpcnR1YWwgT2JqZWN0V3JpdGVyKiBSZW5kZXJGbG9hdChTdHJpbmdQaWVjZSBuYW1lLCBmbG9hdCB2YWx1ZSkgPSAwOworCisgIC8vIFJlbmRlcnMgYSBTdHJpbmdQaWVjZSB2YWx1ZS4gVGhpcyBpcyBmb3IgcmVuZGVyaW5nIHN0cmluZ3MuCisgIHZpcnR1YWwgT2JqZWN0V3JpdGVyKiBSZW5kZXJTdHJpbmcoU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSB2YWx1ZSkgPSAwOworCisgIC8vIFJlbmRlcnMgYSBieXRlcyB2YWx1ZS4KKyAgdmlydHVhbCBPYmplY3RXcml0ZXIqIFJlbmRlckJ5dGVzKFN0cmluZ1BpZWNlIG5hbWUsIFN0cmluZ1BpZWNlIHZhbHVlKSA9IDA7CisKKyAgLy8gUmVuZGVycyBhIE51bGwgdmFsdWUuCisgIHZpcnR1YWwgT2JqZWN0V3JpdGVyKiBSZW5kZXJOdWxsKFN0cmluZ1BpZWNlIG5hbWUpID0gMDsKKworCisgIC8vIFJlbmRlcnMgYSBEYXRhUGllY2Ugb2JqZWN0IHRvIGEgT2JqZWN0V3JpdGVyLgorICBzdGF0aWMgdm9pZCBSZW5kZXJEYXRhUGllY2VUbyhjb25zdCBEYXRhUGllY2UmIGRhdGEsIFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFdyaXRlciogb3cpOworCisKKyAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBPYmplY3RXcml0ZXIgaGFzIGNvbXBsZXRlZCB3cml0aW5nIHRoZSByb290IG1lc3NhZ2UsCisgIC8vIHVzdWFsbHkgdGhpcyBtZWFucyB3cml0aW5nIG9mIG9uZSBjb21wbGV0ZSBvYmplY3QuIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZQorICAvLyB0aGlzIGJlaGF2aW9yIGFwcHJvcHJpYXRlbHkuCisgIHZpcnR1YWwgYm9vbCBkb25lKCkgeyByZXR1cm4gZmFsc2U7IH0KKworICB2b2lkIHNldF91c2Vfc3RyaWN0X2Jhc2U2NF9kZWNvZGluZyhib29sIHZhbHVlKSB7CisgICAgdXNlX3N0cmljdF9iYXNlNjRfZGVjb2RpbmdfID0gdmFsdWU7CisgIH0KKworICBib29sIHVzZV9zdHJpY3RfYmFzZTY0X2RlY29kaW5nKCkgY29uc3QgeworICAgIHJldHVybiB1c2Vfc3RyaWN0X2Jhc2U2NF9kZWNvZGluZ187CisgIH0KKworIHByb3RlY3RlZDoKKyAgT2JqZWN0V3JpdGVyKCkgOiB1c2Vfc3RyaWN0X2Jhc2U2NF9kZWNvZGluZ18odHJ1ZSkge30KKworIHByaXZhdGU6CisgIC8vIElmIHNldCB0byB0cnVlLCB3ZSB1c2UgdGhlIHN0cmljdGVyIHZlcnNpb24gb2YgYmFzZTY0IGRlY29kaW5nIGZvciBieXRlCisgIC8vIGZpZWxkcyBieSBtYWtpbmcgc3VyZSBkZWNvZGVkIHZlcnNpb24gZW5jb2RlcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzdHJpbmcuCisgIGJvb2wgdXNlX3N0cmljdF9iYXNlNjRfZGVjb2RpbmdfOworCisgIC8vIERvIG5vdCBhZGQgYW55IGRhdGEgbWVtYmVycyB0byB0aGlzIGNsYXNzLgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoT2JqZWN0V3JpdGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9PQkpFQ1RfV1JJVEVSX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvX3dyaXRlci5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b193cml0ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhNWUyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b193cml0ZXIuY2MKQEAgLTAsMCArMSw4MjcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9fd3JpdGVyLmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZmllbGRfbWFza191dGlsaXR5Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X2xvY2F0aW9uX3RyYWNrZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+CisKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBjb252ZXJ0ZXIgeworCit1c2luZyBpbzo6Q29kZWRPdXRwdXRTdHJlYW07Cit1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOworCitQcm90b1dyaXRlcjo6UHJvdG9Xcml0ZXIoVHlwZVJlc29sdmVyKiB0eXBlX3Jlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nczo6Qnl0ZVNpbmsqIG91dHB1dCwgRXJyb3JMaXN0ZW5lciogbGlzdGVuZXIpCisgICAgOiBtYXN0ZXJfdHlwZV8odHlwZSksCisgICAgICB0eXBlaW5mb18oVHlwZUluZm86Ok5ld1R5cGVJbmZvKHR5cGVfcmVzb2x2ZXIpKSwKKyAgICAgIG93bl90eXBlaW5mb18odHJ1ZSksCisgICAgICBkb25lXyhmYWxzZSksCisgICAgICBpZ25vcmVfdW5rbm93bl9maWVsZHNfKGZhbHNlKSwKKyAgICAgIGlnbm9yZV91bmtub3duX2VudW1fdmFsdWVzXyhmYWxzZSksCisgICAgICB1c2VfbG93ZXJfY2FtZWxfZm9yX2VudW1zXyhmYWxzZSksCisgICAgICBjYXNlX2luc2Vuc2l0aXZlX2VudW1fcGFyc2luZ18odHJ1ZSksCisgICAgICB1c2VfanNvbl9uYW1lX2luX21pc3NpbmdfZmllbGRzXyhmYWxzZSksCisgICAgICBlbGVtZW50XyhudWxscHRyKSwKKyAgICAgIHNpemVfaW5zZXJ0XygpLAorICAgICAgb3V0cHV0XyhvdXRwdXQpLAorICAgICAgYnVmZmVyXygpLAorICAgICAgYWRhcHRlcl8oJmJ1ZmZlcl8pLAorICAgICAgc3RyZWFtXyhuZXcgQ29kZWRPdXRwdXRTdHJlYW0oJmFkYXB0ZXJfKSksCisgICAgICBsaXN0ZW5lcl8obGlzdGVuZXIpLAorICAgICAgaW52YWxpZF9kZXB0aF8oMCksCisgICAgICB0cmFja2VyXyhuZXcgT2JqZWN0TG9jYXRpb25UcmFja2VyKCkpIHt9CisKK1Byb3RvV3JpdGVyOjpQcm90b1dyaXRlcihjb25zdCBUeXBlSW5mbyogdHlwZWluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzOjpCeXRlU2luayogb3V0cHV0LCBFcnJvckxpc3RlbmVyKiBsaXN0ZW5lcikKKyAgICA6IG1hc3Rlcl90eXBlXyh0eXBlKSwKKyAgICAgIHR5cGVpbmZvXyh0eXBlaW5mbyksCisgICAgICBvd25fdHlwZWluZm9fKGZhbHNlKSwKKyAgICAgIGRvbmVfKGZhbHNlKSwKKyAgICAgIGlnbm9yZV91bmtub3duX2ZpZWxkc18oZmFsc2UpLAorICAgICAgaWdub3JlX3Vua25vd25fZW51bV92YWx1ZXNfKGZhbHNlKSwKKyAgICAgIHVzZV9sb3dlcl9jYW1lbF9mb3JfZW51bXNfKGZhbHNlKSwKKyAgICAgIGNhc2VfaW5zZW5zaXRpdmVfZW51bV9wYXJzaW5nXyh0cnVlKSwKKyAgICAgIHVzZV9qc29uX25hbWVfaW5fbWlzc2luZ19maWVsZHNfKGZhbHNlKSwKKyAgICAgIGVsZW1lbnRfKG51bGxwdHIpLAorICAgICAgc2l6ZV9pbnNlcnRfKCksCisgICAgICBvdXRwdXRfKG91dHB1dCksCisgICAgICBidWZmZXJfKCksCisgICAgICBhZGFwdGVyXygmYnVmZmVyXyksCisgICAgICBzdHJlYW1fKG5ldyBDb2RlZE91dHB1dFN0cmVhbSgmYWRhcHRlcl8pKSwKKyAgICAgIGxpc3RlbmVyXyhsaXN0ZW5lciksCisgICAgICBpbnZhbGlkX2RlcHRoXygwKSwKKyAgICAgIHRyYWNrZXJfKG5ldyBPYmplY3RMb2NhdGlvblRyYWNrZXIoKSkge30KKworUHJvdG9Xcml0ZXI6On5Qcm90b1dyaXRlcigpIHsKKyAgaWYgKG93bl90eXBlaW5mb18pIHsKKyAgICBkZWxldGUgdHlwZWluZm9fOworICB9CisgIGlmIChlbGVtZW50XyA9PSBudWxscHRyKSByZXR1cm47CisgIC8vIENsZWFudXAgZXhwbGljaXRseSBpbiBvcmRlciB0byBhdm9pZCBkZXN0cnVjdG9yIHN0YWNrIG92ZXJmbG93IHdoZW4gaW5wdXQKKyAgLy8gaXMgZGVlcGx5IG5lc3RlZC4KKyAgLy8gQ2FzdCB0byBCYXNlRWxlbWVudCB0byBhdm9pZCBkb2luZyBhZGRpdGlvbmFsIGNoZWNrcyAobGlrZSBtaXNzaW5nIGZpZWxkcykKKyAgLy8gZHVyaW5nIHBvcCgpLgorICBzdGQ6OnVuaXF1ZV9wdHI8QmFzZUVsZW1lbnQ+IGVsZW1lbnQoCisgICAgICBzdGF0aWNfY2FzdDxCYXNlRWxlbWVudCo+KGVsZW1lbnRfLmdldCgpKS0+cG9wPEJhc2VFbGVtZW50PigpKTsKKyAgd2hpbGUgKGVsZW1lbnQgIT0gbnVsbHB0cikgeworICAgIGVsZW1lbnQucmVzZXQoZWxlbWVudC0+cG9wPEJhc2VFbGVtZW50PigpKTsKKyAgfQorfQorCituYW1lc3BhY2UgeworCisvLyBXcml0ZXMgYW4gSU5UMzIgZmllbGQsIGluY2x1ZGluZyB0YWcgdG8gdGhlIHN0cmVhbS4KK2lubGluZSB1dGlsOjpTdGF0dXMgV3JpdGVJbnQzMihpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBEYXRhUGllY2UmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0qIHN0cmVhbSkgeworICB1dGlsOjpTdGF0dXNPcjxpbnQzMl90PiBpMzIgPSBkYXRhLlRvSW50MzIoKTsKKyAgaWYgKGkzMi5vaygpKSB7CisgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoZmllbGRfbnVtYmVyLCBpMzIudmFsdWUoKSwgc3RyZWFtKTsKKyAgfQorICByZXR1cm4gaTMyLnN0YXR1cygpOworfQorCisvLyB3cml0ZXMgYW4gU0ZJWEVEMzIgZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uCitpbmxpbmUgdXRpbDo6U3RhdHVzIFdyaXRlU0ZpeGVkMzIoaW50IGZpZWxkX251bWJlciwgY29uc3QgRGF0YVBpZWNlJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtKiBzdHJlYW0pIHsKKyAgdXRpbDo6U3RhdHVzT3I8aW50MzJfdD4gaTMyID0gZGF0YS5Ub0ludDMyKCk7CisgIGlmIChpMzIub2soKSkgeworICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNGaXhlZDMyKGZpZWxkX251bWJlciwgaTMyLnZhbHVlKCksIHN0cmVhbSk7CisgIH0KKyAgcmV0dXJuIGkzMi5zdGF0dXMoKTsKK30KKworLy8gV3JpdGVzIGFuIFNJTlQzMiBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4KK2lubGluZSB1dGlsOjpTdGF0dXMgV3JpdGVTSW50MzIoaW50IGZpZWxkX251bWJlciwgY29uc3QgRGF0YVBpZWNlJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSogc3RyZWFtKSB7CisgIHV0aWw6OlN0YXR1c09yPGludDMyX3Q+IGkzMiA9IGRhdGEuVG9JbnQzMigpOworICBpZiAoaTMyLm9rKCkpIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTSW50MzIoZmllbGRfbnVtYmVyLCBpMzIudmFsdWUoKSwgc3RyZWFtKTsKKyAgfQorICByZXR1cm4gaTMyLnN0YXR1cygpOworfQorCisvLyBXcml0ZXMgYSBGSVhFRDMyIGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLgoraW5saW5lIHV0aWw6OlN0YXR1cyBXcml0ZUZpeGVkMzIoaW50IGZpZWxkX251bWJlciwgY29uc3QgRGF0YVBpZWNlJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0qIHN0cmVhbSkgeworICB1dGlsOjpTdGF0dXNPcjx1aW50MzJfdD4gdTMyID0gZGF0YS5Ub1VpbnQzMigpOworICBpZiAodTMyLm9rKCkpIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDMyKGZpZWxkX251bWJlciwgdTMyLnZhbHVlKCksIHN0cmVhbSk7CisgIH0KKyAgcmV0dXJuIHUzMi5zdGF0dXMoKTsKK30KKworLy8gV3JpdGVzIGEgVUlOVDMyIGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLgoraW5saW5lIHV0aWw6OlN0YXR1cyBXcml0ZVVJbnQzMihpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBEYXRhUGllY2UmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtKiBzdHJlYW0pIHsKKyAgdXRpbDo6U3RhdHVzT3I8dWludDMyX3Q+IHUzMiA9IGRhdGEuVG9VaW50MzIoKTsKKyAgaWYgKHUzMi5vaygpKSB7CisgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDMyKGZpZWxkX251bWJlciwgdTMyLnZhbHVlKCksIHN0cmVhbSk7CisgIH0KKyAgcmV0dXJuIHUzMi5zdGF0dXMoKTsKK30KKworLy8gV3JpdGVzIGFuIElOVDY0IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLgoraW5saW5lIHV0aWw6OlN0YXR1cyBXcml0ZUludDY0KGludCBmaWVsZF9udW1iZXIsIGNvbnN0IERhdGFQaWVjZSYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSogc3RyZWFtKSB7CisgIHV0aWw6OlN0YXR1c09yPGludDY0X3Q+IGk2NCA9IGRhdGEuVG9JbnQ2NCgpOworICBpZiAoaTY0Lm9rKCkpIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQ2NChmaWVsZF9udW1iZXIsIGk2NC52YWx1ZSgpLCBzdHJlYW0pOworICB9CisgIHJldHVybiBpNjQuc3RhdHVzKCk7Cit9CisKKy8vIFdyaXRlcyBhbiBTRklYRUQ2NCBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4KK2lubGluZSB1dGlsOjpTdGF0dXMgV3JpdGVTRml4ZWQ2NChpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBEYXRhUGllY2UmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0qIHN0cmVhbSkgeworICB1dGlsOjpTdGF0dXNPcjxpbnQ2NF90PiBpNjQgPSBkYXRhLlRvSW50NjQoKTsKKyAgaWYgKGk2NC5vaygpKSB7CisgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkNjQoZmllbGRfbnVtYmVyLCBpNjQudmFsdWUoKSwgc3RyZWFtKTsKKyAgfQorICByZXR1cm4gaTY0LnN0YXR1cygpOworfQorCisvLyBXcml0ZXMgYW4gU0lOVDY0IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLgoraW5saW5lIHV0aWw6OlN0YXR1cyBXcml0ZVNJbnQ2NChpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBEYXRhUGllY2UmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtKiBzdHJlYW0pIHsKKyAgdXRpbDo6U3RhdHVzT3I8aW50NjRfdD4gaTY0ID0gZGF0YS5Ub0ludDY0KCk7CisgIGlmIChpNjQub2soKSkgeworICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQ2NChmaWVsZF9udW1iZXIsIGk2NC52YWx1ZSgpLCBzdHJlYW0pOworICB9CisgIHJldHVybiBpNjQuc3RhdHVzKCk7Cit9CisKKy8vIFdyaXRlcyBhIEZJWEVENjQgZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uCitpbmxpbmUgdXRpbDo6U3RhdHVzIFdyaXRlRml4ZWQ2NChpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBEYXRhUGllY2UmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSogc3RyZWFtKSB7CisgIHV0aWw6OlN0YXR1c09yPHVpbnQ2NF90PiB1NjQgPSBkYXRhLlRvVWludDY0KCk7CisgIGlmICh1NjQub2soKSkgeworICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkNjQoZmllbGRfbnVtYmVyLCB1NjQudmFsdWUoKSwgc3RyZWFtKTsKKyAgfQorICByZXR1cm4gdTY0LnN0YXR1cygpOworfQorCisvLyBXcml0ZXMgYSBVSU5UNjQgZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uCitpbmxpbmUgdXRpbDo6U3RhdHVzIFdyaXRlVUludDY0KGludCBmaWVsZF9udW1iZXIsIGNvbnN0IERhdGFQaWVjZSYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0qIHN0cmVhbSkgeworICB1dGlsOjpTdGF0dXNPcjx1aW50NjRfdD4gdTY0ID0gZGF0YS5Ub1VpbnQ2NCgpOworICBpZiAodTY0Lm9rKCkpIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjQoZmllbGRfbnVtYmVyLCB1NjQudmFsdWUoKSwgc3RyZWFtKTsKKyAgfQorICByZXR1cm4gdTY0LnN0YXR1cygpOworfQorCisvLyBXcml0ZXMgYSBET1VCTEUgZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uCitpbmxpbmUgdXRpbDo6U3RhdHVzIFdyaXRlRG91YmxlKGludCBmaWVsZF9udW1iZXIsIGNvbnN0IERhdGFQaWVjZSYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0qIHN0cmVhbSkgeworICB1dGlsOjpTdGF0dXNPcjxkb3VibGU+IGQgPSBkYXRhLlRvRG91YmxlKCk7CisgIGlmIChkLm9rKCkpIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVEb3VibGUoZmllbGRfbnVtYmVyLCBkLnZhbHVlKCksIHN0cmVhbSk7CisgIH0KKyAgcmV0dXJuIGQuc3RhdHVzKCk7Cit9CisKKy8vIFdyaXRlcyBhIEZMT0FUIGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLgoraW5saW5lIHV0aWw6OlN0YXR1cyBXcml0ZUZsb2F0KGludCBmaWVsZF9udW1iZXIsIGNvbnN0IERhdGFQaWVjZSYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSogc3RyZWFtKSB7CisgIHV0aWw6OlN0YXR1c09yPGZsb2F0PiBmID0gZGF0YS5Ub0Zsb2F0KCk7CisgIGlmIChmLm9rKCkpIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdChmaWVsZF9udW1iZXIsIGYudmFsdWUoKSwgc3RyZWFtKTsKKyAgfQorICByZXR1cm4gZi5zdGF0dXMoKTsKK30KKworLy8gV3JpdGVzIGEgQk9PTCBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4KK2lubGluZSB1dGlsOjpTdGF0dXMgV3JpdGVCb29sKGludCBmaWVsZF9udW1iZXIsIGNvbnN0IERhdGFQaWVjZSYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtKiBzdHJlYW0pIHsKKyAgdXRpbDo6U3RhdHVzT3I8Ym9vbD4gYiA9IGRhdGEuVG9Cb29sKCk7CisgIGlmIChiLm9rKCkpIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKGZpZWxkX251bWJlciwgYi52YWx1ZSgpLCBzdHJlYW0pOworICB9CisgIHJldHVybiBiLnN0YXR1cygpOworfQorCisvLyBXcml0ZXMgYSBCWVRFUyBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4KK2lubGluZSB1dGlsOjpTdGF0dXMgV3JpdGVCeXRlcyhpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBEYXRhUGllY2UmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0qIHN0cmVhbSkgeworICB1dGlsOjpTdGF0dXNPcjxzdGQ6OnN0cmluZz4gYyA9IGRhdGEuVG9CeXRlcygpOworICBpZiAoYy5vaygpKSB7CisgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXMoZmllbGRfbnVtYmVyLCBjLnZhbHVlKCksIHN0cmVhbSk7CisgIH0KKyAgcmV0dXJuIGMuc3RhdHVzKCk7Cit9CisKKy8vIFdyaXRlcyBhIFNUUklORyBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4KK2lubGluZSB1dGlsOjpTdGF0dXMgV3JpdGVTdHJpbmcoaW50IGZpZWxkX251bWJlciwgY29uc3QgRGF0YVBpZWNlJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSogc3RyZWFtKSB7CisgIHV0aWw6OlN0YXR1c09yPHN0ZDo6c3RyaW5nPiBzID0gZGF0YS5Ub1N0cmluZygpOworICBpZiAocy5vaygpKSB7CisgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKGZpZWxkX251bWJlciwgcy52YWx1ZSgpLCBzdHJlYW0pOworICB9CisgIHJldHVybiBzLnN0YXR1cygpOworfQorCisvLyBHaXZlbiBhIGdvb2dsZTo6cHJvdG9idWY6OlR5cGUsIHJldHVybnMgdGhlIHNldCBvZiBhbGwgcmVxdWlyZWQgZmllbGRzLgorc3RkOjp1bm9yZGVyZWRfc2V0PGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKj4gR2V0UmVxdWlyZWRGaWVsZHMoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSkgeworICBzdGQ6OnVub3JkZXJlZF9zZXQ8Y29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqPiByZXF1aXJlZDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLmZpZWxkc19zaXplKCk7IGkrKykgeworICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCA9IHR5cGUuZmllbGRzKGkpOworICAgIGlmIChmaWVsZC5jYXJkaW5hbGl0eSgpID09IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpDQVJESU5BTElUWV9SRVFVSVJFRCkgeworICAgICAgcmVxdWlyZWQuaW5zZXJ0KCZmaWVsZCk7CisgICAgfQorICB9CisgIHJldHVybiByZXF1aXJlZDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK1Byb3RvV3JpdGVyOjpQcm90b0VsZW1lbnQ6OlByb3RvRWxlbWVudChjb25zdCBUeXBlSW5mbyogdHlwZWluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b1dyaXRlciogZW5jbG9zaW5nKQorICAgIDogQmFzZUVsZW1lbnQobnVsbHB0ciksCisgICAgICBvd18oZW5jbG9zaW5nKSwKKyAgICAgIHBhcmVudF9maWVsZF8obnVsbHB0ciksCisgICAgICB0eXBlaW5mb18odHlwZWluZm8pLAorICAgICAgcHJvdG8zXyh0eXBlLnN5bnRheCgpID09IGdvb2dsZTo6cHJvdG9idWY6OlNZTlRBWF9QUk9UTzMpLAorICAgICAgdHlwZV8odHlwZSksCisgICAgICBzaXplX2luZGV4XygtMSksCisgICAgICBhcnJheV9pbmRleF8oLTEpLAorICAgICAgLy8gb25lb2ZfaW5kaWNlc18gdmFsdWVzIGFyZSAxLWluZGV4ZWQgKDAgbWVhbnMgbm90IHByZXNlbnQpLgorICAgICAgb25lb2ZfaW5kaWNlc18odHlwZS5vbmVvZnNfc2l6ZSgpICsgMSkgeworICBpZiAoIXByb3RvM18pIHsKKyAgICByZXF1aXJlZF9maWVsZHNfID0gR2V0UmVxdWlyZWRGaWVsZHModHlwZV8pOworICB9Cit9CisKK1Byb3RvV3JpdGVyOjpQcm90b0VsZW1lbnQ6OlByb3RvRWxlbWVudChQcm90b1dyaXRlcjo6UHJvdG9FbGVtZW50KiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19saXN0KQorICAgIDogQmFzZUVsZW1lbnQocGFyZW50KSwKKyAgICAgIG93Xyh0aGlzLT5wYXJlbnQoKS0+b3dfKSwKKyAgICAgIHBhcmVudF9maWVsZF8oZmllbGQpLAorICAgICAgdHlwZWluZm9fKHRoaXMtPnBhcmVudCgpLT50eXBlaW5mb18pLAorICAgICAgcHJvdG8zXyh0eXBlLnN5bnRheCgpID09IGdvb2dsZTo6cHJvdG9idWY6OlNZTlRBWF9QUk9UTzMpLAorICAgICAgdHlwZV8odHlwZSksCisgICAgICBzaXplX2luZGV4XyghaXNfbGlzdCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+a2luZCgpID09IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX01FU1NBR0UKKyAgICAgICAgICAgICAgICAgICAgICA/IG93Xy0+c2l6ZV9pbnNlcnRfLnNpemUoKQorICAgICAgICAgICAgICAgICAgICAgIDogLTEpLAorICAgICAgYXJyYXlfaW5kZXhfKGlzX2xpc3QgPyAwIDogLTEpLAorICAgICAgLy8gb25lb2ZfaW5kaWNlc18gdmFsdWVzIGFyZSAxLWluZGV4ZWQgKDAgbWVhbnMgbm90IHByZXNlbnQpLgorICAgICAgb25lb2ZfaW5kaWNlc18odHlwZV8ub25lb2ZzX3NpemUoKSArIDEpIHsKKyAgaWYgKCFpc19saXN0KSB7CisgICAgaWYgKG93Xy0+SXNSZXBlYXRlZCgqZmllbGQpKSB7CisgICAgICAvLyBVcGRhdGUgYXJyYXlfaW5kZXhfIGlmIGl0IGlzIGFuIGV4cGxpY2l0IGxpc3QuCisgICAgICBpZiAodGhpcy0+cGFyZW50KCktPmFycmF5X2luZGV4XyA+PSAwKSB0aGlzLT5wYXJlbnQoKS0+YXJyYXlfaW5kZXhfKys7CisgICAgfSBlbHNlIGlmICghcHJvdG8zXykgeworICAgICAgLy8gRm9yIHJlcXVpcmVkIGZpZWxkcyB0cmFja2luZy4KKyAgICAgIHRoaXMtPnBhcmVudCgpLT5SZWdpc3RlckZpZWxkKGZpZWxkKTsKKyAgICB9CisKKyAgICBpZiAoZmllbGQtPmtpbmQoKSA9PSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9NRVNTQUdFKSB7CisgICAgICBpZiAoIXByb3RvM18pIHsKKyAgICAgICAgcmVxdWlyZWRfZmllbGRzXyA9IEdldFJlcXVpcmVkRmllbGRzKHR5cGVfKTsKKyAgICAgIH0KKyAgICAgIGludCBzdGFydF9wb3MgPSBvd18tPnN0cmVhbV8tPkJ5dGVDb3VudCgpOworICAgICAgLy8gbGVuZ3RoIG9mIHNlcmlhbGl6ZWQgbWVzc2FnZSBpcyB0aGUgZmluYWwgYnVmZmVyIHBvc2l0aW9uIG1pbnVzCisgICAgICAvLyBzdGFydGluZyBidWZmZXIgcG9zaXRpb24sIHBsdXMgbGVuZ3RoIGFkanVzdG1lbnRzIGZvciBzaXplIGZpZWxkcworICAgICAgLy8gb2YgYW55IG5lc3RlZCBtZXNzYWdlcy4gV2Ugc3RhcnQgd2l0aCAtc3RhcnRfcG9zIGhlcmUsIHNvIHdlIG9ubHkKKyAgICAgIC8vIG5lZWQgdG8gYWRkIHRoZSBmaW5hbCBidWZmZXIgcG9zaXRpb24gdG8gaXQgYXQgdGhlIGVuZC4KKyAgICAgIFNpemVJbmZvIGluZm8gPSB7c3RhcnRfcG9zLCAtc3RhcnRfcG9zfTsKKyAgICAgIG93Xy0+c2l6ZV9pbnNlcnRfLnB1c2hfYmFjayhpbmZvKTsKKyAgICB9CisgIH0KK30KKworUHJvdG9Xcml0ZXI6OlByb3RvRWxlbWVudCogUHJvdG9Xcml0ZXI6OlByb3RvRWxlbWVudDo6cG9wKCkgeworICBpZiAoIXByb3RvM18pIHsKKyAgICAvLyBDYWxscyB0aGUgcmVnaXN0ZXJlZCBlcnJvciBsaXN0ZW5lciBmb3IgYW55IHJlcXVpcmVkIGZpZWxkKHMpIG5vdCB5ZXQKKyAgICAvLyBzZWVuLgorICAgIGZvciAoc3RkOjp1bm9yZGVyZWRfc2V0PGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKj46Oml0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICByZXF1aXJlZF9maWVsZHNfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSByZXF1aXJlZF9maWVsZHNfLmVuZCgpOyArK2l0KSB7CisgICAgICBvd18tPk1pc3NpbmdGaWVsZChvd18tPnVzZV9qc29uX25hbWVfaW5fbWlzc2luZ19maWVsZHNfCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoKml0KS0+anNvbl9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgqaXQpLT5uYW1lKCkpOworICAgIH0KKyAgfQorICAvLyBDb21wdXRlcyB0aGUgdG90YWwgbnVtYmVyIG9mIHByb3RvIGJ5dGVzIHVzZWQgYnkgYSBtZXNzYWdlLCBhbHNvIGFkanVzdHMKKyAgLy8gdGhlIHNpemUgb2YgYWxsIHBhcmVudCBtZXNzYWdlcyBieSB0aGUgbGVuZ3RoIG9mIHRoaXMgc2l6ZSBmaWVsZC4KKyAgLy8gSWYgc2l6ZV9pbmRleF8gPCAwLCB0aGlzIGlzIG5vdCBhIG1lc3NhZ2UsIHNvIG5vIHNpemUgZmllbGQgaXMgYWRkZWQuCisgIGlmIChzaXplX2luZGV4XyA+PSAwKSB7CisgICAgLy8gQWRkIHRoZSBmaW5hbCBidWZmZXIgcG9zaXRpb24gdG8gY29tcHV0ZSB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoaXMKKyAgICAvLyBzZXJpYWxpemVkIG1lc3NhZ2UuIFRoZSBzdG9yZWQgdmFsdWUgKGJlZm9yZSB0aGlzIGFkZGl0aW9uKSBhbHJlYWR5CisgICAgLy8gY29udGFpbnMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgc2l6ZSBmaWVsZHMgb2YgYWxsIG5lc3RlZCBtZXNzYWdlcworICAgIC8vIG1pbnVzIHRoZSBpbml0aWFsIGJ1ZmZlciBwb3NpdGlvbi4KKyAgICBvd18tPnNpemVfaW5zZXJ0X1tzaXplX2luZGV4X10uc2l6ZSArPSBvd18tPnN0cmVhbV8tPkJ5dGVDb3VudCgpOworICAgIC8vIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSB0aGUgc2l6ZSBmaWVsZCBvZiB0aGUKKyAgICAvLyBtZXNzYWdlLCBhbmQgcHJvcGFnYXRlIHRoaXMgYWRkaXRpb25hbCBzaXplIGluZm9ybWF0aW9uIHVwd2FyZCB0bworICAgIC8vIGFsbCBlbmNsb3NpbmcgbWVzc2FnZXMuCisgICAgaW50IHNpemUgPSBvd18tPnNpemVfaW5zZXJ0X1tzaXplX2luZGV4X10uc2l6ZTsKKyAgICBpbnQgbGVuZ3RoID0gQ29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihzaXplKTsKKyAgICBmb3IgKFByb3RvRWxlbWVudCogZSA9IHBhcmVudCgpOyBlICE9IG51bGxwdHI7IGUgPSBlLT5wYXJlbnQoKSkgeworICAgICAgLy8gT25seSBuZXN0ZWQgbWVzc2FnZXMgaGF2ZSBzaXplIGZpZWxkLCBsaXN0cyBkbyBub3QgaGF2ZSBzaXplIGZpZWxkLgorICAgICAgaWYgKGUtPnNpemVfaW5kZXhfID49IDApIHsKKyAgICAgICAgb3dfLT5zaXplX2luc2VydF9bZS0+c2l6ZV9pbmRleF9dLnNpemUgKz0gbGVuZ3RoOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gQmFzZUVsZW1lbnQ6OnBvcDxQcm90b0VsZW1lbnQ+KCk7Cit9CisKK3ZvaWQgUHJvdG9Xcml0ZXI6OlByb3RvRWxlbWVudDo6UmVnaXN0ZXJGaWVsZCgKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogZmllbGQpIHsKKyAgaWYgKCFyZXF1aXJlZF9maWVsZHNfLmVtcHR5KCkgJiYKKyAgICAgIGZpZWxkLT5jYXJkaW5hbGl0eSgpID09IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpDQVJESU5BTElUWV9SRVFVSVJFRCkgeworICAgIHJlcXVpcmVkX2ZpZWxkc18uZXJhc2UoZmllbGQpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIFByb3RvV3JpdGVyOjpQcm90b0VsZW1lbnQ6OlRvU3RyaW5nKCkgY29uc3QgeworICBzdGQ6OnN0cmluZyBsb2MgPSAiIjsKKworICAvLyBmaXJzdCBwb3B1bGF0ZSBhIHN0YWNrIHdpdGggdGhlIG5vZGVzIHNpbmNlIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGVtCisgIC8vIGZyb20gcm9vdCB0byBsZWFmIHdoZW4gZ2VuZXJhdGluZyB0aGUgc3RyaW5nIGxvY2F0aW9uCisgIGNvbnN0IFByb3RvV3JpdGVyOjpQcm90b0VsZW1lbnQqIG5vdyA9IHRoaXM7CisgIHN0ZDo6c3RhY2s8Y29uc3QgUHJvdG9Xcml0ZXI6OlByb3RvRWxlbWVudCo+IGVsZW1lbnRfc3RhY2s7CisgIHdoaWxlIChub3ctPnBhcmVudCgpICE9IG51bGxwdHIpIHsKKyAgICBlbGVtZW50X3N0YWNrLnB1c2gobm93KTsKKyAgICBub3cgPSBub3ctPnBhcmVudCgpOworICB9CisKKyAgLy8gbm93IHBvcCBlYWNoIG5vZGUgZnJvbSB0aGUgc3RhY2sgYW5kIGFwcGVuZCB0byB0aGUgbG9jYXRpb24gc3RyaW5nCisgIHdoaWxlICghZWxlbWVudF9zdGFjay5lbXB0eSgpKSB7CisgICAgbm93ID0gZWxlbWVudF9zdGFjay50b3AoKTsKKyAgICBlbGVtZW50X3N0YWNrLnBvcCgpOworCisgICAgaWYgKCFvd18tPklzUmVwZWF0ZWQoKihub3ctPnBhcmVudF9maWVsZF8pKSB8fAorICAgICAgICBub3ctPnBhcmVudCgpLT5wYXJlbnRfZmllbGRfICE9IG5vdy0+cGFyZW50X2ZpZWxkXykgeworICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IG5vdy0+cGFyZW50X2ZpZWxkXy0+bmFtZSgpOworICAgICAgaW50IGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBuYW1lLnNpemUoKSAmJgorICAgICAgICAgICAgIChhc2NpaV9pc2FsbnVtKG5hbWVbaV0pIHx8IG5hbWVbaV0gPT0gJ18nKSkKKyAgICAgICAgKytpOworICAgICAgaWYgKGkgPiAwICYmIGkgPT0gbmFtZS5zaXplKCkpIHsgIC8vIHNhZmUgZmllbGQgbmFtZQorICAgICAgICBpZiAobG9jLmVtcHR5KCkpIHsKKyAgICAgICAgICBsb2MgPSBuYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFN0ckFwcGVuZCgmbG9jLCAiLiIsIG5hbWUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBTdHJBcHBlbmQoJmxvYywgIltcIiIsIENFc2NhcGUobmFtZSksICJcIl0iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgYXJyYXlfaW5kZXhfbm93ID0gbm93LT5hcnJheV9pbmRleF87CisgICAgaWYgKG93Xy0+SXNSZXBlYXRlZCgqKG5vdy0+cGFyZW50X2ZpZWxkXykpICYmIGFycmF5X2luZGV4X25vdyA+IDApIHsKKyAgICAgIFN0ckFwcGVuZCgmbG9jLCAiWyIsIGFycmF5X2luZGV4X25vdyAtIDEsICJdIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGxvYzsKK30KKworYm9vbCBQcm90b1dyaXRlcjo6UHJvdG9FbGVtZW50OjpJc09uZW9mSW5kZXhUYWtlbihpbnQzMl90IGluZGV4KSB7CisgIHJldHVybiBvbmVvZl9pbmRpY2VzX1tpbmRleF07Cit9CisKK3ZvaWQgUHJvdG9Xcml0ZXI6OlByb3RvRWxlbWVudDo6VGFrZU9uZW9mSW5kZXgoaW50MzJfdCBpbmRleCkgeworICBvbmVvZl9pbmRpY2VzX1tpbmRleF0gPSB0cnVlOworfQorCit2b2lkIFByb3RvV3JpdGVyOjpJbnZhbGlkTmFtZShTdHJpbmdQaWVjZSB1bmtub3duX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBtZXNzYWdlKSB7CisgIGxpc3RlbmVyXy0+SW52YWxpZE5hbWUobG9jYXRpb24oKSwgdW5rbm93bl9uYW1lLCBtZXNzYWdlKTsKK30KKwordm9pZCBQcm90b1dyaXRlcjo6SW52YWxpZFZhbHVlKFN0cmluZ1BpZWNlIHR5cGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSB2YWx1ZSkgeworICBsaXN0ZW5lcl8tPkludmFsaWRWYWx1ZShsb2NhdGlvbigpLCB0eXBlX25hbWUsIHZhbHVlKTsKK30KKwordm9pZCBQcm90b1dyaXRlcjo6TWlzc2luZ0ZpZWxkKFN0cmluZ1BpZWNlIG1pc3NpbmdfbmFtZSkgeworICBsaXN0ZW5lcl8tPk1pc3NpbmdGaWVsZChsb2NhdGlvbigpLCBtaXNzaW5nX25hbWUpOworfQorCitQcm90b1dyaXRlciogUHJvdG9Xcml0ZXI6OlN0YXJ0T2JqZWN0KAorICAgIFN0cmluZ1BpZWNlIG5hbWUpIHsKKyAgLy8gU3RhcnRpbmcgdGhlIHJvb3QgbWVzc2FnZS4gQ3JlYXRlIHRoZSByb290IFByb3RvRWxlbWVudCBhbmQgcmV0dXJuLgorICBpZiAoZWxlbWVudF8gPT0gbnVsbHB0cikgeworICAgIGlmICghbmFtZS5lbXB0eSgpKSB7CisgICAgICBJbnZhbGlkTmFtZShuYW1lLCAiUm9vdCBlbGVtZW50IHNob3VsZCBub3QgYmUgbmFtZWQuIik7CisgICAgfQorICAgIGVsZW1lbnRfLnJlc2V0KG5ldyBQcm90b0VsZW1lbnQodHlwZWluZm9fLCBtYXN0ZXJfdHlwZV8sIHRoaXMpKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBmaWVsZCA9IEJlZ2luTmFtZWQobmFtZSwgZmFsc2UpOworCisgIGlmIChmaWVsZCA9PSBudWxscHRyKSByZXR1cm4gdGhpczsKKworICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBmaWVsZCBpcyBhIG9uZW9mIGFuZCB0aGF0IG5vIG9uZW9mIGluIHRoYXQgZ3JvdXAgaGFzCisgIC8vIGFscmVhZHkgYmVlbiBzZXQuCisgIGlmICghVmFsaWRPbmVvZigqZmllbGQsIG5hbWUpKSB7CisgICAgKytpbnZhbGlkX2RlcHRoXzsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqIHR5cGUgPSBMb29rdXBUeXBlKGZpZWxkKTsKKyAgaWYgKHR5cGUgPT0gbnVsbHB0cikgeworICAgICsraW52YWxpZF9kZXB0aF87CisgICAgSW52YWxpZE5hbWUobmFtZSwgU3RyQ2F0KCJNaXNzaW5nIGRlc2NyaXB0b3IgZm9yIGZpZWxkOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+dHlwZV91cmwoKSkpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgcmV0dXJuIFN0YXJ0T2JqZWN0RmllbGQoKmZpZWxkLCAqdHlwZSk7Cit9CisKKworUHJvdG9Xcml0ZXIqIFByb3RvV3JpdGVyOjpFbmRPYmplY3QoKSB7CisgIGlmIChpbnZhbGlkX2RlcHRoXyA+IDApIHsKKyAgICAtLWludmFsaWRfZGVwdGhfOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgaWYgKGVsZW1lbnRfICE9IG51bGxwdHIpIHsKKyAgICBlbGVtZW50Xy5yZXNldChlbGVtZW50Xy0+cG9wKCkpOworICB9CisKKworICAvLyBJZiBlbmRpbmcgdGhlIHJvb3QgZWxlbWVudCwKKyAgLy8gdGhlbiBzZXJpYWxpemUgdGhlIGZ1bGwgbWVzc2FnZSB3aXRoIGNhbGN1bGF0ZWQgc2l6ZXMuCisgIGlmIChlbGVtZW50XyA9PSBudWxscHRyKSB7CisgICAgV3JpdGVSb290TWVzc2FnZSgpOworICB9CisgIHJldHVybiB0aGlzOworfQorCitQcm90b1dyaXRlciogUHJvdG9Xcml0ZXI6OlN0YXJ0TGlzdCgKKyAgICBTdHJpbmdQaWVjZSBuYW1lKSB7CisKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIGZpZWxkID0gQmVnaW5OYW1lZChuYW1lLCB0cnVlKTsKKworICBpZiAoZmllbGQgPT0gbnVsbHB0cikgcmV0dXJuIHRoaXM7CisKKyAgaWYgKCFWYWxpZE9uZW9mKCpmaWVsZCwgbmFtZSkpIHsKKyAgICArK2ludmFsaWRfZGVwdGhfOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogdHlwZSA9IExvb2t1cFR5cGUoZmllbGQpOworICBpZiAodHlwZSA9PSBudWxscHRyKSB7CisgICAgKytpbnZhbGlkX2RlcHRoXzsKKyAgICBJbnZhbGlkTmFtZShuYW1lLCBTdHJDYXQoIk1pc3NpbmcgZGVzY3JpcHRvciBmb3IgZmllbGQ6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT50eXBlX3VybCgpKSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICByZXR1cm4gU3RhcnRMaXN0RmllbGQoKmZpZWxkLCAqdHlwZSk7Cit9CisKKworUHJvdG9Xcml0ZXIqIFByb3RvV3JpdGVyOjpFbmRMaXN0KCkgeworICBpZiAoaW52YWxpZF9kZXB0aF8gPiAwKSB7CisgICAgLS1pbnZhbGlkX2RlcHRoXzsKKyAgfSBlbHNlIGlmIChlbGVtZW50XyAhPSBudWxscHRyKSB7CisgICAgZWxlbWVudF8ucmVzZXQoZWxlbWVudF8tPnBvcCgpKTsKKyAgfQorICByZXR1cm4gdGhpczsKK30KKworUHJvdG9Xcml0ZXIqIFByb3RvV3JpdGVyOjpSZW5kZXJEYXRhUGllY2UoCisgICAgU3RyaW5nUGllY2UgbmFtZSwgY29uc3QgRGF0YVBpZWNlJiBkYXRhKSB7CisgIHV0aWw6OlN0YXR1cyBzdGF0dXM7CisgIGlmIChpbnZhbGlkX2RlcHRoXyA+IDApIHJldHVybiB0aGlzOworCisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBmaWVsZCA9IExvb2t1cChuYW1lKTsKKworICBpZiAoZmllbGQgPT0gbnVsbHB0cikgcmV0dXJuIHRoaXM7CisKKyAgaWYgKCFWYWxpZE9uZW9mKCpmaWVsZCwgbmFtZSkpIHJldHVybiB0aGlzOworCisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqIHR5cGUgPSBMb29rdXBUeXBlKGZpZWxkKTsKKyAgaWYgKHR5cGUgPT0gbnVsbHB0cikgeworICAgIEludmFsaWROYW1lKG5hbWUsIFN0ckNhdCgiTWlzc2luZyBkZXNjcmlwdG9yIGZvciBmaWVsZDogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPnR5cGVfdXJsKCkpKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIHJldHVybiBSZW5kZXJQcmltaXRpdmVGaWVsZCgqZmllbGQsICp0eXBlLCBkYXRhKTsKK30KKworYm9vbCBQcm90b1dyaXRlcjo6VmFsaWRPbmVvZihjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCYgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIHVubm9ybWFsaXplZF9uYW1lKSB7CisgIGlmIChlbGVtZW50XyA9PSBudWxscHRyKSByZXR1cm4gdHJ1ZTsKKworICBpZiAoZmllbGQub25lb2ZfaW5kZXgoKSA+IDApIHsKKyAgICBpZiAoZWxlbWVudF8tPklzT25lb2ZJbmRleFRha2VuKGZpZWxkLm9uZW9mX2luZGV4KCkpKSB7CisgICAgICBJbnZhbGlkVmFsdWUoCisgICAgICAgICAgIm9uZW9mIiwKKyAgICAgICAgICBTdHJDYXQoCisgICAgICAgICAgICAgICJvbmVvZiBmaWVsZCAnIiwgZWxlbWVudF8tPnR5cGUoKS5vbmVvZnMoZmllbGQub25lb2ZfaW5kZXgoKSAtIDEpLAorICAgICAgICAgICAgICAiJyBpcyBhbHJlYWR5IHNldC4gQ2Fubm90IHNldCAnIiwgdW5ub3JtYWxpemVkX25hbWUsICInIikpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbGVtZW50Xy0+VGFrZU9uZW9mSW5kZXgoZmllbGQub25lb2ZfaW5kZXgoKSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUHJvdG9Xcml0ZXI6OklzUmVwZWF0ZWQoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQmIGZpZWxkKSB7CisgIHJldHVybiBmaWVsZC5jYXJkaW5hbGl0eSgpID09IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpDQVJESU5BTElUWV9SRVBFQVRFRDsKK30KKworUHJvdG9Xcml0ZXIqIFByb3RvV3JpdGVyOjpTdGFydE9iamVjdEZpZWxkKGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlKSB7CisgICAgV3JpdGVUYWcoZmllbGQpOworICBlbGVtZW50Xy5yZXNldChuZXcgUHJvdG9FbGVtZW50KGVsZW1lbnRfLnJlbGVhc2UoKSwgJmZpZWxkLCB0eXBlLCBmYWxzZSkpOworICByZXR1cm4gdGhpczsKK30KKworUHJvdG9Xcml0ZXIqIFByb3RvV3JpdGVyOjpTdGFydExpc3RGaWVsZChjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCYgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUpIHsKKyAgZWxlbWVudF8ucmVzZXQobmV3IFByb3RvRWxlbWVudChlbGVtZW50Xy5yZWxlYXNlKCksICZmaWVsZCwgdHlwZSwgdHJ1ZSkpOworICByZXR1cm4gdGhpczsKK30KKwordXRpbDo6U3RhdHVzIFByb3RvV3JpdGVyOjpXcml0ZUVudW0oaW50IGZpZWxkX251bWJlciwgY29uc3QgRGF0YVBpZWNlJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bSogZW51bV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2xvd2VyX2NhbWVsX2Zvcl9lbnVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzZV9pbnNlbnNpdGl2ZV9lbnVtX3BhcnNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yZV91bmtub3duX3ZhbHVlcykgeworICBib29sIGlzX3Vua25vd25fZW51bV92YWx1ZSA9IGZhbHNlOworICB1dGlsOjpTdGF0dXNPcjxpbnQ+IGUgPSBkYXRhLlRvRW51bSgKKyAgICAgIGVudW1fdHlwZSwgdXNlX2xvd2VyX2NhbWVsX2Zvcl9lbnVtcywgY2FzZV9pbnNlbnNpdGl2ZV9lbnVtX3BhcnNpbmcsCisgICAgICBpZ25vcmVfdW5rbm93bl92YWx1ZXMsICZpc191bmtub3duX2VudW1fdmFsdWUpOworICBpZiAoZS5vaygpICYmICFpc191bmtub3duX2VudW1fdmFsdWUpIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKGZpZWxkX251bWJlciwgZS52YWx1ZSgpLCBzdHJlYW0pOworICB9CisgIHJldHVybiBlLnN0YXR1cygpOworfQorCitQcm90b1dyaXRlciogUHJvdG9Xcml0ZXI6OlJlbmRlclByaW1pdGl2ZUZpZWxkKAorICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCwgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwKKyAgICBjb25zdCBEYXRhUGllY2UmIGRhdGEpIHsKKyAgdXRpbDo6U3RhdHVzIHN0YXR1czsKKworICAvLyBQdXNoaW5nIGEgUHJvdG9FbGVtZW50IGFuZCB0aGVuIHBvcCBpdCBvZmYgYXQgdGhlIGVuZCBmb3IgMiBwdXJwb3NlczoKKyAgLy8gZXJyb3IgbG9jYXRpb24gcmVwb3J0aW5nIGFuZCByZXF1aXJlZCBmaWVsZCBhY2NvdW50aW5nLgorICAvLworICAvLyBGb3IgcHJvdG8zLCBzaW5jZSB0aGVyZSBpcyBubyByZXF1aXJlZCBmaWVsZCB0cmFja2luZywgd2Ugb25seSBuZWVkIHRvCisgIC8vIHB1c2ggUHJvdG9FbGVtZW50IGZvciBlcnJvciBjYXNlcy4KKyAgaWYgKCFlbGVtZW50Xy0+cHJvdG8zKCkpIHsKKyAgICBlbGVtZW50Xy5yZXNldChuZXcgUHJvdG9FbGVtZW50KGVsZW1lbnRfLnJlbGVhc2UoKSwgJmZpZWxkLCB0eXBlLCBmYWxzZSkpOworICB9CisKKyAgc3dpdGNoIChmaWVsZC5raW5kKCkpIHsKKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0lOVDMyOiB7CisgICAgICBzdGF0dXMgPSBXcml0ZUludDMyKGZpZWxkLm51bWJlcigpLCBkYXRhLCBzdHJlYW1fLmdldCgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX1NGSVhFRDMyOiB7CisgICAgICBzdGF0dXMgPSBXcml0ZVNGaXhlZDMyKGZpZWxkLm51bWJlcigpLCBkYXRhLCBzdHJlYW1fLmdldCgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX1NJTlQzMjogeworICAgICAgc3RhdHVzID0gV3JpdGVTSW50MzIoZmllbGQubnVtYmVyKCksIGRhdGEsIHN0cmVhbV8uZ2V0KCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfRklYRUQzMjogeworICAgICAgc3RhdHVzID0gV3JpdGVGaXhlZDMyKGZpZWxkLm51bWJlcigpLCBkYXRhLCBzdHJlYW1fLmdldCgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX1VJTlQzMjogeworICAgICAgc3RhdHVzID0gV3JpdGVVSW50MzIoZmllbGQubnVtYmVyKCksIGRhdGEsIHN0cmVhbV8uZ2V0KCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfSU5UNjQ6IHsKKyAgICAgIHN0YXR1cyA9IFdyaXRlSW50NjQoZmllbGQubnVtYmVyKCksIGRhdGEsIHN0cmVhbV8uZ2V0KCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfU0ZJWEVENjQ6IHsKKyAgICAgIHN0YXR1cyA9IFdyaXRlU0ZpeGVkNjQoZmllbGQubnVtYmVyKCksIGRhdGEsIHN0cmVhbV8uZ2V0KCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfU0lOVDY0OiB7CisgICAgICBzdGF0dXMgPSBXcml0ZVNJbnQ2NChmaWVsZC5udW1iZXIoKSwgZGF0YSwgc3RyZWFtXy5nZXQoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9GSVhFRDY0OiB7CisgICAgICBzdGF0dXMgPSBXcml0ZUZpeGVkNjQoZmllbGQubnVtYmVyKCksIGRhdGEsIHN0cmVhbV8uZ2V0KCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfVUlOVDY0OiB7CisgICAgICBzdGF0dXMgPSBXcml0ZVVJbnQ2NChmaWVsZC5udW1iZXIoKSwgZGF0YSwgc3RyZWFtXy5nZXQoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9ET1VCTEU6IHsKKyAgICAgIHN0YXR1cyA9IFdyaXRlRG91YmxlKGZpZWxkLm51bWJlcigpLCBkYXRhLCBzdHJlYW1fLmdldCgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0ZMT0FUOiB7CisgICAgICBzdGF0dXMgPSBXcml0ZUZsb2F0KGZpZWxkLm51bWJlcigpLCBkYXRhLCBzdHJlYW1fLmdldCgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0JPT0w6IHsKKyAgICAgIHN0YXR1cyA9IFdyaXRlQm9vbChmaWVsZC5udW1iZXIoKSwgZGF0YSwgc3RyZWFtXy5nZXQoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9CWVRFUzogeworICAgICAgc3RhdHVzID0gV3JpdGVCeXRlcyhmaWVsZC5udW1iZXIoKSwgZGF0YSwgc3RyZWFtXy5nZXQoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9TVFJJTkc6IHsKKyAgICAgIHN0YXR1cyA9IFdyaXRlU3RyaW5nKGZpZWxkLm51bWJlcigpLCBkYXRhLCBzdHJlYW1fLmdldCgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0VOVU06IHsKKyAgICAgIHN0YXR1cyA9IFdyaXRlRW51bSgKKyAgICAgICAgICBmaWVsZC5udW1iZXIoKSwgZGF0YSwgdHlwZWluZm9fLT5HZXRFbnVtQnlUeXBlVXJsKGZpZWxkLnR5cGVfdXJsKCkpLAorICAgICAgICAgIHN0cmVhbV8uZ2V0KCksIHVzZV9sb3dlcl9jYW1lbF9mb3JfZW51bXNfLAorICAgICAgICAgIGNhc2VfaW5zZW5zaXRpdmVfZW51bV9wYXJzaW5nXywgaWdub3JlX3Vua25vd25fZW51bV92YWx1ZXNfKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiAgLy8gVFlQRV9HUk9VUCwgVFlQRV9NRVNTQUdFLCBUWVBFX1VOS05PV04uCisgICAgICBzdGF0dXMgPSB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcihkYXRhLlZhbHVlQXNTdHJpbmdPckRlZmF1bHQoIiIpKTsKKyAgfQorCisgIGlmICghc3RhdHVzLm9rKCkpIHsKKyAgICAvLyBQdXNoIGEgUHJvdG9FbGVtZW50IGZvciBsb2NhdGlvbiByZXBvcnRpbmcgcHVycG9zZXMuCisgICAgaWYgKGVsZW1lbnRfLT5wcm90bzMoKSkgeworICAgICAgZWxlbWVudF8ucmVzZXQobmV3IFByb3RvRWxlbWVudChlbGVtZW50Xy5yZWxlYXNlKCksICZmaWVsZCwgdHlwZSwgZmFsc2UpKTsKKyAgICB9CisgICAgSW52YWxpZFZhbHVlKGZpZWxkLnR5cGVfdXJsKCkuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAgPyBnb29nbGU6OnByb3RvYnVmOjpGaWVsZF9LaW5kX05hbWUoZmllbGQua2luZCgpKQorICAgICAgICAgICAgICAgICAgICAgOiBmaWVsZC50eXBlX3VybCgpLAorICAgICAgICAgICAgICAgICBzdGF0dXMubWVzc2FnZSgpKTsKKyAgICBlbGVtZW50Xy5yZXNldChlbGVtZW50KCktPnBvcCgpKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIGlmICghZWxlbWVudF8tPnByb3RvMygpKSBlbGVtZW50Xy5yZXNldChlbGVtZW50KCktPnBvcCgpKTsKKworICByZXR1cm4gdGhpczsKK30KKworY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIFByb3RvV3JpdGVyOjpCZWdpbk5hbWVkKFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19saXN0KSB7CisgIGlmIChpbnZhbGlkX2RlcHRoXyA+IDApIHsKKyAgICArK2ludmFsaWRfZGVwdGhfOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBmaWVsZCA9IExvb2t1cChuYW1lKTsKKyAgaWYgKGZpZWxkID09IG51bGxwdHIpIHsKKyAgICArK2ludmFsaWRfZGVwdGhfOworICAgIC8vIEludmFsaWROYW1lKCkgYWxyZWFkeSBjYWxsZWQgaW4gTG9va3VwKCkuCisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKGlzX2xpc3QgJiYgIUlzUmVwZWF0ZWQoKmZpZWxkKSkgeworICAgICsraW52YWxpZF9kZXB0aF87CisgICAgSW52YWxpZE5hbWUobmFtZSwgIlByb3RvIGZpZWxkIGlzIG5vdCByZXBlYXRpbmcsIGNhbm5vdCBzdGFydCBsaXN0LiIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBmaWVsZDsKK30KKworY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIFByb3RvV3JpdGVyOjpMb29rdXAoCisgICAgU3RyaW5nUGllY2UgdW5ub3JtYWxpemVkX25hbWUpIHsKKyAgUHJvdG9FbGVtZW50KiBlID0gZWxlbWVudCgpOworICBpZiAoZSA9PSBudWxscHRyKSB7CisgICAgSW52YWxpZE5hbWUodW5ub3JtYWxpemVkX25hbWUsICJSb290IGVsZW1lbnQgbXVzdCBiZSBhIG1lc3NhZ2UuIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKHVubm9ybWFsaXplZF9uYW1lLmVtcHR5KCkpIHsKKyAgICAvLyBPYmplY3RzIGluIHJlcGVhdGVkIGZpZWxkIGluaGVyaXQgdGhlIHNhbWUgZmllbGQgZGVzY3JpcHRvci4KKyAgICBpZiAoZS0+cGFyZW50X2ZpZWxkKCkgPT0gbnVsbHB0cikgeworICAgICAgSW52YWxpZE5hbWUodW5ub3JtYWxpemVkX25hbWUsICJQcm90byBmaWVsZHMgbXVzdCBoYXZlIGEgbmFtZS4iKTsKKyAgICB9IGVsc2UgaWYgKCFJc1JlcGVhdGVkKCplLT5wYXJlbnRfZmllbGQoKSkpIHsKKyAgICAgIEludmFsaWROYW1lKHVubm9ybWFsaXplZF9uYW1lLCAiUHJvdG8gZmllbGRzIG11c3QgaGF2ZSBhIG5hbWUuIik7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGUtPnBhcmVudF9maWVsZCgpOworICB9CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBmaWVsZCA9CisgICAgICB0eXBlaW5mb18tPkZpbmRGaWVsZCgmZS0+dHlwZSgpLCB1bm5vcm1hbGl6ZWRfbmFtZSk7CisgIGlmIChmaWVsZCA9PSBudWxscHRyICYmICFpZ25vcmVfdW5rbm93bl9maWVsZHNfKSB7CisgICAgSW52YWxpZE5hbWUodW5ub3JtYWxpemVkX25hbWUsICJDYW5ub3QgZmluZCBmaWVsZC4iKTsKKyAgfQorICByZXR1cm4gZmllbGQ7Cit9CisKK2NvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqIFByb3RvV3JpdGVyOjpMb29rdXBUeXBlKAorICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gKChmaWVsZC0+a2luZCgpID09IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX01FU1NBR0UgfHwKKyAgICAgICAgICAgZmllbGQtPmtpbmQoKSA9PSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9HUk9VUCkKKyAgICAgICAgICAgICAgPyB0eXBlaW5mb18tPkdldFR5cGVCeVR5cGVVcmwoZmllbGQtPnR5cGVfdXJsKCkpCisgICAgICAgICAgICAgIDogJmVsZW1lbnRfLT50eXBlKCkpOworfQorCit2b2lkIFByb3RvV3JpdGVyOjpXcml0ZVJvb3RNZXNzYWdlKCkgeworICBHT09HTEVfRENIRUNLKCFkb25lXyk7CisgIGludCBjdXJyX3BvcyA9IDA7CisgIC8vIENhbGxzIHRoZSBkZXN0cnVjdG9yIG9mIENvZGVkT3V0cHV0U3RyZWFtIHRvIHJlbW92ZSBhbnkgdW5pbml0aWFsaXplZAorICAvLyBtZW1vcnkgZnJvbSB0aGUgQ29yZCBiZWZvcmUgd2UgcmVhZCBpdC4KKyAgc3RyZWFtXy5yZXNldChudWxscHRyKTsKKyAgY29uc3Qgdm9pZCogZGF0YTsKKyAgaW50IGxlbmd0aDsKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXRfc3RyZWFtKGJ1ZmZlcl8uZGF0YSgpLCBidWZmZXJfLnNpemUoKSk7CisgIHdoaWxlIChpbnB1dF9zdHJlYW0uTmV4dCgmZGF0YSwgJmxlbmd0aCkpIHsKKyAgICBpZiAobGVuZ3RoID09IDApIGNvbnRpbnVlOworICAgIGludCBudW1fYnl0ZXMgPSBsZW5ndGg7CisgICAgLy8gV3JpdGUgdXAgdG8gd2hlcmUgd2UgbmVlZCB0byBpbnNlcnQgdGhlIHNpemUgZmllbGQuCisgICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyB3ZSBtYXkgd3JpdGUgaXMgdGhlIHNtYWxsZXIgb2Y6CisgICAgLy8gICAtIHRoZSBjdXJyZW50IGZyYWdtZW50IHNpemUKKyAgICAvLyAgIC0gdGhlIGRpc3RhbmNlIHRvIHRoZSBuZXh0IHBvc2l0aW9uIHdoZXJlIGEgc2l6ZSBmaWVsZCBuZWVkcyB0byBiZQorICAgIC8vICAgICBpbnNlcnRlZC4KKyAgICBpZiAoIXNpemVfaW5zZXJ0Xy5lbXB0eSgpICYmCisgICAgICAgIHNpemVfaW5zZXJ0Xy5mcm9udCgpLnBvcyAtIGN1cnJfcG9zIDwgbnVtX2J5dGVzKSB7CisgICAgICBudW1fYnl0ZXMgPSBzaXplX2luc2VydF8uZnJvbnQoKS5wb3MgLSBjdXJyX3BvczsKKyAgICB9CisgICAgb3V0cHV0Xy0+QXBwZW5kKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihkYXRhKSwgbnVtX2J5dGVzKTsKKyAgICBpZiAobnVtX2J5dGVzIDwgbGVuZ3RoKSB7CisgICAgICBpbnB1dF9zdHJlYW0uQmFja1VwKGxlbmd0aCAtIG51bV9ieXRlcyk7CisgICAgfQorICAgIGN1cnJfcG9zICs9IG51bV9ieXRlczsKKyAgICAvLyBJbnNlcnQgdGhlIHNpemUgZmllbGQuCisgICAgLy8gICBzaXplX2luc2VydF8uZnJvbnQoKTogICAgICB0aGUgbmV4dCA8aW5kZXgsIHNpemU+IHBhaXIgdG8gYmUgd3JpdHRlbi4KKyAgICAvLyAgIHNpemVfaW5zZXJ0Xy5mcm9udCgpLnBvczogIHBvc2l0aW9uIG9mIHRoZSBzaXplIGZpZWxkLgorICAgIC8vICAgc2l6ZV9pbnNlcnRfLmZyb250KCkuc2l6ZTogdGhlIHNpemUgKGludGVnZXIpIHRvIGJlIGluc2VydGVkLgorICAgIGlmICghc2l6ZV9pbnNlcnRfLmVtcHR5KCkgJiYgY3Vycl9wb3MgPT0gc2l6ZV9pbnNlcnRfLmZyb250KCkucG9zKSB7CisgICAgICAvLyBWYXJpbnQzMiBvY2N1cGllcyBhdCBtb3N0IDEwIGJ5dGVzLgorICAgICAgdWludDhfdCBpbnNlcnRfYnVmZmVyWzEwXTsKKyAgICAgIHVpbnQ4X3QqIGluc2VydF9idWZmZXJfcG9zID0gQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KAorICAgICAgICAgIHNpemVfaW5zZXJ0Xy5mcm9udCgpLnNpemUsIGluc2VydF9idWZmZXIpOworICAgICAgb3V0cHV0Xy0+QXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGluc2VydF9idWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgIGluc2VydF9idWZmZXJfcG9zIC0gaW5zZXJ0X2J1ZmZlcik7CisgICAgICBzaXplX2luc2VydF8ucG9wX2Zyb250KCk7CisgICAgfQorICB9CisgIG91dHB1dF8tPkZsdXNoKCk7CisgIHN0cmVhbV8ucmVzZXQobmV3IENvZGVkT3V0cHV0U3RyZWFtKCZhZGFwdGVyXykpOworICBkb25lXyA9IHRydWU7Cit9CisKK3ZvaWQgUHJvdG9Xcml0ZXI6OldyaXRlVGFnKGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCkgeworICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlRm9yRmllbGRUeXBlKAorICAgICAgc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZT4oZmllbGQua2luZCgpKSk7CisgIHN0cmVhbV8tPldyaXRlVGFnKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLCB3aXJlX3R5cGUpKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgY29udmVydGVyCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9fd3JpdGVyLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9fd3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjZjZhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b193cml0ZXIuaApAQCAtMCwwICsxLDM4OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfUFJPVE9fV1JJVEVSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9QUk9UT19XUklURVJfSF9fCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdHlwZS5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kYXRhcGllY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9lcnJvcl9saXN0ZW5lci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3N0cnVjdHVyZWRfb2JqZWN0d3JpdGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKKworY2xhc3MgT2JqZWN0TG9jYXRpb25UcmFja2VyOworCisvLyBBbiBPYmplY3RXcml0ZXIgdGhhdCBjYW4gd3JpdGUgcHJvdG9idWYgYnl0ZXMgZGlyZWN0bHkgZnJvbSB3cml0ZXIgZXZlbnRzLgorLy8gVGhpcyBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IHNwZWNpYWwgdHlwZXMgbGlrZSBTdHJ1Y3Qgb3IgTWFwLiBIb3dldmVyLCBzaW5jZQorLy8gdGhpcyBjbGFzcyBzdXBwb3J0cyByYXcgcHJvdG9idWYsIGl0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IKKy8vIHNwZWNpYWwgdHlwZXMgYnkgaW5oZXJpdGluZyBmcm9tIGl0IG9yIGJ5IHdyYXBwaW5nIGl0LgorLy8KKy8vIEl0IGFsc28gc3VwcG9ydHMgc3RyZWFtaW5nLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFByb3RvV3JpdGVyIDogcHVibGljIFN0cnVjdHVyZWRPYmplY3RXcml0ZXIgeworIHB1YmxpYzoKKy8vIENvbnN0cnVjdG9yLiBEb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiBhbnkgcGFyYW1ldGVyIHBhc3NlZCBpbi4KKyAgUHJvdG9Xcml0ZXIoVHlwZVJlc29sdmVyKiB0eXBlX3Jlc29sdmVyLCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgICAgICAgICAgICBzdHJpbmdzOjpCeXRlU2luayogb3V0cHV0LCBFcnJvckxpc3RlbmVyKiBsaXN0ZW5lcik7CisgIH5Qcm90b1dyaXRlcigpIG92ZXJyaWRlOworCisgIC8vIE9iamVjdFdyaXRlciBtZXRob2RzLgorICBQcm90b1dyaXRlciogU3RhcnRPYmplY3QoU3RyaW5nUGllY2UgbmFtZSkgb3ZlcnJpZGU7CisgIFByb3RvV3JpdGVyKiBFbmRPYmplY3QoKSBvdmVycmlkZTsKKyAgUHJvdG9Xcml0ZXIqIFN0YXJ0TGlzdChTdHJpbmdQaWVjZSBuYW1lKSBvdmVycmlkZTsKKyAgUHJvdG9Xcml0ZXIqIEVuZExpc3QoKSBvdmVycmlkZTsKKyAgUHJvdG9Xcml0ZXIqIFJlbmRlckJvb2woU3RyaW5nUGllY2UgbmFtZSwgYm9vbCB2YWx1ZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBSZW5kZXJEYXRhUGllY2UobmFtZSwgRGF0YVBpZWNlKHZhbHVlKSk7CisgIH0KKyAgUHJvdG9Xcml0ZXIqIFJlbmRlckludDMyKFN0cmluZ1BpZWNlIG5hbWUsIGludDMyX3QgdmFsdWUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmVuZGVyRGF0YVBpZWNlKG5hbWUsIERhdGFQaWVjZSh2YWx1ZSkpOworICB9CisgIFByb3RvV3JpdGVyKiBSZW5kZXJVaW50MzIoU3RyaW5nUGllY2UgbmFtZSwgdWludDMyX3QgdmFsdWUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmVuZGVyRGF0YVBpZWNlKG5hbWUsIERhdGFQaWVjZSh2YWx1ZSkpOworICB9CisgIFByb3RvV3JpdGVyKiBSZW5kZXJJbnQ2NChTdHJpbmdQaWVjZSBuYW1lLCBpbnQ2NF90IHZhbHVlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJlbmRlckRhdGFQaWVjZShuYW1lLCBEYXRhUGllY2UodmFsdWUpKTsKKyAgfQorICBQcm90b1dyaXRlciogUmVuZGVyVWludDY0KFN0cmluZ1BpZWNlIG5hbWUsIHVpbnQ2NF90IHZhbHVlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJlbmRlckRhdGFQaWVjZShuYW1lLCBEYXRhUGllY2UodmFsdWUpKTsKKyAgfQorICBQcm90b1dyaXRlciogUmVuZGVyRG91YmxlKFN0cmluZ1BpZWNlIG5hbWUsIGRvdWJsZSB2YWx1ZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBSZW5kZXJEYXRhUGllY2UobmFtZSwgRGF0YVBpZWNlKHZhbHVlKSk7CisgIH0KKyAgUHJvdG9Xcml0ZXIqIFJlbmRlckZsb2F0KFN0cmluZ1BpZWNlIG5hbWUsIGZsb2F0IHZhbHVlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJlbmRlckRhdGFQaWVjZShuYW1lLCBEYXRhUGllY2UodmFsdWUpKTsKKyAgfQorICBQcm90b1dyaXRlciogUmVuZGVyU3RyaW5nKFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgdmFsdWUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmVuZGVyRGF0YVBpZWNlKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhUGllY2UodmFsdWUsIHVzZV9zdHJpY3RfYmFzZTY0X2RlY29kaW5nKCkpKTsKKyAgfQorCisgIFByb3RvV3JpdGVyKiBSZW5kZXJCeXRlcyhTdHJpbmdQaWVjZSBuYW1lLCBTdHJpbmdQaWVjZSB2YWx1ZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBSZW5kZXJEYXRhUGllY2UoCisgICAgICAgIG5hbWUsIERhdGFQaWVjZSh2YWx1ZSwgZmFsc2UsIHVzZV9zdHJpY3RfYmFzZTY0X2RlY29kaW5nKCkpKTsKKyAgfQorCisgIFByb3RvV3JpdGVyKiBSZW5kZXJOdWxsKFN0cmluZ1BpZWNlIG5hbWUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmVuZGVyRGF0YVBpZWNlKG5hbWUsIERhdGFQaWVjZTo6TnVsbERhdGEoKSk7CisgIH0KKworCisgIC8vIFJlbmRlcnMgYSBEYXRhUGllY2UgJ3ZhbHVlJyBpbnRvIGEgZmllbGQgd2hvc2Ugd2lyZSB0eXBlIGlzIGRldGVybWluZWQKKyAgLy8gZnJvbSB0aGUgZ2l2ZW4gZmllbGQgJ25hbWUnLgorICB2aXJ0dWFsIFByb3RvV3JpdGVyKiBSZW5kZXJEYXRhUGllY2UoU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFQaWVjZSYgZGF0YSk7CisKKworICAvLyBSZXR1cm5zIHRoZSBsb2NhdGlvbiB0cmFja2VyIHRvIHVzZSBmb3IgdHJhY2tpbmcgbG9jYXRpb25zIGZvciBlcnJvcnMuCisgIGNvbnN0IExvY2F0aW9uVHJhY2tlckludGVyZmFjZSYgbG9jYXRpb24oKSB7CisgICAgcmV0dXJuIGVsZW1lbnRfICE9IG51bGxwdHIgPyAqZWxlbWVudF8gOiAqdHJhY2tlcl87CisgIH0KKworICAvLyBXaGVuIHRydWUsIHdlIGZpbmlzaGVkIHdyaXRpbmcgdG8gb3V0cHV0IGEgY29tcGxldGUgbWVzc2FnZS4KKyAgYm9vbCBkb25lKCkgb3ZlcnJpZGUgeyByZXR1cm4gZG9uZV87IH0KKworICAvLyBSZXR1cm5zIHRoZSBwcm90byBzdHJlYW0gb2JqZWN0LgorICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIHN0cmVhbSgpIHsgcmV0dXJuIHN0cmVhbV8uZ2V0KCk7IH0KKworICAvLyBHZXR0ZXJzIGFuZCBtdXRhdG9ycyBvZiBpbnZhbGlkX2RlcHRoXy4KKyAgdm9pZCBJbmNyZW1lbnRJbnZhbGlkRGVwdGgoKSB7ICsraW52YWxpZF9kZXB0aF87IH0KKyAgdm9pZCBEZWNyZW1lbnRJbnZhbGlkRGVwdGgoKSB7IC0taW52YWxpZF9kZXB0aF87IH0KKyAgaW50IGludmFsaWRfZGVwdGgoKSB7IHJldHVybiBpbnZhbGlkX2RlcHRoXzsgfQorCisgIEVycm9yTGlzdGVuZXIqIGxpc3RlbmVyKCkgeyByZXR1cm4gbGlzdGVuZXJfOyB9CisKKyAgY29uc3QgVHlwZUluZm8qIHR5cGVpbmZvKCkgeyByZXR1cm4gdHlwZWluZm9fOyB9CisKKyAgdm9pZCBzZXRfaWdub3JlX3Vua25vd25fZmllbGRzKGJvb2wgaWdub3JlX3Vua25vd25fZmllbGRzKSB7CisgICAgaWdub3JlX3Vua25vd25fZmllbGRzXyA9IGlnbm9yZV91bmtub3duX2ZpZWxkczsKKyAgfQorCisgIGJvb2wgaWdub3JlX3Vua25vd25fZmllbGRzKCkgeyByZXR1cm4gaWdub3JlX3Vua25vd25fZmllbGRzXzsgfQorCisgIHZvaWQgc2V0X2lnbm9yZV91bmtub3duX2VudW1fdmFsdWVzKGJvb2wgaWdub3JlX3Vua25vd25fZW51bV92YWx1ZXMpIHsKKyAgICBpZ25vcmVfdW5rbm93bl9lbnVtX3ZhbHVlc18gPSBpZ25vcmVfdW5rbm93bl9lbnVtX3ZhbHVlczsKKyAgfQorCisgIHZvaWQgc2V0X3VzZV9sb3dlcl9jYW1lbF9mb3JfZW51bXMoYm9vbCB1c2VfbG93ZXJfY2FtZWxfZm9yX2VudW1zKSB7CisgICAgdXNlX2xvd2VyX2NhbWVsX2Zvcl9lbnVtc18gPSB1c2VfbG93ZXJfY2FtZWxfZm9yX2VudW1zOworICB9CisKKyAgdm9pZCBzZXRfY2FzZV9pbnNlbnNpdGl2ZV9lbnVtX3BhcnNpbmcoYm9vbCBjYXNlX2luc2Vuc2l0aXZlX2VudW1fcGFyc2luZykgeworICAgIGNhc2VfaW5zZW5zaXRpdmVfZW51bV9wYXJzaW5nXyA9IGNhc2VfaW5zZW5zaXRpdmVfZW51bV9wYXJzaW5nOworICB9CisKKyAgdm9pZCBzZXRfdXNlX2pzb25fbmFtZV9pbl9taXNzaW5nX2ZpZWxkcygKKyAgICAgIGJvb2wgdXNlX2pzb25fbmFtZV9pbl9taXNzaW5nX2ZpZWxkcykgeworICAgIHVzZV9qc29uX25hbWVfaW5fbWlzc2luZ19maWVsZHNfID0gdXNlX2pzb25fbmFtZV9pbl9taXNzaW5nX2ZpZWxkczsKKyAgfQorCisgcHJvdGVjdGVkOgorICBjbGFzcyBQUk9UT0JVRl9FWFBPUlQgUHJvdG9FbGVtZW50IDogcHVibGljIEJhc2VFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIExvY2F0aW9uVHJhY2tlckludGVyZmFjZSB7CisgICBwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0b3IgZm9yIHRoZSByb290IGVsZW1lbnQuIE5vIHBhcmVudCBub3IgZmllbGQuCisgICAgUHJvdG9FbGVtZW50KGNvbnN0IFR5cGVJbmZvKiB0eXBlaW5mbywgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwKKyAgICAgICAgICAgICAgICAgUHJvdG9Xcml0ZXIqIGVuY2xvc2luZyk7CisKKyAgICAvLyBDb25zdHJ1Y3RvciBmb3IgYSBmaWVsZCBvZiBhbiBlbGVtZW50LgorICAgIFByb3RvRWxlbWVudChQcm90b0VsZW1lbnQqIHBhcmVudCwgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIGZpZWxkLAorICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLCBib29sIGlzX2xpc3QpOworCisgICAgflByb3RvRWxlbWVudCgpIG92ZXJyaWRlIHt9CisKKyAgICAvLyBDYWxsZWQganVzdCBiZWZvcmUgdGhlIGRlc3RydWN0b3IgZm9yIGNsZWFuIHVwOgorICAgIC8vICAgLSByZXBvcnRzIGFueSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcworICAgIC8vICAgLSBjb21wdXRlcyB0aGUgc3BhY2UgbmVlZGVkIGJ5IHRoZSBzaXplIGZpZWxkLCBhbmQgYXVnbWVudCB0aGUKKyAgICAvLyAgICAgbGVuZ3RoIG9mIGFsbCBwYXJlbnQgbWVzc2FnZXMgYnkgdGhpcyBhZGRpdGlvbmFsIHNwYWNlLgorICAgIC8vICAgLSByZWxlYXNlcyBhbmQgcmV0dXJucyB0aGUgcGFyZW50IHBvaW50ZXIuCisgICAgUHJvdG9FbGVtZW50KiBwb3AoKTsKKworICAgIC8vIEFjY2Vzc29ycworICAgIC8vIHBhcmVudF9maWVsZCgpIG1heSBiZSBudWxscHRyIGlmIHdlIGFyZSBhdCByb290LgorICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBwYXJlbnRfZmllbGQoKSBjb25zdCB7CisgICAgICByZXR1cm4gcGFyZW50X2ZpZWxkXzsKKyAgICB9CisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgICAvLyBSZWdpc3RlcnMgZmllbGQgZm9yIGFjY291bnRpbmcgcmVxdWlyZWQgZmllbGRzLgorICAgIHZvaWQgUmVnaXN0ZXJGaWVsZChjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogZmllbGQpOworCisgICAgLy8gVG8gcmVwb3J0IGxvY2F0aW9uIG9uIGVycm9yIG1lc3NhZ2VzLgorICAgIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBQcm90b0VsZW1lbnQqIHBhcmVudCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b0VsZW1lbnQqPihCYXNlRWxlbWVudDo6cGFyZW50KCkpOworICAgIH0KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5kZXggaXMgYWxyZWFkeSB0YWtlbiBieSBhIHByZWNlZGluZyBvbmVvZiBpbnB1dC4KKyAgICBib29sIElzT25lb2ZJbmRleFRha2VuKGludDMyX3QgaW5kZXgpOworCisgICAgLy8gTWFya3MgdGhlIG9uZW9mICdpbmRleCcgYXMgdGFrZW4uIEZ1dHVyZSBpbnB1dHMgdG8gdGhpcyBvbmVvZiB3aWxsCisgICAgLy8gZ2VuZXJhdGUgYW4gZXJyb3IuCisgICAgdm9pZCBUYWtlT25lb2ZJbmRleChpbnQzMl90IGluZGV4KTsKKworICAgIGJvb2wgcHJvdG8zKCkgeyByZXR1cm4gcHJvdG8zXzsgfQorCisgICBwcml2YXRlOgorICAgIC8vIFVzZWQgZm9yIGFjY2VzcyB0byB2YXJpYWJsZXMgb2YgdGhlIGVuY2xvc2luZyBpbnN0YW5jZSBvZgorICAgIC8vIFByb3RvV3JpdGVyLgorICAgIFByb3RvV3JpdGVyKiBvd187CisKKyAgICAvLyBEZXNjcmliZXMgdGhlIGVsZW1lbnQgYXMgYSBmaWVsZCBpbiB0aGUgcGFyZW50IG1lc3NhZ2UuCisgICAgLy8gcGFyZW50X2ZpZWxkXyBpcyBudWxscHRyIGlmIGFuZCBvbmx5IGlmIHRoaXMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50LgorICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBwYXJlbnRfZmllbGRfOworCisgICAgLy8gVHlwZUluZm8gdG8gbG9va3VwIHR5cGVzLgorICAgIGNvbnN0IFR5cGVJbmZvKiB0eXBlaW5mb187CisKKyAgICAvLyBXaGV0aGVyIHRoZSB0eXBlXyBpcyBwcm90bzMgb3Igbm90LgorICAgIGJvb2wgcHJvdG8zXzsKKworICAgIC8vIEFkZGl0aW9uYWwgdmFyaWFibGVzIGlmIHRoaXMgZWxlbWVudCBpcyBhIG1lc3NhZ2U6CisgICAgLy8gKFJvb3QgZWxlbWVudCBpcyBhbHdheXMgYSBtZXNzYWdlKS4KKyAgICAvLyB0eXBlXyAgICAgICAgICAgICA6IHRoZSB0eXBlIG9mIHRoaXMgZWxlbWVudC4KKyAgICAvLyByZXF1aXJlZF9maWVsZHNfICA6IHNldCBvZiByZXF1aXJlZCBmaWVsZHMuCisgICAgLy8gc2l6ZV9pbmRleF8gICAgICAgOiBpbmRleCBpbnRvIFByb3RvV3JpdGVyOjpzaXplX2luc2VydF8KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgIGZvciBsYXRlciBpbnNlcnRpb24gb2Ygc2VyaWFsaXplZCBtZXNzYWdlIGxlbmd0aC4KKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlXzsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8Y29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqPiByZXF1aXJlZF9maWVsZHNfOworICAgIGNvbnN0IGludCBzaXplX2luZGV4XzsKKworICAgIC8vIFRyYWNrcyBwb3NpdGlvbiBpbiByZXBlYXRlZCBmaWVsZHMsIG5lZWRlZCBmb3IgTG9jYXRpb25UcmFja2VySW50ZXJmYWNlLgorICAgIGludCBhcnJheV9pbmRleF87CisKKyAgICAvLyBTZXQgb2Ygb25lb2YgaW5kaWNlcyBhbHJlYWR5IHNlZW4gZm9yIHRoZSB0eXBlXy4gVXNlZCB0byB2YWxpZGF0ZQorICAgIC8vIGluY29taW5nIG1lc3NhZ2VzIHNvIG5vIG1vcmUgdGhhbiBvbmUgb25lb2YgaXMgc2V0LgorICAgIHN0ZDo6dmVjdG9yPGJvb2w+IG9uZW9mX2luZGljZXNfOworCisgICAgR09PR0xFX0RJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhQcm90b0VsZW1lbnQpOworICB9OworCisgIC8vIENvbnRhaW5lciBmb3IgaW5zZXJ0aW5nICdzaXplJyBpbmZvcm1hdGlvbiBhdCB0aGUgJ3BvcycgcG9zaXRpb24uCisgIHN0cnVjdCBTaXplSW5mbyB7CisgICAgY29uc3QgaW50IHBvczsKKyAgICBpbnQgc2l6ZTsKKyAgfTsKKworICBQcm90b1dyaXRlcihjb25zdCBUeXBlSW5mbyogdHlwZWluZm8sIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgICAgICAgICAgIHN0cmluZ3M6OkJ5dGVTaW5rKiBvdXRwdXQsIEVycm9yTGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICBQcm90b0VsZW1lbnQqIGVsZW1lbnQoKSBvdmVycmlkZSB7IHJldHVybiBlbGVtZW50Xy5nZXQoKTsgfQorCisgIC8vIEhlbHBlciBtZXRob2RzIGZvciBjYWxsaW5nIEVycm9yTGlzdGVuZXIuIFNlZSBlcnJvcl9saXN0ZW5lci5oLgorICB2b2lkIEludmFsaWROYW1lKFN0cmluZ1BpZWNlIHVua25vd25fbmFtZSwgU3RyaW5nUGllY2UgbWVzc2FnZSk7CisgIHZvaWQgSW52YWxpZFZhbHVlKFN0cmluZ1BpZWNlIHR5cGVfbmFtZSwgU3RyaW5nUGllY2UgdmFsdWUpOworICB2b2lkIE1pc3NpbmdGaWVsZChTdHJpbmdQaWVjZSBtaXNzaW5nX25hbWUpOworCisgIC8vIENvbW1vbiBjb2RlIGZvciBCZWdpbk9iamVjdCgpIGFuZCBCZWdpbkxpc3QoKSB0aGF0IGRvZXMgaW52YWxpZF9kZXB0aF8KKyAgLy8gYm9va2tlZXBpbmcgYXNzb2NpYXRlZCB3aXRoIG5hbWUgbG9va3VwLgorICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogQmVnaW5OYW1lZChTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2xpc3QpOworCisgIC8vIExvb2t1cCB0aGUgZmllbGQgaW4gdGhlIGN1cnJlbnQgZWxlbWVudC4gTG9va3MgaW4gdGhlIGJhc2UgZGVzY3JpcHRvcgorICAvLyBhbmQgaW4gYW55IGV4dGVuc2lvbi4gVGhpcyB3aWxsIHJlcG9ydCBhbiBlcnJvciBpZiB0aGUgZmllbGQgY2Fubm90IGJlCisgIC8vIGZvdW5kIHdoZW4gaWdub3JlX3Vua25vd25fbmFtZXNfIGlzIGZhbHNlIG9yIGlmIG11bHRpcGxlIG1hdGNoaW5nCisgIC8vIGV4dGVuc2lvbnMgYXJlIGZvdW5kLgorICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogTG9va3VwKFN0cmluZ1BpZWNlIG5hbWUpOworCisgIC8vIExvb2t1cCB0aGUgZmllbGQgdHlwZSBpbiB0aGUgdHlwZSBkZXNjcmlwdG9yLiBSZXR1cm5zIG51bGxwdHIgaWYgdGhlIHR5cGUKKyAgLy8gaXMgbm90IGtub3duLgorICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKiBMb29rdXBUeXBlKAorICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIGZpZWxkKTsKKworICAvLyBXcml0ZSBzZXJpYWxpemVkIG91dHB1dCB0byB0aGUgZmluYWwgb3V0cHV0IEJ5dGVTaW5rLCBpbnNlcnRpbmcgYWxsCisgIC8vIHRoZSBzaXplIGluZm9ybWF0aW9uIGZvciBuZXN0ZWQgbWVzc2FnZXMgdGhhdCBhcmUgbWlzc2luZyBmcm9tIHRoZQorICAvLyBpbnRlcm1lZGlhdGUgQ29yZCBidWZmZXIuCisgIHZvaWQgV3JpdGVSb290TWVzc2FnZSgpOworCisgIC8vIEhlbHBlciBtZXRob2QgdG8gd3JpdGUgcHJvdG8gdGFncyBiYXNlZCBvbiB0aGUgZ2l2ZW4gZmllbGQuCisgIHZvaWQgV3JpdGVUYWcoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQmIGZpZWxkKTsKKworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmllbGQgZm9yIHR5cGVfIGNhbiBiZSBzZXQgYXMgYSBvbmVvZi4gSWYgZmllbGQgaXMgbm90CisgIC8vIGEgb25lb2YgdHlwZSwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybnMgdHJ1ZS4KKyAgLy8gSWYgYW5vdGhlciBmaWVsZCBmb3IgdGhpcyBvbmVvZiBpcyBhbHJlYWR5IHNldCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgIC8vIGZhbHNlLiBJdCBhbHNvIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjYWxsYmFjay4KKyAgLy8gdW5ub3JtYWxpemVkX25hbWUgaXMgdXNlZCBmb3IgZXJyb3Igc3RyaW5nLgorICBib29sIFZhbGlkT25lb2YoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQmIGZpZWxkLAorICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgdW5ub3JtYWxpemVkX25hbWUpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmllbGQgaXMgcmVwZWF0ZWQuCisgIGJvb2wgSXNSZXBlYXRlZChjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCYgZmllbGQpOworCisgIC8vIFN0YXJ0cyBhbiBvYmplY3QgZ2l2ZW4gdGhlIGZpZWxkIGFuZCB0aGUgZW5jbG9zaW5nIHR5cGUuCisgIFByb3RvV3JpdGVyKiBTdGFydE9iamVjdEZpZWxkKGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSk7CisKKyAgLy8gU3RhcnRzIGEgbGlzdCBnaXZlbiB0aGUgZmllbGQgYW5kIHRoZSBlbmNsb3NpbmcgdHlwZS4KKyAgUHJvdG9Xcml0ZXIqIFN0YXJ0TGlzdEZpZWxkKGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUpOworCisgIC8vIFJlbmRlcnMgYSBwcmltaXRpdmUgZmllbGQgZ2l2ZW4gdGhlIGZpZWxkIGFuZCB0aGUgZW5jbG9zaW5nIHR5cGUuCisgIFByb3RvV3JpdGVyKiBSZW5kZXJQcmltaXRpdmVGaWVsZChjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCYgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YVBpZWNlJiBkYXRhKTsKKworIHByaXZhdGU6CisgIC8vIFdyaXRlcyBhbiBFTlVNIGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLgorICBzdGF0aWMgdXRpbDo6U3RhdHVzIFdyaXRlRW51bShpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBEYXRhUGllY2UmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVudW0qIGVudW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2xvd2VyX2NhbWVsX2Zvcl9lbnVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXNlX2luc2Vuc2l0aXZlX2VudW1fcGFyc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpZ25vcmVfdW5rbm93bl92YWx1ZXMpOworCisgIC8vIFZhcmlhYmxlcyBmb3IgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBpbnB1dCB0cmVlOgorICAvLyBtYXN0ZXJfdHlwZV86IGRlc2NyaXB0b3IgZm9yIHRoZSB3aG9sZSBwcm90b2J1ZiBtZXNzYWdlLgorICAvLyB0eXBlaW5mb18gOiB0aGUgVHlwZUluZm8gb2JqZWN0IHRvIGxvb2t1cCB0eXBlcy4KKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgbWFzdGVyX3R5cGVfOworICBjb25zdCBUeXBlSW5mbyogdHlwZWluZm9fOworICAvLyBXaGV0aGVyIHdlIG93biB0aGUgdHlwZWluZm9fIG9iamVjdC4KKyAgYm9vbCBvd25fdHlwZWluZm9fOworCisgIC8vIEluZGljYXRlcyB3aGV0aGVyIHdlIGZpbmlzaGVkIHdyaXRpbmcgcm9vdCBtZXNzYWdlIGNvbXBsZXRlbHkuCisgIGJvb2wgZG9uZV87CisKKyAgLy8gSWYgdHJ1ZSwgZG9uJ3QgcmVwb3J0IHVua25vd24gZmllbGQgbmFtZXMgdG8gdGhlIGxpc3RlbmVyLgorICBib29sIGlnbm9yZV91bmtub3duX2ZpZWxkc187CisKKyAgLy8gSWYgdHJ1ZSwgZG9uJ3QgcmVwb3J0IHVua25vd24gZW51bSB2YWx1ZXMgdG8gdGhlIGxpc3RlbmVyLgorICBib29sIGlnbm9yZV91bmtub3duX2VudW1fdmFsdWVzXzsKKworICAvLyBJZiB0cnVlLCBjaGVjayBpZiBlbnVtIG5hbWUgaW4gY2FtZWwgY2FzZSBvciB3aXRob3V0IHVuZGVyc2NvcmUgbWF0Y2hlcyB0aGUKKyAgLy8gZmllbGQgbmFtZS4KKyAgYm9vbCB1c2VfbG93ZXJfY2FtZWxfZm9yX2VudW1zXzsKKworICAvLyBJZiB0cnVlLCBjaGVjayBpZiBlbnVtIG5hbWUgaW4gVVBQRVJfQ0FTRSBtYXRjaGVzIHRoZSBmaWVsZCBuYW1lLgorICBib29sIGNhc2VfaW5zZW5zaXRpdmVfZW51bV9wYXJzaW5nXzsKKworICAvLyBJZiB0cnVlLCB1c2UgdGhlIGpzb24gbmFtZSBpbiBtaXNzaW5nIGZpZWxkcyBlcnJvcnMuCisgIGJvb2wgdXNlX2pzb25fbmFtZV9pbl9taXNzaW5nX2ZpZWxkc187CisKKyAgLy8gVmFyaWFibGUgZm9yIGludGVybmFsIHN0YXRlIHByb2Nlc3Npbmc6CisgIC8vIGVsZW1lbnRfICAgIDogdGhlIGN1cnJlbnQgZWxlbWVudC4KKyAgLy8gc2l6ZV9pbnNlcnRfOiBzaXplcyBvZiBuZXN0ZWQgbWVzc2FnZXMuCisgIC8vICAgICAgICAgICAgICAgcG9zICAtIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgc2l6ZSBmaWVsZC4KKyAgLy8gICAgICAgICAgICAgICBzaXplIC0gc2l6ZSB2YWx1ZSB0byBiZSBpbnNlcnRlZC4KKyAgc3RkOjp1bmlxdWVfcHRyPFByb3RvRWxlbWVudD4gZWxlbWVudF87CisgIHN0ZDo6ZGVxdWU8U2l6ZUluZm8+IHNpemVfaW5zZXJ0XzsKKworICAvLyBWYXJpYWJsZXMgZm9yIG91dHB1dCBnZW5lcmF0aW9uOgorICAvLyBvdXRwdXRfICA6IHBvaW50ZXIgdG8gYW4gZXh0ZXJuYWwgQnl0ZVNpbmsgZm9yIGZpbmFsIHVzZXItdmlzaWJsZSBvdXRwdXQuCisgIC8vIGJ1ZmZlcl8gIDogYnVmZmVyIGhvbGRpbmcgcGFydGlhbCBtZXNzYWdlIGJlZm9yZSBiZWluZyByZWFkeSBmb3Igb3V0cHV0Xy4KKyAgLy8gYWRhcHRlcl8gOiBpbnRlcm5hbCBhZGFwdGVyIGJldHdlZW4gQ29kZWRPdXRwdXRTdHJlYW0gYW5kIGJ1ZmZlcl8uCisgIC8vIHN0cmVhbV8gIDogd3JhcHBlciBmb3Igd3JpdGluZyB0YWdzIGFuZCBvdGhlciBlbmNvZGluZ3MgaW4gd2lyZSBmb3JtYXQuCisgIHN0cmluZ3M6OkJ5dGVTaW5rKiBvdXRwdXRfOworICBzdGQ6OnN0cmluZyBidWZmZXJfOworICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIGFkYXB0ZXJfOworICBzdGQ6OnVuaXF1ZV9wdHI8aW86OkNvZGVkT3V0cHV0U3RyZWFtPiBzdHJlYW1fOworCisgIC8vIFZhcmlhYmxlcyBmb3IgZXJyb3IgdHJhY2tpbmcgYW5kIHJlcG9ydGluZzoKKyAgLy8gbGlzdGVuZXJfICAgICA6IGEgcGxhY2UgdG8gcmVwb3J0IGFueSBlcnJvcnMgZm91bmQuCisgIC8vIGludmFsaWRfZGVwdGhfOiBudW1iZXIgb2YgZW5jbG9zaW5nIGludmFsaWQgbmVzdGVkIG1lc3NhZ2VzLgorICAvLyB0cmFja2VyXyAgICAgIDogdGhlIHJvb3QgbG9jYXRpb24gdHJhY2tlciBpbnRlcmZhY2UuCisgIEVycm9yTGlzdGVuZXIqIGxpc3RlbmVyXzsKKyAgaW50IGludmFsaWRfZGVwdGhfOworICBzdGQ6OnVuaXF1ZV9wdHI8TG9jYXRpb25UcmFja2VySW50ZXJmYWNlPiB0cmFja2VyXzsKKworICBHT09HTEVfRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKFByb3RvV3JpdGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9QUk9UT19XUklURVJfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlLmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjZjOTlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZS5jYwpAQCAtMCwwICsxLDExMTQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlLmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZmllbGRfbWFza191dGlsaXR5Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdXRpbGl0eS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXBfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNfbWFjcm9zLmg+CisKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKK3VzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdDsKK3VzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7CisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBpbnQga0RlZmF1bHRNYXhSZWN1cnNpb25EZXB0aCA9IDY0OworCisvLyBGaW5kcyBhIGZpZWxkIHdpdGggdGhlIGdpdmVuIG51bWJlci4gbnVsbHB0ciBpZiBub25lIGZvdW5kLgorY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIEZpbmRGaWVsZEJ5TnVtYmVyKAorICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsIGludCBudW1iZXIpOworCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGlzIHBhY2thYmxlLgorYm9vbCBJc1BhY2thYmxlKGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCk7CisKKy8vIEZpbmRzIGFuIGVudW0gdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLiBudWxscHRyIGlmIG5vbmUgZm91bmQuCitjb25zdCBnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWUqIEZpbmRFbnVtVmFsdWVCeU51bWJlcigKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpFbnVtJiB0ZWNoX2VudW0sIGludCBudW1iZXIpOworCisvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGZvcm1hdCBuYW5vcy4KK2NvbnN0IHN0ZDo6c3RyaW5nIEZvcm1hdE5hbm9zKHVpbnQzMl90IG5hbm9zLCBib29sIHdpdGhfdHJhaWxpbmdfemVyb3MpOworCit1dGlsOjpTdGF0dXNPcjxzdGQ6OnN0cmluZz4gTWFwS2V5RGVmYXVsdFZhbHVlQXNTdHJpbmcoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQmIGZpZWxkKSB7CisgIHN3aXRjaCAoZmllbGQua2luZCgpKSB7CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJmYWxzZSIpOworICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfSU5UMzI6CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9JTlQ2NDoKKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX1VJTlQzMjoKKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX1VJTlQ2NDoKKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX1NJTlQzMjoKKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX1NJTlQ2NDoKKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX1NGSVhFRDMyOgorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfU0ZJWEVENjQ6CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9GSVhFRDMyOgorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfRklYRUQ2NDoKKyAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiMCIpOworICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiB1dGlsOjpJbnRlcm5hbEVycm9yKCJJbnZhbGlkIG1hcCBrZXkgdHlwZS4iKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlCisKKworUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlByb3RvU3RyZWFtT2JqZWN0U291cmNlKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBzdHJlYW0sIFR5cGVSZXNvbHZlciogdHlwZV9yZXNvbHZlciwKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLCBjb25zdCBSZW5kZXJPcHRpb25zJiByZW5kZXJfb3B0aW9ucykKKyAgICA6IHN0cmVhbV8oc3RyZWFtKSwKKyAgICAgIHR5cGVpbmZvXyhUeXBlSW5mbzo6TmV3VHlwZUluZm8odHlwZV9yZXNvbHZlcikpLAorICAgICAgb3duX3R5cGVpbmZvXyh0cnVlKSwKKyAgICAgIHR5cGVfKHR5cGUpLAorICAgICAgcmVuZGVyX29wdGlvbnNfKHJlbmRlcl9vcHRpb25zKSwKKyAgICAgIHJlY3Vyc2lvbl9kZXB0aF8oMCksCisgICAgICBtYXhfcmVjdXJzaW9uX2RlcHRoXyhrRGVmYXVsdE1heFJlY3Vyc2lvbkRlcHRoKSB7CisgIEdPT0dMRV9MT0dfSUYoREZBVEFMLCBzdHJlYW0gPT0gbnVsbHB0cikgPDwgIklucHV0IHN0cmVhbSBpcyBudWxscHRyLiI7Cit9CisKK1Byb3RvU3RyZWFtT2JqZWN0U291cmNlOjpQcm90b1N0cmVhbU9iamVjdFNvdXJjZSgKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogc3RyZWFtLCBjb25zdCBUeXBlSW5mbyogdHlwZWluZm8sCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwgY29uc3QgUmVuZGVyT3B0aW9ucyYgcmVuZGVyX29wdGlvbnMpCisgICAgOiBzdHJlYW1fKHN0cmVhbSksCisgICAgICB0eXBlaW5mb18odHlwZWluZm8pLAorICAgICAgb3duX3R5cGVpbmZvXyhmYWxzZSksCisgICAgICB0eXBlXyh0eXBlKSwKKyAgICAgIHJlbmRlcl9vcHRpb25zXyhyZW5kZXJfb3B0aW9ucyksCisgICAgICByZWN1cnNpb25fZGVwdGhfKDApLAorICAgICAgbWF4X3JlY3Vyc2lvbl9kZXB0aF8oa0RlZmF1bHRNYXhSZWN1cnNpb25EZXB0aCkgeworICBHT09HTEVfTE9HX0lGKERGQVRBTCwgc3RyZWFtID09IG51bGxwdHIpIDw8ICJJbnB1dCBzdHJlYW0gaXMgbnVsbHB0ci4iOworfQorCitQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6flByb3RvU3RyZWFtT2JqZWN0U291cmNlKCkgeworICBpZiAob3duX3R5cGVpbmZvXykgeworICAgIGRlbGV0ZSB0eXBlaW5mb187CisgIH0KK30KKwordXRpbDo6U3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpOYW1lZFdyaXRlVG8oU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFdyaXRlciogb3cpIGNvbnN0IHsKKyAgcmV0dXJuIFdyaXRlTWVzc2FnZSh0eXBlXywgbmFtZSwgMCwgdHJ1ZSwgb3cpOworfQorCitjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OkZpbmRBbmRWZXJpZnlGaWVsZCgKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLCB1aW50MzJfdCB0YWcpIGNvbnN0IHsKKyAgLy8gTG9va3VwIHRoZSBuZXcgZmllbGQgaW4gdGhlIHR5cGUgYnkgdGFnIG51bWJlci4KKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIGZpZWxkID0gRmluZEZpZWxkQnlOdW1iZXIodHlwZSwgdGFnID4+IDMpOworICAvLyBWZXJpZnkgaWYgdGhlIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSB3aXJlIHR5cGUgaW4gdGFnLgorICAvLyBJZiB0aGVyZSBpcyBhbnkgZGlzY3JlcGFuY3ksIG1hcmsgdGhlIGZpZWxkIGFzIG5vdCBmb3VuZC4KKyAgaWYgKGZpZWxkICE9IG51bGxwdHIpIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgZXhwZWN0ZWRfdHlwZSA9CisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZUZvckZpZWxkVHlwZSgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGU+KGZpZWxkLT5raW5kKCkpKTsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgYWN0dWFsX3R5cGUgPSBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKTsKKyAgICBpZiAoYWN0dWFsX3R5cGUgIT0gZXhwZWN0ZWRfdHlwZSAmJgorICAgICAgICAoIUlzUGFja2FibGUoKmZpZWxkKSB8fAorICAgICAgICAgYWN0dWFsX3R5cGUgIT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpKSB7CisgICAgICBmaWVsZCA9IG51bGxwdHI7CisgICAgfQorICB9CisgIHJldHVybiBmaWVsZDsKK30KKwordXRpbDo6U3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpXcml0ZU1lc3NhZ2UoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwgU3RyaW5nUGllY2UgbmFtZSwKKyAgICBjb25zdCB1aW50MzJfdCBlbmRfdGFnLCBib29sIGluY2x1ZGVfc3RhcnRfYW5kX2VuZCwKKyAgICBPYmplY3RXcml0ZXIqIG93KSBjb25zdCB7CisKKyAgY29uc3QgVHlwZVJlbmRlcmVyKiB0eXBlX3JlbmRlcmVyID0gRmluZFR5cGVSZW5kZXJlcih0eXBlLm5hbWUoKSk7CisgIGlmICh0eXBlX3JlbmRlcmVyICE9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gKCp0eXBlX3JlbmRlcmVyKSh0aGlzLCB0eXBlLCBuYW1lLCBvdyk7CisgIH0KKworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogZmllbGQgPSBudWxscHRyOworICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lOworICAvLyBsYXN0X3RhZyBzZXQgdG8gZHVtbXkgdmFsdWUgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0YWcuCisgIHVpbnQzMl90IHRhZyA9IHN0cmVhbV8tPlJlYWRUYWcoKSwgbGFzdF90YWcgPSB0YWcgKyAxOworICBVbmtub3duRmllbGRTZXQgdW5rbm93bl9maWVsZHM7CisKKworICBpZiAoaW5jbHVkZV9zdGFydF9hbmRfZW5kKSB7CisgICAgb3ctPlN0YXJ0T2JqZWN0KG5hbWUpOworICB9CisgIHdoaWxlICh0YWcgIT0gZW5kX3RhZyAmJiB0YWcgIT0gMCkgeworICAgIGlmICh0YWcgIT0gbGFzdF90YWcpIHsgIC8vIFVwZGF0ZSBmaWVsZCBvbmx5IGlmIHRhZyBpcyBjaGFuZ2VkLgorICAgICAgbGFzdF90YWcgPSB0YWc7CisgICAgICBmaWVsZCA9IEZpbmRBbmRWZXJpZnlGaWVsZCh0eXBlLCB0YWcpOworICAgICAgaWYgKGZpZWxkICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHJlbmRlcl9vcHRpb25zXy5wcmVzZXJ2ZV9wcm90b19maWVsZF9uYW1lcykgeworICAgICAgICAgIGZpZWxkX25hbWUgPSBmaWVsZC0+bmFtZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZpZWxkX25hbWUgPSBmaWVsZC0+anNvbl9uYW1lKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGZpZWxkID09IG51bGxwdHIpIHsKKyAgICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGEgZmllbGQsIHNraXAgdGhpcyB1bmtub3duIHRhZy4KKyAgICAgIC8vIFRPRE8od3Bvb24pOiBDaGVjayByZXR1cm4gYm9vbGVhbiB2YWx1ZS4KKyAgICAgIFdpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICBzdHJlYW1fLCB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICAgIHRhZyA9IHN0cmVhbV8tPlJlYWRUYWcoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChmaWVsZC0+Y2FyZGluYWxpdHkoKSA9PSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6Q0FSRElOQUxJVFlfUkVQRUFURUQpIHsKKyAgICAgIGlmIChJc01hcCgqZmllbGQpKSB7CisgICAgICAgIG93LT5TdGFydE9iamVjdChmaWVsZF9uYW1lKTsKKyAgICAgICAgQVNTSUdOX09SX1JFVFVSTih0YWcsIFJlbmRlck1hcChmaWVsZCwgZmllbGRfbmFtZSwgdGFnLCBvdykpOworICAgICAgICBvdy0+RW5kT2JqZWN0KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBU1NJR05fT1JfUkVUVVJOKHRhZywgUmVuZGVyTGlzdChmaWVsZCwgZmllbGRfbmFtZSwgdGFnLCBvdykpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBSZW5kZXIgdGhlIGZpZWxkLgorICAgICAgUkVUVVJOX0lGX0VSUk9SKFJlbmRlckZpZWxkKGZpZWxkLCBmaWVsZF9uYW1lLCBvdykpOworICAgICAgdGFnID0gc3RyZWFtXy0+UmVhZFRhZygpOworICAgIH0KKyAgfQorCisKKyAgaWYgKGluY2x1ZGVfc3RhcnRfYW5kX2VuZCkgeworICAgIG93LT5FbmRPYmplY3QoKTsKKyAgfQorICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7Cit9CisKK3V0aWw6OlN0YXR1c09yPHVpbnQzMl90PiBQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6UmVuZGVyTGlzdCgKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogZmllbGQsIFN0cmluZ1BpZWNlIG5hbWUsCisgICAgdWludDMyX3QgbGlzdF90YWcsIE9iamVjdFdyaXRlciogb3cpIGNvbnN0IHsKKyAgdWludDMyX3QgdGFnX3RvX3JldHVybiA9IDA7CisgIG93LT5TdGFydExpc3QobmFtZSk7CisgIGlmIChJc1BhY2thYmxlKCpmaWVsZCkgJiYKKyAgICAgIGxpc3RfdGFnID09CisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSkgeworICAgIFJFVFVSTl9JRl9FUlJPUihSZW5kZXJQYWNrZWQoZmllbGQsIG93KSk7CisgICAgLy8gU2luY2UgcGFja2VkIGZpZWxkcyBoYXZlIGEgc2luZ2xlIHRhZywgcmVhZCBhbm90aGVyIHRhZyBmcm9tIHN0cmVhbSB0bworICAgIC8vIHJldHVybi4KKyAgICB0YWdfdG9fcmV0dXJuID0gc3RyZWFtXy0+UmVhZFRhZygpOworICB9IGVsc2UgeworICAgIGRvIHsKKyAgICAgIFJFVFVSTl9JRl9FUlJPUihSZW5kZXJGaWVsZChmaWVsZCwgIiIsIG93KSk7CisgICAgfSB3aGlsZSAoKHRhZ190b19yZXR1cm4gPSBzdHJlYW1fLT5SZWFkVGFnKCkpID09IGxpc3RfdGFnKTsKKyAgfQorICBvdy0+RW5kTGlzdCgpOworICByZXR1cm4gdGFnX3RvX3JldHVybjsKK30KKwordXRpbDo6U3RhdHVzT3I8dWludDMyX3Q+IFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJNYXAoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIGZpZWxkLCBTdHJpbmdQaWVjZSAvKiBuYW1lICovLAorICAgIHVpbnQzMl90IGxpc3RfdGFnLCBPYmplY3RXcml0ZXIqIG93KSBjb25zdCB7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqIGZpZWxkX3R5cGUgPQorICAgICAgdHlwZWluZm9fLT5HZXRUeXBlQnlUeXBlVXJsKGZpZWxkLT50eXBlX3VybCgpKTsKKyAgdWludDMyX3QgdGFnX3RvX3JldHVybiA9IDA7CisgIGRvIHsKKyAgICAvLyBSZW5kZXIgbWFwIGVudHJ5IG1lc3NhZ2UgdHlwZS4KKyAgICB1aW50MzJfdCBidWZmZXIzMjsKKyAgICBzdHJlYW1fLT5SZWFkVmFyaW50MzIoJmJ1ZmZlcjMyKTsgIC8vIG1lc3NhZ2UgbGVuZ3RoCisgICAgaW50IG9sZF9saW1pdCA9IHN0cmVhbV8tPlB1c2hMaW1pdChidWZmZXIzMik7CisgICAgc3RkOjpzdHJpbmcgbWFwX2tleTsKKyAgICBmb3IgKHVpbnQzMl90IHRhZyA9IHN0cmVhbV8tPlJlYWRUYWcoKTsgdGFnICE9IDA7CisgICAgICAgICB0YWcgPSBzdHJlYW1fLT5SZWFkVGFnKCkpIHsKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBtYXBfZW50cnlfZmllbGQgPQorICAgICAgICAgIEZpbmRBbmRWZXJpZnlGaWVsZCgqZmllbGRfdHlwZSwgdGFnKTsKKyAgICAgIGlmIChtYXBfZW50cnlfZmllbGQgPT0gbnVsbHB0cikgeworICAgICAgICBXaXJlRm9ybWF0OjpTa2lwRmllbGQoc3RyZWFtXywgdGFnLCBudWxscHRyKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAvLyBNYXAgZmllbGQgbnVtYmVycyBhcmUga2V5ID0gMSBhbmQgdmFsdWUgPSAyCisgICAgICBpZiAobWFwX2VudHJ5X2ZpZWxkLT5udW1iZXIoKSA9PSAxKSB7CisgICAgICAgIG1hcF9rZXkgPSBSZWFkRmllbGRWYWx1ZUFzU3RyaW5nKCptYXBfZW50cnlfZmllbGQpOworICAgICAgfSBlbHNlIGlmIChtYXBfZW50cnlfZmllbGQtPm51bWJlcigpID09IDIpIHsKKyAgICAgICAgaWYgKG1hcF9rZXkuZW1wdHkoKSkgeworICAgICAgICAgIC8vIEFuIGFic2VudCBtYXAga2V5IGlzIHRyZWF0ZWQgYXMgdGhlIGRlZmF1bHQuCisgICAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIGtleV9maWVsZCA9CisgICAgICAgICAgICAgIEZpbmRGaWVsZEJ5TnVtYmVyKCpmaWVsZF90eXBlLCAxKTsKKyAgICAgICAgICBpZiAoa2V5X2ZpZWxkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIFRoZSBUeXBlIGluZm8gZm9yIHRoaXMgbWFwIGVudHJ5IGlzIGluY29ycmVjdC4gSXQgc2hvdWxkIGFsd2F5cworICAgICAgICAgICAgLy8gaGF2ZSBhIGZpZWxkIG5hbWVkICJrZXkiIGFuZCB3aXRoIGZpZWxkIG51bWJlciAxLgorICAgICAgICAgICAgcmV0dXJuIHV0aWw6OkludGVybmFsRXJyb3IoIkludmFsaWQgbWFwIGVudHJ5LiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBBU1NJR05fT1JfUkVUVVJOKG1hcF9rZXksIE1hcEtleURlZmF1bHRWYWx1ZUFzU3RyaW5nKCprZXlfZmllbGQpKTsKKyAgICAgICAgfQorICAgICAgICBSRVRVUk5fSUZfRVJST1IoUmVuZGVyRmllbGQobWFwX2VudHJ5X2ZpZWxkLCBtYXBfa2V5LCBvdykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIFR5cGUgaW5mbyBmb3IgdGhpcyBtYXAgZW50cnkgaXMgaW5jb3JyZWN0LiBJdCBzaG91bGQgY29udGFpbgorICAgICAgICAvLyBleGFjdGx5IHR3byBmaWVsZHMgd2l0aCBmaWVsZCBudW1iZXIgMSBhbmQgMi4KKyAgICAgICAgcmV0dXJuIHV0aWw6OkludGVybmFsRXJyb3IoIkludmFsaWQgbWFwIGVudHJ5LiIpOworICAgICAgfQorICAgIH0KKyAgICBzdHJlYW1fLT5Qb3BMaW1pdChvbGRfbGltaXQpOworICB9IHdoaWxlICgodGFnX3RvX3JldHVybiA9IHN0cmVhbV8tPlJlYWRUYWcoKSkgPT0gbGlzdF90YWcpOworICByZXR1cm4gdGFnX3RvX3JldHVybjsKK30KKwordXRpbDo6U3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJQYWNrZWQoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIGZpZWxkLCBPYmplY3RXcml0ZXIqIG93KSBjb25zdCB7CisgIHVpbnQzMl90IGxlbmd0aDsKKyAgc3RyZWFtXy0+UmVhZFZhcmludDMyKCZsZW5ndGgpOworICBpbnQgb2xkX2xpbWl0ID0gc3RyZWFtXy0+UHVzaExpbWl0KGxlbmd0aCk7CisgIHdoaWxlIChzdHJlYW1fLT5CeXRlc1VudGlsTGltaXQoKSA+IDApIHsKKyAgICBSRVRVUk5fSUZfRVJST1IoUmVuZGVyRmllbGQoZmllbGQsIFN0cmluZ1BpZWNlKCksIG93KSk7CisgIH0KKyAgc3RyZWFtXy0+UG9wTGltaXQob2xkX2xpbWl0KTsKKyAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworfQorCit1dGlsOjpTdGF0dXMgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlJlbmRlclRpbWVzdGFtcCgKKyAgICBjb25zdCBQcm90b1N0cmVhbU9iamVjdFNvdXJjZSogb3MsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgU3RyaW5nUGllY2UgZmllbGRfbmFtZSwgT2JqZWN0V3JpdGVyKiBvdykgeworICBzdGQ6OnBhaXI8aW50NjRfdCwgaW50MzJfdD4gcCA9IG9zLT5SZWFkU2Vjb25kc0FuZE5hbm9zKHR5cGUpOworICBpbnQ2NF90IHNlY29uZHMgPSBwLmZpcnN0OworICBpbnQzMl90IG5hbm9zID0gcC5zZWNvbmQ7CisgIGlmIChzZWNvbmRzID4ga1RpbWVzdGFtcE1heFNlY29uZHMgfHwgc2Vjb25kcyA8IGtUaW1lc3RhbXBNaW5TZWNvbmRzKSB7CisgICAgcmV0dXJuIHV0aWw6OkludGVybmFsRXJyb3IoU3RyQ2F0KAorICAgICAgICAiVGltZXN0YW1wIHNlY29uZHMgZXhjZWVkcyBsaW1pdCBmb3IgZmllbGQ6ICIsIGZpZWxkX25hbWUpKTsKKyAgfQorCisgIGlmIChuYW5vcyA8IDAgfHwgbmFub3MgPj0ga05hbm9zUGVyU2Vjb25kKSB7CisgICAgcmV0dXJuIHV0aWw6OkludGVybmFsRXJyb3IoCisgICAgICAgIFN0ckNhdCgiVGltZXN0YW1wIG5hbm9zIGV4Y2VlZHMgbGltaXQgZm9yIGZpZWxkOiAiLCBmaWVsZF9uYW1lKSk7CisgIH0KKworICBvdy0+UmVuZGVyU3RyaW5nKGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6Rm9ybWF0VGltZShzZWNvbmRzLCBuYW5vcykpOworCisgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKK30KKwordXRpbDo6U3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJEdXJhdGlvbigKKyAgICBjb25zdCBQcm90b1N0cmVhbU9iamVjdFNvdXJjZSogb3MsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgU3RyaW5nUGllY2UgZmllbGRfbmFtZSwgT2JqZWN0V3JpdGVyKiBvdykgeworICBzdGQ6OnBhaXI8aW50NjRfdCwgaW50MzJfdD4gcCA9IG9zLT5SZWFkU2Vjb25kc0FuZE5hbm9zKHR5cGUpOworICBpbnQ2NF90IHNlY29uZHMgPSBwLmZpcnN0OworICBpbnQzMl90IG5hbm9zID0gcC5zZWNvbmQ7CisgIGlmIChzZWNvbmRzID4ga0R1cmF0aW9uTWF4U2Vjb25kcyB8fCBzZWNvbmRzIDwga0R1cmF0aW9uTWluU2Vjb25kcykgeworICAgIHJldHVybiB1dGlsOjpJbnRlcm5hbEVycm9yKAorICAgICAgICBTdHJDYXQoIkR1cmF0aW9uIHNlY29uZHMgZXhjZWVkcyBsaW1pdCBmb3IgZmllbGQ6ICIsIGZpZWxkX25hbWUpKTsKKyAgfQorCisgIGlmIChuYW5vcyA8PSAta05hbm9zUGVyU2Vjb25kIHx8IG5hbm9zID49IGtOYW5vc1BlclNlY29uZCkgeworICAgIHJldHVybiB1dGlsOjpJbnRlcm5hbEVycm9yKAorICAgICAgICBTdHJDYXQoIkR1cmF0aW9uIG5hbm9zIGV4Y2VlZHMgbGltaXQgZm9yIGZpZWxkOiAiLCBmaWVsZF9uYW1lKSk7CisgIH0KKworICBzdGQ6OnN0cmluZyBzaWduID0gIiI7CisgIGlmIChzZWNvbmRzIDwgMCkgeworICAgIGlmIChuYW5vcyA+IDApIHsKKyAgICAgIHJldHVybiB1dGlsOjpJbnRlcm5hbEVycm9yKAorICAgICAgICAgIFN0ckNhdCgiRHVyYXRpb24gbmFub3MgaXMgbm9uLW5lZ2F0aXZlLCBidXQgc2Vjb25kcyBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBmb3IgZmllbGQ6ICIsCisgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX25hbWUpKTsKKyAgICB9CisgICAgc2lnbiA9ICItIjsKKyAgICBzZWNvbmRzID0gLXNlY29uZHM7CisgICAgbmFub3MgPSAtbmFub3M7CisgIH0gZWxzZSBpZiAoc2Vjb25kcyA9PSAwICYmIG5hbm9zIDwgMCkgeworICAgIHNpZ24gPSAiLSI7CisgICAgbmFub3MgPSAtbmFub3M7CisgIH0KKyAgc3RkOjpzdHJpbmcgZm9ybWF0dGVkX2R1cmF0aW9uID0gU3RyaW5nUHJpbnRmKAorICAgICAgIiVzJWxsZCVzcyIsIHNpZ24uY19zdHIoKSwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihzZWNvbmRzKSwgIC8vIE5PTElOVAorICAgICAgRm9ybWF0TmFub3MoCisgICAgICAgICAgbmFub3MsCisgICAgICAgICAgZmFsc2UKKyAgICAgICAgICApCisgICAgICAgICAgLmNfc3RyKCkpOworICBvdy0+UmVuZGVyU3RyaW5nKGZpZWxkX25hbWUsIGZvcm1hdHRlZF9kdXJhdGlvbik7CisgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKK30KKwordXRpbDo6U3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJEb3VibGUoCisgICAgY29uc3QgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2UqIG9zLCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiAvKnR5cGUqLywKKyAgICBTdHJpbmdQaWVjZSBmaWVsZF9uYW1lLCBPYmplY3RXcml0ZXIqIG93KSB7CisgIHVpbnQzMl90IHRhZyA9IG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7CisgIHVpbnQ2NF90IGJ1ZmZlcjY0ID0gMDsgIC8vIGRlZmF1bHQgdmFsdWUgb2YgRG91YmxlIHdyYXBwZXIgdmFsdWUKKyAgaWYgKHRhZyAhPSAwKSB7CisgICAgb3MtPnN0cmVhbV8tPlJlYWRMaXR0bGVFbmRpYW42NCgmYnVmZmVyNjQpOworICAgIG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7CisgIH0KKyAgb3ctPlJlbmRlckRvdWJsZShmaWVsZF9uYW1lLCBiaXRfY2FzdDxkb3VibGU+KGJ1ZmZlcjY0KSk7CisgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKK30KKwordXRpbDo6U3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJGbG9hdCgKKyAgICBjb25zdCBQcm90b1N0cmVhbU9iamVjdFNvdXJjZSogb3MsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIC8qdHlwZSovLAorICAgIFN0cmluZ1BpZWNlIGZpZWxkX25hbWUsIE9iamVjdFdyaXRlciogb3cpIHsKKyAgdWludDMyX3QgdGFnID0gb3MtPnN0cmVhbV8tPlJlYWRUYWcoKTsKKyAgdWludDMyX3QgYnVmZmVyMzIgPSAwOyAgLy8gZGVmYXVsdCB2YWx1ZSBvZiBGbG9hdCB3cmFwcGVyIHZhbHVlCisgIGlmICh0YWcgIT0gMCkgeworICAgIG9zLT5zdHJlYW1fLT5SZWFkTGl0dGxlRW5kaWFuMzIoJmJ1ZmZlcjMyKTsKKyAgICBvcy0+c3RyZWFtXy0+UmVhZFRhZygpOworICB9CisgIG93LT5SZW5kZXJGbG9hdChmaWVsZF9uYW1lLCBiaXRfY2FzdDxmbG9hdD4oYnVmZmVyMzIpKTsKKyAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworfQorCit1dGlsOjpTdGF0dXMgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlJlbmRlckludDY0KAorICAgIGNvbnN0IFByb3RvU3RyZWFtT2JqZWN0U291cmNlKiBvcywgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgLyp0eXBlKi8sCisgICAgU3RyaW5nUGllY2UgZmllbGRfbmFtZSwgT2JqZWN0V3JpdGVyKiBvdykgeworICB1aW50MzJfdCB0YWcgPSBvcy0+c3RyZWFtXy0+UmVhZFRhZygpOworICB1aW50NjRfdCBidWZmZXI2NCA9IDA7ICAvLyBkZWZhdWx0IHZhbHVlIG9mIEludDY0IHdyYXBwZXIgdmFsdWUKKyAgaWYgKHRhZyAhPSAwKSB7CisgICAgb3MtPnN0cmVhbV8tPlJlYWRWYXJpbnQ2NCgmYnVmZmVyNjQpOworICAgIG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7CisgIH0KKyAgb3ctPlJlbmRlckludDY0KGZpZWxkX25hbWUsIGJpdF9jYXN0PGludDY0X3Q+KGJ1ZmZlcjY0KSk7CisgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKK30KKwordXRpbDo6U3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJVSW50NjQoCisgICAgY29uc3QgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2UqIG9zLCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiAvKnR5cGUqLywKKyAgICBTdHJpbmdQaWVjZSBmaWVsZF9uYW1lLCBPYmplY3RXcml0ZXIqIG93KSB7CisgIHVpbnQzMl90IHRhZyA9IG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7CisgIHVpbnQ2NF90IGJ1ZmZlcjY0ID0gMDsgIC8vIGRlZmF1bHQgdmFsdWUgb2YgVUludDY0IHdyYXBwZXIgdmFsdWUKKyAgaWYgKHRhZyAhPSAwKSB7CisgICAgb3MtPnN0cmVhbV8tPlJlYWRWYXJpbnQ2NCgmYnVmZmVyNjQpOworICAgIG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7CisgIH0KKyAgb3ctPlJlbmRlclVpbnQ2NChmaWVsZF9uYW1lLCBiaXRfY2FzdDx1aW50NjRfdD4oYnVmZmVyNjQpKTsKKyAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworfQorCit1dGlsOjpTdGF0dXMgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlJlbmRlckludDMyKAorICAgIGNvbnN0IFByb3RvU3RyZWFtT2JqZWN0U291cmNlKiBvcywgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgLyp0eXBlKi8sCisgICAgU3RyaW5nUGllY2UgZmllbGRfbmFtZSwgT2JqZWN0V3JpdGVyKiBvdykgeworICB1aW50MzJfdCB0YWcgPSBvcy0+c3RyZWFtXy0+UmVhZFRhZygpOworICB1aW50MzJfdCBidWZmZXIzMiA9IDA7ICAvLyBkZWZhdWx0IHZhbHVlIG9mIEludDMyIHdyYXBwZXIgdmFsdWUKKyAgaWYgKHRhZyAhPSAwKSB7CisgICAgb3MtPnN0cmVhbV8tPlJlYWRWYXJpbnQzMigmYnVmZmVyMzIpOworICAgIG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7CisgIH0KKyAgb3ctPlJlbmRlckludDMyKGZpZWxkX25hbWUsIGJpdF9jYXN0PGludDMyX3Q+KGJ1ZmZlcjMyKSk7CisgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKK30KKwordXRpbDo6U3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJVSW50MzIoCisgICAgY29uc3QgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2UqIG9zLCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiAvKnR5cGUqLywKKyAgICBTdHJpbmdQaWVjZSBmaWVsZF9uYW1lLCBPYmplY3RXcml0ZXIqIG93KSB7CisgIHVpbnQzMl90IHRhZyA9IG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7CisgIHVpbnQzMl90IGJ1ZmZlcjMyID0gMDsgIC8vIGRlZmF1bHQgdmFsdWUgb2YgVUludDMyIHdyYXBwZXIgdmFsdWUKKyAgaWYgKHRhZyAhPSAwKSB7CisgICAgb3MtPnN0cmVhbV8tPlJlYWRWYXJpbnQzMigmYnVmZmVyMzIpOworICAgIG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7CisgIH0KKyAgb3ctPlJlbmRlclVpbnQzMihmaWVsZF9uYW1lLCBiaXRfY2FzdDx1aW50MzJfdD4oYnVmZmVyMzIpKTsKKyAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworfQorCit1dGlsOjpTdGF0dXMgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlJlbmRlckJvb2woCisgICAgY29uc3QgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2UqIG9zLCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiAvKnR5cGUqLywKKyAgICBTdHJpbmdQaWVjZSBmaWVsZF9uYW1lLCBPYmplY3RXcml0ZXIqIG93KSB7CisgIHVpbnQzMl90IHRhZyA9IG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7CisgIHVpbnQ2NF90IGJ1ZmZlcjY0ID0gMDsgIC8vIHJlc3VsdHMgaW4gJ2ZhbHNlJyB2YWx1ZSBhcyBkZWZhdWx0LCB3aGljaCBpcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZSBvZiBCb29sIHdyYXBwZXIKKyAgaWYgKHRhZyAhPSAwKSB7CisgICAgb3MtPnN0cmVhbV8tPlJlYWRWYXJpbnQ2NCgmYnVmZmVyNjQpOworICAgIG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7CisgIH0KKyAgb3ctPlJlbmRlckJvb2woZmllbGRfbmFtZSwgYnVmZmVyNjQgIT0gMCk7CisgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKK30KKwordXRpbDo6U3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJTdHJpbmcoCisgICAgY29uc3QgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2UqIG9zLCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiAvKnR5cGUqLywKKyAgICBTdHJpbmdQaWVjZSBmaWVsZF9uYW1lLCBPYmplY3RXcml0ZXIqIG93KSB7CisgIHVpbnQzMl90IHRhZyA9IG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7CisgIHVpbnQzMl90IGJ1ZmZlcjMyOworICBzdGQ6OnN0cmluZyBzdHI7ICAvLyBkZWZhdWx0IHZhbHVlIG9mIGVtcHR5IGZvciBTdHJpbmcgd3JhcHBlcgorICBpZiAodGFnICE9IDApIHsKKyAgICBvcy0+c3RyZWFtXy0+UmVhZFZhcmludDMyKCZidWZmZXIzMik7ICAvLyBzdHJpbmcgc2l6ZS4KKyAgICBvcy0+c3RyZWFtXy0+UmVhZFN0cmluZygmc3RyLCBidWZmZXIzMik7CisgICAgb3MtPnN0cmVhbV8tPlJlYWRUYWcoKTsKKyAgfQorICBvdy0+UmVuZGVyU3RyaW5nKGZpZWxkX25hbWUsIHN0cik7CisgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKK30KKwordXRpbDo6U3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJCeXRlcygKKyAgICBjb25zdCBQcm90b1N0cmVhbU9iamVjdFNvdXJjZSogb3MsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIC8qdHlwZSovLAorICAgIFN0cmluZ1BpZWNlIGZpZWxkX25hbWUsIE9iamVjdFdyaXRlciogb3cpIHsKKyAgdWludDMyX3QgdGFnID0gb3MtPnN0cmVhbV8tPlJlYWRUYWcoKTsKKyAgdWludDMyX3QgYnVmZmVyMzI7CisgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgaWYgKHRhZyAhPSAwKSB7CisgICAgb3MtPnN0cmVhbV8tPlJlYWRWYXJpbnQzMigmYnVmZmVyMzIpOworICAgIG9zLT5zdHJlYW1fLT5SZWFkU3RyaW5nKCZzdHIsIGJ1ZmZlcjMyKTsKKyAgICBvcy0+c3RyZWFtXy0+UmVhZFRhZygpOworICB9CisgIG93LT5SZW5kZXJCeXRlcyhmaWVsZF9uYW1lLCBzdHIpOworICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7Cit9CisKK3V0aWw6OlN0YXR1cyBQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6UmVuZGVyU3RydWN0KAorICAgIGNvbnN0IFByb3RvU3RyZWFtT2JqZWN0U291cmNlKiBvcywgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwKKyAgICBTdHJpbmdQaWVjZSBmaWVsZF9uYW1lLCBPYmplY3RXcml0ZXIqIG93KSB7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBmaWVsZCA9IG51bGxwdHI7CisgIHVpbnQzMl90IHRhZyA9IG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7CisgIG93LT5TdGFydE9iamVjdChmaWVsZF9uYW1lKTsKKyAgd2hpbGUgKHRhZyAhPSAwKSB7CisgICAgZmllbGQgPSBvcy0+RmluZEFuZFZlcmlmeUZpZWxkKHR5cGUsIHRhZyk7CisgICAgaWYgKGZpZWxkID09IG51bGxwdHIpIHsKKyAgICAgIFdpcmVGb3JtYXQ6OlNraXBGaWVsZChvcy0+c3RyZWFtXywgdGFnLCBudWxscHRyKTsKKyAgICAgIHRhZyA9IG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLy8gZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCBoYXMgb25seSBvbmUgZmllbGQgdGhhdCBpcyBhIG1hcC4gSGVuY2Ugd2UgdXNlCisgICAgLy8gUmVuZGVyTWFwIHRvIHJlbmRlciB0aGF0IGZpZWxkLgorICAgIGlmIChvcy0+SXNNYXAoKmZpZWxkKSkgeworICAgICAgQVNTSUdOX09SX1JFVFVSTih0YWcsIG9zLT5SZW5kZXJNYXAoZmllbGQsIGZpZWxkX25hbWUsIHRhZywgb3cpKTsKKyAgICB9CisgIH0KKyAgb3ctPkVuZE9iamVjdCgpOworICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7Cit9CisKK3V0aWw6OlN0YXR1cyBQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6UmVuZGVyU3RydWN0VmFsdWUoCisgICAgY29uc3QgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2UqIG9zLCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgIFN0cmluZ1BpZWNlIGZpZWxkX25hbWUsIE9iamVjdFdyaXRlciogb3cpIHsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIGZpZWxkID0gbnVsbHB0cjsKKyAgZm9yICh1aW50MzJfdCB0YWcgPSBvcy0+c3RyZWFtXy0+UmVhZFRhZygpOyB0YWcgIT0gMDsKKyAgICAgICB0YWcgPSBvcy0+c3RyZWFtXy0+UmVhZFRhZygpKSB7CisgICAgZmllbGQgPSBvcy0+RmluZEFuZFZlcmlmeUZpZWxkKHR5cGUsIHRhZyk7CisgICAgaWYgKGZpZWxkID09IG51bGxwdHIpIHsKKyAgICAgIFdpcmVGb3JtYXQ6OlNraXBGaWVsZChvcy0+c3RyZWFtXywgdGFnLCBudWxscHRyKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBSRVRVUk5fSUZfRVJST1Iob3MtPlJlbmRlckZpZWxkKGZpZWxkLCBmaWVsZF9uYW1lLCBvdykpOworICB9CisgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKK30KKworLy8gVE9ETyhza2FydmFqZSk6IEF2b2lkIGNvZGUgZHVwbGljYXRpb24gb2YgZm9yIGxvb3BzIGFuZCBTa2lwRmllbGQgbG9naWMuCit1dGlsOjpTdGF0dXMgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlJlbmRlclN0cnVjdExpc3RWYWx1ZSgKKyAgICBjb25zdCBQcm90b1N0cmVhbU9iamVjdFNvdXJjZSogb3MsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgU3RyaW5nUGllY2UgZmllbGRfbmFtZSwgT2JqZWN0V3JpdGVyKiBvdykgeworICB1aW50MzJfdCB0YWcgPSBvcy0+c3RyZWFtXy0+UmVhZFRhZygpOworCisgIC8vIFJlbmRlciBlbXB0eSBsaXN0IHdoZW4gd2UgZmluZCBlbXB0eSBMaXN0VmFsdWUgbWVzc2FnZS4KKyAgaWYgKHRhZyA9PSAwKSB7CisgICAgb3ctPlN0YXJ0TGlzdChmaWVsZF9uYW1lKTsKKyAgICBvdy0+RW5kTGlzdCgpOworICAgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKKyAgfQorCisgIHdoaWxlICh0YWcgIT0gMCkgeworICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBmaWVsZCA9IG9zLT5GaW5kQW5kVmVyaWZ5RmllbGQodHlwZSwgdGFnKTsKKyAgICBpZiAoZmllbGQgPT0gbnVsbHB0cikgeworICAgICAgV2lyZUZvcm1hdDo6U2tpcEZpZWxkKG9zLT5zdHJlYW1fLCB0YWcsIG51bGxwdHIpOworICAgICAgdGFnID0gb3MtPnN0cmVhbV8tPlJlYWRUYWcoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBBU1NJR05fT1JfUkVUVVJOKHRhZywgb3MtPlJlbmRlckxpc3QoZmllbGQsIGZpZWxkX25hbWUsIHRhZywgb3cpKTsKKyAgfQorICByZXR1cm4gdXRpbDo6U3RhdHVzKCk7Cit9CisKK3V0aWw6OlN0YXR1cyBQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6UmVuZGVyQW55KAorICAgIGNvbnN0IFByb3RvU3RyZWFtT2JqZWN0U291cmNlKiBvcywgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwKKyAgICBTdHJpbmdQaWVjZSBmaWVsZF9uYW1lLCBPYmplY3RXcml0ZXIqIG93KSB7CisgIC8vIEFuIEFueSBpcyBvZiB0aGUgZm9ybSB7IHN0cmluZyB0eXBlX3VybCA9IDE7IGJ5dGVzIHZhbHVlID0gMjsgfQorICB1aW50MzJfdCB0YWc7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdXJsOworICBzdGQ6OnN0cmluZyB2YWx1ZTsKKworICAvLyBGaXJzdCByZWFkIG91dCB0aGUgdHlwZV91cmwgYW5kIHZhbHVlIGZyb20gdGhlIHByb3RvIHN0cmVhbQorICBmb3IgKHRhZyA9IG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7IHRhZyAhPSAwOyB0YWcgPSBvcy0+c3RyZWFtXy0+UmVhZFRhZygpKSB7CisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIGZpZWxkID0gb3MtPkZpbmRBbmRWZXJpZnlGaWVsZCh0eXBlLCB0YWcpOworICAgIGlmIChmaWVsZCA9PSBudWxscHRyKSB7CisgICAgICBXaXJlRm9ybWF0OjpTa2lwRmllbGQob3MtPnN0cmVhbV8sIHRhZywgbnVsbHB0cik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLy8gJ3R5cGVfdXJsJyBoYXMgZmllbGQgbnVtYmVyIG9mIDEgYW5kICd2YWx1ZScgaGFzIGZpZWxkIG51bWJlciAyCisgICAgLy8gLy9nb29nbGUvcHJvdG9idWYvYW55LnByb3RvCisgICAgaWYgKGZpZWxkLT5udW1iZXIoKSA9PSAxKSB7CisgICAgICAvLyByZWFkIHR5cGVfdXJsCisgICAgICB1aW50MzJfdCB0eXBlX3VybF9zaXplOworICAgICAgb3MtPnN0cmVhbV8tPlJlYWRWYXJpbnQzMigmdHlwZV91cmxfc2l6ZSk7CisgICAgICBvcy0+c3RyZWFtXy0+UmVhZFN0cmluZygmdHlwZV91cmwsIHR5cGVfdXJsX3NpemUpOworICAgIH0gZWxzZSBpZiAoZmllbGQtPm51bWJlcigpID09IDIpIHsKKyAgICAgIC8vIHJlYWQgdmFsdWUKKyAgICAgIHVpbnQzMl90IHZhbHVlX3NpemU7CisgICAgICBvcy0+c3RyZWFtXy0+UmVhZFZhcmludDMyKCZ2YWx1ZV9zaXplKTsKKyAgICAgIG9zLT5zdHJlYW1fLT5SZWFkU3RyaW5nKCZ2YWx1ZSwgdmFsdWVfc2l6ZSk7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlcmUgaXMgbm8gdmFsdWUsIHdlIGRvbid0IGxvb2t1cCB0aGUgdHlwZSwgd2UganVzdCBvdXRwdXQgaXQgKGlmCisgIC8vIHByZXNlbnQpLiBJZiBib3RoIHR5cGUgYW5kIHZhbHVlIGFyZSBlbXB0eSB3ZSBvdXRwdXQgYW4gZW1wdHkgb2JqZWN0LgorICBpZiAodmFsdWUuZW1wdHkoKSkgeworICAgIG93LT5TdGFydE9iamVjdChmaWVsZF9uYW1lKTsKKyAgICBpZiAoIXR5cGVfdXJsLmVtcHR5KCkpIHsKKyAgICAgIG93LT5SZW5kZXJTdHJpbmcoIkB0eXBlIiwgdHlwZV91cmwpOworICAgIH0KKyAgICBvdy0+RW5kT2JqZWN0KCk7CisgICAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworICB9CisKKyAgLy8gSWYgdGhlcmUgaXMgYSB2YWx1ZSBidXQgbm8gdHlwZSwgd2UgY2Fubm90IHJlbmRlciBpdCwgc28gcmVwb3J0IGFuIGVycm9yLgorICBpZiAodHlwZV91cmwuZW1wdHkoKSkgeworICAgIC8vIFRPRE8oc3Zlbik6IEFkZCBhbiBleHRlcm5hbCBtZXNzYWdlIG9uY2UgdGhvc2UgYXJlIHJlYWR5LgorICAgIHJldHVybiB1dGlsOjpJbnRlcm5hbEVycm9yKCJJbnZhbGlkIEFueSwgdGhlIHR5cGVfdXJsIGlzIG1pc3NpbmcuIik7CisgIH0KKworICB1dGlsOjpTdGF0dXNPcjxjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKj4gcmVzb2x2ZWRfdHlwZSA9CisgICAgICBvcy0+dHlwZWluZm9fLT5SZXNvbHZlVHlwZVVybCh0eXBlX3VybCk7CisKKyAgaWYgKCFyZXNvbHZlZF90eXBlLm9rKCkpIHsKKyAgICAvLyBDb252ZXJ0IGludG8gYW4gaW50ZXJuYWwgZXJyb3IsIHNpbmNlIHRoaXMgbWVhbnMgdGhlIGJhY2tlbmQgZ2F2ZSB1cworICAgIC8vIGFuIGludmFsaWQgcmVzcG9uc2UgKG1pc3Npbmcgb3IgaW52YWxpZCB0eXBlIGluZm9ybWF0aW9uKS4KKyAgICByZXR1cm4gdXRpbDo6SW50ZXJuYWxFcnJvcihyZXNvbHZlZF90eXBlLnN0YXR1cygpLm1lc3NhZ2UoKSk7CisgIH0KKyAgLy8gbmVzdGVkX3R5cGUgY2Fubm90IGJlIG51bGwgYXQgdGhpcyB0aW1lLgorICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKiBuZXN0ZWRfdHlwZSA9IHJlc29sdmVkX3R5cGUudmFsdWUoKTsKKworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSB6ZXJvX2NvcHlfc3RyZWFtKHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5fc3RyZWFtKCZ6ZXJvX2NvcHlfc3RyZWFtKTsKKyAgLy8gV2Uga25vdyB0aGUgdHlwZSBzbyB3ZSBjYW4gcmVuZGVyIGl0LiBSZWN1cnNpdmVseSBwYXJzZSB0aGUgbmVzdGVkIHN0cmVhbQorICAvLyB1c2luZyBhIG5lc3RlZCBQcm90b1N0cmVhbU9iamVjdFNvdXJjZSB1c2luZyBvdXIgbmVzdGVkIHR5cGUgaW5mb3JtYXRpb24uCisgIFByb3RvU3RyZWFtT2JqZWN0U291cmNlIG5lc3RlZF9vcygmaW5fc3RyZWFtLCBvcy0+dHlwZWluZm9fLCAqbmVzdGVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy0+cmVuZGVyX29wdGlvbnNfKTsKKworICAvLyBXZSBtYW51YWxseSBjYWxsIHN0YXJ0IGFuZCBlbmQgb2JqZWN0IGhlcmUgc28gd2UgY2FuIGluamVjdCB0aGUgQHR5cGUuCisgIG93LT5TdGFydE9iamVjdChmaWVsZF9uYW1lKTsKKyAgb3ctPlJlbmRlclN0cmluZygiQHR5cGUiLCB0eXBlX3VybCk7CisgIHV0aWw6OlN0YXR1cyByZXN1bHQgPQorICAgICAgbmVzdGVkX29zLldyaXRlTWVzc2FnZShuZXN0ZWRfb3MudHlwZV8sICJ2YWx1ZSIsIDAsIGZhbHNlLCBvdyk7CisgIG93LT5FbmRPYmplY3QoKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordXRpbDo6U3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJGaWVsZE1hc2soCisgICAgY29uc3QgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2UqIG9zLCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgIFN0cmluZ1BpZWNlIGZpZWxkX25hbWUsIE9iamVjdFdyaXRlciogb3cpIHsKKyAgc3RkOjpzdHJpbmcgY29tYmluZWQ7CisgIHVpbnQzMl90IGJ1ZmZlcjMyOworICB1aW50MzJfdCBwYXRoc19maWVsZF90YWcgPSAwOworICBmb3IgKHVpbnQzMl90IHRhZyA9IG9zLT5zdHJlYW1fLT5SZWFkVGFnKCk7IHRhZyAhPSAwOworICAgICAgIHRhZyA9IG9zLT5zdHJlYW1fLT5SZWFkVGFnKCkpIHsKKyAgICBpZiAocGF0aHNfZmllbGRfdGFnID09IDApIHsKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBmaWVsZCA9IG9zLT5GaW5kQW5kVmVyaWZ5RmllbGQodHlwZSwgdGFnKTsKKyAgICAgIGlmIChmaWVsZCAhPSBudWxscHRyICYmIGZpZWxkLT5udW1iZXIoKSA9PSAxICYmCisgICAgICAgICAgZmllbGQtPm5hbWUoKSA9PSAicGF0aHMiKSB7CisgICAgICAgIHBhdGhzX2ZpZWxkX3RhZyA9IHRhZzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhdGhzX2ZpZWxkX3RhZyAhPSB0YWcpIHsKKyAgICAgIHJldHVybiB1dGlsOjpJbnRlcm5hbEVycm9yKCJJbnZhbGlkIEZpZWxkTWFzaywgdW5leHBlY3RlZCBmaWVsZC4iKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgc3RyOworICAgIG9zLT5zdHJlYW1fLT5SZWFkVmFyaW50MzIoJmJ1ZmZlcjMyKTsgIC8vIHN0cmluZyBzaXplLgorICAgIG9zLT5zdHJlYW1fLT5SZWFkU3RyaW5nKCZzdHIsIGJ1ZmZlcjMyKTsKKyAgICBpZiAoIWNvbWJpbmVkLmVtcHR5KCkpIHsKKyAgICAgIGNvbWJpbmVkLmFwcGVuZCgiLCIpOworICAgIH0KKyAgICBjb21iaW5lZC5hcHBlbmQoQ29udmVydEZpZWxkTWFza1BhdGgoc3RyLCAmVG9DYW1lbENhc2UpKTsKKyAgfQorICBvdy0+UmVuZGVyU3RyaW5nKGZpZWxkX25hbWUsIGNvbWJpbmVkKTsKKyAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworfQorCisKK3N0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlR5cGVSZW5kZXJlcj4qCisgICAgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OnJlbmRlcmVyc18gPSBudWxscHRyOworUFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6b25jZV9mbGFnIHNvdXJjZV9yZW5kZXJlcnNfaW5pdF87CisKKwordm9pZCBQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6SW5pdFJlbmRlcmVyTWFwKCkgeworICByZW5kZXJlcnNfID0gbmV3IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlR5cGVSZW5kZXJlcj4oKTsKKyAgKCpyZW5kZXJlcnNfKVsiZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJdID0KKyAgICAgICZQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6UmVuZGVyVGltZXN0YW1wOworICAoKnJlbmRlcmVyc18pWyJnb29nbGUucHJvdG9idWYuRHVyYXRpb24iXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlJlbmRlckR1cmF0aW9uOworICAoKnJlbmRlcmVyc18pWyJnb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUiXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlJlbmRlckRvdWJsZTsKKyAgKCpyZW5kZXJlcnNfKVsiZ29vZ2xlLnByb3RvYnVmLkZsb2F0VmFsdWUiXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlJlbmRlckZsb2F0OworICAoKnJlbmRlcmVyc18pWyJnb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZSJdID0KKyAgICAgICZQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6UmVuZGVySW50NjQ7CisgICgqcmVuZGVyZXJzXylbImdvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZSJdID0KKyAgICAgICZQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6UmVuZGVyVUludDY0OworICAoKnJlbmRlcmVyc18pWyJnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSJdID0KKyAgICAgICZQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6UmVuZGVySW50MzI7CisgICgqcmVuZGVyZXJzXylbImdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZSJdID0KKyAgICAgICZQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6UmVuZGVyVUludDMyOworICAoKnJlbmRlcmVyc18pWyJnb29nbGUucHJvdG9idWYuQm9vbFZhbHVlIl0gPQorICAgICAgJlByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJCb29sOworICAoKnJlbmRlcmVyc18pWyJnb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUiXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlJlbmRlclN0cmluZzsKKyAgKCpyZW5kZXJlcnNfKVsiZ29vZ2xlLnByb3RvYnVmLkJ5dGVzVmFsdWUiXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlJlbmRlckJ5dGVzOworICAoKnJlbmRlcmVyc18pWyJnb29nbGUucHJvdG9idWYuQW55Il0gPSAmUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlJlbmRlckFueTsKKyAgKCpyZW5kZXJlcnNfKVsiZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCJdID0KKyAgICAgICZQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6UmVuZGVyU3RydWN0OworICAoKnJlbmRlcmVyc18pWyJnb29nbGUucHJvdG9idWYuVmFsdWUiXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlJlbmRlclN0cnVjdFZhbHVlOworICAoKnJlbmRlcmVyc18pWyJnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlIl0gPQorICAgICAgJlByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJTdHJ1Y3RMaXN0VmFsdWU7CisgICgqcmVuZGVyZXJzXylbImdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2siXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlJlbmRlckZpZWxkTWFzazsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6T25TaHV0ZG93bigmRGVsZXRlUmVuZGVyZXJNYXApOworfQorCit2b2lkIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpEZWxldGVSZW5kZXJlck1hcCgpIHsKKyAgZGVsZXRlIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpyZW5kZXJlcnNfOworICByZW5kZXJlcnNfID0gbnVsbHB0cjsKK30KKworLy8gc3RhdGljCitQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6VHlwZVJlbmRlcmVyKgorUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OkZpbmRUeXBlUmVuZGVyZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfdXJsKSB7CisgIFBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OmNhbGxfb25jZShzb3VyY2VfcmVuZGVyZXJzX2luaXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdFJlbmRlcmVyTWFwKTsKKyAgcmV0dXJuIEZpbmRPck51bGwoKnJlbmRlcmVyc18sIHR5cGVfdXJsKTsKK30KKwordXRpbDo6U3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJGaWVsZCgKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogZmllbGQsIFN0cmluZ1BpZWNlIGZpZWxkX25hbWUsCisgICAgT2JqZWN0V3JpdGVyKiBvdykgY29uc3QgeworICAvLyBTaG9ydC1jaXJjdWl0IG1lc3NhZ2UgdHlwZXMgYXMgaXQgdGVuZHMgdG8gY2FsbCBXcml0ZU1lc3NhZ2UgcmVjdXJzaXZlbHkKKyAgLy8gYW5kIGVuZHMgdXAgdXNpbmcgYSBsb3Qgb2Ygc3RhY2sgc3BhY2UuIEtlZXAgdGhlIHN0YWNrIHVzYWdlIG9mIHRoaXMKKyAgLy8gbWVzc2FnZSBzbWFsbCBpbiBvcmRlciB0byBwcmVzZXJ2ZSBzdGFjayBzcGFjZSBhbmQgbm90IGNyYXNoLgorICBpZiAoZmllbGQtPmtpbmQoKSA9PSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9NRVNTQUdFKSB7CisgICAgdWludDMyX3QgYnVmZmVyMzI7CisgICAgc3RyZWFtXy0+UmVhZFZhcmludDMyKCZidWZmZXIzMik7ICAvLyBtZXNzYWdlIGxlbmd0aAorICAgIGludCBvbGRfbGltaXQgPSBzdHJlYW1fLT5QdXNoTGltaXQoYnVmZmVyMzIpOworICAgIC8vIEdldCB0aGUgbmVzdGVkIG1lc3NhZ2UgdHlwZSBmb3IgdGhpcyBmaWVsZC4KKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKiB0eXBlID0KKyAgICAgICAgdHlwZWluZm9fLT5HZXRUeXBlQnlUeXBlVXJsKGZpZWxkLT50eXBlX3VybCgpKTsKKyAgICBpZiAodHlwZSA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gdXRpbDo6SW50ZXJuYWxFcnJvcigKKyAgICAgICAgICBTdHJDYXQoIkludmFsaWQgY29uZmlndXJhdGlvbi4gQ291bGQgbm90IGZpbmQgdGhlIHR5cGU6ICIsCisgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT50eXBlX3VybCgpKSk7CisgICAgfQorCisgICAgLy8gU2hvcnQtY2lyY3VpdCBhbnkgc3BlY2lhbCB0eXBlIHJlbmRlcmluZyB0byBzYXZlIGNhbGwtc3RhY2sgc3BhY2UuCisgICAgY29uc3QgVHlwZVJlbmRlcmVyKiB0eXBlX3JlbmRlcmVyID0gRmluZFR5cGVSZW5kZXJlcih0eXBlLT5uYW1lKCkpOworCisgICAgUkVUVVJOX0lGX0VSUk9SKEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKHR5cGUtPm5hbWUoKSwgZmllbGRfbmFtZSkpOworICAgIGlmICh0eXBlX3JlbmRlcmVyICE9IG51bGxwdHIpIHsKKyAgICAgIFJFVFVSTl9JRl9FUlJPUigoKnR5cGVfcmVuZGVyZXIpKHRoaXMsICp0eXBlLCBmaWVsZF9uYW1lLCBvdykpOworICAgIH0gZWxzZSB7CisgICAgICBSRVRVUk5fSUZfRVJST1IoV3JpdGVNZXNzYWdlKCp0eXBlLCBmaWVsZF9uYW1lLCAwLCB0cnVlLCBvdykpOworICAgIH0KKyAgICAtLXJlY3Vyc2lvbl9kZXB0aF87CisKKyAgICBpZiAoIXN0cmVhbV8tPkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKSB7CisgICAgICByZXR1cm4gdXRpbDo6SW52YWxpZEFyZ3VtZW50RXJyb3IoCisgICAgICAgICAgIk5lc3RlZCBwcm90b2NvbCBtZXNzYWdlIG5vdCBwYXJzZWQgaW4gaXRzIGVudGlyZXR5LiIpOworICAgIH0KKyAgICBzdHJlYW1fLT5Qb3BMaW1pdChvbGRfbGltaXQpOworICB9IGVsc2UgeworICAgIC8vIFJlbmRlciBhbGwgb3RoZXIgbm9uLW1lc3NhZ2UgdHlwZXMuCisgICAgcmV0dXJuIFJlbmRlck5vbk1lc3NhZ2VGaWVsZChmaWVsZCwgZmllbGRfbmFtZSwgb3cpOworICB9CisgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKK30KKwordXRpbDo6U3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJOb25NZXNzYWdlRmllbGQoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIGZpZWxkLCBTdHJpbmdQaWVjZSBmaWVsZF9uYW1lLAorICAgIE9iamVjdFdyaXRlciogb3cpIGNvbnN0IHsKKyAgLy8gVGVtcG9yYXJ5IGJ1ZmZlcnMgb2YgZGlmZmVyZW50IHR5cGVzLgorICB1aW50MzJfdCBidWZmZXIzMiA9IDA7CisgIHVpbnQ2NF90IGJ1ZmZlcjY0ID0gMDsKKyAgc3RkOjpzdHJpbmcgc3RyYnVmZmVyOworICBzd2l0Y2ggKGZpZWxkLT5raW5kKCkpIHsKKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0JPT0w6IHsKKyAgICAgIHN0cmVhbV8tPlJlYWRWYXJpbnQ2NCgmYnVmZmVyNjQpOworICAgICAgb3ctPlJlbmRlckJvb2woZmllbGRfbmFtZSwgYnVmZmVyNjQgIT0gMCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9JTlQzMjogeworICAgICAgc3RyZWFtXy0+UmVhZFZhcmludDMyKCZidWZmZXIzMik7CisgICAgICBvdy0+UmVuZGVySW50MzIoZmllbGRfbmFtZSwgYml0X2Nhc3Q8aW50MzJfdD4oYnVmZmVyMzIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0lOVDY0OiB7CisgICAgICBzdHJlYW1fLT5SZWFkVmFyaW50NjQoJmJ1ZmZlcjY0KTsKKyAgICAgIG93LT5SZW5kZXJJbnQ2NChmaWVsZF9uYW1lLCBiaXRfY2FzdDxpbnQ2NF90PihidWZmZXI2NCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfVUlOVDMyOiB7CisgICAgICBzdHJlYW1fLT5SZWFkVmFyaW50MzIoJmJ1ZmZlcjMyKTsKKyAgICAgIG93LT5SZW5kZXJVaW50MzIoZmllbGRfbmFtZSwgYml0X2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlcjMyKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9VSU5UNjQ6IHsKKyAgICAgIHN0cmVhbV8tPlJlYWRWYXJpbnQ2NCgmYnVmZmVyNjQpOworICAgICAgb3ctPlJlbmRlclVpbnQ2NChmaWVsZF9uYW1lLCBiaXRfY2FzdDx1aW50NjRfdD4oYnVmZmVyNjQpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX1NJTlQzMjogeworICAgICAgc3RyZWFtXy0+UmVhZFZhcmludDMyKCZidWZmZXIzMik7CisgICAgICBvdy0+UmVuZGVySW50MzIoZmllbGRfbmFtZSwgV2lyZUZvcm1hdExpdGU6OlppZ1phZ0RlY29kZTMyKGJ1ZmZlcjMyKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9TSU5UNjQ6IHsKKyAgICAgIHN0cmVhbV8tPlJlYWRWYXJpbnQ2NCgmYnVmZmVyNjQpOworICAgICAgb3ctPlJlbmRlckludDY0KGZpZWxkX25hbWUsIFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdEZWNvZGU2NChidWZmZXI2NCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfU0ZJWEVEMzI6IHsKKyAgICAgIHN0cmVhbV8tPlJlYWRMaXR0bGVFbmRpYW4zMigmYnVmZmVyMzIpOworICAgICAgb3ctPlJlbmRlckludDMyKGZpZWxkX25hbWUsIGJpdF9jYXN0PGludDMyX3Q+KGJ1ZmZlcjMyKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9TRklYRUQ2NDogeworICAgICAgc3RyZWFtXy0+UmVhZExpdHRsZUVuZGlhbjY0KCZidWZmZXI2NCk7CisgICAgICBvdy0+UmVuZGVySW50NjQoZmllbGRfbmFtZSwgYml0X2Nhc3Q8aW50NjRfdD4oYnVmZmVyNjQpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0ZJWEVEMzI6IHsKKyAgICAgIHN0cmVhbV8tPlJlYWRMaXR0bGVFbmRpYW4zMigmYnVmZmVyMzIpOworICAgICAgb3ctPlJlbmRlclVpbnQzMihmaWVsZF9uYW1lLCBiaXRfY2FzdDx1aW50MzJfdD4oYnVmZmVyMzIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0ZJWEVENjQ6IHsKKyAgICAgIHN0cmVhbV8tPlJlYWRMaXR0bGVFbmRpYW42NCgmYnVmZmVyNjQpOworICAgICAgb3ctPlJlbmRlclVpbnQ2NChmaWVsZF9uYW1lLCBiaXRfY2FzdDx1aW50NjRfdD4oYnVmZmVyNjQpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0ZMT0FUOiB7CisgICAgICBzdHJlYW1fLT5SZWFkTGl0dGxlRW5kaWFuMzIoJmJ1ZmZlcjMyKTsKKyAgICAgIG93LT5SZW5kZXJGbG9hdChmaWVsZF9uYW1lLCBiaXRfY2FzdDxmbG9hdD4oYnVmZmVyMzIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0RPVUJMRTogeworICAgICAgc3RyZWFtXy0+UmVhZExpdHRsZUVuZGlhbjY0KCZidWZmZXI2NCk7CisgICAgICBvdy0+UmVuZGVyRG91YmxlKGZpZWxkX25hbWUsIGJpdF9jYXN0PGRvdWJsZT4oYnVmZmVyNjQpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0VOVU06IHsKKyAgICAgIHN0cmVhbV8tPlJlYWRWYXJpbnQzMigmYnVmZmVyMzIpOworCisgICAgICAvLyBJZiB0aGUgZmllbGQgcmVwcmVzZW50cyBhbiBleHBsaWNpdCBOVUxMIHZhbHVlLCByZW5kZXIgbnVsbC4KKyAgICAgIGlmIChmaWVsZC0+dHlwZV91cmwoKSA9PSBrU3RydWN0TnVsbFZhbHVlVHlwZVVybCkgeworICAgICAgICBvdy0+UmVuZGVyTnVsbChmaWVsZF9uYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIEdldCB0aGUgbmVzdGVkIGVudW0gdHlwZSBmb3IgdGhpcyBmaWVsZC4KKyAgICAgIC8vIFRPRE8oc2thcnZhamUpOiBBdm9pZCBzdHJpbmcgbWFuaXB1bGF0aW9uLiBGaW5kIHdheXMgdG8gc3BlZWQgdGhpcworICAgICAgLy8gdXAuCisgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpFbnVtKiBlbiA9CisgICAgICAgICAgdHlwZWluZm9fLT5HZXRFbnVtQnlUeXBlVXJsKGZpZWxkLT50eXBlX3VybCgpKTsKKyAgICAgIC8vIExvb2t1cCB0aGUgbmFtZSBvZiB0aGUgZW51bSwgYW5kIHJlbmRlciB0aGF0LiBVbmtub3duIGVudW0gdmFsdWVzCisgICAgICAvLyBhcmUgcHJpbnRlZCBhcyBpbnRlZ2Vycy4KKyAgICAgIGlmIChlbiAhPSBudWxscHRyKSB7CisgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZSogZW51bV92YWx1ZSA9CisgICAgICAgICAgICBGaW5kRW51bVZhbHVlQnlOdW1iZXIoKmVuLCBidWZmZXIzMik7CisgICAgICAgIGlmIChlbnVtX3ZhbHVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICBpZiAocmVuZGVyX29wdGlvbnNfLnVzZV9pbnRzX2Zvcl9lbnVtcykgeworICAgICAgICAgICAgb3ctPlJlbmRlckludDMyKGZpZWxkX25hbWUsIGJ1ZmZlcjMyKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHJlbmRlcl9vcHRpb25zXy51c2VfbG93ZXJfY2FtZWxfZm9yX2VudW1zKSB7CisgICAgICAgICAgICBvdy0+UmVuZGVyU3RyaW5nKGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1WYWx1ZU5hbWVUb0xvd2VyQ2FtZWxDYXNlKGVudW1fdmFsdWUtPm5hbWUoKSkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdy0+UmVuZGVyU3RyaW5nKGZpZWxkX25hbWUsIGVudW1fdmFsdWUtPm5hbWUoKSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3ctPlJlbmRlckludDMyKGZpZWxkX25hbWUsIGJ1ZmZlcjMyKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdy0+UmVuZGVySW50MzIoZmllbGRfbmFtZSwgYnVmZmVyMzIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfU1RSSU5HOiB7CisgICAgICBzdHJlYW1fLT5SZWFkVmFyaW50MzIoJmJ1ZmZlcjMyKTsgIC8vIHN0cmluZyBzaXplLgorICAgICAgc3RyZWFtXy0+UmVhZFN0cmluZygmc3RyYnVmZmVyLCBidWZmZXIzMik7CisgICAgICBvdy0+UmVuZGVyU3RyaW5nKGZpZWxkX25hbWUsIHN0cmJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9CWVRFUzogeworICAgICAgc3RyZWFtXy0+UmVhZFZhcmludDMyKCZidWZmZXIzMik7ICAvLyBieXRlcyBzaXplLgorICAgICAgc3RyZWFtXy0+UmVhZFN0cmluZygmc3RyYnVmZmVyLCBidWZmZXIzMik7CisgICAgICBvdy0+UmVuZGVyQnl0ZXMoZmllbGRfbmFtZSwgc3RyYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworfQorCisvLyBUT0RPKHNrYXJ2YWplKTogRml4IHRoaXMgdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbi4KK2NvbnN0IHN0ZDo6c3RyaW5nIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZWFkRmllbGRWYWx1ZUFzU3RyaW5nKAorICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCkgY29uc3QgeworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIHN3aXRjaCAoZmllbGQua2luZCgpKSB7CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9CT09MOiB7CisgICAgICB1aW50NjRfdCBidWZmZXI2NDsKKyAgICAgIHN0cmVhbV8tPlJlYWRWYXJpbnQ2NCgmYnVmZmVyNjQpOworICAgICAgcmVzdWx0ID0gYnVmZmVyNjQgIT0gMCA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9JTlQzMjogeworICAgICAgdWludDMyX3QgYnVmZmVyMzI7CisgICAgICBzdHJlYW1fLT5SZWFkVmFyaW50MzIoJmJ1ZmZlcjMyKTsKKyAgICAgIHJlc3VsdCA9IFN0ckNhdChiaXRfY2FzdDxpbnQzMl90PihidWZmZXIzMikpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfSU5UNjQ6IHsKKyAgICAgIHVpbnQ2NF90IGJ1ZmZlcjY0OworICAgICAgc3RyZWFtXy0+UmVhZFZhcmludDY0KCZidWZmZXI2NCk7CisgICAgICByZXN1bHQgPSBTdHJDYXQoYml0X2Nhc3Q8aW50NjRfdD4oYnVmZmVyNjQpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX1VJTlQzMjogeworICAgICAgdWludDMyX3QgYnVmZmVyMzI7CisgICAgICBzdHJlYW1fLT5SZWFkVmFyaW50MzIoJmJ1ZmZlcjMyKTsKKyAgICAgIHJlc3VsdCA9IFN0ckNhdChiaXRfY2FzdDx1aW50MzJfdD4oYnVmZmVyMzIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX1VJTlQ2NDogeworICAgICAgdWludDY0X3QgYnVmZmVyNjQ7CisgICAgICBzdHJlYW1fLT5SZWFkVmFyaW50NjQoJmJ1ZmZlcjY0KTsKKyAgICAgIHJlc3VsdCA9IFN0ckNhdChiaXRfY2FzdDx1aW50NjRfdD4oYnVmZmVyNjQpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX1NJTlQzMjogeworICAgICAgdWludDMyX3QgYnVmZmVyMzI7CisgICAgICBzdHJlYW1fLT5SZWFkVmFyaW50MzIoJmJ1ZmZlcjMyKTsKKyAgICAgIHJlc3VsdCA9IFN0ckNhdChXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRGVjb2RlMzIoYnVmZmVyMzIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX1NJTlQ2NDogeworICAgICAgdWludDY0X3QgYnVmZmVyNjQ7CisgICAgICBzdHJlYW1fLT5SZWFkVmFyaW50NjQoJmJ1ZmZlcjY0KTsKKyAgICAgIHJlc3VsdCA9IFN0ckNhdChXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRGVjb2RlNjQoYnVmZmVyNjQpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX1NGSVhFRDMyOiB7CisgICAgICB1aW50MzJfdCBidWZmZXIzMjsKKyAgICAgIHN0cmVhbV8tPlJlYWRMaXR0bGVFbmRpYW4zMigmYnVmZmVyMzIpOworICAgICAgcmVzdWx0ID0gU3RyQ2F0KGJpdF9jYXN0PGludDMyX3Q+KGJ1ZmZlcjMyKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9TRklYRUQ2NDogeworICAgICAgdWludDY0X3QgYnVmZmVyNjQ7CisgICAgICBzdHJlYW1fLT5SZWFkTGl0dGxlRW5kaWFuNjQoJmJ1ZmZlcjY0KTsKKyAgICAgIHJlc3VsdCA9IFN0ckNhdChiaXRfY2FzdDxpbnQ2NF90PihidWZmZXI2NCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfRklYRUQzMjogeworICAgICAgdWludDMyX3QgYnVmZmVyMzI7CisgICAgICBzdHJlYW1fLT5SZWFkTGl0dGxlRW5kaWFuMzIoJmJ1ZmZlcjMyKTsKKyAgICAgIHJlc3VsdCA9IFN0ckNhdChiaXRfY2FzdDx1aW50MzJfdD4oYnVmZmVyMzIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0ZJWEVENjQ6IHsKKyAgICAgIHVpbnQ2NF90IGJ1ZmZlcjY0OworICAgICAgc3RyZWFtXy0+UmVhZExpdHRsZUVuZGlhbjY0KCZidWZmZXI2NCk7CisgICAgICByZXN1bHQgPSBTdHJDYXQoYml0X2Nhc3Q8dWludDY0X3Q+KGJ1ZmZlcjY0KSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9GTE9BVDogeworICAgICAgdWludDMyX3QgYnVmZmVyMzI7CisgICAgICBzdHJlYW1fLT5SZWFkTGl0dGxlRW5kaWFuMzIoJmJ1ZmZlcjMyKTsKKyAgICAgIHJlc3VsdCA9IFNpbXBsZUZ0b2EoYml0X2Nhc3Q8ZmxvYXQ+KGJ1ZmZlcjMyKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6VFlQRV9ET1VCTEU6IHsKKyAgICAgIHVpbnQ2NF90IGJ1ZmZlcjY0OworICAgICAgc3RyZWFtXy0+UmVhZExpdHRsZUVuZGlhbjY0KCZidWZmZXI2NCk7CisgICAgICByZXN1bHQgPSBTaW1wbGVEdG9hKGJpdF9jYXN0PGRvdWJsZT4oYnVmZmVyNjQpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0VOVU06IHsKKyAgICAgIHVpbnQzMl90IGJ1ZmZlcjMyOworICAgICAgc3RyZWFtXy0+UmVhZFZhcmludDMyKCZidWZmZXIzMik7CisgICAgICAvLyBHZXQgdGhlIG5lc3RlZCBlbnVtIHR5cGUgZm9yIHRoaXMgZmllbGQuCisgICAgICAvLyBUT0RPKHNrYXJ2YWplKTogQXZvaWQgc3RyaW5nIG1hbmlwdWxhdGlvbi4gRmluZCB3YXlzIHRvIHNwZWVkIHRoaXMKKyAgICAgIC8vIHVwLgorICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bSogZW4gPQorICAgICAgICAgIHR5cGVpbmZvXy0+R2V0RW51bUJ5VHlwZVVybChmaWVsZC50eXBlX3VybCgpKTsKKyAgICAgIC8vIExvb2t1cCB0aGUgbmFtZSBvZiB0aGUgZW51bSwgYW5kIHJlbmRlciB0aGF0LiBTa2lwcyB1bmtub3duIGVudW1zLgorICAgICAgaWYgKGVuICE9IG51bGxwdHIpIHsKKyAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlKiBlbnVtX3ZhbHVlID0KKyAgICAgICAgICAgIEZpbmRFbnVtVmFsdWVCeU51bWJlcigqZW4sIGJ1ZmZlcjMyKTsKKyAgICAgICAgaWYgKGVudW1fdmFsdWUgIT0gbnVsbHB0cikgeworICAgICAgICAgIHJlc3VsdCA9IGVudW1fdmFsdWUtPm5hbWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfU1RSSU5HOiB7CisgICAgICB1aW50MzJfdCBidWZmZXIzMjsKKyAgICAgIHN0cmVhbV8tPlJlYWRWYXJpbnQzMigmYnVmZmVyMzIpOyAgLy8gc3RyaW5nIHNpemUuCisgICAgICBzdHJlYW1fLT5SZWFkU3RyaW5nKCZyZXN1bHQsIGJ1ZmZlcjMyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0JZVEVTOiB7CisgICAgICB1aW50MzJfdCBidWZmZXIzMjsKKyAgICAgIHN0cmVhbV8tPlJlYWRWYXJpbnQzMigmYnVmZmVyMzIpOyAgLy8gYnl0ZXMgc2l6ZS4KKyAgICAgIHN0cmVhbV8tPlJlYWRTdHJpbmcoJnJlc3VsdCwgYnVmZmVyMzIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBGaWVsZCBpcyBhIG1hcCBpZiBpdCBpcyBhIHJlcGVhdGVkIG1lc3NhZ2UgYW5kIGl0IGhhcyBhbiBvcHRpb24gIm1hcF90eXBlIi4KKy8vIFRPRE8oc2thcnZhamUpOiBDb25zaWRlciBwcmUtY29tcHV0aW5nIHRoZSBJc01hcCgpIGludG8gRmllbGQgZGlyZWN0bHkuCitib29sIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpJc01hcCgKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCYgZmllbGQpIGNvbnN0IHsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogZmllbGRfdHlwZSA9CisgICAgICB0eXBlaW5mb18tPkdldFR5cGVCeVR5cGVVcmwoZmllbGQudHlwZV91cmwoKSk7CisgIHJldHVybiBmaWVsZC5raW5kKCkgPT0gZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfTUVTU0FHRSAmJgorICAgICAgICAgdXRpbDo6Y29udmVydGVyOjpJc01hcChmaWVsZCwgKmZpZWxkX3R5cGUpOworfQorCitzdGQ6OnBhaXI8aW50NjRfdCwgaW50MzJfdD4gUHJvdG9TdHJlYW1PYmplY3RTb3VyY2U6OlJlYWRTZWNvbmRzQW5kTmFub3MoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSkgY29uc3QgeworICB1aW50NjRfdCBzZWNvbmRzID0gMDsKKyAgdWludDMyX3QgbmFub3MgPSAwOworICB1aW50MzJfdCB0YWcgPSAwOworICBpbnQ2NF90IHNpZ25lZF9zZWNvbmRzID0gMDsKKyAgaW50MzJfdCBzaWduZWRfbmFub3MgPSAwOworCisgIGZvciAodGFnID0gc3RyZWFtXy0+UmVhZFRhZygpOyB0YWcgIT0gMDsgdGFnID0gc3RyZWFtXy0+UmVhZFRhZygpKSB7CisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIGZpZWxkID0gRmluZEFuZFZlcmlmeUZpZWxkKHR5cGUsIHRhZyk7CisgICAgaWYgKGZpZWxkID09IG51bGxwdHIpIHsKKyAgICAgIFdpcmVGb3JtYXQ6OlNraXBGaWVsZChzdHJlYW1fLCB0YWcsIG51bGxwdHIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIC8vICdzZWNvbmRzJyBoYXMgZmllbGQgbnVtYmVyIG9mIDEgYW5kICduYW5vcycgaGFzIGZpZWxkIG51bWJlciAyCisgICAgLy8gLy9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvICYgZHVyYXRpb24ucHJvdG8KKyAgICBpZiAoZmllbGQtPm51bWJlcigpID09IDEpIHsKKyAgICAgIC8vIHJlYWQgc2Vjb25kcworICAgICAgc3RyZWFtXy0+UmVhZFZhcmludDY0KCZzZWNvbmRzKTsKKyAgICAgIHNpZ25lZF9zZWNvbmRzID0gYml0X2Nhc3Q8aW50NjRfdD4oc2Vjb25kcyk7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+bnVtYmVyKCkgPT0gMikgeworICAgICAgLy8gcmVhZCBuYW5vcworICAgICAgc3RyZWFtXy0+UmVhZFZhcmludDMyKCZuYW5vcyk7CisgICAgICBzaWduZWRfbmFub3MgPSBiaXRfY2FzdDxpbnQzMl90PihuYW5vcyk7CisgICAgfQorICB9CisgIHJldHVybiBzdGQ6OnBhaXI8aW50NjRfdCwgaW50MzJfdD4oc2lnbmVkX3NlY29uZHMsIHNpZ25lZF9uYW5vcyk7Cit9CisKK3V0aWw6OlN0YXR1cyBQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoCisgICAgU3RyaW5nUGllY2UgdHlwZV9uYW1lLCBTdHJpbmdQaWVjZSBmaWVsZF9uYW1lKSBjb25zdCB7CisgIGlmICgrK3JlY3Vyc2lvbl9kZXB0aF8gPiBtYXhfcmVjdXJzaW9uX2RlcHRoXykgeworICAgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigKKyAgICAgICAgU3RyQ2F0KCJNZXNzYWdlIHRvbyBkZWVwLiBNYXggcmVjdXJzaW9uIGRlcHRoIHJlYWNoZWQgZm9yIHR5cGUgJyIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlX25hbWUsICInLCBmaWVsZCAnIiwgZmllbGRfbmFtZSwgIiciKSk7CisgIH0KKyAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworfQorCituYW1lc3BhY2UgeworLy8gVE9ETyhza2FydmFqZSk6IFNwZWVkIHRoaXMgdXAgYnkgbm90IGRvaW5nIGEgbGluZWFyIHNjYW4uCitjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogRmluZEZpZWxkQnlOdW1iZXIoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwgaW50IG51bWJlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUuZmllbGRzX3NpemUoKTsgKytpKSB7CisgICAgaWYgKHR5cGUuZmllbGRzKGkpLm51bWJlcigpID09IG51bWJlcikgeworICAgICAgcmV0dXJuICZ0eXBlLmZpZWxkcyhpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIFRPRE8oc2thcnZhamUpOiBSZXBsYWNlIEZpZWxkRGVzY3JpcHRvciBieSBpbXBsZW1lbnRpbmcgSXNUeXBlUGFja2FibGUoKQorLy8gdXNpbmcgdGVjaCBGaWVsZC4KK2Jvb2wgSXNQYWNrYWJsZShjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCYgZmllbGQpIHsKKyAgcmV0dXJuIGZpZWxkLmNhcmRpbmFsaXR5KCkgPT0gZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OkNBUkRJTkFMSVRZX1JFUEVBVEVEICYmCisgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OklzVHlwZVBhY2thYmxlKAorICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvcjo6VHlwZT4oZmllbGQua2luZCgpKSk7Cit9CisKKy8vIFRPRE8oc2thcnZhamUpOiBTcGVlZCB0aGlzIHVwIGJ5IG5vdCBkb2luZyBhIGxpbmVhciBzY2FuLgorY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlKiBGaW5kRW51bVZhbHVlQnlOdW1iZXIoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bSYgdGVjaF9lbnVtLCBpbnQgbnVtYmVyKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVjaF9lbnVtLmVudW12YWx1ZV9zaXplKCk7ICsraSkgeworICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZSYgZXYgPSB0ZWNoX2VudW0uZW51bXZhbHVlKGkpOworICAgIGlmIChldi5udW1iZXIoKSA9PSBudW1iZXIpIHsKKyAgICAgIHJldHVybiAmZXY7CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCisvLyBUT0RPKHNrYXJ2YWplKTogTG9vayBpbnRvIG9wdGltaXppbmcgdGhpcyBieSBub3QgZG9pbmcgY29tcHV0YXRpb24gb24KKy8vIGRvdWJsZS4KK2NvbnN0IHN0ZDo6c3RyaW5nIEZvcm1hdE5hbm9zKHVpbnQzMl90IG5hbm9zLCBib29sIHdpdGhfdHJhaWxpbmdfemVyb3MpIHsKKyAgaWYgKG5hbm9zID09IDApIHsKKyAgICByZXR1cm4gd2l0aF90cmFpbGluZ196ZXJvcyA/ICIuMDAwIiA6ICIiOworICB9CisKKyAgY29uc3QgaW50IHByZWNpc2lvbiA9IChuYW5vcyAlIDEwMDAgIT0gMCkgICAgICA/IDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKG5hbm9zICUgMTAwMDAwMCAhPSAwKSA/IDYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDM7CisgIHN0ZDo6c3RyaW5nIGZvcm1hdHRlZCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICIlLipmIiwgcHJlY2lzaW9uLCBzdGF0aWNfY2FzdDxkb3VibGU+KG5hbm9zKSAvIGtOYW5vc1BlclNlY29uZCk7CisgIC8vIHJlbW92ZSB0aGUgbGVhZGluZyAwIGJlZm9yZSBkZWNpbWFsLgorICByZXR1cm4gZm9ybWF0dGVkLnN1YnN0cigxKTsKK30KK30gIC8vIG5hbWVzcGFjZQorCit9ICAvLyBuYW1lc3BhY2UgY29udmVydGVyCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkMmNhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2UuaApAQCAtMCwwICsxLDMyOSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfUFJPVE9TVFJFQU1fT0JKRUNUU09VUkNFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9QUk9UT1NUUkVBTV9PQkpFQ1RTT1VSQ0VfSF9fCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF9zb3VyY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfd3JpdGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgorCisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgY29udmVydGVyIHsKKworY2xhc3MgVHlwZUluZm87CisKKy8vIEFuIE9iamVjdFNvdXJjZSB0aGF0IGNhbiBwYXJzZSBhIHN0cmVhbSBvZiBieXRlcyBhcyBhIHByb3RvY29sIGJ1ZmZlci4KKy8vIEl0cyBXcml0ZVRvKCkgbWV0aG9kIGNhbiBiZSBnaXZlbiBhbiBPYmplY3RXcml0ZXIuCisvLyBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYSBnb29nbGUucHJvdG9idWYuVHlwZSBmb3IgdGFnIGFuZCBuYW1lIGxvb2t1cC4KKy8vIFRoZSBmaWVsZCBuYW1lcyBhcmUgY29udmVydGVkIGludG8gbG93ZXIgY2FtZWwtY2FzZSB3aGVuIHdyaXRpbmcgdG8gdGhlCisvLyBPYmplY3RXcml0ZXIuCisvLworLy8gU2FtcGxlIHVzYWdlOiAoc3VwcG9zZSBpbnB1dCBpczogc3RyaW5nIHByb3RvKQorLy8gICBBcnJheUlucHV0U3RyZWFtIGFycl9zdHJlYW0ocHJvdG8uZGF0YSgpLCBwcm90by5zaXplKCkpOworLy8gICBDb2RlZElucHV0U3RyZWFtIGluX3N0cmVhbSgmYXJyX3N0cmVhbSk7CisvLyAgIFByb3RvU3RyZWFtT2JqZWN0U291cmNlIG9zKCZpbl9zdHJlYW0sIC8qU2VydmljZVR5cGVJbmZvKi8gdHlwZWluZm8sCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx5b3VyIG1lc3NhZ2UgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZT4pOworLy8KKy8vICAgU3RhdHVzIHN0YXR1cyA9IG9zLldyaXRlVG8oPHNvbWUgT2JqZWN0V3JpdGVyPik7CitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2UgOiBwdWJsaWMgT2JqZWN0U291cmNlIHsKKyBwdWJsaWM6CisKKyAgc3RydWN0IFJlbmRlck9wdGlvbnMgeworICAgIFJlbmRlck9wdGlvbnMoKSA9IGRlZmF1bHQ7CisgICAgUmVuZGVyT3B0aW9ucyhjb25zdCBSZW5kZXJPcHRpb25zJikgPSBkZWZhdWx0OworCisgICAgLy8gU2V0cyB3aGV0aGVyIG9yIG5vdCB0byB1c2UgbG93ZXJDYW1lbENhc2UgY2FzaW5nIGZvciBlbnVtIHZhbHVlcy4gSWYgc2V0CisgICAgLy8gdG8gZmFsc2UsIGVudW0gdmFsdWVzIGFyZSBvdXRwdXQgd2l0aG91dCBhbnkgY2FzZSBjb252ZXJzaW9ucy4KKyAgICAvLworICAgIC8vIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIGFuIGVudW06CisgICAgLy8gZW51bSBUeXBlIHsKKyAgICAvLyAgIEFDVElPTl9BTkRfQURWRU5UVVJFID0gMTsKKyAgICAvLyB9CisgICAgLy8gVHlwZSB0eXBlID0gMjA7CisgICAgLy8KKyAgICAvLyBBbmQgdGhpcyBvcHRpb24gaXMgc2V0IHRvIHRydWUuIFRoZW4gdGhlIHJlbmRlcmVkICJ0eXBlIiBmaWVsZCB3aWxsIGhhdmUKKyAgICAvLyB0aGUgc3RyaW5nICJhY3Rpb25BbmRBZHZlbnR1cmUiLgorICAgIC8vIHsKKyAgICAvLyAgIC4uLgorICAgIC8vICAgInR5cGUiOiAiYWN0aW9uQW5kQWR2ZW50dXJlIiwKKyAgICAvLyAgIC4uLgorICAgIC8vIH0KKyAgICAvLworICAgIC8vIElmIHNldCB0byBmYWxzZSwgdGhlIHJlbmRlcmVkICJ0eXBlIiBmaWVsZCB3aWxsIGhhdmUgdGhlIHN0cmluZworICAgIC8vICJBQ1RJT05fQU5EX0FEVkVOVFVSRSIuCisgICAgLy8geworICAgIC8vICAgLi4uCisgICAgLy8gICAidHlwZSI6ICJBQ1RJT05fQU5EX0FEVkVOVFVSRSIsCisgICAgLy8gICAuLi4KKyAgICAvLyB9CisgICAgYm9vbCB1c2VfbG93ZXJfY2FtZWxfZm9yX2VudW1zID0gZmFsc2U7CisKKyAgICAvLyBTZXRzIHdoZXRoZXIgdG8gYWx3YXlzIG91dHB1dCBlbnVtcyBhcyBpbnRzLCBieSBkZWZhdWx0IHRoaXMgaXMgb2ZmLCBhbmQKKyAgICAvLyBlbnVtcyBhcmUgcmVuZGVyZWQgYXMgc3RyaW5ncy4KKyAgICBib29sIHVzZV9pbnRzX2Zvcl9lbnVtcyA9IGZhbHNlOworCisgICAgLy8gV2hldGhlciB0byBwcmVzZXJ2ZSBwcm90byBmaWVsZCBuYW1lcworICAgIGJvb2wgcHJlc2VydmVfcHJvdG9fZmllbGRfbmFtZXMgPSBmYWxzZTsKKworICB9OworCisgIFByb3RvU3RyZWFtT2JqZWN0U291cmNlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVSZXNvbHZlciogdHlwZV9yZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSkKKyAgICAgIDogUHJvdG9TdHJlYW1PYmplY3RTb3VyY2Uoc3RyZWFtLCB0eXBlX3Jlc29sdmVyLCB0eXBlLCBSZW5kZXJPcHRpb25zKCkpIHt9CisgIFByb3RvU3RyZWFtT2JqZWN0U291cmNlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVSZXNvbHZlciogdHlwZV9yZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVuZGVyT3B0aW9ucyYgcmVuZGVyX29wdGlvbnMpOworCisgIH5Qcm90b1N0cmVhbU9iamVjdFNvdXJjZSgpIG92ZXJyaWRlOworCisgIHV0aWw6OlN0YXR1cyBOYW1lZFdyaXRlVG8oU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RXcml0ZXIqIG93KSBjb25zdCBvdmVycmlkZTsKKworICAvLyBTZXRzIHRoZSBtYXggcmVjdXJzaW9uIGRlcHRoIG9mIHByb3RvIG1lc3NhZ2UgdG8gYmUgZGVzZXJpYWxpemVkLiBQcm90bworICAvLyBtZXNzYWdlcyBvdmVyIHRoaXMgZGVwdGggd2lsbCBmYWlsIHRvIGJlIGRlc2VyaWFsaXplZC4KKyAgLy8gRGVmYXVsdCB2YWx1ZSBpcyA2NC4KKyAgdm9pZCBzZXRfbWF4X3JlY3Vyc2lvbl9kZXB0aChpbnQgbWF4X2RlcHRoKSB7CisgICAgbWF4X3JlY3Vyc2lvbl9kZXB0aF8gPSBtYXhfZGVwdGg7CisgIH0KKworIHByb3RlY3RlZDoKKyAgLy8gV3JpdGVzIGEgcHJvdG8yIE1lc3NhZ2UgdG8gdGhlIE9iamVjdFdyaXRlci4gV2hlbiB0aGUgZ2l2ZW4gZW5kX3RhZyBpcworICAvLyBmb3VuZCB0aGlzIG1ldGhvZCB3aWxsIGNvbXBsZXRlLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIGZvciBwYXJzaW5nIGJvdGgKKyAgLy8gbmVzdGVkIG1lc3NhZ2VzIChlbmQgd2l0aCAwKSBhbmQgbmVzdGVkIGdyb3VwcyAoZW5kIHdpdGggZ3JvdXAgZW5kIHRhZykuCisgIC8vIFRoZSBpbmNsdWRlX3N0YXJ0X2FuZF9lbmQgcGFyYW1ldGVyIGFsbG93cyB0aGlzIG1ldGhvZCB0byBiZSBjYWxsZWQgd2hlbgorICAvLyBhbHJlYWR5IGluc2lkZSBvZiBhbiBvYmplY3QsIGFuZCBza2lwIGNhbGxpbmcgU3RhcnRPYmplY3QgYW5kIEVuZE9iamVjdC4KKyAgdmlydHVhbCB1dGlsOjpTdGF0dXMgV3JpdGVNZXNzYWdlKGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZW5kX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV9zdGFydF9hbmRfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0V3JpdGVyKiBvdykgY29uc3Q7CisKKyAgLy8gUmVuZGVycyBhIHJlcGVhdGluZyBmaWVsZCAocGFja2VkIG9yIHVucGFja2VkKS4gIFJldHVybnMgdGhlIG5leHQgdGFnIGFmdGVyCisgIC8vIHJlYWRpbmcgYWxsIHNlcXVlbnRpYWwgcmVwZWF0aW5nIGVsZW1lbnRzLiBUaGUgY2FsbGVyIHNob3VsZCB1c2UgdGhpcyB0YWcKKyAgLy8gYmVmb3JlIHJlYWRpbmcgbW9yZSB0YWdzIGZyb20gdGhlIHN0cmVhbS4KKyAgdmlydHVhbCB1dGlsOjpTdGF0dXNPcjx1aW50MzJfdD4gUmVuZGVyTGlzdCgKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBmaWVsZCwgU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgIHVpbnQzMl90IGxpc3RfdGFnLCBPYmplY3RXcml0ZXIqIG93KSBjb25zdDsKKworICAvLyBMb29rcyB1cCBhIGZpZWxkIGFuZCB2ZXJpZnkgaXRzIGNvbnNpc3RlbmN5IHdpdGggd2lyZSB0eXBlIGluIHRhZy4KKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIEZpbmRBbmRWZXJpZnlGaWVsZCgKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsIHVpbnQzMl90IHRhZykgY29uc3Q7CisKKyAgLy8gUmVuZGVycyBhIGZpZWxkIHZhbHVlIHRvIHRoZSBPYmplY3RXcml0ZXIuCisgIHZpcnR1YWwgdXRpbDo6U3RhdHVzIFJlbmRlckZpZWxkKGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0V3JpdGVyKiBvdykgY29uc3Q7CisKKyAgLy8gUmVhZHMgZmllbGQgdmFsdWUgYWNjb3JkaW5nIHRvIEZpZWxkIHNwZWMgaW4gJ2ZpZWxkJyBhbmQgcmV0dXJucyB0aGUgcmVhZAorICAvLyB2YWx1ZSBhcyBzdHJpbmcuIFRoaXMgb25seSB3b3JrcyBmb3IgcHJpbWl0aXZlIGRhdGF0eXBlcyAobm8gbWVzc2FnZQorICAvLyB0eXBlcykuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIFJlYWRGaWVsZFZhbHVlQXNTdHJpbmcoCisgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCYgZmllbGQpIGNvbnN0OworCisKKyAgLy8gUmV0dXJucyB0aGUgaW5wdXQgc3RyZWFtLgorICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gc3RyZWFtXzsgfQorCisgcHJpdmF0ZToKKyAgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZUluZm8qIHR5cGVpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJPcHRpb25zJiByZW5kZXJfb3B0aW9ucyk7CisgIC8vIEZ1bmN0aW9uIHRoYXQgcmVuZGVycyBhIHdlbGwga25vd24gdHlwZSB3aXRoIGEgbW9kaWZpZWQgYmVoYXZpb3IuCisgIHR5cGVkZWYgdXRpbDo6U3RhdHVzICgqVHlwZVJlbmRlcmVyKShjb25zdCBQcm90b1N0cmVhbU9iamVjdFNvdXJjZSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlLCBPYmplY3RXcml0ZXIqKTsKKworICAvLyBUT0RPKHNrYXJ2YWplKTogTWFyayB0aGVzZSBtZXRob2RzIGFzIG5vbi1jb25zdCBhcyB0aGV5IG1vZGlmeSBpbnRlcm5hbAorICAvLyBzdGF0ZSAoc3RyZWFtXykuCisgIC8vCisgIC8vIFJlbmRlcnMgYSBOV1AgbWFwLgorICAvLyBSZXR1cm5zIHRoZSBuZXh0IHRhZyBhZnRlciByZWFkaW5nIGFsbCBtYXAgZW50cmllcy4gVGhlIGNhbGxlciBzaG91bGQgdXNlCisgIC8vIHRoaXMgdGFnIGJlZm9yZSByZWFkaW5nIG1vcmUgdGFncyBmcm9tIHRoZSBzdHJlYW0uCisgIHV0aWw6OlN0YXR1c09yPHVpbnQzMl90PiBSZW5kZXJNYXAoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG5hbWUsIHVpbnQzMl90IGxpc3RfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFdyaXRlciogb3cpIGNvbnN0OworCisgIC8vIFJlbmRlcnMgYSBwYWNrZWQgcmVwZWF0aW5nIGZpZWxkLiBBIHBhY2tlZCBmaWVsZCBpcyBzdG9yZWQgYXM6CisgIC8vIHt0YWcgbGVuZ3RoIGl0ZW0xIGl0ZW0yIGl0ZW0zfSBpbnN0ZWFkIG9mIHRoZSBsZXNzIGVmZmljaWVudAorICAvLyB7dGFnIGl0ZW0xIHRhZyBpdGVtMiB0YWcgaXRlbTN9LgorICB1dGlsOjpTdGF0dXMgUmVuZGVyUGFja2VkKGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RXcml0ZXIqIG93KSBjb25zdDsKKworICAvLyBSZW5kZXJzIGEgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCB2YWx1ZSB0byBPYmplY3RXcml0ZXIKKyAgc3RhdGljIHV0aWw6OlN0YXR1cyBSZW5kZXJUaW1lc3RhbXAoY29uc3QgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2UqIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBuYW1lLCBPYmplY3RXcml0ZXIqIG93KTsKKworICAvLyBSZW5kZXJzIGEgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIHZhbHVlIHRvIE9iamVjdFdyaXRlcgorICBzdGF0aWMgdXRpbDo6U3RhdHVzIFJlbmRlckR1cmF0aW9uKGNvbnN0IFByb3RvU3RyZWFtT2JqZWN0U291cmNlKiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG5hbWUsIE9iamVjdFdyaXRlciogb3cpOworCisgIC8vIEZvbGxvd2luZyBSZW5kZXJUWVBFIGZ1bmN0aW9ucyByZW5kZXIgd2VsbCBrbm93biB0eXBlcyBpbgorICAvLyBnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8gY29ycmVzcG9uZGluZyB0byBUWVBFLgorICBzdGF0aWMgdXRpbDo6U3RhdHVzIFJlbmRlckRvdWJsZShjb25zdCBQcm90b1N0cmVhbU9iamVjdFNvdXJjZSogb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG5hbWUsIE9iamVjdFdyaXRlciogb3cpOworICBzdGF0aWMgdXRpbDo6U3RhdHVzIFJlbmRlckZsb2F0KGNvbnN0IFByb3RvU3RyZWFtT2JqZWN0U291cmNlKiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG5hbWUsIE9iamVjdFdyaXRlciogb3cpOworICBzdGF0aWMgdXRpbDo6U3RhdHVzIFJlbmRlckludDY0KGNvbnN0IFByb3RvU3RyZWFtT2JqZWN0U291cmNlKiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG5hbWUsIE9iamVjdFdyaXRlciogb3cpOworICBzdGF0aWMgdXRpbDo6U3RhdHVzIFJlbmRlclVJbnQ2NChjb25zdCBQcm90b1N0cmVhbU9iamVjdFNvdXJjZSogb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG5hbWUsIE9iamVjdFdyaXRlciogb3cpOworICBzdGF0aWMgdXRpbDo6U3RhdHVzIFJlbmRlckludDMyKGNvbnN0IFByb3RvU3RyZWFtT2JqZWN0U291cmNlKiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG5hbWUsIE9iamVjdFdyaXRlciogb3cpOworICBzdGF0aWMgdXRpbDo6U3RhdHVzIFJlbmRlclVJbnQzMihjb25zdCBQcm90b1N0cmVhbU9iamVjdFNvdXJjZSogb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG5hbWUsIE9iamVjdFdyaXRlciogb3cpOworICBzdGF0aWMgdXRpbDo6U3RhdHVzIFJlbmRlckJvb2woY29uc3QgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2UqIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG5hbWUsIE9iamVjdFdyaXRlciogb3cpOworICBzdGF0aWMgdXRpbDo6U3RhdHVzIFJlbmRlclN0cmluZyhjb25zdCBQcm90b1N0cmVhbU9iamVjdFNvdXJjZSogb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG5hbWUsIE9iamVjdFdyaXRlciogb3cpOworICBzdGF0aWMgdXRpbDo6U3RhdHVzIFJlbmRlckJ5dGVzKGNvbnN0IFByb3RvU3RyZWFtT2JqZWN0U291cmNlKiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG5hbWUsIE9iamVjdFdyaXRlciogb3cpOworCisgIC8vIFJlbmRlcnMgYSBnb29nbGUucHJvdG9idWYuU3RydWN0IHRvIE9iamVjdFdyaXRlci4KKyAgc3RhdGljIHV0aWw6OlN0YXR1cyBSZW5kZXJTdHJ1Y3QoY29uc3QgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2UqIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBuYW1lLCBPYmplY3RXcml0ZXIqIG93KTsKKworICAvLyBIZWxwZXIgdG8gcmVuZGVyIGdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QncyBWYWx1ZSBmaWVsZHMgdG8gT2JqZWN0V3JpdGVyLgorICBzdGF0aWMgdXRpbDo6U3RhdHVzIFJlbmRlclN0cnVjdFZhbHVlKGNvbnN0IFByb3RvU3RyZWFtT2JqZWN0U291cmNlKiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0V3JpdGVyKiBvdyk7CisKKyAgLy8gSGVscGVyIHRvIHJlbmRlciBnb29nbGUucHJvdG9idWYuU3RydWN0J3MgTGlzdFZhbHVlIGZpZWxkcyB0byBPYmplY3RXcml0ZXIuCisgIHN0YXRpYyB1dGlsOjpTdGF0dXMgUmVuZGVyU3RydWN0TGlzdFZhbHVlKGNvbnN0IFByb3RvU3RyZWFtT2JqZWN0U291cmNlKiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0V3JpdGVyKiBvdyk7CisKKyAgLy8gUmVuZGVyIHRoZSAiQW55IiB0eXBlLgorICBzdGF0aWMgdXRpbDo6U3RhdHVzIFJlbmRlckFueShjb25zdCBQcm90b1N0cmVhbU9iamVjdFNvdXJjZSogb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG5hbWUsIE9iamVjdFdyaXRlciogb3cpOworCisgIC8vIFJlbmRlciB0aGUgIkZpZWxkTWFzayIgdHlwZS4KKyAgc3RhdGljIHV0aWw6OlN0YXR1cyBSZW5kZXJGaWVsZE1hc2soY29uc3QgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2UqIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBuYW1lLCBPYmplY3RXcml0ZXIqIG93KTsKKworICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBUeXBlUmVuZGVyZXI+KiByZW5kZXJlcnNfOworICBzdGF0aWMgdm9pZCBJbml0UmVuZGVyZXJNYXAoKTsKKyAgc3RhdGljIHZvaWQgRGVsZXRlUmVuZGVyZXJNYXAoKTsKKyAgc3RhdGljIFR5cGVSZW5kZXJlciogRmluZFR5cGVSZW5kZXJlcihjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV91cmwpOworCisgIC8vIFNhbWUgYXMgYWJvdmUgYnV0IHJlbmRlcnMgYWxsIG5vbi1tZXNzYWdlIGZpZWxkIHR5cGVzLiBDYWxsZXJzIGRvbid0IGNhbGwKKyAgLy8gdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4gVGhleSBqdXN0IHVzZSBSZW5kZXJGaWVsZC4KKyAgdXRpbDo6U3RhdHVzIFJlbmRlck5vbk1lc3NhZ2VGaWVsZChjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RXcml0ZXIqIG93KSBjb25zdDsKKworCisgIC8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZGV0ZWN0IHByb3RvIG1hcHMuIFRoZSAnZmllbGQnIE1VU1QgYmUgcmVwZWF0ZWQuCisgIGJvb2wgSXNNYXAoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQmIGZpZWxkKSBjb25zdDsKKworICAvLyBVdGlsaXR5IHRvIHJlYWQgaW50NjQgYW5kIGludDMyIHZhbHVlcyBmcm9tIGEgbWVzc2FnZSB0eXBlIGluIHN0cmVhbV8uCisgIC8vIFVzZWQgZm9yIHJlYWRpbmcgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBhbmQgRHVyYXRpb24gbWVzc2FnZXMuCisgIHN0ZDo6cGFpcjxpbnQ2NF90LCBpbnQzMl90PiBSZWFkU2Vjb25kc0FuZE5hbm9zKAorICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSkgY29uc3Q7CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIHJlY3Vyc2lvbiBkZXB0aCBhbmQgaW5jcmVtZW50IGl0LiBJdCB3aWxsIHJldHVybgorICAvLyBPa1N0YXR1cygpIGlmIHRoZSBjdXJyZW50IGRlcHRoIGlzIGFsbG93ZWQuIE90aGVyd2lzZSBhbiBlcnJvciBpcyByZXR1cm5lZC4KKyAgLy8gdHlwZV9uYW1lIGFuZCBmaWVsZF9uYW1lIGFyZSB1c2VkIGZvciBlcnJvciByZXBvcnRpbmcuCisgIHV0aWw6OlN0YXR1cyBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aChTdHJpbmdQaWVjZSB0eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBmaWVsZF9uYW1lKSBjb25zdDsKKworICAvLyBJbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tLiBPd25lcnNoaXAgcmVzdHMgd2l0aCB0aGUgY2FsbGVyLgorICBtdXRhYmxlIGlvOjpDb2RlZElucHV0U3RyZWFtKiBzdHJlYW1fOworCisgIC8vIFR5cGUgaW5mb3JtYXRpb24gZm9yIGFsbCB0aGUgdHlwZXMgdXNlZCBpbiB0aGUgZGVzY3JpcHRvci4gVXNlZCB0byBmaW5kCisgIC8vIGdvb2dsZTo6cHJvdG9idWY6OlR5cGUgb2YgbmVzdGVkIG1lc3NhZ2VzL2VudW1zLgorICBjb25zdCBUeXBlSW5mbyogdHlwZWluZm9fOworCisgIC8vIFdoZXRoZXIgdGhpcyBjbGFzcyBvd25zIHRoZSB0eXBlaW5mb18gb2JqZWN0LiBJZiB0cnVlIHRoZSB0eXBlaW5mb18gb2JqZWN0CisgIC8vIHNob3VsZCBiZSBkZWxldGVkIGluIHRoZSBkZXN0cnVjdG9yLgorICBib29sIG93bl90eXBlaW5mb187CisKKyAgLy8gZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSBvZiB0aGUgbWVzc2FnZSBzb3VyY2UuCisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGVfOworCisKKyAgY29uc3QgUmVuZGVyT3B0aW9ucyByZW5kZXJfb3B0aW9uc187CisKKyAgLy8gVHJhY2tzIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLgorICBtdXRhYmxlIGludCByZWN1cnNpb25fZGVwdGhfOworCisgIC8vIE1heGltdW0gYWxsb3dlZCByZWN1cnNpb24gZGVwdGguCisgIGludCBtYXhfcmVjdXJzaW9uX2RlcHRoXzsKKworICBHT09HTEVfRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKFByb3RvU3RyZWFtT2JqZWN0U291cmNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9QUk9UT1NUUkVBTV9PQkpFQ1RTT1VSQ0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZGI3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2VfdGVzdC5jYwpAQCAtMCwwICsxLDExNjUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlLmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FueS5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2V4cGVjdGluZ19vYmplY3R3cml0ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9hbnlzLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2Nhc3RzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mb190ZXN0X2hlbHBlci5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBjb252ZXJ0ZXIgeworCit1c2luZyA6Omdvb2dsZTo6cHJvdG9idWY6OkFueTsKK3VzaW5nIGlvOjpBcnJheUlucHV0U3RyZWFtOwordXNpbmcgaW86OkNvZGVkSW5wdXRTdHJlYW07Cit1c2luZyBwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6QW55TTsKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpBbnlPdXQ7Cit1c2luZyBwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6QXV0aG9yOwordXNpbmcgcHJvdG9fdXRpbF9jb252ZXJ0ZXI6OnRlc3Rpbmc6OkJhZEF1dGhvcjsKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpCYWROZXN0ZWRCb29rOwordXNpbmcgcHJvdG9fdXRpbF9jb252ZXJ0ZXI6OnRlc3Rpbmc6OkJvb2s7Cit1c2luZyBwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6Qm9va19MYWJlbDsKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpDeWNsaWM7Cit1c2luZyBwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6RmllbGRNYXNrVGVzdDsKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpNYXBPdXQ7Cit1c2luZyBwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6TWFwT3V0V2lyZUZvcm1hdDsKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpOZXN0ZWRCb29rOwordXNpbmcgcHJvdG9fdXRpbF9jb252ZXJ0ZXI6OnRlc3Rpbmc6Ok5lc3RlZEZpZWxkTWFzazsKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpQYWNrZWRQcmltaXRpdmU7Cit1c2luZyBwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6UHJpbWl0aXZlOwordXNpbmcgcHJvdG9fdXRpbF9jb252ZXJ0ZXI6OnRlc3Rpbmc6OlByb3RvM01lc3NhZ2U7Cit1c2luZyBwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6U3RydWN0VHlwZTsKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpUaW1lc3RhbXBEdXJhdGlvbjsKK3VzaW5nIDo6dGVzdGluZzo6XzsKKworCituYW1lc3BhY2Ugeworc3RkOjpzdHJpbmcgR2V0VHlwZVVybChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBzdGQ6OnN0cmluZyhrVHlwZVNlcnZpY2VCYXNlVXJsKSArICIvIiArIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpOworfQorfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIFByb3Rvc3RyZWFtT2JqZWN0U291cmNlVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0ZXN0aW5nOjpUeXBlSW5mb1NvdXJjZT4geworIHByb3RlY3RlZDoKKyAgUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUZXN0KCkKKyAgICAgIDogaGVscGVyXyhHZXRQYXJhbSgpKSwKKyAgICAgICAgbW9ja18oKSwKKyAgICAgICAgb3dfKCZtb2NrXyksCisgICAgICAgIHVzZV9sb3dlcl9jYW1lbF9mb3JfZW51bXNfKGZhbHNlKSwKKyAgICAgICAgdXNlX2ludHNfZm9yX2VudW1zXyhmYWxzZSksCisgICAgICAgIHVzZV9wcmVzZXJ2ZV9wcm90b19maWVsZF9uYW1lc18oZmFsc2UpLAorICAgICAgICBhZGRfdHJhaWxpbmdfemVyb3NfKGZhbHNlKSwKKyAgICAgICAgcmVuZGVyX3Vua25vd25fZW51bV92YWx1ZXNfKHRydWUpIHsKKyAgICBoZWxwZXJfLlJlc2V0VHlwZUluZm8oQm9vazo6ZGVzY3JpcHRvcigpLCBQcm90bzNNZXNzYWdlOjpkZXNjcmlwdG9yKCkpOworICB9CisKKyAgflByb3Rvc3RyZWFtT2JqZWN0U291cmNlVGVzdCgpIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBEb1Rlc3QoY29uc3QgTWVzc2FnZSYgbXNnLCBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgICAgdXRpbDo6U3RhdHVzIHN0YXR1cyA9IEV4ZWN1dGVUZXN0KG1zZywgZGVzY3JpcHRvcik7CisgICAgRVhQRUNUX0VRKHV0aWw6OlN0YXR1cygpLCBzdGF0dXMpOworICB9CisKKyAgdXRpbDo6U3RhdHVzIEV4ZWN1dGVUZXN0KGNvbnN0IE1lc3NhZ2UmIG1zZywgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgbXNnLlNlcmlhbGl6ZVBhcnRpYWxUb09zdHJlYW0oJm9zcyk7CisgICAgc3RkOjpzdHJpbmcgcHJvdG8gPSBvc3Muc3RyKCk7CisgICAgQXJyYXlJbnB1dFN0cmVhbSBhcnJfc3RyZWFtKHByb3RvLmRhdGEoKSwgcHJvdG8uc2l6ZSgpKTsKKyAgICBDb2RlZElucHV0U3RyZWFtIGluX3N0cmVhbSgmYXJyX3N0cmVhbSk7CisKKyAgICBQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6UmVuZGVyT3B0aW9ucyByZW5kZXJfb3B0aW9uczsKKyAgICByZW5kZXJfb3B0aW9ucy51c2VfbG93ZXJfY2FtZWxfZm9yX2VudW1zID0gdXNlX2xvd2VyX2NhbWVsX2Zvcl9lbnVtc187CisgICAgcmVuZGVyX29wdGlvbnMudXNlX2ludHNfZm9yX2VudW1zID0gdXNlX2ludHNfZm9yX2VudW1zXzsKKyAgICByZW5kZXJfb3B0aW9ucy5wcmVzZXJ2ZV9wcm90b19maWVsZF9uYW1lcyA9IHVzZV9wcmVzZXJ2ZV9wcm90b19maWVsZF9uYW1lc187CisgICAgc3RkOjp1bmlxdWVfcHRyPFByb3RvU3RyZWFtT2JqZWN0U291cmNlPiBvcyhoZWxwZXJfLk5ld1Byb3RvU291cmNlKAorICAgICAgICAmaW5fc3RyZWFtLCBHZXRUeXBlVXJsKGRlc2NyaXB0b3IpLCByZW5kZXJfb3B0aW9ucykpOworICAgIG9zLT5zZXRfbWF4X3JlY3Vyc2lvbl9kZXB0aCg2NCk7CisgICAgcmV0dXJuIG9zLT5Xcml0ZVRvKCZtb2NrXyk7CisgIH0KKworICB2b2lkIFByZXBhcmVFeHBlY3RpbmdPYmplY3RXcml0ZXJGb3JSZXBlYXRlZFByaW1pdGl2ZSgpIHsKKyAgICBvd18uU3RhcnRPYmplY3QoIiIpCisgICAgICAgIC0+U3RhcnRMaXN0KCJyZXBGaXgzMiIpCisgICAgICAgIC0+UmVuZGVyVWludDMyKCIiLCBiaXRfY2FzdDx1aW50MzJfdD4oMzIwMSkpCisgICAgICAgIC0+UmVuZGVyVWludDMyKCIiLCBiaXRfY2FzdDx1aW50MzJfdD4oMCkpCisgICAgICAgIC0+UmVuZGVyVWludDMyKCIiLCBiaXRfY2FzdDx1aW50MzJfdD4oMzIwMikpCisgICAgICAgIC0+RW5kTGlzdCgpCisgICAgICAgIC0+U3RhcnRMaXN0KCJyZXBVMzIiKQorICAgICAgICAtPlJlbmRlclVpbnQzMigiIiwgYml0X2Nhc3Q8dWludDMyX3Q+KDMyMDMpKQorICAgICAgICAtPlJlbmRlclVpbnQzMigiIiwgYml0X2Nhc3Q8dWludDMyX3Q+KDApKQorICAgICAgICAtPkVuZExpc3QoKQorICAgICAgICAtPlN0YXJ0TGlzdCgicmVwSTMyIikKKyAgICAgICAgLT5SZW5kZXJJbnQzMigiIiwgMCkKKyAgICAgICAgLT5SZW5kZXJJbnQzMigiIiwgMzIwNCkKKyAgICAgICAgLT5SZW5kZXJJbnQzMigiIiwgMzIwNSkKKyAgICAgICAgLT5FbmRMaXN0KCkKKyAgICAgICAgLT5TdGFydExpc3QoInJlcFNmMzIiKQorICAgICAgICAtPlJlbmRlckludDMyKCIiLCAzMjA2KQorICAgICAgICAtPlJlbmRlckludDMyKCIiLCAwKQorICAgICAgICAtPkVuZExpc3QoKQorICAgICAgICAtPlN0YXJ0TGlzdCgicmVwUzMyIikKKyAgICAgICAgLT5SZW5kZXJJbnQzMigiIiwgMCkKKyAgICAgICAgLT5SZW5kZXJJbnQzMigiIiwgMzIwNykKKyAgICAgICAgLT5SZW5kZXJJbnQzMigiIiwgMzIwOCkKKyAgICAgICAgLT5FbmRMaXN0KCkKKyAgICAgICAgLT5TdGFydExpc3QoInJlcEZpeDY0IikKKyAgICAgICAgLT5SZW5kZXJVaW50NjQoIiIsIGJpdF9jYXN0PHVpbnQ2NF90PihpbnQ2NF90ezY0MDF9KSkKKyAgICAgICAgLT5SZW5kZXJVaW50NjQoIiIsIGJpdF9jYXN0PHVpbnQ2NF90PihpbnQ2NF90ezB9KSkKKyAgICAgICAgLT5FbmRMaXN0KCkKKyAgICAgICAgLT5TdGFydExpc3QoInJlcFU2NCIpCisgICAgICAgIC0+UmVuZGVyVWludDY0KCIiLCBiaXRfY2FzdDx1aW50NjRfdD4oaW50NjRfdHswfSkpCisgICAgICAgIC0+UmVuZGVyVWludDY0KCIiLCBiaXRfY2FzdDx1aW50NjRfdD4oaW50NjRfdHs2NDAyfSkpCisgICAgICAgIC0+UmVuZGVyVWludDY0KCIiLCBiaXRfY2FzdDx1aW50NjRfdD4oaW50NjRfdHs2NDAzfSkpCisgICAgICAgIC0+RW5kTGlzdCgpCisgICAgICAgIC0+U3RhcnRMaXN0KCJyZXBJNjQiKQorICAgICAgICAtPlJlbmRlckludDY0KCIiLCA2NDA0TCkKKyAgICAgICAgLT5SZW5kZXJJbnQ2NCgiIiwgMEwpCisgICAgICAgIC0+RW5kTGlzdCgpCisgICAgICAgIC0+U3RhcnRMaXN0KCJyZXBTZjY0IikKKyAgICAgICAgLT5SZW5kZXJJbnQ2NCgiIiwgMEwpCisgICAgICAgIC0+UmVuZGVySW50NjQoIiIsIDY0MDVMKQorICAgICAgICAtPlJlbmRlckludDY0KCIiLCA2NDA2TCkKKyAgICAgICAgLT5FbmRMaXN0KCkKKyAgICAgICAgLT5TdGFydExpc3QoInJlcFM2NCIpCisgICAgICAgIC0+UmVuZGVySW50NjQoIiIsIDY0MDdMKQorICAgICAgICAtPlJlbmRlckludDY0KCIiLCAwTCkKKyAgICAgICAgLT5FbmRMaXN0KCkKKyAgICAgICAgLT5TdGFydExpc3QoInJlcEZsb2F0IikKKyAgICAgICAgLT5SZW5kZXJGbG9hdCgiIiwgMC4wZikKKyAgICAgICAgLT5SZW5kZXJGbG9hdCgiIiwgMzIuMWYpCisgICAgICAgIC0+UmVuZGVyRmxvYXQoIiIsIDMyLjJmKQorICAgICAgICAtPkVuZExpc3QoKQorICAgICAgICAtPlN0YXJ0TGlzdCgicmVwRG91YmxlIikKKyAgICAgICAgLT5SZW5kZXJEb3VibGUoIiIsIDY0LjFMKQorICAgICAgICAtPlJlbmRlckRvdWJsZSgiIiwgMC4wTCkKKyAgICAgICAgLT5FbmRMaXN0KCkKKyAgICAgICAgLT5TdGFydExpc3QoInJlcEJvb2wiKQorICAgICAgICAtPlJlbmRlckJvb2woIiIsIHRydWUpCisgICAgICAgIC0+UmVuZGVyQm9vbCgiIiwgZmFsc2UpCisgICAgICAgIC0+RW5kTGlzdCgpCisgICAgICAgIC0+RW5kT2JqZWN0KCk7CisgIH0KKworICBQcmltaXRpdmUgUHJlcGFyZVJlcGVhdGVkUHJpbWl0aXZlKCkgeworICAgIFByaW1pdGl2ZSBwcmltaXRpdmU7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfZml4MzIoMzIwMSk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfZml4MzIoMCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfZml4MzIoMzIwMik7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfdTMyKDMyMDMpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX3UzMigwKTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9pMzIoMCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfaTMyKDMyMDQpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX2kzMigzMjA1KTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9zZjMyKDMyMDYpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX3NmMzIoMCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfczMyKDApOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX3MzMigzMjA3KTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9zMzIoMzIwOCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfZml4NjQoNjQwMUwpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX2ZpeDY0KDBMKTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF91NjQoMEwpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX3U2NCg2NDAyTCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfdTY0KDY0MDNMKTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9pNjQoNjQwNEwpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX2k2NCgwTCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfc2Y2NCgwTCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfc2Y2NCg2NDA1TCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfc2Y2NCg2NDA2TCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfczY0KDY0MDdMKTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9zNjQoMEwpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX2Zsb2F0KDAuMGYpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX2Zsb2F0KDMyLjFmKTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9mbG9hdCgzMi4yZik7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfZG91YmxlKDY0LjFMKTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9kb3VibGUoMC4wKTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9ib29sKHRydWUpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX2Jvb2woZmFsc2UpOworCisgICAgUHJlcGFyZUV4cGVjdGluZ09iamVjdFdyaXRlckZvclJlcGVhdGVkUHJpbWl0aXZlKCk7CisgICAgcmV0dXJuIHByaW1pdGl2ZTsKKyAgfQorCisgIFBhY2tlZFByaW1pdGl2ZSBQcmVwYXJlUGFja2VkUHJpbWl0aXZlKCkgeworICAgIFBhY2tlZFByaW1pdGl2ZSBwcmltaXRpdmU7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfZml4MzIoMzIwMSk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfZml4MzIoMCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfZml4MzIoMzIwMik7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfdTMyKDMyMDMpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX3UzMigwKTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9pMzIoMCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfaTMyKDMyMDQpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX2kzMigzMjA1KTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9zZjMyKDMyMDYpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX3NmMzIoMCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfczMyKDApOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX3MzMigzMjA3KTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9zMzIoMzIwOCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfZml4NjQoNjQwMUwpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX2ZpeDY0KDBMKTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF91NjQoMEwpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX3U2NCg2NDAyTCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfdTY0KDY0MDNMKTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9pNjQoNjQwNEwpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX2k2NCgwTCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfc2Y2NCgwTCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfc2Y2NCg2NDA1TCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfc2Y2NCg2NDA2TCk7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfczY0KDY0MDdMKTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9zNjQoMEwpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX2Zsb2F0KDAuMGYpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX2Zsb2F0KDMyLjFmKTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9mbG9hdCgzMi4yZik7CisgICAgcHJpbWl0aXZlLmFkZF9yZXBfZG91YmxlKDY0LjFMKTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9kb3VibGUoMC4wKTsKKyAgICBwcmltaXRpdmUuYWRkX3JlcF9ib29sKHRydWUpOworICAgIHByaW1pdGl2ZS5hZGRfcmVwX2Jvb2woZmFsc2UpOworCisgICAgUHJlcGFyZUV4cGVjdGluZ09iamVjdFdyaXRlckZvclJlcGVhdGVkUHJpbWl0aXZlKCk7CisgICAgcmV0dXJuIHByaW1pdGl2ZTsKKyAgfQorCisgIHZvaWQgVXNlTG93ZXJDYW1lbEZvckVudW1zKCkgeyB1c2VfbG93ZXJfY2FtZWxfZm9yX2VudW1zXyA9IHRydWU7IH0KKworICB2b2lkIFVzZUludHNGb3JFbnVtcygpIHsgdXNlX2ludHNfZm9yX2VudW1zXyA9IHRydWU7IH0KKworICB2b2lkIFVzZVByZXNlcnZlUHJvdG9GaWVsZE5hbWVzKCkgeyB1c2VfcHJlc2VydmVfcHJvdG9fZmllbGRfbmFtZXNfID0gdHJ1ZTsgfQorCisgIHZvaWQgQWRkVHJhaWxpbmdaZXJvcygpIHsgYWRkX3RyYWlsaW5nX3plcm9zXyA9IHRydWU7IH0KKworICB2b2lkIFNldFJlbmRlclVua25vd25FbnVtVmFsdWVzKGJvb2wgdmFsdWUpIHsKKyAgICByZW5kZXJfdW5rbm93bl9lbnVtX3ZhbHVlc18gPSB2YWx1ZTsKKyAgfQorCisgIHRlc3Rpbmc6OlR5cGVJbmZvVGVzdEhlbHBlciBoZWxwZXJfOworCisgIDo6dGVzdGluZzo6TmljZU1vY2s8TW9ja09iamVjdFdyaXRlcj4gbW9ja187CisgIEV4cGVjdGluZ09iamVjdFdyaXRlciBvd187CisgIGJvb2wgdXNlX2xvd2VyX2NhbWVsX2Zvcl9lbnVtc187CisgIGJvb2wgdXNlX2ludHNfZm9yX2VudW1zXzsKKyAgYm9vbCB1c2VfcHJlc2VydmVfcHJvdG9fZmllbGRfbmFtZXNfOworICBib29sIGFkZF90cmFpbGluZ196ZXJvc187CisgIGJvb2wgcmVuZGVyX3Vua25vd25fZW51bV92YWx1ZXNfOworfTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKERpZmZlcmVudFR5cGVJbmZvU291cmNlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b3N0cmVhbU9iamVjdFNvdXJjZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlVTRV9UWVBFX1JFU09MVkVSKSk7CisKK1RFU1RfUChQcm90b3N0cmVhbU9iamVjdFNvdXJjZVRlc3QsIEVtcHR5TWVzc2FnZSkgeworICBCb29rIGVtcHR5OworICBvd18uU3RhcnRPYmplY3QoIiIpLT5FbmRPYmplY3QoKTsKKyAgRG9UZXN0KGVtcHR5LCBCb29rOjpkZXNjcmlwdG9yKCkpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUZXN0LCBQcmltaXRpdmVzKSB7CisgIFByaW1pdGl2ZSBwcmltaXRpdmU7CisgIHByaW1pdGl2ZS5zZXRfZml4MzIoMzIwMSk7CisgIHByaW1pdGl2ZS5zZXRfdTMyKDMyMDIpOworICBwcmltaXRpdmUuc2V0X2kzMigzMjAzKTsKKyAgcHJpbWl0aXZlLnNldF9zZjMyKDMyMDQpOworICBwcmltaXRpdmUuc2V0X3MzMigzMjA1KTsKKyAgcHJpbWl0aXZlLnNldF9maXg2NCg2NDAxTCk7CisgIHByaW1pdGl2ZS5zZXRfdTY0KDY0MDJMKTsKKyAgcHJpbWl0aXZlLnNldF9pNjQoNjQwM0wpOworICBwcmltaXRpdmUuc2V0X3NmNjQoNjQwNEwpOworICBwcmltaXRpdmUuc2V0X3M2NCg2NDA1TCk7CisgIHByaW1pdGl2ZS5zZXRfc3RyKCJTdHJpbmcgVmFsdWUiKTsKKyAgcHJpbWl0aXZlLnNldF9ieXRlcygiU29tZSBCeXRlcyIpOworICBwcmltaXRpdmUuc2V0X2Zsb2F0XygzMi4xZik7CisgIHByaW1pdGl2ZS5zZXRfZG91YmxlXyg2NC4xTCk7CisgIHByaW1pdGl2ZS5zZXRfYm9vbF8odHJ1ZSk7CisKKyAgb3dfLlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJVaW50MzIoImZpeDMyIiwgYml0X2Nhc3Q8dWludDMyX3Q+KDMyMDEpKQorICAgICAgLT5SZW5kZXJVaW50MzIoInUzMiIsIGJpdF9jYXN0PHVpbnQzMl90PigzMjAyKSkKKyAgICAgIC0+UmVuZGVySW50MzIoImkzMiIsIDMyMDMpCisgICAgICAtPlJlbmRlckludDMyKCJzZjMyIiwgMzIwNCkKKyAgICAgIC0+UmVuZGVySW50MzIoInMzMiIsIDMyMDUpCisgICAgICAtPlJlbmRlclVpbnQ2NCgiZml4NjQiLCBiaXRfY2FzdDx1aW50NjRfdD4oaW50NjRfdHs2NDAxfSkpCisgICAgICAtPlJlbmRlclVpbnQ2NCgidTY0IiwgYml0X2Nhc3Q8dWludDY0X3Q+KGludDY0X3R7NjQwMn0pKQorICAgICAgLT5SZW5kZXJJbnQ2NCgiaTY0IiwgNjQwM0wpCisgICAgICAtPlJlbmRlckludDY0KCJzZjY0IiwgNjQwNEwpCisgICAgICAtPlJlbmRlckludDY0KCJzNjQiLCA2NDA1TCkKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJzdHIiLCAiU3RyaW5nIFZhbHVlIikKKyAgICAgIC0+UmVuZGVyQnl0ZXMoImJ5dGVzIiwgIlNvbWUgQnl0ZXMiKQorICAgICAgLT5SZW5kZXJGbG9hdCgiZmxvYXQiLCAzMi4xZikKKyAgICAgIC0+UmVuZGVyRG91YmxlKCJkb3VibGUiLCA2NC4xTCkKKyAgICAgIC0+UmVuZGVyQm9vbCgiYm9vbCIsIHRydWUpCisgICAgICAtPkVuZE9iamVjdCgpOworICBEb1Rlc3QocHJpbWl0aXZlLCBQcmltaXRpdmU6OmRlc2NyaXB0b3IoKSk7Cit9CisKK1RFU1RfUChQcm90b3N0cmVhbU9iamVjdFNvdXJjZVRlc3QsIFJlcGVhdGluZ1ByaW1pdGl2ZXMpIHsKKyAgUHJpbWl0aXZlIHByaW1pdGl2ZSA9IFByZXBhcmVSZXBlYXRlZFByaW1pdGl2ZSgpOworICBwcmltaXRpdmUuYWRkX3JlcF9zdHIoIlN0cmluZyBPbmUiKTsKKyAgcHJpbWl0aXZlLmFkZF9yZXBfc3RyKCJTdHJpbmcgVHdvIik7CisgIHByaW1pdGl2ZS5hZGRfcmVwX2J5dGVzKCJTb21lIEJ5dGVzIik7CisKKyAgb3dfLlN0YXJ0TGlzdCgicmVwU3RyIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAiU3RyaW5nIE9uZSIpCisgICAgICAtPlJlbmRlclN0cmluZygiIiwgIlN0cmluZyBUd28iKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+U3RhcnRMaXN0KCJyZXBCeXRlcyIpCisgICAgICAtPlJlbmRlckJ5dGVzKCIiLCAiU29tZSBCeXRlcyIpCisgICAgICAtPkVuZExpc3QoKTsKKyAgRG9UZXN0KHByaW1pdGl2ZSwgUHJpbWl0aXZlOjpkZXNjcmlwdG9yKCkpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUZXN0LCBDdXN0b21Kc29uTmFtZSkgeworICBBdXRob3IgYXV0aG9yOworICBhdXRob3Iuc2V0X2lkKDEyMzQ1KTsKKworICBvd18uU3RhcnRPYmplY3QoIiIpLT5SZW5kZXJVaW50NjQoIkBpZCIsIDEyMzQ1KS0+RW5kT2JqZWN0KCk7CisgIERvVGVzdChhdXRob3IsIEF1dGhvcjo6ZGVzY3JpcHRvcigpKTsKK30KKworVEVTVF9QKFByb3Rvc3RyZWFtT2JqZWN0U291cmNlVGVzdCwgTmVzdGVkTWVzc2FnZSkgeworICBBdXRob3IqIGF1dGhvciA9IG5ldyBBdXRob3IoKTsKKyAgYXV0aG9yLT5zZXRfbmFtZSgiVG9sc3RveSIpOworICBCb29rIGJvb2s7CisgIGJvb2suc2V0X3RpdGxlKCJNeSBCb29rIik7CisgIGJvb2suc2V0X2FsbG9jYXRlZF9hdXRob3IoYXV0aG9yKTsKKworICBvd18uU3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygidGl0bGUiLCAiTXkgQm9vayIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhdXRob3IiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAiVG9sc3RveSIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBEb1Rlc3QoYm9vaywgQm9vazo6ZGVzY3JpcHRvcigpKTsKK30KKworVEVTVF9QKFByb3Rvc3RyZWFtT2JqZWN0U291cmNlVGVzdCwgUmVwZWF0aW5nRmllbGQpIHsKKyAgQXV0aG9yIGF1dGhvcjsKKyAgYXV0aG9yLnNldF9hbGl2ZShmYWxzZSk7CisgIGF1dGhvci5zZXRfbmFtZSgiam9obiIpOworICBhdXRob3IuYWRkX3BzZXVkb255bSgicGhpbCIpOworICBhdXRob3IuYWRkX3BzZXVkb255bSgiYm9iIik7CisKKyAgb3dfLlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJCb29sKCJhbGl2ZSIsIGZhbHNlKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAiam9obiIpCisgICAgICAtPlN0YXJ0TGlzdCgicHNldWRvbnltIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAicGhpbCIpCisgICAgICAtPlJlbmRlclN0cmluZygiIiwgImJvYiIpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgRG9UZXN0KGF1dGhvciwgQXV0aG9yOjpkZXNjcmlwdG9yKCkpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUZXN0LCBQYWNrZWRSZXBlYXRpbmdGaWVsZHMpIHsKKyAgRG9UZXN0KFByZXBhcmVQYWNrZWRQcmltaXRpdmUoKSwgUGFja2VkUHJpbWl0aXZlOjpkZXNjcmlwdG9yKCkpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUZXN0LCBOb25QYWNrZWRQYWNrYWJsZUZpZWxkc0FjdHVhbGx5UGFja2VkKSB7CisgIC8vIFByb3Rvc3RyZWFtIGlzIHBhY2tlZCwgYnV0IHBhcnNlIHdpdGggbm9uLXBhY2tlZCBQcmltaXRpdmUuCisgIERvVGVzdChQcmVwYXJlUGFja2VkUHJpbWl0aXZlKCksIFByaW1pdGl2ZTo6ZGVzY3JpcHRvcigpKTsKK30KKworVEVTVF9QKFByb3Rvc3RyZWFtT2JqZWN0U291cmNlVGVzdCwgUGFja2VkUGFja2FibGVGaWVsZE5vdEFjdHVhbGx5UGFja2VkKSB7CisgIC8vIFByb3Rvc3RyZWFtIGlzIG5vdCBwYWNrZWQsIGJ1dCBwYXJzZSB3aXRoIFBhY2tlZFByaW1pdGl2ZS4KKyAgRG9UZXN0KFByZXBhcmVSZXBlYXRlZFByaW1pdGl2ZSgpLCBQYWNrZWRQcmltaXRpdmU6OmRlc2NyaXB0b3IoKSk7Cit9CisKK1RFU1RfUChQcm90b3N0cmVhbU9iamVjdFNvdXJjZVRlc3QsIEJhZEF1dGhvcikgeworICBBdXRob3IgYXV0aG9yOworICBhdXRob3Iuc2V0X2FsaXZlKGZhbHNlKTsKKyAgYXV0aG9yLnNldF9uYW1lKCJqb2huIik7CisgIGF1dGhvci5zZXRfaWQoMTIzNEwpOworICBhdXRob3IuYWRkX3BzZXVkb255bSgicGhpbCIpOworICBhdXRob3IuYWRkX3BzZXVkb255bSgiYm9iIik7CisKKyAgb3dfLlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydExpc3QoImFsaXZlIikKKyAgICAgIC0+UmVuZGVyQm9vbCgiIiwgZmFsc2UpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5TdGFydExpc3QoIm5hbWUiKQorICAgICAgLT5SZW5kZXJVaW50NjQoIiIsIHN0YXRpY19jYXN0PHVpbnQ2NF90PignaicpKQorICAgICAgLT5SZW5kZXJVaW50NjQoIiIsIHN0YXRpY19jYXN0PHVpbnQ2NF90PignbycpKQorICAgICAgLT5SZW5kZXJVaW50NjQoIiIsIHN0YXRpY19jYXN0PHVpbnQ2NF90PignaCcpKQorICAgICAgLT5SZW5kZXJVaW50NjQoIiIsIHN0YXRpY19jYXN0PHVpbnQ2NF90PignbicpKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJwc2V1ZG9ueW0iLCAicGhpbCIpCisgICAgICAtPlJlbmRlclN0cmluZygicHNldWRvbnltIiwgImJvYiIpCisgICAgICAtPkVuZE9iamVjdCgpOworICAvLyBQcm90b3N0cmVhbSBjcmVhdGVkIHdpdGggQXV0aG9yLCBidXQgcGFyc2VkIHdpdGggQmFkQXV0aG9yLgorICBEb1Rlc3QoYXV0aG9yLCBCYWRBdXRob3I6OmRlc2NyaXB0b3IoKSk7Cit9CisKK1RFU1RfUChQcm90b3N0cmVhbU9iamVjdFNvdXJjZVRlc3QsIE5lc3RlZEJvb2tUb0JhZE5lc3RlZEJvb2spIHsKKyAgQm9vayogYm9vayA9IG5ldyBCb29rKCk7CisgIGJvb2stPnNldF9sZW5ndGgoMjUwKTsKKyAgYm9vay0+c2V0X3B1Ymxpc2hlZCgyMDE0TCk7CisgIE5lc3RlZEJvb2sgbmVzdGVkOworICBuZXN0ZWQuc2V0X2FsbG9jYXRlZF9ib29rKGJvb2spOworCisgIG93Xy5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRMaXN0KCJib29rIikKKyAgICAgIC0+UmVuZGVyVWludDMyKCIiLCAyNCkgIC8vIHRhZyBmb3IgZmllbGQgbGVuZ3RoICgzIDw8IDMpCisgICAgICAtPlJlbmRlclVpbnQzMigiIiwgMjUwKQorICAgICAgLT5SZW5kZXJVaW50MzIoIiIsIDMyKSAgLy8gdGFnIGZvciBmaWVsZCBwdWJsaXNoZWQgKDQgPDwgMykKKyAgICAgIC0+UmVuZGVyVWludDMyKCIiLCAyMDE0KQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIC8vIFByb3Rvc3RyZWFtIGNyZWF0ZWQgd2l0aCBOZXN0ZWRCb29rLCBidXQgcGFyc2VkIHdpdGggQmFkTmVzdGVkQm9vay4KKyAgRG9UZXN0KG5lc3RlZCwgQmFkTmVzdGVkQm9vazo6ZGVzY3JpcHRvcigpKTsKK30KKworVEVTVF9QKFByb3Rvc3RyZWFtT2JqZWN0U291cmNlVGVzdCwgQmFkTmVzdGVkQm9va1RvTmVzdGVkQm9vaykgeworICBCYWROZXN0ZWRCb29rIG5lc3RlZDsKKyAgbmVzdGVkLmFkZF9ib29rKDEpOworICBuZXN0ZWQuYWRkX2Jvb2soMik7CisgIG5lc3RlZC5hZGRfYm9vaygzKTsKKyAgbmVzdGVkLmFkZF9ib29rKDQpOworICBuZXN0ZWQuYWRkX2Jvb2soNSk7CisgIG5lc3RlZC5hZGRfYm9vayg2KTsKKyAgbmVzdGVkLmFkZF9ib29rKDcpOworCisgIG93Xy5TdGFydE9iamVjdCgiIiktPlN0YXJ0T2JqZWN0KCJib29rIiktPkVuZE9iamVjdCgpLT5FbmRPYmplY3QoKTsKKyAgLy8gUHJvdG9zdHJlYW0gY3JlYXRlZCB3aXRoIEJhZE5lc3RlZEJvb2ssIGJ1dCBwYXJzZWQgd2l0aCBOZXN0ZWRCb29rLgorICBEb1Rlc3QobmVzdGVkLCBOZXN0ZWRCb29rOjpkZXNjcmlwdG9yKCkpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUZXN0LAorICAgICAgIExvbmdSZXBlYXRlZExpc3REb2VzTm90QnJlYWtJbnRvTXVsdGlwbGVKc29uTGlzdHMpIHsKKyAgQm9vayBib29rOworCisgIGludCByZXBlYXQgPSAxMDAwMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBlYXQ7ICsraSkgeworICAgIEJvb2tfTGFiZWwqIGxhYmVsID0gYm9vay5hZGRfbGFiZWxzKCk7CisgICAgbGFiZWwtPnNldF9rZXkoU3RyQ2F0KCJpIiwgaSkpOworICAgIGxhYmVsLT5zZXRfdmFsdWUoU3RyQ2F0KCJ2IiwgaSkpOworICB9CisKKyAgLy8gTWFrZSBzdXJlIFN0YXJ0TGlzdCBhbmQgRW5kTGlzdCBhcmUgY2FsbGVkIGV4YWN0bHkgb25jZSAoc2VlIGIvMTgyMjc0OTkgZm9yCisgIC8vIHByb2JsZW1zIHdoZW4gdGhpcyBkb2Vzbid0IGhhcHBlbikKKyAgRVhQRUNUX0NBTEwobW9ja18sIFN0YXJ0TGlzdChfKSkuVGltZXMoMSk7CisgIEVYUEVDVF9DQUxMKG1vY2tfLCBFbmRMaXN0KCkpLlRpbWVzKDEpOworCisgIERvVGVzdChib29rLCBCb29rOjpkZXNjcmlwdG9yKCkpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUZXN0LCBMb3dlckNhbWVsRW51bU91dHB1dE1hY3JvQ2FzZSkgeworICBCb29rIGJvb2s7CisgIGJvb2suc2V0X3R5cGUoQm9vazo6QUNUSU9OX0FORF9BRFZFTlRVUkUpOworCisgIFVzZUxvd2VyQ2FtZWxGb3JFbnVtcygpOworCisgIG93Xy5TdGFydE9iamVjdCgiIiktPlJlbmRlclN0cmluZygidHlwZSIsICJhY3Rpb25BbmRBZHZlbnR1cmUiKS0+RW5kT2JqZWN0KCk7CisgIERvVGVzdChib29rLCBCb29rOjpkZXNjcmlwdG9yKCkpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUZXN0LCBMb3dlckNhbWVsRW51bU91dHB1dFNuYWtlQ2FzZSkgeworICBCb29rIGJvb2s7CisgIGJvb2suc2V0X3R5cGUoQm9vazo6YXJ0c19hbmRfcGhvdG9ncmFwaHkpOworCisgIFVzZUxvd2VyQ2FtZWxGb3JFbnVtcygpOworCisgIG93Xy5TdGFydE9iamVjdCgiIiktPlJlbmRlclN0cmluZygidHlwZSIsICJhcnRzQW5kUGhvdG9ncmFwaHkiKS0+RW5kT2JqZWN0KCk7CisgIERvVGVzdChib29rLCBCb29rOjpkZXNjcmlwdG9yKCkpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUZXN0LCBMb3dlckNhbWVsRW51bU91dHB1dFdpdGhOdW1iZXIpIHsKKyAgQm9vayBib29rOworICBib29rLnNldF90eXBlKEJvb2s6OkkxOE5fVGVjaCk7CisKKyAgVXNlTG93ZXJDYW1lbEZvckVudW1zKCk7CisKKyAgb3dfLlN0YXJ0T2JqZWN0KCIiKS0+UmVuZGVyU3RyaW5nKCJ0eXBlIiwgImkxOG5UZWNoIiktPkVuZE9iamVjdCgpOworICBEb1Rlc3QoYm9vaywgQm9vazo6ZGVzY3JpcHRvcigpKTsKK30KKworVEVTVF9QKFByb3Rvc3RyZWFtT2JqZWN0U291cmNlVGVzdCwgRW51bUNhc2VJc1VuY2hhbmdlZEJ5RGVmYXVsdCkgeworICBCb29rIGJvb2s7CisgIGJvb2suc2V0X3R5cGUoQm9vazo6QUNUSU9OX0FORF9BRFZFTlRVUkUpOworICBvd18uU3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygidHlwZSIsICJBQ1RJT05fQU5EX0FEVkVOVFVSRSIpCisgICAgICAtPkVuZE9iamVjdCgpOworICBEb1Rlc3QoYm9vaywgQm9vazo6ZGVzY3JpcHRvcigpKTsKK30KKworVEVTVF9QKFByb3Rvc3RyZWFtT2JqZWN0U291cmNlVGVzdCwgVXNlSW50c0ZvckVudW1zVGVzdCkgeworICBCb29rIGJvb2s7CisgIGJvb2suc2V0X3R5cGUoQm9vazo6QUNUSU9OX0FORF9BRFZFTlRVUkUpOworCisgIFVzZUludHNGb3JFbnVtcygpOworCisgIG93Xy5TdGFydE9iamVjdCgiIiktPlJlbmRlckludDMyKCJ0eXBlIiwgMyktPkVuZE9iamVjdCgpOworICBEb1Rlc3QoYm9vaywgQm9vazo6ZGVzY3JpcHRvcigpKTsKK30KKworVEVTVF9QKFByb3Rvc3RyZWFtT2JqZWN0U291cmNlVGVzdCwgVXNlUHJlc2VydmVQcm90b0ZpZWxkTmFtZXMpIHsKKyAgQm9vayBib29rOworICBib29rLnNldF9zbmFrZV9maWVsZCgiZm9vIik7CisKKyAgVXNlUHJlc2VydmVQcm90b0ZpZWxkTmFtZXMoKTsKKworICBvd18uU3RhcnRPYmplY3QoIiIpLT5SZW5kZXJTdHJpbmcoInNuYWtlX2ZpZWxkIiwgImZvbyIpLT5FbmRPYmplY3QoKTsKKyAgRG9UZXN0KGJvb2ssIEJvb2s6OmRlc2NyaXB0b3IoKSk7Cit9CisKK1RFU1RfUChQcm90b3N0cmVhbU9iamVjdFNvdXJjZVRlc3QsCisgICAgICAgVW5rbm93bkVudW1BcmVEcm9wcGVkV2hlblJlbmRlclVua25vd25FbnVtVmFsdWVzSXNVbnNldCkgeworICBQcm90bzNNZXNzYWdlIG1lc3NhZ2U7CisgIG1lc3NhZ2Uuc2V0X2VudW1fdmFsdWUoc3RhdGljX2Nhc3Q8UHJvdG8zTWVzc2FnZTo6TmVzdGVkRW51bT4oMTIzNCkpOworCisgIFNldFJlbmRlclVua25vd25FbnVtVmFsdWVzKGZhbHNlKTsKKworICAvLyBVbmtub3duIGVudW0gdmFsdWVzIGFyZSBub3Qgb3V0cHV0LgorICBvd18uU3RhcnRPYmplY3QoIiIpLT5FbmRPYmplY3QoKTsKKyAgRG9UZXN0KG1lc3NhZ2UsIFByb3RvM01lc3NhZ2U6OmRlc2NyaXB0b3IoKSk7Cit9CisKK1RFU1RfUChQcm90b3N0cmVhbU9iamVjdFNvdXJjZVRlc3QsCisgICAgICAgVW5rbm93bkVudW1BcmVPdXRwdXRXaGVuUmVuZGVyVW5rbm93bkVudW1WYWx1ZXNJc1NldCkgeworICBQcm90bzNNZXNzYWdlIG1lc3NhZ2U7CisgIG1lc3NhZ2Uuc2V0X2VudW1fdmFsdWUoc3RhdGljX2Nhc3Q8UHJvdG8zTWVzc2FnZTo6TmVzdGVkRW51bT4oMTIzNCkpOworCisgIFNldFJlbmRlclVua25vd25FbnVtVmFsdWVzKHRydWUpOworCisgIC8vIFVua25vd24gZW51bSB2YWx1ZXMgYXJlIG91dHB1dC4KKyAgb3dfLlN0YXJ0T2JqZWN0KCIiKS0+UmVuZGVySW50MzIoImVudW1WYWx1ZSIsIDEyMzQpLT5FbmRPYmplY3QoKTsKKyAgRG9UZXN0KG1lc3NhZ2UsIFByb3RvM01lc3NhZ2U6OmRlc2NyaXB0b3IoKSk7Cit9CisKK1RFU1RfUChQcm90b3N0cmVhbU9iamVjdFNvdXJjZVRlc3QsIEN5Y2xpY01lc3NhZ2VEZXB0aFRlc3QpIHsKKyAgQ3ljbGljIGN5Y2xpYzsKKyAgY3ljbGljLnNldF9tX2ludCgxMjMpOworCisgIEJvb2sqIGJvb2sgPSBjeWNsaWMubXV0YWJsZV9tX2Jvb2soKTsKKyAgYm9vay0+c2V0X3RpdGxlKCJib29rIHRpdGxlIik7CisgIEN5Y2xpYyogY3VycmVudCA9IGN5Y2xpYy5tdXRhYmxlX21fY3ljbGljKCk7CisgIEF1dGhvciogY3VycmVudF9hdXRob3IgPSBjeWNsaWMuYWRkX21fYXV0aG9yKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjM7ICsraSkgeworICAgIEF1dGhvciogbmV4dCA9IGN1cnJlbnRfYXV0aG9yLT5hZGRfZnJpZW5kXygpOworICAgIG5leHQtPnNldF9pZChpKTsKKyAgICBuZXh0LT5zZXRfbmFtZShTdHJDYXQoImF1dGhvcl9uYW1lXyIsIGkpKTsKKyAgICBuZXh0LT5zZXRfYWxpdmUodHJ1ZSk7CisgICAgY3VycmVudF9hdXRob3IgPSBuZXh0OworICB9CisKKyAgLy8gUmVjdXJzaXZlIG1lc3NhZ2Ugd2l0aCBkZXB0aCAoNjUpID4gbWF4IChtYXggaXMgNjQpLgorICBmb3IgKGludCBpID0gMDsgaSA8IDY0OyArK2kpIHsKKyAgICBDeWNsaWMqIG5leHQgPSBjdXJyZW50LT5tdXRhYmxlX21fY3ljbGljKCk7CisgICAgbmV4dC0+c2V0X21fc3RyKFN0ckNhdCgiY291bnRfIiwgaSkpOworICAgIGN1cnJlbnQgPSBuZXh0OworICB9CisKKyAgdXRpbDo6U3RhdHVzIHN0YXR1cyA9IEV4ZWN1dGVUZXN0KGN5Y2xpYywgQ3ljbGljOjpkZXNjcmlwdG9yKCkpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpJc0ludmFsaWRBcmd1bWVudChzdGF0dXMpKTsKK30KKworY2xhc3MgUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VNYXBzVGVzdCA6IHB1YmxpYyBQcm90b3N0cmVhbU9iamVjdFNvdXJjZVRlc3QgeworIHByb3RlY3RlZDoKKyAgUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VNYXBzVGVzdCgpIHsKKyAgICBoZWxwZXJfLlJlc2V0VHlwZUluZm8oTWFwT3V0OjpkZXNjcmlwdG9yKCkpOworICB9Cit9OworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoRGlmZmVyZW50VHlwZUluZm9Tb3VyY2VUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFByb3Rvc3RyZWFtT2JqZWN0U291cmNlTWFwc1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlVTRV9UWVBFX1JFU09MVkVSKSk7CisKKy8vIFRlc3RzIEpTT04gbWFwLgorLy8KKy8vIFRoaXMgaXMgdGhlIGV4YW1wbGUgZXhwZWN0ZWQgb3V0cHV0LgorLy8geworLy8gICAibWFwMSI6IHsKKy8vICAgICAia2V5MSI6IHsKKy8vICAgICAgICJmb28iOiAiZm9vdmFsdWUiCisvLyAgICAgfSwKKy8vICAgICAia2V5MiI6IHsKKy8vICAgICAgICJmb28iOiAiYmFydmFsdWUiCisvLyAgICAgfQorLy8gICB9LAorLy8gICAibWFwMiI6IHsKKy8vICAgICAibmVzdGVkc2VsZiI6IHsKKy8vICAgICAgICJtYXAxIjogeworLy8gICAgICAgICAibmVzdGVkX2tleTEiOiB7CisvLyAgICAgICAgICAgImZvbyI6ICJuZXN0ZWRfZm9vIgorLy8gICAgICAgICB9CisvLyAgICAgICB9LAorLy8gICAgICAgImJhciI6ICJuZXN0ZWRfYmFyX3N0cmluZyIKKy8vICAgICB9CisvLyAgIH0sCisvLyAgICJtYXAzIjogeworLy8gICAgICIxMTEiOiAib25lIG9uZSBvbmUiCisvLyAgIH0sCisvLyAgICJiYXIiOiAidG9wIGJhciIKKy8vIH0KK1RFU1RfUChQcm90b3N0cmVhbU9iamVjdFNvdXJjZU1hcHNUZXN0LCBNYXBzVGVzdCkgeworICBNYXBPdXQgb3V0OworICAoKm91dC5tdXRhYmxlX21hcDEoKSlbImtleTEiXS5zZXRfZm9vKCJmb292YWx1ZSIpOworICAoKm91dC5tdXRhYmxlX21hcDEoKSlbImtleTIiXS5zZXRfZm9vKCJiYXJ2YWx1ZSIpOworCisgIE1hcE91dCogbmVzdGVkX3ZhbHVlID0gJigqb3V0Lm11dGFibGVfbWFwMigpKVsibmVzdGVkc2VsZiJdOworICAoKm5lc3RlZF92YWx1ZS0+bXV0YWJsZV9tYXAxKCkpWyJuZXN0ZWRfa2V5MSJdLnNldF9mb28oIm5lc3RlZF9mb28iKTsKKyAgbmVzdGVkX3ZhbHVlLT5zZXRfYmFyKCJuZXN0ZWRfYmFyX3N0cmluZyIpOworCisgICgqb3V0Lm11dGFibGVfbWFwMygpKVsxMTFdID0gIm9uZSBvbmUgb25lIjsKKworICBvdXQuc2V0X2JhcigidG9wIGJhciIpOworCisgIG93Xy5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoIm1hcDEiKQorICAgICAgLT5TdGFydE9iamVjdCgia2V5MSIpCisgICAgICAtPlJlbmRlclN0cmluZygiZm9vIiwgImZvb3ZhbHVlIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+U3RhcnRPYmplY3QoImtleTIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImZvbyIsICJiYXJ2YWx1ZSIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJtYXAyIikKKyAgICAgIC0+U3RhcnRPYmplY3QoIm5lc3RlZHNlbGYiKQorICAgICAgLT5TdGFydE9iamVjdCgibWFwMSIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJuZXN0ZWRfa2V5MSIpCisgICAgICAtPlJlbmRlclN0cmluZygiZm9vIiwgIm5lc3RlZF9mb28iKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImJhciIsICJuZXN0ZWRfYmFyX3N0cmluZyIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJtYXAzIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIxMTEiLCAib25lIG9uZSBvbmUiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImJhciIsICJ0b3AgYmFyIikKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisKKyAgRG9UZXN0KG91dCwgTWFwT3V0OjpkZXNjcmlwdG9yKCkpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VNYXBzVGVzdCwgTWlzc2luZ0tleXNUZXN0KSB7CisgIC8vIE1hcE91dFdpcmVGb3JtYXQgaGFzIHRoZSBzYW1lIHdpcmUgcmVwcmVzZW50YXRpb24gd2l0aCBNYXBPdXQgYnV0IHVzZXMKKyAgLy8gcmVwZWF0ZWQgbWVzc2FnZSBmaWVsZHMgdG8gcmVwcmVzZW50IG1hcCBmaWVsZHMgc28gd2UgY2FuIGludGVudGlvbmFsbHkKKyAgLy8gbGVhdmUgb3V0IHRoZSBrZXkgZmllbGQgb3IgdGhlIHZhbHVlIGZpZWxkIG9mIGEgbWFwIGVudHJ5LgorICBNYXBPdXRXaXJlRm9ybWF0IG91dDsKKyAgLy8gQ3JlYXRlIHNvbWUgbWFwIGVudHJpZXMgd2l0aG91dCBrZXlzLiBUaGV5IHdpbGwgYmUgcmVuZGVyZWQgd2l0aCB0aGUKKyAgLy8gZGVmYXVsdCB2YWx1ZXMgKCIiIGZvciBzdHJpbmdzLCAiMCIgZm9yIGludGVnZXJzLCBldGMuKS4KKyAgLy8geworICAvLyAgICJtYXAxIjogeworICAvLyAgICAgIiI6IHsKKyAgLy8gICAgICAgImZvbyI6ICJmb292YWx1ZSIKKyAgLy8gICAgIH0KKyAgLy8gICB9LAorICAvLyAgICJtYXAyIjogeworICAvLyAgICAgIiI6IHsKKyAgLy8gICAgICAgIm1hcDEiOiB7CisgIC8vICAgICAgICAgIm5lc3RlZF9rZXkxIjogeworICAvLyAgICAgICAgICAgImZvbyI6ICJuZXN0ZWRfZm9vIgorICAvLyAgICAgICAgIH0KKyAgLy8gICAgICAgfQorICAvLyAgICAgfQorICAvLyAgIH0sCisgIC8vICAgIm1hcDMiOiB7CisgIC8vICAgICAiMCI6ICJvbmUgb25lIG9uZSIKKyAgLy8gICB9LAorICAvLyAgICJtYXA0IjogeworICAvLyAgICAgImZhbHNlIjogImJvb2wiCisgIC8vICAgfQorICAvLyB9CisgIG91dC5hZGRfbWFwMSgpLT5tdXRhYmxlX3ZhbHVlKCktPnNldF9mb28oImZvb3ZhbHVlIik7CisgIE1hcE91dCogbmVzdGVkID0gb3V0LmFkZF9tYXAyKCktPm11dGFibGVfdmFsdWUoKTsKKyAgKCpuZXN0ZWQtPm11dGFibGVfbWFwMSgpKVsibmVzdGVkX2tleTEiXS5zZXRfZm9vKCJuZXN0ZWRfZm9vIik7CisgIG91dC5hZGRfbWFwMygpLT5zZXRfdmFsdWUoIm9uZSBvbmUgb25lIik7CisgIG91dC5hZGRfbWFwNCgpLT5zZXRfdmFsdWUoImJvb2wiKTsKKworICBvd18uU3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJtYXAxIikKKyAgICAgIC0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygiZm9vIiwgImZvb3ZhbHVlIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+U3RhcnRPYmplY3QoIm1hcDIiKQorICAgICAgLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoIm1hcDEiKQorICAgICAgLT5TdGFydE9iamVjdCgibmVzdGVkX2tleTEiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImZvbyIsICJuZXN0ZWRfZm9vIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+U3RhcnRPYmplY3QoIm1hcDMiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIjAiLCAib25lIG9uZSBvbmUiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5TdGFydE9iamVjdCgibWFwNCIpCisgICAgICAtPlJlbmRlclN0cmluZygiZmFsc2UiLCAiYm9vbCIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworCisgIERvVGVzdChvdXQsIE1hcE91dDo6ZGVzY3JpcHRvcigpKTsKK30KKworY2xhc3MgUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VBbnlzVGVzdCA6IHB1YmxpYyBQcm90b3N0cmVhbU9iamVjdFNvdXJjZVRlc3QgeworIHByb3RlY3RlZDoKKyAgUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VBbnlzVGVzdCgpIHsKKyAgICBoZWxwZXJfLlJlc2V0VHlwZUluZm8oe0FueU91dDo6ZGVzY3JpcHRvcigpLCBCb29rOjpkZXNjcmlwdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjpBbnk6OmRlc2NyaXB0b3IoKX0pOworICB9Cit9OworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoRGlmZmVyZW50VHlwZUluZm9Tb3VyY2VUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFByb3Rvc3RyZWFtT2JqZWN0U291cmNlQW55c1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlVTRV9UWVBFX1JFU09MVkVSKSk7CisKKy8vIFRlc3RzIEpTT04gYW55IHN1cHBvcnQuCisvLworLy8gVGhpcyBpcyB0aGUgZXhhbXBsZSBleHBlY3RlZCBvdXRwdXQuCisvLyB7CisvLyAgICJhbnkiOiB7CisvLyAgICAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLnRlc3RpbmcuQW55TSIKKy8vICAgICAiZm9vIjogImZvb3ZhbHVlIgorLy8gICB9CisvLyB9CitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VBbnlzVGVzdCwgQmFzaWNBbnkpIHsKKyAgQW55T3V0IG91dDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBbnkqIGFueSA9IG91dC5tdXRhYmxlX2FueSgpOworCisgIEFueU0gbTsKKyAgbS5zZXRfZm9vKCJmb292YWx1ZSIpOworICBhbnktPlBhY2tGcm9tKG0pOworCisgIG93Xy5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImFueSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgInR5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9fdXRpbF9jb252ZXJ0ZXIudGVzdGluZy5BbnlNIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJmb28iLCAiZm9vdmFsdWUiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKworICBEb1Rlc3Qob3V0LCBBbnlPdXQ6OmRlc2NyaXB0b3IoKSk7Cit9CisKK1RFU1RfUChQcm90b3N0cmVhbU9iamVjdFNvdXJjZUFueXNUZXN0LCBMb3dlckNhbWVsRW51bU91dHB1dFNuYWtlQ2FzZSkgeworICBBbnlPdXQgb3V0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkFueSogYW55ID0gb3V0Lm11dGFibGVfYW55KCk7CisKKyAgQm9vayBib29rOworICBib29rLnNldF90eXBlKEJvb2s6OmFydHNfYW5kX3Bob3RvZ3JhcGh5KTsKKyAgYW55LT5QYWNrRnJvbShib29rKTsKKworICBVc2VMb3dlckNhbWVsRm9yRW51bXMoKTsKKworICBvd18uU3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhbnkiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIkB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvX3V0aWxfY29udmVydGVyLnRlc3RpbmcuQm9vayIpCisgICAgICAtPlJlbmRlclN0cmluZygidHlwZSIsICJhcnRzQW5kUGhvdG9ncmFwaHkiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKworICBEb1Rlc3Qob3V0LCBBbnlPdXQ6OmRlc2NyaXB0b3IoKSk7Cit9CisKK1RFU1RfUChQcm90b3N0cmVhbU9iamVjdFNvdXJjZUFueXNUZXN0LCBVc2VJbnRzRm9yRW51bXNUZXN0KSB7CisgIEFueU91dCBvdXQ7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QW55KiBhbnkgPSBvdXQubXV0YWJsZV9hbnkoKTsKKworICBCb29rIGJvb2s7CisgIGJvb2suc2V0X3R5cGUoQm9vazo6QUNUSU9OX0FORF9BRFZFTlRVUkUpOworICBhbnktPlBhY2tGcm9tKGJvb2spOworCisgIFVzZUludHNGb3JFbnVtcygpOworCisgIG93Xy5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImFueSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgInR5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9fdXRpbF9jb252ZXJ0ZXIudGVzdGluZy5Cb29rIikKKyAgICAgIC0+UmVuZGVySW50MzIoInR5cGUiLCAzKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKworICBEb1Rlc3Qob3V0LCBBbnlPdXQ6OmRlc2NyaXB0b3IoKSk7Cit9CisKK1RFU1RfUChQcm90b3N0cmVhbU9iamVjdFNvdXJjZUFueXNUZXN0LCBVc2VQcmVzZXJ2ZVByb3RvRmllbGROYW1lcykgeworICBBbnlPdXQgb3V0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkFueSogYW55ID0gb3V0Lm11dGFibGVfYW55KCk7CisKKyAgQm9vayBib29rOworICBib29rLnNldF9zbmFrZV9maWVsZCgiZm9vIik7CisgIGFueS0+UGFja0Zyb20oYm9vayk7CisKKyAgVXNlUHJlc2VydmVQcm90b0ZpZWxkTmFtZXMoKTsKKworICBvd18uU3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhbnkiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIkB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvX3V0aWxfY29udmVydGVyLnRlc3RpbmcuQm9vayIpCisgICAgICAtPlJlbmRlclN0cmluZygic25ha2VfZmllbGQiLCAiZm9vIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisKKyAgRG9UZXN0KG91dCwgQW55T3V0OjpkZXNjcmlwdG9yKCkpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VBbnlzVGVzdCwgUmVjdXJzaXZlQW55KSB7CisgIEFueU91dCBvdXQ7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QW55KiBhbnkgPSBvdXQubXV0YWJsZV9hbnkoKTsKKyAgYW55LT5zZXRfdHlwZV91cmwoInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkFueSIpOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QW55IG5lc3RlZF9hbnk7CisgIG5lc3RlZF9hbnkuc2V0X3R5cGVfdXJsKAorICAgICAgInR5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9fdXRpbF9jb252ZXJ0ZXIudGVzdGluZy5BbnlNIik7CisKKyAgQW55TSBtOworICBtLnNldF9mb28oImZvb3ZhbHVlIik7CisgIG5lc3RlZF9hbnkuc2V0X3ZhbHVlKG0uU2VyaWFsaXplQXNTdHJpbmcoKSk7CisKKyAgYW55LT5zZXRfdmFsdWUobmVzdGVkX2FueS5TZXJpYWxpemVBc1N0cmluZygpKTsKKworICBvd18uU3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhbnkiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIkB0eXBlIiwgInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkFueSIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJ2YWx1ZSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgInR5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9fdXRpbF9jb252ZXJ0ZXIudGVzdGluZy5BbnlNIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJmb28iLCAiZm9vdmFsdWUiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKworICBEb1Rlc3Qob3V0LCBBbnlPdXQ6OmRlc2NyaXB0b3IoKSk7Cit9CisKK1RFU1RfUChQcm90b3N0cmVhbU9iamVjdFNvdXJjZUFueXNUZXN0LCBEb3VibGVSZWN1cnNpdmVBbnkpIHsKKyAgQW55T3V0IG91dDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBbnkqIGFueSA9IG91dC5tdXRhYmxlX2FueSgpOworICBhbnktPnNldF90eXBlX3VybCgidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuQW55Iik7CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBbnkgbmVzdGVkX2FueTsKKyAgbmVzdGVkX2FueS5zZXRfdHlwZV91cmwoInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkFueSIpOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QW55IHNlY29uZF9uZXN0ZWRfYW55OworICBzZWNvbmRfbmVzdGVkX2FueS5zZXRfdHlwZV91cmwoCisgICAgICAidHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b191dGlsX2NvbnZlcnRlci50ZXN0aW5nLkFueU0iKTsKKworICBBbnlNIG07CisgIG0uc2V0X2ZvbygiZm9vdmFsdWUiKTsKKyAgc2Vjb25kX25lc3RlZF9hbnkuc2V0X3ZhbHVlKG0uU2VyaWFsaXplQXNTdHJpbmcoKSk7CisgIG5lc3RlZF9hbnkuc2V0X3ZhbHVlKHNlY29uZF9uZXN0ZWRfYW55LlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICBhbnktPnNldF92YWx1ZShuZXN0ZWRfYW55LlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworCisgIG93Xy5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImFueSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLCAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuQW55IikKKyAgICAgIC0+U3RhcnRPYmplY3QoInZhbHVlIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJAdHlwZSIsICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5BbnkiKQorICAgICAgLT5TdGFydE9iamVjdCgidmFsdWUiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIkB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvX3V0aWxfY29udmVydGVyLnRlc3RpbmcuQW55TSIpCisgICAgICAtPlJlbmRlclN0cmluZygiZm9vIiwgImZvb3ZhbHVlIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisKKyAgRG9UZXN0KG91dCwgQW55T3V0OjpkZXNjcmlwdG9yKCkpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VBbnlzVGVzdCwgRW1wdHlBbnlPdXRwdXRzRW1wdHlPYmplY3QpIHsKKyAgQW55T3V0IG91dDsKKyAgb3V0Lm11dGFibGVfYW55KCk7CisKKyAgb3dfLlN0YXJ0T2JqZWN0KCIiKS0+U3RhcnRPYmplY3QoImFueSIpLT5FbmRPYmplY3QoKS0+RW5kT2JqZWN0KCk7CisKKyAgRG9UZXN0KG91dCwgQW55T3V0OjpkZXNjcmlwdG9yKCkpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VBbnlzVGVzdCwgRW1wdHlXaXRoVHlwZUFuZE5vVmFsdWVPdXRwdXRzVHlwZSkgeworICBBbnlPdXQgb3V0OworICBvdXQubXV0YWJsZV9hbnkoKS0+c2V0X3R5cGVfdXJsKCJmb28uZ29vZ2xlYXBpcy5jb20vbXkuVHlwZSIpOworCisgIG93Xy5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImFueSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLCAiZm9vLmdvb2dsZWFwaXMuY29tL215LlR5cGUiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKworICBEb1Rlc3Qob3V0LCBBbnlPdXQ6OmRlc2NyaXB0b3IoKSk7Cit9CisKK1RFU1RfUChQcm90b3N0cmVhbU9iamVjdFNvdXJjZUFueXNUZXN0LCBNaXNzaW5nVHlwZVVybEVycm9yKSB7CisgIEFueU91dCBvdXQ7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QW55KiBhbnkgPSBvdXQubXV0YWJsZV9hbnkoKTsKKworICBBbnlNIG07CisgIG0uc2V0X2ZvbygiZm9vdmFsdWUiKTsKKyAgYW55LT5zZXRfdmFsdWUobS5TZXJpYWxpemVBc1N0cmluZygpKTsKKworICAvLyBXZSBzdGFydCB0aGUgIkFueU91dCIgcGFydCBhbmQgdGhlbiBmYWlsIHdoZW4gd2UgaGl0IHRoZSBBbnkgb2JqZWN0LgorICBvd18uU3RhcnRPYmplY3QoIiIpOworCisgIHV0aWw6OlN0YXR1cyBzdGF0dXMgPSBFeGVjdXRlVGVzdChvdXQsIEFueU91dDo6ZGVzY3JpcHRvcigpKTsKKyAgRVhQRUNUX1RSVUUodXRpbDo6SXNJbnRlcm5hbChzdGF0dXMpKTsKK30KKworVEVTVF9QKFByb3Rvc3RyZWFtT2JqZWN0U291cmNlQW55c1Rlc3QsIFVua25vd25UeXBlU2VydmljZUVycm9yKSB7CisgIEFueU91dCBvdXQ7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QW55KiBhbnkgPSBvdXQubXV0YWJsZV9hbnkoKTsKKyAgYW55LT5zZXRfdHlwZV91cmwoImZvby5nb29nbGVhcGlzLmNvbS9teS5vd24uVHlwZSIpOworCisgIEFueU0gbTsKKyAgbS5zZXRfZm9vKCJmb292YWx1ZSIpOworICBhbnktPnNldF92YWx1ZShtLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworCisgIC8vIFdlIHN0YXJ0IHRoZSAiQW55T3V0IiBwYXJ0IGFuZCB0aGVuIGZhaWwgd2hlbiB3ZSBoaXQgdGhlIEFueSBvYmplY3QuCisgIG93Xy5TdGFydE9iamVjdCgiIik7CisKKyAgdXRpbDo6U3RhdHVzIHN0YXR1cyA9IEV4ZWN1dGVUZXN0KG91dCwgQW55T3V0OjpkZXNjcmlwdG9yKCkpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpJc0ludGVybmFsKHN0YXR1cykpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VBbnlzVGVzdCwgVW5rbm93blR5cGVFcnJvcikgeworICBBbnlPdXQgb3V0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkFueSogYW55ID0gb3V0Lm11dGFibGVfYW55KCk7CisgIGFueS0+c2V0X3R5cGVfdXJsKCJ0eXBlLmdvb2dsZWFwaXMuY29tL3Vua25vd24uVHlwZSIpOworCisgIEFueU0gbTsKKyAgbS5zZXRfZm9vKCJmb292YWx1ZSIpOworICBhbnktPnNldF92YWx1ZShtLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworCisgIC8vIFdlIHN0YXJ0IHRoZSAiQW55T3V0IiBwYXJ0IGFuZCB0aGVuIGZhaWwgd2hlbiB3ZSBoaXQgdGhlIEFueSBvYmplY3QuCisgIG93Xy5TdGFydE9iamVjdCgiIik7CisKKyAgdXRpbDo6U3RhdHVzIHN0YXR1cyA9IEV4ZWN1dGVUZXN0KG91dCwgQW55T3V0OjpkZXNjcmlwdG9yKCkpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpJc0ludGVybmFsKHN0YXR1cykpOworfQorCitjbGFzcyBQcm90b3N0cmVhbU9iamVjdFNvdXJjZVN0cnVjdFRlc3QgOiBwdWJsaWMgUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFByb3Rvc3RyZWFtT2JqZWN0U291cmNlU3RydWN0VGVzdCgpIHsKKyAgICBoZWxwZXJfLlJlc2V0VHlwZUluZm8oU3RydWN0VHlwZTo6ZGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjpTdHJ1Y3Q6OmRlc2NyaXB0b3IoKSk7CisgIH0KK307CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChEaWZmZXJlbnRUeXBlSW5mb1NvdXJjZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VTdHJ1Y3RUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpVU0VfVFlQRV9SRVNPTFZFUikpOworCisvLyBUZXN0cyBzdHJ1Y3QKKy8vCisvLyAgIm9iamVjdCI6IHsKKy8vICAgICJrMSI6IDEyMywKKy8vICAgICJrMiI6IHRydWUKKy8vICB9CitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VTdHJ1Y3RUZXN0LCBTdHJ1Y3RSZW5kZXJTdWNjZXNzKSB7CisgIFN0cnVjdFR5cGUgb3V0OworICBnb29nbGU6OnByb3RvYnVmOjpTdHJ1Y3QqIHMgPSBvdXQubXV0YWJsZV9vYmplY3QoKTsKKyAgcy0+bXV0YWJsZV9maWVsZHMoKS0+b3BlcmF0b3JbXSgiazEiKS5zZXRfbnVtYmVyX3ZhbHVlKDEyMyk7CisgIHMtPm11dGFibGVfZmllbGRzKCktPm9wZXJhdG9yW10oImsyIikuc2V0X2Jvb2xfdmFsdWUodHJ1ZSk7CisKKyAgb3dfLlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgib2JqZWN0IikKKyAgICAgIC0+UmVuZGVyRG91YmxlKCJrMSIsIDEyMykKKyAgICAgIC0+UmVuZGVyQm9vbCgiazIiLCB0cnVlKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKworICBEb1Rlc3Qob3V0LCBTdHJ1Y3RUeXBlOjpkZXNjcmlwdG9yKCkpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VTdHJ1Y3RUZXN0LCBNaXNzaW5nVmFsdWVTa2lwc0ZpZWxkKSB7CisgIFN0cnVjdFR5cGUgb3V0OworICBnb29nbGU6OnByb3RvYnVmOjpTdHJ1Y3QqIHMgPSBvdXQubXV0YWJsZV9vYmplY3QoKTsKKyAgcy0+bXV0YWJsZV9maWVsZHMoKS0+b3BlcmF0b3JbXSgiazEiKTsKKworICBvd18uU3RhcnRPYmplY3QoIiIpLT5TdGFydE9iamVjdCgib2JqZWN0IiktPkVuZE9iamVjdCgpLT5FbmRPYmplY3QoKTsKKworICBEb1Rlc3Qob3V0LCBTdHJ1Y3RUeXBlOjpkZXNjcmlwdG9yKCkpOworfQorCitjbGFzcyBQcm90b3N0cmVhbU9iamVjdFNvdXJjZUZpZWxkTWFza1Rlc3QKKyAgICA6IHB1YmxpYyBQcm90b3N0cmVhbU9iamVjdFNvdXJjZVRlc3QgeworIHByb3RlY3RlZDoKKyAgUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VGaWVsZE1hc2tUZXN0KCkgeworICAgIGhlbHBlcl8uUmVzZXRUeXBlSW5mbyhGaWVsZE1hc2tUZXN0OjpkZXNjcmlwdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkTWFzazo6ZGVzY3JpcHRvcigpKTsKKyAgfQorfTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKERpZmZlcmVudFR5cGVJbmZvU291cmNlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b3N0cmVhbU9iamVjdFNvdXJjZUZpZWxkTWFza1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlVTRV9UWVBFX1JFU09MVkVSKSk7CisKK1RFU1RfUChQcm90b3N0cmVhbU9iamVjdFNvdXJjZUZpZWxkTWFza1Rlc3QsIEZpZWxkTWFza1JlbmRlclN1Y2Nlc3MpIHsKKyAgRmllbGRNYXNrVGVzdCBvdXQ7CisgIG91dC5zZXRfaWQoIjEiKTsKKyAgb3V0Lm11dGFibGVfc2luZ2xlX21hc2soKS0+YWRkX3BhdGhzKCJwYXRoMSIpOworICBvdXQubXV0YWJsZV9zaW5nbGVfbWFzaygpLT5hZGRfcGF0aHMoInNuYWtlX2Nhc2VfcGF0aDIiKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE1hc2sqIG1hc2sgPSBvdXQuYWRkX3JlcGVhdGVkX21hc2soKTsKKyAgbWFzay0+YWRkX3BhdGhzKCJwYXRoMyIpOworICBtYXNrID0gb3V0LmFkZF9yZXBlYXRlZF9tYXNrKCk7CisgIG1hc2stPmFkZF9wYXRocygic25ha2VfY2FzZV9wYXRoNCIpOworICBtYXNrLT5hZGRfcGF0aHMoInBhdGg1Iik7CisgIE5lc3RlZEZpZWxkTWFzayogbmVzdGVkID0gb3V0LmFkZF9uZXN0ZWRfbWFzaygpOworICBuZXN0ZWQtPnNldF9kYXRhKCJkYXRhIik7CisgIG5lc3RlZC0+bXV0YWJsZV9zaW5nbGVfbWFzaygpLT5hZGRfcGF0aHMoIm5lc3RlZC5wYXRoMSIpOworICBuZXN0ZWQtPm11dGFibGVfc2luZ2xlX21hc2soKS0+YWRkX3BhdGhzKCJuZXN0ZWRfZmllbGQuc25ha2VfY2FzZV9wYXRoMiIpOworICBtYXNrID0gbmVzdGVkLT5hZGRfcmVwZWF0ZWRfbWFzaygpOworICBtYXNrLT5hZGRfcGF0aHMoIm5lc3RlZF9maWVsZC5wYXRoMyIpOworICBtYXNrLT5hZGRfcGF0aHMoIm5lc3RlZC5zbmFrZV9jYXNlX3BhdGg0Iik7CisgIG1hc2sgPSBuZXN0ZWQtPmFkZF9yZXBlYXRlZF9tYXNrKCk7CisgIG1hc2stPmFkZF9wYXRocygibmVzdGVkLnBhdGg1Iik7CisgIG1hc2sgPSBuZXN0ZWQtPmFkZF9yZXBlYXRlZF9tYXNrKCk7CisgIG1hc2stPmFkZF9wYXRocygKKyAgICAgICJzbmFrZV9jYXNlLm1hcF9maWVsZFtcIm1hcF9rZXlfc2hvdWxkX2JlX2lnbm9yZWRcIl0ubmVzdGVkX3NuYWtlX2Nhc2UuIgorICAgICAgIm1hcF9maWVsZFtcIm1hcF9rZXlfc2hvXFxcInVsZF9iZV9pZ25vcmVkXCJdIik7CisKKyAgb3dfLlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImlkIiwgIjEiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInNpbmdsZU1hc2siLCAicGF0aDEsc25ha2VDYXNlUGF0aDIiKQorICAgICAgLT5TdGFydExpc3QoInJlcGVhdGVkTWFzayIpCisgICAgICAtPlJlbmRlclN0cmluZygiIiwgInBhdGgzIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAic25ha2VDYXNlUGF0aDQscGF0aDUiKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+U3RhcnRMaXN0KCJuZXN0ZWRNYXNrIikKKyAgICAgIC0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygiZGF0YSIsICJkYXRhIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJzaW5nbGVNYXNrIiwgIm5lc3RlZC5wYXRoMSxuZXN0ZWRGaWVsZC5zbmFrZUNhc2VQYXRoMiIpCisgICAgICAtPlN0YXJ0TGlzdCgicmVwZWF0ZWRNYXNrIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAibmVzdGVkRmllbGQucGF0aDMsbmVzdGVkLnNuYWtlQ2FzZVBhdGg0IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAibmVzdGVkLnBhdGg1IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLAorICAgICAgICAgICAgICAgICAgICAgInNuYWtlQ2FzZS5tYXBGaWVsZFtcIm1hcF9rZXlfc2hvdWxkX2JlX2lnbm9yZWRcIl0uIgorICAgICAgICAgICAgICAgICAgICAgIm5lc3RlZFNuYWtlQ2FzZS5tYXBGaWVsZFtcIm1hcF9rZXlfc2hvXFxcInVsZF9iZV8iCisgICAgICAgICAgICAgICAgICAgICAiaWdub3JlZFwiXSIpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisKKyAgRG9UZXN0KG91dCwgRmllbGRNYXNrVGVzdDo6ZGVzY3JpcHRvcigpKTsKK30KKworY2xhc3MgUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUaW1lc3RhbXBUZXN0CisgICAgOiBwdWJsaWMgUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFByb3Rvc3RyZWFtT2JqZWN0U291cmNlVGltZXN0YW1wVGVzdCgpIHsKKyAgICBoZWxwZXJfLlJlc2V0VHlwZUluZm8oVGltZXN0YW1wRHVyYXRpb246OmRlc2NyaXB0b3IoKSk7CisgIH0KK307CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChEaWZmZXJlbnRUeXBlSW5mb1NvdXJjZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUaW1lc3RhbXBUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpVU0VfVFlQRV9SRVNPTFZFUikpOworCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUaW1lc3RhbXBUZXN0LCBJbnZhbGlkVGltZXN0YW1wQmVsb3dNaW5UZXN0KSB7CisgIFRpbWVzdGFtcER1cmF0aW9uIG91dDsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6VGltZXN0YW1wKiB0cyA9IG91dC5tdXRhYmxlX3RzKCk7CisgIC8vIE1pbiBhbGxvd2VkIHNlY29uZHMgLSAxCisgIHRzLT5zZXRfc2Vjb25kcyhrVGltZXN0YW1wTWluU2Vjb25kcyAtIDEpOworICBvd18uU3RhcnRPYmplY3QoIiIpOworCisgIHV0aWw6OlN0YXR1cyBzdGF0dXMgPSBFeGVjdXRlVGVzdChvdXQsIFRpbWVzdGFtcER1cmF0aW9uOjpkZXNjcmlwdG9yKCkpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpJc0ludGVybmFsKHN0YXR1cykpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUaW1lc3RhbXBUZXN0LCBJbnZhbGlkVGltZXN0YW1wQWJvdmVNYXhUZXN0KSB7CisgIFRpbWVzdGFtcER1cmF0aW9uIG91dDsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6VGltZXN0YW1wKiB0cyA9IG91dC5tdXRhYmxlX3RzKCk7CisgIC8vIE1heCBhbGxvd2VkIHNlY29uZHMgKyAxCisgIHRzLT5zZXRfc2Vjb25kcyhrVGltZXN0YW1wTWF4U2Vjb25kcyArIDEpOworICBvd18uU3RhcnRPYmplY3QoIiIpOworCisgIHV0aWw6OlN0YXR1cyBzdGF0dXMgPSBFeGVjdXRlVGVzdChvdXQsIFRpbWVzdGFtcER1cmF0aW9uOjpkZXNjcmlwdG9yKCkpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpJc0ludGVybmFsKHN0YXR1cykpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUaW1lc3RhbXBUZXN0LCBJbnZhbGlkRHVyYXRpb25CZWxvd01pblRlc3QpIHsKKyAgVGltZXN0YW1wRHVyYXRpb24gb3V0OworICBnb29nbGU6OnByb3RvYnVmOjpEdXJhdGlvbiogZHVyID0gb3V0Lm11dGFibGVfZHVyKCk7CisgIC8vIE1pbiBhbGxvd2VkIHNlY29uZHMgLSAxCisgIGR1ci0+c2V0X3NlY29uZHMoa0R1cmF0aW9uTWluU2Vjb25kcyAtIDEpOworICBvd18uU3RhcnRPYmplY3QoIiIpOworCisgIHV0aWw6OlN0YXR1cyBzdGF0dXMgPSBFeGVjdXRlVGVzdChvdXQsIFRpbWVzdGFtcER1cmF0aW9uOjpkZXNjcmlwdG9yKCkpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpJc0ludGVybmFsKHN0YXR1cykpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUaW1lc3RhbXBUZXN0LCBJbnZhbGlkRHVyYXRpb25BYm92ZU1heFRlc3QpIHsKKyAgVGltZXN0YW1wRHVyYXRpb24gb3V0OworICBnb29nbGU6OnByb3RvYnVmOjpEdXJhdGlvbiogZHVyID0gb3V0Lm11dGFibGVfZHVyKCk7CisgIC8vIE1pbiBhbGxvd2VkIHNlY29uZHMgKyAxCisgIGR1ci0+c2V0X3NlY29uZHMoa0R1cmF0aW9uTWF4U2Vjb25kcyArIDEpOworICBvd18uU3RhcnRPYmplY3QoIiIpOworCisgIHV0aWw6OlN0YXR1cyBzdGF0dXMgPSBFeGVjdXRlVGVzdChvdXQsIFRpbWVzdGFtcER1cmF0aW9uOjpkZXNjcmlwdG9yKCkpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpJc0ludGVybmFsKHN0YXR1cykpOworfQorCitURVNUX1AoUHJvdG9zdHJlYW1PYmplY3RTb3VyY2VUaW1lc3RhbXBUZXN0LCBUaW1lc3RhbXBEdXJhdGlvbkRlZmF1bHRWYWx1ZSkgeworICBUaW1lc3RhbXBEdXJhdGlvbiBvdXQ7CisgIG91dC5tdXRhYmxlX3RzKCktPnNldF9zZWNvbmRzKDApOworICBvdXQubXV0YWJsZV9kdXIoKS0+c2V0X3NlY29uZHMoMCk7CisKKyAgb3dfLlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInRzIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJkdXIiLCAiMHMiKQorICAgICAgLT5FbmRPYmplY3QoKTsKKworICBEb1Rlc3Qob3V0LCBUaW1lc3RhbXBEdXJhdGlvbjo6ZGVzY3JpcHRvcigpKTsKK30KKworCisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYjIxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyLmNjCkBAIC0wLDAgKzEsMTQwMSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuaD4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9maWVsZF9tYXNrX3V0aWxpdHkuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3RfbG9jYXRpb25fdHJhY2tlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3V0aWxpdHkuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KKworCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKK3VzaW5nIHV0aWw6OlN0YXR1czsKK3VzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7Cit1c2luZyBzdGQ6OnBsYWNlaG9sZGVyczo6XzE7CisKKworUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlByb3RvU3RyZWFtT2JqZWN0V3JpdGVyKAorICAgIFR5cGVSZXNvbHZlciogdHlwZV9yZXNvbHZlciwgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwKKyAgICBzdHJpbmdzOjpCeXRlU2luayogb3V0cHV0LCBFcnJvckxpc3RlbmVyKiBsaXN0ZW5lciwKKyAgICBjb25zdCBQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6T3B0aW9ucyYgb3B0aW9ucykKKyAgICA6IFByb3RvV3JpdGVyKHR5cGVfcmVzb2x2ZXIsIHR5cGUsIG91dHB1dCwgbGlzdGVuZXIpLAorICAgICAgbWFzdGVyX3R5cGVfKHR5cGUpLAorICAgICAgY3VycmVudF8obnVsbHB0ciksCisgICAgICBvcHRpb25zXyhvcHRpb25zKSB7CisgIHNldF9pZ25vcmVfdW5rbm93bl9maWVsZHMob3B0aW9uc18uaWdub3JlX3Vua25vd25fZmllbGRzKTsKKyAgc2V0X2lnbm9yZV91bmtub3duX2VudW1fdmFsdWVzKG9wdGlvbnNfLmlnbm9yZV91bmtub3duX2VudW1fdmFsdWVzKTsKKyAgc2V0X3VzZV9sb3dlcl9jYW1lbF9mb3JfZW51bXMob3B0aW9uc18udXNlX2xvd2VyX2NhbWVsX2Zvcl9lbnVtcyk7CisgIHNldF9jYXNlX2luc2Vuc2l0aXZlX2VudW1fcGFyc2luZyhvcHRpb25zXy5jYXNlX2luc2Vuc2l0aXZlX2VudW1fcGFyc2luZyk7CisgIHNldF91c2VfanNvbl9uYW1lX2luX21pc3NpbmdfZmllbGRzKG9wdGlvbnMudXNlX2pzb25fbmFtZV9pbl9taXNzaW5nX2ZpZWxkcyk7Cit9CisKK1Byb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpQcm90b1N0cmVhbU9iamVjdFdyaXRlcigKKyAgICBjb25zdCBUeXBlSW5mbyogdHlwZWluZm8sIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgc3RyaW5nczo6Qnl0ZVNpbmsqIG91dHB1dCwgRXJyb3JMaXN0ZW5lciogbGlzdGVuZXIsCisgICAgY29uc3QgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6Ok9wdGlvbnMmIG9wdGlvbnMpCisgICAgOiBQcm90b1dyaXRlcih0eXBlaW5mbywgdHlwZSwgb3V0cHV0LCBsaXN0ZW5lciksCisgICAgICBtYXN0ZXJfdHlwZV8odHlwZSksCisgICAgICBjdXJyZW50XyhudWxscHRyKSwKKyAgICAgIG9wdGlvbnNfKG9wdGlvbnMpIHsKKyAgc2V0X2lnbm9yZV91bmtub3duX2ZpZWxkcyhvcHRpb25zXy5pZ25vcmVfdW5rbm93bl9maWVsZHMpOworICBzZXRfdXNlX2xvd2VyX2NhbWVsX2Zvcl9lbnVtcyhvcHRpb25zLnVzZV9sb3dlcl9jYW1lbF9mb3JfZW51bXMpOworICBzZXRfY2FzZV9pbnNlbnNpdGl2ZV9lbnVtX3BhcnNpbmcob3B0aW9uc18uY2FzZV9pbnNlbnNpdGl2ZV9lbnVtX3BhcnNpbmcpOworICBzZXRfdXNlX2pzb25fbmFtZV9pbl9taXNzaW5nX2ZpZWxkcyhvcHRpb25zLnVzZV9qc29uX25hbWVfaW5fbWlzc2luZ19maWVsZHMpOworfQorCitQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6UHJvdG9TdHJlYW1PYmplY3RXcml0ZXIoCisgICAgY29uc3QgVHlwZUluZm8qIHR5cGVpbmZvLCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlLAorICAgIHN0cmluZ3M6OkJ5dGVTaW5rKiBvdXRwdXQsIEVycm9yTGlzdGVuZXIqIGxpc3RlbmVyKQorICAgIDogUHJvdG9Xcml0ZXIodHlwZWluZm8sIHR5cGUsIG91dHB1dCwgbGlzdGVuZXIpLAorICAgICAgbWFzdGVyX3R5cGVfKHR5cGUpLAorICAgICAgY3VycmVudF8obnVsbHB0ciksCisgICAgICBvcHRpb25zXyhQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6T3B0aW9uczo6RGVmYXVsdHMoKSkge30KKworUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6On5Qcm90b1N0cmVhbU9iamVjdFdyaXRlcigpIHsKKyAgaWYgKGN1cnJlbnRfID09IG51bGxwdHIpIHJldHVybjsKKyAgLy8gQ2xlYW51cCBleHBsaWNpdGx5IGluIG9yZGVyIHRvIGF2b2lkIGRlc3RydWN0b3Igc3RhY2sgb3ZlcmZsb3cgd2hlbiBpbnB1dAorICAvLyBpcyBkZWVwbHkgbmVzdGVkLgorICAvLyBDYXN0IHRvIEJhc2VFbGVtZW50IHRvIGF2b2lkIGRvaW5nIGFkZGl0aW9uYWwgY2hlY2tzIChsaWtlIG1pc3NpbmcgZmllbGRzKQorICAvLyBkdXJpbmcgcG9wKCkuCisgIHN0ZDo6dW5pcXVlX3B0cjxCYXNlRWxlbWVudD4gZWxlbWVudCgKKyAgICAgIHN0YXRpY19jYXN0PEJhc2VFbGVtZW50Kj4oY3VycmVudF8uZ2V0KCkpLT5wb3A8QmFzZUVsZW1lbnQ+KCkpOworICB3aGlsZSAoZWxlbWVudCAhPSBudWxscHRyKSB7CisgICAgZWxlbWVudC5yZXNldChlbGVtZW50LT5wb3A8QmFzZUVsZW1lbnQ+KCkpOworICB9Cit9CisKK25hbWVzcGFjZSB7CisvLyBVdGlsaXR5IG1ldGhvZCB0byBzcGxpdCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBUaW1lc3RhbXAgb3IgRHVyYXRpb24gYW5kCisvLyByZXR1cm4gdGhlIHBhcnRzLgordm9pZCBTcGxpdFNlY29uZHNBbmROYW5vcyhTdHJpbmdQaWVjZSBpbnB1dCwgU3RyaW5nUGllY2UqIHNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKiBuYW5vcykgeworICBzaXplX3QgaWR4ID0gaW5wdXQucmZpbmQoJy4nKTsKKyAgaWYgKGlkeCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICpzZWNvbmRzID0gaW5wdXQuc3Vic3RyKDAsIGlkeCk7CisgICAgKm5hbm9zID0gaW5wdXQuc3Vic3RyKGlkeCArIDEpOworICB9IGVsc2UgeworICAgICpzZWNvbmRzID0gaW5wdXQ7CisgICAgKm5hbm9zID0gU3RyaW5nUGllY2UoKTsKKyAgfQorfQorCitTdGF0dXMgR2V0TmFub3NGcm9tU3RyaW5nUGllY2UoU3RyaW5nUGllY2Ugc19uYW5vcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJzZV9mYWlsdXJlX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhjZWVkZWRfbGltaXRfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBuYW5vcykgeworICAqbmFub3MgPSAwOworCisgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgbGVhZGluZyAwcyBhbmQgY29uc3VtZSB0aGVtLgorICBpbnQgbnVtX2xlYWRpbmdfemVyb3MgPSAwOworICB3aGlsZSAoc19uYW5vcy5Db25zdW1lKCIwIikpIHsKKyAgICBudW1fbGVhZGluZ196ZXJvcysrOworICB9CisgIGludDMyX3QgaV9uYW5vcyA9IDA7CisgIC8vICdzX25hbm9zJyBjb250YWlucyBmcmFjdGlvbmFsIHNlY29uZHMgLS0gaS5lLiAnbmFub3MnIGlzIGVxdWFsIHRvCisgIC8vICIwLiIgKyBzX25hbm9zLlRvU3RyaW5nKCkgc2Vjb25kcy4gQW4gaW50MzJfdCBpcyB1c2VkIGZvciB0aGUKKyAgLy8gY29udmVyc2lvbiB0byAnbmFub3MnLCByYXRoZXIgdGhhbiBhIGRvdWJsZSwgc28gdGhhdCB0aGVyZSBpcyBubworICAvLyBsb3NzIG9mIHByZWNpc2lvbi4KKyAgaWYgKCFzX25hbm9zLmVtcHR5KCkgJiYgIXNhZmVfc3RydG8zMihzX25hbm9zLCAmaV9uYW5vcykpIHsKKyAgICByZXR1cm4gdXRpbDo6SW52YWxpZEFyZ3VtZW50RXJyb3IocGFyc2VfZmFpbHVyZV9tZXNzYWdlKTsKKyAgfQorICBpZiAoaV9uYW5vcyA+IGtOYW5vc1BlclNlY29uZCB8fCBpX25hbm9zIDwgMCkgeworICAgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcihleGNlZWRlZF9saW1pdF9tZXNzYWdlKTsKKyAgfQorICAvLyBzX25hbm9zIHNob3VsZCBvbmx5IGhhdmUgZGlnaXRzLiBObyB3aGl0ZXNwYWNlLgorICBpZiAoc19uYW5vcy5maW5kX2ZpcnN0X25vdF9vZigiMDEyMzQ1Njc4OSIpICE9IFN0cmluZ1BpZWNlOjpucG9zKSB7CisgICAgcmV0dXJuIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKHBhcnNlX2ZhaWx1cmVfbWVzc2FnZSk7CisgIH0KKworICBpZiAoaV9uYW5vcyA+IDApIHsKKyAgICAvLyAnc2NhbGUnIGlzIHRoZSBudW1iZXIgb2YgZGlnaXRzIHRvIHRoZSByaWdodCBvZiB0aGUgZGVjaW1hbAorICAgIC8vIHBvaW50IGluICIwLiIgKyBzX25hbm9zLlRvU3RyaW5nKCkKKyAgICBpbnQzMl90IHNjYWxlID0gbnVtX2xlYWRpbmdfemVyb3MgKyBzX25hbm9zLnNpemUoKTsKKyAgICAvLyAnY29udmVyc2lvbicgY29udmVydHMgaV9uYW5vcyBpbnRvIG5hbm9zZWNvbmRzLgorICAgIC8vIGNvbnZlcnNpb24gPSBrTmFub3NQZXJTZWNvbmQgLyBzdGF0aWNfY2FzdDxpbnQzMl90PihzdGQ6OnBvdygxMCwgc2NhbGUpKQorICAgIC8vIEZvciBlZmZpY2llbmN5LCB3ZSBwcmVjb21wdXRlIHRoZSBjb252ZXJzaW9uIGZhY3Rvci4KKyAgICBpbnQzMl90IGNvbnZlcnNpb24gPSAwOworICAgIHN3aXRjaCAoc2NhbGUpIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgY29udmVyc2lvbiA9IDEwMDAwMDAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGNvbnZlcnNpb24gPSAxMDAwMDAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6CisgICAgICAgIGNvbnZlcnNpb24gPSAxMDAwMDAwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgY29udmVyc2lvbiA9IDEwMDAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDU6CisgICAgICAgIGNvbnZlcnNpb24gPSAxMDAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDY6CisgICAgICAgIGNvbnZlcnNpb24gPSAxMDAwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgY29udmVyc2lvbiA9IDEwMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDg6CisgICAgICAgIGNvbnZlcnNpb24gPSAxMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDk6CisgICAgICAgIGNvbnZlcnNpb24gPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcihleGNlZWRlZF9saW1pdF9tZXNzYWdlKTsKKyAgICB9CisgICAgKm5hbm9zID0gaV9uYW5vcyAqIGNvbnZlcnNpb247CisgIH0KKworICByZXR1cm4gU3RhdHVzKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6QW55V3JpdGVyOjpBbnlXcml0ZXIoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXIqIHBhcmVudCkKKyAgICA6IHBhcmVudF8ocGFyZW50KSwKKyAgICAgIG93XygpLAorICAgICAgaW52YWxpZF8oZmFsc2UpLAorICAgICAgZGF0YV8oKSwKKyAgICAgIG91dHB1dF8oJmRhdGFfKSwKKyAgICAgIGRlcHRoXygwKSwKKyAgICAgIGlzX3dlbGxfa25vd25fdHlwZV8oZmFsc2UpLAorICAgICAgd2VsbF9rbm93bl90eXBlX3JlbmRlcl8obnVsbHB0cikge30KKworUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OkFueVdyaXRlcjo6fkFueVdyaXRlcigpIHt9CisKK3ZvaWQgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OkFueVdyaXRlcjo6U3RhcnRPYmplY3QoU3RyaW5nUGllY2UgbmFtZSkgeworICArK2RlcHRoXzsKKyAgLy8gSWYgYW4gb2JqZWN0IHdyaXRlciBpcyBhYnNlbnQsIHRoYXQgbWVhbnMgd2UgaGF2ZSBub3QgY2FsbGVkIFN0YXJ0QW55KCkKKyAgLy8gYmVmb3JlIHJlYWNoaW5nIGhlcmUsIHdoaWNoIGhhcHBlbnMgd2hlbiB3ZSBoYXZlIGRhdGEgYmVmb3JlIHRoZSAiQHR5cGUiCisgIC8vIGZpZWxkLgorICBpZiAob3dfID09IG51bGxwdHIpIHsKKyAgICAvLyBTYXZlIGRhdGEgYmVmb3JlIHRoZSAiQHR5cGUiIGZpZWxkIGZvciBsYXRlciByZXBsYXkuCisgICAgdW5pbnRlcnByZXRlZF9ldmVudHNfLnB1c2hfYmFjayhFdmVudChFdmVudDo6U1RBUlRfT0JKRUNULCBuYW1lKSk7CisgIH0gZWxzZSBpZiAoaXNfd2VsbF9rbm93bl90eXBlXyAmJiBkZXB0aF8gPT0gMSkgeworICAgIC8vIEZvciB3ZWxsLWtub3duIHR5cGVzLCB0aGUgb25seSBvdGhlciBmaWVsZCBiZXNpZGVzICJAdHlwZSIgc2hvdWxkIGJlIGEKKyAgICAvLyAidmFsdWUiIGZpZWxkLgorICAgIGlmIChuYW1lICE9ICJ2YWx1ZSIgJiYgIWludmFsaWRfKSB7CisgICAgICBwYXJlbnRfLT5JbnZhbGlkVmFsdWUoIkFueSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdCBhIFwidmFsdWVcIiBmaWVsZCBmb3Igd2VsbC1rbm93biB0eXBlcy4iKTsKKyAgICAgIGludmFsaWRfID0gdHJ1ZTsKKyAgICB9CisgICAgb3dfLT5TdGFydE9iamVjdCgiIik7CisgIH0gZWxzZSB7CisgICAgLy8gRm9yd2FyZCB0aGUgY2FsbCB0byB0aGUgY2hpbGQgd3JpdGVyIGlmOgorICAgIC8vICAgMS4gdGhlIHR5cGUgaXMgbm90IGEgd2VsbC1rbm93biB0eXBlLgorICAgIC8vICAgMi4gb3IsIHdlIGFyZSBpbiBhIG5lc3RlZCBBbnksIFN0cnVjdCwgb3IgVmFsdWUgb2JqZWN0LgorICAgIG93Xy0+U3RhcnRPYmplY3QobmFtZSk7CisgIH0KK30KKworYm9vbCBQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6QW55V3JpdGVyOjpFbmRPYmplY3QoKSB7CisgIC0tZGVwdGhfOworICBpZiAob3dfID09IG51bGxwdHIpIHsKKyAgICBpZiAoZGVwdGhfID49IDApIHsKKyAgICAgIC8vIFNhdmUgZGF0YSBiZWZvcmUgdGhlICJAdHlwZSIgZmllbGQgZm9yIGxhdGVyIHJlcGxheS4KKyAgICAgIHVuaW50ZXJwcmV0ZWRfZXZlbnRzXy5wdXNoX2JhY2soRXZlbnQoRXZlbnQ6OkVORF9PQkpFQ1QpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZGVwdGhfID49IDAgfHwgIWlzX3dlbGxfa25vd25fdHlwZV8pIHsKKyAgICAvLyBBcyBsb25nIGFzIGRlcHRoXyA+PSAwLCB3ZSBrbm93IHdlIGhhdmVuJ3QgcmVhY2hlZCB0aGUgZW5kIG9mIEFueS4KKyAgICAvLyBQcm9wYWdhdGUgdGhlc2UgRW5kT2JqZWN0KCkgY2FsbHMgdG8gdGhlIGNvbnRhaW5lZCBvd18uIEZvciByZWd1bGFyCisgICAgLy8gbWVzc2FnZSB0eXBlcywgd2UgcHJvcGFnYXRlIHRoZSBlbmQgb2YgQW55IGFzIHdlbGwuCisgICAgb3dfLT5FbmRPYmplY3QoKTsKKyAgfQorICAvLyBBIG5lZ2F0aXZlIGRlcHRoXyBpbXBsaWVzIHRoYXQgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgQW55CisgIC8vIG9iamVjdC4gTm93IHdlIHdyaXRlIG91dCBpdHMgY29udGVudHMuCisgIGlmIChkZXB0aF8gPCAwKSB7CisgICAgV3JpdGVBbnkoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OkFueVdyaXRlcjo6U3RhcnRMaXN0KFN0cmluZ1BpZWNlIG5hbWUpIHsKKyAgKytkZXB0aF87CisgIGlmIChvd18gPT0gbnVsbHB0cikgeworICAgIC8vIFNhdmUgZGF0YSBiZWZvcmUgdGhlICJAdHlwZSIgZmllbGQgZm9yIGxhdGVyIHJlcGxheS4KKyAgICB1bmludGVycHJldGVkX2V2ZW50c18ucHVzaF9iYWNrKEV2ZW50KEV2ZW50OjpTVEFSVF9MSVNULCBuYW1lKSk7CisgIH0gZWxzZSBpZiAoaXNfd2VsbF9rbm93bl90eXBlXyAmJiBkZXB0aF8gPT0gMSkgeworICAgIGlmIChuYW1lICE9ICJ2YWx1ZSIgJiYgIWludmFsaWRfKSB7CisgICAgICBwYXJlbnRfLT5JbnZhbGlkVmFsdWUoIkFueSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdCBhIFwidmFsdWVcIiBmaWVsZCBmb3Igd2VsbC1rbm93biB0eXBlcy4iKTsKKyAgICAgIGludmFsaWRfID0gdHJ1ZTsKKyAgICB9CisgICAgb3dfLT5TdGFydExpc3QoIiIpOworICB9IGVsc2UgeworICAgIG93Xy0+U3RhcnRMaXN0KG5hbWUpOworICB9Cit9CisKK3ZvaWQgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OkFueVdyaXRlcjo6RW5kTGlzdCgpIHsKKyAgLS1kZXB0aF87CisgIGlmIChkZXB0aF8gPCAwKSB7CisgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJNaXNtYXRjaGVkIEVuZExpc3QgZm91bmQsIHNob3VsZCBub3QgYmUgcG9zc2libGUiOworICAgIGRlcHRoXyA9IDA7CisgIH0KKyAgaWYgKG93XyA9PSBudWxscHRyKSB7CisgICAgLy8gU2F2ZSBkYXRhIGJlZm9yZSB0aGUgIkB0eXBlIiBmaWVsZCBmb3IgbGF0ZXIgcmVwbGF5LgorICAgIHVuaW50ZXJwcmV0ZWRfZXZlbnRzXy5wdXNoX2JhY2soRXZlbnQoRXZlbnQ6OkVORF9MSVNUKSk7CisgIH0gZWxzZSB7CisgICAgb3dfLT5FbmRMaXN0KCk7CisgIH0KK30KKwordm9pZCBQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6QW55V3JpdGVyOjpSZW5kZXJEYXRhUGllY2UoCisgICAgU3RyaW5nUGllY2UgbmFtZSwgY29uc3QgRGF0YVBpZWNlJiB2YWx1ZSkgeworICAvLyBTdGFydCBhbiBBbnkgb25seSBhdCBkZXB0aF8gMC4gT3RoZXIgUmVuZGVyRGF0YVBpZWNlIGNhbGxzIHdpdGggIkB0eXBlIgorICAvLyBzaG91bGQgZ28gdG8gdGhlIGNvbnRhaW5lZCBvd18gYXMgdGhleSBpbmRpY2F0ZSBuZXN0ZWQgQW55cy4KKyAgaWYgKGRlcHRoXyA9PSAwICYmIG93XyA9PSBudWxscHRyICYmIG5hbWUgPT0gIkB0eXBlIikgeworICAgIFN0YXJ0QW55KHZhbHVlKTsKKyAgfSBlbHNlIGlmIChvd18gPT0gbnVsbHB0cikgeworICAgIC8vIFNhdmUgZGF0YSBiZWZvcmUgdGhlICJAdHlwZSIgZmllbGQuCisgICAgdW5pbnRlcnByZXRlZF9ldmVudHNfLnB1c2hfYmFjayhFdmVudChuYW1lLCB2YWx1ZSkpOworICB9IGVsc2UgaWYgKGRlcHRoXyA9PSAwICYmIGlzX3dlbGxfa25vd25fdHlwZV8pIHsKKyAgICBpZiAobmFtZSAhPSAidmFsdWUiICYmICFpbnZhbGlkXykgeworICAgICAgcGFyZW50Xy0+SW52YWxpZFZhbHVlKCJBbnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3QgYSBcInZhbHVlXCIgZmllbGQgZm9yIHdlbGwta25vd24gdHlwZXMuIik7CisgICAgICBpbnZhbGlkXyA9IHRydWU7CisgICAgfQorICAgIGlmICh3ZWxsX2tub3duX3R5cGVfcmVuZGVyXyA9PSBudWxscHRyKSB7CisgICAgICAvLyBPbmx5IEFueSBhbmQgU3RydWN0IGRvbid0IGhhdmUgYSBzcGVjaWFsIHR5cGUgcmVuZGVyIGJ1dCBib3RoIG9mCisgICAgICAvLyB0aGVtIGV4cGVjdCBhIEpTT04gb2JqZWN0IChpLmUuLCBhIFN0YXJ0T2JqZWN0KCkgY2FsbCkuCisgICAgICBpZiAodmFsdWUudHlwZSgpICE9IERhdGFQaWVjZTo6VFlQRV9OVUxMICYmICFpbnZhbGlkXykgeworICAgICAgICBwYXJlbnRfLT5JbnZhbGlkVmFsdWUoIkFueSIsICJFeHBlY3QgYSBKU09OIG9iamVjdC4iKTsKKyAgICAgICAgaW52YWxpZF8gPSB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBvd18tPlByb3RvV3JpdGVyOjpTdGFydE9iamVjdCgiIik7CisgICAgICBTdGF0dXMgc3RhdHVzID0gKCp3ZWxsX2tub3duX3R5cGVfcmVuZGVyXykob3dfLmdldCgpLCB2YWx1ZSk7CisgICAgICBpZiAoIXN0YXR1cy5vaygpKSBvd18tPkludmFsaWRWYWx1ZSgiQW55Iiwgc3RhdHVzLm1lc3NhZ2UoKSk7CisgICAgICBvd18tPlByb3RvV3JpdGVyOjpFbmRPYmplY3QoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3dfLT5SZW5kZXJEYXRhUGllY2UobmFtZSwgdmFsdWUpOworICB9Cit9CisKK3ZvaWQgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OkFueVdyaXRlcjo6U3RhcnRBbnkoY29uc3QgRGF0YVBpZWNlJiB2YWx1ZSkgeworICAvLyBGaWd1cmUgb3V0IHRoZSB0eXBlIHVybC4gVGhpcyBpcyBhIGNvcHktcGFzdGUgZnJvbSBXcml0ZVN0cmluZyBidXQgd2UgYWxzbworICAvLyBuZWVkIHRoZSB2YWx1ZSwgc28gd2UgY2FuJ3QganVzdCBjYWxsIHRocm91Z2ggdG8gdGhhdC4KKyAgaWYgKHZhbHVlLnR5cGUoKSA9PSBEYXRhUGllY2U6OlRZUEVfU1RSSU5HKSB7CisgICAgdHlwZV91cmxfID0gc3RkOjpzdHJpbmcodmFsdWUuc3RyKCkpOworICB9IGVsc2UgeworICAgIHV0aWw6OlN0YXR1c09yPHN0ZDo6c3RyaW5nPiBzID0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgICBpZiAoIXMub2soKSkgeworICAgICAgcGFyZW50Xy0+SW52YWxpZFZhbHVlKCJTdHJpbmciLCBzLnN0YXR1cygpLm1lc3NhZ2UoKSk7CisgICAgICBpbnZhbGlkXyA9IHRydWU7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHR5cGVfdXJsXyA9IHMudmFsdWUoKTsKKyAgfQorICAvLyBSZXNvbHZlIHRoZSB0eXBlIHVybCwgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiB3ZSBmYWlsZWQgdG8gcmVzb2x2ZSBpdC4KKyAgdXRpbDo6U3RhdHVzT3I8Y29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSo+IHJlc29sdmVkX3R5cGUgPQorICAgICAgcGFyZW50Xy0+dHlwZWluZm8oKS0+UmVzb2x2ZVR5cGVVcmwodHlwZV91cmxfKTsKKyAgaWYgKCFyZXNvbHZlZF90eXBlLm9rKCkpIHsKKyAgICBwYXJlbnRfLT5JbnZhbGlkVmFsdWUoIkFueSIsIHJlc29sdmVkX3R5cGUuc3RhdHVzKCkubWVzc2FnZSgpKTsKKyAgICBpbnZhbGlkXyA9IHRydWU7CisgICAgcmV0dXJuOworICB9CisgIC8vIEF0IHRoaXMgcG9pbnQsIHR5cGUgaXMgbmV2ZXIgbnVsbC4KKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogdHlwZSA9IHJlc29sdmVkX3R5cGUudmFsdWUoKTsKKworICB3ZWxsX2tub3duX3R5cGVfcmVuZGVyXyA9IEZpbmRUeXBlUmVuZGVyZXIodHlwZV91cmxfKTsKKyAgaWYgKHdlbGxfa25vd25fdHlwZV9yZW5kZXJfICE9IG51bGxwdHIgfHwKKyAgICAgIC8vIEV4cGxpY2l0bHkgbGlzdCBBbnkgYW5kIFN0cnVjdCBoZXJlIGJlY2F1c2UgdGhleSBkb24ndCBoYXZlIGEKKyAgICAgIC8vIGN1c3RvbSByZW5kZXJlci4KKyAgICAgIHR5cGUtPm5hbWUoKSA9PSBrQW55VHlwZSB8fCB0eXBlLT5uYW1lKCkgPT0ga1N0cnVjdFR5cGUpIHsKKyAgICBpc193ZWxsX2tub3duX3R5cGVfID0gdHJ1ZTsKKyAgfQorCisgIC8vIENyZWF0ZSBvdXIgb2JqZWN0IHdyaXRlciBhbmQgaW5pdGlhbGl6ZSBpdCB3aXRoIHRoZSBmaXJzdCBTdGFydE9iamVjdAorICAvLyBjYWxsLgorICBvd18ucmVzZXQobmV3IFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyKHBhcmVudF8tPnR5cGVpbmZvKCksICp0eXBlLCAmb3V0cHV0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfLT5saXN0ZW5lcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF8tPm9wdGlvbnNfKSk7CisKKyAgLy8gRG9uJ3QgY2FsbCBTdGFydE9iamVjdCgpIGZvciB3ZWxsLWtub3duIHR5cGVzIHlldC4gRGVwZW5kaW5nIG9uIHRoZQorICAvLyB0eXBlIG9mIGFjdHVhbCBkYXRhLCB3ZSBtYXkgbm90IG5lZWQgdG8gY2FsbCBTdGFydE9iamVjdCgpLiBGb3IKKyAgLy8gZXhhbXBsZToKKyAgLy8geworICAvLyAgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5WYWx1ZSIsCisgIC8vICAgInZhbHVlIjogWzEsIDIsIDNdLAorICAvLyB9CisgIC8vIFdpdGggdGhlIGFib3ZlIEpTT04gcmVwcmVzZW50YXRpb24sIHdlIHdpbGwgb25seSBjYWxsIFN0YXJ0TGlzdCgpIG9uIHRoZQorICAvLyBjb250YWluZWQgb3dfLgorICBpZiAoIWlzX3dlbGxfa25vd25fdHlwZV8pIHsKKyAgICBvd18tPlN0YXJ0T2JqZWN0KCIiKTsKKyAgfQorCisgIC8vIE5vdyB3ZSBrbm93IHRoZSBwcm90byB0eXBlIGFuZCBjYW4gaW50ZXJwcmV0IGFsbCBkYXRhIGZpZWxkcyB3ZSBnYXRoZXJlZAorICAvLyBiZWZvcmUgdGhlICJAdHlwZSIgZmllbGQuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pbnRlcnByZXRlZF9ldmVudHNfLnNpemUoKTsgKytpKSB7CisgICAgdW5pbnRlcnByZXRlZF9ldmVudHNfW2ldLlJlcGxheSh0aGlzKTsKKyAgfQorfQorCit2b2lkIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpBbnlXcml0ZXI6OldyaXRlQW55KCkgeworICBpZiAob3dfID09IG51bGxwdHIpIHsKKyAgICBpZiAodW5pbnRlcnByZXRlZF9ldmVudHNfLmVtcHR5KCkpIHsKKyAgICAgIC8vIFdlIG5ldmVyIGdvdCBhbnkgY29udGVudCwgc28ganVzdCByZXR1cm4gaW1tZWRpYXRlbHksIHdoaWNoIGlzCisgICAgICAvLyBlcXVpdmFsZW50IHRvIHdyaXRpbmcgYW4gZW1wdHkgQW55LgorICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGVyZSBhcmUgdW5pbnRlcnByZXRlZCBkYXRhLCBidXQgd2UgbmV2ZXIgZ290IGEgIkB0eXBlIiBmaWVsZC4KKyAgICAgIGlmICghaW52YWxpZF8pIHsKKyAgICAgICAgcGFyZW50Xy0+SW52YWxpZFZhbHVlKCJBbnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyQ2F0KCJNaXNzaW5nIEB0eXBlIGZvciBhbnkgZmllbGQgaW4gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfLT5tYXN0ZXJfdHlwZV8ubmFtZSgpKSk7CisgICAgICAgIGludmFsaWRfID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgLy8gUmVuZGVyIHRoZSB0eXBlX3VybCBhbmQgdmFsdWUgZmllbGRzIGRpcmVjdGx5IHRvIHRoZSBzdHJlYW0uCisgIC8vIHR5cGVfdXJsIGhhcyB0YWcgMSBhbmQgdmFsdWUgaGFzIHRhZyAyLgorICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoMSwgdHlwZV91cmxfLCBwYXJlbnRfLT5zdHJlYW0oKSk7CisgIGlmICghZGF0YV8uZW1wdHkoKSkgeworICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzKDIsIGRhdGFfLCBwYXJlbnRfLT5zdHJlYW0oKSk7CisgIH0KK30KKwordm9pZCBQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6QW55V3JpdGVyOjpFdmVudDo6UmVwbGF5KAorICAgIEFueVdyaXRlciogd3JpdGVyKSBjb25zdCB7CisgIHN3aXRjaCAodHlwZV8pIHsKKyAgICBjYXNlIFNUQVJUX09CSkVDVDoKKyAgICAgIHdyaXRlci0+U3RhcnRPYmplY3QobmFtZV8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFTkRfT0JKRUNUOgorICAgICAgd3JpdGVyLT5FbmRPYmplY3QoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1RBUlRfTElTVDoKKyAgICAgIHdyaXRlci0+U3RhcnRMaXN0KG5hbWVfKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRU5EX0xJU1Q6CisgICAgICB3cml0ZXItPkVuZExpc3QoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUkVOREVSX0RBVEFfUElFQ0U6CisgICAgICB3cml0ZXItPlJlbmRlckRhdGFQaWVjZShuYW1lXywgdmFsdWVfKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OkFueVdyaXRlcjo6RXZlbnQ6OkRlZXBDb3B5KCkgeworICAvLyBEYXRhUGllY2Ugb25seSBjb250YWlucyBhIHN0cmluZyByZWZlcmVuY2UuIFRvIG1ha2Ugc3VyZSB0aGUgcmVmZXJlbmNlZAorICAvLyBzdHJpbmcgdmFsdWUgc3RheXMgdmFsaWQsIHdlIG1ha2UgYSBjb3B5IG9mIHRoZSBzdHJpbmcgdmFsdWUgYW5kIHVwZGF0ZQorICAvLyBEYXRhUGllY2UgdG8gcmVmZXJlbmNlIG91ciBvd24gY29weS4KKyAgaWYgKHZhbHVlXy50eXBlKCkgPT0gRGF0YVBpZWNlOjpUWVBFX1NUUklORykgeworICAgIFN0ckFwcGVuZCgmdmFsdWVfc3RvcmFnZV8sIHZhbHVlXy5zdHIoKSk7CisgICAgdmFsdWVfID0gRGF0YVBpZWNlKHZhbHVlX3N0b3JhZ2VfLCB2YWx1ZV8udXNlX3N0cmljdF9iYXNlNjRfZGVjb2RpbmcoKSk7CisgIH0gZWxzZSBpZiAodmFsdWVfLnR5cGUoKSA9PSBEYXRhUGllY2U6OlRZUEVfQllURVMpIHsKKyAgICB2YWx1ZV9zdG9yYWdlXyA9IHZhbHVlXy5Ub0J5dGVzKCkudmFsdWUoKTsKKyAgICB2YWx1ZV8gPQorICAgICAgICBEYXRhUGllY2UodmFsdWVfc3RvcmFnZV8sIHRydWUsIHZhbHVlXy51c2Vfc3RyaWN0X2Jhc2U2NF9kZWNvZGluZygpKTsKKyAgfQorfQorCitQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6SXRlbTo6SXRlbShQcm90b1N0cmVhbU9iamVjdFdyaXRlciogZW5jbG9zaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlbVR5cGUgaXRlbV90eXBlLCBib29sIGlzX3BsYWNlaG9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19saXN0KQorICAgIDogQmFzZUVsZW1lbnQobnVsbHB0ciksCisgICAgICBvd18oZW5jbG9zaW5nKSwKKyAgICAgIGFueV8oKSwKKyAgICAgIGl0ZW1fdHlwZV8oaXRlbV90eXBlKSwKKyAgICAgIGlzX3BsYWNlaG9sZGVyXyhpc19wbGFjZWhvbGRlciksCisgICAgICBpc19saXN0Xyhpc19saXN0KSB7CisgIGlmIChpdGVtX3R5cGVfID09IEFOWSkgeworICAgIGFueV8ucmVzZXQobmV3IEFueVdyaXRlcihvd18pKTsKKyAgfQorICBpZiAoaXRlbV90eXBlID09IE1BUCkgeworICAgIG1hcF9rZXlzXy5yZXNldChuZXcgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPik7CisgIH0KK30KKworUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6Okl0ZW06Okl0ZW0oUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6Okl0ZW0qIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1UeXBlIGl0ZW1fdHlwZSwgYm9vbCBpc19wbGFjZWhvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbGlzdCkKKyAgICA6IEJhc2VFbGVtZW50KHBhcmVudCksCisgICAgICBvd18odGhpcy0+cGFyZW50KCktPm93XyksCisgICAgICBhbnlfKCksCisgICAgICBpdGVtX3R5cGVfKGl0ZW1fdHlwZSksCisgICAgICBpc19wbGFjZWhvbGRlcl8oaXNfcGxhY2Vob2xkZXIpLAorICAgICAgaXNfbGlzdF8oaXNfbGlzdCkgeworICBpZiAoaXRlbV90eXBlID09IEFOWSkgeworICAgIGFueV8ucmVzZXQobmV3IEFueVdyaXRlcihvd18pKTsKKyAgfQorICBpZiAoaXRlbV90eXBlID09IE1BUCkgeworICAgIG1hcF9rZXlzXy5yZXNldChuZXcgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPik7CisgIH0KK30KKworYm9vbCBQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6SXRlbTo6SW5zZXJ0TWFwS2V5SWZOb3RQcmVzZW50KAorICAgIFN0cmluZ1BpZWNlIG1hcF9rZXkpIHsKKyAgcmV0dXJuIEluc2VydElmTm90UHJlc2VudChtYXBfa2V5c18uZ2V0KCksIHN0ZDo6c3RyaW5nKG1hcF9rZXkpKTsKK30KKworCitQcm90b1N0cmVhbU9iamVjdFdyaXRlciogUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlN0YXJ0T2JqZWN0KAorICAgIFN0cmluZ1BpZWNlIG5hbWUpIHsKKyAgaWYgKGludmFsaWRfZGVwdGgoKSA+IDApIHsKKyAgICBJbmNyZW1lbnRJbnZhbGlkRGVwdGgoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8vIFN0YXJ0aW5nIHRoZSByb290IG1lc3NhZ2UuIENyZWF0ZSB0aGUgcm9vdCBJdGVtIGFuZCByZXR1cm4uCisgIC8vIEFOWSBtZXNzYWdlIHR5cGUgZG9lcyBub3QgbmVlZCBzcGVjaWFsIGhhbmRsaW5nLCBqdXN0IHNldCB0aGUgSXRlbVR5cGUKKyAgLy8gdG8gQU5ZLgorICBpZiAoY3VycmVudF8gPT0gbnVsbHB0cikgeworICAgIFByb3RvV3JpdGVyOjpTdGFydE9iamVjdChuYW1lKTsKKyAgICBjdXJyZW50Xy5yZXNldChuZXcgSXRlbSgKKyAgICAgICAgdGhpcywgbWFzdGVyX3R5cGVfLm5hbWUoKSA9PSBrQW55VHlwZSA/IEl0ZW06OkFOWSA6IEl0ZW06Ok1FU1NBR0UsCisgICAgICAgIGZhbHNlLCBmYWxzZSkpOworCisgICAgLy8gSWYgbWFzdGVyIHR5cGUgaXMgYSBzcGVjaWFsIHR5cGUgdGhhdCBuZWVkcyBleHRyYSB2YWx1ZXMgdG8gYmUgd3JpdHRlbiB0bworICAgIC8vIHN0cmVhbSwgd2Ugd3JpdGUgdGhvc2UgdmFsdWVzLgorICAgIGlmIChtYXN0ZXJfdHlwZV8ubmFtZSgpID09IGtTdHJ1Y3RUeXBlKSB7CisgICAgICAvLyBTdHJ1Y3QgaGFzIGEgbWFwPHN0cmluZywgVmFsdWU+IGZpZWxkIGNhbGxlZCAiZmllbGRzIi4KKyAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvYmxvYi9tYWluL3NyYy9nb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvCisgICAgICAvLyAiZmllbGRzIjogWworICAgICAgUHVzaCgiZmllbGRzIiwgSXRlbTo6TUFQLCB0cnVlLCB0cnVlKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIGlmIChtYXN0ZXJfdHlwZV8ubmFtZSgpID09IGtTdHJ1Y3RWYWx1ZVR5cGUpIHsKKyAgICAgIC8vIFdlIGdvdCBhIFN0YXJ0T2JqZWN0IGNhbGwgd2l0aCBnb29nbGUucHJvdG9idWYuVmFsdWUgZmllbGQuIFRoZSBvbmx5CisgICAgICAvLyBvYmplY3Qgd2l0aGluIHRoYXQgdHlwZSBpcyBhIHN0cnVjdCB0eXBlLiBTbyBzdGFydCBhIHN0cnVjdC4KKyAgICAgIC8vCisgICAgICAvLyBUaGUgc3RydWN0IGZpZWxkIGluIFZhbHVlIHR5cGUgaXMgbmFtZWQgInN0cnVjdF92YWx1ZSIKKyAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvYmxvYi9tYWluL3NyYy9nb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvCisgICAgICAvLyBBbHNvIHN0YXJ0IHRoZSBtYXAgZmllbGQgImZpZWxkcyIgd2l0aGluIHRoZSBzdHJ1Y3QuCisgICAgICAvLyAic3RydWN0X3ZhbHVlIjogeworICAgICAgLy8gICAiZmllbGRzIjogWworICAgICAgUHVzaCgic3RydWN0X3ZhbHVlIiwgSXRlbTo6TUVTU0FHRSwgdHJ1ZSwgZmFsc2UpOworICAgICAgUHVzaCgiZmllbGRzIiwgSXRlbTo6TUFQLCB0cnVlLCB0cnVlKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIGlmIChtYXN0ZXJfdHlwZV8ubmFtZSgpID09IGtTdHJ1Y3RMaXN0VmFsdWVUeXBlKSB7CisgICAgICBJbnZhbGlkVmFsdWUoa1N0cnVjdExpc3RWYWx1ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBzdGFydCByb290IG1lc3NhZ2Ugd2l0aCBMaXN0VmFsdWUuIik7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvLyBTZW5kIGFsbCBBTlkgZXZlbnRzIHRvIEFueVdyaXRlci4KKyAgaWYgKGN1cnJlbnRfLT5Jc0FueSgpKSB7CisgICAgY3VycmVudF8tPmFueSgpLT5TdGFydE9iamVjdChuYW1lKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8vIElmIHdlIGFyZSB3aXRoaW4gYSBtYXAsIHdlIHJlbmRlciBuYW1lIGFzIGtleXMgYW5kIHNlbmQgU3RhcnRPYmplY3QgdG8gdGhlCisgIC8vIHZhbHVlIGZpZWxkLgorICBpZiAoY3VycmVudF8tPklzTWFwKCkpIHsKKyAgICBpZiAoIVZhbGlkTWFwS2V5KG5hbWUpKSB7CisgICAgICBJbmNyZW1lbnRJbnZhbGlkRGVwdGgoKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8vIE1hcCBpcyBhIHJlcGVhdGVkIGZpZWxkIG9mIG1lc3NhZ2UgdHlwZSB3aXRoIGEgImtleSIgYW5kIGEgInZhbHVlIiBmaWVsZC4KKyAgICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zP2hsPWVuI21hcHMKKyAgICAvLyBtZXNzYWdlIE1hcEZpZWxkRW50cnkgeworICAgIC8vICAga2V5X3R5cGUga2V5ID0gMTsKKyAgICAvLyAgIHZhbHVlX3R5cGUgdmFsdWUgPSAyOworICAgIC8vIH0KKyAgICAvLworICAgIC8vIHJlcGVhdGVkIE1hcEZpZWxkRW50cnkgbWFwX2ZpZWxkID0gTjsKKyAgICAvLworICAgIC8vIFRoYXQgbWVhbnMsIHdlIHJlbmRlciB0aGUgZm9sbG93aW5nIGVsZW1lbnQgd2l0aGluIGEgbGlzdCAoaGVuY2Ugbm8KKyAgICAvLyBuYW1lKToKKyAgICAvLyB7ICJrZXkiOiAiPG5hbWU+IiwgInZhbHVlIjogeworICAgIFB1c2goIiIsIEl0ZW06Ok1FU1NBR0UsIGZhbHNlLCBmYWxzZSk7CisgICAgUHJvdG9Xcml0ZXI6OlJlbmRlckRhdGFQaWVjZSgia2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFQaWVjZShuYW1lLCB1c2Vfc3RyaWN0X2Jhc2U2NF9kZWNvZGluZygpKSk7CisgICAgUHVzaCgidmFsdWUiLCBJc0FueSgqTG9va3VwKCJ2YWx1ZSIpKSA/IEl0ZW06OkFOWSA6IEl0ZW06Ok1FU1NBR0UsIHRydWUsCisgICAgICAgICBmYWxzZSk7CisKKyAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIHZhbGlkIHNvIGZhciBhZnRlciBzdGFydGluZyBtYXAgZmllbGRzLgorICAgIGlmIChpbnZhbGlkX2RlcHRoKCkgPiAwKSByZXR1cm4gdGhpczsKKworICAgIC8vIElmIHRvcCBvZiBzdGFjayBpcyBnLnAuU3RydWN0IHR5cGUsIHN0YXJ0IHRoZSBzdHJ1Y3QgdGhlIG1hcCBmaWVsZCB3aXRoaW4KKyAgICAvLyBpdC4KKyAgICBpZiAoZWxlbWVudCgpICE9IG51bGxwdHIgJiYgSXNTdHJ1Y3QoKmVsZW1lbnQoKS0+cGFyZW50X2ZpZWxkKCkpKSB7CisgICAgICAvLyBSZW5kZXIgImZpZWxkcyI6IFsKKyAgICAgIFB1c2goImZpZWxkcyIsIEl0ZW06Ok1BUCwgdHJ1ZSwgdHJ1ZSk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvLyBJZiB0b3Agb2Ygc3RhY2sgaXMgZy5wLlZhbHVlIHR5cGUsIHN0YXJ0IHRoZSBTdHJ1Y3Qgd2l0aGluIGl0LgorICAgIGlmIChlbGVtZW50KCkgIT0gbnVsbHB0ciAmJiBJc1N0cnVjdFZhbHVlKCplbGVtZW50KCktPnBhcmVudF9maWVsZCgpKSkgeworICAgICAgLy8gUmVuZGVyCisgICAgICAvLyAic3RydWN0X3ZhbHVlIjogeworICAgICAgLy8gICAiZmllbGRzIjogWworICAgICAgUHVzaCgic3RydWN0X3ZhbHVlIiwgSXRlbTo6TUVTU0FHRSwgdHJ1ZSwgZmFsc2UpOworICAgICAgUHVzaCgiZmllbGRzIiwgSXRlbTo6TUFQLCB0cnVlLCB0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogZmllbGQgPSBCZWdpbk5hbWVkKG5hbWUsIGZhbHNlKTsKKworICBpZiAoZmllbGQgPT0gbnVsbHB0cikgcmV0dXJuIHRoaXM7CisKKyAgLy8gTGVnYWN5IEpTT04gbWFwIGlzIGEgbGlzdCBvZiBrZXkgdmFsdWUgcGFpcnMuIFN0YXJ0cyBhIG1hcCBlbnRyeSBvYmplY3QuCisgIGlmIChvcHRpb25zXy51c2VfbGVnYWN5X2pzb25fbWFwX2Zvcm1hdCAmJiBuYW1lLmVtcHR5KCkpIHsKKyAgICBQdXNoKG5hbWUsIElzQW55KCpmaWVsZCkgPyBJdGVtOjpBTlkgOiBJdGVtOjpNRVNTQUdFLCBmYWxzZSwgZmFsc2UpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgaWYgKElzTWFwKCpmaWVsZCkpIHsKKyAgICAvLyBCZWdpbiBhIG1hcC4gQSBtYXAgaXMgdHJpZ2dlcmVkIGJ5IGEgU3RhcnRPYmplY3QoKSBjYWxsIGlmIHRoZSBjdXJyZW50CisgICAgLy8gZmllbGQgaGFzIGEgbWFwIHR5cGUuCisgICAgLy8gQSBtYXAgdHlwZSBpcyBhbHdheXMgcmVwZWF0ZWQsIGhlbmNlIHNldCBpc19saXN0IHRvIHRydWUuCisgICAgLy8gUmVuZGVyCisgICAgLy8gIjxuYW1lPiI6IFsKKyAgICBQdXNoKG5hbWUsIEl0ZW06Ok1BUCwgZmFsc2UsIHRydWUpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgaWYgKG9wdGlvbnNfLmRpc2FibGVfaW1wbGljaXRfbWVzc2FnZV9saXN0KSB7CisgICAgLy8gSWYgdGhlIGluY29taW5nIG9iamVjdCBpcyByZXBlYXRlZCwgdGhlIHRvcC1sZXZlbCBvYmplY3Qgb24gc3RhY2sgc2hvdWxkCisgICAgLy8gYmUgbGlzdC4gUmVwb3J0IGFuIGVycm9yIG90aGVyd2lzZS4KKyAgICBpZiAoSXNSZXBlYXRlZCgqZmllbGQpICYmICFjdXJyZW50Xy0+aXNfbGlzdCgpKSB7CisgICAgICBJbmNyZW1lbnRJbnZhbGlkRGVwdGgoKTsKKworICAgICAgaWYgKCFvcHRpb25zXy5zdXBwcmVzc19pbXBsaWNpdF9tZXNzYWdlX2xpc3RfZXJyb3IpIHsKKyAgICAgICAgSW52YWxpZFZhbHVlKAorICAgICAgICAgICAgZmllbGQtPm5hbWUoKSwKKyAgICAgICAgICAgICJTdGFydGluZyBhbiBvYmplY3QgaW4gYSByZXBlYXRlZCBmaWVsZCBidXQgdGhlIHBhcmVudCBvYmplY3QgIgorICAgICAgICAgICAgImlzIG5vdCBhIGxpc3QiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgfQorCisgIGlmIChJc1N0cnVjdCgqZmllbGQpKSB7CisgICAgLy8gU3RhcnQgYSBzdHJ1Y3Qgb2JqZWN0LgorICAgIC8vIFJlbmRlcgorICAgIC8vICI8bmFtZT4iOiB7CisgICAgLy8gICAiZmllbGRzIjogeworICAgIFB1c2gobmFtZSwgSXRlbTo6TUVTU0FHRSwgZmFsc2UsIGZhbHNlKTsKKyAgICBQdXNoKCJmaWVsZHMiLCBJdGVtOjpNQVAsIHRydWUsIHRydWUpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgaWYgKElzU3RydWN0VmFsdWUoKmZpZWxkKSkgeworICAgIC8vIFdlIGdvdCBhIFN0YXJ0T2JqZWN0IGNhbGwgd2l0aCBnb29nbGUucHJvdG9idWYuVmFsdWUgZmllbGQuICBUaGUgb25seQorICAgIC8vIG9iamVjdCB3aXRoaW4gdGhhdCB0eXBlIGlzIGEgc3RydWN0IHR5cGUuIFNvIHN0YXJ0IGEgc3RydWN0LgorICAgIC8vIFJlbmRlcgorICAgIC8vICI8bmFtZT4iOiB7CisgICAgLy8gICAic3RydWN0X3ZhbHVlIjogeworICAgIC8vICAgICAiZmllbGRzIjogeworICAgIFB1c2gobmFtZSwgSXRlbTo6TUVTU0FHRSwgZmFsc2UsIGZhbHNlKTsKKyAgICBQdXNoKCJzdHJ1Y3RfdmFsdWUiLCBJdGVtOjpNRVNTQUdFLCB0cnVlLCBmYWxzZSk7CisgICAgUHVzaCgiZmllbGRzIiwgSXRlbTo6TUFQLCB0cnVlLCB0cnVlKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIGlmIChmaWVsZC0+a2luZCgpICE9IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX0dST1VQICYmCisgICAgICBmaWVsZC0+a2luZCgpICE9IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkOjpUWVBFX01FU1NBR0UpIHsKKyAgICBJbmNyZW1lbnRJbnZhbGlkRGVwdGgoKTsKKyAgICBpZiAoIW9wdGlvbnNfLnN1cHByZXNzX29iamVjdF90b19zY2FsYXJfZXJyb3IpIHsKKyAgICAgIEludmFsaWRWYWx1ZShmaWVsZC0+bmFtZSgpLCAiU3RhcnRpbmcgYW4gb2JqZWN0IG9uIGEgc2NhbGFyIGZpZWxkIik7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvLyBBIHJlZ3VsYXIgbWVzc2FnZSB0eXBlLiBQYXNzIGl0IGRpcmVjdGx5IHRvIFByb3RvV3JpdGVyLgorICAvLyBSZW5kZXIKKyAgLy8gIjxuYW1lPiI6IHsKKyAgUHVzaChuYW1lLCBJc0FueSgqZmllbGQpID8gSXRlbTo6QU5ZIDogSXRlbTo6TUVTU0FHRSwgZmFsc2UsIGZhbHNlKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK1Byb3RvU3RyZWFtT2JqZWN0V3JpdGVyKiBQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6RW5kT2JqZWN0KCkgeworICBpZiAoaW52YWxpZF9kZXB0aCgpID4gMCkgeworICAgIERlY3JlbWVudEludmFsaWREZXB0aCgpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgaWYgKGN1cnJlbnRfID09IG51bGxwdHIpIHJldHVybiB0aGlzOworCisgIGlmIChjdXJyZW50Xy0+SXNBbnkoKSkgeworICAgIGlmIChjdXJyZW50Xy0+YW55KCktPkVuZE9iamVjdCgpKSByZXR1cm4gdGhpczsKKyAgfQorCisgIFBvcCgpOworCisgIHJldHVybiB0aGlzOworfQorCisKK1Byb3RvU3RyZWFtT2JqZWN0V3JpdGVyKiBQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6U3RhcnRMaXN0KAorICAgIFN0cmluZ1BpZWNlIG5hbWUpIHsKKyAgaWYgKGludmFsaWRfZGVwdGgoKSA+IDApIHsKKyAgICBJbmNyZW1lbnRJbnZhbGlkRGVwdGgoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8vIFNpbmNlIHdlIGNhbm5vdCBoYXZlIGEgdG9wLWxldmVsIHJlcGVhdGVkIGl0ZW0gaW4gcHJvdG9idWYsIHRoZSBvbmx5IHdheQorICAvLyB0aGlzIGlzIHZhbGlkIGlzIGlmIHdlIHN0YXJ0IGEgc3BlY2lhbCB0eXBlIGdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUgb3IKKyAgLy8gZ29vZ2xlLnByb3RvYnVmLlZhbHVlLgorICBpZiAoY3VycmVudF8gPT0gbnVsbHB0cikgeworICAgIGlmICghbmFtZS5lbXB0eSgpKSB7CisgICAgICBJbnZhbGlkTmFtZShuYW1lLCAiUm9vdCBlbGVtZW50IHNob3VsZCBub3QgYmUgbmFtZWQuIik7CisgICAgICBJbmNyZW1lbnRJbnZhbGlkRGVwdGgoKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8vIElmIG1hc3RlciB0eXBlIGlzIGEgc3BlY2lhbCB0eXBlIHRoYXQgbmVlZHMgZXh0cmEgdmFsdWVzIHRvIGJlIHdyaXR0ZW4gdG8KKyAgICAvLyBzdHJlYW0sIHdlIHdyaXRlIHRob3NlIHZhbHVlcy4KKyAgICBpZiAobWFzdGVyX3R5cGVfLm5hbWUoKSA9PSBrU3RydWN0VmFsdWVUeXBlKSB7CisgICAgICAvLyBXZSBnb3QgYSBTdGFydExpc3Qgd2l0aCBnb29nbGUucHJvdG9idWYuVmFsdWUgbWFzdGVyIHR5cGUuIFRoaXMgbWVhbnMKKyAgICAgIC8vIHdlIGhhdmUgdG8gc3RhcnQgdGhlICJsaXN0X3ZhbHVlIiB3aXRoaW4gZ29vZ2xlLnByb3RvYnVmLlZhbHVlLgorICAgICAgLy8KKyAgICAgIC8vIFNlZQorICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9ibG9iL21haW4vc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8KKyAgICAgIC8vCisgICAgICAvLyBSZW5kZXIKKyAgICAgIC8vICI8bmFtZT4iOiB7CisgICAgICAvLyAgICJsaXN0X3ZhbHVlIjogeworICAgICAgLy8gICAgICJ2YWx1ZXMiOiBbICAvLyBTdGFydCB0aGlzIGxpc3QuCisgICAgICBQcm90b1dyaXRlcjo6U3RhcnRPYmplY3QobmFtZSk7CisgICAgICBjdXJyZW50Xy5yZXNldChuZXcgSXRlbSh0aGlzLCBJdGVtOjpNRVNTQUdFLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgIFB1c2goImxpc3RfdmFsdWUiLCBJdGVtOjpNRVNTQUdFLCB0cnVlLCBmYWxzZSk7CisgICAgICBQdXNoKCJ2YWx1ZXMiLCBJdGVtOjpNRVNTQUdFLCB0cnVlLCB0cnVlKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIGlmIChtYXN0ZXJfdHlwZV8ubmFtZSgpID09IGtTdHJ1Y3RMaXN0VmFsdWVUeXBlKSB7CisgICAgICAvLyBXZSBnb3QgYSBTdGFydExpc3Qgd2l0aCBnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlIG1hc3RlciB0eXBlLiBUaGlzCisgICAgICAvLyBtZWFucyB3ZSBoYXZlIHRvIHN0YXJ0IHRoZSAidmFsdWVzIiB3aXRoaW4gZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZS4KKyAgICAgIC8vCisgICAgICAvLyBSZW5kZXIKKyAgICAgIC8vICI8bmFtZT4iOiB7CisgICAgICAvLyAgICJ2YWx1ZXMiOiBbICAvLyBTdGFydCB0aGlzIGxpc3QuCisgICAgICBQcm90b1dyaXRlcjo6U3RhcnRPYmplY3QobmFtZSk7CisgICAgICBjdXJyZW50Xy5yZXNldChuZXcgSXRlbSh0aGlzLCBJdGVtOjpNRVNTQUdFLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgIFB1c2goInZhbHVlcyIsIEl0ZW06Ok1FU1NBR0UsIHRydWUsIHRydWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLy8gU2VuZCB0aGUgZXZlbnQgdG8gUHJvdG9Xcml0ZXIgc28gcHJvcGVyIGVycm9ycyBjYW4gYmUgcmVwb3J0ZWQuCisgICAgLy8KKyAgICAvLyBSZW5kZXIgYSByZWd1bGFyIGxpc3Q6CisgICAgLy8gIjxuYW1lPiI6IFsKKyAgICBQcm90b1dyaXRlcjo6U3RhcnRMaXN0KG5hbWUpOworICAgIGN1cnJlbnRfLnJlc2V0KG5ldyBJdGVtKHRoaXMsIEl0ZW06Ok1FU1NBR0UsIGZhbHNlLCB0cnVlKSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBpZiAoY3VycmVudF8tPklzQW55KCkpIHsKKyAgICBjdXJyZW50Xy0+YW55KCktPlN0YXJ0TGlzdChuYW1lKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8vIElmIHRoZSB0b3Agb2Ygc3RhY2sgaXMgYSBtYXAsIHdlIGFyZSBzdGFydGluZyBhIGxpc3QgdmFsdWUgd2l0aGluIGEgbWFwLgorICAvLyBTaW5jZSBtYXAgZG9lcyBub3QgYWxsb3cgcmVwZWF0ZWQgdmFsdWVzLCB0aGlzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIHRoZSBtYXAKKyAgLy8gdmFsdWUgaXMgb2YgYSBzcGVjaWFsIHR5cGUgdGhhdCByZW5kZXJzIGEgbGlzdCBpbiBKU09OLiAgVGhlc2UgY2FuIGJlIG9uZQorICAvLyBvZiAzIGNhc2VzOgorICAvLyBpLiBXZSBhcmUgcmVuZGVyaW5nIGEgbGlzdCB2YWx1ZSB3aXRoaW4gZ29vZ2xlLnByb3RvYnVmLlN0cnVjdAorICAvLyBpaS4gV2UgYXJlIHJlbmRlcmluZyBhIGxpc3QgdmFsdWUgd2l0aGluIGdvb2dsZS5wcm90b2J1Zi5WYWx1ZQorICAvLyBpaWkuIFdlIGFyZSByZW5kZXJpbmcgYSBsaXN0IHZhbHVlIHdpdGggdHlwZSBnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlLgorICBpZiAoY3VycmVudF8tPklzTWFwKCkpIHsKKyAgICBpZiAoIVZhbGlkTWFwS2V5KG5hbWUpKSB7CisgICAgICBJbmNyZW1lbnRJbnZhbGlkRGVwdGgoKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8vIFN0YXJ0IHRoZSByZXBlYXRlZCBtYXAgZW50cnkgb2JqZWN0LgorICAgIC8vIFJlbmRlcgorICAgIC8vIHsgImtleSI6ICI8bmFtZT4iLCAidmFsdWUiOiB7CisgICAgUHVzaCgiIiwgSXRlbTo6TUVTU0FHRSwgZmFsc2UsIGZhbHNlKTsKKyAgICBQcm90b1dyaXRlcjo6UmVuZGVyRGF0YVBpZWNlKCJrZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVBpZWNlKG5hbWUsIHVzZV9zdHJpY3RfYmFzZTY0X2RlY29kaW5nKCkpKTsKKyAgICBQdXNoKCJ2YWx1ZSIsIEl0ZW06Ok1FU1NBR0UsIHRydWUsIGZhbHNlKTsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgdmFsaWQgYWZ0ZXIgcHVzaGluZyBhbGwgYWJvdmUgaXRlbXMuCisgICAgaWYgKGludmFsaWRfZGVwdGgoKSA+IDApIHJldHVybiB0aGlzOworCisgICAgLy8gY2FzZSBpIGFuZCBpaSBhYm92ZS4gU3RhcnQgImxpc3RfdmFsdWUiIGZpZWxkIHdpdGhpbiBnLnAuVmFsdWUKKyAgICBpZiAoZWxlbWVudCgpICE9IG51bGxwdHIgJiYgZWxlbWVudCgpLT5wYXJlbnRfZmllbGQoKSAhPSBudWxscHRyKSB7CisgICAgICAvLyBSZW5kZXIKKyAgICAgIC8vICJsaXN0X3ZhbHVlIjogeworICAgICAgLy8gICAidmFsdWVzIjogWyAgLy8gU3RhcnQgdGhpcyBsaXN0CisgICAgICBpZiAoSXNTdHJ1Y3RWYWx1ZSgqZWxlbWVudCgpLT5wYXJlbnRfZmllbGQoKSkpIHsKKyAgICAgICAgUHVzaCgibGlzdF92YWx1ZSIsIEl0ZW06Ok1FU1NBR0UsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgUHVzaCgidmFsdWVzIiwgSXRlbTo6TUVTU0FHRSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorCisgICAgICAvLyBSZW5kZXIKKyAgICAgIC8vICJ2YWx1ZXMiOiBbCisgICAgICBpZiAoSXNTdHJ1Y3RMaXN0VmFsdWUoKmVsZW1lbnQoKS0+cGFyZW50X2ZpZWxkKCkpKSB7CisgICAgICAgIC8vIGNhc2UgaWlpIGFib3ZlLiBCaW5kIGRpcmVjdGx5IHRvIGcucC5MaXN0VmFsdWUKKyAgICAgICAgUHVzaCgidmFsdWVzIiwgSXRlbTo6TUVTU0FHRSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgIH0KKworICAgIC8vIFJlcG9ydCBhbiBlcnJvci4KKyAgICBJbnZhbGlkVmFsdWUoIk1hcCIsIFN0ckNhdCgiQ2Fubm90IGhhdmUgcmVwZWF0ZWQgaXRlbXMgKCciLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInKSB3aXRoaW4gYSBtYXAuIikpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLy8gV2hlbiBuYW1lIGlzIGVtcHR5IGFuZCBzdGFjayBpcyBub3QgZW1wdHksIHdlIGFyZSByZW5kZXJpbmcgYW4gaXRlbSB3aXRoaW4KKyAgLy8gYSBsaXN0LgorICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgaWYgKGVsZW1lbnQoKSAhPSBudWxscHRyICYmIGVsZW1lbnQoKS0+cGFyZW50X2ZpZWxkKCkgIT0gbnVsbHB0cikgeworICAgICAgaWYgKElzU3RydWN0VmFsdWUoKmVsZW1lbnQoKS0+cGFyZW50X2ZpZWxkKCkpKSB7CisgICAgICAgIC8vIFNpbmNlIGl0IGlzIGcucC5WYWx1ZSwgd2UgYmluZCBkaXJlY3RseSB0byB0aGUgbGlzdF92YWx1ZS4KKyAgICAgICAgLy8gUmVuZGVyCisgICAgICAgIC8vIHsgIC8vIGcucC5WYWx1ZSBpdGVtIHdpdGhpbiB0aGUgbGlzdAorICAgICAgICAvLyAgICJsaXN0X3ZhbHVlIjogeworICAgICAgICAvLyAgICAgInZhbHVlcyI6IFsKKyAgICAgICAgUHVzaCgiIiwgSXRlbTo6TUVTU0FHRSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgUHVzaCgibGlzdF92YWx1ZSIsIEl0ZW06Ok1FU1NBR0UsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgUHVzaCgidmFsdWVzIiwgSXRlbTo6TUVTU0FHRSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorCisgICAgICBpZiAoSXNTdHJ1Y3RMaXN0VmFsdWUoKmVsZW1lbnQoKS0+cGFyZW50X2ZpZWxkKCkpKSB7CisgICAgICAgIC8vIFNpbmNlIGl0IGlzIGcucC5MaXN0VmFsdWUsIHdlIGJpbmQgdG8gaXQgZGlyZWN0bHkuCisgICAgICAgIC8vIFJlbmRlcgorICAgICAgICAvLyB7ICAvLyBnLnAuTGlzdFZhbHVlIGl0ZW0gd2l0aGluIHRoZSBsaXN0CisgICAgICAgIC8vICAgInZhbHVlcyI6IFsKKyAgICAgICAgUHVzaCgiIiwgSXRlbTo6TUVTU0FHRSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgUHVzaCgidmFsdWVzIiwgSXRlbTo6TUVTU0FHRSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgIH0KKworICAgIC8vIFBhc3MgdGhlIGV2ZW50IHRvIHVuZGVybHlpbmcgUHJvdG9Xcml0ZXIuCisgICAgUHVzaChuYW1lLCBJdGVtOjpNRVNTQUdFLCBmYWxzZSwgdHJ1ZSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvLyBuYW1lIGlzIG5vdCBlbXB0eQorICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogZmllbGQgPSBMb29rdXAobmFtZSk7CisKKyAgaWYgKGZpZWxkID09IG51bGxwdHIpIHsKKyAgICBJbmNyZW1lbnRJbnZhbGlkRGVwdGgoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIGlmIChJc1N0cnVjdFZhbHVlKCpmaWVsZCkpIHsKKyAgICAvLyBJZiBnLnAuVmFsdWUgaXMgcmVwZWF0ZWQsIHN0YXJ0IHRoYXQgbGlzdC4gT3RoZXJ3aXNlLCBzdGFydCB0aGUKKyAgICAvLyAibGlzdF92YWx1ZSIgd2l0aGluIGl0LgorICAgIGlmIChJc1JlcGVhdGVkKCpmaWVsZCkpIHsKKyAgICAgIC8vIFJlbmRlciBpdCBqdXN0IGxpa2UgYSByZWd1bGFyIHJlcGVhdGVkIGZpZWxkLgorICAgICAgLy8gIjxuYW1lPiI6IFsKKyAgICAgIFB1c2gobmFtZSwgSXRlbTo6TUVTU0FHRSwgZmFsc2UsIHRydWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLy8gU3RhcnQgdGhlICJsaXN0X3ZhbHVlIiBmaWVsZC4KKyAgICAvLyBSZW5kZXIKKyAgICAvLyAiPG5hbWU+IjogeworICAgIC8vICAgImxpc3RfdmFsdWUiOiB7CisgICAgLy8gICAgICJ2YWx1ZXMiOiBbCisgICAgUHVzaChuYW1lLCBJdGVtOjpNRVNTQUdFLCBmYWxzZSwgZmFsc2UpOworICAgIFB1c2goImxpc3RfdmFsdWUiLCBJdGVtOjpNRVNTQUdFLCB0cnVlLCBmYWxzZSk7CisgICAgUHVzaCgidmFsdWVzIiwgSXRlbTo6TUVTU0FHRSwgdHJ1ZSwgdHJ1ZSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBpZiAoSXNTdHJ1Y3RMaXN0VmFsdWUoKmZpZWxkKSkgeworICAgIC8vIElmIGcucC5MaXN0VmFsdWUgaXMgcmVwZWF0ZWQsIHN0YXJ0IHRoYXQgbGlzdC4gT3RoZXJ3aXNlLCBzdGFydCB0aGUKKyAgICAvLyAidmFsdWVzIiB3aXRoaW4gaXQuCisgICAgaWYgKElzUmVwZWF0ZWQoKmZpZWxkKSkgeworICAgICAgLy8gUmVuZGVyIGl0IGp1c3QgbGlrZSBhIHJlZ3VsYXIgcmVwZWF0ZWQgZmllbGQuCisgICAgICAvLyAiPG5hbWU+IjogWworICAgICAgUHVzaChuYW1lLCBJdGVtOjpNRVNTQUdFLCBmYWxzZSwgdHJ1ZSk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvLyBTdGFydCB0aGUgInZhbHVlcyIgZmllbGQgd2l0aGluIGcucC5MaXN0VmFsdWUuCisgICAgLy8gUmVuZGVyCisgICAgLy8gIjxuYW1lPiI6IHsKKyAgICAvLyAgICJ2YWx1ZXMiOiBbCisgICAgUHVzaChuYW1lLCBJdGVtOjpNRVNTQUdFLCBmYWxzZSwgZmFsc2UpOworICAgIFB1c2goInZhbHVlcyIsIEl0ZW06Ok1FU1NBR0UsIHRydWUsIHRydWUpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLy8gSWYgd2UgYXJlIGhlcmUsIHRoZSBmaWVsZCBzaG91bGQgYmUgcmVwZWF0ZWQuIFJlcG9ydCBhbiBlcnJvciBvdGhlcndpc2UuCisgIGlmICghSXNSZXBlYXRlZCgqZmllbGQpKSB7CisgICAgSW5jcmVtZW50SW52YWxpZERlcHRoKCk7CisgICAgSW52YWxpZE5hbWUobmFtZSwgIlByb3RvIGZpZWxkIGlzIG5vdCByZXBlYXRpbmcsIGNhbm5vdCBzdGFydCBsaXN0LiIpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgaWYgKElzTWFwKCpmaWVsZCkpIHsKKyAgICBpZiAob3B0aW9uc18udXNlX2xlZ2FjeV9qc29uX21hcF9mb3JtYXQpIHsKKyAgICAgIFB1c2gobmFtZSwgSXRlbTo6TUVTU0FHRSwgZmFsc2UsIHRydWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIEludmFsaWRWYWx1ZSgiTWFwIiwgU3RyQ2F0KCJDYW5ub3QgYmluZCBhIGxpc3QgdG8gbWFwIGZvciBmaWVsZCAnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCAiJy4iKSk7CisgICAgSW5jcmVtZW50SW52YWxpZERlcHRoKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvLyBQYXNzIHRoZSBldmVudCB0byBQcm90b1dyaXRlci4KKyAgLy8gUmVuZGVyCisgIC8vICI8bmFtZT4iOiBbCisgIFB1c2gobmFtZSwgSXRlbTo6TUVTU0FHRSwgZmFsc2UsIHRydWUpOworICByZXR1cm4gdGhpczsKK30KKworUHJvdG9TdHJlYW1PYmplY3RXcml0ZXIqIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpFbmRMaXN0KCkgeworICBpZiAoaW52YWxpZF9kZXB0aCgpID4gMCkgeworICAgIERlY3JlbWVudEludmFsaWREZXB0aCgpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgaWYgKGN1cnJlbnRfID09IG51bGxwdHIpIHJldHVybiB0aGlzOworCisgIGlmIChjdXJyZW50Xy0+SXNBbnkoKSkgeworICAgIGN1cnJlbnRfLT5hbnkoKS0+RW5kTGlzdCgpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgUG9wKCk7CisgIHJldHVybiB0aGlzOworfQorCitTdGF0dXMgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlJlbmRlclN0cnVjdFZhbHVlKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyKiBvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YVBpZWNlJiBkYXRhKSB7CisgIHN0ZDo6c3RyaW5nIHN0cnVjdF9maWVsZF9uYW1lOworICBzd2l0Y2ggKGRhdGEudHlwZSgpKSB7CisgICAgY2FzZSBEYXRhUGllY2U6OlRZUEVfSU5UMzI6IHsKKyAgICAgIGlmIChvdy0+b3B0aW9uc18uc3RydWN0X2ludGVnZXJzX2FzX3N0cmluZ3MpIHsKKyAgICAgICAgdXRpbDo6U3RhdHVzT3I8aW50MzJfdD4gaW50X3ZhbHVlID0gZGF0YS5Ub0ludDMyKCk7CisgICAgICAgIGlmIChpbnRfdmFsdWUub2soKSkgeworICAgICAgICAgIG93LT5Qcm90b1dyaXRlcjo6UmVuZGVyRGF0YVBpZWNlKAorICAgICAgICAgICAgICAic3RyaW5nX3ZhbHVlIiwKKyAgICAgICAgICAgICAgRGF0YVBpZWNlKFNpbXBsZUR0b2EoaW50X3ZhbHVlLnZhbHVlKCkpLCB0cnVlKSk7CisgICAgICAgICAgcmV0dXJuIFN0YXR1cygpOworICAgICAgICB9CisgICAgICB9CisgICAgICBzdHJ1Y3RfZmllbGRfbmFtZSA9ICJudW1iZXJfdmFsdWUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGF0YVBpZWNlOjpUWVBFX1VJTlQzMjogeworICAgICAgaWYgKG93LT5vcHRpb25zXy5zdHJ1Y3RfaW50ZWdlcnNfYXNfc3RyaW5ncykgeworICAgICAgICB1dGlsOjpTdGF0dXNPcjx1aW50MzJfdD4gaW50X3ZhbHVlID0gZGF0YS5Ub1VpbnQzMigpOworICAgICAgICBpZiAoaW50X3ZhbHVlLm9rKCkpIHsKKyAgICAgICAgICBvdy0+UHJvdG9Xcml0ZXI6OlJlbmRlckRhdGFQaWVjZSgKKyAgICAgICAgICAgICAgInN0cmluZ192YWx1ZSIsCisgICAgICAgICAgICAgIERhdGFQaWVjZShTaW1wbGVEdG9hKGludF92YWx1ZS52YWx1ZSgpKSwgdHJ1ZSkpOworICAgICAgICAgIHJldHVybiBTdGF0dXMoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3RydWN0X2ZpZWxkX25hbWUgPSAibnVtYmVyX3ZhbHVlIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERhdGFQaWVjZTo6VFlQRV9JTlQ2NDogeworICAgICAgLy8gSWYgdGhlIG9wdGlvbiB0byB0cmVhdCBpbnRlZ2VycyBhcyBzdHJpbmdzIGlzIHNldCwgdGhlbiByZW5kZXIgdGhlbSBhcworICAgICAgLy8gc3RyaW5ncy4gT3RoZXJ3aXNlLCBmYWxsYmFjayB0byByZW5kZXJpbmcgdGhlbSBhcyBkb3VibGUuCisgICAgICBpZiAob3ctPm9wdGlvbnNfLnN0cnVjdF9pbnRlZ2Vyc19hc19zdHJpbmdzKSB7CisgICAgICAgIHV0aWw6OlN0YXR1c09yPGludDY0X3Q+IGludF92YWx1ZSA9IGRhdGEuVG9JbnQ2NCgpOworICAgICAgICBpZiAoaW50X3ZhbHVlLm9rKCkpIHsKKyAgICAgICAgICBvdy0+UHJvdG9Xcml0ZXI6OlJlbmRlckRhdGFQaWVjZSgKKyAgICAgICAgICAgICAgInN0cmluZ192YWx1ZSIsIERhdGFQaWVjZShTdHJDYXQoaW50X3ZhbHVlLnZhbHVlKCkpLCB0cnVlKSk7CisgICAgICAgICAgcmV0dXJuIFN0YXR1cygpOworICAgICAgICB9CisgICAgICB9CisgICAgICBzdHJ1Y3RfZmllbGRfbmFtZSA9ICJudW1iZXJfdmFsdWUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGF0YVBpZWNlOjpUWVBFX1VJTlQ2NDogeworICAgICAgLy8gSWYgdGhlIG9wdGlvbiB0byB0cmVhdCBpbnRlZ2VycyBhcyBzdHJpbmdzIGlzIHNldCwgdGhlbiByZW5kZXIgdGhlbSBhcworICAgICAgLy8gc3RyaW5ncy4gT3RoZXJ3aXNlLCBmYWxsYmFjayB0byByZW5kZXJpbmcgdGhlbSBhcyBkb3VibGUuCisgICAgICBpZiAob3ctPm9wdGlvbnNfLnN0cnVjdF9pbnRlZ2Vyc19hc19zdHJpbmdzKSB7CisgICAgICAgIHV0aWw6OlN0YXR1c09yPHVpbnQ2NF90PiBpbnRfdmFsdWUgPSBkYXRhLlRvVWludDY0KCk7CisgICAgICAgIGlmIChpbnRfdmFsdWUub2soKSkgeworICAgICAgICAgIG93LT5Qcm90b1dyaXRlcjo6UmVuZGVyRGF0YVBpZWNlKAorICAgICAgICAgICAgICAic3RyaW5nX3ZhbHVlIiwgRGF0YVBpZWNlKFN0ckNhdChpbnRfdmFsdWUudmFsdWUoKSksIHRydWUpKTsKKyAgICAgICAgICByZXR1cm4gU3RhdHVzKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN0cnVjdF9maWVsZF9uYW1lID0gIm51bWJlcl92YWx1ZSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEYXRhUGllY2U6OlRZUEVfRkxPQVQ6IHsKKyAgICAgIGlmIChvdy0+b3B0aW9uc18uc3RydWN0X2ludGVnZXJzX2FzX3N0cmluZ3MpIHsKKyAgICAgICAgdXRpbDo6U3RhdHVzT3I8ZmxvYXQ+IGZsb2F0X3ZhbHVlID0gZGF0YS5Ub0Zsb2F0KCk7CisgICAgICAgIGlmIChmbG9hdF92YWx1ZS5vaygpKSB7CisgICAgICAgICAgb3ctPlByb3RvV3JpdGVyOjpSZW5kZXJEYXRhUGllY2UoCisgICAgICAgICAgICAgICJzdHJpbmdfdmFsdWUiLAorICAgICAgICAgICAgICBEYXRhUGllY2UoU2ltcGxlRHRvYShmbG9hdF92YWx1ZS52YWx1ZSgpKSwgdHJ1ZSkpOworICAgICAgICAgIHJldHVybiBTdGF0dXMoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3RydWN0X2ZpZWxkX25hbWUgPSAibnVtYmVyX3ZhbHVlIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERhdGFQaWVjZTo6VFlQRV9ET1VCTEU6IHsKKyAgICAgIGlmIChvdy0+b3B0aW9uc18uc3RydWN0X2ludGVnZXJzX2FzX3N0cmluZ3MpIHsKKyAgICAgICAgdXRpbDo6U3RhdHVzT3I8ZG91YmxlPiBkb3VibGVfdmFsdWUgPSBkYXRhLlRvRG91YmxlKCk7CisgICAgICAgIGlmIChkb3VibGVfdmFsdWUub2soKSkgeworICAgICAgICAgIG93LT5Qcm90b1dyaXRlcjo6UmVuZGVyRGF0YVBpZWNlKAorICAgICAgICAgICAgICAic3RyaW5nX3ZhbHVlIiwKKyAgICAgICAgICAgICAgRGF0YVBpZWNlKFNpbXBsZUR0b2EoZG91YmxlX3ZhbHVlLnZhbHVlKCkpLCB0cnVlKSk7CisgICAgICAgICAgcmV0dXJuIFN0YXR1cygpOworICAgICAgICB9CisgICAgICB9CisgICAgICBzdHJ1Y3RfZmllbGRfbmFtZSA9ICJudW1iZXJfdmFsdWUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGF0YVBpZWNlOjpUWVBFX1NUUklORzogeworICAgICAgc3RydWN0X2ZpZWxkX25hbWUgPSAic3RyaW5nX3ZhbHVlIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERhdGFQaWVjZTo6VFlQRV9CT09MOiB7CisgICAgICBzdHJ1Y3RfZmllbGRfbmFtZSA9ICJib29sX3ZhbHVlIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERhdGFQaWVjZTo6VFlQRV9OVUxMOiB7CisgICAgICBzdHJ1Y3RfZmllbGRfbmFtZSA9ICJudWxsX3ZhbHVlIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICByZXR1cm4gdXRpbDo6SW52YWxpZEFyZ3VtZW50RXJyb3IoCisgICAgICAgICAgIkludmFsaWQgc3RydWN0IGRhdGEgdHlwZS4gT25seSBudW1iZXIsIHN0cmluZywgYm9vbGVhbiBvciAgbnVsbCAiCisgICAgICAgICAgInZhbHVlcyBhcmUgc3VwcG9ydGVkLiIpOworICAgIH0KKyAgfQorICBvdy0+UHJvdG9Xcml0ZXI6OlJlbmRlckRhdGFQaWVjZShzdHJ1Y3RfZmllbGRfbmFtZSwgZGF0YSk7CisgIHJldHVybiBTdGF0dXMoKTsKK30KKworU3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpSZW5kZXJUaW1lc3RhbXAoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXIqIG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YVBpZWNlJiBkYXRhKSB7CisgIGlmIChkYXRhLnR5cGUoKSA9PSBEYXRhUGllY2U6OlRZUEVfTlVMTCkgcmV0dXJuIFN0YXR1cygpOworICBpZiAoZGF0YS50eXBlKCkgIT0gRGF0YVBpZWNlOjpUWVBFX1NUUklORykgeworICAgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigKKyAgICAgICAgU3RyQ2F0KCJJbnZhbGlkIGRhdGEgdHlwZSBmb3IgdGltZXN0YW1wLCB2YWx1ZSBpcyAiLAorICAgICAgICAgICAgICAgICAgICAgZGF0YS5WYWx1ZUFzU3RyaW5nT3JEZWZhdWx0KCIiKSkpOworICB9CisKKyAgU3RyaW5nUGllY2UgdmFsdWUoZGF0YS5zdHIoKSk7CisKKyAgaW50NjRfdCBzZWNvbmRzOworICBpbnQzMl90IG5hbm9zOworICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlBhcnNlVGltZSh2YWx1ZS5Ub1N0cmluZygpLCAmc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbm9zKSkgeworICAgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcihTdHJDYXQoIkludmFsaWQgdGltZSBmb3JtYXQ6ICIsIHZhbHVlKSk7CisgIH0KKworCisgIG93LT5Qcm90b1dyaXRlcjo6UmVuZGVyRGF0YVBpZWNlKCJzZWNvbmRzIiwgRGF0YVBpZWNlKHNlY29uZHMpKTsKKyAgb3ctPlByb3RvV3JpdGVyOjpSZW5kZXJEYXRhUGllY2UoIm5hbm9zIiwgRGF0YVBpZWNlKG5hbm9zKSk7CisgIHJldHVybiBTdGF0dXMoKTsKK30KKworc3RhdGljIGlubGluZSB1dGlsOjpTdGF0dXMgUmVuZGVyT25lRmllbGRQYXRoKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyKiBvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBwYXRoKSB7CisgIG93LT5Qcm90b1dyaXRlcjo6UmVuZGVyRGF0YVBpZWNlKAorICAgICAgInBhdGhzIiwgRGF0YVBpZWNlKENvbnZlcnRGaWVsZE1hc2tQYXRoKHBhdGgsICZUb1NuYWtlQ2FzZSksIHRydWUpKTsKKyAgcmV0dXJuIFN0YXR1cygpOworfQorCitTdGF0dXMgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlJlbmRlckZpZWxkTWFzayhQcm90b1N0cmVhbU9iamVjdFdyaXRlciogb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhUGllY2UmIGRhdGEpIHsKKyAgaWYgKGRhdGEudHlwZSgpID09IERhdGFQaWVjZTo6VFlQRV9OVUxMKSByZXR1cm4gU3RhdHVzKCk7CisgIGlmIChkYXRhLnR5cGUoKSAhPSBEYXRhUGllY2U6OlRZUEVfU1RSSU5HKSB7CisgICAgcmV0dXJuIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKAorICAgICAgICBTdHJDYXQoIkludmFsaWQgZGF0YSB0eXBlIGZvciBmaWVsZCBtYXNrLCB2YWx1ZSBpcyAiLAorICAgICAgICAgICAgICAgICAgICAgZGF0YS5WYWx1ZUFzU3RyaW5nT3JEZWZhdWx0KCIiKSkpOworICB9CisKKyAgLy8gVE9ETyh0c3VuKTogZmlndXJlIG91dCBob3cgdG8gZG8gcHJvdG8gZGVzY3JpcHRvciBiYXNlZCBzbmFrZSBjYXNlCisgIC8vIGNvbnZlcnNpb25zIGFzIG11Y2ggYXMgcG9zc2libGUuIEJlY2F1c2UgVG9TbmFrZUNhc2Ugc29tZXRpbWVzIHJldHVybnMgdGhlCisgIC8vIHdyb25nIHZhbHVlLgorICByZXR1cm4gRGVjb2RlQ29tcGFjdEZpZWxkTWFza1BhdGhzKGRhdGEuc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCZSZW5kZXJPbmVGaWVsZFBhdGgsIG93LCBfMSkpOworfQorCitTdGF0dXMgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlJlbmRlckR1cmF0aW9uKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyKiBvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YVBpZWNlJiBkYXRhKSB7CisgIGlmIChkYXRhLnR5cGUoKSA9PSBEYXRhUGllY2U6OlRZUEVfTlVMTCkgcmV0dXJuIFN0YXR1cygpOworICBpZiAoZGF0YS50eXBlKCkgIT0gRGF0YVBpZWNlOjpUWVBFX1NUUklORykgeworICAgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigKKyAgICAgICAgU3RyQ2F0KCJJbnZhbGlkIGRhdGEgdHlwZSBmb3IgZHVyYXRpb24sIHZhbHVlIGlzICIsCisgICAgICAgICAgICAgICAgICAgICBkYXRhLlZhbHVlQXNTdHJpbmdPckRlZmF1bHQoIiIpKSk7CisgIH0KKworICBTdHJpbmdQaWVjZSB2YWx1ZShkYXRhLnN0cigpKTsKKworICBpZiAoIUhhc1N1ZmZpeFN0cmluZyh2YWx1ZSwgInMiKSkgeworICAgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigKKyAgICAgICAgIklsbGVnYWwgZHVyYXRpb24gZm9ybWF0OyBkdXJhdGlvbiBtdXN0IGVuZCB3aXRoICdzJyIpOworICB9CisgIHZhbHVlID0gdmFsdWUuc3Vic3RyKDAsIHZhbHVlLnNpemUoKSAtIDEpOworICBpbnQgc2lnbiA9IDE7CisgIGlmIChIYXNQcmVmaXhTdHJpbmcodmFsdWUsICItIikpIHsKKyAgICBzaWduID0gLTE7CisgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHIoMSk7CisgIH0KKworICBTdHJpbmdQaWVjZSBzX3NlY3MsIHNfbmFub3M7CisgIFNwbGl0U2Vjb25kc0FuZE5hbm9zKHZhbHVlLCAmc19zZWNzLCAmc19uYW5vcyk7CisgIHVpbnQ2NF90IHVuc2lnbmVkX3NlY29uZHM7CisgIGlmICghc2FmZV9zdHJ0b3U2NChzX3NlY3MsICZ1bnNpZ25lZF9zZWNvbmRzKSkgeworICAgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigKKyAgICAgICAgIkludmFsaWQgZHVyYXRpb24gZm9ybWF0LCBmYWlsZWQgdG8gcGFyc2Ugc2Vjb25kcyIpOworICB9CisKKyAgaW50MzJfdCBuYW5vcyA9IDA7CisgIFN0YXR1cyBuYW5vc19zdGF0dXMgPSBHZXROYW5vc0Zyb21TdHJpbmdQaWVjZSgKKyAgICAgIHNfbmFub3MsICJJbnZhbGlkIGR1cmF0aW9uIGZvcm1hdCwgZmFpbGVkIHRvIHBhcnNlIG5hbm8gc2Vjb25kcyIsCisgICAgICAiRHVyYXRpb24gdmFsdWUgZXhjZWVkcyBsaW1pdHMiLCAmbmFub3MpOworICBpZiAoIW5hbm9zX3N0YXR1cy5vaygpKSB7CisgICAgcmV0dXJuIG5hbm9zX3N0YXR1czsKKyAgfQorICBuYW5vcyA9IHNpZ24gKiBuYW5vczsKKworICBpbnQ2NF90IHNlY29uZHMgPSBzaWduICogdW5zaWduZWRfc2Vjb25kczsKKyAgaWYgKHNlY29uZHMgPiBrRHVyYXRpb25NYXhTZWNvbmRzIHx8IHNlY29uZHMgPCBrRHVyYXRpb25NaW5TZWNvbmRzIHx8CisgICAgICBuYW5vcyA8PSAta05hbm9zUGVyU2Vjb25kIHx8IG5hbm9zID49IGtOYW5vc1BlclNlY29uZCkgeworICAgIHJldHVybiB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigiRHVyYXRpb24gdmFsdWUgZXhjZWVkcyBsaW1pdHMiKTsKKyAgfQorCisgIG93LT5Qcm90b1dyaXRlcjo6UmVuZGVyRGF0YVBpZWNlKCJzZWNvbmRzIiwgRGF0YVBpZWNlKHNlY29uZHMpKTsKKyAgb3ctPlByb3RvV3JpdGVyOjpSZW5kZXJEYXRhUGllY2UoIm5hbm9zIiwgRGF0YVBpZWNlKG5hbm9zKSk7CisgIHJldHVybiBTdGF0dXMoKTsKK30KKworU3RhdHVzIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpSZW5kZXJXcmFwcGVyVHlwZShQcm90b1N0cmVhbU9iamVjdFdyaXRlciogb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFQaWVjZSYgZGF0YSkgeworICBpZiAoZGF0YS50eXBlKCkgPT0gRGF0YVBpZWNlOjpUWVBFX05VTEwpIHJldHVybiBTdGF0dXMoKTsKKyAgb3ctPlByb3RvV3JpdGVyOjpSZW5kZXJEYXRhUGllY2UoInZhbHVlIiwgZGF0YSk7CisgIHJldHVybiBTdGF0dXMoKTsKK30KKworUHJvdG9TdHJlYW1PYmplY3RXcml0ZXIqIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpSZW5kZXJEYXRhUGllY2UoCisgICAgU3RyaW5nUGllY2UgbmFtZSwgY29uc3QgRGF0YVBpZWNlJiBkYXRhKSB7CisgIFN0YXR1cyBzdGF0dXM7CisgIGlmIChpbnZhbGlkX2RlcHRoKCkgPiAwKSByZXR1cm4gdGhpczsKKworICBpZiAoY3VycmVudF8gPT0gbnVsbHB0cikgeworICAgIGNvbnN0IFR5cGVSZW5kZXJlciogdHlwZV9yZW5kZXJlciA9CisgICAgICAgIEZpbmRUeXBlUmVuZGVyZXIoR2V0RnVsbFR5cGVXaXRoVXJsKG1hc3Rlcl90eXBlXy5uYW1lKCkpKTsKKyAgICBpZiAodHlwZV9yZW5kZXJlciA9PSBudWxscHRyKSB7CisgICAgICBJbnZhbGlkTmFtZShuYW1lLCAiUm9vdCBlbGVtZW50IG11c3QgYmUgYSBtZXNzYWdlLiIpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIC8vIFJlbmRlciB0aGUgc3BlY2lhbCB0eXBlLgorICAgIC8vICI8bmFtZT4iOiB7CisgICAgLy8gICAuLi4gUmVuZGVyIHNwZWNpYWwgdHlwZSAuLi4KKyAgICAvLyB9CisgICAgUHJvdG9Xcml0ZXI6OlN0YXJ0T2JqZWN0KG5hbWUpOworICAgIHN0YXR1cyA9ICgqdHlwZV9yZW5kZXJlcikodGhpcywgZGF0YSk7CisgICAgaWYgKCFzdGF0dXMub2soKSkgeworICAgICAgSW52YWxpZFZhbHVlKG1hc3Rlcl90eXBlXy5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgU3RyQ2F0KCJGaWVsZCAnIiwgbmFtZSwgIicsICIsIHN0YXR1cy5tZXNzYWdlKCkpKTsKKyAgICB9CisgICAgUHJvdG9Xcml0ZXI6OkVuZE9iamVjdCgpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgaWYgKGN1cnJlbnRfLT5Jc0FueSgpKSB7CisgICAgY3VycmVudF8tPmFueSgpLT5SZW5kZXJEYXRhUGllY2UobmFtZSwgZGF0YSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogZmllbGQgPSBudWxscHRyOworICBpZiAoY3VycmVudF8tPklzTWFwKCkpIHsKKyAgICBpZiAoIVZhbGlkTWFwS2V5KG5hbWUpKSByZXR1cm4gdGhpczsKKworICAgIGZpZWxkID0gTG9va3VwKCJ2YWx1ZSIpOworICAgIGlmIChmaWVsZCA9PSBudWxscHRyKSB7CisgICAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIk1hcCBkb2VzIG5vdCBoYXZlIGEgdmFsdWUgZmllbGQuIjsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIGlmIChvcHRpb25zXy5pZ25vcmVfbnVsbF92YWx1ZV9tYXBfZW50cnkpIHsKKyAgICAgIC8vIElmIHdlIGFyZSByZW5kZXJpbmcgZXhwbGljaXQgbnVsbCB2YWx1ZXMgYW5kIHRoZSBiYWNrZW5kIHByb3RvIGZpZWxkIGlzCisgICAgICAvLyBub3Qgb2YgdGhlIGdvb2dsZS5wcm90b2J1Zi5OdWxsVHlwZSB0eXBlLCBpbnRlcnByZXQgbnVsbCBhcyBhYnNlbmNlLgorICAgICAgaWYgKGRhdGEudHlwZSgpID09IERhdGFQaWVjZTo6VFlQRV9OVUxMICYmCisgICAgICAgICAgZmllbGQtPnR5cGVfdXJsKCkgIT0ga1N0cnVjdE51bGxWYWx1ZVR5cGVVcmwpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisgICAgfQorCisgICAgLy8gUmVuZGVyIGFuIGl0ZW0gaW4gcmVwZWF0ZWQgbWFwIGxpc3QuCisgICAgLy8geyAia2V5IjogIjxuYW1lPiIsICJ2YWx1ZSI6CisgICAgUHVzaCgiIiwgSXRlbTo6TUVTU0FHRSwgZmFsc2UsIGZhbHNlKTsKKyAgICBQcm90b1dyaXRlcjo6UmVuZGVyRGF0YVBpZWNlKCJrZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVBpZWNlKG5hbWUsIHVzZV9zdHJpY3RfYmFzZTY0X2RlY29kaW5nKCkpKTsKKworICAgIGNvbnN0IFR5cGVSZW5kZXJlciogdHlwZV9yZW5kZXJlciA9IEZpbmRUeXBlUmVuZGVyZXIoZmllbGQtPnR5cGVfdXJsKCkpOworICAgIGlmICh0eXBlX3JlbmRlcmVyICE9IG51bGxwdHIpIHsKKyAgICAgIC8vIE1hcCdzIHZhbHVlIHR5cGUgaXMgYSBzcGVjaWFsIHR5cGUuIFJlbmRlciBpdCBsaWtlIGEgbWVzc2FnZToKKyAgICAgIC8vICJ2YWx1ZSI6IHsKKyAgICAgIC8vICAgLi4uIFJlbmRlciBzcGVjaWFsIHR5cGUgLi4uCisgICAgICAvLyB9CisgICAgICBQdXNoKCJ2YWx1ZSIsIEl0ZW06Ok1FU1NBR0UsIHRydWUsIGZhbHNlKTsKKyAgICAgIHN0YXR1cyA9ICgqdHlwZV9yZW5kZXJlcikodGhpcywgZGF0YSk7CisgICAgICBpZiAoIXN0YXR1cy5vaygpKSB7CisgICAgICAgIEludmFsaWRWYWx1ZShmaWVsZC0+dHlwZV91cmwoKSwKKyAgICAgICAgICAgICAgICAgICAgIFN0ckNhdCgiRmllbGQgJyIsIG5hbWUsICInLCAiLCBzdGF0dXMubWVzc2FnZSgpKSk7CisgICAgICB9CisgICAgICBQb3AoKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8vIElmIHdlIGFyZSByZW5kZXJpbmcgZXhwbGljaXQgbnVsbCB2YWx1ZXMgYW5kIHRoZSBiYWNrZW5kIHByb3RvIGZpZWxkIGlzCisgICAgLy8gbm90IG9mIHRoZSBnb29nbGUucHJvdG9idWYuTnVsbFR5cGUgdHlwZSwgd2UgZG8gbm90aGluZy4KKyAgICBpZiAoZGF0YS50eXBlKCkgPT0gRGF0YVBpZWNlOjpUWVBFX05VTEwgJiYKKyAgICAgICAgZmllbGQtPnR5cGVfdXJsKCkgIT0ga1N0cnVjdE51bGxWYWx1ZVR5cGVVcmwpIHsKKyAgICAgIFBvcCgpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLy8gUmVuZGVyIHRoZSBtYXAgdmFsdWUgYXMgYSBwcmltaXRpdmUgdHlwZS4KKyAgICBQcm90b1dyaXRlcjo6UmVuZGVyRGF0YVBpZWNlKCJ2YWx1ZSIsIGRhdGEpOworICAgIFBvcCgpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgZmllbGQgPSBMb29rdXAobmFtZSk7CisgIGlmIChmaWVsZCA9PSBudWxscHRyKSByZXR1cm4gdGhpczsKKworICAvLyBDaGVjayBpZiB0aGUgZmllbGQgaXMgb2Ygc3BlY2lhbCB0eXBlLiBSZW5kZXIgaXQgYWNjb3JkaW5nbHkgaWYgc28uCisgIGNvbnN0IFR5cGVSZW5kZXJlciogdHlwZV9yZW5kZXJlciA9IEZpbmRUeXBlUmVuZGVyZXIoZmllbGQtPnR5cGVfdXJsKCkpOworICBpZiAodHlwZV9yZW5kZXJlciAhPSBudWxscHRyKSB7CisgICAgLy8gUGFzcyB0aHJvdWdoIG51bGwgdmFsdWUgb25seSBmb3IgZ29vZ2xlLnByb3RvYnVmLlZhbHVlLiBGb3Igb3RoZXIKKyAgICAvLyB0eXBlcyB3ZSBpZ25vcmUgbnVsbCB2YWx1ZSBqdXN0IGxpa2UgZm9yIHJlZ3VsYXIgZmllbGQgdHlwZXMuCisgICAgaWYgKGRhdGEudHlwZSgpICE9IERhdGFQaWVjZTo6VFlQRV9OVUxMIHx8CisgICAgICAgIGZpZWxkLT50eXBlX3VybCgpID09IGtTdHJ1Y3RWYWx1ZVR5cGVVcmwpIHsKKyAgICAgIFB1c2gobmFtZSwgSXRlbTo6TUVTU0FHRSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgIHN0YXR1cyA9ICgqdHlwZV9yZW5kZXJlcikodGhpcywgZGF0YSk7CisgICAgICBpZiAoIXN0YXR1cy5vaygpKSB7CisgICAgICAgIEludmFsaWRWYWx1ZShmaWVsZC0+dHlwZV91cmwoKSwKKyAgICAgICAgICAgICAgICAgICAgIFN0ckNhdCgiRmllbGQgJyIsIG5hbWUsICInLCAiLCBzdGF0dXMubWVzc2FnZSgpKSk7CisgICAgICB9CisgICAgICBQb3AoKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvLyBJZiB3ZSBhcmUgcmVuZGVyaW5nIGV4cGxpY2l0IG51bGwgdmFsdWVzIGFuZCB0aGUgYmFja2VuZCBwcm90byBmaWVsZCBpcworICAvLyBub3Qgb2YgdGhlIGdvb2dsZS5wcm90b2J1Zi5OdWxsVHlwZSB0eXBlLCB3ZSBkbyBub3RoaW5nLgorICBpZiAoZGF0YS50eXBlKCkgPT0gRGF0YVBpZWNlOjpUWVBFX05VTEwgJiYKKyAgICAgIGZpZWxkLT50eXBlX3VybCgpICE9IGtTdHJ1Y3ROdWxsVmFsdWVUeXBlVXJsKSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBpZiAoSXNSZXBlYXRlZCgqZmllbGQpICYmICFjdXJyZW50Xy0+aXNfbGlzdCgpKSB7CisgICAgaWYgKG9wdGlvbnNfLmRpc2FibGVfaW1wbGljaXRfc2NhbGFyX2xpc3QpIHsKKyAgICAgIGlmICghb3B0aW9uc18uc3VwcHJlc3NfaW1wbGljaXRfc2NhbGFyX2xpc3RfZXJyb3IpIHsKKyAgICAgICAgSW52YWxpZFZhbHVlKAorICAgICAgICAgICAgZmllbGQtPm5hbWUoKSwKKyAgICAgICAgICAgICJTdGFydGluZyBhbiBwcmltaXRpdmUgaW4gYSByZXBlYXRlZCBmaWVsZCBidXQgdGhlIHBhcmVudCBmaWVsZCAiCisgICAgICAgICAgICAiaXMgbm90IGEgbGlzdCIpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgIH0KKworICBQcm90b1dyaXRlcjo6UmVuZGVyRGF0YVBpZWNlKG5hbWUsIGRhdGEpOworICByZXR1cm4gdGhpczsKK30KKworLy8gTWFwIG9mIGZ1bmN0aW9ucyB0aGF0IGFyZSByZXNwb25zaWJsZSBmb3IgcmVuZGVyaW5nIHdlbGwga25vd24gdHlwZQorLy8gcmVwcmVzZW50ZWQgYnkgdGhlIGtleS4KK3N0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlR5cGVSZW5kZXJlcj4qCisgICAgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OnJlbmRlcmVyc18gPSBudWxscHRyOworUFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6b25jZV9mbGFnIHdyaXRlcl9yZW5kZXJlcnNfaW5pdF87CisKK3ZvaWQgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OkluaXRSZW5kZXJlck1hcCgpIHsKKyAgcmVuZGVyZXJzXyA9IG5ldyBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpUeXBlUmVuZGVyZXI+KCk7CisgICgqcmVuZGVyZXJzXylbInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJdID0KKyAgICAgICZQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6UmVuZGVyVGltZXN0YW1wOworICAoKnJlbmRlcmVyc18pWyJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiJdID0KKyAgICAgICZQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6UmVuZGVyRHVyYXRpb247CisgICgqcmVuZGVyZXJzXylbInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayJdID0KKyAgICAgICZQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6UmVuZGVyRmllbGRNYXNrOworICAoKnJlbmRlcmVyc18pWyJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5Eb3VibGUiXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlJlbmRlcldyYXBwZXJUeXBlOworICAoKnJlbmRlcmVyc18pWyJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5GbG9hdCJdID0KKyAgICAgICZQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6UmVuZGVyV3JhcHBlclR5cGU7CisgICgqcmVuZGVyZXJzXylbInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkludDY0Il0gPQorICAgICAgJlByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpSZW5kZXJXcmFwcGVyVHlwZTsKKyAgKCpyZW5kZXJlcnNfKVsidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVUludDY0Il0gPQorICAgICAgJlByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpSZW5kZXJXcmFwcGVyVHlwZTsKKyAgKCpyZW5kZXJlcnNfKVsidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuSW50MzIiXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlJlbmRlcldyYXBwZXJUeXBlOworICAoKnJlbmRlcmVyc18pWyJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5VSW50MzIiXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlJlbmRlcldyYXBwZXJUeXBlOworICAoKnJlbmRlcmVyc18pWyJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5Cb29sIl0gPQorICAgICAgJlByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpSZW5kZXJXcmFwcGVyVHlwZTsKKyAgKCpyZW5kZXJlcnNfKVsidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuU3RyaW5nIl0gPQorICAgICAgJlByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpSZW5kZXJXcmFwcGVyVHlwZTsKKyAgKCpyZW5kZXJlcnNfKVsidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuQnl0ZXMiXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlJlbmRlcldyYXBwZXJUeXBlOworICAoKnJlbmRlcmVyc18pWyJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSJdID0KKyAgICAgICZQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6UmVuZGVyV3JhcHBlclR5cGU7CisgICgqcmVuZGVyZXJzXylbInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkZsb2F0VmFsdWUiXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlJlbmRlcldyYXBwZXJUeXBlOworICAoKnJlbmRlcmVyc18pWyJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlIl0gPQorICAgICAgJlByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpSZW5kZXJXcmFwcGVyVHlwZTsKKyAgKCpyZW5kZXJlcnNfKVsidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUiXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlJlbmRlcldyYXBwZXJUeXBlOworICAoKnJlbmRlcmVyc18pWyJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIl0gPQorICAgICAgJlByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpSZW5kZXJXcmFwcGVyVHlwZTsKKyAgKCpyZW5kZXJlcnNfKVsidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUiXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlJlbmRlcldyYXBwZXJUeXBlOworICAoKnJlbmRlcmVyc18pWyJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUiXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlJlbmRlcldyYXBwZXJUeXBlOworICAoKnJlbmRlcmVyc18pWyJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZSJdID0KKyAgICAgICZQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6UmVuZGVyV3JhcHBlclR5cGU7CisgICgqcmVuZGVyZXJzXylbInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkJ5dGVzVmFsdWUiXSA9CisgICAgICAmUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlJlbmRlcldyYXBwZXJUeXBlOworICAoKnJlbmRlcmVyc18pWyJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5WYWx1ZSJdID0KKyAgICAgICZQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6UmVuZGVyU3RydWN0VmFsdWU7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok9uU2h1dGRvd24oJkRlbGV0ZVJlbmRlcmVyTWFwKTsKK30KKwordm9pZCBQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6RGVsZXRlUmVuZGVyZXJNYXAoKSB7CisgIGRlbGV0ZSBQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6cmVuZGVyZXJzXzsKKyAgcmVuZGVyZXJzXyA9IG51bGxwdHI7Cit9CisKK1Byb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpUeXBlUmVuZGVyZXIqCitQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6RmluZFR5cGVSZW5kZXJlcihjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV91cmwpIHsKKyAgUFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Y2FsbF9vbmNlKHdyaXRlcl9yZW5kZXJlcnNfaW5pdF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0UmVuZGVyZXJNYXApOworICByZXR1cm4gRmluZE9yTnVsbCgqcmVuZGVyZXJzXywgdHlwZV91cmwpOworfQorCitib29sIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpWYWxpZE1hcEtleShTdHJpbmdQaWVjZSB1bm5vcm1hbGl6ZWRfbmFtZSkgeworICBpZiAoY3VycmVudF8gPT0gbnVsbHB0cikgcmV0dXJuIHRydWU7CisKKyAgaWYgKCFjdXJyZW50Xy0+SW5zZXJ0TWFwS2V5SWZOb3RQcmVzZW50KHVubm9ybWFsaXplZF9uYW1lKSkgeworICAgIGxpc3RlbmVyKCktPkludmFsaWROYW1lKAorICAgICAgICBsb2NhdGlvbigpLCB1bm5vcm1hbGl6ZWRfbmFtZSwKKyAgICAgICAgU3RyQ2F0KCJSZXBlYXRlZCBtYXAga2V5OiAnIiwgdW5ub3JtYWxpemVkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAiJyBpcyBhbHJlYWR5IHNldC4iKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OlB1c2goCisgICAgU3RyaW5nUGllY2UgbmFtZSwgSXRlbTo6SXRlbVR5cGUgaXRlbV90eXBlLCBib29sIGlzX3BsYWNlaG9sZGVyLAorICAgIGJvb2wgaXNfbGlzdCkgeworICBpc19saXN0ID8gUHJvdG9Xcml0ZXI6OlN0YXJ0TGlzdChuYW1lKSA6IFByb3RvV3JpdGVyOjpTdGFydE9iamVjdChuYW1lKTsKKworICAvLyBpbnZhbGlkX2RlcHRoID09IDAgbWVhbnMgaXQgaXMgYSBzdWNjZXNzZnVsIFN0YXJ0T2JqZWN0IG9yIFN0YXJ0TGlzdC4KKyAgaWYgKGludmFsaWRfZGVwdGgoKSA9PSAwKQorICAgIGN1cnJlbnRfLnJlc2V0KAorICAgICAgICBuZXcgSXRlbShjdXJyZW50Xy5yZWxlYXNlKCksIGl0ZW1fdHlwZSwgaXNfcGxhY2Vob2xkZXIsIGlzX2xpc3QpKTsKK30KKwordm9pZCBQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6UG9wKCkgeworICAvLyBQb3AgYWxsIHBsYWNlaG9sZGVyIGl0ZW1zIHNlbmRpbmcgU3RhcnRPYmplY3Qgb3IgU3RhcnRMaXN0IGV2ZW50cyB0bworICAvLyBQcm90b1dyaXRlciBhY2NvcmRpbmcgdG8gaXNfbGlzdCB2YWx1ZS4KKyAgd2hpbGUgKGN1cnJlbnRfICE9IG51bGxwdHIgJiYgY3VycmVudF8tPmlzX3BsYWNlaG9sZGVyKCkpIHsKKyAgICBQb3BPbmVFbGVtZW50KCk7CisgIH0KKyAgaWYgKGN1cnJlbnRfICE9IG51bGxwdHIpIHsKKyAgICBQb3BPbmVFbGVtZW50KCk7CisgIH0KK30KKwordm9pZCBQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6UG9wT25lRWxlbWVudCgpIHsKKyAgY3VycmVudF8tPmlzX2xpc3QoKSA/IFByb3RvV3JpdGVyOjpFbmRMaXN0KCkgOiBQcm90b1dyaXRlcjo6RW5kT2JqZWN0KCk7CisgIGN1cnJlbnRfLnJlc2V0KGN1cnJlbnRfLT5wb3A8SXRlbT4oKSk7Cit9CisKK2Jvb2wgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OklzTWFwKGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCkgeworICBpZiAoZmllbGQudHlwZV91cmwoKS5lbXB0eSgpIHx8CisgICAgICBmaWVsZC5raW5kKCkgIT0gZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQ6OlRZUEVfTUVTU0FHRSB8fAorICAgICAgZmllbGQuY2FyZGluYWxpdHkoKSAhPSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6Q0FSRElOQUxJVFlfUkVQRUFURUQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogZmllbGRfdHlwZSA9CisgICAgICB0eXBlaW5mbygpLT5HZXRUeXBlQnlUeXBlVXJsKGZpZWxkLnR5cGVfdXJsKCkpOworCisgIHJldHVybiBjb252ZXJ0ZXI6OklzTWFwKGZpZWxkLCAqZmllbGRfdHlwZSk7Cit9CisKK2Jvb2wgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OklzQW55KGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCkgeworICByZXR1cm4gR2V0VHlwZVdpdGhvdXRVcmwoZmllbGQudHlwZV91cmwoKSkgPT0ga0FueVR5cGU7Cit9CisKK2Jvb2wgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OklzU3RydWN0KGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCkgeworICByZXR1cm4gR2V0VHlwZVdpdGhvdXRVcmwoZmllbGQudHlwZV91cmwoKSkgPT0ga1N0cnVjdFR5cGU7Cit9CisKK2Jvb2wgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6OklzU3RydWN0VmFsdWUoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQmIGZpZWxkKSB7CisgIHJldHVybiBHZXRUeXBlV2l0aG91dFVybChmaWVsZC50eXBlX3VybCgpKSA9PSBrU3RydWN0VmFsdWVUeXBlOworfQorCitib29sIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpJc1N0cnVjdExpc3RWYWx1ZSgKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCYgZmllbGQpIHsKKyAgcmV0dXJuIEdldFR5cGVXaXRob3V0VXJsKGZpZWxkLnR5cGVfdXJsKCkpID09IGtTdHJ1Y3RMaXN0VmFsdWVUeXBlOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29udmVydGVyCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyNTE3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuaApAQCAtMCwwICsxLDQ1MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfUFJPVE9TVFJFQU1fT0JKRUNUV1JJVEVSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9QUk9UT1NUUkVBTV9PQkpFQ1RXUklURVJfSF9fCisKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90eXBlLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RhdGFwaWVjZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2Vycm9yX2xpc3RlbmVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9fd3JpdGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvc3RydWN0dXJlZF9vYmplY3R3cml0ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm8uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBjb252ZXJ0ZXIgeworCitjbGFzcyBPYmplY3RMb2NhdGlvblRyYWNrZXI7CisKKy8vIEFuIE9iamVjdFdyaXRlciB0aGF0IGNhbiB3cml0ZSBwcm90b2J1ZiBieXRlcyBkaXJlY3RseSBmcm9tIHdyaXRlciBldmVudHMuCisvLyBUaGlzIGNsYXNzIHN1cHBvcnRzIGFsbCBzcGVjaWFsIHR5cGVzIGxpa2UgU3RydWN0IGFuZCBNYXAuIEl0IHVzZXMKKy8vIHRoZSBQcm90b1dyaXRlciBjbGFzcyB0byB3cml0ZSByYXcgcHJvdG8gYnl0ZXMuCisvLworLy8gSXQgYWxzbyBzdXBwb3J0cyBzdHJlYW1pbmcuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXIgOiBwdWJsaWMgUHJvdG9Xcml0ZXIgeworIHB1YmxpYzoKKyAgLy8gT3B0aW9ucyB0aGF0IGNvbnRyb2wgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXIgY2xhc3MncyBiZWhhdmlvci4KKyAgc3RydWN0IE9wdGlvbnMgeworICAgIC8vIFRyZWF0cyBudW1lcmljIGlucHV0cyBpbiBnb29nbGUucHJvdG9idWYuU3RydWN0IGFzIHN0cmluZ3MuIE5vcm1hbGx5LAorICAgIC8vIG51bWVyaWMgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiBkb3VibGUgZmllbGQgIm51bWJlcl92YWx1ZSIgb2YKKyAgICAvLyBnb29nbGUucHJvdG9idWYuU3RydWN0LiBIb3dldmVyLCB0aGlzIGNhbiBjYXVzZSBwcmVjaXNpb24gbG9zcyBmb3IKKyAgICAvLyBpbnQ2NC91aW50NjQvZG91YmxlIGlucHV0cy4gVGhpcyBvcHRpb24gaXMgcHJvdmlkZWQgZm9yIGNhc2VzIHRoYXQgd2FudAorICAgIC8vIHRvIHByZXNlcnZlIG51bWJlciBwcmVjaXNpb24uCisgICAgLy8KKyAgICAvLyBUT0RPKHNrYXJ2YWplKTogUmVuYW1lIHRvIHN0cnVjdF9udW1iZXJzX2FzX3N0cmluZ3MgYXMgaXQgY292ZXJzIGRvdWJsZQorICAgIC8vIGFzIHdlbGwuCisgICAgYm9vbCBzdHJ1Y3RfaW50ZWdlcnNfYXNfc3RyaW5nczsKKworICAgIC8vIE5vdCB0cmVhdCB1bmtub3duIGZpZWxkcyBhcyBhbiBlcnJvci4gSWYgdGhlcmUgaXMgYW4gdW5rbm93biBmaWVsZHMsCisgICAgLy8ganVzdCBpZ25vcmUgaXQgYW5kIGNvbnRpbnVlIHRvIHByb2Nlc3MgdGhlIHJlc3QuIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QKKyAgICAvLyBhcHBseSB0byB1bmtub3duIGVudW0gdmFsdWVzLgorICAgIGJvb2wgaWdub3JlX3Vua25vd25fZmllbGRzOworCisgICAgLy8gSWdub3JlIHVua25vd24gZW51bSB2YWx1ZXMuCisgICAgYm9vbCBpZ25vcmVfdW5rbm93bl9lbnVtX3ZhbHVlczsKKworICAgIC8vIElmIHRydWUsIGNoZWNrIGlmIGVudW0gbmFtZSBpbiBjYW1lbCBjYXNlIG9yIHdpdGhvdXQgdW5kZXJzY29yZSBtYXRjaGVzCisgICAgLy8gdGhlIGZpZWxkIG5hbWUuCisgICAgYm9vbCB1c2VfbG93ZXJfY2FtZWxfZm9yX2VudW1zOworCisgICAgLy8gSWYgdHJ1ZSwgY2hlY2sgaWYgZW51bSBuYW1lIGluIFVQUEVSX0NBU0UgbWF0Y2hlcyB0aGUgZmllbGQgbmFtZS4KKyAgICBib29sIGNhc2VfaW5zZW5zaXRpdmVfZW51bV9wYXJzaW5nOworCisgICAgLy8gSWYgdHJ1ZSwgc2tpcHMgcmVuZGVyaW5nIHRoZSBtYXAgZW50cnkgaWYgbWFwIHZhbHVlIGlzIG51bGwgdW5sZXNzIHRoZQorICAgIC8vIHZhbHVlIHR5cGUgaXMgZ29vZ2xlLnByb3RvYnVmLk51bGxUeXBlLgorICAgIGJvb2wgaWdub3JlX251bGxfdmFsdWVfbWFwX2VudHJ5OworCisgICAgLy8gSWYgdHJ1ZSwgYWNjZXB0cyByZXBlYXRlZCBrZXkvdmFsdWUgcGFpciBmb3IgYSBtYXAgcHJvdG8gZmllbGQuCisgICAgYm9vbCB1c2VfbGVnYWN5X2pzb25fbWFwX2Zvcm1hdDsKKworICAgIC8vIElmIHRydWUsIGRpc2FibGUgaW1wbGljaXRseSBjcmVhdGluZyBtZXNzYWdlIGxpc3QuCisgICAgYm9vbCBkaXNhYmxlX2ltcGxpY2l0X21lc3NhZ2VfbGlzdDsKKworICAgIC8vIElmIHRydWUsIHN1cHByZXNzIHRoZSBlcnJvciBvZiBpbXBsaWNpdGx5IGNyZWF0aW5nIG1lc3NhZ2UgbGlzdCB3aGVuIGl0CisgICAgLy8gaXMgZGlzYWJsZWQuCisgICAgYm9vbCBzdXBwcmVzc19pbXBsaWNpdF9tZXNzYWdlX2xpc3RfZXJyb3I7CisKKyAgICAvLyBJZiB0cnVlLCBkaXNhYmxlIGltcGxpY2l0bHkgY3JlYXRpbmcgc2NhbGFyIGxpc3QuCisgICAgYm9vbCBkaXNhYmxlX2ltcGxpY2l0X3NjYWxhcl9saXN0OworCisgICAgLy8gSWYgdHJ1ZSwgc3VwcHJlc3MgdGhlIGVycm9yIG9mIGltcGxpY2l0bHkgY3JlYXRpbmcgc2NhbGFyIGxpc3Qgd2hlbiBpdAorICAgIC8vIGlzIGRpc2FibGVkLgorICAgIGJvb2wgc3VwcHJlc3NfaW1wbGljaXRfc2NhbGFyX2xpc3RfZXJyb3I7CisKKyAgICAvLyBJZiB0cnVlLCBzdXBwcmVzcyB0aGUgZXJyb3Igb2YgcmVuZGVyaW5nIHNjYWxhciBmaWVsZCBpZiB0aGUgc291cmNlIGlzIGFuCisgICAgLy8gb2JqZWN0LgorICAgIGJvb2wgc3VwcHJlc3Nfb2JqZWN0X3RvX3NjYWxhcl9lcnJvcjsKKworICAgIC8vIElmIHRydWUsIHVzZSB0aGUganNvbiBuYW1lIGluIG1pc3NpbmcgZmllbGRzIGVycm9ycy4KKyAgICBib29sIHVzZV9qc29uX25hbWVfaW5fbWlzc2luZ19maWVsZHM7CisKKyAgICBPcHRpb25zKCkKKyAgICAgICAgOiBzdHJ1Y3RfaW50ZWdlcnNfYXNfc3RyaW5ncyhmYWxzZSksCisgICAgICAgICAgaWdub3JlX3Vua25vd25fZmllbGRzKGZhbHNlKSwKKyAgICAgICAgICBpZ25vcmVfdW5rbm93bl9lbnVtX3ZhbHVlcyhmYWxzZSksCisgICAgICAgICAgdXNlX2xvd2VyX2NhbWVsX2Zvcl9lbnVtcyhmYWxzZSksCisgICAgICAgICAgY2FzZV9pbnNlbnNpdGl2ZV9lbnVtX3BhcnNpbmcoZmFsc2UpLAorICAgICAgICAgIGlnbm9yZV9udWxsX3ZhbHVlX21hcF9lbnRyeShmYWxzZSksCisgICAgICAgICAgdXNlX2xlZ2FjeV9qc29uX21hcF9mb3JtYXQoZmFsc2UpLAorICAgICAgICAgIGRpc2FibGVfaW1wbGljaXRfbWVzc2FnZV9saXN0KGZhbHNlKSwKKyAgICAgICAgICBzdXBwcmVzc19pbXBsaWNpdF9tZXNzYWdlX2xpc3RfZXJyb3IoZmFsc2UpLAorICAgICAgICAgIGRpc2FibGVfaW1wbGljaXRfc2NhbGFyX2xpc3QoZmFsc2UpLAorICAgICAgICAgIHN1cHByZXNzX2ltcGxpY2l0X3NjYWxhcl9saXN0X2Vycm9yKGZhbHNlKSwKKyAgICAgICAgICBzdXBwcmVzc19vYmplY3RfdG9fc2NhbGFyX2Vycm9yKGZhbHNlKSwKKyAgICAgICAgICB1c2VfanNvbl9uYW1lX2luX21pc3NpbmdfZmllbGRzKGZhbHNlKSB7fQorCisgICAgLy8gRGVmYXVsdCBpbnN0YW5jZSBvZiBPcHRpb25zIHdpdGggYWxsIG9wdGlvbnMgc2V0IHRvIGRlZmF1bHRzLgorICAgIHN0YXRpYyBjb25zdCBPcHRpb25zJiBEZWZhdWx0cygpIHsKKyAgICAgIHN0YXRpYyBPcHRpb25zIGRlZmF1bHRzOworICAgICAgcmV0dXJuIGRlZmF1bHRzOworICAgIH0KKyAgfTsKKworICAvLyBDb25zdHJ1Y3Rvci4gRG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgYW55IHBhcmFtZXRlciBwYXNzZWQgaW4uCisgIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyKFR5cGVSZXNvbHZlciogdHlwZV9yZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nczo6Qnl0ZVNpbmsqIG91dHB1dCwgRXJyb3JMaXN0ZW5lciogbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpPcHRpb25zJiBvcHRpb25zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyOjpPcHRpb25zOjpEZWZhdWx0cygpKTsKKyAgflByb3RvU3RyZWFtT2JqZWN0V3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgLy8gT2JqZWN0V3JpdGVyIG1ldGhvZHMuCisgIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyKiBTdGFydE9iamVjdChTdHJpbmdQaWVjZSBuYW1lKSBvdmVycmlkZTsKKyAgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXIqIEVuZE9iamVjdCgpIG92ZXJyaWRlOworICBQcm90b1N0cmVhbU9iamVjdFdyaXRlciogU3RhcnRMaXN0KFN0cmluZ1BpZWNlIG5hbWUpIG92ZXJyaWRlOworICBQcm90b1N0cmVhbU9iamVjdFdyaXRlciogRW5kTGlzdCgpIG92ZXJyaWRlOworCisgIC8vIFJlbmRlcnMgYSBEYXRhUGllY2UgJ3ZhbHVlJyBpbnRvIGEgZmllbGQgd2hvc2Ugd2lyZSB0eXBlIGlzIGRldGVybWluZWQKKyAgLy8gZnJvbSB0aGUgZ2l2ZW4gZmllbGQgJ25hbWUnLgorICBQcm90b1N0cmVhbU9iamVjdFdyaXRlciogUmVuZGVyRGF0YVBpZWNlKFN0cmluZ1BpZWNlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YVBpZWNlJiBkYXRhKSBvdmVycmlkZTsKKworIHByb3RlY3RlZDoKKyAgLy8gRnVuY3Rpb24gdGhhdCByZW5kZXJzIGEgd2VsbCBrbm93biB0eXBlIHdpdGggbW9kaWZpZWQgYmVoYXZpb3IuCisgIHR5cGVkZWYgdXRpbDo6U3RhdHVzICgqVHlwZVJlbmRlcmVyKShQcm90b1N0cmVhbU9iamVjdFdyaXRlciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhUGllY2UmKTsKKworICAvLyBIYW5kbGVzIHdyaXRpbmcgQW55cyBvdXQgdXNpbmcgbmVzdGVkIG9iamVjdCB3cml0ZXJzIGFuZCB0aGUgbGlrZS4KKyAgY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEFueVdyaXRlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgQW55V3JpdGVyKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyKiBwYXJlbnQpOworICAgIH5BbnlXcml0ZXIoKTsKKworICAgIC8vIFBhc3NlcyBhIFN0YXJ0T2JqZWN0IGNhbGwgdGhyb3VnaCB0byB0aGUgQW55IHdyaXRlci4KKyAgICB2b2lkIFN0YXJ0T2JqZWN0KFN0cmluZ1BpZWNlIG5hbWUpOworCisgICAgLy8gUGFzc2VzIGFuIEVuZE9iamVjdCBjYWxsIHRocm91Z2ggdG8gdGhlIEFueS4gUmV0dXJucyB0cnVlIGlmIHRoZSBhbnkKKyAgICAvLyBoYW5kbGVkIHRoZSBFbmRPYmplY3QgY2FsbCwgZmFsc2UgaWYgdGhlIEFueSBpcyBub3cgYWxsIGRvbmUgYW5kIGlzIG5vCisgICAgLy8gbG9uZ2VyIG5lZWRlZC4KKyAgICBib29sIEVuZE9iamVjdCgpOworCisgICAgLy8gUGFzc2VzIGEgU3RhcnRMaXN0IGNhbGwgdGhyb3VnaCB0byB0aGUgQW55IHdyaXRlci4KKyAgICB2b2lkIFN0YXJ0TGlzdChTdHJpbmdQaWVjZSBuYW1lKTsKKworICAgIC8vIFBhc3NlcyBhbiBFbmRMaXN0IGNhbGwgdGhyb3VnaCB0byB0aGUgQW55IHdyaXRlci4KKyAgICB2b2lkIEVuZExpc3QoKTsKKworICAgIC8vIFJlbmRlcnMgYSBkYXRhIHBpZWNlIG9uIHRoZSBhbnkuCisgICAgdm9pZCBSZW5kZXJEYXRhUGllY2UoU3RyaW5nUGllY2UgbmFtZSwgY29uc3QgRGF0YVBpZWNlJiB2YWx1ZSk7CisKKyAgIHByaXZhdGU6CisgICAgLy8gQmVmb3JlIHRoZSAiQHR5cGUiIGZpZWxkIGlzIGVuY291bnRlcmVkLCB3ZSBzdG9yZSBhbGwgaW5jb21pbmcgZGF0YQorICAgIC8vIGludG8gdGhpcyBFdmVudCBzdHJ1Y3QgYW5kIHJlcGxheSB0aGVtIGFmdGVyIHdlIGdldCB0aGUgIkB0eXBlIiBmaWVsZC4KKyAgICBjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRXZlbnQgeworICAgICBwdWJsaWM6CisgICAgICBlbnVtIFR5cGUgeworICAgICAgICBTVEFSVF9PQkpFQ1QgPSAwLAorICAgICAgICBFTkRfT0JKRUNUID0gMSwKKyAgICAgICAgU1RBUlRfTElTVCA9IDIsCisgICAgICAgIEVORF9MSVNUID0gMywKKyAgICAgICAgUkVOREVSX0RBVEFfUElFQ0UgPSA0LAorICAgICAgfTsKKworICAgICAgLy8gQ29uc3RydWN0b3IgZm9yIEVORF9PQkpFQ1QgYW5kIEVORF9MSVNUIGV2ZW50cy4KKyAgICAgIGV4cGxpY2l0IEV2ZW50KFR5cGUgdHlwZSkgOiB0eXBlXyh0eXBlKSwgdmFsdWVfKERhdGFQaWVjZTo6TnVsbERhdGEoKSkge30KKworICAgICAgLy8gQ29uc3RydWN0b3IgZm9yIFNUQVJUX09CSkVDVCBhbmQgU1RBUlRfTElTVCBldmVudHMuCisgICAgICBleHBsaWNpdCBFdmVudChUeXBlIHR5cGUsIFN0cmluZ1BpZWNlIG5hbWUpCisgICAgICAgICAgOiB0eXBlXyh0eXBlKSwgbmFtZV8obmFtZSksIHZhbHVlXyhEYXRhUGllY2U6Ok51bGxEYXRhKCkpIHt9CisKKyAgICAgIC8vIENvbnN0cnVjdG9yIGZvciBSRU5ERVJfREFUQV9QSUVDRSBldmVudHMuCisgICAgICBleHBsaWNpdCBFdmVudChTdHJpbmdQaWVjZSBuYW1lLCBjb25zdCBEYXRhUGllY2UmIHZhbHVlKQorICAgICAgICAgIDogdHlwZV8oUkVOREVSX0RBVEFfUElFQ0UpLCBuYW1lXyhuYW1lKSwgdmFsdWVfKHZhbHVlKSB7CisgICAgICAgIERlZXBDb3B5KCk7CisgICAgICB9CisKKyAgICAgIEV2ZW50KGNvbnN0IEV2ZW50JiBvdGhlcikKKyAgICAgICAgICA6IHR5cGVfKG90aGVyLnR5cGVfKSwgbmFtZV8ob3RoZXIubmFtZV8pLCB2YWx1ZV8ob3RoZXIudmFsdWVfKSB7CisgICAgICAgIERlZXBDb3B5KCk7CisgICAgICB9CisKKyAgICAgIEV2ZW50JiBvcGVyYXRvcj0oY29uc3QgRXZlbnQmIG90aGVyKSB7CisgICAgICAgIHR5cGVfID0gb3RoZXIudHlwZV87CisgICAgICAgIG5hbWVfID0gb3RoZXIubmFtZV87CisgICAgICAgIHZhbHVlXyA9IG90aGVyLnZhbHVlXzsKKyAgICAgICAgRGVlcENvcHkoKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkIFJlcGxheShBbnlXcml0ZXIqIHdyaXRlcikgY29uc3Q7CisKKyAgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQgRGVlcENvcHkoKTsKKworICAgICAgVHlwZSB0eXBlXzsKKyAgICAgIHN0ZDo6c3RyaW5nIG5hbWVfOworICAgICAgRGF0YVBpZWNlIHZhbHVlXzsKKyAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlX3N0b3JhZ2VfOworICAgIH07CisKKyAgICAvLyBIYW5kbGVzIHN0YXJ0aW5nIHVwIHRoZSBhbnkgb25jZSB3ZSBoYXZlIGEgdHlwZS4KKyAgICB2b2lkIFN0YXJ0QW55KGNvbnN0IERhdGFQaWVjZSYgdmFsdWUpOworCisgICAgLy8gV3JpdGVzIHRoZSBBbnkgb3V0IHRvIHRoZSBwYXJlbnQgd3JpdGVyIGluIGl0cyBzZXJpYWxpemVkIGZvcm0uCisgICAgdm9pZCBXcml0ZUFueSgpOworCisgICAgLy8gVGhlIHBhcmVudCBvZiB0aGlzIHdyaXRlciwgbmVlZGVkIGZvciB2YXJpb3VzIGJpdHMgc3VjaCBhcyB0eXBlIGluZm8gYW5kCisgICAgLy8gdGhlIGxpc3RlbmVycy4KKyAgICBQcm90b1N0cmVhbU9iamVjdFdyaXRlciogcGFyZW50XzsKKworICAgIC8vIFRoZSBuZXN0ZWQgb2JqZWN0IHdyaXRlciwgdXNlZCB0byB3cml0ZSBldmVudHMuCisgICAgc3RkOjp1bmlxdWVfcHRyPFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyPiBvd187CisKKyAgICAvLyBUaGUgdHlwZV91cmxfIHRoYXQgdGhpcyBBbnkgcmVwcmVzZW50cy4KKyAgICBzdGQ6OnN0cmluZyB0eXBlX3VybF87CisKKyAgICAvLyBXaGV0aGVyIHRoaXMgYW55IGlzIGludmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIG9ubHkgcmVwb3J0IGFuIGludmFsaWQKKyAgICAvLyBBbnkgbWVzc2FnZSBhIHNpbmdsZSB0aW1lIHJhdGhlciB0aGFuIGV2ZXJ5IHRpbWUgd2UgZ2V0IGEgbmVzdGVkIGZpZWxkLgorICAgIGJvb2wgaW52YWxpZF87CisKKyAgICAvLyBUaGUgb3V0cHV0IGRhdGEgYW5kIHdyYXBwaW5nIEJ5dGVTaW5rLgorICAgIHN0ZDo6c3RyaW5nIGRhdGFfOworICAgIHN0cmluZ3M6OlN0cmluZ0J5dGVTaW5rIG91dHB1dF87CisKKyAgICAvLyBUaGUgZGVwdGggd2l0aGluIHRoZSBBbnksIHNvIHdlIGNhbiB0cmFjayB3aGVuIHdlJ3JlIGRvbmUuCisgICAgaW50IGRlcHRoXzsKKworICAgIC8vIFRydWUgaWYgdGhlIHR5cGUgaXMgYSB3ZWxsLWtub3duIHR5cGUuIFdlbGwta25vd24gdHlwZXMgaW4gQW55CisgICAgLy8gaGFzIGEgc3BlY2lhbCBmb3JtYXR0aW5nOgorICAgIC8vIHsKKyAgICAvLyAgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5YWFgiLAorICAgIC8vICAgInZhbHVlIjogPEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGU+LAorICAgIC8vIH0KKyAgICBib29sIGlzX3dlbGxfa25vd25fdHlwZV87CisgICAgVHlwZVJlbmRlcmVyKiB3ZWxsX2tub3duX3R5cGVfcmVuZGVyXzsKKworICAgIC8vIFN0b3JlIGRhdGEgYmVmb3JlIHRoZSAiQHR5cGUiIGZpZWxkLgorICAgIHN0ZDo6dmVjdG9yPEV2ZW50PiB1bmludGVycHJldGVkX2V2ZW50c187CisgIH07CisKKyAgLy8gUmVwcmVzZW50cyBhbiBpdGVtIGluIGEgc3RhY2sgb2YgaXRlbXMgdXNlZCB0byBrZWVwIHN0YXRlIGJldHdlZW4KKyAgLy8gT2JqZWN0V3JpZXIgZXZlbnRzLgorICBjbGFzcyBQUk9UT0JVRl9FWFBPUlQgSXRlbSA6IHB1YmxpYyBCYXNlRWxlbWVudCB7CisgICBwdWJsaWM6CisgICAgLy8gSW5kaWNhdGVzIHRoZSB0eXBlIG9mIGl0ZW0uCisgICAgZW51bSBJdGVtVHlwZSB7CisgICAgICBNRVNTQUdFLCAgLy8gU2ltcGxlIG1lc3NhZ2UKKyAgICAgIE1BUCwgICAgICAvLyBQcm90bzMgbWFwIHR5cGUKKyAgICAgIEFOWSwgICAgICAvLyBQcm90bzMgQW55IHR5cGUKKyAgICB9OworCisgICAgLy8gQ29uc3RydWN0b3IgZm9yIHRoZSByb290IGl0ZW0uCisgICAgSXRlbShQcm90b1N0cmVhbU9iamVjdFdyaXRlciogZW5jbG9zaW5nLCBJdGVtVHlwZSBpdGVtX3R5cGUsCisgICAgICAgICBib29sIGlzX3BsYWNlaG9sZGVyLCBib29sIGlzX2xpc3QpOworCisgICAgLy8gQ29uc3RydWN0b3IgZm9yIGEgZmllbGQgb2YgYSBtZXNzYWdlLgorICAgIEl0ZW0oSXRlbSogcGFyZW50LCBJdGVtVHlwZSBpdGVtX3R5cGUsIGJvb2wgaXNfcGxhY2Vob2xkZXIsIGJvb2wgaXNfbGlzdCk7CisKKyAgICB+SXRlbSgpIG92ZXJyaWRlIHt9CisKKyAgICAvLyBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgdHlwZSBpcyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgIC8vIHR5cGUgaW4gZnVuY3Rpb24gbmFtZS4KKyAgICBib29sIElzTWFwKCkgeyByZXR1cm4gaXRlbV90eXBlXyA9PSBNQVA7IH0KKyAgICBib29sIElzQW55KCkgeyByZXR1cm4gaXRlbV90eXBlXyA9PSBBTlk7IH0KKworICAgIEFueVdyaXRlciogYW55KCkgY29uc3QgeyByZXR1cm4gYW55Xy5nZXQoKTsgfQorCisgICAgSXRlbSogcGFyZW50KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEl0ZW0qPihCYXNlRWxlbWVudDo6cGFyZW50KCkpOworICAgIH0KKworICAgIC8vIEluc2VydHMgbWFwIGtleSBpbnRvIGhhc2ggc2V0IGlmIGFuZCBvbmx5IGlmIHRoZSBrZXkgZGlkIE5PVCBhbHJlYWR5CisgICAgLy8gZXhpc3QgaW4gaGFzaCBzZXQuCisgICAgLy8gVGhlIGhhc2ggc2V0IChtYXBfa2V5c18pIGlzIE9OTFkgdXNlZCB0byBrZWVwIHRyYWNrIG9mIG1hcCBrZXlzLgorICAgIC8vIFJldHVybiB0cnVlIGlmIGluc2VydCBzdWNjZXNzZnVsbHk7IHJldHVybnMgZmFsc2UgaWYgdGhlIG1hcCBrZXkgd2FzCisgICAgLy8gYWxyZWFkeSBwcmVzZW50LgorICAgIGJvb2wgSW5zZXJ0TWFwS2V5SWZOb3RQcmVzZW50KFN0cmluZ1BpZWNlIG1hcF9rZXkpOworCisgICAgYm9vbCBpc19wbGFjZWhvbGRlcigpIGNvbnN0IHsgcmV0dXJuIGlzX3BsYWNlaG9sZGVyXzsgfQorICAgIGJvb2wgaXNfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIGlzX2xpc3RfOyB9CisKKyAgIHByaXZhdGU6CisgICAgLy8gVXNlZCBmb3IgYWNjZXNzIHRvIHZhcmlhYmxlcyBvZiB0aGUgZW5jbG9zaW5nIGluc3RhbmNlIG9mCisgICAgLy8gUHJvdG9TdHJlYW1PYmplY3RXcml0ZXIuCisgICAgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXIqIG93XzsKKworICAgIC8vIEEgd3JpdGVyIGZvciBBbnkgb2JqZWN0cywgaGFuZGxlcyBhbGwgQW55LXJlbGF0ZWQgbm9uc2Vuc2UuCisgICAgc3RkOjp1bmlxdWVfcHRyPEFueVdyaXRlcj4gYW55XzsKKworICAgIC8vIFRoZSB0eXBlIG9mIHRoaXMgZWxlbWVudCwgc2VlIGVudW0gZm9yIHBlcm1pc3NpYmxlIHR5cGVzLgorICAgIEl0ZW1UeXBlIGl0ZW1fdHlwZV87CisKKyAgICAvLyBTZXQgb2YgbWFwIGtleXMgYWxyZWFkeSBzZWVuIGZvciB0aGUgdHlwZV8uIFVzZWQgdG8gdmFsaWRhdGUgaW5jb21pbmcKKyAgICAvLyBtZXNzYWdlcyBzbyBubyBtYXAga2V5IGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UuCisgICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gPiBtYXBfa2V5c187CisKKyAgICAvLyBDb252ZXlzIHdoZXRoZXIgdGhpcyBJdGVtIGlzIGEgcGxhY2Vob2xkZXIgb3Igbm90LiBQbGFjZWhvbGRlciBpdGVtcyBhcmUKKyAgICAvLyBwdXNoZWQgdG8gc3RhY2sgdG8gYWNjb3VudCBmb3Igc3BlY2lhbCB0eXBlcy4KKyAgICBib29sIGlzX3BsYWNlaG9sZGVyXzsKKworICAgIC8vIENvbnZleXMgd2hldGhlciB0aGlzIEl0ZW0gaXMgYSBsaXN0IG9yIG5vdC4gVGhpcyBpcyB1c2VkIHRvIHNlbmQKKyAgICAvLyBTdGFydExpc3Qgb3IgRW5kTGlzdCBjYWxscyB0byB1bmRlcmx5aW5nIE9iamVjdFdyaXRlci4KKyAgICBib29sIGlzX2xpc3RfOworCisgICAgR09PR0xFX0RJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhJdGVtKTsKKyAgfTsKKworICBQcm90b1N0cmVhbU9iamVjdFdyaXRlcihjb25zdCBUeXBlSW5mbyogdHlwZWluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3M6OkJ5dGVTaW5rKiBvdXRwdXQsIEVycm9yTGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICBQcm90b1N0cmVhbU9iamVjdFdyaXRlcihjb25zdCBUeXBlSW5mbyogdHlwZWluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3M6OkJ5dGVTaW5rKiBvdXRwdXQsIEVycm9yTGlzdGVuZXIqIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6T3B0aW9ucyYgb3B0aW9ucyk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBpcyBhIG1hcC4KKyAgaW5saW5lIGJvb2wgSXNNYXAoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQmIGZpZWxkKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGlzIGFuIGFueS4KKyAgaW5saW5lIGJvb2wgSXNBbnkoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQmIGZpZWxkKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGlzIGdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QuCisgIGlubGluZSBib29sIElzU3RydWN0KGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBpcyBnb29nbGUucHJvdG9idWYuVmFsdWUuCisgIGlubGluZSBib29sIElzU3RydWN0VmFsdWUoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQmIGZpZWxkKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGlzIGdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUuCisgIGlubGluZSBib29sIElzU3RydWN0TGlzdFZhbHVlKGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCk7CisKKyAgLy8gUmVuZGVycyBnb29nbGUucHJvdG9idWYuVmFsdWUgaW4gc3RydWN0LnByb3RvLiBJdCBwaWNrcyB0aGUgcmlnaHQgb25lb2YKKyAgLy8gdHlwZSBiYXNlZCBvbiB2YWx1ZSdzIHR5cGUuCisgIHN0YXRpYyB1dGlsOjpTdGF0dXMgUmVuZGVyU3RydWN0VmFsdWUoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXIqIG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFQaWVjZSYgZGF0YSk7CisKKyAgLy8gUmVuZGVycyBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIHZhbHVlLgorICBzdGF0aWMgdXRpbDo6U3RhdHVzIFJlbmRlclRpbWVzdGFtcChQcm90b1N0cmVhbU9iamVjdFdyaXRlciogb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFQaWVjZSYgZGF0YSk7CisKKyAgLy8gUmVuZGVycyBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIHZhbHVlLgorICBzdGF0aWMgdXRpbDo6U3RhdHVzIFJlbmRlckZpZWxkTWFzayhQcm90b1N0cmVhbU9iamVjdFdyaXRlciogb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFQaWVjZSYgZGF0YSk7CisKKyAgLy8gUmVuZGVycyBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gdmFsdWUuCisgIHN0YXRpYyB1dGlsOjpTdGF0dXMgUmVuZGVyRHVyYXRpb24oUHJvdG9TdHJlYW1PYmplY3RXcml0ZXIqIG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFQaWVjZSYgZGF0YSk7CisKKyAgLy8gUmVuZGVycyB3cmFwcGVyIG1lc3NhZ2UgdHlwZXMgZm9yIHByaW1pdGl2ZSB0eXBlcyBpbgorICAvLyBnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8uCisgIHN0YXRpYyB1dGlsOjpTdGF0dXMgUmVuZGVyV3JhcHBlclR5cGUoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXIqIG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFQaWVjZSYgZGF0YSk7CisKKyAgc3RhdGljIHZvaWQgSW5pdFJlbmRlcmVyTWFwKCk7CisgIHN0YXRpYyB2b2lkIERlbGV0ZVJlbmRlcmVyTWFwKCk7CisgIHN0YXRpYyBUeXBlUmVuZGVyZXIqIEZpbmRUeXBlUmVuZGVyZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfdXJsKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1hcCBrZXkgZm9yIHR5cGVfIGlzIG5vdCBkdXBsaWNhdGVkIGtleS4KKyAgLy8gSWYgbWFwIGtleSBpcyBkdXBsaWNhdGVkIGtleSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLgorICAvLyBOb3RlIHRoYXQgY2FsbGVyIHNob3VsZCBtYWtlIHN1cmUgdGhhdCB0aGUgY3VycmVudCBwcm90byBlbGVtZW50IChjdXJyZW50XykKKyAgLy8gaXMgb2YgZWxlbWVudCB0eXBlIE1BUCBvciBTVFJVQ1RfTUFQLgorICAvLyBJdCBhbHNvIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjYWxsYmFjayBhbmQgdW5ub3JtYWx6aWVkX25hbWUgaXMgdXNlZAorICAvLyBmb3IgZXJyb3Igc3RyaW5nLgorICBib29sIFZhbGlkTWFwS2V5KFN0cmluZ1BpZWNlIHVubm9ybWFsaXplZF9uYW1lKTsKKworICAvLyBQdXNoZXMgYW4gaXRlbSBvbiB0byB0aGUgc3RhY2suIEFsc28gY2FsbHMgZWl0aGVyIFN0YXJ0T2JqZWN0IG9yIFN0YXJ0TGlzdAorICAvLyBvbiB0aGUgdW5kZXJseWluZyBPYmplY3RXcml0ZXIgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXNfbGlzdCBpcyBmYWxzZSBvcgorICAvLyBub3QuCisgIC8vIGlzX3BsYWNlaG9sZGVyIGNvbnZleXMgd2hldGhlciB0aGUgaXRlbSBpcyBhIHBsYWNlaG9sZGVyIGl0ZW0gb3Igbm90LgorICAvLyBQbGFjZWhvbGRlciBpdGVtcyBhcmUgcHVzaGVkIHdoZW4gYWRkaW5nIGF1eGlsaWFyeSB0eXBlcycgU3RhcnRPYmplY3Qgb3IKKyAgLy8gU3RhcnRMaXN0IGNhbGxzLgorICB2b2lkIFB1c2goU3RyaW5nUGllY2UgbmFtZSwgSXRlbTo6SXRlbVR5cGUgaXRlbV90eXBlLAorICAgICAgICAgICAgYm9vbCBpc19wbGFjZWhvbGRlciwgYm9vbCBpc19saXN0KTsKKworCisgIC8vIFBvcHMgaXRlbXMgZnJvbSB0aGUgc3RhY2suIEFsbCBwbGFjZWhvbGRlciBpdGVtcyBhcmUgcG9wcGVkIHVudGlsIGEKKyAgLy8gbm9uLXBsYWNlaG9sZGVyIGl0ZW0gaXMgZm91bmQuCisgIHZvaWQgUG9wKCk7CisKKyAgLy8gUG9wcyBvbmUgZWxlbWVudCBmcm9tIHRoZSBzdGFjay4gQ2FsbHMgRW5kT2JqZWN0KCkgb3IgRW5kTGlzdCgpIG9uIHRoZQorICAvLyB1bmRlcmx5aW5nIE9iamVjdFdyaXRlciBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGlzX2xpc3RfLgorICB2b2lkIFBvcE9uZUVsZW1lbnQoKTsKKworIHByaXZhdGU6CisgIC8vIEhlbHBlciBmdW5jdGlvbnMgdG8gY3JlYXRlIHRoZSBtYXAgYW5kIGZpbmQgZnVuY3Rpb25zIHJlc3BvbnNpYmxlIGZvcgorICAvLyByZW5kZXJpbmcgd2VsbCBrbm93biB0eXBlcywga2V5ZWQgYnkgdHlwZSBVUkwuCisgIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIFR5cGVSZW5kZXJlcj4qIHJlbmRlcmVyc187CisKKyAgLy8gVmFyaWFibGVzIGZvciBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGlucHV0IHRyZWU6CisgIC8vIG1hc3Rlcl90eXBlXzogZGVzY3JpcHRvciBmb3IgdGhlIHdob2xlIHByb3RvYnVmIG1lc3NhZ2UuCisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIG1hc3Rlcl90eXBlXzsKKworICAvLyBUaGUgY3VycmVudCBlbGVtZW50LCB2YXJpYWJsZSBmb3IgaW50ZXJuYWwgc3RhdGUgcHJvY2Vzc2luZy4KKyAgc3RkOjp1bmlxdWVfcHRyPEl0ZW0+IGN1cnJlbnRfOworCisgIC8vIFJlZmVyZW5jZSB0byB0aGUgb3B0aW9ucyB0aGF0IGNvbnRyb2wgdGhpcyBjbGFzcydzIGJlaGF2aW9yLgorICBjb25zdCBQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6T3B0aW9ucyBvcHRpb25zXzsKKworICBHT09HTEVfRElTQUxMT1dfSU1QTElDSVRfQ09OU1RSVUNUT1JTKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9QUk9UT1NUUkVBTV9PQkpFQ1RXUklURVJfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyX3Rlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0ODk5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5jYwpAQCAtMCwwICsxLDMwMzIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyLmg+CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4gIC8vIEZvciBzaXplX3QKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90eXBlLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL21vY2tfZXJyb3JfbGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9hbnlzLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbC5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSBjb252ZXJ0ZXIgeworCisKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpBbnlNOwordXNpbmcgcHJvdG9fdXRpbF9jb252ZXJ0ZXI6OnRlc3Rpbmc6OkFueU91dDsKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpBdXRob3I7Cit1c2luZyBwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6Qm9vazsKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpGaWVsZE1hc2tUZXN0OwordXNpbmcgcHJvdG9fdXRpbF9jb252ZXJ0ZXI6OnRlc3Rpbmc6OkludDMyV3JhcHBlcjsKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpNYXBJbjsKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpQcmltaXRpdmU7Cit1c2luZyBwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6UHJvdG8zTWVzc2FnZTsKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpQdWJsaXNoZXI7Cit1c2luZyBwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6U3RydWN0VHlwZTsKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpUZXN0SnNvbk5hbWUxOwordXNpbmcgcHJvdG9fdXRpbF9jb252ZXJ0ZXI6OnRlc3Rpbmc6OlRlc3RKc29uTmFtZTI7Cit1c2luZyBwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6VGltZXN0YW1wRHVyYXRpb247Cit1c2luZyBwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6VmFsdWVXcmFwcGVyOwordXNpbmcgcHJvdG9fdXRpbF9jb252ZXJ0ZXI6OnRlc3Rpbmc6Om9uZW9mczo6T25lT2ZzUmVxdWVzdDsKK3VzaW5nIHN0cmluZ3M6Okdyb3dpbmdBcnJheUJ5dGVTaW5rOwordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpBcmdzOworCisKK25hbWVzcGFjZSB7CitzdGQ6OnN0cmluZyBHZXRUeXBlVXJsKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKGtUeXBlU2VydmljZUJhc2VVcmwpICsgIi8iICsgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCk7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQmFzZVByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0ZXN0aW5nOjpUeXBlSW5mb1NvdXJjZT4geworIHByb3RlY3RlZDoKKyAgQmFzZVByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCgpCisgICAgICA6IGhlbHBlcl8oR2V0UGFyYW0oKSksCisgICAgICAgIGxpc3RlbmVyXygpLAorICAgICAgICBvdXRwdXRfKG5ldyBHcm93aW5nQXJyYXlCeXRlU2luaygxMDAwKSksCisgICAgICAgIG93XygpIHt9CisKKyAgZXhwbGljaXQgQmFzZVByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICAgICAgOiBoZWxwZXJfKEdldFBhcmFtKCkpLAorICAgICAgICBsaXN0ZW5lcl8oKSwKKyAgICAgICAgb3V0cHV0XyhuZXcgR3Jvd2luZ0FycmF5Qnl0ZVNpbmsoMTAwMCkpLAorICAgICAgICBvd18oKSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+IGRlc2NyaXB0b3JzOworICAgIGRlc2NyaXB0b3JzLnB1c2hfYmFjayhkZXNjcmlwdG9yKTsKKyAgICBSZXNldFR5cGVJbmZvKGRlc2NyaXB0b3JzKTsKKyAgfQorCisgIGV4cGxpY2l0IEJhc2VQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QoCisgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBEZXNjcmlwdG9yKj4gZGVzY3JpcHRvcnMpCisgICAgICA6IGhlbHBlcl8oR2V0UGFyYW0oKSksCisgICAgICAgIGxpc3RlbmVyXygpLAorICAgICAgICBvdXRwdXRfKG5ldyBHcm93aW5nQXJyYXlCeXRlU2luaygxMDAwKSksCisgICAgICAgIG93XygpIHsKKyAgICBSZXNldFR5cGVJbmZvKGRlc2NyaXB0b3JzKTsKKyAgfQorCisgIHZvaWQgUmVzZXRUeXBlSW5mbyhzdGQ6OnZlY3Rvcjxjb25zdCBEZXNjcmlwdG9yKj4gZGVzY3JpcHRvcnMpIHsKKyAgICBHT09HTEVfQ0hFQ0soIWRlc2NyaXB0b3JzLmVtcHR5KCkpIDw8ICJNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGRlc2NyaXB0b3IhIjsKKyAgICBoZWxwZXJfLlJlc2V0VHlwZUluZm8oZGVzY3JpcHRvcnMpOworICAgIG93Xy5yZXNldChoZWxwZXJfLk5ld1Byb3RvV3JpdGVyKEdldFR5cGVVcmwoZGVzY3JpcHRvcnNbMF0pLCBvdXRwdXRfLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0ZW5lcl8sIG9wdGlvbnNfKSk7CisgIH0KKworICB2b2lkIFJlc2V0VHlwZUluZm8oY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IERlc2NyaXB0b3IqPiBkZXNjcmlwdG9yczsKKyAgICBkZXNjcmlwdG9ycy5wdXNoX2JhY2soZGVzY3JpcHRvcik7CisgICAgUmVzZXRUeXBlSW5mbyhkZXNjcmlwdG9ycyk7CisgIH0KKworICB+QmFzZVByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCgpIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBDaGVja091dHB1dChjb25zdCBNZXNzYWdlJiBleHBlY3RlZCwgaW50IGV4cGVjdGVkX2xlbmd0aCkgeworICAgIHNpemVfdCBuYnl0ZXM7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gYnVmZmVyKG91dHB1dF8tPkdldEJ1ZmZlcigmbmJ5dGVzKSk7CisgICAgaWYgKGV4cGVjdGVkX2xlbmd0aCA+PSAwKSB7CisgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfbGVuZ3RoLCBuYnl0ZXMpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBzdHIoYnVmZmVyLmdldCgpLCBuYnl0ZXMpOworCisgICAgc3RkOjpzdHJpbmdidWYgc3RyX2J1ZihzdHIsIHN0ZDo6aW9zX2Jhc2U6OmluKTsKKyAgICBzdGQ6OmlzdHJlYW0gaXN0cmVhbSgmc3RyX2J1Zik7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UoZXhwZWN0ZWQuTmV3KCkpOworICAgIG1lc3NhZ2UtPlBhcnNlUGFydGlhbEZyb21Jc3RyZWFtKCZpc3RyZWFtKTsKKworICAgIGlmICghTWVzc2FnZURpZmZlcmVuY2VyOjpFcXVpdmFsZW50KGV4cGVjdGVkLCAqbWVzc2FnZSkpIHsKKyAgICAgIEVYUEVDVF9FUShleHBlY3RlZC5EZWJ1Z1N0cmluZygpLCBtZXNzYWdlLT5EZWJ1Z1N0cmluZygpKTsKKyAgICB9CisgIH0KKworICB2b2lkIENoZWNrT3V0cHV0KGNvbnN0IE1lc3NhZ2UmIGV4cGVjdGVkKSB7IENoZWNrT3V0cHV0KGV4cGVjdGVkLCAtMSk7IH0KKworICB0ZXN0aW5nOjpUeXBlSW5mb1Rlc3RIZWxwZXIgaGVscGVyXzsKKyAgTW9ja0Vycm9yTGlzdGVuZXIgbGlzdGVuZXJfOworICBzdGQ6OnVuaXF1ZV9wdHI8R3Jvd2luZ0FycmF5Qnl0ZVNpbms+IG91dHB1dF87CisgIHN0ZDo6dW5pcXVlX3B0cjxQcm90b1N0cmVhbU9iamVjdFdyaXRlcj4gb3dfOworICBQcm90b1N0cmVhbU9iamVjdFdyaXRlcjo6T3B0aW9ucyBvcHRpb25zXzsKK307CisKK01BVENIRVJfUChIYXNPYmplY3RMb2NhdGlvbiwgZXhwZWN0ZWQsCisgICAgICAgICAgIlZlcmlmaWVzIHRoZSBleHBlY3RlZCBvYmplY3QgbG9jYXRpb24iKSB7CisgIHN0ZDo6c3RyaW5nIGFjdHVhbCA9IHN0ZDo6Z2V0PDA+KGFyZykuVG9TdHJpbmcoKTsKKyAgaWYgKGFjdHVhbCA9PSBleHBlY3RlZCkgcmV0dXJuIHRydWU7CisgICpyZXN1bHRfbGlzdGVuZXIgPDwgImFjdHVhbCBsb2NhdGlvbiBpczogIiA8PCBhY3R1YWw7CisgIHJldHVybiBmYWxzZTsKK30KKworY2xhc3MgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0IDogcHVibGljIEJhc2VQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QgeworIHByb3RlY3RlZDoKKyAgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0KCkKKyAgICAgIDogQmFzZVByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdChCb29rOjpkZXNjcmlwdG9yKCkpIHt9CisKKyAgdm9pZCBSZXNldFByb3RvV3JpdGVyKCkgeyBSZXNldFR5cGVJbmZvKEJvb2s6OmRlc2NyaXB0b3IoKSk7IH0KKworICB+UHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0KCkgb3ZlcnJpZGUge30KK307CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChEaWZmZXJlbnRUeXBlSW5mb1NvdXJjZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpVU0VfVFlQRV9SRVNPTFZFUikpOworCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBFbXB0eU9iamVjdCkgeworICBCb29rIGVtcHR5OworICBvd18tPlN0YXJ0T2JqZWN0KCIiKS0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGVtcHR5LCAwKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwgU2ltcGxlT2JqZWN0KSB7CisgIHN0ZDo6c3RyaW5nIGNvbnRlbnQoIk15IGNvbnRlbnQiKTsKKworICBCb29rIGJvb2s7CisgIGJvb2suc2V0X3RpdGxlKCJNeSBUaXRsZSIpOworICBib29rLnNldF9sZW5ndGgoMjIyKTsKKyAgYm9vay5zZXRfY29udGVudChjb250ZW50KTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInRpdGxlIiwgIk15IFRpdGxlIikKKyAgICAgIC0+UmVuZGVySW50MzIoImxlbmd0aCIsIDIyMikKKyAgICAgIC0+UmVuZGVyQnl0ZXMoImNvbnRlbnQiLCBjb250ZW50KQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoYm9vayk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIFNpbXBsZU1lc3NhZ2UpIHsKKyAgQm9vayBib29rOworICBib29rLnNldF90aXRsZSgiU29tZSBCb29rIik7CisgIGJvb2suc2V0X2xlbmd0aCgxMDIpOworICBQdWJsaXNoZXIqIHB1Ymxpc2hlciA9IGJvb2subXV0YWJsZV9wdWJsaXNoZXIoKTsKKyAgcHVibGlzaGVyLT5zZXRfbmFtZSgiTXkgUHVibGlzaGVyIik7CisgIEF1dGhvciogcm9iZXJ0ID0gYm9vay5tdXRhYmxlX2F1dGhvcigpOworICByb2JlcnQtPnNldF9hbGl2ZSh0cnVlKTsKKyAgcm9iZXJ0LT5zZXRfbmFtZSgicm9iZXJ0Iik7CisgIHJvYmVydC0+YWRkX3BzZXVkb255bSgiYm9iIik7CisgIHJvYmVydC0+YWRkX3BzZXVkb255bSgiYm9iYnkiKTsKKyAgcm9iZXJ0LT5hZGRfZnJpZW5kXygpLT5zZXRfbmFtZSgiam9obiIpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygidGl0bGUiLCAiU29tZSBCb29rIikKKyAgICAgIC0+UmVuZGVySW50MzIoImxlbmd0aCIsIDEwMikKKyAgICAgIC0+U3RhcnRPYmplY3QoInB1Ymxpc2hlciIpCisgICAgICAtPlJlbmRlclN0cmluZygibmFtZSIsICJNeSBQdWJsaXNoZXIiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5TdGFydE9iamVjdCgiYXV0aG9yIikKKyAgICAgIC0+UmVuZGVyQm9vbCgiYWxpdmUiLCB0cnVlKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAicm9iZXJ0IikKKyAgICAgIC0+U3RhcnRMaXN0KCJwc2V1ZG9ueW0iKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIiIsICJib2IiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIiIsICJib2JieSIpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5TdGFydExpc3QoImZyaWVuZCIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAiam9obiIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoYm9vayk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIEN1c3RvbUpzb25OYW1lKSB7CisgIEJvb2sgYm9vazsKKyAgQXV0aG9yKiByb2JlcnQgPSBib29rLm11dGFibGVfYXV0aG9yKCk7CisgIHJvYmVydC0+c2V0X2lkKDEyMzQ1KTsKKyAgcm9iZXJ0LT5zZXRfbmFtZSgicm9iZXJ0Iik7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImF1dGhvciIpCisgICAgICAtPlJlbmRlclVpbnQ2NCgiQGlkIiwgMTIzNDUpCisgICAgICAtPlJlbmRlclN0cmluZygibmFtZSIsICJyb2JlcnQiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoYm9vayk7Cit9CisKKy8vIFRlc3QgdGhhdCB0d28gbWVzc2FnZXMgY2FuIGhhdmUgZGlmZmVyZW50IGZpZWxkcyBtYXBwZWQgdG8gdGhlIHNhbWUgSlNPTgorLy8gbmFtZS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2lzc3Vlcy8xNDE1CitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBDb25mbGljdGluZ0pzb25OYW1lKSB7CisgIFJlc2V0VHlwZUluZm8oVGVzdEpzb25OYW1lMTo6ZGVzY3JpcHRvcigpKTsKKyAgVGVzdEpzb25OYW1lMSBtZXNzYWdlMTsKKyAgbWVzc2FnZTEuc2V0X29uZV92YWx1ZSgxMjM0NSk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpLT5SZW5kZXJJbnQzMigidmFsdWUiLCAxMjM0NSktPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChtZXNzYWdlMSk7CisKKyAgUmVzZXRUeXBlSW5mbyhUZXN0SnNvbk5hbWUyOjpkZXNjcmlwdG9yKCkpOworICBUZXN0SnNvbk5hbWUyIG1lc3NhZ2UyOworICBtZXNzYWdlMi5zZXRfYW5vdGhlcl92YWx1ZSgxMjM0NSk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpLT5SZW5kZXJJbnQzMigidmFsdWUiLCAxMjM0NSktPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChtZXNzYWdlMik7Cit9CisKKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwgSW50RW51bVZhbHVlc0FyZUFjY2VwdGVkKSB7CisgIEJvb2sgYm9vazsKKyAgYm9vay5zZXRfdGl0bGUoIlNvbWUgQm9vayIpOworICBib29rLnNldF90eXBlKHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpCb29rOjpLSURTKTsKKyAgQXV0aG9yKiByb2JlcnQgPSBib29rLm11dGFibGVfYXV0aG9yKCk7CisgIHJvYmVydC0+c2V0X25hbWUoInJvYmVydCIpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygidGl0bGUiLCAiU29tZSBCb29rIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ0eXBlIiwgIjIiKQorICAgICAgLT5TdGFydE9iamVjdCgiYXV0aG9yIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgInJvYmVydCIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChib29rKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwgRW51bVZhbHVlc1dpdGhEaWZmZXJlbnRDYXNlSXNSZWplY3RlZCkgeworICBCb29rIGJvb2s7CisgIGJvb2suc2V0X3RpdGxlKCJTb21lIEJvb2siKTsKKyAgQXV0aG9yKiByb2JlcnQgPSBib29rLm11dGFibGVfYXV0aG9yKCk7CisgIHJvYmVydC0+c2V0X25hbWUoInJvYmVydCIpOworCisgIG9wdGlvbnNfLmNhc2VfaW5zZW5zaXRpdmVfZW51bV9wYXJzaW5nID0gZmFsc2U7CisgIFJlc2V0UHJvdG9Xcml0ZXIoKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInRpdGxlIiwgIlNvbWUgQm9vayIpCisgICAgICAtPlJlbmRlclN0cmluZygidHlwZSIsICJhY3Rpb25fYW5kX2FkdmVudHVyZSIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhdXRob3IiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAicm9iZXJ0IikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGJvb2spOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBFbnVtVmFsdWVzV2l0aFNhbWVDYXNlSXNBY2NlcHRlZCkgeworICBCb29rIGJvb2s7CisgIGJvb2suc2V0X3RpdGxlKCJTb21lIEJvb2siKTsKKyAgYm9vay5zZXRfdHlwZShwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6Qm9vazo6QUNUSU9OX0FORF9BRFZFTlRVUkUpOworICBBdXRob3IqIHJvYmVydCA9IGJvb2subXV0YWJsZV9hdXRob3IoKTsKKyAgcm9iZXJ0LT5zZXRfbmFtZSgicm9iZXJ0Iik7CisKKyAgb3B0aW9uc18uY2FzZV9pbnNlbnNpdGl2ZV9lbnVtX3BhcnNpbmcgPSBmYWxzZTsKKyAgUmVzZXRQcm90b1dyaXRlcigpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygidGl0bGUiLCAiU29tZSBCb29rIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ0eXBlIiwgIkFDVElPTl9BTkRfQURWRU5UVVJFIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImF1dGhvciIpCisgICAgICAtPlJlbmRlclN0cmluZygibmFtZSIsICJyb2JlcnQiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoYm9vayk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIEVudW1WYWx1ZXNXaXRoRGlmZmVyZW50Q2FzZUlzQWNjZXB0ZWQpIHsKKyAgQm9vayBib29rOworICBib29rLnNldF90aXRsZSgiU29tZSBCb29rIik7CisgIGJvb2suc2V0X3R5cGUocHJvdG9fdXRpbF9jb252ZXJ0ZXI6OnRlc3Rpbmc6OkJvb2s6OkFDVElPTl9BTkRfQURWRU5UVVJFKTsKKyAgQXV0aG9yKiByb2JlcnQgPSBib29rLm11dGFibGVfYXV0aG9yKCk7CisgIHJvYmVydC0+c2V0X25hbWUoInJvYmVydCIpOworCisgIG9wdGlvbnNfLmNhc2VfaW5zZW5zaXRpdmVfZW51bV9wYXJzaW5nID0gdHJ1ZTsKKyAgUmVzZXRQcm90b1dyaXRlcigpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygidGl0bGUiLCAiU29tZSBCb29rIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ0eXBlIiwgImFjdGlvbl9BTkRfYWR2ZW50dXJlIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImF1dGhvciIpCisgICAgICAtPlJlbmRlclN0cmluZygibmFtZSIsICJyb2JlcnQiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoYm9vayk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIEVudW1WYWx1ZXNXaXRob3V0VW5kZXJzY29yZUFyZUFjY2VwdGVkKSB7CisgIEJvb2sgYm9vazsKKyAgYm9vay5zZXRfdGl0bGUoIlNvbWUgQm9vayIpOworICBib29rLnNldF90eXBlKHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpCb29rOjpBQ1RJT05fQU5EX0FEVkVOVFVSRSk7CisgIEF1dGhvciogcm9iZXJ0ID0gYm9vay5tdXRhYmxlX2F1dGhvcigpOworICByb2JlcnQtPnNldF9uYW1lKCJyb2JlcnQiKTsKKworICBvcHRpb25zXy51c2VfbG93ZXJfY2FtZWxfZm9yX2VudW1zID0gdHJ1ZTsKKyAgUmVzZXRQcm90b1dyaXRlcigpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygidGl0bGUiLCAiU29tZSBCb29rIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ0eXBlIiwgIkFDVElPTkFOREFEVkVOVFVSRSIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhdXRob3IiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAicm9iZXJ0IikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGJvb2spOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBFbnVtVmFsdWVzSW5DYW1lbENhc2VBcmVBY2NlcHRlZCkgeworICBCb29rIGJvb2s7CisgIGJvb2suc2V0X3RpdGxlKCJTb21lIEJvb2siKTsKKyAgYm9vay5zZXRfdHlwZShwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6Qm9vazo6QUNUSU9OX0FORF9BRFZFTlRVUkUpOworICBBdXRob3IqIHJvYmVydCA9IGJvb2subXV0YWJsZV9hdXRob3IoKTsKKyAgcm9iZXJ0LT5zZXRfbmFtZSgicm9iZXJ0Iik7CisKKyAgb3B0aW9uc18udXNlX2xvd2VyX2NhbWVsX2Zvcl9lbnVtcyA9IHRydWU7CisgIFJlc2V0UHJvdG9Xcml0ZXIoKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInRpdGxlIiwgIlNvbWUgQm9vayIpCisgICAgICAtPlJlbmRlclN0cmluZygidHlwZSIsICJhY3Rpb25BbmRBZHZlbnR1cmUiKQorICAgICAgLT5TdGFydE9iamVjdCgiYXV0aG9yIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgInJvYmVydCIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChib29rKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwKKyAgICAgICBFbnVtVmFsdWVzSW5DYW1lbENhc2VSZW1vdmVEYXNoQW5kVW5kZXJzY29yZUFyZUFjY2VwdGVkKSB7CisgIEJvb2sgYm9vazsKKyAgYm9vay5zZXRfdGl0bGUoIlNvbWUgQm9vayIpOworICBib29rLnNldF90eXBlKHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpCb29rOjpBQ1RJT05fQU5EX0FEVkVOVFVSRSk7CisgIEF1dGhvciogcm9iZXJ0ID0gYm9vay5tdXRhYmxlX2F1dGhvcigpOworICByb2JlcnQtPnNldF9uYW1lKCJyb2JlcnQiKTsKKworICBvcHRpb25zXy51c2VfbG93ZXJfY2FtZWxfZm9yX2VudW1zID0gdHJ1ZTsKKyAgb3B0aW9uc18uY2FzZV9pbnNlbnNpdGl2ZV9lbnVtX3BhcnNpbmcgPSBmYWxzZTsKKyAgUmVzZXRQcm90b1dyaXRlcigpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygidGl0bGUiLCAiU29tZSBCb29rIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ0eXBlIiwgImFjdGlvbi1BbmRfQWR2ZW50dXJlIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImF1dGhvciIpCisgICAgICAtPlJlbmRlclN0cmluZygibmFtZSIsICJyb2JlcnQiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoYm9vayk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsCisgICAgICAgRW51bVZhbHVlc0luQ2FtZWxDYXNlV2l0aE5hbWVOb3RVcHBlcmNhc2VBcmVBY2NlcHRlZCkgeworICBCb29rIGJvb2s7CisgIGJvb2suc2V0X3RpdGxlKCJTb21lIEJvb2siKTsKKyAgYm9vay5zZXRfdHlwZShwcm90b191dGlsX2NvbnZlcnRlcjo6dGVzdGluZzo6Qm9vazo6YXJ0c19hbmRfcGhvdG9ncmFwaHkpOworICBBdXRob3IqIHJvYmVydCA9IGJvb2subXV0YWJsZV9hdXRob3IoKTsKKyAgcm9iZXJ0LT5zZXRfbmFtZSgicm9iZXJ0Iik7CisKKyAgb3B0aW9uc18udXNlX2xvd2VyX2NhbWVsX2Zvcl9lbnVtcyA9IHRydWU7CisgIFJlc2V0UHJvdG9Xcml0ZXIoKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInRpdGxlIiwgIlNvbWUgQm9vayIpCisgICAgICAtPlJlbmRlclN0cmluZygidHlwZSIsICJhcnRzQW5kUGhvdG9ncmFwaHkiKQorICAgICAgLT5TdGFydE9iamVjdCgiYXV0aG9yIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgInJvYmVydCIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChib29rKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwgUHJpbWl0aXZlRnJvbVN0cmluZ0NvbnZlcnNpb24pIHsKKyAgUHJpbWl0aXZlIGZ1bGw7CisgIGZ1bGwuc2V0X2ZpeDMyKDEwMSk7CisgIGZ1bGwuc2V0X3UzMigxMDIpOworICBmdWxsLnNldF9pMzIoLTEwMyk7CisgIGZ1bGwuc2V0X3NmMzIoLTEwNCk7CisgIGZ1bGwuc2V0X3MzMigtMTA1KTsKKyAgZnVsbC5zZXRfZml4NjQoNDAwMDAwMDAwMDFMKTsKKyAgZnVsbC5zZXRfdTY0KDQwMDAwMDAwMDAyTCk7CisgIGZ1bGwuc2V0X2k2NCgtNDAwMDAwMDAwMDNMKTsKKyAgZnVsbC5zZXRfc2Y2NCgtNDAwMDAwMDAwMDRMKTsKKyAgZnVsbC5zZXRfczY0KC00MDAwMDAwMDAwNUwpOworICBmdWxsLnNldF9zdHIoInN0cmluZzEiKTsKKyAgZnVsbC5zZXRfYnl0ZXMoIlNvbWUgQnl0ZXMiKTsKKyAgZnVsbC5zZXRfZmxvYXRfKDMuMTRmKTsKKyAgZnVsbC5zZXRfZG91YmxlXygtNC4wNUwpOworICBmdWxsLnNldF9ib29sXyh0cnVlKTsKKyAgZnVsbC5hZGRfcmVwX2ZpeDMyKDIwMSk7CisgIGZ1bGwuYWRkX3JlcF91MzIoMjAyKTsKKyAgZnVsbC5hZGRfcmVwX2kzMigtMjAzKTsKKyAgZnVsbC5hZGRfcmVwX3NmMzIoLTIwNCk7CisgIGZ1bGwuYWRkX3JlcF9zMzIoLTIwNSk7CisgIGZ1bGwuYWRkX3JlcF9maXg2NCg4MDAwMDAwMDAwMUwpOworICBmdWxsLmFkZF9yZXBfdTY0KDgwMDAwMDAwMDAyTCk7CisgIGZ1bGwuYWRkX3JlcF9pNjQoLTgwMDAwMDAwMDAzTCk7CisgIGZ1bGwuYWRkX3JlcF9zZjY0KC04MDAwMDAwMDAwNEwpOworICBmdWxsLmFkZF9yZXBfczY0KC04MDAwMDAwMDAwNUwpOworICBmdWxsLmFkZF9yZXBfc3RyKCJzdHJpbmcyIik7CisgIGZ1bGwuYWRkX3JlcF9ieXRlcygiTW9yZSBCeXRlcyIpOworICBmdWxsLmFkZF9yZXBfZmxvYXQoNi4xNGYpOworICBmdWxsLmFkZF9yZXBfZG91YmxlKC04LjA1TCk7CisgIGZ1bGwuYWRkX3JlcF9ib29sKGZhbHNlKTsKKworICBSZXNldFR5cGVJbmZvKFByaW1pdGl2ZTo6ZGVzY3JpcHRvcigpKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImZpeDMyIiwgIjEwMSIpCisgICAgICAtPlJlbmRlclN0cmluZygidTMyIiwgIjEwMiIpCisgICAgICAtPlJlbmRlclN0cmluZygiaTMyIiwgIi0xMDMiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInNmMzIiLCAiLTEwNCIpCisgICAgICAtPlJlbmRlclN0cmluZygiczMyIiwgIi0xMDUiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImZpeDY0IiwgIjQwMDAwMDAwMDAxIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ1NjQiLCAiNDAwMDAwMDAwMDIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImk2NCIsICItNDAwMDAwMDAwMDMiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInNmNjQiLCAiLTQwMDAwMDAwMDA0IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJzNjQiLCAiLTQwMDAwMDAwMDA1IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJzdHIiLCAic3RyaW5nMSIpCisgICAgICAtPlJlbmRlclN0cmluZygiYnl0ZXMiLCAiVTI5dFpTQkNlWFJsY3c9PSIpICAvLyAiU29tZSBCeXRlcyIKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJmbG9hdCIsICIzLjE0IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJkb3VibGUiLCAiLTQuMDUiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImJvb2wiLCAidHJ1ZSIpCisgICAgICAtPlN0YXJ0TGlzdCgicmVwX2ZpeDMyIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAiMjAxIikKKyAgICAgIC0+RW5kTGlzdCgpCisgICAgICAtPlN0YXJ0TGlzdCgicmVwX3UzMiIpCisgICAgICAtPlJlbmRlclN0cmluZygiIiwgIjIwMiIpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5TdGFydExpc3QoInJlcF9pMzIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIiIsICItMjAzIikKKyAgICAgIC0+RW5kTGlzdCgpCisgICAgICAtPlN0YXJ0TGlzdCgicmVwX3NmMzIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIiIsICItMjA0IikKKyAgICAgIC0+RW5kTGlzdCgpCisgICAgICAtPlN0YXJ0TGlzdCgicmVwX3MzMiIpCisgICAgICAtPlJlbmRlclN0cmluZygiIiwgIi0yMDUiKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+U3RhcnRMaXN0KCJyZXBfZml4NjQiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIiIsICI4MDAwMDAwMDAwMSIpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5TdGFydExpc3QoInJlcF91NjQiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIiIsICI4MDAwMDAwMDAwMiIpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5TdGFydExpc3QoInJlcF9pNjQiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIiIsICItODAwMDAwMDAwMDMiKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+U3RhcnRMaXN0KCJyZXBfc2Y2NCIpCisgICAgICAtPlJlbmRlclN0cmluZygiIiwgIi04MDAwMDAwMDAwNCIpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5TdGFydExpc3QoInJlcF9zNjQiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIiIsICItODAwMDAwMDAwMDUiKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+U3RhcnRMaXN0KCJyZXBfc3RyIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAic3RyaW5nMiIpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5TdGFydExpc3QoInJlcF9ieXRlcyIpCisgICAgICAtPlJlbmRlclN0cmluZygiIiwgIlRXOXlaU0JDZVhSbGN3PT0iKSAgLy8gIk1vcmUgQnl0ZXMiCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5TdGFydExpc3QoInJlcF9mbG9hdCIpCisgICAgICAtPlJlbmRlclN0cmluZygiIiwgIjYuMTQiKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+U3RhcnRMaXN0KCJyZXBfZG91YmxlIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAiLTguMDUiKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+U3RhcnRMaXN0KCJyZXBfYm9vbCIpCisgICAgICAtPlJlbmRlclN0cmluZygiIiwgImZhbHNlIikKKyAgICAgIC0+RW5kTGlzdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChmdWxsKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwgSW5maW5pdHlJbnB1dFRlc3QpIHsKKyAgUHJpbWl0aXZlIGZ1bGw7CisgIGZ1bGwuc2V0X2RvdWJsZV8oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKTsKKyAgZnVsbC5zZXRfZmxvYXRfKHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKTsKKyAgZnVsbC5zZXRfc3RyKCItSW5maW5pdHkiKTsKKworICBSZXNldFR5cGVJbmZvKFByaW1pdGl2ZTo6ZGVzY3JpcHRvcigpKTsKKworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBTdHJpbmdQaWVjZSgiVFlQRV9JTlQzMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgiXCJJbmZpbml0eVwiIikpKQorICAgICAgLldpdGgoQXJnczwwPihIYXNPYmplY3RMb2NhdGlvbigiaTMyIikpKTsKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkVmFsdWUoXywgU3RyaW5nUGllY2UoIlRZUEVfVUlOVDMyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKCJcIkluZmluaXR5XCIiKSkpCisgICAgICAuV2l0aChBcmdzPDA+KEhhc09iamVjdExvY2F0aW9uKCJ1MzIiKSkpOworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBTdHJpbmdQaWVjZSgiVFlQRV9TRklYRUQ2NCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgiXCItSW5maW5pdHlcIiIpKSkKKyAgICAgIC5XaXRoKEFyZ3M8MD4oSGFzT2JqZWN0TG9jYXRpb24oInNmNjQiKSkpOworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBTdHJpbmdQaWVjZSgiVFlQRV9CT09MIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKCJcIkluZmluaXR5XCIiKSkpCisgICAgICAuV2l0aChBcmdzPDA+KEhhc09iamVjdExvY2F0aW9uKCJib29sIikpKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImRvdWJsZSIsICJJbmZpbml0eSIpCisgICAgICAtPlJlbmRlclN0cmluZygiZmxvYXQiLCAiSW5maW5pdHkiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImkzMiIsICJJbmZpbml0eSIpCisgICAgICAtPlJlbmRlclN0cmluZygidTMyIiwgIkluZmluaXR5IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJzZjY0IiwgIi1JbmZpbml0eSIpCisgICAgICAtPlJlbmRlclN0cmluZygic3RyIiwgIi1JbmZpbml0eSIpCisgICAgICAtPlJlbmRlclN0cmluZygiYm9vbCIsICJJbmZpbml0eSIpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChmdWxsKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwgTmFOSW5wdXRUZXN0KSB7CisgIFByaW1pdGl2ZSBmdWxsOworICBmdWxsLnNldF9kb3VibGVfKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCkpOworICBmdWxsLnNldF9mbG9hdF8oc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpKTsKKyAgZnVsbC5zZXRfc3RyKCJOYU4iKTsKKworICBSZXNldFR5cGVJbmZvKFByaW1pdGl2ZTo6ZGVzY3JpcHRvcigpKTsKKworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBTdHJpbmdQaWVjZSgiVFlQRV9JTlQzMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgiXCJOYU5cIiIpKSkKKyAgICAgIC5XaXRoKEFyZ3M8MD4oSGFzT2JqZWN0TG9jYXRpb24oImkzMiIpKSk7CisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgSW52YWxpZFZhbHVlKF8sIFN0cmluZ1BpZWNlKCJUWVBFX1VJTlQzMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgiXCJOYU5cIiIpKSkKKyAgICAgIC5XaXRoKEFyZ3M8MD4oSGFzT2JqZWN0TG9jYXRpb24oInUzMiIpKSk7CisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgSW52YWxpZFZhbHVlKF8sIFN0cmluZ1BpZWNlKCJUWVBFX1NGSVhFRDY0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKCJcIk5hTlwiIikpKQorICAgICAgLldpdGgoQXJnczwwPihIYXNPYmplY3RMb2NhdGlvbigic2Y2NCIpKSk7CisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgSW52YWxpZFZhbHVlKF8sIFN0cmluZ1BpZWNlKCJUWVBFX0JPT0wiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoIlwiTmFOXCIiKSkpCisgICAgICAuV2l0aChBcmdzPDA+KEhhc09iamVjdExvY2F0aW9uKCJib29sIikpKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImRvdWJsZSIsICJOYU4iKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImZsb2F0IiwgIk5hTiIpCisgICAgICAtPlJlbmRlclN0cmluZygiaTMyIiwgIk5hTiIpCisgICAgICAtPlJlbmRlclN0cmluZygidTMyIiwgIk5hTiIpCisgICAgICAtPlJlbmRlclN0cmluZygic2Y2NCIsICJOYU4iKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInN0ciIsICJOYU4iKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImJvb2wiLCAiTmFOIikKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisKKyAgQ2hlY2tPdXRwdXQoZnVsbCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIEltcGxpY2l0UHJpbWl0aXZlTGlzdCkgeworICBCb29rIGV4cGVjdGVkOworICBBdXRob3IqIGF1dGhvciA9IGV4cGVjdGVkLm11dGFibGVfYXV0aG9yKCk7CisgIGF1dGhvci0+c2V0X25hbWUoIlRoZSBBdXRob3IiKTsKKyAgYXV0aG9yLT5hZGRfcHNldWRvbnltKCJmaXJzdCIpOworICBhdXRob3ItPmFkZF9wc2V1ZG9ueW0oInNlY29uZCIpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhdXRob3IiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAiVGhlIEF1dGhvciIpCisgICAgICAtPlJlbmRlclN0cmluZygicHNldWRvbnltIiwgImZpcnN0IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJwc2V1ZG9ueW0iLCAic2Vjb25kIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGV4cGVjdGVkKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwKKyAgICAgICBMYXN0V3JpdGVXaW5zT25Ob25SZXBlYXRlZFByaW1pdGl2ZUZpZWxkV2l0aER1cGxpY2F0ZXMpIHsKKyAgQm9vayBleHBlY3RlZDsKKyAgQXV0aG9yKiBhdXRob3IgPSBleHBlY3RlZC5tdXRhYmxlX2F1dGhvcigpOworICBhdXRob3ItPnNldF9uYW1lKCJzZWNvbmQiKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgiYXV0aG9yIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgImZpcnN0IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgInNlY29uZCIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChleHBlY3RlZCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIEV4cGxpY2l0UHJpbWl0aXZlTGlzdCkgeworICBCb29rIGV4cGVjdGVkOworICBBdXRob3IqIGF1dGhvciA9IGV4cGVjdGVkLm11dGFibGVfYXV0aG9yKCk7CisgIGF1dGhvci0+c2V0X25hbWUoIlRoZSBBdXRob3IiKTsKKyAgYXV0aG9yLT5hZGRfcHNldWRvbnltKCJmaXJzdCIpOworICBhdXRob3ItPmFkZF9wc2V1ZG9ueW0oInNlY29uZCIpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhdXRob3IiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAiVGhlIEF1dGhvciIpCisgICAgICAtPlN0YXJ0TGlzdCgicHNldWRvbnltIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAiZmlyc3QiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIiIsICJzZWNvbmQiKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGV4cGVjdGVkKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwgTm9uUmVwZWF0ZWRFeHBsaWNpdFByaW1pdGl2ZUxpc3QpIHsKKyAgQm9vayBleHBlY3RlZDsKKyAgZXhwZWN0ZWQuc2V0X2FsbG9jYXRlZF9hdXRob3IobmV3IEF1dGhvcigpKTsKKworICBFWFBFQ1RfQ0FMTCgKKyAgICAgIGxpc3RlbmVyXywKKyAgICAgIEludmFsaWROYW1lKF8sIFN0cmluZ1BpZWNlKCJuYW1lIiksCisgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgKKyAgICAgICAgICAgICAgICAgICAgICAiUHJvdG8gZmllbGQgaXMgbm90IHJlcGVhdGluZywgY2Fubm90IHN0YXJ0IGxpc3QuIikpKQorICAgICAgLldpdGgoQXJnczwwPihIYXNPYmplY3RMb2NhdGlvbigiYXV0aG9yIikpKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImF1dGhvciIpCisgICAgICAtPlN0YXJ0TGlzdCgibmFtZSIpCisgICAgICAtPlJlbmRlclN0cmluZygiIiwgImZpcnN0IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAic2Vjb25kIikKKyAgICAgIC0+RW5kTGlzdCgpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChleHBlY3RlZCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIEltcGxpY2l0TWVzc2FnZUxpc3QpIHsKKyAgQm9vayBleHBlY3RlZDsKKyAgQXV0aG9yKiBvdXRlciA9IGV4cGVjdGVkLm11dGFibGVfYXV0aG9yKCk7CisgIG91dGVyLT5zZXRfbmFtZSgib3V0ZXIiKTsKKyAgb3V0ZXItPnNldF9hbGl2ZSh0cnVlKTsKKyAgQXV0aG9yKiBmaXJzdCA9IG91dGVyLT5hZGRfZnJpZW5kXygpOworICBmaXJzdC0+c2V0X25hbWUoImZpcnN0Iik7CisgIEF1dGhvciogc2Vjb25kID0gb3V0ZXItPmFkZF9mcmllbmRfKCk7CisgIHNlY29uZC0+c2V0X25hbWUoInNlY29uZCIpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhdXRob3IiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAib3V0ZXIiKQorICAgICAgLT5SZW5kZXJCb29sKCJhbGl2ZSIsIHRydWUpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJmcmllbmQiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAiZmlyc3QiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5TdGFydE9iamVjdCgiZnJpZW5kIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgInNlY29uZCIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChleHBlY3RlZCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIERpc2FibGVJbXBsaWNpdE1lc3NhZ2VMaXN0KSB7CisgIG9wdGlvbnNfLmRpc2FibGVfaW1wbGljaXRfbWVzc2FnZV9saXN0ID0gdHJ1ZTsKKyAgb3B0aW9uc18uc3VwcHJlc3NfaW1wbGljaXRfbWVzc2FnZV9saXN0X2Vycm9yID0gdHJ1ZTsKKyAgUmVzZXRQcm90b1dyaXRlcigpOworCisgIEJvb2sgZXhwZWN0ZWQ7CisgIC8vIFRoZSByZXBlYXRlZCBmcmllbmQgZmllbGQgb2YgdGhlIGF1dGhvciBpcyBlbXB0eS4KKyAgZXhwZWN0ZWQubXV0YWJsZV9hdXRob3IoKTsKKworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBfLCBfKSkuVGltZXMoMCk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImF1dGhvciIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJmcmllbmQiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAiZmlyc3QiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5TdGFydE9iamVjdCgiZnJpZW5kIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgInNlY29uZCIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChleHBlY3RlZCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsCisgICAgICAgRGlzYWJsZUltcGxpY2l0TWVzc2FnZUxpc3RXaXRob3V0RXJyb3JTdXBwcmVzc2VkKSB7CisgIG9wdGlvbnNfLmRpc2FibGVfaW1wbGljaXRfbWVzc2FnZV9saXN0ID0gdHJ1ZTsKKyAgUmVzZXRQcm90b1dyaXRlcigpOworCisgIEJvb2sgZXhwZWN0ZWQ7CisgIC8vIFRoZSByZXBlYXRlZCBmcmllbmQgZmllbGQgb2YgdGhlIGF1dGhvciBpcyBlbXB0eS4KKyAgZXhwZWN0ZWQubXV0YWJsZV9hdXRob3IoKTsKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkVmFsdWUoCisgICAgICAgICAgXywgU3RyaW5nUGllY2UoImZyaWVuZCIpLAorICAgICAgICAgIFN0cmluZ1BpZWNlKAorICAgICAgICAgICAgICAiU3RhcnRpbmcgYW4gb2JqZWN0IGluIGEgcmVwZWF0ZWQgZmllbGQgYnV0IHRoZSBwYXJlbnQgb2JqZWN0ICIKKyAgICAgICAgICAgICAgImlzIG5vdCBhIGxpc3QiKSkpCisgICAgICAuV2l0aChBcmdzPDA+KEhhc09iamVjdExvY2F0aW9uKCJhdXRob3IiKSkpCisgICAgICAuVGltZXMoMik7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImF1dGhvciIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJmcmllbmQiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAiZmlyc3QiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5TdGFydE9iamVjdCgiZnJpZW5kIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgInNlY29uZCIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChleHBlY3RlZCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsCisgICAgICAgTGFzdFdyaXRlV2luc09uTm9uUmVwZWF0ZWRNZXNzYWdlRmllbGRXaXRoRHVwbGljYXRlcykgeworICBCb29rIGV4cGVjdGVkOworICBBdXRob3IqIGF1dGhvciA9IGV4cGVjdGVkLm11dGFibGVfYXV0aG9yKCk7CisgIGF1dGhvci0+c2V0X25hbWUoIlRoZSBBdXRob3IiKTsKKyAgUHVibGlzaGVyKiBwdWJsaXNoZXIgPSBleHBlY3RlZC5tdXRhYmxlX3B1Ymxpc2hlcigpOworICBwdWJsaXNoZXItPnNldF9uYW1lKCJzZWNvbmQiKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgiYXV0aG9yIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgIlRoZSBBdXRob3IiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5TdGFydE9iamVjdCgicHVibGlzaGVyIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgImZpcnN0IikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+U3RhcnRPYmplY3QoInB1Ymxpc2hlciIpCisgICAgICAtPlJlbmRlclN0cmluZygibmFtZSIsICJzZWNvbmQiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoZXhwZWN0ZWQpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBFeHBsaWNpdE1lc3NhZ2VMaXN0KSB7CisgIEJvb2sgZXhwZWN0ZWQ7CisgIEF1dGhvciogb3V0ZXIgPSBleHBlY3RlZC5tdXRhYmxlX2F1dGhvcigpOworICBvdXRlci0+c2V0X25hbWUoIm91dGVyIik7CisgIG91dGVyLT5zZXRfYWxpdmUodHJ1ZSk7CisgIEF1dGhvciogZmlyc3QgPSBvdXRlci0+YWRkX2ZyaWVuZF8oKTsKKyAgZmlyc3QtPnNldF9uYW1lKCJmaXJzdCIpOworICBBdXRob3IqIHNlY29uZCA9IG91dGVyLT5hZGRfZnJpZW5kXygpOworICBzZWNvbmQtPnNldF9uYW1lKCJzZWNvbmQiKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgiYXV0aG9yIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgIm91dGVyIikKKyAgICAgIC0+UmVuZGVyQm9vbCgiYWxpdmUiLCB0cnVlKQorICAgICAgLT5TdGFydExpc3QoImZyaWVuZCIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAiZmlyc3QiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgInNlY29uZCIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoZXhwZWN0ZWQpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBOb25SZXBlYXRlZEV4cGxpY2l0TWVzc2FnZUxpc3QpIHsKKyAgQm9vayBleHBlY3RlZDsKKyAgQXV0aG9yKiBhdXRob3IgPSBleHBlY3RlZC5tdXRhYmxlX2F1dGhvcigpOworICBhdXRob3ItPnNldF9uYW1lKCJUaGUgQXV0aG9yIik7CisKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkTmFtZShfLCBTdHJpbmdQaWVjZSgicHVibGlzaGVyIiksCisgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgKKyAgICAgICAgICAgICAgICAgICAgICAiUHJvdG8gZmllbGQgaXMgbm90IHJlcGVhdGluZywgY2Fubm90IHN0YXJ0IGxpc3QuIikpKQorICAgICAgLldpdGgoQXJnczwwPihIYXNPYmplY3RMb2NhdGlvbigiIikpKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImF1dGhvciIpCisgICAgICAtPlJlbmRlclN0cmluZygibmFtZSIsICJUaGUgQXV0aG9yIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+U3RhcnRMaXN0KCJwdWJsaXNoZXIiKQorICAgICAgLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgImZpcnN0IikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygibmFtZSIsICJzZWNvbmQiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGV4cGVjdGVkKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwgVW5rbm93bkZpZWxkQXRSb290KSB7CisgIEJvb2sgZW1wdHk7CisKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkTmFtZShfLCBTdHJpbmdQaWVjZSgidW5rbm93biIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKCJDYW5ub3QgZmluZCBmaWVsZC4iKSkpCisgICAgICAuV2l0aChBcmdzPDA+KEhhc09iamVjdExvY2F0aW9uKCIiKSkpOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKS0+UmVuZGVyU3RyaW5nKCJ1bmtub3duIiwgIk5vcGUhIiktPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChlbXB0eSwgMCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIFVua25vd25GaWVsZEF0QXV0aG9yRnJpZW5kKSB7CisgIEJvb2sgZXhwZWN0ZWQ7CisgIEF1dGhvciogcGF1bCA9IGV4cGVjdGVkLm11dGFibGVfYXV0aG9yKCk7CisgIHBhdWwtPnNldF9uYW1lKCJQYXVsIik7CisgIEF1dGhvciogbWFyayA9IHBhdWwtPmFkZF9mcmllbmRfKCk7CisgIG1hcmstPnNldF9uYW1lKCJNYXJrIik7CisgIEF1dGhvciogam9obiA9IHBhdWwtPmFkZF9mcmllbmRfKCk7CisgIGpvaG4tPnNldF9uYW1lKCJKb2huIik7CisgIEF1dGhvciogbHVrZSA9IHBhdWwtPmFkZF9mcmllbmRfKCk7CisgIGx1a2UtPnNldF9uYW1lKCJMdWtlIik7CisKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkTmFtZShfLCBTdHJpbmdQaWVjZSgiYWRkcmVzcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKCJDYW5ub3QgZmluZCBmaWVsZC4iKSkpCisgICAgICAuV2l0aChBcmdzPDA+KEhhc09iamVjdExvY2F0aW9uKCJhdXRob3IuZnJpZW5kWzFdIikpKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImF1dGhvciIpCisgICAgICAtPlJlbmRlclN0cmluZygibmFtZSIsICJQYXVsIikKKyAgICAgIC0+U3RhcnRMaXN0KCJmcmllbmQiKQorICAgICAgLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgIk1hcmsiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgIkpvaG4iKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImFkZHJlc3MiLCAiUGF0bW9zIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygibmFtZSIsICJMdWtlIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kTGlzdCgpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChleHBlY3RlZCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIFVua25vd25PYmplY3RBdFJvb3QpIHsKKyAgQm9vayBlbXB0eTsKKworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWROYW1lKF8sIFN0cmluZ1BpZWNlKCJ1bmtub3duIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoIkNhbm5vdCBmaW5kIGZpZWxkLiIpKSkKKyAgICAgIC5XaXRoKEFyZ3M8MD4oSGFzT2JqZWN0TG9jYXRpb24oIiIpKSk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpLT5TdGFydE9iamVjdCgidW5rbm93biIpLT5FbmRPYmplY3QoKS0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGVtcHR5LCAwKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwgVW5rbm93bk9iamVjdEF0QXV0aG9yKSB7CisgIEJvb2sgZXhwZWN0ZWQ7CisgIEF1dGhvciogYXV0aG9yID0gZXhwZWN0ZWQubXV0YWJsZV9hdXRob3IoKTsKKyAgYXV0aG9yLT5zZXRfbmFtZSgiV2lsbGlhbSIpOworICBhdXRob3ItPmFkZF9wc2V1ZG9ueW0oIkJpbGwiKTsKKworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWROYW1lKF8sIFN0cmluZ1BpZWNlKCJ3aWZlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoIkNhbm5vdCBmaW5kIGZpZWxkLiIpKSkKKyAgICAgIC5XaXRoKEFyZ3M8MD4oSGFzT2JqZWN0TG9jYXRpb24oImF1dGhvciIpKSk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhdXRob3IiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAiV2lsbGlhbSIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJ3aWZlIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgIkhpbGFyeSIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPlJlbmRlclN0cmluZygicHNldWRvbnltIiwgIkJpbGwiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoZXhwZWN0ZWQpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBVbmtub3duTGlzdEF0Um9vdCkgeworICBCb29rIGVtcHR5OworCisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgSW52YWxpZE5hbWUoXywgU3RyaW5nUGllY2UoInVua25vd24iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgiQ2Fubm90IGZpbmQgZmllbGQuIikpKQorICAgICAgLldpdGgoQXJnczwwPihIYXNPYmplY3RMb2NhdGlvbigiIikpKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlN0YXJ0TGlzdCgidW5rbm93biIpLT5FbmRMaXN0KCktPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChlbXB0eSwgMCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIFVua25vd25MaXN0QXRQdWJsaXNoZXIpIHsKKyAgQm9vayBleHBlY3RlZDsKKyAgZXhwZWN0ZWQuc2V0X3RpdGxlKCJCcmFpbndhc2hpbmciKTsKKyAgUHVibGlzaGVyKiBwdWJsaXNoZXIgPSBleHBlY3RlZC5tdXRhYmxlX3B1Ymxpc2hlcigpOworICBwdWJsaXNoZXItPnNldF9uYW1lKCJwcm9wYWdhbmRhIik7CisKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkTmFtZShfLCBTdHJpbmdQaWVjZSgiYWxsaWFuY2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgiQ2Fubm90IGZpbmQgZmllbGQuIikpKQorICAgICAgLldpdGgoQXJnczwwPihIYXNPYmplY3RMb2NhdGlvbigicHVibGlzaGVyIikpKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoInB1Ymxpc2hlciIpCisgICAgICAtPlJlbmRlclN0cmluZygibmFtZSIsICJwcm9wYWdhbmRhIikKKyAgICAgIC0+U3RhcnRMaXN0KCJhbGxpYW5jZSIpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInRpdGxlIiwgIkJyYWlud2FzaGluZyIpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChleHBlY3RlZCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIElnbm9yZVVua25vd25GaWVsZEF0Um9vdCkgeworICBCb29rIGVtcHR5OworCisgIG9wdGlvbnNfLmlnbm9yZV91bmtub3duX2ZpZWxkcyA9IHRydWU7CisgIFJlc2V0UHJvdG9Xcml0ZXIoKTsKKworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWROYW1lKF8sIF8sIF8pKS5UaW1lcygwKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlJlbmRlclN0cmluZygidW5rbm93biIsICJOb3BlISIpLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoZW1wdHksIDApOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBJZ25vcmVVbmtub3duRmllbGRBdEF1dGhvckZyaWVuZCkgeworICBCb29rIGV4cGVjdGVkOworICBBdXRob3IqIHBhdWwgPSBleHBlY3RlZC5tdXRhYmxlX2F1dGhvcigpOworICBwYXVsLT5zZXRfbmFtZSgiUGF1bCIpOworICBBdXRob3IqIG1hcmsgPSBwYXVsLT5hZGRfZnJpZW5kXygpOworICBtYXJrLT5zZXRfbmFtZSgiTWFyayIpOworICBBdXRob3IqIGpvaG4gPSBwYXVsLT5hZGRfZnJpZW5kXygpOworICBqb2huLT5zZXRfbmFtZSgiSm9obiIpOworICBBdXRob3IqIGx1a2UgPSBwYXVsLT5hZGRfZnJpZW5kXygpOworICBsdWtlLT5zZXRfbmFtZSgiTHVrZSIpOworCisgIG9wdGlvbnNfLmlnbm9yZV91bmtub3duX2ZpZWxkcyA9IHRydWU7CisgIFJlc2V0UHJvdG9Xcml0ZXIoKTsKKworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWROYW1lKF8sIF8sIF8pKS5UaW1lcygwKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImF1dGhvciIpCisgICAgICAtPlJlbmRlclN0cmluZygibmFtZSIsICJQYXVsIikKKyAgICAgIC0+U3RhcnRMaXN0KCJmcmllbmQiKQorICAgICAgLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgIk1hcmsiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgIkpvaG4iKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImFkZHJlc3MiLCAiUGF0bW9zIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygibmFtZSIsICJMdWtlIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kTGlzdCgpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChleHBlY3RlZCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIElnbm9yZVVua25vd25PYmplY3RBdFJvb3QpIHsKKyAgQm9vayBlbXB0eTsKKworICBvcHRpb25zXy5pZ25vcmVfdW5rbm93bl9maWVsZHMgPSB0cnVlOworICBSZXNldFByb3RvV3JpdGVyKCk7CisKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkTmFtZShfLCBTdHJpbmdQaWVjZSgidW5rbm93biIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKCJDYW5ub3QgZmluZCBmaWVsZC4iKSkpCisgICAgICAuVGltZXMoMCk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpLT5TdGFydE9iamVjdCgidW5rbm93biIpLT5FbmRPYmplY3QoKS0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGVtcHR5LCAwKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwgSWdub3JlVW5rbm93bk9iamVjdEF0QXV0aG9yKSB7CisgIEJvb2sgZXhwZWN0ZWQ7CisgIEF1dGhvciogYXV0aG9yID0gZXhwZWN0ZWQubXV0YWJsZV9hdXRob3IoKTsKKyAgYXV0aG9yLT5zZXRfbmFtZSgiV2lsbGlhbSIpOworICBhdXRob3ItPmFkZF9wc2V1ZG9ueW0oIkJpbGwiKTsKKworICBvcHRpb25zXy5pZ25vcmVfdW5rbm93bl9maWVsZHMgPSB0cnVlOworICBSZXNldFByb3RvV3JpdGVyKCk7CisKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkTmFtZShfLCBfLCBfKSkuVGltZXMoMCk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhdXRob3IiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIm5hbWUiLCAiV2lsbGlhbSIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJ3aWZlIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgIkhpbGFyeSIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPlJlbmRlclN0cmluZygicHNldWRvbnltIiwgIkJpbGwiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoZXhwZWN0ZWQpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBJZ25vcmVVbmtub3duTGlzdEF0Um9vdCkgeworICBCb29rIGVtcHR5OworCisgIG9wdGlvbnNfLmlnbm9yZV91bmtub3duX2ZpZWxkcyA9IHRydWU7CisgIFJlc2V0UHJvdG9Xcml0ZXIoKTsKKworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWROYW1lKF8sIF8sIF8pKS5UaW1lcygwKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlN0YXJ0TGlzdCgidW5rbm93biIpLT5FbmRMaXN0KCktPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChlbXB0eSwgMCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIElnbm9yZVVua25vd25MaXN0QXRQdWJsaXNoZXIpIHsKKyAgQm9vayBleHBlY3RlZDsKKyAgZXhwZWN0ZWQuc2V0X3RpdGxlKCJCcmFpbndhc2hpbmciKTsKKyAgUHVibGlzaGVyKiBwdWJsaXNoZXIgPSBleHBlY3RlZC5tdXRhYmxlX3B1Ymxpc2hlcigpOworICBwdWJsaXNoZXItPnNldF9uYW1lKCJwcm9wYWdhbmRhIik7CisKKyAgb3B0aW9uc18uaWdub3JlX3Vua25vd25fZmllbGRzID0gdHJ1ZTsKKyAgUmVzZXRQcm90b1dyaXRlcigpOworCisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgSW52YWxpZE5hbWUoXywgXywgXykpLlRpbWVzKDApOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgicHVibGlzaGVyIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJuYW1lIiwgInByb3BhZ2FuZGEiKQorICAgICAgLT5TdGFydExpc3QoImFsbGlhbmNlIikKKyAgICAgIC0+RW5kTGlzdCgpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPlJlbmRlclN0cmluZygidGl0bGUiLCAiQnJhaW53YXNoaW5nIikKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGV4cGVjdGVkKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwKKyAgICAgICBJZ25vcmVVbmtub3duRmllbGRzRG9udElnbm9yZVVua25vd25FbnVtVmFsdWVzKSB7CisgIFJlc2V0VHlwZUluZm8oUHJvdG8zTWVzc2FnZTo6ZGVzY3JpcHRvcigpKTsKKworICBQcm90bzNNZXNzYWdlIGV4cGVjdGVkOworICBFWFBFQ1RfQ0FMTCgKKyAgICAgIGxpc3RlbmVyXywKKyAgICAgIEludmFsaWRWYWx1ZShfLAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKAorICAgICAgICAgICAgICAgICAgICAgICAidHlwZS5nb29nbGVhcGlzLmNvbS8iCisgICAgICAgICAgICAgICAgICAgICAgICJwcm90b191dGlsX2NvbnZlcnRlci50ZXN0aW5nLlByb3RvM01lc3NhZ2UuTmVzdGVkRW51bSIpLAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKCJcInNvbWV1bmtub3dudmFsdWV5b3V3aWxsbmV2ZXJrbm93XCIiKSkpCisgICAgICAuV2l0aChBcmdzPDA+KEhhc09iamVjdExvY2F0aW9uKCJlbnVtX3ZhbHVlIikpKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJlbnVtVmFsdWUiLCAic29tZXVua25vd252YWx1ZXlvdXdpbGxuZXZlcmtub3ciKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoZXhwZWN0ZWQpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBBY2NlcHRVbmtub3duRW51bVZhbHVlKSB7CisgIFJlc2V0VHlwZUluZm8oUHJvdG8zTWVzc2FnZTo6ZGVzY3JpcHRvcigpKTsKKworICBQcm90bzNNZXNzYWdlIGV4cGVjdGVkOworICBleHBlY3RlZC5zZXRfZW51bV92YWx1ZShzdGF0aWNfY2FzdDxQcm90bzNNZXNzYWdlOjpOZXN0ZWRFbnVtPigxMjM0NSkpOworCisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgSW52YWxpZFZhbHVlKF8sIF8sIF8pKS5UaW1lcygwKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlJlbmRlckludDMyKCJlbnVtVmFsdWUiLCAxMjM0NSktPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChleHBlY3RlZCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIE1pc3NpbmdSZXF1aXJlZEZpZWxkKSB7CisgIEJvb2sgZXhwZWN0ZWQ7CisgIGV4cGVjdGVkLnNldF90aXRsZSgiTXkgVGl0bGUiKTsKKyAgZXhwZWN0ZWQuc2V0X2FsbG9jYXRlZF9wdWJsaXNoZXIobmV3IFB1Ymxpc2hlcigpKTsKKworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIE1pc3NpbmdGaWVsZChfLCBTdHJpbmdQaWVjZSgibmFtZSIpKSkKKyAgICAgIC5XaXRoKEFyZ3M8MD4oSGFzT2JqZWN0TG9jYXRpb24oInB1Ymxpc2hlciIpKSk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJwdWJsaXNoZXIiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInRpdGxlIiwgIk15IFRpdGxlIikKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGV4cGVjdGVkKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwgSW52YWxpZEZpZWxkVmFsdWVBdFJvb3QpIHsKKyAgQm9vayBlbXB0eTsKKworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBTdHJpbmdQaWVjZSgiVFlQRV9VSU5UMzIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoIlwiZ2FyYmFnZVwiIikpKQorICAgICAgLldpdGgoQXJnczwwPihIYXNPYmplY3RMb2NhdGlvbigibGVuZ3RoIikpKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlJlbmRlclN0cmluZygibGVuZ3RoIiwgImdhcmJhZ2UiKS0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGVtcHR5LCAwKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwgTXVsdGlwbGVJbnZhbGlkRmllbGRWYWx1ZXMpIHsKKyAgQm9vayBleHBlY3RlZDsKKyAgZXhwZWN0ZWQuc2V0X3RpdGxlKCJNeSBUaXRsZSIpOworCisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgSW52YWxpZFZhbHVlKF8sIFN0cmluZ1BpZWNlKCJUWVBFX1VJTlQzMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgiXCItNDAwXCIiKSkpCisgICAgICAuV2l0aChBcmdzPDA+KEhhc09iamVjdExvY2F0aW9uKCJsZW5ndGgiKSkpOworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBTdHJpbmdQaWVjZSgiVFlQRV9JTlQ2NCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgiXCIzLjE0XCIiKSkpCisgICAgICAuV2l0aChBcmdzPDA+KEhhc09iamVjdExvY2F0aW9uKCJwdWJsaXNoZWQiKSkpOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImxlbmd0aCIsICItNDAwIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJwdWJsaXNoZWQiLCAiMy4xNCIpCisgICAgICAtPlJlbmRlclN0cmluZygidGl0bGUiLCAiTXkgVGl0bGUiKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoZXhwZWN0ZWQpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBVbm5hbWVkRmllbGRBdFJvb3QpIHsKKyAgQm9vayBlbXB0eTsKKworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sCisgICAgICAgICAgICAgIEludmFsaWROYW1lKF8sIFN0cmluZ1BpZWNlKCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoIlByb3RvIGZpZWxkcyBtdXN0IGhhdmUgYSBuYW1lLiIpKSkKKyAgICAgIC5XaXRoKEFyZ3M8MD4oSGFzT2JqZWN0TG9jYXRpb24oIiIpKSk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpLT5SZW5kZXJGbG9hdCgiIiwgMy4xNCktPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChlbXB0eSwgMCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIFVubmFtZWRGaWVsZEF0QXV0aG9yKSB7CisgIEJvb2sgZXhwZWN0ZWQ7CisgIGV4cGVjdGVkLnNldF90aXRsZSgibm9uYW1lIik7CisgIGV4cGVjdGVkLnNldF9hbGxvY2F0ZWRfYXV0aG9yKG5ldyBBdXRob3IoKSk7CisKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLAorICAgICAgICAgICAgICBJbnZhbGlkTmFtZShfLCBTdHJpbmdQaWVjZSgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKCJQcm90byBmaWVsZHMgbXVzdCBoYXZlIGEgbmFtZS4iKSkpCisgICAgICAuV2l0aChBcmdzPDA+KEhhc09iamVjdExvY2F0aW9uKCJhdXRob3IiKSkpOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgiYXV0aG9yIikKKyAgICAgIC0+UmVuZGVySW50MzIoIiIsIDEyMykKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ0aXRsZSIsICJub25hbWUiKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoZXhwZWN0ZWQpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBVbm5hbWVkTGlzdEF0Um9vdCkgeworICBCb29rIGV4cGVjdGVkOworICBleHBlY3RlZC5zZXRfdGl0bGUoIm5vbmFtZSIpOworCisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywKKyAgICAgICAgICAgICAgSW52YWxpZE5hbWUoXywgU3RyaW5nUGllY2UoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgiUHJvdG8gZmllbGRzIG11c3QgaGF2ZSBhIG5hbWUuIikpKQorICAgICAgLldpdGgoQXJnczwwPihIYXNPYmplY3RMb2NhdGlvbigiIikpKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRMaXN0KCIiKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ0aXRsZSIsICJub25hbWUiKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoZXhwZWN0ZWQpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBSb290TmFtZWRPYmplY3QpIHsKKyAgQm9vayBleHBlY3RlZDsKKyAgZXhwZWN0ZWQuc2V0X3RpdGxlKCJBbm5pZSIpOworCisgIEVYUEVDVF9DQUxMKAorICAgICAgbGlzdGVuZXJfLAorICAgICAgSW52YWxpZE5hbWUoXywgU3RyaW5nUGllY2UoIm9vcHMiKSwKKyAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKCJSb290IGVsZW1lbnQgc2hvdWxkIG5vdCBiZSBuYW1lZC4iKSkpCisgICAgICAuV2l0aChBcmdzPDA+KEhhc09iamVjdExvY2F0aW9uKCIiKSkpOworICBvd18tPlN0YXJ0T2JqZWN0KCJvb3BzIiktPlJlbmRlclN0cmluZygidGl0bGUiLCAiQW5uaWUiKS0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGV4cGVjdGVkLCA3KTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwgUm9vdE5hbWVkTGlzdCkgeworICBCb29rIGVtcHR5OworCisgIEVYUEVDVF9DQUxMKAorICAgICAgbGlzdGVuZXJfLAorICAgICAgSW52YWxpZE5hbWUoXywgU3RyaW5nUGllY2UoIm9vcHMiKSwKKyAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKCJSb290IGVsZW1lbnQgc2hvdWxkIG5vdCBiZSBuYW1lZC4iKSkpCisgICAgICAuV2l0aChBcmdzPDA+KEhhc09iamVjdExvY2F0aW9uKCIiKSkpOworICBvd18tPlN0YXJ0TGlzdCgib29wcyIpLT5SZW5kZXJTdHJpbmcoIiIsICJpdGVtIiktPkVuZExpc3QoKTsKKyAgQ2hlY2tPdXRwdXQoZW1wdHksIDApOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBSb290VW5uYW1lZEZpZWxkKSB7CisgIEJvb2sgZW1wdHk7CisKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLAorICAgICAgICAgICAgICBJbnZhbGlkTmFtZShfLCBTdHJpbmdQaWVjZSgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKCJSb290IGVsZW1lbnQgbXVzdCBiZSBhIG1lc3NhZ2UuIikpKQorICAgICAgLldpdGgoQXJnczwwPihIYXNPYmplY3RMb2NhdGlvbigiIikpKTsKKyAgb3dfLT5SZW5kZXJCb29sKCIiLCB0cnVlKTsKKyAgQ2hlY2tPdXRwdXQoZW1wdHksIDApOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBSb290TmFtZWRGaWVsZCkgeworICBCb29rIGVtcHR5OworCisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywKKyAgICAgICAgICAgICAgSW52YWxpZE5hbWUoXywgU3RyaW5nUGllY2UoIm9vcHMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoIlJvb3QgZWxlbWVudCBtdXN0IGJlIGEgbWVzc2FnZS4iKSkpCisgICAgICAuV2l0aChBcmdzPDA+KEhhc09iamVjdExvY2F0aW9uKCIiKSkpOworICBvd18tPlJlbmRlckJvb2woIm9vcHMiLCB0cnVlKTsKKyAgQ2hlY2tPdXRwdXQoZW1wdHksIDApOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUZXN0LCBOdWxsVmFsdWUpIHsKKyAgQm9vayBlbXB0eTsKKworICBvd18tPlJlbmRlck51bGwoIiIpOworICBDaGVja091dHB1dChlbXB0eSwgMCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QsIE51bGxWYWx1ZUZvck1lc3NhZ2VGaWVsZCkgeworICBCb29rIGVtcHR5OworCisgIG93Xy0+UmVuZGVyTnVsbCgiYXV0aG9yIik7CisgIENoZWNrT3V0cHV0KGVtcHR5LCAwKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCwgTnVsbFZhbHVlRm9yUHJpbWl0aXZlRmllbGQpIHsKKyAgQm9vayBlbXB0eTsKKworICBvd18tPlJlbmRlck51bGwoImxlbmd0aCIpOworICBDaGVja091dHB1dChlbXB0eSwgMCk7Cit9CisKK2NsYXNzIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGltZXN0YW1wRHVyYXRpb25UZXN0CisgICAgOiBwdWJsaWMgQmFzZVByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCB7CisgcHJvdGVjdGVkOgorICBQcm90b1N0cmVhbU9iamVjdFdyaXRlclRpbWVzdGFtcER1cmF0aW9uVGVzdCgpIHsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBEZXNjcmlwdG9yKj4gZGVzY3JpcHRvcnM7CisgICAgZGVzY3JpcHRvcnMucHVzaF9iYWNrKFRpbWVzdGFtcER1cmF0aW9uOjpkZXNjcmlwdG9yKCkpOworICAgIGRlc2NyaXB0b3JzLnB1c2hfYmFjayhnb29nbGU6OnByb3RvYnVmOjpUaW1lc3RhbXA6OmRlc2NyaXB0b3IoKSk7CisgICAgZGVzY3JpcHRvcnMucHVzaF9iYWNrKGdvb2dsZTo6cHJvdG9idWY6OkR1cmF0aW9uOjpkZXNjcmlwdG9yKCkpOworICAgIFJlc2V0VHlwZUluZm8oZGVzY3JpcHRvcnMpOworICB9Cit9OworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoRGlmZmVyZW50VHlwZUluZm9Tb3VyY2VUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGltZXN0YW1wRHVyYXRpb25UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpVU0VfVFlQRV9SRVNPTFZFUikpOworCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUaW1lc3RhbXBEdXJhdGlvblRlc3QsIFBhcnNlVGltZXN0YW1wKSB7CisgIFRpbWVzdGFtcER1cmF0aW9uIHRpbWVzdGFtcDsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6VGltZXN0YW1wKiB0cyA9IHRpbWVzdGFtcC5tdXRhYmxlX3RzKCk7CisgIHRzLT5zZXRfc2Vjb25kcygxNDQ4MjQ5ODU1KTsKKyAgdHMtPnNldF9uYW5vcygzMzE1NTAwMCk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ0cyIsICIyMDE1LTExLTIzVDAzOjM3OjM1LjAzMzE1NVoiKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQodGltZXN0YW1wKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGltZXN0YW1wRHVyYXRpb25UZXN0LAorICAgICAgIFBhcnNlVGltZXN0YW1wWWVhck5vdFplcm9QYWRkZWQpIHsKKyAgVGltZXN0YW1wRHVyYXRpb24gdGltZXN0YW1wOworICBnb29nbGU6OnByb3RvYnVmOjpUaW1lc3RhbXAqIHRzID0gdGltZXN0YW1wLm11dGFibGVfdHMoKTsKKyAgdHMtPnNldF9zZWNvbmRzKC02MTY2NTY1NDE0NSk7CisgIHRzLT5zZXRfbmFub3MoMzMxNTUwMDApOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygidHMiLCAiMTUtMTEtMjNUMDM6Mzc6MzUuMDMzMTU1WiIpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dCh0aW1lc3RhbXApOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUaW1lc3RhbXBEdXJhdGlvblRlc3QsCisgICAgICAgUGFyc2VUaW1lc3RhbXBZZWFyWmVyb1BhZGRlZCkgeworICBUaW1lc3RhbXBEdXJhdGlvbiB0aW1lc3RhbXA7CisgIGdvb2dsZTo6cHJvdG9idWY6OlRpbWVzdGFtcCogdHMgPSB0aW1lc3RhbXAubXV0YWJsZV90cygpOworICB0cy0+c2V0X3NlY29uZHMoLTYxNjY1NjU0MTQ1KTsKKyAgdHMtPnNldF9uYW5vcygzMzE1NTAwMCk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ0cyIsICIwMDE1LTExLTIzVDAzOjM3OjM1LjAzMzE1NVoiKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQodGltZXN0YW1wKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGltZXN0YW1wRHVyYXRpb25UZXN0LAorICAgICAgIFBhcnNlVGltZXN0YW1wV2l0aFBvc2l0aXZlT2Zmc2V0KSB7CisgIFRpbWVzdGFtcER1cmF0aW9uIHRpbWVzdGFtcDsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6VGltZXN0YW1wKiB0cyA9IHRpbWVzdGFtcC5tdXRhYmxlX3RzKCk7CisgIHRzLT5zZXRfc2Vjb25kcygxNDQ4MjQ5ODU1KTsKKyAgdHMtPnNldF9uYW5vcygzMzE1NTAwMCk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ0cyIsICIyMDE1LTExLTIzVDExOjQ3OjM1LjAzMzE1NSswODoxMCIpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dCh0aW1lc3RhbXApOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUaW1lc3RhbXBEdXJhdGlvblRlc3QsCisgICAgICAgUGFyc2VUaW1lc3RhbXBXaXRoTmVnYXRpdmVPZmZzZXQpIHsKKyAgVGltZXN0YW1wRHVyYXRpb24gdGltZXN0YW1wOworICBnb29nbGU6OnByb3RvYnVmOjpUaW1lc3RhbXAqIHRzID0gdGltZXN0YW1wLm11dGFibGVfdHMoKTsKKyAgdHMtPnNldF9zZWNvbmRzKDE0NDgyNDk4NTUpOworICB0cy0+c2V0X25hbm9zKDMzMTU1MDAwKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInRzIiwgIjIwMTUtMTEtMjJUMTk6NDc6MzUuMDMzMTU1LTA3OjUwIikKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KHRpbWVzdGFtcCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRpbWVzdGFtcER1cmF0aW9uVGVzdCwKKyAgICAgICBUaW1lc3RhbXBXaXRoSW52YWxpZE9mZnNldDEpIHsKKyAgVGltZXN0YW1wRHVyYXRpb24gdGltZXN0YW1wOworCisgIEVYUEVDVF9DQUxMKAorICAgICAgbGlzdGVuZXJfLAorICAgICAgSW52YWxpZFZhbHVlKAorICAgICAgICAgIF8sIFN0cmluZ1BpZWNlKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiKSwKKyAgICAgICAgICBTdHJpbmdQaWVjZSgiRmllbGQgJ3RzJywgSW52YWxpZCB0aW1lIGZvcm1hdDogIgorICAgICAgICAgICAgICAgICAgICAgICIyMDE2LTAzLTA3VDE1OjE0OjIzKyIpKSk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlJlbmRlclN0cmluZygidHMiLCAiMjAxNi0wMy0wN1QxNToxNDoyMysiKS0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KHRpbWVzdGFtcCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRpbWVzdGFtcER1cmF0aW9uVGVzdCwKKyAgICAgICBUaW1lc3RhbXBXaXRoSW52YWxpZE9mZnNldDIpIHsKKyAgVGltZXN0YW1wRHVyYXRpb24gdGltZXN0YW1wOworCisgIEVYUEVDVF9DQUxMKAorICAgICAgbGlzdGVuZXJfLAorICAgICAgSW52YWxpZFZhbHVlKAorICAgICAgICAgIF8sIFN0cmluZ1BpZWNlKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiKSwKKyAgICAgICAgICBTdHJpbmdQaWVjZSgiRmllbGQgJ3RzJywgSW52YWxpZCB0aW1lIGZvcm1hdDogIgorICAgICAgICAgICAgICAgICAgICAgICIyMDE2LTAzLTA3VDE1OjE0OjIzKzA4LTEwIikpKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInRzIiwgIjIwMTYtMDMtMDdUMTU6MTQ6MjMrMDgtMTAiKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQodGltZXN0YW1wKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGltZXN0YW1wRHVyYXRpb25UZXN0LAorICAgICAgIFRpbWVzdGFtcFdpdGhJbnZhbGlkT2Zmc2V0MykgeworICBUaW1lc3RhbXBEdXJhdGlvbiB0aW1lc3RhbXA7CisKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkVmFsdWUoCisgICAgICAgICAgXywgU3RyaW5nUGllY2UoInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCIpLAorICAgICAgICAgIFN0cmluZ1BpZWNlKCJGaWVsZCAndHMnLCBJbnZhbGlkIHRpbWUgZm9ybWF0OiAiCisgICAgICAgICAgICAgICAgICAgICAgIjIwMTYtMDMtMDdUMTU6MTQ6MjMrMjQ6MTAiKSkpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygidHMiLCAiMjAxNi0wMy0wN1QxNToxNDoyMysyNDoxMCIpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dCh0aW1lc3RhbXApOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUaW1lc3RhbXBEdXJhdGlvblRlc3QsCisgICAgICAgVGltZXN0YW1wV2l0aEludmFsaWRPZmZzZXQ0KSB7CisgIFRpbWVzdGFtcER1cmF0aW9uIHRpbWVzdGFtcDsKKworICBFWFBFQ1RfQ0FMTCgKKyAgICAgIGxpc3RlbmVyXywKKyAgICAgIEludmFsaWRWYWx1ZSgKKyAgICAgICAgICBfLCBTdHJpbmdQaWVjZSgidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIiksCisgICAgICAgICAgU3RyaW5nUGllY2UoIkZpZWxkICd0cycsIEludmFsaWQgdGltZSBmb3JtYXQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiMjAxNi0wMy0wN1QxNToxNDoyMyswNDo2MCIpKSk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ0cyIsICIyMDE2LTAzLTA3VDE1OjE0OjIzKzA0OjYwIikKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KHRpbWVzdGFtcCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRpbWVzdGFtcER1cmF0aW9uVGVzdCwgSW52YWxpZFRpbWVzdGFtcEVycm9yMSkgeworICBUaW1lc3RhbXBEdXJhdGlvbiB0aW1lc3RhbXA7CisKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkVmFsdWUoCisgICAgICAgICAgXywgU3RyaW5nUGllY2UoInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCIpLAorICAgICAgICAgIFN0cmluZ1BpZWNlKCJGaWVsZCAndHMnLCBJbnZhbGlkIHRpbWUgZm9ybWF0OiAiKSkpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpLT5SZW5kZXJTdHJpbmcoInRzIiwgIiIpLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQodGltZXN0YW1wKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGltZXN0YW1wRHVyYXRpb25UZXN0LCBJbnZhbGlkVGltZXN0YW1wRXJyb3IyKSB7CisgIFRpbWVzdGFtcER1cmF0aW9uIHRpbWVzdGFtcDsKKworICBFWFBFQ1RfQ0FMTCgKKyAgICAgIGxpc3RlbmVyXywKKyAgICAgIEludmFsaWRWYWx1ZSgKKyAgICAgICAgICBfLCBTdHJpbmdQaWVjZSgidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIiksCisgICAgICAgICAgU3RyaW5nUGllY2UoIkZpZWxkICd0cycsIEludmFsaWQgdGltZSBmb3JtYXQ6IFoiKSkpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpLT5SZW5kZXJTdHJpbmcoInRzIiwgIloiKS0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KHRpbWVzdGFtcCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRpbWVzdGFtcER1cmF0aW9uVGVzdCwgSW52YWxpZFRpbWVzdGFtcEVycm9yMykgeworICBUaW1lc3RhbXBEdXJhdGlvbiB0aW1lc3RhbXA7CisKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkVmFsdWUoCisgICAgICAgICAgXywgU3RyaW5nUGllY2UoInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCIpLAorICAgICAgICAgIFN0cmluZ1BpZWNlKCJGaWVsZCAndHMnLCBJbnZhbGlkIHRpbWUgZm9ybWF0OiAiCisgICAgICAgICAgICAgICAgICAgICAgIjE5NzAtMDEtMDFUMDA6MDA6MDAuQUJaIikpKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInRzIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDAuQUJaIikKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KHRpbWVzdGFtcCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRpbWVzdGFtcER1cmF0aW9uVGVzdCwgSW52YWxpZFRpbWVzdGFtcEVycm9yNCkgeworICBUaW1lc3RhbXBEdXJhdGlvbiB0aW1lc3RhbXA7CisKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkVmFsdWUoCisgICAgICAgICAgXywgU3RyaW5nUGllY2UoInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCIpLAorICAgICAgICAgIFN0cmluZ1BpZWNlKCJGaWVsZCAndHMnLCBJbnZhbGlkIHRpbWUgZm9ybWF0OiAiCisgICAgICAgICAgICAgICAgICAgICAgIi04MDMxLTEwLTE4VDAwOjAwOjAwLjAwMFoiKSkpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygidHMiLCAiLTgwMzEtMTAtMThUMDA6MDA6MDAuMDAwWiIpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dCh0aW1lc3RhbXApOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUaW1lc3RhbXBEdXJhdGlvblRlc3QsIEludmFsaWRUaW1lc3RhbXBFcnJvcjUpIHsKKyAgVGltZXN0YW1wRHVyYXRpb24gdGltZXN0YW1wOworCisgIEVYUEVDVF9DQUxMKAorICAgICAgbGlzdGVuZXJfLAorICAgICAgSW52YWxpZFZhbHVlKAorICAgICAgICAgIF8sIFN0cmluZ1BpZWNlKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiKSwKKyAgICAgICAgICBTdHJpbmdQaWVjZSgiRmllbGQgJ3RzJywgSW52YWxpZCB0aW1lIGZvcm1hdDogIgorICAgICAgICAgICAgICAgICAgICAgICIyMDE1LTExLTIzVDAzOjM3OjM1LjAzMzE1NSAgIFoiKSkpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAvLyBXaGl0ZXNwYWNlIGluIHRoZSBUaW1lc3RhbXAgbmFub3MgaXMgbm90IGFsbG93ZWQuCisgICAgICAtPlJlbmRlclN0cmluZygidHMiLCAiMjAxNS0xMS0yM1QwMzozNzozNS4wMzMxNTUgICBaIikKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KHRpbWVzdGFtcCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRpbWVzdGFtcER1cmF0aW9uVGVzdCwgSW52YWxpZFRpbWVzdGFtcEVycm9yNikgeworICBUaW1lc3RhbXBEdXJhdGlvbiB0aW1lc3RhbXA7CisKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkVmFsdWUoCisgICAgICAgICAgXywgU3RyaW5nUGllY2UoInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCIpLAorICAgICAgICAgIFN0cmluZ1BpZWNlKCJGaWVsZCAndHMnLCBJbnZhbGlkIHRpbWUgZm9ybWF0OiAiCisgICAgICAgICAgICAgICAgICAgICAgIjIwMTUtMTEtMjNUMDM6Mzc6MzUuMDMzMTU1IDEyMzRaIikpKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLy8gV2hpdGVzcGFjZSBpbiB0aGUgVGltZXN0YW1wIG5hbm9zIGlzIG5vdCBhbGxvd2VkLgorICAgICAgLT5SZW5kZXJTdHJpbmcoInRzIiwgIjIwMTUtMTEtMjNUMDM6Mzc6MzUuMDMzMTU1IDEyMzRaIikKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KHRpbWVzdGFtcCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRpbWVzdGFtcER1cmF0aW9uVGVzdCwgSW52YWxpZFRpbWVzdGFtcEVycm9yNykgeworICBUaW1lc3RhbXBEdXJhdGlvbiB0aW1lc3RhbXA7CisKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkVmFsdWUoCisgICAgICAgICAgXywgU3RyaW5nUGllY2UoInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCIpLAorICAgICAgICAgIFN0cmluZ1BpZWNlKCJGaWVsZCAndHMnLCBJbnZhbGlkIHRpbWUgZm9ybWF0OiAiCisgICAgICAgICAgICAgICAgICAgICAgIjIwMTUtMTEtMjNUMDM6Mzc6MzUuMDMzYWJjMTU1WiIpKSk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC8vIE5vbi1udW1lcmljIGNoYXJhY3RlcnMgaW4gdGhlIFRpbWVzdGFtcCBuYW5vcyBpcyBub3QgYWxsb3dlZC4KKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ0cyIsICIyMDE1LTExLTIzVDAzOjM3OjM1LjAzM2FiYzE1NVoiKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQodGltZXN0YW1wKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGltZXN0YW1wRHVyYXRpb25UZXN0LCBJbnZhbGlkVGltZXN0YW1wRXJyb3I4KSB7CisgIFRpbWVzdGFtcER1cmF0aW9uIHRpbWVzdGFtcDsKKworICBFWFBFQ1RfQ0FMTCgKKyAgICAgIGxpc3RlbmVyXywKKyAgICAgIEludmFsaWRWYWx1ZSgKKyAgICAgICAgICBfLCBTdHJpbmdQaWVjZSgidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIiksCisgICAgICAgICAgU3RyaW5nUGllY2UoIkZpZWxkICd0cycsIEludmFsaWQgdGltZSBmb3JtYXQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiMC0xMi0zMVQyMzo1OTo1OS4wMDBaIikpKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInRzIiwgIjAtMTItMzFUMjM6NTk6NTkuMDAwWiIpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dCh0aW1lc3RhbXApOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUaW1lc3RhbXBEdXJhdGlvblRlc3QsIFBhcnNlRHVyYXRpb24pIHsKKyAgVGltZXN0YW1wRHVyYXRpb24gZHVyYXRpb247CisgIGdvb2dsZTo6cHJvdG9idWY6OkR1cmF0aW9uKiBkdXIgPSBkdXJhdGlvbi5tdXRhYmxlX2R1cigpOworICBkdXItPnNldF9zZWNvbmRzKDE0NDgyMTY5MzApOworICBkdXItPnNldF9uYW5vcygxMzIyNjIwMDApOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpLT5SZW5kZXJTdHJpbmcoImR1ciIsICIxNDQ4MjE2OTMwLjEzMjI2MnMiKS0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGR1cmF0aW9uKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGltZXN0YW1wRHVyYXRpb25UZXN0LCBJbnZhbGlkRHVyYXRpb25FcnJvcjEpIHsKKyAgVGltZXN0YW1wRHVyYXRpb24gZHVyYXRpb247CisKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkVmFsdWUoCisgICAgICAgICAgXywgU3RyaW5nUGllY2UoInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIiksCisgICAgICAgICAgU3RyaW5nUGllY2UoCisgICAgICAgICAgICAgICJGaWVsZCAnZHVyJywgSWxsZWdhbCBkdXJhdGlvbiBmb3JtYXQ7IGR1cmF0aW9uIG11c3QgIgorICAgICAgICAgICAgICAiZW5kIHdpdGggJ3MnIikpKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKS0+UmVuZGVyU3RyaW5nKCJkdXIiLCAiIiktPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChkdXJhdGlvbik7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRpbWVzdGFtcER1cmF0aW9uVGVzdCwgSW52YWxpZER1cmF0aW9uRXJyb3IyKSB7CisgIFRpbWVzdGFtcER1cmF0aW9uIGR1cmF0aW9uOworCisgIEVYUEVDVF9DQUxMKAorICAgICAgbGlzdGVuZXJfLAorICAgICAgSW52YWxpZFZhbHVlKAorICAgICAgICAgIF8sIFN0cmluZ1BpZWNlKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiIpLAorICAgICAgICAgIFN0cmluZ1BpZWNlKAorICAgICAgICAgICAgICAiRmllbGQgJ2R1cicsIEludmFsaWQgZHVyYXRpb24gZm9ybWF0LCBmYWlsZWQgdG8gcGFyc2UgIgorICAgICAgICAgICAgICAic2Vjb25kcyIpKSk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlJlbmRlclN0cmluZygiZHVyIiwgInMiKS0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGR1cmF0aW9uKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGltZXN0YW1wRHVyYXRpb25UZXN0LCBJbnZhbGlkRHVyYXRpb25FcnJvcjMpIHsKKyAgVGltZXN0YW1wRHVyYXRpb24gZHVyYXRpb247CisKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkVmFsdWUoCisgICAgICAgICAgXywgU3RyaW5nUGllY2UoInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIiksCisgICAgICAgICAgU3RyaW5nUGllY2UoIkZpZWxkICdkdXInLCBJbnZhbGlkIGR1cmF0aW9uIGZvcm1hdCwgZmFpbGVkIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2UgbmFubyBzZWNvbmRzIikpKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKS0+UmVuZGVyU3RyaW5nKCJkdXIiLCAiMTIzLkRFRnMiKS0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGR1cmF0aW9uKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGltZXN0YW1wRHVyYXRpb25UZXN0LCBJbnZhbGlkRHVyYXRpb25FcnJvcjQpIHsKKyAgVGltZXN0YW1wRHVyYXRpb24gZHVyYXRpb247CisKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkVmFsdWUoCisgICAgICAgICAgXywgU3RyaW5nUGllY2UoInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIiksCisgICAgICAgICAgU3RyaW5nUGllY2UoIkZpZWxkICdkdXInLCBEdXJhdGlvbiB2YWx1ZSBleGNlZWRzIGxpbWl0cyIpKSk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlJlbmRlclN0cmluZygiZHVyIiwgIjMxNTU3NjAwMDAwMnMiKS0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGR1cmF0aW9uKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGltZXN0YW1wRHVyYXRpb25UZXN0LCBJbnZhbGlkRHVyYXRpb25FcnJvcjUpIHsKKyAgVGltZXN0YW1wRHVyYXRpb24gZHVyYXRpb247CisKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkVmFsdWUoCisgICAgICAgICAgXywgU3RyaW5nUGllY2UoInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIiksCisgICAgICAgICAgU3RyaW5nUGllY2UoIkZpZWxkICdkdXInLCBEdXJhdGlvbiB2YWx1ZSBleGNlZWRzIGxpbWl0cyIpKSk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlJlbmRlclN0cmluZygiZHVyIiwgIjAuMTAwMDAwMDAwMXMiKS0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGR1cmF0aW9uKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGltZXN0YW1wRHVyYXRpb25UZXN0LAorICAgICAgIE1pc21hdGNoZWRUaW1lc3RhbXBUeXBlSW5wdXQpIHsKKyAgVGltZXN0YW1wRHVyYXRpb24gdGltZXN0YW1wOworICBFWFBFQ1RfQ0FMTCgKKyAgICAgIGxpc3RlbmVyXywKKyAgICAgIEludmFsaWRWYWx1ZSgKKyAgICAgICAgICBfLCBTdHJpbmdQaWVjZSgidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIiksCisgICAgICAgICAgU3RyaW5nUGllY2UoCisgICAgICAgICAgICAgICJGaWVsZCAndHMnLCBJbnZhbGlkIGRhdGEgdHlwZSBmb3IgdGltZXN0YW1wLCB2YWx1ZSBpcyAxIikpKQorICAgICAgLldpdGgoQXJnczwwPihIYXNPYmplY3RMb2NhdGlvbigidHMiKSkpOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKS0+UmVuZGVySW50MzIoInRzIiwgMSktPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dCh0aW1lc3RhbXApOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUaW1lc3RhbXBEdXJhdGlvblRlc3QsCisgICAgICAgTWlzbWF0Y2hlZER1cmF0aW9uVHlwZUlucHV0KSB7CisgIFRpbWVzdGFtcER1cmF0aW9uIGR1cmF0aW9uOworICBFWFBFQ1RfQ0FMTCgKKyAgICAgIGxpc3RlbmVyXywKKyAgICAgIEludmFsaWRWYWx1ZSgKKyAgICAgICAgICBfLCBTdHJpbmdQaWVjZSgidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuRHVyYXRpb24iKSwKKyAgICAgICAgICBTdHJpbmdQaWVjZSgKKyAgICAgICAgICAgICAgIkZpZWxkICdkdXInLCBJbnZhbGlkIGRhdGEgdHlwZSBmb3IgZHVyYXRpb24sIHZhbHVlIGlzIDEiKSkpCisgICAgICAuV2l0aChBcmdzPDA+KEhhc09iamVjdExvY2F0aW9uKCJkdXIiKSkpOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKS0+UmVuZGVySW50MzIoImR1ciIsIDEpLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoZHVyYXRpb24pOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJUaW1lc3RhbXBEdXJhdGlvblRlc3QsIFRpbWVzdGFtcEFjY2VwdHNOdWxsKSB7CisgIFRpbWVzdGFtcER1cmF0aW9uIHRpbWVzdGFtcDsKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkVmFsdWUoXywgXywgXykpLlRpbWVzKDApOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKS0+UmVuZGVyTnVsbCgidHMiKS0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KHRpbWVzdGFtcCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclRpbWVzdGFtcER1cmF0aW9uVGVzdCwgRHVyYXRpb25BY2NlcHRzTnVsbCkgeworICBUaW1lc3RhbXBEdXJhdGlvbiBkdXJhdGlvbjsKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkVmFsdWUoXywgXywgXykpLlRpbWVzKDApOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKS0+UmVuZGVyTnVsbCgiZHVyIiktPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChkdXJhdGlvbik7Cit9CisKK2NsYXNzIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyU3RydWN0VGVzdAorICAgIDogcHVibGljIEJhc2VQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QgeworIHByb3RlY3RlZDoKKyAgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJTdHJ1Y3RUZXN0KCkgeyBSZXNldFByb3RvV3JpdGVyKCk7IH0KKworICAvLyBSZXNldHMgUHJvdG9Xcml0ZXIgd2l0aCBjdXJyZW50IHNldCBvZiBvcHRpb25zIGFuZCBvdGhlciBzdGF0ZS4KKyAgdm9pZCBSZXNldFByb3RvV3JpdGVyKCkgeworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IERlc2NyaXB0b3IqPiBkZXNjcmlwdG9yczsKKyAgICBkZXNjcmlwdG9ycy5wdXNoX2JhY2soU3RydWN0VHlwZTo6ZGVzY3JpcHRvcigpKTsKKyAgICBkZXNjcmlwdG9ycy5wdXNoX2JhY2soZ29vZ2xlOjpwcm90b2J1Zjo6U3RydWN0OjpkZXNjcmlwdG9yKCkpOworICAgIFJlc2V0VHlwZUluZm8oZGVzY3JpcHRvcnMpOworICB9Cit9OworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoRGlmZmVyZW50VHlwZUluZm9Tb3VyY2VUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyU3RydWN0VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VVNFX1RZUEVfUkVTT0xWRVIpKTsKKworLy8gVE9ETyhza2FydmFqZSk6IFdyaXRlIHRlc3RzIGZvciBmYWlsdXJlIGNhc2VzLgorVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyU3RydWN0VGVzdCwgU3RydWN0UmVuZGVyU3VjY2VzcykgeworICBTdHJ1Y3RUeXBlIHN0cnVjdF90eXBlOworICBnb29nbGU6OnByb3RvYnVmOjpTdHJ1Y3QqIHMgPSBzdHJ1Y3RfdHlwZS5tdXRhYmxlX29iamVjdCgpOworICBzLT5tdXRhYmxlX2ZpZWxkcygpLT5vcGVyYXRvcltdKCJrMSIpLnNldF9udW1iZXJfdmFsdWUoMTIzKTsKKyAgcy0+bXV0YWJsZV9maWVsZHMoKS0+b3BlcmF0b3JbXSgiazIiKS5zZXRfYm9vbF92YWx1ZSh0cnVlKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgib2JqZWN0IikKKyAgICAgIC0+UmVuZGVyRG91YmxlKCJrMSIsIDEyMykKKyAgICAgIC0+UmVuZGVyQm9vbCgiazIiLCB0cnVlKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoc3RydWN0X3R5cGUpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJTdHJ1Y3RUZXN0LCBTdHJ1Y3ROdWxsSW5wdXRTdWNjZXNzKSB7CisgIFN0cnVjdFR5cGUgc3RydWN0X3R5cGU7CisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywKKyAgICAgICAgICAgICAgSW52YWxpZE5hbWUoXywgU3RyaW5nUGllY2UoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgiUHJvdG8gZmllbGRzIG11c3QgaGF2ZSBhIG5hbWUuIikpKQorICAgICAgLldpdGgoQXJnczwwPihIYXNPYmplY3RMb2NhdGlvbigiIikpKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlJlbmRlck51bGwoIiIpLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoc3RydWN0X3R5cGUpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJTdHJ1Y3RUZXN0LCBTdHJ1Y3RJbnZhbGlkSW5wdXRGYWlsdXJlKSB7CisgIFN0cnVjdFR5cGUgc3RydWN0X3R5cGU7CisgIEVYUEVDVF9DQUxMKAorICAgICAgbGlzdGVuZXJfLAorICAgICAgSW52YWxpZFZhbHVlKAorICAgICAgICAgIF8sIFN0cmluZ1BpZWNlKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QiKSwKKyAgICAgICAgICBTdHJpbmdQaWVjZSgidHJ1ZSIpKSkKKyAgICAgIC5XaXRoKEFyZ3M8MD4oSGFzT2JqZWN0TG9jYXRpb24oIm9iamVjdCIpKSk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlJlbmRlckJvb2woIm9iamVjdCIsIHRydWUpLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoc3RydWN0X3R5cGUpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJTdHJ1Y3RUZXN0LCBTdHJ1Y3RBY2NlcHRzTnVsbCkgeworICBTdHJ1Y3RUeXBlIHN0cnVjdF90eXBlOworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBfLCBfKSkuVGltZXMoMCk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlJlbmRlck51bGwoIm9iamVjdCIpLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoc3RydWN0X3R5cGUpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJTdHJ1Y3RUZXN0LCBTdHJ1Y3RWYWx1ZVByZXNlcnZlc051bGwpIHsKKyAgU3RydWN0VHlwZSBzdHJ1Y3RfdHlwZTsKKyAgKCpzdHJ1Y3RfdHlwZS5tdXRhYmxlX29iamVjdCgpLT5tdXRhYmxlX2ZpZWxkcygpKVsia2V5Il0uc2V0X251bGxfdmFsdWUoCisgICAgICBnb29nbGU6OnByb3RvYnVmOjpOVUxMX1ZBTFVFKTsKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkVmFsdWUoXywgXywgXykpLlRpbWVzKDApOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJvYmplY3QiKQorICAgICAgLT5SZW5kZXJOdWxsKCJrZXkiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoc3RydWN0X3R5cGUpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJTdHJ1Y3RUZXN0LCBTaW1wbGVSZXBlYXRlZFN0cnVjdE1hcEtleVRlc3QpIHsKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLAorICAgICAgICAgICAgICBJbnZhbGlkTmFtZShfLCBTdHJpbmdQaWVjZSgiZ0Jpa2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVwZWF0ZWQgbWFwIGtleTogJ2dCaWtlJyBpcyBhbHJlYWR5IHNldC4iKSkpOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgib2JqZWN0IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJnQmlrZSIsICJ2MSIpCisgICAgICAtPlJlbmRlclN0cmluZygiZ0Jpa2UiLCAidjIiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyU3RydWN0VGVzdCwgUmVwZWF0ZWRTdHJ1Y3RNYXBMaXN0S2V5VGVzdCkgeworICBFWFBFQ1RfQ0FMTCgKKyAgICAgIGxpc3RlbmVyXywKKyAgICAgIEludmFsaWROYW1lKF8sIFN0cmluZ1BpZWNlKCJrMSIpLAorICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoIlJlcGVhdGVkIG1hcCBrZXk6ICdrMScgaXMgYWxyZWFkeSBzZXQuIikpKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoIm9iamVjdCIpCisgICAgICAtPlJlbmRlclN0cmluZygiazEiLCAidjEiKQorICAgICAgLT5TdGFydExpc3QoImsxIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAidjIiKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclN0cnVjdFRlc3QsIFJlcGVhdGVkU3RydWN0TWFwT2JqZWN0S2V5VGVzdCkgeworICBFWFBFQ1RfQ0FMTCgKKyAgICAgIGxpc3RlbmVyXywKKyAgICAgIEludmFsaWROYW1lKF8sIFN0cmluZ1BpZWNlKCJrMSIpLAorICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoIlJlcGVhdGVkIG1hcCBrZXk6ICdrMScgaXMgYWxyZWFkeSBzZXQuIikpKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoIm9iamVjdCIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJrMSIpCisgICAgICAtPlJlbmRlclN0cmluZygic3ViX2sxIiwgInYxIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+U3RhcnRPYmplY3QoImsxIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJzdWJfazIiLCAidjIiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyU3RydWN0VGVzdCwgT3B0aW9uU3RydWN0SW50QXNTdHJpbmdzVGVzdCkgeworICBTdHJ1Y3RUeXBlIHN0cnVjdF90eXBlOworICBnb29nbGU6OnByb3RvYnVmOjpTdHJ1Y3QqIHMgPSBzdHJ1Y3RfdHlwZS5tdXRhYmxlX29iamVjdCgpOworICBzLT5tdXRhYmxlX2ZpZWxkcygpLT5vcGVyYXRvcltdKCJrMSIpLnNldF9zdHJpbmdfdmFsdWUoIjEyMyIpOworICBzLT5tdXRhYmxlX2ZpZWxkcygpLT5vcGVyYXRvcltdKCJrMiIpLnNldF9ib29sX3ZhbHVlKHRydWUpOworICBzLT5tdXRhYmxlX2ZpZWxkcygpLT5vcGVyYXRvcltdKCJrMyIpLnNldF9zdHJpbmdfdmFsdWUoIi0yMjIyMjIyMjIiKTsKKyAgcy0+bXV0YWJsZV9maWVsZHMoKS0+b3BlcmF0b3JbXSgiazQiKS5zZXRfc3RyaW5nX3ZhbHVlKCIzMzMzMzMzMyIpOworCisgIG9wdGlvbnNfLnN0cnVjdF9pbnRlZ2Vyc19hc19zdHJpbmdzID0gdHJ1ZTsKKyAgUmVzZXRQcm90b1dyaXRlcigpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJvYmplY3QiKQorICAgICAgLT5SZW5kZXJEb3VibGUoImsxIiwgMTIzKQorICAgICAgLT5SZW5kZXJCb29sKCJrMiIsIHRydWUpCisgICAgICAtPlJlbmRlckludDY0KCJrMyIsIC0yMjIyMjIyMjIpCisgICAgICAtPlJlbmRlclVpbnQ2NCgiazQiLCAzMzMzMzMzMykKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KHN0cnVjdF90eXBlKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyU3RydWN0VGVzdCwgU3RydWN0MzJCaXRJbnRzQW5kRmxvYXRzVGVzdCkgeworICBTdHJ1Y3RUeXBlIHN0cnVjdF90eXBlOworICBnb29nbGU6OnByb3RvYnVmOjpTdHJ1Y3QqIHMgPSBzdHJ1Y3RfdHlwZS5tdXRhYmxlX29iamVjdCgpOworICBzLT5tdXRhYmxlX2ZpZWxkcygpLT5vcGVyYXRvcltdKCJrMSIpLnNldF9udW1iZXJfdmFsdWUoMS41KTsKKyAgcy0+bXV0YWJsZV9maWVsZHMoKS0+b3BlcmF0b3JbXSgiazIiKS5zZXRfbnVtYmVyX3ZhbHVlKDEwMCk7CisgIHMtPm11dGFibGVfZmllbGRzKCktPm9wZXJhdG9yW10oImszIikuc2V0X251bWJlcl92YWx1ZSgxMDApOworICBSZXNldFByb3RvV3JpdGVyKCk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoIm9iamVjdCIpCisgICAgICAtPlJlbmRlckZsb2F0KCJrMSIsIDEuNSkKKyAgICAgIC0+UmVuZGVySW50MzIoImsyIiwgMTAwKQorICAgICAgLT5SZW5kZXJVaW50MzIoImszIiwgMTAwKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoc3RydWN0X3R5cGUpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJTdHJ1Y3RUZXN0LAorICAgICAgIFN0cnVjdDMyQml0SW50c0FuZEZsb2F0c0FzU3RyaW5nc1Rlc3QpIHsKKyAgU3RydWN0VHlwZSBzdHJ1Y3RfdHlwZTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6U3RydWN0KiBzID0gc3RydWN0X3R5cGUubXV0YWJsZV9vYmplY3QoKTsKKyAgcy0+bXV0YWJsZV9maWVsZHMoKS0+b3BlcmF0b3JbXSgiazEiKS5zZXRfc3RyaW5nX3ZhbHVlKCIxLjUiKTsKKyAgcy0+bXV0YWJsZV9maWVsZHMoKS0+b3BlcmF0b3JbXSgiazIiKS5zZXRfc3RyaW5nX3ZhbHVlKCIxMDAiKTsKKyAgcy0+bXV0YWJsZV9maWVsZHMoKS0+b3BlcmF0b3JbXSgiazMiKS5zZXRfc3RyaW5nX3ZhbHVlKCIxMDAiKTsKKworICBvcHRpb25zXy5zdHJ1Y3RfaW50ZWdlcnNfYXNfc3RyaW5ncyA9IHRydWU7CisgIFJlc2V0UHJvdG9Xcml0ZXIoKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgib2JqZWN0IikKKyAgICAgIC0+UmVuZGVyRmxvYXQoImsxIiwgMS41KQorICAgICAgLT5SZW5kZXJJbnQzMigiazIiLCAxMDApCisgICAgICAtPlJlbmRlclVpbnQzMigiazMiLCAxMDApCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChzdHJ1Y3RfdHlwZSk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlclN0cnVjdFRlc3QsIFZhbHVlUHJlc2VydmVzTnVsbCkgeworICBWYWx1ZVdyYXBwZXIgdmFsdWU7CisgIHZhbHVlLm11dGFibGVfdmFsdWUoKS0+c2V0X251bGxfdmFsdWUoZ29vZ2xlOjpwcm90b2J1Zjo6TlVMTF9WQUxVRSk7CisKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkVmFsdWUoXywgXywgXykpLlRpbWVzKDApOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKS0+UmVuZGVyTnVsbCgidmFsdWUiKS0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KHZhbHVlKTsKK30KKworY2xhc3MgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJNYXBUZXN0IDogcHVibGljIEJhc2VQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QgeworIHByb3RlY3RlZDoKKyAgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJNYXBUZXN0KCkgeworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IERlc2NyaXB0b3IqPiBkZXNjcmlwdG9yczsKKyAgICBkZXNjcmlwdG9ycy5wdXNoX2JhY2soTWFwSW46OmRlc2NyaXB0b3IoKSk7CisgICAgZGVzY3JpcHRvcnMucHVzaF9iYWNrKGdvb2dsZTo6cHJvdG9idWY6OkRvdWJsZVZhbHVlOjpkZXNjcmlwdG9yKCkpOworICAgIFJlc2V0VHlwZUluZm8oZGVzY3JpcHRvcnMpOworICB9Cit9OworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoRGlmZmVyZW50VHlwZUluZm9Tb3VyY2VUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyTWFwVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VVNFX1RZUEVfUkVTT0xWRVIpKTsKKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyTWFwVGVzdCwgTWFwU2hvdWxkTm90QWNjZXB0TGlzdCkgeworICBNYXBJbiBtbTsKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkVmFsdWUoXywgU3RyaW5nUGllY2UoIk1hcCIpLAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKAorICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGJpbmQgYSBsaXN0IHRvIG1hcCBmb3IgZmllbGQgJ21hcF9pbnB1dCcuIikpKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRMaXN0KCJtYXBfaW5wdXQiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImEiLCAiYiIpCisgICAgICAtPkVuZExpc3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQobW0pOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJNYXBUZXN0LCBNYXBBY2NlcHRzTnVsbFZhbHVlKSB7CisgIC8vIE51bGwgc2hvdWxkIG5vdCBiZSBhIHZhbGlkIG1hcCB2YWx1ZS4KKyAgLy8gU2VlIGh0dHA6Ly9nby9wcm90bzMtanNvbi1zcGVjI2hlYWRpbmc9aC5yMmRkYXRwN3k0dmkKKyAgLy8gVGhpcyB0ZXN0IGlzIGFkZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICBNYXBJbiBtbTsKKyAgKCptbS5tdXRhYmxlX21hcF9pbnB1dCgpKVsiYSJdID0gImIiOworICAoKm1tLm11dGFibGVfbWFwX2lucHV0KCkpWyJ4Il0gPSAiIjsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoIm1hcF9pbnB1dCIpCisgICAgICAtPlJlbmRlclN0cmluZygiYSIsICJiIikKKyAgICAgIC0+UmVuZGVyTnVsbCgieCIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChtbSk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlck1hcFRlc3QsIE1hcFNob3VsZElnbm9yZU51bGxWYWx1ZUVudHJ5KSB7CisgIG9wdGlvbnNfLmlnbm9yZV9udWxsX3ZhbHVlX21hcF9lbnRyeSA9IHRydWU7CisgIFJlc2V0VHlwZUluZm8oTWFwSW46OmRlc2NyaXB0b3IoKSk7CisgIE1hcEluIG1tOworICAoKm1tLm11dGFibGVfbWFwX2lucHV0KCkpWyJhIl0gPSAiYiI7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJtYXBfaW5wdXQiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImEiLCAiYiIpCisgICAgICAtPlJlbmRlck51bGwoIngiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQobW0pOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJNYXBUZXN0LCBSZXBlYXRlZE1hcEtleVRlc3QpIHsKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkTmFtZShfLCBTdHJpbmdQaWVjZSgiazEiKSwKKyAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKCJSZXBlYXRlZCBtYXAga2V5OiAnazEnIGlzIGFscmVhZHkgc2V0LiIpKSk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlJlbmRlclN0cmluZygib3RoZXIiLCAidGVzdCIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJtYXBfaW5wdXQiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImsxIiwgInYxIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJrMSIsICJ2MiIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJNYXBUZXN0LCBBbnlJbk1hcCkgeworICBNYXBJbiBtbTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6RG91YmxlVmFsdWUgZDsKKyAgZC5zZXRfdmFsdWUoNDAuMik7CisgICgqbW0ubXV0YWJsZV9tYXBfYW55KCkpWyJmb28iXS5QYWNrRnJvbShkKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoIm1hcF9hbnkiKQorICAgICAgLT5TdGFydE9iamVjdCgiZm9vIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJAdHlwZSIsICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSIpCisgICAgICAtPlJlbmRlckRvdWJsZSgidmFsdWUiLCA0MC4yKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQobW0pOworfQorCitjbGFzcyBQcm90b1N0cmVhbU9iamVjdFdyaXRlckFueVRlc3QgOiBwdWJsaWMgQmFzZVByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCB7CisgcHJvdGVjdGVkOgorICBQcm90b1N0cmVhbU9iamVjdFdyaXRlckFueVRlc3QoKSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+IGRlc2NyaXB0b3JzOworICAgIGRlc2NyaXB0b3JzLnB1c2hfYmFjayhBbnlPdXQ6OmRlc2NyaXB0b3IoKSk7CisgICAgZGVzY3JpcHRvcnMucHVzaF9iYWNrKEJvb2s6OmRlc2NyaXB0b3IoKSk7CisgICAgZGVzY3JpcHRvcnMucHVzaF9iYWNrKGdvb2dsZTo6cHJvdG9idWY6OkFueTo6ZGVzY3JpcHRvcigpKTsKKyAgICBkZXNjcmlwdG9ycy5wdXNoX2JhY2soZ29vZ2xlOjpwcm90b2J1Zjo6RG91YmxlVmFsdWU6OmRlc2NyaXB0b3IoKSk7CisgICAgZGVzY3JpcHRvcnMucHVzaF9iYWNrKGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkTWFzazo6ZGVzY3JpcHRvcigpKTsKKyAgICBkZXNjcmlwdG9ycy5wdXNoX2JhY2soZ29vZ2xlOjpwcm90b2J1Zjo6SW50MzJWYWx1ZTo6ZGVzY3JpcHRvcigpKTsKKyAgICBkZXNjcmlwdG9ycy5wdXNoX2JhY2soZ29vZ2xlOjpwcm90b2J1Zjo6U3RydWN0OjpkZXNjcmlwdG9yKCkpOworICAgIGRlc2NyaXB0b3JzLnB1c2hfYmFjayhnb29nbGU6OnByb3RvYnVmOjpUaW1lc3RhbXA6OmRlc2NyaXB0b3IoKSk7CisgICAgZGVzY3JpcHRvcnMucHVzaF9iYWNrKGdvb2dsZTo6cHJvdG9idWY6OlZhbHVlOjpkZXNjcmlwdG9yKCkpOworICAgIFJlc2V0VHlwZUluZm8oZGVzY3JpcHRvcnMpOworICB9Cit9OworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoRGlmZmVyZW50VHlwZUluZm9Tb3VyY2VUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyQW55VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VVNFX1RZUEVfUkVTT0xWRVIpKTsKKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyQW55VGVzdCwgQW55UmVuZGVyU3VjY2VzcykgeworICBBbnlPdXQgYW55OworICBnb29nbGU6OnByb3RvYnVmOjpBbnkqIGFueV90eXBlID0gYW55Lm11dGFibGVfYW55KCk7CisgIGFueV90eXBlLT5zZXRfdHlwZV91cmwoInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlIik7CisgIGdvb2dsZTo6cHJvdG9idWY6OkRvdWJsZVZhbHVlIGQ7CisgIGQuc2V0X3ZhbHVlKDQwLjIpOworICBhbnlfdHlwZS0+c2V0X3ZhbHVlKGQuU2VyaWFsaXplQXNTdHJpbmcoKSk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImFueSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLCAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUiKQorICAgICAgLT5SZW5kZXJEb3VibGUoInZhbHVlIiwgNDAuMikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGFueSk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlckFueVRlc3QsIFJlY3Vyc2l2ZUFueSkgeworICBBbnlPdXQgb3V0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkFueSogYW55ID0gb3V0Lm11dGFibGVfYW55KCk7CisgIGFueS0+c2V0X3R5cGVfdXJsKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5BbnkiKTsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OkFueSBuZXN0ZWRfYW55OworICBuZXN0ZWRfYW55LnNldF90eXBlX3VybCgKKyAgICAgICJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvX3V0aWxfY29udmVydGVyLnRlc3RpbmcuQW55TSIpOworCisgIEFueU0gbTsKKyAgbS5zZXRfZm9vKCJmb292YWx1ZSIpOworICBuZXN0ZWRfYW55LnNldF92YWx1ZShtLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworCisgIGFueS0+c2V0X3ZhbHVlKG5lc3RlZF9hbnkuU2VyaWFsaXplQXNTdHJpbmcoKSk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImFueSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLCAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuQW55IikKKyAgICAgIC0+U3RhcnRPYmplY3QoInZhbHVlIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJAdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAidHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b191dGlsX2NvbnZlcnRlci50ZXN0aW5nLkFueU0iKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImZvbyIsICJmb292YWx1ZSIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChvdXQsIDExMik7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlckFueVRlc3QsIERvdWJsZVJlY3Vyc2l2ZUFueSkgeworICBBbnlPdXQgb3V0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkFueSogYW55ID0gb3V0Lm11dGFibGVfYW55KCk7CisgIGFueS0+c2V0X3R5cGVfdXJsKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5BbnkiKTsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OkFueSBuZXN0ZWRfYW55OworICBuZXN0ZWRfYW55LnNldF90eXBlX3VybCgidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuQW55Iik7CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBbnkgc2Vjb25kX25lc3RlZF9hbnk7CisgIHNlY29uZF9uZXN0ZWRfYW55LnNldF90eXBlX3VybCgKKyAgICAgICJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvX3V0aWxfY29udmVydGVyLnRlc3RpbmcuQW55TSIpOworCisgIEFueU0gbTsKKyAgbS5zZXRfZm9vKCJmb292YWx1ZSIpOworICBzZWNvbmRfbmVzdGVkX2FueS5zZXRfdmFsdWUobS5TZXJpYWxpemVBc1N0cmluZygpKTsKKworICBuZXN0ZWRfYW55LnNldF92YWx1ZShzZWNvbmRfbmVzdGVkX2FueS5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgYW55LT5zZXRfdmFsdWUobmVzdGVkX2FueS5TZXJpYWxpemVBc1N0cmluZygpKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgiYW55IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJAdHlwZSIsICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5BbnkiKQorICAgICAgLT5TdGFydE9iamVjdCgidmFsdWUiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIkB0eXBlIiwgInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkFueSIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJ2YWx1ZSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgInR5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9fdXRpbF9jb252ZXJ0ZXIudGVzdGluZy5BbnlNIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJmb28iLCAiZm9vdmFsdWUiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQob3V0LCAxNTYpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJBbnlUZXN0LCBUeXBlVXJsQXRFbmQpIHsKKyAgQm9vayBib29rOworICBib29rLnNldF90aXRsZSgiQysrIik7CisgIGJvb2suc2V0X2xlbmd0aCgxMjM0KTsKKyAgYm9vay5zZXRfY29udGVudCgiSGVsbG8gV29ybGQhIik7CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBbnkgYW55OworICBhbnkuUGFja0Zyb20oYm9vayk7CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBbnkgb3V0ZXJfYW55OworICBvdXRlcl9hbnkuUGFja0Zyb20oYW55KTsKKworICBBbnlPdXQgb3V0OworICBvdXQubXV0YWJsZV9hbnkoKS0+UGFja0Zyb20ob3V0ZXJfYW55KTsKKworICAvLyBQdXQgdGhlIEB0eXBlIGZpZWxkIGF0IHRoZSBlbmQgb2YgZWFjaCBBbnkgbWVzc2FnZS4gUGFyc2VycyBzaG91bGQKKyAgLy8gYmUgYWJsZSB0byBhY2NlcHQgdGhhdC4KKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImFueSIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJ2YWx1ZSIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJ2YWx1ZSIpCisgICAgICAtPlJlbmRlclN0cmluZygidGl0bGUiLCAiQysrIikKKyAgICAgIC0+UmVuZGVySW50MzIoImxlbmd0aCIsIDEyMzQpCisgICAgICAtPlJlbmRlckJ5dGVzKCJjb250ZW50IiwgIkhlbGxvIFdvcmxkISIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgInR5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9fdXRpbF9jb252ZXJ0ZXIudGVzdGluZy5Cb29rIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJAdHlwZSIsICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5BbnkiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIkB0eXBlIiwgInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkFueSIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChvdXQpOworfQorCisvLyBTYW1lIGFzIFR5cGVVcmxBdEVuZCwgYnV0IHVzZSB0ZW1wb3Jhcnkgc3RyaW5nIHZhbHVlcyB0byBtYWtlIHN1cmUgd2UgZG9uJ3QKKy8vIG1pc3Rha2VubHkgc3RvcmUgU3RyaW5nUGllY2Ugb2JqZWN0cyBwb2ludGluZyB0byBpbnZhbGlkIG1lbW9yeS4KK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlckFueVRlc3QsIFR5cGVVcmxBdEVuZFdpdGhUZW1wb3JhcnlTdHJpbmdzKSB7CisgIEJvb2sgYm9vazsKKyAgYm9vay5zZXRfdGl0bGUoIkMrKyIpOworICBib29rLnNldF9sZW5ndGgoMTIzNCk7CisgIGJvb2suc2V0X2NvbnRlbnQoIkhlbGxvIFdvcmxkISIpOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QW55IGFueTsKKyAgYW55LlBhY2tGcm9tKGJvb2spOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QW55IG91dGVyX2FueTsKKyAgb3V0ZXJfYW55LlBhY2tGcm9tKGFueSk7CisKKyAgQW55T3V0IG91dDsKKyAgb3V0Lm11dGFibGVfYW55KCktPlBhY2tGcm9tKG91dGVyX2FueSk7CisKKyAgc3RkOjpzdHJpbmcgbmFtZSwgdmFsdWU7CisgIC8vIFB1dCB0aGUgQHR5cGUgZmllbGQgYXQgdGhlIGVuZCBvZiBlYWNoIEFueSBtZXNzYWdlLiBQYXJzZXJzIHNob3VsZAorICAvLyBiZSBhYmxlIHRvIGFjY2VwdCB0aGF0LgorICBvd18tPlN0YXJ0T2JqZWN0KCIiKS0+U3RhcnRPYmplY3QoImFueSIpOworICB7CisgICAgb3dfLT5TdGFydE9iamVjdCgidmFsdWUiKTsKKyAgICB7CisgICAgICBvd18tPlN0YXJ0T2JqZWN0KCJ2YWx1ZSIpOworICAgICAgeworICAgICAgICBuYW1lID0gInRpdGxlIjsKKyAgICAgICAgdmFsdWUgPSAiQysrIjsKKyAgICAgICAgb3dfLT5SZW5kZXJTdHJpbmcobmFtZSwgdmFsdWUpOworICAgICAgICBuYW1lID0gImxlbmd0aCI7CisgICAgICAgIG93Xy0+UmVuZGVySW50MzIobmFtZSwgMTIzNCk7CisgICAgICAgIG5hbWUgPSAiY29udGVudCI7CisgICAgICAgIHZhbHVlID0gIkhlbGxvIFdvcmxkISI7CisgICAgICAgIG93Xy0+UmVuZGVyQnl0ZXMobmFtZSwgdmFsdWUpOworICAgICAgICBuYW1lID0gIkB0eXBlIjsKKyAgICAgICAgdmFsdWUgPSAidHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b191dGlsX2NvbnZlcnRlci50ZXN0aW5nLkJvb2siOworICAgICAgICBvd18tPlJlbmRlclN0cmluZyhuYW1lLCB2YWx1ZSk7CisgICAgICB9CisgICAgICBvd18tPkVuZE9iamVjdCgpOworCisgICAgICBuYW1lID0gIkB0eXBlIjsKKyAgICAgIHZhbHVlID0gInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkFueSI7CisgICAgICBvd18tPlJlbmRlclN0cmluZyhuYW1lLCB2YWx1ZSk7CisgICAgfQorICAgIG93Xy0+RW5kT2JqZWN0KCk7CisKKyAgICBuYW1lID0gIkB0eXBlIjsKKyAgICB2YWx1ZSA9ICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5BbnkiOworICAgIG93Xy0+UmVuZGVyU3RyaW5nKG5hbWUsIHZhbHVlKTsKKyAgfQorICBvd18tPkVuZE9iamVjdCgpLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQob3V0KTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyQW55VGVzdCwgRW1wdHlBbnlGcm9tRW1wdHlPYmplY3QpIHsKKyAgQW55T3V0IG91dDsKKyAgb3V0Lm11dGFibGVfYW55KCk7CisKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkVmFsdWUoXywgXywgXykpLlRpbWVzKDApOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpLT5TdGFydE9iamVjdCgiYW55IiktPkVuZE9iamVjdCgpLT5FbmRPYmplY3QoKTsKKworICBDaGVja091dHB1dChvdXQsIDIpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJBbnlUZXN0LCBBbnlXaXRob3V0VHlwZVVybEZhaWxzMSkgeworICBBbnlPdXQgYW55OworCisgIEVYUEVDVF9DQUxMKAorICAgICAgbGlzdGVuZXJfLAorICAgICAgSW52YWxpZFZhbHVlKF8sIFN0cmluZ1BpZWNlKCJBbnkiKSwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgiTWlzc2luZyBAdHlwZSBmb3IgYW55IGZpZWxkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvdG9fdXRpbF9jb252ZXJ0ZXIudGVzdGluZy5BbnlPdXQiKSkpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhbnkiKQorICAgICAgLT5TdGFydE9iamVjdCgiYW5vdGhlciIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChhbnkpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJBbnlUZXN0LCBBbnlXaXRob3V0VHlwZVVybEZhaWxzMikgeworICBBbnlPdXQgYW55OworCisgIEVYUEVDVF9DQUxMKAorICAgICAgbGlzdGVuZXJfLAorICAgICAgSW52YWxpZFZhbHVlKF8sIFN0cmluZ1BpZWNlKCJBbnkiKSwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgiTWlzc2luZyBAdHlwZSBmb3IgYW55IGZpZWxkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvdG9fdXRpbF9jb252ZXJ0ZXIudGVzdGluZy5BbnlPdXQiKSkpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhbnkiKQorICAgICAgLT5TdGFydExpc3QoImFub3RoZXIiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoYW55KTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyQW55VGVzdCwgQW55V2l0aG91dFR5cGVVcmxGYWlsczMpIHsKKyAgQW55T3V0IGFueTsKKworICBFWFBFQ1RfQ0FMTCgKKyAgICAgIGxpc3RlbmVyXywKKyAgICAgIEludmFsaWRWYWx1ZShfLCBTdHJpbmdQaWVjZSgiQW55IiksCisgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoIk1pc3NpbmcgQHR5cGUgZm9yIGFueSBmaWVsZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3RvX3V0aWxfY29udmVydGVyLnRlc3RpbmcuQW55T3V0IikpKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgiYW55IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ2YWx1ZSIsICJzb21ldmFsdWUiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoYW55KTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyQW55VGVzdCwgQW55V2l0aEludmFsaWRUeXBlVXJsRmFpbHMpIHsKKyAgQW55T3V0IGFueTsKKworICBFWFBFQ1RfQ0FMTCgKKyAgICAgIGxpc3RlbmVyXywKKyAgICAgIEludmFsaWRWYWx1ZSgKKyAgICAgICAgICBfLCBTdHJpbmdQaWVjZSgiQW55IiksCisgICAgICAgICAgU3RyaW5nUGllY2UoIkludmFsaWQgdHlwZSBVUkwsIHR5cGUgVVJMcyBtdXN0IGJlIG9mIHRoZSBmb3JtICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ3R5cGUuZ29vZ2xlYXBpcy5jb20vPHR5cGVuYW1lPicsIGdvdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlLm90aGVyLmNvbS9zb21lLlR5cGUiKSkpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhbnkiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIkB0eXBlIiwgInR5cGUub3RoZXIuY29tL3NvbWUuVHlwZSIpCisgICAgICAtPlJlbmRlckRvdWJsZSgidmFsdWUiLCA0MC4yKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoYW55KTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyQW55VGVzdCwgQW55V2l0aFVua25vd25UeXBlRmFpbHMpIHsKKyAgQW55T3V0IGFueTsKKworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sCisgICAgICAgICAgICAgIEludmFsaWRWYWx1ZShfLCBTdHJpbmdQaWVjZSgiQW55IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB0eXBlIFVSTCwgdW5rbm93biB0eXBlOiBzb21lLlR5cGUiKSkpOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgiYW55IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJAdHlwZSIsICJ0eXBlLmdvb2dsZWFwaXMuY29tL3NvbWUuVHlwZSIpCisgICAgICAtPlJlbmRlckRvdWJsZSgidmFsdWUiLCA0MC4yKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoYW55KTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyQW55VGVzdCwgQW55SW5jb3JyZWN0SW5wdXRUeXBlRmFpbHMpIHsKKyAgQW55T3V0IGFueTsKKworICBFWFBFQ1RfQ0FMTCgKKyAgICAgIGxpc3RlbmVyXywKKyAgICAgIEludmFsaWRWYWx1ZShfLAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5BbnkiKSwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgiMSIpKSk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpLT5SZW5kZXJJbnQzMigiYW55IiwgMSktPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChhbnkpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJBbnlUZXN0LCBBbnlBY2NlcHRzTnVsbCkgeworICBBbnlPdXQgYW55OworCisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgSW52YWxpZFZhbHVlKF8sIF8sIF8pKS5UaW1lcygwKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlJlbmRlck51bGwoImFueSIpLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoYW55KTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyQW55VGVzdCwgQW55V2VsbEtub3duVHlwZUVycm9yVGVzdCkgeworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBTdHJpbmdQaWVjZSgiQW55IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKCJJbnZhbGlkIHRpbWUgZm9ybWF0OiAiKSkpOworCisgIEFueU91dCBhbnk7CisgIGdvb2dsZTo6cHJvdG9idWY6OkFueSogYW55X3R5cGUgPSBhbnkubXV0YWJsZV9hbnkoKTsKKyAgYW55X3R5cGUtPnNldF90eXBlX3VybCgidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIik7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImFueSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLCAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ2YWx1ZSIsICIiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoYW55KTsKK30KKworLy8gVGVzdCB0aGUgZm9sbG93aW5nIGNhc2U6CisvLworLy8geworLy8gICAiYW55IjogeworLy8gICAgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5WYWx1ZSIsCisvLyAgICAgInZhbHVlIjogImFiYyIKKy8vICAgfQorLy8gfQorVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyQW55VGVzdCwgQW55V2l0aE5lc3RlZFByaW1pdGl2ZVZhbHVlKSB7CisgIEFueU91dCBvdXQ7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QW55KiBhbnkgPSBvdXQubXV0YWJsZV9hbnkoKTsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OlZhbHVlIHZhbHVlOworICB2YWx1ZS5zZXRfc3RyaW5nX3ZhbHVlKCJhYmMiKTsKKyAgYW55LT5QYWNrRnJvbSh2YWx1ZSk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImFueSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLCAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVmFsdWUiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInZhbHVlIiwgImFiYyIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChvdXQpOworfQorCisvLyBUZXN0IHRoZSBmb2xsb3dpbmcgY2FzZToKKy8vCisvLyB7CisvLyAgICJhbnkiOiB7CisvLyAgICAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlZhbHVlIiwKKy8vICAgICAidmFsdWUiOiB7CisvLyAgICAgICAiZm9vIjogImFiYyIKKy8vICAgICB9CisvLyAgIH0KKy8vIH0KK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlckFueVRlc3QsIEFueVdpdGhOZXN0ZWRPYmplY3RWYWx1ZSkgeworICBBbnlPdXQgb3V0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkFueSogYW55ID0gb3V0Lm11dGFibGVfYW55KCk7CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpWYWx1ZSB2YWx1ZTsKKyAgKCp2YWx1ZS5tdXRhYmxlX3N0cnVjdF92YWx1ZSgpLT5tdXRhYmxlX2ZpZWxkcygpKVsiZm9vIl0uc2V0X3N0cmluZ192YWx1ZSgKKyAgICAgICJhYmMiKTsKKyAgYW55LT5QYWNrRnJvbSh2YWx1ZSk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImFueSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLCAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVmFsdWUiKQorICAgICAgLT5TdGFydE9iamVjdCgidmFsdWUiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoImZvbyIsICJhYmMiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQob3V0KTsKK30KKworLy8gVGVzdCB0aGUgZm9sbG93aW5nIGNhc2U6CisvLworLy8geworLy8gICAiYW55IjogeworLy8gICAgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5WYWx1ZSIsCisvLyAgICAgInZhbHVlIjogWyJoZWxsbyJdLAorLy8gICB9CisvLyB9CitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJBbnlUZXN0LCBBbnlXaXRoTmVzdGVkQXJyYXlWYWx1ZSkgeworICBBbnlPdXQgb3V0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkFueSogYW55ID0gb3V0Lm11dGFibGVfYW55KCk7CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpWYWx1ZSB2YWx1ZTsKKyAgdmFsdWUubXV0YWJsZV9saXN0X3ZhbHVlKCktPmFkZF92YWx1ZXMoKS0+c2V0X3N0cmluZ192YWx1ZSgiaGVsbG8iKTsKKyAgYW55LT5QYWNrRnJvbSh2YWx1ZSk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImFueSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLCAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVmFsdWUiKQorICAgICAgLT5TdGFydExpc3QoInZhbHVlIikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCIiLCAiaGVsbG8iKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KG91dCk7Cit9CisKKy8vIFRlc3QgdGhlIGZvbGxvd2luZyBjYXNlOgorLy8KKy8vIHsKKy8vICAgImFueSI6IHsKKy8vICAgICAiQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVmFsdWUiLAorLy8gICAgICJub3RfdmFsdWUiOiAiIgorLy8gICB9CisvLyB9CitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJBbnlUZXN0LAorICAgICAgIEFueVdlbGxLbm93blR5cGVzTm9WYWx1ZUZpZWxkRm9yUHJpbWl0aXZlKSB7CisgIEVYUEVDVF9DQUxMKAorICAgICAgbGlzdGVuZXJfLAorICAgICAgSW52YWxpZFZhbHVlKAorICAgICAgICAgIF8sIFN0cmluZ1BpZWNlKCJBbnkiKSwKKyAgICAgICAgICBTdHJpbmdQaWVjZSgiRXhwZWN0IGEgXCJ2YWx1ZVwiIGZpZWxkIGZvciB3ZWxsLWtub3duIHR5cGVzLiIpKSk7CisgIEFueU91dCBhbnk7CisgIGdvb2dsZTo6cHJvdG9idWY6OkFueSogYW55X3R5cGUgPSBhbnkubXV0YWJsZV9hbnkoKTsKKyAgYW55X3R5cGUtPnNldF90eXBlX3VybCgidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVmFsdWUiKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgiYW55IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJAdHlwZSIsICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5WYWx1ZSIpCisgICAgICAtPlJlbmRlclN0cmluZygibm90X3ZhbHVlIiwgIiIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChhbnkpOworfQorCisvLyBUZXN0IHRoZSBmb2xsb3dpbmcgY2FzZToKKy8vCisvLyB7CisvLyAgICJhbnkiOiB7CisvLyAgICAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlZhbHVlIiwKKy8vICAgICAibm90X3ZhbHVlIjoge30KKy8vICAgfQorLy8gfQorVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyQW55VGVzdCwgQW55V2VsbEtub3duVHlwZXNOb1ZhbHVlRmllbGRGb3JPYmplY3QpIHsKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkVmFsdWUoCisgICAgICAgICAgXywgU3RyaW5nUGllY2UoIkFueSIpLAorICAgICAgICAgIFN0cmluZ1BpZWNlKCJFeHBlY3QgYSBcInZhbHVlXCIgZmllbGQgZm9yIHdlbGwta25vd24gdHlwZXMuIikpKTsKKyAgQW55T3V0IGFueTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6QW55KiBhbnlfdHlwZSA9IGFueS5tdXRhYmxlX2FueSgpOworICBhbnlfdHlwZS0+c2V0X3R5cGVfdXJsKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5WYWx1ZSIpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhbnkiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIkB0eXBlIiwgInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlZhbHVlIikKKyAgICAgIC0+U3RhcnRPYmplY3QoIm5vdF92YWx1ZSIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChhbnkpOworfQorCisvLyBUZXN0IHRoZSBmb2xsb3dpbmcgY2FzZToKKy8vCisvLyB7CisvLyAgICJhbnkiOiB7CisvLyAgICAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlZhbHVlIiwKKy8vICAgICAibm90X3ZhbHVlIjogW10sCisvLyAgIH0KKy8vIH0KK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlckFueVRlc3QsIEFueVdlbGxLbm93blR5cGVzTm9WYWx1ZUZpZWxkRm9yQXJyYXkpIHsKKyAgRVhQRUNUX0NBTEwoCisgICAgICBsaXN0ZW5lcl8sCisgICAgICBJbnZhbGlkVmFsdWUoCisgICAgICAgICAgXywgU3RyaW5nUGllY2UoIkFueSIpLAorICAgICAgICAgIFN0cmluZ1BpZWNlKCJFeHBlY3QgYSBcInZhbHVlXCIgZmllbGQgZm9yIHdlbGwta25vd24gdHlwZXMuIikpKTsKKyAgQW55T3V0IGFueTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6QW55KiBhbnlfdHlwZSA9IGFueS5tdXRhYmxlX2FueSgpOworICBhbnlfdHlwZS0+c2V0X3R5cGVfdXJsKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5WYWx1ZSIpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhbnkiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIkB0eXBlIiwgInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlZhbHVlIikKKyAgICAgIC0+U3RhcnRMaXN0KCJub3RfdmFsdWUiKQorICAgICAgLT5FbmRMaXN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KGFueSk7Cit9CisKKy8vIFRlc3QgdGhlIGZvbGxvd2luZyBjYXNlOgorLy8KKy8vIHsKKy8vICAgImFueSI6IHsKKy8vICAgICAiQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuU3RydWN0IiwKKy8vICAgICAidmFsdWUiOiAiIiwKKy8vICAgfQorLy8gfQorVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyQW55VGVzdCwgQW55V2VsbEtub3duVHlwZXNFeHBlY3RPYmplY3RGb3JTdHJ1Y3QpIHsKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLAorICAgICAgICAgICAgICBJbnZhbGlkVmFsdWUoXywgU3RyaW5nUGllY2UoIkFueSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoIkV4cGVjdCBhIEpTT04gb2JqZWN0LiIpKSk7CisgIEFueU91dCBhbnk7CisgIGdvb2dsZTo6cHJvdG9idWY6OkFueSogYW55X3R5cGUgPSBhbnkubXV0YWJsZV9hbnkoKTsKKyAgYW55X3R5cGUtPnNldF90eXBlX3VybCgidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuU3RydWN0Iik7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImFueSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLCAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuU3RydWN0IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJ2YWx1ZSIsICIiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoYW55KTsKK30KKworLy8gVGVzdCB0aGUgZm9sbG93aW5nIGNhc2U6CisvLworLy8geworLy8gICAiYW55IjogeworLy8gICAgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5BbnkiLAorLy8gICAgICJ2YWx1ZSI6ICIiLAorLy8gICB9CisvLyB9CitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJBbnlUZXN0LCBBbnlXZWxsS25vd25UeXBlc0V4cGVjdE9iamVjdEZvckFueSkgeworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sCisgICAgICAgICAgICAgIEludmFsaWRWYWx1ZShfLCBTdHJpbmdQaWVjZSgiQW55IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgiRXhwZWN0IGEgSlNPTiBvYmplY3QuIikpKTsKKyAgQW55T3V0IGFueTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6QW55KiBhbnlfdHlwZSA9IGFueS5tdXRhYmxlX2FueSgpOworICBhbnlfdHlwZS0+c2V0X3R5cGVfdXJsKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5BbnkiKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgiYW55IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJAdHlwZSIsICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5BbnkiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoInZhbHVlIiwgIiIpCisgICAgICAtPkVuZE9iamVjdCgpCisgICAgICAtPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dChhbnkpOworfQorCisvLyB7CisvLyAgICJhbnkiOiB7CisvLyAgICAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkFueSIsCisvLyAgICAgInZhbHVlIjogbnVsbAorLy8gICB9CisvLyB9CitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJBbnlUZXN0LCBBbnlJbkFueUFjY2VwdHNOdWxsKSB7CisgIEFueU91dCBvdXQ7CisgIGdvb2dsZTo6cHJvdG9idWY6OkFueSBlbXB0eTsKKyAgb3V0Lm11dGFibGVfYW55KCktPlBhY2tGcm9tKGVtcHR5KTsKKworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBfLCBfKSkuVGltZXMoMCk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpCisgICAgICAtPlN0YXJ0T2JqZWN0KCJhbnkiKQorICAgICAgLT5SZW5kZXJTdHJpbmcoIkB0eXBlIiwgInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkFueSIpCisgICAgICAtPlJlbmRlck51bGwoInZhbHVlIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KG91dCk7Cit9CisKKy8vIHsKKy8vICAgImFueSI6IHsKKy8vICAgICAiQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIiwKKy8vICAgICAidmFsdWUiOiBudWxsCisvLyAgIH0KKy8vIH0KK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlckFueVRlc3QsIFRpbWVzdGFtcEluQW55QWNjZXB0c051bGwpIHsKKyAgQW55T3V0IG91dDsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6VGltZXN0YW1wIGVtcHR5OworICBvdXQubXV0YWJsZV9hbnkoKS0+UGFja0Zyb20oZW1wdHkpOworCisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgSW52YWxpZFZhbHVlKF8sIF8sIF8pKS5UaW1lcygwKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImFueSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLCAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIikKKyAgICAgIC0+UmVuZGVyTnVsbCgidmFsdWUiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQob3V0KTsKK30KKworLy8geworLy8gICAiYW55IjogeworLy8gICAgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiIsCisvLyAgICAgInZhbHVlIjogbnVsbAorLy8gICB9CisvLyB9CitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJBbnlUZXN0LCBEdXJhdGlvbkluQW55QWNjZXB0c051bGwpIHsKKyAgQW55T3V0IG91dDsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6RHVyYXRpb24gZW1wdHk7CisgIG91dC5tdXRhYmxlX2FueSgpLT5QYWNrRnJvbShlbXB0eSk7CisKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkVmFsdWUoXywgXywgXykpLlRpbWVzKDApOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgiYW55IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJAdHlwZSIsICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiIpCisgICAgICAtPlJlbmRlck51bGwoInZhbHVlIikKKyAgICAgIC0+RW5kT2JqZWN0KCkKKyAgICAgIC0+RW5kT2JqZWN0KCk7CisgIENoZWNrT3V0cHV0KG91dCk7Cit9CisKKy8vIHsKKy8vICAgImFueSI6IHsKKy8vICAgICAiQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuRmllbGRNYXNrIiwKKy8vICAgICAidmFsdWUiOiBudWxsCisvLyAgIH0KKy8vIH0KK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlckFueVRlc3QsIEZpZWxkTWFza0luQW55QWNjZXB0c051bGwpIHsKKyAgQW55T3V0IG91dDsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGRNYXNrIGVtcHR5OworICBvdXQubXV0YWJsZV9hbnkoKS0+UGFja0Zyb20oZW1wdHkpOworCisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgSW52YWxpZFZhbHVlKF8sIF8sIF8pKS5UaW1lcygwKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIikKKyAgICAgIC0+U3RhcnRPYmplY3QoImFueSIpCisgICAgICAtPlJlbmRlclN0cmluZygiQHR5cGUiLCAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuRmllbGRNYXNrIikKKyAgICAgIC0+UmVuZGVyTnVsbCgidmFsdWUiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQob3V0KTsKK30KKworLy8geworLy8gICAiYW55IjogeworLy8gICAgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIiwKKy8vICAgICAidmFsdWUiOiBudWxsCisvLyAgIH0KKy8vIH0KK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlckFueVRlc3QsIFdyYXBwZXJJbkFueUFjY2VwdHNOdWxsKSB7CisgIEFueU91dCBvdXQ7CisgIGdvb2dsZTo6cHJvdG9idWY6OkludDMyVmFsdWUgZW1wdHk7CisgIG91dC5tdXRhYmxlX2FueSgpLT5QYWNrRnJvbShlbXB0eSk7CisKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkVmFsdWUoXywgXywgXykpLlRpbWVzKDApOworICBvd18tPlN0YXJ0T2JqZWN0KCIiKQorICAgICAgLT5TdGFydE9iamVjdCgiYW55IikKKyAgICAgIC0+UmVuZGVyU3RyaW5nKCJAdHlwZSIsICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIikKKyAgICAgIC0+UmVuZGVyTnVsbCgidmFsdWUiKQorICAgICAgLT5FbmRPYmplY3QoKQorICAgICAgLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQob3V0KTsKK30KKworY2xhc3MgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJGaWVsZE1hc2tUZXN0CisgICAgOiBwdWJsaWMgQmFzZVByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCB7CisgcHJvdGVjdGVkOgorICBQcm90b1N0cmVhbU9iamVjdFdyaXRlckZpZWxkTWFza1Rlc3QoKSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+IGRlc2NyaXB0b3JzOworICAgIGRlc2NyaXB0b3JzLnB1c2hfYmFjayhGaWVsZE1hc2tUZXN0OjpkZXNjcmlwdG9yKCkpOworICAgIGRlc2NyaXB0b3JzLnB1c2hfYmFjayhnb29nbGU6OnByb3RvYnVmOjpGaWVsZE1hc2s6OmRlc2NyaXB0b3IoKSk7CisgICAgUmVzZXRUeXBlSW5mbyhkZXNjcmlwdG9ycyk7CisgIH0KK307CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChEaWZmZXJlbnRUeXBlSW5mb1NvdXJjZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJGaWVsZE1hc2tUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpVU0VfVFlQRV9SRVNPTFZFUikpOworCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJGaWVsZE1hc2tUZXN0LCBTaW1wbGVGaWVsZE1hc2tUZXN0KSB7CisgIEZpZWxkTWFza1Rlc3QgZXhwZWN0ZWQ7CisgIGV4cGVjdGVkLnNldF9pZCgiMSIpOworICBleHBlY3RlZC5tdXRhYmxlX3NpbmdsZV9tYXNrKCktPmFkZF9wYXRocygicGF0aDEiKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKTsKKyAgb3dfLT5SZW5kZXJTdHJpbmcoImlkIiwgIjEiKTsKKyAgb3dfLT5SZW5kZXJTdHJpbmcoInNpbmdsZV9tYXNrIiwgInBhdGgxIik7CisgIG93Xy0+RW5kT2JqZWN0KCk7CisKKyAgQ2hlY2tPdXRwdXQoZXhwZWN0ZWQpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJGaWVsZE1hc2tUZXN0LCBNdWx0aXBsZU1hc2tzSW5Db21wYWN0Rm9ybSkgeworICBGaWVsZE1hc2tUZXN0IGV4cGVjdGVkOworICBleHBlY3RlZC5zZXRfaWQoIjEiKTsKKyAgZXhwZWN0ZWQubXV0YWJsZV9zaW5nbGVfbWFzaygpLT5hZGRfcGF0aHMoImNhbWVsX2Nhc2UxIik7CisgIGV4cGVjdGVkLm11dGFibGVfc2luZ2xlX21hc2soKS0+YWRkX3BhdGhzKCJjYW1lbF9jYXNlMiIpOworICBleHBlY3RlZC5tdXRhYmxlX3NpbmdsZV9tYXNrKCktPmFkZF9wYXRocygiY2FtZWxfY2FzZTMiKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKTsKKyAgb3dfLT5SZW5kZXJTdHJpbmcoImlkIiwgIjEiKTsKKyAgb3dfLT5SZW5kZXJTdHJpbmcoInNpbmdsZV9tYXNrIiwgImNhbWVsQ2FzZTEsY2FtZWxDYXNlMixjYW1lbENhc2UzIik7CisgIG93Xy0+RW5kT2JqZWN0KCk7CisKKyAgQ2hlY2tPdXRwdXQoZXhwZWN0ZWQpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJGaWVsZE1hc2tUZXN0LCBSZXBlYXRlZEZpZWxkTWFza1Rlc3QpIHsKKyAgRmllbGRNYXNrVGVzdCBleHBlY3RlZDsKKyAgZXhwZWN0ZWQuc2V0X2lkKCIxIik7CisgIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkTWFzayogbWFzayA9IGV4cGVjdGVkLmFkZF9yZXBlYXRlZF9tYXNrKCk7CisgIG1hc2stPmFkZF9wYXRocygiZmllbGQxIik7CisgIG1hc2stPmFkZF9wYXRocygiZmllbGQyIik7CisgIGV4cGVjdGVkLmFkZF9yZXBlYXRlZF9tYXNrKCktPmFkZF9wYXRocygiZmllbGQzIik7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIik7CisgIG93Xy0+UmVuZGVyU3RyaW5nKCJpZCIsICIxIik7CisgIG93Xy0+U3RhcnRMaXN0KCJyZXBlYXRlZF9tYXNrIik7CisgIG93Xy0+UmVuZGVyU3RyaW5nKCIiLCAiZmllbGQxLGZpZWxkMiIpOworICBvd18tPlJlbmRlclN0cmluZygiIiwgImZpZWxkMyIpOworICBvd18tPkVuZExpc3QoKTsKKyAgb3dfLT5FbmRPYmplY3QoKTsKKworICBDaGVja091dHB1dChleHBlY3RlZCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlckZpZWxkTWFza1Rlc3QsIEVtcHR5RmllbGRNYXNrVGVzdCkgeworICBGaWVsZE1hc2tUZXN0IGV4cGVjdGVkOworICBleHBlY3RlZC5zZXRfaWQoIjEiKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKTsKKyAgb3dfLT5SZW5kZXJTdHJpbmcoImlkIiwgIjEiKTsKKyAgb3dfLT5SZW5kZXJTdHJpbmcoInNpbmdsZV9tYXNrIiwgIiIpOworICBvd18tPkVuZE9iamVjdCgpOworCisgIENoZWNrT3V0cHV0KGV4cGVjdGVkKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyRmllbGRNYXNrVGVzdCwgTWFza1VzaW5nQXBpYXJ5U3R5bGVTaG91bGRXb3JrKSB7CisgIEZpZWxkTWFza1Rlc3QgZXhwZWN0ZWQ7CisgIGV4cGVjdGVkLnNldF9pZCgiMSIpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpOworICBvd18tPlJlbmRlclN0cmluZygiaWQiLCAiMSIpOworICAvLyBDYXNlMQorICBvd18tPlJlbmRlclN0cmluZygic2luZ2xlX21hc2siLAorICAgICAgICAgICAgICAgICAgICAib3V0ZXJGaWVsZChjYW1lbENhc2UxLGNhbWVsQ2FzZTIsY2FtZWxDYXNlMykiKTsKKyAgZXhwZWN0ZWQubXV0YWJsZV9zaW5nbGVfbWFzaygpLT5hZGRfcGF0aHMoIm91dGVyX2ZpZWxkLmNhbWVsX2Nhc2UxIik7CisgIGV4cGVjdGVkLm11dGFibGVfc2luZ2xlX21hc2soKS0+YWRkX3BhdGhzKCJvdXRlcl9maWVsZC5jYW1lbF9jYXNlMiIpOworICBleHBlY3RlZC5tdXRhYmxlX3NpbmdsZV9tYXNrKCktPmFkZF9wYXRocygib3V0ZXJfZmllbGQuY2FtZWxfY2FzZTMiKTsKKworICBvd18tPlN0YXJ0TGlzdCgicmVwZWF0ZWRfbWFzayIpOworCisgIG93Xy0+UmVuZGVyU3RyaW5nKCIiLCAiYShmaWVsZDEsZmllbGQyKSIpOworICBnb29nbGU6OnByb3RvYnVmOjpGaWVsZE1hc2sqIG1hc2sgPSBleHBlY3RlZC5hZGRfcmVwZWF0ZWRfbWFzaygpOworICBtYXNrLT5hZGRfcGF0aHMoImEuZmllbGQxIik7CisgIG1hc2stPmFkZF9wYXRocygiYS5maWVsZDIiKTsKKworICBvd18tPlJlbmRlclN0cmluZygiIiwgImEoZmllbGQzKSIpOworICBtYXNrID0gZXhwZWN0ZWQuYWRkX3JlcGVhdGVkX21hc2soKTsKKyAgbWFzay0+YWRkX3BhdGhzKCJhLmZpZWxkMyIpOworCisgIG93Xy0+UmVuZGVyU3RyaW5nKCIiLCAiYSgpIik7CisgIGV4cGVjdGVkLmFkZF9yZXBlYXRlZF9tYXNrKCk7CisKKyAgb3dfLT5SZW5kZXJTdHJpbmcoIiIsICJhKCwpIik7CisgIGV4cGVjdGVkLmFkZF9yZXBlYXRlZF9tYXNrKCk7CisKKyAgb3dfLT5SZW5kZXJTdHJpbmcoIiIsICJhKGZpZWxkMShmaWVsZDIoZmllbGQzKSkpIik7CisgIG1hc2sgPSBleHBlY3RlZC5hZGRfcmVwZWF0ZWRfbWFzaygpOworICBtYXNrLT5hZGRfcGF0aHMoImEuZmllbGQxLmZpZWxkMi5maWVsZDMiKTsKKworICBvd18tPlJlbmRlclN0cmluZygiIiwgImEoZmllbGQxKGZpZWxkMihmaWVsZDMsZmllbGQ0KSxmaWVsZDUpLGZpZWxkNikiKTsKKyAgbWFzayA9IGV4cGVjdGVkLmFkZF9yZXBlYXRlZF9tYXNrKCk7CisgIG1hc2stPmFkZF9wYXRocygiYS5maWVsZDEuZmllbGQyLmZpZWxkMyIpOworICBtYXNrLT5hZGRfcGF0aHMoImEuZmllbGQxLmZpZWxkMi5maWVsZDQiKTsKKyAgbWFzay0+YWRkX3BhdGhzKCJhLmZpZWxkMS5maWVsZDUiKTsKKyAgbWFzay0+YWRkX3BhdGhzKCJhLmZpZWxkNiIpOworCisgIG93Xy0+UmVuZGVyU3RyaW5nKCIiLCAiYShpZCxmaWVsZDEoaWQsZmllbGQyKGZpZWxkMyxmaWVsZDQpLGZpZWxkNSksZmllbGQ2KSIpOworICBtYXNrID0gZXhwZWN0ZWQuYWRkX3JlcGVhdGVkX21hc2soKTsKKyAgbWFzay0+YWRkX3BhdGhzKCJhLmlkIik7CisgIG1hc2stPmFkZF9wYXRocygiYS5maWVsZDEuaWQiKTsKKyAgbWFzay0+YWRkX3BhdGhzKCJhLmZpZWxkMS5maWVsZDIuZmllbGQzIik7CisgIG1hc2stPmFkZF9wYXRocygiYS5maWVsZDEuZmllbGQyLmZpZWxkNCIpOworICBtYXNrLT5hZGRfcGF0aHMoImEuZmllbGQxLmZpZWxkNSIpOworICBtYXNrLT5hZGRfcGF0aHMoImEuZmllbGQ2Iik7CisKKyAgb3dfLT5SZW5kZXJTdHJpbmcoIiIsICJhKCgoZmllbGQzLGZpZWxkNCkpKSIpOworICBtYXNrID0gZXhwZWN0ZWQuYWRkX3JlcGVhdGVkX21hc2soKTsKKyAgbWFzay0+YWRkX3BhdGhzKCJhLmZpZWxkMyIpOworICBtYXNrLT5hZGRfcGF0aHMoImEuZmllbGQ0Iik7CisKKyAgb3dfLT5FbmRMaXN0KCk7CisgIG93Xy0+RW5kT2JqZWN0KCk7CisKKyAgQ2hlY2tPdXRwdXQoZXhwZWN0ZWQpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJGaWVsZE1hc2tUZXN0LCBNb3JlQ2xvc2VUaGFuT3BlblBhcmVudGhlc2VzKSB7CisgIEVYUEVDVF9DQUxMKAorICAgICAgbGlzdGVuZXJfLAorICAgICAgSW52YWxpZFZhbHVlKAorICAgICAgICAgIF8sIFN0cmluZ1BpZWNlKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2siKSwKKyAgICAgICAgICBTdHJpbmdQaWVjZSgiRmllbGQgJ3NpbmdsZV9tYXNrJywgSW52YWxpZCBGaWVsZE1hc2sgJ2EoYixjKSknLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBmaW5kIG1hdGNoaW5nICcoJyBmb3IgYWxsICcpJy4iKSkpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpOworICBvd18tPlJlbmRlclN0cmluZygiaWQiLCAiMSIpOworICBvd18tPlJlbmRlclN0cmluZygic2luZ2xlX21hc2siLCAiYShiLGMpKSIpOworICBvd18tPkVuZE9iamVjdCgpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJGaWVsZE1hc2tUZXN0LCBNb3JlT3BlblRoYW5DbG9zZVBhcmVudGhlc2VzKSB7CisgIEVYUEVDVF9DQUxMKAorICAgICAgbGlzdGVuZXJfLAorICAgICAgSW52YWxpZFZhbHVlKAorICAgICAgICAgIF8sIFN0cmluZ1BpZWNlKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2siKSwKKyAgICAgICAgICBTdHJpbmdQaWVjZSgKKyAgICAgICAgICAgICAgIkZpZWxkICdzaW5nbGVfbWFzaycsIEludmFsaWQgRmllbGRNYXNrICdhKCgoYixjKScuIENhbm5vdCAiCisgICAgICAgICAgICAgICJmaW5kIG1hdGNoaW5nICcpJyBmb3IgYWxsICcoJy4iKSkpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpOworICBvd18tPlJlbmRlclN0cmluZygiaWQiLCAiMSIpOworICBvd18tPlJlbmRlclN0cmluZygic2luZ2xlX21hc2siLCAiYSgoKGIsYykiKTsKKyAgb3dfLT5FbmRPYmplY3QoKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyRmllbGRNYXNrVGVzdCwgUGF0aFdpdGhNYXBLZXlTaG91bGRXb3JrKSB7CisgIEZpZWxkTWFza1Rlc3QgZXhwZWN0ZWQ7CisgIGV4cGVjdGVkLm11dGFibGVfc2luZ2xlX21hc2soKS0+YWRkX3BhdGhzKCJwYXRoLnRvLm1hcFtcImtleTFcIl0iKTsKKyAgZXhwZWN0ZWQubXV0YWJsZV9zaW5nbGVfbWFzaygpLT5hZGRfcGF0aHMoCisgICAgICAicGF0aC50by5tYXBbXCJlXFxcIltdXVtzY2FwZVxcXCJcIl0iKTsKKyAgZXhwZWN0ZWQubXV0YWJsZV9zaW5nbGVfbWFzaygpLT5hZGRfcGF0aHMoInBhdGgudG8ubWFwW1wia2V5MlwiXSIpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpOworICBvd18tPlJlbmRlclN0cmluZygic2luZ2xlX21hc2siLAorICAgICAgICAgICAgICAgICAgICAicGF0aC50by5tYXBbXCJrZXkxXCJdLHBhdGgudG8ubWFwW1wiZVxcXCJbXV1bc2NhcGVcXFwiXCJdLCIKKyAgICAgICAgICAgICAgICAgICAgInBhdGgudG8ubWFwW1wia2V5MlwiXSIpOworICBvd18tPkVuZE9iamVjdCgpOworCisgIENoZWNrT3V0cHV0KGV4cGVjdGVkKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyRmllbGRNYXNrVGVzdCwKKyAgICAgICBNYXBLZXlNdXN0QmVBdFRoZUVuZE9mQVBhdGhTZWdtZW50KSB7CisgIEVYUEVDVF9DQUxMKAorICAgICAgbGlzdGVuZXJfLAorICAgICAgSW52YWxpZFZhbHVlKAorICAgICAgICAgIF8sIFN0cmluZ1BpZWNlKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2siKSwKKyAgICAgICAgICBTdHJpbmdQaWVjZSgKKyAgICAgICAgICAgICAgIkZpZWxkICdzaW5nbGVfbWFzaycsIEludmFsaWQgRmllbGRNYXNrICIKKyAgICAgICAgICAgICAgIidwYXRoLnRvLm1hcFtcImtleTFcIl1hLHBhdGgudG8ubWFwW1wia2V5MlwiXScuICIKKyAgICAgICAgICAgICAgIk1hcCBrZXlzIHNob3VsZCBiZSBhdCB0aGUgZW5kIG9mIGEgcGF0aCBzZWdtZW50LiIpKSk7CisKKyAgb3dfLT5TdGFydE9iamVjdCgiIik7CisgIG93Xy0+UmVuZGVyU3RyaW5nKCJzaW5nbGVfbWFzayIsCisgICAgICAgICAgICAgICAgICAgICJwYXRoLnRvLm1hcFtcImtleTFcIl1hLHBhdGgudG8ubWFwW1wia2V5MlwiXSIpOworICBvd18tPkVuZE9iamVjdCgpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJGaWVsZE1hc2tUZXN0LCBNYXBLZXlNdXN0RW5kKSB7CisgIEVYUEVDVF9DQUxMKAorICAgICAgbGlzdGVuZXJfLAorICAgICAgSW52YWxpZFZhbHVlKAorICAgICAgICAgIF8sIFN0cmluZ1BpZWNlKCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2siKSwKKyAgICAgICAgICBTdHJpbmdQaWVjZSgiRmllbGQgJ3NpbmdsZV9tYXNrJywgSW52YWxpZCBGaWVsZE1hc2sgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIncGF0aC50by5tYXBbXCJrZXkxXCInLiBNYXAga2V5cyBzaG91bGQgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXByZXNlbnRlZCBhcyBbXCJzb21lX2tleVwiXS4iKSkpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpOworICBvd18tPlJlbmRlclN0cmluZygic2luZ2xlX21hc2siLCAicGF0aC50by5tYXBbXCJrZXkxXCIiKTsKKyAgb3dfLT5FbmRPYmplY3QoKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyRmllbGRNYXNrVGVzdCwgTWFwS2V5TXVzdEJlRXNjYXBlZENvcnJlY3RseSkgeworICBFWFBFQ1RfQ0FMTCgKKyAgICAgIGxpc3RlbmVyXywKKyAgICAgIEludmFsaWRWYWx1ZSgKKyAgICAgICAgICBfLCBTdHJpbmdQaWVjZSgidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuRmllbGRNYXNrIiksCisgICAgICAgICAgU3RyaW5nUGllY2UoIkZpZWxkICdzaW5nbGVfbWFzaycsIEludmFsaWQgRmllbGRNYXNrICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ3BhdGgudG8ubWFwW1wia2VcInkxXCJdJy4gTWFwIGtleXMgc2hvdWxkIGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwcmVzZW50ZWQgYXMgW1wic29tZV9rZXlcIl0uIikpKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKTsKKyAgb3dfLT5SZW5kZXJTdHJpbmcoInNpbmdsZV9tYXNrIiwgInBhdGgudG8ubWFwW1wia2VcInkxXCJdIik7CisgIG93Xy0+RW5kT2JqZWN0KCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlckZpZWxkTWFza1Rlc3QsIE1hcEtleUNhbkNvbnRhaW5BbnlDaGFycykgeworICBGaWVsZE1hc2tUZXN0IGV4cGVjdGVkOworICBleHBlY3RlZC5tdXRhYmxlX3NpbmdsZV9tYXNrKCktPmFkZF9wYXRocygKKyAgICAgIC8vIFx4RTVceEFEXHg5OSBpcyB0aGUgVVRGLTggYnl0ZSBzZXF1ZW5jZSBmb3IgY2hpbmVzZSBjaGFyYWN0ZXIg5a2ZLgorICAgICAgLy8gV2UgY2Fubm90IGVtYmVkIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBjb2RlIGRpcmVjdGx5IGJlY2F1c2UKKyAgICAgIC8vIHNvbWUgd2luZG93cyBjb21waWxlcnMgd2lsbCB0cnkgdG8gaW50ZXJwcmV0IHRoZW0gdXNpbmcgdGhlIHN5c3RlbSdzCisgICAgICAvLyBjdXJyZW50IGVuY29kaW5nIGFuZCBlbmQgdXAgd2l0aCBpbnZhbGlkIFVURi04IGJ5dGUgc2VxdWVuY2UuCisgICAgICAicGF0aC50by5tYXBbXCIoKSxbXSxcXFwiJyFAIyQlXiYqMTIzX3xXYXJceEU1XHhBRFx4OTksLi8/PjxcXFxcXCJdIik7CisgIGV4cGVjdGVkLm11dGFibGVfc2luZ2xlX21hc2soKS0+YWRkX3BhdGhzKCJwYXRoLnRvLm1hcFtcImtleTJcIl0iKTsKKworICBvd18tPlN0YXJ0T2JqZWN0KCIiKTsKKyAgb3dfLT5SZW5kZXJTdHJpbmcoCisgICAgICAic2luZ2xlX21hc2siLAorICAgICAgInBhdGgudG8ubWFwW1wiKCksW10sXFxcIichQCMkJV4mKjEyM198V2FyXHhFNVx4QURceDk5LC4vPz48XFxcXFwiXSwiCisgICAgICAicGF0aC50by5tYXBbXCJrZXkyXCJdIik7CisgIG93Xy0+RW5kT2JqZWN0KCk7CisKKyAgQ2hlY2tPdXRwdXQoZXhwZWN0ZWQpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJGaWVsZE1hc2tUZXN0LCBGaWVsZE1hc2tBY2NlcHRzTnVsbCkgeworICBGaWVsZE1hc2tUZXN0IGV4cGVjdGVkOworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBfLCBfKSkuVGltZXMoMCk7CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpLT5SZW5kZXJOdWxsKCJzaW5nbGVfbWFzayIpLT5FbmRPYmplY3QoKTsKKyAgQ2hlY2tPdXRwdXQoZXhwZWN0ZWQpOworfQorCitjbGFzcyBQcm90b1N0cmVhbU9iamVjdFdyaXRlcldyYXBwZXJzVGVzdAorICAgIDogcHVibGljIEJhc2VQcm90b1N0cmVhbU9iamVjdFdyaXRlclRlc3QgeworIHByb3RlY3RlZDoKKyAgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJXcmFwcGVyc1Rlc3QoKSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+IGRlc2NyaXB0b3JzOworICAgIGRlc2NyaXB0b3JzLnB1c2hfYmFjayhJbnQzMldyYXBwZXI6OmRlc2NyaXB0b3IoKSk7CisgICAgZGVzY3JpcHRvcnMucHVzaF9iYWNrKGdvb2dsZTo6cHJvdG9idWY6OkludDMyVmFsdWU6OmRlc2NyaXB0b3IoKSk7CisgICAgUmVzZXRUeXBlSW5mbyhkZXNjcmlwdG9ycyk7CisgIH0KK307CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChEaWZmZXJlbnRUeXBlSW5mb1NvdXJjZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJXcmFwcGVyc1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlVTRV9UWVBFX1JFU09MVkVSKSk7CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlcldyYXBwZXJzVGVzdCwgV3JhcHBlckFjY2VwdHNOdWxsKSB7CisgIEludDMyV3JhcHBlciB3cmFwcGVyOworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWROYW1lKF8sIF8sIF8pKS5UaW1lcygwKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiIiktPlJlbmRlck51bGwoImludDMyIiktPkVuZE9iamVjdCgpOworICBDaGVja091dHB1dCh3cmFwcGVyKTsKK30KKworY2xhc3MgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJPbmVPZnNUZXN0CisgICAgOiBwdWJsaWMgQmFzZVByb3RvU3RyZWFtT2JqZWN0V3JpdGVyVGVzdCB7CisgcHJvdGVjdGVkOgorICBQcm90b1N0cmVhbU9iamVjdFdyaXRlck9uZU9mc1Rlc3QoKSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+IGRlc2NyaXB0b3JzOworICAgIGRlc2NyaXB0b3JzLnB1c2hfYmFjayhPbmVPZnNSZXF1ZXN0OjpkZXNjcmlwdG9yKCkpOworICAgIGRlc2NyaXB0b3JzLnB1c2hfYmFjayhnb29nbGU6OnByb3RvYnVmOjpTdHJ1Y3Q6OmRlc2NyaXB0b3IoKSk7CisgICAgUmVzZXRUeXBlSW5mbyhkZXNjcmlwdG9ycyk7CisgIH0KK307CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChEaWZmZXJlbnRUeXBlSW5mb1NvdXJjZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJPbmVPZnNUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpVU0VfVFlQRV9SRVNPTFZFUikpOworCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJPbmVPZnNUZXN0LAorICAgICAgIE11bHRpcGxlT25lb2ZzRmFpbEZvclByaW1pdGl2ZVR5cGVzVGVzdCkgeworICBFWFBFQ1RfQ0FMTCgKKyAgICAgIGxpc3RlbmVyXywKKyAgICAgIEludmFsaWRWYWx1ZSgKKyAgICAgICAgICBfLCBTdHJpbmdQaWVjZSgib25lb2YiKSwKKyAgICAgICAgICBTdHJpbmdQaWVjZSgKKyAgICAgICAgICAgICAgIm9uZW9mIGZpZWxkICdkYXRhJyBpcyBhbHJlYWR5IHNldC4gQ2Fubm90IHNldCAnaW50RGF0YSciKSkpOworCisgIG93Xy0+U3RhcnRPYmplY3QoIiIpOworICBvd18tPlJlbmRlclN0cmluZygic3RyRGF0YSIsICJibGFoIik7CisgIG93Xy0+UmVuZGVyU3RyaW5nKCJpbnREYXRhIiwgIjEyMyIpOworICBvd18tPkVuZE9iamVjdCgpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJPbmVPZnNUZXN0LAorICAgICAgIE11bHRpcGxlT25lb2ZzRmFpbEZvck1lc3NhZ2VUeXBlc1ByaW1pdGl2ZUZpcnN0VGVzdCkgeworICAvLyBUZXN0IGZvciBzZXR0aW5nIHByaW1pdGl2ZSBvbmVvZiBmaWVsZCBmaXJzdCBhbmQgdGhlbiBtZXNzYWdlIGZpZWxkLgorICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBTdHJpbmdQaWVjZSgib25lb2YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib25lb2YgZmllbGQgJ2RhdGEnIGlzIGFscmVhZHkgc2V0LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHNldCAnbWVzc2FnZURhdGEnIikpKTsKKworICAvLyBKU09OOiB7ICJzdHJEYXRhIjogImJsYWgiLCAibWVzc2FnZURhdGEiOiB7ICJkYXRhVmFsdWUiOiAxMjMgfSB9CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpOworICBvd18tPlJlbmRlclN0cmluZygic3RyRGF0YSIsICJibGFoIik7CisgIG93Xy0+U3RhcnRPYmplY3QoIm1lc3NhZ2VEYXRhIik7CisgIG93Xy0+UmVuZGVySW50MzIoImRhdGFWYWx1ZSIsIDEyMyk7CisgIG93Xy0+RW5kT2JqZWN0KCk7CisgIG93Xy0+RW5kT2JqZWN0KCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlck9uZU9mc1Rlc3QsCisgICAgICAgTXVsdGlwbGVPbmVvZnNGYWlsRm9yTWVzc2FnZVR5cGVzTWVzc2FnZUZpcnN0VGVzdCkgeworICAvLyBUZXN0IGZvciBzZXR0aW5nIG1lc3NhZ2Ugb25lb2YgZmllbGQgZmlyc3QgYW5kIHRoZW4gcHJpbWl0aXZlIGZpZWxkLgorICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBTdHJpbmdQaWVjZSgib25lb2YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib25lb2YgZmllbGQgJ2RhdGEnIGlzIGFscmVhZHkgc2V0LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHNldCAnc3RyRGF0YSciKSkpOworCisgIC8vIEpTT046IHsgIm1lc3NhZ2VEYXRhIjogeyAiZGF0YVZhbHVlIjogMTIzIH0sICJzdHJEYXRhIjogImJsYWgiIH0KKyAgb3dfLT5TdGFydE9iamVjdCgiIik7CisgIG93Xy0+U3RhcnRPYmplY3QoIm1lc3NhZ2VEYXRhIik7CisgIG93Xy0+UmVuZGVySW50MzIoImRhdGFWYWx1ZSIsIDEyMyk7CisgIG93Xy0+RW5kT2JqZWN0KCk7CisgIG93Xy0+UmVuZGVyU3RyaW5nKCJzdHJEYXRhIiwgImJsYWgiKTsKKyAgb3dfLT5FbmRPYmplY3QoKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyT25lT2ZzVGVzdCwKKyAgICAgICBNdWx0aXBsZU9uZW9mc0ZhaWxGb3JTdHJ1Y3RUeXBlc1ByaW1pdGl2ZUZpcnN0VGVzdCkgeworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBTdHJpbmdQaWVjZSgib25lb2YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib25lb2YgZmllbGQgJ2RhdGEnIGlzIGFscmVhZHkgc2V0LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHNldCAnc3RydWN0RGF0YSciKSkpOworCisgIC8vIEpTT046IHsgInN0ckRhdGEiOiAiYmxhaCIsICJzdHJ1Y3REYXRhIjogeyAiYSI6ICJiIiB9IH0KKyAgb3dfLT5TdGFydE9iamVjdCgiIik7CisgIG93Xy0+UmVuZGVyU3RyaW5nKCJzdHJEYXRhIiwgImJsYWgiKTsKKyAgb3dfLT5TdGFydE9iamVjdCgic3RydWN0RGF0YSIpOworICBvd18tPlJlbmRlclN0cmluZygiYSIsICJiIik7CisgIG93Xy0+RW5kT2JqZWN0KCk7CisgIG93Xy0+RW5kT2JqZWN0KCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlck9uZU9mc1Rlc3QsCisgICAgICAgTXVsdGlwbGVPbmVvZnNGYWlsRm9yU3RydWN0VHlwZXNTdHJ1Y3RGaXJzdFRlc3QpIHsKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkVmFsdWUoXywgU3RyaW5nUGllY2UoIm9uZW9mIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uZW9mIGZpZWxkICdkYXRhJyBpcyBhbHJlYWR5IHNldC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBzZXQgJ3N0ckRhdGEnIikpKTsKKworICAvLyBKU09OOiB7ICJzdHJ1Y3REYXRhIjogeyAiYSI6ICJiIiB9LCAic3RyRGF0YSI6ICJibGFoIiB9CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpOworICBvd18tPlN0YXJ0T2JqZWN0KCJzdHJ1Y3REYXRhIik7CisgIG93Xy0+UmVuZGVyU3RyaW5nKCJhIiwgImIiKTsKKyAgb3dfLT5FbmRPYmplY3QoKTsKKyAgb3dfLT5SZW5kZXJTdHJpbmcoInN0ckRhdGEiLCAiYmxhaCIpOworICBvd18tPkVuZE9iamVjdCgpOworfQorCitURVNUX1AoUHJvdG9TdHJlYW1PYmplY3RXcml0ZXJPbmVPZnNUZXN0LAorICAgICAgIE11bHRpcGxlT25lb2ZzRmFpbEZvclN0cnVjdFZhbHVlVHlwZXNUZXN0KSB7CisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgSW52YWxpZFZhbHVlKF8sIFN0cmluZ1BpZWNlKCJvbmVvZiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmVvZiBmaWVsZCAnZGF0YScgaXMgYWxyZWFkeSBzZXQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3Qgc2V0ICd2YWx1ZURhdGEnIikpKTsKKworICAvLyBKU09OOiB7ICJtZXNzYWdlRGF0YSI6IHsgImRhdGFWYWx1ZSI6IDEyMyB9LCAidmFsdWVEYXRhIjogeyAiYSI6ICJiIiB9IH0KKyAgb3dfLT5TdGFydE9iamVjdCgiIik7CisgIG93Xy0+U3RhcnRPYmplY3QoIm1lc3NhZ2VEYXRhIik7CisgIG93Xy0+UmVuZGVySW50MzIoImRhdGFWYWx1ZSIsIDEyMyk7CisgIG93Xy0+RW5kT2JqZWN0KCk7CisgIG93Xy0+U3RhcnRPYmplY3QoInZhbHVlRGF0YSIpOworICBvd18tPlJlbmRlclN0cmluZygiYSIsICJiIik7CisgIG93Xy0+RW5kT2JqZWN0KCk7CisgIG93Xy0+RW5kT2JqZWN0KCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlck9uZU9mc1Rlc3QsCisgICAgICAgTXVsdGlwbGVPbmVvZnNGYWlsRm9yV2VsbEtub3duVHlwZXNQcmltaXRpdmVGaXJzdFRlc3QpIHsKKyAgRVhQRUNUX0NBTEwobGlzdGVuZXJfLCBJbnZhbGlkVmFsdWUoXywgU3RyaW5nUGllY2UoIm9uZW9mIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uZW9mIGZpZWxkICdkYXRhJyBpcyBhbHJlYWR5IHNldC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBzZXQgJ3RzRGF0YSciKSkpOworCisgIC8vIEpTT046IHsgImludERhdGEiOiAxMjMsICJ0c0RhdGEiOiAiMTk3MC0wMS0wMlQwMTowMDowMC4wMDBaIiB9CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpOworICBvd18tPlJlbmRlckludDMyKCJpbnREYXRhIiwgMTIzKTsKKyAgb3dfLT5SZW5kZXJTdHJpbmcoInRzRGF0YSIsICIxOTcwLTAxLTAyVDAxOjAwOjAwLjAwMFoiKTsKKyAgb3dfLT5FbmRPYmplY3QoKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyT25lT2ZzVGVzdCwKKyAgICAgICBNdWx0aXBsZU9uZW9mc0ZhaWxGb3JXZWxsS25vd25UeXBlc1drdEZpcnN0VGVzdCkgeworICBFWFBFQ1RfQ0FMTChsaXN0ZW5lcl8sIEludmFsaWRWYWx1ZShfLCBTdHJpbmdQaWVjZSgib25lb2YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib25lb2YgZmllbGQgJ2RhdGEnIGlzIGFscmVhZHkgc2V0LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHNldCAnaW50RGF0YSciKSkpOworCisgIC8vIEpTT046IHsgInRzRGF0YSI6ICIxOTcwLTAxLTAyVDAxOjAwOjAwLjAwMFoiLCAiaW50RGF0YSI6IDEyMyB9CisgIG93Xy0+U3RhcnRPYmplY3QoIiIpOworICBvd18tPlJlbmRlclN0cmluZygidHNEYXRhIiwgIjE5NzAtMDEtMDJUMDE6MDA6MDAuMDAwWiIpOworICBvd18tPlJlbmRlckludDMyKCJpbnREYXRhIiwgMTIzKTsKKyAgb3dfLT5FbmRPYmplY3QoKTsKK30KKworVEVTVF9QKFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyT25lT2ZzVGVzdCwKKyAgICAgICBNdWx0aXBsZU9uZW9mc0ZhaWxGb3JXZWxsS25vd25UeXBlc0FuZE1lc3NhZ2VUZXN0KSB7CisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgSW52YWxpZFZhbHVlKF8sIFN0cmluZ1BpZWNlKCJvbmVvZiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmVvZiBmaWVsZCAnZGF0YScgaXMgYWxyZWFkeSBzZXQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3Qgc2V0ICdtZXNzYWdlRGF0YSciKSkpOworCisgIC8vIEpTT046IHsgInRzRGF0YSI6ICIxOTcwLTAxLTAyVDAxOjAwOjAwLjAwMFoiLAorICAvLyAgICAgICAgICJtZXNzYWdlRGF0YSI6IHsgImRhdGFWYWx1ZSI6IDEyMyB9IH0KKyAgb3dfLT5TdGFydE9iamVjdCgiIik7CisgIG93Xy0+UmVuZGVyU3RyaW5nKCJ0c0RhdGEiLCAiMTk3MC0wMS0wMlQwMTowMDowMC4wMDBaIik7CisgIG93Xy0+U3RhcnRPYmplY3QoIm1lc3NhZ2VEYXRhIik7CisgIG93Xy0+UmVuZGVySW50MzIoImRhdGFWYWx1ZSIsIDEyMyk7CisgIG93Xy0+RW5kT2JqZWN0KCk7CisgIG93Xy0+RW5kT2JqZWN0KCk7Cit9CisKK1RFU1RfUChQcm90b1N0cmVhbU9iamVjdFdyaXRlck9uZU9mc1Rlc3QsCisgICAgICAgTXVsdGlwbGVPbmVvZnNGYWlsRm9yT25lb2ZXaXRoaW5BbnlUZXN0KSB7CisgIEVYUEVDVF9DQUxMKGxpc3RlbmVyXywgSW52YWxpZFZhbHVlKF8sIFN0cmluZ1BpZWNlKCJvbmVvZiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmVvZiBmaWVsZCAnZGF0YScgaXMgYWxyZWFkeSBzZXQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3Qgc2V0ICdpbnREYXRhJyIpKSk7CisKKyAgLy8gSlNPTjoKKyAgLy8geyAiYW55RGF0YSI6CisgIC8vICAgIHsgIkB0eXBlIjoKKyAgLy8gICAgICAgInR5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9fdXRpbF9jb252ZXJ0ZXIudGVzdGluZy5vbmVvZnMuT25lT2ZzUmVxdWVzdCIsCisgIC8vICAgICAic3RyRGF0YSI6ICJibGFoIiwKKyAgLy8gICAgICJpbnREYXRhIjogMTIzCisgIC8vICAgIH0KKyAgLy8gfQorICBvd18tPlN0YXJ0T2JqZWN0KCIiKTsKKyAgb3dfLT5TdGFydE9iamVjdCgiYW55RGF0YSIpOworICBvd18tPlJlbmRlclN0cmluZygKKyAgICAgICJAdHlwZSIsCisgICAgICAidHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b191dGlsX2NvbnZlcnRlci50ZXN0aW5nLm9uZW9mcy5PbmVPZnNSZXF1ZXN0Iik7CisgIG93Xy0+UmVuZGVyU3RyaW5nKCJzdHJEYXRhIiwgImJsYWgiKTsKKyAgb3dfLT5SZW5kZXJJbnQzMigiaW50RGF0YSIsIDEyMyk7CisgIG93Xy0+RW5kT2JqZWN0KCk7CisgIG93Xy0+RW5kT2JqZWN0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9zdHJ1Y3R1cmVkX29iamVjdHdyaXRlci5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3N0cnVjdHVyZWRfb2JqZWN0d3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmN2M4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9zdHJ1Y3R1cmVkX29iamVjdHdyaXRlci5oCkBAIC0wLDAgKzEsMTIxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9TVFJVQ1RVUkVEX09CSkVDVFdSSVRFUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfU1RSVUNUVVJFRF9PQkpFQ1RXUklURVJfSF9fCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3dyaXRlci5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKKy8vIEFuIFN0cnVjdHVyZWRPYmplY3RXcml0ZXIgaXMgYW4gT2JqZWN0V3JpdGVyIGZvciB3cml0aW5nCisvLyB0cmVlLXN0cnVjdHVyZWQgZGF0YSBpbiBhIHN0cmVhbSBvZiBldmVudHMgcmVwcmVzZW50aW5nIG9iamVjdHMKKy8vIGFuZCBjb2xsZWN0aW9ucy4gSW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8KKy8vIHdyaXRlIGFuIG9iamVjdCBzdHJlYW0gdG8gYW4gaW4tbWVtb3J5IHN0cnVjdHVyZSwgcHJvdG9idWZzLAorLy8gSlNPTiwgWE1MLCBvciBhbnkgb3RoZXIgb3V0cHV0IGZvcm1hdCBkZXNpcmVkLiBUaGUgT2JqZWN0U291cmNlCisvLyBpbnRlcmZhY2UgaXMgdHlwaWNhbGx5IHVzZWQgYXMgdGhlIHNvdXJjZSBvZiBhbiBvYmplY3Qgc3RyZWFtLgorLy8KKy8vIFNlZSBKc29uT2JqZWN0V3JpdGVyIGZvciBhIHNhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZgorLy8gU3RydWN0dXJlZE9iamVjdFdyaXRlciBhbmQgaXRzIHVzZS4KKy8vCisvLyBEZXJpdmVkIGNsYXNzZXMgY291bGQgYmUgdGhyZWFkLXVuc2FmZS4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBTdHJ1Y3R1cmVkT2JqZWN0V3JpdGVyIDogcHVibGljIE9iamVjdFdyaXRlciB7CisgcHVibGljOgorICB+U3RydWN0dXJlZE9iamVjdFdyaXRlcigpIG92ZXJyaWRlIHt9CisKKyBwcm90ZWN0ZWQ6CisgIC8vIEEgYmFzZSBlbGVtZW50IGNsYXNzIGZvciBzdWJjbGFzc2VzIHRvIGV4dGVuZCwgbWFrZXMgdHJhY2tpbmcgc3RhdGUgZWFzaWVyLgorICAvLworICAvLyBTdHJ1Y3R1cmVkT2JqZWN0V3JpdGVyIGJlaGF2ZXMgYXMgYSB2aXNpdG9yLiBCYXNlRWxlbWVudCByZXByZXNlbnRzIGEgbm9kZQorICAvLyBpbiB0aGUgaW5wdXQgdHJlZS4gSW1wbGVtZW50YXRpb24gb2YgU3RydWN0dXJlZE9iamVjdFdyaXRlciBzaG91bGQgYWxzbworICAvLyBleHRlbmQgQmFzZUVsZW1lbnQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbG9jYXRpb24gaW4gdGhlIGlucHV0IHRyZWUuCisgIGNsYXNzIFBST1RPQlVGX0VYUE9SVCBCYXNlRWxlbWVudCB7CisgICBwdWJsaWM6CisgICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHRoZSBwYXJlbnQgRWxlbWVudC4KKyAgICBleHBsaWNpdCBCYXNlRWxlbWVudChCYXNlRWxlbWVudCogcGFyZW50KQorICAgICAgICA6IHBhcmVudF8ocGFyZW50KSwKKyAgICAgICAgICBsZXZlbF8ocGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5sZXZlbCgpICsgMSkge30KKyAgICB2aXJ0dWFsIH5CYXNlRWxlbWVudCgpIHt9CisKKyAgICAvLyBSZWxlYXNlcyBvd25lcnNoaXAgb2YgdGhlIHBhcmVudCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnRUeXBlPgorICAgIEVsZW1lbnRUeXBlKiBwb3AoKSB7CisgICAgICByZXR1cm4gZG93bl9jYXN0PEVsZW1lbnRUeXBlKj4ocGFyZW50Xy5yZWxlYXNlKCkpOworICAgIH0KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgdGhlIHJvb3QuCisgICAgYm9vbCBpc19yb290KCkgY29uc3QgeyByZXR1cm4gcGFyZW50XyA9PSBudWxscHRyOyB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaG9wcyBmcm9tIHRoaXMgZWxlbWVudCB0byB0aGUgcm9vdCBlbGVtZW50LgorICAgIGludCBsZXZlbCgpIGNvbnN0IHsgcmV0dXJuIGxldmVsXzsgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgLy8gUmV0dXJucyBwb2ludGVyIHRvIHBhcmVudCBlbGVtZW50IHdpdGhvdXQgcmVsZWFzaW5nIG93bmVyc2hpcC4KKyAgICB2aXJ0dWFsIEJhc2VFbGVtZW50KiBwYXJlbnQoKSBjb25zdCB7IHJldHVybiBwYXJlbnRfLmdldCgpOyB9CisKKyAgIHByaXZhdGU6CisgICAgLy8gUG9pbnRlciB0byB0aGUgcGFyZW50IEVsZW1lbnQuCisgICAgc3RkOjp1bmlxdWVfcHRyPEJhc2VFbGVtZW50PiBwYXJlbnRfOworCisgICAgLy8gTnVtYmVyIG9mIGhvcHMgdG8gdGhlIHJvb3QgRWxlbWVudC4KKyAgICAvLyBUaGUgcm9vdCBFbGVtZW50IGhhcyBudWxscHRyIHBhcmVudF8gYW5kIGEgbGV2ZWxfIG9mIDAuCisgICAgY29uc3QgaW50IGxldmVsXzsKKworICAgIEdPT0dMRV9ESVNBTExPV19JTVBMSUNJVF9DT05TVFJVQ1RPUlMoQmFzZUVsZW1lbnQpOworICB9OworCisgIFN0cnVjdHVyZWRPYmplY3RXcml0ZXIoKSB7fQorCisgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgZWxlbWVudC4gVXNlZCBmb3IgaW5kZW50YXRpb24gYW5kIG5hbWUgb3ZlcnJpZGVzLgorICB2aXJ0dWFsIEJhc2VFbGVtZW50KiBlbGVtZW50KCkgPSAwOworCisgcHJpdmF0ZToKKyAgLy8gRG8gbm90IGFkZCBhbnkgZGF0YSBtZW1iZXJzIHRvIHRoaXMgY2xhc3MuCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJ1Y3R1cmVkT2JqZWN0V3JpdGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9TVFJVQ1RVUkVEX09CSkVDVFdSSVRFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9hbnlzLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmYzNmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9hbnlzLnByb3RvCkBAIC0wLDAgKzEsMTE4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgcHJvdG9fdXRpbF9jb252ZXJ0ZXIudGVzdGluZzsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byI7CitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8iOworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8iOworCisvLyBUb3AtbGV2ZWwgdGVzdCBjYXNlcyBwcm90byB1c2VkIGJ5IE1hcnNoYWxsaW5nVGVzdC4gU2VlIGRlc2NyaXB0aW9uCisvLyBhdCB0aGUgdG9wIG9mIHRoZSBjbGFzcyBNYXJzaGFsbGluZ1Rlc3QgZm9yIGRldGFpbHMgb24gaG93IHRvIHdyaXRlCisvLyB0ZXN0IGNhc2VzLgorbWVzc2FnZSBBbnlUZXN0Q2FzZXMgeworICBBbnlXcmFwcGVyIGVtcHR5X2FueSA9IDE7CisgIEFueVdyYXBwZXIgdHlwZV9vbmx5X2FueSA9IDI7CisgIEFueVdyYXBwZXIgd3JhcHBlcl9hbnkgPSAzOworICBBbnlXcmFwcGVyIGFueV93aXRoX3RpbWVzdGFtcF92YWx1ZSA9IDQ7CisgIEFueVdyYXBwZXIgYW55X3dpdGhfZHVyYXRpb25fdmFsdWUgPSA1OworICBBbnlXcmFwcGVyIGFueV93aXRoX3N0cnVjdF92YWx1ZSA9IDY7CisgIEFueVdyYXBwZXIgcmVjdXJzaXZlX2FueSA9IDc7CisgIEFueVdyYXBwZXIgYW55X3dpdGhfbWVzc2FnZV92YWx1ZSA9IDg7CisgIEFueVdyYXBwZXIgYW55X3dpdGhfbmVzdGVkX21lc3NhZ2UgPSA5OworICBBbnlXcmFwcGVyIGFueV93aXRoX21lc3NhZ2Vfd2l0aF93cmFwcGVyX3R5cGUgPSAxMDsKKyAgQW55V3JhcHBlciBhbnlfd2l0aF9tZXNzYWdlX3dpdGhfdGltZXN0YW1wID0gMTE7CisgIEFueVdyYXBwZXIgYW55X3dpdGhfbWVzc2FnZV9jb250YWluaW5nX21hcCA9IDEyOworICBBbnlXcmFwcGVyIGFueV93aXRoX21lc3NhZ2VfY29udGFpbmluZ19zdHJ1Y3QgPSAxMzsKKyAgQW55V3JhcHBlciBhbnlfd2l0aF9tZXNzYWdlX2NvbnRhaW5pbmdfcmVwZWF0ZWRfbWVzc2FnZSA9IDE0OworICBBbnlXcmFwcGVyIHJlY3Vyc2l2ZV9hbnlfd2l0aF90eXBlX2ZpZWxkX2F0X2VuZCA9IDE1OworICBBbnlXcmFwcGVyIHJlcGVhdGVkX2FueSA9IDE2OworICBBbnlXcmFwcGVyIGVtcHR5X2FueV93aXRoX251bGxfdHlwZV91cmwgPSAxNzsKKyAgQW55V3JhcHBlciBhbnlfd2l0aF9lbXB0eSA9IDE4OworICBBbnlXcmFwcGVyIGFueV93aXRoX2RlZmF1bHRfdGltZXN0YW1wID0gMTk7CisKKyAgZ29vZ2xlLnByb3RvYnVmLkFueSB0b3BfbGV2ZWxfYW55ID0gNTA7CisgIGdvb2dsZS5wcm90b2J1Zi5BbnkgdG9wX2xldmVsX2FueV93aXRoX3R5cGVfZmllbGRfYXRfZW5kID0gNTE7CisgIGdvb2dsZS5wcm90b2J1Zi5BbnkgdG9wX2xldmVsX2FueV93aXRoX3Bpdm90X29uZSA9IDUyOworICBnb29nbGUucHJvdG9idWYuQW55IHRvcF9sZXZlbF9hbnlfd2l0aF9waXZvdF90d28gPSA1MzsKKyAgZ29vZ2xlLnByb3RvYnVmLkFueSB0b3BfbGV2ZWxfYW55X3Vub3JkZXJlZCA9IDU0OworfQorCittZXNzYWdlIEFueVdyYXBwZXIgeworICBnb29nbGUucHJvdG9idWYuQW55IGFueSA9IDE7Cit9CisKKy8vIEhhY2sgdG8gbWFrZSBzdXJlIHRoZSB0eXBlcyB3ZSBwdXQgaW50byB0aGUgYW55IGFyZSBpbmNsdWRlZCBpbiB0aGUgdHlwZXMuCisvLyBSZWFsIHNvbHV0aW9uIGlzIHRvIGFkZCB0aGVzZSB0eXBlcyB0byB0aGUgc2VydmljZSBjb25maWcuCittZXNzYWdlIEltcG9ydHMgeworICBnb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUgZGJsID0gMTsKKyAgZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCBzdHJ1Y3QgPSAyOworICBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIHRpbWVzdGFtcCA9IDM7CisgIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiBkdXJhdGlvbiA9IDQ7CisgIGdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIGkzMiA9IDU7CisgIGdvb2dsZS5wcm90b2J1Zi5FbXB0eSBlbXB0eSA9IDY7CisgIERhdGEgZGF0YSA9IDEwMDsKK30KKworbWVzc2FnZSBEYXRhIHsKKyAgaW50MzIgYXR0ciA9IDE7CisgIHN0cmluZyBzdHIgPSAyOworICByZXBlYXRlZCBzdHJpbmcgbXNncyA9IDM7CisgIERhdGEgbmVzdGVkX2RhdGEgPSA0OworICBnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSBpbnRfd3JhcHBlciA9IDU7CisgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgdGltZSA9IDY7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbWFwX2RhdGEgPSA3OworICBnb29nbGUucHJvdG9idWYuU3RydWN0IHN0cnVjdF9kYXRhID0gODsKKyAgcmVwZWF0ZWQgRGF0YSByZXBlYXRlZF9kYXRhID0gOTsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLkFueSByZXBlYXRlZF9hbnkgPSAxMDsKK30KKworc2VydmljZSBBbnlUZXN0U2VydmljZSB7CisgIHJwYyBDYWxsKEFueVRlc3RDYXNlcykgcmV0dXJucyAoQW55VGVzdENhc2VzKTsKKyAgcnBjIENhbGwxKEltcG9ydHMpIHJldHVybnMgKEltcG9ydHMpOworfQorCittZXNzYWdlIEFueUluIHsKKyAgc3RyaW5nIHNvbWV0aGluZyA9IDE7CisgIGdvb2dsZS5wcm90b2J1Zi5BbnkgYW55ID0gMjsKK30KKworbWVzc2FnZSBBbnlPdXQgeworICBnb29nbGUucHJvdG9idWYuQW55IGFueSA9IDE7Cit9CisKK21lc3NhZ2UgQW55TSB7CisgIHN0cmluZyBmb28gPSAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOGM1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucHJvdG8KQEAgLTAsMCArMSwyNTEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHN2ZW5AZ29vZ2xlLmNvbSAoU3ZlbiBNYXdzb24pCisvLworLy8gU2FtcGxlIHByb3RvcyBmb3IgdGVzdGluZy4KKworLy8gU29tZSBvZiB0aGUgb2xkZXIgZW51bXMgZG9uJ3QgdXNlIENBUElUQUxTX1dJVEhfVU5ERVJTQ09SRVMgZm9yIHRlc3RpbmcuCisvLyBMSU5UOiBMRUdBQ1lfTkFNRVMKKy8vIExJTlQ6IEFMTE9XX0dST1VQUworCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBwcm90b191dGlsX2NvbnZlcnRlci50ZXN0aW5nOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucHJvdG8iOworCisvLyBBIGJvb2sKK21lc3NhZ2UgQm9vayB7CisgIG9wdGlvbmFsIHN0cmluZyB0aXRsZSA9IDE7CisgIG9wdGlvbmFsIEF1dGhvciBhdXRob3IgPSAyOworICBvcHRpb25hbCB1aW50MzIgbGVuZ3RoID0gMzsKKyAgb3B0aW9uYWwgaW50NjQgcHVibGlzaGVkID0gNDsKKyAgb3B0aW9uYWwgYnl0ZXMgY29udGVudCA9IDU7CisKKyAgb3B0aW9uYWwgZ3JvdXAgRGF0YSA9IDYgeworICAgIG9wdGlvbmFsIHVpbnQzMiB5ZWFyID0gNzsKKyAgICBvcHRpb25hbCBzdHJpbmcgY29weXJpZ2h0ID0gODsKKyAgfQorCisgIG1lc3NhZ2UgTGFiZWwgeworICAgIG9wdGlvbmFsIHN0cmluZyBrZXkgPSAxOworICAgIG9wdGlvbmFsIHN0cmluZyB2YWx1ZSA9IDI7CisgIH0KKworICBvcHRpb25hbCBQdWJsaXNoZXIgcHVibGlzaGVyID0gOTsKKyAgcmVwZWF0ZWQgTGFiZWwgbGFiZWxzID0gMTA7CisKKyAgZW51bSBUeXBlIHsKKyAgICBGSUNUSU9OID0gMTsKKyAgICBLSURTID0gMjsKKyAgICBBQ1RJT05fQU5EX0FEVkVOVFVSRSA9IDM7CisgICAgYXJ0c19hbmRfcGhvdG9ncmFwaHkgPSA0OworICAgIEkxOE5fVGVjaCA9IDU7CisgIH0KKyAgb3B0aW9uYWwgVHlwZSB0eXBlID0gMTE7CisKKyAgLy8gVXNlZnVsIGZvciB0ZXN0aW5nIEpTT04gc25ha2UvY2FtZWwtY2FzZSBjb252ZXJzaW9ucy4KKyAgb3B0aW9uYWwgc3RyaW5nIHNuYWtlX2ZpZWxkID0gMTI7CisKKyAgLy8gVXNlZCB0byB0ZXN0IHR5cGUgbm90IGZvdW5kIGluIHR5cGUgaW5mby4gTWVzc2FnZXMgZGVmaW5lZCBpbiBvdGhlciBmaWxlcworICAvLyBhcmUgbm90IGFkZGVkIHdoZW4gYWRkaW5nIEJvb2sgdG8gdHlwZSBpbmZvLgorICBvcHRpb25hbCBBbnlXcmFwcGVyIHR5cGVfbm90X2ZvdW5kID0gMTM7CisKKyAgLy8gVXNlZCB0byB0ZXN0IGludmFsaWQgdmFsdWUgaW5zaWRlIG9mIHByaW1pdGl2ZSByZXBlYXRlZCBmaWVsZHMuCisgIHJlcGVhdGVkIGludDMyIHByaW1pdGl2ZV9yZXBlYXRlZCA9IDE0OworCisgIGV4dGVuc2lvbnMgMjAwIHRvIDQ5OTsKK30KKworLy8gQSBwdWJsaXNoZXIgb2YgYSBib29rLCB0ZXN0cyByZXF1aXJlZCBmaWVsZHMuCittZXNzYWdlIFB1Ymxpc2hlciB7CisgIHJlcXVpcmVkIHN0cmluZyBuYW1lID0gMTsKK30KKworLy8gQW4gYXV0aG9yIG9mIGEgYm9vaworbWVzc2FnZSBBdXRob3IgeworICBvcHRpb25hbCB1aW50NjQgaWQgPSAxIFtqc29uX25hbWUgPSAiQGlkIl07CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMjsKKyAgcmVwZWF0ZWQgc3RyaW5nIHBzZXVkb255bSA9IDM7CisgIG9wdGlvbmFsIGJvb2wgYWxpdmUgPSA0OworICByZXBlYXRlZCBBdXRob3IgZnJpZW5kID0gNTsKK30KKworLy8gRm9yIHRlc3RpbmcgcmVzaWxpZW5jeSBvZiBvdXIgcHJvdG9zdHJlYW0gcGFyc2VyLgorLy8gRmllbGQgbnVtYmVycyBvZiBBdXRob3IgYXJlIHJldXNlZCBmb3Igc29tZXRoaW5nIGVsc2UuCittZXNzYWdlIEJhZEF1dGhvciB7CisgIG9wdGlvbmFsIHN0cmluZyBpZCA9IDE7ICAgICAgICAgLy8gbm9uLWxlbmd0aC1kZWxpbWl0ZWQgdG8gbGVuZ3RoLWRlbGltaXRlZC4KKyAgcmVwZWF0ZWQgdWludDY0IG5hbWUgPSAyOyAgICAgICAvLyBzdHJpbmcgdG8gcmVwZWF0ZWQgKGJvdGggbGVuZ3RoLWRlbGltaXRlZCkuCisgIG9wdGlvbmFsIHN0cmluZyBwc2V1ZG9ueW0gPSAzOyAgLy8gUmVwZWF0ZWQgdG8gb3B0aW9uYWwuCisgIHJlcGVhdGVkIGJvb2wgYWxpdmUgPSA0IFtwYWNrZWQgPSB0cnVlXTsgIC8vIE9wdGlvbmFsIHRvIHJlcGVhdGVkLgorfQorCisvLyBBbGwgcHJpbWl0aXZlIHR5cGVzCittZXNzYWdlIFByaW1pdGl2ZSB7CisgIC8vIDMyIGJpdCBudW1iZXJzOgorICBvcHRpb25hbCBmaXhlZDMyIGZpeDMyID0gMTsKKyAgb3B0aW9uYWwgdWludDMyIHUzMiA9IDI7CisgIG9wdGlvbmFsIGludDMyIGkzMiA9IDM7CisgIG9wdGlvbmFsIHNmaXhlZDMyIHNmMzIgPSA0OworICBvcHRpb25hbCBzaW50MzIgczMyID0gNTsKKworICAvLyA2NCBiaXQgbnVtYmVyczoKKyAgb3B0aW9uYWwgZml4ZWQ2NCBmaXg2NCA9IDY7CisgIG9wdGlvbmFsIHVpbnQ2NCB1NjQgPSA3OworICBvcHRpb25hbCBpbnQ2NCBpNjQgPSA4OworICBvcHRpb25hbCBzZml4ZWQ2NCBzZjY0ID0gOTsKKyAgb3B0aW9uYWwgc2ludDY0IHM2NCA9IDEwOworCisgIC8vIFRoZSBvdGhlciBzdHVmZi4KKyAgb3B0aW9uYWwgc3RyaW5nIHN0ciA9IDExOworICBvcHRpb25hbCBieXRlcyBieXRlcyA9IDEyOworICBvcHRpb25hbCBmbG9hdCBmbG9hdCA9IDEzOworICBvcHRpb25hbCBkb3VibGUgZG91YmxlID0gMTQ7CisgIG9wdGlvbmFsIGJvb2wgYm9vbCA9IDE1OworCisgIC8vIHJlcGVhdGVkIDMyIGJpdCBudW1iZXJzOgorICByZXBlYXRlZCBmaXhlZDMyIHJlcF9maXgzMiA9IDE2OworICByZXBlYXRlZCB1aW50MzIgcmVwX3UzMiA9IDE3OworICByZXBlYXRlZCBpbnQzMiByZXBfaTMyID0gMTg7CisgIHJlcGVhdGVkIHNmaXhlZDMyIHJlcF9zZjMyID0gMTk7CisgIHJlcGVhdGVkIHNpbnQzMiByZXBfczMyID0gMjA7CisKKyAgLy8gcmVwZWF0ZWQgNjQgYml0IG51bWJlcnM6CisgIHJlcGVhdGVkIGZpeGVkNjQgcmVwX2ZpeDY0ID0gMjE7CisgIHJlcGVhdGVkIHVpbnQ2NCByZXBfdTY0ID0gMjI7CisgIHJlcGVhdGVkIGludDY0IHJlcF9pNjQgPSAyMzsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgcmVwX3NmNjQgPSAyNDsKKyAgcmVwZWF0ZWQgc2ludDY0IHJlcF9zNjQgPSAyNTsKKworICAvLyByZXBlYXRlZCBvdGhlciBzdHVmZjoKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcF9zdHIgPSAyNjsKKyAgcmVwZWF0ZWQgYnl0ZXMgcmVwX2J5dGVzID0gMjc7CisgIHJlcGVhdGVkIGZsb2F0IHJlcF9mbG9hdCA9IDI4OworICByZXBlYXRlZCBkb3VibGUgcmVwX2RvdWJsZSA9IDI5OworICByZXBlYXRlZCBib29sIHJlcF9ib29sID0gMzA7Cit9CisKKy8vIFRlc3QgcGFja2VkIHZlcnNpb25zIG9mIGFsbCByZXBlYXRlZCBwcmltaXRpdmVzLgorLy8gVGhlIGZpZWxkIG51bWJlcnMgc2hvdWxkIG1hdGNoIHRoZWlyIG5vbi1wYWNrZWQgdmVyc2lvbiBpbiBQcmltaXRpdmUgbWVzc2FnZS4KK21lc3NhZ2UgUGFja2VkUHJpbWl0aXZlIHsKKyAgLy8gcmVwZWF0ZWQgMzIgYml0IG51bWJlcnM6CisgIHJlcGVhdGVkIGZpeGVkMzIgcmVwX2ZpeDMyID0gMTYgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCB1aW50MzIgcmVwX3UzMiA9IDE3IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgaW50MzIgcmVwX2kzMiA9IDE4IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcmVwX3NmMzIgPSAxOSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNpbnQzMiByZXBfczMyID0gMjAgW3BhY2tlZCA9IHRydWVdOworCisgIC8vIHJlcGVhdGVkIDY0IGJpdCBudW1iZXJzOgorICByZXBlYXRlZCBmaXhlZDY0IHJlcF9maXg2NCA9IDIxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgdWludDY0IHJlcF91NjQgPSAyMiBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIGludDY0IHJlcF9pNjQgPSAyMyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHJlcF9zZjY0ID0gMjQgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzaW50NjQgcmVwX3M2NCA9IDI1IFtwYWNrZWQgPSB0cnVlXTsKKworICAvLyByZXBlYXRlZCBvdGhlciBzdHVmZjoKKyAgcmVwZWF0ZWQgZmxvYXQgcmVwX2Zsb2F0ID0gMjggW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBkb3VibGUgcmVwX2RvdWJsZSA9IDI5IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgYm9vbCByZXBfYm9vbCA9IDMwIFtwYWNrZWQgPSB0cnVlXTsKK30KKworLy8gVGVzdCBleHRlbnNpb25zLgorZXh0ZW5kIEJvb2sgeworICByZXBlYXRlZCBBdXRob3IgbW9yZV9hdXRob3IgPSAyMDE7Cit9CisKKy8vIFRlc3QgbmVzdGVkIGV4dGVuc2lvbnMuCittZXNzYWdlIE5lc3RlZEJvb2sgeworICBleHRlbmQgQm9vayB7CisgICAgb3B0aW9uYWwgTmVzdGVkQm9vayBhbm90aGVyX2Jvb2sgPSAzMDE7CisgIH0KKyAgLy8gUmVjdXJzZQorICBvcHRpb25hbCBCb29rIGJvb2sgPSAxOworfQorCisvLyBGb3IgdGVzdGluZyByZXNpbGllbmN5IG9mIG91ciBwcm90b3N0cmVhbSBwYXJzZXIuCisvLyBGaWVsZCBudW1iZXIgb2YgTmVzdGVkQm9vayBpcyByZXVzZWQgZm9yIHNvbWV0aGluZyBlbHNlLgorbWVzc2FnZSBCYWROZXN0ZWRCb29rIHsKKyAgcmVwZWF0ZWQgdWludDMyIGJvb2sgPSAxIFtwYWNrZWQgPSB0cnVlXTsgIC8vIFBhY2tlZCB0byBvcHRpb25hbCBtZXNzYWdlLgorfQorCisvLyBBIHJlY3Vyc2l2ZWx5IGRlZmluZWQgbWVzc2FnZS4KK21lc3NhZ2UgQ3ljbGljIHsKKyAgb3B0aW9uYWwgaW50MzIgbV9pbnQgPSAxOworICBvcHRpb25hbCBzdHJpbmcgbV9zdHIgPSAyOworICBvcHRpb25hbCBCb29rIG1fYm9vayA9IDM7CisgIHJlcGVhdGVkIEF1dGhvciBtX2F1dGhvciA9IDU7CisgIG9wdGlvbmFsIEN5Y2xpYyBtX2N5Y2xpYyA9IDQ7Cit9CisKKy8vIFRlc3QgdGhhdCB0d28gbWVzc2FnZXMgY2FuIGhhdmUgZGlmZmVyZW50IGZpZWxkcyBtYXBwZWQgdG8gdGhlIHNhbWUgSlNPTgorLy8gbmFtZS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2lzc3Vlcy8xNDE1CittZXNzYWdlIFRlc3RKc29uTmFtZTEgeworICBvcHRpb25hbCBpbnQzMiBvbmVfdmFsdWUgPSAxIFtqc29uX25hbWUgPSAidmFsdWUiXTsKK30KK21lc3NhZ2UgVGVzdEpzb25OYW1lMiB7CisgIG9wdGlvbmFsIGludDMyIGFub3RoZXJfdmFsdWUgPSAxIFtqc29uX25hbWUgPSAidmFsdWUiXTsKK30KKworbWVzc2FnZSBUZXN0UHJpbWl0aXZlRmllbGRzV2l0aFNhbWVKc29uTmFtZSB7CisgIG9wdGlvbmFsIHN0cmluZyB2YWxfc3RyMSA9IDE7CisgIG9wdGlvbmFsIHN0cmluZyB2YWxfc3RyXzEgPSAyOworCisgIG9wdGlvbmFsIGludDMyIHZhbF9pbnQzMjEgPSAzOworICBvcHRpb25hbCBpbnQzMiB2YWxfaW50MzJfMSA9IDQ7CisKKyAgb3B0aW9uYWwgdWludDMyIHZhbF91aW50MzIxID0gNTsKKyAgb3B0aW9uYWwgdWludDMyIHZhbF91aW50MzJfMSA9IDY7CisKKyAgb3B0aW9uYWwgaW50NjQgdmFsX2ludDY0MSA9IDc7CisgIG9wdGlvbmFsIGludDY0IHZhbF9pbnQ2NF8xID0gODsKKworICBvcHRpb25hbCB1aW50NjQgdmFsX3VpbnQ2NDEgPSA5OworICBvcHRpb25hbCB1aW50NjQgdmFsX3VpbnQ2NF8xID0gMTA7CisKKyAgb3B0aW9uYWwgYm9vbCB2YWxfYm9vbDEgPSAxMTsKKyAgb3B0aW9uYWwgYm9vbCB2YWxfYm9vbF8xID0gMTI7CisKKyAgb3B0aW9uYWwgZG91YmxlIHZhbF9kb3VibGUxID0gMTM7CisgIG9wdGlvbmFsIGRvdWJsZSB2YWxfZG91YmxlXzEgPSAxNDsKKworICBvcHRpb25hbCBmbG9hdCB2YWxfZmxvYXQxID0gMTU7CisgIG9wdGlvbmFsIGZsb2F0IHZhbF9mbG9hdF8xID0gMTY7Cit9CisKK21lc3NhZ2UgVGVzdFJlcGVhdGVkRmllbGRzV2l0aFNhbWVKc29uTmFtZSB7CisgIHJlcGVhdGVkIHN0cmluZyByZXBfc3RyMSA9IDE7CisgIHJlcGVhdGVkIHN0cmluZyByZXBfc3RyXzEgPSAyOworfQorCittZXNzYWdlIFRlc3RNZXNzYWdlRmllbGRzV2l0aFNhbWVKc29uTmFtZSB7CisgIG9wdGlvbmFsIFByaW1pdGl2ZSBwcmltMSA9IDE7CisgIG9wdGlvbmFsIFByaW1pdGl2ZSBwcmltXzEgPSAyOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWNlMTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucHJvdG8KQEAgLTAsMCArMSwxNzAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBwcm90b191dGlsX2NvbnZlcnRlci50ZXN0aW5nOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8iOworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvIjsKKworbWVzc2FnZSBEZWZhdWx0VmFsdWVUZXN0Q2FzZXMgeworICBEb3VibGVNZXNzYWdlIGVtcHR5X2RvdWJsZSA9IDE7CisgIERvdWJsZU1lc3NhZ2UgZG91YmxlX3dpdGhfZGVmYXVsdF92YWx1ZSA9IDI7CisgIERvdWJsZU1lc3NhZ2UgZG91YmxlX3dpdGhfbm9uZGVmYXVsdF92YWx1ZSA9IDM7CisgIERvdWJsZU1lc3NhZ2UgcmVwZWF0ZWRfZG91YmxlID0gNDsKKyAgRG91YmxlTWVzc2FnZSBuZXN0ZWRfbWVzc2FnZSA9IDU7CisgIERvdWJsZU1lc3NhZ2UgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgPSA2OworICBEb3VibGVNZXNzYWdlIGRvdWJsZV9tZXNzYWdlX3dpdGhfb25lb2YgPSA3OworICBTdHJ1Y3RNZXNzYWdlIGVtcHR5X3N0cnVjdCA9IDIwMTsKKyAgU3RydWN0TWVzc2FnZSBlbXB0eV9zdHJ1Y3QyID0gMjAyOworICBTdHJ1Y3RNZXNzYWdlIHN0cnVjdF93aXRoX251bGxfdmFsdWUgPSAyMDM7CisgIFN0cnVjdE1lc3NhZ2Ugc3RydWN0X3dpdGhfdmFsdWVzID0gMjA0OworICBTdHJ1Y3RNZXNzYWdlIHN0cnVjdF93aXRoX25lc3RlZF9zdHJ1Y3QgPSAyMDU7CisgIFN0cnVjdE1lc3NhZ2Ugc3RydWN0X3dpdGhfbmVzdGVkX2xpc3QgPSAyMDY7CisgIFN0cnVjdE1lc3NhZ2Ugc3RydWN0X3dpdGhfbGlzdF9vZl9udWxscyA9IDIwNzsKKyAgU3RydWN0TWVzc2FnZSBzdHJ1Y3Rfd2l0aF9saXN0X29mX2xpc3RzID0gMjA4OworICBTdHJ1Y3RNZXNzYWdlIHN0cnVjdF93aXRoX2xpc3Rfb2Zfc3RydWN0cyA9IDIwOTsKKyAgZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCB0b3BfbGV2ZWxfc3RydWN0ID0gMjEwOworICBWYWx1ZU1lc3NhZ2UgdmFsdWVfd3JhcHBlcl9zaW1wbGUgPSAyMTI7CisgIFZhbHVlTWVzc2FnZSB2YWx1ZV93cmFwcGVyX3dpdGhfc3RydWN0ID0gMjEzOworICBWYWx1ZU1lc3NhZ2UgdmFsdWVfd3JhcHBlcl93aXRoX2xpc3QgPSAyMTQ7CisgIExpc3RWYWx1ZU1lc3NhZ2UgbGlzdF92YWx1ZV93cmFwcGVyID0gMjE1OworICBnb29nbGUucHJvdG9idWYuVmFsdWUgdG9wX2xldmVsX3ZhbHVlX3NpbXBsZSA9IDIxNjsKKyAgZ29vZ2xlLnByb3RvYnVmLlZhbHVlIHRvcF9sZXZlbF92YWx1ZV93aXRoX3N0cnVjdCA9IDIxNzsKKyAgZ29vZ2xlLnByb3RvYnVmLlZhbHVlIHRvcF9sZXZlbF92YWx1ZV93aXRoX2xpc3QgPSAyMTg7CisgIGdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUgdG9wX2xldmVsX2xpc3R2YWx1ZSA9IDIxOTsKKyAgQW55TWVzc2FnZSBlbXB0eV9hbnkgPSAzMDE7CisgIEFueU1lc3NhZ2UgdHlwZV9vbmx5X2FueSA9IDMwMjsKKyAgQW55TWVzc2FnZSByZWN1cnNpdmVfYW55ID0gMzAzOworICBBbnlNZXNzYWdlIGFueV93aXRoX21lc3NhZ2VfdmFsdWUgPSAzMDQ7CisgIEFueU1lc3NhZ2UgYW55X3dpdGhfbmVzdGVkX21lc3NhZ2UgPSAzMDU7CisgIEFueU1lc3NhZ2UgYW55X3dpdGhfbWVzc2FnZV9jb250YWluaW5nX21hcCA9IDMwNjsKKyAgQW55TWVzc2FnZSBhbnlfd2l0aF9tZXNzYWdlX2NvbnRhaW5pbmdfc3RydWN0ID0gMzA3OworICBnb29nbGUucHJvdG9idWYuQW55IHRvcF9sZXZlbF9hbnkgPSAzMDg7CisgIFN0cmluZ3RvSW50TWFwIGVtcHR5X21hcCA9IDQwMTsKKyAgU3RyaW5ndG9JbnRNYXAgc3RyaW5nX3RvX2ludCA9IDQwMjsKKyAgSW50VG9TdHJpbmdNYXAgaW50X3RvX3N0cmluZyA9IDQwMzsKKyAgTWl4ZWRNYXAgbWl4ZWQxID0gNDA0OworICBNaXhlZE1hcDIgbWl4ZWQyID0gNDA1OworICBNaXhlZE1hcDIgZW1wdHlfbWl4ZWQyID0gNDA2OworICBNZXNzYWdlTWFwIG1hcF9vZl9vYmplY3RzID0gNDA3OworICBNaXhlZE1hcCBtaXhlZF9lbXB0eSA9IDQwODsKKyAgTWVzc2FnZU1hcCBtZXNzYWdlX21hcF9lbXB0eSA9IDQwOTsKKyAgRG91YmxlVmFsdWVNZXNzYWdlIGRvdWJsZV92YWx1ZSA9IDUwMTsKKyAgRG91YmxlVmFsdWVNZXNzYWdlIGRvdWJsZV92YWx1ZV9kZWZhdWx0ID0gNTAyOworfQorCittZXNzYWdlIERvdWJsZU1lc3NhZ2UgeworICBkb3VibGUgZG91YmxlX3ZhbHVlID0gMTsKKyAgcmVwZWF0ZWQgZG91YmxlIHJlcGVhdGVkX2RvdWJsZSA9IDI7CisgIERvdWJsZU1lc3NhZ2UgbmVzdGVkX21lc3NhZ2UgPSAzOworICByZXBlYXRlZCBEb3VibGVNZXNzYWdlIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlID0gNDsKKyAgZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlIGRvdWJsZV93cmFwcGVyID0gMTAwOworICBvbmVvZiB2YWx1ZSB7CisgICAgc3RyaW5nIHN0cl92YWx1ZSA9IDExMjsKKyAgICBpbnQ2NCBudW1fdmFsdWUgPSAxMTM7CisgIH0KK30KKworbWVzc2FnZSBTdHJ1Y3RNZXNzYWdlIHsKKyAgZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCBzdHJ1Y3QgPSAxOworfQorCittZXNzYWdlIFZhbHVlTWVzc2FnZSB7CisgIGdvb2dsZS5wcm90b2J1Zi5WYWx1ZSB2YWx1ZSA9IDE7Cit9CisKK21lc3NhZ2UgTGlzdFZhbHVlTWVzc2FnZSB7CisgIGdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUgc2hvcHBpbmdfbGlzdCA9IDE7Cit9CittZXNzYWdlIFJlcXVlc3RNZXNzYWdlIHsKKyAgc3RyaW5nIGNvbnRlbnQgPSAxOworfQorCisvLyBBIHRlc3Qgc2VydmljZS4KK3NlcnZpY2UgRGVmYXVsdFZhbHVlVGVzdFNlcnZpY2UgeworICAvLyBBIHRlc3QgbWV0aG9kLgorICBycGMgQ2FsbChSZXF1ZXN0TWVzc2FnZSkgcmV0dXJucyAoRGVmYXVsdFZhbHVlVGVzdENhc2VzKTsKK30KKworbWVzc2FnZSBBbnlNZXNzYWdlIHsKKyAgZ29vZ2xlLnByb3RvYnVmLkFueSBhbnkgPSAxOworICBBbnlEYXRhIGRhdGEgPSAyOworfQorCittZXNzYWdlIEFueURhdGEgeworICBpbnQzMiBhdHRyID0gMTsKKyAgc3RyaW5nIHN0ciA9IDI7CisgIHJlcGVhdGVkIHN0cmluZyBtc2dzID0gMzsKKyAgQW55RGF0YSBuZXN0ZWRfZGF0YSA9IDQ7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbWFwX2RhdGEgPSA3OworICBnb29nbGUucHJvdG9idWYuU3RydWN0IHN0cnVjdF9kYXRhID0gODsKKyAgcmVwZWF0ZWQgQW55RGF0YSByZXBlYXRlZF9kYXRhID0gOTsKK30KKworbWVzc2FnZSBTdHJpbmd0b0ludE1hcCB7CisgIG1hcDxzdHJpbmcsIGludDMyPiBtYXAgPSAxOworfQorCittZXNzYWdlIEludFRvU3RyaW5nTWFwIHsKKyAgbWFwPGludDMyLCBzdHJpbmc+IG1hcCA9IDE7Cit9CisKK21lc3NhZ2UgTWl4ZWRNYXAgeworICBzdHJpbmcgbXNnID0gMTsKKyAgbWFwPHN0cmluZywgZmxvYXQ+IG1hcCA9IDI7CisgIGludDMyIGludF92YWx1ZSA9IDM7Cit9CisKK21lc3NhZ2UgTWl4ZWRNYXAyIHsKKyAgZW51bSBFIHsKKyAgICBFMCA9IDA7CisgICAgRTEgPSAxOworICAgIEUyID0gMjsKKyAgICBFMyA9IDM7CisgIH0KKyAgbWFwPGludDMyLCBib29sPiBtYXAgPSAxOworICBFIGVlID0gMjsKKyAgc3RyaW5nIG1zZyA9IDQ7Cit9CisKK21lc3NhZ2UgTWVzc2FnZU1hcCB7CisgIG1lc3NhZ2UgTSB7CisgICAgaW50MzIgaW5uZXJfaW50ID0gMTsKKyAgICBzdHJpbmcgaW5uZXJfdGV4dCA9IDI7CisgIH0KKyAgbWFwPHN0cmluZywgTT4gbWFwID0gMTsKK30KKworbWVzc2FnZSBEb3VibGVWYWx1ZU1lc3NhZ2UgeworICBnb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUgZG91YmxlID0gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzU1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnByb3RvCkBAIC0wLDAgKzEsNTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBwcm90b191dGlsX2NvbnZlcnRlci50ZXN0aW5nOworCittZXNzYWdlIERlZmF1bHRWYWx1ZVRlc3QgeworICBkb3VibGUgZG91YmxlX3ZhbHVlID0gMTsKKyAgcmVwZWF0ZWQgZG91YmxlIHJlcGVhdGVkX2RvdWJsZSA9IDI7CisgIGZsb2F0IGZsb2F0X3ZhbHVlID0gMzsKKyAgaW50NjQgaW50NjRfdmFsdWUgPSA1OworICB1aW50NjQgdWludDY0X3ZhbHVlID0gNzsKKyAgaW50MzIgaW50MzJfdmFsdWUgPSA5OworICB1aW50MzIgdWludDMyX3ZhbHVlID0gMTE7CisgIGJvb2wgYm9vbF92YWx1ZSA9IDEzOworICBzdHJpbmcgc3RyaW5nX3ZhbHVlID0gMTU7CisgIGJ5dGVzIGJ5dGVzX3ZhbHVlID0gMTcgW2N0eXBlID0gQ09SRF07CisKKyAgZW51bSBFbnVtRGVmYXVsdCB7CisgICAgRU5VTV9GSVJTVCA9IDA7CisgICAgRU5VTV9TRUNPTkQgPSAxOworICAgIEVOVU1fVEhJUkQgPSAyOworICB9CisgIEVudW1EZWZhdWx0IGVudW1fdmFsdWUgPSAxODsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQyYmM0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnByb3RvCkBAIC0wLDAgKzEsNzEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBwcm90b191dGlsX2NvbnZlcnRlci50ZXN0aW5nOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvIjsKKworbWVzc2FnZSBOZXN0ZWRGaWVsZE1hc2sgeworICBzdHJpbmcgZGF0YSA9IDE7CisgIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2sgc2luZ2xlX21hc2sgPSAyOworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIHJlcGVhdGVkX21hc2sgPSAzOworfQorCittZXNzYWdlIEZpZWxkTWFza1Rlc3QgeworICBzdHJpbmcgaWQgPSAxOworICBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIHNpbmdsZV9tYXNrID0gMjsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayByZXBlYXRlZF9tYXNrID0gMzsKKyAgcmVwZWF0ZWQgTmVzdGVkRmllbGRNYXNrIG5lc3RlZF9tYXNrID0gNDsKK30KKworbWVzc2FnZSBGaWVsZE1hc2tUZXN0Q2FzZXMgeworICBGaWVsZE1hc2tXcmFwcGVyIHNpbmdsZV9tYXNrID0gMTsKKyAgRmllbGRNYXNrV3JhcHBlciBtdWx0aXBsZV9tYXNrID0gMjsKKyAgRmllbGRNYXNrV3JhcHBlciBzbmFrZV9jYW1lbCA9IDM7CisgIEZpZWxkTWFza1dyYXBwZXIgZW1wdHlfZmllbGQgPSA0OworICBGaWVsZE1hc2tXcmFwcGVyIGFwaWFyeV9mb3JtYXQxID0gNTsKKyAgRmllbGRNYXNrV3JhcHBlciBhcGlhcnlfZm9ybWF0MiA9IDY7CisgIEZpZWxkTWFza1dyYXBwZXIgYXBpYXJ5X2Zvcm1hdDMgPSA3OworICBGaWVsZE1hc2tXcmFwcGVyIG1hcF9rZXkxID0gODsKKyAgRmllbGRNYXNrV3JhcHBlciBtYXBfa2V5MiA9IDk7CisgIEZpZWxkTWFza1dyYXBwZXIgbWFwX2tleTMgPSAxMDsKKyAgRmllbGRNYXNrV3JhcHBlciBtYXBfa2V5NCA9IDExOworICBGaWVsZE1hc2tXcmFwcGVyIG1hcF9rZXk1ID0gMTI7Cit9CisKK21lc3NhZ2UgRmllbGRNYXNrV3JhcHBlciB7CisgIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2sgbWFzayA9IDE7Cit9CisKK3NlcnZpY2UgRmllbGRNYXNrVGVzdFNlcnZpY2UgeworICBycGMgQ2FsbChGaWVsZE1hc2tUZXN0Q2FzZXMpIHJldHVybnMgKEZpZWxkTWFza1Rlc3RDYXNlcyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZmRiZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wcm90bwpAQCAtMCwwICsxLDE0OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIHByb3RvX3V0aWxfY29udmVydGVyLnRlc3Rpbmc7CisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90byI7CisKKy8vIFRvcC1sZXZlbCB0ZXN0IGNhc2VzIHByb3RvIHVzZWQgYnkgTWFyc2hhbGxpbmdUZXN0LiBTZWUgZGVzY3JpcHRpb24KKy8vIGF0IHRoZSB0b3Agb2YgdGhlIGNsYXNzIE1hcnNoYWxsaW5nVGVzdCBmb3IgZGV0YWlscyBvbiBob3cgdG8gd3JpdGUKKy8vIHRlc3QgY2FzZXMuCittZXNzYWdlIE1hcHNUZXN0Q2FzZXMgeworICBFbXB0eU1hcCBlbXB0eV9tYXAgPSAxOworICBTdHJpbmd0b0ludCBzdHJpbmdfdG9faW50ID0gMjsKKyAgSW50VG9TdHJpbmcgaW50X3RvX3N0cmluZyA9IDM7CisgIE1peGVkMSBtaXhlZDEgPSA0OworICBNaXhlZDIgbWl4ZWQyID0gNTsKKyAgTWFwT2ZPYmplY3RzIG1hcF9vZl9vYmplY3RzID0gNjsKKworICAvLyBFbXB0eSBrZXkgdGVzdHMKKyAgU3RyaW5ndG9JbnQgZW1wdHlfa2V5X3N0cmluZ190b19pbnQxID0gNzsKKyAgU3RyaW5ndG9JbnQgZW1wdHlfa2V5X3N0cmluZ190b19pbnQyID0gODsKKyAgU3RyaW5ndG9JbnQgZW1wdHlfa2V5X3N0cmluZ190b19pbnQzID0gOTsKKyAgQm9vbFRvU3RyaW5nIGVtcHR5X2tleV9ib29sX3RvX3N0cmluZyA9IDEwOworICBJbnRUb1N0cmluZyBlbXB0eV9rZXlfaW50X3RvX3N0cmluZyA9IDExOworICBNaXhlZDEgZW1wdHlfa2V5X21peGVkID0gMTI7CisgIE1hcE9mT2JqZWN0cyBlbXB0eV9rZXlfbWFwX29iamVjdHMgPSAxMzsKK30KKworbWVzc2FnZSBFbXB0eU1hcCB7CisgIG1hcDxpbnQzMiwgaW50MzI+IG1hcCA9IDE7Cit9CisKK21lc3NhZ2UgU3RyaW5ndG9JbnQgeworICBtYXA8c3RyaW5nLCBpbnQzMj4gbWFwID0gMTsKK30KKworbWVzc2FnZSBJbnRUb1N0cmluZyB7CisgIG1hcDxpbnQzMiwgc3RyaW5nPiBtYXAgPSAxOworfQorCittZXNzYWdlIEJvb2xUb1N0cmluZyB7CisgIG1hcDxib29sLCBzdHJpbmc+IG1hcCA9IDE7Cit9CisKK21lc3NhZ2UgTWl4ZWQxIHsKKyAgc3RyaW5nIG1zZyA9IDE7CisgIG1hcDxzdHJpbmcsIGZsb2F0PiBtYXAgPSAyOworfQorCittZXNzYWdlIE1peGVkMiB7CisgIGVudW0gRSB7CisgICAgRTAgPSAwOworICAgIEUxID0gMTsKKyAgICBFMiA9IDI7CisgICAgRTMgPSAzOworICB9CisgIG1hcDxpbnQzMiwgYm9vbD4gbWFwID0gMTsKKyAgRSBlZSA9IDI7Cit9CisKK21lc3NhZ2UgTWFwT2ZPYmplY3RzIHsKKyAgbWVzc2FnZSBNIHsKKyAgICBzdHJpbmcgaW5uZXJfdGV4dCA9IDE7CisgIH0KKyAgbWFwPHN0cmluZywgTT4gbWFwID0gMTsKK30KKworbWVzc2FnZSBEdW1teVJlcXVlc3Qge30KKworc2VydmljZSBNYXBzVGVzdFNlcnZpY2UgeworICBycGMgQ2FsbChEdW1teVJlcXVlc3QpIHJldHVybnMgKE1hcHNUZXN0Q2FzZXMpOworfQorCittZXNzYWdlIE1hcEluIHsKKyAgc3RyaW5nIG90aGVyID0gMTsKKyAgcmVwZWF0ZWQgc3RyaW5nIHRoaW5ncyA9IDI7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbWFwX2lucHV0ID0gMzsKKyAgbWFwPHN0cmluZywgZ29vZ2xlLnByb3RvYnVmLkFueT4gbWFwX2FueSA9IDQ7Cit9CisKK21lc3NhZ2UgTWFwT3V0IHsKKyAgbWFwPHN0cmluZywgTWFwTT4gbWFwMSA9IDE7CisgIG1hcDxzdHJpbmcsIE1hcE91dD4gbWFwMiA9IDI7CisgIG1hcDxpbnQzMiwgc3RyaW5nPiBtYXAzID0gMzsKKyAgbWFwPGJvb2wsIHN0cmluZz4gbWFwNCA9IDU7CisgIHN0cmluZyBiYXIgPSA0OworfQorCisvLyBBIG1lc3NhZ2Ugd2l0aCBleGFjdGx5IHRoZSBzYW1lIHdpcmUgcmVwcmVzZW50YXRpb24gYXMgTWFwT3V0LCBidXQgdXNpbmcKKy8vIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGRzIGluc3RlYWQgb2YgbWFwIGZpZWxkcy4gV2UgdXNlIHRoaXMgbWVzc2FnZSB0byB0ZXN0CisvLyB0aGUgd2lyZS1mb3JtYXQgY29tcGF0aWJpbGl0eSBvZiB0aGUgSlNPTiB0cmFuc2NvZGVyIChlLmcuLCB3aGV0aGVyIGl0CisvLyBoYW5kbGVzIG1pc3Npbmcga2V5cyBjb3JyZWN0bHkpLgorbWVzc2FnZSBNYXBPdXRXaXJlRm9ybWF0IHsKKyAgbWVzc2FnZSBNYXAxRW50cnkgeworICAgIHN0cmluZyBrZXkgPSAxOworICAgIE1hcE0gdmFsdWUgPSAyOworICB9CisgIHJlcGVhdGVkIE1hcDFFbnRyeSBtYXAxID0gMTsKKyAgbWVzc2FnZSBNYXAyRW50cnkgeworICAgIHN0cmluZyBrZXkgPSAxOworICAgIE1hcE91dCB2YWx1ZSA9IDI7CisgIH0KKyAgcmVwZWF0ZWQgTWFwMkVudHJ5IG1hcDIgPSAyOworICBtZXNzYWdlIE1hcDNFbnRyeSB7CisgICAgaW50MzIga2V5ID0gMTsKKyAgICBzdHJpbmcgdmFsdWUgPSAyOworICB9CisgIHJlcGVhdGVkIE1hcDNFbnRyeSBtYXAzID0gMzsKKyAgbWVzc2FnZSBNYXA0RW50cnkgeworICAgIGJvb2wga2V5ID0gMTsKKyAgICBzdHJpbmcgdmFsdWUgPSAyOworICB9CisgIHJlcGVhdGVkIE1hcDRFbnRyeSBtYXA0ID0gNTsKKyAgc3RyaW5nIGJhciA9IDQ7Cit9CisKK21lc3NhZ2UgTWFwTSB7CisgIHN0cmluZyBmb28gPSAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9vbmVvZnMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwNmFmMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9vbmVvZnMucHJvdG8KQEAgLTAsMCArMSw3NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFByb3RvIHRvIHRlc3QgcHJvdG8zIG9uZW9mcy4KK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIHByb3RvX3V0aWxfY29udmVydGVyLnRlc3Rpbmcub25lb2ZzOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8iOworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byI7CisKK21lc3NhZ2UgT25lT2ZzUmVxdWVzdCB7CisgIHN0cmluZyB2YWx1ZSA9IDE7CisgIG9uZW9mIGRhdGEgeworICAgIHN0cmluZyBzdHJfZGF0YSA9IDI7CisgICAgaW50MzIgaW50X2RhdGEgPSAzOworICAgIC8vIFNpbXBsZSBtZXNzYWdlCisgICAgRGF0YSBtZXNzYWdlX2RhdGEgPSA0OworICAgIE1vcmVEYXRhIG1vcmVfZGF0YSA9IDU7CisgICAgLy8gV2VsbCBrbm93biB0eXBlcworICAgIGdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3Qgc3RydWN0X2RhdGEgPSA2OworICAgIGdvb2dsZS5wcm90b2J1Zi5WYWx1ZSB2YWx1ZV9kYXRhID0gNzsKKyAgICBnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlIGxpc3RfdmFsdWVfZGF0YSA9IDg7CisgICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCB0c19kYXRhID0gOTsKKyAgfQorICBnb29nbGUucHJvdG9idWYuQW55IGFueV9kYXRhID0gMTk7Cit9CisKK21lc3NhZ2UgUmVxdWVzdFdpdGhTaW1wbGVPbmVvZiB7CisgIHN0cmluZyB2YWx1ZSA9IDE7CisgIG9uZW9mIGRhdGEgeworICAgIHN0cmluZyBzdHJfZGF0YSA9IDI7CisgICAgaW50MzIgaW50X2RhdGEgPSAzOworICAgIERhdGEgbWVzc2FnZV9kYXRhID0gNDsKKyAgICBNb3JlRGF0YSBtb3JlX2RhdGEgPSA1OworICB9Cit9CisKK21lc3NhZ2UgRGF0YSB7CisgIGludDMyIGRhdGFfdmFsdWUgPSAxOworfQorCittZXNzYWdlIE1vcmVEYXRhIHsKKyAgc3RyaW5nIHN0cl92YWx1ZSA9IDE7Cit9CisKK21lc3NhZ2UgUmVzcG9uc2UgeworICBzdHJpbmcgdmFsdWUgPSAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3Byb3RvMy5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE0MzRiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9wcm90bzMucHJvdG8KQEAgLTAsMCArMSw0MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIHByb3RvX3V0aWxfY29udmVydGVyLnRlc3Rpbmc7CisKK21lc3NhZ2UgUHJvdG8zTWVzc2FnZSB7CisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgRk9PID0gMDsKKyAgICBCQVIgPSAxOworICAgIEJBWiA9IDI7CisgIH0KKyAgTmVzdGVkRW51bSBlbnVtX3ZhbHVlID0gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MGVhODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnByb3RvCkBAIC0wLDAgKzEsMTE3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgcHJvdG9fdXRpbF9jb252ZXJ0ZXIudGVzdGluZzsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvIjsKKworbWVzc2FnZSBTdHJ1Y3RUZXN0Q2FzZXMgeworICBTdHJ1Y3RXcmFwcGVyIGVtcHR5X3ZhbHVlID0gMTsKKyAgU3RydWN0V3JhcHBlciBlbXB0eV92YWx1ZTIgPSAyOworICBTdHJ1Y3RXcmFwcGVyIG51bGxfdmFsdWUgPSAzOworICBTdHJ1Y3RXcmFwcGVyIHNpbXBsZV9zdHJ1Y3QgPSA0OworICBTdHJ1Y3RXcmFwcGVyIGxvbmdlcl9zdHJ1Y3QgPSA1OworICBTdHJ1Y3RXcmFwcGVyIHN0cnVjdF93aXRoX25lc3RlZF9zdHJ1Y3QgPSA2OworICBTdHJ1Y3RXcmFwcGVyIHN0cnVjdF93aXRoX25lc3RlZF9saXN0ID0gNzsKKyAgU3RydWN0V3JhcHBlciBzdHJ1Y3Rfd2l0aF9saXN0X29mX251bGxzID0gODsKKyAgU3RydWN0V3JhcHBlciBzdHJ1Y3Rfd2l0aF9saXN0X29mX2xpc3RzID0gOTsKKyAgU3RydWN0V3JhcHBlciBzdHJ1Y3Rfd2l0aF9saXN0X29mX3N0cnVjdHMgPSAxMDsKKyAgU3RydWN0V3JhcHBlciBzdHJ1Y3Rfd2l0aF9lbXB0eV9saXN0ID0gMTE7CisgIFN0cnVjdFdyYXBwZXIgc3RydWN0X3dpdGhfbGlzdF93aXRoX2VtcHR5X3N0cnVjdCA9IDEyOworICBnb29nbGUucHJvdG9idWYuU3RydWN0IHRvcF9sZXZlbF9zdHJ1Y3QgPSAxMzsKKyAgZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCB0b3BfbGV2ZWxfc3RydWN0X3dpdGhfZW1wdHlfbGlzdCA9IDE0OworICBnb29nbGUucHJvdG9idWYuU3RydWN0IHRvcF9sZXZlbF9zdHJ1Y3Rfd2l0aF9saXN0X3dpdGhfZW1wdHlfc3RydWN0ID0gMTU7CisgIFZhbHVlV3JhcHBlciB2YWx1ZV93cmFwcGVyX3NpbXBsZSA9IDE2OworICBWYWx1ZVdyYXBwZXIgdmFsdWVfd3JhcHBlcl93aXRoX3N0cnVjdCA9IDE3OworICBWYWx1ZVdyYXBwZXIgdmFsdWVfd3JhcHBlcl93aXRoX2xpc3QgPSAxODsKKyAgVmFsdWVXcmFwcGVyIHZhbHVlX3dyYXBwZXJfd2l0aF9lbXB0eV9saXN0ID0gMTk7CisgIFZhbHVlV3JhcHBlciB2YWx1ZV93cmFwcGVyX3dpdGhfbGlzdF93aXRoX2VtcHR5X3N0cnVjdCA9IDIwOworICBMaXN0VmFsdWVXcmFwcGVyIGxpc3RfdmFsdWVfd3JhcHBlciA9IDIxOworICBMaXN0VmFsdWVXcmFwcGVyIGxpc3RfdmFsdWVfd3JhcHBlcl93aXRoX2VtcHR5X2xpc3QgPSAyMjsKKyAgTGlzdFZhbHVlV3JhcHBlciBsaXN0X3ZhbHVlX3dyYXBwZXJfd2l0aF9saXN0X3dpdGhfZW1wdHlfc3RydWN0ID0gMjM7CisgIGdvb2dsZS5wcm90b2J1Zi5WYWx1ZSB0b3BfbGV2ZWxfdmFsdWVfc2ltcGxlID0gMjQ7CisgIGdvb2dsZS5wcm90b2J1Zi5WYWx1ZSB0b3BfbGV2ZWxfdmFsdWVfd2l0aF9zdHJ1Y3QgPSAyNTsKKyAgZ29vZ2xlLnByb3RvYnVmLlZhbHVlIHRvcF9sZXZlbF92YWx1ZV93aXRoX2xpc3QgPSAyNjsKKyAgZ29vZ2xlLnByb3RvYnVmLlZhbHVlIHRvcF9sZXZlbF92YWx1ZV93aXRoX2VtcHR5X2xpc3QgPSAyNzsKKyAgZ29vZ2xlLnByb3RvYnVmLlZhbHVlIHRvcF9sZXZlbF92YWx1ZV93aXRoX2xpc3Rfd2l0aF9lbXB0eV9zdHJ1Y3QgPSAyODsKKyAgZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZSB0b3BfbGV2ZWxfbGlzdHZhbHVlID0gMjk7CisgIGdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUgdG9wX2xldmVsX2VtcHR5X2xpc3R2YWx1ZSA9IDMwOworICBnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlIHRvcF9sZXZlbF9saXN0dmFsdWVfd2l0aF9lbXB0eV9zdHJ1Y3QgPSAzMTsKKyAgUmVwZWF0ZWRWYWx1ZVdyYXBwZXIgcmVwZWF0ZWRfdmFsdWUgPSAzMjsKKyAgUmVwZWF0ZWRWYWx1ZVdyYXBwZXIgcmVwZWF0ZWRfdmFsdWVfbmVzdGVkX2xpc3QgPSAzMzsKKyAgUmVwZWF0ZWRWYWx1ZVdyYXBwZXIgcmVwZWF0ZWRfdmFsdWVfbmVzdGVkX2xpc3QyID0gMzQ7CisgIFJlcGVhdGVkVmFsdWVXcmFwcGVyIHJlcGVhdGVkX3ZhbHVlX25lc3RlZF9saXN0MyA9IDM1OworICBSZXBlYXRlZExpc3RWYWx1ZVdyYXBwZXIgcmVwZWF0ZWRfbGlzdHZhbHVlID0gMzY7CisgIE1hcE9mU3RydWN0IG1hcF9vZl9zdHJ1Y3QgPSAzNzsKKyAgTWFwT2ZTdHJ1Y3QgbWFwX29mX3N0cnVjdF92YWx1ZSA9IDM4OworICBNYXBPZlN0cnVjdCBtYXBfb2ZfbGlzdHZhbHVlID0gMzk7Cit9CisKK21lc3NhZ2UgU3RydWN0V3JhcHBlciB7CisgIGdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3Qgc3RydWN0ID0gMTsKK30KKworbWVzc2FnZSBWYWx1ZVdyYXBwZXIgeworICBnb29nbGUucHJvdG9idWYuVmFsdWUgdmFsdWUgPSAxOworfQorCittZXNzYWdlIFJlcGVhdGVkVmFsdWVXcmFwcGVyIHsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLlZhbHVlIHZhbHVlcyA9IDE7Cit9CisKK21lc3NhZ2UgTGlzdFZhbHVlV3JhcHBlciB7CisgIGdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUgc2hvcHBpbmdfbGlzdCA9IDE7Cit9CisKK21lc3NhZ2UgUmVwZWF0ZWRMaXN0VmFsdWVXcmFwcGVyIHsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZSBkaW1lbnNpb25zID0gMTsKK30KKworbWVzc2FnZSBNYXBPZlN0cnVjdCB7CisgIG1hcDxzdHJpbmcsIGdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3Q+IHN0cnVjdF9tYXAgPSAxOworICBtYXA8c3RyaW5nLCBnb29nbGUucHJvdG9idWYuVmFsdWU+IHZhbHVlX21hcCA9IDI7CisgIG1hcDxzdHJpbmcsIGdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWU+IGxpc3R2YWx1ZV9tYXAgPSAzOworfQorCisvLyBIYWNrIHRvIHRlc3QgcmV0dXJuIHR5cGVzIHdpdGggU3RydWN0IGFzIHRvcC1sZXZlbCBtZXNzYWdlLiBTdHJ1Y3QgdHlwZXJzCisvLyBjYW5ub3QgYmUgZGlyZWN0bHkgdXNlZCBpbiBBUEkgcmVxdWVzdHMuIEhlbmNlIHVzaW5nIER1bW15IGFzIHJlcXVlc3QgdHlwZS4KK21lc3NhZ2UgRHVtbXkgeworICBzdHJpbmcgdGV4dCA9IDE7Cit9CisKK3NlcnZpY2UgU3RydWN0VGVzdFNlcnZpY2UgeworICBycGMgQ2FsbChEdW1teSkgcmV0dXJucyAoU3RydWN0VGVzdENhc2VzKTsKK30KKworbWVzc2FnZSBTdHJ1Y3RUeXBlIHsKKyAgZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCBvYmplY3QgPSAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS90aW1lc3RhbXBfZHVyYXRpb24ucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4N2JkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS90aW1lc3RhbXBfZHVyYXRpb24ucHJvdG8KQEAgLTAsMCArMSw4MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIHByb3RvX3V0aWxfY29udmVydGVyLnRlc3Rpbmc7CisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byI7CisKK21lc3NhZ2UgVGltZXN0YW1wRHVyYXRpb25UZXN0Q2FzZXMgeworICAvLyBUaW1lc3RhbXAgdGVzdHMKKyAgVGltZVN0YW1wVHlwZSBlcG9jaCA9IDE7CisgIFRpbWVTdGFtcFR5cGUgZXBvY2gyID0gMjsKKyAgVGltZVN0YW1wVHlwZSBtaW50aW1lID0gMzsKKyAgVGltZVN0YW1wVHlwZSBtYXh0aW1lID0gNDsKKyAgVGltZVN0YW1wVHlwZSB0aW1ldmFsMSA9IDU7CisgIFRpbWVTdGFtcFR5cGUgdGltZXZhbDIgPSA2OworICBUaW1lU3RhbXBUeXBlIHRpbWV2YWwzID0gNzsKKyAgVGltZVN0YW1wVHlwZSB0aW1ldmFsNCA9IDg7CisgIFRpbWVTdGFtcFR5cGUgdGltZXZhbDUgPSA5OworICBUaW1lU3RhbXBUeXBlIHRpbWV2YWw2ID0gMTA7CisgIFRpbWVTdGFtcFR5cGUgdGltZXZhbDcgPSAxMTsKKyAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCB0aW1ldmFsOCA9IDEyOworCisgIC8vIER1cmF0aW9uIHRlc3RzCisgIER1cmF0aW9uVHlwZSB6ZXJvX2R1cmF0aW9uID0gMTAxOworICBEdXJhdGlvblR5cGUgbWluX2R1cmF0aW9uID0gMTAyOworICBEdXJhdGlvblR5cGUgbWF4X2R1cmF0aW9uID0gMTAzOworICBEdXJhdGlvblR5cGUgZHVyYXRpb24xID0gMTA0OworICBEdXJhdGlvblR5cGUgZHVyYXRpb24yID0gMTA1OworICBEdXJhdGlvblR5cGUgZHVyYXRpb24zID0gMTA2OworICBEdXJhdGlvblR5cGUgZHVyYXRpb240ID0gMTA3OworICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gZHVyYXRpb241ID0gMTA4OworfQorCittZXNzYWdlIFRpbWVTdGFtcFR5cGUgeworICBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIHRpbWVzdGFtcCA9IDE7Cit9CisKK21lc3NhZ2UgRHVyYXRpb25UeXBlIHsKKyAgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIGR1cmF0aW9uID0gMTsKK30KKworc2VydmljZSBUaW1lc3RhbXBEdXJhdGlvblRlc3RTZXJ2aWNlIHsKKyAgcnBjIENhbGwoVGltZXN0YW1wRHVyYXRpb25UZXN0Q2FzZXMpIHJldHVybnMgKFRpbWVzdGFtcER1cmF0aW9uVGVzdENhc2VzKTsKK30KKworbWVzc2FnZSBUaW1lc3RhbXBEdXJhdGlvbiB7CisgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgdHMgPSAxOworICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gZHVyID0gMjsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCByZXBfdHMgPSAzOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YTA1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvd3JhcHBlcnMucHJvdG8KQEAgLTAsMCArMSwxMDAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBwcm90b191dGlsX2NvbnZlcnRlci50ZXN0aW5nOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90byI7CisKKy8vIFRvcC1sZXZlbCB0ZXN0IGNhc2VzIHByb3RvIHVzZWQgYnkgTWFyc2hhbGxpbmdUZXN0LiBTZWUgZGVzY3JpcHRpb24KKy8vIGF0IHRoZSB0b3Agb2YgdGhlIGNsYXNzIE1hcnNoYWxsaW5nVGVzdCBmb3IgZGV0YWlscyBvbiBob3cgdG8gd3JpdGUKKy8vIHRlc3QgY2FzZXMuCittZXNzYWdlIFdyYXBwZXJzVGVzdENhc2VzIHsKKyAgRG91YmxlV3JhcHBlciBkb3VibGVfd3JhcHBlciA9IDE7CisgIEZsb2F0V3JhcHBlciBmbG9hdF93cmFwcGVyID0gMjsKKyAgSW50NjRXcmFwcGVyIGludDY0X3dyYXBwZXIgPSAzOworICBVSW50NjRXcmFwcGVyIHVpbnQ2NF93cmFwcGVyID0gNDsKKyAgSW50MzJXcmFwcGVyIGludDMyX3dyYXBwZXIgPSA1OworICBVSW50MzJXcmFwcGVyIHVpbnQzMl93cmFwcGVyID0gNjsKKyAgQm9vbFdyYXBwZXIgYm9vbF93cmFwcGVyID0gNzsKKyAgU3RyaW5nV3JhcHBlciBzdHJpbmdfd3JhcHBlciA9IDg7CisgIEJ5dGVzV3JhcHBlciBieXRlc193cmFwcGVyID0gOTsKKworICBEb3VibGVXcmFwcGVyIGRvdWJsZV93cmFwcGVyX2RlZmF1bHQgPSAxMDsKKyAgRmxvYXRXcmFwcGVyIGZsb2F0X3dyYXBwZXJfZGVmYXVsdCA9IDExOworICBJbnQ2NFdyYXBwZXIgaW50NjRfd3JhcHBlcl9kZWZhdWx0ID0gMTI7CisgIFVJbnQ2NFdyYXBwZXIgdWludDY0X3dyYXBwZXJfZGVmYXVsdCA9IDEzOworICBJbnQzMldyYXBwZXIgaW50MzJfd3JhcHBlcl9kZWZhdWx0ID0gMTQ7CisgIFVJbnQzMldyYXBwZXIgdWludDMyX3dyYXBwZXJfZGVmYXVsdCA9IDE1OworICBCb29sV3JhcHBlciBib29sX3dyYXBwZXJfZGVmYXVsdCA9IDE2OworICBTdHJpbmdXcmFwcGVyIHN0cmluZ193cmFwcGVyX2RlZmF1bHQgPSAxNzsKKyAgQnl0ZXNXcmFwcGVyIGJ5dGVzX3dyYXBwZXJfZGVmYXVsdCA9IDE4OworfQorCittZXNzYWdlIERvdWJsZVdyYXBwZXIgeworICBnb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUgZG91YmxlID0gMTsKK30KKworbWVzc2FnZSBGbG9hdFdyYXBwZXIgeworICBnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZSBmbG9hdCA9IDE7Cit9CisKK21lc3NhZ2UgSW50NjRXcmFwcGVyIHsKKyAgZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUgaW50NjQgPSAxOworfQorCittZXNzYWdlIFVJbnQ2NFdyYXBwZXIgeworICBnb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUgdWludDY0ID0gMTsKK30KKworbWVzc2FnZSBJbnQzMldyYXBwZXIgeworICBnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSBpbnQzMiA9IDE7Cit9CisKK21lc3NhZ2UgVUludDMyV3JhcHBlciB7CisgIGdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZSB1aW50MzIgPSAxOworfQorCittZXNzYWdlIEJvb2xXcmFwcGVyIHsKKyAgZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZSBib29sID0gMTsKK30KKworbWVzc2FnZSBTdHJpbmdXcmFwcGVyIHsKKyAgZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlIHN0cmluZyA9IDE7Cit9CisKK21lc3NhZ2UgQnl0ZXNXcmFwcGVyIHsKKyAgZ29vZ2xlLnByb3RvYnVmLkJ5dGVzVmFsdWUgYnl0ZXMgPSAxOworfQorCitzZXJ2aWNlIFdyYXBwZXJzVGVzdFNlcnZpY2UgeworICBycGMgQ2FsbChXcmFwcGVyc1Rlc3RDYXNlcykgcmV0dXJucyAoV3JhcHBlcnNUZXN0Q2FzZXMpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mby5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjZjUzNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm8uY2MKQEAgLTAsMCArMSwxODIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90eXBlLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdXRpbGl0eS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXBfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKK25hbWVzcGFjZSB7CisvLyBBIFR5cGVJbmZvIHRoYXQgbG9va3MgdXAgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgYSBUeXBlUmVzb2x2ZXIuCitjbGFzcyBUeXBlSW5mb0ZvclR5cGVSZXNvbHZlciA6IHB1YmxpYyBUeXBlSW5mbyB7CisgcHVibGljOgorICBleHBsaWNpdCBUeXBlSW5mb0ZvclR5cGVSZXNvbHZlcihUeXBlUmVzb2x2ZXIqIHR5cGVfcmVzb2x2ZXIpCisgICAgICA6IHR5cGVfcmVzb2x2ZXJfKHR5cGVfcmVzb2x2ZXIpIHt9CisKKyAgflR5cGVJbmZvRm9yVHlwZVJlc29sdmVyKCkgb3ZlcnJpZGUgeworICAgIERlbGV0ZUNhY2hlZFR5cGVzKCZjYWNoZWRfdHlwZXNfKTsKKyAgICBEZWxldGVDYWNoZWRUeXBlcygmY2FjaGVkX2VudW1zXyk7CisgIH0KKworICB1dGlsOjpTdGF0dXNPcjxjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKj4gUmVzb2x2ZVR5cGVVcmwoCisgICAgICBTdHJpbmdQaWVjZSB0eXBlX3VybCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHN0ZDo6bWFwPFN0cmluZ1BpZWNlLCBTdGF0dXNPclR5cGU+OjppdGVyYXRvciBpdCA9CisgICAgICAgIGNhY2hlZF90eXBlc18uZmluZCh0eXBlX3VybCk7CisgICAgaWYgKGl0ICE9IGNhY2hlZF90eXBlc18uZW5kKCkpIHsKKyAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKyAgICAvLyBTdG9yZXMgdGhlIHN0cmluZyB2YWx1ZSBzbyBpdCBjYW4gYmUgcmVmZXJlbmNlZCB1c2luZyBTdHJpbmdQaWVjZSBpbiB0aGUKKyAgICAvLyBjYWNoZWRfdHlwZXNfIG1hcC4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyaW5nX3R5cGVfdXJsID0KKyAgICAgICAgKnN0cmluZ19zdG9yYWdlXy5pbnNlcnQoc3RkOjpzdHJpbmcodHlwZV91cmwpKS5maXJzdDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Z29vZ2xlOjpwcm90b2J1Zjo6VHlwZT4gdHlwZShuZXcgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSgpKTsKKyAgICB1dGlsOjpTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgdHlwZV9yZXNvbHZlcl8tPlJlc29sdmVNZXNzYWdlVHlwZShzdHJpbmdfdHlwZV91cmwsIHR5cGUuZ2V0KCkpOworICAgIFN0YXR1c09yVHlwZSByZXN1bHQgPQorICAgICAgICBzdGF0dXMub2soKSA/IFN0YXR1c09yVHlwZSh0eXBlLnJlbGVhc2UoKSkgOiBTdGF0dXNPclR5cGUoc3RhdHVzKTsKKyAgICBjYWNoZWRfdHlwZXNfW3N0cmluZ190eXBlX3VybF0gPSByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqIEdldFR5cGVCeVR5cGVVcmwoCisgICAgICBTdHJpbmdQaWVjZSB0eXBlX3VybCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIFN0YXR1c09yVHlwZSByZXN1bHQgPSBSZXNvbHZlVHlwZVVybCh0eXBlX3VybCk7CisgICAgcmV0dXJuIHJlc3VsdC5vaygpID8gcmVzdWx0LnZhbHVlKCkgOiBOVUxMOworICB9CisKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bSogR2V0RW51bUJ5VHlwZVVybCgKKyAgICAgIFN0cmluZ1BpZWNlIHR5cGVfdXJsKSBjb25zdCBvdmVycmlkZSB7CisgICAgc3RkOjptYXA8U3RyaW5nUGllY2UsIFN0YXR1c09yRW51bT46Oml0ZXJhdG9yIGl0ID0KKyAgICAgICAgY2FjaGVkX2VudW1zXy5maW5kKHR5cGVfdXJsKTsKKyAgICBpZiAoaXQgIT0gY2FjaGVkX2VudW1zXy5lbmQoKSkgeworICAgICAgcmV0dXJuIGl0LT5zZWNvbmQub2soKSA/IGl0LT5zZWNvbmQudmFsdWUoKSA6IE5VTEw7CisgICAgfQorICAgIC8vIFN0b3JlcyB0aGUgc3RyaW5nIHZhbHVlIHNvIGl0IGNhbiBiZSByZWZlcmVuY2VkIHVzaW5nIFN0cmluZ1BpZWNlIGluIHRoZQorICAgIC8vIGNhY2hlZF9lbnVtc18gbWFwLgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJpbmdfdHlwZV91cmwgPQorICAgICAgICAqc3RyaW5nX3N0b3JhZ2VfLmluc2VydChzdGQ6OnN0cmluZyh0eXBlX3VybCkpLmZpcnN0OworICAgIHN0ZDo6dW5pcXVlX3B0cjxnb29nbGU6OnByb3RvYnVmOjpFbnVtPiBlbnVtX3R5cGUoCisgICAgICAgIG5ldyBnb29nbGU6OnByb3RvYnVmOjpFbnVtKCkpOworICAgIHV0aWw6OlN0YXR1cyBzdGF0dXMgPQorICAgICAgICB0eXBlX3Jlc29sdmVyXy0+UmVzb2x2ZUVudW1UeXBlKHN0cmluZ190eXBlX3VybCwgZW51bV90eXBlLmdldCgpKTsKKyAgICBTdGF0dXNPckVudW0gcmVzdWx0ID0KKyAgICAgICAgc3RhdHVzLm9rKCkgPyBTdGF0dXNPckVudW0oZW51bV90eXBlLnJlbGVhc2UoKSkgOiBTdGF0dXNPckVudW0oc3RhdHVzKTsKKyAgICBjYWNoZWRfZW51bXNfW3N0cmluZ190eXBlX3VybF0gPSByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdC5vaygpID8gcmVzdWx0LnZhbHVlKCkgOiBOVUxMOworICB9CisKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIEZpbmRGaWVsZCgKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqIHR5cGUsCisgICAgICBTdHJpbmdQaWVjZSBjYW1lbF9jYXNlX25hbWUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBzdGQ6Om1hcDxjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKiwgQ2FtZWxDYXNlTmFtZVRhYmxlPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgaXQgPSBpbmRleGVkX3R5cGVzXy5maW5kKHR5cGUpOworICAgIGNvbnN0IENhbWVsQ2FzZU5hbWVUYWJsZSYgY2FtZWxfY2FzZV9uYW1lX3RhYmxlID0KKyAgICAgICAgKGl0ID09IGluZGV4ZWRfdHlwZXNfLmVuZCgpKQorICAgICAgICAgICAgPyBQb3B1bGF0ZU5hbWVMb29rdXBUYWJsZSh0eXBlLCAmaW5kZXhlZF90eXBlc19bdHlwZV0pCisgICAgICAgICAgICA6IGl0LT5zZWNvbmQ7CisgICAgU3RyaW5nUGllY2UgbmFtZSA9IEZpbmRXaXRoRGVmYXVsdCgKKyAgICAgICAgY2FtZWxfY2FzZV9uYW1lX3RhYmxlLCBjYW1lbF9jYXNlX25hbWUsIFN0cmluZ1BpZWNlKCkpOworICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgIC8vIERpZG4ndCBmaW5kIGEgbWFwcGluZy4gVXNlIHdoYXRldmVyIHByb3ZpZGVkLgorICAgICAgbmFtZSA9IGNhbWVsX2Nhc2VfbmFtZTsKKyAgICB9CisgICAgcmV0dXJuIEZpbmRGaWVsZEluVHlwZU9yTnVsbCh0eXBlLCBuYW1lKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdHlwZWRlZiB1dGlsOjpTdGF0dXNPcjxjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKj4gU3RhdHVzT3JUeXBlOworICB0eXBlZGVmIHV0aWw6OlN0YXR1c09yPGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVudW0qPiBTdGF0dXNPckVudW07CisgIHR5cGVkZWYgc3RkOjptYXA8U3RyaW5nUGllY2UsIFN0cmluZ1BpZWNlPiBDYW1lbENhc2VOYW1lVGFibGU7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyB2b2lkIERlbGV0ZUNhY2hlZFR5cGVzKHN0ZDo6bWFwPFN0cmluZ1BpZWNlLCBUPiogY2FjaGVkX3R5cGVzKSB7CisgICAgZm9yICh0eXBlbmFtZSBzdGQ6Om1hcDxTdHJpbmdQaWVjZSwgVD46Oml0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICBjYWNoZWRfdHlwZXMtPmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBjYWNoZWRfdHlwZXMtPmVuZCgpOyArK2l0KSB7CisgICAgICBpZiAoaXQtPnNlY29uZC5vaygpKSB7CisgICAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kLnZhbHVlKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgY29uc3QgQ2FtZWxDYXNlTmFtZVRhYmxlJiBQb3B1bGF0ZU5hbWVMb29rdXBUYWJsZSgKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqIHR5cGUsCisgICAgICBDYW1lbENhc2VOYW1lVGFibGUqIGNhbWVsX2Nhc2VfbmFtZV90YWJsZSkgY29uc3QgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS0+ZmllbGRzX3NpemUoKTsgKytpKSB7CisgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCYgZmllbGQgPSB0eXBlLT5maWVsZHMoaSk7CisgICAgICBTdHJpbmdQaWVjZSBuYW1lID0gZmllbGQubmFtZSgpOworICAgICAgU3RyaW5nUGllY2UgY2FtZWxfY2FzZV9uYW1lID0gZmllbGQuanNvbl9uYW1lKCk7CisgICAgICBjb25zdCBTdHJpbmdQaWVjZSogZXhpc3RpbmcgPSBJbnNlcnRPclJldHVybkV4aXN0aW5nKAorICAgICAgICAgIGNhbWVsX2Nhc2VfbmFtZV90YWJsZSwgY2FtZWxfY2FzZV9uYW1lLCBuYW1lKTsKKyAgICAgIGlmIChleGlzdGluZyAmJiAqZXhpc3RpbmcgIT0gbmFtZSkgeworICAgICAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJGaWVsZCAnIiA8PCBuYW1lIDw8ICInIGFuZCAnIiA8PCAqZXhpc3RpbmcKKyAgICAgICAgICAgICAgICAgICAgIDw8ICInIG1hcCB0byB0aGUgc2FtZSBjYW1lbCBjYXNlIG5hbWUgJyIgPDwgY2FtZWxfY2FzZV9uYW1lCisgICAgICAgICAgICAgICAgICAgICA8PCAiJy4iOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKmNhbWVsX2Nhc2VfbmFtZV90YWJsZTsKKyAgfQorCisgIFR5cGVSZXNvbHZlciogdHlwZV9yZXNvbHZlcl87CisKKyAgLy8gU3RvcmVzIHN0cmluZyB2YWx1ZXMgdGhhdCB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgU3RyaW5nUGllY2VzIGluCisgIC8vIGNhY2hlZF90eXBlc18sIGNhY2hlZF9lbnVtc18uCisgIG11dGFibGUgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHN0cmluZ19zdG9yYWdlXzsKKworICBtdXRhYmxlIHN0ZDo6bWFwPFN0cmluZ1BpZWNlLCBTdGF0dXNPclR5cGU+IGNhY2hlZF90eXBlc187CisgIG11dGFibGUgc3RkOjptYXA8U3RyaW5nUGllY2UsIFN0YXR1c09yRW51bT4gY2FjaGVkX2VudW1zXzsKKworICBtdXRhYmxlIHN0ZDo6bWFwPGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqLCBDYW1lbENhc2VOYW1lVGFibGU+CisgICAgICBpbmRleGVkX3R5cGVzXzsKK307Cit9ICAvLyBuYW1lc3BhY2UKKworVHlwZUluZm8qIFR5cGVJbmZvOjpOZXdUeXBlSW5mbyhUeXBlUmVzb2x2ZXIqIHR5cGVfcmVzb2x2ZXIpIHsKKyAgcmV0dXJuIG5ldyBUeXBlSW5mb0ZvclR5cGVSZXNvbHZlcih0eXBlX3Jlc29sdmVyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnRlcgorfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mby5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1N2RmNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvLmgKQEAgLTAsMCArMSw5NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfVFlQRV9JTkZPX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9UWVBFX0lORk9fSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgY29udmVydGVyIHsKKy8vIEludGVybmFsIGhlbHBlciBjbGFzcyBmb3IgdHlwZSByZXNvbHZpbmcuIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIG5vdAorLy8gdGhyZWFkLXNhZmUgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIGluIG9uZSB0aHJlYWQuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgVHlwZUluZm8geworIHB1YmxpYzoKKyAgVHlwZUluZm8oKSB7fQorICB2aXJ0dWFsIH5UeXBlSW5mbygpIHt9CisKKyAgLy8gUmVzb2x2ZXMgYSB0eXBlIHVybCBpbnRvIGEgVHlwZS4gSWYgdGhlIHR5cGUgdXJsIGlzIGludmFsaWQsIHJldHVybnMKKyAgLy8gSU5WQUxJRF9BUkdVTUVOVCBlcnJvciBzdGF0dXMuIElmIHRoZSB0eXBlIHVybCBpcyB2YWxpZCBidXQgdGhlCisgIC8vIGNvcnJlc3BvbmRpbmcgdHlwZSBjYW5ub3QgYmUgZm91bmQsIHJldHVybnMgYSBOT1RfRk9VTkQgZXJyb3Igc3RhdHVzLgorICAvLworICAvLyBUaGlzIFR5cGVJbmZvIGNsYXNzIHJldGFpbnMgdGhlIG93bmVyc2hpcCBvZiB0aGUgcmV0dXJuZWQgcG9pbnRlci4KKyAgdmlydHVhbCB1dGlsOjpTdGF0dXNPcjxjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKj4gUmVzb2x2ZVR5cGVVcmwoCisgICAgICBTdHJpbmdQaWVjZSB0eXBlX3VybCkgY29uc3QgPSAwOworCisgIC8vIFJlc29sdmVzIGEgdHlwZSB1cmwgaW50byBhIFR5cGUuIExpa2UgUmVzb2x2ZVR5cGVVcmwoKSBidXQgcmV0dXJucworICAvLyBOVUxMIGlmIHRoZSB0eXBlIHVybCBpcyBpbnZhbGlkIG9yIHRoZSB0eXBlIGNhbm5vdCBiZSBmb3VuZC4KKyAgLy8KKyAgLy8gVGhpcyBUeXBlSW5mbyBjbGFzcyByZXRhaW5zIHRoZSBvd25lcnNoaXAgb2YgdGhlIHJldHVybmVkIHBvaW50ZXIuCisgIHZpcnR1YWwgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogR2V0VHlwZUJ5VHlwZVVybCgKKyAgICAgIFN0cmluZ1BpZWNlIHR5cGVfdXJsKSBjb25zdCA9IDA7CisKKyAgLy8gUmVzb2x2ZXMgYSB0eXBlIHVybCBmb3IgYW4gZW51bS4gUmV0dXJucyBOVUxMIGlmIHRoZSB0eXBlIHVybCBpcworICAvLyBpbnZhbGlkIG9yIHRoZSB0eXBlIGNhbm5vdCBiZSBmb3VuZC4KKyAgLy8KKyAgLy8gVGhpcyBUeXBlSW5mbyBjbGFzcyByZXRhaW5zIHRoZSBvd25lcnNoaXAgb2YgdGhlIHJldHVybmVkIHBvaW50ZXIuCisgIHZpcnR1YWwgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bSogR2V0RW51bUJ5VHlwZVVybCgKKyAgICAgIFN0cmluZ1BpZWNlIHR5cGVfdXJsKSBjb25zdCA9IDA7CisKKyAgLy8gTG9va3MgdXAgYSBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIHR5cGUgZ2l2ZW4gYSBDYW1lbENhc2UgbmFtZS4KKyAgdmlydHVhbCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogRmluZEZpZWxkKAorICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogdHlwZSwKKyAgICAgIFN0cmluZ1BpZWNlIGNhbWVsX2Nhc2VfbmFtZSkgY29uc3QgPSAwOworCisgIC8vIENyZWF0ZXMgYSBUeXBlSW5mbyBvYmplY3QgdGhhdCBsb29rcyB1cCB0eXBlIGluZm9ybWF0aW9uIGZyb20gYQorICAvLyBUeXBlUmVzb2x2ZXIuIENhbGxlciB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHJldHVybmVkIHBvaW50ZXIuCisgIHN0YXRpYyBUeXBlSW5mbyogTmV3VHlwZUluZm8oVHlwZVJlc29sdmVyKiB0eXBlX3Jlc29sdmVyKTsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUeXBlSW5mbyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY29udmVydGVyCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfVFlQRV9JTkZPX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mb190ZXN0X2hlbHBlci5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4ZjQxMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuY2MKQEAgLTAsMCArMSwxMzIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mby5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKKwordm9pZCBUeXBlSW5mb1Rlc3RIZWxwZXI6OlJlc2V0VHlwZUluZm8oCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+JiBkZXNjcmlwdG9ycykgeworICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgY2FzZSBVU0VfVFlQRV9SRVNPTFZFUjogeworICAgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wgPSBkZXNjcmlwdG9yc1swXS0+ZmlsZSgpLT5wb29sKCk7CisgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGRlc2NyaXB0b3JzLnNpemUoKTsgKytpKSB7CisgICAgICAgIEdPT0dMRV9DSEVDSyhwb29sID09IGRlc2NyaXB0b3JzW2ldLT5maWxlKCktPnBvb2woKSkKKyAgICAgICAgICAgIDw8ICJEZXNjcmlwdG9ycyBmcm9tIGRpZmZlcmVudCBwb29scyBhcmUgbm90IHN1cHBvcnRlZC4iOworICAgICAgfQorICAgICAgdHlwZV9yZXNvbHZlcl8ucmVzZXQoCisgICAgICAgICAgTmV3VHlwZVJlc29sdmVyRm9yRGVzY3JpcHRvclBvb2woa1R5cGVTZXJ2aWNlQmFzZVVybCwgcG9vbCkpOworICAgICAgdHlwZWluZm9fLnJlc2V0KFR5cGVJbmZvOjpOZXdUeXBlSW5mbyh0eXBlX3Jlc29sdmVyXy5nZXQoKSkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuIG5vdCByZWFjaCBoZXJlLiI7Cit9CisKK3ZvaWQgVHlwZUluZm9UZXN0SGVscGVyOjpSZXNldFR5cGVJbmZvKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+IGRlc2NyaXB0b3JzOworICBkZXNjcmlwdG9ycy5wdXNoX2JhY2soZGVzY3JpcHRvcik7CisgIFJlc2V0VHlwZUluZm8oZGVzY3JpcHRvcnMpOworfQorCit2b2lkIFR5cGVJbmZvVGVzdEhlbHBlcjo6UmVzZXRUeXBlSW5mbyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IyKSB7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IERlc2NyaXB0b3IqPiBkZXNjcmlwdG9yczsKKyAgZGVzY3JpcHRvcnMucHVzaF9iYWNrKGRlc2NyaXB0b3IxKTsKKyAgZGVzY3JpcHRvcnMucHVzaF9iYWNrKGRlc2NyaXB0b3IyKTsKKyAgUmVzZXRUeXBlSW5mbyhkZXNjcmlwdG9ycyk7Cit9CisKK1R5cGVJbmZvKiBUeXBlSW5mb1Rlc3RIZWxwZXI6OkdldFR5cGVJbmZvKCkgeyByZXR1cm4gdHlwZWluZm9fLmdldCgpOyB9CisKK1Byb3RvU3RyZWFtT2JqZWN0U291cmNlKiBUeXBlSW5mb1Rlc3RIZWxwZXI6Ok5ld1Byb3RvU291cmNlKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBjb2RlZF9pbnB1dCwgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfdXJsLAorICAgIFByb3RvU3RyZWFtT2JqZWN0U291cmNlOjpSZW5kZXJPcHRpb25zIHJlbmRlcl9vcHRpb25zKSB7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqIHR5cGUgPSB0eXBlaW5mb18tPkdldFR5cGVCeVR5cGVVcmwodHlwZV91cmwpOworICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgY2FzZSBVU0VfVFlQRV9SRVNPTFZFUjogeworICAgICAgcmV0dXJuIG5ldyBQcm90b1N0cmVhbU9iamVjdFNvdXJjZShjb2RlZF9pbnB1dCwgdHlwZV9yZXNvbHZlcl8uZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0eXBlLCByZW5kZXJfb3B0aW9ucyk7CisgICAgfQorICB9CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4gbm90IHJlYWNoIGhlcmUuIjsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK1Byb3RvU3RyZWFtT2JqZWN0V3JpdGVyKiBUeXBlSW5mb1Rlc3RIZWxwZXI6Ok5ld1Byb3RvV3JpdGVyKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlX3VybCwgc3RyaW5nczo6Qnl0ZVNpbmsqIG91dHB1dCwKKyAgICBFcnJvckxpc3RlbmVyKiBsaXN0ZW5lciwgY29uc3QgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6Ok9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogdHlwZSA9IHR5cGVpbmZvXy0+R2V0VHlwZUJ5VHlwZVVybCh0eXBlX3VybCk7CisgIHN3aXRjaCAodHlwZV8pIHsKKyAgICBjYXNlIFVTRV9UWVBFX1JFU09MVkVSOiB7CisgICAgICByZXR1cm4gbmV3IFByb3RvU3RyZWFtT2JqZWN0V3JpdGVyKHR5cGVfcmVzb2x2ZXJfLmdldCgpLCAqdHlwZSwgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lciwgb3B0aW9ucyk7CisgICAgfQorICB9CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4gbm90IHJlYWNoIGhlcmUuIjsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0RlZmF1bHRWYWx1ZU9iamVjdFdyaXRlciogVHlwZUluZm9UZXN0SGVscGVyOjpOZXdEZWZhdWx0VmFsdWVXcml0ZXIoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfdXJsLCBPYmplY3RXcml0ZXIqIHdyaXRlcikgeworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKiB0eXBlID0gdHlwZWluZm9fLT5HZXRUeXBlQnlUeXBlVXJsKHR5cGVfdXJsKTsKKyAgc3dpdGNoICh0eXBlXykgeworICAgIGNhc2UgVVNFX1RZUEVfUkVTT0xWRVI6IHsKKyAgICAgIHJldHVybiBuZXcgRGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyKHR5cGVfcmVzb2x2ZXJfLmdldCgpLCAqdHlwZSwgd3JpdGVyKTsKKyAgICB9CisgIH0KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbiBub3QgcmVhY2ggaGVyZS4iOworICByZXR1cm4gbnVsbHB0cjsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTEwYTM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mb190ZXN0X2hlbHBlci5oCkBAIC0wLDAgKzEsOTYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX1RZUEVfSU5GT19URVNUX0hFTFBFUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1VUSUxfSU5URVJOQUxfVFlQRV9JTkZPX1RFU1RfSEVMUEVSX0hfXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgY29udmVydGVyIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworZW51bSBUeXBlSW5mb1NvdXJjZSB7CisgIFVTRV9UWVBFX1JFU09MVkVSLAorfTsKKworLy8gSW4gdGhlIHVuaXQtdGVzdHMgd2Ugd2FudCB0byB0ZXN0IHR3byBzY2VuYXJpb3M6IG9uZSB3aXRoIHR5cGUgaW5mbyBmcm9tCisvLyBTZXJ2aWNlVHlwZUluZm8sIHRoZSBvdGhlciB3aXRoIHR5cGUgaW5mbyBmcm9tIFR5cGVSZXNvbHZlci4gVGhpcyBjbGFzcworLy8gd3JhcHMgdGhlIGRldGFpbCBvZiB3aGVyZSB0aGUgdHlwZSBpbmZvIGlzIGZyb20gYW5kIHByb3ZpZGVzIHRoZSBzYW1lCisvLyBpbnRlcmZhY2Ugc28gdGhlIHNhbWUgdW5pdC10ZXN0IGNvZGUgY2FuIHRlc3QgYm90aCBzY2VuYXJpb3MuCitjbGFzcyBUeXBlSW5mb1Rlc3RIZWxwZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVHlwZUluZm9UZXN0SGVscGVyKFR5cGVJbmZvU291cmNlIHR5cGUpIDogdHlwZV8odHlwZSkge30KKworICAvLyBDcmVhdGVzIGEgVHlwZUluZm8gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gc2V0IG9mIGRlc2NyaXB0b3JzLgorICB2b2lkIFJlc2V0VHlwZUluZm8oY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+JiBkZXNjcmlwdG9ycyk7CisKKyAgLy8gQ29udmVuaWVudCBvdmVybG9hZHMuCisgIHZvaWQgUmVzZXRUeXBlSW5mbyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgdm9pZCBSZXNldFR5cGVJbmZvKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IxLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcjIpOworCisgIC8vIFJldHVybnMgdGhlIFR5cGVJbmZvIGNyZWF0ZWQgYWZ0ZXIgUmVzZXRUeXBlSW5mby4KKyAgVHlwZUluZm8qIEdldFR5cGVJbmZvKCk7CisKKyAgUHJvdG9TdHJlYW1PYmplY3RTb3VyY2UqIE5ld1Byb3RvU291cmNlKAorICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGNvZGVkX2lucHV0LCBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV91cmwsCisgICAgICBQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6UmVuZGVyT3B0aW9ucyByZW5kZXJfb3B0aW9ucyA9IHt9KTsKKworICBQcm90b1N0cmVhbU9iamVjdFdyaXRlciogTmV3UHJvdG9Xcml0ZXIoCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV91cmwsIHN0cmluZ3M6OkJ5dGVTaW5rKiBvdXRwdXQsCisgICAgICBFcnJvckxpc3RlbmVyKiBsaXN0ZW5lciwgY29uc3QgUHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6Ok9wdGlvbnMmIG9wdGlvbnMpOworCisgIERlZmF1bHRWYWx1ZU9iamVjdFdyaXRlciogTmV3RGVmYXVsdFZhbHVlV3JpdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlX3VybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0V3JpdGVyKiB3cml0ZXIpOworCisgcHJpdmF0ZToKKyAgVHlwZUluZm9Tb3VyY2UgdHlwZV87CisgIHN0ZDo6dW5pcXVlX3B0cjxUeXBlSW5mbz4gdHlwZWluZm9fOworICBzdGQ6OnVuaXF1ZV9wdHI8VHlwZVJlc29sdmVyPiB0eXBlX3Jlc29sdmVyXzsKK307Cit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnRlcgorfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX1RZUEVfSU5GT19URVNUX0hFTFBFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3V0aWxpdHkuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4ZWUxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmNjCkBAIC0wLDAgKzEsNDE2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3V0aWxpdHkuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYWxsYmFjay5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXBfdXRpbC5oPgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKy8vIGNsYW5nLWZvcm1hdCBvbgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgY29udmVydGVyIHsKKworYm9vbCBHZXRCb29sT3B0aW9uT3JEZWZhdWx0KAorICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8Z29vZ2xlOjpwcm90b2J1Zjo6T3B0aW9uPiYgb3B0aW9ucywKKyAgICBTdHJpbmdQaWVjZSBvcHRpb25fbmFtZSwgYm9vbCBkZWZhdWx0X3ZhbHVlKSB7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok9wdGlvbiogb3B0ID0gRmluZE9wdGlvbk9yTnVsbChvcHRpb25zLCBvcHRpb25fbmFtZSk7CisgIGlmIChvcHQgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisgIHJldHVybiBHZXRCb29sRnJvbUFueShvcHQtPnZhbHVlKCkpOworfQorCitpbnQ2NF90IEdldEludDY0T3B0aW9uT3JEZWZhdWx0KAorICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8Z29vZ2xlOjpwcm90b2J1Zjo6T3B0aW9uPiYgb3B0aW9ucywKKyAgICBTdHJpbmdQaWVjZSBvcHRpb25fbmFtZSwgaW50NjRfdCBkZWZhdWx0X3ZhbHVlKSB7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok9wdGlvbiogb3B0ID0gRmluZE9wdGlvbk9yTnVsbChvcHRpb25zLCBvcHRpb25fbmFtZSk7CisgIGlmIChvcHQgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisgIHJldHVybiBHZXRJbnQ2NEZyb21Bbnkob3B0LT52YWx1ZSgpKTsKK30KKworZG91YmxlIEdldERvdWJsZU9wdGlvbk9yRGVmYXVsdCgKKyAgICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPGdvb2dsZTo6cHJvdG9idWY6Ok9wdGlvbj4mIG9wdGlvbnMsCisgICAgU3RyaW5nUGllY2Ugb3B0aW9uX25hbWUsIGRvdWJsZSBkZWZhdWx0X3ZhbHVlKSB7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok9wdGlvbiogb3B0ID0gRmluZE9wdGlvbk9yTnVsbChvcHRpb25zLCBvcHRpb25fbmFtZSk7CisgIGlmIChvcHQgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisgIHJldHVybiBHZXREb3VibGVGcm9tQW55KG9wdC0+dmFsdWUoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIEdldFN0cmluZ09wdGlvbk9yRGVmYXVsdCgKKyAgICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPGdvb2dsZTo6cHJvdG9idWY6Ok9wdGlvbj4mIG9wdGlvbnMsCisgICAgU3RyaW5nUGllY2Ugb3B0aW9uX25hbWUsIFN0cmluZ1BpZWNlIGRlZmF1bHRfdmFsdWUpIHsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6T3B0aW9uKiBvcHQgPSBGaW5kT3B0aW9uT3JOdWxsKG9wdGlvbnMsIG9wdGlvbl9uYW1lKTsKKyAgaWYgKG9wdCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKGRlZmF1bHRfdmFsdWUpOworICB9CisgIHJldHVybiBHZXRTdHJpbmdGcm9tQW55KG9wdC0+dmFsdWUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBQYXJzZUZyb21BbnkoY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEsIFQqIHJlc3VsdCkgeworICByZXN1bHQtPlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKK30KKworLy8gUmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgY29udGFpbmVkIGluIEFueSB0eXBlLgorLy8gVE9ETyhza2FydmFqZSk6IEFkZCB0eXBlIGNoZWNraW5nICYgZXJyb3IgbWVzc2FnZXMgaGVyZS4KK2Jvb2wgR2V0Qm9vbEZyb21BbnkoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6QW55JiBhbnkpIHsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6Qm9vbFZhbHVlIGI7CisgIFBhcnNlRnJvbUFueShhbnkudmFsdWUoKSwgJmIpOworICByZXR1cm4gYi52YWx1ZSgpOworfQorCitpbnQ2NF90IEdldEludDY0RnJvbUFueShjb25zdCBnb29nbGU6OnByb3RvYnVmOjpBbnkmIGFueSkgeworICBnb29nbGU6OnByb3RvYnVmOjpJbnQ2NFZhbHVlIGk7CisgIFBhcnNlRnJvbUFueShhbnkudmFsdWUoKSwgJmkpOworICByZXR1cm4gaS52YWx1ZSgpOworfQorCitkb3VibGUgR2V0RG91YmxlRnJvbUFueShjb25zdCBnb29nbGU6OnByb3RvYnVmOjpBbnkmIGFueSkgeworICBnb29nbGU6OnByb3RvYnVmOjpEb3VibGVWYWx1ZSBpOworICBQYXJzZUZyb21BbnkoYW55LnZhbHVlKCksICZpKTsKKyAgcmV0dXJuIGkudmFsdWUoKTsKK30KKworc3RkOjpzdHJpbmcgR2V0U3RyaW5nRnJvbUFueShjb25zdCBnb29nbGU6OnByb3RvYnVmOjpBbnkmIGFueSkgeworICBnb29nbGU6OnByb3RvYnVmOjpTdHJpbmdWYWx1ZSBzOworICBQYXJzZUZyb21BbnkoYW55LnZhbHVlKCksICZzKTsKKyAgcmV0dXJuIHMudmFsdWUoKTsKK30KKworY29uc3QgU3RyaW5nUGllY2UgR2V0VHlwZVdpdGhvdXRVcmwoU3RyaW5nUGllY2UgdHlwZV91cmwpIHsKKyAgaWYgKHR5cGVfdXJsLnNpemUoKSA+IGtUeXBlVXJsU2l6ZSAmJiB0eXBlX3VybFtrVHlwZVVybFNpemVdID09ICcvJykgeworICAgIHJldHVybiB0eXBlX3VybC5zdWJzdHIoa1R5cGVVcmxTaXplICsgMSk7CisgIH0gZWxzZSB7CisgICAgc2l6ZV90IGlkeCA9IHR5cGVfdXJsLnJmaW5kKCcvJyk7CisgICAgaWYgKGlkeCAhPSB0eXBlX3VybC5ucG9zKSB7CisgICAgICB0eXBlX3VybC5yZW1vdmVfcHJlZml4KGlkeCArIDEpOworICAgIH0KKyAgICByZXR1cm4gdHlwZV91cmw7CisgIH0KK30KKworY29uc3Qgc3RkOjpzdHJpbmcgR2V0RnVsbFR5cGVXaXRoVXJsKFN0cmluZ1BpZWNlIHNpbXBsZV90eXBlKSB7CisgIHJldHVybiBTdHJDYXQoa1R5cGVTZXJ2aWNlQmFzZVVybCwgIi8iLCBzaW1wbGVfdHlwZSk7Cit9CisKK2NvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok9wdGlvbiogRmluZE9wdGlvbk9yTnVsbCgKKyAgICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPGdvb2dsZTo6cHJvdG9idWY6Ok9wdGlvbj4mIG9wdGlvbnMsCisgICAgU3RyaW5nUGllY2Ugb3B0aW9uX25hbWUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLnNpemUoKTsgKytpKSB7CisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6T3B0aW9uJiBvcHQgPSBvcHRpb25zLkdldChpKTsKKyAgICBpZiAob3B0Lm5hbWUoKSA9PSBvcHRpb25fbmFtZSkgeworICAgICAgcmV0dXJuICZvcHQ7CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCitjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogRmluZEZpZWxkSW5UeXBlT3JOdWxsKAorICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqIHR5cGUsIFN0cmluZ1BpZWNlIGZpZWxkX25hbWUpIHsKKyAgaWYgKHR5cGUgIT0gbnVsbHB0cikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS0+ZmllbGRzX3NpemUoKTsgKytpKSB7CisgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCYgZmllbGQgPSB0eXBlLT5maWVsZHMoaSk7CisgICAgICBpZiAoZmllbGQubmFtZSgpID09IGZpZWxkX25hbWUpIHsKKyAgICAgICAgcmV0dXJuICZmaWVsZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBGaW5kSnNvbkZpZWxkSW5UeXBlT3JOdWxsKAorICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUqIHR5cGUsIFN0cmluZ1BpZWNlIGpzb25fbmFtZSkgeworICBpZiAodHlwZSAhPSBudWxscHRyKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLT5maWVsZHNfc2l6ZSgpOyArK2kpIHsKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCA9IHR5cGUtPmZpZWxkcyhpKTsKKyAgICAgIGlmIChmaWVsZC5qc29uX25hbWUoKSA9PSBqc29uX25hbWUpIHsKKyAgICAgICAgcmV0dXJuICZmaWVsZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBGaW5kRmllbGRJblR5cGVCeU51bWJlck9yTnVsbCgKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlKiB0eXBlLCBpbnQzMl90IG51bWJlcikgeworICBpZiAodHlwZSAhPSBudWxscHRyKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLT5maWVsZHNfc2l6ZSgpOyArK2kpIHsKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCA9IHR5cGUtPmZpZWxkcyhpKTsKKyAgICAgIGlmIChmaWVsZC5udW1iZXIoKSA9PSBudW1iZXIpIHsKKyAgICAgICAgcmV0dXJuICZmaWVsZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZSogRmluZEVudW1WYWx1ZUJ5TmFtZU9yTnVsbCgKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpFbnVtKiBlbnVtX3R5cGUsIFN0cmluZ1BpZWNlIGVudW1fbmFtZSkgeworICBpZiAoZW51bV90eXBlICE9IG51bGxwdHIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fdHlwZS0+ZW51bXZhbHVlX3NpemUoKTsgKytpKSB7CisgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWUmIGVudW1fdmFsdWUgPSBlbnVtX3R5cGUtPmVudW12YWx1ZShpKTsKKyAgICAgIGlmIChlbnVtX3ZhbHVlLm5hbWUoKSA9PSBlbnVtX25hbWUpIHsKKyAgICAgICAgcmV0dXJuICZlbnVtX3ZhbHVlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKworY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlKiBGaW5kRW51bVZhbHVlQnlOdW1iZXJPck51bGwoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bSogZW51bV90eXBlLCBpbnQzMl90IHZhbHVlKSB7CisgIGlmIChlbnVtX3R5cGUgIT0gbnVsbHB0cikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV90eXBlLT5lbnVtdmFsdWVfc2l6ZSgpOyArK2kpIHsKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZSYgZW51bV92YWx1ZSA9IGVudW1fdHlwZS0+ZW51bXZhbHVlKGkpOworICAgICAgaWYgKGVudW1fdmFsdWUubnVtYmVyKCkgPT0gdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICZlbnVtX3ZhbHVlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKworY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlKiBGaW5kRW51bVZhbHVlQnlOYW1lV2l0aG91dFVuZGVyc2NvcmVPck51bGwoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bSogZW51bV90eXBlLCBTdHJpbmdQaWVjZSBlbnVtX25hbWUpIHsKKyAgaWYgKGVudW1fdHlwZSAhPSBudWxscHRyKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtX3R5cGUtPmVudW12YWx1ZV9zaXplKCk7ICsraSkgeworICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlJiBlbnVtX3ZhbHVlID0gZW51bV90eXBlLT5lbnVtdmFsdWUoaSk7CisgICAgICBzdGQ6OnN0cmluZyBlbnVtX25hbWVfd2l0aG91dF91bmRlcnNjb3JlID0gZW51bV92YWx1ZS5uYW1lKCk7CisKKyAgICAgIC8vIFJlbW92ZSB1bmRlcnNjb3JlIGZyb20gdGhlIG5hbWUuCisgICAgICBlbnVtX25hbWVfd2l0aG91dF91bmRlcnNjb3JlLmVyYXNlKAorICAgICAgICAgIHN0ZDo6cmVtb3ZlKGVudW1fbmFtZV93aXRob3V0X3VuZGVyc2NvcmUuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICBlbnVtX25hbWVfd2l0aG91dF91bmRlcnNjb3JlLmVuZCgpLCAnXycpLAorICAgICAgICAgIGVudW1fbmFtZV93aXRob3V0X3VuZGVyc2NvcmUuZW5kKCkpOworICAgICAgLy8gTWFrZSB0aGUgbmFtZSB1cHBlcmNhc2UuCisgICAgICBmb3IgKHN0ZDo6c3RyaW5nOjppdGVyYXRvciBpdCA9IGVudW1fbmFtZV93aXRob3V0X3VuZGVyc2NvcmUuYmVnaW4oKTsKKyAgICAgICAgICAgaXQgIT0gZW51bV9uYW1lX3dpdGhvdXRfdW5kZXJzY29yZS5lbmQoKTsgKytpdCkgeworICAgICAgICAqaXQgPSBhc2NpaV90b3VwcGVyKCppdCk7CisgICAgICB9CisKKyAgICAgIGlmIChlbnVtX25hbWVfd2l0aG91dF91bmRlcnNjb3JlID09IGVudW1fbmFtZSkgeworICAgICAgICByZXR1cm4gJmVudW1fdmFsdWU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCitzdGQ6OnN0cmluZyBFbnVtVmFsdWVOYW1lVG9Mb3dlckNhbWVsQ2FzZShTdHJpbmdQaWVjZSBpbnB1dCkgeworICBzdGQ6OnN0cmluZyBpbnB1dF9zdHJpbmcoaW5wdXQpOworICBzdGQ6OnRyYW5zZm9ybShpbnB1dF9zdHJpbmcuYmVnaW4oKSwgaW5wdXRfc3RyaW5nLmVuZCgpLCBpbnB1dF9zdHJpbmcuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgOjp0b2xvd2VyKTsKKyAgcmV0dXJuIFRvQ2FtZWxDYXNlKGlucHV0X3N0cmluZyk7Cit9CisKK3N0ZDo6c3RyaW5nIFRvQ2FtZWxDYXNlKFN0cmluZ1BpZWNlIGlucHV0KSB7CisgIGJvb2wgY2FwaXRhbGl6ZV9uZXh0ID0gZmFsc2U7CisgIGJvb2wgd2FzX2NhcCA9IHRydWU7CisgIGJvb2wgaXNfY2FwID0gZmFsc2U7CisgIGJvb2wgZmlyc3Rfd29yZCA9IHRydWU7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2VydmUoaW5wdXQuc2l6ZSgpKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgKytpLCB3YXNfY2FwID0gaXNfY2FwKSB7CisgICAgaXNfY2FwID0gYXNjaWlfaXN1cHBlcihpbnB1dFtpXSk7CisgICAgaWYgKGlucHV0W2ldID09ICdfJykgeworICAgICAgY2FwaXRhbGl6ZV9uZXh0ID0gdHJ1ZTsKKyAgICAgIGlmICghcmVzdWx0LmVtcHR5KCkpIGZpcnN0X3dvcmQgPSBmYWxzZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSBpZiAoZmlyc3Rfd29yZCkgeworICAgICAgLy8gQ29uc2lkZXIgd2hlbiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgQiBpcyBjYXBpdGFsaXplZCwKKyAgICAgIC8vIGZpcnN0IHdvcmQgZW5kcyB3aGVuOgorICAgICAgLy8gMSkgZm9sbG93aW5nIGEgbG93ZXJjYXNlOiAgICIuLi5hQi4uLiIKKyAgICAgIC8vIDIpIGZvbGxvd2VkIGJ5IGEgbG93ZXJjYXNlOiAiLi4uQUJjLi4uIgorICAgICAgaWYgKCFyZXN1bHQuZW1wdHkoKSAmJiBpc19jYXAgJiYKKyAgICAgICAgICAoIXdhc19jYXAgfHwKKyAgICAgICAgICAgKGkgKyAxIDwgaW5wdXQuc2l6ZSgpICYmIGFzY2lpX2lzbG93ZXIoaW5wdXRbaSArIDFdKSkpKSB7CisgICAgICAgIGZpcnN0X3dvcmQgPSBmYWxzZTsKKyAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhpbnB1dFtpXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQucHVzaF9iYWNrKGFzY2lpX3RvbG93ZXIoaW5wdXRbaV0pKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjYXBpdGFsaXplX25leHQpIHsKKyAgICAgIGNhcGl0YWxpemVfbmV4dCA9IGZhbHNlOworICAgICAgaWYgKGFzY2lpX2lzbG93ZXIoaW5wdXRbaV0pKSB7CisgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soYXNjaWlfdG91cHBlcihpbnB1dFtpXSkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soaW5wdXRbaV0pOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0LnB1c2hfYmFjayhhc2NpaV90b2xvd2VyKGlucHV0W2ldKSk7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0ZDo6c3RyaW5nIFRvU25ha2VDYXNlKFN0cmluZ1BpZWNlIGlucHV0KSB7CisgIGJvb2wgd2FzX25vdF91bmRlcnNjb3JlID0gZmFsc2U7ICAvLyBJbml0aWFsaXplIHRvIGZhbHNlIGZvciBjYXNlIDEgKGJlbG93KQorICBib29sIHdhc19ub3RfY2FwID0gZmFsc2U7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2VydmUoaW5wdXQuc2l6ZSgpIDw8IDEpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoYXNjaWlfaXN1cHBlcihpbnB1dFtpXSkpIHsKKyAgICAgIC8vIENvbnNpZGVyIHdoZW4gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIEIgaXMgY2FwaXRhbGl6ZWQ6CisgICAgICAvLyAxKSBBdCBiZWdpbm5pbmcgb2YgaW5wdXQ6ICAgIkIuLi4iID0+ICJiLi4uIgorICAgICAgLy8gICAgKGUuZy4gIkJpc2N1aXQiID0+ICJiaXNjdWl0IikKKyAgICAgIC8vIDIpIEZvbGxvd2luZyBhIGxvd2VyY2FzZTogICAiLi4uYUIuLi4iID0+ICIuLi5hX2IuLi4iCisgICAgICAvLyAgICAoZS5nLiAiZ0Jpa2UiID0+ICJnX2Jpa2UiKQorICAgICAgLy8gMykgQXQgdGhlIGVuZCBvZiBpbnB1dDogICAgICIuLi5BQiIgPT4gIi4uLmFiIgorICAgICAgLy8gICAgKGUuZy4gIkdvb2dsZUxBQiIgPT4gImdvb2dsZV9sYWIiKQorICAgICAgLy8gNCkgRm9sbG93ZWQgYnkgYSBsb3dlcmNhc2U6ICIuLi5BQmMuLi4iID0+ICIuLi5hX2JjLi4uIgorICAgICAgLy8gICAgKGUuZy4gIkdCaWtlIiA9PiAiZ19iaWtlIikKKyAgICAgIGlmICh3YXNfbm90X3VuZGVyc2NvcmUgJiYgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGNhc2UgMSBvdXQKKyAgICAgICAgICAod2FzX25vdF9jYXAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDIgaW4sIGNhc2UgMyBvdXQKKyAgICAgICAgICAgKGkgKyAxIDwgaW5wdXQuc2l6ZSgpICYmICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGNhc2UgMyBvdXQKKyAgICAgICAgICAgIGFzY2lpX2lzbG93ZXIoaW5wdXRbaSArIDFdKSkpKSB7ICAvLyBjYXNlIDQgaW4KKyAgICAgICAgLy8gV2UgYWRkIGFuIHVuZGVyc2NvcmUgZm9yIGNhc2UgMiBhbmQgY2FzZSA0LgorICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdfJyk7CisgICAgICB9CisgICAgICByZXN1bHQucHVzaF9iYWNrKGFzY2lpX3RvbG93ZXIoaW5wdXRbaV0pKTsKKyAgICAgIHdhc19ub3RfdW5kZXJzY29yZSA9IHRydWU7CisgICAgICB3YXNfbm90X2NhcCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQucHVzaF9iYWNrKGlucHV0W2ldKTsKKyAgICAgIHdhc19ub3RfdW5kZXJzY29yZSA9IGlucHV0W2ldICE9ICdfJzsKKyAgICAgIHdhc19ub3RfY2FwID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiB3ZWxsX2tub3duX3R5cGVzXyA9IG51bGxwdHI7CitQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpvbmNlX2ZsYWcgd2VsbF9rbm93bl90eXBlc19pbml0XzsKK2NvbnN0IGNoYXIqIHdlbGxfa25vd25fdHlwZXNfbmFtZV9hcnJheV9bXSA9IHsKKyAgICAiZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCIsICAgImdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiIsCisgICAgImdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSIsICJnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZSIsCisgICAgImdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlIiwgICJnb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUiLAorICAgICJnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSIsICAiZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlIiwKKyAgICAiZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZSIsICAgImdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZSIsCisgICAgImdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlIiwgICJnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIn07CisKK3ZvaWQgRGVsZXRlV2VsbEtub3duVHlwZXMoKSB7IGRlbGV0ZSB3ZWxsX2tub3duX3R5cGVzXzsgfQorCit2b2lkIEluaXRXZWxsS25vd25UeXBlcygpIHsKKyAgd2VsbF9rbm93bl90eXBlc18gPSBuZXcgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+OworICBmb3IgKGludCBpID0gMDsgaSA8IEdPT0dMRV9BUlJBWVNJWkUod2VsbF9rbm93bl90eXBlc19uYW1lX2FycmF5Xyk7ICsraSkgeworICAgIHdlbGxfa25vd25fdHlwZXNfLT5pbnNlcnQod2VsbF9rbm93bl90eXBlc19uYW1lX2FycmF5X1tpXSk7CisgIH0KKyAgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok9uU2h1dGRvd24oJkRlbGV0ZVdlbGxLbm93blR5cGVzKTsKK30KKworYm9vbCBJc1dlbGxLbm93blR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfbmFtZSkgeworICBQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpjYWxsX29uY2Uod2VsbF9rbm93bl90eXBlc19pbml0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRXZWxsS25vd25UeXBlcyk7CisgIHJldHVybiBDb250YWluc0tleSgqd2VsbF9rbm93bl90eXBlc18sIHR5cGVfbmFtZSk7Cit9CisKK2Jvb2wgSXNWYWxpZEJvb2xTdHJpbmcoU3RyaW5nUGllY2UgYm9vbF9zdHJpbmcpIHsKKyAgcmV0dXJuIGJvb2xfc3RyaW5nID09ICJ0cnVlIiB8fCBib29sX3N0cmluZyA9PSAiZmFsc2UiIHx8CisgICAgICAgICBib29sX3N0cmluZyA9PSAiMSIgfHwgYm9vbF9zdHJpbmcgPT0gIjAiOworfQorCitib29sIElzTWFwKGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkJiBmaWVsZCwKKyAgICAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSkgeworICByZXR1cm4gZmllbGQuY2FyZGluYWxpdHkoKSA9PSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDo6Q0FSRElOQUxJVFlfUkVQRUFURUQgJiYKKyAgICAgICAgIChHZXRCb29sT3B0aW9uT3JEZWZhdWx0KHR5cGUub3B0aW9ucygpLCAibWFwX2VudHJ5IiwgZmFsc2UpIHx8CisgICAgICAgICAgR2V0Qm9vbE9wdGlvbk9yRGVmYXVsdCh0eXBlLm9wdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubWFwX2VudHJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7Cit9CisKK2Jvb2wgSXNNZXNzYWdlU2V0V2lyZUZvcm1hdChjb25zdCBnb29nbGU6OnByb3RvYnVmOjpUeXBlJiB0eXBlKSB7CisgIHJldHVybiBHZXRCb29sT3B0aW9uT3JEZWZhdWx0KHR5cGUub3B0aW9ucygpLCAibWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkgfHwKKyAgICAgICAgIEdldEJvb2xPcHRpb25PckRlZmF1bHQoCisgICAgICAgICAgICAgdHlwZS5vcHRpb25zKCksCisgICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCIsIGZhbHNlKTsKK30KKworc3RkOjpzdHJpbmcgRG91YmxlQXNTdHJpbmcoZG91YmxlIHZhbHVlKSB7CisgIGlmICh2YWx1ZSA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHJldHVybiAiSW5maW5pdHkiOworICBpZiAodmFsdWUgPT0gLXN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgcmV0dXJuICItSW5maW5pdHkiOworICBpZiAoc3RkOjppc25hbih2YWx1ZSkpIHJldHVybiAiTmFOIjsKKworICByZXR1cm4gU2ltcGxlRHRvYSh2YWx1ZSk7Cit9CisKK3N0ZDo6c3RyaW5nIEZsb2F0QXNTdHJpbmcoZmxvYXQgdmFsdWUpIHsKKyAgaWYgKHN0ZDo6aXNmaW5pdGUodmFsdWUpKSByZXR1cm4gU2ltcGxlRnRvYSh2YWx1ZSk7CisgIHJldHVybiBEb3VibGVBc1N0cmluZyh2YWx1ZSk7Cit9CisKK2Jvb2wgU2FmZVN0clRvRmxvYXQoU3RyaW5nUGllY2Ugc3RyLCBmbG9hdCogdmFsdWUpIHsKKyAgZG91YmxlIGRvdWJsZV92YWx1ZTsKKyAgaWYgKCFzYWZlX3N0cnRvZChzdHIsICZkb3VibGVfdmFsdWUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKHN0ZDo6aXNpbmYoZG91YmxlX3ZhbHVlKSB8fCBzdGQ6OmlzbmFuKGRvdWJsZV92YWx1ZSkpIHJldHVybiBmYWxzZTsKKworICAvLyBGYWlsIGlmIHRoZSB2YWx1ZSBpcyBub3QgcmVwcmVzZW50YWJsZSBpbiBmbG9hdC4KKyAgaWYgKGRvdWJsZV92YWx1ZSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjptYXgoKSB8fAorICAgICAgZG91YmxlX3ZhbHVlIDwgLXN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjptYXgoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICp2YWx1ZSA9IHN0YXRpY19jYXN0PGZsb2F0Pihkb3VibGVfdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnRlcgorfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3V0aWxpdHkuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkNjc3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmgKQEAgLTAsMCArMSwyMDQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX1VUSUxJVFlfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VVElMX0lOVEVSTkFMX1VUSUxJVFlfSF9fCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hbnkucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdHlwZS5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgorCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGNvbnZlcnRlciB7CisKKy8vIFNpemUgb2YgInR5cGUuZ29vZ2xlYXBpcy5jb20iCitzdGF0aWMgY29uc3QgaW50NjRfdCBrVHlwZVVybFNpemUgPSAxOTsKKworLy8gRmluZHMgdGhlIHRlY2ggb3B0aW9uIGlkZW50aWZpZWQgYnkgb3B0aW9uX25hbWUuIFBhcnNlcyB0aGUgYm9vbGVhbiB2YWx1ZSBhbmQKKy8vIHJldHVybnMgaXQuCisvLyBXaGVuIHRoZSBvcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpcyBub3QgZm91bmQsIGRlZmF1bHRfdmFsdWUgaXMgcmV0dXJuZWQuCitQUk9UT0JVRl9FWFBPUlQgYm9vbCBHZXRCb29sT3B0aW9uT3JEZWZhdWx0KAorICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8Z29vZ2xlOjpwcm90b2J1Zjo6T3B0aW9uPiYgb3B0aW9ucywKKyAgICBTdHJpbmdQaWVjZSBvcHRpb25fbmFtZSwgYm9vbCBkZWZhdWx0X3ZhbHVlKTsKKworLy8gUmV0dXJucyBpbnQ2NCBvcHRpb24gdmFsdWUuIElmIHRoZSBvcHRpb24gaXNuJ3QgZm91bmQsIHJldHVybnMgdGhlCisvLyBkZWZhdWx0X3ZhbHVlLgorUFJPVE9CVUZfRVhQT1JUIGludDY0X3QgR2V0SW50NjRPcHRpb25PckRlZmF1bHQoCisgICAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxnb29nbGU6OnByb3RvYnVmOjpPcHRpb24+JiBvcHRpb25zLAorICAgIFN0cmluZ1BpZWNlIG9wdGlvbl9uYW1lLCBpbnQ2NF90IGRlZmF1bHRfdmFsdWUpOworCisvLyBSZXR1cm5zIGRvdWJsZSBvcHRpb24gdmFsdWUuIElmIHRoZSBvcHRpb24gaXNuJ3QgZm91bmQsIHJldHVybnMgdGhlCisvLyBkZWZhdWx0X3ZhbHVlLgorUFJPVE9CVUZfRVhQT1JUIGRvdWJsZSBHZXREb3VibGVPcHRpb25PckRlZmF1bHQoCisgICAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxnb29nbGU6OnByb3RvYnVmOjpPcHRpb24+JiBvcHRpb25zLAorICAgIFN0cmluZ1BpZWNlIG9wdGlvbl9uYW1lLCBkb3VibGUgZGVmYXVsdF92YWx1ZSk7CisKKy8vIFJldHVybnMgc3RyaW5nIG9wdGlvbiB2YWx1ZS4gSWYgdGhlIG9wdGlvbiBpc24ndCBmb3VuZCwgcmV0dXJucyB0aGUKKy8vIGRlZmF1bHRfdmFsdWUuCitQUk9UT0JVRl9FWFBPUlQgc3RkOjpzdHJpbmcgR2V0U3RyaW5nT3B0aW9uT3JEZWZhdWx0KAorICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8Z29vZ2xlOjpwcm90b2J1Zjo6T3B0aW9uPiYgb3B0aW9ucywKKyAgICBTdHJpbmdQaWVjZSBvcHRpb25fbmFtZSwgU3RyaW5nUGllY2UgZGVmYXVsdF92YWx1ZSk7CisKKy8vIFJldHVybnMgYSBib29sZWFuIHZhbHVlIGNvbnRhaW5lZCBpbiBBbnkgdHlwZS4KKy8vIFRPRE8oc2thcnZhamUpOiBNYWtlIHRoZXNlIHV0aWxpdGllcyBkZWFsaW5nIHdpdGggQW55IHR5cGVzIG1vcmUgZ2VuZXJpYywKKy8vIGFkZCBtb3JlIGVycm9yIGNoZWNraW5nIGFuZCBtb3ZlIHRvIGEgbW9yZSBwdWJsaWMvc2hhcmVhYmxlIGxvY2F0aW9uIHNvCisvLyBvdGhlcnMgY2FuIHVzZS4KK1BST1RPQlVGX0VYUE9SVCBib29sIEdldEJvb2xGcm9tQW55KGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkFueSYgYW55KTsKKworLy8gUmV0dXJucyBpbnQ2NCB2YWx1ZSBjb250YWluZWQgaW4gQW55IHR5cGUuCitQUk9UT0JVRl9FWFBPUlQgaW50NjRfdCBHZXRJbnQ2NEZyb21BbnkoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6QW55JiBhbnkpOworCisvLyBSZXR1cm5zIGRvdWJsZSB2YWx1ZSBjb250YWluZWQgaW4gQW55IHR5cGUuCitQUk9UT0JVRl9FWFBPUlQgZG91YmxlIEdldERvdWJsZUZyb21BbnkoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6QW55JiBhbnkpOworCisvLyBSZXR1cm5zIHN0cmluZyB2YWx1ZSBjb250YWluZWQgaW4gQW55IHR5cGUuCitQUk9UT0JVRl9FWFBPUlQgc3RkOjpzdHJpbmcgR2V0U3RyaW5nRnJvbUFueShjb25zdCBnb29nbGU6OnByb3RvYnVmOjpBbnkmIGFueSk7CisKKy8vIFJldHVybnMgdGhlIHR5cGUgc3RyaW5nIHdpdGhvdXQgdGhlIHVybCBwcmVmaXguIGUuZy46IElmIHRoZSBwYXNzZWQgdHlwZSBpcworLy8gJ3R5cGUuZ29vZ2xlYXBpcy5jb20vdGVjaC50eXBlLkJvb2wnLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgJ3RlY2gudHlwZS5Cb29sJy4KK1BST1RPQlVGX0VYUE9SVCBjb25zdCBTdHJpbmdQaWVjZSBHZXRUeXBlV2l0aG91dFVybCgKKyAgICBTdHJpbmdQaWVjZSB0eXBlX3VybCk7CisKKy8vIFJldHVybnMgdGhlIHNpbXBsZV90eXBlIHdpdGggdGhlIGJhc2UgdHlwZSB1cmwgKGtUeXBlU2VydmljZUJhc2VVcmwpCisvLyBwcmVmaXhlZC4KKy8vCisvLyBFLmc6CisvLyBHZXRGdWxsVHlwZVdpdGhVcmwoImdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiKSByZXR1cm5zIHRoZSBzdHJpbmcKKy8vICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiLgorUFJPVE9CVUZfRVhQT1JUIGNvbnN0IHN0ZDo6c3RyaW5nIEdldEZ1bGxUeXBlV2l0aFVybCgKKyAgICBTdHJpbmdQaWVjZSBzaW1wbGVfdHlwZSk7CisKKy8vIEZpbmRzIGFuZCByZXR1cm5zIG9wdGlvbiBpZGVudGlmaWVkIGJ5IG5hbWUgYW5kIG9wdGlvbl9uYW1lIHdpdGhpbiB0aGUKKy8vIHByb3ZpZGVkIG1hcC4gUmV0dXJucyBudWxscHRyIGlmIG5vbmUgZm91bmQuCitjb25zdCBnb29nbGU6OnByb3RvYnVmOjpPcHRpb24qIEZpbmRPcHRpb25Pck51bGwoCisgICAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxnb29nbGU6OnByb3RvYnVmOjpPcHRpb24+JiBvcHRpb25zLAorICAgIFN0cmluZ1BpZWNlIG9wdGlvbl9uYW1lKTsKKworLy8gRmluZHMgYW5kIHJldHVybnMgdGhlIGZpZWxkIGlkZW50aWZpZWQgYnkgZmllbGRfbmFtZSBpbiB0aGUgcGFzc2VkIHRlY2ggVHlwZQorLy8gb2JqZWN0LiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBmb3VuZC4KK2NvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkKiBGaW5kRmllbGRJblR5cGVPck51bGwoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogdHlwZSwgU3RyaW5nUGllY2UgZmllbGRfbmFtZSk7CisKKy8vIFNpbWlsYXIgdG8gRmluZEZpZWxkSW5UeXBlT3JOdWxsLCBidXQgdGhpcyBsb29rcyB1cCBmaWVsZHMgd2l0aCBnaXZlbgorLy8ganNvbl9uYW1lLgorY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQqIEZpbmRKc29uRmllbGRJblR5cGVPck51bGwoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogdHlwZSwgU3RyaW5nUGllY2UganNvbl9uYW1lKTsKKworLy8gU2ltaWxhciB0byBGaW5kRmllbGRJblR5cGVPck51bGwsIGJ1dCB0aGlzIGxvb2tzIHVwIGZpZWxkcyBieSBudW1iZXIuCitjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZCogRmluZEZpZWxkSW5UeXBlQnlOdW1iZXJPck51bGwoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogdHlwZSwgaW50MzJfdCBudW1iZXIpOworCisvLyBGaW5kcyBhbmQgcmV0dXJucyB0aGUgRW51bVZhbHVlIGlkZW50aWZpZWQgYnkgZW51bV9uYW1lIGluIHRoZSBwYXNzZWQgdGVjaAorLy8gRW51bSBvYmplY3QuIFJldHVybnMgbnVsbHB0ciBpZiBub25lIGZvdW5kLgorY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlKiBGaW5kRW51bVZhbHVlQnlOYW1lT3JOdWxsKAorICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVudW0qIGVudW1fdHlwZSwgU3RyaW5nUGllY2UgZW51bV9uYW1lKTsKKworLy8gRmluZHMgYW5kIHJldHVybnMgdGhlIEVudW1WYWx1ZSBpZGVudGlmaWVkIGJ5IHZhbHVlIGluIHRoZSBwYXNzZWQgdGVjaAorLy8gRW51bSBvYmplY3QuIFJldHVybnMgbnVsbHB0ciBpZiBub25lIGZvdW5kLgorY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlKiBGaW5kRW51bVZhbHVlQnlOdW1iZXJPck51bGwoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bSogZW51bV90eXBlLCBpbnQzMl90IHZhbHVlKTsKKworLy8gRmluZHMgYW5kIHJldHVybnMgdGhlIEVudW1WYWx1ZSBpZGVudGlmaWVkIGJ5IGVudW1fbmFtZSB3aXRob3V0IHVuZGVyc2NvcmUgaW4KKy8vIHRoZSBwYXNzZWQgdGVjaCBFbnVtIG9iamVjdC4gUmV0dXJucyBudWxscHRyIGlmIG5vbmUgZm91bmQuCisvLyBGb3IgRXguIGlmIGVudW1fbmFtZSBpcyBBQ1RJT05BTkRBRFZFTlRVUkUgaXQgY2FuIGdldCBhY2NlcHRlZCBpZgorLy8gRW51bVZhbHVlJ3MgbmFtZSBpcyBhY3Rpb25fYW5kX2FkdmVudHVyZSBvciBBQ1RJT05fQU5EX0FEVkVOVFVSRS4KK2NvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZSogRmluZEVudW1WYWx1ZUJ5TmFtZVdpdGhvdXRVbmRlcnNjb3JlT3JOdWxsKAorICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVudW0qIGVudW1fdHlwZSwgU3RyaW5nUGllY2UgZW51bV9uYW1lKTsKKworLy8gQ29udmVydHMgaW5wdXQgdG8gY2FtZWwtY2FzZSBhbmQgcmV0dXJucyBpdC4KK1BST1RPQlVGX0VYUE9SVCBzdGQ6OnN0cmluZyBUb0NhbWVsQ2FzZShjb25zdCBTdHJpbmdQaWVjZSBpbnB1dCk7CisKKy8vIENvbnZlcnRzIGVudW0gbmFtZSBzdHJpbmcgdG8gY2FtZWwtY2FzZSBhbmQgcmV0dXJucyBpdC4KK3N0ZDo6c3RyaW5nIEVudW1WYWx1ZU5hbWVUb0xvd2VyQ2FtZWxDYXNlKGNvbnN0IFN0cmluZ1BpZWNlIGlucHV0KTsKKworLy8gQ29udmVydHMgaW5wdXQgdG8gc25ha2VfY2FzZSBhbmQgcmV0dXJucyBpdC4KK1BST1RPQlVGX0VYUE9SVCBzdGQ6OnN0cmluZyBUb1NuYWtlQ2FzZShTdHJpbmdQaWVjZSBpbnB1dCk7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0eXBlX25hbWUgcmVwcmVzZW50cyBhIHdlbGwta25vd24gdHlwZS4KK1BST1RPQlVGX0VYUE9SVCBib29sIElzV2VsbEtub3duVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV9uYW1lKTsKKworLy8gUmV0dXJucyB0cnVlIGlmICdib29sX3N0cmluZycgcmVwcmVzZW50cyBhIHZhbGlkIGJvb2xlYW4gdmFsdWUuIE9ubHkgInRydWUiLAorLy8gImZhbHNlIiwgIjAiIGFuZCAiMSIgYXJlIGFsbG93ZWQuCitQUk9UT0JVRl9FWFBPUlQgYm9vbCBJc1ZhbGlkQm9vbFN0cmluZyhTdHJpbmdQaWVjZSBib29sX3N0cmluZyk7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiAiZmllbGQiIGlzIGEgcHJvdG9idWYgbWFwIGZpZWxkIGJhc2VkIG9uIGl0cyB0eXBlLgorUFJPVE9CVUZfRVhQT1JUIGJvb2wgSXNNYXAoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGQmIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSYgdHlwZSk7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBoYXMgc3BlY2lhbCBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0LgorYm9vbCBJc01lc3NhZ2VTZXRXaXJlRm9ybWF0KGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlR5cGUmIHR5cGUpOworCisvLyBJbmZpbml0eS9OYU4tYXdhcmUgY29udmVyc2lvbiB0byBzdHJpbmcuCitQUk9UT0JVRl9FWFBPUlQgc3RkOjpzdHJpbmcgRG91YmxlQXNTdHJpbmcoZG91YmxlIHZhbHVlKTsKK1BST1RPQlVGX0VYUE9SVCBzdGQ6OnN0cmluZyBGbG9hdEFzU3RyaW5nKGZsb2F0IHZhbHVlKTsKKworLy8gQ29udmVydCBmcm9tIGludDMyLCBpbnQ2NCwgdWludDMyLCB1aW50NjQsIGRvdWJsZSBvciBmbG9hdCB0byBzdHJpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIFZhbHVlQXNTdHJpbmcoVCB2YWx1ZSkgeworICByZXR1cm4gU3RyQ2F0KHZhbHVlKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBzdGQ6OnN0cmluZyBWYWx1ZUFzU3RyaW5nKGZsb2F0IHZhbHVlKSB7CisgIHJldHVybiBGbG9hdEFzU3RyaW5nKHZhbHVlKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBzdGQ6OnN0cmluZyBWYWx1ZUFzU3RyaW5nKGRvdWJsZSB2YWx1ZSkgeworICByZXR1cm4gRG91YmxlQXNTdHJpbmcodmFsdWUpOworfQorCisvLyBDb252ZXJ0cyBhIHN0cmluZyB0byBmbG9hdC4gVW5saWtlIHNhZmVfc3RydG9mLCBjb252ZXJzaW9uIHdpbGwgZmFpbCBpZiB0aGUKKy8vIHZhbHVlIGZpdHMgaW50byBkb3VibGUgYnV0IG5vdCBmbG9hdCAoZS5nLiwgREJMX01BWCkuCitQUk9UT0JVRl9FWFBPUlQgYm9vbCBTYWZlU3RyVG9GbG9hdChTdHJpbmdQaWVjZSBzdHIsIGZsb2F0KiB2YWx1ZSk7CisKK30gIC8vIG5hbWVzcGFjZSBjb252ZXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9JTlRFUk5BTF9VVElMSVRZX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnByb3RvIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNzEwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucHJvdG8KQEAgLTAsMCArMSwxNDAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBBIHByb3RvIGZpbGUgd2Ugd2lsbCB1c2UgZm9yIHVuaXQgdGVzdGluZy4KKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK21lc3NhZ2UgVGVzdEZsYWdzQW5kU3RyaW5ncyB7CisgIHJlcXVpcmVkIGludDMyIEEgPSAxOworICByZXBlYXRlZCBncm91cCBSZXBlYXRlZEdyb3VwID0gMiB7CisgICAgcmVxdWlyZWQgc3RyaW5nIGYgPSAzOworICB9Cit9CisKK21lc3NhZ2UgVGVzdEJhc2U2NEJ5dGVBcnJheXMgeworICByZXF1aXJlZCBieXRlcyBhID0gMTsKK30KKworbWVzc2FnZSBUZXN0SmF2YVNjcmlwdEpTT04geworICBvcHRpb25hbCBpbnQzMiBhID0gMTsKKyAgb3B0aW9uYWwgZmxvYXQgZmluYWwgPSAyOworICBvcHRpb25hbCBzdHJpbmcgaW4gPSAzOworICBvcHRpb25hbCBzdHJpbmcgVmFyID0gNDsKK30KKworbWVzc2FnZSBUZXN0SmF2YVNjcmlwdE9yZGVySlNPTjEgeworICBvcHRpb25hbCBpbnQzMiBkID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgYyA9IDI7CisgIG9wdGlvbmFsIGJvb2wgeCA9IDM7CisgIG9wdGlvbmFsIGludDMyIGIgPSA0OworICBvcHRpb25hbCBpbnQzMiBhID0gNTsKK30KKworbWVzc2FnZSBUZXN0SmF2YVNjcmlwdE9yZGVySlNPTjIgeworICBvcHRpb25hbCBpbnQzMiBkID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgYyA9IDI7CisgIG9wdGlvbmFsIGJvb2wgeCA9IDM7CisgIG9wdGlvbmFsIGludDMyIGIgPSA0OworICBvcHRpb25hbCBpbnQzMiBhID0gNTsKKyAgcmVwZWF0ZWQgVGVzdEphdmFTY3JpcHRPcmRlckpTT04xIHogPSA2OworfQorCittZXNzYWdlIFRlc3RMYXJnZUludCB7CisgIHJlcXVpcmVkIGludDY0IGEgPSAxOworICByZXF1aXJlZCB1aW50NjQgYiA9IDI7Cit9CisKK21lc3NhZ2UgVGVzdE51bWJlcnMgeworICBlbnVtIE15VHlwZSB7CisgICAgT0sgPSAwOworICAgIFdBUk5JTkcgPSAxOworICAgIEVSUk9SID0gMjsKKyAgfQorICBvcHRpb25hbCBNeVR5cGUgYSA9IDE7CisgIG9wdGlvbmFsIGludDMyIGIgPSAyOworICBvcHRpb25hbCBmbG9hdCBjID0gMzsKKyAgb3B0aW9uYWwgYm9vbCBkID0gNDsKKyAgb3B0aW9uYWwgZG91YmxlIGUgPSA1OworICBvcHRpb25hbCB1aW50MzIgZiA9IDY7Cit9CisKKworbWVzc2FnZSBUZXN0Q2FtZWxDYXNlIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG5vcm1hbF9maWVsZCA9IDE7CisgIG9wdGlvbmFsIGludDMyIENBUElUQUxfRklFTEQgPSAyOworICBvcHRpb25hbCBpbnQzMiBDYW1lbENhc2VGaWVsZCA9IDM7Cit9CisKK21lc3NhZ2UgVGVzdEJvb2xNYXAgeworICBtYXA8Ym9vbCwgaW50MzI+IGJvb2xfbWFwID0gMTsKK30KKworbWVzc2FnZSBUZXN0UmVjdXJzaW9uIHsKKyAgb3B0aW9uYWwgaW50MzIgdmFsdWUgPSAxOworICBvcHRpb25hbCBUZXN0UmVjdXJzaW9uIGNoaWxkID0gMjsKK30KKworbWVzc2FnZSBUZXN0U3RyaW5nTWFwIHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBzdHJpbmdfbWFwID0gMTsKK30KKworbWVzc2FnZSBUZXN0U3RyaW5nU2VyaWFsaXplciB7CisgIG9wdGlvbmFsIHN0cmluZyBzY2FsYXJfc3RyaW5nID0gMTsKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZyA9IDI7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gc3RyaW5nX21hcCA9IDM7Cit9CisKK21lc3NhZ2UgVGVzdE1lc3NhZ2VXaXRoRXh0ZW5zaW9uIHsKKyAgZXh0ZW5zaW9ucyAxMDAgdG8gbWF4OworfQorCittZXNzYWdlIFRlc3RFeHRlbnNpb24geworICBleHRlbmQgVGVzdE1lc3NhZ2VXaXRoRXh0ZW5zaW9uIHsKKyAgICBvcHRpb25hbCBUZXN0RXh0ZW5zaW9uIGV4dCA9IDEwMDsKKyAgfQorICBvcHRpb25hbCBzdHJpbmcgdmFsdWUgPSAxOworfQorCitlbnVtIEVudW1WYWx1ZSB7CisgIFBST1RPQ09MID0gMDsKKyAgQlVGRkVSID0gMTsKKyAgREVGQVVMVCA9IDI7Cit9CisKK21lc3NhZ2UgVGVzdERlZmF1bHRFbnVtVmFsdWUgeworICBvcHRpb25hbCBFbnVtVmFsdWUgZW51bV92YWx1ZSA9IDEgW2RlZmF1bHQgPSBERUZBVUxUXTsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZWM5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnByb3RvCkBAIC0wLDAgKzEsMTk0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgcHJvdG8zOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8iOworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8iOworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90byI7CitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8iOworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvIjsKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIjsKKworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLnV0aWwiOworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkpzb25Gb3JtYXRQcm90bzMiOworCitlbnVtIEVudW1UeXBlIHsKKyAgRk9PID0gMDsKKyAgQkFSID0gMTsKK30KKworbWVzc2FnZSBNZXNzYWdlVHlwZSB7CisgIGludDMyIHZhbHVlID0gMTsKK30KKworbWVzc2FnZSBUZXN0TWVzc2FnZSB7CisgIGJvb2wgYm9vbF92YWx1ZSA9IDE7CisgIGludDMyIGludDMyX3ZhbHVlID0gMjsKKyAgaW50NjQgaW50NjRfdmFsdWUgPSAzOworICB1aW50MzIgdWludDMyX3ZhbHVlID0gNDsKKyAgdWludDY0IHVpbnQ2NF92YWx1ZSA9IDU7CisgIGZsb2F0IGZsb2F0X3ZhbHVlID0gNjsKKyAgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDc7CisgIHN0cmluZyBzdHJpbmdfdmFsdWUgPSA4OworICBieXRlcyBieXRlc192YWx1ZSA9IDk7CisgIEVudW1UeXBlIGVudW1fdmFsdWUgPSAxMDsKKyAgTWVzc2FnZVR5cGUgbWVzc2FnZV92YWx1ZSA9IDExOworCisgIHJlcGVhdGVkIGJvb2wgcmVwZWF0ZWRfYm9vbF92YWx1ZSA9IDIxOworICByZXBlYXRlZCBpbnQzMiByZXBlYXRlZF9pbnQzMl92YWx1ZSA9IDIyOworICByZXBlYXRlZCBpbnQ2NCByZXBlYXRlZF9pbnQ2NF92YWx1ZSA9IDIzOworICByZXBlYXRlZCB1aW50MzIgcmVwZWF0ZWRfdWludDMyX3ZhbHVlID0gMjQ7CisgIHJlcGVhdGVkIHVpbnQ2NCByZXBlYXRlZF91aW50NjRfdmFsdWUgPSAyNTsKKyAgcmVwZWF0ZWQgZmxvYXQgcmVwZWF0ZWRfZmxvYXRfdmFsdWUgPSAyNjsKKyAgcmVwZWF0ZWQgZG91YmxlIHJlcGVhdGVkX2RvdWJsZV92YWx1ZSA9IDI3OworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3ZhbHVlID0gMjg7CisgIHJlcGVhdGVkIGJ5dGVzIHJlcGVhdGVkX2J5dGVzX3ZhbHVlID0gMjk7CisgIHJlcGVhdGVkIEVudW1UeXBlIHJlcGVhdGVkX2VudW1fdmFsdWUgPSAzMDsKKyAgcmVwZWF0ZWQgTWVzc2FnZVR5cGUgcmVwZWF0ZWRfbWVzc2FnZV92YWx1ZSA9IDMxOworfQorCittZXNzYWdlIFRlc3RPbmVvZiB7CisgIC8vIEluIEpTT04gZm9ybWF0IG9uZW9mIGZpZWxkcyBiZWhhdmUgbW9zdGx5IHRoZSBzYW1lIGFzIG9wdGlvbmFsCisgIC8vIGZpZWxkcyBleGNlcHQgdGhhdDoKKyAgLy8gICAxLiBPbmVvZiBmaWVsZHMgaGF2ZSBmaWVsZCBwcmVzZW5jZSBpbmZvcm1hdGlvbiBhbmQgd2lsbCBiZQorICAvLyAgICAgIHByaW50ZWQgaWYgaXQncyBzZXQgbm8gbWF0dGVyIHdoZXRoZXIgaXQncyB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgLy8gICAyLiBNdWx0aXBsZSBvbmVvZiBmaWVsZHMgaW4gdGhlIHNhbWUgb25lb2YgY2Fubm90IGFwcGVhciBhdCB0aGUKKyAgLy8gICAgICBzYW1lIHRpbWUgaW4gdGhlIGlucHV0LgorICBvbmVvZiBvbmVvZl92YWx1ZSB7CisgICAgaW50MzIgb25lb2ZfaW50MzJfdmFsdWUgPSAxOworICAgIHN0cmluZyBvbmVvZl9zdHJpbmdfdmFsdWUgPSAyOworICAgIGJ5dGVzIG9uZW9mX2J5dGVzX3ZhbHVlID0gMzsKKyAgICBFbnVtVHlwZSBvbmVvZl9lbnVtX3ZhbHVlID0gNDsKKyAgICBNZXNzYWdlVHlwZSBvbmVvZl9tZXNzYWdlX3ZhbHVlID0gNTsKKyAgICBnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlIG9uZW9mX251bGxfdmFsdWUgPSA2OworICB9Cit9CisKK21lc3NhZ2UgVGVzdE1hcCB7CisgIG1hcDxib29sLCBpbnQzMj4gYm9vbF9tYXAgPSAxOworICBtYXA8aW50MzIsIGludDMyPiBpbnQzMl9tYXAgPSAyOworICBtYXA8aW50NjQsIGludDMyPiBpbnQ2NF9tYXAgPSAzOworICBtYXA8dWludDMyLCBpbnQzMj4gdWludDMyX21hcCA9IDQ7CisgIG1hcDx1aW50NjQsIGludDMyPiB1aW50NjRfbWFwID0gNTsKKyAgbWFwPHN0cmluZywgaW50MzI+IHN0cmluZ19tYXAgPSA2OworfQorCittZXNzYWdlIFRlc3ROZXN0ZWRNYXAgeworICBtYXA8Ym9vbCwgaW50MzI+IGJvb2xfbWFwID0gMTsKKyAgbWFwPGludDMyLCBpbnQzMj4gaW50MzJfbWFwID0gMjsKKyAgbWFwPGludDY0LCBpbnQzMj4gaW50NjRfbWFwID0gMzsKKyAgbWFwPHVpbnQzMiwgaW50MzI+IHVpbnQzMl9tYXAgPSA0OworICBtYXA8dWludDY0LCBpbnQzMj4gdWludDY0X21hcCA9IDU7CisgIG1hcDxzdHJpbmcsIGludDMyPiBzdHJpbmdfbWFwID0gNjsKKyAgbWFwPHN0cmluZywgVGVzdE5lc3RlZE1hcD4gbWFwX21hcCA9IDc7Cit9CisKK21lc3NhZ2UgVGVzdFN0cmluZ01hcCB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gc3RyaW5nX21hcCA9IDE7Cit9CisKK21lc3NhZ2UgVGVzdFdyYXBwZXIgeworICBnb29nbGUucHJvdG9idWYuQm9vbFZhbHVlIGJvb2xfdmFsdWUgPSAxOworICBnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSBpbnQzMl92YWx1ZSA9IDI7CisgIGdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlIGludDY0X3ZhbHVlID0gMzsKKyAgZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlIHVpbnQzMl92YWx1ZSA9IDQ7CisgIGdvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZSB1aW50NjRfdmFsdWUgPSA1OworICBnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZSBmbG9hdF92YWx1ZSA9IDY7CisgIGdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSBkb3VibGVfdmFsdWUgPSA3OworICBnb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUgc3RyaW5nX3ZhbHVlID0gODsKKyAgZ29vZ2xlLnByb3RvYnVmLkJ5dGVzVmFsdWUgYnl0ZXNfdmFsdWUgPSA5OworCisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUgcmVwZWF0ZWRfYm9vbF92YWx1ZSA9IDExOworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSByZXBlYXRlZF9pbnQzMl92YWx1ZSA9IDEyOworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZSByZXBlYXRlZF9pbnQ2NF92YWx1ZSA9IDEzOworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUgcmVwZWF0ZWRfdWludDMyX3ZhbHVlID0gMTQ7CisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZSByZXBlYXRlZF91aW50NjRfdmFsdWUgPSAxNTsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLkZsb2F0VmFsdWUgcmVwZWF0ZWRfZmxvYXRfdmFsdWUgPSAxNjsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlIHJlcGVhdGVkX2RvdWJsZV92YWx1ZSA9IDE3OworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUgcmVwZWF0ZWRfc3RyaW5nX3ZhbHVlID0gMTg7CisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlIHJlcGVhdGVkX2J5dGVzX3ZhbHVlID0gMTk7Cit9CisKK21lc3NhZ2UgVGVzdFRpbWVzdGFtcCB7CisgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgdmFsdWUgPSAxOworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIHJlcGVhdGVkX3ZhbHVlID0gMjsKK30KKworbWVzc2FnZSBUZXN0RHVyYXRpb24geworICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gdmFsdWUgPSAxOworICByZXBlYXRlZCBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gcmVwZWF0ZWRfdmFsdWUgPSAyOworfQorCittZXNzYWdlIFRlc3RGaWVsZE1hc2sgeworICBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIHZhbHVlID0gMTsKK30KKworbWVzc2FnZSBUZXN0U3RydWN0IHsKKyAgZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCB2YWx1ZSA9IDE7CisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QgcmVwZWF0ZWRfdmFsdWUgPSAyOworfQorCittZXNzYWdlIFRlc3RBbnkgeworICBnb29nbGUucHJvdG9idWYuQW55IHZhbHVlID0gMTsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLkFueSByZXBlYXRlZF92YWx1ZSA9IDI7Cit9CisKK21lc3NhZ2UgVGVzdFZhbHVlIHsKKyAgZ29vZ2xlLnByb3RvYnVmLlZhbHVlIHZhbHVlID0gMTsKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLlZhbHVlIHJlcGVhdGVkX3ZhbHVlID0gMjsKK30KKworbWVzc2FnZSBUZXN0TGlzdFZhbHVlIHsKKyAgZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZSB2YWx1ZSA9IDE7CisgIHJlcGVhdGVkIGdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUgcmVwZWF0ZWRfdmFsdWUgPSAyOworfQorCittZXNzYWdlIFRlc3RCb29sVmFsdWUgeworICBib29sIGJvb2xfdmFsdWUgPSAxOworICBtYXA8Ym9vbCwgaW50MzI+IGJvb2xfbWFwID0gMjsKK30KKworbWVzc2FnZSBUZXN0Q3VzdG9tSnNvbk5hbWUgeworICBpbnQzMiB2YWx1ZSA9IDEgW2pzb25fbmFtZSA9ICJAdmFsdWUiXTsKK30KKworbWVzc2FnZSBUZXN0RXh0ZW5zaW9ucyB7CisgIC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucyBleHRlbnNpb25zID0gMTsKK30KKworbWVzc2FnZSBUZXN0RW51bVZhbHVlIHsKKyAgRW51bVR5cGUgZW51bV92YWx1ZTEgPSAxOworICBFbnVtVHlwZSBlbnVtX3ZhbHVlMiA9IDI7CisgIEVudW1UeXBlIGVudW1fdmFsdWUzID0gMzsKK30KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWwuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOWMxMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsLmNjCkBAIC0wLDAgKzEsMjg0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2Vycm9yX2xpc3RlbmVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c19tYWNyb3MuaD4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisvLyBjbGFuZy1mb3JtYXQgb24KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworCituYW1lc3BhY2UgaW50ZXJuYWwgeworWmVyb0NvcHlTdHJlYW1CeXRlU2luazo6flplcm9Db3B5U3RyZWFtQnl0ZVNpbmsoKSB7CisgIGlmIChidWZmZXJfc2l6ZV8gPiAwKSB7CisgICAgc3RyZWFtXy0+QmFja1VwKGJ1ZmZlcl9zaXplXyk7CisgIH0KK30KKwordm9pZCBaZXJvQ29weVN0cmVhbUJ5dGVTaW5rOjpBcHBlbmQoY29uc3QgY2hhciogYnl0ZXMsIHNpemVfdCBsZW4pIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAobGVuIDw9IGJ1ZmZlcl9zaXplXykgeyAgLy8gTk9MSU5UCisgICAgICBtZW1jcHkoYnVmZmVyXywgYnl0ZXMsIGxlbik7CisgICAgICBidWZmZXJfID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1ZmZlcl8pICsgbGVuOworICAgICAgYnVmZmVyX3NpemVfIC09IGxlbjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGJ1ZmZlcl9zaXplXyA+IDApIHsKKyAgICAgIG1lbWNweShidWZmZXJfLCBieXRlcywgYnVmZmVyX3NpemVfKTsKKyAgICAgIGJ5dGVzICs9IGJ1ZmZlcl9zaXplXzsKKyAgICAgIGxlbiAtPSBidWZmZXJfc2l6ZV87CisgICAgfQorICAgIGlmICghc3RyZWFtXy0+TmV4dCgmYnVmZmVyXywgJmJ1ZmZlcl9zaXplXykpIHsKKyAgICAgIC8vIFRoZXJlIGlzbid0IGEgd2F5IGZvciBCeXRlU2luayB0byByZXBvcnQgZXJyb3JzLgorICAgICAgYnVmZmVyX3NpemVfID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit1dGlsOjpTdGF0dXMgQmluYXJ5VG9Kc29uU3RyZWFtKFR5cGVSZXNvbHZlciogcmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlX3VybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGJpbmFyeV9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBqc29uX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSnNvblByaW50T3B0aW9ucyYgb3B0aW9ucykgeworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbl9zdHJlYW0oYmluYXJ5X2lucHV0KTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSB0eXBlOworICBSRVRVUk5fSUZfRVJST1IocmVzb2x2ZXItPlJlc29sdmVNZXNzYWdlVHlwZSh0eXBlX3VybCwgJnR5cGUpKTsKKyAgY29udmVydGVyOjpQcm90b1N0cmVhbU9iamVjdFNvdXJjZTo6UmVuZGVyT3B0aW9ucyByZW5kZXJfb3B0aW9uczsKKyAgcmVuZGVyX29wdGlvbnMudXNlX2ludHNfZm9yX2VudW1zID0gb3B0aW9ucy5hbHdheXNfcHJpbnRfZW51bXNfYXNfaW50czsKKyAgcmVuZGVyX29wdGlvbnMucHJlc2VydmVfcHJvdG9fZmllbGRfbmFtZXMgPQorICAgICAgb3B0aW9ucy5wcmVzZXJ2ZV9wcm90b19maWVsZF9uYW1lczsKKyAgY29udmVydGVyOjpQcm90b1N0cmVhbU9iamVjdFNvdXJjZSBwcm90b19zb3VyY2UoJmluX3N0cmVhbSwgcmVzb2x2ZXIsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl9vcHRpb25zKTsKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dF9zdHJlYW0oanNvbl9vdXRwdXQpOworICBjb252ZXJ0ZXI6Okpzb25PYmplY3RXcml0ZXIganNvbl93cml0ZXIob3B0aW9ucy5hZGRfd2hpdGVzcGFjZSA/ICIgIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dF9zdHJlYW0pOworICBpZiAob3B0aW9ucy5hbHdheXNfcHJpbnRfcHJpbWl0aXZlX2ZpZWxkcykgeworICAgIGNvbnZlcnRlcjo6RGVmYXVsdFZhbHVlT2JqZWN0V3JpdGVyIGRlZmF1bHRfdmFsdWVfd3JpdGVyKHJlc29sdmVyLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqc29uX3dyaXRlcik7CisgICAgZGVmYXVsdF92YWx1ZV93cml0ZXIuc2V0X3ByZXNlcnZlX3Byb3RvX2ZpZWxkX25hbWVzKAorICAgICAgICBvcHRpb25zLnByZXNlcnZlX3Byb3RvX2ZpZWxkX25hbWVzKTsKKyAgICBkZWZhdWx0X3ZhbHVlX3dyaXRlci5zZXRfcHJpbnRfZW51bXNfYXNfaW50cygKKyAgICAgICAgb3B0aW9ucy5hbHdheXNfcHJpbnRfZW51bXNfYXNfaW50cyk7CisgICAgcmV0dXJuIHByb3RvX3NvdXJjZS5Xcml0ZVRvKCZkZWZhdWx0X3ZhbHVlX3dyaXRlcik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHByb3RvX3NvdXJjZS5Xcml0ZVRvKCZqc29uX3dyaXRlcik7CisgIH0KK30KKwordXRpbDo6U3RhdHVzIEJpbmFyeVRvSnNvblN0cmluZyhUeXBlUmVzb2x2ZXIqIHJlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV91cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiaW5hcnlfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBqc29uX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSnNvblByaW50T3B0aW9ucyYgb3B0aW9ucykgeworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0oYmluYXJ5X2lucHV0LmRhdGEoKSwgYmluYXJ5X2lucHV0LnNpemUoKSk7CisgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbShqc29uX291dHB1dCk7CisgIHJldHVybiBCaW5hcnlUb0pzb25TdHJlYW0ocmVzb2x2ZXIsIHR5cGVfdXJsLCAmaW5wdXRfc3RyZWFtLCAmb3V0cHV0X3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zKTsKK30KKworbmFtZXNwYWNlIHsKK2NsYXNzIFN0YXR1c0Vycm9yTGlzdGVuZXIgOiBwdWJsaWMgY29udmVydGVyOjpFcnJvckxpc3RlbmVyIHsKKyBwdWJsaWM6CisgIFN0YXR1c0Vycm9yTGlzdGVuZXIoKSB7fQorICB+U3RhdHVzRXJyb3JMaXN0ZW5lcigpIG92ZXJyaWRlIHt9CisKKyAgdXRpbDo6U3RhdHVzIEdldFN0YXR1cygpIHsgcmV0dXJuIHN0YXR1c187IH0KKworICB2b2lkIEludmFsaWROYW1lKGNvbnN0IGNvbnZlcnRlcjo6TG9jYXRpb25UcmFja2VySW50ZXJmYWNlJiBsb2MsCisgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgdW5rbm93bl9uYW1lLAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIG1lc3NhZ2UpIG92ZXJyaWRlIHsKKyAgICBzdGQ6OnN0cmluZyBsb2Nfc3RyaW5nID0gR2V0TG9jU3RyaW5nKGxvYyk7CisgICAgaWYgKCFsb2Nfc3RyaW5nLmVtcHR5KCkpIHsKKyAgICAgIGxvY19zdHJpbmcuYXBwZW5kKCIgIik7CisgICAgfQorICAgIHN0YXR1c18gPSB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigKKyAgICAgICAgU3RyQ2F0KGxvY19zdHJpbmcsIHVua25vd25fbmFtZSwgIjogIiwgbWVzc2FnZSkpOworICB9CisKKyAgdm9pZCBJbnZhbGlkVmFsdWUoY29uc3QgY29udmVydGVyOjpMb2NhdGlvblRyYWNrZXJJbnRlcmZhY2UmIGxvYywKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSB2YWx1ZSkgb3ZlcnJpZGUgeworICAgIHN0YXR1c18gPSB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigKKyAgICAgICAgU3RyQ2F0KEdldExvY1N0cmluZyhsb2MpLCAiOiBpbnZhbGlkIHZhbHVlICIsIHN0ZDo6c3RyaW5nKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICIgZm9yIHR5cGUgIiwgc3RkOjpzdHJpbmcodHlwZV9uYW1lKSkpOworICB9CisKKyAgdm9pZCBNaXNzaW5nRmllbGQoY29uc3QgY29udmVydGVyOjpMb2NhdGlvblRyYWNrZXJJbnRlcmZhY2UmIGxvYywKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgbWlzc2luZ19uYW1lKSBvdmVycmlkZSB7CisgICAgc3RhdHVzXyA9IHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKFN0ckNhdCgKKyAgICAgICAgR2V0TG9jU3RyaW5nKGxvYyksICI6IG1pc3NpbmcgZmllbGQgIiwgc3RkOjpzdHJpbmcobWlzc2luZ19uYW1lKSkpOworICB9CisKKyBwcml2YXRlOgorICB1dGlsOjpTdGF0dXMgc3RhdHVzXzsKKworICBzdGQ6OnN0cmluZyBHZXRMb2NTdHJpbmcoY29uc3QgY29udmVydGVyOjpMb2NhdGlvblRyYWNrZXJJbnRlcmZhY2UmIGxvYykgeworICAgIHN0ZDo6c3RyaW5nIGxvY19zdHJpbmcgPSBsb2MuVG9TdHJpbmcoKTsKKyAgICBTdHJpcFdoaXRlc3BhY2UoJmxvY19zdHJpbmcpOworICAgIGlmICghbG9jX3N0cmluZy5lbXB0eSgpKSB7CisgICAgICBsb2Nfc3RyaW5nID0gU3RyQ2F0KCIoIiwgbG9jX3N0cmluZywgIikiKTsKKyAgICB9CisgICAgcmV0dXJuIGxvY19zdHJpbmc7CisgIH0KKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU3RhdHVzRXJyb3JMaXN0ZW5lcik7Cit9OworfSAgLy8gbmFtZXNwYWNlCisKK3V0aWw6OlN0YXR1cyBKc29uVG9CaW5hcnlTdHJlYW0oVHlwZVJlc29sdmVyKiByZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSoganNvbl9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBiaW5hcnlfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBKc29uUGFyc2VPcHRpb25zJiBvcHRpb25zKSB7CisgIGdvb2dsZTo6cHJvdG9idWY6OlR5cGUgdHlwZTsKKyAgUkVUVVJOX0lGX0VSUk9SKHJlc29sdmVyLT5SZXNvbHZlTWVzc2FnZVR5cGUodHlwZV91cmwsICZ0eXBlKSk7CisgIGludGVybmFsOjpaZXJvQ29weVN0cmVhbUJ5dGVTaW5rIHNpbmsoYmluYXJ5X291dHB1dCk7CisgIFN0YXR1c0Vycm9yTGlzdGVuZXIgbGlzdGVuZXI7CisgIGNvbnZlcnRlcjo6UHJvdG9TdHJlYW1PYmplY3RXcml0ZXI6Ok9wdGlvbnMgcHJvdG9fd3JpdGVyX29wdGlvbnM7CisgIHByb3RvX3dyaXRlcl9vcHRpb25zLmlnbm9yZV91bmtub3duX2ZpZWxkcyA9IG9wdGlvbnMuaWdub3JlX3Vua25vd25fZmllbGRzOworICBwcm90b193cml0ZXJfb3B0aW9ucy5pZ25vcmVfdW5rbm93bl9lbnVtX3ZhbHVlcyA9CisgICAgICBvcHRpb25zLmlnbm9yZV91bmtub3duX2ZpZWxkczsKKyAgcHJvdG9fd3JpdGVyX29wdGlvbnMuY2FzZV9pbnNlbnNpdGl2ZV9lbnVtX3BhcnNpbmcgPQorICAgICAgb3B0aW9ucy5jYXNlX2luc2Vuc2l0aXZlX2VudW1fcGFyc2luZzsKKyAgY29udmVydGVyOjpQcm90b1N0cmVhbU9iamVjdFdyaXRlciBwcm90b193cml0ZXIoCisgICAgICByZXNvbHZlciwgdHlwZSwgJnNpbmssICZsaXN0ZW5lciwgcHJvdG9fd3JpdGVyX29wdGlvbnMpOworCisgIGNvbnZlcnRlcjo6SnNvblN0cmVhbVBhcnNlciBwYXJzZXIoJnByb3RvX3dyaXRlcik7CisgIGNvbnN0IHZvaWQqIGJ1ZmZlcjsKKyAgaW50IGxlbmd0aDsKKyAgd2hpbGUgKGpzb25faW5wdXQtPk5leHQoJmJ1ZmZlciwgJmxlbmd0aCkpIHsKKyAgICBpZiAobGVuZ3RoID09IDApIGNvbnRpbnVlOworICAgIFJFVFVSTl9JRl9FUlJPUihwYXJzZXIuUGFyc2UoCisgICAgICAgIFN0cmluZ1BpZWNlKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihidWZmZXIpLCBsZW5ndGgpKSk7CisgIH0KKyAgUkVUVVJOX0lGX0VSUk9SKHBhcnNlci5GaW5pc2hQYXJzZSgpKTsKKworICByZXR1cm4gbGlzdGVuZXIuR2V0U3RhdHVzKCk7Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uVG9CaW5hcnlTdHJpbmcoVHlwZVJlc29sdmVyKiByZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQaWVjZSBqc29uX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogYmluYXJ5X291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSnNvblBhcnNlT3B0aW9ucyYgb3B0aW9ucykgeworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0oanNvbl9pbnB1dC5kYXRhKCksIGpzb25faW5wdXQuc2l6ZSgpKTsKKyAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKGJpbmFyeV9vdXRwdXQpOworICByZXR1cm4gSnNvblRvQmluYXJ5U3RyZWFtKHJlc29sdmVyLCB0eXBlX3VybCwgJmlucHV0X3N0cmVhbSwgJm91dHB1dF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyk7Cit9CisKK25hbWVzcGFjZSB7Citjb25zdCBjaGFyKiBrVHlwZVVybFByZWZpeCA9ICJ0eXBlLmdvb2dsZWFwaXMuY29tIjsKK1R5cGVSZXNvbHZlciogZ2VuZXJhdGVkX3R5cGVfcmVzb2x2ZXJfID0gbnVsbHB0cjsKK1BST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6Om9uY2VfZmxhZyBnZW5lcmF0ZWRfdHlwZV9yZXNvbHZlcl9pbml0XzsKKworc3RkOjpzdHJpbmcgR2V0VHlwZVVybChjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIHJldHVybiBzdGQ6OnN0cmluZyhrVHlwZVVybFByZWZpeCkgKyAiLyIgKworICAgICAgICAgbWVzc2FnZS5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpOworfQorCit2b2lkIERlbGV0ZUdlbmVyYXRlZFR5cGVSZXNvbHZlcigpIHsgIC8vIE5PTElOVAorICBkZWxldGUgZ2VuZXJhdGVkX3R5cGVfcmVzb2x2ZXJfOworfQorCit2b2lkIEluaXRHZW5lcmF0ZWRUeXBlUmVzb2x2ZXIoKSB7CisgIGdlbmVyYXRlZF90eXBlX3Jlc29sdmVyXyA9IE5ld1R5cGVSZXNvbHZlckZvckRlc2NyaXB0b3JQb29sKAorICAgICAga1R5cGVVcmxQcmVmaXgsIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6T25TaHV0ZG93bigmRGVsZXRlR2VuZXJhdGVkVHlwZVJlc29sdmVyKTsKK30KKworVHlwZVJlc29sdmVyKiBHZXRHZW5lcmF0ZWRUeXBlUmVzb2x2ZXIoKSB7CisgIFBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OmNhbGxfb25jZShnZW5lcmF0ZWRfdHlwZV9yZXNvbHZlcl9pbml0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRHZW5lcmF0ZWRUeXBlUmVzb2x2ZXIpOworICByZXR1cm4gZ2VuZXJhdGVkX3R5cGVfcmVzb2x2ZXJfOworfQorfSAgLy8gbmFtZXNwYWNlCisKK3V0aWw6OlN0YXR1cyBNZXNzYWdlVG9Kc29uU3RyaW5nKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIHN0ZDo6c3RyaW5nKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBKc29uT3B0aW9ucyYgb3B0aW9ucykgeworICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpLT5maWxlKCktPnBvb2woKTsKKyAgVHlwZVJlc29sdmVyKiByZXNvbHZlciA9CisgICAgICBwb29sID09IERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpCisgICAgICAgICAgPyBHZXRHZW5lcmF0ZWRUeXBlUmVzb2x2ZXIoKQorICAgICAgICAgIDogTmV3VHlwZVJlc29sdmVyRm9yRGVzY3JpcHRvclBvb2woa1R5cGVVcmxQcmVmaXgsIHBvb2wpOworICB1dGlsOjpTdGF0dXMgcmVzdWx0ID0KKyAgICAgIEJpbmFyeVRvSnNvblN0cmluZyhyZXNvbHZlciwgR2V0VHlwZVVybChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCksIG91dHB1dCwgb3B0aW9ucyk7CisgIGlmIChwb29sICE9IERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKSB7CisgICAgZGVsZXRlIHJlc29sdmVyOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3V0aWw6OlN0YXR1cyBKc29uU3RyaW5nVG9NZXNzYWdlKFN0cmluZ1BpZWNlIGlucHV0LCBNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSnNvblBhcnNlT3B0aW9ucyYgb3B0aW9ucykgeworICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZmlsZSgpLT5wb29sKCk7CisgIFR5cGVSZXNvbHZlciogcmVzb2x2ZXIgPQorICAgICAgcG9vbCA9PSBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKQorICAgICAgICAgID8gR2V0R2VuZXJhdGVkVHlwZVJlc29sdmVyKCkKKyAgICAgICAgICA6IE5ld1R5cGVSZXNvbHZlckZvckRlc2NyaXB0b3JQb29sKGtUeXBlVXJsUHJlZml4LCBwb29sKTsKKyAgc3RkOjpzdHJpbmcgYmluYXJ5OworICB1dGlsOjpTdGF0dXMgcmVzdWx0ID0gSnNvblRvQmluYXJ5U3RyaW5nKHJlc29sdmVyLCBHZXRUeXBlVXJsKCptZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgJmJpbmFyeSwgb3B0aW9ucyk7CisgIGlmIChyZXN1bHQub2soKSAmJiAhbWVzc2FnZS0+UGFyc2VGcm9tU3RyaW5nKGJpbmFyeSkpIHsKKyAgICByZXN1bHQgPSB1dGlsOjpJbnZhbGlkQXJndW1lbnRFcnJvcigKKyAgICAgICAgIkpTT04gdHJhbnNjb2RlciBwcm9kdWNlZCBpbnZhbGlkIHByb3RvYnVmIG91dHB1dC4iKTsKKyAgfQorICBpZiAocG9vbCAhPSBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSkgeworICAgIGRlbGV0ZSByZXNvbHZlcjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxYzRkOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWwuaApAQCAtMCwwICsxLDIwNCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFV0aWxpdHkgZnVuY3Rpb25zIHRvIGNvbnZlcnQgYmV0d2VlbiBwcm90b2J1ZiBiaW5hcnkgZm9ybWF0IGFuZCBwcm90bzMgSlNPTgorLy8gZm9ybWF0LgorI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVVRJTF9KU09OX1VUSUxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VVElMX0pTT05fVVRJTF9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworY2xhc3MgWmVyb0NvcHlJbnB1dFN0cmVhbTsKK2NsYXNzIFplcm9Db3B5T3V0cHV0U3RyZWFtOworfSAgLy8gbmFtZXNwYWNlIGlvCituYW1lc3BhY2UgdXRpbCB7CisKK3N0cnVjdCBKc29uUGFyc2VPcHRpb25zIHsKKyAgLy8gV2hldGhlciB0byBpZ25vcmUgdW5rbm93biBKU09OIGZpZWxkcyBkdXJpbmcgcGFyc2luZworICBib29sIGlnbm9yZV91bmtub3duX2ZpZWxkczsKKworICAvLyBJZiB0cnVlLCB3aGVuIGEgbG93ZXJjYXNlIGVudW0gdmFsdWUgZmFpbHMgdG8gcGFyc2UsIHRyeSBjb252ZXJ0IGl0IHRvCisgIC8vIFVQUEVSX0NBU0UgYW5kIHNlZSBpZiBpdCBtYXRjaGVzIGEgdmFsaWQgZW51bS4KKyAgLy8gV0FSTklORzogVGhpcyBvcHRpb24gZXhpc3RzIG9ubHkgdG8gcHJlc2VydmUgbGVnYWN5IGJlaGF2aW9yLiBBdm9pZCB1c2luZworICAvLyB0aGlzIG9wdGlvbi4gSWYgeW91ciBlbnVtIG5lZWRzIHRvIHN1cHBvcnQgZGlmZmVyZW50IGNhc2luZywgY29uc2lkZXIgdXNpbmcKKyAgLy8gYWxsb3dfYWxpYXMgaW5zdGVhZC4KKyAgYm9vbCBjYXNlX2luc2Vuc2l0aXZlX2VudW1fcGFyc2luZzsKKworICBKc29uUGFyc2VPcHRpb25zKCkKKyAgICAgIDogaWdub3JlX3Vua25vd25fZmllbGRzKGZhbHNlKSwgY2FzZV9pbnNlbnNpdGl2ZV9lbnVtX3BhcnNpbmcoZmFsc2UpIHt9Cit9OworCitzdHJ1Y3QgSnNvblByaW50T3B0aW9ucyB7CisgIC8vIFdoZXRoZXIgdG8gYWRkIHNwYWNlcywgbGluZSBicmVha3MgYW5kIGluZGVudGF0aW9uIHRvIG1ha2UgdGhlIEpTT04gb3V0cHV0CisgIC8vIGVhc3kgdG8gcmVhZC4KKyAgYm9vbCBhZGRfd2hpdGVzcGFjZTsKKyAgLy8gV2hldGhlciB0byBhbHdheXMgcHJpbnQgcHJpbWl0aXZlIGZpZWxkcy4gQnkgZGVmYXVsdCBwcm90bzMgcHJpbWl0aXZlCisgIC8vIGZpZWxkcyB3aXRoIGRlZmF1bHQgdmFsdWVzIHdpbGwgYmUgb21pdHRlZCBpbiBKU09OIG91dHB1dC4gRm9yIGV4YW1wbGUsIGFuCisgIC8vIGludDMyIGZpZWxkIHNldCB0byAwIHdpbGwgYmUgb21pdHRlZC4gU2V0IHRoaXMgZmxhZyB0byB0cnVlIHdpbGwgb3ZlcnJpZGUKKyAgLy8gdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kIHByaW50IHByaW1pdGl2ZSBmaWVsZHMgcmVnYXJkbGVzcyBvZiB0aGVpciB2YWx1ZXMuCisgIGJvb2wgYWx3YXlzX3ByaW50X3ByaW1pdGl2ZV9maWVsZHM7CisgIC8vIFdoZXRoZXIgdG8gYWx3YXlzIHByaW50IGVudW1zIGFzIGludHMuIEJ5IGRlZmF1bHQgdGhleSBhcmUgcmVuZGVyZWQgYXMKKyAgLy8gc3RyaW5ncy4KKyAgYm9vbCBhbHdheXNfcHJpbnRfZW51bXNfYXNfaW50czsKKyAgLy8gV2hldGhlciB0byBwcmVzZXJ2ZSBwcm90byBmaWVsZCBuYW1lcworICBib29sIHByZXNlcnZlX3Byb3RvX2ZpZWxkX25hbWVzOworCisgIEpzb25QcmludE9wdGlvbnMoKQorICAgICAgOiBhZGRfd2hpdGVzcGFjZShmYWxzZSksCisgICAgICAgIGFsd2F5c19wcmludF9wcmltaXRpdmVfZmllbGRzKGZhbHNlKSwKKyAgICAgICAgYWx3YXlzX3ByaW50X2VudW1zX2FzX2ludHMoZmFsc2UpLAorICAgICAgICBwcmVzZXJ2ZV9wcm90b19maWVsZF9uYW1lcyhmYWxzZSkge30KK307CisKKy8vIERFUFJFQ0FURUQuIFVzZSBKc29uUHJpbnRPcHRpb25zIGluc3RlYWQuCit0eXBlZGVmIEpzb25QcmludE9wdGlvbnMgSnNvbk9wdGlvbnM7CisKKy8vIENvbnZlcnRzIGZyb20gcHJvdG9idWYgbWVzc2FnZSB0byBKU09OIGFuZCBhcHBlbmRzIGl0IHRvIHxvdXRwdXR8LiBUaGlzIGlzIGEKKy8vIHNpbXBsZSB3cmFwcGVyIG9mIEJpbmFyeVRvSnNvblN0cmluZygpLiBJdCB3aWxsIHVzZSB0aGUgRGVzY3JpcHRvclBvb2wgb2YgdGhlCisvLyBwYXNzZWQtaW4gbWVzc2FnZSB0byByZXNvbHZlIEFueSB0eXBlcy4KK1BST1RPQlVGX0VYUE9SVCB1dGlsOjpTdGF0dXMgTWVzc2FnZVRvSnNvblN0cmluZyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSnNvbk9wdGlvbnMmIG9wdGlvbnMpOworCitpbmxpbmUgdXRpbDo6U3RhdHVzIE1lc3NhZ2VUb0pzb25TdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0cHV0KSB7CisgIHJldHVybiBNZXNzYWdlVG9Kc29uU3RyaW5nKG1lc3NhZ2UsIG91dHB1dCwgSnNvbk9wdGlvbnMoKSk7Cit9CisKKy8vIENvbnZlcnRzIGZyb20gSlNPTiB0byBwcm90b2J1ZiBtZXNzYWdlLiBUaGlzIGlzIGEgc2ltcGxlIHdyYXBwZXIgb2YKKy8vIEpzb25TdHJpbmdUb0JpbmFyeSgpLiBJdCB3aWxsIHVzZSB0aGUgRGVzY3JpcHRvclBvb2wgb2YgdGhlIHBhc3NlZC1pbgorLy8gbWVzc2FnZSB0byByZXNvbHZlIEFueSB0eXBlcy4KK1BST1RPQlVGX0VYUE9SVCB1dGlsOjpTdGF0dXMgSnNvblN0cmluZ1RvTWVzc2FnZSgKKyAgICBTdHJpbmdQaWVjZSBpbnB1dCwgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgSnNvblBhcnNlT3B0aW9ucyYgb3B0aW9ucyk7CisKK2lubGluZSB1dGlsOjpTdGF0dXMgSnNvblN0cmluZ1RvTWVzc2FnZShTdHJpbmdQaWVjZSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBtZXNzYWdlKSB7CisgIHJldHVybiBKc29uU3RyaW5nVG9NZXNzYWdlKGlucHV0LCBtZXNzYWdlLCBKc29uUGFyc2VPcHRpb25zKCkpOworfQorCisvLyBDb252ZXJ0cyBwcm90b2J1ZiBiaW5hcnkgZGF0YSB0byBKU09OLgorLy8gVGhlIGNvbnZlcnNpb24gd2lsbCBmYWlsIGlmOgorLy8gICAxLiBUeXBlUmVzb2x2ZXIgZmFpbHMgdG8gcmVzb2x2ZSBhIHR5cGUuCisvLyAgIDIuIGlucHV0IGlzIG5vdCB2YWxpZCBwcm90b2J1ZiB3aXJlIGZvcm1hdCwgb3IgY29uZmxpY3RzIHdpdGggdGhlIHR5cGUKKy8vICAgICAgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgVHlwZVJlc29sdmVyLgorLy8gTm90ZSB0aGF0IHVua25vd24gZmllbGRzIHdpbGwgYmUgZGlzY2FyZGVkIHNpbGVudGx5LgorUFJPVE9CVUZfRVhQT1JUIHV0aWw6OlN0YXR1cyBCaW5hcnlUb0pzb25TdHJlYW0oCisgICAgVHlwZVJlc29sdmVyKiByZXNvbHZlciwgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfdXJsLAorICAgIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBiaW5hcnlfaW5wdXQsCisgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBqc29uX291dHB1dCwgY29uc3QgSnNvblByaW50T3B0aW9ucyYgb3B0aW9ucyk7CisKK2lubGluZSB1dGlsOjpTdGF0dXMgQmluYXJ5VG9Kc29uU3RyZWFtKFR5cGVSZXNvbHZlciogcmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV91cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogYmluYXJ5X2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBqc29uX291dHB1dCkgeworICByZXR1cm4gQmluYXJ5VG9Kc29uU3RyZWFtKHJlc29sdmVyLCB0eXBlX3VybCwgYmluYXJ5X2lucHV0LCBqc29uX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc29uUHJpbnRPcHRpb25zKCkpOworfQorCitQUk9UT0JVRl9FWFBPUlQgdXRpbDo6U3RhdHVzIEJpbmFyeVRvSnNvblN0cmluZygKKyAgICBUeXBlUmVzb2x2ZXIqIHJlc29sdmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV91cmwsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJpbmFyeV9pbnB1dCwgc3RkOjpzdHJpbmcqIGpzb25fb3V0cHV0LAorICAgIGNvbnN0IEpzb25QcmludE9wdGlvbnMmIG9wdGlvbnMpOworCitpbmxpbmUgdXRpbDo6U3RhdHVzIEJpbmFyeVRvSnNvblN0cmluZyhUeXBlUmVzb2x2ZXIqIHJlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJpbmFyeV9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBqc29uX291dHB1dCkgeworICByZXR1cm4gQmluYXJ5VG9Kc29uU3RyaW5nKHJlc29sdmVyLCB0eXBlX3VybCwgYmluYXJ5X2lucHV0LCBqc29uX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc29uUHJpbnRPcHRpb25zKCkpOworfQorCisvLyBDb252ZXJ0cyBKU09OIGRhdGEgdG8gcHJvdG9idWYgYmluYXJ5IGZvcm1hdC4KKy8vIFRoZSBjb252ZXJzaW9uIHdpbGwgZmFpbCBpZjoKKy8vICAgMS4gVHlwZVJlc29sdmVyIGZhaWxzIHRvIHJlc29sdmUgYSB0eXBlLgorLy8gICAyLiBpbnB1dCBpcyBub3QgdmFsaWQgSlNPTiBmb3JtYXQsIG9yIGNvbmZsaWN0cyB3aXRoIHRoZSB0eXBlCisvLyAgICAgIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IFR5cGVSZXNvbHZlci4KK1BST1RPQlVGX0VYUE9SVCB1dGlsOjpTdGF0dXMgSnNvblRvQmluYXJ5U3RyZWFtKAorICAgIFR5cGVSZXNvbHZlciogcmVzb2x2ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlX3VybCwKKyAgICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSoganNvbl9pbnB1dCwKKyAgICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIGJpbmFyeV9vdXRwdXQsIGNvbnN0IEpzb25QYXJzZU9wdGlvbnMmIG9wdGlvbnMpOworCitpbmxpbmUgdXRpbDo6U3RhdHVzIEpzb25Ub0JpbmFyeVN0cmVhbSgKKyAgICBUeXBlUmVzb2x2ZXIqIHJlc29sdmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV91cmwsCisgICAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGpzb25faW5wdXQsCisgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBiaW5hcnlfb3V0cHV0KSB7CisgIHJldHVybiBKc29uVG9CaW5hcnlTdHJlYW0ocmVzb2x2ZXIsIHR5cGVfdXJsLCBqc29uX2lucHV0LCBiaW5hcnlfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzb25QYXJzZU9wdGlvbnMoKSk7Cit9CisKK1BST1RPQlVGX0VYUE9SVCB1dGlsOjpTdGF0dXMgSnNvblRvQmluYXJ5U3RyaW5nKAorICAgIFR5cGVSZXNvbHZlciogcmVzb2x2ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlX3VybCwKKyAgICBTdHJpbmdQaWVjZSBqc29uX2lucHV0LCBzdGQ6OnN0cmluZyogYmluYXJ5X291dHB1dCwKKyAgICBjb25zdCBKc29uUGFyc2VPcHRpb25zJiBvcHRpb25zKTsKKworaW5saW5lIHV0aWw6OlN0YXR1cyBKc29uVG9CaW5hcnlTdHJpbmcoVHlwZVJlc29sdmVyKiByZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlX3VybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1BpZWNlIGpzb25faW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogYmluYXJ5X291dHB1dCkgeworICByZXR1cm4gSnNvblRvQmluYXJ5U3RyaW5nKHJlc29sdmVyLCB0eXBlX3VybCwganNvbl9pbnB1dCwgYmluYXJ5X291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc29uUGFyc2VPcHRpb25zKCkpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworLy8gSW50ZXJuYWwgaGVscGVyIGNsYXNzLiBQdXQgaW4gdGhlIGhlYWRlciBzbyB3ZSBjYW4gd3JpdGUgdW5pdC10ZXN0cyBmb3IgaXQuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgWmVyb0NvcHlTdHJlYW1CeXRlU2luayA6IHB1YmxpYyBzdHJpbmdzOjpCeXRlU2luayB7CisgcHVibGljOgorICBleHBsaWNpdCBaZXJvQ29weVN0cmVhbUJ5dGVTaW5rKGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKQorICAgICAgOiBzdHJlYW1fKHN0cmVhbSksIGJ1ZmZlcl8obnVsbHB0ciksIGJ1ZmZlcl9zaXplXygwKSB7fQorICB+WmVyb0NvcHlTdHJlYW1CeXRlU2luaygpIG92ZXJyaWRlOworCisgIHZvaWQgQXBwZW5kKGNvbnN0IGNoYXIqIGJ5dGVzLCBzaXplX3QgbGVuKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogc3RyZWFtXzsKKyAgdm9pZCogYnVmZmVyXzsKKyAgaW50IGJ1ZmZlcl9zaXplXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoWmVyb0NvcHlTdHJlYW1CeXRlU2luayk7Cit9OworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9KU09OX1VUSUxfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsX3Rlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxNjE5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWxfdGVzdC5jYwpAQCAtMCwwICsxLDY3MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWwuaD4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXQucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucGIuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIHsKKwordXNpbmcgcHJvdG8zOjpCQVI7Cit1c2luZyBwcm90bzM6OkZPTzsKK3VzaW5nIHByb3RvMzo6VGVzdEFueTsKK3VzaW5nIHByb3RvMzo6VGVzdEVudW1WYWx1ZTsKK3VzaW5nIHByb3RvMzo6VGVzdE1hcDsKK3VzaW5nIHByb3RvMzo6VGVzdE1lc3NhZ2U7Cit1c2luZyBwcm90bzM6OlRlc3RPbmVvZjsKK3VzaW5nIHByb3RvX3V0aWxfY29udmVydGVyOjp0ZXN0aW5nOjpNYXBJbjsKKworLy8gQXMgZnVuY3Rpb25zIGRlZmluZWQgaW4ganNvbl91dGlsLmggYXJlIGp1c3QgdGhpbiB3cmFwcGVycyBhcm91bmQgdGhlCisvLyBKU09OIGNvbnZlcnNpb24gY29kZSBpbiAvL25ldC9wcm90bzIvdXRpbC9jb252ZXJ0ZXIsIGluIHRoaXMgdGVzdCB3ZQorLy8gb25seSBjb3ZlciBzb21lIHZlcnkgYmFzaWMgY2FzZXMgdG8gbWFrZSBzdXJlIHRoZSB3cmFwcGVycyBoYXZlIGZvcndhcmRlZAorLy8gcGFyYW1ldGVycyB0byB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBjb3JyZWN0bHkuIE1vcmUgZGV0YWlsZWQKKy8vIHRlc3RzIGFyZSBjb250YWluZWQgaW4gdGhlIC8vbmV0L3Byb3RvMi91dGlsL2NvbnZlcnRlciBkaXJlY3RvcnkuCitjbGFzcyBKc29uVXRpbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIEpzb25VdGlsVGVzdCgpIHt9CisKKyAgc3RkOjpzdHJpbmcgVG9Kc29uKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEpzb25QcmludE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgR09PR0xFX0NIRUNLX09LKE1lc3NhZ2VUb0pzb25TdHJpbmcobWVzc2FnZSwgJnJlc3VsdCwgb3B0aW9ucykpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBib29sIEZyb21Kc29uKGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uLCBNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgIGNvbnN0IEpzb25QYXJzZU9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgICByZXR1cm4gSnNvblN0cmluZ1RvTWVzc2FnZShqc29uLCBtZXNzYWdlLCBvcHRpb25zKS5vaygpOworICB9CisKKyAgYm9vbCBGcm9tSnNvbihjb25zdCBzdGQ6OnN0cmluZyYganNvbiwgTWVzc2FnZSogbWVzc2FnZSkgeworICAgIHJldHVybiBGcm9tSnNvbihqc29uLCBtZXNzYWdlLCBKc29uUGFyc2VPcHRpb25zKCkpOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPFR5cGVSZXNvbHZlcj4gcmVzb2x2ZXJfOworfTsKKworVEVTVF9GKEpzb25VdGlsVGVzdCwgVGVzdFdoaXRlc3BhY2VzKSB7CisgIFRlc3RNZXNzYWdlIG07CisgIG0ubXV0YWJsZV9tZXNzYWdlX3ZhbHVlKCk7CisKKyAgSnNvblByaW50T3B0aW9ucyBvcHRpb25zOworICBFWFBFQ1RfRVEoIntcIm1lc3NhZ2VWYWx1ZVwiOnt9fSIsIFRvSnNvbihtLCBvcHRpb25zKSk7CisgIG9wdGlvbnMuYWRkX3doaXRlc3BhY2UgPSB0cnVlOworICBFWFBFQ1RfRVEoCisgICAgICAie1xuIgorICAgICAgIiBcIm1lc3NhZ2VWYWx1ZVwiOiB7fVxuIgorICAgICAgIn1cbiIsCisgICAgICBUb0pzb24obSwgb3B0aW9ucykpOworfQorCitURVNUX0YoSnNvblV0aWxUZXN0LCBUZXN0RGVmYXVsdFZhbHVlcykgeworICBUZXN0TWVzc2FnZSBtOworICBKc29uUHJpbnRPcHRpb25zIG9wdGlvbnM7CisgIEVYUEVDVF9FUSgie30iLCBUb0pzb24obSwgb3B0aW9ucykpOworICBvcHRpb25zLmFsd2F5c19wcmludF9wcmltaXRpdmVfZmllbGRzID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKAorICAgICAgIntcImJvb2xWYWx1ZVwiOmZhbHNlLCIKKyAgICAgICJcImludDMyVmFsdWVcIjowLCIKKyAgICAgICJcImludDY0VmFsdWVcIjpcIjBcIiwiCisgICAgICAiXCJ1aW50MzJWYWx1ZVwiOjAsIgorICAgICAgIlwidWludDY0VmFsdWVcIjpcIjBcIiwiCisgICAgICAiXCJmbG9hdFZhbHVlXCI6MCwiCisgICAgICAiXCJkb3VibGVWYWx1ZVwiOjAsIgorICAgICAgIlwic3RyaW5nVmFsdWVcIjpcIlwiLCIKKyAgICAgICJcImJ5dGVzVmFsdWVcIjpcIlwiLCIKKyAgICAgICJcImVudW1WYWx1ZVwiOlwiRk9PXCIsIgorICAgICAgIlwicmVwZWF0ZWRCb29sVmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZEludDMyVmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZEludDY0VmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZFVpbnQzMlZhbHVlXCI6W10sIgorICAgICAgIlwicmVwZWF0ZWRVaW50NjRWYWx1ZVwiOltdLCIKKyAgICAgICJcInJlcGVhdGVkRmxvYXRWYWx1ZVwiOltdLCIKKyAgICAgICJcInJlcGVhdGVkRG91YmxlVmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZFN0cmluZ1ZhbHVlXCI6W10sIgorICAgICAgIlwicmVwZWF0ZWRCeXRlc1ZhbHVlXCI6W10sIgorICAgICAgIlwicmVwZWF0ZWRFbnVtVmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZE1lc3NhZ2VWYWx1ZVwiOltdIgorICAgICAgIn0iLAorICAgICAgVG9Kc29uKG0sIG9wdGlvbnMpKTsKKworICBvcHRpb25zLmFsd2F5c19wcmludF9wcmltaXRpdmVfZmllbGRzID0gdHJ1ZTsKKyAgbS5zZXRfc3RyaW5nX3ZhbHVlKCJpIGFtIGEgdGVzdCBzdHJpbmcgdmFsdWUiKTsKKyAgbS5zZXRfYnl0ZXNfdmFsdWUoImkgYW0gYSB0ZXN0IGJ5dGVzIHZhbHVlIik7CisgIEVYUEVDVF9FUSgKKyAgICAgICJ7XCJib29sVmFsdWVcIjpmYWxzZSwiCisgICAgICAiXCJpbnQzMlZhbHVlXCI6MCwiCisgICAgICAiXCJpbnQ2NFZhbHVlXCI6XCIwXCIsIgorICAgICAgIlwidWludDMyVmFsdWVcIjowLCIKKyAgICAgICJcInVpbnQ2NFZhbHVlXCI6XCIwXCIsIgorICAgICAgIlwiZmxvYXRWYWx1ZVwiOjAsIgorICAgICAgIlwiZG91YmxlVmFsdWVcIjowLCIKKyAgICAgICJcInN0cmluZ1ZhbHVlXCI6XCJpIGFtIGEgdGVzdCBzdHJpbmcgdmFsdWVcIiwiCisgICAgICAiXCJieXRlc1ZhbHVlXCI6XCJhU0JoYlNCaElIUmxjM1FnWW5sMFpYTWdkbUZzZFdVPVwiLCIKKyAgICAgICJcImVudW1WYWx1ZVwiOlwiRk9PXCIsIgorICAgICAgIlwicmVwZWF0ZWRCb29sVmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZEludDMyVmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZEludDY0VmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZFVpbnQzMlZhbHVlXCI6W10sIgorICAgICAgIlwicmVwZWF0ZWRVaW50NjRWYWx1ZVwiOltdLCIKKyAgICAgICJcInJlcGVhdGVkRmxvYXRWYWx1ZVwiOltdLCIKKyAgICAgICJcInJlcGVhdGVkRG91YmxlVmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZFN0cmluZ1ZhbHVlXCI6W10sIgorICAgICAgIlwicmVwZWF0ZWRCeXRlc1ZhbHVlXCI6W10sIgorICAgICAgIlwicmVwZWF0ZWRFbnVtVmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZE1lc3NhZ2VWYWx1ZVwiOltdIgorICAgICAgIn0iLAorICAgICAgVG9Kc29uKG0sIG9wdGlvbnMpKTsKKworICBvcHRpb25zLnByZXNlcnZlX3Byb3RvX2ZpZWxkX25hbWVzID0gdHJ1ZTsKKyAgbS5zZXRfc3RyaW5nX3ZhbHVlKCJpIGFtIGEgdGVzdCBzdHJpbmcgdmFsdWUiKTsKKyAgbS5zZXRfYnl0ZXNfdmFsdWUoImkgYW0gYSB0ZXN0IGJ5dGVzIHZhbHVlIik7CisgIEVYUEVDVF9FUSgKKyAgICAgICJ7XCJib29sX3ZhbHVlXCI6ZmFsc2UsIgorICAgICAgIlwiaW50MzJfdmFsdWVcIjowLCIKKyAgICAgICJcImludDY0X3ZhbHVlXCI6XCIwXCIsIgorICAgICAgIlwidWludDMyX3ZhbHVlXCI6MCwiCisgICAgICAiXCJ1aW50NjRfdmFsdWVcIjpcIjBcIiwiCisgICAgICAiXCJmbG9hdF92YWx1ZVwiOjAsIgorICAgICAgIlwiZG91YmxlX3ZhbHVlXCI6MCwiCisgICAgICAiXCJzdHJpbmdfdmFsdWVcIjpcImkgYW0gYSB0ZXN0IHN0cmluZyB2YWx1ZVwiLCIKKyAgICAgICJcImJ5dGVzX3ZhbHVlXCI6XCJhU0JoYlNCaElIUmxjM1FnWW5sMFpYTWdkbUZzZFdVPVwiLCIKKyAgICAgICJcImVudW1fdmFsdWVcIjpcIkZPT1wiLCIKKyAgICAgICJcInJlcGVhdGVkX2Jvb2xfdmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZF9pbnQzMl92YWx1ZVwiOltdLCIKKyAgICAgICJcInJlcGVhdGVkX2ludDY0X3ZhbHVlXCI6W10sIgorICAgICAgIlwicmVwZWF0ZWRfdWludDMyX3ZhbHVlXCI6W10sIgorICAgICAgIlwicmVwZWF0ZWRfdWludDY0X3ZhbHVlXCI6W10sIgorICAgICAgIlwicmVwZWF0ZWRfZmxvYXRfdmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZF9kb3VibGVfdmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZF9zdHJpbmdfdmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZF9ieXRlc192YWx1ZVwiOltdLCIKKyAgICAgICJcInJlcGVhdGVkX2VudW1fdmFsdWVcIjpbXSwiCisgICAgICAiXCJyZXBlYXRlZF9tZXNzYWdlX3ZhbHVlXCI6W10iCisgICAgICAifSIsCisgICAgICBUb0pzb24obSwgb3B0aW9ucykpOworfQorCitURVNUX0YoSnNvblV0aWxUZXN0LCBUZXN0UHJlc2VydmVQcm90b0ZpZWxkTmFtZXMpIHsKKyAgVGVzdE1lc3NhZ2UgbTsKKyAgbS5tdXRhYmxlX21lc3NhZ2VfdmFsdWUoKTsKKworICBKc29uUHJpbnRPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMucHJlc2VydmVfcHJvdG9fZmllbGRfbmFtZXMgPSB0cnVlOworICBFWFBFQ1RfRVEoIntcIm1lc3NhZ2VfdmFsdWVcIjp7fX0iLCBUb0pzb24obSwgb3B0aW9ucykpOworfQorCitURVNUX0YoSnNvblV0aWxUZXN0LCBUZXN0QWx3YXlzUHJpbnRFbnVtc0FzSW50cykgeworICBUZXN0TWVzc2FnZSBvcmlnOworICBvcmlnLnNldF9lbnVtX3ZhbHVlKHByb3RvMzo6QkFSKTsKKyAgb3JpZy5hZGRfcmVwZWF0ZWRfZW51bV92YWx1ZShwcm90bzM6OkZPTyk7CisgIG9yaWcuYWRkX3JlcGVhdGVkX2VudW1fdmFsdWUocHJvdG8zOjpCQVIpOworCisgIEpzb25QcmludE9wdGlvbnMgcHJpbnRfb3B0aW9uczsKKyAgcHJpbnRfb3B0aW9ucy5hbHdheXNfcHJpbnRfZW51bXNfYXNfaW50cyA9IHRydWU7CisKKyAgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfanNvbiA9ICJ7XCJlbnVtVmFsdWVcIjoxLFwicmVwZWF0ZWRFbnVtVmFsdWVcIjpbMCwxXX0iOworICBFWFBFQ1RfRVEoZXhwZWN0ZWRfanNvbiwgVG9Kc29uKG9yaWcsIHByaW50X29wdGlvbnMpKTsKKworICBUZXN0TWVzc2FnZSBwYXJzZWQ7CisgIEpzb25QYXJzZU9wdGlvbnMgcGFyc2Vfb3B0aW9uczsKKyAgQVNTRVJUX1RSVUUoRnJvbUpzb24oZXhwZWN0ZWRfanNvbiwgJnBhcnNlZCwgcGFyc2Vfb3B0aW9ucykpOworCisgIEVYUEVDVF9FUShwcm90bzM6OkJBUiwgcGFyc2VkLmVudW1fdmFsdWUoKSk7CisgIEVYUEVDVF9FUSgyLCBwYXJzZWQucmVwZWF0ZWRfZW51bV92YWx1ZV9zaXplKCkpOworICBFWFBFQ1RfRVEocHJvdG8zOjpGT08sIHBhcnNlZC5yZXBlYXRlZF9lbnVtX3ZhbHVlKDApKTsKKyAgRVhQRUNUX0VRKHByb3RvMzo6QkFSLCBwYXJzZWQucmVwZWF0ZWRfZW51bV92YWx1ZSgxKSk7Cit9CisKK1RFU1RfRihKc29uVXRpbFRlc3QsIFRlc3RQcmludEVudW1zQXNJbnRzV2l0aERlZmF1bHRWYWx1ZSkgeworICBUZXN0RW51bVZhbHVlIG9yaWc7CisgIC8vIG9yaWcuc2V0X2VudW1fdmFsdWUxKHByb3RvMzo6Rk9PKQorICBvcmlnLnNldF9lbnVtX3ZhbHVlMihwcm90bzM6OkZPTyk7CisgIG9yaWcuc2V0X2VudW1fdmFsdWUzKHByb3RvMzo6QkFSKTsKKworICBKc29uUHJpbnRPcHRpb25zIHByaW50X29wdGlvbnM7CisgIHByaW50X29wdGlvbnMuYWx3YXlzX3ByaW50X2VudW1zX2FzX2ludHMgPSB0cnVlOworICBwcmludF9vcHRpb25zLmFsd2F5c19wcmludF9wcmltaXRpdmVfZmllbGRzID0gdHJ1ZTsKKworICBzdGQ6OnN0cmluZyBleHBlY3RlZF9qc29uID0KKyAgICAgICJ7XCJlbnVtVmFsdWUxXCI6MCxcImVudW1WYWx1ZTJcIjowLFwiZW51bVZhbHVlM1wiOjF9IjsKKyAgRVhQRUNUX0VRKGV4cGVjdGVkX2pzb24sIFRvSnNvbihvcmlnLCBwcmludF9vcHRpb25zKSk7CisKKyAgVGVzdEVudW1WYWx1ZSBwYXJzZWQ7CisgIEpzb25QYXJzZU9wdGlvbnMgcGFyc2Vfb3B0aW9uczsKKyAgQVNTRVJUX1RSVUUoRnJvbUpzb24oZXhwZWN0ZWRfanNvbiwgJnBhcnNlZCwgcGFyc2Vfb3B0aW9ucykpOworCisgIEVYUEVDVF9FUShwcm90bzM6OkZPTywgcGFyc2VkLmVudW1fdmFsdWUxKCkpOworICBFWFBFQ1RfRVEocHJvdG8zOjpGT08sIHBhcnNlZC5lbnVtX3ZhbHVlMigpKTsKKyAgRVhQRUNUX0VRKHByb3RvMzo6QkFSLCBwYXJzZWQuZW51bV92YWx1ZTMoKSk7Cit9CisKK1RFU1RfRihKc29uVXRpbFRlc3QsIFRlc3RQcmludFByb3RvMkVudW1Bc0ludFdpdGhEZWZhdWx0VmFsdWUpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REZWZhdWx0RW51bVZhbHVlIG9yaWc7CisKKyAgSnNvblByaW50T3B0aW9ucyBwcmludF9vcHRpb25zOworICAvLyB1c2UgZW51bSBhcyBpbnQKKyAgcHJpbnRfb3B0aW9ucy5hbHdheXNfcHJpbnRfZW51bXNfYXNfaW50cyA9IHRydWU7CisgIHByaW50X29wdGlvbnMuYWx3YXlzX3ByaW50X3ByaW1pdGl2ZV9maWVsZHMgPSB0cnVlOworCisgIC8vIHJlc3VsdCBzaG91bGQgYmUgaW50IHJhdGhlciB0aGFuIHN0cmluZworICBzdGQ6OnN0cmluZyBleHBlY3RlZF9qc29uID0gIntcImVudW1WYWx1ZVwiOjJ9IjsKKyAgRVhQRUNUX0VRKGV4cGVjdGVkX2pzb24sIFRvSnNvbihvcmlnLCBwcmludF9vcHRpb25zKSk7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REZWZhdWx0RW51bVZhbHVlIHBhcnNlZDsKKyAgSnNvblBhcnNlT3B0aW9ucyBwYXJzZV9vcHRpb25zOworICBBU1NFUlRfVFJVRShGcm9tSnNvbihleHBlY3RlZF9qc29uLCAmcGFyc2VkLCBwYXJzZV9vcHRpb25zKSk7CisKKyAgRVhQRUNUX0VRKHByb3RvYnVmX3VuaXR0ZXN0OjpERUZBVUxULCBwYXJzZWQuZW51bV92YWx1ZSgpKTsKK30KKworVEVTVF9GKEpzb25VdGlsVGVzdCwgUGFyc2VNZXNzYWdlKSB7CisgIC8vIFNvbWUgcmFuZG9tIG1lc3NhZ2UgYnV0IGdvb2QgZW5vdWdoIHRvIHZlcmlmeSB0aGF0IHRoZSBwYXJzaW5nIHdyYXBwZXIKKyAgLy8gZnVuY3Rpb25zIGFyZSB3b3JraW5nIHByb3Blcmx5LgorICBzdGQ6OnN0cmluZyBpbnB1dCA9CisgICAgICAie1xuIgorICAgICAgIiAgXCJpbnQzMlZhbHVlXCI6IDEyMzQ1Njc4OTEsXG4iCisgICAgICAiICBcImludDY0VmFsdWVcIjogNTMwMjQyODcxNjUzNjY5MjczNixcbiIKKyAgICAgICIgIFwiZmxvYXRWYWx1ZVwiOiAzLjQwMjgyMzVlKzM4LFxuIgorICAgICAgIiAgXCJyZXBlYXRlZEludDMyVmFsdWVcIjogWzEsIDJdLFxuIgorICAgICAgIiAgXCJtZXNzYWdlVmFsdWVcIjoge1xuIgorICAgICAgIiAgICBcInZhbHVlXCI6IDIwNDhcbiIKKyAgICAgICIgIH0sXG4iCisgICAgICAiICBcInJlcGVhdGVkTWVzc2FnZVZhbHVlXCI6IFtcbiIKKyAgICAgICIgICAge1widmFsdWVcIjogNDB9LCB7XCJ2YWx1ZVwiOiA5Nn1cbiIKKyAgICAgICIgIF1cbiIKKyAgICAgICJ9XG4iOworICBKc29uUGFyc2VPcHRpb25zIG9wdGlvbnM7CisgIFRlc3RNZXNzYWdlIG07CisgIEFTU0VSVF9UUlVFKEZyb21Kc29uKGlucHV0LCAmbSwgb3B0aW9ucykpOworICBFWFBFQ1RfRVEoMTIzNDU2Nzg5MSwgbS5pbnQzMl92YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKDUzMDI0Mjg3MTY1MzY2OTI3MzYsIG0uaW50NjRfdmFsdWUoKSk7CisgIEVYUEVDVF9FUSgzLjQwMjgyMzQ2NmUrMzhmLCBtLmZsb2F0X3ZhbHVlKCkpOworICBBU1NFUlRfRVEoMiwgbS5yZXBlYXRlZF9pbnQzMl92YWx1ZV9zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgbS5yZXBlYXRlZF9pbnQzMl92YWx1ZSgwKSk7CisgIEVYUEVDVF9FUSgyLCBtLnJlcGVhdGVkX2ludDMyX3ZhbHVlKDEpKTsKKyAgRVhQRUNUX0VRKDIwNDgsIG0ubWVzc2FnZV92YWx1ZSgpLnZhbHVlKCkpOworICBBU1NFUlRfRVEoMiwgbS5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlX3NpemUoKSk7CisgIEVYUEVDVF9FUSg0MCwgbS5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlKDApLnZhbHVlKCkpOworICBFWFBFQ1RfRVEoOTYsIG0ucmVwZWF0ZWRfbWVzc2FnZV92YWx1ZSgxKS52YWx1ZSgpKTsKK30KKworVEVTVF9GKEpzb25VdGlsVGVzdCwgUGFyc2VNYXApIHsKKyAgVGVzdE1hcCBtZXNzYWdlOworICAoKm1lc3NhZ2UubXV0YWJsZV9zdHJpbmdfbWFwKCkpWyJoZWxsbyJdID0gMTIzNDsKKyAgSnNvblByaW50T3B0aW9ucyBwcmludF9vcHRpb25zOworICBKc29uUGFyc2VPcHRpb25zIHBhcnNlX29wdGlvbnM7CisgIEVYUEVDVF9FUSgie1wic3RyaW5nTWFwXCI6e1wiaGVsbG9cIjoxMjM0fX0iLCBUb0pzb24obWVzc2FnZSwgcHJpbnRfb3B0aW9ucykpOworICBUZXN0TWFwIG90aGVyOworICBBU1NFUlRfVFJVRShGcm9tSnNvbihUb0pzb24obWVzc2FnZSwgcHJpbnRfb3B0aW9ucyksICZvdGhlciwgcGFyc2Vfb3B0aW9ucykpOworICBFWFBFQ1RfRVEobWVzc2FnZS5EZWJ1Z1N0cmluZygpLCBvdGhlci5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKEpzb25VdGlsVGVzdCwgUGFyc2VQcmltaXRpdmVNYXBJbikgeworICBNYXBJbiBtZXNzYWdlOworICBKc29uUHJpbnRPcHRpb25zIHByaW50X29wdGlvbnM7CisgIHByaW50X29wdGlvbnMuYWx3YXlzX3ByaW50X3ByaW1pdGl2ZV9maWVsZHMgPSB0cnVlOworICBKc29uUGFyc2VPcHRpb25zIHBhcnNlX29wdGlvbnM7CisgIEVYUEVDVF9FUSgie1wib3RoZXJcIjpcIlwiLFwidGhpbmdzXCI6W10sXCJtYXBJbnB1dFwiOnt9LFwibWFwQW55XCI6e319IiwKKyAgICAgICAgICAgIFRvSnNvbihtZXNzYWdlLCBwcmludF9vcHRpb25zKSk7CisgIE1hcEluIG90aGVyOworICBBU1NFUlRfVFJVRShGcm9tSnNvbihUb0pzb24obWVzc2FnZSwgcHJpbnRfb3B0aW9ucyksICZvdGhlciwgcGFyc2Vfb3B0aW9ucykpOworICBFWFBFQ1RfRVEobWVzc2FnZS5EZWJ1Z1N0cmluZygpLCBvdGhlci5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKEpzb25VdGlsVGVzdCwgUHJpbnRQcmltaXRpdmVPbmVvZikgeworICBUZXN0T25lb2YgbWVzc2FnZTsKKyAgSnNvblByaW50T3B0aW9ucyBvcHRpb25zOworICBvcHRpb25zLmFsd2F5c19wcmludF9wcmltaXRpdmVfZmllbGRzID0gdHJ1ZTsKKyAgbWVzc2FnZS5tdXRhYmxlX29uZW9mX21lc3NhZ2VfdmFsdWUoKTsKKyAgRVhQRUNUX0VRKCJ7XCJvbmVvZk1lc3NhZ2VWYWx1ZVwiOntcInZhbHVlXCI6MH19IiwgVG9Kc29uKG1lc3NhZ2UsIG9wdGlvbnMpKTsKKworICBtZXNzYWdlLnNldF9vbmVvZl9pbnQzMl92YWx1ZSgxKTsKKyAgRVhQRUNUX0VRKCJ7XCJvbmVvZkludDMyVmFsdWVcIjoxfSIsIFRvSnNvbihtZXNzYWdlLCBvcHRpb25zKSk7Cit9CisKK1RFU1RfRihKc29uVXRpbFRlc3QsIFRlc3RQYXJzZUlnbm9yZVVua25vd25GaWVsZHMpIHsKKyAgVGVzdE1lc3NhZ2UgbTsKKyAgSnNvblBhcnNlT3B0aW9ucyBvcHRpb25zOworICBvcHRpb25zLmlnbm9yZV91bmtub3duX2ZpZWxkcyA9IHRydWU7CisgIEVYUEVDVF9UUlVFKEZyb21Kc29uKCJ7XCJ1bmtub3duTmFtZVwiOjB9IiwgJm0sIG9wdGlvbnMpKTsKK30KKworVEVTVF9GKEpzb25VdGlsVGVzdCwgVGVzdFBhcnNlRXJyb3JzKSB7CisgIFRlc3RNZXNzYWdlIG07CisgIEpzb25QYXJzZU9wdGlvbnMgb3B0aW9uczsKKyAgLy8gUGFyc2luZyBzaG91bGQgZmFpbCBpZiB0aGUgZmllbGQgbmFtZSBjYW4gbm90IGJlIHJlY29nbml6ZWQuCisgIEVYUEVDVF9GQUxTRShGcm9tSnNvbigie1widW5rbm93bk5hbWVcIjowfSIsICZtLCBvcHRpb25zKSk7CisgIC8vIFBhcnNpbmcgc2hvdWxkIGZhaWwgaWYgdGhlIHZhbHVlIGlzIGludmFsaWQuCisgIEVYUEVDVF9GQUxTRShGcm9tSnNvbigie1wiaW50MzJWYWx1ZVwiOjIxNDc0ODM2NDh9IiwgJm0sIG9wdGlvbnMpKTsKK30KKworVEVTVF9GKEpzb25VdGlsVGVzdCwgVGVzdER5bmFtaWNNZXNzYWdlKSB7CisgIC8vIFNvbWUgcmFuZG9tIG1lc3NhZ2UgYnV0IGdvb2QgZW5vdWdoIHRvIHRlc3QgdGhlIHdyYXBwZXIgZnVuY3Rpb25zLgorICBzdGQ6OnN0cmluZyBpbnB1dCA9CisgICAgICAie1xuIgorICAgICAgIiAgXCJpbnQzMlZhbHVlXCI6IDEwMjQsXG4iCisgICAgICAiICBcInJlcGVhdGVkSW50MzJWYWx1ZVwiOiBbMSwgMl0sXG4iCisgICAgICAiICBcIm1lc3NhZ2VWYWx1ZVwiOiB7XG4iCisgICAgICAiICAgIFwidmFsdWVcIjogMjA0OFxuIgorICAgICAgIiAgfSxcbiIKKyAgICAgICIgIFwicmVwZWF0ZWRNZXNzYWdlVmFsdWVcIjogW1xuIgorICAgICAgIiAgICB7XCJ2YWx1ZVwiOiA0MH0sIHtcInZhbHVlXCI6IDk2fVxuIgorICAgICAgIiAgXVxuIgorICAgICAgIn1cbiI7CisKKyAgLy8gQ3JlYXRlIGEgbmV3IERlc2NyaXB0b3JQb29sIHdpdGggdGhlIHNhbWUgcHJvdG9zIGFzIHRoZSBnZW5lcmF0ZWQgb25lLgorICBEZXNjcmlwdG9yUG9vbERhdGFiYXNlIGRhdGFiYXNlKCpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSk7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlKTsKKyAgLy8gQSBkeW5hbWljIHZlcnNpb24gb2YgdGhlIHRlc3QgcHJvdG8uCisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OworICBzdGQ6OnVuaXF1ZV9wdHI8TWVzc2FnZT4gbWVzc2FnZSgKKyAgICAgIGZhY3RvcnkuR2V0UHJvdG90eXBlKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJwcm90bzMuVGVzdE1lc3NhZ2UiKSkKKyAgICAgICAgICAtPk5ldygpKTsKKyAgRVhQRUNUX1RSVUUoRnJvbUpzb24oaW5wdXQsIG1lc3NhZ2UuZ2V0KCkpKTsKKworICAvLyBDb252ZXJ0IHRvIGdlbmVyYXRlZCBtZXNzYWdlIGZvciBlYXN5IGluc3BlY3Rpb24uCisgIFRlc3RNZXNzYWdlIGdlbmVyYXRlZDsKKyAgRVhQRUNUX1RSVUUoZ2VuZXJhdGVkLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLT5TZXJpYWxpemVBc1N0cmluZygpKSk7CisgIEVYUEVDVF9FUSgxMDI0LCBnZW5lcmF0ZWQuaW50MzJfdmFsdWUoKSk7CisgIEFTU0VSVF9FUSgyLCBnZW5lcmF0ZWQucmVwZWF0ZWRfaW50MzJfdmFsdWVfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIGdlbmVyYXRlZC5yZXBlYXRlZF9pbnQzMl92YWx1ZSgwKSk7CisgIEVYUEVDVF9FUSgyLCBnZW5lcmF0ZWQucmVwZWF0ZWRfaW50MzJfdmFsdWUoMSkpOworICBFWFBFQ1RfRVEoMjA0OCwgZ2VuZXJhdGVkLm1lc3NhZ2VfdmFsdWUoKS52YWx1ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIGdlbmVyYXRlZC5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlX3NpemUoKSk7CisgIEVYUEVDVF9FUSg0MCwgZ2VuZXJhdGVkLnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUoMCkudmFsdWUoKSk7CisgIEVYUEVDVF9FUSg5NiwgZ2VuZXJhdGVkLnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUoMSkudmFsdWUoKSk7CisKKyAgSnNvbk9wdGlvbnMgb3B0aW9uczsKKyAgRVhQRUNUX0VRKFRvSnNvbihnZW5lcmF0ZWQsIG9wdGlvbnMpLCBUb0pzb24oKm1lc3NhZ2UsIG9wdGlvbnMpKTsKK30KKworVEVTVF9GKEpzb25VdGlsVGVzdCwgVGVzdFBhcnNpbmdVbmtub3duQW55RmllbGRzKSB7CisgIHN0ZDo6c3RyaW5nIGlucHV0ID0KKyAgICAgICJ7XG4iCisgICAgICAiICBcInZhbHVlXCI6IHtcbiIKKyAgICAgICIgICAgXCJAdHlwZVwiOiBcInR5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG8zLlRlc3RNZXNzYWdlXCIsXG4iCisgICAgICAiICAgIFwidW5rbm93bl9maWVsZFwiOiBcIlVOS05PV05fVkFMVUVcIixcbiIKKyAgICAgICIgICAgXCJzdHJpbmdfdmFsdWVcIjogXCJleHBlY3RlZF92YWx1ZVwiXG4iCisgICAgICAiICB9XG4iCisgICAgICAifSI7CisKKyAgVGVzdEFueSBtOworICBKc29uUGFyc2VPcHRpb25zIG9wdGlvbnM7CisgIEVYUEVDVF9GQUxTRShGcm9tSnNvbihpbnB1dCwgJm0sIG9wdGlvbnMpKTsKKworICBvcHRpb25zLmlnbm9yZV91bmtub3duX2ZpZWxkcyA9IHRydWU7CisgIEVYUEVDVF9UUlVFKEZyb21Kc29uKGlucHV0LCAmbSwgb3B0aW9ucykpOworCisgIFRlc3RNZXNzYWdlIHQ7CisgIEVYUEVDVF9UUlVFKG0udmFsdWUoKS5VbnBhY2tUbygmdCkpOworICBFWFBFQ1RfRVEoImV4cGVjdGVkX3ZhbHVlIiwgdC5zdHJpbmdfdmFsdWUoKSk7Cit9CisKK1RFU1RfRihKc29uVXRpbFRlc3QsIFRlc3RQYXJzaW5nVW5rbm93bkVudW1zUHJvdG8yKSB7CisgIHN0ZDo6c3RyaW5nIGlucHV0ID0KKyAgICAgICJ7XG4iCisgICAgICAiICBcImFcIjogXCJVTktOT1dOX1ZBTFVFXCJcbiIKKyAgICAgICJ9IjsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3ROdW1iZXJzIG07CisgIEpzb25QYXJzZU9wdGlvbnMgb3B0aW9uczsKKyAgRVhQRUNUX0ZBTFNFKEZyb21Kc29uKGlucHV0LCAmbSwgb3B0aW9ucykpOworCisgIG9wdGlvbnMuaWdub3JlX3Vua25vd25fZmllbGRzID0gdHJ1ZTsKKyAgRVhQRUNUX1RSVUUoRnJvbUpzb24oaW5wdXQsICZtLCBvcHRpb25zKSk7CisgIEVYUEVDVF9GQUxTRShtLmhhc19hKCkpOworfQorCitURVNUX0YoSnNvblV0aWxUZXN0LCBUZXN0UGFyc2luZ1Vua25vd25FbnVtc1Byb3RvMykgeworICBUZXN0TWVzc2FnZSBtOworICB7CisgICAgSnNvblBhcnNlT3B0aW9ucyBvcHRpb25zOworICAgIEFTU0VSVF9GQUxTRShvcHRpb25zLmlnbm9yZV91bmtub3duX2ZpZWxkcyk7CisgICAgc3RkOjpzdHJpbmcgaW5wdXQgPQorICAgICAgICAie1xuIgorICAgICAgICAiICBcImVudW1fdmFsdWVcIjpcIlVOS05PV05fVkFMVUVcIlxuIgorICAgICAgICAifSI7CisgICAgbS5zZXRfZW51bV92YWx1ZShwcm90bzM6OkJBUik7CisgICAgRVhQRUNUX0ZBTFNFKEZyb21Kc29uKGlucHV0LCAmbSwgb3B0aW9ucykpOworICAgIEFTU0VSVF9FUShwcm90bzM6OkJBUiwgbS5lbnVtX3ZhbHVlKCkpOyAgLy8gS2VlcCBwcmV2aW91cyB2YWx1ZQorCisgICAgb3B0aW9ucy5pZ25vcmVfdW5rbm93bl9maWVsZHMgPSB0cnVlOworICAgIEVYUEVDVF9UUlVFKEZyb21Kc29uKGlucHV0LCAmbSwgb3B0aW9ucykpOworICAgIEVYUEVDVF9FUSgwLCBtLmVudW1fdmFsdWUoKSk7ICAvLyBVbmtub3duIGVudW0gdmFsdWUgbXVzdCBiZSBkZWNvZGVkIGFzIDAKKyAgfQorICAvLyBJbnRlZ2VyIHZhbHVlcyBhcmUgcmVhZCBhcyB1c3VhbAorICB7CisgICAgSnNvblBhcnNlT3B0aW9ucyBvcHRpb25zOworICAgIHN0ZDo6c3RyaW5nIGlucHV0ID0KKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgXCJlbnVtX3ZhbHVlXCI6MTIzNDVcbiIKKyAgICAgICAgIn0iOworICAgIG0uc2V0X2VudW1fdmFsdWUocHJvdG8zOjpCQVIpOworICAgIEVYUEVDVF9UUlVFKEZyb21Kc29uKGlucHV0LCAmbSwgb3B0aW9ucykpOworICAgIEFTU0VSVF9FUSgxMjM0NSwgbS5lbnVtX3ZhbHVlKCkpOworCisgICAgb3B0aW9ucy5pZ25vcmVfdW5rbm93bl9maWVsZHMgPSB0cnVlOworICAgIEVYUEVDVF9UUlVFKEZyb21Kc29uKGlucHV0LCAmbSwgb3B0aW9ucykpOworICAgIEVYUEVDVF9FUSgxMjM0NSwgbS5lbnVtX3ZhbHVlKCkpOworICB9CisKKyAgLy8gVHJ5aW5nIHRvIHBhc3MgYW4gb2JqZWN0IGFzIGFuIGVudW0gZmllbGQgdmFsdWUgaXMgYWx3YXlzIHRyZWF0ZWQgYXMgYW4KKyAgLy8gZXJyb3IKKyAgeworICAgIEpzb25QYXJzZU9wdGlvbnMgb3B0aW9uczsKKyAgICBzdGQ6OnN0cmluZyBpbnB1dCA9CisgICAgICAgICJ7XG4iCisgICAgICAgICIgIFwiZW51bV92YWx1ZVwiOnt9XG4iCisgICAgICAgICJ9IjsKKyAgICBvcHRpb25zLmlnbm9yZV91bmtub3duX2ZpZWxkcyA9IHRydWU7CisgICAgRVhQRUNUX0ZBTFNFKEZyb21Kc29uKGlucHV0LCAmbSwgb3B0aW9ucykpOworICAgIG9wdGlvbnMuaWdub3JlX3Vua25vd25fZmllbGRzID0gZmFsc2U7CisgICAgRVhQRUNUX0ZBTFNFKEZyb21Kc29uKGlucHV0LCAmbSwgb3B0aW9ucykpOworICB9CisgIC8vIFRyeWluZyB0byBwYXNzIGFuIGFycmF5IGFzIGFuIGVudW0gZmllbGQgdmFsdWUgaXMgYWx3YXlzIHRyZWF0ZWQgYXMgYW4KKyAgLy8gZXJyb3IKKyAgeworICAgIEpzb25QYXJzZU9wdGlvbnMgb3B0aW9uczsKKyAgICBzdGQ6OnN0cmluZyBpbnB1dCA9CisgICAgICAgICJ7XG4iCisgICAgICAgICIgIFwiZW51bV92YWx1ZVwiOltdXG4iCisgICAgICAgICJ9IjsKKyAgICBFWFBFQ1RfRkFMU0UoRnJvbUpzb24oaW5wdXQsICZtLCBvcHRpb25zKSk7CisgICAgb3B0aW9ucy5pZ25vcmVfdW5rbm93bl9maWVsZHMgPSB0cnVlOworICAgIEVYUEVDVF9GQUxTRShGcm9tSnNvbihpbnB1dCwgJm0sIG9wdGlvbnMpKTsKKyAgfQorfQorCitURVNUX0YoSnNvblV0aWxUZXN0LCBUZXN0UGFyc2luZ0VudW1JZ25vcmVDYXNlKSB7CisgIFRlc3RNZXNzYWdlIG07CisgIHsKKyAgICBKc29uUGFyc2VPcHRpb25zIG9wdGlvbnM7CisgICAgc3RkOjpzdHJpbmcgaW5wdXQgPQorICAgICAgICAie1xuIgorICAgICAgICAiICBcImVudW1fdmFsdWVcIjpcImJhclwiXG4iCisgICAgICAgICJ9IjsKKyAgICBtLnNldF9lbnVtX3ZhbHVlKHByb3RvMzo6Rk9PKTsKKyAgICBFWFBFQ1RfRkFMU0UoRnJvbUpzb24oaW5wdXQsICZtLCBvcHRpb25zKSk7CisgICAgLy8gRGVmYXVsdCBiZWhhdmlvciBpcyBjYXNlLXNlbnNpdGl2ZSwgc28ga2VlcCBwcmV2aW91cyB2YWx1ZS4KKyAgICBBU1NFUlRfRVEocHJvdG8zOjpGT08sIG0uZW51bV92YWx1ZSgpKTsKKyAgfQorICB7CisgICAgSnNvblBhcnNlT3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY2FzZV9pbnNlbnNpdGl2ZV9lbnVtX3BhcnNpbmcgPSBmYWxzZTsKKyAgICBzdGQ6OnN0cmluZyBpbnB1dCA9CisgICAgICAgICJ7XG4iCisgICAgICAgICIgIFwiZW51bV92YWx1ZVwiOlwiYmFyXCJcbiIKKyAgICAgICAgIn0iOworICAgIG0uc2V0X2VudW1fdmFsdWUocHJvdG8zOjpGT08pOworICAgIEVYUEVDVF9GQUxTRShGcm9tSnNvbihpbnB1dCwgJm0sIG9wdGlvbnMpKTsKKyAgICBBU1NFUlRfRVEocHJvdG8zOjpGT08sIG0uZW51bV92YWx1ZSgpKTsgIC8vIEtlZXAgcHJldmlvdXMgdmFsdWUKKyAgfQorICB7CisgICAgSnNvblBhcnNlT3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY2FzZV9pbnNlbnNpdGl2ZV9lbnVtX3BhcnNpbmcgPSB0cnVlOworICAgIHN0ZDo6c3RyaW5nIGlucHV0ID0KKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgXCJlbnVtX3ZhbHVlXCI6XCJiYXJcIlxuIgorICAgICAgICAifSI7CisgICAgbS5zZXRfZW51bV92YWx1ZShwcm90bzM6OkZPTyk7CisgICAgRVhQRUNUX1RSVUUoRnJvbUpzb24oaW5wdXQsICZtLCBvcHRpb25zKSk7CisgICAgQVNTRVJUX0VRKHByb3RvMzo6QkFSLCBtLmVudW1fdmFsdWUoKSk7CisgIH0KK30KKwordHlwZWRlZiBzdGQ6OnBhaXI8Y2hhciosIGludD4gU2VnbWVudDsKKy8vIEEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gdGhhdCB3cml0ZXMgdG8gbXVsdGlwbGUgYnVmZmVycy4KK2NsYXNzIFNlZ21lbnRlZFplcm9Db3B5T3V0cHV0U3RyZWFtIDogcHVibGljIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSB7CisgcHVibGljOgorICBleHBsaWNpdCBTZWdtZW50ZWRaZXJvQ29weU91dHB1dFN0cmVhbShzdGQ6Omxpc3Q8U2VnbWVudD4gc2VnbWVudHMpCisgICAgICA6IHNlZ21lbnRzXyhzZWdtZW50cyksCisgICAgICAgIGxhc3Rfc2VnbWVudF8oc3RhdGljX2Nhc3Q8Y2hhcio+KE5VTEwpLCAwKSwKKyAgICAgICAgYnl0ZV9jb3VudF8oMCkge30KKworICBib29sIE5leHQodm9pZCoqIGJ1ZmZlciwgaW50KiBsZW5ndGgpIG92ZXJyaWRlIHsKKyAgICBpZiAoc2VnbWVudHNfLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbGFzdF9zZWdtZW50XyA9IHNlZ21lbnRzXy5mcm9udCgpOworICAgIHNlZ21lbnRzXy5wb3BfZnJvbnQoKTsKKyAgICAqYnVmZmVyID0gbGFzdF9zZWdtZW50Xy5maXJzdDsKKyAgICAqbGVuZ3RoID0gbGFzdF9zZWdtZW50Xy5zZWNvbmQ7CisgICAgYnl0ZV9jb3VudF8gKz0gKmxlbmd0aDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHZvaWQgQmFja1VwKGludCBsZW5ndGgpIG92ZXJyaWRlIHsKKyAgICBHT09HTEVfQ0hFQ0sobGVuZ3RoIDw9IGxhc3Rfc2VnbWVudF8uc2Vjb25kKTsKKyAgICBzZWdtZW50c18ucHVzaF9mcm9udCgKKyAgICAgICAgU2VnbWVudChsYXN0X3NlZ21lbnRfLmZpcnN0ICsgbGFzdF9zZWdtZW50Xy5zZWNvbmQgLSBsZW5ndGgsIGxlbmd0aCkpOworICAgIGxhc3Rfc2VnbWVudF8gPSBTZWdtZW50KGxhc3Rfc2VnbWVudF8uZmlyc3QsIGxhc3Rfc2VnbWVudF8uc2Vjb25kIC0gbGVuZ3RoKTsKKyAgICBieXRlX2NvdW50XyAtPSBsZW5ndGg7CisgIH0KKworICBpbnQ2NF90IEJ5dGVDb3VudCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGJ5dGVfY291bnRfOyB9CisKKyBwcml2YXRlOgorICBzdGQ6Omxpc3Q8U2VnbWVudD4gc2VnbWVudHNfOworICBTZWdtZW50IGxhc3Rfc2VnbWVudF87CisgIGludDY0X3QgYnl0ZV9jb3VudF87Cit9OworCisvLyBUaGlzIHRlc3Qgc3BsaXRzIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCBhbHNvIHRoZSBpbnB1dCBkYXRhIGludG8gbXVsdGlwbGUKKy8vIHNlZ21lbnRzIGFuZCBjaGVja3MgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gb2YgWmVyb0NvcHlTdHJlYW1CeXRlU2luaworLy8gaGFuZGxlcyBhbGwgcG9zc2libGUgY2FzZXMgY29ycmVjdGx5LgorVEVTVChaZXJvQ29weVN0cmVhbUJ5dGVTaW5rVGVzdCwgVGVzdEFsbElucHV0T3V0cHV0UGF0dGVybnMpIHsKKyAgc3RhdGljIGNvbnN0IGludCBrT3V0cHV0QnVmZmVyTGVuZ3RoID0gMTA7CisgIC8vIEFuIGV4aGF1c3RpdmUgdGVzdCB0YWtlcyB0b28gbG9uZywgc2tpcCBzb21lIGNvbWJpbmF0aW9ucyB0byBtYWtlIHRoZSB0ZXN0CisgIC8vIHJ1biBmYXN0ZXIuCisgIHN0YXRpYyBjb25zdCBpbnQga1NraXBwZWRQYXR0ZXJuQ291bnQgPSA3OworCisgIGNoYXIgYnVmZmVyW2tPdXRwdXRCdWZmZXJMZW5ndGhdOworICBmb3IgKGludCBzcGxpdF9wYXR0ZXJuID0gMDsgc3BsaXRfcGF0dGVybiA8ICgxIDw8IChrT3V0cHV0QnVmZmVyTGVuZ3RoIC0gMSkpOworICAgICAgIHNwbGl0X3BhdHRlcm4gKz0ga1NraXBwZWRQYXR0ZXJuQ291bnQpIHsKKyAgICAvLyBTcGxpdCB0aGUgYnVmZmVyIGludG8gc21hbGwgc2VnbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBzcGxpdF9wYXR0ZXJuLgorICAgIHN0ZDo6bGlzdDxTZWdtZW50PiBzZWdtZW50czsKKyAgICBpbnQgc2VnbWVudF9zdGFydCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrT3V0cHV0QnVmZmVyTGVuZ3RoIC0gMTsgKytpKSB7CisgICAgICBpZiAoc3BsaXRfcGF0dGVybiAmICgxIDw8IGkpKSB7CisgICAgICAgIHNlZ21lbnRzLnB1c2hfYmFjaygKKyAgICAgICAgICAgIFNlZ21lbnQoYnVmZmVyICsgc2VnbWVudF9zdGFydCwgaSAtIHNlZ21lbnRfc3RhcnQgKyAxKSk7CisgICAgICAgIHNlZ21lbnRfc3RhcnQgPSBpICsgMTsKKyAgICAgIH0KKyAgICB9CisgICAgc2VnbWVudHMucHVzaF9iYWNrKAorICAgICAgICBTZWdtZW50KGJ1ZmZlciArIHNlZ21lbnRfc3RhcnQsIGtPdXRwdXRCdWZmZXJMZW5ndGggLSBzZWdtZW50X3N0YXJ0KSk7CisKKyAgICAvLyBXcml0ZSBleGFjdGx5IDEwIGJ5dGVzIHRocm91Z2ggdGhlIEJ5dGVTaW5rLgorICAgIHN0ZDo6c3RyaW5nIGlucHV0X2RhdGEgPSAiMDEyMzQ1Njc4OSI7CisgICAgZm9yIChpbnQgaW5wdXRfcGF0dGVybiA9IDA7IGlucHV0X3BhdHRlcm4gPCAoMSA8PCAoaW5wdXRfZGF0YS5zaXplKCkgLSAxKSk7CisgICAgICAgICBpbnB1dF9wYXR0ZXJuICs9IGtTa2lwcGVkUGF0dGVybkNvdW50KSB7CisgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICB7CisgICAgICAgIFNlZ21lbnRlZFplcm9Db3B5T3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oc2VnbWVudHMpOworICAgICAgICBpbnRlcm5hbDo6WmVyb0NvcHlTdHJlYW1CeXRlU2luayBieXRlX3NpbmsoJm91dHB1dF9zdHJlYW0pOworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGlucHV0X2RhdGEubGVuZ3RoKCkgLSAxOyArK2opIHsKKyAgICAgICAgICBpZiAoaW5wdXRfcGF0dGVybiAmICgxIDw8IGopKSB7CisgICAgICAgICAgICBieXRlX3NpbmsuQXBwZW5kKCZpbnB1dF9kYXRhW3N0YXJ0XSwgaiAtIHN0YXJ0ICsgMSk7CisgICAgICAgICAgICBzdGFydCA9IGogKyAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBieXRlX3NpbmsuQXBwZW5kKCZpbnB1dF9kYXRhW3N0YXJ0XSwgaW5wdXRfZGF0YS5sZW5ndGgoKSAtIHN0YXJ0KTsKKyAgICAgIH0KKyAgICAgIEVYUEVDVF9FUShpbnB1dF9kYXRhLCBzdGQ6OnN0cmluZyhidWZmZXIsIGlucHV0X2RhdGEubGVuZ3RoKCkpKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBvbmx5IDkgYnl0ZXMgdGhyb3VnaCB0aGUgQnl0ZVNpbmsuCisgICAgaW5wdXRfZGF0YSA9ICIwMTIzNDU2NzgiOworICAgIGZvciAoaW50IGlucHV0X3BhdHRlcm4gPSAwOyBpbnB1dF9wYXR0ZXJuIDwgKDEgPDwgKGlucHV0X2RhdGEuc2l6ZSgpIC0gMSkpOworICAgICAgICAgaW5wdXRfcGF0dGVybiArPSBrU2tpcHBlZFBhdHRlcm5Db3VudCkgeworICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgeworICAgICAgICBTZWdtZW50ZWRaZXJvQ29weU91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKHNlZ21lbnRzKTsKKyAgICAgICAgaW50ZXJuYWw6Olplcm9Db3B5U3RyZWFtQnl0ZVNpbmsgYnl0ZV9zaW5rKCZvdXRwdXRfc3RyZWFtKTsKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbnB1dF9kYXRhLmxlbmd0aCgpIC0gMTsgKytqKSB7CisgICAgICAgICAgaWYgKGlucHV0X3BhdHRlcm4gJiAoMSA8PCBqKSkgeworICAgICAgICAgICAgYnl0ZV9zaW5rLkFwcGVuZCgmaW5wdXRfZGF0YVtzdGFydF0sIGogLSBzdGFydCArIDEpOworICAgICAgICAgICAgc3RhcnQgPSBqICsgMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnl0ZV9zaW5rLkFwcGVuZCgmaW5wdXRfZGF0YVtzdGFydF0sIGlucHV0X2RhdGEubGVuZ3RoKCkgLSBzdGFydCk7CisgICAgICB9CisgICAgICBFWFBFQ1RfRVEoaW5wdXRfZGF0YSwgc3RkOjpzdHJpbmcoYnVmZmVyLCBpbnB1dF9kYXRhLmxlbmd0aCgpKSk7CisgICAgICBFWFBFQ1RfRVEoMCwgYnVmZmVyW2lucHV0X2RhdGEubGVuZ3RoKCldKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSAxMSBieXRlcyB0aHJvdWdoIHRoZSBCeXRlU2luay4gVGhlIGV4dHJhIGJ5dGUgd2lsbCBqdXN0CisgICAgLy8gYmUgaWdub3JlZC4KKyAgICBpbnB1dF9kYXRhID0gIjAxMjM0NTY3ODlBIjsKKyAgICBmb3IgKGludCBpbnB1dF9wYXR0ZXJuID0gMDsgaW5wdXRfcGF0dGVybiA8ICgxIDw8IChpbnB1dF9kYXRhLnNpemUoKSAtIDEpKTsKKyAgICAgICAgIGlucHV0X3BhdHRlcm4gKz0ga1NraXBwZWRQYXR0ZXJuQ291bnQpIHsKKyAgICAgIG1lbXNldChidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKKyAgICAgIHsKKyAgICAgICAgU2VnbWVudGVkWmVyb0NvcHlPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbShzZWdtZW50cyk7CisgICAgICAgIGludGVybmFsOjpaZXJvQ29weVN0cmVhbUJ5dGVTaW5rIGJ5dGVfc2luaygmb3V0cHV0X3N0cmVhbSk7CisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW5wdXRfZGF0YS5sZW5ndGgoKSAtIDE7ICsraikgeworICAgICAgICAgIGlmIChpbnB1dF9wYXR0ZXJuICYgKDEgPDwgaikpIHsKKyAgICAgICAgICAgIGJ5dGVfc2luay5BcHBlbmQoJmlucHV0X2RhdGFbc3RhcnRdLCBqIC0gc3RhcnQgKyAxKTsKKyAgICAgICAgICAgIHN0YXJ0ID0gaiArIDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJ5dGVfc2luay5BcHBlbmQoJmlucHV0X2RhdGFbc3RhcnRdLCBpbnB1dF9kYXRhLmxlbmd0aCgpIC0gc3RhcnQpOworICAgICAgfQorICAgICAgRVhQRUNUX0VRKGlucHV0X2RhdGEuc3Vic3RyKDAsIGtPdXRwdXRCdWZmZXJMZW5ndGgpLAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGJ1ZmZlciwga091dHB1dEJ1ZmZlckxlbmd0aCkpOworICAgIH0KKyAgfQorfQorCitURVNUX0YoSnNvblV0aWxUZXN0LCBUZXN0V3JvbmdKc29uSW5wdXQpIHsKKyAgY29uc3QgY2hhciBqc29uW10gPSAie1widW5rbm93bl9maWVsZFwiOlwic29tZV92YWx1ZVwifSI7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShqc29uLCBzdHJsZW4oanNvbikpOworICBjaGFyIHByb3RvX2J1ZmZlclsxMDAwMF07CisgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKHByb3RvX2J1ZmZlciwgc2l6ZW9mKHByb3RvX2J1ZmZlcikpOworICBzdGQ6OnN0cmluZyBtZXNzYWdlX3R5cGUgPSAidHlwZS5nb29nbGVhcGlzLmNvbS9wcm90bzMuVGVzdE1lc3NhZ2UiOworICBUeXBlUmVzb2x2ZXIqIHJlc29sdmVyID0gTmV3VHlwZVJlc29sdmVyRm9yRGVzY3JpcHRvclBvb2woCisgICAgICAidHlwZS5nb29nbGVhcGlzLmNvbSIsIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKTsKKworICBhdXRvIHJlc3VsdF9zdGF0dXMgPSB1dGlsOjpKc29uVG9CaW5hcnlTdHJlYW0ocmVzb2x2ZXIsIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dF9zdHJlYW0sICZvdXRwdXRfc3RyZWFtKTsKKworICBkZWxldGUgcmVzb2x2ZXI7CisKKyAgRVhQRUNUX0ZBTFNFKHJlc3VsdF9zdGF0dXMub2soKSk7CisgIEVYUEVDVF9UUlVFKHV0aWw6OklzSW52YWxpZEFyZ3VtZW50KHJlc3VsdF9zdGF0dXMpKTsKK30KKworVEVTVF9GKEpzb25VdGlsVGVzdCwgSHRtbEVzY2FwZSkgeworICBUZXN0TWVzc2FnZSBtOworICBtLnNldF9zdHJpbmdfdmFsdWUoIjwvc2NyaXB0PiIpOworICBKc29uUHJpbnRPcHRpb25zIG9wdGlvbnM7CisgIEVYUEVDVF9FUSgie1wic3RyaW5nVmFsdWVcIjpcIlxcdTAwM2Mvc2NyaXB0XFx1MDAzZVwifSIsIFRvSnNvbihtLCBvcHRpb25zKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDU2MGVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuY2MKQEAgLTAsMCArMSwyMjQ2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBqc2Nob3JyQGdvb2dsZS5jb20gKEpvc2VwaCBTY2hvcnIpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmg+CisKKy8vIEFsd2F5cyBpbmNsdWRlIGFzIGxhc3Qgb25lLCBvdGhlcndpc2UgaXQgY2FuIGJyZWFrIGNvbXBpbGF0aW9uCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCituYW1lc3BhY2UgdXRpbCB7CisKK25hbWVzcGFjZSB7CisKK3N0ZDo6c3RyaW5nIFByaW50U2hvcnRUZXh0Rm9ybWF0KGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgc3RkOjpzdHJpbmcgZGVidWdfc3RyaW5nOworCisgIGdvb2dsZTo6cHJvdG9idWY6OlRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgcHJpbnRlci5TZXRTaW5nbGVMaW5lTW9kZSh0cnVlKTsKKyAgcHJpbnRlci5TZXRFeHBhbmRBbnkodHJ1ZSk7CisKKyAgcHJpbnRlci5QcmludFRvU3RyaW5nKG1lc3NhZ2UsICZkZWJ1Z19zdHJpbmcpOworICAvLyBTaW5nbGUgbGluZSBtb2RlIGN1cnJlbnRseSBtaWdodCBoYXZlIGFuIGV4dHJhIHNwYWNlIGF0IHRoZSBlbmQuCisgIGlmICghZGVidWdfc3RyaW5nLmVtcHR5KCkgJiYgZGVidWdfc3RyaW5nW2RlYnVnX3N0cmluZy5zaXplKCkgLSAxXSA9PSAnICcpIHsKKyAgICBkZWJ1Z19zdHJpbmcucmVzaXplKGRlYnVnX3N0cmluZy5zaXplKCkgLSAxKTsKKyAgfQorCisgIHJldHVybiBkZWJ1Z19zdHJpbmc7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBBIHJlcG9ydGVyIHRvIHJlcG9ydCB0aGUgdG90YWwgbnVtYmVyIG9mIGRpZmZzLgorLy8gVE9ETyh5a3podSk6IHdlIGNhbiBpbXByb3ZlIHRoaXMgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIHZhbHVlIGRpZmZlcmVuY2Vycy4KK2NsYXNzIE51bURpZmZzUmVwb3J0ZXIgOiBwdWJsaWMgZ29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpSZXBvcnRlciB7CisgcHVibGljOgorICBOdW1EaWZmc1JlcG9ydGVyKCkgOiBudW1fZGlmZnNfKDApIHt9CisKKyAgLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGRpZmZzLgorICBpbnQzMl90IEdldE51bURpZmZzKCkgY29uc3QgeyByZXR1cm4gbnVtX2RpZmZzXzsgfQorICB2b2lkIFJlc2V0KCkgeyBudW1fZGlmZnNfID0gMDsgfQorCisgIC8vIFJlcG9ydCB0aGF0IGEgZmllbGQgaGFzIGJlZW4gYWRkZWQgaW50byBNZXNzYWdlMi4KKyAgdm9pZCBSZXBvcnRBZGRlZCgKKyAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIC8qIG1lc3NhZ2UxICovLAorICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgLyogbWVzc2FnZTIgKi8sCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OlNwZWNpZmljRmllbGQ+JgorICAgICAgLypmaWVsZF9wYXRoKi8pIG92ZXJyaWRlIHsKKyAgICArK251bV9kaWZmc187CisgIH0KKworICAvLyBSZXBvcnQgdGhhdCBhIGZpZWxkIGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSBNZXNzYWdlMS4KKyAgdm9pZCBSZXBvcnREZWxldGVkKAorICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgLyogbWVzc2FnZTEgKi8sCisgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiAvKiBtZXNzYWdlMiAqLywKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGdvb2dsZTo6cHJvdG9idWY6OnV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6U3BlY2lmaWNGaWVsZD4mCisgICAgICAvKmZpZWxkX3BhdGgqLykgb3ZlcnJpZGUgeworICAgICsrbnVtX2RpZmZzXzsKKyAgfQorCisgIC8vIFJlcG9ydCB0aGF0IHRoZSB2YWx1ZSBvZiBhIGZpZWxkIGhhcyBiZWVuIG1vZGlmaWVkLgorICB2b2lkIFJlcG9ydE1vZGlmaWVkKAorICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgLyogbWVzc2FnZTEgKi8sCisgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiAvKiBtZXNzYWdlMiAqLywKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGdvb2dsZTo6cHJvdG9idWY6OnV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6U3BlY2lmaWNGaWVsZD4mCisgICAgICAvKmZpZWxkX3BhdGgqLykgb3ZlcnJpZGUgeworICAgICsrbnVtX2RpZmZzXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgaW50MzJfdCBudW1fZGlmZnNfOworfTsKKworLy8gV2hlbiBjb21wYXJpbmcgYSByZXBlYXRlZCBmaWVsZCBhcyBtYXAsIE11bHRpcGxlRmllbGRNYXBLZXlDb21wYXJhdG9yIGNhbgorLy8gYmUgdXNlZCB0byBzcGVjaWZ5IG11bHRpcGxlIGZpZWxkcyBhcyBrZXkgZm9yIGtleSBjb21wYXJpc29uLgorLy8gVHdvIGVsZW1lbnRzIG9mIGEgcmVwZWF0ZWQgZmllbGQgd2lsbCBiZSByZWdhcmRlZCBhcyBoYXZpbmcgdGhlIHNhbWUga2V5CisvLyBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIHZhbHVlIGZvciBldmVyeSBzcGVjaWZpZWQga2V5IGZpZWxkLgorLy8gTm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBzcGVjaWZ5IG9ubHkgb25lIGZpZWxkIGFzIGtleS4KK2NsYXNzIE1lc3NhZ2VEaWZmZXJlbmNlcjo6TXVsdGlwbGVGaWVsZHNNYXBLZXlDb21wYXJhdG9yCisgICAgOiBwdWJsaWMgTWVzc2FnZURpZmZlcmVuY2VyOjpNYXBLZXlDb21wYXJhdG9yIHsKKyBwdWJsaWM6CisgIE11bHRpcGxlRmllbGRzTWFwS2V5Q29tcGFyYXRvcigKKyAgICAgIE1lc3NhZ2VEaWZmZXJlbmNlciogbWVzc2FnZV9kaWZmZXJlbmNlciwKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+ID4mIGtleV9maWVsZF9wYXRocykKKyAgICAgIDogbWVzc2FnZV9kaWZmZXJlbmNlcl8obWVzc2FnZV9kaWZmZXJlbmNlciksCisgICAgICAgIGtleV9maWVsZF9wYXRoc18oa2V5X2ZpZWxkX3BhdGhzKSB7CisgICAgR09PR0xFX0NIRUNLKCFrZXlfZmllbGRfcGF0aHNfLmVtcHR5KCkpOworICAgIGZvciAoY29uc3QgYXV0byYgcGF0aCA6IGtleV9maWVsZF9wYXRoc18pIHsKKyAgICAgIEdPT0dMRV9DSEVDSyghcGF0aC5lbXB0eSgpKTsKKyAgICB9CisgIH0KKyAgTXVsdGlwbGVGaWVsZHNNYXBLZXlDb21wYXJhdG9yKE1lc3NhZ2VEaWZmZXJlbmNlciogbWVzc2FnZV9kaWZmZXJlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5KQorICAgICAgOiBtZXNzYWdlX2RpZmZlcmVuY2VyXyhtZXNzYWdlX2RpZmZlcmVuY2VyKSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4ga2V5X2ZpZWxkX3BhdGg7CisgICAga2V5X2ZpZWxkX3BhdGgucHVzaF9iYWNrKGtleSk7CisgICAga2V5X2ZpZWxkX3BhdGhzXy5wdXNoX2JhY2soa2V5X2ZpZWxkX3BhdGgpOworICB9CisgIGJvb2wgSXNNYXRjaChjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgcGFyZW50X2ZpZWxkcykgY29uc3Qgb3ZlcnJpZGUgeworICAgIGZvciAoY29uc3QgYXV0byYgcGF0aCA6IGtleV9maWVsZF9wYXRoc18pIHsKKyAgICAgIGlmICghSXNNYXRjaEludGVybmFsKG1lc3NhZ2UxLCBtZXNzYWdlMiwgcGFyZW50X2ZpZWxkcywgcGF0aCwgMCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgYm9vbCBJc01hdGNoSW50ZXJuYWwoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgcGFyZW50X2ZpZWxkcywKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+JiBrZXlfZmllbGRfcGF0aCwKKyAgICAgIGludCBwYXRoX2luZGV4KSBjb25zdCB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGtleV9maWVsZF9wYXRoW3BhdGhfaW5kZXhdOworICAgIHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+IGN1cnJlbnRfcGFyZW50X2ZpZWxkcyhwYXJlbnRfZmllbGRzKTsKKyAgICBpZiAocGF0aF9pbmRleCA9PSBzdGF0aWNfY2FzdDxpbnQ2NF90PihrZXlfZmllbGRfcGF0aC5zaXplKCkgLSAxKSkgeworICAgICAgaWYgKGZpZWxkLT5pc19tYXAoKSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZV9kaWZmZXJlbmNlcl8tPkNvbXBhcmVNYXBGaWVsZChtZXNzYWdlMSwgbWVzc2FnZTIsIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudF9wYXJlbnRfZmllbGRzKTsKKyAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VfZGlmZmVyZW5jZXJfLT5Db21wYXJlUmVwZWF0ZWRGaWVsZCgKKyAgICAgICAgICAgIG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGQsICZjdXJyZW50X3BhcmVudF9maWVsZHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VfZGlmZmVyZW5jZXJfLT5Db21wYXJlRmllbGRWYWx1ZVVzaW5nUGFyZW50RmllbGRzKAorICAgICAgICAgICAgbWVzc2FnZTEsIG1lc3NhZ2UyLCBmaWVsZCwgLTEsIC0xLCAmY3VycmVudF9wYXJlbnRfZmllbGRzKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbjEgPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uMiA9IG1lc3NhZ2UyLkdldFJlZmxlY3Rpb24oKTsKKyAgICAgIGJvb2wgaGFzX2ZpZWxkMSA9IHJlZmxlY3Rpb24xLT5IYXNGaWVsZChtZXNzYWdlMSwgZmllbGQpOworICAgICAgYm9vbCBoYXNfZmllbGQyID0gcmVmbGVjdGlvbjItPkhhc0ZpZWxkKG1lc3NhZ2UyLCBmaWVsZCk7CisgICAgICBpZiAoIWhhc19maWVsZDEgJiYgIWhhc19maWVsZDIpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBpZiAoaGFzX2ZpZWxkMSAhPSBoYXNfZmllbGQyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIFNwZWNpZmljRmllbGQgc3BlY2lmaWNfZmllbGQ7CisgICAgICBzcGVjaWZpY19maWVsZC5maWVsZCA9IGZpZWxkOworICAgICAgY3VycmVudF9wYXJlbnRfZmllbGRzLnB1c2hfYmFjayhzcGVjaWZpY19maWVsZCk7CisgICAgICByZXR1cm4gSXNNYXRjaEludGVybmFsKHJlZmxlY3Rpb24xLT5HZXRNZXNzYWdlKG1lc3NhZ2UxLCBmaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24yLT5HZXRNZXNzYWdlKG1lc3NhZ2UyLCBmaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcGFyZW50X2ZpZWxkcywga2V5X2ZpZWxkX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfaW5kZXggKyAxKTsKKyAgICB9CisgIH0KKyAgTWVzc2FnZURpZmZlcmVuY2VyKiBtZXNzYWdlX2RpZmZlcmVuY2VyXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gPiBrZXlfZmllbGRfcGF0aHNfOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXVsdGlwbGVGaWVsZHNNYXBLZXlDb21wYXJhdG9yKTsKK307CisKKy8vIFByZXNlcnZlIHRoZSBvcmRlciB3aGVuIHRyZWF0aW5nIHJlcGVhdGVkIGZpZWxkIGFzIFNNQVJUX0xJU1QuIFRoZSBjdXJyZW50CisvLyBpbXBsZW1lbnRhdGlvbiBpcyB0byBmaW5kIHRoZSBsb25nZXN0IG1hdGNoaW5nIHNlcXVlbmNlIGZyb20gdGhlIGZpcnN0CisvLyBlbGVtZW50LiBUaGUgb3B0aW1hbCBzb2x1dGlvbiByZXF1aXJlcyB0byB1c2UgLy91dGlsL2RpZmYvbGNzLmgsIHdoaWNoIGlzCisvLyBub3Qgb3BlbiBzb3VyY2VkIHlldC4gT3ZlcndyaXRlIHRoaXMgbWV0aG9kIGlmIHlvdSB3YW50IHRvIGhhdmUgdGhhdC4KKy8vIFRPRE8oeWt6aHUpOiBjaGFuZ2UgdG8gdXNlIExDUyBvbmNlIGl0IGlzIG9wZW4gc291cmNlZC4KK3ZvaWQgTWF0Y2hJbmRpY2VzUG9zdFByb2Nlc3NvckZvclNtYXJ0TGlzdChzdGQ6OnZlY3RvcjxpbnQ+KiBtYXRjaF9saXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+KiBtYXRjaF9saXN0MikgeworICBpbnQgbGFzdF9tYXRjaGVkX2luZGV4ID0gLTE7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hfbGlzdDEtPnNpemUoKTsgKytpKSB7CisgICAgaWYgKG1hdGNoX2xpc3QxLT5hdChpKSA8IDApIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAobGFzdF9tYXRjaGVkX2luZGV4IDwgMCB8fCBtYXRjaF9saXN0MS0+YXQoaSkgPiBsYXN0X21hdGNoZWRfaW5kZXgpIHsKKyAgICAgIGxhc3RfbWF0Y2hlZF9pbmRleCA9IG1hdGNoX2xpc3QxLT5hdChpKTsKKyAgICB9IGVsc2UgeworICAgICAgbWF0Y2hfbGlzdDItPmF0KG1hdGNoX2xpc3QxLT5hdChpKSkgPSAtMTsKKyAgICAgIG1hdGNoX2xpc3QxLT5hdChpKSA9IC0xOworICAgIH0KKyAgfQorfQorCit2b2lkIEFkZFNwZWNpZmljSW5kZXgoCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpTcGVjaWZpY0ZpZWxkKiBzcGVjaWZpY19maWVsZCwKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIHsKKyAgaWYgKGZpZWxkLT5pc19tYXAoKSkgeworICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgICBzcGVjaWZpY19maWVsZC0+bWFwX2VudHJ5MSA9CisgICAgICAgICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQsIGluZGV4KTsKKyAgfQorICBzcGVjaWZpY19maWVsZC0+aW5kZXggPSBpbmRleDsKK30KKwordm9pZCBBZGRTcGVjaWZpY05ld0luZGV4KAorICAgIGdvb2dsZTo6cHJvdG9idWY6OnV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6U3BlY2lmaWNGaWVsZCogc3BlY2lmaWNfZmllbGQsCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSB7CisgIGlmIChmaWVsZC0+aXNfbWFwKCkpIHsKKyAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgICAgc3BlY2lmaWNfZmllbGQtPm1hcF9lbnRyeTIgPQorICAgICAgICAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkLCBpbmRleCk7CisgIH0KKyAgc3BlY2lmaWNfZmllbGQtPm5ld19pbmRleCA9IGluZGV4OworfQorCitNZXNzYWdlRGlmZmVyZW5jZXI6Ok1hcEVudHJ5S2V5Q29tcGFyYXRvcjo6TWFwRW50cnlLZXlDb21wYXJhdG9yKAorICAgIE1lc3NhZ2VEaWZmZXJlbmNlciogbWVzc2FnZV9kaWZmZXJlbmNlcikKKyAgICA6IG1lc3NhZ2VfZGlmZmVyZW5jZXJfKG1lc3NhZ2VfZGlmZmVyZW5jZXIpIHt9CisKK2Jvb2wgTWVzc2FnZURpZmZlcmVuY2VyOjpNYXBFbnRyeUtleUNvbXBhcmF0b3I6OklzTWF0Y2goCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiBwYXJlbnRfZmllbGRzKSBjb25zdCB7CisgIC8vIE1hcCBlbnRyeSBoYXMgaXRzIGtleSBpbiB0aGUgZmllbGQgd2l0aCB0YWcgMS4gIFNlZSB0aGUgY29tbWVudCBmb3IKKyAgLy8gbWFwX2VudHJ5IGluIE1lc3NhZ2VPcHRpb25zLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGtleSA9IG1lc3NhZ2UxLkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOdW1iZXIoMSk7CisgIC8vIElmIGtleSBpcyBub3QgcHJlc2VudCBpbiBtZXNzYWdlMSBhbmQgd2UncmUgZG9pbmcgcGFydGlhbCBjb21wYXJpc29uIG9yIGlmCisgIC8vIG1hcCBrZXkgaXMgZXhwbGljaXRseSBpZ25vcmVkIHRyZWF0IHRoZSBmaWVsZCBhcyBzZXQgaW5zdGVhZCwKKyAgY29uc3QgYm9vbCB0cmVhdF9hc19zZXQgPQorICAgICAgKG1lc3NhZ2VfZGlmZmVyZW5jZXJfLT5zY29wZSgpID09IFBBUlRJQUwgJiYKKyAgICAgICAhbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZChtZXNzYWdlMSwga2V5KSkgfHwKKyAgICAgIG1lc3NhZ2VfZGlmZmVyZW5jZXJfLT5Jc0lnbm9yZWQobWVzc2FnZTEsIG1lc3NhZ2UyLCBrZXksIHBhcmVudF9maWVsZHMpOworCisgIHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+IGN1cnJlbnRfcGFyZW50X2ZpZWxkcyhwYXJlbnRfZmllbGRzKTsKKyAgaWYgKHRyZWF0X2FzX3NldCkgeworICAgIHJldHVybiBtZXNzYWdlX2RpZmZlcmVuY2VyXy0+Q29tcGFyZShtZXNzYWdlMSwgbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJyZW50X3BhcmVudF9maWVsZHMpOworICB9CisgIHJldHVybiBtZXNzYWdlX2RpZmZlcmVuY2VyXy0+Q29tcGFyZUZpZWxkVmFsdWVVc2luZ1BhcmVudEZpZWxkcygKKyAgICAgIG1lc3NhZ2UxLCBtZXNzYWdlMiwga2V5LCAtMSwgLTEsICZjdXJyZW50X3BhcmVudF9maWVsZHMpOworfQorCitib29sIE1lc3NhZ2VEaWZmZXJlbmNlcjo6RXF1YWxzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMikgeworICBNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisKKyAgcmV0dXJuIGRpZmZlcmVuY2VyLkNvbXBhcmUobWVzc2FnZTEsIG1lc3NhZ2UyKTsKK30KKworYm9vbCBNZXNzYWdlRGlmZmVyZW5jZXI6OkVxdWl2YWxlbnQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMikgeworICBNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLnNldF9tZXNzYWdlX2ZpZWxkX2NvbXBhcmlzb24oTWVzc2FnZURpZmZlcmVuY2VyOjpFUVVJVkFMRU5UKTsKKworICByZXR1cm4gZGlmZmVyZW5jZXIuQ29tcGFyZShtZXNzYWdlMSwgbWVzc2FnZTIpOworfQorCitib29sIE1lc3NhZ2VEaWZmZXJlbmNlcjo6QXBwcm94aW1hdGVseUVxdWFscyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyKSB7CisgIE1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuc2V0X2Zsb2F0X2NvbXBhcmlzb24oTWVzc2FnZURpZmZlcmVuY2VyOjpBUFBST1hJTUFURSk7CisKKyAgcmV0dXJuIGRpZmZlcmVuY2VyLkNvbXBhcmUobWVzc2FnZTEsIG1lc3NhZ2UyKTsKK30KKworYm9vbCBNZXNzYWdlRGlmZmVyZW5jZXI6OkFwcHJveGltYXRlbHlFcXVpdmFsZW50KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyKSB7CisgIE1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuc2V0X21lc3NhZ2VfZmllbGRfY29tcGFyaXNvbihNZXNzYWdlRGlmZmVyZW5jZXI6OkVRVUlWQUxFTlQpOworICBkaWZmZXJlbmNlci5zZXRfZmxvYXRfY29tcGFyaXNvbihNZXNzYWdlRGlmZmVyZW5jZXI6OkFQUFJPWElNQVRFKTsKKworICByZXR1cm4gZGlmZmVyZW5jZXIuQ29tcGFyZShtZXNzYWdlMSwgbWVzc2FnZTIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTWVzc2FnZURpZmZlcmVuY2VyOjpNZXNzYWdlRGlmZmVyZW5jZXIoKQorICAgIDogcmVwb3J0ZXJfKE5VTEwpLAorICAgICAgbWVzc2FnZV9maWVsZF9jb21wYXJpc29uXyhFUVVBTCksCisgICAgICBzY29wZV8oRlVMTCksCisgICAgICByZXBlYXRlZF9maWVsZF9jb21wYXJpc29uXyhBU19MSVNUKSwKKyAgICAgIG1hcF9lbnRyeV9rZXlfY29tcGFyYXRvcl8odGhpcyksCisgICAgICByZXBvcnRfbWF0Y2hlc18oZmFsc2UpLAorICAgICAgcmVwb3J0X21vdmVzXyh0cnVlKSwKKyAgICAgIHJlcG9ydF9pZ25vcmVzXyh0cnVlKSwKKyAgICAgIG91dHB1dF9zdHJpbmdfKG51bGxwdHIpLAorICAgICAgbWF0Y2hfaW5kaWNlc19mb3Jfc21hcnRfbGlzdF9jYWxsYmFja18oCisgICAgICAgICAgTWF0Y2hJbmRpY2VzUG9zdFByb2Nlc3NvckZvclNtYXJ0TGlzdCkge30KKworTWVzc2FnZURpZmZlcmVuY2VyOjp+TWVzc2FnZURpZmZlcmVuY2VyKCkgeworICBmb3IgKE1hcEtleUNvbXBhcmF0b3IqIGNvbXBhcmF0b3IgOiBvd25lZF9rZXlfY29tcGFyYXRvcnNfKSB7CisgICAgZGVsZXRlIGNvbXBhcmF0b3I7CisgIH0KKyAgZm9yIChJZ25vcmVDcml0ZXJpYSogY3JpdGVyaWEgOiBpZ25vcmVfY3JpdGVyaWFfKSB7CisgICAgZGVsZXRlIGNyaXRlcmlhOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZURpZmZlcmVuY2VyOjpzZXRfZmllbGRfY29tcGFyYXRvcihGaWVsZENvbXBhcmF0b3IqIGNvbXBhcmF0b3IpIHsKKyAgR09PR0xFX0NIRUNLKGNvbXBhcmF0b3IpIDw8ICJGaWVsZCBjb21wYXJhdG9yIGNhbid0IGJlIE5VTEwuIjsKKyAgZmllbGRfY29tcGFyYXRvcl9raW5kXyA9IGtGQ0Jhc2U7CisgIGZpZWxkX2NvbXBhcmF0b3JfLmJhc2UgPSBjb21wYXJhdG9yOworfQorCisjaWZkZWYgUFJPVE9CVUZfRlVUVVJFX0JSRUFLSU5HX0NIQU5HRVMKK3ZvaWQgTWVzc2FnZURpZmZlcmVuY2VyOjpzZXRfZmllbGRfY29tcGFyYXRvcigKKyAgICBEZWZhdWx0RmllbGRDb21wYXJhdG9yKiBjb21wYXJhdG9yKSB7CisgIEdPT0dMRV9DSEVDSyhjb21wYXJhdG9yKSA8PCAiRmllbGQgY29tcGFyYXRvciBjYW4ndCBiZSBOVUxMLiI7CisgIGZpZWxkX2NvbXBhcmF0b3Jfa2luZF8gPSBrRkNEZWZhdWx0OworICBmaWVsZF9jb21wYXJhdG9yXy5kZWZhdWx0X2ltcGwgPSBjb21wYXJhdG9yOworfQorI2VuZGlmICAvLyBQUk9UT0JVRl9GVVRVUkVfQlJFQUtJTkdfQ0hBTkdFUworCit2b2lkIE1lc3NhZ2VEaWZmZXJlbmNlcjo6c2V0X21lc3NhZ2VfZmllbGRfY29tcGFyaXNvbigKKyAgICBNZXNzYWdlRmllbGRDb21wYXJpc29uIGNvbXBhcmlzb24pIHsKKyAgbWVzc2FnZV9maWVsZF9jb21wYXJpc29uXyA9IGNvbXBhcmlzb247Cit9CisKK01lc3NhZ2VEaWZmZXJlbmNlcjo6TWVzc2FnZUZpZWxkQ29tcGFyaXNvbgorTWVzc2FnZURpZmZlcmVuY2VyOjptZXNzYWdlX2ZpZWxkX2NvbXBhcmlzb24oKSBjb25zdCB7CisgIHJldHVybiBtZXNzYWdlX2ZpZWxkX2NvbXBhcmlzb25fOworfQorCit2b2lkIE1lc3NhZ2VEaWZmZXJlbmNlcjo6c2V0X3Njb3BlKFNjb3BlIHNjb3BlKSB7IHNjb3BlXyA9IHNjb3BlOyB9CisKK01lc3NhZ2VEaWZmZXJlbmNlcjo6U2NvcGUgTWVzc2FnZURpZmZlcmVuY2VyOjpzY29wZSgpIGNvbnN0IHsgcmV0dXJuIHNjb3BlXzsgfQorCit2b2lkIE1lc3NhZ2VEaWZmZXJlbmNlcjo6c2V0X2Zsb2F0X2NvbXBhcmlzb24oRmxvYXRDb21wYXJpc29uIGNvbXBhcmlzb24pIHsKKyAgZGVmYXVsdF9maWVsZF9jb21wYXJhdG9yXy5zZXRfZmxvYXRfY29tcGFyaXNvbigKKyAgICAgIGNvbXBhcmlzb24gPT0gRVhBQ1QgPyBEZWZhdWx0RmllbGRDb21wYXJhdG9yOjpFWEFDVAorICAgICAgICAgICAgICAgICAgICAgICAgICA6IERlZmF1bHRGaWVsZENvbXBhcmF0b3I6OkFQUFJPWElNQVRFKTsKK30KKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6OnNldF9yZXBlYXRlZF9maWVsZF9jb21wYXJpc29uKAorICAgIFJlcGVhdGVkRmllbGRDb21wYXJpc29uIGNvbXBhcmlzb24pIHsKKyAgcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbl8gPSBjb21wYXJpc29uOworfQorCitNZXNzYWdlRGlmZmVyZW5jZXI6OlJlcGVhdGVkRmllbGRDb21wYXJpc29uCitNZXNzYWdlRGlmZmVyZW5jZXI6OnJlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb24oKSBjb25zdCB7CisgIHJldHVybiByZXBlYXRlZF9maWVsZF9jb21wYXJpc29uXzsKK30KKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6OkNoZWNrUmVwZWF0ZWRGaWVsZENvbXBhcmlzb25zKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3QgUmVwZWF0ZWRGaWVsZENvbXBhcmlzb24mIG5ld19jb21wYXJpc29uKSB7CisgIEdPT0dMRV9DSEVDSyhmaWVsZC0+aXNfcmVwZWF0ZWQoKSkKKyAgICAgIDw8ICJGaWVsZCBtdXN0IGJlIHJlcGVhdGVkOiAiIDw8IGZpZWxkLT5mdWxsX25hbWUoKTsKKyAgY29uc3QgTWFwS2V5Q29tcGFyYXRvcioga2V5X2NvbXBhcmF0b3IgPSBHZXRNYXBLZXlDb21wYXJhdG9yKGZpZWxkKTsKKyAgR09PR0xFX0NIRUNLKGtleV9jb21wYXJhdG9yID09IE5VTEwpCisgICAgICA8PCAiQ2Fubm90IHRyZWF0IHRoaXMgcmVwZWF0ZWQgZmllbGQgYXMgYm90aCBNQVAgYW5kICIgPDwgbmV3X2NvbXBhcmlzb24KKyAgICAgIDw8ICIgZm9yIGNvbXBhcmlzb24uICBGaWVsZCBuYW1lIGlzOiAiIDw8IGZpZWxkLT5mdWxsX25hbWUoKTsKK30KKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6OlRyZWF0QXNTZXQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBDaGVja1JlcGVhdGVkRmllbGRDb21wYXJpc29ucyhmaWVsZCwgQVNfU0VUKTsKKyAgcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbnNfW2ZpZWxkXSA9IEFTX1NFVDsKK30KKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6OlRyZWF0QXNTbWFydFNldChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIENoZWNrUmVwZWF0ZWRGaWVsZENvbXBhcmlzb25zKGZpZWxkLCBBU19TTUFSVF9TRVQpOworICByZXBlYXRlZF9maWVsZF9jb21wYXJpc29uc19bZmllbGRdID0gQVNfU01BUlRfU0VUOworfQorCit2b2lkIE1lc3NhZ2VEaWZmZXJlbmNlcjo6U2V0TWF0Y2hJbmRpY2VzRm9yU21hcnRMaXN0Q2FsbGJhY2soCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPGludD4qLCBzdGQ6OnZlY3RvcjxpbnQ+Kik+IGNhbGxiYWNrKSB7CisgIG1hdGNoX2luZGljZXNfZm9yX3NtYXJ0X2xpc3RfY2FsbGJhY2tfID0gY2FsbGJhY2s7Cit9CisKK3ZvaWQgTWVzc2FnZURpZmZlcmVuY2VyOjpUcmVhdEFzTGlzdChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIENoZWNrUmVwZWF0ZWRGaWVsZENvbXBhcmlzb25zKGZpZWxkLCBBU19MSVNUKTsKKyAgcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbnNfW2ZpZWxkXSA9IEFTX0xJU1Q7Cit9CisKK3ZvaWQgTWVzc2FnZURpZmZlcmVuY2VyOjpUcmVhdEFzU21hcnRMaXN0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgQ2hlY2tSZXBlYXRlZEZpZWxkQ29tcGFyaXNvbnMoZmllbGQsIEFTX1NNQVJUX0xJU1QpOworICByZXBlYXRlZF9maWVsZF9jb21wYXJpc29uc19bZmllbGRdID0gQVNfU01BUlRfTElTVDsKK30KKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6OlRyZWF0QXNNYXAoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5KSB7CisgIEdPT0dMRV9DSEVDS19FUShGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSwgZmllbGQtPmNwcF90eXBlKCkpCisgICAgICA8PCAiRmllbGQgaGFzIHRvIGJlIG1lc3NhZ2UgdHlwZS4gIEZpZWxkIG5hbWUgaXM6ICIgPDwgZmllbGQtPmZ1bGxfbmFtZSgpOworICBHT09HTEVfQ0hFQ0soa2V5LT5jb250YWluaW5nX3R5cGUoKSA9PSBmaWVsZC0+bWVzc2FnZV90eXBlKCkpCisgICAgICA8PCBrZXktPmZ1bGxfbmFtZSgpCisgICAgICA8PCAiIG11c3QgYmUgYSBkaXJlY3Qgc3ViZmllbGQgd2l0aGluIHRoZSByZXBlYXRlZCBmaWVsZCAiCisgICAgICA8PCBmaWVsZC0+ZnVsbF9uYW1lKCkgPDwgIiwgbm90ICIgPDwga2V5LT5jb250YWluaW5nX3R5cGUoKS0+ZnVsbF9uYW1lKCk7CisgIEdPT0dMRV9DSEVDSyhyZXBlYXRlZF9maWVsZF9jb21wYXJpc29uc18uZmluZChmaWVsZCkgPT0KKyAgICAgICAgcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbnNfLmVuZCgpKQorICAgICAgPDwgIkNhbm5vdCB0cmVhdCB0aGUgc2FtZSBmaWVsZCBhcyBib3RoICIKKyAgICAgIDw8IHJlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb25zX1tmaWVsZF0KKyAgICAgIDw8ICIgYW5kIE1BUC4gRmllbGQgbmFtZSBpczogIiA8PCBmaWVsZC0+ZnVsbF9uYW1lKCk7CisgIE1hcEtleUNvbXBhcmF0b3IqIGtleV9jb21wYXJhdG9yID0KKyAgICAgIG5ldyBNdWx0aXBsZUZpZWxkc01hcEtleUNvbXBhcmF0b3IodGhpcywga2V5KTsKKyAgb3duZWRfa2V5X2NvbXBhcmF0b3JzXy5wdXNoX2JhY2soa2V5X2NvbXBhcmF0b3IpOworICBtYXBfZmllbGRfa2V5X2NvbXBhcmF0b3JfW2ZpZWxkXSA9IGtleV9jb21wYXJhdG9yOworfQorCit2b2lkIE1lc3NhZ2VEaWZmZXJlbmNlcjo6VHJlYXRBc01hcFdpdGhNdWx0aXBsZUZpZWxkc0FzS2V5KAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGtleV9maWVsZHMpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gPiBrZXlfZmllbGRfcGF0aHM7CisgIGZvciAoY29uc3QgRmllbGREZXNjcmlwdG9yKiBrZXlfZmlsZWQgOiBrZXlfZmllbGRzKSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4ga2V5X2ZpZWxkX3BhdGg7CisgICAga2V5X2ZpZWxkX3BhdGgucHVzaF9iYWNrKGtleV9maWxlZCk7CisgICAga2V5X2ZpZWxkX3BhdGhzLnB1c2hfYmFjayhrZXlfZmllbGRfcGF0aCk7CisgIH0KKyAgVHJlYXRBc01hcFdpdGhNdWx0aXBsZUZpZWxkUGF0aHNBc0tleShmaWVsZCwga2V5X2ZpZWxkX3BhdGhzKTsKK30KKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6OlRyZWF0QXNNYXBXaXRoTXVsdGlwbGVGaWVsZFBhdGhzQXNLZXkoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiA+JiBrZXlfZmllbGRfcGF0aHMpIHsKKyAgR09PR0xFX0NIRUNLKGZpZWxkLT5pc19yZXBlYXRlZCgpKQorICAgICAgPDwgIkZpZWxkIG11c3QgYmUgcmVwZWF0ZWQ6ICIgPDwgZmllbGQtPmZ1bGxfbmFtZSgpOworICBHT09HTEVfQ0hFQ0tfRVEoRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UsIGZpZWxkLT5jcHBfdHlwZSgpKQorICAgICAgPDwgIkZpZWxkIGhhcyB0byBiZSBtZXNzYWdlIHR5cGUuICBGaWVsZCBuYW1lIGlzOiAiIDw8IGZpZWxkLT5mdWxsX25hbWUoKTsKKyAgZm9yIChjb25zdCBhdXRvJiBrZXlfZmllbGRfcGF0aCA6IGtleV9maWVsZF9wYXRocykgeworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga2V5X2ZpZWxkX3BhdGguc2l6ZSgpOyArK2opIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcGFyZW50X2ZpZWxkID0KKyAgICAgICAgICBqID09IDAgPyBmaWVsZCA6IGtleV9maWVsZF9wYXRoW2ogLSAxXTsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogY2hpbGRfZmllbGQgPSBrZXlfZmllbGRfcGF0aFtqXTsKKyAgICAgIEdPT0dMRV9DSEVDSyhjaGlsZF9maWVsZC0+Y29udGFpbmluZ190eXBlKCkgPT0gcGFyZW50X2ZpZWxkLT5tZXNzYWdlX3R5cGUoKSkKKyAgICAgICAgICA8PCBjaGlsZF9maWVsZC0+ZnVsbF9uYW1lKCkKKyAgICAgICAgICA8PCAiIG11c3QgYmUgYSBkaXJlY3Qgc3ViZmllbGQgd2l0aGluIHRoZSBmaWVsZDogIgorICAgICAgICAgIDw8IHBhcmVudF9maWVsZC0+ZnVsbF9uYW1lKCk7CisgICAgICBpZiAoaiAhPSAwKSB7CisgICAgICAgIEdPT0dMRV9DSEVDS19FUShGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSwgcGFyZW50X2ZpZWxkLT5jcHBfdHlwZSgpKQorICAgICAgICAgICAgPDwgcGFyZW50X2ZpZWxkLT5mdWxsX25hbWUoKSA8PCAiIGhhcyB0byBiZSBvZiB0eXBlIG1lc3NhZ2UuIjsKKyAgICAgICAgR09PR0xFX0NIRUNLKCFwYXJlbnRfZmllbGQtPmlzX3JlcGVhdGVkKCkpCisgICAgICAgICAgICA8PCBwYXJlbnRfZmllbGQtPmZ1bGxfbmFtZSgpIDw8ICIgY2Fubm90IGJlIGEgcmVwZWF0ZWQgZmllbGQuIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgR09PR0xFX0NIRUNLKHJlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb25zXy5maW5kKGZpZWxkKSA9PQorICAgICAgICByZXBlYXRlZF9maWVsZF9jb21wYXJpc29uc18uZW5kKCkpCisgICAgICA8PCAiQ2Fubm90IHRyZWF0IHRoZSBzYW1lIGZpZWxkIGFzIGJvdGggIgorICAgICAgPDwgcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbnNfW2ZpZWxkXQorICAgICAgPDwgIiBhbmQgTUFQLiBGaWVsZCBuYW1lIGlzOiAiIDw8IGZpZWxkLT5mdWxsX25hbWUoKTsKKyAgTWFwS2V5Q29tcGFyYXRvcioga2V5X2NvbXBhcmF0b3IgPQorICAgICAgbmV3IE11bHRpcGxlRmllbGRzTWFwS2V5Q29tcGFyYXRvcih0aGlzLCBrZXlfZmllbGRfcGF0aHMpOworICBvd25lZF9rZXlfY29tcGFyYXRvcnNfLnB1c2hfYmFjayhrZXlfY29tcGFyYXRvcik7CisgIG1hcF9maWVsZF9rZXlfY29tcGFyYXRvcl9bZmllbGRdID0ga2V5X2NvbXBhcmF0b3I7Cit9CisKK3ZvaWQgTWVzc2FnZURpZmZlcmVuY2VyOjpUcmVhdEFzTWFwVXNpbmdLZXlDb21wYXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IE1hcEtleUNvbXBhcmF0b3IqIGtleV9jb21wYXJhdG9yKSB7CisgIEdPT0dMRV9DSEVDSyhmaWVsZC0+aXNfcmVwZWF0ZWQoKSkKKyAgICAgIDw8ICJGaWVsZCBtdXN0IGJlIHJlcGVhdGVkOiAiIDw8IGZpZWxkLT5mdWxsX25hbWUoKTsKKyAgR09PR0xFX0NIRUNLKHJlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb25zXy5maW5kKGZpZWxkKSA9PQorICAgICAgICByZXBlYXRlZF9maWVsZF9jb21wYXJpc29uc18uZW5kKCkpCisgICAgICA8PCAiQ2Fubm90IHRyZWF0IHRoZSBzYW1lIGZpZWxkIGFzIGJvdGggIgorICAgICAgPDwgcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbnNfW2ZpZWxkXQorICAgICAgPDwgIiBhbmQgTUFQLiBGaWVsZCBuYW1lIGlzOiAiIDw8IGZpZWxkLT5mdWxsX25hbWUoKTsKKyAgbWFwX2ZpZWxkX2tleV9jb21wYXJhdG9yX1tmaWVsZF0gPSBrZXlfY29tcGFyYXRvcjsKK30KKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6OkFkZElnbm9yZUNyaXRlcmlhKElnbm9yZUNyaXRlcmlhKiBpZ25vcmVfY3JpdGVyaWEpIHsKKyAgaWdub3JlX2NyaXRlcmlhXy5wdXNoX2JhY2soaWdub3JlX2NyaXRlcmlhKTsKK30KKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6Oklnbm9yZUZpZWxkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgaWdub3JlZF9maWVsZHNfLmluc2VydChmaWVsZCk7Cit9CisKK3ZvaWQgTWVzc2FnZURpZmZlcmVuY2VyOjpTZXRGcmFjdGlvbkFuZE1hcmdpbihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmcmFjdGlvbiwgZG91YmxlIG1hcmdpbikgeworICBkZWZhdWx0X2ZpZWxkX2NvbXBhcmF0b3JfLlNldEZyYWN0aW9uQW5kTWFyZ2luKGZpZWxkLCBmcmFjdGlvbiwgbWFyZ2luKTsKK30KKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6OlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoc3RkOjpzdHJpbmcqIG91dHB1dCkgeworICBHT09HTEVfRENIRUNLKG91dHB1dCkgPDwgIlNwZWNpZmllZCBvdXRwdXQgc3RyaW5nIHdhcyBOVUxMIjsKKworICBvdXRwdXRfc3RyaW5nXyA9IG91dHB1dDsKKyAgb3V0cHV0X3N0cmluZ18tPmNsZWFyKCk7Cit9CisKK3ZvaWQgTWVzc2FnZURpZmZlcmVuY2VyOjpSZXBvcnREaWZmZXJlbmNlc1RvKFJlcG9ydGVyKiByZXBvcnRlcikgeworICAvLyBJZiBhbiBvdXRwdXQgc3RyaW5nIGlzIHNldCwgY2xlYXIgaXQgdG8gcHJldmVudAorICAvLyBpdCBzdXBlcnNlZGluZyB0aGUgc3BlY2lmaWVkIHJlcG9ydGVyLgorICBpZiAob3V0cHV0X3N0cmluZ18pIHsKKyAgICBvdXRwdXRfc3RyaW5nXyA9IE5VTEw7CisgIH0KKworICByZXBvcnRlcl8gPSByZXBvcnRlcjsKK30KKworYm9vbCBNZXNzYWdlRGlmZmVyZW5jZXI6OkZpZWxkQmVmb3JlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQyKSB7CisgIC8vIEhhbmRsZSBzZW50aW5lbCB2YWx1ZXMgKGkuZS4gbWFrZSBzdXJlIE5VTExzIGFyZSBhbHdheXMgb3JkZXJlZAorICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0KS4KKyAgaWYgKGZpZWxkMSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGZpZWxkMiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBBbHdheXMgb3JkZXIgZmllbGRzIGJ5IHRoZWlyIHRhZyBudW1iZXIKKyAgcmV0dXJuIChmaWVsZDEtPm51bWJlcigpIDwgZmllbGQyLT5udW1iZXIoKSk7Cit9CisKK2Jvb2wgTWVzc2FnZURpZmZlcmVuY2VyOjpDb21wYXJlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIpIHsKKyAgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4gcGFyZW50X2ZpZWxkczsKKworICBib29sIHJlc3VsdCA9IGZhbHNlOworICAvLyBTZXR1cCB0aGUgaW50ZXJuYWwgcmVwb3J0ZXIgaWYgbmVlZCBiZS4KKyAgaWYgKG91dHB1dF9zdHJpbmdfKSB7CisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKG91dHB1dF9zdHJpbmdfKTsKKyAgICBTdHJlYW1SZXBvcnRlciByZXBvcnRlcigmb3V0cHV0X3N0cmVhbSk7CisgICAgcmVwb3J0ZXIuU2V0TWVzc2FnZXMobWVzc2FnZTEsIG1lc3NhZ2UyKTsKKyAgICByZXBvcnRlcl8gPSAmcmVwb3J0ZXI7CisgICAgcmVzdWx0ID0gQ29tcGFyZShtZXNzYWdlMSwgbWVzc2FnZTIsICZwYXJlbnRfZmllbGRzKTsKKyAgICByZXBvcnRlcl8gPSBOVUxMOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IENvbXBhcmUobWVzc2FnZTEsIG1lc3NhZ2UyLCAmcGFyZW50X2ZpZWxkcyk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBNZXNzYWdlRGlmZmVyZW5jZXI6OkNvbXBhcmVXaXRoRmllbGRzKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgbWVzc2FnZTFfZmllbGRzX2FyZywKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgbWVzc2FnZTJfZmllbGRzX2FyZykgeworICBpZiAobWVzc2FnZTEuR2V0RGVzY3JpcHRvcigpICE9IG1lc3NhZ2UyLkdldERlc2NyaXB0b3IoKSkgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiQ29tcGFyaXNvbiBiZXR3ZWVuIHR3byBtZXNzYWdlcyB3aXRoIGRpZmZlcmVudCAiCisgICAgICAgICAgICAgICAgPDwgImRlc2NyaXB0b3JzLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4gcGFyZW50X2ZpZWxkczsKKworICBib29sIHJlc3VsdCA9IGZhbHNlOworCisgIEZpZWxkRGVzY3JpcHRvckFycmF5IG1lc3NhZ2UxX2ZpZWxkcyhtZXNzYWdlMV9maWVsZHNfYXJnLnNpemUoKSArIDEpOworICBGaWVsZERlc2NyaXB0b3JBcnJheSBtZXNzYWdlMl9maWVsZHMobWVzc2FnZTJfZmllbGRzX2FyZy5zaXplKCkgKyAxKTsKKworICBzdGQ6OmNvcHkobWVzc2FnZTFfZmllbGRzX2FyZy5jYmVnaW4oKSwgbWVzc2FnZTFfZmllbGRzX2FyZy5jZW5kKCksCisgICAgICAgICAgICBtZXNzYWdlMV9maWVsZHMuYmVnaW4oKSk7CisgIHN0ZDo6Y29weShtZXNzYWdlMl9maWVsZHNfYXJnLmNiZWdpbigpLCBtZXNzYWdlMl9maWVsZHNfYXJnLmNlbmQoKSwKKyAgICAgICAgICAgIG1lc3NhZ2UyX2ZpZWxkcy5iZWdpbigpKTsKKworICAvLyBBcHBlbmQgc2VudGluZWwgdmFsdWVzLgorICBtZXNzYWdlMV9maWVsZHNbbWVzc2FnZTFfZmllbGRzX2FyZy5zaXplKCldID0gbnVsbHB0cjsKKyAgbWVzc2FnZTJfZmllbGRzW21lc3NhZ2UyX2ZpZWxkc19hcmcuc2l6ZSgpXSA9IG51bGxwdHI7CisKKyAgc3RkOjpzb3J0KG1lc3NhZ2UxX2ZpZWxkcy5iZWdpbigpLCBtZXNzYWdlMV9maWVsZHMuZW5kKCksIEZpZWxkQmVmb3JlKTsKKyAgc3RkOjpzb3J0KG1lc3NhZ2UyX2ZpZWxkcy5iZWdpbigpLCBtZXNzYWdlMl9maWVsZHMuZW5kKCksIEZpZWxkQmVmb3JlKTsKKworICAvLyBTZXR1cCB0aGUgaW50ZXJuYWwgcmVwb3J0ZXIgaWYgbmVlZCBiZS4KKyAgaWYgKG91dHB1dF9zdHJpbmdfKSB7CisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKG91dHB1dF9zdHJpbmdfKTsKKyAgICBTdHJlYW1SZXBvcnRlciByZXBvcnRlcigmb3V0cHV0X3N0cmVhbSk7CisgICAgcmVwb3J0ZXJfID0gJnJlcG9ydGVyOworICAgIHJlc3VsdCA9IENvbXBhcmVSZXF1ZXN0ZWRGaWVsZHNVc2luZ1NldHRpbmdzKAorICAgICAgICBtZXNzYWdlMSwgbWVzc2FnZTIsIG1lc3NhZ2UxX2ZpZWxkcywgbWVzc2FnZTJfZmllbGRzLCAmcGFyZW50X2ZpZWxkcyk7CisgICAgcmVwb3J0ZXJfID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBDb21wYXJlUmVxdWVzdGVkRmllbGRzVXNpbmdTZXR0aW5ncygKKyAgICAgICAgbWVzc2FnZTEsIG1lc3NhZ2UyLCBtZXNzYWdlMV9maWVsZHMsIG1lc3NhZ2UyX2ZpZWxkcywgJnBhcmVudF9maWVsZHMpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBNZXNzYWdlRGlmZmVyZW5jZXI6OkNvbXBhcmUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+KiBwYXJlbnRfZmllbGRzKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IxID0gbWVzc2FnZTEuR2V0RGVzY3JpcHRvcigpOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yMiA9IG1lc3NhZ2UyLkdldERlc2NyaXB0b3IoKTsKKyAgaWYgKGRlc2NyaXB0b3IxICE9IGRlc2NyaXB0b3IyKSB7CisgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJDb21wYXJpc29uIGJldHdlZW4gdHdvIG1lc3NhZ2VzIHdpdGggZGlmZmVyZW50ICIKKyAgICAgICAgICAgICAgICA8PCAiZGVzY3JpcHRvcnMuICIgPDwgZGVzY3JpcHRvcjEtPmZ1bGxfbmFtZSgpIDw8ICIgdnMgIgorICAgICAgICAgICAgICAgIDw8IGRlc2NyaXB0b3IyLT5mdWxsX25hbWUoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBFeHBhbmQgZ29vZ2xlLnByb3RvYnVmLkFueSBwYXlsb2FkIGlmIHBvc3NpYmxlLgorICBpZiAoZGVzY3JpcHRvcjEtPmZ1bGxfbmFtZSgpID09IGludGVybmFsOjprQW55RnVsbFR5cGVOYW1lKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+IGRhdGExOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlPiBkYXRhMjsKKyAgICBpZiAodW5wYWNrX2FueV9maWVsZF8uVW5wYWNrQW55KG1lc3NhZ2UxLCAmZGF0YTEpICYmCisgICAgICAgIHVucGFja19hbnlfZmllbGRfLlVucGFja0FueShtZXNzYWdlMiwgJmRhdGEyKSkgeworICAgICAgLy8gQXZvaWQgREZBVEFMIGZvciBkaWZmZXJlbnQgZGVzY3JpcHRvcnMgaW4gZ29vZ2xlLnByb3RvYnVmLkFueSBwYXlsb2Fkcy4KKyAgICAgIGlmIChkYXRhMS0+R2V0RGVzY3JpcHRvcigpICE9IGRhdGEyLT5HZXREZXNjcmlwdG9yKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgcmV0dXJuIENvbXBhcmUoKmRhdGExLCAqZGF0YTIsIHBhcmVudF9maWVsZHMpOworICAgIH0KKyAgfQorICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uMSA9IG1lc3NhZ2UxLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbjIgPSBtZXNzYWdlMi5HZXRSZWZsZWN0aW9uKCk7CisKKyAgYm9vbCB1bmtub3duX2NvbXBhcmVfcmVzdWx0ID0gdHJ1ZTsKKyAgLy8gSWdub3JlIHVua25vd24gZmllbGRzIGluIEVRVUlWQUxFTlQgbW9kZQorICBpZiAobWVzc2FnZV9maWVsZF9jb21wYXJpc29uXyAhPSBFUVVJVkFMRU5UKSB7CisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkX3NldDEgPQorICAgICAgICByZWZsZWN0aW9uMS0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlMSk7CisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkX3NldDIgPQorICAgICAgICByZWZsZWN0aW9uMi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlMik7CisgICAgaWYgKCFDb21wYXJlVW5rbm93bkZpZWxkcyhtZXNzYWdlMSwgbWVzc2FnZTIsIHVua25vd25fZmllbGRfc2V0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25fZmllbGRfc2V0MiwgcGFyZW50X2ZpZWxkcykpIHsKKyAgICAgIGlmIChyZXBvcnRlcl8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICB1bmtub3duX2NvbXBhcmVfcmVzdWx0ID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgRmllbGREZXNjcmlwdG9yQXJyYXkgbWVzc2FnZTFfZmllbGRzID0gUmV0cmlldmVGaWVsZHMobWVzc2FnZTEsIHRydWUpOworICBGaWVsZERlc2NyaXB0b3JBcnJheSBtZXNzYWdlMl9maWVsZHMgPSBSZXRyaWV2ZUZpZWxkcyhtZXNzYWdlMiwgZmFsc2UpOworCisgIHJldHVybiBDb21wYXJlUmVxdWVzdGVkRmllbGRzVXNpbmdTZXR0aW5ncyhtZXNzYWdlMSwgbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlMV9maWVsZHMsIG1lc3NhZ2UyX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9maWVsZHMpICYmCisgICAgICAgICB1bmtub3duX2NvbXBhcmVfcmVzdWx0OworfQorCitGaWVsZERlc2NyaXB0b3JBcnJheSBNZXNzYWdlRGlmZmVyZW5jZXI6OlJldHJpZXZlRmllbGRzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmFzZV9tZXNzYWdlKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKworICB0bXBfbWVzc2FnZV9maWVsZHNfLmNsZWFyKCk7CisgIHRtcF9tZXNzYWdlX2ZpZWxkc18ucmVzZXJ2ZShkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpICsgMSk7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBpZiAoZGVzY3JpcHRvci0+b3B0aW9ucygpLm1hcF9lbnRyeSgpKSB7CisgICAgaWYgKHRoaXMtPnNjb3BlXyA9PSBQQVJUSUFMICYmIGJhc2VfbWVzc2FnZSkgeworICAgICAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhtZXNzYWdlLCAmdG1wX21lc3NhZ2VfZmllbGRzXyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE1hcCBlbnRyeSBmaWVsZHMgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHByZXNlbnQuCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgICB0bXBfbWVzc2FnZV9maWVsZHNfLnB1c2hfYmFjayhkZXNjcmlwdG9yLT5maWVsZChpKSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZSwgJnRtcF9tZXNzYWdlX2ZpZWxkc18pOworICB9CisgIC8vIEFkZCBzZW50aW5lbCB2YWx1ZXMgdG8gZGVhbCB3aXRoIHRoZQorICAvLyBjYXNlIHdoZXJlIHRoZSBudW1iZXIgb2YgdGhlIGZpZWxkcyBpbgorICAvLyBlYWNoIGxpc3QgYXJlIGRpZmZlcmVudC4KKyAgdG1wX21lc3NhZ2VfZmllbGRzXy5wdXNoX2JhY2sobnVsbHB0cik7CisKKyAgRmllbGREZXNjcmlwdG9yQXJyYXkgbWVzc2FnZV9maWVsZHModG1wX21lc3NhZ2VfZmllbGRzXy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfbWVzc2FnZV9maWVsZHNfLmVuZCgpKTsKKworICByZXR1cm4gbWVzc2FnZV9maWVsZHM7Cit9CisKK2Jvb2wgTWVzc2FnZURpZmZlcmVuY2VyOjpDb21wYXJlUmVxdWVzdGVkRmllbGRzVXNpbmdTZXR0aW5ncygKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yQXJyYXkmIG1lc3NhZ2UxX2ZpZWxkcywKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JBcnJheSYgbWVzc2FnZTJfZmllbGRzLAorICAgIHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+KiBwYXJlbnRfZmllbGRzKSB7CisgIGlmIChzY29wZV8gPT0gRlVMTCkgeworICAgIGlmIChtZXNzYWdlX2ZpZWxkX2NvbXBhcmlzb25fID09IEVRVUlWQUxFTlQpIHsKKyAgICAgIC8vIFdlIG5lZWQgdG8gbWVyZ2UgdGhlIGZpZWxkIGxpc3RzIG9mIGJvdGggbWVzc2FnZXMgKGkuZS4KKyAgICAgIC8vIHdlIGFyZSBtZXJlbHkgY2hlY2tpbmcgZm9yIGEgZGlmZmVyZW5jZSBpbiBmaWVsZCB2YWx1ZXMsCisgICAgICAvLyByYXRoZXIgdGhhbiB0aGUgYWRkaXRpb24gb3IgZGVsZXRpb24gb2YgZmllbGRzKS4KKyAgICAgIEZpZWxkRGVzY3JpcHRvckFycmF5IGZpZWxkc191bmlvbiA9CisgICAgICAgICAgQ29tYmluZUZpZWxkcyhtZXNzYWdlMV9maWVsZHMsIEZVTEwsIG1lc3NhZ2UyX2ZpZWxkcywgRlVMTCk7CisgICAgICByZXR1cm4gQ29tcGFyZVdpdGhGaWVsZHNJbnRlcm5hbChtZXNzYWdlMSwgbWVzc2FnZTIsIGZpZWxkc191bmlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc191bmlvbiwgcGFyZW50X2ZpZWxkcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFNpbXBsZSBlcXVhbGl0eSBjb21wYXJpc29uLCB1c2UgdGhlIHVuYWx0ZXJlZCBmaWVsZCBsaXN0cy4KKyAgICAgIHJldHVybiBDb21wYXJlV2l0aEZpZWxkc0ludGVybmFsKG1lc3NhZ2UxLCBtZXNzYWdlMiwgbWVzc2FnZTFfZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTJfZmllbGRzLCBwYXJlbnRfZmllbGRzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG1lc3NhZ2VfZmllbGRfY29tcGFyaXNvbl8gPT0gRVFVSVZBTEVOVCkgeworICAgICAgLy8gV2UgdXNlIHRoZSBsaXN0IG9mIGZpZWxkcyBmb3IgbWVzc2FnZTEgZm9yIGJvdGggbWVzc2FnZXMgd2hlbgorICAgICAgLy8gY29tcGFyaW5nLiAgVGhpcyB3YXksIGV4dHJhIGZpZWxkcyBpbiBtZXNzYWdlMiBhcmUgaWdub3JlZCwKKyAgICAgIC8vIGFuZCBtaXNzaW5nIGZpZWxkcyBpbiBtZXNzYWdlMiB1c2UgdGhlaXIgZGVmYXVsdCB2YWx1ZS4KKyAgICAgIHJldHVybiBDb21wYXJlV2l0aEZpZWxkc0ludGVybmFsKG1lc3NhZ2UxLCBtZXNzYWdlMiwgbWVzc2FnZTFfZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTFfZmllbGRzLCBwYXJlbnRfZmllbGRzKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2UgbmVlZCB0byBjb25zaWRlciB0aGUgZnVsbCBsaXN0IG9mIGZpZWxkcyBmb3IgbWVzc2FnZTEKKyAgICAgIC8vIGJ1dCBvbmx5IHRoZSBpbnRlcnNlY3Rpb24gZm9yIG1lc3NhZ2UyLiAgVGhpcyB3YXksIGFueSBmaWVsZHMKKyAgICAgIC8vIG9ubHkgcHJlc2VudCBpbiBtZXNzYWdlMiB3aWxsIGJlIGlnbm9yZWQsIGJ1dCBhbnkgZmllbGRzIG9ubHkKKyAgICAgIC8vIHByZXNlbnQgaW4gbWVzc2FnZTEgd2lsbCBiZSBtYXJrZWQgYXMgYSBkaWZmZXJlbmNlLgorICAgICAgRmllbGREZXNjcmlwdG9yQXJyYXkgZmllbGRzX2ludGVyc2VjdGlvbiA9CisgICAgICAgICAgQ29tYmluZUZpZWxkcyhtZXNzYWdlMV9maWVsZHMsIFBBUlRJQUwsIG1lc3NhZ2UyX2ZpZWxkcywgUEFSVElBTCk7CisgICAgICByZXR1cm4gQ29tcGFyZVdpdGhGaWVsZHNJbnRlcm5hbChtZXNzYWdlMSwgbWVzc2FnZTIsIG1lc3NhZ2UxX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc19pbnRlcnNlY3Rpb24sIHBhcmVudF9maWVsZHMpOworICAgIH0KKyAgfQorfQorCitGaWVsZERlc2NyaXB0b3JBcnJheSBNZXNzYWdlRGlmZmVyZW5jZXI6OkNvbWJpbmVGaWVsZHMoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yQXJyYXkmIGZpZWxkczEsIFNjb3BlIGZpZWxkczFfc2NvcGUsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yQXJyYXkmIGZpZWxkczIsIFNjb3BlIGZpZWxkczJfc2NvcGUpIHsKKyAgc2l6ZV90IGluZGV4MSA9IDA7CisgIHNpemVfdCBpbmRleDIgPSAwOworCisgIHRtcF9tZXNzYWdlX2ZpZWxkc18uY2xlYXIoKTsKKworICB3aGlsZSAoaW5kZXgxIDwgZmllbGRzMS5zaXplKCkgJiYgaW5kZXgyIDwgZmllbGRzMi5zaXplKCkpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkMSA9IGZpZWxkczFbaW5kZXgxXTsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkMiA9IGZpZWxkczJbaW5kZXgyXTsKKworICAgIGlmIChGaWVsZEJlZm9yZShmaWVsZDEsIGZpZWxkMikpIHsKKyAgICAgIGlmIChmaWVsZHMxX3Njb3BlID09IEZVTEwpIHsKKyAgICAgICAgdG1wX21lc3NhZ2VfZmllbGRzXy5wdXNoX2JhY2soZmllbGRzMVtpbmRleDFdKTsKKyAgICAgIH0KKyAgICAgICsraW5kZXgxOworICAgIH0gZWxzZSBpZiAoRmllbGRCZWZvcmUoZmllbGQyLCBmaWVsZDEpKSB7CisgICAgICBpZiAoZmllbGRzMl9zY29wZSA9PSBGVUxMKSB7CisgICAgICAgIHRtcF9tZXNzYWdlX2ZpZWxkc18ucHVzaF9iYWNrKGZpZWxkczJbaW5kZXgyXSk7CisgICAgICB9CisgICAgICArK2luZGV4MjsKKyAgICB9IGVsc2UgeworICAgICAgdG1wX21lc3NhZ2VfZmllbGRzXy5wdXNoX2JhY2soZmllbGRzMVtpbmRleDFdKTsKKyAgICAgICsraW5kZXgxOworICAgICAgKytpbmRleDI7CisgICAgfQorICB9CisKKyAgdG1wX21lc3NhZ2VfZmllbGRzXy5wdXNoX2JhY2sobnVsbHB0cik7CisKKyAgRmllbGREZXNjcmlwdG9yQXJyYXkgY29tYmluZWRfZmllbGRzKHRtcF9tZXNzYWdlX2ZpZWxkc18uYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9tZXNzYWdlX2ZpZWxkc18uZW5kKCkpOworCisgIHJldHVybiBjb21iaW5lZF9maWVsZHM7Cit9CisKK2Jvb2wgTWVzc2FnZURpZmZlcmVuY2VyOjpDb21wYXJlV2l0aEZpZWxkc0ludGVybmFsKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JBcnJheSYgbWVzc2FnZTFfZmllbGRzLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvckFycmF5JiBtZXNzYWdlMl9maWVsZHMsCisgICAgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4qIHBhcmVudF9maWVsZHMpIHsKKyAgYm9vbCBpc0RpZmZlcmVudCA9IGZhbHNlOworICBpbnQgZmllbGRfaW5kZXgxID0gMDsKKyAgaW50IGZpZWxkX2luZGV4MiA9IDA7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbjEgPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24yID0gbWVzc2FnZTIuR2V0UmVmbGVjdGlvbigpOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZDEgPSBtZXNzYWdlMV9maWVsZHNbZmllbGRfaW5kZXgxXTsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkMiA9IG1lc3NhZ2UyX2ZpZWxkc1tmaWVsZF9pbmRleDJdOworCisgICAgLy8gT25jZSB3ZSBoYXZlIHJlYWNoZWQgc2VudGluZWwgdmFsdWVzLCB3ZSBhcmUgZG9uZSB0aGUgY29tcGFyaXNvbi4KKyAgICBpZiAoZmllbGQxID09IE5VTEwgJiYgZmllbGQyID09IE5VTEwpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciBkaWZmZXJlbmNlcyBpbiB0aGUgZmllbGQgaXRzZWxmLgorICAgIGlmIChGaWVsZEJlZm9yZShmaWVsZDEsIGZpZWxkMikpIHsKKyAgICAgIC8vIEZpZWxkIDEgaXMgbm90IGluIHRoZSBmaWVsZCBsaXN0IGZvciBtZXNzYWdlIDIuCisgICAgICBpZiAoSXNJZ25vcmVkKG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGQxLCAqcGFyZW50X2ZpZWxkcykpIHsKKyAgICAgICAgLy8gV2UgYXJlIGlnbm9yaW5nIGZpZWxkMS4gUmVwb3J0IHRoZSBpZ25vcmUgYW5kIG1vdmUgb24gdG8KKyAgICAgICAgLy8gdGhlIG5leHQgZmllbGQgaW4gbWVzc2FnZTFfZmllbGRzLgorICAgICAgICBpZiAocmVwb3J0ZXJfICE9IE5VTEwpIHsKKyAgICAgICAgICBTcGVjaWZpY0ZpZWxkIHNwZWNpZmljX2ZpZWxkOworICAgICAgICAgIHNwZWNpZmljX2ZpZWxkLmZpZWxkID0gZmllbGQxOworICAgICAgICAgIHBhcmVudF9maWVsZHMtPnB1c2hfYmFjayhzcGVjaWZpY19maWVsZCk7CisgICAgICAgICAgaWYgKHJlcG9ydF9pZ25vcmVzXykgeworICAgICAgICAgICAgcmVwb3J0ZXJfLT5SZXBvcnRJZ25vcmVkKG1lc3NhZ2UxLCBtZXNzYWdlMiwgKnBhcmVudF9maWVsZHMpOworICAgICAgICAgIH0KKyAgICAgICAgICBwYXJlbnRfZmllbGRzLT5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgICAgICsrZmllbGRfaW5kZXgxOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKHJlcG9ydGVyXyAhPSBOVUxMKSB7CisgICAgICAgIGFzc2VydChmaWVsZDEgIT0gTlVMTCk7CisgICAgICAgIGludCBjb3VudCA9IGZpZWxkMS0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgPyByZWZsZWN0aW9uMS0+RmllbGRTaXplKG1lc3NhZ2UxLCBmaWVsZDEpCisgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgU3BlY2lmaWNGaWVsZCBzcGVjaWZpY19maWVsZDsKKyAgICAgICAgICBzcGVjaWZpY19maWVsZC5maWVsZCA9IGZpZWxkMTsKKyAgICAgICAgICBpZiAoZmllbGQxLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgICAgICBBZGRTcGVjaWZpY0luZGV4KCZzcGVjaWZpY19maWVsZCwgbWVzc2FnZTEsIGZpZWxkMSwgaSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNwZWNpZmljX2ZpZWxkLmluZGV4ID0gLTE7CisgICAgICAgICAgfQorCisgICAgICAgICAgcGFyZW50X2ZpZWxkcy0+cHVzaF9iYWNrKHNwZWNpZmljX2ZpZWxkKTsKKyAgICAgICAgICByZXBvcnRlcl8tPlJlcG9ydERlbGV0ZWQobWVzc2FnZTEsIG1lc3NhZ2UyLCAqcGFyZW50X2ZpZWxkcyk7CisgICAgICAgICAgcGFyZW50X2ZpZWxkcy0+cG9wX2JhY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIGlzRGlmZmVyZW50ID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgKytmaWVsZF9pbmRleDE7CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgaWYgKEZpZWxkQmVmb3JlKGZpZWxkMiwgZmllbGQxKSkgeworICAgICAgLy8gRmllbGQgMiBpcyBub3QgaW4gdGhlIGZpZWxkIGxpc3QgZm9yIG1lc3NhZ2UgMS4KKyAgICAgIGlmIChJc0lnbm9yZWQobWVzc2FnZTEsIG1lc3NhZ2UyLCBmaWVsZDIsICpwYXJlbnRfZmllbGRzKSkgeworICAgICAgICAvLyBXZSBhcmUgaWdub3JpbmcgZmllbGQyLiBSZXBvcnQgdGhlIGlnbm9yZSBhbmQgbW92ZSBvbiB0bworICAgICAgICAvLyB0aGUgbmV4dCBmaWVsZCBpbiBtZXNzYWdlMl9maWVsZHMuCisgICAgICAgIGlmIChyZXBvcnRlcl8gIT0gTlVMTCkgeworICAgICAgICAgIFNwZWNpZmljRmllbGQgc3BlY2lmaWNfZmllbGQ7CisgICAgICAgICAgc3BlY2lmaWNfZmllbGQuZmllbGQgPSBmaWVsZDI7CisgICAgICAgICAgcGFyZW50X2ZpZWxkcy0+cHVzaF9iYWNrKHNwZWNpZmljX2ZpZWxkKTsKKyAgICAgICAgICBpZiAocmVwb3J0X2lnbm9yZXNfKSB7CisgICAgICAgICAgICByZXBvcnRlcl8tPlJlcG9ydElnbm9yZWQobWVzc2FnZTEsIG1lc3NhZ2UyLCAqcGFyZW50X2ZpZWxkcyk7CisgICAgICAgICAgfQorICAgICAgICAgIHBhcmVudF9maWVsZHMtPnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgKytmaWVsZF9pbmRleDI7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAocmVwb3J0ZXJfICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGNvdW50ID0gZmllbGQyLT5pc19yZXBlYXRlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICA/IHJlZmxlY3Rpb24yLT5GaWVsZFNpemUobWVzc2FnZTIsIGZpZWxkMikKKyAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICBTcGVjaWZpY0ZpZWxkIHNwZWNpZmljX2ZpZWxkOworICAgICAgICAgIHNwZWNpZmljX2ZpZWxkLmZpZWxkID0gZmllbGQyOworICAgICAgICAgIGlmIChmaWVsZDItPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgICAgIHNwZWNpZmljX2ZpZWxkLmluZGV4ID0gaTsKKyAgICAgICAgICAgIEFkZFNwZWNpZmljTmV3SW5kZXgoJnNwZWNpZmljX2ZpZWxkLCBtZXNzYWdlMiwgZmllbGQyLCBpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3BlY2lmaWNfZmllbGQuaW5kZXggPSAtMTsKKyAgICAgICAgICAgIHNwZWNpZmljX2ZpZWxkLm5ld19pbmRleCA9IC0xOworICAgICAgICAgIH0KKworICAgICAgICAgIHBhcmVudF9maWVsZHMtPnB1c2hfYmFjayhzcGVjaWZpY19maWVsZCk7CisgICAgICAgICAgcmVwb3J0ZXJfLT5SZXBvcnRBZGRlZChtZXNzYWdlMSwgbWVzc2FnZTIsICpwYXJlbnRfZmllbGRzKTsKKyAgICAgICAgICBwYXJlbnRfZmllbGRzLT5wb3BfYmFjaygpOworICAgICAgICB9CisKKyAgICAgICAgaXNEaWZmZXJlbnQgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICArK2ZpZWxkX2luZGV4MjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIEJ5IHRoaXMgcG9pbnQsIGZpZWxkMSBhbmQgZmllbGQyIGFyZSBndWFyYW50ZWVkIHRvIHBvaW50IHRvIHRoZSBzYW1lCisgICAgLy8gZmllbGQsIHNvIHdlIGNhbiBub3cgY29tcGFyZSB0aGUgdmFsdWVzLgorICAgIGlmIChJc0lnbm9yZWQobWVzc2FnZTEsIG1lc3NhZ2UyLCBmaWVsZDEsICpwYXJlbnRfZmllbGRzKSkgeworICAgICAgLy8gSWdub3JlIHRoaXMgZmllbGQuIFJlcG9ydCBhbmQgbW92ZSBvbi4KKyAgICAgIGlmIChyZXBvcnRlcl8gIT0gTlVMTCkgeworICAgICAgICBTcGVjaWZpY0ZpZWxkIHNwZWNpZmljX2ZpZWxkOworICAgICAgICBzcGVjaWZpY19maWVsZC5maWVsZCA9IGZpZWxkMTsKKyAgICAgICAgcGFyZW50X2ZpZWxkcy0+cHVzaF9iYWNrKHNwZWNpZmljX2ZpZWxkKTsKKyAgICAgICAgaWYgKHJlcG9ydF9pZ25vcmVzXykgeworICAgICAgICAgIHJlcG9ydGVyXy0+UmVwb3J0SWdub3JlZChtZXNzYWdlMSwgbWVzc2FnZTIsICpwYXJlbnRfZmllbGRzKTsKKyAgICAgICAgfQorICAgICAgICBwYXJlbnRfZmllbGRzLT5wb3BfYmFjaygpOworICAgICAgfQorCisgICAgICArK2ZpZWxkX2luZGV4MTsKKyAgICAgICsrZmllbGRfaW5kZXgyOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgYm9vbCBmaWVsZERpZmZlcmVudCA9IGZhbHNlOworICAgIGFzc2VydChmaWVsZDEgIT0gTlVMTCk7CisgICAgaWYgKGZpZWxkMS0+aXNfbWFwKCkpIHsKKyAgICAgIGZpZWxkRGlmZmVyZW50ID0KKyAgICAgICAgICAhQ29tcGFyZU1hcEZpZWxkKG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGQxLCBwYXJlbnRfZmllbGRzKTsKKyAgICB9IGVsc2UgaWYgKGZpZWxkMS0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgZmllbGREaWZmZXJlbnQgPQorICAgICAgICAgICFDb21wYXJlUmVwZWF0ZWRGaWVsZChtZXNzYWdlMSwgbWVzc2FnZTIsIGZpZWxkMSwgcGFyZW50X2ZpZWxkcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpZWxkRGlmZmVyZW50ID0gIUNvbXBhcmVGaWVsZFZhbHVlVXNpbmdQYXJlbnRGaWVsZHMoCisgICAgICAgICAgbWVzc2FnZTEsIG1lc3NhZ2UyLCBmaWVsZDEsIC0xLCAtMSwgcGFyZW50X2ZpZWxkcyk7CisKKyAgICAgIGlmIChyZXBvcnRlcl8gIT0gbnVsbHB0cikgeworICAgICAgICBTcGVjaWZpY0ZpZWxkIHNwZWNpZmljX2ZpZWxkOworICAgICAgICBzcGVjaWZpY19maWVsZC5maWVsZCA9IGZpZWxkMTsKKyAgICAgICAgcGFyZW50X2ZpZWxkcy0+cHVzaF9iYWNrKHNwZWNpZmljX2ZpZWxkKTsKKyAgICAgICAgaWYgKGZpZWxkRGlmZmVyZW50KSB7CisgICAgICAgICAgcmVwb3J0ZXJfLT5SZXBvcnRNb2RpZmllZChtZXNzYWdlMSwgbWVzc2FnZTIsICpwYXJlbnRfZmllbGRzKTsKKyAgICAgICAgICBpc0RpZmZlcmVudCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAocmVwb3J0X21hdGNoZXNfKSB7CisgICAgICAgICAgcmVwb3J0ZXJfLT5SZXBvcnRNYXRjaGVkKG1lc3NhZ2UxLCBtZXNzYWdlMiwgKnBhcmVudF9maWVsZHMpOworICAgICAgICB9CisgICAgICAgIHBhcmVudF9maWVsZHMtPnBvcF9iYWNrKCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChmaWVsZERpZmZlcmVudCkgeworICAgICAgaWYgKHJlcG9ydGVyXyA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CisgICAgICBpc0RpZmZlcmVudCA9IHRydWU7CisgICAgfQorICAgIC8vIEluY3JlbWVudCB0aGUgZmllbGQgaW5kaWNlcy4KKyAgICArK2ZpZWxkX2luZGV4MTsKKyAgICArK2ZpZWxkX2luZGV4MjsKKyAgfQorCisgIHJldHVybiAhaXNEaWZmZXJlbnQ7Cit9CisKK2Jvb2wgTWVzc2FnZURpZmZlcmVuY2VyOjpJc01hdGNoKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVwZWF0ZWRfZmllbGQsCisgICAgY29uc3QgTWFwS2V5Q29tcGFyYXRvcioga2V5X2NvbXBhcmF0b3IsIGNvbnN0IE1lc3NhZ2UqIG1lc3NhZ2UxLAorICAgIGNvbnN0IE1lc3NhZ2UqIG1lc3NhZ2UyLCBjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgcGFyZW50X2ZpZWxkcywKKyAgICBSZXBvcnRlciogcmVwb3J0ZXIsIGludCBpbmRleDEsIGludCBpbmRleDIpIHsKKyAgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4gY3VycmVudF9wYXJlbnRfZmllbGRzKHBhcmVudF9maWVsZHMpOworICBpZiAocmVwZWF0ZWRfZmllbGQtPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICByZXR1cm4gQ29tcGFyZUZpZWxkVmFsdWVVc2luZ1BhcmVudEZpZWxkcygqbWVzc2FnZTEsICptZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZF9maWVsZCwgaW5kZXgxLCBpbmRleDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnRfcGFyZW50X2ZpZWxkcyk7CisgIH0KKyAgLy8gQmFjayB1cCB0aGUgUmVwb3J0ZXIgYW5kIG91dHB1dF9zdHJpbmdfLiAgVGhleSB3aWxsIGJlIHJlc2V0IGluIHRoZQorICAvLyBmb2xsb3dpbmcgY29kZS4KKyAgUmVwb3J0ZXIqIGJhY2t1cF9yZXBvcnRlciA9IHJlcG9ydGVyXzsKKyAgc3RkOjpzdHJpbmcqIG91dHB1dF9zdHJpbmcgPSBvdXRwdXRfc3RyaW5nXzsKKyAgcmVwb3J0ZXJfID0gcmVwb3J0ZXI7CisgIG91dHB1dF9zdHJpbmdfID0gTlVMTDsKKyAgYm9vbCBtYXRjaDsKKworICBpZiAoa2V5X2NvbXBhcmF0b3IgPT0gTlVMTCkgeworICAgIG1hdGNoID0gQ29tcGFyZUZpZWxkVmFsdWVVc2luZ1BhcmVudEZpZWxkcygqbWVzc2FnZTEsICptZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfZmllbGQsIGluZGV4MSwgaW5kZXgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudF9wYXJlbnRfZmllbGRzKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uMSA9IG1lc3NhZ2UxLT5HZXRSZWZsZWN0aW9uKCk7CisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbjIgPSBtZXNzYWdlMi0+R2V0UmVmbGVjdGlvbigpOworICAgIGNvbnN0IE1lc3NhZ2UmIG0xID0KKyAgICAgICAgcmVmbGVjdGlvbjEtPkdldFJlcGVhdGVkTWVzc2FnZSgqbWVzc2FnZTEsIHJlcGVhdGVkX2ZpZWxkLCBpbmRleDEpOworICAgIGNvbnN0IE1lc3NhZ2UmIG0yID0KKyAgICAgICAgcmVmbGVjdGlvbjItPkdldFJlcGVhdGVkTWVzc2FnZSgqbWVzc2FnZTIsIHJlcGVhdGVkX2ZpZWxkLCBpbmRleDIpOworICAgIFNwZWNpZmljRmllbGQgc3BlY2lmaWNfZmllbGQ7CisgICAgc3BlY2lmaWNfZmllbGQuZmllbGQgPSByZXBlYXRlZF9maWVsZDsKKyAgICBpZiAocmVwZWF0ZWRfZmllbGQtPmlzX21hcCgpKSB7CisgICAgICBzcGVjaWZpY19maWVsZC5tYXBfZW50cnkxID0gJm0xOworICAgICAgc3BlY2lmaWNfZmllbGQubWFwX2VudHJ5MiA9ICZtMjsKKyAgICB9CisgICAgc3BlY2lmaWNfZmllbGQuaW5kZXggPSBpbmRleDE7CisgICAgc3BlY2lmaWNfZmllbGQubmV3X2luZGV4ID0gaW5kZXgyOworICAgIGN1cnJlbnRfcGFyZW50X2ZpZWxkcy5wdXNoX2JhY2soc3BlY2lmaWNfZmllbGQpOworICAgIG1hdGNoID0ga2V5X2NvbXBhcmF0b3ItPklzTWF0Y2gobTEsIG0yLCBjdXJyZW50X3BhcmVudF9maWVsZHMpOworICB9CisKKyAgcmVwb3J0ZXJfID0gYmFja3VwX3JlcG9ydGVyOworICBvdXRwdXRfc3RyaW5nXyA9IG91dHB1dF9zdHJpbmc7CisgIHJldHVybiBtYXRjaDsKK30KKworYm9vbCBNZXNzYWdlRGlmZmVyZW5jZXI6OkNvbXBhcmVNYXBGaWVsZEJ5TWFwUmVmbGVjdGlvbigKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBtYXBfZmllbGQsIHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+KiBwYXJlbnRfZmllbGRzLAorICAgIERlZmF1bHRGaWVsZENvbXBhcmF0b3IqIGNvbXBhcmF0b3IpIHsKKyAgR09PR0xFX0RDSEVDS19FUShudWxscHRyLCByZXBvcnRlcl8pOworICBHT09HTEVfRENIRUNLKG1hcF9maWVsZC0+aXNfbWFwKCkpOworICBHT09HTEVfRENIRUNLKG1hcF9maWVsZF9rZXlfY29tcGFyYXRvcl8uZmluZChtYXBfZmllbGQpID09CisgICAgICAgICBtYXBfZmllbGRfa2V5X2NvbXBhcmF0b3JfLmVuZCgpKTsKKyAgR09PR0xFX0RDSEVDS19FUShyZXBlYXRlZF9maWVsZF9jb21wYXJpc29uXywgQVNfTElTVCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24xID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uMiA9IG1lc3NhZ2UyLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgaW50IGNvdW50MSA9IHJlZmxlY3Rpb24xLT5NYXBTaXplKG1lc3NhZ2UxLCBtYXBfZmllbGQpOworICBjb25zdCBpbnQgY291bnQyID0gcmVmbGVjdGlvbjItPk1hcFNpemUobWVzc2FnZTIsIG1hcF9maWVsZCk7CisgIGNvbnN0IGJvb2wgdHJlYXRlZF9hc19zdWJzZXQgPSBJc1RyZWF0ZWRBc1N1YnNldChtYXBfZmllbGQpOworICBpZiAoY291bnQxICE9IGNvdW50MiAmJiAhdHJlYXRlZF9hc19zdWJzZXQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGNvdW50MSA+IGNvdW50MikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEZpcnN0IHBhc3M6IGNoZWNrIHdoZXRoZXIgdGhlIHNhbWUga2V5cyBhcmUgcHJlc2VudC4KKyAgZm9yIChNYXBJdGVyYXRvciBpdCA9IHJlZmxlY3Rpb24xLT5NYXBCZWdpbihjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9maWVsZCksCisgICAgICAgICAgICAgICAgICAgaXRfZW5kID0gcmVmbGVjdGlvbjEtPk1hcEVuZChjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZpZWxkKTsKKyAgICAgICBpdCAhPSBpdF9lbmQ7ICsraXQpIHsKKyAgICBpZiAoIXJlZmxlY3Rpb24yLT5Db250YWluc01hcEtleShtZXNzYWdlMiwgbWFwX2ZpZWxkLCBpdC5HZXRLZXkoKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBTZWNvbmQgcGFzczogY29tcGFyZSB2YWx1ZXMgZm9yIG1hdGNoaW5nIGtleXMuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsX2RlcyA9IG1hcF9maWVsZC0+bWVzc2FnZV90eXBlKCktPm1hcF92YWx1ZSgpOworICBzd2l0Y2ggKHZhbF9kZXMtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoQ1BQVFlQRSwgTUVUSE9ELCBDT01QQVJFTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKE1hcEl0ZXJhdG9yIGl0ID0gcmVmbGVjdGlvbjEtPk1hcEJlZ2luKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZTEpLCBtYXBfZmllbGQpLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGl0X2VuZCA9IHJlZmxlY3Rpb24xLT5NYXBFbmQoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZTEpLCBtYXBfZmllbGQpOyAgICAgICAgIFwKKyAgICAgICAgIGl0ICE9IGl0X2VuZDsgKytpdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIE1hcFZhbHVlQ29uc3RSZWYgdmFsdWUyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJlZmxlY3Rpb24yLT5Mb29rdXBNYXBWYWx1ZShtZXNzYWdlMiwgbWFwX2ZpZWxkLCBpdC5HZXRLZXkoKSwgJnZhbHVlMik7IFwKKyAgICAgIGlmICghY29tcGFyYXRvci0+Q29tcGFyZSMjQ09NUEFSRU1FVEhPRCgqdmFsX2RlcywgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC5HZXRWYWx1ZVJlZigpLkdldCMjTUVUSE9EKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTIuR2V0IyNNRVRIT0QoKSkpIHsgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorICAgIEhBTkRMRV9UWVBFKElOVDMyLCBJbnQzMlZhbHVlLCBJbnQzMik7CisgICAgSEFORExFX1RZUEUoSU5UNjQsIEludDY0VmFsdWUsIEludDY0KTsKKyAgICBIQU5ETEVfVFlQRShVSU5UMzIsIFVJbnQzMlZhbHVlLCBVSW50MzIpOworICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgVUludDY0VmFsdWUsIFVJbnQ2NCk7CisgICAgSEFORExFX1RZUEUoRE9VQkxFLCBEb3VibGVWYWx1ZSwgRG91YmxlKTsKKyAgICBIQU5ETEVfVFlQRShGTE9BVCwgRmxvYXRWYWx1ZSwgRmxvYXQpOworICAgIEhBTkRMRV9UWVBFKEJPT0wsIEJvb2xWYWx1ZSwgQm9vbCk7CisgICAgSEFORExFX1RZUEUoU1RSSU5HLCBTdHJpbmdWYWx1ZSwgU3RyaW5nKTsKKyAgICBIQU5ETEVfVFlQRShFTlVNLCBFbnVtVmFsdWUsIEludDMyKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6IHsKKyAgICAgIGZvciAoTWFwSXRlcmF0b3IgaXQgPSByZWZsZWN0aW9uMS0+TWFwQmVnaW4oCisgICAgICAgICAgICAgICBjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZTEpLCBtYXBfZmllbGQpOworICAgICAgICAgICBpdCAhPQorICAgICAgICAgICByZWZsZWN0aW9uMS0+TWFwRW5kKGNvbnN0X2Nhc3Q8TWVzc2FnZSo+KCZtZXNzYWdlMSksIG1hcF9maWVsZCk7CisgICAgICAgICAgICsraXQpIHsKKyAgICAgICAgaWYgKCFyZWZsZWN0aW9uMi0+Q29udGFpbnNNYXBLZXkobWVzc2FnZTIsIG1hcF9maWVsZCwgaXQuR2V0S2V5KCkpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJvb2wgY29tcGFyZV9yZXN1bHQ7CisgICAgICAgIE1hcFZhbHVlQ29uc3RSZWYgdmFsdWUyOworICAgICAgICByZWZsZWN0aW9uMi0+TG9va3VwTWFwVmFsdWUobWVzc2FnZTIsIG1hcF9maWVsZCwgaXQuR2V0S2V5KCksICZ2YWx1ZTIpOworICAgICAgICAvLyBBcHBlbmQgY3VycmVudGx5IGNvbXBhcmVkIGZpZWxkIHRvIHRoZSBlbmQgb2YgcGFyZW50X2ZpZWxkcy4KKyAgICAgICAgU3BlY2lmaWNGaWVsZCBzcGVjaWZpY192YWx1ZV9maWVsZDsKKyAgICAgICAgc3BlY2lmaWNfdmFsdWVfZmllbGQuZmllbGQgPSB2YWxfZGVzOworICAgICAgICBwYXJlbnRfZmllbGRzLT5wdXNoX2JhY2soc3BlY2lmaWNfdmFsdWVfZmllbGQpOworICAgICAgICBjb21wYXJlX3Jlc3VsdCA9IENvbXBhcmUoaXQuR2V0VmFsdWVSZWYoKS5HZXRNZXNzYWdlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMi5HZXRNZXNzYWdlVmFsdWUoKSwgcGFyZW50X2ZpZWxkcyk7CisgICAgICAgIHBhcmVudF9maWVsZHMtPnBvcF9iYWNrKCk7CisgICAgICAgIGlmICghY29tcGFyZV9yZXN1bHQpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNZXNzYWdlRGlmZmVyZW5jZXI6OkNvbXBhcmVNYXBGaWVsZCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXBlYXRlZF9maWVsZCwKKyAgICBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiogcGFyZW50X2ZpZWxkcykgeworICBHT09HTEVfRENIRUNLKHJlcGVhdGVkX2ZpZWxkLT5pc19tYXAoKSk7CisKKyAgLy8gdGhlIGlucHV0IEZpZWxkRGVzY3JpcHRvciBpcyBndWFyYW50ZWVkIHRvIGJlIHJlcGVhdGVkIGZpZWxkLgorICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uMSA9IG1lc3NhZ2UxLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbjIgPSBtZXNzYWdlMi5HZXRSZWZsZWN0aW9uKCk7CisKKyAgLy8gV2hlbiBib3RoIG1hcCBmaWVsZHMgYXJlIG9uIG1hcCwgZG8gbm90IHN5bmMgdG8gcmVwZWF0ZWQgZmllbGQuCisgIGlmIChyZWZsZWN0aW9uMS0+R2V0TWFwRGF0YShtZXNzYWdlMSwgcmVwZWF0ZWRfZmllbGQpLT5Jc01hcFZhbGlkKCkgJiYKKyAgICAgIHJlZmxlY3Rpb24yLT5HZXRNYXBEYXRhKG1lc3NhZ2UyLCByZXBlYXRlZF9maWVsZCktPklzTWFwVmFsaWQoKSAmJgorICAgICAgLy8gVE9ETyhqaWVsdW8pOiBBZGQgc3VwcG9ydCBmb3IgcmVwb3J0ZXIKKyAgICAgIHJlcG9ydGVyXyA9PSBudWxscHRyICYmCisgICAgICAvLyBVc2VycyBkaWRuJ3Qgc2V0IGN1c3RvbSBtYXAgZmllbGQga2V5IGNvbXBhcmF0b3IKKyAgICAgIG1hcF9maWVsZF9rZXlfY29tcGFyYXRvcl8uZmluZChyZXBlYXRlZF9maWVsZCkgPT0KKyAgICAgICAgICBtYXBfZmllbGRfa2V5X2NvbXBhcmF0b3JfLmVuZCgpICYmCisgICAgICAvLyBVc2VycyBkaWRuJ3Qgc2V0IHJlcGVhdGVkIGZpZWxkIGNvbXBhcmlzb24KKyAgICAgIHJlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb25fID09IEFTX0xJU1QgJiYKKyAgICAgIC8vIFVzZXJzIGRpZG4ndCBzZXQgdGhlaXIgb3duIEZpZWxkQ29tcGFyYXRvciBpbXBsZW1lbnRhdGlvbgorICAgICAgZmllbGRfY29tcGFyYXRvcl9raW5kXyA9PSBrRkNEZWZhdWx0KSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBrZXlfZGVzID0gcmVwZWF0ZWRfZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5tYXBfa2V5KCk7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWxfZGVzID0KKyAgICAgICAgcmVwZWF0ZWRfZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5tYXBfdmFsdWUoKTsKKyAgICBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiBjdXJyZW50X3BhcmVudF9maWVsZHMoKnBhcmVudF9maWVsZHMpOworICAgIFNwZWNpZmljRmllbGQgc3BlY2lmaWNfZmllbGQ7CisgICAgc3BlY2lmaWNfZmllbGQuZmllbGQgPSByZXBlYXRlZF9maWVsZDsKKyAgICBjdXJyZW50X3BhcmVudF9maWVsZHMucHVzaF9iYWNrKHNwZWNpZmljX2ZpZWxkKTsKKyAgICBpZiAoIUlzSWdub3JlZChtZXNzYWdlMSwgbWVzc2FnZTIsIGtleV9kZXMsIGN1cnJlbnRfcGFyZW50X2ZpZWxkcykgJiYKKyAgICAgICAgIUlzSWdub3JlZChtZXNzYWdlMSwgbWVzc2FnZTIsIHZhbF9kZXMsIGN1cnJlbnRfcGFyZW50X2ZpZWxkcykpIHsKKyAgICAgIHJldHVybiBDb21wYXJlTWFwRmllbGRCeU1hcFJlZmxlY3Rpb24obWVzc2FnZTEsIG1lc3NhZ2UyLCByZXBlYXRlZF9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnRfcGFyZW50X2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfY29tcGFyYXRvcl8uZGVmYXVsdF9pbXBsKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gQ29tcGFyZVJlcGVhdGVkUmVwKG1lc3NhZ2UxLCBtZXNzYWdlMiwgcmVwZWF0ZWRfZmllbGQsIHBhcmVudF9maWVsZHMpOworfQorCitib29sIE1lc3NhZ2VEaWZmZXJlbmNlcjo6Q29tcGFyZVJlcGVhdGVkRmllbGQoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVwZWF0ZWRfZmllbGQsCisgICAgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4qIHBhcmVudF9maWVsZHMpIHsKKyAgR09PR0xFX0RDSEVDSyghcmVwZWF0ZWRfZmllbGQtPmlzX21hcCgpKTsKKyAgcmV0dXJuIENvbXBhcmVSZXBlYXRlZFJlcChtZXNzYWdlMSwgbWVzc2FnZTIsIHJlcGVhdGVkX2ZpZWxkLCBwYXJlbnRfZmllbGRzKTsKK30KKworYm9vbCBNZXNzYWdlRGlmZmVyZW5jZXI6OkNvbXBhcmVSZXBlYXRlZFJlcCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXBlYXRlZF9maWVsZCwKKyAgICBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiogcGFyZW50X2ZpZWxkcykgeworICAvLyB0aGUgaW5wdXQgRmllbGREZXNjcmlwdG9yIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmVwZWF0ZWQgZmllbGQuCisgIEdPT0dMRV9EQ0hFQ0socmVwZWF0ZWRfZmllbGQtPmlzX3JlcGVhdGVkKCkpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uMSA9IG1lc3NhZ2UxLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbjIgPSBtZXNzYWdlMi5HZXRSZWZsZWN0aW9uKCk7CisKKyAgY29uc3QgaW50IGNvdW50MSA9IHJlZmxlY3Rpb24xLT5GaWVsZFNpemUobWVzc2FnZTEsIHJlcGVhdGVkX2ZpZWxkKTsKKyAgY29uc3QgaW50IGNvdW50MiA9IHJlZmxlY3Rpb24yLT5GaWVsZFNpemUobWVzc2FnZTIsIHJlcGVhdGVkX2ZpZWxkKTsKKyAgY29uc3QgYm9vbCB0cmVhdGVkX2FzX3N1YnNldCA9IElzVHJlYXRlZEFzU3Vic2V0KHJlcGVhdGVkX2ZpZWxkKTsKKworICAvLyBJZiB0aGUgZmllbGQgaXMgbm90IHRyZWF0ZWQgYXMgc3Vic2V0IGFuZCBubyBkZXRhaWxlZCByZXBvcnRzIGlzIG5lZWRlZCwKKyAgLy8gd2UgZG8gYSBxdWljayBjaGVjayBvbiB0aGUgbnVtYmVyIG9mIHRoZSBlbGVtZW50cyB0byBhdm9pZCB1bm5lY2Vzc2FyeQorICAvLyBjb21wYXJpc29uLgorICBpZiAoY291bnQxICE9IGNvdW50MiAmJiByZXBvcnRlcl8gPT0gTlVMTCAmJiAhdHJlYXRlZF9hc19zdWJzZXQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gQSBtYXRjaCBjYW4gbmV2ZXIgYmUgZm91bmQgaWYgbWVzc2FnZTEgaGFzIG1vcmUgaXRlbXMgdGhhbiBtZXNzYWdlMi4KKyAgaWYgKGNvdW50MSA+IGNvdW50MiAmJiByZXBvcnRlcl8gPT0gTlVMTCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFRoZXNlIHR3byBsaXN0IGFyZSB1c2VkIGZvciBzdG9yZSB0aGUgaW5kZXggb2YgdGhlIGNvcnJlc3BvbmRlbnQKKyAgLy8gZWxlbWVudCBpbiBwZWVyIHJlcGVhdGVkIGZpZWxkLgorICBzdGQ6OnZlY3RvcjxpbnQ+IG1hdGNoX2xpc3QxOworICBzdGQ6OnZlY3RvcjxpbnQ+IG1hdGNoX2xpc3QyOworCisgIGNvbnN0IE1hcEtleUNvbXBhcmF0b3IqIGtleV9jb21wYXJhdG9yID0gR2V0TWFwS2V5Q29tcGFyYXRvcihyZXBlYXRlZF9maWVsZCk7CisgIGJvb2wgc21hcnRfbGlzdCA9IElzVHJlYXRlZEFzU21hcnRMaXN0KHJlcGVhdGVkX2ZpZWxkKTsKKyAgYm9vbCBzaW1wbGVfbGlzdCA9IGtleV9jb21wYXJhdG9yID09IG51bGxwdHIgJiYKKyAgICAgICAgICAgICAgICAgICAgICFJc1RyZWF0ZWRBc1NldChyZXBlYXRlZF9maWVsZCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICFJc1RyZWF0ZWRBc1NtYXJ0U2V0KHJlcGVhdGVkX2ZpZWxkKSAmJiAhc21hcnRfbGlzdDsKKworICAvLyBGb3Igc2ltcGxlIGxpc3RzLCB3ZSBhdm9pZCBtYXRjaGluZyByZXBlYXRlZCBmaWVsZCBpbmRpY2VzLCBzYXZpbmcgdGhlCisgIC8vIG1lbW9yeSBhbGxvY2F0aW9ucyB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBuZWVkZWQgZm9yIG1hdGNoX2xpc3QxIGFuZAorICAvLyBtYXRjaF9saXN0Mi4KKyAgaWYgKCFzaW1wbGVfbGlzdCkgeworICAgIC8vIFRyeSB0byBtYXRjaCBpbmRpY2VzIG9mIHRoZSByZXBlYXRlZCBmaWVsZHMuIFJldHVybiBmYWxzZSBpZiBtYXRjaCBmYWlscy4KKyAgICBpZiAoIU1hdGNoUmVwZWF0ZWRGaWVsZEluZGljZXMobWVzc2FnZTEsIG1lc3NhZ2UyLCByZXBlYXRlZF9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2NvbXBhcmF0b3IsICpwYXJlbnRfZmllbGRzLCAmbWF0Y2hfbGlzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXRjaF9saXN0MikgJiYKKyAgICAgICAgcmVwb3J0ZXJfID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBib29sIGZpZWxkRGlmZmVyZW50ID0gZmFsc2U7CisgIFNwZWNpZmljRmllbGQgc3BlY2lmaWNfZmllbGQ7CisgIHNwZWNpZmljX2ZpZWxkLmZpZWxkID0gcmVwZWF0ZWRfZmllbGQ7CisKKyAgLy8gQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhbHJlYWR5IG1hdGNoZWQgcGFpcnMgb2YgZmllbGRzICh3aXRoIHRoZSByZXBvcnRpbmcKKyAgLy8gdG8gYmUgZG9uZSBsYXRlcikuIE5vdyB0byBjaGVjayBpZiB0aGUgcGFpcmVkIGVsZW1lbnRzIGFyZSBkaWZmZXJlbnQuCisgIGludCBuZXh0X3VubWF0Y2hlZF9pbmRleCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQxOyBpKyspIHsKKyAgICBpZiAoc2ltcGxlX2xpc3QgJiYgaSA+PSBjb3VudDIpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIXNpbXBsZV9saXN0ICYmIG1hdGNoX2xpc3QxW2ldID09IC0xKSB7CisgICAgICBpZiAoc21hcnRfbGlzdCkgeworICAgICAgICBpZiAocmVwb3J0ZXJfID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKyAgICAgICAgQWRkU3BlY2lmaWNJbmRleCgmc3BlY2lmaWNfZmllbGQsIG1lc3NhZ2UxLCByZXBlYXRlZF9maWVsZCwgaSk7CisgICAgICAgIHBhcmVudF9maWVsZHMtPnB1c2hfYmFjayhzcGVjaWZpY19maWVsZCk7CisgICAgICAgIHJlcG9ydGVyXy0+UmVwb3J0RGVsZXRlZChtZXNzYWdlMSwgbWVzc2FnZTIsICpwYXJlbnRfZmllbGRzKTsKKyAgICAgICAgcGFyZW50X2ZpZWxkcy0+cG9wX2JhY2soKTsKKyAgICAgICAgZmllbGREaWZmZXJlbnQgPSB0cnVlOworICAgICAgICAvLyBVc2UgLTIgdG8gbWFyayB0aGlzIGVsZW1lbnQgaGFzIGJlZW4gcmVwb3J0ZWQuCisgICAgICAgIG1hdGNoX2xpc3QxW2ldID0gLTI7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNtYXJ0X2xpc3QpIHsKKyAgICAgIGZvciAoaW50IGogPSBuZXh0X3VubWF0Y2hlZF9pbmRleDsgaiA8IG1hdGNoX2xpc3QxW2ldOyArK2opIHsKKyAgICAgICAgR09PR0xFX0NIRUNLX0xFKDAsIGopOworICAgICAgICBpZiAocmVwb3J0ZXJfID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKyAgICAgICAgc3BlY2lmaWNfZmllbGQuaW5kZXggPSBqOworICAgICAgICBBZGRTcGVjaWZpY05ld0luZGV4KCZzcGVjaWZpY19maWVsZCwgbWVzc2FnZTIsIHJlcGVhdGVkX2ZpZWxkLCBqKTsKKyAgICAgICAgcGFyZW50X2ZpZWxkcy0+cHVzaF9iYWNrKHNwZWNpZmljX2ZpZWxkKTsKKyAgICAgICAgcmVwb3J0ZXJfLT5SZXBvcnRBZGRlZChtZXNzYWdlMSwgbWVzc2FnZTIsICpwYXJlbnRfZmllbGRzKTsKKyAgICAgICAgcGFyZW50X2ZpZWxkcy0+cG9wX2JhY2soKTsKKyAgICAgICAgZmllbGREaWZmZXJlbnQgPSB0cnVlOworICAgICAgICAvLyBVc2UgLTIgdG8gbWFyayB0aGlzIGVsZW1lbnQgaGFzIGJlZW4gcmVwb3J0ZWQuCisgICAgICAgIG1hdGNoX2xpc3QyW2pdID0gLTI7CisgICAgICB9CisgICAgfQorICAgIEFkZFNwZWNpZmljSW5kZXgoJnNwZWNpZmljX2ZpZWxkLCBtZXNzYWdlMSwgcmVwZWF0ZWRfZmllbGQsIGkpOworICAgIGlmIChzaW1wbGVfbGlzdCkgeworICAgICAgQWRkU3BlY2lmaWNOZXdJbmRleCgmc3BlY2lmaWNfZmllbGQsIG1lc3NhZ2UyLCByZXBlYXRlZF9maWVsZCwgaSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZFNwZWNpZmljTmV3SW5kZXgoJnNwZWNpZmljX2ZpZWxkLCBtZXNzYWdlMiwgcmVwZWF0ZWRfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2xpc3QxW2ldKTsKKyAgICAgIG5leHRfdW5tYXRjaGVkX2luZGV4ID0gbWF0Y2hfbGlzdDFbaV0gKyAxOworICAgIH0KKworICAgIGNvbnN0IGJvb2wgcmVzdWx0ID0gQ29tcGFyZUZpZWxkVmFsdWVVc2luZ1BhcmVudEZpZWxkcygKKyAgICAgICAgbWVzc2FnZTEsIG1lc3NhZ2UyLCByZXBlYXRlZF9maWVsZCwgaSwgc3BlY2lmaWNfZmllbGQubmV3X2luZGV4LAorICAgICAgICBwYXJlbnRfZmllbGRzKTsKKworICAgIC8vIElmIHdlIGhhdmUgZm91bmQgZGlmZmVyZW5jZXMsIGVpdGhlciByZXBvcnQgdGhlbSBvciB0ZXJtaW5hdGUgaWYKKyAgICAvLyBubyByZXBvcnRlciBpcyBwcmVzZW50LiBOb3RlIHRoYXQgUmVwb3J0TW9kaWZpZWQsIFJlcG9ydE1vdmVkLCBhbmQKKyAgICAvLyBSZXBvcnRNYXRjaGVkIGFyZSBhbGwgbXV0dWFsbHkgZXhjbHVzaXZlLgorICAgIGlmICghcmVzdWx0KSB7CisgICAgICBpZiAocmVwb3J0ZXJfID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICAgIHBhcmVudF9maWVsZHMtPnB1c2hfYmFjayhzcGVjaWZpY19maWVsZCk7CisgICAgICByZXBvcnRlcl8tPlJlcG9ydE1vZGlmaWVkKG1lc3NhZ2UxLCBtZXNzYWdlMiwgKnBhcmVudF9maWVsZHMpOworICAgICAgcGFyZW50X2ZpZWxkcy0+cG9wX2JhY2soKTsKKyAgICAgIGZpZWxkRGlmZmVyZW50ID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHJlcG9ydGVyXyAhPSBOVUxMICYmCisgICAgICAgICAgICAgICBzcGVjaWZpY19maWVsZC5pbmRleCAhPSBzcGVjaWZpY19maWVsZC5uZXdfaW5kZXggJiYKKyAgICAgICAgICAgICAgICFzcGVjaWZpY19maWVsZC5maWVsZC0+aXNfbWFwKCkgJiYgcmVwb3J0X21vdmVzXykgeworICAgICAgcGFyZW50X2ZpZWxkcy0+cHVzaF9iYWNrKHNwZWNpZmljX2ZpZWxkKTsKKyAgICAgIHJlcG9ydGVyXy0+UmVwb3J0TW92ZWQobWVzc2FnZTEsIG1lc3NhZ2UyLCAqcGFyZW50X2ZpZWxkcyk7CisgICAgICBwYXJlbnRfZmllbGRzLT5wb3BfYmFjaygpOworICAgIH0gZWxzZSBpZiAocmVwb3J0X21hdGNoZXNfICYmIHJlcG9ydGVyXyAhPSBOVUxMKSB7CisgICAgICBwYXJlbnRfZmllbGRzLT5wdXNoX2JhY2soc3BlY2lmaWNfZmllbGQpOworICAgICAgcmVwb3J0ZXJfLT5SZXBvcnRNYXRjaGVkKG1lc3NhZ2UxLCBtZXNzYWdlMiwgKnBhcmVudF9maWVsZHMpOworICAgICAgcGFyZW50X2ZpZWxkcy0+cG9wX2JhY2soKTsKKyAgICB9CisgIH0KKworICAvLyBSZXBvcnQgYW55IHJlbWFpbmluZyBhZGRpdGlvbnMgb3IgZGVsZXRpb25zLgorICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50MjsgKytpKSB7CisgICAgaWYgKCFzaW1wbGVfbGlzdCAmJiBtYXRjaF9saXN0MltpXSAhPSAtMSkgY29udGludWU7CisgICAgaWYgKHNpbXBsZV9saXN0ICYmIGkgPCBjb3VudDEpIGNvbnRpbnVlOworICAgIGlmICghdHJlYXRlZF9hc19zdWJzZXQpIHsKKyAgICAgIGZpZWxkRGlmZmVyZW50ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAocmVwb3J0ZXJfID09IE5VTEwpIGNvbnRpbnVlOworICAgIHNwZWNpZmljX2ZpZWxkLmluZGV4ID0gaTsKKyAgICBBZGRTcGVjaWZpY05ld0luZGV4KCZzcGVjaWZpY19maWVsZCwgbWVzc2FnZTIsIHJlcGVhdGVkX2ZpZWxkLCBpKTsKKyAgICBwYXJlbnRfZmllbGRzLT5wdXNoX2JhY2soc3BlY2lmaWNfZmllbGQpOworICAgIHJlcG9ydGVyXy0+UmVwb3J0QWRkZWQobWVzc2FnZTEsIG1lc3NhZ2UyLCAqcGFyZW50X2ZpZWxkcyk7CisgICAgcGFyZW50X2ZpZWxkcy0+cG9wX2JhY2soKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQxOyArK2kpIHsKKyAgICBpZiAoIXNpbXBsZV9saXN0ICYmIG1hdGNoX2xpc3QxW2ldICE9IC0xKSBjb250aW51ZTsKKyAgICBpZiAoc2ltcGxlX2xpc3QgJiYgaSA8IGNvdW50MikgY29udGludWU7CisgICAgYXNzZXJ0KHJlcG9ydGVyXyAhPSBOVUxMKTsKKyAgICBBZGRTcGVjaWZpY0luZGV4KCZzcGVjaWZpY19maWVsZCwgbWVzc2FnZTEsIHJlcGVhdGVkX2ZpZWxkLCBpKTsKKyAgICBwYXJlbnRfZmllbGRzLT5wdXNoX2JhY2soc3BlY2lmaWNfZmllbGQpOworICAgIHJlcG9ydGVyXy0+UmVwb3J0RGVsZXRlZChtZXNzYWdlMSwgbWVzc2FnZTIsICpwYXJlbnRfZmllbGRzKTsKKyAgICBwYXJlbnRfZmllbGRzLT5wb3BfYmFjaygpOworICAgIGZpZWxkRGlmZmVyZW50ID0gdHJ1ZTsKKyAgfQorICByZXR1cm4gIWZpZWxkRGlmZmVyZW50OworfQorCitib29sIE1lc3NhZ2VEaWZmZXJlbmNlcjo6Q29tcGFyZUZpZWxkVmFsdWUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKSB7CisgIHJldHVybiBDb21wYXJlRmllbGRWYWx1ZVVzaW5nUGFyZW50RmllbGRzKG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGQsIGluZGV4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgyLCBOVUxMKTsKK30KKworYm9vbCBNZXNzYWdlRGlmZmVyZW5jZXI6OkNvbXBhcmVGaWVsZFZhbHVlVXNpbmdQYXJlbnRGaWVsZHMoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleDEsIGludCBpbmRleDIsCisgICAgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4qIHBhcmVudF9maWVsZHMpIHsKKyAgRmllbGRDb250ZXh0IGZpZWxkX2NvbnRleHQocGFyZW50X2ZpZWxkcyk7CisgIEZpZWxkQ29tcGFyYXRvcjo6Q29tcGFyaXNvblJlc3VsdCByZXN1bHQgPSBHZXRGaWVsZENvbXBhcmlzb25SZXN1bHQoCisgICAgICBtZXNzYWdlMSwgbWVzc2FnZTIsIGZpZWxkLCBpbmRleDEsIGluZGV4MiwgJmZpZWxkX2NvbnRleHQpOworCisgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSAmJgorICAgICAgcmVzdWx0ID09IEZpZWxkQ29tcGFyYXRvcjo6UkVDVVJTRSkgeworICAgIC8vIEdldCB0aGUgbmVzdGVkIG1lc3NhZ2VzIGFuZCBjb21wYXJlIHRoZW0gdXNpbmcgb25lIG9mIHRoZSBDb21wYXJlCisgICAgLy8gbWV0aG9kcy4KKyAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uMSA9IG1lc3NhZ2UxLkdldFJlZmxlY3Rpb24oKTsKKyAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uMiA9IG1lc3NhZ2UyLkdldFJlZmxlY3Rpb24oKTsKKyAgICBjb25zdCBNZXNzYWdlJiBtMSA9CisgICAgICAgIGZpZWxkLT5pc19yZXBlYXRlZCgpCisgICAgICAgICAgICA/IHJlZmxlY3Rpb24xLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZTEsIGZpZWxkLCBpbmRleDEpCisgICAgICAgICAgICA6IHJlZmxlY3Rpb24xLT5HZXRNZXNzYWdlKG1lc3NhZ2UxLCBmaWVsZCk7CisgICAgY29uc3QgTWVzc2FnZSYgbTIgPQorICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgICAgPyByZWZsZWN0aW9uMi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UyLCBmaWVsZCwgaW5kZXgyKQorICAgICAgICAgICAgOiByZWZsZWN0aW9uMi0+R2V0TWVzc2FnZShtZXNzYWdlMiwgZmllbGQpOworCisgICAgLy8gcGFyZW50X2ZpZWxkcyBpcyB1c2VkIGluIGNhbGxzIHRvIFJlcG9ydGVyIG1ldGhvZHMuCisgICAgaWYgKHBhcmVudF9maWVsZHMgIT0gTlVMTCkgeworICAgICAgLy8gQXBwZW5kIGN1cnJlbnRseSBjb21wYXJlZCBmaWVsZCB0byB0aGUgZW5kIG9mIHBhcmVudF9maWVsZHMuCisgICAgICBTcGVjaWZpY0ZpZWxkIHNwZWNpZmljX2ZpZWxkOworICAgICAgc3BlY2lmaWNfZmllbGQuZmllbGQgPSBmaWVsZDsKKyAgICAgIEFkZFNwZWNpZmljSW5kZXgoJnNwZWNpZmljX2ZpZWxkLCBtZXNzYWdlMSwgZmllbGQsIGluZGV4MSk7CisgICAgICBBZGRTcGVjaWZpY05ld0luZGV4KCZzcGVjaWZpY19maWVsZCwgbWVzc2FnZTIsIGZpZWxkLCBpbmRleDIpOworICAgICAgcGFyZW50X2ZpZWxkcy0+cHVzaF9iYWNrKHNwZWNpZmljX2ZpZWxkKTsKKyAgICAgIGNvbnN0IGJvb2wgY29tcGFyZV9yZXN1bHQgPSBDb21wYXJlKG0xLCBtMiwgcGFyZW50X2ZpZWxkcyk7CisgICAgICBwYXJlbnRfZmllbGRzLT5wb3BfYmFjaygpOworICAgICAgcmV0dXJuIGNvbXBhcmVfcmVzdWx0OworICAgIH0gZWxzZSB7CisgICAgICAvLyBSZWNyZWF0ZXMgcGFyZW50X2ZpZWxkcyBhcyBpZiBtMSBhbmQgbTIgaGFkIG5vIHBhcmVudHMuCisgICAgICByZXR1cm4gQ29tcGFyZShtMSwgbTIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKHJlc3VsdCA9PSBGaWVsZENvbXBhcmF0b3I6OlNBTUUpOworICB9Cit9CisKK2Jvb2wgTWVzc2FnZURpZmZlcmVuY2VyOjpDaGVja1BhdGhDaGFuZ2VkKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiBmaWVsZF9wYXRoKSB7CisgIGZvciAoY29uc3QgU3BlY2lmaWNGaWVsZCYgc3BlY2lmaWNfZmllbGQgOiBmaWVsZF9wYXRoKSB7CisgICAgLy8gRG9uJ3QgY2hlY2sgaW5kZXhlcyBmb3IgbWFwIGVudHJpZXMgLS0gbWFwcyBhcmUgdW5vcmRlcmVkLgorICAgIGlmIChzcGVjaWZpY19maWVsZC5maWVsZCAhPSBudWxscHRyICYmIHNwZWNpZmljX2ZpZWxkLmZpZWxkLT5pc19tYXAoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChzcGVjaWZpY19maWVsZC5pbmRleCAhPSBzcGVjaWZpY19maWVsZC5uZXdfaW5kZXgpIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNZXNzYWdlRGlmZmVyZW5jZXI6OklzVHJlYXRlZEFzU2V0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgcmV0dXJuIGZhbHNlOworICBpZiAocmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbnNfLmZpbmQoZmllbGQpICE9CisgICAgICByZXBlYXRlZF9maWVsZF9jb21wYXJpc29uc18uZW5kKCkpIHsKKyAgICByZXR1cm4gcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbnNfW2ZpZWxkXSA9PSBBU19TRVQ7CisgIH0KKyAgcmV0dXJuIEdldE1hcEtleUNvbXBhcmF0b3IoZmllbGQpID09IG51bGxwdHIgJiYKKyAgICAgICAgIHJlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb25fID09IEFTX1NFVDsKK30KKworYm9vbCBNZXNzYWdlRGlmZmVyZW5jZXI6OklzVHJlYXRlZEFzU21hcnRTZXQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSByZXR1cm4gZmFsc2U7CisgIGlmIChyZXBlYXRlZF9maWVsZF9jb21wYXJpc29uc18uZmluZChmaWVsZCkgIT0KKyAgICAgIHJlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb25zXy5lbmQoKSkgeworICAgIHJldHVybiByZXBlYXRlZF9maWVsZF9jb21wYXJpc29uc19bZmllbGRdID09IEFTX1NNQVJUX1NFVDsKKyAgfQorICByZXR1cm4gR2V0TWFwS2V5Q29tcGFyYXRvcihmaWVsZCkgPT0gbnVsbHB0ciAmJgorICAgICAgICAgcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbl8gPT0gQVNfU01BUlRfU0VUOworfQorCitib29sIE1lc3NhZ2VEaWZmZXJlbmNlcjo6SXNUcmVhdGVkQXNTbWFydExpc3QoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSByZXR1cm4gZmFsc2U7CisgIGlmIChyZXBlYXRlZF9maWVsZF9jb21wYXJpc29uc18uZmluZChmaWVsZCkgIT0KKyAgICAgIHJlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb25zXy5lbmQoKSkgeworICAgIHJldHVybiByZXBlYXRlZF9maWVsZF9jb21wYXJpc29uc19bZmllbGRdID09IEFTX1NNQVJUX0xJU1Q7CisgIH0KKyAgcmV0dXJuIEdldE1hcEtleUNvbXBhcmF0b3IoZmllbGQpID09IG51bGxwdHIgJiYKKyAgICAgICAgIHJlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb25fID09IEFTX1NNQVJUX0xJU1Q7Cit9CisKK2Jvb2wgTWVzc2FnZURpZmZlcmVuY2VyOjpJc1RyZWF0ZWRBc1N1YnNldChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHJldHVybiBzY29wZV8gPT0gUEFSVElBTCAmJgorICAgICAgICAgKElzVHJlYXRlZEFzU2V0KGZpZWxkKSB8fCBHZXRNYXBLZXlDb21wYXJhdG9yKGZpZWxkKSAhPSBOVUxMKTsKK30KKworYm9vbCBNZXNzYWdlRGlmZmVyZW5jZXI6OklzSWdub3JlZCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgcGFyZW50X2ZpZWxkcykgeworICBpZiAoaWdub3JlZF9maWVsZHNfLmZpbmQoZmllbGQpICE9IGlnbm9yZWRfZmllbGRzXy5lbmQoKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGZvciAoSWdub3JlQ3JpdGVyaWEqIGNyaXRlcmlhIDogaWdub3JlX2NyaXRlcmlhXykgeworICAgIGlmIChjcml0ZXJpYS0+SXNJZ25vcmVkKG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGQsIHBhcmVudF9maWVsZHMpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE1lc3NhZ2VEaWZmZXJlbmNlcjo6SXNVbmtub3duRmllbGRJZ25vcmVkKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICBjb25zdCBTcGVjaWZpY0ZpZWxkJiBmaWVsZCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgcGFyZW50X2ZpZWxkcykgeworICBmb3IgKElnbm9yZUNyaXRlcmlhKiBjcml0ZXJpYSA6IGlnbm9yZV9jcml0ZXJpYV8pIHsKKyAgICBpZiAoY3JpdGVyaWEtPklzVW5rbm93bkZpZWxkSWdub3JlZChtZXNzYWdlMSwgbWVzc2FnZTIsIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9maWVsZHMpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitjb25zdCBNZXNzYWdlRGlmZmVyZW5jZXI6Ok1hcEtleUNvbXBhcmF0b3IqCitNZXNzYWdlRGlmZmVyZW5jZXIgOjpHZXRNYXBLZXlDb21wYXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgcmV0dXJuIE5VTEw7CisgIEZpZWxkS2V5Q29tcGFyYXRvck1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPQorICAgICAgbWFwX2ZpZWxkX2tleV9jb21wYXJhdG9yXy5maW5kKGZpZWxkKTsKKyAgaWYgKGl0ICE9IG1hcF9maWVsZF9rZXlfY29tcGFyYXRvcl8uZW5kKCkpIHsKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgfQorICBpZiAoZmllbGQtPmlzX21hcCgpKSB7CisgICAgLy8gZmllbGQgY2Fubm90IGFscmVhZHkgYmUgdHJlYXRlZCBhcyBsaXN0IG9yIHNldCBzaW5jZSBUcmVhdEFzTGlzdCgpIGFuZAorICAgIC8vIFRyZWF0QXNTZXQoKSBjYWxsIEdldE1hcEtleUNvbXBhcmF0b3IoKSBhbmQgZmFpbCBpZiBpdCByZXR1cm5zIG5vbi1OVUxMLgorICAgIHJldHVybiAmbWFwX2VudHJ5X2tleV9jb21wYXJhdG9yXzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworbmFtZXNwYWNlIHsKKwordHlwZWRlZiBzdGQ6OnBhaXI8aW50LCBjb25zdCBVbmtub3duRmllbGQqPiBJbmRleFVua25vd25GaWVsZFBhaXI7CisKK3N0cnVjdCBVbmtub3duRmllbGRPcmRlcmluZyB7CisgIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgSW5kZXhVbmtub3duRmllbGRQYWlyJiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4VW5rbm93bkZpZWxkUGFpciYgYikgY29uc3QgeworICAgIGlmIChhLnNlY29uZC0+bnVtYmVyKCkgPCBiLnNlY29uZC0+bnVtYmVyKCkpIHJldHVybiB0cnVlOworICAgIGlmIChhLnNlY29uZC0+bnVtYmVyKCkgPiBiLnNlY29uZC0+bnVtYmVyKCkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gYS5zZWNvbmQtPnR5cGUoKSA8IGIuc2Vjb25kLT50eXBlKCk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitib29sIE1lc3NhZ2VEaWZmZXJlbmNlcjo6VW5wYWNrQW55RmllbGQ6OlVucGFja0FueSgKKyAgICBjb25zdCBNZXNzYWdlJiBhbnksIHN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlPiogZGF0YSkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gYW55LkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB0eXBlX3VybF9maWVsZDsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZV9maWVsZDsKKyAgaWYgKCFpbnRlcm5hbDo6R2V0QW55RmllbGREZXNjcmlwdG9ycyhhbnksICZ0eXBlX3VybF9maWVsZCwgJnZhbHVlX2ZpZWxkKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV91cmwgPSByZWZsZWN0aW9uLT5HZXRTdHJpbmcoYW55LCB0eXBlX3VybF9maWVsZCk7CisgIHN0ZDo6c3RyaW5nIGZ1bGxfdHlwZV9uYW1lOworICBpZiAoIWludGVybmFsOjpQYXJzZUFueVR5cGVVcmwodHlwZV91cmwsICZmdWxsX3R5cGVfbmFtZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjID0KKyAgICAgIGFueS5HZXREZXNjcmlwdG9yKCktPmZpbGUoKS0+cG9vbCgpLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCisgICAgICAgICAgZnVsbF90eXBlX25hbWUpOworICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgR09PR0xFX0xPRyhJTkZPKSA8PCAiUHJvdG8gdHlwZSAnIiA8PCBmdWxsX3R5cGVfbmFtZSA8PCAiJyBub3QgZm91bmQiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChkeW5hbWljX21lc3NhZ2VfZmFjdG9yeV8gPT0gTlVMTCkgeworICAgIGR5bmFtaWNfbWVzc2FnZV9mYWN0b3J5Xy5yZXNldChuZXcgRHluYW1pY01lc3NhZ2VGYWN0b3J5KCkpOworICB9CisgIGRhdGEtPnJlc2V0KGR5bmFtaWNfbWVzc2FnZV9mYWN0b3J5Xy0+R2V0UHJvdG90eXBlKGRlc2MpLT5OZXcoKSk7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRfdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRTdHJpbmcoYW55LCB2YWx1ZV9maWVsZCk7CisgIGlmICghKCpkYXRhKS0+UGFyc2VQYXJ0aWFsRnJvbVN0cmluZyhzZXJpYWxpemVkX3ZhbHVlKSkgeworICAgIEdPT0dMRV9ETE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHBhcnNlIHZhbHVlIGZvciAiIDw8IGZ1bGxfdHlwZV9uYW1lOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNZXNzYWdlRGlmZmVyZW5jZXI6OkNvbXBhcmVVbmtub3duRmllbGRzKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRfc2V0MSwKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRfc2V0MiwKKyAgICBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiogcGFyZW50X2ZpZWxkKSB7CisgIC8vIElnbm9yZSB1bmtub3duIGZpZWxkcyBpbiBFUVVJVkFMRU5UIG1vZGUuCisgIGlmIChtZXNzYWdlX2ZpZWxkX2NvbXBhcmlzb25fID09IEVRVUlWQUxFTlQpIHJldHVybiB0cnVlOworCisgIGlmICh1bmtub3duX2ZpZWxkX3NldDEuZW1wdHkoKSAmJiB1bmtub3duX2ZpZWxkX3NldDIuZW1wdHkoKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBpc19kaWZmZXJlbnQgPSBmYWxzZTsKKworICAvLyBXZSBmaXJzdCBzb3J0IHRoZSB1bmtub3duIGZpZWxkcyBieSBmaWVsZCBudW1iZXIgYW5kIHR5cGUgKGluIG90aGVyIHdvcmRzLAorICAvLyBpbiB0YWcgb3JkZXIpLCBtYWtpbmcgc3VyZSB0byBwcmVzZXJ2ZSBvcmRlcmluZyBvZiB2YWx1ZXMgd2l0aCB0aGUgc2FtZQorICAvLyB0YWcuICBUaGlzIGFsbG93cyB1cyB0byByZXBvcnQgb25seSBtZWFuaW5nZnVsIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlCisgIC8vIHR3byBzZXRzIC0tIHRoYXQgaXMsIGRpZmZlcmluZyB2YWx1ZXMgZm9yIHRoZSBzYW1lIHRhZy4gIFdlIHVzZQorICAvLyBJbmRleFVua25vd25GaWVsZFBhaXJzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGZpZWxkJ3Mgb3JpZ2luYWwgaW5kZXggZm9yCisgIC8vIHJlcG9ydGluZyBwdXJwb3Nlcy4KKyAgc3RkOjp2ZWN0b3I8SW5kZXhVbmtub3duRmllbGRQYWlyPiBmaWVsZHMxOyAgLy8gdW5rbm93bl9maWVsZF9zZXQxLCBzb3J0ZWQKKyAgc3RkOjp2ZWN0b3I8SW5kZXhVbmtub3duRmllbGRQYWlyPiBmaWVsZHMyOyAgLy8gdW5rbm93bl9maWVsZF9zZXQyLCBzb3J0ZWQKKyAgZmllbGRzMS5yZXNlcnZlKHVua25vd25fZmllbGRfc2V0MS5maWVsZF9jb3VudCgpKTsKKyAgZmllbGRzMi5yZXNlcnZlKHVua25vd25fZmllbGRfc2V0Mi5maWVsZF9jb3VudCgpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRfc2V0MS5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZHMxLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihpLCAmdW5rbm93bl9maWVsZF9zZXQxLmZpZWxkKGkpKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkX3NldDIuZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRzMi5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoaSwgJnVua25vd25fZmllbGRfc2V0Mi5maWVsZChpKSkpOworICB9CisKKyAgVW5rbm93bkZpZWxkT3JkZXJpbmcgaXNfYmVmb3JlOworICBzdGQ6OnN0YWJsZV9zb3J0KGZpZWxkczEuYmVnaW4oKSwgZmllbGRzMS5lbmQoKSwgaXNfYmVmb3JlKTsKKyAgc3RkOjpzdGFibGVfc29ydChmaWVsZHMyLmJlZ2luKCksIGZpZWxkczIuZW5kKCksIGlzX2JlZm9yZSk7CisKKyAgLy8gSW4gb3JkZXIgdG8gZmlsbCBpbiBTcGVjaWZpY0ZpZWxkOjppbmRleCwgd2UgaGF2ZSB0byBrZWVwIHRyYWNrIG9mIGhvdworICAvLyBtYW55IHZhbHVlcyB3ZSd2ZSBzZWVuIHdpdGggdGhlIHNhbWUgZmllbGQgbnVtYmVyIGFuZCB0eXBlLgorICAvLyBjdXJyZW50X3JlcGVhdGVkIHBvaW50cyBhdCB0aGUgZmlyc3QgZmllbGQgaW4gdGhpcyByYW5nZSwgYW5kCisgIC8vIGN1cnJlbnRfcmVwZWF0ZWRfc3RhcnR7MSwyfSBhcmUgdGhlIGluZGV4ZXMgb2YgdGhlIGZpcnN0IGZpZWxkIGluIHRoZQorICAvLyByYW5nZSB3aXRoaW4gZmllbGRzMSBhbmQgZmllbGRzMi4KKyAgY29uc3QgVW5rbm93bkZpZWxkKiBjdXJyZW50X3JlcGVhdGVkID0gTlVMTDsKKyAgaW50IGN1cnJlbnRfcmVwZWF0ZWRfc3RhcnQxID0gMDsKKyAgaW50IGN1cnJlbnRfcmVwZWF0ZWRfc3RhcnQyID0gMDsKKworICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHR3byBzb3J0ZWQgbGlzdHMsIHdlIGNhbiBkZXRlY3QgZmllbGRzIHdoaWNoIGFwcGVhciBvbmx5CisgIC8vIGluIG9uZSBsaXN0IG9yIHRoZSBvdGhlciBieSB0cmF2ZXJzaW5nIHRoZW0gc2ltdWx0YW5lb3VzbHkuCisgIHNpemVfdCBpbmRleDEgPSAwOworICBzaXplX3QgaW5kZXgyID0gMDsKKyAgd2hpbGUgKGluZGV4MSA8IGZpZWxkczEuc2l6ZSgpIHx8IGluZGV4MiA8IGZpZWxkczIuc2l6ZSgpKSB7CisgICAgZW51bSB7CisgICAgICBBRERJVElPTiwKKyAgICAgIERFTEVUSU9OLAorICAgICAgTU9ESUZJQ0FUSU9OLAorICAgICAgQ09NUEFSRV9HUk9VUFMsCisgICAgICBOT19DSEFOR0UKKyAgICB9IGNoYW5nZV90eXBlOworCisgICAgLy8gZm9jdXNfZmllbGQgaXMgdGhlIGZpZWxkIHdlJ3JlIGN1cnJlbnRseSByZXBvcnRpbmcgb24uICAoSW4gdGhlIGNhc2UKKyAgICAvLyBvZiBhIG1vZGlmaWNhdGlvbiwgaXQncyB0aGUgZmllbGQgb24gdGhlIGxlZnQgc2lkZS4pCisgICAgY29uc3QgVW5rbm93bkZpZWxkKiBmb2N1c19maWVsZDsKKyAgICBib29sIG1hdGNoID0gZmFsc2U7CisKKyAgICBpZiAoaW5kZXgyID09IGZpZWxkczIuc2l6ZSgpIHx8CisgICAgICAgIChpbmRleDEgPCBmaWVsZHMxLnNpemUoKSAmJgorICAgICAgICAgaXNfYmVmb3JlKGZpZWxkczFbaW5kZXgxXSwgZmllbGRzMltpbmRleDJdKSkpIHsKKyAgICAgIC8vIGZpZWxkczFbaW5kZXgxXSBpcyBub3QgcHJlc2VudCBpbiBmaWVsZHMyLgorICAgICAgY2hhbmdlX3R5cGUgPSBERUxFVElPTjsKKyAgICAgIGZvY3VzX2ZpZWxkID0gZmllbGRzMVtpbmRleDFdLnNlY29uZDsKKyAgICB9IGVsc2UgaWYgKGluZGV4MSA9PSBmaWVsZHMxLnNpemUoKSB8fAorICAgICAgICAgICAgICAgaXNfYmVmb3JlKGZpZWxkczJbaW5kZXgyXSwgZmllbGRzMVtpbmRleDFdKSkgeworICAgICAgLy8gZmllbGRzMltpbmRleDJdIGlzIG5vdCBwcmVzZW50IGluIGZpZWxkczEuCisgICAgICBpZiAoc2NvcGVfID09IFBBUlRJQUwpIHsKKyAgICAgICAgLy8gSWdub3JlLgorICAgICAgICArK2luZGV4MjsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjaGFuZ2VfdHlwZSA9IEFERElUSU9OOworICAgICAgZm9jdXNfZmllbGQgPSBmaWVsZHMyW2luZGV4Ml0uc2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAvLyBGaWVsZCB0eXBlIGFuZCBudW1iZXIgYXJlIHRoZSBzYW1lLiAgU2VlIGlmIHRoZSB2YWx1ZXMgZGlmZmVyLgorICAgICAgY2hhbmdlX3R5cGUgPSBNT0RJRklDQVRJT047CisgICAgICBmb2N1c19maWVsZCA9IGZpZWxkczFbaW5kZXgxXS5zZWNvbmQ7CisKKyAgICAgIHN3aXRjaCAoZm9jdXNfZmllbGQtPnR5cGUoKSkgeworICAgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQ6CisgICAgICAgICAgbWF0Y2ggPSBmaWVsZHMxW2luZGV4MV0uc2Vjb25kLT52YXJpbnQoKSA9PQorICAgICAgICAgICAgICAgICAgZmllbGRzMltpbmRleDJdLnNlY29uZC0+dmFyaW50KCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVEMzI6CisgICAgICAgICAgbWF0Y2ggPSBmaWVsZHMxW2luZGV4MV0uc2Vjb25kLT5maXhlZDMyKCkgPT0KKyAgICAgICAgICAgICAgICAgIGZpZWxkczJbaW5kZXgyXS5zZWNvbmQtPmZpeGVkMzIoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQ2NDoKKyAgICAgICAgICBtYXRjaCA9IGZpZWxkczFbaW5kZXgxXS5zZWNvbmQtPmZpeGVkNjQoKSA9PQorICAgICAgICAgICAgICAgICAgZmllbGRzMltpbmRleDJdLnNlY29uZC0+Zml4ZWQ2NCgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOgorICAgICAgICAgIG1hdGNoID0gZmllbGRzMVtpbmRleDFdLnNlY29uZC0+bGVuZ3RoX2RlbGltaXRlZCgpID09CisgICAgICAgICAgICAgICAgICBmaWVsZHMyW2luZGV4Ml0uc2Vjb25kLT5sZW5ndGhfZGVsaW1pdGVkKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOgorICAgICAgICAgIC8vIFdlIG11c3QgZGVhbCB3aXRoIHRoaXMgbGF0ZXIsIGFmdGVyIGJ1aWxkaW5nIHRoZSBTcGVjaWZpY0ZpZWxkLgorICAgICAgICAgIGNoYW5nZV90eXBlID0gQ09NUEFSRV9HUk9VUFM7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAobWF0Y2ggJiYgY2hhbmdlX3R5cGUgIT0gQ09NUEFSRV9HUk9VUFMpIHsKKyAgICAgICAgY2hhbmdlX3R5cGUgPSBOT19DSEFOR0U7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGN1cnJlbnRfcmVwZWF0ZWQgPT0gTlVMTCB8fAorICAgICAgICBmb2N1c19maWVsZC0+bnVtYmVyKCkgIT0gY3VycmVudF9yZXBlYXRlZC0+bnVtYmVyKCkgfHwKKyAgICAgICAgZm9jdXNfZmllbGQtPnR5cGUoKSAhPSBjdXJyZW50X3JlcGVhdGVkLT50eXBlKCkpIHsKKyAgICAgIC8vIFdlJ3ZlIHN0YXJ0ZWQgYSBuZXcgcmVwZWF0ZWQgZmllbGQuCisgICAgICBjdXJyZW50X3JlcGVhdGVkID0gZm9jdXNfZmllbGQ7CisgICAgICBjdXJyZW50X3JlcGVhdGVkX3N0YXJ0MSA9IGluZGV4MTsKKyAgICAgIGN1cnJlbnRfcmVwZWF0ZWRfc3RhcnQyID0gaW5kZXgyOworICAgIH0KKworICAgIGlmIChjaGFuZ2VfdHlwZSA9PSBOT19DSEFOR0UgJiYgcmVwb3J0ZXJfID09IE5VTEwpIHsKKyAgICAgIC8vIEZpZWxkcyB3ZXJlIGFscmVhZHkgY29tcGFyZWQgYW5kIG1hdGNoZWQgYW5kIHdlIGhhdmUgbm8gcmVwb3J0ZXIuCisgICAgICArK2luZGV4MTsKKyAgICAgICsraW5kZXgyOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gQnVpbGQgdGhlIFNwZWNpZmljRmllbGQuICBUaGlzIGlzIHNsaWdodGx5IGNvbXBsaWNhdGVkLgorICAgIFNwZWNpZmljRmllbGQgc3BlY2lmaWNfZmllbGQ7CisgICAgc3BlY2lmaWNfZmllbGQudW5rbm93bl9maWVsZF9udW1iZXIgPSBmb2N1c19maWVsZC0+bnVtYmVyKCk7CisgICAgc3BlY2lmaWNfZmllbGQudW5rbm93bl9maWVsZF90eXBlID0gZm9jdXNfZmllbGQtPnR5cGUoKTsKKworICAgIHNwZWNpZmljX2ZpZWxkLnVua25vd25fZmllbGRfc2V0MSA9ICZ1bmtub3duX2ZpZWxkX3NldDE7CisgICAgc3BlY2lmaWNfZmllbGQudW5rbm93bl9maWVsZF9zZXQyID0gJnVua25vd25fZmllbGRfc2V0MjsKKworICAgIGlmIChjaGFuZ2VfdHlwZSAhPSBBRERJVElPTikgeworICAgICAgc3BlY2lmaWNfZmllbGQudW5rbm93bl9maWVsZF9pbmRleDEgPSBmaWVsZHMxW2luZGV4MV0uZmlyc3Q7CisgICAgfQorICAgIGlmIChjaGFuZ2VfdHlwZSAhPSBERUxFVElPTikgeworICAgICAgc3BlY2lmaWNfZmllbGQudW5rbm93bl9maWVsZF9pbmRleDIgPSBmaWVsZHMyW2luZGV4Ml0uZmlyc3Q7CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBmaWVsZCBpbmRleC4KKyAgICBpZiAoY2hhbmdlX3R5cGUgPT0gQURESVRJT04pIHsKKyAgICAgIHNwZWNpZmljX2ZpZWxkLmluZGV4ID0gaW5kZXgyIC0gY3VycmVudF9yZXBlYXRlZF9zdGFydDI7CisgICAgICBzcGVjaWZpY19maWVsZC5uZXdfaW5kZXggPSBpbmRleDIgLSBjdXJyZW50X3JlcGVhdGVkX3N0YXJ0MjsKKyAgICB9IGVsc2UgeworICAgICAgc3BlY2lmaWNfZmllbGQuaW5kZXggPSBpbmRleDEgLSBjdXJyZW50X3JlcGVhdGVkX3N0YXJ0MTsKKyAgICAgIHNwZWNpZmljX2ZpZWxkLm5ld19pbmRleCA9IGluZGV4MiAtIGN1cnJlbnRfcmVwZWF0ZWRfc3RhcnQyOworICAgIH0KKworICAgIGlmIChJc1Vua25vd25GaWVsZElnbm9yZWQobWVzc2FnZTEsIG1lc3NhZ2UyLCBzcGVjaWZpY19maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXJlbnRfZmllbGQpKSB7CisgICAgICBpZiAocmVwb3J0X2lnbm9yZXNfICYmIHJlcG9ydGVyXyAhPSBOVUxMKSB7CisgICAgICAgIHBhcmVudF9maWVsZC0+cHVzaF9iYWNrKHNwZWNpZmljX2ZpZWxkKTsKKyAgICAgICAgcmVwb3J0ZXJfLT5SZXBvcnRVbmtub3duRmllbGRJZ25vcmVkKG1lc3NhZ2UxLCBtZXNzYWdlMiwgKnBhcmVudF9maWVsZCk7CisgICAgICAgIHBhcmVudF9maWVsZC0+cG9wX2JhY2soKTsKKyAgICAgIH0KKyAgICAgIGlmIChjaGFuZ2VfdHlwZSAhPSBBRERJVElPTikgKytpbmRleDE7CisgICAgICBpZiAoY2hhbmdlX3R5cGUgIT0gREVMRVRJT04pICsraW5kZXgyOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKGNoYW5nZV90eXBlID09IEFERElUSU9OIHx8IGNoYW5nZV90eXBlID09IERFTEVUSU9OIHx8CisgICAgICAgIGNoYW5nZV90eXBlID09IE1PRElGSUNBVElPTikgeworICAgICAgaWYgKHJlcG9ydGVyXyA9PSBOVUxMKSB7CisgICAgICAgIC8vIFdlIGZvdW5kIGEgZGlmZmVyZW5jZSBhbmQgd2UgaGF2ZSBubyByZXBvcnRlci4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaXNfZGlmZmVyZW50ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwYXJlbnRfZmllbGQtPnB1c2hfYmFjayhzcGVjaWZpY19maWVsZCk7CisKKyAgICBzd2l0Y2ggKGNoYW5nZV90eXBlKSB7CisgICAgICBjYXNlIEFERElUSU9OOgorICAgICAgICByZXBvcnRlcl8tPlJlcG9ydEFkZGVkKG1lc3NhZ2UxLCBtZXNzYWdlMiwgKnBhcmVudF9maWVsZCk7CisgICAgICAgICsraW5kZXgyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgREVMRVRJT046CisgICAgICAgIHJlcG9ydGVyXy0+UmVwb3J0RGVsZXRlZChtZXNzYWdlMSwgbWVzc2FnZTIsICpwYXJlbnRfZmllbGQpOworICAgICAgICArK2luZGV4MTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1PRElGSUNBVElPTjoKKyAgICAgICAgcmVwb3J0ZXJfLT5SZXBvcnRNb2RpZmllZChtZXNzYWdlMSwgbWVzc2FnZTIsICpwYXJlbnRfZmllbGQpOworICAgICAgICArK2luZGV4MTsKKyAgICAgICAgKytpbmRleDI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDT01QQVJFX0dST1VQUzoKKyAgICAgICAgaWYgKCFDb21wYXJlVW5rbm93bkZpZWxkcygKKyAgICAgICAgICAgICAgICBtZXNzYWdlMSwgbWVzc2FnZTIsIGZpZWxkczFbaW5kZXgxXS5zZWNvbmQtPmdyb3VwKCksCisgICAgICAgICAgICAgICAgZmllbGRzMltpbmRleDJdLnNlY29uZC0+Z3JvdXAoKSwgcGFyZW50X2ZpZWxkKSkgeworICAgICAgICAgIGlmIChyZXBvcnRlcl8gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGlzX2RpZmZlcmVudCA9IHRydWU7CisgICAgICAgICAgcmVwb3J0ZXJfLT5SZXBvcnRNb2RpZmllZChtZXNzYWdlMSwgbWVzc2FnZTIsICpwYXJlbnRfZmllbGQpOworICAgICAgICB9CisgICAgICAgICsraW5kZXgxOworICAgICAgICArK2luZGV4MjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE5PX0NIQU5HRToKKyAgICAgICAgKytpbmRleDE7CisgICAgICAgICsraW5kZXgyOworICAgICAgICBpZiAocmVwb3J0X21hdGNoZXNfKSB7CisgICAgICAgICAgcmVwb3J0ZXJfLT5SZXBvcnRNYXRjaGVkKG1lc3NhZ2UxLCBtZXNzYWdlMiwgKnBhcmVudF9maWVsZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwYXJlbnRfZmllbGQtPnBvcF9iYWNrKCk7CisgIH0KKworICByZXR1cm4gIWlzX2RpZmZlcmVudDsKK30KKworbmFtZXNwYWNlIHsKKworLy8gRmluZCBtYXhpbXVtIGJpcGFydGl0ZSBtYXRjaGluZyB1c2luZyB0aGUgYXJndW1lbnRpbmcgcGF0aCBhbGdvcml0aG0uCitjbGFzcyBNYXhpbXVtTWF0Y2hlciB7CisgcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248Ym9vbChpbnQsIGludCk+IE5vZGVNYXRjaENhbGxiYWNrOworICAvLyBNYXhpbXVtTWF0Y2hlciB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHBhc3NlZCBpbiBjYWxsYmFjayBhbmQgdXNlcyBpdCB0bworICAvLyBkZXRlcm1pbmUgd2hldGhlciBhIG5vZGUgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgYmlwYXJ0aWFsIGdyYXBoIG1hdGNoZXMKKyAgLy8gYSBub2RlIG9uIHRoZSByaWdodCBzaWRlLiBjb3VudDEgaXMgdGhlIG51bWJlciBvZiBub2RlcyBvbiB0aGUgbGVmdCBzaWRlCisgIC8vIG9mIHRoZSBncmFwaCBhbmQgY291bnQyIHRvIGlzIHRoZSBudW1iZXIgb2Ygbm9kZXMgb24gdGhlIHJpZ2h0IHNpZGUuCisgIC8vIEV2ZXJ5IG5vZGUgaXMgcmVmZXJyZWQgdG8gdXNpbmcgMC1iYXNlZCBpbmRpY2VzLgorICAvLyBJZiBhIG1heGltdW0gbWF0Y2ggaXMgZm91bmQsIHRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQgaW4gbWF0Y2hfbGlzdDEgYW5kCisgIC8vIG1hdGNoX2xpc3QyLiBtYXRjaF9saXN0MVtpXSA9PSBqIG1lYW5zIHRoZSBpLXRoIG5vZGUgb24gdGhlIGxlZnQgc2lkZSBpcworICAvLyBtYXRjaGVkIHRvIHRoZSBqLXRoIG5vZGUgb24gdGhlIHJpZ2h0IHNpZGUgYW5kIG1hdGNoX2xpc3QyW3hdID09IHkgbWVhbnMKKyAgLy8gdGhlIHgtdGggbm9kZSBvbiB0aGUgcmlnaHQgc2lkZSBpcyBtYXRjaGVkIHRvIHktdGggbm9kZSBvbiB0aGUgbGVmdCBzaWRlLgorICAvLyBtYXRjaF9saXN0MVtpXSA9PSAtMSBtZWFucyB0aGUgbm9kZSBpcyBub3QgbWF0Y2hlZC4gU2FtZSB3aXRoIG1hdGNoX2xpc3QyLgorICBNYXhpbXVtTWF0Y2hlcihpbnQgY291bnQxLCBpbnQgY291bnQyLCBOb2RlTWF0Y2hDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiogbWF0Y2hfbGlzdDEsIHN0ZDo6dmVjdG9yPGludD4qIG1hdGNoX2xpc3QyKTsKKyAgLy8gRmluZCBhIG1heGltdW0gbWF0Y2ggYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIG1hdGNoZWQgbm9kZSBwYWlycy4KKyAgLy8gSWYgZWFybHlfcmV0dXJuIGlzIHRydWUsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDAgaW1tZWRpYXRlbHkgd2hlbiBpdAorICAvLyBmaW5kcyB0aGF0IG5vdCBhbGwgbm9kZXMgb24gdGhlIGxlZnQgc2lkZSBjYW4gYmUgbWF0Y2hlZC4KKyAgaW50IEZpbmRNYXhpbXVtTWF0Y2goYm9vbCBlYXJseV9yZXR1cm4pOworCisgcHJpdmF0ZToKKyAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGJpcGFydGlhbCBncmFwaAorICAvLyBtYXRjaGVzIHRoZSBvbmUgb24gdGhlIHJpZ2h0IHNpZGUuCisgIGJvb2wgTWF0Y2goaW50IGxlZnQsIGludCByaWdodCk7CisgIC8vIEZpbmQgYW4gYXJndW1lbnRpbmcgcGF0aCBzdGFydGluZyBmcm9tIHRoZSBub2RlIHYgb24gdGhlIGxlZnQgc2lkZS4gSWYgYQorICAvLyBwYXRoIGNhbiBiZSBmb3VuZCwgdXBkYXRlIG1hdGNoX2xpc3QyXyB0byByZWZsZWN0IHRoZSBwYXRoIGFuZCByZXR1cm4KKyAgLy8gdHJ1ZS4KKyAgYm9vbCBGaW5kQXJndW1lbnRQYXRoREZTKGludCB2LCBzdGQ6OnZlY3Rvcjxib29sPiogdmlzaXRlZCk7CisKKyAgaW50IGNvdW50MV87CisgIGludCBjb3VudDJfOworICBOb2RlTWF0Y2hDYWxsYmFjayBtYXRjaF9jYWxsYmFja187CisgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxpbnQsIGludD4sIGJvb2w+IGNhY2hlZF9tYXRjaF9yZXN1bHRzXzsKKyAgc3RkOjp2ZWN0b3I8aW50PiogbWF0Y2hfbGlzdDFfOworICBzdGQ6OnZlY3RvcjxpbnQ+KiBtYXRjaF9saXN0Ml87CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNYXhpbXVtTWF0Y2hlcik7Cit9OworCitNYXhpbXVtTWF0Y2hlcjo6TWF4aW11bU1hdGNoZXIoaW50IGNvdW50MSwgaW50IGNvdW50MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlTWF0Y2hDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+KiBtYXRjaF9saXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+KiBtYXRjaF9saXN0MikKKyAgICA6IGNvdW50MV8oY291bnQxKSwKKyAgICAgIGNvdW50Ml8oY291bnQyKSwKKyAgICAgIG1hdGNoX2NhbGxiYWNrXyhzdGQ6Om1vdmUoY2FsbGJhY2spKSwKKyAgICAgIG1hdGNoX2xpc3QxXyhtYXRjaF9saXN0MSksCisgICAgICBtYXRjaF9saXN0Ml8obWF0Y2hfbGlzdDIpIHsKKyAgbWF0Y2hfbGlzdDFfLT5hc3NpZ24oY291bnQxLCAtMSk7CisgIG1hdGNoX2xpc3QyXy0+YXNzaWduKGNvdW50MiwgLTEpOworfQorCitpbnQgTWF4aW11bU1hdGNoZXI6OkZpbmRNYXhpbXVtTWF0Y2goYm9vbCBlYXJseV9yZXR1cm4pIHsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQxXzsgKytpKSB7CisgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gdmlzaXRlZChjb3VudDFfKTsKKyAgICBpZiAoRmluZEFyZ3VtZW50UGF0aERGUyhpLCAmdmlzaXRlZCkpIHsKKyAgICAgICsrcmVzdWx0OworICAgIH0gZWxzZSBpZiAoZWFybHlfcmV0dXJuKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgLy8gQmFja2ZpbGwgbWF0Y2hfbGlzdDFfIGFzIHdlIG9ubHkgZmlsbGVkIG1hdGNoX2xpc3QyXyB3aGVuIGZpbmRpbmcKKyAgLy8gYXJndW1lbnRpbmcgcGF0aHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQyXzsgKytpKSB7CisgICAgaWYgKCgqbWF0Y2hfbGlzdDJfKVtpXSAhPSAtMSkgeworICAgICAgKCptYXRjaF9saXN0MV8pWygqbWF0Y2hfbGlzdDJfKVtpXV0gPSBpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitib29sIE1heGltdW1NYXRjaGVyOjpNYXRjaChpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CisgIHN0ZDo6cGFpcjxpbnQsIGludD4gcChsZWZ0LCByaWdodCk7CisgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxpbnQsIGludD4sIGJvb2w+OjppdGVyYXRvciBpdCA9CisgICAgICBjYWNoZWRfbWF0Y2hfcmVzdWx0c18uZmluZChwKTsKKyAgaWYgKGl0ICE9IGNhY2hlZF9tYXRjaF9yZXN1bHRzXy5lbmQoKSkgeworICAgIHJldHVybiBpdC0+c2Vjb25kOworICB9CisgIGNhY2hlZF9tYXRjaF9yZXN1bHRzX1twXSA9IG1hdGNoX2NhbGxiYWNrXyhsZWZ0LCByaWdodCk7CisgIHJldHVybiBjYWNoZWRfbWF0Y2hfcmVzdWx0c19bcF07Cit9CisKK2Jvb2wgTWF4aW11bU1hdGNoZXI6OkZpbmRBcmd1bWVudFBhdGhERlMoaW50IHYsIHN0ZDo6dmVjdG9yPGJvb2w+KiB2aXNpdGVkKSB7CisgICgqdmlzaXRlZClbdl0gPSB0cnVlOworICAvLyBXZSB0cnkgdG8gbWF0Y2ggdGhvc2UgdW4tbWF0Y2hlZCBub2RlcyBvbiB0aGUgcmlnaHQgc2lkZSBmaXJzdC4gVGhpcyBpcworICAvLyB0aGUgc3RlcCB0aGF0IHRoZSBuYWl2ZSBncmVlZHkgbWF0Y2hpbmcgYWxnb3JpdGhtIHVzZXMuIEluIHRoZSBiZXN0IGNhc2VzCisgIC8vIHdoZXJlIHRoZSBncmVlZHkgYWxnb3JpdGhtIGNhbiBmaW5kIGEgbWF4aW11bSBtYXRjaGluZywgd2Ugd2lsbCBhbHdheXMKKyAgLy8gZmluZCBhIG1hdGNoIGluIHRoaXMgc3RlcCBhbmQgdGhlIHBlcmZvcm1hbmNlIHdpbGwgYmUgaWRlbnRpY2FsIHRvIHRoZQorICAvLyBncmVlZHkgYWxnb3JpdGhtLgorICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50Ml87ICsraSkgeworICAgIGludCBtYXRjaGVkID0gKCptYXRjaF9saXN0Ml8pW2ldOworICAgIGlmIChtYXRjaGVkID09IC0xICYmIE1hdGNoKHYsIGkpKSB7CisgICAgICAoKm1hdGNoX2xpc3QyXylbaV0gPSB2OworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIC8vIFRoZW4gd2UgdHJ5IHRob3NlIGFscmVhZHkgbWF0Y2hlZCBub2RlcyBhbmQgc2VlIGlmIHdlIGNhbiBmaW5kIGFuCisgIC8vIGFsdGVybmF0aXZlIG1hdGNoIGZvciB0aGUgbm9kZSBtYXRjaGVkIHRvIHRoZW0uCisgIC8vIFRoZSBncmVlZHkgYWxnb3JpdGhtIHdpbGwgc3RvcCBiZWZvcmUgdGhpcyBhbmQgZmFpbCB0byBwcm9kdWNlIHRoZQorICAvLyBjb3JyZWN0IHJlc3VsdC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDJfOyArK2kpIHsKKyAgICBpbnQgbWF0Y2hlZCA9ICgqbWF0Y2hfbGlzdDJfKVtpXTsKKyAgICBpZiAobWF0Y2hlZCAhPSAtMSAmJiBNYXRjaCh2LCBpKSkgeworICAgICAgaWYgKCEoKnZpc2l0ZWQpW21hdGNoZWRdICYmIEZpbmRBcmd1bWVudFBhdGhERlMobWF0Y2hlZCwgdmlzaXRlZCkpIHsKKyAgICAgICAgKCptYXRjaF9saXN0Ml8pW2ldID0gdjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgTWVzc2FnZURpZmZlcmVuY2VyOjpNYXRjaFJlcGVhdGVkRmllbGRJbmRpY2VzKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlcGVhdGVkX2ZpZWxkLAorICAgIGNvbnN0IE1hcEtleUNvbXBhcmF0b3IqIGtleV9jb21wYXJhdG9yLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiBwYXJlbnRfZmllbGRzLAorICAgIHN0ZDo6dmVjdG9yPGludD4qIG1hdGNoX2xpc3QxLCBzdGQ6OnZlY3RvcjxpbnQ+KiBtYXRjaF9saXN0MikgeworICBjb25zdCBpbnQgY291bnQxID0KKyAgICAgIG1lc3NhZ2UxLkdldFJlZmxlY3Rpb24oKS0+RmllbGRTaXplKG1lc3NhZ2UxLCByZXBlYXRlZF9maWVsZCk7CisgIGNvbnN0IGludCBjb3VudDIgPQorICAgICAgbWVzc2FnZTIuR2V0UmVmbGVjdGlvbigpLT5GaWVsZFNpemUobWVzc2FnZTIsIHJlcGVhdGVkX2ZpZWxkKTsKKyAgY29uc3QgYm9vbCBpc190cmVhdGVkX2FzX3NtYXJ0X3NldCA9IElzVHJlYXRlZEFzU21hcnRTZXQocmVwZWF0ZWRfZmllbGQpOworCisgIG1hdGNoX2xpc3QxLT5hc3NpZ24oY291bnQxLCAtMSk7CisgIG1hdGNoX2xpc3QyLT5hc3NpZ24oY291bnQyLCAtMSk7CisgIC8vIEVuc3VyZSB0aGF0IHdlIGRvbid0IHJlcG9ydCBkaWZmZXJlbmNlcyBkdXJpbmcgdGhlIG1hdGNoaW5nIHByb2Nlc3MuIFNpbmNlCisgIC8vIGZpZWxkIGNvbXBhcmF0b3JzIGNvdWxkIHBvdGVudGlhbGx5IHVzZSB0aGlzIG1lc3NhZ2UgZGlmZmVyZW5jZXIgb2JqZWN0IHRvCisgIC8vIHBlcmZvcm0gZnVydGhlciBjb21wYXJpc29ucywgdHVybiBvZmYgcmVwb3J0aW5nIGhlcmUgYW5kIHJlLWVuYWJsZSBpdAorICAvLyBiZWZvcmUgcmV0dXJuaW5nLgorICBSZXBvcnRlciogcmVwb3J0ZXIgPSByZXBvcnRlcl87CisgIHJlcG9ydGVyXyA9IE5VTEw7CisgIE51bURpZmZzUmVwb3J0ZXIgbnVtX2RpZmZzX3JlcG9ydGVyOworICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBudW1fZGlmZnNfbGlzdDE7CisgIGlmIChpc190cmVhdGVkX2FzX3NtYXJ0X3NldCkgeworICAgIG51bV9kaWZmc19saXN0MS5hc3NpZ24oY291bnQxLCBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKSk7CisgIH0KKworICBib29sIHN1Y2Nlc3MgPSB0cnVlOworICAvLyBGaW5kIHBvdGVudGlhbCBtYXRjaCBpZiB0aGlzIGlzIGEgc3BlY2lhbCByZXBlYXRlZCBmaWVsZC4KKyAgaWYgKHNjb3BlXyA9PSBQQVJUSUFMKSB7CisgICAgLy8gV2hlbiBwYXJ0aWFsIG1hdGNoaW5nIGlzIGVuYWJsZWQsIENvbXBhcmUoYSwgYikgJiYgQ29tcGFyZShhLCBjKQorICAgIC8vIGRvZXNuJ3QgbmVjZXNzYXJpbHkgaW1wbHkgQ29tcGFyZShiLCBjKS4gVGhlcmVmb3JlIGEgbmFpdmUgZ3JlZWR5CisgICAgLy8gYWxnb3JpdGhtIHdpbGwgZmFpbCB0byBmaW5kIGEgbWF4aW11bSBtYXRjaGluZy4KKyAgICAvLyBIZXJlIHdlIHVzZSB0aGUgYXVnbWVudGluZyBwYXRoIGFsZ29yaXRobS4KKyAgICBhdXRvIGNhbGxiYWNrID0gWyZdKGludCBpMSwgaW50IGkyKSB7CisgICAgICByZXR1cm4gSXNNYXRjaChyZXBlYXRlZF9maWVsZCwga2V5X2NvbXBhcmF0b3IsICZtZXNzYWdlMSwgJm1lc3NhZ2UyLAorICAgICAgICAgICAgICAgICAgICAgcGFyZW50X2ZpZWxkcywgbnVsbHB0ciwgaTEsIGkyKTsKKyAgICB9OworICAgIE1heGltdW1NYXRjaGVyIG1hdGNoZXIoY291bnQxLCBjb3VudDIsIHN0ZDo6bW92ZShjYWxsYmFjayksIG1hdGNoX2xpc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfbGlzdDIpOworICAgIC8vIElmIGRpZmYgaW5mbyBpcyBub3QgbmVlZGVkLCB3ZSBzaG91bGQgZW5kIHRoZSBtYXRjaGluZyBwcm9jZXNzIGFzCisgICAgLy8gc29vbiBhcyBwb3NzaWJsZSBpZiBub3QgYWxsIGl0ZW1zIGNhbiBiZSBtYXRjaGVkLgorICAgIGJvb2wgZWFybHlfcmV0dXJuID0gKHJlcG9ydGVyID09IG51bGxwdHIpOworICAgIGludCBtYXRjaF9jb3VudCA9IG1hdGNoZXIuRmluZE1heGltdW1NYXRjaChlYXJseV9yZXR1cm4pOworICAgIGlmIChtYXRjaF9jb3VudCAhPSBjb3VudDEgJiYgZWFybHlfcmV0dXJuKSByZXR1cm4gZmFsc2U7CisgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgKG1hdGNoX2NvdW50ID09IGNvdW50MSk7CisgIH0gZWxzZSB7CisgICAgaW50IHN0YXJ0X29mZnNldCA9IDA7CisgICAgLy8gSWYgdGhlIHR3byByZXBlYXRlZCBmaWVsZHMgYXJlIHRyZWF0ZWQgYXMgc2V0cywgb3B0aW1pemUgZm9yIHRoZSBjYXNlCisgICAgLy8gd2hlcmUgYm90aCBzdGFydCB3aXRoIHNhbWUgaXRlbXMgc3RvcmVkIGluIHRoZSBzYW1lIG9yZGVyLgorICAgIGlmIChJc1RyZWF0ZWRBc1NldChyZXBlYXRlZF9maWVsZCkgfHwgaXNfdHJlYXRlZF9hc19zbWFydF9zZXQgfHwKKyAgICAgICAgSXNUcmVhdGVkQXNTbWFydExpc3QocmVwZWF0ZWRfZmllbGQpKSB7CisgICAgICBzdGFydF9vZmZzZXQgPSBzdGQ6Om1pbihjb3VudDEsIGNvdW50Mik7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50MSAmJiBpIDwgY291bnQyOyBpKyspIHsKKyAgICAgICAgaWYgKElzTWF0Y2gocmVwZWF0ZWRfZmllbGQsIGtleV9jb21wYXJhdG9yLCAmbWVzc2FnZTEsICZtZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50X2ZpZWxkcywgbnVsbHB0ciwgaSwgaSkpIHsKKyAgICAgICAgICBtYXRjaF9saXN0MS0+YXQoaSkgPSBpOworICAgICAgICAgIG1hdGNoX2xpc3QyLT5hdChpKSA9IGk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RhcnRfb2Zmc2V0ID0gaTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmb3IgKGludCBpID0gc3RhcnRfb2Zmc2V0OyBpIDwgY291bnQxOyArK2kpIHsKKyAgICAgIC8vIEluZGljYXRlcyBhbnkgbWF0Y2hlZCBlbGVtZW50cyBmb3IgdGhpcyByZXBlYXRlZCBmaWVsZC4KKyAgICAgIGJvb2wgbWF0Y2ggPSBmYWxzZTsKKyAgICAgIGludCBtYXRjaGVkX2ogPSAtMTsKKworICAgICAgZm9yIChpbnQgaiA9IHN0YXJ0X29mZnNldDsgaiA8IGNvdW50MjsgaisrKSB7CisgICAgICAgIGlmIChtYXRjaF9saXN0Mi0+YXQoaikgIT0gLTEpIHsKKyAgICAgICAgICBpZiAoIWlzX3RyZWF0ZWRfYXNfc21hcnRfc2V0IHx8IG51bV9kaWZmc19saXN0MVtpXSA9PSAwIHx8CisgICAgICAgICAgICAgIG51bV9kaWZmc19saXN0MVttYXRjaF9saXN0Mi0+YXQoaildID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc190cmVhdGVkX2FzX3NtYXJ0X3NldCkgeworICAgICAgICAgIG51bV9kaWZmc19yZXBvcnRlci5SZXNldCgpOworICAgICAgICAgIG1hdGNoID0gSXNNYXRjaChyZXBlYXRlZF9maWVsZCwga2V5X2NvbXBhcmF0b3IsICZtZXNzYWdlMSwgJm1lc3NhZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfZmllbGRzLCAmbnVtX2RpZmZzX3JlcG9ydGVyLCBpLCBqKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtYXRjaCA9IElzTWF0Y2gocmVwZWF0ZWRfZmllbGQsIGtleV9jb21wYXJhdG9yLCAmbWVzc2FnZTEsICZtZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X2ZpZWxkcywgbnVsbHB0ciwgaSwgaik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNfdHJlYXRlZF9hc19zbWFydF9zZXQpIHsKKyAgICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICAgIG51bV9kaWZmc19saXN0MVtpXSA9IDA7CisgICAgICAgICAgfSBlbHNlIGlmIChyZXBlYXRlZF9maWVsZC0+Y3BwX3R5cGUoKSA9PQorICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgICAgICAgIC8vIFJlcGxhY2Ugd2l0aCB0aGUgb25lIHdpdGggZmV3ZXIgZGlmZnMuCisgICAgICAgICAgICBjb25zdCBpbnQzMl90IG51bV9kaWZmcyA9IG51bV9kaWZmc19yZXBvcnRlci5HZXROdW1EaWZmcygpOworICAgICAgICAgICAgaWYgKG51bV9kaWZmcyA8IG51bV9kaWZmc19saXN0MVtpXSkgeworICAgICAgICAgICAgICAvLyBJZiBqIGhhcyBiZWVuIGFscmVhZHkgbWF0Y2hlZCB0byBzb21lIGVsZW1lbnQsIGVuc3VyZSB0aGUKKyAgICAgICAgICAgICAgLy8gY3VycmVudCBudW1fZGlmZnMgaXMgc21hbGxlci4KKyAgICAgICAgICAgICAgaWYgKG1hdGNoX2xpc3QyLT5hdChqKSA9PSAtMSB8fAorICAgICAgICAgICAgICAgICAgbnVtX2RpZmZzIDwgbnVtX2RpZmZzX2xpc3QxW21hdGNoX2xpc3QyLT5hdChqKV0pIHsKKyAgICAgICAgICAgICAgICBudW1fZGlmZnNfbGlzdDFbaV0gPSBudW1fZGlmZnM7CisgICAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hdGNoKSB7CisgICAgICAgICAgbWF0Y2hlZF9qID0gajsKKyAgICAgICAgICBpZiAoIWlzX3RyZWF0ZWRfYXNfc21hcnRfc2V0IHx8IG51bV9kaWZmc19saXN0MVtpXSA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbWF0Y2ggPSAobWF0Y2hlZF9qICE9IC0xKTsKKyAgICAgIGlmIChtYXRjaCkgeworICAgICAgICBpZiAoaXNfdHJlYXRlZF9hc19zbWFydF9zZXQgJiYgbWF0Y2hfbGlzdDItPmF0KG1hdGNoZWRfaikgIT0gLTEpIHsKKyAgICAgICAgICAvLyBUaGlzIGlzIHRvIHJldmVydCB0aGUgcHJldmlvdXNseSBtYXRjaGVkIGluZGV4IGluIGxpc3QyLgorICAgICAgICAgIG1hdGNoX2xpc3QxLT5hdChtYXRjaF9saXN0Mi0+YXQobWF0Y2hlZF9qKSkgPSAtMTsKKyAgICAgICAgICBtYXRjaCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIG1hdGNoX2xpc3QxLT5hdChpKSA9IG1hdGNoZWRfajsKKyAgICAgICAgbWF0Y2hfbGlzdDItPmF0KG1hdGNoZWRfaikgPSBpOworICAgICAgfQorICAgICAgaWYgKCFtYXRjaCAmJiByZXBvcnRlciA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CisgICAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiBtYXRjaDsKKyAgICB9CisgIH0KKworICBpZiAoSXNUcmVhdGVkQXNTbWFydExpc3QocmVwZWF0ZWRfZmllbGQpKSB7CisgICAgbWF0Y2hfaW5kaWNlc19mb3Jfc21hcnRfbGlzdF9jYWxsYmFja18obWF0Y2hfbGlzdDEsIG1hdGNoX2xpc3QyKTsKKyAgfQorCisgIHJlcG9ydGVyXyA9IHJlcG9ydGVyOworCisgIHJldHVybiBzdWNjZXNzOworfQorCitGaWVsZENvbXBhcmF0b3I6OkNvbXBhcmlzb25SZXN1bHQgTWVzc2FnZURpZmZlcmVuY2VyOjpHZXRGaWVsZENvbXBhcmlzb25SZXN1bHQoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleDEsIGludCBpbmRleDIsCisgICAgY29uc3QgRmllbGRDb250ZXh0KiBmaWVsZF9jb250ZXh0KSB7CisgIEZpZWxkQ29tcGFyYXRvciogY29tcGFyYXRvciA9IGZpZWxkX2NvbXBhcmF0b3Jfa2luZF8gPT0ga0ZDQmFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmaWVsZF9jb21wYXJhdG9yXy5iYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZpZWxkX2NvbXBhcmF0b3JfLmRlZmF1bHRfaW1wbDsKKyAgcmV0dXJuIGNvbXBhcmF0b3ItPkNvbXBhcmUobWVzc2FnZTEsIG1lc3NhZ2UyLCBmaWVsZCwgaW5kZXgxLCBpbmRleDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2NvbnRleHQpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTWVzc2FnZURpZmZlcmVuY2VyOjpSZXBvcnRlcjo6UmVwb3J0ZXIoKSB7fQorTWVzc2FnZURpZmZlcmVuY2VyOjpSZXBvcnRlcjo6flJlcG9ydGVyKCkge30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK01lc3NhZ2VEaWZmZXJlbmNlcjo6TWFwS2V5Q29tcGFyYXRvcjo6TWFwS2V5Q29tcGFyYXRvcigpIHt9CitNZXNzYWdlRGlmZmVyZW5jZXI6Ok1hcEtleUNvbXBhcmF0b3I6On5NYXBLZXlDb21wYXJhdG9yKCkge30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK01lc3NhZ2VEaWZmZXJlbmNlcjo6SWdub3JlQ3JpdGVyaWE6Oklnbm9yZUNyaXRlcmlhKCkge30KK01lc3NhZ2VEaWZmZXJlbmNlcjo6SWdub3JlQ3JpdGVyaWE6On5JZ25vcmVDcml0ZXJpYSgpIHt9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBOb3RlIHRoYXQgdGhlIHByaW50ZXIncyBkZWxpbWl0ZXIgaXMgbm90IHVzZWQsIGJlY2F1c2UgaWYgd2UgYXJlIGdpdmVuIGEKKy8vIHByaW50ZXIsIHdlIGRvbid0IGtub3cgaXRzIGRlbGltaXRlci4KK01lc3NhZ2VEaWZmZXJlbmNlcjo6U3RyZWFtUmVwb3J0ZXI6OlN0cmVhbVJlcG9ydGVyKAorICAgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KQorICAgIDogcHJpbnRlcl8obmV3IGlvOjpQcmludGVyKG91dHB1dCwgJyQnKSksCisgICAgICBkZWxldGVfcHJpbnRlcl8odHJ1ZSksCisgICAgICByZXBvcnRfbW9kaWZpZWRfYWdncmVnYXRlc18oZmFsc2UpLAorICAgICAgbWVzc2FnZTFfKG51bGxwdHIpLAorICAgICAgbWVzc2FnZTJfKG51bGxwdHIpIHt9CisKK01lc3NhZ2VEaWZmZXJlbmNlcjo6U3RyZWFtUmVwb3J0ZXI6OlN0cmVhbVJlcG9ydGVyKGlvOjpQcmludGVyKiBwcmludGVyKQorICAgIDogcHJpbnRlcl8ocHJpbnRlciksCisgICAgICBkZWxldGVfcHJpbnRlcl8oZmFsc2UpLAorICAgICAgcmVwb3J0X21vZGlmaWVkX2FnZ3JlZ2F0ZXNfKGZhbHNlKSwKKyAgICAgIG1lc3NhZ2UxXyhudWxscHRyKSwKKyAgICAgIG1lc3NhZ2UyXyhudWxscHRyKSB7fQorCitNZXNzYWdlRGlmZmVyZW5jZXI6OlN0cmVhbVJlcG9ydGVyOjp+U3RyZWFtUmVwb3J0ZXIoKSB7CisgIGlmIChkZWxldGVfcHJpbnRlcl8pIGRlbGV0ZSBwcmludGVyXzsKK30KKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6OlN0cmVhbVJlcG9ydGVyOjpQcmludFBhdGgoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4mIGZpZWxkX3BhdGgsIGJvb2wgbGVmdF9zaWRlKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmllbGRfcGF0aC5zaXplKCk7ICsraSkgeworICAgIFNwZWNpZmljRmllbGQgc3BlY2lmaWNfZmllbGQgPSBmaWVsZF9wYXRoW2ldOworCisgICAgaWYgKHNwZWNpZmljX2ZpZWxkLmZpZWxkICE9IG51bGxwdHIgJiYKKyAgICAgICAgc3BlY2lmaWNfZmllbGQuZmllbGQtPm5hbWUoKSA9PSAidmFsdWUiKSB7CisgICAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhpcyB0aGUgdmFsdWUgbGFiZWwgb2YgYSBtYXAgdmFsdWUuICBJZiBzbywgc2tpcCBpdAorICAgICAgLy8gYmVjYXVzZSBpdCBpc24ndCBtZWFuaW5nZnVsCisgICAgICBpZiAoaSA+IDAgJiYgZmllbGRfcGF0aFtpIC0gMV0uZmllbGQtPmlzX21hcCgpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA+IDApIHsKKyAgICAgIHByaW50ZXJfLT5QcmludCgiLiIpOworICAgIH0KKyAgICBpZiAoc3BlY2lmaWNfZmllbGQuZmllbGQgIT0gTlVMTCkgeworICAgICAgaWYgKHNwZWNpZmljX2ZpZWxkLmZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgICAgICBwcmludGVyXy0+UHJpbnQoIigkbmFtZSQpIiwgIm5hbWUiLCBzcGVjaWZpY19maWVsZC5maWVsZC0+ZnVsbF9uYW1lKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRlcl8tPlByaW50UmF3KHNwZWNpZmljX2ZpZWxkLmZpZWxkLT5uYW1lKCkpOworICAgICAgfQorCisgICAgICBpZiAoc3BlY2lmaWNfZmllbGQuZmllbGQtPmlzX21hcCgpKSB7CisgICAgICAgIFByaW50TWFwS2V5KGxlZnRfc2lkZSwgc3BlY2lmaWNfZmllbGQpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlcl8tPlByaW50UmF3KFN0ckNhdChzcGVjaWZpY19maWVsZC51bmtub3duX2ZpZWxkX251bWJlcikpOworICAgIH0KKyAgICBpZiAobGVmdF9zaWRlICYmIHNwZWNpZmljX2ZpZWxkLmluZGV4ID49IDApIHsKKyAgICAgIHByaW50ZXJfLT5QcmludCgiWyRuYW1lJF0iLCAibmFtZSIsIFN0ckNhdChzcGVjaWZpY19maWVsZC5pbmRleCkpOworICAgIH0KKyAgICBpZiAoIWxlZnRfc2lkZSAmJiBzcGVjaWZpY19maWVsZC5uZXdfaW5kZXggPj0gMCkgeworICAgICAgcHJpbnRlcl8tPlByaW50KCJbJG5hbWUkXSIsICJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJDYXQoc3BlY2lmaWNfZmllbGQubmV3X2luZGV4KSk7CisgICAgfQorICB9Cit9CisKKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6OlN0cmVhbVJlcG9ydGVyOjpQcmludFZhbHVlKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiBmaWVsZF9wYXRoLAorICAgIGJvb2wgbGVmdF9zaWRlKSB7CisgIGNvbnN0IFNwZWNpZmljRmllbGQmIHNwZWNpZmljX2ZpZWxkID0gZmllbGRfcGF0aC5iYWNrKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBzcGVjaWZpY19maWVsZC5maWVsZDsKKyAgaWYgKGZpZWxkICE9IE5VTEwpIHsKKyAgICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisgICAgaW50IGluZGV4ID0gbGVmdF9zaWRlID8gc3BlY2lmaWNfZmllbGQuaW5kZXggOiBzcGVjaWZpY19maWVsZC5uZXdfaW5kZXg7CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgICAgICBjb25zdCBNZXNzYWdlJiBmaWVsZF9tZXNzYWdlID0KKyAgICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgICAgICA/IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBmaWVsZCwgaW5kZXgpCisgICAgICAgICAgICAgIDogcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBmaWVsZCk7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkID0gbnVsbHB0cjsKKworICAgICAgaWYgKGZpZWxkLT5pc19tYXAoKSAmJiBtZXNzYWdlMV8gIT0gbnVsbHB0ciAmJiBtZXNzYWdlMl8gIT0gbnVsbHB0cikgeworICAgICAgICBmZCA9IGZpZWxkX21lc3NhZ2UuR2V0RGVzY3JpcHRvcigpLT5maWVsZCgxKTsKKyAgICAgICAgaWYgKGZkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICAgICAgb3V0cHV0ID0gUHJpbnRTaG9ydFRleHRGb3JtYXQoCisgICAgICAgICAgICAgIGZpZWxkX21lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5HZXRNZXNzYWdlKGZpZWxkX21lc3NhZ2UsIGZkKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgVGV4dEZvcm1hdDo6UHJpbnRGaWVsZFZhbHVlVG9TdHJpbmcoZmllbGRfbWVzc2FnZSwgZmQsIC0xLCAmb3V0cHV0KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0cHV0ID0gUHJpbnRTaG9ydFRleHRGb3JtYXQoZmllbGRfbWVzc2FnZSk7CisgICAgICB9CisgICAgICBpZiAob3V0cHV0LmVtcHR5KCkpIHsKKyAgICAgICAgcHJpbnRlcl8tPlByaW50KCJ7IH0iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoZmQgIT0gbnVsbHB0cikgJiYKKyAgICAgICAgICAgIChmZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkpIHsKKyAgICAgICAgICBwcmludGVyXy0+UHJpbnRSYXcob3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmludGVyXy0+UHJpbnQoInsgJG5hbWUkIH0iLCAibmFtZSIsIG91dHB1dCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgVGV4dEZvcm1hdDo6UHJpbnRGaWVsZFZhbHVlVG9TdHJpbmcobWVzc2FnZSwgZmllbGQsIGluZGV4LCAmb3V0cHV0KTsKKyAgICAgIHByaW50ZXJfLT5QcmludFJhdyhvdXRwdXQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzID0KKyAgICAgICAgKGxlZnRfc2lkZSA/IHNwZWNpZmljX2ZpZWxkLnVua25vd25fZmllbGRfc2V0MQorICAgICAgICAgICAgICAgICAgIDogc3BlY2lmaWNfZmllbGQudW5rbm93bl9maWVsZF9zZXQyKTsKKyAgICBjb25zdCBVbmtub3duRmllbGQqIHVua25vd25fZmllbGQgPQorICAgICAgICAmdW5rbm93bl9maWVsZHMtPmZpZWxkKGxlZnRfc2lkZSA/IHNwZWNpZmljX2ZpZWxkLnVua25vd25fZmllbGRfaW5kZXgxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3BlY2lmaWNfZmllbGQudW5rbm93bl9maWVsZF9pbmRleDIpOworICAgIFByaW50VW5rbm93bkZpZWxkVmFsdWUodW5rbm93bl9maWVsZCk7CisgIH0KK30KKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6OlN0cmVhbVJlcG9ydGVyOjpQcmludFVua25vd25GaWVsZFZhbHVlKAorICAgIGNvbnN0IFVua25vd25GaWVsZCogdW5rbm93bl9maWVsZCkgeworICBHT09HTEVfQ0hFQ0sodW5rbm93bl9maWVsZCAhPSBOVUxMKSA8PCAiIENhbm5vdCBwcmludCBOVUxMIHVua25vd25fZmllbGQuIjsKKworICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisgIHN3aXRjaCAodW5rbm93bl9maWVsZC0+dHlwZSgpKSB7CisgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5UOgorICAgICAgb3V0cHV0ID0gU3RyQ2F0KHVua25vd25fZmllbGQtPnZhcmludCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVEMzI6CisgICAgICBvdXRwdXQgPSBTdHJDYXQoCisgICAgICAgICAgIjB4Iiwgc3RyaW5nczo6SGV4KHVua25vd25fZmllbGQtPmZpeGVkMzIoKSwgc3RyaW5nczo6WkVST19QQURfOCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQ2NDoKKyAgICAgIG91dHB1dCA9IFN0ckNhdCgKKyAgICAgICAgICAiMHgiLCBzdHJpbmdzOjpIZXgodW5rbm93bl9maWVsZC0+Zml4ZWQ2NCgpLCBzdHJpbmdzOjpaRVJPX1BBRF8xNikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgIG91dHB1dCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAiXCIlc1wiIiwgQ0VzY2FwZSh1bmtub3duX2ZpZWxkLT5sZW5ndGhfZGVsaW1pdGVkKCkpLmNfc3RyKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6CisgICAgICAvLyBUT0RPKGtlbnRvbik6ICBQcmludCB0aGUgY29udGVudHMgb2YgdGhlIGdyb3VwIGxpa2Ugd2UgZG8gZm9yCisgICAgICAvLyAgIG1lc3NhZ2VzLiAgUmVxdWlyZXMgYW4gZXF1aXZhbGVudCBvZiBTaG9ydERlYnVnU3RyaW5nKCkgZm9yCisgICAgICAvLyAgIFVua25vd25GaWVsZFNldC4KKyAgICAgIG91dHB1dCA9ICJ7IC4uLiB9IjsKKyAgICAgIGJyZWFrOworICB9CisgIHByaW50ZXJfLT5QcmludFJhdyhvdXRwdXQpOworfQorCit2b2lkIE1lc3NhZ2VEaWZmZXJlbmNlcjo6U3RyZWFtUmVwb3J0ZXI6OlByaW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcHJpbnRlcl8tPlByaW50KHN0ci5jX3N0cigpKTsKK30KKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6OlN0cmVhbVJlcG9ydGVyOjpQcmludE1hcEtleSgKKyAgICBib29sIGxlZnRfc2lkZSwgY29uc3QgU3BlY2lmaWNGaWVsZCYgc3BlY2lmaWNfZmllbGQpIHsKKyAgaWYgKG1lc3NhZ2UxXyA9PSBudWxscHRyIHx8IG1lc3NhZ2UyXyA9PSBudWxscHRyKSB7CisgICAgR09PR0xFX0xPRyhJTkZPKSA8PCAiUHJpbnRQYXRoIGNhbm5vdCBsb2cgbWFwIGtleXM7ICIKKyAgICAgICAgICAgICAgICAgInVzZSBTZXRNZXNzYWdlcyB0byBwcm92aWRlIHRoZSBtZXNzYWdlcyAiCisgICAgICAgICAgICAgICAgICJiZWluZyBjb21wYXJlZCBwcmlvciB0byBhbnkgcHJvY2Vzc2luZy4iOworICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IE1lc3NhZ2UqIGZvdW5kX21lc3NhZ2UgPQorICAgICAgbGVmdF9zaWRlID8gc3BlY2lmaWNfZmllbGQubWFwX2VudHJ5MSA6IHNwZWNpZmljX2ZpZWxkLm1hcF9lbnRyeTI7CisgIHN0ZDo6c3RyaW5nIGtleV9zdHJpbmcgPSAiIjsKKyAgaWYgKGZvdW5kX21lc3NhZ2UgIT0gbnVsbHB0cikgeworICAgIC8vIE5COiB0aGUgbWFwIGtleSBpcyBhbHdheXMgdGhlIGZpcnN0IGZpZWxkCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZCA9IGZvdW5kX21lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZmllbGQoMCk7CisgICAgaWYgKGZkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcpIHsKKyAgICAgIC8vIE5vdCB1c2luZyBQcmludEZpZWxkVmFsdWVUb1N0cmluZyBmb3Igc3RyaW5ncyB0byBhdm9pZCBleHRyYQorICAgICAgLy8gY2hhcmFjdGVycworICAgICAga2V5X3N0cmluZyA9IGZvdW5kX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0U3RyaW5nKAorICAgICAgICAgICpmb3VuZF9tZXNzYWdlLCBmb3VuZF9tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZpZWxkKDApKTsKKyAgICB9IGVsc2UgeworICAgICAgVGV4dEZvcm1hdDo6UHJpbnRGaWVsZFZhbHVlVG9TdHJpbmcoKmZvdW5kX21lc3NhZ2UsIGZkLCAtMSwgJmtleV9zdHJpbmcpOworICAgIH0KKyAgICBpZiAoa2V5X3N0cmluZy5lbXB0eSgpKSB7CisgICAgICBrZXlfc3RyaW5nID0gIicnIjsKKyAgICB9CisgICAgcHJpbnRlcl8tPlByaW50UmF3KFN0ckNhdCgiWyIsIGtleV9zdHJpbmcsICJdIikpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZURpZmZlcmVuY2VyOjpTdHJlYW1SZXBvcnRlcjo6UmVwb3J0QWRkZWQoCisgICAgY29uc3QgTWVzc2FnZSYgLyptZXNzYWdlMSovLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgZmllbGRfcGF0aCkgeworICBwcmludGVyXy0+UHJpbnQoImFkZGVkOiAiKTsKKyAgUHJpbnRQYXRoKGZpZWxkX3BhdGgsIGZhbHNlKTsKKyAgcHJpbnRlcl8tPlByaW50KCI6ICIpOworICBQcmludFZhbHVlKG1lc3NhZ2UyLCBmaWVsZF9wYXRoLCBmYWxzZSk7CisgIHByaW50ZXJfLT5QcmludCgiXG4iKTsgIC8vIFByaW50IGZvciBuZXdsaW5lcy4KK30KKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6OlN0cmVhbVJlcG9ydGVyOjpSZXBvcnREZWxldGVkKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiAvKm1lc3NhZ2UyKi8sCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4mIGZpZWxkX3BhdGgpIHsKKyAgcHJpbnRlcl8tPlByaW50KCJkZWxldGVkOiAiKTsKKyAgUHJpbnRQYXRoKGZpZWxkX3BhdGgsIHRydWUpOworICBwcmludGVyXy0+UHJpbnQoIjogIik7CisgIFByaW50VmFsdWUobWVzc2FnZTEsIGZpZWxkX3BhdGgsIHRydWUpOworICBwcmludGVyXy0+UHJpbnQoIlxuIik7ICAvLyBQcmludCBmb3IgbmV3bGluZXMKK30KKwordm9pZCBNZXNzYWdlRGlmZmVyZW5jZXI6OlN0cmVhbVJlcG9ydGVyOjpSZXBvcnRNb2RpZmllZCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4mIGZpZWxkX3BhdGgpIHsKKyAgaWYgKCFyZXBvcnRfbW9kaWZpZWRfYWdncmVnYXRlc18gJiYgZmllbGRfcGF0aC5iYWNrKCkuZmllbGQgPT0gTlVMTCkgeworICAgIGlmIChmaWVsZF9wYXRoLmJhY2soKS51bmtub3duX2ZpZWxkX3R5cGUgPT0gVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQKSB7CisgICAgICAvLyBBbnkgY2hhbmdlcyB0byB0aGUgc3ViZmllbGRzIGhhdmUgYWxyZWFkeSBiZWVuIHByaW50ZWQuCisgICAgICByZXR1cm47CisgICAgfQorICB9IGVsc2UgaWYgKCFyZXBvcnRfbW9kaWZpZWRfYWdncmVnYXRlc18pIHsKKyAgICBpZiAoZmllbGRfcGF0aC5iYWNrKCkuZmllbGQtPmNwcF90eXBlKCkgPT0KKyAgICAgICAgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIC8vIEFueSBjaGFuZ2VzIHRvIHRoZSBzdWJmaWVsZHMgaGF2ZSBhbHJlYWR5IGJlZW4gcHJpbnRlZC4KKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBwcmludGVyXy0+UHJpbnQoIm1vZGlmaWVkOiAiKTsKKyAgUHJpbnRQYXRoKGZpZWxkX3BhdGgsIHRydWUpOworICBpZiAoQ2hlY2tQYXRoQ2hhbmdlZChmaWVsZF9wYXRoKSkgeworICAgIHByaW50ZXJfLT5QcmludCgiIC0+ICIpOworICAgIFByaW50UGF0aChmaWVsZF9wYXRoLCBmYWxzZSk7CisgIH0KKyAgcHJpbnRlcl8tPlByaW50KCI6ICIpOworICBQcmludFZhbHVlKG1lc3NhZ2UxLCBmaWVsZF9wYXRoLCB0cnVlKTsKKyAgcHJpbnRlcl8tPlByaW50KCIgLT4gIik7CisgIFByaW50VmFsdWUobWVzc2FnZTIsIGZpZWxkX3BhdGgsIGZhbHNlKTsKKyAgcHJpbnRlcl8tPlByaW50KCJcbiIpOyAgLy8gUHJpbnQgZm9yIG5ld2xpbmVzLgorfQorCit2b2lkIE1lc3NhZ2VEaWZmZXJlbmNlcjo6U3RyZWFtUmVwb3J0ZXI6OlJlcG9ydE1vdmVkKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiAvKm1lc3NhZ2UyKi8sCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4mIGZpZWxkX3BhdGgpIHsKKyAgcHJpbnRlcl8tPlByaW50KCJtb3ZlZDogIik7CisgIFByaW50UGF0aChmaWVsZF9wYXRoLCB0cnVlKTsKKyAgcHJpbnRlcl8tPlByaW50KCIgLT4gIik7CisgIFByaW50UGF0aChmaWVsZF9wYXRoLCBmYWxzZSk7CisgIHByaW50ZXJfLT5QcmludCgiIDogIik7CisgIFByaW50VmFsdWUobWVzc2FnZTEsIGZpZWxkX3BhdGgsIHRydWUpOworICBwcmludGVyXy0+UHJpbnQoIlxuIik7ICAvLyBQcmludCBmb3IgbmV3bGluZXMuCit9CisKK3ZvaWQgTWVzc2FnZURpZmZlcmVuY2VyOjpTdHJlYW1SZXBvcnRlcjo6UmVwb3J0TWF0Y2hlZCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgLyptZXNzYWdlMiovLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiBmaWVsZF9wYXRoKSB7CisgIHByaW50ZXJfLT5QcmludCgibWF0Y2hlZDogIik7CisgIFByaW50UGF0aChmaWVsZF9wYXRoLCB0cnVlKTsKKyAgaWYgKENoZWNrUGF0aENoYW5nZWQoZmllbGRfcGF0aCkpIHsKKyAgICBwcmludGVyXy0+UHJpbnQoIiAtPiAiKTsKKyAgICBQcmludFBhdGgoZmllbGRfcGF0aCwgZmFsc2UpOworICB9CisgIHByaW50ZXJfLT5QcmludCgiIDogIik7CisgIFByaW50VmFsdWUobWVzc2FnZTEsIGZpZWxkX3BhdGgsIHRydWUpOworICBwcmludGVyXy0+UHJpbnQoIlxuIik7ICAvLyBQcmludCBmb3IgbmV3bGluZXMuCit9CisKK3ZvaWQgTWVzc2FnZURpZmZlcmVuY2VyOjpTdHJlYW1SZXBvcnRlcjo6UmVwb3J0SWdub3JlZCgKKyAgICBjb25zdCBNZXNzYWdlJiAvKm1lc3NhZ2UxKi8sIGNvbnN0IE1lc3NhZ2UmIC8qbWVzc2FnZTIqLywKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgZmllbGRfcGF0aCkgeworICBwcmludGVyXy0+UHJpbnQoImlnbm9yZWQ6ICIpOworICBQcmludFBhdGgoZmllbGRfcGF0aCwgdHJ1ZSk7CisgIGlmIChDaGVja1BhdGhDaGFuZ2VkKGZpZWxkX3BhdGgpKSB7CisgICAgcHJpbnRlcl8tPlByaW50KCIgLT4gIik7CisgICAgUHJpbnRQYXRoKGZpZWxkX3BhdGgsIGZhbHNlKTsKKyAgfQorICBwcmludGVyXy0+UHJpbnQoIlxuIik7ICAvLyBQcmludCBmb3IgbmV3bGluZXMuCit9CisKK3ZvaWQgTWVzc2FnZURpZmZlcmVuY2VyOjpTdHJlYW1SZXBvcnRlcjo6U2V0TWVzc2FnZXMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyKSB7CisgIG1lc3NhZ2UxXyA9ICZtZXNzYWdlMTsKKyAgbWVzc2FnZTJfID0gJm1lc3NhZ2UyOworfQorCit2b2lkIE1lc3NhZ2VEaWZmZXJlbmNlcjo6U3RyZWFtUmVwb3J0ZXI6OlJlcG9ydFVua25vd25GaWVsZElnbm9yZWQoCisgICAgY29uc3QgTWVzc2FnZSYgLyptZXNzYWdlMSovLCBjb25zdCBNZXNzYWdlJiAvKm1lc3NhZ2UyKi8sCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4mIGZpZWxkX3BhdGgpIHsKKyAgcHJpbnRlcl8tPlByaW50KCJpZ25vcmVkOiAiKTsKKyAgUHJpbnRQYXRoKGZpZWxkX3BhdGgsIHRydWUpOworICBpZiAoQ2hlY2tQYXRoQ2hhbmdlZChmaWVsZF9wYXRoKSkgeworICAgIHByaW50ZXJfLT5QcmludCgiIC0+ICIpOworICAgIFByaW50UGF0aChmaWVsZF9wYXRoLCBmYWxzZSk7CisgIH0KKyAgcHJpbnRlcl8tPlByaW50KCJcbiIpOyAgLy8gUHJpbnQgZm9yIG5ld2xpbmVzLgorfQorCitNZXNzYWdlRGlmZmVyZW5jZXI6Ok1hcEtleUNvbXBhcmF0b3IqCitNZXNzYWdlRGlmZmVyZW5jZXI6OkNyZWF0ZU11bHRpcGxlRmllbGRzTWFwS2V5Q29tcGFyYXRvcigKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiA+JiBrZXlfZmllbGRfcGF0aHMpIHsKKyAgcmV0dXJuIG5ldyBNdWx0aXBsZUZpZWxkc01hcEtleUNvbXBhcmF0b3IodGhpcywga2V5X2ZpZWxkX3BhdGhzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzY2Q1NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyLmgKQEAgLTAsMCArMSw5ODAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGpzY2hvcnJAZ29vZ2xlLmNvbSAoSm9zZXBoIFNjaG9ycikKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHN0YXRpYyBtZXRob2RzIGFuZCBjbGFzc2VzIGZvciBjb21wYXJpbmcgUHJvdG9jb2wKKy8vIE1lc3NhZ2VzLgorLy8KKy8vIEF1Zy4gMjAwODogQWRkZWQgVW5rbm93biBGaWVsZHMgQ29tcGFyaXNvbiBmb3IgbWVzc2FnZXMuCisvLyBBdWcuIDIwMDk6IEFkZGVkIGRpZmZlcmVudCBvcHRpb25zIHRvIGNvbXBhcmUgcmVwZWF0ZWQgZmllbGRzLgorLy8gQXByLiAyMDEwOiBNb3ZlZCBmaWVsZCBjb21wYXJpc29uIHRvIEZpZWxkQ29tcGFyYXRvcgorLy8gU2VwLiAyMDIwOiBBZGRlZCBvcHRpb24gdG8gb3V0cHV0IG1hcCBrZXlzIGluIHBhdGgKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVVRJTF9NRVNTQUdFX0RJRkZFUkVOQ0VSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVVRJTF9NRVNTQUdFX0RJRkZFUkVOQ0VSX0hfXworCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPiAgLy8gRmllbGREZXNjcmlwdG9yCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4gICAgIC8vIE1lc3NhZ2UKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmg+CisKKy8vIEFsd2F5cyBpbmNsdWRlIGFzIGxhc3Qgb25lLCBvdGhlcndpc2UgaXQgY2FuIGJyZWFrIGNvbXBpbGF0aW9uCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitjbGFzcyBEeW5hbWljTWVzc2FnZUZhY3Rvcnk7CitjbGFzcyBGaWVsZERlc2NyaXB0b3I7CisKK25hbWVzcGFjZSBpbyB7CitjbGFzcyBaZXJvQ29weU91dHB1dFN0cmVhbTsKK2NsYXNzIFByaW50ZXI7Cit9ICAvLyBuYW1lc3BhY2UgaW8KKworbmFtZXNwYWNlIHV0aWwgeworCitjbGFzcyBEZWZhdWx0RmllbGRDb21wYXJhdG9yOworY2xhc3MgRmllbGRDb250ZXh0OyAgLy8gZGVjbGFyZWQgYmVsb3cgTWVzc2FnZURpZmZlcmVuY2VyCisKKy8vIERlZmluZXMgYSBjb2xsZWN0aW9uIG9mIGZpZWxkIGRlc2NyaXB0b3JzLgorLy8gSW4gY2FzZSBvZiBpbnRlcm5hbCBnb29nbGUgY29kZWJhc2Ugd2UgYXJlIHVzaW5nIGFic2w6OkZpeGVkQXJyYXkgaW5zdGVhZAorLy8gb2YgdmVjdG9yLiBJdCBzaWduaWZpY2FudGx5IHNwZWVkcyB1cCBwcm90byBjb21wYXJpc29uIChieSB+MzAlKSBieQorLy8gcmVkdWNpbmcgdGhlIG51bWJlciBvZiBtYWxsb2MvZnJlZSBvcGVyYXRpb25zCit0eXBlZGVmIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IEZpZWxkRGVzY3JpcHRvckFycmF5OworCisvLyBBIGJhc2ljIGRpZmZlcmVuY2VyIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lCisvLyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gc3BlY2lmaWVkIFByb3RvY29sIE1lc3NhZ2VzLiBJZiBhbnkgZGlmZmVyZW5jZXMKKy8vIGFyZSBmb3VuZCwgdGhlIENvbXBhcmUgbWV0aG9kIHdpbGwgcmV0dXJuIGZhbHNlLCBhbmQgYW55IGRpZmZlcmVuY2VyIHJlcG9ydGVyCisvLyBzcGVjaWZpZWQgdmlhIFJlcG9ydERpZmZlcmVuY2VzVG8gd2lsbCBoYXZlIGl0cyByZXBvcnRpbmcgbWV0aG9kcyBjYWxsZWQgKHNlZQorLy8gYmVsb3cgZm9yIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXBvcnQpLiBCYXNlZCBvZmYgb2YgdGhlIG9yaWdpbmFsCisvLyBQcm90b2NvbERpZmZlcmVuY2VyIGltcGxlbWVudGF0aW9uIGluIC8vbmV0L3Byb3RvL3Byb3RvY29sLWRpZmZlcmVuY2VyLmgKKy8vIChUaGFua3MgVG9kZCEpLgorLy8KKy8vIE1lc3NhZ2VEaWZmZXJlbmNlciBSRVFVSVJFUyB0aGF0IGNvbXBhcmVkIG1lc3NhZ2VzIGJlIHRoZSBzYW1lIHR5cGUsIGRlZmluZWQKKy8vIGFzIG1lc3NhZ2VzIHRoYXQgc2hhcmUgdGhlIHNhbWUgZGVzY3JpcHRvci4gIElmIG5vdCwgdGhlIGJlaGF2aW9yIG9mIHRoaXMKKy8vIGNsYXNzIGlzIHVuZGVmaW5lZC4KKy8vCisvLyBQZW9wbGUgZGlzYWdyZWUgb24gd2hhdCBNZXNzYWdlRGlmZmVyZW5jZXIgc2hvdWxkIGRvIHdoZW4gYXNrZWQgdG8gY29tcGFyZQorLy8gbWVzc2FnZXMgd2l0aCBkaWZmZXJlbnQgZGVzY3JpcHRvcnMuICBTb21lIHBlb3BsZSB0aGluayBpdCBzaG91bGQgYWx3YXlzCisvLyByZXR1cm4gZmFsc2UuICBPdGhlcnMgZXhwZWN0IGl0IHRvIHRyeSB0byBsb29rIGZvciBzaW1pbGFyIGZpZWxkcyBhbmQKKy8vIGNvbXBhcmUgdGhlbSBhbnl3YXkgLS0gZXNwZWNpYWxseSBpZiB0aGUgZGVzY3JpcHRvcnMgaGFwcGVuIHRvIGJlIGlkZW50aWNhbC4KKy8vIElmIHdlIGNob3NlIGVpdGhlciBvZiB0aGVzZSBiZWhhdmlvcnMsIHNvbWUgc2V0IG9mIHBlb3BsZSB3b3VsZCBmaW5kIGl0CisvLyBzdXJwcmlzaW5nLCBhbmQgY291bGQgZW5kIHVwIHdyaXRpbmcgY29kZSBleHBlY3RpbmcgdGhlIG90aGVyIGJlaGF2aW9yCisvLyB3aXRob3V0IHJlYWxpemluZyB0aGVpciBlcnJvci4gIFRoZXJlZm9yZSwgd2UgZm9yYmlkIHRoYXQgdXNhZ2UuCisvLworLy8gVGhpcyBjbGFzcyBpcyBpbXBsZW1lbnRlZCBiYXNlZCBvbiB0aGUgcHJvdG8yIHJlZmxlY3Rpb24uIFRoZSBwZXJmb3JtYW5jZQorLy8gc2hvdWxkIGJlIGdvb2QgZW5vdWdoIGZvciBub3JtYWwgdXNhZ2VzLiBIb3dldmVyLCBmb3IgcGxhY2VzIHdoZXJlIHRoZQorLy8gcGVyZm9ybWFuY2UgaXMgZXh0cmVtZWx5IHNlbnNpdGl2ZSwgdGhlcmUgYXJlIHNldmVyYWwgYWx0ZXJuYXRpdmVzOgorLy8gLSBDb21wYXJpbmcgc2VyaWFsaXplZCBzdHJpbmcKKy8vIERvd25zaWRlOiBmYWxzZSBuZWdhdGl2ZXMgKHRoZXJlIGFyZSBtZXNzYWdlcyB0aGF0IGFyZSB0aGUgc2FtZSBidXQgdGhlaXIKKy8vIHNlcmlhbGl6ZWQgc3RyaW5ncyBhcmUgZGlmZmVyZW50KS4KKy8vIC0gRXF1YWxzIGNvZGUgZ2VuZXJhdG9yIGJ5IGNvbXBpbGVyIHBsdWdpbiAobmV0L3Byb3RvMi9jb250cmliL2VxdWFsc19wbHVnaW4pCisvLyBEb3duc2lkZTogbW9yZSBnZW5lcmF0ZWQgY29kZTsgbWFpbnRlbmFuY2Ugb3ZlcmhlYWQgZm9yIHRoZSBhZGRpdGlvbmFsIHJ1bGUKKy8vIChtdXN0IGJlIGluIHN5bmMgd2l0aCB0aGUgb3JpZ2luYWwgcHJvdG9fbGlicmFyeSkuCisvLworLy8gTm90ZSBvbiBoYW5kbGluZyBvZiBnb29nbGUucHJvdG9idWYuQW55OiBNZXNzYWdlRGlmZmVyZW5jZXIgYXV0b21hdGljYWxseQorLy8gdW5wYWNrcyBBbnk6OnZhbHVlIGludG8gYSBNZXNzYWdlIGFuZCBjb21wYXJlcyBpdHMgaW5kaXZpZHVhbCBmaWVsZHMuCisvLyBNZXNzYWdlcyBlbmNvZGVkIGluIGEgcmVwZWF0ZWQgQW55IGNhbm5vdCBiZSBjb21wYXJlZCB1c2luZyBUcmVhdEFzTWFwLgorLy8KKy8vIE5vdGUgb24gdGhyZWFkLXNhZmV0eTogTWVzc2FnZURpZmZlcmVuY2VyIGlzICpub3QqIHRocmVhZC1zYWZlLiBZb3UgbmVlZCB0bworLy8gZ3VhcmQgaXQgd2l0aCBhIGxvY2sgdG8gdXNlIHRoZSBzYW1lIE1lc3NhZ2VEaWZmZXJlbmNlciBpbnN0YW5jZSBmcm9tCisvLyBtdWx0aXBsZSB0aHJlYWRzLiBOb3RlIHRoYXQgaXQncyBmaW5lIHRvIGNhbGwgc3RhdGljIGNvbXBhcmlzb24gbWV0aG9kcworLy8gKGxpa2UgTWVzc2FnZURpZmZlcmVuY2VyOjpFcXVhbHMpIGNvbmN1cnJlbnRseSwgYnV0IGl0J3Mgbm90IHJlY29tbWVuZGVkIGZvcgorLy8gcGVyZm9ybWFuY2UgY3JpdGljYWwgY29kZSBhcyBpdCBsZWFkcyB0byBleHRyYSBhbGxvY2F0aW9ucy4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBNZXNzYWdlRGlmZmVyZW5jZXIgeworIHB1YmxpYzoKKyAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzdXBwbGllZCBtZXNzYWdlcyBhcmUgZXF1YWwuIEVxdWFsaXR5IGlzIGRlZmluZWQgYXMKKyAgLy8gYWxsIGZpZWxkcyB3aXRoaW4gdGhlIHR3byBtZXNzYWdlcyBiZWluZyBzZXQgdG8gdGhlIHNhbWUgdmFsdWUuIFByaW1pdGl2ZQorICAvLyBmaWVsZHMgYW5kIHN0cmluZ3MgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlIHdoaWxlIGVtYmVkZGVkIG1lc3NhZ2VzL2dyb3VwcworICAvLyBhcmUgY29tcGFyZWQgYXMgaWYgdmlhIGEgcmVjdXJzaXZlIGNhbGwuIFVzZSBDb21wYXJlKCkgd2l0aCBJZ25vcmVGaWVsZCgpCisgIC8vIGlmIHNvbWUgZmllbGRzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSBjb21wYXJpc29uLiBVc2UgQ29tcGFyZSgpIHdpdGgKKyAgLy8gVHJlYXRBc1NldCgpIGlmIHRoZXJlIGFyZSByZXBlYXRlZCBmaWVsZHMgd2hlcmUgb3JkZXJpbmcgZG9lcyBub3QgbWF0dGVyLgorICAvLworICAvLyBUaGlzIG1ldGhvZCBSRVFVSVJFUyB0aGF0IHRoZSB0d28gbWVzc2FnZXMgaGF2ZSB0aGUgc2FtZQorICAvLyBEZXNjcmlwdG9yIChtZXNzYWdlMS5HZXREZXNjcmlwdG9yKCkgPT0gbWVzc2FnZTIuR2V0RGVzY3JpcHRvcigpKS4KKyAgc3RhdGljIGJvb2wgRXF1YWxzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMik7CisKKyAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzdXBwbGllZCBtZXNzYWdlcyBhcmUgZXF1aXZhbGVudC4gRXF1aXZhbGVuY3kgaXMKKyAgLy8gZGVmaW5lZCBhcyBhbGwgZmllbGRzIHdpdGhpbiB0aGUgdHdvIG1lc3NhZ2VzIGhhdmluZyB0aGUgc2FtZSB2YWx1ZS4gVGhpcworICAvLyBkaWZmZXJzIGZyb20gdGhlIEVxdWFscyBtZXRob2QgYWJvdmUgaW4gdGhhdCBmaWVsZHMgd2l0aCBkZWZhdWx0IHZhbHVlcworICAvLyBhcmUgY29uc2lkZXJlZCBzZXQgdG8gc2FpZCB2YWx1ZSBhdXRvbWF0aWNhbGx5LiBGb3IgZGV0YWlscyBvbiBob3cgZGVmYXVsdAorICAvLyB2YWx1ZXMgYXJlIGRlZmluZWQgZm9yIGVhY2ggZmllbGQgdHlwZSwgc2VlOgorICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8/Y3N3PTEjb3B0aW9uYWwuCisgIC8vIEFsc28sIEVxdWl2YWxlbnQoKSBpZ25vcmVzIHVua25vd24gZmllbGRzLiBVc2UgSWdub3JlRmllbGQoKSBhbmQgQ29tcGFyZSgpCisgIC8vIGlmIHNvbWUgZmllbGRzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSBjb21wYXJpc29uLgorICAvLworICAvLyBUaGlzIG1ldGhvZCBSRVFVSVJFUyB0aGF0IHRoZSB0d28gbWVzc2FnZXMgaGF2ZSB0aGUgc2FtZQorICAvLyBEZXNjcmlwdG9yIChtZXNzYWdlMS5HZXREZXNjcmlwdG9yKCkgPT0gbWVzc2FnZTIuR2V0RGVzY3JpcHRvcigpKS4KKyAgc3RhdGljIGJvb2wgRXF1aXZhbGVudChjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIpOworCisgIC8vIERldGVybWluZXMgd2hldGhlciB0aGUgc3VwcGxpZWQgbWVzc2FnZXMgYXJlIGFwcHJveGltYXRlbHkgZXF1YWwuCisgIC8vIEFwcHJveGltYXRlIGVxdWFsaXR5IGlzIGRlZmluZWQgYXMgYWxsIGZpZWxkcyB3aXRoaW4gdGhlIHR3byBtZXNzYWdlcworICAvLyBiZWluZyBhcHByb3hpbWF0ZWx5IGVxdWFsLiAgUHJpbWl0aXZlIChub24tZmxvYXQpIGZpZWxkcyBhbmQgc3RyaW5ncyBhcmUKKyAgLy8gY29tcGFyZWQgYnkgdmFsdWUsIGZsb2F0cyBhcmUgY29tcGFyZWQgdXNpbmcgTWF0aFV0aWw6OkFsbW9zdEVxdWFscygpIGFuZAorICAvLyBlbWJlZGRlZCBtZXNzYWdlcy9ncm91cHMgYXJlIGNvbXBhcmVkIGFzIGlmIHZpYSBhIHJlY3Vyc2l2ZSBjYWxsLiBVc2UKKyAgLy8gSWdub3JlRmllbGQoKSBhbmQgQ29tcGFyZSgpIGlmIHNvbWUgZmllbGRzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZQorICAvLyBjb21wYXJpc29uLgorICAvLworICAvLyBUaGlzIG1ldGhvZCBSRVFVSVJFUyB0aGF0IHRoZSB0d28gbWVzc2FnZXMgaGF2ZSB0aGUgc2FtZQorICAvLyBEZXNjcmlwdG9yIChtZXNzYWdlMS5HZXREZXNjcmlwdG9yKCkgPT0gbWVzc2FnZTIuR2V0RGVzY3JpcHRvcigpKS4KKyAgc3RhdGljIGJvb2wgQXBwcm94aW1hdGVseUVxdWFscyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMik7CisKKyAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzdXBwbGllZCBtZXNzYWdlcyBhcmUgYXBwcm94aW1hdGVseSBlcXVpdmFsZW50LgorICAvLyBBcHByb3hpbWF0ZSBlcXVpdmFsZW5jeSBpcyBkZWZpbmVkIGFzIGFsbCBmaWVsZHMgd2l0aGluIHRoZSB0d28gbWVzc2FnZXMKKyAgLy8gYmVpbmcgYXBwcm94aW1hdGVseSBlcXVpdmFsZW50LiBBcyBpbgorICAvLyBNZXNzYWdlRGlmZmVyZW5jZXI6OkFwcHJveGltYXRlbHlFcXVhbHMsIHByaW1pdGl2ZSAobm9uLWZsb2F0KSBmaWVsZHMgYW5kCisgIC8vIHN0cmluZ3MgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlLCBmbG9hdHMgYXJlIGNvbXBhcmVkIHVzaW5nCisgIC8vIE1hdGhVdGlsOjpBbG1vc3RFcXVhbHMoKSBhbmQgZW1iZWRkZWQgbWVzc2FnZXMvZ3JvdXBzIGFyZSBjb21wYXJlZCBhcyBpZgorICAvLyB2aWEgYSByZWN1cnNpdmUgY2FsbC4gSG93ZXZlciwgZmllbGRzIHdpdGggZGVmYXVsdCB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQKKyAgLy8gc2V0IHRvIHNhaWQgdmFsdWUsIGFzIHBlciBNZXNzYWdlRGlmZmVuY2VyOjpFcXVpdmFsZW50LiBVc2UgSWdub3JlRmllbGQoKQorICAvLyBhbmQgQ29tcGFyZSgpIGlmIHNvbWUgZmllbGRzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSBjb21wYXJpc29uLgorICAvLworICAvLyBUaGlzIG1ldGhvZCBSRVFVSVJFUyB0aGF0IHRoZSB0d28gbWVzc2FnZXMgaGF2ZSB0aGUgc2FtZQorICAvLyBEZXNjcmlwdG9yIChtZXNzYWdlMS5HZXREZXNjcmlwdG9yKCkgPT0gbWVzc2FnZTIuR2V0RGVzY3JpcHRvcigpKS4KKyAgc3RhdGljIGJvb2wgQXBwcm94aW1hdGVseUVxdWl2YWxlbnQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyKTsKKworICAvLyBJZGVudGlmaWVzIGFuIGluZGl2aWR1YWwgZmllbGQgaW4gYSBtZXNzYWdlIGluc3RhbmNlLiAgVXNlZCBmb3IgZmllbGRfcGF0aCwKKyAgLy8gYmVsb3cuCisgIHN0cnVjdCBTcGVjaWZpY0ZpZWxkIHsKKyAgICAvLyBGb3Iga25vd24gZmllbGRzLCAiZmllbGQiIGlzIGZpbGxlZCBpbiBhbmQgInVua25vd25fZmllbGRfbnVtYmVyIiBpcyAtMS4KKyAgICAvLyBGb3IgdW5rbm93biBmaWVsZHMsICJmaWVsZCIgaXMgTlVMTCwgInVua25vd25fZmllbGRfbnVtYmVyIiBpcyB0aGUgZmllbGQKKyAgICAvLyBudW1iZXIsIGFuZCAidW5rbm93bl9maWVsZF90eXBlIiBpcyBpdHMgdHlwZS4KKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gbnVsbHB0cjsKKyAgICBpbnQgdW5rbm93bl9maWVsZF9udW1iZXIgPSAtMTsKKyAgICBVbmtub3duRmllbGQ6OlR5cGUgdW5rbm93bl9maWVsZF90eXBlID0gVW5rbm93bkZpZWxkOjpUeXBlOjpUWVBFX1ZBUklOVDsKKworICAgIC8vIElmIHRoaXMgYSByZXBlYXRlZCBmaWVsZCwgImluZGV4IiBpcyB0aGUgaW5kZXggd2l0aGluIGl0LiAgRm9yIHVua25vd24KKyAgICAvLyBmaWVsZHMsIHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBmaWVsZCBhbW9uZyBhbGwgdW5rbm93biBmaWVsZHMgb2YgdGhlCisgICAgLy8gc2FtZSBmaWVsZCBudW1iZXIgYW5kIHR5cGUuCisgICAgaW50IGluZGV4ID0gLTE7CisKKyAgICAvLyBJZiAiZmllbGQiIGlzIGEgcmVwZWF0ZWQgZmllbGQgd2hpY2ggaXMgYmVpbmcgdHJlYXRlZCBhcyBhIG1hcCBvcgorICAgIC8vIGEgc2V0IChzZWUgVHJlYXRBc01hcCgpIGFuZCBUcmVhdEFzU2V0KCksIGJlbG93KSwgbmV3X2luZGV4IGluZGljYXRlcworICAgIC8vIHRoZSBpbmRleCB0aGUgcG9zaXRpb24gdG8gd2hpY2ggdGhlIGVsZW1lbnQgaGFzIG1vdmVkLiAgSWYgdGhlIGVsZW1lbnQKKyAgICAvLyBoYXMgbm90IG1vdmVkLCAibmV3X2luZGV4IiB3aWxsIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgImluZGV4Ii4KKyAgICBpbnQgbmV3X2luZGV4ID0gLTE7CisKKyAgICAvLyBJZiAiZmllbGQiIGlzIGEgbWFwIGZpZWxkLCBwb2ludCB0byB0aGUgbWFwIGVudHJ5LgorICAgIGNvbnN0IE1lc3NhZ2UqIG1hcF9lbnRyeTEgPSBudWxscHRyOworICAgIGNvbnN0IE1lc3NhZ2UqIG1hcF9lbnRyeTIgPSBudWxscHRyOworCisgICAgLy8gRm9yIHVua25vd24gZmllbGRzLCB0aGVzZSBhcmUgdGhlIHBvaW50ZXJzIHRvIHRoZSBVbmtub3duRmllbGRTZXQKKyAgICAvLyBjb250YWluaW5nIHRoZSB1bmtub3duIGZpZWxkcy4gSW4gY2VydGFpbiBjYXNlcyAoZS5nLiBwcm90bzEncworICAgIC8vIE1lc3NhZ2VTZXQsIG9yIG5lc3RlZCBncm91cHMgb2YgdW5rbm93biBmaWVsZHMpLCB0aGVzZSBtYXkgZGlmZmVyIGZyb20KKyAgICAvLyB0aGUgbWVzc2FnZXMnIGludGVybmFsIFVua25vd25GaWVsZFNldHMuCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkX3NldDEgPSBudWxscHRyOworICAgIGNvbnN0IFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZF9zZXQyID0gbnVsbHB0cjsKKworICAgIC8vIEZvciB1bmtub3duIGZpZWxkcywgdGhlc2UgYXJlIHRoZSBpbmRleCBvZiB0aGUgZmllbGQgd2l0aGluIHRoZQorICAgIC8vIFVua25vd25GaWVsZFNldHMuIE9uZSBvciB0aGUgb3RoZXIgd2lsbCBiZSAtMSB3aGVuCisgICAgLy8gcmVwb3J0aW5nIGFuIGFkZGl0aW9uIG9yIGRlbGV0aW9uLgorICAgIGludCB1bmtub3duX2ZpZWxkX2luZGV4MSA9IC0xOworICAgIGludCB1bmtub3duX2ZpZWxkX2luZGV4MiA9IC0xOworICB9OworCisgIC8vIEFic3RyYWN0IGJhc2UgY2xhc3MgZnJvbSB3aGljaCBhbGwgTWVzc2FnZURpZmZlcmVuY2VyCisgIC8vIHJlcG9ydGVycyBkZXJpdmUuIFRoZSBmaXZlIFJlcG9ydCogbWV0aG9kcyBiZWxvdyB3aWxsIGJlIGNhbGxlZCB3aGVuCisgIC8vIGEgZmllbGQgaGFzIGJlZW4gYWRkZWQsIGRlbGV0ZWQsIG1vZGlmaWVkLCBtb3ZlZCwgb3IgbWF0Y2hlZC4gVGhlIHRoaXJkCisgIC8vIGFyZ3VtZW50IGlzIGEgdmVjdG9yIG9mIEZpZWxkRGVzY3JpcHRvciBwb2ludGVycyB3aGljaCBkZXNjcmliZXMgdGhlIGNoYWluCisgIC8vIG9mIGZpZWxkcyB0aGF0IHdhcyB0YWtlbiB0byBmaW5kIHRoZSBjdXJyZW50IGZpZWxkLiBGb3IgZXhhbXBsZSwgZm9yIGEKKyAgLy8gZmllbGQgZm91bmQgaW4gYW4gZW1iZWRkZWQgbWVzc2FnZSwgdGhlIHZlY3RvciB3aWxsIGNvbnRhaW4gdHdvCisgIC8vIEZpZWxkRGVzY3JpcHRvcnMuIFRoZSBmaXJzdCB3aWxsIGJlIHRoZSBmaWVsZCBvZiB0aGUgZW1iZWRkZWQgbWVzc2FnZQorICAvLyBpdHNlbGYgYW5kIHRoZSBzZWNvbmQgd2lsbCBiZSB0aGUgYWN0dWFsIGZpZWxkIGluIHRoZSBlbWJlZGRlZCBtZXNzYWdlCisgIC8vIHRoYXQgd2FzIGFkZGVkL2RlbGV0ZWQvbW9kaWZpZWQuCisgIC8vIEZpZWxkcyB3aWxsIGJlIHJlcG9ydGVkIGluIFBvc3RUcmF2ZXJzYWxPcmRlci4KKyAgLy8gRm9yIGV4YW1wbGUsIGdpdmVuIGZvbGxvd2luZyBwcm90bywgaWYgYm90aCBiYXogYW5kIG1vb28gYXJlIGNoYW5nZWQuCisgIC8vIGZvbyB7CisgIC8vICAgYmFyIHsKKyAgLy8gICAgIGJhejogMQorICAvLyAgICAgbW9vbzogMgorICAvLyAgIH0KKyAgLy8gfQorICAvLyBSZXBvcnRNb2RpZmllZCB3aWxsIGJlIGludm9rZWQgd2l0aCBmb2xsb3dpbmcgb3JkZXI6CisgIC8vIDEuIGZvby5iYXIuYmF6IG9yIGZvby5iYXIubW9vbworICAvLyAyLiBmb28uYmFyLm1vb28gb3IgZm9vLmJhci5iYXoKKyAgLy8gMi4gZm9vLmJhcgorICAvLyAzLiBmb28KKyAgY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFJlcG9ydGVyIHsKKyAgIHB1YmxpYzoKKyAgICBSZXBvcnRlcigpOworICAgIHZpcnR1YWwgflJlcG9ydGVyKCk7CisKKyAgICAvLyBSZXBvcnRzIHRoYXQgYSBmaWVsZCBoYXMgYmVlbiBhZGRlZCBpbnRvIE1lc3NhZ2UyLgorICAgIHZpcnR1YWwgdm9pZCBSZXBvcnRBZGRlZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiBmaWVsZF9wYXRoKSA9IDA7CisKKyAgICAvLyBSZXBvcnRzIHRoYXQgYSBmaWVsZCBoYXMgYmVlbiBkZWxldGVkIGZyb20gTWVzc2FnZTEuCisgICAgdmlydHVhbCB2b2lkIFJlcG9ydERlbGV0ZWQoCisgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4mIGZpZWxkX3BhdGgpID0gMDsKKworICAgIC8vIFJlcG9ydHMgdGhhdCB0aGUgdmFsdWUgb2YgYSBmaWVsZCBoYXMgYmVlbiBtb2RpZmllZC4KKyAgICB2aXJ0dWFsIHZvaWQgUmVwb3J0TW9kaWZpZWQoCisgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4mIGZpZWxkX3BhdGgpID0gMDsKKworICAgIC8vIFJlcG9ydHMgdGhhdCBhIHJlcGVhdGVkIGZpZWxkIGhhcyBiZWVuIG1vdmVkIHRvIGFub3RoZXIgbG9jYXRpb24uICBUaGlzCisgICAgLy8gb25seSBhcHBsaWVzIHdoZW4gdXNpbmcgVHJlYXRBc1NldCBvciBUcmVhdEFzTWFwKCkgIC0tIHNlZSBiZWxvdy4gQWxzbworICAgIC8vIG5vdGUgdGhhdCBmb3IgYW55IGdpdmVuIGZpZWxkLCBSZXBvcnRNb2RpZmllZCBhbmQgUmVwb3J0TW92ZWQgYXJlCisgICAgLy8gbXV0dWFsbHkgZXhjbHVzaXZlLiBJZiBhIGZpZWxkIGhhcyBiZWVuIGJvdGggbW92ZWQgYW5kIG1vZGlmaWVkLCB0aGVuCisgICAgLy8gb25seSBSZXBvcnRNb2RpZmllZCB3aWxsIGJlIGNhbGxlZC4KKyAgICB2aXJ0dWFsIHZvaWQgUmVwb3J0TW92ZWQoCisgICAgICAgIGNvbnN0IE1lc3NhZ2UmIC8qIG1lc3NhZ2UxICovLCBjb25zdCBNZXNzYWdlJiAvKiBtZXNzYWdlMiAqLywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4mIC8qIGZpZWxkX3BhdGggKi8pIHt9CisKKyAgICAvLyBSZXBvcnRzIHRoYXQgdHdvIGZpZWxkcyBtYXRjaC4gVXNlZnVsIGZvciBkb2luZyBzaWRlLWJ5LXNpZGUgZGlmZnMuCisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBSZXBvcnRNb2RpZmllZCBhbmQgUmVwb3J0TW92ZWQuCisgICAgLy8gTm90ZSB0aGF0IHlvdSBtdXN0IGNhbGwgc2V0X3JlcG9ydF9tYXRjaGVzKHRydWUpIGJlZm9yZSBjYWxsaW5nIENvbXBhcmUKKyAgICAvLyB0byBtYWtlIHVzZSBvZiB0aGlzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBSZXBvcnRNYXRjaGVkKAorICAgICAgICBjb25zdCBNZXNzYWdlJiAvKiBtZXNzYWdlMSAqLywgY29uc3QgTWVzc2FnZSYgLyogbWVzc2FnZTIgKi8sCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiAvKiBmaWVsZF9wYXRoICovKSB7fQorCisgICAgLy8gUmVwb3J0cyB0aGF0IHR3byBmaWVsZHMgd291bGQgaGF2ZSBiZWVuIGNvbXBhcmVkLCBidXQgdGhlCisgICAgLy8gY29tcGFyaXNvbiBoYXMgYmVlbiBza2lwcGVkIGJlY2F1c2UgdGhlIGZpZWxkIHdhcyBtYXJrZWQgYXMKKyAgICAvLyAnaWdub3JlZCcgdXNpbmcgSWdub3JlRmllbGQoKS4gIFRoaXMgZnVuY3Rpb24gaXMgbXV0dWFsbHkKKyAgICAvLyBleGNsdXNpdmUgd2l0aCBhbGwgdGhlIG90aGVyIFJlcG9ydCgpIGZ1bmN0aW9ucy4KKyAgICAvLworICAgIC8vIFRoZSBjb250cmFjdCBvZiBSZXBvcnRJZ25vcmVkIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0aGFuIHRoZQorICAgIC8vIG90aGVyIFJlcG9ydCgpIGZ1bmN0aW9ucywgaW4gdGhhdCB8ZmllbGRfcGF0aC5iYWNrKCkuaW5kZXh8IGlzCisgICAgLy8gYWx3YXlzIGVxdWFsIHRvIC0xLCBldmVuIGlmIHRoZSBsYXN0IGZpZWxkIGlzIHJlcGVhdGVkLiBUaGlzIGlzCisgICAgLy8gYmVjYXVzZSB3aGlsZSB0aGUgb3RoZXIgUmVwb3J0KCkgZnVuY3Rpb25zIGluZGljYXRlIHdoZXJlIGluIGEKKyAgICAvLyByZXBlYXRlZCBmaWVsZCB0aGUgYWN0aW9uIChBZGRpdGlvbiwgRGVsZXRpb24sIGV0Yy4uLikKKyAgICAvLyBoYXBwZW5lZCwgd2hlbiBhIHJlcGVhdGVkIGZpZWxkIGlzICdpZ25vcmVkJywgdGhlIGRpZmZlcmVuY2VyCisgICAgLy8gc2ltcGx5IGNhbGxzIFJlcG9ydElnbm9yZWQgb24gdGhlIHJlcGVhdGVkIGZpZWxkIGFzIGEgd2hvbGUgYW5kCisgICAgLy8gbW92ZXMgb24gd2l0aG91dCBsb29raW5nIGF0IGl0cyBpbmRpdmlkdWFsIGVsZW1lbnRzLgorICAgIC8vCisgICAgLy8gRnVydGhlcm1vcmUsIFJlcG9ydElnbm9yZWQoKSBkb2VzIG5vdCBpbmRpY2F0ZSB3aGV0aGVyIHRoZQorICAgIC8vIGZpZWxkcyB3ZXJlIGluIGZhY3QgZXF1YWwgb3Igbm90LCBhcyBDb21wYXJlKCkgZG9lcyBub3QgaW5zcGVjdAorICAgIC8vIHRoZXNlIGZpZWxkcyBhdCBhbGwuIEl0IGlzIHVwIHRvIHRoZSBSZXBvcnRlciB0byBkZWNpZGUgd2hldGhlcgorICAgIC8vIHRoZSBmaWVsZHMgYXJlIGVxdWFsIG9yIG5vdCAocGVyaGFwcyB3aXRoIGEgc2Vjb25kIGNhbGwgdG8KKyAgICAvLyBDb21wYXJlKCkpLCBpZiBpdCBjYXJlcy4KKyAgICB2aXJ0dWFsIHZvaWQgUmVwb3J0SWdub3JlZCgKKyAgICAgICAgY29uc3QgTWVzc2FnZSYgLyogbWVzc2FnZTEgKi8sIGNvbnN0IE1lc3NhZ2UmIC8qIG1lc3NhZ2UyICovLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgLyogZmllbGRfcGF0aCAqLykge30KKworICAgIC8vIFJlcG9ydCB0aGF0IGFuIHVua25vd24gZmllbGQgaXMgaWdub3JlZC4gKHNlZSBjb21tZW50IGFib3ZlKS4KKyAgICAvLyBOb3RlIHRoaXMgaXMgYSBkaWZmZXJlbnQgZnVuY3Rpb24gc2luY2UgdGhlIGxhc3QgU3BlY2lmaWNGaWVsZCBpbiBmaWVsZAorICAgIC8vIHBhdGggaGFzIGEgbnVsbCBmaWVsZC4gIFRoaXMgY291bGQgYnJlYWsgZXhpc3RpbmcgUmVwb3J0ZXIuCisgICAgdmlydHVhbCB2b2lkIFJlcG9ydFVua25vd25GaWVsZElnbm9yZWQoCisgICAgICAgIGNvbnN0IE1lc3NhZ2UmIC8qIG1lc3NhZ2UxICovLCBjb25zdCBNZXNzYWdlJiAvKiBtZXNzYWdlMiAqLywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4mIC8qIGZpZWxkX3BhdGggKi8pIHt9CisKKyAgIHByaXZhdGU6CisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcG9ydGVyKTsKKyAgfTsKKworICAvLyBNYXBLZXlDb21wYXJhdG9yIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHR3byBlbGVtZW50cyBoYXZlIHRoZSBzYW1lIGtleQorICAvLyB3aGVuIGNvbXBhcmluZyBlbGVtZW50cyBvZiBhIHJlcGVhdGVkIGZpZWxkIGFzIGEgbWFwLgorICBjbGFzcyBQUk9UT0JVRl9FWFBPUlQgTWFwS2V5Q29tcGFyYXRvciB7CisgICBwdWJsaWM6CisgICAgTWFwS2V5Q29tcGFyYXRvcigpOworICAgIHZpcnR1YWwgfk1hcEtleUNvbXBhcmF0b3IoKTsKKworICAgIHZpcnR1YWwgYm9vbCBJc01hdGNoKAorICAgICAgICBjb25zdCBNZXNzYWdlJiAvKiBtZXNzYWdlMSAqLywgY29uc3QgTWVzc2FnZSYgLyogbWVzc2FnZTIgKi8sCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiAvKiBwYXJlbnRfZmllbGRzICovKSBjb25zdCB7CisgICAgICBHT09HTEVfQ0hFQ0soZmFsc2UpIDw8ICJJc01hdGNoKCkgaXMgbm90IGltcGxlbWVudGVkLiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNYXBLZXlDb21wYXJhdG9yKTsKKyAgfTsKKworICAvLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZyb20gd2hpY2ggYWxsIElnbm9yZUNyaXRlcmlhIGRlcml2ZS4KKyAgLy8gQnkgYWRkaW5nIElnbm9yZUNyaXRlcmlhIG1vcmUgY29tcGxleCBpZ25vcmUgbG9naWMgY2FuIGJlIGltcGxlbWVudGVkLgorICAvLyBJZ25vcmVDcml0ZXJpYSBhcmUgcmVnaXN0ZXJlZCB3aXRoIEFkZElnbm9yZUNyaXRlcmlhLiBGb3IgZWFjaCBjb21wYXJlZAorICAvLyBmaWVsZCBJc0lnbm9yZWQgaXMgY2FsbGVkIG9uIGVhY2ggYWRkZWQgSWdub3JlQ3JpdGVyaWEgdW50aWwgb25lIHJldHVybnMKKyAgLy8gdHJ1ZSBvciBhbGwgcmV0dXJuIGZhbHNlLgorICAvLyBJc0lnbm9yZWQgaXMgY2FsbGVkIGZvciBmaWVsZHMgd2hlcmUgYXQgbGVhc3Qgb25lIHNpZGUgaGFzIGEgdmFsdWUuCisgIGNsYXNzIFBST1RPQlVGX0VYUE9SVCBJZ25vcmVDcml0ZXJpYSB7CisgICBwdWJsaWM6CisgICAgSWdub3JlQ3JpdGVyaWEoKTsKKyAgICB2aXJ0dWFsIH5JZ25vcmVDcml0ZXJpYSgpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBzaG91bGQgYmUgaWdub3JlZC4KKyAgICB2aXJ0dWFsIGJvb2wgSXNJZ25vcmVkKAorICAgICAgICBjb25zdCBNZXNzYWdlJiAvKiBtZXNzYWdlMSAqLywgY29uc3QgTWVzc2FnZSYgLyogbWVzc2FnZTIgKi8sCisgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogLyogZmllbGQgKi8sCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiAvKiBwYXJlbnRfZmllbGRzICovKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHVua25vd24gZmllbGQgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgLy8gTm90ZTogVGhpcyB3aWxsIGJlIGNhbGxlZCBmb3IgdW5rbm93biBmaWVsZHMgYXMgd2VsbCBpbiB3aGljaCBjYXNlCisgICAgLy8gICAgICAgZmllbGQuZmllbGQgd2lsbCBiZSBudWxsLgorICAgIHZpcnR1YWwgYm9vbCBJc1Vua25vd25GaWVsZElnbm9yZWQoCisgICAgICAgIGNvbnN0IE1lc3NhZ2UmIC8qIG1lc3NhZ2UxICovLCBjb25zdCBNZXNzYWdlJiAvKiBtZXNzYWdlMiAqLywKKyAgICAgICAgY29uc3QgU3BlY2lmaWNGaWVsZCYgLyogZmllbGQgKi8sCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiAvKiBwYXJlbnRfZmllbGRzICovKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9OworCisgIC8vIFRvIGFkZCBhIFJlcG9ydGVyLCBjb25zdHJ1Y3QgZGVmYXVsdCBoZXJlLCB0aGVuIHVzZSBSZXBvcnREaWZmZXJlbmNlc1RvIG9yCisgIC8vIFJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcuCisgIGV4cGxpY2l0IE1lc3NhZ2VEaWZmZXJlbmNlcigpOworCisgIH5NZXNzYWdlRGlmZmVyZW5jZXIoKTsKKworICBlbnVtIE1lc3NhZ2VGaWVsZENvbXBhcmlzb24geworICAgIEVRVUFMLCAgICAgICAvLyBGaWVsZHMgbXVzdCBiZSBwcmVzZW50IGluIGJvdGggbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBtZXNzYWdlcyB0byBiZSBjb25zaWRlcmVkIHRoZSBzYW1lLgorICAgIEVRVUlWQUxFTlQsICAvLyBGaWVsZHMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhcmUgY29uc2lkZXJlZCBzZXQKKyAgICAgICAgICAgICAgICAgLy8gZm9yIGNvbXBhcmlzb24gcHVycG9zZXMgZXZlbiBpZiBub3QgZXhwbGljaXRseQorICAgICAgICAgICAgICAgICAvLyBzZXQgaW4gdGhlIG1lc3NhZ2VzIHRoZW1zZWx2ZXMuICBVbmtub3duIGZpZWxkcworICAgICAgICAgICAgICAgICAvLyBhcmUgaWdub3JlZC4KKyAgfTsKKworICBlbnVtIFNjb3BlIHsKKyAgICBGVUxMLCAgICAvLyBBbGwgZmllbGRzIG9mIGJvdGggbWVzc2FnZXMgYXJlIGNvbnNpZGVyZWQgaW4gdGhlIGNvbXBhcmlzb24uCisgICAgUEFSVElBTCAgLy8gT25seSBmaWVsZHMgcHJlc2VudCBpbiB0aGUgZmlyc3QgbWVzc2FnZSBhcmUgY29uc2lkZXJlZDsgZmllbGRzCisgICAgICAgICAgICAgLy8gc2V0IG9ubHkgaW4gdGhlIHNlY29uZCBtZXNzYWdlIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcKKyAgICAgICAgICAgICAvLyBjb21wYXJpc29uLgorICB9OworCisgIC8vIERFUFJFQ0FURUQuIFVzZSBGaWVsZENvbXBhcmF0b3I6OkZsb2F0Q29tcGFyaXNvbiBpbnN0ZWFkLgorICBlbnVtIEZsb2F0Q29tcGFyaXNvbiB7CisgICAgRVhBQ1QsICAgICAgIC8vIEZsb2F0cyBhbmQgZG91YmxlcyBhcmUgY29tcGFyZWQgZXhhY3RseS4KKyAgICBBUFBST1hJTUFURSAgLy8gRmxvYXRzIGFuZCBkb3VibGVzIGFyZSBjb21wYXJlZCB1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAgLy8gTWF0aFV0aWw6OkFsbW9zdEVxdWFscyBtZXRob2QuCisgIH07CisKKyAgZW51bSBSZXBlYXRlZEZpZWxkQ29tcGFyaXNvbiB7CisgICAgQVNfTElTVCwgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgY29tcGFyZWQgaW4gb3JkZXIuICBEaWZmZXJpbmcgdmFsdWVzIGF0CisgICAgICAgICAgICAgIC8vIHRoZSBzYW1lIGluZGV4IGFyZSByZXBvcnRlZCB1c2luZyBSZXBvcnRNb2RpZmllZCgpLiAgSWYgdGhlCisgICAgICAgICAgICAgIC8vIHJlcGVhdGVkIGZpZWxkcyBoYXZlIGRpZmZlcmVudCBudW1iZXJzIG9mIGVsZW1lbnRzLCB0aGUKKyAgICAgICAgICAgICAgLy8gdW5wYWlyZWQgZWxlbWVudHMgYXJlIHJlcG9ydGVkIHVzaW5nIFJlcG9ydEFkZGVkKCkgb3IKKyAgICAgICAgICAgICAgLy8gUmVwb3J0RGVsZXRlZCgpLgorICAgIEFTX1NFVCwgICAvLyBUcmVhdCBhbGwgdGhlIHJlcGVhdGVkIGZpZWxkcyBhcyBzZXRzLgorICAgICAgICAgICAgICAvLyBTZWUgVHJlYXRBc1NldCgpLCBhcyBiZWxvdy4KKyAgICBBU19TTUFSVF9MSVNULCAgLy8gU2ltaWxhciB0byBBU19TRVQsIGJ1dCBwcmVzZXJ2ZSB0aGUgb3JkZXIgYW5kIGZpbmQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGxvbmdlc3QgbWF0Y2hpbmcgc2VxdWVuY2UgZnJvbSB0aGUgZmlyc3QgbWF0Y2hpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudC4gVG8gdXNlIGFuIG9wdGltYWwgc29sdXRpb24sIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gU2V0TWF0Y2hJbmRpY2VzRm9yU21hcnRMaXN0Q2FsbGJhY2soKSB0byBwYXNzIGl0IGluLgorICAgIEFTX1NNQVJUX1NFVCwgICAvLyBTaW1pbGFyIHRvIEFTX1NFVCwgYnV0IG1hdGNoIGVsZW1lbnRzIHdpdGggZmV3ZXN0IGRpZmZzLgorICB9OworCisgIC8vIFRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gcmVwZWF0ZWQgZmllbGQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2V0IGZvcgorICAvLyBkaWZmaW5nIHB1cnBvc2VzLCBzbyBkaWZmZXJlbnQgb3JkZXJpbmdzIG9mIHRoZSBzYW1lIGVsZW1lbnRzIHdpbGwgYmUKKyAgLy8gY29uc2lkZXJlZCBlcXVhbC4gIEVsZW1lbnRzIHdoaWNoIGFyZSBwcmVzZW50IG9uIGJvdGggc2lkZXMgb2YgdGhlCisgIC8vIGNvbXBhcmlzb24gYnV0IHdoaWNoIGhhdmUgY2hhbmdlZCBwb3NpdGlvbiB3aWxsIGJlIHJlcG9ydGVkIHdpdGgKKyAgLy8gUmVwb3J0TW92ZWQoKS4gIEVsZW1lbnRzIHdoaWNoIG9ubHkgZXhpc3Qgb24gb25lIHNpZGUgb3IgdGhlIG90aGVyIGFyZQorICAvLyByZXBvcnRlZCB3aXRoIFJlcG9ydEFkZGVkKCkgYW5kIFJlcG9ydERlbGV0ZWQoKSByZWdhcmRsZXNzIG9mIHRoZWlyCisgIC8vIHBvc2l0aW9ucy4gIFJlcG9ydE1vZGlmaWVkKCkgaXMgbmV2ZXIgdXNlZCBmb3IgdGhpcyByZXBlYXRlZCBmaWVsZC4gIElmCisgIC8vIHRoZSBvbmx5IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGNvbXBhcmVkIG1lc3NhZ2VzIGlzIHRoYXQgc29tZSBmaWVsZHMKKyAgLy8gaGF2ZSBiZWVuIG1vdmVkLCB0aGVuIHRoZSBjb21wYXJpc29uIHJldHVybnMgdHJ1ZS4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgdGhlIG5hbWUgb2YgdGhpcyBtZXRob2QsIHRoaXMgaXMgcmVhbGx5CisgIC8vIGNvbXBhcmlzb24gYXMgbXVsdGlzZXRzOiBpZiBvbmUgc2lkZSBvZiB0aGUgY29tcGFyaXNvbiBoYXMgYSBkdXBsaWNhdGUKKyAgLy8gaW4gdGhlIHJlcGVhdGVkIGZpZWxkIGJ1dCB0aGUgb3RoZXIgc2lkZSBkb2Vzbid0LCB0aGlzIHdpbGwgY291bnQgYXMKKyAgLy8gYSBtaXNtYXRjaC4KKyAgLy8KKyAgLy8gSWYgdGhlIHNjb3BlIG9mIGNvbXBhcmlzb24gaXMgc2V0IHRvIFBBUlRJQUwsIHRoZW4gaW4gYWRkaXRpb24gdG8gd2hhdCdzCisgIC8vIGFib3ZlLCBleHRyYSB2YWx1ZXMgYWRkZWQgdG8gcmVwZWF0ZWQgZmllbGRzIG9mIHRoZSBzZWNvbmQgbWVzc2FnZSB3aWxsCisgIC8vIG5vdCBjYXVzZSB0aGUgY29tcGFyaXNvbiB0byBmYWlsLgorICAvLworICAvLyBOb3RlIHRoYXQgc2V0IGNvbXBhcmlzb24gaXMgY3VycmVudGx5IE8oayAqIG5eMikgKHdoZXJlIG4gaXMgdGhlIHRvdGFsCisgIC8vIG51bWJlciBvZiBlbGVtZW50cywgYW5kIGsgaXMgdGhlIGF2ZXJhZ2Ugc2l6ZSBvZiBlYWNoIGVsZW1lbnQpLiBJbiB0aGVvcnkKKyAgLy8gaXQgY291bGQgYmUgbWFkZSBPKG4gKiBrKSB3aXRoIGEgbW9yZSBjb21wbGV4IGhhc2hpbmcgaW1wbGVtZW50YXRpb24uIEZlZWwKKyAgLy8gZnJlZSB0byBjb250cmlidXRlIG9uZSBpZiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyB0b28gc2xvdyBmb3IgeW91LgorICAvLyBJZiBwYXJ0aWFsIG1hdGNoaW5nIGlzIGFsc28gZW5hYmxlZCwgdGhlIHRpbWUgY29tcGxleGl0eSB3aWxsIGJlIE8oayAqIG5eMgorICAvLyArIG5eMykgaW4gd2hpY2ggbl4zIGlzIHRoZSB0aW1lIGNvbXBsZXhpdHkgb2YgdGhlIG1heGltdW0gbWF0Y2hpbmcKKyAgLy8gYWxnb3JpdGhtLgorICAvLworICAvLyBSRVFVSVJFUzogZmllbGQtPmlzX3JlcGVhdGVkKCkgYW5kIGZpZWxkIG5vdCByZWdpc3RlcmVkIHdpdGggVHJlYXRBc01hcCoKKyAgdm9pZCBUcmVhdEFzU2V0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworICB2b2lkIFRyZWF0QXNTbWFydFNldChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworICAvLyBUaGUgZWxlbWVudHMgb2YgdGhlIGdpdmVuIHJlcGVhdGVkIGZpZWxkIHdpbGwgYmUgdHJlYXRlZCBhcyBhIGxpc3QgZm9yCisgIC8vIGRpZmZpbmcgcHVycG9zZXMsIHNvIGRpZmZlcmVudCBvcmRlcmluZ3Mgb2YgdGhlIHNhbWUgZWxlbWVudHMgd2lsbCBOT1QgYmUKKyAgLy8gY29uc2lkZXJlZCBlcXVhbC4KKyAgLy8KKyAgLy8gUkVRVUlSRVM6IGZpZWxkLT5pc19yZXBlYXRlZCgpIGFuZCBmaWVsZCBub3QgcmVnaXN0ZXJlZCB3aXRoIFRyZWF0QXNNYXAqCisgIHZvaWQgVHJlYXRBc0xpc3QoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisgIC8vIE5vdGUgdGhhdCB0aGUgY29tcGxleGl0eSBpcyBzaW1pbGFyIHRvIHRyZWF0aW5nIGFzIFNFVC4KKyAgdm9pZCBUcmVhdEFzU21hcnRMaXN0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIC8vIFRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gcmVwZWF0ZWQgZmllbGQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgbWFwIGZvcgorICAvLyBkaWZmaW5nIHB1cnBvc2VzLCB3aXRoIHxrZXl8IGJlaW5nIHRoZSBtYXAga2V5LiAgVGh1cywgZWxlbWVudHMgd2l0aCB0aGUKKyAgLy8gc2FtZSBrZXkgd2lsbCBiZSBjb21wYXJlZCBldmVuIGlmIHRoZXkgZG8gbm90IGFwcGVhciBhdCB0aGUgc2FtZSBpbmRleC4KKyAgLy8gRGlmZmVyZW5jZXMgYXJlIHJlcG9ydGVkIHNpbWlsYXJseSB0byBUcmVhdEFzU2V0KCksIGV4Y2VwdCB0aGF0CisgIC8vIFJlcG9ydE1vZGlmaWVkKCkgaXMgdXNlZCB0byByZXBvcnQgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBrZXkgYnV0CisgIC8vIGRpZmZlcmVudCB2YWx1ZXMuICBOb3RlIHRoYXQgaWYgYW4gZWxlbWVudCBpcyBib3RoIG1vdmVkIGFuZCBtb2RpZmllZCwKKyAgLy8gb25seSBSZXBvcnRNb2RpZmllZCgpIHdpbGwgYmUgY2FsbGVkLiAgQXMgd2l0aCBUcmVhdEFzU2V0LCBpZiB0aGUgb25seQorICAvLyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBjb21wYXJlZCBtZXNzYWdlcyBpcyB0aGF0IHNvbWUgZmllbGRzIGhhdmUgYmVlbgorICAvLyBtb3ZlZCwgdGhlbiB0aGUgY29tcGFyaXNvbiByZXR1cm5zIHRydWUuIFNlZSBUcmVhdEFzU2V0IGZvciBub3RlcyBvbgorICAvLyBwZXJmb3JtYW5jZS4KKyAgLy8KKyAgLy8gUkVRVUlSRVM6ICBmaWVsZC0+aXNfcmVwZWF0ZWQoKQorICAvLyBSRVFVSVJFUzogIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFCisgIC8vIFJFUVVJUkVTOiAga2V5LT5jb250YWluaW5nX3R5cGUoKSA9PSBmaWVsZC0+bWVzc2FnZV90eXBlKCkKKyAgdm9pZCBUcmVhdEFzTWFwKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5KTsKKyAgLy8gU2FtZSBhcyBUcmVhdEFzTWFwIGV4Y2VwdCB0aGF0IHRoaXMgbWV0aG9kIHdpbGwgdXNlIG11bHRpcGxlIGZpZWxkcyBhcworICAvLyB0aGUga2V5IGluIGNvbXBhcmlzb24uIEFsbCBzcGVjaWZpZWQgZmllbGRzIGluICdrZXlfZmllbGRzJyBzaG91bGQgYmUKKyAgLy8gcHJlc2VudCBpbiB0aGUgY29tcGFyZWQgZWxlbWVudHMuIFR3byBlbGVtZW50cyB3aWxsIGJlIHRyZWF0ZWQgYXMgaGF2aW5nCisgIC8vIHRoZSBzYW1lIGtleSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIHZhbHVlIGZvciBldmVyeSBzcGVjaWZpZWQgZmllbGQuIFRoZXJlCisgIC8vIGFyZSB0d28gc3RlcHMgaW4gdGhlIGNvbXBhcmlzb24gcHJvY2Vzcy4gVGhlIGZpcnN0IG9uZSBpcyBrZXkgbWF0Y2hpbmcuCisgIC8vIEV2ZXJ5IGVsZW1lbnQgZnJvbSBvbmUgbWVzc2FnZSB3aWxsIGJlIGNvbXBhcmVkIHRvIGV2ZXJ5IGVsZW1lbnQgZnJvbQorICAvLyB0aGUgb3RoZXIgbWVzc2FnZS4gT25seSBmaWVsZHMgaW4gJ2tleV9maWVsZHMnIGFyZSBjb21wYXJlZCBpbiB0aGlzIHN0ZXAKKyAgLy8gdG8gZGVjaWRlIGlmIHR3byBlbGVtZW50cyBoYXZlIHRoZSBzYW1lIGtleS4gVGhlIHNlY29uZCBzdGVwIGlzIHZhbHVlCisgIC8vIGNvbXBhcmlzb24uIFRob3NlIHBhaXJzIG9mIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUga2V5ICh3aXRoIGVxdWFsIHZhbHVlCisgIC8vIGZvciBldmVyeSBmaWVsZCBpbiAna2V5X2ZpZWxkcycpIHdpbGwgYmUgY29tcGFyZWQgaW4gdGhpcyBzdGVwLgorICAvLyBUaW1lIGNvbXBsZXhpdHkgb2YgdGhlIGZpcnN0IHN0ZXAgaXMgTyhzICogbSAqIG4gXiAyKSB3aGVyZSBzIGlzIHRoZQorICAvLyBhdmVyYWdlIHNpemUgb2YgdGhlIGZpZWxkcyBzcGVjaWZpZWQgaW4gJ2tleV9maWVsZHMnLCBtIGlzIHRoZSBudW1iZXIgb2YKKyAgLy8gZmllbGRzIGluICdrZXlfZmllbGRzJyBhbmQgbiBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLiBJZiBwYXJ0aWFsCisgIC8vIG1hdGNoaW5nIGlzIGVuYWJsZWQsIGFuIGV4dHJhIE8obl4zKSB3aWxsIGJlIGluY3VyZWQgYnkgdGhlIG1heGltdW0KKyAgLy8gbWF0Y2hpbmcgYWxnb3JpdGhtLiBUaGUgc2Vjb25kIHN0ZXAgaXMgTyhrICogbikgd2hlcmUgayBpcyB0aGUgYXZlcmFnZQorICAvLyBzaXplIG9mIGVhY2ggZWxlbWVudC4KKyAgdm9pZCBUcmVhdEFzTWFwV2l0aE11bHRpcGxlRmllbGRzQXNLZXkoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGtleV9maWVsZHMpOworICAvLyBTYW1lIGFzIFRyZWF0QXNNYXBXaXRoTXVsdGlwbGVGaWVsZHNBc0tleSwgZXhjZXB0IHRoYXQgZWFjaCBvZiB0aGUgZmllbGQKKyAgLy8gZG8gbm90IG5lY2Vzc2FyaWx5IG5lZWQgdG8gYmUgYSBkaXJlY3Qgc3ViZmllbGQuIEVhY2ggZWxlbWVudCBpbgorICAvLyBrZXlfZmllbGRfcGF0aHMgaW5kaWNhdGUgYSBwYXRoIGZyb20gdGhlIG1lc3NhZ2UgYmVpbmcgY29tcGFyZWQsIGxpc3RpbmcKKyAgLy8gc3VjY2Vzc2l2ZSBzdWJmaWVsZCB0byByZWFjaCB0aGUga2V5IGZpZWxkLgorICAvLworICAvLyBSRVFVSVJFUzoKKyAgLy8gICBmb3Iga2V5X2ZpZWxkX3BhdGggaW4ga2V5X2ZpZWxkX3BhdGhzOgorICAvLyAgICAga2V5X2ZpZWxkX3BhdGhbMF0tPmNvbnRhaW5pbmdfdHlwZSgpID09IGZpZWxkLT5tZXNzYWdlX3R5cGUoKQorICAvLyAgICAgZm9yIGkgaW4gWzAsIGtleV9maWVsZF9wYXRoLnNpemUoKSAtIDEpOgorICAvLyAgICAgICBrZXlfZmllbGRfcGF0aFtpKzFdLT5jb250YWluaW5nX3R5cGUoKSA9PQorICAvLyAgICAgICAgICAga2V5X2ZpZWxkX3BhdGhbaV0tPm1lc3NhZ2VfdHlwZSgpCisgIC8vICAgICAgIGtleV9maWVsZF9wYXRoW2ldLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFCisgIC8vICAgICAgICFrZXlfZmllbGRfcGF0aFtpXS0+aXNfcmVwZWF0ZWQoKQorICB2b2lkIFRyZWF0QXNNYXBXaXRoTXVsdGlwbGVGaWVsZFBhdGhzQXNLZXkoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gPiYga2V5X2ZpZWxkX3BhdGhzKTsKKworICAvLyBVc2VzIGEgY3VzdG9tIE1hcEtleUNvbXBhcmF0b3IgdG8gZGV0ZXJtaW5lIGlmIHR3byBlbGVtZW50cyBoYXZlIHRoZSBzYW1lCisgIC8vIGtleSB3aGVuIGNvbXBhcmluZyBhIHJlcGVhdGVkIGZpZWxkIGFzIGEgbWFwLgorICAvLyBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGRlbGV0ZSB0aGUga2V5X2NvbXBhcmF0b3IuCisgIC8vIFRoaXMgbWV0aG9kIHZhcmllcyBmcm9tIFRyZWF0QXNNYXBXaXRoTXVsdGlwbGVGaWVsZHNBc0tleSBvbmx5IGluIHRoZQorICAvLyBmaXJzdCBrZXkgbWF0Y2hpbmcgc3RlcC4gUmF0aGVyIHRoYW4gY29tcGFyaW5nIHNvbWUgc3BlY2lmaWVkIGZpZWxkcywgaXQKKyAgLy8gd2lsbCBpbnZva2UgdGhlIElzTWF0Y2ggbWV0aG9kIG9mIHRoZSBnaXZlbiAna2V5X2NvbXBhcmF0b3InIHRvIGRlY2lkZSBpZgorICAvLyB0d28gZWxlbWVudHMgaGF2ZSB0aGUgc2FtZSBrZXkuCisgIHZvaWQgVHJlYXRBc01hcFVzaW5nS2V5Q29tcGFyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFwS2V5Q29tcGFyYXRvcioga2V5X2NvbXBhcmF0b3IpOworCisgIC8vIEluaXRpYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBNdWx0aXBsZUZpZWxkc01hcEtleUNvbXBhcmF0b3IuCisgIE1hcEtleUNvbXBhcmF0b3IqIENyZWF0ZU11bHRpcGxlRmllbGRzTWFwS2V5Q29tcGFyYXRvcigKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+ID4mIGtleV9maWVsZF9wYXRocyk7CisKKyAgLy8gQWRkIGEgY3VzdG9tIGlnbm9yZSBjcml0ZXJpYSB0aGF0IGlzIGV2YWx1YXRlZCBpbiBhZGRpdGlvbiB0byB0aGUKKyAgLy8gaWdub3JlZCBmaWVsZHMgYWRkZWQgd2l0aCBJZ25vcmVGaWVsZC4KKyAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIGlnbm9yZV9jcml0ZXJpYS4KKyAgdm9pZCBBZGRJZ25vcmVDcml0ZXJpYShJZ25vcmVDcml0ZXJpYSogaWdub3JlX2NyaXRlcmlhKTsKKworICAvLyBJbmRpY2F0ZXMgdGhhdCBhbnkgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBzaG91bGQgYmUKKyAgLy8gaWdub3JlZCBmb3IgdGhlIHB1cnBvc2VzIG9mIGNvbXBhcmluZyB0d28gbWVzc2FnZXMuIFRoaXMgYXBwbGllcworICAvLyB0byBmaWVsZHMgbmVzdGVkIGluIHRoZSBtZXNzYWdlIHN0cnVjdHVyZSBhcyB3ZWxsIGFzIHRvcCBsZXZlbAorICAvLyBvbmVzLiBXaGVuIHRoZSBNZXNzYWdlRGlmZmVyZW5jZXIgZW5jb3VudGVycyBhbiBpZ25vcmVkIGZpZWxkLAorICAvLyBSZXBvcnRJZ25vcmVkIGlzIGNhbGxlZCBvbiB0aGUgcmVwb3J0ZXIsIGlmIG9uZSBpcyBzcGVjaWZpZWQuCisgIC8vCisgIC8vIFRoZSBvbmx5IHBsYWNlIHdoZXJlIHRoZSBmaWVsZCdzICdpZ25vcmVkJyBzdGF0dXMgaXMgbm90IGFwcGxpZWQgaXMgd2hlbgorICAvLyBpdCBpcyBiZWluZyB1c2VkIGFzIGEga2V5IGluIGEgZmllbGQgcGFzc2VkIHRvIFRyZWF0QXNNYXAgb3IgaXMgb25lIG9mCisgIC8vIHRoZSBmaWVsZHMgcGFzc2VkIHRvIFRyZWF0QXNNYXBXaXRoTXVsdGlwbGVGaWVsZHNBc0tleS4KKyAgLy8gSW4gdGhpcyBjYXNlIGl0IGlzIGNvbXBhcmVkIGluIGtleSBtYXRjaGluZyBidXQgYWZ0ZXIgdGhhdCBpdCdzIGlnbm9yZWQKKyAgLy8gaW4gdmFsdWUgY29tcGFyaXNvbi4KKyAgdm9pZCBJZ25vcmVGaWVsZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworICAvLyBTZXRzIHRoZSBmaWVsZCBjb21wYXJhdG9yIHVzZWQgdG8gZGV0ZXJtaW5lIGRpZmZlcmVuY2VzIGJldHdlZW4gcHJvdG9jb2wKKyAgLy8gYnVmZmVyIGZpZWxkcy4gQnkgZGVmYXVsdCBpdCdzIHNldCB0byBhIERlZmF1bHRGaWVsZENvbXBhcmF0b3IgaW5zdGFuY2UuCisgIC8vIE1lc3NhZ2VEaWZmZXJlbmNlciBkb2Vzbid0IHRha2Ugb3duZXJzaGlwIG92ZXIgdGhlIHBhc3NlZCBvYmplY3QuCisgIC8vIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgQ29tcGFyZSBmb3IgdGhlIGNvbXBhcmF0b3IgdG8KKyAgLy8gYmUgdXNlZC4KKyAgdm9pZCBzZXRfZmllbGRfY29tcGFyYXRvcihGaWVsZENvbXBhcmF0b3IqIGNvbXBhcmF0b3IpOworI2lmZGVmIFBST1RPQlVGX0ZVVFVSRV9CUkVBS0lOR19DSEFOR0VTCisgIHZvaWQgc2V0X2ZpZWxkX2NvbXBhcmF0b3IoRGVmYXVsdEZpZWxkQ29tcGFyYXRvciogY29tcGFyYXRvcik7CisjZW5kaWYgIC8vIFBST1RPQlVGX0ZVVFVSRV9CUkVBS0lOR19DSEFOR0VTCisKKyAgLy8gREVQUkVDQVRFRC4gUGFzcyBhIERlZmF1bHRGaWVsZENvbXBhcmF0b3IgaW5zdGFuY2UgaW5zdGVhZC4KKyAgLy8gU2V0cyB0aGUgZnJhY3Rpb24gYW5kIG1hcmdpbiBmb3IgdGhlIGZsb2F0IGNvbXBhcmlzb24gb2YgYSBnaXZlbiBmaWVsZC4KKyAgLy8gVXNlcyBNYXRoVXRpbDo6V2l0aGluRnJhY3Rpb25Pck1hcmdpbiB0byBjb21wYXJlIHRoZSB2YWx1ZXMuCisgIC8vIE5PVEU6IHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBpZiBkaWZmZXJlbmNlcidzIGZpZWxkIGNvbXBhcmF0b3IgaGFzIGJlZW4KKyAgLy8gICAgICAgc2V0IHRvIGEgY3VzdG9tIG9iamVjdC4KKyAgLy8KKyAgLy8gUkVRVUlSRVM6IGZpZWxkLT5jcHBfdHlwZSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFIG9yCisgIC8vICAgICAgICAgICBmaWVsZC0+Y3BwX3R5cGUgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUCisgIC8vIFJFUVVJUkVTOiBmbG9hdF9jb21wYXJpc29uXyA9PSBBUFBST1hJTUFURQorICB2b2lkIFNldEZyYWN0aW9uQW5kTWFyZ2luKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGRvdWJsZSBmcmFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWFyZ2luKTsKKworICAvLyBTZXRzIHRoZSB0eXBlIG9mIGNvbXBhcmlzb24gKGFzIGRlZmluZWQgaW4gdGhlIE1lc3NhZ2VGaWVsZENvbXBhcmlzb24KKyAgLy8gZW51bWVyYXRpb24gYWJvdmUpIHRoYXQgaXMgdXNlZCBieSB0aGlzIGRpZmZlcmVuY2VyIHdoZW4gZGV0ZXJtaW5pbmcgaG93CisgIC8vIHRvIGNvbXBhcmUgZmllbGRzIGluIG1lc3NhZ2VzLgorICB2b2lkIHNldF9tZXNzYWdlX2ZpZWxkX2NvbXBhcmlzb24oTWVzc2FnZUZpZWxkQ29tcGFyaXNvbiBjb21wYXJpc29uKTsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IG1lc3NhZ2UgZmllbGQgY29tcGFyaXNvbiB1c2VkIGluIHRoaXMgZGlmZmVyZW5jZXIuCisgIE1lc3NhZ2VGaWVsZENvbXBhcmlzb24gbWVzc2FnZV9maWVsZF9jb21wYXJpc29uKCkgY29uc3Q7CisKKyAgLy8gVGVsbHMgdGhlIGRpZmZlcmVuY2VyIHdoZXRoZXIgb3Igbm90IHRvIHJlcG9ydCBtYXRjaGVzLiBUaGlzIG1ldGhvZCBtdXN0CisgIC8vIGJlIGNhbGxlZCBiZWZvcmUgQ29tcGFyZS4gVGhlIGRlZmF1bHQgZm9yIGEgbmV3IGRpZmZlcmVuY2VyIGlzIGZhbHNlLgorICB2b2lkIHNldF9yZXBvcnRfbWF0Y2hlcyhib29sIHJlcG9ydF9tYXRjaGVzKSB7CisgICAgcmVwb3J0X21hdGNoZXNfID0gcmVwb3J0X21hdGNoZXM7CisgIH0KKworICAvLyBUZWxscyB0aGUgZGlmZmVyZW5jZXIgd2hldGhlciBvciBub3QgdG8gcmVwb3J0IG1vdmVzIChpbiBhIHNldCBvciBtYXAKKyAgLy8gcmVwZWF0ZWQgZmllbGQpLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgQ29tcGFyZS4gVGhlIGRlZmF1bHQgZm9yCisgIC8vIGEgbmV3IGRpZmZlcmVuY2VyIGlzIHRydWUuCisgIHZvaWQgc2V0X3JlcG9ydF9tb3Zlcyhib29sIHJlcG9ydF9tb3ZlcykgeyByZXBvcnRfbW92ZXNfID0gcmVwb3J0X21vdmVzOyB9CisKKyAgLy8gVGVsbHMgdGhlIGRpZmZlcmVuY2VyIHdoZXRoZXIgb3Igbm90IHRvIHJlcG9ydCBpZ25vcmVkIHZhbHVlcy4gVGhpcyBtZXRob2QKKyAgLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIENvbXBhcmUuIFRoZSBkZWZhdWx0IGZvciBhIG5ldyBkaWZmZXJlbmNlciBpcyB0cnVlLgorICB2b2lkIHNldF9yZXBvcnRfaWdub3Jlcyhib29sIHJlcG9ydF9pZ25vcmVzKSB7CisgICAgcmVwb3J0X2lnbm9yZXNfID0gcmVwb3J0X2lnbm9yZXM7CisgIH0KKworICAvLyBTZXRzIHRoZSBzY29wZSBvZiB0aGUgY29tcGFyaXNvbiAoYXMgZGVmaW5lZCBpbiB0aGUgU2NvcGUgZW51bWVyYXRpb24KKyAgLy8gYWJvdmUpIHRoYXQgaXMgdXNlZCBieSB0aGlzIGRpZmZlcmVuY2VyIHdoZW4gZGV0ZXJtaW5pbmcgd2hpY2ggZmllbGRzIHRvCisgIC8vIGNvbXBhcmUgYmV0d2VlbiB0aGUgbWVzc2FnZXMuCisgIHZvaWQgc2V0X3Njb3BlKFNjb3BlIHNjb3BlKTsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHNjb3BlIHVzZWQgYnkgdGhpcyBkaWZmZXJlbmNlci4KKyAgU2NvcGUgc2NvcGUoKSBjb25zdDsKKworICAvLyBERVBSRUNBVEVELiBQYXNzIGEgRGVmYXVsdEZpZWxkQ29tcGFyYXRvciBpbnN0YW5jZSBpbnN0ZWFkLgorICAvLyBTZXRzIHRoZSB0eXBlIG9mIGNvbXBhcmlzb24gKGFzIGRlZmluZWQgaW4gdGhlIEZsb2F0Q29tcGFyaXNvbiBlbnVtZXJhdGlvbgorICAvLyBhYm92ZSkgdGhhdCBpcyB1c2VkIGJ5IHRoaXMgZGlmZmVyZW5jZXIgd2hlbiBjb21wYXJpbmcgZmxvYXQgKGFuZCBkb3VibGUpCisgIC8vIGZpZWxkcyBpbiBtZXNzYWdlcy4KKyAgLy8gTk9URTogdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIGlmIGRpZmZlcmVuY2VyJ3MgZmllbGQgY29tcGFyYXRvciBoYXMgYmVlbgorICAvLyAgICAgICBzZXQgdG8gYSBjdXN0b20gb2JqZWN0LgorICB2b2lkIHNldF9mbG9hdF9jb21wYXJpc29uKEZsb2F0Q29tcGFyaXNvbiBjb21wYXJpc29uKTsKKworICAvLyBTZXRzIHRoZSB0eXBlIG9mIGNvbXBhcmlzb24gZm9yIHJlcGVhdGVkIGZpZWxkIChhcyBkZWZpbmVkIGluIHRoZQorICAvLyBSZXBlYXRlZEZpZWxkQ29tcGFyaXNvbiBlbnVtZXJhdGlvbiBhYm92ZSkgdGhhdCBpcyB1c2VkIGJ5IHRoaXMKKyAgLy8gZGlmZmVyZW5jZXIgd2hlbiBjb21wYXJlIHJlcGVhdGVkIGZpZWxkcyBpbiBtZXNzYWdlcy4KKyAgdm9pZCBzZXRfcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbihSZXBlYXRlZEZpZWxkQ29tcGFyaXNvbiBjb21wYXJpc29uKTsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHJlcGVhdGVkIGZpZWxkIGNvbXBhcmlzb24gdXNlZCBieSB0aGlzIGRpZmZlcmVuY2VyLgorICBSZXBlYXRlZEZpZWxkQ29tcGFyaXNvbiByZXBlYXRlZF9maWVsZF9jb21wYXJpc29uKCkgY29uc3Q7CisKKyAgLy8gQ29tcGFyZXMgdGhlIHR3byBzcGVjaWZpZWQgbWVzc2FnZXMsIHJldHVybmluZyB0cnVlIGlmIHRoZXkgYXJlIHRoZSBzYW1lLAorICAvLyBmYWxzZSBvdGhlcndpc2UuIElmIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UsIGFueSBjaGFuZ2VzIGJldHdlZW4gdGhlCisgIC8vIHR3byBtZXNzYWdlcyB3aWxsIGJlIHJlcG9ydGVkIGlmIGEgUmVwb3J0ZXIgd2FzIHNwZWNpZmllZCB2aWEKKyAgLy8gUmVwb3J0RGlmZmVyZW5jZXNUbyAoc2VlIGFsc28gUmVwb3J0RGlmZmVyZW5jZXNUb1N0cmluZykuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIFJFUVVJUkVTIHRoYXQgdGhlIHR3byBtZXNzYWdlcyBoYXZlIHRoZSBzYW1lCisgIC8vIERlc2NyaXB0b3IgKG1lc3NhZ2UxLkdldERlc2NyaXB0b3IoKSA9PSBtZXNzYWdlMi5HZXREZXNjcmlwdG9yKCkpLgorICBib29sIENvbXBhcmUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyKTsKKworICAvLyBTYW1lIGFzIGFib3ZlLCBleGNlcHQgY29tcGFyaW5nIG9ubHkgdGhlIGxpc3Qgb2YgZmllbGRzIHNwZWNpZmllZCBieSB0aGUKKyAgLy8gdHdvIHZlY3RvcnMgb2YgRmllbGREZXNjcmlwdG9ycy4KKyAgYm9vbCBDb21wYXJlV2l0aEZpZWxkcygKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+JiBtZXNzYWdlMV9maWVsZHMsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgbWVzc2FnZTJfZmllbGRzKTsKKworICAvLyBBdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSByZXBvcnRlciB0aGF0IHdpbGwgb3V0cHV0IHRoZSBkaWZmZXJlbmNlcworICAvLyBmb3VuZCAoaWYgYW55KSB0byB0aGUgc3BlY2lmaWVkIG91dHB1dCBzdHJpbmcgcG9pbnRlci4gTm90ZSB0aGF0IHRoaXMKKyAgLy8gbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBDb21wYXJlLgorICB2b2lkIFJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoc3RkOjpzdHJpbmcqIG91dHB1dCk7CisKKyAgLy8gVGVsbHMgdGhlIE1lc3NhZ2VEaWZmZXJlbmNlciB0byByZXBvcnQgZGlmZmVyZW5jZXMgdmlhIHRoZSBzcGVjaWZpZWQKKyAgLy8gcmVwb3J0ZXIuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgQ29tcGFyZSBmb3IKKyAgLy8gdGhlIHJlcG9ydGVyIHRvIGJlIHVzZWQuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGRlbGV0ZQorICAvLyB0aGlzIG9iamVjdC4KKyAgLy8gSWYgdGhlIHByb3ZpZGVkIHBvaW50ZXIgZXF1YWxzIE5VTEwsIHRoZSBNZXNzYWdlRGlmZmVyZW5jZXIgc3RvcHMgcmVwb3J0aW5nCisgIC8vIGRpZmZlcmVuY2VzIHRvIGFueSBwcmV2aW91c2x5IHNldCByZXBvcnRlcnMgb3Igb3V0cHV0IHN0cmluZ3MuCisgIHZvaWQgUmVwb3J0RGlmZmVyZW5jZXNUbyhSZXBvcnRlciogcmVwb3J0ZXIpOworCisgcHJpdmF0ZToKKyAgLy8gQ2xhc3MgZm9yIHByb2Nlc3NpbmcgQW55IGRlc2VyaWFsaXphdGlvbi4gIFRoaXMgbG9naWMgaXMgdXNlZCBieSBib3RoIHRoZQorICAvLyBNZXNzYWdlRGlmZmVyZW5jZXIgYW5kIFN0cmVhbVJlcG9ydGVyIGNsYXNzZXMuCisgIGNsYXNzIFVucGFja0FueUZpZWxkIHsKKyAgIHByaXZhdGU6CisgICAgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNNZXNzYWdlRmFjdG9yeT4gZHluYW1pY19tZXNzYWdlX2ZhY3RvcnlfOworCisgICBwdWJsaWM6CisgICAgVW5wYWNrQW55RmllbGQoKSA9IGRlZmF1bHQ7CisgICAgflVucGFja0FueUZpZWxkKCkgPSBkZWZhdWx0OworICAgIC8vIElmICJhbnkiIGlzIG9mIHR5cGUgZ29vZ2xlLnByb3RvYnVmLkFueSwgZXh0cmFjdCBpdHMgcGF5bG9hZCB1c2luZworICAgIC8vIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBhbmQgc3RvcmUgaW4gImRhdGEiLgorICAgIGJvb2wgVW5wYWNrQW55KGNvbnN0IE1lc3NhZ2UmIGFueSwgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+KiBkYXRhKTsKKyAgfTsKKworIHB1YmxpYzoKKyAgLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIE1lc3NhZ2VEaWZmZXJlbmNlciBSZXBvcnRlciB0aGF0IG91dHB1dHMKKyAgLy8gYW55IGRpZmZlcmVuY2VzIGZvdW5kIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0gdG8gdGhlIHN1cHBsaWVkCisgIC8vIFplcm9Db3B5T3V0cHV0U3RyZWFtIG9yIFByaW50ZXIuIElmIGEgcHJpbnRlciBpcyB1c2VkLCB0aGUgZGVsaW1pdGVyCisgIC8vICptdXN0KiBiZSAnJCcuCisgIC8vCisgIC8vIFdBUk5JTkc6IHRoaXMgcmVwb3J0ZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgZmx1c2ggaXRzIG91dHB1dCB1bnRpbCBpdCBpcworICAvLyBkZXN0cm95ZWQuIEFzIGEgcmVzdWx0LCBpdCBpcyBub3Qgc2FmZSB0byBhc3N1bWUgdGhlIG91dHB1dCBpcyB2YWxpZCBvcgorICAvLyBjb21wbGV0ZSB1bnRpbCBhZnRlciB5b3UgZGVzdHJveSB0aGUgcmVwb3J0ZXIuIEZvciBleGFtcGxlLCBpZiB5b3UgdXNlIGEKKyAgLy8gU3RyZWFtUmVwb3J0ZXIgdG8gd3JpdGUgdG8gYSBTdHJpbmdPdXRwdXRTdHJlYW0sIHRoZSB0YXJnZXQgc3RyaW5nIG1heQorICAvLyBjb250YWluIHVuaW5pdGlhbGl6ZWQgZGF0YSB1bnRpbCB0aGUgcmVwb3J0ZXIgaXMgZGVzdHJveWVkLgorICBjbGFzcyBQUk9UT0JVRl9FWFBPUlQgU3RyZWFtUmVwb3J0ZXIgOiBwdWJsaWMgUmVwb3J0ZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IFN0cmVhbVJlcG9ydGVyKGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgICBleHBsaWNpdCBTdHJlYW1SZXBvcnRlcihpbzo6UHJpbnRlciogcHJpbnRlcik7ICAvLyBkZWxpbWl0ZXIgJyQnCisgICAgflN0cmVhbVJlcG9ydGVyKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBXaGVuIHNldCB0byB0cnVlLCB0aGUgc3RyZWFtIHJlcG9ydGVyIHdpbGwgYWxzbyBvdXRwdXQgYWdncmVnYXRlcyBub2RlcworICAgIC8vIChpLmUuIG1lc3NhZ2VzIGFuZCBncm91cHMpIHdob3NlIHN1YmZpZWxkcyBoYXZlIGJlZW4gbW9kaWZpZWQuIFdoZW4KKyAgICAvLyBmYWxzZSwgd2lsbCBvbmx5IHJlcG9ydCB0aGUgaW5kaXZpZHVhbCBzdWJmaWVsZHMuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgIHZvaWQgc2V0X3JlcG9ydF9tb2RpZmllZF9hZ2dyZWdhdGVzKGJvb2wgcmVwb3J0KSB7CisgICAgICByZXBvcnRfbW9kaWZpZWRfYWdncmVnYXRlc18gPSByZXBvcnQ7CisgICAgfQorCisgICAgLy8gVGhlIGZvbGxvd2luZyBhcmUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBtZXRob2RzIGRlc2NyaWJlZCBhYm92ZS4KKworICAgIHZvaWQgUmVwb3J0QWRkZWQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4mIGZpZWxkX3BhdGgpIG92ZXJyaWRlOworCisgICAgdm9pZCBSZXBvcnREZWxldGVkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4mIGZpZWxkX3BhdGgpIG92ZXJyaWRlOworCisgICAgdm9pZCBSZXBvcnRNb2RpZmllZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgZmllbGRfcGF0aCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIFJlcG9ydE1vdmVkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiBmaWVsZF9wYXRoKSBvdmVycmlkZTsKKworICAgIHZvaWQgUmVwb3J0TWF0Y2hlZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiBmaWVsZF9wYXRoKSBvdmVycmlkZTsKKworICAgIHZvaWQgUmVwb3J0SWdub3JlZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiBmaWVsZF9wYXRoKSBvdmVycmlkZTsKKworICAgIHZvaWQgUmVwb3J0VW5rbm93bkZpZWxkSWdub3JlZCgKKyAgICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgZmllbGRfcGF0aCkgb3ZlcnJpZGU7CisKKyAgICAvLyBNZXNzYWdlcyB0aGF0IGFyZSBiZWluZyBjb21wYXJlZCBtdXN0IGJlIHByb3ZpZGVkIHRvIFN0cmVhbVJlcG9ydGVyIHByaW9yCisgICAgLy8gdG8gcHJvY2Vzc2luZworICAgIHZvaWQgU2V0TWVzc2FnZXMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyKTsKKworICAgcHJvdGVjdGVkOgorICAgIC8vIFByaW50cyB0aGUgc3BlY2lmaWVkIHBhdGggb2YgZmllbGRzIHRvIHRoZSBidWZmZXIuCisgICAgdmlydHVhbCB2b2lkIFByaW50UGF0aChjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgZmllbGRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGVmdF9zaWRlKTsKKworICAgIC8vIFByaW50cyB0aGUgdmFsdWUgb2YgZmllbGRzIHRvIHRoZSBidWZmZXIuICBsZWZ0X3NpZGUgaXMgdHJ1ZSBpZiB0aGUKKyAgICAvLyBnaXZlbiBtZXNzYWdlIGlzIGZyb20gdGhlIGxlZnQgc2lkZSBvZiB0aGUgY29tcGFyaXNvbiwgZmFsc2UgaWYgaXQKKyAgICAvLyB3YXMgdGhlIHJpZ2h0LiAgVGhpcyBpcyByZWxldmFudCBvbmx5IHRvIGRlY2lkZSB3aGV0aGVyIHRvIGZvbGxvdworICAgIC8vIHVua25vd25fZmllbGRfaW5kZXgxIG9yIHVua25vd25fZmllbGRfaW5kZXgyIHdoZW4gYW4gdW5rbm93biBmaWVsZAorICAgIC8vIGlzIGVuY291bnRlcmVkIGluIGZpZWxkX3BhdGguCisgICAgdmlydHVhbCB2b2lkIFByaW50VmFsdWUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgZmllbGRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxlZnRfc2lkZSk7CisKKyAgICAvLyBQcmludHMgdGhlIHNwZWNpZmllZCBwYXRoIG9mIHVua25vd24gZmllbGRzIHRvIHRoZSBidWZmZXIuCisgICAgdmlydHVhbCB2b2lkIFByaW50VW5rbm93bkZpZWxkVmFsdWUoY29uc3QgVW5rbm93bkZpZWxkKiB1bmtub3duX2ZpZWxkKTsKKworICAgIC8vIEp1c3QgcHJpbnQgYSBzdHJpbmcKKyAgICB2b2lkIFByaW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgICBwcml2YXRlOgorICAgIC8vIGhlbHBlciBmdW5jdGlvbiBmb3IgUHJpbnRQYXRoIHRoYXQgY29udGFpbnMgbG9naWMgZm9yIHByaW50aW5nIG1hcHMKKyAgICB2b2lkIFByaW50TWFwS2V5KGJvb2wgbGVmdF9zaWRlLCBjb25zdCBTcGVjaWZpY0ZpZWxkJiBzcGVjaWZpY19maWVsZCk7CisKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcl87CisgICAgYm9vbCBkZWxldGVfcHJpbnRlcl87CisgICAgYm9vbCByZXBvcnRfbW9kaWZpZWRfYWdncmVnYXRlc187CisgICAgY29uc3QgTWVzc2FnZSogbWVzc2FnZTFfOworICAgIGNvbnN0IE1lc3NhZ2UqIG1lc3NhZ2UyXzsKKyAgICBNZXNzYWdlRGlmZmVyZW5jZXI6OlVucGFja0FueUZpZWxkIHVucGFja19hbnlfZmllbGRfOworICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJlYW1SZXBvcnRlcik7CisgIH07CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU2ltcGxlRmllbGRDb21wYXJhdG9yOworCisgIC8vIEEgTWFwS2V5Q29tcGFyYXRvciB0byBiZSB1c2VkIGluIFRyZWF0QXNNYXBVc2luZ0tleUNvbXBhcmF0b3IuCisgIC8vIEltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MgbmVlZHMgdG8gZG8gZmllbGQgdmFsdWUgY29tcGFyaXNvbiB3aGljaAorICAvLyByZWxpZXMgb24gc29tZSBwcml2YXRlIG1ldGhvZHMgb2YgTWVzc2FnZURpZmZlcmVuY2VyLiBUaGF0J3Mgd2h5IHRoaXMKKyAgLy8gY2xhc3MgaXMgZGVjbGFyZWQgYXMgYSBuZXN0ZWQgY2xhc3Mgb2YgTWVzc2FnZURpZmZlcmVuY2VyLgorICBjbGFzcyBNdWx0aXBsZUZpZWxkc01hcEtleUNvbXBhcmF0b3I7CisKKyAgLy8gQSBNYXBLZXlDb21wYXJhdG9yIGZvciB1c2Ugd2l0aCBtYXBfZW50cmllcy4KKyAgY2xhc3MgUFJPVE9CVUZfRVhQT1JUIE1hcEVudHJ5S2V5Q29tcGFyYXRvciA6IHB1YmxpYyBNYXBLZXlDb21wYXJhdG9yIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBNYXBFbnRyeUtleUNvbXBhcmF0b3IoTWVzc2FnZURpZmZlcmVuY2VyKiBtZXNzYWdlX2RpZmZlcmVuY2VyKTsKKyAgICBib29sIElzTWF0Y2goCisgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4mIHBhcmVudF9maWVsZHMpIGNvbnN0IG92ZXJyaWRlOworCisgICBwcml2YXRlOgorICAgIE1lc3NhZ2VEaWZmZXJlbmNlciogbWVzc2FnZV9kaWZmZXJlbmNlcl87CisgIH07CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkMSdzIG51bWJlcigpIGlzIGxlc3MgdGhhbiBmaWVsZDIncy4KKyAgc3RhdGljIGJvb2wgRmllbGRCZWZvcmUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQyKTsKKworICAvLyBSZXRyaWV2ZSBhbGwgdGhlIHNldCBmaWVsZHMsIGluY2x1ZGluZyBleHRlbnNpb25zLgorICBGaWVsZERlc2NyaXB0b3JBcnJheSBSZXRyaWV2ZUZpZWxkcyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJhc2VfbWVzc2FnZSk7CisKKyAgLy8gQ29tYmluZSB0aGUgdHdvIGxpc3RzIG9mIGZpZWxkcyBpbnRvIHRoZSBjb21iaW5lZF9maWVsZHMgb3V0cHV0IHZlY3Rvci4KKyAgLy8gQWxsIGZpZWxkcyBwcmVzZW50IGluIGJvdGggbGlzdHMgd2lsbCBhbHdheXMgYmUgaW5jbHVkZWQgaW4gdGhlIGNvbWJpbmVkCisgIC8vIGxpc3QuICBGaWVsZHMgb25seSBwcmVzZW50IGluIG9uZSBvZiB0aGUgbGlzdHMgd2lsbCBvbmx5IGFwcGVhciBpbiB0aGUKKyAgLy8gY29tYmluZWQgbGlzdCBpZiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZHNfc2NvcGUgb3B0aW9uIGlzIHNldCB0byBGVUxMLgorICBGaWVsZERlc2NyaXB0b3JBcnJheSBDb21iaW5lRmllbGRzKGNvbnN0IEZpZWxkRGVzY3JpcHRvckFycmF5JiBmaWVsZHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlIGZpZWxkczFfc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yQXJyYXkmIGZpZWxkczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGUgZmllbGRzMl9zY29wZSk7CisKKyAgLy8gSW50ZXJuYWwgdmVyc2lvbiBvZiB0aGUgQ29tcGFyZSBtZXRob2Qgd2hpY2ggcGVyZm9ybXMgdGhlIGFjdHVhbAorICAvLyBjb21wYXJpc29uLiBUaGUgcGFyZW50X2ZpZWxkcyB2ZWN0b3IgaXMgYSB2ZWN0b3IgY29udGFpbmluZyBmaWVsZAorICAvLyBkZXNjcmlwdG9ycyBvZiBhbGwgZmllbGRzIGFjY2Vzc2VkIHRvIGdldCB0byB0aGlzIGNvbXBhcmlzb24gb3BlcmF0aW9uCisgIC8vIChpLmUuIGlmIHRoZSBjdXJyZW50IG1lc3NhZ2UgaXMgYW4gZW1iZWRkZWQgbWVzc2FnZSwgdGhlIHBhcmVudF9maWVsZHMKKyAgLy8gdmVjdG9yIHdpbGwgY29udGFpbiB0aGUgZmllbGQgdGhhdCBoYXMgdGhpcyBlbWJlZGRlZCBtZXNzYWdlKS4KKyAgYm9vbCBDb21wYXJlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+KiBwYXJlbnRfZmllbGRzKTsKKworICAvLyBDb21wYXJlcyBhbGwgdGhlIHVua25vd24gZmllbGRzIGluIHR3byBtZXNzYWdlcy4KKyAgYm9vbCBDb21wYXJlVW5rbm93bkZpZWxkcyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiwgY29uc3QgVW5rbm93bkZpZWxkU2V0JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiogcGFyZW50X2ZpZWxkcyk7CisKKyAgLy8gQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBtZXNzYWdlcyBmb3IgdGhlIHJlcXVlc3RlZCBmaWVsZCBsaXN0cy4gVGhlIGZpZWxkCisgIC8vIGxpc3RzIGFyZSBtb2RpZmllZCBkZXBlbmRpbmcgb24gY29tcGFyaXNvbiBzZXR0aW5ncywgYW5kIHRoZW4gcGFzc2VkIHRvCisgIC8vIENvbXBhcmVXaXRoRmllbGRzSW50ZXJuYWwuCisgIGJvb2wgQ29tcGFyZVJlcXVlc3RlZEZpZWxkc1VzaW5nU2V0dGluZ3MoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JBcnJheSYgbWVzc2FnZTFfZmllbGRzLAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yQXJyYXkmIG1lc3NhZ2UyX2ZpZWxkcywKKyAgICAgIHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+KiBwYXJlbnRfZmllbGRzKTsKKworICAvLyBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2VzIHdpdGggdGhlIHNwZWNpZmllZCBmaWVsZCBsaXN0cy4KKyAgYm9vbCBDb21wYXJlV2l0aEZpZWxkc0ludGVybmFsKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JBcnJheSYgbWVzc2FnZTFfZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yQXJyYXkmIG1lc3NhZ2UyX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+KiBwYXJlbnRfZmllbGRzKTsKKworICAvLyBDb21wYXJlcyB0aGUgcmVwZWF0ZWQgZmllbGRzLCBhbmQgcmVwb3J0IHRoZSBlcnJvci4KKyAgYm9vbCBDb21wYXJlUmVwZWF0ZWRGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiogcGFyZW50X2ZpZWxkcyk7CisKKyAgLy8gQ29tcGFyZXMgbWFwIGZpZWxkcywgYW5kIHJlcG9ydCB0aGUgZXJyb3IuCisgIGJvb2wgQ29tcGFyZU1hcEZpZWxkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4qIHBhcmVudF9maWVsZHMpOworCisgIC8vIEhlbHBlciBmb3IgQ29tcGFyZVJlcGVhdGVkRmllbGQgYW5kIENvbXBhcmVNYXBGaWVsZDogY29tcGFyZXMgYW5kIHJlcG9ydHMKKyAgLy8gZGlmZmVyZW5jZXMgZWxlbWVudC13aXNlLiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3Igbm9uLW1hcCBmaWVsZHMsCisgIC8vIGFuZCBjYW4gYWxzbyBjb21wYXJlIG1hcCBmaWVsZHMgYnkgdXNpbmcgdGhlIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24uCisgIGJvb2wgQ29tcGFyZVJlcGVhdGVkUmVwKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4qIHBhcmVudF9maWVsZHMpOworCisgIC8vIEhlbHBlciBmb3IgQ29tcGFyZU1hcEZpZWxkOiBjb21wYXJlIHRoZSBtYXAgZmllbGRzIHVzaW5nIG1hcCByZWZsZWN0aW9uCisgIC8vIGluc3RlYWQgb2Ygc3luYyB0byByZXBlYXRlZC4KKyAgYm9vbCBDb21wYXJlTWFwRmllbGRCeU1hcFJlZmxlY3Rpb24oY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiogcGFyZW50X2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEZpZWxkQ29tcGFyYXRvciogY29tcGFyYXRvcik7CisKKyAgLy8gU2hvcnRoYW5kIGZvciBDb21wYXJlRmllbGRWYWx1ZVVzaW5nUGFyZW50RmllbGRzIHdpdGggTlVMTCBwYXJlbnRfZmllbGRzLgorICBib29sIENvbXBhcmVGaWVsZFZhbHVlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKTsKKworICAvLyBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIGZpZWxkIG9uIHRoZSB0d28gbWVzc2FnZXMsIHJldHVybmluZworICAvLyB0cnVlIGlmIHRoZXkgYXJlIHRoZSBzYW1lLCBmYWxzZSBvdGhlcndpc2UuIEZvciByZXBlYXRlZCBmaWVsZHMsCisgIC8vIHRoaXMgbWV0aG9kIG9ubHkgY29tcGFyZXMgdGhlIHZhbHVlIGluIHRoZSBzcGVjaWZpZWQgaW5kZXguIFRoaXMgbWV0aG9kCisgIC8vIHVzZXMgQ29tcGFyZSBmdW5jdGlvbnMgdG8gcmVjdXJzZSBpbnRvIHN1Ym1lc3NhZ2VzLgorICAvLyBUaGUgcGFyZW50X2ZpZWxkcyB2ZWN0b3IgaXMgdXNlZCBpbiBjYWxscyB0byBhIFJlcG9ydGVyIGluc3RhbmNlIGNhbGxzLgorICAvLyBJdCBjYW4gYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGUgTWVzc2FnZURpZmZlcmVuY2VyIHdpbGwgY3JlYXRlIG5ldworICAvLyBsaXN0IG9mIHBhcmVudCBtZXNzYWdlcyBpZiBpdCBuZWVkcyB0byByZWN1cnNpdmVseSBjb21wYXJlIHRoZSBnaXZlbiBmaWVsZC4KKyAgLy8gVG8gYXZvaWQgY29uZnVzaW5nIHVzZXJzIHlvdSBzaG91bGQgbm90IHNldCBpdCB0byBOVUxMIHVubGVzcyB5b3UgbW9kaWZpZWQKKyAgLy8gUmVwb3J0ZXIgdG8gaGFuZGxlIHRoZSBjaGFuZ2Ugb2YgcGFyZW50X2ZpZWxkcyBjb3JyZWN0bHkuCisgIGJvb2wgQ29tcGFyZUZpZWxkVmFsdWVVc2luZ1BhcmVudEZpZWxkcygKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleDEsIGludCBpbmRleDIsCisgICAgICBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiogcGFyZW50X2ZpZWxkcyk7CisKKyAgLy8gQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBmaWVsZCBvbiB0aGUgdHdvIG1lc3NhZ2VzLCByZXR1cm5pbmcgY29tcGFyaXNvbgorICAvLyByZXN1bHQsIGFzIHJldHVybmVkIGJ5IGFwcHJvcHJpYXRlIEZpZWxkQ29tcGFyYXRvci4KKyAgRmllbGRDb21wYXJhdG9yOjpDb21wYXJpc29uUmVzdWx0IEdldEZpZWxkQ29tcGFyaXNvblJlc3VsdCgKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleDEsIGludCBpbmRleDIsCisgICAgICBjb25zdCBGaWVsZENvbnRleHQqIGZpZWxkX2NvbnRleHQpOworCisgIC8vIENoZWNrIGlmIHRoZSB0d28gZWxlbWVudHMgaW4gdGhlIHJlcGVhdGVkIGZpZWxkIGFyZSBtYXRjaCB0byBlYWNoIG90aGVyLgorICAvLyBpZiB0aGUga2V5X2NvbXByYXRvciBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIHRoZSB0d28KKyAgLy8gZWxlbWVudHMgYXJlIGVxdWFsLgorICBib29sIElzTWF0Y2goY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXBlYXRlZF9maWVsZCwKKyAgICAgICAgICAgICAgIGNvbnN0IE1hcEtleUNvbXBhcmF0b3IqIGtleV9jb21wYXJhdG9yLCBjb25zdCBNZXNzYWdlKiBtZXNzYWdlMSwKKyAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIG1lc3NhZ2UyLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4mIHBhcmVudF9maWVsZHMsCisgICAgICAgICAgICAgICBSZXBvcnRlciogcmVwb3J0ZXIsIGludCBpbmRleDEsIGludCBpbmRleDIpOworCisgIC8vIFJldHVybnMgdHJ1ZSB3aGVuIHRoaXMgcmVwZWF0ZWQgZmllbGQgaGFzIGJlZW4gY29uZmlndXJlZCB0byBiZSB0cmVhdGVkCisgIC8vIGFzIGEgU2V0IC8gU21hcnRTZXQgLyBTbWFydExpc3QuCisgIGJvb2wgSXNUcmVhdGVkQXNTZXQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisgIGJvb2wgSXNUcmVhdGVkQXNTbWFydFNldChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworICBib29sIElzVHJlYXRlZEFzU21hcnRMaXN0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworICAvLyBXaGVuIHRyZWF0aW5nIGFzIFNNQVJUX0xJU1QsIGl0IHVzZXMgTWF0Y2hJbmRpY2VzUG9zdFByb2Nlc3NvckZvclNtYXJ0TGlzdAorICAvLyBieSBkZWZhdWx0IHRvIGZpbmQgdGhlIGxvbmdlc3QgbWF0Y2hpbmcgc2VxdWVuY2UgZnJvbSB0aGUgZmlyc3QgbWF0Y2hpbmcKKyAgLy8gZWxlbWVudC4gVGhlIGNhbGxiYWNrIHRha2VzIHR3byB2ZWN0b3JzIHNob3dpbmcgdGhlIG1hdGNoaW5nIGluZGljZXMgZnJvbQorICAvLyB0aGUgb3RoZXIgdmVjdG9yLCB3aGVyZSAtMSBtZWFucyBhbiB1bm1hdGNoLgorICB2b2lkIFNldE1hdGNoSW5kaWNlc0ZvclNtYXJ0TGlzdENhbGxiYWNrKAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPGludD4qLCBzdGQ6OnZlY3RvcjxpbnQ+Kik+IGNhbGxiYWNrKTsKKworICAvLyBSZXR1cm5zIHRydWUgd2hlbiB0aGlzIHJlcGVhdGVkIGZpZWxkIGlzIHRvIGJlIGNvbXBhcmVkIGFzIGEgc3Vic2V0LCBpZS4KKyAgLy8gaGFzIGJlZW4gY29uZmlndXJlZCB0byBiZSB0cmVhdGVkIGFzIGEgc2V0IG9yIG1hcCBhbmQgc2NvcGUgaXMgc2V0IHRvCisgIC8vIFBBUlRJQUwuCisgIGJvb2wgSXNUcmVhdGVkQXNTdWJzZXQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgZmllbGQgaXMgdG8gYmUgaWdub3JlZCB3aGVuIHRoaXMKKyAgLy8gTWVzc2FnZURpZmZlcmVuY2VyIGNvbXBhcmVzIG1lc3NhZ2VzLgorICBib29sIElzSWdub3JlZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiBwYXJlbnRfZmllbGRzKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyB1bmtub3duIGZpZWxkIGlzIHRvIGJlIGlnbm9yZWQgd2hlbiB0aGlzCisgIC8vIE1lc3NhZ2VEaWZmZXJlbmNlciBjb21wYXJlcyBtZXNzYWdlcy4KKyAgYm9vbCBJc1Vua25vd25GaWVsZElnbm9yZWQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZTEsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTcGVjaWZpY0ZpZWxkJiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3BlY2lmaWNGaWVsZD4mIHBhcmVudF9maWVsZHMpOworCisgIC8vIFJldHVybnMgTWFwS2V5Q29tcGFyYXRvciogd2hlbiB0aGlzIGZpZWxkIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gYmUgdHJlYXRlZAorICAvLyBhcyBhIG1hcCBvciBpdHMgaXNfbWFwKCkgcmV0dXJuIHRydWUuICBJZiBub3QsIHJldHVybnMgTlVMTC4KKyAgY29uc3QgTWFwS2V5Q29tcGFyYXRvciogR2V0TWFwS2V5Q29tcGFyYXRvcigKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIC8vIEF0dGVtcHRzIHRvIG1hdGNoIGluZGljZXMgb2YgYSByZXBlYXRlZCBmaWVsZCwgc28gdGhhdCB0aGUgY29udGFpbmVkIHZhbHVlcworICAvLyBtYXRjaC4gQ2xlYXJzIG91dHB1dCB2ZWN0b3JzIGFuZCBzZXRzIHRoZWlyIHZhbHVlcyB0byBpbmRpY2VzIG9mIHBhaXJlZAorICAvLyBtZXNzYWdlcywgaWUuIGlmIG1lc3NhZ2UxWzBdIG1hdGNoZXMgbWVzc2FnZTJbMV0sIHRoZW4gbWF0Y2hfbGlzdDFbMF0gPT0gMQorICAvLyBhbmQgbWF0Y2hfbGlzdDJbMV0gPT0gMC4gVGhlIHVubWF0Y2hlZCBpbmRpY2VzIGFyZSBpbmRpY2F0ZWQgYnkgLTEuCisgIC8vIEFzc3VtZXMgdGhlIHJlcGVhdGVkIGZpZWxkIGlzIG5vdCB0cmVhdGVkIGFzIGEgc2ltcGxlIGxpc3QuCisgIC8vIFRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UgaWYgdGhlIG1hdGNoIGZhaWxlZC4gSG93ZXZlciwgaXQgZG9lc24ndCBtZWFuCisgIC8vIHRoYXQgdGhlIGNvbXBhcmlzb24gc3VjY2VlZHMgd2hlbiB0aGlzIG1ldGhvZCByZXR1cm5zIHRydWUgKHlvdSBuZWVkIHRvCisgIC8vIGRvdWJsZS1jaGVjayBpbiB0aGlzIGNhc2UpLgorICBib29sIE1hdGNoUmVwZWF0ZWRGaWVsZEluZGljZXMoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlcGVhdGVkX2ZpZWxkLAorICAgICAgY29uc3QgTWFwS2V5Q29tcGFyYXRvcioga2V5X2NvbXBhcmF0b3IsCisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgcGFyZW50X2ZpZWxkcywKKyAgICAgIHN0ZDo6dmVjdG9yPGludD4qIG1hdGNoX2xpc3QxLCBzdGQ6OnZlY3RvcjxpbnQ+KiBtYXRjaF9saXN0Mik7CisKKyAgLy8gQ2hlY2tzIGlmIGluZGV4IGlzIGVxdWFsIHRvIG5ld19pbmRleCBpbiBhbGwgdGhlIHNwZWNpZmljIGZpZWxkcy4KKyAgc3RhdGljIGJvb2wgQ2hlY2tQYXRoQ2hhbmdlZChjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgcGFyZW50X2ZpZWxkcyk7CisKKyAgLy8gQ0hFQ0tzIHRoYXQgdGhlIGdpdmVuIHJlcGVhdGVkIGZpZWxkIGNhbiBiZSBjb21wYXJlZCBhY2NvcmRpbmcgdG8KKyAgLy8gbmV3X2NvbXBhcmlzb24uCisgIHZvaWQgQ2hlY2tSZXBlYXRlZEZpZWxkQ29tcGFyaXNvbnMoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgY29uc3QgUmVwZWF0ZWRGaWVsZENvbXBhcmlzb24mIG5ld19jb21wYXJpc29uKTsKKworICAvLyBEZWZpbmVzIGEgbWFwIGJldHdlZW4gZmllbGQgZGVzY3JpcHRvcnMgYW5kIHRoZWlyIE1hcEtleUNvbXBhcmF0b3JzLgorICAvLyBVc2VkIGZvciByZXBlYXRlZCBmaWVsZHMgd2hlbiB0aGV5IGFyZSBjb25maWd1cmVkIGFzIFRyZWF0QXNNYXAuCisgIHR5cGVkZWYgc3RkOjptYXA8Y29uc3QgRmllbGREZXNjcmlwdG9yKiwgY29uc3QgTWFwS2V5Q29tcGFyYXRvcio+CisgICAgICBGaWVsZEtleUNvbXBhcmF0b3JNYXA7CisKKyAgLy8gRGVmaW5lcyBhIHNldCB0byBzdG9yZSBmaWVsZCBkZXNjcmlwdG9ycy4gIFVzZWQgZm9yIHJlcGVhdGVkIGZpZWxkcyB3aGVuCisgIC8vIHRoZXkgYXJlIGNvbmZpZ3VyZWQgYXMgVHJlYXRBc1NldC4KKyAgdHlwZWRlZiBzdGQ6OnNldDxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBGaWVsZFNldDsKKyAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBGaWVsZERlc2NyaXB0b3IqLCBSZXBlYXRlZEZpZWxkQ29tcGFyaXNvbj4gRmllbGRNYXA7CisKKyAgUmVwb3J0ZXIqIHJlcG9ydGVyXzsKKyAgRGVmYXVsdEZpZWxkQ29tcGFyYXRvciBkZWZhdWx0X2ZpZWxkX2NvbXBhcmF0b3JfOworICBNZXNzYWdlRmllbGRDb21wYXJpc29uIG1lc3NhZ2VfZmllbGRfY29tcGFyaXNvbl87CisgIFNjb3BlIHNjb3BlXzsKKyAgUmVwZWF0ZWRGaWVsZENvbXBhcmlzb24gcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbl87CisKKyAgRmllbGRNYXAgcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbnNfOworICAvLyBLZWVwcyB0cmFjayBvZiBNYXBLZXlDb21wYXJhdG9ycyB0aGF0IGFyZSBjcmVhdGVkIHdpdGhpbgorICAvLyBNZXNzYWdlRGlmZmVyZW5jZXIuIFRoZXNlIE1hcEtleUNvbXBhcmF0b3JzIHNob3VsZCBiZSBkZWxldGVkCisgIC8vIGJlZm9yZSBNZXNzYWdlRGlmZmVyZW5jZXIgaXMgZGVzdHJveWVkLgorICAvLyBXaGVuIFRyZWF0QXNNYXAgb3IgVHJlYXRBc01hcFdpdGhNdWx0aXBsZUZpZWxkc0FzS2V5IGlzIGNhbGxlZCwgd2UgZG9uJ3QKKyAgLy8gc3RvcmUgdGhlIHN1cHBsaWVkIEZpZWxkRGVzY3JpcHRvcnMgZGlyZWN0bHkuIEluc3RlYWQsIGEgbmV3CisgIC8vIE1hcEtleUNvbXBhcmF0b3IgaXMgY3JlYXRlZCBmb3IgY29tcGFyaXNvbiBwdXJwb3NlLgorICBzdGQ6OnZlY3RvcjxNYXBLZXlDb21wYXJhdG9yKj4gb3duZWRfa2V5X2NvbXBhcmF0b3JzXzsKKyAgRmllbGRLZXlDb21wYXJhdG9yTWFwIG1hcF9maWVsZF9rZXlfY29tcGFyYXRvcl87CisgIE1hcEVudHJ5S2V5Q29tcGFyYXRvciBtYXBfZW50cnlfa2V5X2NvbXBhcmF0b3JfOworICBzdGQ6OnZlY3RvcjxJZ25vcmVDcml0ZXJpYSo+IGlnbm9yZV9jcml0ZXJpYV87CisgIC8vIFJldXNlZCBtdWx0aXBsZSB0aW1lcyBpbiBSZXRyaWV2ZUZpZWxkcyB0byBhdm9pZCBleHRyYSBhbGxvY2F0aW9ucworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiB0bXBfbWVzc2FnZV9maWVsZHNfOworCisgIEZpZWxkU2V0IGlnbm9yZWRfZmllbGRzXzsKKworICB1bmlvbiB7CisgICAgRGVmYXVsdEZpZWxkQ29tcGFyYXRvciogZGVmYXVsdF9pbXBsOworICAgIEZpZWxkQ29tcGFyYXRvciogYmFzZTsKKyAgfSBmaWVsZF9jb21wYXJhdG9yXyA9IHsmZGVmYXVsdF9maWVsZF9jb21wYXJhdG9yX307CisgIGVudW0geyBrRkNEZWZhdWx0LCBrRkNCYXNlIH0gZmllbGRfY29tcGFyYXRvcl9raW5kXyA9IGtGQ0RlZmF1bHQ7CisKKyAgYm9vbCByZXBvcnRfbWF0Y2hlc187CisgIGJvb2wgcmVwb3J0X21vdmVzXzsKKyAgYm9vbCByZXBvcnRfaWdub3Jlc187CisKKyAgc3RkOjpzdHJpbmcqIG91dHB1dF9zdHJpbmdfOworCisgIC8vIENhbGxiYWNrIHRvIHBvc3QtcHJvY2VzcyB0aGUgbWF0Y2hlZCBpbmRpY2VzIHRvIHN1cHBvcnQgU01BUlRfTElTVC4KKyAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPGludD4qLCBzdGQ6OnZlY3RvcjxpbnQ+Kik+CisgICAgICBtYXRjaF9pbmRpY2VzX2Zvcl9zbWFydF9saXN0X2NhbGxiYWNrXzsKKworICBNZXNzYWdlRGlmZmVyZW5jZXI6OlVucGFja0FueUZpZWxkIHVucGFja19hbnlfZmllbGRfOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZURpZmZlcmVuY2VyKTsKK307CisKKy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgZXh0cmEgaW5mb3JtYXRpb24gdG8gdGhlIEZpZWxkQ29tcGFyYXRvcjo6Q29tcGFyZQorLy8gZnVuY3Rpb24uCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgRmllbGRDb250ZXh0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEZpZWxkQ29udGV4dCgKKyAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VEaWZmZXJlbmNlcjo6U3BlY2lmaWNGaWVsZD4qIHBhcmVudF9maWVsZHMpCisgICAgICA6IHBhcmVudF9maWVsZHNfKHBhcmVudF9maWVsZHMpIHt9CisKKyAgc3RkOjp2ZWN0b3I8TWVzc2FnZURpZmZlcmVuY2VyOjpTcGVjaWZpY0ZpZWxkPiogcGFyZW50X2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gcGFyZW50X2ZpZWxkc187CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VEaWZmZXJlbmNlcjo6U3BlY2lmaWNGaWVsZD4qIHBhcmVudF9maWVsZHNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9VVElMX01FU1NBR0VfRElGRkVSRU5DRVJfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZTQ0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDM4MDkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGpzY2hvcnJAZ29vZ2xlLmNvbSAoSm9zZXBoIFNjaG9ycikKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRPRE8oa3Nyb2thKTogTW92ZSBzb21lIG9mIHRoZXNlIHRlc3RzIHRvIGZpZWxkX2NvbXBhcmF0b3JfdGVzdC5jYy4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxyYW5kb20+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK25hbWVzcGFjZSB7CisKKworY29uc3QgRmllbGREZXNjcmlwdG9yKiBHZXRGaWVsZERlc2NyaXB0b3IoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWVsZF9wYXRoID0KKyAgICAgIFNwbGl0KGZpZWxkX25hbWUsICIuIiwgdHJ1ZSk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG51bGxwdHI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfcGF0aC5zaXplKCk7IGkrKykgeworICAgIGZpZWxkID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKGZpZWxkX3BhdGhbaV0pOworICAgIGRlc2NyaXB0b3IgPSBmaWVsZC0+bWVzc2FnZV90eXBlKCk7CisgIH0KKyAgcmV0dXJuIGZpZWxkOworfQorCit2b2lkIEV4cGVjdEVxdWFsc1dpdGhEaWZmZXJlbmNlcih1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIqIGRpZmZlcmVuY2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgbXNnMSwgY29uc3QgTWVzc2FnZSYgbXNnMikgeworICBkaWZmZXJlbmNlci0+c2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RlVMTCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLT5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKworICBkaWZmZXJlbmNlci0+c2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6UEFSVElBTCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLT5Db21wYXJlKG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBCYXNpY0VxdWFsaXR5VGVzdCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cyOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cyKTsKKworICAvLyBDb21wYXJlCisgIEVYUEVDVF9UUlVFKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RXF1YWxzKG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBCYXNpY0luZXF1YWxpdHlUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzIpOworCisgIG1zZzEuc2V0X29wdGlvbmFsX2ludDMyKC0xKTsKKworICAvLyBDb21wYXJlCisgIEVYUEVDVF9GQUxTRSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkVxdWFscyhtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgUmVwZWF0ZWRGaWVsZEluZXF1YWxpdHlUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzIpOworCisgIG1zZzEuYWRkX3JlcGVhdGVkX2ludDMyKC0xKTsKKworICAvLyBDb21wYXJlCisgIEVYUEVDVF9GQUxTRSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkVxdWFscyhtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgUmVwZWF0ZWRGaWVsZFNldE9wdGltaXphdGlvblRlc3QpIHsKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMjsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6SXRlbSogaXRlbTEgPSBtc2cxLmFkZF9pdGVtKCk7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2U6Okl0ZW0qIGl0ZW0yID0gbXNnMi5hZGRfaXRlbSgpOworICBkaWZmZXJlbmNlci5UcmVhdEFzU2V0KGl0ZW0xLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgicmEiKSk7CisgIGRpZmZlcmVuY2VyLlRyZWF0QXNTZXQoaXRlbTItPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJyYSIpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICBpdGVtMS0+YWRkX3JhKGkpOworICAgIGl0ZW0yLT5hZGRfcmEoaSk7CisgIH0KKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisgIGl0ZW0yLT5hZGRfcmEoMTAwMSk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgaXRlbTEtPmFkZF9yYSgxMDAxKTsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisgIGl0ZW0xLT5hZGRfcmEoMTAwMik7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBNYXBGaWVsZEVxdWFsaXR5VGVzdCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHVuaXR0ZXN0OjpUZXN0TWFwIG1zZzE7CisgIHVuaXR0ZXN0OjpUZXN0TWFwIG1zZzI7CisKKyAgTWFwUmVmbGVjdGlvblRlc3RlciB0ZXN0ZXIodW5pdHRlc3Q6OlRlc3RNYXA6OmRlc2NyaXB0b3IoKSk7CisgIHRlc3Rlci5TZXRNYXBGaWVsZHNWaWFSZWZsZWN0aW9uKCZtc2cxKTsKKyAgdGVzdGVyLlNldE1hcEZpZWxkc1ZpYVJlZmxlY3Rpb24oJm1zZzIpOworICB0ZXN0ZXIuU3dhcE1hcHNWaWFSZWZsZWN0aW9uKCZtc2cxKTsKKworICAvLyBDb21wYXJlCisgIEVYUEVDVF9UUlVFKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RXF1YWxzKG1zZzEsIG1zZzIpKTsKKworICAvLyBHZXQgbWFwIGVudHJpZXMgYnkgaW5kZXggd2lsbCBzeW5jIG1hcCB0byByZXBlYXRlZCBmaWVsZAorICBNYXBUZXN0VXRpbDo6R2V0TWFwRW50cmllcyhtc2cxLCAwKTsKKyAgRVhQRUNUX1RSVUUodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFcXVhbHMobXNnMSwgbXNnMikpOworCisgIC8vIENvbXBhcmUgdmFsdWVzIG5vdCBtYXRjaAorICAoKm1zZzEubXV0YWJsZV9tYXBfaW50MzJfaW50MzIoKSlbMV0gPSAyOworICAoKm1zZzIubXV0YWJsZV9tYXBfaW50MzJfaW50MzIoKSlbMV0gPSAzOworICBFWFBFQ1RfRkFMU0UodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFcXVhbHMobXNnMSwgbXNnMikpOworCisgIC8vIENvbXBhcmUga2V5cyBub3QgbWF0Y2gKKyAgbXNnMS5DbGVhcigpOworICBtc2cyLkNsZWFyKCk7CisgICgqbXNnMS5tdXRhYmxlX21hcF9zdHJpbmdfc3RyaW5nKCkpWyIxIl0gPSAiIjsKKyAgKCptc2cyLm11dGFibGVfbWFwX3N0cmluZ19zdHJpbmcoKSlbIjIiXSA9ICIiOworICBFWFBFQ1RfRkFMU0UodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFcXVhbHMobXNnMSwgbXNnMikpOworCisgIC8vIENvbXBhcmUgbWVzc2FnZSB2YWx1ZXMgbm90IG1hdGNoCisgIG1zZzEuQ2xlYXIoKTsKKyAgbXNnMi5DbGVhcigpOworICAoKm1zZzEubXV0YWJsZV9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKCkpWzFdLnNldF9jKDEpOworICAoKm1zZzIubXV0YWJsZV9tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKCkpWzFdLnNldF9jKDIpOworICBFWFBFQ1RfRkFMU0UodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFcXVhbHMobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIEJhc2ljUGFydGlhbEVxdWFsaXR5VGVzdCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cyOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cyKTsKKworICAvLyBDb21wYXJlCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6UEFSVElBTCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFBhcnRpYWxFcXVhbGl0eVRlc3RFeHRyYUZpZWxkKSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzIpOworCisgIG1zZzEuY2xlYXJfb3B0aW9uYWxfaW50MzIoKTsKKworICAvLyBDb21wYXJlCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6UEFSVElBTCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFBhcnRpYWxFcXVhbGl0eVRlc3RTa2lwUmVxdWlyZWRGaWVsZCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbXNnMTsKKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtc2cyOworCisgIG1zZzEuc2V0X2EoNDAxKTsKKyAgbXNnMi5zZXRfYSg0MDEpOworICBtc2cyLnNldF9iKDQwMik7CisKKyAgLy8gQ29tcGFyZQorICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLnNldF9zY29wZSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OlBBUlRJQUwpOworICBFWFBFQ1RfVFJVRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBCYXNpY1BhcnRpYWxJbmVxdWFsaXR5VGVzdCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cyOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cyKTsKKworICBtc2cxLnNldF9vcHRpb25hbF9pbnQzMigtMSk7CisKKyAgLy8gQ29tcGFyZQorICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLnNldF9zY29wZSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OlBBUlRJQUwpOworICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgUGFydGlhbEluZXF1YWxpdHlNaXNzaW5nRmllbGRUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzIpOworCisgIG1zZzIuY2xlYXJfb3B0aW9uYWxfaW50MzIoKTsKKworICAvLyBDb21wYXJlCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6UEFSVElBTCk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBSZXBlYXRlZEZpZWxkUGFydGlhbEluZXF1YWxpdHlUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzIpOworCisgIG1zZzEuYWRkX3JlcGVhdGVkX2ludDMyKC0xKTsKKworICAvLyBDb21wYXJlCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6UEFSVElBTCk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBCYXNpY0VxdWl2YWxlbmN5VGVzdCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cyOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cyKTsKKworICAvLyBDb21wYXJlCisgIEVYUEVDVF9UUlVFKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RXF1aXZhbGVudChtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgRXF1aXZhbGVuY3lOb3RFcXVhbFRlc3QpIHsKKyAgLy8gQ3JlYXRlIHRoZSB0ZXN0aW5nIHByb3RvcworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cxKTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMik7CisKKyAgbXNnMS5jbGVhcl9vcHRpb25hbF9pbnQzMigpOworICBtc2cyLnNldF9vcHRpb25hbF9pbnQzMigwKTsKKworICAvLyBDb21wYXJlCisgIEVYUEVDVF9GQUxTRSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkVxdWFscyhtc2cxLCBtc2cyKSk7CisgIEVYUEVDVF9UUlVFKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RXF1aXZhbGVudChtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgQmFzaWNJbmVxdWl2YWxlbmN5VGVzdCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cyOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cyKTsKKworICBtc2cxLnNldF9vcHRpb25hbF9pbnQzMigtMSk7CisKKyAgLy8gQ29tcGFyZQorICBFWFBFQ1RfRkFMU0UodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFcXVpdmFsZW50KG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBCYXNpY0VxdWl2YWxlbmN5Tm9uU2V0VGVzdCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cyOworCisgIC8vIENvbXBhcmUKKyAgRVhQRUNUX1RSVUUodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFcXVpdmFsZW50KG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBCYXNpY0luZXF1aXZhbGVuY3lOb25TZXRUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgbXNnMS5zZXRfb3B0aW9uYWxfaW50MzIoLTEpOworCisgIC8vIENvbXBhcmUKKyAgRVhQRUNUX0ZBTFNFKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RXF1aXZhbGVudChtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgQmFzaWNQYXJ0aWFsRXF1aXZhbGVuY3lUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzIpOworCisgIC8vIENvbXBhcmUKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5zZXRfbWVzc2FnZV9maWVsZF9jb21wYXJpc29uKAorICAgICAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFUVVJVkFMRU5UKTsKKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6UEFSVElBTCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFBhcnRpYWxFcXVpdmFsZW5jeU5vdEVxdWFsVGVzdCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cyOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cyKTsKKworICBtc2cxLnNldF9vcHRpb25hbF9pbnQzMigwKTsKKyAgbXNnMi5jbGVhcl9vcHRpb25hbF9pbnQzMigpOworCisgIC8vIENvbXBhcmUKKyAgRVhQRUNUX0ZBTFNFKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RXF1YWxzKG1zZzEsIG1zZzIpKTsKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5zZXRfbWVzc2FnZV9maWVsZF9jb21wYXJpc29uKAorICAgICAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFUVVJVkFMRU5UKTsKKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6UEFSVElBTCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFBhcnRpYWxFcXVpdmFsZW5jeVRlc3RFeHRyYUZpZWxkKSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzIpOworCisgIG1zZzEuY2xlYXJfb3B0aW9uYWxfaW50MzIoKTsKKworICAvLyBDb21wYXJlCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuc2V0X21lc3NhZ2VfZmllbGRfY29tcGFyaXNvbigKKyAgICAgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RVFVSVZBTEVOVCk7CisgIGRpZmZlcmVuY2VyLnNldF9zY29wZSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OlBBUlRJQUwpOworICBFWFBFQ1RfVFJVRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBQYXJ0aWFsRXF1aXZhbGVuY3lUZXN0U2tpcFJlcXVpcmVkRmllbGQpIHsKKyAgLy8gQ3JlYXRlIHRoZSB0ZXN0aW5nIHByb3RvcworICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1zZzE7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbXNnMjsKKworICBtc2cxLnNldF9hKDQwMSk7CisgIG1zZzIuc2V0X2EoNDAxKTsKKyAgbXNnMi5zZXRfYig0MDIpOworCisgIC8vIENvbXBhcmUKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5zZXRfbWVzc2FnZV9maWVsZF9jb21wYXJpc29uKAorICAgICAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFUVVJVkFMRU5UKTsKKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6UEFSVElBTCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIEJhc2ljUGFydGlhbEluZXF1aXZhbGVuY3lUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzIpOworCisgIG1zZzEuc2V0X29wdGlvbmFsX2ludDMyKC0xKTsKKworICAvLyBDb21wYXJlCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuc2V0X21lc3NhZ2VfZmllbGRfY29tcGFyaXNvbigKKyAgICAgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RVFVSVZBTEVOVCk7CisgIGRpZmZlcmVuY2VyLnNldF9zY29wZSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OlBBUlRJQUwpOworICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgQmFzaWNQYXJ0aWFsRXF1aXZhbGVuY3lOb25TZXRUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgLy8gQ29tcGFyZQorICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLnNldF9tZXNzYWdlX2ZpZWxkX2NvbXBhcmlzb24oCisgICAgICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkVRVUlWQUxFTlQpOworICBkaWZmZXJlbmNlci5zZXRfc2NvcGUodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpQQVJUSUFMKTsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgQmFzaWNQYXJ0aWFsSW5lcXVpdmFsZW5jeU5vblNldFRlc3QpIHsKKyAgLy8gQ3JlYXRlIHRoZSB0ZXN0aW5nIHByb3RvcworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMjsKKworICBtc2cxLnNldF9vcHRpb25hbF9pbnQzMigtMSk7CisKKyAgLy8gQ29tcGFyZQorICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLnNldF9tZXNzYWdlX2ZpZWxkX2NvbXBhcmlzb24oCisgICAgICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkVRVUlWQUxFTlQpOworICBkaWZmZXJlbmNlci5zZXRfc2NvcGUodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpQQVJUSUFMKTsKKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIEFwcHJveGltYXRlRXF1YWxpdHlUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzIpOworCisgIC8vIENvbXBhcmUKKyAgRVhQRUNUX1RSVUUodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpBcHByb3hpbWF0ZWx5RXF1YWxzKG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBBcHByb3hpbWF0ZU1vZGlmaWVkRXF1YWxpdHlUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzIpOworCisgIGNvbnN0IGZsb2F0IHYxID0gMi4zMDAwMDVmOworICBjb25zdCBmbG9hdCB2MiA9IDIuMzAwMDA2ZjsKKyAgbXNnMS5zZXRfb3B0aW9uYWxfZmxvYXQodjEpOworICBtc2cyLnNldF9vcHRpb25hbF9mbG9hdCh2Mik7CisKKyAgLy8gQ29tcGFyZQorICBBU1NFUlRfTkUodjEsIHYyKSA8PCAiU2hvdWxkIG5vdCBiZSB0aGUgc2FtZTogIiA8PCB2MSA8PCAiLCAiIDw8IHYyOworICBBU1NFUlRfRkxPQVRfRVEodjEsIHYyKSA8PCAiU2hvdWxkIGJlIGFwcHJveC4gZXF1YWw6ICIgPDwgdjEgPDwgIiwgIiA8PCB2MjsKKyAgRVhQRUNUX0ZBTFNFKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RXF1YWxzKG1zZzEsIG1zZzIpKTsKKyAgRVhQRUNUX1RSVUUodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpBcHByb3hpbWF0ZWx5RXF1YWxzKG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBBcHByb3hpbWF0ZUVxdWl2YWxlbmN5VGVzdCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cyOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cyKTsKKworICAvLyBDb21wYXJlCisgIEVYUEVDVF9UUlVFKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6QXBwcm94aW1hdGVseUVxdWl2YWxlbnQobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIEFwcHJveGltYXRlTW9kaWZpZWRFcXVpdmFsZW5jeVRlc3QpIHsKKyAgLy8gQ3JlYXRlIHRoZSB0ZXN0aW5nIHByb3RvcworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cxKTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMik7CisKKyAgLy8gTW9kaWZ5IHRoZSBhcHByb3hpbWF0ZW5lc3MgcmVxdWlyZW1lbnQKKyAgY29uc3QgZmxvYXQgdjEgPSAyLjMwMDAwNWY7CisgIGNvbnN0IGZsb2F0IHYyID0gMi4zMDAwMDZmOworICBtc2cxLnNldF9vcHRpb25hbF9mbG9hdCh2MSk7CisgIG1zZzIuc2V0X29wdGlvbmFsX2Zsb2F0KHYyKTsKKworICAvLyBDb21wYXJlCisgIEFTU0VSVF9ORSh2MSwgdjIpIDw8ICJTaG91bGQgbm90IGJlIHRoZSBzYW1lOiAiIDw8IHYxIDw8ICIsICIgPDwgdjI7CisgIEFTU0VSVF9GTE9BVF9FUSh2MSwgdjIpIDw8ICJTaG91bGQgYmUgYXBwcm94LiBlcXVhbDogIiA8PCB2MSA8PCAiLCAiIDw8IHYyOworICBFWFBFQ1RfRkFMU0UodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFcXVhbHMobXNnMSwgbXNnMikpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkFwcHJveGltYXRlbHlFcXVpdmFsZW50KG1zZzEsIG1zZzIpKTsKKworICAvLyBNb2RpZnkgdGhlIGVxdWl2YWxlbmN5IHJlcXVpcmVtZW50IHRvbworICBtc2cxLmNsZWFyX29wdGlvbmFsX2ludDMyKCk7CisgIG1zZzIuc2V0X29wdGlvbmFsX2ludDMyKDApOworCisgIC8vIENvbXBhcmUuIE5vdyBzaG91bGQgb25seSBwYXNzIG9uIEFwcHJveGltYXRlbHlFcXVpdmFsZW50CisgIEVYUEVDVF9GQUxTRSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkVxdWFscyhtc2cxLCBtc2cyKSk7CisgIEVYUEVDVF9GQUxTRSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkVxdWl2YWxlbnQobXNnMSwgbXNnMikpOworICBFWFBFQ1RfRkFMU0UodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpBcHByb3hpbWF0ZWx5RXF1YWxzKG1zZzEsIG1zZzIpKTsKKyAgRVhQRUNUX1RSVUUodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpBcHByb3hpbWF0ZWx5RXF1aXZhbGVudChtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgQXBwcm94aW1hdGVJbmVxdWl2YWxlbmN5VGVzdCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cyOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cyKTsKKworICAvLyBTaG91bGQgZmFpbCBvbiBlcXVpdmFsZW5jeQorICBtc2cxLnNldF9vcHRpb25hbF9pbnQzMigtMSk7CisgIEVYUEVDVF9GQUxTRSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkFwcHJveGltYXRlbHlFcXVpdmFsZW50KG1zZzEsIG1zZzIpKTsKKworICAvLyBNYWtlIHRoZXNlIGZpZWxkcyB0aGUgc2FtZSBhZ2Fpbi4KKyAgbXNnMS5zZXRfb3B0aW9uYWxfaW50MzIoMCk7CisgIG1zZzIuc2V0X29wdGlvbmFsX2ludDMyKDApOworICBFWFBFQ1RfVFJVRSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkFwcHJveGltYXRlbHlFcXVpdmFsZW50KG1zZzEsIG1zZzIpKTsKKworICAvLyBTaG91bGQgZmFpbCBvbiBhcHByb3hpbWF0ZSBlcXVhbGl0eSBjaGVjaworICBjb25zdCBmbG9hdCB2MSA9IDIuM2Y7CisgIGNvbnN0IGZsb2F0IHYyID0gOS4zZjsKKyAgbXNnMS5zZXRfb3B0aW9uYWxfZmxvYXQodjEpOworICBtc2cyLnNldF9vcHRpb25hbF9mbG9hdCh2Mik7CisgIEVYUEVDVF9GQUxTRSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkFwcHJveGltYXRlbHlFcXVpdmFsZW50KG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBXaXRoaW5GcmFjdGlvbk9yTWFyZ2luRmxvYXRUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzIpOworCisgIC8vIFNob3VsZCBmYWlsIG9uIGFwcHJveGltYXRlIGVxdWFsaXR5IGNoZWNrCisgIGNvbnN0IGZsb2F0IHYxID0gMTAwLjBmOworICBjb25zdCBmbG9hdCB2MiA9IDEwOS45ZjsKKyAgbXNnMS5zZXRfb3B0aW9uYWxfZmxvYXQodjEpOworICBtc2cyLnNldF9vcHRpb25hbF9mbG9hdCh2Mik7CisKKyAgLy8gQ29tcGFyZQorICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZCA9CisgICAgICBtc2cxLkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9mbG9hdCIpOworCisgIC8vIFNldCBmbG9hdCBjb21wYXJpc29uIHRvIGV4YWN0LCBtYXJnaW4gYW5kIGZyYWN0aW9uIHZhbHVlIHNob3VsZCBub3QgbWF0dGVyLgorICBkaWZmZXJlbmNlci5zZXRfZmxvYXRfY29tcGFyaXNvbih1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkVYQUNUKTsKKyAgLy8gU2V0IG1hcmdpbiBmb3IgZmxvYXQgY29tcGFyaXNvbi4KKyAgZGlmZmVyZW5jZXIuU2V0RnJhY3Rpb25BbmRNYXJnaW4oZmQsIDAuMCwgMTAuMCk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKworICAvLyBNYXJnaW4gYW5kIGZyYWN0aW9uIGZsb2F0IGNvbXBhcmlzb24gaXMgYWN0aXZhdGVkIHdoZW4gZmxvYXQgY29tcGFyaXNvbiBpcworICAvLyBzZXQgdG8gYXBwcm94aW1hdGUuCisgIGRpZmZlcmVuY2VyLnNldF9mbG9hdF9jb21wYXJpc29uKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6QVBQUk9YSU1BVEUpOworICBFWFBFQ1RfVFJVRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKworICAvLyBUZXN0IG91dCBmbG9hdCBjb21wYXJpc29uIHdpdGggZnJhY3Rpb24uCisgIGRpZmZlcmVuY2VyLlNldEZyYWN0aW9uQW5kTWFyZ2luKGZkLCAwLjIsIDAuMCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworCisgIC8vIFNob3VsZCBmYWlsIHNpbmNlIHRoZSBmcmFjdGlvbiBpcyBzbWFsbGVyIHRoYW4gZXJyb3IuCisgIGRpZmZlcmVuY2VyLlNldEZyYWN0aW9uQW5kTWFyZ2luKGZkLCAwLjAxLCAwLjApOworICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisKKyAgLy8gU2hvdWxkIHBhc3MgaWYgZWl0aGVyIGZyYWN0aW9uIG9yIG1hcmdpbiBhcmUgc2F0aXNmaWVkLgorICBkaWZmZXJlbmNlci5TZXRGcmFjdGlvbkFuZE1hcmdpbihmZCwgMC4wMSwgMTAuMCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBtYXJnaW4gYW5kIGZyYWN0aW9uIG9ubHkgYWZmZWN0cyB0aGUgZmllbGQgdGhhdCBpdCB3YXMKKyAgLy8gc2V0IGZvci4KKyAgbXNnMS5zZXRfZGVmYXVsdF9mbG9hdCh2MSk7CisgIG1zZzIuc2V0X2RlZmF1bHRfZmxvYXQodjIpOworICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisgIG1zZzEuc2V0X2RlZmF1bHRfZmxvYXQodjEpOworICBtc2cyLnNldF9kZWZhdWx0X2Zsb2F0KHYxKTsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgV2l0aGluRnJhY3Rpb25Pck1hcmdpbkRvdWJsZVRlc3QpIHsKKyAgLy8gQ3JlYXRlIHRoZSB0ZXN0aW5nIHByb3RvcworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cxKTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMik7CisKKyAgLy8gU2hvdWxkIGZhaWwgb24gYXBwcm94aW1hdGUgZXF1YWxpdHkgY2hlY2sKKyAgY29uc3QgZG91YmxlIHYxID0gMTAwLjA7CisgIGNvbnN0IGRvdWJsZSB2MiA9IDEwOS45OworICBtc2cxLnNldF9vcHRpb25hbF9kb3VibGUodjEpOworICBtc2cyLnNldF9vcHRpb25hbF9kb3VibGUodjIpOworCisgIC8vIENvbXBhcmUKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisKKyAgLy8gU2V0IGNvbXBhcmlzb24gdG8gZXhhY3QsIG1hcmdpbiBhbmQgZnJhY3Rpb24gdmFsdWUgc2hvdWxkIG5vdCBtYXR0ZXIuCisgIGRpZmZlcmVuY2VyLnNldF9mbG9hdF9jb21wYXJpc29uKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RVhBQ1QpOworICAvLyBTZXQgbWFyZ2luIGZvciBmbG9hdCBjb21wYXJpc29uLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkID0KKyAgICAgIG1zZzEuR2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2RvdWJsZSIpOworICBkaWZmZXJlbmNlci5TZXRGcmFjdGlvbkFuZE1hcmdpbihmZCwgMC4wLCAxMC4wKTsKKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworCisgIC8vIE1hcmdpbiBhbmQgZnJhY3Rpb24gY29tcGFyaXNvbiBpcyBhY3RpdmF0ZWQgd2hlbiBmbG9hdCBjb21wYXJpc29uIGlzCisgIC8vIHNldCB0byBhcHByb3hpbWF0ZS4KKyAgZGlmZmVyZW5jZXIuc2V0X2Zsb2F0X2NvbXBhcmlzb24odXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpBUFBST1hJTUFURSk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworCisgIC8vIFRlc3Qgb3V0IGNvbXBhcmlzb24gd2l0aCBmcmFjdGlvbi4KKyAgZGlmZmVyZW5jZXIuU2V0RnJhY3Rpb25BbmRNYXJnaW4oZmQsIDAuMiwgMC4wKTsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisKKyAgLy8gU2hvdWxkIGZhaWwgc2luY2UgdGhlIGZyYWN0aW9uIGlzIHNtYWxsZXIgdGhhbiBlcnJvci4KKyAgZGlmZmVyZW5jZXIuU2V0RnJhY3Rpb25BbmRNYXJnaW4oZmQsIDAuMDEsIDAuMCk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKworICAvLyBTaG91bGQgcGFzcyBpZiBlaXRoZXIgZnJhY3Rpb24gb3IgbWFyZ2luIGFyZSBzYXRpc2ZpZWQuCisgIGRpZmZlcmVuY2VyLlNldEZyYWN0aW9uQW5kTWFyZ2luKGZkLCAwLjAxLCAxMC4wKTsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisKKyAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG1hcmdpbiBhbmQgZnJhY3Rpb24gb25seSBhZmZlY3RzIHRoZSBmaWVsZCB0aGF0IGl0IHdhcworICAvLyBzZXQgZm9yLgorICBtc2cxLnNldF9kZWZhdWx0X2RvdWJsZSh2MSk7CisgIG1zZzIuc2V0X2RlZmF1bHRfZG91YmxlKHYyKTsKKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworICBtc2cxLnNldF9kZWZhdWx0X2RvdWJsZSh2MSk7CisgIG1zZzIuc2V0X2RlZmF1bHRfZG91YmxlKHYxKTsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgV2l0aGluRGVmYXVsdEZyYWN0aW9uT3JNYXJnaW5Eb3VibGVUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzIpOworCisgIC8vIFNob3VsZCBmYWlsIG9uIGFwcHJveGltYXRlIGVxdWFsaXR5IGNoZWNrCisgIGNvbnN0IGRvdWJsZSB2MSA9IDEwMC4wOworICBjb25zdCBkb3VibGUgdjIgPSAxMDkuOTsKKyAgbXNnMS5zZXRfb3B0aW9uYWxfZG91YmxlKHYxKTsKKyAgbXNnMi5zZXRfb3B0aW9uYWxfZG91YmxlKHYyKTsKKworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisKKyAgLy8gQ29tcGFyZQorICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisKKyAgLy8gU2V0IHVwIGEgY3VzdG9tIGZpZWxkIGNvbXBhcmF0b3IsIHdpdGggYSBkZWZhdWx0IGZyYWN0aW9uIGFuZCBtYXJnaW4gZm9yCisgIC8vIGZsb2F0IGFuZCBkb3VibGUgY29tcGFyaXNvbi4KKyAgdXRpbDo6RGVmYXVsdEZpZWxkQ29tcGFyYXRvciBmaWVsZF9jb21wYXJhdG9yOworICBmaWVsZF9jb21wYXJhdG9yLlNldERlZmF1bHRGcmFjdGlvbkFuZE1hcmdpbigwLjAsIDEwLjApOworICBkaWZmZXJlbmNlci5zZXRfZmllbGRfY29tcGFyYXRvcigmZmllbGRfY29tcGFyYXRvcik7CisKKyAgLy8gU2V0IGNvbXBhcmlzb24gdG8gZXhhY3QsIG1hcmdpbiBhbmQgZnJhY3Rpb24gdmFsdWUgc2hvdWxkIG5vdCBtYXR0ZXIuCisgIGZpZWxkX2NvbXBhcmF0b3Iuc2V0X2Zsb2F0X2NvbXBhcmlzb24odXRpbDo6RGVmYXVsdEZpZWxkQ29tcGFyYXRvcjo6RVhBQ1QpOworICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisKKyAgLy8gTWFyZ2luIGFuZCBmcmFjdGlvbiBjb21wYXJpc29uIGlzIGFjdGl2YXRlZCB3aGVuIGZsb2F0IGNvbXBhcmlzb24gaXMKKyAgLy8gc2V0IHRvIGFwcHJveGltYXRlLgorICBmaWVsZF9jb21wYXJhdG9yLnNldF9mbG9hdF9jb21wYXJpc29uKAorICAgICAgdXRpbDo6RGVmYXVsdEZpZWxkQ29tcGFyYXRvcjo6QVBQUk9YSU1BVEUpOworICBFWFBFQ1RfVFJVRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKworICAvLyBUZXN0IG91dCBjb21wYXJpc29uIHdpdGggZnJhY3Rpb24uCisgIGZpZWxkX2NvbXBhcmF0b3IuU2V0RGVmYXVsdEZyYWN0aW9uQW5kTWFyZ2luKDAuMiwgMC4wKTsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisKKyAgLy8gU2hvdWxkIGZhaWwgc2luY2UgdGhlIGZyYWN0aW9uIGlzIHNtYWxsZXIgdGhhbiBlcnJvci4KKyAgZmllbGRfY29tcGFyYXRvci5TZXREZWZhdWx0RnJhY3Rpb25BbmRNYXJnaW4oMC4wMSwgMC4wKTsKKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworCisgIC8vIFNob3VsZCBwYXNzIGlmIGVpdGhlciBmcmFjdGlvbiBvciBtYXJnaW4gYXJlIHNhdGlzZmllZC4KKyAgZmllbGRfY29tcGFyYXRvci5TZXREZWZhdWx0RnJhY3Rpb25BbmRNYXJnaW4oMC4wMSwgMTAuMCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZWZhdWx0IG1hcmdpbiBhbmQgZnJhY3Rpb24gYWZmZWN0cyBhbGwgZmllbGRzCisgIG1zZzEuc2V0X2RlZmF1bHRfZG91YmxlKHYxKTsKKyAgbXNnMi5zZXRfZGVmYXVsdF9kb3VibGUodjIpOworICBFWFBFQ1RfVFJVRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBCYXNpY0ZpZWxkT3JkZXJpbmdzVGVzdCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHVuaXR0ZXN0OjpUZXN0RmllbGRPcmRlcmluZ3MgbXNnMTsKKyAgdW5pdHRlc3Q6OlRlc3RGaWVsZE9yZGVyaW5ncyBtc2cyOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKCZtc2cxKTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMoJm1zZzIpOworCisgIC8vIENvbXBhcmUKKyAgRVhQRUNUX1RSVUUodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFcXVhbHMobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIEJhc2ljRmllbGRPcmRlcmluZ0luZXF1YWxpdHlUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RGaWVsZE9yZGVyaW5ncyBtc2cxOworICB1bml0dGVzdDo6VGVzdEZpZWxkT3JkZXJpbmdzIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMoJm1zZzEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzQW5kRXh0ZW5zaW9ucygmbXNnMik7CisKKyAgbXNnMS5zZXRfbXlfZmxvYXQoMTUuMDApOworICBtc2cyLnNldF9teV9mbG9hdCgxNi4wMCk7CisKKyAgLy8gQ29tcGFyZQorICBFWFBFQ1RfRkFMU0UodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFcXVhbHMobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIEJhc2ljRXh0ZW5zaW9uVGVzdCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbXNnMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtc2cyKTsKKworICAvLyBDb21wYXJlCisgIEVYUEVDVF9UUlVFKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RXF1YWxzKG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBCYXNpY0V4dGVuc2lvbkluZXF1YWxpdHlUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1zZzE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtc2cyOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtc2cxKTsKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1zZzIpOworCisgIG1zZzEuU2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24sIDEwMSk7CisgIG1zZzIuU2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24sIDEwMik7CisKKyAgLy8gQ29tcGFyZQorICBFWFBFQ1RfRkFMU0UodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFcXVhbHMobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIE9uZW9mVGVzdCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1zZzE7CisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldE9uZW9mMSgmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRPbmVvZjEoJm1zZzIpOworCisgIC8vIENvbXBhcmUKKyAgRVhQRUNUX1RSVUUodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFcXVhbHMobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIE9uZW9mSW5lcXVhbGl0eVRlc3QpIHsKKyAgLy8gQ3JlYXRlIHRoZSB0ZXN0aW5nIHByb3RvcworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtc2cxOworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtc2cyOworCisgIFRlc3RVdGlsOjpTZXRPbmVvZjEoJm1zZzEpOworICBUZXN0VXRpbDo6U2V0T25lb2YyKCZtc2cyKTsKKworICAvLyBDb21wYXJlCisgIEVYUEVDVF9GQUxTRSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkVxdWFscyhtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgVW5rbm93bkZpZWxkUGFydGlhbEVxdWFsVGVzdCkgeworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBlbXB0eTE7CisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIGVtcHR5MjsKKworICBVbmtub3duRmllbGRTZXQqIHVua25vd24xID0gZW1wdHkxLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKKyAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duMiA9IGVtcHR5Mi5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CisKKyAgdW5rbm93bjEtPkFkZFZhcmludCgyNDMsIDEyMik7CisgIHVua25vd24xLT5BZGRMZW5ndGhEZWxpbWl0ZWQoMjQ1LCAiYWJjIik7CisgIHVua25vd24xLT5BZGRHcm91cCgyNDYpLT5BZGRGaXhlZDMyKDI0OCwgMSk7CisgIHVua25vd24xLT5tdXRhYmxlX2ZpZWxkKDIpLT5tdXRhYmxlX2dyb3VwKCktPkFkZEZpeGVkMzIoMjQ4LCAyKTsKKworICB1bmtub3duMi0+QWRkVmFyaW50KDI0MywgMTIyKTsKKyAgdW5rbm93bjItPkFkZExlbmd0aERlbGltaXRlZCgyNDUsICJhYmMiKTsKKyAgdW5rbm93bjItPkFkZEdyb3VwKDI0NiktPkFkZEZpeGVkMzIoMjQ4LCAxKTsKKyAgdW5rbm93bjItPm11dGFibGVfZmllbGQoMiktPm11dGFibGVfZ3JvdXAoKS0+QWRkRml4ZWQzMigyNDgsIDIpOworCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6UEFSVElBTCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUoZW1wdHkxLCBlbXB0eTIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBTcGVjaWZpZWRGaWVsZHNFcXVhbGl0eUFsbFRlc3QpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzIpOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczE7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczI7CisgIG1zZzEuR2V0UmVmbGVjdGlvbigpLT5MaXN0RmllbGRzKG1zZzEsICZmaWVsZHMxKTsKKyAgbXNnMi5HZXRSZWZsZWN0aW9uKCktPkxpc3RGaWVsZHMobXNnMiwgJmZpZWxkczIpOworCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZVdpdGhGaWVsZHMobXNnMSwgbXNnMiwgZmllbGRzMSwgZmllbGRzMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFNwZWNpZmllZEZpZWxkc0luZXF1YWxpdHlBbGxUZXN0KSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cyOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzEpOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczE7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczI7CisgIG1zZzEuR2V0UmVmbGVjdGlvbigpLT5MaXN0RmllbGRzKG1zZzEsICZmaWVsZHMxKTsKKyAgbXNnMi5HZXRSZWZsZWN0aW9uKCktPkxpc3RGaWVsZHMobXNnMiwgJmZpZWxkczIpOworCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLkNvbXBhcmVXaXRoRmllbGRzKG1zZzEsIG1zZzIsIGZpZWxkczEsIGZpZWxkczIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBTcGVjaWZpZWRGaWVsZHNFbXB0eUxpc3RBbHdheXNTdWNjZWVkcykgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cxKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBlbXB0eV9maWVsZHM7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIGRpZmZlcmVuY2VyLkNvbXBhcmVXaXRoRmllbGRzKG1zZzEsIG1zZzIsIGVtcHR5X2ZpZWxkcywgZW1wdHlfZmllbGRzKSk7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMik7CisgIEVYUEVDVF9UUlVFKAorICAgICAgZGlmZmVyZW5jZXIuQ29tcGFyZVdpdGhGaWVsZHMobXNnMSwgbXNnMiwgZW1wdHlfZmllbGRzLCBlbXB0eV9maWVsZHMpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBTcGVjaWZpZWRGaWVsZHNDb21wYXJlV2l0aFNlbGYpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cxKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIG1zZzEuR2V0UmVmbGVjdGlvbigpLT5MaXN0RmllbGRzKG1zZzEsICZmaWVsZHMpOworCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZVdpdGhGaWVsZHMobXNnMSwgbXNnMSwgZmllbGRzLCBmaWVsZHMpKTsKKworICB7CisgICAgLy8gQ29tcGFyZSB3aXRoIGEgc3Vic2V0IG9mIGZpZWxkcy4KKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBjb21wYXJlX2ZpZWxkczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgICAgaWYgKGkgJSAyID09IDApIHsKKyAgICAgICAgY29tcGFyZV9maWVsZHMucHVzaF9iYWNrKGZpZWxkc1tpXSk7CisgICAgICB9CisgICAgfQorICAgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmVXaXRoRmllbGRzKG1zZzEsIG1zZzEsIGNvbXBhcmVfZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVfZmllbGRzKSk7CisgIH0KKyAgeworICAgIC8vIFNwZWNpZnkgYSBkaWZmZXJlbnQgc2V0IG9mIGZpZWxkcyB0byBjb21wYXJlLCBldmVuIHRob3VnaCB3ZSdyZSB1c2luZyB0aGUKKyAgICAvLyBzYW1lIG1lc3NhZ2UuIFRoaXMgc2hvdWxkIGZhaWwsIHNpbmNlIHdlIGFyZSBleHBsaWNpdGx5IHNheWluZyB0aGF0IHRoZQorICAgIC8vIHNldCBvZiBmaWVsZHMgYXJlIGRpZmZlcmVudC4KKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBjb21wYXJlX2ZpZWxkczE7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gY29tcGFyZV9maWVsZHMyOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgICBpZiAoaSAlIDIgPT0gMCkgeworICAgICAgICBjb21wYXJlX2ZpZWxkczEucHVzaF9iYWNrKGZpZWxkc1tpXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb21wYXJlX2ZpZWxkczIucHVzaF9iYWNrKGZpZWxkc1tpXSk7CisgICAgICB9CisgICAgfQorICAgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlV2l0aEZpZWxkcyhtc2cxLCBtc2cxLCBjb21wYXJlX2ZpZWxkczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVfZmllbGRzMikpOworICB9Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgU3BlY2lmaWVkRmllbGRzRXF1YWxpdHlBbGxTaHVmZmxlZFRlc3QpIHsKKyAgLy8gVGhpcyBpcyBhIHB1YmxpYyBmdW5jdGlvbiwgc28gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBhc3N1bXB0aW9ucyBhYm91dCB0aGUKKyAgLy8gbGlzdCBvZiBmaWVsZHMuIFJhbmRvbWx5IHNodWZmbGUgdGhlbSB0byBtYWtlIHN1cmUgdGhhdCB0aGV5IGFyZSBwcm9wZXJseQorICAvLyBvcmRlcmVkIGZvciBjb21wYXJpc29uLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cxKTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMik7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzMTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzMjsKKyAgbXNnMS5HZXRSZWZsZWN0aW9uKCktPkxpc3RGaWVsZHMobXNnMSwgJmZpZWxkczEpOworICBtc2cyLkdldFJlZmxlY3Rpb24oKS0+TGlzdEZpZWxkcyhtc2cyLCAmZmllbGRzMik7CisKKyAgc3RkOjpkZWZhdWx0X3JhbmRvbV9lbmdpbmUgcm5nOworICBzdGQ6OnNodWZmbGUoZmllbGRzMS5iZWdpbigpLCBmaWVsZHMxLmVuZCgpLCBybmcpOworICBzdGQ6OnNodWZmbGUoZmllbGRzMi5iZWdpbigpLCBmaWVsZHMyLmVuZCgpLCBybmcpOworCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZVdpdGhGaWVsZHMobXNnMSwgbXNnMiwgZmllbGRzMSwgZmllbGRzMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFNwZWNpZmllZEZpZWxkc1N1YnNldEVxdWFsaXR5VGVzdCkgeworICAvLyBTcGVjaWZ5IGEgc2V0IG9mIGZpZWxkcyB0byBjb21wYXJlLiBBbGwgdGhlIGZpZWxkcyBhcmUgZXF1YWwuCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cyOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cxKTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMik7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzMTsKKyAgbXNnMS5HZXRSZWZsZWN0aW9uKCktPkxpc3RGaWVsZHMobXNnMSwgJmZpZWxkczEpOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGNvbXBhcmVfZmllbGRzOworICAvLyBPbmx5IGNvbXBhcmUgdGhlIGZpZWxkIGRlc2NyaXB0b3JzIHdpdGggZXZlbiBpbmRpY2VzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkczEuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoaSAlIDIgPT0gMCkgeworICAgICAgY29tcGFyZV9maWVsZHMucHVzaF9iYWNrKGZpZWxkczFbaV0pOworICAgIH0KKyAgfQorCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZVdpdGhGaWVsZHMobXNnMSwgbXNnMiwgY29tcGFyZV9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVfZmllbGRzKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwKKyAgICAgU3BlY2lmaWVkRmllbGRzU3Vic2V0SWdub3Jlc090aGVyRmllbGREaWZmZXJlbmNlc1Rlc3QpIHsKKyAgLy8gU3BlY2lmeSBhIHNldCBvZiBmaWVsZHMgdG8gY29tcGFyZSwgYnV0IGNsZWFyIGFsbCB0aGUgb3RoZXIgZmllbGRzIGluIG9uZQorICAvLyBvZiB0aGUgbWVzc2FnZXMuIFRoaXMgc2hvdWxkIGZhaWwgYSByZWd1bGFyIGNvbXBhcmUsIGJ1dCBDb21wYXJlV2l0aEZpZWxkcworICAvLyBzaG91bGQgc3VjY2VlZC4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cyKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHMxOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbXNnMS5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobXNnMSwgJmZpZWxkczEpOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGNvbXBhcmVfZmllbGRzOworICAvLyBPbmx5IGNvbXBhcmUgdGhlIGZpZWxkIGRlc2NyaXB0b3JzIHdpdGggZXZlbiBpbmRpY2VzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkczEuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoaSAlIDIgPT0gMCkgeworICAgICAgY29tcGFyZV9maWVsZHMucHVzaF9iYWNrKGZpZWxkczFbaV0pOworICAgIH0gZWxzZSB7CisgICAgICByZWZsZWN0aW9uLT5DbGVhckZpZWxkKCZtc2cyLCBmaWVsZHMxW2ldKTsKKyAgICB9CisgIH0KKworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZVdpdGhGaWVsZHMobXNnMSwgbXNnMiwgY29tcGFyZV9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVfZmllbGRzKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgU3BlY2lmaWVkRmllbGRzRGV0ZWN0c0RpZmZlcmVuY2VzVGVzdCkgeworICAvLyBDaGFuZ2UgYWxsIG9mIHRoZSByZXBlYXRlZCBmaWVsZHMgaW4gb25lIG9mIHRoZSBtZXNzYWdlcywgYW5kIHVzZSBvbmx5CisgIC8vIHRob3NlIGZpZWxkcyBmb3IgY29tcGFyaXNvbi4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1zZzEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cyKTsKKyAgVGVzdFV0aWw6Ok1vZGlmeVJlcGVhdGVkRmllbGRzKCZtc2cyKTsKKworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHMxOworICBtc2cxLkdldFJlZmxlY3Rpb24oKS0+TGlzdEZpZWxkcyhtc2cxLCAmZmllbGRzMSk7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gY29tcGFyZV9maWVsZHM7CisgIC8vIE9ubHkgY29tcGFyZSB0aGUgcmVwZWF0ZWQgZmllbGQgZGVzY3JpcHRvcnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzMS5zaXplKCk7ICsraSkgeworICAgIGlmIChmaWVsZHMxW2ldLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBjb21wYXJlX2ZpZWxkcy5wdXNoX2JhY2soZmllbGRzMVtpXSk7CisgICAgfQorICB9CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZVdpdGhGaWVsZHMobXNnMSwgbXNnMiwgY29tcGFyZV9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlX2ZpZWxkcykpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFNwZWNpZmllZEZpZWxkc0VxdWl2YWxlbmNlQWxsVGVzdCkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbXNnMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtc2cxKTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbXNnMik7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzMTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzMjsKKyAgbXNnMS5HZXRSZWZsZWN0aW9uKCktPkxpc3RGaWVsZHMobXNnMSwgJmZpZWxkczEpOworICBtc2cyLkdldFJlZmxlY3Rpb24oKS0+TGlzdEZpZWxkcyhtc2cyLCAmZmllbGRzMik7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5zZXRfbWVzc2FnZV9maWVsZF9jb21wYXJpc29uKAorICAgICAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFUVVJVkFMRU5UKTsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZVdpdGhGaWVsZHMobXNnMSwgbXNnMiwgZmllbGRzMSwgZmllbGRzMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsCisgICAgIFNwZWNpZmllZEZpZWxkc0VxdWl2YWxlbmNlSWdub3Jlc090aGVyRmllbGREaWZmZXJlbmNlc1Rlc3QpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtc2cxOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1zZzI7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MgPSBtc2cxLkdldERlc2NyaXB0b3IoKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG9wdGlvbmFsX2ludDMyX2Rlc2MgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG9wdGlvbmFsX2ludDY0X2Rlc2MgPQorICAgICAgZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQ2NCIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlZmF1bHRfaW50NjRfZGVzYyA9CisgICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoImRlZmF1bHRfaW50NjQiKTsKKyAgQVNTRVJUX1RSVUUob3B0aW9uYWxfaW50MzJfZGVzYyAhPSBudWxscHRyKTsKKyAgQVNTRVJUX1RSVUUob3B0aW9uYWxfaW50NjRfZGVzYyAhPSBudWxscHRyKTsKKyAgQVNTRVJUX1RSVUUoZGVmYXVsdF9pbnQ2NF9kZXNjICE9IG51bGxwdHIpOworICBtc2cxLnNldF9vcHRpb25hbF9pbnQzMigwKTsKKyAgbXNnMi5zZXRfb3B0aW9uYWxfaW50NjQoMCk7CisgIG1zZzEuc2V0X2RlZmF1bHRfaW50NjQoZGVmYXVsdF9pbnQ2NF9kZXNjLT5kZWZhdWx0X3ZhbHVlX2ludDY0KCkpOworCisgIC8vIFNldCBhIGZpZWxkIHRvIGEgbm9uLWRlZmF1bHQgdmFsdWUgc28gd2Uga25vdyB0aGF0IGZpZWxkIHNlbGVjdGlvbiBpcworICAvLyBhY3R1YWxseSBkb2luZyBzb21ldGhpbmcuCisgIG1zZzIuc2V0X29wdGlvbmFsX3VpbnQ2NCgyMyk7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzMTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzMjsKKyAgZmllbGRzMS5wdXNoX2JhY2sob3B0aW9uYWxfaW50MzJfZGVzYyk7CisgIGZpZWxkczEucHVzaF9iYWNrKGRlZmF1bHRfaW50NjRfZGVzYyk7CisKKyAgZmllbGRzMi5wdXNoX2JhY2sob3B0aW9uYWxfaW50NjRfZGVzYyk7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZVdpdGhGaWVsZHMobXNnMSwgbXNnMiwgZmllbGRzMSwgZmllbGRzMikpOworICBkaWZmZXJlbmNlci5zZXRfbWVzc2FnZV9maWVsZF9jb21wYXJpc29uKAorICAgICAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFUVVJVkFMRU5UKTsKKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworICBFWFBFQ1RfVFJVRShkaWZmZXJlbmNlci5Db21wYXJlV2l0aEZpZWxkcyhtc2cxLCBtc2cyLCBmaWVsZHMxLCBmaWVsZHMyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgUmVwZWF0ZWRGaWVsZFRyZWF0bWVudENoYW5nZUxpc3RUb1NldCkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMjsKKworICBtc2cxLmFkZF9ydigxKTsKKyAgbXNnMS5hZGRfcnYoMik7CisgIG1zZzIuYWRkX3J2KDIpOworICBtc2cyLmFkZF9ydigxKTsKKworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLlRyZWF0QXNMaXN0KAorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJ2IikpOworICBkaWZmZXJlbmNlci5UcmVhdEFzU2V0KAorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJ2IikpOworCisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFJlcGVhdGVkRmllbGRUcmVhdG1lbnRDaGFuZ2VTZXRUb0xpc3QpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisKKyAgbXNnMS5hZGRfcnYoMSk7CisgIG1zZzEuYWRkX3J2KDIpOworICBtc2cyLmFkZF9ydigyKTsKKyAgbXNnMi5hZGRfcnYoMSk7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5UcmVhdEFzU2V0KAorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJ2IikpOworICBkaWZmZXJlbmNlci5UcmVhdEFzTGlzdCgKKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJydiIpKTsKKworICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgUmVwZWF0ZWRGaWVsZFNtYXJ0TGlzdFRlc3QpIHsKKyAgLy8gQ3JlYXRlIHRoZSB0ZXN0aW5nIHByb3RvcworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMjsKKworICBtc2cxLmFkZF9ydigxKTsKKyAgbXNnMS5hZGRfcnYoMik7CisgIG1zZzEuYWRkX3J2KDMpOworICBtc2cxLmFkZF9ydig5KTsKKyAgbXNnMS5hZGRfcnYoNCk7CisgIG1zZzEuYWRkX3J2KDUpOworICBtc2cxLmFkZF9ydig3KTsKKyAgbXNnMS5hZGRfcnYoMik7CisgIG1zZzIuYWRkX3J2KDkpOworICBtc2cyLmFkZF9ydigwKTsKKyAgbXNnMi5hZGRfcnYoMik7CisgIG1zZzIuYWRkX3J2KDcpOworICBtc2cyLmFkZF9ydigzKTsKKyAgbXNnMi5hZGRfcnYoNCk7CisgIG1zZzIuYWRkX3J2KDUpOworICBtc2cyLmFkZF9ydig2KTsKKyAgbXNnMi5hZGRfcnYoMik7CisgIC8vIENvbXBhcmUKKyAgLy8gYTogMSwgICAgICAyLCAgICAzLCA5LCA0LCA1LCA3LCAgIDIKKyAgLy8gYjogICA5LCAwLCAyLCA3LCAzLCAgICA0LCA1LCAgIDYsIDIKKyAgc3RkOjpzdHJpbmcgZGlmZl9yZXBvcnQ7CisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuUmVwb3J0RGlmZmVyZW5jZXNUb1N0cmluZygmZGlmZl9yZXBvcnQpOworICBkaWZmZXJlbmNlci5zZXRfcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbigKKyAgICAgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6QVNfU01BUlRfTElTVCk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgImRlbGV0ZWQ6IHJ2WzBdOiAxXG4iCisgICAgICAiYWRkZWQ6IHJ2WzBdOiA5XG4iCisgICAgICAiYWRkZWQ6IHJ2WzFdOiAwXG4iCisgICAgICAibW92ZWQ6IHJ2WzFdIC0+IHJ2WzJdIDogMlxuIgorICAgICAgImFkZGVkOiBydlszXTogN1xuIgorICAgICAgIm1vdmVkOiBydlsyXSAtPiBydls0XSA6IDNcbiIKKyAgICAgICJkZWxldGVkOiBydlszXTogOVxuIgorICAgICAgIm1vdmVkOiBydls0XSAtPiBydls1XSA6IDRcbiIKKyAgICAgICJtb3ZlZDogcnZbNV0gLT4gcnZbNl0gOiA1XG4iCisgICAgICAiZGVsZXRlZDogcnZbNl06IDdcbiIKKyAgICAgICJhZGRlZDogcnZbN106IDZcbiIKKyAgICAgICJtb3ZlZDogcnZbN10gLT4gcnZbOF0gOiAyXG4iLAorICAgICAgZGlmZl9yZXBvcnQpOworCisgIC8vIENvbXBhcmUgdHdvIHN1YiBtZXNzYWdlcworICAvLyBhOiAxLCAyLCAzLCAgICA0LCA1CisgIC8vIGI6ICAgIDIsICAgIDYsIDQsCisgIG1zZzEuQ2xlYXIoKTsKKyAgbXNnMi5DbGVhcigpOworICBtc2cxLmFkZF9ybSgpLT5zZXRfYSgxKTsKKyAgbXNnMS5hZGRfcm0oKS0+c2V0X2EoMik7CisgIG1zZzEuYWRkX3JtKCktPnNldF9hKDMpOworICBtc2cxLmFkZF9ybSgpLT5zZXRfYSg0KTsKKyAgbXNnMS5hZGRfcm0oKS0+c2V0X2EoNSk7CisgIG1zZzIuYWRkX3JtKCktPnNldF9hKDIpOworICBtc2cyLmFkZF9ybSgpLT5zZXRfYSg2KTsKKyAgbXNnMi5hZGRfcm0oKS0+c2V0X2EoNCk7CisgIGRpZmZlcmVuY2VyLlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoJmRpZmZfcmVwb3J0KTsKKyAgZGlmZmVyZW5jZXIuc2V0X3JlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb24oCisgICAgICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkFTX1NNQVJUX0xJU1QpOworICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJkZWxldGVkOiBybVswXTogeyBhOiAxIH1cbiIKKyAgICAgICJtb3ZlZDogcm1bMV0gLT4gcm1bMF0gOiB7IGE6IDIgfVxuIgorICAgICAgImRlbGV0ZWQ6IHJtWzJdOiB7IGE6IDMgfVxuIgorICAgICAgImFkZGVkOiBybVsxXTogeyBhOiA2IH1cbiIKKyAgICAgICJtb3ZlZDogcm1bM10gLT4gcm1bMl0gOiB7IGE6IDQgfVxuIgorICAgICAgImRlbGV0ZWQ6IHJtWzRdOiB7IGE6IDUgfVxuIiwKKyAgICAgIGRpZmZfcmVwb3J0KTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBSZXBlYXRlZEZpZWxkU21hcnRTZXRUZXN0KSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RmllbGQgZWxlbTFfMSwgZWxlbTJfMSwgZWxlbTNfMTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RGaWVsZCBlbGVtMV8yLCBlbGVtMl8yLCBlbGVtM18yOworCisgIC8vIE9ubHkgb25lIGZpZWxkIGlzIGRpZmZlcmVudCBmb3IgZWFjaCBwYWlyIG9mIGVsZW1lbXRzCisgIGVsZW0xXzEuc2V0X2EoMSk7CisgIGVsZW0xXzIuc2V0X2EoMCk7CisgIGVsZW0xXzEuc2V0X2IoMSk7CisgIGVsZW0xXzIuc2V0X2IoMSk7CisgIGVsZW0xXzEuc2V0X2MoMSk7CisgIGVsZW0xXzIuc2V0X2MoMSk7CisgIGVsZW0yXzEuc2V0X2EoMik7CisgIGVsZW0yXzIuc2V0X2EoMik7CisgIGVsZW0yXzEuc2V0X2IoMik7CisgIGVsZW0yXzIuc2V0X2IoMCk7CisgIGVsZW0yXzEuc2V0X2MoMik7CisgIGVsZW0yXzIuc2V0X2MoMik7CisgIGVsZW0zXzEuc2V0X2EoMyk7CisgIGVsZW0zXzIuc2V0X2EoMyk7CisgIGVsZW0zXzEuc2V0X2IoMyk7CisgIGVsZW0zXzIuc2V0X2IoMCk7CisgIGVsZW0zXzEuc2V0X2MoMyk7CisgIGVsZW0zXzIuc2V0X2MoMyk7CisKKyAgKm1zZzEuYWRkX3JtKCkgPSBlbGVtMV8xOworICAqbXNnMS5hZGRfcm0oKSA9IGVsZW0yXzE7CisgICptc2cxLmFkZF9ybSgpID0gZWxlbTNfMTsKKyAgLy8gQ2hhbmdlIHRoZSBvcmRlciBvZiB0aG9zZSBlbGVtZW50cyBmb3IgdGhlIHNlY29uZCBtZXNzYWdlLgorICAqbXNnMi5hZGRfcm0oKSA9IGVsZW0zXzI7CisgICptc2cyLmFkZF9ybSgpID0gZWxlbTFfMjsKKyAgKm1zZzIuYWRkX3JtKCkgPSBlbGVtMl8yOworCisgIHN0ZDo6c3RyaW5nIGRpZmZfcmVwb3J0OworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoJmRpZmZfcmVwb3J0KTsKKyAgZGlmZmVyZW5jZXIuc2V0X3JlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb24oCisgICAgICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkFTX1NNQVJUX1NFVCk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIm1vZGlmaWVkOiBybVswXS5hIC0+IHJtWzFdLmE6IDEgLT4gMFxuIgorICAgICAgIm1vZGlmaWVkOiBybVsxXS5iIC0+IHJtWzJdLmI6IDIgLT4gMFxuIgorICAgICAgIm1vZGlmaWVkOiBybVsyXS5iIC0+IHJtWzBdLmI6IDMgLT4gMFxuIiwKKyAgICAgIGRpZmZfcmVwb3J0KTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBSZXBlYXRlZEZpZWxkU21hcnRTZXRUZXN0X0lkZW50aWNhbEVsZW1lbnRzKSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RmllbGQgZWxlbTsKKworICBlbGVtLnNldF9hKDEpOworICBlbGVtLnNldF9iKDEpOworICBlbGVtLnNldF9jKDEpOworCisgICptc2cxLmFkZF9ybSgpID0gZWxlbTsKKyAgKm1zZzEuYWRkX3JtKCkgPSBlbGVtOworICAqbXNnMi5hZGRfcm0oKSA9IGVsZW07CisgICptc2cyLmFkZF9ybSgpID0gZWxlbTsKKworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLnNldF9yZXBlYXRlZF9maWVsZF9jb21wYXJpc29uKAorICAgICAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpBU19TTUFSVF9TRVQpOworICBFWFBFQ1RfVFJVRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBSZXBlYXRlZEZpZWxkU21hcnRTZXRUZXN0X1ByZXZpb3VzbHlNYXRjaCkgeworICAvLyBDcmVhdGUgdGhlIHRlc3RpbmcgcHJvdG9zCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cyOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEZpZWxkIGVsZW0xXzEsIGVsZW0xXzI7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RmllbGQgZWxlbTJfMSwgZWxlbTJfMjsKKworICBlbGVtMV8xLnNldF9hKDEpOworICBlbGVtMV8xLnNldF9iKDEpOworICBlbGVtMV8xLnNldF9jKDEpOworICBlbGVtMV8yLnNldF9hKDEpOworICBlbGVtMV8yLnNldF9iKDEpOworICBlbGVtMV8yLnNldF9jKDApOworCisgIGVsZW0yXzEuc2V0X2EoMSk7CisgIGVsZW0yXzEuc2V0X2IoMSk7CisgIGVsZW0yXzEuc2V0X2MoMSk7CisgIGVsZW0yXzIuc2V0X2EoMSk7CisgIGVsZW0yXzIuc2V0X2IoMCk7CisgIGVsZW0yXzIuc2V0X2MoMSk7CisKKyAgKm1zZzEuYWRkX3JtKCkgPSBlbGVtMV8xOworICAqbXNnMS5hZGRfcm0oKSA9IGVsZW0yXzE7CisgICptc2cyLmFkZF9ybSgpID0gZWxlbTFfMjsKKyAgKm1zZzIuYWRkX3JtKCkgPSBlbGVtMl8yOworCisgIHN0ZDo6c3RyaW5nIGRpZmZfcmVwb3J0OworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoJmRpZmZfcmVwb3J0KTsKKyAgZGlmZmVyZW5jZXIuc2V0X3JlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb24oCisgICAgICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkFTX1NNQVJUX1NFVCk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIm1vZGlmaWVkOiBybVswXS5jOiAxIC0+IDBcbiIKKyAgICAgICJtb2RpZmllZDogcm1bMV0uYjogMSAtPiAwXG4iLAorICAgICAgZGlmZl9yZXBvcnQpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFJlcGVhdGVkRmllbGRTbWFydFNldF9NdWx0aXBsZU1hdGNoZXMpIHsKKyAgLy8gQ3JlYXRlIHRoZSB0ZXN0aW5nIHByb3RvcworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMjsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RGaWVsZCBlbGVtMV8xLCBlbGVtMl8xLCBlbGVtM18xOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEZpZWxkIGVsZW0yXzIsIGVsZW0zXzI7CisKKyAgLy8gT25seSBvbmUgZmllbGQgaXMgZGlmZmVyZW50IGZvciBlYWNoIHBhaXIgb2YgZWxlbWVtdHMKKyAgZWxlbTFfMS5zZXRfYSgxKTsKKyAgZWxlbTFfMS5zZXRfYigxKTsKKyAgZWxlbTFfMS5zZXRfYygxKTsKKyAgZWxlbTJfMS5zZXRfYSgyKTsKKyAgZWxlbTJfMi5zZXRfYSgyKTsKKyAgZWxlbTJfMS5zZXRfYigyKTsKKyAgZWxlbTJfMi5zZXRfYigwKTsKKyAgZWxlbTJfMS5zZXRfYygyKTsKKyAgZWxlbTJfMi5zZXRfYygyKTsKKyAgZWxlbTNfMS5zZXRfYSgzKTsKKyAgZWxlbTNfMi5zZXRfYSgzKTsKKyAgZWxlbTNfMS5zZXRfYigzKTsKKyAgZWxlbTNfMi5zZXRfYigwKTsKKyAgZWxlbTNfMS5zZXRfYygzKTsKKyAgZWxlbTNfMi5zZXRfYygzKTsKKworICAvLyBJbiB0aGlzIHRlc3RjYXNlLCBlbGVtMV8xIHdpbGwgbWF0Y2ggd2l0aCBlbGVtMl8yIGZpcnN0IGFuZCB0aGVuIGdldAorICAvLyByZXZlcnRlZCBiZWNhdXNlIGVsZW0yXzEgbWF0Y2hlcyB3aXRoIGVsZW0yXzIgbGF0ZXIuCisgICptc2cxLmFkZF9ybSgpID0gZWxlbTFfMTsKKyAgKm1zZzEuYWRkX3JtKCkgPSBlbGVtMl8xOworICAqbXNnMS5hZGRfcm0oKSA9IGVsZW0zXzE7CisgICptc2cyLmFkZF9ybSgpID0gZWxlbTJfMjsKKyAgKm1zZzIuYWRkX3JtKCkgPSBlbGVtM18yOworCisgIHN0ZDo6c3RyaW5nIGRpZmZfcmVwb3J0OworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoJmRpZmZfcmVwb3J0KTsKKyAgZGlmZmVyZW5jZXIuc2V0X3JlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb24oCisgICAgICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkFTX1NNQVJUX1NFVCk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIm1vZGlmaWVkOiBybVsxXS5iIC0+IHJtWzBdLmI6IDIgLT4gMFxuIgorICAgICAgIm1vZGlmaWVkOiBybVsyXS5iIC0+IHJtWzFdLmI6IDMgLT4gMFxuIgorICAgICAgImRlbGV0ZWQ6IHJtWzBdOiB7IGM6IDEgYTogMSBiOiAxIH1cbiIsCisgICAgICBkaWZmX3JlcG9ydCk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgUmVwZWF0ZWRGaWVsZFNtYXJ0U2V0X011bHRpcGxlTWF0Y2hlc05vUmVwb3J0ZXIpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RmllbGQgZWxlbTEsIGVsZW0yLCBlbGVtMywgZWxlbTQ7CisgIGVsZW0xLnNldF9hKDEpOworICBlbGVtMi5zZXRfYSgyKTsKKyAgZWxlbTMuc2V0X2EoMyk7CisgIGVsZW00LnNldF9hKDQpOworCisgICptc2cxLmFkZF9ybSgpID0gZWxlbTE7CisgICptc2cxLmFkZF9ybSgpID0gZWxlbTI7CisgICptc2cxLmFkZF9ybSgpID0gZWxlbTM7CisgICptc2cyLmFkZF9ybSgpID0gZWxlbTI7CisgICptc2cyLmFkZF9ybSgpID0gZWxlbTM7CisgICptc2cyLmFkZF9ybSgpID0gZWxlbTQ7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5zZXRfcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbigKKyAgICAgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6QVNfU01BUlRfU0VUKTsKKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFJlcGVhdGVkRmllbGRTbWFydFNldF9Ob25NZXNzYWdlVHlwZVRlc3QpIHsKKyAgLy8gQ3JlYXRlIHRoZSB0ZXN0aW5nIHByb3RvcworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMjsKKworICAvLyBDcmVhdGUgMyBlbGVtZW50cywgYnV0IGluIGRpZmZlcmVudCBvcmRlci4KKyAgbXNnMS5hZGRfcncoImIiKTsKKyAgbXNnMi5hZGRfcncoImEiKTsKKyAgbXNnMS5hZGRfcncoIngiKTsKKyAgbXNnMi5hZGRfcncoIngiKTsKKyAgbXNnMS5hZGRfcncoImEiKTsKKyAgbXNnMi5hZGRfcncoImIiKTsKKworICBzdGQ6OnN0cmluZyBkaWZmX3JlcG9ydDsKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5SZXBvcnREaWZmZXJlbmNlc1RvU3RyaW5nKCZkaWZmX3JlcG9ydCk7CisgIGRpZmZlcmVuY2VyLnNldF9yZXBlYXRlZF9maWVsZF9jb21wYXJpc29uKAorICAgICAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpBU19TTUFSVF9TRVQpOworICBFWFBFQ1RfVFJVRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIm1vdmVkOiByd1swXSAtPiByd1syXSA6IFwiYlwiXG4iCisgICAgICAibW92ZWQ6IHJ3WzJdIC0+IHJ3WzBdIDogXCJhXCJcbiIsCisgICAgICBkaWZmX3JlcG9ydCk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgUmVwZWF0ZWRGaWVsZFNldFRlc3RfU2V0T2ZTZXQpIHsKKyAgLy8gQ3JlYXRlIHRoZSB0ZXN0aW5nIHByb3RvcworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMjsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlOjpJdGVtKiBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICBpdGVtLT5hZGRfcmEoMSk7CisgIGl0ZW0tPmFkZF9yYSgyKTsKKyAgaXRlbS0+YWRkX3JhKDMpOworICBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICBpdGVtLT5hZGRfcmEoNSk7CisgIGl0ZW0tPmFkZF9yYSg2KTsKKyAgaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+YWRkX3JhKDEpOworICBpdGVtLT5hZGRfcmEoMyk7CisgIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIGl0ZW0tPmFkZF9yYSg2KTsKKyAgaXRlbS0+YWRkX3JhKDcpOworICBpdGVtLT5hZGRfcmEoOCk7CisKKyAgaXRlbSA9IG1zZzIuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+YWRkX3JhKDYpOworICBpdGVtLT5hZGRfcmEoNSk7CisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPmFkZF9yYSg2KTsKKyAgaXRlbS0+YWRkX3JhKDgpOworICBpdGVtLT5hZGRfcmEoNyk7CisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPmFkZF9yYSgxKTsKKyAgaXRlbS0+YWRkX3JhKDMpOworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5hZGRfcmEoMyk7CisgIGl0ZW0tPmFkZF9yYSgyKTsKKyAgaXRlbS0+YWRkX3JhKDEpOworCisgIC8vIENvbXBhcmUKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5zZXRfcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbih1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkFTX1NFVCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFJlcGVhdGVkRmllbGRTZXRUZXN0X0NvbWJpbmF0aW9uKSB7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisgIC8vIFRyZWF0ICJpdGVtIiBhcyBNYXAsIHdpdGgga2V5ID0gImEiCisgIC8vIFRyZWF0ICJpdGVtLnJhIiBhbHNvIGFzIFNldAorICAvLyBUcmVhdCAicnYiIGFzIFNldAorICAvLyBUcmVhdCAicnciIGFzIExpc3QKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6SXRlbSogaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+c2V0X2EoMyk7CisgIGl0ZW0tPmFkZF9yYSgxKTsKKyAgaXRlbS0+YWRkX3JhKDIpOworICBpdGVtLT5hZGRfcmEoMyk7CisgIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDQpOworICBpdGVtLT5hZGRfcmEoNSk7CisgIGl0ZW0tPmFkZF9yYSg2KTsKKyAgaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+c2V0X2EoMSk7CisgIGl0ZW0tPmFkZF9yYSgxKTsKKyAgaXRlbS0+YWRkX3JhKDMpOworICBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYSgyKTsKKyAgaXRlbS0+YWRkX3JhKDYpOworICBpdGVtLT5hZGRfcmEoNyk7CisgIGl0ZW0tPmFkZF9yYSg4KTsKKworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYSg0KTsKKyAgaXRlbS0+YWRkX3JhKDYpOworICBpdGVtLT5hZGRfcmEoNSk7CisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDIpOworICBpdGVtLT5hZGRfcmEoNik7CisgIGl0ZW0tPmFkZF9yYSg4KTsKKyAgaXRlbS0+YWRkX3JhKDcpOworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYSgxKTsKKyAgaXRlbS0+YWRkX3JhKDEpOworICBpdGVtLT5hZGRfcmEoMyk7CisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDMpOworICBpdGVtLT5hZGRfcmEoMyk7CisgIGl0ZW0tPmFkZF9yYSgyKTsKKyAgaXRlbS0+YWRkX3JhKDEpOworCisgIG1zZzEuYWRkX3J2KDMpOworICBtc2cxLmFkZF9ydig0KTsKKyAgbXNnMS5hZGRfcnYoNyk7CisgIG1zZzEuYWRkX3J2KDApOworICBtc2cyLmFkZF9ydig0KTsKKyAgbXNnMi5hZGRfcnYoMyk7CisgIG1zZzIuYWRkX3J2KDApOworICBtc2cyLmFkZF9ydig3KTsKKworICBtc2cxLmFkZF9ydygibm90aGluZyIpOworICBtc2cyLmFkZF9ydygibm90aGluZyIpOworICBtc2cxLmFkZF9ydygic2hvdWxkIik7CisgIG1zZzIuYWRkX3J3KCJzaG91bGQiKTsKKyAgbXNnMS5hZGRfcncoImNoYW5nZSIpOworICBtc2cyLmFkZF9ydygiY2hhbmdlIik7CisKKyAgLy8gQ29tcGFyZQorICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXIxOworICBkaWZmZXJlbmNlcjEuVHJlYXRBc01hcChtc2cxLkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJpdGVtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJhIikpOworICBkaWZmZXJlbmNlcjEuVHJlYXRBc1NldChtc2cxLkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJydiIpKTsKKyAgZGlmZmVyZW5jZXIxLlRyZWF0QXNTZXQoaXRlbS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJhIikpOworICBFWFBFQ1RfVFJVRShkaWZmZXJlbmNlcjEuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyMjsKKyAgZGlmZmVyZW5jZXIyLlRyZWF0QXNNYXAobXNnMS5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgiaXRlbSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgiYSIpKTsKKyAgZGlmZmVyZW5jZXIyLnNldF9yZXBlYXRlZF9maWVsZF9jb21wYXJpc29uKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6QVNfU0VUKTsKKyAgZGlmZmVyZW5jZXIyLlRyZWF0QXNMaXN0KG1zZzEuR2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJ3IikpOworICBFWFBFQ1RfVFJVRShkaWZmZXJlbmNlcjIuQ29tcGFyZShtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgUmVwZWF0ZWRGaWVsZE1hcFRlc3RfUGFydGlhbCkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzE7CisgIC8vIG1lc3NhZ2UgbXNnMSB7CisgIC8vICAgaXRlbSB7IGE6IDE7IGI6ICIxMSIgfQorICAvLyB9CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2U6Okl0ZW0qIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDEpOworICBpdGVtLT5zZXRfYigiMTEiKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisgIC8vIG1lc3NhZ2UgbXNnMiB7CisgIC8vICAgaXRlbSB7IGE6IDI7IGI6ICIyMiIgfQorICAvLyAgIGl0ZW0geyBhOiAxOyBiOiAiMTEiIH0KKyAgLy8gfQorICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYSgyKTsKKyAgaXRlbS0+c2V0X2IoIjIyIik7CisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDEpOworICBpdGVtLT5zZXRfYigiMTEiKTsKKworICAvLyBDb21wYXJlCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuVHJlYXRBc01hcChHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgIml0ZW0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgIml0ZW0uYSIpKTsKKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6UEFSVElBTCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFJlcGVhdGVkRmllbGRTZXRUZXN0X0R1cGxpY2F0ZXMpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBhLCBiLCBjOworICAvLyBtZXNzYWdlIGE6IHsKKyAgLy8gICBydjogMAorICAvLyAgIHJ2OiAxCisgIC8vICAgcnY6IDAKKyAgLy8gfQorICBhLmFkZF9ydigwKTsKKyAgYS5hZGRfcnYoMSk7CisgIGEuYWRkX3J2KDApOworICAvLyBtZXNzYWdlIGI6IHsKKyAgLy8gICBydjogMAorICAvLyAgIHJ2OiAwCisgIC8vICAgcnY6IDEKKyAgLy8gfQorICBiLmFkZF9ydigwKTsKKyAgYi5hZGRfcnYoMCk7CisgIGIuYWRkX3J2KDEpOworICAvLyBtZXNzYWdlIGM6IHsKKyAgLy8gICBydjogMAorICAvLyAgIHJ2OiAxCisgIC8vIH0KKyAgYy5hZGRfcnYoMCk7CisgIGMuYWRkX3J2KDEpOworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLlRyZWF0QXNTZXQoR2V0RmllbGREZXNjcmlwdG9yKGEsICJydiIpKTsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZShiLCBhKSk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKGMsIGEpKTsKKworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXIxOworICBkaWZmZXJlbmNlcjEuc2V0X3JlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb24odXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpBU19TRVQpOworICBFWFBFQ1RfVFJVRShkaWZmZXJlbmNlcjEuQ29tcGFyZShiLCBhKSk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlcjEuQ29tcGFyZShjLCBhKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgUmVwZWF0ZWRGaWVsZFNldFRlc3RfUGFydGlhbFNpbXBsZSkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIGEsIGIsIGM7CisgIC8vIG1lc3NhZ2UgYTogeworICAvLyAgIHJtIHsgYzogMSB9CisgIC8vICAgcm0geyBjOiAwIH0KKyAgLy8gfQorICBhLmFkZF9ybSgpLT5zZXRfYygxKTsKKyAgYS5hZGRfcm0oKS0+c2V0X2MoMCk7CisgIC8vIG1lc3NhZ2UgYjogeworICAvLyAgIHJtIHsgYzogMSB9CisgIC8vICAgcm0ge30KKyAgLy8gfQorICBiLmFkZF9ybSgpLT5zZXRfYygxKTsKKyAgYi5hZGRfcm0oKTsKKyAgLy8gbWVzc2FnZSBjOiB7CisgIC8vICAgcm0ge30KKyAgLy8gICBybSB7IGM6IDEgfQorICAvLyB9CisgIGMuYWRkX3JtKCk7CisgIGMuYWRkX3JtKCktPnNldF9jKDEpOworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLnNldF9zY29wZSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OlBBUlRJQUwpOworICBkaWZmZXJlbmNlci5UcmVhdEFzU2V0KEdldEZpZWxkRGVzY3JpcHRvcihhLCAicm0iKSk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUoYiwgYSkpOworICBFWFBFQ1RfVFJVRShkaWZmZXJlbmNlci5Db21wYXJlKGMsIGEpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBSZXBlYXRlZEZpZWxkU2V0VGVzdF9QYXJ0aWFsKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMSwgbXNnMjsKKyAgLy8gbWVzc2FnZSBtc2cxOiB7CisgIC8vICAgcm0geyBhOiAxIH0KKyAgLy8gICBybSB7IGI6IDIgfQorICAvLyAgIHJtIHsgYzogMyB9CisgIC8vIH0KKyAgbXNnMS5hZGRfcm0oKS0+c2V0X2EoMSk7CisgIG1zZzEuYWRkX3JtKCktPnNldF9iKDIpOworICBtc2cxLmFkZF9ybSgpLT5zZXRfYygzKTsKKyAgLy8gbWVzc2FnZSBtc2cyOiB7CisgIC8vICAgcm0geyBhOiAxOyBjOiAzIH0KKyAgLy8gICBybSB7IGI6IDI7IGM6IDMgfQorICAvLyAgIHJtIHsgYjogMiB9CisgIC8vIH0KKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RGaWVsZCogZmllbGQgPSBtc2cyLmFkZF9ybSgpOworICBmaWVsZC0+c2V0X2EoMSk7CisgIGZpZWxkLT5zZXRfYygzKTsKKyAgZmllbGQgPSBtc2cyLmFkZF9ybSgpOworICBmaWVsZC0+c2V0X2IoMik7CisgIGZpZWxkLT5zZXRfYygzKTsKKyAgZmllbGQgPSBtc2cyLmFkZF9ybSgpOworICBmaWVsZC0+c2V0X2IoMik7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5zZXRfc2NvcGUodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpQQVJUSUFMKTsKKyAgZGlmZmVyZW5jZXIuVHJlYXRBc1NldChHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgInJtIikpOworICBFWFBFQ1RfVFJVRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBSZXBlYXRlZEZpZWxkTWFwVGVzdF9NdWx0aXBsZUZpZWxkc0FzS2V5KSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cyOworICAvLyBUcmVhdCAiaXRlbSIgYXMgTWFwLCB3aXRoIGtleSA9ICgiYSIsICJyYSIpCisgIC8vIFRyZWF0ICJpdGVtLnJhIiBhcyBTZXQKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6SXRlbSogaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKyAgLy8ga2V5ID0+IHZhbHVlOiAoMSwgezIsIDN9KSA9PiAiYSIKKyAgaXRlbS0+c2V0X2EoMSk7CisgIGl0ZW0tPmFkZF9yYSgyKTsKKyAgaXRlbS0+YWRkX3JhKDMpOworICBpdGVtLT5zZXRfYigiYSIpOworICBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICAvLyBrZXkgPT4gdmFsdWU6ICgyLCB7MSwgM30pID0+ICJiIgorICBpdGVtLT5zZXRfYSgyKTsKKyAgaXRlbS0+YWRkX3JhKDEpOworICBpdGVtLT5hZGRfcmEoMyk7CisgIGl0ZW0tPnNldF9iKCJiIik7CisgIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIC8vIGtleSA9PiB2YWx1ZTogKDEsIHsxLCAzfSkgPT4gImMiCisgIGl0ZW0tPnNldF9hKDEpOworICBpdGVtLT5hZGRfcmEoMSk7CisgIGl0ZW0tPmFkZF9yYSgzKTsKKyAgaXRlbS0+c2V0X2IoImMiKTsKKworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICAvLyBrZXkgPT4gdmFsdWU6ICgxLCB7MSwgM30pID0+ICJjIgorICBpdGVtLT5zZXRfYSgxKTsKKyAgaXRlbS0+YWRkX3JhKDMpOworICBpdGVtLT5hZGRfcmEoMSk7CisgIGl0ZW0tPnNldF9iKCJjIik7CisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIC8vIGtleSA9PiB2YWx1ZTogKDEsIHsyLCAzfSkgPT4gImEiCisgIGl0ZW0tPnNldF9hKDEpOworICBpdGVtLT5hZGRfcmEoMyk7CisgIGl0ZW0tPmFkZF9yYSgyKTsKKyAgaXRlbS0+c2V0X2IoImEiKTsKKyAgaXRlbSA9IG1zZzIuYWRkX2l0ZW0oKTsKKyAgLy8ga2V5ID0+IHZhbHVlOiAoMiwgezEsIDN9KSA9PiAiYiIKKyAgaXRlbS0+c2V0X2EoMik7CisgIGl0ZW0tPmFkZF9yYSgzKTsKKyAgaXRlbS0+YWRkX3JhKDEpOworICBpdGVtLT5zZXRfYigiYiIpOworCisgIC8vIENvbXBhcmUKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5UcmVhdEFzU2V0KEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAiaXRlbS5yYSIpKTsKKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBrZXlfZmllbGRzOworICBrZXlfZmllbGRzLnB1c2hfYmFjayhHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgIml0ZW0uYSIpKTsKKyAga2V5X2ZpZWxkcy5wdXNoX2JhY2soR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJpdGVtLnJhIikpOworICBkaWZmZXJlbmNlci5UcmVhdEFzTWFwV2l0aE11bHRpcGxlRmllbGRzQXNLZXkoCisgICAgICBHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgIml0ZW0iKSwga2V5X2ZpZWxkcyk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworCisgIC8vIEludHJvZHVjZSBzb21lIGRpZmZlcmVuY2VzLgorICBtc2cxLmNsZWFyX2l0ZW0oKTsKKyAgbXNnMi5jbGVhcl9pdGVtKCk7CisgIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDQpOworICBpdGVtLT5hZGRfcmEoNSk7CisgIGl0ZW0tPmFkZF9yYSg2KTsKKyAgaXRlbS0+c2V0X2IoImhlbGxvIik7CisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDQpOworICBpdGVtLT5hZGRfcmEoNik7CisgIGl0ZW0tPmFkZF9yYSg1KTsKKyAgaXRlbS0+c2V0X2IoIndvcmxkIik7CisgIHN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgZGlmZmVyZW5jZXIuUmVwb3J0RGlmZmVyZW5jZXNUb1N0cmluZygmb3V0cHV0KTsKKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworICBFWFBFQ1RfRVEoCisgICAgICAibW92ZWQ6IGl0ZW1bMF0ucmFbMF0gLT4gaXRlbVswXS5yYVsxXSA6IDVcbiIKKyAgICAgICJtb3ZlZDogaXRlbVswXS5yYVsxXSAtPiBpdGVtWzBdLnJhWzBdIDogNlxuIgorICAgICAgIm1vZGlmaWVkOiBpdGVtWzBdLmI6IFwiaGVsbG9cIiAtPiBcIndvcmxkXCJcbiIsCisgICAgICBvdXRwdXQpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFJlcGVhdGVkRmllbGRNYXBUZXN0X011bHRpcGxlRmllbGRQYXRoc0FzS2V5KSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cyOworICAvLyBUcmVhdCAiaXRlbSIgYXMgTWFwLCB3aXRoIGtleSA9ICgibS5hIiwgIm0ucmMiKQorICAvLyBUcmVhdCAiaXRlbS5tLnJjIiBhcyBTZXQKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6SXRlbSogaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKyAgLy8ga2V5ID0+IHZhbHVlOiAoMSwgezIsIDN9KSA9PiAiYSIKKyAgaXRlbS0+bXV0YWJsZV9tKCktPnNldF9hKDEpOworICBpdGVtLT5tdXRhYmxlX20oKS0+YWRkX3JjKDIpOworICBpdGVtLT5tdXRhYmxlX20oKS0+YWRkX3JjKDMpOworICBpdGVtLT5zZXRfYigiYSIpOworICBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICAvLyBrZXkgPT4gdmFsdWU6ICgyLCB7MSwgM30pID0+ICJiIgorICBpdGVtLT5tdXRhYmxlX20oKS0+c2V0X2EoMik7CisgIGl0ZW0tPm11dGFibGVfbSgpLT5hZGRfcmMoMSk7CisgIGl0ZW0tPm11dGFibGVfbSgpLT5hZGRfcmMoMyk7CisgIGl0ZW0tPnNldF9iKCJiIik7CisgIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIC8vIGtleSA9PiB2YWx1ZTogKDEsIHsxLCAzfSkgPT4gImMiCisgIGl0ZW0tPm11dGFibGVfbSgpLT5zZXRfYSgxKTsKKyAgaXRlbS0+bXV0YWJsZV9tKCktPmFkZF9yYygxKTsKKyAgaXRlbS0+bXV0YWJsZV9tKCktPmFkZF9yYygzKTsKKyAgaXRlbS0+c2V0X2IoImMiKTsKKworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICAvLyBrZXkgPT4gdmFsdWU6ICgxLCB7MSwgM30pID0+ICJjIgorICBpdGVtLT5tdXRhYmxlX20oKS0+c2V0X2EoMSk7CisgIGl0ZW0tPm11dGFibGVfbSgpLT5hZGRfcmMoMyk7CisgIGl0ZW0tPm11dGFibGVfbSgpLT5hZGRfcmMoMSk7CisgIGl0ZW0tPnNldF9iKCJjIik7CisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIC8vIGtleSA9PiB2YWx1ZTogKDEsIHsyLCAzfSkgPT4gImEiCisgIGl0ZW0tPm11dGFibGVfbSgpLT5zZXRfYSgxKTsKKyAgaXRlbS0+bXV0YWJsZV9tKCktPmFkZF9yYygzKTsKKyAgaXRlbS0+bXV0YWJsZV9tKCktPmFkZF9yYygyKTsKKyAgaXRlbS0+c2V0X2IoImEiKTsKKyAgaXRlbSA9IG1zZzIuYWRkX2l0ZW0oKTsKKyAgLy8ga2V5ID0+IHZhbHVlOiAoMiwgezEsIDN9KSA9PiAiYiIKKyAgaXRlbS0+bXV0YWJsZV9tKCktPnNldF9hKDIpOworICBpdGVtLT5tdXRhYmxlX20oKS0+YWRkX3JjKDMpOworICBpdGVtLT5tdXRhYmxlX20oKS0+YWRkX3JjKDEpOworICBpdGVtLT5zZXRfYigiYiIpOworCisgIC8vIENvbXBhcmUKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5UcmVhdEFzU2V0KEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAiaXRlbS5tLnJjIikpOworICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+ID4ga2V5X2ZpZWxkX3BhdGhzOworICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBrZXlfZmllbGRfcGF0aDE7CisgIGtleV9maWVsZF9wYXRoMS5wdXNoX2JhY2soR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJpdGVtLm0iKSk7CisgIGtleV9maWVsZF9wYXRoMS5wdXNoX2JhY2soR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJpdGVtLm0uYSIpKTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4ga2V5X2ZpZWxkX3BhdGgyOworICBrZXlfZmllbGRfcGF0aDIucHVzaF9iYWNrKEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAiaXRlbS5tIikpOworICBrZXlfZmllbGRfcGF0aDIucHVzaF9iYWNrKEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAiaXRlbS5tLnJjIikpOworICBrZXlfZmllbGRfcGF0aHMucHVzaF9iYWNrKGtleV9maWVsZF9wYXRoMSk7CisgIGtleV9maWVsZF9wYXRocy5wdXNoX2JhY2soa2V5X2ZpZWxkX3BhdGgyKTsKKyAgZGlmZmVyZW5jZXIuVHJlYXRBc01hcFdpdGhNdWx0aXBsZUZpZWxkUGF0aHNBc0tleSgKKyAgICAgIEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAiaXRlbSIpLCBrZXlfZmllbGRfcGF0aHMpOworICBFWFBFQ1RfVFJVRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKworICAvLyBJbnRyb2R1Y2Ugc29tZSBkaWZmZXJlbmNlcy4KKyAgbXNnMS5jbGVhcl9pdGVtKCk7CisgIG1zZzIuY2xlYXJfaXRlbSgpOworICBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICBpdGVtLT5tdXRhYmxlX20oKS0+c2V0X2EoNCk7CisgIGl0ZW0tPm11dGFibGVfbSgpLT5hZGRfcmMoNSk7CisgIGl0ZW0tPm11dGFibGVfbSgpLT5hZGRfcmMoNik7CisgIGl0ZW0tPnNldF9iKCJoZWxsbyIpOworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5tdXRhYmxlX20oKS0+c2V0X2EoNCk7CisgIGl0ZW0tPm11dGFibGVfbSgpLT5hZGRfcmMoNik7CisgIGl0ZW0tPm11dGFibGVfbSgpLT5hZGRfcmMoNSk7CisgIGl0ZW0tPnNldF9iKCJ3b3JsZCIpOworICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisgIGRpZmZlcmVuY2VyLlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoJm91dHB1dCk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIm1vZGlmaWVkOiBpdGVtWzBdLmI6IFwiaGVsbG9cIiAtPiBcIndvcmxkXCJcbiIKKyAgICAgICJtb3ZlZDogaXRlbVswXS5tLnJjWzBdIC0+IGl0ZW1bMF0ubS5yY1sxXSA6IDVcbiIKKyAgICAgICJtb3ZlZDogaXRlbVswXS5tLnJjWzFdIC0+IGl0ZW1bMF0ubS5yY1swXSA6IDZcbiIsCisgICAgICBvdXRwdXQpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFJlcGVhdGVkRmllbGRNYXBUZXN0X0lnbm9yZWRLZXlGaWVsZHMpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisgIC8vIFRyZWF0ICJpdGVtIiBhcyBNYXAsIHdpdGgga2V5ID0gKCJhIiwgInJhIikKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6SXRlbSogaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+c2V0X2EoMSk7CisgIGl0ZW0tPmFkZF9yYSgyKTsKKyAgaXRlbS0+c2V0X2IoImhlbGxvIik7CisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDEpOworICBpdGVtLT5hZGRfcmEoMyk7CisgIGl0ZW0tPnNldF9iKCJ3b3JsZCIpOworICAvLyBDb21wYXJlCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4ga2V5X2ZpZWxkczsKKyAga2V5X2ZpZWxkcy5wdXNoX2JhY2soR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJpdGVtLmEiKSk7CisgIGtleV9maWVsZHMucHVzaF9iYWNrKEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAiaXRlbS5yYSIpKTsKKyAgZGlmZmVyZW5jZXIuVHJlYXRBc01hcFdpdGhNdWx0aXBsZUZpZWxkc0FzS2V5KAorICAgICAgR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJpdGVtIiksIGtleV9maWVsZHMpOworICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisgIGRpZmZlcmVuY2VyLlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoJm91dHB1dCk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgImFkZGVkOiBpdGVtWzBdOiB7IGE6IDEgcmE6IDMgYjogXCJ3b3JsZFwiIH1cbiIKKyAgICAgICJkZWxldGVkOiBpdGVtWzBdOiB7IGE6IDEgcmE6IDIgYjogXCJoZWxsb1wiIH1cbiIsCisgICAgICBvdXRwdXQpOworICAvLyBJZ25vcmVkIGZpZWxkcyB0aGF0IGFyZSBsaXN0ZWQgYXMgcGFydHMgb2YgdGhlIGtleSBhcmUgc3RpbGwgdXNlZAorICAvLyBpbiBrZXkgY29tcGFyaXNvbiwgYnV0IHRoZXkncmUgbm90IHVzZWQgaW4gdmFsdWUgY29tcGFyaXNvbi4KKyAgZGlmZmVyZW5jZXIuSWdub3JlRmllbGQoR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJpdGVtLnJhIikpOworICBvdXRwdXQuY2xlYXIoKTsKKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworICBFWFBFQ1RfRVEoCisgICAgICAiYWRkZWQ6IGl0ZW1bMF06IHsgYTogMSByYTogMyBiOiBcIndvcmxkXCIgfVxuIgorICAgICAgImRlbGV0ZWQ6IGl0ZW1bMF06IHsgYTogMSByYTogMiBiOiBcImhlbGxvXCIgfVxuIiwKKyAgICAgIG91dHB1dCk7CisgIC8vIElnbm9yaW5nIGEgZmllbGQgaW4gdGhlIGtleSBpcyBkaWZmZXJlbnQgZnJvbSB0cmVhdGluZyB0aGUgbGVmdCBmaWVsZHMKKyAgLy8gYXMga2V5LiBUaGF0IGlzOgorICAvLyAgIChrZXkgPSAoImEiLCAicmEiKSAmJiBpZ25vcmUgInJhIikgIT0gKGtleSA9ICgiYSIpICYmIGlnbm9yZSAicmEiKQorICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXIyOworICBkaWZmZXJlbmNlcjIuVHJlYXRBc01hcChHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgIml0ZW0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJpdGVtLmEiKSk7CisgIGRpZmZlcmVuY2VyMi5JZ25vcmVGaWVsZChHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgIml0ZW0ucmEiKSk7CisgIG91dHB1dC5jbGVhcigpOworICBkaWZmZXJlbmNlcjIuUmVwb3J0RGlmZmVyZW5jZXNUb1N0cmluZygmb3V0cHV0KTsKKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyMi5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgImlnbm9yZWQ6IGl0ZW1bMF0ucmFcbiIKKyAgICAgICJtb2RpZmllZDogaXRlbVswXS5iOiBcImhlbGxvXCIgLT4gXCJ3b3JsZFwiXG4iLAorICAgICAgb3V0cHV0KTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBQcmludE1hcEtleXNUZXN0KSB7CisgIC8vIE5vdGUgdGhhdCBiZWNhdXNlIG1hcCBpcyB1bm9yZGVyZWQsIHRoZSBjb21wYXJpc29uCisgIC8vIG91dHB1dCBzdHJpbmcgZm9yIHRlc3QgZXZhbHVhdGlvbiBjYW5ub3QgYXNzdW1lIG9yZGVyIG9mCisgIC8vIG91dHB1dCBvZiBmaWVsZHMgKElPVyBpZiB0d28gZmllbGRzIGFyZSBkZWxldGVkCisgIC8vIG9uZSBjYW5ub3QgYXNzdW1lIHdoaWNoIGRlbGV0ZWQgZmllbGQgbG9nIHdpbGwgYmUgcHJpbnRlZCBmaXJzdCkuCisgIC8vIFRlc3QgY3VycmVudGx5IGp1c3QgaGFzIGEgc2luZ2xlIHJlY29yZCBwZXIgb3BlcmF0aW9uIHRvIGFkZHJlc3MgdGhpcy4KKyAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBhIGxpbWl0YXRpb24gZm9yIEVYUEVDVF9FUSBldmFsdWF0aW9uLgorICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMjsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6SXRlbSogaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+bXV0YWJsZV9tcCgpLT5pbnNlcnQoe3sia2V5X2EiLCAxfSwgeyJrZXlfYiIsIDJ9LCB7ImtleV9jIiwgM319KTsKKyAgaXRlbSA9IG1zZzIuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+bXV0YWJsZV9tcCgpLT5pbnNlcnQoe3sia2V5X2EiLCAxfSwgeyJrZXlfYiIsIDN9LCB7ImtleV9kIiwgNH19KTsKKworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIHN0ZDo6c3RyaW5nIGRpZmY7CisgIGRpZmZlcmVuY2VyLlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoJmRpZmYpOworICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJtb2RpZmllZDogaXRlbVswXS5tcFtrZXlfYl06IDIgLT4gM1xuIgorICAgICAgImFkZGVkOiBpdGVtWzBdLm1wW2tleV9kXTogNFxuIgorICAgICAgImRlbGV0ZWQ6IGl0ZW1bMF0ubXBba2V5X2NdOiAzXG4iLAorICAgICAgZGlmZik7CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6QW55IGFueTEsIGFueTI7CisgIGFueTEuUGFja0Zyb20obXNnMSk7CisgIGFueTIuUGFja0Zyb20obXNnMik7CisgIHN0ZDo6c3RyaW5nIGRpZmZfd2l0aF9hbnk7CisgIGRpZmZlcmVuY2VyLlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoJmRpZmZfd2l0aF9hbnkpOworICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZShhbnkxLCBhbnkyKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJtb2RpZmllZDogaXRlbVswXS5tcFtrZXlfYl06IDIgLT4gM1xuIgorICAgICAgImFkZGVkOiBpdGVtWzBdLm1wW2tleV9kXTogNFxuIgorICAgICAgImRlbGV0ZWQ6IGl0ZW1bMF0ubXBba2V5X2NdOiAzXG4iLAorICAgICAgZGlmZl93aXRoX2FueSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrSWdub3JlZEZpZWxkc1tdID0geyJybS5iIiwgInJtLm0uYiJ9OworCitjbGFzcyBUZXN0SWdub3JlciA6IHB1YmxpYyB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6Oklnbm9yZUNyaXRlcmlhIHsKKyBwdWJsaWM6CisgIGJvb2wgSXNJZ25vcmVkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpTcGVjaWZpY0ZpZWxkPiYKKyAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9maWVsZHMpIG92ZXJyaWRlIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gIiI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRfZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgICBuYW1lICs9IHBhcmVudF9maWVsZHNbaV0uZmllbGQtPm5hbWUoKSArICIuIjsKKyAgICB9CisgICAgbmFtZSArPSBmaWVsZC0+bmFtZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShrSWdub3JlZEZpZWxkcyk7ICsraSkgeworICAgICAgaWYgKG5hbWUuY29tcGFyZShrSWdub3JlZEZpZWxkc1tpXSkgPT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFRyZWF0UmVwZWF0ZWRGaWVsZEFzU2V0V2l0aElnbm9yZWRGaWVsZHMpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisgIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZygicm0geyBhOiAxMVxuIGI6IDEyIH0iLCAmbXNnMSk7CisgIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZygicm0geyBhOiAxMVxuIGI6IDEzIH0iLCAmbXNnMik7CisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXI7CisgIGRpZmZlci5UcmVhdEFzU2V0KEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAicm0iKSk7CisgIGRpZmZlci5BZGRJZ25vcmVDcml0ZXJpYShuZXcgVGVzdElnbm9yZXIpOworICBFWFBFQ1RfVFJVRShkaWZmZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgVHJlYXRSZXBlYXRlZEZpZWxkQXNNYXBXaXRoSWdub3JlZEtleUZpZWxkcykgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMjsKKyAgVGV4dEZvcm1hdDo6TWVyZ2VGcm9tU3RyaW5nKCJybSB7IGE6IDExXG4gbSB7IGE6IDEyXG4gYjogMTNcbiB9IH0iLCAmbXNnMSk7CisgIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZygicm0geyBhOiAxMVxuIG0geyBhOiAxMlxuIGI6IDE0XG4gfSB9IiwgJm1zZzIpOworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyOworICBkaWZmZXIuVHJlYXRBc01hcChHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgInJtIiksCisgICAgICAgICAgICAgICAgICAgIEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAicm0ubSIpKTsKKyAgZGlmZmVyLkFkZElnbm9yZUNyaXRlcmlhKG5ldyBUZXN0SWdub3Jlcik7CisgIEVYUEVDVF9UUlVFKGRpZmZlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKK30KKworLy8gVGFrZXMgdGhlIHByb2R1Y3Qgb2YgYWxsIGVsZW1lbnRzIG9mIGl0ZW0ucmEgYXMgdGhlIGtleSBmb3Iga2V5IGNvbXBhcmlzb24uCitjbGFzcyBWYWx1ZVByb2R1Y3RNYXBLZXlDb21wYXJhdG9yCisgICAgOiBwdWJsaWMgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpNYXBLZXlDb21wYXJhdG9yIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpTcGVjaWZpY0ZpZWxkIFNwZWNpZmljRmllbGQ7CisgIGJvb2wgSXNNYXRjaChjb25zdCBNZXNzYWdlJiBtZXNzYWdlMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZTIsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTcGVjaWZpY0ZpZWxkPiYgcGFyZW50X2ZpZWxkcykgY29uc3Qgb3ZlcnJpZGUgeworICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24xID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOworICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24yID0gbWVzc2FnZTIuR2V0UmVmbGVjdGlvbigpOworICAgIC8vIEZpZWxkRGVzY3JpcHRvciBmb3IgaXRlbS5yYQorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmFfZmllbGQgPQorICAgICAgICBtZXNzYWdlMS5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgicmEiKTsKKyAgICAvLyBHZXQgdGhlIHByb2R1Y3Qgb2YgYWxsIGVsZW1lbnRzIGluIGl0ZW0ucmEKKyAgICBpbnQgcmVzdWx0MSA9IDEsIHJlc3VsdDIgPSAxOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmbGVjdGlvbjEtPkZpZWxkU2l6ZShtZXNzYWdlMSwgcmFfZmllbGQpOyArK2kpIHsKKyAgICAgIHJlc3VsdDEgKj0gcmVmbGVjdGlvbjEtPkdldFJlcGVhdGVkSW50MzIobWVzc2FnZTEsIHJhX2ZpZWxkLCBpKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZsZWN0aW9uMi0+RmllbGRTaXplKG1lc3NhZ2UyLCByYV9maWVsZCk7ICsraSkgeworICAgICAgcmVzdWx0MiAqPSByZWZsZWN0aW9uMi0+R2V0UmVwZWF0ZWRJbnQzMihtZXNzYWdlMiwgcmFfZmllbGQsIGkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0MSA9PSByZXN1bHQyOworICB9Cit9OworCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIFJlcGVhdGVkRmllbGRNYXBUZXN0X0N1c3RvbU1hcEtleUNvbXBhcmF0b3IpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisgIC8vIFRyZWF0ICJpdGVtIiBhcyBNYXAsIHVzaW5nIGN1c3RvbSBrZXkgY29tcGFyYXRvciB0byBkZXRlcm1pbmUgaWYgdHdvCisgIC8vIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUga2V5LgorICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlOjpJdGVtKiBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICBpdGVtLT5hZGRfcmEoNik7CisgIGl0ZW0tPmFkZF9yYSgzNSk7CisgIGl0ZW0tPnNldF9iKCJoZWxsbyIpOworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5hZGRfcmEoMTApOworICBpdGVtLT5hZGRfcmEoMjEpOworICBpdGVtLT5zZXRfYigiaGVsbG8iKTsKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBWYWx1ZVByb2R1Y3RNYXBLZXlDb21wYXJhdG9yIGtleV9jb21wYXJhdG9yOworICBkaWZmZXJlbmNlci5UcmVhdEFzTWFwVXNpbmdLZXlDb21wYXJhdG9yKEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAiaXRlbSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfY29tcGFyYXRvcik7CisgIHN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgZGlmZmVyZW5jZXIuUmVwb3J0RGlmZmVyZW5jZXNUb1N0cmluZygmb3V0cHV0KTsKKyAgLy8gVGhvdWdoIHRoZSBhYm92ZSB0d28gbWVzc2FnZXMgaGF2ZSBkaWZmZXJlbnQgdmFsdWVzIGZvciBpdGVtLnJhLCB0aGV5CisgIC8vIGFyZSByZWdhcmRlZCBhcyBoYXZpbmcgdGhlIHNhbWUga2V5IGJlY2F1c2UgNiAqIDM1ID09IDEwICogMjEuIFRoYXQncworICAvLyBob3cgdGhlIGtleSBjb21wYXJhdG9yIGRldGVybWluZXMgaWYgdGhlIHR3byBoYXZlIHRoZSBzYW1lIGtleS4KKyAgLy8gSG93ZXZlciwgaW4gdmFsdWUgY29tcGFyaXNvbiwgYWxsIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSBhcmUgdGFrZW4gaW50bworICAvLyBjb25zaWRlcmF0aW9uLCBzbyB0aGV5IGFyZSBkaWZmZXJlbnQgYmVjYXVzZSB0aGVpciBpdGVtLnJhIGZpZWxkcyBoYXZlCisgIC8vIGRpZmZlcmVudCB2YWx1ZXMgdXNpbmcgbm9ybWFsIHZhbHVlIGNvbXBhcmlzb24uCisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIm1vZGlmaWVkOiBpdGVtWzBdLnJhWzBdOiA2IC0+IDEwXG4iCisgICAgICAibW9kaWZpZWQ6IGl0ZW1bMF0ucmFbMV06IDM1IC0+IDIxXG4iLAorICAgICAgb3V0cHV0KTsKKyAgZGlmZmVyZW5jZXIuSWdub3JlRmllbGQoR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJpdGVtLnJhIikpOworICBvdXRwdXQuY2xlYXIoKTsKKyAgLy8gaXRlbS5yYSBpcyBpZ25vcmVkIGluIHZhbHVlIGNvbXBhcmlzb24sIHNvIHRoZSB0d28gbWVzc2FnZXMgZXF1YWwuCisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworICBFWFBFQ1RfRVEoImlnbm9yZWQ6IGl0ZW1bMF0ucmFcbiIsIG91dHB1dCk7Cit9CisKKy8vIENvbXBhcmVzIGZpZWxkcyBieSB0aGVpciBpbmRleCBvZmZzZXQgYnkgb25lLCBzbyBpbmRleCAwIG1hdGNoZXMgd2l0aCAxLCBldGMuCitjbGFzcyBPZmZzZXRCeU9uZU1hcEtleUNvbXBhcmF0b3IKKyAgICA6IHB1YmxpYyB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6Ok1hcEtleUNvbXBhcmF0b3IgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OlNwZWNpZmljRmllbGQgU3BlY2lmaWNGaWVsZDsKKyAgYm9vbCBJc01hdGNoKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiBwYXJlbnRfZmllbGRzKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIHBhcmVudF9maWVsZHMuYmFjaygpLmluZGV4ICsgMSA9PSBwYXJlbnRfZmllbGRzLmJhY2soKS5uZXdfaW5kZXg7CisgIH0KK307CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgUmVwZWF0ZWRGaWVsZE1hcFRlc3RfQ3VzdG9tSW5kZXhNYXBLZXlDb21wYXJhdG9yKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cyOworICAvLyBUcmVhdCAiaXRlbSIgYXMgTWFwLCB1c2luZyBjdXN0b20ga2V5IGNvbXBhcmF0b3IgdG8gZGV0ZXJtaW5lIGlmIHR3bworICAvLyBlbGVtZW50cyBoYXZlIHRoZSBzYW1lIGtleS4KKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6SXRlbSogaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+c2V0X2IoIm9uZSIpOworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYigiemVybyIpOworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYigib25lIik7CisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgT2Zmc2V0QnlPbmVNYXBLZXlDb21wYXJhdG9yIGtleV9jb21wYXJhdG9yOworICBkaWZmZXJlbmNlci5UcmVhdEFzTWFwVXNpbmdLZXlDb21wYXJhdG9yKEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAiaXRlbSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfY29tcGFyYXRvcik7CisgIHN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgZGlmZmVyZW5jZXIuUmVwb3J0RGlmZmVyZW5jZXNUb1N0cmluZygmb3V0cHV0KTsKKyAgLy8gV2l0aCB0aGUgb2Zmc2V0IGJ5IG9uZSBjb21wYXJhdG9yIG1zZzEuaXRlbVswXSBzaG91bGQgYmUgY29tcGFyZWQgdG8KKyAgLy8gbXNnMi5pdGVtWzFdIGFuZCB0aHVzIGJlIG1vdmVkLCBtc2cyLml0ZW1bMF0gc2hvdWxkIGJlIG1hcmtlZCBhcyBhZGRlZC4KKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworICBFWFBFQ1RfRVEoCisgICAgICAibW92ZWQ6IGl0ZW1bMF0gLT4gaXRlbVsxXSA6IHsgYjogXCJvbmVcIiB9XG4iCisgICAgICAiYWRkZWQ6IGl0ZW1bMF06IHsgYjogXCJ6ZXJvXCIgfVxuIiwKKyAgICAgIG91dHB1dCk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgUmVwZWF0ZWRGaWVsZFNldFRlc3RfU3Vic2V0KSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cyOworCisgIG1zZzEuYWRkX3J2KDMpOworICBtc2cxLmFkZF9ydig4KTsKKyAgbXNnMS5hZGRfcnYoMik7CisgIG1zZzIuYWRkX3J2KDIpOworICBtc2cyLmFkZF9ydigzKTsKKyAgbXNnMi5hZGRfcnYoNSk7CisgIG1zZzIuYWRkX3J2KDgpOworCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKworICAvLyBGYWlsIHdpdGggb25seSBwYXJ0aWFsIHNjb3BlIHNldC4KKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6UEFSVElBTCk7CisgIGRpZmZlcmVuY2VyLnNldF9yZXBlYXRlZF9maWVsZF9jb21wYXJpc29uKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6QVNfTElTVCk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKworICAvLyBGYWlsIHdpdGggb25seSBzZXQtbGlrZSBjb21wYXJpc29uIHNldC4KKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RlVMTCk7CisgIGRpZmZlcmVuY2VyLnNldF9yZXBlYXRlZF9maWVsZF9jb21wYXJpc29uKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6QVNfU0VUKTsKKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworCisgIC8vIFN1Y2NlZWQgd2l0aCBzY29wZSBhbmQgcmVwZWF0ZWQgZmllbGQgY29tcGFyaXNvbiBzZXQgcHJvcGVybHkuCisgIGRpZmZlcmVuY2VyLnNldF9zY29wZSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OlBBUlRJQUwpOworICBkaWZmZXJlbmNlci5zZXRfcmVwZWF0ZWRfZmllbGRfY29tcGFyaXNvbih1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkFTX1NFVCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIElnbm9yZUZpZWxkX1NpbmdsZSkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEZpZWxkIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RmllbGQgbXNnMjsKKworICBtc2cxLnNldF9jKDMpOworICBtc2cxLmFkZF9yYygxKTsKKworICBtc2cyLnNldF9jKDUpOworICBtc2cyLmFkZF9yYygxKTsKKworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLklnbm9yZUZpZWxkKEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAiYyIpKTsKKworICBFeHBlY3RFcXVhbHNXaXRoRGlmZmVyZW5jZXIoJmRpZmZlcmVuY2VyLCBtc2cxLCBtc2cyKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBJZ25vcmVGaWVsZF9SZXBlYXRlZCkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEZpZWxkIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RmllbGQgbXNnMjsKKworICBtc2cxLnNldF9jKDMpOworICBtc2cxLmFkZF9yYygxKTsKKyAgbXNnMS5hZGRfcmMoMik7CisKKyAgbXNnMi5zZXRfYygzKTsKKyAgbXNnMi5hZGRfcmMoMSk7CisgIG1zZzIuYWRkX3JjKDMpOworCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuSWdub3JlRmllbGQoR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJyYyIpKTsKKworICBFeHBlY3RFcXVhbHNXaXRoRGlmZmVyZW5jZXIoJmRpZmZlcmVuY2VyLCBtc2cxLCBtc2cyKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBJZ25vcmVGaWVsZF9NZXNzYWdlKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cyOworCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RmllbGQqIGZpZWxkOworCisgIGZpZWxkID0gbXNnMS5hZGRfcm0oKTsKKyAgZmllbGQtPnNldF9jKDMpOworCisgIGZpZWxkID0gbXNnMi5hZGRfcm0oKTsKKyAgZmllbGQtPnNldF9jKDQpOworCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuSWdub3JlRmllbGQoR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJybSIpKTsKKworICBFeHBlY3RFcXVhbHNXaXRoRGlmZmVyZW5jZXIoJmRpZmZlcmVuY2VyLCBtc2cxLCBtc2cyKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBJZ25vcmVGaWVsZF9Hcm91cCkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMjsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlOjpJdGVtKiBpdGVtOworCisgIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDMpOworCisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDQpOworCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuSWdub3JlRmllbGQoR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJpdGVtIikpOworCisgIEV4cGVjdEVxdWFsc1dpdGhEaWZmZXJlbmNlcigmZGlmZmVyZW5jZXIsIG1zZzEsIG1zZzIpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIElnbm9yZUZpZWxkX01pc3NpbmcpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RGaWVsZCBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEZpZWxkIG1zZzI7CisKKyAgbXNnMS5zZXRfYygzKTsKKyAgbXNnMS5hZGRfcmMoMSk7CisKKyAgbXNnMi5hZGRfcmMoMSk7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5JZ25vcmVGaWVsZChHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgImMiKSk7CisKKyAgRXhwZWN0RXF1YWxzV2l0aERpZmZlcmVuY2VyKCZkaWZmZXJlbmNlciwgbXNnMSwgbXNnMik7CisgIEV4cGVjdEVxdWFsc1dpdGhEaWZmZXJlbmNlcigmZGlmZmVyZW5jZXIsIG1zZzIsIG1zZzEpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIElnbm9yZUZpZWxkX011bHRpcGxlKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RmllbGQgbXNnMTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RGaWVsZCBtc2cyOworCisgIG1zZzEuc2V0X2MoMyk7CisgIG1zZzEuYWRkX3JjKDEpOworICBtc2cxLmFkZF9yYygyKTsKKworICBtc2cyLnNldF9jKDUpOworICBtc2cyLmFkZF9yYygxKTsKKyAgbXNnMi5hZGRfcmMoMyk7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBjID0gR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJjIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmMgPSBHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgInJjIik7CisKKyAgeyAgLy8gSWdub3JlIGMKKyAgICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgICAgZGlmZmVyZW5jZXIuSWdub3JlRmllbGQoYyk7CisKKyAgICBFWFBFQ1RfRkFMU0UoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisgIH0KKyAgeyAgLy8gSWdub3JlIHJjCisgICAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICAgIGRpZmZlcmVuY2VyLklnbm9yZUZpZWxkKHJjKTsKKworICAgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgfQorICB7ICAvLyBJZ25vcmUgYm90aAorICAgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgICBkaWZmZXJlbmNlci5JZ25vcmVGaWVsZChjKTsKKyAgICBkaWZmZXJlbmNlci5JZ25vcmVGaWVsZChyYyk7CisKKyAgICBFeHBlY3RFcXVhbHNXaXRoRGlmZmVyZW5jZXIoJmRpZmZlcmVuY2VyLCBtc2cxLCBtc2cyKTsKKyAgfQorfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIElnbm9yZUZpZWxkX05lc3RlZE1lc3NhZ2UpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RGaWVsZCogZmllbGQ7CisKKyAgZmllbGQgPSBtc2cxLmFkZF9ybSgpOworICBmaWVsZC0+c2V0X2MoMyk7CisgIGZpZWxkLT5hZGRfcmMoMSk7CisKKyAgZmllbGQgPSBtc2cyLmFkZF9ybSgpOworICBmaWVsZC0+c2V0X2MoNCk7CisgIGZpZWxkLT5hZGRfcmMoMSk7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5JZ25vcmVGaWVsZChHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgInJtLmMiKSk7CisKKyAgRXhwZWN0RXF1YWxzV2l0aERpZmZlcmVuY2VyKCZkaWZmZXJlbmNlciwgbXNnMSwgbXNnMik7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgSWdub3JlRmllbGRfTmVzdGVkR3JvdXApIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6SXRlbSogaXRlbTsKKworICBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYSgzKTsKKyAgaXRlbS0+c2V0X2IoImZvbyIpOworCisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDQpOworICBpdGVtLT5zZXRfYigiZm9vIik7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5JZ25vcmVGaWVsZChHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgIml0ZW0uYSIpKTsKKworICBFeHBlY3RFcXVhbHNXaXRoRGlmZmVyZW5jZXIoJmRpZmZlcmVuY2VyLCBtc2cxLCBtc2cyKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBJZ25vcmVGaWVsZF9JbnNpZGVTZXQpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6SXRlbSogaXRlbTsKKworICBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYSgxKTsKKyAgaXRlbS0+c2V0X2IoImZvbyIpOworICBpdGVtLT5hZGRfcmEoMSk7CisKKyAgaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+c2V0X2EoMik7CisgIGl0ZW0tPnNldF9iKCJiYXIiKTsKKyAgaXRlbS0+YWRkX3JhKDIpOworCisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDIpOworICBpdGVtLT5zZXRfYigiYmFyIik7CisgIGl0ZW0tPmFkZF9yYSgyKTsKKworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYSgxKTsKKyAgaXRlbS0+c2V0X2IoImJheiIpOworICBpdGVtLT5hZGRfcmEoMSk7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBpdGVtX2Rlc2MgPSBHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgIml0ZW0iKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBiID0gR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJpdGVtLmIiKTsKKworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLklnbm9yZUZpZWxkKGIpOworICBkaWZmZXJlbmNlci5UcmVhdEFzU2V0KGl0ZW1fZGVzYyk7CisKKyAgRXhwZWN0RXF1YWxzV2l0aERpZmZlcmVuY2VyKCZkaWZmZXJlbmNlciwgbXNnMSwgbXNnMik7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgSWdub3JlRmllbGRfSW5zaWRlTWFwKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cyOworCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2U6Okl0ZW0qIGl0ZW07CisKKyAgaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+c2V0X2EoMSk7CisgIGl0ZW0tPnNldF9iKCJmb28iKTsKKyAgaXRlbS0+YWRkX3JhKDEpOworCisgIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDIpOworICBpdGVtLT5zZXRfYigiYmFyIik7CisgIGl0ZW0tPmFkZF9yYSgyKTsKKworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYSgyKTsKKyAgaXRlbS0+c2V0X2IoImJhciIpOworICBpdGVtLT5hZGRfcmEoMik7CisKKyAgaXRlbSA9IG1zZzIuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+c2V0X2EoMSk7CisgIGl0ZW0tPnNldF9iKCJiYXoiKTsKKyAgaXRlbS0+YWRkX3JhKDEpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogaXRlbV9kZXNjID0gR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJpdGVtIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYSA9IEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAiaXRlbS5hIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYiA9IEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAiaXRlbS5iIik7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5JZ25vcmVGaWVsZChiKTsKKyAgZGlmZmVyZW5jZXIuVHJlYXRBc01hcChpdGVtX2Rlc2MsIGEpOworCisgIEV4cGVjdEVxdWFsc1dpdGhEaWZmZXJlbmNlcigmZGlmZmVyZW5jZXIsIG1zZzEsIG1zZzIpOworfQorCitURVNUKE1lc3NhZ2VEaWZmZXJlbmNlclRlc3QsIElnbm9yZUZpZWxkX0RvZXNOb3RJZ25vcmVLZXkpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6SXRlbSogaXRlbTsKKworICBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYSgxKTsKKyAgaXRlbS0+c2V0X2IoImZvbyIpOworICBpdGVtLT5hZGRfcmEoMSk7CisKKyAgaXRlbSA9IG1zZzIuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+c2V0X2EoMik7CisgIGl0ZW0tPnNldF9iKCJmb28iKTsKKyAgaXRlbS0+YWRkX3JhKDEpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogaXRlbV9kZXNjID0gR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJpdGVtIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYSA9IEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAiaXRlbS5hIik7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5JZ25vcmVGaWVsZChhKTsKKyAgZGlmZmVyZW5jZXIuVHJlYXRBc01hcChpdGVtX2Rlc2MsIGEpOworCisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKK30KKworVEVTVChNZXNzYWdlRGlmZmVyZW5jZXJUZXN0LCBJZ25vcmVGaWVsZF9UcnVtcHNDb21wYXJlV2l0aEZpZWxkcykgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEZpZWxkIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RmllbGQgbXNnMjsKKworICBtc2cxLnNldF9jKDMpOworICBtc2cxLmFkZF9yYygxKTsKKyAgbXNnMS5hZGRfcmMoMik7CisKKyAgbXNnMi5zZXRfYygzKTsKKyAgbXNnMi5hZGRfcmMoMSk7CisgIG1zZzIuYWRkX3JjKDMpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYyA9IEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAiYyIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJjID0gR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJyYyIpOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgZmllbGRzLnB1c2hfYmFjayhjKTsKKyAgZmllbGRzLnB1c2hfYmFjayhyYyk7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5JZ25vcmVGaWVsZChyYyk7CisKKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RlVMTCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmVXaXRoRmllbGRzKG1zZzEsIG1zZzIsIGZpZWxkcywgZmllbGRzKSk7CisKKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6UEFSVElBTCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmVXaXRoRmllbGRzKG1zZzEsIG1zZzIsIGZpZWxkcywgZmllbGRzKSk7Cit9CisKK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgSWdub3JlRmllbGRfU2V0UmVwb3J0SWdub3Jlc0ZhbHNlKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RmllbGQgbXNnMTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RGaWVsZCBtc2cyOworCisgIG1zZzEuc2V0X2EoMSk7CisgIG1zZzEuc2V0X2IoMik7CisgIG1zZzEuc2V0X2MoMyk7CisgIG1zZzEuYWRkX3JjKDEpOworICBtc2cxLmFkZF9yYygyKTsKKworICBtc2cyLnNldF9hKDEpOworICBtc2cyLnNldF9iKDEpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYSA9IEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAiYSIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGIgPSBHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgImIiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBjID0gR2V0RmllbGREZXNjcmlwdG9yKG1zZzEsICJjIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmMgPSBHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgInJjIik7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBmaWVsZHMucHVzaF9iYWNrKGEpOworICBmaWVsZHMucHVzaF9iYWNrKGIpOworICBmaWVsZHMucHVzaF9iYWNrKGMpOworICBmaWVsZHMucHVzaF9iYWNrKHJjKTsKKworICBzdGQ6OnN0cmluZyBkaWZmX3JlcG9ydDsKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5zZXRfcmVwb3J0X2lnbm9yZXMoZmFsc2UpOworICBkaWZmZXJlbmNlci5zZXRfcmVwb3J0X21hdGNoZXModHJ1ZSk7CisgIGRpZmZlcmVuY2VyLlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoJmRpZmZfcmVwb3J0KTsKKyAgZGlmZmVyZW5jZXIuSWdub3JlRmllbGQoYyk7CisgIGRpZmZlcmVuY2VyLklnbm9yZUZpZWxkKHJjKTsKKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RlVMTCk7CisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlV2l0aEZpZWxkcyhtc2cxLCBtc2cyLCBmaWVsZHMsIGZpZWxkcykpOworCisgIEVYUEVDVF9FUShkaWZmX3JlcG9ydCwKKyAgICAgICAgICAgICJtYXRjaGVkOiBhIDogMVxuIgorICAgICAgICAgICAgIm1vZGlmaWVkOiBiOiAyIC0+IDFcbiIpOworfQorCisKKy8vIFRlc3QgY2xhc3MgdG8gc2F2ZSBhIGNvcHkgb2YgdGhlIGxhc3QgZmllbGRfY29udGV4dC5wYXJlbnRfZmllbGRzKCkgdmVjdG9yCisvLyBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24uCitjbGFzcyBQYXJlbnRTYXZpbmdGaWVsZENvbXBhcmF0b3IgOiBwdWJsaWMgdXRpbDo6RmllbGRDb21wYXJhdG9yIHsKKyBwdWJsaWM6CisgIFBhcmVudFNhdmluZ0ZpZWxkQ29tcGFyYXRvcigpIHt9CisKKyAgQ29tcGFyaXNvblJlc3VsdCBDb21wYXJlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2VfMSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHV0aWw6OkZpZWxkQ29udGV4dCogZmllbGRfY29udGV4dCkgb3ZlcnJpZGUgeworICAgIGlmIChmaWVsZF9jb250ZXh0KSBwYXJlbnRfZmllbGRzXyA9ICooZmllbGRfY29udGV4dC0+cGFyZW50X2ZpZWxkcygpKTsKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIHJldHVybiBSRUNVUlNFOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gU0FNRTsKKyAgICB9CisgIH0KKworICBzdGQ6OnZlY3Rvcjx1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OlNwZWNpZmljRmllbGQ+IHBhcmVudF9maWVsZHMoKSB7CisgICAgcmV0dXJuIHBhcmVudF9maWVsZHNfOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnZlY3Rvcjx1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OlNwZWNpZmljRmllbGQ+IHBhcmVudF9maWVsZHNfOworfTsKKworLy8gVGVzdHMgaWYgTWVzc2FnZURpZmZlcmVuY2VyIHNlbmRzIHRoZSBwYXJlbnQgZmllbGRzIGluIHRoZSBGaWVsZENvbnRleHQKKy8vIHBhcmFtZXRlci4KK1RFU1QoTWVzc2FnZURpZmZlcmVuY2VyVGVzdCwgRmllbGRDb250ZXh0UGFyZW50RmllbGRzVGVzdCkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzE7CisgIG1zZzEuYWRkX3JtKCktPnNldF9jKDEpOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisgIG1zZzIuYWRkX3JtKCktPnNldF9jKDEpOworCisgIFBhcmVudFNhdmluZ0ZpZWxkQ29tcGFyYXRvciBmaWVsZF9jb21wYXJhdG9yOworICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLnNldF9maWVsZF9jb21wYXJhdG9yKCZmaWVsZF9jb21wYXJhdG9yKTsKKyAgZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKTsKKworICAvLyBXZSB3YW50IG9ubHkgb25lIHBhcmVudCB3aXRoIHRoZSBuYW1lICJybSIKKyAgQVNTRVJUX0VRKDEsIGZpZWxkX2NvbXBhcmF0b3IucGFyZW50X2ZpZWxkcygpLnNpemUoKSk7CisgIEVYUEVDVF9FUSgicm0iLCBmaWVsZF9jb21wYXJhdG9yLnBhcmVudF9maWVsZHMoKVswXS5maWVsZC0+bmFtZSgpKTsKK30KKworCitjbGFzcyBDb21wYXJpc29uVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIENvbXBhcmlzb25UZXN0KCkgOiB1c2VfZXF1aXZhbGVuY3lfKGZhbHNlKSwgcmVwZWF0ZWRfZmllbGRfYXNfc2V0XyhmYWxzZSkgeworICAgIC8vIFNldHVwIHRoZSB0ZXN0LgorICAgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJnByb3RvMV8pOworICAgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJnByb3RvMl8pOworCisgICAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJnByb3RvMWV4Xyk7CisgICAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJnByb3RvMmV4Xyk7CisKKyAgICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzQW5kRXh0ZW5zaW9ucygmb3JkZXJpbmdzX3Byb3RvMV8pOworICAgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKCZvcmRlcmluZ3NfcHJvdG8yXyk7CisKKyAgICB1bmtub3duMV8gPSBlbXB0eTFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKKyAgICB1bmtub3duMl8gPSBlbXB0eTJfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKKyAgfQorCisgIH5Db21wYXJpc29uVGVzdCgpIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBTZXRTcGVjaWFsRmllbGRPcHRpb24oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyKiBkKSB7CisgICAgaWYgKCFpZ25vcmVkX2ZpZWxkXy5lbXB0eSgpKSB7CisgICAgICBkLT5JZ25vcmVGaWVsZChHZXRGaWVsZERlc2NyaXB0b3IobWVzc2FnZSwgaWdub3JlZF9maWVsZF8pKTsKKyAgICB9CisKKyAgICBpZiAocmVwZWF0ZWRfZmllbGRfYXNfc2V0XykgeworICAgICAgZC0+c2V0X3JlcGVhdGVkX2ZpZWxkX2NvbXBhcmlzb24odXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpBU19TRVQpOworICAgIH0KKworICAgIGlmICghc2V0X2ZpZWxkXy5lbXB0eSgpKSB7CisgICAgICBkLT5UcmVhdEFzU2V0KEdldEZpZWxkRGVzY3JpcHRvcihtZXNzYWdlLCBzZXRfZmllbGRfKSk7CisgICAgfQorCisgICAgaWYgKCFtYXBfZmllbGRfLmVtcHR5KCkgJiYgIW1hcF9rZXlfLmVtcHR5KCkpIHsKKyAgICAgIGQtPlRyZWF0QXNNYXAoR2V0RmllbGREZXNjcmlwdG9yKG1lc3NhZ2UsIG1hcF9maWVsZF8pLAorICAgICAgICAgICAgICAgICAgICBHZXRGaWVsZERlc2NyaXB0b3IobWVzc2FnZSwgbWFwX2ZpZWxkXyArICIuIiArIG1hcF9rZXlfKSk7CisgICAgfQorICB9CisKKyAgc3RkOjpzdHJpbmcgUnVuKGNvbnN0IE1lc3NhZ2UmIG1zZzEsIGNvbnN0IE1lc3NhZ2UmIG1zZzIpIHsKKyAgICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisKKyAgICAvLyBTZXR1cCB0aGUgY29tcGFyaXNvbi4KKyAgICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgICAgZGlmZmVyZW5jZXIuUmVwb3J0RGlmZmVyZW5jZXNUb1N0cmluZygmb3V0cHV0KTsKKworICAgIGlmICh1c2VfZXF1aXZhbGVuY3lfKSB7CisgICAgICBkaWZmZXJlbmNlci5zZXRfbWVzc2FnZV9maWVsZF9jb21wYXJpc29uKAorICAgICAgICAgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RVFVSVZBTEVOVCk7CisgICAgfQorCisgICAgU2V0U3BlY2lhbEZpZWxkT3B0aW9uKG1zZzEsICZkaWZmZXJlbmNlcik7CisKKyAgICAvLyBDb25kdWN0IHRoZSBjb21wYXJpc29uLgorICAgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKworICAgIHJldHVybiBvdXRwdXQ7CisgIH0KKworICBzdGQ6OnN0cmluZyBSdW4oKSB7IHJldHVybiBSdW4ocHJvdG8xXywgcHJvdG8yXyk7IH0KKworICBzdGQ6OnN0cmluZyBSdW5PcmRlcigpIHsgcmV0dXJuIFJ1bihvcmRlcmluZ3NfcHJvdG8xXywgb3JkZXJpbmdzX3Byb3RvMl8pOyB9CisKKyAgc3RkOjpzdHJpbmcgUnVuRXgoKSB7IHJldHVybiBSdW4ocHJvdG8xZXhfLCBwcm90bzJleF8pOyB9CisKKyAgc3RkOjpzdHJpbmcgUnVuRGlmZigpIHsgcmV0dXJuIFJ1bihwcm90bzFkaWZmXywgcHJvdG8yZGlmZl8pOyB9CisKKyAgc3RkOjpzdHJpbmcgUnVuVW4oKSB7IHJldHVybiBSdW4oZW1wdHkxXywgZW1wdHkyXyk7IH0KKworICB2b2lkIHVzZV9lcXVpdmFsZW5jeSgpIHsgdXNlX2VxdWl2YWxlbmN5XyA9IHRydWU7IH0KKworICB2b2lkIHJlcGVhdGVkX2ZpZWxkX2FzX3NldCgpIHsgcmVwZWF0ZWRfZmllbGRfYXNfc2V0XyA9IHRydWU7IH0KKworICB2b2lkIGZpZWxkX2FzX3NldChjb25zdCBzdGQ6OnN0cmluZyYgZmllbGQpIHsgc2V0X2ZpZWxkXyA9IGZpZWxkOyB9CisKKyAgdm9pZCBmaWVsZF9hc19tYXAoY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7CisgICAgbWFwX2ZpZWxkXyA9IGZpZWxkOworICAgIG1hcF9rZXlfID0ga2V5OworICB9CisKKyAgdm9pZCBpZ25vcmVfZmllbGQoY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkKSB7IGlnbm9yZWRfZmllbGRfID0gZmllbGQ7IH0KKworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIHByb3RvMV87CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgcHJvdG8yXzsKKworICB1bml0dGVzdDo6VGVzdEZpZWxkT3JkZXJpbmdzIG9yZGVyaW5nc19wcm90bzFfOworICB1bml0dGVzdDo6VGVzdEZpZWxkT3JkZXJpbmdzIG9yZGVyaW5nc19wcm90bzJfOworCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBwcm90bzFleF87CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBwcm90bzJleF87CisKKyAgdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBwcm90bzFkaWZmXzsKKyAgdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBwcm90bzJkaWZmXzsKKworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBlbXB0eTFfOworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBlbXB0eTJfOworCisgIHVuaXR0ZXN0OjpUZXN0TWFwIG1hcF9wcm90bzFfOworICB1bml0dGVzdDo6VGVzdE1hcCBtYXBfcHJvdG8yXzsKKworICBVbmtub3duRmllbGRTZXQqIHVua25vd24xXzsKKyAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duMl87CisKKyAgYm9vbCB1c2VfZXF1aXZhbGVuY3lfOworICBib29sIHJlcGVhdGVkX2ZpZWxkX2FzX3NldF87CisKKyAgc3RkOjpzdHJpbmcgc2V0X2ZpZWxkXzsKKyAgc3RkOjpzdHJpbmcgbWFwX2ZpZWxkXzsKKyAgc3RkOjpzdHJpbmcgbWFwX2tleV87CisgIHN0ZDo6c3RyaW5nIGlnbm9yZWRfZmllbGRfOworfTsKKworLy8gQmFzaWMgdGVzdHMuCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIEFkZGl0aW9uVGVzdCkgeworICBwcm90bzFfLmNsZWFyX29wdGlvbmFsX2ludDMyKCk7CisKKyAgRVhQRUNUX0VRKCJhZGRlZDogb3B0aW9uYWxfaW50MzI6IDEwMVxuIiwgUnVuKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIEFkZGl0aW9uX09yZGVyVGVzdCkgeworICBvcmRlcmluZ3NfcHJvdG8xXy5jbGVhcl9teV9pbnQoKTsKKworICBFWFBFQ1RfRVEoImFkZGVkOiBteV9pbnQ6IDFcbiIsIFJ1bk9yZGVyKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIERlbGV0aW9uVGVzdCkgeworICBwcm90bzJfLmNsZWFyX29wdGlvbmFsX2ludDMyKCk7CisKKyAgRVhQRUNUX0VRKCJkZWxldGVkOiBvcHRpb25hbF9pbnQzMjogMTAxXG4iLCBSdW4oKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgRGVsZXRpb25fT3JkZXJUZXN0KSB7CisgIG9yZGVyaW5nc19wcm90bzJfLmNsZWFyX215X3N0cmluZygpOworCisgIEVYUEVDVF9FUSgiZGVsZXRlZDogbXlfc3RyaW5nOiBcImZvb1wiXG4iLCBSdW5PcmRlcigpKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBSZXBlYXRlZERlbGV0aW9uVGVzdCkgeworICBwcm90bzJfLmNsZWFyX3JlcGVhdGVkX2ludDMyKCk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgImRlbGV0ZWQ6IHJlcGVhdGVkX2ludDMyWzBdOiAyMDFcbiIKKyAgICAgICJkZWxldGVkOiByZXBlYXRlZF9pbnQzMlsxXTogMzAxXG4iLAorICAgICAgUnVuKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIE1vZGlmaWNhdGlvblRlc3QpIHsKKyAgcHJvdG8xXy5zZXRfb3B0aW9uYWxfaW50MzIoLTEpOworCisgIEVYUEVDVF9FUSgibW9kaWZpZWQ6IG9wdGlvbmFsX2ludDMyOiAtMSAtPiAxMDFcbiIsIFJ1bigpKTsKK30KKworLy8gQmFzaWMgZXF1aXZhbGVuY3kgdGVzdHMuCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIEVxdWl2YWxlbmN5QWRkaXRpb25UZXN0KSB7CisgIHVzZV9lcXVpdmFsZW5jeSgpOworCisgIHByb3RvMV8uY2xlYXJfb3B0aW9uYWxfaW50MzIoKTsKKworICBFWFBFQ1RfRVEoIm1vZGlmaWVkOiBvcHRpb25hbF9pbnQzMjogMCAtPiAxMDFcbiIsIFJ1bigpKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBFcXVpdmFsZW5jeURlbGV0aW9uVGVzdCkgeworICB1c2VfZXF1aXZhbGVuY3koKTsKKworICBwcm90bzJfLmNsZWFyX29wdGlvbmFsX2ludDMyKCk7CisKKyAgRVhQRUNUX0VRKCJtb2RpZmllZDogb3B0aW9uYWxfaW50MzI6IDEwMSAtPiAwXG4iLCBSdW4oKSk7Cit9CisKKy8vIEdyb3VwIHRlc3RzLgorVEVTVF9GKENvbXBhcmlzb25UZXN0LCBHcm91cEFkZGl0aW9uVGVzdCkgeworICBwcm90bzFfLm11dGFibGVfb3B0aW9uYWxncm91cCgpLT5jbGVhcl9hKCk7CisKKyAgRVhQRUNUX0VRKCJhZGRlZDogb3B0aW9uYWxncm91cC5hOiAxMTdcbiIsIFJ1bigpKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBHcm91cERlbGV0aW9uVGVzdCkgeworICBwcm90bzJfLm11dGFibGVfb3B0aW9uYWxncm91cCgpLT5jbGVhcl9hKCk7CisKKyAgRVhQRUNUX0VRKCJkZWxldGVkOiBvcHRpb25hbGdyb3VwLmE6IDExN1xuIiwgUnVuKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIEdyb3VwTW9kaWZpY2F0aW9uVGVzdCkgeworICBwcm90bzFfLm11dGFibGVfb3B0aW9uYWxncm91cCgpLT5zZXRfYSgyKTsKKworICBFWFBFQ1RfRVEoIm1vZGlmaWVkOiBvcHRpb25hbGdyb3VwLmE6IDIgLT4gMTE3XG4iLCBSdW4oKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgR3JvdXBGdWxsQWRkaXRpb25UZXN0KSB7CisgIHByb3RvMV8uY2xlYXJfb3B0aW9uYWxncm91cCgpOworCisgIC8vIE5vdGUgdGhlIGRpZmZlcmVuY2UgaW4gdGhlIG91dHB1dCBiZXR3ZWVuIHRoaXMgYW5kIEdyb3VwQWRkaXRpb25UZXN0LgorICBFWFBFQ1RfRVEoImFkZGVkOiBvcHRpb25hbGdyb3VwOiB7IGE6IDExNyB9XG4iLCBSdW4oKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgR3JvdXBGdWxsRGVsZXRpb25UZXN0KSB7CisgIHByb3RvMl8uY2xlYXJfb3B0aW9uYWxncm91cCgpOworCisgIEVYUEVDVF9FUSgiZGVsZXRlZDogb3B0aW9uYWxncm91cDogeyBhOiAxMTcgfVxuIiwgUnVuKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIFJlcGVhdGVkU2V0T3B0aW9uVGVzdCkgeworICByZXBlYXRlZF9maWVsZF9hc19zZXQoKTsKKworICBwcm90bzJfLmNsZWFyX3JlcGVhdGVkZ3JvdXAoKTsKKyAgcHJvdG8xXy5jbGVhcl9yZXBlYXRlZGdyb3VwKCk7CisgIHByb3RvMV8uYWRkX3JlcGVhdGVkZ3JvdXAoKS0+c2V0X2EoMzE3KTsKKyAgcHJvdG8yXy5hZGRfcmVwZWF0ZWRncm91cCgpLT5zZXRfYSg5MDkpOworICBwcm90bzJfLmFkZF9yZXBlYXRlZGdyb3VwKCktPnNldF9hKDkwNyk7CisgIHByb3RvMV8uYWRkX3JlcGVhdGVkZ3JvdXAoKS0+c2V0X2EoOTA0KTsKKyAgcHJvdG8xXy5hZGRfcmVwZWF0ZWRncm91cCgpLT5zZXRfYSg5MDcpOworICBwcm90bzFfLmFkZF9yZXBlYXRlZGdyb3VwKCktPnNldF9hKDkwOSk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgIm1vdmVkOiByZXBlYXRlZGdyb3VwWzJdIC0+IHJlcGVhdGVkZ3JvdXBbMV0gOiB7IGE6IDkwNyB9XG4iCisgICAgICAibW92ZWQ6IHJlcGVhdGVkZ3JvdXBbM10gLT4gcmVwZWF0ZWRncm91cFswXSA6IHsgYTogOTA5IH1cbiIKKyAgICAgICJkZWxldGVkOiByZXBlYXRlZGdyb3VwWzBdOiB7IGE6IDMxNyB9XG4iCisgICAgICAiZGVsZXRlZDogcmVwZWF0ZWRncm91cFsxXTogeyBhOiA5MDQgfVxuIiwKKyAgICAgIFJ1bigpKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBSZXBlYXRlZFNldE9wdGlvblRlc3RfRXgpIHsKKyAgcmVwZWF0ZWRfZmllbGRfYXNfc2V0KCk7CisKKyAgcHJvdG8xZXhfLkNsZWFyRXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pOworICBwcm90bzJleF8uQ2xlYXJFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbik7CisgIHByb3RvMmV4Xy5BZGRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgIC0+c2V0X2JiKDkwOSk7CisgIHByb3RvMmV4Xy5BZGRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgIC0+c2V0X2JiKDkwNyk7CisgIHByb3RvMWV4Xy5BZGRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgIC0+c2V0X2JiKDkwNCk7CisgIHByb3RvMWV4Xy5BZGRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgIC0+c2V0X2JiKDkwNyk7CisgIHByb3RvMWV4Xy5BZGRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgIC0+c2V0X2JiKDkwOSk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgIm1vdmVkOiAocHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKVsyXSAtPiIKKyAgICAgICIgKHByb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbilbMF0gOiIKKyAgICAgICIgeyBiYjogOTA5IH1cbiIKKyAgICAgICJkZWxldGVkOiAocHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKVswXToiCisgICAgICAiIHsgYmI6IDkwNCB9XG4iLAorICAgICAgUnVuRXgoKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgUmVwZWF0ZWRNYXBGaWVsZFRlc3RfR3JvdXApIHsKKyAgZmllbGRfYXNfbWFwKCJyZXBlYXRlZGdyb3VwIiwgImEiKTsKKyAgcHJvdG8xXy5jbGVhcl9yZXBlYXRlZGdyb3VwKCk7CisgIHByb3RvMl8uY2xlYXJfcmVwZWF0ZWRncm91cCgpOworCisgIHByb3RvMV8uYWRkX3JlcGVhdGVkZ3JvdXAoKS0+c2V0X2EoMzE3KTsgIC8vIGRlbGV0ZWQKKyAgcHJvdG8xXy5hZGRfcmVwZWF0ZWRncm91cCgpLT5zZXRfYSg5MDQpOyAgLy8gZGVsZXRlZAorICBwcm90bzFfLmFkZF9yZXBlYXRlZGdyb3VwKCktPnNldF9hKDkwNyk7ICAvLyBtb3ZlZCBmcm9tCisgIHByb3RvMV8uYWRkX3JlcGVhdGVkZ3JvdXAoKS0+c2V0X2EoOTA5KTsgIC8vIG1vdmVkIGZyb20KKworICBwcm90bzJfLmFkZF9yZXBlYXRlZGdyb3VwKCktPnNldF9hKDkwOSk7ICAvLyBtb3ZlZCB0bworICBwcm90bzJfLmFkZF9yZXBlYXRlZGdyb3VwKCktPnNldF9hKDMxOCk7ICAvLyBhZGRlZAorICBwcm90bzJfLmFkZF9yZXBlYXRlZGdyb3VwKCktPnNldF9hKDkwNyk7ICAvLyBtb3ZlZCB0bworCisgIEVYUEVDVF9FUSgKKyAgICAgICJtb3ZlZDogcmVwZWF0ZWRncm91cFszXSAtPiByZXBlYXRlZGdyb3VwWzBdIDogeyBhOiA5MDkgfVxuIgorICAgICAgImFkZGVkOiByZXBlYXRlZGdyb3VwWzFdOiB7IGE6IDMxOCB9XG4iCisgICAgICAiZGVsZXRlZDogcmVwZWF0ZWRncm91cFswXTogeyBhOiAzMTcgfVxuIgorICAgICAgImRlbGV0ZWQ6IHJlcGVhdGVkZ3JvdXBbMV06IHsgYTogOTA0IH1cbiIsCisgICAgICBSdW4oKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgUmVwZWF0ZWRNYXBGaWVsZFRlc3RfTWVzc2FnZUtleSkgeworICAvLyBVc2UgbSBhcyBrZXksIGJ1dCB1c2UgYiBhcyB2YWx1ZS4KKyAgZmllbGRfYXNfbWFwKCJpdGVtIiwgIm0iKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMjsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6SXRlbSogaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKworICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgY3JlYXRlcyBvbmUgZGVsZXRpb24sIG9uZSBhZGRpdGlvbiBhbmQgdHdvIG1vdmVkIGZpZWxkcworICAvLyBvbiB0aGUgbWVzc2FnZXMuCisgIGl0ZW0tPm11dGFibGVfbSgpLT5zZXRfYygwKTsKKyAgaXRlbS0+c2V0X2IoImZpcnN0Iik7CisgIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIGl0ZW0tPm11dGFibGVfbSgpLT5zZXRfYygyKTsKKyAgaXRlbS0+c2V0X2IoInNlY29uZCIpOworICBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYigibnVsbCIpOyAgLy8gZW1wdHkga2V5IG1vdmVkCisgIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIGl0ZW0tPm11dGFibGVfbSgpLT5zZXRfYygzKTsKKyAgaXRlbS0+c2V0X2IoInRoaXJkIik7ICAvLyBkZWxldGlvbgorICBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICBpdGVtLT5tdXRhYmxlX20oKS0+c2V0X2MoMik7CisgIGl0ZW0tPnNldF9iKCJzZWNvbmQiKTsgIC8vIGR1cGxpY2F0ZWQga2V5ICggZGVsZXRpb24gKQorICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5tdXRhYmxlX20oKS0+c2V0X2MoMik7CisgIGl0ZW0tPnNldF9iKCJzZWNvbmQiKTsgIC8vIG1vZGlmaWNhdGlvbgorICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5tdXRhYmxlX20oKS0+c2V0X2MoNCk7CisgIGl0ZW0tPnNldF9iKCJmb3VydGgiKTsgIC8vIGFkZGl0aW9uCisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPm11dGFibGVfbSgpLT5zZXRfYygwKTsKKyAgaXRlbS0+c2V0X2IoImZpc3QiKTsgIC8vIG1vdmUgd2l0aCBjaGFuZ2UKKyAgaXRlbSA9IG1zZzIuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+c2V0X2IoIm51bGwiKTsKKworICBFWFBFQ1RfRVEoCisgICAgICAibW9kaWZpZWQ6IGl0ZW1bMF0uYiAtPiBpdGVtWzJdLmI6IFwiZmlyc3RcIiAtPiBcImZpc3RcIlxuIgorICAgICAgIm1vdmVkOiBpdGVtWzFdIC0+IGl0ZW1bMF0gOiB7IGI6IFwic2Vjb25kXCIgbSB7IGM6IDIgfSB9XG4iCisgICAgICAibW92ZWQ6IGl0ZW1bMl0gLT4gaXRlbVszXSA6IHsgYjogXCJudWxsXCIgfVxuIgorICAgICAgImFkZGVkOiBpdGVtWzFdOiB7IGI6IFwiZm91cnRoXCIgbSB7IGM6IDQgfSB9XG4iCisgICAgICAiZGVsZXRlZDogaXRlbVszXTogeyBiOiBcInRoaXJkXCIgbSB7IGM6IDMgfSB9XG4iCisgICAgICAiZGVsZXRlZDogaXRlbVs0XTogeyBiOiBcInNlY29uZFwiIG0geyBjOiAyIH0gfVxuIiwKKyAgICAgIFJ1bihtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgUmVwZWF0ZWRGaWVsZFNldFRlc3RfU2V0T2ZTZXQpIHsKKyAgcmVwZWF0ZWRfZmllbGRfYXNfc2V0KCk7CisgIC8vIENyZWF0ZSB0aGUgdGVzdGluZyBwcm90b3MKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIG1zZzI7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6SXRlbSogaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+YWRkX3JhKDEpOworICBpdGVtLT5hZGRfcmEoMik7CisgIGl0ZW0tPmFkZF9yYSgzKTsKKyAgaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+YWRkX3JhKDUpOworICBpdGVtLT5hZGRfcmEoNik7CisgIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIGl0ZW0tPmFkZF9yYSgxKTsKKyAgaXRlbS0+YWRkX3JhKDMpOworICBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICBpdGVtLT5hZGRfcmEoNik7CisgIGl0ZW0tPmFkZF9yYSg3KTsKKyAgaXRlbS0+YWRkX3JhKDgpOworCisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPmFkZF9yYSg2KTsKKyAgaXRlbS0+YWRkX3JhKDUpOworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5hZGRfcmEoNik7CisgIGl0ZW0tPmFkZF9yYSg4KTsKKyAgaXRlbSA9IG1zZzIuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+YWRkX3JhKDEpOworICBpdGVtLT5hZGRfcmEoMyk7CisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPmFkZF9yYSgzKTsKKyAgaXRlbS0+YWRkX3JhKDIpOworICBpdGVtLT5hZGRfcmEoMSk7CisKKyAgLy8gQ29tcGFyZQorICBFWFBFQ1RfRVEoCisgICAgICAibW92ZWQ6IGl0ZW1bMF0ucmFbMF0gLT4gaXRlbVszXS5yYVsyXSA6IDFcbiIKKyAgICAgICJtb3ZlZDogaXRlbVswXS5yYVsyXSAtPiBpdGVtWzNdLnJhWzBdIDogM1xuIgorICAgICAgIm1vdmVkOiBpdGVtWzBdIC0+IGl0ZW1bM10gOiB7IHJhOiAxIHJhOiAyIHJhOiAzIH1cbiIKKyAgICAgICJtb3ZlZDogaXRlbVsxXS5yYVswXSAtPiBpdGVtWzBdLnJhWzFdIDogNVxuIgorICAgICAgIm1vdmVkOiBpdGVtWzFdLnJhWzFdIC0+IGl0ZW1bMF0ucmFbMF0gOiA2XG4iCisgICAgICAibW92ZWQ6IGl0ZW1bMV0gLT4gaXRlbVswXSA6IHsgcmE6IDUgcmE6IDYgfVxuIgorICAgICAgImFkZGVkOiBpdGVtWzFdOiB7IHJhOiA2IHJhOiA4IH1cbiIKKyAgICAgICJkZWxldGVkOiBpdGVtWzNdOiB7IHJhOiA2IHJhOiA3IHJhOiA4IH1cbiIsCisgICAgICBSdW4obXNnMSwgbXNnMikpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIFJlcGVhdGVkTWFwRmllbGRUZXN0X1JlcGVhdGVkS2V5KSB7CisgIC8vIHVzZWQgcmIgYXMgYSBrZXksIGJ1dCBiIGlzIHRoZSB2YWx1ZS4KKyAgcmVwZWF0ZWRfZmllbGRfYXNfc2V0KCk7CisgIGZpZWxkX2FzX21hcCgiaXRlbSIsICJyYiIpOworCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cyOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlOjpJdGVtKiBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICBpdGVtLT5hZGRfcmIoImEiKTsKKyAgaXRlbS0+YWRkX3JiKCJiIik7CisgIGl0ZW0tPnNldF9iKCJmaXJzdCIpOworCisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPmFkZF9yYigiYyIpOworICBpdGVtLT5zZXRfYigic2Vjb25kIik7CisKKyAgaXRlbSA9IG1zZzIuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+YWRkX3JiKCJiIik7CisgIGl0ZW0tPmFkZF9yYigiYSIpOworICBpdGVtLT5zZXRfYigiZmlzdCIpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJtb2RpZmllZDogaXRlbVswXS5iIC0+IGl0ZW1bMV0uYjogXCJmaXJzdFwiIC0+IFwiZmlzdFwiXG4iCisgICAgICAibW92ZWQ6IGl0ZW1bMF0ucmJbMF0gLT4gaXRlbVsxXS5yYlsxXSA6IFwiYVwiXG4iCisgICAgICAibW92ZWQ6IGl0ZW1bMF0ucmJbMV0gLT4gaXRlbVsxXS5yYlswXSA6IFwiYlwiXG4iCisgICAgICAiYWRkZWQ6IGl0ZW1bMF06IHsgYjogXCJzZWNvbmRcIiByYjogXCJjXCIgfVxuIiwKKyAgICAgIFJ1bihtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgUmVwZWF0ZWRNYXBGaWVsZFRlc3RfUmVwZWF0ZWRNZXNzYWdlS2V5KSB7CisgIGZpZWxkX2FzX21hcCgiaXRlbSIsICJybSIpOworCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cyOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlOjpJdGVtKiBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEZpZWxkKiBrZXkgPSBpdGVtLT5hZGRfcm0oKTsKKyAga2V5LT5zZXRfYygyKTsKKyAga2V5LT5hZGRfcmMoMTApOworICBrZXktPmFkZF9yYygxMCk7CisgIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIGtleSA9IGl0ZW0tPmFkZF9ybSgpOworICBrZXktPnNldF9jKDApOworICBrZXktPmFkZF9yYygxKTsKKyAga2V5LT5hZGRfcmMoMik7CisgIGtleSA9IGl0ZW0tPmFkZF9ybSgpOworICBrZXktPnNldF9jKDApOworICBpdGVtLT5hZGRfcmIoImZpcnN0Iik7CisKKyAgaXRlbSA9IG1zZzIuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+Q29weUZyb20obXNnMS5pdGVtKDEpKTsKKyAgaXRlbS0+YWRkX3JiKCJzZWNvbmQiKTsKKworICBFWFBFQ1RfRVEoCisgICAgICAiYWRkZWQ6IGl0ZW1bMF0ucmJbMV06IFwic2Vjb25kXCJcbiIKKyAgICAgICJkZWxldGVkOiBpdGVtWzBdOiB7IHJtIHsgYzogMiByYzogMTAgcmM6IDEwIH0gfVxuIiwKKyAgICAgIFJ1bihtc2cxLCBtc2cyKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgUmVwZWF0ZWRTZXRPcHRpb25UZXN0X1Vua25vd24pIHsKKyAgLy8gQ3VycmVudGx5LCBhc19zZXQgb3B0aW9uIGRvZXNuJ3QgaGF2ZSBhZmZlY3RzIG9uIHVua25vd24gZmllbGQuCisgIC8vIElmIG5lZWRlZCwgdGhpcyBmZWF0dXJlIHdpbGwgYmUgYWRkZWQgYnkgcmVxdWVzdC4KKyAgcmVwZWF0ZWRfZmllbGRfYXNfc2V0KCk7CisgIHVua25vd24xXy0+QWRkR3JvdXAoMjQ1KS0+QWRkRml4ZWQzMigyNDgsIDEpOworICB1bmtub3duMl8tPkFkZEdyb3VwKDI0NSktPkFkZEZpeGVkMzIoMjQ4LCAzKTsKKyAgdW5rbm93bjJfLT5BZGRHcm91cCgyNDUpLT5BZGRGaXhlZDMyKDI0OCwgMSk7CisKKyAgLy8gV2UgZXhwZWN0IGl0IGJlaGF2ZXMgdGhlIHNhbWUgYXMgbm9ybWFsIGNvbXBhcmlzb24uCisgIEVYUEVDVF9FUSgKKyAgICAgICJtb2RpZmllZDogMjQ1WzBdLjI0OFswXTogMHgwMDAwMDAwMSAtPiAweDAwMDAwMDAzXG4iCisgICAgICAiYWRkZWQ6IDI0NVsxXTogeyAuLi4gfVxuIiwKKyAgICAgIFJ1blVuKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIE1hdGNoaW5nX1Vua25vd24pIHsKKyAgdW5rbm93bjFfLT5BZGRHcm91cCgyNDUpLT5BZGRGaXhlZDMyKDI0OCwgMSk7CisgIHVua25vd24yXy0+QWRkR3JvdXAoMjQ1KS0+QWRkRml4ZWQzMigyNDgsIDEpOworICB1bmtub3duMV8tPkFkZEdyb3VwKDI0NSktPkFkZEZpeGVkMzIoMjQ4LCAzKTsKKyAgdW5rbm93bjJfLT5BZGRHcm91cCgyNDUpLT5BZGRGaXhlZDMyKDI0OCwgMyk7CisgIHVua25vd24yXy0+QWRkTGVuZ3RoRGVsaW1pdGVkKDI0MiwgImNhdCIpOworICB1bmtub3duMl8tPkFkZEdyb3VwKDI0NiktPkFkZEZpeGVkMzIoMjQ4LCA0KTsKKworICAvLyByZXBvcnRfbWF0Y2ggaXMgZmFsc2Ugc28gb25seSBhZGRlZC9tb2RpZmllZCBmaWVsZHMgYXJlIGV4cGVjdGVkLgorICBFWFBFQ1RfRVEoCisgICAgICAiYWRkZWQ6IDI0MlswXTogXCJjYXRcIlxuIgorICAgICAgImFkZGVkOiAyNDZbMF06IHsgLi4uIH1cbiIsCisgICAgICBSdW5VbigpKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBSZXBlYXRlZFNldEZpZWxkVGVzdCkgeworICBmaWVsZF9hc19zZXQoInJlcGVhdGVkZ3JvdXAiKTsKKworICBwcm90bzFfLmNsZWFyX3JlcGVhdGVkZ3JvdXAoKTsKKyAgcHJvdG8yXy5jbGVhcl9yZXBlYXRlZGdyb3VwKCk7CisgIHByb3RvMl8uYWRkX3JlcGVhdGVkZ3JvdXAoKS0+c2V0X2EoOTA5KTsKKyAgcHJvdG8yXy5hZGRfcmVwZWF0ZWRncm91cCgpLT5zZXRfYSg5MDcpOworICBwcm90bzFfLmFkZF9yZXBlYXRlZGdyb3VwKCktPnNldF9hKDMxNyk7CisgIHByb3RvMV8uYWRkX3JlcGVhdGVkZ3JvdXAoKS0+c2V0X2EoOTA0KTsKKyAgcHJvdG8xXy5hZGRfcmVwZWF0ZWRncm91cCgpLT5zZXRfYSg5MDcpOworICBwcm90bzFfLmFkZF9yZXBlYXRlZGdyb3VwKCktPnNldF9hKDkwOSk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgIm1vdmVkOiByZXBlYXRlZGdyb3VwWzJdIC0+IHJlcGVhdGVkZ3JvdXBbMV0gOiB7IGE6IDkwNyB9XG4iCisgICAgICAibW92ZWQ6IHJlcGVhdGVkZ3JvdXBbM10gLT4gcmVwZWF0ZWRncm91cFswXSA6IHsgYTogOTA5IH1cbiIKKyAgICAgICJkZWxldGVkOiByZXBlYXRlZGdyb3VwWzBdOiB7IGE6IDMxNyB9XG4iCisgICAgICAiZGVsZXRlZDogcmVwZWF0ZWRncm91cFsxXTogeyBhOiA5MDQgfVxuIiwKKyAgICAgIFJ1bigpKTsKK30KKworLy8gRW1iZWRkZWQgbWVzc2FnZSB0ZXN0cy4KK1RFU1RfRihDb21wYXJpc29uVGVzdCwgRW1iZWRkZWRBZGRpdGlvblRlc3QpIHsKKyAgcHJvdG8xXy5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPmNsZWFyX2JiKCk7CisKKyAgRVhQRUNUX0VRKCJhZGRlZDogb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmI6IDExOFxuIiwgUnVuKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIEVtYmVkZGVkRGVsZXRpb25UZXN0KSB7CisgIHByb3RvMl8ubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLT5jbGVhcl9iYigpOworCisgIEVYUEVDVF9FUSgiZGVsZXRlZDogb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmI6IDExOFxuIiwgUnVuKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIEVtYmVkZGVkTW9kaWZpY2F0aW9uVGVzdCkgeworICBwcm90bzFfLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDIpOworCisgIEVYUEVDVF9FUSgibW9kaWZpZWQ6IG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiOiAyIC0+IDExOFxuIiwgUnVuKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIEVtYmVkZGVkRnVsbEFkZGl0aW9uVGVzdCkgeworICBwcm90bzFfLmNsZWFyX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCk7CisKKyAgRVhQRUNUX0VRKCJhZGRlZDogb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2U6IHsgYmI6IDExOCB9XG4iLCBSdW4oKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgRW1iZWRkZWRQYXJ0aWFsQWRkaXRpb25UZXN0KSB7CisgIHByb3RvMV8uY2xlYXJfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKTsKKyAgcHJvdG8yXy5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPmNsZWFyX2JiKCk7CisKKyAgRVhQRUNUX0VRKCJhZGRlZDogb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2U6IHsgfVxuIiwgUnVuKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIEVtYmVkZGVkRnVsbERlbGV0aW9uVGVzdCkgeworICBwcm90bzJfLmNsZWFyX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCk7CisKKyAgRVhQRUNUX0VRKCJkZWxldGVkOiBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZTogeyBiYjogMTE4IH1cbiIsIFJ1bigpKTsKK30KKworLy8gUmVwZWF0ZWQgZWxlbWVudCB0ZXN0cy4KK1RFU1RfRihDb21wYXJpc29uVGVzdCwgQmFzaWNSZXBlYXRlZFRlc3QpIHsKKyAgcHJvdG8xXy5jbGVhcl9yZXBlYXRlZF9pbnQzMigpOworICBwcm90bzJfLmNsZWFyX3JlcGVhdGVkX2ludDMyKCk7CisKKyAgcHJvdG8xXy5hZGRfcmVwZWF0ZWRfaW50MzIoNTAwKTsKKyAgcHJvdG8xXy5hZGRfcmVwZWF0ZWRfaW50MzIoNTAxKTsKKyAgcHJvdG8xXy5hZGRfcmVwZWF0ZWRfaW50MzIoNTAyKTsKKyAgcHJvdG8xXy5hZGRfcmVwZWF0ZWRfaW50MzIoNTAzKTsKKyAgcHJvdG8xXy5hZGRfcmVwZWF0ZWRfaW50MzIoNTAwKTsKKworICBwcm90bzJfLmFkZF9yZXBlYXRlZF9pbnQzMig1MDApOworICBwcm90bzJfLmFkZF9yZXBlYXRlZF9pbnQzMig1MDkpOworICBwcm90bzJfLmFkZF9yZXBlYXRlZF9pbnQzMig1MDIpOworICBwcm90bzJfLmFkZF9yZXBlYXRlZF9pbnQzMig1MDQpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJtb2RpZmllZDogcmVwZWF0ZWRfaW50MzJbMV06IDUwMSAtPiA1MDlcbiIKKyAgICAgICJtb2RpZmllZDogcmVwZWF0ZWRfaW50MzJbM106IDUwMyAtPiA1MDRcbiIKKyAgICAgICJkZWxldGVkOiByZXBlYXRlZF9pbnQzMls0XTogNTAwXG4iLAorICAgICAgUnVuKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIEJhc2ljUmVwZWF0ZWRUZXN0X1NldE9wdGlvbikgeworICByZXBlYXRlZF9maWVsZF9hc19zZXQoKTsKKyAgcHJvdG8xXy5jbGVhcl9yZXBlYXRlZF9pbnQzMigpOworICBwcm90bzJfLmNsZWFyX3JlcGVhdGVkX2ludDMyKCk7CisKKyAgcHJvdG8xXy5hZGRfcmVwZWF0ZWRfaW50MzIoNTAxKTsKKyAgcHJvdG8xXy5hZGRfcmVwZWF0ZWRfaW50MzIoNTAyKTsKKyAgcHJvdG8xXy5hZGRfcmVwZWF0ZWRfaW50MzIoNTAzKTsKKyAgcHJvdG8xXy5hZGRfcmVwZWF0ZWRfaW50MzIoNTAwKTsKKyAgcHJvdG8xXy5hZGRfcmVwZWF0ZWRfaW50MzIoNTAwKTsKKworICBwcm90bzJfLmFkZF9yZXBlYXRlZF9pbnQzMig1MDApOworICBwcm90bzJfLmFkZF9yZXBlYXRlZF9pbnQzMig1MDkpOworICBwcm90bzJfLmFkZF9yZXBlYXRlZF9pbnQzMig1MDMpOworICBwcm90bzJfLmFkZF9yZXBlYXRlZF9pbnQzMig1MDIpOworICBwcm90bzJfLmFkZF9yZXBlYXRlZF9pbnQzMig1MDQpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJtb3ZlZDogcmVwZWF0ZWRfaW50MzJbMV0gLT4gcmVwZWF0ZWRfaW50MzJbM10gOiA1MDJcbiIKKyAgICAgICJtb3ZlZDogcmVwZWF0ZWRfaW50MzJbM10gLT4gcmVwZWF0ZWRfaW50MzJbMF0gOiA1MDBcbiIKKyAgICAgICJhZGRlZDogcmVwZWF0ZWRfaW50MzJbMV06IDUwOVxuIgorICAgICAgImFkZGVkOiByZXBlYXRlZF9pbnQzMls0XTogNTA0XG4iCisgICAgICAiZGVsZXRlZDogcmVwZWF0ZWRfaW50MzJbMF06IDUwMVxuIgorICAgICAgImRlbGV0ZWQ6IHJlcGVhdGVkX2ludDMyWzRdOiA1MDBcbiIsCisgICAgICBSdW4oKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgQmFzaWNSZXBlYXRlZFRlc3RfU2V0RmllbGQpIHsKKyAgZmllbGRfYXNfc2V0KCJyZXBlYXRlZF9pbnQzMiIpOworICBwcm90bzFfLmNsZWFyX3JlcGVhdGVkX2ludDMyKCk7CisgIHByb3RvMl8uY2xlYXJfcmVwZWF0ZWRfaW50MzIoKTsKKworICBwcm90bzFfLmFkZF9yZXBlYXRlZF9pbnQzMig1MDEpOworICBwcm90bzFfLmFkZF9yZXBlYXRlZF9pbnQzMig1MDIpOworICBwcm90bzFfLmFkZF9yZXBlYXRlZF9pbnQzMig1MDMpOworICBwcm90bzFfLmFkZF9yZXBlYXRlZF9pbnQzMig1MDApOworICBwcm90bzFfLmFkZF9yZXBlYXRlZF9pbnQzMig1MDApOworCisgIHByb3RvMl8uYWRkX3JlcGVhdGVkX2ludDMyKDUwMCk7CisgIHByb3RvMl8uYWRkX3JlcGVhdGVkX2ludDMyKDUwOSk7CisgIHByb3RvMl8uYWRkX3JlcGVhdGVkX2ludDMyKDUwMyk7CisgIHByb3RvMl8uYWRkX3JlcGVhdGVkX2ludDMyKDUwMik7CisgIHByb3RvMl8uYWRkX3JlcGVhdGVkX2ludDMyKDUwNCk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgIm1vdmVkOiByZXBlYXRlZF9pbnQzMlsxXSAtPiByZXBlYXRlZF9pbnQzMlszXSA6IDUwMlxuIgorICAgICAgIm1vdmVkOiByZXBlYXRlZF9pbnQzMlszXSAtPiByZXBlYXRlZF9pbnQzMlswXSA6IDUwMFxuIgorICAgICAgImFkZGVkOiByZXBlYXRlZF9pbnQzMlsxXTogNTA5XG4iCisgICAgICAiYWRkZWQ6IHJlcGVhdGVkX2ludDMyWzRdOiA1MDRcbiIKKyAgICAgICJkZWxldGVkOiByZXBlYXRlZF9pbnQzMlswXTogNTAxXG4iCisgICAgICAiZGVsZXRlZDogcmVwZWF0ZWRfaW50MzJbNF06IDUwMFxuIiwKKyAgICAgIFJ1bigpKTsKK30KKworLy8gTXVsdGlwbGUgYWN0aW9uIHRlc3RzLgorVEVTVF9GKENvbXBhcmlzb25UZXN0LCBBZGREZWxldGVUZXN0KSB7CisgIHByb3RvMV8uY2xlYXJfb3B0aW9uYWxfaW50MzIoKTsKKyAgcHJvdG8yXy5jbGVhcl9vcHRpb25hbF9pbnQ2NCgpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJhZGRlZDogb3B0aW9uYWxfaW50MzI6IDEwMVxuIgorICAgICAgImRlbGV0ZWQ6IG9wdGlvbmFsX2ludDY0OiAxMDJcbiIsCisgICAgICBSdW4oKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgQWRkRGVsZXRlX0ZpZWxkT3JkZXJpbmdUZXN0KSB7CisgIG9yZGVyaW5nc19wcm90bzFfLkNsZWFyRXh0ZW5zaW9uKHVuaXR0ZXN0OjpteV9leHRlbnNpb25fc3RyaW5nKTsKKyAgb3JkZXJpbmdzX3Byb3RvMl8uY2xlYXJfbXlfaW50KCk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgImRlbGV0ZWQ6IG15X2ludDogMVxuIgorICAgICAgImFkZGVkOiAocHJvdG9idWZfdW5pdHRlc3QubXlfZXh0ZW5zaW9uX3N0cmluZyk6IFwiYmFyXCJcbiIsCisgICAgICBSdW5PcmRlcigpKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBBbGxUaHJlZVRlc3QpIHsKKyAgcHJvdG8xXy5jbGVhcl9vcHRpb25hbF9pbnQzMigpOworICBwcm90bzJfLmNsZWFyX29wdGlvbmFsX2Zsb2F0KCk7CisgIHByb3RvMl8uc2V0X29wdGlvbmFsX3N0cmluZygiaGVsbG8gd29ybGQhIik7CisKKyAgRVhQRUNUX0VRKAorICAgICAgImFkZGVkOiBvcHRpb25hbF9pbnQzMjogMTAxXG4iCisgICAgICAiZGVsZXRlZDogb3B0aW9uYWxfZmxvYXQ6IDExMVxuIgorICAgICAgIm1vZGlmaWVkOiBvcHRpb25hbF9zdHJpbmc6IFwiMTE1XCIgLT4gXCJoZWxsbyB3b3JsZCFcIlxuIiwKKyAgICAgIFJ1bigpKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBTYW5kd2hpY2hUZXN0KSB7CisgIHByb3RvMV8uY2xlYXJfb3B0aW9uYWxfaW50NjQoKTsKKyAgcHJvdG8xXy5jbGVhcl9vcHRpb25hbF91aW50MzIoKTsKKworICBwcm90bzJfLmNsZWFyX29wdGlvbmFsX3VpbnQ2NCgpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJhZGRlZDogb3B0aW9uYWxfaW50NjQ6IDEwMlxuIgorICAgICAgImFkZGVkOiBvcHRpb25hbF91aW50MzI6IDEwM1xuIgorICAgICAgImRlbGV0ZWQ6IG9wdGlvbmFsX3VpbnQ2NDogMTA0XG4iLAorICAgICAgUnVuKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIElnbm9yZWROb0NoYW5nZVRlc3QpIHsKKyAgcHJvdG8xZGlmZl8uc2V0X3YoMyk7CisgIHByb3RvMmRpZmZfLnNldF92KDMpOworICBwcm90bzJkaWZmXy5zZXRfdygiZm9vIik7CisKKyAgaWdub3JlX2ZpZWxkKCJ2Iik7CisKKyAgRVhQRUNUX0VRKAorICAgICAgImlnbm9yZWQ6IHZcbiIKKyAgICAgICJhZGRlZDogdzogXCJmb29cIlxuIiwKKyAgICAgIFJ1bkRpZmYoKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgSWdub3JlZEFkZFRlc3QpIHsKKyAgcHJvdG8yZGlmZl8uc2V0X3YoMyk7CisgIHByb3RvMmRpZmZfLnNldF93KCJmb28iKTsKKworICBpZ25vcmVfZmllbGQoInYiKTsKKworICBFWFBFQ1RfRVEoCisgICAgICAiaWdub3JlZDogdlxuIgorICAgICAgImFkZGVkOiB3OiBcImZvb1wiXG4iLAorICAgICAgUnVuRGlmZigpKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBJZ25vcmVkRGVsZXRlVGVzdCkgeworICBwcm90bzFkaWZmXy5zZXRfdigzKTsKKyAgcHJvdG8yZGlmZl8uc2V0X3coImZvbyIpOworCisgIGlnbm9yZV9maWVsZCgidiIpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJpZ25vcmVkOiB2XG4iCisgICAgICAiYWRkZWQ6IHc6IFwiZm9vXCJcbiIsCisgICAgICBSdW5EaWZmKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIElnbm9yZWRNb2RpZnlUZXN0KSB7CisgIHByb3RvMWRpZmZfLnNldF92KDMpOworICBwcm90bzJkaWZmXy5zZXRfdig0KTsKKyAgcHJvdG8yZGlmZl8uc2V0X3coImZvbyIpOworCisgIGlnbm9yZV9maWVsZCgidiIpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJpZ25vcmVkOiB2XG4iCisgICAgICAiYWRkZWQ6IHc6IFwiZm9vXCJcbiIsCisgICAgICBSdW5EaWZmKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIElnbm9yZWRSZXBlYXRlZEFkZFRlc3QpIHsKKyAgcHJvdG8xZGlmZl8uYWRkX3J2KDMpOworICBwcm90bzFkaWZmXy5hZGRfcnYoNCk7CisKKyAgcHJvdG8yZGlmZl8uYWRkX3J2KDMpOworICBwcm90bzJkaWZmXy5hZGRfcnYoNCk7CisgIHByb3RvMmRpZmZfLmFkZF9ydig1KTsKKworICBwcm90bzJkaWZmXy5zZXRfdygiZm9vIik7CisKKyAgaWdub3JlX2ZpZWxkKCJydiIpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJpZ25vcmVkOiBydlxuIgorICAgICAgImFkZGVkOiB3OiBcImZvb1wiXG4iLAorICAgICAgUnVuRGlmZigpKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBJZ25vcmVkUmVwZWF0ZWREZWxldGVUZXN0KSB7CisgIHByb3RvMWRpZmZfLmFkZF9ydigzKTsKKyAgcHJvdG8xZGlmZl8uYWRkX3J2KDQpOworICBwcm90bzFkaWZmXy5hZGRfcnYoNSk7CisKKyAgcHJvdG8yZGlmZl8uYWRkX3J2KDMpOworICBwcm90bzJkaWZmXy5hZGRfcnYoNCk7CisKKyAgcHJvdG8yZGlmZl8uc2V0X3coImZvbyIpOworCisgIGlnbm9yZV9maWVsZCgicnYiKTsKKworICBFWFBFQ1RfRVEoCisgICAgICAiaWdub3JlZDogcnZcbiIKKyAgICAgICJhZGRlZDogdzogXCJmb29cIlxuIiwKKyAgICAgIFJ1bkRpZmYoKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgSWdub3JlZFJlcGVhdGVkTW9kaWZ5VGVzdCkgeworICBwcm90bzFkaWZmXy5hZGRfcnYoMyk7CisgIHByb3RvMWRpZmZfLmFkZF9ydig0KTsKKworICBwcm90bzJkaWZmXy5hZGRfcnYoMyk7CisgIHByb3RvMmRpZmZfLmFkZF9ydig1KTsKKworICBwcm90bzJkaWZmXy5zZXRfdygiZm9vIik7CisKKyAgaWdub3JlX2ZpZWxkKCJydiIpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJpZ25vcmVkOiBydlxuIgorICAgICAgImFkZGVkOiB3OiBcImZvb1wiXG4iLAorICAgICAgUnVuRGlmZigpKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBJZ25vcmVkV2hvbGVOZXN0ZWRNZXNzYWdlKSB7CisgIHByb3RvMWRpZmZfLm11dGFibGVfbSgpLT5zZXRfYygzKTsKKyAgcHJvdG8yZGlmZl8ubXV0YWJsZV9tKCktPnNldF9jKDQpOworCisgIHByb3RvMmRpZmZfLnNldF93KCJmb28iKTsKKworICBpZ25vcmVfZmllbGQoIm0iKTsKKworICBFWFBFQ1RfRVEoCisgICAgICAiYWRkZWQ6IHc6IFwiZm9vXCJcbiIKKyAgICAgICJpZ25vcmVkOiBtXG4iLAorICAgICAgUnVuRGlmZigpKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBJZ25vcmVkTmVzdGVkRmllbGQpIHsKKyAgcHJvdG8xZGlmZl8ubXV0YWJsZV9tKCktPnNldF9jKDMpOworICBwcm90bzJkaWZmXy5tdXRhYmxlX20oKS0+c2V0X2MoNCk7CisKKyAgcHJvdG8yZGlmZl8uc2V0X3coImZvbyIpOworCisgIGlnbm9yZV9maWVsZCgibS5jIik7CisKKyAgRVhQRUNUX0VRKAorICAgICAgImFkZGVkOiB3OiBcImZvb1wiXG4iCisgICAgICAiaWdub3JlZDogbS5jXG4iLAorICAgICAgUnVuRGlmZigpKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBJZ25vcmVkUmVwZWF0ZWROZXN0ZWQpIHsKKyAgcHJvdG8xZGlmZl8uYWRkX3JtKCktPnNldF9jKDApOworICBwcm90bzFkaWZmXy5hZGRfcm0oKS0+c2V0X2MoMSk7CisgIHByb3RvMmRpZmZfLmFkZF9ybSgpLT5zZXRfYygyKTsKKyAgcHJvdG8yZGlmZl8uYWRkX3JtKCktPnNldF9jKDMpOworCisgIHByb3RvMmRpZmZfLnNldF93KCJmb28iKTsKKworICBpZ25vcmVfZmllbGQoInJtLmMiKTsKKworICBFWFBFQ1RfRVEoCisgICAgICAiaWdub3JlZDogcm1bMF0uY1xuIgorICAgICAgImlnbm9yZWQ6IHJtWzFdLmNcbiIKKyAgICAgICJhZGRlZDogdzogXCJmb29cIlxuIiwKKyAgICAgIFJ1bkRpZmYoKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgSWdub3JlZE5lc3RlZFJlcGVhdGVkKSB7CisgIHByb3RvMWRpZmZfLm11dGFibGVfbSgpLT5hZGRfcmMoMjMpOworICBwcm90bzFkaWZmXy5tdXRhYmxlX20oKS0+YWRkX3JjKDI0KTsKKyAgcHJvdG8yZGlmZl8ubXV0YWJsZV9tKCktPmFkZF9yYygyNSk7CisKKyAgcHJvdG8yZGlmZl8uc2V0X3coImZvbyIpOworCisgIGlnbm9yZV9maWVsZCgibS5yYyIpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJhZGRlZDogdzogXCJmb29cIlxuIgorICAgICAgImlnbm9yZWQ6IG0ucmNcbiIsCisgICAgICBSdW5EaWZmKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIEV4dGVuc2lvblRlc3QpIHsKKyAgcHJvdG8xZXhfLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uLCA0MDEpOworICBwcm90bzJleF8uU2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24sIDQwMik7CisKKyAgcHJvdG8xZXhfLkNsZWFyRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24pOworICBwcm90bzJleF8uU2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24sIDQwMyk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgIm1vZGlmaWVkOiAocHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uKTogNDAxIC0+IDQwMlxuIgorICAgICAgImFkZGVkOiAocHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uKTogNDAzXG4iLAorICAgICAgUnVuRXgoKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgTWF0Y2hlZFVua25vd25GaWVsZFRhZ1Rlc3QpIHsKKyAgdW5rbm93bjFfLT5BZGRWYXJpbnQoMjQwLCAxMjIpOworICB1bmtub3duMl8tPkFkZFZhcmludCgyNDAsIDEyMSk7CisgIHVua25vd24xXy0+QWRkRml4ZWQzMigyNDEsIDEpOworICB1bmtub3duMl8tPkFkZEZpeGVkNjQoMjQxLCAyKTsKKyAgdW5rbm93bjFfLT5BZGRMZW5ndGhEZWxpbWl0ZWQoMjQyLCAiY2F0Iik7CisgIHVua25vd24yXy0+QWRkTGVuZ3RoRGVsaW1pdGVkKDI0MiwgImRvZyIpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJtb2RpZmllZDogMjQwWzBdOiAxMjIgLT4gMTIxXG4iCisgICAgICAiZGVsZXRlZDogMjQxWzBdOiAweDAwMDAwMDAxXG4iCisgICAgICAiYWRkZWQ6IDI0MVswXTogMHgwMDAwMDAwMDAwMDAwMDAyXG4iCisgICAgICAibW9kaWZpZWQ6IDI0MlswXTogXCJjYXRcIiAtPiBcImRvZ1wiXG4iLAorICAgICAgUnVuVW4oKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgVW5tYXRjaGVkVW5rbm93bkZpZWxkVGFnVGVzdCkgeworICB1bmtub3duMV8tPkFkZEZpeGVkMzIoMjQzLCAxKTsKKyAgdW5rbm93bjJfLT5BZGRWYXJpbnQoMjQ0LCAyKTsKKyAgdW5rbm93bjJfLT5BZGRWYXJpbnQoMjQ0LCA0KTsKKworICBFWFBFQ1RfRVEoCisgICAgICAiZGVsZXRlZDogMjQzWzBdOiAweDAwMDAwMDAxXG4iCisgICAgICAiYWRkZWQ6IDI0NFswXTogMlxuIgorICAgICAgImFkZGVkOiAyNDRbMV06IDRcbiIsCisgICAgICBSdW5VbigpKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBEaWZmZXJlbnRTaXplZFVua25vd25GaWVsZFRlc3QpIHsKKyAgdW5rbm93bjFfLT5BZGRWYXJpbnQoMjQwLCAxKTsKKyAgdW5rbm93bjFfLT5BZGRWYXJpbnQoMjQwLCAzKTsKKyAgdW5rbm93bjFfLT5BZGRWYXJpbnQoMjQwLCA0KTsKKyAgdW5rbm93bjJfLT5BZGRWYXJpbnQoMjQwLCAyKTsKKyAgdW5rbm93bjJfLT5BZGRWYXJpbnQoMjQwLCAzKTsKKyAgdW5rbm93bjJfLT5BZGRWYXJpbnQoMjQwLCAyKTsKKyAgdW5rbm93bjJfLT5BZGRWYXJpbnQoMjQwLCA1KTsKKworICBFWFBFQ1RfRVEoCisgICAgICAibW9kaWZpZWQ6IDI0MFswXTogMSAtPiAyXG4iCisgICAgICAibW9kaWZpZWQ6IDI0MFsyXTogNCAtPiAyXG4iCisgICAgICAiYWRkZWQ6IDI0MFszXTogNVxuIiwKKyAgICAgIFJ1blVuKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIFVua25vd25GaWVsZHNBbGwpIHsKKyAgdW5rbm93bjFfLT5BZGRWYXJpbnQoMjQzLCAxMjIpOworICB1bmtub3duMV8tPkFkZEZpeGVkNjQoMjQ0LCAweDAxNzIzNTYpOworICB1bmtub3duMV8tPkFkZEZpeGVkNjQoMjQ0LCAweDA5OCk7CisgIHVua25vd24xXy0+QWRkR3JvdXAoMjQ1KS0+QWRkRml4ZWQzMigyNDgsIDEpOworICB1bmtub3duMV8tPm11dGFibGVfZmllbGQoMyktPm11dGFibGVfZ3JvdXAoKS0+QWRkRml4ZWQzMigyNDgsIDIpOworICB1bmtub3duMV8tPkFkZEdyb3VwKDI0OSktPkFkZEZpeGVkNjQoMjUwLCAxKTsKKworICB1bmtub3duMl8tPkFkZFZhcmludCgyNDMsIDEyMSk7CisgIHVua25vd24yXy0+QWRkTGVuZ3RoRGVsaW1pdGVkKDczODgyLCAidGVzdCAxMjMiKTsKKyAgdW5rbm93bjJfLT5BZGRHcm91cCgyNDUpLT5BZGRGaXhlZDMyKDI0OCwgMyk7CisgIHVua25vd24yXy0+QWRkR3JvdXAoMjQ3KTsKKworICBFWFBFQ1RfRVEoCisgICAgICAibW9kaWZpZWQ6IDI0M1swXTogMTIyIC0+IDEyMVxuIgorICAgICAgImRlbGV0ZWQ6IDI0NFswXTogMHgwMDAwMDAwMDAwMTcyMzU2XG4iCisgICAgICAiZGVsZXRlZDogMjQ0WzFdOiAweDAwMDAwMDAwMDAwMDAwOThcbiIKKyAgICAgICJtb2RpZmllZDogMjQ1WzBdLjI0OFswXTogMHgwMDAwMDAwMSAtPiAweDAwMDAwMDAzXG4iCisgICAgICAiZGVsZXRlZDogMjQ1WzBdLjI0OFsxXTogMHgwMDAwMDAwMlxuIgorICAgICAgImFkZGVkOiAyNDdbMF06IHsgLi4uIH1cbiIKKyAgICAgICJkZWxldGVkOiAyNDlbMF06IHsgLi4uIH1cbiIKKyAgICAgICJhZGRlZDogNzM4ODJbMF06IFwidGVzdCAxMjNcIlxuIiwKKyAgICAgIFJ1blVuKCkpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIEVxdWl2YWxlbnRJZ25vcmVzVW5rbm93bikgeworICB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UgbWVzc2FnZTEsIG1lc3NhZ2UyOworCisgIG1lc3NhZ2UxLnNldF9jKDUpOworICBtZXNzYWdlMS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgxMjMsIDQ1Nik7CisgIG1lc3NhZ2UyLnNldF9jKDUpOworICBtZXNzYWdlMi5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgzMjEsIDY1NCk7CisKKyAgRVhQRUNUX0ZBTFNFKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RXF1YWxzKG1lc3NhZ2UxLCBtZXNzYWdlMikpOworICBFWFBFQ1RfVFJVRSh1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkVxdWl2YWxlbnQobWVzc2FnZTEsIG1lc3NhZ2UyKSk7Cit9CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgTWFwVGVzdCkgeworICBNYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgbWFwMSA9CisgICAgICAqbWFwX3Byb3RvMV8ubXV0YWJsZV9tYXBfc3RyaW5nX3N0cmluZygpOworICBtYXAxWyJrZXkxIl0gPSAiMSI7CisgIG1hcDFbImtleTIiXSA9ICIyIjsKKyAgbWFwMVsia2V5MyJdID0gIjMiOworICBNYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgbWFwMiA9CisgICAgICAqbWFwX3Byb3RvMl8ubXV0YWJsZV9tYXBfc3RyaW5nX3N0cmluZygpOworICBtYXAyWyJrZXkzIl0gPSAiMCI7CisgIG1hcDJbImtleTIiXSA9ICIyIjsKKyAgbWFwMlsia2V5MSJdID0gIjEiOworCisgIEVYUEVDVF9FUSgibW9kaWZpZWQ6IG1hcF9zdHJpbmdfc3RyaW5nW2tleTNdOiBcIjNcIiAtPiBcIjBcIlxuIiwKKyAgICAgICAgICAgIFJ1bihtYXBfcHJvdG8xXywgbWFwX3Byb3RvMl8pKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBNYXBJZ25vcmVLZXlUZXN0KSB7CisgIE1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBtYXAxID0KKyAgICAgICptYXBfcHJvdG8xXy5tdXRhYmxlX21hcF9zdHJpbmdfc3RyaW5nKCk7CisgIG1hcDFbImtleTEiXSA9ICIxIjsKKyAgbWFwMVsia2V5MiJdID0gIjIiOworICBtYXAxWyJrZXkzIl0gPSAiMyI7CisgIE1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBtYXAyID0KKyAgICAgICptYXBfcHJvdG8yXy5tdXRhYmxlX21hcF9zdHJpbmdfc3RyaW5nKCk7CisgIG1hcDJbImtleTQiXSA9ICIyIjsKKyAgbWFwMlsia2V5NSJdID0gIjMiOworICBtYXAyWyJrZXk2Il0gPSAiMSI7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5JZ25vcmVGaWVsZCgKKyAgICAgIEdldEZpZWxkRGVzY3JpcHRvcihtYXBfcHJvdG8xXywgIm1hcF9zdHJpbmdfc3RyaW5nLmtleSIpKTsKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZShtYXBfcHJvdG8xXywgbWFwX3Byb3RvMl8pKTsKK30KKworVEVTVF9GKENvbXBhcmlzb25UZXN0LCBNYXBSb3VuZFRyaXBTeW5jVGVzdCkgeworICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOworICB1bml0dGVzdDo6VGVzdE1hcCBtYXBfcmVmbGVjdGlvbjE7CisKKyAgLy8gQnkgc2V0dGluZyB2aWEgcmVmbGVjdGlvbiwgZGF0YSBleGlzdHMgaW4gcmVwZWF0ZWQgZmllbGQuCisgIEFTU0VSVF9UUlVFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoIm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UgeyBrZXk6IDEgfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF9yZWZsZWN0aW9uMSkpOworCisgIC8vIER1cmluZyBjb3B5LCBkYXRhIGlzIHN5bmNlZCBmcm9tIHJlcGVhdGVkIGZpZWxkIHRvIG1hcC4KKyAgdW5pdHRlc3Q6OlRlc3RNYXAgbWFwX3JlZmxlY3Rpb24yID0gbWFwX3JlZmxlY3Rpb24xOworCisgIC8vIER1cmluZyBjb21wYXJpc29uLCBkYXRhIGlzIHN5bmNlZCBmcm9tIG1hcCB0byByZXBlYXRlZCBmaWVsZC4KKyAgRVhQRUNUX1RSVUUoCisgICAgICB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkVxdWFscyhtYXBfcmVmbGVjdGlvbjEsIG1hcF9yZWZsZWN0aW9uMikpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIE1hcEVudHJ5UGFydGlhbFRlc3QpIHsKKyAgVGV4dEZvcm1hdDo6UGFyc2VyIHBhcnNlcjsKKyAgdW5pdHRlc3Q6OlRlc3RNYXAgbWFwMTsKKyAgdW5pdHRlc3Q6OlRlc3RNYXAgbWFwMjsKKworICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6UEFSVElBTCk7CisgIGRpZmZlcmVuY2VyLlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoJm91dHB1dCk7CisKKyAgQVNTRVJUX1RSVUUocGFyc2VyLlBhcnNlRnJvbVN0cmluZygKKyAgICAgICJtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlIHsga2V5OiAxIHZhbHVlIHsgYzogMSB9IH0iLCAmbWFwMSkpOworICBBU1NFUlRfVFJVRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKAorICAgICAgIm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UgeyBrZXk6IDEgdmFsdWUgeyBjOiAyIH19IiwgJm1hcDIpKTsKKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLkNvbXBhcmUobWFwMSwgbWFwMikpOworICBFWFBFQ1RfRVEoIm1vZGlmaWVkOiBtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzFdLmM6IDEgLT4gMlxuIiwgb3V0cHV0KTsKKworICBBU1NFUlRfVFJVRSgKKyAgICAgIHBhcnNlci5QYXJzZUZyb21TdHJpbmcoIm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UgeyBrZXk6IDEgfSIsICZtYXAxKSk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobWFwMSwgbWFwMikpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIE1hcEVudHJ5UGFydGlhbEVtcHR5S2V5VGVzdCkgeworICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOworICB1bml0dGVzdDo6VGVzdE1hcCBtYXAxOworICB1bml0dGVzdDo6VGVzdE1hcCBtYXAyOworICBBU1NFUlRfVFJVRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlIHt9IiwgJm1hcDEpKTsKKyAgQVNTRVJUX1RSVUUoCisgICAgICBwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlIHsga2V5OiAxIH0iLCAmbWFwMikpOworCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuc2V0X3Njb3BlKHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6UEFSVElBTCk7CisgIC8vIFRPRE8oamllbHVvKTogUmVtb3ZlIHRoZSByb3VuZCB0cmlwCisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRfdmFsdWU7CisgIG1hcDEuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWRfdmFsdWUpOworICBtYXAxLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkX3ZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLkNvbXBhcmUobWFwMSwgbWFwMikpOworfQorCitURVNUX0YoQ29tcGFyaXNvblRlc3QsIE1hcEVudHJ5TWlzc2luZ0VtcHR5RmllbGRJc09rVGVzdCkgeworICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcCBtc2cxOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcCBtc2cyOworCisgIEFTU0VSVF9UUlVFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoCisgICAgICAibWFwX3N0cmluZ19mb3JlaWduX21lc3NhZ2UgeyBrZXk6ICdrZXkxJyB2YWx1ZSB7fX0iLCAmbXNnMSkpOworICBBU1NFUlRfVFJVRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKAorICAgICAgIm1hcF9zdHJpbmdfZm9yZWlnbl9tZXNzYWdlIHsga2V5OiAna2V5MScgfSIsICZtc2cyKSk7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5zZXRfc2NvcGUodXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpQQVJUSUFMKTsKKworICBBU1NFUlRfVFJVRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKK30KKworLy8gQ29uc2lkZXJzIHN0cmluZ3Mga2V5cyBhcyBlcXVhbCBpZiB0aGV5IGhhdmUgZXF1YWwgbGVuZ3Rocy4KK2NsYXNzIExlbmd0aE1hcEtleUNvbXBhcmF0b3IKKyAgICA6IHB1YmxpYyB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6Ok1hcEtleUNvbXBhcmF0b3IgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OlNwZWNpZmljRmllbGQgU3BlY2lmaWNGaWVsZDsKKyAgYm9vbCBJc01hdGNoKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UxLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlMiwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNwZWNpZmljRmllbGQ+JiBwYXJlbnRfZmllbGRzKSBjb25zdCBvdmVycmlkZSB7CisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbjEgPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbjIgPSBtZXNzYWdlMi5HZXRSZWZsZWN0aW9uKCk7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBrZXlfZmllbGQgPSBtZXNzYWdlMS5HZXREZXNjcmlwdG9yKCktPm1hcF9rZXkoKTsKKyAgICByZXR1cm4gcmVmbGVjdGlvbjEtPkdldFN0cmluZyhtZXNzYWdlMSwga2V5X2ZpZWxkKS5zaXplKCkgPT0KKyAgICAgICAgICAgcmVmbGVjdGlvbjItPkdldFN0cmluZyhtZXNzYWdlMiwga2V5X2ZpZWxkKS5zaXplKCk7CisgIH0KK307CisKK1RFU1RfRihDb21wYXJpc29uVGVzdCwgTWFwRW50cnlDdXN0b21NYXBLZXlDb21wYXJhdG9yKSB7CisgIFRleHRGb3JtYXQ6OlBhcnNlciBwYXJzZXI7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwIG1zZzE7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwIG1zZzI7CisKKyAgQVNTRVJUX1RSVUUocGFyc2VyLlBhcnNlRnJvbVN0cmluZygKKyAgICAgICJtYXBfc3RyaW5nX2ZvcmVpZ25fbWVzc2FnZSB7IGtleTogJ2tleTEnIHZhbHVlIHsgYzogMSB9fSIsICZtc2cxKSk7CisgIEFTU0VSVF9UUlVFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoCisgICAgICAibWFwX3N0cmluZ19mb3JlaWduX21lc3NhZ2UgeyBrZXk6ICdrZXkyJyB2YWx1ZSB7IGM6IDEgfX0iLCAmbXNnMikpOworCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgTGVuZ3RoTWFwS2V5Q29tcGFyYXRvciBrZXlfY29tcGFyYXRvcjsKKyAgZGlmZmVyZW5jZXIuVHJlYXRBc01hcFVzaW5nS2V5Q29tcGFyYXRvcigKKyAgICAgIEdldEZpZWxkRGVzY3JpcHRvcihtc2cxLCAibWFwX3N0cmluZ19mb3JlaWduX21lc3NhZ2UiKSwgJmtleV9jb21wYXJhdG9yKTsKKyAgc3RkOjpzdHJpbmcgb3V0cHV0OworICBkaWZmZXJlbmNlci5SZXBvcnREaWZmZXJlbmNlc1RvU3RyaW5nKCZvdXRwdXQpOworICAvLyBUaG91Z2ggdGhlIGFib3ZlIHR3byBtZXNzYWdlcyBoYXZlIGRpZmZlcmVudCBrZXlzIGZvciB0aGVpciBtYXAgZW50cmllcywKKyAgLy8gdGhleSBhcmUgY29uc2lkZXJlZCB0aGUgc2FtZSBieSBrZXlfY29tcGFyYXRvciBiZWNhdXNlIHRoZWlyIGxlbmd0aHMgYXJlCisgIC8vIGVxdWFsLiAgSG93ZXZlciwgaW4gdmFsdWUgY29tcGFyaXNvbiwgYWxsIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSBhcmUgdGFrZW4KKyAgLy8gaW50byBjb25zaWRlcmF0aW9uLCBzbyB0aGV5IGFyZSByZXBvcnRlZCBhcyBkaWZmZXJlbnQuCisgIEVYUEVDVF9GQUxTRShkaWZmZXJlbmNlci5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIm1vZGlmaWVkOiBtYXBfc3RyaW5nX2ZvcmVpZ25fbWVzc2FnZVtrZXkxXS5rZXk6IFwia2V5MVwiIC0+IFwia2V5MlwiXG4iLAorICAgICAgb3V0cHV0KTsKKyAgZGlmZmVyZW5jZXIuSWdub3JlRmllbGQoCisgICAgICBHZXRGaWVsZERlc2NyaXB0b3IobXNnMSwgIm1hcF9zdHJpbmdfZm9yZWlnbl9tZXNzYWdlLmtleSIpKTsKKyAgb3V0cHV0LmNsZWFyKCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworICBFWFBFQ1RfRVEoImlnbm9yZWQ6IG1hcF9zdHJpbmdfZm9yZWlnbl9tZXNzYWdlW2tleTFdLmtleVxuIiwgb3V0cHV0KTsKK30KKworY2xhc3MgTWF0Y2hpbmdUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXIgTWVzc2FnZURpZmZlcmVuY2VyOworCisgcHJvdGVjdGVkOgorICBNYXRjaGluZ1Rlc3QoKSB7fQorCisgIH5NYXRjaGluZ1Rlc3QoKSBvdmVycmlkZSB7fQorCisgIHN0ZDo6c3RyaW5nIFJ1bldpdGhSZXN1bHQoTWVzc2FnZURpZmZlcmVuY2VyKiBkaWZmZXJlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBtc2cxLCBjb25zdCBNZXNzYWdlJiBtc2cyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVzdWx0KSB7CisgICAgc3RkOjpzdHJpbmcgb3V0cHV0OworICAgIHsKKyAgICAgIC8vIEJlZm9yZSB3ZSByZXR1cm4gdGhlICJvdXRwdXQiIHN0cmluZywgd2UgbXVzdCBtYWtlIHN1cmUgdGhlCisgICAgICAvLyBTdHJlYW1SZXBvcnRlciBpcyBkZXN0cnVjdG9yZWQgYmVjYXVzZSBpdHMgZGVzdHJ1Y3RvciB3aWxsCisgICAgICAvLyBmbHVzaCB0aGUgc3RyZWFtLgorICAgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZvdXRwdXQpOworICAgICAgTWVzc2FnZURpZmZlcmVuY2VyOjpTdHJlYW1SZXBvcnRlciByZXBvcnRlcigmb3V0cHV0X3N0cmVhbSk7CisgICAgICByZXBvcnRlci5zZXRfcmVwb3J0X21vZGlmaWVkX2FnZ3JlZ2F0ZXModHJ1ZSk7CisgICAgICBkaWZmZXJlbmNlci0+c2V0X3JlcG9ydF9tYXRjaGVzKHRydWUpOworICAgICAgZGlmZmVyZW5jZXItPlJlcG9ydERpZmZlcmVuY2VzVG8oJnJlcG9ydGVyKTsKKyAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXItPkNvbXBhcmUobXNnMSwgbXNnMikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGRpZmZlcmVuY2VyLT5Db21wYXJlKG1zZzEsIG1zZzIpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dHB1dDsKKyAgfQorCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1hdGNoaW5nVGVzdCk7Cit9OworCitURVNUX0YoTWF0Y2hpbmdUZXN0LCBTdHJlYW1SZXBvcnRlck1hdGNoaW5nKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RmllbGQgbXNnMSwgbXNnMjsKKyAgbXNnMS5zZXRfYyg3Mik7CisgIG1zZzIuc2V0X2MoNzIpOworICBtc2cxLmFkZF9yYygxMyk7CisgIG1zZzIuYWRkX3JjKDEzKTsKKyAgbXNnMS5hZGRfcmMoMTcpOworICBtc2cyLmFkZF9yYygxNyk7CisgIHN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgTWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5zZXRfcmVwb3J0X21hdGNoZXModHJ1ZSk7CisgIGRpZmZlcmVuY2VyLlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoJm91dHB1dCk7CisgIEVYUEVDVF9UUlVFKGRpZmZlcmVuY2VyLkNvbXBhcmUobXNnMSwgbXNnMikpOworICBFWFBFQ1RfRVEoCisgICAgICAibWF0Y2hlZDogYyA6IDcyXG4iCisgICAgICAibWF0Y2hlZDogcmNbMF0gOiAxM1xuIgorICAgICAgIm1hdGNoZWQ6IHJjWzFdIDogMTdcbiIsCisgICAgICBvdXRwdXQpOworfQorCitURVNUX0YoTWF0Y2hpbmdUZXN0LCBEb250UmVwb3J0TWF0Y2hlZFdoZW5JZ25vcmluZykgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEZpZWxkIG1zZzEsIG1zZzI7CisgIG1zZzEuc2V0X2MoNzIpOworICBtc2cyLnNldF9jKDcyKTsKKyAgbXNnMS5hZGRfcmMoMTMpOworICBtc2cyLmFkZF9yYygxMyk7CisgIG1zZzEuYWRkX3JjKDE3KTsKKyAgbXNnMi5hZGRfcmMoMTcpOworICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisgIE1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXJlbmNlcjsKKyAgZGlmZmVyZW5jZXIuc2V0X3JlcG9ydF9tYXRjaGVzKHRydWUpOworICBkaWZmZXJlbmNlci5SZXBvcnREaWZmZXJlbmNlc1RvU3RyaW5nKCZvdXRwdXQpOworCisgIGRpZmZlcmVuY2VyLklnbm9yZUZpZWxkKG1zZzEuR2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoImMiKSk7CisKKyAgRVhQRUNUX1RSVUUoZGlmZmVyZW5jZXIuQ29tcGFyZShtc2cxLCBtc2cyKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJpZ25vcmVkOiBjXG4iCisgICAgICAibWF0Y2hlZDogcmNbMF0gOiAxM1xuIgorICAgICAgIm1hdGNoZWQ6IHJjWzFdIDogMTdcbiIsCisgICAgICBvdXRwdXQpOworfQorCitURVNUX0YoTWF0Y2hpbmdUZXN0LCBSZXBvcnRNYXRjaGVkRm9yTW92ZWRGaWVsZHMpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxLCBtc2cyOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlOjpJdGVtKiBpdGVtID0gbXNnMS5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYSg1Myk7CisgIGl0ZW0tPnNldF9iKCJoZWxsbyIpOworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYSgyNyk7CisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDUzKTsKKyAgaXRlbS0+c2V0X2IoImhlbGxvIik7CisgIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDI3KTsKKyAgTWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2M7CisgIGRlc2MgPSBtc2cxLkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJpdGVtIik7CisgIGRpZmZlcmVuY2VyLlRyZWF0QXNTZXQoZGVzYyk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgIm1hdGNoZWQ6IGl0ZW1bMF0uYSAtPiBpdGVtWzFdLmEgOiA1M1xuIgorICAgICAgIm1hdGNoZWQ6IGl0ZW1bMF0uYiAtPiBpdGVtWzFdLmIgOiBcImhlbGxvXCJcbiIKKyAgICAgICJtb3ZlZDogaXRlbVswXSAtPiBpdGVtWzFdIDogeyBhOiA1MyBiOiBcImhlbGxvXCIgfVxuIgorICAgICAgIm1hdGNoZWQ6IGl0ZW1bMV0uYSAtPiBpdGVtWzBdLmEgOiAyN1xuIgorICAgICAgIm1vdmVkOiBpdGVtWzFdIC0+IGl0ZW1bMF0gOiB7IGE6IDI3IH1cbiIsCisgICAgICBSdW5XaXRoUmVzdWx0KCZkaWZmZXJlbmNlciwgbXNnMSwgbXNnMiwgdHJ1ZSkpOworfQorCisKK1RFU1RfRihNYXRjaGluZ1Rlc3QsIE1hdGNoZXNBcHBlYXJJblBvc3RUcmF2ZXJzYWxPcmRlckZvck1vdmVkRmllbGRzKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RGlmZk1lc3NhZ2UgbXNnMSwgbXNnMjsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZTo6SXRlbSogaXRlbTsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RGaWVsZCogZmllbGQ7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG5lc3RlZF9kZXNjOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRvdWJsZV9uZXN0ZWRfZGVzYzsKKyAgZGVzYyA9IG1zZzEuR2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoIml0ZW0iKTsKKyAgbmVzdGVkX2Rlc2MgPSBkZXNjLT5tZXNzYWdlX3R5cGUoKS0+RmluZEZpZWxkQnlOYW1lKCJybSIpOworICBkb3VibGVfbmVzdGVkX2Rlc2MgPSBuZXN0ZWRfZGVzYy0+bWVzc2FnZV90eXBlKCktPkZpbmRGaWVsZEJ5TmFtZSgicmMiKTsKKyAgTWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5UcmVhdEFzU2V0KGRlc2MpOworICBkaWZmZXJlbmNlci5UcmVhdEFzU2V0KG5lc3RlZF9kZXNjKTsKKyAgZGlmZmVyZW5jZXIuVHJlYXRBc1NldChkb3VibGVfbmVzdGVkX2Rlc2MpOworCisgIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIGZpZWxkID0gaXRlbS0+YWRkX3JtKCk7CisgIGZpZWxkLT5zZXRfYygxKTsKKyAgZmllbGQtPmFkZF9yYygyKTsKKyAgZmllbGQtPmFkZF9yYygzKTsKKyAgZmllbGQgPSBpdGVtLT5hZGRfcm0oKTsKKyAgZmllbGQtPnNldF9jKDQpOworICBmaWVsZC0+YWRkX3JjKDUpOworICBmaWVsZC0+YWRkX3JjKDYpOworICBmaWVsZC0+YWRkX3JjKDcpOworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBmaWVsZCA9IGl0ZW0tPmFkZF9ybSgpOworICBmaWVsZC0+c2V0X2MoNCk7CisgIGZpZWxkLT5hZGRfcmMoNyk7CisgIGZpZWxkLT5hZGRfcmMoNik7CisgIGZpZWxkLT5hZGRfcmMoNSk7CisgIGZpZWxkID0gaXRlbS0+YWRkX3JtKCk7CisgIGZpZWxkLT5zZXRfYygxKTsKKyAgZmllbGQtPmFkZF9yYygzKTsKKyAgZmllbGQtPmFkZF9yYygyKTsKKyAgaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKyAgZmllbGQgPSBpdGVtLT5hZGRfcm0oKTsKKyAgZmllbGQtPnNldF9jKDgpOworICBmaWVsZC0+YWRkX3JjKDEwKTsKKyAgZmllbGQtPmFkZF9yYygxMSk7CisgIGZpZWxkLT5hZGRfcmMoOSk7CisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGZpZWxkID0gaXRlbS0+YWRkX3JtKCk7CisgIGZpZWxkLT5zZXRfYyg4KTsKKyAgZmllbGQtPmFkZF9yYyg5KTsKKyAgZmllbGQtPmFkZF9yYygxMCk7CisgIGZpZWxkLT5hZGRfcmMoMTEpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJtYXRjaGVkOiBpdGVtWzBdLnJtWzBdLmMgLT4gaXRlbVswXS5ybVsxXS5jIDogMVxuIgorICAgICAgIm1vdmVkOiBpdGVtWzBdLnJtWzBdLnJjWzBdIC0+IGl0ZW1bMF0ucm1bMV0ucmNbMV0gOiAyXG4iCisgICAgICAibW92ZWQ6IGl0ZW1bMF0ucm1bMF0ucmNbMV0gLT4gaXRlbVswXS5ybVsxXS5yY1swXSA6IDNcbiIKKyAgICAgICJtb3ZlZDogaXRlbVswXS5ybVswXSAtPiBpdGVtWzBdLnJtWzFdIDogeyBjOiAxIHJjOiAyIHJjOiAzIH1cbiIKKyAgICAgICJtYXRjaGVkOiBpdGVtWzBdLnJtWzFdLmMgLT4gaXRlbVswXS5ybVswXS5jIDogNFxuIgorICAgICAgIm1vdmVkOiBpdGVtWzBdLnJtWzFdLnJjWzBdIC0+IGl0ZW1bMF0ucm1bMF0ucmNbMl0gOiA1XG4iCisgICAgICAibWF0Y2hlZDogaXRlbVswXS5ybVsxXS5yY1sxXSAtPiBpdGVtWzBdLnJtWzBdLnJjWzFdIDogNlxuIgorICAgICAgIm1vdmVkOiBpdGVtWzBdLnJtWzFdLnJjWzJdIC0+IGl0ZW1bMF0ucm1bMF0ucmNbMF0gOiA3XG4iCisgICAgICAibW92ZWQ6IGl0ZW1bMF0ucm1bMV0gLT4gaXRlbVswXS5ybVswXSA6IHsgYzogNCByYzogNSByYzogNiByYzogNyB9XG4iCisgICAgICAibWF0Y2hlZDogaXRlbVswXSA6IHsgcm0geyBjOiAxIHJjOiAyIHJjOiAzIH0iCisgICAgICAiIHJtIHsgYzogNCByYzogNSByYzogNiByYzogNyB9IH1cbiIKKyAgICAgICJtYXRjaGVkOiBpdGVtWzFdLnJtWzBdLmMgOiA4XG4iCisgICAgICAibW92ZWQ6IGl0ZW1bMV0ucm1bMF0ucmNbMF0gLT4gaXRlbVsxXS5ybVswXS5yY1sxXSA6IDEwXG4iCisgICAgICAibW92ZWQ6IGl0ZW1bMV0ucm1bMF0ucmNbMV0gLT4gaXRlbVsxXS5ybVswXS5yY1syXSA6IDExXG4iCisgICAgICAibW92ZWQ6IGl0ZW1bMV0ucm1bMF0ucmNbMl0gLT4gaXRlbVsxXS5ybVswXS5yY1swXSA6IDlcbiIKKyAgICAgICJtYXRjaGVkOiBpdGVtWzFdLnJtWzBdIDogeyBjOiA4IHJjOiAxMCByYzogMTEgcmM6IDkgfVxuIgorICAgICAgIm1hdGNoZWQ6IGl0ZW1bMV0gOiB7IHJtIHsgYzogOCByYzogMTAgcmM6IDExIHJjOiA5IH0gfVxuIiwKKyAgICAgIFJ1bldpdGhSZXN1bHQoJmRpZmZlcmVuY2VyLCBtc2cxLCBtc2cyLCB0cnVlKSk7Cit9CisKK1RFU1RfRihNYXRjaGluZ1Rlc3QsIE1hdGNoQW5kTW9kaWZpZWRJbnRlcmxlYXZlUHJvcGVybHkpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3REaWZmTWVzc2FnZSBtc2cxLCBtc2cyOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlOjpJdGVtKiBpdGVtOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEZpZWxkKiBmaWVsZDsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2M7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbmVzdGVkX2tleTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBuZXN0ZWRfZGVzYzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkb3VibGVfbmVzdGVkX2tleTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkb3VibGVfbmVzdGVkX2Rlc2M7CisgIGRlc2MgPSBtc2cxLkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJpdGVtIik7CisgIG5lc3RlZF9rZXkgPSBkZXNjLT5tZXNzYWdlX3R5cGUoKS0+RmluZEZpZWxkQnlOYW1lKCJhIik7CisgIG5lc3RlZF9kZXNjID0gZGVzYy0+bWVzc2FnZV90eXBlKCktPkZpbmRGaWVsZEJ5TmFtZSgicm0iKTsKKyAgZG91YmxlX25lc3RlZF9rZXkgPSBuZXN0ZWRfZGVzYy0+bWVzc2FnZV90eXBlKCktPkZpbmRGaWVsZEJ5TmFtZSgiYyIpOworICBkb3VibGVfbmVzdGVkX2Rlc2MgPSBuZXN0ZWRfZGVzYy0+bWVzc2FnZV90eXBlKCktPkZpbmRGaWVsZEJ5TmFtZSgicmMiKTsKKworICBNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyZW5jZXI7CisgIGRpZmZlcmVuY2VyLlRyZWF0QXNNYXAoZGVzYywgbmVzdGVkX2tleSk7CisgIGRpZmZlcmVuY2VyLlRyZWF0QXNNYXAobmVzdGVkX2Rlc2MsIGRvdWJsZV9uZXN0ZWRfa2V5KTsKKyAgZGlmZmVyZW5jZXIuVHJlYXRBc1NldChkb3VibGVfbmVzdGVkX2Rlc2MpOworCisgIGl0ZW0gPSBtc2cxLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDEpOworICBmaWVsZCA9IGl0ZW0tPmFkZF9ybSgpOworICBmaWVsZC0+c2V0X2MoMik7CisgIGZpZWxkLT5hZGRfcmMoMyk7CisgIGZpZWxkLT5hZGRfcmMoNCk7CisgIGZpZWxkID0gaXRlbS0+YWRkX3JtKCk7CisgIGZpZWxkLT5zZXRfYyg1KTsKKyAgZmllbGQtPmFkZF9yYyg2KTsKKyAgZmllbGQtPmFkZF9yYyg3KTsKKyAgZmllbGQtPmFkZF9yYyg4KTsKKyAgaXRlbSA9IG1zZzEuYWRkX2l0ZW0oKTsKKyAgaXRlbS0+c2V0X2EoOSk7CisgIGZpZWxkID0gaXRlbS0+YWRkX3JtKCk7CisgIGZpZWxkLT5zZXRfYygxMCk7CisgIGZpZWxkLT5hZGRfcmMoMTEpOworICBmaWVsZC0+YWRkX3JjKDEyKTsKKyAgZmllbGQgPSBpdGVtLT5hZGRfcm0oKTsKKyAgZmllbGQtPnNldF9jKDEzKTsKKworICBpdGVtID0gbXNnMi5hZGRfaXRlbSgpOworICBpdGVtLT5zZXRfYSgxKTsKKyAgZmllbGQgPSBpdGVtLT5hZGRfcm0oKTsKKyAgZmllbGQtPnNldF9jKDUpOworICBmaWVsZC0+YWRkX3JjKDgpOworICBmaWVsZC0+YWRkX3JjKDgpOworICBmaWVsZC0+YWRkX3JjKDYpOworICBmaWVsZCA9IGl0ZW0tPmFkZF9ybSgpOworICBmaWVsZC0+c2V0X2MoMyk7CisgIGZpZWxkLT5hZGRfcmMoMik7CisgIGZpZWxkLT5hZGRfcmMoNCk7CisgIGl0ZW0gPSBtc2cyLmFkZF9pdGVtKCk7CisgIGl0ZW0tPnNldF9hKDkpOworICBmaWVsZCA9IGl0ZW0tPmFkZF9ybSgpOworICBmaWVsZC0+c2V0X2MoMTApOworICBmaWVsZC0+YWRkX3JjKDEyKTsKKyAgZmllbGQtPmFkZF9yYygxMSk7CisgIGZpZWxkID0gaXRlbS0+YWRkX3JtKCk7CisgIGZpZWxkLT5zZXRfYygxMyk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgIm1hdGNoZWQ6IGl0ZW1bMF0uYSA6IDFcbiIKKyAgICAgICJtYXRjaGVkOiBpdGVtWzBdLnJtWzFdLmMgLT4gaXRlbVswXS5ybVswXS5jIDogNVxuIgorICAgICAgIm1vdmVkOiBpdGVtWzBdLnJtWzFdLnJjWzBdIC0+IGl0ZW1bMF0ucm1bMF0ucmNbMl0gOiA2XG4iCisgICAgICAibW92ZWQ6IGl0ZW1bMF0ucm1bMV0ucmNbMl0gLT4gaXRlbVswXS5ybVswXS5yY1swXSA6IDhcbiIKKyAgICAgICJhZGRlZDogaXRlbVswXS5ybVswXS5yY1sxXTogOFxuIgorICAgICAgImRlbGV0ZWQ6IGl0ZW1bMF0ucm1bMV0ucmNbMV06IDdcbiIKKyAgICAgICJtb2RpZmllZDogaXRlbVswXS5ybVsxXSAtPiBpdGVtWzBdLnJtWzBdOiB7IGM6IDUgcmM6IDYgcmM6IDcgcmM6IDggfSAtPiIKKyAgICAgICIgeyBjOiA1IHJjOiA4IHJjOiA4IHJjOiA2IH1cbiIKKyAgICAgICJhZGRlZDogaXRlbVswXS5ybVsxXTogeyBjOiAzIHJjOiAyIHJjOiA0IH1cbiIKKyAgICAgICJkZWxldGVkOiBpdGVtWzBdLnJtWzBdOiB7IGM6IDIgcmM6IDMgcmM6IDQgfVxuIgorICAgICAgIm1vZGlmaWVkOiBpdGVtWzBdOiB7IGE6IDEgcm0geyBjOiAyIHJjOiAzIHJjOiA0IH0iCisgICAgICAiIHJtIHsgYzogNSByYzogNiByYzogNyByYzogOCB9IH0gLT4iCisgICAgICAiIHsgYTogMSBybSB7IGM6IDUgcmM6IDggcmM6IDggcmM6IDYgfSIKKyAgICAgICIgcm0geyBjOiAzIHJjOiAyIHJjOiA0IH0gfVxuIgorICAgICAgIm1hdGNoZWQ6IGl0ZW1bMV0uYSA6IDlcbiIKKyAgICAgICJtYXRjaGVkOiBpdGVtWzFdLnJtWzBdLmMgOiAxMFxuIgorICAgICAgIm1vdmVkOiBpdGVtWzFdLnJtWzBdLnJjWzBdIC0+IGl0ZW1bMV0ucm1bMF0ucmNbMV0gOiAxMVxuIgorICAgICAgIm1vdmVkOiBpdGVtWzFdLnJtWzBdLnJjWzFdIC0+IGl0ZW1bMV0ucm1bMF0ucmNbMF0gOiAxMlxuIgorICAgICAgIm1hdGNoZWQ6IGl0ZW1bMV0ucm1bMF0gOiB7IGM6IDEwIHJjOiAxMSByYzogMTIgfVxuIgorICAgICAgIm1hdGNoZWQ6IGl0ZW1bMV0ucm1bMV0uYyA6IDEzXG4iCisgICAgICAibWF0Y2hlZDogaXRlbVsxXS5ybVsxXSA6IHsgYzogMTMgfVxuIgorICAgICAgIm1hdGNoZWQ6IGl0ZW1bMV0gOiB7IGE6IDkgcm0geyBjOiAxMCByYzogMTEgcmM6IDEyIH0gcm0geyBjOiAxMyB9IH1cbiIsCisgICAgICBSdW5XaXRoUmVzdWx0KCZkaWZmZXJlbmNlciwgbXNnMSwgbXNnMiwgZmFsc2UpKTsKK30KKworVEVTVF9GKE1hdGNoaW5nVGVzdCwgTWF0Y2hpbmdXb3Jrc1dpdGhFeHRlbnNpb25zKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtc2cxLCBtc2cyOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKiBuZXN0ZWQ7CisgIHVzaW5nIHByb3RvYnVmX3VuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb247CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3I7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzYzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBuZXN0ZWRfa2V5OworICBkZXNjcmlwdG9yID0gbXNnMS5HZXREZXNjcmlwdG9yKCktPmZpbGUoKTsKKyAgZGVzYyA9IGRlc2NyaXB0b3ItPkZpbmRFeHRlbnNpb25CeU5hbWUoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiIpOworICBBU1NFUlRfRkFMU0UoZGVzYyA9PSBudWxscHRyKTsKKyAgbmVzdGVkX2tleSA9IGRlc2MtPm1lc3NhZ2VfdHlwZSgpLT5GaW5kRmllbGRCeU5hbWUoImJiIik7CisKKyAgTWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcmVuY2VyOworICBkaWZmZXJlbmNlci5UcmVhdEFzTWFwKGRlc2MsIG5lc3RlZF9rZXkpOworCisgIG5lc3RlZCA9IG1zZzEuQWRkRXh0ZW5zaW9uKHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbik7CisgIG5lc3RlZC0+c2V0X2JiKDcpOworICBuZXN0ZWQgPSBtc2cxLkFkZEV4dGVuc2lvbihyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pOworICBuZXN0ZWQtPnNldF9iYigxMyk7CisgIG5lc3RlZCA9IG1zZzEuQWRkRXh0ZW5zaW9uKHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbik7CisgIG5lc3RlZC0+c2V0X2JiKDExKTsKKyAgbmVzdGVkID0gbXNnMi5BZGRFeHRlbnNpb24ocmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKTsKKyAgbmVzdGVkLT5zZXRfYmIoMTEpOworICBuZXN0ZWQgPSBtc2cyLkFkZEV4dGVuc2lvbihyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pOworICBuZXN0ZWQtPnNldF9iYigxMyk7CisgIG5lc3RlZCA9IG1zZzIuQWRkRXh0ZW5zaW9uKHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbik7CisgIG5lc3RlZC0+c2V0X2JiKDcpOworCisgIEVYUEVDVF9FUSgKKyAgICAgICJtYXRjaGVkOiAocHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKVswXS5iYiAtPiIKKyAgICAgICIgKHByb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbilbMl0uYmIgOiA3XG4iCisgICAgICAibW92ZWQ6IChwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pWzBdIC0+IgorICAgICAgIiAocHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKVsyXSA6IgorICAgICAgIiB7IGJiOiA3IH1cbiIKKyAgICAgICJtYXRjaGVkOiAocHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKVsxXS5iYiA6IgorICAgICAgIiAxM1xuIgorICAgICAgIm1hdGNoZWQ6IChwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pWzFdIDoiCisgICAgICAiIHsgYmI6IDEzIH1cbiIKKyAgICAgICJtYXRjaGVkOiAocHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKVsyXS5iYiAtPiIKKyAgICAgICIgKHByb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbilbMF0uYmIgOiIKKyAgICAgICIgMTFcbiIKKyAgICAgICJtb3ZlZDogKHByb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbilbMl0gLT4iCisgICAgICAiIChwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pWzBdIDoiCisgICAgICAiIHsgYmI6IDExIH1cbiIsCisgICAgICBSdW5XaXRoUmVzdWx0KCZkaWZmZXJlbmNlciwgbXNnMSwgbXNnMiwgdHJ1ZSkpOworfQorCitURVNUKEFueVRlc3QsIFNpbXBsZSkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEZpZWxkIHZhbHVlMSwgdmFsdWUyOworICB2YWx1ZTEuc2V0X2EoMjApOworICB2YWx1ZTIuc2V0X2EoMjEpOworCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QW55IG0xLCBtMjsKKyAgbTEubXV0YWJsZV9hbnlfdmFsdWUoKS0+UGFja0Zyb20odmFsdWUxKTsKKyAgbTIubXV0YWJsZV9hbnlfdmFsdWUoKS0+UGFja0Zyb20odmFsdWUyKTsKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIG1lc3NhZ2VfZGlmZmVyZW5jZXI7CisgIHN0ZDo6c3RyaW5nIGRpZmZlcmVuY2Vfc3RyaW5nOworICBtZXNzYWdlX2RpZmZlcmVuY2VyLlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoJmRpZmZlcmVuY2Vfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2VfZGlmZmVyZW5jZXIuQ29tcGFyZShtMSwgbTIpKTsKKyAgRVhQRUNUX0VRKCJtb2RpZmllZDogYW55X3ZhbHVlLmE6IDIwIC0+IDIxXG4iLCBkaWZmZXJlbmNlX3N0cmluZyk7Cit9CisKK1RFU1QoQW55dGVzdCwgVHJlYXRBc1NldCkgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEZpZWxkIHZhbHVlMSwgdmFsdWUyOworICB2YWx1ZTEuc2V0X2EoMjApOworICB2YWx1ZTEuc2V0X2IoMzApOworICB2YWx1ZTIuc2V0X2EoMjApOworICB2YWx1ZTIuc2V0X2IoMzEpOworCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QW55IG0xLCBtMjsKKyAgbTEuYWRkX3JlcGVhdGVkX2FueV92YWx1ZSgpLT5QYWNrRnJvbSh2YWx1ZTEpOworICBtMS5hZGRfcmVwZWF0ZWRfYW55X3ZhbHVlKCktPlBhY2tGcm9tKHZhbHVlMik7CisgIG0yLmFkZF9yZXBlYXRlZF9hbnlfdmFsdWUoKS0+UGFja0Zyb20odmFsdWUyKTsKKyAgbTIuYWRkX3JlcGVhdGVkX2FueV92YWx1ZSgpLT5QYWNrRnJvbSh2YWx1ZTEpOworCisgIHV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlciBtZXNzYWdlX2RpZmZlcmVuY2VyOworICBtZXNzYWdlX2RpZmZlcmVuY2VyLlRyZWF0QXNTZXQoR2V0RmllbGREZXNjcmlwdG9yKG0xLCAicmVwZWF0ZWRfYW55X3ZhbHVlIikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlX2RpZmZlcmVuY2VyLkNvbXBhcmUobTEsIG0yKSk7Cit9CisKK1RFU1QoQW55dGVzdCwgVHJlYXRBc1NldF9EaWZmZXJlbnRUeXBlKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RmllbGQgdmFsdWUxOworICB2YWx1ZTEuc2V0X2EoMjApOworICB2YWx1ZTEuc2V0X2IoMzApOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdERpZmZNZXNzYWdlIHZhbHVlMjsKKyAgdmFsdWUyLmFkZF9ydig0MCk7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbnkgbTEsIG0yOworICBtMS5hZGRfcmVwZWF0ZWRfYW55X3ZhbHVlKCktPlBhY2tGcm9tKHZhbHVlMSk7CisgIG0xLmFkZF9yZXBlYXRlZF9hbnlfdmFsdWUoKS0+UGFja0Zyb20odmFsdWUyKTsKKyAgbTIuYWRkX3JlcGVhdGVkX2FueV92YWx1ZSgpLT5QYWNrRnJvbSh2YWx1ZTIpOworICBtMi5hZGRfcmVwZWF0ZWRfYW55X3ZhbHVlKCktPlBhY2tGcm9tKHZhbHVlMSk7CisKKyAgdXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyIG1lc3NhZ2VfZGlmZmVyZW5jZXI7CisgIG1lc3NhZ2VfZGlmZmVyZW5jZXIuVHJlYXRBc1NldChHZXRGaWVsZERlc2NyaXB0b3IobTEsICJyZXBlYXRlZF9hbnlfdmFsdWUiKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfZGlmZmVyZW5jZXIuQ29tcGFyZShtMSwgbTIpKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucHJvdG8gYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQ2NzkyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucHJvdG8KQEAgLTAsMCArMSw3OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBtZXNzYWdlcyBmb3IgdGVzdGluZyByZXBlYXRlZCBmaWVsZCBjb21wYXJpc29uCisvLyBMSU5UOiBBTExPV19HUk9VUFMKKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90byI7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKKworbWVzc2FnZSBUZXN0RmllbGQgeworICBvcHRpb25hbCBpbnQzMiBhID0gMzsKKyAgb3B0aW9uYWwgaW50MzIgYiA9IDQ7CisgIG9wdGlvbmFsIGludDMyIGMgPSAxOworICByZXBlYXRlZCBpbnQzMiByYyA9IDI7CisgIG9wdGlvbmFsIFRlc3RGaWVsZCBtID0gNTsKKworICBleHRlbmQgVGVzdERpZmZNZXNzYWdlIHsKKyAgICBvcHRpb25hbCBUZXN0RmllbGQgdGYgPSAxMDA7CisgIH0KK30KKworbWVzc2FnZSBUZXN0RGlmZk1lc3NhZ2UgeworICByZXBlYXRlZCBncm91cCBJdGVtID0gMSB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDI7ICAgICAgIC8vIFRlc3QgYmFzaWMgcmVwZWF0ZWQgZmllbGQgY29tcGFyaXNvbi4KKyAgICBvcHRpb25hbCBzdHJpbmcgYiA9IDQ7ICAgICAgLy8gVGVzdCBiYXNpYyByZXBlYXRlZCBmaWVsZCBjb21wYXJpc29uLgorICAgIHJlcGVhdGVkIGludDMyIHJhID0gMzsgICAgICAvLyBUZXN0IFNldE9mU2V0IENvbXBhcmlzb24uCisgICAgcmVwZWF0ZWQgc3RyaW5nIHJiID0gNTsgICAgIC8vIFRlc3QgVHJlYXRBc01hcCB3aGVuIGtleSBpcyByZXBlYXRlZAorICAgIG9wdGlvbmFsIFRlc3RGaWVsZCBtID0gNjsgICAvLyBUZXN0IFRyZWF0QXNNYXAgd2hlbiBrZXkgaXMgYSBtZXNzYWdlCisgICAgcmVwZWF0ZWQgVGVzdEZpZWxkIHJtID0gNzsgIC8vIFRlc3QgVHJlYXRBc01hcCB3aGVuIGtleSBpcyBhIHJlcGVhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UKKyAgICBtYXA8c3RyaW5nLCBpbnQzMj4gbXAgPSA4OyAgLy8gVGVzdCBmb3IgbWFwIGNvbXBhcmlzb25zCisgIH0KKworICBvcHRpb25hbCBpbnQzMiB2ID0gMTMgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKKyAgb3B0aW9uYWwgc3RyaW5nIHcgPSAxNDsKKyAgb3B0aW9uYWwgVGVzdEZpZWxkIG0gPSAxNTsKKyAgcmVwZWF0ZWQgaW50MzIgcnYgPSAxMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlc3QgZm9yIGNvbWJpbmF0aW9ucworICByZXBlYXRlZCBzdHJpbmcgcncgPSAxMDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVzdCBmb3IgY29tYmluYXRpb25zCisgIHJlcGVhdGVkIFRlc3RGaWVsZCBybSA9IDEyIFtkZXByZWNhdGVkID0gdHJ1ZV07ICAvLyBUZXN0IGZvciBjb21iaW5hdGlvbnMKKyAgcmVwZWF0ZWQgZ29vZ2xlLnByb3RvYnVmLkFueSByYW55ID0KKyAgICAgIDE2OyAgLy8gVGVzdCBmb3IgcmVwZWF0ZWQgQW55IHR5cGUgcmVzb2x1dGlvbgorICBleHRlbnNpb25zIDEwMCB0byAxOTk7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcGFja2FnZV9pbmZvLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvcGFja2FnZV9pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwMTkyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9wYWNrYWdlX2luZm8uaApAQCAtMCwwICsxLDQ2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBmaWxlIGV4aXN0cyBzb2xlbHkgdG8gZG9jdW1lbnQgdGhlIGdvb2dsZTo6cHJvdG9idWY6OnV0aWwgbmFtZXNwYWNlLgorLy8gSXQgaXMgbm90IGNvbXBpbGVkIGludG8gYW55dGhpbmcsIGJ1dCBpdCBtYXkgYmUgcmVhZCBieSBhbiBhdXRvbWF0ZWQKKy8vIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yLgorCituYW1lc3BhY2UgZ29vZ2xlIHsKKworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gVXRpbGl0eSBjbGFzc2VzLgorLy8KKy8vIFRoaXMgcGFja2FnZSBjb250YWlucyB2YXJpb3VzIHV0aWxpdGllcyBmb3IgbWVzc2FnZSBjb21wYXJpc29uLCBKU09OCisvLyBjb252ZXJzaW9uLCB3ZWxsIGtub3duIHR5cGVzLCBldGMuCituYW1lc3BhY2UgdXRpbCB7fQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWwuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OTNhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmNjCkBAIC0wLDAgKzEsNTE0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL3RpbWVfdXRpbC5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjguaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWUuaD4KKworLy8gTXVzdCBnbyBhZnRlciBvdGhlciBpbmNsdWRlcy4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CisKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OkR1cmF0aW9uOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6VGltZXN0YW1wOworCituYW1lc3BhY2Ugeworc3RhdGljIGNvbnN0IGludCBrTmFub3NQZXJTZWNvbmQgPSAxMDAwMDAwMDAwOworc3RhdGljIGNvbnN0IGludCBrTWljcm9zUGVyU2Vjb25kID0gMTAwMDAwMDsKK3N0YXRpYyBjb25zdCBpbnQga01pbGxpc1BlclNlY29uZCA9IDEwMDA7CitzdGF0aWMgY29uc3QgaW50IGtOYW5vc1Blck1pbGxpc2Vjb25kID0gMTAwMDAwMDsKK3N0YXRpYyBjb25zdCBpbnQga05hbm9zUGVyTWljcm9zZWNvbmQgPSAxMDAwOworc3RhdGljIGNvbnN0IGludCBrU2Vjb25kc1Blck1pbnV0ZSA9IDYwOyAgLy8gTm90ZSB0aGF0IHdlIGlnbm9yZSBsZWFwIHNlY29uZHMuCitzdGF0aWMgY29uc3QgaW50IGtTZWNvbmRzUGVySG91ciA9IDM2MDA7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBDcmVhdGVOb3JtYWxpemVkKGludDY0X3Qgc2Vjb25kcywgaW50NjRfdCBuYW5vcyk7CisKK3RlbXBsYXRlIDw+CitUaW1lc3RhbXAgQ3JlYXRlTm9ybWFsaXplZChpbnQ2NF90IHNlY29uZHMsIGludDY0X3QgbmFub3MpIHsKKyAgLy8gTWFrZSBzdXJlIG5hbm9zIGlzIGluIHRoZSByYW5nZS4KKyAgaWYgKG5hbm9zIDw9IC1rTmFub3NQZXJTZWNvbmQgfHwgbmFub3MgPj0ga05hbm9zUGVyU2Vjb25kKSB7CisgICAgc2Vjb25kcyArPSBuYW5vcyAvIGtOYW5vc1BlclNlY29uZDsKKyAgICBuYW5vcyA9IG5hbm9zICUga05hbm9zUGVyU2Vjb25kOworICB9CisgIC8vIEZvciBUaW1lc3RhbXAgbmFub3Mgc2hvdWxkIGJlIGluIHRoZSByYW5nZSBbMCwgOTk5OTk5OTk5XQorICBpZiAobmFub3MgPCAwKSB7CisgICAgc2Vjb25kcyAtPSAxOworICAgIG5hbm9zICs9IGtOYW5vc1BlclNlY29uZDsKKyAgfQorICBHT09HTEVfRENIRUNLKHNlY29uZHMgPj0gVGltZVV0aWw6OmtUaW1lc3RhbXBNaW5TZWNvbmRzICYmCisgICAgICAgICBzZWNvbmRzIDw9IFRpbWVVdGlsOjprVGltZXN0YW1wTWF4U2Vjb25kcyk7CisgIFRpbWVzdGFtcCByZXN1bHQ7CisgIHJlc3VsdC5zZXRfc2Vjb25kcyhzZWNvbmRzKTsKKyAgcmVzdWx0LnNldF9uYW5vcyhzdGF0aWNfY2FzdDxpbnQzMl90PihuYW5vcykpOworICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8PgorRHVyYXRpb24gQ3JlYXRlTm9ybWFsaXplZChpbnQ2NF90IHNlY29uZHMsIGludDY0X3QgbmFub3MpIHsKKyAgLy8gTWFrZSBzdXJlIG5hbm9zIGlzIGluIHRoZSByYW5nZS4KKyAgaWYgKG5hbm9zIDw9IC1rTmFub3NQZXJTZWNvbmQgfHwgbmFub3MgPj0ga05hbm9zUGVyU2Vjb25kKSB7CisgICAgc2Vjb25kcyArPSBuYW5vcyAvIGtOYW5vc1BlclNlY29uZDsKKyAgICBuYW5vcyA9IG5hbm9zICUga05hbm9zUGVyU2Vjb25kOworICB9CisgIC8vIG5hbm9zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHNpZ24gYXMgc2Vjb25kcy4KKyAgaWYgKHNlY29uZHMgPCAwICYmIG5hbm9zID4gMCkgeworICAgIHNlY29uZHMgKz0gMTsKKyAgICBuYW5vcyAtPSBrTmFub3NQZXJTZWNvbmQ7CisgIH0gZWxzZSBpZiAoc2Vjb25kcyA+IDAgJiYgbmFub3MgPCAwKSB7CisgICAgc2Vjb25kcyAtPSAxOworICAgIG5hbm9zICs9IGtOYW5vc1BlclNlY29uZDsKKyAgfQorICBHT09HTEVfRENIRUNLKHNlY29uZHMgPj0gVGltZVV0aWw6OmtEdXJhdGlvbk1pblNlY29uZHMgJiYKKyAgICAgICAgIHNlY29uZHMgPD0gVGltZVV0aWw6OmtEdXJhdGlvbk1heFNlY29uZHMpOworICBEdXJhdGlvbiByZXN1bHQ7CisgIHJlc3VsdC5zZXRfc2Vjb25kcyhzZWNvbmRzKTsKKyAgcmVzdWx0LnNldF9uYW5vcyhzdGF0aWNfY2FzdDxpbnQzMl90PihuYW5vcykpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBGb3JtYXQgbmFub3NlY29uZHMgd2l0aCBlaXRoZXIgMywgNiwgb3IgOSBkaWdpdHMgZGVwZW5kaW5nIG9uIHRoZSByZXF1aXJlZAorLy8gcHJlY2lzaW9uIHRvIHJlcHJlc2VudCB0aGUgZXhhY3QgdmFsdWUuCitzdGQ6OnN0cmluZyBGb3JtYXROYW5vcyhpbnQzMl90IG5hbm9zKSB7CisgIGlmIChuYW5vcyAlIGtOYW5vc1Blck1pbGxpc2Vjb25kID09IDApIHsKKyAgICByZXR1cm4gU3RyaW5nUHJpbnRmKCIlMDNkIiwgbmFub3MgLyBrTmFub3NQZXJNaWxsaXNlY29uZCk7CisgIH0gZWxzZSBpZiAobmFub3MgJSBrTmFub3NQZXJNaWNyb3NlY29uZCA9PSAwKSB7CisgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiJTA2ZCIsIG5hbm9zIC8ga05hbm9zUGVyTWljcm9zZWNvbmQpOworICB9IGVsc2UgeworICAgIHJldHVybiBTdHJpbmdQcmludGYoIiUwOWQiLCBuYW5vcyk7CisgIH0KK30KKworc3RkOjpzdHJpbmcgRm9ybWF0VGltZShpbnQ2NF90IHNlY29uZHMsIGludDMyX3QgbmFub3MpIHsKKyAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZvcm1hdFRpbWUoc2Vjb25kcywgbmFub3MpOworfQorCitib29sIFBhcnNlVGltZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsIGludDY0X3QqIHNlY29uZHMsIGludDMyX3QqIG5hbm9zKSB7CisgIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpQYXJzZVRpbWUodmFsdWUsIHNlY29uZHMsIG5hbm9zKTsKK30KKwordm9pZCBDdXJyZW50VGltZShpbnQ2NF90KiBzZWNvbmRzLCBpbnQzMl90KiBuYW5vcykgeworICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0Q3VycmVudFRpbWUoc2Vjb25kcywgbmFub3MpOworfQorCisvLyBUcnVuY2F0ZXMgdGhlIHJlbWFpbmRlciBwYXJ0IGFmdGVyIGRpdmlzaW9uLgoraW50NjRfdCBSb3VuZFRvd2FyZFplcm8oaW50NjRfdCB2YWx1ZSwgaW50NjRfdCBkaXZpZGVyKSB7CisgIGludDY0X3QgcmVzdWx0ID0gdmFsdWUgLyBkaXZpZGVyOworICBpbnQ2NF90IHJlbWFpbmRlciA9IHZhbHVlICUgZGl2aWRlcjsKKyAgLy8gQmVmb3JlIEMrKzExLCB0aGUgc2lnbiBvZiB0aGUgcmVtYWluZGVyIGlzIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBpZgorICAvLyBhbnkgb2YgdGhlIG9wZXJhbmRzIGlzIG5lZ2F0aXZlLiBIZXJlIHdlIHRyeSB0byBlbmZvcmNlIEMrKzExJ3MgInJvdW5kZWQKKyAgLy8gdG93YXJkIHplcm8iIHNlbWFudGljcy4gRm9yIGV4YW1wbGUsIGZvciAoLTUpIC8gMiBhbiBpbXBsZW1lbnRhdGlvbiBtYXkKKyAgLy8gZ2l2ZSAtMyBhcyB0aGUgcmVzdWx0IHdpdGggdGhlIHJlbWFpbmRlciBiZWluZyAxLiBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMKKyAgLy8gd2UgYWx3YXlzIHJldHVybiAtMiAoY2xvc2VyIHRvIHplcm8pIHJlZ2FyZGxlc3Mgb2YgdGhlIGltcGxlbWVudGF0aW9uLgorICBpZiAocmVzdWx0IDwgMCAmJiByZW1haW5kZXIgPiAwKSB7CisgICAgcmV0dXJuIHJlc3VsdCArIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlCisKKy8vIEFjdHVhbGx5IGRlZmluZSB0aGVzZSBzdGF0aWMgY29uc3QgaW50ZWdlcnMuIFJlcXVpcmVkIGJ5IEMrKyBzdGFuZGFyZCAoYnV0CisvLyBzb21lIGNvbXBpbGVycyBkb24ndCBsaWtlIGl0KS4KKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludDY0X3QgVGltZVV0aWw6OmtUaW1lc3RhbXBNaW5TZWNvbmRzOworY29uc3QgaW50NjRfdCBUaW1lVXRpbDo6a1RpbWVzdGFtcE1heFNlY29uZHM7Citjb25zdCBpbnQ2NF90IFRpbWVVdGlsOjprRHVyYXRpb25NYXhTZWNvbmRzOworY29uc3QgaW50NjRfdCBUaW1lVXRpbDo6a0R1cmF0aW9uTWluU2Vjb25kczsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCisKK3N0ZDo6c3RyaW5nIFRpbWVVdGlsOjpUb1N0cmluZyhjb25zdCBUaW1lc3RhbXAmIHRpbWVzdGFtcCkgeworICByZXR1cm4gRm9ybWF0VGltZSh0aW1lc3RhbXAuc2Vjb25kcygpLCB0aW1lc3RhbXAubmFub3MoKSk7Cit9CisKK2Jvb2wgVGltZVV0aWw6OkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLCBUaW1lc3RhbXAqIHRpbWVzdGFtcCkgeworICBpbnQ2NF90IHNlY29uZHM7CisgIGludDMyX3QgbmFub3M7CisgIGlmICghUGFyc2VUaW1lKHZhbHVlLCAmc2Vjb25kcywgJm5hbm9zKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAqdGltZXN0YW1wID0gQ3JlYXRlTm9ybWFsaXplZDxUaW1lc3RhbXA+KHNlY29uZHMsIG5hbm9zKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK1RpbWVzdGFtcCBUaW1lVXRpbDo6R2V0Q3VycmVudFRpbWUoKSB7CisgIGludDY0X3Qgc2Vjb25kczsKKyAgaW50MzJfdCBuYW5vczsKKyAgQ3VycmVudFRpbWUoJnNlY29uZHMsICZuYW5vcyk7CisgIHJldHVybiBDcmVhdGVOb3JtYWxpemVkPFRpbWVzdGFtcD4oc2Vjb25kcywgbmFub3MpOworfQorCitUaW1lc3RhbXAgVGltZVV0aWw6OkdldEVwb2NoKCkgeyByZXR1cm4gVGltZXN0YW1wKCk7IH0KKworc3RkOjpzdHJpbmcgVGltZVV0aWw6OlRvU3RyaW5nKGNvbnN0IER1cmF0aW9uJiBkdXJhdGlvbikgeworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIGludDY0X3Qgc2Vjb25kcyA9IGR1cmF0aW9uLnNlY29uZHMoKTsKKyAgaW50MzJfdCBuYW5vcyA9IGR1cmF0aW9uLm5hbm9zKCk7CisgIGlmIChzZWNvbmRzIDwgMCB8fCBuYW5vcyA8IDApIHsKKyAgICByZXN1bHQgKz0gIi0iOworICAgIHNlY29uZHMgPSAtc2Vjb25kczsKKyAgICBuYW5vcyA9IC1uYW5vczsKKyAgfQorICByZXN1bHQgKz0gU3RyQ2F0KHNlY29uZHMpOworICBpZiAobmFub3MgIT0gMCkgeworICAgIHJlc3VsdCArPSAiLiIgKyBGb3JtYXROYW5vcyhuYW5vcyk7CisgIH0KKyAgcmVzdWx0ICs9ICJzIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludDY0X3QgUG93KGludDY0X3QgeCwgaW50IHkpIHsKKyAgaW50NjRfdCByZXN1bHQgPSAxOworICBmb3IgKGludCBpID0gMDsgaSA8IHk7ICsraSkgeworICAgIHJlc3VsdCAqPSB4OworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgVGltZVV0aWw6OkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLCBEdXJhdGlvbiogZHVyYXRpb24pIHsKKyAgaWYgKHZhbHVlLmxlbmd0aCgpIDw9IDEgfHwgdmFsdWVbdmFsdWUubGVuZ3RoKCkgLSAxXSAhPSAncycpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYm9vbCBuZWdhdGl2ZSA9ICh2YWx1ZVswXSA9PSAnLScpOworICBzaXplX3Qgc2lnbl9sZW5ndGggPSAobmVnYXRpdmUgPyAxIDogMCk7CisgIC8vIFBhcnNlIHRoZSBkdXJhdGlvbiB2YWx1ZSBhcyB0d28gaW50ZWdlcnMgcmF0aGVyIHRoYW4gYSBmbG9hdCB2YWx1ZQorICAvLyB0byBhdm9pZCBwcmVjaXNpb24gbG9zcy4KKyAgc3RkOjpzdHJpbmcgc2Vjb25kc19wYXJ0LCBuYW5vc19wYXJ0OworICBzaXplX3QgcG9zID0gdmFsdWUuZmluZF9sYXN0X29mKCcuJyk7CisgIGlmIChwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBzZWNvbmRzX3BhcnQgPSB2YWx1ZS5zdWJzdHIoc2lnbl9sZW5ndGgsIHZhbHVlLmxlbmd0aCgpIC0gMSAtIHNpZ25fbGVuZ3RoKTsKKyAgICBuYW5vc19wYXJ0ID0gIjAiOworICB9IGVsc2UgeworICAgIHNlY29uZHNfcGFydCA9IHZhbHVlLnN1YnN0cihzaWduX2xlbmd0aCwgcG9zIC0gc2lnbl9sZW5ndGgpOworICAgIG5hbm9zX3BhcnQgPSB2YWx1ZS5zdWJzdHIocG9zICsgMSwgdmFsdWUubGVuZ3RoKCkgLSBwb3MgLSAyKTsKKyAgfQorICBjaGFyKiBlbmQ7CisgIGludDY0X3Qgc2Vjb25kcyA9IHN0cnRvNjQoc2Vjb25kc19wYXJ0LmNfc3RyKCksICZlbmQsIDEwKTsKKyAgaWYgKGVuZCAhPSBzZWNvbmRzX3BhcnQuY19zdHIoKSArIHNlY29uZHNfcGFydC5sZW5ndGgoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbnQ2NF90IG5hbm9zID0gc3RydG82NChuYW5vc19wYXJ0LmNfc3RyKCksICZlbmQsIDEwKTsKKyAgaWYgKGVuZCAhPSBuYW5vc19wYXJ0LmNfc3RyKCkgKyBuYW5vc19wYXJ0Lmxlbmd0aCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG5hbm9zID0gbmFub3MgKiBQb3coMTAsIHN0YXRpY19jYXN0PGludD4oOSAtIG5hbm9zX3BhcnQubGVuZ3RoKCkpKTsKKyAgaWYgKG5lZ2F0aXZlKSB7CisgICAgLy8gSWYgYSBEdXJhdGlvbiBpcyBuZWdhdGl2ZSwgYm90aCBzZWNvbmRzIGFuZCBuYW5vcyBzaG91bGQgYmUgbmVnYXRpdmUuCisgICAgc2Vjb25kcyA9IC1zZWNvbmRzOworICAgIG5hbm9zID0gLW5hbm9zOworICB9CisgIGR1cmF0aW9uLT5zZXRfc2Vjb25kcyhzZWNvbmRzKTsKKyAgZHVyYXRpb24tPnNldF9uYW5vcyhzdGF0aWNfY2FzdDxpbnQzMl90PihuYW5vcykpOworICByZXR1cm4gdHJ1ZTsKK30KKworRHVyYXRpb24gVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9EdXJhdGlvbihpbnQ2NF90IG5hbm9zKSB7CisgIHJldHVybiBDcmVhdGVOb3JtYWxpemVkPER1cmF0aW9uPihuYW5vcyAvIGtOYW5vc1BlclNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbm9zICUga05hbm9zUGVyU2Vjb25kKTsKK30KKworRHVyYXRpb24gVGltZVV0aWw6Ok1pY3Jvc2Vjb25kc1RvRHVyYXRpb24oaW50NjRfdCBtaWNyb3MpIHsKKyAgcmV0dXJuIENyZWF0ZU5vcm1hbGl6ZWQ8RHVyYXRpb24+KAorICAgICAgbWljcm9zIC8ga01pY3Jvc1BlclNlY29uZCwKKyAgICAgIChtaWNyb3MgJSBrTWljcm9zUGVyU2Vjb25kKSAqIGtOYW5vc1Blck1pY3Jvc2Vjb25kKTsKK30KKworRHVyYXRpb24gVGltZVV0aWw6Ok1pbGxpc2Vjb25kc1RvRHVyYXRpb24oaW50NjRfdCBtaWxsaXMpIHsKKyAgcmV0dXJuIENyZWF0ZU5vcm1hbGl6ZWQ8RHVyYXRpb24+KAorICAgICAgbWlsbGlzIC8ga01pbGxpc1BlclNlY29uZCwKKyAgICAgIChtaWxsaXMgJSBrTWlsbGlzUGVyU2Vjb25kKSAqIGtOYW5vc1Blck1pbGxpc2Vjb25kKTsKK30KKworRHVyYXRpb24gVGltZVV0aWw6OlNlY29uZHNUb0R1cmF0aW9uKGludDY0X3Qgc2Vjb25kcykgeworICByZXR1cm4gQ3JlYXRlTm9ybWFsaXplZDxEdXJhdGlvbj4oc2Vjb25kcywgMCk7Cit9CisKK0R1cmF0aW9uIFRpbWVVdGlsOjpNaW51dGVzVG9EdXJhdGlvbihpbnQ2NF90IG1pbnV0ZXMpIHsKKyAgcmV0dXJuIENyZWF0ZU5vcm1hbGl6ZWQ8RHVyYXRpb24+KG1pbnV0ZXMgKiBrU2Vjb25kc1Blck1pbnV0ZSwgMCk7Cit9CisKK0R1cmF0aW9uIFRpbWVVdGlsOjpIb3Vyc1RvRHVyYXRpb24oaW50NjRfdCBob3VycykgeworICByZXR1cm4gQ3JlYXRlTm9ybWFsaXplZDxEdXJhdGlvbj4oaG91cnMgKiBrU2Vjb25kc1BlckhvdXIsIDApOworfQorCitpbnQ2NF90IFRpbWVVdGlsOjpEdXJhdGlvblRvTmFub3NlY29uZHMoY29uc3QgRHVyYXRpb24mIGR1cmF0aW9uKSB7CisgIHJldHVybiBkdXJhdGlvbi5zZWNvbmRzKCkgKiBrTmFub3NQZXJTZWNvbmQgKyBkdXJhdGlvbi5uYW5vcygpOworfQorCitpbnQ2NF90IFRpbWVVdGlsOjpEdXJhdGlvblRvTWljcm9zZWNvbmRzKGNvbnN0IER1cmF0aW9uJiBkdXJhdGlvbikgeworICByZXR1cm4gZHVyYXRpb24uc2Vjb25kcygpICoga01pY3Jvc1BlclNlY29uZCArCisgICAgICAgICBSb3VuZFRvd2FyZFplcm8oZHVyYXRpb24ubmFub3MoKSwga05hbm9zUGVyTWljcm9zZWNvbmQpOworfQorCitpbnQ2NF90IFRpbWVVdGlsOjpEdXJhdGlvblRvTWlsbGlzZWNvbmRzKGNvbnN0IER1cmF0aW9uJiBkdXJhdGlvbikgeworICByZXR1cm4gZHVyYXRpb24uc2Vjb25kcygpICoga01pbGxpc1BlclNlY29uZCArCisgICAgICAgICBSb3VuZFRvd2FyZFplcm8oZHVyYXRpb24ubmFub3MoKSwga05hbm9zUGVyTWlsbGlzZWNvbmQpOworfQorCitpbnQ2NF90IFRpbWVVdGlsOjpEdXJhdGlvblRvU2Vjb25kcyhjb25zdCBEdXJhdGlvbiYgZHVyYXRpb24pIHsKKyAgcmV0dXJuIGR1cmF0aW9uLnNlY29uZHMoKTsKK30KKworaW50NjRfdCBUaW1lVXRpbDo6RHVyYXRpb25Ub01pbnV0ZXMoY29uc3QgRHVyYXRpb24mIGR1cmF0aW9uKSB7CisgIHJldHVybiBSb3VuZFRvd2FyZFplcm8oZHVyYXRpb24uc2Vjb25kcygpLCBrU2Vjb25kc1Blck1pbnV0ZSk7Cit9CisKK2ludDY0X3QgVGltZVV0aWw6OkR1cmF0aW9uVG9Ib3Vycyhjb25zdCBEdXJhdGlvbiYgZHVyYXRpb24pIHsKKyAgcmV0dXJuIFJvdW5kVG93YXJkWmVybyhkdXJhdGlvbi5zZWNvbmRzKCksIGtTZWNvbmRzUGVySG91cik7Cit9CisKK1RpbWVzdGFtcCBUaW1lVXRpbDo6TmFub3NlY29uZHNUb1RpbWVzdGFtcChpbnQ2NF90IG5hbm9zKSB7CisgIHJldHVybiBDcmVhdGVOb3JtYWxpemVkPFRpbWVzdGFtcD4obmFub3MgLyBrTmFub3NQZXJTZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFub3MgJSBrTmFub3NQZXJTZWNvbmQpOworfQorCitUaW1lc3RhbXAgVGltZVV0aWw6Ok1pY3Jvc2Vjb25kc1RvVGltZXN0YW1wKGludDY0X3QgbWljcm9zKSB7CisgIHJldHVybiBDcmVhdGVOb3JtYWxpemVkPFRpbWVzdGFtcD4oCisgICAgICBtaWNyb3MgLyBrTWljcm9zUGVyU2Vjb25kLAorICAgICAgbWljcm9zICUga01pY3Jvc1BlclNlY29uZCAqIGtOYW5vc1Blck1pY3Jvc2Vjb25kKTsKK30KKworVGltZXN0YW1wIFRpbWVVdGlsOjpNaWxsaXNlY29uZHNUb1RpbWVzdGFtcChpbnQ2NF90IG1pbGxpcykgeworICByZXR1cm4gQ3JlYXRlTm9ybWFsaXplZDxUaW1lc3RhbXA+KAorICAgICAgbWlsbGlzIC8ga01pbGxpc1BlclNlY29uZCwKKyAgICAgIG1pbGxpcyAlIGtNaWxsaXNQZXJTZWNvbmQgKiBrTmFub3NQZXJNaWxsaXNlY29uZCk7Cit9CisKK1RpbWVzdGFtcCBUaW1lVXRpbDo6U2Vjb25kc1RvVGltZXN0YW1wKGludDY0X3Qgc2Vjb25kcykgeworICByZXR1cm4gQ3JlYXRlTm9ybWFsaXplZDxUaW1lc3RhbXA+KHNlY29uZHMsIDApOworfQorCitpbnQ2NF90IFRpbWVVdGlsOjpUaW1lc3RhbXBUb05hbm9zZWNvbmRzKGNvbnN0IFRpbWVzdGFtcCYgdGltZXN0YW1wKSB7CisgIHJldHVybiB0aW1lc3RhbXAuc2Vjb25kcygpICoga05hbm9zUGVyU2Vjb25kICsgdGltZXN0YW1wLm5hbm9zKCk7Cit9CisKK2ludDY0X3QgVGltZVV0aWw6OlRpbWVzdGFtcFRvTWljcm9zZWNvbmRzKGNvbnN0IFRpbWVzdGFtcCYgdGltZXN0YW1wKSB7CisgIHJldHVybiB0aW1lc3RhbXAuc2Vjb25kcygpICoga01pY3Jvc1BlclNlY29uZCArCisgICAgICAgICBSb3VuZFRvd2FyZFplcm8odGltZXN0YW1wLm5hbm9zKCksIGtOYW5vc1Blck1pY3Jvc2Vjb25kKTsKK30KKworaW50NjRfdCBUaW1lVXRpbDo6VGltZXN0YW1wVG9NaWxsaXNlY29uZHMoY29uc3QgVGltZXN0YW1wJiB0aW1lc3RhbXApIHsKKyAgcmV0dXJuIHRpbWVzdGFtcC5zZWNvbmRzKCkgKiBrTWlsbGlzUGVyU2Vjb25kICsKKyAgICAgICAgIFJvdW5kVG93YXJkWmVybyh0aW1lc3RhbXAubmFub3MoKSwga05hbm9zUGVyTWlsbGlzZWNvbmQpOworfQorCitpbnQ2NF90IFRpbWVVdGlsOjpUaW1lc3RhbXBUb1NlY29uZHMoY29uc3QgVGltZXN0YW1wJiB0aW1lc3RhbXApIHsKKyAgcmV0dXJuIHRpbWVzdGFtcC5zZWNvbmRzKCk7Cit9CisKK1RpbWVzdGFtcCBUaW1lVXRpbDo6VGltZVRUb1RpbWVzdGFtcCh0aW1lX3QgdmFsdWUpIHsKKyAgcmV0dXJuIENyZWF0ZU5vcm1hbGl6ZWQ8VGltZXN0YW1wPihzdGF0aWNfY2FzdDxpbnQ2NF90Pih2YWx1ZSksIDApOworfQorCit0aW1lX3QgVGltZVV0aWw6OlRpbWVzdGFtcFRvVGltZVQoY29uc3QgVGltZXN0YW1wJiB2YWx1ZSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dGltZV90Pih2YWx1ZS5zZWNvbmRzKCkpOworfQorCitUaW1lc3RhbXAgVGltZVV0aWw6OlRpbWV2YWxUb1RpbWVzdGFtcChjb25zdCB0aW1ldmFsJiB2YWx1ZSkgeworICByZXR1cm4gQ3JlYXRlTm9ybWFsaXplZDxUaW1lc3RhbXA+KHZhbHVlLnR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50dl91c2VjICoga05hbm9zUGVyTWljcm9zZWNvbmQpOworfQorCit0aW1ldmFsIFRpbWVVdGlsOjpUaW1lc3RhbXBUb1RpbWV2YWwoY29uc3QgVGltZXN0YW1wJiB2YWx1ZSkgeworICB0aW1ldmFsIHJlc3VsdDsKKyAgcmVzdWx0LnR2X3NlYyA9IHZhbHVlLnNlY29uZHMoKTsKKyAgcmVzdWx0LnR2X3VzZWMgPSBSb3VuZFRvd2FyZFplcm8odmFsdWUubmFub3MoKSwga05hbm9zUGVyTWljcm9zZWNvbmQpOworICByZXR1cm4gcmVzdWx0OworfQorCitEdXJhdGlvbiBUaW1lVXRpbDo6VGltZXZhbFRvRHVyYXRpb24oY29uc3QgdGltZXZhbCYgdmFsdWUpIHsKKyAgcmV0dXJuIENyZWF0ZU5vcm1hbGl6ZWQ8RHVyYXRpb24+KHZhbHVlLnR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnR2X3VzZWMgKiBrTmFub3NQZXJNaWNyb3NlY29uZCk7Cit9CisKK3RpbWV2YWwgVGltZVV0aWw6OkR1cmF0aW9uVG9UaW1ldmFsKGNvbnN0IER1cmF0aW9uJiB2YWx1ZSkgeworICB0aW1ldmFsIHJlc3VsdDsKKyAgcmVzdWx0LnR2X3NlYyA9IHZhbHVlLnNlY29uZHMoKTsKKyAgcmVzdWx0LnR2X3VzZWMgPSBSb3VuZFRvd2FyZFplcm8odmFsdWUubmFub3MoKSwga05hbm9zUGVyTWljcm9zZWNvbmQpOworICAvLyB0aW1ldmFsLnR2X3VzZWMncyByYW5nZSBpcyBbMCwgMTAwMDAwMCkKKyAgaWYgKHJlc3VsdC50dl91c2VjIDwgMCkgeworICAgIHJlc3VsdC50dl9zZWMgLT0gMTsKKyAgICByZXN1bHQudHZfdXNlYyArPSBrTWljcm9zUGVyU2Vjb25kOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHsKK3VzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjp1dGlsOjpDcmVhdGVOb3JtYWxpemVkOwordXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OnV0aWw6OmtOYW5vc1BlclNlY29uZDsKKworLy8gQ29udmVydCBhIER1cmF0aW9uIHRvIHVpbnQxMjguCit2b2lkIFRvVWludDEyOChjb25zdCBEdXJhdGlvbiYgdmFsdWUsIHVpbnQxMjgqIHJlc3VsdCwgYm9vbCogbmVnYXRpdmUpIHsKKyAgaWYgKHZhbHVlLnNlY29uZHMoKSA8IDAgfHwgdmFsdWUubmFub3MoKSA8IDApIHsKKyAgICAqbmVnYXRpdmUgPSB0cnVlOworICAgICpyZXN1bHQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oLXZhbHVlLnNlY29uZHMoKSk7CisgICAgKnJlc3VsdCA9ICpyZXN1bHQgKiBrTmFub3NQZXJTZWNvbmQgKyBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLXZhbHVlLm5hbm9zKCkpOworICB9IGVsc2UgeworICAgICpuZWdhdGl2ZSA9IGZhbHNlOworICAgICpyZXN1bHQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4odmFsdWUuc2Vjb25kcygpKTsKKyAgICAqcmVzdWx0ID0gKnJlc3VsdCAqIGtOYW5vc1BlclNlY29uZCArIHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWx1ZS5uYW5vcygpKTsKKyAgfQorfQorCit2b2lkIFRvRHVyYXRpb24oY29uc3QgdWludDEyOCYgdmFsdWUsIGJvb2wgbmVnYXRpdmUsIER1cmF0aW9uKiBkdXJhdGlvbikgeworICBpbnQ2NF90IHNlY29uZHMgPQorICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4oVWludDEyOExvdzY0KHZhbHVlIC8ga05hbm9zUGVyU2Vjb25kKSk7CisgIGludDMyX3QgbmFub3MgPQorICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oVWludDEyOExvdzY0KHZhbHVlICUga05hbm9zUGVyU2Vjb25kKSk7CisgIGlmIChuZWdhdGl2ZSkgeworICAgIHNlY29uZHMgPSAtc2Vjb25kczsKKyAgICBuYW5vcyA9IC1uYW5vczsKKyAgfQorICBkdXJhdGlvbi0+c2V0X3NlY29uZHMoc2Vjb25kcyk7CisgIGR1cmF0aW9uLT5zZXRfbmFub3MobmFub3MpOworfQorfSAgLy8gbmFtZXNwYWNlCisKK0R1cmF0aW9uJiBvcGVyYXRvcis9KER1cmF0aW9uJiBkMSwgY29uc3QgRHVyYXRpb24mIGQyKSB7CisgIGQxID0gQ3JlYXRlTm9ybWFsaXplZDxEdXJhdGlvbj4oZDEuc2Vjb25kcygpICsgZDIuc2Vjb25kcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxLm5hbm9zKCkgKyBkMi5uYW5vcygpKTsKKyAgcmV0dXJuIGQxOworfQorCitEdXJhdGlvbiYgb3BlcmF0b3ItPShEdXJhdGlvbiYgZDEsIGNvbnN0IER1cmF0aW9uJiBkMikgeyAgLy8gTk9MSU5UCisgIGQxID0gQ3JlYXRlTm9ybWFsaXplZDxEdXJhdGlvbj4oZDEuc2Vjb25kcygpIC0gZDIuc2Vjb25kcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxLm5hbm9zKCkgLSBkMi5uYW5vcygpKTsKKyAgcmV0dXJuIGQxOworfQorCitEdXJhdGlvbiYgb3BlcmF0b3IqPShEdXJhdGlvbiYgZCwgaW50NjRfdCByKSB7ICAvLyBOT0xJTlQKKyAgYm9vbCBuZWdhdGl2ZTsKKyAgdWludDEyOCB2YWx1ZTsKKyAgVG9VaW50MTI4KGQsICZ2YWx1ZSwgJm5lZ2F0aXZlKTsKKyAgaWYgKHIgPiAwKSB7CisgICAgdmFsdWUgKj0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHIpOworICB9IGVsc2UgeworICAgIG5lZ2F0aXZlID0gIW5lZ2F0aXZlOworICAgIHZhbHVlICo9IHN0YXRpY19jYXN0PHVpbnQ2NF90Pigtcik7CisgIH0KKyAgVG9EdXJhdGlvbih2YWx1ZSwgbmVnYXRpdmUsICZkKTsKKyAgcmV0dXJuIGQ7Cit9CisKK0R1cmF0aW9uJiBvcGVyYXRvcio9KER1cmF0aW9uJiBkLCBkb3VibGUgcikgeyAgLy8gTk9MSU5UCisgIGRvdWJsZSByZXN1bHQgPQorICAgICAgKHN0YXRpY19jYXN0PGRvdWJsZT4oZC5zZWNvbmRzKCkpICsgZC5uYW5vcygpICogKDEuMCAvIGtOYW5vc1BlclNlY29uZCkpICoKKyAgICAgIHI7CisgIGludDY0X3Qgc2Vjb25kcyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KHJlc3VsdCk7CisgIGludDMyX3QgbmFub3MgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigocmVzdWx0IC0gc3RhdGljX2Nhc3Q8ZG91YmxlPihzZWNvbmRzKSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga05hbm9zUGVyU2Vjb25kKTsKKyAgLy8gTm90ZSB0aGF0IHdlIG5vcm1hbGl6ZSBoZXJlIG5vdCBqdXN0IGJlY2F1c2UgbmFub3MgY2FuIGhhdmUgYSBkaWZmZXJlbnQKKyAgLy8gc2lnbiBmcm9tIHNlY29uZHMgYnV0IGFsc28gdGhhdCBuYW5vcyBjYW4gYmUgYW55IGFyYml0cmFyeSB2YWx1ZSB3aGVuCisgIC8vIG92ZXJmbG93IGhhcHBlbnMgKGkuZS4sIHRoZSByZXN1bHQgaXMgYSBtdWNoIGxhcmdlciB2YWx1ZSB0aGFuIHdoYXQKKyAgLy8gaW50NjQgY2FuIHJlcHJlc2VudCkuCisgIGQgPSBDcmVhdGVOb3JtYWxpemVkPER1cmF0aW9uPihzZWNvbmRzLCBuYW5vcyk7CisgIHJldHVybiBkOworfQorCitEdXJhdGlvbiYgb3BlcmF0b3IvPShEdXJhdGlvbiYgZCwgaW50NjRfdCByKSB7ICAvLyBOT0xJTlQKKyAgYm9vbCBuZWdhdGl2ZTsKKyAgdWludDEyOCB2YWx1ZTsKKyAgVG9VaW50MTI4KGQsICZ2YWx1ZSwgJm5lZ2F0aXZlKTsKKyAgaWYgKHIgPiAwKSB7CisgICAgdmFsdWUgLz0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHIpOworICB9IGVsc2UgeworICAgIG5lZ2F0aXZlID0gIW5lZ2F0aXZlOworICAgIHZhbHVlIC89IHN0YXRpY19jYXN0PHVpbnQ2NF90Pigtcik7CisgIH0KKyAgVG9EdXJhdGlvbih2YWx1ZSwgbmVnYXRpdmUsICZkKTsKKyAgcmV0dXJuIGQ7Cit9CisKK0R1cmF0aW9uJiBvcGVyYXRvci89KER1cmF0aW9uJiBkLCBkb3VibGUgcikgeyAgLy8gTk9MSU5UCisgIHJldHVybiBkICo9IDEuMCAvIHI7Cit9CisKK0R1cmF0aW9uJiBvcGVyYXRvciU9KER1cmF0aW9uJiBkMSwgY29uc3QgRHVyYXRpb24mIGQyKSB7ICAvLyBOT0xJTlQKKyAgYm9vbCBuZWdhdGl2ZTEsIG5lZ2F0aXZlMjsKKyAgdWludDEyOCB2YWx1ZTEsIHZhbHVlMjsKKyAgVG9VaW50MTI4KGQxLCAmdmFsdWUxLCAmbmVnYXRpdmUxKTsKKyAgVG9VaW50MTI4KGQyLCAmdmFsdWUyLCAmbmVnYXRpdmUyKTsKKyAgdWludDEyOCByZXN1bHQgPSB2YWx1ZTEgJSB2YWx1ZTI7CisgIC8vIFdoZW4gbmVnYXRpdmUgdmFsdWVzIGFyZSBpbnZvbHZlZCBpbiBkaXZpc2lvbiwgd2Ugcm91bmQgdGhlIGRpdmlzaW9uCisgIC8vIHJlc3VsdCB0b3dhcmRzIHplcm8uIFdpdGggdGhpcyBzZW1hbnRpY3MsIHNpZ24gb2YgdGhlIHJlbWFpbmRlciBpcyB0aGUKKyAgLy8gc2FtZSBhcyB0aGUgZGl2aWRlbmQuIEZvciBleGFtcGxlOgorICAvLyAgICAgLTUgLyAxMCAgICA9IDAsIC01ICUgMTAgICAgPSAtNQorICAvLyAgICAgLTUgLyAoLTEwKSA9IDAsIC01ICUgKC0xMCkgPSAtNQorICAvLyAgICAgIDUgLyAoLTEwKSA9IDAsICA1ICUgKC0xMCkgPSA1CisgIFRvRHVyYXRpb24ocmVzdWx0LCBuZWdhdGl2ZTEsICZkMSk7CisgIHJldHVybiBkMTsKK30KKworaW50NjRfdCBvcGVyYXRvci8oY29uc3QgRHVyYXRpb24mIGQxLCBjb25zdCBEdXJhdGlvbiYgZDIpIHsKKyAgYm9vbCBuZWdhdGl2ZTEsIG5lZ2F0aXZlMjsKKyAgdWludDEyOCB2YWx1ZTEsIHZhbHVlMjsKKyAgVG9VaW50MTI4KGQxLCAmdmFsdWUxLCAmbmVnYXRpdmUxKTsKKyAgVG9VaW50MTI4KGQyLCAmdmFsdWUyLCAmbmVnYXRpdmUyKTsKKyAgaW50NjRfdCByZXN1bHQgPSBVaW50MTI4TG93NjQodmFsdWUxIC8gdmFsdWUyKTsKKyAgaWYgKG5lZ2F0aXZlMSAhPSBuZWdhdGl2ZTIpIHsKKyAgICByZXN1bHQgPSAtcmVzdWx0OworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK1RpbWVzdGFtcCYgb3BlcmF0b3IrPShUaW1lc3RhbXAmIHQsIGNvbnN0IER1cmF0aW9uJiBkKSB7ICAvLyBOT0xJTlQKKyAgdCA9IENyZWF0ZU5vcm1hbGl6ZWQ8VGltZXN0YW1wPih0LnNlY29uZHMoKSArIGQuc2Vjb25kcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubmFub3MoKSArIGQubmFub3MoKSk7CisgIHJldHVybiB0OworfQorCitUaW1lc3RhbXAmIG9wZXJhdG9yLT0oVGltZXN0YW1wJiB0LCBjb25zdCBEdXJhdGlvbiYgZCkgeyAgLy8gTk9MSU5UCisgIHQgPSBDcmVhdGVOb3JtYWxpemVkPFRpbWVzdGFtcD4odC5zZWNvbmRzKCkgLSBkLnNlY29uZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm5hbm9zKCkgLSBkLm5hbm9zKCkpOworICByZXR1cm4gdDsKK30KKworRHVyYXRpb24gb3BlcmF0b3ItKGNvbnN0IFRpbWVzdGFtcCYgdDEsIGNvbnN0IFRpbWVzdGFtcCYgdDIpIHsKKyAgcmV0dXJuIENyZWF0ZU5vcm1hbGl6ZWQ8RHVyYXRpb24+KHQxLnNlY29uZHMoKSAtIHQyLnNlY29uZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxLm5hbm9zKCkgLSB0Mi5uYW5vcygpKTsKK30KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3RpbWVfdXRpbC5oIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3RpbWVfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOTUyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmgKQEAgLTAsMCArMSwzMTQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBEZWZpbmVzIHV0aWxpdGllcyBmb3IgdGhlIFRpbWVzdGFtcCBhbmQgRHVyYXRpb24gd2VsbCBrbm93biB0eXBlcy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVVRJTF9USU1FX1VUSUxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VVElMX1RJTUVfVVRJTF9IX18KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaWZkZWYgX01TQ19WRVIKKyNpZmRlZiBfWEJPWF9PTkUKK3N0cnVjdCB0aW1ldmFsIHsKKyAgaW50NjRfdCB0dl9zZWM7ICAvKiBzZWNvbmRzICovCisgIGludDY0X3QgdHZfdXNlYzsgLyogYW5kIG1pY3Jvc2Vjb25kcyAqLworfTsKKyNlbHNlCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNlbmRpZiAgLy8gX1hCT1hfT05FCisjZWxzZQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucGIuaD4KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB1dGlsIHsKKworLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIFRpbWVzdGFtcCBhbmQgRHVyYXRpb24uCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgVGltZVV0aWwgeworICB0eXBlZGVmIGdvb2dsZTo6cHJvdG9idWY6OlRpbWVzdGFtcCBUaW1lc3RhbXA7CisgIHR5cGVkZWYgZ29vZ2xlOjpwcm90b2J1Zjo6RHVyYXRpb24gRHVyYXRpb247CisKKyBwdWJsaWM6CisgIC8vIFRoZSBtaW4vbWF4IFRpbWVzdGFtcC9EdXJhdGlvbiB2YWx1ZXMgd2Ugc3VwcG9ydC4KKyAgLy8KKyAgLy8gRm9yICIwMDAxLTAxLTAxVDAwOjAwOjAwWiIuCisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtUaW1lc3RhbXBNaW5TZWNvbmRzID0gLTYyMTM1NTk2ODAwTEw7CisgIC8vIEZvciAiOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5OTlaIi4KKyAgc3RhdGljIGNvbnN0IGludDY0X3Qga1RpbWVzdGFtcE1heFNlY29uZHMgPSAyNTM0MDIzMDA3OTlMTDsKKyAgc3RhdGljIGNvbnN0IGludDY0X3Qga0R1cmF0aW9uTWluU2Vjb25kcyA9IC0zMTU1NzYwMDAwMDBMTDsKKyAgc3RhdGljIGNvbnN0IGludDY0X3Qga0R1cmF0aW9uTWF4U2Vjb25kcyA9IDMxNTU3NjAwMDAwMExMOworCisgIC8vIENvbnZlcnRzIFRpbWVzdGFtcCB0by9mcm9tIFJGQyAzMzM5IGRhdGUgc3RyaW5nIGZvcm1hdC4KKyAgLy8gR2VuZXJhdGVkIG91dHB1dCB3aWxsIGFsd2F5cyBiZSBaLW5vcm1hbGl6ZWQgYW5kIHVzZXMgMywgNiBvciA5CisgIC8vIGZyYWN0aW9uYWwgZGlnaXRzIGFzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgZXhhY3QgdGltZS4gV2hlbgorICAvLyBwYXJzaW5nLCBhbnkgZnJhY3Rpb25hbCBkaWdpdHMgKG9yIG5vbmUpIGFuZCBhbnkgb2Zmc2V0IGFyZQorICAvLyBhY2NlcHRlZCBhcyBsb25nIGFzIHRoZXkgZml0IGludG8gbmFuby1zZWNvbmRzIHByZWNpc2lvbi4KKyAgLy8gTm90ZSB0aGF0IFRpbWVzdGFtcCBjYW4gb25seSByZXByZXNlbnQgdGltZSBmcm9tCisgIC8vIDAwMDEtMDEtMDFUMDA6MDA6MDBaIHRvIDk5OTktMTItMzFUMjM6NTk6NTkuOTk5OTk5OTk5Wi4gQ29udmVydGluZworICAvLyBhIFRpbWVzdGFtcCBvdXRzaWRlIG9mIHRoaXMgcmFuZ2UgaXMgdW5kZWZpbmVkIGJlaGF2aW9yLgorICAvLyBTZWUgaHR0cHM6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMzMzkudHh0CisgIC8vCisgIC8vIEV4YW1wbGUgb2YgZ2VuZXJhdGVkIGZvcm1hdDoKKyAgLy8gICAiMTk3Mi0wMS0wMVQxMDowMDoyMC4wMjFaIgorICAvLworICAvLyBFeGFtcGxlIG9mIGFjY2VwdGVkIGZvcm1hdDoKKyAgLy8gICAiMTk3Mi0wMS0wMVQxMDowMDoyMC4wMjEtMDU6MDAiCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBUb1N0cmluZyhjb25zdCBUaW1lc3RhbXAmIHRpbWVzdGFtcCk7CisgIHN0YXRpYyBib29sIEZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLCBUaW1lc3RhbXAqIHRpbWVzdGFtcCk7CisKKyAgLy8gQ29udmVydHMgRHVyYXRpb24gdG8vZnJvbSBzdHJpbmcgZm9ybWF0LiBUaGUgc3RyaW5nIGZvcm1hdCB3aWxsIGNvbnRhaW5zCisgIC8vIDMsIDYsIG9yIDkgZnJhY3Rpb25hbCBkaWdpdHMgZGVwZW5kaW5nIG9uIHRoZSBwcmVjaXNpb24gcmVxdWlyZWQgdG8KKyAgLy8gcmVwcmVzZW50IHRoZSBleGFjdCBEdXJhdGlvbiB2YWx1ZS4gRm9yIGV4YW1wbGU6CisgIC8vICAgIjFzIiwgIjEuMDEwcyIsICIxLjAwMDAwMDEwMHMiLCAiLTMuMTAwcyIKKyAgLy8gVGhlIHJhbmdlIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IER1cmF0aW9uIGlzIGZyb20gLTMxNSw1NzYsMDAwLDAwMAorICAvLyB0byArMzE1LDU3NiwwMDAsMDAwIGluY2x1c2l2ZSAoaW4gc2Vjb25kcykuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBUb1N0cmluZyhjb25zdCBEdXJhdGlvbiYgZHVyYXRpb24pOworICBzdGF0aWMgYm9vbCBGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwgRHVyYXRpb24qIHRpbWVzdGFtcCk7CisKKyNpZmRlZiBHZXRDdXJyZW50VGltZQorI3VuZGVmIEdldEN1cnJlbnRUaW1lICAvLyBWaXN1YWwgU3R1ZGlvIGhhcyBtYWNybyBHZXRDdXJyZW50VGltZQorI2VuZGlmCisgIC8vIEdldHMgdGhlIGN1cnJlbnQgVVRDIHRpbWUuCisgIHN0YXRpYyBUaW1lc3RhbXAgR2V0Q3VycmVudFRpbWUoKTsKKyAgLy8gUmV0dXJucyB0aGUgVGltZSByZXByZXNlbnRpbmcgIjE5NzAtMDEtMDEgMDA6MDA6MDAiLgorICBzdGF0aWMgVGltZXN0YW1wIEdldEVwb2NoKCk7CisKKyAgLy8gQ29udmVydHMgYmV0d2VlbiBEdXJhdGlvbiBhbmQgaW50ZWdlciB0eXBlcy4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZgorICAvLyB0aGUgaW5wdXQgdmFsdWUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBEdXJhdGlvbi4KKyAgc3RhdGljIER1cmF0aW9uIE5hbm9zZWNvbmRzVG9EdXJhdGlvbihpbnQ2NF90IG5hbm9zKTsKKyAgc3RhdGljIER1cmF0aW9uIE1pY3Jvc2Vjb25kc1RvRHVyYXRpb24oaW50NjRfdCBtaWNyb3MpOworICBzdGF0aWMgRHVyYXRpb24gTWlsbGlzZWNvbmRzVG9EdXJhdGlvbihpbnQ2NF90IG1pbGxpcyk7CisgIHN0YXRpYyBEdXJhdGlvbiBTZWNvbmRzVG9EdXJhdGlvbihpbnQ2NF90IHNlY29uZHMpOworICBzdGF0aWMgRHVyYXRpb24gTWludXRlc1RvRHVyYXRpb24oaW50NjRfdCBtaW51dGVzKTsKKyAgc3RhdGljIER1cmF0aW9uIEhvdXJzVG9EdXJhdGlvbihpbnQ2NF90IGhvdXJzKTsKKyAgLy8gUmVzdWx0IHdpbGwgYmUgdHJ1bmNhdGVkIHRvd2FyZHMgemVyby4gRm9yIGV4YW1wbGUsICItMS41cyIgd2lsbCBiZQorICAvLyB0cnVuY2F0ZWQgdG8gIi0xcyIsIGFuZCAiMS41cyIgdG8gIjFzIiB3aGVuIGNvbnZlcnRpbmcgdG8gc2Vjb25kcy4KKyAgLy8gSXQncyB1bmRlZmluZWQgYmVoYXZpb3IgaWYgdGhlIGlucHV0IGR1cmF0aW9uIGlzIG5vdCB2YWxpZCBvciB0aGUgcmVzdWx0CisgIC8vIGV4Y2VlZHMgdGhlIHJhbmdlIG9mIGludDY0LiBBIGR1cmF0aW9uIGlzIG5vdCB2YWxpZCBpZiBpdCdzIG5vdCBpbiB0aGUKKyAgLy8gdmFsaWQgcmFuZ2Ugb2YgRHVyYXRpb24sIG9yIGhhdmUgYW4gaW52YWxpZCBuYW5vcyB2YWx1ZSAoaS5lLiwgbGFyZ2VyCisgIC8vIHRoYW4gOTk5OTk5OTk5LCBsZXNzIHRoYW4gLTk5OTk5OTk5OSwgb3IgaGF2ZSBhIGRpZmZlcmVudCBzaWduIGZyb20gdGhlCisgIC8vIHNlY29uZHMgcGFydCkuCisgIHN0YXRpYyBpbnQ2NF90IER1cmF0aW9uVG9OYW5vc2Vjb25kcyhjb25zdCBEdXJhdGlvbiYgZHVyYXRpb24pOworICBzdGF0aWMgaW50NjRfdCBEdXJhdGlvblRvTWljcm9zZWNvbmRzKGNvbnN0IER1cmF0aW9uJiBkdXJhdGlvbik7CisgIHN0YXRpYyBpbnQ2NF90IER1cmF0aW9uVG9NaWxsaXNlY29uZHMoY29uc3QgRHVyYXRpb24mIGR1cmF0aW9uKTsKKyAgc3RhdGljIGludDY0X3QgRHVyYXRpb25Ub1NlY29uZHMoY29uc3QgRHVyYXRpb24mIGR1cmF0aW9uKTsKKyAgc3RhdGljIGludDY0X3QgRHVyYXRpb25Ub01pbnV0ZXMoY29uc3QgRHVyYXRpb24mIGR1cmF0aW9uKTsKKyAgc3RhdGljIGludDY0X3QgRHVyYXRpb25Ub0hvdXJzKGNvbnN0IER1cmF0aW9uJiBkdXJhdGlvbik7CisgIC8vIENyZWF0ZXMgVGltZXN0YW1wIGZyb20gaW50ZWdlciB0eXBlcy4gVGhlIGludGVnZXIgdmFsdWUgaW5kaWNhdGVzIHRoZQorICAvLyB0aW1lIGVsYXBzZWQgZnJvbSBFcG9jaCB0aW1lLiBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIHRoZSBpbnB1dAorICAvLyB2YWx1ZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIFRpbWVzdGFtcC4KKyAgc3RhdGljIFRpbWVzdGFtcCBOYW5vc2Vjb25kc1RvVGltZXN0YW1wKGludDY0X3QgbmFub3MpOworICBzdGF0aWMgVGltZXN0YW1wIE1pY3Jvc2Vjb25kc1RvVGltZXN0YW1wKGludDY0X3QgbWljcm9zKTsKKyAgc3RhdGljIFRpbWVzdGFtcCBNaWxsaXNlY29uZHNUb1RpbWVzdGFtcChpbnQ2NF90IG1pbGxpcyk7CisgIHN0YXRpYyBUaW1lc3RhbXAgU2Vjb25kc1RvVGltZXN0YW1wKGludDY0X3Qgc2Vjb25kcyk7CisgIC8vIFJlc3VsdCB3aWxsIGJlIHRydW5jYXRlZCBkb3duIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgdmFsdWUuIEZvciBleGFtcGxlLAorICAvLyB3aXRoICIxOTY5LTEyLTMxVDIzOjU5OjU5LjlaIiwgVGltZXN0YW1wVG9NaWxsaXNlY29uZHMoKSByZXR1cm5zIC0xMDAKKyAgLy8gYW5kIFRpbWVzdGFtcFRvU2Vjb25kcygpIHJldHVybnMgLTEuIEl0J3MgdW5kZWZpbmVkIGJlaGF2aW9yIGlmIHRoZSBpbnB1dAorICAvLyBUaW1lc3RhbXAgaXMgbm90IHZhbGlkIChpLmUuLCBpdHMgc2Vjb25kcyBwYXJ0IG9yIG5hbm9zIHBhcnQgZG9lcyBub3QgZmFsbAorICAvLyBpbiB0aGUgdmFsaWQgcmFuZ2UpIG9yIHRoZSByZXR1cm4gdmFsdWUgZG9lc24ndCBmaXQgaW50byBpbnQ2NC4KKyAgc3RhdGljIGludDY0X3QgVGltZXN0YW1wVG9OYW5vc2Vjb25kcyhjb25zdCBUaW1lc3RhbXAmIHRpbWVzdGFtcCk7CisgIHN0YXRpYyBpbnQ2NF90IFRpbWVzdGFtcFRvTWljcm9zZWNvbmRzKGNvbnN0IFRpbWVzdGFtcCYgdGltZXN0YW1wKTsKKyAgc3RhdGljIGludDY0X3QgVGltZXN0YW1wVG9NaWxsaXNlY29uZHMoY29uc3QgVGltZXN0YW1wJiB0aW1lc3RhbXApOworICBzdGF0aWMgaW50NjRfdCBUaW1lc3RhbXBUb1NlY29uZHMoY29uc3QgVGltZXN0YW1wJiB0aW1lc3RhbXApOworCisgIC8vIENvbnZlcnNpb24gdG8vZnJvbSBvdGhlciB0aW1lL2RhdGUgdHlwZXMuIE5vdGUgdGhhdCB0aGVzZSB0eXBlcyBtYXkKKyAgLy8gaGF2ZSBhIGRpZmZlcmVudCBwcmVjaXNpb24gYW5kIHRpbWUgcmFuZ2UgZnJvbSBUaW1lc3RhbXAvRHVyYXRpb24uCisgIC8vIFdoZW4gY29udmVydGluZyB0byBhIGxvd2VyIHByZWNpc2lvbiB0eXBlLCB0aGUgdmFsdWUgd2lsbCBiZSB0cnVuY2F0ZWQKKyAgLy8gdG8gdGhlIG5lYXJlc3QgdmFsdWUgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQuIElmIHRoZSB2YWx1ZSBpcworICAvLyBvdXQgb2YgdGhlIHJhbmdlIG9mIHRoZSByZXN1bHQgdHlwZSwgdGhlIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQuCisgIC8vCisgIC8vIENvbnZlcnNpb24gdG8vZnJvbSB0aW1lX3QKKyAgc3RhdGljIFRpbWVzdGFtcCBUaW1lVFRvVGltZXN0YW1wKHRpbWVfdCB2YWx1ZSk7CisgIHN0YXRpYyB0aW1lX3QgVGltZXN0YW1wVG9UaW1lVChjb25zdCBUaW1lc3RhbXAmIHZhbHVlKTsKKworICAvLyBDb252ZXJzaW9uIHRvL2Zyb20gdGltZXZhbAorICBzdGF0aWMgVGltZXN0YW1wIFRpbWV2YWxUb1RpbWVzdGFtcChjb25zdCB0aW1ldmFsJiB2YWx1ZSk7CisgIHN0YXRpYyB0aW1ldmFsIFRpbWVzdGFtcFRvVGltZXZhbChjb25zdCBUaW1lc3RhbXAmIHZhbHVlKTsKKyAgc3RhdGljIER1cmF0aW9uIFRpbWV2YWxUb0R1cmF0aW9uKGNvbnN0IHRpbWV2YWwmIHZhbHVlKTsKKyAgc3RhdGljIHRpbWV2YWwgRHVyYXRpb25Ub1RpbWV2YWwoY29uc3QgRHVyYXRpb24mIHZhbHVlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworLy8gT3ZlcmxvYWRlZCBvcGVyYXRvcnMgZm9yIER1cmF0aW9uLgorLy8KKy8vIEFzc2lnbm1lbnQgb3BlcmF0b3JzLgorUFJPVE9CVUZfRVhQT1JUIER1cmF0aW9uJiBvcGVyYXRvcis9KER1cmF0aW9uJiBkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEdXJhdGlvbiYgZDIpOyAgLy8gTk9MSU5UCitQUk9UT0JVRl9FWFBPUlQgRHVyYXRpb24mIG9wZXJhdG9yLT0oRHVyYXRpb24mIGQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IER1cmF0aW9uJiBkMik7ICAgICAvLyBOT0xJTlQKK1BST1RPQlVGX0VYUE9SVCBEdXJhdGlvbiYgb3BlcmF0b3IqPShEdXJhdGlvbiYgZCwgaW50NjRfdCByKTsgIC8vIE5PTElOVAorUFJPVE9CVUZfRVhQT1JUIER1cmF0aW9uJiBvcGVyYXRvcio9KER1cmF0aW9uJiBkLCBkb3VibGUgcik7ICAvLyBOT0xJTlQKK1BST1RPQlVGX0VYUE9SVCBEdXJhdGlvbiYgb3BlcmF0b3IvPShEdXJhdGlvbiYgZCwgaW50NjRfdCByKTsgIC8vIE5PTElOVAorUFJPVE9CVUZfRVhQT1JUIER1cmF0aW9uJiBvcGVyYXRvci89KER1cmF0aW9uJiBkLCBkb3VibGUgcik7ICAvLyBOT0xJTlQKKy8vIE92ZXJsb2FkIGZvciBvdGhlciBpbnRlZ2VyIHR5cGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitEdXJhdGlvbiYgb3BlcmF0b3IqPShEdXJhdGlvbiYgZCwgVCByKSB7ICAvLyBOT0xJTlQKKyAgaW50NjRfdCB4ID0gcjsKKyAgcmV0dXJuIGQgKj0geDsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRHVyYXRpb24mIG9wZXJhdG9yLz0oRHVyYXRpb24mIGQsIFQgcikgeyAgLy8gTk9MSU5UCisgIGludDY0X3QgeCA9IHI7CisgIHJldHVybiBkIC89IHg7Cit9CitQUk9UT0JVRl9FWFBPUlQgRHVyYXRpb24mIG9wZXJhdG9yJT0oRHVyYXRpb24mIGQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IER1cmF0aW9uJiBkMik7ICAvLyBOT0xJTlQKKy8vIFJlbGF0aW9uYWwgb3BlcmF0b3JzLgoraW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IER1cmF0aW9uJiBkMSwgY29uc3QgRHVyYXRpb24mIGQyKSB7CisgIGlmIChkMS5zZWNvbmRzKCkgPT0gZDIuc2Vjb25kcygpKSB7CisgICAgcmV0dXJuIGQxLm5hbm9zKCkgPCBkMi5uYW5vcygpOworICB9CisgIHJldHVybiBkMS5zZWNvbmRzKCkgPCBkMi5zZWNvbmRzKCk7Cit9CitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRHVyYXRpb24mIGQxLCBjb25zdCBEdXJhdGlvbiYgZDIpIHsKKyAgcmV0dXJuIGQyIDwgZDE7Cit9CitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IER1cmF0aW9uJiBkMSwgY29uc3QgRHVyYXRpb24mIGQyKSB7CisgIHJldHVybiAhKGQxIDwgZDIpOworfQoraW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBEdXJhdGlvbiYgZDEsIGNvbnN0IER1cmF0aW9uJiBkMikgeworICByZXR1cm4gIShkMiA8IGQxKTsKK30KK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRHVyYXRpb24mIGQxLCBjb25zdCBEdXJhdGlvbiYgZDIpIHsKKyAgcmV0dXJuIGQxLnNlY29uZHMoKSA9PSBkMi5zZWNvbmRzKCkgJiYgZDEubmFub3MoKSA9PSBkMi5uYW5vcygpOworfQoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEdXJhdGlvbiYgZDEsIGNvbnN0IER1cmF0aW9uJiBkMikgeworICByZXR1cm4gIShkMSA9PSBkMik7Cit9CisvLyBBZGRpdGl2ZSBvcGVyYXRvcnMKK2lubGluZSBEdXJhdGlvbiBvcGVyYXRvci0oY29uc3QgRHVyYXRpb24mIGQpIHsKKyAgRHVyYXRpb24gcmVzdWx0OworICByZXN1bHQuc2V0X3NlY29uZHMoLWQuc2Vjb25kcygpKTsKKyAgcmVzdWx0LnNldF9uYW5vcygtZC5uYW5vcygpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KK2lubGluZSBEdXJhdGlvbiBvcGVyYXRvcisoY29uc3QgRHVyYXRpb24mIGQxLCBjb25zdCBEdXJhdGlvbiYgZDIpIHsKKyAgRHVyYXRpb24gcmVzdWx0ID0gZDE7CisgIHJldHVybiByZXN1bHQgKz0gZDI7Cit9CitpbmxpbmUgRHVyYXRpb24gb3BlcmF0b3ItKGNvbnN0IER1cmF0aW9uJiBkMSwgY29uc3QgRHVyYXRpb24mIGQyKSB7CisgIER1cmF0aW9uIHJlc3VsdCA9IGQxOworICByZXR1cm4gcmVzdWx0IC09IGQyOworfQorLy8gTXVsdGlwbGljYXRpdmUgb3BlcmF0b3JzCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSBEdXJhdGlvbiBvcGVyYXRvciooRHVyYXRpb24gZCwgVCByKSB7CisgIHJldHVybiBkICo9IHI7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSBEdXJhdGlvbiBvcGVyYXRvciooVCByLCBEdXJhdGlvbiBkKSB7CisgIHJldHVybiBkICo9IHI7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSBEdXJhdGlvbiBvcGVyYXRvci8oRHVyYXRpb24gZCwgVCByKSB7CisgIHJldHVybiBkIC89IHI7Cit9CitQUk9UT0JVRl9FWFBPUlQgaW50NjRfdCBvcGVyYXRvci8oY29uc3QgRHVyYXRpb24mIGQxLCBjb25zdCBEdXJhdGlvbiYgZDIpOworCitpbmxpbmUgRHVyYXRpb24gb3BlcmF0b3IlKGNvbnN0IER1cmF0aW9uJiBkMSwgY29uc3QgRHVyYXRpb24mIGQyKSB7CisgIER1cmF0aW9uIHJlc3VsdCA9IGQxOworICByZXR1cm4gcmVzdWx0ICU9IGQyOworfQorCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCBEdXJhdGlvbiYgZCkgeworICBvdXQgPDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OnV0aWw6OlRpbWVVdGlsOjpUb1N0cmluZyhkKTsKKyAgcmV0dXJuIG91dDsKK30KKworLy8gT3ZlcmxvYWRlZCBvcGVyYXRvcnMgZm9yIFRpbWVzdGFtcAorLy8KKy8vIEFzc2lnbm1lbnQgb3BlcmF0b3JzLgorUFJPVE9CVUZfRVhQT1JUIFRpbWVzdGFtcCYgb3BlcmF0b3IrPShUaW1lc3RhbXAmIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IER1cmF0aW9uJiBkKTsgIC8vIE5PTElOVAorUFJPVE9CVUZfRVhQT1JUIFRpbWVzdGFtcCYgb3BlcmF0b3ItPShUaW1lc3RhbXAmIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IER1cmF0aW9uJiBkKTsgIC8vIE5PTElOVAorLy8gUmVsYXRpb25hbCBvcGVyYXRvcnMuCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgVGltZXN0YW1wJiB0MSwgY29uc3QgVGltZXN0YW1wJiB0MikgeworICBpZiAodDEuc2Vjb25kcygpID09IHQyLnNlY29uZHMoKSkgeworICAgIHJldHVybiB0MS5uYW5vcygpIDwgdDIubmFub3MoKTsKKyAgfQorICByZXR1cm4gdDEuc2Vjb25kcygpIDwgdDIuc2Vjb25kcygpOworfQoraW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFRpbWVzdGFtcCYgdDEsIGNvbnN0IFRpbWVzdGFtcCYgdDIpIHsKKyAgcmV0dXJuIHQyIDwgdDE7Cit9CitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFRpbWVzdGFtcCYgdDEsIGNvbnN0IFRpbWVzdGFtcCYgdDIpIHsKKyAgcmV0dXJuICEodDEgPCB0Mik7Cit9CitpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFRpbWVzdGFtcCYgdDEsIGNvbnN0IFRpbWVzdGFtcCYgdDIpIHsKKyAgcmV0dXJuICEodDIgPCB0MSk7Cit9CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRpbWVzdGFtcCYgdDEsIGNvbnN0IFRpbWVzdGFtcCYgdDIpIHsKKyAgcmV0dXJuIHQxLnNlY29uZHMoKSA9PSB0Mi5zZWNvbmRzKCkgJiYgdDEubmFub3MoKSA9PSB0Mi5uYW5vcygpOworfQoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUaW1lc3RhbXAmIHQxLCBjb25zdCBUaW1lc3RhbXAmIHQyKSB7CisgIHJldHVybiAhKHQxID09IHQyKTsKK30KKy8vIEFkZGl0aXZlIG9wZXJhdG9ycy4KK2lubGluZSBUaW1lc3RhbXAgb3BlcmF0b3IrKGNvbnN0IFRpbWVzdGFtcCYgdCwgY29uc3QgRHVyYXRpb24mIGQpIHsKKyAgVGltZXN0YW1wIHJlc3VsdCA9IHQ7CisgIHJldHVybiByZXN1bHQgKz0gZDsKK30KK2lubGluZSBUaW1lc3RhbXAgb3BlcmF0b3IrKGNvbnN0IER1cmF0aW9uJiBkLCBjb25zdCBUaW1lc3RhbXAmIHQpIHsKKyAgVGltZXN0YW1wIHJlc3VsdCA9IHQ7CisgIHJldHVybiByZXN1bHQgKz0gZDsKK30KK2lubGluZSBUaW1lc3RhbXAgb3BlcmF0b3ItKGNvbnN0IFRpbWVzdGFtcCYgdCwgY29uc3QgRHVyYXRpb24mIGQpIHsKKyAgVGltZXN0YW1wIHJlc3VsdCA9IHQ7CisgIHJldHVybiByZXN1bHQgLT0gZDsKK30KK1BST1RPQlVGX0VYUE9SVCBEdXJhdGlvbiBvcGVyYXRvci0oY29uc3QgVGltZXN0YW1wJiB0MSwgY29uc3QgVGltZXN0YW1wJiB0Mik7CisKK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IFRpbWVzdGFtcCYgdCkgeworICBvdXQgPDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OnV0aWw6OlRpbWVVdGlsOjpUb1N0cmluZyh0KTsKKyAgcmV0dXJuIG91dDsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1VUSUxfVElNRV9VVElMX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3RpbWVfdXRpbF90ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3RpbWVfdXRpbF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZTI0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsX3Rlc3QuY2MKQEAgLTAsMCArMSwzODQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGN0aW1lPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgdXRpbCB7CisKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OkR1cmF0aW9uOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6VGltZXN0YW1wOworCituYW1lc3BhY2UgeworCitURVNUKFRpbWVVdGlsVGVzdCwgVGltZXN0YW1wU3RyaW5nRm9ybWF0KSB7CisgIFRpbWVzdGFtcCBiZWdpbiwgZW5kOworICBFWFBFQ1RfVFJVRShUaW1lVXRpbDo6RnJvbVN0cmluZygiMDAwMS0wMS0wMVQwMDowMDowMFoiLCAmYmVnaW4pKTsKKyAgRVhQRUNUX0VRKFRpbWVVdGlsOjprVGltZXN0YW1wTWluU2Vjb25kcywgYmVnaW4uc2Vjb25kcygpKTsKKyAgRVhQRUNUX0VRKDAsIGJlZ2luLm5hbm9zKCkpOworICBFWFBFQ1RfVFJVRShUaW1lVXRpbDo6RnJvbVN0cmluZygiOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5OTlaIiwgJmVuZCkpOworICBFWFBFQ1RfRVEoVGltZVV0aWw6OmtUaW1lc3RhbXBNYXhTZWNvbmRzLCBlbmQuc2Vjb25kcygpKTsKKyAgRVhQRUNUX0VRKDk5OTk5OTk5OSwgZW5kLm5hbm9zKCkpOworICBFWFBFQ1RfRVEoIjAwMDEtMDEtMDFUMDA6MDA6MDBaIiwgVGltZVV0aWw6OlRvU3RyaW5nKGJlZ2luKSk7CisgIEVYUEVDVF9FUSgiOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5OTlaIiwgVGltZVV0aWw6OlRvU3RyaW5nKGVuZCkpOworCisgIC8vIFRlc3QgbmVnYXRpdmUgdGltZXN0YW1wcy4KKyAgVGltZXN0YW1wIHRpbWUgPSBUaW1lVXRpbDo6TmFub3NlY29uZHNUb1RpbWVzdGFtcCgtMSk7CisgIEVYUEVDVF9FUSgtMSwgdGltZS5zZWNvbmRzKCkpOworICAvLyBUaW1lc3RhbXAncyBuYW5vIHBhcnQgaXMgYWx3YXlzIG5vbi1uZWdhdGl2ZS4KKyAgRVhQRUNUX0VRKDk5OTk5OTk5OSwgdGltZS5uYW5vcygpKTsKKyAgRVhQRUNUX0VRKCIxOTY5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVoiLCBUaW1lVXRpbDo6VG9TdHJpbmcodGltZSkpOworCisgIC8vIEdlbmVyYXRlZCBvdXRwdXQgc2hvdWxkIGNvbnRhaW4gMywgNiwgb3IgOSBmcmFjdGlvbmFsIGRpZ2l0cy4KKyAgRVhQRUNUX0VRKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsCisgICAgICAgICAgICBUaW1lVXRpbDo6VG9TdHJpbmcoVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9UaW1lc3RhbXAoMCkpKTsKKyAgRVhQRUNUX0VRKCIxOTcwLTAxLTAxVDAwOjAwOjAwLjAxMFoiLAorICAgICAgICAgICAgVGltZVV0aWw6OlRvU3RyaW5nKFRpbWVVdGlsOjpOYW5vc2Vjb25kc1RvVGltZXN0YW1wKDEwMDAwMDAwKSkpOworICBFWFBFQ1RfRVEoIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDAwMDEwWiIsCisgICAgICAgICAgICBUaW1lVXRpbDo6VG9TdHJpbmcoVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9UaW1lc3RhbXAoMTAwMDApKSk7CisgIEVYUEVDVF9FUSgiMTk3MC0wMS0wMVQwMDowMDowMC4wMDAwMDAwMTBaIiwKKyAgICAgICAgICAgIFRpbWVVdGlsOjpUb1N0cmluZyhUaW1lVXRpbDo6TmFub3NlY29uZHNUb1RpbWVzdGFtcCgxMCkpKTsKKworICAvLyBQYXJzaW5nIGFjY2VwdHMgYW4gZnJhY3Rpb25hbCBkaWdpdHMgYXMgbG9uZyBhcyB0aGV5IGZpdCBpbnRvIG5hbm8KKyAgLy8gcHJlY2lzaW9uLgorICBFWFBFQ1RfVFJVRShUaW1lVXRpbDo6RnJvbVN0cmluZygiMTk3MC0wMS0wMVQwMDowMDowMC4xWiIsICZ0aW1lKSk7CisgIEVYUEVDVF9FUSgxMDAwMDAwMDAsIFRpbWVVdGlsOjpUaW1lc3RhbXBUb05hbm9zZWNvbmRzKHRpbWUpKTsKKyAgRVhQRUNUX1RSVUUoVGltZVV0aWw6OkZyb21TdHJpbmcoIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDAwMVoiLCAmdGltZSkpOworICBFWFBFQ1RfRVEoMTAwMDAwLCBUaW1lVXRpbDo6VGltZXN0YW1wVG9OYW5vc2Vjb25kcyh0aW1lKSk7CisgIEVYUEVDVF9UUlVFKFRpbWVVdGlsOjpGcm9tU3RyaW5nKCIxOTcwLTAxLTAxVDAwOjAwOjAwLjAwMDAwMDFaIiwgJnRpbWUpKTsKKyAgRVhQRUNUX0VRKDEwMCwgVGltZVV0aWw6OlRpbWVzdGFtcFRvTmFub3NlY29uZHModGltZSkpOworCisgIC8vIEFsc28gYWNjZXB0cyBvZmZzZXRzLgorICBFWFBFQ1RfVFJVRShUaW1lVXRpbDo6RnJvbVN0cmluZygiMTk3MC0wMS0wMVQwMDowMDowMC0wODowMCIsICZ0aW1lKSk7CisgIEVYUEVDVF9FUSg4ICogMzYwMCwgVGltZVV0aWw6OlRpbWVzdGFtcFRvU2Vjb25kcyh0aW1lKSk7Cit9CisKK1RFU1QoVGltZVV0aWxUZXN0LCBEdXJhdGlvblN0cmluZ0Zvcm1hdCkgeworICBUaW1lc3RhbXAgYmVnaW4sIGVuZDsKKyAgRVhQRUNUX1RSVUUoVGltZVV0aWw6OkZyb21TdHJpbmcoIjAwMDEtMDEtMDFUMDA6MDA6MDBaIiwgJmJlZ2luKSk7CisgIEVYUEVDVF9UUlVFKFRpbWVVdGlsOjpGcm9tU3RyaW5nKCI5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVoiLCAmZW5kKSk7CisKKyAgRVhQRUNUX0VRKCIzMTU1Mzc4OTc1OTkuOTk5OTk5OTk5cyIsIFRpbWVVdGlsOjpUb1N0cmluZyhlbmQgLSBiZWdpbikpOworICBFWFBFQ1RfRVEoOTk5OTk5OTk5LCAoZW5kIC0gYmVnaW4pLm5hbm9zKCkpOworICBFWFBFQ1RfRVEoIi0zMTU1Mzc4OTc1OTkuOTk5OTk5OTk5cyIsIFRpbWVVdGlsOjpUb1N0cmluZyhiZWdpbiAtIGVuZCkpOworICBFWFBFQ1RfRVEoLTk5OTk5OTk5OSwgKGJlZ2luIC0gZW5kKS5uYW5vcygpKTsKKworICAvLyBHZW5lcmF0ZWQgb3V0cHV0IHNob3VsZCBjb250YWluIDMsIDYsIG9yIDkgZnJhY3Rpb25hbCBkaWdpdHMuCisgIEVYUEVDVF9FUSgiMXMiLCBUaW1lVXRpbDo6VG9TdHJpbmcoVGltZVV0aWw6OlNlY29uZHNUb0R1cmF0aW9uKDEpKSk7CisgIEVYUEVDVF9FUSgiMC4wMTBzIiwgVGltZVV0aWw6OlRvU3RyaW5nKFRpbWVVdGlsOjpNaWxsaXNlY29uZHNUb0R1cmF0aW9uKDEwKSkpOworICBFWFBFQ1RfRVEoIjAuMDAwMDEwcyIsCisgICAgICAgICAgICBUaW1lVXRpbDo6VG9TdHJpbmcoVGltZVV0aWw6Ok1pY3Jvc2Vjb25kc1RvRHVyYXRpb24oMTApKSk7CisgIEVYUEVDVF9FUSgiMC4wMDAwMDAwMTBzIiwKKyAgICAgICAgICAgIFRpbWVVdGlsOjpUb1N0cmluZyhUaW1lVXRpbDo6TmFub3NlY29uZHNUb0R1cmF0aW9uKDEwKSkpOworCisgIC8vIFBhcnNpbmcgYWNjZXB0cyBhbiBmcmFjdGlvbmFsIGRpZ2l0cyBhcyBsb25nIGFzIHRoZXkgZml0IGludG8gbmFubworICAvLyBwcmVjaXNpb24uCisgIER1cmF0aW9uIGQ7CisgIEVYUEVDVF9UUlVFKFRpbWVVdGlsOjpGcm9tU3RyaW5nKCIwLjFzIiwgJmQpKTsKKyAgRVhQRUNUX0VRKDEwMCwgVGltZVV0aWw6OkR1cmF0aW9uVG9NaWxsaXNlY29uZHMoZCkpOworICBFWFBFQ1RfVFJVRShUaW1lVXRpbDo6RnJvbVN0cmluZygiMC4wMDAxcyIsICZkKSk7CisgIEVYUEVDVF9FUSgxMDAsIFRpbWVVdGlsOjpEdXJhdGlvblRvTWljcm9zZWNvbmRzKGQpKTsKKyAgRVhQRUNUX1RSVUUoVGltZVV0aWw6OkZyb21TdHJpbmcoIjAuMDAwMDAwMXMiLCAmZCkpOworICBFWFBFQ1RfRVEoMTAwLCBUaW1lVXRpbDo6RHVyYXRpb25Ub05hbm9zZWNvbmRzKGQpKTsKKworICAvLyBEdXJhdGlvbiBtdXN0IHN1cHBvcnQgcmFuZ2UgZnJvbSAtMzE1LDU3NiwwMDAsMDAwcyB0byArMzE1NTc2MDAwMDAwcworICAvLyB3aGljaCBpbmNsdWRlcyBuZWdhdGl2ZSB2YWx1ZXMuCisgIEVYUEVDVF9UUlVFKFRpbWVVdGlsOjpGcm9tU3RyaW5nKCIzMTU1NzYwMDAwMDAuOTk5OTk5OTk5cyIsICZkKSk7CisgIEVYUEVDVF9FUShpbnQ2NF90ezMxNTU3NjAwMDAwMH0sIGQuc2Vjb25kcygpKTsKKyAgRVhQRUNUX0VRKDk5OTk5OTk5OSwgZC5uYW5vcygpKTsKKyAgRVhQRUNUX1RSVUUoVGltZVV0aWw6OkZyb21TdHJpbmcoIi0zMTU1NzYwMDAwMDAuOTk5OTk5OTk5cyIsICZkKSk7CisgIEVYUEVDVF9FUShpbnQ2NF90ey0zMTU1NzYwMDAwMDB9LCBkLnNlY29uZHMoKSk7CisgIEVYUEVDVF9FUSgtOTk5OTk5OTk5LCBkLm5hbm9zKCkpOworfQorCitURVNUKFRpbWVVdGlsVGVzdCwgR2V0RXBvY2gpIHsKKyAgRVhQRUNUX0VRKDAsIFRpbWVVdGlsOjpUaW1lc3RhbXBUb05hbm9zZWNvbmRzKFRpbWVVdGlsOjpHZXRFcG9jaCgpKSk7Cit9CisKK1RFU1QoVGltZVV0aWxUZXN0LCBEdXJhdGlvbkludGVnZXJDb252ZXJzaW9uKSB7CisgIEVYUEVDVF9FUSgiMC4wMDAwMDAwMDFzIiwKKyAgICAgICAgICAgIFRpbWVVdGlsOjpUb1N0cmluZyhUaW1lVXRpbDo6TmFub3NlY29uZHNUb0R1cmF0aW9uKDEpKSk7CisgIEVYUEVDVF9FUSgiLTAuMDAwMDAwMDAxcyIsCisgICAgICAgICAgICBUaW1lVXRpbDo6VG9TdHJpbmcoVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9EdXJhdGlvbigtMSkpKTsKKyAgRVhQRUNUX0VRKCIwLjAwMDAwMXMiLAorICAgICAgICAgICAgVGltZVV0aWw6OlRvU3RyaW5nKFRpbWVVdGlsOjpNaWNyb3NlY29uZHNUb0R1cmF0aW9uKDEpKSk7CisgIEVYUEVDVF9FUSgiLTAuMDAwMDAxcyIsCisgICAgICAgICAgICBUaW1lVXRpbDo6VG9TdHJpbmcoVGltZVV0aWw6Ok1pY3Jvc2Vjb25kc1RvRHVyYXRpb24oLTEpKSk7CisgIEVYUEVDVF9FUSgiMC4wMDFzIiwgVGltZVV0aWw6OlRvU3RyaW5nKFRpbWVVdGlsOjpNaWxsaXNlY29uZHNUb0R1cmF0aW9uKDEpKSk7CisgIEVYUEVDVF9FUSgiLTAuMDAxcyIsCisgICAgICAgICAgICBUaW1lVXRpbDo6VG9TdHJpbmcoVGltZVV0aWw6Ok1pbGxpc2Vjb25kc1RvRHVyYXRpb24oLTEpKSk7CisgIEVYUEVDVF9FUSgiMXMiLCBUaW1lVXRpbDo6VG9TdHJpbmcoVGltZVV0aWw6OlNlY29uZHNUb0R1cmF0aW9uKDEpKSk7CisgIEVYUEVDVF9FUSgiLTFzIiwgVGltZVV0aWw6OlRvU3RyaW5nKFRpbWVVdGlsOjpTZWNvbmRzVG9EdXJhdGlvbigtMSkpKTsKKyAgRVhQRUNUX0VRKCI2MHMiLCBUaW1lVXRpbDo6VG9TdHJpbmcoVGltZVV0aWw6Ok1pbnV0ZXNUb0R1cmF0aW9uKDEpKSk7CisgIEVYUEVDVF9FUSgiLTYwcyIsIFRpbWVVdGlsOjpUb1N0cmluZyhUaW1lVXRpbDo6TWludXRlc1RvRHVyYXRpb24oLTEpKSk7CisgIEVYUEVDVF9FUSgiMzYwMHMiLCBUaW1lVXRpbDo6VG9TdHJpbmcoVGltZVV0aWw6OkhvdXJzVG9EdXJhdGlvbigxKSkpOworICBFWFBFQ1RfRVEoIi0zNjAwcyIsIFRpbWVVdGlsOjpUb1N0cmluZyhUaW1lVXRpbDo6SG91cnNUb0R1cmF0aW9uKC0xKSkpOworCisgIEVYUEVDVF9FUSgKKyAgICAgIDEsIFRpbWVVdGlsOjpEdXJhdGlvblRvTmFub3NlY29uZHMoVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9EdXJhdGlvbigxKSkpOworICBFWFBFQ1RfRVEoCisgICAgICAtMSwgVGltZVV0aWw6OkR1cmF0aW9uVG9OYW5vc2Vjb25kcyhUaW1lVXRpbDo6TmFub3NlY29uZHNUb0R1cmF0aW9uKC0xKSkpOworICBFWFBFQ1RfRVEoCisgICAgICAxLCBUaW1lVXRpbDo6RHVyYXRpb25Ub01pY3Jvc2Vjb25kcyhUaW1lVXRpbDo6TWljcm9zZWNvbmRzVG9EdXJhdGlvbigxKSkpOworICBFWFBFQ1RfRVEoLTEsIFRpbWVVdGlsOjpEdXJhdGlvblRvTWljcm9zZWNvbmRzKAorICAgICAgICAgICAgICAgICAgICBUaW1lVXRpbDo6TWljcm9zZWNvbmRzVG9EdXJhdGlvbigtMSkpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgMSwgVGltZVV0aWw6OkR1cmF0aW9uVG9NaWxsaXNlY29uZHMoVGltZVV0aWw6Ok1pbGxpc2Vjb25kc1RvRHVyYXRpb24oMSkpKTsKKyAgRVhQRUNUX0VRKC0xLCBUaW1lVXRpbDo6RHVyYXRpb25Ub01pbGxpc2Vjb25kcygKKyAgICAgICAgICAgICAgICAgICAgVGltZVV0aWw6Ok1pbGxpc2Vjb25kc1RvRHVyYXRpb24oLTEpKSk7CisgIEVYUEVDVF9FUSgxLCBUaW1lVXRpbDo6RHVyYXRpb25Ub1NlY29uZHMoVGltZVV0aWw6OlNlY29uZHNUb0R1cmF0aW9uKDEpKSk7CisgIEVYUEVDVF9FUSgtMSwgVGltZVV0aWw6OkR1cmF0aW9uVG9TZWNvbmRzKFRpbWVVdGlsOjpTZWNvbmRzVG9EdXJhdGlvbigtMSkpKTsKKyAgRVhQRUNUX0VRKDEsIFRpbWVVdGlsOjpEdXJhdGlvblRvTWludXRlcyhUaW1lVXRpbDo6TWludXRlc1RvRHVyYXRpb24oMSkpKTsKKyAgRVhQRUNUX0VRKC0xLCBUaW1lVXRpbDo6RHVyYXRpb25Ub01pbnV0ZXMoVGltZVV0aWw6Ok1pbnV0ZXNUb0R1cmF0aW9uKC0xKSkpOworICBFWFBFQ1RfRVEoMSwgVGltZVV0aWw6OkR1cmF0aW9uVG9Ib3VycyhUaW1lVXRpbDo6SG91cnNUb0R1cmF0aW9uKDEpKSk7CisgIEVYUEVDVF9FUSgtMSwgVGltZVV0aWw6OkR1cmF0aW9uVG9Ib3VycyhUaW1lVXRpbDo6SG91cnNUb0R1cmF0aW9uKC0xKSkpOworCisgIC8vIFRlc3QgdHJ1bmNhdGlvbiBiZWhhdmlvci4KKyAgRVhQRUNUX0VRKDEsIFRpbWVVdGlsOjpEdXJhdGlvblRvTWljcm9zZWNvbmRzKAorICAgICAgICAgICAgICAgICAgIFRpbWVVdGlsOjpOYW5vc2Vjb25kc1RvRHVyYXRpb24oMTk5OSkpKTsKKyAgLy8gRm9yIG5lZ2F0aXZlIHZhbHVlcywgRHVyYXRpb24gd2lsbCBiZSByb3VuZGVkIHRvd2FyZHMgMC4KKyAgRVhQRUNUX0VRKC0xLCBUaW1lVXRpbDo6RHVyYXRpb25Ub01pY3Jvc2Vjb25kcygKKyAgICAgICAgICAgICAgICAgICAgVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9EdXJhdGlvbigtMTk5OSkpKTsKK30KKworVEVTVChUZXN0VXRpbFRlc3QsIFRpbWVzdGFtcEludGVnZXJDb252ZXJzaW9uKSB7CisgIEVYUEVDVF9FUSgiMTk3MC0wMS0wMVQwMDowMDowMC4wMDAwMDAwMDFaIiwKKyAgICAgICAgICAgIFRpbWVVdGlsOjpUb1N0cmluZyhUaW1lVXRpbDo6TmFub3NlY29uZHNUb1RpbWVzdGFtcCgxKSkpOworICBFWFBFQ1RfRVEoIjE5NjktMTItMzFUMjM6NTk6NTkuOTk5OTk5OTk5WiIsCisgICAgICAgICAgICBUaW1lVXRpbDo6VG9TdHJpbmcoVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9UaW1lc3RhbXAoLTEpKSk7CisgIEVYUEVDVF9FUSgiMTk3MC0wMS0wMVQwMDowMDowMC4wMDAwMDFaIiwKKyAgICAgICAgICAgIFRpbWVVdGlsOjpUb1N0cmluZyhUaW1lVXRpbDo6TWljcm9zZWNvbmRzVG9UaW1lc3RhbXAoMSkpKTsKKyAgRVhQRUNUX0VRKCIxOTY5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OVoiLAorICAgICAgICAgICAgVGltZVV0aWw6OlRvU3RyaW5nKFRpbWVVdGlsOjpNaWNyb3NlY29uZHNUb1RpbWVzdGFtcCgtMSkpKTsKKyAgRVhQRUNUX0VRKCIxOTcwLTAxLTAxVDAwOjAwOjAwLjAwMVoiLAorICAgICAgICAgICAgVGltZVV0aWw6OlRvU3RyaW5nKFRpbWVVdGlsOjpNaWxsaXNlY29uZHNUb1RpbWVzdGFtcCgxKSkpOworICBFWFBFQ1RfRVEoIjE5NjktMTItMzFUMjM6NTk6NTkuOTk5WiIsCisgICAgICAgICAgICBUaW1lVXRpbDo6VG9TdHJpbmcoVGltZVV0aWw6Ok1pbGxpc2Vjb25kc1RvVGltZXN0YW1wKC0xKSkpOworICBFWFBFQ1RfRVEoIjE5NzAtMDEtMDFUMDA6MDA6MDFaIiwKKyAgICAgICAgICAgIFRpbWVVdGlsOjpUb1N0cmluZyhUaW1lVXRpbDo6U2Vjb25kc1RvVGltZXN0YW1wKDEpKSk7CisgIEVYUEVDVF9FUSgiMTk2OS0xMi0zMVQyMzo1OTo1OVoiLAorICAgICAgICAgICAgVGltZVV0aWw6OlRvU3RyaW5nKFRpbWVVdGlsOjpTZWNvbmRzVG9UaW1lc3RhbXAoLTEpKSk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgMSwgVGltZVV0aWw6OlRpbWVzdGFtcFRvTmFub3NlY29uZHMoVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9UaW1lc3RhbXAoMSkpKTsKKyAgRVhQRUNUX0VRKC0xLCBUaW1lVXRpbDo6VGltZXN0YW1wVG9OYW5vc2Vjb25kcygKKyAgICAgICAgICAgICAgICAgICAgVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9UaW1lc3RhbXAoLTEpKSk7CisgIEVYUEVDVF9FUSgxLCBUaW1lVXRpbDo6VGltZXN0YW1wVG9NaWNyb3NlY29uZHMoCisgICAgICAgICAgICAgICAgICAgVGltZVV0aWw6Ok1pY3Jvc2Vjb25kc1RvVGltZXN0YW1wKDEpKSk7CisgIEVYUEVDVF9FUSgtMSwgVGltZVV0aWw6OlRpbWVzdGFtcFRvTWljcm9zZWNvbmRzKAorICAgICAgICAgICAgICAgICAgICBUaW1lVXRpbDo6TWljcm9zZWNvbmRzVG9UaW1lc3RhbXAoLTEpKSk7CisgIEVYUEVDVF9FUSgxLCBUaW1lVXRpbDo6VGltZXN0YW1wVG9NaWxsaXNlY29uZHMoCisgICAgICAgICAgICAgICAgICAgVGltZVV0aWw6Ok1pbGxpc2Vjb25kc1RvVGltZXN0YW1wKDEpKSk7CisgIEVYUEVDVF9FUSgtMSwgVGltZVV0aWw6OlRpbWVzdGFtcFRvTWlsbGlzZWNvbmRzKAorICAgICAgICAgICAgICAgICAgICBUaW1lVXRpbDo6TWlsbGlzZWNvbmRzVG9UaW1lc3RhbXAoLTEpKSk7CisgIEVYUEVDVF9FUSgxLCBUaW1lVXRpbDo6VGltZXN0YW1wVG9TZWNvbmRzKFRpbWVVdGlsOjpTZWNvbmRzVG9UaW1lc3RhbXAoMSkpKTsKKyAgRVhQRUNUX0VRKC0xLCBUaW1lVXRpbDo6VGltZXN0YW1wVG9TZWNvbmRzKFRpbWVVdGlsOjpTZWNvbmRzVG9UaW1lc3RhbXAoLTEpKSk7CisKKyAgLy8gVGVzdCB0cnVuY2F0aW9uIGJlaGF2aW9yLgorICBFWFBFQ1RfRVEoMSwgVGltZVV0aWw6OlRpbWVzdGFtcFRvTWljcm9zZWNvbmRzKAorICAgICAgICAgICAgICAgICAgIFRpbWVVdGlsOjpOYW5vc2Vjb25kc1RvVGltZXN0YW1wKDE5OTkpKSk7CisgIC8vIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIFRpbWVzdGFtcCB3aWxsIGJlIHJvdW5kZWQgZG93bi4KKyAgLy8gRm9yIGV4YW1wbGUsICIxOTY5LTEyLTMxVDIzOjU5OjU5LjVaIiAoaS5lLiwgLTAuNXMpIHJvdW5kZWQgdG8gc2Vjb25kcworICAvLyB3aWxsIGJlICIxOTY5LTEyLTMxVDIzOjU5OjU5WiIgKGkuZS4sIC0xcykgcmF0aGVyIHRoYW4KKyAgLy8gIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiAoaS5lLiwgMHMpLgorICBFWFBFQ1RfRVEoLTIsIFRpbWVVdGlsOjpUaW1lc3RhbXBUb01pY3Jvc2Vjb25kcygKKyAgICAgICAgICAgICAgICAgICAgVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9UaW1lc3RhbXAoLTE5OTkpKSk7Cit9CisKK1RFU1QoVGltZVV0aWxUZXN0LCBUaW1lVENvbnZlcnNpb24pIHsKKyAgdGltZV90IHZhbHVlID0gdGltZShudWxscHRyKTsKKyAgRVhQRUNUX0VRKHZhbHVlLAorICAgICAgICAgICAgVGltZVV0aWw6OlRpbWVzdGFtcFRvVGltZVQoVGltZVV0aWw6OlRpbWVUVG9UaW1lc3RhbXAodmFsdWUpKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIDEsIFRpbWVVdGlsOjpUaW1lc3RhbXBUb1RpbWVUKFRpbWVVdGlsOjpNaWxsaXNlY29uZHNUb1RpbWVzdGFtcCgxOTk5KSkpOworfQorCitURVNUKFRpbWVVdGlsVGVzdCwgVGltZXZhbENvbnZlcnNpb24pIHsKKyAgdGltZXZhbCB2YWx1ZSA9IFRpbWVVdGlsOjpUaW1lc3RhbXBUb1RpbWV2YWwoCisgICAgICBUaW1lVXRpbDo6TmFub3NlY29uZHNUb1RpbWVzdGFtcCgxOTk5OTk5OTk5KSk7CisgIEVYUEVDVF9FUSgxLCB2YWx1ZS50dl9zZWMpOworICBFWFBFQ1RfRVEoOTk5OTk5LCB2YWx1ZS50dl91c2VjKTsKKyAgdmFsdWUgPSBUaW1lVXRpbDo6VGltZXN0YW1wVG9UaW1ldmFsKAorICAgICAgVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9UaW1lc3RhbXAoLTE5OTk5OTk5OTkpKTsKKyAgRVhQRUNUX0VRKC0yLCB2YWx1ZS50dl9zZWMpOworICBFWFBFQ1RfRVEoMCwgdmFsdWUudHZfdXNlYyk7CisKKyAgdmFsdWUgPQorICAgICAgVGltZVV0aWw6OkR1cmF0aW9uVG9UaW1ldmFsKFRpbWVVdGlsOjpOYW5vc2Vjb25kc1RvRHVyYXRpb24oMTk5OTk5OTk5OSkpOworICBFWFBFQ1RfRVEoMSwgdmFsdWUudHZfc2VjKTsKKyAgRVhQRUNUX0VRKDk5OTk5OSwgdmFsdWUudHZfdXNlYyk7CisgIHZhbHVlID0KKyAgICAgIFRpbWVVdGlsOjpEdXJhdGlvblRvVGltZXZhbChUaW1lVXRpbDo6TmFub3NlY29uZHNUb0R1cmF0aW9uKC0xOTk5OTk5OTk5KSk7CisgIEVYUEVDVF9FUSgtMiwgdmFsdWUudHZfc2VjKTsKKyAgRVhQRUNUX0VRKDEsIHZhbHVlLnR2X3VzZWMpOworfQorCitURVNUKFRpbWVVdGlsVGVzdCwgRHVyYXRpb25PcGVyYXRvcnMpIHsKKyAgRHVyYXRpb24gb25lX3NlY29uZCA9IFRpbWVVdGlsOjpTZWNvbmRzVG9EdXJhdGlvbigxKTsKKyAgRHVyYXRpb24gb25lX25hbm8gPSBUaW1lVXRpbDo6TmFub3NlY29uZHNUb0R1cmF0aW9uKDEpOworCisgIC8vIFRlc3QgKy8tCisgIER1cmF0aW9uIGEgPSBvbmVfc2Vjb25kOworICBhICs9IG9uZV9zZWNvbmQ7CisgIGEgLT0gb25lX25hbm87CisgIEVYUEVDVF9FUSgiMS45OTk5OTk5OTlzIiwgVGltZVV0aWw6OlRvU3RyaW5nKGEpKTsKKyAgRHVyYXRpb24gYiA9IC1hOworICBFWFBFQ1RfRVEoIi0xLjk5OTk5OTk5OXMiLCBUaW1lVXRpbDo6VG9TdHJpbmcoYikpOworICBFWFBFQ1RfRVEoIjMuOTk5OTk5OTk4cyIsIFRpbWVVdGlsOjpUb1N0cmluZyhhICsgYSkpOworICBFWFBFQ1RfRVEoIjBzIiwgVGltZVV0aWw6OlRvU3RyaW5nKGEgKyBiKSk7CisgIEVYUEVDVF9FUSgiMHMiLCBUaW1lVXRpbDo6VG9TdHJpbmcoYiArIGEpKTsKKyAgRVhQRUNUX0VRKCItMy45OTk5OTk5OThzIiwgVGltZVV0aWw6OlRvU3RyaW5nKGIgKyBiKSk7CisgIEVYUEVDVF9FUSgiMy45OTk5OTk5OThzIiwgVGltZVV0aWw6OlRvU3RyaW5nKGEgLSBiKSk7CisgIEVYUEVDVF9FUSgiMHMiLCBUaW1lVXRpbDo6VG9TdHJpbmcoYSAtIGEpKTsKKyAgRVhQRUNUX0VRKCIwcyIsIFRpbWVVdGlsOjpUb1N0cmluZyhiIC0gYikpOworICBFWFBFQ1RfRVEoIi0zLjk5OTk5OTk5OHMiLCBUaW1lVXRpbDo6VG9TdHJpbmcoYiAtIGEpKTsKKworICAvLyBUZXN0ICoKKyAgRVhQRUNUX0VRKGEgKyBhLCBhICogMik7CisgIEVYUEVDVF9FUShiICsgYiwgYSAqICgtMikpOworICBFWFBFQ1RfRVEoYiArIGIsIGIgKiAyKTsKKyAgRVhQRUNUX0VRKGEgKyBhLCBiICogKC0yKSk7CisgIEVYUEVDVF9FUSgiMC45OTk5OTk5OTlzIiwgVGltZVV0aWw6OlRvU3RyaW5nKGEgKiAwLjUpKTsKKyAgRVhQRUNUX0VRKCItMC45OTk5OTk5OTlzIiwgVGltZVV0aWw6OlRvU3RyaW5nKGIgKiAwLjUpKTsKKyAgLy8gTXVsdGlwbGljYXRpb24gc2hvdWxkIG5vdCBvdmVyZmxvdyBpZiB0aGUgcmVzdWx0IGZpdHMgaW50byB0aGUgc3VwcG9ydGVkCisgIC8vIHJhbmdlIG9mIER1cmF0aW9uIChpbnRlcm1lZGlhdGUgcmVzdWx0IG1heSBiZSBsYXJnZXIgdGhhbiBpbnQ2NCkuCisgIEVYUEVDVF9FUSgiMzE1NTc1OTk5Njg0LjQyNHMiLCBUaW1lVXRpbDo6VG9TdHJpbmcoKG9uZV9zZWNvbmQgLSBvbmVfbmFubykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3R7MzE1NTc2MDAwMDAwfSkpOworICBFWFBFQ1RfRVEoIi0zMTU1NzU5OTk2ODQuNDI0cyIsIFRpbWVVdGlsOjpUb1N0cmluZygob25lX25hbm8gLSBvbmVfc2Vjb25kKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3R7MzE1NTc2MDAwMDAwfSkpOworICBFWFBFQ1RfRVEoIi0zMTU1NzU5OTk2ODQuNDI0cyIsIFRpbWVVdGlsOjpUb1N0cmluZygob25lX3NlY29uZCAtIG9uZV9uYW5vKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90ey0zMTU1NzYwMDAwMDB9KSkpOworCisgIC8vIFRlc3QgLyBhbmQgJQorICBFWFBFQ1RfRVEoIjAuOTk5OTk5OTk5cyIsIFRpbWVVdGlsOjpUb1N0cmluZyhhIC8gMikpOworICBFWFBFQ1RfRVEoIi0wLjk5OTk5OTk5OXMiLCBUaW1lVXRpbDo6VG9TdHJpbmcoYiAvIDIpKTsKKyAgRHVyYXRpb24gbGFyZ2UgPQorICAgICAgVGltZVV0aWw6OlNlY29uZHNUb0R1cmF0aW9uKGludDY0X3R7MzE1NTc2MDAwMDAwfSkgLSBvbmVfbmFubzsKKyAgLy8gV2UgaGF2ZSB0byBoYW5kbGUgZGl2aXNpb24gd2l0aCB2YWx1ZXMgYmV5b25kIDY0IGJpdHMuCisgIEVYUEVDVF9FUSgiMC45OTk5OTk5OTlzIiwgVGltZVV0aWw6OlRvU3RyaW5nKGxhcmdlIC8gaW50NjRfdHszMTU1NzYwMDAwMDB9KSk7CisgIEVYUEVDVF9FUSgiLTAuOTk5OTk5OTk5cyIsCisgICAgICAgICAgICBUaW1lVXRpbDo6VG9TdHJpbmcoKC1sYXJnZSkgLyBpbnQ2NF90ezMxNTU3NjAwMDAwMH0pKTsKKyAgRVhQRUNUX0VRKCItMC45OTk5OTk5OTlzIiwKKyAgICAgICAgICAgIFRpbWVVdGlsOjpUb1N0cmluZyhsYXJnZSAvIChpbnQ2NF90ey0zMTU1NzYwMDAwMDB9KSkpOworICBEdXJhdGlvbiBsYXJnZTIgPSBsYXJnZSArIG9uZV9uYW5vOworICBFWFBFQ1RfRVEobGFyZ2UsIGxhcmdlICUgbGFyZ2UyKTsKKyAgRVhQRUNUX0VRKC1sYXJnZSwgKC1sYXJnZSkgJSBsYXJnZTIpOworICBFWFBFQ1RfRVEobGFyZ2UsIGxhcmdlICUgKC1sYXJnZTIpKTsKKyAgRVhQRUNUX0VRKG9uZV9uYW5vLCBsYXJnZTIgJSBsYXJnZSk7CisgIEVYUEVDVF9FUSgtb25lX25hbm8sICgtbGFyZ2UyKSAlIGxhcmdlKTsKKyAgRVhQRUNUX0VRKG9uZV9uYW5vLCBsYXJnZTIgJSAoLWxhcmdlKSk7CisgIC8vIFNvbWUgY29ybmVyIGNhc2VzIGFib3V0IG5lZ2F0aXZlIHZhbHVlcy4KKyAgLy8KKyAgLy8gKC01KSAvIDIgPSAtMiwgcmVtYWluZGVyID0gLTEKKyAgLy8gKC01KSAvICgtMikgPSAyLCByZW1haW5kZXIgPSAtMQorICBhID0gVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9EdXJhdGlvbigtNSk7CisgIEVYUEVDVF9FUShUaW1lVXRpbDo6TmFub3NlY29uZHNUb0R1cmF0aW9uKC0yKSwgYSAvIDIpOworICBFWFBFQ1RfRVEoVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9EdXJhdGlvbigyKSwgYSAvICgtMikpOworICBiID0gVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9EdXJhdGlvbigyKTsKKyAgRVhQRUNUX0VRKC0yLCBhIC8gYik7CisgIEVYUEVDVF9FUShUaW1lVXRpbDo6TmFub3NlY29uZHNUb0R1cmF0aW9uKC0xKSwgYSAlIGIpOworICBFWFBFQ1RfRVEoMiwgYSAvICgtYikpOworICBFWFBFQ1RfRVEoVGltZVV0aWw6Ok5hbm9zZWNvbmRzVG9EdXJhdGlvbigtMSksIGEgJSAoLWIpKTsKKworICAvLyBUZXN0IHJlbGF0aW9uYWwgb3BlcmF0b3JzLgorICBFWFBFQ1RfVFJVRShvbmVfbmFubyA8IG9uZV9zZWNvbmQpOworICBFWFBFQ1RfRkFMU0Uob25lX3NlY29uZCA8IG9uZV9zZWNvbmQpOworICBFWFBFQ1RfRkFMU0Uob25lX3NlY29uZCA8IG9uZV9uYW5vKTsKKyAgRVhQRUNUX0ZBTFNFKC1vbmVfbmFubyA8IC1vbmVfc2Vjb25kKTsKKyAgRVhQRUNUX0ZBTFNFKC1vbmVfc2Vjb25kIDwgLW9uZV9zZWNvbmQpOworICBFWFBFQ1RfVFJVRSgtb25lX3NlY29uZCA8IC1vbmVfbmFubyk7CisgIEVYUEVDVF9UUlVFKC1vbmVfbmFubyA8IG9uZV9uYW5vKTsKKyAgRVhQRUNUX0ZBTFNFKG9uZV9uYW5vIDwgLW9uZV9uYW5vKTsKKworICBFWFBFQ1RfRkFMU0Uob25lX25hbm8gPiBvbmVfc2Vjb25kKTsKKyAgRVhQRUNUX0ZBTFNFKG9uZV9uYW5vID4gb25lX25hbm8pOworICBFWFBFQ1RfVFJVRShvbmVfc2Vjb25kID4gb25lX25hbm8pOworCisgIEVYUEVDVF9GQUxTRShvbmVfbmFubyA+PSBvbmVfc2Vjb25kKTsKKyAgRVhQRUNUX1RSVUUob25lX25hbm8gPj0gb25lX25hbm8pOworICBFWFBFQ1RfVFJVRShvbmVfc2Vjb25kID49IG9uZV9uYW5vKTsKKworICBFWFBFQ1RfVFJVRShvbmVfbmFubyA8PSBvbmVfc2Vjb25kKTsKKyAgRVhQRUNUX1RSVUUob25lX25hbm8gPD0gb25lX25hbm8pOworICBFWFBFQ1RfRkFMU0Uob25lX3NlY29uZCA8PSBvbmVfbmFubyk7CisKKyAgRVhQRUNUX1RSVUUob25lX25hbm8gPT0gb25lX25hbm8pOworICBFWFBFQ1RfRkFMU0Uob25lX25hbm8gPT0gb25lX3NlY29uZCk7CisKKyAgRVhQRUNUX0ZBTFNFKG9uZV9uYW5vICE9IG9uZV9uYW5vKTsKKyAgRVhQRUNUX1RSVUUob25lX25hbm8gIT0gb25lX3NlY29uZCk7Cit9CisKK1RFU1QoVGltZVV0aWxUZXN0LCBUaW1lc3RhbXBPcGVyYXRvcnMpIHsKKyAgVGltZXN0YW1wIGJlZ2luLCBlbmQ7CisgIEVYUEVDVF9UUlVFKFRpbWVVdGlsOjpGcm9tU3RyaW5nKCIwMDAxLTAxLTAxVDAwOjAwOjAwWiIsICZiZWdpbikpOworICBFWFBFQ1RfVFJVRShUaW1lVXRpbDo6RnJvbVN0cmluZygiOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5OTlaIiwgJmVuZCkpOworICBEdXJhdGlvbiBkID0gZW5kIC0gYmVnaW47CisgIEVYUEVDVF9UUlVFKGVuZCA9PSBiZWdpbiArIGQpOworICBFWFBFQ1RfVFJVRShlbmQgPT0gZCArIGJlZ2luKTsKKyAgRVhQRUNUX1RSVUUoYmVnaW4gPT0gZW5kIC0gZCk7CisKKyAgLy8gVGVzdCByZWxhdGlvbmFsIG9wZXJhdG9ycworICBUaW1lc3RhbXAgdDEgPSBiZWdpbiArIGQgLyA0OworICBUaW1lc3RhbXAgdDIgPSBlbmQgLSBkIC8gNDsKKyAgRVhQRUNUX1RSVUUodDEgPCB0Mik7CisgIEVYUEVDVF9GQUxTRSh0MSA8IHQxKTsKKyAgRVhQRUNUX0ZBTFNFKHQyIDwgdDEpOworICBFWFBFQ1RfRkFMU0UodDEgPiB0Mik7CisgIEVYUEVDVF9GQUxTRSh0MSA+IHQxKTsKKyAgRVhQRUNUX1RSVUUodDIgPiB0MSk7CisgIEVYUEVDVF9GQUxTRSh0MSA+PSB0Mik7CisgIEVYUEVDVF9UUlVFKHQxID49IHQxKTsKKyAgRVhQRUNUX1RSVUUodDIgPj0gdDEpOworICBFWFBFQ1RfVFJVRSh0MSA8PSB0Mik7CisgIEVYUEVDVF9UUlVFKHQxIDw9IHQxKTsKKyAgRVhQRUNUX0ZBTFNFKHQyIDw9IHQxKTsKKworICBFWFBFQ1RfRkFMU0UodDEgPT0gdDIpOworICBFWFBFQ1RfVFJVRSh0MSA9PSB0MSk7CisgIEVYUEVDVF9GQUxTRSh0MiA9PSB0MSk7CisgIEVYUEVDVF9UUlVFKHQxICE9IHQyKTsKKyAgRVhQRUNUX0ZBTFNFKHQxICE9IHQxKTsKKyAgRVhQRUNUX1RSVUUodDIgIT0gdDEpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyLmggYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZTdiNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlci5oCkBAIC0wLDAgKzEsNzcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBEZWZpbmVzIGEgVHlwZVJlc29sdmVyIGZvciB0aGUgQW55IG1lc3NhZ2UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1VUSUxfVFlQRV9SRVNPTFZFUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1VUSUxfVFlQRV9SRVNPTFZFUl9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdHlwZS5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzLmg+CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CitjbGFzcyBEZXNjcmlwdG9yUG9vbDsKK25hbWVzcGFjZSB1dGlsIHsKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhIHR5cGUgcmVzb2x2ZXIuCisvLworLy8gSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIG11c3QgYmUgdGhyZWFkLXNhZmUuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgVHlwZVJlc29sdmVyIHsKKyBwdWJsaWM6CisgIFR5cGVSZXNvbHZlcigpIHt9CisgIHZpcnR1YWwgflR5cGVSZXNvbHZlcigpIHt9CisKKyAgLy8gUmVzb2x2ZXMgYSB0eXBlIHVybCBmb3IgYSBtZXNzYWdlIHR5cGUuCisgIHZpcnR1YWwgdXRpbDo6U3RhdHVzIFJlc29sdmVNZXNzYWdlVHlwZSgKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlX3VybCwgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZSogbWVzc2FnZV90eXBlKSA9IDA7CisKKyAgLy8gUmVzb2x2ZXMgYSB0eXBlIHVybCBmb3IgYW4gZW51bSB0eXBlLgorICB2aXJ0dWFsIHV0aWw6OlN0YXR1cyBSZXNvbHZlRW51bVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bSogZW51bV90eXBlKSA9IDA7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVHlwZVJlc29sdmVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9UWVBFX1JFU09MVkVSX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlMGVmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuY2MKQEAgLTAsMCArMSwzNzAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdHlwZS5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisvLyBjbGFuZy1mb3JtYXQgb24KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIHsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OkFueTsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OkJvb2xWYWx1ZTsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OkJ5dGVzVmFsdWU7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjpEb3VibGVWYWx1ZTsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OkVudW07Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWU7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OkZsb2F0VmFsdWU7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjpJbnQzMlZhbHVlOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6SW50NjRWYWx1ZTsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6Ok9wdGlvbjsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OlN0cmluZ1ZhbHVlOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6VHlwZTsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OlVJbnQzMlZhbHVlOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6VUludDY0VmFsdWU7CisKK2NsYXNzIERlc2NyaXB0b3JQb29sVHlwZVJlc29sdmVyIDogcHVibGljIFR5cGVSZXNvbHZlciB7CisgcHVibGljOgorICBEZXNjcmlwdG9yUG9vbFR5cGVSZXNvbHZlcihjb25zdCBzdGQ6OnN0cmluZyYgdXJsX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpCisgICAgICA6IHVybF9wcmVmaXhfKHVybF9wcmVmaXgpLCBwb29sXyhwb29sKSB7fQorCisgIHV0aWw6OlN0YXR1cyBSZXNvbHZlTWVzc2FnZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUqIHR5cGUpIG92ZXJyaWRlIHsKKyAgICBzdGQ6OnN0cmluZyB0eXBlX25hbWU7CisgICAgdXRpbDo6U3RhdHVzIHN0YXR1cyA9IFBhcnNlVHlwZVVybCh0eXBlX3VybCwgJnR5cGVfbmFtZSk7CisgICAgaWYgKCFzdGF0dXMub2soKSkgeworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gcG9vbF8tPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSh0eXBlX25hbWUpOworICAgIGlmIChkZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgIHJldHVybiB1dGlsOjpOb3RGb3VuZEVycm9yKCJJbnZhbGlkIHR5cGUgVVJMLCB1bmtub3duIHR5cGU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lKTsKKyAgICB9CisgICAgQ29udmVydERlc2NyaXB0b3IoZGVzY3JpcHRvciwgdHlwZSk7CisgICAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworICB9CisKKyAgdXRpbDo6U3RhdHVzIFJlc29sdmVFbnVtVHlwZShjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV91cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bSogZW51bV90eXBlKSBvdmVycmlkZSB7CisgICAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lOworICAgIHV0aWw6OlN0YXR1cyBzdGF0dXMgPSBQYXJzZVR5cGVVcmwodHlwZV91cmwsICZ0eXBlX25hbWUpOworICAgIGlmICghc3RhdHVzLm9rKCkpIHsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBwb29sXy0+RmluZEVudW1UeXBlQnlOYW1lKHR5cGVfbmFtZSk7CisgICAgaWYgKGRlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKCJJbnZhbGlkIHR5cGUgVVJMLCB1bmtub3duIHR5cGU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfbmFtZSk7CisgICAgfQorICAgIENvbnZlcnRFbnVtRGVzY3JpcHRvcihkZXNjcmlwdG9yLCBlbnVtX3R5cGUpOworICAgIHJldHVybiB1dGlsOjpTdGF0dXMoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBDb252ZXJ0RGVzY3JpcHRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBUeXBlKiB0eXBlKSB7CisgICAgdHlwZS0+Q2xlYXIoKTsKKyAgICB0eXBlLT5zZXRfbmFtZShkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyArK2kpIHsKKyAgICAgIENvbnZlcnRGaWVsZERlc2NyaXB0b3IoZGVzY3JpcHRvci0+ZmllbGQoaSksIHR5cGUtPmFkZF9maWVsZHMoKSk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+b25lb2ZfZGVjbF9jb3VudCgpOyArK2kpIHsKKyAgICAgIHR5cGUtPmFkZF9vbmVvZnMoZGVzY3JpcHRvci0+b25lb2ZfZGVjbChpKS0+bmFtZSgpKTsKKyAgICB9CisgICAgdHlwZS0+bXV0YWJsZV9zb3VyY2VfY29udGV4dCgpLT5zZXRfZmlsZV9uYW1lKGRlc2NyaXB0b3ItPmZpbGUoKS0+bmFtZSgpKTsKKyAgICBDb252ZXJ0TWVzc2FnZU9wdGlvbnMoZGVzY3JpcHRvci0+b3B0aW9ucygpLCB0eXBlLT5tdXRhYmxlX29wdGlvbnMoKSk7CisgIH0KKworICB2b2lkIENvbnZlcnRNZXNzYWdlT3B0aW9ucyhjb25zdCBNZXNzYWdlT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxPcHRpb24+KiBvdXRwdXQpIHsKKyAgICByZXR1cm4gQ29udmVydE9wdGlvbnNJbnRlcm5hbChvcHRpb25zLCBvdXRwdXQpOworICB9CisKKyAgdm9pZCBDb252ZXJ0RmllbGRPcHRpb25zKGNvbnN0IEZpZWxkT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8T3B0aW9uPiogb3V0cHV0KSB7CisgICAgcmV0dXJuIENvbnZlcnRPcHRpb25zSW50ZXJuYWwob3B0aW9ucywgb3V0cHV0KTsKKyAgfQorCisgIHZvaWQgQ29udmVydEVudW1PcHRpb25zKGNvbnN0IEVudW1PcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPE9wdGlvbj4qIG91dHB1dCkgeworICAgIHJldHVybiBDb252ZXJ0T3B0aW9uc0ludGVybmFsKG9wdGlvbnMsIG91dHB1dCk7CisgIH0KKworICB2b2lkIENvbnZlcnRFbnVtVmFsdWVPcHRpb25zKGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxPcHRpb24+KiBvdXRwdXQpIHsKKyAgICByZXR1cm4gQ29udmVydE9wdGlvbnNJbnRlcm5hbChvcHRpb25zLCBvdXRwdXQpOworICB9CisKKyAgLy8gSW1wbGVtZW50YXRpb24gZGV0YWlscyBmb3IgQ29udmVydCpPcHRpb25zLgorICB2b2lkIENvbnZlcnRPcHRpb25zSW50ZXJuYWwoY29uc3QgTWVzc2FnZSYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8T3B0aW9uPiogb3V0cHV0KSB7CisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG9wdGlvbnMuR2V0UmVmbGVjdGlvbigpOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG9wdGlvbnMsICZmaWVsZHMpOworICAgIGZvciAoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA6IGZpZWxkcykgeworICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgIGNvbnN0IGludCBzaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKG9wdGlvbnMsIGZpZWxkKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICBDb252ZXJ0T3B0aW9uRmllbGQocmVmbGVjdGlvbiwgb3B0aW9ucywgZmllbGQsIGksIG91dHB1dC0+QWRkKCkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBDb252ZXJ0T3B0aW9uRmllbGQocmVmbGVjdGlvbiwgb3B0aW9ucywgZmllbGQsIC0xLCBvdXRwdXQtPkFkZCgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCBDb252ZXJ0T3B0aW9uRmllbGQoY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb24qIG91dCkgeworICAgIG91dC0+c2V0X25hbWUoZmllbGQtPmlzX2V4dGVuc2lvbigpID8gZmllbGQtPmZ1bGxfbmFtZSgpIDogZmllbGQtPm5hbWUoKSk7CisgICAgQW55KiB2YWx1ZSA9IG91dC0+bXV0YWJsZV92YWx1ZSgpOworICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgIHZhbHVlLT5QYWNrRnJvbSgKKyAgICAgICAgICAgIGZpZWxkLT5pc19yZXBlYXRlZCgpCisgICAgICAgICAgICAgICAgPyByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2Uob3B0aW9ucywgZmllbGQsIGluZGV4KQorICAgICAgICAgICAgICAgIDogcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShvcHRpb25zLCBmaWVsZCkpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICAgIHZhbHVlLT5QYWNrRnJvbShXcmFwVmFsdWU8RG91YmxlVmFsdWU+KAorICAgICAgICAgICAgZmllbGQtPmlzX3JlcGVhdGVkKCkKKyAgICAgICAgICAgICAgICA/IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRG91YmxlKG9wdGlvbnMsIGZpZWxkLCBpbmRleCkKKyAgICAgICAgICAgICAgICA6IHJlZmxlY3Rpb24tPkdldERvdWJsZShvcHRpb25zLCBmaWVsZCkpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgICAgIHZhbHVlLT5QYWNrRnJvbShXcmFwVmFsdWU8RmxvYXRWYWx1ZT4oCisgICAgICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgICAgICAgID8gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRGbG9hdChvcHRpb25zLCBmaWVsZCwgaW5kZXgpCisgICAgICAgICAgICAgICAgOiByZWZsZWN0aW9uLT5HZXRGbG9hdChvcHRpb25zLCBmaWVsZCkpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICAgIHZhbHVlLT5QYWNrRnJvbShXcmFwVmFsdWU8SW50NjRWYWx1ZT4oCisgICAgICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgICAgICAgID8gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NChvcHRpb25zLCBmaWVsZCwgaW5kZXgpCisgICAgICAgICAgICAgICAgOiByZWZsZWN0aW9uLT5HZXRJbnQ2NChvcHRpb25zLCBmaWVsZCkpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgICB2YWx1ZS0+UGFja0Zyb20oV3JhcFZhbHVlPFVJbnQ2NFZhbHVlPigKKyAgICAgICAgICAgIGZpZWxkLT5pc19yZXBlYXRlZCgpCisgICAgICAgICAgICAgICAgPyByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQ2NChvcHRpb25zLCBmaWVsZCwgaW5kZXgpCisgICAgICAgICAgICAgICAgOiByZWZsZWN0aW9uLT5HZXRVSW50NjQob3B0aW9ucywgZmllbGQpKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgICB2YWx1ZS0+UGFja0Zyb20oV3JhcFZhbHVlPEludDMyVmFsdWU+KAorICAgICAgICAgICAgZmllbGQtPmlzX3JlcGVhdGVkKCkKKyAgICAgICAgICAgICAgICA/IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIob3B0aW9ucywgZmllbGQsIGluZGV4KQorICAgICAgICAgICAgICAgIDogcmVmbGVjdGlvbi0+R2V0SW50MzIob3B0aW9ucywgZmllbGQpKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgdmFsdWUtPlBhY2tGcm9tKFdyYXBWYWx1ZTxVSW50MzJWYWx1ZT4oCisgICAgICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgICAgICAgID8gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIob3B0aW9ucywgZmllbGQsIGluZGV4KQorICAgICAgICAgICAgICAgIDogcmVmbGVjdGlvbi0+R2V0VUludDMyKG9wdGlvbnMsIGZpZWxkKSkpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgICAgICB2YWx1ZS0+UGFja0Zyb20oV3JhcFZhbHVlPEJvb2xWYWx1ZT4oCisgICAgICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgICAgICAgID8gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRCb29sKG9wdGlvbnMsIGZpZWxkLCBpbmRleCkKKyAgICAgICAgICAgICAgICA6IHJlZmxlY3Rpb24tPkdldEJvb2wob3B0aW9ucywgZmllbGQpKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsID0KKyAgICAgICAgICAgIGZpZWxkLT5pc19yZXBlYXRlZCgpCisgICAgICAgICAgICAgICAgPyByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZyhvcHRpb25zLCBmaWVsZCwgaW5kZXgpCisgICAgICAgICAgICAgICAgOiByZWZsZWN0aW9uLT5HZXRTdHJpbmcob3B0aW9ucywgZmllbGQpOworICAgICAgICBpZiAoZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7CisgICAgICAgICAgdmFsdWUtPlBhY2tGcm9tKFdyYXBWYWx1ZTxTdHJpbmdWYWx1ZT4odmFsKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFsdWUtPlBhY2tGcm9tKFdyYXBWYWx1ZTxCeXRlc1ZhbHVlPih2YWwpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOiB7CisgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbCA9CisgICAgICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgICAgICAgID8gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG9wdGlvbnMsIGZpZWxkLCBpbmRleCkKKyAgICAgICAgICAgICAgICA6IHJlZmxlY3Rpb24tPkdldEVudW0ob3B0aW9ucywgZmllbGQpOworICAgICAgICB2YWx1ZS0+UGFja0Zyb20oV3JhcFZhbHVlPEludDMyVmFsdWU+KHZhbC0+bnVtYmVyKCkpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBXcmFwcGVyVCwgdHlwZW5hbWUgVD4KKyAgc3RhdGljIFdyYXBwZXJUIFdyYXBWYWx1ZShUIHZhbHVlKSB7CisgICAgV3JhcHBlclQgd3JhcHBlcjsKKyAgICB3cmFwcGVyLnNldF92YWx1ZSh2YWx1ZSk7CisgICAgcmV0dXJuIHdyYXBwZXI7CisgIH0KKworICB2b2lkIENvbnZlcnRGaWVsZERlc2NyaXB0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBGaWVsZCogZmllbGQpIHsKKyAgICBmaWVsZC0+c2V0X2tpbmQoc3RhdGljX2Nhc3Q8RmllbGQ6OktpbmQ+KGRlc2NyaXB0b3ItPnR5cGUoKSkpOworICAgIHN3aXRjaCAoZGVzY3JpcHRvci0+bGFiZWwoKSkgeworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMOgorICAgICAgICBmaWVsZC0+c2V0X2NhcmRpbmFsaXR5KEZpZWxkOjpDQVJESU5BTElUWV9PUFRJT05BTCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEOgorICAgICAgICBmaWVsZC0+c2V0X2NhcmRpbmFsaXR5KEZpZWxkOjpDQVJESU5BTElUWV9SRVBFQVRFRCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUVVJUkVEOgorICAgICAgICBmaWVsZC0+c2V0X2NhcmRpbmFsaXR5KEZpZWxkOjpDQVJESU5BTElUWV9SRVFVSVJFRCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBmaWVsZC0+c2V0X251bWJlcihkZXNjcmlwdG9yLT5udW1iZXIoKSk7CisgICAgZmllbGQtPnNldF9uYW1lKGRlc2NyaXB0b3ItPm5hbWUoKSk7CisgICAgZmllbGQtPnNldF9qc29uX25hbWUoZGVzY3JpcHRvci0+anNvbl9uYW1lKCkpOworICAgIGlmIChkZXNjcmlwdG9yLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgICBmaWVsZC0+c2V0X2RlZmF1bHRfdmFsdWUoRGVmYXVsdFZhbHVlQXNTdHJpbmcoZGVzY3JpcHRvcikpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRvci0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFIHx8CisgICAgICAgIGRlc2NyaXB0b3ItPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICAgIGZpZWxkLT5zZXRfdHlwZV91cmwoR2V0VHlwZVVybChkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKSkpOworICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvci0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNKSB7CisgICAgICBmaWVsZC0+c2V0X3R5cGVfdXJsKEdldFR5cGVVcmwoZGVzY3JpcHRvci0+ZW51bV90eXBlKCkpKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfb25lb2YoKSAhPSBOVUxMKSB7CisgICAgICBmaWVsZC0+c2V0X29uZW9mX2luZGV4KGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfb25lb2YoKS0+aW5kZXgoKSArIDEpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRvci0+aXNfcGFja2VkKCkpIHsKKyAgICAgIGZpZWxkLT5zZXRfcGFja2VkKHRydWUpOworICAgIH0KKworICAgIENvbnZlcnRGaWVsZE9wdGlvbnMoZGVzY3JpcHRvci0+b3B0aW9ucygpLCBmaWVsZC0+bXV0YWJsZV9vcHRpb25zKCkpOworICB9CisKKyAgdm9pZCBDb252ZXJ0RW51bURlc2NyaXB0b3IoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW0qIGVudW1fdHlwZSkgeworICAgIGVudW1fdHlwZS0+Q2xlYXIoKTsKKyAgICBlbnVtX3R5cGUtPnNldF9uYW1lKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpKTsKKyAgICBlbnVtX3R5cGUtPm11dGFibGVfc291cmNlX2NvbnRleHQoKS0+c2V0X2ZpbGVfbmFtZSgKKyAgICAgICAgZGVzY3JpcHRvci0+ZmlsZSgpLT5uYW1lKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+dmFsdWVfY291bnQoKTsgKytpKSB7CisgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZV9kZXNjcmlwdG9yID0gZGVzY3JpcHRvci0+dmFsdWUoaSk7CisgICAgICBFbnVtVmFsdWUqIHZhbHVlID0gZW51bV90eXBlLT5tdXRhYmxlX2VudW12YWx1ZSgpLT5BZGQoKTsKKyAgICAgIHZhbHVlLT5zZXRfbmFtZSh2YWx1ZV9kZXNjcmlwdG9yLT5uYW1lKCkpOworICAgICAgdmFsdWUtPnNldF9udW1iZXIodmFsdWVfZGVzY3JpcHRvci0+bnVtYmVyKCkpOworCisgICAgICBDb252ZXJ0RW51bVZhbHVlT3B0aW9ucyh2YWx1ZV9kZXNjcmlwdG9yLT5vcHRpb25zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+bXV0YWJsZV9vcHRpb25zKCkpOworICAgIH0KKworICAgIENvbnZlcnRFbnVtT3B0aW9ucyhkZXNjcmlwdG9yLT5vcHRpb25zKCksIGVudW1fdHlwZS0+bXV0YWJsZV9vcHRpb25zKCkpOworICB9CisKKyAgc3RkOjpzdHJpbmcgR2V0VHlwZVVybChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgICAgcmV0dXJuIHVybF9wcmVmaXhfICsgIi8iICsgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCk7CisgIH0KKworICBzdGQ6OnN0cmluZyBHZXRUeXBlVXJsKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgICAgcmV0dXJuIHVybF9wcmVmaXhfICsgIi8iICsgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCk7CisgIH0KKworICB1dGlsOjpTdGF0dXMgUGFyc2VUeXBlVXJsKGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlX3VybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogdHlwZV9uYW1lKSB7CisgICAgaWYgKHR5cGVfdXJsLnN1YnN0cigwLCB1cmxfcHJlZml4Xy5zaXplKCkgKyAxKSAhPSB1cmxfcHJlZml4XyArICIvIikgeworICAgICAgcmV0dXJuIHV0aWw6OkludmFsaWRBcmd1bWVudEVycm9yKAorICAgICAgICAgIFN0ckNhdCgiSW52YWxpZCB0eXBlIFVSTCwgdHlwZSBVUkxzIG11c3QgYmUgb2YgdGhlIGZvcm0gJyIsCisgICAgICAgICAgICAgICAgICAgICAgIHVybF9wcmVmaXhfLCAiLzx0eXBlbmFtZT4nLCBnb3Q6ICIsIHR5cGVfdXJsKSk7CisgICAgfQorICAgICp0eXBlX25hbWUgPSB0eXBlX3VybC5zdWJzdHIodXJsX3ByZWZpeF8uc2l6ZSgpICsgMSk7CisgICAgcmV0dXJuIHV0aWw6OlN0YXR1cygpOworICB9CisKKyAgc3RkOjpzdHJpbmcgRGVmYXVsdFZhbHVlQXNTdHJpbmcoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgICAgc3dpdGNoIChkZXNjcmlwdG9yLT5jcHBfdHlwZSgpKSB7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgICAgcmV0dXJuIFN0ckNhdChkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX2ludDMyKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgICAgICByZXR1cm4gU3RyQ2F0KGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfaW50NjQoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgICByZXR1cm4gU3RyQ2F0KGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfdWludDMyKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgICAgcmV0dXJuIFN0ckNhdChkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDoKKyAgICAgICAgcmV0dXJuIFNpbXBsZUZ0b2EoZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV9mbG9hdCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiBTaW1wbGVEdG9hKGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfZG91YmxlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICAgIHJldHVybiBkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX2Jvb2woKSA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICBpZiAoZGVzY3JpcHRvci0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUykgeworICAgICAgICAgIHJldHVybiBDRXNjYXBlKGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5uYW1lKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHQgdmFsdWVzISI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gIiI7CisgIH0KKworICBzdGQ6OnN0cmluZyB1cmxfcHJlZml4XzsKKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2xfOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1R5cGVSZXNvbHZlciogTmV3VHlwZVJlc29sdmVyRm9yRGVzY3JpcHRvclBvb2woY29uc3Qgc3RkOjpzdHJpbmcmIHVybF9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKSB7CisgIHJldHVybiBuZXcgRGVzY3JpcHRvclBvb2xUeXBlUmVzb2x2ZXIodXJsX3ByZWZpeCwgcG9vbCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjZhNGI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbC5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBEZWZpbmVzIHV0aWxpdGllcyBmb3IgdGhlIFR5cGVSZXNvbHZlci4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVVRJTF9UWVBFX1JFU09MVkVSX1VUSUxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VVElMX1RZUEVfUkVTT0xWRVJfVVRJTF9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworY2xhc3MgRGVzY3JpcHRvclBvb2w7CituYW1lc3BhY2UgdXRpbCB7CitjbGFzcyBUeXBlUmVzb2x2ZXI7CisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCisvLyBDcmVhdGVzIGEgVHlwZVJlc29sdmVyIHRoYXQgc2VydmVzIHR5cGUgaW5mb3JtYXRpb24gaW4gdGhlIGdpdmVuIGRlc2NyaXB0b3IKKy8vIHBvb2wuIENhbGxlciB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHJldHVybmVkIFR5cGVSZXNvbHZlci4KK1BST1RPQlVGX0VYUE9SVCBUeXBlUmVzb2x2ZXIqIE5ld1R5cGVSZXNvbHZlckZvckRlc2NyaXB0b3JQb29sKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmxfcHJlZml4LCBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCk7CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRJTF9UWVBFX1JFU09MVkVSX1VUSUxfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4MGEzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWxfdGVzdC5jYwpAQCAtMCwwICsxLDQzOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuaD4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIHsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OkJvb2xWYWx1ZTsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OkVudW07Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWU7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjpGaWVsZDsKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OkludDMyVmFsdWU7Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjpPcHRpb247Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjpUeXBlOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6VUludDY0VmFsdWU7CisKK3N0YXRpYyBjb25zdCBjaGFyIGtVcmxQcmVmaXhbXSA9ICJ0eXBlLmdvb2dsZWFwaXMuY29tIjsKKworY2xhc3MgRGVzY3JpcHRvclBvb2xUeXBlUmVzb2x2ZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgRGVzY3JpcHRvclBvb2xUeXBlUmVzb2x2ZXJUZXN0KCkgeworICAgIHJlc29sdmVyXy5yZXNldChOZXdUeXBlUmVzb2x2ZXJGb3JEZXNjcmlwdG9yUG9vbCgKKyAgICAgICAga1VybFByZWZpeCwgRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkpKTsKKyAgfQorCisgIGNvbnN0IEZpZWxkKiBGaW5kRmllbGQoY29uc3QgVHlwZSYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUuZmllbGRzX3NpemUoKTsgKytpKSB7CisgICAgICBjb25zdCBGaWVsZCYgZmllbGQgPSB0eXBlLmZpZWxkcyhpKTsKKyAgICAgIGlmIChmaWVsZC5uYW1lKCkgPT0gbmFtZSkgeworICAgICAgICByZXR1cm4gJmZpZWxkOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGJvb2wgSGFzRmllbGQoY29uc3QgVHlwZSYgdHlwZSwgRmllbGQ6OkNhcmRpbmFsaXR5IGNhcmRpbmFsaXR5LAorICAgICAgICAgICAgICAgIEZpZWxkOjpLaW5kIGtpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQgbnVtYmVyKSB7CisgICAgY29uc3QgRmllbGQqIGZpZWxkID0gRmluZEZpZWxkKHR5cGUsIG5hbWUpOworICAgIGlmIChmaWVsZCA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBmaWVsZC0+Y2FyZGluYWxpdHkoKSA9PSBjYXJkaW5hbGl0eSAmJiBmaWVsZC0+a2luZCgpID09IGtpbmQgJiYKKyAgICAgICAgICAgZmllbGQtPm51bWJlcigpID09IG51bWJlcjsKKyAgfQorCisgIGJvb2wgQ2hlY2tGaWVsZFR5cGVVcmwoY29uc3QgVHlwZSYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfdXJsKSB7CisgICAgY29uc3QgRmllbGQqIGZpZWxkID0gRmluZEZpZWxkKHR5cGUsIG5hbWUpOworICAgIGlmIChmaWVsZCA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBmaWVsZC0+dHlwZV91cmwoKSA9PSB0eXBlX3VybDsKKyAgfQorCisgIGJvb2wgRmllbGRJbk9uZW9mKGNvbnN0IFR5cGUmIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb25lb2ZfbmFtZSkgeworICAgIGNvbnN0IEZpZWxkKiBmaWVsZCA9IEZpbmRGaWVsZCh0eXBlLCBuYW1lKTsKKyAgICBpZiAoZmllbGQgPT0gbnVsbHB0ciB8fCBmaWVsZC0+b25lb2ZfaW5kZXgoKSA8PSAwIHx8CisgICAgICAgIGZpZWxkLT5vbmVvZl9pbmRleCgpID4gdHlwZS5vbmVvZnNfc2l6ZSgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0eXBlLm9uZW9mcyhmaWVsZC0+b25lb2ZfaW5kZXgoKSAtIDEpID09IG9uZW9mX25hbWU7CisgIH0KKworICBib29sIElzUGFja2VkKGNvbnN0IFR5cGUmIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgY29uc3QgRmllbGQqIGZpZWxkID0gRmluZEZpZWxkKHR5cGUsIG5hbWUpOworICAgIGlmIChmaWVsZCA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBmaWVsZC0+cGFja2VkKCk7CisgIH0KKworICBjb25zdCBFbnVtVmFsdWUqIEZpbmRFbnVtVmFsdWUoY29uc3QgRW51bSYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICBmb3IgKGNvbnN0IEVudW1WYWx1ZSYgdmFsdWUgOiB0eXBlLmVudW12YWx1ZSgpKSB7CisgICAgICBpZiAodmFsdWUubmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgcmV0dXJuICZ2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBib29sIEVudW1IYXNWYWx1ZShjb25zdCBFbnVtJiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50IG51bWJlcikgeworICAgIGNvbnN0IEVudW1WYWx1ZSogdmFsdWUgPSBGaW5kRW51bVZhbHVlKHR5cGUsIG5hbWUpOworICAgIHJldHVybiB2YWx1ZSAhPSBudWxscHRyICYmIHZhbHVlLT5udW1iZXIoKSA9PSBudW1iZXI7CisgIH0KKworICBib29sIEhhc0Jvb2xPcHRpb24oY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxPcHRpb24+JiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGJvb2wgdmFsdWUpIHsKKyAgICByZXR1cm4gSGFzT3B0aW9uPEJvb2xWYWx1ZT4ob3B0aW9ucywgbmFtZSwgdmFsdWUpOworICB9CisKKyAgYm9vbCBIYXNJbnQzMk9wdGlvbihjb25zdCBSZXBlYXRlZFB0ckZpZWxkPE9wdGlvbj4mIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludDMyX3QgdmFsdWUpIHsKKyAgICByZXR1cm4gSGFzT3B0aW9uPEludDMyVmFsdWU+KG9wdGlvbnMsIG5hbWUsIHZhbHVlKTsKKyAgfQorCisgIGJvb2wgSGFzVUludDY0T3B0aW9uKGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8T3B0aW9uPiYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHVpbnQ2NF90IHZhbHVlKSB7CisgICAgcmV0dXJuIEhhc09wdGlvbjxVSW50NjRWYWx1ZT4ob3B0aW9ucywgbmFtZSwgdmFsdWUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFdyYXBwZXJULCB0eXBlbmFtZSBUPgorICBib29sIEhhc09wdGlvbihjb25zdCBSZXBlYXRlZFB0ckZpZWxkPE9wdGlvbj4mIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBUIHZhbHVlKSB7CisgICAgZm9yIChjb25zdCBPcHRpb24mIG9wdGlvbiA6IG9wdGlvbnMpIHsKKyAgICAgIGlmIChvcHRpb24ubmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgV3JhcHBlclQgd3JhcHBlcjsKKyAgICAgICAgaWYgKG9wdGlvbi52YWx1ZSgpLlVucGFja1RvKCZ3cmFwcGVyKSAmJiB3cmFwcGVyLnZhbHVlKCkgPT0gdmFsdWUpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGQ6OnN0cmluZyBHZXRUeXBlVXJsKHN0ZDo6c3RyaW5nIGZ1bGxfbmFtZSkgeworICAgIHJldHVybiBrVXJsUHJlZml4ICsgc3RkOjpzdHJpbmcoIi8iKSArIGZ1bGxfbmFtZTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGQ6OnN0cmluZyBHZXRUeXBlVXJsKCkgeworICAgIHJldHVybiBHZXRUeXBlVXJsKFQ6OmRlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxUeXBlUmVzb2x2ZXI+IHJlc29sdmVyXzsKK307CisKK1RFU1RfRihEZXNjcmlwdG9yUG9vbFR5cGVSZXNvbHZlclRlc3QsIFRlc3RBbGxUeXBlcykgeworICBUeXBlIHR5cGU7CisgIEFTU0VSVF9UUlVFKHJlc29sdmVyXworICAgICAgICAgICAgICAgICAgLT5SZXNvbHZlTWVzc2FnZVR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgR2V0VHlwZVVybDxwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzPigpLCAmdHlwZSkKKyAgICAgICAgICAgICAgICAgIC5vaygpKTsKKyAgLy8gQ2hlY2sgYWxsIG9wdGlvbmFsIGZpZWxkcy4KKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX09QVElPTkFMLCBGaWVsZDo6VFlQRV9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsX2ludDMyIiwgMSkpOworICBFWFBFQ1RfVFJVRShIYXNGaWVsZCh0eXBlLCBGaWVsZDo6Q0FSRElOQUxJVFlfT1BUSU9OQUwsIEZpZWxkOjpUWVBFX0lOVDY0LAorICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxfaW50NjQiLCAyKSk7CisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9PUFRJT05BTCwgRmllbGQ6OlRZUEVfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxfdWludDMyIiwgMykpOworICBFWFBFQ1RfVFJVRShIYXNGaWVsZCh0eXBlLCBGaWVsZDo6Q0FSRElOQUxJVFlfT1BUSU9OQUwsIEZpZWxkOjpUWVBFX1VJTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsX3VpbnQ2NCIsIDQpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX09QVElPTkFMLCBGaWVsZDo6VFlQRV9TSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25hbF9zaW50MzIiLCA1KSk7CisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9PUFRJT05BTCwgRmllbGQ6OlRZUEVfU0lOVDY0LAorICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxfc2ludDY0IiwgNikpOworICBFWFBFQ1RfVFJVRShIYXNGaWVsZCh0eXBlLCBGaWVsZDo6Q0FSRElOQUxJVFlfT1BUSU9OQUwsIEZpZWxkOjpUWVBFX0ZJWEVEMzIsCisgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25hbF9maXhlZDMyIiwgNykpOworICBFWFBFQ1RfVFJVRShIYXNGaWVsZCh0eXBlLCBGaWVsZDo6Q0FSRElOQUxJVFlfT1BUSU9OQUwsIEZpZWxkOjpUWVBFX0ZJWEVENjQsCisgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25hbF9maXhlZDY0IiwgOCkpOworICBFWFBFQ1RfVFJVRShIYXNGaWVsZCh0eXBlLCBGaWVsZDo6Q0FSRElOQUxJVFlfT1BUSU9OQUwsIEZpZWxkOjpUWVBFX1NGSVhFRDMyLAorICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxfc2ZpeGVkMzIiLCA5KSk7CisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9PUFRJT05BTCwgRmllbGQ6OlRZUEVfU0ZJWEVENjQsCisgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25hbF9zZml4ZWQ2NCIsIDEwKSk7CisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9PUFRJT05BTCwgRmllbGQ6OlRZUEVfRkxPQVQsCisgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25hbF9mbG9hdCIsIDExKSk7CisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9PUFRJT05BTCwgRmllbGQ6OlRZUEVfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxfZG91YmxlIiwgMTIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX09QVElPTkFMLCBGaWVsZDo6VFlQRV9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxfYm9vbCIsIDEzKSk7CisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9PUFRJT05BTCwgRmllbGQ6OlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxfc3RyaW5nIiwgMTQpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX09QVElPTkFMLCBGaWVsZDo6VFlQRV9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsX2J5dGVzIiwgMTUpKTsKKworICBFWFBFQ1RfVFJVRShIYXNGaWVsZCh0eXBlLCBGaWVsZDo6Q0FSRElOQUxJVFlfT1BUSU9OQUwsIEZpZWxkOjpUWVBFX0dST1VQLAorICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxncm91cCIsIDE2KSk7CisKKyAgRVhQRUNUX1RSVUUoQ2hlY2tGaWVsZFR5cGVVcmwoCisgICAgICB0eXBlLCAib3B0aW9uYWxncm91cCIsCisgICAgICBHZXRUeXBlVXJsPHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok9wdGlvbmFsR3JvdXA+KCkpKTsKKworICBFWFBFQ1RfVFJVRShIYXNGaWVsZCh0eXBlLCBGaWVsZDo6Q0FSRElOQUxJVFlfT1BUSU9OQUwsIEZpZWxkOjpUWVBFX01FU1NBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIsIDE4KSk7CisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9PUFRJT05BTCwgRmllbGQ6OlRZUEVfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIsIDE5KSk7CisKKyAgRVhQRUNUX1RSVUUoQ2hlY2tGaWVsZFR5cGVVcmwoCisgICAgICB0eXBlLCAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiLAorICAgICAgR2V0VHlwZVVybDxwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlPigpKSk7CisgIEVYUEVDVF9UUlVFKENoZWNrRmllbGRUeXBlVXJsKHR5cGUsICJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRUeXBlVXJsPHByb3RvYnVmX3VuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZT4oKSkpOworCisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9PUFRJT05BTCwgRmllbGQ6OlRZUEVfRU5VTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsX25lc3RlZF9lbnVtIiwgMjEpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX09QVElPTkFMLCBGaWVsZDo6VFlQRV9FTlVNLAorICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWxfZm9yZWlnbl9lbnVtIiwgMjIpKTsKKworICBFWFBFQ1RfVFJVRSgKKyAgICAgIENoZWNrRmllbGRUeXBlVXJsKHR5cGUsICJvcHRpb25hbF9uZXN0ZWRfZW51bSIsCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRUeXBlVXJsKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bSIpKSk7CisgIEVYUEVDVF9UUlVFKENoZWNrRmllbGRUeXBlVXJsKHR5cGUsICJvcHRpb25hbF9mb3JlaWduX2VudW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRUeXBlVXJsKCJwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bSIpKSk7CisKKyAgLy8gQ2hlY2sgYWxsIHJlcGVhdGVkIGZpZWxkcy4KKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX1JFUEVBVEVELCBGaWVsZDo6VFlQRV9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2ludDMyIiwgMzEpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX1JFUEVBVEVELCBGaWVsZDo6VFlQRV9JTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2ludDY0IiwgMzIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX1JFUEVBVEVELCBGaWVsZDo6VFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF91aW50MzIiLCAzMykpOworICBFWFBFQ1RfVFJVRShIYXNGaWVsZCh0eXBlLCBGaWVsZDo6Q0FSRElOQUxJVFlfUkVQRUFURUQsIEZpZWxkOjpUWVBFX1VJTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX3VpbnQ2NCIsIDM0KSk7CisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9SRVBFQVRFRCwgRmllbGQ6OlRZUEVfU0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfc2ludDMyIiwgMzUpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX1JFUEVBVEVELCBGaWVsZDo6VFlQRV9TSU5UNjQsCisgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9zaW50NjQiLCAzNikpOworICBFWFBFQ1RfVFJVRShIYXNGaWVsZCh0eXBlLCBGaWVsZDo6Q0FSRElOQUxJVFlfUkVQRUFURUQsIEZpZWxkOjpUWVBFX0ZJWEVEMzIsCisgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9maXhlZDMyIiwgMzcpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX1JFUEVBVEVELCBGaWVsZDo6VFlQRV9GSVhFRDY0LAorICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZml4ZWQ2NCIsIDM4KSk7CisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9SRVBFQVRFRCwgRmllbGQ6OlRZUEVfU0ZJWEVEMzIsCisgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9zZml4ZWQzMiIsIDM5KSk7CisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9SRVBFQVRFRCwgRmllbGQ6OlRZUEVfU0ZJWEVENjQsCisgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9zZml4ZWQ2NCIsIDQwKSk7CisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9SRVBFQVRFRCwgRmllbGQ6OlRZUEVfRkxPQVQsCisgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdCIsIDQxKSk7CisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9SRVBFQVRFRCwgRmllbGQ6OlRZUEVfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlIiwgNDIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX1JFUEVBVEVELCBGaWVsZDo6VFlQRV9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfYm9vbCIsIDQzKSk7CisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9SRVBFQVRFRCwgRmllbGQ6OlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfc3RyaW5nIiwgNDQpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX1JFUEVBVEVELCBGaWVsZDo6VFlQRV9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2J5dGVzIiwgNDUpKTsKKworICBFWFBFQ1RfVFJVRShIYXNGaWVsZCh0eXBlLCBGaWVsZDo6Q0FSRElOQUxJVFlfUkVQRUFURUQsIEZpZWxkOjpUWVBFX0dST1VQLAorICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRncm91cCIsIDQ2KSk7CisKKyAgRVhQRUNUX1RSVUUoQ2hlY2tGaWVsZFR5cGVVcmwoCisgICAgICB0eXBlLCAicmVwZWF0ZWRncm91cCIsCisgICAgICBHZXRUeXBlVXJsPHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OlJlcGVhdGVkR3JvdXA+KCkpKTsKKworICBFWFBFQ1RfVFJVRShIYXNGaWVsZCh0eXBlLCBGaWVsZDo6Q0FSRElOQUxJVFlfUkVQRUFURUQsIEZpZWxkOjpUWVBFX01FU1NBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIsIDQ4KSk7CisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9SRVBFQVRFRCwgRmllbGQ6OlRZUEVfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIsIDQ5KSk7CisKKyAgRVhQRUNUX1RSVUUoQ2hlY2tGaWVsZFR5cGVVcmwoCisgICAgICB0eXBlLCAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiLAorICAgICAgR2V0VHlwZVVybDxwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlPigpKSk7CisgIEVYUEVDVF9UUlVFKENoZWNrRmllbGRUeXBlVXJsKHR5cGUsICJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRUeXBlVXJsPHByb3RvYnVmX3VuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZT4oKSkpOworCisgIEVYUEVDVF9UUlVFKEhhc0ZpZWxkKHR5cGUsIEZpZWxkOjpDQVJESU5BTElUWV9SRVBFQVRFRCwgRmllbGQ6OlRZUEVfRU5VTSwKKyAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX25lc3RlZF9lbnVtIiwgNTEpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX1JFUEVBVEVELCBGaWVsZDo6VFlQRV9FTlVNLAorICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiwgNTIpKTsKKworICBFWFBFQ1RfVFJVRSgKKyAgICAgIENoZWNrRmllbGRUeXBlVXJsKHR5cGUsICJyZXBlYXRlZF9uZXN0ZWRfZW51bSIsCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRUeXBlVXJsKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bSIpKSk7CisgIEVYUEVDVF9UUlVFKENoZWNrRmllbGRUeXBlVXJsKHR5cGUsICJyZXBlYXRlZF9mb3JlaWduX2VudW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRUeXBlVXJsKCJwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bSIpKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yUG9vbFR5cGVSZXNvbHZlclRlc3QsIFRlc3RQYWNrZWRGaWVsZCkgeworICBUeXBlIHR5cGU7CisgIEFTU0VSVF9UUlVFKHJlc29sdmVyXworICAgICAgICAgICAgICAgICAgLT5SZXNvbHZlTWVzc2FnZVR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgR2V0VHlwZVVybDxwcm90b2J1Zl91bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzPigpLCAmdHlwZSkKKyAgICAgICAgICAgICAgICAgIC5vaygpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX1JFUEVBVEVELCBGaWVsZDo6VFlQRV9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgInBhY2tlZF9pbnQzMiIsIDkwKSk7CisgIEVYUEVDVF9UUlVFKElzUGFja2VkKHR5cGUsICJwYWNrZWRfaW50MzIiKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yUG9vbFR5cGVSZXNvbHZlclRlc3QsIFRlc3RPbmVvZikgeworICBUeXBlIHR5cGU7CisgIEFTU0VSVF9UUlVFKHJlc29sdmVyXworICAgICAgICAgICAgICAgICAgLT5SZXNvbHZlTWVzc2FnZVR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgR2V0VHlwZVVybDxwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzPigpLCAmdHlwZSkKKyAgICAgICAgICAgICAgICAgIC5vaygpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX09QVElPTkFMLCBGaWVsZDo6VFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICJvbmVvZl91aW50MzIiLCAxMTEpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX09QVElPTkFMLCBGaWVsZDo6VFlQRV9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAib25lb2ZfbmVzdGVkX21lc3NhZ2UiLCAxMTIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX09QVElPTkFMLCBGaWVsZDo6VFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJvbmVvZl9zdHJpbmciLCAxMTMpKTsKKyAgRVhQRUNUX1RSVUUoSGFzRmllbGQodHlwZSwgRmllbGQ6OkNBUkRJTkFMSVRZX09QVElPTkFMLCBGaWVsZDo6VFlQRV9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgIm9uZW9mX2J5dGVzIiwgMTE0KSk7CisgIEVYUEVDVF9UUlVFKEZpZWxkSW5PbmVvZih0eXBlLCAib25lb2ZfdWludDMyIiwgIm9uZW9mX2ZpZWxkIikpOworICBFWFBFQ1RfVFJVRShGaWVsZEluT25lb2YodHlwZSwgIm9uZW9mX25lc3RlZF9tZXNzYWdlIiwgIm9uZW9mX2ZpZWxkIikpOworICBFWFBFQ1RfVFJVRShGaWVsZEluT25lb2YodHlwZSwgIm9uZW9mX3N0cmluZyIsICJvbmVvZl9maWVsZCIpKTsKKyAgRVhQRUNUX1RSVUUoRmllbGRJbk9uZW9mKHR5cGUsICJvbmVvZl9ieXRlcyIsICJvbmVvZl9maWVsZCIpKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JQb29sVHlwZVJlc29sdmVyVGVzdCwgVGVzdE1hcCkgeworICBUeXBlIHR5cGU7CisgIEFTU0VSVF9UUlVFKAorICAgICAgcmVzb2x2ZXJfCisgICAgICAgICAgLT5SZXNvbHZlTWVzc2FnZVR5cGUoR2V0VHlwZVVybDxwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcD4oKSwgJnR5cGUpCisgICAgICAgICAgLm9rKCkpOworICBFWFBFQ1RfVFJVRShIYXNGaWVsZCh0eXBlLCBGaWVsZDo6Q0FSRElOQUxJVFlfUkVQRUFURUQsIEZpZWxkOjpUWVBFX01FU1NBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICJtYXBfaW50MzJfaW50MzIiLCAxKSk7CisgIEVYUEVDVF9UUlVFKENoZWNrRmllbGRUeXBlVXJsKAorICAgICAgdHlwZSwgIm1hcF9pbnQzMl9pbnQzMiIsCisgICAgICBHZXRUeXBlVXJsKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwLk1hcEludDMySW50MzJFbnRyeSIpKSk7CisKKyAgQVNTRVJUX1RSVUUoCisgICAgICByZXNvbHZlcl8KKyAgICAgICAgICAtPlJlc29sdmVNZXNzYWdlVHlwZSgKKyAgICAgICAgICAgICAgR2V0VHlwZVVybCgicHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5NYXBJbnQzMkludDMyRW50cnkiKSwgJnR5cGUpCisgICAgICAgICAgLm9rKCkpOworICBFWFBFQ1RfVFJVRShIYXNCb29sT3B0aW9uKHR5cGUub3B0aW9ucygpLCAibWFwX2VudHJ5IiwgdHJ1ZSkpOworfQorCitURVNUX0YoRGVzY3JpcHRvclBvb2xUeXBlUmVzb2x2ZXJUZXN0LCBUZXN0Q3VzdG9tTWVzc2FnZU9wdGlvbnMpIHsKKyAgVHlwZSB0eXBlOworICBBU1NFUlRfVFJVRSgKKyAgICAgIHJlc29sdmVyXworICAgICAgICAgIC0+UmVzb2x2ZU1lc3NhZ2VUeXBlKAorICAgICAgICAgICAgICBHZXRUeXBlVXJsPHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zPigpLAorICAgICAgICAgICAgICAmdHlwZSkKKyAgICAgICAgICAub2soKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgSGFzSW50MzJPcHRpb24odHlwZS5vcHRpb25zKCksICJwcm90b2J1Zl91bml0dGVzdC5tZXNzYWdlX29wdDEiLCAtNTYpKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JQb29sVHlwZVJlc29sdmVyVGVzdCwgVGVzdEN1c3RvbUZpZWxkT3B0aW9ucykgeworICBUeXBlIHR5cGU7CisgIEFTU0VSVF9UUlVFKAorICAgICAgcmVzb2x2ZXJfCisgICAgICAgICAgLT5SZXNvbHZlTWVzc2FnZVR5cGUoCisgICAgICAgICAgICAgIEdldFR5cGVVcmw8cHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnM+KCksCisgICAgICAgICAgICAgICZ0eXBlKQorICAgICAgICAgIC5vaygpKTsKKyAgY29uc3QgRmllbGQqIGZpZWxkID0gRmluZEZpZWxkKHR5cGUsICJmaWVsZDEiKTsKKyAgQVNTRVJUX1RSVUUoZmllbGQgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9UUlVFKEhhc1VJbnQ2NE9wdGlvbihmaWVsZC0+b3B0aW9ucygpLCAicHJvdG9idWZfdW5pdHRlc3QuZmllbGRfb3B0MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzY1NDMyMTA5KSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yUG9vbFR5cGVSZXNvbHZlclRlc3QsIFRlc3RFbnVtKSB7CisgIEVudW0gdHlwZTsKKyAgQVNTRVJUX1RSVUUoCisgICAgICByZXNvbHZlcl8KKyAgICAgICAgICAtPlJlc29sdmVFbnVtVHlwZSgKKyAgICAgICAgICAgICAgR2V0VHlwZVVybCgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0iKSwgJnR5cGUpCisgICAgICAgICAgLm9rKCkpOworICBFbnVtSGFzVmFsdWUodHlwZSwgIkZPTyIsIDEpOworICBFbnVtSGFzVmFsdWUodHlwZSwgIkJBUiIsIDIpOworICBFbnVtSGFzVmFsdWUodHlwZSwgIkJBWiIsIDMpOworICBFbnVtSGFzVmFsdWUodHlwZSwgIk5FRyIsIC0xKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JQb29sVHlwZVJlc29sdmVyVGVzdCwgVGVzdEN1c3RvbUVudW1PcHRpb25zKSB7CisgIEVudW0gdHlwZTsKKyAgQVNTRVJUX1RSVUUoCisgICAgICByZXNvbHZlcl8KKyAgICAgICAgICAtPlJlc29sdmVFbnVtVHlwZSgKKyAgICAgICAgICAgICAgR2V0VHlwZVVybCgicHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucy5BbkVudW0iKSwKKyAgICAgICAgICAgICAgJnR5cGUpCisgICAgICAgICAgLm9rKCkpOworICBBU1NFUlRfVFJVRSgKKyAgICAgIEhhc0ludDMyT3B0aW9uKHR5cGUub3B0aW9ucygpLCAicHJvdG9idWZfdW5pdHRlc3QuZW51bV9vcHQxIiwgLTc4OSkpOworfQorCitURVNUX0YoRGVzY3JpcHRvclBvb2xUeXBlUmVzb2x2ZXJUZXN0LCBUZXN0Q3VzdG9tVmFsdWVPcHRpb25zKSB7CisgIEVudW0gdHlwZTsKKyAgQVNTRVJUX1RSVUUoCisgICAgICByZXNvbHZlcl8KKyAgICAgICAgICAtPlJlc29sdmVFbnVtVHlwZSgKKyAgICAgICAgICAgICAgR2V0VHlwZVVybCgicHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucy5BbkVudW0iKSwKKyAgICAgICAgICAgICAgJnR5cGUpCisgICAgICAgICAgLm9rKCkpOworICBjb25zdCBFbnVtVmFsdWUqIHZhbHVlID0gRmluZEVudW1WYWx1ZSh0eXBlLCAiQU5FTlVNX1ZBTDIiKTsKKyAgQVNTRVJUX1RSVUUodmFsdWUgIT0gbnVsbHB0cik7CisgIEFTU0VSVF9UUlVFKAorICAgICAgSGFzSW50MzJPcHRpb24odmFsdWUtPm9wdGlvbnMoKSwgInByb3RvYnVmX3VuaXR0ZXN0LmVudW1fdmFsdWVfb3B0MSIsIDEyMykpOworfQorCitURVNUX0YoRGVzY3JpcHRvclBvb2xUeXBlUmVzb2x2ZXJUZXN0LCBUZXN0SnNvbk5hbWUpIHsKKyAgVHlwZSB0eXBlOworICBBU1NFUlRfVFJVRShyZXNvbHZlcl8KKyAgICAgICAgICAgICAgICAgIC0+UmVzb2x2ZU1lc3NhZ2VUeXBlKAorICAgICAgICAgICAgICAgICAgICAgIEdldFR5cGVVcmw8cHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcz4oKSwgJnR5cGUpCisgICAgICAgICAgICAgICAgICAub2soKSk7CisgIEVYUEVDVF9FUSgib3B0aW9uYWxJbnQzMiIsIEZpbmRGaWVsZCh0eXBlLCAib3B0aW9uYWxfaW50MzIiKS0+anNvbl9uYW1lKCkpOworCisgIEFTU0VSVF9UUlVFKAorICAgICAgcmVzb2x2ZXJfCisgICAgICAgICAgLT5SZXNvbHZlTWVzc2FnZVR5cGUoR2V0VHlwZVVybDxwcm90bzM6OlRlc3RDdXN0b21Kc29uTmFtZT4oKSwgJnR5cGUpCisgICAgICAgICAgLm9rKCkpOworICBFWFBFQ1RfRVEoIkB2YWx1ZSIsIEZpbmRGaWVsZCh0eXBlLCAidmFsdWUiKS0+anNvbl9uYW1lKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWE5YWExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi93ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNjAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB7CisKKy8vIFRoaXMgdGVzdCBvbmx5IGNoZWNrcyB3aGV0aGVyIHdlbGwta25vd24gdHlwZXMgYXJlIGluY2x1ZGVkIGluIHByb3RvYnVmCisvLyBydW50aW1lIGxpYnJhcnkuIFRoZSB0ZXN0IHBhc3NlcyBpZiBpdCBjb21waWxlcy4KK1RFU1QoV2VsbEtub3duVHlwZXNUZXN0LCBBbGxLbm93blR5cGVzQXJlSW5jbHVkZWQpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RXZWxsS25vd25UeXBlcyBtZXNzYWdlOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5hbnlfZmllbGQoKS5CeXRlU2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuYXBpX2ZpZWxkKCkuQnl0ZVNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLmR1cmF0aW9uX2ZpZWxkKCkuQnl0ZVNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLmVtcHR5X2ZpZWxkKCkuQnl0ZVNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLmZpZWxkX21hc2tfZmllbGQoKS5CeXRlU2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uuc291cmNlX2NvbnRleHRfZmllbGQoKS5CeXRlU2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uuc3RydWN0X2ZpZWxkKCkuQnl0ZVNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnRpbWVzdGFtcF9maWVsZCgpLkJ5dGVTaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS50eXBlX2ZpZWxkKCkuQnl0ZVNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLmludDMyX2ZpZWxkKCkuQnl0ZVNpemUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZTYzYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmNjCkBAIC0wLDAgKzEsMTc2OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisKKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BhcnNlX2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKworCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworY29uc3Qgc2l6ZV90IGtNYXBFbnRyeVRhZ0J5dGVTaXplID0gMjsKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gRm9yd2FyZCBkZWNsYXJlIHN0YXRpYyBmdW5jdGlvbnMKK3N0YXRpYyBzaXplX3QgTWFwVmFsdWVSZWZEYXRhT25seUJ5dGVTaXplKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXBWYWx1ZUNvbnN0UmVmJiB2YWx1ZSk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYm9vbCBVbmtub3duRmllbGRTZXRGaWVsZFNraXBwZXI6OlNraXBGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhZykgeworICByZXR1cm4gV2lyZUZvcm1hdDo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIHVua25vd25fZmllbGRzXyk7Cit9CisKK2Jvb2wgVW5rbm93bkZpZWxkU2V0RmllbGRTa2lwcGVyOjpTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgcmV0dXJuIFdpcmVGb3JtYXQ6OlNraXBNZXNzYWdlKGlucHV0LCB1bmtub3duX2ZpZWxkc18pOworfQorCit2b2lkIFVua25vd25GaWVsZFNldEZpZWxkU2tpcHBlcjo6U2tpcFVua25vd25FbnVtKGludCBmaWVsZF9udW1iZXIsIGludCB2YWx1ZSkgeworICB1bmtub3duX2ZpZWxkc18tPkFkZFZhcmludChmaWVsZF9udW1iZXIsIHZhbHVlKTsKK30KKworYm9vbCBXaXJlRm9ybWF0OjpTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzJfdCB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7CisgIGludCBudW1iZXIgPSBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKTsKKyAgLy8gRmllbGQgbnVtYmVyIDAgaXMgaWxsZWdhbC4KKyAgaWYgKG51bWJlciA9PSAwKSByZXR1cm4gZmFsc2U7CisKKyAgc3dpdGNoIChXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSkgeworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVDogeworICAgICAgdWludDY0X3QgdmFsdWU7CisgICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50NjQoJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHVua25vd25fZmllbGRzICE9IG51bGxwdHIpIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQobnVtYmVyLCB2YWx1ZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NDogeworICAgICAgdWludDY0X3QgdmFsdWU7CisgICAgICBpZiAoIWlucHV0LT5SZWFkTGl0dGxlRW5kaWFuNjQoJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHVua25vd25fZmllbGRzICE9IG51bGxwdHIpIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDY0KG51bWJlciwgdmFsdWUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6IHsKKyAgICAgIHVpbnQzMl90IGxlbmd0aDsKKyAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHVua25vd25fZmllbGRzID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKCFpbnB1dC0+U2tpcChsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWlucHV0LT5SZWFkU3RyaW5nKHVua25vd25fZmllbGRzLT5BZGRMZW5ndGhEZWxpbWl0ZWQobnVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVA6IHsKKyAgICAgIGlmICghaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghU2tpcE1lc3NhZ2UoaW5wdXQsICh1bmtub3duX2ZpZWxkcyA9PSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5rbm93bl9maWVsZHMtPkFkZEdyb3VwKG51bWJlcikpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlucHV0LT5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgZW5kaW5nIHRhZyBtYXRjaGVkIHRoZSBzdGFydGluZyB0YWcuCisgICAgICBpZiAoIWlucHV0LT5MYXN0VGFnV2FzKAorICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVA6IHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMjogeworICAgICAgdWludDMyX3QgdmFsdWU7CisgICAgICBpZiAoIWlucHV0LT5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHVua25vd25fZmllbGRzICE9IG51bGxwdHIpIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDMyKG51bWJlciwgdmFsdWUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30KKworYm9vbCBXaXJlRm9ybWF0OjpTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB1aW50MzJfdCB0YWcgPSBpbnB1dC0+UmVhZFRhZygpOworICAgIGlmICh0YWcgPT0gMCkgeworICAgICAgLy8gRW5kIG9mIGlucHV0LiAgVGhpcyBpcyBhIHZhbGlkIHBsYWNlIHRvIGVuZCwgc28gcmV0dXJuIHRydWUuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZyk7CisKKyAgICBpZiAod2lyZV90eXBlID09IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgIC8vIE11c3QgYmUgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZS4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICghU2tpcEZpZWxkKGlucHV0LCB0YWcsIHVua25vd25fZmllbGRzKSkgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgV2lyZUZvcm1hdDo6UmVhZFBhY2tlZEVudW1QcmVzZXJ2ZVVua25vd25zKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc192YWxpZCkoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPGludD4qIHZhbHVlcykgeworICB1aW50MzJfdCBsZW5ndGg7CisgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQgPSBpbnB1dC0+UHVzaExpbWl0KGxlbmd0aCk7CisgIHdoaWxlIChpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7CisgICAgaW50IHZhbHVlOworICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKKyAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChpc192YWxpZCA9PSBudWxscHRyIHx8IGlzX3ZhbGlkKHZhbHVlKSkgeworICAgICAgdmFsdWVzLT5BZGQodmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KGZpZWxkX251bWJlciwgdmFsdWUpOworICAgIH0KKyAgfQorICBpbnB1dC0+UG9wTGltaXQobGltaXQpOworICByZXR1cm4gdHJ1ZTsKK30KKwordWludDhfdCogV2lyZUZvcm1hdDo6SW50ZXJuYWxTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLCB1aW50OF90KiB0YXJnZXQsCisgICAgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKKworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICBzd2l0Y2ggKGZpZWxkLnR5cGUoKSkgeworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5UOgorICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjRUb0FycmF5KGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhcmludCgpLCB0YXJnZXQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVEMzI6CisgICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkMzJUb0FycmF5KGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5maXhlZDMyKCksIHRhcmdldCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQ2NDoKKyAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQ2NFRvQXJyYXkoZmllbGQubnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpeGVkNjQoKSwgdGFyZ2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOgorICAgICAgICB0YXJnZXQgPSBzdHJlYW0tPldyaXRlU3RyaW5nKGZpZWxkLm51bWJlcigpLCBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9HUk9VUDoKKyAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlVGFnVG9BcnJheSgKKyAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVAsIHRhcmdldCk7CisgICAgICAgIHRhcmdldCA9IEludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoZmllbGQuZ3JvdXAoKSwgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSk7CisgICAgICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlVGFnVG9BcnJheSgKKyAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQLCB0YXJnZXQpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKwordWludDhfdCogV2lyZUZvcm1hdDo6SW50ZXJuYWxTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zVG9BcnJheSgKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLCB1aW50OF90KiB0YXJnZXQsCisgICAgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKKworICAgIC8vIFRoZSBvbmx5IHVua25vd24gZmllbGRzIHRoYXQgYXJlIGFsbG93ZWQgdG8gZXhpc3QgaW4gYSBNZXNzYWdlU2V0IGFyZQorICAgIC8vIG1lc3NhZ2VzLCB3aGljaCBhcmUgbGVuZ3RoLWRlbGltaXRlZC4KKyAgICBpZiAoZmllbGQudHlwZSgpID09IFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgICAvLyBTdGFydCBncm91cC4KKyAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZywgdGFyZ2V0KTsKKworICAgICAgLy8gV3JpdGUgdHlwZSBJRC4KKyAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZywgdGFyZ2V0KTsKKyAgICAgIHRhcmdldCA9CisgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheShmaWVsZC5udW1iZXIoKSwgdGFyZ2V0KTsKKworICAgICAgLy8gV3JpdGUgbWVzc2FnZS4KKyAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VUYWcsIHRhcmdldCk7CisKKyAgICAgIHRhcmdldCA9IGZpZWxkLkludGVybmFsU2VyaWFsaXplTGVuZ3RoRGVsaW1pdGVkTm9UYWcodGFyZ2V0LCBzdHJlYW0pOworCisgICAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgICAvLyBFbmQgZ3JvdXAuCisgICAgICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnLCB0YXJnZXQpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcykgeworICBzaXplX3Qgc2l6ZSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZHMuZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgVW5rbm93bkZpZWxkJiBmaWVsZCA9IHVua25vd25fZmllbGRzLmZpZWxkKGkpOworCisgICAgc3dpdGNoIChmaWVsZC50eXBlKCkpIHsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVDoKKyAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKKyAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSk7CisgICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplNjQoZmllbGQudmFyaW50KCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVEMzI6CisgICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoCisgICAgICAgICAgICBmaWVsZC5udW1iZXIoKSwgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzIpKTsKKyAgICAgICAgc2l6ZSArPSBzaXplb2YoaW50MzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQ2NDoKKyAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKKyAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NCkpOworICAgICAgICBzaXplICs9IHNpemVvZihpbnQ2NF90KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOgorICAgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgICAgICAgZmllbGQubnVtYmVyKCksIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSk7CisgICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICAgICAgICBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCkuc2l6ZSgpKTsKKyAgICAgICAgc2l6ZSArPSBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCkuc2l6ZSgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOgorICAgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgICAgICAgZmllbGQubnVtYmVyKCksIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9TVEFSVF9HUk9VUCkpOworICAgICAgICBzaXplICs9IENvbXB1dGVVbmtub3duRmllbGRzU2l6ZShmaWVsZC5ncm91cCgpKTsKKyAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKKyAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBzaXplOworfQorCitzaXplX3QgV2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25NZXNzYWdlU2V0SXRlbXNTaXplKAorICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMpIHsKKyAgc2l6ZV90IHNpemUgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKKworICAgIC8vIFRoZSBvbmx5IHVua25vd24gZmllbGRzIHRoYXQgYXJlIGFsbG93ZWQgdG8gZXhpc3QgaW4gYSBNZXNzYWdlU2V0IGFyZQorICAgIC8vIG1lc3NhZ2VzLCB3aGljaCBhcmUgbGVuZ3RoLWRlbGltaXRlZC4KKyAgICBpZiAoZmllbGQudHlwZSgpID09IFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICBzaXplICs9IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1UYWdzU2l6ZTsKKyAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoZmllbGQubnVtYmVyKCkpOworCisgICAgICBpbnQgZmllbGRfc2l6ZSA9IGZpZWxkLkdldExlbmd0aERlbGltaXRlZFNpemUoKTsKKyAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoZmllbGRfc2l6ZSk7CisgICAgICBzaXplICs9IGZpZWxkX3NpemU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYm9vbCBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogbWVzc2FnZV9yZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgdWludDMyX3QgdGFnID0gaW5wdXQtPlJlYWRUYWcoKTsKKyAgICBpZiAodGFnID09IDApIHsKKyAgICAgIC8vIEVuZCBvZiBpbnB1dC4gIFRoaXMgaXMgYSB2YWxpZCBwbGFjZSB0byBlbmQsIHNvIHJldHVybiB0cnVlLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgIC8vIE11c3QgYmUgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZS4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBudWxscHRyOworCisgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbHB0cikgeworICAgICAgaW50IGZpZWxkX251bWJlciA9IFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpOworICAgICAgZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU51bWJlcihmaWVsZF9udW1iZXIpOworCisgICAgICAvLyBJZiB0aGF0IGZhaWxlZCwgY2hlY2sgaWYgdGhlIGZpZWxkIGlzIGFuIGV4dGVuc2lvbi4KKyAgICAgIGlmIChmaWVsZCA9PSBudWxscHRyICYmIGRlc2NyaXB0b3ItPklzRXh0ZW5zaW9uTnVtYmVyKGZpZWxkX251bWJlcikpIHsKKyAgICAgICAgaWYgKGlucHV0LT5HZXRFeHRlbnNpb25Qb29sKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgIGZpZWxkID0gbWVzc2FnZV9yZWZsZWN0aW9uLT5GaW5kS25vd25FeHRlbnNpb25CeU51bWJlcihmaWVsZF9udW1iZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZpZWxkID0gaW5wdXQtPkdldEV4dGVuc2lvblBvb2woKS0+RmluZEV4dGVuc2lvbkJ5TnVtYmVyKAorICAgICAgICAgICAgICBkZXNjcmlwdG9yLCBmaWVsZF9udW1iZXIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoYXQgZmFpbGVkLCBidXQgd2UncmUgYSBNZXNzYWdlU2V0LCBhbmQgdGhpcyBpcyB0aGUgdGFnIGZvciBhCisgICAgICAvLyBNZXNzYWdlU2V0IGl0ZW0sIHRoZW4gcGFyc2UgdGhhdC4KKyAgICAgIGlmIChmaWVsZCA9PSBudWxscHRyICYmIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpICYmCisgICAgICAgICAgdGFnID09IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZykgeworICAgICAgICBpZiAoIVBhcnNlQW5kTWVyZ2VNZXNzYWdlU2V0SXRlbShpbnB1dCwgbWVzc2FnZSkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7ICAvLyBTa2lwIFBhcnNlQW5kTWVyZ2VGaWVsZCgpOyBhbHJlYWR5IHRha2VuIGNhcmUgb2YuCisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFQYXJzZUFuZE1lcmdlRmllbGQodGFnLCBmaWVsZCwgbWVzc2FnZSwgaW5wdXQpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CisKK2Jvb2wgV2lyZUZvcm1hdDo6U2tpcE1lc3NhZ2VTZXRGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKKyAgdWludDMyX3QgbGVuZ3RoOworICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJmxlbmd0aCkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIGlucHV0LT5SZWFkU3RyaW5nKHVua25vd25fZmllbGRzLT5BZGRMZW5ndGhEZWxpbWl0ZWQoZmllbGRfbnVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Cit9CisKK2Jvb2wgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZU1lc3NhZ2VTZXRGaWVsZCh1aW50MzJfdCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIGlmIChmaWVsZCA9PSBudWxscHRyKSB7CisgICAgLy8gV2Ugc3RvcmUgdW5rbm93biBNZXNzYWdlU2V0IGV4dGVuc2lvbnMgYXMgZ3JvdXBzLgorICAgIHJldHVybiBTa2lwTWVzc2FnZVNldEZpZWxkKAorICAgICAgICBpbnB1dCwgZmllbGRfbnVtYmVyLCBtZXNzYWdlX3JlZmxlY3Rpb24tPk11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UpKTsKKyAgfSBlbHNlIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSB8fAorICAgICAgICAgICAgIGZpZWxkLT50eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UpIHsKKyAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gYXMgd2Ugb25seSBhbGxvdyBvcHRpb25hbCBtZXNzYWdlIGV4dGVuc2lvbnMgdG8KKyAgICAvLyBNZXNzYWdlU2V0LgorICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJFeHRlbnNpb25zIG9mIE1lc3NhZ2VTZXRzIG11c3QgYmUgb3B0aW9uYWwgbWVzc2FnZXMuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgTWVzc2FnZSogc3ViX21lc3NhZ2UgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKAorICAgICAgICBtZXNzYWdlLCBmaWVsZCwgaW5wdXQtPkdldEV4dGVuc2lvbkZhY3RvcnkoKSk7CisgICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZShpbnB1dCwgc3ViX21lc3NhZ2UpOworICB9Cit9CisKK3N0YXRpYyBib29sIFN0cmljdFV0ZjhDaGVjayhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHJldHVybiBmaWVsZC0+ZmlsZSgpLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMzsKK30KKworYm9vbCBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlRmllbGQoCisgICAgdWludDMyX3QgdGFnLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsICAvLyBNYXkgYmUgbnVsbHB0ciBmb3IgdW5rbm93bgorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgZW51bSB7IFVOS05PV04sIE5PUk1BTF9GT1JNQVQsIFBBQ0tFRF9GT1JNQVQgfSB2YWx1ZV9mb3JtYXQ7CisKKyAgaWYgKGZpZWxkID09IG51bGxwdHIpIHsKKyAgICB2YWx1ZV9mb3JtYXQgPSBVTktOT1dOOworICB9IGVsc2UgaWYgKFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICAgV2lyZVR5cGVGb3JGaWVsZFR5cGUoZmllbGQtPnR5cGUoKSkpIHsKKyAgICB2YWx1ZV9mb3JtYXQgPSBOT1JNQUxfRk9STUFUOworICB9IGVsc2UgaWYgKGZpZWxkLT5pc19wYWNrYWJsZSgpICYmCisgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICB2YWx1ZV9mb3JtYXQgPSBQQUNLRURfRk9STUFUOworICB9IGVsc2UgeworICAgIC8vIFdlIGRvbid0IHJlY29nbml6ZSB0aGlzIGZpZWxkLiBFaXRoZXIgdGhlIGZpZWxkIG51bWJlciBpcyB1bmtub3duCisgICAgLy8gb3IgdGhlIHdpcmUgdHlwZSBkb2Vzbid0IG1hdGNoLiBQdXQgaXQgaW4gb3VyIHVua25vd24gZmllbGQgc2V0LgorICAgIHZhbHVlX2Zvcm1hdCA9IFVOS05PV047CisgIH0KKworICBpZiAodmFsdWVfZm9ybWF0ID09IFVOS05PV04pIHsKKyAgICByZXR1cm4gU2tpcEZpZWxkKGlucHV0LCB0YWcsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPk11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UpKTsKKyAgfSBlbHNlIGlmICh2YWx1ZV9mb3JtYXQgPT0gUEFDS0VEX0ZPUk1BVCkgeworICAgIHVpbnQzMl90IGxlbmd0aDsKKyAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJmxlbmd0aCkpIHJldHVybiBmYWxzZTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQgPSBpbnB1dC0+UHVzaExpbWl0KGxlbmd0aCk7CisKKyAgICBzd2l0Y2ggKGZpZWxkLT50eXBlKCkpIHsKKyNkZWZpbmUgSEFORExFX1BBQ0tFRF9UWVBFKFRZUEUsIENQUFRZUEUsIENQUFRZUEVfTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFXyMjVFlQRTogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlIChpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENQUFRZUEUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPENQUFRZUEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1RZUEU+KGlucHV0LCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSBcCisgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5BZGQjI0NQUFRZUEVfTUVUSE9EKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7ICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShJTlQzMiwgaW50MzJfdCwgSW50MzIpCisgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoSU5UNjQsIGludDY0X3QsIEludDY0KQorICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKFNJTlQzMiwgaW50MzJfdCwgSW50MzIpCisgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoU0lOVDY0LCBpbnQ2NF90LCBJbnQ2NCkKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShVSU5UMzIsIHVpbnQzMl90LCBVSW50MzIpCisgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoVUlOVDY0LCB1aW50NjRfdCwgVUludDY0KQorCisgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoRklYRUQzMiwgdWludDMyX3QsIFVJbnQzMikKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShGSVhFRDY0LCB1aW50NjRfdCwgVUludDY0KQorICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKFNGSVhFRDMyLCBpbnQzMl90LCBJbnQzMikKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShTRklYRUQ2NCwgaW50NjRfdCwgSW50NjQpCisKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShGTE9BVCwgZmxvYXQsIEZsb2F0KQorICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKERPVUJMRSwgZG91YmxlLCBEb3VibGUpCisKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShCT09MLCBib29sLCBCb29sKQorI3VuZGVmIEhBTkRMRV9QQUNLRURfVFlQRQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOiB7CisgICAgICAgIHdoaWxlIChpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7CisgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKKyAgICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGlmIChtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZpbGUoKS0+c3ludGF4KCkgPT0KKyAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzMpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkRW51bVZhbHVlKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUgPQorICAgICAgICAgICAgICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOworICAgICAgICAgICAgaWYgKGVudW1fdmFsdWUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgZmllbGQsIGVudW1fdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLy8gVGhlIGVudW0gdmFsdWUgaXMgbm90IG9uZSBvZiB0aGUga25vd24gdmFsdWVzLiAgQWRkIGl0IHRvIHRoZQorICAgICAgICAgICAgICAvLyBVbmtub3duRmllbGRTZXQuCisgICAgICAgICAgICAgIGludDY0X3Qgc2lnbl9leHRlbmRlZF92YWx1ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KHZhbHVlKTsKKyAgICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhtZXNzYWdlKS0+QWRkVmFyaW50KAorICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZyksIHNpZ25fZXh0ZW5kZWRfdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzoKKyAgICAgICAgLy8gQ2FuJ3QgaGF2ZSBwYWNrZWQgZmllbGRzIG9mIHRoZXNlIHR5cGVzOiB0aGVzZSBzaG91bGQgYmUgY2F1Z2h0IGJ5CisgICAgICAgIC8vIHRoZSBwcm90b2NvbCBjb21waWxlci4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpbnB1dC0+UG9wTGltaXQobGltaXQpOworICB9IGVsc2UgeworICAgIC8vIE5vbi1wYWNrZWQgdmFsdWUgKHZhbHVlX2Zvcm1hdCA9PSBOT1JNQUxfRk9STUFUKQorICAgIHN3aXRjaCAoZmllbGQtPnR5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShUWVBFLCBDUFBUWVBFLCBDUFBUWVBFX01FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV8jI1RZUEU6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENQUFRZUEUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Q1BQVFlQRSwgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNUWVBFPiggXAorICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5BZGQjI0NQUFRZUEVfTUVUSE9EKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7ICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5TZXQjI0NQUFRZUEVfTUVUSE9EKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyAgICAgIEhBTkRMRV9UWVBFKElOVDMyLCBpbnQzMl90LCBJbnQzMikKKyAgICAgIEhBTkRMRV9UWVBFKElOVDY0LCBpbnQ2NF90LCBJbnQ2NCkKKyAgICAgIEhBTkRMRV9UWVBFKFNJTlQzMiwgaW50MzJfdCwgSW50MzIpCisgICAgICBIQU5ETEVfVFlQRShTSU5UNjQsIGludDY0X3QsIEludDY0KQorICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzJfdCwgVUludDMyKQorICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjRfdCwgVUludDY0KQorCisgICAgICBIQU5ETEVfVFlQRShGSVhFRDMyLCB1aW50MzJfdCwgVUludDMyKQorICAgICAgSEFORExFX1RZUEUoRklYRUQ2NCwgdWludDY0X3QsIFVJbnQ2NCkKKyAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCBpbnQzMl90LCBJbnQzMikKKyAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCBpbnQ2NF90LCBJbnQ2NCkKKworICAgICAgSEFORExFX1RZUEUoRkxPQVQsIGZsb2F0LCBGbG9hdCkKKyAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlLCBEb3VibGUpCisKKyAgICAgIEhBTkRMRV9UWVBFKEJPT0wsIGJvb2wsIEJvb2wpCisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTTogeworICAgICAgICBpbnQgdmFsdWU7CisgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKKyAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkRW51bVZhbHVlKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5TZXRFbnVtVmFsdWUobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gSGFuZGxlIHN0cmluZ3Mgc2VwYXJhdGVseSBzbyB0aGF0IHdlIGNhbiBvcHRpbWl6ZSB0aGUgY3R5cGU9Q09SRCBjYXNlLgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOiB7CisgICAgICAgIGJvb2wgc3RyaWN0X3V0ZjhfY2hlY2sgPSBTdHJpY3RVdGY4Q2hlY2soZmllbGQpOworICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZTsKKyAgICAgICAgaWYgKCFXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZyhpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoc3RyaWN0X3V0ZjhfY2hlY2spIHsKKyAgICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKHZhbHVlLmRhdGEoKSwgdmFsdWUubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6UEFSU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+ZnVsbF9uYW1lKCkuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgVmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQodmFsdWUuZGF0YSgpLCB2YWx1ZS5sZW5ndGgoKSwgUEFSU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6IHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWU7CisgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRCeXRlcyhpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOiB7CisgICAgICAgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOworICAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkTWVzc2FnZSgKKyAgICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGlucHV0LT5HZXRFeHRlbnNpb25GYWN0b3J5KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN1Yl9tZXNzYWdlID0gbWVzc2FnZV9yZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZSgKKyAgICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGlucHV0LT5HZXRFeHRlbnNpb25GYWN0b3J5KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFXaXJlRm9ybWF0TGl0ZTo6UmVhZEdyb3VwKFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIHN1Yl9tZXNzYWdlKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOiB7CisgICAgICAgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOworICAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkTWVzc2FnZSgKKyAgICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGlucHV0LT5HZXRFeHRlbnNpb25GYWN0b3J5KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN1Yl9tZXNzYWdlID0gbWVzc2FnZV9yZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZSgKKyAgICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGlucHV0LT5HZXRFeHRlbnNpb25GYWN0b3J5KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2UoaW5wdXQsIHN1Yl9tZXNzYWdlKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlTWVzc2FnZVNldEl0ZW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbWVzc2FnZSkgeworICBzdHJ1Y3QgTVNSZWZsZWN0aXZlIHsKKyAgICBib29sIFBhcnNlRmllbGQoaW50IHR5cGVfaWQsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9CisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5GaW5kS25vd25FeHRlbnNpb25CeU51bWJlcih0eXBlX2lkKTsKKyAgICAgIHJldHVybiBQYXJzZUFuZE1lcmdlTWVzc2FnZVNldEZpZWxkKHR5cGVfaWQsIGZpZWxkLCBtZXNzYWdlLCBpbnB1dCk7CisgICAgfQorCisgICAgYm9vbCBTa2lwRmllbGQodWludDMyX3QgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgICAgIHJldHVybiBXaXJlRm9ybWF0OjpTa2lwRmllbGQoaW5wdXQsIHRhZywgbnVsbHB0cik7CisgICAgfQorCisgICAgY29uc3QgUmVmbGVjdGlvbiogbWVzc2FnZV9yZWZsZWN0aW9uOworICAgIE1lc3NhZ2UqIG1lc3NhZ2U7CisgIH07CisKKyAgcmV0dXJuIFBhcnNlTWVzc2FnZVNldEl0ZW1JbXBsKAorICAgICAgaW5wdXQsIE1TUmVmbGVjdGl2ZXttZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCksIG1lc3NhZ2V9KTsKK30KKworc3RydWN0IFdpcmVGb3JtYXQ6Ok1lc3NhZ2VTZXRQYXJzZXIgeworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIGludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgeworICAgIC8vIFBhcnNlIGEgTWVzc2FnZVNldEl0ZW0KKyAgICBhdXRvIG1ldGFkYXRhID0gcmVmbGVjdGlvbi0+TXV0YWJsZUludGVybmFsTWV0YWRhdGEobXNnKTsKKyAgICBlbnVtIGNsYXNzIFN0YXRlIHsga05vVGFnLCBrSGFzVHlwZSwga0hhc1BheWxvYWQsIGtEb25lIH07CisgICAgU3RhdGUgc3RhdGUgPSBTdGF0ZTo6a05vVGFnOworCisgICAgc3RkOjpzdHJpbmcgcGF5bG9hZDsKKyAgICB1aW50MzJfdCB0eXBlX2lkID0gMDsKKyAgICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgICAgLy8gV2UgdXNlIDY0IGJpdCB0YWdzIGluIG9yZGVyIHRvIGFsbG93IHR5cGVpZCdzIHRoYXQgc3BhbiB0aGUgd2hvbGUKKyAgICAgIC8vIHJhbmdlIG9mIDMyIGJpdCBudW1iZXJzLgorICAgICAgdWludDMyX3QgdGFnID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oKnB0cisrKTsKKyAgICAgIGlmICh0YWcgPT0gV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0VHlwZUlkVGFnKSB7CisgICAgICAgIHVpbnQ2NF90IHRtcDsKKyAgICAgICAgcHRyID0gUGFyc2VCaWdWYXJpbnQocHRyLCAmdG1wKTsKKyAgICAgICAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlOjprTm9UYWcpIHsKKyAgICAgICAgICB0eXBlX2lkID0gdG1wOworICAgICAgICAgIHN0YXRlID0gU3RhdGU6OmtIYXNUeXBlOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFN0YXRlOjprSGFzUGF5bG9hZCkgeworICAgICAgICAgIHR5cGVfaWQgPSB0bXA7CisgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZDsKKyAgICAgICAgICBpZiAoY3R4LT5kYXRhKCkucG9vbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmaWVsZCA9IHJlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKHR5cGVfaWQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWVsZCA9CisgICAgICAgICAgICAgICAgY3R4LT5kYXRhKCkucG9vbC0+RmluZEV4dGVuc2lvbkJ5TnVtYmVyKGRlc2NyaXB0b3IsIHR5cGVfaWQpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZmllbGQgPT0gbnVsbHB0ciB8fCBmaWVsZC0+bWVzc2FnZV90eXBlKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgV3JpdGVMZW5ndGhEZWxpbWl0ZWQoCisgICAgICAgICAgICAgICAgdHlwZV9pZCwgcGF5bG9hZCwKKyAgICAgICAgICAgICAgICBtZXRhZGF0YS0+bXV0YWJsZV91bmtub3duX2ZpZWxkczxVbmtub3duRmllbGRTZXQ+KCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNZXNzYWdlKiB2YWx1ZSA9CisgICAgICAgICAgICAgICAgZmllbGQtPmlzX3JlcGVhdGVkKCkKKyAgICAgICAgICAgICAgICAgICAgPyByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1zZywgZmllbGQsIGN0eC0+ZGF0YSgpLmZhY3RvcnkpCisgICAgICAgICAgICAgICAgICAgIDogcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobXNnLCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmRhdGEoKS5mYWN0b3J5KTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHA7CisgICAgICAgICAgICAvLyBXZSBjYW4ndCB1c2UgcmVndWxhciBwYXJzZSBmcm9tIHN0cmluZyBhcyB3ZSBoYXZlIHRvIHRyYWNrCisgICAgICAgICAgICAvLyBwcm9wZXIgcmVjdXJzaW9uIGRlcHRoIGFuZCBkZXNjcmlwdG9yIHBvb2xzLgorICAgICAgICAgICAgUGFyc2VDb250ZXh0IHRtcF9jdHgoY3R4LT5kZXB0aCgpLCBmYWxzZSwgJnAsIHBheWxvYWQpOworICAgICAgICAgICAgdG1wX2N0eC5kYXRhKCkucG9vbCA9IGN0eC0+ZGF0YSgpLnBvb2w7CisgICAgICAgICAgICB0bXBfY3R4LmRhdGEoKS5mYWN0b3J5ID0gY3R4LT5kYXRhKCkuZmFjdG9yeTsKKyAgICAgICAgICAgIEdPT0dMRV9QUk9UT0JVRl9QQVJTRVJfQVNTRVJUKHZhbHVlLT5fSW50ZXJuYWxQYXJzZShwLCAmdG1wX2N0eCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfY3R4LkVuZGVkQXRMaW1pdCgpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc3RhdGUgPSBTdGF0ZTo6a0RvbmU7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnKSB7CisgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZTo6a05vVGFnKSB7CisgICAgICAgICAgaW50MzJfdCBzaXplID0gUmVhZFNpemUoJnB0cik7CisgICAgICAgICAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgICAgICAgICBwdHIgPSBjdHgtPlJlYWRTdHJpbmcocHRyLCBzaXplLCAmcGF5bG9hZCk7CisgICAgICAgICAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgICAgICAgICBzdGF0ZSA9IFN0YXRlOjprSGFzUGF5bG9hZDsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBTdGF0ZTo6a0hhc1R5cGUpIHsKKyAgICAgICAgICAvLyBXZSdyZSBub3cgcGFyc2luZyB0aGUgcGF5bG9hZAorICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBudWxscHRyOworICAgICAgICAgIGlmIChkZXNjcmlwdG9yLT5Jc0V4dGVuc2lvbk51bWJlcih0eXBlX2lkKSkgeworICAgICAgICAgICAgaWYgKGN0eC0+ZGF0YSgpLnBvb2wgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICBmaWVsZCA9IHJlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKHR5cGVfaWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZmllbGQgPQorICAgICAgICAgICAgICAgICAgY3R4LT5kYXRhKCkucG9vbC0+RmluZEV4dGVuc2lvbkJ5TnVtYmVyKGRlc2NyaXB0b3IsIHR5cGVfaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBwdHIgPSBXaXJlRm9ybWF0OjpfSW50ZXJuYWxQYXJzZUFuZE1lcmdlRmllbGQoCisgICAgICAgICAgICAgIG1zZywgcHRyLCBjdHgsIHN0YXRpY19jYXN0PHVpbnQ2NF90Pih0eXBlX2lkKSAqIDggKyAyLCByZWZsZWN0aW9uLAorICAgICAgICAgICAgICBmaWVsZCk7CisgICAgICAgICAgc3RhdGUgPSBTdGF0ZTo6a0RvbmU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW50MzJfdCBzaXplID0gUmVhZFNpemUoJnB0cik7CisgICAgICAgICAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgICAgICAgICBwdHIgPSBjdHgtPlNraXAocHRyLCBzaXplKTsKKyAgICAgICAgICBHT09HTEVfUFJPVE9CVUZfUEFSU0VSX0FTU0VSVChwdHIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBBbiB1bmtub3duIGZpZWxkIGluIE1lc3NhZ2VTZXRJdGVtLgorICAgICAgICBwdHIgPSBSZWFkVGFnKHB0ciAtIDEsICZ0YWcpOworICAgICAgICBpZiAodGFnID09IDAgfHwgKHRhZyAmIDcpID09IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgICAgICByZXR1cm4gcHRyOworICAgICAgICB9CisgICAgICAgIC8vIFNraXAgZmllbGQuCisgICAgICAgIHB0ciA9IGludGVybmFsOjpVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgICAgIHRhZywgc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmcqPihudWxscHRyKSwgcHRyLCBjdHgpOworICAgICAgfQorICAgICAgR09PR0xFX1BST1RPQlVGX1BBUlNFUl9BU1NFUlQocHRyKTsKKyAgICB9CisgICAgcmV0dXJuIHB0cjsKKyAgfQorCisgIGNvbnN0IGNoYXIqIFBhcnNlTWVzc2FnZVNldChjb25zdCBjaGFyKiBwdHIsIGludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgeworICAgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgICB1aW50MzJfdCB0YWc7CisgICAgICBwdHIgPSBSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShwdHIgPT0gbnVsbHB0cikpIHJldHVybiBudWxscHRyOworICAgICAgaWYgKHRhZyA9PSAwIHx8ICh0YWcgJiA3KSA9PSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmICh0YWcgPT0gV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnKSB7CisgICAgICAgIC8vIEEgbWVzc2FnZSBzZXQgaXRlbSBzdGFydHMKKyAgICAgICAgcHRyID0gY3R4LT5QYXJzZUdyb3VwKHRoaXMsIHB0ciwgdGFnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFBhcnNlIG90aGVyIGZpZWxkcyBhcyBub3JtYWwgZXh0ZW5zaW9ucy4KKyAgICAgICAgaW50IGZpZWxkX251bWJlciA9IFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpOworICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3ItPklzRXh0ZW5zaW9uTnVtYmVyKGZpZWxkX251bWJlcikpIHsKKyAgICAgICAgICBpZiAoY3R4LT5kYXRhKCkucG9vbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmaWVsZCA9IHJlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKGZpZWxkX251bWJlcik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpZWxkID0gY3R4LT5kYXRhKCkucG9vbC0+RmluZEV4dGVuc2lvbkJ5TnVtYmVyKGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9udW1iZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdHIgPSBXaXJlRm9ybWF0OjpfSW50ZXJuYWxQYXJzZUFuZE1lcmdlRmllbGQobXNnLCBwdHIsIGN0eCwgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmbGVjdGlvbiwgZmllbGQpOworICAgICAgfQorICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UocHRyID09IG51bGxwdHIpKSByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHB0cjsKKyAgfQorCisgIE1lc3NhZ2UqIG1zZzsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcjsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbjsKK307CisKK2NvbnN0IGNoYXIqIFdpcmVGb3JtYXQ6Ol9JbnRlcm5hbFBhcnNlKE1lc3NhZ2UqIG1zZywgY29uc3QgY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtc2ctPkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1zZy0+R2V0UmVmbGVjdGlvbigpOworICBHT09HTEVfRENIRUNLKGRlc2NyaXB0b3IpOworICBHT09HTEVfRENIRUNLKHJlZmxlY3Rpb24pOworICBpZiAoZGVzY3JpcHRvci0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICBNZXNzYWdlU2V0UGFyc2VyIG1lc3NhZ2Vfc2V0e21zZywgZGVzY3JpcHRvciwgcmVmbGVjdGlvbn07CisgICAgcmV0dXJuIG1lc3NhZ2Vfc2V0LlBhcnNlTWVzc2FnZVNldChwdHIsIGN0eCk7CisgIH0KKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gUmVhZFRhZyhwdHIsICZ0YWcpOworICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKHB0ciA9PSBudWxscHRyKSkgcmV0dXJuIG51bGxwdHI7CisgICAgaWYgKHRhZyA9PSAwIHx8ICh0YWcgJiA3KSA9PSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gbnVsbHB0cjsKKworICAgIGludCBmaWVsZF9udW1iZXIgPSBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKTsKKyAgICBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TnVtYmVyKGZpZWxkX251bWJlcik7CisKKyAgICAvLyBJZiB0aGF0IGZhaWxlZCwgY2hlY2sgaWYgdGhlIGZpZWxkIGlzIGFuIGV4dGVuc2lvbi4KKyAgICBpZiAoZmllbGQgPT0gbnVsbHB0ciAmJiBkZXNjcmlwdG9yLT5Jc0V4dGVuc2lvbk51bWJlcihmaWVsZF9udW1iZXIpKSB7CisgICAgICBpZiAoY3R4LT5kYXRhKCkucG9vbCA9PSBudWxscHRyKSB7CisgICAgICAgIGZpZWxkID0gcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoZmllbGRfbnVtYmVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpZWxkID0KKyAgICAgICAgICAgIGN0eC0+ZGF0YSgpLnBvb2wtPkZpbmRFeHRlbnNpb25CeU51bWJlcihkZXNjcmlwdG9yLCBmaWVsZF9udW1iZXIpOworICAgICAgfQorICAgIH0KKworICAgIHB0ciA9IF9JbnRlcm5hbFBhcnNlQW5kTWVyZ2VGaWVsZChtc2csIHB0ciwgY3R4LCB0YWcsIHJlZmxlY3Rpb24sIGZpZWxkKTsKKyAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShwdHIgPT0gbnVsbHB0cikpIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBwdHI7Cit9CisKK2NvbnN0IGNoYXIqIFdpcmVGb3JtYXQ6Ol9JbnRlcm5hbFBhcnNlQW5kTWVyZ2VGaWVsZCgKKyAgICBNZXNzYWdlKiBtc2csIGNvbnN0IGNoYXIqIHB0ciwgaW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4LCB1aW50NjRfdCB0YWcsCisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBpZiAoZmllbGQgPT0gbnVsbHB0cikgeworICAgIC8vIHVua25vd24gZmllbGQgc2V0IHBhcnNlciB0YWtlcyA2NGJpdCB0YWdzLCBiZWNhdXNlIG1lc3NhZ2Ugc2V0IHR5cGUgaWRzCisgICAgLy8gc3BhbiB0aGUgZnVsbCAzMiBiaXQgcmFuZ2UgbWFraW5nIHRoZSB0YWcgc3BhbiBbMCwgMl4zNSkgcmFuZ2UuCisgICAgcmV0dXJuIGludGVybmFsOjpVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLCByZWZsZWN0aW9uLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhtc2cpLCBwdHIsIGN0eCk7CisgIH0KKyAgaWYgKFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpICE9CisgICAgICBXaXJlVHlwZUZvckZpZWxkVHlwZShmaWVsZC0+dHlwZSgpKSkgeworICAgIGlmIChmaWVsZC0+aXNfcGFja2FibGUoKSAmJiBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPnR5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfUEFDS0VEX1RZUEUoVFlQRSwgQ1BQVFlQRSwgQ1BQVFlQRV9NRVRIT0QpICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNUWVBFOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHRyID0gaW50ZXJuYWw6OlBhY2tlZCMjQ1BQVFlQRV9NRVRIT0QjI1BhcnNlciggICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZWZsZWN0aW9uLT5NdXRhYmxlUmVwZWF0ZWRGaWVsZEludGVybmFsPENQUFRZUEU+KG1zZywgZmllbGQpLCBwdHIsIFwKKyAgICAgICAgY3R4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyAgICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKElOVDMyLCBpbnQzMl90LCBJbnQzMikKKyAgICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKElOVDY0LCBpbnQ2NF90LCBJbnQ2NCkKKyAgICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKFNJTlQzMiwgaW50MzJfdCwgU0ludDMyKQorICAgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoU0lOVDY0LCBpbnQ2NF90LCBTSW50NjQpCisgICAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShVSU5UMzIsIHVpbnQzMl90LCBVSW50MzIpCisgICAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShVSU5UNjQsIHVpbnQ2NF90LCBVSW50NjQpCisKKyAgICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKEZJWEVEMzIsIHVpbnQzMl90LCBGaXhlZDMyKQorICAgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoRklYRUQ2NCwgdWludDY0X3QsIEZpeGVkNjQpCisgICAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShTRklYRUQzMiwgaW50MzJfdCwgU0ZpeGVkMzIpCisgICAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShTRklYRUQ2NCwgaW50NjRfdCwgU0ZpeGVkNjQpCisKKyAgICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKEZMT0FULCBmbG9hdCwgRmxvYXQpCisgICAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShET1VCTEUsIGRvdWJsZSwgRG91YmxlKQorCisgICAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShCT09MLCBib29sLCBCb29sKQorI3VuZGVmIEhBTkRMRV9QQUNLRURfVFlQRQorCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU06IHsKKyAgICAgICAgICBhdXRvIHJlcF9lbnVtID0KKyAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkRmllbGRJbnRlcm5hbDxpbnQ+KG1zZywgZmllbGQpOworICAgICAgICAgIGJvb2wgb3Blbl9lbnVtID0gZmFsc2U7CisgICAgICAgICAgaWYgKGZpZWxkLT5maWxlKCktPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zIHx8CisgICAgICAgICAgICAgIG9wZW5fZW51bSkgeworICAgICAgICAgICAgcHRyID0gaW50ZXJuYWw6OlBhY2tlZEVudW1QYXJzZXIocmVwX2VudW0sIHB0ciwgY3R4KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGN0eC0+UmVhZFBhY2tlZFZhcmludCgKKyAgICAgICAgICAgICAgICBwdHIsIFtyZXBfZW51bSwgZmllbGQsIHJlZmxlY3Rpb24sIG1zZ10odWludDY0X3QgdmFsKSB7CisgICAgICAgICAgICAgICAgICBpZiAoZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU51bWJlcih2YWwpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwX2VudW0tPkFkZCh2YWwpOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVWYXJpbnQoZmllbGQtPm51bWJlcigpLCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24tPk11dGFibGVVbmtub3duRmllbGRzKG1zZykpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gcHRyOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOgorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6CisgICAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IHJlYWNoIjsKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gbWlzbWF0Y2hlZCB3aXJldHlwZTsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6VW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgICAgdGFnLCByZWZsZWN0aW9uLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhtc2cpLCBwdHIsIGN0eCk7CisgICAgfQorICB9CisKKyAgLy8gTm9uLXBhY2tlZCB2YWx1ZQorICBib29sIHV0ZjhfY2hlY2sgPSBmYWxzZTsKKyAgYm9vbCBzdHJpY3RfdXRmOF9jaGVjayA9IGZhbHNlOworICBzd2l0Y2ggKGZpZWxkLT50eXBlKCkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVFlQRSwgQ1BQVFlQRSwgQ1BQVFlQRV9NRVRIT0QpICAgICAgICBcCisgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFXyMjVFlQRTogeyAgICAgICAgICAgICAgICAgICAgXAorICAgIENQUFRZUEUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwdHIgPSBWYXJpbnRQYXJzZShwdHIsICZ2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHB0ciA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJlZmxlY3Rpb24tPkFkZCMjQ1BQVFlQRV9NRVRIT0QobXNnLCBmaWVsZCwgdmFsdWUpOyBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmVmbGVjdGlvbi0+U2V0IyNDUFBUWVBFX01FVEhPRChtc2csIGZpZWxkLCB2YWx1ZSk7IFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyAgICBIQU5ETEVfVFlQRShCT09MLCB1aW50NjRfdCwgQm9vbCkKKyAgICBIQU5ETEVfVFlQRShJTlQzMiwgdWludDMyX3QsIEludDMyKQorICAgIEhBTkRMRV9UWVBFKElOVDY0LCB1aW50NjRfdCwgSW50NjQpCisgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzJfdCwgVUludDMyKQorICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0X3QsIFVJbnQ2NCkKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMjogeworICAgICAgaW50MzJfdCB2YWx1ZSA9IFJlYWRWYXJpbnRaaWdaYWczMigmcHRyKTsKKyAgICAgIGlmIChwdHIgPT0gbnVsbHB0cikgcmV0dXJuIG51bGxwdHI7CisgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgcmVmbGVjdGlvbi0+QWRkSW50MzIobXNnLCBmaWVsZCwgdmFsdWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVmbGVjdGlvbi0+U2V0SW50MzIobXNnLCBmaWVsZCwgdmFsdWUpOworICAgICAgfQorICAgICAgcmV0dXJuIHB0cjsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0OiB7CisgICAgICBpbnQ2NF90IHZhbHVlID0gUmVhZFZhcmludFppZ1phZzY0KCZwdHIpOworICAgICAgaWYgKHB0ciA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICByZWZsZWN0aW9uLT5BZGRJbnQ2NChtc2csIGZpZWxkLCB2YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZWZsZWN0aW9uLT5TZXRJbnQ2NChtc2csIGZpZWxkLCB2YWx1ZSk7CisgICAgICB9CisgICAgICByZXR1cm4gcHRyOworICAgIH0KKyN1bmRlZiBIQU5ETEVfVFlQRQorI2RlZmluZSBIQU5ETEVfVFlQRShUWVBFLCBDUFBUWVBFLCBDUFBUWVBFX01FVEhPRCkgICAgICAgIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNUWVBFOiB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1BQVFlQRSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlID0gVW5hbGlnbmVkTG9hZDxDUFBUWVBFPihwdHIpOyAgICAgICAgICAgICAgICAgIFwKKyAgICBwdHIgKz0gc2l6ZW9mKENQUFRZUEUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmVmbGVjdGlvbi0+QWRkIyNDUFBUWVBFX01FVEhPRChtc2csIGZpZWxkLCB2YWx1ZSk7IFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZWZsZWN0aW9uLT5TZXQjI0NQUFRZUEVfTUVUSE9EKG1zZywgZmllbGQsIHZhbHVlKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworICAgICAgSEFORExFX1RZUEUoRklYRUQzMiwgdWludDMyX3QsIFVJbnQzMikKKyAgICAgIEhBTkRMRV9UWVBFKEZJWEVENjQsIHVpbnQ2NF90LCBVSW50NjQpCisgICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgaW50MzJfdCwgSW50MzIpCisgICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgaW50NjRfdCwgSW50NjQpCisKKyAgICAgIEhBTkRMRV9UWVBFKEZMT0FULCBmbG9hdCwgRmxvYXQpCisgICAgICBIQU5ETEVfVFlQRShET1VCTEUsIGRvdWJsZSwgRG91YmxlKQorCisjdW5kZWYgSEFORExFX1RZUEUKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU06IHsKKyAgICAgIHVpbnQzMl90IHZhbHVlOworICAgICAgcHRyID0gVmFyaW50UGFyc2UocHRyLCAmdmFsdWUpOworICAgICAgaWYgKHB0ciA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICByZWZsZWN0aW9uLT5BZGRFbnVtVmFsdWUobXNnLCBmaWVsZCwgdmFsdWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVmbGVjdGlvbi0+U2V0RW51bVZhbHVlKG1zZywgZmllbGQsIHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwdHI7CisgICAgfQorCisgICAgLy8gSGFuZGxlIHN0cmluZ3Mgc2VwYXJhdGVseSBzbyB0aGF0IHdlIGNhbiBvcHRpbWl6ZSB0aGUgY3R5cGU9Q09SRCBjYXNlLgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKKyAgICAgIHV0ZjhfY2hlY2sgPSB0cnVlOworICAgICAgc3RyaWN0X3V0ZjhfY2hlY2sgPSBTdHJpY3RVdGY4Q2hlY2soZmllbGQpOworICAgICAgUFJPVE9CVUZfRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6IHsKKyAgICAgIGludCBzaXplID0gUmVhZFNpemUoJnB0cik7CisgICAgICBpZiAocHRyID09IG51bGxwdHIpIHJldHVybiBudWxscHRyOworICAgICAgc3RkOjpzdHJpbmcgdmFsdWU7CisgICAgICBwdHIgPSBjdHgtPlJlYWRTdHJpbmcocHRyLCBzaXplLCAmdmFsdWUpOworICAgICAgaWYgKHB0ciA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGlmICh1dGY4X2NoZWNrKSB7CisgICAgICAgIGlmIChzdHJpY3RfdXRmOF9jaGVjaykgeworICAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcodmFsdWUuZGF0YSgpLCB2YWx1ZS5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpQQVJTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5mdWxsX25hbWUoKS5jX3N0cigpKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKHZhbHVlLmRhdGEoKSwgdmFsdWUubGVuZ3RoKCksIFBBUlNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtc2csIGZpZWxkLCBzdGQ6Om1vdmUodmFsdWUpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtc2csIGZpZWxkLCBzdGQ6Om1vdmUodmFsdWUpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwdHI7CisgICAgfQorCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVA6IHsKKyAgICAgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOworICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtc2csIGZpZWxkLCBjdHgtPmRhdGEoKS5mYWN0b3J5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN1Yl9tZXNzYWdlID0KKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKG1zZywgZmllbGQsIGN0eC0+ZGF0YSgpLmZhY3RvcnkpOworICAgICAgfQorCisgICAgICByZXR1cm4gY3R4LT5QYXJzZUdyb3VwKHN1Yl9tZXNzYWdlLCBwdHIsIHRhZyk7CisgICAgfQorCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRTogeworICAgICAgTWVzc2FnZSogc3ViX21lc3NhZ2U7CisgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1zZywgZmllbGQsIGN0eC0+ZGF0YSgpLmZhY3RvcnkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3ViX21lc3NhZ2UgPQorICAgICAgICAgICAgcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobXNnLCBmaWVsZCwgY3R4LT5kYXRhKCkuZmFjdG9yeSk7CisgICAgICB9CisgICAgICByZXR1cm4gY3R4LT5QYXJzZU1lc3NhZ2Uoc3ViX21lc3NhZ2UsIHB0cik7CisgICAgfQorICB9CisKKyAgLy8gR0NDIDggY29tcGxhaW5zIGFib3V0IGNvbnRyb2wgcmVhY2hpbmcgZW5kIG9mIG5vbi12b2lkIGZ1bmN0aW9uIGhlcmUuCisgIC8vIExldCdzIGtlZXAgaXQgaGFwcHkgYnkgcmV0dXJuaW5nIGEgbnVsbHB0ci4KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordWludDhfdCogV2lyZUZvcm1hdDo6X0ludGVybmFsU2VyaWFsaXplKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIHVpbnQ4X3QqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogbWVzc2FnZV9yZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworCisgIC8vIEZpZWxkcyBvZiBtYXAgZW50cnkgc2hvdWxkIGFsd2F5cyBiZSBzZXJpYWxpemVkLgorICBpZiAoZGVzY3JpcHRvci0+b3B0aW9ucygpLm1hcF9lbnRyeSgpKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGZpZWxkcy5wdXNoX2JhY2soZGVzY3JpcHRvci0+ZmllbGQoaSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZSwgJmZpZWxkcyk7CisgIH0KKworICBmb3IgKGF1dG8gZmllbGQgOiBmaWVsZHMpIHsKKyAgICB0YXJnZXQgPSBJbnRlcm5hbFNlcmlhbGl6ZUZpZWxkKGZpZWxkLCBtZXNzYWdlLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKworICBpZiAoZGVzY3JpcHRvci0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICByZXR1cm4gSW50ZXJuYWxTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zVG9BcnJheSgKKyAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRVbmtub3duRmllbGRzKG1lc3NhZ2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9Cit9CisKK3VpbnQ4X3QqIFNlcmlhbGl6ZU1hcEtleVdpdGhDYWNoZWRTaXplcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hcEtleSYgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSB7CisgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTToKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbnN1cHBvcnRlZCI7CisgICAgICBicmVhazsKKyNkZWZpbmUgQ0FTRV9UWVBFKEZpZWxkVHlwZSwgQ2FtZWxGaWVsZFR5cGUsIENhbWVsQ3BwVHlwZSkgICBcCisgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFXyMjRmllbGRUeXBlOiAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZSMjQ2FtZWxGaWVsZFR5cGUjI1RvQXJyYXkoIFwKKyAgICAgICAgMSwgdmFsdWUuR2V0IyNDYW1lbENwcFR5cGUjI1ZhbHVlKCksIHRhcmdldCk7ICAgICAgICBcCisgICAgYnJlYWs7CisgICAgICBDQVNFX1RZUEUoSU5UNjQsIEludDY0LCBJbnQ2NCkKKyAgICAgIENBU0VfVFlQRShVSU5UNjQsIFVJbnQ2NCwgVUludDY0KQorICAgICAgQ0FTRV9UWVBFKElOVDMyLCBJbnQzMiwgSW50MzIpCisgICAgICBDQVNFX1RZUEUoRklYRUQ2NCwgRml4ZWQ2NCwgVUludDY0KQorICAgICAgQ0FTRV9UWVBFKEZJWEVEMzIsIEZpeGVkMzIsIFVJbnQzMikKKyAgICAgIENBU0VfVFlQRShCT09MLCBCb29sLCBCb29sKQorICAgICAgQ0FTRV9UWVBFKFVJTlQzMiwgVUludDMyLCBVSW50MzIpCisgICAgICBDQVNFX1RZUEUoU0ZJWEVEMzIsIFNGaXhlZDMyLCBJbnQzMikKKyAgICAgIENBU0VfVFlQRShTRklYRUQ2NCwgU0ZpeGVkNjQsIEludDY0KQorICAgICAgQ0FTRV9UWVBFKFNJTlQzMiwgU0ludDMyLCBJbnQzMikKKyAgICAgIENBU0VfVFlQRShTSU5UNjQsIFNJbnQ2NCwgSW50NjQpCisjdW5kZWYgQ0FTRV9UWVBFCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOgorICAgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZygxLCB2YWx1ZS5HZXRTdHJpbmdWYWx1ZSgpLCB0YXJnZXQpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworc3RhdGljIHVpbnQ4X3QqIFNlcmlhbGl6ZU1hcFZhbHVlUmVmV2l0aENhY2hlZFNpemVzKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IE1hcFZhbHVlQ29uc3RSZWYmIHZhbHVlLAorICAgIHVpbnQ4X3QqIHRhcmdldCwgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgeworICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgIHN3aXRjaCAoZmllbGQtPnR5cGUoKSkgeworI2RlZmluZSBDQVNFX1RZUEUoRmllbGRUeXBlLCBDYW1lbEZpZWxkVHlwZSwgQ2FtZWxDcHBUeXBlKSAgIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNGaWVsZFR5cGU6ICAgICAgICAgICAgICAgICAgICBcCisgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlIyNDYW1lbEZpZWxkVHlwZSMjVG9BcnJheSggXAorICAgICAgICAyLCB2YWx1ZS5HZXQjI0NhbWVsQ3BwVHlwZSMjVmFsdWUoKSwgdGFyZ2V0KTsgICAgICAgIFwKKyAgICBicmVhazsKKyAgICBDQVNFX1RZUEUoSU5UNjQsIEludDY0LCBJbnQ2NCkKKyAgICBDQVNFX1RZUEUoVUlOVDY0LCBVSW50NjQsIFVJbnQ2NCkKKyAgICBDQVNFX1RZUEUoSU5UMzIsIEludDMyLCBJbnQzMikKKyAgICBDQVNFX1RZUEUoRklYRUQ2NCwgRml4ZWQ2NCwgVUludDY0KQorICAgIENBU0VfVFlQRShGSVhFRDMyLCBGaXhlZDMyLCBVSW50MzIpCisgICAgQ0FTRV9UWVBFKEJPT0wsIEJvb2wsIEJvb2wpCisgICAgQ0FTRV9UWVBFKFVJTlQzMiwgVUludDMyLCBVSW50MzIpCisgICAgQ0FTRV9UWVBFKFNGSVhFRDMyLCBTRml4ZWQzMiwgSW50MzIpCisgICAgQ0FTRV9UWVBFKFNGSVhFRDY0LCBTRml4ZWQ2NCwgSW50NjQpCisgICAgQ0FTRV9UWVBFKFNJTlQzMiwgU0ludDMyLCBJbnQzMikKKyAgICBDQVNFX1RZUEUoU0lOVDY0LCBTSW50NjQsIEludDY0KQorICAgIENBU0VfVFlQRShFTlVNLCBFbnVtLCBFbnVtKQorICAgIENBU0VfVFlQRShET1VCTEUsIERvdWJsZSwgRG91YmxlKQorICAgIENBU0VfVFlQRShGTE9BVCwgRmxvYXQsIEZsb2F0KQorI3VuZGVmIENBU0VfVFlQRQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzoKKyAgICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmcoMiwgdmFsdWUuR2V0U3RyaW5nVmFsdWUoKSwgdGFyZ2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6IHsKKyAgICAgIGF1dG8mIG1zZyA9IHZhbHVlLkdldE1lc3NhZ2VWYWx1ZSgpOworICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OkludGVybmFsV3JpdGVNZXNzYWdlKDIsIG1zZywgbXNnLkdldENhY2hlZFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIHN0cmVhbSk7CisgICAgfSBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpJbnRlcm5hbFdyaXRlR3JvdXAoMiwgdmFsdWUuR2V0TWVzc2FnZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCwgc3RyZWFtKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2NsYXNzIE1hcEtleVNvcnRlciB7CisgcHVibGljOgorICBzdGF0aWMgc3RkOjp2ZWN0b3I8TWFwS2V5PiBTb3J0S2V5KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgICAgc3RkOjp2ZWN0b3I8TWFwS2V5PiBzb3J0ZWRfa2V5X2xpc3Q7CisgICAgZm9yIChNYXBJdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgcmVmbGVjdGlvbi0+TWFwQmVnaW4oY29uc3RfY2FzdDxNZXNzYWdlKj4oJm1lc3NhZ2UpLCBmaWVsZCk7CisgICAgICAgICBpdCAhPSByZWZsZWN0aW9uLT5NYXBFbmQoY29uc3RfY2FzdDxNZXNzYWdlKj4oJm1lc3NhZ2UpLCBmaWVsZCk7CisgICAgICAgICArK2l0KSB7CisgICAgICBzb3J0ZWRfa2V5X2xpc3QucHVzaF9iYWNrKGl0LkdldEtleSgpKTsKKyAgICB9CisgICAgTWFwS2V5Q29tcGFyYXRvciBjb21wYXJhdG9yOworICAgIHN0ZDo6c29ydChzb3J0ZWRfa2V5X2xpc3QuYmVnaW4oKSwgc29ydGVkX2tleV9saXN0LmVuZCgpLCBjb21wYXJhdG9yKTsKKyAgICByZXR1cm4gc29ydGVkX2tleV9saXN0OworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBNYXBLZXlDb21wYXJhdG9yIHsKKyAgIHB1YmxpYzoKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgTWFwS2V5JiBhLCBjb25zdCBNYXBLZXkmIGIpIGNvbnN0IHsKKyAgICAgIEdPT0dMRV9EQ0hFQ0soYS50eXBlKCkgPT0gYi50eXBlKCkpOworICAgICAgc3dpdGNoIChhLnR5cGUoKSkgeworI2RlZmluZSBDQVNFX1RZUEUoQ3BwVHlwZSwgQ2FtZWxDcHBUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NwcFR5cGU6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBhLkdldCMjQ2FtZWxDcHBUeXBlIyNWYWx1ZSgpIDwgYi5HZXQjI0NhbWVsQ3BwVHlwZSMjVmFsdWUoKTsgXAorICB9CisgICAgICAgIENBU0VfVFlQRShTVFJJTkcsIFN0cmluZykKKyAgICAgICAgQ0FTRV9UWVBFKElOVDY0LCBJbnQ2NCkKKyAgICAgICAgQ0FTRV9UWVBFKElOVDMyLCBJbnQzMikKKyAgICAgICAgQ0FTRV9UWVBFKFVJTlQ2NCwgVUludDY0KQorICAgICAgICBDQVNFX1RZUEUoVUlOVDMyLCBVSW50MzIpCisgICAgICAgIENBU0VfVFlQRShCT09MLCBCb29sKQorI3VuZGVmIENBU0VfVFlQRQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJJbnZhbGlkIGtleSBmb3IgbWFwIGZpZWxkLiI7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9OworfTsKKworc3RhdGljIHVpbnQ4X3QqIEludGVybmFsU2VyaWFsaXplTWFwRW50cnkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hcEtleSYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFwVmFsdWVDb25zdFJlZiYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5X2ZpZWxkID0gZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5maWVsZCgwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZV9maWVsZCA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+ZmllbGQoMSk7CisKKyAgc2l6ZV90IHNpemUgPSBrTWFwRW50cnlUYWdCeXRlU2l6ZTsKKyAgc2l6ZSArPSBNYXBLZXlEYXRhT25seUJ5dGVTaXplKGtleV9maWVsZCwga2V5KTsKKyAgc2l6ZSArPSBNYXBWYWx1ZVJlZkRhdGFPbmx5Qnl0ZVNpemUodmFsdWVfZmllbGQsIHZhbHVlKTsKKyAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgZmllbGQtPm51bWJlcigpLCBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgdGFyZ2V0KTsKKyAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheShzaXplLCB0YXJnZXQpOworICB0YXJnZXQgPSBTZXJpYWxpemVNYXBLZXlXaXRoQ2FjaGVkU2l6ZXMoa2V5X2ZpZWxkLCBrZXksIHRhcmdldCwgc3RyZWFtKTsKKyAgdGFyZ2V0ID0KKyAgICAgIFNlcmlhbGl6ZU1hcFZhbHVlUmVmV2l0aENhY2hlZFNpemVzKHZhbHVlX2ZpZWxkLCB2YWx1ZSwgdGFyZ2V0LCBzdHJlYW0pOworICByZXR1cm4gdGFyZ2V0OworfQorCit1aW50OF90KiBXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZUZpZWxkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgeworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpICYmCisgICAgICBmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpICYmCisgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSAmJgorICAgICAgIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgcmV0dXJuIEludGVybmFsU2VyaWFsaXplTWVzc2FnZVNldEl0ZW0oZmllbGQsIG1lc3NhZ2UsIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorCisgIC8vIEZvciBtYXAgZmllbGRzLCB3ZSBjYW4gdXNlIGVpdGhlciByZXBlYXRlZCBmaWVsZCByZWZsZWN0aW9uIG9yIG1hcAorICAvLyByZWZsZWN0aW9uLiAgT3VyIGNob2ljZSBoYXMgc29tZSBzdWJ0bGUgZWZmZWN0cy4gIElmIHdlIHVzZSByZXBlYXRlZCBmaWVsZAorICAvLyByZWZsZWN0aW9uIGhlcmUsIHRoZW4gdGhlIHJlcGVhdGVkIGZpZWxkIHJlcHJlc2VudGF0aW9uIGJlY29tZXMKKyAgLy8gYXV0aG9yaXRhdGl2ZSBmb3IgdGhpcyBmaWVsZDogYW55IGV4aXN0aW5nIHJlZmVyZW5jZXMgdGhhdCBjYW1lIGZyb20gbWFwCisgIC8vIHJlZmxlY3Rpb24gcmVtYWluIHZhbGlkIGZvciByZWFkaW5nLCBidXQgbXV0YXRpb25zIHRvIHRoZW0gYXJlIGxvc3QgYW5kCisgIC8vIHdpbGwgYmUgb3ZlcndyaXR0ZW4gbmV4dCB0aW1lIHdlIGNhbGwgbWFwIHJlZmxlY3Rpb24hCisgIC8vCisgIC8vIFNvIGZhciB0aGlzIG1haW5seSBhZmZlY3RzIFB5dGhvbiwgd2hpY2gga2VlcHMgbG9uZy10ZXJtIHJlZmVyZW5jZXMgdG8gbWFwCisgIC8vIHZhbHVlcyBhcm91bmQsIGFuZCBhbHdheXMgdXNlcyBtYXAgcmVmbGVjdGlvbi4gIFNlZTogYi8zNTkxODY5MQorICAvLworICAvLyBIZXJlIHdlIGNob29zZSB0byB1c2UgbWFwIHJlZmxlY3Rpb24gQVBJIGFzIGxvbmcgYXMgdGhlIGludGVybmFsCisgIC8vIG1hcCBpcyB2YWxpZC4gSW4gdGhpcyB3YXksIHRoZSBzZXJpYWxpemF0aW9uIGRvZXNuJ3QgY2hhbmdlIG1hcCBmaWVsZCdzCisgIC8vIGludGVybmFsIHN0YXRlIGFuZCBleGlzdGluZyByZWZlcmVuY2VzIHRoYXQgY2FtZSBmcm9tIG1hcCByZWZsZWN0aW9uIHJlbWFpbgorICAvLyB2YWxpZCBmb3IgYm90aCByZWFkaW5nIGFuZCB3cml0aW5nLgorICBpZiAoZmllbGQtPmlzX21hcCgpKSB7CisgICAgY29uc3QgTWFwRmllbGRCYXNlKiBtYXBfZmllbGQgPQorICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldE1hcERhdGEobWVzc2FnZSwgZmllbGQpOworICAgIGlmIChtYXBfZmllbGQtPklzTWFwVmFsaWQoKSkgeworICAgICAgaWYgKHN0cmVhbS0+SXNTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYygpKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPE1hcEtleT4gc29ydGVkX2tleV9saXN0ID0KKyAgICAgICAgICAgIE1hcEtleVNvcnRlcjo6U29ydEtleShtZXNzYWdlLCBtZXNzYWdlX3JlZmxlY3Rpb24sIGZpZWxkKTsKKyAgICAgICAgZm9yIChzdGQ6OnZlY3RvcjxNYXBLZXk+OjppdGVyYXRvciBpdCA9IHNvcnRlZF9rZXlfbGlzdC5iZWdpbigpOworICAgICAgICAgICAgIGl0ICE9IHNvcnRlZF9rZXlfbGlzdC5lbmQoKTsgKytpdCkgeworICAgICAgICAgIE1hcFZhbHVlQ29uc3RSZWYgbWFwX3ZhbHVlOworICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+TG9va3VwTWFwVmFsdWUobWVzc2FnZSwgZmllbGQsICppdCwgJm1hcF92YWx1ZSk7CisgICAgICAgICAgdGFyZ2V0ID0KKyAgICAgICAgICAgICAgSW50ZXJuYWxTZXJpYWxpemVNYXBFbnRyeShmaWVsZCwgKml0LCBtYXBfdmFsdWUsIHRhcmdldCwgc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChNYXBJdGVyYXRvciBpdCA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+TWFwQmVnaW4oCisgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8TWVzc2FnZSo+KCZtZXNzYWdlKSwgZmllbGQpOworICAgICAgICAgICAgIGl0ICE9CisgICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5NYXBFbmQoY29uc3RfY2FzdDxNZXNzYWdlKj4oJm1lc3NhZ2UpLCBmaWVsZCk7CisgICAgICAgICAgICAgKytpdCkgeworICAgICAgICAgIHRhcmdldCA9IEludGVybmFsU2VyaWFsaXplTWFwRW50cnkoZmllbGQsIGl0LkdldEtleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQuR2V0VmFsdWVSZWYoKSwgdGFyZ2V0LCBzdHJlYW0pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgfQorICB9CisgIGludCBjb3VudCA9IDA7CisKKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgY291bnQgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCk7CisgIH0gZWxzZSBpZiAoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5vcHRpb25zKCkubWFwX2VudHJ5KCkpIHsKKyAgICAvLyBNYXAgZW50cnkgZmllbGRzIGFsd2F5cyBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQuCisgICAgY291bnQgPSAxOworICB9IGVsc2UgaWYgKG1lc3NhZ2VfcmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgZmllbGQpKSB7CisgICAgY291bnQgPSAxOworICB9CisKKyAgLy8gbWFwX2VudHJpZXMgaXMgZm9yIG1hcHMgdGhhdCdsbCBiZSBkZXRlcm1pbmlzdGljYWxseSBzZXJpYWxpemVkLgorICBzdGQ6OnZlY3Rvcjxjb25zdCBNZXNzYWdlKj4gbWFwX2VudHJpZXM7CisgIGlmIChjb3VudCA+IDEgJiYgZmllbGQtPmlzX21hcCgpICYmIHN0cmVhbS0+SXNTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYygpKSB7CisgICAgbWFwX2VudHJpZXMgPQorICAgICAgICBEeW5hbWljTWFwU29ydGVyOjpTb3J0KG1lc3NhZ2UsIGNvdW50LCBtZXNzYWdlX3JlZmxlY3Rpb24sIGZpZWxkKTsKKyAgfQorCisgIGlmIChmaWVsZC0+aXNfcGFja2VkKCkpIHsKKyAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIHRhcmdldDsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9QUklNSVRJVkVfVFlQRShUWVBFLCBDUFBUWVBFLCBUWVBFX01FVEhPRCwgQ1BQVFlQRV9NRVRIT0QpICAgICAgXAorICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV8jI1RZUEU6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdXRvIHIgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRGaWVsZEludGVybmFsPENQUFRZUEU+KG1lc3NhZ2UsIGZpZWxkKTsgXAorICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGUjI1RZUEVfTUVUSE9EIyNQYWNrZWQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmllbGQtPm51bWJlcigpLCByLCBGaWVsZERhdGFPbmx5Qnl0ZVNpemUoZmllbGQsIG1lc3NhZ2UpLCB0YXJnZXQpOyAgICBcCisgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShJTlQzMiwgaW50MzJfdCwgSW50MzIsIEludDMyKQorICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKElOVDY0LCBpbnQ2NF90LCBJbnQ2NCwgSW50NjQpCisgICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoU0lOVDMyLCBpbnQzMl90LCBTSW50MzIsIEludDMyKQorICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKFNJTlQ2NCwgaW50NjRfdCwgU0ludDY0LCBJbnQ2NCkKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShVSU5UMzIsIHVpbnQzMl90LCBVSW50MzIsIFVJbnQzMikKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShVSU5UNjQsIHVpbnQ2NF90LCBVSW50NjQsIFVJbnQ2NCkKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShFTlVNLCBpbnQsIEVudW0sIEVudW0pCisKKyN1bmRlZiBIQU5ETEVfUFJJTUlUSVZFX1RZUEUKKyNkZWZpbmUgSEFORExFX1BSSU1JVElWRV9UWVBFKFRZUEUsIENQUFRZUEUsIFRZUEVfTUVUSE9ELCBDUFBUWVBFX01FVEhPRCkgICAgICBcCisgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFXyMjVFlQRTogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF1dG8gciA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEZpZWxkSW50ZXJuYWw8Q1BQVFlQRT4obWVzc2FnZSwgZmllbGQpOyBcCisgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZUZpeGVkUGFja2VkKGZpZWxkLT5udW1iZXIoKSwgciwgdGFyZ2V0KTsgICAgICAgICAgICAgXAorICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisgICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoRklYRUQzMiwgdWludDMyX3QsIEZpeGVkMzIsIFVJbnQzMikKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShGSVhFRDY0LCB1aW50NjRfdCwgRml4ZWQ2NCwgVUludDY0KQorICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKFNGSVhFRDMyLCBpbnQzMl90LCBTRml4ZWQzMiwgSW50MzIpCisgICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoU0ZJWEVENjQsIGludDY0X3QsIFNGaXhlZDY0LCBJbnQ2NCkKKworICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKEZMT0FULCBmbG9hdCwgRmxvYXQsIEZsb2F0KQorICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKERPVUJMRSwgZG91YmxlLCBEb3VibGUsIERvdWJsZSkKKworICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKEJPT0wsIGJvb2wsIEJvb2wsIEJvb2wpCisjdW5kZWYgSEFORExFX1BSSU1JVElWRV9UWVBFCisgICAgICBkZWZhdWx0OgorICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiSW52YWxpZCBkZXNjcmlwdG9yIjsKKyAgICB9CisgICAgcmV0dXJuIHRhcmdldDsKKyAgfQorCisgIGF1dG8gZ2V0X21lc3NhZ2VfZnJvbV9maWVsZCA9IFsmbWVzc2FnZSwgJm1hcF9lbnRyaWVzLCBtZXNzYWdlX3JlZmxlY3Rpb25dKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGopIHsKKyAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICByZXR1cm4gJm1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBmaWVsZCk7CisgICAgfQorICAgIGlmICghbWFwX2VudHJpZXMuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIG1hcF9lbnRyaWVzW2pdOworICAgIH0KKyAgICByZXR1cm4gJm1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkLCBqKTsKKyAgfTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHN3aXRjaCAoZmllbGQtPnR5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoVFlQRSwgQ1BQVFlQRSwgVFlQRV9NRVRIT0QsIENQUFRZUEVfTUVUSE9EKSAgICAgXAorICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV8jI1RZUEU6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IENQUFRZUEUgdmFsdWUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgPyBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFJlcGVhdGVkIyNDUFBUWVBFX01FVEhPRChtZXNzYWdlLCBmaWVsZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOiBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldCMjQ1BQVFlQRV9NRVRIT0QobWVzc2FnZSwgZmllbGQpOyAgICAgICAgXAorICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZSMjVFlQRV9NRVRIT0QjI1RvQXJyYXkoZmllbGQtPm51bWJlcigpLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIHRhcmdldCk7ICAgICAgXAorICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShJTlQzMiwgaW50MzJfdCwgSW50MzIsIEludDMyKQorICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKElOVDY0LCBpbnQ2NF90LCBJbnQ2NCwgSW50NjQpCisgICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoU0lOVDMyLCBpbnQzMl90LCBTSW50MzIsIEludDMyKQorICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKFNJTlQ2NCwgaW50NjRfdCwgU0ludDY0LCBJbnQ2NCkKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShVSU5UMzIsIHVpbnQzMl90LCBVSW50MzIsIFVJbnQzMikKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShVSU5UNjQsIHVpbnQ2NF90LCBVSW50NjQsIFVJbnQ2NCkKKworICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKEZJWEVEMzIsIHVpbnQzMl90LCBGaXhlZDMyLCBVSW50MzIpCisgICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoRklYRUQ2NCwgdWludDY0X3QsIEZpeGVkNjQsIFVJbnQ2NCkKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShTRklYRUQzMiwgaW50MzJfdCwgU0ZpeGVkMzIsIEludDMyKQorICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKFNGSVhFRDY0LCBpbnQ2NF90LCBTRml4ZWQ2NCwgSW50NjQpCisKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShGTE9BVCwgZmxvYXQsIEZsb2F0LCBGbG9hdCkKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShET1VCTEUsIGRvdWJsZSwgRG91YmxlLCBEb3VibGUpCisKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShCT09MLCBib29sLCBCb29sLCBCb29sKQorI3VuZGVmIEhBTkRMRV9QUklNSVRJVkVfVFlQRQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDogeworICAgICAgICBhdXRvKiBtc2cgPSBnZXRfbWVzc2FnZV9mcm9tX2ZpZWxkKGZpZWxkLCBqKTsKKyAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OkludGVybmFsV3JpdGVHcm91cChmaWVsZC0+bnVtYmVyKCksICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBzdHJlYW0pOworICAgICAgfSBicmVhazsKKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRTogeworICAgICAgICBhdXRvKiBtc2cgPSBnZXRfbWVzc2FnZV9mcm9tX2ZpZWxkKGZpZWxkLCBqKTsKKyAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OkludGVybmFsV3JpdGVNZXNzYWdlKAorICAgICAgICAgICAgZmllbGQtPm51bWJlcigpLCAqbXNnLCBtc2ctPkdldENhY2hlZFNpemUoKSwgdGFyZ2V0LCBzdHJlYW0pOworICAgICAgfSBicmVhazsKKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTTogeworICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSA9CisgICAgICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgICAgICAgID8gbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgZmllbGQsIGopCisgICAgICAgICAgICAgICAgOiBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgZmllbGQpOworICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheShmaWVsZC0+bnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5udW1iZXIoKSwgdGFyZ2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIEhhbmRsZSBzdHJpbmdzIHNlcGFyYXRlbHkgc28gdGhhdCB3ZSBjYW4gZ2V0IHN0cmluZyByZWZlcmVuY2VzCisgICAgICAvLyBpbnN0ZWFkIG9mIGNvcHlpbmcuCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6IHsKKyAgICAgICAgYm9vbCBzdHJpY3RfdXRmOF9jaGVjayA9IFN0cmljdFV0ZjhDaGVjayhmaWVsZCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHNjcmF0Y2g7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSA9CisgICAgICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgICAgICAgID8gbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgJnNjcmF0Y2gpCisgICAgICAgICAgICAgICAgOiBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoKTsKKyAgICAgICAgaWYgKHN0cmljdF91dGY4X2NoZWNrKSB7CisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcodmFsdWUuZGF0YSgpLCB2YWx1ZS5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6U0VSSUFMSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCh2YWx1ZS5kYXRhKCksIHZhbHVlLmxlbmd0aCgpLCBTRVJJQUxJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmcoZmllbGQtPm51bWJlcigpLCB2YWx1ZSwgdGFyZ2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTOiB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHNjcmF0Y2g7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSA9CisgICAgICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgICAgICAgID8gbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgJnNjcmF0Y2gpCisgICAgICAgICAgICAgICAgOiBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoKTsKKyAgICAgICAgdGFyZ2V0ID0gc3RyZWFtLT5Xcml0ZVN0cmluZyhmaWVsZC0+bnVtYmVyKCksIHZhbHVlLCB0YXJnZXQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKwordWludDhfdCogV2lyZUZvcm1hdDo6SW50ZXJuYWxTZXJpYWxpemVNZXNzYWdlU2V0SXRlbSgKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCB1aW50OF90KiB0YXJnZXQsCisgICAgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgeworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgIC8vIFN0YXJ0IGdyb3VwLgorICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZywgdGFyZ2V0KTsKKyAgLy8gV3JpdGUgdHlwZSBJRC4KKyAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDMyVG9BcnJheSgKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZE51bWJlciwgZmllbGQtPm51bWJlcigpLCB0YXJnZXQpOworICAvLyBXcml0ZSBtZXNzYWdlLgorICBhdXRvJiBtc2cgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpOworICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6SW50ZXJuYWxXcml0ZU1lc3NhZ2UoCisgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlTnVtYmVyLCBtc2csIG1zZy5HZXRDYWNoZWRTaXplKCksCisgICAgICB0YXJnZXQsIHN0cmVhbSk7CisgIC8vIEVuZCBncm91cC4KKyAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1FbmRUYWcsIHRhcmdldCk7CisgIHJldHVybiB0YXJnZXQ7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc2l6ZV90IFdpcmVGb3JtYXQ6OkJ5dGVTaXplKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICBzaXplX3Qgb3VyX3NpemUgPSAwOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKworICAvLyBGaWVsZHMgb2YgbWFwIGVudHJ5IHNob3VsZCBhbHdheXMgYmUgc2VyaWFsaXplZC4KKyAgaWYgKGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5tYXBfZW50cnkoKSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICBmaWVsZHMucHVzaF9iYWNrKGRlc2NyaXB0b3ItPmZpZWxkKGkpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1lc3NhZ2UsICZmaWVsZHMpOworICB9CisKKyAgZm9yIChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkIDogZmllbGRzKSB7CisgICAgb3VyX3NpemUgKz0gRmllbGRCeXRlU2l6ZShmaWVsZCwgbWVzc2FnZSk7CisgIH0KKworICBpZiAoZGVzY3JpcHRvci0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICBvdXJfc2l6ZSArPSBDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUoCisgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKSk7CisgIH0gZWxzZSB7CisgICAgb3VyX3NpemUgKz0KKyAgICAgICAgQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKSk7CisgIH0KKworICByZXR1cm4gb3VyX3NpemU7Cit9CisKK3NpemVfdCBXaXJlRm9ybWF0OjpGaWVsZEJ5dGVTaXplKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIG1lc3NhZ2VfcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkgJiYKKyAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgJiYKKyAgICAgIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFICYmCisgICAgICAhZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICByZXR1cm4gTWVzc2FnZVNldEl0ZW1CeXRlU2l6ZShmaWVsZCwgbWVzc2FnZSk7CisgIH0KKworICBzaXplX3QgY291bnQgPSAwOworICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBpZiAoZmllbGQtPmlzX21hcCgpKSB7CisgICAgICBjb25zdCBNYXBGaWVsZEJhc2UqIG1hcF9maWVsZCA9CisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRNYXBEYXRhKG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgIGlmIChtYXBfZmllbGQtPklzTWFwVmFsaWQoKSkgeworICAgICAgICBjb3VudCA9IEZyb21JbnRTaXplKG1hcF9maWVsZC0+c2l6ZSgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvdW50ID0gRnJvbUludFNpemUobWVzc2FnZV9yZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgZmllbGQpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY291bnQgPSBGcm9tSW50U2l6ZShtZXNzYWdlX3JlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPm9wdGlvbnMoKS5tYXBfZW50cnkoKSkgeworICAgIC8vIE1hcCBlbnRyeSBmaWVsZHMgYWx3YXlzIG5lZWQgdG8gYmUgc2VyaWFsaXplZC4KKyAgICBjb3VudCA9IDE7CisgIH0gZWxzZSBpZiAobWVzc2FnZV9yZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBmaWVsZCkpIHsKKyAgICBjb3VudCA9IDE7CisgIH0KKworICBjb25zdCBzaXplX3QgZGF0YV9zaXplID0gRmllbGREYXRhT25seUJ5dGVTaXplKGZpZWxkLCBtZXNzYWdlKTsKKyAgc2l6ZV90IG91cl9zaXplID0gZGF0YV9zaXplOworICBpZiAoZmllbGQtPmlzX3BhY2tlZCgpKSB7CisgICAgaWYgKGRhdGFfc2l6ZSA+IDApIHsKKyAgICAgIC8vIFBhY2tlZCBmaWVsZHMgZ2V0IHNlcmlhbGl6ZWQgbGlrZSBhIHN0cmluZywgbm90IHRoZWlyIG5hdGl2ZSB0eXBlLgorICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBkb2Vzbid0IHJlYWxseSBtYXR0ZXI7IHRoZSBzaXplIG9ubHkgY2hhbmdlcyBpZiBpdCdzCisgICAgICAvLyBhIEdST1VQCisgICAgICBvdXJfc2l6ZSArPSBUYWdTaXplKGZpZWxkLT5udW1iZXIoKSwgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyk7CisgICAgICBvdXJfc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihkYXRhX3NpemUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBvdXJfc2l6ZSArPSBjb3VudCAqIFRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKTsKKyAgfQorICByZXR1cm4gb3VyX3NpemU7Cit9CisKK3NpemVfdCBNYXBLZXlEYXRhT25seUJ5dGVTaXplKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXBLZXkmIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEoRmllbGREZXNjcmlwdG9yOjpUeXBlVG9DcHBUeXBlKGZpZWxkLT50eXBlKCkpLCB2YWx1ZS50eXBlKCkpOworICBzd2l0Y2ggKGZpZWxkLT50eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEU6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVA6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOgorICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuc3VwcG9ydGVkIjsKKyAgICAgIHJldHVybiAwOworI2RlZmluZSBDQVNFX1RZUEUoRmllbGRUeXBlLCBDYW1lbEZpZWxkVHlwZSwgQ2FtZWxDcHBUeXBlKSBcCisgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFXyMjRmllbGRUeXBlOiAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OkNhbWVsRmllbGRUeXBlIyNTaXplKCAgICAgICAgICAgXAorICAgICAgICB2YWx1ZS5HZXQjI0NhbWVsQ3BwVHlwZSMjVmFsdWUoKSk7CisKKyNkZWZpbmUgRklYRURfQ0FTRV9UWVBFKEZpZWxkVHlwZSwgQ2FtZWxGaWVsZFR5cGUpIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNGaWVsZFR5cGU6ICAgICAgICAgIFwKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmsjI0NhbWVsRmllbGRUeXBlIyNTaXplOworCisgICAgICBDQVNFX1RZUEUoSU5UMzIsIEludDMyLCBJbnQzMik7CisgICAgICBDQVNFX1RZUEUoSU5UNjQsIEludDY0LCBJbnQ2NCk7CisgICAgICBDQVNFX1RZUEUoVUlOVDMyLCBVSW50MzIsIFVJbnQzMik7CisgICAgICBDQVNFX1RZUEUoVUlOVDY0LCBVSW50NjQsIFVJbnQ2NCk7CisgICAgICBDQVNFX1RZUEUoU0lOVDMyLCBTSW50MzIsIEludDMyKTsKKyAgICAgIENBU0VfVFlQRShTSU5UNjQsIFNJbnQ2NCwgSW50NjQpOworICAgICAgQ0FTRV9UWVBFKFNUUklORywgU3RyaW5nLCBTdHJpbmcpOworICAgICAgRklYRURfQ0FTRV9UWVBFKEZJWEVEMzIsIEZpeGVkMzIpOworICAgICAgRklYRURfQ0FTRV9UWVBFKEZJWEVENjQsIEZpeGVkNjQpOworICAgICAgRklYRURfQ0FTRV9UWVBFKFNGSVhFRDMyLCBTRml4ZWQzMik7CisgICAgICBGSVhFRF9DQVNFX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0KTsKKyAgICAgIEZJWEVEX0NBU0VfVFlQRShCT09MLCBCb29sKTsKKworI3VuZGVmIENBU0VfVFlQRQorI3VuZGVmIEZJWEVEX0NBU0VfVFlQRQorICB9CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW5ub3QgZ2V0IGhlcmUiOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHNpemVfdCBNYXBWYWx1ZVJlZkRhdGFPbmx5Qnl0ZVNpemUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hcFZhbHVlQ29uc3RSZWYmIHZhbHVlKSB7CisgIHN3aXRjaCAoZmllbGQtPnR5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOgorICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuc3VwcG9ydGVkIjsKKyAgICAgIHJldHVybiAwOworI2RlZmluZSBDQVNFX1RZUEUoRmllbGRUeXBlLCBDYW1lbEZpZWxkVHlwZSwgQ2FtZWxDcHBUeXBlKSBcCisgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFXyMjRmllbGRUeXBlOiAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OkNhbWVsRmllbGRUeXBlIyNTaXplKCAgICAgICAgICAgXAorICAgICAgICB2YWx1ZS5HZXQjI0NhbWVsQ3BwVHlwZSMjVmFsdWUoKSk7CisKKyNkZWZpbmUgRklYRURfQ0FTRV9UWVBFKEZpZWxkVHlwZSwgQ2FtZWxGaWVsZFR5cGUpIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNGaWVsZFR5cGU6ICAgICAgICAgIFwKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmsjI0NhbWVsRmllbGRUeXBlIyNTaXplOworCisgICAgICBDQVNFX1RZUEUoSU5UMzIsIEludDMyLCBJbnQzMik7CisgICAgICBDQVNFX1RZUEUoSU5UNjQsIEludDY0LCBJbnQ2NCk7CisgICAgICBDQVNFX1RZUEUoVUlOVDMyLCBVSW50MzIsIFVJbnQzMik7CisgICAgICBDQVNFX1RZUEUoVUlOVDY0LCBVSW50NjQsIFVJbnQ2NCk7CisgICAgICBDQVNFX1RZUEUoU0lOVDMyLCBTSW50MzIsIEludDMyKTsKKyAgICAgIENBU0VfVFlQRShTSU5UNjQsIFNJbnQ2NCwgSW50NjQpOworICAgICAgQ0FTRV9UWVBFKFNUUklORywgU3RyaW5nLCBTdHJpbmcpOworICAgICAgQ0FTRV9UWVBFKEJZVEVTLCBCeXRlcywgU3RyaW5nKTsKKyAgICAgIENBU0VfVFlQRShFTlVNLCBFbnVtLCBFbnVtKTsKKyAgICAgIENBU0VfVFlQRShNRVNTQUdFLCBNZXNzYWdlLCBNZXNzYWdlKTsKKyAgICAgIEZJWEVEX0NBU0VfVFlQRShGSVhFRDMyLCBGaXhlZDMyKTsKKyAgICAgIEZJWEVEX0NBU0VfVFlQRShGSVhFRDY0LCBGaXhlZDY0KTsKKyAgICAgIEZJWEVEX0NBU0VfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIpOworICAgICAgRklYRURfQ0FTRV9UWVBFKFNGSVhFRDY0LCBTRml4ZWQ2NCk7CisgICAgICBGSVhFRF9DQVNFX1RZUEUoRE9VQkxFLCBEb3VibGUpOworICAgICAgRklYRURfQ0FTRV9UWVBFKEZMT0FULCBGbG9hdCk7CisgICAgICBGSVhFRF9DQVNFX1RZUEUoQk9PTCwgQm9vbCk7CisKKyN1bmRlZiBDQVNFX1RZUEUKKyN1bmRlZiBGSVhFRF9DQVNFX1RZUEUKKyAgfQorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2Fubm90IGdldCBoZXJlIjsKKyAgcmV0dXJuIDA7Cit9CisKK3NpemVfdCBXaXJlRm9ybWF0OjpGaWVsZERhdGFPbmx5Qnl0ZVNpemUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICBzaXplX3QgZGF0YV9zaXplID0gMDsKKworICBpZiAoZmllbGQtPmlzX21hcCgpKSB7CisgICAgY29uc3QgTWFwRmllbGRCYXNlKiBtYXBfZmllbGQgPQorICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldE1hcERhdGEobWVzc2FnZSwgZmllbGQpOworICAgIGlmIChtYXBfZmllbGQtPklzTWFwVmFsaWQoKSkgeworICAgICAgTWFwSXRlcmF0b3IgaXRlcihjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZSksIGZpZWxkKTsKKyAgICAgIE1hcEl0ZXJhdG9yIGVuZChjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZSksIGZpZWxkKTsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5X2ZpZWxkID0gZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5maWVsZCgwKTsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsdWVfZmllbGQgPSBmaWVsZC0+bWVzc2FnZV90eXBlKCktPmZpZWxkKDEpOworICAgICAgZm9yIChtYXBfZmllbGQtPk1hcEJlZ2luKCZpdGVyKSwgbWFwX2ZpZWxkLT5NYXBFbmQoJmVuZCk7IGl0ZXIgIT0gZW5kOworICAgICAgICAgICArK2l0ZXIpIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBrTWFwRW50cnlUYWdCeXRlU2l6ZTsKKyAgICAgICAgc2l6ZSArPSBNYXBLZXlEYXRhT25seUJ5dGVTaXplKGtleV9maWVsZCwgaXRlci5HZXRLZXkoKSk7CisgICAgICAgIHNpemUgKz0gTWFwVmFsdWVSZWZEYXRhT25seUJ5dGVTaXplKHZhbHVlX2ZpZWxkLCBpdGVyLkdldFZhbHVlUmVmKCkpOworICAgICAgICBkYXRhX3NpemUgKz0gV2lyZUZvcm1hdExpdGU6Okxlbmd0aERlbGltaXRlZFNpemUoc2l6ZSk7CisgICAgICB9CisgICAgICByZXR1cm4gZGF0YV9zaXplOworICAgIH0KKyAgfQorCisgIHNpemVfdCBjb3VudCA9IDA7CisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIGNvdW50ID0KKyAgICAgICAgaW50ZXJuYWw6OkZyb21JbnRTaXplKG1lc3NhZ2VfcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkKSk7CisgIH0gZWxzZSBpZiAoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5vcHRpb25zKCkubWFwX2VudHJ5KCkpIHsKKyAgICAvLyBNYXAgZW50cnkgZmllbGRzIGFsd2F5cyBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQuCisgICAgY291bnQgPSAxOworICB9IGVsc2UgaWYgKG1lc3NhZ2VfcmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgZmllbGQpKSB7CisgICAgY291bnQgPSAxOworICB9CisKKyAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFRZUEUsIFRZUEVfTUVUSE9ELCBDUFBUWVBFX01FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV8jI1RZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGNvdW50OyBqKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkYXRhX3NpemUgKz0gV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVUSE9EIyNTaXplKCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWQjI0NQUFRZUEVfTUVUSE9EKG1lc3NhZ2UsIGZpZWxkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKSk7ICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkYXRhX3NpemUgKz0gV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVUSE9EIyNTaXplKCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0IyNDUFBUWVBFX01FVEhPRChtZXNzYWdlLCBmaWVsZCkpOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnJlYWs7CisKKyNkZWZpbmUgSEFORExFX0ZJWEVEX1RZUEUoVFlQRSwgVFlQRV9NRVRIT0QpICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkYXRhX3NpemUgKz0gY291bnQgKiBXaXJlRm9ybWF0TGl0ZTo6ayMjVFlQRV9NRVRIT0QjI1NpemU7IFwKKyAgICBicmVhazsKKworICAgIEhBTkRMRV9UWVBFKElOVDMyLCBJbnQzMiwgSW50MzIpCisgICAgSEFORExFX1RZUEUoSU5UNjQsIEludDY0LCBJbnQ2NCkKKyAgICBIQU5ETEVfVFlQRShTSU5UMzIsIFNJbnQzMiwgSW50MzIpCisgICAgSEFORExFX1RZUEUoU0lOVDY0LCBTSW50NjQsIEludDY0KQorICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgVUludDMyLCBVSW50MzIpCisgICAgSEFORExFX1RZUEUoVUlOVDY0LCBVSW50NjQsIFVJbnQ2NCkKKworICAgIEhBTkRMRV9GSVhFRF9UWVBFKEZJWEVEMzIsIEZpeGVkMzIpCisgICAgSEFORExFX0ZJWEVEX1RZUEUoRklYRUQ2NCwgRml4ZWQ2NCkKKyAgICBIQU5ETEVfRklYRURfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIpCisgICAgSEFORExFX0ZJWEVEX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0KQorCisgICAgSEFORExFX0ZJWEVEX1RZUEUoRkxPQVQsIEZsb2F0KQorICAgIEhBTkRMRV9GSVhFRF9UWVBFKERPVUJMRSwgRG91YmxlKQorCisgICAgSEFORExFX0ZJWEVEX1RZUEUoQk9PTCwgQm9vbCkKKworICAgIEhBTkRMRV9UWVBFKEdST1VQLCBHcm91cCwgTWVzc2FnZSkKKyAgICBIQU5ETEVfVFlQRShNRVNTQUdFLCBNZXNzYWdlLCBNZXNzYWdlKQorI3VuZGVmIEhBTkRMRV9UWVBFCisjdW5kZWYgSEFORExFX0ZJWEVEX1RZUEUKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU06IHsKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKKyAgICAgICAgICBkYXRhX3NpemUgKz0gV2lyZUZvcm1hdExpdGU6OkVudW1TaXplKAorICAgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFJlcGVhdGVkRW51bShtZXNzYWdlLCBmaWVsZCwgaiktPm51bWJlcigpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YV9zaXplICs9IFdpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSgKKyAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBmaWVsZCktPm51bWJlcigpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEhhbmRsZSBzdHJpbmdzIHNlcGFyYXRlbHkgc28gdGhhdCB3ZSBjYW4gZ2V0IHN0cmluZyByZWZlcmVuY2VzCisgICAgLy8gaW5zdGVhZCBvZiBjb3B5aW5nLgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzogeworICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHNjcmF0Y2g7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSA9CisgICAgICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgICAgICAgID8gbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgJnNjcmF0Y2gpCisgICAgICAgICAgICAgICAgOiBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoKTsKKyAgICAgICAgZGF0YV9zaXplICs9IFdpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gZGF0YV9zaXplOworfQorCitzaXplX3QgV2lyZUZvcm1hdDo6TWVzc2FnZVNldEl0ZW1CeXRlU2l6ZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICBzaXplX3Qgb3VyX3NpemUgPSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtVGFnc1NpemU7CisKKyAgLy8gdHlwZV9pZAorICBvdXJfc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihmaWVsZC0+bnVtYmVyKCkpOworCisgIC8vIG1lc3NhZ2UKKyAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpOworICBzaXplX3QgbWVzc2FnZV9zaXplID0gc3ViX21lc3NhZ2UuQnl0ZVNpemVMb25nKCk7CisKKyAgb3VyX3NpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIobWVzc2FnZV9zaXplKTsKKyAgb3VyX3NpemUgKz0gbWVzc2FnZV9zaXplOworCisgIHJldHVybiBvdXJfc2l6ZTsKK30KKworLy8gQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgVW5rbm93bkZpZWxkU2V0IG9uIHRoZSB3aXJlLgorc2l6ZV90IENvbXB1dGVVbmtub3duRmllbGRzU2l6ZShjb25zdCBJbnRlcm5hbE1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRvdGFsX3NpemUsIENhY2hlZFNpemUqIGNhY2hlZF9zaXplKSB7CisgIHRvdGFsX3NpemUgKz0gV2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgbWV0YWRhdGEudW5rbm93bl9maWVsZHM8VW5rbm93bkZpZWxkU2V0PigKKyAgICAgICAgICBVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpKTsKKyAgY2FjaGVkX3NpemUtPlNldChUb0NhY2hlZFNpemUodG90YWxfc2l6ZSkpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWNiZjllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oCkBAIC0wLDAgKzEsNDE0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gICAgICAgICBhdGVuYXNpb0Bnb29nbGUuY29tIChDaHJpcyBBdGVuYXNpbykgKFppZ1phZyB0cmFuc2Zvcm0pCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGhlYWRlciBpcyBsb2dpY2FsbHkgaW50ZXJuYWwsIGJ1dCBpcyBtYWRlIHB1YmxpYyBiZWNhdXNlIGl0IGlzIHVzZWQKKy8vIGZyb20gcHJvdG9jb2wtY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUsIHdoaWNoIG1heSByZXNpZGUgaW4gb3RoZXIgY29tcG9uZW50cy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9IX18KKworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGFfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wYXJzZV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKworI2lmZGVmIFNXSUcKKyNlcnJvciAiWW91IGNhbm5vdCBTV0lHIHByb3RvIGhlYWRlcnMiCisjZW5kaWYKKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK2NsYXNzIE1hcEtleTsgICAgICAgICAgIC8vIG1hcF9maWVsZC5oCitjbGFzcyBVbmtub3duRmllbGRTZXQ7ICAvLyB1bmtub3duX2ZpZWxkX3NldC5oCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhpcyBjbGFzcyBpcyBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgbGlicmFyeSBhbmQgYnkKKy8vIHByb3RvY29sLWNvbXBpbGVyLWdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMuICBJdCBtdXN0IG5vdCBiZSBjYWxsZWQKKy8vIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisvLworLy8gVGhpcyBjbGFzcyBjb250YWlucyBjb2RlIGZvciBpbXBsZW1lbnRpbmcgdGhlIGJpbmFyeSBwcm90b2NvbCBidWZmZXIKKy8vIHdpcmUgZm9ybWF0IHZpYSByZWZsZWN0aW9uLiAgVGhlIFdpcmVGb3JtYXRMaXRlIGNsYXNzIGltcGxlbWVudHMgdGhlCisvLyBub24tcmVmbGVjdGlvbiBiYXNlZCByb3V0aW5lcy4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIHJlYWxseSBhIG5hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIG9ubHkgc3RhdGljIG1ldGhvZHMKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBXaXJlRm9ybWF0IHsKKyBwdWJsaWM6CisgIC8vIEdpdmVuIGEgZmllbGQgcmV0dXJuIGl0cyBXaXJlVHlwZQorICBzdGF0aWMgaW5saW5lIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBXaXJlVHlwZUZvckZpZWxkKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyAgLy8gR2l2ZW4gYSBGaWVsZERlc2NyaXB0b3I6OlR5cGUgcmV0dXJuIGl0cyBXaXJlVHlwZQorICBzdGF0aWMgaW5saW5lIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBXaXJlVHlwZUZvckZpZWxkVHlwZSgKKyAgICAgIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKTsKKworICAvLyBDb21wdXRlIHRoZSBieXRlIHNpemUgb2YgYSB0YWcuICBGb3IgZ3JvdXBzLCB0aGlzIGluY2x1ZGVzIGJvdGggdGhlIHN0YXJ0CisgIC8vIGFuZCBlbmQgdGFncy4KKyAgc3RhdGljIGlubGluZSBzaXplX3QgVGFnU2l6ZShpbnQgZmllbGRfbnVtYmVyLCBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSk7CisKKyAgLy8gVGhlc2UgcHJvY2VkdXJlcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgdGhlIG1ldGhvZHMgb2YgTWVzc2FnZSB3aGljaAorICAvLyBoYW5kbGUgcGFyc2luZyBhbmQgc2VyaWFsaXphdGlvbiBvZiB0aGUgcHJvdG9jb2wgYnVmZmVyIHdpcmUgZm9ybWF0CisgIC8vIHVzaW5nIG9ubHkgdGhlIFJlZmxlY3Rpb24gaW50ZXJmYWNlLiAgV2hlbiB5b3UgYXNrIHRoZSBwcm90b2NvbAorICAvLyBjb21waWxlciB0byBvcHRpbWl6ZSBmb3IgY29kZSBzaXplIHJhdGhlciB0aGFuIHNwZWVkLCBpdCB3aWxsIGltcGxlbWVudAorICAvLyB0aG9zZSBtZXRob2RzIGluIHRlcm1zIG9mIHRoZXNlIHByb2NlZHVyZXMuICBPZiBjb3Vyc2UsIHRoZXNlIGFyZSBtdWNoCisgIC8vIHNsb3dlciB0aGFuIHRoZSBzcGVjaWFsaXplZCBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggdGhlIHByb3RvY29sIGNvbXBpbGVyCisgIC8vIGdlbmVyYXRlcyB3aGVuIHRvbGQgdG8gb3B0aW1pemUgZm9yIHNwZWVkLgorCisgIC8vIFJlYWQgYSBtZXNzYWdlIGluIHByb3RvY29sIGJ1ZmZlciB3aXJlIGZvcm1hdC4KKyAgLy8KKyAgLy8gVGhpcyBwcm9jZWR1cmUgcmVhZHMgZWl0aGVyIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmVhbSBvciB0aHJvdWdoCisgIC8vIGEgV0lSRVRZUEVfRU5EX0dST1VQIHRhZyBlbmRpbmcgdGhlIG1lc3NhZ2UsIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KKyAgLy8gSXQgcmV0dXJucyBmYWxzZSBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZC4KKyAgLy8KKyAgLy8gUmVxdWlyZWQgZmllbGRzIGFyZSBOT1QgY2hlY2tlZCBieSB0aGlzIG1ldGhvZC4gIFlvdSBtdXN0IGNhbGwKKyAgLy8gSXNJbml0aWFsaXplZCgpIG9uIHRoZSByZXN1bHRpbmcgbWVzc2FnZSB5b3Vyc2VsZi4KKyAgc3RhdGljIGJvb2wgUGFyc2VBbmRNZXJnZVBhcnRpYWwoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBtZXNzYWdlKTsKKworICAvLyBUaGlzIGlzIG1lYW50IGZvciBpbnRlcm5hbCBwcm90b2J1ZiB1c2UgKFdpcmVGb3JtYXQgaXMgYW4gaW50ZXJuYWwgY2xhc3MpLgorICAvLyBUaGlzIGlzIHRoZSByZWZsZWN0aXZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBfSW50ZXJuYWxQYXJzZSBmdW5jdGlvbmFsaXR5LgorICBzdGF0aWMgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoTWVzc2FnZSogbXNnLCBjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpOworCisgIC8vIFNlcmlhbGl6ZSBhIG1lc3NhZ2UgaW4gcHJvdG9jb2wgYnVmZmVyIHdpcmUgZm9ybWF0LgorICAvLworICAvLyBBbnkgZW1iZWRkZWQgbWVzc2FnZXMgd2l0aGluIHRoZSBtZXNzYWdlIG11c3QgaGF2ZSB0aGVpciBjb3JyZWN0IHNpemVzCisgIC8vIGNhY2hlZC4gIEhvd2V2ZXIsIHRoZSB0b3AtbGV2ZWwgbWVzc2FnZSBuZWVkIG5vdDsgaXRzIHNpemUgaXMgcGFzc2VkIGFzCisgIC8vIGEgcGFyYW1ldGVyIHRvIHRoaXMgcHJvY2VkdXJlLgorICAvLworICAvLyBUaGVzZSByZXR1cm4gZmFsc2UgaWZmIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSByZXR1cm5zIGEgd3JpdGUgZXJyb3IuCisgIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgICAgaW50IGV4cGVjdGVkX2VuZHBvaW50ID0gb3V0cHV0LT5CeXRlQ291bnQoKSArIHNpemU7CisgICAgb3V0cHV0LT5TZXRDdXIoCisgICAgICAgIF9JbnRlcm5hbFNlcmlhbGl6ZShtZXNzYWdlLCBvdXRwdXQtPkN1cigpLCBvdXRwdXQtPkVwc0NvcHkoKSkpOworICAgIEdPT0dMRV9DSEVDS19FUShvdXRwdXQtPkJ5dGVDb3VudCgpLCBleHBlY3RlZF9lbmRwb2ludCkKKyAgICAgICAgPDwgIjogUHJvdG9jb2wgbWVzc2FnZSBzZXJpYWxpemVkIHRvIGEgc2l6ZSBkaWZmZXJlbnQgZnJvbSB3aGF0IHdhcyAiCisgICAgICAgICAgICJvcmlnaW5hbGx5IGV4cGVjdGVkLiAgUGVyaGFwcyBpdCB3YXMgbW9kaWZpZWQgYnkgYW5vdGhlciB0aHJlYWQgIgorICAgICAgICAgICAiZHVyaW5nIHNlcmlhbGl6YXRpb24/IjsKKyAgfQorICBzdGF0aWMgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIHVpbnQ4X3QqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKTsKKworICAvLyBJbXBsZW1lbnRzIE1lc3NhZ2U6OkJ5dGVTaXplKCkgdmlhIHJlZmxlY3Rpb24uICBXQVJOSU5HOiAgVGhlIHJlc3VsdAorICAvLyBvZiB0aGlzIG1ldGhvZCBpcyAqbm90KiBjYWNoZWQgYW55d2hlcmUuICBIb3dldmVyLCBhbGwgZW1iZWRkZWQgbWVzc2FnZXMKKyAgLy8gd2lsbCBoYXZlIHRoZWlyIEJ5dGVTaXplKCkgbWV0aG9kcyBjYWxsZWQsIHNvIHRoZWlyIHNpemVzIHdpbGwgYmUgY2FjaGVkLgorICAvLyBUaGVyZWZvcmUsIGNhbGxpbmcgdGhpcyBtZXRob2QgaXMgc3VmZmljaWVudCB0byBhbGxvdyB5b3UgdG8gY2FsbAorICAvLyBXaXJlRm9ybWF0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoKSBvbiB0aGUgc2FtZSBvYmplY3QuCisgIHN0YXRpYyBzaXplX3QgQnl0ZVNpemUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gSGVscGVycyBmb3IgZGVhbGluZyB3aXRoIHVua25vd24gZmllbGRzCisKKyAgLy8gU2tpcHMgYSBmaWVsZCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gV2lyZVR5cGUuICBUaGUgaW5wdXQgc2hvdWxkIHN0YXJ0CisgIC8vIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRhZy4gIElmIHVua25vd25fZmllbGRzIGlzIG5vbi1udWxscHRyLAorICAvLyB0aGUgY29udGVudHMgb2YgdGhlIGZpZWxkIHdpbGwgYmUgYWRkZWQgdG8gaXQuCisgIHN0YXRpYyBib29sIFNraXBGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpOworCisgIC8vIFJlYWRzIGFuZCBpZ25vcmVzIGEgbWVzc2FnZSBmcm9tIHRoZSBpbnB1dC4gIElmIHVua25vd25fZmllbGRzIGlzCisgIC8vIG5vbi1udWxscHRyLCB0aGUgY29udGVudHMgd2lsbCBiZSBhZGRlZCB0byBpdC4KKyAgc3RhdGljIGJvb2wgU2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKKworICAvLyBSZWFkIGEgcGFja2VkIGVudW0gZmllbGQuIElmIHRoZSBpc192YWxpZCBmdW5jdGlvbiBpcyBub3QgbnVsbHB0ciwgdmFsdWVzCisgIC8vIGZvciB3aGljaCBpc192YWxpZCh2YWx1ZSkgcmV0dXJucyBmYWxzZSBhcmUgYXBwZW5kZWQgdG8KKyAgLy8gdW5rbm93bl9maWVsZHNfc3RyZWFtLgorICBzdGF0aWMgYm9vbCBSZWFkUGFja2VkRW51bVByZXNlcnZlVW5rbm93bnMoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAoKmlzX3ZhbGlkKShpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8aW50PiogdmFsdWVzKTsKKworICAvLyBXcml0ZSB0aGUgY29udGVudHMgb2YgYW4gVW5rbm93bkZpZWxkU2V0IHRvIHRoZSBvdXRwdXQuCisgIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZVVua25vd25GaWVsZHMoY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICAgIG91dHB1dC0+U2V0Q3VyKEludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzLCBvdXRwdXQtPkN1cigpLCBvdXRwdXQtPkVwc0NvcHkoKSkpOworICB9CisgIC8vIFNhbWUgYXMgYWJvdmUsIGV4Y2VwdCB3cml0aW5nIGRpcmVjdGx5IHRvIHRoZSBwcm92aWRlZCBidWZmZXIuCisgIC8vIFJlcXVpcmVzIHRoYXQgdGhlIGJ1ZmZlciBoYXZlIHN1ZmZpY2llbnQgY2FwYWNpdHkgZm9yCisgIC8vIENvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh1bmtub3duX2ZpZWxkcykuCisgIC8vCisgIC8vIFJldHVybnMgYSBwb2ludGVyIHBhc3QgdGhlIGxhc3Qgd3JpdHRlbiBieXRlLgorICBzdGF0aWMgdWludDhfdCogU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLCB1aW50OF90KiB0YXJnZXQpIHsKKyAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSBzdHJlYW0oCisgICAgICAgIHRhcmdldCwgc3RhdGljX2Nhc3Q8aW50PihDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodW5rbm93bl9maWVsZHMpKSwKKyAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpJc0RlZmF1bHRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYygpKTsKKyAgICByZXR1cm4gSW50ZXJuYWxTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSh1bmtub3duX2ZpZWxkcywgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0pOworICB9CisgIHN0YXRpYyB1aW50OF90KiBJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywgdWludDhfdCogdGFyZ2V0LAorICAgICAgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSk7CisKKyAgLy8gU2FtZSB0aGluZyBleGNlcHQgZm9yIG1lc3NhZ2VzIHRoYXQgaGF2ZSB0aGUgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQKKyAgLy8gb3B0aW9uLgorICBzdGF0aWMgdm9pZCBTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zKAorICAgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgICBvdXRwdXQtPlNldEN1cihJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcywgb3V0cHV0LT5DdXIoKSwgb3V0cHV0LT5FcHNDb3B5KCkpKTsKKyAgfQorICAvLyBTYW1lIGFzIGFib3ZlLCBleGNlcHQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgcHJvdmlkZWQgYnVmZmVyLgorICAvLyBSZXF1aXJlcyB0aGF0IHRoZSBidWZmZXIgaGF2ZSBzdWZmaWNpZW50IGNhcGFjaXR5IGZvcgorICAvLyBDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUodW5rbm93bl9maWVsZHMpLgorICAvLworICAvLyBSZXR1cm5zIGEgcG9pbnRlciBwYXN0IHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZS4KKyAgc3RhdGljIHVpbnQ4X3QqIFNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXNUb0FycmF5KAorICAgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywgdWludDhfdCogdGFyZ2V0KTsKKyAgc3RhdGljIHVpbnQ4X3QqIEludGVybmFsU2VyaWFsaXplVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1RvQXJyYXkoCisgICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLCB1aW50OF90KiB0YXJnZXQsCisgICAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKTsKKworICAvLyBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBVbmtub3duRmllbGRTZXQgb24gdGhlIHdpcmUuCisgIHN0YXRpYyBzaXplX3QgQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMpOworCisgIC8vIFNhbWUgdGhpbmcgZXhjZXB0IGZvciBtZXNzYWdlcyB0aGF0IGhhdmUgdGhlIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0CisgIC8vIG9wdGlvbi4KKyAgc3RhdGljIHNpemVfdCBDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUoCisgICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKTsKKworICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgdGFncy4gIChJbmxpbmVkIGJlbG93IGFuZCBpbgorICAvLyBfaW5sLmgpCisgIC8vCisgIC8vIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gTWFrZVRhZyhmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCkpIGluIHRoZQorICAvLyBjYXNlIG9mIHBhY2tlZCByZXBlYXRlZCBmaWVsZHMuCisgIHN0YXRpYyB1aW50MzJfdCBNYWtlVGFnKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIC8vIFBhcnNlIGEgc2luZ2xlIGZpZWxkLiAgVGhlIGlucHV0IHNob3VsZCBzdGFydCBvdXQgcG9zaXRpb25lZCBpbW1lZGlhdGVseQorICAvLyBhZnRlciB0aGUgdGFnLgorICBzdGF0aWMgYm9vbCBQYXJzZUFuZE1lcmdlRmllbGQoCisgICAgICB1aW50MzJfdCB0YWcsCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgLy8gTWF5IGJlIG51bGxwdHIgZm9yIHVua25vd24KKyAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisKKyAgLy8gU2VyaWFsaXplIGEgc2luZ2xlIGZpZWxkLgorICBzdGF0aWMgdm9pZCBTZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplcygKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsICAvLyBDYW5ub3QgYmUgbnVsbHB0cgorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgICBvdXRwdXQtPlNldEN1cihJbnRlcm5hbFNlcmlhbGl6ZUZpZWxkKGZpZWxkLCBtZXNzYWdlLCBvdXRwdXQtPkN1cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5FcHNDb3B5KCkpKTsKKyAgfQorICBzdGF0aWMgdWludDhfdCogSW50ZXJuYWxTZXJpYWxpemVGaWVsZCgKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsICAvLyBDYW5ub3QgYmUgbnVsbHB0cgorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgdWludDhfdCogdGFyZ2V0LCBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKTsKKworICAvLyBDb21wdXRlIHNpemUgb2YgYSBzaW5nbGUgZmllbGQuICBJZiB0aGUgZmllbGQgaXMgYSBtZXNzYWdlIHR5cGUsIHRoaXMKKyAgLy8gd2lsbCBjYWxsIEJ5dGVTaXplKCkgZm9yIHRoZSBlbWJlZGRlZCBtZXNzYWdlLCBpbnN1cmluZyB0aGF0IGl0IGNhY2hlcworICAvLyBpdHMgc2l6ZS4KKyAgc3RhdGljIHNpemVfdCBGaWVsZEJ5dGVTaXplKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsICAvLyBDYW4ndCBiZSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKKworICAvLyBQYXJzZS9zZXJpYWxpemUgYSBNZXNzYWdlU2V0OjpJdGVtIGdyb3VwLiAgVXNlZCB3aXRoIG1lc3NhZ2VzIHRoYXQgdXNlCisgIC8vIG9wdGlvbiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IHRydWUuCisgIHN0YXRpYyBib29sIFBhcnNlQW5kTWVyZ2VNZXNzYWdlU2V0SXRlbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgU2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXMoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgICBvdXRwdXQtPlNldEN1cihJbnRlcm5hbFNlcmlhbGl6ZU1lc3NhZ2VTZXRJdGVtKAorICAgICAgICBmaWVsZCwgbWVzc2FnZSwgb3V0cHV0LT5DdXIoKSwgb3V0cHV0LT5FcHNDb3B5KCkpKTsKKyAgfQorICBzdGF0aWMgdWludDhfdCogSW50ZXJuYWxTZXJpYWxpemVNZXNzYWdlU2V0SXRlbSgKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIHVpbnQ4X3QqIHRhcmdldCwKKyAgICAgIGlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pOworICBzdGF0aWMgc2l6ZV90IE1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworCisgIC8vIENvbXB1dGVzIHRoZSBieXRlIHNpemUgb2YgYSBmaWVsZCwgZXhjbHVkaW5nIHRhZ3MuIEZvciBwYWNrZWQgZmllbGRzLCBpdAorICAvLyBvbmx5IGluY2x1ZGVzIHRoZSBzaXplIG9mIHRoZSByYXcgZGF0YSwgYW5kIG5vdCB0aGUgc2l6ZSBvZiB0aGUgdG90YWwKKyAgLy8gbGVuZ3RoLCBidXQgZm9yIG90aGVyIGxlbmd0aC1kZWxpbWl0ZWQgdHlwZXMsIHRoZSBzaXplIG9mIHRoZSBsZW5ndGggaXMKKyAgLy8gaW5jbHVkZWQuCisgIHN0YXRpYyBzaXplX3QgRmllbGREYXRhT25seUJ5dGVTaXplKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgIC8vIENhbm5vdCBiZSBudWxscHRyCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKKworICBlbnVtIE9wZXJhdGlvbiB7CisgICAgUEFSU0UgPSAwLAorICAgIFNFUklBTElaRSA9IDEsCisgIH07CisKKyAgLy8gVmVyaWZpZXMgdGhhdCBhIHN0cmluZyBmaWVsZCBpcyB2YWxpZCBVVEY4LCBsb2dnaW5nIGFuIGVycm9yIGlmIG5vdC4KKyAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBiZSBjYWxsZWQgYnkgbmV3bHkgZ2VuZXJhdGVkIHByb3RvYnVmIGNvZGUKKyAgLy8gYnV0IHJlbWFpbnMgcHJlc2VudCB0byBzdXBwb3J0IGV4aXN0aW5nIGNvZGUuCisgIHN0YXRpYyB2b2lkIFZlcmlmeVVURjhTdHJpbmcoY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUsIE9wZXJhdGlvbiBvcCk7CisgIC8vIFRoZSBOYW1lZEZpZWxkIHZhcmlhbnQgdGFrZXMgYSBmaWVsZCBuYW1lIGluIG9yZGVyIHRvIHByb2R1Y2UgYW4KKyAgLy8gaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZSBpZiB2ZXJpZmljYXRpb24gZmFpbHMuCisgIHN0YXRpYyB2b2lkIFZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3AsIGNvbnN0IGNoYXIqIGZpZWxkX25hbWUpOworCisgcHJpdmF0ZToKKyAgc3RydWN0IE1lc3NhZ2VTZXRQYXJzZXI7CisgIC8vIFNraXAgYSBNZXNzYWdlU2V0IGZpZWxkLgorICBzdGF0aWMgYm9vbCBTa2lwTWVzc2FnZVNldEZpZWxkKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7CisKKyAgLy8gUGFyc2UgYSBNZXNzYWdlU2V0IGZpZWxkLgorICBzdGF0aWMgYm9vbCBQYXJzZUFuZE1lcmdlTWVzc2FnZVNldEZpZWxkKHVpbnQzMl90IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgLy8gUGFyc2VzIHRoZSB2YWx1ZSBmcm9tIHRoZSB3aXJlIHRoYXQgYmVsb25ncyB0byB0YWcuCisgIHN0YXRpYyBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZUFuZE1lcmdlRmllbGQoTWVzc2FnZSogbXNnLCBjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXaXJlRm9ybWF0KTsKK307CisKKy8vIFN1YmNsYXNzIG9mIEZpZWxkU2tpcHBlciB3aGljaCBzYXZlcyBza2lwcGVkIGZpZWxkcyB0byBhbiBVbmtub3duRmllbGRTZXQuCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgVW5rbm93bkZpZWxkU2V0RmllbGRTa2lwcGVyIDogcHVibGljIEZpZWxkU2tpcHBlciB7CisgcHVibGljOgorICBVbmtub3duRmllbGRTZXRGaWVsZFNraXBwZXIoVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykKKyAgICAgIDogdW5rbm93bl9maWVsZHNfKHVua25vd25fZmllbGRzKSB7fQorICB+VW5rbm93bkZpZWxkU2V0RmllbGRTa2lwcGVyKCkgb3ZlcnJpZGUge30KKworICAvLyBpbXBsZW1lbnRzIEZpZWxkU2tpcHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIFNraXBGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQzMl90IHRhZykgb3ZlcnJpZGU7CisgIGJvb2wgU2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSBvdmVycmlkZTsKKyAgdm9pZCBTa2lwVW5rbm93bkVudW0oaW50IGZpZWxkX251bWJlciwgaW50IHZhbHVlKSBvdmVycmlkZTsKKworIHByb3RlY3RlZDoKKyAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkc187Cit9OworCisvLyBpbmxpbmUgbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2lubGluZSBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgV2lyZUZvcm1hdDo6V2lyZVR5cGVGb3JGaWVsZCgKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGlmIChmaWVsZC0+aXNfcGFja2VkKCkpIHsKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFdpcmVUeXBlRm9yRmllbGRUeXBlKGZpZWxkLT50eXBlKCkpOworICB9Cit9CisKK2lubGluZSBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgV2lyZUZvcm1hdDo6V2lyZVR5cGVGb3JGaWVsZFR5cGUoCisgICAgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKKyAgLy8gU29tZSBjb21waWxlcnMgZG9uJ3QgbGlrZSBlbnVtIC0+IGVudW0gY2FzdHMsIHNvIHdlIGltcGxpY2l0X2Nhc3QgdG8KKyAgLy8gaW50IGZpcnN0LgorICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlRm9yRmllbGRUeXBlKAorICAgICAgc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZT4oaW1wbGljaXRfY2FzdDxpbnQ+KHR5cGUpKSk7Cit9CisKK2lubGluZSB1aW50MzJfdCBXaXJlRm9ybWF0OjpNYWtlVGFnKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLT5udW1iZXIoKSwgV2lyZVR5cGVGb3JGaWVsZChmaWVsZCkpOworfQorCitpbmxpbmUgc2l6ZV90IFdpcmVGb3JtYXQ6OlRhZ1NpemUoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgeworICAvLyBTb21lIGNvbXBpbGVycyBkb24ndCBsaWtlIGVudW0gLT4gZW51bSBjYXN0cywgc28gd2UgaW1wbGljaXRfY2FzdCB0bworICAvLyBpbnQgZmlyc3QuCisgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6VGFnU2l6ZSgKKyAgICAgIGZpZWxkX251bWJlciwKKyAgICAgIHN0YXRpY19jYXN0PFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGU+KGltcGxpY2l0X2Nhc3Q8aW50Pih0eXBlKSkpOworfQorCitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0OjpPcGVyYXRpb24gb3ApIHsKKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKKyAgV2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICBkYXRhLCBzaXplLCBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6T3BlcmF0aW9uPihvcCksIG51bGxwdHIpOworI2Vsc2UKKyAgLy8gQXZvaWQgdGhlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW51c2VkIHZhcmlhYmxlcy4KKyAgKHZvaWQpZGF0YTsKKyAgKHZvaWQpc2l6ZTsKKyAgKHZvaWQpb3A7CisjZW5kaWYKK30KKworaW5saW5lIHZvaWQgV2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0OjpPcGVyYXRpb24gb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWVsZF9uYW1lKSB7CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECisgIFdpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKAorICAgICAgZGF0YSwgc2l6ZSwgc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6Ok9wZXJhdGlvbj4ob3ApLCBmaWVsZF9uYW1lKTsKKyNlbHNlCisgIC8vIEF2b2lkIHRoZSBjb21waWxlciB3YXJuaW5nIGFib3V0IHVudXNlZCB2YXJpYWJsZXMuCisgICh2b2lkKWRhdGE7CisgICh2b2lkKXNpemU7CisgICh2b2lkKW9wOworICAodm9pZClmaWVsZF9uYW1lOworI2VuZGlmCit9CisKKworaW5saW5lIHVpbnQ4X3QqIEludGVybmFsU2VyaWFsaXplVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1RvQXJyYXkoCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywgdWludDhfdCogdGFyZ2V0LAorICAgIGlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIHsKKyAgcmV0dXJuIFdpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1RvQXJyYXkoCisgICAgICB1bmtub3duX2ZpZWxkcywgdGFyZ2V0LCBzdHJlYW0pOworfQorCitpbmxpbmUgc2l6ZV90IENvbXB1dGVVbmtub3duTWVzc2FnZVNldEl0ZW1zU2l6ZSgKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKSB7CisgIHJldHVybiBXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUodW5rbm93bl9maWVsZHMpOworfQorCisvLyBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBVbmtub3duRmllbGRTZXQgb24gdGhlIHdpcmUuCitQUk9UT0JVRl9FWFBPUlQKK3NpemVfdCBDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoY29uc3QgSW50ZXJuYWxNZXRhZGF0YSYgbWV0YWRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZWRTaXplKiBjYWNoZWRfc2l6ZSk7CisKK3NpemVfdCBNYXBLZXlEYXRhT25seUJ5dGVTaXplKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXBLZXkmIHZhbHVlKTsKKwordWludDhfdCogU2VyaWFsaXplTWFwS2V5V2l0aENhY2hlZFNpemVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFwS2V5JiB2YWx1ZSwgdWludDhfdCogdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pOworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuY2MgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiMWNhMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5jYwpAQCAtMCwwICsxLDgxOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oPgorCisKKy8vIE11c3QgYmUgaW5jbHVkZWQgbGFzdC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IChfTVNDX1ZFUiA+PSAxOTAwICYmIF9NU0NfVkVSIDwgMTkxMikKKy8vIE9sZCB2ZXJzaW9uIG9mIE1TVkMgZG9lc24ndCBsaWtlIGRlZmluaXRpb25zIG9mIGlubGluZSBjb25zdGFudHMsIEdDQworLy8gcmVxdWlyZXMgdGhlbS4KK2NvbnN0IGludCBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtU3RhcnRUYWc7Citjb25zdCBpbnQgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZzsKK2NvbnN0IGludCBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRUeXBlSWRUYWc7Citjb25zdCBpbnQgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZVRhZzsKKworI2VuZGlmCisKKy8vIElCTSB4bEMgcmVxdWlyZXMgcHJlZml4aW5nIGNvbnN0YW50cyB3aXRoIFdpcmVGb3JtYXRMaXRlOjoKK2NvbnN0IHNpemVfdCBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtVGFnc1NpemUgPQorICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6U3RhdGljVmFyaW50U2l6ZTMyPAorICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtU3RhcnRUYWc+Ojp2YWx1ZSArCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpTdGF0aWNWYXJpbnRTaXplMzI8CisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1FbmRUYWc+Ojp2YWx1ZSArCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpTdGF0aWNWYXJpbnRTaXplMzI8CisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZz46OnZhbHVlICsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlN0YXRpY1ZhcmludFNpemUzMjwKKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZVRhZz46OnZhbHVlOworCitjb25zdCBXaXJlRm9ybWF0TGl0ZTo6Q3BwVHlwZQorICAgIFdpcmVGb3JtYXRMaXRlOjprRmllbGRUeXBlVG9DcHBUeXBlTWFwW01BWF9GSUVMRF9UWVBFICsgMV0gPSB7CisgICAgICAgIHN0YXRpY19jYXN0PENwcFR5cGU+KDApLCAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzCisKKyAgICAgICAgQ1BQVFlQRV9ET1VCTEUsICAgLy8gVFlQRV9ET1VCTEUKKyAgICAgICAgQ1BQVFlQRV9GTE9BVCwgICAgLy8gVFlQRV9GTE9BVAorICAgICAgICBDUFBUWVBFX0lOVDY0LCAgICAvLyBUWVBFX0lOVDY0CisgICAgICAgIENQUFRZUEVfVUlOVDY0LCAgIC8vIFRZUEVfVUlOVDY0CisgICAgICAgIENQUFRZUEVfSU5UMzIsICAgIC8vIFRZUEVfSU5UMzIKKyAgICAgICAgQ1BQVFlQRV9VSU5UNjQsICAgLy8gVFlQRV9GSVhFRDY0CisgICAgICAgIENQUFRZUEVfVUlOVDMyLCAgIC8vIFRZUEVfRklYRUQzMgorICAgICAgICBDUFBUWVBFX0JPT0wsICAgICAvLyBUWVBFX0JPT0wKKyAgICAgICAgQ1BQVFlQRV9TVFJJTkcsICAgLy8gVFlQRV9TVFJJTkcKKyAgICAgICAgQ1BQVFlQRV9NRVNTQUdFLCAgLy8gVFlQRV9HUk9VUAorICAgICAgICBDUFBUWVBFX01FU1NBR0UsICAvLyBUWVBFX01FU1NBR0UKKyAgICAgICAgQ1BQVFlQRV9TVFJJTkcsICAgLy8gVFlQRV9CWVRFUworICAgICAgICBDUFBUWVBFX1VJTlQzMiwgICAvLyBUWVBFX1VJTlQzMgorICAgICAgICBDUFBUWVBFX0VOVU0sICAgICAvLyBUWVBFX0VOVU0KKyAgICAgICAgQ1BQVFlQRV9JTlQzMiwgICAgLy8gVFlQRV9TRklYRUQzMgorICAgICAgICBDUFBUWVBFX0lOVDY0LCAgICAvLyBUWVBFX1NGSVhFRDY0CisgICAgICAgIENQUFRZUEVfSU5UMzIsICAgIC8vIFRZUEVfU0lOVDMyCisgICAgICAgIENQUFRZUEVfSU5UNjQsICAgIC8vIFRZUEVfU0lOVDY0Cit9OworCitjb25zdCBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUKKyAgICBXaXJlRm9ybWF0TGl0ZTo6a1dpcmVUeXBlRm9yRmllbGRUeXBlW01BWF9GSUVMRF9UWVBFICsgMV0gPSB7CisgICAgICAgIHN0YXRpY19jYXN0PFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZT4oLTEpLCAgLy8gaW52YWxpZAorICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NCwgICAgICAgICAgIC8vIFRZUEVfRE9VQkxFCisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyLCAgICAgICAgICAgLy8gVFlQRV9GTE9BVAorICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5ULCAgICAgICAgICAgIC8vIFRZUEVfSU5UNjQKKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgICAgICAgICAgICAvLyBUWVBFX1VJTlQ2NAorICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5ULCAgICAgICAgICAgIC8vIFRZUEVfSU5UMzIKKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQsICAgICAgICAgICAvLyBUWVBFX0ZJWEVENjQKKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzIsICAgICAgICAgICAvLyBUWVBFX0ZJWEVEMzIKKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgICAgICAgICAgICAvLyBUWVBFX0JPT0wKKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsICAvLyBUWVBFX1NUUklORworICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVAsICAgICAgIC8vIFRZUEVfR1JPVVAKKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsICAvLyBUWVBFX01FU1NBR0UKKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsICAvLyBUWVBFX0JZVEVTCisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQsICAgICAgICAgICAgLy8gVFlQRV9VSU5UMzIKKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgICAgICAgICAgICAvLyBUWVBFX0VOVU0KKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzIsICAgICAgICAgICAvLyBUWVBFX1NGSVhFRDMyCisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDY0LCAgICAgICAgICAgLy8gVFlQRV9TRklYRUQ2NAorICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5ULCAgICAgICAgICAgIC8vIFRZUEVfU0lOVDMyCisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQsICAgICAgICAgICAgLy8gVFlQRV9TSU5UNjQKK307CisKK2Jvb2wgV2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQzMl90IHRhZykgeworICAvLyBGaWVsZCBudW1iZXIgMCBpcyBpbGxlZ2FsLgorICBpZiAoV2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykgPT0gMCkgcmV0dXJuIGZhbHNlOworICBzd2l0Y2ggKFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpKSB7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UOiB7CisgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQ2NCgmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NDogeworICAgICAgdWludDY0X3QgdmFsdWU7CisgICAgICBpZiAoIWlucHV0LT5SZWFkTGl0dGxlRW5kaWFuNjQoJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6IHsKKyAgICAgIHVpbnQzMl90IGxlbmd0aDsKKyAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCFpbnB1dC0+U2tpcChsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVA6IHsKKyAgICAgIGlmICghaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghU2tpcE1lc3NhZ2UoaW5wdXQpKSByZXR1cm4gZmFsc2U7CisgICAgICBpbnB1dC0+RGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGVuZGluZyB0YWcgbWF0Y2hlZCB0aGUgc3RhcnRpbmcgdGFnLgorICAgICAgaWYgKCFpbnB1dC0+TGFzdFRhZ1dhcygKKyAgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoV2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQOiB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzI6IHsKKyAgICAgIHVpbnQzMl90IHZhbHVlOworICAgICAgaWYgKCFpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CisKK2Jvb2wgV2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICAvLyBGaWVsZCBudW1iZXIgMCBpcyBpbGxlZ2FsLgorICBpZiAoV2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykgPT0gMCkgcmV0dXJuIGZhbHNlOworICBzd2l0Y2ggKFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpKSB7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UOiB7CisgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQ2NCgmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIodGFnKTsKKyAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQ2NCh2YWx1ZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NDogeworICAgICAgdWludDY0X3QgdmFsdWU7CisgICAgICBpZiAoIWlucHV0LT5SZWFkTGl0dGxlRW5kaWFuNjQoJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHRhZyk7CisgICAgICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuNjQodmFsdWUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6IHsKKyAgICAgIHVpbnQzMl90IGxlbmd0aDsKKyAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHRhZyk7CisgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIobGVuZ3RoKTsKKyAgICAgIC8vIFRPRE8obWtpbGF2dXopOiBQcm92aWRlIEFQSSB0byBwcmV2ZW50IGV4dHJhIHN0cmluZyBjb3B5aW5nLgorICAgICAgc3RkOjpzdHJpbmcgdGVtcDsKKyAgICAgIGlmICghaW5wdXQtPlJlYWRTdHJpbmcoJnRlbXAsIGxlbmd0aCkpIHJldHVybiBmYWxzZTsKKyAgICAgIG91dHB1dC0+V3JpdGVTdHJpbmcodGVtcCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVA6IHsKKyAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMih0YWcpOworICAgICAgaWYgKCFpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCFTa2lwTWVzc2FnZShpbnB1dCwgb3V0cHV0KSkgcmV0dXJuIGZhbHNlOworICAgICAgaW5wdXQtPkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAvLyBDaGVjayB0aGF0IHRoZSBlbmRpbmcgdGFnIG1hdGNoZWQgdGhlIHN0YXJ0aW5nIHRhZy4KKyAgICAgIGlmICghaW5wdXQtPkxhc3RUYWdXYXMoCisgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUDogeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyOiB7CisgICAgICB1aW50MzJfdCB2YWx1ZTsKKyAgICAgIGlmICghaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIodGFnKTsKKyAgICAgIG91dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW4zMih2YWx1ZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQorCitib29sIFdpcmVGb3JtYXRMaXRlOjpTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB1aW50MzJfdCB0YWcgPSBpbnB1dC0+UmVhZFRhZygpOworICAgIGlmICh0YWcgPT0gMCkgeworICAgICAgLy8gRW5kIG9mIGlucHV0LiAgVGhpcyBpcyBhIHZhbGlkIHBsYWNlIHRvIGVuZCwgc28gcmV0dXJuIHRydWUuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZyk7CisKKyAgICBpZiAod2lyZV90eXBlID09IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgIC8vIE11c3QgYmUgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZS4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICghU2tpcEZpZWxkKGlucHV0LCB0YWcpKSByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBXaXJlRm9ybWF0TGl0ZTo6U2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB1aW50MzJfdCB0YWcgPSBpbnB1dC0+UmVhZFRhZygpOworICAgIGlmICh0YWcgPT0gMCkgeworICAgICAgLy8gRW5kIG9mIGlucHV0LiAgVGhpcyBpcyBhIHZhbGlkIHBsYWNlIHRvIGVuZCwgc28gcmV0dXJuIHRydWUuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZyk7CisKKyAgICBpZiAod2lyZV90eXBlID09IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMih0YWcpOworICAgICAgLy8gTXVzdCBiZSB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKCFTa2lwRmllbGQoaW5wdXQsIHRhZywgb3V0cHV0KSkgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgRmllbGRTa2lwcGVyOjpTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzJfdCB0YWcpIHsKKyAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZyk7Cit9CisKK2Jvb2wgRmllbGRTa2lwcGVyOjpTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpTa2lwTWVzc2FnZShpbnB1dCk7Cit9CisKK3ZvaWQgRmllbGRTa2lwcGVyOjpTa2lwVW5rbm93bkVudW0oaW50IC8qIGZpZWxkX251bWJlciAqLywgaW50IC8qIHZhbHVlICovKSB7CisgIC8vIE5vdGhpbmcuCit9CisKK2Jvb2wgQ29kZWRPdXRwdXRTdHJlYW1GaWVsZFNraXBwZXI6OlNraXBGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGFnKSB7CisgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIHVua25vd25fZmllbGRzXyk7Cit9CisKK2Jvb2wgQ29kZWRPdXRwdXRTdHJlYW1GaWVsZFNraXBwZXI6OlNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OlNraXBNZXNzYWdlKGlucHV0LCB1bmtub3duX2ZpZWxkc18pOworfQorCit2b2lkIENvZGVkT3V0cHV0U3RyZWFtRmllbGRTa2lwcGVyOjpTa2lwVW5rbm93bkVudW0oaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIHsKKyAgdW5rbm93bl9maWVsZHNfLT5Xcml0ZVZhcmludDMyKGZpZWxkX251bWJlcik7CisgIHVua25vd25fZmllbGRzXy0+V3JpdGVWYXJpbnQ2NCh2YWx1ZSk7Cit9CisKK2Jvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRFbnVtUHJlc2VydmVVbmtub3ducygKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIGludCBmaWVsZF9udW1iZXIsIGJvb2wgKCppc192YWxpZCkoaW50KSwKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIHVua25vd25fZmllbGRzX3N0cmVhbSwgUmVwZWF0ZWRGaWVsZDxpbnQ+KiB2YWx1ZXMpIHsKKyAgdWludDMyX3QgbGVuZ3RoOworICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJmxlbmd0aCkpIHJldHVybiBmYWxzZTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gaW5wdXQtPlB1c2hMaW1pdChsZW5ndGgpOworICB3aGlsZSAoaW5wdXQtPkJ5dGVzVW50aWxMaW1pdCgpID4gMCkgeworICAgIGludCB2YWx1ZTsKKyAgICBpZiAoIVJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPihpbnB1dCwgJnZhbHVlKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfdmFsaWQgPT0gbnVsbHB0ciB8fCBpc192YWxpZCh2YWx1ZSkpIHsKKyAgICAgIHZhbHVlcy0+QWRkKHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgdWludDMyX3QgdGFnID0gV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCk7CisgICAgICB1bmtub3duX2ZpZWxkc19zdHJlYW0tPldyaXRlVmFyaW50MzIodGFnKTsKKyAgICAgIHVua25vd25fZmllbGRzX3N0cmVhbS0+V3JpdGVWYXJpbnQzMih2YWx1ZSk7CisgICAgfQorICB9CisgIGlucHV0LT5Qb3BMaW1pdChsaW1pdCk7CisgIHJldHVybiB0cnVlOworfQorCisjaWYgIWRlZmluZWQoUFJPVE9CVUZfTElUVExFX0VORElBTikKKworbmFtZXNwYWNlIHsKK3ZvaWQgRW5jb2RlRml4ZWRTaXplVmFsdWUoZmxvYXQgdiwgdWludDhfdCogZGVzdCkgeworICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdE5vVGFnVG9BcnJheSh2LCBkZXN0KTsKK30KKwordm9pZCBFbmNvZGVGaXhlZFNpemVWYWx1ZShkb3VibGUgdiwgdWludDhfdCogZGVzdCkgeworICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVEb3VibGVOb1RhZ1RvQXJyYXkodiwgZGVzdCk7Cit9CisKK3ZvaWQgRW5jb2RlRml4ZWRTaXplVmFsdWUodWludDMyX3QgdiwgdWludDhfdCogZGVzdCkgeworICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDMyTm9UYWdUb0FycmF5KHYsIGRlc3QpOworfQorCit2b2lkIEVuY29kZUZpeGVkU2l6ZVZhbHVlKHVpbnQ2NF90IHYsIHVpbnQ4X3QqIGRlc3QpIHsKKyAgV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQ2NE5vVGFnVG9BcnJheSh2LCBkZXN0KTsKK30KKwordm9pZCBFbmNvZGVGaXhlZFNpemVWYWx1ZShpbnQzMl90IHYsIHVpbnQ4X3QqIGRlc3QpIHsKKyAgV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkMzJOb1RhZ1RvQXJyYXkodiwgZGVzdCk7Cit9CisKK3ZvaWQgRW5jb2RlRml4ZWRTaXplVmFsdWUoaW50NjRfdCB2LCB1aW50OF90KiBkZXN0KSB7CisgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNGaXhlZDY0Tm9UYWdUb0FycmF5KHYsIGRlc3QpOworfQorCit2b2lkIEVuY29kZUZpeGVkU2l6ZVZhbHVlKGJvb2wgdiwgdWludDhfdCogZGVzdCkgeworICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sTm9UYWdUb0FycmF5KHYsIGRlc3QpOworfQorfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisjZW5kaWYgIC8vICFkZWZpbmVkKFBST1RPQlVGX0xJVFRMRV9FTkRJQU4pCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZT4KK3N0YXRpYyB2b2lkIFdyaXRlQXJyYXkoY29uc3QgQ1R5cGUqIGEsIGludCBuLCBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworI2lmIGRlZmluZWQoUFJPVE9CVUZfTElUVExFX0VORElBTikKKyAgb3V0cHV0LT5Xcml0ZVJhdyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihhKSwgbiAqIHNpemVvZihhWzBdKSk7CisjZWxzZQorICBjb25zdCBpbnQga0F0QVRpbWUgPSAxMjg7CisgIHVpbnQ4X3QgYnVmW3NpemVvZihDVHlwZSkgKiBrQXRBVGltZV07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSArPSBrQXRBVGltZSkgeworICAgIGludCB0b19kbyA9IHN0ZDo6bWluKGtBdEFUaW1lLCBuIC0gaSk7CisgICAgdWludDhfdCogcHRyID0gYnVmOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgdG9fZG87IGorKykgeworICAgICAgRW5jb2RlRml4ZWRTaXplVmFsdWUoYVtpICsgal0sIHB0cik7CisgICAgICBwdHIgKz0gc2l6ZW9mKGFbMF0pOworICAgIH0KKyAgICBvdXRwdXQtPldyaXRlUmF3KGJ1ZiwgdG9fZG8gKiBzaXplb2YoYVswXSkpOworICB9CisjZW5kaWYKK30KKwordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdEFycmF5KGNvbnN0IGZsb2F0KiBhLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZUFycmF5PGZsb2F0PihhLCBuLCBvdXRwdXQpOworfQorCit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZURvdWJsZUFycmF5KGNvbnN0IGRvdWJsZSogYSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlQXJyYXk8ZG91YmxlPihhLCBuLCBvdXRwdXQpOworfQorCit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkMzJBcnJheShjb25zdCB1aW50MzJfdCogYSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZUFycmF5PHVpbnQzMl90PihhLCBuLCBvdXRwdXQpOworfQorCit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkNjRBcnJheShjb25zdCB1aW50NjRfdCogYSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZUFycmF5PHVpbnQ2NF90PihhLCBuLCBvdXRwdXQpOworfQorCit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNGaXhlZDMyQXJyYXkoY29uc3QgaW50MzJfdCogYSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVBcnJheTxpbnQzMl90PihhLCBuLCBvdXRwdXQpOworfQorCit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNGaXhlZDY0QXJyYXkoY29uc3QgaW50NjRfdCogYSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVBcnJheTxpbnQ2NF90PihhLCBuLCBvdXRwdXQpOworfQorCit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xBcnJheShjb25zdCBib29sKiBhLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlQXJyYXk8Ym9vbD4oYSwgbiwgb3V0cHV0KTsKK30KKwordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMihpbnQgZmllbGRfbnVtYmVyLCBpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgb3V0cHV0KTsKKyAgV3JpdGVJbnQzMk5vVGFnKHZhbHVlLCBvdXRwdXQpOworfQordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQ2NChpbnQgZmllbGRfbnVtYmVyLCBpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgb3V0cHV0KTsKKyAgV3JpdGVJbnQ2NE5vVGFnKHZhbHVlLCBvdXRwdXQpOworfQordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzIoaW50IGZpZWxkX251bWJlciwgdWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgb3V0cHV0KTsKKyAgV3JpdGVVSW50MzJOb1RhZyh2YWx1ZSwgb3V0cHV0KTsKK30KK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDY0KGludCBmaWVsZF9udW1iZXIsIHVpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIG91dHB1dCk7CisgIFdyaXRlVUludDY0Tm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQzMihpbnQgZmllbGRfbnVtYmVyLCBpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIG91dHB1dCk7CisgIFdyaXRlU0ludDMyTm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQ2NChpbnQgZmllbGRfbnVtYmVyLCBpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIG91dHB1dCk7CisgIFdyaXRlU0ludDY0Tm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkMzIoaW50IGZpZWxkX251bWJlciwgdWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDMyLCBvdXRwdXQpOworICBXcml0ZUZpeGVkMzJOb1RhZyh2YWx1ZSwgb3V0cHV0KTsKK30KK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQ2NChpbnQgZmllbGRfbnVtYmVyLCB1aW50NjRfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVENjQsIG91dHB1dCk7CisgIFdyaXRlRml4ZWQ2NE5vVGFnKHZhbHVlLCBvdXRwdXQpOworfQordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTRml4ZWQzMihpbnQgZmllbGRfbnVtYmVyLCBpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVEMzIsIG91dHB1dCk7CisgIFdyaXRlU0ZpeGVkMzJOb1RhZyh2YWx1ZSwgb3V0cHV0KTsKK30KK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkNjQoaW50IGZpZWxkX251bWJlciwgaW50NjRfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDY0LCBvdXRwdXQpOworICBXcml0ZVNGaXhlZDY0Tm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZsb2F0KGludCBmaWVsZF9udW1iZXIsIGZsb2F0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVEMzIsIG91dHB1dCk7CisgIFdyaXRlRmxvYXROb1RhZyh2YWx1ZSwgb3V0cHV0KTsKK30KK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlRG91YmxlKGludCBmaWVsZF9udW1iZXIsIGRvdWJsZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRklYRUQ2NCwgb3V0cHV0KTsKKyAgV3JpdGVEb3VibGVOb1RhZyh2YWx1ZSwgb3V0cHV0KTsKK30KK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbChpbnQgZmllbGRfbnVtYmVyLCBib29sIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCBvdXRwdXQpOworICBXcml0ZUJvb2xOb1RhZyh2YWx1ZSwgb3V0cHV0KTsKK30KK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlRW51bShpbnQgZmllbGRfbnVtYmVyLCBpbnQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIG91dHB1dCk7CisgIFdyaXRlRW51bU5vVGFnKHZhbHVlLCBvdXRwdXQpOworfQorCitjb25zdGV4cHIgc2l6ZV90IGtJbnQzMk1heFNpemUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKTsKKwordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoaW50IGZpZWxkX251bWJlciwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgLy8gU3RyaW5nIGlzIGZvciBVVEYtOCB0ZXh0IG9ubHkKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOworICBHT09HTEVfQ0hFQ0tfTEUodmFsdWUuc2l6ZSgpLCBrSW50MzJNYXhTaXplKTsKKyAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHZhbHVlLnNpemUoKSk7CisgIG91dHB1dC0+V3JpdGVTdHJpbmcodmFsdWUpOworfQordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIC8vIFN0cmluZyBpcyBmb3IgVVRGLTggdGV4dCBvbmx5CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKKyAgR09PR0xFX0NIRUNLX0xFKHZhbHVlLnNpemUoKSwga0ludDMyTWF4U2l6ZSk7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMih2YWx1ZS5zaXplKCkpOworICBvdXRwdXQtPldyaXRlUmF3TWF5YmVBbGlhc2VkKHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKK30KK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXMoaW50IGZpZWxkX251bWJlciwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIG91dHB1dCk7CisgIEdPT0dMRV9DSEVDS19MRSh2YWx1ZS5zaXplKCksIGtJbnQzMk1heFNpemUpOworICBvdXRwdXQtPldyaXRlVmFyaW50MzIodmFsdWUuc2l6ZSgpKTsKKyAgb3V0cHV0LT5Xcml0ZVN0cmluZyh2YWx1ZSk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzTWF5YmVBbGlhc2VkKGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOworICBHT09HTEVfQ0hFQ0tfTEUodmFsdWUuc2l6ZSgpLCBrSW50MzJNYXhTaXplKTsKKyAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHZhbHVlLnNpemUoKSk7CisgIG91dHB1dC0+V3JpdGVSYXdNYXliZUFsaWFzZWQodmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworfQorCisKK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlR3JvdXAoaW50IGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1NUQVJUX0dST1VQLCBvdXRwdXQpOworICB2YWx1ZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMob3V0cHV0KTsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9FTkRfR1JPVVAsIG91dHB1dCk7Cit9CisKK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZShpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOworICBjb25zdCBpbnQgc2l6ZSA9IHZhbHVlLkdldENhY2hlZFNpemUoKTsKKyAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHNpemUpOworICB2YWx1ZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMob3V0cHV0KTsKK30KKwordWludDhfdCogV2lyZUZvcm1hdExpdGU6OkludGVybmFsV3JpdGVHcm91cChpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgeworICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1NUQVJUX0dST1VQLCB0YXJnZXQpOworICB0YXJnZXQgPSB2YWx1ZS5fSW50ZXJuYWxTZXJpYWxpemUodGFyZ2V0LCBzdHJlYW0pOworICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgIHJldHVybiBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9FTkRfR1JPVVAsIHRhcmdldCk7Cit9CisKK3VpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpJbnRlcm5hbFdyaXRlTWVzc2FnZShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGVkX3NpemUsIHVpbnQ4X3QqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSB7CisgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgdGFyZ2V0KTsKKyAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSgKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihjYWNoZWRfc2l6ZSksIHRhcmdldCk7CisgIHJldHVybiB2YWx1ZS5fSW50ZXJuYWxTZXJpYWxpemUodGFyZ2V0LCBzdHJlYW0pOworfQorCit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVN1Yk1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgaW50IC8qc2l6ZSovLCBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+U2V0Q3VyKHZhbHVlLl9JbnRlcm5hbFNlcmlhbGl6ZShvdXRwdXQtPkN1cigpLCBvdXRwdXQtPkVwc0NvcHkoKSkpOworfQorCit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUdyb3VwTWF5YmVUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9TVEFSVF9HUk9VUCwgb3V0cHV0KTsKKyAgY29uc3QgaW50IHNpemUgPSB2YWx1ZS5HZXRDYWNoZWRTaXplKCk7CisgIFdyaXRlU3ViTWVzc2FnZU1heWJlVG9BcnJheShzaXplLCB2YWx1ZSwgb3V0cHV0KTsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9FTkRfR1JPVVAsIG91dHB1dCk7Cit9CisKK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIG91dHB1dCk7CisgIGNvbnN0IGludCBzaXplID0gdmFsdWUuR2V0Q2FjaGVkU2l6ZSgpOworICBvdXRwdXQtPldyaXRlVmFyaW50MzIoc2l6ZSk7CisgIFdyaXRlU3ViTWVzc2FnZU1heWJlVG9BcnJheShzaXplLCB2YWx1ZSwgb3V0cHV0KTsKK30KKworUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgYm9vbCBSZWFkQnl0ZXNUb1N0cmluZygKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHN0ZDo6c3RyaW5nKiB2YWx1ZSk7CitpbmxpbmUgc3RhdGljIGJvb2wgUmVhZEJ5dGVzVG9TdHJpbmcoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiB2YWx1ZSkgeworICB1aW50MzJfdCBsZW5ndGg7CisgIHJldHVybiBpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpICYmIGlucHV0LT5SZWFkU3RyaW5nKHZhbHVlLCBsZW5ndGgpOworfQorCitib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiB2YWx1ZSkgeworICByZXR1cm4gUmVhZEJ5dGVzVG9TdHJpbmcoaW5wdXQsIHZhbHVlKTsKK30KKworYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZEJ5dGVzKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgc3RkOjpzdHJpbmcqKiBwKSB7CisgIGlmICgqcCA9PSAmR2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpIHsKKyAgICAqcCA9IG5ldyBzdGQ6OnN0cmluZygpOworICB9CisgIHJldHVybiBSZWFkQnl0ZXNUb1N0cmluZyhpbnB1dCwgKnApOworfQorCit2b2lkIFByaW50VVRGOEVycm9yTG9nKFN0cmluZ1BpZWNlIG1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUGllY2UgZmllbGRfbmFtZSwgY29uc3QgY2hhciogb3BlcmF0aW9uX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbWl0X3N0YWNrdHJhY2UpIHsKKyAgc3RkOjpzdHJpbmcgc3RhY2t0cmFjZTsKKyAgKHZvaWQpZW1pdF9zdGFja3RyYWNlOyAgLy8gUGFyYW1ldGVyIGlzIHVzZWQgYnkgR29vZ2xlLWludGVybmFsIGNvZGUuCisgIHN0ZDo6c3RyaW5nIHF1b3RlZF9maWVsZF9uYW1lID0gIiI7CisgIGlmICghZmllbGRfbmFtZS5lbXB0eSgpKSB7CisgICAgaWYgKCFtZXNzYWdlX25hbWUuZW1wdHkoKSkgeworICAgICAgcXVvdGVkX2ZpZWxkX25hbWUgPQorICAgICAgICAgIFN0ckNhdCgiICciLCBtZXNzYWdlX25hbWUsICIuIiwgZmllbGRfbmFtZSwgIiciKTsKKyAgICB9IGVsc2UgeworICAgICAgcXVvdGVkX2ZpZWxkX25hbWUgPSBTdHJDYXQoIiAnIiwgZmllbGRfbmFtZSwgIiciKTsKKyAgICB9CisgIH0KKyAgc3RkOjpzdHJpbmcgZXJyb3JfbWVzc2FnZSA9CisgICAgICBTdHJDYXQoIlN0cmluZyBmaWVsZCIsIHF1b3RlZF9maWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICIgY29udGFpbnMgaW52YWxpZCBVVEYtOCBkYXRhICIKKyAgICAgICAgICAgICAgICAgICAid2hlbiAiLAorICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbl9zdHIsCisgICAgICAgICAgICAgICAgICAgIiBhIHByb3RvY29sIGJ1ZmZlci4gVXNlIHRoZSAnYnl0ZXMnIHR5cGUgaWYgeW91IGludGVuZCB0byAiCisgICAgICAgICAgICAgICAgICAgInNlbmQgcmF3IGJ5dGVzLiAiLAorICAgICAgICAgICAgICAgICAgIHN0YWNrdHJhY2UpOworICBHT09HTEVfTE9HKEVSUk9SKSA8PCBlcnJvcl9tZXNzYWdlOworfQorCitib29sIFdpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplLCBPcGVyYXRpb24gb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpZWxkX25hbWUpIHsKKyAgaWYgKCFJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChkYXRhLCBzaXplKSkgeworICAgIGNvbnN0IGNoYXIqIG9wZXJhdGlvbl9zdHIgPSBudWxscHRyOworICAgIHN3aXRjaCAob3ApIHsKKyAgICAgIGNhc2UgUEFSU0U6CisgICAgICAgIG9wZXJhdGlvbl9zdHIgPSAicGFyc2luZyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTRVJJQUxJWkU6CisgICAgICAgIG9wZXJhdGlvbl9zdHIgPSAic2VyaWFsaXppbmciOworICAgICAgICBicmVhazsKKyAgICAgICAgLy8gbm8gZGVmYXVsdCBjYXNlOiBoYXZlIHRoZSBjb21waWxlciB3YXJuIGlmIGEgY2FzZSBpcyBub3QgY292ZXJlZC4KKyAgICB9CisgICAgUHJpbnRVVEY4RXJyb3JMb2coIiIsIGZpZWxkX25hbWUsIG9wZXJhdGlvbl9zdHIsIGZhbHNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHRoaXMgY29kZSBpcyBkZWxpYmVyYXRlbHkgd3JpdHRlbiBzdWNoIHRoYXQgY2xhbmcgbWFrZXMgaXQgaW50byByZWFsbHkKKy8vIGVmZmljaWVudCBTU0UgY29kZS4KK3RlbXBsYXRlIDxib29sIFppZ1phZywgYm9vbCBTaWduRXh0ZW5kZWQsIHR5cGVuYW1lIFQ+CitzdGF0aWMgc2l6ZV90IFZhcmludFNpemUoY29uc3QgVCogZGF0YSwgY29uc3QgaW50IG4pIHsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoVCkgPT0gNCwgIlRoaXMgcm91dGluZSBvbmx5IHdvcmtzIGZvciAzMiBiaXQgaW50ZWdlcnMiKTsKKyAgLy8gaXNfdW5zaWduZWQ8VD4gPT4gIVppZ1phZworICBzdGF0aWNfYXNzZXJ0KAorICAgICAgKHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlIF4gWmlnWmFnKSB8fCBzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUsCisgICAgICAiQ2Fubm90IFppZ1phZyBlbmNvZGUgdW5zaWduZWQgdHlwZXMiKTsKKyAgLy8gaXNfdW5zaWduZWQ8VD4gPT4gIVNpZ25FeHRlbmRlZAorICBzdGF0aWNfYXNzZXJ0KAorICAgICAgKHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlIF4gU2lnbkV4dGVuZGVkKSB8fCBzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUsCisgICAgICAiQ2Fubm90IFNpZ25FeHRlbmRlZCB1bnNpZ25lZCB0eXBlcyIpOworICBzdGF0aWNfYXNzZXJ0KCEoU2lnbkV4dGVuZGVkICYmIFppZ1phZyksCisgICAgICAgICAgICAgICAgIkNhbm5vdCBTaWduRXh0ZW5kZWQgYW5kIFppZ1phZyBvbiB0aGUgc2FtZSB0eXBlIik7CisgIHVpbnQzMl90IHN1bSA9IG47CisgIHVpbnQzMl90IG1zYl9zdW0gPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgIHVpbnQzMl90IHggPSBkYXRhW2ldOworICAgIGlmIChaaWdaYWcpIHsKKyAgICAgIHggPSBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRW5jb2RlMzIoeCk7CisgICAgfSBlbHNlIGlmIChTaWduRXh0ZW5kZWQpIHsKKyAgICAgIG1zYl9zdW0gKz0geCA+PiAzMTsKKyAgICB9CisgICAgLy8gY2xhbmcgaXMgc28gc21hcnQgdGhhdCBpdCBwcm9kdWNlcyBvcHRpbWFsIFNTRSBzZXF1ZW5jZSB1bnJvbGxpbmcKKyAgICAvLyB0aGUgbG9vcCA4IGludHMgYXQgYSB0aW1lLiBXaXRoIGEgc2VxdWVuY2Ugb2YgNAorICAgIC8vIGNtcHJlcyA9IGNtcGd0IHgsIHNpemVjbGFzcyAgKCAtMSBvciAwKQorICAgIC8vIHN1bSA9IHN1bSAtIGNtcHJlcworICAgIGlmICh4ID4gMHg3Rikgc3VtKys7CisgICAgaWYgKHggPiAweDNGRkYpIHN1bSsrOworICAgIGlmICh4ID4gMHgxRkZGRkYpIHN1bSsrOworICAgIGlmICh4ID4gMHhGRkZGRkZGKSBzdW0rKzsKKyAgfQorICBpZiAoU2lnbkV4dGVuZGVkKSBzdW0gKz0gbXNiX3N1bSAqIDU7CisgIHJldHVybiBzdW07Cit9CisKK3RlbXBsYXRlIDxib29sIFppZ1phZywgdHlwZW5hbWUgVD4KK3N0YXRpYyBzaXplX3QgVmFyaW50U2l6ZTY0KGNvbnN0IFQqIGRhdGEsIGNvbnN0IGludCBuKSB7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFQpID09IDgsICJUaGlzIHJvdXRpbmUgb25seSB3b3JrcyBmb3IgNjQgYml0IGludGVnZXJzIik7CisgIC8vIGlzX3Vuc2lnbmVkPFQ+ID0+ICFaaWdaYWcKKyAgc3RhdGljX2Fzc2VydCghWmlnWmFnIHx8ICFzdGQ6OmlzX3Vuc2lnbmVkPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiQ2Fubm90IFppZ1phZyBlbmNvZGUgdW5zaWduZWQgdHlwZXMiKTsKKyAgdWludDY0X3Qgc3VtID0gbjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICB1aW50NjRfdCB4ID0gZGF0YVtpXTsKKyAgICBpZiAoWmlnWmFnKSB7CisgICAgICB4ID0gV2lyZUZvcm1hdExpdGU6OlppZ1phZ0VuY29kZTY0KHgpOworICAgIH0KKyAgICAvLyBGaXJzdCBzdGVwIGlzIGEgYmluYXJ5IHNlYXJjaCwgd2UgY2FuJ3QgYnJhbmNoIGluIHNzZSBzbyB3ZSB1c2UgdGhlCisgICAgLy8gcmVzdWx0IG9mIHRoZSBjb21wYXJlIHRvIGFkanVzdCBzdW0gYW5kIGFwcHJvcHJpYXRlbHkuIFRoaXMgY29kZSBpcworICAgIC8vIHdyaXR0ZW4gdG8gbWFrZSBjbGFuZyByZWNvZ25pemUgdGhlIHZlY3Rvcml6YXRpb24uCisgICAgdWludDY0X3QgdG1wID0geCA+PSAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KDEpIDw8IDM1KSA/IC0xIDogMDsKKyAgICBzdW0gKz0gNSAmIHRtcDsKKyAgICB4ID4+PSAzNSAmIHRtcDsKKyAgICBpZiAoeCA+IDB4N0YpIHN1bSsrOworICAgIGlmICh4ID4gMHgzRkZGKSBzdW0rKzsKKyAgICBpZiAoeCA+IDB4MUZGRkZGKSBzdW0rKzsKKyAgICBpZiAoeCA+IDB4RkZGRkZGRikgc3VtKys7CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KKworLy8gR0NDIGRvZXMgbm90IHJlY29nbml6ZSB0aGUgdmVjdG9yaXphdGlvbiBvcHBvcnR1bml0eQorLy8gYW5kIG90aGVyIHBsYXRmb3JtcyBhcmUgdW50ZXN0ZWQsIGluIHRob3NlIGNhc2VzIHVzaW5nIHRoZSBvcHRpbWl6ZWQKKy8vIHZhcmludCBzaXplIHJvdXRpbmUgZm9yIGVhY2ggZWxlbWVudCBpcyBmYXN0ZXIuCisvLyBIZW5jZSB3ZSBlbmFibGUgaXQgb25seSBmb3IgY2xhbmcKKyNpZiBkZWZpbmVkKF9fU1NFX18pICYmIGRlZmluZWQoX19jbGFuZ19fKQorc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQzMl90PiYgdmFsdWUpIHsKKyAgcmV0dXJuIFZhcmludFNpemU8ZmFsc2UsIHRydWU+KHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKK30KKworc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpVSW50MzJTaXplKGNvbnN0IFJlcGVhdGVkRmllbGQ8dWludDMyX3Q+JiB2YWx1ZSkgeworICByZXR1cm4gVmFyaW50U2l6ZTxmYWxzZSwgZmFsc2U+KHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKK30KKworc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpTSW50MzJTaXplKGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50MzJfdD4mIHZhbHVlKSB7CisgIHJldHVybiBWYXJpbnRTaXplPHRydWUsIGZhbHNlPih2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7Cit9CisKK3NpemVfdCBXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUoY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ+JiB2YWx1ZSkgeworICAvLyBPbiBJTFA2NCwgc2l6ZW9mKGludCkgPT0gOCwgd2hpY2ggd291bGQgcmVxdWlyZSBhIGRpZmZlcmVudCB0ZW1wbGF0ZS4KKyAgcmV0dXJuIFZhcmludFNpemU8ZmFsc2UsIHRydWU+KHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKK30KKworI2Vsc2UgIC8vICEoZGVmaW5lZChfX1NTRTRfMV9fKSAmJiBkZWZpbmVkKF9fY2xhbmdfXykpCisKK3NpemVfdCBXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50MzJfdD4mIHZhbHVlKSB7CisgIHNpemVfdCBvdXQgPSAwOworICBjb25zdCBpbnQgbiA9IHZhbHVlLnNpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBvdXQgKz0gSW50MzJTaXplKHZhbHVlLkdldChpKSk7CisgIH0KKyAgcmV0dXJuIG91dDsKK30KKworc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpVSW50MzJTaXplKGNvbnN0IFJlcGVhdGVkRmllbGQ8dWludDMyX3Q+JiB2YWx1ZSkgeworICBzaXplX3Qgb3V0ID0gMDsKKyAgY29uc3QgaW50IG4gPSB2YWx1ZS5zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgb3V0ICs9IFVJbnQzMlNpemUodmFsdWUuR2V0KGkpKTsKKyAgfQorICByZXR1cm4gb3V0OworfQorCitzaXplX3QgV2lyZUZvcm1hdExpdGU6OlNJbnQzMlNpemUoY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQzMl90PiYgdmFsdWUpIHsKKyAgc2l6ZV90IG91dCA9IDA7CisgIGNvbnN0IGludCBuID0gdmFsdWUuc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgIG91dCArPSBTSW50MzJTaXplKHZhbHVlLkdldChpKSk7CisgIH0KKyAgcmV0dXJuIG91dDsKK30KKworc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZShjb25zdCBSZXBlYXRlZEZpZWxkPGludD4mIHZhbHVlKSB7CisgIHNpemVfdCBvdXQgPSAwOworICBjb25zdCBpbnQgbiA9IHZhbHVlLnNpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBvdXQgKz0gRW51bVNpemUodmFsdWUuR2V0KGkpKTsKKyAgfQorICByZXR1cm4gb3V0OworfQorCisjZW5kaWYKKworLy8gTWljcm8gYmVuY2htYXJrcyBzaG93IHRoYXQgdGhlIFNTRSBpbXByb3ZlZCBsb29wIG9ubHkgc3RhcnRzIGJlYXRpbmcKKy8vIHRoZSBub3JtYWwgbG9vcCBvbiBIYXN3ZWxsIHBsYXRmb3JtcyBhbmQgdGhlbiBvbmx5IGZvciA+MzIgaW50cy4gV2UKKy8vIGRpc2FibGUgdGhpcyBmb3Igbm93LiBTb21lIHNwZWNpYWxpemVkIHVzZXJzIG1pZ2h0IGZpbmQgaXQgd29ydGh3aGlsZSB0bworLy8gZW5hYmxlIHRoaXMuCisjZGVmaW5lIFVTRV9TU0VfRk9SXzY0X0JJVF9JTlRFR0VSX0FSUkFZUyAwCisjaWYgVVNFX1NTRV9GT1JfNjRfQklUX0lOVEVHRVJfQVJSQVlTCitzaXplX3QgV2lyZUZvcm1hdExpdGU6OkludDY0U2l6ZShjb25zdCBSZXBlYXRlZEZpZWxkPGludDY0X3Q+JiB2YWx1ZSkgeworICByZXR1cm4gVmFyaW50U2l6ZTY0PGZhbHNlPih2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7Cit9CisKK3NpemVfdCBXaXJlRm9ybWF0TGl0ZTo6VUludDY0U2l6ZShjb25zdCBSZXBlYXRlZEZpZWxkPHVpbnQ2NF90PiYgdmFsdWUpIHsKKyAgcmV0dXJuIFZhcmludFNpemU2NDxmYWxzZT4odmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworfQorCitzaXplX3QgV2lyZUZvcm1hdExpdGU6OlNJbnQ2NFNpemUoY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ2NF90PiYgdmFsdWUpIHsKKyAgcmV0dXJuIFZhcmludFNpemU2NDx0cnVlPih2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7Cit9CisKKyNlbHNlCisKK3NpemVfdCBXaXJlRm9ybWF0TGl0ZTo6SW50NjRTaXplKGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50NjRfdD4mIHZhbHVlKSB7CisgIHNpemVfdCBvdXQgPSAwOworICBjb25zdCBpbnQgbiA9IHZhbHVlLnNpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBvdXQgKz0gSW50NjRTaXplKHZhbHVlLkdldChpKSk7CisgIH0KKyAgcmV0dXJuIG91dDsKK30KKworc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpVSW50NjRTaXplKGNvbnN0IFJlcGVhdGVkRmllbGQ8dWludDY0X3Q+JiB2YWx1ZSkgeworICBzaXplX3Qgb3V0ID0gMDsKKyAgY29uc3QgaW50IG4gPSB2YWx1ZS5zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgb3V0ICs9IFVJbnQ2NFNpemUodmFsdWUuR2V0KGkpKTsKKyAgfQorICByZXR1cm4gb3V0OworfQorCitzaXplX3QgV2lyZUZvcm1hdExpdGU6OlNJbnQ2NFNpemUoY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ2NF90PiYgdmFsdWUpIHsKKyAgc2l6ZV90IG91dCA9IDA7CisgIGNvbnN0IGludCBuID0gdmFsdWUuc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgIG91dCArPSBTSW50NjRTaXplKHZhbHVlLkdldChpKSk7CisgIH0KKyAgcmV0dXJuIG91dDsKK30KKworI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZDM5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaApAQCAtMCwwICsxLDE5MDggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgICAgICAgIGF0ZW5hc2lvQGdvb2dsZS5jb20gKENocmlzIEF0ZW5hc2lvKSAoWmlnWmFnIHRyYW5zZm9ybSkKKy8vICAgICAgICAgd2lua0Bnb29nbGUuY29tIChXaW5rIFNhdmlsbGUpIChyZWZhY3RvcmVkIGZyb20gd2lyZV9mb3JtYXQuaCkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgaGVhZGVyIGlzIGxvZ2ljYWxseSBpbnRlcm5hbCwgYnV0IGlzIG1hZGUgcHVibGljIGJlY2F1c2UgaXQgaXMgdXNlZAorLy8gZnJvbSBwcm90b2NvbC1jb21waWxlci1nZW5lcmF0ZWQgY29kZSwgd2hpY2ggbWF5IHJlc2lkZSBpbiBvdGhlciBjb21wb25lbnRzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9MSVRFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTElURV9IX18KKworCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKworLy8gRG8gVVRGLTggdmFsaWRhdGlvbiBvbiBzdHJpbmcgdHlwZSBpbiBEZWJ1ZyBidWlsZCBvbmx5CisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKKyNlbmRpZgorCisvLyBBdm9pZCBjb25mbGljdCB3aXRoIGlPUyB3aGVyZSA8Q29uZGl0aW9uYWxNYWNyb3MuaD4gI2RlZmluZXMgVFlQRV9CT09MLgorLy8KKy8vIElmIHNvbWUgb25lIG5lZWRzIHRoZSBtYWNybyBUWVBFX0JPT0wgaW4gYSBmaWxlIHRoYXQgaW5jbHVkZXMgdGhpcyBoZWFkZXIsCisvLyBpdCdzIHBvc3NpYmxlIHRvIGJyaW5nIGl0IGJhY2sgdXNpbmcgcHVzaC9wb3BfbWFjcm8gYXMgZm9sbG93cy4KKy8vCisvLyAjcHJhZ21hIHB1c2hfbWFjcm8oIlRZUEVfQk9PTCIpCisvLyAjaW5jbHVkZSB0aGlzIGhlYWRlciBhbmQvb3IgYWxsIGhlYWRlcnMgdGhhdCBuZWVkIHRoZSBtYWNybyB0byBiZSB1bmRlZmluZWQuCisvLyAjcHJhZ21hIHBvcF9tYWNybygiVFlQRV9CT09MIikKKyN1bmRlZiBUWVBFX0JPT0wKKworCisvLyBNdXN0IGJlIGluY2x1ZGVkIGxhc3QuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhpcyBjbGFzcyBpcyBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgbGlicmFyeSBhbmQgYnkKKy8vIHByb3RvY29sLWNvbXBpbGVyLWdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMuICBJdCBtdXN0IG5vdCBiZSBjYWxsZWQKKy8vIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisvLworLy8gVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXJzIGZvciBpbXBsZW1lbnRpbmcgdGhlIGJpbmFyeSBwcm90b2NvbCBidWZmZXIKKy8vIHdpcmUgZm9ybWF0IHdpdGhvdXQgdGhlIG5lZWQgZm9yIHJlZmxlY3Rpb24uIFVzZSBXaXJlRm9ybWF0IHdoZW4gdXNpbmcKKy8vIHJlZmxlY3Rpb24uCisvLworLy8gVGhpcyBjbGFzcyBpcyByZWFsbHkgYSBuYW1lc3BhY2UgdGhhdCBjb250YWlucyBvbmx5IHN0YXRpYyBtZXRob2RzLgorY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFdpcmVGb3JtYXRMaXRlIHsKKyBwdWJsaWM6CisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEhlbHBlciBjb25zdGFudHMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZSBmb3JtYXQuICBUaGVzZSBhcmUKKyAgLy8gbW9zdGx5IG1lYW50IGZvciBpbnRlcm5hbCBhbmQgZ2VuZXJhdGVkIGNvZGUgdG8gdXNlLgorCisgIC8vIFRoZSB3aXJlIGZvcm1hdCBpcyBjb21wb3NlZCBvZiBhIHNlcXVlbmNlIG9mIHRhZy92YWx1ZSBwYWlycywgZWFjaAorICAvLyBvZiB3aGljaCBjb250YWlucyB0aGUgdmFsdWUgb2Ygb25lIGZpZWxkIChvciBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkCisgIC8vIGZpZWxkKS4gIEVhY2ggdGFnIGlzIGVuY29kZWQgYXMgYSB2YXJpbnQuICBUaGUgbG93ZXIgYml0cyBvZiB0aGUgdGFnCisgIC8vIGlkZW50aWZ5IGl0cyB3aXJlIHR5cGUsIHdoaWNoIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIHRvIGZvbGxvdy4KKyAgLy8gVGhlIHJlc3Qgb2YgdGhlIGJpdHMgY29udGFpbiB0aGUgZmllbGQgbnVtYmVyLiAgRWFjaCB0eXBlIG9mIGZpZWxkIChhcworICAvLyBkZWNsYXJlZCBieSBGaWVsZERlc2NyaXB0b3I6OlR5cGUsIGluIGRlc2NyaXB0b3IuaCkgbWFwcyB0byBvbmUgb2YKKyAgLy8gdGhlc2Ugd2lyZSB0eXBlcy4gIEltbWVkaWF0ZWx5IGZvbGxvd2luZyBlYWNoIHRhZyBpcyB0aGUgZmllbGQncyB2YWx1ZSwKKyAgLy8gZW5jb2RlZCBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSB0aGUgd2lyZSB0eXBlLiAgQmVjYXVzZSB0aGUgdGFnCisgIC8vIGlkZW50aWZpZXMgdGhlIGVuY29kaW5nIG9mIHRoaXMgZGF0YSwgaXQgaXMgcG9zc2libGUgdG8gc2tpcAorICAvLyB1bnJlY29nbml6ZWQgZmllbGRzIGZvciBmb3J3YXJkcyBjb21wYXRpYmlsaXR5LgorCisgIGVudW0gV2lyZVR5cGUgeworICAgIFdJUkVUWVBFX1ZBUklOVCA9IDAsCisgICAgV0lSRVRZUEVfRklYRUQ2NCA9IDEsCisgICAgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCA9IDIsCisgICAgV0lSRVRZUEVfU1RBUlRfR1JPVVAgPSAzLAorICAgIFdJUkVUWVBFX0VORF9HUk9VUCA9IDQsCisgICAgV0lSRVRZUEVfRklYRUQzMiA9IDUsCisgIH07CisKKyAgLy8gTGl0ZSBhbHRlcm5hdGl2ZSB0byBGaWVsZERlc2NyaXB0b3I6OlR5cGUuICBNdXN0IGJlIGtlcHQgaW4gc3luYy4KKyAgZW51bSBGaWVsZFR5cGUgeworICAgIFRZUEVfRE9VQkxFID0gMSwKKyAgICBUWVBFX0ZMT0FUID0gMiwKKyAgICBUWVBFX0lOVDY0ID0gMywKKyAgICBUWVBFX1VJTlQ2NCA9IDQsCisgICAgVFlQRV9JTlQzMiA9IDUsCisgICAgVFlQRV9GSVhFRDY0ID0gNiwKKyAgICBUWVBFX0ZJWEVEMzIgPSA3LAorICAgIFRZUEVfQk9PTCA9IDgsCisgICAgVFlQRV9TVFJJTkcgPSA5LAorICAgIFRZUEVfR1JPVVAgPSAxMCwKKyAgICBUWVBFX01FU1NBR0UgPSAxMSwKKyAgICBUWVBFX0JZVEVTID0gMTIsCisgICAgVFlQRV9VSU5UMzIgPSAxMywKKyAgICBUWVBFX0VOVU0gPSAxNCwKKyAgICBUWVBFX1NGSVhFRDMyID0gMTUsCisgICAgVFlQRV9TRklYRUQ2NCA9IDE2LAorICAgIFRZUEVfU0lOVDMyID0gMTcsCisgICAgVFlQRV9TSU5UNjQgPSAxOCwKKyAgICBNQVhfRklFTERfVFlQRSA9IDE4LAorICB9OworCisgIC8vIExpdGUgYWx0ZXJuYXRpdmUgdG8gRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlLiAgTXVzdCBiZSBrZXB0IGluIHN5bmMuCisgIGVudW0gQ3BwVHlwZSB7CisgICAgQ1BQVFlQRV9JTlQzMiA9IDEsCisgICAgQ1BQVFlQRV9JTlQ2NCA9IDIsCisgICAgQ1BQVFlQRV9VSU5UMzIgPSAzLAorICAgIENQUFRZUEVfVUlOVDY0ID0gNCwKKyAgICBDUFBUWVBFX0RPVUJMRSA9IDUsCisgICAgQ1BQVFlQRV9GTE9BVCA9IDYsCisgICAgQ1BQVFlQRV9CT09MID0gNywKKyAgICBDUFBUWVBFX0VOVU0gPSA4LAorICAgIENQUFRZUEVfU1RSSU5HID0gOSwKKyAgICBDUFBUWVBFX01FU1NBR0UgPSAxMCwKKyAgICBNQVhfQ1BQVFlQRSA9IDEwLAorICB9OworCisgIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBDcHBUeXBlIGZvciBhIHBhcnRpY3VsYXIgVHlwZS4KKyAgc3RhdGljIENwcFR5cGUgRmllbGRUeXBlVG9DcHBUeXBlKEZpZWxkVHlwZSB0eXBlKTsKKworICAvLyBHaXZlbiBhIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSByZXR1cm4gaXRzIFdpcmVUeXBlCisgIHN0YXRpYyBpbmxpbmUgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIFdpcmVUeXBlRm9yRmllbGRUeXBlKAorICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSB0eXBlKSB7CisgICAgcmV0dXJuIGtXaXJlVHlwZUZvckZpZWxkVHlwZVt0eXBlXTsKKyAgfQorCisgIC8vIE51bWJlciBvZiBiaXRzIGluIGEgdGFnIHdoaWNoIGlkZW50aWZ5IHRoZSB3aXJlIHR5cGUuCisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtUYWdUeXBlQml0cyA9IDM7CisgIC8vIE1hc2sgZm9yIHRob3NlIGJpdHMuCisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1RhZ1R5cGVNYXNrID0gKDEgPDwga1RhZ1R5cGVCaXRzKSAtIDE7CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHRhZ3MuICAoSW5saW5lZCBiZWxvdyBhbmQgaW4KKyAgLy8gX2lubC5oKQorICAvLworICAvLyBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIE1ha2VUYWcoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKSBpbiB0aGUKKyAgLy8gY2FzZSBvZiBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzLgorICBjb25zdGV4cHIgc3RhdGljIHVpbnQzMl90IE1ha2VUYWcoaW50IGZpZWxkX251bWJlciwgV2lyZVR5cGUgdHlwZSk7CisgIHN0YXRpYyBXaXJlVHlwZSBHZXRUYWdXaXJlVHlwZSh1aW50MzJfdCB0YWcpOworICBzdGF0aWMgaW50IEdldFRhZ0ZpZWxkTnVtYmVyKHVpbnQzMl90IHRhZyk7CisKKyAgLy8gQ29tcHV0ZSB0aGUgYnl0ZSBzaXplIG9mIGEgdGFnLiAgRm9yIGdyb3VwcywgdGhpcyBpbmNsdWRlcyBib3RoIHRoZSBzdGFydAorICAvLyBhbmQgZW5kIHRhZ3MuCisgIHN0YXRpYyBpbmxpbmUgc2l6ZV90IFRhZ1NpemUoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIHR5cGUpOworCisgIC8vIFNraXBzIGEgZmllbGQgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gdGFnLiAgVGhlIGlucHV0IHNob3VsZCBzdGFydAorICAvLyBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB0YWcuICBTa2lwcGVkIHZhbHVlcyBhcmUgc2ltcGx5CisgIC8vIGRpc2NhcmRlZCwgbm90IHJlY29yZGVkIGFueXdoZXJlLiAgU2VlIFdpcmVGb3JtYXQ6OlNraXBGaWVsZCgpIGZvciBhCisgIC8vIHZlcnNpb24gdGhhdCByZWNvcmRzIHRvIGFuIFVua25vd25GaWVsZFNldC4KKyAgc3RhdGljIGJvb2wgU2tpcEZpZWxkKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyX3QgdGFnKTsKKworICAvLyBTa2lwcyBhIGZpZWxkIHZhbHVlIHdpdGggdGhlIGdpdmVuIHRhZy4gIFRoZSBpbnB1dCBzaG91bGQgc3RhcnQKKyAgLy8gcG9zaXRpb25lZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgdGFnLiBTa2lwcGVkIHZhbHVlcyBhcmUgcmVjb3JkZWQgdG8gYQorICAvLyBDb2RlZE91dHB1dFN0cmVhbS4KKyAgc3RhdGljIGJvb2wgU2tpcEZpZWxkKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyX3QgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworCisgIC8vIFJlYWRzIGFuZCBpZ25vcmVzIGEgbWVzc2FnZSBmcm9tIHRoZSBpbnB1dC4gIFNraXBwZWQgdmFsdWVzIGFyZSBzaW1wbHkKKyAgLy8gZGlzY2FyZGVkLCBub3QgcmVjb3JkZWQgYW55d2hlcmUuICBTZWUgV2lyZUZvcm1hdDo6U2tpcE1lc3NhZ2UoKSBmb3IgYQorICAvLyB2ZXJzaW9uIHRoYXQgcmVjb3JkcyB0byBhbiBVbmtub3duRmllbGRTZXQuCisgIHN0YXRpYyBib29sIFNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisKKyAgLy8gUmVhZHMgYW5kIGlnbm9yZXMgYSBtZXNzYWdlIGZyb20gdGhlIGlucHV0LiAgU2tpcHBlZCB2YWx1ZXMgYXJlIHJlY29yZGVkCisgIC8vIHRvIGEgQ29kZWRPdXRwdXRTdHJlYW0uCisgIHN0YXRpYyBib29sIFNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworCisgIC8vIFRoaXMgbWFjcm8gZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygpLCBidXQgdGhlCisgIC8vIHJlc3VsdCBpcyB1c2FibGUgYXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQsIHdoaWNoIG1ha2VzIGl0IHVzYWJsZQorICAvLyBhcyBhIHN3aXRjaCBjYXNlIG9yIGEgdGVtcGxhdGUgaW5wdXQuICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygpIGlzIG1vcmUKKyAgLy8gdHlwZS1zYWZlLCB0aG91Z2gsIHNvIHByZWZlciBpdCBpZiBwb3NzaWJsZS4KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX01BS0VfVEFHKEZJRUxEX05VTUJFUiwgVFlQRSkgXAorICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKHN0YXRpY19jYXN0PHVpbnQzMl90PihGSUVMRF9OVU1CRVIpIDw8IDMpIHwgKFRZUEUpKQorCisgIC8vIFRoZXNlIGFyZSB0aGUgdGFncyBmb3IgdGhlIG9sZCBNZXNzYWdlU2V0IGZvcm1hdCwgd2hpY2ggd2FzIGRlZmluZWQgYXM6CisgIC8vICAgbWVzc2FnZSBNZXNzYWdlU2V0IHsKKyAgLy8gICAgIHJlcGVhdGVkIGdyb3VwIEl0ZW0gPSAxIHsKKyAgLy8gICAgICAgcmVxdWlyZWQgaW50MzIgdHlwZV9pZCA9IDI7CisgIC8vICAgICAgIHJlcXVpcmVkIHN0cmluZyBtZXNzYWdlID0gMzsKKyAgLy8gICAgIH0KKyAgLy8gICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNZXNzYWdlU2V0SXRlbU51bWJlciA9IDE7CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNZXNzYWdlU2V0VHlwZUlkTnVtYmVyID0gMjsKKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01lc3NhZ2VTZXRNZXNzYWdlTnVtYmVyID0gMzsKKyAgc3RhdGljIGNvbnN0IGludCBrTWVzc2FnZVNldEl0ZW1TdGFydFRhZyA9IEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9NQUtFX1RBRygKKyAgICAgIGtNZXNzYWdlU2V0SXRlbU51bWJlciwgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTWVzc2FnZVNldEl0ZW1FbmRUYWcgPSBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTUFLRV9UQUcoCisgICAgICBrTWVzc2FnZVNldEl0ZW1OdW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApOworICBzdGF0aWMgY29uc3QgaW50IGtNZXNzYWdlU2V0VHlwZUlkVGFnID0gR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX01BS0VfVEFHKAorICAgICAga01lc3NhZ2VTZXRUeXBlSWROdW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpOworICBzdGF0aWMgY29uc3QgaW50IGtNZXNzYWdlU2V0TWVzc2FnZVRhZyA9IEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9NQUtFX1RBRygKKyAgICAgIGtNZXNzYWdlU2V0TWVzc2FnZU51bWJlciwgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworCisgIC8vIEJ5dGUgc2l6ZSBvZiBhbGwgdGFncyBvZiBhIE1lc3NhZ2VTZXQ6Okl0ZW0gY29tYmluZWQuCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga01lc3NhZ2VTZXRJdGVtVGFnc1NpemU7CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgY29udmVydGluZyBiZXR3ZWVuIGZsb2F0cy9kb3VibGVzIGFuZCBJRUVFLTc1NAorICAvLyB1aW50MzJzL3VpbnQ2NHMgc28gdGhhdCB0aGV5IGNhbiBiZSB3cml0dGVuLiAgKEFzc3VtZXMgeW91ciBwbGF0Zm9ybQorICAvLyB1c2VzIElFRUUtNzU0IGZsb2F0cy4pCisgIHN0YXRpYyB1aW50MzJfdCBFbmNvZGVGbG9hdChmbG9hdCB2YWx1ZSk7CisgIHN0YXRpYyBmbG9hdCBEZWNvZGVGbG9hdCh1aW50MzJfdCB2YWx1ZSk7CisgIHN0YXRpYyB1aW50NjRfdCBFbmNvZGVEb3VibGUoZG91YmxlIHZhbHVlKTsKKyAgc3RhdGljIGRvdWJsZSBEZWNvZGVEb3VibGUodWludDY0X3QgdmFsdWUpOworCisgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hcHBpbmcgc2lnbmVkIGludGVnZXJzIHRvIHVuc2lnbmVkIGludGVnZXJzIGluCisgIC8vIHN1Y2ggYSB3YXkgdGhhdCBudW1iZXJzIHdpdGggc21hbGwgbWFnbml0dWRlcyB3aWxsIGVuY29kZSB0byBzbWFsbGVyCisgIC8vIHZhcmludHMuICBJZiB5b3Ugc2ltcGx5IHN0YXRpY19jYXN0IGEgbmVnYXRpdmUgbnVtYmVyIHRvIGFuIHVuc2lnbmVkCisgIC8vIG51bWJlciBhbmQgdmFyaW50LWVuY29kZSBpdCwgaXQgd2lsbCBhbHdheXMgdGFrZSAxMCBieXRlcywgZGVmZWF0aW5nCisgIC8vIHRoZSBwdXJwb3NlIG9mIHZhcmludC4gIFNvLCBmb3IgdGhlICJzaW50MzIiIGFuZCAic2ludDY0IiBmaWVsZCB0eXBlcywKKyAgLy8gd2UgWmlnWmFnLWVuY29kZSB0aGUgdmFsdWVzLgorICBzdGF0aWMgdWludDMyX3QgWmlnWmFnRW5jb2RlMzIoaW50MzJfdCBuKTsKKyAgc3RhdGljIGludDMyX3QgWmlnWmFnRGVjb2RlMzIodWludDMyX3Qgbik7CisgIHN0YXRpYyB1aW50NjRfdCBaaWdaYWdFbmNvZGU2NChpbnQ2NF90IG4pOworICBzdGF0aWMgaW50NjRfdCBaaWdaYWdEZWNvZGU2NCh1aW50NjRfdCBuKTsKKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBNZXRob2RzIGZvciByZWFkaW5nL3dyaXRpbmcgaW5kaXZpZHVhbCBmaWVsZC4KKworICAvLyBSZWFkIGZpZWxkcywgbm90IGluY2x1ZGluZyB0YWdzLiAgVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB5b3UgYWxyZWFkeQorICAvLyByZWFkIHRoZSB0YWcgdG8gZGV0ZXJtaW5lIHdoYXQgZmllbGQgdG8gcmVhZC4KKworICAvLyBGb3IgcHJpbWl0aXZlIGZpZWxkcywgd2UganVzdCB1c2UgYSB0ZW1wbGF0aXplZCByb3V0aW5lIHBhcmFtZXRlcml6ZWQgYnkKKyAgLy8gdGhlIHJlcHJlc2VudGVkIHR5cGUgYW5kIHRoZSBGaWVsZFR5cGUuIFRoZXNlIGFyZSBzcGVjaWFsaXplZCB3aXRoIHRoZQorICAvLyBhcHByb3ByaWF0ZSBkZWZpbml0aW9uIGZvciBlYWNoIGRlY2xhcmVkIHR5cGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgorICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyBib29sIFJlYWRQcmltaXRpdmUoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1R5cGUqIHZhbHVlKTsKKworICAvLyBSZWFkcyByZXBlYXRlZCBwcmltaXRpdmUgdmFsdWVzLCB3aXRoIG9wdGltaXphdGlvbnMgZm9yIHJlcGVhdHMuCisgIC8vIHRhZ19zaXplIGFuZCB0YWcgc2hvdWxkIGJvdGggYmUgY29tcGlsZS10aW1lIGNvbnN0YW50cyBwcm92aWRlZCBieSB0aGUKKyAgLy8gcHJvdG9jb2wgY29tcGlsZXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgorICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyBib29sIFJlYWRSZXBlYXRlZFByaW1pdGl2ZSgKKyAgICAgIGludCB0YWdfc2l6ZSwgdWludDMyX3QgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWUpOworCisgIC8vIElkZW50aWNhbCB0byBSZWFkUmVwZWF0ZWRQcmltaXRpdmUsIGV4Y2VwdCB3aWxsIG5vdCBpbmxpbmUgdGhlCisgIC8vIGltcGxlbWVudGF0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gRmllbGRUeXBlIERlY2xhcmVkVHlwZT4KKyAgc3RhdGljIGJvb2wgUmVhZFJlcGVhdGVkUHJpbWl0aXZlTm9JbmxpbmUoaW50IHRhZ19zaXplLCB1aW50MzJfdCB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlKTsKKworICAvLyBSZWFkcyBhIHByaW1pdGl2ZSB2YWx1ZSBkaXJlY3RseSBmcm9tIHRoZSBwcm92aWRlZCBidWZmZXIuIEl0IHJldHVybnMgYQorICAvLyBwb2ludGVyIHBhc3QgdGhlIHNlZ21lbnQgb2YgZGF0YSB0aGF0IHdhcyByZWFkLgorICAvLworICAvLyBUaGlzIGlzIG9ubHkgaW1wbGVtZW50ZWQgZm9yIHRoZSB0eXBlcyB3aXRoIGZpeGVkIHdpcmUgc2l6ZSwgZS5nLgorICAvLyBmbG9hdCwgZG91YmxlLCBhbmQgdGhlIChzKWZpeGVkKiB0eXBlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIGNvbnN0IHVpbnQ4X3QqIFJlYWRQcmltaXRpdmVGcm9tQXJyYXkoCisgICAgICBjb25zdCB1aW50OF90KiBidWZmZXIsIENUeXBlKiB2YWx1ZSk7CisKKyAgLy8gUmVhZHMgYSBwcmltaXRpdmUgcGFja2VkIGZpZWxkLgorICAvLworICAvLyBUaGlzIGlzIG9ubHkgaW1wbGVtZW50ZWQgZm9yIHBhY2thYmxlIHR5cGVzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gRmllbGRUeXBlIERlY2xhcmVkVHlwZT4KKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgYm9vbCBSZWFkUGFja2VkUHJpbWl0aXZlKAorICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWUpOworCisgIC8vIElkZW50aWNhbCB0byBSZWFkUGFja2VkUHJpbWl0aXZlLCBleGNlcHQgd2lsbCBub3QgaW5saW5lIHRoZQorICAvLyBpbXBsZW1lbnRhdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+CisgIHN0YXRpYyBib29sIFJlYWRQYWNrZWRQcmltaXRpdmVOb0lubGluZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWUpOworCisgIC8vIFJlYWQgYSBwYWNrZWQgZW51bSBmaWVsZC4gSWYgdGhlIGlzX3ZhbGlkIGZ1bmN0aW9uIGlzIG5vdCBudWxscHRyLCB2YWx1ZXMKKyAgLy8gZm9yIHdoaWNoIGlzX3ZhbGlkKHZhbHVlKSByZXR1cm5zIGZhbHNlIGFyZSBzaWxlbnRseSBkcm9wcGVkLgorICBzdGF0aWMgYm9vbCBSZWFkUGFja2VkRW51bU5vSW5saW5lKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICgqaXNfdmFsaWQpKGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQ+KiB2YWx1ZXMpOworCisgIC8vIFJlYWQgYSBwYWNrZWQgZW51bSBmaWVsZC4gSWYgdGhlIGlzX3ZhbGlkIGZ1bmN0aW9uIGlzIG5vdCBudWxscHRyLCB2YWx1ZXMKKyAgLy8gZm9yIHdoaWNoIGlzX3ZhbGlkKHZhbHVlKSByZXR1cm5zIGZhbHNlIGFyZSBhcHBlbmRlZCB0bworICAvLyB1bmtub3duX2ZpZWxkc19zdHJlYW0uCisgIHN0YXRpYyBib29sIFJlYWRQYWNrZWRFbnVtUHJlc2VydmVVbmtub3ducygKKyAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgaW50IGZpZWxkX251bWJlciwgYm9vbCAoKmlzX3ZhbGlkKShpbnQpLAorICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiB1bmtub3duX2ZpZWxkc19zdHJlYW0sIFJlcGVhdGVkRmllbGQ8aW50PiogdmFsdWVzKTsKKworICAvLyBSZWFkIGEgc3RyaW5nLiAgUmVhZFN0cmluZyguLi4sIHN0ZDo6c3RyaW5nKiB2YWx1ZSkgcmVxdWlyZXMgYW4KKyAgLy8gZXhpc3Rpbmcgc3RkOjpzdHJpbmcuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkU3RyaW5nKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHZhbHVlKTsKKyAgLy8gUmVhZFN0cmluZyguLi4sIHN0ZDo6c3RyaW5nKiogcCkgaXMgaW50ZXJuYWwtb25seSwgYW5kIHNob3VsZCBvbmx5IGJlCisgIC8vIGNhbGxlZCBmcm9tIGdlbmVyYXRlZCBjb2RlLiBJdCBzdGFydHMgYnkgc2V0dGluZyAqcCB0byAibmV3IHN0ZDo6c3RyaW5nIiBpZgorICAvLyAqcCA9PSAmR2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkuICBJdCB0aGVuIGludm9rZXMKKyAgLy8gUmVhZFN0cmluZyhpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsICpwKS4gIFRoaXMgaXMgdXNlZnVsIGZvciByZWR1Y2luZworICAvLyBjb2RlIHNpemUuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkU3RyaW5nKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgc3RkOjpzdHJpbmcqKiBwKTsKKyAgLy8gQW5hbG9nb3VzIHRvIFJlYWRTdHJpbmcoKS4KKyAgc3RhdGljIGJvb2wgUmVhZEJ5dGVzKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgc3RkOjpzdHJpbmcqIHZhbHVlKTsKKyAgc3RhdGljIGJvb2wgUmVhZEJ5dGVzKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgc3RkOjpzdHJpbmcqKiBwKTsKKworICBlbnVtIE9wZXJhdGlvbiB7CisgICAgUEFSU0UgPSAwLAorICAgIFNFUklBTElaRSA9IDEsCisgIH07CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBkYXRhIGlzIHZhbGlkIFVURi04LgorICBzdGF0aWMgYm9vbCBWZXJpZnlVdGY4U3RyaW5nKGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplLCBPcGVyYXRpb24gb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmllbGRfbmFtZSk7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1lc3NhZ2VUeXBlPgorICBzdGF0aWMgaW5saW5lIGJvb2wgUmVhZEdyb3VwKGludCBmaWVsZF9udW1iZXIsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVHlwZSogdmFsdWUpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNZXNzYWdlVHlwZT4KKyAgc3RhdGljIGlubGluZSBib29sIFJlYWRNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VUeXBlKiB2YWx1ZSk7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1lc3NhZ2VUeXBlPgorICBzdGF0aWMgaW5saW5lIGJvb2wgUmVhZE1lc3NhZ2VOb1ZpcnR1YWwoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVR5cGUqIHZhbHVlKSB7CisgICAgcmV0dXJuIFJlYWRNZXNzYWdlKGlucHV0LCB2YWx1ZSk7CisgIH0KKworICAvLyBXcml0ZSBhIHRhZy4gIFRoZSBXcml0ZSooKSBmdW5jdGlvbnMgdHlwaWNhbGx5IGluY2x1ZGUgdGhlIHRhZywgc28KKyAgLy8gbm9ybWFsbHkgdGhlcmUncyBubyBuZWVkIHRvIGNhbGwgdGhpcyB1bmxlc3MgdXNpbmcgdGhlIFdyaXRlKk5vVGFnKCkKKyAgLy8gdmFyaWFudHMuCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHZvaWQgV3JpdGVUYWcoaW50IGZpZWxkX251bWJlciwgV2lyZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisKKyAgLy8gV3JpdGUgZmllbGRzLCB3aXRob3V0IHRhZ3MuCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHZvaWQgV3JpdGVJbnQzMk5vVGFnKAorICAgICAgaW50MzJfdCB2YWx1ZSwgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB2b2lkIFdyaXRlSW50NjROb1RhZygKKyAgICAgIGludDY0X3QgdmFsdWUsIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdm9pZCBXcml0ZVVJbnQzMk5vVGFnKAorICAgICAgdWludDMyX3QgdmFsdWUsIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdm9pZCBXcml0ZVVJbnQ2NE5vVGFnKAorICAgICAgdWludDY0X3QgdmFsdWUsIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdm9pZCBXcml0ZVNJbnQzMk5vVGFnKAorICAgICAgaW50MzJfdCB2YWx1ZSwgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB2b2lkIFdyaXRlU0ludDY0Tm9UYWcoCisgICAgICBpbnQ2NF90IHZhbHVlLCBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHZvaWQgV3JpdGVGaXhlZDMyTm9UYWcoCisgICAgICB1aW50MzJfdCB2YWx1ZSwgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB2b2lkIFdyaXRlRml4ZWQ2NE5vVGFnKAorICAgICAgdWludDY0X3QgdmFsdWUsIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdm9pZCBXcml0ZVNGaXhlZDMyTm9UYWcoCisgICAgICBpbnQzMl90IHZhbHVlLCBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHZvaWQgV3JpdGVTRml4ZWQ2NE5vVGFnKAorICAgICAgaW50NjRfdCB2YWx1ZSwgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB2b2lkIFdyaXRlRmxvYXROb1RhZygKKyAgICAgIGZsb2F0IHZhbHVlLCBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHZvaWQgV3JpdGVEb3VibGVOb1RhZygKKyAgICAgIGRvdWJsZSB2YWx1ZSwgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB2b2lkIFdyaXRlQm9vbE5vVGFnKAorICAgICAgYm9vbCB2YWx1ZSwgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB2b2lkIFdyaXRlRW51bU5vVGFnKAorICAgICAgaW50IHZhbHVlLCBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisKKyAgLy8gV3JpdGUgYXJyYXkgb2YgcHJpbWl0aXZlIGZpZWxkcywgd2l0aG91dCB0YWdzCisgIHN0YXRpYyB2b2lkIFdyaXRlRmxvYXRBcnJheShjb25zdCBmbG9hdCogYSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlRG91YmxlQXJyYXkoY29uc3QgZG91YmxlKiBhLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlRml4ZWQzMkFycmF5KGNvbnN0IHVpbnQzMl90KiBhLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBzdGF0aWMgdm9pZCBXcml0ZUZpeGVkNjRBcnJheShjb25zdCB1aW50NjRfdCogYSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgc3RhdGljIHZvaWQgV3JpdGVTRml4ZWQzMkFycmF5KGNvbnN0IGludDMyX3QqIGEsIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBzdGF0aWMgdm9pZCBXcml0ZVNGaXhlZDY0QXJyYXkoY29uc3QgaW50NjRfdCogYSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlQm9vbEFycmF5KGNvbnN0IGJvb2wqIGEsIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisKKyAgLy8gV3JpdGUgZmllbGRzLCBpbmNsdWRpbmcgdGFncy4KKyAgc3RhdGljIHZvaWQgV3JpdGVJbnQzMihpbnQgZmllbGRfbnVtYmVyLCBpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgc3RhdGljIHZvaWQgV3JpdGVJbnQ2NChpbnQgZmllbGRfbnVtYmVyLCBpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgc3RhdGljIHZvaWQgV3JpdGVVSW50MzIoaW50IGZpZWxkX251bWJlciwgdWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgc3RhdGljIHZvaWQgV3JpdGVVSW50NjQoaW50IGZpZWxkX251bWJlciwgdWludDY0X3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgc3RhdGljIHZvaWQgV3JpdGVTSW50MzIoaW50IGZpZWxkX251bWJlciwgaW50MzJfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBzdGF0aWMgdm9pZCBXcml0ZVNJbnQ2NChpbnQgZmllbGRfbnVtYmVyLCBpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlRml4ZWQzMihpbnQgZmllbGRfbnVtYmVyLCB1aW50MzJfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgc3RhdGljIHZvaWQgV3JpdGVGaXhlZDY0KGludCBmaWVsZF9udW1iZXIsIHVpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBzdGF0aWMgdm9pZCBXcml0ZVNGaXhlZDMyKGludCBmaWVsZF9udW1iZXIsIGludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBzdGF0aWMgdm9pZCBXcml0ZVNGaXhlZDY0KGludCBmaWVsZF9udW1iZXIsIGludDY0X3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBzdGF0aWMgdm9pZCBXcml0ZUZsb2F0KGludCBmaWVsZF9udW1iZXIsIGZsb2F0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgc3RhdGljIHZvaWQgV3JpdGVEb3VibGUoaW50IGZpZWxkX251bWJlciwgZG91YmxlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlQm9vbChpbnQgZmllbGRfbnVtYmVyLCBib29sIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBzdGF0aWMgdm9pZCBXcml0ZUVudW0oaW50IGZpZWxkX251bWJlciwgaW50IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworCisgIHN0YXRpYyB2b2lkIFdyaXRlU3RyaW5nKGludCBmaWVsZF9udW1iZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBzdGF0aWMgdm9pZCBXcml0ZUJ5dGVzKGludCBmaWVsZF9udW1iZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBzdGF0aWMgdm9pZCBXcml0ZUJ5dGVzTWF5YmVBbGlhc2VkKGludCBmaWVsZF9udW1iZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisKKyAgc3RhdGljIHZvaWQgV3JpdGVHcm91cChpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBzdGF0aWMgdm9pZCBXcml0ZU1lc3NhZ2UoaW50IGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICAvLyBMaWtlIGFib3ZlLCBidXQgdGhlc2Ugd2lsbCBjaGVjayBpZiB0aGUgb3V0cHV0IHN0cmVhbSBoYXMgZW5vdWdoCisgIC8vIHNwYWNlIHRvIHdyaXRlIGRpcmVjdGx5IHRvIGEgZmxhdCBhcnJheS4KKyAgc3RhdGljIHZvaWQgV3JpdGVHcm91cE1heWJlVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBzdGF0aWMgdm9pZCBXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKworICAvLyBMaWtlIGFib3ZlLCBidXQgZGUtdmlydHVhbGl6ZSB0aGUgY2FsbCB0byBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoKS4gIFRoZQorICAvLyBwb2ludGVyIG11c3QgcG9pbnQgYXQgYW4gaW5zdGFuY2Ugb2YgTWVzc2FnZVR5cGUsICpub3QqIGEgc3ViY2xhc3MgKG9yCisgIC8vIHRoZSBzdWJjbGFzcyBtdXN0IG5vdCBvdmVycmlkZSBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoKSkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNZXNzYWdlVHlwZT4KKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlR3JvdXBOb1ZpcnR1YWwoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZVR5cGUmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNZXNzYWdlVHlwZT4KKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlTWVzc2FnZU5vVmlydHVhbChpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VUeXBlJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisKKyAgLy8gTGlrZSBhYm92ZSwgYnV0IHVzZSBvbmx5ICpUb0FycmF5IG1ldGhvZHMgb2YgQ29kZWRPdXRwdXRTdHJlYW0uCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlVGFnVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lyZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCk7CisKKyAgLy8gV3JpdGUgZmllbGRzLCB3aXRob3V0IHRhZ3MuCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlSW50MzJOb1RhZ1RvQXJyYXkoCisgICAgICBpbnQzMl90IHZhbHVlLCB1aW50OF90KiB0YXJnZXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZUludDY0Tm9UYWdUb0FycmF5KAorICAgICAgaW50NjRfdCB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVVSW50MzJOb1RhZ1RvQXJyYXkoCisgICAgICB1aW50MzJfdCB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVVSW50NjROb1RhZ1RvQXJyYXkoCisgICAgICB1aW50NjRfdCB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVTSW50MzJOb1RhZ1RvQXJyYXkoCisgICAgICBpbnQzMl90IHZhbHVlLCB1aW50OF90KiB0YXJnZXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZVNJbnQ2NE5vVGFnVG9BcnJheSgKKyAgICAgIGludDY0X3QgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlRml4ZWQzMk5vVGFnVG9BcnJheSgKKyAgICAgIHVpbnQzMl90IHZhbHVlLCB1aW50OF90KiB0YXJnZXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZUZpeGVkNjROb1RhZ1RvQXJyYXkoCisgICAgICB1aW50NjRfdCB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVTRml4ZWQzMk5vVGFnVG9BcnJheSgKKyAgICAgIGludDMyX3QgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlU0ZpeGVkNjROb1RhZ1RvQXJyYXkoCisgICAgICBpbnQ2NF90IHZhbHVlLCB1aW50OF90KiB0YXJnZXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZUZsb2F0Tm9UYWdUb0FycmF5KAorICAgICAgZmxvYXQgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlRG91YmxlTm9UYWdUb0FycmF5KAorICAgICAgZG91YmxlIHZhbHVlLCB1aW50OF90KiB0YXJnZXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZUJvb2xOb1RhZ1RvQXJyYXkoYm9vbCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlRW51bU5vVGFnVG9BcnJheShpbnQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpOworCisgIC8vIFdyaXRlIGZpZWxkcywgd2l0aG91dCB0YWdzLiAgVGhlc2UgcmVxdWlyZSB0aGF0IHZhbHVlLnNpemUoKSA+IDAuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZVByaW1pdGl2ZU5vVGFnVG9BcnJheSgKKyAgICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8VD4mIHZhbHVlLCB1aW50OF90KiAoKldyaXRlcikoVCwgdWludDhfdCopLAorICAgICAgdWludDhfdCogdGFyZ2V0KTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlRml4ZWROb1RhZ1RvQXJyYXkoCisgICAgICBjb25zdCBSZXBlYXRlZEZpZWxkPFQ+JiB2YWx1ZSwgdWludDhfdCogKCpXcml0ZXIpKFQsIHVpbnQ4X3QqKSwKKyAgICAgIHVpbnQ4X3QqIHRhcmdldCk7CisKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVJbnQzMk5vVGFnVG9BcnJheSgKKyAgICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50MzJfdD4mIHZhbHVlLCB1aW50OF90KiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZUludDY0Tm9UYWdUb0FycmF5KAorICAgICAgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ2NF90PiYgdmFsdWUsIHVpbnQ4X3QqIG91dHB1dCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlVUludDMyTm9UYWdUb0FycmF5KAorICAgICAgY29uc3QgUmVwZWF0ZWRGaWVsZDx1aW50MzJfdD4mIHZhbHVlLCB1aW50OF90KiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZVVJbnQ2NE5vVGFnVG9BcnJheSgKKyAgICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8dWludDY0X3Q+JiB2YWx1ZSwgdWludDhfdCogb3V0cHV0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVTSW50MzJOb1RhZ1RvQXJyYXkoCisgICAgICBjb25zdCBSZXBlYXRlZEZpZWxkPGludDMyX3Q+JiB2YWx1ZSwgdWludDhfdCogb3V0cHV0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVTSW50NjROb1RhZ1RvQXJyYXkoCisgICAgICBjb25zdCBSZXBlYXRlZEZpZWxkPGludDY0X3Q+JiB2YWx1ZSwgdWludDhfdCogb3V0cHV0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVGaXhlZDMyTm9UYWdUb0FycmF5KAorICAgICAgY29uc3QgUmVwZWF0ZWRGaWVsZDx1aW50MzJfdD4mIHZhbHVlLCB1aW50OF90KiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZUZpeGVkNjROb1RhZ1RvQXJyYXkoCisgICAgICBjb25zdCBSZXBlYXRlZEZpZWxkPHVpbnQ2NF90PiYgdmFsdWUsIHVpbnQ4X3QqIG91dHB1dCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlU0ZpeGVkMzJOb1RhZ1RvQXJyYXkoCisgICAgICBjb25zdCBSZXBlYXRlZEZpZWxkPGludDMyX3Q+JiB2YWx1ZSwgdWludDhfdCogb3V0cHV0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVTRml4ZWQ2NE5vVGFnVG9BcnJheSgKKyAgICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50NjRfdD4mIHZhbHVlLCB1aW50OF90KiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZUZsb2F0Tm9UYWdUb0FycmF5KAorICAgICAgY29uc3QgUmVwZWF0ZWRGaWVsZDxmbG9hdD4mIHZhbHVlLCB1aW50OF90KiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZURvdWJsZU5vVGFnVG9BcnJheSgKKyAgICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8ZG91YmxlPiYgdmFsdWUsIHVpbnQ4X3QqIG91dHB1dCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlQm9vbE5vVGFnVG9BcnJheSgKKyAgICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8Ym9vbD4mIHZhbHVlLCB1aW50OF90KiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZUVudW1Ob1RhZ1RvQXJyYXkoCisgICAgICBjb25zdCBSZXBlYXRlZEZpZWxkPGludD4mIHZhbHVlLCB1aW50OF90KiBvdXRwdXQpOworCisgIC8vIFdyaXRlIGZpZWxkcywgaW5jbHVkaW5nIHRhZ3MuCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlSW50MzJUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlSW50NjRUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlVUludDMyVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZVVJbnQ2NFRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVTSW50MzJUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVTSW50NjRUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVGaXhlZDMyVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlRml4ZWQ2NFRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZVNGaXhlZDMyVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZVNGaXhlZDY0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZUZsb2F0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVEb3VibGVUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZUJvb2xUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZUVudW1Ub0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCk7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlUHJpbWl0aXZlVG9BcnJheSgKKyAgICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IFJlcGVhdGVkRmllbGQ8VD4mIHZhbHVlLAorICAgICAgdWludDhfdCogKCpXcml0ZXIpKGludCwgVCwgdWludDhfdCopLCB1aW50OF90KiB0YXJnZXQpOworCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlSW50MzJUb0FycmF5KAorICAgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQzMl90PiYgdmFsdWUsIHVpbnQ4X3QqIG91dHB1dCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlSW50NjRUb0FycmF5KAorICAgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ2NF90PiYgdmFsdWUsIHVpbnQ4X3QqIG91dHB1dCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlVUludDMyVG9BcnJheSgKKyAgICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IFJlcGVhdGVkRmllbGQ8dWludDMyX3Q+JiB2YWx1ZSwgdWludDhfdCogb3V0cHV0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVVSW50NjRUb0FycmF5KAorICAgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgUmVwZWF0ZWRGaWVsZDx1aW50NjRfdD4mIHZhbHVlLCB1aW50OF90KiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZVNJbnQzMlRvQXJyYXkoCisgICAgICBpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBSZXBlYXRlZEZpZWxkPGludDMyX3Q+JiB2YWx1ZSwgdWludDhfdCogb3V0cHV0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVTSW50NjRUb0FycmF5KAorICAgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ2NF90PiYgdmFsdWUsIHVpbnQ4X3QqIG91dHB1dCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlRml4ZWQzMlRvQXJyYXkoCisgICAgICBpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBSZXBlYXRlZEZpZWxkPHVpbnQzMl90PiYgdmFsdWUsIHVpbnQ4X3QqIG91dHB1dCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlRml4ZWQ2NFRvQXJyYXkoCisgICAgICBpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBSZXBlYXRlZEZpZWxkPHVpbnQ2NF90PiYgdmFsdWUsIHVpbnQ4X3QqIG91dHB1dCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlU0ZpeGVkMzJUb0FycmF5KAorICAgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQzMl90PiYgdmFsdWUsIHVpbnQ4X3QqIG91dHB1dCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlU0ZpeGVkNjRUb0FycmF5KAorICAgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ2NF90PiYgdmFsdWUsIHVpbnQ4X3QqIG91dHB1dCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlRmxvYXRUb0FycmF5KAorICAgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgUmVwZWF0ZWRGaWVsZDxmbG9hdD4mIHZhbHVlLCB1aW50OF90KiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZURvdWJsZVRvQXJyYXkoCisgICAgICBpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBSZXBlYXRlZEZpZWxkPGRvdWJsZT4mIHZhbHVlLCB1aW50OF90KiBvdXRwdXQpOworICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBXcml0ZUJvb2xUb0FycmF5KAorICAgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgUmVwZWF0ZWRGaWVsZDxib29sPiYgdmFsdWUsIHVpbnQ4X3QqIG91dHB1dCk7CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlRW51bVRvQXJyYXkoCisgICAgICBpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBSZXBlYXRlZEZpZWxkPGludD4mIHZhbHVlLCB1aW50OF90KiBvdXRwdXQpOworCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KTsKKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVCeXRlc1RvQXJyYXkoCisgICAgICBpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCk7CisKKyAgLy8gV2hldGhlciB0byBzZXJpYWxpemUgZGV0ZXJtaW5pc3RpY2FsbHkgKGUuZy4sIG1hcCBrZXlzIGFyZQorICAvLyBzb3J0ZWQpIGlzIGEgcHJvcGVydHkgb2YgYSBDb2RlZE91dHB1dFN0cmVhbSwgYW5kIGluIHRoZSBwcm9jZXNzCisgIC8vIG9mIHNlcmlhbGl6YXRpb24sIHRoZSAiVG9BcnJheSIgdmFyaWFudHMgbWF5IGJlIGludm9rZWQuICBCdXQgdGhleSBkb24ndAorICAvLyBoYXZlIGEgQ29kZWRPdXRwdXRTdHJlYW0gYXZhaWxhYmxlLCBzbyB0aGV5IGdldCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlcgorICAvLyB0ZWxsaW5nIHRoZW0gd2hldGhlciB0byBzZXJpYWxpemUgZGV0ZXJtaW5pc3RpY2FsbHkuCisgIHN0YXRpYyB1aW50OF90KiBJbnRlcm5hbFdyaXRlR3JvdXAoaW50IGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKTsKKyAgc3RhdGljIHVpbnQ4X3QqIEludGVybmFsV3JpdGVNZXNzYWdlKGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGVkX3NpemUsIHVpbnQ4X3QqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pOworCisgIC8vIExpa2UgYWJvdmUsIGJ1dCBkZS12aXJ0dWFsaXplIHRoZSBjYWxsIHRvIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpLiAgVGhlCisgIC8vIHBvaW50ZXIgbXVzdCBwb2ludCBhdCBhbiBpbnN0YW5jZSBvZiBNZXNzYWdlVHlwZSwgKm5vdCogYSBzdWJjbGFzcyAob3IKKyAgLy8gdGhlIHN1YmNsYXNzIG11c3Qgbm90IG92ZXJyaWRlIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1lc3NhZ2VUeXBlPgorICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyB1aW50OF90KiBJbnRlcm5hbFdyaXRlR3JvdXBOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGUmIHZhbHVlLCB1aW50OF90KiB0YXJnZXQpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIEludGVybmFsV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VUeXBlJiB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KTsKKworICAvLyBGb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eSwgdGhlIGxhc3QgZm91ciBtZXRob2RzIGFsc28gaGF2ZSB2ZXJzaW9ucworICAvLyB0aGF0IGFyZSBub24tZGV0ZXJtaW5pc3RpYyBhbHdheXMuCisgIFBST1RPQlVGX05ERUJVR19JTkxJTkUgc3RhdGljIHVpbnQ4X3QqIFdyaXRlR3JvdXBUb0FycmF5KAorICAgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLCB1aW50OF90KiB0YXJnZXQpIHsKKyAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSBzdHJlYW0oCisgICAgICAgIHRhcmdldCwKKyAgICAgICAgdmFsdWUuR2V0Q2FjaGVkU2l6ZSgpICsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oMiAqIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihmaWVsZF9udW1iZXIpIDw8IDMpKSwKKyAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpJc0RlZmF1bHRTZXJpYWxpemF0aW9uRGV0ZXJtaW5pc3RpYygpKTsKKyAgICByZXR1cm4gSW50ZXJuYWxXcml0ZUdyb3VwKGZpZWxkX251bWJlciwgdmFsdWUsIHRhcmdldCwgJnN0cmVhbSk7CisgIH0KKyAgUFJPVE9CVUZfTkRFQlVHX0lOTElORSBzdGF0aWMgdWludDhfdCogV3JpdGVNZXNzYWdlVG9BcnJheSgKKyAgICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KSB7CisgICAgaW50IHNpemUgPSB2YWx1ZS5HZXRDYWNoZWRTaXplKCk7CisgICAgaW86OkVwc0NvcHlPdXRwdXRTdHJlYW0gc3RyZWFtKAorICAgICAgICB0YXJnZXQsCisgICAgICAgIHNpemUgKyBzdGF0aWNfY2FzdDxpbnQ+KGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGZpZWxkX251bWJlcikgPDwgMykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihzaXplKSksCisgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6SXNEZWZhdWx0U2VyaWFsaXphdGlvbkRldGVybWluaXN0aWMoKSk7CisgICAgcmV0dXJuIEludGVybmFsV3JpdGVNZXNzYWdlKGZpZWxkX251bWJlciwgdmFsdWUsIHZhbHVlLkdldENhY2hlZFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCAmc3RyZWFtKTsKKyAgfQorCisgIC8vIENvbXB1dGUgdGhlIGJ5dGUgc2l6ZSBvZiBhIGZpZWxkLiAgVGhlIFh4U2l6ZSgpIGZ1bmN0aW9ucyBkbyBOT1QgaW5jbHVkZQorICAvLyB0aGUgdGFnLCBzbyB5b3UgbXVzdCBhbHNvIGNhbGwgVGFnU2l6ZSgpLiAgKFRoaXMgaXMgYmVjYXVzZSwgZm9yIHJlcGVhdGVkCisgIC8vIGZpZWxkcywgeW91IHNob3VsZCBvbmx5IGNhbGwgVGFnU2l6ZSgpIG9uY2UgYW5kIG11bHRpcGx5IGl0IGJ5IHRoZSBlbGVtZW50CisgIC8vIGNvdW50LCBidXQgeW91IG1heSBoYXZlIHRvIGNhbGwgWHhTaXplKCkgZm9yIGVhY2ggaW5kaXZpZHVhbCBlbGVtZW50LikKKyAgc3RhdGljIGlubGluZSBzaXplX3QgSW50MzJTaXplKGludDMyX3QgdmFsdWUpOworICBzdGF0aWMgaW5saW5lIHNpemVfdCBJbnQ2NFNpemUoaW50NjRfdCB2YWx1ZSk7CisgIHN0YXRpYyBpbmxpbmUgc2l6ZV90IFVJbnQzMlNpemUodWludDMyX3QgdmFsdWUpOworICBzdGF0aWMgaW5saW5lIHNpemVfdCBVSW50NjRTaXplKHVpbnQ2NF90IHZhbHVlKTsKKyAgc3RhdGljIGlubGluZSBzaXplX3QgU0ludDMyU2l6ZShpbnQzMl90IHZhbHVlKTsKKyAgc3RhdGljIGlubGluZSBzaXplX3QgU0ludDY0U2l6ZShpbnQ2NF90IHZhbHVlKTsKKyAgc3RhdGljIGlubGluZSBzaXplX3QgRW51bVNpemUoaW50IHZhbHVlKTsKKyAgc3RhdGljIGlubGluZSBzaXplX3QgSW50MzJTaXplUGx1c09uZShpbnQzMl90IHZhbHVlKTsKKyAgc3RhdGljIGlubGluZSBzaXplX3QgSW50NjRTaXplUGx1c09uZShpbnQ2NF90IHZhbHVlKTsKKyAgc3RhdGljIGlubGluZSBzaXplX3QgVUludDMyU2l6ZVBsdXNPbmUodWludDMyX3QgdmFsdWUpOworICBzdGF0aWMgaW5saW5lIHNpemVfdCBVSW50NjRTaXplUGx1c09uZSh1aW50NjRfdCB2YWx1ZSk7CisgIHN0YXRpYyBpbmxpbmUgc2l6ZV90IFNJbnQzMlNpemVQbHVzT25lKGludDMyX3QgdmFsdWUpOworICBzdGF0aWMgaW5saW5lIHNpemVfdCBTSW50NjRTaXplUGx1c09uZShpbnQ2NF90IHZhbHVlKTsKKyAgc3RhdGljIGlubGluZSBzaXplX3QgRW51bVNpemVQbHVzT25lKGludCB2YWx1ZSk7CisKKyAgc3RhdGljIHNpemVfdCBJbnQzMlNpemUoY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQzMl90PiYgdmFsdWUpOworICBzdGF0aWMgc2l6ZV90IEludDY0U2l6ZShjb25zdCBSZXBlYXRlZEZpZWxkPGludDY0X3Q+JiB2YWx1ZSk7CisgIHN0YXRpYyBzaXplX3QgVUludDMyU2l6ZShjb25zdCBSZXBlYXRlZEZpZWxkPHVpbnQzMl90PiYgdmFsdWUpOworICBzdGF0aWMgc2l6ZV90IFVJbnQ2NFNpemUoY29uc3QgUmVwZWF0ZWRGaWVsZDx1aW50NjRfdD4mIHZhbHVlKTsKKyAgc3RhdGljIHNpemVfdCBTSW50MzJTaXplKGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50MzJfdD4mIHZhbHVlKTsKKyAgc3RhdGljIHNpemVfdCBTSW50NjRTaXplKGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50NjRfdD4mIHZhbHVlKTsKKyAgc3RhdGljIHNpemVfdCBFbnVtU2l6ZShjb25zdCBSZXBlYXRlZEZpZWxkPGludD4mIHZhbHVlKTsKKworICAvLyBUaGVzZSB0eXBlcyBhbHdheXMgaGF2ZSB0aGUgc2FtZSBzaXplLgorICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrRml4ZWQzMlNpemUgPSA0OworICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrRml4ZWQ2NFNpemUgPSA4OworICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrU0ZpeGVkMzJTaXplID0gNDsKKyAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga1NGaXhlZDY0U2l6ZSA9IDg7CisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtGbG9hdFNpemUgPSA0OworICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrRG91YmxlU2l6ZSA9IDg7CisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtCb29sU2l6ZSA9IDE7CisKKyAgc3RhdGljIGlubGluZSBzaXplX3QgU3RyaW5nU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGF0aWMgaW5saW5lIHNpemVfdCBCeXRlc1NpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIHN0YXRpYyBpbmxpbmUgc2l6ZV90IEdyb3VwU2l6ZShjb25zdCBNZXNzYWdlVHlwZSYgdmFsdWUpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIHN0YXRpYyBpbmxpbmUgc2l6ZV90IE1lc3NhZ2VTaXplKGNvbnN0IE1lc3NhZ2VUeXBlJiB2YWx1ZSk7CisKKyAgLy8gTGlrZSBhYm92ZSwgYnV0IGRlLXZpcnR1YWxpemUgdGhlIGNhbGwgdG8gQnl0ZVNpemUoKS4gIFRoZQorICAvLyBwb2ludGVyIG11c3QgcG9pbnQgYXQgYW4gaW5zdGFuY2Ugb2YgTWVzc2FnZVR5cGUsICpub3QqIGEgc3ViY2xhc3MgKG9yCisgIC8vIHRoZSBzdWJjbGFzcyBtdXN0IG5vdCBvdmVycmlkZSBCeXRlU2l6ZSgpKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1lc3NhZ2VUeXBlPgorICBzdGF0aWMgaW5saW5lIHNpemVfdCBHcm91cFNpemVOb1ZpcnR1YWwoY29uc3QgTWVzc2FnZVR5cGUmIHZhbHVlKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1lc3NhZ2VUeXBlPgorICBzdGF0aWMgaW5saW5lIHNpemVfdCBNZXNzYWdlU2l6ZU5vVmlydHVhbChjb25zdCBNZXNzYWdlVHlwZSYgdmFsdWUpOworCisgIC8vIEdpdmVuIHRoZSBsZW5ndGggb2YgZGF0YSwgY2FsY3VsYXRlIHRoZSBieXRlIHNpemUgb2YgdGhlIGRhdGEgb24gdGhlCisgIC8vIHdpcmUgaWYgd2UgZW5jb2RlIHRoZSBkYXRhIGFzIGEgbGVuZ3RoIGRlbGltaXRlZCBmaWVsZC4KKyAgc3RhdGljIGlubGluZSBzaXplX3QgTGVuZ3RoRGVsaW1pdGVkU2l6ZShzaXplX3QgbGVuZ3RoKTsKKworIHByaXZhdGU6CisgIC8vIEEgaGVscGVyIG1ldGhvZCBmb3IgdGhlIHJlcGVhdGVkIHByaW1pdGl2ZSByZWFkZXIuIFRoaXMgbWV0aG9kIGhhcworICAvLyBvcHRpbWl6YXRpb25zIGZvciBwcmltaXRpdmUgdHlwZXMgdGhhdCBoYXZlIGZpeGVkIHNpemUgb24gdGhlIHdpcmUsIGFuZAorICAvLyBjYW4gYmUgcmVhZCB1c2luZyBwb3RlbnRpYWxseSBmYXN0ZXIgcGF0aHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgorICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyBib29sIFJlYWRSZXBlYXRlZEZpeGVkU2l6ZVByaW1pdGl2ZSgKKyAgICAgIGludCB0YWdfc2l6ZSwgdWludDMyX3QgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWUpOworCisgIC8vIExpa2UgUmVhZFJlcGVhdGVkRml4ZWRTaXplUHJpbWl0aXZlIGJ1dCBmb3IgcGFja2VkIHByaW1pdGl2ZSBmaWVsZHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgorICBQUk9UT0JVRl9OREVCVUdfSU5MSU5FIHN0YXRpYyBib29sIFJlYWRQYWNrZWRGaXhlZFNpemVQcmltaXRpdmUoCisgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZSk7CisKKyAgc3RhdGljIGNvbnN0IENwcFR5cGUga0ZpZWxkVHlwZVRvQ3BwVHlwZU1hcFtdOworICBzdGF0aWMgY29uc3QgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIGtXaXJlVHlwZUZvckZpZWxkVHlwZVtdOworICBzdGF0aWMgdm9pZCBXcml0ZVN1Yk1lc3NhZ2VNYXliZVRvQXJyYXkoaW50IHNpemUsIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV2lyZUZvcm1hdExpdGUpOworfTsKKworLy8gQSBjbGFzcyB3aGljaCBkZWFscyB3aXRoIHVua25vd24gdmFsdWVzLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdAorLy8gZGlzY2FyZHMgdGhlbS4gIFdpcmVGb3JtYXQgZGVmaW5lcyBhIHN1YmNsYXNzIHdoaWNoIHdyaXRlcyB0byBhbgorLy8gVW5rbm93bkZpZWxkU2V0LiAgVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IEV4dGVuc2lvblNldDo6UGFyc2VGaWVsZCgpLCBzaW5jZQorLy8gRXh0ZW5zaW9uU2V0IGlzIHBhcnQgb2YgdGhlIGxpdGUgbGlicmFyeSBidXQgVW5rbm93bkZpZWxkU2V0IGlzIG5vdC4KK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBGaWVsZFNraXBwZXIgeworIHB1YmxpYzoKKyAgRmllbGRTa2lwcGVyKCkge30KKyAgdmlydHVhbCB+RmllbGRTa2lwcGVyKCkge30KKworICAvLyBTa2lwIGEgZmllbGQgd2hvc2UgdGFnIGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQuCisgIHZpcnR1YWwgYm9vbCBTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzJfdCB0YWcpOworCisgIC8vIFNraXAgYW4gZW50aXJlIG1lc3NhZ2Ugb3IgZ3JvdXAsIHVwIHRvIGFuIGVuZC1ncm91cCB0YWcgKHdoaWNoIGlzIGNvbnN1bWVkKQorICAvLyBvciBlbmQtb2Ytc3RyZWFtLgorICB2aXJ0dWFsIGJvb2wgU2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKworICAvLyBEZWFsIHdpdGggYW4gYWxyZWFkeS1wYXJzZWQgdW5yZWNvZ25pemVkIGVudW0gdmFsdWUuICBUaGUgZGVmYXVsdAorICAvLyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcsIGJ1dCB0aGUgVW5rbm93bkZpZWxkU2V0LWJhc2VkIGltcGxlbWVudGF0aW9uCisgIC8vIHNhdmVzIGl0IGFzIGFuIHVua25vd24gdmFyaW50LgorICB2aXJ0dWFsIHZvaWQgU2tpcFVua25vd25FbnVtKGludCBmaWVsZF9udW1iZXIsIGludCB2YWx1ZSk7Cit9OworCisvLyBTdWJjbGFzcyBvZiBGaWVsZFNraXBwZXIgd2hpY2ggc2F2ZXMgc2tpcHBlZCBmaWVsZHMgdG8gYSBDb2RlZE91dHB1dFN0cmVhbS4KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIENvZGVkT3V0cHV0U3RyZWFtRmllbGRTa2lwcGVyIDogcHVibGljIEZpZWxkU2tpcHBlciB7CisgcHVibGljOgorICBleHBsaWNpdCBDb2RlZE91dHB1dFN0cmVhbUZpZWxkU2tpcHBlcihpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIHVua25vd25fZmllbGRzKQorICAgICAgOiB1bmtub3duX2ZpZWxkc18odW5rbm93bl9maWVsZHMpIHt9CisgIH5Db2RlZE91dHB1dFN0cmVhbUZpZWxkU2tpcHBlcigpIG92ZXJyaWRlIHt9CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZFNraXBwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzJfdCB0YWcpIG92ZXJyaWRlOworICBib29sIFNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgb3ZlcnJpZGU7CisgIHZvaWQgU2tpcFVua25vd25FbnVtKGludCBmaWVsZF9udW1iZXIsIGludCB2YWx1ZSkgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogdW5rbm93bl9maWVsZHNfOworfTsKKworLy8gaW5saW5lIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmxpbmUgV2lyZUZvcm1hdExpdGU6OkNwcFR5cGUgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZVRvQ3BwVHlwZSgKKyAgICBGaWVsZFR5cGUgdHlwZSkgeworICByZXR1cm4ga0ZpZWxkVHlwZVRvQ3BwVHlwZU1hcFt0eXBlXTsKK30KKworY29uc3RleHByIGlubGluZSB1aW50MzJfdCBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlVHlwZSB0eXBlKSB7CisgIHJldHVybiBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTUFLRV9UQUcoZmllbGRfbnVtYmVyLCB0eXBlKTsKK30KKworaW5saW5lIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodWludDMyX3QgdGFnKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxXaXJlVHlwZT4odGFnICYga1RhZ1R5cGVNYXNrKTsKK30KKworaW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodWludDMyX3QgdGFnKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRhZyA+PiBrVGFnVHlwZUJpdHMpOworfQorCitpbmxpbmUgc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpUYWdTaXplKGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgdHlwZSkgeworICBzaXplX3QgcmVzdWx0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZmllbGRfbnVtYmVyIDw8IGtUYWdUeXBlQml0cykpOworICBpZiAodHlwZSA9PSBUWVBFX0dST1VQKSB7CisgICAgLy8gR3JvdXBzIGhhdmUgYm90aCBhIHN0YXJ0IGFuZCBhbiBlbmQgdGFnLgorICAgIHJldHVybiByZXN1bHQgKiAyOworICB9IGVsc2UgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworaW5saW5lIHVpbnQzMl90IFdpcmVGb3JtYXRMaXRlOjpFbmNvZGVGbG9hdChmbG9hdCB2YWx1ZSkgeworICByZXR1cm4gYml0X2Nhc3Q8dWludDMyX3Q+KHZhbHVlKTsKK30KKworaW5saW5lIGZsb2F0IFdpcmVGb3JtYXRMaXRlOjpEZWNvZGVGbG9hdCh1aW50MzJfdCB2YWx1ZSkgeworICByZXR1cm4gYml0X2Nhc3Q8ZmxvYXQ+KHZhbHVlKTsKK30KKworaW5saW5lIHVpbnQ2NF90IFdpcmVGb3JtYXRMaXRlOjpFbmNvZGVEb3VibGUoZG91YmxlIHZhbHVlKSB7CisgIHJldHVybiBiaXRfY2FzdDx1aW50NjRfdD4odmFsdWUpOworfQorCitpbmxpbmUgZG91YmxlIFdpcmVGb3JtYXRMaXRlOjpEZWNvZGVEb3VibGUodWludDY0X3QgdmFsdWUpIHsKKyAgcmV0dXJuIGJpdF9jYXN0PGRvdWJsZT4odmFsdWUpOworfQorCisvLyBaaWdaYWcgVHJhbnNmb3JtOiAgRW5jb2RlcyBzaWduZWQgaW50ZWdlcnMgc28gdGhhdCB0aGV5IGNhbiBiZQorLy8gZWZmZWN0aXZlbHkgdXNlZCB3aXRoIHZhcmludCBlbmNvZGluZy4KKy8vCisvLyB2YXJpbnQgb3BlcmF0ZXMgb24gdW5zaWduZWQgaW50ZWdlcnMsIGVuY29kaW5nIHNtYWxsZXIgbnVtYmVycyBpbnRvCisvLyBmZXdlciBieXRlcy4gIElmIHlvdSB0cnkgdG8gdXNlIGl0IG9uIGEgc2lnbmVkIGludGVnZXIsIGl0IHdpbGwgdHJlYXQKKy8vIHRoaXMgbnVtYmVyIGFzIGEgdmVyeSBsYXJnZSB1bnNpZ25lZCBpbnRlZ2VyLCB3aGljaCBtZWFucyB0aGF0IGV2ZW4KKy8vIHNtYWxsIHNpZ25lZCBudW1iZXJzIGxpa2UgLTEgd2lsbCB0YWtlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcworLy8gKDEwKSB0byBlbmNvZGUuICBaaWdaYWdFbmNvZGUoKSBtYXBzIHNpZ25lZCBpbnRlZ2VycyB0byB1bnNpZ25lZAorLy8gaW4gc3VjaCBhIHdheSB0aGF0IHRob3NlIHdpdGggYSBzbWFsbCBhYnNvbHV0ZSB2YWx1ZSB3aWxsIGhhdmUgc21hbGxlcgorLy8gZW5jb2RlZCB2YWx1ZXMsIG1ha2luZyB0aGVtIGFwcHJvcHJpYXRlIGZvciBlbmNvZGluZyB1c2luZyB2YXJpbnQuCisvLworLy8gICAgICAgaW50MzJfdCAtPiAgICAgdWludDMyX3QKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAwIC0+ICAgICAgICAgIDAKKy8vICAgICAgICAgIC0xIC0+ICAgICAgICAgIDEKKy8vICAgICAgICAgICAxIC0+ICAgICAgICAgIDIKKy8vICAgICAgICAgIC0yIC0+ICAgICAgICAgIDMKKy8vICAgICAgICAgLi4uIC0+ICAgICAgICAuLi4KKy8vICAyMTQ3NDgzNjQ3IC0+IDQyOTQ5NjcyOTQKKy8vIC0yMTQ3NDgzNjQ4IC0+IDQyOTQ5NjcyOTUKKy8vCisvLyAgICAgICAgPj4gZW5jb2RlID4+CisvLyAgICAgICAgPDwgZGVjb2RlIDw8CisKK2lubGluZSB1aW50MzJfdCBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRW5jb2RlMzIoaW50MzJfdCBuKSB7CisgIC8vIE5vdGU6ICB0aGUgcmlnaHQtc2hpZnQgbXVzdCBiZSBhcml0aG1ldGljCisgIC8vIE5vdGU6ICBsZWZ0IHNoaWZ0IG11c3QgYmUgdW5zaWduZWQgYmVjYXVzZSBvZiBvdmVyZmxvdworICByZXR1cm4gKHN0YXRpY19jYXN0PHVpbnQzMl90PihuKSA8PCAxKSBeIHN0YXRpY19jYXN0PHVpbnQzMl90PihuID4+IDMxKTsKK30KKworaW5saW5lIGludDMyX3QgV2lyZUZvcm1hdExpdGU6OlppZ1phZ0RlY29kZTMyKHVpbnQzMl90IG4pIHsKKyAgLy8gTm90ZTogIFVzaW5nIHVuc2lnbmVkIHR5cGVzIHByZXZlbnQgdW5kZWZpbmVkIGJlaGF2aW9yCisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PigobiA+PiAxKSBeICh+KG4gJiAxKSArIDEpKTsKK30KKworaW5saW5lIHVpbnQ2NF90IFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdFbmNvZGU2NChpbnQ2NF90IG4pIHsKKyAgLy8gTm90ZTogIHRoZSByaWdodC1zaGlmdCBtdXN0IGJlIGFyaXRobWV0aWMKKyAgLy8gTm90ZTogIGxlZnQgc2hpZnQgbXVzdCBiZSB1bnNpZ25lZCBiZWNhdXNlIG9mIG92ZXJmbG93CisgIHJldHVybiAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG4pIDw8IDEpIF4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG4gPj4gNjMpOworfQorCitpbmxpbmUgaW50NjRfdCBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRGVjb2RlNjQodWludDY0X3QgbikgeworICAvLyBOb3RlOiAgVXNpbmcgdW5zaWduZWQgdHlwZXMgcHJldmVudCB1bmRlZmluZWQgYmVoYXZpb3IKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KChuID4+IDEpIF4gKH4obiAmIDEpICsgMSkpOworfQorCisvLyBTdHJpbmcgaXMgZm9yIFVURi04IHRleHQgb25seSwgYnV0LCBldmVuIHNvLCBSZWFkU3RyaW5nKCkgY2FuIHNpbXBseQorLy8gY2FsbCBSZWFkQnl0ZXMoKS4KKworaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHZhbHVlKSB7CisgIHJldHVybiBSZWFkQnl0ZXMoaW5wdXQsIHZhbHVlKTsKK30KKworaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqKiBwKSB7CisgIHJldHVybiBSZWFkQnl0ZXMoaW5wdXQsIHApOworfQorCitpbmxpbmUgdWludDhfdCogSW50ZXJuYWxTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zVG9BcnJheSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgdW5rbm93bl9maWVsZHMsIHVpbnQ4X3QqIHRhcmdldCwKKyAgICBpbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSB7CisgIHJldHVybiBzdHJlYW0tPldyaXRlUmF3KHVua25vd25fZmllbGRzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih1bmtub3duX2ZpZWxkcy5zaXplKCkpLCB0YXJnZXQpOworfQorCitpbmxpbmUgc2l6ZV90IENvbXB1dGVVbmtub3duTWVzc2FnZVNldEl0ZW1zU2l6ZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgdW5rbm93bl9maWVsZHMpIHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzLnNpemUoKTsKK30KKworLy8gSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBSZWFkUHJpbWl0aXZlLgorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50MzJfdCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgaW50MzJfdCogdmFsdWUpIHsKKyAgdWludDMyX3QgdGVtcDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0ZW1wKTsKKyAgcmV0dXJuIHRydWU7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50NjRfdCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UNjQ+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgaW50NjRfdCogdmFsdWUpIHsKKyAgdWludDY0X3QgdGVtcDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDY0KCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0ZW1wKTsKKyAgcmV0dXJuIHRydWU7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wKK1dpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPHVpbnQzMl90LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9VSU5UMzI+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyX3QqIHZhbHVlKSB7CisgIHJldHVybiBpbnB1dC0+UmVhZFZhcmludDMyKHZhbHVlKTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbAorV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8dWludDY0X3QsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1VJTlQ2ND4oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50NjRfdCogdmFsdWUpIHsKKyAgcmV0dXJuIGlucHV0LT5SZWFkVmFyaW50NjQodmFsdWUpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludDMyX3QsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NJTlQzMj4oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCBpbnQzMl90KiB2YWx1ZSkgeworICB1aW50MzJfdCB0ZW1wOworICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJnRlbXApKSByZXR1cm4gZmFsc2U7CisgICp2YWx1ZSA9IFppZ1phZ0RlY29kZTMyKHRlbXApOworICByZXR1cm4gdHJ1ZTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTxpbnQ2NF90LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TSU5UNjQ+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgaW50NjRfdCogdmFsdWUpIHsKKyAgdWludDY0X3QgdGVtcDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDY0KCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSBaaWdaYWdEZWNvZGU2NCh0ZW1wKTsKKyAgcmV0dXJuIHRydWU7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wKK1dpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPHVpbnQzMl90LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9GSVhFRDMyPigKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQzMl90KiB2YWx1ZSkgeworICByZXR1cm4gaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW4zMih2YWx1ZSk7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wKK1dpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPHVpbnQ2NF90LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9GSVhFRDY0PigKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQ2NF90KiB2YWx1ZSkgeworICByZXR1cm4gaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW42NCh2YWx1ZSk7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wKK1dpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludDMyX3QsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NGSVhFRDMyPigKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIGludDMyX3QqIHZhbHVlKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIGlmICghaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW4zMigmdGVtcCkpIHJldHVybiBmYWxzZTsKKyAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odGVtcCk7CisgIHJldHVybiB0cnVlOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sCitXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTxpbnQ2NF90LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TRklYRUQ2ND4oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCBpbnQ2NF90KiB2YWx1ZSkgeworICB1aW50NjRfdCB0ZW1wOworICBpZiAoIWlucHV0LT5SZWFkTGl0dGxlRW5kaWFuNjQoJnRlbXApKSByZXR1cm4gZmFsc2U7CisgICp2YWx1ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KHRlbXApOworICByZXR1cm4gdHJ1ZTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTxmbG9hdCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRkxPQVQ+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgZmxvYXQqIHZhbHVlKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIGlmICghaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW4zMigmdGVtcCkpIHJldHVybiBmYWxzZTsKKyAgKnZhbHVlID0gRGVjb2RlRmxvYXQodGVtcCk7CisgIHJldHVybiB0cnVlOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGRvdWJsZSwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRE9VQkxFPigKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIGRvdWJsZSogdmFsdWUpIHsKKyAgdWludDY0X3QgdGVtcDsKKyAgaWYgKCFpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjY0KCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSBEZWNvZGVEb3VibGUodGVtcCk7CisgIHJldHVybiB0cnVlOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGJvb2wsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgYm9vbCogdmFsdWUpIHsKKyAgdWludDY0X3QgdGVtcDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDY0KCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSB0ZW1wICE9IDA7CisgIHJldHVybiB0cnVlOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCBpbnQqIHZhbHVlKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmdGVtcCkpIHJldHVybiBmYWxzZTsKKyAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50Pih0ZW1wKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgdWludDhfdCoKK1dpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlRnJvbUFycmF5PHVpbnQzMl90LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9GSVhFRDMyPigKKyAgICBjb25zdCB1aW50OF90KiBidWZmZXIsIHVpbnQzMl90KiB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW4zMkZyb21BcnJheShidWZmZXIsIHZhbHVlKTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgdWludDhfdCoKK1dpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlRnJvbUFycmF5PHVpbnQ2NF90LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9GSVhFRDY0PigKKyAgICBjb25zdCB1aW50OF90KiBidWZmZXIsIHVpbnQ2NF90KiB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW42NEZyb21BcnJheShidWZmZXIsIHZhbHVlKTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgdWludDhfdCoKK1dpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlRnJvbUFycmF5PGludDMyX3QsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NGSVhFRDMyPigKKyAgICBjb25zdCB1aW50OF90KiBidWZmZXIsIGludDMyX3QqIHZhbHVlKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIGJ1ZmZlciA9IGlvOjpDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXkoYnVmZmVyLCAmdGVtcCk7CisgICp2YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHRlbXApOworICByZXR1cm4gYnVmZmVyOworfQordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCB1aW50OF90KgorV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmVGcm9tQXJyYXk8aW50NjRfdCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfU0ZJWEVENjQ+KAorICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwgaW50NjRfdCogdmFsdWUpIHsKKyAgdWludDY0X3QgdGVtcDsKKyAgYnVmZmVyID0gaW86OkNvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW42NEZyb21BcnJheShidWZmZXIsICZ0ZW1wKTsKKyAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4odGVtcCk7CisgIHJldHVybiBidWZmZXI7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGNvbnN0IHVpbnQ4X3QqCitXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZUZyb21BcnJheTxmbG9hdCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRkxPQVQ+KAorICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwgZmxvYXQqIHZhbHVlKSB7CisgIHVpbnQzMl90IHRlbXA7CisgIGJ1ZmZlciA9IGlvOjpDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXkoYnVmZmVyLCAmdGVtcCk7CisgICp2YWx1ZSA9IERlY29kZUZsb2F0KHRlbXApOworICByZXR1cm4gYnVmZmVyOworfQordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCB1aW50OF90KgorV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmVGcm9tQXJyYXk8ZG91YmxlLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9ET1VCTEU+KAorICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwgZG91YmxlKiB2YWx1ZSkgeworICB1aW50NjRfdCB0ZW1wOworICBidWZmZXIgPSBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjY0RnJvbUFycmF5KGJ1ZmZlciwgJnRlbXApOworICAqdmFsdWUgPSBEZWNvZGVEb3VibGUodGVtcCk7CisgIHJldHVybiBidWZmZXI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIERlY2xhcmVkVHlwZT4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmUoCisgICAgaW50LCAgLy8gdGFnX3NpemUsIHVudXNlZC4KKyAgICB1aW50MzJfdCB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlcykgeworICBDVHlwZSB2YWx1ZTsKKyAgaWYgKCFSZWFkUHJpbWl0aXZlPENUeXBlLCBEZWNsYXJlZFR5cGU+KGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgIHZhbHVlcy0+QWRkKHZhbHVlKTsKKyAgaW50IGVsZW1lbnRzX2FscmVhZHlfcmVzZXJ2ZWQgPSB2YWx1ZXMtPkNhcGFjaXR5KCkgLSB2YWx1ZXMtPnNpemUoKTsKKyAgd2hpbGUgKGVsZW1lbnRzX2FscmVhZHlfcmVzZXJ2ZWQgPiAwICYmIGlucHV0LT5FeHBlY3RUYWcodGFnKSkgeworICAgIGlmICghUmVhZFByaW1pdGl2ZTxDVHlwZSwgRGVjbGFyZWRUeXBlPihpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgIHZhbHVlcy0+QWRkQWxyZWFkeVJlc2VydmVkKHZhbHVlKTsKKyAgICBlbGVtZW50c19hbHJlYWR5X3Jlc2VydmVkLS07CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIERlY2xhcmVkVHlwZT4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRGaXhlZFNpemVQcmltaXRpdmUoCisgICAgaW50IHRhZ19zaXplLCB1aW50MzJfdCB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWVzKSB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEoVUludDMyU2l6ZSh0YWcpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRhZ19zaXplKSk7CisgIENUeXBlIHZhbHVlOworICBpZiAoIVJlYWRQcmltaXRpdmU8Q1R5cGUsIERlY2xhcmVkVHlwZT4oaW5wdXQsICZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgdmFsdWVzLT5BZGQodmFsdWUpOworCisgIC8vIEZvciBmaXhlZCBzaXplIHZhbHVlcywgcmVwZWF0ZWQgdmFsdWVzIGNhbiBiZSByZWFkIG1vcmUgcXVpY2tseSBieQorICAvLyByZWFkaW5nIGRpcmVjdGx5IGZyb20gYSByYXcgYXJyYXkuCisgIC8vCisgIC8vIFdlIGNhbiBnZXQgYSB0aWdodCBsb29wIGJ5IG9ubHkgcmVhZGluZyBhcyBtYW55IGVsZW1lbnRzIGFzIGNhbiBiZQorICAvLyBhZGRlZCB0byB0aGUgUmVwZWF0ZWRGaWVsZCB3aXRob3V0IGhhdmluZyB0byBkbyBhbnkgcmVzaXppbmcuIEFkZGl0aW9uYWxseSwKKyAgLy8gd2Ugb25seSB0cnkgdG8gcmVhZCBhcyBtYW55IGVsZW1lbnRzIGFzIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgY3VycmVudAorICAvLyBidWZmZXIgc3BhY2UuIERvaW5nIHNvIGF2b2lkcyBoYXZpbmcgdG8gcGVyZm9ybSBib3VuZGFyeSBjaGVja3Mgd2hlbgorICAvLyByZWFkaW5nIHRoZSB2YWx1ZTogdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgY2FuIGJlIHJlYWQgaXMKKyAgLy8ga25vd24gb3V0c2lkZSBvZiB0aGUgbG9vcC4KKyAgY29uc3Qgdm9pZCogdm9pZF9wb2ludGVyOworICBpbnQgc2l6ZTsKKyAgaW5wdXQtPkdldERpcmVjdEJ1ZmZlclBvaW50ZXJJbmxpbmUoJnZvaWRfcG9pbnRlciwgJnNpemUpOworICBpZiAoc2l6ZSA+IDApIHsKKyAgICBjb25zdCB1aW50OF90KiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih2b2lkX3BvaW50ZXIpOworICAgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgZWFjaCB0eXBlIG9jY3VwaWVzIG9uIHRoZSB3aXJlLgorICAgIGNvbnN0IGludCBwZXJfdmFsdWVfc2l6ZSA9IHRhZ19zaXplICsgc3RhdGljX2Nhc3Q8aW50PihzaXplb2YodmFsdWUpKTsKKworICAgIC8vIHBhcmVudGhlc2VzIGFyb3VuZCAoc3RkOjptaW4pIHByZXZlbnRzIG1hY3JvIGV4cGFuc2lvbiBvZiBtaW4oLi4uKQorICAgIGludCBlbGVtZW50c19hdmFpbGFibGUgPQorICAgICAgICAoc3RkOjptaW4pKHZhbHVlcy0+Q2FwYWNpdHkoKSAtIHZhbHVlcy0+c2l6ZSgpLCBzaXplIC8gcGVyX3ZhbHVlX3NpemUpOworICAgIGludCBudW1fcmVhZCA9IDA7CisgICAgd2hpbGUgKG51bV9yZWFkIDwgZWxlbWVudHNfYXZhaWxhYmxlICYmCisgICAgICAgICAgIChidWZmZXIgPSBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6RXhwZWN0VGFnRnJvbUFycmF5KGJ1ZmZlciwgdGFnKSkgIT0KKyAgICAgICAgICAgICAgIG51bGxwdHIpIHsKKyAgICAgIGJ1ZmZlciA9IFJlYWRQcmltaXRpdmVGcm9tQXJyYXk8Q1R5cGUsIERlY2xhcmVkVHlwZT4oYnVmZmVyLCAmdmFsdWUpOworICAgICAgdmFsdWVzLT5BZGRBbHJlYWR5UmVzZXJ2ZWQodmFsdWUpOworICAgICAgKytudW1fcmVhZDsKKyAgICB9CisgICAgY29uc3QgaW50IHJlYWRfYnl0ZXMgPSBudW1fcmVhZCAqIHBlcl92YWx1ZV9zaXplOworICAgIGlmIChyZWFkX2J5dGVzID4gMCkgeworICAgICAgaW5wdXQtPlNraXAocmVhZF9ieXRlcyk7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBTcGVjaWFsaXphdGlvbnMgb2YgUmVhZFJlcGVhdGVkUHJpbWl0aXZlIGZvciB0aGUgZml4ZWQgc2l6ZSB0eXBlcywgd2hpY2ggdXNlCisvLyB0aGUgb3B0aW1pemVkIGNvZGUgcGF0aC4KKyNkZWZpbmUgUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShDUFBUWVBFLCBERUNMQVJFRF9UWVBFKSAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmU8ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENQUFRZUEUsIFdpcmVGb3JtYXRMaXRlOjpERUNMQVJFRF9UWVBFPiggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50IHRhZ19zaXplLCB1aW50MzJfdCB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgICAgICAgICAgICBcCisgICAgICBSZXBlYXRlZEZpZWxkPENQUFRZUEU+KiB2YWx1ZXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gUmVhZFJlcGVhdGVkRml4ZWRTaXplUHJpbWl0aXZlPENQUFRZUEUsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkRFQ0xBUkVEX1RZUEU+KCBcCisgICAgICAgIHRhZ19zaXplLCB0YWcsIGlucHV0LCB2YWx1ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKHVpbnQzMl90LCBUWVBFX0ZJWEVEMzIpCitSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKHVpbnQ2NF90LCBUWVBFX0ZJWEVENjQpCitSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKGludDMyX3QsIFRZUEVfU0ZJWEVEMzIpCitSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKGludDY0X3QsIFRZUEVfU0ZJWEVENjQpCitSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKGZsb2F0LCBUWVBFX0ZMT0FUKQorUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShkb3VibGUsIFRZUEVfRE9VQkxFKQorCisjdW5kZWYgUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+Citib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmVOb0lubGluZSgKKyAgICBpbnQgdGFnX3NpemUsIHVpbnQzMl90IHRhZywgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZSkgeworICByZXR1cm4gUmVhZFJlcGVhdGVkUHJpbWl0aXZlPENUeXBlLCBEZWNsYXJlZFR5cGU+KHRhZ19zaXplLCB0YWcsIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRQcmltaXRpdmUoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlcykgeworICBpbnQgbGVuZ3RoOworICBpZiAoIWlucHV0LT5SZWFkVmFyaW50U2l6ZUFzSW50KCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGlucHV0LT5QdXNoTGltaXQobGVuZ3RoKTsKKyAgd2hpbGUgKGlucHV0LT5CeXRlc1VudGlsTGltaXQoKSA+IDApIHsKKyAgICBDVHlwZSB2YWx1ZTsKKyAgICBpZiAoIVJlYWRQcmltaXRpdmU8Q1R5cGUsIERlY2xhcmVkVHlwZT4oaW5wdXQsICZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICB2YWx1ZXMtPkFkZCh2YWx1ZSk7CisgIH0KKyAgaW5wdXQtPlBvcExpbWl0KGxpbWl0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIERlY2xhcmVkVHlwZT4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkRml4ZWRTaXplUHJpbWl0aXZlKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlcykgeworICBpbnQgbGVuZ3RoOworICBpZiAoIWlucHV0LT5SZWFkVmFyaW50U2l6ZUFzSW50KCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgIGNvbnN0IGludCBvbGRfZW50cmllcyA9IHZhbHVlcy0+c2l6ZSgpOworICBjb25zdCBpbnQgbmV3X2VudHJpZXMgPSBsZW5ndGggLyBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihDVHlwZSkpOworICBjb25zdCBpbnQgbmV3X2J5dGVzID0gbmV3X2VudHJpZXMgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihDVHlwZSkpOworICBpZiAobmV3X2J5dGVzICE9IGxlbmd0aCkgcmV0dXJuIGZhbHNlOworICAvLyBXZSB3b3VsZCAqbGlrZSogdG8gcHJlLWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gd3JpdGUgaW50byAoZm9yCisgIC8vIHNwZWVkKSwgYnV0ICptdXN0KiBhdm9pZCBwZXJmb3JtaW5nIGEgdmVyeSBsYXJnZSBhbGxvY2F0aW9uIGR1ZQorICAvLyB0byBhIG1hbGljaW91cyB1c2VyLXN1cHBsaWVkICJsZW5ndGgiIGFib3ZlLiAgU28gd2UgaGF2ZSBhIGZhc3QKKyAgLy8gcGF0aCB0aGF0IHByZS1hbGxvY2F0ZXMgd2hlbiB0aGUgImxlbmd0aCIgaXMgbGVzcyB0aGFuIGEgYm91bmQuCisgIC8vIFdlIGRldGVybWluZSB0aGUgYm91bmQgYnkgY2FsbGluZyBCeXRlc1VudGlsVG90YWxCeXRlc0xpbWl0KCkgYW5kCisgIC8vIEJ5dGVzVW50aWxMaW1pdCgpLiAgVGhlc2UgcmV0dXJuIC0xIHRvIG1lYW4gIm5vIGxpbWl0IHNldCIuCisgIC8vIFRoZXJlIGFyZSBmb3VyIGNhc2VzOgorICAvLyBUb3RhbEJ5dGVzTGltaXQgIExpbWl0CisgIC8vIC0xICAgICAgICAgICAgICAgLTEgICAgIFVzZSBzbG93IHBhdGguCisgIC8vIC0xICAgICAgICAgICAgICAgPj0gMCAgIFVzZSBmYXN0IHBhdGggaWYgbGVuZ3RoIDw9IExpbWl0LgorICAvLyA+PSAwICAgICAgICAgICAgIC0xICAgICBVc2Ugc2xvdyBwYXRoLgorICAvLyA+PSAwICAgICAgICAgICAgID49IDAgICBVc2UgZmFzdCBwYXRoIGlmIGxlbmd0aCA8PSBtaW4oYm90aCBsaW1pdHMpLgorICBpbnQ2NF90IGJ5dGVzX2xpbWl0ID0gaW5wdXQtPkJ5dGVzVW50aWxUb3RhbEJ5dGVzTGltaXQoKTsKKyAgaWYgKGJ5dGVzX2xpbWl0ID09IC0xKSB7CisgICAgYnl0ZXNfbGltaXQgPSBpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCk7CisgIH0gZWxzZSB7CisgICAgLy8gcGFyZW50aGVzZXMgYXJvdW5kIChzdGQ6Om1pbikgcHJldmVudHMgbWFjcm8gZXhwYW5zaW9uIG9mIG1pbiguLi4pCisgICAgYnl0ZXNfbGltaXQgPQorICAgICAgICAoc3RkOjptaW4pKGJ5dGVzX2xpbWl0LCBzdGF0aWNfY2FzdDxpbnQ2NF90PihpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkpKTsKKyAgfQorICBpZiAoYnl0ZXNfbGltaXQgPj0gbmV3X2J5dGVzKSB7CisgICAgLy8gRmFzdC1wYXRoIHRoYXQgcHJlLWFsbG9jYXRlcyAqdmFsdWVzIHRvIHRoZSBmaW5hbCBzaXplLgorI2lmIGRlZmluZWQoUFJPVE9CVUZfTElUVExFX0VORElBTikKKyAgICB2YWx1ZXMtPlJlc2l6ZShvbGRfZW50cmllcyArIG5ld19lbnRyaWVzLCAwKTsKKyAgICAvLyB2YWx1ZXMtPm11dGFibGVfZGF0YSgpIG1heSBjaGFuZ2UgYWZ0ZXIgUmVzaXplKCksIHNvIGRvIHRoaXMgYWZ0ZXI6CisgICAgdm9pZCogZGVzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHZhbHVlcy0+bXV0YWJsZV9kYXRhKCkgKyBvbGRfZW50cmllcyk7CisgICAgaWYgKCFpbnB1dC0+UmVhZFJhdyhkZXN0LCBuZXdfYnl0ZXMpKSB7CisgICAgICB2YWx1ZXMtPlRydW5jYXRlKG9sZF9lbnRyaWVzKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjZWxzZQorICAgIHZhbHVlcy0+UmVzZXJ2ZShvbGRfZW50cmllcyArIG5ld19lbnRyaWVzKTsKKyAgICBDVHlwZSB2YWx1ZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ld19lbnRyaWVzOyArK2kpIHsKKyAgICAgIGlmICghUmVhZFByaW1pdGl2ZTxDVHlwZSwgRGVjbGFyZWRUeXBlPihpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgdmFsdWVzLT5BZGRBbHJlYWR5UmVzZXJ2ZWQodmFsdWUpOworICAgIH0KKyNlbmRpZgorICB9IGVsc2UgeworICAgIC8vIFRoaXMgaXMgdGhlIHNsb3ctcGF0aCBjYXNlIHdoZXJlICJsZW5ndGgiIG1heSBiZSB0b28gbGFyZ2UgdG8KKyAgICAvLyBzYWZlbHkgYWxsb2NhdGUuICBXZSByZWFkIGFzIG11Y2ggYXMgd2UgY2FuIGludG8gKnZhbHVlcworICAgIC8vIHdpdGhvdXQgcHJlLWFsbG9jYXRpbmcgImxlbmd0aCIgYnl0ZXMuCisgICAgQ1R5cGUgdmFsdWU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdfZW50cmllczsgKytpKSB7CisgICAgICBpZiAoIVJlYWRQcmltaXRpdmU8Q1R5cGUsIERlY2xhcmVkVHlwZT4oaW5wdXQsICZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICAgIHZhbHVlcy0+QWRkKHZhbHVlKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFNwZWNpYWxpemF0aW9ucyBvZiBSZWFkUGFja2VkUHJpbWl0aXZlIGZvciB0aGUgZml4ZWQgc2l6ZSB0eXBlcywgd2hpY2ggdXNlCisvLyBhbiBvcHRpbWl6ZWQgY29kZSBwYXRoLgorI2RlZmluZSBSRUFEX1JFUEVBVEVEX1BBQ0tFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShDUFBUWVBFLCBERUNMQVJFRF9UWVBFKSAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZFByaW1pdGl2ZTxDUFBUWVBFLCBXaXJlRm9ybWF0TGl0ZTo6REVDTEFSRURfVFlQRT4oIFwKKyAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtICogaW5wdXQsIFJlcGVhdGVkRmllbGQ8Q1BQVFlQRT4gKiB2YWx1ZXMpIHsgICAgICAgICBcCisgICAgcmV0dXJuIFJlYWRQYWNrZWRGaXhlZFNpemVQcmltaXRpdmU8Q1BQVFlQRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpERUNMQVJFRF9UWVBFPiggICAgICAgIFwKKyAgICAgICAgaW5wdXQsIHZhbHVlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworUkVBRF9SRVBFQVRFRF9QQUNLRURfRklYRURfU0laRV9QUklNSVRJVkUodWludDMyX3QsIFRZUEVfRklYRUQzMikKK1JFQURfUkVQRUFURURfUEFDS0VEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKHVpbnQ2NF90LCBUWVBFX0ZJWEVENjQpCitSRUFEX1JFUEVBVEVEX1BBQ0tFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShpbnQzMl90LCBUWVBFX1NGSVhFRDMyKQorUkVBRF9SRVBFQVRFRF9QQUNLRURfRklYRURfU0laRV9QUklNSVRJVkUoaW50NjRfdCwgVFlQRV9TRklYRUQ2NCkKK1JFQURfUkVQRUFURURfUEFDS0VEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKGZsb2F0LCBUWVBFX0ZMT0FUKQorUkVBRF9SRVBFQVRFRF9QQUNLRURfRklYRURfU0laRV9QUklNSVRJVkUoZG91YmxlLCBUWVBFX0RPVUJMRSkKKworI3VuZGVmIFJFQURfUkVQRUFURURfUEFDS0VEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIERlY2xhcmVkVHlwZT4KK2Jvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRQcmltaXRpdmVOb0lubGluZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlcykgeworICByZXR1cm4gUmVhZFBhY2tlZFByaW1pdGl2ZTxDVHlwZSwgRGVjbGFyZWRUeXBlPihpbnB1dCwgdmFsdWVzKTsKK30KKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZEdyb3VwKGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVR5cGUqIHZhbHVlKSB7CisgIGlmICghaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpIHJldHVybiBmYWxzZTsKKyAgaWYgKCF2YWx1ZS0+TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlucHV0KSkgcmV0dXJuIGZhbHNlOworICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgLy8gTWFrZSBzdXJlIHRoZSBsYXN0IHRoaW5nIHJlYWQgd2FzIGFuIGVuZCB0YWcgZm9yIHRoaXMgZ3JvdXAuCisgIGlmICghaW5wdXQtPkxhc3RUYWdXYXMoTWFrZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0VORF9HUk9VUCkpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQordGVtcGxhdGUgPHR5cGVuYW1lIE1lc3NhZ2VUeXBlPgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVHlwZSogdmFsdWUpIHsKKyAgaW50IGxlbmd0aDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludFNpemVBc0ludCgmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICBzdGQ6OnBhaXI8aW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0LCBpbnQ+IHAgPQorICAgICAgaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoQW5kUHVzaExpbWl0KGxlbmd0aCk7CisgIGlmIChwLnNlY29uZCA8IDAgfHwgIXZhbHVlLT5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW5wdXQpKSByZXR1cm4gZmFsc2U7CisgIC8vIE1ha2Ugc3VyZSB0aGF0IHBhcnNpbmcgc3RvcHBlZCB3aGVuIHRoZSBsaW1pdCB3YXMgaGl0LCBub3QgYXQgYW4gZW5kZ3JvdXAKKyAgLy8gdGFnLgorICByZXR1cm4gaW5wdXQtPkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoQW5kUG9wTGltaXQocC5maXJzdCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKGludCBmaWVsZF9udW1iZXIsIFdpcmVUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZVRhZyhNYWtlVGFnKGZpZWxkX251bWJlciwgdHlwZSkpOworfQorCitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMk5vVGFnKGludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMlNpZ25FeHRlbmRlZCh2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQ2NE5vVGFnKGludDY0X3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQ2NChzdGF0aWNfY2FzdDx1aW50NjRfdD4odmFsdWUpKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMk5vVGFnKHVpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQ2NE5vVGFnKHVpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZVZhcmludDY0KHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQzMk5vVGFnKGludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlVmFyaW50MzIoWmlnWmFnRW5jb2RlMzIodmFsdWUpKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQ2NE5vVGFnKGludDY0X3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlVmFyaW50NjQoWmlnWmFnRW5jb2RlNjQodmFsdWUpKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkMzJOb1RhZyh1aW50MzJfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuMzIodmFsdWUpOworfQoraW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQ2NE5vVGFnKHVpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW42NCh2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTRml4ZWQzMk5vVGFnKGludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW4zMihzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUpKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNGaXhlZDY0Tm9UYWcoaW50NjRfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjY0KHN0YXRpY19jYXN0PHVpbnQ2NF90Pih2YWx1ZSkpOworfQoraW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlRmxvYXROb1RhZyhmbG9hdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjMyKEVuY29kZUZsb2F0KHZhbHVlKSk7Cit9CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVEb3VibGVOb1RhZyhkb3VibGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuNjQoRW5jb2RlRG91YmxlKHZhbHVlKSk7Cit9CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sTm9UYWcoYm9vbCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlVmFyaW50MzIodmFsdWUgPyAxIDogMCk7Cit9CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtTm9UYWcoaW50IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMlNpZ25FeHRlbmRlZCh2YWx1ZSk7Cit9CisKKy8vIFNlZSBjb21tZW50IG9uIFJlYWRHcm91cE5vVmlydHVhbCB0byB1bmRlcnN0YW5kIHRoZSBuZWVkIGZvciB0aGlzIHRlbXBsYXRlCisvLyBwYXJhbWV0ZXIgbmFtZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0PgoraW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlR3JvdXBOb1ZpcnR1YWwoCisgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCYgdmFsdWUsCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9TVEFSVF9HUk9VUCwgb3V0cHV0KTsKKyAgdmFsdWUuTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG91dHB1dCk7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRU5EX0dST1VQLCBvdXRwdXQpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTm9WaXJ0dWFsKAorICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3QmIHZhbHVlLAorICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKKyAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKAorICAgICAgdmFsdWUuTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6R2V0Q2FjaGVkU2l6ZSgpKTsKKyAgdmFsdWUuTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG91dHB1dCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZ1RvQXJyYXkoaW50IGZpZWxkX251bWJlciwgV2lyZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVRhZ1RvQXJyYXkoTWFrZVRhZyhmaWVsZF9udW1iZXIsIHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKK30KKworaW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyTm9UYWdUb0FycmF5KGludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWRUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0Tm9UYWdUb0FycmF5KGludDY0X3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50NjRUb0FycmF5KAorICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHZhbHVlKSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzJOb1RhZ1RvQXJyYXkodWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjROb1RhZ1RvQXJyYXkodWludDY0X3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDY0VG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTSW50MzJOb1RhZ1RvQXJyYXkoaW50MzJfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KFppZ1phZ0VuY29kZTMyKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTSW50NjROb1RhZ1RvQXJyYXkoaW50NjRfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50NjRUb0FycmF5KFppZ1phZ0VuY29kZTY0KHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDMyTm9UYWdUb0FycmF5KHVpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuMzJUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkNjROb1RhZ1RvQXJyYXkodWludDY0X3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW42NFRvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDhfdCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkMzJOb1RhZ1RvQXJyYXkoaW50MzJfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW4zMlRvQXJyYXkoCisgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUpLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNGaXhlZDY0Tm9UYWdUb0FycmF5KGludDY0X3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuNjRUb0FycmF5KAorICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHZhbHVlKSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdE5vVGFnVG9BcnJheShmbG9hdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW4zMlRvQXJyYXkoRW5jb2RlRmxvYXQodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZURvdWJsZU5vVGFnVG9BcnJheShkb3VibGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjY0VG9BcnJheShFbmNvZGVEb3VibGUodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xOb1RhZ1RvQXJyYXkoYm9vbCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSh2YWx1ZSA/IDEgOiAwLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ob1RhZ1RvQXJyYXkoaW50IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWRUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVQcmltaXRpdmVOb1RhZ1RvQXJyYXkoCisgICAgY29uc3QgUmVwZWF0ZWRGaWVsZDxUPiYgdmFsdWUsIHVpbnQ4X3QqICgqV3JpdGVyKShULCB1aW50OF90KiksCisgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIGNvbnN0IGludCBuID0gdmFsdWUuc2l6ZSgpOworICBHT09HTEVfRENIRUNLX0dUKG4sIDApOworCisgIGNvbnN0IFQqIGlpID0gdmFsdWUuZGF0YSgpOworICBpbnQgaSA9IDA7CisgIGRvIHsKKyAgICB0YXJnZXQgPSBXcml0ZXIoaWlbaV0sIHRhcmdldCk7CisgIH0gd2hpbGUgKCsraSA8IG4pOworCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkTm9UYWdUb0FycmF5KAorICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8VD4mIHZhbHVlLCB1aW50OF90KiAoKldyaXRlcikoVCwgdWludDhfdCopLAorICAgIHVpbnQ4X3QqIHRhcmdldCkgeworI2lmIGRlZmluZWQoUFJPVE9CVUZfTElUVExFX0VORElBTikKKyAgKHZvaWQpV3JpdGVyOworCisgIGNvbnN0IGludCBuID0gdmFsdWUuc2l6ZSgpOworICBHT09HTEVfRENIRUNLX0dUKG4sIDApOworCisgIGNvbnN0IFQqIGlpID0gdmFsdWUuZGF0YSgpOworICBjb25zdCBpbnQgYnl0ZXMgPSBuICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoaWlbMF0pKTsKKyAgbWVtY3B5KHRhcmdldCwgaWksIHN0YXRpY19jYXN0PHNpemVfdD4oYnl0ZXMpKTsKKyAgcmV0dXJuIHRhcmdldCArIGJ5dGVzOworI2Vsc2UKKyAgcmV0dXJuIFdyaXRlUHJpbWl0aXZlTm9UYWdUb0FycmF5KHZhbHVlLCBXcml0ZXIsIHRhcmdldCk7CisjZW5kaWYKK30KKworaW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyTm9UYWdUb0FycmF5KAorICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50MzJfdD4mIHZhbHVlLCB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIFdyaXRlUHJpbWl0aXZlTm9UYWdUb0FycmF5KHZhbHVlLCBXcml0ZUludDMyTm9UYWdUb0FycmF5LCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0Tm9UYWdUb0FycmF5KAorICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50NjRfdD4mIHZhbHVlLCB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIFdyaXRlUHJpbWl0aXZlTm9UYWdUb0FycmF5KHZhbHVlLCBXcml0ZUludDY0Tm9UYWdUb0FycmF5LCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMk5vVGFnVG9BcnJheSgKKyAgICBjb25zdCBSZXBlYXRlZEZpZWxkPHVpbnQzMl90PiYgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gV3JpdGVQcmltaXRpdmVOb1RhZ1RvQXJyYXkodmFsdWUsIFdyaXRlVUludDMyTm9UYWdUb0FycmF5LCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQ2NE5vVGFnVG9BcnJheSgKKyAgICBjb25zdCBSZXBlYXRlZEZpZWxkPHVpbnQ2NF90PiYgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gV3JpdGVQcmltaXRpdmVOb1RhZ1RvQXJyYXkodmFsdWUsIFdyaXRlVUludDY0Tm9UYWdUb0FycmF5LCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQzMk5vVGFnVG9BcnJheSgKKyAgICBjb25zdCBSZXBlYXRlZEZpZWxkPGludDMyX3Q+JiB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBXcml0ZVByaW1pdGl2ZU5vVGFnVG9BcnJheSh2YWx1ZSwgV3JpdGVTSW50MzJOb1RhZ1RvQXJyYXksIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDhfdCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDY0Tm9UYWdUb0FycmF5KAorICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50NjRfdD4mIHZhbHVlLCB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIFdyaXRlUHJpbWl0aXZlTm9UYWdUb0FycmF5KHZhbHVlLCBXcml0ZVNJbnQ2NE5vVGFnVG9BcnJheSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDMyTm9UYWdUb0FycmF5KAorICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8dWludDMyX3Q+JiB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBXcml0ZUZpeGVkTm9UYWdUb0FycmF5KHZhbHVlLCBXcml0ZUZpeGVkMzJOb1RhZ1RvQXJyYXksIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDhfdCogV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQ2NE5vVGFnVG9BcnJheSgKKyAgICBjb25zdCBSZXBlYXRlZEZpZWxkPHVpbnQ2NF90PiYgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gV3JpdGVGaXhlZE5vVGFnVG9BcnJheSh2YWx1ZSwgV3JpdGVGaXhlZDY0Tm9UYWdUb0FycmF5LCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNGaXhlZDMyTm9UYWdUb0FycmF5KAorICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50MzJfdD4mIHZhbHVlLCB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIFdyaXRlRml4ZWROb1RhZ1RvQXJyYXkodmFsdWUsIFdyaXRlU0ZpeGVkMzJOb1RhZ1RvQXJyYXksIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDhfdCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkNjROb1RhZ1RvQXJyYXkoCisgICAgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ2NF90PiYgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gV3JpdGVGaXhlZE5vVGFnVG9BcnJheSh2YWx1ZSwgV3JpdGVTRml4ZWQ2NE5vVGFnVG9BcnJheSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdE5vVGFnVG9BcnJheSgKKyAgICBjb25zdCBSZXBlYXRlZEZpZWxkPGZsb2F0PiYgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gV3JpdGVGaXhlZE5vVGFnVG9BcnJheSh2YWx1ZSwgV3JpdGVGbG9hdE5vVGFnVG9BcnJheSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVEb3VibGVOb1RhZ1RvQXJyYXkoCisgICAgY29uc3QgUmVwZWF0ZWRGaWVsZDxkb3VibGU+JiB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBXcml0ZUZpeGVkTm9UYWdUb0FycmF5KHZhbHVlLCBXcml0ZURvdWJsZU5vVGFnVG9BcnJheSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sTm9UYWdUb0FycmF5KAorICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8Ym9vbD4mIHZhbHVlLCB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIFdyaXRlUHJpbWl0aXZlTm9UYWdUb0FycmF5KHZhbHVlLCBXcml0ZUJvb2xOb1RhZ1RvQXJyYXksIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDhfdCogV2lyZUZvcm1hdExpdGU6OldyaXRlRW51bU5vVGFnVG9BcnJheSgKKyAgICBjb25zdCBSZXBlYXRlZEZpZWxkPGludD4mIHZhbHVlLCB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIFdyaXRlUHJpbWl0aXZlTm9UYWdUb0FycmF5KHZhbHVlLCBXcml0ZUVudW1Ob1RhZ1RvQXJyYXksIHRhcmdldCk7Cit9CisKK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgdGFyZ2V0KTsKKyAgcmV0dXJuIFdyaXRlSW50MzJOb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDhfdCogV2lyZUZvcm1hdExpdGU6OldyaXRlSW50NjRUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZUludDY0Tm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMlRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgdGFyZ2V0KTsKKyAgcmV0dXJuIFdyaXRlVUludDMyTm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQ2NFRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgdGFyZ2V0KTsKKyAgcmV0dXJuIFdyaXRlVUludDY0Tm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQzMlRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpIHsKKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCB0YXJnZXQpOworICByZXR1cm4gV3JpdGVTSW50MzJOb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDhfdCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDY0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZVNJbnQ2NE5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDMyVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDMyLCB0YXJnZXQpOworICByZXR1cm4gV3JpdGVGaXhlZDMyTm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkNjRUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVENjQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZUZpeGVkNjROb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDhfdCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkMzJUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDMyLCB0YXJnZXQpOworICByZXR1cm4gV3JpdGVTRml4ZWQzMk5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTRml4ZWQ2NFRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVENjQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZVNGaXhlZDY0Tm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZsb2F0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLCBmbG9hdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVEMzIsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZUZsb2F0Tm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZURvdWJsZVRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDY0LCB0YXJnZXQpOworICByZXR1cm4gV3JpdGVEb3VibGVOb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDhfdCogV2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoaW50IGZpZWxkX251bWJlciwgYm9vbCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpIHsKKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCB0YXJnZXQpOworICByZXR1cm4gV3JpdGVCb29sTm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KGludCBmaWVsZF9udW1iZXIsIGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpIHsKKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCB0YXJnZXQpOworICByZXR1cm4gV3JpdGVFbnVtTm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVQcmltaXRpdmVUb0FycmF5KAorICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IFJlcGVhdGVkRmllbGQ8VD4mIHZhbHVlLAorICAgIHVpbnQ4X3QqICgqV3JpdGVyKShpbnQsIFQsIHVpbnQ4X3QqKSwgdWludDhfdCogdGFyZ2V0KSB7CisgIGNvbnN0IGludCBuID0gdmFsdWUuc2l6ZSgpOworICBpZiAobiA9PSAwKSB7CisgICAgcmV0dXJuIHRhcmdldDsKKyAgfQorCisgIGNvbnN0IFQqIGlpID0gdmFsdWUuZGF0YSgpOworICBpbnQgaSA9IDA7CisgIGRvIHsKKyAgICB0YXJnZXQgPSBXcml0ZXIoZmllbGRfbnVtYmVyLCBpaVtpXSwgdGFyZ2V0KTsKKyAgfSB3aGlsZSAoKytpIDwgbik7CisKKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgKKyAgICBpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBSZXBlYXRlZEZpZWxkPGludDMyX3Q+JiB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBXcml0ZVByaW1pdGl2ZVRvQXJyYXkoZmllbGRfbnVtYmVyLCB2YWx1ZSwgV3JpdGVJbnQzMlRvQXJyYXksIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDhfdCogV2lyZUZvcm1hdExpdGU6OldyaXRlSW50NjRUb0FycmF5KAorICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50NjRfdD4mIHZhbHVlLCB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIFdyaXRlUHJpbWl0aXZlVG9BcnJheShmaWVsZF9udW1iZXIsIHZhbHVlLCBXcml0ZUludDY0VG9BcnJheSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzJUb0FycmF5KAorICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IFJlcGVhdGVkRmllbGQ8dWludDMyX3Q+JiB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBXcml0ZVByaW1pdGl2ZVRvQXJyYXkoZmllbGRfbnVtYmVyLCB2YWx1ZSwgV3JpdGVVSW50MzJUb0FycmF5LCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQ2NFRvQXJyYXkoCisgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgUmVwZWF0ZWRGaWVsZDx1aW50NjRfdD4mIHZhbHVlLCB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIFdyaXRlUHJpbWl0aXZlVG9BcnJheShmaWVsZF9udW1iZXIsIHZhbHVlLCBXcml0ZVVJbnQ2NFRvQXJyYXksIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDhfdCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDMyVG9BcnJheSgKKyAgICBpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBSZXBlYXRlZEZpZWxkPGludDMyX3Q+JiB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBXcml0ZVByaW1pdGl2ZVRvQXJyYXkoZmllbGRfbnVtYmVyLCB2YWx1ZSwgV3JpdGVTSW50MzJUb0FycmF5LCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQ2NFRvQXJyYXkoCisgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ2NF90PiYgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gV3JpdGVQcmltaXRpdmVUb0FycmF5KGZpZWxkX251bWJlciwgdmFsdWUsIFdyaXRlU0ludDY0VG9BcnJheSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDMyVG9BcnJheSgKKyAgICBpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBSZXBlYXRlZEZpZWxkPHVpbnQzMl90PiYgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gV3JpdGVQcmltaXRpdmVUb0FycmF5KGZpZWxkX251bWJlciwgdmFsdWUsIFdyaXRlRml4ZWQzMlRvQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDY0VG9BcnJheSgKKyAgICBpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBSZXBlYXRlZEZpZWxkPHVpbnQ2NF90PiYgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gV3JpdGVQcmltaXRpdmVUb0FycmF5KGZpZWxkX251bWJlciwgdmFsdWUsIFdyaXRlRml4ZWQ2NFRvQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTRml4ZWQzMlRvQXJyYXkoCisgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQzMl90PiYgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gV3JpdGVQcmltaXRpdmVUb0FycmF5KGZpZWxkX251bWJlciwgdmFsdWUsIFdyaXRlU0ZpeGVkMzJUb0FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDhfdCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkNjRUb0FycmF5KAorICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50NjRfdD4mIHZhbHVlLCB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIFdyaXRlUHJpbWl0aXZlVG9BcnJheShmaWVsZF9udW1iZXIsIHZhbHVlLCBXcml0ZVNGaXhlZDY0VG9BcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZsb2F0VG9BcnJheSgKKyAgICBpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBSZXBlYXRlZEZpZWxkPGZsb2F0PiYgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gV3JpdGVQcmltaXRpdmVUb0FycmF5KGZpZWxkX251bWJlciwgdmFsdWUsIFdyaXRlRmxvYXRUb0FycmF5LCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZURvdWJsZVRvQXJyYXkoCisgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgUmVwZWF0ZWRGaWVsZDxkb3VibGU+JiB2YWx1ZSwgdWludDhfdCogdGFyZ2V0KSB7CisgIHJldHVybiBXcml0ZVByaW1pdGl2ZVRvQXJyYXkoZmllbGRfbnVtYmVyLCB2YWx1ZSwgV3JpdGVEb3VibGVUb0FycmF5LCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KAorICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IFJlcGVhdGVkRmllbGQ8Ym9vbD4mIHZhbHVlLCB1aW50OF90KiB0YXJnZXQpIHsKKyAgcmV0dXJuIFdyaXRlUHJpbWl0aXZlVG9BcnJheShmaWVsZF9udW1iZXIsIHZhbHVlLCBXcml0ZUJvb2xUb0FycmF5LCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAorICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50PiYgdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCkgeworICByZXR1cm4gV3JpdGVQcmltaXRpdmVUb0FycmF5KGZpZWxkX251bWJlciwgdmFsdWUsIFdyaXRlRW51bVRvQXJyYXksIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDhfdCogV2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIC8vIFN0cmluZyBpcyBmb3IgVVRGLTggdGV4dCBvbmx5CisgIC8vIFdBUk5JTkc6ICBJbiB3aXJlX2Zvcm1hdC5jYywgYm90aCBzdHJpbmdzIGFuZCBieXRlcyBhcmUgaGFuZGxlZCBieQorICAvLyAgIFdyaXRlU3RyaW5nKCkgdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbi4gIElmIHRoZSBpbXBsZW1lbnRhdGlvbnMgYmVjb21lCisgIC8vICAgZGlmZmVyZW50LCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGF0IHVzYWdlLgorICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0YXJnZXQpOworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVN0cmluZ1dpdGhTaXplVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OF90KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCeXRlc1RvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0YXJnZXQpIHsKKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgdGFyZ2V0KTsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVTdHJpbmdXaXRoU2l6ZVRvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CisKKworLy8gU2VlIGNvbW1lbnQgb24gUmVhZEdyb3VwTm9WaXJ0dWFsIHRvIHVuZGVyc3RhbmQgdGhlIG5lZWQgZm9yIHRoaXMgdGVtcGxhdGUKKy8vIHBhcmFtZXRlciBuYW1lLgordGVtcGxhdGUgPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+CitpbmxpbmUgdWludDhfdCogV2lyZUZvcm1hdExpdGU6OkludGVybmFsV3JpdGVHcm91cE5vVmlydHVhbFRvQXJyYXkoCisgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCYgdmFsdWUsCisgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1NUQVJUX0dST1VQLCB0YXJnZXQpOworICB0YXJnZXQgPSB2YWx1ZS5NZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0OjoKKyAgICAgICAgICAgICAgIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodGFyZ2V0KTsKKyAgcmV0dXJuIFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0VORF9HUk9VUCwgdGFyZ2V0KTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0PgoraW5saW5lIHVpbnQ4X3QqIFdpcmVGb3JtYXRMaXRlOjpJbnRlcm5hbFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCYgdmFsdWUsCisgICAgdWludDhfdCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIHRhcmdldCk7CisgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoCisgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgdmFsdWUuTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6R2V0Q2FjaGVkU2l6ZSgpKSwKKyAgICAgIHRhcmdldCk7CisgIHJldHVybiB2YWx1ZQorICAgICAgLk1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgICAgICAgdGFyZ2V0KTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmxpbmUgc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoaW50MzJfdCB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzJTaWduRXh0ZW5kZWQodmFsdWUpOworfQoraW5saW5lIHNpemVfdCBXaXJlRm9ybWF0TGl0ZTo6SW50NjRTaXplKGludDY0X3QgdmFsdWUpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTY0KHN0YXRpY19jYXN0PHVpbnQ2NF90Pih2YWx1ZSkpOworfQoraW5saW5lIHNpemVfdCBXaXJlRm9ybWF0TGl0ZTo6VUludDMyU2l6ZSh1aW50MzJfdCB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIodmFsdWUpOworfQoraW5saW5lIHNpemVfdCBXaXJlRm9ybWF0TGl0ZTo6VUludDY0U2l6ZSh1aW50NjRfdCB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplNjQodmFsdWUpOworfQoraW5saW5lIHNpemVfdCBXaXJlRm9ybWF0TGl0ZTo6U0ludDMyU2l6ZShpbnQzMl90IHZhbHVlKSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihaaWdaYWdFbmNvZGUzMih2YWx1ZSkpOworfQoraW5saW5lIHNpemVfdCBXaXJlRm9ybWF0TGl0ZTo6U0ludDY0U2l6ZShpbnQ2NF90IHZhbHVlKSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemU2NChaaWdaYWdFbmNvZGU2NCh2YWx1ZSkpOworfQoraW5saW5lIHNpemVfdCBXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUoaW50IHZhbHVlKSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMlNpZ25FeHRlbmRlZCh2YWx1ZSk7Cit9CitpbmxpbmUgc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemVQbHVzT25lKGludDMyX3QgdmFsdWUpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyU2lnbkV4dGVuZGVkUGx1c09uZSh2YWx1ZSk7Cit9CitpbmxpbmUgc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpJbnQ2NFNpemVQbHVzT25lKGludDY0X3QgdmFsdWUpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTY0UGx1c09uZSgKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90Pih2YWx1ZSkpOworfQoraW5saW5lIHNpemVfdCBXaXJlRm9ybWF0TGl0ZTo6VUludDMyU2l6ZVBsdXNPbmUodWludDMyX3QgdmFsdWUpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyUGx1c09uZSh2YWx1ZSk7Cit9CitpbmxpbmUgc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpVSW50NjRTaXplUGx1c09uZSh1aW50NjRfdCB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplNjRQbHVzT25lKHZhbHVlKTsKK30KK2lubGluZSBzaXplX3QgV2lyZUZvcm1hdExpdGU6OlNJbnQzMlNpemVQbHVzT25lKGludDMyX3QgdmFsdWUpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyUGx1c09uZShaaWdaYWdFbmNvZGUzMih2YWx1ZSkpOworfQoraW5saW5lIHNpemVfdCBXaXJlRm9ybWF0TGl0ZTo6U0ludDY0U2l6ZVBsdXNPbmUoaW50NjRfdCB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplNjRQbHVzT25lKFppZ1phZ0VuY29kZTY0KHZhbHVlKSk7Cit9CitpbmxpbmUgc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZVBsdXNPbmUoaW50IHZhbHVlKSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMlNpZ25FeHRlbmRlZFBsdXNPbmUodmFsdWUpOworfQorCitpbmxpbmUgc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICByZXR1cm4gTGVuZ3RoRGVsaW1pdGVkU2l6ZSh2YWx1ZS5zaXplKCkpOworfQoraW5saW5lIHNpemVfdCBXaXJlRm9ybWF0TGl0ZTo6Qnl0ZXNTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICByZXR1cm4gTGVuZ3RoRGVsaW1pdGVkU2l6ZSh2YWx1ZS5zaXplKCkpOworfQorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNZXNzYWdlVHlwZT4KK2lubGluZSBzaXplX3QgV2lyZUZvcm1hdExpdGU6Okdyb3VwU2l6ZShjb25zdCBNZXNzYWdlVHlwZSYgdmFsdWUpIHsKKyAgcmV0dXJuIHZhbHVlLkJ5dGVTaXplTG9uZygpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIE1lc3NhZ2VUeXBlPgoraW5saW5lIHNpemVfdCBXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUoY29uc3QgTWVzc2FnZVR5cGUmIHZhbHVlKSB7CisgIHJldHVybiBMZW5ndGhEZWxpbWl0ZWRTaXplKHZhbHVlLkJ5dGVTaXplTG9uZygpKTsKK30KKworLy8gU2VlIGNvbW1lbnQgb24gUmVhZEdyb3VwTm9WaXJ0dWFsIHRvIHVuZGVyc3RhbmQgdGhlIG5lZWQgZm9yIHRoaXMgdGVtcGxhdGUKKy8vIHBhcmFtZXRlciBuYW1lLgordGVtcGxhdGUgPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+CitpbmxpbmUgc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpHcm91cFNpemVOb1ZpcnR1YWwoCisgICAgY29uc3QgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCYgdmFsdWUpIHsKKyAgcmV0dXJuIHZhbHVlLk1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q6OkJ5dGVTaXplTG9uZygpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+CitpbmxpbmUgc2l6ZV90IFdpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICBjb25zdCBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0JiB2YWx1ZSkgeworICByZXR1cm4gTGVuZ3RoRGVsaW1pdGVkU2l6ZSgKKyAgICAgIHZhbHVlLk1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q6OkJ5dGVTaXplTG9uZygpKTsKK30KKworaW5saW5lIHNpemVfdCBXaXJlRm9ybWF0TGl0ZTo6TGVuZ3RoRGVsaW1pdGVkU2l6ZShzaXplX3QgbGVuZ3RoKSB7CisgIC8vIFRoZSBzdGF0aWNfY2FzdCBoZXJlIHByZXZlbnRzIGFuIGVycm9yIGluIGNlcnRhaW4gY29tcGlsZXIgY29uZmlndXJhdGlvbnMKKyAgLy8gYnV0IGlzIG5vdCB0ZWNobmljYWxseSBjb3JyZWN0LS1pZiBsZW5ndGggaXMgdG9vIGxhcmdlIHRvIGZpdCBpbiBhIHVpbnQzMl90CisgIC8vIHRoZW4gaXQgd2lsbCBiZSBzaWxlbnRseSB0cnVuY2F0ZWQuIFdlIHdpbGwgbmVlZCB0byBmaXggdGhpcyBpZiB3ZSBldmVyCisgIC8vIGRlY2lkZSB0byBzdGFydCBzdXBwb3J0aW5nIHNlcmlhbGl6ZWQgbWVzc2FnZXMgZ3JlYXRlciB0aGFuIDIgR2lCIGluIHNpemUuCisgIHJldHVybiBsZW5ndGggKworICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGxlbmd0aCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTVM+Citib29sIFBhcnNlTWVzc2FnZVNldEl0ZW1JbXBsKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgTVMgbXMpIHsKKyAgLy8gVGhpcyBtZXRob2QgcGFyc2VzIGEgZ3JvdXAgd2hpY2ggc2hvdWxkIGNvbnRhaW4gdHdvIGZpZWxkczoKKyAgLy8gICByZXF1aXJlZCBpbnQzMiB0eXBlX2lkID0gMjsKKyAgLy8gICByZXF1aXJlZCBkYXRhIG1lc3NhZ2UgPSAzOworCisgIHVpbnQzMl90IGxhc3RfdHlwZV9pZCA9IDA7CisKKyAgLy8gSWYgd2Ugc2VlIG1lc3NhZ2UgZGF0YSBiZWZvcmUgdGhlIHR5cGVfaWQsIHdlJ2xsIGFwcGVuZCBpdCB0byB0aGlzIHNvCisgIC8vIHdlIGNhbiBwYXJzZSBpdCBsYXRlci4KKyAgc3RkOjpzdHJpbmcgbWVzc2FnZV9kYXRhOworCisgIGVudW0gY2xhc3MgU3RhdGUgeyBrTm9UYWcsIGtIYXNUeXBlLCBrSGFzUGF5bG9hZCwga0RvbmUgfTsKKyAgU3RhdGUgc3RhdGUgPSBTdGF0ZTo6a05vVGFnOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgY29uc3QgdWludDMyX3QgdGFnID0gaW5wdXQtPlJlYWRUYWdOb0xhc3RUYWcoKTsKKyAgICBpZiAodGFnID09IDApIHJldHVybiBmYWxzZTsKKworICAgIHN3aXRjaCAodGFnKSB7CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZzogeworICAgICAgICB1aW50MzJfdCB0eXBlX2lkOworICAgICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJnR5cGVfaWQpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZTo6a05vVGFnKSB7CisgICAgICAgICAgbGFzdF90eXBlX2lkID0gdHlwZV9pZDsKKyAgICAgICAgICBzdGF0ZSA9IFN0YXRlOjprSGFzVHlwZTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBTdGF0ZTo6a0hhc1BheWxvYWQpIHsKKyAgICAgICAgICAvLyBXZSBzYXcgc29tZSBtZXNzYWdlIGRhdGEgYmVmb3JlIHRoZSB0eXBlX2lkLiAgSGF2ZSB0byBwYXJzZSBpdAorICAgICAgICAgIC8vIG5vdy4KKyAgICAgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBzdWJfaW5wdXQoCisgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KG1lc3NhZ2VfZGF0YS5kYXRhKCkpLAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KG1lc3NhZ2VfZGF0YS5zaXplKCkpKTsKKyAgICAgICAgICBzdWJfaW5wdXQuU2V0UmVjdXJzaW9uTGltaXQoaW5wdXQtPlJlY3Vyc2lvbkJ1ZGdldCgpKTsKKyAgICAgICAgICBpZiAoIW1zLlBhcnNlRmllbGQodHlwZV9pZCwgJnN1Yl9pbnB1dCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgICAgbWVzc2FnZV9kYXRhLmNsZWFyKCk7CisgICAgICAgICAgc3RhdGUgPSBTdGF0ZTo6a0RvbmU7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnOiB7CisgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZTo6a0hhc1R5cGUpIHsKKyAgICAgICAgICAvLyBBbHJlYWR5IHNhdyB0eXBlX2lkLCBzbyB3ZSBjYW4gcGFyc2UgdGhpcyBkaXJlY3RseS4KKyAgICAgICAgICBpZiAoIW1zLlBhcnNlRmllbGQobGFzdF90eXBlX2lkLCBpbnB1dCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgICAgc3RhdGUgPSBTdGF0ZTo6a0RvbmU7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gU3RhdGU6OmtOb1RhZykgeworICAgICAgICAgIC8vIFdlIGhhdmVuJ3Qgc2VlbiBhIHR5cGVfaWQgeWV0LiAgQXBwZW5kIHRoaXMgZGF0YSB0byBtZXNzYWdlX2RhdGEuCisgICAgICAgICAgdWludDMyX3QgbGVuZ3RoOworICAgICAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQzMl90PihsZW5ndGgpIDwgMCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgIHVpbnQzMl90IHNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgIGxlbmd0aCArIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKGxlbmd0aCkpOworICAgICAgICAgIG1lc3NhZ2VfZGF0YS5yZXNpemUoc2l6ZSk7CisgICAgICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmbWVzc2FnZV9kYXRhWzBdKTsKKyAgICAgICAgICBwdHIgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KGxlbmd0aCwgcHRyKTsKKyAgICAgICAgICBpZiAoIWlucHV0LT5SZWFkUmF3KHB0ciwgbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgIHN0YXRlID0gU3RhdGU6OmtIYXNQYXlsb2FkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICghbXMuU2tpcEZpZWxkKHRhZywgaW5wdXQpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnOiB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIGlmICghbXMuU2tpcEZpZWxkKHRhZywgaW5wdXQpKSByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX0xJVEVfSF9fCmRpZmYgLS1naXQgYS9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWVkOTUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDcwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmg+CisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIFVOSVRURVNUIDo6cHJvdG9idWZfdW5pdHRlc3QKKyNkZWZpbmUgVU5JVFRFU1RfSU1QT1JUIDo6cHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0CisjZGVmaW5lIFVOSVRURVNUX1BBQ0tBR0VfTkFNRSAicHJvdG9idWZfdW5pdHRlc3QiCisjZGVmaW5lIFBST1RPMl9XSVJFRk9STUFUX1VOSVRURVNUIDo6cHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3QKKyNkZWZpbmUgUFJPVE8zX0FSRU5BX1VOSVRURVNUIDo6cHJvdG8zX2FyZW5hX3VuaXR0ZXN0CisKKy8vIE11c3QgaW5jbHVkZSBhZnRlciBkZWZpbmluZyBVTklUVEVTVCwgZXRjLgorLy8gY2xhbmctZm9ybWF0IG9mZgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaW5jPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5pbmM+CisvLyBjbGFuZy1mb3JtYXQgb24KKworLy8gTXVzdCBiZSBpbmNsdWRlZCBsYXN0LgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CituYW1lc3BhY2UgeworCisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfdW5pdHRlc3QuaW5jIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzODY5YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfdW5pdHRlc3QuaW5jCkBAIC0wLDAgKzEsMTcwOSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorLy8gY2xhbmctZm9ybWF0IG9uCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CituYW1lc3BhY2UgeworCitURVNUKFdpcmVGb3JtYXRUZXN0LCBFbnVtc0luU3luYykgeworICAvLyBWZXJpZnkgdGhhdCBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIGFuZCBXaXJlRm9ybWF0TGl0ZTo6Q3BwVHlwZSBtYXRjaAorICAvLyBGaWVsZERlc2NyaXB0b3I6OlR5cGUgYW5kIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZS4KKworICBFWFBFQ1RfRVEoaW1wbGljaXRfY2FzdDxpbnQ+KEZpZWxkRGVzY3JpcHRvcjo6TUFYX1RZUEUpLAorICAgICAgICAgICAgaW1wbGljaXRfY2FzdDxpbnQ+KFdpcmVGb3JtYXRMaXRlOjpNQVhfRklFTERfVFlQRSkpOworICBFWFBFQ1RfRVEoaW1wbGljaXRfY2FzdDxpbnQ+KEZpZWxkRGVzY3JpcHRvcjo6TUFYX0NQUFRZUEUpLAorICAgICAgICAgICAgaW1wbGljaXRfY2FzdDxpbnQ+KFdpcmVGb3JtYXRMaXRlOjpNQVhfQ1BQVFlQRSkpOworCisgIGZvciAoaW50IGkgPSAxOyBpIDw9IFdpcmVGb3JtYXRMaXRlOjpNQVhfRklFTERfVFlQRTsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGltcGxpY2l0X2Nhc3Q8aW50PihGaWVsZERlc2NyaXB0b3I6OlR5cGVUb0NwcFR5cGUoCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGaWVsZERlc2NyaXB0b3I6OlR5cGU+KGkpKSksCisgICAgICAgICAgICAgIGltcGxpY2l0X2Nhc3Q8aW50PihXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlVG9DcHBUeXBlKAorICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZT4oaSkpKSk7CisgIH0KK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgTWF4RmllbGROdW1iZXIpIHsKKyAgLy8gTWFrZSBzdXJlIHRoZSBtYXggZmllbGQgbnVtYmVyIGNvbnN0YW50IGlzIGFjY3VyYXRlLgorICBFWFBFQ1RfRVEoKDEgPDwgKDMyIC0gV2lyZUZvcm1hdExpdGU6OmtUYWdUeXBlQml0cykpIC0gMSwKKyAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlcik7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFBhcnNlKSB7CisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgc291cmNlLCBkZXN0OworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJnNvdXJjZSk7CisgIHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgLy8gUGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZkZXN0KTsKKworICAvLyBDaGVjay4KKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChkZXN0KTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2VFeHRlbnNpb25zKSB7CisgIFVOSVRURVNUOjpUZXN0QWxsRXh0ZW5zaW9ucyBzb3VyY2UsIGRlc3Q7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgLy8gU2VyaWFsaXplIHVzaW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4KKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJnNvdXJjZSk7CisgIHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgLy8gUGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZkZXN0KTsKKworICAvLyBDaGVjay4KKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQoZGVzdCk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFBhcnNlUGFja2VkKSB7CisgIFVOSVRURVNUOjpUZXN0UGFja2VkVHlwZXMgc291cmNlLCBkZXN0OworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgIFRlc3RVdGlsOjpTZXRQYWNrZWRGaWVsZHMoJnNvdXJjZSk7CisgIHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgLy8gUGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZkZXN0KTsKKworICAvLyBDaGVjay4KKyAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChkZXN0KTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2VQYWNrZWRGcm9tVW5wYWNrZWQpIHsKKyAgLy8gU2VyaWFsaXplIHVzaW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4KKyAgVU5JVFRFU1Q6OlRlc3RVbnBhY2tlZFR5cGVzIHNvdXJjZTsKKyAgVGVzdFV0aWw6OlNldFVucGFja2VkRmllbGRzKCZzb3VyY2UpOworICBzdGQ6OnN0cmluZyBkYXRhID0gc291cmNlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisKKyAgLy8gUGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KKyAgVU5JVFRFU1Q6OlRlc3RQYWNrZWRUeXBlcyBkZXN0OworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7CisgIFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgJmRlc3QpOworCisgIC8vIENoZWNrLgorICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRmllbGRzU2V0KGRlc3QpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZVVucGFja2VkRnJvbVBhY2tlZCkgeworICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgorICBVTklUVEVTVDo6VGVzdFBhY2tlZFR5cGVzIHNvdXJjZTsKKyAgVGVzdFV0aWw6OlNldFBhY2tlZEZpZWxkcygmc291cmNlKTsKKyAgc3RkOjpzdHJpbmcgZGF0YSA9IHNvdXJjZS5TZXJpYWxpemVBc1N0cmluZygpOworCisgIC8vIFBhcnNlIHVzaW5nIFdpcmVGb3JtYXQuCisgIFVOSVRURVNUOjpUZXN0VW5wYWNrZWRUeXBlcyBkZXN0OworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7CisgIFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgJmRlc3QpOworCisgIC8vIENoZWNrLgorICBUZXN0VXRpbDo6RXhwZWN0VW5wYWNrZWRGaWVsZHNTZXQoZGVzdCk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFBhcnNlUGFja2VkRXh0ZW5zaW9ucykgeworICBVTklUVEVTVDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMgc291cmNlLCBkZXN0OworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgIFRlc3RVdGlsOjpTZXRQYWNrZWRFeHRlbnNpb25zKCZzb3VyY2UpOworICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIC8vIFBhcnNlIHVzaW5nIFdpcmVGb3JtYXQuCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmZGVzdCk7CisKKyAgLy8gQ2hlY2suCisgIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KGRlc3QpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZU9uZW9mKSB7CisgIFVOSVRURVNUOjpUZXN0T25lb2YyIHNvdXJjZSwgZGVzdDsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKworICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgorICBUZXN0VXRpbDo6U2V0T25lb2YxKCZzb3VyY2UpOworICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIC8vIFBhcnNlIHVzaW5nIFdpcmVGb3JtYXQuCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmZGVzdCk7CisKKyAgLy8gQ2hlY2suCisgIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDEoZGVzdCk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIE9uZW9mT25seVNldExhc3QpIHsKKyAgVU5JVFRFU1Q6OlRlc3RPbmVvZkJhY2t3YXJkc0NvbXBhdGlibGUgc291cmNlOworICBVTklUVEVTVDo6VGVzdE9uZW9mIG9uZW9mX2Rlc3Q7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgLy8gU2V0IHR3byBmaWVsZHMKKyAgc291cmNlLnNldF9mb29faW50KDEwMCk7CisgIHNvdXJjZS5zZXRfZm9vX3N0cmluZygiMTAxIik7CisKKyAgLy8gU2VyaWFsaXplIGFuZCBwYXJzZSB0byBvbmVvZiBtZXNzYWdlLiBHZW5lcmF0ZWQgc2VyaWFsaXplciBtYXkgbm90IG9yZGVyCisgIC8vIGZpZWxkcyBpbiB0YWcgb3JkZXIuIFVzZSBXaXJlRm9ybWF0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMgaW5zdGVhZCBhcworICAvLyBpdCBzb3J0cyBmaWVsZHMgYmVmb3JlaGFuZC4KKyAgeworICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gcmF3X291dHB1dCgmZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKHNvdXJjZSwgc291cmNlLkJ5dGVTaXplTG9uZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0KTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOworICB9CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmb25lb2ZfZGVzdCk7CisKKyAgLy8gT25seSB0aGUgbGFzdCBmaWVsZCBpcyBzZXQuCisgIEVYUEVDVF9GQUxTRShvbmVvZl9kZXN0Lmhhc19mb29faW50KCkpOworICBFWFBFQ1RfVFJVRShvbmVvZl9kZXN0Lmhhc19mb29fc3RyaW5nKCkpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBCeXRlU2l6ZSkgeworICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworCisgIEVYUEVDVF9FUShtZXNzYWdlLkJ5dGVTaXplTG9uZygpLCBXaXJlRm9ybWF0OjpCeXRlU2l6ZShtZXNzYWdlKSk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuQnl0ZVNpemVMb25nKCkpOworICBFWFBFQ1RfRVEoMCwgV2lyZUZvcm1hdDo6Qnl0ZVNpemUobWVzc2FnZSkpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBCeXRlU2l6ZUV4dGVuc2lvbnMpIHsKKyAgVU5JVFRFU1Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKworICBFWFBFQ1RfRVEobWVzc2FnZS5CeXRlU2l6ZUxvbmcoKSwgV2lyZUZvcm1hdDo6Qnl0ZVNpemUobWVzc2FnZSkpOworICBtZXNzYWdlLkNsZWFyKCk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkJ5dGVTaXplTG9uZygpKTsKKyAgRVhQRUNUX0VRKDAsIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgQnl0ZVNpemVQYWNrZWQpIHsKKyAgVU5JVFRFU1Q6OlRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlOworICBUZXN0VXRpbDo6U2V0UGFja2VkRmllbGRzKCZtZXNzYWdlKTsKKworICBFWFBFQ1RfRVEobWVzc2FnZS5CeXRlU2l6ZUxvbmcoKSwgV2lyZUZvcm1hdDo6Qnl0ZVNpemUobWVzc2FnZSkpOworICBtZXNzYWdlLkNsZWFyKCk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkJ5dGVTaXplTG9uZygpKTsKKyAgRVhQRUNUX0VRKDAsIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgQnl0ZVNpemVQYWNrZWRFeHRlbnNpb25zKSB7CisgIFVOSVRURVNUOjpUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlOworICBUZXN0VXRpbDo6U2V0UGFja2VkRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuQnl0ZVNpemVMb25nKCksIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKKyAgbWVzc2FnZS5DbGVhcigpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5CeXRlU2l6ZUxvbmcoKSk7CisgIEVYUEVDVF9FUSgwLCBXaXJlRm9ybWF0OjpCeXRlU2l6ZShtZXNzYWdlKSk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIEJ5dGVTaXplT25lb2YpIHsKKyAgVU5JVFRFU1Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlNldE9uZW9mMSgmbWVzc2FnZSk7CisKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuQnl0ZVNpemVMb25nKCksIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKKyAgbWVzc2FnZS5DbGVhcigpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkJ5dGVTaXplTG9uZygpKTsKKyAgRVhQRUNUX0VRKDAsIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgU2VyaWFsaXplKSB7CisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVkX2RhdGE7CisgIHN0ZDo6c3RyaW5nIGR5bmFtaWNfZGF0YTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKyAgc2l6ZV90IHNpemUgPSBtZXNzYWdlLkJ5dGVTaXplTG9uZygpOworCisgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgIHsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmdlbmVyYXRlZF9kYXRhKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0KTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOworICB9CisKKyAgLy8gU2VyaWFsaXplIHVzaW5nIFdpcmVGb3JtYXQuCisgIHsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmR5bmFtaWNfZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG1lc3NhZ2UsIHNpemUsICZvdXRwdXQpOworICAgIEFTU0VSVF9GQUxTRShvdXRwdXQuSGFkRXJyb3IoKSk7CisgIH0KKworICAvLyBTaG91bGQgcGFyc2UgdG8gdGhlIHNhbWUgbWVzc2FnZS4KKyAgRVhQRUNUX1RSVUUoVGVzdFV0aWw6OkVxdWFsc1RvU2VyaWFsaXplZChtZXNzYWdlLCBnZW5lcmF0ZWRfZGF0YSkpOworICBFWFBFQ1RfVFJVRShUZXN0VXRpbDo6RXF1YWxzVG9TZXJpYWxpemVkKG1lc3NhZ2UsIGR5bmFtaWNfZGF0YSkpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBTZXJpYWxpemVFeHRlbnNpb25zKSB7CisgIFVOSVRURVNUOjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZWRfZGF0YTsKKyAgc3RkOjpzdHJpbmcgZHluYW1pY19kYXRhOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgc2l6ZV90IHNpemUgPSBtZXNzYWdlLkJ5dGVTaXplTG9uZygpOworCisgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgIHsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmdlbmVyYXRlZF9kYXRhKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0KTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOworICB9CisKKyAgLy8gU2VyaWFsaXplIHVzaW5nIFdpcmVGb3JtYXQuCisgIHsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmR5bmFtaWNfZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG1lc3NhZ2UsIHNpemUsICZvdXRwdXQpOworICAgIEFTU0VSVF9GQUxTRShvdXRwdXQuSGFkRXJyb3IoKSk7CisgIH0KKworICAvLyBTaG91bGQgcGFyc2UgdG8gdGhlIHNhbWUgbWVzc2FnZS4KKyAgRVhQRUNUX1RSVUUoVGVzdFV0aWw6OkVxdWFsc1RvU2VyaWFsaXplZChtZXNzYWdlLCBnZW5lcmF0ZWRfZGF0YSkpOworICBFWFBFQ1RfVFJVRShUZXN0VXRpbDo6RXF1YWxzVG9TZXJpYWxpemVkKG1lc3NhZ2UsIGR5bmFtaWNfZGF0YSkpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBTZXJpYWxpemVGaWVsZHNBbmRFeHRlbnNpb25zKSB7CisgIFVOSVRURVNUOjpUZXN0RmllbGRPcmRlcmluZ3MgbWVzc2FnZTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVkX2RhdGE7CisgIHN0ZDo6c3RyaW5nIGR5bmFtaWNfZGF0YTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzQW5kRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgIHNpemVfdCBzaXplID0gbWVzc2FnZS5CeXRlU2l6ZUxvbmcoKTsKKworICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgorICB7CisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZnZW5lcmF0ZWRfZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgbWVzc2FnZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dCk7CisgICAgQVNTRVJUX0ZBTFNFKG91dHB1dC5IYWRFcnJvcigpKTsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZSB1c2luZyBXaXJlRm9ybWF0LgorICB7CisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZkeW5hbWljX2RhdGEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOworICAgIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhtZXNzYWdlLCBzaXplLCAmb3V0cHV0KTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOworICB9CisKKyAgLy8gU2hvdWxkIHBhcnNlIHRvIHRoZSBzYW1lIG1lc3NhZ2UuCisgIEVYUEVDVF9UUlVFKFRlc3RVdGlsOjpFcXVhbHNUb1NlcmlhbGl6ZWQobWVzc2FnZSwgZ2VuZXJhdGVkX2RhdGEpKTsKKyAgRVhQRUNUX1RSVUUoVGVzdFV0aWw6OkVxdWFsc1RvU2VyaWFsaXplZChtZXNzYWdlLCBkeW5hbWljX2RhdGEpKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgU2VyaWFsaXplT25lb2YpIHsKKyAgVU5JVFRFU1Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVkX2RhdGE7CisgIHN0ZDo6c3RyaW5nIGR5bmFtaWNfZGF0YTsKKworICBUZXN0VXRpbDo6U2V0T25lb2YxKCZtZXNzYWdlKTsKKyAgc2l6ZV90IHNpemUgPSBtZXNzYWdlLkJ5dGVTaXplTG9uZygpOworCisgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgIHsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmdlbmVyYXRlZF9kYXRhKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0KTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOworICB9CisKKyAgLy8gU2VyaWFsaXplIHVzaW5nIFdpcmVGb3JtYXQuCisgIHsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmR5bmFtaWNfZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG1lc3NhZ2UsIHNpemUsICZvdXRwdXQpOworICAgIEFTU0VSVF9GQUxTRShvdXRwdXQuSGFkRXJyb3IoKSk7CisgIH0KKworICAvLyBTaG91bGQgcGFyc2UgdG8gdGhlIHNhbWUgbWVzc2FnZS4KKyAgRVhQRUNUX1RSVUUoVGVzdFV0aWw6OkVxdWFsc1RvU2VyaWFsaXplZChtZXNzYWdlLCBnZW5lcmF0ZWRfZGF0YSkpOworICBFWFBFQ1RfVFJVRShUZXN0VXRpbDo6RXF1YWxzVG9TZXJpYWxpemVkKG1lc3NhZ2UsIGR5bmFtaWNfZGF0YSkpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZU11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzKSB7CisgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gcGFyc2UgYSBtZXNzYWdlIHRoYXQgY29udGFpbnMgbXVsdGlwbGUgZXh0ZW5zaW9ucyByYW5nZXMuCisgIFVOSVRURVNUOjpUZXN0RmllbGRPcmRlcmluZ3Mgc291cmNlOworICBzdGQ6OnN0cmluZyBkYXRhOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKCZzb3VyY2UpOworICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIHsKKyAgICBVTklUVEVTVDo6VGVzdEZpZWxkT3JkZXJpbmdzIGRlc3Q7CisgICAgRVhQRUNUX1RSVUUoZGVzdC5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEVYUEVDVF9FUShzb3VyY2UuRGVidWdTdHJpbmcoKSwgZGVzdC5EZWJ1Z1N0cmluZygpKTsKKyAgfQorCisgIC8vIEFsc28gdGVzdCB1c2luZyByZWZsZWN0aW9uLWJhc2VkIHBhcnNpbmcuCisgIHsKKyAgICBVTklUVEVTVDo6VGVzdEZpZWxkT3JkZXJpbmdzIGRlc3Q7CisgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJnJhd19pbnB1dCk7CisgICAgRVhQRUNUX1RSVUUoV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmNvZGVkX2lucHV0LCAmZGVzdCkpOworICAgIEVYUEVDVF9FUShzb3VyY2UuRGVidWdTdHJpbmcoKSwgZGVzdC5EZWJ1Z1N0cmluZygpKTsKKyAgfQorfQorCitjb25zdCBpbnQga1Vua25vd25UeXBlSWQgPSAxNTUwMDU1OworCitURVNUKFdpcmVGb3JtYXRUZXN0LCBTZXJpYWxpemVNZXNzYWdlU2V0KSB7CisgIC8vIFNldCB1cCBhIFRlc3RNZXNzYWdlU2V0IHdpdGggdHdvIGtub3duIG1lc3NhZ2VzIGFuZCBhbiB1bmtub3duIG9uZS4KKyAgUFJPVE8yX1dJUkVGT1JNQVRfVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OworICBtZXNzYWdlX3NldAorICAgICAgLk11dGFibGVFeHRlbnNpb24oCisgICAgICAgICAgVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKQorICAgICAgLT5zZXRfaSgxMjMpOworICBtZXNzYWdlX3NldAorICAgICAgLk11dGFibGVFeHRlbnNpb24oCisgICAgICAgICAgVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKQorICAgICAgLT5zZXRfc3RyKCJmb28iKTsKKyAgbWVzc2FnZV9zZXQubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRMZW5ndGhEZWxpbWl0ZWQoa1Vua25vd25UeXBlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXIiKTsKKworICBzdGQ6OnN0cmluZyBkYXRhOworICBBU1NFUlRfVFJVRShtZXNzYWdlX3NldC5TZXJpYWxpemVUb1N0cmluZygmZGF0YSkpOworCisgIC8vIFBhcnNlIGJhY2sgdXNpbmcgUmF3TWVzc2FnZVNldCBhbmQgY2hlY2sgdGhlIGNvbnRlbnRzLgorICBVTklUVEVTVDo6UmF3TWVzc2FnZVNldCByYXc7CisgIEFTU0VSVF9UUlVFKHJhdy5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworCisgIEVYUEVDVF9FUSgwLCByYXcudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKKworICBBU1NFUlRfRVEoMywgcmF3Lml0ZW1fc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6ZGVzY3JpcHRvcigpLT5leHRlbnNpb24oMCktPm51bWJlcigpLAorICAgICAgcmF3Lml0ZW0oMCkudHlwZV9pZCgpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjo6ZGVzY3JpcHRvcigpLT5leHRlbnNpb24oMCktPm51bWJlcigpLAorICAgICAgcmF3Lml0ZW0oMSkudHlwZV9pZCgpKTsKKyAgRVhQRUNUX0VRKGtVbmtub3duVHlwZUlkLCByYXcuaXRlbSgyKS50eXBlX2lkKCkpOworCisgIFVOSVRURVNUOjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgbWVzc2FnZTE7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UxLlBhcnNlRnJvbVN0cmluZyhyYXcuaXRlbSgwKS5tZXNzYWdlKCkpKTsKKyAgRVhQRUNUX0VRKDEyMywgbWVzc2FnZTEuaSgpKTsKKworICBVTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIG1lc3NhZ2UyOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcocmF3Lml0ZW0oMSkubWVzc2FnZSgpKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgbWVzc2FnZTIuc3RyKCkpOworCisgIEVYUEVDVF9FUSgiYmFyIiwgcmF3Lml0ZW0oMikubWVzc2FnZSgpKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgU2VyaWFsaXplTWVzc2FnZVNldFZhcmlvdXNXYXlzQXJlRXF1YWwpIHsKKyAgLy8gU2VyaWFsaXplIGEgTWVzc2FnZVNldCB0byBhIHN0cmVhbSBhbmQgdG8gYSBmbGF0IGFycmF5IHVzaW5nIGdlbmVyYXRlZAorICAvLyBjb2RlLCBhbmQgYWxzbyB1c2luZyBXaXJlRm9ybWF0LCBhbmQgY2hlY2sgdGhhdCB0aGUgcmVzdWx0cyBhcmUgZXF1YWwuCisgIC8vIFNldCB1cCBhIFRlc3RNZXNzYWdlU2V0IHdpdGggdHdvIGtub3duIG1lc3NhZ2VzIGFuZCBhbiB1bmtub3duIG9uZSwgYXMKKyAgLy8gYWJvdmUuCisKKyAgUFJPVE8yX1dJUkVGT1JNQVRfVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OworICBtZXNzYWdlX3NldAorICAgICAgLk11dGFibGVFeHRlbnNpb24oCisgICAgICAgICAgVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKQorICAgICAgLT5zZXRfaSgxMjMpOworICBtZXNzYWdlX3NldAorICAgICAgLk11dGFibGVFeHRlbnNpb24oCisgICAgICAgICAgVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKQorICAgICAgLT5zZXRfc3RyKCJmb28iKTsKKyAgbWVzc2FnZV9zZXQubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRMZW5ndGhEZWxpbWl0ZWQoa1Vua25vd25UeXBlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXIiKTsKKworICBzaXplX3Qgc2l6ZSA9IG1lc3NhZ2Vfc2V0LkJ5dGVTaXplTG9uZygpOworICBFWFBFQ1RfRVEoc2l6ZSwgbWVzc2FnZV9zZXQuR2V0Q2FjaGVkU2l6ZSgpKTsKKyAgQVNTRVJUX0VRKHNpemUsIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2Vfc2V0KSk7CisKKyAgc3RkOjpzdHJpbmcgZmxhdF9kYXRhOworICBzdGQ6OnN0cmluZyBzdHJlYW1fZGF0YTsKKyAgc3RkOjpzdHJpbmcgZHluYW1pY19kYXRhOworICBmbGF0X2RhdGEucmVzaXplKHNpemUpOworICBzdHJlYW1fZGF0YS5yZXNpemUoc2l6ZSk7CisKKyAgLy8gU2VyaWFsaXplIHRvIGZsYXQgYXJyYXkKKyAgeworICAgIHVpbnQ4X3QqIHRhcmdldCA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KDo6Z29vZ2xlOjpwcm90b2J1Zjo6c3RyaW5nX2FzX2FycmF5KCZmbGF0X2RhdGEpKTsKKyAgICB1aW50OF90KiBlbmQgPSBtZXNzYWdlX3NldC5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHRhcmdldCk7CisgICAgRVhQRUNUX0VRKHNpemUsIGVuZCAtIHRhcmdldCk7CisgIH0KKworICAvLyBTZXJpYWxpemUgdG8gYnVmZmVyCisgIHsKKyAgICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gYXJyYXlfc3RyZWFtKDo6Z29vZ2xlOjpwcm90b2J1Zjo6c3RyaW5nX2FzX2FycmF5KCZzdHJlYW1fZGF0YSksIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmYXJyYXlfc3RyZWFtKTsKKyAgICBtZXNzYWdlX3NldC5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOworICAgIEFTU0VSVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICB9CisKKyAgLy8gU2VyaWFsaXplIHRvIGJ1ZmZlciB3aXRoIFdpcmVGb3JtYXQuCisgIHsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHN0cmluZ19zdHJlYW0oJmR5bmFtaWNfZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJnN0cmluZ19zdHJlYW0pOworICAgIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhtZXNzYWdlX3NldCwgc2l6ZSwgJm91dHB1dF9zdHJlYW0pOworICAgIEFTU0VSVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICB9CisKKyAgRVhQRUNUX1RSVUUoZmxhdF9kYXRhID09IHN0cmVhbV9kYXRhKTsKKyAgRVhQRUNUX1RSVUUoZmxhdF9kYXRhID09IGR5bmFtaWNfZGF0YSk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFBhcnNlTWVzc2FnZVNldCkgeworICAvLyBTZXQgdXAgYSBSYXdNZXNzYWdlU2V0IHdpdGggdHdvIGtub3duIG1lc3NhZ2VzIGFuZCBhbiB1bmtub3duIG9uZS4KKyAgVU5JVFRFU1Q6OlJhd01lc3NhZ2VTZXQgcmF3OworCisgIHsKKyAgICBVTklUVEVTVDo6UmF3TWVzc2FnZVNldDo6SXRlbSogaXRlbSA9IHJhdy5hZGRfaXRlbSgpOworICAgIGl0ZW0tPnNldF90eXBlX2lkKFVOSVRURVNUOjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6OmRlc2NyaXB0b3IoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAtPmV4dGVuc2lvbigwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAtPm51bWJlcigpKTsKKyAgICBVTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIG1lc3NhZ2U7CisgICAgbWVzc2FnZS5zZXRfaSgxMjMpOworICAgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoaXRlbS0+bXV0YWJsZV9tZXNzYWdlKCkpOworICB9CisKKyAgeworICAgIFVOSVRURVNUOjpSYXdNZXNzYWdlU2V0OjpJdGVtKiBpdGVtID0gcmF3LmFkZF9pdGVtKCk7CisgICAgaXRlbS0+c2V0X3R5cGVfaWQoVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjo6ZGVzY3JpcHRvcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ZXh0ZW5zaW9uKDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bnVtYmVyKCkpOworICAgIFVOSVRURVNUOjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgbWVzc2FnZTsKKyAgICBtZXNzYWdlLnNldF9zdHIoImZvbyIpOworICAgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoaXRlbS0+bXV0YWJsZV9tZXNzYWdlKCkpOworICB9CisKKyAgeworICAgIFVOSVRURVNUOjpSYXdNZXNzYWdlU2V0OjpJdGVtKiBpdGVtID0gcmF3LmFkZF9pdGVtKCk7CisgICAgaXRlbS0+c2V0X3R5cGVfaWQoa1Vua25vd25UeXBlSWQpOworICAgIGl0ZW0tPnNldF9tZXNzYWdlKCJiYXIiKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIEFTU0VSVF9UUlVFKHJhdy5TZXJpYWxpemVUb1N0cmluZygmZGF0YSkpOworCisgIC8vIFBhcnNlIGFzIGEgVGVzdE1lc3NhZ2VTZXQgYW5kIGNoZWNrIHRoZSBjb250ZW50cy4KKyAgUFJPVE8yX1dJUkVGT1JNQVRfVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OworICBBU1NFUlRfVFJVRShtZXNzYWdlX3NldC5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworCisgIEVYUEVDVF9FUSgxMjMsCisgICAgICAgICAgICBtZXNzYWdlX3NldAorICAgICAgICAgICAgICAgIC5HZXRFeHRlbnNpb24oCisgICAgICAgICAgICAgICAgICAgIFVOSVRURVNUOjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikKKyAgICAgICAgICAgICAgICAuaSgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLAorICAgICAgICAgICAgbWVzc2FnZV9zZXQKKyAgICAgICAgICAgICAgICAuR2V0RXh0ZW5zaW9uKAorICAgICAgICAgICAgICAgICAgICBVTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yOjptZXNzYWdlX3NldF9leHRlbnNpb24pCisgICAgICAgICAgICAgICAgLnN0cigpKTsKKworICBBU1NFUlRfRVEoMSwgbWVzc2FnZV9zZXQudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVELAorICAgICAgICAgICAgbWVzc2FnZV9zZXQudW5rbm93bl9maWVsZHMoKS5maWVsZCgwKS50eXBlKCkpOworICBFWFBFQ1RfRVEoImJhciIsIG1lc3NhZ2Vfc2V0LnVua25vd25fZmllbGRzKCkuZmllbGQoMCkubGVuZ3RoX2RlbGltaXRlZCgpKTsKKworICAvLyBBbHNvIHBhcnNlIHVzaW5nIFdpcmVGb3JtYXQuCisgIFBST1RPMl9XSVJFRk9STUFUX1VOSVRURVNUOjpUZXN0TWVzc2FnZVNldCBkeW5hbWljX21lc3NhZ2Vfc2V0OworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dChyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihkYXRhLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc2l6ZSgpKTsKKyAgQVNTRVJUX1RSVUUoV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmZHluYW1pY19tZXNzYWdlX3NldCkpOworICBFWFBFQ1RfRVEobWVzc2FnZV9zZXQuRGVidWdTdHJpbmcoKSwgZHluYW1pY19tZXNzYWdlX3NldC5EZWJ1Z1N0cmluZygpKTsKK30KKworbmFtZXNwYWNlIHsKK3N0ZDo6c3RyaW5nIEJ1aWxkTWVzc2FnZVNldEl0ZW1TdGFydCgpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgeworICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCgmb3V0cHV0X3N0cmVhbSk7CisgICAgY29kZWRfb3V0cHV0LldyaXRlVGFnKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZyk7CisgIH0KKyAgcmV0dXJuIGRhdGE7Cit9CitzdGQ6OnN0cmluZyBCdWlsZE1lc3NhZ2VTZXRJdGVtRW5kKCkgeworICBzdGQ6OnN0cmluZyBkYXRhOworICB7CisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZkYXRhKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXRfc3RyZWFtKTsKKyAgICBjb2RlZF9vdXRwdXQuV3JpdGVUYWcoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZyk7CisgIH0KKyAgcmV0dXJuIGRhdGE7Cit9CitzdGQ6OnN0cmluZyBCdWlsZE1lc3NhZ2VTZXRUZXN0RXh0ZW5zaW9uMShpbnQgdmFsdWUgPSAxMjMpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgeworICAgIFVOSVRURVNUOjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgbWVzc2FnZTsKKyAgICBtZXNzYWdlLnNldF9pKHZhbHVlKTsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmRhdGEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXRwdXQoJm91dHB1dF9zdHJlYW0pOworICAgIC8vIFdyaXRlIHRoZSBtZXNzYWdlIGNvbnRlbnQgZmlyc3QuCisgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWRfb3V0cHV0KTsKKyAgICBjb2RlZF9vdXRwdXQuV3JpdGVWYXJpbnQzMihtZXNzYWdlLkJ5dGVTaXplTG9uZygpKTsKKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmY29kZWRfb3V0cHV0KTsKKyAgfQorICByZXR1cm4gZGF0YTsKK30KK3N0ZDo6c3RyaW5nIEJ1aWxkTWVzc2FnZVNldEl0ZW1UeXBlSWQoaW50IGV4dGVuc2lvbl9udW1iZXIpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgeworICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCgmb3V0cHV0X3N0cmVhbSk7CisgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDMyKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX251bWJlciwgJmNvZGVkX291dHB1dCk7CisgIH0KKyAgcmV0dXJuIGRhdGE7Cit9Cit2b2lkIFZhbGlkYXRlVGVzdE1lc3NhZ2VTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIHRlc3RfY2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGF0YSkgeworICBTQ09QRURfVFJBQ0UodGVzdF9jYXNlKTsKKyAgeworICAgIFBST1RPMl9XSVJFRk9STUFUX1VOSVRURVNUOjpUZXN0TWVzc2FnZVNldCBtZXNzYWdlX3NldDsKKyAgICBBU1NFUlRfVFJVRShtZXNzYWdlX3NldC5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworCisgICAgRVhQRUNUX0VRKDEyMywKKyAgICAgICAgICAgICAgbWVzc2FnZV9zZXQKKyAgICAgICAgICAgICAgICAgIC5HZXRFeHRlbnNpb24oCisgICAgICAgICAgICAgICAgICAgICAgVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgICAgLmkoKSk7CisKKyAgICAvLyBNYWtlIHN1cmUgaXQgZG9lcyBub3QgY29udGFpbiBhbnl0aGluZyBlbHNlLgorICAgIG1lc3NhZ2Vfc2V0LkNsZWFyRXh0ZW5zaW9uKAorICAgICAgICBVTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pOworICAgIEVYUEVDVF9FUShtZXNzYWdlX3NldC5TZXJpYWxpemVBc1N0cmluZygpLCAiIik7CisgIH0KKyAgeworICAgIC8vIFRlc3QgcGFyc2UgdGhlIG1lc3NhZ2UgdmlhIFJlZmxlY3Rpb24uCisgICAgUFJPVE8yX1dJUkVGT1JNQVRfVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnNpemUoKSk7CisgICAgRVhQRUNUX1RSVUUoV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmbWVzc2FnZV9zZXQpKTsKKyAgICBFWFBFQ1RfVFJVRShpbnB1dC5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKSk7CisKKyAgICBFWFBFQ1RfRVEoMTIzLAorICAgICAgICAgICAgICBtZXNzYWdlX3NldAorICAgICAgICAgICAgICAgICAgLkdldEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICBVTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pCisgICAgICAgICAgICAgICAgICAuaSgpKTsKKyAgfQorICB7CisgICAgLy8gVGVzdCBwYXJzZSB0aGUgbWVzc2FnZSB2aWEgRHluYW1pY01lc3NhZ2UuCisgICAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGZhY3Rvcnk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lc3NhZ2U+IG1zZygKKyAgICAgICAgZmFjdG9yeQorICAgICAgICAgICAgLkdldFByb3RvdHlwZSgKKyAgICAgICAgICAgICAgICBQUk9UTzJfV0lSRUZPUk1BVF9VTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXQ6OmRlc2NyaXB0b3IoKSkKKyAgICAgICAgICAgIC0+TmV3KCkpOworICAgIG1zZy0+UGFyc2VGcm9tU3RyaW5nKGRhdGEpOworICAgIGF1dG8qIHJlZmxlY3Rpb24gPSBtc2ctPkdldFJlZmxlY3Rpb24oKTsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgICAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbXNnLCAmZmllbGRzKTsKKyAgICBBU1NFUlRfRVEoZmllbGRzLnNpemUoKSwgMSk7CisgICAgY29uc3QgYXV0byYgc3ViID0gcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgqbXNnLCBmaWVsZHNbMF0pOworICAgIHJlZmxlY3Rpb24gPSBzdWIuR2V0UmVmbGVjdGlvbigpOworICAgIEVYUEVDVF9FUSgxMjMsIHJlZmxlY3Rpb24tPkdldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICBzdWIsIHN1Yi5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgiaSIpKSk7CisgIH0KK30KK30gIC8vIG5hbWVzcGFjZQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZU1lc3NhZ2VTZXRXaXRoQW55VGFnT3JkZXIpIHsKKyAgc3RkOjpzdHJpbmcgc3RhcnQgPSBCdWlsZE1lc3NhZ2VTZXRJdGVtU3RhcnQoKTsKKyAgc3RkOjpzdHJpbmcgZW5kID0gQnVpbGRNZXNzYWdlU2V0SXRlbUVuZCgpOworICBzdGQ6OnN0cmluZyBpZCA9IEJ1aWxkTWVzc2FnZVNldEl0ZW1UeXBlSWQoCisgICAgICBVTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjpkZXNjcmlwdG9yKCktPmV4dGVuc2lvbigwKS0+bnVtYmVyKCkpOworICBzdGQ6OnN0cmluZyBtZXNzYWdlID0gQnVpbGRNZXNzYWdlU2V0VGVzdEV4dGVuc2lvbjEoKTsKKworICBWYWxpZGF0ZVRlc3RNZXNzYWdlU2V0KCJpZCArIG1lc3NhZ2UiLCBzdGFydCArIGlkICsgbWVzc2FnZSArIGVuZCk7CisgIFZhbGlkYXRlVGVzdE1lc3NhZ2VTZXQoIm1lc3NhZ2UgKyBpZCIsIHN0YXJ0ICsgbWVzc2FnZSArIGlkICsgZW5kKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2VNZXNzYWdlU2V0V2l0aER1cGxpY2F0ZVRhZ3MpIHsKKyAgc3RkOjpzdHJpbmcgc3RhcnQgPSBCdWlsZE1lc3NhZ2VTZXRJdGVtU3RhcnQoKTsKKyAgc3RkOjpzdHJpbmcgZW5kID0gQnVpbGRNZXNzYWdlU2V0SXRlbUVuZCgpOworICBzdGQ6OnN0cmluZyBpZCA9IEJ1aWxkTWVzc2FnZVNldEl0ZW1UeXBlSWQoCisgICAgICBVTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjpkZXNjcmlwdG9yKCktPmV4dGVuc2lvbigwKS0+bnVtYmVyKCkpOworICBzdGQ6OnN0cmluZyBvdGhlcl9pZCA9IEJ1aWxkTWVzc2FnZVNldEl0ZW1UeXBlSWQoMTIzNDU2KTsKKyAgc3RkOjpzdHJpbmcgbWVzc2FnZSA9IEJ1aWxkTWVzc2FnZVNldFRlc3RFeHRlbnNpb24xKCk7CisgIHN0ZDo6c3RyaW5nIG90aGVyX21lc3NhZ2UgPSBCdWlsZE1lc3NhZ2VTZXRUZXN0RXh0ZW5zaW9uMSgzMjEpOworCisgIC8vIERvdWJsZSBpZAorICBWYWxpZGF0ZVRlc3RNZXNzYWdlU2V0KCJpZCArIG90aGVyX2lkICsgbWVzc2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBpZCArIG90aGVyX2lkICsgbWVzc2FnZSArIGVuZCk7CisgIFZhbGlkYXRlVGVzdE1lc3NhZ2VTZXQoImlkICsgbWVzc2FnZSArIG90aGVyX2lkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGlkICsgbWVzc2FnZSArIG90aGVyX2lkICsgZW5kKTsKKyAgVmFsaWRhdGVUZXN0TWVzc2FnZVNldCgibWVzc2FnZSArIGlkICsgb3RoZXJfaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgbWVzc2FnZSArIGlkICsgb3RoZXJfaWQgKyBlbmQpOworICAvLyBEb3VibGUgbWVzc2FnZQorICBWYWxpZGF0ZVRlc3RNZXNzYWdlU2V0KCJpZCArIG1lc3NhZ2UgKyBvdGhlcl9tZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGlkICsgbWVzc2FnZSArIG90aGVyX21lc3NhZ2UgKyBlbmQpOworICBWYWxpZGF0ZVRlc3RNZXNzYWdlU2V0KCJtZXNzYWdlICsgaWQgKyBvdGhlcl9tZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIG1lc3NhZ2UgKyBpZCArIG90aGVyX21lc3NhZ2UgKyBlbmQpOworICBWYWxpZGF0ZVRlc3RNZXNzYWdlU2V0KCJtZXNzYWdlICsgb3RoZXJfbWVzc2FnZSArIGlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIG1lc3NhZ2UgKyBvdGhlcl9tZXNzYWdlICsgaWQgKyBlbmQpOworfQorCit2b2lkIFNlcmlhbGl6ZVJldmVyc2VPcmRlcigKKyAgICBjb25zdCBQUk9UTzJfV0lSRUZPUk1BVF9VTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXQmIG1zZXQsCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBjb2RlZF9vdXRwdXQpOworCit2b2lkIFNlcmlhbGl6ZVJldmVyc2VPcmRlcihjb25zdCBVTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBjb2RlZF9vdXRwdXQpIHsKKyAgV2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKDE1LCAgLy8gaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgY29kZWRfb3V0cHV0KTsKKyAgY29kZWRfb3V0cHV0LT5Xcml0ZVZhcmludDY0KG1lc3NhZ2UuaSgpKTsKKyAgV2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKDE2LCAgLy8gcmVjdXJzaXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVkX291dHB1dCk7CisgIGNvZGVkX291dHB1dC0+V3JpdGVWYXJpbnQzMihtZXNzYWdlLnJlY3Vyc2l2ZSgpLkdldENhY2hlZFNpemUoKSk7CisgIFNlcmlhbGl6ZVJldmVyc2VPcmRlcihtZXNzYWdlLnJlY3Vyc2l2ZSgpLCBjb2RlZF9vdXRwdXQpOworfQorCit2b2lkIFNlcmlhbGl6ZVJldmVyc2VPcmRlcigKKyAgICBjb25zdCBQUk9UTzJfV0lSRUZPUk1BVF9VTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXQmIG1zZXQsCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBjb2RlZF9vdXRwdXQpIHsKKyAgaWYgKCFtc2V0Lkhhc0V4dGVuc2lvbigKKyAgICAgICAgICBVTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pKQorICAgIHJldHVybjsKKyAgY29kZWRfb3V0cHV0LT5Xcml0ZVRhZyhXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtU3RhcnRUYWcpOworICAvLyBXcml0ZSB0aGUgbWVzc2FnZSBjb250ZW50IGZpcnN0LgorICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWcoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWRfb3V0cHV0KTsKKyAgYXV0byYgbWVzc2FnZSA9IG1zZXQuR2V0RXh0ZW5zaW9uKAorICAgICAgVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKTsKKyAgY29kZWRfb3V0cHV0LT5Xcml0ZVZhcmludDMyKG1lc3NhZ2UuR2V0Q2FjaGVkU2l6ZSgpKTsKKyAgU2VyaWFsaXplUmV2ZXJzZU9yZGVyKG1lc3NhZ2UsIGNvZGVkX291dHB1dCk7CisgIC8vIFdyaXRlIHRoZSB0eXBlIGlkLgorICB1aW50MzJfdCB0eXBlX2lkID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCktPmV4dGVuc2lvbigwKS0+bnVtYmVyKCk7CisgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRUeXBlSWROdW1iZXIsIHR5cGVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZF9vdXRwdXQpOworICBjb2RlZF9vdXRwdXQtPldyaXRlVGFnKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1FbmRUYWcpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZU1lc3NhZ2VTZXRXaXRoRGVlcFJlY1JldmVyc2VPcmRlcikgeworICBzdGQ6OnN0cmluZyBkYXRhOworICB7CisgICAgUFJPVE8yX1dJUkVGT1JNQVRfVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OworICAgIFBST1RPMl9XSVJFRk9STUFUX1VOSVRURVNUOjpUZXN0TWVzc2FnZVNldCogbXNldCA9ICZtZXNzYWdlX3NldDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwMDsgaSsrKSB7CisgICAgICBhdXRvIG0gPSBtc2V0LT5NdXRhYmxlRXh0ZW5zaW9uKAorICAgICAgICAgIFVOSVRURVNUOjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbik7CisgICAgICBtLT5zZXRfaShpKTsKKyAgICAgIG1zZXQgPSBtLT5tdXRhYmxlX3JlY3Vyc2l2ZSgpOworICAgIH0KKyAgICBtZXNzYWdlX3NldC5CeXRlU2l6ZUxvbmcoKTsKKyAgICAvLyBTZXJpYWxpemUgd2l0aCByZXZlcnNlIHBheWxvYWQgdGFnIG9yZGVyCisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZkYXRhKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXRfc3RyZWFtKTsKKyAgICBTZXJpYWxpemVSZXZlcnNlT3JkZXIobWVzc2FnZV9zZXQsICZjb2RlZF9vdXRwdXQpOworICB9CisgIFBST1RPMl9XSVJFRk9STUFUX1VOSVRURVNUOjpUZXN0TWVzc2FnZVNldCBtZXNzYWdlX3NldDsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Vfc2V0LlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFBhcnNlRmFpbE1hbGZvcm1lZE1lc3NhZ2VTZXQpIHsKKyAgY29uc3RleHByIGludCBrRGVwdGggPSA1OworICBzdGQ6OnN0cmluZyBkYXRhOworICB7CisgICAgUFJPVE8yX1dJUkVGT1JNQVRfVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OworICAgIFBST1RPMl9XSVJFRk9STUFUX1VOSVRURVNUOjpUZXN0TWVzc2FnZVNldCogbXNldCA9ICZtZXNzYWdlX3NldDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtEZXB0aDsgaSsrKSB7CisgICAgICBhdXRvIG0gPSBtc2V0LT5NdXRhYmxlRXh0ZW5zaW9uKAorICAgICAgICAgIFVOSVRURVNUOjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbik7CisgICAgICBtLT5zZXRfaShpKTsKKyAgICAgIG1zZXQgPSBtLT5tdXRhYmxlX3JlY3Vyc2l2ZSgpOworICAgIH0KKyAgICBhdXRvIG0gPSBtc2V0LT5NdXRhYmxlRXh0ZW5zaW9uKAorICAgICAgICBVTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pOworICAgIC8vIC0xIGJlY29tZXMgXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHgxCisgICAgbS0+c2V0X2koLTEpOworCisgICAgRVhQRUNUX1RSVUUobWVzc2FnZV9zZXQuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpKTsKKyAgICAvLyBNYWtlIHRoZSBwcm90byBtYWwtZm9ybWVkLgorICAgIGRhdGFbZGF0YS5zaXplKCkgLSAyIC0ga0RlcHRoXSA9IDB4RkY7CisgIH0KKworICBQUk9UTzJfV0lSRUZPUk1BVF9VTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXQgbWVzc2FnZV9zZXQ7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlX3NldC5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZUZhaWxNYWxmb3JtZWRNZXNzYWdlU2V0UmV2ZXJzZU9yZGVyKSB7CisgIGNvbnN0ZXhwciBpbnQga0RlcHRoID0gNTsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgeworICAgIFBST1RPMl9XSVJFRk9STUFUX1VOSVRURVNUOjpUZXN0TWVzc2FnZVNldCBtZXNzYWdlX3NldDsKKyAgICBQUk9UTzJfV0lSRUZPUk1BVF9VTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXQqIG1zZXQgPSAmbWVzc2FnZV9zZXQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRGVwdGg7IGkrKykgeworICAgICAgYXV0byBtID0gbXNldC0+TXV0YWJsZUV4dGVuc2lvbigKKyAgICAgICAgICBVTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pOworICAgICAgbS0+c2V0X2koaSk7CisgICAgICBtc2V0ID0gbS0+bXV0YWJsZV9yZWN1cnNpdmUoKTsKKyAgICB9CisgICAgYXV0byBtID0gbXNldC0+TXV0YWJsZUV4dGVuc2lvbigKKyAgICAgICAgVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKTsKKyAgICAvLyAtMSBiZWNvbWVzIFx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4MQorICAgIG0tPnNldF9pKC0xKTsKKyAgICAvLyBTZXJpYWxpemVSZXZlcnNlT3JkZXIoKSBhc3N1bWVzICJyZWN1cnNpdmUiIGlzIGFsd2F5cyBwcmVzZW50LgorICAgIG0tPm11dGFibGVfcmVjdXJzaXZlKCk7CisKKyAgICBtZXNzYWdlX3NldC5CeXRlU2l6ZUxvbmcoKTsKKworICAgIC8vIFNlcmlhbGl6ZSB3aXRoIHJldmVyc2UgcGF5bG9hZCB0YWcgb3JkZXIKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmRhdGEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXRwdXQoJm91dHB1dF9zdHJlYW0pOworICAgIFNlcmlhbGl6ZVJldmVyc2VPcmRlcihtZXNzYWdlX3NldCwgJmNvZGVkX291dHB1dCk7CisgIH0KKworICAvLyBNYWtlIHZhcmludCBmb3IgLTEgbWFsZm9ybWVkLgorICBkYXRhW2RhdGEuc2l6ZSgpIC0gNSAqIChrRGVwdGggKyAxKSAtIDRdID0gMHhGRjsKKworICBQUk9UTzJfV0lSRUZPUk1BVF9VTklUVEVTVDo6VGVzdE1lc3NhZ2VTZXQgbWVzc2FnZV9zZXQ7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlX3NldC5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZUJyb2tlbk1lc3NhZ2VTZXQpIHsKKyAgUFJPVE8yX1dJUkVGT1JNQVRfVU5JVFRFU1Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OworICBzdGQ6OnN0cmluZyBpbnB1dCgiZ29vZGJ5ZSIpOyAgLy8gSW52YWxpZCB3aXJlIGZvcm1hdCBkYXRhLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZV9zZXQuUGFyc2VGcm9tU3RyaW5nKGlucHV0KSk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFJlY3Vyc2lvbkxpbWl0KSB7CisgIFVOSVRURVNUOjpUZXN0UmVjdXJzaXZlTWVzc2FnZSBtZXNzYWdlOworICBtZXNzYWdlLm11dGFibGVfYSgpLT5tdXRhYmxlX2EoKS0+bXV0YWJsZV9hKCktPm11dGFibGVfYSgpLT5zZXRfaSgxKTsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgeworICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICAgIGlucHV0LlNldFJlY3Vyc2lvbkxpbWl0KDQpOworICAgIFVOSVRURVNUOjpUZXN0UmVjdXJzaXZlTWVzc2FnZSBtZXNzYWdlMjsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21Db2RlZFN0cmVhbSgmaW5wdXQpKTsKKyAgfQorCisgIHsKKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgICBpbnB1dC5TZXRSZWN1cnNpb25MaW1pdCgzKTsKKyAgICBVTklUVEVTVDo6VGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgbWVzc2FnZTI7CisgICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UyLlBhcnNlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCkpOworICB9Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIExhcmdlUmVjdXJzaW9uTGltaXQpIHsKKyAgY29uc3QgaW50IGtMYXJnZUxpbWl0ID0gaW86OkNvZGVkSW5wdXRTdHJlYW06OkdldERlZmF1bHRSZWN1cnNpb25MaW1pdCgpICsgNTA7CisgIFVOSVRURVNUOjpUZXN0UmVjdXJzaXZlTWVzc2FnZSBzcmMsIGRzdCwgKmE7CisgIGEgPSBzcmMubXV0YWJsZV9hKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga0xhcmdlTGltaXQgLSAxOyBpKyspIHsKKyAgICBhID0gYS0+bXV0YWJsZV9hKCk7CisgIH0KKyAgYS0+c2V0X2koMSk7CisKKyAgc3RkOjpzdHJpbmcgZGF0YSA9IHNyYy5TZXJpYWxpemVBc1N0cmluZygpOworICB7CisgICAgLy8gUGFyc2Ugd2l0aCBkZWZhdWx0IHJlY3Vyc2lvbiBsaW1pdC4gU2hvdWxkIGZhaWwuCisgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7CisgICAgQVNTRVJUX0ZBTFNFKGRzdC5QYXJzZUZyb21Db2RlZFN0cmVhbSgmaW5wdXQpKTsKKyAgfQorCisgIHsKKyAgICAvLyBQYXJzZSB3aXRoIGN1c3RvbSByZWN1cnNpb24gbGltaXQuIFNob3VsZCBwYXNzLgorICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICAgIGlucHV0LlNldFJlY3Vyc2lvbkxpbWl0KGtMYXJnZUxpbWl0KTsKKyAgICBBU1NFUlRfVFJVRShkc3QuUGFyc2VGcm9tQ29kZWRTdHJlYW0oJmlucHV0KSk7CisgIH0KKworICAvLyBWZXJpZmllcyB0aGUgcmVjdXJzaW9uIGRlcHRoLgorICBpbnQgZGVwdGggPSAxOworICBhID0gZHN0Lm11dGFibGVfYSgpOworICB3aGlsZSAoYS0+aGFzX2EoKSkgeworICAgIGEgPSBhLT5tdXRhYmxlX2EoKTsKKyAgICBkZXB0aCsrOworICB9CisKKyAgRVhQRUNUX0VRKGEtPmkoKSwgMSk7CisgIEVYUEVDVF9FUShkZXB0aCwga0xhcmdlTGltaXQpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBVbmtub3duRmllbGRSZWN1cnNpb25MaW1pdCkgeworICBVTklUVEVTVDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlOworICBtZXNzYWdlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKQorICAgICAgLT5BZGRHcm91cCgxMjM0KQorICAgICAgLT5BZGRHcm91cCgxMjM0KQorICAgICAgLT5BZGRHcm91cCgxMjM0KQorICAgICAgLT5BZGRHcm91cCgxMjM0KQorICAgICAgLT5BZGRWYXJpbnQoMTIzNCwgMTIzKTsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgeworICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICAgIGlucHV0LlNldFJlY3Vyc2lvbkxpbWl0KDQpOworICAgIFVOSVRURVNUOjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2UyOworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCkpOworICB9CisKKyAgeworICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICAgIGlucHV0LlNldFJlY3Vyc2lvbkxpbWl0KDMpOworICAgIFVOSVRURVNUOjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2UyOworICAgIEVYUEVDVF9GQUxTRShtZXNzYWdlMi5QYXJzZUZyb21Db2RlZFN0cmVhbSgmaW5wdXQpKTsKKyAgfQorfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBaaWdaYWcpIHsKKy8vIGF2b2lkIGxpbmUtd3JhcHBpbmcKKyNkZWZpbmUgTEwoeCkgc3RhdGljX2Nhc3Q8aW50NjRfdD4oVUxMKHgpKQorI2RlZmluZSBVTEwoeCkgdWludDY0X3R7eCMjdX0KKyNkZWZpbmUgWmlnWmFnRW5jb2RlMzIoeCkgV2lyZUZvcm1hdExpdGU6OlppZ1phZ0VuY29kZTMyKHgpCisjZGVmaW5lIFppZ1phZ0RlY29kZTMyKHgpIFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdEZWNvZGUzMih4KQorI2RlZmluZSBaaWdaYWdFbmNvZGU2NCh4KSBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRW5jb2RlNjQoeCkKKyNkZWZpbmUgWmlnWmFnRGVjb2RlNjQoeCkgV2lyZUZvcm1hdExpdGU6OlppZ1phZ0RlY29kZTY0KHgpCisKKyAgRVhQRUNUX0VRKDB1LCBaaWdaYWdFbmNvZGUzMigwKSk7CisgIEVYUEVDVF9FUSgxdSwgWmlnWmFnRW5jb2RlMzIoLTEpKTsKKyAgRVhQRUNUX0VRKDJ1LCBaaWdaYWdFbmNvZGUzMigxKSk7CisgIEVYUEVDVF9FUSgzdSwgWmlnWmFnRW5jb2RlMzIoLTIpKTsKKyAgRVhQRUNUX0VRKDB4N0ZGRkZGRkV1LCBaaWdaYWdFbmNvZGUzMigweDNGRkZGRkZGKSk7CisgIEVYUEVDVF9FUSgweDdGRkZGRkZGdSwgWmlnWmFnRW5jb2RlMzIoMHhDMDAwMDAwMCkpOworICBFWFBFQ1RfRVEoMHhGRkZGRkZGRXUsIFppZ1phZ0VuY29kZTMyKDB4N0ZGRkZGRkYpKTsKKyAgRVhQRUNUX0VRKDB4RkZGRkZGRkZ1LCBaaWdaYWdFbmNvZGUzMigweDgwMDAwMDAwKSk7CisKKyAgRVhQRUNUX0VRKDAsIFppZ1phZ0RlY29kZTMyKDB1KSk7CisgIEVYUEVDVF9FUSgtMSwgWmlnWmFnRGVjb2RlMzIoMXUpKTsKKyAgRVhQRUNUX0VRKDEsIFppZ1phZ0RlY29kZTMyKDJ1KSk7CisgIEVYUEVDVF9FUSgtMiwgWmlnWmFnRGVjb2RlMzIoM3UpKTsKKyAgRVhQRUNUX0VRKDB4M0ZGRkZGRkYsIFppZ1phZ0RlY29kZTMyKDB4N0ZGRkZGRkV1KSk7CisgIEVYUEVDVF9FUSgweEMwMDAwMDAwLCBaaWdaYWdEZWNvZGUzMigweDdGRkZGRkZGdSkpOworICBFWFBFQ1RfRVEoMHg3RkZGRkZGRiwgWmlnWmFnRGVjb2RlMzIoMHhGRkZGRkZGRXUpKTsKKyAgRVhQRUNUX0VRKDB4ODAwMDAwMDAsIFppZ1phZ0RlY29kZTMyKDB4RkZGRkZGRkZ1KSk7CisKKyAgRVhQRUNUX0VRKDB1LCBaaWdaYWdFbmNvZGU2NCgwKSk7CisgIEVYUEVDVF9FUSgxdSwgWmlnWmFnRW5jb2RlNjQoLTEpKTsKKyAgRVhQRUNUX0VRKDJ1LCBaaWdaYWdFbmNvZGU2NCgxKSk7CisgIEVYUEVDVF9FUSgzdSwgWmlnWmFnRW5jb2RlNjQoLTIpKTsKKyAgRVhQRUNUX0VRKFVMTCgweDAwMDAwMDAwN0ZGRkZGRkUpLCBaaWdaYWdFbmNvZGU2NChMTCgweDAwMDAwMDAwM0ZGRkZGRkYpKSk7CisgIEVYUEVDVF9FUShVTEwoMHgwMDAwMDAwMDdGRkZGRkZGKSwgWmlnWmFnRW5jb2RlNjQoTEwoMHhGRkZGRkZGRkMwMDAwMDAwKSkpOworICBFWFBFQ1RfRVEoVUxMKDB4MDAwMDAwMDBGRkZGRkZGRSksIFppZ1phZ0VuY29kZTY0KExMKDB4MDAwMDAwMDA3RkZGRkZGRikpKTsKKyAgRVhQRUNUX0VRKFVMTCgweDAwMDAwMDAwRkZGRkZGRkYpLCBaaWdaYWdFbmNvZGU2NChMTCgweEZGRkZGRkZGODAwMDAwMDApKSk7CisgIEVYUEVDVF9FUShVTEwoMHhGRkZGRkZGRkZGRkZGRkZFKSwgWmlnWmFnRW5jb2RlNjQoTEwoMHg3RkZGRkZGRkZGRkZGRkZGKSkpOworICBFWFBFQ1RfRVEoVUxMKDB4RkZGRkZGRkZGRkZGRkZGRiksIFppZ1phZ0VuY29kZTY0KExMKDB4ODAwMDAwMDAwMDAwMDAwMCkpKTsKKworICBFWFBFQ1RfRVEoMCwgWmlnWmFnRGVjb2RlNjQoMHUpKTsKKyAgRVhQRUNUX0VRKC0xLCBaaWdaYWdEZWNvZGU2NCgxdSkpOworICBFWFBFQ1RfRVEoMSwgWmlnWmFnRGVjb2RlNjQoMnUpKTsKKyAgRVhQRUNUX0VRKC0yLCBaaWdaYWdEZWNvZGU2NCgzdSkpOworICBFWFBFQ1RfRVEoTEwoMHgwMDAwMDAwMDNGRkZGRkZGKSwgWmlnWmFnRGVjb2RlNjQoVUxMKDB4MDAwMDAwMDA3RkZGRkZGRSkpKTsKKyAgRVhQRUNUX0VRKExMKDB4RkZGRkZGRkZDMDAwMDAwMCksIFppZ1phZ0RlY29kZTY0KFVMTCgweDAwMDAwMDAwN0ZGRkZGRkYpKSk7CisgIEVYUEVDVF9FUShMTCgweDAwMDAwMDAwN0ZGRkZGRkYpLCBaaWdaYWdEZWNvZGU2NChVTEwoMHgwMDAwMDAwMEZGRkZGRkZFKSkpOworICBFWFBFQ1RfRVEoTEwoMHhGRkZGRkZGRjgwMDAwMDAwKSwgWmlnWmFnRGVjb2RlNjQoVUxMKDB4MDAwMDAwMDBGRkZGRkZGRikpKTsKKyAgRVhQRUNUX0VRKExMKDB4N0ZGRkZGRkZGRkZGRkZGRiksIFppZ1phZ0RlY29kZTY0KFVMTCgweEZGRkZGRkZGRkZGRkZGRkUpKSk7CisgIEVYUEVDVF9FUShMTCgweDgwMDAwMDAwMDAwMDAwMDApLCBaaWdaYWdEZWNvZGU2NChVTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSkpOworCisgIC8vIFNvbWUgZWFzaWVyLXRvLXZlcmlmeSByb3VuZC10cmlwIHRlc3RzLiAgVGhlIGlucHV0cyAob3RoZXIgdGhhbiAwLCAxLCAtMSkKKyAgLy8gd2VyZSBjaG9zZW4gc2VtaS1yYW5kb21seSB2aWEga2V5Ym9hcmQgYmFzaGluZy4KKyAgRVhQRUNUX0VRKDAsIFppZ1phZ0RlY29kZTMyKFppZ1phZ0VuY29kZTMyKDApKSk7CisgIEVYUEVDVF9FUSgxLCBaaWdaYWdEZWNvZGUzMihaaWdaYWdFbmNvZGUzMigxKSkpOworICBFWFBFQ1RfRVEoLTEsIFppZ1phZ0RlY29kZTMyKFppZ1phZ0VuY29kZTMyKC0xKSkpOworICBFWFBFQ1RfRVEoMTQ5MjcsIFppZ1phZ0RlY29kZTMyKFppZ1phZ0VuY29kZTMyKDE0OTI3KSkpOworICBFWFBFQ1RfRVEoLTM2MTIsIFppZ1phZ0RlY29kZTMyKFppZ1phZ0VuY29kZTMyKC0zNjEyKSkpOworCisgIEVYUEVDVF9FUSgwLCBaaWdaYWdEZWNvZGU2NChaaWdaYWdFbmNvZGU2NCgwKSkpOworICBFWFBFQ1RfRVEoMSwgWmlnWmFnRGVjb2RlNjQoWmlnWmFnRW5jb2RlNjQoMSkpKTsKKyAgRVhQRUNUX0VRKC0xLCBaaWdaYWdEZWNvZGU2NChaaWdaYWdFbmNvZGU2NCgtMSkpKTsKKyAgRVhQRUNUX0VRKDE0OTI3LCBaaWdaYWdEZWNvZGU2NChaaWdaYWdFbmNvZGU2NCgxNDkyNykpKTsKKyAgRVhQRUNUX0VRKC0zNjEyLCBaaWdaYWdEZWNvZGU2NChaaWdaYWdFbmNvZGU2NCgtMzYxMikpKTsKKworICBFWFBFQ1RfRVEoTEwoODU2OTEyMzA0ODAxNDE2KSwKKyAgICAgICAgICAgIFppZ1phZ0RlY29kZTY0KFppZ1phZ0VuY29kZTY0KExMKDg1NjkxMjMwNDgwMTQxNikpKSk7CisgIEVYUEVDVF9FUShMTCgtNzUxMjM5MDU0Mzk1NzEyNTYpLAorICAgICAgICAgICAgWmlnWmFnRGVjb2RlNjQoWmlnWmFnRW5jb2RlNjQoTEwoLTc1MTIzOTA1NDM5NTcxMjU2KSkpKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgUmVwZWF0ZWRTY2FsYXJzRGlmZmVyZW50VGFnU2l6ZXMpIHsKKyAgLy8gQXQgb25lIHBvaW50IGNoZWNrcyB3b3VsZCB0cmlnZ2VyIHdoZW4gcGFyc2luZyByZXBlYXRlZCBmaXhlZCBzY2FsYXIKKyAgLy8gZmllbGRzLgorICBVTklUVEVTVDo6VGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgbXNnMSwgbXNnMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgeworICAgIG1zZzEuYWRkX3JlcGVhdGVkX2ZpeGVkMzIoaSk7CisgICAgbXNnMS5hZGRfcmVwZWF0ZWRfaW50MzIoaSk7CisgICAgbXNnMS5hZGRfcmVwZWF0ZWRfZml4ZWQ2NChpKTsKKyAgICBtc2cxLmFkZF9yZXBlYXRlZF9pbnQ2NChpKTsKKyAgICBtc2cxLmFkZF9yZXBlYXRlZF9mbG9hdChpKTsKKyAgICBtc2cxLmFkZF9yZXBlYXRlZF91aW50NjQoaSk7CisgIH0KKworICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFyaWV0eSBvZiB0YWcgc2l6ZXMuCisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MgPSBtc2cxLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZDsKKyAgZmllbGQgPSBkZXNjLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ZpeGVkMzIiKTsKKyAgQVNTRVJUX1RSVUUoZmllbGQgIT0gbnVsbHB0cik7CisgIEFTU0VSVF9FUSgxLCBXaXJlRm9ybWF0OjpUYWdTaXplKGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPnR5cGUoKSkpOworICBmaWVsZCA9IGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfaW50MzIiKTsKKyAgQVNTRVJUX1RSVUUoZmllbGQgIT0gbnVsbHB0cik7CisgIEFTU0VSVF9FUSgxLCBXaXJlRm9ybWF0OjpUYWdTaXplKGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPnR5cGUoKSkpOworICBmaWVsZCA9IGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfZml4ZWQ2NCIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBudWxscHRyKTsKKyAgQVNTRVJUX0VRKDIsIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKSk7CisgIGZpZWxkID0gZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9pbnQ2NCIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBudWxscHRyKTsKKyAgQVNTRVJUX0VRKDIsIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKSk7CisgIGZpZWxkID0gZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9mbG9hdCIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBudWxscHRyKTsKKyAgQVNTRVJUX0VRKDMsIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKSk7CisgIGZpZWxkID0gZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF91aW50NjQiKTsKKyAgQVNTRVJUX1RSVUUoZmllbGQgIT0gbnVsbHB0cik7CisgIEFTU0VSVF9FUSgzLCBXaXJlRm9ybWF0OjpUYWdTaXplKGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPnR5cGUoKSkpOworCisgIEVYUEVDVF9UUlVFKG1zZzIuUGFyc2VGcm9tU3RyaW5nKG1zZzEuU2VyaWFsaXplQXNTdHJpbmcoKSkpOworICBFWFBFQ1RfRVEobXNnMS5EZWJ1Z1N0cmluZygpLCBtc2cyLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBDb21wYXRpYmxlVHlwZXMpIHsKKyAgY29uc3QgaW50NjRfdCBkYXRhID0gMHgxMDAwMDAwMDBMTDsKKyAgVU5JVFRFU1Q6OkludDY0TWVzc2FnZSBtc2cxOworICBtc2cxLnNldF9kYXRhKGRhdGEpOworICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkOworICBtc2cxLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKTsKKworICAvLyBUZXN0IGludDY0IGlzIGNvbXBhdGlibGUgd2l0aCBib29sCisgIFVOSVRURVNUOjpCb29sTWVzc2FnZSBtc2cyOworICBBU1NFUlRfVFJVRShtc2cyLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7CisgIEFTU0VSVF9FUShzdGF0aWNfY2FzdDxib29sPihkYXRhKSwgbXNnMi5kYXRhKCkpOworCisgIC8vIFRlc3QgaW50NjQgaXMgY29tcGF0aWJsZSB3aXRoIHVpbnQ2NAorICBVTklUVEVTVDo6VWludDY0TWVzc2FnZSBtc2czOworICBBU1NFUlRfVFJVRShtc2czLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7CisgIEFTU0VSVF9FUShzdGF0aWNfY2FzdDx1aW50NjRfdD4oZGF0YSksIG1zZzMuZGF0YSgpKTsKKworICAvLyBUZXN0IGludDY0IGlzIGNvbXBhdGlibGUgd2l0aCBpbnQzMgorICBVTklUVEVTVDo6SW50MzJNZXNzYWdlIG1zZzQ7CisgIEFTU0VSVF9UUlVFKG1zZzQuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKKyAgQVNTRVJUX0VRKHN0YXRpY19jYXN0PGludDMyX3Q+KGRhdGEpLCBtc2c0LmRhdGEoKSk7CisKKyAgLy8gVGVzdCBpbnQ2NCBpcyBjb21wYXRpYmxlIHdpdGggdWludDMyCisgIFVOSVRURVNUOjpVaW50MzJNZXNzYWdlIG1zZzU7CisgIEFTU0VSVF9UUlVFKG1zZzUuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKKyAgQVNTRVJUX0VRKHN0YXRpY19jYXN0PHVpbnQzMl90PihkYXRhKSwgbXNnNS5kYXRhKCkpOworfQorCitjbGFzcyBQcm90bzNQcmltaXRpdmVSZXBlYXRlZFdpcmVGb3JtYXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBQcm90bzNQcmltaXRpdmVSZXBlYXRlZFdpcmVGb3JtYXRUZXN0KCkKKyAgICAgIDogcGFja2VkVGVzdEFsbFR5cGVzXygKKyAgICAgICAgICAgICJceEZBXHgwMVx4MDFceDAxIgorICAgICAgICAgICAgIlx4ODJceDAyXHgwMVx4MDEiCisgICAgICAgICAgICAiXHg4QVx4MDJceDAxXHgwMSIKKyAgICAgICAgICAgICJceDkyXHgwMlx4MDFceDAxIgorICAgICAgICAgICAgIlx4OUFceDAyXHgwMVx4MDIiCisgICAgICAgICAgICAiXHhBMlx4MDJceDAxXHgwMiIKKyAgICAgICAgICAgICJceEFBXHgwMlx4MDRceDAxXHgwMFx4MDBceDAwIgorICAgICAgICAgICAgIlx4QjJceDAyXHgwOFx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorICAgICAgICAgICAgIlx4QkFceDAyXHgwNFx4MDFceDAwXHgwMFx4MDAiCisgICAgICAgICAgICAiXHhDMlx4MDJceDA4XHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAgICAgICAgICAiXHhDQVx4MDJceDA0XHgwMFx4MDBceDgwXHgzZiIKKyAgICAgICAgICAgICJceEQyXHgwMlx4MDhceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceGYwXHgzZiIKKyAgICAgICAgICAgICJceERBXHgwMlx4MDFceDAxIgorICAgICAgICAgICAgIlx4OUFceDAzXHgwMVx4MDEiLAorICAgICAgICAgICAgODYpLAorICAgICAgICBwYWNrZWRUZXN0VW5wYWNrZWRUeXBlc18oCisgICAgICAgICAgICAiXHgwQVx4MDFceDAxIgorICAgICAgICAgICAgIlx4MTJceDAxXHgwMSIKKyAgICAgICAgICAgICJceDFBXHgwMVx4MDEiCisgICAgICAgICAgICAiXHgyMlx4MDFceDAxIgorICAgICAgICAgICAgIlx4MkFceDAxXHgwMiIKKyAgICAgICAgICAgICJceDMyXHgwMVx4MDIiCisgICAgICAgICAgICAiXHgzQVx4MDRceDAxXHgwMFx4MDBceDAwIgorICAgICAgICAgICAgIlx4NDJceDA4XHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAgICAgICAgICAiXHg0QVx4MDRceDAxXHgwMFx4MDBceDAwIgorICAgICAgICAgICAgIlx4NTJceDA4XHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAgICAgICAgICAiXHg1QVx4MDRceDAwXHgwMFx4ODBceDNmIgorICAgICAgICAgICAgIlx4NjJceDA4XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhmMFx4M2YiCisgICAgICAgICAgICAiXHg2QVx4MDFceDAxIgorICAgICAgICAgICAgIlx4NzJceDAxXHgwMSIsCisgICAgICAgICAgICA3MiksCisgICAgICAgIHVucGFja2VkVGVzdEFsbFR5cGVzXygKKyAgICAgICAgICAgICJceEY4XHgwMVx4MDEiCisgICAgICAgICAgICAiXHg4MFx4MDJceDAxIgorICAgICAgICAgICAgIlx4ODhceDAyXHgwMSIKKyAgICAgICAgICAgICJceDkwXHgwMlx4MDEiCisgICAgICAgICAgICAiXHg5OFx4MDJceDAyIgorICAgICAgICAgICAgIlx4QTBceDAyXHgwMiIKKyAgICAgICAgICAgICJceEFEXHgwMlx4MDFceDAwXHgwMFx4MDAiCisgICAgICAgICAgICAiXHhCMVx4MDJceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKyAgICAgICAgICAgICJceEJEXHgwMlx4MDFceDAwXHgwMFx4MDAiCisgICAgICAgICAgICAiXHhDMVx4MDJceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKyAgICAgICAgICAgICJceENEXHgwMlx4MDBceDAwXHg4MFx4M2YiCisgICAgICAgICAgICAiXHhEMVx4MDJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceGYwXHgzZiIKKyAgICAgICAgICAgICJceEQ4XHgwMlx4MDEiCisgICAgICAgICAgICAiXHg5OFx4MDNceDAxIiwKKyAgICAgICAgICAgIDcyKSwKKyAgICAgICAgdW5wYWNrZWRUZXN0VW5wYWNrZWRUeXBlc18oCisgICAgICAgICAgICAiXHgwOFx4MDEiCisgICAgICAgICAgICAiXHgxMFx4MDEiCisgICAgICAgICAgICAiXHgxOFx4MDEiCisgICAgICAgICAgICAiXHgyMFx4MDEiCisgICAgICAgICAgICAiXHgyOFx4MDIiCisgICAgICAgICAgICAiXHgzMFx4MDIiCisgICAgICAgICAgICAiXHgzRFx4MDFceDAwXHgwMFx4MDAiCisgICAgICAgICAgICAiXHg0MVx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorICAgICAgICAgICAgIlx4NERceDAxXHgwMFx4MDBceDAwIgorICAgICAgICAgICAgIlx4NTFceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKyAgICAgICAgICAgICJceDVEXHgwMFx4MDBceDgwXHgzZiIKKyAgICAgICAgICAgICJceDYxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhmMFx4M2YiCisgICAgICAgICAgICAiXHg2OFx4MDEiCisgICAgICAgICAgICAiXHg3MFx4MDEiLAorICAgICAgICAgICAgNTgpIHt9CisgIHRlbXBsYXRlIDxjbGFzcyBQcm90bz4KKyAgdm9pZCBTZXRQcm90bzNQcmltaXRpdmVSZXBlYXRlZEZpZWxkcyhQcm90byogbWVzc2FnZSkgeworICAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQzMigxKTsKKyAgICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50NjQoMSk7CisgICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3VpbnQzMigxKTsKKyAgICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfdWludDY0KDEpOworICAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zaW50MzIoMSk7CisgICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NpbnQ2NCgxKTsKKyAgICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZml4ZWQzMigxKTsKKyAgICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZml4ZWQ2NCgxKTsKKyAgICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ZpeGVkMzIoMSk7CisgICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NmaXhlZDY0KDEpOworICAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mbG9hdCgxLjApOworICAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9kb3VibGUoMS4wKTsKKyAgICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfYm9vbCh0cnVlKTsKKyAgICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0oUFJPVE8zX0FSRU5BX1VOSVRURVNUOjpUZXN0QWxsVHlwZXM6OkZPTyk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG8+CisgIHZvaWQgRXhwZWN0UHJvdG8zUHJpbWl0aXZlUmVwZWF0ZWRGaWVsZHNTZXQoY29uc3QgUHJvdG8mIG1lc3NhZ2UpIHsKKyAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMigwKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQoMCkpOworICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMigwKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0KDApKTsKKyAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIoMCkpOworICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCgwKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMigwKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCgwKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMCkpOworICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDApKTsKKyAgICBFWFBFQ1RfRVEoMS4wLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0KDApKTsKKyAgICBFWFBFQ1RfRVEoMS4wLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgwKSk7CisgICAgRVhQRUNUX0VRKHRydWUsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCgwKSk7CisgICAgRVhQRUNUX0VRKFBST1RPM19BUkVOQV9VTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpGT08sCisgICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0oMCkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFByb3RvPgorICB2b2lkIFRlc3RTZXJpYWxpemF0aW9uKFByb3RvKiBtZXNzYWdlLCBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWQpIHsKKyAgICBTZXRQcm90bzNQcmltaXRpdmVSZXBlYXRlZEZpZWxkcyhtZXNzYWdlKTsKKworICAgIHNpemVfdCBzaXplID0gbWVzc2FnZS0+Qnl0ZVNpemVMb25nKCk7CisKKyAgICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgorICAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlZF9kYXRhOworICAgIHsKKyAgICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gcmF3X291dHB1dCgmZ2VuZXJhdGVkX2RhdGEpOworICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgICBtZXNzYWdlLT5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dCk7CisgICAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOworICAgIH0KKyAgICBFWFBFQ1RfVFJVRShUZXN0VXRpbDo6RXF1YWxzVG9TZXJpYWxpemVkKCptZXNzYWdlLCBnZW5lcmF0ZWRfZGF0YSkpOworCisgICAgLy8gU2VyaWFsaXplIHVzaW5nIHRoZSBkeW5hbWljIGNvZGUuCisgICAgc3RkOjpzdHJpbmcgZHluYW1pY19kYXRhOworICAgIHsKKyAgICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gcmF3X291dHB1dCgmZHluYW1pY19kYXRhKTsKKyAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOworICAgICAgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCptZXNzYWdlLCBzaXplLCAmb3V0cHV0KTsKKyAgICAgIEFTU0VSVF9GQUxTRShvdXRwdXQuSGFkRXJyb3IoKSk7CisgICAgfQorICAgIEVYUEVDVF9UUlVFKGV4cGVjdGVkID09IGR5bmFtaWNfZGF0YSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG8+CisgIHZvaWQgVGVzdFBhcnNpbmcoUHJvdG8qIG1lc3NhZ2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21wYXRpYmxlX2RhdGEpIHsKKyAgICBtZXNzYWdlLT5DbGVhcigpOworICAgIG1lc3NhZ2UtPlBhcnNlRnJvbVN0cmluZyhjb21wYXRpYmxlX2RhdGEpOworICAgIEV4cGVjdFByb3RvM1ByaW1pdGl2ZVJlcGVhdGVkRmllbGRzU2V0KCptZXNzYWdlKTsKKworICAgIG1lc3NhZ2UtPkNsZWFyKCk7CisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGNvbXBhdGlibGVfZGF0YS5kYXRhKCkpLAorICAgICAgICBjb21wYXRpYmxlX2RhdGEuc2l6ZSgpKTsKKyAgICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsIG1lc3NhZ2UpOworICAgIEV4cGVjdFByb3RvM1ByaW1pdGl2ZVJlcGVhdGVkRmllbGRzU2V0KCptZXNzYWdlKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhY2tlZFRlc3RBbGxUeXBlc187CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhY2tlZFRlc3RVbnBhY2tlZFR5cGVzXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgdW5wYWNrZWRUZXN0QWxsVHlwZXNfOworICBjb25zdCBzdGQ6OnN0cmluZyB1bnBhY2tlZFRlc3RVbnBhY2tlZFR5cGVzXzsKK307CisKK1RFU1RfRihQcm90bzNQcmltaXRpdmVSZXBlYXRlZFdpcmVGb3JtYXRUZXN0LCBQcm90bzNQcmltaXRpdmVSZXBlYXRlZCkgeworICBQUk9UTzNfQVJFTkFfVU5JVFRFU1Q6OlRlc3RBbGxUeXBlcyBwYWNrZWRfbWVzc2FnZTsKKyAgUFJPVE8zX0FSRU5BX1VOSVRURVNUOjpUZXN0VW5wYWNrZWRUeXBlcyB1bnBhY2tlZF9tZXNzYWdlOworICBUZXN0U2VyaWFsaXphdGlvbigmcGFja2VkX21lc3NhZ2UsIHBhY2tlZFRlc3RBbGxUeXBlc18pOworICBUZXN0UGFyc2luZygmcGFja2VkX21lc3NhZ2UsIHBhY2tlZFRlc3RBbGxUeXBlc18pOworICBUZXN0UGFyc2luZygmcGFja2VkX21lc3NhZ2UsIHVucGFja2VkVGVzdEFsbFR5cGVzXyk7CisgIFRlc3RTZXJpYWxpemF0aW9uKCZ1bnBhY2tlZF9tZXNzYWdlLCB1bnBhY2tlZFRlc3RVbnBhY2tlZFR5cGVzXyk7CisgIFRlc3RQYXJzaW5nKCZ1bnBhY2tlZF9tZXNzYWdlLCBwYWNrZWRUZXN0VW5wYWNrZWRUeXBlc18pOworICBUZXN0UGFyc2luZygmdW5wYWNrZWRfbWVzc2FnZSwgdW5wYWNrZWRUZXN0VW5wYWNrZWRUeXBlc18pOworfQorCitjbGFzcyBXaXJlRm9ybWF0SW52YWxpZElucHV0VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIE1ha2UgYSBzZXJpYWxpemVkIFRlc3RBbGxUeXBlcyBpbiB3aGljaCB0aGUgZmllbGQgb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKKyAgLy8gY29udGFpbnMgZXhhY3RseSB0aGUgZ2l2ZW4gYnl0ZXMsIHdoaWNoIG1heSBiZSBpbnZhbGlkLgorICBzdGQ6OnN0cmluZyBNYWtlSW52YWxpZEVtYmVkZGVkTWVzc2FnZShjb25zdCBjaGFyKiBieXRlcywgaW50IHNpemUpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KKyAgICAgICAgVU5JVFRFU1Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoCisgICAgICAgICAgICAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKTsKKyAgICBHT09HTEVfQ0hFQ0soZmllbGQgIT0gbnVsbHB0cik7CisKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgICB7CisgICAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJnJlc3VsdCk7CisgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKKworICAgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXMoZmllbGQtPm51bWJlcigpLCBzdGQ6OnN0cmluZyhieXRlcywgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLy8gTWFrZSBhIHNlcmlhbGl6ZWQgVGVzdEFsbFR5cGVzIGluIHdoaWNoIHRoZSBmaWVsZCBvcHRpb25hbGdyb3VwCisgIC8vIGNvbnRhaW5zIGV4YWN0bHkgdGhlIGdpdmVuIGJ5dGVzIC0tIHdoaWNoIG1heSBiZSBpbnZhbGlkIC0tIGFuZAorICAvLyBwb3NzaWJseSBubyBlbmQgdGFnLgorICBzdGQ6OnN0cmluZyBNYWtlSW52YWxpZEdyb3VwKGNvbnN0IGNoYXIqIGJ5dGVzLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfZW5kX3RhZykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPQorICAgICAgICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxncm91cCIpOworICAgIEdPT0dMRV9DSEVDSyhmaWVsZCAhPSBudWxscHRyKTsKKworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIHsKKyAgICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gcmF3X291dHB1dCgmcmVzdWx0KTsKKyAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOworCisgICAgICBvdXRwdXQuV3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0OjpNYWtlVGFnKGZpZWxkKSk7CisgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoc3RkOjpzdHJpbmcoYnl0ZXMsIHNpemUpKTsKKyAgICAgIGlmIChpbmNsdWRlX2VuZF90YWcpIHsKKyAgICAgICAgb3V0cHV0LldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoCisgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9OworCitURVNUX0YoV2lyZUZvcm1hdEludmFsaWRJbnB1dFRlc3QsIEludmFsaWRTdWJNZXNzYWdlKSB7CisgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICAvLyBDb250cm9sIGNhc2UuCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkRW1iZWRkZWRNZXNzYWdlKCIiLCAwKSkpOworCisgIC8vIFRoZSBieXRlIGlzIGEgdmFsaWQgdmFyaW50LCBidXQgbm90IGEgdmFsaWQgdGFnICh6ZXJvKS4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkRW1iZWRkZWRNZXNzYWdlKCJcMCIsIDEpKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYSBtYWxmb3JtZWQgdmFyaW50LgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRFbWJlZGRlZE1lc3NhZ2UoIlwyMDAiLCAxKSkpOworCisgIC8vIFRoZSBieXRlIGlzIGFuIGVuZGdyb3VwIHRhZywgYnV0IHdlIGFyZW4ndCBwYXJzaW5nIGEgZ3JvdXAuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEVtYmVkZGVkTWVzc2FnZSgiXDAxNCIsIDEpKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYSB2YWxpZCB2YXJpbnQgYnV0IG5vdCBhIHZhbGlkIHRhZyAoYmFkIHdpcmUgdHlwZSkuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEVtYmVkZGVkTWVzc2FnZSgiXDAxNyIsIDEpKSk7Cit9CisKK1RFU1RfRihXaXJlRm9ybWF0SW52YWxpZElucHV0VGVzdCwgSW52YWxpZE1lc3NhZ2VXaXRoRXh0cmFaZXJvKSB7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIHsKKyAgICAvLyBTZXJpYWxpemUgYSB2YWxpZCBwcm90bworICAgIFVOSVRURVNUOjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgICBtZXNzYWdlLnNldF9vcHRpb25hbF9pbnQzMigxKTsKKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgICBkYXRhLnB1c2hfYmFjaygwKTsgIC8vIEFwcGVuZCBpbnZhbGlkIHplcm8gdGFnCisgIH0KKworICAvLyBDb250cm9sIGNhc2UuCisgIHsKKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBhaXMoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpcygmYWlzKTsKKyAgICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgICAgLy8gSXQgc2hvdWxkIGZhaWwgYnV0IGN1cnJlbnRseSBwYXNzZXMuCisgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmlzKSk7CisgICAgLy8gUGFyc2luZyBmcm9tIHRoZSBzdHJpbmcgc2hvdWxkIGZhaWwuCisgICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgfQorfQorCitURVNUX0YoV2lyZUZvcm1hdEludmFsaWRJbnB1dFRlc3QsIEludmFsaWRHcm91cCkgeworICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgLy8gQ29udHJvbCBjYXNlLgorICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCIiLCAwLCB0cnVlKSkpOworCisgIC8vIE1pc3NpbmcgZW5kIHRhZy4gIEdyb3VwcyBjYW5ub3QgZW5kIGF0IEVPRi4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIiIsIDAsIGZhbHNlKSkpOworCisgIC8vIFRoZSBieXRlIGlzIGEgdmFsaWQgdmFyaW50LCBidXQgbm90IGEgdmFsaWQgdGFnICh6ZXJvKS4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIlwwIiwgMSwgZmFsc2UpKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYSBtYWxmb3JtZWQgdmFyaW50LgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiXDIwMCIsIDEsIGZhbHNlKSkpOworCisgIC8vIFRoZSBieXRlIGlzIGFuIGVuZGdyb3VwIHRhZywgYnV0IG5vdCB0aGUgcmlnaHQgb25lIGZvciB0aGlzIGdyb3VwLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiXDAxNCIsIDEsIGZhbHNlKSkpOworCisgIC8vIFRoZSBieXRlIGlzIGEgdmFsaWQgdmFyaW50IGJ1dCBub3QgYSB2YWxpZCB0YWcgKGJhZCB3aXJlIHR5cGUpLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiXDAxNyIsIDEsIHRydWUpKSk7Cit9CisKK1RFU1RfRihXaXJlRm9ybWF0SW52YWxpZElucHV0VGVzdCwgSW52YWxpZFVua25vd25Hcm91cCkgeworICAvLyBVc2UgVGVzdEVtcHR5TWVzc2FnZSBzbyB0aGF0IHRoZSBncm91cCBtYWRlIGJ5IE1ha2VJbnZhbGlkR3JvdXAgd2lsbCBub3QKKyAgLy8gYmUgYSBrbm93biB0YWcgbnVtYmVyLgorICBVTklUVEVTVDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlOworCisgIC8vIENvbnRyb2wgY2FzZS4KKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiIiwgMCwgdHJ1ZSkpKTsKKworICAvLyBNaXNzaW5nIGVuZCB0YWcuICBHcm91cHMgY2Fubm90IGVuZCBhdCBFT0YuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCIiLCAwLCBmYWxzZSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhIHZhbGlkIHZhcmludCwgYnV0IG5vdCBhIHZhbGlkIHRhZyAoemVybykuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCJcMCIsIDEsIGZhbHNlKSkpOworCisgIC8vIFRoZSBieXRlIGlzIGEgbWFsZm9ybWVkIHZhcmludC4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIlwyMDAiLCAxLCBmYWxzZSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhbiBlbmRncm91cCB0YWcsIGJ1dCBub3QgdGhlIHJpZ2h0IG9uZSBmb3IgdGhpcyBncm91cC4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIlwwMTQiLCAxLCBmYWxzZSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhIHZhbGlkIHZhcmludCBidXQgbm90IGEgdmFsaWQgdGFnIChiYWQgd2lyZSB0eXBlKS4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIlwwMTciLCAxLCB0cnVlKSkpOworfQorCitURVNUX0YoV2lyZUZvcm1hdEludmFsaWRJbnB1dFRlc3QsIEludmFsaWRTdHJpbmdJblVua25vd25Hcm91cCkgeworICAvLyBUZXN0IGEgYnVnIGZpeDogIFNraXBNZXNzYWdlIHNob3VsZCBmYWlsIGlmIHRoZSBtZXNzYWdlIGNvbnRhaW5zIGEKKyAgLy8gc3RyaW5nIHdob3NlIGxlbmd0aCB3b3VsZCBleHRlbmQgYmV5b25kIHRoZSBtZXNzYWdlIGVuZC4KKworICBVTklUVEVTVDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3N0cmluZygiZm9vIGZvbyBmb28gZm9vIik7CisgIHN0ZDo6c3RyaW5nIGRhdGE7CisgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIC8vIENob3Agc29tZSBieXRlcyBvZmYgdGhlIGVuZC4KKyAgZGF0YS5yZXNpemUoZGF0YS5zaXplKCkgLSA0KTsKKworICAvLyBUcnkgdG8gc2tpcCBpdC4gIE5vdGUgdGhhdCB0aGUgYnVnIHdhcyBvbmx5IHByZXNlbnQgd2hlbiBwYXJzaW5nIHRvIGFuCisgIC8vIFVua25vd25GaWVsZFNldC4KKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZyYXdfaW5wdXQpOworICBVbmtub3duRmllbGRTZXQgdW5rbm93bl9maWVsZHM7CisgIEVYUEVDVF9GQUxTRShXaXJlRm9ybWF0OjpTa2lwTWVzc2FnZSgmY29kZWRfaW5wdXQsICZ1bmtub3duX2ZpZWxkcykpOworfQorCisvLyBUZXN0IGRpZmZlcmVuY2VzIGJldHdlZW4gc3RyaW5nIGFuZCBieXRlcy4KKy8vIFZhbHVlIG9mIGEgc3RyaW5nIHR5cGUgbXVzdCBiZSB2YWxpZCBVVEYtOCBzdHJpbmcuICBXaGVuIFVURi04CisvLyB2YWxpZGF0aW9uIGlzIGVuYWJsZWQgKEdPT0dMRV9QUk9UT0JVRl9VVEY4X1ZBTElEQVRJT05fRU5BQkxFRCk6CisvLyBXcml0ZUludmFsaWRVVEY4U3RyaW5nOiAgc2VlIGVycm9yIG1lc3NhZ2UuCisvLyBSZWFkSW52YWxpZFVURjhTdHJpbmc6ICBzZWUgZXJyb3IgbWVzc2FnZS4KKy8vIFdyaXRlVmFsaWRVVEY4U3RyaW5nOiBmaW5lLgorLy8gUmVhZFZhbGlkVVRGOFN0cmluZzogIGZpbmUuCisvLyBXcml0ZUFueUJ5dGVzOiBmaW5lLgorLy8gUmVhZEFueUJ5dGVzOiBmaW5lLgorY29uc3QgY2hhcioga0ludmFsaWRVVEY4U3RyaW5nID0gIkludmFsaWQgVVRGLTg6IFx4QTBceEIwXHhDMFx4RDAiOworLy8gVGhpcyB1c2VkIHRvIGJlICJWYWxpZCBVVEYtODogXHgwMVx4MDJcdThDMzdcdTZCNEMiLCBidXQgTVNWQyBzZWVtcyB0bworLy8gaW50ZXJwcmV0IFx1IGRpZmZlcmVudGx5IGZyb20gR0NDLgorY29uc3QgY2hhcioga1ZhbGlkVVRGOFN0cmluZyA9ICJWYWxpZCBVVEYtODogXHgwMVx4MDJcMzUwXDI2MFwyNjdcMzQ2XDI1NVwyMTQiOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgV3JpdGVNZXNzYWdlKGNvbnN0IGNoYXIqIHZhbHVlLCBUKiBtZXNzYWdlLCBzdGQ6OnN0cmluZyogd2lyZV9idWZmZXIpIHsKKyAgbWVzc2FnZS0+c2V0X2RhdGEodmFsdWUpOworICB3aXJlX2J1ZmZlci0+Y2xlYXIoKTsKKyAgbWVzc2FnZS0+QXBwZW5kVG9TdHJpbmcod2lyZV9idWZmZXIpOworICByZXR1cm4gKHdpcmVfYnVmZmVyLT5zaXplKCkgPiAwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIFJlYWRNZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiB3aXJlX2J1ZmZlciwgVCogbWVzc2FnZSkgeworICByZXR1cm4gbWVzc2FnZS0+UGFyc2VGcm9tQXJyYXkod2lyZV9idWZmZXIuZGF0YSgpLCB3aXJlX2J1ZmZlci5zaXplKCkpOworfQorCitjbGFzcyBVdGY4VmFsaWRhdGlvblRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFV0ZjhWYWxpZGF0aW9uVGVzdCgpIHt9CisgIH5VdGY4VmFsaWRhdGlvblRlc3QoKSBvdmVycmlkZSB7fQorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICB9CisKK307CisKK1RFU1RfRihVdGY4VmFsaWRhdGlvblRlc3QsIFdyaXRlSW52YWxpZFVURjhTdHJpbmcpIHsKKyAgc3RkOjpzdHJpbmcgd2lyZV9idWZmZXI7CisgIFVOSVRURVNUOjpPbmVTdHJpbmcgaW5wdXQ7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlcnJvcnM7CisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIFdyaXRlTWVzc2FnZShrSW52YWxpZFVURjhTdHJpbmcsICZpbnB1dCwgJndpcmVfYnVmZmVyKTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECisgIEVYUEVDVF9USEFUKGVycm9ycywKKyAgICAgICAgICAgICAgdGVzdGluZzo6RWxlbWVudHNBcmUoCisgICAgICAgICAgICAgICAgICAiU3RyaW5nIGZpZWxkICciICsgc3RkOjpzdHJpbmcoVU5JVFRFU1RfUEFDS0FHRV9OQU1FKSArCisgICAgICAgICAgICAgICAgICAiLk9uZVN0cmluZy5kYXRhJyAiCisgICAgICAgICAgICAgICAgICAiY29udGFpbnMgaW52YWxpZCBVVEYtOCBkYXRhIHdoZW4gIgorICAgICAgICAgICAgICAgICAgInNlcmlhbGl6aW5nIGEgcHJvdG9jb2wgYnVmZmVyLiBVc2UgdGhlICIKKyAgICAgICAgICAgICAgICAgICInYnl0ZXMnIHR5cGUgaWYgeW91IGludGVuZCB0byBzZW5kIHJhdyBieXRlcy4gIikpOworI2Vsc2UKKyAgQVNTRVJUX0VRKDAsIGVycm9ycy5zaXplKCkpOworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKK30KKworCitURVNUX0YoVXRmOFZhbGlkYXRpb25UZXN0LCBSZWFkSW52YWxpZFVURjhTdHJpbmcpIHsKKyAgc3RkOjpzdHJpbmcgd2lyZV9idWZmZXI7CisgIFVOSVRURVNUOjpPbmVTdHJpbmcgaW5wdXQ7CisgIFdyaXRlTWVzc2FnZShrSW52YWxpZFVURjhTdHJpbmcsICZpbnB1dCwgJndpcmVfYnVmZmVyKTsKKyAgVU5JVFRFU1Q6Ok9uZVN0cmluZyBvdXRwdXQ7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlcnJvcnM7CisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIFJlYWRNZXNzYWdlKHdpcmVfYnVmZmVyLCAmb3V0cHV0KTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECisgIEVYUEVDVF9USEFUKGVycm9ycywKKyAgICAgICAgICAgICAgdGVzdGluZzo6RWxlbWVudHNBcmUoCisgICAgICAgICAgICAgICAgICAiU3RyaW5nIGZpZWxkICciICsgc3RkOjpzdHJpbmcoVU5JVFRFU1RfUEFDS0FHRV9OQU1FKSArCisgICAgICAgICAgICAgICAgICAiLk9uZVN0cmluZy5kYXRhJyAiCisgICAgICAgICAgICAgICAgICAiY29udGFpbnMgaW52YWxpZCBVVEYtOCBkYXRhIHdoZW4gIgorICAgICAgICAgICAgICAgICAgInBhcnNpbmcgYSBwcm90b2NvbCBidWZmZXIuIFVzZSB0aGUgIgorICAgICAgICAgICAgICAgICAgIidieXRlcycgdHlwZSBpZiB5b3UgaW50ZW5kIHRvIHNlbmQgcmF3IGJ5dGVzLiAiKSk7CisKKyNlbHNlCisgIEFTU0VSVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECit9CisKKworVEVTVF9GKFV0ZjhWYWxpZGF0aW9uVGVzdCwgV3JpdGVWYWxpZFVURjhTdHJpbmcpIHsKKyAgc3RkOjpzdHJpbmcgd2lyZV9idWZmZXI7CisgIFVOSVRURVNUOjpPbmVTdHJpbmcgaW5wdXQ7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlcnJvcnM7CisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIFdyaXRlTWVzc2FnZShrVmFsaWRVVEY4U3RyaW5nLCAmaW5wdXQsICZ3aXJlX2J1ZmZlcik7CisgICAgZXJyb3JzID0gbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKKyAgfQorICBBU1NFUlRfRVEoMCwgZXJyb3JzLnNpemUoKSk7Cit9CisKK1RFU1RfRihVdGY4VmFsaWRhdGlvblRlc3QsIFJlYWRWYWxpZFVURjhTdHJpbmcpIHsKKyAgc3RkOjpzdHJpbmcgd2lyZV9idWZmZXI7CisgIFVOSVRURVNUOjpPbmVTdHJpbmcgaW5wdXQ7CisgIFdyaXRlTWVzc2FnZShrVmFsaWRVVEY4U3RyaW5nLCAmaW5wdXQsICZ3aXJlX2J1ZmZlcik7CisgIFVOSVRURVNUOjpPbmVTdHJpbmcgb3V0cHV0OworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXJyb3JzOworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKKyAgICBSZWFkTWVzc2FnZSh3aXJlX2J1ZmZlciwgJm91dHB1dCk7CisgICAgZXJyb3JzID0gbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKKyAgfQorICBBU1NFUlRfRVEoMCwgZXJyb3JzLnNpemUoKSk7CisgIEVYUEVDVF9FUShpbnB1dC5kYXRhKCksIG91dHB1dC5kYXRhKCkpOworfQorCisvLyBCeXRlczogYW55dGhpbmcgY2FuIHBhc3MgYXMgYnl0ZXMsIHVzZSBpbnZhbGlkIFVURi04IHN0cmluZyB0byB0ZXN0CitURVNUX0YoVXRmOFZhbGlkYXRpb25UZXN0LCBXcml0ZUFyYml0cmFyeUJ5dGVzKSB7CisgIHN0ZDo6c3RyaW5nIHdpcmVfYnVmZmVyOworICBVTklUVEVTVDo6T25lQnl0ZXMgaW5wdXQ7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlcnJvcnM7CisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIFdyaXRlTWVzc2FnZShrSW52YWxpZFVURjhTdHJpbmcsICZpbnB1dCwgJndpcmVfYnVmZmVyKTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisgIEFTU0VSVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKK30KKworVEVTVF9GKFV0ZjhWYWxpZGF0aW9uVGVzdCwgUmVhZEFyYml0cmFyeUJ5dGVzKSB7CisgIHN0ZDo6c3RyaW5nIHdpcmVfYnVmZmVyOworICBVTklUVEVTVDo6T25lQnl0ZXMgaW5wdXQ7CisgIFdyaXRlTWVzc2FnZShrSW52YWxpZFVURjhTdHJpbmcsICZpbnB1dCwgJndpcmVfYnVmZmVyKTsKKyAgVU5JVFRFU1Q6Ok9uZUJ5dGVzIG91dHB1dDsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVycm9yczsKKyAgeworICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7CisgICAgUmVhZE1lc3NhZ2Uod2lyZV9idWZmZXIsICZvdXRwdXQpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKyAgQVNTRVJUX0VRKDAsIGVycm9ycy5zaXplKCkpOworICBFWFBFQ1RfRVEoaW5wdXQuZGF0YSgpLCBvdXRwdXQuZGF0YSgpKTsKK30KKworVEVTVF9GKFV0ZjhWYWxpZGF0aW9uVGVzdCwgUGFyc2VSZXBlYXRlZFN0cmluZykgeworICBVTklUVEVTVDo6TW9yZUJ5dGVzIGlucHV0OworICBpbnB1dC5hZGRfZGF0YShrVmFsaWRVVEY4U3RyaW5nKTsKKyAgaW5wdXQuYWRkX2RhdGEoa0ludmFsaWRVVEY4U3RyaW5nKTsKKyAgaW5wdXQuYWRkX2RhdGEoa0ludmFsaWRVVEY4U3RyaW5nKTsKKyAgc3RkOjpzdHJpbmcgd2lyZV9idWZmZXIgPSBpbnB1dC5TZXJpYWxpemVBc1N0cmluZygpOworCisgIFVOSVRURVNUOjpNb3JlU3RyaW5nIG91dHB1dDsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVycm9yczsKKyAgeworICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7CisgICAgUmVhZE1lc3NhZ2Uod2lyZV9idWZmZXIsICZvdXRwdXQpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKKyAgQVNTRVJUX0VRKDIsIGVycm9ycy5zaXplKCkpOworI2Vsc2UKKyAgQVNTRVJUX0VRKDAsIGVycm9ycy5zaXplKCkpOworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKKyAgRVhQRUNUX0VRKHdpcmVfYnVmZmVyLCBvdXRwdXQuU2VyaWFsaXplQXNTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3QgdGhlIG9sZCBWZXJpZnlVVEY4U3RyaW5nKCkgZnVuY3Rpb24sIHdoaWNoIG1heSBzdGlsbCBiZSBjYWxsZWQgYnkgb2xkCisvLyBnZW5lcmF0ZWQgY29kZS4KK1RFU1RfRihVdGY4VmFsaWRhdGlvblRlc3QsIE9sZFZlcmlmeVVURjhTdHJpbmcpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YShrSW52YWxpZFVURjhTdHJpbmcpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlcnJvcnM7CisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIFdpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECisgIEFTU0VSVF9FUSgxLCBlcnJvcnMuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBIYXNQcmVmaXhTdHJpbmcoZXJyb3JzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIGZpZWxkIGNvbnRhaW5zIGludmFsaWQgVVRGLTggZGF0YSB3aGVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgInNlcmlhbGl6aW5nIGEgcHJvdG9jb2wgYnVmZmVyLiBVc2UgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIidieXRlcycgdHlwZSBpZiB5b3UgaW50ZW5kIHRvIHNlbmQgcmF3IGJ5dGVzLiIpKTsKKyNlbHNlCisgIEFTU0VSVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKKyNlbmRpZgorfQorCisKK1RFU1QoUmVwZWF0ZWRWYXJpbnQsIEludDMyKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50MzJfdD4gdjsKKworICAvLyBJbnNlcnQgLTJebiwgMl5uIGFuZCAyXm4tMS4KKyAgZm9yIChpbnQgbiA9IDA7IG4gPCAxMDsgbisrKSB7CisgICAgdi5BZGQoLSgxIDw8IG4pKTsKKyAgICB2LkFkZCgxIDw8IG4pOworICAgIHYuQWRkKCgxIDw8IG4pIC0gMSk7CisgIH0KKworICAvLyBDaGVjayBjb25zaXN0ZW5jeSB3aXRoIHRoZSBzY2FsYXIgSW50MzJTaXplLgorICBzaXplX3QgZXhwZWN0ZWQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHYuc2l6ZSgpOyBpKyspIHsKKyAgICBleHBlY3RlZCArPSBXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKHZbaV0pOworICB9CisKKyAgRVhQRUNUX0VRKGV4cGVjdGVkLCBXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKHYpKTsKK30KKworVEVTVChSZXBlYXRlZFZhcmludCwgSW50NjQpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ2NF90PiB2OworCisgIC8vIEluc2VydCAtMl5uLCAyXm4gYW5kIDJebi0xLgorICBmb3IgKGludCBuID0gMDsgbiA8IDEwOyBuKyspIHsKKyAgICB2LkFkZCgtKDEgPDwgbikpOworICAgIHYuQWRkKDEgPDwgbik7CisgICAgdi5BZGQoKDEgPDwgbikgLSAxKTsKKyAgfQorCisgIC8vIENoZWNrIGNvbnNpc3RlbmN5IHdpdGggdGhlIHNjYWxhciBJbnQ2NFNpemUuCisgIHNpemVfdCBleHBlY3RlZCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5zaXplKCk7IGkrKykgeworICAgIGV4cGVjdGVkICs9IFdpcmVGb3JtYXRMaXRlOjpJbnQ2NFNpemUodltpXSk7CisgIH0KKworICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIFdpcmVGb3JtYXRMaXRlOjpJbnQ2NFNpemUodikpOworfQorCitURVNUKFJlcGVhdGVkVmFyaW50LCBTSW50MzIpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQzMl90PiB2OworCisgIC8vIEluc2VydCAtMl5uLCAyXm4gYW5kIDJebi0xLgorICBmb3IgKGludCBuID0gMDsgbiA8IDEwOyBuKyspIHsKKyAgICB2LkFkZCgtKDEgPDwgbikpOworICAgIHYuQWRkKDEgPDwgbik7CisgICAgdi5BZGQoKDEgPDwgbikgLSAxKTsKKyAgfQorCisgIC8vIENoZWNrIGNvbnNpc3RlbmN5IHdpdGggdGhlIHNjYWxhciBTSW50MzJTaXplLgorICBzaXplX3QgZXhwZWN0ZWQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHYuc2l6ZSgpOyBpKyspIHsKKyAgICBleHBlY3RlZCArPSBXaXJlRm9ybWF0TGl0ZTo6U0ludDMyU2l6ZSh2W2ldKTsKKyAgfQorCisgIEVYUEVDVF9FUShleHBlY3RlZCwgV2lyZUZvcm1hdExpdGU6OlNJbnQzMlNpemUodikpOworfQorCitURVNUKFJlcGVhdGVkVmFyaW50LCBTSW50NjQpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ2NF90PiB2OworCisgIC8vIEluc2VydCAtMl5uLCAyXm4gYW5kIDJebi0xLgorICBmb3IgKGludCBuID0gMDsgbiA8IDEwOyBuKyspIHsKKyAgICB2LkFkZCgtKDEgPDwgbikpOworICAgIHYuQWRkKDEgPDwgbik7CisgICAgdi5BZGQoKDEgPDwgbikgLSAxKTsKKyAgfQorCisgIC8vIENoZWNrIGNvbnNpc3RlbmN5IHdpdGggdGhlIHNjYWxhciBTSW50NjRTaXplLgorICBzaXplX3QgZXhwZWN0ZWQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHYuc2l6ZSgpOyBpKyspIHsKKyAgICBleHBlY3RlZCArPSBXaXJlRm9ybWF0TGl0ZTo6U0ludDY0U2l6ZSh2W2ldKTsKKyAgfQorCisgIEVYUEVDVF9FUShleHBlY3RlZCwgV2lyZUZvcm1hdExpdGU6OlNJbnQ2NFNpemUodikpOworfQorCitURVNUKFJlcGVhdGVkVmFyaW50LCBVSW50MzIpIHsKKyAgUmVwZWF0ZWRGaWVsZDx1aW50MzJfdD4gdjsKKworICAvLyBJbnNlcnQgMl5uIGFuZCAyXm4tMS4KKyAgZm9yIChpbnQgbiA9IDA7IG4gPCAxMDsgbisrKSB7CisgICAgdi5BZGQoMSA8PCBuKTsKKyAgICB2LkFkZCgoMSA8PCBuKSAtIDEpOworICB9CisKKyAgLy8gQ2hlY2sgY29uc2lzdGVuY3kgd2l0aCB0aGUgc2NhbGFyIFVJbnQzMlNpemUuCisgIHNpemVfdCBleHBlY3RlZCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5zaXplKCk7IGkrKykgeworICAgIGV4cGVjdGVkICs9IFdpcmVGb3JtYXRMaXRlOjpVSW50MzJTaXplKHZbaV0pOworICB9CisKKyAgRVhQRUNUX0VRKGV4cGVjdGVkLCBXaXJlRm9ybWF0TGl0ZTo6VUludDMyU2l6ZSh2KSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRWYXJpbnQsIFVJbnQ2NCkgeworICBSZXBlYXRlZEZpZWxkPHVpbnQ2NF90PiB2OworCisgIC8vIEluc2VydCAyXm4gYW5kIDJebi0xLgorICBmb3IgKGludCBuID0gMDsgbiA8IDEwOyBuKyspIHsKKyAgICB2LkFkZCgxIDw8IG4pOworICAgIHYuQWRkKCgxIDw8IG4pIC0gMSk7CisgIH0KKworICAvLyBDaGVjayBjb25zaXN0ZW5jeSB3aXRoIHRoZSBzY2FsYXIgVUludDY0U2l6ZS4KKyAgc2l6ZV90IGV4cGVjdGVkID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgaSsrKSB7CisgICAgZXhwZWN0ZWQgKz0gV2lyZUZvcm1hdExpdGU6OlVJbnQ2NFNpemUodltpXSk7CisgIH0KKworICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIFdpcmVGb3JtYXRMaXRlOjpVSW50NjRTaXplKHYpKTsKK30KKworVEVTVChSZXBlYXRlZFZhcmludCwgRW51bSkgeworICBSZXBlYXRlZEZpZWxkPGludD4gdjsKKworICAvLyBJbnNlcnQgMl5uIGFuZCAyXm4tMS4KKyAgZm9yIChpbnQgbiA9IDA7IG4gPCAxMDsgbisrKSB7CisgICAgdi5BZGQoMSA8PCBuKTsKKyAgICB2LkFkZCgoMSA8PCBuKSAtIDEpOworICB9CisKKyAgLy8gQ2hlY2sgY29uc2lzdGVuY3kgd2l0aCB0aGUgc2NhbGFyIEVudW1TaXplLgorICBzaXplX3QgZXhwZWN0ZWQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHYuc2l6ZSgpOyBpKyspIHsKKyAgICBleHBlY3RlZCArPSBXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodltpXSk7CisgIH0KKworICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIFdpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh2KSk7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wYi5jYyBiL3NyYy9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucGIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiYTYwYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucGIuY2MKQEAgLTAsMCArMSwxOTc5IEBACisvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wYi5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKworUFJPVE9CVUZfUFJBR01BX0lOSVRfU0VHCisKK25hbWVzcGFjZSBfcGIgPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDsKK25hbWVzcGFjZSBfcGJpID0gX3BiOjppbnRlcm5hbDsKKworUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK1BST1RPQlVGX0NPTlNURVhQUiBEb3VibGVWYWx1ZTo6RG91YmxlVmFsdWUoCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLnZhbHVlXykqLzAKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319IHt9CitzdHJ1Y3QgRG91YmxlVmFsdWVEZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIERvdWJsZVZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgfkRvdWJsZVZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBEb3VibGVWYWx1ZSBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBEb3VibGVWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwgX0RvdWJsZVZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIEZsb2F0VmFsdWU6OkZsb2F0VmFsdWUoCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLnZhbHVlXykqLzAKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319IHt9CitzdHJ1Y3QgRmxvYXRWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwgeworICBQUk9UT0JVRl9DT05TVEVYUFIgRmxvYXRWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5GbG9hdFZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBGbG9hdFZhbHVlIF9pbnN0YW5jZTsKKyAgfTsKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIEZsb2F0VmFsdWVEZWZhdWx0VHlwZUludGVybmFsIF9GbG9hdFZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIEludDY0VmFsdWU6OkludDY0VmFsdWUoCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLnZhbHVlXykqL2ludDY0X3R7MH0KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319IHt9CitzdHJ1Y3QgSW50NjRWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwgeworICBQUk9UT0JVRl9DT05TVEVYUFIgSW50NjRWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5JbnQ2NFZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBJbnQ2NFZhbHVlIF9pbnN0YW5jZTsKKyAgfTsKK307CitQUk9UT0JVRl9BVFRSSUJVVEVfTk9fREVTVFJPWSBQUk9UT0JVRl9DT05TVElOSVQgUFJPVE9CVUZfQVRUUklCVVRFX0lOSVRfUFJJT1JJVFkxIEludDY0VmFsdWVEZWZhdWx0VHlwZUludGVybmFsIF9JbnQ2NFZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIFVJbnQ2NFZhbHVlOjpVSW50NjRWYWx1ZSgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8udmFsdWVfKSovdWludDY0X3R7MHV9CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fSB7fQorc3RydWN0IFVJbnQ2NFZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBVSW50NjRWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5VSW50NjRWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgVUludDY0VmFsdWUgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgVUludDY0VmFsdWVEZWZhdWx0VHlwZUludGVybmFsIF9VSW50NjRWYWx1ZV9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBJbnQzMlZhbHVlOjpJbnQzMlZhbHVlKAorICAgIDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZCk6IF9pbXBsX3sKKyAgICAvKmRlY2x0eXBlKF9pbXBsXy52YWx1ZV8pKi8wCisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fSB7fQorc3RydWN0IEludDMyVmFsdWVEZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIEludDMyVmFsdWVEZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+SW50MzJWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgSW50MzJWYWx1ZSBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBJbnQzMlZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCBfSW50MzJWYWx1ZV9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBVSW50MzJWYWx1ZTo6VUludDMyVmFsdWUoCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLnZhbHVlXykqLzB1CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fSB7fQorc3RydWN0IFVJbnQzMlZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBVSW50MzJWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwoKQorICAgICAgOiBfaW5zdGFuY2UoOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke30pIHt9CisgIH5VSW50MzJWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgVUludDMyVmFsdWUgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgVUludDMyVmFsdWVEZWZhdWx0VHlwZUludGVybmFsIF9VSW50MzJWYWx1ZV9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX0NPTlNURVhQUiBCb29sVmFsdWU6OkJvb2xWYWx1ZSgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8udmFsdWVfKSovZmFsc2UKKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319IHt9CitzdHJ1Y3QgQm9vbFZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCB7CisgIFBST1RPQlVGX0NPTlNURVhQUiBCb29sVmFsdWVEZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+Qm9vbFZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBCb29sVmFsdWUgX2luc3RhbmNlOworICB9OworfTsKK1BST1RPQlVGX0FUVFJJQlVURV9OT19ERVNUUk9ZIFBST1RPQlVGX0NPTlNUSU5JVCBQUk9UT0JVRl9BVFRSSUJVVEVfSU5JVF9QUklPUklUWTEgQm9vbFZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCBfQm9vbFZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIFN0cmluZ1ZhbHVlOjpTdHJpbmdWYWx1ZSgKKyAgICA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOiBfaW1wbF97CisgICAgLypkZWNsdHlwZShfaW1wbF8udmFsdWVfKSoveyY6Ol9wYmk6OmZpeGVkX2FkZHJlc3NfZW1wdHlfc3RyaW5nLCA6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fX0KKyAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319IHt9CitzdHJ1Y3QgU3RyaW5nVmFsdWVEZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIFN0cmluZ1ZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCgpCisgICAgICA6IF9pbnN0YW5jZSg6Ol9wYmk6OkNvbnN0YW50SW5pdGlhbGl6ZWR7fSkge30KKyAgflN0cmluZ1ZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCgpIHt9CisgIHVuaW9uIHsKKyAgICBTdHJpbmdWYWx1ZSBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBTdHJpbmdWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwgX1N0cmluZ1ZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfOworUFJPVE9CVUZfQ09OU1RFWFBSIEJ5dGVzVmFsdWU6OkJ5dGVzVmFsdWUoCisgICAgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVkKTogX2ltcGxfeworICAgIC8qZGVjbHR5cGUoX2ltcGxfLnZhbHVlXykqL3smOjpfcGJpOjpmaXhlZF9hZGRyZXNzX2VtcHR5X3N0cmluZywgOjpfcGJpOjpDb25zdGFudEluaXRpYWxpemVke319CisgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fSB7fQorc3RydWN0IEJ5dGVzVmFsdWVEZWZhdWx0VHlwZUludGVybmFsIHsKKyAgUFJPVE9CVUZfQ09OU1RFWFBSIEJ5dGVzVmFsdWVEZWZhdWx0VHlwZUludGVybmFsKCkKKyAgICAgIDogX2luc3RhbmNlKDo6X3BiaTo6Q29uc3RhbnRJbml0aWFsaXplZHt9KSB7fQorICB+Qnl0ZXNWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwoKSB7fQorICB1bmlvbiB7CisgICAgQnl0ZXNWYWx1ZSBfaW5zdGFuY2U7CisgIH07Cit9OworUFJPVE9CVUZfQVRUUklCVVRFX05PX0RFU1RST1kgUFJPVE9CVUZfQ09OU1RJTklUIFBST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMSBCeXRlc1ZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCBfQnl0ZXNWYWx1ZV9kZWZhdWx0X2luc3RhbmNlXzsKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorc3RhdGljIDo6X3BiOjpNZXRhZGF0YSBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90b1s5XTsKK3N0YXRpYyBjb25zdGV4cHIgOjpfcGI6OkVudW1EZXNjcmlwdG9yIGNvbnN0KiogZmlsZV9sZXZlbF9lbnVtX2Rlc2NyaXB0b3JzX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90byA9IG51bGxwdHI7CitzdGF0aWMgY29uc3RleHByIDo6X3BiOjpTZXJ2aWNlRGVzY3JpcHRvciBjb25zdCoqIGZpbGVfbGV2ZWxfc2VydmljZV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG8gPSBudWxscHRyOworCitjb25zdCB1aW50MzJfdCBUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG86Om9mZnNldHNbXSBQUk9UT0JVRl9TRUNUSU9OX1ZBUklBQkxFKHByb3RvZGVzY19jb2xkKSA9IHsKKyAgfjB1LCAgLy8gbm8gX2hhc19iaXRzXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRvdWJsZVZhbHVlLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgfjB1LCAgLy8gbm8gX2V4dGVuc2lvbnNfCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRvdWJsZVZhbHVlLCBfaW1wbF8udmFsdWVfKSwKKyAgfjB1LCAgLy8gbm8gX2hhc19iaXRzXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZsb2F0VmFsdWUsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmxvYXRWYWx1ZSwgX2ltcGxfLnZhbHVlXyksCisgIH4wdSwgIC8vIG5vIF9oYXNfYml0c18KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpJbnQ2NFZhbHVlLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgfjB1LCAgLy8gbm8gX2V4dGVuc2lvbnNfCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkludDY0VmFsdWUsIF9pbXBsXy52YWx1ZV8pLAorICB+MHUsICAvLyBubyBfaGFzX2JpdHNfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VUludDY0VmFsdWUsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VUludDY0VmFsdWUsIF9pbXBsXy52YWx1ZV8pLAorICB+MHUsICAvLyBubyBfaGFzX2JpdHNfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6SW50MzJWYWx1ZSwgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpJbnQzMlZhbHVlLCBfaW1wbF8udmFsdWVfKSwKKyAgfjB1LCAgLy8gbm8gX2hhc19iaXRzXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVJbnQzMlZhbHVlLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgfjB1LCAgLy8gbm8gX2V4dGVuc2lvbnNfCisgIH4wdSwgIC8vIG5vIF9vbmVvZl9jYXNlXworICB+MHUsICAvLyBubyBfd2Vha19maWVsZF9tYXBfCisgIH4wdSwgIC8vIG5vIF9pbmxpbmVkX3N0cmluZ19kb25hdGVkXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVJbnQzMlZhbHVlLCBfaW1wbF8udmFsdWVfKSwKKyAgfjB1LCAgLy8gbm8gX2hhc19iaXRzXworICBQUk9UT0JVRl9GSUVMRF9PRkZTRVQoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkJvb2xWYWx1ZSwgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpCb29sVmFsdWUsIF9pbXBsXy52YWx1ZV8pLAorICB+MHUsICAvLyBubyBfaGFzX2JpdHNfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nVmFsdWUsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICB+MHUsICAvLyBubyBfZXh0ZW5zaW9uc18KKyAgfjB1LCAgLy8gbm8gX29uZW9mX2Nhc2VfCisgIH4wdSwgIC8vIG5vIF93ZWFrX2ZpZWxkX21hcF8KKyAgfjB1LCAgLy8gbm8gX2lubGluZWRfc3RyaW5nX2RvbmF0ZWRfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nVmFsdWUsIF9pbXBsXy52YWx1ZV8pLAorICB+MHUsICAvLyBubyBfaGFzX2JpdHNfCisgIFBST1RPQlVGX0ZJRUxEX09GRlNFVCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Qnl0ZXNWYWx1ZSwgX2ludGVybmFsX21ldGFkYXRhXyksCisgIH4wdSwgIC8vIG5vIF9leHRlbnNpb25zXworICB+MHUsICAvLyBubyBfb25lb2ZfY2FzZV8KKyAgfjB1LCAgLy8gbm8gX3dlYWtfZmllbGRfbWFwXworICB+MHUsICAvLyBubyBfaW5saW5lZF9zdHJpbmdfZG9uYXRlZF8KKyAgUFJPVE9CVUZfRklFTERfT0ZGU0VUKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpCeXRlc1ZhbHVlLCBfaW1wbF8udmFsdWVfKSwKK307CitzdGF0aWMgY29uc3QgOjpfcGJpOjpNaWdyYXRpb25TY2hlbWEgc2NoZW1hc1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0geworICB7IDAsIC0xLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEb3VibGVWYWx1ZSl9LAorICB7IDcsIC0xLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGbG9hdFZhbHVlKX0sCisgIHsgMTQsIC0xLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpJbnQ2NFZhbHVlKX0sCisgIHsgMjEsIC0xLCAtMSwgc2l6ZW9mKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVSW50NjRWYWx1ZSl9LAorICB7IDI4LCAtMSwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6SW50MzJWYWx1ZSl9LAorICB7IDM1LCAtMSwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VUludDMyVmFsdWUpfSwKKyAgeyA0MiwgLTEsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkJvb2xWYWx1ZSl9LAorICB7IDQ5LCAtMSwgLTEsIHNpemVvZig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nVmFsdWUpfSwKKyAgeyA1NiwgLTEsIC0xLCBzaXplb2YoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkJ5dGVzVmFsdWUpfSwKK307CisKK3N0YXRpYyBjb25zdCA6Ol9wYjo6TWVzc2FnZSogY29uc3QgZmlsZV9kZWZhdWx0X2luc3RhbmNlc1tdID0geworICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9Eb3VibGVWYWx1ZV9kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X0Zsb2F0VmFsdWVfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9JbnQ2NFZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfVUludDY0VmFsdWVfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9JbnQzMlZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfLl9pbnN0YW5jZSwKKyAgJjo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpfVUludDMyVmFsdWVfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9Cb29sVmFsdWVfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorICAmOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ol9TdHJpbmdWYWx1ZV9kZWZhdWx0X2luc3RhbmNlXy5faW5zdGFuY2UsCisgICY6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6X0J5dGVzVmFsdWVfZGVmYXVsdF9pbnN0YW5jZV8uX2luc3RhbmNlLAorfTsKKworY29uc3QgY2hhciBkZXNjcmlwdG9yX3RhYmxlX3Byb3RvZGVmX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90b1tdIFBST1RPQlVGX1NFQ1RJT05fVkFSSUFCTEUocHJvdG9kZXNjX2NvbGQpID0KKyAgIlxuXDAzNmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90b1wwMjJcMDE3Z29vZ2xlIgorICAiLnByb3RvYnVmXCJcMDM0XG5cMDEzRG91YmxlVmFsdWVcMDIyXHJcblwwMDV2YWx1ZVwwMzBcMDAxIFwwMDEoXDAwMVwiIgorICAiXDAzM1xuXG5GbG9hdFZhbHVlXDAyMlxyXG5cMDA1dmFsdWVcMDMwXDAwMSBcMDAxKFwwMDJcIlwwMzNcblxuSW50NjRWYWwiCisgICJ1ZVwwMjJcclxuXDAwNXZhbHVlXDAzMFwwMDEgXDAwMShcMDAzXCJcMDM0XG5cMDEzVUludDY0VmFsdWVcMDIyXHJcblwwMDV2YWx1IgorICAiZVwwMzBcMDAxIFwwMDEoXDAwNFwiXDAzM1xuXG5JbnQzMlZhbHVlXDAyMlxyXG5cMDA1dmFsdWVcMDMwXDAwMSBcMDAxKFwwMDVcIlwwMzRcblwwMTMiCisgICJVSW50MzJWYWx1ZVwwMjJcclxuXDAwNXZhbHVlXDAzMFwwMDEgXDAwMShcclwiXDAzMlxuXHRCb29sVmFsdWVcMDIyIgorICAiXHJcblwwMDV2YWx1ZVwwMzBcMDAxIFwwMDEoXDAxMFwiXDAzNFxuXDAxM1N0cmluZ1ZhbHVlXDAyMlxyXG5cMDA1dmFsdWVcMDMwXDAwMSIKKyAgIiBcMDAxKFx0XCJcMDMzXG5cbkJ5dGVzVmFsdWVcMDIyXHJcblwwMDV2YWx1ZVwwMzBcMDAxIFwwMDEoXDAxNEJcMjAzXDAwMVxuXDAyM2NvIgorICAibS5nb29nbGUucHJvdG9idWZCXHJXcmFwcGVyc1Byb3RvUFwwMDFaMWdvb2ciCisgICJsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3dyYXBwIgorICAiZXJzcGJcMzcwXDAwMVwwMDFcMjQyXDAwMlwwMDNHUEJcMjUyXDAwMlwwMzZHb29nbGUuUHJvdG9idWYuV2VsbEtubyIKKyAgInduVHlwZXNiXDAwNnByb3RvMyIKKyAgOworc3RhdGljIDo6X3BiaTo6b25jZV9mbGFnIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvX29uY2U7Citjb25zdCA6Ol9wYmk6OkRlc2NyaXB0b3JUYWJsZSBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90byA9IHsKKyAgICBmYWxzZSwgZmFsc2UsIDQ1NSwgZGVzY3JpcHRvcl90YWJsZV9wcm90b2RlZl9nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG8sCisgICAgImdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90byIsCisgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvX29uY2UsIG51bGxwdHIsIDAsIDksCisgICAgc2NoZW1hcywgZmlsZV9kZWZhdWx0X2luc3RhbmNlcywgVGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvOjpvZmZzZXRzLAorICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvLCBmaWxlX2xldmVsX2VudW1fZGVzY3JpcHRvcnNfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvLAorICAgIGZpbGVfbGV2ZWxfc2VydmljZV9kZXNjcmlwdG9yc19nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG8sCit9OworUFJPVE9CVUZfQVRUUklCVVRFX1dFQUsgY29uc3QgOjpfcGJpOjpEZXNjcmlwdG9yVGFibGUqIGRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvX2dldHRlcigpIHsKKyAgcmV0dXJuICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90bzsKK30KKworLy8gRm9yY2UgcnVubmluZyBBZGREZXNjcmlwdG9ycygpIGF0IGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gdGltZS4KK1BST1RPQlVGX0FUVFJJQlVURV9JTklUX1BSSU9SSVRZMiBzdGF0aWMgOjpfcGJpOjpBZGREZXNjcmlwdG9yc1J1bm5lciBkeW5hbWljX2luaXRfZHVtbXlfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvKCZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90byk7CitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIERvdWJsZVZhbHVlOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKK307CisKK0RvdWJsZVZhbHVlOjpEb3VibGVWYWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSkKK30KK0RvdWJsZVZhbHVlOjpEb3VibGVWYWx1ZShjb25zdCBEb3VibGVWYWx1ZSYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgRG91YmxlVmFsdWUqIGNvbnN0IF90aGlzID0gdGhpczsgKHZvaWQpX3RoaXM7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8udmFsdWVfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF90aGlzLT5faW1wbF8udmFsdWVfID0gZnJvbS5faW1wbF8udmFsdWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUpCit9CisKK2lubGluZSB2b2lkIERvdWJsZVZhbHVlOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy52YWx1ZV8pezB9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove30KKyAgfTsKK30KKworRG91YmxlVmFsdWU6On5Eb3VibGVWYWx1ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgRG91YmxlVmFsdWU6OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7Cit9CisKK3ZvaWQgRG91YmxlVmFsdWU6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIERvdWJsZVZhbHVlOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLnZhbHVlXyA9IDA7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogRG91YmxlVmFsdWU6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gZG91YmxlIHZhbHVlID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDkpKSB7CisgICAgICAgICAgX2ltcGxfLnZhbHVlXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6VW5hbGlnbmVkTG9hZDxkb3VibGU+KHB0cik7CisgICAgICAgICAgcHRyICs9IHNpemVvZihkb3VibGUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIERvdWJsZVZhbHVlOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyBkb3VibGUgdmFsdWUgPSAxOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1aW50NjRfdCkgPT0gc2l6ZW9mKGRvdWJsZSksICJDb2RlIGFzc3VtZXMgdWludDY0X3QgYW5kIGRvdWJsZSBhcmUgdGhlIHNhbWUgc2l6ZS4iKTsKKyAgZG91YmxlIHRtcF92YWx1ZSA9IHRoaXMtPl9pbnRlcm5hbF92YWx1ZSgpOworICB1aW50NjRfdCByYXdfdmFsdWU7CisgIG1lbWNweSgmcmF3X3ZhbHVlLCAmdG1wX3ZhbHVlLCBzaXplb2YodG1wX3ZhbHVlKSk7CisgIGlmIChyYXdfdmFsdWUgIT0gMCkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZURvdWJsZVRvQXJyYXkoMSwgdGhpcy0+X2ludGVybmFsX3ZhbHVlKCksIHRhcmdldCk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUpCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBEb3VibGVWYWx1ZTo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSkKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIGRvdWJsZSB2YWx1ZSA9IDE7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHVpbnQ2NF90KSA9PSBzaXplb2YoZG91YmxlKSwgIkNvZGUgYXNzdW1lcyB1aW50NjRfdCBhbmQgZG91YmxlIGFyZSB0aGUgc2FtZSBzaXplLiIpOworICBkb3VibGUgdG1wX3ZhbHVlID0gdGhpcy0+X2ludGVybmFsX3ZhbHVlKCk7CisgIHVpbnQ2NF90IHJhd192YWx1ZTsKKyAgbWVtY3B5KCZyYXdfdmFsdWUsICZ0bXBfdmFsdWUsIHNpemVvZih0bXBfdmFsdWUpKTsKKyAgaWYgKHJhd192YWx1ZSAhPSAwKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsgODsKKyAgfQorCisgIHJldHVybiBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCAmX2ltcGxfLl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhIERvdWJsZVZhbHVlOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgRG91YmxlVmFsdWU6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqRG91YmxlVmFsdWU6OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH0KKworCit2b2lkIERvdWJsZVZhbHVlOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8RG91YmxlVmFsdWUqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IERvdWJsZVZhbHVlJj4oZnJvbV9tc2cpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUpCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1aW50NjRfdCkgPT0gc2l6ZW9mKGRvdWJsZSksICJDb2RlIGFzc3VtZXMgdWludDY0X3QgYW5kIGRvdWJsZSBhcmUgdGhlIHNhbWUgc2l6ZS4iKTsKKyAgZG91YmxlIHRtcF92YWx1ZSA9IGZyb20uX2ludGVybmFsX3ZhbHVlKCk7CisgIHVpbnQ2NF90IHJhd192YWx1ZTsKKyAgbWVtY3B5KCZyYXdfdmFsdWUsICZ0bXBfdmFsdWUsIHNpemVvZih0bXBfdmFsdWUpKTsKKyAgaWYgKHJhd192YWx1ZSAhPSAwKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfdmFsdWUoZnJvbS5faW50ZXJuYWxfdmFsdWUoKSk7CisgIH0KKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgRG91YmxlVmFsdWU6OkNvcHlGcm9tKGNvbnN0IERvdWJsZVZhbHVlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSkKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIERvdWJsZVZhbHVlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBEb3VibGVWYWx1ZTo6SW50ZXJuYWxTd2FwKERvdWJsZVZhbHVlKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN3YXAoX2ltcGxfLnZhbHVlXywgb3RoZXItPl9pbXBsXy52YWx1ZV8pOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgRG91YmxlVmFsdWU6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90b19vbmNlLAorICAgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG9bMF0pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIEZsb2F0VmFsdWU6Ol9JbnRlcm5hbCB7CisgcHVibGljOgorfTsKKworRmxvYXRWYWx1ZTo6RmxvYXRWYWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GbG9hdFZhbHVlKQorfQorRmxvYXRWYWx1ZTo6RmxvYXRWYWx1ZShjb25zdCBGbG9hdFZhbHVlJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBGbG9hdFZhbHVlKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLnZhbHVlXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfdGhpcy0+X2ltcGxfLnZhbHVlXyA9IGZyb20uX2ltcGxfLnZhbHVlXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZsb2F0VmFsdWUpCit9CisKK2lubGluZSB2b2lkIEZsb2F0VmFsdWU6OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLnZhbHVlXyl7MH0KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICB9OworfQorCitGbG9hdFZhbHVlOjp+RmxvYXRWYWx1ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZsb2F0VmFsdWUpCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBGbG9hdFZhbHVlOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworfQorCit2b2lkIEZsb2F0VmFsdWU6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIEZsb2F0VmFsdWU6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZsb2F0VmFsdWUpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy52YWx1ZV8gPSAwOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIEZsb2F0VmFsdWU6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gZmxvYXQgdmFsdWUgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTMpKSB7CisgICAgICAgICAgX2ltcGxfLnZhbHVlXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6VW5hbGlnbmVkTG9hZDxmbG9hdD4ocHRyKTsKKyAgICAgICAgICBwdHIgKz0gc2l6ZW9mKGZsb2F0KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBGbG9hdFZhbHVlOjpfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GbG9hdFZhbHVlKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIGZsb2F0IHZhbHVlID0gMTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YodWludDMyX3QpID09IHNpemVvZihmbG9hdCksICJDb2RlIGFzc3VtZXMgdWludDMyX3QgYW5kIGZsb2F0IGFyZSB0aGUgc2FtZSBzaXplLiIpOworICBmbG9hdCB0bXBfdmFsdWUgPSB0aGlzLT5faW50ZXJuYWxfdmFsdWUoKTsKKyAgdWludDMyX3QgcmF3X3ZhbHVlOworICBtZW1jcHkoJnJhd192YWx1ZSwgJnRtcF92YWx1ZSwgc2l6ZW9mKHRtcF92YWx1ZSkpOworICBpZiAocmF3X3ZhbHVlICE9IDApIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdFRvQXJyYXkoMSwgdGhpcy0+X2ludGVybmFsX3ZhbHVlKCksIHRhcmdldCk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZSkKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IEZsb2F0VmFsdWU6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZSkKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIGZsb2F0IHZhbHVlID0gMTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YodWludDMyX3QpID09IHNpemVvZihmbG9hdCksICJDb2RlIGFzc3VtZXMgdWludDMyX3QgYW5kIGZsb2F0IGFyZSB0aGUgc2FtZSBzaXplLiIpOworICBmbG9hdCB0bXBfdmFsdWUgPSB0aGlzLT5faW50ZXJuYWxfdmFsdWUoKTsKKyAgdWludDMyX3QgcmF3X3ZhbHVlOworICBtZW1jcHkoJnJhd192YWx1ZSwgJnRtcF92YWx1ZSwgc2l6ZW9mKHRtcF92YWx1ZSkpOworICBpZiAocmF3X3ZhbHVlICE9IDApIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKyA0OworICB9CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgRmxvYXRWYWx1ZTo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIEZsb2F0VmFsdWU6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqRmxvYXRWYWx1ZTo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgRmxvYXRWYWx1ZTo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PEZsb2F0VmFsdWUqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IEZsb2F0VmFsdWUmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GbG9hdFZhbHVlKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgc3RhdGljX2Fzc2VydChzaXplb2YodWludDMyX3QpID09IHNpemVvZihmbG9hdCksICJDb2RlIGFzc3VtZXMgdWludDMyX3QgYW5kIGZsb2F0IGFyZSB0aGUgc2FtZSBzaXplLiIpOworICBmbG9hdCB0bXBfdmFsdWUgPSBmcm9tLl9pbnRlcm5hbF92YWx1ZSgpOworICB1aW50MzJfdCByYXdfdmFsdWU7CisgIG1lbWNweSgmcmF3X3ZhbHVlLCAmdG1wX3ZhbHVlLCBzaXplb2YodG1wX3ZhbHVlKSk7CisgIGlmIChyYXdfdmFsdWUgIT0gMCkgeworICAgIF90aGlzLT5faW50ZXJuYWxfc2V0X3ZhbHVlKGZyb20uX2ludGVybmFsX3ZhbHVlKCkpOworICB9CisgIF90aGlzLT5faW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworfQorCit2b2lkIEZsb2F0VmFsdWU6OkNvcHlGcm9tKGNvbnN0IEZsb2F0VmFsdWUmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZsb2F0VmFsdWUpCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBGbG9hdFZhbHVlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGbG9hdFZhbHVlOjpJbnRlcm5hbFN3YXAoRmxvYXRWYWx1ZSogb3RoZXIpIHsKKyAgdXNpbmcgc3RkOjpzd2FwOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkludGVybmFsU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzd2FwKF9pbXBsXy52YWx1ZV8sIG90aGVyLT5faW1wbF8udmFsdWVfKTsKK30KKworOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEZsb2F0VmFsdWU6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90b19vbmNlLAorICAgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG9bMV0pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIEludDY0VmFsdWU6Ol9JbnRlcm5hbCB7CisgcHVibGljOgorfTsKKworSW50NjRWYWx1ZTo6SW50NjRWYWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlKQorfQorSW50NjRWYWx1ZTo6SW50NjRWYWx1ZShjb25zdCBJbnQ2NFZhbHVlJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBJbnQ2NFZhbHVlKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLnZhbHVlXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfdGhpcy0+X2ltcGxfLnZhbHVlXyA9IGZyb20uX2ltcGxfLnZhbHVlXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUpCit9CisKK2lubGluZSB2b2lkIEludDY0VmFsdWU6OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLnZhbHVlXyl7aW50NjRfdHswfX0KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICB9OworfQorCitJbnQ2NFZhbHVlOjp+SW50NjRWYWx1ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUpCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBJbnQ2NFZhbHVlOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworfQorCit2b2lkIEludDY0VmFsdWU6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIEludDY0VmFsdWU6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy52YWx1ZV8gPSBpbnQ2NF90ezB9OworICBfaW50ZXJuYWxfbWV0YWRhdGFfLkNsZWFyPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCk7Cit9CisKK2NvbnN0IGNoYXIqIEludDY0VmFsdWU6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gaW50NjQgdmFsdWUgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gOCkpIHsKKyAgICAgICAgICBfaW1wbF8udmFsdWVfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIEludDY0VmFsdWU6Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gaW50NjQgdmFsdWUgPSAxOworICBpZiAodGhpcy0+X2ludGVybmFsX3ZhbHVlKCkgIT0gMCkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0VG9BcnJheSgxLCB0aGlzLT5faW50ZXJuYWxfdmFsdWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSkgeworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdDo6SW50ZXJuYWxTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0OjpkZWZhdWx0X2luc3RhbmNlKSwgdGFyZ2V0LCBzdHJlYW0pOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlKQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgSW50NjRWYWx1ZTo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlKQorICBzaXplX3QgdG90YWxfc2l6ZSA9IDA7CisKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gaW50NjQgdmFsdWUgPSAxOworICBpZiAodGhpcy0+X2ludGVybmFsX3ZhbHVlKCkgIT0gMCkgeworICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6SW50NjRTaXplUGx1c09uZSh0aGlzLT5faW50ZXJuYWxfdmFsdWUoKSk7CisgIH0KKworICByZXR1cm4gTWF5YmVDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodG90YWxfc2l6ZSwgJl9pbXBsXy5fY2FjaGVkX3NpemVfKTsKK30KKworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSBJbnQ2NFZhbHVlOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgSW50NjRWYWx1ZTo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpJbnQ2NFZhbHVlOjpHZXRDbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiAmX2NsYXNzX2RhdGFfOyB9CisKKwordm9pZCBJbnQ2NFZhbHVlOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8SW50NjRWYWx1ZSo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgSW50NjRWYWx1ZSY+KGZyb21fbXNnKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUpCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBpZiAoZnJvbS5faW50ZXJuYWxfdmFsdWUoKSAhPSAwKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfdmFsdWUoZnJvbS5faW50ZXJuYWxfdmFsdWUoKSk7CisgIH0KKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgSW50NjRWYWx1ZTo6Q29weUZyb20oY29uc3QgSW50NjRWYWx1ZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZSkKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIEludDY0VmFsdWU6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEludDY0VmFsdWU6OkludGVybmFsU3dhcChJbnQ2NFZhbHVlKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN3YXAoX2ltcGxfLnZhbHVlXywgb3RoZXItPl9pbXBsXy52YWx1ZV8pOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgSW50NjRWYWx1ZTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90b1syXSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVUludDY0VmFsdWU6Ol9JbnRlcm5hbCB7CisgcHVibGljOgorfTsKKworVUludDY0VmFsdWU6OlVJbnQ2NFZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlKQorfQorVUludDY0VmFsdWU6OlVJbnQ2NFZhbHVlKGNvbnN0IFVJbnQ2NFZhbHVlJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBVSW50NjRWYWx1ZSogY29uc3QgX3RoaXMgPSB0aGlzOyAodm9pZClfdGhpczsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy52YWx1ZV8pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fX07CisKKyAgX2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgX3RoaXMtPl9pbXBsXy52YWx1ZV8gPSBmcm9tLl9pbXBsXy52YWx1ZV87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZSkKK30KKworaW5saW5lIHZvaWQgVUludDY0VmFsdWU6OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLnZhbHVlXyl7dWludDY0X3R7MHV9fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgIH07Cit9CisKK1VJbnQ2NFZhbHVlOjp+VUludDY0VmFsdWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZSkKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIFVJbnQ2NFZhbHVlOjpTaGFyZWREdG9yKCkgeworICBHT09HTEVfRENIRUNLKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpID09IG51bGxwdHIpOworfQorCit2b2lkIFVJbnQ2NFZhbHVlOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIF9pbXBsXy5fY2FjaGVkX3NpemVfLlNldChzaXplKTsKK30KKwordm9pZCBVSW50NjRWYWx1ZTo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIF9pbXBsXy52YWx1ZV8gPSB1aW50NjRfdHswdX07CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogVUludDY0VmFsdWU6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gdWludDY0IHZhbHVlID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDgpKSB7CisgICAgICAgICAgX2ltcGxfLnZhbHVlXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDY0KCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBVSW50NjRWYWx1ZTo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gdWludDY0IHZhbHVlID0gMTsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF92YWx1ZSgpICE9IDApIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjRUb0FycmF5KDEsIHRoaXMtPl9pbnRlcm5hbF92YWx1ZSgpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlKQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgVUludDY0VmFsdWU6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyB1aW50NjQgdmFsdWUgPSAxOworICBpZiAodGhpcy0+X2ludGVybmFsX3ZhbHVlKCkgIT0gMCkgeworICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6VUludDY0U2l6ZVBsdXNPbmUodGhpcy0+X2ludGVybmFsX3ZhbHVlKCkpOworICB9CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgVUludDY0VmFsdWU6Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBVSW50NjRWYWx1ZTo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpVSW50NjRWYWx1ZTo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgVUludDY0VmFsdWU6Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxVSW50NjRWYWx1ZSo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgVUludDY0VmFsdWUmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZSkKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGlmIChmcm9tLl9pbnRlcm5hbF92YWx1ZSgpICE9IDApIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF92YWx1ZShmcm9tLl9pbnRlcm5hbF92YWx1ZSgpKTsKKyAgfQorICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBVSW50NjRWYWx1ZTo6Q29weUZyb20oY29uc3QgVUludDY0VmFsdWUmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgVUludDY0VmFsdWU6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFVJbnQ2NFZhbHVlOjpJbnRlcm5hbFN3YXAoVUludDY0VmFsdWUqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3dhcChfaW1wbF8udmFsdWVfLCBvdGhlci0+X2ltcGxfLnZhbHVlXyk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBVSW50NjRWYWx1ZTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90b1szXSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgSW50MzJWYWx1ZTo6X0ludGVybmFsIHsKKyBwdWJsaWM6Cit9OworCitJbnQzMlZhbHVlOjpJbnQzMlZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUpCit9CitJbnQzMlZhbHVlOjpJbnQzMlZhbHVlKGNvbnN0IEludDMyVmFsdWUmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIEludDMyVmFsdWUqIGNvbnN0IF90aGlzID0gdGhpczsgKHZvaWQpX3RoaXM7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8udmFsdWVfKXt9CisgICAgLCAvKmRlY2x0eXBlKF9pbXBsXy5fY2FjaGVkX3NpemVfKSove319OworCisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7CisgIF90aGlzLT5faW1wbF8udmFsdWVfID0gZnJvbS5faW1wbF8udmFsdWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSkKK30KKworaW5saW5lIHZvaWQgSW50MzJWYWx1ZTo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8udmFsdWVfKXswfQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgIH07Cit9CisKK0ludDMyVmFsdWU6On5JbnQzMlZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSkKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIEludDMyVmFsdWU6OlNoYXJlZER0b3IoKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkgPT0gbnVsbHB0cik7Cit9CisKK3ZvaWQgSW50MzJWYWx1ZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgSW50MzJWYWx1ZTo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLnZhbHVlXyA9IDA7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogSW50MzJWYWx1ZTo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBpbnQzMiB2YWx1ZSA9IDE7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChQUk9UT0JVRl9QUkVESUNUX1RSVUUoc3RhdGljX2Nhc3Q8dWludDhfdD4odGFnKSA9PSA4KSkgeworICAgICAgICAgIF9pbXBsXy52YWx1ZV8gPSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlJlYWRWYXJpbnQzMigmcHRyKTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICB9ICAvLyBzd2l0Y2gKKyAgaGFuZGxlX3VudXN1YWw6CisgICAgaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkgeworICAgICAgQ0hLXyhwdHIpOworICAgICAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7CisgICAgICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogSW50MzJWYWx1ZTo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyBpbnQzMiB2YWx1ZSA9IDE7CisgIGlmICh0aGlzLT5faW50ZXJuYWxfdmFsdWUoKSAhPSAwKSB7CisgICAgdGFyZ2V0ID0gc3RyZWFtLT5FbnN1cmVTcGFjZSh0YXJnZXQpOworICAgIHRhcmdldCA9IDo6X3BiaTo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDEsIHRoaXMtPl9pbnRlcm5hbF92YWx1ZSgpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUpCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3NpemVfdCBJbnQzMlZhbHVlOjpCeXRlU2l6ZUxvbmcoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyBpbnQzMiB2YWx1ZSA9IDE7CisgIGlmICh0aGlzLT5faW50ZXJuYWxfdmFsdWUoKSAhPSAwKSB7CisgICAgdG90YWxfc2l6ZSArPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemVQbHVzT25lKHRoaXMtPl9pbnRlcm5hbF92YWx1ZSgpKTsKKyAgfQorCisgIHJldHVybiBNYXliZUNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSh0b3RhbF9zaXplLCAmX2ltcGxfLl9jYWNoZWRfc2l6ZV8pOworfQorCitjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhIEludDMyVmFsdWU6Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBJbnQzMlZhbHVlOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkludDMyVmFsdWU6OkdldENsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuICZfY2xhc3NfZGF0YV87IH0KKworCit2b2lkIEludDMyVmFsdWU6Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxJbnQzMlZhbHVlKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBJbnQzMlZhbHVlJj4oZnJvbV9tc2cpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSkKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGlmIChmcm9tLl9pbnRlcm5hbF92YWx1ZSgpICE9IDApIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF92YWx1ZShmcm9tLl9pbnRlcm5hbF92YWx1ZSgpKTsKKyAgfQorICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBJbnQzMlZhbHVlOjpDb3B5RnJvbShjb25zdCBJbnQzMlZhbHVlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgSW50MzJWYWx1ZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSW50MzJWYWx1ZTo6SW50ZXJuYWxTd2FwKEludDMyVmFsdWUqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3dhcChfaW1wbF8udmFsdWVfLCBvdGhlci0+X2ltcGxfLnZhbHVlXyk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBJbnQzMlZhbHVlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvWzRdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBVSW50MzJWYWx1ZTo6X0ludGVybmFsIHsKKyBwdWJsaWM6Cit9OworCitVSW50MzJWYWx1ZTo6VUludDMyVmFsdWUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQpCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgU2hhcmVkQ3RvcihhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUpCit9CitVSW50MzJWYWx1ZTo6VUludDMyVmFsdWUoY29uc3QgVUludDMyVmFsdWUmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIFVJbnQzMlZhbHVlKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLnZhbHVlXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfdGhpcy0+X2ltcGxfLnZhbHVlXyA9IGZyb20uX2ltcGxfLnZhbHVlXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlKQorfQorCitpbmxpbmUgdm9pZCBVSW50MzJWYWx1ZTo6U2hhcmVkQ3RvcigKKyAgICA6Ol9wYjo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgKHZvaWQpYXJlbmE7CisgICh2b2lkKWlzX21lc3NhZ2Vfb3duZWQ7CisgIG5ldyAoJl9pbXBsXykgSW1wbF97CisgICAgICBkZWNsdHlwZShfaW1wbF8udmFsdWVfKXswdX0KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICB9OworfQorCitVSW50MzJWYWx1ZTo6flVJbnQzMlZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUpCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBVSW50MzJWYWx1ZTo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKK30KKwordm9pZCBVSW50MzJWYWx1ZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgVUludDMyVmFsdWU6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfaW1wbF8udmFsdWVfID0gMHU7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogVUludDMyVmFsdWU6Ol9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpfcGJpOjpQYXJzZUNvbnRleHQqIGN0eCkgeworI2RlZmluZSBDSEtfKHgpIGlmIChQUk9UT0JVRl9QUkVESUNUX0ZBTFNFKCEoeCkpKSBnb3RvIGZhaWx1cmUKKyAgd2hpbGUgKCFjdHgtPkRvbmUoJnB0cikpIHsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgcHRyID0gOjpfcGJpOjpSZWFkVGFnKHB0ciwgJnRhZyk7CisgICAgc3dpdGNoICh0YWcgPj4gMykgeworICAgICAgLy8gdWludDMyIHZhbHVlID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDgpKSB7CisgICAgICAgICAgX2ltcGxfLnZhbHVlXyA9IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UmVhZFZhcmludDMyKCZwdHIpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIH0gIC8vIHN3aXRjaAorICBoYW5kbGVfdW51c3VhbDoKKyAgICBpZiAoKHRhZyA9PSAwKSB8fCAoKHRhZyAmIDcpID09IDQpKSB7CisgICAgICBDSEtfKHB0cik7CisgICAgICBjdHgtPlNldExhc3RUYWcodGFnKTsKKyAgICAgIGdvdG8gbWVzc2FnZV9kb25lOworICAgIH0KKyAgICBwdHIgPSBVbmtub3duRmllbGRQYXJzZSgKKyAgICAgICAgdGFnLAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSwKKyAgICAgICAgcHRyLCBjdHgpOworICAgIENIS18ocHRyICE9IG51bGxwdHIpOworICB9ICAvLyB3aGlsZQorbWVzc2FnZV9kb25lOgorICByZXR1cm4gcHRyOworZmFpbHVyZToKKyAgcHRyID0gbnVsbHB0cjsKKyAgZ290byBtZXNzYWdlX2RvbmU7CisjdW5kZWYgQ0hLXworfQorCit1aW50OF90KiBVSW50MzJWYWx1ZTo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUpCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgLy8gdWludDMyIHZhbHVlID0gMTsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF92YWx1ZSgpICE9IDApIHsKKyAgICB0YXJnZXQgPSBzdHJlYW0tPkVuc3VyZVNwYWNlKHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzJUb0FycmF5KDEsIHRoaXMtPl9pbnRlcm5hbF92YWx1ZSgpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlKQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgVUludDMyVmFsdWU6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyB1aW50MzIgdmFsdWUgPSAxOworICBpZiAodGhpcy0+X2ludGVybmFsX3ZhbHVlKCkgIT0gMCkgeworICAgIHRvdGFsX3NpemUgKz0gOjpfcGJpOjpXaXJlRm9ybWF0TGl0ZTo6VUludDMyU2l6ZVBsdXNPbmUodGhpcy0+X2ludGVybmFsX3ZhbHVlKCkpOworICB9CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgVUludDMyVmFsdWU6Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBVSW50MzJWYWx1ZTo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpVSW50MzJWYWx1ZTo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgVUludDMyVmFsdWU6Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxVSW50MzJWYWx1ZSo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgVUludDMyVmFsdWUmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZSkKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGlmIChmcm9tLl9pbnRlcm5hbF92YWx1ZSgpICE9IDApIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF92YWx1ZShmcm9tLl9pbnRlcm5hbF92YWx1ZSgpKTsKKyAgfQorICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBVSW50MzJWYWx1ZTo6Q29weUZyb20oY29uc3QgVUludDMyVmFsdWUmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgVUludDMyVmFsdWU6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFVJbnQzMlZhbHVlOjpJbnRlcm5hbFN3YXAoVUludDMyVmFsdWUqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3dhcChfaW1wbF8udmFsdWVfLCBvdGhlci0+X2ltcGxfLnZhbHVlXyk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBVSW50MzJWYWx1ZTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHJldHVybiA6Ol9wYmk6OkFzc2lnbkRlc2NyaXB0b3JzKAorICAgICAgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvX2dldHRlciwgJmRlc2NyaXB0b3JfdGFibGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvX29uY2UsCisgICAgICBmaWxlX2xldmVsX21ldGFkYXRhX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90b1s1XSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgQm9vbFZhbHVlOjpfSW50ZXJuYWwgeworIHB1YmxpYzoKK307CisKK0Jvb2xWYWx1ZTo6Qm9vbFZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKSB7CisgIFNoYXJlZEN0b3IoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZSkKK30KK0Jvb2xWYWx1ZTo6Qm9vbFZhbHVlKGNvbnN0IEJvb2xWYWx1ZSYgZnJvbSkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSgpIHsKKyAgQm9vbFZhbHVlKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLnZhbHVlXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfdGhpcy0+X2ltcGxfLnZhbHVlXyA9IGZyb20uX2ltcGxfLnZhbHVlXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZSkKK30KKworaW5saW5lIHZvaWQgQm9vbFZhbHVlOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy52YWx1ZV8pe2ZhbHNlfQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgIH07Cit9CisKK0Jvb2xWYWx1ZTo6fkJvb2xWYWx1ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZSkKKyAgaWYgKGF1dG8gKmFyZW5hID0gX2ludGVybmFsX21ldGFkYXRhXy5EZWxldGVSZXR1cm5BcmVuYTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpKSB7CisgICh2b2lkKWFyZW5hOworICAgIHJldHVybjsKKyAgfQorICBTaGFyZWREdG9yKCk7Cit9CisKK2lubGluZSB2b2lkIEJvb2xWYWx1ZTo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKK30KKwordm9pZCBCb29sVmFsdWU6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIEJvb2xWYWx1ZTo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuQm9vbFZhbHVlKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBfaW1wbF8udmFsdWVfID0gZmFsc2U7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uQ2xlYXI8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKTsKK30KKworY29uc3QgY2hhciogQm9vbFZhbHVlOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIGJvb2wgdmFsdWUgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gOCkpIHsKKyAgICAgICAgICBfaW1wbF8udmFsdWVfID0gOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpSZWFkVmFyaW50NjQoJnB0cik7CisgICAgICAgICAgQ0hLXyhwdHIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgfSAgLy8gc3dpdGNoCisgIGhhbmRsZV91bnVzdWFsOgorICAgIGlmICgodGFnID09IDApIHx8ICgodGFnICYgNykgPT0gNCkpIHsKKyAgICAgIENIS18ocHRyKTsKKyAgICAgIGN0eC0+U2V0TGFzdFRhZyh0YWcpOworICAgICAgZ290byBtZXNzYWdlX2RvbmU7CisgICAgfQorICAgIHB0ciA9IFVua25vd25GaWVsZFBhcnNlKAorICAgICAgICB0YWcsCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkczw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpLAorICAgICAgICBwdHIsIGN0eCk7CisgICAgQ0hLXyhwdHIgIT0gbnVsbHB0cik7CisgIH0gIC8vIHdoaWxlCittZXNzYWdlX2RvbmU6CisgIHJldHVybiBwdHI7CitmYWlsdXJlOgorICBwdHIgPSBudWxscHRyOworICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyN1bmRlZiBDSEtfCit9CisKK3VpbnQ4X3QqIEJvb2xWYWx1ZTo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuQm9vbFZhbHVlKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIGJvb2wgdmFsdWUgPSAxOworICBpZiAodGhpcy0+X2ludGVybmFsX3ZhbHVlKCkgIT0gMCkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+RW5zdXJlU3BhY2UodGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDEsIHRoaXMtPl9pbnRlcm5hbF92YWx1ZSgpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZSkKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IEJvb2xWYWx1ZTo6Qnl0ZVNpemVMb25nKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyBib29sIHZhbHVlID0gMTsKKyAgaWYgKHRoaXMtPl9pbnRlcm5hbF92YWx1ZSgpICE9IDApIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICB9CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgQm9vbFZhbHVlOjpfY2xhc3NfZGF0YV8gPSB7CisgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlXaXRoU291cmNlQ2hlY2ssCisgICAgQm9vbFZhbHVlOjpNZXJnZUltcGwKK307Citjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkJvb2xWYWx1ZTo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgQm9vbFZhbHVlOjpNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKSB7CisgIGF1dG8qIGNvbnN0IF90aGlzID0gc3RhdGljX2Nhc3Q8Qm9vbFZhbHVlKj4oJnRvX21zZyk7CisgIGF1dG8mIGZyb20gPSBzdGF0aWNfY2FzdDxjb25zdCBCb29sVmFsdWUmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUpCisgIEdPT0dMRV9EQ0hFQ0tfTkUoJmZyb20sIF90aGlzKTsKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICBpZiAoZnJvbS5faW50ZXJuYWxfdmFsdWUoKSAhPSAwKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfdmFsdWUoZnJvbS5faW50ZXJuYWxfdmFsdWUoKSk7CisgIH0KKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgQm9vbFZhbHVlOjpDb3B5RnJvbShjb25zdCBCb29sVmFsdWUmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZSkKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIEJvb2xWYWx1ZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQm9vbFZhbHVlOjpJbnRlcm5hbFN3YXAoQm9vbFZhbHVlKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN3YXAoX2ltcGxfLnZhbHVlXywgb3RoZXItPl9pbXBsXy52YWx1ZV8pOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgQm9vbFZhbHVlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvWzZdKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBTdHJpbmdWYWx1ZTo6X0ludGVybmFsIHsKKyBwdWJsaWM6Cit9OworCitTdHJpbmdWYWx1ZTo6U3RyaW5nVmFsdWUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQpCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoYXJlbmEsIGlzX21lc3NhZ2Vfb3duZWQpIHsKKyAgU2hhcmVkQ3RvcihhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChhcmVuYV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUpCit9CitTdHJpbmdWYWx1ZTo6U3RyaW5nVmFsdWUoY29uc3QgU3RyaW5nVmFsdWUmIGZyb20pCisgIDogOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UoKSB7CisgIFN0cmluZ1ZhbHVlKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLnZhbHVlXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8udmFsdWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLnZhbHVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF92YWx1ZSgpLmVtcHR5KCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLnZhbHVlXy5TZXQoZnJvbS5faW50ZXJuYWxfdmFsdWUoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZSkKK30KKworaW5saW5lIHZvaWQgU3RyaW5nVmFsdWU6OlNoYXJlZEN0b3IoCisgICAgOjpfcGI6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKSB7CisgICh2b2lkKWFyZW5hOworICAodm9pZClpc19tZXNzYWdlX293bmVkOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLnZhbHVlXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9CisgIH07CisgIF9pbXBsXy52YWx1ZV8uSW5pdERlZmF1bHQoKTsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgICBfaW1wbF8udmFsdWVfLlNldCgiIiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAjZW5kaWYgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworfQorCitTdHJpbmdWYWx1ZTo6flN0cmluZ1ZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUpCisgIGlmIChhdXRvICphcmVuYSA9IF9pbnRlcm5hbF9tZXRhZGF0YV8uRGVsZXRlUmV0dXJuQXJlbmE8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oKSkgeworICAodm9pZClhcmVuYTsKKyAgICByZXR1cm47CisgIH0KKyAgU2hhcmVkRHRvcigpOworfQorCitpbmxpbmUgdm9pZCBTdHJpbmdWYWx1ZTo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKKyAgX2ltcGxfLnZhbHVlXy5EZXN0cm95KCk7Cit9CisKK3ZvaWQgU3RyaW5nVmFsdWU6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgX2ltcGxfLl9jYWNoZWRfc2l6ZV8uU2V0KHNpemUpOworfQorCit2b2lkIFN0cmluZ1ZhbHVlOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZSkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLnZhbHVlXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5DbGVhcjw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworfQorCitjb25zdCBjaGFyKiBTdHJpbmdWYWx1ZTo6X0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6Ol9wYmk6OlBhcnNlQ29udGV4dCogY3R4KSB7CisjZGVmaW5lIENIS18oeCkgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoISh4KSkpIGdvdG8gZmFpbHVyZQorICB3aGlsZSAoIWN0eC0+RG9uZSgmcHRyKSkgeworICAgIHVpbnQzMl90IHRhZzsKKyAgICBwdHIgPSA6Ol9wYmk6OlJlYWRUYWcocHRyLCAmdGFnKTsKKyAgICBzd2l0Y2ggKHRhZyA+PiAzKSB7CisgICAgICAvLyBzdHJpbmcgdmFsdWUgPSAxOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoUFJPVE9CVUZfUFJFRElDVF9UUlVFKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRhZykgPT0gMTApKSB7CisgICAgICAgICAgYXV0byBzdHIgPSBfaW50ZXJuYWxfbXV0YWJsZV92YWx1ZSgpOworICAgICAgICAgIHB0ciA9IDo6X3BiaTo6SW5saW5lR3JlZWR5U3RyaW5nUGFyc2VyKHN0ciwgcHRyLCBjdHgpOworICAgICAgICAgIENIS18ocHRyKTsKKyAgICAgICAgICBDSEtfKDo6X3BiaTo6VmVyaWZ5VVRGOChzdHIsICJnb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUudmFsdWUiKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICB9ICAvLyBzd2l0Y2gKKyAgaGFuZGxlX3VudXN1YWw6CisgICAgaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkgeworICAgICAgQ0hLXyhwdHIpOworICAgICAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7CisgICAgICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogU3RyaW5nVmFsdWU6Ol9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlKQorICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIHN0cmluZyB2YWx1ZSA9IDE7CisgIGlmICghdGhpcy0+X2ludGVybmFsX3ZhbHVlKCkuZW1wdHkoKSkgeworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICB0aGlzLT5faW50ZXJuYWxfdmFsdWUoKS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4odGhpcy0+X2ludGVybmFsX3ZhbHVlKCkubGVuZ3RoKCkpLAorICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZS52YWx1ZSIpOworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAgIDEsIHRoaXMtPl9pbnRlcm5hbF92YWx1ZSgpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKFBST1RPQlVGX1BSRURJQ1RfRkFMU0UoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpKSB7CisgICAgdGFyZ2V0ID0gOjpfcGJpOjpXaXJlRm9ybWF0OjpJbnRlcm5hbFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UpLCB0YXJnZXQsIHN0cmVhbSk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlKQorICByZXR1cm4gdGFyZ2V0OworfQorCitzaXplX3QgU3RyaW5nVmFsdWU6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUpCisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAvLyBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNhY2hlZF9oYXNfYml0cyBiZWluZyB1bnVzZWQKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyBzdHJpbmcgdmFsdWUgPSAxOworICBpZiAoIXRoaXMtPl9pbnRlcm5hbF92YWx1ZSgpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgdGhpcy0+X2ludGVybmFsX3ZhbHVlKCkpOworICB9CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgU3RyaW5nVmFsdWU6Ol9jbGFzc19kYXRhXyA9IHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weVdpdGhTb3VyY2VDaGVjaywKKyAgICBTdHJpbmdWYWx1ZTo6TWVyZ2VJbXBsCit9OworY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpTdHJpbmdWYWx1ZTo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgU3RyaW5nVmFsdWU6Ok1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpIHsKKyAgYXV0byogY29uc3QgX3RoaXMgPSBzdGF0aWNfY2FzdDxTdHJpbmdWYWx1ZSo+KCZ0b19tc2cpOworICBhdXRvJiBmcm9tID0gc3RhdGljX2Nhc3Q8Y29uc3QgU3RyaW5nVmFsdWUmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZSkKKyAgR09PR0xFX0RDSEVDS19ORSgmZnJvbSwgX3RoaXMpOworICB1aW50MzJfdCBjYWNoZWRfaGFzX2JpdHMgPSAwOworICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIGlmICghZnJvbS5faW50ZXJuYWxfdmFsdWUoKS5lbXB0eSgpKSB7CisgICAgX3RoaXMtPl9pbnRlcm5hbF9zZXRfdmFsdWUoZnJvbS5faW50ZXJuYWxfdmFsdWUoKSk7CisgIH0KKyAgX3RoaXMtPl9pbnRlcm5hbF9tZXRhZGF0YV8uTWVyZ2VGcm9tPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KGZyb20uX2ludGVybmFsX21ldGFkYXRhXyk7Cit9CisKK3ZvaWQgU3RyaW5nVmFsdWU6OkNvcHlGcm9tKGNvbnN0IFN0cmluZ1ZhbHVlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZSkKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIFN0cmluZ1ZhbHVlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTdHJpbmdWYWx1ZTo6SW50ZXJuYWxTd2FwKFN0cmluZ1ZhbHVlKiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIGF1dG8qIGxoc19hcmVuYSA9IEdldEFyZW5hRm9yQWxsb2NhdGlvbigpOworICBhdXRvKiByaHNfYXJlbmEgPSBvdGhlci0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uSW50ZXJuYWxTd2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHI6OkludGVybmFsU3dhcCgKKyAgICAgICZfaW1wbF8udmFsdWVfLCBsaHNfYXJlbmEsCisgICAgICAmb3RoZXItPl9pbXBsXy52YWx1ZV8sIHJoc19hcmVuYQorICApOworfQorCis6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgU3RyaW5nVmFsdWU6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICByZXR1cm4gOjpfcGJpOjpBc3NpZ25EZXNjcmlwdG9ycygKKyAgICAgICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90b19nZXR0ZXIsICZkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90b19vbmNlLAorICAgICAgZmlsZV9sZXZlbF9tZXRhZGF0YV9nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG9bN10pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIEJ5dGVzVmFsdWU6Ol9JbnRlcm5hbCB7CisgcHVibGljOgorfTsKKworQnl0ZXNWYWx1ZTo6Qnl0ZXNWYWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkKKyAgOiA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZShhcmVuYSwgaXNfbWVzc2FnZV9vd25lZCkgeworICBTaGFyZWRDdG9yKGFyZW5hLCBpc19tZXNzYWdlX293bmVkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGFyZW5hX2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlKQorfQorQnl0ZXNWYWx1ZTo6Qnl0ZXNWYWx1ZShjb25zdCBCeXRlc1ZhbHVlJiBmcm9tKQorICA6IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlKCkgeworICBCeXRlc1ZhbHVlKiBjb25zdCBfdGhpcyA9IHRoaXM7ICh2b2lkKV90aGlzOworICBuZXcgKCZfaW1wbF8pIEltcGxfeworICAgICAgZGVjbHR5cGUoX2ltcGxfLnZhbHVlXyl7fQorICAgICwgLypkZWNsdHlwZShfaW1wbF8uX2NhY2hlZF9zaXplXykqL3t9fTsKKworICBfaW50ZXJuYWxfbWV0YWRhdGFfLk1lcmdlRnJvbTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0Pihmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBfaW1wbF8udmFsdWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLnZhbHVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF92YWx1ZSgpLmVtcHR5KCkpIHsKKyAgICBfdGhpcy0+X2ltcGxfLnZhbHVlXy5TZXQoZnJvbS5faW50ZXJuYWxfdmFsdWUoKSwgCisgICAgICBfdGhpcy0+R2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlKQorfQorCitpbmxpbmUgdm9pZCBCeXRlc1ZhbHVlOjpTaGFyZWRDdG9yKAorICAgIDo6X3BiOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCkgeworICAodm9pZClhcmVuYTsKKyAgKHZvaWQpaXNfbWVzc2FnZV9vd25lZDsKKyAgbmV3ICgmX2ltcGxfKSBJbXBsX3sKKyAgICAgIGRlY2x0eXBlKF9pbXBsXy52YWx1ZV8pe30KKyAgICAsIC8qZGVjbHR5cGUoX2ltcGxfLl9jYWNoZWRfc2l6ZV8pKi97fQorICB9OworICBfaW1wbF8udmFsdWVfLkluaXREZWZhdWx0KCk7CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgICAgX2ltcGxfLnZhbHVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKK30KKworQnl0ZXNWYWx1ZTo6fkJ5dGVzVmFsdWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlKQorICBpZiAoYXV0byAqYXJlbmEgPSBfaW50ZXJuYWxfbWV0YWRhdGFfLkRlbGV0ZVJldHVybkFyZW5hPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCkpIHsKKyAgKHZvaWQpYXJlbmE7CisgICAgcmV0dXJuOworICB9CisgIFNoYXJlZER0b3IoKTsKK30KKworaW5saW5lIHZvaWQgQnl0ZXNWYWx1ZTo6U2hhcmVkRHRvcigpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYUZvckFsbG9jYXRpb24oKSA9PSBudWxscHRyKTsKKyAgX2ltcGxfLnZhbHVlXy5EZXN0cm95KCk7Cit9CisKK3ZvaWQgQnl0ZXNWYWx1ZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBfaW1wbF8uX2NhY2hlZF9zaXplXy5TZXQoc2l6ZSk7Cit9CisKK3ZvaWQgQnl0ZXNWYWx1ZTo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZSkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgLy8gUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBjYWNoZWRfaGFzX2JpdHMgYmVpbmcgdW51c2VkCisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgX2ltcGxfLnZhbHVlXy5DbGVhclRvRW1wdHkoKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5DbGVhcjw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VW5rbm93bkZpZWxkU2V0PigpOworfQorCitjb25zdCBjaGFyKiBCeXRlc1ZhbHVlOjpfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6X3BiaTo6UGFyc2VDb250ZXh0KiBjdHgpIHsKKyNkZWZpbmUgQ0hLXyh4KSBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRSghKHgpKSkgZ290byBmYWlsdXJlCisgIHdoaWxlICghY3R4LT5Eb25lKCZwdHIpKSB7CisgICAgdWludDMyX3QgdGFnOworICAgIHB0ciA9IDo6X3BiaTo6UmVhZFRhZyhwdHIsICZ0YWcpOworICAgIHN3aXRjaCAodGFnID4+IDMpIHsKKyAgICAgIC8vIGJ5dGVzIHZhbHVlID0gMTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKFBST1RPQlVGX1BSRURJQ1RfVFJVRShzdGF0aWNfY2FzdDx1aW50OF90Pih0YWcpID09IDEwKSkgeworICAgICAgICAgIGF1dG8gc3RyID0gX2ludGVybmFsX211dGFibGVfdmFsdWUoKTsKKyAgICAgICAgICBwdHIgPSA6Ol9wYmk6OklubGluZUdyZWVkeVN0cmluZ1BhcnNlcihzdHIsIHB0ciwgY3R4KTsKKyAgICAgICAgICBDSEtfKHB0cik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICB9ICAvLyBzd2l0Y2gKKyAgaGFuZGxlX3VudXN1YWw6CisgICAgaWYgKCh0YWcgPT0gMCkgfHwgKCh0YWcgJiA3KSA9PSA0KSkgeworICAgICAgQ0hLXyhwdHIpOworICAgICAgY3R4LT5TZXRMYXN0VGFnKHRhZyk7CisgICAgICBnb3RvIG1lc3NhZ2VfZG9uZTsKKyAgICB9CisgICAgcHRyID0gVW5rbm93bkZpZWxkUGFyc2UoCisgICAgICAgIHRhZywKKyAgICAgICAgX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVbmtub3duRmllbGRTZXQ+KCksCisgICAgICAgIHB0ciwgY3R4KTsKKyAgICBDSEtfKHB0ciAhPSBudWxscHRyKTsKKyAgfSAgLy8gd2hpbGUKK21lc3NhZ2VfZG9uZToKKyAgcmV0dXJuIHB0cjsKK2ZhaWx1cmU6CisgIHB0ciA9IG51bGxwdHI7CisgIGdvdG8gbWVzc2FnZV9kb25lOworI3VuZGVmIENIS18KK30KKwordWludDhfdCogQnl0ZXNWYWx1ZTo6X0ludGVybmFsU2VyaWFsaXplKAorICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZSkKKyAgdWludDMyX3QgY2FjaGVkX2hhc19iaXRzID0gMDsKKyAgKHZvaWQpIGNhY2hlZF9oYXNfYml0czsKKworICAvLyBieXRlcyB2YWx1ZSA9IDE7CisgIGlmICghdGhpcy0+X2ludGVybmFsX3ZhbHVlKCkuZW1wdHkoKSkgeworICAgIHRhcmdldCA9IHN0cmVhbS0+V3JpdGVCeXRlc01heWJlQWxpYXNlZCgKKyAgICAgICAgMSwgdGhpcy0+X2ludGVybmFsX3ZhbHVlKCksIHRhcmdldCk7CisgIH0KKworICBpZiAoUFJPVE9CVUZfUFJFRElDVF9GQUxTRShfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkpIHsKKyAgICB0YXJnZXQgPSA6Ol9wYmk6OldpcmVGb3JtYXQ6OkludGVybmFsU2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHM8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldDo6ZGVmYXVsdF9pbnN0YW5jZSksIHRhcmdldCwgc3RyZWFtKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZSkKKyAgcmV0dXJuIHRhcmdldDsKK30KKworc2l6ZV90IEJ5dGVzVmFsdWU6OkJ5dGVTaXplTG9uZygpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZSkKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworCisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgIC8vIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY2FjaGVkX2hhc19iaXRzIGJlaW5nIHVudXNlZAorICAodm9pZCkgY2FjaGVkX2hhc19iaXRzOworCisgIC8vIGJ5dGVzIHZhbHVlID0gMTsKKyAgaWYgKCF0aGlzLT5faW50ZXJuYWxfdmFsdWUoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkJ5dGVzU2l6ZSgKKyAgICAgICAgdGhpcy0+X2ludGVybmFsX3ZhbHVlKCkpOworICB9CisKKyAgcmV0dXJuIE1heWJlQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKHRvdGFsX3NpemUsICZfaW1wbF8uX2NhY2hlZF9zaXplXyk7Cit9CisKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEgQnl0ZXNWYWx1ZTo6X2NsYXNzX2RhdGFfID0geworICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5V2l0aFNvdXJjZUNoZWNrLAorICAgIEJ5dGVzVmFsdWU6Ok1lcmdlSW1wbAorfTsKK2NvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqQnl0ZXNWYWx1ZTo6R2V0Q2xhc3NEYXRhKCkgY29uc3QgeyByZXR1cm4gJl9jbGFzc19kYXRhXzsgfQorCisKK3ZvaWQgQnl0ZXNWYWx1ZTo6TWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZykgeworICBhdXRvKiBjb25zdCBfdGhpcyA9IHN0YXRpY19jYXN0PEJ5dGVzVmFsdWUqPigmdG9fbXNnKTsKKyAgYXV0byYgZnJvbSA9IHN0YXRpY19jYXN0PGNvbnN0IEJ5dGVzVmFsdWUmPihmcm9tX21zZyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlKQorICBHT09HTEVfRENIRUNLX05FKCZmcm9tLCBfdGhpcyk7CisgIHVpbnQzMl90IGNhY2hlZF9oYXNfYml0cyA9IDA7CisgICh2b2lkKSBjYWNoZWRfaGFzX2JpdHM7CisKKyAgaWYgKCFmcm9tLl9pbnRlcm5hbF92YWx1ZSgpLmVtcHR5KCkpIHsKKyAgICBfdGhpcy0+X2ludGVybmFsX3NldF92YWx1ZShmcm9tLl9pbnRlcm5hbF92YWx1ZSgpKTsKKyAgfQorICBfdGhpcy0+X2ludGVybmFsX21ldGFkYXRhXy5NZXJnZUZyb208OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVua25vd25GaWVsZFNldD4oZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfKTsKK30KKwordm9pZCBCeXRlc1ZhbHVlOjpDb3B5RnJvbShjb25zdCBCeXRlc1ZhbHVlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgQnl0ZXNWYWx1ZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQnl0ZXNWYWx1ZTo6SW50ZXJuYWxTd2FwKEJ5dGVzVmFsdWUqIG90aGVyKSB7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgYXV0byogbGhzX2FyZW5hID0gR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCk7CisgIGF1dG8qIHJoc19hcmVuYSA9IG90aGVyLT5HZXRBcmVuYUZvckFsbG9jYXRpb24oKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5JbnRlcm5hbFN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0cjo6SW50ZXJuYWxTd2FwKAorICAgICAgJl9pbXBsXy52YWx1ZV8sIGxoc19hcmVuYSwKKyAgICAgICZvdGhlci0+X2ltcGxfLnZhbHVlXywgcmhzX2FyZW5hCisgICk7Cit9CisKKzo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBCeXRlc1ZhbHVlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIDo6X3BiaTo6QXNzaWduRGVzY3JpcHRvcnMoCisgICAgICAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG9fZ2V0dGVyLCAmZGVzY3JpcHRvcl90YWJsZV9nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG9fb25jZSwKKyAgICAgIGZpbGVfbGV2ZWxfbWV0YWRhdGFfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvWzhdKTsKK30KKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRvdWJsZVZhbHVlKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRvdWJsZVZhbHVlID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RG91YmxlVmFsdWUgPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGbG9hdFZhbHVlKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkZsb2F0VmFsdWUgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpGbG9hdFZhbHVlID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6SW50NjRWYWx1ZSoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpJbnQ2NFZhbHVlID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6SW50NjRWYWx1ZSA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVJbnQ2NFZhbHVlKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVJbnQ2NFZhbHVlID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VUludDY0VmFsdWUgPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpJbnQzMlZhbHVlKgorQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkludDMyVmFsdWUgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpJbnQzMlZhbHVlID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VUludDMyVmFsdWUqCitBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VUludDMyVmFsdWUgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVSW50MzJWYWx1ZSA+KGFyZW5hKTsKK30KK3RlbXBsYXRlPD4gUFJPVE9CVUZfTk9JTkxJTkUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkJvb2xWYWx1ZSoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpCb29sVmFsdWUgPihBcmVuYSogYXJlbmEpIHsKKyAgcmV0dXJuIEFyZW5hOjpDcmVhdGVNZXNzYWdlSW50ZXJuYWw8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpCb29sVmFsdWUgPihhcmVuYSk7Cit9Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX05PSU5MSU5FIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdWYWx1ZSoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdWYWx1ZSA+KEFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gQXJlbmE6OkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1ZhbHVlID4oYXJlbmEpOworfQordGVtcGxhdGU8PiBQUk9UT0JVRl9OT0lOTElORSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Qnl0ZXNWYWx1ZSoKK0FyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpCeXRlc1ZhbHVlID4oQXJlbmEqIGFyZW5hKSB7CisgIHJldHVybiBBcmVuYTo6Q3JlYXRlTWVzc2FnZUludGVybmFsPCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Qnl0ZXNWYWx1ZSA+KGFyZW5hKTsKK30KK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KZGlmZiAtLWdpdCBhL3NyYy9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucGIuaCBiL3NyYy9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjRiZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wYi5oCkBAIC0wLDAgKzEsMTc0MSBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90bworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKyNpZiBQUk9UT0JVRl9WRVJTSU9OIDwgMzAyMTAwMAorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiBQbGVhc2UgdXBkYXRlCisjZXJyb3IgeW91ciBoZWFkZXJzLgorI2VuZGlmCisjaWYgMzAyMTAwOSA8IFBST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTgorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIG9sZGVyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCisjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gUGxlYXNlCisjZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21ldGFkYXRhX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorI2RlZmluZSBQUk9UT0JVRl9JTlRFUk5BTF9FWFBPUlRfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvIFBST1RPQlVGX0VYUE9SVAorUFJPVE9CVUZfTkFNRVNQQUNFX09QRU4KK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBBbnlNZXRhZGF0YTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorUFJPVE9CVUZfTkFNRVNQQUNFX0NMT1NFCisKKy8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCAtLSBkbyBub3QgdXNlIHRoZXNlIG1lbWJlcnMuCitzdHJ1Y3QgUFJPVE9CVUZfRVhQT1JUIFRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90byB7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBvZmZzZXRzW107Cit9OworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkRlc2NyaXB0b3JUYWJsZSBkZXNjcmlwdG9yX3RhYmxlX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90bzsKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCitjbGFzcyBCb29sVmFsdWU7CitzdHJ1Y3QgQm9vbFZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gQm9vbFZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCBfQm9vbFZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgQnl0ZXNWYWx1ZTsKK3N0cnVjdCBCeXRlc1ZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gQnl0ZXNWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwgX0J5dGVzVmFsdWVfZGVmYXVsdF9pbnN0YW5jZV87CitjbGFzcyBEb3VibGVWYWx1ZTsKK3N0cnVjdCBEb3VibGVWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIERvdWJsZVZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCBfRG91YmxlVmFsdWVfZGVmYXVsdF9pbnN0YW5jZV87CitjbGFzcyBGbG9hdFZhbHVlOworc3RydWN0IEZsb2F0VmFsdWVEZWZhdWx0VHlwZUludGVybmFsOworUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBGbG9hdFZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCBfRmxvYXRWYWx1ZV9kZWZhdWx0X2luc3RhbmNlXzsKK2NsYXNzIEludDMyVmFsdWU7CitzdHJ1Y3QgSW50MzJWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIEludDMyVmFsdWVEZWZhdWx0VHlwZUludGVybmFsIF9JbnQzMlZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfOworY2xhc3MgSW50NjRWYWx1ZTsKK3N0cnVjdCBJbnQ2NFZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbDsKK1BST1RPQlVGX0VYUE9SVCBleHRlcm4gSW50NjRWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWwgX0ludDY0VmFsdWVfZGVmYXVsdF9pbnN0YW5jZV87CitjbGFzcyBTdHJpbmdWYWx1ZTsKK3N0cnVjdCBTdHJpbmdWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIFN0cmluZ1ZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCBfU3RyaW5nVmFsdWVfZGVmYXVsdF9pbnN0YW5jZV87CitjbGFzcyBVSW50MzJWYWx1ZTsKK3N0cnVjdCBVSW50MzJWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIFVJbnQzMlZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCBfVUludDMyVmFsdWVfZGVmYXVsdF9pbnN0YW5jZV87CitjbGFzcyBVSW50NjRWYWx1ZTsKK3N0cnVjdCBVSW50NjRWYWx1ZURlZmF1bHRUeXBlSW50ZXJuYWw7CitQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIFVJbnQ2NFZhbHVlRGVmYXVsdFR5cGVJbnRlcm5hbCBfVUludDY0VmFsdWVfZGVmYXVsdF9pbnN0YW5jZV87CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCit0ZW1wbGF0ZTw+IFBST1RPQlVGX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Qm9vbFZhbHVlKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpCb29sVmFsdWU+KEFyZW5hKik7Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Qnl0ZXNWYWx1ZSogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6Qnl0ZXNWYWx1ZT4oQXJlbmEqKTsKK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEb3VibGVWYWx1ZSogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RG91YmxlVmFsdWU+KEFyZW5hKik7Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmxvYXRWYWx1ZSogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RmxvYXRWYWx1ZT4oQXJlbmEqKTsKK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpJbnQzMlZhbHVlKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpJbnQzMlZhbHVlPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkludDY0VmFsdWUqIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkludDY0VmFsdWU+KEFyZW5hKik7Cit0ZW1wbGF0ZTw+IFBST1RPQlVGX0VYUE9SVCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nVmFsdWUqIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1ZhbHVlPihBcmVuYSopOwordGVtcGxhdGU8PiBQUk9UT0JVRl9FWFBPUlQgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlVJbnQzMlZhbHVlKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVSW50MzJWYWx1ZT4oQXJlbmEqKTsKK3RlbXBsYXRlPD4gUFJPVE9CVUZfRVhQT1JUIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpVSW50NjRWYWx1ZSogQXJlbmE6OkNyZWF0ZU1heWJlTWVzc2FnZTw6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6VUludDY0VmFsdWU+KEFyZW5hKik7CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIERvdWJsZVZhbHVlIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgRG91YmxlVmFsdWUoKSA6IERvdWJsZVZhbHVlKG51bGxwdHIpIHt9CisgIH5Eb3VibGVWYWx1ZSgpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgRG91YmxlVmFsdWUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBEb3VibGVWYWx1ZShjb25zdCBEb3VibGVWYWx1ZSYgZnJvbSk7CisgIERvdWJsZVZhbHVlKERvdWJsZVZhbHVlJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IERvdWJsZVZhbHVlKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgRG91YmxlVmFsdWUmIG9wZXJhdG9yPShjb25zdCBEb3VibGVWYWx1ZSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgRG91YmxlVmFsdWUmIG9wZXJhdG9yPShEb3VibGVWYWx1ZSYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBEb3VibGVWYWx1ZSYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gKmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IERvdWJsZVZhbHVlKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IERvdWJsZVZhbHVlKj4oCisgICAgICAgICAgICAgICAmX0RvdWJsZVZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9CisgICAgMDsKKworICBmcmllbmQgdm9pZCBzd2FwKERvdWJsZVZhbHVlJiBhLCBEb3VibGVWYWx1ZSYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChEb3VibGVWYWx1ZSogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICBHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICAjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdlbmVyaWNTd2FwKHRoaXMsIG90aGVyKTsKKyAgICB9CisgIH0KKyAgdm9pZCBVbnNhZmVBcmVuYVN3YXAoRG91YmxlVmFsdWUqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIERvdWJsZVZhbHVlKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPERvdWJsZVZhbHVlPihhcmVuYSk7CisgIH0KKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlGcm9tOworICB2b2lkIENvcHlGcm9tKGNvbnN0IERvdWJsZVZhbHVlJiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IERvdWJsZVZhbHVlJiBmcm9tKSB7CisgICAgRG91YmxlVmFsdWU6Ok1lcmdlSW1wbCgqdGhpcywgZnJvbSk7CisgIH0KKyAgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgTWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZyk7CisgIHB1YmxpYzoKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IGZpbmFsOworICB2b2lkIEludGVybmFsU3dhcChEb3VibGVWYWx1ZSogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBEb3VibGVWYWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXzsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDsKKworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga1ZhbHVlRmllbGROdW1iZXIgPSAxLAorICB9OworICAvLyBkb3VibGUgdmFsdWUgPSAxOworICB2b2lkIGNsZWFyX3ZhbHVlKCk7CisgIGRvdWJsZSB2YWx1ZSgpIGNvbnN0OworICB2b2lkIHNldF92YWx1ZShkb3VibGUgdmFsdWUpOworICBwcml2YXRlOgorICBkb3VibGUgX2ludGVybmFsX3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF92YWx1ZShkb3VibGUgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZSkKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgZG91YmxlIHZhbHVlXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBGbG9hdFZhbHVlIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkZsb2F0VmFsdWUpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBGbG9hdFZhbHVlKCkgOiBGbG9hdFZhbHVlKG51bGxwdHIpIHt9CisgIH5GbG9hdFZhbHVlKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBGbG9hdFZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgRmxvYXRWYWx1ZShjb25zdCBGbG9hdFZhbHVlJiBmcm9tKTsKKyAgRmxvYXRWYWx1ZShGbG9hdFZhbHVlJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IEZsb2F0VmFsdWUoKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBGbG9hdFZhbHVlJiBvcGVyYXRvcj0oY29uc3QgRmxvYXRWYWx1ZSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgRmxvYXRWYWx1ZSYgb3BlcmF0b3I9KEZsb2F0VmFsdWUmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgRmxvYXRWYWx1ZSYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gKmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IEZsb2F0VmFsdWUqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRmxvYXRWYWx1ZSo+KAorICAgICAgICAgICAgICAgJl9GbG9hdFZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9CisgICAgMTsKKworICBmcmllbmQgdm9pZCBzd2FwKEZsb2F0VmFsdWUmIGEsIEZsb2F0VmFsdWUmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoRmxvYXRWYWx1ZSogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICBHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICAjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdlbmVyaWNTd2FwKHRoaXMsIG90aGVyKTsKKyAgICB9CisgIH0KKyAgdm9pZCBVbnNhZmVBcmVuYVN3YXAoRmxvYXRWYWx1ZSogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRmxvYXRWYWx1ZSogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxGbG9hdFZhbHVlPihhcmVuYSk7CisgIH0KKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlGcm9tOworICB2b2lkIENvcHlGcm9tKGNvbnN0IEZsb2F0VmFsdWUmIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgRmxvYXRWYWx1ZSYgZnJvbSkgeworICAgIEZsb2F0VmFsdWU6Ok1lcmdlSW1wbCgqdGhpcywgZnJvbSk7CisgIH0KKyAgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgTWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZyk7CisgIHB1YmxpYzoKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IGZpbmFsOworICB2b2lkIEludGVybmFsU3dhcChGbG9hdFZhbHVlKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLkZsb2F0VmFsdWUiOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgRmxvYXRWYWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXzsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDsKKworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga1ZhbHVlRmllbGROdW1iZXIgPSAxLAorICB9OworICAvLyBmbG9hdCB2YWx1ZSA9IDE7CisgIHZvaWQgY2xlYXJfdmFsdWUoKTsKKyAgZmxvYXQgdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfdmFsdWUoZmxvYXQgdmFsdWUpOworICBwcml2YXRlOgorICBmbG9hdCBfaW50ZXJuYWxfdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X3ZhbHVlKGZsb2F0IHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZSkKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgZmxvYXQgdmFsdWVfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIEludDY0VmFsdWUgZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZSkgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIEludDY0VmFsdWUoKSA6IEludDY0VmFsdWUobnVsbHB0cikge30KKyAgfkludDY0VmFsdWUoKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIEludDY0VmFsdWUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBJbnQ2NFZhbHVlKGNvbnN0IEludDY0VmFsdWUmIGZyb20pOworICBJbnQ2NFZhbHVlKEludDY0VmFsdWUmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogSW50NjRWYWx1ZSgpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIEludDY0VmFsdWUmIG9wZXJhdG9yPShjb25zdCBJbnQ2NFZhbHVlJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBJbnQ2NFZhbHVlJiBvcGVyYXRvcj0oSW50NjRWYWx1ZSYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBJbnQ2NFZhbHVlJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgSW50NjRWYWx1ZSogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBJbnQ2NFZhbHVlKj4oCisgICAgICAgICAgICAgICAmX0ludDY0VmFsdWVfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAyOworCisgIGZyaWVuZCB2b2lkIHN3YXAoSW50NjRWYWx1ZSYgYSwgSW50NjRWYWx1ZSYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChJbnQ2NFZhbHVlKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChJbnQ2NFZhbHVlKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBJbnQ2NFZhbHVlKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPEludDY0VmFsdWU+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgSW50NjRWYWx1ZSYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBJbnQ2NFZhbHVlJiBmcm9tKSB7CisgICAgSW50NjRWYWx1ZTo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKEludDY0VmFsdWUqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZSI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBJbnQ2NFZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrVmFsdWVGaWVsZE51bWJlciA9IDEsCisgIH07CisgIC8vIGludDY0IHZhbHVlID0gMTsKKyAgdm9pZCBjbGVhcl92YWx1ZSgpOworICBpbnQ2NF90IHZhbHVlKCkgY29uc3Q7CisgIHZvaWQgc2V0X3ZhbHVlKGludDY0X3QgdmFsdWUpOworICBwcml2YXRlOgorICBpbnQ2NF90IF9pbnRlcm5hbF92YWx1ZSgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfdmFsdWUoaW50NjRfdCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIGludDY0X3QgdmFsdWVfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfZ29vZ2xlXzJmcHJvdG9idWZfMmZ3cmFwcGVyc18yZXByb3RvOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUFJPVE9CVUZfRVhQT1JUIFVJbnQ2NFZhbHVlIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgVUludDY0VmFsdWUoKSA6IFVJbnQ2NFZhbHVlKG51bGxwdHIpIHt9CisgIH5VSW50NjRWYWx1ZSgpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgVUludDY0VmFsdWUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDb25zdGFudEluaXRpYWxpemVkKTsKKworICBVSW50NjRWYWx1ZShjb25zdCBVSW50NjRWYWx1ZSYgZnJvbSk7CisgIFVJbnQ2NFZhbHVlKFVJbnQ2NFZhbHVlJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IFVJbnQ2NFZhbHVlKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgVUludDY0VmFsdWUmIG9wZXJhdG9yPShjb25zdCBVSW50NjRWYWx1ZSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgVUludDY0VmFsdWUmIG9wZXJhdG9yPShVSW50NjRWYWx1ZSYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEdldERlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkRlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpSZWZsZWN0aW9uKiBHZXRSZWZsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5yZWZsZWN0aW9uOworICB9CisgIHN0YXRpYyBjb25zdCBVSW50NjRWYWx1ZSYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gKmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IFVJbnQ2NFZhbHVlKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFVJbnQ2NFZhbHVlKj4oCisgICAgICAgICAgICAgICAmX1VJbnQ2NFZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9CisgICAgMzsKKworICBmcmllbmQgdm9pZCBzd2FwKFVJbnQ2NFZhbHVlJiBhLCBVSW50NjRWYWx1ZSYgYikgeworICAgIGEuU3dhcCgmYik7CisgIH0KKyAgaW5saW5lIHZvaWQgU3dhcChVSW50NjRWYWx1ZSogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICBHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICAjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdlbmVyaWNTd2FwKHRoaXMsIG90aGVyKTsKKyAgICB9CisgIH0KKyAgdm9pZCBVbnNhZmVBcmVuYVN3YXAoVUludDY0VmFsdWUqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFVJbnQ2NFZhbHVlKiBOZXcoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSA9IG51bGxwdHIpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPFVJbnQ2NFZhbHVlPihhcmVuYSk7CisgIH0KKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlGcm9tOworICB2b2lkIENvcHlGcm9tKGNvbnN0IFVJbnQ2NFZhbHVlJiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IFVJbnQ2NFZhbHVlJiBmcm9tKSB7CisgICAgVUludDY0VmFsdWU6Ok1lcmdlSW1wbCgqdGhpcywgZnJvbSk7CisgIH0KKyAgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgTWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZyk7CisgIHB1YmxpYzoKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IGZpbmFsOworICB2b2lkIEludGVybmFsU3dhcChVSW50NjRWYWx1ZSogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZSI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBVSW50NjRWYWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXzsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDsKKworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga1ZhbHVlRmllbGROdW1iZXIgPSAxLAorICB9OworICAvLyB1aW50NjQgdmFsdWUgPSAxOworICB2b2lkIGNsZWFyX3ZhbHVlKCk7CisgIHVpbnQ2NF90IHZhbHVlKCkgY29uc3Q7CisgIHZvaWQgc2V0X3ZhbHVlKHVpbnQ2NF90IHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgdWludDY0X3QgX2ludGVybmFsX3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF92YWx1ZSh1aW50NjRfdCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICB1aW50NjRfdCB2YWx1ZV87CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgSW50MzJWYWx1ZSBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgSW50MzJWYWx1ZSgpIDogSW50MzJWYWx1ZShudWxscHRyKSB7fQorICB+SW50MzJWYWx1ZSgpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgSW50MzJWYWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIEludDMyVmFsdWUoY29uc3QgSW50MzJWYWx1ZSYgZnJvbSk7CisgIEludDMyVmFsdWUoSW50MzJWYWx1ZSYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBJbnQzMlZhbHVlKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgSW50MzJWYWx1ZSYgb3BlcmF0b3I9KGNvbnN0IEludDMyVmFsdWUmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIEludDMyVmFsdWUmIG9wZXJhdG9yPShJbnQzMlZhbHVlJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IEludDMyVmFsdWUmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBJbnQzMlZhbHVlKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEludDMyVmFsdWUqPigKKyAgICAgICAgICAgICAgICZfSW50MzJWYWx1ZV9kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDQ7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChJbnQzMlZhbHVlJiBhLCBJbnQzMlZhbHVlJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKEludDMyVmFsdWUqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKEludDMyVmFsdWUqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEludDMyVmFsdWUqIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8SW50MzJWYWx1ZT4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBJbnQzMlZhbHVlJiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IEludDMyVmFsdWUmIGZyb20pIHsKKyAgICBJbnQzMlZhbHVlOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoSW50MzJWYWx1ZSogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEludDMyVmFsdWUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtWYWx1ZUZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgLy8gaW50MzIgdmFsdWUgPSAxOworICB2b2lkIGNsZWFyX3ZhbHVlKCk7CisgIGludDMyX3QgdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfdmFsdWUoaW50MzJfdCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGludDMyX3QgX2ludGVybmFsX3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF92YWx1ZShpbnQzMl90IHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSkKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgaW50MzJfdCB2YWx1ZV87CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9nb29nbGVfMmZwcm90b2J1Zl8yZndyYXBwZXJzXzJlcHJvdG87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQUk9UT0JVRl9FWFBPUlQgVUludDMyVmFsdWUgZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBVSW50MzJWYWx1ZSgpIDogVUludDMyVmFsdWUobnVsbHB0cikge30KKyAgflVJbnQzMlZhbHVlKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBVSW50MzJWYWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIFVJbnQzMlZhbHVlKGNvbnN0IFVJbnQzMlZhbHVlJiBmcm9tKTsKKyAgVUludDMyVmFsdWUoVUludDMyVmFsdWUmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogVUludDMyVmFsdWUoKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBVSW50MzJWYWx1ZSYgb3BlcmF0b3I9KGNvbnN0IFVJbnQzMlZhbHVlJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBVSW50MzJWYWx1ZSYgb3BlcmF0b3I9KFVJbnQzMlZhbHVlJiYgZnJvbSkgbm9leGNlcHQgeworICAgIGlmICh0aGlzID09ICZmcm9tKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gZnJvbS5HZXRPd25pbmdBcmVuYSgpCisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICAgICAgJiYgR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyCisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICkgeworICAgICAgSW50ZXJuYWxTd2FwKCZmcm9tKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29weUZyb20oZnJvbSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gR2V0RGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6RGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkuZGVzY3JpcHRvcjsKKyAgfQorICBzdGF0aWMgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2UoKS5HZXRNZXRhZGF0YSgpLnJlZmxlY3Rpb247CisgIH0KKyAgc3RhdGljIGNvbnN0IFVJbnQzMlZhbHVlJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgVUludDMyVmFsdWUqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUludDMyVmFsdWUqPigKKyAgICAgICAgICAgICAgICZfVUludDMyVmFsdWVfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICA1OworCisgIGZyaWVuZCB2b2lkIHN3YXAoVUludDMyVmFsdWUmIGEsIFVJbnQzMlZhbHVlJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKFVJbnQzMlZhbHVlKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChVSW50MzJWYWx1ZSogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgVUludDMyVmFsdWUqIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hID0gbnVsbHB0cikgY29uc3QgZmluYWwgeworICAgIHJldHVybiBDcmVhdGVNYXliZU1lc3NhZ2U8VUludDMyVmFsdWU+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgVUludDMyVmFsdWUmIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgVUludDMyVmFsdWUmIGZyb20pIHsKKyAgICBVSW50MzJWYWx1ZTo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKFVJbnQzMlZhbHVlKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlIjsKKyAgfQorICBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IFVJbnQzMlZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrVmFsdWVGaWVsZE51bWJlciA9IDEsCisgIH07CisgIC8vIHVpbnQzMiB2YWx1ZSA9IDE7CisgIHZvaWQgY2xlYXJfdmFsdWUoKTsKKyAgdWludDMyX3QgdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfdmFsdWUodWludDMyX3QgdmFsdWUpOworICBwcml2YXRlOgorICB1aW50MzJfdCBfaW50ZXJuYWxfdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBfaW50ZXJuYWxfc2V0X3ZhbHVlKHVpbnQzMl90IHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUpCisgcHJpdmF0ZToKKyAgY2xhc3MgX0ludGVybmFsOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hOjpJbnRlcm5hbEhlbHBlcjsKKyAgdHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXzsKKyAgdHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfOworICBzdHJ1Y3QgSW1wbF8geworICAgIHVpbnQzMl90IHZhbHVlXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBCb29sVmFsdWUgZmluYWwgOgorICAgIHB1YmxpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjpnb29nbGUucHJvdG9idWYuQm9vbFZhbHVlKSAqLyB7CisgcHVibGljOgorICBpbmxpbmUgQm9vbFZhbHVlKCkgOiBCb29sVmFsdWUobnVsbHB0cikge30KKyAgfkJvb2xWYWx1ZSgpIG92ZXJyaWRlOworICBleHBsaWNpdCBQUk9UT0JVRl9DT05TVEVYUFIgQm9vbFZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgQm9vbFZhbHVlKGNvbnN0IEJvb2xWYWx1ZSYgZnJvbSk7CisgIEJvb2xWYWx1ZShCb29sVmFsdWUmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogQm9vbFZhbHVlKCkgeworICAgICp0aGlzID0gOjpzdGQ6Om1vdmUoZnJvbSk7CisgIH0KKworICBpbmxpbmUgQm9vbFZhbHVlJiBvcGVyYXRvcj0oY29uc3QgQm9vbFZhbHVlJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBCb29sVmFsdWUmIG9wZXJhdG9yPShCb29sVmFsdWUmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgQm9vbFZhbHVlJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgQm9vbFZhbHVlKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEJvb2xWYWx1ZSo+KAorICAgICAgICAgICAgICAgJl9Cb29sVmFsdWVfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICA2OworCisgIGZyaWVuZCB2b2lkIHN3YXAoQm9vbFZhbHVlJiBhLCBCb29sVmFsdWUmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoQm9vbFZhbHVlKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChCb29sVmFsdWUqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgICBHT09HTEVfRENIRUNLKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpOworICAgIEludGVybmFsU3dhcChvdGhlcik7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEJvb2xWYWx1ZSogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxCb29sVmFsdWU+KGFyZW5hKTsKKyAgfQorICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q29weUZyb207CisgIHZvaWQgQ29weUZyb20oY29uc3QgQm9vbFZhbHVlJiBmcm9tKTsKKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6Ok1lcmdlRnJvbTsKKyAgdm9pZCBNZXJnZUZyb20oIGNvbnN0IEJvb2xWYWx1ZSYgZnJvbSkgeworICAgIEJvb2xWYWx1ZTo6TWVyZ2VJbXBsKCp0aGlzLCBmcm9tKTsKKyAgfQorICBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBNZXJnZUltcGwoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIHRvX21zZywgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UmIGZyb21fbXNnKTsKKyAgcHVibGljOgorICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgdWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgdWludDhfdCogdGFyZ2V0LCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW86OkVwc0NvcHlPdXRwdXRTdHJlYW0qIHN0cmVhbSkgY29uc3QgZmluYWw7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgZmluYWwgeyByZXR1cm4gX2ltcGxfLl9jYWNoZWRfc2l6ZV8uR2V0KCk7IH0KKworICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwgYm9vbCBpc19tZXNzYWdlX293bmVkKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgZmluYWw7CisgIHZvaWQgSW50ZXJuYWxTd2FwKEJvb2xWYWx1ZSogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUiOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgQm9vbFZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbWVzc2FnZV9vd25lZCA9IGZhbHNlKTsKKyAgcHVibGljOgorCisgIHN0YXRpYyBjb25zdCBDbGFzc0RhdGEgX2NsYXNzX2RhdGFfOworICBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6Q2xhc3NEYXRhKkdldENsYXNzRGF0YSgpIGNvbnN0IGZpbmFsOworCisgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrVmFsdWVGaWVsZE51bWJlciA9IDEsCisgIH07CisgIC8vIGJvb2wgdmFsdWUgPSAxOworICB2b2lkIGNsZWFyX3ZhbHVlKCk7CisgIGJvb2wgdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfdmFsdWUoYm9vbCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGJvb2wgX2ludGVybmFsX3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF92YWx1ZShib29sIHZhbHVlKTsKKyAgcHVibGljOgorCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuQm9vbFZhbHVlKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICBib29sIHZhbHVlXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBTdHJpbmdWYWx1ZSBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZSkgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIFN0cmluZ1ZhbHVlKCkgOiBTdHJpbmdWYWx1ZShudWxscHRyKSB7fQorICB+U3RyaW5nVmFsdWUoKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIFN0cmluZ1ZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgU3RyaW5nVmFsdWUoY29uc3QgU3RyaW5nVmFsdWUmIGZyb20pOworICBTdHJpbmdWYWx1ZShTdHJpbmdWYWx1ZSYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBTdHJpbmdWYWx1ZSgpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIFN0cmluZ1ZhbHVlJiBvcGVyYXRvcj0oY29uc3QgU3RyaW5nVmFsdWUmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIFN0cmluZ1ZhbHVlJiBvcGVyYXRvcj0oU3RyaW5nVmFsdWUmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgU3RyaW5nVmFsdWUmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBTdHJpbmdWYWx1ZSogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTdHJpbmdWYWx1ZSo+KAorICAgICAgICAgICAgICAgJl9TdHJpbmdWYWx1ZV9kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDc7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChTdHJpbmdWYWx1ZSYgYSwgU3RyaW5nVmFsdWUmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoU3RyaW5nVmFsdWUqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKFN0cmluZ1ZhbHVlKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBTdHJpbmdWYWx1ZSogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxTdHJpbmdWYWx1ZT4oYXJlbmEpOworICB9CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDb3B5RnJvbTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBTdHJpbmdWYWx1ZSYgZnJvbSk7CisgIHVzaW5nIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpNZXJnZUZyb207CisgIHZvaWQgTWVyZ2VGcm9tKCBjb25zdCBTdHJpbmdWYWx1ZSYgZnJvbSkgeworICAgIFN0cmluZ1ZhbHVlOjpNZXJnZUltcGwoKnRoaXMsIGZyb20pOworICB9CisgIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIE1lcmdlSW1wbCg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgdG9fbXNnLCBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZSYgZnJvbV9tc2cpOworICBwdWJsaWM6CisgIFBST1RPQlVGX0FUVFJJQlVURV9SRUlOSVRJQUxJWkVTIHZvaWQgQ2xlYXIoKSBmaW5hbDsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgZmluYWw7CisKKyAgc2l6ZV90IEJ5dGVTaXplTG9uZygpIGNvbnN0IGZpbmFsOworICBjb25zdCBjaGFyKiBfSW50ZXJuYWxQYXJzZShjb25zdCBjaGFyKiBwdHIsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6UGFyc2VDb250ZXh0KiBjdHgpIGZpbmFsOworICB1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICB1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCBmaW5hbDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoU3RyaW5nVmFsdWUqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJnb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUiOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgU3RyaW5nVmFsdWUoOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RhdGljIGNvbnN0IENsYXNzRGF0YSBfY2xhc3NfZGF0YV87CisgIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlOjpDbGFzc0RhdGEqR2V0Q2xhc3NEYXRhKCkgY29uc3QgZmluYWw7CisKKyAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgZmluYWw7CisKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGVudW0gOiBpbnQgeworICAgIGtWYWx1ZUZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgLy8gc3RyaW5nIHZhbHVlID0gMTsKKyAgdm9pZCBjbGVhcl92YWx1ZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QwID0gY29uc3Qgc3RkOjpzdHJpbmcmLCB0eXBlbmFtZS4uLiBBcmdUPgorICB2b2lkIHNldF92YWx1ZShBcmdUMCYmIGFyZzAsIEFyZ1QuLi4gYXJncyk7CisgIHN0ZDo6c3RyaW5nKiBtdXRhYmxlX3ZhbHVlKCk7CisgIFBST1RPQlVGX05PRElTQ0FSRCBzdGQ6OnN0cmluZyogcmVsZWFzZV92YWx1ZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfdmFsdWUoc3RkOjpzdHJpbmcqIHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIF9pbnRlcm5hbF92YWx1ZSgpIGNvbnN0OworICBpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORSB2b2lkIF9pbnRlcm5hbF9zZXRfdmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcqIF9pbnRlcm5hbF9tdXRhYmxlX3ZhbHVlKCk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHZhbHVlXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90bzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBST1RPQlVGX0VYUE9SVCBCeXRlc1ZhbHVlIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2UgLyogQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX2RlZmluaXRpb246Z29vZ2xlLnByb3RvYnVmLkJ5dGVzVmFsdWUpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBCeXRlc1ZhbHVlKCkgOiBCeXRlc1ZhbHVlKG51bGxwdHIpIHt9CisgIH5CeXRlc1ZhbHVlKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBCeXRlc1ZhbHVlKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgQnl0ZXNWYWx1ZShjb25zdCBCeXRlc1ZhbHVlJiBmcm9tKTsKKyAgQnl0ZXNWYWx1ZShCeXRlc1ZhbHVlJiYgZnJvbSkgbm9leGNlcHQKKyAgICA6IEJ5dGVzVmFsdWUoKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBCeXRlc1ZhbHVlJiBvcGVyYXRvcj0oY29uc3QgQnl0ZXNWYWx1ZSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgQnl0ZXNWYWx1ZSYgb3BlcmF0b3I9KEJ5dGVzVmFsdWUmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBHZXREZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlKCkuR2V0TWV0YWRhdGEoKS5kZXNjcmlwdG9yOworICB9CisgIHN0YXRpYyBjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6UmVmbGVjdGlvbiogR2V0UmVmbGVjdGlvbigpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZSgpLkdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorICBzdGF0aWMgY29uc3QgQnl0ZXNWYWx1ZSYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gKmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IEJ5dGVzVmFsdWUqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQnl0ZXNWYWx1ZSo+KAorICAgICAgICAgICAgICAgJl9CeXRlc1ZhbHVlX2RlZmF1bHRfaW5zdGFuY2VfKTsKKyAgfQorICBzdGF0aWMgY29uc3RleHByIGludCBrSW5kZXhJbkZpbGVNZXNzYWdlcyA9CisgICAgODsKKworICBmcmllbmQgdm9pZCBzd2FwKEJ5dGVzVmFsdWUmIGEsIEJ5dGVzVmFsdWUmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoQnl0ZXNWYWx1ZSogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICBHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICAjZWxzZSAgLy8gUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgaWYgKEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9TV0FQCisgICAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkdlbmVyaWNTd2FwKHRoaXMsIG90aGVyKTsKKyAgICB9CisgIH0KKyAgdm9pZCBVbnNhZmVBcmVuYVN3YXAoQnl0ZXNWYWx1ZSogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgQnl0ZXNWYWx1ZSogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEgPSBudWxscHRyKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxCeXRlc1ZhbHVlPihhcmVuYSk7CisgIH0KKyAgdXNpbmcgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNvcHlGcm9tOworICB2b2lkIENvcHlGcm9tKGNvbnN0IEJ5dGVzVmFsdWUmIGZyb20pOworICB1c2luZyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZTo6TWVyZ2VGcm9tOworICB2b2lkIE1lcmdlRnJvbSggY29uc3QgQnl0ZXNWYWx1ZSYgZnJvbSkgeworICAgIEJ5dGVzVmFsdWU6Ok1lcmdlSW1wbCgqdGhpcywgZnJvbSk7CisgIH0KKyAgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgTWVyZ2VJbXBsKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiB0b19tc2csIGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlJiBmcm9tX21zZyk7CisgIHB1YmxpYzoKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIHVpbnQ4X3QqIF9JbnRlcm5hbFNlcmlhbGl6ZSgKKyAgICAgIHVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IGZpbmFsOworICB2b2lkIEludGVybmFsU3dhcChCeXRlc1ZhbHVlKiBvdGhlcik7CisKKyAgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6QW55TWV0YWRhdGE7CisgIHN0YXRpYyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6U3RyaW5nUGllY2UgRnVsbE1lc3NhZ2VOYW1lKCkgeworICAgIHJldHVybiAiZ29vZ2xlLnByb3RvYnVmLkJ5dGVzVmFsdWUiOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgQnl0ZXNWYWx1ZSg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGF0aWMgY29uc3QgQ2xhc3NEYXRhIF9jbGFzc19kYXRhXzsKKyAgY29uc3QgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2U6OkNsYXNzRGF0YSpHZXRDbGFzc0RhdGEoKSBjb25zdCBmaW5hbDsKKworICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga1ZhbHVlRmllbGROdW1iZXIgPSAxLAorICB9OworICAvLyBieXRlcyB2YWx1ZSA9IDE7CisgIHZvaWQgY2xlYXJfdmFsdWUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUMCA9IGNvbnN0IHN0ZDo6c3RyaW5nJiwgdHlwZW5hbWUuLi4gQXJnVD4KKyAgdm9pZCBzZXRfdmFsdWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpOworICBzdGQ6OnN0cmluZyogbXV0YWJsZV92YWx1ZSgpOworICBQUk9UT0JVRl9OT0RJU0NBUkQgc3RkOjpzdHJpbmcqIHJlbGVhc2VfdmFsdWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX3ZhbHVlKHN0ZDo6c3RyaW5nKiB2YWx1ZSk7CisgIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfaW50ZXJuYWxfdmFsdWUoKSBjb25zdDsKKyAgaW5saW5lIFBST1RPQlVGX0FMV0FZU19JTkxJTkUgdm9pZCBfaW50ZXJuYWxfc2V0X3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nKiBfaW50ZXJuYWxfbXV0YWJsZV92YWx1ZSgpOworICBwdWJsaWM6CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHZhbHVlXzsKKyAgICBtdXRhYmxlIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q2FjaGVkU2l6ZSBfY2FjaGVkX3NpemVfOworICB9OworICB1bmlvbiB7IEltcGxfIF9pbXBsXzsgfTsKKyAgZnJpZW5kIHN0cnVjdCA6OlRhYmxlU3RydWN0X2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90bzsKK307CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzdHJpY3QtYWxpYXNpbmciCisjZW5kaWYgIC8vIF9fR05VQ19fCisvLyBEb3VibGVWYWx1ZQorCisvLyBkb3VibGUgdmFsdWUgPSAxOworaW5saW5lIHZvaWQgRG91YmxlVmFsdWU6OmNsZWFyX3ZhbHVlKCkgeworICBfaW1wbF8udmFsdWVfID0gMDsKK30KK2lubGluZSBkb3VibGUgRG91YmxlVmFsdWU6Ol9pbnRlcm5hbF92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy52YWx1ZV87Cit9CitpbmxpbmUgZG91YmxlIERvdWJsZVZhbHVlOjp2YWx1ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUudmFsdWUpCisgIHJldHVybiBfaW50ZXJuYWxfdmFsdWUoKTsKK30KK2lubGluZSB2b2lkIERvdWJsZVZhbHVlOjpfaW50ZXJuYWxfc2V0X3ZhbHVlKGRvdWJsZSB2YWx1ZSkgeworICAKKyAgX2ltcGxfLnZhbHVlXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgRG91YmxlVmFsdWU6OnNldF92YWx1ZShkb3VibGUgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF92YWx1ZSh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlLnZhbHVlKQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEZsb2F0VmFsdWUKKworLy8gZmxvYXQgdmFsdWUgPSAxOworaW5saW5lIHZvaWQgRmxvYXRWYWx1ZTo6Y2xlYXJfdmFsdWUoKSB7CisgIF9pbXBsXy52YWx1ZV8gPSAwOworfQoraW5saW5lIGZsb2F0IEZsb2F0VmFsdWU6Ol9pbnRlcm5hbF92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy52YWx1ZV87Cit9CitpbmxpbmUgZmxvYXQgRmxvYXRWYWx1ZTo6dmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZsb2F0VmFsdWUudmFsdWUpCisgIHJldHVybiBfaW50ZXJuYWxfdmFsdWUoKTsKK30KK2lubGluZSB2b2lkIEZsb2F0VmFsdWU6Ol9pbnRlcm5hbF9zZXRfdmFsdWUoZmxvYXQgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy52YWx1ZV8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEZsb2F0VmFsdWU6OnNldF92YWx1ZShmbG9hdCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X3ZhbHVlKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZS52YWx1ZSkKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBJbnQ2NFZhbHVlCisKKy8vIGludDY0IHZhbHVlID0gMTsKK2lubGluZSB2b2lkIEludDY0VmFsdWU6OmNsZWFyX3ZhbHVlKCkgeworICBfaW1wbF8udmFsdWVfID0gaW50NjRfdHswfTsKK30KK2lubGluZSBpbnQ2NF90IEludDY0VmFsdWU6Ol9pbnRlcm5hbF92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy52YWx1ZV87Cit9CitpbmxpbmUgaW50NjRfdCBJbnQ2NFZhbHVlOjp2YWx1ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZS52YWx1ZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF92YWx1ZSgpOworfQoraW5saW5lIHZvaWQgSW50NjRWYWx1ZTo6X2ludGVybmFsX3NldF92YWx1ZShpbnQ2NF90IHZhbHVlKSB7CisgIAorICBfaW1wbF8udmFsdWVfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBJbnQ2NFZhbHVlOjpzZXRfdmFsdWUoaW50NjRfdCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X3ZhbHVlKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZS52YWx1ZSkKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBVSW50NjRWYWx1ZQorCisvLyB1aW50NjQgdmFsdWUgPSAxOworaW5saW5lIHZvaWQgVUludDY0VmFsdWU6OmNsZWFyX3ZhbHVlKCkgeworICBfaW1wbF8udmFsdWVfID0gdWludDY0X3R7MHV9OworfQoraW5saW5lIHVpbnQ2NF90IFVJbnQ2NFZhbHVlOjpfaW50ZXJuYWxfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8udmFsdWVfOworfQoraW5saW5lIHVpbnQ2NF90IFVJbnQ2NFZhbHVlOjp2YWx1ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUudmFsdWUpCisgIHJldHVybiBfaW50ZXJuYWxfdmFsdWUoKTsKK30KK2lubGluZSB2b2lkIFVJbnQ2NFZhbHVlOjpfaW50ZXJuYWxfc2V0X3ZhbHVlKHVpbnQ2NF90IHZhbHVlKSB7CisgIAorICBfaW1wbF8udmFsdWVfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBVSW50NjRWYWx1ZTo6c2V0X3ZhbHVlKHVpbnQ2NF90IHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfdmFsdWUodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZS52YWx1ZSkKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBJbnQzMlZhbHVlCisKKy8vIGludDMyIHZhbHVlID0gMTsKK2lubGluZSB2b2lkIEludDMyVmFsdWU6OmNsZWFyX3ZhbHVlKCkgeworICBfaW1wbF8udmFsdWVfID0gMDsKK30KK2lubGluZSBpbnQzMl90IEludDMyVmFsdWU6Ol9pbnRlcm5hbF92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy52YWx1ZV87Cit9CitpbmxpbmUgaW50MzJfdCBJbnQzMlZhbHVlOjp2YWx1ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZS52YWx1ZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF92YWx1ZSgpOworfQoraW5saW5lIHZvaWQgSW50MzJWYWx1ZTo6X2ludGVybmFsX3NldF92YWx1ZShpbnQzMl90IHZhbHVlKSB7CisgIAorICBfaW1wbF8udmFsdWVfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBJbnQzMlZhbHVlOjpzZXRfdmFsdWUoaW50MzJfdCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X3ZhbHVlKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZS52YWx1ZSkKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBVSW50MzJWYWx1ZQorCisvLyB1aW50MzIgdmFsdWUgPSAxOworaW5saW5lIHZvaWQgVUludDMyVmFsdWU6OmNsZWFyX3ZhbHVlKCkgeworICBfaW1wbF8udmFsdWVfID0gMHU7Cit9CitpbmxpbmUgdWludDMyX3QgVUludDMyVmFsdWU6Ol9pbnRlcm5hbF92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy52YWx1ZV87Cit9CitpbmxpbmUgdWludDMyX3QgVUludDMyVmFsdWU6OnZhbHVlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZS52YWx1ZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF92YWx1ZSgpOworfQoraW5saW5lIHZvaWQgVUludDMyVmFsdWU6Ol9pbnRlcm5hbF9zZXRfdmFsdWUodWludDMyX3QgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy52YWx1ZV8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIFVJbnQzMlZhbHVlOjpzZXRfdmFsdWUodWludDMyX3QgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF92YWx1ZSh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlLnZhbHVlKQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEJvb2xWYWx1ZQorCisvLyBib29sIHZhbHVlID0gMTsKK2lubGluZSB2b2lkIEJvb2xWYWx1ZTo6Y2xlYXJfdmFsdWUoKSB7CisgIF9pbXBsXy52YWx1ZV8gPSBmYWxzZTsKK30KK2lubGluZSBib29sIEJvb2xWYWx1ZTo6X2ludGVybmFsX3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnZhbHVlXzsKK30KK2lubGluZSBib29sIEJvb2xWYWx1ZTo6dmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZS52YWx1ZSkKKyAgcmV0dXJuIF9pbnRlcm5hbF92YWx1ZSgpOworfQoraW5saW5lIHZvaWQgQm9vbFZhbHVlOjpfaW50ZXJuYWxfc2V0X3ZhbHVlKGJvb2wgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy52YWx1ZV8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIEJvb2xWYWx1ZTo6c2V0X3ZhbHVlKGJvb2wgdmFsdWUpIHsKKyAgX2ludGVybmFsX3NldF92YWx1ZSh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZS52YWx1ZSkKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBTdHJpbmdWYWx1ZQorCisvLyBzdHJpbmcgdmFsdWUgPSAxOworaW5saW5lIHZvaWQgU3RyaW5nVmFsdWU6OmNsZWFyX3ZhbHVlKCkgeworICBfaW1wbF8udmFsdWVfLkNsZWFyVG9FbXB0eSgpOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBTdHJpbmdWYWx1ZTo6dmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlLnZhbHVlKQorICByZXR1cm4gX2ludGVybmFsX3ZhbHVlKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBTdHJpbmdWYWx1ZTo6c2V0X3ZhbHVlKEFyZ1QwJiYgYXJnMCwgQXJnVC4uLiBhcmdzKSB7CisgCisgX2ltcGxfLnZhbHVlXy5TZXQoc3RhdGljX2Nhc3Q8QXJnVDAgJiY+KGFyZzApLCBhcmdzLi4uLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlLnZhbHVlKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBTdHJpbmdWYWx1ZTo6bXV0YWJsZV92YWx1ZSgpIHsKKyAgc3RkOjpzdHJpbmcqIF9zID0gX2ludGVybmFsX211dGFibGVfdmFsdWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlLnZhbHVlKQorICByZXR1cm4gX3M7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIFN0cmluZ1ZhbHVlOjpfaW50ZXJuYWxfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8udmFsdWVfLkdldCgpOworfQoraW5saW5lIHZvaWQgU3RyaW5nVmFsdWU6Ol9pbnRlcm5hbF9zZXRfdmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIAorICBfaW1wbF8udmFsdWVfLlNldCh2YWx1ZSwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBTdHJpbmdWYWx1ZTo6X2ludGVybmFsX211dGFibGVfdmFsdWUoKSB7CisgIAorICByZXR1cm4gX2ltcGxfLnZhbHVlXy5NdXRhYmxlKEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKK30KK2lubGluZSBzdGQ6OnN0cmluZyogU3RyaW5nVmFsdWU6OnJlbGVhc2VfdmFsdWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZS52YWx1ZSkKKyAgcmV0dXJuIF9pbXBsXy52YWx1ZV8uUmVsZWFzZSgpOworfQoraW5saW5lIHZvaWQgU3RyaW5nVmFsdWU6OnNldF9hbGxvY2F0ZWRfdmFsdWUoc3RkOjpzdHJpbmcqIHZhbHVlKSB7CisgIGlmICh2YWx1ZSAhPSBudWxscHRyKSB7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgIH0KKyAgX2ltcGxfLnZhbHVlXy5TZXRBbGxvY2F0ZWQodmFsdWUsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIGlmIChfaW1wbF8udmFsdWVfLklzRGVmYXVsdCgpKSB7CisgICAgX2ltcGxfLnZhbHVlXy5TZXQoIiIsIEdldEFyZW5hRm9yQWxsb2NhdGlvbigpKTsKKyAgfQorI2VuZGlmIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfREVGQVVMVF9TVFJJTkcKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlLnZhbHVlKQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEJ5dGVzVmFsdWUKKworLy8gYnl0ZXMgdmFsdWUgPSAxOworaW5saW5lIHZvaWQgQnl0ZXNWYWx1ZTo6Y2xlYXJfdmFsdWUoKSB7CisgIF9pbXBsXy52YWx1ZV8uQ2xlYXJUb0VtcHR5KCk7Cit9CitpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcmIEJ5dGVzVmFsdWU6OnZhbHVlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlLnZhbHVlKQorICByZXR1cm4gX2ludGVybmFsX3ZhbHVlKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVDAsIHR5cGVuYW1lLi4uIEFyZ1Q+CitpbmxpbmUgUFJPVE9CVUZfQUxXQVlTX0lOTElORQordm9pZCBCeXRlc1ZhbHVlOjpzZXRfdmFsdWUoQXJnVDAmJiBhcmcwLCBBcmdULi4uIGFyZ3MpIHsKKyAKKyBfaW1wbF8udmFsdWVfLlNldEJ5dGVzKHN0YXRpY19jYXN0PEFyZ1QwICYmPihhcmcwKSwgYXJncy4uLiwgR2V0QXJlbmFGb3JBbGxvY2F0aW9uKCkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlLnZhbHVlKQorfQoraW5saW5lIHN0ZDo6c3RyaW5nKiBCeXRlc1ZhbHVlOjptdXRhYmxlX3ZhbHVlKCkgeworICBzdGQ6OnN0cmluZyogX3MgPSBfaW50ZXJuYWxfbXV0YWJsZV92YWx1ZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZS52YWx1ZSkKKyAgcmV0dXJuIF9zOworfQoraW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nJiBCeXRlc1ZhbHVlOjpfaW50ZXJuYWxfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBfaW1wbF8udmFsdWVfLkdldCgpOworfQoraW5saW5lIHZvaWQgQnl0ZXNWYWx1ZTo6X2ludGVybmFsX3NldF92YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy52YWx1ZV8uU2V0KHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEJ5dGVzVmFsdWU6Ol9pbnRlcm5hbF9tdXRhYmxlX3ZhbHVlKCkgeworICAKKyAgcmV0dXJuIF9pbXBsXy52YWx1ZV8uTXV0YWJsZShHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7Cit9CitpbmxpbmUgc3RkOjpzdHJpbmcqIEJ5dGVzVmFsdWU6OnJlbGVhc2VfdmFsdWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlLnZhbHVlKQorICByZXR1cm4gX2ltcGxfLnZhbHVlXy5SZWxlYXNlKCk7Cit9CitpbmxpbmUgdm9pZCBCeXRlc1ZhbHVlOjpzZXRfYWxsb2NhdGVkX3ZhbHVlKHN0ZDo6c3RyaW5nKiB2YWx1ZSkgeworICBpZiAodmFsdWUgIT0gbnVsbHB0cikgeworICAgIAorICB9IGVsc2UgeworICAgIAorICB9CisgIF9pbXBsXy52YWx1ZV8uU2V0QWxsb2NhdGVkKHZhbHVlLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9ERUZBVUxUX1NUUklORworICBpZiAoX2ltcGxfLnZhbHVlXy5Jc0RlZmF1bHQoKSkgeworICAgIF9pbXBsXy52YWx1ZV8uU2V0KCIiLCBHZXRBcmVuYUZvckFsbG9jYXRpb24oKSk7CisgIH0KKyNlbmRpZiAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0RFRkFVTFRfU1RSSU5HCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlLnZhbHVlKQorfQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZiAgLy8gX19HTlVDX18KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCisKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU5DTFVERURfR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2dvb2dsZV8yZnByb3RvYnVmXzJmd3JhcHBlcnNfMmVwcm90bwpkaWZmIC0tZ2l0IGEvc3JjL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90byBiL3NyYy9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ5ZGQ1MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8KQEAgLTAsMCArMSwxMjMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBXcmFwcGVycyBmb3IgcHJpbWl0aXZlIChub24tbWVzc2FnZSkgdHlwZXMuIFRoZXNlIHR5cGVzIGFyZSB1c2VmdWwKKy8vIGZvciBlbWJlZGRpbmcgcHJpbWl0aXZlcyBpbiB0aGUgYGdvb2dsZS5wcm90b2J1Zi5BbnlgIHR5cGUgYW5kIGZvciBwbGFjZXMKKy8vIHdoZXJlIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgYWJzZW5jZSBvZiBhIHByaW1pdGl2ZQorLy8gdHlwZWQgZmllbGQgYW5kIGl0cyBkZWZhdWx0IHZhbHVlLgorLy8KKy8vIFRoZXNlIHdyYXBwZXJzIGhhdmUgbm8gbWVhbmluZ2Z1bCB1c2Ugd2l0aGluIHJlcGVhdGVkIGZpZWxkcyBhcyB0aGV5IGxhY2sKKy8vIHRoZSBhYmlsaXR5IHRvIGRldGVjdCBwcmVzZW5jZSBvbiBpbmRpdmlkdWFsIGVsZW1lbnRzLgorLy8gVGhlc2Ugd3JhcHBlcnMgaGF2ZSBubyBtZWFuaW5nZnVsIHVzZSB3aXRoaW4gYSBtYXAgb3IgYSBvbmVvZiBzaW5jZQorLy8gaW5kaXZpZHVhbCBlbnRyaWVzIG9mIGEgbWFwIG9yIGZpZWxkcyBvZiBhIG9uZW9mIGNhbiBhbHJlYWR5IGRldGVjdCBwcmVzZW5jZS4KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOworCitvcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMiOworb3B0aW9uIGNjX2VuYWJsZV9hcmVuYXMgPSB0cnVlOworb3B0aW9uIGdvX3BhY2thZ2UgPSAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vd3JhcHBlcnNwYiI7CitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIldyYXBwZXJzUHJvdG8iOworb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOworb3B0aW9uIG9iamNfY2xhc3NfcHJlZml4ID0gIkdQQiI7CisKKy8vIFdyYXBwZXIgbWVzc2FnZSBmb3IgYGRvdWJsZWAuCisvLworLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBEb3VibGVWYWx1ZWAgaXMgSlNPTiBudW1iZXIuCittZXNzYWdlIERvdWJsZVZhbHVlIHsKKyAgLy8gVGhlIGRvdWJsZSB2YWx1ZS4KKyAgZG91YmxlIHZhbHVlID0gMTsKK30KKworLy8gV3JhcHBlciBtZXNzYWdlIGZvciBgZmxvYXRgLgorLy8KKy8vIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgRmxvYXRWYWx1ZWAgaXMgSlNPTiBudW1iZXIuCittZXNzYWdlIEZsb2F0VmFsdWUgeworICAvLyBUaGUgZmxvYXQgdmFsdWUuCisgIGZsb2F0IHZhbHVlID0gMTsKK30KKworLy8gV3JhcHBlciBtZXNzYWdlIGZvciBgaW50NjRgLgorLy8KKy8vIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgSW50NjRWYWx1ZWAgaXMgSlNPTiBzdHJpbmcuCittZXNzYWdlIEludDY0VmFsdWUgeworICAvLyBUaGUgaW50NjQgdmFsdWUuCisgIGludDY0IHZhbHVlID0gMTsKK30KKworLy8gV3JhcHBlciBtZXNzYWdlIGZvciBgdWludDY0YC4KKy8vCisvLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYFVJbnQ2NFZhbHVlYCBpcyBKU09OIHN0cmluZy4KK21lc3NhZ2UgVUludDY0VmFsdWUgeworICAvLyBUaGUgdWludDY0IHZhbHVlLgorICB1aW50NjQgdmFsdWUgPSAxOworfQorCisvLyBXcmFwcGVyIG1lc3NhZ2UgZm9yIGBpbnQzMmAuCisvLworLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBJbnQzMlZhbHVlYCBpcyBKU09OIG51bWJlci4KK21lc3NhZ2UgSW50MzJWYWx1ZSB7CisgIC8vIFRoZSBpbnQzMiB2YWx1ZS4KKyAgaW50MzIgdmFsdWUgPSAxOworfQorCisvLyBXcmFwcGVyIG1lc3NhZ2UgZm9yIGB1aW50MzJgLgorLy8KKy8vIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgVUludDMyVmFsdWVgIGlzIEpTT04gbnVtYmVyLgorbWVzc2FnZSBVSW50MzJWYWx1ZSB7CisgIC8vIFRoZSB1aW50MzIgdmFsdWUuCisgIHVpbnQzMiB2YWx1ZSA9IDE7Cit9CisKKy8vIFdyYXBwZXIgbWVzc2FnZSBmb3IgYGJvb2xgLgorLy8KKy8vIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgQm9vbFZhbHVlYCBpcyBKU09OIGB0cnVlYCBhbmQgYGZhbHNlYC4KK21lc3NhZ2UgQm9vbFZhbHVlIHsKKyAgLy8gVGhlIGJvb2wgdmFsdWUuCisgIGJvb2wgdmFsdWUgPSAxOworfQorCisvLyBXcmFwcGVyIG1lc3NhZ2UgZm9yIGBzdHJpbmdgLgorLy8KKy8vIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgU3RyaW5nVmFsdWVgIGlzIEpTT04gc3RyaW5nLgorbWVzc2FnZSBTdHJpbmdWYWx1ZSB7CisgIC8vIFRoZSBzdHJpbmcgdmFsdWUuCisgIHN0cmluZyB2YWx1ZSA9IDE7Cit9CisKKy8vIFdyYXBwZXIgbWVzc2FnZSBmb3IgYGJ5dGVzYC4KKy8vCisvLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYEJ5dGVzVmFsdWVgIGlzIEpTT04gc3RyaW5nLgorbWVzc2FnZSBCeXRlc1ZhbHVlIHsKKyAgLy8gVGhlIGJ5dGVzIHZhbHVlLgorICBieXRlcyB2YWx1ZSA9IDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvbGlicHJvdG9idWYtbGl0ZS5tYXAgYi9zcmMvbGlicHJvdG9idWYtbGl0ZS5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxNTU0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9saWJwcm90b2J1Zi1saXRlLm1hcApAQCAtMCwwICsxLDkgQEAKK3sKKyAgZ2xvYmFsOgorICAgIGV4dGVybiAiQysrIiB7CisgICAgICAqZ29vZ2xlKjsKKyAgICB9OworCisgIGxvY2FsOgorICAgICo7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2xpYnByb3RvYnVmLm1hcCBiL3NyYy9saWJwcm90b2J1Zi5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxNTU0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9saWJwcm90b2J1Zi5tYXAKQEAgLTAsMCArMSw5IEBACit7CisgIGdsb2JhbDoKKyAgICBleHRlcm4gIkMrKyIgeworICAgICAgKmdvb2dsZSo7CisgICAgfTsKKworICBsb2NhbDoKKyAgICAqOworfTsKZGlmZiAtLWdpdCBhL3NyYy9saWJwcm90b2MubWFwIGIvc3JjL2xpYnByb3RvYy5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxNTU0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9saWJwcm90b2MubWFwCkBAIC0wLDAgKzEsOSBAQAoreworICBnbG9iYWw6CisgICAgZXh0ZXJuICJDKysiIHsKKyAgICAgICpnb29nbGUqOworICAgIH07CisKKyAgbG9jYWw6CisgICAgKjsKK307CmRpZmYgLS1naXQgYS9zcmMvc29sYXJpcy9saWJzdGRjKysubGEgYi9zcmMvc29sYXJpcy9saWJzdGRjKysubGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkZjQyNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zb2xhcmlzL2xpYnN0ZGMrKy5sYQpAQCAtMCwwICsxLDUxIEBACisjIGxpYnN0ZGMrKy5sYSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5IGx0bWFpbi5zaCAtIEdOVSBsaWJ0b29sIDEuNGEtR0NDMy4wICgxLjY0MS4yLjI1NiAyMDAxLzA1LzI4IDIwOjA5OjA3IHdpdGggR0NDLWxvY2FsIGNoYW5nZXMpCisjCisjIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKKyMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgorCisjIC0tLQorIyBOT1RFOiBUaGlzIGZpbGUgbGl2ZXMgaW4gL3Vzci9zZncvbGliIG9uIFNvbGFyaXMgMTAuICBVbmZvcnR1bmF0ZWx5LAorIyBkdWUgdG8gYW4gYXBwYXJlbnQgYnVnIGluIHRoZSBTb2xhcmlzIDEwIDYvMDYgcmVsZWFzZSwKKyMgL3Vzci9zZncvbGliL2xpYnN0ZGMrKy5sYSBpcyBlbXB0eS4gIEJlbG93IGlzIHRoZSBjb3JyZWN0IGNvbnRlbnQsCisjIGFjY29yZGluZyB0bworIyAgICBodHRwOi8vZm9ydW0uamF2YS5zdW4uY29tL3RocmVhZC5qc3BhP3RocmVhZElEPTUwNzMxNTAKKyMgQnkgcGFzc2luZyBMREZMQUdTPSctTHNyYy9zb2xhcmlzJyB0byBjb25maWd1cmUsIG1ha2Ugd2lsbCBwaWNrIHVwCisjIHRoaXMgY29weSBvZiB0aGUgZmlsZSByYXRoZXIgdGhhbiB0aGUgZW1wdHkgY29weSBpbiAvdXNyL3Nmdy9saWIuCisjCisjIEFsc28gc2VlCisjICAgaHR0cDovL3d3dy50ZWNobmljYWxhcnRpY2xlcy5vcmcvaW5kZXgucGhwL0NvbXBpbGluZ19NeVNRTF81LjBfb25fU29sYXJpc18xMAorIworIyBOb3RlOiB0aGlzIGlzIGZvciAzMi1iaXQgc3lzdGVtcy4gIElmIHlvdSBoYXZlIGEgNjQtYml0IHN5c3RlbSwKKyMgdW5jb21tZW50IHRoZSBhcHByb3ByaWF0ZSBkZXBlbmRlbmN5X2xpYnMgbGluZSBiZWxvdy4KKyMgLS0tLQorCisjIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KK2RsbmFtZT0nbGlic3RkYysrLnNvLjYnCisKKyMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgorbGlicmFyeV9uYW1lcz0nbGlic3RkYysrLnNvLjYuMC4zIGxpYnN0ZGMrKy5zby42IGxpYnN0ZGMrKy5zbycKKworIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCitvbGRfbGlicmFyeT0nbGlic3RkYysrLmEnCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorIyAzMi1iaXQgdmVyc2lvbjoKK2RlcGVuZGVuY3lfbGlicz0nLWxjIC1sbSAtTC91c3Ivc2Z3L2xpYiAtbGdjY19zJworIyA2NC1iaXQgdmVyc2lvbjoKKyNkZXBlbmRlbmN5X2xpYnM9Jy1ML2xpYi82NCAtbGMgLWxtIC1ML3Vzci9zZncvbGliLzY0IC1sZ2NjX3MnCisKKyMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgbGlic3RkYysrLgorY3VycmVudD02CithZ2U9MAorcmV2aXNpb249MworCisjIElzIHRoaXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgbGlicmFyeT8KK2luc3RhbGxlZD15ZXMKKworIyBGaWxlcyB0byBkbG9wZW4vZGxwcmVvcGVuCitkbG9wZW49JycKK2RscHJlb3Blbj0nJworCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9Jy91c3Ivc2Z3L2xpYicK